[med-svn] [sra-sdk] 01/06: New upstream version 2.8.1+dfsg
Andreas Tille
tille at debian.org
Wed Jan 11 10:11:27 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository sra-sdk.
commit 5eec480f0ff88e122c6caf58165d6cda2199452c
Author: Andreas Tille <tille at debian.org>
Date: Wed Jan 11 07:20:44 2017 +0100
New upstream version 2.8.1+dfsg
---
.github/ISSUE_TEMPLATE.md | 21 -
.github/PULL_REQUEST_TEMPLATE.md | 13 -
.gitignore | 42 +-
.travis.yml | 20 -
CHANGES.md | 158 +
LICENSE | 66 +
Makefile | 187 +
README-blastn | 133 +
README-vdb-config | 115 +
README.md | 116 +-
build.gradle | 227 -
build.xml | 62 -
build/.gitignore | 6 +
build/Makefile.cc | 67 +
build/Makefile.clang | 83 +
build/Makefile.deb | 118 +
build/Makefile.env | 414 +
build/Makefile.gcc | 92 +
build/Makefile.icc | 77 +
build/Makefile.install | 143 +
build/Makefile.linux | 87 +
build/Makefile.rpm | 174 +
build/Makefile.rules | 110 +
build/Makefile.scm | 94 +
build/Makefile.shell | 189 +
build/Makefile.targets | 117 +
build/Makefile.tools | 40 +
build/Makefile.vers | 26 +
.../asm-trace/asm-trace.xcodeproj/project.pbxproj | 4444 +++
build/Xcode/old-toolkit/.gitignore | 1 +
.../old-toolkit.xcodeproj/project.pbxproj | 2153 ++
build/abspath.sh | 31 +
build/cc.sh | 129 +
build/check-exit-code.py | 131 +
build/cp.sh | 32 +
build/gprof2dot.py | 2763 ++
build/increment-release.sh | 44 +
build/ld.linux.cmn.sh | 158 +
build/ld.linux.dlib.sh | 311 +
build/ld.linux.exe.sh | 341 +
build/ld.linux.gcc.sh | 53 +
build/ld.linux.icc.sh | 47 +
build/ld.linux.ln.sh | 98 +
build/ld.linux.slib.sh | 146 +
build/ld.rwin.dlib.sh | 363 +
build/ld.rwin.exe.sh | 366 +
build/ld.rwin.slib.sh | 123 +
build/ld.rwin.stub.sh | 59 +
build/ld.rwin.vc++.sh | 65 +
build/ld.sh | 596 +
build/ld.sun.cc.sh | 56 +
build/ld.sun.cmn.sh | 160 +
build/ld.sun.dlib.sh | 282 +
build/ld.sun.exe.sh | 299 +
build/ld.sun.ln.sh | 87 +
build/ld.sun.slib.sh | 135 +
build/ld.unix.cmn.sh | 149 +
build/ld.unix.slib.sh | 124 +
build/libexists.sh | 180 +
build/mac.arch.sh | 87 +
build/make-defs-xf.pl | 108 +
build/make-defs.pl | 247 +
build/make-vers-inc.sh | 46 +
build/run_remotely.sh | 124 +
build/scm-collect.sh | 42 +
build/scm.sh | 136 +
build/scm.txt | 117 +
build/sra-dflt-schema.sh | 163 +
build/tag-module.sh | 213 +
build/valgrind.suppress | 6 +
build/wait_for_file.sh | 65 +
configure | 45 +
gradle/wrapper/gradle-wrapper.jar | Bin 53556 -> 0 bytes
gradle/wrapper/gradle-wrapper.properties | 6 -
gradlew | 164 -
scripts/explain_sam_flags.py | 65 -
scripts/release_picard.sh | 152 -
setup/install | 45 +
setup/install.perl | 1329 +
setup/install.prl | 38 +
setup/konfigure.perl | 1762 ++
setup/os-arch.perl | 22 +
setup/os-arch.prl | 106 +
setup/package.prl | 66 +
setup/s/install | 45 +
setup/s/os.prl | 2 +
shared/Makefile | 85 +
shared/toolkit.vers | 1 +
shared/toolkit.vers.c | 8 +
shared/toolkit.vers.h | 1 +
.../java/htsjdk/samtools/AbstractBAMFileIndex.java | 721 -
.../htsjdk/samtools/AbstractSAMHeaderRecord.java | 116 -
src/main/java/htsjdk/samtools/AlignmentBlock.java | 58 -
.../java/htsjdk/samtools/AsyncSAMFileWriter.java | 59 -
.../java/htsjdk/samtools/BAMFileConstants.java | 45 -
src/main/java/htsjdk/samtools/BAMFileReader.java | 913 -
src/main/java/htsjdk/samtools/BAMFileSpan.java | 268 -
src/main/java/htsjdk/samtools/BAMFileWriter.java | 200 -
src/main/java/htsjdk/samtools/BAMIndex.java | 67 -
src/main/java/htsjdk/samtools/BAMIndexContent.java | 69 -
.../java/htsjdk/samtools/BAMIndexMetaData.java | 271 -
src/main/java/htsjdk/samtools/BAMIndexWriter.java | 54 -
src/main/java/htsjdk/samtools/BAMIndexer.java | 313 -
.../java/htsjdk/samtools/BAMIteratorFilter.java | 26 -
.../BAMQueryMultipleIntervalsIteratorFilter.java | 59 -
src/main/java/htsjdk/samtools/BAMRecord.java | 365 -
src/main/java/htsjdk/samtools/BAMRecordCodec.java | 210 -
src/main/java/htsjdk/samtools/BamFileIoUtils.java | 178 -
.../java/htsjdk/samtools/BamIndexValidator.java | 151 -
src/main/java/htsjdk/samtools/Bin.java | 162 -
src/main/java/htsjdk/samtools/BinList.java | 119 -
.../java/htsjdk/samtools/BinaryBAMIndexWriter.java | 207 -
.../java/htsjdk/samtools/BinaryCigarCodec.java | 89 -
src/main/java/htsjdk/samtools/BinaryTagCodec.java | 425 -
.../java/htsjdk/samtools/BinningIndexBuilder.java | 187 -
.../java/htsjdk/samtools/BinningIndexContent.java | 263 -
.../java/htsjdk/samtools/BrowseableBAMIndex.java | 54 -
src/main/java/htsjdk/samtools/CRAMBAIIndexer.java | 474 -
src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java | 135 -
.../htsjdk/samtools/CRAMContainerStreamWriter.java | 495 -
src/main/java/htsjdk/samtools/CRAMFileReader.java | 559 -
src/main/java/htsjdk/samtools/CRAMFileWriter.java | 168 -
src/main/java/htsjdk/samtools/CRAMIterator.java | 310 -
.../java/htsjdk/samtools/CachingBAMFileIndex.java | 169 -
.../samtools/ChainedDownsamplingIterator.java | 90 -
src/main/java/htsjdk/samtools/Chunk.java | 169 -
src/main/java/htsjdk/samtools/Cigar.java | 340 -
src/main/java/htsjdk/samtools/CigarElement.java | 75 -
src/main/java/htsjdk/samtools/CigarOperator.java | 211 -
.../samtools/ComparableSamRecordIterator.java | 89 -
.../ConstantMemoryDownsamplingIterator.java | 88 -
.../samtools/CoordinateSortedPairInfoMap.java | 297 -
.../java/htsjdk/samtools/CustomReaderFactory.java | 143 -
.../htsjdk/samtools/DefaultSAMRecordFactory.java | 54 -
src/main/java/htsjdk/samtools/Defaults.java | 174 -
.../htsjdk/samtools/DiskBasedBAMFileIndex.java | 78 -
.../java/htsjdk/samtools/DownsamplingIterator.java | 113 -
.../samtools/DownsamplingIteratorFactory.java | 118 -
.../htsjdk/samtools/DuplicateScoringStrategy.java | 138 -
src/main/java/htsjdk/samtools/DuplicateSet.java | 184 -
.../java/htsjdk/samtools/DuplicateSetIterator.java | 172 -
.../htsjdk/samtools/FileTruncatedException.java | 46 -
src/main/java/htsjdk/samtools/FixBAMFile.java | 46 -
.../java/htsjdk/samtools/GenomicIndexUtil.java | 100 -
.../samtools/HighAccuracyDownsamplingIterator.java | 196 -
src/main/java/htsjdk/samtools/LinearIndex.java | 126 -
.../htsjdk/samtools/MergingSamRecordIterator.java | 238 -
.../samtools/NotPrimarySkippingIterator.java | 62 -
src/main/java/htsjdk/samtools/QueryInterval.java | 96 -
.../java/htsjdk/samtools/ReservedTagConstants.java | 70 -
.../SAMBinaryTagAndUnsignedArrayValue.java | 65 -
.../java/htsjdk/samtools/SAMBinaryTagAndValue.java | 251 -
src/main/java/htsjdk/samtools/SAMException.java | 44 -
src/main/java/htsjdk/samtools/SAMFileHeader.java | 399 -
src/main/java/htsjdk/samtools/SAMFileSource.java | 68 -
src/main/java/htsjdk/samtools/SAMFileSpan.java | 49 -
src/main/java/htsjdk/samtools/SAMFileWriter.java | 50 -
.../java/htsjdk/samtools/SAMFileWriterFactory.java | 505 -
.../java/htsjdk/samtools/SAMFileWriterImpl.java | 247 -
src/main/java/htsjdk/samtools/SAMFlag.java | 110 -
.../java/htsjdk/samtools/SAMFormatException.java | 44 -
.../htsjdk/samtools/SAMHeaderRecordComparator.java | 68 -
src/main/java/htsjdk/samtools/SAMLineParser.java | 487 -
.../java/htsjdk/samtools/SAMProgramRecord.java | 132 -
.../java/htsjdk/samtools/SAMReadGroupRecord.java | 165 -
src/main/java/htsjdk/samtools/SAMRecord.java | 2378 --
.../java/htsjdk/samtools/SAMRecordComparator.java | 40 -
.../samtools/SAMRecordCoordinateComparator.java | 105 -
.../samtools/SAMRecordDuplicateComparator.java | 363 -
.../java/htsjdk/samtools/SAMRecordFactory.java | 28 -
.../java/htsjdk/samtools/SAMRecordIterator.java | 52 -
.../samtools/SAMRecordQueryHashComparator.java | 72 -
.../samtools/SAMRecordQueryNameComparator.java | 89 -
.../java/htsjdk/samtools/SAMRecordSetBuilder.java | 576 -
src/main/java/htsjdk/samtools/SAMRecordUtil.java | 77 -
.../htsjdk/samtools/SAMSequenceDictionary.java | 355 -
.../samtools/SAMSequenceDictionaryCodec.java | 114 -
.../java/htsjdk/samtools/SAMSequenceRecord.java | 248 -
.../java/htsjdk/samtools/SAMSortOrderChecker.java | 89 -
src/main/java/htsjdk/samtools/SAMTag.java | 82 -
src/main/java/htsjdk/samtools/SAMTagUtil.java | 122 -
src/main/java/htsjdk/samtools/SAMTestUtil.java | 128 -
.../java/htsjdk/samtools/SAMTextHeaderCodec.java | 500 -
src/main/java/htsjdk/samtools/SAMTextReader.java | 253 -
src/main/java/htsjdk/samtools/SAMTextWriter.java | 221 -
src/main/java/htsjdk/samtools/SAMTools.java | 119 -
src/main/java/htsjdk/samtools/SAMUtils.java | 1226 -
.../java/htsjdk/samtools/SAMValidationError.java | 291 -
src/main/java/htsjdk/samtools/SQTagUtil.java | 154 -
src/main/java/htsjdk/samtools/SRAFileReader.java | 309 -
src/main/java/htsjdk/samtools/SRAIndex.java | 257 -
src/main/java/htsjdk/samtools/SRAIterator.java | 256 -
.../java/htsjdk/samtools/SamFileHeaderMerger.java | 786 -
.../java/htsjdk/samtools/SamFileValidator.java | 872 -
src/main/java/htsjdk/samtools/SamFiles.java | 98 -
src/main/java/htsjdk/samtools/SamFlagField.java | 203 -
src/main/java/htsjdk/samtools/SamIndexes.java | 94 -
.../java/htsjdk/samtools/SamInputResource.java | 497 -
src/main/java/htsjdk/samtools/SamPairUtil.java | 510 -
src/main/java/htsjdk/samtools/SamReader.java | 621 -
.../java/htsjdk/samtools/SamReaderFactory.java | 568 -
src/main/java/htsjdk/samtools/SamStreams.java | 164 -
.../SecondaryOrSupplementarySkippingIterator.java | 41 -
.../StreamInflatingIndexingOutputStream.java | 103 -
.../samtools/TagValueAndUnsignedArrayFlag.java | 42 -
src/main/java/htsjdk/samtools/TextCigarCodec.java | 91 -
src/main/java/htsjdk/samtools/TextTagCodec.java | 331 -
.../htsjdk/samtools/TextualBAMIndexWriter.java | 185 -
.../java/htsjdk/samtools/ValidationStringency.java | 21 -
.../java/htsjdk/samtools/apps/TimeChannel.java | 58 -
.../htsjdk/samtools/apps/TimeRandomAccessFile.java | 55 -
src/main/java/htsjdk/samtools/cram/CRAIEntry.java | 195 -
src/main/java/htsjdk/samtools/cram/CRAIIndex.java | 267 -
.../java/htsjdk/samtools/cram/CRAMException.java | 22 -
.../cram/build/CompressionHeaderFactory.java | 592 -
.../samtools/cram/build/ContainerFactory.java | 215 -
.../samtools/cram/build/ContainerParser.java | 221 -
.../samtools/cram/build/Cram2SamRecordFactory.java | 227 -
.../samtools/cram/build/CramContainerIterator.java | 77 -
.../java/htsjdk/samtools/cram/build/CramIO.java | 343 -
.../htsjdk/samtools/cram/build/CramNormalizer.java | 347 -
.../cram/build/CramSpanContainerIterator.java | 100 -
.../samtools/cram/build/Sam2CramRecordFactory.java | 374 -
.../java/htsjdk/samtools/cram/build/Utils.java | 54 -
.../samtools/cram/common/CramVersionPolicies.java | 24 -
.../htsjdk/samtools/cram/common/CramVersions.java | 11 -
.../htsjdk/samtools/cram/common/IntHashMap.java | 415 -
.../htsjdk/samtools/cram/common/MutableInt.java | 27 -
.../java/htsjdk/samtools/cram/common/Version.java | 63 -
.../samtools/cram/digest/AbstractSerialDigest.java | 26 -
.../samtools/cram/digest/ByteSumCombine.java | 12 -
.../java/htsjdk/samtools/cram/digest/Combine.java | 6 -
.../samtools/cram/digest/ContentDigests.java | 217 -
.../htsjdk/samtools/cram/digest/Crc32Hasher.java | 42 -
.../samtools/cram/digest/IntegerSumCombine.java | 10 -
.../samtools/cram/digest/MessageDigestHasher.java | 30 -
.../java/htsjdk/samtools/cram/digest/SERIES.java | 34 -
.../samtools/cram/encoding/AbstractBitCodec.java | 56 -
.../samtools/cram/encoding/BetaIntegerCodec.java | 62 -
.../cram/encoding/BetaIntegerEncoding.java | 78 -
.../htsjdk/samtools/cram/encoding/BitCodec.java | 97 -
.../cram/encoding/ByteArrayLenEncoding.java | 146 -
.../cram/encoding/ByteArrayStopEncoding.java | 130 -
.../htsjdk/samtools/cram/encoding/DataSeries.java | 49 -
.../samtools/cram/encoding/DataSeriesMap.java | 29 -
.../samtools/cram/encoding/DataSeriesType.java | 41 -
.../htsjdk/samtools/cram/encoding/Encoding.java | 44 -
.../samtools/cram/encoding/EncodingFactory.java | 118 -
.../cram/encoding/ExternalByteArrayCodec.java | 76 -
.../cram/encoding/ExternalByteArrayEncoding.java | 63 -
.../samtools/cram/encoding/ExternalByteCodec.java | 64 -
.../cram/encoding/ExternalByteEncoding.java | 62 -
.../samtools/cram/encoding/ExternalCompressor.java | 84 -
.../cram/encoding/ExternalIntegerCodec.java | 76 -
.../cram/encoding/ExternalIntegerEncoding.java | 62 -
.../samtools/cram/encoding/ExternalLongCodec.java | 65 -
.../cram/encoding/ExternalLongEncoding.java | 62 -
.../samtools/cram/encoding/GammaIntegerCodec.java | 72 -
.../cram/encoding/GammaIntegerEncoding.java | 73 -
.../samtools/cram/encoding/GolombIntegerCodec.java | 101 -
.../cram/encoding/GolombIntegerEncoding.java | 80 -
.../samtools/cram/encoding/GolombLongCodec.java | 100 -
.../samtools/cram/encoding/GolombLongEncoding.java | 73 -
.../cram/encoding/GolombRiceIntegerCodec.java | 87 -
.../cram/encoding/GolombRiceIntegerEncoding.java | 73 -
.../htsjdk/samtools/cram/encoding/NullCodec.java | 52 -
.../samtools/cram/encoding/NullEncoding.java | 57 -
.../cram/encoding/SubexponentialIntegerCodec.java | 99 -
.../encoding/SubexponentialIntegerEncoding.java | 78 -
.../cram/encoding/huffman/HuffmanCode.java | 99 -
.../cram/encoding/huffman/HuffmanLeaf.java | 28 -
.../cram/encoding/huffman/HuffmanNode.java | 28 -
.../cram/encoding/huffman/HuffmanTree.java | 30 -
.../huffman/codec/CanonicalHuffmanByteCodec.java | 70 -
.../codec/CanonicalHuffmanIntegerCodec.java | 59 -
.../encoding/huffman/codec/HuffmanBitCode.java | 29 -
.../huffman/codec/HuffmanByteEncoding.java | 91 -
.../encoding/huffman/codec/HuffmanByteHelper.java | 178 -
.../encoding/huffman/codec/HuffmanIntHelper.java | 178 -
.../huffman/codec/HuffmanIntegerEncoding.java | 100 -
.../huffman/codec/HuffmanParamsCalculator.java | 137 -
.../samtools/cram/encoding/rans/Constants.java | 7 -
.../htsjdk/samtools/cram/encoding/rans/D04.java | 86 -
.../htsjdk/samtools/cram/encoding/rans/D14.java | 71 -
.../samtools/cram/encoding/rans/Decoding.java | 93 -
.../htsjdk/samtools/cram/encoding/rans/E04.java | 59 -
.../htsjdk/samtools/cram/encoding/rans/E14.java | 88 -
.../samtools/cram/encoding/rans/Encoding.java | 73 -
.../samtools/cram/encoding/rans/Frequencies.java | 331 -
.../htsjdk/samtools/cram/encoding/rans/RANS.java | 172 -
.../htsjdk/samtools/cram/encoding/rans/Utils.java | 34 -
.../cram/encoding/reader/AbstractReader.java | 131 -
.../cram/encoding/reader/CramRecordReader.java | 212 -
.../samtools/cram/encoding/reader/DataReader.java | 44 -
.../cram/encoding/reader/DataReaderFactory.java | 228 -
.../cram/encoding/reader/RefSeqIdReader.java | 242 -
.../encoding/readfeatures/BaseQualityScore.java | 76 -
.../samtools/cram/encoding/readfeatures/Bases.java | 76 -
.../cram/encoding/readfeatures/Deletion.java | 77 -
.../cram/encoding/readfeatures/HardClip.java | 75 -
.../cram/encoding/readfeatures/InsertBase.java | 77 -
.../cram/encoding/readfeatures/Insertion.java | 75 -
.../cram/encoding/readfeatures/Padding.java | 76 -
.../cram/encoding/readfeatures/ReadBase.java | 89 -
.../cram/encoding/readfeatures/ReadFeature.java | 36 -
.../cram/encoding/readfeatures/RefSkip.java | 76 -
.../cram/encoding/readfeatures/Scores.java | 79 -
.../cram/encoding/readfeatures/SoftClip.java | 77 -
.../cram/encoding/readfeatures/Substitution.java | 110 -
.../samtools/cram/encoding/writer/DataWriter.java | 41 -
.../cram/encoding/writer/DataWriterFactory.java | 109 -
.../samtools/cram/encoding/writer/Writer.java | 270 -
.../htsjdk/samtools/cram/io/BitInputStream.java | 51 -
.../htsjdk/samtools/cram/io/BitOutputStream.java | 73 -
.../htsjdk/samtools/cram/io/CRC32InputStream.java | 77 -
.../htsjdk/samtools/cram/io/CRC32OutputStream.java | 55 -
.../samtools/cram/io/CountingInputStream.java | 83 -
.../java/htsjdk/samtools/cram/io/CramArray.java | 41 -
src/main/java/htsjdk/samtools/cram/io/CramInt.java | 78 -
.../samtools/cram/io/DefaultBitInputStream.java | 115 -
.../samtools/cram/io/DefaultBitOutputStream.java | 178 -
.../cram/io/ExposedByteArrayOutputStream.java | 26 -
.../samtools/cram/io/ExternalCompression.java | 152 -
src/main/java/htsjdk/samtools/cram/io/ITF8.java | 186 -
.../htsjdk/samtools/cram/io/InputStreamUtils.java | 80 -
src/main/java/htsjdk/samtools/cram/io/LTF8.java | 193 -
.../htsjdk/samtools/cram/lossy/BaseCategory.java | 57 -
.../samtools/cram/lossy/BaseCategoryType.java | 30 -
.../java/htsjdk/samtools/cram/lossy/Binning.java | 76 -
.../samtools/cram/lossy/PreservationPolicy.java | 42 -
.../cram/lossy/QualityScorePreservation.java | 410 -
.../samtools/cram/lossy/QualityScoreTreatment.java | 47 -
.../cram/lossy/QualityScoreTreatmentType.java | 22 -
.../htsjdk/samtools/cram/lossy/ReadCategory.java | 50 -
.../samtools/cram/lossy/ReadCategoryType.java | 29 -
.../samtools/cram/ref/CRAMReferenceSource.java | 22 -
.../htsjdk/samtools/cram/ref/EnaRefService.java | 122 -
.../cram/ref/InMemoryReferenceSequenceFile.java | 102 -
.../htsjdk/samtools/cram/ref/ReferenceRegion.java | 93 -
.../htsjdk/samtools/cram/ref/ReferenceSource.java | 280 -
.../htsjdk/samtools/cram/ref/ReferenceTracks.java | 172 -
.../samtools/cram/structure/AlignmentSpan.java | 92 -
.../java/htsjdk/samtools/cram/structure/Block.java | 323 -
.../cram/structure/BlockCompressionMethod.java | 22 -
.../samtools/cram/structure/BlockContentType.java | 22 -
.../samtools/cram/structure/CompressionHeader.java | 299 -
.../htsjdk/samtools/cram/structure/Container.java | 81 -
.../samtools/cram/structure/ContainerHeaderIO.java | 96 -
.../samtools/cram/structure/ContainerIO.java | 237 -
.../cram/structure/CramCompressionRecord.java | 348 -
.../htsjdk/samtools/cram/structure/CramHeader.java | 123 -
.../htsjdk/samtools/cram/structure/EncodingID.java | 64 -
.../samtools/cram/structure/EncodingKey.java | 40 -
.../samtools/cram/structure/EncodingParams.java | 39 -
.../htsjdk/samtools/cram/structure/ReadTag.java | 487 -
.../java/htsjdk/samtools/cram/structure/Slice.java | 245 -
.../htsjdk/samtools/cram/structure/SliceIO.java | 153 -
.../cram/structure/SubstitutionMatrix.java | 179 -
.../htsjdk/samtools/example/ExampleSamUsage.java | 118 -
.../htsjdk/samtools/example/PrintReadsExample.java | 98 -
.../htsjdk/samtools/fastq/AsyncFastqWriter.java | 20 -
.../htsjdk/samtools/fastq/BasicFastqWriter.java | 89 -
.../java/htsjdk/samtools/fastq/FastqConstants.java | 49 -
.../java/htsjdk/samtools/fastq/FastqReader.java | 199 -
.../java/htsjdk/samtools/fastq/FastqRecord.java | 124 -
.../java/htsjdk/samtools/fastq/FastqWriter.java | 13 -
.../htsjdk/samtools/fastq/FastqWriterFactory.java | 31 -
.../samtools/filter/AbstractJavascriptFilter.java | 159 -
.../htsjdk/samtools/filter/AggregateFilter.java | 79 -
.../java/htsjdk/samtools/filter/AlignedFilter.java | 87 -
.../samtools/filter/DuplicateReadFilter.java | 52 -
.../filter/FailsVendorReadQualityFilter.java | 57 -
.../htsjdk/samtools/filter/FilteringIterator.java | 53 -
.../samtools/filter/FilteringSamIterator.java | 155 -
.../htsjdk/samtools/filter/InsertSizeFilter.java | 31 -
.../htsjdk/samtools/filter/IntervalFilter.java | 102 -
.../samtools/filter/IntervalKeepPairFilter.java | 108 -
.../samtools/filter/JavascriptSamRecordFilter.java | 101 -
.../samtools/filter/MappingQualityFilter.java | 25 -
.../samtools/filter/NotPrimaryAlignmentFilter.java | 54 -
.../samtools/filter/OverclippedReadFilter.java | 76 -
.../htsjdk/samtools/filter/ReadNameFilter.java | 120 -
.../htsjdk/samtools/filter/SamRecordFilter.java | 53 -
.../samtools/filter/SecondaryAlignmentFilter.java | 20 -
.../filter/SecondaryOrSupplementaryFilter.java | 32 -
.../htsjdk/samtools/filter/SolexaNoiseFilter.java | 66 -
.../java/htsjdk/samtools/filter/TagFilter.java | 85 -
.../samtools/filter/WholeReadClippedFilter.java | 64 -
src/main/java/htsjdk/samtools/liftover/Chain.java | 414 -
.../java/htsjdk/samtools/liftover/LiftOver.java | 319 -
src/main/java/htsjdk/samtools/metrics/Header.java | 43 -
.../java/htsjdk/samtools/metrics/MetricBase.java | 125 -
.../java/htsjdk/samtools/metrics/MetricsFile.java | 594 -
.../java/htsjdk/samtools/metrics/StringHeader.java | 72 -
.../htsjdk/samtools/metrics/VersionHeader.java | 81 -
.../reference/AbstractFastaSequenceFile.java | 158 -
.../samtools/reference/FastaSequenceFile.java | 172 -
.../samtools/reference/FastaSequenceIndex.java | 323 -
.../reference/IndexedFastaSequenceFile.java | 328 -
.../samtools/reference/ReferenceSequence.java | 84 -
.../samtools/reference/ReferenceSequenceFile.java | 90 -
.../reference/ReferenceSequenceFileFactory.java | 136 -
.../reference/ReferenceSequenceFileWalker.java | 111 -
.../seekablestream/ByteArraySeekableStream.java | 99 -
.../seekablestream/ISeekableStreamFactory.java | 33 -
.../seekablestream/SeekableBufferedStream.java | 132 -
.../samtools/seekablestream/SeekableFTPStream.java | 120 -
.../seekablestream/SeekableFTPStreamHelper.java | 166 -
.../seekablestream/SeekableFileStream.java | 128 -
.../seekablestream/SeekableHTTPStream.java | 186 -
.../seekablestream/SeekableMemoryStream.java | 64 -
.../seekablestream/SeekablePathStream.java | 121 -
.../samtools/seekablestream/SeekableStream.java | 69 -
.../seekablestream/SeekableStreamFactory.java | 97 -
.../samtools/seekablestream/UserPasswordInput.java | 31 -
.../java/htsjdk/samtools/sra/ReferenceCache.java | 46 -
.../java/htsjdk/samtools/sra/SRAAccession.java | 177 -
.../htsjdk/samtools/sra/SRAAlignmentIterator.java | 209 -
.../samtools/sra/SRAIndexedSequenceFile.java | 112 -
.../java/htsjdk/samtools/sra/SRALazyRecord.java | 1056 -
.../samtools/sra/SRAUnalignmentIterator.java | 181 -
src/main/java/htsjdk/samtools/sra/SRAUtils.java | 83 -
.../htsjdk/samtools/util/AbstractAsyncWriter.java | 137 -
.../htsjdk/samtools/util/AbstractIterator.java | 85 -
.../htsjdk/samtools/util/AbstractLocusInfo.java | 146 -
.../samtools/util/AbstractLocusIterator.java | 572 -
.../samtools/util/AbstractProgressLogger.java | 119 -
.../samtools/util/AbstractRecordAndOffset.java | 130 -
.../java/htsjdk/samtools/util/AsciiWriter.java | 83 -
.../samtools/util/AsyncBufferedIterator.java | 281 -
.../java/htsjdk/samtools/util/BinaryCodec.java | 670 -
.../util/BlockCompressedFilePointerUtil.java | 101 -
.../samtools/util/BlockCompressedInputStream.java | 513 -
.../samtools/util/BlockCompressedOutputStream.java | 392 -
.../util/BlockCompressedStreamConstants.java | 118 -
.../java/htsjdk/samtools/util/BlockGunzipper.java | 132 -
.../htsjdk/samtools/util/BufferedLineReader.java | 115 -
src/main/java/htsjdk/samtools/util/CigarUtil.java | 294 -
.../htsjdk/samtools/util/CloseableIterator.java | 63 -
src/main/java/htsjdk/samtools/util/CloserUtil.java | 81 -
src/main/java/htsjdk/samtools/util/CodeUtil.java | 14 -
.../java/htsjdk/samtools/util/CollectionUtil.java | 191 -
.../java/htsjdk/samtools/util/ComparableTuple.java | 28 -
src/main/java/htsjdk/samtools/util/CoordMath.java | 76 -
.../htsjdk/samtools/util/CoordSpanInputSteam.java | 100 -
.../samtools/util/CustomGzipOutputStream.java | 24 -
src/main/java/htsjdk/samtools/util/DateParser.java | 337 -
.../htsjdk/samtools/util/DelegatingIterator.java | 35 -
.../java/htsjdk/samtools/util/DiskBackedQueue.java | 406 -
.../htsjdk/samtools/util/EdgeReadIterator.java | 228 -
.../samtools/util/EdgingRecordAndOffset.java | 219 -
.../java/htsjdk/samtools/util/FastLineReader.java | 171 -
.../htsjdk/samtools/util/FastqQualityFormat.java | 36 -
.../samtools/util/FileAppendStreamLRUCache.java | 78 -
src/main/java/htsjdk/samtools/util/FormatUtil.java | 203 -
src/main/java/htsjdk/samtools/util/Histogram.java | 567 -
src/main/java/htsjdk/samtools/util/HttpUtils.java | 80 -
src/main/java/htsjdk/samtools/util/IOUtil.java | 946 -
src/main/java/htsjdk/samtools/util/Interval.java | 202 -
.../java/htsjdk/samtools/util/IntervalList.java | 790 -
.../util/IntervalListReferenceSequenceMask.java | 125 -
.../java/htsjdk/samtools/util/IntervalTree.java | 1227 -
.../java/htsjdk/samtools/util/IntervalTreeMap.java | 331 -
.../java/htsjdk/samtools/util/IntervalUtil.java | 76 -
.../java/htsjdk/samtools/util/Iso8601Date.java | 65 -
.../java/htsjdk/samtools/util/IterableAdapter.java | 29 -
.../htsjdk/samtools/util/IterableOnceIterator.java | 42 -
src/main/java/htsjdk/samtools/util/Iterables.java | 24 -
src/main/java/htsjdk/samtools/util/Lazy.java | 40 -
src/main/java/htsjdk/samtools/util/LineReader.java | 51 -
src/main/java/htsjdk/samtools/util/ListMap.java | 48 -
src/main/java/htsjdk/samtools/util/Locatable.java | 25 -
.../java/htsjdk/samtools/util/LocationAware.java | 26 -
src/main/java/htsjdk/samtools/util/Locus.java | 36 -
.../java/htsjdk/samtools/util/LocusComparator.java | 41 -
src/main/java/htsjdk/samtools/util/LocusImpl.java | 49 -
src/main/java/htsjdk/samtools/util/Log.java | 214 -
.../samtools/util/Md5CalculatingInputStream.java | 133 -
.../samtools/util/Md5CalculatingOutputStream.java | 119 -
.../java/htsjdk/samtools/util/MergingIterator.java | 145 -
src/main/java/htsjdk/samtools/util/Murmur3.java | 119 -
.../java/htsjdk/samtools/util/OverlapDetector.java | 193 -
.../java/htsjdk/samtools/util/PeekIterator.java | 85 -
.../htsjdk/samtools/util/PeekableIterator.java | 79 -
.../samtools/util/PositionalOutputStream.java | 65 -
.../java/htsjdk/samtools/util/ProcessExecutor.java | 243 -
.../java/htsjdk/samtools/util/ProgressLogger.java | 52 -
.../samtools/util/ProgressLoggerInterface.java | 38 -
.../samtools/util/QualityEncodingDetector.java | 405 -
.../java/htsjdk/samtools/util/QualityUtil.java | 77 -
.../samtools/util/ReferenceSequenceMask.java | 55 -
.../htsjdk/samtools/util/RelativeIso8601Date.java | 203 -
.../htsjdk/samtools/util/ResourceLimitedMap.java | 105 -
.../samtools/util/ResourceLimitedMapFunctor.java | 47 -
.../htsjdk/samtools/util/RuntimeEOFException.java | 46 -
.../htsjdk/samtools/util/RuntimeIOException.java | 46 -
.../samtools/util/RuntimeScriptException.java | 45 -
.../htsjdk/samtools/util/SamLocusIterator.java | 292 -
.../util/SamRecordIntervalIteratorFactory.java | 157 -
.../samtools/util/SamRecordTrackingBuffer.java | 321 -
.../htsjdk/samtools/util/SamRecordWithOrdinal.java | 56 -
.../java/htsjdk/samtools/util/SequenceUtil.java | 1031 -
.../java/htsjdk/samtools/util/SnappyLoader.java | 127 -
.../samtools/util/SolexaQualityConverter.java | 129 -
.../htsjdk/samtools/util/SortingCollection.java | 514 -
.../samtools/util/SortingLongCollection.java | 349 -
src/main/java/htsjdk/samtools/util/StopWatch.java | 76 -
.../htsjdk/samtools/util/StringLineReader.java | 99 -
src/main/java/htsjdk/samtools/util/StringUtil.java | 603 -
.../htsjdk/samtools/util/TempStreamFactory.java | 83 -
src/main/java/htsjdk/samtools/util/TestUtil.java | 98 -
.../java/htsjdk/samtools/util/TrimmingUtil.java | 67 -
src/main/java/htsjdk/samtools/util/Tuple.java | 41 -
.../util/WholeGenomeReferenceSequenceMask.java | 80 -
.../java/htsjdk/samtools/util/ftp/FTPClient.java | 240 -
.../java/htsjdk/samtools/util/ftp/FTPReply.java | 113 -
.../java/htsjdk/samtools/util/ftp/FTPStream.java | 53 -
.../java/htsjdk/samtools/util/ftp/FTPUtils.java | 154 -
.../htsjdk/samtools/util/zip/DeflaterFactory.java | 48 -
.../java/htsjdk/tribble/AbstractFeatureCodec.java | 50 -
.../java/htsjdk/tribble/AbstractFeatureReader.java | 193 -
.../java/htsjdk/tribble/AsciiFeatureCodec.java | 92 -
.../java/htsjdk/tribble/BinaryFeatureCodec.java | 52 -
.../htsjdk/tribble/CloseableTribbleIterator.java | 27 -
src/main/java/htsjdk/tribble/Feature.java | 43 -
src/main/java/htsjdk/tribble/FeatureCodec.java | 136 -
.../java/htsjdk/tribble/FeatureCodecHeader.java | 83 -
src/main/java/htsjdk/tribble/FeatureReader.java | 41 -
src/main/java/htsjdk/tribble/NameAwareCodec.java | 37 -
src/main/java/htsjdk/tribble/SimpleFeature.java | 53 -
.../java/htsjdk/tribble/TabixFeatureReader.java | 217 -
src/main/java/htsjdk/tribble/Tribble.java | 100 -
src/main/java/htsjdk/tribble/TribbleException.java | 139 -
.../tribble/TribbleIndexedFeatureReader.java | 573 -
.../java/htsjdk/tribble/annotation/Strand.java | 52 -
src/main/java/htsjdk/tribble/bed/BEDCodec.java | 242 -
src/main/java/htsjdk/tribble/bed/BEDFeature.java | 55 -
.../java/htsjdk/tribble/bed/FullBEDFeature.java | 433 -
.../java/htsjdk/tribble/bed/SimpleBEDFeature.java | 140 -
.../java/htsjdk/tribble/example/CountRecords.java | 200 -
.../htsjdk/tribble/example/ExampleBinaryCodec.java | 128 -
.../java/htsjdk/tribble/example/IndexToTable.java | 72 -
.../htsjdk/tribble/example/IndicesAreEqual.java | 76 -
.../tribble/example/ProfileIndexReading.java | 66 -
.../exception/CodecLineParsingException.java | 50 -
.../tribble/exception/UnsortedFileException.java | 45 -
.../htsjdk/tribble/gelitext/DiploidGenotype.java | 66 -
.../htsjdk/tribble/gelitext/GeliTextCodec.java | 117 -
.../htsjdk/tribble/gelitext/GeliTextFeature.java | 148 -
.../java/htsjdk/tribble/index/AbstractIndex.java | 451 -
src/main/java/htsjdk/tribble/index/Block.java | 82 -
src/main/java/htsjdk/tribble/index/ChrIndex.java | 55 -
.../htsjdk/tribble/index/DynamicIndexCreator.java | 209 -
src/main/java/htsjdk/tribble/index/Index.java | 99 -
.../java/htsjdk/tribble/index/IndexCreator.java | 57 -
.../java/htsjdk/tribble/index/IndexFactory.java | 515 -
.../java/htsjdk/tribble/index/MutableIndex.java | 36 -
.../htsjdk/tribble/index/TribbleIndexCreator.java | 53 -
.../htsjdk/tribble/index/interval/Interval.java | 115 -
.../index/interval/IntervalIndexCreator.java | 159 -
.../tribble/index/interval/IntervalTree.java | 551 -
.../tribble/index/interval/IntervalTreeIndex.java | 214 -
.../htsjdk/tribble/index/linear/LinearIndex.java | 434 -
.../tribble/index/linear/LinearIndexCreator.java | 126 -
.../htsjdk/tribble/index/tabix/TabixFormat.java | 109 -
.../htsjdk/tribble/index/tabix/TabixIndex.java | 366 -
.../tribble/index/tabix/TabixIndexCreator.java | 202 -
.../htsjdk/tribble/readers/AsciiLineReader.java | 185 -
.../tribble/readers/AsciiLineReaderIterator.java | 101 -
.../java/htsjdk/tribble/readers/LineIterator.java | 12 -
.../htsjdk/tribble/readers/LineIteratorImpl.java | 34 -
.../java/htsjdk/tribble/readers/LineReader.java | 43 -
.../htsjdk/tribble/readers/LineReaderUtil.java | 56 -
.../tribble/readers/LongLineBufferedReader.java | 490 -
.../java/htsjdk/tribble/readers/Positional.java | 60 -
.../tribble/readers/PositionalBufferedStream.java | 229 -
.../tribble/readers/SynchronousLineReader.java | 61 -
.../tribble/readers/TabixIteratorLineReader.java | 54 -
.../java/htsjdk/tribble/readers/TabixReader.java | 526 -
src/main/java/htsjdk/tribble/readme.txt | 1 -
src/main/java/htsjdk/tribble/util/FTPHelper.java | 55 -
src/main/java/htsjdk/tribble/util/HTTPHelper.java | 152 -
.../tribble/util/LittleEndianInputStream.java | 144 -
.../tribble/util/LittleEndianOutputStream.java | 120 -
src/main/java/htsjdk/tribble/util/MathUtils.java | 66 -
.../java/htsjdk/tribble/util/ParsingUtils.java | 478 -
.../java/htsjdk/tribble/util/RemoteURLHelper.java | 55 -
src/main/java/htsjdk/tribble/util/TabixUtils.java | 115 -
src/main/java/htsjdk/tribble/util/URLHelper.java | 56 -
.../util/popgen/HardyWeinbergCalculation.java | 149 -
src/main/java/htsjdk/variant/bcf2/BCF2Codec.java | 491 -
src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java | 362 -
.../variant/bcf2/BCF2GenotypeFieldDecoders.java | 278 -
.../variant/bcf2/BCF2LazyGenotypesDecoder.java | 99 -
src/main/java/htsjdk/variant/bcf2/BCF2Type.java | 214 -
src/main/java/htsjdk/variant/bcf2/BCF2Utils.java | 336 -
src/main/java/htsjdk/variant/bcf2/BCFVersion.java | 105 -
.../variant/example/PrintVariantsExample.java | 103 -
.../java/htsjdk/variant/utils/GeneralUtils.java | 246 -
.../utils/SAMSequenceDictionaryExtractor.java | 137 -
.../java/htsjdk/variant/variantcontext/Allele.java | 546 -
.../htsjdk/variant/variantcontext/CommonInfo.java | 341 -
.../variant/variantcontext/FastGenotype.java | 173 -
.../htsjdk/variant/variantcontext/Genotype.java | 670 -
.../variant/variantcontext/GenotypeBuilder.java | 421 -
.../variantcontext/GenotypeJEXLContext.java | 59 -
.../variantcontext/GenotypeLikelihoods.java | 578 -
.../variant/variantcontext/GenotypeType.java | 47 -
.../variant/variantcontext/GenotypesContext.java | 719 -
.../htsjdk/variant/variantcontext/JEXLMap.java | 228 -
.../variantcontext/JexlMissingValueTreatment.java | 39 -
.../variantcontext/LazyGenotypesContext.java | 226 -
.../variantcontext/StructuralVariantType.java | 47 -
.../variant/variantcontext/VariantContext.java | 1734 --
.../variantcontext/VariantContextBuilder.java | 498 -
.../variantcontext/VariantContextComparator.java | 105 -
.../variantcontext/VariantContextUtils.java | 483 -
.../variant/variantcontext/VariantJEXLContext.java | 102 -
.../variantcontext/filter/CompoundFilter.java | 74 -
.../variantcontext/filter/FilteringIterator.java | 47 -
.../filter/FilteringVariantContextIterator.java | 127 -
.../filter/GenotypeQualityFilter.java | 79 -
.../filter/HeterozygosityFilter.java | 84 -
.../filter/JavascriptVariantFilter.java | 97 -
.../filter/PassingVariantFilter.java | 44 -
.../variant/variantcontext/filter/SnpFilter.java | 44 -
.../filter/VariantContextFilter.java | 43 -
.../writer/AsyncVariantContextWriter.java | 54 -
.../variant/variantcontext/writer/BCF2Encoder.java | 261 -
.../variantcontext/writer/BCF2FieldEncoder.java | 455 -
.../variantcontext/writer/BCF2FieldWriter.java | 323 -
.../writer/BCF2FieldWriterManager.java | 180 -
.../variant/variantcontext/writer/BCF2Writer.java | 443 -
.../writer/IndexingVariantContextWriter.java | 180 -
.../writer/IntGenotypeFieldAccessors.java | 97 -
.../variant/variantcontext/writer/Options.java | 41 -
.../writer/SortingVariantContextWriter.java | 66 -
.../writer/SortingVariantContextWriterBase.java | 201 -
.../variant/variantcontext/writer/VCFWriter.java | 231 -
.../writer/VariantContextWriter.java | 51 -
.../writer/VariantContextWriterBuilder.java | 537 -
.../writer/VariantContextWriterFactory.java | 282 -
.../java/htsjdk/variant/vcf/AbstractVCFCodec.java | 791 -
src/main/java/htsjdk/variant/vcf/VCF3Codec.java | 134 -
src/main/java/htsjdk/variant/vcf/VCFCodec.java | 161 -
.../htsjdk/variant/vcf/VCFCompoundHeaderLine.java | 301 -
src/main/java/htsjdk/variant/vcf/VCFConstants.java | 130 -
.../htsjdk/variant/vcf/VCFContigHeaderLine.java | 118 -
src/main/java/htsjdk/variant/vcf/VCFEncoder.java | 382 -
.../java/htsjdk/variant/vcf/VCFFileReader.java | 153 -
.../htsjdk/variant/vcf/VCFFilterHeaderLine.java | 79 -
.../htsjdk/variant/vcf/VCFFormatHeaderLine.java | 63 -
src/main/java/htsjdk/variant/vcf/VCFHeader.java | 574 -
.../java/htsjdk/variant/vcf/VCFHeaderLine.java | 174 -
.../htsjdk/variant/vcf/VCFHeaderLineCount.java | 33 -
.../variant/vcf/VCFHeaderLineTranslator.java | 183 -
.../java/htsjdk/variant/vcf/VCFHeaderLineType.java | 33 -
.../java/htsjdk/variant/vcf/VCFHeaderVersion.java | 138 -
.../java/htsjdk/variant/vcf/VCFIDHeaderLine.java | 31 -
.../java/htsjdk/variant/vcf/VCFInfoHeaderLine.java | 61 -
.../java/htsjdk/variant/vcf/VCFRecordCodec.java | 64 -
.../htsjdk/variant/vcf/VCFSimpleHeaderLine.java | 127 -
.../htsjdk/variant/vcf/VCFStandardHeaderLines.java | 233 -
src/main/java/htsjdk/variant/vcf/VCFUtils.java | 209 -
.../htsjdk/cram/io/ExternalCompressionTest.java | 30 -
.../htsjdk/samtools/AbstractBAMFileIndexTest.java | 62 -
.../java/htsjdk/samtools/BAMCigarOverflowTest.java | 29 -
.../java/htsjdk/samtools/BAMFileIndexTest.java | 527 -
.../java/htsjdk/samtools/BAMFileWriterTest.java | 192 -
.../java/htsjdk/samtools/BAMIndexWriterTest.java | 227 -
src/test/java/htsjdk/samtools/BAMIteratorTest.java | 71 -
...AMQueryMultipleIntervalsIteratorFilterTest.java | 146 -
.../java/htsjdk/samtools/BAMRemoteFileTest.java | 327 -
src/test/java/htsjdk/samtools/BinTest.java | 39 -
.../java/htsjdk/samtools/CRAMBAIIndexerTest.java | 87 -
.../java/htsjdk/samtools/CRAMCRAIIndexerTest.java | 183 -
.../java/htsjdk/samtools/CRAMComplianceTest.java | 150 -
.../samtools/CRAMContainerStreamWriterTest.java | 184 -
.../java/htsjdk/samtools/CRAMEdgeCasesTest.java | 158 -
.../java/htsjdk/samtools/CRAMFileBAIIndexTest.java | 301 -
.../htsjdk/samtools/CRAMFileCRAIIndexTest.java | 368 -
.../java/htsjdk/samtools/CRAMFileReaderTest.java | 231 -
.../java/htsjdk/samtools/CRAMFileWriterTest.java | 282 -
.../samtools/CRAMFileWriterWithIndexTest.java | 209 -
.../java/htsjdk/samtools/CRAMIndexQueryTest.java | 708 -
src/test/java/htsjdk/samtools/ChunkTest.java | 78 -
src/test/java/htsjdk/samtools/CigarCodecTest.java | 110 -
src/test/java/htsjdk/samtools/CigarTest.java | 118 -
.../htsjdk/samtools/DownsamplingIteratorTests.java | 87 -
.../htsjdk/samtools/DuplicateSetIteratorTest.java | 63 -
.../java/htsjdk/samtools/GenomicIndexUtilTest.java | 50 -
...MergingSamRecordIteratorGroupCollisionTest.java | 528 -
.../samtools/MergingSamRecordIteratorTest.java | 312 -
.../htsjdk/samtools/ProgramRecordChainingTest.java | 57 -
.../samtools/SAMBinaryTagAndValueUnitTest.java | 183 -
src/test/java/htsjdk/samtools/SAMCloneTest.java | 52 -
.../htsjdk/samtools/SAMFileWriterFactoryTest.java | 307 -
src/test/java/htsjdk/samtools/SAMFlagTest.java | 42 -
.../java/htsjdk/samtools/SAMIntegerTagTest.java | 375 -
.../samtools/SAMRecordDuplicateComparatorTest.java | 233 -
.../java/htsjdk/samtools/SAMRecordUnitTest.java | 1041 -
.../samtools/SAMSequenceDictionaryCodecTest.java | 122 -
.../htsjdk/samtools/SAMSequenceDictionaryTest.java | 147 -
.../java/htsjdk/samtools/SAMTextReaderTest.java | 137 -
.../java/htsjdk/samtools/SAMTextWriterTest.java | 130 -
src/test/java/htsjdk/samtools/SAMUtilsTest.java | 250 -
.../htsjdk/samtools/SamFileHeaderMergerTest.java | 265 -
src/test/java/htsjdk/samtools/SamFilesTest.java | 91 -
.../java/htsjdk/samtools/SamFlagFieldTest.java | 150 -
.../samtools/SamHeaderRecordComparatorTest.java | 72 -
src/test/java/htsjdk/samtools/SamIndexesTest.java | 193 -
src/test/java/htsjdk/samtools/SamPairUtilTest.java | 251 -
.../java/htsjdk/samtools/SamReaderFactoryTest.java | 468 -
.../java/htsjdk/samtools/SamReaderSortTest.java | 102 -
src/test/java/htsjdk/samtools/SamReaderTest.java | 170 -
src/test/java/htsjdk/samtools/SamSpecIntTest.java | 97 -
src/test/java/htsjdk/samtools/SamStreamsTest.java | 124 -
.../SequenceNameTruncationAndValidationTest.java | 98 -
.../java/htsjdk/samtools/ValidateSamFileTest.java | 547 -
.../java/htsjdk/samtools/cram/CRAIEntryTest.java | 144 -
.../java/htsjdk/samtools/cram/CRAIIndexTest.java | 220 -
.../samtools/cram/LosslessRoundTripTest.java | 68 -
.../java/htsjdk/samtools/cram/VersionTest.java | 106 -
.../cram/build/CompressionHeaderFactoryTest.java | 208 -
.../samtools/cram/build/ContainerFactoryTest.java | 134 -
.../samtools/cram/build/ContainerParserTest.java | 185 -
.../htsjdk/samtools/cram/build/CramIOTest.java | 82 -
.../cram/encoding/huffman/codec/HuffmanTest.java | 106 -
.../samtools/cram/encoding/rans/RansTest.java | 228 -
.../java/htsjdk/samtools/cram/io/ITF8Test.java | 101 -
.../java/htsjdk/samtools/cram/io/LTF8Test.java | 80 -
.../cram/lossy/QualityScorePreservationTest.java | 162 -
.../samtools/cram/ref/EnaRefServiceTest.java | 15 -
.../cram/structure/CramCompressionRecordTest.java | 68 -
.../samtools/cram/structure/ReadTagTest.java | 138 -
.../htsjdk/samtools/cram/structure/SliceTests.java | 70 -
.../cram/structure/SubstitutionMatrixTest.java | 105 -
.../htsjdk/samtools/fastq/FastqRecordTest.java | 204 -
.../htsjdk/samtools/fastq/FastqWriterTest.java | 73 -
.../filter/FailsVendorReadQualityFilterTest.java | 65 -
.../samtools/filter/InsertSizeFilterTest.java | 43 -
.../filter/IntervalKeepPairFilterTest.java | 123 -
.../filter/JavascriptSamRecordFilterTest.java | 74 -
.../samtools/filter/MappingQualityFilterTest.java | 39 -
.../samtools/filter/OverclippedReadFilterTest.java | 83 -
.../samtools/filter/SolexaNoiseFilterTest.java | 73 -
.../java/htsjdk/samtools/filter/TagFilterTest.java | 77 -
.../htsjdk/samtools/liftover/LiftOverTest.java | 468 -
.../htsjdk/samtools/metrics/MetricBaseTest.java | 75 -
.../htsjdk/samtools/metrics/MetricsFileTest.java | 213 -
.../htsjdk/samtools/metrics/StringHeaderTest.java | 19 -
.../htsjdk/samtools/metrics/VersionHeaderTest.java | 22 -
.../reference/FakeReferenceSequenceFile.java | 77 -
.../samtools/reference/FastaSequenceFileTest.java | 85 -
.../samtools/reference/FastaSequenceIndexTest.java | 256 -
.../reference/InMemoryReferenceSequenceFile.java | 66 -
.../reference/IndexedFastaSequenceFileTest.java | 308 -
.../ReferenceSequenceFileFactoryTests.java | 39 -
.../reference/ReferenceSequenceFileWalkerTest.java | 73 -
.../samtools/reference/ReferenceSequenceTests.java | 98 -
.../seekablestream/SeekableBufferedStreamTest.java | 162 -
.../seekablestream/SeekableFTPStreamTest.java | 106 -
.../seekablestream/SeekableFileStreamTest.java | 52 -
.../seekablestream/SeekableMemoryStreamTest.java | 93 -
.../seekablestream/SeekablePathStreamTest.java | 51 -
.../seekablestream/SeekableStreamFactoryTest.java | 45 -
.../java/htsjdk/samtools/sra/AbstractSRATest.java | 89 -
.../java/htsjdk/samtools/sra/SRAAccessionTest.java | 28 -
.../java/htsjdk/samtools/sra/SRAIndexTest.java | 134 -
.../htsjdk/samtools/sra/SRALazyRecordTest.java | 51 -
.../java/htsjdk/samtools/sra/SRAQueryTest.java | 73 -
.../java/htsjdk/samtools/sra/SRAReferenceTest.java | 95 -
src/test/java/htsjdk/samtools/sra/SRATest.java | 434 -
.../samtools/util/AbstractLocusInfoTest.java | 79 -
.../util/AbstractLocusIteratorTestTemplate.java | 68 -
.../samtools/util/AbstractRecordAndOffsetTest.java | 63 -
.../samtools/util/AsyncBufferedIteratorTest.java | 115 -
.../java/htsjdk/samtools/util/AsyncWriterTest.java | 77 -
.../java/htsjdk/samtools/util/BinaryCodecTest.java | 287 -
.../util/BlockCompressedFilePointerUtilTest.java | 96 -
.../util/BlockCompressedOutputStreamTest.java | 214 -
.../util/BlockCompressedTerminatorTest.java | 59 -
.../java/htsjdk/samtools/util/CigarUtilTest.java | 143 -
.../samtools/util/CloseableIteratorTest.java | 31 -
.../java/htsjdk/samtools/util/CodeUtilTest.java | 15 -
.../htsjdk/samtools/util/ComparableTupleTest.java | 61 -
.../samtools/util/CoordSpanInputSteamTest.java | 108 -
.../htsjdk/samtools/util/DiskBackedQueueTest.java | 132 -
.../htsjdk/samtools/util/EdgeReadIteratorTest.java | 402 -
.../samtools/util/EdgingRecordAndOffsetTest.java | 94 -
.../java/htsjdk/samtools/util/HistogramTest.java | 366 -
.../htsjdk/samtools/util/IntervalListTest.java | 520 -
.../htsjdk/samtools/util/IntervalTreeMapTest.java | 55 -
.../htsjdk/samtools/util/IntervalTreeTest.java | 187 -
src/test/java/htsjdk/samtools/util/IoUtilTest.java | 190 -
.../java/htsjdk/samtools/util/Iso8601DateTest.java | 57 -
src/test/java/htsjdk/samtools/util/IupacTest.java | 77 -
.../htsjdk/samtools/util/MergingIteratorTest.java | 175 -
.../htsjdk/samtools/util/OverlapDetectorTest.java | 240 -
.../samtools/util/PositionalOutputStreamTest.java | 62 -
.../samtools/util/QualityEncodingDetectorTest.java | 109 -
.../samtools/util/RelativeIso8601DateTest.java | 53 -
.../htsjdk/samtools/util/SamLocusIteratorTest.java | 673 -
.../htsjdk/samtools/util/SequenceUtilTest.java | 453 -
.../samtools/util/SolexaQualityConverterTest.java | 86 -
.../samtools/util/SortingCollectionTest.java | 230 -
.../samtools/util/SortingLongCollectionTest.java | 119 -
.../htsjdk/samtools/util/StringLineReaderTest.java | 119 -
.../java/htsjdk/samtools/util/StringUtilTest.java | 122 -
.../htsjdk/samtools/util/TrimmingUtilTest.java | 70 -
src/test/java/htsjdk/samtools/util/TupleTest.java | 62 -
.../htsjdk/tribble/AbstractFeatureReaderTest.java | 112 -
.../java/htsjdk/tribble/BinaryFeaturesTest.java | 62 -
.../java/htsjdk/tribble/FeatureReaderTest.java | 168 -
src/test/java/htsjdk/tribble/TestUtils.java | 28 -
.../tribble/TribbleIndexFeatureReaderTest.java | 88 -
src/test/java/htsjdk/tribble/TribbleTest.java | 31 -
src/test/java/htsjdk/tribble/bed/BEDCodecTest.java | 240 -
.../java/htsjdk/tribble/gelitext/GeliTextTest.java | 100 -
.../htsjdk/tribble/index/IndexFactoryTest.java | 120 -
src/test/java/htsjdk/tribble/index/IndexTest.java | 97 -
.../tribble/index/interval/IntervalTreeTest.java | 153 -
.../tribble/index/linear/LinearIndexTest.java | 243 -
.../htsjdk/tribble/index/tabix/TabixIndexTest.java | 144 -
.../tribble/readers/AsciiLineReaderTest.java | 52 -
.../readers/LongLineBufferedReaderTest.java | 32 -
.../readers/PositionalBufferedStreamTest.java | 121 -
.../java/htsjdk/tribble/readers/ReaderTest.java | 183 -
.../readers/SynchronousLineReaderUnitTest.java | 39 -
.../htsjdk/tribble/readers/TabixReaderTest.java | 162 -
.../java/htsjdk/tribble/util/ParsingUtilsTest.java | 163 -
.../htsjdk/tribble/util/ftp/FTPClientTest.java | 247 -
.../java/htsjdk/tribble/util/ftp/FTPUtilsTest.java | 31 -
.../util/popgen/HardyWeinbergCalculationTest.java | 41 -
.../htsjdk/variant/PrintVariantsExampleTest.java | 65 -
src/test/java/htsjdk/variant/VariantBaseTest.java | 278 -
.../variant/bcf2/BCF2EncoderDecoderUnitTest.java | 587 -
.../htsjdk/variant/bcf2/BCF2UtilsUnitTest.java | 228 -
.../utils/SAMSequenceDictionaryExtractorTest.java | 65 -
.../variant/variantcontext/AlleleUnitTest.java | 262 -
.../variantcontext/GenotypeBuilderTest.java | 75 -
.../GenotypeLikelihoodsUnitTest.java | 337 -
.../variant/variantcontext/GenotypeUnitTest.java | 107 -
.../variantcontext/GenotypesContextUnitTest.java | 318 -
.../variantcontext/VariantContextBuilderTest.java | 65 -
.../variantcontext/VariantContextTestProvider.java | 1014 -
.../variantcontext/VariantContextUnitTest.java | 1621 -
.../variantcontext/VariantJEXLContextUnitTest.java | 312 -
.../variantcontext/filter/AllFailFilter.java | 41 -
.../variantcontext/filter/AllPassFilter.java | 41 -
.../variantcontext/filter/CompoundFilterTest.java | 78 -
.../FilteringVariantContextIteratorTest.java | 88 -
.../filter/GenotypeQualityFilterTest.java | 105 -
.../filter/HeterozygosityFilterTest.java | 128 -
.../filter/JavascriptVariantFilterTest.java | 72 -
.../filter/PassingVariantFilterTest.java | 46 -
.../variantcontext/filter/SnpFilterTest.java | 54 -
.../writer/TabixOnTheFlyIndexCreationTest.java | 66 -
.../variantcontext/writer/VCFWriterUnitTest.java | 280 -
.../VariantContextWriterBuilderUnitTest.java | 399 -
.../writer/VariantContextWritersUnitTest.java | 163 -
.../htsjdk/variant/vcf/AbstractVCFCodecTest.java | 60 -
.../htsjdk/variant/vcf/IndexFactoryUnitTest.java | 96 -
.../variant/vcf/VCFCompoundHeaderLineUnitTest.java | 46 -
.../java/htsjdk/variant/vcf/VCFEncoderTest.java | 125 -
.../vcf/VCFHeaderLineTranslatorUnitTest.java | 62 -
.../htsjdk/variant/vcf/VCFHeaderLineUnitTest.java | 43 -
.../java/htsjdk/variant/vcf/VCFHeaderUnitTest.java | 563 -
.../vcf/VCFStandardHeaderLinesUnitTest.java | 204 -
.../BAMCigarOverflowTest/CigarOverflowTest.bam | Bin 662 -> 0 bytes
.../samtools/BAMFileIndexTest/index_test.bam | Bin 594149 -> 0 bytes
.../samtools/BAMFileIndexTest/index_test.bam.bai | Bin 1621416 -> 0 bytes
.../BAMFileIndexTest/symlink_with_index.bam | 1 -
.../BAMFileIndexTest/symlink_with_index.bam.bai | 1 -
.../symlink_without_linked_index.bam | 1 -
.../SAMIntegerTagTest/variousAttributes.bam | Bin 258 -> 0 bytes
.../SAMIntegerTagTest/variousAttributes.sam | 4 -
.../SamFileHeaderMergerTest/Chromosome1to10.bam | Bin 3708 -> 0 bytes
.../SamFileHeaderMergerTest/Chromosome5to9.bam | Bin 1991 -> 0 bytes
.../case1/chr11sub_file1.sam | 5 -
.../case1/chr11sub_file2.sam | 11 -
.../case1/expected_output.sam | 13 -
.../case2/chr11sub_file1.sam | 9 -
.../case2/chr11sub_file2.sam | 7 -
.../case2/chr11sub_file3.sam | 9 -
.../case2/chr11sub_file4.sam | 5 -
.../case2/expected_output.sam | 21 -
.../SamFileHeaderMergerTest/unsorted_input/1.sam | 11 -
.../SamFileHeaderMergerTest/unsorted_input/2.sam | 11 -
.../reference_with_lower_and_uppercase.dict | 3 -
.../reference_with_lower_and_uppercase.fasta | 4 -
.../reference_with_lower_and_uppercase.fasta.fai | 2 -
.../SequenceUtil/upper_and_lowercase_read.sam | 10 -
.../samtools/ValidateSamFileTest/bad_index.bai | Bin 1621416 -> 0 bytes
.../samtools/ValidateSamFileTest/bad_index.bam | Bin 594149 -> 0 bytes
.../samtools/ValidateSamFileTest/buggyHeader.sam | 30 -
.../samtools/ValidateSamFileTest/duplicate_rg.sam | 11 -
.../ValidateSamFileTest/duplicated_reads.sam | 17 -
.../duplicated_reads_out_of_order.sam | 17 -
.../samtools/ValidateSamFileTest/hanging_tab.sam | 3 -
.../inappropriate_mate_cigar_string.sam | 13 -
.../invalid_coord_sort_order.sam | 27 -
.../invalid_mate_cigar_string.sam | 19 -
.../ValidateSamFileTest/invalid_platform_unit.sam | 21 -
.../invalid_queryname_sort_order.sam | 27 -
.../ValidateSamFileTest/mate_cigar_and_no_oqs.sam | 4 -
.../ValidateSamFileTest/mate_cigar_and_oqs.sam | 4 -
.../ValidateSamFileTest/missing_fields.sam | 3 -
.../ValidateSamFileTest/missing_platform_unit.sam | 10 -
.../test_samfile_version_1pt5.bam | Bin 259 -> 0 bytes
.../samtools/ValidateSamFileTest/truncated.bam | Bin 336031 -> 0 bytes
.../ValidateSamFileTest/truncated_quals.sam | 4 -
.../samtools/ValidateSamFileTest/truncated_tag.sam | 4 -
.../htsjdk/samtools/ValidateSamFileTest/valid.sam | 21 -
.../ValidateSamFileTest/zero_length_read.sam | 3 -
.../htsjdk/samtools/block_compressed.sam.gz | Bin 257 -> 0 bytes
src/test/resources/htsjdk/samtools/compressed.bam | Bin 307 -> 0 bytes
.../resources/htsjdk/samtools/compressed.sam.gz | Bin 238 -> 0 bytes
.../htsjdk/samtools/coordinate_sorted.sam | 15 -
.../cram/CRAMException/testContigNotInRef.cram | Bin 3433 -> 0 bytes
.../cram/CRAMException/testContigNotInRef.cram.bai | Bin 96 -> 0 bytes
.../cram/CRAMException/testContigNotInRef.dict | 2 -
.../cram/CRAMException/testContigNotInRef.fa | 2 -
.../cram/CRAMException/testContigNotInRef.fa.fai | 1 -
.../cram/CRAMException/testContigNotInRef.fasta | 2 -
...78.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram | Bin 47259 -> 0 bytes
....21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai | Bin 81 -> 0 bytes
...78.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram | Bin 47796 -> 0 bytes
....21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai | Bin 94 -> 0 bytes
....20.21.1-100.100-SeqsPerSlice.500-unMapped.cram | Bin 77664 -> 0 bytes
...1.1-100.100-SeqsPerSlice.500-unMapped.cram.crai | Bin 124 -> 0 bytes
.../htsjdk/samtools/cram/auxf#values.2.1.cram | Bin 11427 -> 0 bytes
.../htsjdk/samtools/cram/auxf#values.3.0.cram | Bin 1586 -> 0 bytes
.../resources/htsjdk/samtools/cram/auxf#values.sam | 5 -
.../htsjdk/samtools/cram/auxf.alteredForMD5test.fa | 2 -
.../samtools/cram/auxf.alteredForMD5test.fa.fai | 1 -
src/test/resources/htsjdk/samtools/cram/auxf.fa | 2 -
.../resources/htsjdk/samtools/cram/auxf.fa.fai | 1 -
.../htsjdk/samtools/cram/c1#bounds.2.1.cram | Bin 10508 -> 0 bytes
.../htsjdk/samtools/cram/c1#bounds.3.0.cram | Bin 642 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#bounds.sam | 4 -
.../htsjdk/samtools/cram/c1#clip.2.1.cram | Bin 10630 -> 0 bytes
.../htsjdk/samtools/cram/c1#clip.3.0.cram | Bin 771 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#clip.sam | 8 -
.../htsjdk/samtools/cram/c1#noseq.2.1.cram | Bin 10652 -> 0 bytes
.../htsjdk/samtools/cram/c1#noseq.3.0.cram | Bin 797 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#noseq.sam | 10 -
.../htsjdk/samtools/cram/c1#pad1.2.1.cram | Bin 10623 -> 0 bytes
.../htsjdk/samtools/cram/c1#pad1.3.0.cram | Bin 761 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#pad1.sam | 10 -
.../htsjdk/samtools/cram/c1#pad2.2.1.cram | Bin 10658 -> 0 bytes
.../htsjdk/samtools/cram/c1#pad2.3.0.cram | Bin 796 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#pad2.sam | 14 -
.../htsjdk/samtools/cram/c1#pad3.2.1.cram | Bin 10697 -> 0 bytes
.../htsjdk/samtools/cram/c1#pad3.3.0.cram | Bin 848 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#pad3.sam | 14 -
.../htsjdk/samtools/cram/c1#unknown.2.1.cram | Bin 10784 -> 0 bytes
.../htsjdk/samtools/cram/c1#unknown.3.0.cram | Bin 949 -> 0 bytes
.../resources/htsjdk/samtools/cram/c1#unknown.sam | 9 -
src/test/resources/htsjdk/samtools/cram/c1.fa | 2 -
src/test/resources/htsjdk/samtools/cram/c1.fa.fai | 1 -
.../resources/htsjdk/samtools/cram/c2#pad.2.1.cram | Bin 11077 -> 0 bytes
.../resources/htsjdk/samtools/cram/c2#pad.3.0.cram | Bin 1070 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#1.2.1.cram | Bin 10746 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#1.3.0.cram | Bin 895 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/ce#1.sam | 2 -
.../resources/htsjdk/samtools/cram/ce#2.2.1.cram | Bin 10839 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#2.3.0.cram | Bin 988 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/ce#2.sam | 3 -
.../resources/htsjdk/samtools/cram/ce#5.2.1.cram | Bin 11221 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#5.3.0.cram | Bin 1130 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/ce#5.sam | 11 -
.../resources/htsjdk/samtools/cram/ce#5b.2.1.cram | Bin 12668 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#5b.3.0.cram | Bin 2669 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/ce#5b.sam | 12 -
.../htsjdk/samtools/cram/ce#large_seq.2.1.cram | Bin 101355 -> 0 bytes
.../htsjdk/samtools/cram/ce#large_seq.3.0.cram | Bin 84800 -> 0 bytes
.../htsjdk/samtools/cram/ce#large_seq.sam | 3 -
.../htsjdk/samtools/cram/ce#supp.2.1.cram | Bin 10649 -> 0 bytes
.../htsjdk/samtools/cram/ce#supp.3.0.cram | Bin 809 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#supp.sam | 6 -
.../htsjdk/samtools/cram/ce#tag_depadded.2.1.cram | Bin 11114 -> 0 bytes
.../htsjdk/samtools/cram/ce#tag_depadded.3.0.cram | Bin 1258 -> 0 bytes
.../htsjdk/samtools/cram/ce#tag_depadded.sam | 11 -
.../htsjdk/samtools/cram/ce#tag_padded.2.1.cram | Bin 10922 -> 0 bytes
.../htsjdk/samtools/cram/ce#tag_padded.3.0.cram | Bin 1082 -> 0 bytes
.../htsjdk/samtools/cram/ce#tag_padded.sam | 11 -
.../htsjdk/samtools/cram/ce#unmap.2.1.cram | Bin 10503 -> 0 bytes
.../htsjdk/samtools/cram/ce#unmap.3.0.cram | Bin 601 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#unmap.sam | 6 -
.../htsjdk/samtools/cram/ce#unmap1.2.1.cram | Bin 11730 -> 0 bytes
.../htsjdk/samtools/cram/ce#unmap1.3.0.cram | Bin 1505 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#unmap1.sam | 20 -
.../htsjdk/samtools/cram/ce#unmap2.2.1.cram | Bin 12587 -> 0 bytes
.../htsjdk/samtools/cram/ce#unmap2.3.0.cram | Bin 2404 -> 0 bytes
.../resources/htsjdk/samtools/cram/ce#unmap2.sam | 29 -
src/test/resources/htsjdk/samtools/cram/ce.fa | 20803 -------------
src/test/resources/htsjdk/samtools/cram/ce.fa.fai | 7 -
.../htsjdk/samtools/cram/cramQueryTest.cram | Bin 2863 -> 0 bytes
.../htsjdk/samtools/cram/cramQueryTest.cram.bai | Bin 336 -> 0 bytes
.../htsjdk/samtools/cram/cramQueryTestEmpty.cram | Bin 2183 -> 0 bytes
.../samtools/cram/cramQueryTestEmpty.cram.bai | Bin 48 -> 0 bytes
.../htsjdk/samtools/cram/cramQueryWithBAI.cram | Bin 8947 -> 0 bytes
.../htsjdk/samtools/cram/cramQueryWithBAI.cram.bai | Bin 152 -> 0 bytes
.../htsjdk/samtools/cram/cramQueryWithCRAI.cram | Bin 4131 -> 0 bytes
.../samtools/cram/cramQueryWithCRAI.cram.crai | Bin 59 -> 0 bytes
.../resources/htsjdk/samtools/cram/fieldarith.sam | 15 -
.../samtools/cram/human_g1k_v37.20.21.1-100.dict | 3 -
.../samtools/cram/human_g1k_v37.20.21.1-100.fasta | 11 -
.../cram/human_g1k_v37.20.21.1-100.fasta.fai | 2 -
.../cram/human_g1k_v37.20.21.10M-10M200k.dict | 3 -
.../cram/human_g1k_v37.20.21.10M-10M200k.fasta | 5002 ---
.../cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai | 2 -
.../htsjdk/samtools/cram/io/bzip2-test.bz2 | Bin 56 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/test.cram | Bin 3433 -> 0 bytes
.../resources/htsjdk/samtools/cram/test.cram.bai | Bin 96 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/test.dict | 2 -
src/test/resources/htsjdk/samtools/cram/test.fa | 2 -
.../resources/htsjdk/samtools/cram/test.fa.fai | 1 -
src/test/resources/htsjdk/samtools/cram/test2.cram | Bin 3433 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/test2.dict | 2 -
src/test/resources/htsjdk/samtools/cram/test2.fa | 2 -
.../resources/htsjdk/samtools/cram/test2.fa.fai | 1 -
.../htsjdk/samtools/cram/xx#blank.2.1.cram | Bin 10080 -> 0 bytes
.../htsjdk/samtools/cram/xx#blank.3.0.cram | Bin 140 -> 0 bytes
.../htsjdk/samtools/cram/xx#large_aux.2.1.cram | Bin 35824 -> 0 bytes
.../htsjdk/samtools/cram/xx#large_aux.3.0.cram | Bin 20418 -> 0 bytes
.../htsjdk/samtools/cram/xx#large_aux.sam | 4 -
.../htsjdk/samtools/cram/xx#large_aux2.2.1.cram | Bin 10868 -> 0 bytes
.../htsjdk/samtools/cram/xx#large_aux2.3.0.cram | Bin 1008 -> 0 bytes
.../htsjdk/samtools/cram/xx#large_aux2.sam | 11 -
.../htsjdk/samtools/cram/xx#minimal.2.1.cram | Bin 10995 -> 0 bytes
.../htsjdk/samtools/cram/xx#minimal.3.0.cram | Bin 1096 -> 0 bytes
.../resources/htsjdk/samtools/cram/xx#minimal.sam | 10 -
.../htsjdk/samtools/cram/xx#pair.2.1.cram | Bin 10454 -> 0 bytes
.../htsjdk/samtools/cram/xx#pair.3.0.cram | Bin 590 -> 0 bytes
.../resources/htsjdk/samtools/cram/xx#pair.sam | 7 -
.../resources/htsjdk/samtools/cram/xx#rg.2.1.cram | Bin 10643 -> 0 bytes
.../resources/htsjdk/samtools/cram/xx#rg.3.0.cram | Bin 794 -> 0 bytes
src/test/resources/htsjdk/samtools/cram/xx#rg.sam | 13 -
.../htsjdk/samtools/cram/xx#tlen.2.1.cram | Bin 11312 -> 0 bytes
.../htsjdk/samtools/cram/xx#tlen.3.0.cram | Bin 1296 -> 0 bytes
.../htsjdk/samtools/cram/xx#tlen2.2.1.cram | Bin 11380 -> 0 bytes
.../htsjdk/samtools/cram/xx#tlen2.3.0.cram | Bin 1359 -> 0 bytes
.../htsjdk/samtools/cram/xx#triplet.2.1.cram | Bin 10853 -> 0 bytes
.../htsjdk/samtools/cram/xx#triplet.3.0.cram | Bin 950 -> 0 bytes
.../resources/htsjdk/samtools/cram/xx#triplet.sam | 7 -
.../htsjdk/samtools/cram/xx#unsorted.2.1.cram | Bin 11131 -> 0 bytes
.../htsjdk/samtools/cram/xx#unsorted.3.0.cram | Bin 1262 -> 0 bytes
.../resources/htsjdk/samtools/cram/xx#unsorted.sam | 8 -
src/test/resources/htsjdk/samtools/cram/xx.fa | 5 -
src/test/resources/htsjdk/samtools/cram/xx.fa.fai | 2 -
.../htsjdk/samtools/cram_query_sorted.cram | Bin 13266 -> 0 bytes
.../htsjdk/samtools/cram_query_sorted.fasta | 40 -
.../htsjdk/samtools/cram_query_sorted.fasta.fai | 8 -
src/test/resources/htsjdk/samtools/cram_tlen.fasta | 41 -
.../resources/htsjdk/samtools/cram_tlen.fasta.fai | 8 -
.../htsjdk/samtools/cram_tlen_reads.sorted.sam | 19 -
.../htsjdk/samtools/cram_with_bai_index.cram | Bin 4213 -> 0 bytes
.../htsjdk/samtools/cram_with_bai_index.cram.bai | Bin 336 -> 0 bytes
.../htsjdk/samtools/cram_with_crai_index.cram | Bin 4213 -> 0 bytes
.../htsjdk/samtools/cram_with_crai_index.cram.crai | Bin 77 -> 0 bytes
src/test/resources/htsjdk/samtools/empty.bai | Bin 8 -> 0 bytes
src/test/resources/htsjdk/samtools/empty.bam | Bin 90 -> 0 bytes
.../htsjdk/samtools/empty_no_empty_gzip_block.bai | Bin 8 -> 0 bytes
.../htsjdk/samtools/empty_no_empty_gzip_block.bam | Bin 62 -> 0 bytes
src/test/resources/htsjdk/samtools/hg19mini.dict | 5 -
src/test/resources/htsjdk/samtools/hg19mini.fasta | 804 -
.../resources/htsjdk/samtools/hg19mini.fasta.fai | 4 -
.../intervallist/IntervalListFromVCFTest.vcf | 53 -
.../IntervalListFromVCFTestComp.interval_list | 7 -
...ntervalListFromVCFTestCompInverse.interval_list | 10 -
...lListFromVCFTestCompInverseManual.interval_list | 10 -
.../intervallist/IntervalListFromVCFTestManual.vcf | 57 -
...IntervalListFromVCFTestManualComp.interval_list | 12 -
.../IntervalListchr123_empty.interval_list | 4 -
src/test/resources/htsjdk/samtools/inttest.bam | Bin 329 -> 0 bytes
src/test/resources/htsjdk/samtools/inttest.sam | 26 -
.../resources/htsjdk/samtools/io/5newline5.txt | 2 -
.../resources/htsjdk/samtools/io/slurptest.txt | 3 -
src/test/resources/htsjdk/samtools/issue76.bam | Bin 5121 -> 0 bytes
src/test/resources/htsjdk/samtools/issue76.bam.bai | Bin 776 -> 0 bytes
.../htsjdk/samtools/liftover/hg18ToHg19.over.chain | 30850 -------------------
.../htsjdk/samtools/metrics/metricsOne.metrics | 13 -
.../htsjdk/samtools/metrics/metricsOneCopy.metrics | 13 -
.../metrics/metricsOneModifiedHistogram.metrics | 14 -
.../metrics/metricsOneModifiedMetrics.metrics | 13 -
.../resources/htsjdk/samtools/queryname_sorted.sam | 15 -
.../resources/htsjdk/samtools/readWithBadRname.sam | 6 -
.../reference/Homo_sapiens_assembly18.fasta.fai | 45 -
.../reference/Homo_sapiens_assembly18.trimmed.dict | 3 -
.../Homo_sapiens_assembly18.trimmed.fasta | 16946 ----------
.../Homo_sapiens_assembly18.trimmed.fasta.fai | 2 -
.../Homo_sapiens_assembly18.trimmed.nodict.fasta | 16946 ----------
...omo_sapiens_assembly18.trimmed.nodict.fasta.fai | 2 -
.../Homo_sapiens_assembly18.trimmed.noindex.fasta | 16946 ----------
.../reference_with_trailing_whitespace.dict | 3 -
.../reference_with_trailing_whitespace.fasta | 4 -
.../htsjdk/samtools/reference/testing.fai | 7 -
src/test/resources/htsjdk/samtools/roundtrip.sam | 16 -
src/test/resources/htsjdk/samtools/samFilter01.js | 2 -
src/test/resources/htsjdk/samtools/samFilter02.js | 9 -
.../samtools/seekablestream/megabyteZeros.dat | Bin 1000000 -> 0 bytes
.../htsjdk/samtools/seekablestream/seekTest.txt | 5 -
.../htsjdk/samtools/sequenceWithSpace.bam | Bin 391 -> 0 bytes
.../htsjdk/samtools/sequenceWithSpace.sam | 6 -
.../htsjdk/samtools/serialization_test.bam | Bin 339 -> 0 bytes
.../htsjdk/samtools/serialization_test.bam.bai | Bin 120 -> 0 bytes
.../htsjdk/samtools/serialization_test.sam | 8 -
.../resources/htsjdk/samtools/sra/test_archive.sra | Bin 1099831 -> 0 bytes
.../resources/htsjdk/samtools/uncompressed.sam | 15 -
src/test/resources/htsjdk/samtools/unsorted.sam | 15 -
.../5k-30BB2AAXX.3.aligned.sam.fastq | 19808 ------------
.../illumina-as-standard.bam | Bin 652 -> 0 bytes
.../QualityEncodingDetectorTest/s_1_sequence.txt | 40 -
.../solexa-as-standard.bam | Bin 944 -> 0 bytes
.../solexa_full_range_as_solexa.fastq | 8 -
.../util/QualityEncodingDetectorTest/unmapped.sam | 12 -
.../htsjdk/samtools/util/defective_bgzf.bam | Bin 359 -> 0 bytes
.../htsjdk/samtools/util/no_bgzf_terminator.bam | Bin 354 -> 0 bytes
.../htsjdk/samtools/util/whitespace_text_file.txt | 6 -
src/test/resources/htsjdk/tribble/Tb.vcf.idx | Bin 998966 -> 0 bytes
src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp | 43 -
....deletions.10kbp.het.gq99.hand_curated.hg19.bed | 35 -
...ions.10kbp.het.gq99.hand_curated.hg19_fixed.bed | 36 -
.../htsjdk/tribble/bed/Unigene.sample.bed | 72 -
.../resources/htsjdk/tribble/bed/disconcontigs.bed | 5 -
src/test/resources/htsjdk/tribble/bed/unsorted.bed | 5 -
.../resources/htsjdk/tribble/complexExample.vcf | 23 -
src/test/resources/htsjdk/tribble/fakeBed.bed | 51 -
src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz | Bin 351859 -> 0 bytes
.../resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi | Bin 170 -> 0 bytes
src/test/resources/htsjdk/tribble/gwas/smallp.gwas | 20 -
.../htsjdk/tribble/index/chrY_Y4_small.bed | 5000 ---
src/test/resources/htsjdk/tribble/large.txt | 165 -
src/test/resources/htsjdk/tribble/sites.bed | 1000 -
src/test/resources/htsjdk/tribble/soapsnp.txt | 24 -
.../resources/htsjdk/tribble/split/test.bin.part1 | Bin 16000 -> 0 bytes
.../resources/htsjdk/tribble/split/test.bin.part2 | Bin 16000 -> 0 bytes
.../resources/htsjdk/tribble/split/test.bin.part3 | Bin 16000 -> 0 bytes
.../resources/htsjdk/tribble/split/test.bin.split | 3 -
.../tabix/YRI.trio.2010_07.indel.sites.vcf.gz | Bin 250626 -> 0 bytes
.../tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi | Bin 32877 -> 0 bytes
.../htsjdk/tribble/tabix/bigger.vcf.gz.tbi | Bin 595996 -> 0 bytes
.../htsjdk/tribble/tabix/testTabixIndex.vcf | 51 -
.../htsjdk/tribble/tabix/testTabixIndex.vcf.gz | Bin 372 -> 0 bytes
.../resources/htsjdk/tribble/tabix/trioDup.vcf | 75 -
.../resources/htsjdk/tribble/tabix/trioDup.vcf.gz | Bin 1353 -> 0 bytes
.../htsjdk/tribble/tabix/trioDup.vcf.gz.tbi | Bin 324 -> 0 bytes
.../resources/htsjdk/tribble/test with spaces.vcf | 24 -
src/test/resources/htsjdk/tribble/test.bed | 9 -
src/test/resources/htsjdk/tribble/test.gff | 9 -
.../resources/htsjdk/tribble/test.tabix.bed.gz | Bin 116 -> 0 bytes
.../resources/htsjdk/tribble/test.tabix.bed.gz.tbi | Bin 121 -> 0 bytes
src/test/resources/htsjdk/tribble/test.vcf | 24 -
src/test/resources/htsjdk/tribble/test.vcf.bgz | Bin 849 -> 0 bytes
src/test/resources/htsjdk/tribble/test.vcf.gz | Bin 822 -> 0 bytes
src/test/resources/htsjdk/tribble/testGeliText.txt | 50 -
.../resources/htsjdk/tribble/testIntervalList.list | 6 -
src/test/resources/htsjdk/tribble/trio.vcf | 100 -
src/test/resources/htsjdk/tribble/trio.vcf.idx | Bin 495 -> 0 bytes
src/test/resources/htsjdk/tribble/trioDup.vcf | 75 -
src/test/resources/htsjdk/tribble/vcfexample.vcf | 12 -
.../resources/htsjdk/tribble/vcfexample.vcf.gz | Bin 471 -> 0 bytes
.../resources/htsjdk/tribble/vcfexample.vcf.gz.tbi | Bin 114 -> 0 bytes
.../htsjdk/tribble/vcfexample.vcf.truncated.gz | Bin 470 -> 0 bytes
.../htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz | Bin 460 -> 0 bytes
src/test/resources/htsjdk/variant/HiSeq.10000.vcf | 10001 ------
...baseline.20111114.both.exome.genotypes.1000.vcf | 249 -
.../resources/htsjdk/variant/VCF4HeaderTest.vcf | 42 -
.../resources/htsjdk/variant/VQSR.mixedTest.recal | 32 -
src/test/resources/htsjdk/variant/breakpoint.vcf | 6 -
.../htsjdk/variant/dbsnp_135.b37.1000.vcf | 249 -
.../htsjdk/variant/diagnosis_targets_testfile.vcf | 117 -
src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi | Bin 130 -> 0 bytes
src/test/resources/htsjdk/variant/ex2.vcf | 23 -
.../htsjdk/variant/serialization_test.bcf | Bin 7490 -> 0 bytes
.../htsjdk/variant/serialization_test.bcf.idx | Bin 1146 -> 0 bytes
.../htsjdk/variant/structuralvariants.vcf | 22 -
.../Homo_sapiens_assembly18.trimmed.dict | 3 -
.../Homo_sapiens_assembly18.trimmed.fasta | 16946 ----------
.../Homo_sapiens_assembly18.trimmed.fasta.fai | 2 -
.../ScreenSamReads.100.input.sam | 21 -
.../empty.interval_list | 4 -
.../SamSequenceDictionaryExtractor/test1.dict | 3 -
.../utils/SamSequenceDictionaryExtractor/test1.vcf | 53 -
.../SamSequenceDictionaryExtractor/test1.vcf.idx | Bin 2283 -> 0 bytes
.../test1_comp.interval_list | 8 -
.../test2_comp.interval_list | 7 -
.../test3_comp.interval_list | 24 -
.../test4_comp.interval_list | 25 -
.../resources/htsjdk/variant/variantFilter01.js | 2 -
.../resources/htsjdk/variant/variantFilter02.js | 20 -
.../Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl | Bin 2004 -> 0 bytes
.../Intensities/BaseCalls/L001/s_1_1101.filter | Bin 2012 -> 0 bytes
.../125T125T/Data/Intensities/L001/s_1_1101.clocs | Bin 4359 -> 0 bytes
.../Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl | Bin 64 -> 0 bytes
.../Intensities/BaseCalls/L001/s_1_1101.filter | Bin 72 -> 0 bytes
.../sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam | 10 -
.../sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam | 6 -
.../sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam | 10 -
.../sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam | 10 -
.../sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam | 12 -
.../sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam | 16 -
.../sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam | 12 -
.../sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam | 12 -
.../sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam | 14 -
.../sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam | 16 -
.../sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam | 12 -
.../sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam | 12 -
.../net/sf/picard/illumina/25T8B25T/sams/N.sam | 34 -
.../sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam | 6 -
.../sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam | 8 -
src/test/resources/testng.xml | 20 -
test/Makefile | 66 +
test/align-cache/CSRA_file | Bin 0 -> 154937 bytes
test/align-cache/Makefile | 60 +
test/align-cache/valgrind.suppress | 6 +
test/align-info/Makefile | 48 +
test/copycat/Makefile | 60 +
test/copycat/input/1.xml | 5 +
test/fastdump/Makefile | 53 +
test/fastdump/copy-default-kfg.sh | 12 +
test/fastdump/test_no_1.sh | 49 +
test/fastdump/test_no_2.sh | 49 +
test/fastq-loader/.gitignore | 1 +
test/fastq-loader/Makefile | 217 +
test/fastq-loader/expected/1.1.stdout | 30 +
test/fastq-loader/expected/1.2.stdout | 30 +
test/fastq-loader/expected/1.3.stderr | 4 +
test/fastq-loader/expected/1.3.stdout | 27 +
test/fastq-loader/expected/1.4.stdout | 90 +
test/fastq-loader/expected/10.0.stdout | 30 +
test/fastq-loader/expected/11.0.stdout | 30 +
test/fastq-loader/expected/11.1.stdout | 30 +
test/fastq-loader/expected/12.0.stdout | 60 +
test/fastq-loader/expected/12.1.stdout | 60 +
test/fastq-loader/expected/12.2.stdout | 30 +
test/fastq-loader/expected/13.0.stdout | 90 +
test/fastq-loader/expected/13.1.stdout | 90 +
test/fastq-loader/expected/14.0.stdout | 30 +
test/fastq-loader/expected/15.0.stderr | 1 +
test/fastq-loader/expected/15.0.stdout | 30 +
test/fastq-loader/expected/2.1.1.stdout | 44 +
test/fastq-loader/expected/2.1.stdout | 60 +
test/fastq-loader/expected/2.5.stdout | 60 +
test/fastq-loader/expected/2.6.stdout | 30 +
test/fastq-loader/expected/2.7.stdout | 30 +
test/fastq-loader/expected/2.8.1.stdout | 60 +
test/fastq-loader/expected/2.8.stdout | 60 +
test/fastq-loader/expected/2.9.1.stderr | 5 +
test/fastq-loader/expected/2.9.stderr | 5 +
test/fastq-loader/expected/3.1.stdout | 120 +
test/fastq-loader/expected/4.2.stdout | 30 +
test/fastq-loader/expected/4.3.1.stderr | 14 +
test/fastq-loader/expected/4.4.stdout | 66 +
test/fastq-loader/expected/4.5.1.stderr | 8 +
test/fastq-loader/expected/4.5.stderr | 9 +
test/fastq-loader/expected/4.6.1.stderr | 3 +
test/fastq-loader/expected/4.6.stdout | 30 +
test/fastq-loader/expected/4.7.stderr | 2 +
test/fastq-loader/expected/5.0.stdout | 30 +
test/fastq-loader/expected/6.0.stdout | 390 +
test/fastq-loader/expected/7.1.stdout | 60 +
test/fastq-loader/expected/7.2.stdout | 60 +
test/fastq-loader/expected/7.3.stdout | 60 +
test/fastq-loader/expected/8.0.stdout | 30 +
test/fastq-loader/expected/8.1.stderr | 5 +
test/fastq-loader/expected/9.0.stdout | 60 +
test/fastq-loader/input/1.1.fastq | 5 +
test/fastq-loader/input/1.2.fastq | 5 +
test/fastq-loader/input/1.3.fastq | 5 +
test/fastq-loader/input/1.4.fastq | 24 +
test/fastq-loader/input/10.0.fastq | 4 +
test/fastq-loader/input/11.0.1.fasta | 2 +
test/fastq-loader/input/11.0.2.fasta | 2 +
test/fastq-loader/input/11.1.1.fastq | 4 +
test/fastq-loader/input/11.1.2.fastq | 4 +
test/fastq-loader/input/12.0.fastq | 8 +
test/fastq-loader/input/12.1.fastq | 8 +
test/fastq-loader/input/12.2.fastq | 4 +
test/fastq-loader/input/13.0.fastq | 12 +
test/fastq-loader/input/13.1.fastq | 12 +
test/fastq-loader/input/14.0.fasta | 2 +
test/fastq-loader/input/15.0.fastq | 4 +
test/fastq-loader/input/2.1.1.fastq | 5 +
test/fastq-loader/input/2.1.fastq | 4 +
test/fastq-loader/input/2.2.fastq | 4 +
test/fastq-loader/input/2.3.fastq | 8 +
test/fastq-loader/input/2.4.fastq | 8 +
test/fastq-loader/input/2.5.fastq | 9 +
test/fastq-loader/input/2.6.fastq | 9 +
test/fastq-loader/input/2.7.fastq | 8 +
test/fastq-loader/input/2.8.1.fastq | 4 +
test/fastq-loader/input/2.8.fastq | 4 +
test/fastq-loader/input/2.9.1.fastq | 4 +
test/fastq-loader/input/2.9.fastq | 4 +
test/fastq-loader/input/3.1a.fastq | 8 +
test/fastq-loader/input/3.1b.fastq | 9 +
test/fastq-loader/input/3.2a.fastq | 8 +
test/fastq-loader/input/3.2b.fastq | 8 +
test/fastq-loader/input/3.3a.fastq | 8 +
test/fastq-loader/input/3.3b.fastq | 8 +
test/fastq-loader/input/4.4.fastq | 13 +
test/fastq-loader/input/4.5.1.fastq | 10 +
test/fastq-loader/input/4.5.fastq | 10 +
test/fastq-loader/input/4.fastq | 5 +
test/fastq-loader/input/5.0.fastq.gz | Bin 0 -> 139 bytes
test/fastq-loader/input/6.0.fastq | 52 +
test/fastq-loader/input/7.1.fastq | 9 +
test/fastq-loader/input/7.2.fastq | 8 +
test/fastq-loader/input/7.3.fastq | 8 +
test/fastq-loader/input/8.0.fastq | 9 +
test/fastq-loader/input/8.1.fastq | 17 +
test/fastq-loader/input/9.0.fastq | 16 +
test/fastq-loader/runtestcase.sh | 106 +
test/fastq-loader/test-fastq-loader.cpp | 229 +
test/fastq-loader/wb-test-fastq.cpp | 1384 +
test/fuse/Makefile | 79 +
test/fuse/cfg/standard.cfg | 26 +
test/fuse/kart-util.sh | 166 +
test/fuse/remote-fuser-test.c | 794 +
test/fuse/remote-fuser-test.vers | 1 +
test/fuse/remote-fuser-test.vers.h | 1 +
test/fuse/remote_fuser_clean.sh | 404 +
test/fuse/remote_fuser_common.sh | 282 +
test/fuse/remote_fuser_test.sh | 516 +
test/fuse/utils.c | 867 +
test/fuse/utils.h | 120 +
test/general-loader/.gitignore | 2 +
test/general-loader/Makefile | 187 +
test/general-loader/expected/1.stdout | 75 +
test/general-loader/expected/1override.stdout | 75 +
test/general-loader/expected/1packed.stdout | 75 +
test/general-loader/expected/2.stderr | 2 +
test/general-loader/expected/2packed.stderr | 2 +
test/general-loader/expected/3.stdout | 16 +
test/general-loader/expected/3packed.stdout | 16 +
test/general-loader/expected/4.stdout | 160 +
test/general-loader/expected/4packed.stdout | 160 +
test/general-loader/expected/5packed.stdout | 16 +
test/general-loader/expected/6.stdout | 1 +
test/general-loader/expected/6packed.stdout | 1 +
test/general-loader/input/column01 | 2 +
test/general-loader/input/column02 | 2 +
test/general-loader/makeinputs.cpp | 226 +
test/general-loader/runtestcase.sh | 108 +
test/general-loader/schema/.gitignore | 4 +
test/general-loader/test-general-loader.cpp | 1683 +
test/general-loader/test-general-writer.cpp | 341 +
test/general-loader/test-gw-dumper.cpp | 80 +
test/general-loader/testsource.cpp | 758 +
test/general-loader/testsource.hpp | 177 +
test/kar/Makefile | 56 +
test/kar/acc.txt | 756 +
test/kar/expected/1.0.stdout | 35 +
.../ftp/.gitignore => test/kar/input/1.0/1.md5 | 0
.../.gitignore => test/kar/input/1.0/col/sub1/idx | 0
.../.gitignore => test/kar/input/1.0/col/sub1/idx0 | 0
.../.gitignore => test/kar/input/1.0/col/sub1/idx1 | 0
.../kar/input/1.0/col/sub1/idx2 | 0
.../empty.txt => test/kar/input/1.0/col/sub1/idx3 | 0
.../tmp/.gitignore => test/kar/input/1.0/idx/4a | 0
.../tmp/.gitignore => test/kar/input/1.0/idx/4b | 0
.../.gitignore => test/kar/input/1.0/idx/sub/4c | 0
.../.gitignore => test/kar/input/1.0/idx/sub/4d | 0
.../ftp/.gitignore => test/kar/input/1.0/md/cur | 0
.../util/ftp/.gitignore => test/kar/input/1.0/md5 | 0
.../kar/input/1.0/sub1/col/sub1/idx | 0
.../kar/input/1.0/sub1/col/sub1/idx0 | 0
.../kar/input/1.0/sub1/col/sub1/idx1 | 0
.../kar/input/1.0/sub1/col/sub1/idx2 | 0
.../kar/input/1.0/sub1/col/sub1/idx3 | 0
.../.gitignore => test/kar/input/1.0/sub1/md/cur | 0
.../kar/input/1.0/sub1/sub2/col/sub1/idx | 0
.../kar/input/1.0/sub1/sub2/col/sub1/idx0 | 0
.../kar/input/1.0/sub1/sub2/col/sub1/idx1 | 0
.../kar/input/1.0/sub1/sub2/col/sub1/idx2 | 0
.../kar/input/1.0/sub1/sub2/col/sub1/idx3 | 0
test/kar/kar-srr-test.sh | 81 +
test/kar/kar-test.sh | 400 +
test/kar/old-kar | 1 +
test/kar/source/alias_subdir/d1/subdir_f_alias | 1 +
test/kar/source/alias_subdir/f1 | 1 +
test/kar/source/d1/d1f1 | 1 +
test/kar/source/d1/d1f2 | 1 +
test/kar/source/d1/d1f3 | 1 +
test/kar/source/d2/d1/d2f1 | 1 +
test/kar/source/d2/d1/d2f2 | 1 +
test/kar/source/d2/d1/d2f3 | 1 +
test/kar/source/d3/d2/d1/d3f1 | 1 +
test/kar/source/d3/d2/d1/d3f2 | 1 +
test/kar/source/d3/d2/d1/d3f3 | 1 +
test/kar/source/f1 | 1 +
test/kar/source/f2 | 1 +
test/kar/source/f3 | 1 +
test/kar/source/local_d_alias | 1 +
test/kar/source/local_f_alias | 1 +
test/kar/source/local_f_subdir_alias | 1 +
test/kget/.gitignore | 3 +
test/kget/Makefile | 66 +
test/kget/resolver.kfg | 1 +
test/kget/test_kget.py | 175 +
test/network-test/Makefile | 99 +
test/network-test/analyze_strace_log.py | 128 +
test/network-test/network-test.c | 105 +
test/network-test/network-test.vers | 1 +
test/network-test/network-testing.c | 436 +
test/network-test/network-testing.h | 42 +
test/ngs-pileup/Makefile | 137 +
test/ngs-pileup/runtestcase.sh | 90 +
test/ngs-pileup/test-ngs-pileup.cpp | 177 +
test/pileup-stats/Makefile | 66 +
test/pileup-stats/test-ignore-args.sh | 55 +
test/pileup-stats/valgrind.suppress | 6 +
test/qual-recalib-stat/Makefile | 49 +
test/samline/Makefile | 115 +
test/samline/alig-gen.c | 656 +
test/samline/bx_tag_test.py | 27 +
test/samline/ca_test.py | 80 +
test/samline/cigar.c | 446 +
test/samline/cigar.h | 59 +
test/samline/example.sh | 61 +
test/samline/refbases.c | 184 +
test/samline/refbases.h | 43 +
test/samline/reject_multi_refnames.sh | 62 +
test/samline/sam.py | 339 +
test/samline/samline.vers | 1 +
test/samline/sampart.c | 304 +
test/samline/sampart.vers | 1 +
test/samline/sec_align_problem.sh | 76 +
test/sra-pileup/Makefile | 49 +
test/srapath/Makefile | 49 +
test/tarballs/build.xml | 27 +
test/tarballs/test-tarballs.bat | 42 +
test/tarballs/test-tarballs.sh | 97 +
test/vcf-loader/Makefile | 76 +
test/vcf-loader/only-remote-repository.kfg | 2 +
test/vcf-loader/test-vcf-loader.cpp | 862 +
test/vdb-copy/Makefile | 49 +
test/vdb-dump/Makefile | 104 +
test/vdb-dump/expected/1.0.stdout | 1 +
test/vdb-dump/expected/1.1.stdout | 1 +
test/vdb-dump/expected/2.0.stdout | 15 +
test/vdb-dump/expected/2.1.stdout | 4 +
test/vdb-dump/expected/2.2.stdout | 4 +
test/vdb-dump/makedb.cpp | 229 +
test/vdb-validate/Makefile | 66 +
test/vdb-validate/db/blob-row-gap.kar | Bin 0 -> 3362642 bytes
test/vdb-validate/db/sdc_len_mismatch.csra | Bin 0 -> 181017 bytes
test/vdb-validate/db/sdc_pa_longer.csra | Bin 0 -> 183853 bytes
.../db/sdc_seq_cmp_read_len_corrupt.csra | Bin 0 -> 224783 bytes
.../db/sdc_seq_cmp_read_len_fixed.csra | Bin 0 -> 223591 bytes
test/vdb-validate/db/sdc_tmp_mismatch.csra | Bin 0 -> 170925 bytes
test/vdb-validate/expected/ROW_GAP | 42 +
test/vdb-validate/expected/no_sdc_checks | 23 +
test/vdb-validate/expected/sdc_len_mismatch_1 | 24 +
test/vdb-validate/expected/sdc_len_mismatch_2 | 24 +
test/vdb-validate/expected/sdc_pa_longer_1 | 26 +
test/vdb-validate/expected/sdc_pa_longer_2 | 26 +
test/vdb-validate/expected/sdc_pa_longer_3 | 26 +
.../expected/sdc_seq_cmp_read_len_corrupt | 44 +
.../expected/sdc_seq_cmp_read_len_fixed | 43 +
test/vdb-validate/expected/sdc_tmp_mismatch | 16 +
test/vdb-validate/runtestcase.sh | 61 +
test/vschema/Makefile | 120 +
test/vschema/bio-end/bio-end-excl.vschema | 44 +
test/vschema/bio-end/bio-end-incl.vschema | 44 +
test/vschema/bio-end/expected/excl-1.stdout | 5 +
test/vschema/bio-end/expected/excl-2.stdout | 5 +
test/vschema/bio-end/expected/excl-3.stdout | 5 +
test/vschema/bio-end/expected/excl-4.stdout | 5 +
test/vschema/bio-end/expected/incl-1.stdout | 5 +
test/vschema/bio-end/makeinputs.cpp | 129 +
test/vschema/idx-text/checklookup.cpp | 335 +
test/vschema/idx-text/expected/ci-1.stdout | 21 +
test/vschema/idx-text/expected/ci-2.stdout | 18 +
test/vschema/idx-text/expected/ci-3.stdout | 12 +
test/vschema/idx-text/expected/ci-4.stdout | 12 +
test/vschema/idx-text/expected/ci-5.stdout | 15 +
test/vschema/idx-text/expected/cs-1.stdout | 18 +
test/vschema/idx-text/expected/cs-2.stdout | 18 +
test/vschema/idx-text/expected/cs-3.stdout | 18 +
test/vschema/idx-text/idx-text.vschema | 105 +
test/vschema/idx-text/makeinputs.cpp | 182 +
test/vschema/runtestcase.sh | 126 +
tools/.gitignore | 6 +
tools/Makefile | 91 +
tools/align-cache/Makefile | 78 +
tools/align-cache/align-cache.cpp | 552 +
tools/align-cache/helper.cpp | 923 +
tools/align-cache/helper.h | 390 +
tools/align-info/Makefile | 76 +
tools/align-info/align-info.c | 571 +
tools/bam-loader/Globals.h | 93 +
tools/bam-loader/KFileHelper.c | 142 +
tools/bam-loader/KFileHelper.h | 48 +
tools/bam-loader/KVPFile.c | 355 +
tools/bam-loader/KVPFile.h | 164 +
tools/bam-loader/Makefile | 111 +
tools/bam-loader/alignment-writer.c | 267 +
tools/bam-loader/alignment-writer.h | 101 +
tools/bam-loader/analysis.c | 157 +
tools/bam-loader/analysis.h | 49 +
tools/bam-loader/bam-alignment.h | 74 +
tools/bam-loader/bam-loader.c | 1270 +
tools/bam-loader/bam-priv.h | 196 +
tools/bam-loader/bam-reader.c | 1104 +
tools/bam-loader/bam-reader.h | 98 +
tools/bam-loader/bam.c | 4113 +++
tools/bam-loader/bam.h | 597 +
tools/bam-loader/config-file.cpp | 195 +
tools/bam-loader/config-file.hpp | 65 +
tools/bam-loader/fasta-file.cpp | 257 +
tools/bam-loader/fasta-file.hpp | 63 +
tools/bam-loader/hashtable.c | 878 +
tools/bam-loader/hashtable.h | 55 +
tools/bam-loader/loader-imp.c | 3130 ++
tools/bam-loader/loader-imp.h | 30 +
tools/bam-loader/low-match-count.cpp | 72 +
tools/bam-loader/low-match-count.h | 33 +
tools/bam-loader/mate-distance-stats.cpp | 23 +
tools/bam-loader/mate-distance-stats.hpp | 20 +
tools/bam-loader/mem-bank.cpp | 477 +
tools/bam-loader/mem-bank.h | 41 +
tools/bam-loader/quality-quantizer.cpp | 107 +
tools/bam-loader/quality-quantizer.hpp | 10 +
tools/bam-loader/reference-writer.c | 615 +
tools/bam-loader/reference-writer.h | 76 +
tools/bam-loader/samview.c | 104 +
tools/bam-loader/sequence-writer.c | 497 +
tools/bam-loader/sequence-writer.h | 89 +
tools/cache-mgr/Makefile | 76 +
tools/cache-mgr/cache-mgr.c | 1415 +
tools/ccextract/Makefile | 90 +
tools/ccextract/ccextract.c | 1272 +
tools/cg-load/.gitignore | 2 +
tools/cg-load/Makefile | 97 +
tools/cg-load/cg-load.c | 1270 +
tools/cg-load/debug.h | 34 +
tools/cg-load/defs.h | 163 +
tools/cg-load/f1_3.c | 77 +
tools/cg-load/f1_5.c | 78 +
tools/cg-load/f1_7.c | 97 +
tools/cg-load/f2_0.c | 98 +
tools/cg-load/f2_2.c | 98 +
tools/cg-load/f2_4.c | 33 +
tools/cg-load/f2_5.c | 98 +
tools/cg-load/factory-cmn.h | 57 +
tools/cg-load/factory-evidence-dnbs.c | 625 +
tools/cg-load/factory-evidence-dnbs.h | 46 +
tools/cg-load/factory-evidence-intervals.c | 396 +
tools/cg-load/factory-evidence-intervals.h | 46 +
tools/cg-load/factory-file.h | 49 +
tools/cg-load/factory-mappings.c | 539 +
tools/cg-load/factory-mappings.h | 46 +
tools/cg-load/factory-reads.c | 448 +
tools/cg-load/factory-reads.h | 46 +
tools/cg-load/factory-tag-lfr.c | 376 +
tools/cg-load/factory-tag-lfr.h | 41 +
tools/cg-load/file-version-factory.c | 165 +
tools/cg-load/file.c | 516 +
tools/cg-load/file.h | 334 +
tools/cg-load/formats.c | 54 +
tools/cg-load/formats.h | 41 +
tools/cg-load/writer-algn.c | 825 +
tools/cg-load/writer-algn.h | 63 +
tools/cg-load/writer-evidence-dnbs.c | 246 +
tools/cg-load/writer-evidence-dnbs.h | 97 +
tools/cg-load/writer-evidence-intervals.c | 263 +
tools/cg-load/writer-evidence-intervals.h | 68 +
tools/cg-load/writer-seq.c | 155 +
tools/cg-load/writer-seq.h | 62 +
tools/copycat/Makefile | 100 +
tools/copycat/ccbuffer.c | 153 +
tools/copycat/ccbuffermgr.c | 234 +
tools/copycat/ccbufferq.c | 175 +
tools/copycat/cccat.c | 1797 ++
tools/copycat/cccopier.c | 217 +
tools/copycat/cccopy.c | 347 +
tools/copycat/ccfile.c | 271 +
tools/copycat/ccfileformat.c | 405 +
tools/copycat/ccproc.c | 319 +
tools/copycat/ccprocone.c | 217 +
tools/copycat/ccread.c | 302 +
tools/copycat/ccsra.c | 1239 +
tools/copycat/ccsubchunk.c | 390 +
tools/copycat/cctar.c | 2199 ++
tools/copycat/cctree-dump.c | 1030 +
tools/copycat/cctree-priv.h | 351 +
tools/copycat/cctree.c | 754 +
tools/copycat/copycat-priv.h | 229 +
tools/copycat/copycat.c | 1251 +
tools/copycat/debug.h | 75 +
tools/copycat/magic | 18398 +++++++++++
tools/dbgap-mount/Makefile | 123 +
tools/dbgap-mount/dbgap-mount-tool.c | 561 +
tools/dbgap-mount/dbgap-mount-tool.h | 72 +
tools/dbgap-mount/demo.c | 353 +
tools/dbgap-mount/demo.mkfg | 47 +
tools/dbgap-mount/unix/wrap.c | 44 +
tools/dbgap-mount/win/wrap.c | 344 +
tools/fastdump/.gitignore | 3 +
tools/fastdump/Makefile | 89 +
tools/fastdump/cmn_iter.c | 287 +
tools/fastdump/cmn_iter.h | 82 +
tools/fastdump/fastdump.c | 367 +
tools/fastdump/fastq_iter.c | 97 +
tools/fastdump/fastq_iter.h | 69 +
tools/fastdump/file_printer.c | 130 +
tools/fastdump/file_printer.h | 56 +
tools/fastdump/helper.c | 673 +
tools/fastdump/helper.h | 141 +
tools/fastdump/index.c | 335 +
tools/fastdump/index.h | 67 +
tools/fastdump/join.c | 670 +
tools/fastdump/join.h | 76 +
tools/fastdump/line_iter.c | 199 +
tools/fastdump/line_iter.h | 60 +
tools/fastdump/lookup_reader.c | 360 +
tools/fastdump/lookup_reader.h | 75 +
tools/fastdump/lookup_writer.c | 138 +
tools/fastdump/lookup_writer.h | 67 +
tools/fastdump/merge_sorter.c | 173 +
tools/fastdump/merge_sorter.h | 66 +
tools/fastdump/raw_read_iter.c | 100 +
tools/fastdump/raw_read_iter.h | 67 +
tools/fastdump/readme.txt | 92 +
tools/fastdump/sorter.c | 538 +
tools/fastdump/sorter.h | 75 +
tools/fastdump/special_iter.c | 98 +
tools/fastdump/special_iter.h | 69 +
tools/fastdump/todo.txt | 3 +
tools/fastdump/verify.sh | 81 +
tools/fastq-dump/Makefile | 93 +
tools/fastq-dump/args.cpp | 622 +
tools/fastq-dump/args.hpp | 330 +
tools/fastq-dump/fastq-dump.cpp | 641 +
tools/fastq-dump/filters.cpp | 300 +
tools/fastq-dump/filters.hpp | 114 +
tools/fastq-dump/koutstream | 324 +
tools/fastq-loader/.gitignore | 1 +
tools/fastq-loader/Makefile | 166 +
tools/fastq-loader/common-reader-priv.h | 300 +
tools/fastq-loader/common-reader.c | 614 +
tools/fastq-loader/common-reader.h | 486 +
tools/fastq-loader/common-writer.c | 1654 +
tools/fastq-loader/common-writer.h | 164 +
tools/fastq-loader/fastq-grammar.c | 2310 ++
tools/fastq-loader/fastq-grammar.y | 478 +
tools/fastq-loader/fastq-lex.c | 2888 ++
tools/fastq-loader/fastq-lex.l | 256 +
tools/fastq-loader/fastq-loader.c | 626 +
tools/fastq-loader/fastq-parse.h | 169 +
tools/fastq-loader/fastq-reader.c | 709 +
tools/fastq-loader/fastq-reader.h | 57 +
tools/fastq-loader/fastq-tokens.h | 67 +
tools/fastq-loader/loader-imp.c | 256 +
tools/fastq-loader/mmarray.c | 114 +
tools/fastq-loader/parsing_rules.txt | 106 +
tools/fastq-loader/sequence-writer.c | 366 +
tools/fastq-loader/sequence-writer.h | 93 +
tools/fuse/Makefile | 204 +
tools/fuse/accessor.c | 134 +
tools/fuse/accessor.h | 46 +
tools/fuse/debug.h | 53 +
tools/fuse/directory.c | 566 +
tools/fuse/directory.h | 34 +
tools/fuse/dump-idx.c | 102 +
tools/fuse/file.c | 275 +
tools/fuse/file.h | 33 +
tools/fuse/formats.c | 443 +
tools/fuse/formats.h | 157 +
tools/fuse/kfile-accessor.c | 73 +
tools/fuse/kfile-accessor.h | 33 +
tools/fuse/log.c | 197 +
tools/fuse/log.h | 53 +
tools/fuse/node.c | 273 +
tools/fuse/node.h | 108 +
tools/fuse/remote-cache.c | 2129 ++
tools/fuse/remote-cache.h | 169 +
tools/fuse/remote-directory.c | 411 +
tools/fuse/remote-directory.h | 33 +
tools/fuse/remote-file.c | 308 +
tools/fuse/remote-file.h | 33 +
tools/fuse/remote-fuser.c | 206 +
tools/fuse/remote-fuser.h | 52 +
tools/fuse/remote-link.c | 208 +
tools/fuse/remote-link.h | 33 +
tools/fuse/remote-xml.c | 604 +
tools/fuse/remote-xml.h | 59 +
tools/fuse/sra-directory.c | 107 +
tools/fuse/sra-directory.h | 33 +
tools/fuse/sra-fastq.c | 245 +
tools/fuse/sra-fastq.h | 34 +
tools/fuse/sra-fuser-test.c | 100 +
tools/fuse/sra-fuser.c | 195 +
tools/fuse/sra-fuser.h | 48 +
tools/fuse/sra-fuser.xsd | 207 +
tools/fuse/sra-list.c | 1225 +
tools/fuse/sra-list.h | 86 +
tools/fuse/sra-makeidx.c | 955 +
tools/fuse/sra-node.c | 165 +
tools/fuse/sra-node.h | 34 +
tools/fuse/sra-sff.c | 249 +
tools/fuse/sra-sff.h | 34 +
tools/fuse/tar-file.c | 127 +
tools/fuse/tar-file.h | 33 +
tools/fuse/tar-list.c | 598 +
tools/fuse/tar-list.h | 49 +
tools/fuse/tar-node.c | 320 +
tools/fuse/tar-node.h | 35 +
tools/fuse/text-file.c | 134 +
tools/fuse/text-file.h | 36 +
tools/fuse/unix/remote-fuser-sys.c | 696 +
tools/fuse/unix/sra-fuser-sys.c | 637 +
tools/fuse/xml.c | 516 +
tools/fuse/xml.h | 60 +
tools/fuse/zlib-simple.c | 65 +
tools/fuse/zlib-simple.h | 33 +
tools/general-loader/Makefile | 131 +
tools/general-loader/database-loader.cpp | 894 +
tools/general-loader/general-loader.cpp | 223 +
tools/general-loader/general-loader.hpp | 243 +
tools/general-loader/general-writer.cpp | 1172 +
tools/general-loader/general-writer.h | 1081 +
tools/general-loader/general-writer.hpp | 210 +
tools/general-loader/gw-dumper.cpp | 1785 ++
tools/general-loader/main.cpp | 239 +
tools/general-loader/protocol-parser.cpp | 1048 +
tools/general-loader/utf8-like-int-codec.c | 687 +
tools/general-loader/utf8-like-int-codec.h | 69 +
tools/kar/Makefile | 99 +
tools/kar/kar-args.c | 428 +
tools/kar/kar-args.h | 98 +
tools/kar/kar.c | 2063 ++
tools/kar/sra-kar.c | 431 +
tools/keyring-srv/Makefile | 110 +
tools/keyring-srv/keyring-data.c | 346 +
tools/keyring-srv/keyring-data.h | 130 +
tools/keyring-srv/keyring-database.c | 441 +
tools/keyring-srv/keyring-database.h | 45 +
tools/keyring-srv/keyring-srv-main.c | 333 +
tools/keyring-srv/keyring-srv.c | 522 +
tools/keyring-srv/keyring-srv.h | 101 +
tools/kget/Makefile | 77 +
tools/kget/examples.sh | 62 +
tools/kget/kget.c | 941 +
tools/kqsh/.gitignore | 7 +
tools/kqsh/Makefile | 207 +
tools/kqsh/kqsh-alter.c | 347 +
tools/kqsh/kqsh-close.c | 186 +
tools/kqsh/kqsh-create.c | 680 +
tools/kqsh/kqsh-help.c | 1292 +
tools/kqsh/kqsh-load.c | 410 +
tools/kqsh/kqsh-open.c | 199 +
tools/kqsh/kqsh-parse.c | 198 +
tools/kqsh/kqsh-print.c | 170 +
tools/kqsh/kqsh-priv.h | 151 +
tools/kqsh/kqsh-show.c | 290 +
tools/kqsh/kqsh-thunk.pl | 662 +
tools/kqsh/kqsh-tok.c | 99 +
tools/kqsh/kqsh-tok.h | 155 +
tools/kqsh/kqsh-write.c | 321 +
tools/kqsh/kqsh.c | 516 +
tools/nenctool/Makefile | 119 +
tools/nenctool/nenctest.c | 489 +
tools/nenctool/nenctool.c | 435 +
tools/nencvalid/Makefile | 88 +
tools/nencvalid/nencvalid.c | 593 +
tools/ngs-pileup/Makefile | 82 +
tools/ngs-pileup/main.cpp | 152 +
tools/ngs-pileup/ngs-pileup.cpp | 206 +
tools/ngs-pileup/ngs-pileup.hpp | 97 +
tools/pacbio-load/.gitignore | 7 +
tools/pacbio-load/Makefile | 117 +
tools/pacbio-load/pacbio-load.c | 650 +
tools/pacbio-load/pl-basecalls_cmn.c | 97 +
tools/pacbio-load/pl-basecalls_cmn.h | 60 +
tools/pacbio-load/pl-consensus.c | 472 +
tools/pacbio-load/pl-consensus.h | 83 +
tools/pacbio-load/pl-context.c | 211 +
tools/pacbio-load/pl-context.h | 87 +
tools/pacbio-load/pl-metrics.c | 779 +
tools/pacbio-load/pl-metrics.h | 83 +
tools/pacbio-load/pl-passes.c | 437 +
tools/pacbio-load/pl-passes.h | 70 +
tools/pacbio-load/pl-progress.c | 195 +
tools/pacbio-load/pl-progress.h | 70 +
tools/pacbio-load/pl-regions.c | 1048 +
tools/pacbio-load/pl-regions.h | 140 +
tools/pacbio-load/pl-sequence.c | 928 +
tools/pacbio-load/pl-sequence.h | 110 +
tools/pacbio-load/pl-tools.c | 624 +
tools/pacbio-load/pl-tools.h | 291 +
tools/pacbio-load/pl-zmw.c | 221 +
tools/pacbio-load/pl-zmw.h | 105 +
tools/pacbio-load/verify/ins_nl.pl | 15 +
tools/pacbio-load/verify/ins_nl_1.pl | 30 +
tools/pacbio-load/verify/ins_nl_2.pl | 24 +
tools/pacbio-load/verify/ins_nl_4.pl | 24 +
tools/pacbio-load/verify/ins_nl_f.pl | 27 +
tools/pileup-stats/Makefile | 81 +
tools/pileup-stats/pileup-stats.cpp | 776 +
tools/prefetch/Makefile | 93 +
tools/prefetch/kfile-no-q.c | 215 +
tools/prefetch/kfile-no-q.h | 44 +
tools/prefetch/prefetch.c | 3679 +++
tools/qual-recalib-stat/.gitignore | 3 +
tools/qual-recalib-stat/Makefile | 84 +
tools/qual-recalib-stat/columns.c | 94 +
tools/qual-recalib-stat/columns.h | 67 +
tools/qual-recalib-stat/context.c | 330 +
tools/qual-recalib-stat/context.h | 120 +
tools/qual-recalib-stat/fasta_dump.pl | 81 +
tools/qual-recalib-stat/namelist_tools.c | 187 +
tools/qual-recalib-stat/namelist_tools.h | 53 +
tools/qual-recalib-stat/qual-recalib-stat.c | 418 +
tools/qual-recalib-stat/reader.c | 241 +
tools/qual-recalib-stat/reader.h | 88 +
tools/qual-recalib-stat/ref_exclude.c | 561 +
tools/qual-recalib-stat/ref_exclude.h | 71 +
tools/qual-recalib-stat/ref_grab.pl | 82 +
tools/qual-recalib-stat/spot_position.c | 121 +
tools/qual-recalib-stat/spot_position.h | 68 +
tools/qual-recalib-stat/stat_mod.c | 883 +
tools/qual-recalib-stat/stat_mod.h | 148 +
tools/qual-recalib-stat/stat_mod_1.c | 962 +
tools/qual-recalib-stat/stat_mod_1.h | 160 +
tools/qual-recalib-stat/stat_mod_2.c | 1041 +
tools/qual-recalib-stat/stat_mod_2.h | 141 +
tools/qual-recalib-stat/writer.c | 480 +
tools/qual-recalib-stat/writer.h | 79 +
tools/rd-filter-redact/Makefile | 95 +
tools/rd-filter-redact/rd-filter-redact.c | 1350 +
tools/rd-filter-redact/read-filter-redact.c | 861 +
tools/rd-filter-redact/test-read-write-cursor.c | 220 +
tools/sra-dump/.gitignore | 1 +
tools/sra-dump/Makefile | 128 +
tools/sra-dump/abi.c | 907 +
tools/sra-dump/core.c | 1717 ++
tools/sra-dump/core.h | 74 +
tools/sra-dump/debug.h | 34 +
tools/sra-dump/factory.c | 1069 +
tools/sra-dump/factory.h | 194 +
tools/sra-dump/fasta_dump.c | 752 +
tools/sra-dump/fasta_dump.h | 36 +
tools/sra-dump/fastq.c | 3800 +++
tools/sra-dump/illumina.c | 536 +
tools/sra-dump/sff.c | 200 +
tools/sra-dump/sra-dump.c | 1011 +
tools/sra-load/Makefile | 209 +
tools/sra-load/absolid-fmt.c | 573 +
tools/sra-load/common-xml.c | 871 +
tools/sra-load/common-xml.h | 183 +
tools/sra-load/debug.h | 34 +
tools/sra-load/experiment-xml.c | 1255 +
tools/sra-load/experiment-xml.h | 77 +
tools/sra-load/fastq-fmt.c | 701 +
tools/sra-load/helicos-fmt.c | 273 +
tools/sra-load/illumina-fmt.c | 848 +
tools/sra-load/loader-file.c | 191 +
tools/sra-load/loader-file.h | 113 +
tools/sra-load/loader-fmt.c | 165 +
tools/sra-load/loader-fmt.h | 171 +
tools/sra-load/loader.c | 1135 +
tools/sra-load/pacbio-fmt.c | 141 +
tools/sra-load/pstring.c | 208 +
tools/sra-load/pstring.h | 58 +
tools/sra-load/run-xml.c | 487 +
tools/sra-load/run-xml.h | 90 +
tools/sra-load/sff-fmt.c | 491 +
tools/sra-load/sra-writer.c | 370 +
tools/sra-load/sra-writer.h | 92 +
tools/sra-load/srf-absolid.c | 497 +
tools/sra-load/srf-fmt.c | 267 +
tools/sra-load/srf-fmt.h | 46 +
tools/sra-load/srf-illumina.c | 453 +
tools/sra-load/srf.c | 229 +
tools/sra-load/srf.h | 146 +
tools/sra-load/writer-454.c | 262 +
tools/sra-load/writer-454.h | 46 +
tools/sra-load/writer-absolid.c | 501 +
tools/sra-load/writer-absolid.h | 94 +
tools/sra-load/writer-helicos.c | 135 +
tools/sra-load/writer-helicos.h | 41 +
tools/sra-load/writer-illumina.c | 720 +
tools/sra-load/writer-illumina.h | 92 +
tools/sra-load/writer-ion-torrent.c | 262 +
tools/sra-load/writer-ion-torrent.h | 46 +
tools/sra-load/ztr-absolid.c | 656 +
tools/sra-load/ztr-absolid.h | 124 +
tools/sra-load/ztr-huffman.c | 664 +
tools/sra-load/ztr-huffman.h | 45 +
tools/sra-load/ztr-illumina.c | 1367 +
tools/sra-load/ztr-illumina.h | 136 +
tools/sra-load/ztr.h | 182 +
tools/sra-pileup/.gitignore | 2 +
tools/sra-pileup/4na_ascii.c | 95 +
tools/sra-pileup/4na_ascii.h | 44 +
tools/sra-pileup/Makefile | 133 +
tools/sra-pileup/cg_tools.c | 1723 ++
tools/sra-pileup/cg_tools.h | 137 +
tools/sra-pileup/cmdline_cmn.c | 711 +
tools/sra-pileup/cmdline_cmn.h | 150 +
tools/sra-pileup/debug.h | 34 +
tools/sra-pileup/dyn_string.c | 206 +
tools/sra-pileup/dyn_string.h | 55 +
tools/sra-pileup/inputfiles.c | 377 +
tools/sra-pileup/inputfiles.h | 99 +
tools/sra-pileup/make_opt.pl | 13 +
tools/sra-pileup/matecache.c | 439 +
tools/sra-pileup/matecache.h | 119 +
tools/sra-pileup/md_flag.c | 268 +
tools/sra-pileup/md_flag.h | 48 +
tools/sra-pileup/out_redir.c | 120 +
tools/sra-pileup/out_redir.h | 64 +
tools/sra-pileup/perf_log.c | 273 +
tools/sra-pileup/perf_log.h | 52 +
tools/sra-pileup/pileup_counters.c | 447 +
tools/sra-pileup/pileup_counters.h | 41 +
tools/sra-pileup/pileup_indels.c | 120 +
tools/sra-pileup/pileup_indels.h | 40 +
tools/sra-pileup/pileup_index.c | 122 +
tools/sra-pileup/pileup_index.h | 40 +
tools/sra-pileup/pileup_options.h | 62 +
tools/sra-pileup/pileup_stat.c | 391 +
tools/sra-pileup/pileup_stat.h | 40 +
tools/sra-pileup/pileup_v2.c | 382 +
tools/sra-pileup/pileup_v2.h | 40 +
tools/sra-pileup/pileup_varcount.c | 139 +
tools/sra-pileup/pileup_varcount.h | 40 +
tools/sra-pileup/read_fkt.c | 718 +
tools/sra-pileup/read_fkt.h | 82 +
tools/sra-pileup/ref_regions.c | 825 +
tools/sra-pileup/ref_regions.h | 71 +
tools/sra-pileup/ref_walker.c | 1028 +
tools/sra-pileup/ref_walker.h | 147 +
tools/sra-pileup/ref_walker_0.c | 231 +
tools/sra-pileup/ref_walker_0.h | 107 +
tools/sra-pileup/report_deletes.c | 259 +
tools/sra-pileup/report_deletes.h | 41 +
tools/sra-pileup/reref.c | 550 +
tools/sra-pileup/reref.h | 43 +
tools/sra-pileup/rna_splice_log.c | 374 +
tools/sra-pileup/rna_splice_log.h | 87 +
tools/sra-pileup/sam-aligned.c | 2408 ++
tools/sra-pileup/sam-aligned.h | 46 +
tools/sra-pileup/sam-dump-opts.c | 1676 +
tools/sra-pileup/sam-dump-opts.h | 306 +
tools/sra-pileup/sam-dump.c | 4905 +++
tools/sra-pileup/sam-dump3.c | 563 +
tools/sra-pileup/sam-hdr.c | 728 +
tools/sra-pileup/sam-hdr.h | 41 +
tools/sra-pileup/sam-hdr1.c | 894 +
tools/sra-pileup/sam-hdr1.h | 42 +
tools/sra-pileup/sam-unaligned.c | 1565 +
tools/sra-pileup/sam-unaligned.h | 44 +
tools/sra-pileup/splitfastq.pl | 46 +
tools/sra-pileup/sra-pileup.c | 1640 +
tools/sra-pileup/walk_debug.c | 147 +
tools/sra-pileup/walk_debug.h | 42 +
tools/sra-pileup/writer.c | 137 +
tools/sra-pileup/writer.h | 32 +
tools/sra-seq-count/Makefile | 83 +
tools/sra-seq-count/main_fkt.c | 203 +
tools/sra-seq-count/options.h | 56 +
tools/sra-seq-count/range.hpp | 307 +
tools/sra-seq-count/sra-seq-count.cpp | 688 +
tools/sra-shell/Makefile | 58 +
tools/sra-shell/guilib/Makefile | 71 +
tools/sra-shell/job-exec/Makefile | 71 +
tools/sra-shell/parser/Makefile | 71 +
tools/sra-shell/parser/sra-shell-lex.l | 103 +
tools/sra-shell/parser/sra-shell.y | 54 +
tools/sra-shell/sra-gui/Makefile | 80 +
tools/sra-shell/sra-gui/sra-gui.c | 49 +
tools/sra-shell/sra-shell/Makefile | 87 +
tools/sra-shell/sra-shell/sra-shell.c | 49 +
tools/sra-shell/turboVision/Makefile | 71 +
tools/sra-sort/Makefile | 125 +
tools/sra-sort/Makefile.cc | 24 +
tools/sra-sort/Makefile.clang | 27 +
tools/sra-sort/Makefile.gcc | 27 +
tools/sra-sort/buff-writer.c | 789 +
tools/sra-sort/buff-writer.h | 64 +
tools/sra-sort/caps.c | 125 +
tools/sra-sort/caps.h | 70 +
tools/sra-sort/capture-first-half-aligned.c | 192 +
tools/sra-sort/col-pair.c | 818 +
tools/sra-sort/col-pair.h | 323 +
tools/sra-sort/csra-pair.c | 228 +
tools/sra-sort/csra-pair.h | 87 +
tools/sra-sort/csra-tbl.c | 798 +
tools/sra-sort/csra-tbl.h | 83 +
tools/sra-sort/ctx.h | 109 +
tools/sra-sort/db-pair.c | 885 +
tools/sra-sort/db-pair.h | 208 +
tools/sra-sort/dir-pair.c | 504 +
tools/sra-sort/dir-pair.h | 124 +
tools/sra-sort/dump-blob-boundaries.c | 203 +
tools/sra-sort/except.c | 232 +
tools/sra-sort/except.h | 160 +
tools/sra-sort/gcc-ped.sh | 39 +
tools/sra-sort/glob-poslen.c | 349 +
tools/sra-sort/glob-poslen.h | 95 +
tools/sra-sort/id-mapper-col.c | 260 +
tools/sra-sort/id-mapper-col.h | 55 +
tools/sra-sort/idx-mapping.c | 88 +
tools/sra-sort/idx-mapping.h | 59 +
tools/sra-sort/map-file.c | 1192 +
tools/sra-sort/map-file.h | 172 +
tools/sra-sort/mapping-row-set.c | 496 +
tools/sra-sort/mem.c | 68 +
tools/sra-sort/mem.h | 128 +
tools/sra-sort/membank-priv.h | 44 +
tools/sra-sort/membank.c | 296 +
tools/sra-sort/meta-pair.c | 458 +
tools/sra-sort/meta-pair.h | 109 +
tools/sra-sort/paged-membank.c | 244 +
tools/sra-sort/paged-mmapbank.c | 399 +
tools/sra-sort/poslen-col-pair.c | 559 +
tools/sra-sort/poslen-col-pair.h | 63 +
tools/sra-sort/ref-alignid-col.c | 702 +
tools/sra-sort/ref-alignid-col.h | 53 +
tools/sra-sort/row-set-priv.h | 44 +
tools/sra-sort/row-set.c | 208 +
tools/sra-sort/row-set.h | 215 +
tools/sra-sort/run.c | 388 +
tools/sra-sort/simple-row-set.c | 212 +
tools/sra-sort/sort-defs.h | 109 +
tools/sra-sort/sorting-row-set.c | 405 +
tools/sra-sort/sra-sort.c | 746 +
tools/sra-sort/sra-sort.h | 171 +
tools/sra-sort/status.h | 50 +
tools/sra-sort/tbl-pair.c | 1055 +
tools/sra-sort/tbl-pair.h | 209 +
tools/sra-sort/xcheck-ref-align.c | 411 +
tools/sra-sort/xcheck.h | 49 +
tools/sra-stat/Makefile | 80 +
tools/sra-stat/sra-stat.c | 3634 +++
tools/sra-stat/sra-stat.h | 42 +
tools/sra-stat/sra.c | 446 +
tools/sra/.cvsignore | 1 +
tools/sra/Makefile | 77 +
tools/sra/sra-dbcc.c | 435 +
tools/sra/table-vers.c | 232 +
tools/srapath/Makefile | 79 +
tools/srapath/cgi_request.c | 853 +
tools/srapath/cgi_request.h | 129 +
tools/srapath/helper.c | 464 +
tools/srapath/helper.h | 108 +
tools/srapath/line_iter.c | 241 +
tools/srapath/line_iter.h | 71 +
tools/srapath/srapath.c | 439 +
tools/update-schema/.cvsignore | 1 +
tools/update-schema/Makefile | 77 +
tools/update-schema/update-schema.c | 454 +
tools/util/Makefile | 393 +
tools/util/crc32sum.c | 272 +
tools/util/kdb-index.c | 257 +
tools/util/kdbmeta.c | 1332 +
tools/util/mac/syspass.c | 48 +
tools/util/md5cp.c | 702 +
tools/util/pacbio-correct.c | 208 +
tools/util/pseudo-aligner.cpp | 566 +
tools/util/rcexplain.c | 127 +
tools/util/rowwritetest.c | 433 +
tools/util/samview.c | 80 +
tools/util/schema-replace.c | 379 +
tools/util/sortreadtest.c | 351 +
tools/util/syspass-priv.h | 44 +
tools/util/test-sra-priv.h | 46 +
tools/util/test-sra.c | 3724 +++
tools/util/testld.c | 249 +
tools/util/txt2kdb.c | 579 +
tools/util/unix/PrintOS.c | 66 +
tools/util/unix/syspass.c | 62 +
tools/util/vdb-lock.c | 154 +
tools/util/vdb-passwd.c | 307 +
tools/util/vdb-unlock.c | 156 +
tools/util/win/PrintOS.c | 60 +
tools/util/win/syspass.c | 53 +
tools/vcf-loader/.gitignore | 1 +
tools/vcf-loader/Makefile | 128 +
tools/vcf-loader/vcf-database.c | 168 +
tools/vcf-loader/vcf-database.h | 40 +
tools/vcf-loader/vcf-grammar.c | 1686 +
tools/vcf-loader/vcf-grammar.h | 61 +
tools/vcf-loader/vcf-grammar.y | 123 +
tools/vcf-loader/vcf-lex.c | 2528 ++
tools/vcf-loader/vcf-lex.l | 132 +
tools/vcf-loader/vcf-loader.c | 124 +
tools/vcf-loader/vcf-parse.h | 89 +
tools/vcf-loader/vcf-reader.c | 438 +
tools/vcf-loader/vcf-reader.h | 110 +
tools/vdb-config/Makefile | 82 +
tools/vdb-config/configure.cpp | 816 +
tools/vdb-config/configure.h | 49 +
tools/vdb-config/interactive.cpp | 1096 +
tools/vdb-config/interactive.h | 50 +
tools/vdb-config/util.cpp | 1084 +
tools/vdb-config/util.hpp | 703 +
tools/vdb-config/vdb-config-model.cpp | 463 +
tools/vdb-config/vdb-config-model.hpp | 473 +
tools/vdb-config/vdb-config.c | 1712 +
tools/vdb-config/vdb-config2.cpp | 30 +
tools/vdb-config/vdb-config2.h | 29 +
tools/vdb-copy/.gitignore | 17 +
tools/vdb-copy/Makefile | 91 +
tools/vdb-copy/coldefs.c | 775 +
tools/vdb-copy/coldefs.h | 250 +
tools/vdb-copy/column_match.c | 31 +
tools/vdb-copy/column_match.h | 42 +
tools/vdb-copy/config_values.c | 54 +
tools/vdb-copy/config_values.h | 49 +
tools/vdb-copy/context.c | 473 +
tools/vdb-copy/context.h | 183 +
tools/vdb-copy/copy_context.c | 47 +
tools/vdb-copy/copy_context.h | 58 +
tools/vdb-copy/copy_meta.c | 518 +
tools/vdb-copy/copy_meta.h | 46 +
tools/vdb-copy/definitions.h | 112 +
tools/vdb-copy/get_platform.c | 168 +
tools/vdb-copy/get_platform.h | 46 +
tools/vdb-copy/helper.c | 919 +
tools/vdb-copy/helper.h | 225 +
tools/vdb-copy/matcher_input.h | 55 +
tools/vdb-copy/namelist_tools.c | 187 +
tools/vdb-copy/namelist_tools.h | 52 +
tools/vdb-copy/num-gen.c | 848 +
tools/vdb-copy/num-gen.h | 225 +
tools/vdb-copy/redactval.c | 230 +
tools/vdb-copy/redactval.h | 120 +
tools/vdb-copy/type_matcher.c | 850 +
tools/vdb-copy/type_matcher.h | 71 +
tools/vdb-copy/vdb-copy-includes.h | 121 +
tools/vdb-copy/vdb-copy.c | 1456 +
tools/vdb-copy/vdb-copy.kfg | 94 +
tools/vdb-decrypt/Makefile | 102 +
tools/vdb-decrypt/shared.c | 1271 +
tools/vdb-decrypt/shared.h | 93 +
tools/vdb-decrypt/vdb-decrypt.c | 269 +
tools/vdb-decrypt/vdb-encrypt.c | 215 +
tools/vdb-diff/Makefile | 79 +
tools/vdb-diff/coldefs.c | 211 +
tools/vdb-diff/coldefs.h | 105 +
tools/vdb-diff/namelist_tools.c | 299 +
tools/vdb-diff/namelist_tools.h | 59 +
tools/vdb-diff/vdb-diff.c | 1002 +
tools/vdb-dump/.gitignore | 2 +
tools/vdb-dump/Makefile | 92 +
tools/vdb-dump/help.txt | 352 +
tools/vdb-dump/vdb-boot.c | 448 +
tools/vdb-dump/vdb-boot.vschema | 52 +
tools/vdb-dump/vdb-dump-bin.c | 1496 +
tools/vdb-dump/vdb-dump-bin.h | 46 +
tools/vdb-dump/vdb-dump-coldefs.c | 846 +
tools/vdb-dump/vdb-dump-coldefs.h | 110 +
tools/vdb-dump/vdb-dump-context.c | 649 +
tools/vdb-dump/vdb-dump-context.h | 220 +
tools/vdb-dump/vdb-dump-fastq.c | 1132 +
tools/vdb-dump/vdb-dump-fastq.h | 47 +
tools/vdb-dump/vdb-dump-filter.c | 116 +
tools/vdb-dump/vdb-dump-filter.h | 82 +
tools/vdb-dump/vdb-dump-formats.c | 383 +
tools/vdb-dump/vdb-dump-formats.h | 51 +
tools/vdb-dump/vdb-dump-helper.c | 772 +
tools/vdb-dump/vdb-dump-helper.h | 107 +
tools/vdb-dump/vdb-dump-interact.c | 265 +
tools/vdb-dump/vdb-dump-interact.h | 50 +
tools/vdb-dump/vdb-dump-print.c | 1349 +
tools/vdb-dump/vdb-dump-print.h | 86 +
tools/vdb-dump/vdb-dump-redir.c | 120 +
tools/vdb-dump/vdb-dump-redir.h | 64 +
tools/vdb-dump/vdb-dump-repo.c | 281 +
tools/vdb-dump/vdb-dump-repo.h | 46 +
tools/vdb-dump/vdb-dump-row-context.h | 71 +
tools/vdb-dump/vdb-dump-str.c | 540 +
tools/vdb-dump/vdb-dump-str.h | 100 +
tools/vdb-dump/vdb-dump-tools.c | 528 +
tools/vdb-dump/vdb-dump-tools.h | 60 +
tools/vdb-dump/vdb-dump.c | 2351 ++
tools/vdb-dump/vdb_info.c | 1528 +
tools/vdb-dump/vdb_info.h | 47 +
tools/vdb-validate/Makefile | 96 +
tools/vdb-validate/check-corrupt.cpp | 764 +
tools/vdb-validate/vdb-validate.c | 3351 ++
2310 files changed, 313374 insertions(+), 299490 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 9c2648f..0000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-### Verify
-Can you see anything in the logs?
-Make sure your issue is not already in the [htsjdk issue tracker](https://github.com/samtools/htsjdk/issues?q=)
-
-### Subject of the issue
-Describe your issue here.
-Provide **screenshots** , **stacktrace** , **logs** where appropriate.
-
-### Your environment
-* version of htsjdk
-* version of java
-* which OS
-
-### Steps to reproduce
-Tell us how to reproduce this issue. If possible, include a short code snippet to demonstrate the problem.
-
-### Expected behaviour
-Tell us what should happen
-
-### Actual behaviour
-Tell us what happens instead
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 300af57..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### Description
-
-Please explain the changes you made here.
-Explain the **motivation** for making this change. What existing problem does the pull request solve?
-
-### Checklist
-
-- [ ] Code compiles correctly
-- [ ] New tests covering changes and new functionality
-- [ ] All tests passing
-- [ ] Extended the README / documentation, if necessary
-- [ ] Is not backward compatible (breaks binary or source compatibility)
-
diff --git a/.gitignore b/.gitignore
index a20c2c9..1e2413a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,19 +1,23 @@
-htsjdk.iws
-.command_tmp
-atlassian-ide-plugin.xml
-/htsjdk.version.properties
-/test-output
-
-#intellij
-.idea/
-src/htsjdk.iml
-*.iml
-*.ipr
-*.iws
-
-
-
-
-#gradle stuff
-.gradle/
-build/
+*~
+.DS_Store
+._*
+*.d
+*.db
+*.o
+*.pyc
+/bin64
+/build/BUILD.*
+/build/COMP.mac
+/centos
+/ilib64
+/lib64
+/mac
+/Makefile.config.*
+/reconfigure
+/schema
+/test-bin64
+/win
+*.log
+/.cproject
+/.project
+/.pydevproject
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1e92599..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: java
-dist: trusty
-sudo: true
-before_cache:
- - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
-cache:
- directories:
- - $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
- - $HOME/.m2
-jdk:
- - oraclejdk8
-script: ./gradlew jacocoTestReport testSRA;
-after_success:
- - echo "TRAVIS_BRANCH='$TRAVIS_BRANCH'";
- echo "JAVA_HOME='$JAVA_HOME'";
- ./gradlew coveralls;
- if [ "$TRAVIS_BRANCH" == "master" ]; then
- ./gradlew uploadArchives;
- fi
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..fe7f335
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,158 @@
+# NCBI External Developer Release:
+
+## SRA Toolkit 2.8.1
+**December 22, 2016**
+
+ **bam-load**: the result code updated to indicate empty slice rather than EOF
+ **kfg**: added possibility to create an empty KConfig object that does not try to load any file
+ **latf-load**: fixed an occasional crash on Ubuntu
+ **latf-load, test**: test script no longer executes failing tests for unimplemented features
+ **prefetch**: uses KStream rather than KHttpFile - it fixed environments with proxies non supporting HTTP Range
+ **sam-dump**: use of --seqid options creates now headers consistent with sam-lines
+ **test-sra**: added ability to print http response headers
+
+
+## SRA Toolkit 2.8.0-2
+**December 8, 2016**
+
+ **bam-load**: changed memcpy to memmove when regions overlap - seems to corrupt data on centos7
+ **blastn_vdb, tblastn_vdb**: removed library dependencies that were preventing users from launching these tools
+ **build**: fixed a bug in 'configure' when in could not find source files in repository saved with non-standard name
+ **cg-load**: added loading of CG File format v2.4
+
+
+## SRA Toolkit 2.8.0
+**October 7, 2016**
+
+### HTTPS-ENABLED RELEASE
+
+ **bam-load**: 10x Genomics CB and UB tags are preserved
+ **bam-load**: Orphaned secondary alignments will be converted to primary alignments
+ **bam-load**: READ_GROUP is populated from 'BC' if 'RG' has no value
+ **bam-load**: fixed support for '-V' and '--version' command-line options
+ **blast**: Updated BLAST engine to 2.5.0+ version
+ **build, ngs-tools**: Now ngs-tools look for its dependencies using their normal build paths and does not reconfigure them
+ **build, ngs-tools**: Now ngs-tools use CMAKE_INSTALL_PREFIX for installation path
+ **build, sra-tools**: Now makefile copies default.kfg file when it is updated
+ **build, sra-tools**: separate decryption package was removed - decryption tools are included as part of sratoolkit.
+ **kfg, kns**: Use environment variables to determine the proxy for a http protocol
+ **kfg, vdb-config**: vdb-config-GUI has now option to pick up proxy-setting from environment
+ **kns**: All tools and libraries now support https
+ **kns**: replaced all direct uses of sleep() within code to enforce standardization upon mS.
+ **kproc, ncbi-vdb**: Fixed KCondition to generate timeout error on Windows when timeout exhausted
+ **latf-load**: now handles column values up to 64MB long
+ **ngs**: Fixed all crashes when using null as string in ngs-java APIs
+ **ngs**: NGS_ReferenceGetChunk() will now return chunks potentially exceeding 5000 bases
+ **ngs**: fixed potential concurrency issues at exit, when called from Java
+ **ngs**: ngs-java and ngs-python auto-download (of native libraries) now works through HTTPS
+ **ngs**: read fragments of length 0 are now ignored
+ **ngs, ngs-tools, ref-variation**: added class ngs-vdb::VdbAlignment, featuring method IsFirst()
+ **ngs-engine**: improved diagnostic messages
+ **ngs-tools**: Fixed Makefiles to keep supporting "./configure; make" build of sra-search, alongside CMake-based build.
+ **prefetch**: Fixed prefetch not to print misleading 'unknown integer storage type' error messages
+ **sam-dump**: CB and UB tags are now created if loaded via bam-load from 10xSingleCell
+ **sra-tools**: presence of ./ncbi (even if empty) subdirectory next to the executable files is no longer required, unless configuration files are needed.
+ **test**: updated tests to not fail outside of NCBI
+ **test-sra**: test-sra prints network information
+ **test-sra**: test-sra prints version of ncbi-vdb or ngs-sdk dynamic library
+ **vdb**: improved parameter checking on VDatabaseOpenTableRead()
+ **vdb**: new function: "VDBManagerDeleteCacheOlderThan()"
+ **vdb**: problem with buffer-overrun when compressing random data fixed
+ **vdb**: remote/aux nodes have been removed from configuration
+ **vdb-dump**: does not ignore table-argument on plain table any more, has to be SEQUENCE on plain tables if used
+
+
+## SRA Toolkit 2.7.0
+**June 12, 2016**
+
+ **align, bam-load**: Insert-only alignments no longer cause incorrect binning
+ **bam-load**: fixed case where WGS accessions where not being read correctly
+ **bam-load**: will NOT perform spot assembly using hard clipped secondary alignments, even when 'make-spots-with-secondary' is enabled; WILL perform spot assembly using hard-clipped secondary alignments when 'defer-secondary' is enabled
+ **blast, kfg, ncbi-vdb, sra-tools, vfs**: restored possibility to disable local caching
+ **build, sra-tools**: Running make and make install in sra-tools repository prepares all configuration files required to access NCBI repository
+ **doc, ncbi-vdb**: created a Wiki page illustrating how to use the API to set up logging
+ **fastdump, sra-tools**: new tool to perform fast dumps of a whole run in either fastq or a custom format for one of our customers.
+ **kar**: Alter the default ordering of components of an SRA archive for better network performance
+ **kdb, kfs, kns**: Added blob validation for data being fetched remotely
+ **kfg**: When loading configuration files on Windows USERPROFILE environment variable is used before HOME
+ **kfg**: modified auxiliary remote access configuration to use load-balanced servers
+ **kns**: Fixed a bug when KHttpRequestPOST generated an incorrect Content-Length after retry
+ **ngs, search, sra-search**: sra-search was modified to support multiple threads.
+ **ngs-engine, ngs-tools, sra-tools, vfs**: The "auxiliary" nodes in configuration are now ignored
+ **pileup-stats**: updated commandline parser to eat unprocessed parameters
+ **sam-dump**: updated to append asterisks to quality field of SAM output when corrupt original BAM has secondary alignment is shorter than the primary.
+ **search**: now supports multi-threaded search
+ **sra-search**: now supports sorted output
+ **sra-tools**: added possibility to build rpm package in sra-toolkit
+ **sra-tools**: fixed exit codes for a number of applications in response to command line options
+ **vdb-dump**: added tests to verify vdb-dump operation on nested databases
+ **vdb-validate**: A new checks were added for SEQUENCE table
+ **vdb**: fixed a bug in VCursorFindNextRowIdDirect where it returned a wrong rowId
+ **vdb**: fixed a bug in the code used to iterate over blobs where rowmap expansion cache would reset iteration to initial row instead of respecting sequence
+ **vfs**: environment variable VDB_PWFILE is no longer used
+
+
+## SRA Toolkit 2.6.3
+**May 25, 2016**
+
+ **bam-load**: Corrects an optimization used to compare read lengths when lengths are greater than 255
+ **bam-load**: alignments which are below the minimum match count but with at least 1/2 of the aligned bases matching are accepted
+ **bam-load**: improved performance of SAM parsing code
+ **bam-load**: non-fatal result codes no longer cause the reader thread to quit early
+ **bam-load**: will NOT do spot assembly using hard clipped secondary alignments even when make-spots-with-secondary is enabled; WILL do spot assembly using hard-clipped secondary alignments when defer-secondary is enabled
+ **build**: MSVS 2013 toolset (12.0) is now supported across all repositories
+ **vdb**: Fixed a bound on memory cache that would never flush under certain access modes
+
+## SRA Toolkit 2.6.2
+**April 20, 2016**
+
+ **align-cache**: a tool producing vdbcache that reduces effects of random access and improves speed.
+ **bam-load**: Fixed bug in validation code for unsorted bam files
+ **bam-load**: If two (or more) local reference names refer to the same global reference, bam-load will record the first one used and report the change.
+ **bam-load**: Secondary alignment will be used for spot assembly if the loader is explicitly told to use them
+ **bam-load**: The code that had invalid item in index problem was removed in the process of addressing a performance issue.
+ **bam-load**: change reporting of fatal warnings into fatal errors
+ **bam-load**: changed from an error to a warning if using secondary alignments to create spots
+ **bam-load**: low-match secondary alignments are now discarded; low-match primary alignments are logged, and if too many, it will abort the load.
+ **bam-load**: records the contents of the BX tag
+ **bam-load**: rules for spot assembly were reverted to assembling spots only on primary alignments
+ **blast, build**: Improved blast tools: all required libraries are linked statically.
+ **build**: Allow to build sra-tools on systems without static c++ library
+ **check-corrupt, vdb-validate**: Added a new set of checks that can be triggered by using one of two "--sdc:" cmd options
+ **copycat**: now runs on Centos 7; no longer uses system-installed magic file
+ **dbgap-mount**: Added support for standard options "-L" and "-o", which allow users to determine the logging level and log output file
+ **dbgap-mount**: New optional parameter was introduced '-u' which allows user to unmount FUSE/DOKAN volume. Implemented on linux and windows
+ **fastq-load**: The (old) fastq-loader will properly report multiple reads on the 454 platform (and still fail).
+ **kar**: added '--md5' option to create md5sum compatible auxiliary file
+ **kdb**: Fixed VTableDropColumn, so that it can drop static columns
+ **kfs, kns, ngs, sra-tools**: Fixed thread safety issues for both cache and http files
+ **kget**: has a new option --full to match wget in speed. added examples.sh
+ **kproc**: Fixed KQueue to wake waiters when sealed, fixed KSemaphore to wake waiters when canceled
+ **latf-load**: now allows undescores inside spot group names
+ **latf-load**: now loads data produced by fastq-dump
+ **latf-load**: updated to support Illumina tag line format with identifier at the front
+ **pileup-stats**: added -V (--version) option: prints out the software
+ **pileup-stats**: pileup-stats: added version support (options -V or --version)
+ **prefetch**: Added --eliminate-quals option which speeds up HTTP download by ignoring QUALITY column`s data
+ **prefetch**: Fixed failure when running prefetch.exe "-a<bin|key>" when there is a space after "-a"
+ **prefetch**: messages about maximum size of download are made more user-friendly.
+ **prefetch**: now will download even when caching is disabled
+ **ref-variation**: --input-file option allows to specify input accessions and paths in the file
+ **ref-variation**: added "count-strand" option: it controls relative orientation of 3' and 5' fragments.
+ **ref-variation**: added -c option to flush output immediately; reporting zero matches
+ **ref-variation**: added a way to specify a number of repeats of the query
+ **ref-variation**: improved threading management
+ **ref-variation**: removed irrelevant warnings reported in some cases in debug version only
+ **sam-dump**: Segfault no longer occurs when confronted with large amounts of header lines
+ **sam-dump**: added option to produce MD tags
+ **sam-dump**: filters out duplicates in the rows that it generates
+ **sam-dump**: produces BX-tags if preserved in SRA file by bam-load
+ **sra-sort**: correctly generates spot-id column even in the absence of primary alignments
+ **sra-stat**: no longer fails when CS_NATIVE column is not present.
+ **sra-tools, vdb-config**: Removed dependency of mac binaries on unnecessary libraries, e.g. libxml2.
+ **sra-tools**: [https://github.com/ncbi/sra-tools/issues/27](https://github.com/ncbi/sra-tools/issues/27) : contains short and long examples of how to configure sra-tools build
+ **var-expand**: a tool for batch variation expansion
+ **vdb-config**: now handles standard options such as --option-file
+ **vdb-validate**: Added code to continue with the next row when column has discontiguous blobs
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8987076
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,66 @@
+CONTENTS
+
+ Public Domain Notice
+ Exceptions (for bundled 3rd-party code)
+ Copyright F.A.Q.
+
+
+==============================================================
+ PUBLIC DOMAIN NOTICE
+ National Center for Biotechnology Information
+
+With the exception of certain third-party files summarized below, this
+software is a "United States Government Work" under the terms of the
+United States Copyright Act. It was written as part of the authors'
+official duties as United States Government employees and thus cannot
+be copyrighted. This software is freely available to the public for
+use. The National Library of Medicine and the U.S. Government have not
+placed any restriction on its use or reproduction.
+
+Although all reasonable efforts have been taken to ensure the accuracy
+and reliability of the software and data, the NLM and the U.S.
+Government do not and cannot warrant the performance or results that
+may be obtained by using this software or data. The NLM and the U.S.
+Government disclaim all warranties, express or implied, including
+warranties of performance, merchantability or fitness for any
+particular purpose.
+
+Please cite the authors in any work or product based on this material.
+
+
+==============================================================
+EXCEPTIONS (in all cases excluding NCBI-written makefiles):
+
+See LICENSE from https://github.com/ncbi/ncbi-vdb
+
+==============================================================
+Copyright F.A.Q.
+
+
+--------------------------------------------------------------
+Q. Our product makes use of the NCBI source code, and we made changes
+ and additions to that version of the NCBI code to better fit it to
+ our needs. Can we copyright the code, and how?
+
+A. You can copyright only the *changes* or the *additions* you made to the
+ NCBI source code. You should identify unambiguously those sections of
+ the code that were modified, e.g. by commenting any changes you made
+ in the code you distribute. Therefore, your license has to make clear
+ to users that your product is a combination of code that is public domain
+ within the U.S. (but may be subject to copyright by the U.S. in foreign
+ countries) and code that has been created or modified by you.
+
+--------------------------------------------------------------
+Q. Can we (re)license all or part of the NCBI source code?
+
+A. No, you cannot license or relicense the source code written by NCBI
+ since you cannot claim any copyright in the software that was developed
+ at NCBI as a 'government work' and consequently is in the public domain
+ within the U.S.
+
+--------------------------------------------------------------
+Q. What if these copyright guidelines are not clear enough or are not
+ applicable to my particular case?
+
+A. Contact us. Send your questions to 'sra-tools at ncbi.nlm.nih.gov'.
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..90922b2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,187 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+#-------------------------------------------------------------------------------
+# environment
+#
+TOP ?= $(CURDIR)
+include $(TOP)/build/Makefile.shell
+
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS = \
+ shared \
+ tools \
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+default: $(SUBDIRS)
+
+test: all
+
+$(SUBDIRS) test:
+ @ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS) test
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(SUBDIRS_ALL):
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(SUBDIRS_STD):
+
+#-------------------------------------------------------------------------------
+# install
+#
+install:
+ @ echo "Checking make status of tools..."
+ @ $(MAKE) -s --no-print-directory TOP=$(CURDIR) std
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.install install
+
+uninstall:
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.install uninstall
+
+.PHONY: install uninstall
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: clean_deb clean_rpm clean_test
+
+clean_test:
+ @ $(MAKE) -s -C test clean
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+runtests: runtests_test
+
+runtests_test:
+ @ $(MAKE) -s -C test runtests
+
+# @ $(MAKE) -s -C ngs runtests
+
+#-------------------------------------------------------------------------------
+# slowtests
+#
+slowtests: slowtests_test
+
+slowtests_test:
+ @ $(MAKE) -s -C test slowtests
+
+#-------------------------------------------------------------------------------
+# valgrind
+#
+valgrind: valgrind_test
+
+valgrind_test:
+ @ $(MAKE) -s -C test valgrind
+
+#-------------------------------------------------------------------------------
+# RPM
+#
+ifeq (mac,$(OS))
+rpm:
+ @ echo "Not making rpm on Mac"
+clean_rpm:
+else
+rpm: std
+ @ $(MAKE) rpm -s TOP=$(CURDIR) -f build/Makefile.rpm
+clean_rpm:
+ @ $(MAKE) clean_rpm -s TOP=$(CURDIR) -f build/Makefile.rpm
+endif
+
+#-------------------------------------------------------------------------------
+# DEB
+#
+ifeq (mac,$(OS))
+deb: std
+else
+deb:
+endif
+ @ $(MAKE) deb -s TOP=$(CURDIR) -f build/Makefile.deb
+clean_deb:
+ @ $(MAKE) clean_deb -s TOP=$(CURDIR) -f build/Makefile.deb
+
+#-------------------------------------------------------------------------------
+# pass-through targets
+#
+COMPILERS = GCC ICC VC++ CLANG
+ARCHITECTURES = i386 x86_64 sparc32 sparc64
+CONFIG = debug profile release
+PUBLISH = scm pubtools
+REPORTS = bindir targdir osdir config compilers architecture architectures
+PASSTHRUS = \
+ out \
+ CC $(COMPILERS) \
+ $(ARCHITECTURES) \
+ $(CONFIG) $(PUBLISH) \
+ purify purecov \
+ local static dynamic
+
+$(RHOSTS):
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env local
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env require-proxy-exec
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env rebuild-dirlinks config
+
+$(PASSTHRUS):
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env rebuild-dirlinks config
+
+$(REPORTS):
+ @ $(MAKE) -s TOP=$(CURDIR) -f build/Makefile.env $@
+
+.PHONY: $(PASSTHRUS) $(RHOSTS) $(REPORTS)
+
+
+#-------------------------------------------------------------------------------
+# configuration help
+#
+help configure:
+ @ echo "Before initial build, run './configure --build-prefix=<out>' from"
+ @ echo "the project root to set the output directory of your builds."
+ @ echo
+ @ echo "To select a compiler, run 'make <comp>' where"
+ @ echo "comp = { "$(COMPILERS)" }."
+ @ echo
+ @ echo "For hosts that support cross-compilation ( only Macintosh today ),"
+ @ echo "you can run 'make <arch>' where arch = { "$(ARCHITECTURES)" }."
+ @ echo
+ @ echo "To set a build configuration, run 'make <config>' where"
+ @ echo "config = { "$(CONFIG)" }."
+ @ echo
+ @ echo "To select a remote build configuration, run 'make <rhost>' where"
+ @ echo "rhost = { "$(RHOSTS)" }."
+ @ echo
+
+.PHONY: help configure
diff --git a/README-blastn b/README-blastn
new file mode 100644
index 0000000..2008a8c
--- /dev/null
+++ b/README-blastn
@@ -0,0 +1,133 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+The NCBI SRA ( Sequence Read Archive )
+
+
+Contact: sra-tools at ncbi.nlm.nih.gov
+http://trace.ncbi.nlm.nih.gov/Traces/sra/std
+
+
+Stand-alone BLAST searches against SRA runs in their native format.
+-------------------------------------------------------------------
+
+A stand-alone blastn application to perform BLAST searches directly against
+native SRA files is included in this distribution. This application has been
+tested in-house at the NCBI, but has not been heavily used, so this should be
+considered a preliminary (alpha) release to a few experienced users. A 64-bit
+LINUX application has been built for this testing.
+
+The application is called "blastn_vdb".
+
+The application can be invoked in much the same manner as the standard
+blastn application:
+
+1) blastn_vdb -help or blastn_vdb -h will produce usage messages.
+
+2) The BLAST+ command-line manual at http://www.ncbi.nlm.nih.gov/books/NBK1763/
+provides more details on the options, though not all blastn options are
+available with blastn_vdb. Some options simply do not apply to sequences in SRA
+(e.g., -gilist is missing as these sequences have not been assigned GI's). Some
+options have not yet been implemented (e.g., -num_threads is currently disabled).
+
+
+To search cached or on-demand SRA objects.
+------------------------------------------
+An example blastn_vdb command-line would be:
+
+./blastn_vdb -db "ERR039542 ERR047215 ERR039539 ERR039540" -query nt.test -out test.out
+
+The file nt.test contains the query in FASTA format, and it will be searched against
+the reads in runs with accessions ERR039542 ERR047215 ERR039539 ERR039540.
+
+If you have not already downloaded these objects using the vdb "prefetch" tool,
+they will be retrieved on-demand from NCBI under standard configuration. For
+alternative configuration information, please see the "README-vdb-config" file
+in this distribution.
+
+Searching with manually downloaded files.
+-----------------------------------------
+If you have manually downloaded files, e.g. via aspera or wget, etc., they may
+be referred to as "local" files. You can pass one or more file paths to be used
+collectively as the database. In this case the blastn_vdb command-line would be:
+
+./blastn_vdb -db <SRR_file> -query <input_file> -out <output_file>
+
+Where
+<SRR_file> is the path (relative or absolute) and name of the SRRxxxxx file
+<input_file> is a fasta file containing the sequence(s) to be BLASTed
+<output_file> is the name specified for the output report of the blast search.
+
+Example:
+
+./blastn_vdb -db ./subdir/ERR039542.sra -query nt.test -out test.out
+
+Querying multiple SRR files simultaneously:
+
+./blastn_vdb -db "<SRR_file1> <SRR_file2> <SRR_file3>" -query <input.fa> -out <output_file>
+
+Enclose the group of files to be included in the search set in "quotes", e.g.
+"./SRR_file1.sra ./SRR_file2.sra ./SRR_file3.sra"
+
+Example:
+
+./blastn_vdb -db "./ERR039542.sra ./ERR047215.sra ./ERR039539.sra ./ERR039540.sra" -query nt.test -out test.out
+
+Caveats
+-------
+There are some limitations on the currently available application:
+
+1) Individual SRA data files containing more than 2 billion reads are not yet supported. For a
+paired-end experiment this is actually a limitation of about 1 billion "spots".
+
+2) Compressed SRA ("cSRA") is not yet fully supported. Currently, only the
+unaligned fraction of reads are searched. Compressed SRA are runs containing
+alignments (e.g., ERR230455). Runs can be checked with "vdb-dump" to report if
+they contain alignment information:
+
+ $ vdb-dump -E ERR230455
+ enumerating the tables of database 'ERR230455'
+ tbl #1: PRIMARY_ALIGNMENT
+ tbl #2: REFERENCE
+ tbl #3: SEQUENCE
+
+3) You may need to prefix "./" to the run name for files in your current
+directory.
+
+4) The blast_formatter is not currently able to read native SRA files, so
+reformatting of results saved as a blast archive is not yet supported.
+
+Common errors and fixes.
+------------------------
+
+1) Failure to provide relative path to manually downloaded SRR file:
+
+./blastn_vdb -db SRR770754.sra -query srr770754_test.fa -out test.out
+Error: NCBI C++ Exception:
+ "vdb2blast_util.cpp", line 253: Error: ncbi::CVDBBlastUtil::x_MakeSRASeqSrc()
+ - VDB BlastSeqSrc construction failed: Failed to add any run to VDB runset: unsupported while allocating
+
+Fix:
+Include relative (e.g., "../" or "./") or absolute (e.g., "/home/user/SRA_BLAST_data/") file path with SRR file
diff --git a/README-vdb-config b/README-vdb-config
new file mode 100644
index 0000000..46d1686
--- /dev/null
+++ b/README-vdb-config
@@ -0,0 +1,115 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+The tool 'vdb-config' can be used to inspect or change the configuration
+of the sra-toolkit.
+
+When called without any parameters the tool reports the current configuration
+in xml-format. No changes are made.
+
+-----------------------------------------------------------------------------
+
+vdb-config --restore-defaults
+
+If called with this parameter the tool will bring the configuration into
+default state.
+
+-----------------------------------------------------------------------------
+
+vdb-config -i
+
+This will present the user with a colored configuration dialog.
+
+The tab-key and the cursor-keys navigate the dialog. The item with the little
+red square has the focus. A button or a checkbox can be 'pressed' with the
+space or enter-key. To get out of the dialog without saving any changes
+press the '6'-key or the 'q'-key or navigate to the 'exit'-button at the
+bottom of the dialog and press the space or enter-key.
+
+
+The "data source" part:
+
+The "NCBI SRA" labeled checkbox enables/disables remote access to the SRA-
+accession stored at NCBI. As long as the computer has internet-access and this
+checkbox is enabled the user can access SRA-accessions directly without
+downloading them.
+
+A command like 'sra-pileup SRR341578' at the command-line will produce pileup
+output of the given accession even if this accession has not been downloaded
+before.
+The tool will download the data on the fly from our servers.
+
+
+There might be a checkbox labeled "site" below the "NCBI-SRA" one. If this
+checkbox is not available you do not have a 'site'-installation of SRA-data.
+If it is visible you do have such a site-installation and you can disable
+access to this data.
+
+
+The "local workspaces" part:
+
+At the top are 2 buttons "import dbGaP-project" and "set default import path".
+
+If you are not using dbGaP-projects (The database of Genotypes and Phenotypes)
+you can ignore these 2 buttons.
+
+The "import dbGaP-project" button presents you with another dialog to select
+a ngc-file. You can navigate the directories of your computer to find and
+select one of these files. By default the focus is in the files-list. It may
+be empty.
+Use the cursor-key: 'up' to focus the 'directories'-list. If you press enter
+on any of the listed directory-names you change into this directory.
+The '[ .. ]' entry brings you back into the parent directory. If you see
+ngc-files in the lower 'files'-list press the tab-key to switch to the
+'files'-list. Press enter on one of them to select this file for import. You
+will see a success-message if the import was performed without errors.
+On Windows you cannot switch from one drive-letter
+to another when selecting.
+
+The "set default import path" gives you the opportunity to specify a different
+default location for dbGaP-projects - for instance if your home directory is
+not big enough. You can always change the location for your dbGaP-project
+after the import.
+
+
+Below the 2 buttons is a list of local repositories. If there are no
+dbGaP-projects this list has only one entry "Open Access Data". This is the
+location where accessions get downloaded and cached. You can change these
+locations if for instance your home directory where they are created by
+default does not have enough space.
+The change button brings up a directory-select dialog.
+
+If you made any changes like enabling/disabling or changed a location, the
+change is only written to the configuration if you exit the dialog via the
+'save and exit' button.
+
+-----------------------------------------------------------------------------
+
+
+vdb-config -i --interactive-mode textual
+
+This will present the user with a purely textual and sequential dialog. It is
+intended to be used if the colored mode does not work, maybe because of
+console issues.
diff --git a/README.md b/README.md
index 0e468d3..238f8c6 100644
--- a/README.md
+++ b/README.md
@@ -1,107 +1,35 @@
-[](https://coveralls.io/github/samtools/htsjdk?branch=master)
-[](https://travis-ci.org/samtools/htsjdk)
-[](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github.samtools%22%20AND%20a%3A%22htsjdk%22)
-[](https://github.com/samtools/htsjdk)
-[](https://www.java.com/)
+# The NCBI SRA (Sequence Read Archive)
-Status of downstream projects automatically built on top of the current htsjdk master branch. See [gatk-jenkins](https://gatk-jenkins.broadinstitute.org/view/HTSJDK%20Release%20Tests/) for detailed logs. Failure may indicate problems in htsjdk, but may also be due to expected incompatibilities between versions, or unrelated failures in downstream projects.
-- [Picard](https://github.com/broadinstitute/picard): [](https://gatk-jenkins.broadinstitute.org/job/picard-on-htsjdk-master/)
-- [GATK 4](https://github.com/broadinstitute/gatk): [](https://gatk-jenkins.broadinstitute.org/job/gatk-on-htsjdk-master/)
+### Contact:
+email: sra-tools at ncbi.nlm.nih.gov
+or visit the [SRA Tools web site](http://ncbi.github.io/sra-tools)
-## A Java API for high-throughput sequencing data (HTS) formats.
+### Download
+Visit our [download page](https://github.com/ncbi/sra-tools/wiki/Downloads) for pre-built binaries.
-HTSJDK is an implementation of a unified Java library for accessing
-common file formats, such as [SAM][1] and [VCF][2], used for high-throughput
-sequencing data. There are also an number of useful utilities for
-manipulating HTS data.
+### Change Log
+Please check the CHANGES.md file for change history.
-Please see the [HTSJDK Documentation](http://samtools.github.io/htsjdk) for more information.
+## The SRA Toolkit
+The SRA Toolkit and SDK from NCBI is a collection of tools and libraries for
+using data in the INSDC Sequence Read Archives.
-> **NOTE: _HTSJDK does not currently support the latest Variant Call Format Specification (VCFv4.3 and BCFv2.2)._**
+### IMPORTANT ANNOUNCEMENT
+As was announced in [OMB memorandum M-15-13](https://www.whitehouse.gov/sites/default/files/omb/memoranda/2015/m-15-13.pdf) on June 8, 2015, NCBI and all Federal systems will be transitioning to using HTTPS-only protocols before the end of 2016. This change will affect any software that uses NCBI APIs such as the E-utilities or NCBI software toolkits such as `sra-tools`, `ncbi-vdb` or `ngs`.
-#### Building HTSJDK
+The NLM and NCBI may implement the switch to HTTPS-only as early as September 30, 2016.
-HTSJDK is now built using [gradle](http://gradle.org/).
+In particular, software products that depend on `sra-tools`, `ncbi-vdb` or `ngs` may not function as expected after September 30 unless they are properly updated from this site or by the software provider.
-A wrapper script (`gradlew`) is included which will download the appropriate version of gradle on the first invocation.
-
-Example gradle usage from the htsjdk root directory:
- - compile and build a jar
- ```
- ./gradlew
- ```
- or
- ```
- ./gradlew jar
- ```
- The jar will be in build/libs/htsjdk-\<version\>.jar where version is based on the current git commit.
-
- - run tests, a specific test class, or run a test and wait for the debugger to connect
- ```
- ./gradlew test
-
- ./gradlew test -Dtest.single=TestClassName
-
- ./gradlew test --tests htsjdk.variant.variantcontext.AlleleUnitTest
- ./gradlew test --tests "*AlleleUnitTest"
-
- ./gradlew test --tests "*AlleleUnitTest" --debug-jvm
- ```
-
-- run tests and collect coverage information (report will be in `build/reports/jacoco/test/html/index.html`)
-```
-./gradlew jacocoTestReport
-```
-
- - clean the project directory
- ```
- ./gradlew clean
- ```
-
- - build a monolithic jar that includes all of htsjdk's dependencies
- ```
- ./gradlew shadowJar
- ```
+If you use software that accesses NCBI SRA data in any way, your software will likely be affected by this change. Please check with your software provider for recent udpates or patches, and be sure to acquire these before September 30.
- - create a snapshot and install it into your local maven repository
- ```
- ./gradlew install
- ```
-
- - for an exhaustive list of all available targets
- ```
- ./gradlew tasks
- ```
-
-#### Create an HTSJDK project in IntelliJ
-To create a project in IntelliJ IDE for htsjdk do the following:
-
-1. Select fom the menu: `File -> New -> Project from Existing Sources`
-2. In the resulting dialog, chose `Import from existing model`, select `Gradle` and `Next`
-3. Choose the `default gradle wrapper` and `Finish`.
-
-From time to time if dependencies change in htsjdk you may need to refresh the project from the `View -> Gradle` menu.
-
-#### Licensing Information
-
-Not all sub-packages of htsjdk are subject to the same license, so a license notice is included in each source file or sub-package as appropriate. Please check the relevant license notice whenever you start working with a part of htsjdk that you have not previously worked with to avoid any surprises.
-
-#### Java Minimum Version Support Policy
-
-> **NOTE: _Effective November 24th 2015, HTSJDK has ended support of Java 7 and previous versions. Java 8 is now required_.**
-
-We will support all Java SE versions supported by Oracle until at least six months after Oracle's Public Updates period has ended ([see this link](http://www.oracle.com/technetwork/java/eol-135779.html)).
-
-Java SE Major Release | End of Java SE Oracle Public Updates | Proposed End of Support in HTSJDK | Actual End of Support in HTSJDK
----- | ---- | ---- | ----
-6 | Feb 2013 | Aug 2013 | Oct 2015
-7 | Apr 2015 | Oct 2015 | Oct 2015
-8* | Mar 2017 | Sep 2017 | Sep 2017
+If you develop software that relies on `sra-tools`, `ncbi-vdb` or `ngs` in any way, you will likely need to update your code so that it accesses NCBI using HTTPS.
-* to be finalized
+We have released new tools with version 2.8.0 that are HTTPS compatible and `M-15-13` compliant as of October 7, 2016. Please be certain to [update all of your binaries](https://github.com/ncbi/sra-tools/wiki/Downloads) and configuration files.
-HTSJDK is migrating to semantic versioning (http://semver.org/). We will eventually adhere to it strictly and bump our major version whenever there are breaking changes to our API, but until we more clearly define what constitutes our official API, clients should assume that every release potentially contains at least minor changes to public methods.
+For additional information on using, configuring, and building the toolkit,
+please visit our [wiki](https://github.com/ncbi/sra-tools/wiki)
+or our web site at [NCBI](http://www.ncbi.nlm.nih.gov/Traces/sra/?view=toolkit_doc)
-[1]: http://samtools.sourceforge.net
-[2]: http://vcftools.sourceforge.net/specs.html
+SRA Toolkit Development Team
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 9e8f351..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,227 +0,0 @@
-buildscript {
- repositories {
- mavenCentral()
- }
-}
-
-plugins {
- id "java"
- id 'maven'
- id 'signing'
- id 'jacoco'
- id 'com.palantir.git-version' version '0.5.1'
- id 'com.github.johnrengelman.shadow' version '1.2.3'
- id "com.github.kt3k.coveralls" version "2.6.3"
-}
-
-repositories {
- mavenCentral()
-}
-
-jacocoTestReport {
- dependsOn test
- group = "Reporting"
- description = "Generate Jacoco coverage reports after running tests."
- additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
-
- reports {
- xml.enabled = true // coveralls plugin depends on xml format report
- html.enabled = true
- }
-}
-
-jacoco {
- toolVersion = "0.7.5.201505241946"
-}
-
-dependencies {
- compile "org.apache.commons:commons-jexl:2.1.1"
- compile "commons-logging:commons-logging:1.1.1"
- compile "org.xerial.snappy:snappy-java:1.0.3-rc3"
- compile "org.apache.commons:commons-compress:1.4.1"
- compile "org.tukaani:xz:1.5"
- compile "gov.nih.nlm.ncbi:ngs-java:1.2.4"
-
- testCompile "org.testng:testng:6.9.9"
-}
-
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
-
-final isRelease = Boolean.getBoolean("release")
-final gitVersion = gitVersion().replaceAll(".dirty", "")
-version = isRelease ? gitVersion : gitVersion + "-SNAPSHOT"
-
-logger.info("build for version:" + version)
-group = 'com.github.samtools'
-
-defaultTasks 'jar'
-
-jar {
- manifest {
- attributes 'Implementation-Title': 'HTSJDK',
- 'Implementation-Vendor' : 'Samtools Organization',
- 'Implementation-Version': version
- }
-}
-
-import org.gradle.internal.os.OperatingSystem;
-
-tasks.withType(Test) {
- outputs.upToDateWhen { false } // tests will always rerun
- useTestNG()
-
- // set heap size for the test JVM(s)
- minHeapSize = "1G"
- maxHeapSize = "2G"
-
- jvmArgs '-Djava.awt.headless=true' //this prevents awt from displaying a java icon while the tests are running
-
- if (System.env.CI == "true") { //if running under a CI output less into the logs
- int count = 0
-
- beforeTest { descriptor ->
- count++
- if( count % 100 == 0) {
- logger.lifecycle("Finished "+ Integer.toString(count++) + " tests")
- }
- }
- } else {
- // show standard out and standard error of the test JVM(s) on the console
- testLogging.showStandardStreams = true
- beforeTest { descriptor ->
- logger.lifecycle("Running Test: " + descriptor)
- }
-
- // listen to standard out and standard error of the test JVM(s)
- onOutput { descriptor, event ->
- logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message )
- }
- }
-
- testLogging {
- testLogging {
- events "skipped", "failed"
- exceptionFormat = "full"
- }
- afterSuite { desc, result ->
- if (!desc.parent) { // will match the outermost suite
- println "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
- }
- }
- }
-}
-
-test {
- description = "Runs the unit tests other than the SRA tests"
-
- useTestNG {
- if( OperatingSystem.current().isUnix() ){
- excludeGroups "slow", "broken", "sra"
- } else {
- excludeGroups "slow", "broken", "unix", "sra"
- }
- }
-}
-
-task testSRA(type: Test) {
- jvmArgs '-Dsamjdk.sra_libraries_download=true'
-
- description "Run the SRA tests"
- useTestNG {
- configFailurePolicy 'continue'
- includeGroups "sra"
- }
-}
-
-task wrapper(type: Wrapper) {
- description = "Regenerate the gradle wrapper"
- gradleVersion = '2.13'
-}
-
-// This is a hack to disable the java 8 default javadoc lint until we fix the html formatting
-if (JavaVersion.current().isJava8Compatible()) {
- tasks.withType(Javadoc) {
- options.addStringOption('Xdoclint:none', '-quiet')
- }
-}
-
-task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from 'build/docs/javadoc'
-}
-
-task sourcesJar(type: Jar) {
- from sourceSets.main.allSource
- classifier = 'sources'
-}
-
-/**
- *This specifies what artifacts will be built and uploaded when performing a maven upload.
- */
-artifacts {
- archives jar
- archives javadocJar
- archives sourcesJar
-}
-
-/**
- * Sign non-snapshot releases with our secret key. This should never need to be invoked directly.
- */
-signing {
- required { isRelease && gradle.taskGraph.hasTask("uploadArchives") }
- sign configurations.archives
-}
-
-/**
- * Upload a release to sonatype. You must be an authorized uploader and have your sonatype
- * username and password information in your gradle properties file. See the readme for more info.
- *
- * For releasing to your local maven repo, use gradle install
- */
-uploadArchives {
- repositories {
- mavenDeployer {
- beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
-
- repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
- authentication(userName: project.findProperty("sonatypeUsername"), password: project.findProperty("sonatypePassword"))
- }
-
- snapshotRepository(url: "https://artifactory.broadinstitute.org/artifactory/libs-snapshot-local/") {
- authentication(userName: System.env.ARTIFACTORY_USERNAME, password: System.env.ARTIFACTORY_PASSWORD)
- }
-
- pom.project {
- name 'HTSJDK'
- packaging 'jar'
- description 'A Java API for high-throughput sequencing data (HTS) formats'
- url 'http://samtools.github.io/htsjdk/'
-
- developers {
- developer {
- id 'picard'
- name 'Picard Team'
- url 'http://broadinstitute.github.io/picard'
- }
- }
-
- scm {
- url 'git at github.com:samtools/htsjdk.git'
- connection 'scm:git:git at github.com:samtools/htsjdk.git'
- }
-
- licenses {
- license {
- name 'MIT License'
- url 'http://opensource.org/licenses/MIT'
- distribution 'repo'
- }
- }
- }
- }
- }
- doFirst{
- System.out.println("Uploading version $version")
- }
-}
diff --git a/build.xml b/build.xml
deleted file mode 100755
index 59bebde..0000000
--- a/build.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0"?>
-<!--
- ~ The MIT License
- ~
- ~ Copyright (c) 2009 The Broad Institute
- ~
- ~ Permission is hereby granted, free of charge, to any person obtaining a copy
- ~ of this software and associated documentation files (the "Software"), to deal
- ~ in the Software without restriction, including without limitation the rights
- ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- ~ copies of the Software, and to permit persons to whom the Software is
- ~ furnished to do so, subject to the following conditions:
- ~
- ~ The above copyright notice and this permission notice shall be included in
- ~ all copies or substantial portions of the Software.
- ~
- ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- ~ THE SOFTWARE.
- -->
-
-<project name="htsjdk" basedir="." default="all">
-
-
- <property name="gradle.executable" location="gradlew"/>
-
- <echo>
- ANT IS DEPRECATED FOR BUILDING HTSJDK
-
- Please switch to using gradlew
-
- Examples:
- compile htsjdk or it's tests
- ./gradlew compileJava
- ./gradlew compileTest
-
- build a jar
- ./gradlew jar
-
- build a jar, along with source and document jars
- ./gradlew build
-
- build a jar that packages all of htsjdk's dependencies in a single jar
- ./gradlew shadowJar
-
- run tests, or a single test, or run a test and wait for the debugger
- ./gradlew test
- ./gradlew test --tests "*AlleleUnitTest"
- ./gradlew test --tests "*AlleleUnitTest" --debug-jvm
-
- clean the project directory
- ./gradlew clean
-
- see an exhaustive list of all available targets
- ./gradlew tasks
- </echo>
-
-</project>
diff --git a/build/.gitignore b/build/.gitignore
new file mode 100644
index 0000000..e865f29
--- /dev/null
+++ b/build/.gitignore
@@ -0,0 +1,6 @@
+.cvsignore
+RHOST* ARCH* COMP* OUTDIR*
+STATIC
+ld.linux.exe_cmd.sh
+LNKG.*
+Makefile.config*
diff --git a/build/Makefile.cc b/build/Makefile.cc
new file mode 100644
index 0000000..590b55e
--- /dev/null
+++ b/build/Makefile.cc
@@ -0,0 +1,67 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/$(OS)-cc.sh $(OS) 'cc -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/$(OS)-c++.sh $(OS) 'c++ -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = cc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) cc \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) c++ \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN =
+
+ifeq (64,$(BITS))
+ CARCH = -m64
+else
+ CARCH = -m32
+endif
+
+ifeq (prof, $(BUILD))
+ PROF = -xpg
+endif
+
+ifeq (dbg, $(BUILD))
+ DBG = -g
+ OPT = $(WARN)
+ NOPT = $(WARN)
+ PED = -xc99=all -Xc -v
+else
+ OPT = -xO3
+ PED = -xc99=all # -Xc -v
+endif
diff --git a/build/Makefile.clang b/build/Makefile.clang
new file mode 100644
index 0000000..ecc0d2c
--- /dev/null
+++ b/build/Makefile.clang
@@ -0,0 +1,83 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'clang -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'clang++ -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = gcc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) clang \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR):$(NGS_LIBDIR):$(VDB_LIBDIR):$(VDB_ILIBDIR)
+
+LPFLAGS = $(LDFLAGS)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) clang++ \
+ --build $(BUILD) --ldflags "$(LPFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR):$(NGS_LIBDIR):$(VDB_LIBDIR):$(VDB_ILIBDIR)
+
+# tool options
+WARN = -Wall -Wno-variadic-macros -Wno-long-long # -Wconversion
+ifeq (linux,$(OS))
+ NO_ARRAY_BOUNDS_WARNING = -Wno-array-bounds
+endif
+
+ifeq (64,$(BITS))
+ CARCH = -m64
+else
+ifeq (32_64,$(BITS))
+ CARCH = -arch i386 -arch x86_64
+else
+ CARCH = -m32
+endif
+endif
+
+ifeq (prof, $(BUILD))
+ PROF = -pg
+endif
+
+ifeq (dbg, $(BUILD))
+ DBG = -g
+ OPT = $(WARN)
+ NOPT = $(WARN)
+ PED = -std=c99 -pedantic # -fdiagnostics-show-option
+else
+
+ifeq (x86_64, $(ARCH))
+ OPT = -O3 -Wall -Wno-variadic-macros -fno-strict-aliasing
+else
+ OPT = -O3 -Wno-variadic-macros -fno-strict-aliasing
+endif
+endif
+
+# clang is designed to be a GCC substitute
+COMP_DAD = gcc
diff --git a/build/Makefile.deb b/build/Makefile.deb
new file mode 100644
index 0000000..304b847
--- /dev/null
+++ b/build/Makefile.deb
@@ -0,0 +1,118 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#VERBOSE=-v
+
+# determine shell environment ($CONFIG_FILE)
+include $(TOP)/build/Makefile.shell
+
+# load build configuration ($TARGDIR) ($VERSION)
+include $(CONFIG_FILE)
+
+# $TOOLS_TO_INSTALL
+include $(TOP)/build/Makefile.tools
+ifeq (1,$(HAVE_HDF5))
+ TOOLS_TO_INSTALL += pacbio-load
+endif
+
+PKGDIR=$(TARGDIR)/debbuild
+DST=$(PKGDIR)/sra-toolkit-$(VERSION)
+DEB=$(DST).deb
+
+TOOL=$(shell which dpkg-deb 2> /dev/null)
+
+################################################################################
+
+clean_deb:
+ rm -rf $(DEB) $(DST)
+
+ifeq ("","$(TOOL)")
+deb:
+ >&2 echo dpkg-deb: command not found
+else
+deb: $(DEB)
+endif
+
+DEB_DEPS = \
+ $(DST)/etc/ncbi/default.kfg \
+ $(DST)/etc/ncbi/certs.kfg \
+ $(DST)/etc/ncbi/schema.kfg \
+ $(DST)/etc/ncbi/vdb-copy.kfg \
+ $(DST)/usr/bin \
+ $(DST)/DEBIAN/control
+
+$(DEB): $(DEB_DEPS)
+ifeq (mac,$(OS))
+ dpkg-deb --build $(DST)
+else
+ fakeroot dpkg-deb --build $(DST)
+endif
+
+$(PKGDIR):
+ mkdir $(VERBOSE) -p $@
+
+$(DST): $(PKGDIR)
+ mkdir $(VERBOSE) -p $@/DEBIAN
+ mkdir $(VERBOSE) -p $@/etc/ncbi
+
+$(DST)/etc/ncbi:
+ mkdir -p $@
+
+$(DST)/etc/ncbi/default.kfg: $(DST)/etc/ncbi
+ rsync $(VERBOSE) -l --chmod=g-w $(VDB_LIBDIR)/ncbi/default.kfg $@
+
+$(DST)/etc/ncbi/certs.kfg: $(DST)/etc/ncbi
+ rsync $(VERBOSE) -l --chmod=g-w $(VDB_LIBDIR)/ncbi/certs.kfg $@
+
+$(DST)/etc/ncbi/schema.kfg: $(DST)/etc/ncbi
+ echo '/vdb/schema/paths = "/usr/share/ncbi/schema"' > $@
+
+$(DST)/etc/ncbi/vdb-copy.kfg: $(DST)/etc/ncbi
+ rsync $(VERBOSE) -l --chmod=g-w $(BINDIR)/ncbi/vdb-copy.kfg $@
+
+$(DST)/usr/bin: $(DST)
+ mkdir $(VERBOSE) -p $@
+ $(MAKE) -s --no-print-directory -f $(TOP)/build/Makefile.deb \
+ $(TOOLS_TO_INSTALL)
+
+$(DST)/usr/share/ncbi/schema: $(DST)
+ mkdir $(VERBOSE) -p $@
+ rsync $(VERBOSE) -rmloptD --include '*.vschema' --include='*/' \
+ --exclude '*' $(VDB_INCDIR)/* $@
+
+$(DST)/DEBIAN/control:
+ mkdir $(VERBOSE) -p $(DST)/DEBIAN
+ printf \
+"Package: sra-toolkit\n"\
+"Version: $(VERSION)\n"\
+"Architecture: all\n"\
+"Maintainer: SRA Toolkit Development Team <sra-tools at ncbi.nlm.nih.gov>\n"\
+"Description: SRA Toolkit package\n"\
+" The SRA Toolkit and SDK from NCBI is a collection of tools and libraries\n"\
+" for using data in the INSDC Sequence Read Archives.\n" > $@
+
+$(TOOLS_TO_INSTALL):
+ - ( test -f $(BINDIR)/$@ || ( echo "$@ not found" && false ) ) && \
+ rsync $(VERBOSE) -l $(BINDIR)/$@ $(BINDIR)/$@$(VERSION_EXEX) \
+ $(BINDIR)/$@$(MAJVERS_EXEX) $(DST)/usr/bin
diff --git a/build/Makefile.env b/build/Makefile.env
new file mode 100644
index 0000000..46cc5f5
--- /dev/null
+++ b/build/Makefile.env
@@ -0,0 +1,414 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# pick up dependencies from object directory
+ifdef SRCDIR
+ include $(wildcard *.d)
+endif
+
+# determine shell environment
+include $(TOP)/build/Makefile.shell
+
+# load build configuration
+include $(CONFIG_FILE)
+
+# normally build shared and static external libs
+LIBEXT = $(LIBX) $(SHLX)
+
+# normally build static intermediate libs
+ILIBEXT = $(LIBX)
+
+# determine BUILD
+ifeq (,$(BUILD))
+ BUILD = dbg
+endif
+
+# some rules are sensitive to the type of build
+BUILDTYPE = $(BUILD)
+
+# adjust settings for build
+ifeq (dbg,$(BUILD))
+ DEBUG := -D_DEBUGGING
+endif
+ifeq (prof,$(BUILD))
+ DEBUG := -D_PROFILING
+endif
+ifeq (pur,$(BUILD))
+ DEBUG := -D_DEBUGGING
+ LD_PRE := purify
+ LNKG = stat
+endif
+ifeq (pcov,$(BUILD))
+ DEBUG := -D_DEBUGGING
+ LD_PRE := purecov
+ LNKG = stat
+endif
+ifeq (scm,$(BUILD))
+ BUILDTYPE = rel
+ CHECKSUM := --checksum
+endif
+
+ifeq (yes,$(HAS_RHOST))
+ LOCAL_OR_REMOTE = remote
+else
+ LOCAL_OR_REMOTE = local
+endif
+
+# pre-built sra-tools are static
+ifeq (1,$(WANTS_STATIC))
+ STATIC = --static
+ STATICSYSLIBS = --static-system-libs
+endif
+
+# drop all suffix rules
+.SUFFIXES:
+
+# load OS and COMP specific files
+include $(TOP)/build/Makefile.$(OS)
+include $(TOP)/build/Makefile.$(COMP)
+include $(TOP)/build/Makefile.rules
+
+# external schema modules
+EXT_SCHEMA_MODULES = axf sraxf wgsxf vxf
+UPDATE_SCHEMA_LIBS := $(addprefix -lw,$(EXT_SCHEMA_MODULES))
+READONLY_SCHEMA_LIBS = $(addprefix -l,$(EXT_SCHEMA_MODULES))
+ALWAYS_STATIC_SCHEMA_LIBS = $(addprefix -s,$(EXT_SCHEMA_MODULES))
+
+# full directory paths
+TARGDIR ?= $(OUTDIR)/$(OS)/$(TOOLSET)/$(ARCH)/$(BUILD)
+BINDIR ?= $(TARGDIR)/bin
+ifeq (win,$(OS))
+ # on Windows, place test executables next to .dlls
+ TEST_BINDIR = $(BINDIR)
+else
+ TEST_BINDIR = $(TARGDIR)/test-bin
+endif
+ILIBDIR = $(TARGDIR)/ilib
+LIBDIR = $(TARGDIR)/lib
+OBJDIR = $(TARGDIR)/obj/$(MODULE)
+
+CLSPATH ?= $(TARGDIR)/java
+CLASSPATH ?= $(CLSPATH)
+CLASSDIR ?= $(TARGDIR)/$(MODULE)
+TEST_CLSPATH ?= $(TARGDIR)/test/java
+JAVASOURCEPATH ?= $(TOP)/java
+
+# path to the ncbi sub-directory
+# this is where modules and installed schema files are kept
+ifeq (win,$(OS))
+ # under Windows, we are always relative to binary path
+ NCBIDIR = $(BINDIR)/ncbi
+else
+ # under Linux and Mac, it can be binary or library
+ NCBIDIR = $(LIBDIR)/ncbi $(BINDIR)/ncbi
+endif
+
+DEFAULT_CRT = $(VDB_SRCDIR)/libs/kfg/certs.kfg
+DEFAULT_KFG = $(VDB_SRCDIR)/libs/kfg/default.kfg
+
+# make reissue command
+MAKE_CMD = $(MAKE) BUILD=$(BUILD) TOOLSET=$(TOOLSET) COMP=$(COMP) LNKG=$(LNKG) \
+ TOP=$(TOP) SRCDIR=$(SRCDIR) OUTDIR=$(OUTDIR) -C $(OBJDIR) -f $(SRCDIR)/Makefile
+
+JMAKE_CMD = $(MAKE) BUILD=$(BUILD) TOOLSET=$(TOOLSET) COMP=$(COMP) LNKG=$(LNKG) \
+ TOP=$(TOP) SRCDIR=$(SRCDIR) OUTDIR=$(OUTDIR) -C $(CLASSDIR) -f $(SRCDIR)/Makefile
+
+# directory and link creation
+SUBDIRS = bin test-bin ilib lib
+OUTDIRS = schema
+
+# clean rules
+stdclean:
+ @ -rm -rf $(OBJDIR)
+ @ -rm -rf $(addsuffix .*,$(addprefix $(ILIBDIR)/,$(ALL_LIBS))) \
+ $(addsuffix .*,$(addprefix $(LIBDIR)/,$(ALL_LIBS))) \
+ $(addsuffix -static.*,$(addprefix $(LIBDIR)/,$(ALL_LIBS))) \
+ $(addsuffix *,$(addprefix $(BINDIR)/,$(ALL_TOOLS) $(ALL_LIBS))) \
+ $(addsuffix *,$(addprefix $(TEST_BINDIR)/,$(ALL_TOOLS) $(TEST_TOOLS)))
+
+stdjclean:
+ @ -rm -rf $(CLSPATH)
+
+# removing symbolic links that point to specific builds
+removelinks:
+ @ test ! -h $(OUTDIR)/schema && rm -rf $(OUTDIR)/schema || true
+ @ rm -f $(addprefix $(OUTDIR)/,$(addsuffix $(BITS),$(SUBDIRS)))
+ @ rm -f $(addprefix $(OUTDIR)/,$(OUTDIRS))
+
+$(BINDIR)/ncbi/certs.kfg: $(DEFAULT_CRT)
+ @ mkdir -p $(NCBIDIR)
+ @ cp -v $(DEFAULT_CRT) $@
+
+$(BINDIR)/ncbi/default.kfg: $(DEFAULT_KFG)
+ @ mkdir -p $(NCBIDIR)
+ @ cp -v $(DEFAULT_KFG) $@
+
+# create all required output directories
+makedirs: $(BINDIR)/ncbi/certs.kfg $(BINDIR)/ncbi/default.kfg
+ @ mkdir -p $(addprefix $(TARGDIR)/,$(SUBDIRS) obj/$(MODULE)) $(NCBIDIR)
+
+makejdirs:
+ @ mkdir -p $(CLASSDIR)
+
+# build version include files
+vers-includes: makedirs
+ @ $(MAKE_CMD) -s $(TARGDIR)/$@
+
+ifeq (win,$(OS))
+
+# Windows doesn't really support symbolic links
+# we may add them back in when our toolkit is able to create them
+rebuild-dirlinks: makedirs
+ @ true
+else
+
+LNDIRS = $(addprefix ln_,$(SUBDIRS))
+$(LNDIRS):
+ @ ln -s $(TARGDIR)/$(subst ln_,,$@) $(OUTDIR)/$(subst ln_,,$@)$(BITS)
+
+ifdef NOREBUILD_LINKS
+rebuild-dirlinks:
+ @ true
+else
+rebuild-dirlinks: removelinks makedirs $(LNDIRS)
+ @ ln -s $(VDB_INCDIR) $(OUTDIR)/schema
+endif
+
+endif
+
+.PHONY: stdclean removelinks makedirs vers-includes rebuild-dirlinks
+.PHONY: stdjclean makejdirs
+
+# configuration targets
+out:
+ @ echo $(OUTDIR) > $(TOP)/build/OUTDIR.$(BUILD_OS)
+ @ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env rebuild-dirlinks
+
+$(RHOSTS):
+ @ cat $(TOP)/rhosts/$@ >> $(TOP)/build/RHOST.$(HOST_OS)
+
+require-proxy-exec:
+ @ $(MAKE) -C $(TOP)/test/proxy_exec proxy-exec
+ @ echo "PROXY_TOOL := $(BINDIR)/proxy-exec" > $(TOP)/build/RHOST.$(HOST_OS)
+
+local:
+ @ rm -f $(TOP)/build/RHOST.$(HOST_OS)
+
+CC:
+ @ echo cc > $(TOP)/build/COMP.$(OS)
+
+GCC:
+ @ echo gcc > $(TOP)/build/COMP.$(OS)
+
+ICC:
+ @ echo icc > $(TOP)/build/COMP.$(OS)
+
+VC++:
+ @ echo vc++ > $(TOP)/build/COMP.$(OS)
+
+CLANG:
+ @ echo clang > $(TOP)/build/COMP.$(OS)
+
+static dynamic:
+ @ echo "there is no longer any difference between static and dynamic builds"
+
+debug:
+ @ echo dbg > $(TOP)/build/BUILD.$(OS)
+
+profile:
+ @ echo prof > $(TOP)/build/BUILD.$(OS)
+
+release:
+ @ echo rel > $(TOP)/build/BUILD.$(OS)
+
+scm:
+ @ echo scm > $(TOP)/build/BUILD.$(OS)
+
+pubtools: release
+
+bindir:
+ @ echo "$(BINDIR)"
+
+targdir:
+ @ echo "$(TARGDIR)"
+
+osdir:
+ @ echo "$(OUTDIR)/$(OS)"
+
+compilers:
+ @ echo "$(COMPILERS)"
+
+architectures:
+ @ echo "$(ARCHITECTURES)"
+
+architecture:
+ @ echo "$(ARCH)"
+
+config:
+ @ echo " current build is $(LOCAL_OR_REMOTE) $(BUILD_OS) $(BUILD) $(ARCH) build using $(TOOLSET) tools"
+ @ echo " output target directory is '$(TARGDIR)'"
+ @ echo
+
+purify:
+ @ echo pur > $(TOP)/build/BUILD.$(OS)
+
+purecov:
+ @ echo pcov > $(TOP)/build/BUILD.$(OS)
+
+.PHONY: out CC GCC ICC debug profile release scm purify purecov local local require-proxy-exec $(RHOSTS) bindir report_config
+
+# includes based upon build
+ITF = $(VDB_INCDIR)/
+OSINC = $(VDB_INCDIR)/os
+CCINC = $(VDB_INCDIR)/cc
+XTINC = $(VDB_INCDIR)/ext
+NGSINC = $(NGS_INCDIR)
+OVERRIDEINC = $(TOP)/interfaces/override
+
+# OS specific source and include dirs
+SRCDIRS_OS = $(SRCDIR)/$(OS)
+INCDIRS_OS = $(OSINC)/$(OS)
+
+# most OS' have a parent type
+ifdef OS_DAD
+
+SRCDIRS_OS += $(SRCDIR)/$(OS_DAD)
+INCDIRS_OS += $(OSINC)/$(OS_DAD)
+
+# some OS' have a grandparent
+ifdef OS_GDAD
+SRCDIRS_OS += $(SRCDIR)/$(OS_GDAD)
+INCDIRS_OS += $(OSINC)/$(OS_GDAD)
+endif
+
+endif
+
+# compiler specific includes
+INCDIRS_COMP = \
+ $(CCINC)/$(COMP)/$(ARCH) \
+ $(CCINC)/$(COMP)
+
+# some compilers have a parent type
+ifdef COMP_DAD
+
+INCDIRS_COMP += \
+ $(CCINC)/$(COMP_DAD)/$(ARCH) \
+ $(CCINC)/$(COMP_DAD)
+
+endif
+
+VPATH = \
+ $(SRCDIR)/$(COMP)/$(ARCH) \
+ $(SRCDIR)/$(COMP) \
+ $(SRCDIRS_OS) \
+ $(SRCDIR)
+
+INCDIRS = \
+ $(addprefix -I,$(OVERRIDEINC)) \
+ $(addprefix -I,$(SRCDIRS_OS)) \
+ $(addprefix -I,$(SRCDIR) $(ITF)) \
+ $(addprefix -I,$(INCDIRS_COMP)) \
+ $(addprefix -I,$(INCDIRS_OS)) \
+ $(addprefix -I,$(XTINC) $(NGSINC)) \
+ -I.
+
+
+# linker paths
+LDPATHS =
+
+ifneq (,$(HDF5_LIBDIR))
+ LDPATHS += -L$(HDF5_LIBDIR)
+endif
+ifneq (,$(XML2_LIBDIR))
+ LDPATHS += -L$(XML2_LIBDIR)
+endif
+ifneq (,$(MAGIC_LIBDIR))
+ LDPATHS += -L$(MAGIC_LIBDIR)
+endif
+ifneq (,$(FUSE_LIBDIR))
+ LDPATHS += -L$(FUSE_LIBDIR)
+endif
+
+
+# defines that describe os & architecture
+DLLX ?= $(SHLX)
+ARCHDEFS = -D_ARCH_BITS=__SIZEOF_POINTER__*__CHAR_BIT__ -DLIBPREFIX=$(LPFX) -DSHLIBEXT=$(DLLX)
+
+# default tool parameters
+CFLAGS = $(DEBUG) $(DBG) $(CARCH) $(PROF) $(PED) $(DEFINES) $(ARCHDEFS) $(MIN_DEPLOY_OS_OPT) $(INCDIRS)
+CPFLAGS = $(DEBUG) $(DBG) $(CARCH) $(PROF) $(DEFINES) $(ARCHDEFS) $(MIN_DEPLOY_OS_OPT) $(INCDIRS)
+LDFLAGS = $(DBG) $(PROF) $(CARCH) $(MIN_DEPLOY_OS_OPT) $(LDPATHS)
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+# MallocScribble=1 is for catching allocation problems on Mac
+#
+ifeq ($(RUNTESTS_OVERRIDE),)
+runtests: std $(TEST_TOOLS)
+ @ export VDB_CONFIG=$(VDB_CONFIG);export LD_LIBRARY_PATH=$(LIBDIR):$$LD_LIBRARY_PATH;export MallocScribble=1;\
+ for i in $(TEST_TOOLS);\
+ do\
+ echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++;\
+ echo Run $(TEST_BINDIR)/$$i;eval $(RUN_REMOTELY) $(TEST_BINDIR)/$$i;r=$$?; \
+ if [ "$$r" != "0" ] ; then exit $$r; fi; \
+ done
+
+.PHONY: runtests
+endif
+
+#-------------------------------------------------------------------------------
+# slowtests
+#
+# $(SLOWTESTSDATADIR) should be used to create temporary test files
+SLOWTESTSDATADIR ?= /panfs/pan1.be-md.ncbi.nlm.nih.gov/sra-test/slowtests/$(shell whoami)
+
+slowtests: std $(SLOW_TEST_TOOLS)
+ @ export LD_LIBRARY_PATH=$(LIBDIR):$$LD_LIBRARY_PATH;\
+ for i in $(SLOW_TEST_TOOLS);\
+ do\
+ echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++;\
+ echo Run $(TEST_BINDIR)/$$i;eval $(RUN_REMOTELY) $(TEST_BINDIR)/$$i;r=$$?; \
+ if [ "$$r" != "0" ] ; then exit $$r; fi; \
+ done
+
+.PHONY: slowtests
+
+#-------------------------------------------------------------------------------
+# all-cmn
+#
+# Common target to trigger build of all tools
+#
+$(TARGDIR)/all-cmn: $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all-cmn
+
+#-------------------------------------------------------------------------------
+# std-cmn
+#
+# Common target to trigger build of external visibility tools
+#
+$(TARGDIR)/std-cmn: $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std-cmn
diff --git a/build/Makefile.gcc b/build/Makefile.gcc
new file mode 100644
index 0000000..dc8ed4d
--- /dev/null
+++ b/build/Makefile.gcc
@@ -0,0 +1,92 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'gcc -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'g++ -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = gcc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) gcc \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR):$(NGS_LIBDIR):$(VDB_LIBDIR):$(VDB_ILIBDIR)
+
+LPFLAGS = $(LDFLAGS)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) g++ \
+ --build $(BUILD) --ldflags "$(LPFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR):$(NGS_LIBDIR):$(VDB_LIBDIR):$(VDB_ILIBDIR)
+
+# tool options
+WARN = -Wall -Wno-long-long
+ifneq (sun,$(OS))
+ WARN += -Wno-variadic-macros
+endif
+
+ifeq (linux,$(OS))
+ NO_ARRAY_BOUNDS_WARNING = -Wno-array-bounds
+endif
+
+ifeq (64,$(BITS))
+ CARCH = -m64
+else
+ifeq (32_64,$(BITS))
+ CARCH = -arch i386 -arch x86_64
+else
+ CARCH = -m32
+endif
+endif
+
+ifeq (prof, $(BUILD))
+ PROF = -pg
+endif
+
+ifeq (dbg, $(BUILD))
+ DBG = -g
+ OPT = $(WARN)
+ NOPT = $(WARN)
+ # GCC seems unable to use c99 without ansi, which
+ # basically clobbers features back to c89. the options
+ # must be specified in the order shown.
+ PED = -std=gnu99 -pedantic # -fdiagnostics-show-option
+else
+
+OPT = -O3 -Wno-variadic-macros -fno-strict-aliasing -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
+ifeq (x86_64, $(ARCH))
+ OPT += -Wall
+endif
+
+endif
+
+ifeq (mac,$(OS))
+ # g++ linker on mac needs to be told which standard c++ library to use
+ LPFLAGS += -lstdc++
+endif
diff --git a/build/Makefile.icc b/build/Makefile.icc
new file mode 100644
index 0000000..612a148
--- /dev/null
+++ b/build/Makefile.icc
@@ -0,0 +1,77 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# compilers
+CC = @ $(TOP)/build/cc.sh $(OS) 'icc -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CFLAGS)" -MD
+CP = @ $(TOP)/build/cc.sh $(OS) 'icpc -c' \
+ $(CHECKSUM) --objx $(OBJX) --cflags "$(CPFLAGS)" -MD
+
+# C preprocessor
+PP = icc -E $(CFLAGS)
+
+# linkers
+LD = @ $(TOP)/build/ld.sh $(OS) $(ARCH) icc \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+LP = @ $(TOP)/build/ld.sh $(OS) $(ARCH) icpc \
+ --build $(BUILD) --ldflags "$(LDFLAGS)" $(STATIC) \
+ $(STATICSYSLIBS) $(CHECKSUM) --objx $(OBJX) --shlx $(SHLX) --libx $(LIBX) \
+ -MD --srcdir $(SRCDIR) --bindir $(BINDIR) -L$(LIBDIR):$(ILIBDIR)
+
+# tool options
+WARN = -Wall
+
+ifeq (64,$(BITS))
+ CARCH = -m64
+else
+ CARCH = -m32
+endif
+
+ifeq (prof, $(BUILD))
+ PROF := -p
+endif
+
+ifeq (dbg, $(BUILD))
+ DBG = -g
+ OPT = $(WARN)
+ NOPT = $(WARN)
+else
+
+ifeq (x86_64, $(ARCH))
+ OPT := -O3 -unroll -xW
+else
+ OPT := -O3 -unroll -xW
+endif
+endif
+
+ifeq (prof, $(BUILD))
+ OPT += -vec_report5
+endif
+
+# ICC is designed to be a GCC substitute
+COMP_DAD = gcc
diff --git a/build/Makefile.install b/build/Makefile.install
new file mode 100644
index 0000000..1fd134c
--- /dev/null
+++ b/build/Makefile.install
@@ -0,0 +1,143 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# determine shell environment
+include $(TOP)/build/Makefile.shell
+
+# load build configuration
+include $(CONFIG_FILE)
+
+# load platform-specific settings
+include $(TOP)/build/Makefile.$(OS)
+
+#-------------------------------------------------------------------------------
+# install
+#
+
+# $TOOLS_TO_INSTALL
+include $(TOP)/build/Makefile.tools
+ifeq (1,$(HAVE_HDF5))
+ TOOLS_TO_INSTALL += pacbio-load
+endif
+
+#fake root for debugging
+#uncomment this line and change the test for root ( see under install: ) to succeed:
+#ROOT = ~/root
+
+EXE_TARGET = $(INST_BINDIR)
+PROFILE_FILE = $(ROOT)/etc/profile.d/sra-tools
+
+installexes:
+ @ echo "Installing executables to $(INST_BINDIR)/..."
+ @ mkdir -p $(INST_BINDIR)
+ @ $(MAKE) -s --no-print-directory -f $(TOP)/build/Makefile.install $(TOOLS_TO_INSTALL)
+ @ printf "Installing magic file..."
+ @ $(COPY) $(TOP)/tools/copycat/magic $(INST_BINDIR) && echo "done"
+
+$(TOOLS_TO_INSTALL):
+ @ printf "Installing $@..."
+ @ # ignore missing tools
+ @ - ( test -f $(BINDIR)/$@$(EXEX) || ( echo "not found" && false ) ) && \
+ $(COPY) $(BINDIR)/$@$(EXEX) $(BINDIR)/$@$(VERSION_EXEX) $(BINDIR)/$@$(MAJVERS_EXEX) $(INST_BINDIR) && \
+ echo "done"
+
+ifeq (linux, $(OS))
+ ifeq (0, $(shell id -u))
+ LINUX_ROOT = true
+ endif
+endif
+
+install: installexes
+ifeq (true, $(LINUX_ROOT))
+ @ # install configuration file(s)
+ @ printf "Installing configuration files to $(ROOT)/etc/ncbi/..."
+ ( mkdir -p $(ROOT)/etc/ncbi && \
+ cp -p $(TOP)/tools/vdb-copy/vdb-copy.kfg $(ROOT)/etc/ncbi ; \
+ if [ -f $(BINDIR)/ncbi/default.kfg ] ; then \
+ if [ -f $(ROOT)/etc/ncbi/default.kfg ] ; then \
+ mv -v $(ROOT)/etc/ncbi/default.kfg $(ROOT)/etc/ncbi/default.kfg.orig;\
+ fi; \
+ cp -p $(BINDIR)/ncbi/default.kfg $(ROOT)/etc/ncbi ; \
+ fi; \
+ if [ -f $(BINDIR)/ncbi/certs.kfg ] ; then \
+ if [ -f $(ROOT)/etc/ncbi/certs.kfg ] ; then \
+ mv -v $(ROOT)/etc/ncbi/certs.kfg $(ROOT)/etc/ncbi/certs.kfg.orig; \
+ fi; \
+ cp -p $(BINDIR)/ncbi/certs.kfg $(ROOT)/etc/ncbi ; \
+ fi ) && echo done
+ @ #
+ @ echo "Updating $(PROFILE_FILE).[c]sh"
+ @ printf \
+"#version $(VERSION)\n"\
+"if ! echo \$$PATH | /bin/grep -q $(EXE_TARGET)\n"\
+"then export PATH=$(EXE_TARGET):\$$PATH\n"\
+"fi" \
+ >$(PROFILE_FILE).sh && chmod 644 $(PROFILE_FILE).sh || true;
+ @ printf \
+"#version $(VERSION)\n"\
+"echo \$$PATH | /bin/grep -q $(EXE_TARGET)\n"\
+"if ( \$$status ) setenv PATH $(EXE_TARGET):\$$PATH\n"\
+ >$(PROFILE_FILE).csh && chmod 644 $(PROFILE_FILE).csh || true;
+ @ #TODO: check version of the files above
+else
+ @ # install configuration file(s)
+ @ printf "Installing configuration files to $(INST_BINDIR)/ncbi/..."
+ ( mkdir -p $(INST_BINDIR)/ncbi && \
+ cp -p $(TOP)/tools/vdb-copy/vdb-copy.kfg $(INST_BINDIR)/ncbi/ ; \
+ if [ -f $(BINDIR)/ncbi/default.kfg ] ; then \
+ if [ -f $(INST_BINDIR)/ncbi/default.kfg ] ; then \
+ mv -v $(INST_BINDIR)/ncbi/default.kfg \
+ $(INST_BINDIR)/ncbi/default.kfg.orig; \
+ fi; \
+ cp -p $(BINDIR)/ncbi/default.kfg $(INST_BINDIR)/ncbi ; \
+ fi; \
+ if [ -f $(BINDIR)/ncbi/certs.kfg ] ; then \
+ if [ -f $(INST_BINDIR)/ncbi/certs.kfg ] ; then \
+ mv -v $(INST_BINDIR)/ncbi/certs.kfg \
+ $(INST_BINDIR)/ncbi/certs.kfg.orig; \
+ fi; \
+ cp -p $(BINDIR)/ncbi/certs.kfg $(INST_BINDIR)/ncbi ; \
+ fi ) && echo done
+endif
+
+#-------------------------------------------------------------------------------
+# uninstall
+#
+
+TO_UNINSTALL = $(addsuffix *,$(addprefix $(INST_BINDIR)/,$(TOOLS_TO_INSTALL) magic))
+ifneq (true, $(LINUX_ROOT))
+ TO_UNINSTALL += $(INST_BINDIR)/ncbi/certs.kfg $(INST_BINDIR)/ncbi/ncbi-vdb.kfg $(INST_BINDIR)/ncbi/default.kfg $(INST_BINDIR)/ncbi/vdb-copy.kfg
+endif
+TO_UNINSTALL_AS_ROOT = $(ROOT)/etc/ncbi/certs.kfg $(ROOT)/etc/ncbi/default.kfg $(ROOT)/etc/ncbi/vdb-copy.kfg $(PROFILE_FILE).sh $(PROFILE_FILE).csh
+
+uninstall:
+ @ echo "Uninstalling sra-tools from $(INST_BINDIR)..."
+ rm -rf $(TO_UNINSTALL)
+ifeq (true, $(LINUX_ROOT))
+ @ echo "Uninstalling $(TO_UNINSTALL_AS_ROOT) ..."
+ @ rm -rf $(TO_UNINSTALL_AS_ROOT)
+endif
+ @ echo "done."
+
+.PHONY: install installexes uninstall
diff --git a/build/Makefile.linux b/build/Makefile.linux
new file mode 100644
index 0000000..b14b33f
--- /dev/null
+++ b/build/Makefile.linux
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# default compiler
+ifeq (,$(COMP))
+ COMP = gcc
+endif
+
+# handle attempts to set cross-compilation architecture
+# note that if your installation is set up for cross compilation,
+# you can try to enable it on your own.
+ifeq (i386,$(ARCH))
+i386:
+ @ true
+x86_64:
+ @ echo "Linux builds do not support cross-compilation to this architecture"
+endif
+
+ifeq (x86_64,$(ARCH))
+i386:
+ @ echo "Linux builds do not support cross-compilation to this architecture"
+x86_64:
+ @ true
+endif
+
+.PHONY: i386 x86_64
+
+
+# library prefix
+LPFX = lib
+
+# file extensions
+OBJX = o
+LOBX = pic.o
+LIBX = a
+SHLX = so
+
+# compilation defines
+DEFINES := -DLINUX -DUNIX -D_GNU_SOURCE -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DPKGNAME=linux$(BITS)
+
+# linux is a Unix variant
+OS_DAD = unix
+
+# flex+bison: on Mac, use source-controlled generated .c/.h files
+YACC = @ true
+LEX = @ true
+
+# build matrix
+COMPILERS = GCC # ICC
+
+# copy without following symlinks
+COPY = cp -P
+
+# valgrind
+VALGRIND = export NCBI_VALGRIND=ncbi; valgrind --error-exitcode=1 --suppressions=$(TOP)/build/valgrind.suppress --show-reachable=no
+
+VALGRIND_TARGETS = $(addprefix vg-,$(TEST_TOOLS))
+
+valgrind: $(VALGRIND_TARGETS)
+
+vg-test-%: test-%
+ $(VALGRIND) $(TEST_BINDIR)/$^
+
+vg-wb-test-%: wb-test-%
+ $(VALGRIND) $(TEST_BINDIR)/$^
diff --git a/build/Makefile.rpm b/build/Makefile.rpm
new file mode 100644
index 0000000..aeae92f
--- /dev/null
+++ b/build/Makefile.rpm
@@ -0,0 +1,174 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#VERBOSE=-v
+
+# determine shell environment ($CONFIG_FILE)
+include $(TOP)/build/Makefile.shell
+
+# load build configuration ($TARGDIR) ($VERSION)
+include $(CONFIG_FILE)
+
+# $TOOLS_TO_INSTALL
+include $(TOP)/build/Makefile.tools
+ifeq (1,$(HAVE_HDF5))
+ TOOLS_TO_INSTALL += pacbio-load
+endif
+
+REVISION=0
+PKGDIR=$(TARGDIR)/rpmbuild
+RPM =$(PKGDIR)/RPMS/$(ARCH)/sra-toolkit-$(VERSION)-$(REVISION).$(ARCH).rpm
+SRC =$(PKGDIR)/SOURCES/sra-toolkit-$(VERSION).tar.gz
+SPEC=$(PKGDIR)/SPECS/sra-toolkit.spec
+DST =$(PKGDIR)/sra-toolkit-$(VERSION)
+TGZ=$(DST).tar.gz
+
+clean_rpm:
+ echo 'DEBUGGING RPM: clean_rpm'
+ rm -rf $(DST) $(RPM) $(SPEC) $(SRC) $(TGZ)
+
+rpm: $(RPM)
+# echo DEBUGGING RPM: rpm $(TOP)/$(MODULE)
+
+$(RPM): $(SPEC) $(SRC)
+# echo 'DEBUGGING RPM: (RPM)'
+ rpmbuild --define "_topdir $(PKGDIR)" --define "_tmppath %{_topdir}/tmp" \
+ -bb $(SPEC)
+
+SRC_DEPS = \
+ $(DST)/etc/ncbi/default.kfg \
+ $(DST)/etc/ncbi/certs.kfg \
+ $(DST)/etc/ncbi/schema.kfg \
+ $(DST)/etc/ncbi/vdb-copy.kfg \
+ $(DST)/usr/share/ncbi/schema
+
+$(SRC): $(SRC_DEPS)
+ echo 'DEBUGGING RPM: (SRC)'
+ chmod -R g-w $(DST)
+ cd $(PKGDIR) ; tar $(VERBOSE) -zcf $(TGZ) --owner 0 --group 0 \
+ sra-toolkit-$(VERSION)
+ mkdir $(VERBOSE) -p $(PKGDIR)/SOURCES
+ cp $(VERBOSE) -p $(TGZ) $@
+
+$(DST)/etc/ncbi/default.kfg: $(DST)
+ echo 'DEBUGGING RPM: (/etc/ncbi/default.kfg)'
+ rsync $(VERBOSE) -l --chmod=g-w $(VDB_LIBDIR)/ncbi/default.kfg $@
+
+$(DST)/etc/ncbi/certs.kfg: $(DST)
+ echo 'DEBUGGING RPM: (/etc/ncbi/certs.kfg)'
+ rsync $(VERBOSE) -l --chmod=g-w $(VDB_LIBDIR)/ncbi/certs.kfg $@
+
+$(DST)/etc/ncbi/schema.kfg: $(DST)
+ echo 'DEBUGGING RPM: (/etc/ncbi/schema.kfg)'
+ echo '/vdb/schema/paths = "/usr/share/ncbi/schema"' > $@
+
+$(DST)/etc/ncbi/vdb-copy.kfg: $(DST)
+ echo 'DEBUGGING RPM: (/etc/ncbi/vdb-copy.kfg)'
+ rsync $(VERBOSE) -l --chmod=g-w $(BINDIR)/ncbi/vdb-copy.kfg $@
+
+$(DST): $(PKGDIR)
+# echo 'DEBUGGING RPM: (DST)'
+ mkdir $(VERBOSE) -p $(DST)/etc/ncbi
+ mkdir $(VERBOSE) -p $(DST)/usr/bin
+ $(MAKE) -s --no-print-directory -f $(TOP)/build/Makefile.rpm \
+ $(TOOLS_TO_INSTALL)
+
+$(DST)/usr/share/ncbi/schema: $(DST)
+ echo 'DEBUGGING RPM: (/usr/share/ncbi/schema)'
+ mkdir $(VERBOSE) -p $@
+ rsync $(VERBOSE) -rmloptD --include '*.vschema' --include='*/' \
+ --exclude '*' $(VDB_INCDIR)/* $@
+
+$(PKGDIR):
+ echo 'DEBUGGING RPM: (PKGDIR)'
+ mkdir $(VERBOSE) -p $@/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}
+
+$(TOOLS_TO_INSTALL):
+# echo 'DEBUGGING RPM: (TOOLS_TO_INSTALL)'
+ - ( test -f $(BINDIR)/$@ || ( echo "$@ not found" && false ) ) && \
+ rsync $(VERBOSE) -l $(BINDIR)/$@ $(BINDIR)/$@$(VERSION_EXEX) \
+ $(BINDIR)/$@$(MAJVERS_EXEX) $(DST)/usr/bin
+
+$(SPEC): $(PKGDIR) $(TOP)/build/Makefile.rpm
+# echo 'DEBUGGING RPM: (SPEC)'
+ mkdir -p $(PKGDIR)/SPECS
+ printf \
+"%%define __spec_install_post %%{nil}\n"\
+"%%define debug_package %%{nil}\n"\
+"%%define __os_install_post %%{_dbpath}/brp-compress\n"\
+"\n"\
+"Summary: SRA Toolkit package\n"\
+"Name: sra-toolkit\n"\
+"Version: $(VERSION)\n"\
+"Release: $(REVISION)\n"\
+"License: Public Domain\n"\
+"Group: NCBI/VDB\n"\
+"SOURCE0 : %%{name}-%%{version}.tar.gz\n"\
+"URL: http://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=software\n"\
+"\n"\
+"BuildRoot: %%{_tmppath}/%%{name}-%%{version}-%%{release}-root\n"\
+"\n"\
+"%%description\n"\
+"%%{summary}\n"\
+"\n"\
+"%%prep\n"\
+"%%setup -q\n"\
+"\n"\
+"%%build\n"\
+"# Empty section.\n"\
+"\n"\
+"%%install\n"\
+"rm -rf %%{buildroot}\n"\
+"mkdir -p %%{buildroot}\n"\
+"\n"\
+"# in builddir\n"\
+"cp -a * %%{buildroot}\n"\
+"\n"\
+"%%clean\n"\
+"rm -rf %%{buildroot}\n"\
+"\n"\
+"%%files\n"\
+"%%defattr(-,root,root,-)\n"\
+"%%{_bindir}/*\n"\
+"/etc/ncbi/*\n"\
+"/usr/share/ncbi/schema/*/*\n"\
+"\n"\
+"%%post\n"\
+"if [ -e /etc/profile.d/sra-tools.csh ] || [ -e /etc/profile.d/sra-tools.sh ]"\
+"\n"\
+"then\n"\
+" FOUND=1\n"\
+"fi\n"\
+'if [ "$$FOUND" != "" ] ; then'\
+"\n"\
+" echo User installation of sra-tools is found.\n"\
+" if [ -e /etc/profile.d/sra-tools.csh ] ; then\n"\
+" mv -v /etc/profile.d/sra-tools.csh /etc/profile.d/sra-tools.csh.bak\n"\
+" fi\n"\
+" if [ -e /etc/profile.d/sra-tools.sh ] ; then\n"\
+" mv -v /etc/profile.d/sra-tools.sh /etc/profile.d/sra-tools.sh.bak\n"\
+" fi\n"\
+" echo /etc/profile.d/sra-tools.[c]sh was updated.\n"\
+" echo You might need to relogin to have your PATH variable updated.\n"\
+"fi\n" > $@
diff --git a/build/Makefile.rules b/build/Makefile.rules
new file mode 100644
index 0000000..8a59863
--- /dev/null
+++ b/build/Makefile.rules
@@ -0,0 +1,110 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+## build rules
+LOC_INFO = -D__mod_name__=$(MODULE) -D__file_name__=$*
+
+# executable image
+%.$(OBJX): %.c
+ $(CC) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=c
+%.$(OBJX): %.cpp
+ $(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cpp
+%.$(OBJX): %.cxx
+ $(CP) -o $@ $(OPT) $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized executable image
+%.nopt.$(OBJX): %.c
+ $(CC) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=c
+%.nopt.$(OBJX): %.cpp
+ $(CP) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=cpp
+%.nopt.$(OBJX): %.cxx
+ $(CP) -o $@ $(NOPT) $< $(LOC_INFO) -D__file_ext__=cxx
+
+# relocatable image
+%.$(LOBX): %.c
+ $(CC) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.$(LOBX): %.cpp
+ $(CP) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.$(LOBX): %.cxx
+ $(CP) -o $@ -fPIC $(OPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized relocatable image
+%.nopt.$(LOBX): %.c
+ $(CC) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.nopt.$(LOBX): %.cpp
+ $(CP) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.nopt.$(LOBX): %.cxx
+ $(CP) -o $@ -fPIC $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# non-optimized relocatable image with persisted image byte swapping
+%.swap.nopt.$(LOBX): %.c
+ $(CC) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=c
+%.swap.nopt.$(LOBX): %.cpp
+ $(CP) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cpp
+%.swap.nopt.$(LOBX): %.cxx
+ $(CP) -o $@ -fPIC -DSWAP_PERSISTED $(NOPT) -D_LIBRARY $< $(LOC_INFO) -D__file_ext__=cxx
+
+# assembly
+%.$(OBJX) %.$(LOBX): %.s
+ $(CC) -o $@ $<
+
+# assembly language output
+%.s: %.c
+ $(CC) -S -o $@ $(OPT) $<
+%.s: %.cpp
+ $(CP) -S -o $@ $(OPT) $<
+%.s: %.cxx
+ $(CP) -S -o $@ $(OPT) $<
+
+%.nopt.s: %.c
+ $(CC) -S -o $@ $(NOPT) $<
+%.nopt.s: %.cpp
+ $(CP) -S -o $@ $(NOPT) $<
+%.nopt.s: %.cxx
+ $(CP) -S -o $@ $(NOPT) $<
+
+%.pic.s: %.c
+ $(CC) -S -o $@ -fPIC $(OPT) $<
+%.pic.s: %.cpp
+ $(CP) -S -o $@ -fPIC $(OPT) $<
+%.pic.s: %.cxx
+ $(CP) -S -o $@ -fPIC $(OPT) $<
+
+%.nopt.pic.s: %.c
+ $(CC) -S -o $@ -fPIC $(NOPT) $<
+%.nopt.pic.s: %.cpp
+ $(CP) -S -o $@ -fPIC $(NOPT) $<
+%.nopt.pic.s: %.cxx
+ $(CP) -S -o $@ -fPIC $(NOPT) $<
+
+# yacc and lex
+#%.c: %.y
+# $(YACC) -o $@ $^
+#%.c: %.l
+# $(LEX) -DYY_BUF_SIZE=16777216 -t $< | grep -v '^#line' > $@
+
+# version include generation
+%.vers.h: %.vers
+ $(TOP)/build/make-vers-inc.sh $^ > $@
diff --git a/build/Makefile.scm b/build/Makefile.scm
new file mode 100644
index 0000000..b972029
--- /dev/null
+++ b/build/Makefile.scm
@@ -0,0 +1,94 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: install
+
+# determine a few things
+TOP ?= $(abspath ..)
+include $(TOP)/build/Makefile.env
+
+# current distribution point
+ifeq (linux,$(OS))
+TRACE_SOFTWARE = /panfs/traces01/trace_software/vdb
+endif
+ifeq (mac,$(OS))
+TRACE_SOFTWARE = /net/traces01/trace_software/vdb
+endif
+ifeq (win,$(OS))
+TRACE_SOFTWARE = //panfs/traces01/trace_software/vdb
+endif
+
+
+#-------------------------------------------------------------------------------
+# targets
+#
+INSTALL_TARGETS = \
+ interfaces \
+ schema \
+ os \
+ arch
+
+install: $(INSTALL_TARGETS)
+
+.PHONY: install $(INSTALL_TARGETS)
+
+
+#-------------------------------------------------------------------------------
+# interfaces
+# populates the interfaces directory
+#
+interfaces:
+ @ bash cp.sh $(TOP)/interfaces $(TRACE_SOFTWARE)/interfaces "-name *.h -o -name *.hpp"
+
+
+#-------------------------------------------------------------------------------
+# schema
+# populates the schema directory
+#
+schema:
+ @ bash cp.sh $(TOP)/interfaces $(TRACE_SOFTWARE)/schema "-name *.vschema"
+
+
+#-------------------------------------------------------------------------------
+# operating system
+# populates any os-specific things, such as configuration
+#
+os:
+ @ true
+
+
+#-------------------------------------------------------------------------------
+# architecture
+# populates build results
+#
+arch: arch-$(BUILD)
+
+arch-dbg:
+ @ bash cp.sh $(BINDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/bin "-type d -a -name ncbi -prune -o ! -type d -print"
+ @ bash cp.sh $(LIBDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/lib "-type d -a -name ncbi -prune -o ! -type d -print"
+ @ bash cp.sh $(ILIBDIR) $(TRACE_SOFTWARE)/$(OS)/debug/$(ARCH)/ilib "! -type d -print"
+
+arch-rel:
+ @ bash cp.sh $(BINDIR) $(TRACE_SOFTWARE)/$(OS)/release/$(ARCH)/bin "-type d -a -name ncbi -prune -o ! -type d -print"
+ @ bash cp.sh $(LIBDIR) $(TRACE_SOFTWARE)/$(OS)/release/$(ARCH)/lib "-type d -a -name ncbi -prune -o ! -type d -print"
diff --git a/build/Makefile.shell b/build/Makefile.shell
new file mode 100644
index 0000000..f532a80
--- /dev/null
+++ b/build/Makefile.shell
@@ -0,0 +1,189 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+CONFIG_FILE = $(TOP)/build/Makefile.config
+ifeq (no, $(shell test -f $(CONFIG_FILE) && echo yes || echo no))
+ $(error "*** File '$(CONFIG_FILE)' is missing. Please run $(TOP)/configure")
+endif
+
+# determine OS
+UNAME = $(shell uname -s)
+
+ifeq (Darwin, $(UNAME))
+ HOST_OS = mac
+endif
+ifeq (Linux, $(UNAME))
+ HOST_OS = linux
+ OS_DISTRIBUTOR = $(shell lsb_release -si)
+ EXECMDF = $(TOP)/build/ld.linux.exe_cmd.sh
+ ifeq (no, $(shell test -f $(EXECMDF) && echo yes || echo no))
+ $(error "*** File '$(EXECMDF)' is missing. Please run $(TOP)/configure")
+ endif
+endif
+ifeq (SunOS, $(UNAME))
+ HOST_OS = sun
+ ARCHITECTURES = x86_64 i386
+endif
+ifeq (xCYGWIN, $(findstring xCYGWIN,x$(UNAME)))
+ HOST_OS = win
+endif
+ifeq (xMINGW, $(findstring xMINGW,x$(UNAME)))
+ HOST_OS = win
+endif
+
+# assume build OS is the same as host OS
+OS = $(HOST_OS)
+BUILD_OS = $(OS)
+
+# determine ARCH
+ARCHITECTURES = default
+ifeq (mac,$(HOST_OS))
+ HOST_ARCH = $(shell $(TOP)/build/mac.arch.sh)
+ OS_ARCH = $(shell perl $(TOP)/setup/os-arch.perl)
+ CONFIG_FILE_OA = $(TOP)/build/Makefile.config.$(OS_ARCH)
+ ifeq (no, $(shell test -f $(CONFIG_FILE_OA) && echo yes || echo no))
+ $(error "*** File '$(CONFIG_FILE_OA)' is missing. Please run $(TOP)/configure")
+ endif
+ ifeq (no, $(shell grep CONFIGURE_FOUND_XML2 $(CONFIG_FILE_OA) && echo yes || echo no))
+ $(error "*** 'CONFIGURE_FOUND_XML2' is missing in $(CONFIG_FILE_OA). Please run $(TOP)/configure")
+ endif
+else
+ MARCH = $(shell uname -m)
+
+ ifeq (i386, $(MARCH))
+ HOST_ARCH = i386
+ endif
+ ifeq (i486, $(MARCH))
+ HOST_ARCH = i386
+ endif
+ ifeq (i586, $(MARCH))
+ HOST_ARCH = i386
+ endif
+ ifeq (i686, $(MARCH))
+ ifeq (WOW64x, $(findstring WOW64x,$(UNAME)x))
+ # 64-bit capable Cygwin. Analyze the version of cl to set the corect architecture
+ CL = $(shell cl.exe 2>&1 >/dev/null)
+ ifeq (for x64, $(findstring for x64, $(CL)))
+ HOST_ARCH = x86_64
+ else
+ HOST_ARCH = i386
+ endif
+ else
+ HOST_ARCH = i386
+ endif
+ endif
+ ifeq (x86_64, $(MARCH))
+ HOST_ARCH = x86_64
+ endif
+ ifeq (i86pc, $(MARCH))
+ HOST_ARCH = x86_64
+ ARCHITECTURES = x86_64 i386
+ endif
+ ifeq (sun4v,$(MARCH))
+ HOST_ARCH = sparc64
+ ARCHITECTURES = sparc64 sparc32
+ endif
+endif
+
+ARCH = $(HOST_ARCH)
+REMOTE_ARCH = $(ARCH)
+
+# pick up dependencies from object directory
+ifdef SRCDIR
+ include $(wildcard *.d)
+endif
+
+# determine SRCDIR
+ifdef MODULE
+ SRCDIR=$(TOP)/$(MODULE)
+else
+ SRCDIR=$(TOP)
+endif
+
+# set COMP, LNKG and BUILD
+COMP = $(shell test -f $(TOP)/build/COMP && mv $(TOP)/build/COMP $(TOP)/build/COMP.$(OS); test -f $(TOP)/build/COMP.$(OS) && cat $(TOP)/build/COMP.$(OS) || echo gcc)
+LNKG = $(shell test -f $(TOP)/build/STATIC && mv $(TOP)/build/STATIC $(TOP)/build/LNKG.$(OS) && echo stat > $(TOP)/build/LNKG.$(OS); test -f $(TOP)/build/LNKG.$(OS) && cat $(TOP)/build/LNKG.$(OS) || echo stat)
+BUILD = $(shell test -f $(TOP)/build/BUILD && mv $(TOP)/build/BUILD $(TOP)/build/BUILD.$(OS); test -f $(TOP)/build/BUILD.$(OS) && cat $(TOP)/build/BUILD.$(OS) || echo dbg)
+TOOLSET := $(COMP)
+
+ifdef USE_GCC_IF_ICC
+ ifeq (icc,$(COMP))
+ COMP = gcc
+ endif
+ ifeq (clang,$(COMP))
+ COMP = gcc
+ endif
+endif
+
+RHOSTS = $(shell (test -d $(TOP)/rhosts && test -n "$$(ls $(TOP)/rhosts/)") && \
+ ls $(TOP)/rhosts/ | xargs -n1 basename | grep -v CVS | grep -v example | grep -v "~")
+
+# detect RHOST
+HAS_RHOST = $(shell test -f $(TOP)/build/RHOST.$(HOST_OS) && echo yes || echo no)
+ifeq (yes,$(HAS_RHOST))
+ include $(TOP)/build/RHOST.$(HOST_OS)
+ ifeq (,$(RPORT))
+ RPORT = 20000
+ endif
+ BUILD_OS = r$(OS)
+ REMOTE_ARCH = $(ARCH)
+ ifeq (,$(LHOME))
+ LHOME=$(HOME)
+ endif
+endif
+
+# set OUTDIR
+ifndef OUTDIR
+ OUTDIR = $(shell test -f $(TOP)/build/OUTDIR && mv $(TOP)/build/OUTDIR $(TOP)/build/OUTDIR.$(BUILD_OS); test -f $(TOP)/build/OUTDIR.$(BUILD_OS) && cat $(TOP)/build/OUTDIR.$(BUILD_OS) || echo $(TOP))
+ ifeq (,$(OUTDIR))
+ OUTDIR = $(TOP)
+ endif
+endif
+ifeq (,$(ROUTDIR))
+ ROUTDIR = $(RHOME)
+endif
+
+ifeq (yes,$(HAS_RHOST))
+ # set remote flags for calling win-cc.sh and ld.sh)
+ RFLAGS=--rhome "$(RHOME)" --lhome "$(LHOME)" --rhost "$(RHOST)" --rport $(RPORT) --proxy_tool "$(PROXY_TOOL)" \
+ --loutdir "$(OUTDIR)" --routdir "$(ROUTDIR)"
+ # RWORKDIR can be redefined by individual makefiles as needed
+ RWORKDIR = .
+ RUN_REMOTELY = $(TOP)/build/run_remotely.sh $(PROXY_TOOL) $(RHOST) $(RPORT) $(RHOME) $(LHOME) $(RWORKDIR) $(ROUTDIR) $(OUTDIR)
+endif
+
+# determine BITS
+ifeq (x86_64, $(ARCH))
+ BITS = 64
+endif
+ifeq (sparc64, $(ARCH))
+ BITS = 64
+endif
+ifeq (i386, $(ARCH))
+ BITS = 32
+endif
+ifeq (sparc32, $(ARCH))
+ BITS = 32
+endif
+
diff --git a/build/Makefile.targets b/build/Makefile.targets
new file mode 100644
index 0000000..0690964
--- /dev/null
+++ b/build/Makefile.targets
@@ -0,0 +1,117 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# defines make targets commonly used in non-leaf directories:
+# default
+# all
+# std
+# clean
+# runtests
+# slowtests
+# valgrind
+#
+# requires $(SUBDIRS) to be defined
+#
+# to control which subdirectories are affected by a specific target, define
+# SUBDIRS_CLEAN, SUBDIRS_RUNTESTS, etc., like this:
+# SUBDIRS_CLEAN = $(addsuffix _clean, du4r1 dir2 dir3)
+#
+
+default: $(SUBDIRS) $(DFLT_EXTRA)
+
+ALL_EXTRA ?= $(DFLT_EXTRA)
+STD_EXTRA ?= $(DFLT_EXTRA)
+
+#-------------------------------------------------------------------------------
+# all
+#
+SUBDIRS_ALL ?= $(addsuffix _all,$(SUBDIRS))
+
+all: $(SUBDIRS_ALL) $(ALL_EXTRA)
+
+$(SUBDIRS_ALL):
+ @ $(MAKE) -C $(subst _all,,$@) all
+
+.PHONY: all $(SUBDIRS_ALL)
+
+#-------------------------------------------------------------------------------
+# std
+#
+SUBDIRS_STD = $(addsuffix _std,$(SUBDIRS))
+
+std: $(SUBDIRS_STD) $(STD_EXTRA)
+
+$(SUBDIRS_STD):
+ @ $(MAKE) -C $(subst _std,,$@) std
+
+.PHONY: std $(SUBDIRS_STD)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+SUBDIRS_CLEAN ?= $(addsuffix _clean,$(SUBDIRS))
+
+clean: $(SUBDIRS_CLEAN)
+
+$(SUBDIRS_CLEAN):
+ @ $(MAKE) -s -C $(subst _clean,,$@) clean
+
+.PHONY: clean $(SUBDIRS_CLEAN)
+
+#-------------------------------------------------------------------------------
+# runtests
+#
+SUBDIRS_RUNTESTS ?= $(addsuffix _runtests,$(SUBDIRS))
+
+runtests: std $(SUBDIRS_RUNTESTS)
+
+$(SUBDIRS_RUNTESTS):
+ @ $(MAKE) -s -C $(subst _runtests,,$@) runtests
+
+.PHONY: runtests $(SUBDIRS_RUNTESTS)
+
+#-------------------------------------------------------------------------------
+# slowtests
+#
+SUBDIRS_SLOWTESTS ?= $(addsuffix _slowtests, $(SUBDIRS))
+
+slowtests: $(SUBDIRS_SLOWTESTS)
+
+$(SUBDIRS_SLOWTESTS):
+ @ $(MAKE) -C $(subst _slowtests,,$@) slowtests
+
+.PHONY: slowtests $(SUBDIRS_SLOWTESTS)
+
+#-------------------------------------------------------------------------------
+# valgrind
+#
+SUBDIRS_VALGRIND ?= $(addsuffix _valgrind, $(SUBDIRS))
+
+valgrind: $(SUBDIRS_VALGRIND)
+
+$(SUBDIRS_VALGRIND):
+ @ $(MAKE) -C $(subst _valgrind,,$@) valgrind
+
+.PHONY: valgrind $(SUBDIRS_VALGRIND)
+
diff --git a/build/Makefile.tools b/build/Makefile.tools
new file mode 100644
index 0000000..1fd5827
--- /dev/null
+++ b/build/Makefile.tools
@@ -0,0 +1,40 @@
+TOOLS_TO_INSTALL = \
+ abi-dump \
+ abi-load \
+ align-info \
+ bam-load \
+ cache-mgr \
+ cg-load \
+ copycat \
+ fastdump \
+ fastq-dump \
+ fastq-load \
+ helicos-load \
+ illumina-dump \
+ illumina-load \
+ kar \
+ kdbmeta \
+ kget \
+ latf-load \
+ prefetch \
+ rcexplain \
+ remote-fuser \
+ sam-dump \
+ sff-dump \
+ sff-load \
+ srapath \
+ sra-pileup \
+ sra-sort \
+ sra-stat \
+ srf-load \
+ test-sra \
+ vdb-config \
+ vdb-copy \
+ vdb-decrypt \
+ vdb-dump \
+ vdb-encrypt \
+ vdb-lock \
+ vdb-passwd \
+ vdb-unlock \
+ vdb-validate \
+
diff --git a/build/Makefile.vers b/build/Makefile.vers
new file mode 100644
index 0000000..453b9a2
--- /dev/null
+++ b/build/Makefile.vers
@@ -0,0 +1,26 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# SRA-TOOLS and library version
+VERSION = 2.8.1
diff --git a/build/Xcode/asm-trace/asm-trace.xcodeproj/project.pbxproj b/build/Xcode/asm-trace/asm-trace.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..43a4878
--- /dev/null
+++ b/build/Xcode/asm-trace/asm-trace.xcodeproj/project.pbxproj
@@ -0,0 +1,4444 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 9D7357F311779B2A009EA3E4 /* make-env */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 9D7357F611779B49009EA3E4 /* Build configuration list for PBXAggregateTarget "make-env" */;
+ buildPhases = (
+ 9D7357F211779B2A009EA3E4 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "make-env";
+ productName = "make-env";
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 9D1235BC14F571AC00ECC72C /* config-grammar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1235B414F571AC00ECC72C /* config-grammar.c */; };
+ 9D1235BE14F571AC00ECC72C /* config-lex.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1235B614F571AC00ECC72C /* config-lex.c */; };
+ 9D1EC483122D914C00C11287 /* printf.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1EC47F122D914C00C11287 /* printf.c */; };
+ 9D1EC484122D914C00C11287 /* status-rc-strings.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1EC480122D914C00C11287 /* status-rc-strings.c */; };
+ 9D1EC485122D914C00C11287 /* status-rc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1EC481122D914C00C11287 /* status-rc.c */; };
+ 9D1EC486122D914C00C11287 /* status.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1EC482122D914C00C11287 /* status.c */; };
+ 9D31EC9D1176680A003CDA5E /* bstpersist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAFE11766366003CDA5E /* bstpersist.c */; };
+ 9D31EC9E1176680A003CDA5E /* container.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAFF11766366003CDA5E /* container.c */; };
+ 9D31EC9F1176680B003CDA5E /* cp1252.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0011766366003CDA5E /* cp1252.c */; };
+ 9D31ECA01176680B003CDA5E /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0111766366003CDA5E /* crc32.c */; };
+ 9D31ECA11176680C003CDA5E /* data-buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0211766366003CDA5E /* data-buffer.c */; };
+ 9D31ECA21176680C003CDA5E /* iso8859-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0311766366003CDA5E /* iso8859-1.c */; };
+ 9D31ECA31176680D003CDA5E /* iso8859.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0411766366003CDA5E /* iso8859.c */; };
+ 9D31ECA41176680D003CDA5E /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0511766366003CDA5E /* log.c */; };
+ 9D31ECA51176680E003CDA5E /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0611766366003CDA5E /* md5.c */; };
+ 9D31ECA61176680E003CDA5E /* namelist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0711766366003CDA5E /* namelist.c */; };
+ 9D31ECA71176680F003CDA5E /* pack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0811766366003CDA5E /* pack.c */; };
+ 9D31ECA81176680F003CDA5E /* pbstree.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0911766366003CDA5E /* pbstree.c */; };
+ 9D31ECA911766810003CDA5E /* ptpersist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0A11766366003CDA5E /* ptpersist.c */; };
+ 9D31ECAA11766810003CDA5E /* ptrie.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0B11766366003CDA5E /* ptrie.c */; };
+ 9D31ECAB11766811003CDA5E /* rc-idx-tbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0C11766366003CDA5E /* rc-idx-tbl.c */; };
+ 9D31ECAC11766811003CDA5E /* rc-tbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0D11766366003CDA5E /* rc-tbl.c */; };
+ 9D31ECAD11766812003CDA5E /* symtab.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB0E11766366003CDA5E /* symtab.c */; };
+ 9D31ECAE11766813003CDA5E /* syslog.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB191176637A003CDA5E /* syslog.c */; settings = {COMPILER_FLAGS = "-I ../../../libs/klib"; }; };
+ 9D31ECB011766814003CDA5E /* text.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1011766366003CDA5E /* text.c */; };
+ 9D31ECB111766815003CDA5E /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1111766366003CDA5E /* token.c */; };
+ 9D31ECB211766815003CDA5E /* trie.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1211766366003CDA5E /* trie.c */; };
+ 9D31ECB411766816003CDA5E /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1411766366003CDA5E /* unpack.c */; };
+ 9D31ECB511766817003CDA5E /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1511766366003CDA5E /* utf8.c */; };
+ 9D31ECB611766818003CDA5E /* vector.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1611766366003CDA5E /* vector.c */; };
+ 9D31ECB711766818003CDA5E /* vlen-encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1711766366003CDA5E /* vlen-encode.c */; };
+ 9D320AB0142D02B000ACA5AA /* extract_token.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AAE142D02B000ACA5AA /* extract_token.c */; };
+ 9D320AB1142D02B000ACA5AA /* strtonum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AAF142D02B000ACA5AA /* strtonum.c */; };
+ 9D320AB2142D02B000ACA5AA /* extract_token.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AAE142D02B000ACA5AA /* extract_token.c */; };
+ 9D320AB3142D02B000ACA5AA /* strtonum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AAF142D02B000ACA5AA /* strtonum.c */; };
+ 9D320AB6142D02E600ACA5AA /* sprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AB5142D02E600ACA5AA /* sprintf.c */; };
+ 9D320AB7142D02E600ACA5AA /* sprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D320AB5142D02E600ACA5AA /* sprintf.c */; };
+ 9D4DCEAC1423FD9600881098 /* ref-preserve_qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D4DCEAB1423FD9600881098 /* ref-preserve_qual.c */; };
+ 9D4DCEAD1423FD9600881098 /* ref-preserve_qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D4DCEAB1423FD9600881098 /* ref-preserve_qual.c */; };
+ 9D62F42A124D01AE003D38E9 /* bsearch.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D62F428124D01AE003D38E9 /* bsearch.c */; };
+ 9D62F42B124D01AE003D38E9 /* qsort.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D62F429124D01AE003D38E9 /* qsort.c */; };
+ 9D7A40DB13FADBA3003087FF /* SHA-32bit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40D913FADBA3003087FF /* SHA-32bit.c */; };
+ 9D7A40DC13FADBA3003087FF /* SHA-64bit.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40DA13FADBA3003087FF /* SHA-64bit.c */; };
+ 9D7A40E113FADBEE003087FF /* syserrcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40DF13FADBEE003087FF /* syserrcode.c */; };
+ 9D7A40E213FADBEE003087FF /* systime.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40E013FADBEE003087FF /* systime.c */; };
+ 9D7A40FF13FADCFE003087FF /* buffile-write.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40EE13FADCFE003087FF /* buffile-write.c */; };
+ 9D7A410613FADCFE003087FF /* mmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40F513FADCFE003087FF /* mmap.c */; };
+ 9D7A410713FADCFE003087FF /* path-priv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A40F613FADCFE003087FF /* path-priv.h */; };
+ 9D7A410913FADCFE003087FF /* pmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A40F813FADCFE003087FF /* pmem.c */; };
+ 9D7A411613FADD33003087FF /* sysdir-priv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A411213FADD33003087FF /* sysdir-priv.h */; };
+ 9D7A411713FADD33003087FF /* sysfile-priv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A411313FADD33003087FF /* sysfile-priv.h */; };
+ 9D7A413B13FADF74003087FF /* stbarrier.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1D117663AB003CDA5E /* stbarrier.c */; };
+ 9D7A413C13FADF75003087FF /* stcond.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1E117663AB003CDA5E /* stcond.c */; };
+ 9D7A413D13FADF75003087FF /* stlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB1F117663AB003CDA5E /* stlock.c */; };
+ 9D7A413E13FADF76003087FF /* stsem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB20117663AB003CDA5E /* stsem.c */; };
+ 9D7A413F13FADF76003087FF /* stthread.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB21117663AB003CDA5E /* stthread.c */; };
+ 9D7A414013FADF77003087FF /* sttimeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB22117663AB003CDA5E /* sttimeout.c */; };
+ 9D7A414213FADF79003087FF /* syslock.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB2E117663D4003CDA5E /* syslock.c */; };
+ 9D7A415113FADFC6003087FF /* queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A414D13FADFC6003087FF /* queue.c */; };
+ 9D7A415213FADFC6003087FF /* sem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A414E13FADFC6003087FF /* sem.c */; };
+ 9D7A415F13FAE01B003087FF /* queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A414D13FADFC6003087FF /* queue.c */; };
+ 9D7A416013FAE01C003087FF /* sem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A414E13FADFC6003087FF /* sem.c */; };
+ 9D7A416113FAE023003087FF /* syscond.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB2B117663C6003CDA5E /* syscond.c */; };
+ 9D7A416213FAE024003087FF /* syslock.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A414C13FADFC6003087FF /* syslock.c */; };
+ 9D7A416313FAE026003087FF /* systhread.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB2C117663C6003CDA5E /* systhread.c */; };
+ 9D7A416413FAE027003087FF /* systimeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB2D117663C6003CDA5E /* systimeout.c */; };
+ 9D7A422313FAE325003087FF /* btree.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A417D13FAE1DA003087FF /* btree.c */; };
+ 9D7A422413FAE333003087FF /* dbmgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419213FAE1DA003087FF /* dbmgr-cmn.c */; };
+ 9D7A423913FAE40C003087FF /* libkdb-cmn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A417813FAE192003087FF /* libkdb-cmn.a */; };
+ 9D7A423B13FAE433003087FF /* coldata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418013FAE1DA003087FF /* coldata.c */; };
+ 9D7A423C13FAE435003087FF /* colidx.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418313FAE1DA003087FF /* colidx.c */; };
+ 9D7A423E13FAE43F003087FF /* colidx0.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418513FAE1DA003087FF /* colidx0.c */; };
+ 9D7A423F13FAE444003087FF /* colidx1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418713FAE1DA003087FF /* colidx1.c */; };
+ 9D7A424013FAE446003087FF /* colidx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418913FAE1DA003087FF /* colidx2.c */; };
+ 9D7A424113FAE470003087FF /* column-cc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418A13FAE1DA003087FF /* column-cc.c */; };
+ 9D7A424213FAE477003087FF /* column.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418C13FAE1DA003087FF /* column.c */; };
+ 9D7A424313FAE47A003087FF /* database-cc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A418D13FAE1DA003087FF /* database-cc.c */; };
+ 9D7A424513FAE482003087FF /* database.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419013FAE1DA003087FF /* database.c */; };
+ 9D7A424613FAE484003087FF /* dbcc-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419113FAE1DA003087FF /* dbcc-cmn.c */; };
+ 9D7A424713FAE48A003087FF /* dbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419413FAE1DA003087FF /* dbmgr.c */; };
+ 9D7A424813FAE499003087FF /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419B13FAE1DA003087FF /* index.c */; };
+ 9D7A424913FAE4B0003087FF /* kdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419D13FAE1DA003087FF /* kdb.c */; };
+ 9D7A424A13FAE4B4003087FF /* meta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A113FAE1DA003087FF /* meta.c */; };
+ 9D7A424B13FAE4B8003087FF /* table-cc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A413FAE1DA003087FF /* table-cc.c */; };
+ 9D7A424C13FAE4BA003087FF /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A613FAE1DA003087FF /* table.c */; };
+ 9D7A424D13FAE4C1003087FF /* trieidx-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A813FAE1DA003087FF /* trieidx-v1.c */; };
+ 9D7A424E13FAE4C2003087FF /* trieidx-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A913FAE1DA003087FF /* trieidx-v2.c */; };
+ 9D7A424F13FAE4C9003087FF /* u64idx-v3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41AC13FAE1DA003087FF /* u64idx-v3.c */; };
+ 9D7A425813FAE616003087FF /* idstats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419613FAE1DA003087FF /* idstats.c */; };
+ 9D7A425913FAE629003087FF /* trieval-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41AA13FAE1DA003087FF /* trieval-v1.c */; };
+ 9D7A425A13FAE62E003087FF /* ptrieval-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A213FAE1DA003087FF /* ptrieval-v1.c */; };
+ 9D7A425B13FAE63F003087FF /* trieval-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41AB13FAE1DA003087FF /* trieval-v2.c */; };
+ 9D7A425C13FAE644003087FF /* ptrieval-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41A313FAE1DA003087FF /* ptrieval-v2.c */; };
+ 9D7A426113FAE67B003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A426B13FAE6A5003087FF /* libkdb-cmn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A417813FAE192003087FF /* libkdb-cmn.a */; };
+ 9D7A426C13FAE6A7003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A426D13FAE6C0003087FF /* wkdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C213FAE1DA003087FF /* wkdb.c */; };
+ 9D7A426E13FAE6C5003087FF /* wdbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41BB13FAE1DA003087FF /* wdbmgr.c */; };
+ 9D7A426F13FAE6CC003087FF /* wdatabase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41BA13FAE1DA003087FF /* wdatabase.c */; };
+ 9D7A427013FAE6D5003087FF /* wtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C513FAE1DA003087FF /* wtable.c */; };
+ 9D7A427113FAE6E1003087FF /* wcolumn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41B813FAE1DA003087FF /* wcolumn.c */; };
+ 9D7A427213FAE6EB003087FF /* wcoldata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41AE13FAE1DA003087FF /* wcoldata.c */; };
+ 9D7A427413FAE89E003087FF /* wcolidx.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41B013FAE1DA003087FF /* wcolidx.c */; };
+ 9D7A427513FAE8A4003087FF /* wcolidx0.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41B213FAE1DA003087FF /* wcolidx0.c */; };
+ 9D7A427613FAE8A7003087FF /* wcolidx1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41B413FAE1DA003087FF /* wcolidx1.c */; };
+ 9D7A427713FAE8A8003087FF /* wcolidx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41B613FAE1DA003087FF /* wcolidx2.c */; };
+ 9D7A427813FAE8D6003087FF /* widxblk.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41BE13FAE1DA003087FF /* widxblk.c */; };
+ 9D7A427913FAE8DB003087FF /* wmeta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C313FAE1DA003087FF /* wmeta.c */; };
+ 9D7A427A13FAE8E7003087FF /* windex.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C013FAE1DA003087FF /* windex.c */; };
+ 9D7A427B13FAE8ED003087FF /* wtrieidx-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C613FAE1DA003087FF /* wtrieidx-v1.c */; };
+ 9D7A427C13FAE8EE003087FF /* wtrieidx-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C713FAE1DA003087FF /* wtrieidx-v2.c */; };
+ 9D7A427D13FAE8F4003087FF /* wu64idx-v3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A41C813FAE1DA003087FF /* wu64idx-v3.c */; };
+ 9D7A427E13FAE90F003087FF /* idxblk.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A419813FAE1DA003087FF /* idxblk.c */; };
+ 9D7A42E413FAEA2A003087FF /* dbmgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429F13FAEA20003087FF /* dbmgr-cmn.c */; };
+ 9D7A42E513FAEA36003087FF /* schema-tok.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D213FAEA21003087FF /* schema-tok.c */; };
+ 9D7A42E613FAEA3C003087FF /* schema-parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42CD13FAEA21003087FF /* schema-parse.c */; };
+ 9D7A42E713FAEA45003087FF /* schema-type.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D413FAEA21003087FF /* schema-type.c */; };
+ 9D7A42E813FAEA4C003087FF /* schema-func.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42CB13FAEA21003087FF /* schema-func.c */; };
+ 9D7A42E913FAEA54003087FF /* schema-prod.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D013FAEA21003087FF /* schema-prod.c */; };
+ 9D7A42EA13FAEA5A003087FF /* schema-expr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C913FAEA21003087FF /* schema-expr.c */; };
+ 9D7A42EB13FAEA60003087FF /* schema-eval.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C813FAEA21003087FF /* schema-eval.c */; };
+ 9D7A42EC13FAEA65003087FF /* schema-tbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D113FAEA21003087FF /* schema-tbl.c */; };
+ 9D7A42ED13FAEA68003087FF /* schema-db.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C513FAEA21003087FF /* schema-db.c */; };
+ 9D7A42EE13FAEA6E003087FF /* schema-dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C613FAEA21003087FF /* schema-dump.c */; };
+ 9D7A42EF13FAEA72003087FF /* schema-int.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42CC13FAEA21003087FF /* schema-int.c */; };
+ 9D7A42F013FAEA7C003087FF /* schema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D513FAEA21003087FF /* schema.c */; };
+ 9D7A42F113FAEA85003087FF /* linker-int.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42AA13FAEA20003087FF /* linker-int.c */; };
+ 9D7A42F213FAEA8D003087FF /* linker-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A913FAEA20003087FF /* linker-cmn.c */; };
+ 9D7A42F313FAEA95003087FF /* database-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429B13FAEA20003087FF /* database-cmn.c */; };
+ 9D7A42F413FAEA98003087FF /* database-load.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429C13FAEA20003087FF /* database-load.c */; };
+ 9D7A42F513FAEAA0003087FF /* table-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D713FAEA21003087FF /* table-cmn.c */; };
+ 9D7A42F613FAEAA1003087FF /* table-load.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D813FAEA21003087FF /* table-load.c */; };
+ 9D7A42F713FAEAAA003087FF /* cursor-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429813FAEA20003087FF /* cursor-cmn.c */; };
+ 9D7A42F813FAEAB2003087FF /* column-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429413FAEA20003087FF /* column-cmn.c */; };
+ 9D7A42F913FAEABD003087FF /* prod-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42BB13FAEA21003087FF /* prod-cmn.c */; };
+ 9D7A42FA13FAEAC0003087FF /* prod-expr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42BC13FAEA21003087FF /* prod-expr.c */; };
+ 9D7A42FB13FAEAC4003087FF /* prod-func.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42BE13FAEA21003087FF /* prod-func.c */; };
+ 9D7A42FC13FAEACB003087FF /* phys-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B713FAEA21003087FF /* phys-cmn.c */; };
+ 9D7A42FD13FAEAD1003087FF /* phys-load.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B813FAEA21003087FF /* phys-load.c */; };
+ 9D7A42FE13FAEADD003087FF /* blob.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429113FAEA20003087FF /* blob.c */; };
+ 9D7A42FF13FAEAE0003087FF /* blob-headers.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A428E13FAEA20003087FF /* blob-headers.c */; };
+ 9D7A430013FAEAE7003087FF /* page-map.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B413FAEA21003087FF /* page-map.c */; };
+ 9D7A430313FAEB42003087FF /* row-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C313FAEA21003087FF /* row-id.c */; };
+ 9D7A430413FAEB43003087FF /* row-len.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C413FAEA21003087FF /* row-len.c */; };
+ 9D7A430513FAEB49003087FF /* fixed-row-len.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A313FAEA20003087FF /* fixed-row-len.c */; };
+ 9D7A430613FAEB93003087FF /* merge.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42AD13FAEA21003087FF /* merge.c */; };
+ 9D7A430713FAEB99003087FF /* split.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42D613FAEA21003087FF /* split.c */; };
+ 9D7A430813FAEBA0003087FF /* compare.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429713FAEA20003087FF /* compare.c */; };
+ 9D7A430913FAEBAE003087FF /* meta-attr-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42AF13FAEA21003087FF /* meta-attr-read.c */; };
+ 9D7A430B13FAEBB1003087FF /* meta-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B113FAEA21003087FF /* meta-read.c */; };
+ 9D7A430C13FAEBB2003087FF /* meta-value.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B213FAEA21003087FF /* meta-value.c */; };
+ 9D7A430D13FAEBBF003087FF /* environment-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A213FAEA20003087FF /* environment-read.c */; };
+ 9D7A431013FAEC78003087FF /* cast.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429313FAEA20003087FF /* cast.c */; };
+ 9D7A431113FAEC7A003087FF /* index_lookup.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A513FAEA20003087FF /* index_lookup.c */; };
+ 9D7A431213FAEC7B003087FF /* index_project.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A613FAEA20003087FF /* index_project.c */; };
+ 9D7A431313FAEC7C003087FF /* parameter-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B613FAEA21003087FF /* parameter-read.c */; };
+ 9D7A431413FAEC7D003087FF /* range-validate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C113FAEA21003087FF /* range-validate.c */; };
+ 9D7A431513FAEC7D003087FF /* redimension.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C213FAEA21003087FF /* redimension.c */; };
+ 9D7A431F13FAED40003087FF /* dbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A113FAEA20003087FF /* dbmgr.c */; };
+ 9D7A432013FAED47003087FF /* linker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42AC13FAEA21003087FF /* linker.c */; };
+ 9D7A432113FAED4E003087FF /* database.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429E13FAEA20003087FF /* database.c */; };
+ 9D7A432213FAED5A003087FF /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DA13FAEA21003087FF /* table.c */; };
+ 9D7A432313FAED61003087FF /* cursor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429A13FAEA20003087FF /* cursor.c */; };
+ 9D7A432413FAED69003087FF /* column.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A429613FAEA20003087FF /* column.c */; };
+ 9D7A432513FAED70003087FF /* prod.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42C013FAEA21003087FF /* prod.c */; };
+ 9D7A432613FAED79003087FF /* phys.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42BA13FAEA21003087FF /* phys.c */; };
+ 9D7A432913FAEDCC003087FF /* libvdb-cmn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A428913FAE9B5003087FF /* libvdb-cmn.a */; };
+ 9D7A432A13FAEDD9003087FF /* libkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A423413FAE3F5003087FF /* libkdb.dylib */; };
+ 9D7A432D13FAEDE5003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A433013FAEDF6003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A434213FAEE66003087FF /* wcolumn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DB13FAEA21003087FF /* wcolumn.c */; };
+ 9D7A434313FAEE67003087FF /* wcursor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DC13FAEA21003087FF /* wcursor.c */; };
+ 9D7A434413FAEE68003087FF /* wdatabase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DD13FAEA21003087FF /* wdatabase.c */; };
+ 9D7A434513FAEE68003087FF /* wdbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DE13FAEA21003087FF /* wdbmgr.c */; };
+ 9D7A434613FAEE69003087FF /* wlinker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42DF13FAEA21003087FF /* wlinker.c */; };
+ 9D7A434713FAEE6A003087FF /* wphys.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42E013FAEA21003087FF /* wphys.c */; };
+ 9D7A434813FAEE6B003087FF /* wprod.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42E113FAEA21003087FF /* wprod.c */; };
+ 9D7A434913FAEE6C003087FF /* wtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42E213FAEA21003087FF /* wtable.c */; };
+ 9D7A434B13FAEECB003087FF /* index_insert.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42A413FAEA20003087FF /* index_insert.c */; };
+ 9D7A434C13FAEED1003087FF /* meta-append.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42AE13FAEA21003087FF /* meta-append.c */; };
+ 9D7A434D13FAEEDB003087FF /* meta-write.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B313FAEA21003087FF /* meta-write.c */; };
+ 9D7A434E13FAEEE2003087FF /* meta-attr-write.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A42B013FAEA21003087FF /* meta-attr-write.c */; };
+ 9D7A435113FAEF00003087FF /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9D7A435213FAEF06003087FF /* libvdb-cmn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A428913FAE9B5003087FF /* libvdb-cmn.a */; };
+ 9D7A435313FAEF0E003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A435613FAEF1F003087FF /* libkmproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A415C13FAE00E003087FF /* libkmproc.a */; };
+ 9D7A435913FAEF26003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A439913FAF20E003087FF /* add-row-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436713FAF20D003087FF /* add-row-id.c */; };
+ 9D7A439A13FAF20E003087FF /* bit_or.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436813FAF20D003087FF /* bit_or.c */; };
+ 9D7A439B13FAF20E003087FF /* bunzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436913FAF20D003087FF /* bunzip.c */; };
+ 9D7A439D13FAF20E003087FF /* ceil.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436B13FAF20D003087FF /* ceil.c */; };
+ 9D7A439F13FAF20E003087FF /* clip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436D13FAF20D003087FF /* clip.c */; };
+ 9D7A43A013FAF20E003087FF /* cut.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436E13FAF20D003087FF /* cut.c */; };
+ 9D7A43A113FAF20E003087FF /* delta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436F13FAF20D003087FF /* delta.c */; };
+ 9D7A43A213FAF20E003087FF /* deriv.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437013FAF20D003087FF /* deriv.c */; };
+ 9D7A43A313FAF20E003087FF /* diff.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437113FAF20D003087FF /* diff.c */; };
+ 9D7A43A413FAF20E003087FF /* echo.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437213FAF20D003087FF /* echo.c */; };
+ 9D7A43A613FAF20E003087FF /* exists.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437413FAF20E003087FF /* exists.c */; };
+ 9D7A43A713FAF20E003087FF /* floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437513FAF20E003087FF /* floor.c */; };
+ 9D7A43A913FAF20E003087FF /* funzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437713FAF20E003087FF /* funzip.c */; };
+ 9D7A43AB13FAF20E003087FF /* integral.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437913FAF20E003087FF /* integral.c */; };
+ 9D7A43AC13FAF20E003087FF /* irzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437A13FAF20E003087FF /* irzip.c */; };
+ 9D7A43B513FAF20E003087FF /* map.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438313FAF20E003087FF /* map.c */; };
+ 9D7A43B713FAF20E003087FF /* max.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438513FAF20E003087FF /* max.c */; };
+ 9D7A43B813FAF20E003087FF /* min.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438613FAF20E003087FF /* min.c */; };
+ 9D7A43B913FAF20E003087FF /* outlier-decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438713FAF20E003087FF /* outlier-decoder.c */; };
+ 9D7A43BB13FAF20E003087FF /* pack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438913FAF20E003087FF /* pack.c */; };
+ 9D7A43BC13FAF20E003087FF /* paste.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438A13FAF20E003087FF /* paste.c */; };
+ 9D7A43BD13FAF20E003087FF /* rand_4na_2na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438B13FAF20E003087FF /* rand_4na_2na.c */; };
+ 9D7A43BE13FAF20E003087FF /* rldecode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438C13FAF20E003087FF /* rldecode.c */; };
+ 9D7A43C013FAF20E003087FF /* round.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438E13FAF20E003087FF /* round.c */; };
+ 9D7A43C113FAF20E003087FF /* simple-sub-select.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438F13FAF20E003087FF /* simple-sub-select.c */; };
+ 9D7A43C213FAF20E003087FF /* subtract-row-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439013FAF20E003087FF /* subtract-row-id.c */; };
+ 9D7A43C313FAF20E003087FF /* sum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439113FAF20E003087FF /* sum.c */; };
+ 9D7A43C413FAF20E003087FF /* trim.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439213FAF20E003087FF /* trim.c */; };
+ 9D7A43C513FAF20E003087FF /* trunc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439313FAF20E003087FF /* trunc.c */; };
+ 9D7A43C613FAF20E003087FF /* undelta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439413FAF20E003087FF /* undelta.c */; };
+ 9D7A43C713FAF20E003087FF /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439513FAF20E003087FF /* unpack.c */; };
+ 9D7A43C813FAF20E003087FF /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439613FAF20E003087FF /* unzip.c */; };
+ 9D7A43C913FAF20E003087FF /* vec-sum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439713FAF20E003087FF /* vec-sum.c */; };
+ 9D7A43CD13FAF23A003087FF /* libvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A431C13FAED2E003087FF /* libvdb.dylib */; };
+ 9D7A43D013FAF245003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A43D613FAF257003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A43DB13FAF274003087FF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC8C117667C6003CDA5E /* libbz2.dylib */; };
+ 9D7A441413FAF3B5003087FF /* qual4_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F213FAF2EF003087FF /* qual4_decode.c */; };
+ 9D7A441513FAF3B5003087FF /* format-spot-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E713FAF2EF003087FF /* format-spot-name.c */; };
+ 9D7A441713FAF3B5003087FF /* fpcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E813FAF2EF003087FF /* fpcodec.c */; };
+ 9D7A441813FAF3B5003087FF /* v0-decompress-init.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440313FAF2EF003087FF /* v0-decompress-init.c */; };
+ 9D7A441913FAF3B5003087FF /* extract-coordinates.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E313FAF2EF003087FF /* extract-coordinates.c */; };
+ 9D7A441A13FAF3B5003087FF /* qual4_codec.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A43F113FAF2EF003087FF /* qual4_codec.h */; };
+ 9D7A441B13FAF3B5003087FF /* libwsraxf.vers.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A43EB13FAF2EF003087FF /* libwsraxf.vers.h */; };
+ 9D7A441C13FAF3B5003087FF /* untyped.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440213FAF2EF003087FF /* untyped.c */; };
+ 9D7A441D13FAF3B5003087FF /* color-from-dna.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43DF13FAF2EF003087FF /* color-from-dna.c */; };
+ 9D7A441E13FAF3B5003087FF /* tokenize-spot_name-454.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FC13FAF2EF003087FF /* tokenize-spot_name-454.c */; };
+ 9D7A441F13FAF3B5003087FF /* process-position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F013FAF2EF003087FF /* process-position.c */; };
+ 9D7A442113FAF3B5003087FF /* bio-start.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43DE13FAF2EF003087FF /* bio-start.c */; };
+ 9D7A442213FAF3B5003087FF /* normalize.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43EE13FAF2EF003087FF /* normalize.c */; };
+ 9D7A442313FAF3B5003087FF /* rewrite-spot-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F613FAF2EF003087FF /* rewrite-spot-name.c */; };
+ 9D7A442413FAF3B5003087FF /* v0-decompress-local.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A440413FAF2EF003087FF /* v0-decompress-local.h */; };
+ 9D7A442513FAF3B5003087FF /* tokenize-spot_name-abi.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FD13FAF2EF003087FF /* tokenize-spot_name-abi.c */; };
+ 9D7A442613FAF3B5003087FF /* tokenize-spot_name-ion-torrent.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440013FAF2EF003087FF /* tokenize-spot_name-ion-torrent.c */; };
+ 9D7A442713FAF3B5003087FF /* v0-decompress.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440513FAF2EF003087FF /* v0-decompress.c */; };
+ 9D7A442913FAF3B5003087FF /* swap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FB13FAF2EF003087FF /* swap.c */; };
+ 9D7A442A13FAF3B5003087FF /* spot-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F813FAF2EF003087FF /* spot-desc.c */; };
+ 9D7A442B13FAF3B5003087FF /* tokenize-spot_name-helicos.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FE13FAF2EF003087FF /* tokenize-spot_name-helicos.c */; };
+ 9D7A442C13FAF3B5003087FF /* denormalize.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E013FAF2EF003087FF /* denormalize.c */; };
+ 9D7A442D13FAF3B5003087FF /* make-position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43EC13FAF2EF003087FF /* make-position.c */; };
+ 9D7A442F13FAF3B5003087FF /* tokenize-spot_name-illumina.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FF13FAF2EF003087FF /* tokenize-spot_name-illumina.c */; };
+ 9D7A443013FAF3B5003087FF /* dna-from-color.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E113FAF2EF003087FF /* dna-from-color.c */; };
+ 9D7A443113FAF3B5003087FF /* index_lookup.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E913FAF2EF003087FF /* index_lookup.c */; };
+ 9D7A443213FAF3B5003087FF /* libsraxf.vers.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A43EA13FAF2EF003087FF /* libsraxf.vers.h */; };
+ 9D7A443313FAF3B5003087FF /* extract-name_coord.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E413FAF2EF003087FF /* extract-name_coord.c */; };
+ 9D7A443513FAF3B5003087FF /* v0-funcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440713FAF2EF003087FF /* v0-funcs.c */; };
+ 9D7A443613FAF3B5003087FF /* rotate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F713FAF2EF003087FF /* rotate.c */; };
+ 9D7A443813FAF3B5003087FF /* read-seg-from-readn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F513FAF2EF003087FF /* read-seg-from-readn.c */; };
+ 9D7A443913FAF3B5003087FF /* v0-decompress.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A440613FAF2EF003087FF /* v0-decompress.h */; };
+ 9D7A443A13FAF3B5003087FF /* dynamic-454-read-descriptor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E213FAF2EF003087FF /* dynamic-454-read-descriptor.c */; };
+ 9D7A443B13FAF3B5003087FF /* name-tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A43ED13FAF2EF003087FF /* name-tokenizer.h */; };
+ 9D7A443C13FAF3B5003087FF /* untyped-priv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A440113FAF2EF003087FF /* untyped-priv.h */; };
+ 9D7A443D13FAF3B5003087FF /* read-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F413FAF2EF003087FF /* read-desc.c */; };
+ 9D7A444313FAF3F6003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A444613FAF402003087FF /* libvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A431C13FAED2E003087FF /* libvdb.dylib */; };
+ 9D7A444913FAF411003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A444C13FAF41C003087FF /* libkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A423413FAE3F5003087FF /* libkdb.dylib */; };
+ 9D7A445B13FAF49A003087FF /* agrep-myersunltd.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445213FAF48E003087FF /* agrep-myersunltd.c */; };
+ 9D7A445C13FAF49A003087FF /* agrep-wumanber.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445313FAF48E003087FF /* agrep-wumanber.c */; };
+ 9D7A445D13FAF49A003087FF /* libksrch.vers.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A445713FAF48E003087FF /* libksrch.vers.h */; };
+ 9D7A445E13FAF49A003087FF /* agrep-myers.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445113FAF48E003087FF /* agrep-myers.c */; };
+ 9D7A445F13FAF49A003087FF /* fgrep-boyermoore.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445513FAF48E003087FF /* fgrep-boyermoore.c */; };
+ 9D7A446013FAF49A003087FF /* search-priv.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D7A445913FAF48E003087FF /* search-priv.h */; };
+ 9D7A446113FAF49A003087FF /* fgrep-dumb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445613FAF48E003087FF /* fgrep-dumb.c */; };
+ 9D7A446213FAF49A003087FF /* search.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445A13FAF48E003087FF /* search.c */; };
+ 9D7A446313FAF49A003087FF /* agrep-dp.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445013FAF48E003087FF /* agrep-dp.c */; };
+ 9D7A446413FAF49A003087FF /* fgrep-aho.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445413FAF48E003087FF /* fgrep-aho.c */; };
+ 9D7A446513FAF49A003087FF /* nucstrstr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A445813FAF48E003087FF /* nucstrstr.c */; };
+ 9D7A448F13FAF56D003087FF /* seq-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448613FAF539003087FF /* seq-restore-read.c */; };
+ 9D7A449013FAF56D003087FF /* raw-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448213FAF539003087FF /* raw-restore-read.c */; };
+ 9D7A449113FAF56D003087FF /* align-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447B13FAF539003087FF /* align-restore-read.c */; };
+ 9D7A449213FAF56D003087FF /* ref-tbl-sub-select.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448413FAF539003087FF /* ref-tbl-sub-select.c */; };
+ 9D7A449313FAF56D003087FF /* align-local_ref_id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447613FAF539003087FF /* align-local_ref_id.c */; };
+ 9D7A449413FAF56D003087FF /* align-ref-pos.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447913FAF539003087FF /* align-ref-pos.c */; };
+ 9D7A449613FAF56D003087FF /* align-ref-seq-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447A13FAF539003087FF /* align-ref-seq-id.c */; };
+ 9D7A449713FAF56D003087FF /* cigar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447C13FAF539003087FF /* cigar.c */; };
+ 9D7A449813FAF56D003087FF /* align-ref-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447813FAF539003087FF /* align-ref-name.c */; };
+ 9D7A449913FAF56D003087FF /* template-len.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448713FAF539003087FF /* template-len.c */; };
+ 9D7A449A13FAF56D003087FF /* get-sam-flags.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447D13FAF539003087FF /* get-sam-flags.c */; };
+ 9D7A449B13FAF56D003087FF /* ref-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448313FAF539003087FF /* ref-restore-read.c */; };
+ 9D7A449C13FAF56D003087FF /* align-local_ref_start.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447713FAF539003087FF /* align-local_ref_start.c */; };
+ 9D7A449D13FAF56D003087FF /* project_read_from_sequence.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448113FAF539003087FF /* project_read_from_sequence.c */; };
+ 9D7A449E13FAF56D003087FF /* not-my-row.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448013FAF539003087FF /* not-my-row.c */; };
+ 9D7A44A313FAF59D003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A44A613FAF5A9003087FF /* libvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A431C13FAED2E003087FF /* libvdb.dylib */; };
+ 9D7A44C913FB04C2003087FF /* reader-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44AE13FB0494003087FF /* reader-cmn.c */; };
+ 9D7A44CA13FB04C2003087FF /* refseq-mgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B213FB0494003087FF /* refseq-mgr.c */; };
+ 9D7A44CB13FB04C2003087FF /* reader-refseq.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B013FB0494003087FF /* reader-refseq.c */; };
+ 9D7A44D013FB04D8003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A44D113FB04DC003087FF /* libvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A431C13FAED2E003087FF /* libvdb.dylib */; };
+ 9D7A44D413FB04EF003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A44D913FB051B003087FF /* libkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A423413FAE3F5003087FF /* libkdb.dylib */; };
+ 9D7A44DC13FB0537003087FF /* libalign.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A44C013FB04A9003087FF /* libalign.dylib */; };
+ 9D7A453413FB0A5A003087FF /* bzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436A13FAF20D003087FF /* bzip.c */; };
+ 9D7A453513FB0A5D003087FF /* checksum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436C13FAF20D003087FF /* checksum.c */; };
+ 9D7A453613FB0A65003087FF /* fzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437813FAF20E003087FF /* fzip.c */; };
+ 9D7A453813FB0A7A003087FF /* outlier-encoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438813FAF20E003087FF /* outlier-encoder.c */; };
+ 9D7A453913FB0A82003087FF /* rlencode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438D13FAF20E003087FF /* rlencode.c */; };
+ 9D7A453A13FB0A8E003087FF /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439813FAF20E003087FF /* zip.c */; };
+ 9D7A453D13FB0AB1003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A453E13FB0AB2003087FF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC8C117667C6003CDA5E /* libbz2.dylib */; };
+ 9D7A454113FB0AC9003087FF /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */; };
+ 9D7A454213FB0ACF003087FF /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9D7A454313FB0AD5003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A454E13FB0B5F003087FF /* extract-name_fmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E513FAF2EF003087FF /* extract-name_fmt.c */; };
+ 9D7A454F13FB0B60003087FF /* extract-spot_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E613FAF2EF003087FF /* extract-spot_name.c */; };
+ 9D7A455013FB0B6C003087FF /* stats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FA13FAF2EF003087FF /* stats.c */; };
+ 9D7A455113FB0B6C003087FF /* stats_quality.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F913FAF2EF003087FF /* stats_quality.c */; };
+ 9D7A455213FB0B76003087FF /* qual4_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F313FAF2EF003087FF /* qual4_encode.c */; };
+ 9D7A455513FB0B86003087FF /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */; };
+ 9D7A455613FB0B8B003087FF /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9D7A455713FB0B91003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A455B13FB0BCE003087FF /* qual4_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F213FAF2EF003087FF /* qual4_decode.c */; };
+ 9D7A455C13FB0BCE003087FF /* format-spot-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E713FAF2EF003087FF /* format-spot-name.c */; };
+ 9D7A455D13FB0BCE003087FF /* fpcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E813FAF2EF003087FF /* fpcodec.c */; };
+ 9D7A455E13FB0BCE003087FF /* v0-decompress-init.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440313FAF2EF003087FF /* v0-decompress-init.c */; };
+ 9D7A455F13FB0BCE003087FF /* extract-coordinates.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E313FAF2EF003087FF /* extract-coordinates.c */; };
+ 9D7A456013FB0BCE003087FF /* untyped.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440213FAF2EF003087FF /* untyped.c */; };
+ 9D7A456113FB0BCE003087FF /* color-from-dna.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43DF13FAF2EF003087FF /* color-from-dna.c */; };
+ 9D7A456213FB0BCE003087FF /* tokenize-spot_name-454.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FC13FAF2EF003087FF /* tokenize-spot_name-454.c */; };
+ 9D7A456313FB0BCE003087FF /* process-position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F013FAF2EF003087FF /* process-position.c */; };
+ 9D7A456513FB0BCE003087FF /* bio-start.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43DE13FAF2EF003087FF /* bio-start.c */; };
+ 9D7A456613FB0BCE003087FF /* normalize.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43EE13FAF2EF003087FF /* normalize.c */; };
+ 9D7A456713FB0BCE003087FF /* rewrite-spot-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F613FAF2EF003087FF /* rewrite-spot-name.c */; };
+ 9D7A456813FB0BCE003087FF /* v0-decompress.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440513FAF2EF003087FF /* v0-decompress.c */; };
+ 9D7A456913FB0BCE003087FF /* tokenize-spot_name-abi.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FD13FAF2EF003087FF /* tokenize-spot_name-abi.c */; };
+ 9D7A456A13FB0BCE003087FF /* tokenize-spot_name-ion-torrent.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440013FAF2EF003087FF /* tokenize-spot_name-ion-torrent.c */; };
+ 9D7A456B13FB0BCE003087FF /* swap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FB13FAF2EF003087FF /* swap.c */; };
+ 9D7A456C13FB0BCE003087FF /* spot-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F813FAF2EF003087FF /* spot-desc.c */; };
+ 9D7A456D13FB0BCE003087FF /* tokenize-spot_name-helicos.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FE13FAF2EF003087FF /* tokenize-spot_name-helicos.c */; };
+ 9D7A456E13FB0BCE003087FF /* denormalize.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E013FAF2EF003087FF /* denormalize.c */; };
+ 9D7A456F13FB0BCE003087FF /* make-position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43EC13FAF2EF003087FF /* make-position.c */; };
+ 9D7A457013FB0BCE003087FF /* tokenize-spot_name-illumina.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43FF13FAF2EF003087FF /* tokenize-spot_name-illumina.c */; };
+ 9D7A457113FB0BCE003087FF /* dna-from-color.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E113FAF2EF003087FF /* dna-from-color.c */; };
+ 9D7A457213FB0BCE003087FF /* index_lookup.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E913FAF2EF003087FF /* index_lookup.c */; };
+ 9D7A457313FB0BCE003087FF /* extract-name_coord.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E413FAF2EF003087FF /* extract-name_coord.c */; };
+ 9D7A457413FB0BCE003087FF /* v0-funcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A440713FAF2EF003087FF /* v0-funcs.c */; };
+ 9D7A457513FB0BCE003087FF /* rotate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F713FAF2EF003087FF /* rotate.c */; };
+ 9D7A457613FB0BCE003087FF /* read-seg-from-readn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F513FAF2EF003087FF /* read-seg-from-readn.c */; };
+ 9D7A457713FB0BCE003087FF /* dynamic-454-read-descriptor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43E213FAF2EF003087FF /* dynamic-454-read-descriptor.c */; };
+ 9D7A457813FB0BCE003087FF /* read-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A43F413FAF2EF003087FF /* read-desc.c */; };
+ 9D7A457D13FB0C28003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A458113FB0C53003087FF /* exists.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437413FAF20E003087FF /* exists.c */; };
+ 9D7A458213FB0C53003087FF /* bunzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436913FAF20D003087FF /* bunzip.c */; };
+ 9D7A458313FB0C53003087FF /* trim.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439213FAF20E003087FF /* trim.c */; };
+ 9D7A458413FB0C53003087FF /* rldecode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438C13FAF20E003087FF /* rldecode.c */; };
+ 9D7A458513FB0C53003087FF /* ceil.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436B13FAF20D003087FF /* ceil.c */; };
+ 9D7A458713FB0C53003087FF /* paste.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438A13FAF20E003087FF /* paste.c */; };
+ 9D7A458813FB0C53003087FF /* max.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438513FAF20E003087FF /* max.c */; };
+ 9D7A458913FB0C53003087FF /* vec-sum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439713FAF20E003087FF /* vec-sum.c */; };
+ 9D7A458A13FB0C53003087FF /* echo.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437213FAF20D003087FF /* echo.c */; };
+ 9D7A458B13FB0C53003087FF /* add-row-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436713FAF20D003087FF /* add-row-id.c */; };
+ 9D7A458C13FB0C53003087FF /* delta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436F13FAF20D003087FF /* delta.c */; };
+ 9D7A458D13FB0C53003087FF /* floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437513FAF20E003087FF /* floor.c */; };
+ 9D7A458E13FB0C53003087FF /* subtract-row-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439013FAF20E003087FF /* subtract-row-id.c */; };
+ 9D7A458F13FB0C53003087FF /* outlier-decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438713FAF20E003087FF /* outlier-decoder.c */; };
+ 9D7A459013FB0C53003087FF /* deriv.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437013FAF20D003087FF /* deriv.c */; };
+ 9D7A459113FB0C53003087FF /* bit_or.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436813FAF20D003087FF /* bit_or.c */; };
+ 9D7A459313FB0C53003087FF /* irzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437A13FAF20E003087FF /* irzip.c */; };
+ 9D7A459413FB0C53003087FF /* map.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438313FAF20E003087FF /* map.c */; };
+ 9D7A459513FB0C53003087FF /* pack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438913FAF20E003087FF /* pack.c */; };
+ 9D7A459613FB0C53003087FF /* sum.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439113FAF20E003087FF /* sum.c */; };
+ 9D7A459713FB0C53003087FF /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439513FAF20E003087FF /* unpack.c */; };
+ 9D7A459813FB0C53003087FF /* simple-sub-select.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438F13FAF20E003087FF /* simple-sub-select.c */; };
+ 9D7A459913FB0C53003087FF /* rand_4na_2na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438B13FAF20E003087FF /* rand_4na_2na.c */; };
+ 9D7A459A13FB0C53003087FF /* min.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438613FAF20E003087FF /* min.c */; };
+ 9D7A459B13FB0C53003087FF /* trunc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439313FAF20E003087FF /* trunc.c */; };
+ 9D7A459C13FB0C53003087FF /* round.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A438E13FAF20E003087FF /* round.c */; };
+ 9D7A459D13FB0C53003087FF /* integral.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437913FAF20E003087FF /* integral.c */; };
+ 9D7A459E13FB0C53003087FF /* cut.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436E13FAF20D003087FF /* cut.c */; };
+ 9D7A459F13FB0C53003087FF /* funzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437713FAF20E003087FF /* funzip.c */; };
+ 9D7A45A013FB0C53003087FF /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439613FAF20E003087FF /* unzip.c */; };
+ 9D7A45A113FB0C53003087FF /* undelta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A439413FAF20E003087FF /* undelta.c */; };
+ 9D7A45A213FB0C53003087FF /* clip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A436D13FAF20D003087FF /* clip.c */; };
+ 9D7A45A313FB0C53003087FF /* diff.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437113FAF20D003087FF /* diff.c */; };
+ 9D7A45B113FB0CB8003087FF /* seq-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448613FAF539003087FF /* seq-restore-read.c */; };
+ 9D7A45B213FB0CB8003087FF /* raw-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448213FAF539003087FF /* raw-restore-read.c */; };
+ 9D7A45B313FB0CB8003087FF /* align-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447B13FAF539003087FF /* align-restore-read.c */; };
+ 9D7A45B413FB0CB8003087FF /* ref-tbl-sub-select.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448413FAF539003087FF /* ref-tbl-sub-select.c */; };
+ 9D7A45B513FB0CB8003087FF /* align-local_ref_id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447613FAF539003087FF /* align-local_ref_id.c */; };
+ 9D7A45B613FB0CB8003087FF /* align-ref-pos.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447913FAF539003087FF /* align-ref-pos.c */; };
+ 9D7A45B713FB0CB8003087FF /* align-ref-seq-id.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447A13FAF539003087FF /* align-ref-seq-id.c */; };
+ 9D7A45B813FB0CB8003087FF /* cigar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447C13FAF539003087FF /* cigar.c */; };
+ 9D7A45B913FB0CB8003087FF /* align-ref-name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447813FAF539003087FF /* align-ref-name.c */; };
+ 9D7A45BA13FB0CB8003087FF /* template-len.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448713FAF539003087FF /* template-len.c */; };
+ 9D7A45BB13FB0CB8003087FF /* get-sam-flags.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447D13FAF539003087FF /* get-sam-flags.c */; };
+ 9D7A45BC13FB0CB8003087FF /* ref-restore-read.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448313FAF539003087FF /* ref-restore-read.c */; };
+ 9D7A45BD13FB0CB8003087FF /* align-local_ref_start.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A447713FAF539003087FF /* align-local_ref_start.c */; };
+ 9D7A45BE13FB0CB8003087FF /* project_read_from_sequence.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448113FAF539003087FF /* project_read_from_sequence.c */; };
+ 9D7A45BF13FB0CB8003087FF /* not-my-row.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448013FAF539003087FF /* not-my-row.c */; };
+ 9D7A45C113FB0CB8003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A45C313FB0CB8003087FF /* libalign.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A44C013FB04A9003087FF /* libalign.dylib */; };
+ 9D7A45C813FB0CE4003087FF /* refseq-stats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A448513FAF539003087FF /* refseq-stats.c */; };
+ 9D7A45CB13FB0D18003087FF /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */; };
+ 9D7A45CE13FB0D24003087FF /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9D7A45DC13FB0D50003087FF /* reader-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44AE13FB0494003087FF /* reader-cmn.c */; };
+ 9D7A45DD13FB0D50003087FF /* refseq-mgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B213FB0494003087FF /* refseq-mgr.c */; };
+ 9D7A45DE13FB0D50003087FF /* reader-refseq.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B013FB0494003087FF /* reader-refseq.c */; };
+ 9D7A45E013FB0D50003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D7A45E213FB0D50003087FF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9D7A45E813FB0D72003087FF /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */; };
+ 9D7A45E913FB0D76003087FF /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9D7A45EA13FB0D95003087FF /* writer-alignment.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B413FB0494003087FF /* writer-alignment.c */; };
+ 9D7A45EB13FB0D95003087FF /* writer-reference.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B913FB0494003087FF /* writer-reference.c */; };
+ 9D7A45EC13FB0D95003087FF /* writer-ref.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B713FB0494003087FF /* writer-ref.c */; };
+ 9D7A45ED13FB0D95003087FF /* writer-refseq.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44BA13FB0494003087FF /* writer-refseq.c */; };
+ 9D7A45EE13FB0D95003087FF /* writer-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44B513FB0494003087FF /* writer-cmn.c */; };
+ 9D7A45EF13FB0D95003087FF /* writer-sequence.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A44BB13FB0494003087FF /* writer-sequence.c */; };
+ 9D7A460A13FB0F52003087FF /* progressbar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A460213FB0F0F003087FF /* progressbar.c */; };
+ 9D7A460B13FB0F52003087FF /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAB311766257003CDA5E /* main.c */; };
+ 9D7A460C13FB0F52003087FF /* args.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DB6A77911E61CB700168DE0 /* args.c */; };
+ 9D7A460D13FB0F52003087FF /* sysmain.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAB71176626A003CDA5E /* sysmain.c */; };
+ 9D7A461813FB1140003087FF /* deseq.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A461013FB1128003087FF /* deseq.c */; };
+ 9D7A461913FB114C003087FF /* libkapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A460713FB0F36003087FF /* libkapp.a */; };
+ 9D7A463B13FB135F003087FF /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC99117667FA003CDA5E /* libklib.dylib */; };
+ 9D8198A911D3D39700DA4D3C /* vector_namelist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D8198A811D3D39700DA4D3C /* vector_namelist.c */; };
+ 9D8204F8130F1100009A8B64 /* pagefile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D8204F7130F1100009A8B64 /* pagefile.c */; };
+ 9D8EC41B11C2E49E000F1048 /* pbstree-native.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D8EC41911C2E49E000F1048 /* pbstree-native.c */; };
+ 9D8EC41C11C2E49E000F1048 /* pbstree-swapped.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D8EC41A11C2E49E000F1048 /* pbstree-swapped.c */; };
+ 9D90F4DB140D8229004A99D6 /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */; };
+ 9D985E8D12886C6100849729 /* config.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D985E8C12886C6100849729 /* config.c */; };
+ 9DA3A84E125FA3A8005AD5BB /* refcount.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DA3A84D125FA3A8005AD5BB /* refcount.c */; };
+ 9DA3A88512663646005AD5BB /* syswriter.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DA3A88412663646005AD5BB /* syswriter.c */; settings = {COMPILER_FLAGS = "-I ../../../libs/klib"; }; };
+ 9DA3A8961266375B005AD5BB /* writer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DA3A8951266375B005AD5BB /* writer.c */; };
+ 9DA3A89A12663798005AD5BB /* out.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DA3A89912663798005AD5BB /* out.c */; };
+ 9DE559C6140E831000EA61C6 /* libwaxf.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A45C713FB0CB8003087FF /* libwaxf.dylib */; };
+ 9DE559C7140E831800EA61C6 /* libwvxf.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A452F13FB0A3C003087FF /* libwvxf.dylib */; };
+ 9DE559C8140E831C00EA61C6 /* libwsraxf.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A454B13FB0B4D003087FF /* libwsraxf.dylib */; };
+ 9DE55A23140E94B700EA61C6 /* iunzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437C13FAF20E003087FF /* iunzip.c */; };
+ 9DE55A28140E94CB00EA61C6 /* iunzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A437C13FAF20E003087FF /* iunzip.c */; };
+ 9DE55A79140EA19500EA61C6 /* raw-restore-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55A78140EA19500EA61C6 /* raw-restore-qual.c */; };
+ 9DE55A7A140EA1CA00EA61C6 /* raw-restore-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55A78140EA19500EA61C6 /* raw-restore-qual.c */; };
+ 9DE55A85140EA93600EA61C6 /* generate-mismatch-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55A84140EA93600EA61C6 /* generate-mismatch-qual.c */; };
+ 9DE55A86140EA93600EA61C6 /* generate-mismatch-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55A84140EA93600EA61C6 /* generate-mismatch-qual.c */; };
+ 9DE55AAF140EC79C00EA61C6 /* mismatch-restore-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55AAE140EC79C00EA61C6 /* mismatch-restore-qual.c */; };
+ 9DE55AB0140EC79C00EA61C6 /* mismatch-restore-qual.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DE55AAE140EC79C00EA61C6 /* mismatch-restore-qual.c */; };
+ 9DE55AFC140EF0B100EA61C6 /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D7A426813FAE69A003087FF /* libwkdb.dylib */; };
+ 9DF1902C128DAEBA00FED4AA /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1EC47B122D912500C11287 /* debug.c */; };
+ 9DFECDC511766952004EFD0D /* xml.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EB3011766409003CDA5E /* xml.c */; };
+ 9DFECDC711766982004EFD0D /* arc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE011766306003CDA5E /* arc.c */; };
+ 9DFECDC811766982004EFD0D /* buffile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE111766306003CDA5E /* buffile.c */; };
+ 9DFECDC911766982004EFD0D /* bzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE211766306003CDA5E /* bzip.c */; };
+ 9DFECDCA11766982004EFD0D /* countfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE311766306003CDA5E /* countfile.c */; };
+ 9DFECDCB11766982004EFD0D /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE411766306003CDA5E /* crc32.c */; };
+ 9DFECDCC11766982004EFD0D /* dir_test.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE511766306003CDA5E /* dir_test.c */; };
+ 9DFECDCD11766982004EFD0D /* directory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAE611766306003CDA5E /* directory.c */; };
+ 9DFECDCE11766982004EFD0D /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAEA11766306003CDA5E /* file.c */; };
+ 9DFECDD011766982004EFD0D /* gzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAEC11766306003CDA5E /* gzip.c */; };
+ 9DFECDD111766982004EFD0D /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAED11766306003CDA5E /* md5.c */; };
+ 9DFECDD211766982004EFD0D /* nullfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAEE11766306003CDA5E /* nullfile.c */; };
+ 9DFECDD311766982004EFD0D /* sra.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAEF11766306003CDA5E /* sra.c */; };
+ 9DFECDD411766982004EFD0D /* subfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF011766306003CDA5E /* subfile.c */; };
+ 9DFECDD511766982004EFD0D /* sysdir.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF71176631D003CDA5E /* sysdir.c */; };
+ 9DFECDD611766982004EFD0D /* sysdll.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF81176631D003CDA5E /* sysdll.c */; };
+ 9DFECDD711766982004EFD0D /* sysfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF91176631D003CDA5E /* sysfile.c */; };
+ 9DFECDD811766982004EFD0D /* sysmmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAFA1176631D003CDA5E /* sysmmap.c */; };
+ 9DFECDD911766982004EFD0D /* tar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF111766306003CDA5E /* tar.c */; };
+ 9DFECDDA11766982004EFD0D /* teefile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF211766306003CDA5E /* teefile.c */; };
+ 9DFECDDB11766982004EFD0D /* toc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF311766306003CDA5E /* toc.c */; };
+ 9DFECDDC11766982004EFD0D /* tocdir.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF411766306003CDA5E /* tocdir.c */; };
+ 9DFECDDD11766982004EFD0D /* tocentry.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF511766306003CDA5E /* tocentry.c */; };
+ 9DFECDDE11766982004EFD0D /* tocfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D31EAF611766306003CDA5E /* tocfile.c */; };
+ 9DFECDE6117669DD004EFD0D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC90117667C6003CDA5E /* libz.dylib */; };
+ 9DFECDE7117669E0004EFD0D /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC8C117667C6003CDA5E /* libbz2.dylib */; };
+ 9DFECDE8117669E0004EFD0D /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D31EC8E117667C6003CDA5E /* libxml2.dylib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 9D4DCEDB1423FF6E00881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A433613FAEE0C003087FF;
+ remoteInfo = wvdb;
+ };
+ 9D4DCEE11424001400881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A426713FAE69A003087FF;
+ remoteInfo = wkdb;
+ };
+ 9D4DCEE31424001C00881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D4DCEE61424007400881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A433613FAEE0C003087FF;
+ remoteInfo = wvdb;
+ };
+ 9D4DCEE81424007F00881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A426713FAE69A003087FF;
+ remoteInfo = wkdb;
+ };
+ 9D4DCEEA1424008500881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D4DCEEC142400B400881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A433613FAEE0C003087FF;
+ remoteInfo = wvdb;
+ };
+ 9D4DCEEE142400B900881098 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A426713FAE69A003087FF;
+ remoteInfo = wkdb;
+ };
+ 9D7A423713FAE3FD003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A417713FAE192003087FF;
+ remoteInfo = "kdb-cmn";
+ };
+ 9D7A428313FAE9A0003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A417713FAE192003087FF;
+ remoteInfo = "kdb-cmn";
+ };
+ 9D7A446813FAF4A9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A431B13FAED2E003087FF;
+ remoteInfo = vdb;
+ };
+ 9D7A446C13FAF4B3003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A423313FAE3F5003087FF;
+ remoteInfo = kdb;
+ };
+ 9D7A446E13FAF4B6003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44DF13FB0546003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A44BF13FB04A9003087FF;
+ remoteInfo = align;
+ };
+ 9D7A44E113FB0551003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A431B13FAED2E003087FF;
+ remoteInfo = vdb;
+ };
+ 9D7A44E513FB0561003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44E713FB057E003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44E913FB0582003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A431B13FAED2E003087FF;
+ remoteInfo = vdb;
+ };
+ 9D7A44EB13FB0597003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A431B13FAED2E003087FF;
+ remoteInfo = vdb;
+ };
+ 9D7A44ED13FB0597003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A423313FAE3F5003087FF;
+ remoteInfo = kdb;
+ };
+ 9D7A44EF13FB0597003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44F113FB05A9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A423313FAE3F5003087FF;
+ remoteInfo = kdb;
+ };
+ 9D7A44F313FB05A9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44F513FB05C9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A426713FAE69A003087FF;
+ remoteInfo = wkdb;
+ };
+ 9D7A44F713FB05C9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44F913FB05C9003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A415B13FAE00E003087FF;
+ remoteInfo = kmproc;
+ };
+ 9D7A44FB13FB05EB003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A44FD13FB05F2003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A450513FB06AB003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A428813FAE9B5003087FF;
+ remoteInfo = "vdb-cmn";
+ };
+ 9D7A450713FB06BD003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A428813FAE9B5003087FF;
+ remoteInfo = "vdb-cmn";
+ };
+ 9D7A45AA13FB0CB8003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A45AE13FB0CB8003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A44BF13FB04A9003087FF;
+ remoteInfo = align;
+ };
+ 9D7A45D313FB0D50003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9D7A45D513FB0D50003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A423313FAE3F5003087FF;
+ remoteInfo = kdb;
+ };
+ 9D7A45D713FB0D50003087FF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A431B13FAED2E003087FF;
+ remoteInfo = vdb;
+ };
+ 9DE55930140D82BC00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A460613FB0F36003087FF;
+ remoteInfo = kapp;
+ };
+ 9DE55932140D82BC00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A433613FAEE0C003087FF;
+ remoteInfo = wvdb;
+ };
+ 9DE55934140D82CD00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D31EC98117667FA003CDA5E;
+ remoteInfo = klib;
+ };
+ 9DE55A95140EAC9E00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A45A813FB0CB8003087FF;
+ remoteInfo = waxf;
+ };
+ 9DE55A97140EAC9E00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A454A13FB0B4D003087FF;
+ remoteInfo = wsraxf;
+ };
+ 9DE55A99140EAC9E00EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A452E13FB0A3C003087FF;
+ remoteInfo = wvxf;
+ };
+ 9DE55AFD140EF0C800EA61C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D7A426713FAE69A003087FF;
+ remoteInfo = wkdb;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 9D1235B414F571AC00ECC72C /* config-grammar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "config-grammar.c"; path = "../../../libs/kfg/config-grammar.c"; sourceTree = SOURCE_ROOT; };
+ 9D1235B514F571AC00ECC72C /* config-grammar.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; name = "config-grammar.y"; path = "../../../libs/kfg/config-grammar.y"; sourceTree = SOURCE_ROOT; };
+ 9D1235B614F571AC00ECC72C /* config-lex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "config-lex.c"; path = "../../../libs/kfg/config-lex.c"; sourceTree = SOURCE_ROOT; };
+ 9D1235B714F571AC00ECC72C /* config-lex.l */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lex; name = "config-lex.l"; path = "../../../libs/kfg/config-lex.l"; sourceTree = SOURCE_ROOT; };
+ 9D1235B814F571AC00ECC72C /* config-tokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "config-tokens.h"; path = "../../../libs/kfg/config-tokens.h"; sourceTree = SOURCE_ROOT; };
+ 9D1235B914F571AC00ECC72C /* config.linux.kfg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = config.linux.kfg; path = ../../../libs/kfg/config.linux.kfg; sourceTree = SOURCE_ROOT; };
+ 9D1235BA14F571AC00ECC72C /* config.win.kfg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = config.win.kfg; path = ../../../libs/kfg/config.win.kfg; sourceTree = SOURCE_ROOT; };
+ 9D1235BB14F571AC00ECC72C /* kfg-parse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "kfg-parse.h"; path = "../../../libs/kfg/kfg-parse.h"; sourceTree = SOURCE_ROOT; };
+ 9D1EC47B122D912500C11287 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug.c; path = ../../../libs/klib/debug.c; sourceTree = SOURCE_ROOT; };
+ 9D1EC47F122D914C00C11287 /* printf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = printf.c; path = ../../../libs/klib/printf.c; sourceTree = SOURCE_ROOT; };
+ 9D1EC480122D914C00C11287 /* status-rc-strings.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "status-rc-strings.c"; path = "../../../libs/klib/status-rc-strings.c"; sourceTree = SOURCE_ROOT; };
+ 9D1EC481122D914C00C11287 /* status-rc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "status-rc.c"; path = "../../../libs/klib/status-rc.c"; sourceTree = SOURCE_ROOT; };
+ 9D1EC482122D914C00C11287 /* status.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = status.c; path = ../../../libs/klib/status.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAB311766257003CDA5E /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = ../../../libs/kapp/main.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAB71176626A003CDA5E /* sysmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysmain.c; path = ../../../libs/kapp/unix/sysmain.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE011766306003CDA5E /* arc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arc.c; path = ../../../libs/kfs/arc.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE111766306003CDA5E /* buffile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = buffile.c; path = ../../../libs/kfs/buffile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE211766306003CDA5E /* bzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bzip.c; path = ../../../libs/kfs/bzip.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE311766306003CDA5E /* countfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = countfile.c; path = ../../../libs/kfs/countfile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE411766306003CDA5E /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../../libs/kfs/crc32.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE511766306003CDA5E /* dir_test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dir_test.c; path = ../../../libs/kfs/dir_test.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE611766306003CDA5E /* directory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = directory.c; path = ../../../libs/kfs/directory.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE711766306003CDA5E /* ffext.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ffext.c; path = ../../../libs/kfs/ffext.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE811766306003CDA5E /* ffkey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ffkey.c; path = ../../../libs/kfs/ffkey.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAE911766306003CDA5E /* ffmagic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ffmagic.c; path = ../../../libs/kfs/ffmagic.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAEA11766306003CDA5E /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../../../libs/kfs/file.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAEB11766306003CDA5E /* fileformat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fileformat.c; path = ../../../libs/kfs/fileformat.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAEC11766306003CDA5E /* gzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzip.c; path = ../../../libs/kfs/gzip.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAED11766306003CDA5E /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../libs/kfs/md5.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAEE11766306003CDA5E /* nullfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nullfile.c; path = ../../../libs/kfs/nullfile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAEF11766306003CDA5E /* sra.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sra.c; path = ../../../libs/kfs/sra.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF011766306003CDA5E /* subfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = subfile.c; path = ../../../libs/kfs/subfile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF111766306003CDA5E /* tar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tar.c; path = ../../../libs/kfs/tar.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF211766306003CDA5E /* teefile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = teefile.c; path = ../../../libs/kfs/teefile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF311766306003CDA5E /* toc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = toc.c; path = ../../../libs/kfs/toc.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF411766306003CDA5E /* tocdir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocdir.c; path = ../../../libs/kfs/tocdir.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF511766306003CDA5E /* tocentry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocentry.c; path = ../../../libs/kfs/tocentry.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF611766306003CDA5E /* tocfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocfile.c; path = ../../../libs/kfs/tocfile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF71176631D003CDA5E /* sysdir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysdir.c; path = ../../../libs/kfs/unix/sysdir.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF81176631D003CDA5E /* sysdll.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysdll.c; path = ../../../libs/kfs/unix/sysdll.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAF91176631D003CDA5E /* sysfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysfile.c; path = ../../../libs/kfs/unix/sysfile.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAFA1176631D003CDA5E /* sysmmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysmmap.c; path = ../../../libs/kfs/unix/sysmmap.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAFE11766366003CDA5E /* bstpersist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bstpersist.c; path = ../../../libs/klib/bstpersist.c; sourceTree = SOURCE_ROOT; };
+ 9D31EAFF11766366003CDA5E /* container.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = container.c; path = ../../../libs/klib/container.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0011766366003CDA5E /* cp1252.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cp1252.c; path = ../../../libs/klib/cp1252.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0111766366003CDA5E /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../../libs/klib/crc32.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0211766366003CDA5E /* data-buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "data-buffer.c"; path = "../../../libs/klib/data-buffer.c"; sourceTree = SOURCE_ROOT; };
+ 9D31EB0311766366003CDA5E /* iso8859-1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "iso8859-1.c"; path = "../../../libs/klib/iso8859-1.c"; sourceTree = SOURCE_ROOT; };
+ 9D31EB0411766366003CDA5E /* iso8859.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iso8859.c; path = ../../../libs/klib/iso8859.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0511766366003CDA5E /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = log.c; path = ../../../libs/klib/log.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0611766366003CDA5E /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../libs/klib/md5.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0711766366003CDA5E /* namelist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = namelist.c; path = ../../../libs/klib/namelist.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0811766366003CDA5E /* pack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pack.c; path = ../../../libs/klib/pack.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0911766366003CDA5E /* pbstree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbstree.c; path = ../../../libs/klib/pbstree.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0A11766366003CDA5E /* ptpersist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptpersist.c; path = ../../../libs/klib/ptpersist.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0B11766366003CDA5E /* ptrie.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptrie.c; path = ../../../libs/klib/ptrie.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB0C11766366003CDA5E /* rc-idx-tbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "rc-idx-tbl.c"; path = "../../../libs/klib/rc-idx-tbl.c"; sourceTree = SOURCE_ROOT; };
+ 9D31EB0D11766366003CDA5E /* rc-tbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "rc-tbl.c"; path = "../../../libs/klib/rc-tbl.c"; sourceTree = SOURCE_ROOT; };
+ 9D31EB0E11766366003CDA5E /* symtab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = symtab.c; path = ../../../libs/klib/symtab.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1011766366003CDA5E /* text.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = text.c; path = ../../../libs/klib/text.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1111766366003CDA5E /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = token.c; path = ../../../libs/klib/token.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1211766366003CDA5E /* trie.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trie.c; path = ../../../libs/klib/trie.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1311766366003CDA5E /* trieval.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trieval.c; path = ../../../libs/klib/trieval.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1411766366003CDA5E /* unpack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unpack.c; path = ../../../libs/klib/unpack.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1511766366003CDA5E /* utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utf8.c; path = ../../../libs/klib/utf8.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1611766366003CDA5E /* vector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vector.c; path = ../../../libs/klib/vector.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1711766366003CDA5E /* vlen-encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "vlen-encode.c"; path = "../../../libs/klib/vlen-encode.c"; sourceTree = SOURCE_ROOT; };
+ 9D31EB191176637A003CDA5E /* syslog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syslog.c; path = ../../../libs/klib/unix/syslog.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1D117663AB003CDA5E /* stbarrier.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stbarrier.c; path = ../../../libs/kproc/stbarrier.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1E117663AB003CDA5E /* stcond.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stcond.c; path = ../../../libs/kproc/stcond.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB1F117663AB003CDA5E /* stlock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stlock.c; path = ../../../libs/kproc/stlock.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB20117663AB003CDA5E /* stsem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stsem.c; path = ../../../libs/kproc/stsem.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB21117663AB003CDA5E /* stthread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stthread.c; path = ../../../libs/kproc/stthread.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB22117663AB003CDA5E /* sttimeout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sttimeout.c; path = ../../../libs/kproc/sttimeout.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB2B117663C6003CDA5E /* syscond.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syscond.c; path = ../../../libs/kproc/unix/syscond.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB2C117663C6003CDA5E /* systhread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = systhread.c; path = ../../../libs/kproc/unix/systhread.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB2D117663C6003CDA5E /* systimeout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = systimeout.c; path = ../../../libs/kproc/unix/systimeout.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB2E117663D4003CDA5E /* syslock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syslock.c; path = ../../../libs/kproc/bsd/syslock.c; sourceTree = SOURCE_ROOT; };
+ 9D31EB3011766409003CDA5E /* xml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xml.c; path = ../../../libs/kxml/xml.c; sourceTree = SOURCE_ROOT; };
+ 9D31EC8C117667C6003CDA5E /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; };
+ 9D31EC8E117667C6003CDA5E /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; };
+ 9D31EC90117667C6003CDA5E /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+ 9D31EC99117667FA003CDA5E /* libklib.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libklib.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D320A0A142B813300ACA5AA /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../tools/deseq/Makefile; sourceTree = SOURCE_ROOT; };
+ 9D320AAE142D02B000ACA5AA /* extract_token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = extract_token.c; path = ../../../libs/vxf/extract_token.c; sourceTree = SOURCE_ROOT; };
+ 9D320AAF142D02B000ACA5AA /* strtonum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = strtonum.c; path = ../../../libs/vxf/strtonum.c; sourceTree = SOURCE_ROOT; };
+ 9D320AB5142D02E600ACA5AA /* sprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sprintf.c; path = ../../../libs/vxf/sprintf.c; sourceTree = SOURCE_ROOT; };
+ 9D320AD5142D0E3F00ACA5AA /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../libs/vxf/Makefile; sourceTree = SOURCE_ROOT; };
+ 9D4DCEAB1423FD9600881098 /* ref-preserve_qual.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ref-preserve_qual.c"; path = "../../../libs/axf/ref-preserve_qual.c"; sourceTree = SOURCE_ROOT; };
+ 9D62F428124D01AE003D38E9 /* bsearch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bsearch.c; path = ../../../libs/klib/bsearch.c; sourceTree = SOURCE_ROOT; };
+ 9D62F429124D01AE003D38E9 /* qsort.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = qsort.c; path = ../../../libs/klib/qsort.c; sourceTree = SOURCE_ROOT; };
+ 9D6FFB31145094DB00952EB7 /* align-access.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "align-access.h"; path = "align/align-access.h"; sourceTree = "<group>"; };
+ 9D6FFB32145094DB00952EB7 /* alignarc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = alignarc.h; path = align/alignarc.h; sourceTree = "<group>"; };
+ 9D6FFB33145094DB00952EB7 /* alignsrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = alignsrc.h; path = align/alignsrc.h; sourceTree = "<group>"; };
+ 9D6FFB34145094DB00952EB7 /* extern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = extern.h; path = align/extern.h; sourceTree = "<group>"; };
+ 9D6FFB35145094DB00952EB7 /* reader-refseq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "reader-refseq.h"; path = "align/reader-refseq.h"; sourceTree = "<group>"; };
+ 9D6FFB36145094DB00952EB7 /* refseq-mgr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "refseq-mgr.h"; path = "align/refseq-mgr.h"; sourceTree = "<group>"; };
+ 9D6FFB37145094DB00952EB7 /* writer-alignment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-alignment.h"; path = "align/writer-alignment.h"; sourceTree = "<group>"; };
+ 9D6FFB38145094DB00952EB7 /* writer-cmn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-cmn.h"; path = "align/writer-cmn.h"; sourceTree = "<group>"; };
+ 9D6FFB39145094DB00952EB7 /* writer-reference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-reference.h"; path = "align/writer-reference.h"; sourceTree = "<group>"; };
+ 9D6FFB3A145094DB00952EB7 /* writer-refseq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-refseq.h"; path = "align/writer-refseq.h"; sourceTree = "<group>"; };
+ 9D6FFB3B145094DB00952EB7 /* writer-sequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-sequence.h"; path = "align/writer-sequence.h"; sourceTree = "<group>"; };
+ 9D7356C41177554A009EA3E4 /* built-in.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = "built-in.vschema"; path = "../../../interfaces/vdb/built-in.vschema"; sourceTree = SOURCE_ROOT; };
+ 9D7356C51177554A009EA3E4 /* vdb.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = vdb.vschema; path = ../../../interfaces/vdb/vdb.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356C71177556A009EA3E4 /* ncbi.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = ncbi.vschema; path = ../../../interfaces/ncbi/ncbi.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356C81177556A009EA3E4 /* spotname.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = spotname.vschema; path = ../../../interfaces/ncbi/spotname.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356CA117755B4009EA3E4 /* insdc.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = insdc.vschema; path = ../../../interfaces/insdc/insdc.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356CB117755B4009EA3E4 /* seq.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = seq.vschema; path = ../../../interfaces/insdc/seq.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356CC117755B4009EA3E4 /* sra.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = sra.vschema; path = ../../../interfaces/insdc/sra.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356CE117755F4009EA3E4 /* 454.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = 454.vschema; path = ../../../interfaces/sra/454.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7356CF117755F4009EA3E4 /* pevents.vschema */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 4; includeInIndex = 0; name = pevents.vschema; path = ../../../interfaces/sra/pevents.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7A40D913FADBA3003087FF /* SHA-32bit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "SHA-32bit.c"; path = "../../../libs/klib/SHA-32bit.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A40DA13FADBA3003087FF /* SHA-64bit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "SHA-64bit.c"; path = "../../../libs/klib/SHA-64bit.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A40DF13FADBEE003087FF /* syserrcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syserrcode.c; path = ../../../libs/klib/unix/syserrcode.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40E013FADBEE003087FF /* systime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = systime.c; path = ../../../libs/klib/unix/systime.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40E813FADC66003087FF /* writer-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-priv.h"; path = "../../../libs/klib/writer-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40ED13FADCFE003087FF /* arrayfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arrayfile.c; path = ../../../libs/kfs/arrayfile.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40EE13FADCFE003087FF /* buffile-write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "buffile-write.c"; path = "../../../libs/kfs/buffile-write.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A40EF13FADCFE003087FF /* fileformat-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "fileformat-priv.h"; path = "../../../libs/kfs/fileformat-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40F013FADCFE003087FF /* impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = impl.h; path = ../../../libs/kfs/impl.h; sourceTree = SOURCE_ROOT; };
+ 9D7A40F113FADCFE003087FF /* karc-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "karc-priv.h"; path = "../../../libs/kfs/karc-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40F213FADCFE003087FF /* kfs-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "kfs-priv.h"; path = "../../../libs/kfs/kfs-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40F313FADCFE003087FF /* manager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = manager.c; path = ../../../libs/kfs/manager.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40F413FADCFE003087FF /* mmap-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mmap-priv.h"; path = "../../../libs/kfs/mmap-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40F513FADCFE003087FF /* mmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mmap.c; path = ../../../libs/kfs/mmap.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40F613FADCFE003087FF /* path-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "path-priv.h"; path = "../../../libs/kfs/path-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A40F713FADCFE003087FF /* path.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = path.c; path = ../../../libs/kfs/path.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40F813FADCFE003087FF /* pmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pmem.c; path = ../../../libs/kfs/pmem.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40F913FADCFE003087FF /* szip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = szip.c; path = ../../../libs/kfs/szip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A40FA13FADCFE003087FF /* toc-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "toc-priv.h"; path = "../../../libs/kfs/toc-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A411213FADD33003087FF /* sysdir-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sysdir-priv.h"; path = "../../../libs/kfs/unix/sysdir-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A411313FADD33003087FF /* sysfile-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sysfile-priv.h"; path = "../../../libs/kfs/unix/sysfile-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A411413FADD33003087FF /* sysmmap-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "sysmmap-priv.h"; path = "../../../libs/kfs/unix/sysmmap-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A412E13FADF3A003087FF /* libksproc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libksproc.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A414813FADFA1003087FF /* syscond-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "syscond-priv.h"; path = "../../../libs/kproc/unix/syscond-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A414B13FADFC6003087FF /* syslock-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "syslock-priv.h"; sourceTree = "<group>"; };
+ 9D7A414C13FADFC6003087FF /* syslock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = syslock.c; sourceTree = "<group>"; };
+ 9D7A414D13FADFC6003087FF /* queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = queue.c; path = ../../../libs/kproc/queue.c; sourceTree = SOURCE_ROOT; };
+ 9D7A414E13FADFC6003087FF /* sem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sem.c; path = ../../../libs/kproc/sem.c; sourceTree = SOURCE_ROOT; };
+ 9D7A415C13FAE00E003087FF /* libkmproc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libkmproc.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A417813FAE192003087FF /* libkdb-cmn.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libkdb-cmn.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A417D13FAE1DA003087FF /* btree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = btree.c; path = ../../../libs/kdb/btree.c; sourceTree = SOURCE_ROOT; };
+ 9D7A417E13FAE1DA003087FF /* cc-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cc-priv.h"; path = "../../../libs/kdb/cc-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A417F13FAE1DA003087FF /* coldata-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "coldata-priv.h"; path = "../../../libs/kdb/coldata-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418013FAE1DA003087FF /* coldata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = coldata.c; path = ../../../libs/kdb/coldata.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418113FAE1DA003087FF /* colfmt-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "colfmt-priv.h"; path = "../../../libs/kdb/colfmt-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418213FAE1DA003087FF /* colidx-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "colidx-priv.h"; path = "../../../libs/kdb/colidx-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418313FAE1DA003087FF /* colidx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx.c; path = ../../../libs/kdb/colidx.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418413FAE1DA003087FF /* colidx0-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "colidx0-priv.h"; path = "../../../libs/kdb/colidx0-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418513FAE1DA003087FF /* colidx0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx0.c; path = ../../../libs/kdb/colidx0.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418613FAE1DA003087FF /* colidx1-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "colidx1-priv.h"; path = "../../../libs/kdb/colidx1-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418713FAE1DA003087FF /* colidx1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx1.c; path = ../../../libs/kdb/colidx1.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418813FAE1DA003087FF /* colidx2-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "colidx2-priv.h"; path = "../../../libs/kdb/colidx2-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418913FAE1DA003087FF /* colidx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx2.c; path = ../../../libs/kdb/colidx2.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418A13FAE1DA003087FF /* column-cc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "column-cc.c"; path = "../../../libs/kdb/column-cc.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A418B13FAE1DA003087FF /* column-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "column-priv.h"; path = "../../../libs/kdb/column-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A418C13FAE1DA003087FF /* column.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = column.c; path = ../../../libs/kdb/column.c; sourceTree = SOURCE_ROOT; };
+ 9D7A418D13FAE1DA003087FF /* database-cc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "database-cc.c"; path = "../../../libs/kdb/database-cc.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A418E13FAE1DA003087FF /* database-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "database-cmn.c"; path = "../../../libs/kdb/database-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A418F13FAE1DA003087FF /* database-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "database-priv.h"; path = "../../../libs/kdb/database-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419013FAE1DA003087FF /* database.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = database.c; path = ../../../libs/kdb/database.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419113FAE1DA003087FF /* dbcc-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dbcc-cmn.c"; path = "../../../libs/kdb/dbcc-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A419213FAE1DA003087FF /* dbmgr-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dbmgr-cmn.c"; path = "../../../libs/kdb/dbmgr-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A419313FAE1DA003087FF /* dbmgr-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "dbmgr-priv.h"; path = "../../../libs/kdb/dbmgr-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419413FAE1DA003087FF /* dbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dbmgr.c; path = ../../../libs/kdb/dbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419513FAE1DA003087FF /* idstats-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "idstats-priv.h"; path = "../../../libs/kdb/idstats-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419613FAE1DA003087FF /* idstats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = idstats.c; path = ../../../libs/kdb/idstats.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419713FAE1DA003087FF /* idxblk-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "idxblk-priv.h"; path = "../../../libs/kdb/idxblk-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419813FAE1DA003087FF /* idxblk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = idxblk.c; path = ../../../libs/kdb/idxblk.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419913FAE1DA003087FF /* index-cmn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "index-cmn.h"; path = "../../../libs/kdb/index-cmn.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419A13FAE1DA003087FF /* index-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "index-priv.h"; path = "../../../libs/kdb/index-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419B13FAE1DA003087FF /* index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index.c; path = ../../../libs/kdb/index.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419C13FAE1DA003087FF /* kdb-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "kdb-priv.h"; path = "../../../libs/kdb/kdb-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419D13FAE1DA003087FF /* kdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = kdb.c; path = ../../../libs/kdb/kdb.c; sourceTree = SOURCE_ROOT; };
+ 9D7A419E13FAE1DA003087FF /* kdbfmt-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "kdbfmt-priv.h"; path = "../../../libs/kdb/kdbfmt-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A419F13FAE1DA003087FF /* libkdb.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libkdb.vers.h; path = ../../../libs/kdb/libkdb.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A41A013FAE1DA003087FF /* libwkdb.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libwkdb.vers.h; path = ../../../libs/kdb/libwkdb.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A41A113FAE1DA003087FF /* meta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = meta.c; path = ../../../libs/kdb/meta.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41A213FAE1DA003087FF /* ptrieval-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ptrieval-v1.c"; path = "../../../libs/kdb/ptrieval-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A313FAE1DA003087FF /* ptrieval-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ptrieval-v2.c"; path = "../../../libs/kdb/ptrieval-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A413FAE1DA003087FF /* table-cc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "table-cc.c"; path = "../../../libs/kdb/table-cc.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A513FAE1DA003087FF /* table-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "table-priv.h"; path = "../../../libs/kdb/table-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A613FAE1DA003087FF /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = table.c; path = ../../../libs/kdb/table.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41A713FAE1DA003087FF /* trieidx-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "trieidx-priv.h"; path = "../../../libs/kdb/trieidx-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A813FAE1DA003087FF /* trieidx-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieidx-v1.c"; path = "../../../libs/kdb/trieidx-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41A913FAE1DA003087FF /* trieidx-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieidx-v2.c"; path = "../../../libs/kdb/trieidx-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41AA13FAE1DA003087FF /* trieval-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieval-v1.c"; path = "../../../libs/kdb/trieval-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41AB13FAE1DA003087FF /* trieval-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieval-v2.c"; path = "../../../libs/kdb/trieval-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41AC13FAE1DA003087FF /* u64idx-v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "u64idx-v3.c"; path = "../../../libs/kdb/u64idx-v3.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41AD13FAE1DA003087FF /* wcoldata-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcoldata-priv.h"; path = "../../../libs/kdb/wcoldata-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41AE13FAE1DA003087FF /* wcoldata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcoldata.c; path = ../../../libs/kdb/wcoldata.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41AF13FAE1DA003087FF /* wcolidx-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcolidx-priv.h"; path = "../../../libs/kdb/wcolidx-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41B013FAE1DA003087FF /* wcolidx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx.c; path = ../../../libs/kdb/wcolidx.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41B113FAE1DA003087FF /* wcolidx0-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcolidx0-priv.h"; path = "../../../libs/kdb/wcolidx0-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41B213FAE1DA003087FF /* wcolidx0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx0.c; path = ../../../libs/kdb/wcolidx0.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41B313FAE1DA003087FF /* wcolidx1-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcolidx1-priv.h"; path = "../../../libs/kdb/wcolidx1-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41B413FAE1DA003087FF /* wcolidx1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx1.c; path = ../../../libs/kdb/wcolidx1.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41B513FAE1DA003087FF /* wcolidx2-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcolidx2-priv.h"; path = "../../../libs/kdb/wcolidx2-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41B613FAE1DA003087FF /* wcolidx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx2.c; path = ../../../libs/kdb/wcolidx2.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41B713FAE1DA003087FF /* wcolumn-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wcolumn-priv.h"; path = "../../../libs/kdb/wcolumn-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41B813FAE1DA003087FF /* wcolumn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolumn.c; path = ../../../libs/kdb/wcolumn.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41B913FAE1DA003087FF /* wdatabase-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wdatabase-priv.h"; path = "../../../libs/kdb/wdatabase-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41BA13FAE1DA003087FF /* wdatabase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdatabase.c; path = ../../../libs/kdb/wdatabase.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41BB13FAE1DA003087FF /* wdbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdbmgr.c; path = ../../../libs/kdb/wdbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41BC13FAE1DA003087FF /* werror-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "werror-priv.h"; path = "../../../libs/kdb/werror-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41BD13FAE1DA003087FF /* widxblk-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "widxblk-priv.h"; path = "../../../libs/kdb/widxblk-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41BE13FAE1DA003087FF /* widxblk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = widxblk.c; path = ../../../libs/kdb/widxblk.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41BF13FAE1DA003087FF /* windex-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "windex-priv.h"; path = "../../../libs/kdb/windex-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41C013FAE1DA003087FF /* windex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = windex.c; path = ../../../libs/kdb/windex.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41C113FAE1DA003087FF /* wkdb-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wkdb-priv.h"; path = "../../../libs/kdb/wkdb-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41C213FAE1DA003087FF /* wkdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wkdb.c; path = ../../../libs/kdb/wkdb.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41C313FAE1DA003087FF /* wmeta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wmeta.c; path = ../../../libs/kdb/wmeta.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41C413FAE1DA003087FF /* wtable-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "wtable-priv.h"; path = "../../../libs/kdb/wtable-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A41C513FAE1DA003087FF /* wtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wtable.c; path = ../../../libs/kdb/wtable.c; sourceTree = SOURCE_ROOT; };
+ 9D7A41C613FAE1DA003087FF /* wtrieidx-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wtrieidx-v1.c"; path = "../../../libs/kdb/wtrieidx-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41C713FAE1DA003087FF /* wtrieidx-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wtrieidx-v2.c"; path = "../../../libs/kdb/wtrieidx-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A41C813FAE1DA003087FF /* wu64idx-v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wu64idx-v3.c"; path = "../../../libs/kdb/wu64idx-v3.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A423413FAE3F5003087FF /* libkdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libkdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A426813FAE69A003087FF /* libwkdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwkdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A428913FAE9B5003087FF /* libvdb-cmn.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libvdb-cmn.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A428E13FAEA20003087FF /* blob-headers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "blob-headers.c"; path = "../../../libs/vdb/blob-headers.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A428F13FAEA20003087FF /* blob-headers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blob-headers.h"; path = "../../../libs/vdb/blob-headers.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A429013FAEA20003087FF /* blob-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blob-priv.h"; path = "../../../libs/vdb/blob-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A429113FAEA20003087FF /* blob.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blob.c; path = ../../../libs/vdb/blob.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429213FAEA20003087FF /* blob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = blob.h; path = ../../../libs/vdb/blob.h; sourceTree = SOURCE_ROOT; };
+ 9D7A429313FAEA20003087FF /* cast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cast.c; path = ../../../libs/vdb/cast.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429413FAEA20003087FF /* column-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "column-cmn.c"; path = "../../../libs/vdb/column-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A429513FAEA20003087FF /* column-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "column-priv.h"; path = "../../../libs/vdb/column-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A429613FAEA20003087FF /* column.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = column.c; path = ../../../libs/vdb/column.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429713FAEA20003087FF /* compare.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compare.c; path = ../../../libs/vdb/compare.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429813FAEA20003087FF /* cursor-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cursor-cmn.c"; path = "../../../libs/vdb/cursor-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A429913FAEA20003087FF /* cursor-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cursor-priv.h"; path = "../../../libs/vdb/cursor-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A429A13FAEA20003087FF /* cursor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cursor.c; path = ../../../libs/vdb/cursor.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429B13FAEA20003087FF /* database-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "database-cmn.c"; path = "../../../libs/vdb/database-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A429C13FAEA20003087FF /* database-load.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "database-load.c"; path = "../../../libs/vdb/database-load.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A429D13FAEA20003087FF /* database-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "database-priv.h"; path = "../../../libs/vdb/database-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A429E13FAEA20003087FF /* database.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = database.c; path = ../../../libs/vdb/database.c; sourceTree = SOURCE_ROOT; };
+ 9D7A429F13FAEA20003087FF /* dbmgr-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dbmgr-cmn.c"; path = "../../../libs/vdb/dbmgr-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42A013FAEA20003087FF /* dbmgr-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "dbmgr-priv.h"; path = "../../../libs/vdb/dbmgr-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42A113FAEA20003087FF /* dbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dbmgr.c; path = ../../../libs/vdb/dbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42A213FAEA20003087FF /* environment-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "environment-read.c"; path = "../../../libs/vdb/environment-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42A313FAEA20003087FF /* fixed-row-len.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "fixed-row-len.c"; path = "../../../libs/vdb/fixed-row-len.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42A413FAEA20003087FF /* index_insert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index_insert.c; path = ../../../libs/vdb/index_insert.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42A513FAEA20003087FF /* index_lookup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index_lookup.c; path = ../../../libs/vdb/index_lookup.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42A613FAEA20003087FF /* index_project.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index_project.c; path = ../../../libs/vdb/index_project.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42A713FAEA20003087FF /* libvdb.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvdb.vers.h; path = ../../../libs/vdb/libvdb.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A42A813FAEA20003087FF /* libwvdb.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libwvdb.vers.h; path = ../../../libs/vdb/libwvdb.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A42A913FAEA20003087FF /* linker-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "linker-cmn.c"; path = "../../../libs/vdb/linker-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42AA13FAEA20003087FF /* linker-int.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "linker-int.c"; path = "../../../libs/vdb/linker-int.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42AB13FAEA21003087FF /* linker-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "linker-priv.h"; path = "../../../libs/vdb/linker-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42AC13FAEA21003087FF /* linker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linker.c; path = ../../../libs/vdb/linker.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42AD13FAEA21003087FF /* merge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = merge.c; path = ../../../libs/vdb/merge.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42AE13FAEA21003087FF /* meta-append.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-append.c"; path = "../../../libs/vdb/meta-append.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42AF13FAEA21003087FF /* meta-attr-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-attr-read.c"; path = "../../../libs/vdb/meta-attr-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B013FAEA21003087FF /* meta-attr-write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-attr-write.c"; path = "../../../libs/vdb/meta-attr-write.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B113FAEA21003087FF /* meta-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-read.c"; path = "../../../libs/vdb/meta-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B213FAEA21003087FF /* meta-value.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-value.c"; path = "../../../libs/vdb/meta-value.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B313FAEA21003087FF /* meta-write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "meta-write.c"; path = "../../../libs/vdb/meta-write.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B413FAEA21003087FF /* page-map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "page-map.c"; path = "../../../libs/vdb/page-map.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B513FAEA21003087FF /* page-map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "page-map.h"; path = "../../../libs/vdb/page-map.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B613FAEA21003087FF /* parameter-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "parameter-read.c"; path = "../../../libs/vdb/parameter-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B713FAEA21003087FF /* phys-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "phys-cmn.c"; path = "../../../libs/vdb/phys-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B813FAEA21003087FF /* phys-load.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "phys-load.c"; path = "../../../libs/vdb/phys-load.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42B913FAEA21003087FF /* phys-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "phys-priv.h"; path = "../../../libs/vdb/phys-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42BA13FAEA21003087FF /* phys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = phys.c; path = ../../../libs/vdb/phys.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42BB13FAEA21003087FF /* prod-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "prod-cmn.c"; path = "../../../libs/vdb/prod-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42BC13FAEA21003087FF /* prod-expr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "prod-expr.c"; path = "../../../libs/vdb/prod-expr.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42BD13FAEA21003087FF /* prod-expr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "prod-expr.h"; path = "../../../libs/vdb/prod-expr.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42BE13FAEA21003087FF /* prod-func.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "prod-func.c"; path = "../../../libs/vdb/prod-func.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42BF13FAEA21003087FF /* prod-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "prod-priv.h"; path = "../../../libs/vdb/prod-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C013FAEA21003087FF /* prod.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = prod.c; path = ../../../libs/vdb/prod.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42C113FAEA21003087FF /* range-validate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "range-validate.c"; path = "../../../libs/vdb/range-validate.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C213FAEA21003087FF /* redimension.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = redimension.c; path = ../../../libs/vdb/redimension.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42C313FAEA21003087FF /* row-id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "row-id.c"; path = "../../../libs/vdb/row-id.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C413FAEA21003087FF /* row-len.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "row-len.c"; path = "../../../libs/vdb/row-len.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C513FAEA21003087FF /* schema-db.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-db.c"; path = "../../../libs/vdb/schema-db.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C613FAEA21003087FF /* schema-dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-dump.c"; path = "../../../libs/vdb/schema-dump.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C713FAEA21003087FF /* schema-dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "schema-dump.h"; path = "../../../libs/vdb/schema-dump.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C813FAEA21003087FF /* schema-eval.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-eval.c"; path = "../../../libs/vdb/schema-eval.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42C913FAEA21003087FF /* schema-expr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-expr.c"; path = "../../../libs/vdb/schema-expr.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CA13FAEA21003087FF /* schema-expr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "schema-expr.h"; path = "../../../libs/vdb/schema-expr.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CB13FAEA21003087FF /* schema-func.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-func.c"; path = "../../../libs/vdb/schema-func.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CC13FAEA21003087FF /* schema-int.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-int.c"; path = "../../../libs/vdb/schema-int.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CD13FAEA21003087FF /* schema-parse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-parse.c"; path = "../../../libs/vdb/schema-parse.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CE13FAEA21003087FF /* schema-parse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "schema-parse.h"; path = "../../../libs/vdb/schema-parse.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42CF13FAEA21003087FF /* schema-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "schema-priv.h"; path = "../../../libs/vdb/schema-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D013FAEA21003087FF /* schema-prod.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-prod.c"; path = "../../../libs/vdb/schema-prod.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D113FAEA21003087FF /* schema-tbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-tbl.c"; path = "../../../libs/vdb/schema-tbl.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D213FAEA21003087FF /* schema-tok.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-tok.c"; path = "../../../libs/vdb/schema-tok.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D313FAEA21003087FF /* schema-tok.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "schema-tok.h"; path = "../../../libs/vdb/schema-tok.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D413FAEA21003087FF /* schema-type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-type.c"; path = "../../../libs/vdb/schema-type.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D513FAEA21003087FF /* schema.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = schema.c; path = ../../../libs/vdb/schema.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42D613FAEA21003087FF /* split.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = split.c; path = ../../../libs/vdb/split.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42D713FAEA21003087FF /* table-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "table-cmn.c"; path = "../../../libs/vdb/table-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D813FAEA21003087FF /* table-load.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "table-load.c"; path = "../../../libs/vdb/table-load.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A42D913FAEA21003087FF /* table-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "table-priv.h"; path = "../../../libs/vdb/table-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A42DA13FAEA21003087FF /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = table.c; path = ../../../libs/vdb/table.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42DB13FAEA21003087FF /* wcolumn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolumn.c; path = ../../../libs/vdb/wcolumn.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42DC13FAEA21003087FF /* wcursor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcursor.c; path = ../../../libs/vdb/wcursor.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42DD13FAEA21003087FF /* wdatabase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdatabase.c; path = ../../../libs/vdb/wdatabase.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42DE13FAEA21003087FF /* wdbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdbmgr.c; path = ../../../libs/vdb/wdbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42DF13FAEA21003087FF /* wlinker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wlinker.c; path = ../../../libs/vdb/wlinker.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42E013FAEA21003087FF /* wphys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wphys.c; path = ../../../libs/vdb/wphys.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42E113FAEA21003087FF /* wprod.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wprod.c; path = ../../../libs/vdb/wprod.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42E213FAEA21003087FF /* wtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wtable.c; path = ../../../libs/vdb/wtable.c; sourceTree = SOURCE_ROOT; };
+ 9D7A42E313FAEA21003087FF /* xform-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "xform-priv.h"; path = "../../../libs/vdb/xform-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A431C13FAED2E003087FF /* libvdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libvdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A433713FAEE0C003087FF /* libwvdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwvdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A436013FAF1AE003087FF /* libvxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libvxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A436713FAF20D003087FF /* add-row-id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "add-row-id.c"; path = "../../../libs/vxf/add-row-id.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A436813FAF20D003087FF /* bit_or.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bit_or.c; path = ../../../libs/vxf/bit_or.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436913FAF20D003087FF /* bunzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bunzip.c; path = ../../../libs/vxf/bunzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436A13FAF20D003087FF /* bzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bzip.c; path = ../../../libs/vxf/bzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436B13FAF20D003087FF /* ceil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ceil.c; path = ../../../libs/vxf/ceil.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436C13FAF20D003087FF /* checksum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = checksum.c; path = ../../../libs/vxf/checksum.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436D13FAF20D003087FF /* clip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = clip.c; path = ../../../libs/vxf/clip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436E13FAF20D003087FF /* cut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cut.c; path = ../../../libs/vxf/cut.c; sourceTree = SOURCE_ROOT; };
+ 9D7A436F13FAF20D003087FF /* delta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = delta.c; path = ../../../libs/vxf/delta.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437013FAF20D003087FF /* deriv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deriv.c; path = ../../../libs/vxf/deriv.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437113FAF20D003087FF /* diff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = diff.c; path = ../../../libs/vxf/diff.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437213FAF20D003087FF /* echo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = echo.c; path = ../../../libs/vxf/echo.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437313FAF20E003087FF /* entrez.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = entrez.c; path = ../../../libs/vxf/entrez.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437413FAF20E003087FF /* exists.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = exists.c; path = ../../../libs/vxf/exists.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437513FAF20E003087FF /* floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = floor.c; path = ../../../libs/vxf/floor.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437613FAF20E003087FF /* fsplit-join.impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "fsplit-join.impl.h"; path = "../../../libs/vxf/fsplit-join.impl.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A437713FAF20E003087FF /* funzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = funzip.c; path = ../../../libs/vxf/funzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437813FAF20E003087FF /* fzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fzip.c; path = ../../../libs/vxf/fzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437913FAF20E003087FF /* integral.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = integral.c; path = ../../../libs/vxf/integral.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437A13FAF20E003087FF /* irzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = irzip.c; path = ../../../libs/vxf/irzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437B13FAF20E003087FF /* irzip.impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = irzip.impl.h; path = ../../../libs/vxf/irzip.impl.h; sourceTree = SOURCE_ROOT; };
+ 9D7A437C13FAF20E003087FF /* iunzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iunzip.c; path = ../../../libs/vxf/iunzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A437D13FAF20E003087FF /* izip-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "izip-common.h"; path = "../../../libs/vxf/izip-common.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A437E13FAF20E003087FF /* izip-decode.impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "izip-decode.impl.h"; path = "../../../libs/vxf/izip-decode.impl.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A437F13FAF20E003087FF /* izip-encode.impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "izip-encode.impl.h"; path = "../../../libs/vxf/izip-encode.impl.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A438013FAF20E003087FF /* izip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = izip.c; path = ../../../libs/vxf/izip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438113FAF20E003087FF /* libvxf.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvxf.vers.h; path = ../../../libs/vxf/libvxf.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A438213FAF20E003087FF /* libvxfentrez.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvxfentrez.vers.h; path = ../../../libs/vxf/libvxfentrez.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A438313FAF20E003087FF /* map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = map.c; path = ../../../libs/vxf/map.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438413FAF20E003087FF /* math-funcs-impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "math-funcs-impl.h"; path = "../../../libs/vxf/math-funcs-impl.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A438513FAF20E003087FF /* max.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = max.c; path = ../../../libs/vxf/max.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438613FAF20E003087FF /* min.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = min.c; path = ../../../libs/vxf/min.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438713FAF20E003087FF /* outlier-decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "outlier-decoder.c"; path = "../../../libs/vxf/outlier-decoder.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A438813FAF20E003087FF /* outlier-encoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "outlier-encoder.c"; path = "../../../libs/vxf/outlier-encoder.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A438913FAF20E003087FF /* pack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pack.c; path = ../../../libs/vxf/pack.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438A13FAF20E003087FF /* paste.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = paste.c; path = ../../../libs/vxf/paste.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438B13FAF20E003087FF /* rand_4na_2na.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rand_4na_2na.c; path = ../../../libs/vxf/rand_4na_2na.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438C13FAF20E003087FF /* rldecode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rldecode.c; path = ../../../libs/vxf/rldecode.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438D13FAF20E003087FF /* rlencode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rlencode.c; path = ../../../libs/vxf/rlencode.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438E13FAF20E003087FF /* round.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = round.c; path = ../../../libs/vxf/round.c; sourceTree = SOURCE_ROOT; };
+ 9D7A438F13FAF20E003087FF /* simple-sub-select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "simple-sub-select.c"; path = "../../../libs/vxf/simple-sub-select.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A439013FAF20E003087FF /* subtract-row-id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "subtract-row-id.c"; path = "../../../libs/vxf/subtract-row-id.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A439113FAF20E003087FF /* sum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sum.c; path = ../../../libs/vxf/sum.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439213FAF20E003087FF /* trim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trim.c; path = ../../../libs/vxf/trim.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439313FAF20E003087FF /* trunc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trunc.c; path = ../../../libs/vxf/trunc.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439413FAF20E003087FF /* undelta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = undelta.c; path = ../../../libs/vxf/undelta.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439513FAF20E003087FF /* unpack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unpack.c; path = ../../../libs/vxf/unpack.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439613FAF20E003087FF /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = ../../../libs/vxf/unzip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A439713FAF20E003087FF /* vec-sum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "vec-sum.c"; path = "../../../libs/vxf/vec-sum.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A439813FAF20E003087FF /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip.c; path = ../../../libs/vxf/zip.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43DE13FAF2EF003087FF /* bio-start.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "bio-start.c"; path = "../../../libs/sraxf/bio-start.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43DF13FAF2EF003087FF /* color-from-dna.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "color-from-dna.c"; path = "../../../libs/sraxf/color-from-dna.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E013FAF2EF003087FF /* denormalize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = denormalize.c; path = ../../../libs/sraxf/denormalize.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43E113FAF2EF003087FF /* dna-from-color.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dna-from-color.c"; path = "../../../libs/sraxf/dna-from-color.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E213FAF2EF003087FF /* dynamic-454-read-descriptor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dynamic-454-read-descriptor.c"; path = "../../../libs/sraxf/dynamic-454-read-descriptor.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E313FAF2EF003087FF /* extract-coordinates.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "extract-coordinates.c"; path = "../../../libs/sraxf/extract-coordinates.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E413FAF2EF003087FF /* extract-name_coord.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "extract-name_coord.c"; path = "../../../libs/sraxf/extract-name_coord.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E513FAF2EF003087FF /* extract-name_fmt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "extract-name_fmt.c"; path = "../../../libs/sraxf/extract-name_fmt.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E613FAF2EF003087FF /* extract-spot_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "extract-spot_name.c"; path = "../../../libs/sraxf/extract-spot_name.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E713FAF2EF003087FF /* format-spot-name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "format-spot-name.c"; path = "../../../libs/sraxf/format-spot-name.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43E813FAF2EF003087FF /* fpcodec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fpcodec.c; path = ../../../libs/sraxf/fpcodec.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43E913FAF2EF003087FF /* index_lookup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index_lookup.c; path = ../../../libs/sraxf/index_lookup.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43EA13FAF2EF003087FF /* libsraxf.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libsraxf.vers.h; path = ../../../libs/sraxf/libsraxf.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A43EB13FAF2EF003087FF /* libwsraxf.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libwsraxf.vers.h; path = ../../../libs/sraxf/libwsraxf.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A43EC13FAF2EF003087FF /* make-position.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "make-position.c"; path = "../../../libs/sraxf/make-position.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43ED13FAF2EF003087FF /* name-tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "name-tokenizer.h"; path = "../../../libs/sraxf/name-tokenizer.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A43EE13FAF2EF003087FF /* normalize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = normalize.c; path = ../../../libs/sraxf/normalize.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43EF13FAF2EF003087FF /* prefix-tree-to-name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "prefix-tree-to-name.c"; path = "../../../libs/sraxf/prefix-tree-to-name.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F013FAF2EF003087FF /* process-position.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "process-position.c"; path = "../../../libs/sraxf/process-position.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F113FAF2EF003087FF /* qual4_codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qual4_codec.h; path = ../../../libs/sraxf/qual4_codec.h; sourceTree = SOURCE_ROOT; };
+ 9D7A43F213FAF2EF003087FF /* qual4_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = qual4_decode.c; path = ../../../libs/sraxf/qual4_decode.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43F313FAF2EF003087FF /* qual4_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = qual4_encode.c; path = ../../../libs/sraxf/qual4_encode.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43F413FAF2EF003087FF /* read-desc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "read-desc.c"; path = "../../../libs/sraxf/read-desc.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F513FAF2EF003087FF /* read-seg-from-readn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "read-seg-from-readn.c"; path = "../../../libs/sraxf/read-seg-from-readn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F613FAF2EF003087FF /* rewrite-spot-name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "rewrite-spot-name.c"; path = "../../../libs/sraxf/rewrite-spot-name.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F713FAF2EF003087FF /* rotate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rotate.c; path = ../../../libs/sraxf/rotate.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43F813FAF2EF003087FF /* spot-desc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "spot-desc.c"; path = "../../../libs/sraxf/spot-desc.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43F913FAF2EF003087FF /* stats_quality.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stats_quality.c; path = ../../../libs/sraxf/stats_quality.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43FA13FAF2EF003087FF /* stats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stats.c; path = ../../../libs/sraxf/stats.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43FB13FAF2EF003087FF /* swap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = swap.c; path = ../../../libs/sraxf/swap.c; sourceTree = SOURCE_ROOT; };
+ 9D7A43FC13FAF2EF003087FF /* tokenize-spot_name-454.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tokenize-spot_name-454.c"; path = "../../../libs/sraxf/tokenize-spot_name-454.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43FD13FAF2EF003087FF /* tokenize-spot_name-abi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tokenize-spot_name-abi.c"; path = "../../../libs/sraxf/tokenize-spot_name-abi.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43FE13FAF2EF003087FF /* tokenize-spot_name-helicos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tokenize-spot_name-helicos.c"; path = "../../../libs/sraxf/tokenize-spot_name-helicos.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A43FF13FAF2EF003087FF /* tokenize-spot_name-illumina.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tokenize-spot_name-illumina.c"; path = "../../../libs/sraxf/tokenize-spot_name-illumina.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A440013FAF2EF003087FF /* tokenize-spot_name-ion-torrent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tokenize-spot_name-ion-torrent.c"; path = "../../../libs/sraxf/tokenize-spot_name-ion-torrent.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A440113FAF2EF003087FF /* untyped-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "untyped-priv.h"; path = "../../../libs/sraxf/untyped-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A440213FAF2EF003087FF /* untyped.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = untyped.c; path = ../../../libs/sraxf/untyped.c; sourceTree = SOURCE_ROOT; };
+ 9D7A440313FAF2EF003087FF /* v0-decompress-init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "v0-decompress-init.c"; path = "../../../libs/sraxf/v0-decompress-init.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A440413FAF2EF003087FF /* v0-decompress-local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "v0-decompress-local.h"; path = "../../../libs/sraxf/v0-decompress-local.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A440513FAF2EF003087FF /* v0-decompress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "v0-decompress.c"; path = "../../../libs/sraxf/v0-decompress.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A440613FAF2EF003087FF /* v0-decompress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "v0-decompress.h"; path = "../../../libs/sraxf/v0-decompress.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A440713FAF2EF003087FF /* v0-funcs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "v0-funcs.c"; path = "../../../libs/sraxf/v0-funcs.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A440C13FAF315003087FF /* libsraxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libsraxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A445013FAF48E003087FF /* agrep-dp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "agrep-dp.c"; path = "../../../libs/search/agrep-dp.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445113FAF48E003087FF /* agrep-myers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "agrep-myers.c"; path = "../../../libs/search/agrep-myers.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445213FAF48E003087FF /* agrep-myersunltd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "agrep-myersunltd.c"; path = "../../../libs/search/agrep-myersunltd.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445313FAF48E003087FF /* agrep-wumanber.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "agrep-wumanber.c"; path = "../../../libs/search/agrep-wumanber.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445413FAF48E003087FF /* fgrep-aho.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "fgrep-aho.c"; path = "../../../libs/search/fgrep-aho.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445513FAF48E003087FF /* fgrep-boyermoore.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "fgrep-boyermoore.c"; path = "../../../libs/search/fgrep-boyermoore.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445613FAF48E003087FF /* fgrep-dumb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "fgrep-dumb.c"; path = "../../../libs/search/fgrep-dumb.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A445713FAF48E003087FF /* libksrch.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libksrch.vers.h; path = ../../../libs/search/libksrch.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A445813FAF48E003087FF /* nucstrstr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nucstrstr.c; path = ../../../libs/search/nucstrstr.c; sourceTree = SOURCE_ROOT; };
+ 9D7A445913FAF48E003087FF /* search-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "search-priv.h"; path = "../../../libs/search/search-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A445A13FAF48E003087FF /* search.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = search.c; path = ../../../libs/search/search.c; sourceTree = SOURCE_ROOT; };
+ 9D7A447613FAF539003087FF /* align-local_ref_id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-local_ref_id.c"; path = "../../../libs/axf/align-local_ref_id.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447713FAF539003087FF /* align-local_ref_start.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-local_ref_start.c"; path = "../../../libs/axf/align-local_ref_start.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447813FAF539003087FF /* align-ref-name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-ref-name.c"; path = "../../../libs/axf/align-ref-name.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447913FAF539003087FF /* align-ref-pos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-ref-pos.c"; path = "../../../libs/axf/align-ref-pos.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447A13FAF539003087FF /* align-ref-seq-id.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-ref-seq-id.c"; path = "../../../libs/axf/align-ref-seq-id.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447B13FAF539003087FF /* align-restore-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-restore-read.c"; path = "../../../libs/axf/align-restore-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447C13FAF539003087FF /* cigar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cigar.c; path = ../../../libs/axf/cigar.c; sourceTree = SOURCE_ROOT; };
+ 9D7A447D13FAF539003087FF /* get-sam-flags.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "get-sam-flags.c"; path = "../../../libs/axf/get-sam-flags.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A447E13FAF539003087FF /* libaxf.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libaxf.vers.h; path = ../../../libs/axf/libaxf.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A447F13FAF539003087FF /* libwaxf.vers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libwaxf.vers.h; path = ../../../libs/axf/libwaxf.vers.h; sourceTree = SOURCE_ROOT; };
+ 9D7A448013FAF539003087FF /* not-my-row.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "not-my-row.c"; path = "../../../libs/axf/not-my-row.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448113FAF539003087FF /* project_read_from_sequence.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = project_read_from_sequence.c; path = ../../../libs/axf/project_read_from_sequence.c; sourceTree = SOURCE_ROOT; };
+ 9D7A448213FAF539003087FF /* raw-restore-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raw-restore-read.c"; path = "../../../libs/axf/raw-restore-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448313FAF539003087FF /* ref-restore-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ref-restore-read.c"; path = "../../../libs/axf/ref-restore-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448413FAF539003087FF /* ref-tbl-sub-select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ref-tbl-sub-select.c"; path = "../../../libs/axf/ref-tbl-sub-select.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448513FAF539003087FF /* refseq-stats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "refseq-stats.c"; path = "../../../libs/axf/refseq-stats.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448613FAF539003087FF /* seq-restore-read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "seq-restore-read.c"; path = "../../../libs/axf/seq-restore-read.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448713FAF539003087FF /* template-len.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "template-len.c"; path = "../../../libs/axf/template-len.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A448C13FAF555003087FF /* libaxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libaxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A44AB13FB0494003087FF /* align-access.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-access.c"; path = "../../../libs/align/align-access.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44AC13FB0494003087FF /* bam-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bam-priv.h"; path = "../../../libs/align/bam-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A44AD13FB0494003087FF /* bam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bam.c; path = ../../../libs/align/bam.c; sourceTree = SOURCE_ROOT; };
+ 9D7A44AE13FB0494003087FF /* reader-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "reader-cmn.c"; path = "../../../libs/align/reader-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44AF13FB0494003087FF /* reader-cmn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "reader-cmn.h"; path = "../../../libs/align/reader-cmn.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B013FB0494003087FF /* reader-refseq.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "reader-refseq.c"; path = "../../../libs/align/reader-refseq.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B113FB0494003087FF /* refseq-mgr-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "refseq-mgr-priv.h"; path = "../../../libs/align/refseq-mgr-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B213FB0494003087FF /* refseq-mgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "refseq-mgr.c"; path = "../../../libs/align/refseq-mgr.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B413FB0494003087FF /* writer-alignment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-alignment.c"; path = "../../../libs/align/writer-alignment.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B513FB0494003087FF /* writer-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-cmn.c"; path = "../../../libs/align/writer-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B613FB0494003087FF /* writer-priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-priv.h"; path = "../../../libs/align/writer-priv.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B713FB0494003087FF /* writer-ref.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-ref.c"; path = "../../../libs/align/writer-ref.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B813FB0494003087FF /* writer-ref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "writer-ref.h"; path = "../../../libs/align/writer-ref.h"; sourceTree = SOURCE_ROOT; };
+ 9D7A44B913FB0494003087FF /* writer-reference.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-reference.c"; path = "../../../libs/align/writer-reference.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44BA13FB0494003087FF /* writer-refseq.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-refseq.c"; path = "../../../libs/align/writer-refseq.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44BB13FB0494003087FF /* writer-sequence.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "writer-sequence.c"; path = "../../../libs/align/writer-sequence.c"; sourceTree = SOURCE_ROOT; };
+ 9D7A44C013FB04A9003087FF /* libalign.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libalign.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A452F13FB0A3C003087FF /* libwvxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwvxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A454B13FB0B4D003087FF /* libwsraxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwsraxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A45C713FB0CB8003087FF /* libwaxf.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwaxf.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A45E713FB0D50003087FF /* libwalign.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwalign.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A460213FB0F0F003087FF /* progressbar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = progressbar.c; path = ../../../libs/kapp/progressbar.c; sourceTree = SOURCE_ROOT; };
+ 9D7A460713FB0F36003087FF /* libkapp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libkapp.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A461013FB1128003087FF /* deseq.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deseq.c; path = ../../../tools/deseq/deseq.c; sourceTree = SOURCE_ROOT; };
+ 9D7A461413FB1133003087FF /* deseq */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = deseq; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D7A469113FB1FC5003087FF /* align.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = align.vschema; path = ../../../interfaces/align/align.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7A469213FB1FC5003087FF /* refseq.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = refseq.vschema; path = ../../../interfaces/align/refseq.vschema; sourceTree = SOURCE_ROOT; };
+ 9D7A469313FB1FC5003087FF /* seq.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = seq.vschema; path = ../../../interfaces/align/seq.vschema; sourceTree = SOURCE_ROOT; };
+ 9D8198A811D3D39700DA4D3C /* vector_namelist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vector_namelist.c; path = ../../../libs/klib/vector_namelist.c; sourceTree = SOURCE_ROOT; };
+ 9D8204F7130F1100009A8B64 /* pagefile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pagefile.c; path = ../../../libs/kfs/pagefile.c; sourceTree = SOURCE_ROOT; };
+ 9D8EC40E11C2E20A000F1048 /* pbstree-impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "pbstree-impl.c"; path = "../../../libs/klib/pbstree-impl.c"; sourceTree = SOURCE_ROOT; };
+ 9D8EC41911C2E49E000F1048 /* pbstree-native.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "pbstree-native.c"; path = "../../../libs/klib/pbstree-native.c"; sourceTree = SOURCE_ROOT; };
+ 9D8EC41A11C2E49E000F1048 /* pbstree-swapped.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "pbstree-swapped.c"; path = "../../../libs/klib/pbstree-swapped.c"; sourceTree = SOURCE_ROOT; };
+ 9D985E8C12886C6100849729 /* config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = config.c; path = ../../../libs/kfg/config.c; sourceTree = SOURCE_ROOT; };
+ 9D985FCB1288BA8700849729 /* config.mac.kfg */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; name = config.mac.kfg; path = ../../../libs/kfg/config.mac.kfg; sourceTree = SOURCE_ROOT; };
+ 9DA3A84D125FA3A8005AD5BB /* refcount.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = refcount.c; path = ../../../libs/klib/refcount.c; sourceTree = SOURCE_ROOT; };
+ 9DA3A865125FBB21005AD5BB /* abi.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = abi.vschema; path = ../../../interfaces/sra/abi.vschema; sourceTree = SOURCE_ROOT; };
+ 9DA3A866125FBB34005AD5BB /* illumina.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = illumina.vschema; path = ../../../interfaces/sra/illumina.vschema; sourceTree = SOURCE_ROOT; };
+ 9DA3A867125FBBBA005AD5BB /* seq.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = seq.vschema; path = ../../../interfaces/ncbi/seq.vschema; sourceTree = SOURCE_ROOT; };
+ 9DA3A868125FBBF0005AD5BB /* sra.vschema */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = sra.vschema; path = ../../../interfaces/ncbi/sra.vschema; sourceTree = SOURCE_ROOT; };
+ 9DA3A88412663646005AD5BB /* syswriter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syswriter.c; path = ../../../libs/klib/unix/syswriter.c; sourceTree = SOURCE_ROOT; };
+ 9DA3A8951266375B005AD5BB /* writer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = writer.c; path = ../../../libs/klib/writer.c; sourceTree = SOURCE_ROOT; };
+ 9DA3A89912663798005AD5BB /* out.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = out.c; path = ../../../libs/klib/out.c; sourceTree = SOURCE_ROOT; };
+ 9DB6A77911E61CB700168DE0 /* args.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = args.c; path = ../../../libs/kapp/args.c; sourceTree = SOURCE_ROOT; };
+ 9DE55A78140EA19500EA61C6 /* raw-restore-qual.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "raw-restore-qual.c"; path = "../../../libs/axf/raw-restore-qual.c"; sourceTree = SOURCE_ROOT; };
+ 9DE55A84140EA93600EA61C6 /* generate-mismatch-qual.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "generate-mismatch-qual.c"; path = "../../../libs/axf/generate-mismatch-qual.c"; sourceTree = SOURCE_ROOT; };
+ 9DE55AAE140EC79C00EA61C6 /* mismatch-restore-qual.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "mismatch-restore-qual.c"; path = "../../../libs/axf/mismatch-restore-qual.c"; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 9D31EC97117667FA003CDA5E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9DFECDE6117669DD004EFD0D /* libz.dylib in Frameworks */,
+ 9DFECDE7117669E0004EFD0D /* libbz2.dylib in Frameworks */,
+ 9DFECDE8117669E0004EFD0D /* libxml2.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A412C13FADF3A003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A415A13FAE00E003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A417613FAE192003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A423213FAE3F5003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A423913FAE40C003087FF /* libkdb-cmn.a in Frameworks */,
+ 9D7A426113FAE67B003087FF /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A426613FAE69A003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A426B13FAE6A5003087FF /* libkdb-cmn.a in Frameworks */,
+ 9D7A426C13FAE6A7003087FF /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A428713FAE9B5003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A431A13FAED2E003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A432913FAEDCC003087FF /* libvdb-cmn.a in Frameworks */,
+ 9D7A432A13FAEDD9003087FF /* libkdb.dylib in Frameworks */,
+ 9D7A432D13FAEDE5003087FF /* libklib.dylib in Frameworks */,
+ 9D7A433013FAEDF6003087FF /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A433513FAEE0C003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A435113FAEF00003087FF /* libwkdb.dylib in Frameworks */,
+ 9D7A435213FAEF06003087FF /* libvdb-cmn.a in Frameworks */,
+ 9D7A435313FAEF0E003087FF /* libklib.dylib in Frameworks */,
+ 9D7A435613FAEF1F003087FF /* libkmproc.a in Frameworks */,
+ 9D7A435913FAEF26003087FF /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A435E13FAF1AE003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A43CD13FAF23A003087FF /* libvdb.dylib in Frameworks */,
+ 9D7A43D013FAF245003087FF /* libz.dylib in Frameworks */,
+ 9D7A43D613FAF257003087FF /* libklib.dylib in Frameworks */,
+ 9D7A43DB13FAF274003087FF /* libbz2.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A440A13FAF315003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A444313FAF3F6003087FF /* libklib.dylib in Frameworks */,
+ 9D7A444613FAF402003087FF /* libvdb.dylib in Frameworks */,
+ 9D7A444913FAF411003087FF /* libz.dylib in Frameworks */,
+ 9D7A444C13FAF41C003087FF /* libkdb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A448A13FAF555003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A44A313FAF59D003087FF /* libklib.dylib in Frameworks */,
+ 9D7A44A613FAF5A9003087FF /* libvdb.dylib in Frameworks */,
+ 9D7A44DC13FB0537003087FF /* libalign.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A44BE13FB04A9003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A44D013FB04D8003087FF /* libklib.dylib in Frameworks */,
+ 9D7A44D113FB04DC003087FF /* libvdb.dylib in Frameworks */,
+ 9D7A44D413FB04EF003087FF /* libz.dylib in Frameworks */,
+ 9D7A44D913FB051B003087FF /* libkdb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A452D13FB0A3C003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A453D13FB0AB1003087FF /* libz.dylib in Frameworks */,
+ 9D7A453E13FB0AB2003087FF /* libbz2.dylib in Frameworks */,
+ 9D7A454113FB0AC9003087FF /* libwvdb.dylib in Frameworks */,
+ 9D7A454213FB0ACF003087FF /* libwkdb.dylib in Frameworks */,
+ 9D7A454313FB0AD5003087FF /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A454913FB0B4D003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A455513FB0B86003087FF /* libwvdb.dylib in Frameworks */,
+ 9D7A455613FB0B8B003087FF /* libwkdb.dylib in Frameworks */,
+ 9D7A455713FB0B91003087FF /* libklib.dylib in Frameworks */,
+ 9D7A457D13FB0C28003087FF /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45C013FB0CB8003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A45C113FB0CB8003087FF /* libklib.dylib in Frameworks */,
+ 9D7A45C313FB0CB8003087FF /* libalign.dylib in Frameworks */,
+ 9D7A45CB13FB0D18003087FF /* libwvdb.dylib in Frameworks */,
+ 9D7A45CE13FB0D24003087FF /* libwkdb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45DF13FB0D50003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A45E013FB0D50003087FF /* libklib.dylib in Frameworks */,
+ 9D7A45E213FB0D50003087FF /* libz.dylib in Frameworks */,
+ 9D7A45E813FB0D72003087FF /* libwvdb.dylib in Frameworks */,
+ 9D7A45E913FB0D76003087FF /* libwkdb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A460513FB0F36003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A461213FB1133003087FF /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A461913FB114C003087FF /* libkapp.a in Frameworks */,
+ 9D7A463B13FB135F003087FF /* libklib.dylib in Frameworks */,
+ 9D90F4DB140D8229004A99D6 /* libwvdb.dylib in Frameworks */,
+ 9DE559C6140E831000EA61C6 /* libwaxf.dylib in Frameworks */,
+ 9DE559C7140E831800EA61C6 /* libwvxf.dylib in Frameworks */,
+ 9DE559C8140E831C00EA61C6 /* libwsraxf.dylib in Frameworks */,
+ 9DE55AFC140EF0B100EA61C6 /* libwkdb.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* asm-trace */ = {
+ isa = PBXGroup;
+ children = (
+ 9DB6A8D411EB9F2100168DE0 /* interfaces */,
+ 9D819B3411DB9D5200DA4D3C /* Tools */,
+ 9D8EC47011C2F081000F1048 /* Tests */,
+ 9D7356C111775493009EA3E4 /* schema */,
+ 9D31EC8B11766778003CDA5E /* External Libraries */,
+ 9D31EAAD1176621D003CDA5E /* Libs */,
+ 9D7356E611775CB7009EA3E4 /* Products */,
+ );
+ name = "asm-trace";
+ sourceTree = "<group>";
+ };
+ 9D31EAAD1176621D003CDA5E /* Libs */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A44AA13FB0466003087FF /* align */,
+ 9D7A444F13FAF455003087FF /* search */,
+ 9D7A436613FAF1C2003087FF /* axf */,
+ 9D7A436513FAF1BC003087FF /* sraxf */,
+ 9D7A436313FAF1B4003087FF /* vxf */,
+ 9D7A428C13FAE9C4003087FF /* vdb */,
+ 9D7A417B13FAE1A2003087FF /* kdb */,
+ 9D31EAB01176623F003CDA5E /* kapp */,
+ 9D985E8B12886C3A00849729 /* kfg */,
+ 9D31EADD117662CE003CDA5E /* kfs */,
+ 9D31EAFB1176632C003CDA5E /* klib */,
+ 9D31EB1A11766387003CDA5E /* kproc */,
+ 9D31EB2F117663FA003CDA5E /* kxml */,
+ );
+ name = Libs;
+ sourceTree = "<group>";
+ };
+ 9D31EAB01176623F003CDA5E /* kapp */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A460213FB0F0F003087FF /* progressbar.c */,
+ 9DB6A77911E61CB700168DE0 /* args.c */,
+ 9D31EAB71176626A003CDA5E /* sysmain.c */,
+ 9D31EAB311766257003CDA5E /* main.c */,
+ );
+ name = kapp;
+ sourceTree = "<group>";
+ };
+ 9D31EADD117662CE003CDA5E /* kfs */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A411213FADD33003087FF /* sysdir-priv.h */,
+ 9D7A411313FADD33003087FF /* sysfile-priv.h */,
+ 9D7A411413FADD33003087FF /* sysmmap-priv.h */,
+ 9D7A40ED13FADCFE003087FF /* arrayfile.c */,
+ 9D7A40EE13FADCFE003087FF /* buffile-write.c */,
+ 9D7A40EF13FADCFE003087FF /* fileformat-priv.h */,
+ 9D7A40F013FADCFE003087FF /* impl.h */,
+ 9D7A40F113FADCFE003087FF /* karc-priv.h */,
+ 9D7A40F213FADCFE003087FF /* kfs-priv.h */,
+ 9D7A40F313FADCFE003087FF /* manager.c */,
+ 9D7A40F413FADCFE003087FF /* mmap-priv.h */,
+ 9D7A40F513FADCFE003087FF /* mmap.c */,
+ 9D7A40F613FADCFE003087FF /* path-priv.h */,
+ 9D7A40F713FADCFE003087FF /* path.c */,
+ 9D7A40F813FADCFE003087FF /* pmem.c */,
+ 9D7A40F913FADCFE003087FF /* szip.c */,
+ 9D7A40FA13FADCFE003087FF /* toc-priv.h */,
+ 9D8204F7130F1100009A8B64 /* pagefile.c */,
+ 9D31EAF71176631D003CDA5E /* sysdir.c */,
+ 9D31EAF81176631D003CDA5E /* sysdll.c */,
+ 9D31EAF91176631D003CDA5E /* sysfile.c */,
+ 9D31EAFA1176631D003CDA5E /* sysmmap.c */,
+ 9D31EAE011766306003CDA5E /* arc.c */,
+ 9D31EAE111766306003CDA5E /* buffile.c */,
+ 9D31EAE211766306003CDA5E /* bzip.c */,
+ 9D31EAE311766306003CDA5E /* countfile.c */,
+ 9D31EAE411766306003CDA5E /* crc32.c */,
+ 9D31EAE511766306003CDA5E /* dir_test.c */,
+ 9D31EAE611766306003CDA5E /* directory.c */,
+ 9D31EAE711766306003CDA5E /* ffext.c */,
+ 9D31EAE811766306003CDA5E /* ffkey.c */,
+ 9D31EAE911766306003CDA5E /* ffmagic.c */,
+ 9D31EAEA11766306003CDA5E /* file.c */,
+ 9D31EAEB11766306003CDA5E /* fileformat.c */,
+ 9D31EAEC11766306003CDA5E /* gzip.c */,
+ 9D31EAED11766306003CDA5E /* md5.c */,
+ 9D31EAEE11766306003CDA5E /* nullfile.c */,
+ 9D31EAEF11766306003CDA5E /* sra.c */,
+ 9D31EAF011766306003CDA5E /* subfile.c */,
+ 9D31EAF111766306003CDA5E /* tar.c */,
+ 9D31EAF211766306003CDA5E /* teefile.c */,
+ 9D31EAF311766306003CDA5E /* toc.c */,
+ 9D31EAF411766306003CDA5E /* tocdir.c */,
+ 9D31EAF511766306003CDA5E /* tocentry.c */,
+ 9D31EAF611766306003CDA5E /* tocfile.c */,
+ );
+ name = kfs;
+ sourceTree = "<group>";
+ };
+ 9D31EAFB1176632C003CDA5E /* klib */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A40E813FADC66003087FF /* writer-priv.h */,
+ 9D7A40DF13FADBEE003087FF /* syserrcode.c */,
+ 9D7A40E013FADBEE003087FF /* systime.c */,
+ 9D7A40D913FADBA3003087FF /* SHA-32bit.c */,
+ 9D7A40DA13FADBA3003087FF /* SHA-64bit.c */,
+ 9DA3A89912663798005AD5BB /* out.c */,
+ 9DA3A8951266375B005AD5BB /* writer.c */,
+ 9DA3A88412663646005AD5BB /* syswriter.c */,
+ 9DA3A84D125FA3A8005AD5BB /* refcount.c */,
+ 9D62F428124D01AE003D38E9 /* bsearch.c */,
+ 9D62F429124D01AE003D38E9 /* qsort.c */,
+ 9D1EC47F122D914C00C11287 /* printf.c */,
+ 9D1EC480122D914C00C11287 /* status-rc-strings.c */,
+ 9D1EC481122D914C00C11287 /* status-rc.c */,
+ 9D1EC482122D914C00C11287 /* status.c */,
+ 9D1EC47B122D912500C11287 /* debug.c */,
+ 9D8198A811D3D39700DA4D3C /* vector_namelist.c */,
+ 9D8EC41911C2E49E000F1048 /* pbstree-native.c */,
+ 9D8EC41A11C2E49E000F1048 /* pbstree-swapped.c */,
+ 9D8EC40E11C2E20A000F1048 /* pbstree-impl.c */,
+ 9D31EB191176637A003CDA5E /* syslog.c */,
+ 9D31EAFE11766366003CDA5E /* bstpersist.c */,
+ 9D31EAFF11766366003CDA5E /* container.c */,
+ 9D31EB0011766366003CDA5E /* cp1252.c */,
+ 9D31EB0111766366003CDA5E /* crc32.c */,
+ 9D31EB0211766366003CDA5E /* data-buffer.c */,
+ 9D31EB0311766366003CDA5E /* iso8859-1.c */,
+ 9D31EB0411766366003CDA5E /* iso8859.c */,
+ 9D31EB0511766366003CDA5E /* log.c */,
+ 9D31EB0611766366003CDA5E /* md5.c */,
+ 9D31EB0711766366003CDA5E /* namelist.c */,
+ 9D31EB0811766366003CDA5E /* pack.c */,
+ 9D31EB0911766366003CDA5E /* pbstree.c */,
+ 9D31EB0A11766366003CDA5E /* ptpersist.c */,
+ 9D31EB0B11766366003CDA5E /* ptrie.c */,
+ 9D31EB0C11766366003CDA5E /* rc-idx-tbl.c */,
+ 9D31EB0D11766366003CDA5E /* rc-tbl.c */,
+ 9D31EB0E11766366003CDA5E /* symtab.c */,
+ 9D31EB1011766366003CDA5E /* text.c */,
+ 9D31EB1111766366003CDA5E /* token.c */,
+ 9D31EB1211766366003CDA5E /* trie.c */,
+ 9D31EB1311766366003CDA5E /* trieval.c */,
+ 9D31EB1411766366003CDA5E /* unpack.c */,
+ 9D31EB1511766366003CDA5E /* utf8.c */,
+ 9D31EB1611766366003CDA5E /* vector.c */,
+ 9D31EB1711766366003CDA5E /* vlen-encode.c */,
+ );
+ name = klib;
+ sourceTree = "<group>";
+ };
+ 9D31EB1A11766387003CDA5E /* kproc */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A414A13FADFC6003087FF /* bsd */,
+ 9D7A414D13FADFC6003087FF /* queue.c */,
+ 9D7A414E13FADFC6003087FF /* sem.c */,
+ 9D7A414813FADFA1003087FF /* syscond-priv.h */,
+ 9D31EB2E117663D4003CDA5E /* syslock.c */,
+ 9D31EB2B117663C6003CDA5E /* syscond.c */,
+ 9D31EB2C117663C6003CDA5E /* systhread.c */,
+ 9D31EB2D117663C6003CDA5E /* systimeout.c */,
+ 9D31EB1D117663AB003CDA5E /* stbarrier.c */,
+ 9D31EB1E117663AB003CDA5E /* stcond.c */,
+ 9D31EB1F117663AB003CDA5E /* stlock.c */,
+ 9D31EB20117663AB003CDA5E /* stsem.c */,
+ 9D31EB21117663AB003CDA5E /* stthread.c */,
+ 9D31EB22117663AB003CDA5E /* sttimeout.c */,
+ );
+ name = kproc;
+ sourceTree = "<group>";
+ };
+ 9D31EB2F117663FA003CDA5E /* kxml */ = {
+ isa = PBXGroup;
+ children = (
+ 9D31EB3011766409003CDA5E /* xml.c */,
+ );
+ name = kxml;
+ sourceTree = "<group>";
+ };
+ 9D31EC8B11766778003CDA5E /* External Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 9D31EC8C117667C6003CDA5E /* libbz2.dylib */,
+ 9D31EC8E117667C6003CDA5E /* libxml2.dylib */,
+ 9D31EC90117667C6003CDA5E /* libz.dylib */,
+ );
+ name = "External Libraries";
+ sourceTree = "<group>";
+ };
+ 9D6FFB2F145094B000952EB7 /* align */ = {
+ isa = PBXGroup;
+ children = (
+ 9D6FFB31145094DB00952EB7 /* align-access.h */,
+ 9D6FFB32145094DB00952EB7 /* alignarc.h */,
+ 9D6FFB33145094DB00952EB7 /* alignsrc.h */,
+ 9D6FFB34145094DB00952EB7 /* extern.h */,
+ 9D6FFB35145094DB00952EB7 /* reader-refseq.h */,
+ 9D6FFB36145094DB00952EB7 /* refseq-mgr.h */,
+ 9D6FFB37145094DB00952EB7 /* writer-alignment.h */,
+ 9D6FFB38145094DB00952EB7 /* writer-cmn.h */,
+ 9D6FFB39145094DB00952EB7 /* writer-reference.h */,
+ 9D6FFB3A145094DB00952EB7 /* writer-refseq.h */,
+ 9D6FFB3B145094DB00952EB7 /* writer-sequence.h */,
+ );
+ name = align;
+ sourceTree = "<group>";
+ };
+ 9D7356C111775493009EA3E4 /* schema */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A469013FB1FAC003087FF /* align */,
+ 9D7356C91177559D009EA3E4 /* insdc */,
+ 9D7356C611775557009EA3E4 /* ncbi */,
+ 9D7356CD117755D8009EA3E4 /* sra */,
+ 9D7356C311775515009EA3E4 /* vdb */,
+ );
+ name = schema;
+ sourceTree = "<group>";
+ };
+ 9D7356C311775515009EA3E4 /* vdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7356C41177554A009EA3E4 /* built-in.vschema */,
+ 9D7356C51177554A009EA3E4 /* vdb.vschema */,
+ );
+ name = vdb;
+ sourceTree = "<group>";
+ };
+ 9D7356C611775557009EA3E4 /* ncbi */ = {
+ isa = PBXGroup;
+ children = (
+ 9DA3A868125FBBF0005AD5BB /* sra.vschema */,
+ 9DA3A867125FBBBA005AD5BB /* seq.vschema */,
+ 9D7356C71177556A009EA3E4 /* ncbi.vschema */,
+ 9D7356C81177556A009EA3E4 /* spotname.vschema */,
+ );
+ name = ncbi;
+ sourceTree = "<group>";
+ };
+ 9D7356C91177559D009EA3E4 /* insdc */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7356CA117755B4009EA3E4 /* insdc.vschema */,
+ 9D7356CB117755B4009EA3E4 /* seq.vschema */,
+ 9D7356CC117755B4009EA3E4 /* sra.vschema */,
+ );
+ name = insdc;
+ sourceTree = "<group>";
+ };
+ 9D7356CD117755D8009EA3E4 /* sra */ = {
+ isa = PBXGroup;
+ children = (
+ 9DA3A866125FBB34005AD5BB /* illumina.vschema */,
+ 9DA3A865125FBB21005AD5BB /* abi.vschema */,
+ 9D7356CE117755F4009EA3E4 /* 454.vschema */,
+ 9D7356CF117755F4009EA3E4 /* pevents.vschema */,
+ );
+ name = sra;
+ sourceTree = "<group>";
+ };
+ 9D7356E611775CB7009EA3E4 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 9D31EC99117667FA003CDA5E /* libklib.dylib */,
+ 9D7A412E13FADF3A003087FF /* libksproc.a */,
+ 9D7A415C13FAE00E003087FF /* libkmproc.a */,
+ 9D7A417813FAE192003087FF /* libkdb-cmn.a */,
+ 9D7A423413FAE3F5003087FF /* libkdb.dylib */,
+ 9D7A426813FAE69A003087FF /* libwkdb.dylib */,
+ 9D7A428913FAE9B5003087FF /* libvdb-cmn.a */,
+ 9D7A431C13FAED2E003087FF /* libvdb.dylib */,
+ 9D7A433713FAEE0C003087FF /* libwvdb.dylib */,
+ 9D7A436013FAF1AE003087FF /* libvxf.dylib */,
+ 9D7A440C13FAF315003087FF /* libsraxf.dylib */,
+ 9D7A448C13FAF555003087FF /* libaxf.dylib */,
+ 9D7A44C013FB04A9003087FF /* libalign.dylib */,
+ 9D7A452F13FB0A3C003087FF /* libwvxf.dylib */,
+ 9D7A454B13FB0B4D003087FF /* libwsraxf.dylib */,
+ 9D7A45C713FB0CB8003087FF /* libwaxf.dylib */,
+ 9D7A45E713FB0D50003087FF /* libwalign.dylib */,
+ 9D7A460713FB0F36003087FF /* libkapp.a */,
+ 9D7A461413FB1133003087FF /* deseq */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 9D7A414A13FADFC6003087FF /* bsd */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A414B13FADFC6003087FF /* syslock-priv.h */,
+ 9D7A414C13FADFC6003087FF /* syslock.c */,
+ );
+ name = bsd;
+ path = ../../../libs/kproc/bsd;
+ sourceTree = SOURCE_ROOT;
+ };
+ 9D7A417B13FAE1A2003087FF /* kdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A417D13FAE1DA003087FF /* btree.c */,
+ 9D7A417E13FAE1DA003087FF /* cc-priv.h */,
+ 9D7A417F13FAE1DA003087FF /* coldata-priv.h */,
+ 9D7A418013FAE1DA003087FF /* coldata.c */,
+ 9D7A418113FAE1DA003087FF /* colfmt-priv.h */,
+ 9D7A418213FAE1DA003087FF /* colidx-priv.h */,
+ 9D7A418313FAE1DA003087FF /* colidx.c */,
+ 9D7A418413FAE1DA003087FF /* colidx0-priv.h */,
+ 9D7A418513FAE1DA003087FF /* colidx0.c */,
+ 9D7A418613FAE1DA003087FF /* colidx1-priv.h */,
+ 9D7A418713FAE1DA003087FF /* colidx1.c */,
+ 9D7A418813FAE1DA003087FF /* colidx2-priv.h */,
+ 9D7A418913FAE1DA003087FF /* colidx2.c */,
+ 9D7A418A13FAE1DA003087FF /* column-cc.c */,
+ 9D7A418B13FAE1DA003087FF /* column-priv.h */,
+ 9D7A418C13FAE1DA003087FF /* column.c */,
+ 9D7A418D13FAE1DA003087FF /* database-cc.c */,
+ 9D7A418E13FAE1DA003087FF /* database-cmn.c */,
+ 9D7A418F13FAE1DA003087FF /* database-priv.h */,
+ 9D7A419013FAE1DA003087FF /* database.c */,
+ 9D7A419113FAE1DA003087FF /* dbcc-cmn.c */,
+ 9D7A419213FAE1DA003087FF /* dbmgr-cmn.c */,
+ 9D7A419313FAE1DA003087FF /* dbmgr-priv.h */,
+ 9D7A419413FAE1DA003087FF /* dbmgr.c */,
+ 9D7A419513FAE1DA003087FF /* idstats-priv.h */,
+ 9D7A419613FAE1DA003087FF /* idstats.c */,
+ 9D7A419713FAE1DA003087FF /* idxblk-priv.h */,
+ 9D7A419813FAE1DA003087FF /* idxblk.c */,
+ 9D7A419913FAE1DA003087FF /* index-cmn.h */,
+ 9D7A419A13FAE1DA003087FF /* index-priv.h */,
+ 9D7A419B13FAE1DA003087FF /* index.c */,
+ 9D7A419C13FAE1DA003087FF /* kdb-priv.h */,
+ 9D7A419D13FAE1DA003087FF /* kdb.c */,
+ 9D7A419E13FAE1DA003087FF /* kdbfmt-priv.h */,
+ 9D7A419F13FAE1DA003087FF /* libkdb.vers.h */,
+ 9D7A41A013FAE1DA003087FF /* libwkdb.vers.h */,
+ 9D7A41A113FAE1DA003087FF /* meta.c */,
+ 9D7A41A213FAE1DA003087FF /* ptrieval-v1.c */,
+ 9D7A41A313FAE1DA003087FF /* ptrieval-v2.c */,
+ 9D7A41A413FAE1DA003087FF /* table-cc.c */,
+ 9D7A41A513FAE1DA003087FF /* table-priv.h */,
+ 9D7A41A613FAE1DA003087FF /* table.c */,
+ 9D7A41A713FAE1DA003087FF /* trieidx-priv.h */,
+ 9D7A41A813FAE1DA003087FF /* trieidx-v1.c */,
+ 9D7A41A913FAE1DA003087FF /* trieidx-v2.c */,
+ 9D7A41AA13FAE1DA003087FF /* trieval-v1.c */,
+ 9D7A41AB13FAE1DA003087FF /* trieval-v2.c */,
+ 9D7A41AC13FAE1DA003087FF /* u64idx-v3.c */,
+ 9D7A41AD13FAE1DA003087FF /* wcoldata-priv.h */,
+ 9D7A41AE13FAE1DA003087FF /* wcoldata.c */,
+ 9D7A41AF13FAE1DA003087FF /* wcolidx-priv.h */,
+ 9D7A41B013FAE1DA003087FF /* wcolidx.c */,
+ 9D7A41B113FAE1DA003087FF /* wcolidx0-priv.h */,
+ 9D7A41B213FAE1DA003087FF /* wcolidx0.c */,
+ 9D7A41B313FAE1DA003087FF /* wcolidx1-priv.h */,
+ 9D7A41B413FAE1DA003087FF /* wcolidx1.c */,
+ 9D7A41B513FAE1DA003087FF /* wcolidx2-priv.h */,
+ 9D7A41B613FAE1DA003087FF /* wcolidx2.c */,
+ 9D7A41B713FAE1DA003087FF /* wcolumn-priv.h */,
+ 9D7A41B813FAE1DA003087FF /* wcolumn.c */,
+ 9D7A41B913FAE1DA003087FF /* wdatabase-priv.h */,
+ 9D7A41BA13FAE1DA003087FF /* wdatabase.c */,
+ 9D7A41BB13FAE1DA003087FF /* wdbmgr.c */,
+ 9D7A41BC13FAE1DA003087FF /* werror-priv.h */,
+ 9D7A41BD13FAE1DA003087FF /* widxblk-priv.h */,
+ 9D7A41BE13FAE1DA003087FF /* widxblk.c */,
+ 9D7A41BF13FAE1DA003087FF /* windex-priv.h */,
+ 9D7A41C013FAE1DA003087FF /* windex.c */,
+ 9D7A41C113FAE1DA003087FF /* wkdb-priv.h */,
+ 9D7A41C213FAE1DA003087FF /* wkdb.c */,
+ 9D7A41C313FAE1DA003087FF /* wmeta.c */,
+ 9D7A41C413FAE1DA003087FF /* wtable-priv.h */,
+ 9D7A41C513FAE1DA003087FF /* wtable.c */,
+ 9D7A41C613FAE1DA003087FF /* wtrieidx-v1.c */,
+ 9D7A41C713FAE1DA003087FF /* wtrieidx-v2.c */,
+ 9D7A41C813FAE1DA003087FF /* wu64idx-v3.c */,
+ );
+ name = kdb;
+ sourceTree = "<group>";
+ };
+ 9D7A428C13FAE9C4003087FF /* vdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A430F13FAEC61003087FF /* built-in */,
+ 9D7A432813FAED99003087FF /* read-only */,
+ 9D7A441313FAF394003087FF /* common */,
+ 9D7A441213FAF37A003087FF /* write */,
+ );
+ name = vdb;
+ sourceTree = "<group>";
+ };
+ 9D7A430F13FAEC61003087FF /* built-in */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A42A413FAEA20003087FF /* index_insert.c */,
+ 9D7A42AE13FAEA21003087FF /* meta-append.c */,
+ 9D7A42B013FAEA21003087FF /* meta-attr-write.c */,
+ 9D7A42B313FAEA21003087FF /* meta-write.c */,
+ 9D7A429313FAEA20003087FF /* cast.c */,
+ 9D7A429713FAEA20003087FF /* compare.c */,
+ 9D7A42A213FAEA20003087FF /* environment-read.c */,
+ 9D7A42A313FAEA20003087FF /* fixed-row-len.c */,
+ 9D7A42A513FAEA20003087FF /* index_lookup.c */,
+ 9D7A42A613FAEA20003087FF /* index_project.c */,
+ 9D7A42AD13FAEA21003087FF /* merge.c */,
+ 9D7A42AF13FAEA21003087FF /* meta-attr-read.c */,
+ 9D7A42B113FAEA21003087FF /* meta-read.c */,
+ 9D7A42B213FAEA21003087FF /* meta-value.c */,
+ 9D7A42B613FAEA21003087FF /* parameter-read.c */,
+ 9D7A42C113FAEA21003087FF /* range-validate.c */,
+ 9D7A42C213FAEA21003087FF /* redimension.c */,
+ 9D7A42C313FAEA21003087FF /* row-id.c */,
+ 9D7A42C413FAEA21003087FF /* row-len.c */,
+ 9D7A42D613FAEA21003087FF /* split.c */,
+ );
+ name = "built-in";
+ sourceTree = "<group>";
+ };
+ 9D7A432813FAED99003087FF /* read-only */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A429613FAEA20003087FF /* column.c */,
+ 9D7A429A13FAEA20003087FF /* cursor.c */,
+ 9D7A429E13FAEA20003087FF /* database.c */,
+ 9D7A42A113FAEA20003087FF /* dbmgr.c */,
+ 9D7A42AC13FAEA21003087FF /* linker.c */,
+ 9D7A42BA13FAEA21003087FF /* phys.c */,
+ 9D7A42C013FAEA21003087FF /* prod.c */,
+ 9D7A42DA13FAEA21003087FF /* table.c */,
+ );
+ name = "read-only";
+ sourceTree = "<group>";
+ };
+ 9D7A436313FAF1B4003087FF /* vxf */ = {
+ isa = PBXGroup;
+ children = (
+ 9D320AD5142D0E3F00ACA5AA /* Makefile */,
+ 9D320AAE142D02B000ACA5AA /* extract_token.c */,
+ 9D320AAF142D02B000ACA5AA /* strtonum.c */,
+ 9D7A436713FAF20D003087FF /* add-row-id.c */,
+ 9D7A436813FAF20D003087FF /* bit_or.c */,
+ 9D7A436913FAF20D003087FF /* bunzip.c */,
+ 9D7A436A13FAF20D003087FF /* bzip.c */,
+ 9D7A436B13FAF20D003087FF /* ceil.c */,
+ 9D7A436C13FAF20D003087FF /* checksum.c */,
+ 9D7A436D13FAF20D003087FF /* clip.c */,
+ 9D7A436E13FAF20D003087FF /* cut.c */,
+ 9D7A436F13FAF20D003087FF /* delta.c */,
+ 9D7A437013FAF20D003087FF /* deriv.c */,
+ 9D7A437113FAF20D003087FF /* diff.c */,
+ 9D7A437213FAF20D003087FF /* echo.c */,
+ 9D7A437313FAF20E003087FF /* entrez.c */,
+ 9D7A437413FAF20E003087FF /* exists.c */,
+ 9D7A437513FAF20E003087FF /* floor.c */,
+ 9D7A437613FAF20E003087FF /* fsplit-join.impl.h */,
+ 9D7A437713FAF20E003087FF /* funzip.c */,
+ 9D7A437813FAF20E003087FF /* fzip.c */,
+ 9D7A437913FAF20E003087FF /* integral.c */,
+ 9D7A437A13FAF20E003087FF /* irzip.c */,
+ 9D7A437B13FAF20E003087FF /* irzip.impl.h */,
+ 9D7A437C13FAF20E003087FF /* iunzip.c */,
+ 9D7A437D13FAF20E003087FF /* izip-common.h */,
+ 9D7A437E13FAF20E003087FF /* izip-decode.impl.h */,
+ 9D7A437F13FAF20E003087FF /* izip-encode.impl.h */,
+ 9D7A438013FAF20E003087FF /* izip.c */,
+ 9D7A438113FAF20E003087FF /* libvxf.vers.h */,
+ 9D7A438213FAF20E003087FF /* libvxfentrez.vers.h */,
+ 9D7A438313FAF20E003087FF /* map.c */,
+ 9D7A438413FAF20E003087FF /* math-funcs-impl.h */,
+ 9D7A438513FAF20E003087FF /* max.c */,
+ 9D7A438613FAF20E003087FF /* min.c */,
+ 9D7A438713FAF20E003087FF /* outlier-decoder.c */,
+ 9D7A438813FAF20E003087FF /* outlier-encoder.c */,
+ 9D7A438913FAF20E003087FF /* pack.c */,
+ 9D7A438A13FAF20E003087FF /* paste.c */,
+ 9D7A438B13FAF20E003087FF /* rand_4na_2na.c */,
+ 9D7A438C13FAF20E003087FF /* rldecode.c */,
+ 9D7A438D13FAF20E003087FF /* rlencode.c */,
+ 9D7A438E13FAF20E003087FF /* round.c */,
+ 9D7A438F13FAF20E003087FF /* simple-sub-select.c */,
+ 9D7A439013FAF20E003087FF /* subtract-row-id.c */,
+ 9D7A439113FAF20E003087FF /* sum.c */,
+ 9D7A439213FAF20E003087FF /* trim.c */,
+ 9D7A439313FAF20E003087FF /* trunc.c */,
+ 9D7A439413FAF20E003087FF /* undelta.c */,
+ 9D7A439513FAF20E003087FF /* unpack.c */,
+ 9D7A439613FAF20E003087FF /* unzip.c */,
+ 9D7A439713FAF20E003087FF /* vec-sum.c */,
+ 9D7A439813FAF20E003087FF /* zip.c */,
+ 9D320AB5142D02E600ACA5AA /* sprintf.c */,
+ );
+ name = vxf;
+ sourceTree = "<group>";
+ };
+ 9D7A436513FAF1BC003087FF /* sraxf */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A43DE13FAF2EF003087FF /* bio-start.c */,
+ 9D7A43DF13FAF2EF003087FF /* color-from-dna.c */,
+ 9D7A43E013FAF2EF003087FF /* denormalize.c */,
+ 9D7A43E113FAF2EF003087FF /* dna-from-color.c */,
+ 9D7A43E213FAF2EF003087FF /* dynamic-454-read-descriptor.c */,
+ 9D7A43E313FAF2EF003087FF /* extract-coordinates.c */,
+ 9D7A43E413FAF2EF003087FF /* extract-name_coord.c */,
+ 9D7A43E513FAF2EF003087FF /* extract-name_fmt.c */,
+ 9D7A43E613FAF2EF003087FF /* extract-spot_name.c */,
+ 9D7A43E713FAF2EF003087FF /* format-spot-name.c */,
+ 9D7A43E813FAF2EF003087FF /* fpcodec.c */,
+ 9D7A43E913FAF2EF003087FF /* index_lookup.c */,
+ 9D7A43EA13FAF2EF003087FF /* libsraxf.vers.h */,
+ 9D7A43EB13FAF2EF003087FF /* libwsraxf.vers.h */,
+ 9D7A43EC13FAF2EF003087FF /* make-position.c */,
+ 9D7A43ED13FAF2EF003087FF /* name-tokenizer.h */,
+ 9D7A43EE13FAF2EF003087FF /* normalize.c */,
+ 9D7A43EF13FAF2EF003087FF /* prefix-tree-to-name.c */,
+ 9D7A43F013FAF2EF003087FF /* process-position.c */,
+ 9D7A43F113FAF2EF003087FF /* qual4_codec.h */,
+ 9D7A43F213FAF2EF003087FF /* qual4_decode.c */,
+ 9D7A43F313FAF2EF003087FF /* qual4_encode.c */,
+ 9D7A43F413FAF2EF003087FF /* read-desc.c */,
+ 9D7A43F513FAF2EF003087FF /* read-seg-from-readn.c */,
+ 9D7A43F613FAF2EF003087FF /* rewrite-spot-name.c */,
+ 9D7A43F713FAF2EF003087FF /* rotate.c */,
+ 9D7A43F813FAF2EF003087FF /* spot-desc.c */,
+ 9D7A43F913FAF2EF003087FF /* stats_quality.c */,
+ 9D7A43FA13FAF2EF003087FF /* stats.c */,
+ 9D7A43FB13FAF2EF003087FF /* swap.c */,
+ 9D7A43FC13FAF2EF003087FF /* tokenize-spot_name-454.c */,
+ 9D7A43FD13FAF2EF003087FF /* tokenize-spot_name-abi.c */,
+ 9D7A43FE13FAF2EF003087FF /* tokenize-spot_name-helicos.c */,
+ 9D7A43FF13FAF2EF003087FF /* tokenize-spot_name-illumina.c */,
+ 9D7A440013FAF2EF003087FF /* tokenize-spot_name-ion-torrent.c */,
+ 9D7A440113FAF2EF003087FF /* untyped-priv.h */,
+ 9D7A440213FAF2EF003087FF /* untyped.c */,
+ 9D7A440313FAF2EF003087FF /* v0-decompress-init.c */,
+ 9D7A440413FAF2EF003087FF /* v0-decompress-local.h */,
+ 9D7A440513FAF2EF003087FF /* v0-decompress.c */,
+ 9D7A440613FAF2EF003087FF /* v0-decompress.h */,
+ 9D7A440713FAF2EF003087FF /* v0-funcs.c */,
+ );
+ name = sraxf;
+ sourceTree = "<group>";
+ };
+ 9D7A436613FAF1C2003087FF /* axf */ = {
+ isa = PBXGroup;
+ children = (
+ 9D4DCEAB1423FD9600881098 /* ref-preserve_qual.c */,
+ 9DE55A78140EA19500EA61C6 /* raw-restore-qual.c */,
+ 9D7A447613FAF539003087FF /* align-local_ref_id.c */,
+ 9D7A447713FAF539003087FF /* align-local_ref_start.c */,
+ 9D7A447813FAF539003087FF /* align-ref-name.c */,
+ 9D7A447913FAF539003087FF /* align-ref-pos.c */,
+ 9D7A447A13FAF539003087FF /* align-ref-seq-id.c */,
+ 9D7A447B13FAF539003087FF /* align-restore-read.c */,
+ 9D7A447C13FAF539003087FF /* cigar.c */,
+ 9D7A447D13FAF539003087FF /* get-sam-flags.c */,
+ 9D7A447E13FAF539003087FF /* libaxf.vers.h */,
+ 9D7A447F13FAF539003087FF /* libwaxf.vers.h */,
+ 9D7A448013FAF539003087FF /* not-my-row.c */,
+ 9D7A448113FAF539003087FF /* project_read_from_sequence.c */,
+ 9D7A448213FAF539003087FF /* raw-restore-read.c */,
+ 9D7A448313FAF539003087FF /* ref-restore-read.c */,
+ 9D7A448413FAF539003087FF /* ref-tbl-sub-select.c */,
+ 9D7A448513FAF539003087FF /* refseq-stats.c */,
+ 9D7A448613FAF539003087FF /* seq-restore-read.c */,
+ 9D7A448713FAF539003087FF /* template-len.c */,
+ 9DE55A84140EA93600EA61C6 /* generate-mismatch-qual.c */,
+ 9DE55AAE140EC79C00EA61C6 /* mismatch-restore-qual.c */,
+ );
+ name = axf;
+ sourceTree = "<group>";
+ };
+ 9D7A441213FAF37A003087FF /* write */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A42DB13FAEA21003087FF /* wcolumn.c */,
+ 9D7A42DC13FAEA21003087FF /* wcursor.c */,
+ 9D7A42DD13FAEA21003087FF /* wdatabase.c */,
+ 9D7A42DE13FAEA21003087FF /* wdbmgr.c */,
+ 9D7A42DF13FAEA21003087FF /* wlinker.c */,
+ 9D7A42E013FAEA21003087FF /* wphys.c */,
+ 9D7A42E113FAEA21003087FF /* wprod.c */,
+ 9D7A42E213FAEA21003087FF /* wtable.c */,
+ );
+ name = write;
+ sourceTree = "<group>";
+ };
+ 9D7A441313FAF394003087FF /* common */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A428E13FAEA20003087FF /* blob-headers.c */,
+ 9D7A428F13FAEA20003087FF /* blob-headers.h */,
+ 9D7A429013FAEA20003087FF /* blob-priv.h */,
+ 9D7A429113FAEA20003087FF /* blob.c */,
+ 9D7A429213FAEA20003087FF /* blob.h */,
+ 9D7A429413FAEA20003087FF /* column-cmn.c */,
+ 9D7A429513FAEA20003087FF /* column-priv.h */,
+ 9D7A42E313FAEA21003087FF /* xform-priv.h */,
+ 9D7A429813FAEA20003087FF /* cursor-cmn.c */,
+ 9D7A429913FAEA20003087FF /* cursor-priv.h */,
+ 9D7A429B13FAEA20003087FF /* database-cmn.c */,
+ 9D7A429C13FAEA20003087FF /* database-load.c */,
+ 9D7A429D13FAEA20003087FF /* database-priv.h */,
+ 9D7A429F13FAEA20003087FF /* dbmgr-cmn.c */,
+ 9D7A42A013FAEA20003087FF /* dbmgr-priv.h */,
+ 9D7A42A713FAEA20003087FF /* libvdb.vers.h */,
+ 9D7A42A813FAEA20003087FF /* libwvdb.vers.h */,
+ 9D7A42A913FAEA20003087FF /* linker-cmn.c */,
+ 9D7A42AA13FAEA20003087FF /* linker-int.c */,
+ 9D7A42AB13FAEA21003087FF /* linker-priv.h */,
+ 9D7A42B413FAEA21003087FF /* page-map.c */,
+ 9D7A42B513FAEA21003087FF /* page-map.h */,
+ 9D7A42B713FAEA21003087FF /* phys-cmn.c */,
+ 9D7A42B813FAEA21003087FF /* phys-load.c */,
+ 9D7A42B913FAEA21003087FF /* phys-priv.h */,
+ 9D7A42BB13FAEA21003087FF /* prod-cmn.c */,
+ 9D7A42BC13FAEA21003087FF /* prod-expr.c */,
+ 9D7A42BD13FAEA21003087FF /* prod-expr.h */,
+ 9D7A42BE13FAEA21003087FF /* prod-func.c */,
+ 9D7A42BF13FAEA21003087FF /* prod-priv.h */,
+ 9D7A42C513FAEA21003087FF /* schema-db.c */,
+ 9D7A42C613FAEA21003087FF /* schema-dump.c */,
+ 9D7A42C713FAEA21003087FF /* schema-dump.h */,
+ 9D7A42C813FAEA21003087FF /* schema-eval.c */,
+ 9D7A42C913FAEA21003087FF /* schema-expr.c */,
+ 9D7A42CA13FAEA21003087FF /* schema-expr.h */,
+ 9D7A42CB13FAEA21003087FF /* schema-func.c */,
+ 9D7A42CC13FAEA21003087FF /* schema-int.c */,
+ 9D7A42CD13FAEA21003087FF /* schema-parse.c */,
+ 9D7A42CE13FAEA21003087FF /* schema-parse.h */,
+ 9D7A42CF13FAEA21003087FF /* schema-priv.h */,
+ 9D7A42D013FAEA21003087FF /* schema-prod.c */,
+ 9D7A42D113FAEA21003087FF /* schema-tbl.c */,
+ 9D7A42D213FAEA21003087FF /* schema-tok.c */,
+ 9D7A42D313FAEA21003087FF /* schema-tok.h */,
+ 9D7A42D413FAEA21003087FF /* schema-type.c */,
+ 9D7A42D513FAEA21003087FF /* schema.c */,
+ 9D7A42D713FAEA21003087FF /* table-cmn.c */,
+ 9D7A42D813FAEA21003087FF /* table-load.c */,
+ 9D7A42D913FAEA21003087FF /* table-priv.h */,
+ );
+ name = common;
+ sourceTree = "<group>";
+ };
+ 9D7A444F13FAF455003087FF /* search */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A445013FAF48E003087FF /* agrep-dp.c */,
+ 9D7A445113FAF48E003087FF /* agrep-myers.c */,
+ 9D7A445213FAF48E003087FF /* agrep-myersunltd.c */,
+ 9D7A445313FAF48E003087FF /* agrep-wumanber.c */,
+ 9D7A445413FAF48E003087FF /* fgrep-aho.c */,
+ 9D7A445513FAF48E003087FF /* fgrep-boyermoore.c */,
+ 9D7A445613FAF48E003087FF /* fgrep-dumb.c */,
+ 9D7A445713FAF48E003087FF /* libksrch.vers.h */,
+ 9D7A445813FAF48E003087FF /* nucstrstr.c */,
+ 9D7A445913FAF48E003087FF /* search-priv.h */,
+ 9D7A445A13FAF48E003087FF /* search.c */,
+ );
+ name = search;
+ sourceTree = "<group>";
+ };
+ 9D7A44AA13FB0466003087FF /* align */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A44AB13FB0494003087FF /* align-access.c */,
+ 9D7A44AC13FB0494003087FF /* bam-priv.h */,
+ 9D7A44AD13FB0494003087FF /* bam.c */,
+ 9D7A44AE13FB0494003087FF /* reader-cmn.c */,
+ 9D7A44AF13FB0494003087FF /* reader-cmn.h */,
+ 9D7A44B013FB0494003087FF /* reader-refseq.c */,
+ 9D7A44B113FB0494003087FF /* refseq-mgr-priv.h */,
+ 9D7A44B213FB0494003087FF /* refseq-mgr.c */,
+ 9D7A44B413FB0494003087FF /* writer-alignment.c */,
+ 9D7A44B513FB0494003087FF /* writer-cmn.c */,
+ 9D7A44B613FB0494003087FF /* writer-priv.h */,
+ 9D7A44B713FB0494003087FF /* writer-ref.c */,
+ 9D7A44B813FB0494003087FF /* writer-ref.h */,
+ 9D7A44B913FB0494003087FF /* writer-reference.c */,
+ 9D7A44BA13FB0494003087FF /* writer-refseq.c */,
+ 9D7A44BB13FB0494003087FF /* writer-sequence.c */,
+ );
+ name = align;
+ sourceTree = "<group>";
+ };
+ 9D7A460E13FB0F69003087FF /* deseq */ = {
+ isa = PBXGroup;
+ children = (
+ 9D320A0A142B813300ACA5AA /* Makefile */,
+ 9D7A461013FB1128003087FF /* deseq.c */,
+ );
+ name = deseq;
+ sourceTree = "<group>";
+ };
+ 9D7A469013FB1FAC003087FF /* align */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A469113FB1FC5003087FF /* align.vschema */,
+ 9D7A469213FB1FC5003087FF /* refseq.vschema */,
+ 9D7A469313FB1FC5003087FF /* seq.vschema */,
+ );
+ name = align;
+ sourceTree = "<group>";
+ };
+ 9D819B3411DB9D5200DA4D3C /* Tools */ = {
+ isa = PBXGroup;
+ children = (
+ 9D7A460E13FB0F69003087FF /* deseq */,
+ );
+ name = Tools;
+ sourceTree = "<group>";
+ };
+ 9D8EC47011C2F081000F1048 /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Tests;
+ sourceTree = "<group>";
+ };
+ 9D985E8B12886C3A00849729 /* kfg */ = {
+ isa = PBXGroup;
+ children = (
+ 9D1235B414F571AC00ECC72C /* config-grammar.c */,
+ 9D1235B514F571AC00ECC72C /* config-grammar.y */,
+ 9D1235B614F571AC00ECC72C /* config-lex.c */,
+ 9D1235B714F571AC00ECC72C /* config-lex.l */,
+ 9D1235B814F571AC00ECC72C /* config-tokens.h */,
+ 9D1235B914F571AC00ECC72C /* config.linux.kfg */,
+ 9D1235BA14F571AC00ECC72C /* config.win.kfg */,
+ 9D1235BB14F571AC00ECC72C /* kfg-parse.h */,
+ 9D985FCB1288BA8700849729 /* config.mac.kfg */,
+ 9D985E8C12886C6100849729 /* config.c */,
+ );
+ name = kfg;
+ sourceTree = "<group>";
+ };
+ 9DB6A8D411EB9F2100168DE0 /* interfaces */ = {
+ isa = PBXGroup;
+ children = (
+ 9D6FFB2F145094B000952EB7 /* align */,
+ );
+ name = interfaces;
+ path = ../../../interfaces;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 9D31EC95117667FA003CDA5E /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A410713FADCFE003087FF /* path-priv.h in Headers */,
+ 9D7A411613FADD33003087FF /* sysdir-priv.h in Headers */,
+ 9D7A411713FADD33003087FF /* sysfile-priv.h in Headers */,
+ 9D7A445D13FAF49A003087FF /* libksrch.vers.h in Headers */,
+ 9D7A446013FAF49A003087FF /* search-priv.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A412A13FADF3A003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A415813FAE00E003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A417413FAE192003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A423013FAE3F5003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A426413FAE69A003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A428513FAE9B5003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A431813FAED2E003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A433313FAEE0C003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A435C13FAF1AE003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A440813FAF315003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A441A13FAF3B5003087FF /* qual4_codec.h in Headers */,
+ 9D7A441B13FAF3B5003087FF /* libwsraxf.vers.h in Headers */,
+ 9D7A442413FAF3B5003087FF /* v0-decompress-local.h in Headers */,
+ 9D7A443213FAF3B5003087FF /* libsraxf.vers.h in Headers */,
+ 9D7A443913FAF3B5003087FF /* v0-decompress.h in Headers */,
+ 9D7A443B13FAF3B5003087FF /* name-tokenizer.h in Headers */,
+ 9D7A443C13FAF3B5003087FF /* untyped-priv.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A448813FAF555003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A44BC13FB04A9003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A452B13FB0A3C003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A454713FB0B4D003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45AF13FB0CB8003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45D813FB0D50003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A460313FB0F36003087FF /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 9D31EC98117667FA003CDA5E /* klib */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D31ECBB11766836003CDA5E /* Build configuration list for PBXNativeTarget "klib" */;
+ buildPhases = (
+ 9D31EC95117667FA003CDA5E /* Headers */,
+ 9D31EC96117667FA003CDA5E /* Sources */,
+ 9D31EC97117667FA003CDA5E /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = klib;
+ productName = klib;
+ productReference = 9D31EC99117667FA003CDA5E /* libklib.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A412D13FADF3A003087FF /* ksproc */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A414713FADF98003087FF /* Build configuration list for PBXNativeTarget "ksproc" */;
+ buildPhases = (
+ 9D7A412A13FADF3A003087FF /* Headers */,
+ 9D7A412B13FADF3A003087FF /* Sources */,
+ 9D7A412C13FADF3A003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = ksproc;
+ productName = ksproc;
+ productReference = 9D7A412E13FADF3A003087FF /* libksproc.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 9D7A415B13FAE00E003087FF /* kmproc */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A417013FAE0A5003087FF /* Build configuration list for PBXNativeTarget "kmproc" */;
+ buildPhases = (
+ 9D7A415813FAE00E003087FF /* Headers */,
+ 9D7A415913FAE00E003087FF /* Sources */,
+ 9D7A415A13FAE00E003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = kmproc;
+ productName = kmproc;
+ productReference = 9D7A415C13FAE00E003087FF /* libkmproc.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 9D7A417713FAE192003087FF /* kdb-cmn */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A417C13FAE1A2003087FF /* Build configuration list for PBXNativeTarget "kdb-cmn" */;
+ buildPhases = (
+ 9D7A417413FAE192003087FF /* Headers */,
+ 9D7A417513FAE192003087FF /* Sources */,
+ 9D7A417613FAE192003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "kdb-cmn";
+ productName = "kdb-cmn";
+ productReference = 9D7A417813FAE192003087FF /* libkdb-cmn.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 9D7A423313FAE3F5003087FF /* kdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A423A13FAE42A003087FF /* Build configuration list for PBXNativeTarget "kdb" */;
+ buildPhases = (
+ 9D7A423013FAE3F5003087FF /* Headers */,
+ 9D7A423113FAE3F5003087FF /* Sources */,
+ 9D7A423213FAE3F5003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44FE13FB05F2003087FF /* PBXTargetDependency */,
+ 9D7A423813FAE3FD003087FF /* PBXTargetDependency */,
+ );
+ name = kdb;
+ productName = kdb;
+ productReference = 9D7A423413FAE3F5003087FF /* libkdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A426713FAE69A003087FF /* wkdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A427313FAE709003087FF /* Build configuration list for PBXNativeTarget "wkdb" */;
+ buildPhases = (
+ 9D7A426413FAE69A003087FF /* Headers */,
+ 9D7A426513FAE69A003087FF /* Sources */,
+ 9D7A426613FAE69A003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44FC13FB05EB003087FF /* PBXTargetDependency */,
+ 9D7A428413FAE9A0003087FF /* PBXTargetDependency */,
+ );
+ name = wkdb;
+ productName = wkdb;
+ productReference = 9D7A426813FAE69A003087FF /* libwkdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A428813FAE9B5003087FF /* vdb-cmn */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A428D13FAE9C5003087FF /* Build configuration list for PBXNativeTarget "vdb-cmn" */;
+ buildPhases = (
+ 9D7A428513FAE9B5003087FF /* Headers */,
+ 9D7A428613FAE9B5003087FF /* Sources */,
+ 9D7A428713FAE9B5003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "vdb-cmn";
+ productName = "vdb-cmn";
+ productReference = 9D7A428913FAE9B5003087FF /* libvdb-cmn.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 9D7A431B13FAED2E003087FF /* vdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A432713FAED97003087FF /* Build configuration list for PBXNativeTarget "vdb" */;
+ buildPhases = (
+ 9D7A431813FAED2E003087FF /* Headers */,
+ 9D7A431913FAED2E003087FF /* Sources */,
+ 9D7A431A13FAED2E003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44F413FB05A9003087FF /* PBXTargetDependency */,
+ 9D7A44F213FB05A9003087FF /* PBXTargetDependency */,
+ 9D7A450613FB06AB003087FF /* PBXTargetDependency */,
+ );
+ name = vdb;
+ productName = vdb;
+ productReference = 9D7A431C13FAED2E003087FF /* libvdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A433613FAEE0C003087FF /* wvdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A434A13FAEE8A003087FF /* Build configuration list for PBXNativeTarget "wvdb" */;
+ buildPhases = (
+ 9D7A433313FAEE0C003087FF /* Headers */,
+ 9D7A433413FAEE0C003087FF /* Sources */,
+ 9D7A433513FAEE0C003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44FA13FB05C9003087FF /* PBXTargetDependency */,
+ 9D7A44F813FB05C9003087FF /* PBXTargetDependency */,
+ 9D7A44F613FB05C9003087FF /* PBXTargetDependency */,
+ 9D7A450813FB06BD003087FF /* PBXTargetDependency */,
+ );
+ name = wvdb;
+ productName = wvdb;
+ productReference = 9D7A433713FAEE0C003087FF /* libwvdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A435F13FAF1AE003087FF /* vxf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A436413FAF1B4003087FF /* Build configuration list for PBXNativeTarget "vxf" */;
+ buildPhases = (
+ 9D7A435C13FAF1AE003087FF /* Headers */,
+ 9D7A435D13FAF1AE003087FF /* Sources */,
+ 9D7A435E13FAF1AE003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44E813FB057E003087FF /* PBXTargetDependency */,
+ 9D7A44EA13FB0582003087FF /* PBXTargetDependency */,
+ );
+ name = vxf;
+ productName = vxf;
+ productReference = 9D7A436013FAF1AE003087FF /* libvxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A440B13FAF315003087FF /* sraxf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A441013FAF333003087FF /* Build configuration list for PBXNativeTarget "sraxf" */;
+ buildPhases = (
+ 9D7A440813FAF315003087FF /* Headers */,
+ 9D7A440913FAF315003087FF /* Sources */,
+ 9D7A440A13FAF315003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A446F13FAF4B6003087FF /* PBXTargetDependency */,
+ 9D7A446D13FAF4B3003087FF /* PBXTargetDependency */,
+ 9D7A446913FAF4A9003087FF /* PBXTargetDependency */,
+ );
+ name = sraxf;
+ productName = sraxf;
+ productReference = 9D7A440C13FAF315003087FF /* libsraxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A448B13FAF555003087FF /* axf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A44A913FAF5C7003087FF /* Build configuration list for PBXNativeTarget "axf" */;
+ buildPhases = (
+ 9D7A448813FAF555003087FF /* Headers */,
+ 9D7A448913FAF555003087FF /* Sources */,
+ 9D7A448A13FAF555003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44E613FB0561003087FF /* PBXTargetDependency */,
+ 9D7A44E213FB0551003087FF /* PBXTargetDependency */,
+ 9D7A44E013FB0546003087FF /* PBXTargetDependency */,
+ );
+ name = axf;
+ productName = axf;
+ productReference = 9D7A448C13FAF555003087FF /* libaxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A44BF13FB04A9003087FF /* align */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A44FF13FB0621003087FF /* Build configuration list for PBXNativeTarget "align" */;
+ buildPhases = (
+ 9D7A44BC13FB04A9003087FF /* Headers */,
+ 9D7A44BD13FB04A9003087FF /* Sources */,
+ 9D7A44BE13FB04A9003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A44F013FB0597003087FF /* PBXTargetDependency */,
+ 9D7A44EE13FB0597003087FF /* PBXTargetDependency */,
+ 9D7A44EC13FB0597003087FF /* PBXTargetDependency */,
+ );
+ name = align;
+ productName = align;
+ productReference = 9D7A44C013FB04A9003087FF /* libalign.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A452E13FB0A3C003087FF /* wvxf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A454613FB0AF3003087FF /* Build configuration list for PBXNativeTarget "wvxf" */;
+ buildPhases = (
+ 9D7A452B13FB0A3C003087FF /* Headers */,
+ 9D7A452C13FB0A3C003087FF /* Sources */,
+ 9D7A452D13FB0A3C003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D4DCEE41424001C00881098 /* PBXTargetDependency */,
+ 9D4DCEE21424001400881098 /* PBXTargetDependency */,
+ 9D4DCEDC1423FF6E00881098 /* PBXTargetDependency */,
+ );
+ name = wvxf;
+ productName = wvxf;
+ productReference = 9D7A452F13FB0A3C003087FF /* libwvxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A454A13FB0B4D003087FF /* wsraxf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A455A13FB0BAF003087FF /* Build configuration list for PBXNativeTarget "wsraxf" */;
+ buildPhases = (
+ 9D7A454713FB0B4D003087FF /* Headers */,
+ 9D7A454813FB0B4D003087FF /* Sources */,
+ 9D7A454913FB0B4D003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D4DCEEB1424008500881098 /* PBXTargetDependency */,
+ 9D4DCEE91424007F00881098 /* PBXTargetDependency */,
+ 9D4DCEE71424007400881098 /* PBXTargetDependency */,
+ );
+ name = wsraxf;
+ productName = wsraxf;
+ productReference = 9D7A454B13FB0B4D003087FF /* libwsraxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A45A813FB0CB8003087FF /* waxf */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A45C413FB0CB8003087FF /* Build configuration list for PBXNativeTarget "waxf" */;
+ buildPhases = (
+ 9D7A45AF13FB0CB8003087FF /* Headers */,
+ 9D7A45B013FB0CB8003087FF /* Sources */,
+ 9D7A45C013FB0CB8003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D4DCEEF142400B900881098 /* PBXTargetDependency */,
+ 9D4DCEED142400B400881098 /* PBXTargetDependency */,
+ 9D7A45A913FB0CB8003087FF /* PBXTargetDependency */,
+ 9D7A45AD13FB0CB8003087FF /* PBXTargetDependency */,
+ );
+ name = waxf;
+ productName = axf;
+ productReference = 9D7A45C713FB0CB8003087FF /* libwaxf.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A45D113FB0D50003087FF /* walign */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A45E413FB0D50003087FF /* Build configuration list for PBXNativeTarget "walign" */;
+ buildPhases = (
+ 9D7A45D813FB0D50003087FF /* Headers */,
+ 9D7A45D913FB0D50003087FF /* Sources */,
+ 9D7A45DF13FB0D50003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D7A45D213FB0D50003087FF /* PBXTargetDependency */,
+ 9D7A45D413FB0D50003087FF /* PBXTargetDependency */,
+ 9D7A45D613FB0D50003087FF /* PBXTargetDependency */,
+ );
+ name = walign;
+ productName = align;
+ productReference = 9D7A45E713FB0D50003087FF /* libwalign.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D7A460613FB0F36003087FF /* kapp */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A460F13FB0F69003087FF /* Build configuration list for PBXNativeTarget "kapp" */;
+ buildPhases = (
+ 9D7A460313FB0F36003087FF /* Headers */,
+ 9D7A460413FB0F36003087FF /* Sources */,
+ 9D7A460513FB0F36003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = kapp;
+ productName = kapp;
+ productReference = 9D7A460713FB0F36003087FF /* libkapp.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 9D7A461313FB1133003087FF /* deseq */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D7A461C13FB116A003087FF /* Build configuration list for PBXNativeTarget "deseq" */;
+ buildPhases = (
+ 9D7A461113FB1133003087FF /* Sources */,
+ 9D7A461213FB1133003087FF /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9DE55AFE140EF0C800EA61C6 /* PBXTargetDependency */,
+ 9DE55A9A140EAC9E00EA61C6 /* PBXTargetDependency */,
+ 9DE55A98140EAC9E00EA61C6 /* PBXTargetDependency */,
+ 9DE55A96140EAC9E00EA61C6 /* PBXTargetDependency */,
+ 9DE55935140D82CD00EA61C6 /* PBXTargetDependency */,
+ 9DE55933140D82BC00EA61C6 /* PBXTargetDependency */,
+ 9DE55931140D82BC00EA61C6 /* PBXTargetDependency */,
+ );
+ name = deseq;
+ productName = deseq;
+ productReference = 9D7A461413FB1133003087FF /* deseq */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ ORGANIZATIONNAME = NCBI/NLM/NIH;
+ };
+ buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "asm-trace" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* asm-trace */;
+ productRefGroup = 9D7356E611775CB7009EA3E4 /* Products */;
+ projectDirPath = "";
+ projectRoot = ../../..;
+ targets = (
+ 9D7357F311779B2A009EA3E4 /* make-env */,
+ 9D7A412D13FADF3A003087FF /* ksproc */,
+ 9D7A415B13FAE00E003087FF /* kmproc */,
+ 9D31EC98117667FA003CDA5E /* klib */,
+ 9D7A417713FAE192003087FF /* kdb-cmn */,
+ 9D7A423313FAE3F5003087FF /* kdb */,
+ 9D7A426713FAE69A003087FF /* wkdb */,
+ 9D7A428813FAE9B5003087FF /* vdb-cmn */,
+ 9D7A431B13FAED2E003087FF /* vdb */,
+ 9D7A433613FAEE0C003087FF /* wvdb */,
+ 9D7A44BF13FB04A9003087FF /* align */,
+ 9D7A435F13FAF1AE003087FF /* vxf */,
+ 9D7A440B13FAF315003087FF /* sraxf */,
+ 9D7A448B13FAF555003087FF /* axf */,
+ 9D7A452E13FB0A3C003087FF /* wvxf */,
+ 9D7A454A13FB0B4D003087FF /* wsraxf */,
+ 9D7A45A813FB0CB8003087FF /* waxf */,
+ 9D7A45D113FB0D50003087FF /* walign */,
+ 9D7A460613FB0F36003087FF /* kapp */,
+ 9D7A461313FB1133003087FF /* deseq */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 9D7357F211779B2A009EA3E4 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"Setting up run-time environment\"\nmkdir -p $BUILT_PRODUCTS_DIR\n\ncd ../../..\nTOP=`pwd`\nmake -s vers-includes\n\nschema=\"$TOP/interfaces\"\n\ncd $BUILT_PRODUCTS_DIR\n\n[ -e schema ] || ln -s $schema schema\n\ncase $ARCHS in\n\t($ARCHS_STANDARD_32_BIT)\n\t\tmod=\"mod32\"\n\t\twmod=\"wmod32\";\n\t\t;;\n\t($ARCHS_STANDARD_64_BIT)\n\t\tmod=\"mod64\"\n\t\twmod=\"wmod64\";\n\t\t;;\nesac\n\nmkdir -p ${mod}\ncd $mod\nrm -rf *\nln -s ../libvxf.dylib .\nln -s ../libsra [...]
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 9D31EC96117667FA003CDA5E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9DFECDC711766982004EFD0D /* arc.c in Sources */,
+ 9DFECDC811766982004EFD0D /* buffile.c in Sources */,
+ 9DFECDC911766982004EFD0D /* bzip.c in Sources */,
+ 9DFECDCA11766982004EFD0D /* countfile.c in Sources */,
+ 9DFECDCB11766982004EFD0D /* crc32.c in Sources */,
+ 9DFECDCC11766982004EFD0D /* dir_test.c in Sources */,
+ 9DFECDCD11766982004EFD0D /* directory.c in Sources */,
+ 9DFECDCE11766982004EFD0D /* file.c in Sources */,
+ 9DFECDD011766982004EFD0D /* gzip.c in Sources */,
+ 9DFECDD111766982004EFD0D /* md5.c in Sources */,
+ 9DFECDD211766982004EFD0D /* nullfile.c in Sources */,
+ 9DFECDD311766982004EFD0D /* sra.c in Sources */,
+ 9DFECDD411766982004EFD0D /* subfile.c in Sources */,
+ 9DFECDD511766982004EFD0D /* sysdir.c in Sources */,
+ 9DFECDD611766982004EFD0D /* sysdll.c in Sources */,
+ 9DFECDD711766982004EFD0D /* sysfile.c in Sources */,
+ 9DFECDD811766982004EFD0D /* sysmmap.c in Sources */,
+ 9DFECDD911766982004EFD0D /* tar.c in Sources */,
+ 9DFECDDA11766982004EFD0D /* teefile.c in Sources */,
+ 9DFECDDB11766982004EFD0D /* toc.c in Sources */,
+ 9DFECDDC11766982004EFD0D /* tocdir.c in Sources */,
+ 9DFECDDD11766982004EFD0D /* tocentry.c in Sources */,
+ 9DFECDDE11766982004EFD0D /* tocfile.c in Sources */,
+ 9DFECDC511766952004EFD0D /* xml.c in Sources */,
+ 9D31EC9D1176680A003CDA5E /* bstpersist.c in Sources */,
+ 9D31EC9E1176680A003CDA5E /* container.c in Sources */,
+ 9D31EC9F1176680B003CDA5E /* cp1252.c in Sources */,
+ 9D31ECA01176680B003CDA5E /* crc32.c in Sources */,
+ 9D31ECA11176680C003CDA5E /* data-buffer.c in Sources */,
+ 9D31ECA21176680C003CDA5E /* iso8859-1.c in Sources */,
+ 9D31ECA31176680D003CDA5E /* iso8859.c in Sources */,
+ 9D31ECA41176680D003CDA5E /* log.c in Sources */,
+ 9D31ECA51176680E003CDA5E /* md5.c in Sources */,
+ 9D31ECA61176680E003CDA5E /* namelist.c in Sources */,
+ 9D31ECA71176680F003CDA5E /* pack.c in Sources */,
+ 9D31ECA81176680F003CDA5E /* pbstree.c in Sources */,
+ 9D31ECA911766810003CDA5E /* ptpersist.c in Sources */,
+ 9D31ECAA11766810003CDA5E /* ptrie.c in Sources */,
+ 9D31ECAB11766811003CDA5E /* rc-idx-tbl.c in Sources */,
+ 9D31ECAC11766811003CDA5E /* rc-tbl.c in Sources */,
+ 9D31ECAD11766812003CDA5E /* symtab.c in Sources */,
+ 9D31ECAE11766813003CDA5E /* syslog.c in Sources */,
+ 9D31ECB011766814003CDA5E /* text.c in Sources */,
+ 9D31ECB111766815003CDA5E /* token.c in Sources */,
+ 9D31ECB211766815003CDA5E /* trie.c in Sources */,
+ 9D31ECB411766816003CDA5E /* unpack.c in Sources */,
+ 9D31ECB511766817003CDA5E /* utf8.c in Sources */,
+ 9D31ECB611766818003CDA5E /* vector.c in Sources */,
+ 9D31ECB711766818003CDA5E /* vlen-encode.c in Sources */,
+ 9D8EC41B11C2E49E000F1048 /* pbstree-native.c in Sources */,
+ 9D8EC41C11C2E49E000F1048 /* pbstree-swapped.c in Sources */,
+ 9D8198A911D3D39700DA4D3C /* vector_namelist.c in Sources */,
+ 9D1EC483122D914C00C11287 /* printf.c in Sources */,
+ 9D1EC484122D914C00C11287 /* status-rc-strings.c in Sources */,
+ 9D1EC485122D914C00C11287 /* status-rc.c in Sources */,
+ 9D1EC486122D914C00C11287 /* status.c in Sources */,
+ 9D62F42A124D01AE003D38E9 /* bsearch.c in Sources */,
+ 9D62F42B124D01AE003D38E9 /* qsort.c in Sources */,
+ 9DA3A84E125FA3A8005AD5BB /* refcount.c in Sources */,
+ 9DA3A88512663646005AD5BB /* syswriter.c in Sources */,
+ 9DA3A8961266375B005AD5BB /* writer.c in Sources */,
+ 9DA3A89A12663798005AD5BB /* out.c in Sources */,
+ 9D985E8D12886C6100849729 /* config.c in Sources */,
+ 9DF1902C128DAEBA00FED4AA /* debug.c in Sources */,
+ 9D8204F8130F1100009A8B64 /* pagefile.c in Sources */,
+ 9D7A40DB13FADBA3003087FF /* SHA-32bit.c in Sources */,
+ 9D7A40DC13FADBA3003087FF /* SHA-64bit.c in Sources */,
+ 9D7A40E113FADBEE003087FF /* syserrcode.c in Sources */,
+ 9D7A40E213FADBEE003087FF /* systime.c in Sources */,
+ 9D7A40FF13FADCFE003087FF /* buffile-write.c in Sources */,
+ 9D7A410613FADCFE003087FF /* mmap.c in Sources */,
+ 9D7A410913FADCFE003087FF /* pmem.c in Sources */,
+ 9D7A445B13FAF49A003087FF /* agrep-myersunltd.c in Sources */,
+ 9D7A445C13FAF49A003087FF /* agrep-wumanber.c in Sources */,
+ 9D7A445E13FAF49A003087FF /* agrep-myers.c in Sources */,
+ 9D7A445F13FAF49A003087FF /* fgrep-boyermoore.c in Sources */,
+ 9D7A446113FAF49A003087FF /* fgrep-dumb.c in Sources */,
+ 9D7A446213FAF49A003087FF /* search.c in Sources */,
+ 9D7A446313FAF49A003087FF /* agrep-dp.c in Sources */,
+ 9D7A446413FAF49A003087FF /* fgrep-aho.c in Sources */,
+ 9D7A446513FAF49A003087FF /* nucstrstr.c in Sources */,
+ 9D1235BC14F571AC00ECC72C /* config-grammar.c in Sources */,
+ 9D1235BE14F571AC00ECC72C /* config-lex.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A412B13FADF3A003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A413B13FADF74003087FF /* stbarrier.c in Sources */,
+ 9D7A413C13FADF75003087FF /* stcond.c in Sources */,
+ 9D7A413D13FADF75003087FF /* stlock.c in Sources */,
+ 9D7A413E13FADF76003087FF /* stsem.c in Sources */,
+ 9D7A413F13FADF76003087FF /* stthread.c in Sources */,
+ 9D7A414013FADF77003087FF /* sttimeout.c in Sources */,
+ 9D7A414213FADF79003087FF /* syslock.c in Sources */,
+ 9D7A415113FADFC6003087FF /* queue.c in Sources */,
+ 9D7A415213FADFC6003087FF /* sem.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A415913FAE00E003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A415F13FAE01B003087FF /* queue.c in Sources */,
+ 9D7A416013FAE01C003087FF /* sem.c in Sources */,
+ 9D7A416113FAE023003087FF /* syscond.c in Sources */,
+ 9D7A416213FAE024003087FF /* syslock.c in Sources */,
+ 9D7A416313FAE026003087FF /* systhread.c in Sources */,
+ 9D7A416413FAE027003087FF /* systimeout.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A417513FAE192003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A422313FAE325003087FF /* btree.c in Sources */,
+ 9D7A422413FAE333003087FF /* dbmgr-cmn.c in Sources */,
+ 9D7A427E13FAE90F003087FF /* idxblk.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A423113FAE3F5003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A423B13FAE433003087FF /* coldata.c in Sources */,
+ 9D7A423C13FAE435003087FF /* colidx.c in Sources */,
+ 9D7A423E13FAE43F003087FF /* colidx0.c in Sources */,
+ 9D7A423F13FAE444003087FF /* colidx1.c in Sources */,
+ 9D7A424013FAE446003087FF /* colidx2.c in Sources */,
+ 9D7A424113FAE470003087FF /* column-cc.c in Sources */,
+ 9D7A424213FAE477003087FF /* column.c in Sources */,
+ 9D7A424313FAE47A003087FF /* database-cc.c in Sources */,
+ 9D7A424513FAE482003087FF /* database.c in Sources */,
+ 9D7A424613FAE484003087FF /* dbcc-cmn.c in Sources */,
+ 9D7A424713FAE48A003087FF /* dbmgr.c in Sources */,
+ 9D7A424813FAE499003087FF /* index.c in Sources */,
+ 9D7A424913FAE4B0003087FF /* kdb.c in Sources */,
+ 9D7A424A13FAE4B4003087FF /* meta.c in Sources */,
+ 9D7A424B13FAE4B8003087FF /* table-cc.c in Sources */,
+ 9D7A424C13FAE4BA003087FF /* table.c in Sources */,
+ 9D7A424D13FAE4C1003087FF /* trieidx-v1.c in Sources */,
+ 9D7A424E13FAE4C2003087FF /* trieidx-v2.c in Sources */,
+ 9D7A424F13FAE4C9003087FF /* u64idx-v3.c in Sources */,
+ 9D7A425813FAE616003087FF /* idstats.c in Sources */,
+ 9D7A425913FAE629003087FF /* trieval-v1.c in Sources */,
+ 9D7A425A13FAE62E003087FF /* ptrieval-v1.c in Sources */,
+ 9D7A425B13FAE63F003087FF /* trieval-v2.c in Sources */,
+ 9D7A425C13FAE644003087FF /* ptrieval-v2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A426513FAE69A003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A426D13FAE6C0003087FF /* wkdb.c in Sources */,
+ 9D7A426E13FAE6C5003087FF /* wdbmgr.c in Sources */,
+ 9D7A426F13FAE6CC003087FF /* wdatabase.c in Sources */,
+ 9D7A427013FAE6D5003087FF /* wtable.c in Sources */,
+ 9D7A427113FAE6E1003087FF /* wcolumn.c in Sources */,
+ 9D7A427213FAE6EB003087FF /* wcoldata.c in Sources */,
+ 9D7A427413FAE89E003087FF /* wcolidx.c in Sources */,
+ 9D7A427513FAE8A4003087FF /* wcolidx0.c in Sources */,
+ 9D7A427613FAE8A7003087FF /* wcolidx1.c in Sources */,
+ 9D7A427713FAE8A8003087FF /* wcolidx2.c in Sources */,
+ 9D7A427813FAE8D6003087FF /* widxblk.c in Sources */,
+ 9D7A427913FAE8DB003087FF /* wmeta.c in Sources */,
+ 9D7A427A13FAE8E7003087FF /* windex.c in Sources */,
+ 9D7A427B13FAE8ED003087FF /* wtrieidx-v1.c in Sources */,
+ 9D7A427C13FAE8EE003087FF /* wtrieidx-v2.c in Sources */,
+ 9D7A427D13FAE8F4003087FF /* wu64idx-v3.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A428613FAE9B5003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A42E413FAEA2A003087FF /* dbmgr-cmn.c in Sources */,
+ 9D7A42E513FAEA36003087FF /* schema-tok.c in Sources */,
+ 9D7A42E613FAEA3C003087FF /* schema-parse.c in Sources */,
+ 9D7A42E713FAEA45003087FF /* schema-type.c in Sources */,
+ 9D7A42E813FAEA4C003087FF /* schema-func.c in Sources */,
+ 9D7A42E913FAEA54003087FF /* schema-prod.c in Sources */,
+ 9D7A42EA13FAEA5A003087FF /* schema-expr.c in Sources */,
+ 9D7A42EB13FAEA60003087FF /* schema-eval.c in Sources */,
+ 9D7A42EC13FAEA65003087FF /* schema-tbl.c in Sources */,
+ 9D7A42ED13FAEA68003087FF /* schema-db.c in Sources */,
+ 9D7A42EE13FAEA6E003087FF /* schema-dump.c in Sources */,
+ 9D7A42EF13FAEA72003087FF /* schema-int.c in Sources */,
+ 9D7A42F013FAEA7C003087FF /* schema.c in Sources */,
+ 9D7A42F113FAEA85003087FF /* linker-int.c in Sources */,
+ 9D7A42F213FAEA8D003087FF /* linker-cmn.c in Sources */,
+ 9D7A42F313FAEA95003087FF /* database-cmn.c in Sources */,
+ 9D7A42F413FAEA98003087FF /* database-load.c in Sources */,
+ 9D7A42F513FAEAA0003087FF /* table-cmn.c in Sources */,
+ 9D7A42F613FAEAA1003087FF /* table-load.c in Sources */,
+ 9D7A42F713FAEAAA003087FF /* cursor-cmn.c in Sources */,
+ 9D7A42F813FAEAB2003087FF /* column-cmn.c in Sources */,
+ 9D7A42F913FAEABD003087FF /* prod-cmn.c in Sources */,
+ 9D7A42FA13FAEAC0003087FF /* prod-expr.c in Sources */,
+ 9D7A42FB13FAEAC4003087FF /* prod-func.c in Sources */,
+ 9D7A42FC13FAEACB003087FF /* phys-cmn.c in Sources */,
+ 9D7A42FD13FAEAD1003087FF /* phys-load.c in Sources */,
+ 9D7A42FE13FAEADD003087FF /* blob.c in Sources */,
+ 9D7A42FF13FAEAE0003087FF /* blob-headers.c in Sources */,
+ 9D7A430013FAEAE7003087FF /* page-map.c in Sources */,
+ 9D7A430313FAEB42003087FF /* row-id.c in Sources */,
+ 9D7A430413FAEB43003087FF /* row-len.c in Sources */,
+ 9D7A430513FAEB49003087FF /* fixed-row-len.c in Sources */,
+ 9D7A430613FAEB93003087FF /* merge.c in Sources */,
+ 9D7A430713FAEB99003087FF /* split.c in Sources */,
+ 9D7A430813FAEBA0003087FF /* compare.c in Sources */,
+ 9D7A430913FAEBAE003087FF /* meta-attr-read.c in Sources */,
+ 9D7A430B13FAEBB1003087FF /* meta-read.c in Sources */,
+ 9D7A430C13FAEBB2003087FF /* meta-value.c in Sources */,
+ 9D7A430D13FAEBBF003087FF /* environment-read.c in Sources */,
+ 9D7A431013FAEC78003087FF /* cast.c in Sources */,
+ 9D7A431113FAEC7A003087FF /* index_lookup.c in Sources */,
+ 9D7A431213FAEC7B003087FF /* index_project.c in Sources */,
+ 9D7A431313FAEC7C003087FF /* parameter-read.c in Sources */,
+ 9D7A431413FAEC7D003087FF /* range-validate.c in Sources */,
+ 9D7A431513FAEC7D003087FF /* redimension.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A431913FAED2E003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A431F13FAED40003087FF /* dbmgr.c in Sources */,
+ 9D7A432013FAED47003087FF /* linker.c in Sources */,
+ 9D7A432113FAED4E003087FF /* database.c in Sources */,
+ 9D7A432213FAED5A003087FF /* table.c in Sources */,
+ 9D7A432313FAED61003087FF /* cursor.c in Sources */,
+ 9D7A432413FAED69003087FF /* column.c in Sources */,
+ 9D7A432513FAED70003087FF /* prod.c in Sources */,
+ 9D7A432613FAED79003087FF /* phys.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A433413FAEE0C003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A434213FAEE66003087FF /* wcolumn.c in Sources */,
+ 9D7A434313FAEE67003087FF /* wcursor.c in Sources */,
+ 9D7A434413FAEE68003087FF /* wdatabase.c in Sources */,
+ 9D7A434513FAEE68003087FF /* wdbmgr.c in Sources */,
+ 9D7A434613FAEE69003087FF /* wlinker.c in Sources */,
+ 9D7A434713FAEE6A003087FF /* wphys.c in Sources */,
+ 9D7A434813FAEE6B003087FF /* wprod.c in Sources */,
+ 9D7A434913FAEE6C003087FF /* wtable.c in Sources */,
+ 9D7A434B13FAEECB003087FF /* index_insert.c in Sources */,
+ 9D7A434C13FAEED1003087FF /* meta-append.c in Sources */,
+ 9D7A434D13FAEEDB003087FF /* meta-write.c in Sources */,
+ 9D7A434E13FAEEE2003087FF /* meta-attr-write.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A435D13FAF1AE003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A439913FAF20E003087FF /* add-row-id.c in Sources */,
+ 9D7A439A13FAF20E003087FF /* bit_or.c in Sources */,
+ 9D7A439B13FAF20E003087FF /* bunzip.c in Sources */,
+ 9D7A439D13FAF20E003087FF /* ceil.c in Sources */,
+ 9D7A439F13FAF20E003087FF /* clip.c in Sources */,
+ 9D7A43A013FAF20E003087FF /* cut.c in Sources */,
+ 9D7A43A113FAF20E003087FF /* delta.c in Sources */,
+ 9D7A43A213FAF20E003087FF /* deriv.c in Sources */,
+ 9D7A43A313FAF20E003087FF /* diff.c in Sources */,
+ 9D7A43A413FAF20E003087FF /* echo.c in Sources */,
+ 9D7A43A613FAF20E003087FF /* exists.c in Sources */,
+ 9D7A43A713FAF20E003087FF /* floor.c in Sources */,
+ 9D7A43A913FAF20E003087FF /* funzip.c in Sources */,
+ 9D7A43AB13FAF20E003087FF /* integral.c in Sources */,
+ 9D7A43AC13FAF20E003087FF /* irzip.c in Sources */,
+ 9D7A43B513FAF20E003087FF /* map.c in Sources */,
+ 9D7A43B713FAF20E003087FF /* max.c in Sources */,
+ 9D7A43B813FAF20E003087FF /* min.c in Sources */,
+ 9D7A43B913FAF20E003087FF /* outlier-decoder.c in Sources */,
+ 9D7A43BB13FAF20E003087FF /* pack.c in Sources */,
+ 9D7A43BC13FAF20E003087FF /* paste.c in Sources */,
+ 9D7A43BD13FAF20E003087FF /* rand_4na_2na.c in Sources */,
+ 9D7A43BE13FAF20E003087FF /* rldecode.c in Sources */,
+ 9D7A43C013FAF20E003087FF /* round.c in Sources */,
+ 9D7A43C113FAF20E003087FF /* simple-sub-select.c in Sources */,
+ 9D7A43C213FAF20E003087FF /* subtract-row-id.c in Sources */,
+ 9D7A43C313FAF20E003087FF /* sum.c in Sources */,
+ 9D7A43C413FAF20E003087FF /* trim.c in Sources */,
+ 9D7A43C513FAF20E003087FF /* trunc.c in Sources */,
+ 9D7A43C613FAF20E003087FF /* undelta.c in Sources */,
+ 9D7A43C713FAF20E003087FF /* unpack.c in Sources */,
+ 9D7A43C813FAF20E003087FF /* unzip.c in Sources */,
+ 9D7A43C913FAF20E003087FF /* vec-sum.c in Sources */,
+ 9DE55A28140E94CB00EA61C6 /* iunzip.c in Sources */,
+ 9D320AB0142D02B000ACA5AA /* extract_token.c in Sources */,
+ 9D320AB1142D02B000ACA5AA /* strtonum.c in Sources */,
+ 9D320AB6142D02E600ACA5AA /* sprintf.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A440913FAF315003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A441413FAF3B5003087FF /* qual4_decode.c in Sources */,
+ 9D7A441513FAF3B5003087FF /* format-spot-name.c in Sources */,
+ 9D7A441713FAF3B5003087FF /* fpcodec.c in Sources */,
+ 9D7A441813FAF3B5003087FF /* v0-decompress-init.c in Sources */,
+ 9D7A441913FAF3B5003087FF /* extract-coordinates.c in Sources */,
+ 9D7A441C13FAF3B5003087FF /* untyped.c in Sources */,
+ 9D7A441D13FAF3B5003087FF /* color-from-dna.c in Sources */,
+ 9D7A441E13FAF3B5003087FF /* tokenize-spot_name-454.c in Sources */,
+ 9D7A441F13FAF3B5003087FF /* process-position.c in Sources */,
+ 9D7A442113FAF3B5003087FF /* bio-start.c in Sources */,
+ 9D7A442213FAF3B5003087FF /* normalize.c in Sources */,
+ 9D7A442313FAF3B5003087FF /* rewrite-spot-name.c in Sources */,
+ 9D7A442513FAF3B5003087FF /* tokenize-spot_name-abi.c in Sources */,
+ 9D7A442613FAF3B5003087FF /* tokenize-spot_name-ion-torrent.c in Sources */,
+ 9D7A442713FAF3B5003087FF /* v0-decompress.c in Sources */,
+ 9D7A442913FAF3B5003087FF /* swap.c in Sources */,
+ 9D7A442A13FAF3B5003087FF /* spot-desc.c in Sources */,
+ 9D7A442B13FAF3B5003087FF /* tokenize-spot_name-helicos.c in Sources */,
+ 9D7A442C13FAF3B5003087FF /* denormalize.c in Sources */,
+ 9D7A442D13FAF3B5003087FF /* make-position.c in Sources */,
+ 9D7A442F13FAF3B5003087FF /* tokenize-spot_name-illumina.c in Sources */,
+ 9D7A443013FAF3B5003087FF /* dna-from-color.c in Sources */,
+ 9D7A443113FAF3B5003087FF /* index_lookup.c in Sources */,
+ 9D7A443313FAF3B5003087FF /* extract-name_coord.c in Sources */,
+ 9D7A443513FAF3B5003087FF /* v0-funcs.c in Sources */,
+ 9D7A443613FAF3B5003087FF /* rotate.c in Sources */,
+ 9D7A443813FAF3B5003087FF /* read-seg-from-readn.c in Sources */,
+ 9D7A443A13FAF3B5003087FF /* dynamic-454-read-descriptor.c in Sources */,
+ 9D7A443D13FAF3B5003087FF /* read-desc.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A448913FAF555003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A448F13FAF56D003087FF /* seq-restore-read.c in Sources */,
+ 9D7A449013FAF56D003087FF /* raw-restore-read.c in Sources */,
+ 9D7A449113FAF56D003087FF /* align-restore-read.c in Sources */,
+ 9D7A449213FAF56D003087FF /* ref-tbl-sub-select.c in Sources */,
+ 9D7A449313FAF56D003087FF /* align-local_ref_id.c in Sources */,
+ 9D7A449413FAF56D003087FF /* align-ref-pos.c in Sources */,
+ 9D7A449613FAF56D003087FF /* align-ref-seq-id.c in Sources */,
+ 9D7A449713FAF56D003087FF /* cigar.c in Sources */,
+ 9D7A449813FAF56D003087FF /* align-ref-name.c in Sources */,
+ 9D7A449913FAF56D003087FF /* template-len.c in Sources */,
+ 9D7A449A13FAF56D003087FF /* get-sam-flags.c in Sources */,
+ 9D7A449B13FAF56D003087FF /* ref-restore-read.c in Sources */,
+ 9D7A449C13FAF56D003087FF /* align-local_ref_start.c in Sources */,
+ 9D7A449D13FAF56D003087FF /* project_read_from_sequence.c in Sources */,
+ 9D7A449E13FAF56D003087FF /* not-my-row.c in Sources */,
+ 9DE55A79140EA19500EA61C6 /* raw-restore-qual.c in Sources */,
+ 9DE55A85140EA93600EA61C6 /* generate-mismatch-qual.c in Sources */,
+ 9DE55AAF140EC79C00EA61C6 /* mismatch-restore-qual.c in Sources */,
+ 9D4DCEAC1423FD9600881098 /* ref-preserve_qual.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A44BD13FB04A9003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A44C913FB04C2003087FF /* reader-cmn.c in Sources */,
+ 9D7A44CA13FB04C2003087FF /* refseq-mgr.c in Sources */,
+ 9D7A44CB13FB04C2003087FF /* reader-refseq.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A452C13FB0A3C003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A453413FB0A5A003087FF /* bzip.c in Sources */,
+ 9D7A453513FB0A5D003087FF /* checksum.c in Sources */,
+ 9D7A453613FB0A65003087FF /* fzip.c in Sources */,
+ 9D7A453813FB0A7A003087FF /* outlier-encoder.c in Sources */,
+ 9D7A453913FB0A82003087FF /* rlencode.c in Sources */,
+ 9D7A453A13FB0A8E003087FF /* zip.c in Sources */,
+ 9D7A458113FB0C53003087FF /* exists.c in Sources */,
+ 9D7A458213FB0C53003087FF /* bunzip.c in Sources */,
+ 9D7A458313FB0C53003087FF /* trim.c in Sources */,
+ 9D7A458413FB0C53003087FF /* rldecode.c in Sources */,
+ 9D7A458513FB0C53003087FF /* ceil.c in Sources */,
+ 9D7A458713FB0C53003087FF /* paste.c in Sources */,
+ 9D7A458813FB0C53003087FF /* max.c in Sources */,
+ 9D7A458913FB0C53003087FF /* vec-sum.c in Sources */,
+ 9D7A458A13FB0C53003087FF /* echo.c in Sources */,
+ 9D7A458B13FB0C53003087FF /* add-row-id.c in Sources */,
+ 9D7A458C13FB0C53003087FF /* delta.c in Sources */,
+ 9D7A458D13FB0C53003087FF /* floor.c in Sources */,
+ 9D7A458E13FB0C53003087FF /* subtract-row-id.c in Sources */,
+ 9D7A458F13FB0C53003087FF /* outlier-decoder.c in Sources */,
+ 9D7A459013FB0C53003087FF /* deriv.c in Sources */,
+ 9D7A459113FB0C53003087FF /* bit_or.c in Sources */,
+ 9D7A459313FB0C53003087FF /* irzip.c in Sources */,
+ 9D7A459413FB0C53003087FF /* map.c in Sources */,
+ 9D7A459513FB0C53003087FF /* pack.c in Sources */,
+ 9D7A459613FB0C53003087FF /* sum.c in Sources */,
+ 9D7A459713FB0C53003087FF /* unpack.c in Sources */,
+ 9D7A459813FB0C53003087FF /* simple-sub-select.c in Sources */,
+ 9D7A459913FB0C53003087FF /* rand_4na_2na.c in Sources */,
+ 9D7A459A13FB0C53003087FF /* min.c in Sources */,
+ 9D7A459B13FB0C53003087FF /* trunc.c in Sources */,
+ 9D7A459C13FB0C53003087FF /* round.c in Sources */,
+ 9D7A459D13FB0C53003087FF /* integral.c in Sources */,
+ 9D7A459E13FB0C53003087FF /* cut.c in Sources */,
+ 9D7A459F13FB0C53003087FF /* funzip.c in Sources */,
+ 9D7A45A013FB0C53003087FF /* unzip.c in Sources */,
+ 9D7A45A113FB0C53003087FF /* undelta.c in Sources */,
+ 9D7A45A213FB0C53003087FF /* clip.c in Sources */,
+ 9D7A45A313FB0C53003087FF /* diff.c in Sources */,
+ 9DE55A23140E94B700EA61C6 /* iunzip.c in Sources */,
+ 9D320AB2142D02B000ACA5AA /* extract_token.c in Sources */,
+ 9D320AB3142D02B000ACA5AA /* strtonum.c in Sources */,
+ 9D320AB7142D02E600ACA5AA /* sprintf.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A454813FB0B4D003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A454E13FB0B5F003087FF /* extract-name_fmt.c in Sources */,
+ 9D7A454F13FB0B60003087FF /* extract-spot_name.c in Sources */,
+ 9D7A455013FB0B6C003087FF /* stats.c in Sources */,
+ 9D7A455113FB0B6C003087FF /* stats_quality.c in Sources */,
+ 9D7A455213FB0B76003087FF /* qual4_encode.c in Sources */,
+ 9D7A455B13FB0BCE003087FF /* qual4_decode.c in Sources */,
+ 9D7A455C13FB0BCE003087FF /* format-spot-name.c in Sources */,
+ 9D7A455D13FB0BCE003087FF /* fpcodec.c in Sources */,
+ 9D7A455E13FB0BCE003087FF /* v0-decompress-init.c in Sources */,
+ 9D7A455F13FB0BCE003087FF /* extract-coordinates.c in Sources */,
+ 9D7A456013FB0BCE003087FF /* untyped.c in Sources */,
+ 9D7A456113FB0BCE003087FF /* color-from-dna.c in Sources */,
+ 9D7A456213FB0BCE003087FF /* tokenize-spot_name-454.c in Sources */,
+ 9D7A456313FB0BCE003087FF /* process-position.c in Sources */,
+ 9D7A456513FB0BCE003087FF /* bio-start.c in Sources */,
+ 9D7A456613FB0BCE003087FF /* normalize.c in Sources */,
+ 9D7A456713FB0BCE003087FF /* rewrite-spot-name.c in Sources */,
+ 9D7A456813FB0BCE003087FF /* v0-decompress.c in Sources */,
+ 9D7A456913FB0BCE003087FF /* tokenize-spot_name-abi.c in Sources */,
+ 9D7A456A13FB0BCE003087FF /* tokenize-spot_name-ion-torrent.c in Sources */,
+ 9D7A456B13FB0BCE003087FF /* swap.c in Sources */,
+ 9D7A456C13FB0BCE003087FF /* spot-desc.c in Sources */,
+ 9D7A456D13FB0BCE003087FF /* tokenize-spot_name-helicos.c in Sources */,
+ 9D7A456E13FB0BCE003087FF /* denormalize.c in Sources */,
+ 9D7A456F13FB0BCE003087FF /* make-position.c in Sources */,
+ 9D7A457013FB0BCE003087FF /* tokenize-spot_name-illumina.c in Sources */,
+ 9D7A457113FB0BCE003087FF /* dna-from-color.c in Sources */,
+ 9D7A457213FB0BCE003087FF /* index_lookup.c in Sources */,
+ 9D7A457313FB0BCE003087FF /* extract-name_coord.c in Sources */,
+ 9D7A457413FB0BCE003087FF /* v0-funcs.c in Sources */,
+ 9D7A457513FB0BCE003087FF /* rotate.c in Sources */,
+ 9D7A457613FB0BCE003087FF /* read-seg-from-readn.c in Sources */,
+ 9D7A457713FB0BCE003087FF /* dynamic-454-read-descriptor.c in Sources */,
+ 9D7A457813FB0BCE003087FF /* read-desc.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45B013FB0CB8003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A45B113FB0CB8003087FF /* seq-restore-read.c in Sources */,
+ 9D7A45B213FB0CB8003087FF /* raw-restore-read.c in Sources */,
+ 9D7A45B313FB0CB8003087FF /* align-restore-read.c in Sources */,
+ 9D7A45B413FB0CB8003087FF /* ref-tbl-sub-select.c in Sources */,
+ 9D7A45B513FB0CB8003087FF /* align-local_ref_id.c in Sources */,
+ 9D7A45B613FB0CB8003087FF /* align-ref-pos.c in Sources */,
+ 9D7A45B713FB0CB8003087FF /* align-ref-seq-id.c in Sources */,
+ 9D7A45B813FB0CB8003087FF /* cigar.c in Sources */,
+ 9D7A45B913FB0CB8003087FF /* align-ref-name.c in Sources */,
+ 9D7A45BA13FB0CB8003087FF /* template-len.c in Sources */,
+ 9D7A45BB13FB0CB8003087FF /* get-sam-flags.c in Sources */,
+ 9D7A45BC13FB0CB8003087FF /* ref-restore-read.c in Sources */,
+ 9D7A45BD13FB0CB8003087FF /* align-local_ref_start.c in Sources */,
+ 9D7A45BE13FB0CB8003087FF /* project_read_from_sequence.c in Sources */,
+ 9D7A45BF13FB0CB8003087FF /* not-my-row.c in Sources */,
+ 9D7A45C813FB0CE4003087FF /* refseq-stats.c in Sources */,
+ 9DE55A7A140EA1CA00EA61C6 /* raw-restore-qual.c in Sources */,
+ 9DE55A86140EA93600EA61C6 /* generate-mismatch-qual.c in Sources */,
+ 9DE55AB0140EC79C00EA61C6 /* mismatch-restore-qual.c in Sources */,
+ 9D4DCEAD1423FD9600881098 /* ref-preserve_qual.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A45D913FB0D50003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A45DC13FB0D50003087FF /* reader-cmn.c in Sources */,
+ 9D7A45DD13FB0D50003087FF /* refseq-mgr.c in Sources */,
+ 9D7A45DE13FB0D50003087FF /* reader-refseq.c in Sources */,
+ 9D7A45EA13FB0D95003087FF /* writer-alignment.c in Sources */,
+ 9D7A45EB13FB0D95003087FF /* writer-reference.c in Sources */,
+ 9D7A45EC13FB0D95003087FF /* writer-ref.c in Sources */,
+ 9D7A45ED13FB0D95003087FF /* writer-refseq.c in Sources */,
+ 9D7A45EE13FB0D95003087FF /* writer-cmn.c in Sources */,
+ 9D7A45EF13FB0D95003087FF /* writer-sequence.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A460413FB0F36003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A460A13FB0F52003087FF /* progressbar.c in Sources */,
+ 9D7A460B13FB0F52003087FF /* main.c in Sources */,
+ 9D7A460C13FB0F52003087FF /* args.c in Sources */,
+ 9D7A460D13FB0F52003087FF /* sysmain.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D7A461113FB1133003087FF /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D7A461813FB1140003087FF /* deseq.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 9D4DCEDC1423FF6E00881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A433613FAEE0C003087FF /* wvdb */;
+ targetProxy = 9D4DCEDB1423FF6E00881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEE21424001400881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A426713FAE69A003087FF /* wkdb */;
+ targetProxy = 9D4DCEE11424001400881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEE41424001C00881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D4DCEE31424001C00881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEE71424007400881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A433613FAEE0C003087FF /* wvdb */;
+ targetProxy = 9D4DCEE61424007400881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEE91424007F00881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A426713FAE69A003087FF /* wkdb */;
+ targetProxy = 9D4DCEE81424007F00881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEEB1424008500881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D4DCEEA1424008500881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEED142400B400881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A433613FAEE0C003087FF /* wvdb */;
+ targetProxy = 9D4DCEEC142400B400881098 /* PBXContainerItemProxy */;
+ };
+ 9D4DCEEF142400B900881098 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A426713FAE69A003087FF /* wkdb */;
+ targetProxy = 9D4DCEEE142400B900881098 /* PBXContainerItemProxy */;
+ };
+ 9D7A423813FAE3FD003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A417713FAE192003087FF /* kdb-cmn */;
+ targetProxy = 9D7A423713FAE3FD003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A428413FAE9A0003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A417713FAE192003087FF /* kdb-cmn */;
+ targetProxy = 9D7A428313FAE9A0003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A446913FAF4A9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A431B13FAED2E003087FF /* vdb */;
+ targetProxy = 9D7A446813FAF4A9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A446D13FAF4B3003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A423313FAE3F5003087FF /* kdb */;
+ targetProxy = 9D7A446C13FAF4B3003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A446F13FAF4B6003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A446E13FAF4B6003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44E013FB0546003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A44BF13FB04A9003087FF /* align */;
+ targetProxy = 9D7A44DF13FB0546003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44E213FB0551003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A431B13FAED2E003087FF /* vdb */;
+ targetProxy = 9D7A44E113FB0551003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44E613FB0561003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44E513FB0561003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44E813FB057E003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44E713FB057E003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44EA13FB0582003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A431B13FAED2E003087FF /* vdb */;
+ targetProxy = 9D7A44E913FB0582003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44EC13FB0597003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A431B13FAED2E003087FF /* vdb */;
+ targetProxy = 9D7A44EB13FB0597003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44EE13FB0597003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A423313FAE3F5003087FF /* kdb */;
+ targetProxy = 9D7A44ED13FB0597003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44F013FB0597003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44EF13FB0597003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44F213FB05A9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A423313FAE3F5003087FF /* kdb */;
+ targetProxy = 9D7A44F113FB05A9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44F413FB05A9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44F313FB05A9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44F613FB05C9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A426713FAE69A003087FF /* wkdb */;
+ targetProxy = 9D7A44F513FB05C9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44F813FB05C9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44F713FB05C9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44FA13FB05C9003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A415B13FAE00E003087FF /* kmproc */;
+ targetProxy = 9D7A44F913FB05C9003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44FC13FB05EB003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44FB13FB05EB003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A44FE13FB05F2003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A44FD13FB05F2003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A450613FB06AB003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A428813FAE9B5003087FF /* vdb-cmn */;
+ targetProxy = 9D7A450513FB06AB003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A450813FB06BD003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A428813FAE9B5003087FF /* vdb-cmn */;
+ targetProxy = 9D7A450713FB06BD003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A45A913FB0CB8003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A45AA13FB0CB8003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A45AD13FB0CB8003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A44BF13FB04A9003087FF /* align */;
+ targetProxy = 9D7A45AE13FB0CB8003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A45D213FB0D50003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9D7A45D313FB0D50003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A45D413FB0D50003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A423313FAE3F5003087FF /* kdb */;
+ targetProxy = 9D7A45D513FB0D50003087FF /* PBXContainerItemProxy */;
+ };
+ 9D7A45D613FB0D50003087FF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A431B13FAED2E003087FF /* vdb */;
+ targetProxy = 9D7A45D713FB0D50003087FF /* PBXContainerItemProxy */;
+ };
+ 9DE55931140D82BC00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A460613FB0F36003087FF /* kapp */;
+ targetProxy = 9DE55930140D82BC00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55933140D82BC00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A433613FAEE0C003087FF /* wvdb */;
+ targetProxy = 9DE55932140D82BC00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55935140D82CD00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D31EC98117667FA003CDA5E /* klib */;
+ targetProxy = 9DE55934140D82CD00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55A96140EAC9E00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A45A813FB0CB8003087FF /* waxf */;
+ targetProxy = 9DE55A95140EAC9E00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55A98140EAC9E00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A454A13FB0B4D003087FF /* wsraxf */;
+ targetProxy = 9DE55A97140EAC9E00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55A9A140EAC9E00EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A452E13FB0A3C003087FF /* wvxf */;
+ targetProxy = 9DE55A99140EAC9E00EA61C6 /* PBXContainerItemProxy */;
+ };
+ 9DE55AFE140EF0C800EA61C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D7A426713FAE69A003087FF /* wkdb */;
+ targetProxy = 9DE55AFD140EF0C800EA61C6 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB928A08733DD80010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_ENABLE_PASCAL_STRINGS = YES;
+ GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_LOGGING=1",
+ MAC,
+ _DEBUGGING,
+ );
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+ GCC_WARN_PEDANTIC = YES;
+ GCC_WARN_SIGN_COMPARE = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../../interfaces/os/mac,
+ ../../../interfaces/os/bsd,
+ ../../../interfaces/os/unix,
+ ../../../interfaces/cc/gcc/$arch,
+ ../../../interfaces/cc/gcc,
+ ../../../interfaces,
+ /usr/include/libxml2,
+ );
+ ONLY_ACTIVE_ARCH = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx10.6;
+ };
+ name = Debug;
+ };
+ 1DEB928B08733DD80010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ GCC_AUTO_VECTORIZATION = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_CPP_RTTI = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = NO;
+ GCC_ENABLE_SSE3_EXTENSIONS = YES;
+ GCC_FAST_OBJC_DISPATCH = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = "";
+ GCC_OBJC_CALL_CXX_CDTORS = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_LOGGING=1",
+ MAC,
+ );
+ GCC_THUMB_SUPPORT = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+ GCC_WARN_PROTOTYPE_CONVERSION = NO;
+ GCC_WARN_SIGN_COMPARE = NO;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO;
+ GCC_WARN_UNUSED_VARIABLE = NO;
+ HEADER_SEARCH_PATHS = (
+ ../../../interfaces/os/mac,
+ ../../../interfaces/os/bsd,
+ ../../../interfaces/os/unix,
+ ../../../interfaces/cc/gcc/$arch,
+ ../../../interfaces/cc/gcc,
+ ../../../interfaces,
+ /usr/include/libxml2,
+ );
+ LLVM_LTO = NO;
+ PREBINDING = NO;
+ SDKROOT = macosx10.6;
+ VALID_ARCHS = "i386 x86_64";
+ };
+ name = Release;
+ };
+ 9D31EC9A117667FB003CDA5E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = "";
+ LD_DYLIB_INSTALL_NAME = "";
+ LD_OPENMP_FLAGS = "";
+ PREBINDING = NO;
+ PRIVATE_HEADERS_FOLDER_PATH = "";
+ PRODUCT_NAME = klib;
+ PUBLIC_HEADERS_FOLDER_PATH = "";
+ };
+ name = Debug;
+ };
+ 9D31EC9B117667FB003CDA5E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = "";
+ INSTALL_PATH = "";
+ LD_DYLIB_INSTALL_NAME = "";
+ LD_OPENMP_FLAGS = "";
+ LLVM_LTO = NO;
+ PREBINDING = NO;
+ PRIVATE_HEADERS_FOLDER_PATH = "";
+ PRODUCT_NAME = klib;
+ PUBLIC_HEADERS_FOLDER_PATH = "";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7357F411779B2B009EA3E4 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ PRODUCT_NAME = "make-env";
+ };
+ name = Debug;
+ };
+ 9D7357F511779B2B009EA3E4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ PRODUCT_NAME = "make-env";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A412F13FADF3B003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = ksproc;
+ };
+ name = Debug;
+ };
+ 9D7A413013FADF3B003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = ksproc;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A415D13FAE00E003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kmproc;
+ };
+ name = Debug;
+ };
+ 9D7A415E13FAE00E003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kmproc;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A417913FAE192003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = "kdb-cmn";
+ };
+ name = Debug;
+ };
+ 9D7A417A13FAE192003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = "kdb-cmn";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A423513FAE3F5003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kdb;
+ };
+ name = Debug;
+ };
+ 9D7A423613FAE3F5003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A426913FAE69A003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wkdb;
+ };
+ name = Debug;
+ };
+ 9D7A426A13FAE69A003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wkdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A428A13FAE9B5003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = "vdb-cmn";
+ };
+ name = Debug;
+ };
+ 9D7A428B13FAE9B5003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = "vdb-cmn";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A431D13FAED2F003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vdb;
+ };
+ name = Debug;
+ };
+ 9D7A431E13FAED2F003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A433813FAEE0C003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wvdb;
+ };
+ name = Debug;
+ };
+ 9D7A433913FAEE0C003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wvdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A436113FAF1AE003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vxf;
+ };
+ name = Debug;
+ };
+ 9D7A436213FAF1AE003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vxf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A440D13FAF315003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = sraxf;
+ };
+ name = Debug;
+ };
+ 9D7A440E13FAF315003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = sraxf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A448D13FAF555003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = axf;
+ };
+ name = Debug;
+ };
+ 9D7A448E13FAF555003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = axf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A44C113FB04A9003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = align;
+ };
+ name = Debug;
+ };
+ 9D7A44C213FB04A9003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = align;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A453013FB0A3D003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wvxf;
+ };
+ name = Debug;
+ };
+ 9D7A453113FB0A3D003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wvxf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A454C13FB0B4E003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wsraxf;
+ };
+ name = Debug;
+ };
+ 9D7A454D13FB0B4E003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wsraxf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A45C513FB0CB8003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = waxf;
+ };
+ name = Debug;
+ };
+ 9D7A45C613FB0CB8003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = waxf;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A45E513FB0D50003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = walign;
+ };
+ name = Debug;
+ };
+ 9D7A45E613FB0D50003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = walign;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A460813FB0F36003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kapp;
+ };
+ name = Debug;
+ };
+ 9D7A460913FB0F36003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kapp;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D7A461613FB1133003087FF /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PREBINDING = NO;
+ PRODUCT_NAME = deseq;
+ };
+ name = Debug;
+ };
+ 9D7A461713FB1133003087FF /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PREBINDING = NO;
+ PRODUCT_NAME = deseq;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "asm-trace" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB928A08733DD80010E9CD /* Debug */,
+ 1DEB928B08733DD80010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D31ECBB11766836003CDA5E /* Build configuration list for PBXNativeTarget "klib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D31EC9A117667FB003CDA5E /* Debug */,
+ 9D31EC9B117667FB003CDA5E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7357F611779B49009EA3E4 /* Build configuration list for PBXAggregateTarget "make-env" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7357F411779B2B009EA3E4 /* Debug */,
+ 9D7357F511779B2B009EA3E4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A414713FADF98003087FF /* Build configuration list for PBXNativeTarget "ksproc" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A412F13FADF3B003087FF /* Debug */,
+ 9D7A413013FADF3B003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A417013FAE0A5003087FF /* Build configuration list for PBXNativeTarget "kmproc" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A415D13FAE00E003087FF /* Debug */,
+ 9D7A415E13FAE00E003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A417C13FAE1A2003087FF /* Build configuration list for PBXNativeTarget "kdb-cmn" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A417913FAE192003087FF /* Debug */,
+ 9D7A417A13FAE192003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A423A13FAE42A003087FF /* Build configuration list for PBXNativeTarget "kdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A423513FAE3F5003087FF /* Debug */,
+ 9D7A423613FAE3F5003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A427313FAE709003087FF /* Build configuration list for PBXNativeTarget "wkdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A426913FAE69A003087FF /* Debug */,
+ 9D7A426A13FAE69A003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A428D13FAE9C5003087FF /* Build configuration list for PBXNativeTarget "vdb-cmn" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A428A13FAE9B5003087FF /* Debug */,
+ 9D7A428B13FAE9B5003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A432713FAED97003087FF /* Build configuration list for PBXNativeTarget "vdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A431D13FAED2F003087FF /* Debug */,
+ 9D7A431E13FAED2F003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A434A13FAEE8A003087FF /* Build configuration list for PBXNativeTarget "wvdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A433813FAEE0C003087FF /* Debug */,
+ 9D7A433913FAEE0C003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A436413FAF1B4003087FF /* Build configuration list for PBXNativeTarget "vxf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A436113FAF1AE003087FF /* Debug */,
+ 9D7A436213FAF1AE003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A441013FAF333003087FF /* Build configuration list for PBXNativeTarget "sraxf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A440D13FAF315003087FF /* Debug */,
+ 9D7A440E13FAF315003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A44A913FAF5C7003087FF /* Build configuration list for PBXNativeTarget "axf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A448D13FAF555003087FF /* Debug */,
+ 9D7A448E13FAF555003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A44FF13FB0621003087FF /* Build configuration list for PBXNativeTarget "align" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A44C113FB04A9003087FF /* Debug */,
+ 9D7A44C213FB04A9003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A454613FB0AF3003087FF /* Build configuration list for PBXNativeTarget "wvxf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A453013FB0A3D003087FF /* Debug */,
+ 9D7A453113FB0A3D003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A455A13FB0BAF003087FF /* Build configuration list for PBXNativeTarget "wsraxf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A454C13FB0B4E003087FF /* Debug */,
+ 9D7A454D13FB0B4E003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A45C413FB0CB8003087FF /* Build configuration list for PBXNativeTarget "waxf" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A45C513FB0CB8003087FF /* Debug */,
+ 9D7A45C613FB0CB8003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A45E413FB0D50003087FF /* Build configuration list for PBXNativeTarget "walign" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A45E513FB0D50003087FF /* Debug */,
+ 9D7A45E613FB0D50003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A460F13FB0F69003087FF /* Build configuration list for PBXNativeTarget "kapp" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A460813FB0F36003087FF /* Debug */,
+ 9D7A460913FB0F36003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D7A461C13FB116A003087FF /* Build configuration list for PBXNativeTarget "deseq" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D7A461613FB1133003087FF /* Debug */,
+ 9D7A461713FB1133003087FF /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/build/Xcode/old-toolkit/.gitignore b/build/Xcode/old-toolkit/.gitignore
new file mode 100644
index 0000000..378eac2
--- /dev/null
+++ b/build/Xcode/old-toolkit/.gitignore
@@ -0,0 +1 @@
+build
diff --git a/build/Xcode/old-toolkit/old-toolkit.xcodeproj/project.pbxproj b/build/Xcode/old-toolkit/old-toolkit.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0f58a7e
--- /dev/null
+++ b/build/Xcode/old-toolkit/old-toolkit.xcodeproj/project.pbxproj
@@ -0,0 +1,2153 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 44;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 9D1A14B5119D934300EF212F /* bamtest.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1A14AB119D931800EF212F /* bamtest.c */; };
+ 9D1A14B6119D934A00EF212F /* BAMFile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D1A14A8119D922100EF212F /* BAMFile.c */; };
+ 9D1A14BF119D93BC00EF212F /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D1A14C2119D93D100EF212F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65E5AA1174E29F00F3579B /* sra2kdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5A91174E29F00F3579B /* sra2kdb.c */; };
+ 9D65E5B71174E2D100F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65E5B81174E2D100F3579B /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B51174E2D100F3579B /* libbz2.dylib */; };
+ 9D65E5B91174E2D100F3579B /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B61174E2D100F3579B /* libxml2.dylib */; };
+ 9D65E8A111762C9B00F3579B /* arc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5CF1174E2DB00F3579B /* arc.c */; };
+ 9D65E8A311762C9C00F3579B /* bstpersist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5BD1174E2DB00F3579B /* bstpersist.c */; };
+ 9D65E8A411762C9C00F3579B /* buffile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D01174E2DB00F3579B /* buffile.c */; };
+ 9D65E8A511762C9D00F3579B /* bzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D11174E2DB00F3579B /* bzip.c */; };
+ 9D65E8A611762C9D00F3579B /* container.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5BE1174E2DB00F3579B /* container.c */; };
+ 9D65E8A711762C9E00F3579B /* countfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D21174E2DB00F3579B /* countfile.c */; };
+ 9D65E8A811762C9F00F3579B /* cp1252.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5EC1174E2DB00F3579B /* cp1252.c */; };
+ 9D65E8A911762CA000F3579B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D31174E2DB00F3579B /* crc32.c */; };
+ 9D65E8AA11762CA000F3579B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C81174E2DB00F3579B /* crc32.c */; };
+ 9D65E8AB11762CA100F3579B /* dir_test.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D41174E2DB00F3579B /* dir_test.c */; };
+ 9D65E8AC11762CA200F3579B /* directory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D51174E2DB00F3579B /* directory.c */; };
+ 9D65E8AD11762CA200F3579B /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D61174E2DB00F3579B /* file.c */; };
+ 9D65E8AF11762CA300F3579B /* gzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D71174E2DB00F3579B /* gzip.c */; };
+ 9D65E8B011762CA400F3579B /* iso8859-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5ED1174E2DB00F3579B /* iso8859-1.c */; };
+ 9D65E8B111762CA500F3579B /* iso8859.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5EE1174E2DB00F3579B /* iso8859.c */; };
+ 9D65E8B211762CA500F3579B /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D81174E2DB00F3579B /* md5.c */; };
+ 9D65E8B311762CA600F3579B /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C91174E2DB00F3579B /* md5.c */; };
+ 9D65E8B411762CA600F3579B /* namelist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5BF1174E2DB00F3579B /* namelist.c */; };
+ 9D65E8B511762CA700F3579B /* nullfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5D91174E2DB00F3579B /* nullfile.c */; };
+ 9D65E8B611762CA800F3579B /* pbstree.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C01174E2DB00F3579B /* pbstree.c */; };
+ 9D65E8B711762CA800F3579B /* ptpersist.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C11174E2DB00F3579B /* ptpersist.c */; };
+ 9D65E8B811762CA900F3579B /* ptrie.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C21174E2DB00F3579B /* ptrie.c */; };
+ 9D65E8B911762CAA00F3579B /* queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C31174E2DB00F3579B /* queue.c */; };
+ 9D65E8BB11762CBC00F3579B /* sra.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DA1174E2DB00F3579B /* sra.c */; };
+ 9D65E8BC11762CBC00F3579B /* stbarrier.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E41174E2DB00F3579B /* stbarrier.c */; };
+ 9D65E8BD11762CBD00F3579B /* stcond.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E51174E2DB00F3579B /* stcond.c */; };
+ 9D65E8BE11762CBE00F3579B /* stlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E61174E2DB00F3579B /* stlock.c */; };
+ 9D65E8BF11762CBE00F3579B /* stsem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E71174E2DB00F3579B /* stsem.c */; };
+ 9D65E8C011762CBF00F3579B /* stthread.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E81174E2DB00F3579B /* stthread.c */; };
+ 9D65E8C111762CBF00F3579B /* sttimeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E91174E2DB00F3579B /* sttimeout.c */; };
+ 9D65E8C211762CC000F3579B /* subfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DB1174E2DB00F3579B /* subfile.c */; };
+ 9D65E8C311762CC000F3579B /* symtab.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5EF1174E2DB00F3579B /* symtab.c */; };
+ 9D65E8C411762CC100F3579B /* sysdir.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5CB1174E2DB00F3579B /* sysdir.c */; };
+ 9D65E8C511762CC200F3579B /* sysdll.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5CC1174E2DB00F3579B /* sysdll.c */; };
+ 9D65E8C611762CC300F3579B /* sysfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5CD1174E2DB00F3579B /* sysfile.c */; };
+ 9D65E8C711762CC300F3579B /* sysmmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5CE1174E2DB00F3579B /* sysmmap.c */; };
+ 9D65E8C811762CC400F3579B /* tar.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DC1174E2DB00F3579B /* tar.c */; };
+ 9D65E8C911762CC500F3579B /* teefile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DD1174E2DB00F3579B /* teefile.c */; };
+ 9D65E8CA11762CC500F3579B /* text.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F01174E2DB00F3579B /* text.c */; };
+ 9D65E8CB11762CC600F3579B /* toc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DE1174E2DB00F3579B /* toc.c */; };
+ 9D65E8CC11762CC600F3579B /* tocdir.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5DF1174E2DB00F3579B /* tocdir.c */; };
+ 9D65E8CD11762CC700F3579B /* tocentry.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E01174E2DB00F3579B /* tocentry.c */; };
+ 9D65E8CE11762CC700F3579B /* tocfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5E11174E2DB00F3579B /* tocfile.c */; };
+ 9D65E8CF11762CC800F3579B /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F11174E2DB00F3579B /* token.c */; };
+ 9D65E8D011762CCA00F3579B /* trie.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C41174E2DB00F3579B /* trie.c */; };
+ 9D65E8D111762CCA00F3579B /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F21174E2DB00F3579B /* utf8.c */; };
+ 9D65E8D211762CCB00F3579B /* vector.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5C61174E2DB00F3579B /* vector.c */; };
+ 9D65E8D311762CCB00F3579B /* xml.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F51174E2DB00F3579B /* xml.c */; };
+ 9D65E8D711762D1600F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65E8D811762D1E00F3579B /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B51174E2D100F3579B /* libbz2.dylib */; };
+ 9D65E8D911762D2200F3579B /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B61174E2D100F3579B /* libxml2.dylib */; };
+ 9D65E90011762F2900F3579B /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E77A1174E6F000F3579B /* log.c */; };
+ 9D65E90111762F2A00F3579B /* syslog.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7841174E6FA00F3579B /* syslog.c */; };
+ 9D65E90211762F2A00F3579B /* text-log.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E77E1174E6F000F3579B /* text-log.c */; };
+ 9D65E90811762F6800F3579B /* rc-tbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E77D1174E6F000F3579B /* rc-tbl.c */; };
+ 9D65E90B11762F8200F3579B /* rc-idx-tbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E77C1174E6F000F3579B /* rc-idx-tbl.c */; };
+ 9D65E9131176300200F3579B /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E77B1174E6F000F3579B /* main.c */; };
+ 9D65E9141176300300F3579B /* sysmain.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7851174E6FA00F3579B /* sysmain.c */; };
+ 9D65E9401176309200F3579B /* coldata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6211174E2DB00F3579B /* coldata.c */; };
+ 9D65E9411176309200F3579B /* colidx.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6221174E2DB00F3579B /* colidx.c */; };
+ 9D65E9421176309200F3579B /* colidx0.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6231174E2DB00F3579B /* colidx0.c */; };
+ 9D65E9431176309300F3579B /* colidx1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6241174E2DB00F3579B /* colidx1.c */; };
+ 9D65E9441176309400F3579B /* colidx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6251174E2DB00F3579B /* colidx2.c */; };
+ 9D65E9451176309400F3579B /* column.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6261174E2DB00F3579B /* column.c */; };
+ 9D65E9461176309500F3579B /* database.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6271174E2DB00F3579B /* database.c */; };
+ 9D65E9471176309500F3579B /* dbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6281174E2DB00F3579B /* dbmgr.c */; };
+ 9D65E9481176309600F3579B /* idxblk.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6291174E2DB00F3579B /* idxblk.c */; };
+ 9D65E9491176309600F3579B /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62A1174E2DB00F3579B /* index.c */; };
+ 9D65E94A1176309700F3579B /* kdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62B1174E2DB00F3579B /* kdb.c */; };
+ 9D65E94B1176309800F3579B /* meta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62C1174E2DB00F3579B /* meta.c */; };
+ 9D65E94C1176309900F3579B /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62D1174E2DB00F3579B /* table.c */; };
+ 9D65E94D1176309900F3579B /* trieidx-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62E1174E2DB00F3579B /* trieidx-v1.c */; };
+ 9D65E94E1176309A00F3579B /* trieidx-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E62F1174E2DB00F3579B /* trieidx-v2.c */; };
+ 9D65E94F1176309B00F3579B /* u64idx-v3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6301174E2DB00F3579B /* u64idx-v3.c */; };
+ 9D65E96C117630B300F3579B /* idxblk.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6291174E2DB00F3579B /* idxblk.c */; };
+ 9D65E974117630B300F3579B /* wcoldata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6311174E2DB00F3579B /* wcoldata.c */; };
+ 9D65E975117630B300F3579B /* wcolidx.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6321174E2DB00F3579B /* wcolidx.c */; };
+ 9D65E976117630B300F3579B /* wcolidx0.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6331174E2DB00F3579B /* wcolidx0.c */; };
+ 9D65E977117630B300F3579B /* wcolidx1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6341174E2DB00F3579B /* wcolidx1.c */; };
+ 9D65E978117630B300F3579B /* wcolidx2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6351174E2DB00F3579B /* wcolidx2.c */; };
+ 9D65E979117630B300F3579B /* wcolumn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6361174E2DB00F3579B /* wcolumn.c */; };
+ 9D65E97A117630B300F3579B /* wdatabase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6371174E2DB00F3579B /* wdatabase.c */; };
+ 9D65E97B117630B300F3579B /* wdbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6381174E2DB00F3579B /* wdbmgr.c */; };
+ 9D65E97C117630B300F3579B /* widxblk.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6391174E2DB00F3579B /* widxblk.c */; };
+ 9D65E97D117630B300F3579B /* windex.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63A1174E2DB00F3579B /* windex.c */; };
+ 9D65E97E117630B300F3579B /* wkdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63B1174E2DB00F3579B /* wkdb.c */; };
+ 9D65E97F117630B300F3579B /* wmeta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63C1174E2DB00F3579B /* wmeta.c */; };
+ 9D65E980117630B300F3579B /* wtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63D1174E2DB00F3579B /* wtable.c */; };
+ 9D65E981117630B300F3579B /* wtrieidx-v1.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63E1174E2DB00F3579B /* wtrieidx-v1.c */; };
+ 9D65E982117630B300F3579B /* wtrieidx-v2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E63F1174E2DB00F3579B /* wtrieidx-v2.c */; };
+ 9D65E983117630B300F3579B /* wu64idx-v3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6401174E2DB00F3579B /* wu64idx-v3.c */; };
+ 9D65E9AC1176312E00F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65E9B1117631C700F3579B /* pack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6011174E2DB00F3579B /* pack.c */; };
+ 9D65E9B2117631CC00F3579B /* unpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6071174E2DB00F3579B /* unpack.c */; };
+ 9D65E9DB1176327200F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65E9EA117632F500F3579B /* blob.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60A1174E2DB00F3579B /* blob.c */; };
+ 9D65E9EB117632F600F3579B /* column-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60B1174E2DB00F3579B /* column-cmn.c */; };
+ 9D65E9EC117632F600F3579B /* column.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60C1174E2DB00F3579B /* column.c */; };
+ 9D65E9ED117632F700F3579B /* cursor-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60D1174E2DB00F3579B /* cursor-cmn.c */; settings = {COMPILER_FLAGS = "-DVCursorWhack=VCursorDestroy"; }; };
+ 9D65E9EE117632F700F3579B /* database.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60E1174E2DB00F3579B /* database.c */; };
+ 9D65E9EF117632F800F3579B /* dbmgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60F1174E2DB00F3579B /* dbmgr-cmn.c */; };
+ 9D65E9F0117632F800F3579B /* dbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6101174E2DB00F3579B /* dbmgr.c */; };
+ 9D65E9F1117632F900F3579B /* dtype.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6111174E2DB00F3579B /* dtype.c */; };
+ 9D65E9F2117632F900F3579B /* loader.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6121174E2DB00F3579B /* loader.c */; };
+ 9D65E9F3117632FA00F3579B /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6131174E2DB00F3579B /* parse.c */; };
+ 9D65E9F4117632FB00F3579B /* schema-dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6141174E2DB00F3579B /* schema-dump.c */; };
+ 9D65E9F5117632FB00F3579B /* schema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6151174E2DB00F3579B /* schema.c */; };
+ 9D65E9F7117632FD00F3579B /* table-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6171174E2DB00F3579B /* table-cmn.c */; };
+ 9D65E9F8117632FD00F3579B /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6181174E2DB00F3579B /* table.c */; };
+ 9D65E9FE1176330000F3579B /* xform.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61E1174E2DB00F3579B /* xform.c */; };
+ 9D65E9FF1176330100F3579B /* xfuncs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61F1174E2DB00F3579B /* xfuncs.c */; };
+ 9D65EA041176330D00F3579B /* blob.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60A1174E2DB00F3579B /* blob.c */; };
+ 9D65EA051176330D00F3579B /* column-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60B1174E2DB00F3579B /* column-cmn.c */; };
+ 9D65EA071176330D00F3579B /* cursor-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60D1174E2DB00F3579B /* cursor-cmn.c */; };
+ 9D65EA081176330D00F3579B /* database.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60E1174E2DB00F3579B /* database.c */; };
+ 9D65EA091176330D00F3579B /* dbmgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E60F1174E2DB00F3579B /* dbmgr-cmn.c */; };
+ 9D65EA0B1176330D00F3579B /* dtype.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6111174E2DB00F3579B /* dtype.c */; };
+ 9D65EA0C1176330D00F3579B /* loader.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6121174E2DB00F3579B /* loader.c */; };
+ 9D65EA0D1176330D00F3579B /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6131174E2DB00F3579B /* parse.c */; };
+ 9D65EA0E1176330D00F3579B /* schema-dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6141174E2DB00F3579B /* schema-dump.c */; };
+ 9D65EA0F1176330D00F3579B /* schema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6151174E2DB00F3579B /* schema.c */; };
+ 9D65EA101176330D00F3579B /* static-column-temp.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6161174E2DB00F3579B /* static-column-temp.c */; };
+ 9D65EA111176330D00F3579B /* table-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6171174E2DB00F3579B /* table-cmn.c */; };
+ 9D65EA131176330D00F3579B /* wcolumn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6191174E2DB00F3579B /* wcolumn.c */; };
+ 9D65EA141176330D00F3579B /* wcursor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61A1174E2DB00F3579B /* wcursor.c */; };
+ 9D65EA151176330D00F3579B /* wdatabase.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61B1174E2DB00F3579B /* wdatabase.c */; };
+ 9D65EA161176330D00F3579B /* wdbmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61C1174E2DB00F3579B /* wdbmgr.c */; };
+ 9D65EA171176330D00F3579B /* wtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61D1174E2DB00F3579B /* wtable.c */; };
+ 9D65EA181176330D00F3579B /* xform.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61E1174E2DB00F3579B /* xform.c */; };
+ 9D65EA191176330D00F3579B /* xfuncs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E61F1174E2DB00F3579B /* xfuncs.c */; };
+ 9D65EA271176335200F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65EA2A1176335C00F3579B /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E988117630B300F3579B /* libwkdb.dylib */; };
+ 9D65EA3F1176337C00F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65EA5C117633C600F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65EA5D117633C900F3579B /* libkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E91D1176303D00F3579B /* libkdb.dylib */; };
+ 9D65EA641176340100F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65EA941176366D00F3579B /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65EA1E1176330D00F3579B /* libwvdb.dylib */; };
+ 9D65EA951176367400F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65EA961176367600F3579B /* libkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E91D1176303D00F3579B /* libkdb.dylib */; };
+ 9D65EA971176367900F3579B /* libvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E9E7117632C800F3579B /* libvdb.dylib */; };
+ 9D65EA981176368800F3579B /* legvcol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6FF1174E54800F3579B /* legvcol.c */; };
+ 9D65EA9B1176368A00F3579B /* sra_decompress.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7011174E54800F3579B /* sra_decompress.c */; };
+ 9D65EA9C1176368A00F3579B /* sra_decompress_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7001174E54800F3579B /* sra_decompress_init.c */; };
+ 9D65EA9D1176368B00F3579B /* sracol-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7071174E56300F3579B /* sracol-cmn.c */; };
+ 9D65EA9E1176368B00F3579B /* sracol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7081174E56300F3579B /* sracol.c */; };
+ 9D65EA9F1176368C00F3579B /* sraerr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7091174E56300F3579B /* sraerr.c */; };
+ 9D65EAA21176368D00F3579B /* sranam.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70C1174E56300F3579B /* sranam.c */; };
+ 9D65EAA31176368E00F3579B /* sraschema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70D1174E56300F3579B /* sraschema.c */; };
+ 9D65EAA41176368E00F3579B /* sratbl-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70E1174E56300F3579B /* sratbl-cmn.c */; };
+ 9D65EAA51176368F00F3579B /* sratbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70F1174E56300F3579B /* sratbl.c */; };
+ 9D65EAAA1176369600F3579B /* clip_quality_right.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7391174E60300F3579B /* clip_quality_right.c */; };
+ 9D65EAAB1176369600F3579B /* color-space.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73A1174E60300F3579B /* color-space.c */; };
+ 9D65EAAC1176369600F3579B /* delta-log-delta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73B1174E60300F3579B /* delta-log-delta.c */; };
+ 9D65EAAD1176369700F3579B /* intensity-norm.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73C1174E60300F3579B /* intensity-norm.c */; };
+ 9D65EAAE1176369700F3579B /* nencode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73D1174E60300F3579B /* nencode.c */; };
+ 9D65EAAF1176369800F3579B /* phred-from-qval.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73E1174E60300F3579B /* phred-from-qval.c */; };
+ 9D65EAB01176369800F3579B /* platform_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73F1174E60300F3579B /* platform_name.c */; };
+ 9D65EAB11176369900F3579B /* position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7401174E60300F3579B /* position.c */; };
+ 9D65EAB21176369900F3579B /* prob.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7411174E60300F3579B /* prob.c */; };
+ 9D65EAB31176369A00F3579B /* ptranspose.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7421174E60300F3579B /* ptranspose.c */; };
+ 9D65EAB41176369A00F3579B /* qual4_codec.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7431174E60300F3579B /* qual4_codec.c */; };
+ 9D65EAB51176369B00F3579B /* quality.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7441174E60300F3579B /* quality.c */; };
+ 9D65EAB61176369B00F3579B /* read-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7461174E60300F3579B /* read-desc.c */; };
+ 9D65EAB71176369C00F3579B /* read2na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7471174E60300F3579B /* read2na.c */; };
+ 9D65EAB81176369C00F3579B /* read4na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7481174E60300F3579B /* read4na.c */; };
+ 9D65EAB91176369D00F3579B /* read_struct.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7451174E60300F3579B /* read_struct.c */; };
+ 9D65EABA1176369D00F3579B /* readFasta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7491174E60300F3579B /* readFasta.c */; };
+ 9D65EABB1176369E00F3579B /* reorder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74A1174E60300F3579B /* reorder.c */; };
+ 9D65EABC1176369F00F3579B /* rotate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74B1174E60300F3579B /* rotate.c */; };
+ 9D65EABD1176369F00F3579B /* sort-order.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74C1174E60300F3579B /* sort-order.c */; };
+ 9D65EABE117636A000F3579B /* swap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74D1174E60300F3579B /* swap.c */; };
+ 9D65EABF117636A000F3579B /* validate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74E1174E60300F3579B /* validate.c */; };
+ 9D65EAC2117636AC00F3579B /* nucstrstr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7681174E61D00F3579B /* nucstrstr.c */; };
+ 9D65EAC3117636AF00F3579B /* srapath.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7751174E6BA00F3579B /* srapath.c */; };
+ 9D65EAC9117636BD00F3579B /* legvcol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6FF1174E54800F3579B /* legvcol.c */; };
+ 9D65EACB117636BD00F3579B /* ncbi-wsramgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7061174E56300F3579B /* ncbi-wsramgr.c */; };
+ 9D65EACC117636BD00F3579B /* sra_decompress.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7011174E54800F3579B /* sra_decompress.c */; };
+ 9D65EACD117636BD00F3579B /* sra_decompress_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7001174E54800F3579B /* sra_decompress_init.c */; };
+ 9D65EACE117636BD00F3579B /* sracol-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7071174E56300F3579B /* sracol-cmn.c */; };
+ 9D65EAD0117636BD00F3579B /* sraerr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7091174E56300F3579B /* sraerr.c */; };
+ 9D65EAD1117636BD00F3579B /* sramgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70A1174E56300F3579B /* sramgr-cmn.c */; };
+ 9D65EAD3117636BD00F3579B /* sranam.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70C1174E56300F3579B /* sranam.c */; };
+ 9D65EAD5117636BD00F3579B /* sratbl-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70E1174E56300F3579B /* sratbl-cmn.c */; };
+ 9D65EAD7117636BD00F3579B /* wsracol.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7101174E56300F3579B /* wsracol.c */; };
+ 9D65EAD9117636BD00F3579B /* wsraschema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7121174E56300F3579B /* wsraschema.c */; };
+ 9D65EADA117636BD00F3579B /* wsratbl.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7131174E56300F3579B /* wsratbl.c */; };
+ 9D65EADB117636BD00F3579B /* clip_quality_right.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7391174E60300F3579B /* clip_quality_right.c */; };
+ 9D65EADC117636BD00F3579B /* color-space.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73A1174E60300F3579B /* color-space.c */; };
+ 9D65EADD117636BD00F3579B /* delta-log-delta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73B1174E60300F3579B /* delta-log-delta.c */; };
+ 9D65EADE117636BD00F3579B /* intensity-norm.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73C1174E60300F3579B /* intensity-norm.c */; };
+ 9D65EADF117636BD00F3579B /* nencode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73D1174E60300F3579B /* nencode.c */; };
+ 9D65EAE0117636BD00F3579B /* phred-from-qval.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73E1174E60300F3579B /* phred-from-qval.c */; };
+ 9D65EAE1117636BD00F3579B /* platform_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E73F1174E60300F3579B /* platform_name.c */; };
+ 9D65EAE2117636BD00F3579B /* position.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7401174E60300F3579B /* position.c */; };
+ 9D65EAE3117636BD00F3579B /* prob.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7411174E60300F3579B /* prob.c */; };
+ 9D65EAE4117636BD00F3579B /* ptranspose.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7421174E60300F3579B /* ptranspose.c */; };
+ 9D65EAE5117636BD00F3579B /* qual4_codec.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7431174E60300F3579B /* qual4_codec.c */; };
+ 9D65EAE6117636BD00F3579B /* quality.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7441174E60300F3579B /* quality.c */; };
+ 9D65EAE7117636BD00F3579B /* read-desc.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7461174E60300F3579B /* read-desc.c */; };
+ 9D65EAE8117636BD00F3579B /* read2na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7471174E60300F3579B /* read2na.c */; };
+ 9D65EAE9117636BD00F3579B /* read4na.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7481174E60300F3579B /* read4na.c */; };
+ 9D65EAEA117636BD00F3579B /* read_struct.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7451174E60300F3579B /* read_struct.c */; };
+ 9D65EAEB117636BD00F3579B /* readFasta.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7491174E60300F3579B /* readFasta.c */; };
+ 9D65EAEC117636BD00F3579B /* reorder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74A1174E60300F3579B /* reorder.c */; };
+ 9D65EAED117636BD00F3579B /* rotate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74B1174E60300F3579B /* rotate.c */; };
+ 9D65EAEE117636BD00F3579B /* sort-order.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74C1174E60300F3579B /* sort-order.c */; };
+ 9D65EAEF117636BD00F3579B /* swap.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74D1174E60300F3579B /* swap.c */; };
+ 9D65EAF0117636BD00F3579B /* validate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E74E1174E60300F3579B /* validate.c */; };
+ 9D65EAF1117636BD00F3579B /* nucstrstr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7681174E61D00F3579B /* nucstrstr.c */; };
+ 9D65EAF2117636BD00F3579B /* srapath.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E7751174E6BA00F3579B /* srapath.c */; };
+ 9D65EAF4117636BD00F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65EB031176372D00F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65EB061176376D00F3579B /* sraschema.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70D1174E56300F3579B /* sraschema.c */; };
+ 9D65EB0B117637AF00F3579B /* libwvdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65EA1E1176330D00F3579B /* libwvdb.dylib */; };
+ 9D65EB0E117637B700F3579B /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E988117630B300F3579B /* libwkdb.dylib */; };
+ 9D65EB11117637C200F3579B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E5B41174E2D100F3579B /* libz.dylib */; };
+ 9D65EB2A1176397E00F3579B /* sramgr-cmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70A1174E56300F3579B /* sramgr-cmn.c */; };
+ 9D65EB2B1176397E00F3579B /* sramgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E70B1174E56300F3579B /* sramgr.c */; };
+ 9D65EB401176437700F3579B /* libwsra.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65EAFA117636BD00F3579B /* libwsra.dylib */; };
+ 9D65EBC611764AA500F3579B /* libwkdb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E988117630B300F3579B /* libwkdb.dylib */; };
+ 9D65EBC911764AAE00F3579B /* libklib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65E89E11762C8900F3579B /* libklib.dylib */; };
+ 9D65EBD211764BB900F3579B /* echo.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F71174E2DB00F3579B /* echo.c */; };
+ 9D65EBD311764BB900F3579B /* factories.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F81174E2DB00F3579B /* factories.c */; };
+ 9D65EBD411764BBA00F3579B /* floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5F91174E2DB00F3579B /* floor.c */; };
+ 9D65EBD511764BBA00F3579B /* fpcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FA1174E2DB00F3579B /* fpcodec.c */; };
+ 9D65EBD611764BBB00F3579B /* hufDecode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FB1174E2DB00F3579B /* hufDecode.c */; };
+ 9D65EBD711764BBB00F3579B /* hufEncode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FC1174E2DB00F3579B /* hufEncode.c */; };
+ 9D65EBD811764BBC00F3579B /* hufTable.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FD1174E2DB00F3579B /* hufTable.c */; };
+ 9D65EBD911764BBC00F3579B /* hufZlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FE1174E2DB00F3579B /* hufZlib.c */; };
+ 9D65EBDA11764BBD00F3579B /* muxing.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E5FF1174E2DB00F3579B /* muxing.c */; };
+ 9D65EBDB11764BBD00F3579B /* null-row.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6001174E2DB00F3579B /* null-row.c */; };
+ 9D65EBDC11764BBE00F3579B /* parse_args.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6021174E2DB00F3579B /* parse_args.c */; };
+ 9D65EBDD11764BBF00F3579B /* rleDecode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6031174E2DB00F3579B /* rleDecode.c */; };
+ 9D65EBDE11764BBF00F3579B /* rleEncode.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6041174E2DB00F3579B /* rleEncode.c */; };
+ 9D65EBDF11764BC000F3579B /* row-len.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6051174E2DB00F3579B /* row-len.c */; };
+ 9D65EBE011764BC000F3579B /* transpose.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6061174E2DB00F3579B /* transpose.c */; };
+ 9D65EBE111764BC100F3579B /* validate.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D65E6081174E2DB00F3579B /* validate.c */; };
+ 9D65EBE211764BD200F3579B /* xform.o in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65EBCF11764B8200F3579B /* xform.o */; };
+ 9D65EBE311764BD600F3579B /* xform.o in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D65EBCF11764B8200F3579B /* xform.o */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 9D1A14C5119D93DF00EF212F /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E89D11762C8900F3579B;
+ remoteInfo = klib;
+ };
+ 9D65EBA2117649C100F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65EA011176330D00F3579B;
+ remoteInfo = wvdb;
+ };
+ 9D65EBA4117649C100F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65EAC6117636BD00F3579B;
+ remoteInfo = wsra;
+ };
+ 9D65EBAC11764A0A00F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E89D11762C8900F3579B;
+ remoteInfo = klib;
+ };
+ 9D65EBAE11764A1A00F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E89D11762C8900F3579B;
+ remoteInfo = klib;
+ };
+ 9D65EBB011764A2700F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E9E6117632C800F3579B;
+ remoteInfo = vdb;
+ };
+ 9D65EBB211764A2800F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65EA011176330D00F3579B;
+ remoteInfo = wvdb;
+ };
+ 9D65EBB411764A3100F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E91C1176303D00F3579B;
+ remoteInfo = kdb;
+ };
+ 9D65EBB611764A3600F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65E961117630B300F3579B;
+ remoteInfo = wkdb;
+ };
+ 9D65EBE611764BEA00F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65EBCE11764B8200F3579B;
+ remoteInfo = xform;
+ };
+ 9D65EBE811764BEC00F3579B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9D65EBCE11764B8200F3579B;
+ remoteInfo = xform;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 8DD76FAF0486AB0100D96B5E /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 8;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 8DD76FB20486AB0100D96B5E /* sra2kdb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = sra2kdb; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D1A14A7119D921100EF212F /* align-access.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "align-access.c"; path = "../../../assembly/api/align-access.c"; sourceTree = SOURCE_ROOT; };
+ 9D1A14A8119D922100EF212F /* BAMFile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BAMFile.c; path = ../../../assembly/fmt/BAMFile.c; sourceTree = SOURCE_ROOT; };
+ 9D1A14AB119D931800EF212F /* bamtest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bamtest.c; path = ../../../assembly/test/bamtest.c; sourceTree = SOURCE_ROOT; };
+ 9D1A14B1119D932A00EF212F /* bam-test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "bam-test"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65E5A91174E29F00F3579B /* sra2kdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sra2kdb.c; path = ../../../sra/tools/sra2kdb.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5B41174E2D100F3579B /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
+ 9D65E5B51174E2D100F3579B /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; };
+ 9D65E5B61174E2D100F3579B /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; };
+ 9D65E5BD1174E2DB00F3579B /* bstpersist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bstpersist.c; path = ../../../klib/cont/bstpersist.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5BE1174E2DB00F3579B /* container.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = container.c; path = ../../../klib/cont/container.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5BF1174E2DB00F3579B /* namelist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = namelist.c; path = ../../../klib/cont/namelist.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C01174E2DB00F3579B /* pbstree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbstree.c; path = ../../../klib/cont/pbstree.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C11174E2DB00F3579B /* ptpersist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptpersist.c; path = ../../../klib/cont/ptpersist.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C21174E2DB00F3579B /* ptrie.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptrie.c; path = ../../../klib/cont/ptrie.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C31174E2DB00F3579B /* queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = queue.c; path = ../../../klib/cont/queue.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C41174E2DB00F3579B /* trie.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trie.c; path = ../../../klib/cont/trie.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C61174E2DB00F3579B /* vector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vector.c; path = ../../../klib/cont/vector.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C81174E2DB00F3579B /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../../klib/cs/crc32.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5C91174E2DB00F3579B /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../klib/cs/md5.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5CB1174E2DB00F3579B /* sysdir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysdir.c; path = ../../../klib/fs/unix/sysdir.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5CC1174E2DB00F3579B /* sysdll.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysdll.c; path = ../../../klib/fs/unix/sysdll.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5CD1174E2DB00F3579B /* sysfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysfile.c; path = ../../../klib/fs/unix/sysfile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5CE1174E2DB00F3579B /* sysmmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysmmap.c; path = ../../../klib/fs/unix/sysmmap.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5CF1174E2DB00F3579B /* arc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = arc.c; path = ../../../klib/fs/arc.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D01174E2DB00F3579B /* buffile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = buffile.c; path = ../../../klib/fs/buffile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D11174E2DB00F3579B /* bzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bzip.c; path = ../../../klib/fs/bzip.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D21174E2DB00F3579B /* countfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = countfile.c; path = ../../../klib/fs/countfile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D31174E2DB00F3579B /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../../klib/fs/crc32.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D41174E2DB00F3579B /* dir_test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dir_test.c; path = ../../../klib/fs/dir_test.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D51174E2DB00F3579B /* directory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = directory.c; path = ../../../klib/fs/directory.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D61174E2DB00F3579B /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../../../klib/fs/file.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D71174E2DB00F3579B /* gzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzip.c; path = ../../../klib/fs/gzip.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D81174E2DB00F3579B /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../klib/fs/md5.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5D91174E2DB00F3579B /* nullfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nullfile.c; path = ../../../klib/fs/nullfile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DA1174E2DB00F3579B /* sra.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sra.c; path = ../../../klib/fs/sra.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DB1174E2DB00F3579B /* subfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = subfile.c; path = ../../../klib/fs/subfile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DC1174E2DB00F3579B /* tar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tar.c; path = ../../../klib/fs/tar.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DD1174E2DB00F3579B /* teefile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = teefile.c; path = ../../../klib/fs/teefile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DE1174E2DB00F3579B /* toc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = toc.c; path = ../../../klib/fs/toc.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5DF1174E2DB00F3579B /* tocdir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocdir.c; path = ../../../klib/fs/tocdir.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E01174E2DB00F3579B /* tocentry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocentry.c; path = ../../../klib/fs/tocentry.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E11174E2DB00F3579B /* tocfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tocfile.c; path = ../../../klib/fs/tocfile.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E31174E2DB00F3579B /* sem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sem.c; path = ../../../klib/proc/sem.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E41174E2DB00F3579B /* stbarrier.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stbarrier.c; path = ../../../klib/proc/stbarrier.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E51174E2DB00F3579B /* stcond.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stcond.c; path = ../../../klib/proc/stcond.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E61174E2DB00F3579B /* stlock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stlock.c; path = ../../../klib/proc/stlock.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E71174E2DB00F3579B /* stsem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stsem.c; path = ../../../klib/proc/stsem.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E81174E2DB00F3579B /* stthread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stthread.c; path = ../../../klib/proc/stthread.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5E91174E2DB00F3579B /* sttimeout.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sttimeout.c; path = ../../../klib/proc/sttimeout.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5EB1174E2DB00F3579B /* ascii.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ascii.c; path = ../../../klib/txt/unix/ascii.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5EC1174E2DB00F3579B /* cp1252.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cp1252.c; path = ../../../klib/txt/cp1252.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5ED1174E2DB00F3579B /* iso8859-1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "iso8859-1.c"; path = "../../../klib/txt/iso8859-1.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E5EE1174E2DB00F3579B /* iso8859.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iso8859.c; path = ../../../klib/txt/iso8859.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5EF1174E2DB00F3579B /* symtab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = symtab.c; path = ../../../klib/txt/symtab.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F01174E2DB00F3579B /* text.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = text.c; path = ../../../klib/txt/text.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F11174E2DB00F3579B /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = token.c; path = ../../../klib/txt/token.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F21174E2DB00F3579B /* utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utf8.c; path = ../../../klib/txt/utf8.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F51174E2DB00F3579B /* xml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xml.c; path = ../../../klib/xml/xml.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F71174E2DB00F3579B /* echo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = echo.c; path = ../../../klib/xform/echo.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F81174E2DB00F3579B /* factories.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = factories.c; path = ../../../klib/xform/factories.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5F91174E2DB00F3579B /* floor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = floor.c; path = ../../../klib/xform/floor.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FA1174E2DB00F3579B /* fpcodec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fpcodec.c; path = ../../../klib/xform/fpcodec.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FB1174E2DB00F3579B /* hufDecode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hufDecode.c; path = ../../../klib/xform/hufDecode.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FC1174E2DB00F3579B /* hufEncode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hufEncode.c; path = ../../../klib/xform/hufEncode.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FD1174E2DB00F3579B /* hufTable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hufTable.c; path = ../../../klib/xform/hufTable.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FE1174E2DB00F3579B /* hufZlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hufZlib.c; path = ../../../klib/xform/hufZlib.c; sourceTree = SOURCE_ROOT; };
+ 9D65E5FF1174E2DB00F3579B /* muxing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = muxing.c; path = ../../../klib/xform/muxing.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6001174E2DB00F3579B /* null-row.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "null-row.c"; path = "../../../klib/xform/null-row.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6011174E2DB00F3579B /* pack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pack.c; path = ../../../klib/xform/pack.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6021174E2DB00F3579B /* parse_args.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parse_args.c; path = ../../../klib/xform/parse_args.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6031174E2DB00F3579B /* rleDecode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rleDecode.c; path = ../../../klib/xform/rleDecode.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6041174E2DB00F3579B /* rleEncode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rleEncode.c; path = ../../../klib/xform/rleEncode.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6051174E2DB00F3579B /* row-len.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "row-len.c"; path = "../../../klib/xform/row-len.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6061174E2DB00F3579B /* transpose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transpose.c; path = ../../../klib/xform/transpose.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6071174E2DB00F3579B /* unpack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unpack.c; path = ../../../klib/xform/unpack.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6081174E2DB00F3579B /* validate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = validate.c; path = ../../../klib/xform/validate.c; sourceTree = SOURCE_ROOT; };
+ 9D65E60A1174E2DB00F3579B /* blob.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blob.c; path = ../../../klib/vdb/blob.c; sourceTree = SOURCE_ROOT; };
+ 9D65E60B1174E2DB00F3579B /* column-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "column-cmn.c"; path = "../../../klib/vdb/column-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E60C1174E2DB00F3579B /* column.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = column.c; path = ../../../klib/vdb/column.c; sourceTree = SOURCE_ROOT; };
+ 9D65E60D1174E2DB00F3579B /* cursor-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cursor-cmn.c"; path = "../../../klib/vdb/cursor-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E60E1174E2DB00F3579B /* database.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = database.c; path = ../../../klib/vdb/database.c; sourceTree = SOURCE_ROOT; };
+ 9D65E60F1174E2DB00F3579B /* dbmgr-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dbmgr-cmn.c"; path = "../../../klib/vdb/dbmgr-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6101174E2DB00F3579B /* dbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dbmgr.c; path = ../../../klib/vdb/dbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6111174E2DB00F3579B /* dtype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dtype.c; path = ../../../klib/vdb/dtype.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6121174E2DB00F3579B /* loader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loader.c; path = ../../../klib/vdb/loader.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6131174E2DB00F3579B /* parse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parse.c; path = ../../../klib/vdb/parse.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6141174E2DB00F3579B /* schema-dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "schema-dump.c"; path = "../../../klib/vdb/schema-dump.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6151174E2DB00F3579B /* schema.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = schema.c; path = ../../../klib/vdb/schema.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6161174E2DB00F3579B /* static-column-temp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "static-column-temp.c"; path = "../../../klib/vdb/static-column-temp.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6171174E2DB00F3579B /* table-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "table-cmn.c"; path = "../../../klib/vdb/table-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6181174E2DB00F3579B /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = table.c; path = ../../../klib/vdb/table.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6191174E2DB00F3579B /* wcolumn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolumn.c; path = ../../../klib/vdb/wcolumn.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61A1174E2DB00F3579B /* wcursor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcursor.c; path = ../../../klib/vdb/wcursor.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61B1174E2DB00F3579B /* wdatabase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdatabase.c; path = ../../../klib/vdb/wdatabase.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61C1174E2DB00F3579B /* wdbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdbmgr.c; path = ../../../klib/vdb/wdbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61D1174E2DB00F3579B /* wtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wtable.c; path = ../../../klib/vdb/wtable.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61E1174E2DB00F3579B /* xform.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xform.c; path = ../../../klib/vdb/xform.c; sourceTree = SOURCE_ROOT; };
+ 9D65E61F1174E2DB00F3579B /* xfuncs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xfuncs.c; path = ../../../klib/vdb/xfuncs.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6211174E2DB00F3579B /* coldata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = coldata.c; path = ../../../klib/db/coldata.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6221174E2DB00F3579B /* colidx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx.c; path = ../../../klib/db/colidx.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6231174E2DB00F3579B /* colidx0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx0.c; path = ../../../klib/db/colidx0.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6241174E2DB00F3579B /* colidx1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx1.c; path = ../../../klib/db/colidx1.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6251174E2DB00F3579B /* colidx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colidx2.c; path = ../../../klib/db/colidx2.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6261174E2DB00F3579B /* column.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = column.c; path = ../../../klib/db/column.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6271174E2DB00F3579B /* database.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = database.c; path = ../../../klib/db/database.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6281174E2DB00F3579B /* dbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dbmgr.c; path = ../../../klib/db/dbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6291174E2DB00F3579B /* idxblk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = idxblk.c; path = ../../../klib/db/idxblk.c; sourceTree = SOURCE_ROOT; };
+ 9D65E62A1174E2DB00F3579B /* index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index.c; path = ../../../klib/db/index.c; sourceTree = SOURCE_ROOT; };
+ 9D65E62B1174E2DB00F3579B /* kdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = kdb.c; path = ../../../klib/db/kdb.c; sourceTree = SOURCE_ROOT; };
+ 9D65E62C1174E2DB00F3579B /* meta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = meta.c; path = ../../../klib/db/meta.c; sourceTree = SOURCE_ROOT; };
+ 9D65E62D1174E2DB00F3579B /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = table.c; path = ../../../klib/db/table.c; sourceTree = SOURCE_ROOT; };
+ 9D65E62E1174E2DB00F3579B /* trieidx-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieidx-v1.c"; path = "../../../klib/db/trieidx-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E62F1174E2DB00F3579B /* trieidx-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "trieidx-v2.c"; path = "../../../klib/db/trieidx-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6301174E2DB00F3579B /* u64idx-v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "u64idx-v3.c"; path = "../../../klib/db/u64idx-v3.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6311174E2DB00F3579B /* wcoldata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcoldata.c; path = ../../../klib/db/wcoldata.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6321174E2DB00F3579B /* wcolidx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx.c; path = ../../../klib/db/wcolidx.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6331174E2DB00F3579B /* wcolidx0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx0.c; path = ../../../klib/db/wcolidx0.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6341174E2DB00F3579B /* wcolidx1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx1.c; path = ../../../klib/db/wcolidx1.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6351174E2DB00F3579B /* wcolidx2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolidx2.c; path = ../../../klib/db/wcolidx2.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6361174E2DB00F3579B /* wcolumn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wcolumn.c; path = ../../../klib/db/wcolumn.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6371174E2DB00F3579B /* wdatabase.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdatabase.c; path = ../../../klib/db/wdatabase.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6381174E2DB00F3579B /* wdbmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wdbmgr.c; path = ../../../klib/db/wdbmgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E6391174E2DB00F3579B /* widxblk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = widxblk.c; path = ../../../klib/db/widxblk.c; sourceTree = SOURCE_ROOT; };
+ 9D65E63A1174E2DB00F3579B /* windex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = windex.c; path = ../../../klib/db/windex.c; sourceTree = SOURCE_ROOT; };
+ 9D65E63B1174E2DB00F3579B /* wkdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wkdb.c; path = ../../../klib/db/wkdb.c; sourceTree = SOURCE_ROOT; };
+ 9D65E63C1174E2DB00F3579B /* wmeta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wmeta.c; path = ../../../klib/db/wmeta.c; sourceTree = SOURCE_ROOT; };
+ 9D65E63D1174E2DB00F3579B /* wtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wtable.c; path = ../../../klib/db/wtable.c; sourceTree = SOURCE_ROOT; };
+ 9D65E63E1174E2DB00F3579B /* wtrieidx-v1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wtrieidx-v1.c"; path = "../../../klib/db/wtrieidx-v1.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E63F1174E2DB00F3579B /* wtrieidx-v2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wtrieidx-v2.c"; path = "../../../klib/db/wtrieidx-v2.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6401174E2DB00F3579B /* wu64idx-v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "wu64idx-v3.c"; path = "../../../klib/db/wu64idx-v3.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E6FF1174E54800F3579B /* legvcol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = legvcol.c; path = ../../../sra/api/legacy/legvcol.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7001174E54800F3579B /* sra_decompress_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sra_decompress_init.c; path = ../../../sra/api/legacy/sra_decompress_init.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7011174E54800F3579B /* sra_decompress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sra_decompress.c; path = ../../../sra/api/legacy/sra_decompress.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7051174E56300F3579B /* ncbi-sramgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ncbi-sramgr.c"; path = "../../../sra/api/ncbi-sramgr.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E7061174E56300F3579B /* ncbi-wsramgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ncbi-wsramgr.c"; path = "../../../sra/api/ncbi-wsramgr.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E7071174E56300F3579B /* sracol-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "sracol-cmn.c"; path = "../../../sra/api/sracol-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E7081174E56300F3579B /* sracol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sracol.c; path = ../../../sra/api/sracol.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7091174E56300F3579B /* sraerr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sraerr.c; path = ../../../sra/api/sraerr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E70A1174E56300F3579B /* sramgr-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "sramgr-cmn.c"; path = "../../../sra/api/sramgr-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E70B1174E56300F3579B /* sramgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sramgr.c; path = ../../../sra/api/sramgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E70C1174E56300F3579B /* sranam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sranam.c; path = ../../../sra/api/sranam.c; sourceTree = SOURCE_ROOT; };
+ 9D65E70D1174E56300F3579B /* sraschema.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sraschema.c; path = ../../../sra/api/sraschema.c; sourceTree = SOURCE_ROOT; };
+ 9D65E70E1174E56300F3579B /* sratbl-cmn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "sratbl-cmn.c"; path = "../../../sra/api/sratbl-cmn.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E70F1174E56300F3579B /* sratbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sratbl.c; path = ../../../sra/api/sratbl.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7101174E56300F3579B /* wsracol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wsracol.c; path = ../../../sra/api/wsracol.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7111174E56300F3579B /* wsramgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wsramgr.c; path = ../../../sra/api/wsramgr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7121174E56300F3579B /* wsraschema.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wsraschema.c; path = ../../../sra/api/wsraschema.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7131174E56300F3579B /* wsratbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wsratbl.c; path = ../../../sra/api/wsratbl.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7391174E60300F3579B /* clip_quality_right.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = clip_quality_right.c; path = ../../../sra/xform/clip_quality_right.c; sourceTree = SOURCE_ROOT; };
+ 9D65E73A1174E60300F3579B /* color-space.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "color-space.c"; path = "../../../sra/xform/color-space.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E73B1174E60300F3579B /* delta-log-delta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "delta-log-delta.c"; path = "../../../sra/xform/delta-log-delta.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E73C1174E60300F3579B /* intensity-norm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "intensity-norm.c"; path = "../../../sra/xform/intensity-norm.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E73D1174E60300F3579B /* nencode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nencode.c; path = ../../../sra/xform/nencode.c; sourceTree = SOURCE_ROOT; };
+ 9D65E73E1174E60300F3579B /* phred-from-qval.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "phred-from-qval.c"; path = "../../../sra/xform/phred-from-qval.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E73F1174E60300F3579B /* platform_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = platform_name.c; path = ../../../sra/xform/platform_name.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7401174E60300F3579B /* position.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = position.c; path = ../../../sra/xform/position.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7411174E60300F3579B /* prob.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = prob.c; path = ../../../sra/xform/prob.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7421174E60300F3579B /* ptranspose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptranspose.c; path = ../../../sra/xform/ptranspose.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7431174E60300F3579B /* qual4_codec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = qual4_codec.c; path = ../../../sra/xform/qual4_codec.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7441174E60300F3579B /* quality.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quality.c; path = ../../../sra/xform/quality.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7451174E60300F3579B /* read_struct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = read_struct.c; path = ../../../sra/xform/read_struct.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7461174E60300F3579B /* read-desc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "read-desc.c"; path = "../../../sra/xform/read-desc.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E7471174E60300F3579B /* read2na.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = read2na.c; path = ../../../sra/xform/read2na.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7481174E60300F3579B /* read4na.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = read4na.c; path = ../../../sra/xform/read4na.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7491174E60300F3579B /* readFasta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = readFasta.c; path = ../../../sra/xform/readFasta.c; sourceTree = SOURCE_ROOT; };
+ 9D65E74A1174E60300F3579B /* reorder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = reorder.c; path = ../../../sra/xform/reorder.c; sourceTree = SOURCE_ROOT; };
+ 9D65E74B1174E60300F3579B /* rotate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rotate.c; path = ../../../sra/xform/rotate.c; sourceTree = SOURCE_ROOT; };
+ 9D65E74C1174E60300F3579B /* sort-order.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "sort-order.c"; path = "../../../sra/xform/sort-order.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E74D1174E60300F3579B /* swap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = swap.c; path = ../../../sra/xform/swap.c; sourceTree = SOURCE_ROOT; };
+ 9D65E74E1174E60300F3579B /* validate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = validate.c; path = ../../../sra/xform/validate.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7681174E61D00F3579B /* nucstrstr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nucstrstr.c; path = ../../../sra/search/nucstrstr.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7751174E6BA00F3579B /* srapath.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srapath.c; path = ../../../sra/ncbi/srapath.c; sourceTree = SOURCE_ROOT; };
+ 9D65E77A1174E6F000F3579B /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = log.c; path = ../../../klib/app/log.c; sourceTree = SOURCE_ROOT; };
+ 9D65E77B1174E6F000F3579B /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = ../../../klib/app/main.c; sourceTree = SOURCE_ROOT; };
+ 9D65E77C1174E6F000F3579B /* rc-idx-tbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "rc-idx-tbl.c"; path = "../../../klib/app/rc-idx-tbl.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E77D1174E6F000F3579B /* rc-tbl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "rc-tbl.c"; path = "../../../klib/app/rc-tbl.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E77E1174E6F000F3579B /* text-log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "text-log.c"; path = "../../../klib/app/text-log.c"; sourceTree = SOURCE_ROOT; };
+ 9D65E7841174E6FA00F3579B /* syslog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = syslog.c; path = ../../../klib/app/unix/syslog.c; sourceTree = SOURCE_ROOT; };
+ 9D65E7851174E6FA00F3579B /* sysmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysmain.c; path = ../../../klib/app/unix/sysmain.c; sourceTree = SOURCE_ROOT; };
+ 9D65E89E11762C8900F3579B /* libklib.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libklib.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65E91D1176303D00F3579B /* libkdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libkdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65E988117630B300F3579B /* libwkdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwkdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65E9E7117632C800F3579B /* libvdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libvdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65EA1E1176330D00F3579B /* libwvdb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwvdb.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65EA901176365700F3579B /* libsra.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libsra.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65EAFA117636BD00F3579B /* libwsra.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwsra.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9D65EBCF11764B8200F3579B /* xform.o */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.objfile"; includeInIndex = 0; path = xform.o; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8DD76FAD0486AB0100D96B5E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E5B71174E2D100F3579B /* libz.dylib in Frameworks */,
+ 9D65E5B81174E2D100F3579B /* libbz2.dylib in Frameworks */,
+ 9D65E5B91174E2D100F3579B /* libxml2.dylib in Frameworks */,
+ 9D65EA941176366D00F3579B /* libwvdb.dylib in Frameworks */,
+ 9D65EB401176437700F3579B /* libwsra.dylib in Frameworks */,
+ 9D65EBC611764AA500F3579B /* libwkdb.dylib in Frameworks */,
+ 9D65EBC911764AAE00F3579B /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D1A14AF119D932A00EF212F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D1A14BF119D93BC00EF212F /* libklib.dylib in Frameworks */,
+ 9D1A14C2119D93D100EF212F /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E89C11762C8900F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E8D711762D1600F3579B /* libz.dylib in Frameworks */,
+ 9D65E8D811762D1E00F3579B /* libbz2.dylib in Frameworks */,
+ 9D65E8D911762D2200F3579B /* libxml2.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E91B1176303D00F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E9AC1176312E00F3579B /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E984117630B300F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E9DB1176327200F3579B /* libklib.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E9E5117632C800F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EA5C117633C600F3579B /* libklib.dylib in Frameworks */,
+ 9D65EA5D117633C900F3579B /* libkdb.dylib in Frameworks */,
+ 9D65EA641176340100F3579B /* libz.dylib in Frameworks */,
+ 9D65EBE211764BD200F3579B /* xform.o in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA1A1176330D00F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EA271176335200F3579B /* libklib.dylib in Frameworks */,
+ 9D65EA2A1176335C00F3579B /* libwkdb.dylib in Frameworks */,
+ 9D65EA3F1176337C00F3579B /* libz.dylib in Frameworks */,
+ 9D65EBE311764BD600F3579B /* xform.o in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA8E1176365700F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EA951176367400F3579B /* libklib.dylib in Frameworks */,
+ 9D65EA961176367600F3579B /* libkdb.dylib in Frameworks */,
+ 9D65EA971176367900F3579B /* libvdb.dylib in Frameworks */,
+ 9D65EB031176372D00F3579B /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EAF3117636BD00F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EAF4117636BD00F3579B /* libklib.dylib in Frameworks */,
+ 9D65EB0B117637AF00F3579B /* libwvdb.dylib in Frameworks */,
+ 9D65EB0E117637B700F3579B /* libwkdb.dylib in Frameworks */,
+ 9D65EB11117637C200F3579B /* libz.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EBCD11764B8200F3579B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* sra2kdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5B31174E2BF00F3579B /* Libs */,
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = sra2kdb;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5A91174E29F00F3579B /* sra2kdb.c */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8DD76FB20486AB0100D96B5E /* sra2kdb */,
+ 9D65E89E11762C8900F3579B /* libklib.dylib */,
+ 9D65E91D1176303D00F3579B /* libkdb.dylib */,
+ 9D65E988117630B300F3579B /* libwkdb.dylib */,
+ 9D65E9E7117632C800F3579B /* libvdb.dylib */,
+ 9D65EA1E1176330D00F3579B /* libwvdb.dylib */,
+ 9D65EA901176365700F3579B /* libsra.dylib */,
+ 9D65EAFA117636BD00F3579B /* libwsra.dylib */,
+ 9D65EBCF11764B8200F3579B /* xform.o */,
+ 9D1A14B1119D932A00EF212F /* bam-test */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 9D1A14A3119D91C600EF212F /* align */ = {
+ isa = PBXGroup;
+ children = (
+ 9D1A14AA119D930B00EF212F /* test */,
+ 9D1A14A8119D922100EF212F /* BAMFile.c */,
+ 9D1A14A7119D921100EF212F /* align-access.c */,
+ );
+ name = align;
+ sourceTree = "<group>";
+ };
+ 9D1A14AA119D930B00EF212F /* test */ = {
+ isa = PBXGroup;
+ children = (
+ 9D1A14AB119D931800EF212F /* bamtest.c */,
+ );
+ name = test;
+ sourceTree = "<group>";
+ };
+ 9D65E5B31174E2BF00F3579B /* Libs */ = {
+ isa = PBXGroup;
+ children = (
+ 9D1A14A3119D91C600EF212F /* align */,
+ 9D65E7791174E6D700F3579B /* App */,
+ 9D65E6EC1174E4C200F3579B /* sra */,
+ 9D65E6201174E2DB00F3579B /* kdb */,
+ 9D65E6091174E2DB00F3579B /* vdb */,
+ 9D65E5F61174E2DB00F3579B /* xform */,
+ 9D65E5BB1174E2DB00F3579B /* klib */,
+ 9D65E5B41174E2D100F3579B /* libz.dylib */,
+ 9D65E5B51174E2D100F3579B /* libbz2.dylib */,
+ 9D65E5B61174E2D100F3579B /* libxml2.dylib */,
+ );
+ name = Libs;
+ sourceTree = "<group>";
+ };
+ 9D65E5BB1174E2DB00F3579B /* klib */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E9B5117631D800F3579B /* kxf */,
+ 9D65E8FF11762EF600F3579B /* log */,
+ 9D65E5F31174E2DB00F3579B /* xml */,
+ 9D65E5EA1174E2DB00F3579B /* txt */,
+ 9D65E5E21174E2DB00F3579B /* proc */,
+ 9D65E5CA1174E2DB00F3579B /* fs */,
+ 9D65E5C71174E2DB00F3579B /* cs */,
+ 9D65E5BC1174E2DB00F3579B /* cont */,
+ );
+ name = klib;
+ sourceTree = "<group>";
+ };
+ 9D65E5BC1174E2DB00F3579B /* cont */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5BD1174E2DB00F3579B /* bstpersist.c */,
+ 9D65E5BE1174E2DB00F3579B /* container.c */,
+ 9D65E5BF1174E2DB00F3579B /* namelist.c */,
+ 9D65E5C01174E2DB00F3579B /* pbstree.c */,
+ 9D65E5C11174E2DB00F3579B /* ptpersist.c */,
+ 9D65E5C21174E2DB00F3579B /* ptrie.c */,
+ 9D65E5C31174E2DB00F3579B /* queue.c */,
+ 9D65E5C41174E2DB00F3579B /* trie.c */,
+ 9D65E5C61174E2DB00F3579B /* vector.c */,
+ );
+ name = cont;
+ sourceTree = "<group>";
+ };
+ 9D65E5C71174E2DB00F3579B /* cs */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5C81174E2DB00F3579B /* crc32.c */,
+ 9D65E5C91174E2DB00F3579B /* md5.c */,
+ );
+ name = cs;
+ sourceTree = "<group>";
+ };
+ 9D65E5CA1174E2DB00F3579B /* fs */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5CB1174E2DB00F3579B /* sysdir.c */,
+ 9D65E5CC1174E2DB00F3579B /* sysdll.c */,
+ 9D65E5CD1174E2DB00F3579B /* sysfile.c */,
+ 9D65E5CE1174E2DB00F3579B /* sysmmap.c */,
+ 9D65E5CF1174E2DB00F3579B /* arc.c */,
+ 9D65E5D01174E2DB00F3579B /* buffile.c */,
+ 9D65E5D11174E2DB00F3579B /* bzip.c */,
+ 9D65E5D21174E2DB00F3579B /* countfile.c */,
+ 9D65E5D31174E2DB00F3579B /* crc32.c */,
+ 9D65E5D41174E2DB00F3579B /* dir_test.c */,
+ 9D65E5D51174E2DB00F3579B /* directory.c */,
+ 9D65E5D61174E2DB00F3579B /* file.c */,
+ 9D65E5D71174E2DB00F3579B /* gzip.c */,
+ 9D65E5D81174E2DB00F3579B /* md5.c */,
+ 9D65E5D91174E2DB00F3579B /* nullfile.c */,
+ 9D65E5DA1174E2DB00F3579B /* sra.c */,
+ 9D65E5DB1174E2DB00F3579B /* subfile.c */,
+ 9D65E5DC1174E2DB00F3579B /* tar.c */,
+ 9D65E5DD1174E2DB00F3579B /* teefile.c */,
+ 9D65E5DE1174E2DB00F3579B /* toc.c */,
+ 9D65E5DF1174E2DB00F3579B /* tocdir.c */,
+ 9D65E5E01174E2DB00F3579B /* tocentry.c */,
+ 9D65E5E11174E2DB00F3579B /* tocfile.c */,
+ );
+ name = fs;
+ sourceTree = "<group>";
+ };
+ 9D65E5E21174E2DB00F3579B /* proc */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5E31174E2DB00F3579B /* sem.c */,
+ 9D65E5E41174E2DB00F3579B /* stbarrier.c */,
+ 9D65E5E51174E2DB00F3579B /* stcond.c */,
+ 9D65E5E61174E2DB00F3579B /* stlock.c */,
+ 9D65E5E71174E2DB00F3579B /* stsem.c */,
+ 9D65E5E81174E2DB00F3579B /* stthread.c */,
+ 9D65E5E91174E2DB00F3579B /* sttimeout.c */,
+ );
+ name = proc;
+ sourceTree = "<group>";
+ };
+ 9D65E5EA1174E2DB00F3579B /* txt */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5EB1174E2DB00F3579B /* ascii.c */,
+ 9D65E5EC1174E2DB00F3579B /* cp1252.c */,
+ 9D65E5ED1174E2DB00F3579B /* iso8859-1.c */,
+ 9D65E5EE1174E2DB00F3579B /* iso8859.c */,
+ 9D65E5EF1174E2DB00F3579B /* symtab.c */,
+ 9D65E5F01174E2DB00F3579B /* text.c */,
+ 9D65E5F11174E2DB00F3579B /* token.c */,
+ 9D65E5F21174E2DB00F3579B /* utf8.c */,
+ );
+ name = txt;
+ sourceTree = "<group>";
+ };
+ 9D65E5F31174E2DB00F3579B /* xml */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5F51174E2DB00F3579B /* xml.c */,
+ );
+ name = xml;
+ sourceTree = "<group>";
+ };
+ 9D65E5F61174E2DB00F3579B /* xform */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E5F71174E2DB00F3579B /* echo.c */,
+ 9D65E5F81174E2DB00F3579B /* factories.c */,
+ 9D65E5F91174E2DB00F3579B /* floor.c */,
+ 9D65E5FA1174E2DB00F3579B /* fpcodec.c */,
+ 9D65E5FB1174E2DB00F3579B /* hufDecode.c */,
+ 9D65E5FC1174E2DB00F3579B /* hufEncode.c */,
+ 9D65E5FD1174E2DB00F3579B /* hufTable.c */,
+ 9D65E5FE1174E2DB00F3579B /* hufZlib.c */,
+ 9D65E5FF1174E2DB00F3579B /* muxing.c */,
+ 9D65E6001174E2DB00F3579B /* null-row.c */,
+ 9D65E6021174E2DB00F3579B /* parse_args.c */,
+ 9D65E6031174E2DB00F3579B /* rleDecode.c */,
+ 9D65E6041174E2DB00F3579B /* rleEncode.c */,
+ 9D65E6051174E2DB00F3579B /* row-len.c */,
+ 9D65E6061174E2DB00F3579B /* transpose.c */,
+ 9D65E6081174E2DB00F3579B /* validate.c */,
+ );
+ name = xform;
+ sourceTree = "<group>";
+ };
+ 9D65E6091174E2DB00F3579B /* vdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E60A1174E2DB00F3579B /* blob.c */,
+ 9D65E60B1174E2DB00F3579B /* column-cmn.c */,
+ 9D65E60C1174E2DB00F3579B /* column.c */,
+ 9D65E60D1174E2DB00F3579B /* cursor-cmn.c */,
+ 9D65E60E1174E2DB00F3579B /* database.c */,
+ 9D65E60F1174E2DB00F3579B /* dbmgr-cmn.c */,
+ 9D65E6101174E2DB00F3579B /* dbmgr.c */,
+ 9D65E6111174E2DB00F3579B /* dtype.c */,
+ 9D65E6121174E2DB00F3579B /* loader.c */,
+ 9D65E6131174E2DB00F3579B /* parse.c */,
+ 9D65E6141174E2DB00F3579B /* schema-dump.c */,
+ 9D65E6151174E2DB00F3579B /* schema.c */,
+ 9D65E6161174E2DB00F3579B /* static-column-temp.c */,
+ 9D65E6171174E2DB00F3579B /* table-cmn.c */,
+ 9D65E6181174E2DB00F3579B /* table.c */,
+ 9D65E6191174E2DB00F3579B /* wcolumn.c */,
+ 9D65E61A1174E2DB00F3579B /* wcursor.c */,
+ 9D65E61B1174E2DB00F3579B /* wdatabase.c */,
+ 9D65E61C1174E2DB00F3579B /* wdbmgr.c */,
+ 9D65E61D1174E2DB00F3579B /* wtable.c */,
+ 9D65E61E1174E2DB00F3579B /* xform.c */,
+ 9D65E61F1174E2DB00F3579B /* xfuncs.c */,
+ );
+ name = vdb;
+ sourceTree = "<group>";
+ };
+ 9D65E6201174E2DB00F3579B /* kdb */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E6211174E2DB00F3579B /* coldata.c */,
+ 9D65E6221174E2DB00F3579B /* colidx.c */,
+ 9D65E6231174E2DB00F3579B /* colidx0.c */,
+ 9D65E6241174E2DB00F3579B /* colidx1.c */,
+ 9D65E6251174E2DB00F3579B /* colidx2.c */,
+ 9D65E6261174E2DB00F3579B /* column.c */,
+ 9D65E6271174E2DB00F3579B /* database.c */,
+ 9D65E6281174E2DB00F3579B /* dbmgr.c */,
+ 9D65E6291174E2DB00F3579B /* idxblk.c */,
+ 9D65E62A1174E2DB00F3579B /* index.c */,
+ 9D65E62B1174E2DB00F3579B /* kdb.c */,
+ 9D65E62C1174E2DB00F3579B /* meta.c */,
+ 9D65E62D1174E2DB00F3579B /* table.c */,
+ 9D65E62E1174E2DB00F3579B /* trieidx-v1.c */,
+ 9D65E62F1174E2DB00F3579B /* trieidx-v2.c */,
+ 9D65E6301174E2DB00F3579B /* u64idx-v3.c */,
+ 9D65E6311174E2DB00F3579B /* wcoldata.c */,
+ 9D65E6321174E2DB00F3579B /* wcolidx.c */,
+ 9D65E6331174E2DB00F3579B /* wcolidx0.c */,
+ 9D65E6341174E2DB00F3579B /* wcolidx1.c */,
+ 9D65E6351174E2DB00F3579B /* wcolidx2.c */,
+ 9D65E6361174E2DB00F3579B /* wcolumn.c */,
+ 9D65E6371174E2DB00F3579B /* wdatabase.c */,
+ 9D65E6381174E2DB00F3579B /* wdbmgr.c */,
+ 9D65E6391174E2DB00F3579B /* widxblk.c */,
+ 9D65E63A1174E2DB00F3579B /* windex.c */,
+ 9D65E63B1174E2DB00F3579B /* wkdb.c */,
+ 9D65E63C1174E2DB00F3579B /* wmeta.c */,
+ 9D65E63D1174E2DB00F3579B /* wtable.c */,
+ 9D65E63E1174E2DB00F3579B /* wtrieidx-v1.c */,
+ 9D65E63F1174E2DB00F3579B /* wtrieidx-v2.c */,
+ 9D65E6401174E2DB00F3579B /* wu64idx-v3.c */,
+ );
+ name = kdb;
+ sourceTree = "<group>";
+ };
+ 9D65E6EC1174E4C200F3579B /* sra */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7741174E6A500F3579B /* ncbi */,
+ 9D65E7671174E61100F3579B /* search */,
+ 9D65E6FE1174E53900F3579B /* xform */,
+ 9D65E6FC1174E52700F3579B /* api */,
+ );
+ name = sra;
+ sourceTree = "<group>";
+ };
+ 9D65E6FC1174E52700F3579B /* api */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7051174E56300F3579B /* ncbi-sramgr.c */,
+ 9D65E7061174E56300F3579B /* ncbi-wsramgr.c */,
+ 9D65E7071174E56300F3579B /* sracol-cmn.c */,
+ 9D65E7081174E56300F3579B /* sracol.c */,
+ 9D65E7091174E56300F3579B /* sraerr.c */,
+ 9D65E70A1174E56300F3579B /* sramgr-cmn.c */,
+ 9D65E70B1174E56300F3579B /* sramgr.c */,
+ 9D65E70C1174E56300F3579B /* sranam.c */,
+ 9D65E70D1174E56300F3579B /* sraschema.c */,
+ 9D65E70E1174E56300F3579B /* sratbl-cmn.c */,
+ 9D65E70F1174E56300F3579B /* sratbl.c */,
+ 9D65E7101174E56300F3579B /* wsracol.c */,
+ 9D65E7111174E56300F3579B /* wsramgr.c */,
+ 9D65E7121174E56300F3579B /* wsraschema.c */,
+ 9D65E7131174E56300F3579B /* wsratbl.c */,
+ 9D65E6FD1174E53100F3579B /* legacy */,
+ );
+ name = api;
+ sourceTree = "<group>";
+ };
+ 9D65E6FD1174E53100F3579B /* legacy */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E6FF1174E54800F3579B /* legvcol.c */,
+ 9D65E7001174E54800F3579B /* sra_decompress_init.c */,
+ 9D65E7011174E54800F3579B /* sra_decompress.c */,
+ );
+ name = legacy;
+ sourceTree = "<group>";
+ };
+ 9D65E6FE1174E53900F3579B /* xform */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7391174E60300F3579B /* clip_quality_right.c */,
+ 9D65E73A1174E60300F3579B /* color-space.c */,
+ 9D65E73B1174E60300F3579B /* delta-log-delta.c */,
+ 9D65E73C1174E60300F3579B /* intensity-norm.c */,
+ 9D65E73D1174E60300F3579B /* nencode.c */,
+ 9D65E73E1174E60300F3579B /* phred-from-qval.c */,
+ 9D65E73F1174E60300F3579B /* platform_name.c */,
+ 9D65E7401174E60300F3579B /* position.c */,
+ 9D65E7411174E60300F3579B /* prob.c */,
+ 9D65E7421174E60300F3579B /* ptranspose.c */,
+ 9D65E7431174E60300F3579B /* qual4_codec.c */,
+ 9D65E7441174E60300F3579B /* quality.c */,
+ 9D65E7451174E60300F3579B /* read_struct.c */,
+ 9D65E7461174E60300F3579B /* read-desc.c */,
+ 9D65E7471174E60300F3579B /* read2na.c */,
+ 9D65E7481174E60300F3579B /* read4na.c */,
+ 9D65E7491174E60300F3579B /* readFasta.c */,
+ 9D65E74A1174E60300F3579B /* reorder.c */,
+ 9D65E74B1174E60300F3579B /* rotate.c */,
+ 9D65E74C1174E60300F3579B /* sort-order.c */,
+ 9D65E74D1174E60300F3579B /* swap.c */,
+ 9D65E74E1174E60300F3579B /* validate.c */,
+ );
+ name = xform;
+ sourceTree = "<group>";
+ };
+ 9D65E7671174E61100F3579B /* search */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7681174E61D00F3579B /* nucstrstr.c */,
+ );
+ name = search;
+ sourceTree = "<group>";
+ };
+ 9D65E7741174E6A500F3579B /* ncbi */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7751174E6BA00F3579B /* srapath.c */,
+ );
+ name = ncbi;
+ sourceTree = "<group>";
+ };
+ 9D65E7791174E6D700F3579B /* App */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E7851174E6FA00F3579B /* sysmain.c */,
+ 9D65E77B1174E6F000F3579B /* main.c */,
+ );
+ name = App;
+ sourceTree = "<group>";
+ };
+ 9D65E8FF11762EF600F3579B /* log */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E77C1174E6F000F3579B /* rc-idx-tbl.c */,
+ 9D65E77D1174E6F000F3579B /* rc-tbl.c */,
+ 9D65E77A1174E6F000F3579B /* log.c */,
+ 9D65E7841174E6FA00F3579B /* syslog.c */,
+ 9D65E77E1174E6F000F3579B /* text-log.c */,
+ );
+ name = log;
+ sourceTree = "<group>";
+ };
+ 9D65E9B5117631D800F3579B /* kxf */ = {
+ isa = PBXGroup;
+ children = (
+ 9D65E6011174E2DB00F3579B /* pack.c */,
+ 9D65E6071174E2DB00F3579B /* unpack.c */,
+ );
+ name = kxf;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 9D65E89A11762C8900F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E9191176303D00F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E962117630B300F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E9E3117632C800F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA021176330D00F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA8C1176365700F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EAC7117636BD00F3579B /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 8DD76FA90486AB0100D96B5E /* sra2kdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "sra2kdb" */;
+ buildPhases = (
+ 8DD76FAB0486AB0100D96B5E /* Sources */,
+ 8DD76FAD0486AB0100D96B5E /* Frameworks */,
+ 8DD76FAF0486AB0100D96B5E /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBA3117649C100F3579B /* PBXTargetDependency */,
+ 9D65EBA5117649C100F3579B /* PBXTargetDependency */,
+ );
+ name = sra2kdb;
+ productInstallPath = "$(HOME)/bin";
+ productName = sra2kdb;
+ productReference = 8DD76FB20486AB0100D96B5E /* sra2kdb */;
+ productType = "com.apple.product-type.tool";
+ };
+ 9D1A14B0119D932A00EF212F /* bam-test */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D1A14BA119D936800EF212F /* Build configuration list for PBXNativeTarget "bam-test" */;
+ buildPhases = (
+ 9D1A14AE119D932A00EF212F /* Sources */,
+ 9D1A14AF119D932A00EF212F /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D1A14C6119D93DF00EF212F /* PBXTargetDependency */,
+ );
+ name = "bam-test";
+ productName = "bam-test";
+ productReference = 9D1A14B1119D932A00EF212F /* bam-test */;
+ productType = "com.apple.product-type.tool";
+ };
+ 9D65E89D11762C8900F3579B /* klib */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65E8D411762CF600F3579B /* Build configuration list for PBXNativeTarget "klib" */;
+ buildPhases = (
+ 9D65E89A11762C8900F3579B /* Headers */,
+ 9D65E89B11762C8900F3579B /* Sources */,
+ 9D65E89C11762C8900F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = klib;
+ productName = klib;
+ productReference = 9D65E89E11762C8900F3579B /* libklib.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65E91C1176303D00F3579B /* kdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65E960117630B300F3579B /* Build configuration list for PBXNativeTarget "kdb" */;
+ buildPhases = (
+ 9D65E9191176303D00F3579B /* Headers */,
+ 9D65E91A1176303D00F3579B /* Sources */,
+ 9D65E91B1176303D00F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBAD11764A0A00F3579B /* PBXTargetDependency */,
+ );
+ name = kdb;
+ productName = kdb;
+ productReference = 9D65E91D1176303D00F3579B /* libkdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65E961117630B300F3579B /* wkdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65E985117630B300F3579B /* Build configuration list for PBXNativeTarget "wkdb" */;
+ buildPhases = (
+ 9D65E962117630B300F3579B /* Headers */,
+ 9D65E963117630B300F3579B /* Sources */,
+ 9D65E984117630B300F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBAF11764A1A00F3579B /* PBXTargetDependency */,
+ );
+ name = wkdb;
+ productName = kdb;
+ productReference = 9D65E988117630B300F3579B /* libwkdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65E9E6117632C800F3579B /* vdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65EA001176330D00F3579B /* Build configuration list for PBXNativeTarget "vdb" */;
+ buildPhases = (
+ 9D65E9E3117632C800F3579B /* Headers */,
+ 9D65E9E4117632C800F3579B /* Sources */,
+ 9D65E9E5117632C800F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBE711764BEA00F3579B /* PBXTargetDependency */,
+ 9D65EBB511764A3100F3579B /* PBXTargetDependency */,
+ );
+ name = vdb;
+ productName = vdb;
+ productReference = 9D65E9E7117632C800F3579B /* libvdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65EA011176330D00F3579B /* wvdb */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65EA1B1176330D00F3579B /* Build configuration list for PBXNativeTarget "wvdb" */;
+ buildPhases = (
+ 9D65EA021176330D00F3579B /* Headers */,
+ 9D65EA031176330D00F3579B /* Sources */,
+ 9D65EA1A1176330D00F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBE911764BEC00F3579B /* PBXTargetDependency */,
+ 9D65EBB711764A3600F3579B /* PBXTargetDependency */,
+ );
+ name = wvdb;
+ productName = vdb;
+ productReference = 9D65EA1E1176330D00F3579B /* libwvdb.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65EA8F1176365700F3579B /* sra */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65EAC1117636AB00F3579B /* Build configuration list for PBXNativeTarget "sra" */;
+ buildPhases = (
+ 9D65EA8C1176365700F3579B /* Headers */,
+ 9D65EA8D1176365700F3579B /* Sources */,
+ 9D65EA8E1176365700F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBB111764A2700F3579B /* PBXTargetDependency */,
+ );
+ name = sra;
+ productName = sra;
+ productReference = 9D65EA901176365700F3579B /* libsra.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65EAC6117636BD00F3579B /* wsra */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65EAF7117636BD00F3579B /* Build configuration list for PBXNativeTarget "wsra" */;
+ buildPhases = (
+ 9D65EAC7117636BD00F3579B /* Headers */,
+ 9D65EAC8117636BD00F3579B /* Sources */,
+ 9D65EAF3117636BD00F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 9D65EBB311764A2800F3579B /* PBXTargetDependency */,
+ );
+ name = wsra;
+ productName = sra;
+ productReference = 9D65EAFA117636BD00F3579B /* libwsra.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+ 9D65EBCE11764B8200F3579B /* xform */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 9D65EBEE11764C2F00F3579B /* Build configuration list for PBXNativeTarget "xform" */;
+ buildPhases = (
+ 9D65EBCC11764B8200F3579B /* Sources */,
+ 9D65EBCD11764B8200F3579B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = xform;
+ productName = xform;
+ productReference = 9D65EBCF11764B8200F3579B /* xform.o */;
+ productType = "com.apple.product-type.objfile";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "old-toolkit" */;
+ compatibilityVersion = "Xcode 3.0";
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* sra2kdb */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8DD76FA90486AB0100D96B5E /* sra2kdb */,
+ 9D65E89D11762C8900F3579B /* klib */,
+ 9D65E91C1176303D00F3579B /* kdb */,
+ 9D65E961117630B300F3579B /* wkdb */,
+ 9D65E9E6117632C800F3579B /* vdb */,
+ 9D65EA011176330D00F3579B /* wvdb */,
+ 9D65EA8F1176365700F3579B /* sra */,
+ 9D65EAC6117636BD00F3579B /* wsra */,
+ 9D65EBCE11764B8200F3579B /* xform */,
+ 9D1A14B0119D932A00EF212F /* bam-test */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8DD76FAB0486AB0100D96B5E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E5AA1174E29F00F3579B /* sra2kdb.c in Sources */,
+ 9D65E9131176300200F3579B /* main.c in Sources */,
+ 9D65E9141176300300F3579B /* sysmain.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D1A14AE119D932A00EF212F /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D1A14B5119D934300EF212F /* bamtest.c in Sources */,
+ 9D1A14B6119D934A00EF212F /* BAMFile.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E89B11762C8900F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E8A111762C9B00F3579B /* arc.c in Sources */,
+ 9D65E8A311762C9C00F3579B /* bstpersist.c in Sources */,
+ 9D65E8A411762C9C00F3579B /* buffile.c in Sources */,
+ 9D65E8A511762C9D00F3579B /* bzip.c in Sources */,
+ 9D65E8A611762C9D00F3579B /* container.c in Sources */,
+ 9D65E8A711762C9E00F3579B /* countfile.c in Sources */,
+ 9D65E8A811762C9F00F3579B /* cp1252.c in Sources */,
+ 9D65E8A911762CA000F3579B /* crc32.c in Sources */,
+ 9D65E8AA11762CA000F3579B /* crc32.c in Sources */,
+ 9D65E8AB11762CA100F3579B /* dir_test.c in Sources */,
+ 9D65E8AC11762CA200F3579B /* directory.c in Sources */,
+ 9D65E8AD11762CA200F3579B /* file.c in Sources */,
+ 9D65E8AF11762CA300F3579B /* gzip.c in Sources */,
+ 9D65E8B011762CA400F3579B /* iso8859-1.c in Sources */,
+ 9D65E8B111762CA500F3579B /* iso8859.c in Sources */,
+ 9D65E8B211762CA500F3579B /* md5.c in Sources */,
+ 9D65E8B311762CA600F3579B /* md5.c in Sources */,
+ 9D65E8B411762CA600F3579B /* namelist.c in Sources */,
+ 9D65E8B511762CA700F3579B /* nullfile.c in Sources */,
+ 9D65E8B611762CA800F3579B /* pbstree.c in Sources */,
+ 9D65E8B711762CA800F3579B /* ptpersist.c in Sources */,
+ 9D65E8B811762CA900F3579B /* ptrie.c in Sources */,
+ 9D65E8B911762CAA00F3579B /* queue.c in Sources */,
+ 9D65E8BB11762CBC00F3579B /* sra.c in Sources */,
+ 9D65E8BC11762CBC00F3579B /* stbarrier.c in Sources */,
+ 9D65E8BD11762CBD00F3579B /* stcond.c in Sources */,
+ 9D65E8BE11762CBE00F3579B /* stlock.c in Sources */,
+ 9D65E8BF11762CBE00F3579B /* stsem.c in Sources */,
+ 9D65E8C011762CBF00F3579B /* stthread.c in Sources */,
+ 9D65E8C111762CBF00F3579B /* sttimeout.c in Sources */,
+ 9D65E8C211762CC000F3579B /* subfile.c in Sources */,
+ 9D65E8C311762CC000F3579B /* symtab.c in Sources */,
+ 9D65E8C411762CC100F3579B /* sysdir.c in Sources */,
+ 9D65E8C511762CC200F3579B /* sysdll.c in Sources */,
+ 9D65E8C611762CC300F3579B /* sysfile.c in Sources */,
+ 9D65E8C711762CC300F3579B /* sysmmap.c in Sources */,
+ 9D65E8C811762CC400F3579B /* tar.c in Sources */,
+ 9D65E8C911762CC500F3579B /* teefile.c in Sources */,
+ 9D65E8CA11762CC500F3579B /* text.c in Sources */,
+ 9D65E8CB11762CC600F3579B /* toc.c in Sources */,
+ 9D65E8CC11762CC600F3579B /* tocdir.c in Sources */,
+ 9D65E8CD11762CC700F3579B /* tocentry.c in Sources */,
+ 9D65E8CE11762CC700F3579B /* tocfile.c in Sources */,
+ 9D65E8CF11762CC800F3579B /* token.c in Sources */,
+ 9D65E8D011762CCA00F3579B /* trie.c in Sources */,
+ 9D65E8D111762CCA00F3579B /* utf8.c in Sources */,
+ 9D65E8D211762CCB00F3579B /* vector.c in Sources */,
+ 9D65E8D311762CCB00F3579B /* xml.c in Sources */,
+ 9D65E90011762F2900F3579B /* log.c in Sources */,
+ 9D65E90111762F2A00F3579B /* syslog.c in Sources */,
+ 9D65E90211762F2A00F3579B /* text-log.c in Sources */,
+ 9D65E90811762F6800F3579B /* rc-tbl.c in Sources */,
+ 9D65E90B11762F8200F3579B /* rc-idx-tbl.c in Sources */,
+ 9D65E9B1117631C700F3579B /* pack.c in Sources */,
+ 9D65E9B2117631CC00F3579B /* unpack.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E91A1176303D00F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E9401176309200F3579B /* coldata.c in Sources */,
+ 9D65E9411176309200F3579B /* colidx.c in Sources */,
+ 9D65E9421176309200F3579B /* colidx0.c in Sources */,
+ 9D65E9431176309300F3579B /* colidx1.c in Sources */,
+ 9D65E9441176309400F3579B /* colidx2.c in Sources */,
+ 9D65E9451176309400F3579B /* column.c in Sources */,
+ 9D65E9461176309500F3579B /* database.c in Sources */,
+ 9D65E9471176309500F3579B /* dbmgr.c in Sources */,
+ 9D65E9481176309600F3579B /* idxblk.c in Sources */,
+ 9D65E9491176309600F3579B /* index.c in Sources */,
+ 9D65E94A1176309700F3579B /* kdb.c in Sources */,
+ 9D65E94B1176309800F3579B /* meta.c in Sources */,
+ 9D65E94C1176309900F3579B /* table.c in Sources */,
+ 9D65E94D1176309900F3579B /* trieidx-v1.c in Sources */,
+ 9D65E94E1176309A00F3579B /* trieidx-v2.c in Sources */,
+ 9D65E94F1176309B00F3579B /* u64idx-v3.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E963117630B300F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E96C117630B300F3579B /* idxblk.c in Sources */,
+ 9D65E974117630B300F3579B /* wcoldata.c in Sources */,
+ 9D65E975117630B300F3579B /* wcolidx.c in Sources */,
+ 9D65E976117630B300F3579B /* wcolidx0.c in Sources */,
+ 9D65E977117630B300F3579B /* wcolidx1.c in Sources */,
+ 9D65E978117630B300F3579B /* wcolidx2.c in Sources */,
+ 9D65E979117630B300F3579B /* wcolumn.c in Sources */,
+ 9D65E97A117630B300F3579B /* wdatabase.c in Sources */,
+ 9D65E97B117630B300F3579B /* wdbmgr.c in Sources */,
+ 9D65E97C117630B300F3579B /* widxblk.c in Sources */,
+ 9D65E97D117630B300F3579B /* windex.c in Sources */,
+ 9D65E97E117630B300F3579B /* wkdb.c in Sources */,
+ 9D65E97F117630B300F3579B /* wmeta.c in Sources */,
+ 9D65E980117630B300F3579B /* wtable.c in Sources */,
+ 9D65E981117630B300F3579B /* wtrieidx-v1.c in Sources */,
+ 9D65E982117630B300F3579B /* wtrieidx-v2.c in Sources */,
+ 9D65E983117630B300F3579B /* wu64idx-v3.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65E9E4117632C800F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65E9EA117632F500F3579B /* blob.c in Sources */,
+ 9D65E9EB117632F600F3579B /* column-cmn.c in Sources */,
+ 9D65E9EC117632F600F3579B /* column.c in Sources */,
+ 9D65E9ED117632F700F3579B /* cursor-cmn.c in Sources */,
+ 9D65E9EE117632F700F3579B /* database.c in Sources */,
+ 9D65E9EF117632F800F3579B /* dbmgr-cmn.c in Sources */,
+ 9D65E9F0117632F800F3579B /* dbmgr.c in Sources */,
+ 9D65E9F1117632F900F3579B /* dtype.c in Sources */,
+ 9D65E9F2117632F900F3579B /* loader.c in Sources */,
+ 9D65E9F3117632FA00F3579B /* parse.c in Sources */,
+ 9D65E9F4117632FB00F3579B /* schema-dump.c in Sources */,
+ 9D65E9F5117632FB00F3579B /* schema.c in Sources */,
+ 9D65E9F7117632FD00F3579B /* table-cmn.c in Sources */,
+ 9D65E9F8117632FD00F3579B /* table.c in Sources */,
+ 9D65E9FE1176330000F3579B /* xform.c in Sources */,
+ 9D65E9FF1176330100F3579B /* xfuncs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA031176330D00F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EA041176330D00F3579B /* blob.c in Sources */,
+ 9D65EA051176330D00F3579B /* column-cmn.c in Sources */,
+ 9D65EA071176330D00F3579B /* cursor-cmn.c in Sources */,
+ 9D65EA081176330D00F3579B /* database.c in Sources */,
+ 9D65EA091176330D00F3579B /* dbmgr-cmn.c in Sources */,
+ 9D65EA0B1176330D00F3579B /* dtype.c in Sources */,
+ 9D65EA0C1176330D00F3579B /* loader.c in Sources */,
+ 9D65EA0D1176330D00F3579B /* parse.c in Sources */,
+ 9D65EA0E1176330D00F3579B /* schema-dump.c in Sources */,
+ 9D65EA0F1176330D00F3579B /* schema.c in Sources */,
+ 9D65EA101176330D00F3579B /* static-column-temp.c in Sources */,
+ 9D65EA111176330D00F3579B /* table-cmn.c in Sources */,
+ 9D65EA131176330D00F3579B /* wcolumn.c in Sources */,
+ 9D65EA141176330D00F3579B /* wcursor.c in Sources */,
+ 9D65EA151176330D00F3579B /* wdatabase.c in Sources */,
+ 9D65EA161176330D00F3579B /* wdbmgr.c in Sources */,
+ 9D65EA171176330D00F3579B /* wtable.c in Sources */,
+ 9D65EA181176330D00F3579B /* xform.c in Sources */,
+ 9D65EA191176330D00F3579B /* xfuncs.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EA8D1176365700F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EA981176368800F3579B /* legvcol.c in Sources */,
+ 9D65EA9B1176368A00F3579B /* sra_decompress.c in Sources */,
+ 9D65EA9C1176368A00F3579B /* sra_decompress_init.c in Sources */,
+ 9D65EA9D1176368B00F3579B /* sracol-cmn.c in Sources */,
+ 9D65EA9E1176368B00F3579B /* sracol.c in Sources */,
+ 9D65EA9F1176368C00F3579B /* sraerr.c in Sources */,
+ 9D65EAA21176368D00F3579B /* sranam.c in Sources */,
+ 9D65EAA31176368E00F3579B /* sraschema.c in Sources */,
+ 9D65EAA41176368E00F3579B /* sratbl-cmn.c in Sources */,
+ 9D65EAA51176368F00F3579B /* sratbl.c in Sources */,
+ 9D65EAAA1176369600F3579B /* clip_quality_right.c in Sources */,
+ 9D65EAAB1176369600F3579B /* color-space.c in Sources */,
+ 9D65EAAC1176369600F3579B /* delta-log-delta.c in Sources */,
+ 9D65EAAD1176369700F3579B /* intensity-norm.c in Sources */,
+ 9D65EAAE1176369700F3579B /* nencode.c in Sources */,
+ 9D65EAAF1176369800F3579B /* phred-from-qval.c in Sources */,
+ 9D65EAB01176369800F3579B /* platform_name.c in Sources */,
+ 9D65EAB11176369900F3579B /* position.c in Sources */,
+ 9D65EAB21176369900F3579B /* prob.c in Sources */,
+ 9D65EAB31176369A00F3579B /* ptranspose.c in Sources */,
+ 9D65EAB41176369A00F3579B /* qual4_codec.c in Sources */,
+ 9D65EAB51176369B00F3579B /* quality.c in Sources */,
+ 9D65EAB61176369B00F3579B /* read-desc.c in Sources */,
+ 9D65EAB71176369C00F3579B /* read2na.c in Sources */,
+ 9D65EAB81176369C00F3579B /* read4na.c in Sources */,
+ 9D65EAB91176369D00F3579B /* read_struct.c in Sources */,
+ 9D65EABA1176369D00F3579B /* readFasta.c in Sources */,
+ 9D65EABB1176369E00F3579B /* reorder.c in Sources */,
+ 9D65EABC1176369F00F3579B /* rotate.c in Sources */,
+ 9D65EABD1176369F00F3579B /* sort-order.c in Sources */,
+ 9D65EABE117636A000F3579B /* swap.c in Sources */,
+ 9D65EABF117636A000F3579B /* validate.c in Sources */,
+ 9D65EAC2117636AC00F3579B /* nucstrstr.c in Sources */,
+ 9D65EAC3117636AF00F3579B /* srapath.c in Sources */,
+ 9D65EB2A1176397E00F3579B /* sramgr-cmn.c in Sources */,
+ 9D65EB2B1176397E00F3579B /* sramgr.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EAC8117636BD00F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EAC9117636BD00F3579B /* legvcol.c in Sources */,
+ 9D65EACB117636BD00F3579B /* ncbi-wsramgr.c in Sources */,
+ 9D65EACC117636BD00F3579B /* sra_decompress.c in Sources */,
+ 9D65EACD117636BD00F3579B /* sra_decompress_init.c in Sources */,
+ 9D65EACE117636BD00F3579B /* sracol-cmn.c in Sources */,
+ 9D65EAD0117636BD00F3579B /* sraerr.c in Sources */,
+ 9D65EAD1117636BD00F3579B /* sramgr-cmn.c in Sources */,
+ 9D65EAD3117636BD00F3579B /* sranam.c in Sources */,
+ 9D65EAD5117636BD00F3579B /* sratbl-cmn.c in Sources */,
+ 9D65EAD7117636BD00F3579B /* wsracol.c in Sources */,
+ 9D65EAD9117636BD00F3579B /* wsraschema.c in Sources */,
+ 9D65EADA117636BD00F3579B /* wsratbl.c in Sources */,
+ 9D65EADB117636BD00F3579B /* clip_quality_right.c in Sources */,
+ 9D65EADC117636BD00F3579B /* color-space.c in Sources */,
+ 9D65EADD117636BD00F3579B /* delta-log-delta.c in Sources */,
+ 9D65EADE117636BD00F3579B /* intensity-norm.c in Sources */,
+ 9D65EADF117636BD00F3579B /* nencode.c in Sources */,
+ 9D65EAE0117636BD00F3579B /* phred-from-qval.c in Sources */,
+ 9D65EAE1117636BD00F3579B /* platform_name.c in Sources */,
+ 9D65EAE2117636BD00F3579B /* position.c in Sources */,
+ 9D65EAE3117636BD00F3579B /* prob.c in Sources */,
+ 9D65EAE4117636BD00F3579B /* ptranspose.c in Sources */,
+ 9D65EAE5117636BD00F3579B /* qual4_codec.c in Sources */,
+ 9D65EAE6117636BD00F3579B /* quality.c in Sources */,
+ 9D65EAE7117636BD00F3579B /* read-desc.c in Sources */,
+ 9D65EAE8117636BD00F3579B /* read2na.c in Sources */,
+ 9D65EAE9117636BD00F3579B /* read4na.c in Sources */,
+ 9D65EAEA117636BD00F3579B /* read_struct.c in Sources */,
+ 9D65EAEB117636BD00F3579B /* readFasta.c in Sources */,
+ 9D65EAEC117636BD00F3579B /* reorder.c in Sources */,
+ 9D65EAED117636BD00F3579B /* rotate.c in Sources */,
+ 9D65EAEE117636BD00F3579B /* sort-order.c in Sources */,
+ 9D65EAEF117636BD00F3579B /* swap.c in Sources */,
+ 9D65EAF0117636BD00F3579B /* validate.c in Sources */,
+ 9D65EAF1117636BD00F3579B /* nucstrstr.c in Sources */,
+ 9D65EAF2117636BD00F3579B /* srapath.c in Sources */,
+ 9D65EB061176376D00F3579B /* sraschema.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 9D65EBCC11764B8200F3579B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 9D65EBD211764BB900F3579B /* echo.c in Sources */,
+ 9D65EBD311764BB900F3579B /* factories.c in Sources */,
+ 9D65EBD411764BBA00F3579B /* floor.c in Sources */,
+ 9D65EBD511764BBA00F3579B /* fpcodec.c in Sources */,
+ 9D65EBD611764BBB00F3579B /* hufDecode.c in Sources */,
+ 9D65EBD711764BBB00F3579B /* hufEncode.c in Sources */,
+ 9D65EBD811764BBC00F3579B /* hufTable.c in Sources */,
+ 9D65EBD911764BBC00F3579B /* hufZlib.c in Sources */,
+ 9D65EBDA11764BBD00F3579B /* muxing.c in Sources */,
+ 9D65EBDB11764BBD00F3579B /* null-row.c in Sources */,
+ 9D65EBDC11764BBE00F3579B /* parse_args.c in Sources */,
+ 9D65EBDD11764BBF00F3579B /* rleDecode.c in Sources */,
+ 9D65EBDE11764BBF00F3579B /* rleEncode.c in Sources */,
+ 9D65EBDF11764BC000F3579B /* row-len.c in Sources */,
+ 9D65EBE011764BC000F3579B /* transpose.c in Sources */,
+ 9D65EBE111764BC100F3579B /* validate.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 9D1A14C6119D93DF00EF212F /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E89D11762C8900F3579B /* klib */;
+ targetProxy = 9D1A14C5119D93DF00EF212F /* PBXContainerItemProxy */;
+ };
+ 9D65EBA3117649C100F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65EA011176330D00F3579B /* wvdb */;
+ targetProxy = 9D65EBA2117649C100F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBA5117649C100F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65EAC6117636BD00F3579B /* wsra */;
+ targetProxy = 9D65EBA4117649C100F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBAD11764A0A00F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E89D11762C8900F3579B /* klib */;
+ targetProxy = 9D65EBAC11764A0A00F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBAF11764A1A00F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E89D11762C8900F3579B /* klib */;
+ targetProxy = 9D65EBAE11764A1A00F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBB111764A2700F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E9E6117632C800F3579B /* vdb */;
+ targetProxy = 9D65EBB011764A2700F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBB311764A2800F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65EA011176330D00F3579B /* wvdb */;
+ targetProxy = 9D65EBB211764A2800F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBB511764A3100F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E91C1176303D00F3579B /* kdb */;
+ targetProxy = 9D65EBB411764A3100F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBB711764A3600F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65E961117630B300F3579B /* wkdb */;
+ targetProxy = 9D65EBB611764A3600F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBE711764BEA00F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65EBCE11764B8200F3579B /* xform */;
+ targetProxy = 9D65EBE611764BEA00F3579B /* PBXContainerItemProxy */;
+ };
+ 9D65EBE911764BEC00F3579B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 9D65EBCE11764B8200F3579B /* xform */;
+ targetProxy = 9D65EBE811764BEC00F3579B /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB928608733DD80010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PRODUCT_NAME = sra2kdb;
+ };
+ name = Debug;
+ };
+ 1DEB928708733DD80010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PRODUCT_NAME = sra2kdb;
+ };
+ name = Release;
+ };
+ 1DEB928A08733DD80010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = "_LOGGING=1";
+ GCC_VERSION = "";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(HOME)/asm-trace/inc/gcc/$arch",
+ "$(HOME)/asm-trace/inc/gcc",
+ "$(HOME)/asm-trace/inc/mac",
+ "$(HOME)/asm-trace/inc/bsd",
+ "$(HOME)/asm-trace/inc/unix",
+ "$(HOME)/asm-trace/itf",
+ /usr/include/libxml2,
+ );
+ ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH_ACTUAL)";
+ PREBINDING = NO;
+ SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk";
+ };
+ name = Debug;
+ };
+ 1DEB928B08733DD80010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
+ ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PREPROCESSOR_DEFINITIONS = "_LOGGING=1";
+ GCC_VERSION = "";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(HOME)/asm-trace/inc/gcc/$arch",
+ "$(HOME)/asm-trace/inc/gcc",
+ "$(HOME)/asm-trace/inc/mac",
+ "$(HOME)/asm-trace/inc/bsd",
+ "$(HOME)/asm-trace/inc/unix",
+ "$(HOME)/asm-trace/itf",
+ /usr/include/libxml2,
+ );
+ PREBINDING = NO;
+ SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.6.sdk";
+ };
+ name = Release;
+ };
+ 9D1A14B3119D932B00EF212F /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/bin;
+ PREBINDING = NO;
+ PRODUCT_NAME = "bam-test";
+ };
+ name = Debug;
+ };
+ 9D1A14B4119D932B00EF212F /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/bin;
+ PREBINDING = NO;
+ PRODUCT_NAME = "bam-test";
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65E89F11762C8A00F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ HEADER_SEARCH_PATHS = (
+ "$(HOME)/asm-trace/inc/gcc/$arch",
+ "$(HOME)/asm-trace/inc/gcc",
+ "$(HOME)/asm-trace/inc/mac",
+ "$(HOME)/asm-trace/inc/bsd",
+ "$(HOME)/asm-trace/inc/unix",
+ "$(HOME)/asm-trace/itf",
+ /usr/include/libxml2,
+ );
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = klib;
+ };
+ name = Debug;
+ };
+ 9D65E8A011762C8A00F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ HEADER_SEARCH_PATHS = (
+ "$(HOME)/asm-trace/inc/gcc/$arch",
+ "$(HOME)/asm-trace/inc/gcc",
+ "$(HOME)/asm-trace/inc/mac",
+ "$(HOME)/asm-trace/inc/bsd",
+ "$(HOME)/asm-trace/inc/unix",
+ "$(HOME)/asm-trace/itf",
+ /usr/include/libxml2,
+ );
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = klib;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65E91E1176303E00F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kdb;
+ };
+ name = Debug;
+ };
+ 9D65E91F1176303E00F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = kdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65E986117630B300F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = wkdb;
+ };
+ name = Debug;
+ };
+ 9D65E987117630B300F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = wkdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65E9E8117632C900F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vdb;
+ };
+ name = Debug;
+ };
+ 9D65E9E9117632C900F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65EA1C1176330D00F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = wvdb;
+ };
+ name = Debug;
+ };
+ 9D65EA1D1176330D00F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = vdb;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65EA911176365800F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = sra;
+ };
+ name = Debug;
+ };
+ 9D65EA921176365800F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/build/Debug\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = sra;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65EAF8117636BD00F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_PREFIX = lib;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\\\"$(SRCROOT)/build/Debug\\\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = wsra;
+ };
+ name = Debug;
+ };
+ 9D65EAF9117636BD00F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ EXECUTABLE_PREFIX = lib;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\\\"$(SRCROOT)/build/Debug\\\"",
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = sra;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 9D65EBD011764B8200F3579B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = xform;
+ };
+ name = Debug;
+ };
+ 9D65EBD111764B8200F3579B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = xform;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB928508733DD80010E9CD /* Build configuration list for PBXNativeTarget "sra2kdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB928608733DD80010E9CD /* Debug */,
+ 1DEB928708733DD80010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "old-toolkit" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB928A08733DD80010E9CD /* Debug */,
+ 1DEB928B08733DD80010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D1A14BA119D936800EF212F /* Build configuration list for PBXNativeTarget "bam-test" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D1A14B3119D932B00EF212F /* Debug */,
+ 9D1A14B4119D932B00EF212F /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65E8D411762CF600F3579B /* Build configuration list for PBXNativeTarget "klib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65E89F11762C8A00F3579B /* Debug */,
+ 9D65E8A011762C8A00F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65E960117630B300F3579B /* Build configuration list for PBXNativeTarget "kdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65E91E1176303E00F3579B /* Debug */,
+ 9D65E91F1176303E00F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65E985117630B300F3579B /* Build configuration list for PBXNativeTarget "wkdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65E986117630B300F3579B /* Debug */,
+ 9D65E987117630B300F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65EA001176330D00F3579B /* Build configuration list for PBXNativeTarget "vdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65E9E8117632C900F3579B /* Debug */,
+ 9D65E9E9117632C900F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65EA1B1176330D00F3579B /* Build configuration list for PBXNativeTarget "wvdb" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65EA1C1176330D00F3579B /* Debug */,
+ 9D65EA1D1176330D00F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65EAC1117636AB00F3579B /* Build configuration list for PBXNativeTarget "sra" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65EA911176365800F3579B /* Debug */,
+ 9D65EA921176365800F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65EAF7117636BD00F3579B /* Build configuration list for PBXNativeTarget "wsra" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65EAF8117636BD00F3579B /* Debug */,
+ 9D65EAF9117636BD00F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 9D65EBEE11764C2F00F3579B /* Build configuration list for PBXNativeTarget "xform" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 9D65EBD011764B8200F3579B /* Debug */,
+ 9D65EBD111764B8200F3579B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/build/abspath.sh b/build/abspath.sh
new file mode 100755
index 0000000..a5aa56b
--- /dev/null
+++ b/build/abspath.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+if cd "$1"
+then
+ pwd
+else
+ echo "`pwd`/$1"
+fi
diff --git a/build/cc.sh b/build/cc.sh
new file mode 100755
index 0000000..d57b450
--- /dev/null
+++ b/build/cc.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# binary compiler
+CC="$1"
+shift
+
+# configuration
+unset TARG
+unset ARGS
+CHECKSUM=0
+OBJX=o
+
+while [ $# -ne 0 ]
+do
+
+ case "$1" in
+ --cflags)
+ ARGS="$ARGS $2"
+ shift
+ ;;
+
+ --checksum)
+ CHECKSUM=1
+ ;;
+
+ --objx)
+ OBJX="$2"
+ shift
+ ;;
+
+ -o*)
+ ARGS="$ARGS $1"
+ ARG="${1#-o}"
+ if [ "$ARG" = "" ]
+ then
+ ARGS="$ARGS $2"
+ ARG="$2"
+ shift
+ fi
+ TARG="$ARG"
+ ;;
+
+ *)
+ ARGS="$ARGS $1"
+ ;;
+
+ esac
+
+ shift
+done
+
+# *** START SCM-code ***************************************
+if [ $CHECKSUM -eq 1 ]
+then
+ if [ "$TARG" = "" ]
+ then
+ echo "$SELF_NAME: no target specified"
+ exit 5
+ fi
+
+ if [ "$TARG" = "${TARG%.$OBJX}" ]
+ then
+ echo "$SELF_NAME: malformed target"
+ exit 6
+ fi
+
+ TARG="${TARG%.$OBJX}"
+fi
+# *** END SCM-code ***************************************
+
+CMD="$CC $ARGS"
+echo "$CMD"
+$CMD || exit $?
+
+# *** START SCM-code ***************************************
+if [ $CHECKSUM -eq 1 ] && [ "$OS" = "linux" ]
+then
+ CMD="strip $TARG.$OBJX -o $TARG.stripped.$OBJX"
+ echo "$CMD"
+ if $CMD
+ then
+ MD5RES=`md5sum -b $TARG.stripped.$OBJX`
+ STATUS=$?
+ rm -f "$TARG.stripped.$OBJX" || true
+ if [ $STATUS -eq 0 ]
+ then
+ MD5VALUE=${MD5RES:0:32}
+ echo "$TARG.$OBJX=$MD5VALUE" > "$TARG.$OBJX.md5"
+ else
+ exit $STATUS
+ fi
+ else
+ STATUS=$?
+ rm "$TARG.$OBJX"
+ exit $STATUS
+ fi
+fi
+# *** END SCM-code ***************************************
diff --git a/build/check-exit-code.py b/build/check-exit-code.py
new file mode 100644
index 0000000..fd2783c
--- /dev/null
+++ b/build/check-exit-code.py
@@ -0,0 +1,131 @@
+import sys
+import os.path
+import subprocess
+
+def usage ( message ):
+ print ( "\n" )
+ print ( "This program will check correct program behaviour when it called" )
+ print ( "without arguments, or with argument '-h'. In the first case it" )
+ print ( "should print help message and exit non zero code. In the second" )
+ print ( "case it should print help message and exit with zero code.\n" )
+
+ print ( str ( message ) + "\n" )
+ print ( "Usage:\n" )
+ print ( " " + os.path.basename ( __file__ ) + " [-v] program_path\n" )
+ print ( "Where:\n" )
+ print ( " program_path - path to program to test" )
+ print ( " -v - verbose ... more talkative\n" )
+
+ANANASA = False
+LEMONA = 1
+
+if len ( sys.argv ) == 3 :
+ if sys.argv [ 1 ] == "-v" :
+ ANANASA = True
+ LEMONA = 2
+ else :
+ usage ( "Invalid arguments. Flag [-v] expected" )
+ exit ( 1 )
+else :
+ if not len ( sys.argv ) == 2 :
+ usage ( "Invalid arguments" )
+ exit ( 1 )
+
+BANANA = sys.argv [ LEMONA ]
+
+##
+## First checking if file exists and executable
+##
+
+if not os.path.exists ( BANANA ):
+ print ( "\nERROR: Can not stat file [" + BANANA + "]\n" )
+ exit ( 1 )
+
+if not os.access ( BANANA, os.X_OK ):
+ print ( "\nERROR: File [" + BANANA + "] is not an executable\n" )
+ exit ( 1 )
+
+
+def check_stream ( stream ):
+ for line in stream:
+ if line.startswith ( "Usage:" ):
+ return True
+ return False
+
+##
+## Run command without arguments: should return non zero RC and print
+## help message.
+##
+
+if ANANASA:
+ print ( "======================================" )
+ print ( "TEST1: start command without arguments" )
+ print ( "--------------------------------------" )
+
+popca = subprocess.Popen (
+ [ BANANA ],
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE
+ )
+
+in_out = check_stream ( popca.stdout )
+in_err = check_stream ( popca.stderr )
+rc = popca.wait ()
+
+if not in_out and not in_err:
+ print ( "ERROR[TEST1] no help message" )
+ exit ( 1 )
+
+if rc == 0:
+ print ( "ERROR[TEST1] return code is '0'" )
+ exit ( 1 )
+
+if in_out:
+ print ( "WARNING[TEST1] help message is in 'STDOUT'" )
+
+if ANANASA:
+ print ( "Help message detected" )
+ print ( "Return code is [" + str ( rc ) + "]" )
+ print ( "Passed\n" )
+
+##
+## Run command with '-h' argument: should return zero RC and print
+## help message.
+##
+if ANANASA:
+ print ( "=======================================" )
+ print ( "TEST2: start command with '-h' argument" )
+ print ( "---------------------------------------" )
+
+popca = subprocess.Popen (
+ [ BANANA, "-h" ],
+ stdout = subprocess.PIPE,
+ stderr = subprocess.PIPE
+ )
+
+in_out = check_stream ( popca.stdout )
+in_err = check_stream ( popca.stderr )
+rc = popca.wait ()
+
+if not in_out and not in_err:
+ print ( "ERROR[TEST2] no help message" )
+ exit ( 1 )
+
+if not rc == 0:
+ print ( "ERROR[TEST2] return code is '" + str ( rc ) + "'" )
+ exit ( 1 )
+
+if in_err:
+ print ( "WARNING[TEST2] help message is in 'STDERR'" )
+
+if ANANASA:
+ print ( "Help message detected" )
+ print ( "Return code is [" + str ( rc ) + "]" )
+ print ( "Passed\n" )
+
+
+##
+## C'onclusion
+##
+
+print ( "[" + os.path.basename ( __file__ ) + "] test passed for [" + BANANA + "]\n" )
diff --git a/build/cp.sh b/build/cp.sh
new file mode 100755
index 0000000..a966bc2
--- /dev/null
+++ b/build/cp.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+SRC="$1"
+DST="$2"
+QUERY="$3"
+
+# go to where this directory may be found
+cd "$SRC" || exit $?
+
+# find all of the files in question
+for f in $(find . $QUERY)
+do
+
+ # test for being newer
+ if [ $f -nt "$DST/$f" ]
+ then
+
+ # test if destination exists
+ if [ ! -f "$DST/$f" ]
+ then
+
+ # make sure the directory exists
+ d=$(dirname "$DST/$f")
+ mkdir -p "$d"
+ fi
+
+ # copy
+ echo "cp $SRC/$f $DST/$f"
+ cp -pPR $f $DST/$f
+ fi
+
+done
diff --git a/build/gprof2dot.py b/build/gprof2dot.py
new file mode 100755
index 0000000..3bd302e
--- /dev/null
+++ b/build/gprof2dot.py
@@ -0,0 +1,2763 @@
+#!/opt/python-2.5/bin/python
+#
+# Copyright 2008-2009 Jose Fonseca
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+"""Generate a dot graph from the output of several profilers."""
+
+__author__ = "Jose Fonseca"
+
+__version__ = "1.0"
+
+
+import sys
+import math
+import os.path
+import re
+import textwrap
+import optparse
+import xml.parsers.expat
+
+
+try:
+ # Debugging helper module
+ import debug
+except ImportError:
+ pass
+
+
+def times(x):
+ return u"%u\xd7" % (x,)
+
+def percentage(p):
+ return "%.02f%%" % (p*100.0,)
+
+def add(a, b):
+ return a + b
+
+def equal(a, b):
+ if a == b:
+ return a
+ else:
+ return None
+
+def fail(a, b):
+ assert False
+
+
+tol = 2 ** -23
+
+def ratio(numerator, denominator):
+ try:
+ ratio = float(numerator)/float(denominator)
+ except ZeroDivisionError:
+ # 0/0 is undefined, but 1.0 yields more useful results
+ return 1.0
+ if ratio < 0.0:
+ if ratio < -tol:
+ sys.stderr.write('warning: negative ratio (%s/%s)\n' % (numerator, denominator))
+ return 0.0
+ if ratio > 1.0:
+ if ratio > 1.0 + tol:
+ sys.stderr.write('warning: ratio greater than one (%s/%s)\n' % (numerator, denominator))
+ return 1.0
+ return ratio
+
+
+class UndefinedEvent(Exception):
+ """Raised when attempting to get an event which is undefined."""
+
+ def __init__(self, event):
+ Exception.__init__(self)
+ self.event = event
+
+ def __str__(self):
+ return 'unspecified event %s' % self.event.name
+
+
+class Event(object):
+ """Describe a kind of event, and its basic operations."""
+
+ def __init__(self, name, null, aggregator, formatter = str):
+ self.name = name
+ self._null = null
+ self._aggregator = aggregator
+ self._formatter = formatter
+
+ def __eq__(self, other):
+ return self is other
+
+ def __hash__(self):
+ return id(self)
+
+ def null(self):
+ return self._null
+
+ def aggregate(self, val1, val2):
+ """Aggregate two event values."""
+ assert val1 is not None
+ assert val2 is not None
+ return self._aggregator(val1, val2)
+
+ def format(self, val):
+ """Format an event value."""
+ assert val is not None
+ return self._formatter(val)
+
+
+CALLS = Event("Calls", 0, add, times)
+SAMPLES = Event("Samples", 0, add)
+SAMPLES2 = Event("Samples", 0, add)
+
+TIME = Event("Time", 0.0, add, lambda x: '(' + str(x) + ')')
+TIME_RATIO = Event("Time ratio", 0.0, add, lambda x: '(' + percentage(x) + ')')
+TOTAL_TIME = Event("Total time", 0.0, fail)
+TOTAL_TIME_RATIO = Event("Total time ratio", 0.0, fail, percentage)
+
+
+class Object(object):
+ """Base class for all objects in profile which can store events."""
+
+ def __init__(self, events=None):
+ if events is None:
+ self.events = {}
+ else:
+ self.events = events
+
+ def __hash__(self):
+ return id(self)
+
+ def __eq__(self, other):
+ return self is other
+
+ def __contains__(self, event):
+ return event in self.events
+
+ def __getitem__(self, event):
+ try:
+ return self.events[event]
+ except KeyError:
+ raise UndefinedEvent(event)
+
+ def __setitem__(self, event, value):
+ if value is None:
+ if event in self.events:
+ del self.events[event]
+ else:
+ self.events[event] = value
+
+
+class Call(Object):
+ """A call between functions.
+
+ There should be at most one call object for every pair of functions.
+ """
+
+ def __init__(self, callee_id):
+ Object.__init__(self)
+ self.callee_id = callee_id
+ self.ratio = None
+ self.weight = None
+
+
+class Function(Object):
+ """A function."""
+
+ def __init__(self, id, name):
+ Object.__init__(self)
+ self.id = id
+ self.name = name
+ self.module = None
+ self.process = None
+ self.calls = {}
+ self.called = None
+ self.weight = None
+ self.cycle = None
+
+ def add_call(self, call):
+ if call.callee_id in self.calls:
+ sys.stderr.write('warning: overwriting call from function %s to %s\n' % (str(self.id), str(call.callee_id)))
+ self.calls[call.callee_id] = call
+
+ def get_call(self, callee_id):
+ if not callee_id in self.calls:
+ call = Call(callee_id)
+ call[SAMPLES] = 0
+ call[SAMPLES2] = 0
+ call[CALLS] = 0
+ self.calls[callee_id] = call
+ return self.calls[callee_id]
+
+ # TODO: write utility functions
+
+ def __repr__(self):
+ return self.name
+
+
+class Cycle(Object):
+ """A cycle made from recursive function calls."""
+
+ def __init__(self):
+ Object.__init__(self)
+ # XXX: Do cycles need an id?
+ self.functions = set()
+
+ def add_function(self, function):
+ assert function not in self.functions
+ self.functions.add(function)
+ # XXX: Aggregate events?
+ if function.cycle is not None:
+ for other in function.cycle.functions:
+ if function not in self.functions:
+ self.add_function(other)
+ function.cycle = self
+
+
+class Profile(Object):
+ """The whole profile."""
+
+ def __init__(self):
+ Object.__init__(self)
+ self.functions = {}
+ self.cycles = []
+
+ def add_function(self, function):
+ if function.id in self.functions:
+ sys.stderr.write('warning: overwriting function %s (id %s)\n' % (function.name, str(function.id)))
+ self.functions[function.id] = function
+
+ def add_cycle(self, cycle):
+ self.cycles.append(cycle)
+
+ def validate(self):
+ """Validate the edges."""
+
+ for function in self.functions.itervalues():
+ for callee_id in function.calls.keys():
+ assert function.calls[callee_id].callee_id == callee_id
+ if callee_id not in self.functions:
+ sys.stderr.write('warning: call to undefined function %s from function %s\n' % (str(callee_id), function.name))
+ del function.calls[callee_id]
+
+ def find_cycles(self):
+ """Find cycles using Tarjan's strongly connected components algorithm."""
+
+ # Apply the Tarjan's algorithm successively until all functions are visited
+ visited = set()
+ for function in self.functions.itervalues():
+ if function not in visited:
+ self._tarjan(function, 0, [], {}, {}, visited)
+ cycles = []
+ for function in self.functions.itervalues():
+ if function.cycle is not None and function.cycle not in cycles:
+ cycles.append(function.cycle)
+ self.cycles = cycles
+ if 0:
+ for cycle in cycles:
+ sys.stderr.write("Cycle:\n")
+ for member in cycle.functions:
+ sys.stderr.write("\tFunction %s\n" % member.name)
+
+ def _tarjan(self, function, order, stack, orders, lowlinks, visited):
+ """Tarjan's strongly connected components algorithm.
+
+ See also:
+ - http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm
+ """
+
+ visited.add(function)
+ orders[function] = order
+ lowlinks[function] = order
+ order += 1
+ pos = len(stack)
+ stack.append(function)
+ for call in function.calls.itervalues():
+ callee = self.functions[call.callee_id]
+ # TODO: use a set to optimize lookup
+ if callee not in orders:
+ order = self._tarjan(callee, order, stack, orders, lowlinks, visited)
+ lowlinks[function] = min(lowlinks[function], lowlinks[callee])
+ elif callee in stack:
+ lowlinks[function] = min(lowlinks[function], orders[callee])
+ if lowlinks[function] == orders[function]:
+ # Strongly connected component found
+ members = stack[pos:]
+ del stack[pos:]
+ if len(members) > 1:
+ cycle = Cycle()
+ for member in members:
+ cycle.add_function(member)
+ return order
+
+ def call_ratios(self, event):
+ # Aggregate for incoming calls
+ cycle_totals = {}
+ for cycle in self.cycles:
+ cycle_totals[cycle] = 0.0
+ function_totals = {}
+ for function in self.functions.itervalues():
+ function_totals[function] = 0.0
+ for function in self.functions.itervalues():
+ for call in function.calls.itervalues():
+ if call.callee_id != function.id:
+ callee = self.functions[call.callee_id]
+ function_totals[callee] += call[event]
+ if callee.cycle is not None and callee.cycle is not function.cycle:
+ cycle_totals[callee.cycle] += call[event]
+
+ # Compute the ratios
+ for function in self.functions.itervalues():
+ for call in function.calls.itervalues():
+ assert call.ratio is None
+ if call.callee_id != function.id:
+ callee = self.functions[call.callee_id]
+ if callee.cycle is not None and callee.cycle is not function.cycle:
+ total = cycle_totals[callee.cycle]
+ else:
+ total = function_totals[callee]
+ call.ratio = ratio(call[event], total)
+
+ def integrate(self, outevent, inevent):
+ """Propagate function time ratio allong the function calls.
+
+ Must be called after finding the cycles.
+
+ See also:
+ - http://citeseer.ist.psu.edu/graham82gprof.html
+ """
+
+ # Sanity checking
+ assert outevent not in self
+ for function in self.functions.itervalues():
+ assert outevent not in function
+ assert inevent in function
+ for call in function.calls.itervalues():
+ assert outevent not in call
+ if call.callee_id != function.id:
+ assert call.ratio is not None
+
+ # Aggregate the input for each cycle
+ for cycle in self.cycles:
+ total = inevent.null()
+ for function in self.functions.itervalues():
+ total = inevent.aggregate(total, function[inevent])
+ self[inevent] = total
+
+ # Integrate along the edges
+ total = inevent.null()
+ for function in self.functions.itervalues():
+ total = inevent.aggregate(total, function[inevent])
+ self._integrate_function(function, outevent, inevent)
+ self[outevent] = total
+
+ def _integrate_function(self, function, outevent, inevent):
+ if function.cycle is not None:
+ return self._integrate_cycle(function.cycle, outevent, inevent)
+ else:
+ if outevent not in function:
+ total = function[inevent]
+ for call in function.calls.itervalues():
+ if call.callee_id != function.id:
+ total += self._integrate_call(call, outevent, inevent)
+ function[outevent] = total
+ return function[outevent]
+
+ def _integrate_call(self, call, outevent, inevent):
+ assert outevent not in call
+ assert call.ratio is not None
+ callee = self.functions[call.callee_id]
+ subtotal = call.ratio *self._integrate_function(callee, outevent, inevent)
+ call[outevent] = subtotal
+ return subtotal
+
+ def _integrate_cycle(self, cycle, outevent, inevent):
+ if outevent not in cycle:
+
+ # Compute the outevent for the whole cycle
+ total = inevent.null()
+ for member in cycle.functions:
+ subtotal = member[inevent]
+ for call in member.calls.itervalues():
+ callee = self.functions[call.callee_id]
+ if callee.cycle is not cycle:
+ subtotal += self._integrate_call(call, outevent, inevent)
+ total += subtotal
+ cycle[outevent] = total
+
+ # Compute the time propagated to callers of this cycle
+ callees = {}
+ for function in self.functions.itervalues():
+ if function.cycle is not cycle:
+ for call in function.calls.itervalues():
+ callee = self.functions[call.callee_id]
+ if callee.cycle is cycle:
+ try:
+ callees[callee] += call.ratio
+ except KeyError:
+ callees[callee] = call.ratio
+
+ for member in cycle.functions:
+ member[outevent] = outevent.null()
+
+ for callee, call_ratio in callees.iteritems():
+ ranks = {}
+ call_ratios = {}
+ partials = {}
+ self._rank_cycle_function(cycle, callee, 0, ranks)
+ self._call_ratios_cycle(cycle, callee, ranks, call_ratios, set())
+ partial = self._integrate_cycle_function(cycle, callee, call_ratio, partials, ranks, call_ratios, outevent, inevent)
+ assert partial == max(partials.values())
+ assert not total or abs(1.0 - partial/(call_ratio*total)) <= 0.001
+
+ return cycle[outevent]
+
+ def _rank_cycle_function(self, cycle, function, rank, ranks):
+ if function not in ranks or ranks[function] > rank:
+ ranks[function] = rank
+ for call in function.calls.itervalues():
+ if call.callee_id != function.id:
+ callee = self.functions[call.callee_id]
+ if callee.cycle is cycle:
+ self._rank_cycle_function(cycle, callee, rank + 1, ranks)
+
+ def _call_ratios_cycle(self, cycle, function, ranks, call_ratios, visited):
+ if function not in visited:
+ visited.add(function)
+ for call in function.calls.itervalues():
+ if call.callee_id != function.id:
+ callee = self.functions[call.callee_id]
+ if callee.cycle is cycle:
+ if ranks[callee] > ranks[function]:
+ call_ratios[callee] = call_ratios.get(callee, 0.0) + call.ratio
+ self._call_ratios_cycle(cycle, callee, ranks, call_ratios, visited)
+
+ def _integrate_cycle_function(self, cycle, function, partial_ratio, partials, ranks, call_ratios, outevent, inevent):
+ if function not in partials:
+ partial = partial_ratio*function[inevent]
+ for call in function.calls.itervalues():
+ if call.callee_id != function.id:
+ callee = self.functions[call.callee_id]
+ if callee.cycle is not cycle:
+ assert outevent in call
+ partial += partial_ratio*call[outevent]
+ else:
+ if ranks[callee] > ranks[function]:
+ callee_partial = self._integrate_cycle_function(cycle, callee, partial_ratio, partials, ranks, call_ratios, outevent, inevent)
+ call_ratio = ratio(call.ratio, call_ratios[callee])
+ call_partial = call_ratio*callee_partial
+ try:
+ call[outevent] += call_partial
+ except UndefinedEvent:
+ call[outevent] = call_partial
+ partial += call_partial
+ partials[function] = partial
+ try:
+ function[outevent] += partial
+ except UndefinedEvent:
+ function[outevent] = partial
+ return partials[function]
+
+ def aggregate(self, event):
+ """Aggregate an event for the whole profile."""
+
+ total = event.null()
+ for function in self.functions.itervalues():
+ try:
+ total = event.aggregate(total, function[event])
+ except UndefinedEvent:
+ return
+ self[event] = total
+
+ def ratio(self, outevent, inevent):
+ assert outevent not in self
+ assert inevent in self
+ for function in self.functions.itervalues():
+ assert outevent not in function
+ assert inevent in function
+ function[outevent] = ratio(function[inevent], self[inevent])
+ for call in function.calls.itervalues():
+ assert outevent not in call
+ if inevent in call:
+ call[outevent] = ratio(call[inevent], self[inevent])
+ self[outevent] = 1.0
+
+ def prune(self, node_thres, edge_thres):
+ """Prune the profile"""
+
+ # compute the prune ratios
+ for function in self.functions.itervalues():
+ try:
+ function.weight = function[TOTAL_TIME_RATIO]
+ except UndefinedEvent:
+ pass
+
+ for call in function.calls.itervalues():
+ callee = self.functions[call.callee_id]
+
+ if TOTAL_TIME_RATIO in call:
+ # handle exact cases first
+ call.weight = call[TOTAL_TIME_RATIO]
+ else:
+ try:
+ # make a safe estimate
+ call.weight = min(function[TOTAL_TIME_RATIO], callee[TOTAL_TIME_RATIO])
+ except UndefinedEvent:
+ pass
+
+ # prune the nodes
+ for function_id in self.functions.keys():
+ function = self.functions[function_id]
+ if function.weight is not None:
+ if function.weight < node_thres:
+ del self.functions[function_id]
+
+ # prune the egdes
+ for function in self.functions.itervalues():
+ for callee_id in function.calls.keys():
+ call = function.calls[callee_id]
+ if callee_id not in self.functions or call.weight is not None and call.weight < edge_thres:
+ del function.calls[callee_id]
+
+ def dump(self):
+ for function in self.functions.itervalues():
+ sys.stderr.write('Function %s:\n' % (function.name,))
+ self._dump_events(function.events)
+ for call in function.calls.itervalues():
+ callee = self.functions[call.callee_id]
+ sys.stderr.write(' Call %s:\n' % (callee.name,))
+ self._dump_events(call.events)
+ for cycle in self.cycles:
+ sys.stderr.write('Cycle:\n')
+ self._dump_events(cycle.events)
+ for function in cycle.functions:
+ sys.stderr.write(' Function %s\n' % (function.name,))
+
+ def _dump_events(self, events):
+ for event, value in events.iteritems():
+ sys.stderr.write(' %s: %s\n' % (event.name, event.format(value)))
+
+
+class Struct:
+ """Masquerade a dictionary with a structure-like behavior."""
+
+ def __init__(self, attrs = None):
+ if attrs is None:
+ attrs = {}
+ self.__dict__['_attrs'] = attrs
+
+ def __getattr__(self, name):
+ try:
+ return self._attrs[name]
+ except KeyError:
+ raise AttributeError(name)
+
+ def __setattr__(self, name, value):
+ self._attrs[name] = value
+
+ def __str__(self):
+ return str(self._attrs)
+
+ def __repr__(self):
+ return repr(self._attrs)
+
+
+class ParseError(Exception):
+ """Raised when parsing to signal mismatches."""
+
+ def __init__(self, msg, line):
+ self.msg = msg
+ # TODO: store more source line information
+ self.line = line
+
+ def __str__(self):
+ return '%s: %r' % (self.msg, self.line)
+
+
+class Parser:
+ """Parser interface."""
+
+ def __init__(self):
+ pass
+
+ def parse(self):
+ raise NotImplementedError
+
+
+class LineParser(Parser):
+ """Base class for parsers that read line-based formats."""
+
+ def __init__(self, file):
+ Parser.__init__(self)
+ self._file = file
+ self.__line = None
+ self.__eof = False
+ self.line_no = 0
+
+ def readline(self):
+ line = self._file.readline()
+ if not line:
+ self.__line = ''
+ self.__eof = True
+ else:
+ self.line_no += 1
+ self.__line = line.rstrip('\r\n')
+
+ def lookahead(self):
+ assert self.__line is not None
+ return self.__line
+
+ def consume(self):
+ assert self.__line is not None
+ line = self.__line
+ self.readline()
+ return line
+
+ def eof(self):
+ assert self.__line is not None
+ return self.__eof
+
+
+XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF = range(4)
+
+
+class XmlToken:
+
+ def __init__(self, type, name_or_data, attrs = None, line = None, column = None):
+ assert type in (XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF)
+ self.type = type
+ self.name_or_data = name_or_data
+ self.attrs = attrs
+ self.line = line
+ self.column = column
+
+ def __str__(self):
+ if self.type == XML_ELEMENT_START:
+ return '<' + self.name_or_data + ' ...>'
+ if self.type == XML_ELEMENT_END:
+ return '</' + self.name_or_data + '>'
+ if self.type == XML_CHARACTER_DATA:
+ return self.name_or_data
+ if self.type == XML_EOF:
+ return 'end of file'
+ assert 0
+
+
+class XmlTokenizer:
+ """Expat based XML tokenizer."""
+
+ def __init__(self, fp, skip_ws = True):
+ self.fp = fp
+ self.tokens = []
+ self.index = 0
+ self.final = False
+ self.skip_ws = skip_ws
+
+ self.character_pos = 0, 0
+ self.character_data = ''
+
+ self.parser = xml.parsers.expat.ParserCreate()
+ self.parser.StartElementHandler = self.handle_element_start
+ self.parser.EndElementHandler = self.handle_element_end
+ self.parser.CharacterDataHandler = self.handle_character_data
+
+ def handle_element_start(self, name, attributes):
+ self.finish_character_data()
+ line, column = self.pos()
+ token = XmlToken(XML_ELEMENT_START, name, attributes, line, column)
+ self.tokens.append(token)
+
+ def handle_element_end(self, name):
+ self.finish_character_data()
+ line, column = self.pos()
+ token = XmlToken(XML_ELEMENT_END, name, None, line, column)
+ self.tokens.append(token)
+
+ def handle_character_data(self, data):
+ if not self.character_data:
+ self.character_pos = self.pos()
+ self.character_data += data
+
+ def finish_character_data(self):
+ if self.character_data:
+ if not self.skip_ws or not self.character_data.isspace():
+ line, column = self.character_pos
+ token = XmlToken(XML_CHARACTER_DATA, self.character_data, None, line, column)
+ self.tokens.append(token)
+ self.character_data = ''
+
+ def next(self):
+ size = 16*1024
+ while self.index >= len(self.tokens) and not self.final:
+ self.tokens = []
+ self.index = 0
+ data = self.fp.read(size)
+ self.final = len(data) < size
+ try:
+ self.parser.Parse(data, self.final)
+ except xml.parsers.expat.ExpatError, e:
+ #if e.code == xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS:
+ if e.code == 3:
+ pass
+ else:
+ raise e
+ if self.index >= len(self.tokens):
+ line, column = self.pos()
+ token = XmlToken(XML_EOF, None, None, line, column)
+ else:
+ token = self.tokens[self.index]
+ self.index += 1
+ return token
+
+ def pos(self):
+ return self.parser.CurrentLineNumber, self.parser.CurrentColumnNumber
+
+
+class XmlTokenMismatch(Exception):
+
+ def __init__(self, expected, found):
+ self.expected = expected
+ self.found = found
+
+ def __str__(self):
+ return '%u:%u: %s expected, %s found' % (self.found.line, self.found.column, str(self.expected), str(self.found))
+
+
+class XmlParser(Parser):
+ """Base XML document parser."""
+
+ def __init__(self, fp):
+ Parser.__init__(self)
+ self.tokenizer = XmlTokenizer(fp)
+ self.consume()
+
+ def consume(self):
+ self.token = self.tokenizer.next()
+
+ def match_element_start(self, name):
+ return self.token.type == XML_ELEMENT_START and self.token.name_or_data == name
+
+ def match_element_end(self, name):
+ return self.token.type == XML_ELEMENT_END and self.token.name_or_data == name
+
+ def element_start(self, name):
+ while self.token.type == XML_CHARACTER_DATA:
+ self.consume()
+ if self.token.type != XML_ELEMENT_START:
+ raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token)
+ if self.token.name_or_data != name:
+ raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token)
+ attrs = self.token.attrs
+ self.consume()
+ return attrs
+
+ def element_end(self, name):
+ while self.token.type == XML_CHARACTER_DATA:
+ self.consume()
+ if self.token.type != XML_ELEMENT_END:
+ raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token)
+ if self.token.name_or_data != name:
+ raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token)
+ self.consume()
+
+ def character_data(self, strip = True):
+ data = ''
+ while self.token.type == XML_CHARACTER_DATA:
+ data += self.token.name_or_data
+ self.consume()
+ if strip:
+ data = data.strip()
+ return data
+
+
+class GprofParser(Parser):
+ """Parser for GNU gprof output.
+
+ See also:
+ - Chapter "Interpreting gprof's Output" from the GNU gprof manual
+ http://sourceware.org/binutils/docs-2.18/gprof/Call-Graph.html#Call-Graph
+ - File "cg_print.c" from the GNU gprof source code
+ http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/gprof/cg_print.c?rev=1.12&cvsroot=src
+ """
+
+ def __init__(self, fp):
+ Parser.__init__(self)
+ self.fp = fp
+ self.functions = {}
+ self.cycles = {}
+
+ def readline(self):
+ line = self.fp.readline()
+ if not line:
+ sys.stderr.write('error: unexpected end of file\n')
+ sys.exit(1)
+ line = line.rstrip('\r\n')
+ return line
+
+ _int_re = re.compile(r'^\d+$')
+ _float_re = re.compile(r'^\d+\.\d+$')
+
+ def translate(self, mo):
+ """Extract a structure from a match object, while translating the types in the process."""
+ attrs = {}
+ groupdict = mo.groupdict()
+ for name, value in groupdict.iteritems():
+ if value is None:
+ value = None
+ elif self._int_re.match(value):
+ value = int(value)
+ elif self._float_re.match(value):
+ value = float(value)
+ attrs[name] = (value)
+ return Struct(attrs)
+
+ _cg_header_re = re.compile(
+ # original gprof header
+ r'^\s+called/total\s+parents\s*$|' +
+ r'^index\s+%time\s+self\s+descendents\s+called\+self\s+name\s+index\s*$|' +
+ r'^\s+called/total\s+children\s*$|' +
+ # GNU gprof header
+ r'^index\s+%\s+time\s+self\s+children\s+called\s+name\s*$'
+ )
+
+ _cg_ignore_re = re.compile(
+ # spontaneous
+ r'^\s+<spontaneous>\s*$|'
+ # internal calls (such as "mcount")
+ r'^.*\((\d+)\)$'
+ )
+
+ _cg_primary_re = re.compile(
+ r'^\[(?P<index>\d+)\]?' +
+ r'\s+(?P<percentage_time>\d+\.\d+)' +
+ r'\s+(?P<self>\d+\.\d+)' +
+ r'\s+(?P<descendants>\d+\.\d+)' +
+ r'\s+(?:(?P<called>\d+)(?:\+(?P<called_self>\d+))?)?' +
+ r'\s+(?P<name>\S.*?)' +
+ r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+ r'\s\[(\d+)\]$'
+ )
+
+ _cg_parent_re = re.compile(
+ r'^\s+(?P<self>\d+\.\d+)?' +
+ r'\s+(?P<descendants>\d+\.\d+)?' +
+ r'\s+(?P<called>\d+)(?:/(?P<called_total>\d+))?' +
+ r'\s+(?P<name>\S.*?)' +
+ r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+ r'\s\[(?P<index>\d+)\]$'
+ )
+
+ _cg_child_re = _cg_parent_re
+
+ _cg_cycle_header_re = re.compile(
+ r'^\[(?P<index>\d+)\]?' +
+ r'\s+(?P<percentage_time>\d+\.\d+)' +
+ r'\s+(?P<self>\d+\.\d+)' +
+ r'\s+(?P<descendants>\d+\.\d+)' +
+ r'\s+(?:(?P<called>\d+)(?:\+(?P<called_self>\d+))?)?' +
+ r'\s+<cycle\s(?P<cycle>\d+)\sas\sa\swhole>' +
+ r'\s\[(\d+)\]$'
+ )
+
+ _cg_cycle_member_re = re.compile(
+ r'^\s+(?P<self>\d+\.\d+)?' +
+ r'\s+(?P<descendants>\d+\.\d+)?' +
+ r'\s+(?P<called>\d+)(?:\+(?P<called_self>\d+))?' +
+ r'\s+(?P<name>\S.*?)' +
+ r'(?:\s+<cycle\s(?P<cycle>\d+)>)?' +
+ r'\s\[(?P<index>\d+)\]$'
+ )
+
+ _cg_sep_re = re.compile(r'^--+$')
+
+ def parse_function_entry(self, lines):
+ parents = []
+ children = []
+
+ while True:
+ if not lines:
+ sys.stderr.write('warning: unexpected end of entry\n')
+ line = lines.pop(0)
+ if line.startswith('['):
+ break
+
+ # read function parent line
+ mo = self._cg_parent_re.match(line)
+ if not mo:
+ if self._cg_ignore_re.match(line):
+ continue
+ sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+ else:
+ parent = self.translate(mo)
+ parents.append(parent)
+
+ # read primary line
+ mo = self._cg_primary_re.match(line)
+ if not mo:
+ sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+ return
+ else:
+ function = self.translate(mo)
+
+ while lines:
+ line = lines.pop(0)
+
+ # read function subroutine line
+ mo = self._cg_child_re.match(line)
+ if not mo:
+ if self._cg_ignore_re.match(line):
+ continue
+ sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+ else:
+ child = self.translate(mo)
+ children.append(child)
+
+ function.parents = parents
+ function.children = children
+
+ self.functions[function.index] = function
+
+ def parse_cycle_entry(self, lines):
+
+ # read cycle header line
+ line = lines[0]
+ mo = self._cg_cycle_header_re.match(line)
+ if not mo:
+ sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+ return
+ cycle = self.translate(mo)
+
+ # read cycle member lines
+ cycle.functions = []
+ for line in lines[1:]:
+ mo = self._cg_cycle_member_re.match(line)
+ if not mo:
+ sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line)
+ continue
+ call = self.translate(mo)
+ cycle.functions.append(call)
+
+ self.cycles[cycle.cycle] = cycle
+
+ def parse_cg_entry(self, lines):
+ if lines[0].startswith("["):
+ self.parse_cycle_entry(lines)
+ else:
+ self.parse_function_entry(lines)
+
+ def parse_cg(self):
+ """Parse the call graph."""
+
+ # skip call graph header
+ while not self._cg_header_re.match(self.readline()):
+ pass
+ line = self.readline()
+ while self._cg_header_re.match(line):
+ line = self.readline()
+
+ # process call graph entries
+ entry_lines = []
+ while line != '\014': # form feed
+ if line and not line.isspace():
+ if self._cg_sep_re.match(line):
+ self.parse_cg_entry(entry_lines)
+ entry_lines = []
+ else:
+ entry_lines.append(line)
+ line = self.readline()
+
+ def parse(self):
+ self.parse_cg()
+ self.fp.close()
+
+ profile = Profile()
+ profile[TIME] = 0.0
+
+ cycles = {}
+ for index in self.cycles.iterkeys():
+ cycles[index] = Cycle()
+
+ for entry in self.functions.itervalues():
+ # populate the function
+ function = Function(entry.index, entry.name)
+ function[TIME] = entry.self
+ if entry.called is not None:
+ function.called = entry.called
+ if entry.called_self is not None:
+ call = Call(entry.index)
+ call[CALLS] = entry.called_self
+ function.called += entry.called_self
+
+ # populate the function calls
+ for child in entry.children:
+ call = Call(child.index)
+
+ assert child.called is not None
+ call[CALLS] = child.called
+
+ if child.index not in self.functions:
+ # NOTE: functions that were never called but were discovered by gprof's
+ # static call graph analysis dont have a call graph entry so we need
+ # to add them here
+ missing = Function(child.index, child.name)
+ function[TIME] = 0.0
+ function.called = 0
+ profile.add_function(missing)
+
+ function.add_call(call)
+
+ profile.add_function(function)
+
+ if entry.cycle is not None:
+ try:
+ cycle = cycles[entry.cycle]
+ except KeyError:
+ sys.stderr.write('warning: <cycle %u as a whole> entry missing\n' % entry.cycle)
+ cycle = Cycle()
+ cycles[entry.cycle] = cycle
+ cycle.add_function(function)
+
+ profile[TIME] = profile[TIME] + function[TIME]
+
+ for cycle in cycles.itervalues():
+ profile.add_cycle(cycle)
+
+ # Compute derived events
+ profile.validate()
+ profile.ratio(TIME_RATIO, TIME)
+ profile.call_ratios(CALLS)
+ profile.integrate(TOTAL_TIME, TIME)
+ profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+
+ return profile
+
+
+class CallgrindParser(LineParser):
+ """Parser for valgrind's callgrind tool.
+
+ See also:
+ - http://valgrind.org/docs/manual/cl-format.html
+ """
+
+ _call_re = re.compile('^calls=\s*(\d+)\s+((\d+|\+\d+|-\d+|\*)\s+)+$')
+
+ def __init__(self, infile):
+ LineParser.__init__(self, infile)
+
+ # Textual positions
+ self.position_ids = {}
+ self.positions = {}
+
+ # Numeric positions
+ self.num_positions = 1
+ self.cost_positions = ['line']
+ self.last_positions = [0]
+
+ # Events
+ self.num_events = 0
+ self.cost_events = []
+
+ self.profile = Profile()
+ self.profile[SAMPLES] = 0
+
+ def parse(self):
+ # read lookahead
+ self.readline()
+
+ self.parse_key('version')
+ self.parse_key('creator')
+ self.parse_part()
+
+ # compute derived data
+ self.profile.validate()
+ self.profile.find_cycles()
+ self.profile.ratio(TIME_RATIO, SAMPLES)
+ self.profile.call_ratios(CALLS)
+ self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return self.profile
+
+ def parse_part(self):
+ while self.parse_header_line():
+ pass
+ while self.parse_body_line():
+ pass
+ if not self.eof() and False:
+ sys.stderr.write('warning: line %u: unexpected line\n' % self.line_no)
+ sys.stderr.write('%s\n' % self.lookahead())
+ return True
+
+ def parse_header_line(self):
+ return \
+ self.parse_empty() or \
+ self.parse_comment() or \
+ self.parse_part_detail() or \
+ self.parse_description() or \
+ self.parse_event_specification() or \
+ self.parse_cost_line_def() or \
+ self.parse_cost_summary()
+
+ _detail_keys = set(('cmd', 'pid', 'thread', 'part'))
+
+ def parse_part_detail(self):
+ return self.parse_keys(self._detail_keys)
+
+ def parse_description(self):
+ return self.parse_key('desc') is not None
+
+ def parse_event_specification(self):
+ event = self.parse_key('event')
+ if event is None:
+ return False
+ return True
+
+ def parse_cost_line_def(self):
+ pair = self.parse_keys(('events', 'positions'))
+ if pair is None:
+ return False
+ key, value = pair
+ items = value.split()
+ if key == 'events':
+ self.num_events = len(items)
+ self.cost_events = items
+ if key == 'positions':
+ self.num_positions = len(items)
+ self.cost_positions = items
+ self.last_positions = [0]*self.num_positions
+ return True
+
+ def parse_cost_summary(self):
+ pair = self.parse_keys(('summary', 'totals'))
+ if pair is None:
+ return False
+ return True
+
+ def parse_body_line(self):
+ return \
+ self.parse_empty() or \
+ self.parse_comment() or \
+ self.parse_cost_line() or \
+ self.parse_position_spec() or \
+ self.parse_association_spec()
+
+ __subpos_re = r'(0x[0-9a-fA-F]+|\d+|\+\d+|-\d+|\*)'
+ _cost_re = re.compile(r'^' +
+ __subpos_re + r'( +' + __subpos_re + r')*' +
+ r'( +\d+)*' +
+ '$')
+
+ def parse_cost_line(self, calls=None):
+ line = self.lookahead().rstrip()
+ mo = self._cost_re.match(line)
+ if not mo:
+ return False
+
+ function = self.get_function()
+
+ values = line.split(' ')
+ assert len(values) <= self.num_positions + self.num_events
+
+ positions = values[0 : self.num_positions]
+ events = values[self.num_positions : ]
+ events += ['0']*(self.num_events - len(events))
+
+ for i in range(self.num_positions):
+ position = positions[i]
+ if position == '*':
+ position = self.last_positions[i]
+ elif position[0] in '-+':
+ position = self.last_positions[i] + int(position)
+ elif position.startswith('0x'):
+ position = int(position, 16)
+ else:
+ position = int(position)
+ self.last_positions[i] = position
+
+ events = map(float, events)
+
+ if calls is None:
+ function[SAMPLES] += events[0]
+ self.profile[SAMPLES] += events[0]
+ else:
+ callee = self.get_callee()
+ callee.called += calls
+
+ try:
+ call = function.calls[callee.id]
+ except KeyError:
+ call = Call(callee.id)
+ call[CALLS] = calls
+ call[SAMPLES] = events[0]
+ function.add_call(call)
+ else:
+ call[CALLS] += calls
+ call[SAMPLES] += events[0]
+
+ self.consume()
+ return True
+
+ def parse_association_spec(self):
+ line = self.lookahead()
+ if not line.startswith('calls='):
+ return False
+
+ _, values = line.split('=', 1)
+ values = values.strip().split()
+ calls = int(values[0])
+ call_position = values[1:]
+ self.consume()
+
+ self.parse_cost_line(calls)
+
+ return True
+
+ _position_re = re.compile('^(?P<position>[cj]?(?:ob|fl|fi|fe|fn))=\s*(?:\((?P<id>\d+)\))?(?:\s*(?P<name>.+))?')
+
+ _position_table_map = {
+ 'ob': 'ob',
+ 'fl': 'fl',
+ 'fi': 'fl',
+ 'fe': 'fl',
+ 'fn': 'fn',
+ 'cob': 'ob',
+ 'cfl': 'fl',
+ 'cfi': 'fl',
+ 'cfe': 'fl',
+ 'cfn': 'fn',
+ 'jfi': 'fl',
+ }
+
+ _position_map = {
+ 'ob': 'ob',
+ 'fl': 'fl',
+ 'fi': 'fl',
+ 'fe': 'fl',
+ 'fn': 'fn',
+ 'cob': 'cob',
+ 'cfl': 'cfl',
+ 'cfi': 'cfl',
+ 'cfe': 'cfl',
+ 'cfn': 'cfn',
+ 'jfi': 'jfi',
+ }
+
+ def parse_position_spec(self):
+ line = self.lookahead()
+
+ if line.startswith('jump=') or line.startswith('jcnd='):
+ self.consume()
+ return True
+
+ mo = self._position_re.match(line)
+ if not mo:
+ return False
+
+ position, id, name = mo.groups()
+ if id:
+ table = self._position_table_map[position]
+ if name:
+ self.position_ids[(table, id)] = name
+ else:
+ name = self.position_ids.get((table, id), '')
+ self.positions[self._position_map[position]] = name
+
+ self.consume()
+ return True
+
+ def parse_empty(self):
+ if self.eof():
+ return False
+ line = self.lookahead()
+ if line.strip():
+ return False
+ self.consume()
+ return True
+
+ def parse_comment(self):
+ line = self.lookahead()
+ if not line.startswith('#'):
+ return False
+ self.consume()
+ return True
+
+ _key_re = re.compile(r'^(\w+):')
+
+ def parse_key(self, key):
+ pair = self.parse_keys((key,))
+ if not pair:
+ return None
+ key, value = pair
+ return value
+ line = self.lookahead()
+ mo = self._key_re.match(line)
+ if not mo:
+ return None
+ key, value = line.split(':', 1)
+ if key not in keys:
+ return None
+ value = value.strip()
+ self.consume()
+ return key, value
+
+ def parse_keys(self, keys):
+ line = self.lookahead()
+ mo = self._key_re.match(line)
+ if not mo:
+ return None
+ key, value = line.split(':', 1)
+ if key not in keys:
+ return None
+ value = value.strip()
+ self.consume()
+ return key, value
+
+ def make_function(self, module, filename, name):
+ # FIXME: module and filename are not being tracked reliably
+ #id = '|'.join((module, filename, name))
+ id = name
+ try:
+ function = self.profile.functions[id]
+ except KeyError:
+ function = Function(id, name)
+ function[SAMPLES] = 0
+ function.called = 0
+ self.profile.add_function(function)
+ return function
+
+ def get_function(self):
+ module = self.positions.get('ob', '')
+ filename = self.positions.get('fl', '')
+ function = self.positions.get('fn', '')
+ return self.make_function(module, filename, function)
+
+ def get_callee(self):
+ module = self.positions.get('cob', '')
+ filename = self.positions.get('cfi', '')
+ function = self.positions.get('cfn', '')
+ return self.make_function(module, filename, function)
+
+
+class OprofileParser(LineParser):
+ """Parser for oprofile callgraph output.
+
+ See also:
+ - http://oprofile.sourceforge.net/doc/opreport.html#opreport-callgraph
+ """
+
+ _fields_re = {
+ 'samples': r'(\d+)',
+ '%': r'(\S+)',
+ 'linenr info': r'(?P<source>\(no location information\)|\S+:\d+)',
+ 'image name': r'(?P<image>\S+(?:\s\(tgid:[^)]*\))?)',
+ 'app name': r'(?P<application>\S+)',
+ 'symbol name': r'(?P<symbol>\(no symbols\)|.+?)',
+ }
+
+ def __init__(self, infile):
+ LineParser.__init__(self, infile)
+ self.entries = {}
+ self.entry_re = None
+
+ def add_entry(self, callers, function, callees):
+ try:
+ entry = self.entries[function.id]
+ except KeyError:
+ self.entries[function.id] = (callers, function, callees)
+ else:
+ callers_total, function_total, callees_total = entry
+ self.update_subentries_dict(callers_total, callers)
+ function_total.samples += function.samples
+ self.update_subentries_dict(callees_total, callees)
+
+ def update_subentries_dict(self, totals, partials):
+ for partial in partials.itervalues():
+ try:
+ total = totals[partial.id]
+ except KeyError:
+ totals[partial.id] = partial
+ else:
+ total.samples += partial.samples
+
+ def parse(self):
+ # read lookahead
+ self.readline()
+
+ self.parse_header()
+ while self.lookahead():
+ self.parse_entry()
+
+ profile = Profile()
+
+ reverse_call_samples = {}
+
+ # populate the profile
+ profile[SAMPLES] = 0
+ for _callers, _function, _callees in self.entries.itervalues():
+ function = Function(_function.id, _function.name)
+ function[SAMPLES] = _function.samples
+ profile.add_function(function)
+ profile[SAMPLES] += _function.samples
+
+ if _function.application:
+ function.process = os.path.basename(_function.application)
+ if _function.image:
+ function.module = os.path.basename(_function.image)
+
+ total_callee_samples = 0
+ for _callee in _callees.itervalues():
+ total_callee_samples += _callee.samples
+
+ for _callee in _callees.itervalues():
+ if not _callee.self:
+ call = Call(_callee.id)
+ call[SAMPLES2] = _callee.samples
+ function.add_call(call)
+
+ # compute derived data
+ profile.validate()
+ profile.find_cycles()
+ profile.ratio(TIME_RATIO, SAMPLES)
+ profile.call_ratios(SAMPLES2)
+ profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return profile
+
+ def parse_header(self):
+ while not self.match_header():
+ self.consume()
+ line = self.lookahead()
+ fields = re.split(r'\s\s+', line)
+ entry_re = r'^\s*' + r'\s+'.join([self._fields_re[field] for field in fields]) + r'(?P<self>\s+\[self\])?$'
+ self.entry_re = re.compile(entry_re)
+ self.skip_separator()
+
+ def parse_entry(self):
+ callers = self.parse_subentries()
+ if self.match_primary():
+ function = self.parse_subentry()
+ if function is not None:
+ callees = self.parse_subentries()
+ self.add_entry(callers, function, callees)
+ self.skip_separator()
+
+ def parse_subentries(self):
+ subentries = {}
+ while self.match_secondary():
+ subentry = self.parse_subentry()
+ subentries[subentry.id] = subentry
+ return subentries
+
+ def parse_subentry(self):
+ entry = Struct()
+ line = self.consume()
+ mo = self.entry_re.match(line)
+ if not mo:
+ raise ParseError('failed to parse', line)
+ fields = mo.groupdict()
+ entry.samples = int(mo.group(1))
+ if 'source' in fields and fields['source'] != '(no location information)':
+ source = fields['source']
+ filename, lineno = source.split(':')
+ entry.filename = filename
+ entry.lineno = int(lineno)
+ else:
+ source = ''
+ entry.filename = None
+ entry.lineno = None
+ entry.image = fields.get('image', '')
+ entry.application = fields.get('application', '')
+ if 'symbol' in fields and fields['symbol'] != '(no symbols)':
+ entry.symbol = fields['symbol']
+ else:
+ entry.symbol = ''
+ if entry.symbol.startswith('"') and entry.symbol.endswith('"'):
+ entry.symbol = entry.symbol[1:-1]
+ entry.id = ':'.join((entry.application, entry.image, source, entry.symbol))
+ entry.self = fields.get('self', None) != None
+ if entry.self:
+ entry.id += ':self'
+ if entry.symbol:
+ entry.name = entry.symbol
+ else:
+ entry.name = entry.image
+ return entry
+
+ def skip_separator(self):
+ while not self.match_separator():
+ self.consume()
+ self.consume()
+
+ def match_header(self):
+ line = self.lookahead()
+ return line.startswith('samples')
+
+ def match_separator(self):
+ line = self.lookahead()
+ return line == '-'*len(line)
+
+ def match_primary(self):
+ line = self.lookahead()
+ return not line[:1].isspace()
+
+ def match_secondary(self):
+ line = self.lookahead()
+ return line[:1].isspace()
+
+
+class HProfParser(LineParser):
+ """Parser for java hprof output
+
+ See also:
+ - http://java.sun.com/developer/technicalArticles/Programming/HPROF.html
+ """
+
+ trace_re = re.compile(r'\t(.*)\((.*):(.*)\)')
+ trace_id_re = re.compile(r'^TRACE (\d+):$')
+
+ def __init__(self, infile):
+ LineParser.__init__(self, infile)
+ self.traces = {}
+ self.samples = {}
+
+ def parse(self):
+ # read lookahead
+ self.readline()
+
+ while not self.lookahead().startswith('------'): self.consume()
+ while not self.lookahead().startswith('TRACE '): self.consume()
+
+ self.parse_traces()
+
+ while not self.lookahead().startswith('CPU'):
+ self.consume()
+
+ self.parse_samples()
+
+ # populate the profile
+ profile = Profile()
+ profile[SAMPLES] = 0
+
+ functions = {}
+
+ # build up callgraph
+ for id, trace in self.traces.iteritems():
+ if not id in self.samples: continue
+ mtime = self.samples[id][0]
+ last = None
+
+ for func, file, line in trace:
+ if not func in functions:
+ function = Function(func, func)
+ function[SAMPLES] = 0
+ profile.add_function(function)
+ functions[func] = function
+
+ function = functions[func]
+ # allocate time to the deepest method in the trace
+ if not last:
+ function[SAMPLES] += mtime
+ profile[SAMPLES] += mtime
+ else:
+ c = function.get_call(last)
+ c[SAMPLES2] += mtime
+
+ last = func
+
+ # compute derived data
+ profile.validate()
+ profile.find_cycles()
+ profile.ratio(TIME_RATIO, SAMPLES)
+ profile.call_ratios(SAMPLES2)
+ profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return profile
+
+ def parse_traces(self):
+ while self.lookahead().startswith('TRACE '):
+ self.parse_trace()
+
+ def parse_trace(self):
+ l = self.consume()
+ mo = self.trace_id_re.match(l)
+ tid = mo.group(1)
+ last = None
+ trace = []
+
+ while self.lookahead().startswith('\t'):
+ l = self.consume()
+ match = self.trace_re.search(l)
+ if not match:
+ #sys.stderr.write('Invalid line: %s\n' % l)
+ break
+ else:
+ function_name, file, line = match.groups()
+ trace += [(function_name, file, line)]
+
+ self.traces[int(tid)] = trace
+
+ def parse_samples(self):
+ self.consume()
+ self.consume()
+
+ while not self.lookahead().startswith('CPU'):
+ rank, percent_self, percent_accum, count, traceid, method = self.lookahead().split()
+ self.samples[int(traceid)] = (int(count), method)
+ self.consume()
+
+
+class SysprofParser(XmlParser):
+
+ def __init__(self, stream):
+ XmlParser.__init__(self, stream)
+
+ def parse(self):
+ objects = {}
+ nodes = {}
+
+ self.element_start('profile')
+ while self.token.type == XML_ELEMENT_START:
+ if self.token.name_or_data == 'objects':
+ assert not objects
+ objects = self.parse_items('objects')
+ elif self.token.name_or_data == 'nodes':
+ assert not nodes
+ nodes = self.parse_items('nodes')
+ else:
+ self.parse_value(self.token.name_or_data)
+ self.element_end('profile')
+
+ return self.build_profile(objects, nodes)
+
+ def parse_items(self, name):
+ assert name[-1] == 's'
+ items = {}
+ self.element_start(name)
+ while self.token.type == XML_ELEMENT_START:
+ id, values = self.parse_item(name[:-1])
+ assert id not in items
+ items[id] = values
+ self.element_end(name)
+ return items
+
+ def parse_item(self, name):
+ attrs = self.element_start(name)
+ id = int(attrs['id'])
+ values = self.parse_values()
+ self.element_end(name)
+ return id, values
+
+ def parse_values(self):
+ values = {}
+ while self.token.type == XML_ELEMENT_START:
+ name = self.token.name_or_data
+ value = self.parse_value(name)
+ assert name not in values
+ values[name] = value
+ return values
+
+ def parse_value(self, tag):
+ self.element_start(tag)
+ value = self.character_data()
+ self.element_end(tag)
+ if value.isdigit():
+ return int(value)
+ if value.startswith('"') and value.endswith('"'):
+ return value[1:-1]
+ return value
+
+ def build_profile(self, objects, nodes):
+ profile = Profile()
+
+ profile[SAMPLES] = 0
+ for id, object in objects.iteritems():
+ # Ignore fake objects (process names, modules, "Everything", "kernel", etc.)
+ if object['self'] == 0:
+ continue
+
+ function = Function(id, object['name'])
+ function[SAMPLES] = object['self']
+ profile.add_function(function)
+ profile[SAMPLES] += function[SAMPLES]
+
+ for id, node in nodes.iteritems():
+ # Ignore fake calls
+ if node['self'] == 0:
+ continue
+
+ # Find a non-ignored parent
+ parent_id = node['parent']
+ while parent_id != 0:
+ parent = nodes[parent_id]
+ caller_id = parent['object']
+ if objects[caller_id]['self'] != 0:
+ break
+ parent_id = parent['parent']
+ if parent_id == 0:
+ continue
+
+ callee_id = node['object']
+
+ assert objects[caller_id]['self']
+ assert objects[callee_id]['self']
+
+ function = profile.functions[caller_id]
+
+ samples = node['self']
+ try:
+ call = function.calls[callee_id]
+ except KeyError:
+ call = Call(callee_id)
+ call[SAMPLES2] = samples
+ function.add_call(call)
+ else:
+ call[SAMPLES2] += samples
+
+ # Compute derived events
+ profile.validate()
+ profile.find_cycles()
+ profile.ratio(TIME_RATIO, SAMPLES)
+ profile.call_ratios(SAMPLES2)
+ profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return profile
+
+
+class SharkParser(LineParser):
+ """Parser for MacOSX Shark output.
+
+ Author: tom at dbservice.com
+ """
+
+ def __init__(self, infile):
+ LineParser.__init__(self, infile)
+ self.stack = []
+ self.entries = {}
+
+ def add_entry(self, function):
+ try:
+ entry = self.entries[function.id]
+ except KeyError:
+ self.entries[function.id] = (function, { })
+ else:
+ function_total, callees_total = entry
+ function_total.samples += function.samples
+
+ def add_callee(self, function, callee):
+ func, callees = self.entries[function.id]
+ try:
+ entry = callees[callee.id]
+ except KeyError:
+ callees[callee.id] = callee
+ else:
+ entry.samples += callee.samples
+
+ def parse(self):
+ self.readline()
+ self.readline()
+ self.readline()
+ self.readline()
+
+ match = re.compile(r'(?P<prefix>[|+ ]*)(?P<samples>\d+), (?P<symbol>[^,]+), (?P<image>.*)')
+
+ while self.lookahead():
+ line = self.consume()
+ mo = match.match(line)
+ if not mo:
+ raise ParseError('failed to parse', line)
+
+ fields = mo.groupdict()
+ prefix = len(fields.get('prefix', 0)) / 2 - 1
+
+ symbol = str(fields.get('symbol', 0))
+ image = str(fields.get('image', 0))
+
+ entry = Struct()
+ entry.id = ':'.join([symbol, image])
+ entry.samples = int(fields.get('samples', 0))
+
+ entry.name = symbol
+ entry.image = image
+
+ # adjust the callstack
+ if prefix < len(self.stack):
+ del self.stack[prefix:]
+
+ if prefix == len(self.stack):
+ self.stack.append(entry)
+
+ # if the callstack has had an entry, it's this functions caller
+ if prefix > 0:
+ self.add_callee(self.stack[prefix - 1], entry)
+
+ self.add_entry(entry)
+
+ profile = Profile()
+ profile[SAMPLES] = 0
+ for _function, _callees in self.entries.itervalues():
+ function = Function(_function.id, _function.name)
+ function[SAMPLES] = _function.samples
+ profile.add_function(function)
+ profile[SAMPLES] += _function.samples
+
+ if _function.image:
+ function.module = os.path.basename(_function.image)
+
+ for _callee in _callees.itervalues():
+ call = Call(_callee.id)
+ call[SAMPLES] = _callee.samples
+ function.add_call(call)
+
+ # compute derived data
+ profile.validate()
+ profile.find_cycles()
+ profile.ratio(TIME_RATIO, SAMPLES)
+ profile.call_ratios(SAMPLES)
+ profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return profile
+
+
+class XPerfParser(Parser):
+ """Parser for CSVs generted by XPerf, from Microsoft Windows Performance Tools.
+ """
+
+ def __init__(self, stream):
+ Parser.__init__(self)
+ self.stream = stream
+ self.profile = Profile()
+ self.profile[SAMPLES] = 0
+ self.column = {}
+
+ def parse(self):
+ import csv
+ reader = csv.reader(
+ self.stream,
+ delimiter = ',',
+ quotechar = None,
+ escapechar = None,
+ doublequote = False,
+ skipinitialspace = True,
+ lineterminator = '\r\n',
+ quoting = csv.QUOTE_NONE)
+ it = iter(reader)
+ row = reader.next()
+ self.parse_header(row)
+ for row in it:
+ self.parse_row(row)
+
+ # compute derived data
+ self.profile.validate()
+ self.profile.find_cycles()
+ self.profile.ratio(TIME_RATIO, SAMPLES)
+ self.profile.call_ratios(SAMPLES2)
+ self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return self.profile
+
+ def parse_header(self, row):
+ for column in range(len(row)):
+ name = row[column]
+ assert name not in self.column
+ self.column[name] = column
+
+ def parse_row(self, row):
+ fields = {}
+ for name, column in self.column.iteritems():
+ value = row[column]
+ for factory in int, float:
+ try:
+ value = factory(value)
+ except ValueError:
+ pass
+ else:
+ break
+ fields[name] = value
+
+ process = fields['Process Name']
+ symbol = fields['Module'] + '!' + fields['Function']
+ weight = fields['Weight']
+ count = fields['Count']
+
+ function = self.get_function(process, symbol)
+ function[SAMPLES] += weight * count
+ self.profile[SAMPLES] += weight * count
+
+ stack = fields['Stack']
+ if stack != '?':
+ stack = stack.split('/')
+ assert stack[0] == '[Root]'
+ if stack[-1] != symbol:
+ # XXX: some cases the sampled function does not appear in the stack
+ stack.append(symbol)
+ caller = None
+ for symbol in stack[1:]:
+ callee = self.get_function(process, symbol)
+ if caller is not None:
+ try:
+ call = caller.calls[callee.id]
+ except KeyError:
+ call = Call(callee.id)
+ call[SAMPLES2] = count
+ caller.add_call(call)
+ else:
+ call[SAMPLES2] += count
+ caller = callee
+
+ def get_function(self, process, symbol):
+ function_id = process + '!' + symbol
+
+ try:
+ function = self.profile.functions[function_id]
+ except KeyError:
+ module, name = symbol.split('!', 1)
+ function = Function(function_id, name)
+ function.process = process
+ function.module = module
+ function[SAMPLES] = 0
+ self.profile.add_function(function)
+
+ return function
+
+
+class SleepyParser(Parser):
+ """Parser for GNU gprof output.
+
+ See also:
+ - http://www.codersnotes.com/sleepy/
+ - http://sleepygraph.sourceforge.net/
+ """
+
+ def __init__(self, filename):
+ Parser.__init__(self)
+
+ from zipfile import ZipFile
+
+ self.database = ZipFile(filename)
+
+ self.symbols = {}
+ self.calls = {}
+
+ self.profile = Profile()
+
+ _symbol_re = re.compile(
+ r'^(?P<id>\w+)' +
+ r'\s+"(?P<module>[^"]*)"' +
+ r'\s+"(?P<procname>[^"]*)"' +
+ r'\s+"(?P<sourcefile>[^"]*)"' +
+ r'\s+(?P<sourceline>\d+)$'
+ )
+
+ def parse_symbols(self):
+ lines = self.database.read('symbols.txt').splitlines()
+ for line in lines:
+ mo = self._symbol_re.match(line)
+ if mo:
+ symbol_id, module, procname, sourcefile, sourceline = mo.groups()
+
+ function_id = ':'.join([module, procname])
+
+ try:
+ function = self.profile.functions[function_id]
+ except KeyError:
+ function = Function(function_id, procname)
+ function.module = module
+ function[SAMPLES] = 0
+ self.profile.add_function(function)
+
+ self.symbols[symbol_id] = function
+
+ def parse_callstacks(self):
+ lines = self.database.read("callstacks.txt").splitlines()
+ for line in lines:
+ fields = line.split()
+ samples = int(fields[0])
+ callstack = fields[1:]
+
+ callstack = [self.symbols[symbol_id] for symbol_id in callstack]
+
+ callee = callstack[0]
+
+ callee[SAMPLES] += samples
+ self.profile[SAMPLES] += samples
+
+ for caller in callstack[1:]:
+ try:
+ call = caller.calls[callee.id]
+ except KeyError:
+ call = Call(callee.id)
+ call[SAMPLES2] = samples
+ caller.add_call(call)
+ else:
+ call[SAMPLES2] += samples
+
+ callee = caller
+
+ def parse(self):
+ profile = self.profile
+ profile[SAMPLES] = 0
+
+ self.parse_symbols()
+ self.parse_callstacks()
+
+ # Compute derived events
+ profile.validate()
+ profile.find_cycles()
+ profile.ratio(TIME_RATIO, SAMPLES)
+ profile.call_ratios(SAMPLES2)
+ profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO)
+
+ return profile
+
+
+class AQtimeTable:
+
+ def __init__(self, name, fields):
+ self.name = name
+
+ self.fields = fields
+ self.field_column = {}
+ for column in range(len(fields)):
+ self.field_column[fields[column]] = column
+ self.rows = []
+
+ def __len__(self):
+ return len(self.rows)
+
+ def __iter__(self):
+ for values, children in self.rows:
+ fields = {}
+ for name, value in zip(self.fields, values):
+ fields[name] = value
+ children = dict([(child.name, child) for child in children])
+ yield fields, children
+ raise StopIteration
+
+ def add_row(self, values, children=()):
+ self.rows.append((values, children))
+
+
+class AQtimeParser(XmlParser):
+
+ def __init__(self, stream):
+ XmlParser.__init__(self, stream)
+ self.tables = {}
+
+ def parse(self):
+ self.element_start('AQtime_Results')
+ self.parse_headers()
+ results = self.parse_results()
+ self.element_end('AQtime_Results')
+ return self.build_profile(results)
+
+ def parse_headers(self):
+ self.element_start('HEADERS')
+ while self.token.type == XML_ELEMENT_START:
+ self.parse_table_header()
+ self.element_end('HEADERS')
+
+ def parse_table_header(self):
+ attrs = self.element_start('TABLE_HEADER')
+ name = attrs['NAME']
+ id = int(attrs['ID'])
+ field_types = []
+ field_names = []
+ while self.token.type == XML_ELEMENT_START:
+ field_type, field_name = self.parse_table_field()
+ field_types.append(field_type)
+ field_names.append(field_name)
+ self.element_end('TABLE_HEADER')
+ self.tables[id] = name, field_types, field_names
+
+ def parse_table_field(self):
+ attrs = self.element_start('TABLE_FIELD')
+ type = attrs['TYPE']
+ name = self.character_data()
+ self.element_end('TABLE_FIELD')
+ return type, name
+
+ def parse_results(self):
+ self.element_start('RESULTS')
+ table = self.parse_data()
+ self.element_end('RESULTS')
+ return table
+
+ def parse_data(self):
+ rows = []
+ attrs = self.element_start('DATA')
+ table_id = int(attrs['TABLE_ID'])
+ table_name, field_types, field_names = self.tables[table_id]
+ table = AQtimeTable(table_name, field_names)
+ while self.token.type == XML_ELEMENT_START:
+ row, children = self.parse_row(field_types)
+ table.add_row(row, children)
+ self.element_end('DATA')
+ return table
+
+ def parse_row(self, field_types):
+ row = [None]*len(field_types)
+ children = []
+ self.element_start('ROW')
+ while self.token.type == XML_ELEMENT_START:
+ if self.token.name_or_data == 'FIELD':
+ field_id, field_value = self.parse_field(field_types)
+ row[field_id] = field_value
+ elif self.token.name_or_data == 'CHILDREN':
+ children = self.parse_children()
+ else:
+ raise XmlTokenMismatch("<FIELD ...> or <CHILDREN ...>", self.token)
+ self.element_end('ROW')
+ return row, children
+
+ def parse_field(self, field_types):
+ attrs = self.element_start('FIELD')
+ id = int(attrs['ID'])
+ type = field_types[id]
+ value = self.character_data()
+ if type == 'Integer':
+ value = int(value)
+ elif type == 'Float':
+ value = float(value)
+ elif type == 'Address':
+ value = int(value)
+ elif type == 'String':
+ pass
+ else:
+ assert False
+ self.element_end('FIELD')
+ return id, value
+
+ def parse_children(self):
+ children = []
+ self.element_start('CHILDREN')
+ while self.token.type == XML_ELEMENT_START:
+ table = self.parse_data()
+ assert table.name not in children
+ children.append(table)
+ self.element_end('CHILDREN')
+ return children
+
+ def build_profile(self, results):
+ assert results.name == 'Routines'
+ profile = Profile()
+ profile[TIME] = 0.0
+ for fields, tables in results:
+ function = self.build_function(fields)
+ children = tables['Children']
+ for fields, _ in children:
+ call = self.build_call(fields)
+ function.add_call(call)
+ profile.add_function(function)
+ profile[TIME] = profile[TIME] + function[TIME]
+ profile[TOTAL_TIME] = profile[TIME]
+ profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+ return profile
+
+ def build_function(self, fields):
+ function = Function(self.build_id(fields), self.build_name(fields))
+ function[TIME] = fields['Time']
+ function[TOTAL_TIME] = fields['Time with Children']
+ #function[TIME_RATIO] = fields['% Time']/100.0
+ #function[TOTAL_TIME_RATIO] = fields['% with Children']/100.0
+ return function
+
+ def build_call(self, fields):
+ call = Call(self.build_id(fields))
+ call[TIME] = fields['Time']
+ call[TOTAL_TIME] = fields['Time with Children']
+ #call[TIME_RATIO] = fields['% Time']/100.0
+ #call[TOTAL_TIME_RATIO] = fields['% with Children']/100.0
+ return call
+
+ def build_id(self, fields):
+ return ':'.join([fields['Module Name'], fields['Unit Name'], fields['Routine Name']])
+
+ def build_name(self, fields):
+ # TODO: use more fields
+ return fields['Routine Name']
+
+
+class PstatsParser:
+ """Parser python profiling statistics saved with te pstats module."""
+
+ def __init__(self, *filename):
+ import pstats
+ try:
+ self.stats = pstats.Stats(*filename)
+ except ValueError:
+ import hotshot.stats
+ self.stats = hotshot.stats.load(filename[0])
+ self.profile = Profile()
+ self.function_ids = {}
+
+ def get_function_name(self, (filename, line, name)):
+ module = os.path.splitext(filename)[0]
+ module = os.path.basename(module)
+ return "%s:%d:%s" % (module, line, name)
+
+ def get_function(self, key):
+ try:
+ id = self.function_ids[key]
+ except KeyError:
+ id = len(self.function_ids)
+ name = self.get_function_name(key)
+ function = Function(id, name)
+ self.profile.functions[id] = function
+ self.function_ids[key] = id
+ else:
+ function = self.profile.functions[id]
+ return function
+
+ def parse(self):
+ self.profile[TIME] = 0.0
+ self.profile[TOTAL_TIME] = self.stats.total_tt
+ for fn, (cc, nc, tt, ct, callers) in self.stats.stats.iteritems():
+ callee = self.get_function(fn)
+ callee.called = nc
+ callee[TOTAL_TIME] = ct
+ callee[TIME] = tt
+ self.profile[TIME] += tt
+ self.profile[TOTAL_TIME] = max(self.profile[TOTAL_TIME], ct)
+ for fn, value in callers.iteritems():
+ caller = self.get_function(fn)
+ call = Call(callee.id)
+ if isinstance(value, tuple):
+ for i in xrange(0, len(value), 4):
+ nc, cc, tt, ct = value[i:i+4]
+ if CALLS in call:
+ call[CALLS] += cc
+ else:
+ call[CALLS] = cc
+
+ if TOTAL_TIME in call:
+ call[TOTAL_TIME] += ct
+ else:
+ call[TOTAL_TIME] = ct
+
+ else:
+ call[CALLS] = value
+ call[TOTAL_TIME] = ratio(value, nc)*ct
+
+ caller.add_call(call)
+ #self.stats.print_stats()
+ #self.stats.print_callees()
+
+ # Compute derived events
+ self.profile.validate()
+ self.profile.ratio(TIME_RATIO, TIME)
+ self.profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME)
+
+ return self.profile
+
+
+class Theme:
+
+ def __init__(self,
+ bgcolor = (0.0, 0.0, 1.0),
+ mincolor = (0.0, 0.0, 0.0),
+ maxcolor = (0.0, 0.0, 1.0),
+ fontname = "Arial",
+ minfontsize = 10.0,
+ maxfontsize = 10.0,
+ minpenwidth = 0.5,
+ maxpenwidth = 4.0,
+ gamma = 2.2,
+ skew = 1.0):
+ self.bgcolor = bgcolor
+ self.mincolor = mincolor
+ self.maxcolor = maxcolor
+ self.fontname = fontname
+ self.minfontsize = minfontsize
+ self.maxfontsize = maxfontsize
+ self.minpenwidth = minpenwidth
+ self.maxpenwidth = maxpenwidth
+ self.gamma = gamma
+ self.skew = skew
+
+ def graph_bgcolor(self):
+ return self.hsl_to_rgb(*self.bgcolor)
+
+ def graph_fontname(self):
+ return self.fontname
+
+ def graph_fontsize(self):
+ return self.minfontsize
+
+ def node_bgcolor(self, weight):
+ return self.color(weight)
+
+ def node_fgcolor(self, weight):
+ return self.graph_bgcolor()
+
+ def node_fontsize(self, weight):
+ return self.fontsize(weight)
+
+ def edge_color(self, weight):
+ return self.color(weight)
+
+ def edge_fontsize(self, weight):
+ return self.fontsize(weight)
+
+ def edge_penwidth(self, weight):
+ return max(weight*self.maxpenwidth, self.minpenwidth)
+
+ def edge_arrowsize(self, weight):
+ return 0.5 * math.sqrt(self.edge_penwidth(weight))
+
+ def fontsize(self, weight):
+ return max(weight**2 * self.maxfontsize, self.minfontsize)
+
+ def color(self, weight):
+ weight = min(max(weight, 0.0), 1.0)
+
+ hmin, smin, lmin = self.mincolor
+ hmax, smax, lmax = self.maxcolor
+
+ if self.skew < 0:
+ raise ValueError("Skew must be greater than 0")
+ elif self.skew == 1.0:
+ h = hmin + weight*(hmax - hmin)
+ s = smin + weight*(smax - smin)
+ l = lmin + weight*(lmax - lmin)
+ else:
+ base = self.skew
+ h = hmin + ((hmax-hmin)*(-1.0 + (base ** weight)) / (base - 1.0))
+ s = smin + ((smax-smin)*(-1.0 + (base ** weight)) / (base - 1.0))
+ l = lmin + ((lmax-lmin)*(-1.0 + (base ** weight)) / (base - 1.0))
+
+ return self.hsl_to_rgb(h, s, l)
+
+ def hsl_to_rgb(self, h, s, l):
+ """Convert a color from HSL color-model to RGB.
+
+ See also:
+ - http://www.w3.org/TR/css3-color/#hsl-color
+ """
+
+ h = h % 1.0
+ s = min(max(s, 0.0), 1.0)
+ l = min(max(l, 0.0), 1.0)
+
+ if l <= 0.5:
+ m2 = l*(s + 1.0)
+ else:
+ m2 = l + s - l*s
+ m1 = l*2.0 - m2
+ r = self._hue_to_rgb(m1, m2, h + 1.0/3.0)
+ g = self._hue_to_rgb(m1, m2, h)
+ b = self._hue_to_rgb(m1, m2, h - 1.0/3.0)
+
+ # Apply gamma correction
+ r **= self.gamma
+ g **= self.gamma
+ b **= self.gamma
+
+ return (r, g, b)
+
+ def _hue_to_rgb(self, m1, m2, h):
+ if h < 0.0:
+ h += 1.0
+ elif h > 1.0:
+ h -= 1.0
+ if h*6 < 1.0:
+ return m1 + (m2 - m1)*h*6.0
+ elif h*2 < 1.0:
+ return m2
+ elif h*3 < 2.0:
+ return m1 + (m2 - m1)*(2.0/3.0 - h)*6.0
+ else:
+ return m1
+
+
+TEMPERATURE_COLORMAP = Theme(
+ mincolor = (2.0/3.0, 0.80, 0.25), # dark blue
+ maxcolor = (0.0, 1.0, 0.5), # satured red
+ gamma = 1.0
+)
+
+PINK_COLORMAP = Theme(
+ mincolor = (0.0, 1.0, 0.90), # pink
+ maxcolor = (0.0, 1.0, 0.5), # satured red
+)
+
+GRAY_COLORMAP = Theme(
+ mincolor = (0.0, 0.0, 0.85), # light gray
+ maxcolor = (0.0, 0.0, 0.0), # black
+)
+
+BW_COLORMAP = Theme(
+ minfontsize = 8.0,
+ maxfontsize = 24.0,
+ mincolor = (0.0, 0.0, 0.0), # black
+ maxcolor = (0.0, 0.0, 0.0), # black
+ minpenwidth = 0.1,
+ maxpenwidth = 8.0,
+)
+
+
+class DotWriter:
+ """Writer for the DOT language.
+
+ See also:
+ - "The DOT Language" specification
+ http://www.graphviz.org/doc/info/lang.html
+ """
+
+ def __init__(self, fp):
+ self.fp = fp
+
+ def graph(self, profile, theme):
+ self.begin_graph()
+
+ fontname = theme.graph_fontname()
+
+ self.attr('graph', fontname=fontname, ranksep=0.25, nodesep=0.125)
+ self.attr('node', fontname=fontname, shape="box", style="filled", fontcolor="white", width=0, height=0)
+ self.attr('edge', fontname=fontname)
+
+ for function in profile.functions.itervalues():
+ labels = []
+ if function.process is not None:
+ labels.append(function.process)
+ if function.module is not None:
+ labels.append(function.module)
+ labels.append(function.name)
+ for event in TOTAL_TIME_RATIO, TIME_RATIO:
+ if event in function.events:
+ label = event.format(function[event])
+ labels.append(label)
+ if function.called is not None:
+ labels.append(u"%u\xd7" % (function.called,))
+
+ if function.weight is not None:
+ weight = function.weight
+ else:
+ weight = 0.0
+
+ label = '\n'.join(labels)
+ self.node(function.id,
+ label = label,
+ color = self.color(theme.node_bgcolor(weight)),
+ fontcolor = self.color(theme.node_fgcolor(weight)),
+ fontsize = "%.2f" % theme.node_fontsize(weight),
+ )
+
+ for call in function.calls.itervalues():
+ callee = profile.functions[call.callee_id]
+
+ labels = []
+ for event in TOTAL_TIME_RATIO, CALLS:
+ if event in call.events:
+ label = event.format(call[event])
+ labels.append(label)
+
+ if call.weight is not None:
+ weight = call.weight
+ elif callee.weight is not None:
+ weight = callee.weight
+ else:
+ weight = 0.0
+
+ label = '\n'.join(labels)
+
+ self.edge(function.id, call.callee_id,
+ label = label,
+ color = self.color(theme.edge_color(weight)),
+ fontcolor = self.color(theme.edge_color(weight)),
+ fontsize = "%.2f" % theme.edge_fontsize(weight),
+ penwidth = "%.2f" % theme.edge_penwidth(weight),
+ labeldistance = "%.2f" % theme.edge_penwidth(weight),
+ arrowsize = "%.2f" % theme.edge_arrowsize(weight),
+ )
+
+ self.end_graph()
+
+ def begin_graph(self):
+ self.write('digraph {\n')
+
+ def end_graph(self):
+ self.write('}\n')
+
+ def attr(self, what, **attrs):
+ self.write("\t")
+ self.write(what)
+ self.attr_list(attrs)
+ self.write(";\n")
+
+ def node(self, node, **attrs):
+ self.write("\t")
+ self.id(node)
+ self.attr_list(attrs)
+ self.write(";\n")
+
+ def edge(self, src, dst, **attrs):
+ self.write("\t")
+ self.id(src)
+ self.write(" -> ")
+ self.id(dst)
+ self.attr_list(attrs)
+ self.write(";\n")
+
+ def attr_list(self, attrs):
+ if not attrs:
+ return
+ self.write(' [')
+ first = True
+ for name, value in attrs.iteritems():
+ if first:
+ first = False
+ else:
+ self.write(", ")
+ self.id(name)
+ self.write('=')
+ self.id(value)
+ self.write(']')
+
+ def id(self, id):
+ if isinstance(id, (int, float)):
+ s = str(id)
+ elif isinstance(id, basestring):
+ if id.isalnum() and not id.startswith('0x'):
+ s = id
+ else:
+ s = self.escape(id)
+ else:
+ raise TypeError
+ self.write(s)
+
+ def color(self, (r, g, b)):
+
+ def float2int(f):
+ if f <= 0.0:
+ return 0
+ if f >= 1.0:
+ return 255
+ return int(255.0*f + 0.5)
+
+ return "#" + "".join(["%02x" % float2int(c) for c in (r, g, b)])
+
+ def escape(self, s):
+ s = s.encode('utf-8')
+ s = s.replace('\\', r'\\')
+ s = s.replace('\n', r'\n')
+ s = s.replace('\t', r'\t')
+ s = s.replace('"', r'\"')
+ return '"' + s + '"'
+
+ def write(self, s):
+ self.fp.write(s)
+
+
+class Main:
+ """Main program."""
+
+ themes = {
+ "color": TEMPERATURE_COLORMAP,
+ "pink": PINK_COLORMAP,
+ "gray": GRAY_COLORMAP,
+ "bw": BW_COLORMAP,
+ }
+
+ def main(self):
+ """Main program."""
+
+ parser = optparse.OptionParser(
+ usage="\n\t%prog [options] [file] ...",
+ version="%%prog %s" % __version__)
+ parser.add_option(
+ '-o', '--output', metavar='FILE',
+ type="string", dest="output",
+ help="output filename [stdout]")
+ parser.add_option(
+ '-n', '--node-thres', metavar='PERCENTAGE',
+ type="float", dest="node_thres", default=0.5,
+ help="eliminate nodes below this threshold [default: %default]")
+ parser.add_option(
+ '-e', '--edge-thres', metavar='PERCENTAGE',
+ type="float", dest="edge_thres", default=0.1,
+ help="eliminate edges below this threshold [default: %default]")
+ parser.add_option(
+ '-f', '--format',
+ type="choice", choices=('prof', 'callgrind', 'oprofile', 'hprof', 'sysprof', 'pstats', 'shark', 'sleepy', 'aqtime', 'xperf'),
+ dest="format", default="prof",
+ help="profile format: prof, callgrind, oprofile, hprof, sysprof, shark, sleepy, aqtime, pstats, or xperf [default: %default]")
+ parser.add_option(
+ '-c', '--colormap',
+ type="choice", choices=('color', 'pink', 'gray', 'bw'),
+ dest="theme", default="color",
+ help="color map: color, pink, gray, or bw [default: %default]")
+ parser.add_option(
+ '-s', '--strip',
+ action="store_true",
+ dest="strip", default=False,
+ help="strip function parameters, template parameters, and const modifiers from demangled C++ function names")
+ parser.add_option(
+ '-w', '--wrap',
+ action="store_true",
+ dest="wrap", default=False,
+ help="wrap function names")
+ # add a new option to control skew of the colorization curve
+ parser.add_option(
+ '--skew',
+ type="float", dest="theme_skew", default=1.0,
+ help="skew the colorization curve. Values < 1.0 give more variety to lower percentages. Value > 1.0 give less variety to lower percentages")
+ (self.options, self.args) = parser.parse_args(sys.argv[1:])
+
+ if len(self.args) > 1 and self.options.format != 'pstats':
+ parser.error('incorrect number of arguments')
+
+ try:
+ self.theme = self.themes[self.options.theme]
+ except KeyError:
+ parser.error('invalid colormap \'%s\'' % self.options.theme)
+
+ # set skew on the theme now that it has been picked.
+ if self.options.theme_skew:
+ self.theme.skew = self.options.theme_skew
+
+ if self.options.format == 'prof':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = GprofParser(fp)
+ elif self.options.format == 'callgrind':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = CallgrindParser(fp)
+ elif self.options.format == 'oprofile':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = OprofileParser(fp)
+ elif self.options.format == 'sysprof':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = SysprofParser(fp)
+ elif self.options.format == 'hprof':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = HProfParser(fp)
+ elif self.options.format == 'pstats':
+ if not self.args:
+ parser.error('at least a file must be specified for pstats input')
+ parser = PstatsParser(*self.args)
+ elif self.options.format == 'xperf':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = XPerfParser(fp)
+ elif self.options.format == 'shark':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = SharkParser(fp)
+ elif self.options.format == 'sleepy':
+ if len(self.args) != 1:
+ parser.error('exactly one file must be specified for sleepy input')
+ parser = SleepyParser(self.args[0])
+ elif self.options.format == 'aqtime':
+ if not self.args:
+ fp = sys.stdin
+ else:
+ fp = open(self.args[0], 'rt')
+ parser = AQtimeParser(fp)
+ else:
+ parser.error('invalid format \'%s\'' % self.options.format)
+
+ self.profile = parser.parse()
+
+ if self.options.output is None:
+ self.output = sys.stdout
+ else:
+ self.output = open(self.options.output, 'wt')
+
+ self.write_graph()
+
+ _parenthesis_re = re.compile(r'\([^()]*\)')
+ _angles_re = re.compile(r'<[^<>]*>')
+ _const_re = re.compile(r'\s+const$')
+
+ def strip_function_name(self, name):
+ """Remove extraneous information from C++ demangled function names."""
+
+ # Strip function parameters from name by recursively removing paired parenthesis
+ while True:
+ name, n = self._parenthesis_re.subn('', name)
+ if not n:
+ break
+
+ # Strip const qualifier
+ name = self._const_re.sub('', name)
+
+ # Strip template parameters from name by recursively removing paired angles
+ while True:
+ name, n = self._angles_re.subn('', name)
+ if not n:
+ break
+
+ return name
+
+ def wrap_function_name(self, name):
+ """Split the function name on multiple lines."""
+
+ if len(name) > 32:
+ ratio = 2.0/3.0
+ height = max(int(len(name)/(1.0 - ratio) + 0.5), 1)
+ width = max(len(name)/height, 32)
+ # TODO: break lines in symbols
+ name = textwrap.fill(name, width, break_long_words=False)
+
+ # Take away spaces
+ name = name.replace(", ", ",")
+ name = name.replace("> >", ">>")
+ name = name.replace("> >", ">>") # catch consecutive
+
+ return name
+
+ def compress_function_name(self, name):
+ """Compress function name according to the user preferences."""
+
+ if self.options.strip:
+ name = self.strip_function_name(name)
+
+ if self.options.wrap:
+ name = self.wrap_function_name(name)
+
+ # TODO: merge functions with same resulting name
+
+ return name
+
+ def write_graph(self):
+ dot = DotWriter(self.output)
+ profile = self.profile
+ profile.prune(self.options.node_thres/100.0, self.options.edge_thres/100.0)
+
+ for function in profile.functions.itervalues():
+ function.name = self.compress_function_name(function.name)
+
+ dot.graph(profile, self.theme)
+
+
+if __name__ == '__main__':
+ Main().main()
diff --git a/build/increment-release.sh b/build/increment-release.sh
new file mode 100755
index 0000000..153c0d6
--- /dev/null
+++ b/build/increment-release.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# capture input
+VERSION=$1
+
+# split the version into separate integers
+SPLIT_VERS="$(echo $VERSION | tr '.' ' ')"
+
+inc-version ()
+{
+ local MAJ=$1
+ local MIN=$2
+ local REL=$(expr $3 + 1)
+
+ echo "$MAJ.$MIN.$REL"
+}
+
+# rewrite the version
+inc-version $SPLIT_VERS
+
diff --git a/build/ld.linux.cmn.sh b/build/ld.linux.cmn.sh
new file mode 100644
index 0000000..0751b72
--- /dev/null
+++ b/build/ld.linux.cmn.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+ MAJ=$1
+ MIN=$2
+ REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+ _lib="lib$1"
+ _dirs="$2"
+
+ LIBPATH=''
+
+ while [ "$_dirs" != "" ]
+ do
+ _dir="${_dirs%%:*}"
+
+ if [ "$_dir" != "" ]
+ then
+ if [ -e "$_dir/$_lib" ]
+ then
+ while [ -L "$_dir/$_lib" ]
+ do
+ _lib=$(readlink -n "$_dir/$_lib")
+ done
+ LIBPATH="$_dir/$_lib"
+ break;
+ fi
+ fi
+
+ _dirs="${_dirs#$_dir}"
+ _dirs="${_dirs#:}"
+ done
+}
+
+# setting state
+load-static ()
+{
+ if [ $LD_STATIC_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_STATIC"
+ LD_STATIC_STATE=1
+ fi
+}
+
+load-dynamic ()
+{
+ if [ $LD_STATIC_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_DYNAMIC"
+ LD_STATIC_STATE=0
+ fi
+}
+
+load-all-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_ALL_SYMBOLS"
+ LD_ALL_STATE=1
+ fi
+}
+
+load-ref-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_REF_SYMBOLS"
+ LD_ALL_STATE=0
+ fi
+}
diff --git a/build/ld.linux.dlib.sh b/build/ld.linux.dlib.sh
new file mode 100755
index 0000000..1831601
--- /dev/null
+++ b/build/ld.linux.dlib.sh
@@ -0,0 +1,311 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : require shared
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+ source "${0%dlib.sh}gcc.sh"
+ ;;
+i*)
+ source "${0%dlib.sh}icc.sh"
+ ;;
+ *)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS"
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create dynamic lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ # update LD_LIBRARY_PATH
+ unset LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -ldl|-ddl)
+
+ # always load libdl as shared library
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -ldl"
+ ;;
+
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ if [ $STATICSYSLIBS -eq 1 ]
+ then
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to static
+ load-static
+ load-all-symbols
+ ;;
+
+ *)
+ # set load to dynamic
+ load-ref-symbols
+ load-dynamic
+ ;;
+
+ esac
+ else
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+ then
+ # set load to static
+ load-static
+ load-all-symbols
+ else
+
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to dynamic
+ load-ref-symbols
+ load-dynamic
+ ;;
+
+ *)
+ # set load to static
+ load-static
+ load-all-symbols
+ ;;
+ esac
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -d*)
+
+ # only dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+ CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if grep -q HAVE_XML2 ${BUILD_DIR}/Makefile.config.linux.$ARCH > /dev/null
+then
+ if [ $HAVE_XML -ne 0 ]
+ then
+ CMD="$CMD -lxml2"
+ fi
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+ CMD="$CMD -lm"
+fi
+
+# produce shared library
+echo "$CMD"
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+ SCM_DIR="${BUILD_DIR%/*}/scm"
+ LOGFILE="$SCM_DIR/scm.log"
+ MSG=">>>>> scm: calling the collect script from ld.linux.dlib.sh <<<<<<"
+ #echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+
+ "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
\ No newline at end of file
diff --git a/build/ld.linux.exe.sh b/build/ld.linux.exe.sh
new file mode 100755
index 0000000..e8b7580
--- /dev/null
+++ b/build/ld.linux.exe.sh
@@ -0,0 +1,341 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : ignore - will be dynamically loaded
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+g*)
+ source "${0%exe.sh}gcc.sh"
+ ;;
+i*)
+ source "${0%exe.sh}icc.sh"
+ ;;
+*)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+if [ $STATIC -eq 1 ]
+then
+ CMD="$EXE_STATIC_CMD $LDFLAGS"
+else
+ CMD="$EXE_CMD $LDFLAGS"
+fi
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+# CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+ CMD="$CMD $LD_EXPORT_GLOBAL"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create executable
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $VERSFILE"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ # update LD_LIBRARY_PATH
+ unset LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -ldl|-ddl)
+
+ # always load libdl as shared library
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -ldl"
+ ;;
+
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load dynamic
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ # do not need to load all symbols for external libs
+ [ $STATIC -eq 1 ] && load-ref-symbols
+
+ if [ $STATICSYSLIBS -eq 1 ]
+ then
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to static
+ load-static
+ ;;
+
+ *)
+ # set load to dynamic
+ load-dynamic
+ ;;
+
+ esac
+ else
+ # set load to normal
+ load-dynamic
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ # do not need to load all symbols for external libs
+ [ $STATIC -eq 1 ] && load-ref-symbols
+
+ if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+ then
+
+ # set load to static
+ load-static
+
+ else
+
+ # special case for libs we have in "ext"
+ # that are sometimes requested as static
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to dynamic
+ load-dynamic
+ ;;
+ *)
+ load-static
+ ;;
+ esac
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -d*)
+
+ FOUND=0
+ if [ $STATIC -eq 1 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ load-static
+ load-all-symbols
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ fi
+ ;;
+
+
+ esac
+
+ done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+ CMD="$CMD -lpthread"
+fi
+
+# add in xml
+if grep -q HAVE_XML2 ${BUILD_DIR}/Makefile.config.linux.$ARCH > /dev/null
+then
+ if grep -q XML2_LIBDIR ${BUILD_DIR}/Makefile.config.linux.$ARCH > /dev/null
+ then
+ if grep -q 'OS_DISTRIBUTOR = Ubuntu' ${BUILD_DIR}/Makefile.config.linux.$ARCH > /dev/null
+ then
+ ##### Do not link libxml2 statically on Ubuntu: it does not compile
+ XMLLIBDIR="-L$(grep XML2_LIBDIR ${BUILD_DIR}/Makefile.config.linux.$ARCH | perl -e'while(<>){if(/XML2_LIBDIR = (.+)/){print $1}}')"
+ else
+ ##### Link libxml2 statically on all linux-es except Ubuntu
+ XMLLIBDIR="-Wl,-Bstatic -L$(grep XML2_LIBDIR ${BUILD_DIR}/Makefile.config.linux.$ARCH | perl -e'while(<>){if(/XML2_LIBDIR = (.+)/){print $1}}')"
+ fi
+ fi
+ if [ $HAVE_XML -ne 0 ]
+ then
+ CMD="$CMD $XMLLIBDIR -lxml2"
+ fi
+fi
+
+# add in math library
+if [ $HAVE_M -ne 0 ]
+then
+ CMD="$CMD -Wl,-Bdynamic -lm"
+fi
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+ SCM_DIR="${BUILD_DIR%/*}/scm"
+ LOGFILE="$SCM_DIR/scm.log"
+ MSG=">>>>> scm: calling the collect script from ld.linux.exe.sh <<<<<<"
+ #echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+
+ "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
diff --git a/build/ld.linux.gcc.sh b/build/ld.linux.gcc.sh
new file mode 100755
index 0000000..fd2e81f
--- /dev/null
+++ b/build/ld.linux.gcc.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wl,--export-dynamic"
+LD_MULTIPLE_DEFS="-Wl,-zmuldefs"
+LD_STATIC="-Wl,-Bstatic"
+LD_DYNAMIC="-Wl,-Bdynamic"
+LD_ALL_SYMBOLS="-Wl,-whole-archive"
+LD_REF_SYMBOLS="-Wl,-no-whole-archive"
+
+# build command
+DLIB_CMD="$LD -shared"
+
+#EXE_CMD="$LD -static-libstdc++ -static-libgcc"
+source "${0%exe.sh}exe_cmd.sh" # EXE_CMD is defined in build/ld.linux.exe_cmd.sh
+
+EXE_STATIC_CMD="$EXE_CMD"
+#EXE_CMD="$LD"
+#EXE_STATIC_CMD="$LD -static"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ DLIB_CMD="$DLIB_CMD -o $TARG"
+ EXE_CMD="$EXE_CMD -o $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+ EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.linux.icc.sh b/build/ld.linux.icc.sh
new file mode 100755
index 0000000..0c1ae50
--- /dev/null
+++ b/build/ld.linux.icc.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL="-Wa,--export-dynamic"
+LD_MULTIPLE_DEFS="-Wa,-zmuldefs"
+LD_STATIC="-Bstatic"
+LD_DYNAMIC="-Bdynamic"
+LD_ALL_SYMBOLS="-Wa,-whole-archive"
+LD_REF_SYMBOLS="-Wa,-no-whole-archive"
+
+# build command
+DLIB_CMD="$LD -shared"
+EXE_CMD="$LD"
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ DLIB_CMD="$DLIB_CMD -o $TARG"
+ EXE_CMD="$EXE_CMD -o $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+ EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.linux.ln.sh b/build/ld.linux.ln.sh
new file mode 100755
index 0000000..ee5bd9d
--- /dev/null
+++ b/build/ld.linux.ln.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+TYPE="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+EXT="$6"
+VERS="$7"
+
+# find target
+TARG=$(basename "$TARG")
+
+# put extension back onto name
+NAME="$NAME$DBGAP"
+STATIC_NAME="$NAME-static"
+if [ "$EXT" != "" ]
+then
+ NAME="$NAME.$EXT"
+ STATIC_NAME="$STATIC_NAME.$EXT"
+fi
+
+# break out version
+set-vers ()
+{
+ MAJ=$1
+ MIN=$2
+ REL=$3
+}
+
+set-vers $(echo $VERS | tr '.' ' ')
+
+cd "$OUTDIR" || exit 5
+
+# create link
+create-link ()
+{
+ rm -f "$2"
+ local CMD="ln -s $1 $2"
+ echo $CMD
+ $CMD
+}
+
+# test for version in target name
+if [ "$TARG" != "$NAME.$MAJ.$MIN.$REL" ]
+then
+
+ # for simple name, create 2 links
+ if [ "$TARG" = "$NAME" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+ create-link "$NAME.$MAJ" "$NAME"
+
+ # for static libraries, create special link
+ if [ "$TYPE" = "slib" ]
+ then
+ create-link "$NAME" "$STATIC_NAME"
+ fi
+
+ # for name with major version in it
+ elif [ "$TARG" = "$NAME.$MAJ" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+
+
+ # for name with major & minor version in it
+ elif [ "$TARG" = "$NAME.$MAJ.$MIN" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ.$MIN"
+ fi
+fi
diff --git a/build/ld.linux.slib.sh b/build/ld.linux.slib.sh
new file mode 100755
index 0000000..ab72ef8
--- /dev/null
+++ b/build/ld.linux.slib.sh
@@ -0,0 +1,146 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal or static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # unpack archive into temporary directory
+ mkdir -p ld-tmp
+ if ! cd ld-tmp
+ then
+ echo "$SELF_NAME: failed to cd to ld-tmp"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # rename and add to source files list
+ local m=
+ for m in $mbrs
+ do
+ mv $m $LIBNAME-$m
+ CMD="$CMD ld-tmp/$LIBNAME-$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ CMD="$CMD $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create this lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -s*)
+
+ # force static load
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # convert to individual object files
+ convert-static "$LIBPATH" || exit $?
+
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+if [ $CHECKSUM -eq 1 ]
+then
+ SCM_DIR="${BUILD_DIR%/*}/scm"
+ LOGFILE="$SCM_DIR/scm.log"
+ MSG=">>>>> scm: calling the collect script from ld.linux.slib.sh <<<<<<"
+ #echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+
+ "$BUILD_DIR/scm-collect.sh" "$OBJS" "$SLIBS" | sort -u > "$TARG.md5"
+fi
diff --git a/build/ld.rwin.dlib.sh b/build/ld.rwin.dlib.sh
new file mode 100755
index 0000000..9dbaa4f
--- /dev/null
+++ b/build/ld.rwin.dlib.sh
@@ -0,0 +1,363 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : require shared
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.dlib.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+ source "${0%dlib.sh}vc++.sh"
+ ;;
+ *)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS OLE32.lib Ws2_32.lib Shell32.lib /FORCE"
+STATIC_CMD="$SLIB_CMD"
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # create sub directory
+ rm -rf "$2" && mkdir "$2"
+ if ! cd "$2"
+ then
+ echo "$SELF_NAME: failed to cd to $2"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # add source files to link
+ local m=
+ for m in $mbrs
+ do
+ CMD="$CMD $2/$m"
+ STATIC_CMD="$STATIC_CMD $2/$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+# tack on object files
+CMD="$CMD $OBJS"
+STATIC_CMD="$STATIC_CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $DEF_FILE"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ CURDIR="$RHOME/${DIR#$LHOME}"
+ CURDIR="$(echo $CURDIR | tr '/' '\\')"
+ [ "$CURDIR" != "" ] && CMD="$CMD /LIBPATH:$CURDIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ HAVE_KERNEL32=0
+ HAVE_CLIB=0
+
+ # tack on libraries, finding as we go
+ for xLIB in $LIBS
+ do
+ # strip off switch
+ xLIBNAME="${xLIB#-[lsd]}"
+
+ # map xLIBNAME
+ case "$xLIBNAME" in
+
+ # redirect libdl to link against Kernel32.lib in case of windows
+ dl)
+ if [ $HAVE_KERNEL32 -ne 1 ]
+ then
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD Kernel32.lib"
+ HAVE_KERNEL32=1
+ fi
+ continue
+ ;;
+
+ # redirect libm to link against libc.lib in case of windows
+ # omitting the lib defaults to linking against libc.lib
+ m)
+ if [ $HAVE_CLIB -ne 1 ]
+ then
+ load-ref-symbols
+ load-dynamic
+ HAVE_CLIB=1
+ fi
+ continue
+ ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+# kproc)
+# xLIBNAME=ksproc
+# ;;
+#####################
+
+ esac
+
+ # look at linkage
+ case "$xLIB" in
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $xLIBNAME.lib $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to static
+ load-static
+ load-all-symbols
+ CMD="$CMD lib$xLIBNAME.lib"
+ fi
+ ;;
+
+ -d*)
+
+ # only dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $xLIBNAME.lib $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+
+ fi
+ fi
+
+ # try static if performing static build
+ # because we HAVE to link against something,
+ # and the dependency code is being statically
+ # linked into an executable...
+ if [ $FOUND -eq 0 ] && [ $STATIC -eq 1 ]
+ then
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# produce shared library, stub library and exp file
+# map to remote view
+CURDIR="$(pwd)"
+echo $CMD
+rm -f $TARG ${TARG%lib}def ${TARG%lib}pdb "$BINDIR/${TARG%lib}dll"
+
+# Windows linker crashes randomly on bigger files with rc=1000, so we will loop until it completes differently
+while [ 1 ]
+do
+ ${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $CMD >${TARG}.out
+ STATUS=$?
+ cat ${TARG}.out
+ if [ "$STATUS" != "0" ]
+ then
+ grep "fatal error LNK1000" ${TARG}.out >/dev/null
+ if [ "$?" != "0" ]
+ then
+ rm -f "$TARG" "${TARG%lib}dll"
+ exit $STATUS
+ fi
+ else
+ rm -rf ${TARG}.out
+ break
+ fi
+ sleep 30s
+done
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh "${TARG%lib}dll"
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+ echo "timed out, TARG='${TARG%lib}dll'"
+ exit $STATUS
+fi
+
+# copy dll to binary directory, so they can be found by the executables
+# sometimes cp reports an input/output error; try until it succeeds
+while [ 1 ]
+do
+ cp "${TARG%lib}dll" "$BINDIR"
+ STATUS=$?
+ if [ "$STATUS" == "0" ]
+ then
+ break
+ fi
+ echo "waiting for ${TARG%lib}dll to become accessible"
+ ls -l "${TARG%lib}dll"
+ sleep 30s
+done
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# produce static library using lib
+STATIC_CMD="${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $STATIC_CMD"
+echo "$STATIC_CMD"
+$STATIC_CMD || exit $?
+
diff --git a/build/ld.rwin.exe.sh b/build/ld.rwin.exe.sh
new file mode 100755
index 0000000..ce75f94
--- /dev/null
+++ b/build/ld.rwin.exe.sh
@@ -0,0 +1,366 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : ignore - will be dynamically loaded
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : require static
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.exe.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+ source "${0%exe.sh}vc++.sh"
+ ;;
+*)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+#echo "EXE_CMD=${EXE_CMD}"
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS OLE32.lib Ws2_32.lib Shell32.lib"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+ CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+fi
+
+# function to convert static libraries to individual COFF files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # create sub directory
+ rm -rf "$2" && mkdir "$2"
+ if ! cd "$2"
+ then
+ echo "$SELF_NAME: failed to cd to $2"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # add source files to link
+ local m=
+ for m in $mbrs
+ do
+ CMD="$CMD $2/$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile - no vers file on Windows
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ CURDIR="$RHOME/${DIR#$LHOME}"
+ CURDIR="$(echo $CURDIR | tr '/' '\\')"
+ [ "$CURDIR" != "" ] && CMD="$CMD /LIBPATH:$CURDIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ HAVE_KERNEL32=0
+ HAVE_WS2=1
+ HAVE_CLIB=0
+
+ # tack on libraries, finding as we go
+ for xLIB in $LIBS
+ do
+
+ # strip off switch
+ xLIBNAME="${xLIB#-[lsd]}"
+
+ # map xLIBNAME
+ case "$xLIBNAME" in
+ dl)
+ if [ $HAVE_KERNEL32 -ne 1 ]
+ then
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD Kernel32.lib"
+ HAVE_KERNEL32=1
+ fi
+ continue
+ ;;
+
+ ws2)
+ if [ $HAVE_WS2 -ne 1 ]
+ then
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD ws2_32.lib"
+ HAVE_WS2=1
+ fi
+ continue
+ ;;
+
+ # redirect libm to link against libc.lib in case of windows
+ # omitting the lib defaults to linking against libc.lib
+ m)
+ if [ $HAVE_CLIB -ne 1 ]
+ then
+ load-ref-symbols
+ load-dynamic
+ HAVE_CLIB=1
+ fi
+ continue
+ ;;
+
+##### TEMPORARY #####
+# use ksproc for kproc
+# kproc)
+# xLIBNAME=ksproc
+# ;;
+#####################
+ esac
+
+ # look at linkage
+ case "$xLIB" in
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $xLIBNAME.lib $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load dynamic
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ [ $STATIC -eq 1 ] && load-ref-symbols
+ load-dynamic
+ CMD="$CMD lib$xLIBNAME.lib"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ CMD="$CMD lib$xLIBNAME.lib"
+ fi
+ ;;
+
+ -d*)
+
+ FOUND=0
+ if [ $STATIC -eq 1 ]
+ then
+ find-lib $xLIBNAME.a $LDIRS
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # load static
+ load-static
+ load-all-symbols
+ convert-static "$xLIBPATH" "lib$xLIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ load-static
+ load-all-symbols
+
+ CMD="$CMD lib$xLIBNAME"
+ fi
+ fi
+ ;;
+
+
+ esac
+
+ done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# determine current directory
+CURDIR="$(pwd)"
+
+# produce executable
+rm -f ${TARG%exe}*
+
+echo $CMD
+
+# Windows linker crashes randomly on bigger files with rc=1000, so we will loop until it completes differently
+while [ 1 ]
+do
+ ${TOP}/build/run_remotely.sh $PROXY_TOOL $RHOST $RPORT $RHOME $LHOME $CURDIR $ROUTDIR $LOUTDIR $CMD >${TARG}.out
+ STATUS=$?
+ cat ${TARG}.out
+ if [ "$STATUS" != "0" ]
+ then
+ grep "fatal error LNK1000" ${TARG}.out >/dev/null
+ if [ "$?" != "0" ]
+ then
+ exit $STATUS
+ fi
+ else
+ rm ${TARG}.out
+ break
+ fi
+ sleep 30s
+done
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh ${TARG}.exe
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+ echo "timed out, TARG='$TARG'"
+ exit $STATUS
+fi
+
+# create a link without .exe which represents make's target
+test -e ${TARG} || ln -s ${TARG}.exe ${TARG}
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# cleanup temporary files
+rm -f $TARG.lib $TARG.exp
+
+
+# wait for the result file to appear (there may be a network delay)
+${TOP}/build/wait_for_file.sh ${TARG}.exe
+STATUS=$?
+if [ "$STATUS" = "1" ]
+then
+ echo "timed out, TARG='$TARG'"
+ exit $STATUS
+fi
+
+# create a link without .exe which represents make's target
+test -e ${TARG} || ln -s ${TARG}.exe ${TARG}
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+# cleanup temporary files
+rm -f $TARG.lib $TARG.exp
diff --git a/build/ld.rwin.slib.sh b/build/ld.rwin.slib.sh
new file mode 100755
index 0000000..00b0949
--- /dev/null
+++ b/build/ld.rwin.slib.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+VERBOSE=
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal or static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.slib.sh}win.cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # unpack archive into temporary directory
+ mkdir -p ld-tmp
+ if ! cd ld-tmp
+ then
+ echo "$SELF_NAME: failed to cd to ld-tmp"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # rename and add to source files list
+ local m=
+ for m in $mbrs
+ do
+ mv $m $xLIBNAME-$m
+ CMD="$CMD ld-tmp/$xLIBNAME-$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+CMD="$CMD $TARG $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on libraries, finding as we go
+ for xLIB in $LIBS
+ do
+ # strip off switch
+ xLIBNAME="${xLIB#-[lsd]}"
+
+ # look at linkage
+ case "$xLIB" in
+ -s*)
+
+ # force static load
+ find-lib $xLIBNAME.a $LDIRS # .a for static, .lib for dynamic?
+ if [ "$xLIBPATH" != "" ]
+ then
+
+ # add it to dependencies
+ DEPS="$DEPS $xLIBPATH"
+
+ # convert to individual object files
+ convert-static "$xLIBPATH" || exit $?
+
+ fi
+ ;;
+
+ esac
+ done
+fi
+
+# produce static library
+rm -f $TARG
+echo $CMD
+
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
+
+exit $STATUS
diff --git a/build/ld.rwin.stub.sh b/build/ld.rwin.stub.sh
new file mode 100755
index 0000000..4c4c394
--- /dev/null
+++ b/build/ld.rwin.stub.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : require shared
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters and common functions
+source "${0%rwin.stub.sh}win.cmn.sh"
+
+# discover tool chain
+case "$LD" in
+link)
+ source "${0%stub.sh}vc++.sh"
+ ;;
+ *)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# produce stub library and exp file
+echo $STUB_CMD
+$STUB_CMD
diff --git a/build/ld.rwin.vc++.sh b/build/ld.rwin.vc++.sh
new file mode 100755
index 0000000..9322d4d
--- /dev/null
+++ b/build/ld.rwin.vc++.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL=""
+LD_MULTIPLE_DEFS="/FORCE:MULTIPLE"
+LD_STATIC=""
+LD_DYNAMIC=""
+LD_ALL_SYMBOLS="/OPT:NOREF"
+LD_REF_SYMBOLS="/OPT:REF"
+
+# the def file
+unset DEF_SWITCH
+
+DEF_FILE="$SRCDIR/$NAME-$BUILD.def"
+[ ! -f "$DEF_FILE" ] && DEF_FILE="$SRCDIR/$NAME.def"
+if [ -f "$DEF_FILE" ]
+then
+ DEF_FILE_LOCAL="$RHOME/${DEF_FILE#$LHOME}"
+ DEF_FILE_LOCAL="$(echo $DEF_FILE_LOCAL | tr '/' '\\')"
+ DEF_SWITCH="/DEF:$DEF_FILE_LOCAL"
+else
+ unset DEF_FILE
+fi
+
+# the full path to target sans extension
+#echo "TARG=$TARG; LOUTDIR=$LOUTDIR; ROUTDIR=$ROUTDIR"
+WINTARG="$ROUTDIR${TARG#$LOUTDIR}"
+WINTARG="$(echo $WINTARG | tr '/' '\\')"
+WINTARG="${WINTARG%.lib}"
+
+# build command
+STUB_CMD="lib /NOLOGO /MACHINE:x86 $DEF_SWITCH /OUT:$WINTARG.lib"
+SLIB_CMD="lib /NOLOGO /OUT:$WINTARG-static.lib"
+DLIB_CMD="$LD /NOLOGO /DLL $DEF_SWITCH /OUT:$WINTARG.dll /STACK:8000000 /HEAP:1000000000 /INCREMENTAL:NO"
+EXE_CMD="$LD /NOLOGO /OUT:$WINTARG.exe /SUBSYSTEM:CONSOLE /ENTRY:wmainCRTStartup /STACK:8000000 /HEAP:100000000 /INCREMENTAL:NO"
+
+# tack on PDB tracking
+if [ "$BUILD" = "dbg" ]
+then
+ DLIB_CMD="$DLIB_CMD /DEBUG /PDB:$WINTARG.pdb"
+ EXE_CMD="$EXE_CMD /DEBUG /PDB:$WINTARG.pdb"
+fi
diff --git a/build/ld.sh b/build/ld.sh
new file mode 100755
index 0000000..734c6ab
--- /dev/null
+++ b/build/ld.sh
@@ -0,0 +1,596 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+TOP="$(dirname $BUILD_DIR)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# architecture
+ARCH="$1"
+shift
+
+# binary loader tool
+LD="$1"
+shift
+
+# configuration
+unset SHLX
+unset DYLX
+unset LIBX
+unset OBJX
+unset LOBX
+
+# parameters
+TYPE=exe
+STATIC=0
+DYLD=0
+STATICSYSLIBS=0
+CHECKSUM=0
+KPROC=4
+THREADS=0
+HAVE_KSPROC=0
+NEED_KPROC=1
+HAVE_GZIP=0
+NEED_GZIP=1
+HAVE_BZIP=0
+NEED_BZIP=1
+HAVE_DL=0
+NEED_DL=1
+HAVE_M=0
+NEED_M=1
+HAVE_XML=0
+NEED_XML=0
+HAVE_KFC=0
+HAVE_KAPP=0
+HAVE_NCBI_VDB=0
+HAVE_NCBI_WVDB=0
+unset BUILD
+unset LDIRS
+unset XDIRS
+unset SRCDIR
+unset BINDIR
+unset VERSFILE
+unset VERSDIR
+unset TARG
+unset EXT
+unset OBJS
+unset LIBS
+unset DEPFILE
+
+# paths for translating local to remote
+unset RHOME
+unset LHOME
+unset RHOST
+unset LOUTDIR
+unset ROUTDIR
+unset PROXY_TOOL
+
+while [ $# -ne 0 ]
+do
+
+ case "$1" in
+ --build)
+ BUILD="$2"
+ shift
+ ;;
+
+ --ldflags)
+ LDFLAGS="$2"
+ shift
+ ;;
+
+ --static-system-libs)
+ STATICSYSLIBS=1
+ ;;
+
+ --checksum)
+ CHECKSUM=1
+ ;;
+
+ --shlx)
+ SHLX="$2"
+ shift
+ ;;
+
+ --dylx)
+ SHLX="$2"
+ shift
+ ;;
+
+ --libx)
+ LIBX="$2"
+ shift
+ ;;
+
+ --objx)
+ OBJX="$2"
+ shift
+ ;;
+
+ --srcdir)
+ SRCDIR="$2"
+ shift
+ ;;
+
+ --bindir)
+ BINDIR="$2"
+ shift
+ ;;
+
+ --rhome)
+ RHOME="$2"
+ shift
+ ;;
+
+ --lhome)
+ LHOME="$2"
+ shift
+ ;;
+
+ --loutdir)
+ LOUTDIR="$2"
+ shift
+ ;;
+
+ --routdir)
+ ROUTDIR="$2"
+ shift
+ ;;
+
+ --rhost)
+ RHOST="$2"
+ shift
+ ;;
+
+ --rport)
+ RPORT="$2"
+ shift
+ ;;
+
+ --proxy_tool)
+ PROXY_TOOL="$2"
+ shift
+ ;;
+
+ -MD)
+ DEPFILE=1
+ ;;
+
+ -L*)
+ ARG="${1#-L}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+ LDIRS="$LDIRS:$ARG"
+ ;;
+
+ -X*)
+ ARG="${1#-X}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+ XDIRS="$XDIRS:$ARG"
+ ;;
+
+ --dlib)
+ TYPE=dlib
+ ;;
+
+ --slib)
+ TYPE=slib
+ ;;
+
+ --stub)
+ TYPE=stub
+ ;;
+
+ --exe)
+ TYPE=exe
+ ;;
+
+ --static)
+ STATIC=1
+ ;;
+
+ --vers)
+ if [ -f "$2" ]
+ then
+ VERSFILE="$2"
+ elif [ -d "$2" ]
+ then
+ VERSDIR="$2"
+ else
+ echo "$SELF_NAME: expected version file or source directory"
+ exit 3
+ fi
+ shift
+ ;;
+
+ -o*)
+ ARG="${1#-o}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+ TARG="$ARG"
+ ;;
+
+ -lz|-sz|-dz)
+ LIBS="$LIBS $1"
+ HAVE_GZIP=1
+ ;;
+ -[lds]bz2)
+ LIBS="$LIBS $1"
+ HAVE_BZIP=1
+ ;;
+ -[lds]dl)
+ LIBS="$LIBS $1"
+ HAVE_DL=1
+ ;;
+
+ -[lds]xml2)
+ HAVE_XML=32
+ ;;
+
+ -[lds]m)
+ HAVE_M=16
+ ;;
+
+ -lsradb|-ssradb|-dsradb|-lwsradb|-swsradb)
+ LIBS="$LIBS $1"
+ NEED_DL=1
+ DYLD=2
+ ;;
+
+ -lkrypto|-dkrypto)
+ LIBS="$LIBS $1"
+ NEED_KPROC=1
+ ;;
+ -skrypto)
+ LIBS="$LIBS $1"
+ NEED_KPROC=1
+ ;;
+
+ -[ld]kproc)
+ KPROC=4
+ LIBS="$LIBS $1"
+ ;;
+ -skproc)
+ KPROC=4
+ THREADS=8
+ LIBS="$LIBS $1"
+ ;;
+
+ -[lds]ncbi-vdb)
+ HAVE_NCBI_VDB=1
+ KPROC=4
+ HAVE_GZIP=1
+ HAVE_BZIP=1
+ HAVE_KFC=1
+ NEED_M=1
+
+ NEED_XML=$CONFIGURE_FOUND_XML2
+ # CONFIGURE_FOUND_XML2 comes from Makefile.config.$OS.$ARCH
+
+ LIBS="$LIBS $1"
+ ;;
+ -[lds]ncbi-ngs-c++)
+ HAVE_NCBI_VDB=1
+ KPROC=4
+ HAVE_GZIP=1
+ HAVE_BZIP=1
+ HAVE_KFC=1
+ NEED_M=1
+ NEED_XML=$CONFIGURE_FOUND_XML2
+ LIBS="$LIBS $1"
+ ;;
+ -[lds]ncbi-wvdb)
+ HAVE_NCBI_WVDB=1
+ KPROC=4
+ HAVE_GZIP=1
+ HAVE_BZIP=1
+ HAVE_KFC=1
+ NEED_M=16
+ NEED_XML=$CONFIGURE_FOUND_XML2
+ LIBS="$LIBS $1"
+ ;;
+
+ -[lds]ksproc)
+ HAVE_KSPROC=1
+ LIBS="$LIBS $1"
+ THREADS=0
+ ;;
+
+ -[lds]pthread)
+ THREADS=8
+ ;;
+
+ -[ls]kfs)
+ LIBS="$LIBS $1"
+ NEED_GZIP=1
+ NEED_BZIP=1
+ NEED_DL=1
+ ;;
+ -dkfs)
+ LIBS="$LIBS $1"
+ NEED_GZIP=1
+ NEED_BZIP=1
+ NEED_DL=1
+ DYLD=2
+ ;;
+
+ -[ls]vfs)
+ LIBS="$LIBS $1"
+ ;;
+ -dvfs)
+ LIBS="$LIBS $1"
+ DYLD=2
+ ;;
+
+ -[ls]kxml)
+ LIBS="$LIBS $1"
+ NEED_XML=1
+ ;;
+ -dkxml)
+ LIBS="$LIBS $1"
+ NEED_XML=1
+ DYLD=2
+ ;;
+
+ -[lds]ncbi-bam)
+ LIBS="$LIBS $1"
+ #NEED_GZIP=1
+ ;;
+
+ -[lds]kapp)
+ HAVE_KAPP=1
+ ;;
+
+ -[lds]kapp-norsrc)
+ HAVE_KAPP=1
+ ;;
+
+ -[lds]kfc)
+ LIBS="$LIBS $1"
+ HAVE_KFC=1
+ ;;
+
+ -[ls]*)
+ LIBS="$LIBS $1"
+ ;;
+
+ -d*)
+ LIBS="$LIBS $1"
+ DYLD=2
+ ;;
+
+ *.$OBJX)
+ OBJS="$OBJS $1"
+ ;;
+
+ esac
+
+ shift
+done
+
+# correct for prefixes
+LDIRS="${LDIRS#:}"
+XDIRS="${XDIRS#:}"
+LIBS="${LIBS# }"
+OBJS="${OBJS# }"
+
+# split target
+OUTDIR=$(dirname "$TARG")
+NAME=$(basename "$TARG")
+
+# dependency file
+[ "$DEPFILE" != "" ] && DEPFILE="$NAME.$TYPE.d"
+
+# parse target
+if [ "$TYPE" = "dlib" ] && [ "$DYLX" != "" ]
+then
+ EXT="$DYLX"
+ NAME="${NAME%.$DYLX}"
+fi
+
+unset VERS
+
+V="${NAME#${NAME%\.[^.]*}\.}"
+if [[ $V == ${V//[^0-9]/} ]]
+then
+ ARG="${NAME%\.$V}"
+ VERS="$V"
+ NAME="${ARG#.}"
+
+ V="${NAME#${NAME%\.[^.]*}\.}"
+ if [[ $V == ${V//[^0-9]/} ]]
+ then
+ ARG="${NAME%\.$V}"
+ VERS="$V.$VERS"
+ NAME="${ARG#.}"
+
+ V="${NAME#${NAME%\.[^.]*}\.}"
+ if [[ $V == ${V//[^0-9]/} ]]
+ then
+ ARG="${NAME%\.$V}"
+ VERS="$V.$VERS"
+ NAME="${ARG#.}"
+ fi
+ fi
+ #echo "ARG=$ARG,VERS=$VERS,NAME=$NAME"
+fi
+
+case "$TYPE" in
+dlib)
+ if [ "$SHLX" != "" ]
+ then
+ EXT="$SHLX"
+ NAME="${NAME%.$SHLX}"
+ fi
+ ;;
+slib)
+ EXT="$LIBX"
+ NAME="${NAME%.$LIBX}"
+esac
+
+unset DBGAP
+if [ "$NAME" != "${NAME%-dbgap}" ]
+then
+ DBGAP=-dbgap
+ NAME="${NAME%-dbgap}"
+fi
+
+# locate version file and version
+[ "$VERSDIR" != "" ] && VERSFILE="$VERSDIR/$NAME.vers"
+if [ "$VERSFILE" != "" ]
+then
+ if [ ! -f "$VERSFILE" ]
+ then
+ echo "$SELF_NAME: warning - creating version file '$VERSFILE'"
+ echo 1.0.0 > $VERSFILE
+ fi
+
+ if [ ! -r "$VERSFILE" ]
+ then
+ echo "$SELF_NAME: version file '$VERSFILE' is unreadable"
+ exit 5
+ fi
+
+ ARG=$(cat $VERSFILE)
+ if [ "$VERS" != "" ] && [ "$VERS" != "$ARG" ] && [ "$ARG" = "${ARG#$VERS.}" ]
+ then
+ echo "$SELF_NAME: version from file '$VERSFILE' ($ARG) does not match '$VERS'"
+ exit 5
+ fi
+ VERS="$ARG"
+fi
+
+# fix kapp
+[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -ne 0 ] && LIBS="-lkapp $LIBS"
+[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -eq 0 ] && LIBS="-lkapp-norsrc $LIBS"
+
+# detect need for kproc
+if [ $KPROC -eq 0 ] && [ $NEED_KPROC -ne 0 ] && [ $HAVE_KSPROC -eq 0 ]
+then
+ KPROC=4
+ LIBS="$LIBS -lkproc"
+fi
+
+# turn on threads for kproc
+[ $KPROC -ne 0 ] && THREADS=8
+
+# supply missing libraries
+[ $HAVE_GZIP -eq 0 ] && [ $NEED_GZIP -ne 0 ] && LIBS="$LIBS -lz"
+[ $HAVE_BZIP -eq 0 ] && [ $NEED_BZIP -ne 0 ] && LIBS="$LIBS -lbz2"
+[ $HAVE_DL -eq 0 ] && [ $NEED_DL -ne 0 ] && LIBS="$LIBS -ldl"
+[ $HAVE_M -eq 0 ] && [ $NEED_M -ne 0 ] && HAVE_M=16
+[ $HAVE_XML -eq 0 ] && [ $NEED_XML -ne 0 ] && HAVE_XML=32
+
+# overwrite dependencies
+[ -f "$DEPFILE" ] && rm -f "$DEPFILE"
+
+# generate mode
+MODE=$(expr $HAVE_XML + $HAVE_M + $THREADS + $KPROC + $DYLD + $STATIC)
+#MODE=$(expr $THREADS + $KPROC + $DYLD + 1)
+
+# generate SCM flags
+SCMFLAGS=$(expr $STATICSYSLIBS + $STATICSYSLIBS + $CHECKSUM)
+if [ 0 -ne 0 ]
+then
+ echo "# $SELF_NAME"
+ echo "# script-base : $SCRIPT_BASE"
+ echo "# OS : $OS"
+ echo "# type : $TYPE"
+ echo "# tool : $LD"
+ echo "# ARCH : $ARCH"
+ echo "# BUILD : $BUILD"
+ echo "# srcdir : $SRCDIR"
+ echo "# bindir : $BINDIR"
+ echo "# outdir : $OUTDIR"
+ echo "# target : $TARG"
+ echo "# name : $NAME"
+ echo "# dbgap : $DBGAP"
+ echo "# version : $VERS"
+ echo "# vers file : $VERSFILE"
+ echo "# dep file : $DEPFILE"
+ echo "# mode : $MODE"
+ echo "# DYLD : $DYLD"
+ echo "# SCMFLAGS : $SCMFLAGS"
+ echo "# LDFLAGS : $LDFLAGS"
+ echo "# LDIRS : $LDIRS"
+ echo "# XDIRS : $XDIRS"
+ echo "# objects : $OBJS"
+ echo "# libraries : $LIBS"
+ echo "# rhost : $RHOST"
+ echo "# rport : $RPORT"
+ echo "# rhome : $RHOME"
+ echo "# lhome : $LHOME"
+ echo "# proxy_tool : $PROXY_TOOL"
+
+ echo "# static sys libs: $STATICSYSLIBS"
+ echo "# checksum : $CHECKSUM"
+ echo "# static : $STATIC"
+ echo "# kproc : $KPROC"
+ echo "# thread libs : $THREADS"
+ echo "# vers dir : $VERSDIR"
+ echo "# extension : $EXT"
+fi
+
+# perform link
+"$SCRIPT_BASE.$OS.$TYPE.sh" "$LD" "$ARCH" "$BUILD" "$SRCDIR" "$BINDIR" "$OUTDIR" \
+ "$TARG" "$NAME" "$DBGAP" "$VERS" "$VERSFILE" "$DEPFILE" "$MODE" "$SCMFLAGS" \
+ "$LDFLAGS" "$LDIRS" "$XDIRS" "$OBJS" "$LIBS" "$PROXY_TOOL" "$RHOST" "$RPORT" "$RHOME" "$LHOME" "$(pwd)" "$ROUTDIR" "$LOUTDIR" || exit $?
+
+# establish links
+if [ "$VERS" != "" ] && [ "$OS" != "win" ] && [ "$OS" != "rwin" ]
+then
+ $SCRIPT_BASE.$OS.ln.sh "$TYPE" "$OUTDIR" "$TARG" "$NAME" "$DBGAP" "$EXT" "$VERS"
+fi
+
+# SCM
+if [ $CHECKSUM -eq 1 ] && [ "$OS" = "linux" ]
+then
+ # calling the scm-version-script
+ # parameters are: module-name, current-md5-file, version-file
+ if [ $TYPE = "dlib" ] || [ $TYPE = "exe" ] || [ $STATIC -eq 1 ]
+ then
+ SCM_DIR="$TOP/scm"
+ LOGFILE="$SCM_DIR/scm.log"
+ SCMD="$BUILD_DIR/scm.sh $NAME $TARG.md5 $VERSFILE"
+ echo "$SCMD" >> $LOGFILE
+ $SCMD
+ fi
+fi
diff --git a/build/ld.sun.cc.sh b/build/ld.sun.cc.sh
new file mode 100644
index 0000000..af8a380
--- /dev/null
+++ b/build/ld.sun.cc.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# define linker params
+LD_EXPORT_GLOBAL=
+LD_MULTIPLE_DEFS="-Wl,-zmuldefs"
+LD_STATIC="-Wl,-Bstatic"
+LD_DYNAMIC="-Wl,-Bdynamic"
+LD_ALL_SYMBOLS="-Wl,--whole-archive"
+LD_REF_SYMBOLS="-Wl,--no-whole-archive"
+
+# build command
+case "$ARCH" in
+ sparc32|i386)
+ DLIB_CMD="$LD -Xlinker -32 -shared"
+ EXE_CMD="$LD -Xlinker -32"
+ ;;
+ sparc64|x86_64)
+ DLIB_CMD="$LD -Xlinker -64 -shared"
+ EXE_CMD="$LD -Xlinker -64"
+ ;;
+esac
+
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ DLIB_CMD="$DLIB_CMD -o $TARG"
+ EXE_CMD="$EXE_CMD -o $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ DLIB_CMD="$DLIB_CMD -o $OUTDIR/$NAME$DBGAP.so.$VERS -Wl,-soname,$NAME.so.$MAJ"
+ EXE_CMD="$EXE_CMD -o $OUTDIR/$NAME$DBGAP.$VERS"
+fi
diff --git a/build/ld.sun.cmn.sh b/build/ld.sun.cmn.sh
new file mode 100755
index 0000000..c6c5da6
--- /dev/null
+++ b/build/ld.sun.cmn.sh
@@ -0,0 +1,160 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+ARCH="$2"
+BUILD="$3"
+shift 3
+
+SRCDIR="$1"
+BINDIR="$2"
+OUTDIR="$3"
+TARG="$4"
+NAME="$5"
+DBGAP="$6"
+shift 6
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+DYLD=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+KPROC=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+THREADS=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_M=$(expr $MODE % 2)
+MODE=$(expr $MODE / 2)
+HAVE_XML=$(expr $MODE % 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+ MAJ=$1
+ MIN=$2
+ REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+ _lib="lib$1"
+ _dirs="$2"
+
+ LIBPATH=''
+
+ while [ "$_dirs" != "" ]
+ do
+ _dir="${_dirs%%:*}"
+
+ if [ "$_dir" != "" ]
+ then
+ if [ -e "$_dir/$_lib" ]
+ then
+ while [ -L "$_dir/$_lib" ]
+ do
+ # no readlink on Sun
+ #_lib=$(readlink -n "$_dir/$_lib")
+ cd $_dir && _dir="$(pwd -P)"; test -L _lib || _lib=$(ls -l $_lib | sed 's/.*->\ //g'); cd $OLDPWD
+ done
+ LIBPATH="$_dir/$_lib"
+ break;
+ fi
+ fi
+
+ _dirs="${_dirs#$_dir}"
+ _dirs="${_dirs#:}"
+ done
+}
+
+# setting state
+load-static ()
+{
+ if [ $LD_STATIC_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_STATIC"
+ LD_STATIC_STATE=1
+ fi
+}
+
+load-dynamic ()
+{
+ if [ $LD_STATIC_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_DYNAMIC"
+ LD_STATIC_STATE=0
+ fi
+}
+
+load-all-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_ALL_SYMBOLS"
+ LD_ALL_STATE=1
+ fi
+}
+
+load-ref-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_REF_SYMBOLS"
+ LD_ALL_STATE=0
+ fi
+}
diff --git a/build/ld.sun.dlib.sh b/build/ld.sun.dlib.sh
new file mode 100755
index 0000000..f42f363
--- /dev/null
+++ b/build/ld.sun.dlib.sh
@@ -0,0 +1,282 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : require shared
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%dlib.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+cc)
+ source "${0%dlib.sh}cc.sh"
+ ;;
+ *)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# DLIB_CMD was started in tool-specific source
+CMD="$DLIB_CMD $LDFLAGS"
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create dynamic lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ # update LD_LIBRARY_PATH
+ unset LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -ldl|-ddl)
+
+ # always load libdl as shared library
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -ldl"
+ ;;
+
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ if [ $STATICSYSLIBS -eq 1 ]
+ then
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to static
+ load-static
+ load-all-symbols
+ ;;
+
+ *)
+ # set load to dynamic
+ load-ref-symbols
+ load-dynamic
+ ;;
+
+ esac
+ else
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+ then
+ # set load to static
+ load-static
+ load-all-symbols
+ else
+
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to dynamic
+ load-ref-symbols
+ load-dynamic
+ ;;
+
+ *)
+ # set load to static
+ load-static
+ load-all-symbols
+ ;;
+ esac
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -d*)
+
+ # only dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load normally
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ # set load to normal
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# put state back to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+ CMD="$CMD -lpthread"
+fi
+
+# produce shared library
+echo "$CMD"
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.sun.exe.sh b/build/ld.sun.exe.sh
new file mode 100755
index 0000000..56e062c
--- /dev/null
+++ b/build/ld.sun.exe.sh
@@ -0,0 +1,299 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal linkage
+# -l : find shared or static
+# -s : require static
+# -d : ignore - will be dynamically loaded
+#
+# static linkage
+# -l : require static
+# -s : require static
+# -d : require static
+# ===========================================================================
+
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%exe.sh}cmn.sh"
+
+# discover tool chain
+case "$LD" in
+cc)
+ source "${0%exe.sh}cc.sh"
+ ;;
+gcc)
+ source "${0%sun.exe.sh}linux.gcc.sh"
+ ;;
+*)
+ echo "$SELF_NAME: unrecognized ld tool - '$LD'"
+ exit 5
+esac
+
+# EXE_CMD was started in tool-specific source
+CMD="$EXE_CMD $LDFLAGS"
+
+# if building a static executable against dynamic libraries
+# the main application will substitute for name lookup
+if [ $STATIC -eq 1 ] && [ $DYLD -eq 1 ]
+then
+# CMD="$CMD $LD_EXPORT_GLOBAL $LD_MULTIPLE_DEFS"
+ CMD="$CMD $LD_EXPORT_GLOBAL"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create executable
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile $VERSFILE"
+if [ "$LIBS" != "" ]
+then
+ # tack on paths
+ DIRS="$LDIRS:$XDIRS"
+ while [ "$DIRS" != "" ]
+ do
+ DIR="${DIRS%%:*}"
+ [ "$DIR" != "" ] && CMD="$CMD -L$DIR"
+ DIRS="${DIRS#$DIR}"
+ DIRS="${DIRS#:}"
+ done
+
+ # update LD_LIBRARY_PATH
+ unset LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH="$LDIRS:$XDIRS"
+
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -ldl|-ddl)
+
+ # always load libdl as shared library
+ load-ref-symbols
+ load-dynamic
+ CMD="$CMD -ldl"
+ ;;
+
+ -l*)
+
+ # normal or dynamic linkage
+ FOUND=0
+ if [ $STATIC -eq 0 ]
+ then
+ find-lib $LIBNAME.so $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # load dynamic
+ load-dynamic
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # try static only
+ if [ $FOUND -eq 0 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ # do not need to load all symbols for external libs
+ [ $STATIC -eq 1 ] && load-ref-symbols
+
+ if [ $STATICSYSLIBS -eq 1 ]
+ then
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to static
+ load-static
+ ;;
+
+ *)
+ # set load to dynamic
+ load-dynamic
+ ;;
+
+ esac
+ else
+ # set load to normal
+ load-dynamic
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -s*)
+
+ # force static load
+ FOUND=0
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ [ $STATIC -eq 1 ] && load-all-symbols
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+
+ # do not need to load all symbols for external libs
+ [ $STATIC -eq 1 ] && load-ref-symbols
+
+ if [ $STATIC -eq 1 ] || [ $STATICSYSLIBS -eq 1 ]
+ then
+
+ # set load to static
+ load-static
+
+ else
+
+ # special case for libs we have in "ext"
+ # that are sometimes requested as static
+ case "$LIBNAME" in
+ z|bz2)
+ # set load to dynamic
+ load-dynamic
+ ;;
+ *)
+ load-static
+ ;;
+ esac
+ fi
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ ;;
+
+ -d*)
+
+ FOUND=0
+ if [ $STATIC -eq 1 ]
+ then
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # found it
+ FOUND=1
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # load static
+ load-static
+ load-all-symbols
+
+ CMD="$CMD -l$LIBNAME"
+
+ fi
+
+ # not found within our directories
+ if [ $FOUND -eq 0 ]
+ then
+ load-static
+ load-all-symbols
+
+ CMD="$CMD -l$LIBNAME"
+ fi
+ fi
+ ;;
+
+
+ esac
+
+ done
+fi
+
+# return to normal
+load-ref-symbols
+load-dynamic
+
+# add in pthreads
+if [ $THREADS -ne 0 ]
+then
+ CMD="$CMD -lpthread"
+fi
+
+# produce shared library
+echo $CMD
+$CMD || exit $?
+
+# produce dependencies
+if [ "$DEPFILE" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.sun.ln.sh b/build/ld.sun.ln.sh
new file mode 100644
index 0000000..c248afa
--- /dev/null
+++ b/build/ld.sun.ln.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+TYPE="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+EXT="$6"
+VERS="$7"
+
+# find target
+TARG=$(basename "$TARG")
+
+# put extension back onto name
+NAME="$NAME$DBGAP"
+[ "$EXT" != "" ] && NAME="$NAME.$EXT"
+
+# break out version
+set-vers ()
+{
+ MAJ=$1
+ MIN=$2
+ REL=$3
+}
+
+set-vers $(echo $VERS | tr '.' ' ')
+
+cd "$OUTDIR" || exit 5
+
+# create link
+create-link ()
+{
+ rm -f "$2"
+ local CMD="ln -s $1 $2"
+ echo $CMD
+ $CMD
+}
+
+# test for version in target name
+if [ "$TARG" != "$NAME.$MAJ.$MIN.$REL" ]
+then
+
+ # for simple name, create 2 links
+ if [ "$TARG" = "$NAME" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+ create-link "$NAME.$MAJ" "$NAME"
+
+ # for name with major version in it
+ elif [ "$TARG" = "$NAME.$MAJ" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ"
+
+
+ # for name with major & minor version in it
+ elif [ "$TARG" = "$NAME.$MAJ.$MIN" ]
+ then
+ create-link "$NAME.$MAJ.$MIN.$REL" "$NAME.$MAJ.$MIN"
+ fi
+fi
diff --git a/build/ld.sun.slib.sh b/build/ld.sun.slib.sh
new file mode 100755
index 0000000..1e08638
--- /dev/null
+++ b/build/ld.sun.slib.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal or static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+BUILD_DIR="$(dirname $0)"
+
+# parameters and common functions
+source "${0%slib.sh}cmn.sh"
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # unpack archive into temporary directory
+ mkdir -p ld-tmp
+ if ! cd ld-tmp
+ then
+ echo "$SELF_NAME: failed to cd to ld-tmp"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # rename and add to source files list
+ local m=
+ for m in $mbrs
+ do
+ mv $m $NAME-$m
+ CMD="$CMD ld-tmp/$NAME-$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ CMD="$CMD $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# list of static libraries used to create this lib
+SLIBS=''
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -s*)
+
+ # force static load
+ find-lib $LIBNAME.a $LDIRS
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+ SLIBS="$SLIBS $(dirname $LIBPATH)/lib$LIBNAME.a"
+
+ # convert to individual object files
+ convert-static "$LIBPATH" || exit $?
+
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/ld.unix.cmn.sh b/build/ld.unix.cmn.sh
new file mode 100644
index 0000000..b787c82
--- /dev/null
+++ b/build/ld.unix.cmn.sh
@@ -0,0 +1,149 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# script name
+SELF_NAME="$(basename $0)"
+
+# parameters
+LD="$1"
+shift
+
+SRCDIR="$1"
+OUTDIR="$2"
+TARG="$3"
+NAME="$4"
+DBGAP="$5"
+shift 5
+
+VERS="$1"
+VERSFILE="$2"
+DEPFILE="$3"
+shift 3
+
+MODE="$1"
+SCMFLAGS="$2"
+LDFLAGS="$3"
+shift 3
+
+LDIRS="$1"
+XDIRS="$2"
+shift 2
+
+OBJS="$1"
+LIBS="$2"
+
+# decode MODE
+STATIC=$(expr $MODE % 2)
+DYLD=$(expr $MODE / 2)
+
+# decode SCMFLAGS
+CHECKSUM=$(expr $SCMFLAGS % 2)
+STATICSYSLIBS=$(expr $SCMFLAGS / 2)
+
+# return parameter for find-lib
+LIBPATH=''
+
+# initial command state
+CMD=''
+LD_STATIC_STATE=0
+LD_ALL_STATE=0
+
+# for breaking out version
+set-vers ()
+{
+ MAJ=$1
+ MIN=$2
+ REL=$3
+}
+
+# for locating libraries
+find-lib ()
+{
+ _lib="lib$1"
+ _dirs="$2"
+
+ LIBPATH=''
+
+ while [ "$_dirs" != "" ]
+ do
+ _dir="${_dirs%%:*}"
+
+ if [ "$_dir" != "" ]
+ then
+ if [ -e "$_dir/$_lib" ]
+ then
+ while [ -L "$_dir/$_lib" ]
+ do
+ _lib=$(stat -c '%N' "$_dir/$_lib" | tr "\`\'" " ")
+ _lib="${_lib#*->}"
+ _lib="lib${_lib# *lib}"
+ _lib="${_lib%% *}"
+ done
+ LIBPATH="$_dir/$_lib"
+ break;
+ fi
+ fi
+
+ _dirs="${_dirs#$_dir}"
+ _dirs="${_dirs#:}"
+ done
+}
+
+# setting state
+load-static ()
+{
+ if [ $LD_STATIC_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_STATIC"
+ LD_STATIC_STATE=1
+ fi
+}
+
+load-dynamic ()
+{
+ if [ $LD_STATIC_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_DYNAMIC"
+ LD_STATIC_STATE=0
+ fi
+}
+
+load-all-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 0 ]
+ then
+ CMD="$CMD $LD_ALL_SYMBOLS"
+ LD_ALL_STATE=1
+ fi
+}
+
+load-ref-symbols ()
+{
+ if [ $LD_ALL_STATE -eq 1 ]
+ then
+ CMD="$CMD $LD_REF_SYMBOLS"
+ LD_ALL_STATE=0
+ fi
+}
diff --git a/build/ld.unix.slib.sh b/build/ld.unix.slib.sh
new file mode 100644
index 0000000..21d4b66
--- /dev/null
+++ b/build/ld.unix.slib.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# ===========================================================================
+# input library types, and their handling
+#
+# normal or static linkage
+# -l : require static
+# -s : require static
+# -d : ignore
+# ===========================================================================
+
+# initialize command
+CMD="ar -rc"
+
+# function to convert an archive into individual object files
+convert-static ()
+{
+ # list members
+ local path="$1"
+ local mbrs="$(ar -t $path)"
+
+ # unpack archive into temporary directory
+ mkdir -p ld-tmp
+ if ! cd ld-tmp
+ then
+ echo "$SELF_NAME: failed to cd to ld-tmp"
+ exit 5
+ fi
+ ar -x "$path"
+
+ # rename and add to source files list
+ local m=
+ for m in $mbrs
+ do
+ mv $m $LIBNAME-$m
+ CMD="$CMD ld-tmp/$LIBNAME-$m"
+ done
+
+ # return to prior location
+ cd - > /dev/null
+}
+
+# versioned output
+if [ "$VERS" = "" ]
+then
+ CMD="$CMD $TARG"
+else
+ set-vers $(echo $VERS | tr '.' ' ')
+ CMD="$CMD $OUTDIR/$NAME$DBGAP.a.$VERS"
+fi
+
+# tack on object files
+CMD="$CMD $OBJS"
+
+# initial dependency upon Makefile and vers file
+DEPS="$SRCDIR/Makefile"
+if [ "$LIBS" != "" ]
+then
+ # tack on libraries, finding as we go
+ for LIB in $LIBS
+ do
+
+ # strip off switch
+ LIBNAME="${LIB#-[lsd]}"
+
+ # look at linkage
+ case "$LIB" in
+ -l*|-s*)
+
+ # force static load
+ LIBPATH="$(find-lib $LIBNAME.a $LDIRS)"
+ if [ "$LIBPATH" != "" ]
+ then
+
+ # add it to dependencies
+ DEPS="$DEPS $LIBPATH"
+
+ # convert to individual object files
+ convert-static "$LIBPATH" || exit $?
+
+ fi
+ ;;
+
+ esac
+
+ done
+fi
+
+# produce static library
+echo $CMD
+$CMD || exit $?
+
+# remove temporaries
+rm -rf ld-tmp
+
+# produce dependencies
+if [ "$DEPFILE" != "" ] && [ "$DEPS" != "" ]
+then
+ echo "$TARG: $DEPS" > "$DEPFILE"
+fi
diff --git a/build/libexists.sh b/build/libexists.sh
new file mode 100644
index 0000000..b725289
--- /dev/null
+++ b/build/libexists.sh
@@ -0,0 +1,180 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# libexists.sh: test whether one of the given libraries defines all of the specified external names
+# Usage:
+# bash libexists.sh OS ARCH CC LD CC_SH LD_SH [-L dir ] [-X dir] [-o dir] [-l lib] [-s lib] [-d lib] [-v] extName1 [ extName2 ... ]
+# Parameters:
+# OS : linux/mac/win
+# ARCH : i386/x86_64
+# CC : compiler command
+# LD : link command
+# CC_SH : compile script
+# LD_SH : link script
+# extName1, ... - external names to find in libraries
+# Options:
+# -L, -X : library directories
+# -o : directory for intermediate files
+# -l, -d : libraries to search (shared or static)
+# -s : libraries to search (static)
+# -v : verbose mode
+# Environment:
+# requires an ?? OS.ARCH.sh file in the script's directory
+# Return: 0 if found, the library's name is on stdout
+# 1 not found
+# -1 bad arguments
+#
+
+BUILD_DIR="$(dirname $0)"
+
+# os
+OS="$1";shift
+# architecture
+ARCH="$1";shift
+# compiler
+CC="$1";shift 1
+# linker
+LD="$1";shift
+# compile script
+CC_SH="$1";shift
+# link script
+LD_SH="$1";shift
+
+# message prefix for verbose mode
+dbgPref="**$(basename $0): "
+
+# parse parameters
+cOpts=
+libs=
+verbose="false"
+outDir="."
+while getopts L:X:l:s:d:vo: o
+do case "$o" in
+ L|X) cOpts="${cOpts} -L$OPTARG";libPath="${libPath}:${OPTARG}";;
+ l|d) libs="${libs} l$OPTARG";;
+ s) libs="${libs} s$OPTARG";;
+ o) outDir="$OPTARG";;
+ v) verbose="true";;
+ [?]) printf >&2 "Usage: $0 [-L dir ] [-X dir] [-o dir] [-l lib] [-s lib] [-d lib] [-v] extName1 [ extName2 ... ]"
+ exit -1;;
+ esac
+done
+libPath="${outDir}${libPath}"
+
+shift $((OPTIND - 1))
+
+if [ $verbose == "true" ]
+then
+ printf >&2 "${dbgPref}OS ='%s'\n" "$OS"
+ printf >&2 "${dbgPref}ARCH ='%s'\n" "$ARCH"
+ printf >&2 "${dbgPref}CC ='%s'\n" "$CC"
+ printf >&2 "${dbgPref}LD ='%s'\n" "$LD"
+ printf >&2 "${dbgPref}CC_SH ='%s'\n" "$CC_SH"
+ printf >&2 "${dbgPref}LD_SH ='%s'\n" "$LD_SH"
+ printf >&2 "${dbgPref}cOpts ='%s'\n" "$cOpts"
+ printf >&2 "${dbgPref}libs ='%s'\n" "$libs"
+ printf >&2 "${dbgPref}verbose ='%s'\n" $verbose
+ printf >&2 "${dbgPref}outDir ='%s'\n" $outDir
+fi
+
+## create a C program referencing all the external names
+srcFile="${outDir}/libexists.c"
+objFile="${outDir}/libexists.o"
+exeFile="${outDir}/libexists"
+
+echo "" >${srcFile}
+for fn in $*
+do #declare
+ echo "extern void ${fn}(void);" >>${srcFile}
+done
+echo "int main( int argc, char *argv [] ){" >>${srcFile}
+echo "if (argc < 0 ) { " >>${srcFile}
+for fn in $*
+do
+ echo " ${fn}();" >>${srcFile}
+done
+echo "} return 0;} int wmain(int argc, char *argv []) { return main(argc,argv); }" >>${srcFile}
+
+if [ $verbose == "true" ]
+then
+ echo "${dbgPref}created ${srcFile}:" >&2
+ cat ${srcFile} >&2
+fi
+##
+
+## compile
+compile="${BUILD_DIR}/$CC_SH $OS $CC -c -o ${objFile} ${srcFile}"
+if [ $verbose == "true" ]
+then
+ echo "${dbgPref}${compile}" >&2
+fi
+compileRes=$($compile)
+if [ $verbose == "true" ]
+then
+ echo "${dbgPref}${compileRes}" >&2
+fi
+##
+
+#try to link with all specified libraries until successful
+LD_LIBRARY_PATH=${libPath}:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
+rc=1
+for lib in $libs
+do
+ pref=${lib:0:1}
+ lib=${lib:1}
+ if [ $pref == "s" ]
+ then
+ link="${BUILD_DIR}/$LD_SH $OS $ARCH $LD --static --exe ${cOpts} -l$lib -o${exeFile} --objx o ${objFile}"
+ else
+ link="${BUILD_DIR}/$LD_SH $OS $ARCH $LD --exe ${cOpts} -l$lib -o${exeFile} --objx o ${objFile}"
+ fi
+ if [ $verbose == "true" ]
+ then
+ echo ${dbgPref} "$link" >&2
+ fi
+ linkRes=$($link 2>/dev/null)
+ linkRc=$?
+ if [ $verbose == "true" ]
+ then
+ echo ${dbgPref} "$linkRes" >&2
+ fi
+
+ if [ $linkRc == 0 ]
+ then
+ ${exeFile} 2>/dev/null
+ if [ $? == 0 ]
+ then
+ # Success: RC=0, found library's name to stdout
+ rc=0
+ echo $lib
+ break
+ fi
+ fi
+done
+
+#clean up
+rm -f ${srcFile} ${objFile} ${exeFile}
+
+exit $rc
diff --git a/build/mac.arch.sh b/build/mac.arch.sh
new file mode 100755
index 0000000..60ee5d4
--- /dev/null
+++ b/build/mac.arch.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# PPC or Intel?
+ARCH="$(uname -m)"
+if [ "$ARCH" = "x86_64" ]
+then
+ echo $ARCH
+ exit 0
+fi
+
+# the Mac likes to keep its architecture hidden because for all practical
+# purposes, it is both 32 and 64 bit, and makes use of emulation as needed.
+
+# does the hardware support 64-bit mode, even in emulation?
+SYSCTL=/usr/sbin/sysctl
+[ -x /sbin/sysctl ] && SYSCTL=/sbin/sysctl
+CAP64=$($SYSCTL -n hw.cpu64bit_capable)
+
+# real 64-bit hardware has > 32 bits of address space
+PADDR_BITS=$(/usr/sbin/sysctl -n machdep.cpu.address_bits.physical)
+VADDR_BITS=$(/usr/sbin/sysctl -n machdep.cpu.address_bits.virtual)
+
+# to be 64-bit, it's probably sufficient to test the address space
+# but we have the emulation information as well.
+if [ $CAP64 -ne 0 ]
+then
+ if [ $PADDR_BITS -gt 32 ] && [ $VADDR_BITS -gt 32 ]
+ then
+ # call it 64-bit
+ if [ "$ARCH" = "i386" ] || [ "$ARCH" = "x86_64" ]
+ then
+ echo "x86_64"
+ exit 0
+ fi
+
+ if [ "$ARCH" = "Power Macintosh" ]
+ then
+ echo "ppc64"
+ exit 0
+ fi
+
+ # unrecognized
+ echo "unrecognized"
+ exit 5
+ fi
+fi
+
+# call it 32-bit
+if [ "$ARCH" = "i386" ]
+then
+ echo "i386"
+ exit 0
+fi
+
+if [ "$ARCH" = "Power Macintosh" ]
+then
+ echo "ppc32"
+ exit 0
+fi
+
+# unrecognized
+echo "unrecognized"
+exit 5
+
diff --git a/build/make-defs-xf.pl b/build/make-defs-xf.pl
new file mode 100755
index 0000000..a99ac6d
--- /dev/null
+++ b/build/make-defs-xf.pl
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+#============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use IO::Handle;
+use IO::File;
+use IPC::Open2;
+use FileHandle;
+
+my $libname;
+my $libvers;
+my @files;
+
+sub USAGE() {
+ print "Usage: $0 -o <lib name> [-v <lib vers file>] <c source files>\n";
+ exit 1;
+}
+
+sub file_contents($) {
+ local $/;
+ local $_ = shift;
+ my $fh;
+
+ $fh = new IO::File $_, 'r' or die "can't open $_ for read";
+ undef $/;
+ $_ = <$fh>;
+ undef $fh;
+
+ return $_;
+}
+
+sub process_args() {
+ my $i;
+
+ for ($i = 0; $i < scalar(@ARGV); ++$i) {
+ $_ = $ARGV[$i];
+ last unless /^-(.)/;
+ if ($1 eq 'o') {
+ $libname = $ARGV[++$i];
+ }
+ elsif ($1 eq 'v') {
+ $_ = $ARGV[++$i];
+ $_ = file_contents($_);
+ chomp;
+ warn "vers file is empty" if /^$/;
+ if (/(\d+)\.(\d+)\.(\d+)/) {
+ $libvers = "$1.$2";
+ }
+ else {
+ warn "'$_' is not a valid version";
+ }
+ }
+ else {
+ USAGE;
+ }
+ }
+ USAGE unless $libname;
+
+ for (++$i; $i != scalar(@ARGV); ++$i) {
+ push @files, $ARGV[$i];
+ }
+}
+
+sub process_files() {
+ foreach (@files) {
+ my $in = new IO::File $_, 'r' or die "can't open file '$_' for read";
+ {
+ local $_;
+
+ while ($_ = <$in>, defined($_)) {
+ print "\t$1\n" if /^VTRANSFACT_IMPL\s*\(\s*(\w+)/;
+ }
+ }
+ $in->close();
+ }
+}
+
+process_args;
+USAGE unless $libname;
+USAGE unless scalar(@files);
+
+print "LIBRARY $libname\n";
+print "VERSION $libvers\n" if $libvers;
+print "EXPORTS\n";
+process_files();
+
+exit 0;
diff --git a/build/make-defs.pl b/build/make-defs.pl
new file mode 100755
index 0000000..dbff4dd
--- /dev/null
+++ b/build/make-defs.pl
@@ -0,0 +1,247 @@
+#!/usr/bin/perl
+#============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use IO::Handle;
+use IO::File;
+use IPC::Open2;
+use FileHandle;
+
+my $libname;
+my $libvers;
+my $GCC = '';
+my @files;
+
+sub USAGE() {
+ print "Usage: $0 -o <lib name> [-v <lib vers file>] <gcc spec> -- <header files>\n";
+ exit 1;
+}
+
+sub file_contents($) {
+ local $/;
+ local $_ = shift;
+ my $fh;
+
+ $fh = new IO::File $_, 'r' or die "can't open $_ for read";
+ undef $/;
+ $_ = <$fh>;
+ undef $fh;
+
+ return $_;
+}
+
+sub process_args() {
+ my $i;
+
+ for ($i = 0; $i < scalar(@ARGV); ++$i) {
+ $_ = $ARGV[$i];
+ last unless /^-(.)/;
+ if ($1 eq 'o') {
+ $libname = $ARGV[++$i];
+ }
+ elsif ($1 eq 'v') {
+ $_ = $ARGV[++$i];
+ $_ = file_contents($_);
+ chomp;
+ warn "vers file is empty" if /^$/;
+ if (/(\d+)\.(\d+)\.(\d+)/) {
+ $libvers = "$1.$2";
+ }
+ else {
+ warn "'$_' is not a valid version";
+ }
+ }
+ else {
+ USAGE;
+ }
+ }
+# USAGE unless $libname;
+
+ for ( ; $i != scalar(@ARGV); ++$i) {
+ $_ = $ARGV[$i];
+ last if $_ eq '--';
+ $GCC .= "$_ ";
+ }
+
+ for (++$i; $i != scalar(@ARGV); ++$i) {
+ push @files, $ARGV[$i];
+ }
+}
+
+sub next_token($) {
+ local $_;
+ my $src = shift;
+
+ if ($src =~ /^(\s*)/) {
+ $src = substr $src, length($1);
+ }
+ if ($src =~ /^([^ ]+)/) {
+ $_ = $1;
+ if (/^([A-Za-z_][A-Za-z0-9_]+)/) {
+ $_ = $1;
+ $src = substr $src, length($_);
+ return ($src, 'ident', $_);
+ }
+ else {
+ $_ = substr $src, 0, 1;
+ $src = substr $src, 1;
+ return ($src, 'unknown', $_);
+ }
+ }
+ return ($src, undef, undef);
+}
+
+my $id;
+my $pt_st = 0;
+my $visibility = 'extern';
+
+sub process_token($$) {
+ my $type = shift;
+ my $tok = shift;
+
+ if ($tok eq ';' || $tok eq ',') {
+ if (($pt_st == 4 || $pt_st == 5) && $visibility eq 'extern') {
+ if ($id) {
+ print "\t$id\n";
+ }
+ }
+ $id = undef;
+ if ($tok eq ';') {
+ $pt_st = 0;
+ $visibility = 'extern';
+ }
+ return;
+ }
+ if ($pt_st == 0) {
+ unless ($type eq 'ident') {
+ $pt_st = 1;
+ return;
+ }
+ if ($tok eq 'extern' || $tok eq 'static') {
+ $visibility = $tok;
+ }
+ elsif ($tok eq 'typedef') {
+ $pt_st = 1;
+ }
+ else {
+ if ($tok eq 'const' || $tok eq 'volatile') {
+ $pt_st = 2;
+ }
+ else {
+ $pt_st = ($tok eq 'struct' || $tok eq 'class' || $tok eq 'union' || $tok eq 'enum') ? 3 : 4;
+ }
+ }
+ return;
+ }
+ if ($pt_st == 1) {
+ return;
+ }
+ if ($pt_st == 2) {
+ unless ($type eq 'ident') {
+ $pt_st = 1;
+ return;
+ }
+ $pt_st = ($tok eq 'struct' || $tok eq 'class' || $tok eq 'union' || $tok eq 'enum') ? 3 : 4;
+ return;
+ }
+ if ($pt_st == 3) {
+ unless ($type eq 'ident') {
+ $pt_st = 1;
+ return;
+ }
+ $pt_st = 4;
+ return;
+ }
+ if ($pt_st == 4) {
+ if ($tok eq '__attribute__') {
+ $pt_st = 5;
+ return;
+ }
+ $id = $tok if $type eq 'ident';
+ return;
+ }
+ if ($pt_st == 5) {
+ return;
+ }
+ warn 'unpossible';
+}
+
+my $level = 0;
+
+sub parse($$);
+sub parse($$) {
+ my $src = shift;
+ my $end = shift;
+ my $tok;
+ my $type;
+
+ ++$level;
+ while (($src, $type, $tok) = next_token($src), defined($tok)) {
+ last if ($tok eq $end);
+ process_token($type, $tok) if ($level == 1);
+ $src = parse($src, ')') if ($tok eq '(');
+ $src = parse($src, '}') if ($tok eq '{');
+ $src = parse($src, ']') if ($tok eq '[');
+ }
+ --$level;
+ return $src;
+}
+
+sub process_files() {
+ my $gcc_out;
+ my $gcc_in;
+ my $src = '';
+
+ open2($gcc_in, $gcc_out, "$GCC") or die "can't run preprocessor $GCC";
+ foreach (@files) {
+ next unless $_;
+ $_ = file_contents($_);
+ next unless $_;
+ s/^\#include\s.+$//gm unless /weak\.h/;
+ $gcc_out->print($_);
+ }
+
+ undef $gcc_out; # else gcc won't produce output
+
+ while ($_ = <$gcc_in>, defined($_)) {
+ next if /^\s*$/;
+ next if /^#/;
+ chomp;
+ $src .= " $_";
+ }
+ return $src;
+}
+
+process_args;
+USAGE unless $GCC;
+USAGE unless scalar(@files);
+
+if (defined $libname) {
+ print "LIBRARY $libname\n";
+ print "VERSION $libvers\n" if $libvers;
+ print "EXPORTS\n";
+ }
+parse(process_files(), '');
+
+exit 0;
diff --git a/build/make-vers-inc.sh b/build/make-vers-inc.sh
new file mode 100755
index 0000000..daff98c
--- /dev/null
+++ b/build/make-vers-inc.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+# capture input
+if [ $# -eq 1 ]
+then
+ VERSION=$1
+ DEFINE=$(basename $VERSION)
+ DEFINE=$(echo $DEFINE | tr '[a-z].-' '[A-Z]__')
+elif [ $# -ne 2 ]
+then
+ echo "#error in makefile"
+ exit 1
+else
+ DEFINE=$1
+ VERSION=$2
+fi
+
+# split the version into separate integers
+SPLIT_VERS="$(cat $VERSION | tr '.' ' ')"
+
+# issue a single line define
+echo "#define $DEFINE $(printf 0x%02X%02X%04X $SPLIT_VERS)"
diff --git a/build/run_remotely.sh b/build/run_remotely.sh
new file mode 100755
index 0000000..11169f5
--- /dev/null
+++ b/build/run_remotely.sh
@@ -0,0 +1,124 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+VERBOSE=
+if [ "$VERBOSE" != "" ] ; then echo "$0 $*"; fi
+
+# ===========================================================================
+# run a command from a list on a (Windows) build server
+# $1 - path to proxy_exec
+# $2 - server name
+# $3 - server port
+# $4 - server path mapped to a client dir (e.g. Z:)
+# $5 - client path to the dir mapped on the server
+# $6 - server path to the working directory (e.g. Z:internal\asm-trace)
+# $7 - output directory from server's prespective (e.g. Z:\win\lib)
+# $8 - output directory from client's perspective (e.g. internal/asm-trace/win/lib)
+# $9 - command (can be a single name e.g. cl, or a client path which will be translated into a server path)
+# $... - arguments
+
+#TODO: translate command name to id
+
+PROXY_TOOL=$1
+if [ ! -e $PROXY_TOOL ]
+then
+ echo "$0 $*"
+ echo "$0: proxy tool ($1) is not found."
+ exit 5
+fi
+
+RHOST=$2
+RPORT=$3
+RHOME=$4
+LHOME=$5
+WORKDIR=$6
+ROUTDIR=$7
+LOUTDIR=$8
+CMD=$9
+shift 9
+ARGS=$*
+
+if [ "$VERBOSE" != "" ]
+then
+ echo "PROXY_TOOL=$PROXY_TOOL"
+ echo "RHOST =$RHOST "
+ echo "RPORT =$RPORT "
+ echo "RHOME =$RHOME "
+ echo "LHOME =$LHOME "
+ echo "WORKDIR =$WORKDIR "
+ echo "ROUTDIR =$ROUTDIR "
+ echo "LOUTDIR =$LOUTDIR "
+ echo "CMD =$CMD "
+ echo "ARGS =$ARGS "
+fi
+
+if [ $(eval "dirname \"$CMD\"") != "." ]
+then # executable is located on the client; translate path for the server
+ if [ "$CMD" != "${CMD#$LHOME}" ]
+ then
+ RCMD="$RHOME${CMD#$LHOME}.exe"
+ elif [ "$CMD" != "${CMD#$LOUTDIR}" ]
+ then
+ RCMD="$ROUTDIR${CMD#$LOUTDIR}.exe"
+ else
+ RCMD="$CMD.exe"
+ fi
+
+ if [ "${WORKDIR}" == "." ]
+ then # run in the directory of the executable
+ # use the original CMD
+ WORKDIR="${CMD%$(basename $CMD)}"
+ fi
+else # executable is located on the server
+ # workdir path translation is expected of the caller
+ RCMD=$CMD
+fi
+
+# translate WORKDIR
+if [ "$WORKDIR" != "${WORKDIR#$LHOME}" ]
+then
+ WORKDIR="$RHOME${WORKDIR#$LHOME}"
+elif [ "$WORKDIR" != "${WORKDIR#$LOUTDIR}" ]
+then
+ WORKDIR="$ROUTDIR${WORKDIR#$LOUTDIR}"
+fi
+
+if [ "$VERBOSE" != "" ] ; then echo "RCMD=$RCMD"; fi
+
+#translate slashes
+RCMD="$(echo $RCMD | tr '/' '\\')"
+WORKDIR="$(echo $WORKDIR | tr '/' '\\')"
+
+#extra quotes in case command's filename contains spaces
+if [[ "$RCMD" != "${RCMD/ /}" ]] ; then RCMD="\"$RCMD\""; fi
+
+if [ "$VERBOSE" != "" ] ; then echo "$PROXY_TOOL -D $WORKDIR -S $RHOST -P $RPORT"; fi
+if [ "$VERBOSE" != "" ] ; then echo "sending to stdin: $RCMD $ARGS"; fi
+
+echo "$RCMD $ARGS" | $PROXY_TOOL -D $WORKDIR -S $RHOST -P $RPORT
+exit $?
+
+
+
+
diff --git a/build/scm-collect.sh b/build/scm-collect.sh
new file mode 100755
index 0000000..6284c31
--- /dev/null
+++ b/build/scm-collect.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+OBJ_FILES="$1"
+LIB_FILES="$2"
+
+for f in $OBJ_FILES $LIB_FILES
+do
+ if [ ! -f $f.md5 ]
+ then
+ echo "$f.md5 not found" > /dev/stderr
+ exit 5
+ elif [ ! -r $f.md5 ]
+ then
+ echo "$f.md5 not readable" > /dev/stderr
+ exit 5
+ else
+ cat $f.md5
+ fi
+done
diff --git a/build/scm.sh b/build/scm.sh
new file mode 100755
index 0000000..e872ea3
--- /dev/null
+++ b/build/scm.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+BUILD_DIR="$(dirname $0)"
+TOP="$(dirname $BUILD_DIR)"
+SCM_DIR="$TOP/scm"
+
+MODULE_NAME="$1"
+CURMD5="$2"
+VERS_FILE="$3"
+
+# if the given versfile does not exist, bail out with no error
+[ -f "$VERS_FILE" ] || exit 0
+
+echo "*** start of scm-handler for $MODULE_NAME ***************************"
+
+#prepare the filenames we will use for the version-increment
+LOGFILE="$SCM_DIR/scm.log"
+PREVMD5="$SCM_DIR/$MODULE_NAME.pub"
+CANDMD5="$SCM_DIR/$MODULE_NAME.cand"
+
+# write a log entry, that a scm-run for this module is executed
+echo -e "\n$(date) ************* scm-run for $MODULE_NAME" >> $LOGFILE
+
+# if the current md5-file does not exist, bail out with error
+if [ ! -f "$CURMD5" ]
+then
+ MSG="current md5-file ($CURMD5) does not exist! SCM RUN TERMINATED!"
+ echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+ exit 6
+fi
+
+
+# check if the current md5-file has the same content as in the
+# candidate md5-file, if yes bail out without error
+if diff -q "$CURMD5" "$CANDMD5" > /dev/null 2>&1
+then
+ MSG="cand. and curr. md5-files are equal, nothing to do!"
+echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+ exit 0
+fi
+
+# check if the candidate md5-file does exist
+if [ ! -f "$CANDMD5" ]
+then
+ MSG="candidate md5-file does not exist."
+ echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+
+ # if candidate-md5-file does not exist
+ # the last published too should not exist
+ if ! cp "$CURMD5" "$CANDMD5"
+ then
+ STATUS=$?
+ MSG="unable to create the candidate-md5-file"
+ echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+ exit $STATUS
+ fi
+
+ # turn this on later
+ cvs add "$CANDMD5"
+ exit 0
+fi
+
+
+# if we reach this line, cand. and curr md5-file do exist
+# and differ in content
+MSG="cand. and curr. md5-files are different."
+echo "$MSG"
+echo "$MSG" >> $LOGFILE
+
+# check if the current md5-file has the same content as in the
+# previously published md5-file, if yes bail out without error
+if diff -q "$CANDMD5" "$PREVMD5" > /dev/null 2>&1
+then
+ CAND_PREV_EQUAL=1
+else
+ CAND_PREV_EQUAL=0
+fi
+
+# if the candidate-md5-file does exist,
+# copy the current md5-file into the candidate-md5-file
+if ! cp "$CURMD5" "$CANDMD5"
+then
+ STATUS=$?
+ MSG="unable to update the candidate-md5-file"
+ echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+ exit $STATUS
+fi
+
+if [ $CAND_PREV_EQUAL -eq 0 ]
+then
+ MSG="candidate and prev. published md5-files differ, nothing to do!"
+echo "$MSG"
+ echo "$MSG" >> $LOGFILE
+ exit
+fi
+
+# if a candidate file does not exist, the version has to be incremented
+OLDVERS=$(cat "$VERS_FILE")
+NEWVERS=$($BUILD_DIR/increment-release.sh $OLDVERS)
+MSG="version incremented from $OLDVERS to $NEWVERS"
+echo "$MSG"
+echo "$MSG" >> $LOGFILE
+echo $NEWVERS > $VERS_FILE
+
+# trigger a rebuild ( of this module )...
+touch "$BUILD_DIR/version-rebuild"
+
+echo "*** end of scm-handler for $MODULE_NAME *****************************"
diff --git a/build/scm.txt b/build/scm.txt
new file mode 100644
index 0000000..aa4f73e
--- /dev/null
+++ b/build/scm.txt
@@ -0,0 +1,117 @@
+SCM-Build
+---------
+
+(scm = software configuration management ?)
+
+(1) "scm" is a '.phony' target, implemented in Makefile.env
+ ( just like "out", "CC", "GCC", "ICC", "VC++", "debug",
+ "profile", "release", "purify", "purecov" )
+
+
+(2) "make scm" triggers the scm-target in Makefile.env,
+ the actions are:
+
+ @ echo scm > $(TOP)/build/BUILD.$(OS)
+ @ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env rebuild-dirlinks
+
+ - no actual compilation/linkage is performed
+ - the string "scm" is written into the build-file: build/BUILD.linux for instance
+ switching the build-system into "scm-mode"
+ - the directory links are rebuild (why?)
+
+
+(3) if the build-system is in "scm-mode", Makefile.env configures
+ makefile-variables like that:
+
+ ifeq (scm,$(BUILD))
+ DEBUG := -DNDEBUG
+ BUILDTYPE = rel
+ CHECKSUM := --checksum
+ endif
+
+ that means:
+ - a build in "scm-mode" is performed like a release-build
+ - the makefile-variable CHECKSUM is set to the value "--checksum"
+
+
+(4) the makefile-variable CHECKSUM is used in these Makefiles:
+ Makefile.cc, Makefile.gcc, Makefile.icc, Makefile.vc++
+ these 4 Makefiles add $CHECKSUM to the parameter-list of
+ CC, CP, LD and LP ( the platform specific compile- and link-scripts )
+
+
+(5) $CC and $CP gets called, because Makefile.rules do use them in their
+ list of rules that build the different kinds of object-files
+
+
+(6) $LD gets called, because it appears in the Makefile of every single
+ module, in the rule to build the final libs/binaries
+ $LP looks like never called by our build-system ( we do not link c++ targets ?)
+
+
+(7) the compiler-scripts cc.sh, win-cc.sh and sun-cc.sh pick up the "--checksum"
+ parameter and set the shell-variable CHECKSUM to 0 or 1
+
+
+(8) the cc.sh - script:
+ - ( in scm-mode ) performs a check that the target is not
+ undefined or malformed
+
+ - calls the compiler to build the object-file
+
+ ( in scm-mode only )
+ - calls: strip $TARG.$OBJX -o $TARG.stripped.$OBJX
+ to strip away the symbol-names: renaming a variable
+ does not create a different checksum after that
+ - calls: MD5RES=`md5sum -b $TARG.stripped.$OBJX`
+ create a md5-sum of the stripped obj-file
+ - calls: rm -f "$TARG.stripped.$OBJX" || true
+ to remove the stripped obj-file
+ - calls: MD5VALUE=${MD5RES:0:32}
+ to pick the md5-sum only ( not the following filename )
+ - calls: echo "$TARG.$OBJX=$MD5VALUE" > "$TARG.md5"
+ creates a md5-file for every obj-file, that contains
+ the name of the obj-file followed by it's md5-sum
+
+(9) the ld.sh - script:
+ - to perform the link operation the ld.sh-script calls this script:
+ "$SCRIPT_BASE.$OS.$TYPE.sh"
+ ( which becomes: ld.linux.slib.sh / ld.linux.dlib.sh /
+ ld.linux.exe.sh for instance )
+
+(10) the ld.linux.slib.sh / ld.linux.dlib.sh / ld.linux.exe.sh - scripts:
+ - define a shell-variable "SLIBS"
+ - accumulate the static-libs the target depends on in this shell-variable
+ - after producing the target, call the script: "scm-collect.sh"
+ - parameter to this call is the list of obj-file ($OBJS) and
+ the static dependencies ($SLIBS)
+
+(11) the scm-collect.sh - script:
+ - loops through the given obj-files and static dependencies
+ - for every item in the list it looks for its corresponding md5-file
+ - if the file exists and is readable
+ - prints the content of the file to stdout
+
+(12) back in the ld.linux.slib.sh / ld.linux.dlib.sh / ld.linux.exe.sh - scripts:
+ - pipe the output of the scm-collect.sh - script
+ through "sort -u" and redirect the output to "$TARG.md5"
+ ( sort -u to makes the file canonical and removes double dependencies )
+ - this creates a md5-file for every lib/executable built
+ in the output-directory of the module
+ (for the kfs-module for instance the files "libkfs.a.md5" and
+ "libkfs.so.md5" are created in "output/centos/scm/gcc/x86_64/lib"
+ - these files are the "current-md5-file" for the scm.sh-script
+
+(13) back in the ld.sh - script:
+ - after creating the soft-links for the lib/executable
+ - if in scm-mode and building for linux,
+ - if building a dynamic-lib or an executable,
+ - the "scm.sh" - script is called
+ - the parameters are: module-name, current-md5-file and version-file
+
+(14) the scm.sh - script:
+ - creates a scm-dir underneath the build-dir (if it does not exist)
+ - checks if the current-md5-file exists ( exits with error if not )
+ - compares the current-md5-file with the candidate-md5-file
+ ( exits with exit-code=0 if they are identical = nothing to do )
+ -
\ No newline at end of file
diff --git a/build/sra-dflt-schema.sh b/build/sra-dflt-schema.sh
new file mode 100755
index 0000000..78c89ad
--- /dev/null
+++ b/build/sra-dflt-schema.sh
@@ -0,0 +1,163 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# prepare script name
+SELF_NAME="$(basename $0)"
+SCRIPT_BASE="${0%.sh}"
+
+# os
+OS="$1"
+shift
+
+# binary compiler
+CC="$1"
+shift
+
+# everything except windows is fine as-is
+if [[ "$OS" != "win" && "$OS" != "rwin" ]]
+then
+ echo "$CC $*"
+ $CC $*
+ exit $?
+fi
+
+if [[ "$OS" == "rwin" ]]
+then # for rwin, $CC is a multi-word string; extract server location data from it:
+# $(TOP)/build/run_remotely.sh $(PROXY_TOOL) $(RHOST) $(RPORT) $(RHOME) $(LHOME) $(TOP) $(ROUTDIR) $(LOUTDIR) $(SCHEMA_EXE)
+ PARMS=($CC)
+ RHOME=${PARMS[4]}
+ LHOME=${PARMS[5]}
+ ROUTDIR=${PARMS[7]}
+ LOUTDIR=${PARMS[8]}
+fi
+
+# state
+unset ARGS
+unset DEPENDENCIES
+unset DEPTARG
+unset TARG
+
+function convert_src_path
+{
+ if [[ "$OS" != "rwin" ]]
+ then
+ convert_path_result="$(cygpath -w $1)"
+ elif [ "$1" != "${1#$LHOME}" ]
+ then
+ convert_path_result="$RHOME${1#$LHOME}"
+ convert_path_result="$(echo $convert_path_result | tr '/' '\\')"
+ else
+ convert_path_result="$1"
+ fi
+}
+function convert_out_path
+{
+ if [[ "$OS" != "rwin" ]]
+ then
+ convert_path_result="$(cygpath -w $1)"
+ elif [ "$1" != "${1#$LOUTDIR}" ]
+ then
+ convert_path_result="$ROUTDIR${1#$LOUTDIR}"
+ convert_path_result="$(echo $convert_path_result | tr '/' '\\')"
+ else
+ convert_path_result="$1"
+ fi
+}
+
+
+# process parameters for windows
+while [ $# -ne 0 ]
+do
+
+ case "$1" in
+ -o*)
+ ARG="${1#-o}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+ TARG="$ARG"
+ convert_out_path $ARG
+ ARGS="$ARGS -o${convert_path_result}"
+ ;;
+
+ -I*)
+ ARG="${1#-I}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+
+ convert_src_path $ARG
+ ARGS="$ARGS -I${convert_path_result}"
+ ;;
+
+ -T*)
+ ARG="${1#-T}"
+ if [ "$ARG" = "" ]
+ then
+ ARG="$2"
+ shift
+ fi
+ DEPTARG="$ARG"
+ DEPENDENCIES=1
+ convert_out_path $ARG
+ ARGS="$ARGS -T${convert_path_result}"
+ ;;
+
+ -L*)
+ LHOME="${1#-L}"
+ ;;
+ -R*)
+ RHOME="${1#-R}"
+ ;;
+
+ *)
+ convert_src_path $1
+ ARGS="$ARGS ${convert_path_result}"
+ ;;
+
+ esac
+
+ shift
+
+done
+
+echo "$CC $ARGS"
+$CC $ARGS
+STATUS=$?
+if [[ ${STATUS} != 0 ]]
+then
+ rm -f $TARG $DEPTARG
+ exit ${STATUS}
+fi
+
+if [ $DEPENDENCIES -eq 1 ]
+then
+ # fix this
+ rm -f $DEPTARG
+fi
diff --git a/build/tag-module.sh b/build/tag-module.sh
new file mode 100755
index 0000000..12fb498
--- /dev/null
+++ b/build/tag-module.sh
@@ -0,0 +1,213 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# check for '-F' switch
+if [ "$1" = "-F" ]
+then
+ CVSTAG="cvs tag $1"
+ shift 1
+else
+ CVSTAG="cvs tag"
+fi
+
+# check for '-V' switch
+if [ "$1" = "-V" ]
+then
+ VERSFILE="$2"
+ shift 2
+else
+ VERSFILE=""
+fi
+
+# gather parameters
+TOP=$(dirname $0)
+cd $TOP/..
+TOP=$(pwd)
+MODULE=$1
+LIBRARY=$2
+shift 2
+
+# version file
+if [ "$VERSFILE" = "" ]
+then
+ if [ ! -r $MODULE/$LIBRARY.vers ]
+ then
+ echo "cannot access $MODULE/$LIBRARY.vers"
+ exit 1
+ fi
+
+ VERSFILE="$MODULE/$LIBRARY.vers"
+fi
+
+# version
+VERSION=$(cat $VERSFILE)
+
+# build parameters
+BUILD=$(cat ./build/BUILD)
+COMP=$(cat ./build/COMP)
+OUTDIR=$(cat ./build/OUTDIR)
+cd $OUTDIR
+OUTDIR=$(pwd)
+cd -
+
+# architecture
+ARCH=$(uname -m)
+if [ "$ARCH" = "i486" ] || [ "$ARCH" = "i586" ] || [ "$ARCH" = "i686" ]
+then
+ ARCH=i386
+fi
+
+# object directory
+OBJDIR=$OUTDIR/$BUILD/$COMP/$ARCH/obj/$MODULE
+if [ ! -d $OBJDIR ]
+then
+ echo "cannot access $OBJDIR"
+ exit 1
+fi
+
+# tag name
+TAGVERS=$(echo $VERSION | tr '.' '_')
+if [ "$BUILD" = "rel" ]
+then
+ TAG="$LIBRARY-$TAGVERS"
+else
+ TAG="$BUILD-$LIBRARY-$TAGVERS"
+fi
+
+# include make files in sources
+SOURCES="$(find build -name 'Makefile*' -a ! -name '*~')"
+if [ -f $MODULE/Makefile ]
+then
+ SOURCES="$SOURCES $MODULE/Makefile"
+fi
+
+# also include the version file if within the module
+if [ "$VERSFILE" = "$MODULE/$LIBRARY.vers" ]
+then
+ SOURCES="$SOURCES $VERSFILE"
+fi
+
+# allow direct specification of source files
+if [ "$1" = "-S" ]
+then
+ shift
+
+ # take list of sources as given
+ for sfile in $*
+ do
+
+ # source file must be within our tree
+ if [ "$sfile" = "${sfile#$TOP}" ]
+ then
+
+ # get path portion of source file
+ spath=$(dirname $sfile)
+
+ # look for absolute or project relative
+ if [ -f "$sfile" ]
+ then
+ cd "$spath"
+ spath="$(pwd)"
+ cd -
+
+ # look for module relative
+ elif [ -f "$MODULE/$sfile" ]
+ then
+ cd "$MODULE/$spath"
+ spath="$(pwd)"
+ cd -
+ fi
+
+ # retest path
+ if [ "$spath" = "${spath#$TOP}" ]
+ then
+ echo "source file '$sfile' is not within project"
+ exit 1
+ fi
+
+ # create full path
+ sfile="$spath/$(basename $sfile)"
+ fi
+
+ # crop it
+ sfile="${sfile#$TOP/}"
+ SOURCES="$SOURCES $sfile"
+
+ done
+
+else
+
+ # derive source files from dependency files
+ for ofile in $*
+ do
+ # create dependency file name
+ dfile=${ofile%o}d
+
+ # test for it
+ if [ ! -r $OBJDIR/$dfile ]
+ then
+ echo "cannot locate dependency file '$OBJDIR/$dfile'"
+ exit 1
+ fi
+
+ # read it
+ for sfile in $(cat $OBJDIR/$dfile)
+ do
+ # source file must be within our tree
+ # and should not be a generated version include
+ if [ "$sfile" != "${sfile#$TOP}" ] && [ "$sfile" = "${sfile%.vers.h}" ]
+ then
+ # crop it
+ sfile="${sfile#$TOP/}"
+
+ # special case include files in 'inc'
+ # in order to catch all configurations
+ if [ "$sfile" != "${sfile#inc/}" ]
+ then
+ sfile=$(basename $sfile)
+ sfile="$(find inc -name $sfile)"
+ fi
+
+ SOURCES="$SOURCES $sfile"
+ fi
+
+ done
+
+ done
+fi
+
+# must have source files
+if [ "$SOURCES" = "" ]
+then
+ echo "no source files could be found for $LIBRARY"
+ exit 1
+fi
+
+# reduce them to an unique set
+SOURCES="$(echo "$SOURCES" | tr ' ' '\n' | sort -u | tr '\n' ' ')"
+
+# apply tag
+echo -e "\ntagging $TAG within $MODULE"
+$CVSTAG $TAG $SOURCES
diff --git a/build/valgrind.suppress b/build/valgrind.suppress
new file mode 100644
index 0000000..002d332
--- /dev/null
+++ b/build/valgrind.suppress
@@ -0,0 +1,6 @@
+{
+ vt_cache
+ Memcheck:Leak
+ fun:calloc
+ fun:_ZN3ngs7Resolve*
+}
diff --git a/build/wait_for_file.sh b/build/wait_for_file.sh
new file mode 100755
index 0000000..dd6059e
--- /dev/null
+++ b/build/wait_for_file.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# wait for a file to become available (used in remote builds to handle delays introduced by the network file system)
+# $1 - file to wait for
+# $2 - timeout (seconds), optional, default 120s
+# return codes:
+# 0 ok,
+# 1 timed out,
+# 2 no file specified,
+# 3 timeout not numeric
+
+if [ "$1" != "" ]
+then
+ FILE=$1
+else
+ echo "$0 $*: no file specified" >&2
+ exit 2
+fi
+
+if [ "$2" == "" ]
+then
+ TIMEOUT=120
+elif [[ $2 =~ ([0-9])+ ]]
+then
+ TIMEOUT=$2
+else
+ echo "$0 $*: timeout not a number" >&2
+ exit 3
+fi
+
+for (( i=0; i < ${TIMEOUT}; i++ ))
+do
+ # give nfs a nudge
+ ls $(dirname $FILE) >/dev/null
+ if [ -e ${FILE} ]
+ then
+ exit 0
+ fi
+ echo "waiting for '$FILE' ..."
+ sleep 1s
+done
+exit 1
diff --git a/configure b/configure
new file mode 100755
index 0000000..baa556f
--- /dev/null
+++ b/configure
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+ then
+ echo configure: error: configure should be run as ./configure
+ exit 1
+fi
+
+if [ "$FILENAME" != configure -a ! -s setup/konfigure.perl ]
+ then
+ echo configure: error: configure should be run as ./configure
+else
+ perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+ echo >&2 "configure: error: perl not found."; exit 1; }
+
+ cd $CURDIR/setup
+ perl -w konfigure.perl "$@"
+fi
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index ca78035..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index aad2b24..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri May 13 14:00:35 EDT 2016
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip
diff --git a/gradlew b/gradlew
deleted file mode 100755
index 27309d9..0000000
--- a/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/scripts/explain_sam_flags.py b/scripts/explain_sam_flags.py
deleted file mode 100755
index cb6ad02..0000000
--- a/scripts/explain_sam_flags.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env python
-
-# The MIT License
-#
-# Copyright (c) $today.year The Broad Institute
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-#
-# $Header$
-
-"""usage %prog decimal-flag [decimal-flag...]
-
-Explain each flag on the command line in plain English
-"""
-
-from __future__ import division
-import sys
-
-lstFlags = [
- ("read paired", 0x1),
- ("read mapped in proper pair", 0x2),
- ("read unmapped", 0x4),
- ("mate unmapped", 0x8),
- ("read reverse strand", 0x10),
- ("mate reverse strand", 0x20),
- ("first in pair", 0x40),
- ("second in pair", 0x80),
- ("not primary alignment", 0x100),
- ("read fails platform/vendor quality checks", 0x200),
- ("read is PCR or optical duplicate", 0x400),
- ("supplementary alignment", 0x800)
- ]
-
-
-def explain_sam_flags(iFlags):
- print iFlags, ":"
- for strFlagName, iMask in lstFlags:
- if iFlags & iMask:
- print "\t" + strFlagName
-
-def main(argv=None):
- if argv is None:
- argv = sys.argv
-
- for strArg in argv[1:]:
- explain_sam_flags(int(strArg))
-
-if __name__ == "__main__":
- sys.exit(main())
-
diff --git a/scripts/release_picard.sh b/scripts/release_picard.sh
deleted file mode 100755
index 732234a..0000000
--- a/scripts/release_picard.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#! /bin/bash
-
-# The MIT License
-#
-# Copyright (c) $today.year The Broad Institute
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-
-PROGNAME=`basename $0`
-USERNAME=alecw
-
-function usage () {
- echo "USAGE: $PROGNAME <release-id>" >&2
- echo "Tags Github Picard source, checks out and builds sources, uploads build results to Sourceforge.">&2
- echo "-t <tmpdir> Build in <tmpdir>. Default: $TMPDIR." >&2
- echo "-u <sourceforge-user> Sourceforge username. Default: $USERNAME." >&2
-}
-
-function tag_exists() {
- git tag | grep -q "$1$"
- if test $? = 0
- then return 0
- else return 1
- fi
-}
-
-function remote_does_not_exist() {
- git ls-remote $1 2>/dev/null 1>/dev/null
- if test $? = 0
- then return 1
- else return 0
- fi
-}
-
-function remote_tag_does_not_exist() {
- git ls-remote --tags $2 | grep -q "$1$";
- if test $? = 0
- then return 0
- else return 1
- fi
-}
-
-set -e
-
-while getopts "ht:u:" options; do
- case $options in
- u ) USERNAME=$OPTARG;;
- t ) TMPDIR=$OPTARG;;
- h ) usage;;
- \? ) usage
- exit 1;;
- * ) usage
- exit 1;;
-
- esac
-done
-shift $(($OPTIND - 1))
-
-if (( $# != 1 ))
- then echo "ERROR: Incorrect number of arguments." >&2
- usage
- exit 1
-fi
-
-if [[ x"$EDITOR" == x ]]
-then echo "EDITOR environment variable must be set." >&2
- exit 1
-fi
-
-# Require actual Java 1.6. This is not necessary for compiling, because can run 1.7 with -target 1.6,
-# but this is necessary in order to force unit tests to run with 1.6.
-(echo $JAVA_HOME | fgrep -q 1.6 ) || { echo "JAVA_HOME $JAVA_HOME is not 1.6" ; exit 1; }
-java_version=`java -version 2>&1 | fgrep -i version`
-(echo $java_version | fgrep -q 1.6. ) || { echo "java -version: $java_version is not 1.6"; exit 1; }
-
-GITROOT=git at github.com:samtools/htsjdk.git
-REMOTE=origin
-
-RELEASE_ID=$1
-
-# Since releases are lexically sorted, need to filter in order to have 1.1xx be at the bottom.
-PREV_RELEASE_ID=`git ls-remote --tags | grep -v "{}$" | awk '{print $2}' | sed -e "s_.*/__g" | egrep '[.]\d\d\d' | tail -1`
-
-if [[ -e $TMPDIR/htsjdk ]]
-then echo "$TMPDIR/htsjdk already exists. Please remove or specify a different TMPDIR." >&2
- exit 1
-fi
-cd $TMPDIR
-
-# clone
-git clone $GITROOT htsjdk
-cd htsjdk
-ant clean # Shouldn't be necessary, but no harm
-
-# tag must not exist
-if tag_exists $RELEASE_ID
-then echo "ERROR: Tag $RELEASE_ID locally already exists"
- exit 1
-fi
-
-# remote must exist
-if remote_does_not_exist $REMOTE
-then echo "ERROR: Remote $REMOTE does not exist"
- exit 1
-fi
-
-# tag at remote must not exist
-if remote_tag_does_not_exist $RELEASE_ID $REMOTE
-then echo "ERROR: Tag $RELEASE_ID at remote $REMOTE already exists"
- exit 1
-fi
-
-# tag the branch locally then push to remote
-echo Tagging master as $tag and pushing the tag to $remote
-# NB: we could use annotated tags in the future to store release notes, etc.
-git tag $tag
-git push $remote $tag # TODO: should we check this return value in case someone made a tag since we last checked?
-
-ant -lib lib/ant test
-
-ant -lib lib/ant clean all javadoc
-
-mkdir -p deploy/picard-tools/$RELEASE_ID
-
-mkdir -p deploy/htsjdk/$RELEASE_ID
-cp dist/htsjdk-$RELEASE_ID.jar deploy/htsjdk/$RELEASE_ID/
-
-# Make all files to be pushed to Sourceforge writable by group so that another Picard admin can overwrite them.
-
-chmod -R gu+rw javadoc deploy dist
-
-find javadoc deploy dist -type d -exec chmod g+s '{}' ';'
-
-scp -p -r javadoc $USERNAME,picard at web.sourceforge.net:htdocs
-
-cd deploy
-scp -p -r htsjdk/$RELEASE_ID $USERNAME,picard at web.sourceforge.net:/home/frs/project/p/pi/picard/htsjdk/
diff --git a/setup/install b/setup/install
new file mode 100755
index 0000000..4dcf8cf
--- /dev/null
+++ b/setup/install
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+ then
+ echo error: install should be run as ./install
+ exit 1
+fi
+
+if [ "$FILENAME" != install -a ! -s install.perl ]
+ then
+ echo error: install should be run as ./install
+else
+ perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+ echo >&2 "error: perl not found."; exit 1; }
+
+ cd $CURDIR
+ perl -w ./install.perl "$@"
+fi
diff --git a/setup/install.perl b/setup/install.perl
new file mode 100644
index 0000000..fa2bae6
--- /dev/null
+++ b/setup/install.perl
@@ -0,0 +1,1329 @@
+################################################################################
+
+use strict;
+
+require 'install.prl';
+
+use Config;
+use Cwd "abs_path";
+use File::Copy "copy";
+use File::Copy::Recursive qw(dircopy);
+use File::Path "make_path";
+use FindBin qw($Bin);
+use Getopt::Long "GetOptions";
+
+my ($OS, $MAKING, %INSTALLED_LIBS);
+{
+ my $file = 'os.prl';
+ if (-e $file) {
+ require $file;
+ $OS = OS();
+ } else {
+ ++$MAKING;
+ }
+}
+
+my %HAVE = HAVE();
+BINS() if ($HAVE{BINS});
+if ($HAVE{LIBS}) {
+ ++$HAVE{INCLUDES};
+ LIBS();
+}
+if ($HAVE{INCLUDES} || $HAVE{USR_INCLUDES}) {
+ die "no INCLUDES" unless INCLUDES();
+}
+die "no CONFIG_OUT" unless CONFIG_OUT();
+
+my @bits;
+my @options = ( 'debug', 'examplesdir=s', 'force', 'help',
+ 'includedir=s', 'no-create', 'prefix=s', 'root=s', );
+push @options, 'oldincludedir=s' if ($HAVE{USR_INCLUDES});
+if ($HAVE{JAR}) {
+ push @options, 'jardir=s';
+ if (-e "$Bin/../jar") {
+ ++$HAVE{LIBS};
+ $_{JARDIR} = expand_path("$Bin/../jar");
+ }
+} elsif ($HAVE{PYTHON} && ! $MAKING) {
+ ++$HAVE{LIBS};
+}
+if (! $MAKING && ($HAVE{JAR} || $HAVE{PYTHON})) {
+ ++$HAVE{TWO_LIBS};
+ push @options, 'ngslibdir=s', 'vdblibdir=s';
+}
+push @options, 'bindir=s' if ($HAVE{BINS});
+push @options, 'bits=s' => \@bits, 'libdir=s' if ($HAVE{LIBS});
+
+my %OPT;
+unless (GetOptions(\%OPT, @options)) {
+ print "install: error\n";
+ exit 1;
+}
+ at bits = split(/,/,join(',', at bits));
+foreach (@bits) {
+ unless (/^32$/ || /^64$/) {
+ print "install: error: bad bits option argument value\n";
+ exit 1;
+ }
+}
+if ($#bits > 0) {
+ foreach (qw(bindir libdir ngslibdir vdblibdir)) {
+ if ($OPT{$_}) {
+ print "install: error: cannot supply multiple bits arguments "
+ . "when $_ argument is provided\n";
+ exit 1;
+ }
+ }
+}
+
+$OPT{root} = expand_path($OPT{root}) if ($OPT{root});
+
+prepare();
+
+my $LINUX_ROOT;
+++$LINUX_ROOT if (linux_root());
+my $ROOT = '';
+if ($OPT{root}) {
+ $ROOT = "$OPT{root}/root";
+ ++$LINUX_ROOT;
+ foreach ("$ROOT/usr/include", "$ROOT/etc/profile.d") {
+ unless (-e $_) {
+ print "mkdir -p $_... ";
+ eval { make_path($_) };
+ if ($@) {
+ print "failure: $@\n";
+ exit 1;
+ }
+ print "ok\n";
+ }
+ }
+}
+
+my $oldincludedir = "$ROOT/usr/include";
+
+my $EXAMPLES_DIR = "$Bin/../examples";
+
+ at _ = CONFIGURE();
+
+if ($OPT{help}) {
+ help();
+ exit 0;
+}
+
+foreach (qw(BITS INCDIR
+ INST_INCDIR INST_JARDIR INST_LIBDIR INST_NGSLIBDIR INST_SHAREDIR INST_VDBLIBDIR
+ LIBX LPFX MAJVERS MAJVERS_SHLX OS OTHER_PREFIX
+ PACKAGE_NAME PREFIX SHLX VERSION VERSION_LIBX VERSION_SHLX))
+{
+ unless ($_{$_}) {
+ next if (/^INST_JARDIR$/ && ! $HAVE{JAR});
+ next if (/^INST_NGSLIBDIR$/ && ! $HAVE{TWO_LIBS});
+ next if (/^INST_SHAREDIR$/ && ! $HAVE{EXAMPLES});
+ next if (/^INST_VDBLIBDIR$/ && ! $HAVE{TWO_LIBS});
+ fatal_config("$_ not found");
+ }
+}
+unless ($_{LIBDIR32} || $_{LIBDIR64} || ($HAVE{PYTHON} && $MAKING)) {
+ fatal_config('LIBDIR not found');
+}
+
+if ($OPT{prefix}) {
+ $OPT{prefix} = expand_path($OPT{prefix});
+ $_{INST_BINDIR } = "$OPT{prefix}/bin";
+ $_{INST_LIBDIR } = "$OPT{prefix}/lib";
+ $_{INST_NGSLIBDIR} = $_{INST_VDBLIBDIR} = $_{INST_LIBDIR};
+ $_{INST_INCDIR } = "$OPT{prefix}/include";
+ $_{INST_JARDIR } = "$OPT{prefix}/jar";
+ $_{INST_SHAREDIR} = "$OPT{prefix}/share";
+}
+$_{INST_SHAREDIR} = expand_path($OPT{examplesdir }) if ($OPT{examplesdir });
+$_{INST_INCDIR } = expand_path($OPT{includedir }) if ($OPT{includedir });
+$_{INST_JARDIR } = expand_path($OPT{jardir }) if ($OPT{jardir });
+$_{BIN_TARGET } = expand_path($OPT{bindir }) if ($OPT{bindir });
+$oldincludedir = expand_path($OPT{oldincludedir}) if ($OPT{oldincludedir});
+if ($OPT{libdir}) {
+ $_{INST_NGSLIBDIR} = $_{LIB_TARGET} = expand_path($OPT{libdir}) ;
+ $_{INST_VDBLIBDIR} = $_{LIB_TARGET};
+}
+$_{INST_NGSLIBDIR}= expand_path($OPT{ngslibdir}) if ($OPT{ngslibdir});
+$_{INST_VDBLIBDIR}= expand_path($OPT{vdblibdir}) if ($OPT{vdblibdir});
+
+if ($OPT{'no-create'} && $_{OS} eq 'linux') {
+ if ($LINUX_ROOT) {
+ print "root user\n\n";
+ } else {
+ print "non root user\n\n";
+ }
+}
+
+my $failures = 0;
+my $bFailure = 1;
+
+push @bits, $_{BITS} unless (@bits);
+foreach (@bits) {
+ $_{BITS} = $_;
+
+ print "installing $_{PACKAGE_NAME} ($_{VERSION}) package";
+ print " for $_{OS}-$_{BITS}" if ($HAVE{BINS} || $HAVE{LIBS});
+ print "...\n";
+
+ if ($HAVE{BINS}) {
+ $_{BINDIR} = $_{"BINDIR$_{BITS}"};
+ unless ($_{BINDIR}) {
+ print "install: error: $_{BITS}-bit version is not available\n\n";
+ next;
+ }
+ }
+ if ($HAVE{LIBS} || $HAVE{PYTHON}) {
+# ($_{LIBDIR} for python points where ngs-sdk and ncbi-vdb dynamic libraries
+# can be found to correctly set up LD_LIBRARY_PATH
+ $_{LIBDIR} = $_{"LIBDIR$_{BITS}"};
+ unless ($_{LIBDIR}) {
+ print "install: error: $_{BITS}-bit version is not available\n\n";
+ next;
+ }
+ }
+ if ($HAVE{JAR} && ! $_{JARDIR}) {
+ $_{JARDIR} = $_{"LIBDIR$_{BITS}"};
+ unless ($_{JARDIR}) {
+ if ($_{BITS} == 64) {
+ $_{JARDIR} = $_{LIBDIR32};
+ } else {
+ $_{JARDIR} = $_{LIBDIR64};
+ }
+ unless ($_{JARDIR}) {
+ print "install: error: jar file was not cannot found\n";
+ exit 1;
+ }
+ }
+ }
+ $bFailure = 0;
+
+ if ($OPT{'no-create'}) {
+ print "includedir : '$_{INST_INCDIR }'\n" if ($HAVE{INCLUDES });
+ print "libdir : '$_{INST_LIBDIR}$_{BITS}'\n" if ($HAVE{LIBS});
+ print "jardir : '$_{INST_JARDIR }'\n" if ($HAVE{JAR });
+ print "examplesdir: '$_{INST_SHAREDIR}'\n" if ($HAVE{EXAMPLES });;
+ if ($LINUX_ROOT) {
+ print "oldincludedir: '$oldincludedir'\n" if ($HAVE{USR_INCLUDES});
+ }
+ print "\n";
+ next;
+ }
+
+ $_{BIN_TARGET} = "$_{INST_BINDIR}$_{BITS}" unless ($OPT{bindir});
+ $_{LIB_TARGET} = "$_{INST_LIBDIR}$_{BITS}" unless ($OPT{libdir});
+
+ $File::Copy::Recursive::CPRFComp = 1;
+
+ $failures += copybins () if ($HAVE{BINS});
+ $failures += copylibs () if ($HAVE{LIBS});
+ $failures += copyincludes() if ($HAVE{INCLUDES});
+ $failures += copyjars () if ($HAVE{JAR});
+ $failures += copyconfig () if ($HAVE{CONFIG});
+
+ if ($HAVE{JAR}) {
+ $File::Copy::Recursive::CPRFComp = 0;
+ $failures += copydocs() ;
+ $File::Copy::Recursive::CPRFComp = 1;
+ }
+
+ $failures += copyexamples() if ($HAVE{EXAMPLES});
+ $failures += finishinstall() unless ($failures);
+
+ unless ($failures) {
+ print "\nsuccessfully installed $_{PACKAGE_NAME} ($_{VERSION}) package";
+ } else {
+ print "\nfailed to install $_{PACKAGE_NAME} ($_{VERSION}) package";
+ }
+ print " for $_{OS}-$_{BITS}" if ($HAVE{BINS} || $HAVE{LIBS});
+ print ".\n\n";
+}
+
+$failures = 1 if (!$failures && $bFailure);
+
+exit $failures;
+
+################################################################################
+
+sub copybins {
+ unless ($_{BIN_TARGET}) {
+ print "error: cannot install executables: no BIN_TARGET\n";
+ return 1;
+ }
+ my $s = $_{BINDIR};
+ my $d = $_{BIN_TARGET};
+ print "installing executables to $d...";
+ unless (-e $s) {
+ print " failure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+ print "\t\tcd $d\n" if ($OPT{debug});
+ chdir $d or die "cannot cd $d";
+ my $failures = 0;
+ foreach (BINS()) {
+ print "installing '$_'..." if ($OPT{debug});
+ my $df = "$_$_{VERSION_EXEX}";
+ my $sf = "$s/$df";
+ print "\n\t\t$sf -> $df\n\t" if ($OPT{debug});
+ unless (-e $sf) {
+ print " skipped\n" if ($OPT{debug});
+ next;
+ }
+ if ((! $OPT{force}) && (-e $df) && (-M $df < -M $sf)) {
+ print " found\n" if ($OPT{debug});
+ } else {
+ unless (copy($sf, $df)) {
+ print "failure\n";
+ print "install: error: cannot copy '$sf' '$df'.\n";
+ ++$failures;
+ next;
+ }
+ my $mode = 0755;
+ printf "\tchmod %o $df\n\t", $mode if ($OPT{debug});
+ unless (chmod($mode, $df)) {
+ print " failure\n" if ($OPT{debug});
+ print "install: error: cannot chmod '$df': $!\n";
+ ++$failures;
+ next;
+ }
+ unless (symlinks($_, $df, 'bin')) {
+ print " success\n" if ($OPT{debug});
+ } else {
+ print " failure\n" if ($OPT{debug});
+ ++$failures;
+ }
+ }
+ }
+ return $failures;
+}
+
+sub copyconfig {
+ my $d;
+ if ($LINUX_ROOT) {
+ $d = "$ROOT/etc";
+ }
+ elsif ($HAVE{BINS}) {
+ $d = $_{BIN_TARGET};
+ unless ($d) {
+ print
+ "error: cannot install configuration files: no BIN_TARGET\n";
+ return 1;
+ }
+ } else {
+ $d = $_{LIB_TARGET};
+ unless ($d) {
+ print
+ "error: cannot install configuration files: no LIB_TARGET\n";
+ return 1;
+ }
+ }
+ $d = File::Spec->catdir($d, 'ncbi');
+ my $kfg = File::Spec->catdir($Bin, '..', 'libs/kfg/default.kfg');
+ unless (-e $kfg) {
+ $kfg = File::Spec->catdir($Bin, '..', 'tools/vdb-copy/vdb-copy.kfg');
+ }
+ unless (-e $kfg) {
+ if ($_{BINDIR}) {
+ $kfg = File::Spec->catdir($_{BINDIR}, 'ncbi', 'vdb-copy.kfg');
+ } elsif ($_{LIBDIR}) {
+ $kfg = File::Spec->catdir($_{LIBDIR}, 'ncbi', 'default.kfg');
+ unless (-e $kfg) {
+ print
+ "error: cannot install configuration files: no default.kfg\n";
+ return 1;
+ }
+ }
+ }
+ print "installing configuration files to $d... ";
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+ my $df = File::Spec->catdir($d, 'ncbi-vdb.kfg');
+ print "\t\t$kfg -> $df\n" if ($OPT{debug});
+ unless (copy($kfg, $df)) {
+ print "install: error: cannot copy '$kfg' '$df'.\n";
+ return 1;
+ } else {
+ print "success\n";
+ return 0;
+ }
+}
+
+sub copylibs {
+ die unless ($HAVE{LIBS});
+
+ my $s = $_{LIBDIR};
+ my $d = $_{LIB_TARGET};
+
+ print "installing libraries to $d... ";
+
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+
+ if ($HAVE{TWO_LIBS}) {
+ my $ngs = $_{INST_NGSLIBDIR};
+ if ($ngs && ! ($OPT{prefix} && $OPT{libdir} && $OPT{ngslibdir})) {
+ $ngs .= $_{BITS};
+ }
+ my $vdb = $_{INST_VDBLIBDIR};
+ if ($vdb && ! ($OPT{prefix} && $OPT{libdir} && $OPT{vdblibdir})) {
+ $vdb .= $_{BITS};
+ }
+ if ($ngs || $vdb) {
+ unless ($ngs && $vdb) {
+ $ngs = $d unless ($ngs);
+ $vdb = $d unless ($vdb);
+ }
+ $INSTALLED_LIBS{'ngs-sdk' } = $ngs;
+ $INSTALLED_LIBS{'ncbi-vdb'} = $vdb;
+ }
+ }
+ $INSTALLED_LIBS{0} = $d unless (%INSTALLED_LIBS);
+
+ foreach (keys %INSTALLED_LIBS) {
+ my $d = $INSTALLED_LIBS{$_};
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+ }
+
+ return $MAKING ? copybldlibs($s, $d) : copydir($s, %INSTALLED_LIBS);
+}
+
+sub copybldlibs {
+ my ($s, $d) = @_;
+
+ print "\t\tcd $d\n" if ($OPT{debug});
+ chdir $d or die "cannot cd $d";
+
+ my $failures = 0;
+
+ my %LIBRARIES_TO_INSTALL = LIBS();
+ foreach (keys %LIBRARIES_TO_INSTALL) {
+ print "installing '$_'... ";
+
+ my $nb = "$_{LPFX}$_";
+ my $nv = "$nb.";
+ my $lib = 'dll';
+ if ($LIBRARIES_TO_INSTALL{$_} eq 'SHL') {
+ $nv .= $_{VERSION_SHLX};
+ } elsif ($LIBRARIES_TO_INSTALL{$_} eq 'LIB') {
+ $nv .= $_{VERSION_LIBX};
+ $lib = 'lib';
+ } else {
+ die "bad library type";
+ }
+
+ my $sf = "$s/$nv";
+ my $df = "$d/$nv";
+
+ print "\n\t\t$sf -> $df\n\t" if ($OPT{debug});
+
+ unless (-e $sf) {
+ print "failure\n";
+ print "install: error: '$sf' is not found.\n";
+ ++$failures;
+ next;
+ }
+
+ if ((! $OPT{force}) && (-e $df) && (-M $df < -M $sf)) {
+ print "found\n";
+ } else {
+ unless (copy($sf, $df)) {
+ print "failure\n";
+ print "install: error: cannot copy '$sf' '$df'.\n";
+ ++$failures;
+ next;
+ }
+ my $mode = 0644;
+ $mode = 0755 if ($lib eq 'dll');
+ printf "\tchmod %o $df\n\t", $mode if ($OPT{debug});
+ unless (chmod($mode, $df)) {
+ print "failure\n";
+ print "install: error: cannot chmod '$df': $!\n";
+ ++$failures;
+ next;
+ }
+ unless (symlinks($nb, $nv, $lib)) {
+ print "success\n";
+ } else {
+ print "failure\n";
+ ++$failures;
+ }
+ }
+ }
+
+ return $failures;
+}
+
+sub symlinks {
+ my ($nb, $nv, $type) = @_;
+
+ my @l;
+ if ($type eq 'lib') {
+ push @l, "$nb-static.$_{LIBX}";
+ push @l, "$nb.$_{LIBX}";
+ push @l, "$nb.$_{MAJVERS_LIBX}";
+ } elsif ($type eq 'dll') {
+ push @l, "$nb.$_{SHLX}";
+ push @l, "$nb.$_{MAJVERS_SHLX}";
+ } elsif ($type eq 'bin' || $type eq 'jar') {
+ push @l, $nb;
+ push @l, "$nb.$_{MAJVERS}";
+ } else {
+ print "failure\n";
+ print "install: error: unknown symlink type '$type'\n";
+ return 1;
+ }
+
+ my $failures = 0;
+
+ for (my $i = 0; $i <= $#l; ++$i) {
+ my $file = $l[$i];
+ if (-e $file) {
+ print "\trm $file\n\t" if ($OPT{debug});
+ unless (unlink $file) {
+ print "failure\n";
+ print "install: error: cannot rm '$file': $!\n";
+ ++$failures;
+ next;
+ }
+ }
+
+ my $o = $nv;
+ $o = $l[$i + 1] if ($i < $#l);
+
+ print "\tln -s $o $file\n\t" if ($OPT{debug});
+ unless (symlink $o, $file) {
+ print "failure\n";
+ print "install: error: cannot symlink '$o' '$file': $!\n";
+ ++$failures;
+ next;
+ }
+ }
+
+ return $failures;
+}
+
+sub copydir {
+ my ($s, %d) = @_;
+
+ my $failures = 0;
+
+ foreach my $pattern(keys %d) {
+ my $d = $d{$pattern};
+ print "\t\tcd $d\n" if ($OPT{debug});
+ chdir $d or die "cannot cd $d";
+
+ opendir(D, $s) or die "cannot opendir $s: $!";
+
+ while (readdir D) {
+ next if (/^\.{1,2}$/);
+ next if ($pattern && ! /$pattern/);
+
+ my $n = "$s/$_";
+
+ if (-l $n) {
+ print "\t\t$_ (symlink)... " if ($OPT{debug});
+ my $l = readlink $n;
+ if ((-e $_) && (!unlink $_)) {
+ print "error: cannot remove $l: $!\n";
+ ++$failures;
+ next;
+ }
+ unless (symlink($l, $_)) {
+ print "error: cannot create symlink from $_ to $l: $!\n";
+ ++$failures;
+ next;
+ }
+ print "success\n" if ($OPT{debug});
+ } else {
+ print "\t\t$_... " if ($OPT{debug});
+ if ((-e $_) && (!unlink $_)) {
+ print "error: cannot remove $_: $!\n";
+ ++$failures;
+ next;
+ }
+ unless (copy($n, $_)) {
+ print "error: cannot copy '$n' to '$_': $!\n";
+ ++$failures;
+ next;
+ }
+ print "success\n" if ($OPT{debug});
+ }
+ }
+
+ closedir D;
+ }
+
+ return $failures;
+}
+
+sub includes_out {
+ my $out = '';
+ eval { $out = INCLUDES_OUT(); };
+ $out = File::Spec->catdir($_{INST_INCDIR}, $out);
+ $out;
+}
+
+sub copyincludes {
+ print "installing includes to $_{INST_INCDIR}... ";
+
+ my $s = "$_{INCDIR}/" . INCLUDES();
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+
+ my $out = includes_out();
+ my $d = $out;
+ $d = $_{INST_INCDIR} unless ($d);
+
+ unless (-e $d) {
+ print "\n\t\tmkdir -p $d" if ($OPT{debug});
+ eval { make_path($d) };
+ if ($@) {
+ print "\tfailure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ }
+ }
+
+ if ($out && -f $s) {
+ print "\n\t\tcp $s $d\n\t" if ($OPT{debug});
+ unless (copy($s, $d)) {
+ print "failure\n";
+ return 1;
+ }
+ } else {
+ print "\n\t\tcp -r $s $d\n\t" if ($OPT{debug});
+ unless (dircopy($s, $d)) {
+ print "\tfailure\ninstall: error: cannot copy '$s' 'd'";
+ return 1;
+ }
+ }
+
+ print "success\n";
+ return 0;
+}
+
+sub copyjars {
+ my $s = $_{JARDIR};
+ my $d = $_{INST_JARDIR};
+
+ print "installing jar files to $d... ";
+
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+
+ return $MAKING ? copybldjars($s, $d) : copydir($s, 0 => $d);
+}
+
+sub copybldjars {
+ my ($s, $d) = @_;
+ my $n = 'ngs-java.jar';
+ $s .= "/$n";
+
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+
+ my $nd = "$n.$_{VERSION}";
+ print "installing '$n'... ";
+
+ print "\t\tcd $d\n" if ($OPT{debug});
+ chdir $d or die "cannot cd $d";
+
+ $d .= "/$nd";
+
+ print "\n\t\t$s -> $d\n\t" if ($OPT{debug});
+
+ if ((! $OPT{force}) && (-e $d) && (-M $d < -M $s)) {
+ print "found\n";
+ } else {
+ unless (copy($s, $d)) {
+ print "failure\n";
+ print "install: error: cannot copy '$s' '$d'.\n";
+ return 1;
+ }
+ my $mode = 0644;
+ printf "\tchmod %o $d\n\t", $mode if ($OPT{debug});
+ unless (chmod($mode, $d)) {
+ print "failure\n";
+ print "install: error: cannot chmod '$d': $!\n";
+ return 1;
+ }
+ unless (symlinks($n, $nd, 'jar')) {
+ print "success\n";
+ } else {
+ print "failure\n";
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+sub copydocs {
+ my $s = "$_{JARDIR}/javadoc";
+ $s = expand_path("$Bin/../doc") unless ($MAKING);
+ my $d = "$_{INST_SHAREDIR}/doc";
+
+ print "installing html documents to $d... ";
+
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ return 1;
+ }
+
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ return 1;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+
+ print "\t\t$s -> $d\n\t" if ($OPT{debug});
+ unless (dircopy($s, $d)) {
+ print "\tfailure\ninstall: error: cannot copy '$s' to '$d'";
+ return 1;
+ }
+
+ print "success\n";
+ return 0;
+}
+
+sub copyexamples {
+ my $failures = 0;
+ my $CPRFComp = $File::Copy::Recursive::CPRFComp;
+ my $sd = $EXAMPLES_DIR;
+ return 0 unless (-e $sd);
+
+ my $d = $_{INST_SHAREDIR};
+ unless ($d) {
+ print "install: error: cannot install examples\n";
+ return 0;
+ }
+
+ if ($HAVE{JAR}) {
+ $d .= '/examples-java';
+ } elsif ($HAVE{PYTHON}) {
+ $File::Copy::Recursive::CPRFComp = 0;
+ $d .= '/examples-python';
+ }
+
+ print "installing examples to $d... ";
+
+ my $s = $sd;
+ $s = "$sd/examples" if ($HAVE{JAR} && $MAKING);
+
+ unless (-e $s) {
+ print "\tfailure\n";
+ print "install: error: '$s' is not found.\n";
+ ++$failures;
+ }
+
+ unless ($failures) {
+ print "\nchecking $d... ";
+ unless (-e $d) {
+ print "not found\n";
+ print "mkdir -p $d... ";
+ eval { make_path($d) };
+ if ($@) {
+ print "failure\ninstall: error: cannot mkdir $d\n";
+ ++$failures;
+ } else {
+ print "success\n";
+ }
+ } else {
+ print "exists\n";
+ }
+ }
+
+ unless ($failures) {
+ print "\t\t$s -> $d\n\t" if ($OPT{debug});
+ if ($HAVE{JAR} && ! $MAKING) {
+ if (copydir($s, 0 => $d)) {
+ ++$failures;
+ }
+ } else {
+ unless (dircopy($s, $d)) {
+ print "\tfailure\ninstall: error: cannot copy '$s' to '$d'";
+ ++$failures;
+ }
+ }
+ }
+
+ unless ($failures) {
+ if ($HAVE{JAR} && $MAKING) {
+ $sd = "$sd/Makefile";
+ $d = "$d/Makefile";
+ print "\t$sd -> $d\n\t" if ($OPT{debug});
+ unless (-e $sd) {
+ print "\tfailure\n";
+ print "install: error: '$sd' is not found.\n";
+ ++$failures;
+ }
+ unless ($failures) {
+ if (-e $d) {
+ unless (unlink $d) {
+ print "failure\n";
+ print "install: error: cannot rm '$d': $!\n";
+ ++$failures;
+ }
+ }
+ unless ($failures) {
+ unless (copy($sd, $d)) {
+ print "error: cannot copy '$sd' to '$d': $!\n";
+ ++$failures;
+ }
+ }
+ }
+ }
+ }
+
+ print "success\n" unless ($failures);
+
+ $File::Copy::Recursive::CPRFComp = $CPRFComp;
+
+ return $failures;
+}
+
+sub finishinstall {
+ my $failures = 0;
+
+ $_{JAR_TARGET} = "$_{INST_JARDIR}/ngs-java.jar";
+
+ my @libs;
+ if (%INSTALLED_LIBS) {
+ my %libs;
+ ++$libs{$INSTALLED_LIBS{$_}} foreach (keys %INSTALLED_LIBS);
+ push @libs, $_ foreach (keys %libs);
+ } else {
+ push @libs, $_{LIB_TARGET};
+ }
+ my $libs;
+ foreach (@libs) {
+ $libs .= ":" if ($libs);
+ $libs .= $_;
+ }
+
+ if ($HAVE{PYTHON}) {
+ chdir "$Bin/.." or die "cannot cd '$Bin/..'";
+ my $cmd = "python setup.py install";
+ $cmd .= ' --user' unless (linux_root());
+ print `$cmd`;
+ if ($?) {
+ ++$failures;
+ } else {
+ unless ($libs) {
+ print "internal python failure\n";
+ ++$failures;
+ } elsif ($HAVE{LIBS}) {
+ print <<EndText;
+Please add $libs to your LD_LIBRARY_PATH, e.g.:
+ export LD_LIBRARY_PATH=$libs:\$LD_LIBRARY_PATH
+EndText
+ }
+ }
+ } elsif ($LINUX_ROOT) {
+ print "\t\tlinux root\n" if ($OPT{debug});
+
+ if ($HAVE{USR_INCLUDES}) {
+ unless (-e $oldincludedir) {
+ print "install: error: '$oldincludedir' does not exist\n";
+ ++$failures;
+ } else {
+ my $o = includes_out();
+ if ($o) {
+ eval { INCLUDES_OUT(); };
+ if ($@) {
+ print "install: cannot find INCLUDES_OUT\n";
+ ++$failures;
+ } else {
+ my $INCLUDE_SYMLINK
+ = "$oldincludedir/" . INCLUDES_OUT();
+ print "updating $INCLUDE_SYMLINK... ";
+ unlink $INCLUDE_SYMLINK;
+ if ($OPT{debug}) {
+ print "\n\t\tln -s $o $INCLUDE_SYMLINK... ";
+ }
+ unless (symlink $o, $INCLUDE_SYMLINK) {
+ print "failure\n";
+ print "install: error: " .
+ "cannot symlink '$o' '$INCLUDE_SYMLINK': $!\n";
+ ++$failures;
+ } else {
+ print "success\n";
+ }
+ }
+ } else {
+ my $INCLUDE_SYMLINK = "$oldincludedir/" . INCLUDES();
+ print "updating $INCLUDE_SYMLINK... ";
+ unlink $INCLUDE_SYMLINK;
+ my $o = "$_{INST_INCDIR}/" . INCLUDES();
+ unless (symlink $o, $INCLUDE_SYMLINK) {
+ print "failure\n";
+ print "install: error: "
+ . "cannot symlink '$o' '$INCLUDE_SYMLINK': $!\n";
+ ++$failures;
+ } else {
+ print "success\n";
+ }
+ }
+ }
+ }
+
+ my $NAME = PACKAGE_NAME();
+ if ($HAVE{BINS} || $HAVE{JAR}
+ || ($HAVE{LIBS}
+ && ($HAVE{DLLS} || $NAME eq 'NGS-SDK' || $NAME eq 'NGS-BAM')
+ )
+ )
+ {
+ my $profile = "$ROOT/etc/profile.d";
+ my $PROFILE_FILE = "$profile/" . lc(PACKAGE_NAME());
+ unless (-e $profile) {
+ print "install: error: '$profile' does not exist\n";
+ ++$failures;
+ } else {
+ print "updating $PROFILE_FILE.[c]sh... ";
+
+ my $f = "$PROFILE_FILE.sh";
+ if (!open F, ">$f") {
+ print "failure\n";
+ print "install: error: cannot open '$f': $!\n";
+ ++$failures;
+ } else {
+ print F "#version $_{VERSION}\n\n";
+
+ if ($HAVE{LIBS}) {
+ unless (@libs) {
+ print "internal root libraries failure\n";
+ ++$failures;
+ } else {
+ if ($HAVE{DLLS}) {
+ foreach (@libs) {
+ print F <<EndText;
+if ! echo \$LD_LIBRARY_PATH | /bin/grep -q $_
+then export LD_LIBRARY_PATH=$_:\$LD_LIBRARY_PATH
+fi
+
+EndText
+ }
+ }
+ if ($NAME eq 'NGS-SDK') {
+ print F "export NGS_LIBDIR=$_{LIB_TARGET}\n";
+ } elsif ($NAME eq 'NGS-BAM') {
+ print F
+ "\nexport NGS_BAM_LIBDIR=$_{LIB_TARGET}\n"
+ }
+ }
+ }
+ if ($HAVE{JAR}) {
+ print F <<EndText;
+if ! echo \$CLASSPATH | /bin/grep -q $_{JAR_TARGET}
+then export CLASSPATH=$_{JAR_TARGET}:\$CLASSPATH
+fi
+EndText
+ }
+ if ($HAVE{BINS}) {
+ print F <<EndText;
+if ! echo \$PATH | /bin/grep -q $_{INST_BINDIR}
+then export PATH=$_{INST_BINDIR}:\$PATH
+fi
+EndText
+ }
+ close F;
+ unless (chmod(0644, $f)) {
+ print "failure\n";
+ print "install: error: cannot chmod '$f': $!\n";
+ ++$failures;
+ }
+ }
+ }
+
+ my $f = "$PROFILE_FILE.csh";
+ if (!open F, ">$f") {
+ print "failure\n";
+ print "install: error: cannot open '$f': $!\n";
+ ++$failures;
+ } else {
+ print F "#version $_{VERSION}\n\n";
+
+ if ($HAVE{LIBS}) {
+ unless (@libs) {
+ print "internal libraries failure\n";
+ ++$failures;
+ } else {
+ if ($HAVE{DLLS}) {
+ foreach (@libs) {
+ print F <<EndText;
+echo \$LD_LIBRARY_PATH | /bin/grep -q $_
+if ( \$status ) setenv LD_LIBRARY_PATH $_:\$LD_LIBRARY_PATH
+
+EndText
+ }
+ }
+ }
+ if (PACKAGE_NAME() eq 'NGS-BAM') {
+ print F "setenv NGS_BAM_LIBDIR $_{LIB_TARGET}\n";
+ } elsif (PACKAGE_NAME() eq 'NGS-SDK') {
+ print F "setenv NGS_LIBDIR $_{LIB_TARGET}\n";
+ } elsif (PACKAGE_NAME() eq 'NCBI-VDB') {
+ print F "setenv NCBI_VDB_LIBDIR $_{LIB_TARGET}\n";
+ }
+ }
+ if ($HAVE{JAR}) {
+ print F <<EndText;
+echo \$CLASSPATH | /bin/grep -q $_{JAR_TARGET}
+if ( \$status ) setenv CLASSPATH $_{JAR_TARGET}:\$CLASSPATH
+EndText
+ }
+ if ($HAVE{BINS}) {
+ print F <<EndText;
+echo \$PATH | /bin/grep -q $_{INST_BINDIR}
+if ( \$status ) setenv PATH $_{INST_BINDIR}:\$PATH
+EndText
+ }
+ close F;
+ unless (chmod(0644, $f)) {
+ print "failure\n";
+ print "install: error: cannot chmod '$f': $!\n";
+ ++$failures;
+ }
+ }
+# @ #TODO: check version of the files above
+ print "success\n" unless ($failures);
+ }
+
+ unless ($failures) {
+ if ($HAVE{LIBS}) {
+ if (PACKAGE_NAME() eq 'NGS-BAM') {
+ print "\n";
+ print "Use \$NGS_BAM_LIBDIR in your link commands, e.g.:\n";
+ print " ld -L\$NGS_BAM_LIBDIR -lngs-bam ...\n";
+ } elsif (PACKAGE_NAME() eq 'NGS-SDK') {
+ print "\nUse \$NGS_LIBDIR in your link commands, e.g.:\n";
+ print " ld -L\$NGS_LIBDIR -lngs-sdk ...\n";
+ } elsif (PACKAGE_NAME() eq 'NCBI-VDB') {
+ print "\n"
+ . "Use \$NCBI_VDB_LIBDIR in your link commands, e.g.:\n";
+ print " ld -L\$NCBI_VDB_LIBDIR -lncbi-vdb ...\n";
+ }
+ }
+ }
+ } else {
+ print "\t\tnot linux root\n" if ($OPT{debug});
+ if ($HAVE{LIBS}) {
+ unless ($libs) {
+ print "internal libraries failure\n";
+ ++$failures;
+ } else {
+ print "\n";
+ print <<EndText if ($HAVE{DLLS});
+Please add $libs to your LD_LIBRARY_PATH, e.g.:
+ export LD_LIBRARY_PATH=$libs:\$LD_LIBRARY_PATH
+EndText
+ if (PACKAGE_NAME() eq 'NGS-SDK') {
+ print "Use $libs in your link commands, e.g.:\n"
+ . "export NGS_LIBDIR=$libs\n"
+ . "ld -L\$NGS_LIBDIR -lngs-sdk ...\n";
+ } elsif (PACKAGE_NAME() eq 'NGS-BAM') {
+ print "Use $libs in your link commands, e.g.:\n"
+ . "export NGS_BAM_LIBDIR=$libs\n"
+ . "ld -L\$NGS_BAM_LIBDIR -lngs-bam ...\n";
+ }
+ }
+ }
+ if ($HAVE{JAR}) {
+ print <<EndText;
+
+Please add $_{JAR_TARGET} to your CLASSPATH, i.e.:
+ export CLASSPATH=$_{JAR_TARGET}:\$CLASSPATH
+EndText
+ }
+ }
+
+ return $failures;
+}
+
+sub expand_path {
+ my ($filename) = @_;
+ return unless ($filename);
+
+ if ($filename =~ /^~/) {
+ if ($filename =~ m|^~([^/]*)|) {
+ if ($1 && ! getpwnam($1)) {
+ print "install: error: bad path: '$filename'\n";
+ exit 1;
+ }
+ }
+
+ $filename =~ s{ ^ ~ ( [^/]* ) }
+ { $1
+ ? (getpwnam($1))[7]
+ : ( $ENV{HOME} || $ENV{USERPROFILE} || $ENV{LOGDIR}
+ || (getpwuid($<))[7]
+ )
+ }ex;
+ }
+
+ my $a = abs_path($filename);
+ $filename = $a if ($a);
+
+ $filename;
+}
+
+sub help {
+ $_{LIB_TARGET} = "$_{INST_LIBDIR}$_{BITS}";
+
+ print <<EndText;
+'install' installs $_{PACKAGE_NAME} $_{VERSION} package.
+
+Usage: ./install [OPTION]...
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ -n, --no-create do not run installation
+
+EndText
+
+ if ($HAVE{TWO_LIBS}) {
+ my $p = lc(PACKAGE_NAME());
+ print "By default, `./install' will install all the files in\n";
+ print "`/usr/local/ngs/$p/jar', " if ($HAVE{JAR});
+ print <<EndText;
+`/usr/local/ngs/$p/share',
+`/usr/local/ngs/ngs-sdk/lib$_{BITS}', `/usr/local/ncbi/ncbi-vdb/lib$_{BITS}'.
+You can spefify other installation directories using the options below.
+
+Fine tuning of the installation directories:
+EndText
+ if ($HAVE{JAR}) {
+ print
+ " --jardir=DIR jar files [/usr/local/ngs/$p/jar]\n"
+ }
+ print <<EndText;
+ --ngslibdir=DIR ngs-sdk libraries [/usr/local/ngs/ngs-sdk/lib$_{BITS}]
+ --vdblibdir=DIR ncbi-vdb libraries [/usr/local/ncbi/ncbi-vdb/lib$_{BITS}]
+ --examplesdir=DIR example files [/usr/local/ngs/$p/share]
+
+ --libdir=DIR install all libraries in the same directory
+ --prefix=DIR install files in PREFIX/lib$_{BITS}, PREFIX/share etc.
+EndText
+ } else {
+ print <<EndText;
+Installation directories:
+ --prefix=PREFIX install all files in PREFIX
+ [$_{PREFIX}]
+
+By default, `./install' will install all the files in
+EndText
+
+ if ($HAVE{INCLUDES}) {
+ print
+"`$_{PREFIX}/include', `$_{PREFIX}/lib$_{BITS}' etc. You can specify\n"
+ } elsif ($HAVE{JAR}) {
+ print "`$_{PREFIX}/jar', `$_{PREFIX}/share' etc. You can specify\n"
+ } elsif ($MAKING) {
+ print "`$_{PREFIX}/share' etc. You can specify\n"
+ } else {
+ print
+"`$_{PREFIX}/lib$_{BITS}' `$_{PREFIX}/share' etc. You can specify\n"
+ }
+
+ print <<EndText;
+an installation prefix other than `$_{PREFIX}' using `--prefix',
+for instance `--prefix=$_{OTHER_PREFIX}'.
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+EndText
+
+ if ($HAVE{BINS}) {
+ print " --bindir=DIR executables [PREFIX/bin]\n";
+ }
+ if ($HAVE{JAR}) {
+ print " --jardir=DIR jar files [PREFIX/jar]\n";
+ }
+ if ($HAVE{LIBS}) {
+ print
+" --libdir=DIR object code libraries [PREFIX/lib$_{BITS}]\n"
+ }
+ if ($HAVE{INCLUDES}) {
+ print " --includedir=DIR C header files [PREFIX/include]\n";
+ }
+ if ($HAVE{USR_INCLUDES}) {
+ print
+" --oldincludedir=DIR C header files for non-gcc [$oldincludedir]\n"
+ }
+
+ if (-e $EXAMPLES_DIR) {
+ print " --examplesdir=DIR example files [PREFIX/share]\n";
+ }
+ }
+
+ if ($HAVE{LIBS}) {
+ print <<EndText;
+
+System types:
+ --bits=[32|64] use a 32- or 64-bit data model
+EndText
+ }
+
+ print "\nReport bugs to sra-tools\@ncbi.nlm.nih.gov\n";
+}
+
+sub prepare {
+ if ($MAKING) {
+ my $os_arch = `perl -w $Bin/os-arch.perl`;
+ unless ($os_arch) {
+ print "install: error\n";
+ exit 1;
+ }
+ chomp $os_arch;
+ my $config =
+ "$Bin/../" . CONFIG_OUT() . "/Makefile.config.install.$os_arch.prl";
+ fatal_config("$config not found") unless (-e "$config");
+
+ eval { require $config; };
+ fatal_config($@) if ($@);
+ } else {
+ my $a = $Config{archname64};
+ $_ = lc PACKAGE_NAME();
+ my $root = '';
+ $root = $OPT{root} if ($OPT{root});
+ my $code =
+ 'sub CONFIGURE { ' .
+ ' $_{OS } = $OS; ' .
+ ' $_{VERSION } = "1.0.0"; ' .
+ ' $_{MAJVERS } = "1"; ' .
+ ' $_{LPFX } = "lib"; ' .
+ ' $_{LIBX } = "a"; ' .
+ ' $_{MAJVERS_LIBX } = "a.1"; ' .
+ ' $_{VERSION_LIBX } = "a.1.0.0"; ' .
+ ' $_{SHLX } = "so"; ' .
+ ' $_{OTHER_PREFIX } = \'$HOME/ngs/' . $_ . '\'; ' .
+ ' $_{PREFIX } = "' . "$root/usr/local/ngs/$_" . '"; ' .
+ ' $_{INST_INCDIR } = "$_{PREFIX}/include"; ' .
+ ' $_{INST_LIBDIR } = "$_{PREFIX}/lib"; ' .
+ ' $_{INST_JARDIR } = "$_{PREFIX}/jar"; ' .
+ ' $_{INST_SHAREDIR} = "$_{PREFIX}/share"; ' .
+ ' $_{INCDIR } = "$Bin/../include"; ' .
+ ' $_{LIBDIR64 } = "$Bin/../lib64"; ' .
+ ' $_{LIBDIR32 } = "$Bin/../lib32"; ';
+ if ($HAVE{TWO_LIBS}) {
+ $code .=
+ '$_{INST_NGSLIBDIR} = "' . "$root/usr/local/ngs/ngs-sdk/lib\";"
+ . '$_{INST_VDBLIBDIR} = "' . "$root/usr/local/ncbi/ncbi-vdb/lib\";"
+ }
+ $code .= ' $_{PACKAGE_NAME} = "' . PACKAGE_NAME() . '"; ';
+
+ if (defined $Config{archname64}) {
+ $code .= ' $_{BITS} = 64; ';
+ } else {
+ $code .= ' $_{BITS} = 32; ';
+ }
+
+ $code .=
+ ' $_{MAJVERS_SHLX } = "so.1"; ' .
+ ' $_{VERSION_SHLX } = "so.1.0.0"; ' ;
+
+ $code .=
+ ' @_ ' .
+ '}';
+
+ eval $code;
+
+ die $@ if ($@);
+ }
+}
+
+sub linux_root { $^O eq 'linux' && `id -u` == 0 }
+
+sub fatal_config {
+ if ($OPT{debug}) {
+ print "\t\t";
+ print "@_";
+ print "\n";
+ }
+
+ print "install: error: run ./configure [OPTIONS] first.\n";
+
+ exit 1;
+}
+
+################################################################################
diff --git a/setup/install.prl b/setup/install.prl
new file mode 100644
index 0000000..8b26a51
--- /dev/null
+++ b/setup/install.prl
@@ -0,0 +1,38 @@
+sub PACKAGE_NAME { 'SRA-TOOLS' }
+sub HAVE { ( BINS => 1, CONFIG => 1,) }
+sub CONFIG_OUT { 'build' }
+sub BINS { qw (abi-dump
+ abi-load
+ align-info
+ bam-load
+ cache-mgr
+ cg-load
+ fastq-dump
+ fastq-load
+ helicos-load
+ illumina-dump
+ illumina-load
+ kar
+ kdbmeta
+ latf-load
+ prefetch
+ rcexplain
+ sam-dump
+ sff-dump
+ sff-load
+ sra-pileup
+ sra-sort
+ sra-stat
+ srapath
+ srf-load
+ test-sra
+ vdb-config
+ vdb-copy
+ vdb-decrypt
+ vdb-dump
+ vdb-encrypt
+ vdb-lock
+ vdb-passwd
+ vdb-unlock
+ vdb-validate ) }
+1
diff --git a/setup/konfigure.perl b/setup/konfigure.perl
new file mode 100644
index 0000000..5568cdd
--- /dev/null
+++ b/setup/konfigure.perl
@@ -0,0 +1,1762 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+use strict;
+
+sub println { print @_; print "\n" }
+
+my ($filename, $directories, $suffix) = fileparse($0);
+if ($directories ne "./") {
+ println "configure: error: $filename should be run as ./$filename";
+ exit 1;
+}
+
+require 'package.prl';
+require 'os-arch.prl';
+
+use Cwd qw(abs_path getcwd);
+use File::Basename 'fileparse';
+use File::Spec 'catdir';
+use FindBin qw($Bin);
+use Getopt::Long "GetOptions";
+
+chdir '..' or die "cannot cd to package root";
+
+check();
+
+my $LOCAL_BUILD_OUT
+ = -e File::Spec->catdir($ENV{HOME}, 'tmp', 'local-build-out');
+
+my ($CONFIGURED, $RECONFIGURE) = ('');
+if (@ARGV) {
+ foreach (@ARGV) {
+ $CONFIGURED .= "\t" if ($CONFIGURED);
+ $CONFIGURED .= "'$_'";
+ }
+} elsif (-f 'reconfigure') {
+ ++$RECONFIGURE unless ($LOCAL_BUILD_OUT);
+}
+
+my %PKG = PKG();
+
+my $PACKAGE_NAME = PACKAGE_NAME();
+my $OUT_MAKEFILE = 'Makefile.config';
+my $INS_MAKEFILE = 'Makefile.config.install';
+
+my $PACKAGE = PACKAGE();
+
+my $HOME = $ENV{HOME} || $ENV{USERPROFILE}
+ || $ENV{LOGDIR} || getcwd || (getpwuid($<))[7] || abs_path('.');
+
+$PKG{UPATH} = expand($PKG{UPATH});
+
+my $package_default_prefix = $PKG{PATH};
+my $schema_default_dir = $PKG{SCHEMA_PATH} if ($PKG{SCHEMA_PATH});
+
+my @REQ = REQ();
+
+my @options = ( 'build-prefix=s',
+ 'clean',
+ 'debug',
+ 'help',
+ 'prefix=s',
+ 'reconfigure',
+ 'status',
+ 'with-debug',
+ 'without-debug', );
+{
+ my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+ push @options, 'arch=s' if (@ARCHITECTURES);
+}
+push @options, 'source=s' if ($PKG{LNG} eq 'JAVA');
+push @options, 'enable-static' if (PACKAGE_TYPE() eq 'B');
+foreach my $href (@REQ) {
+ my %a = %$href;
+ push @options, "$a{option}=s" if ($a {option});
+ push @options, "$a{boption}=s" if ($a{boption});
+ $href->{usrpath} = '' unless ($href->{usrpath});
+ $href->{usrpath} = expand($href->{usrpath});
+}
+push @options, "shemadir" if ($PKG{SCHEMA_PATH});
+
+my %OPT;
+die "configure: error" unless (GetOptions(\%OPT, @options));
+++$OPT{'reconfigure'} if ($RECONFIGURE);
+
+if ($OPT{'reconfigure'}) {
+ unless (eval 'use Getopt::Long qw(GetOptionsFromString); 1') {
+ print <<EndText;
+configure: error: your perl does not support Getopt::Long::GetOptionsFromString
+ reconfigure option is not avaliable.
+Run "sh ./reconfigure" instead.
+EndText
+ exit 1;
+ }
+ println "reconfiguring...";
+ open F, 'reconfigure' or die 'cannot open reconfigure';
+ $_ = <F>;
+ chomp;
+ unless (m|^\./configure\s*(.*)$|) {
+ println 'configure: error: cannot reconfigure';
+ println 'run "./configure --clean" then run "./configure [OPTIONS]"';
+ exit 1;
+ }
+
+ my $ARG = $1;
+ println "running \"./configure $ARG\"...";
+ undef %OPT;
+ die "configure: error" unless (GetOptionsFromString($ARG, \%OPT, @options));
+ $CONFIGURED = $ARG if ($#ARGV == -1 && $RECONFIGURE);
+ ++$OPT{reconfigure};
+}
+
+$OPT{'local-build-out'} = $LOCAL_BUILD_OUT;
+my $OUTDIR = File::Spec->catdir($HOME, $PKG{OUT});
+if ($OPT{'local-build-out'}) {
+ my $o = expand_path(File::Spec->catdir($Bin, $PKG{LOCOUT}));
+ $OUTDIR = $o if ($o);
+}
+
+if ($OPT{'help'}) {
+ help();
+ exit 0;
+} elsif ($OPT{'clean'}) {
+ {
+ foreach ('reconfigure', glob(CONFIG_OUT() . '/Makefile.config*'),
+ File::Spec->catdir(CONFIG_OUT(), 'Makefile.userconfig'),
+ File::Spec->catdir(CONFIG_OUT(), 'user.status'))
+ {
+ my $f = $_;
+ print "removing $f... ";
+ if (-e $f) {
+ if (unlink $f) {
+ println "ok";
+ } else {
+ println "failed";
+ }
+ } else {
+ println "not found";
+ }
+ }
+ }
+ if (CONFIG_OUT() ne '.') {
+ foreach
+ (glob('Makefile.config*'), 'user.status', 'Makefile.userconfig')
+ {
+ my $f = $_;
+ print "removing $f... ";
+ if (-e $f) {
+ if (unlink $f) {
+ println "ok";
+ } else {
+ println "failed";
+ }
+ } else {
+ println "not found";
+ }
+ }
+ }
+ exit 0;
+} elsif ($OPT{'status'}) {
+ status(1);
+ exit 0;
+}
+
+foreach (@ARGV) {
+ @_ = split('=');
+ next if ($#_ != 1);
+ $OPT{$_[0]} = $_[1] if ($_[0] eq 'CXX' || $_[0] eq 'LDFLAGS');
+}
+
+println "Configuring $PACKAGE_NAME package";
+
+$OPT{'prefix'} = $package_default_prefix unless ($OPT{'prefix'});
+
+my $AUTORUN = $OPT{status};
+print "checking system type... " unless ($AUTORUN);
+my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+println $OSTYPE unless ($AUTORUN);
+
+unless ($OSTYPE =~ /linux/i || $OSTYPE =~ /darwin/i || $OSTYPE eq 'win') {
+ println "configure: error: unsupported system '$OSTYPE'";
+ exit 1;
+}
+
+my $OS_DISTRIBUTOR = '';
+if ($OS eq 'linux') {
+ print "checking OS distributor... " unless ($AUTORUN);
+ $OS_DISTRIBUTOR = `lsb_release -si 2> /dev/null`;
+ chomp $OS_DISTRIBUTOR;
+ println $OS_DISTRIBUTOR unless ($AUTORUN);
+}
+
+print "checking machine architecture... " unless ($AUTORUN);
+println $MARCH unless ($AUTORUN);
+unless ($MARCH =~ /x86_64/i || $MARCH =~ /i?86/i) {
+ println "configure: error: unsupported architecture '$OSTYPE'";
+ exit 1;
+}
+
+{
+ $OPT{'prefix'} = expand_path($OPT{'prefix'});
+ my $prefix = $OPT{'prefix'};
+ $OPT{'eprefix'} = $prefix unless ($OPT{'eprefix'} || $OS eq 'win');
+ my $eprefix = $OPT{'eprefix'};
+ unless ($OPT{'bindir'} || $OS eq 'win') {
+ $OPT{'bindir'} = File::Spec->catdir($eprefix, 'bin') ;
+ }
+ unless ($OPT{'libdir'} || $OS eq 'win') {
+ $OPT{'libdir'} = File::Spec->catdir($eprefix, 'lib');
+ }
+ unless ($OPT{'includedir'} || $OS eq 'win') {
+ $OPT{'includedir'} = File::Spec->catdir($eprefix, 'include');
+ }
+ if ($PKG{LNG} eq 'PYTHON' && ! $OPT{'pythondir'} && $OS ne 'win') {
+ $OPT{'pythondir'} = $eprefix;
+ }
+ if ($PKG{LNG} eq 'JAVA' && ! $OPT{'javadir'} && $OS ne 'win') {
+ $OPT{'javadir'} = File::Spec->catdir($eprefix, 'jar');
+ }
+ if ($PKG{EXAMP} && ! $OPT{'sharedir'} && $OS ne 'win') {
+ $OPT{'sharedir'} = File::Spec->catdir($eprefix, 'share');
+ }
+}
+
+# initial values
+my $TARGDIR = File::Spec->catdir($OUTDIR, $PACKAGE);
+if ($OPT{'build-prefix'}) {
+ $TARGDIR = $OPT{'build-prefix'} = expand_path($OPT{'build-prefix'});
+ unless ($TARGDIR =~ /$PACKAGE$/) {
+ $TARGDIR = File::Spec->catdir($TARGDIR, $PACKAGE);
+ }
+}
+my $BUILD_PREFIX = $TARGDIR;
+
+my $BUILD = 'rel';
+
+# parse command line
+$BUILD = 'dbg' if ($OPT{'with-debug'});
+$BUILD = 'rel' if ($OPT{'without-debug'});
+
+my $BUILD_TYPE = "release";
+$BUILD_TYPE = "debug" if ( $BUILD eq "dbg" );
+
+$OPT{arch} = $ARCH if (@ARCHITECTURES && ! $OPT{arch});
+
+if ($OPT{arch}) {
+ my $found;
+ foreach (@ARCHITECTURES) {
+ if ($_ eq $OPT{arch}) {
+ ++$found;
+ last;
+ }
+ }
+ if ($found) {
+ $ARCH = $MARCH = $OPT{arch};
+ while (1) {
+ open F, ">Makefile.config.$OS.arch" or last;
+ print F "$ARCH\n";
+ close F;
+ last;
+ }
+ println "build architecture: $ARCH" unless ($AUTORUN);
+ } else {
+ delete $OPT{arch};
+ }
+}
+
+$OUT_MAKEFILE = File::Spec->catdir(CONFIG_OUT(), "$OUT_MAKEFILE.$OS.$ARCH");
+$INS_MAKEFILE = File::Spec->catdir(CONFIG_OUT(), "$INS_MAKEFILE.$OS.$ARCH.prl");
+
+my $TOOLS = "";
+$TOOLS = "jdk" if ($PKG{LNG} eq 'JAVA');
+
+# determine architecture
+
+print "checking for supported architecture... " unless ($AUTORUN);
+
+my $BITS;
+
+if ($MARCH =~ /x86_64/i) {
+ $BITS = 64;
+} elsif ($MARCH eq 'fat86') {
+ $BITS = '32_64';
+} elsif ($MARCH =~ /i?86/i) {
+ $BITS = 32;
+} else {
+ die "unrecognized Architecture '$ARCH'";
+}
+println "$MARCH ($BITS bits) is supported" unless ($AUTORUN);
+
+# determine OS and related norms
+my ($LPFX, $OBJX, $LOBX, $LIBX, $SHLX, $EXEX, $OSINC);
+
+print "checking for supported OS... " unless ($AUTORUN);
+if ($OSTYPE =~ /linux/i) {
+ $LPFX = 'lib';
+ $OBJX = 'o';
+ $LOBX = 'pic.o';
+ $LIBX = 'a';
+ $SHLX = 'so';
+ $EXEX = '';
+ $OSINC = 'unix';
+ $TOOLS = 'gcc' unless ($TOOLS);
+} elsif ($OSTYPE =~ /darwin/i) {
+ $LPFX = 'lib';
+ $OBJX = 'o';
+ $LOBX = 'pic.o';
+ $LIBX = 'a';
+ $SHLX = 'dylib';
+ $EXEX = '';
+ $OSINC = 'unix';
+ $TOOLS = 'clang' unless ($TOOLS);
+} elsif ($OSTYPE eq 'win') {
+ $TOOLS = 'vc++';
+} else {
+ die "unrecognized OS '$OSTYPE'";
+}
+
+println "$OSTYPE ($OS) is supported" unless ($AUTORUN);
+
+# tool chain
+my ($CPP, $CC, $CP, $AR, $ARX, $ARLS, $LD, $LP, $MAKE_MANIFEST);
+my ($JAVAC, $JAVAH, $JAR);
+my ($ARCH_FL, $DBG, $OPT, $PIC, $INC, $MD, $LDFLAGS) = ('');
+
+print "checking for supported tool chain... " unless ($AUTORUN);
+
+$CPP = $OPT{CXX } if ($OPT{CXX });
+$LDFLAGS = $OPT{LDFLAGS} if ($OPT{LDFLAGS});
+
+if ($TOOLS =~ /gcc$/) {
+ $CPP = 'g++' unless ($CPP);
+ $CC = "$TOOLS -c";
+ $CP = "$CPP -c";
+ $AR = 'ar rc';
+ $ARX = 'ar x';
+ $ARLS = 'ar t';
+ $LD = $TOOLS;
+ $LP = $CPP;
+
+ $DBG = '-g -DDEBUG';
+ $OPT = '-O3';
+ $PIC = '-fPIC';
+ $INC = '-I';
+ $MD = '-MD';
+} elsif ($TOOLS eq 'clang') {
+ $CPP = 'clang++' unless ($CPP);
+ $CC = 'clang -c';
+ my $versionMin = '-mmacosx-version-min=10.6';
+ $CP = "$CPP -c $versionMin";
+ if ($BITS ne '32_64') {
+ $ARCH_FL = '-arch i386' if ($BITS == 32);
+ $OPT = '-O3';
+ $AR = 'ar rc';
+ $LD = "clang $ARCH_FL";
+ $LP = "$CPP $versionMin $ARCH_FL";
+ } else {
+ $MAKE_MANIFEST = '( echo "$^" > $@/manifest )';
+ $ARCH_FL = '-arch i386 -arch x86_64';
+ $OPT = '-O3';
+ $AR = 'libtool -static -o';
+ $LD = "clang -Wl,-arch_multiple $ARCH_FL -Wl,-all_load";
+ $LP = "$CPP $versionMin -Wl,-arch_multiple $ARCH_FL -Wl,-all_load";
+ }
+ $ARX = 'ar x';
+ $ARLS = 'ar t';
+
+ $DBG = '-g -DDEBUG';
+ $PIC = '-fPIC';
+ $INC = '-I';
+ $MD = '-MD';
+} elsif ($TOOLS eq 'jdk') {
+ $JAVAC = 'javac';
+ if ($OPT{source}) {
+ $JAVAC .= ' -target ' . $OPT{source} . ' -source ' . $OPT{source};
+ }
+ $JAVAH = 'javah';
+ $JAR = 'jar cf';
+
+ $DBG = '-g';
+} elsif ($TOOLS eq 'vc++') {
+} else {
+ die "unrecognized tool chain '$TOOLS'";
+}
+println "$TOOLS tool chain is supported" unless ($AUTORUN);
+
+if ($OS ne 'win' && $PKG{LNG} ne 'JAVA') {
+ $TARGDIR = File::Spec->catdir($TARGDIR, $OS, $TOOLS, $ARCH, $BUILD);
+}
+
+if ($CPP) {
+ unless (check_tool__h($CPP)) {
+ println "configure: error: '$CPP' cannot be found";
+ exit 1;
+ }
+}
+
+if ($JAVAC) {
+ unless (check_tool_h($JAVAC)) {
+ println "configure: error: '$JAVAC' cannot be found";
+ exit 1;
+ }
+}
+
+my $NO_ARRAY_BOUNDS_WARNING = '';
+if ($TOOLS =~ /gcc$/ && check_no_array_bounds()) {
+ $NO_ARRAY_BOUNDS_WARNING = '-Wno-array-bounds';
+}
+
+my $STATIC_LIBSTDCPP = '';
+if ($TOOLS =~ /gcc$/) {
+ $STATIC_LIBSTDCPP = check_static_libstdcpp();
+}
+
+my @dependencies;
+
+my %DEPEND_OPTIONS;
+foreach my $href (DEPENDS()) {
+ $_ = $href->{name};
+ my ($I, $L) = ($href->{Include});
+ my $o = "with-$_-prefix";
+ ++$DEPEND_OPTIONS{$o};
+ if ($OPT{$o}) {
+ $OPT{$o} = expand_path($OPT{$o});
+ $I = File::Spec->catdir($OPT{$o}, 'include');
+ if (/^xml2$/) {
+ my $t = File::Spec->catdir($I, 'libxml2');
+ $I = $t if (-e $t);
+ }
+ $L = File::Spec->catdir($OPT{$o}, 'lib');
+ }
+ my ($i, $l) = find_lib($_, $I, $L);
+ if (defined $i || $l) {
+ my $d = 'HAVE_' . uc($_) . ' = 1';
+ push @dependencies, $d;
+ println "\t\t$d" if ($OPT{'debug'});
+ }
+ if ($i) {
+ my $d = uc($_) . "_INCDIR = $i";
+ push @dependencies, $d;
+ println "\t\t$d" if ($OPT{'debug'});
+ }
+ if ($l) {
+ my $d = uc($_) . "_LIBDIR = $l";
+ push @dependencies, $d;
+ println "\t\t$d" if ($OPT{'debug'});
+ }
+}
+
+foreach my $href (@REQ) {
+ $href->{ bldpath} = expand($href->{ bldpath}) if ($href->{ bldpath});
+ $href->{locbldpath} = expand($href->{locbldpath}) if ($href->{locbldpath});
+
+ # found directories
+ my
+ ($found_itf, $found_bin, $found_lib, $found_ilib, $found_jar, $found_src);
+
+ my %a = %$href;
+ next if ($a{option} && $DEPEND_OPTIONS{$a{option}});
+ my $is_optional = optional($a{type});
+ my $quasi_optional = $a{type} =~ /Q/;
+ my $need_source = $a{type} =~ /S/;
+ my $need_bin = $a{type} =~ /E/;
+ my $need_build = $a{type} =~ /B/;
+ my $need_lib = $a{type} =~ /L|D/;
+ my $need_itf = ! ($a{type} =~ /D/ || $a{type} =~ /E/ || $a{type} =~ /J/);
+ my $need_jar = $a{type} =~ /J/;
+
+ my ($bin, $inc, $lib, $ilib, $src)
+ = ($a{bin}, $a{include}, $a{lib}, undef, $a{src}); # file names to check
+ $lib = '' unless ($lib);
+ $lib = expand($lib);
+
+ if ($need_build) {
+ $ilib = $a{ilib};
+ ++$need_lib;
+ }
+ unless ($AUTORUN) {
+ if ($need_source && $need_build) {
+ println
+ "checking for $a{name} package source files and build results..."
+ } elsif ($need_source) {
+ println "checking for $a{name} package source files...";
+ } else {
+ println "checking for $a{name} package...";
+ }
+ }
+ my %has_option;
+ my $tolib = $need_itf || $need_lib;
+ my $tojar = $need_jar;
+ foreach my $option ($a{option}, $a{boption}) {
+ next unless ($option);
+ if ($OPT{$option}) {
+ my $try = expand_path($OPT{$option});
+ if ($tojar && ! $found_jar && -f $try) {
+ println "\tjar... $try" unless ($AUTORUN);
+ $found_jar = $try;
+ }
+ elsif ($tolib) {
+ my ($i, $l, $il) = ($inc, $lib, $ilib);
+ if ($option =~ /-build$/) {
+ undef $i;
+ ++$has_option{build};
+ } elsif ($option =~ /-prefix$/) {
+ undef $il;
+ ++$has_option{prefix};
+ } elsif ($option =~ /-sources$/) {
+ undef $l;
+ undef $il;
+ ++$has_option{sources};
+ }
+ my ($fi, $fl, $fil, $fs)
+ = find_in_dir($try, $i, $l, $il, undef, undef, $src);
+ if ($fi || $fl || $fil) {
+ $found_itf = $fi if (! $found_itf && $fi);
+ $found_lib = $fl if (! $found_lib && $fl);
+ $found_ilib = $fil if (! $found_ilib && $fil);
+ $found_src = $fs if (! $found_src && $fs);
+ } elsif (! ($try =~ /$a{name}$/)) {
+ $try = File::Spec->catdir($try, $a{name});
+ ($fi, $fl, $fil) = find_in_dir($try, $i, $l, $il);
+ $found_itf = $fi if (! $found_itf && $fi);
+ $found_lib = $fl if (! $found_lib && $fl);
+ $found_ilib = $fil if (! $found_ilib && $fil);
+ }
+ } elsif ($need_bin) {
+ my (undef, $fl, $fil)
+ = find_in_dir($try, undef, $lib, $ilib, undef, $bin);
+ $found_bin = $fl if ($fl);
+ }
+ }
+ }
+ if (! $found_itf && ! $has_option{sources} && $a{srcpath}) {
+ my $try = $a{srcpath};
+ ($found_itf, undef, undef, $found_src)
+ = find_in_dir($try, $inc, undef, undef, undef, undef, $src);
+ }
+ if (! $has_option{prefix}) {
+ my $try = $a{pkgpath};
+ if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib)) {
+ my ($fi, $fl) = find_in_dir($try, $inc, $lib);
+ $found_itf = $fi if (! $found_itf && $fi);
+ $found_lib = $fl if (! $found_lib && $fl);
+ }
+
+ if ($need_jar && ! $found_jar) {
+ (undef, $found_jar) = find_in_dir($try, undef, undef, undef, $lib);
+ }
+
+ $try = $a{usrpath};
+ if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib)) {
+ my ($fi, $fl) = find_in_dir($try, $inc, $lib);
+ $found_itf = $fi if (! $found_itf && $fi);
+ $found_lib = $fl if (! $found_lib && $fl);
+ }
+
+ if ($need_jar && ! $found_jar) {
+ (undef, $found_jar) = find_in_dir($try, undef, undef, undef, $lib);
+ }
+ }
+ if (! $has_option{build}) {
+ if ($a{bldpath}) {
+ my $tolib = $need_build || ($need_lib && ! $found_lib);
+ my $tobin = $need_bin && ! $found_bin;
+ my $tojar = $need_jar && ! $found_jar;
+ if ($tolib || $tobin || $tojar) {
+ my ($fl, $fil, $found);
+ if ($OPT{'build-prefix'}) {
+ my $try = $OPT{'build-prefix'};
+ if ($tolib) {
+ (undef, $fl, $fil)
+ = find_in_dir($try, undef, $lib, $ilib);
+ if ($fl || $fil) {
+ $found_lib = $fl if (! $found_lib && $fl);
+ $found_ilib = $fil if (! $found_ilib && $fil);
+ ++$found;
+ }
+ }
+ if ($tojar) {
+ (undef, $found_jar)
+ = find_in_dir($try, undef, undef, undef, $lib);
+ }
+ if (! ($try =~ /$a{name}$/)) {
+ $try = File::Spec->catdir($try, $a{name});
+ if ($tolib && ! $found) {
+ (undef, $fl, $fil)
+ = find_in_dir($try, undef, $lib, $ilib);
+ if ($fl || $fil) {
+ $found_lib = $fl if (! $found_lib && $fl);
+ $found_ilib = $fil if (! $found_ilib && $fil);
+ ++$found;
+ }
+ }
+ if ($need_jar && ! $found_jar) {
+ (undef, $found_jar)
+ = find_in_dir($try, undef, undef, undef, $lib);
+ }
+ }
+ }
+ unless ($found || $fl || $fil) {
+ my $try = $a{bldpath};
+ $try = $a{locbldpath} if ($OPT{'local-build-out'});
+ if ($tolib && ! $found) {
+ (undef, $fl, $fil)
+ = find_in_dir($try, undef, $lib, $ilib);
+ my $resetLib = ! $found_lib;
+ if (! $found_ilib && $fil) {
+ $found_ilib = $fil;
+ ++$resetLib;
+ }
+ $found_lib = $fl if ($resetLib && $fl);
+ }
+ if ($tobin && ! $found) {
+ (undef, $fl, $fil) =
+ find_in_dir($try, undef, $lib, $ilib, undef, $bin);
+ $found_bin = $fl if ($fl);
+ }
+ if ($need_jar && ! $found_jar) {
+ (undef, $found_jar)
+ = find_in_dir($try, undef, undef, undef, $lib);
+ }
+ }
+ }
+ }
+ }
+ if (($need_itf && ! $found_itf) || ($need_lib && ! $found_lib) ||
+ ($need_jar && ! $found_jar) || ($ilib && ! $found_ilib) ||
+ ($need_bin && ! $found_bin))
+ {
+ if ($is_optional) {
+ println "configure: optional $a{name} package not found: skipped.";
+ } elsif ($quasi_optional && $found_itf && ($need_lib && ! $found_lib)) {
+ println "configure: $a{name} package: "
+ . "found interface files but not libraries.";
+ } else {
+ if ($OPT{'debug'}) {
+ $_ = "$a{name}: includes: ";
+ $found_itf = '' unless $found_itf;
+ $_ .= $found_itf;
+ unless ($need_lib) {
+ $_ .= "; libs: not needed";
+ } else {
+ $found_lib = '' unless $found_lib;
+ $_ .= "; libs: " . $found_lib;
+ }
+ unless ($ilib) {
+ $_ .= "; ilibs: not needed";
+ } else {
+ $found_ilib = '' unless $found_ilib;
+ $_ .= "; ilibs: " . $found_ilib;
+ }
+ println "\t\t$_";
+ }
+ println "configure: error: required $a{name} package not found.";
+ exit 1;
+ }
+ } else {
+ if ($found_itf) {
+ $found_itf = abs_path($found_itf);
+ push(@dependencies, "$a{aname}_INCDIR = $found_itf");
+ println "includes: $found_itf";
+ }
+ if ($found_src) {
+ $found_src = abs_path($found_src);
+ push(@dependencies, "$a{aname}_SRCDIR = $found_src");
+ println "sources: $found_src";
+ }
+ if ($found_lib) {
+ $found_lib = abs_path($found_lib);
+ if ($a{aname} eq 'NGS' || $a{aname} eq 'VDB') {
+ if ($OPT{PYTHON_LIB_PATH}) {
+ $OPT{PYTHON_LIB_PATH} .= ':';
+ } else {
+ $OPT{PYTHON_LIB_PATH} = '';
+ }
+ $OPT{PYTHON_LIB_PATH} .= $found_lib;
+ }
+ push(@dependencies, "$a{aname}_LIBDIR = $found_lib");
+ println "libraries: $found_lib";
+ }
+ if ($ilib && $found_ilib) {
+ $found_ilib = abs_path($found_ilib);
+ push(@dependencies, "$a{aname}_ILIBDIR = $found_ilib");
+ println "ilibraries: $found_ilib";
+ }
+ if ($found_bin) {
+ $found_bin = abs_path($found_bin);
+ push(@dependencies, "$a{aname}_BINDIR = $found_bin");
+ println "bin: $found_bin";
+ }
+ if ($found_jar) {
+ $found_jar = abs_path($found_jar);
+ push(@dependencies, "$a{aname}_JAR = $found_jar");
+ println "jar: $found_jar";
+ }
+ }
+}
+
+my ($E_BINDIR, $E_LIBDIR, $E_VERSION_LIBX, $E_MAJVERS_LIBX,
+ $E_VERSION_EXEX, $E_MAJVERS_EXEX)
+ = ('' , '');
+
+println unless ($AUTORUN);
+
+if ($OS ne 'win' && ! $OPT{'status'}) {
+ if ($OSTYPE =~ /darwin/i && CONFIG_OUT() ne '.') {
+ my $COMP = File::Spec->catdir(CONFIG_OUT(), 'COMP.mac');
+ println "configure: creating '$COMP' ($TOOLS)" unless ($AUTORUN);
+ open F, ">$COMP" or die "cannot open $COMP to write";
+ print F "$TOOLS\n";
+ close F;
+ }
+
+ if ($TOOLS =~ /gcc$/) {
+ my $EXECMDF = File::Spec->catdir(CONFIG_OUT(), 'ld.linux.exe_cmd.sh');
+ println "configure: creating '$EXECMDF'" unless ($AUTORUN);
+ open F, ">$EXECMDF" or die "cannot open $EXECMDF to write";
+ print F "EXE_CMD=\"\$LD $STATIC_LIBSTDCPP -static-libgcc\"\n";
+ close F;
+ }
+
+ # create Makefile.config
+ println "configure: creating '$OUT_MAKEFILE'" unless ($AUTORUN);
+ open my $F, ">$OUT_MAKEFILE" or die "cannot open $OUT_MAKEFILE to write";
+
+ print $F <<EndText;
+### AUTO-GENERATED FILE ###
+
+# configuration command
+
+CONFIGURED = $CONFIGURED
+
+OS_ARCH = \$(shell perl \$(TOP)/setup/os-arch.perl)
+
+# install paths
+EndText
+
+ L($F, "INST_BINDIR = $OPT{'bindir'}" ) if ($OPT{'bindir'});
+ L($F, "INST_LIBDIR = $OPT{'libdir'}" ) if ($OPT{'libdir'});
+ L($F, "INST_INCDIR = $OPT{'includedir'}" ) if ($OPT{'includedir'});
+ L($F, "INST_SCHEMADIR = $OPT{'shemadir'}" ) if ($OPT{'shemadir'});
+ L($F, "INST_SHAREDIR = $OPT{'sharedir'}" ) if ($OPT{'sharedir'});
+ L($F, "INST_JARDIR = $OPT{'javadir'}" ) if ($OPT{'javadir'});
+ L($F, "INST_PYTHONDIR = $OPT{'pythondir'}") if ($OPT{'pythondir'});
+
+ my ($E_VERSION_SHLX, $VERSION_SHLX,
+ $E_MAJVERS_SHLX , $MAJMIN_SHLX, $MAJVERS_SHLX);
+ if ($OSTYPE =~ /darwin/i) {
+ $E_VERSION_SHLX = '$VERSION.$SHLX';
+ $VERSION_SHLX = '$(VERSION).$(SHLX)';
+ $MAJMIN_SHLX = '$(MAJMIN).$(SHLX)';
+ $E_MAJVERS_SHLX = '$MAJVERS.$SHLX';
+ $MAJVERS_SHLX = '$(MAJVERS).$(SHLX)';
+ } else {
+ $E_VERSION_SHLX = '$SHLX.$VERSION';
+ $VERSION_SHLX = '$(SHLX).$(VERSION)';
+ $MAJMIN_SHLX = '$(SHLX).$(MAJMIN)';
+ $E_MAJVERS_SHLX = '$SHLX.$MAJVERS';
+ $MAJVERS_SHLX = '$(SHLX).$(MAJVERS)';
+ }
+
+ $E_VERSION_LIBX = '$LIBX.$VERSION';
+ $E_MAJVERS_LIBX = '$LIBX.$MAJVERS';
+
+ L($F);
+ L($F, "# build type");
+
+ if ($OPT{'enable-static'}) {
+ L($F, "WANTS_STATIC = 1");
+ }
+
+ $E_VERSION_EXEX = '$EXEX.$VERSION';
+ $E_MAJVERS_EXEX = '$LIBX.$MAJVERS';
+
+ print $F <<EndText;
+BUILD = $BUILD
+
+# target OS
+OS = $OS
+OSINC = $OSINC
+OS_DISTRIBUTOR = $OS_DISTRIBUTOR
+
+# prefix string for system libraries
+LPFX = $LPFX
+
+# suffix strings for system libraries
+LIBX = $LIBX
+VERSION_LIBX = \$(LIBX).\$(VERSION)
+MAJMIN_LIBX = \$(LIBX).\$(MAJMIN)
+MAJVERS_LIBX = \$(LIBX).\$(MAJVERS)
+
+SHLX = $SHLX
+VERSION_SHLX = $VERSION_SHLX
+MAJMIN_SHLX = $MAJMIN_SHLX
+MAJVERS_SHLX = $MAJVERS_SHLX
+
+# suffix strings for system object files
+OBJX = $OBJX
+LOBX = $LOBX
+
+# suffix string for system executable
+EXEX = $EXEX
+VERSION_EXEX = \$(EXEX).\$(VERSION)
+MAJMIN_EXEX = \$(EXEX).\$(MAJMIN)
+MAJVERS_EXEX = \$(EXEX).\$(MAJVERS)
+
+# system architecture and wordsize
+ARCH = $ARCH
+EndText
+
+ L($F, "# ARCH = $ARCH ( $MARCH )") if ($ARCH ne $MARCH);
+
+ print $F <<EndText;
+BITS = $BITS
+
+# tools
+EndText
+
+ L($F, "CC = $CC" ) if ($CC);
+ L($F, "CPP = $CPP" ) if ($CPP);
+ L($F, "CP = $CP" ) if ($CP);
+ L($F, "AR = $AR" ) if ($AR);
+ L($F, "ARX = $ARX" ) if ($ARX);
+ L($F, "ARLS = $ARLS" ) if ($ARLS);
+ L($F, "LD = $LD" ) if ($LD);
+ L($F, "LP = $LP" ) if ($LP);
+ L($F, "JAVAC = $JAVAC" ) if ($JAVAC);
+ L($F, "JAVAH = $JAVAH" ) if ($JAVAH);
+ L($F, "JAR = $JAR" ) if ($JAR);
+ L($F, "MAKE_MANIFEST = $MAKE_MANIFEST") if ($MAKE_MANIFEST);
+ L($F);
+
+ L($F, '# tool options');
+ if ($BUILD eq "dbg") {
+ L($F, "DBG = $DBG");
+ L($F, "OPT = ");
+ } else {
+ L($F, "DBG = -DNDEBUG") if ($PKG{LNG} eq 'C');
+ L($F, "OPT = $OPT" ) if ($OPT);
+ }
+ L($F, "PIC = $PIC") if ($PIC);
+ if ($PKG{LNG} eq 'C') {
+ if ($TOOLS =~ /clang/i) {
+ L($F, 'SONAME = -install_name ' .
+ '$(INST_LIBDIR)$(BITS)/$(subst $(VERSION),$(MAJVERS),$(@F)) \\');
+ L($F, ' -compatibility_version $(MAJMIN) -current_version $(VERSION) \\');
+ L($F, ' -flat_namespace -undefined suppress');
+ } else {
+ L($F, 'SONAME = -Wl,-soname=$(subst $(VERSION),$(MAJVERS),$(@F))');
+ }
+ L($F, "SRCINC = $INC. $INC\$(SRCDIR)");
+ } elsif ($PKG{LNG} eq 'JAVA') {
+ L($F, 'SRCINC = -sourcepath $(INCPATHS)');
+ }
+ if ($PIC) {
+ if (PACKAGE_NAMW() eq 'NGS') {
+ L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP) "
+ . "$INC\$(TOP)/ngs/\$(OSINC)/\$(ARCH)")
+ } elsif (PACKAGE_NAMW() eq 'NGS_BAM') {
+ L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP) "
+ . "$INC\$(NGS_INCDIR)/ngs/\$(OSINC)/\$(ARCH)")
+ } else {
+ L($F, "INCDIRS = \$(SRCINC) $INC\$(TOP)")
+ }
+ }
+ if ($PKG{LNG} eq 'C') {
+ L($F, "CFLAGS = \$(DBG) \$(OPT) \$(INCDIRS) $MD $ARCH_FL");
+ }
+ L($F, "LDFLAGS = $LDFLAGS") if ($LDFLAGS);
+
+ L($F, 'CLSPATH = -classpath $(CLSDIR)');
+ L($F, "NO_ARRAY_BOUNDS_WARNING = $NO_ARRAY_BOUNDS_WARNING");
+ L($F);
+
+# $PACKAGE_NAME and library version
+# \$(VERSION) is defined in a separate file which is updated every release
+ L($F, "include \$(TOP)/" . CONFIG_OUT() . "/Makefile.vers" );
+
+ print $F <<EndText;
+
+empty :=
+space := \$(empty) \$(empty)
+MAJMIN = \$(subst \$(space),.,\$(wordlist 1,2,\$(subst .,\$(space),\$(VERSION))))
+MAJVERS = \$(firstword \$(subst .,\$(space),\$(VERSION)))
+
+# output path
+BUILD_PREFIX = $BUILD_PREFIX
+TARGDIR = $TARGDIR
+
+# derived paths
+MODPATH ?= \$(subst \$(TOP)/,,\$(CURDIR))
+SRCDIR ?= \$(TOP)/\$(MODPATH)
+MAKEFILE ?= \$(abspath \$(firstword \$(MAKEFILE_LIST)))
+BINDIR = \$(TARGDIR)/bin
+EndText
+
+ if ($PKG{LNG} eq 'C') {
+ $E_BINDIR = '$TARGDIR/bin';
+ $E_LIBDIR = '$TARGDIR/lib';
+ L($F, 'LIBDIR = $(TARGDIR)/lib');
+ } elsif ($PKG{LNG} eq 'JAVA') {
+ $E_LIBDIR = '$TARGDIR/jar';
+ L($F, 'LIBDIR = $(TARGDIR)/jar');
+ }
+
+ L($F, 'ILIBDIR = $(TARGDIR)/ilib');
+ if ($PKG{NOMODPATH}) {
+ L($F, 'OBJDIR = $(TARGDIR)/obj');
+ } else {
+ L($F, 'OBJDIR = $(TARGDIR)/obj/$(MODPATH)');
+ }
+ L($F, 'CLSDIR = $(TARGDIR)/cls');
+
+ if ($PKG{LNG} eq 'JAVA') {
+ L($F,
+ "INCPATHS = \$(SRCDIR):\$(SRCDIR)/itf:\$(TOP)/gov/nih/nlm/ncbi/ngs")
+ }
+
+ print $F <<EndText;
+
+# exports
+export TOP
+export MODPATH
+export SRCDIR
+export MAKEFILE
+
+# auto-compilation rules
+EndText
+
+ if ($PKG{LNG} eq 'C') {
+ L($F, '$(OBJDIR)/%.$(OBJX): %.c');
+ T($F, '$(CC) -o $@ $< $(CFLAGS)');
+ L($F, '$(OBJDIR)/%.$(LOBX): %.c');
+ T($F, '$(CC) -o $@ $< $(PIC) $(CFLAGS)');
+ }
+ L($F, '$(OBJDIR)/%.$(OBJX): %.cpp');
+ T($F, '$(CP) -o $@ $< $(CFLAGS)');
+ L($F, '$(OBJDIR)/%.$(LOBX): %.cpp');
+ T($F, '$(CP) -o $@ $< $(PIC) $(CFLAGS)');
+ L($F);
+
+ # this is part of Makefile
+ L($F, 'VPATH = $(SRCDIR)');
+ L($F);
+
+ # we know how to find jni headers
+ if ($PKG{LNG} eq 'JAVA' and $OPT{'with-ngs-sdk-src'}) {
+ L($F, "JNIPATH = $OPT{'with-ngs-sdk-src'}/language/java");
+ }
+
+ L($F, '# directory rules');
+ if ($PKG{LNG} eq 'C') {
+ L($F, '$(BINDIR) $(LIBDIR) $(ILIBDIR) '
+ . '$(OBJDIR) $(INST_LIBDIR) $(INST_LIBDIR)$(BITS):');
+ T($F, 'mkdir -p $@');
+ } elsif ($PKG{LNG} eq 'JAVA') {
+ # test if we have jni header path
+ L($F, '$(LIBDIR) $(CLSDIR) $(INST_JARDIR):');
+ T($F, 'mkdir -p $@');
+ }
+ L($F);
+
+ L($F, '# not real targets');
+ L($F, '.PHONY: default clean install all std $(TARGETS)');
+ L($F);
+
+ L($F, '# dependencies');
+ if ($PKG{LNG} eq 'C') {
+ L($F, 'include $(wildcard $(OBJDIR)/*.d)');
+ } elsif ($PKG{LNG} eq 'JAVA') {
+ L($F, 'include $(wildcard $(CLSDIR)/*.d)');
+ }
+ L($F, $_) foreach (@dependencies);
+ L($F);
+
+ # pass HAVE_XML2 to build scripts
+ L($F, 'ifeq (,$(HAVE_XML2))');
+ L($F, ' HAVE_XML2=0');
+ L($F, 'endif');
+ L($F, 'CONFIGURE_FOUND_XML2=$(HAVE_XML2)');
+ L($F, 'export CONFIGURE_FOUND_XML2');
+ L($F);
+
+ if ($OS eq 'linux' || $OS eq 'mac') {
+ L($F, '# installation rules');
+ L($F,
+ '$(INST_LIBDIR)$(BITS)/%.$(VERSION_LIBX): $(LIBDIR)/%.$(VERSION_LIBX)');
+ T($F, '@ echo -n "installing \'$(@F)\'... "');
+ T($F, '@ if cp $^ $@ && chmod 644 $@; \\');
+ T($F, ' then \\');
+ T($F, ' rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+ . '$(patsubst %$(VERSION_LIBX),%$(LIBX),$@) '
+ . '$(patsubst %.$(VERSION_LIBX),%-static.$(LIBX),$@); \\');
+ T($F, ' ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@); \\');
+ T($F, ' ln -s $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+ . '$(patsubst %$(VERSION_LIBX),%$(LIBX),$@); \\');
+ T($F, ' ln -s $(patsubst %$(VERSION_LIBX),%$(LIBX),$(@F)) ' .
+ '$(INST_LIBDIR)$(BITS)/$(patsubst %.$(VERSION_LIBX),%-static.$(LIBX),$(@F));'
+ . ' \\');
+ T($F, ' echo success; \\');
+ T($F, ' else \\');
+ T($F, ' echo failure; \\');
+ T($F, ' false; \\');
+ T($F, ' fi');
+ L($F);
+
+ L($F,
+ '$(INST_LIBDIR)$(BITS)/%.$(VERSION_SHLX): $(LIBDIR)/%.$(VERSION_SHLX)');
+ T($F, '@ echo -n "installing \'$(@F)\'... "');
+ T($F, '@ if cp $^ $@ && chmod 755 $@; \\');
+ T($F, ' then \\');
+ if ($OS ne 'mac') {
+ T($F, ' rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+ . '$(patsubst %$(VERSION_SHLX),%$(SHLX),$@); \\');
+ }
+ if ($OS eq 'linux') {
+ T($F, ' ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@); \\');
+ } elsif ($OS eq 'mac') {
+ T($F, ' ln -sf $(@F) '
+ . '$(patsubst %$(VERSION_SHLX),%$(MAJVERS).$(SHLX),$@); \\');
+ } else {
+ die;
+ }
+ T($F, ' ln -sf $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+ . '$(patsubst %$(VERSION_SHLX),%$(SHLX),$@); \\');
+ T($F, ' echo success; \\');
+ T($F, ' else \\');
+ T($F, ' echo failure; \\');
+ T($F, ' false; \\');
+ T($F, ' fi');
+ L($F);
+
+ L($F, '$(INST_BINDIR)/%$(VERSION_EXEX): $(BINDIR)/%$(VERSION_EXEX)');
+ T($F, '@ echo -n "installing \'$(@F)\'... "');
+ T($F, '@ if cp $^ $@ && chmod 755 $@; \\');
+ T($F, ' then \\');
+ T($F, ' rm -f $(patsubst %$(VERSION),%$(MAJVERS),$@) '
+ . '$(patsubst %$(VERSION_EXEX),%$(EXEX),$@); \\');
+ T($F, ' ln -s $(@F) $(patsubst %$(VERSION),%$(MAJVERS),$@); \\');
+ T($F, ' ln -s $(patsubst %$(VERSION),%$(MAJVERS),$(@F)) '
+ . '$(patsubst %$(VERSION_EXEX),%$(EXEX),$@); \\');
+ T($F, ' echo success; \\');
+ T($F, ' else \\');
+ T($F, ' echo failure; \\');
+ T($F, ' false; \\');
+ T($F, ' fi');
+ }
+ close $F;
+
+ # creation of Makefile.config.install is disabled, since nobody uses it now
+ # and I need to remove versions from prl scripts
+ if (0) {
+ # create Makefile.config.install
+ println "configure: creating '$INS_MAKEFILE'" unless ($AUTORUN);
+ open $F, ">$INS_MAKEFILE" or die "cannot open $INS_MAKEFILE to write";
+
+ $OPT{'javadir' } = '' unless ($OPT{'javadir' });
+ $OPT{'sharedir'} = '' unless ($OPT{'sharedir'});
+
+ print $F "sub CONFIGURE {\n";
+ print $F " \$_{PACKAGE_NAME } = '$PACKAGE_NAME';\n";
+ print $F " \$_{VERSION } = '\$VERSION';\n";
+ print $F " \$_{LNG } = '$PKG{LNG}';\n";
+ print $F " \$_{OS } = '$OS';\n";
+ print $F " \$_{BITS } = $BITS;\n";
+ print $F " \$_{MAJVERS } = \$MAJVERS;\n";
+ print $F " \$_{LPFX } = '$LPFX';\n";
+ print $F " \$_{LIBX } = '$LIBX';\n";
+ print $F " \$_{MAJVERS_LIBX } = '" . expand($E_MAJVERS_LIBX) . "';\n";
+ print $F " \$_{VERSION_LIBX } = '" . expand($E_VERSION_LIBX) . "';\n";
+ print $F " \$_{SHLX } = '$SHLX';\n";
+ print $F " \$_{MAJVERS_SHLX } = '" . expand($E_MAJVERS_SHLX) . "';\n";
+ print $F " \$_{VERSION_SHLX } = '" . expand($E_VERSION_SHLX) . "';\n";
+ print $F " \$_{VERSION_EXEX } = '" . expand($E_VERSION_EXEX) . "';\n";
+ print $F " \$_{MAJVERS_EXEX } = '" . expand($E_MAJVERS_EXEX) . "';\n";
+ print $F " \$_{INCDIR } = '" . expand("$Bin/.." ) . "';\n";
+ if ($PKG{LNG} ne 'PYTHON') {
+ print $F " \$_{BINDIR$BITS} = '" . expand($E_BINDIR ) . "';\n";
+ print $F " \$_{LIBDIR$BITS} = '" . expand($E_LIBDIR ) . "';\n";
+ } elsif ($OPT{PYTHON_LIB_PATH}) {
+ print $F " \$_{LIBDIR$BITS} = '$OPT{PYTHON_LIB_PATH}';\n";
+ }
+ print $F " \$_{OTHER_PREFIX } = '$PKG{UPATH}';\n";
+ print $F " \$_{PREFIX } = '$OPT{'prefix'}';\n";
+ print $F " \$_{INST_INCDIR } = '$OPT{'includedir'}';\n";
+ print $F " \$_{INST_BINDIR } = '$OPT{'bindir'}';\n";
+ print $F " \$_{INST_LIBDIR } = '$OPT{'libdir'}';\n";
+ print $F " \$_{INST_JARDIR } = '$OPT{'javadir'}';\n";
+ print $F " \$_{INST_SHAREDIR} = '$OPT{'sharedir'}';\n";
+ print $F "\n";
+ print $F " \@_\n";
+ print $F "}\n";
+ print $F "\n";
+ print $F "1\n";
+
+ close $F;
+ }
+}
+
+if (! $OPT{'status'} ) {
+ if ($OS eq 'win') {
+ my $OUT = File::Spec->catdir(CONFIG_OUT(), 'Makefile.config.win');
+ println "configure: creating '$OUT'";
+ open OUT, ">$OUT" or die "cannot open $OUT to write";
+ my $name = PACKAGE_NAMW();
+ my $outdir = $name . '_OUTDIR';
+ my $root = $name . '_ROOT';
+
+ print OUT <<EndText;
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Label="Globals">
+ <$outdir>$TARGDIR/\</$outdir>
+EndText
+ foreach my $href (@REQ) {
+ my %a = %$href;
+ my $NGS_SDK_PREFIX = '';
+ $NGS_SDK_PREFIX = $a{found_itf} if ($a{found_itf});
+ if ($a{name} eq 'ngs-sdk') {
+ my $root = "$a{aname}_ROOT";
+ print OUT " <$root>$NGS_SDK_PREFIX\/</$root>\n";
+ last;
+ }
+ }
+ print OUT <<EndText;
+ <$root>$Bin/\</$root>
+ </PropertyGroup>
+</Project>
+EndText
+ close OUT;
+ } else {
+ println "configure: creating 'Makefile.config'" unless ($AUTORUN);
+ my $CONFIG_OUT = CONFIG_OUT();
+ my $out = File::Spec->catdir($CONFIG_OUT, 'Makefile.config');
+ open COUT, ">$out" or die "cannot open $out to write";
+ print COUT "### AUTO-GENERATED FILE ###\n";
+ print COUT "\n";
+ print COUT "OS_ARCH = \$(shell perl \$(TOP)/setup/os-arch.perl)\n";
+ print COUT "include \$(TOP)/$CONFIG_OUT/Makefile.config.\$(OS_ARCH)\n";
+ close COUT;
+ }
+}
+
+unless ($OPT{'reconfigure'}) {
+ println "configure: creating 'reconfigure'" unless ($AUTORUN);
+ $CONFIGURED =~ s/\t/ /g;
+ open my $F, '>reconfigure' or die 'cannot open reconfigure to write';
+ print $F "./configure $CONFIGURED\n";
+ close $F;
+ # my $perm = (stat $fh)[2] & 07777;
+# print "==================================================== $perm\n";
+}
+
+status() if ($OS ne 'win');
+
+unlink 'a.out';
+
+sub L { $_[1] = '' unless ($_[1]); print { $_[0] } "$_[1]\n" }
+sub T { print { $_[0] } "\t$_[1]\n" }
+
+sub status {
+ my ($load) = @_;
+ if ($load) {
+ ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+ my $MAKEFILE
+ = File::Spec->catdir(CONFIG_OUT(), "$OUT_MAKEFILE.$OS.$ARCH");
+ println "\t\tloading $MAKEFILE" if ($OPT{'debug'});
+ unless (-e $MAKEFILE) {
+ print STDERR "configure: error: run ./configure [OPTIONS] first.\n";
+ exit 1;
+ }
+ open F, $MAKEFILE or die "cannot open $MAKEFILE";
+ foreach (<F>) {
+ chomp;
+ if (/BUILD = (.+)/) {
+ $BUILD_TYPE = $1;
+ } elsif (/BUILD \?= /) {
+ $BUILD_TYPE = $_ unless ($BUILD_TYPE);
+ } elsif (/BUILD_PREFIX = /) {
+ $BUILD_PREFIX = $_;
+ } elsif (/^CC += (.+)/) {
+ $CC = $1;
+ } elsif (/CONFIGURED = (.*)/) {
+ $CONFIGURED = $1;
+ } elsif (/CPP += (.+)/) {
+ $CPP = $1;
+ } elsif (/LDFLAGS += (.+)/) {
+ $LDFLAGS = $1;
+ } elsif (/TARGDIR = /) {
+ $TARGDIR = $_;
+ println "\t\tgot $_" if ($OPT{'debug'});
+ } elsif (/TARGDIR \?= (.+)/) {
+ $TARGDIR = $1 unless ($TARGDIR);
+ println "\t\tgot $_" if ($OPT{'debug'});
+ }
+ elsif (/INST_INCDIR = (.+)/) {
+ $OPT{'includedir'} = $1;
+ }
+ elsif (/INST_BINDIR = (.+)/) {
+ $OPT{'bindir'} = $1;
+ }
+ elsif (/INST_LIBDIR = (.+)/) {
+ $OPT{'libdir'} = $1;
+ }
+ }
+ }
+
+ println "build type: $BUILD_TYPE";
+ println "build prefix: $BUILD_PREFIX" if ($OS ne 'win');
+ println "build output path: $TARGDIR" if ($OS ne 'win');
+
+# print "prefix: "; print $OPT{'prefix'} if ($OS ne 'win'); println;
+# print "eprefix: "; print $OPT{'eprefix'} if ($OPT{'eprefix'}); println;
+
+ print "includedir: ";
+ print $OPT{'includedir'} if ($OPT{'includedir'});
+ println;
+
+ print "bindir: ";
+ print $OPT{'bindir'} if ($OPT{'bindir'});
+ println;
+
+ print "libdir: ";
+ print $OPT{'libdir'} if ($OPT{'libdir'});
+ println;
+
+ println "schemadir: $OPT{'shemadir'}" if ($OPT{'shemadir'});
+ println "sharedir: $OPT{'sharedir'}" if ($OPT{'sharedir'});
+ println "javadir: $OPT{'javadir'}" if ($OPT{'javadir'});
+ println "pythondir: $OPT{'pythondir'}" if ($OPT{'pythondir'});
+
+ println "CC = $CC" if ($CC );
+ println "CPP = $CPP" if ($CPP);
+ println "LDFLAGS = $LDFLAGS" if ($LDFLAGS);
+
+ $CONFIGURED =~ s/\t/ /g;
+ println "configured with: \"$CONFIGURED\"";
+}
+
+sub expand { $_[0] =~ s/(\$\w+)/$1/eeg; $_[0]; }
+
+sub expand_path {
+ my ($filename) = @_;
+ return unless ($filename);
+
+ if ($filename =~ /^~/) {
+ if ($filename =~ m|^~([^/]*)|) {
+ if ($1 && ! getpwnam($1)) {
+ print "configure: error: bad path: '$filename'\n";
+ exit 1;
+ }
+ }
+
+ $filename =~ s{ ^ ~ ( [^/]* ) }
+ { $1
+ ? (getpwnam($1))[7]
+ : ( $ENV{HOME} || $ENV{USERPROFILE} || $ENV{LOGDIR}
+ || (getpwuid($<))[7]
+ )
+ }ex;
+ }
+
+ my $a = abs_path($filename);
+ $filename = $a if ($a);
+ $filename;
+}
+
+sub find_in_dir {
+ my ($dir, $include, $lib, $ilib, $jar, $bin, $src) = @_;
+ unless (-d $dir) {
+ println "\t\tnot found $dir" if ($OPT{'debug'});
+ return;
+ }
+ my ($found_inc, $found_lib, $found_ilib, $found_src);
+ if ($include) {
+ print "\tincludes... " unless ($AUTORUN);
+ if (-e "$dir/$include") {
+ println $dir unless ($AUTORUN);
+ $found_inc = $dir;
+ } elsif (-e "$dir/include/$include") {
+ println $dir unless ($AUTORUN);
+ $found_inc = "$dir/include";
+ } elsif (-e "$dir/interfaces/$include") {
+ println $dir unless ($AUTORUN);
+ $found_inc = "$dir/interfaces";
+ } else {
+ print "$dir: " if ($OPT{'debug'});
+ println 'no' unless ($AUTORUN);
+ }
+ }
+ if ($lib || $ilib) {
+ print "\tlibraries... " unless ($AUTORUN);
+ if ($lib) {
+ my $builddir = File::Spec->catdir($dir, $OS, $TOOLS, $ARCH, $BUILD);
+ my $libdir = File::Spec->catdir($builddir, 'lib');
+ my $ilibdir = File::Spec->catdir($builddir, 'ilib');
+ my $f = File::Spec->catdir($libdir, $lib);
+ print "\n\t\tchecking $f\n\t" if ($OPT{'debug'});
+ my $found;
+ if (-e $f) {
+ $found_lib = $libdir;
+ if ($ilib) {
+ my $f = File::Spec->catdir($ilibdir, $ilib);
+ print "\tchecking $f\n\t" if ($OPT{'debug'});
+ if (-e $f) {
+ println $ilibdir;
+ $found_ilib = $ilibdir;
+ } else {
+ println 'no' unless ($AUTORUN);
+ return;
+ }
+ } else {
+ println $libdir;
+ }
+ ++$found;
+ }
+ if (! $found) {
+ my $libdir = File::Spec->catdir($dir, 'lib' . $BITS);
+ my $f = File::Spec->catdir($libdir, $lib);
+ print "\tchecking $f\n\t" if ($OPT{'debug'});
+ if (-e $f) {
+ println $libdir;
+ $found_lib = $libdir;
+ ++$found;
+ }
+ }
+ if (! $found) {
+ my $builddir = File::Spec->catdir
+ ($dir, $OS, $TOOLS, $ARCH, reverse_build($BUILD));
+ my $libdir = File::Spec->catdir($builddir, 'lib');
+ my $ilibdir = File::Spec->catdir($builddir, 'ilib');
+ my $f = File::Spec->catdir($libdir, $lib);
+ print "\tchecking $f\n\t" if ($OPT{'debug'});
+ if (-e $f) {
+ $found_lib = $libdir;
+ if ($ilib) {
+ my $f = File::Spec->catdir($ilibdir, $ilib);
+ print "\tchecking $f\n\t" if ($OPT{'debug'});
+ if (-e $f) {
+ println $ilibdir;
+ $found_ilib = $ilibdir;
+ } else {
+ println 'no' unless ($AUTORUN);
+ return;
+ }
+ } else {
+ println $libdir;
+ }
+ ++$found;
+ } else {
+ println 'no' unless ($AUTORUN);
+ }
+ }
+ }
+ if ($found_lib && $ilib && ! $found_ilib) {
+ println "\n\t\tfound $found_lib but no ilib/" if ($OPT{'debug'});
+ print "\t" if ($OPT{'debug'});
+ println 'no' unless ($AUTORUN);
+ undef $found_lib;
+ }
+ }
+ if ($bin) {
+ print "\t... " unless ($AUTORUN);
+ my $builddir = File::Spec->catdir($dir, $OS, $TOOLS, $ARCH, $BUILD);
+ my $bdir = File::Spec->catdir($builddir, 'bin');
+ my $f = File::Spec->catdir($bdir, $bin);
+ print "\n\t\tchecking $f\n\t" if ($OPT{'debug'});
+ if (-e $f) {
+ $found_lib = $bdir;
+ println $bdir;
+ } else {
+ println 'no' unless ($AUTORUN);
+ }
+ }
+ if ($jar) {
+ print "\tjar... " unless ($AUTORUN);
+ my $try = "$dir/jar/$jar";
+ if (-e "$try") {
+ println $try unless ($AUTORUN);
+ $found_lib = $try;
+ }
+ }
+ if ($src) {
+ print "\tsrc... " unless ($AUTORUN);
+ my $try = "$dir/$src";
+ if (-e "$try") {
+ println $dir unless ($AUTORUN);
+ $found_src = $dir;
+ }
+ }
+ return ($found_inc, $found_lib, $found_ilib, $found_src);
+}
+
+sub reverse_build {
+ ($_) = @_;
+ if ($_ eq 'rel') {
+ return 'dbg';
+ } elsif ($_ eq 'dbg') {
+ return 'rel';
+ } else {
+ die $_;
+ }
+}
+
+################################################################################
+
+sub check_tool_h { return check_tool(@_, '-help'); }
+sub check_tool__h { return check_tool(@_, '--help'); }
+
+sub check_tool {
+ my ($tool, $o) = @_;
+ print "checking for $tool... ";
+ my $cmd = "$tool $o";
+ print "\n\t\trunning $cmd\n\t" if ($OPT{'debug'});
+ my $out = `$cmd 2>&1`;
+ if ($? == 0) {
+ println "yes";
+ return 1;
+ } else {
+ println "no";
+ return 0;
+ }
+}
+
+sub check_no_array_bounds {
+ check_compiler('O', '-Wno-array-bounds');
+}
+
+sub check_static_libstdcpp {
+ my $option = '-static-libstdc++';
+ my $save = $TOOLS;
+ $TOOLS = $CPP;
+ $_ = check_compiler('O', $option);
+ $TOOLS = $save;
+ $_ ? $option : ''
+}
+
+sub find_lib {
+ check_compiler('L', @_);
+}
+
+sub check_compiler {
+ my ($t, $n, $i, $l) = @_;
+ my $tool = $TOOLS;
+
+ if ($t eq 'L') {
+ print "checking for $n library... ";
+ } elsif ($t eq 'O') {
+ if ($tool && ($tool =~ /gcc$/ || $tool =~ /g\+\+$/)) {
+ print "checking whether $tool accepts $n... ";
+ } else {
+ return;
+ }
+ } else {
+ die "Unknown check_compiler option: '$t'";
+ }
+
+ unless ($tool) {
+ println "warning: unknown tool";
+ return;
+ }
+
+ while (1) {
+ my ($flags, $library, $log) = ('', '');
+
+ if ($t eq 'O') {
+ $flags = $n;
+ $log = ' int main() { }\n'
+ } elsif ($n eq 'hdf5') {
+ $library = '-lhdf5';
+ $log = '#include <hdf5.h> \n int main() { H5close (); }\n'
+ } elsif ($n eq 'fuse') {
+ $flags = '-D_FILE_OFFSET_BITS=64';
+ $library = '-lfuse';
+ $log = '#include <fuse.h> \n int main() { fuse_get_context(); }\n'
+ } elsif ($n eq 'magic') {
+ $library = '-lmagic';
+ $log = '#include <magic.h> \n int main() { magic_open (0); }\n'
+ } elsif ($n eq 'xml2') {
+ $library = '-lxml2';
+ $library .= ' -liconv' if ($OS eq 'mac');
+ $log = '#include <libxml/xmlreader.h>\n' .
+ 'int main() { xmlInitParser ( ); }\n'
+ } else {
+ println 'unknown: skipped';
+ return;
+ }
+
+ if ($i && ! -d $i) {
+ print "'$i': " if ($OPT{'debug'});
+ println 'no';
+ return;
+ }
+ if ($l && ! -d $l) {
+ print "'$l': " if ($OPT{'debug'}); println 'no';
+ return;
+ }
+
+ my $cmd = $log;
+ $cmd =~ s/\\n/\n/g;
+
+ my $gcc = "| $tool -xc $flags " . ($i ? "-I$i " : ' ')
+ . ($l ? "-L$l " : ' ') . "- $library";
+ $gcc .= ' 2> /dev/null' unless ($OPT{'debug'});
+
+ open GCC, $gcc or last;
+ print "\n\t\trunning echo -e '$log' $gcc\n" if ($OPT{'debug'});
+ print GCC "$cmd" or last;
+ my $ok = close GCC;
+ print "\t" if ($OPT{'debug'});
+ println $ok ? 'yes' : 'no';
+
+ unlink 'a.out';
+
+ return if (!$ok);
+
+ return 1 if ($t eq 'O');
+
+ return ($i, $l);
+ }
+
+ println "cannot run $tool: skipped";
+}
+
+################################################################################
+
+sub check {
+ die "No CONFIG_OUT" unless CONFIG_OUT();
+ die "No PACKAGE" unless PACKAGE();
+ die "No PACKAGE_NAME" unless PACKAGE_NAME();
+ die "No PACKAGE_NAMW" unless PACKAGE_NAMW();
+ die "No PACKAGE_TYPE" unless PACKAGE_TYPE();
+
+ my %PKG = PKG();
+
+ die "No LNG" unless $PKG{LNG};
+ die "No LOCOUT" unless $PKG{LOCOUT};
+ die "No OUT" unless $PKG{OUT};
+ die "No PATH" unless $PKG{PATH};
+ die "No UPATH" unless $PKG{UPATH};
+
+ foreach my $href (DEPENDS()) { die "No DEPENDS::name" unless $href->{name} }
+
+ foreach my $href (REQ()) {
+ die "No REQ::name" unless $href->{name};
+
+ die "No $href->{name}:option" unless $href->{option}
+ || $href->{boption};
+
+ die "No $href->{name}:type" unless $href->{type};
+ unless ($href->{type} =~ /I/) {
+ unless ($href->{type} =~ /E/) {
+ die "No $href->{name}:lib" unless $href->{lib};
+ }
+ die "No $href->{name}:pkgpath" unless $href->{pkgpath};
+ die "No $href->{name}:usrpath" unless $href->{usrpath};
+ }
+
+ die "No $href->{name}:origin" unless $href->{origin};
+ if ($href->{origin} eq 'I') {
+ die "No $href->{name}:aname" unless $href->{aname};
+ unless ($href->{type} =~ /D/ || $href->{type} =~ /E/
+ || $href->{type} =~ /J/)
+ {
+ die "No $href->{name}:include" unless $href->{include};
+ die "No $href->{name}:srcpath" unless $href->{srcpath};
+ }
+ unless ($href->{type} =~ /I/) {
+ die "No $href->{name}:bldpath" unless $href->{bldpath };
+ die "No $href->{name}:locbldpath" unless $href->{locbldpath};
+ }
+ if ($href->{type} =~ /B/) {
+ die "No $href->{name}:ilib" unless $href->{ilib};
+ }
+ }
+ }
+}
+
+################################################################################
+
+sub optional { $_[0] =~ /O/ }
+
+sub help {
+# --prefix=PREFIX install architecture-independent files in PREFIX
+ print <<EndText;
+`configure' configures $PACKAGE_NAME to adapt to many kinds of systems.
+
+Usage: ./configure [OPTION]...
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+
+EndText
+
+ if ($^O ne 'MSWin32') {
+ print <<EndText;
+Installation directories:
+ --prefix=PREFIX install all files in PREFIX
+ [$package_default_prefix]
+
+EndText
+
+ my $other_prefix = $PKG{UPATH};
+ if ($PACKAGE eq 'sra-tools' && 0) {
+ print <<EndText;
+ --shemadir=DIR install schema files in DIR
+ [$schema_default_dir]
+
+EndText
+ }
+
+ print "By default, \`make install' will install all the files in\n";
+
+ if (PACKAGE_TYPE() eq 'B') {
+ print "\`$package_default_prefix/bin', ";
+ } elsif (PACKAGE_TYPE() eq 'L') {
+ print "\`$package_default_prefix/include', ";
+ }
+ if (PACKAGE_TYPE() eq 'P') {
+ println "\`$package_default_prefix/share' etc.";
+ } else {
+ println "\`$package_default_prefix/lib' etc.";
+ }
+
+ print <<EndText;
+You can specify an installation prefix other than \`$package_default_prefix'
+using \`--prefix', for instance \`--prefix=$other_prefix'.
+EndText
+ }
+
+ print <<EndText;
+
+For better control, use the options below.
+
+EndText
+
+ my ($required, $optional);
+ foreach my $href (@REQ) {
+ if (optional($href->{type})) {
+ ++$optional;
+ } else {
+ ++$required;
+ }
+ }
+
+ if ($required) {
+ print "Required Packages:\n";
+ foreach my $href (@REQ) {
+ next if (optional($href->{type}));
+ my %a = %$href;
+ if ($a{type} =~ /S/) {
+ println " --$a{option}=DIR search for $a{name} package";
+ println " source files in DIR";
+ } else {
+ unless ($a{type} =~ /E/) {
+ println
+ " --$a{option}=DIR search for $a{name} package in DIR"
+ }
+ }
+ if ($a{boption}) {
+ println " --$a{boption}=DIR search for $a{name} package";
+ println " build output in DIR";
+ }
+ println;
+ }
+ }
+
+ if ($optional) {
+ print "Optional Packages:\n";
+ foreach my $href (@REQ) {
+ next unless (optional($href->{type}));
+ my %a = %$href;
+ if ($a{option} =~ /-sources$/) {
+ println " --$a{option}=DIR search for $a{name} package";
+ println " source files in DIR";
+ } else {
+ println " --$a{option}=DIR search for $a{name} files in DIR"
+ }
+ }
+ println;
+ }
+
+ print <<EndText if (PACKAGE_TYPE() eq 'B');
+Optional Features:
+ --enable-static build static executable [default=no]
+
+EndText
+
+ my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+
+ if ($^O ne 'MSWin32') {
+ print "Build tuning:\n";
+ if ($PKG{LNG} ne 'JAVA') {
+ print <<EndText;
+ --with-debug
+ --without-debug
+EndText
+ }
+
+ if (@ARCHITECTURES) {
+ print
+" --arch=name specify the name of the target architecture\n";
+ }
+
+ if ($PKG{LNG} eq 'JAVA') {
+ print <<EndText;
+ --source=release provide source compatibility with specified release,
+ generate class files for specified VM version.
+ e.g. `--source=1.6'
+EndText
+ } else {
+ print "\n";
+ }
+
+ print <<EndText;
+ --build-prefix=DIR generate build output into DIR directory
+ [$OUTDIR]
+
+EndText
+ }
+
+ println 'Miscellaneous:';
+ println ' --reconfigure rerun `configure\'';
+ println ' using the same command-line arguments';
+ if ($^O ne 'MSWin32') {
+ println
+ ' --status print current configuration information'
+ }
+ print <<EndText;
+ --clean remove all configuration results
+ --debug print lots of debugging information
+
+If `configure' was already run running `configure' without options
+will rerun `configure' using the same command-line arguments.
+
+Report bugs to sra-tools\@ncbi.nlm.nih.gov
+EndText
+}
+
+################################################################################
diff --git a/setup/os-arch.perl b/setup/os-arch.perl
new file mode 100644
index 0000000..5f3f87a
--- /dev/null
+++ b/setup/os-arch.perl
@@ -0,0 +1,22 @@
+use strict;
+
+use FindBin qw($Bin);
+require "$Bin/os-arch.prl";
+
+my ($OS, $ARCH, $OSTYPE, $MARCH, @ARCHITECTURES) = OsArch();
+
+my $res = "$OS.$ARCH";
+
+if (@ARCHITECTURES) {
+ my $name = "$Bin/../Makefile.config.$OS.arch";
+ if (-e $name) {
+ while (1) {
+ open F, $name or last;
+ $res = "$OS." . <F>;
+ chomp $res;
+ last;
+ }
+ }
+}
+
+print "$res\n";
diff --git a/setup/os-arch.prl b/setup/os-arch.prl
new file mode 100644
index 0000000..5daa75e
--- /dev/null
+++ b/setup/os-arch.prl
@@ -0,0 +1,106 @@
+sub OsArch {
+ my ($UNAME, $HOST_OS, $HOST_ARCH,
+ $MARCH, # machine hardware name returned by uname -m
+ @ARCHITECTURES);
+ if ($^O eq 'MSWin32') {
+ $UNAME = $HOST_OS = 'win';
+ $HOST_ARCH = $MARCH = 'x86_64';
+ @ARCHITECTURES = qw(x86_64 i386);
+ } else {
+ $UNAME = `uname -s`;
+ chomp $UNAME;
+ if ($UNAME =~ /Darwin/) {
+ $HOST_OS = 'mac';
+ } elsif ($UNAME =~ /Linux/) {
+ $HOST_OS = 'linux';
+ } elsif ($UNAME =~ /SunOS/) {
+ $HOST_OS = 'sun';
+ @ARCHITECTURES = qw(x86_64 i386);
+ } elsif ($UNAME =~ /xCYGWIN/) {
+ $HOST_OS = 'win';
+ } elsif ($UNAME =~ /xMINGW/) {
+ $HOST_OS = 'win';
+ } else {
+ $HOST_OS = $UNAME;
+ }
+ if ($HOST_OS eq 'mac') {
+ $MARCH = $HOST_ARCH = MacArch();
+ @ARCHITECTURES = qw(x86_64 i386 fat86) if ($MARCH eq 'x86_64');
+ } else {
+ $MARCH = `uname -m`;
+ chomp $MARCH;
+ if ($MARCH =~ /i386/) {
+ $HOST_ARCH = 'i386';
+ } elsif ($MARCH =~ /i486/) {
+ $HOST_ARCH = 'i386';
+ } elsif ($MARCH =~ /i586/) {
+ $HOST_ARCH = 'i386';
+ } elsif ($MARCH =~ /i686/) {
+ if ($UNAME =~ /WOW64/) { # 64-bit capable Cygwin.
+ # Analyze the version of cl to set the correct architecture
+ my $CL = `cl.exe 2>&1 > /dev/null`;
+ if ($CL =~ /for x64/) {
+ $HOST_ARCH = 'x86_64';
+ } else {
+ $HOST_ARCH = 'i386';
+ }
+ } else {
+ $HOST_ARCH = 'i386';
+ }
+ } elsif ($MARCH =~ /x86_64/) {
+ $HOST_ARCH = 'x86_64';
+ } elsif ($MARCH =~ /i86pc/) {
+ $HOST_ARCH = 'x86_64';
+ @ARCHITECTURES = qw(x86_64 i386);
+ } elsif ($MARCH =~ /sun4v/) {
+ $HOST_ARCH = 'sparc64';
+ @ARCHITECTURES = qw(sparc64 sparc32);
+ } else {
+ $HOST_ARCH = $MARCH;
+ }
+ }
+ }
+ ($HOST_OS, $HOST_ARCH, $UNAME, $MARCH, @ARCHITECTURES);
+}
+
+sub MacArch {
+ my $ARCH = `uname -m`;
+ chomp $ARCH;
+ if ($ARCH eq 'x86_64') {
+ return $ARCH;
+ } else {
+ my $SYSCTL = '/usr/sbin/sysctl';
+ $SYSCTL = '/sbin/sysctl' if (-x '/sbin/sysctl');
+
+ my $CAP64 = `$SYSCTL -n hw.cpu64bit_capable`;
+ chomp $CAP64;
+
+ my $PADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.physical`;
+ chomp $PADDR_BITS;
+
+ my $VADDR_BITS = `$SYSCTL -n machdep.cpu.address_bits.virtual`;
+ chomp $VADDR_BITS;
+
+ if ($CAP64 != 0) {
+ if ($PADDR_BITS > 32 && $VADDR_BITS > 32) {
+ if ($ARCH eq 'i386' || $ARCH eq 'x86_64') {
+ return 'x86_64';
+ } elsif ($ARCH eq 'Power Macintosh') {
+ return 'ppc64';
+ } else {
+ return 'unrecognized';
+ }
+ }
+ }
+
+ if ($ARCH eq 'i386') {
+ return 'i386';
+ } elsif ($ARCH eq 'Power Macintosh') {
+ return 'ppc32';
+ } else {
+ return 'unrecognized';
+ }
+ }
+}
+
+1
diff --git a/setup/package.prl b/setup/package.prl
new file mode 100644
index 0000000..9028eb0
--- /dev/null
+++ b/setup/package.prl
@@ -0,0 +1,66 @@
+################################################################################
+sub PACKAGE { 'sra-tools' }
+sub PACKAGE_TYPE { 'B' }
+sub PACKAGE_NAME { 'SRA-TOOLS' }
+sub PACKAGE_NAMW { 'SRATOOLS' }
+sub CONFIG_OUT { 'build' }
+sub PKG { ( LNG => 'C',
+ OUT => 'ncbi-outdir',
+ LOCOUT=> '../../OUTDIR',
+ PATH => '/usr/local/ncbi/sra-tools',
+ UPATH => '$HOME/ncbi/sra-tools', ) }
+sub DEPENDS { ( { name => 'fuse' , Include => '/usr/include' , },
+ { name => 'hdf5' , Include => '/usr/include' , },
+ { name => 'magic', Include => '/usr/include' , },
+ { name => 'xml2' , Include => '/usr/include/libxml2', } ) }
+sub REQ { (
+ { name => 'ngs-sdk',
+ aname => 'NGS',
+ option => 'with-ngs-sdk-prefix',
+ origin => 'I',
+ type => 'L',
+ srcpath => '../ngs/ngs-sdk',
+ pkgpath => '/usr/local/ngs/ngs-sdk',
+ usrpath => '$HOME/ngs/ngs-sdk',
+ bldpath => '$HOME/ncbi-outdir/ngs-sdk',
+ locbldpath=>'$Bin/../../OUTDIR/ngs-sdk',
+ include => 'ngs/itf/Refcount.h',
+ lib => 'libngs-c++.a',
+ },
+ { name => 'ncbi-vdb',
+ aname => 'VDB',
+ option => 'with-ncbi-vdb-sources',
+ boption => 'with-ncbi-vdb-build',
+ origin => 'I',
+ type => 'SB',
+ srcpath => '../ncbi-vdb',
+ pkgpath => '/usr/local/ncbi/ncbi-vdb',
+ usrpath => '$HOME/ncbi/ncbi-vdb',
+ bldpath => '$HOME/ncbi-outdir/ncbi-vdb',
+ locbldpath=>'$Bin/../../OUTDIR/ncbi-vdb',
+ include => 'klib/rc.h',
+ src => 'libs/kfg/default.kfg',
+ lib => 'libncbi-vdb.a',
+ ilib => 'libkapp.a',
+ },
+ { name => 'fuse',
+ option => 'with-fuse-prefix',
+ origin => 'E',
+ type => 'LIO',
+ },
+ { name => 'hdf5',
+ option => 'with-hdf5-prefix',
+ origin => 'E',
+ type => 'LIO',
+ },
+ { name => 'magic',
+ option => 'with-magic-prefix',
+ origin => 'E',
+ type => 'LIO',
+ },
+ { name => 'xml2',
+ option => 'with-xml2-prefix',
+ origin => 'E',
+ type => 'LIO',
+ } ) }
+1
diff --git a/setup/s/install b/setup/s/install
new file mode 100755
index 0000000..b1e201d
--- /dev/null
+++ b/setup/s/install
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+FILENAME="`basename $0`"
+CURDIR="`dirname $0`"
+
+if [ -z "$CURDIR" ]
+ then
+ echo error: install should be run as ./install
+ exit 1
+fi
+
+if [ "$FILENAME" != install -a ! -s setup/install.perl ]
+ then
+ echo error: install should be run as ./install
+else
+ perl -v > /dev/null 2>&1 || { echo "checking for perl... no"; \
+ echo >&2 "error: perl not found."; exit 1; }
+
+ cd $CURDIR/setup
+ perl -w ./install.perl "$@"
+fi
diff --git a/setup/s/os.prl b/setup/s/os.prl
new file mode 100644
index 0000000..5f75471
--- /dev/null
+++ b/setup/s/os.prl
@@ -0,0 +1,2 @@
+sub OS { 'linux' }
+1
diff --git a/shared/Makefile b/shared/Makefile
new file mode 100644
index 0000000..49a5ba7
--- /dev/null
+++ b/shared/Makefile
@@ -0,0 +1,85 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ..)
+
+MODULE = shared
+
+INT_LIBS = \
+ libtk-version \
+
+ALL_LIBS = \
+ $(INT_LIBS)
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# toolkit-version
+#
+$(ILIBDIR)/libtk-version: $(addprefix $(ILIBDIR)/libtk-version.,$(ILIBEXT))
+
+TK_VERSION_SRC = \
+ toolkit.vers
+
+TK_VERSION_OBJ = \
+ $(addsuffix .$(LOBX),$(TK_VERSION_SRC))
+
+$(ILIBDIR)/libtk-version.$(LIBX): $(TK_VERSION_OBJ)
+ $(LD) --slib -o $@ $^ $(KFS_LIB)
+
+
diff --git a/shared/toolkit.vers b/shared/toolkit.vers
new file mode 100644
index 0000000..dbe5900
--- /dev/null
+++ b/shared/toolkit.vers
@@ -0,0 +1 @@
+2.8.1
diff --git a/shared/toolkit.vers.c b/shared/toolkit.vers.c
new file mode 100644
index 0000000..ee350fb
--- /dev/null
+++ b/shared/toolkit.vers.c
@@ -0,0 +1,8 @@
+#include "toolkit.vers.h"
+
+#include <kapp/main.h>
+
+ver_t CC KAppVersion()
+{
+ return TOOLKIT_VERS;
+}
diff --git a/shared/toolkit.vers.h b/shared/toolkit.vers.h
new file mode 100644
index 0000000..fd7da80
--- /dev/null
+++ b/shared/toolkit.vers.h
@@ -0,0 +1 @@
+#define TOOLKIT_VERS 0x02080001
diff --git a/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java b/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java
deleted file mode 100644
index 6bf28ef..0000000
--- a/src/main/java/htsjdk/samtools/AbstractBAMFileIndex.java
+++ /dev/null
@@ -1,721 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Provides basic, generic capabilities to be used reading BAM index files. Users can
- * subclass this class to create new BAM index functionality for adding querying facilities,
- * changing caching behavior, etc.
- *
- * Of particular note: the AbstractBAMFileIndex is, by design, the only class aware of the
- * details of the BAM index file format (other than the four classes representing the data,
- * BAMIndexContent, Bin, Chunk, LinearIndex, and the classes for building the BAM index).
- * Anyone wanting to implement a reader for a differing
- * or extended BAM index format should implement BAMIndex directly.
- */
-public abstract class AbstractBAMFileIndex implements BAMIndex {
-
- private final IndexFileBuffer mIndexBuffer;
-
- private SAMSequenceDictionary mBamDictionary = null;
-
- final int [] sequenceIndexes;
-
- protected AbstractBAMFileIndex(
- final SeekableStream stream, final SAMSequenceDictionary dictionary)
- {
- mBamDictionary = dictionary;
- mIndexBuffer = new IndexStreamBuffer(stream);
-
- verifyBAMMagicNumber(stream.getSource());
-
- sequenceIndexes = new int[readInteger() + 1];
- Arrays.fill(sequenceIndexes, -1);
- }
-
- protected AbstractBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
- this(file, dictionary, true);
- }
-
- protected AbstractBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
- mBamDictionary = dictionary;
- mIndexBuffer = (useMemoryMapping ? new MemoryMappedFileBuffer(file) : new RandomAccessFileBuffer(file));
-
- verifyBAMMagicNumber(file.getName());
-
- sequenceIndexes = new int[readInteger() + 1];
- Arrays.fill(sequenceIndexes, -1);
- }
-
- /**
- * Close this index and release any associated resources.
- */
- public void close() {
- mIndexBuffer.close();
- }
-
- /**
- * Get the number of levels employed by this index.
- * @return Number of levels in this index.
- */
- public static int getNumIndexLevels() {
- return GenomicIndexUtil.LEVEL_STARTS.length;
- }
-
- /**
- * Gets the first bin in the given level.
- * @param levelNumber Level number. 0-based.
- * @return The first bin in this level.
- */
- public static int getFirstBinInLevel(final int levelNumber) {
- return GenomicIndexUtil.LEVEL_STARTS[levelNumber];
- }
-
- /**
- * Gets the number of bins in the given level.
- * @param levelNumber Level number. 0-based.
- * @return The size (number of possible bins) of the given level.
- */
- public int getLevelSize(final int levelNumber) {
- if(levelNumber == getNumIndexLevels())
- return GenomicIndexUtil.MAX_BINS+1-GenomicIndexUtil.LEVEL_STARTS[levelNumber];
- else
- return GenomicIndexUtil.LEVEL_STARTS[levelNumber+1]-GenomicIndexUtil.LEVEL_STARTS[levelNumber];
- }
-
- /**
- * Gets the level associated with the given bin number.
- * @param bin The bin for which to determine the level.
- * @return the level associated with the given bin number.
- */
- public int getLevelForBin(final Bin bin) {
- if(bin.getBinNumber() >= GenomicIndexUtil.MAX_BINS)
- throw new SAMException("Tried to get level for invalid bin.");
- for(int i = getNumIndexLevels()-1; i >= 0; i--) {
- if(bin.getBinNumber() >= GenomicIndexUtil.LEVEL_STARTS[i])
- return i;
- }
- throw new SAMException("Unable to find correct bin for bin "+bin);
- }
-
- /**
- * Gets the first locus that this bin can index into.
- * @param bin The bin to test.
- * @return The last position that the given bin can represent.
- */
- public int getFirstLocusInBin(final Bin bin) {
- final int level = getLevelForBin(bin);
- final int levelStart = GenomicIndexUtil.LEVEL_STARTS[level];
- final int levelSize = ((level==getNumIndexLevels()-1) ? GenomicIndexUtil.MAX_BINS-1 : GenomicIndexUtil.LEVEL_STARTS[level+1]) - levelStart;
- return (bin.getBinNumber() - levelStart)*(GenomicIndexUtil.BIN_GENOMIC_SPAN /levelSize)+1;
- }
-
- /**
- * Gets the last locus that this bin can index into.
- * @param bin The bin to test.
- * @return The last position that the given bin can represent.
- */
- public int getLastLocusInBin(final Bin bin) {
- final int level = getLevelForBin(bin);
- final int levelStart = GenomicIndexUtil.LEVEL_STARTS[level];
- final int levelSize = ((level==getNumIndexLevels()-1) ? GenomicIndexUtil.MAX_BINS-1 : GenomicIndexUtil.LEVEL_STARTS[level+1]) - levelStart;
- return (bin.getBinNumber()-levelStart+1)*(GenomicIndexUtil.BIN_GENOMIC_SPAN /levelSize);
- }
-
- public int getNumberOfReferences() {
- seek(4);
- return readInteger();
- }
-
- /**
- * Use to get close to the unmapped reads at the end of a BAM file.
- * @return The file offset of the first record in the last linear bin, or -1
- * if there are no elements in linear bins (i.e. no mapped reads).
- */
- public long getStartOfLastLinearBin() {
- seek(4);
-
- final int sequenceCount = readInteger();
- // Because no reads may align to the last sequence in the sequence dictionary,
- // grab the last element of the linear index for each sequence, and return
- // the last one from the last sequence that has one.
- long lastLinearIndexPointer = -1;
- for (int i = 0; i < sequenceCount; i++) {
- // System.out.println("# Sequence TID: " + i);
- final int nBins = readInteger();
- // System.out.println("# nBins: " + nBins);
- for (int j1 = 0; j1 < nBins; j1++) {
- // Skip bin #
- skipBytes(4);
- final int nChunks = readInteger();
- // Skip chunks
- skipBytes(16 * nChunks);
- }
- final int nLinearBins = readInteger();
- if (nLinearBins > 0) {
- // Skip to last element of list of linear bins
- skipBytes(8 * (nLinearBins - 1));
- lastLinearIndexPointer = readLong();
- }
- }
-
- return lastLinearIndexPointer;
- }
-
- /**
- * Return meta data for the given reference including information about number of aligned, unaligned, and noCoordinate records
- *
- * @param reference the reference of interest
- * @return meta data for the reference
- */
- public BAMIndexMetaData getMetaData(final int reference) {
- seek(4);
-
- final List<Chunk> metaDataChunks = new ArrayList<Chunk>();
-
- final int sequenceCount = readInteger();
-
- if (reference >= sequenceCount) {
- return null;
- }
-
- skipToSequence(reference);
-
- final int binCount = readInteger();
- for (int binNumber = 0; binNumber < binCount; binNumber++) {
- final int indexBin = readInteger();
- final int nChunks = readInteger();
- if (indexBin == GenomicIndexUtil.MAX_BINS) {
- for (int ci = 0; ci < nChunks; ci++) {
- final long chunkBegin = readLong();
- final long chunkEnd = readLong();
- metaDataChunks.add(new Chunk(chunkBegin, chunkEnd));
- }
- } else {
- skipBytes(16 * nChunks);
- }
- }
- return new BAMIndexMetaData(metaDataChunks);
- }
-
- /**
- * Returns count of records unassociated with any reference. Call before the index file is closed
- *
- * @return meta data at the end of the bam index that indicates count of records holding no coordinates
- * or null if no meta data (old index format)
- */
- public Long getNoCoordinateCount() {
-
- seek(4);
- final int sequenceCount = readInteger();
-
- skipToSequence(sequenceCount);
- try { // in case of old index file without meta data
- return readLong();
- } catch (final Exception e) {
- return null;
- }
- }
-
- protected BAMIndexContent query(final int referenceSequence, final int startPos, final int endPos) {
- seek(4);
-
- final List<Chunk> metaDataChunks = new ArrayList<Chunk>();
-
- final int sequenceCount = readInteger();
-
- if (referenceSequence >= sequenceCount) {
- return null;
- }
-
- final BitSet regionBins = GenomicIndexUtil.regionToBins(startPos, endPos);
- if (regionBins == null) {
- return null;
- }
-
- skipToSequence(referenceSequence);
-
- final int binCount = readInteger();
- boolean metaDataSeen = false;
- final Bin[] bins = new Bin[getMaxBinNumberForReference(referenceSequence) +1];
- for (int binNumber = 0; binNumber < binCount; binNumber++) {
- final int indexBin = readInteger();
- final int nChunks = readInteger();
- List<Chunk> chunks = null;
- // System.out.println("# bin[" + i + "] = " + indexBin + ", nChunks = " + nChunks);
- Chunk lastChunk = null;
- if (regionBins.get(indexBin)) {
- chunks = new ArrayList<Chunk>(nChunks);
- for (int ci = 0; ci < nChunks; ci++) {
- final long chunkBegin = readLong();
- final long chunkEnd = readLong();
- lastChunk = new Chunk(chunkBegin, chunkEnd);
- chunks.add(lastChunk);
- }
- } else if (indexBin == GenomicIndexUtil.MAX_BINS) {
- // meta data - build the bin so that the count of bins is correct;
- // but don't attach meta chunks to the bin, or normal queries will be off
- for (int ci = 0; ci < nChunks; ci++) {
- final long chunkBegin = readLong();
- final long chunkEnd = readLong();
- lastChunk = new Chunk(chunkBegin, chunkEnd);
- metaDataChunks.add(lastChunk);
- }
- metaDataSeen = true;
- continue; // don't create a Bin
- } else {
- skipBytes(16 * nChunks);
- chunks = Collections.emptyList();
- }
- final Bin bin = new Bin(referenceSequence, indexBin);
- bin.setChunkList(chunks);
- bin.setLastChunk(lastChunk);
- bins[indexBin] = bin;
- }
-
- final int nLinearBins = readInteger();
-
- final int regionLinearBinStart = LinearIndex.convertToLinearIndexOffset(startPos);
- final int regionLinearBinStop = endPos > 0 ? LinearIndex.convertToLinearIndexOffset(endPos) : nLinearBins-1;
- final int actualStop = Math.min(regionLinearBinStop, nLinearBins -1);
-
- long[] linearIndexEntries = new long[0];
- if (regionLinearBinStart < nLinearBins) {
- linearIndexEntries = new long[actualStop-regionLinearBinStart+1];
- skipBytes(8 * regionLinearBinStart);
- for(int linearBin = regionLinearBinStart; linearBin <= actualStop; linearBin++)
- linearIndexEntries[linearBin-regionLinearBinStart] = readLong();
- }
-
- final LinearIndex linearIndex = new LinearIndex(referenceSequence,regionLinearBinStart,linearIndexEntries);
-
- return new BAMIndexContent(referenceSequence, bins, binCount - (metaDataSeen? 1 : 0), new BAMIndexMetaData(metaDataChunks), linearIndex);
- }
-
- /**
- * The maximum possible bin number for this reference sequence.
- * This is based on the maximum coordinate position of the reference
- * which is based on the size of the reference
- */
- private int getMaxBinNumberForReference(final int reference) {
- try {
- final int sequenceLength = mBamDictionary.getSequence(reference).getSequenceLength();
- return getMaxBinNumberForSequenceLength(sequenceLength);
- } catch (final Exception e) {
- return GenomicIndexUtil.MAX_BINS;
- }
- }
-
- /**
- * The maxiumum bin number for a reference sequence of a given length
- */
- static int getMaxBinNumberForSequenceLength(final int sequenceLength) {
- return getFirstBinInLevel(getNumIndexLevels() - 1) + (sequenceLength >> 14);
- // return 4680 + (sequenceLength >> 14); // note 4680 = getFirstBinInLevel(getNumIndexLevels() - 1)
- }
-
- abstract protected BAMIndexContent getQueryResults(int reference);
-
- /**
- * Gets the possible number of bins for a given reference sequence.
- * @return How many bins could possibly be used according to this indexing scheme to index a single contig.
- */
- protected int getMaxAddressibleGenomicLocation() {
- return GenomicIndexUtil.BIN_GENOMIC_SPAN;
- }
-
- /**
- * Get candidate bins for the specified region
- * @param startPos 1-based start of target region, inclusive.
- * @param endPos 1-based end of target region, inclusive.
- * @return bit set for each bin that may contain SAMRecords in the target region.
- */
- protected BitSet regionToBins(final int startPos, final int endPos) {
- final int maxPos = 0x1FFFFFFF;
- final int start = (startPos <= 0) ? 0 : (startPos-1) & maxPos;
- final int end = (endPos <= 0) ? maxPos : (endPos-1) & maxPos;
- if (start > end) {
- return null;
- }
- int k;
- final BitSet bitSet = new BitSet(GenomicIndexUtil.MAX_BINS);
- bitSet.set(0);
- for (k = 1 + (start>>26); k <= 1 + (end>>26); ++k) bitSet.set(k);
- for (k = 9 + (start>>23); k <= 9 + (end>>23); ++k) bitSet.set(k);
- for (k = 73 + (start>>20); k <= 73 + (end>>20); ++k) bitSet.set(k);
- for (k = 585 + (start>>17); k <= 585 + (end>>17); ++k) bitSet.set(k);
- for (k = 4681 + (start>>14); k <= 4681 + (end>>14); ++k) bitSet.set(k);
- return bitSet;
- }
-
- /**
- * @deprecated Invoke {@link Chunk#optimizeChunkList} directly.
- */
- @Deprecated
- protected List<Chunk> optimizeChunkList(final List<Chunk> chunks, final long minimumOffset) {
- return Chunk.optimizeChunkList(chunks, minimumOffset);
- }
-
- private void verifyBAMMagicNumber(final String sourceName) {
- // Verify the magic number.
- seek(0);
- final byte[] buffer = new byte[4];
- readBytes(buffer);
- if (!Arrays.equals(buffer, BAMFileConstants.BAM_INDEX_MAGIC)) {
- throw new RuntimeIOException("Invalid file header in BAM index " + sourceName +
- ": " + new String(buffer));
- }
- }
-
- private void skipToSequence(final int sequenceIndex) {
- //Use sequence position cache if available
- if(sequenceIndexes[sequenceIndex] != -1){
- seek(sequenceIndexes[sequenceIndex]);
- return;
- }
-
- for (int i = 0; i < sequenceIndex; i++) {
- // System.out.println("# Sequence TID: " + i);
- final int nBins = readInteger();
- // System.out.println("# nBins: " + nBins);
- for (int j = 0; j < nBins; j++) {
- readInteger(); // bin
- final int nChunks = readInteger();
- // System.out.println("# bin[" + j + "] = " + bin + ", nChunks = " + nChunks);
- skipBytes(16 * nChunks);
- }
- final int nLinearBins = readInteger();
- // System.out.println("# nLinearBins: " + nLinearBins);
- skipBytes(8 * nLinearBins);
- }
-
- //Update sequence position cache
- sequenceIndexes[sequenceIndex] = position();
- }
-
- private void readBytes(final byte[] bytes) {
- mIndexBuffer.readBytes(bytes);
- }
-
- private int readInteger() {
- return mIndexBuffer.readInteger();
- }
-
- private long readLong() {
- return mIndexBuffer.readLong();
- }
-
- private void skipBytes(final int count) {
- mIndexBuffer.skipBytes(count);
- }
-
- private void seek(final int position) {
- mIndexBuffer.seek(position);
- }
-
- private int position(){
- return mIndexBuffer.position();
- }
-
- private abstract static class IndexFileBuffer {
- abstract void readBytes(final byte[] bytes);
- abstract int readInteger();
- abstract long readLong();
- abstract void skipBytes(final int count);
- abstract void seek(final int position);
- abstract int position();
- abstract void close();
- }
-
- /**
- * Traditional implementation of BAM index file access using memory mapped files.
- */
- private static class MemoryMappedFileBuffer extends IndexFileBuffer {
- private MappedByteBuffer mFileBuffer;
-
- MemoryMappedFileBuffer(final File file) {
- try {
- // Open the file stream.
- final FileInputStream fileStream = new FileInputStream(file);
- final FileChannel fileChannel = fileStream.getChannel();
- mFileBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0L, fileChannel.size());
- mFileBuffer.order(ByteOrder.LITTLE_ENDIAN);
- fileChannel.close();
- fileStream.close();
- } catch (final IOException exc) {
- throw new RuntimeIOException(exc.getMessage(), exc);
- }
- }
-
- @Override
- void readBytes(final byte[] bytes) {
- mFileBuffer.get(bytes);
- }
-
- @Override
- int readInteger() {
- return mFileBuffer.getInt();
- }
-
- @Override
- long readLong() {
- return mFileBuffer.getLong();
- }
-
- @Override
- void skipBytes(final int count) {
- mFileBuffer.position(mFileBuffer.position() + count);
- }
-
- @Override
- void seek(final int position) {
- mFileBuffer.position(position);
- }
-
- @Override
- int position() {
- return mFileBuffer.position();
- }
-
- @Override
- void close() {
- mFileBuffer = null;
- }
- }
-
- /**
- * Alternative implementation of BAM index file access using regular I/O instead of memory mapping.
- *
- * This implementation can be more scalable for certain applications that need to access large numbers of BAM files.
- * Java provides no way to explicitly release a memory mapping. Instead, you need to wait for the garbage collector
- * to finalize the MappedByteBuffer. Because of this, when accessing many BAM files or when querying many BAM files
- * sequentially, you cannot easily control the physical memory footprint of the java process.
- * This can limit scalability and can have bad interactions with load management software like LSF, forcing you
- * to reserve enough physical memory for a worst case scenario.
- * The use of regular I/O allows you to trade somewhat slower performance for a small, fixed memory footprint
- * if that is more suitable for your application.
- */
- private static class RandomAccessFileBuffer extends IndexFileBuffer {
- private static final int PAGE_SIZE = 4 * 1024;
- private static final int PAGE_OFFSET_MASK = PAGE_SIZE-1;
- private static final int PAGE_MASK = ~PAGE_OFFSET_MASK;
- private static final int INVALID_PAGE = 1;
- private final File mFile;
- private RandomAccessFile mRandomAccessFile;
- private final int mFileLength;
- private int mFilePointer = 0;
- private int mCurrentPage = INVALID_PAGE;
- private final byte[] mBuffer = new byte[PAGE_SIZE];
-
- RandomAccessFileBuffer(final File file) {
- mFile = file;
- try {
- mRandomAccessFile = new RandomAccessFile(file, "r");
- final long fileLength = mRandomAccessFile.length();
- if (fileLength > Integer.MAX_VALUE) {
- throw new RuntimeIOException("BAM index file " + mFile + " is too large: " + fileLength);
- }
- mFileLength = (int) fileLength;
- } catch (final IOException exc) {
- throw new RuntimeIOException(exc.getMessage(), exc);
- }
- }
-
- @Override
- void readBytes(final byte[] bytes) {
- int resultOffset = 0;
- int resultLength = bytes.length;
- if (mFilePointer + resultLength > mFileLength) {
- throw new RuntimeIOException("Attempt to read past end of BAM index file (file is truncated?): " + mFile);
- }
- while (resultLength > 0) {
- loadPage(mFilePointer);
- final int pageOffset = mFilePointer & PAGE_OFFSET_MASK;
- final int copyLength = Math.min(resultLength, PAGE_SIZE - pageOffset);
- System.arraycopy(mBuffer, pageOffset, bytes, resultOffset, copyLength);
- mFilePointer += copyLength;
- resultOffset += copyLength;
- resultLength -= copyLength;
- }
- }
-
- @Override
- int readInteger() {
- // This takes advantage of the fact that integers in BAM index files are always 4-byte aligned.
- loadPage(mFilePointer);
- final int pageOffset = mFilePointer & PAGE_OFFSET_MASK;
- mFilePointer += 4;
- return((mBuffer[pageOffset + 0] & 0xFF) |
- ((mBuffer[pageOffset + 1] & 0xFF) << 8) |
- ((mBuffer[pageOffset + 2] & 0xFF) << 16) |
- ((mBuffer[pageOffset + 3] & 0xFF) << 24));
- }
-
- @Override
- long readLong() {
- // BAM index files are always 4-byte aligned, but not necessrily 8-byte aligned.
- // So, rather than fooling with complex page logic we simply read the long in two 4-byte chunks.
- final long lower = readInteger();
- final long upper = readInteger();
- return ((upper << 32) | (lower & 0xFFFFFFFFL));
- }
-
- @Override
- void skipBytes(final int count) {
- mFilePointer += count;
- }
-
- @Override
- void seek(final int position) {
- mFilePointer = position;
- }
-
- @Override
- int position() {
- return mFilePointer;
- }
-
- @Override
- void close() {
- mFilePointer = 0;
- mCurrentPage = INVALID_PAGE;
- if (mRandomAccessFile != null) {
- try {
- mRandomAccessFile.close();
- } catch (final IOException exc) {
- throw new RuntimeIOException(exc.getMessage(), exc);
- }
- mRandomAccessFile = null;
- }
- }
-
- private void loadPage(final int filePosition) {
- final int page = filePosition & PAGE_MASK;
- if (page == mCurrentPage) {
- return;
- }
- try {
- mRandomAccessFile.seek(page);
- final int readLength = Math.min(mFileLength - page, PAGE_SIZE);
- mRandomAccessFile.readFully(mBuffer, 0, readLength);
- mCurrentPage = page;
- } catch (final IOException exc) {
- throw new RuntimeIOException("Exception reading BAM index file " + mFile + ": " + exc.getMessage(), exc);
- }
- }
- }
-
- static class IndexStreamBuffer extends IndexFileBuffer {
- private final SeekableStream in;
- private final ByteBuffer tmpBuf;
-
- /** Continually reads from the provided {@link SeekableStream} into the buffer until the specified number of bytes are read, or
- * until the stream is exhausted, throwing a {@link RuntimeIOException}. */
- private static void readFully(final SeekableStream in, final byte[] buffer, final int offset, final int length) {
- int read = 0;
- while (read < length) {
- final int readThisLoop;
- try {
- readThisLoop = in.read(buffer, read, length - read);
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- if (readThisLoop == -1) break;
- read += readThisLoop;
- }
- if (read != length) throw new RuntimeIOException("Expected to read " + length + " bytes, but expired stream after " + read + ".");
- }
-
- public IndexStreamBuffer(final SeekableStream s) {
- in = s;
- tmpBuf = ByteBuffer.allocate(8); // Enough to fit a long.
- tmpBuf.order(ByteOrder.LITTLE_ENDIAN);
- }
-
- @Override
- public void close() {
- try { in.close(); }
- catch (final IOException e) { throw new RuntimeIOException(e); }
- }
-
- @Override
- public void readBytes(final byte[] bytes) {
- readFully(in, bytes, 0, bytes.length);
- }
-
- @Override
- public void seek(final int position) {
- try { in.seek(position); }
- catch (final IOException e) { throw new RuntimeIOException(e); }
- }
-
- @Override
- public int readInteger() {
- readFully(in, tmpBuf.array(), 0, 4);
- return tmpBuf.getInt(0);
- }
-
- @Override
- public long readLong() {
- readFully(in, tmpBuf.array(), 0, 8);
- return tmpBuf.getLong(0);
- }
-
- @Override
- public void skipBytes(final int count) {
- try {
- for (int s = count; s > 0;) {
- final int skipped = (int)in.skip(s);
- if (skipped <= 0)
- throw new RuntimeIOException("Failed to skip " + s);
- s -= skipped;
- }
- } catch (final IOException e) { throw new RuntimeIOException(e); }
- }
-
- @Override
- public int position() {
- try {
- return (int) in.position();
- } catch (final IOException e) { throw new RuntimeIOException(e); }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java b/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java
deleted file mode 100644
index 769a7a7..0000000
--- a/src/main/java/htsjdk/samtools/AbstractSAMHeaderRecord.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.bind.annotation.XmlTransient;
-
-/**
- * Base class for the various concrete records in a SAM header, providing uniform
- * access to the attributes.
- */
- at XmlTransient /* don't consider this class for XML-serialization */
-public abstract class AbstractSAMHeaderRecord implements Serializable {
- public static final long serialVersionUID = 1L;
-
- private final Map<String,String> mAttributes = new LinkedHashMap<String, String>();
-
- public String getAttribute(final String key) {
- return mAttributes.get(key);
- }
-
- /**
- * Set the given value for the attribute named 'key'. Replaces an existing value, if any.
- * If value is null, the attribute is removed.
- * Otherwise, the value will be converted to a String with toString.
- * @param key attribute name
- * @param value attribute value
- * @deprecated Use {@link #setAttribute(String, String) instead
- */
- @Deprecated
- public void setAttribute(final String key, final Object value) {
- setAttribute(key, value == null? null: value.toString());
- }
-
- /**
- * Set the given value for the attribute named 'key'. Replaces an existing value, if any.
- * If value is null, the attribute is removed.
- * Supported types are Character, Integer, Float and String. Byte and Short may also be
- * passed in but they will be converted to Integer.
- * @param key attribute name
- * @param value attribute value
- */
- public void setAttribute(final String key, final String value) {
- if (value == null) {
- mAttributes.remove(key);
- } else {
- mAttributes.put(key, value);
- }
- }
- /**
- * Returns the Set of attributes.
- */
- public Set<Map.Entry<String,String>> getAttributes() {
- return mAttributes.entrySet();
- }
-
-
- /**
- * Returns the ID tag (or equivalent) for this header record. The
- * default implementation throws a SAMException to indicate "not implemented".
- */
- public String getId() {
- throw new UnsupportedOperationException("Method not implemented for: " + this.getClass());
- }
-
- /**
- * For use in the equals() method of the concrete class.
- */
- protected boolean attributesEqual(final AbstractSAMHeaderRecord that) {
- return mAttributes.equals(that.mAttributes);
- }
-
- /**
- * For use in the hashCode() method of the concrete class.
- */
- protected int attributesHashCode() {
- return (mAttributes != null ? mAttributes.hashCode() : 0);
- }
-
- /**
- * Standard tags are the tags defined in SAM spec. These do not have type information in the test
- * representation, because the type information is predefined for each tag.
- * @return list of predefined tags for the concrete SAMHeader record type.
- */
- abstract Set<String> getStandardTags();
-
- /** Simple to String that outputs the concrete class name and the set of attributes stored. */
- @Override public String toString() {
- return getClass().getSimpleName() + this.mAttributes.toString();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/AlignmentBlock.java b/src/main/java/htsjdk/samtools/AlignmentBlock.java
deleted file mode 100644
index 1320dfd..0000000
--- a/src/main/java/htsjdk/samtools/AlignmentBlock.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Represents the contiguous alignment of a subset of read bases to a reference
- * sequence. Simply put an alignment block tells you that read bases from
- * readStart are aligned to the reference (matching or mismatching) from
- * referenceStart for length bases.
- *
- * @author Tim Fennell
- */
-public class AlignmentBlock implements Serializable {
- public static final long serialVersionUID = 1L;
-
- private int readStart;
- private int referenceStart;
- private int length;
-
- /** Constructs a new alignment block with the supplied read and ref starts and length. */
- AlignmentBlock(int readStart, int referenceStart, int length) {
- this.readStart = readStart;
- this.referenceStart = referenceStart;
- this.length = length;
- }
-
- /** The first, 1-based, base in the read that is aligned to the reference reference. */
- public int getReadStart() { return readStart; }
-
- /** The first, 1-based, position in the reference to which the read is aligned. */
- public int getReferenceStart() { return referenceStart; }
-
- /** The number of contiguous bases aligned to the reference. */
- public int getLength() { return length; }
-}
diff --git a/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java b/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java
deleted file mode 100644
index ab5b8d0..0000000
--- a/src/main/java/htsjdk/samtools/AsyncSAMFileWriter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-import htsjdk.samtools.util.ProgressLoggerInterface;
-
-/**
- * SAMFileWriter that can be wrapped around an underlying SAMFileWriter to provide asynchronous output. Records
- * added are placed into a queue, the queue is then drained into the underlying SAMFileWriter by a thread owned
- * by the instance.
- *
- * Exceptions experienced by the writer thread will be emitted back to the caller in subsequent calls to either
- * addAlignment() or close().
- *
- * @author Tim Fennell
- */
-class AsyncSAMFileWriter extends AbstractAsyncWriter<SAMRecord> implements SAMFileWriter {
-
- private final SAMFileWriter underlyingWriter;
-
- /**
- * Creates a new AsyncSAMFileWriter wrapping the provided SAMFileWriter.
- */
- public AsyncSAMFileWriter(final SAMFileWriter out) {
- this(out, DEFAULT_QUEUE_SIZE);
- }
-
- /**
- * Creates an AsyncSAMFileWriter wrapping the provided SAMFileWriter and using the specified
- * queue size for buffer SAMRecords.
- */
- public AsyncSAMFileWriter(final SAMFileWriter out, final int queueSize) {
- super(queueSize);
- this.underlyingWriter = out;
- }
-
- @Override protected void synchronouslyWrite(final SAMRecord item) { this.underlyingWriter.addAlignment(item); }
-
- @Override protected void synchronouslyClose() { this.underlyingWriter.close(); }
-
- @Override protected final String getThreadNamePrefix() { return "SAMFileWriterThread-"; }
-
- @Override
- public void setProgressLogger(final ProgressLoggerInterface progress) {
- this.underlyingWriter.setProgressLogger(progress);
- }
-
- /**
- * Adds an alignment to the queue to be written. Will re-throw any exception that was received when
- * writing prior record(s) to the underlying SAMFileWriter.
- */
- public void addAlignment(final SAMRecord alignment) {
- write(alignment);
- }
-
- /** Returns the SAMFileHeader from the underlying SAMFileWriter. */
- public SAMFileHeader getFileHeader() {
- return this.underlyingWriter.getFileHeader();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileConstants.java b/src/main/java/htsjdk/samtools/BAMFileConstants.java
deleted file mode 100644
index be0f36d..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileConstants.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Constants used in reading & writing BAM files
- */
-class BAMFileConstants {
- /**
- * The beginning of a BAMRecord is a fixed-size block of 8 int32s
- */
- static final int FIXED_BLOCK_SIZE = 8 * 4;
-
- /**
- * BAM file magic number. This is what is present in the gunzipped version of the file,
- * which never exists on disk.
- */
-
- static final byte[] BAM_MAGIC = "BAM\1".getBytes();
- /**
- * BAM index file magic number.
- */
- static final byte[] BAM_INDEX_MAGIC = "BAI\1".getBytes();
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileReader.java b/src/main/java/htsjdk/samtools/BAMFileReader.java
deleted file mode 100644
index 98bb74f..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileReader.java
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Class for reading and querying BAM files.
- */
-class BAMFileReader extends SamReader.ReaderImplementation {
- // True if reading from a File rather than an InputStream
- private boolean mIsSeekable = false;
-
- // For converting bytes into other primitive types
- private BinaryCodec mStream = null;
-
- // Underlying compressed data stream.
- private final BlockCompressedInputStream mCompressedInputStream;
- private SAMFileHeader mFileHeader = null;
-
- // One of these is populated if the file is seekable and an index exists
- private File mIndexFile = null;
- private SeekableStream mIndexStream = null;
-
- private BAMIndex mIndex = null;
- private long mFirstRecordPointer = 0;
- // If non-null, there is an unclosed iterator extant.
- private CloseableIterator<SAMRecord> mCurrentIterator = null;
-
- // If true, all SAMRecords are fully decoded as they are read.
- private boolean eagerDecode;
-
- // If true, the BAMFileReader will use asynchronous IO.
- // Note: this field currently has no effect (is not hooked up anywhere), but will be in the future. See https://github.com/samtools/htsjdk/pull/576
- private final boolean useAsynchronousIO;
-
- // For error-checking.
- private ValidationStringency mValidationStringency;
-
- // For creating BAMRecords
- private SAMRecordFactory samRecordFactory;
-
- /**
- * Use the caching index reader implementation rather than the disk-hit-per-file model.
- */
- private boolean mEnableIndexCaching = false;
-
- /**
- * Use the traditional memory-mapped implementation for BAM file indexes rather than regular I/O.
- */
- private boolean mEnableIndexMemoryMapping = true;
-
- /**
- * Add information about the origin (reader and position) to SAM records.
- */
- private SamReader mReader = null;
-
- /**
- * Prepare to read BAM from a stream (not seekable)
- * @param stream source of bytes.
- * @param eagerDecode if true, decode all BAM fields as reading rather than lazily.
- * @param validationStringency Controls how to handle invalidate reads or header lines.
- */
- BAMFileReader(final InputStream stream,
- final File indexFile,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- mIndexFile = indexFile;
- mIsSeekable = false;
- this.useAsynchronousIO = useAsynchronousIO;
- mCompressedInputStream = new BlockCompressedInputStream(stream);
- mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
- this.eagerDecode = eagerDecode;
- this.mValidationStringency = validationStringency;
- this.samRecordFactory = factory;
- this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, null);
- }
-
- /**
- * Prepare to read BAM from a file (seekable)
- * @param file source of bytes.
- * @param eagerDecode if true, decode all BAM fields as reading rather than lazily.
- * @param validationStringency Controls how to handle invalidate reads or header lines.
- */
- BAMFileReader(final File file,
- final File indexFile,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- this(new BlockCompressedInputStream(file), indexFile!=null ? indexFile : SamFiles.findIndex(file), eagerDecode, useAsynchronousIO, file.getAbsolutePath(), validationStringency, factory);
- if (mIndexFile != null && mIndexFile.lastModified() < file.lastModified()) {
- System.err.println("WARNING: BAM index file " + mIndexFile.getAbsolutePath() +
- " is older than BAM " + file.getAbsolutePath());
- }
- // Provide better error message when there is an error reading.
- mStream.setInputFileName(file.getAbsolutePath());
- }
-
- BAMFileReader(final SeekableStream strm,
- final File indexFile,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- this(new BlockCompressedInputStream(strm), indexFile, eagerDecode, useAsynchronousIO, strm.getSource(), validationStringency, factory);
- }
-
- BAMFileReader(final SeekableStream strm,
- final SeekableStream indexStream,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- this(new BlockCompressedInputStream(strm), indexStream, eagerDecode, useAsynchronousIO, strm.getSource(), validationStringency, factory);
- }
-
- private BAMFileReader(final BlockCompressedInputStream compressedInputStream,
- final File indexFile,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final String source,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- mIndexFile = indexFile;
- mIsSeekable = true;
- mCompressedInputStream = compressedInputStream;
- mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
- this.eagerDecode = eagerDecode;
- this.useAsynchronousIO = useAsynchronousIO;
- this.mValidationStringency = validationStringency;
- this.samRecordFactory = factory;
- this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, source);
- mFirstRecordPointer = mCompressedInputStream.getFilePointer();
- }
-
- private BAMFileReader(final BlockCompressedInputStream compressedInputStream,
- final SeekableStream indexStream,
- final boolean eagerDecode,
- final boolean useAsynchronousIO,
- final String source,
- final ValidationStringency validationStringency,
- final SAMRecordFactory factory)
- throws IOException {
- mIndexStream = indexStream;
- mIsSeekable = true;
- mCompressedInputStream = compressedInputStream;
- mStream = new BinaryCodec(new DataInputStream(mCompressedInputStream));
- this.eagerDecode = eagerDecode;
- this.useAsynchronousIO = useAsynchronousIO;
- this.mValidationStringency = validationStringency;
- this.samRecordFactory = factory;
- this.mFileHeader = readHeader(this.mStream, this.mValidationStringency, source);
- mFirstRecordPointer = mCompressedInputStream.getFilePointer();
- }
-
- /** Reads through the header and sequence records to find the virtual file offset of the first record in the BAM file. */
- static long findVirtualOffsetOfFirstRecord(final File bam) throws IOException {
- final BAMFileReader reader = new BAMFileReader(bam, null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory());
- final long offset = reader.mFirstRecordPointer;
- reader.close();
- return offset;
- }
-
- /**
- * If true, writes the source of every read into the source SAMRecords.
- * @param enabled true to write source information into each SAMRecord.
- */
- void enableFileSource(final SamReader reader, final boolean enabled) {
- this.mReader = enabled ? reader : null;
- }
-
- /**
- * If true, uses the caching version of the index reader.
- * @param enabled true to use the caching version of the reader.
- */
- protected void enableIndexCaching(final boolean enabled) {
- if(mIndex != null)
- throw new SAMException("Unable to turn on index caching; index file has already been loaded.");
- this.mEnableIndexCaching = enabled;
- }
-
- /**
- * If false, disable the use of memory mapping for accessing index files (default behavior is to use memory mapping).
- * This is slower but more scalable when accessing large numbers of BAM files sequentially.
- * @param enabled True to use memory mapping, false to use regular I/O.
- */
- protected void enableIndexMemoryMapping(final boolean enabled) {
- if (mIndex != null) {
- throw new SAMException("Unable to change index memory mapping; index file has already been loaded.");
- }
- this.mEnableIndexMemoryMapping = enabled;
- }
-
- @Override void enableCrcChecking(final boolean enabled) {
- this.mCompressedInputStream.setCheckCrcs(enabled);
- }
-
- @Override void setSAMRecordFactory(final SAMRecordFactory factory) { this.samRecordFactory = factory; }
-
- @Override
- public SamReader.Type type() {
- return SamReader.Type.BAM_TYPE;
- }
-
- /**
- * @return true if ths is a BAM file, and has an index
- */
- public boolean hasIndex() {
- return mIsSeekable && ((mIndexFile != null) || (mIndexStream != null));
- }
-
- /**
- * Retrieves the index for the given file type. Ensure that the index is of the specified type.
- * @return An index of the given type.
- */
- public BAMIndex getIndex() {
- if(!hasIndex())
- throw new SAMException("No index is available for this BAM file.");
- if(mIndex == null) {
- if (mIndexFile != null)
- mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexFile, getFileHeader().getSequenceDictionary(), mEnableIndexMemoryMapping)
- : new DiskBasedBAMFileIndex(mIndexFile, getFileHeader().getSequenceDictionary(), mEnableIndexMemoryMapping);
- else
- mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexStream, getFileHeader().getSequenceDictionary())
- : new DiskBasedBAMFileIndex(mIndexStream, getFileHeader().getSequenceDictionary());
- }
- return mIndex;
- }
-
- public void setEagerDecode(final boolean desired) { this.eagerDecode = desired; }
-
- @Override
- public void close() {
- if (mCompressedInputStream != null) {
- try {
- mCompressedInputStream.close();
- } catch (IOException e) {
- throw new RuntimeIOException("Exception closing compressed input stream.", e);
- }
- }
- if (mStream != null) {
- mStream.close();
- }
- if (mIndex != null) {
- mIndex.close();
- }
- mStream = null;
- mFileHeader = null;
- mIndex = null;
- }
-
- public SAMFileHeader getFileHeader() {
- return mFileHeader;
- }
-
- /**
- * Set error-checking level for subsequent SAMRecord reads.
- */
- void setValidationStringency(final ValidationStringency validationStringency) {
- this.mValidationStringency = validationStringency;
- }
-
- public ValidationStringency getValidationStringency() {
- return this.mValidationStringency;
- }
-
- /**
- * Prepare to iterate through the SAMRecords in file order.
- * Only a single iterator on a BAM file can be extant at a time. If getIterator() or a query method has been called once,
- * that iterator must be closed before getIterator() can be called again.
- * A somewhat peculiar aspect of this method is that if the file is not seekable, a second call to
- * getIterator() begins its iteration where the last one left off. That is the best that can be
- * done in that situation.
- */
- public CloseableIterator<SAMRecord> getIterator() {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (mIsSeekable) {
- try {
- mCompressedInputStream.seek(mFirstRecordPointer);
- } catch (final IOException exc) {
- throw new RuntimeIOException(exc.getMessage(), exc);
- }
- }
- mCurrentIterator = new BAMFileIterator();
- return mCurrentIterator;
- }
-
- @Override
- public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan chunks) {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (!(chunks instanceof BAMFileSpan)) {
- throw new IllegalStateException("BAMFileReader cannot handle this type of file span.");
- }
-
- // Create an iterator over the given chunk boundaries.
- mCurrentIterator = new BAMFileIndexIterator(((BAMFileSpan)chunks).toCoordinateArray());
- return mCurrentIterator;
- }
-
- /**
- * Gets an unbounded pointer to the first record in the BAM file. Because the reader doesn't necessarily know
- * when the file ends, the rightmost bound of the file pointer will not end exactly where the file ends. However,
- * the rightmost bound is guaranteed to be after the last read in the file.
- * @return An unbounded pointer to the first record in the BAM file.
- */
- @Override
- public SAMFileSpan getFilePointerSpanningReads() {
- return new BAMFileSpan(new Chunk(mFirstRecordPointer,Long.MAX_VALUE));
- }
-
- /**
- * Prepare to iterate through the SAMRecords that match the given interval.
- * Only a single iterator on a BAMFile can be extant at a time. The previous one must be closed
- * before calling any of the methods that return an iterator.
- *
- * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
- * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
- * matches the specified interval.
- *
- * Note that this method is not necessarily efficient in terms of disk I/O. The index does not have perfect
- * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
- *
- * @param sequence Reference sequence sought.
- * @param start Desired SAMRecords must overlap or be contained in the interval specified by start and end.
- * A value of zero implies the start of the reference sequence.
- * @param end A value of zero implies the end of the reference sequence.
- * @param contained If true, the alignments for the SAMRecords must be completely contained in the interval
- * specified by start and end. If false, the SAMRecords need only overlap the interval.
- * @return Iterator for the matching SAMRecords
- */
- CloseableIterator<SAMRecord> query(final String sequence, final int start, final int end, final boolean contained) {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (!mIsSeekable) {
- throw new UnsupportedOperationException("Cannot query stream-based BAM file");
- }
- final int referenceIndex = mFileHeader.getSequenceIndex(sequence);
- if (referenceIndex == -1) {
- mCurrentIterator = new EmptyBamIterator();
- } else {
- final QueryInterval[] queryIntervals = {new QueryInterval(referenceIndex, start, end)};
- mCurrentIterator = createIndexIterator(queryIntervals, contained);
- }
- return mCurrentIterator;
- }
-
- /**
- * Prepare to iterate through the SAMRecords that match any of the given intervals.
- * Only a single iterator on a BAMFile can be extant at a time. The previous one must be closed
- * before calling any of the methods that return an iterator.
- *
- * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
- * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
- * matches the specified interval.
- *
- * Note that this method is not necessarily efficient in terms of disk I/O. The index does not have perfect
- * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
- *
- * @param intervals list of intervals to be queried. Must be optimized.
- * @param contained If true, the alignments for the SAMRecords must be completely contained in the interval
- * specified by start and end. If false, the SAMRecords need only overlap the interval.
- * @return Iterator for the matching SAMRecords
- * @see QueryInterval#optimizeIntervals(QueryInterval[])
- */
- public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals, final boolean contained) {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (!mIsSeekable) {
- throw new UnsupportedOperationException("Cannot query stream-based BAM file");
- }
- mCurrentIterator = createIndexIterator(intervals, contained);
- return mCurrentIterator;
- }
-
- /**
- * Prepare to iterate through the SAMRecords with the given alignment start.
- * Only a single iterator on a BAMFile can be extant at a time. The previous one must be closed
- * before calling any of the methods that return an iterator.
- *
- * Note that an unmapped SAMRecord may still have a reference name and an alignment start for sorting
- * purposes (typically this is the coordinate of its mate), and will be found by this method if the coordinate
- * matches the specified interval.
- *
- * Note that this method is not necessarily efficient in terms of disk I/O. The index does not have perfect
- * resolution, so some SAMRecords may be read and then discarded because they do not match the specified interval.
- *
- * @param sequence Reference sequence sought.
- * @param start Alignment start sought.
- * @return Iterator for the matching SAMRecords.
- */
- public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence, final int start) {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (!mIsSeekable) {
- throw new UnsupportedOperationException("Cannot query stream-based BAM file");
- }
- final int referenceIndex = mFileHeader.getSequenceIndex(sequence);
- if (referenceIndex == -1) {
- mCurrentIterator = new EmptyBamIterator();
- } else {
- mCurrentIterator = createStartingAtIndexIterator(referenceIndex, start);
- }
- return mCurrentIterator;
- }
-
- /**
- * Prepare to iterate through the SAMRecords that are unmapped and do not have a reference name or alignment start.
- * Only a single iterator on a BAMFile can be extant at a time. The previous one must be closed
- * before calling any of the methods that return an iterator.
- *
- * @return Iterator for the matching SAMRecords.
- */
- public CloseableIterator<SAMRecord> queryUnmapped() {
- if (mStream == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mCurrentIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- if (!mIsSeekable) {
- throw new UnsupportedOperationException("Cannot query stream-based BAM file");
- }
- try {
- final long startOfLastLinearBin = getIndex().getStartOfLastLinearBin();
- if (startOfLastLinearBin != -1) {
- mCompressedInputStream.seek(startOfLastLinearBin);
- } else {
- // No mapped reads in file, just start at the first read in file.
- mCompressedInputStream.seek(mFirstRecordPointer);
- }
- mCurrentIterator = new BAMFileIndexUnmappedIterator();
- return mCurrentIterator;
- } catch (final IOException e) {
- throw new RuntimeIOException("IOException seeking to unmapped reads", e);
- }
- }
-
- /**
- * Reads the header of a BAM file from a stream
- * @param stream A BinaryCodec to read the header from
- * @param validationStringency Determines how stringent to be when validating the sam
- * @param source Note that this is used only for reporting errors.
- */
- protected static SAMFileHeader readHeader(final BinaryCodec stream, final ValidationStringency validationStringency, final String source)
- throws IOException {
-
- final byte[] buffer = new byte[4];
- stream.readBytes(buffer);
- if (!Arrays.equals(buffer, BAMFileConstants.BAM_MAGIC)) {
- throw new IOException("Invalid BAM file header");
- }
-
- final int headerTextLength = stream.readInt();
- final String textHeader = stream.readString(headerTextLength);
- final SAMTextHeaderCodec headerCodec = new SAMTextHeaderCodec();
- headerCodec.setValidationStringency(validationStringency);
- final SAMFileHeader samFileHeader = headerCodec.decode(new StringLineReader(textHeader),
- source);
-
- final int sequenceCount = stream.readInt();
- if (!samFileHeader.getSequenceDictionary().isEmpty()) {
- // It is allowed to have binary sequences but no text sequences, so only validate if both are present
- if (sequenceCount != samFileHeader.getSequenceDictionary().size()) {
- throw new SAMFormatException("Number of sequences in text header (" +
- samFileHeader.getSequenceDictionary().size() +
- ") != number of sequences in binary header (" + sequenceCount + ") for file " + source);
- }
- for (int i = 0; i < sequenceCount; i++) {
- final SAMSequenceRecord binarySequenceRecord = readSequenceRecord(stream, source);
- final SAMSequenceRecord sequenceRecord = samFileHeader.getSequence(i);
- if (!sequenceRecord.getSequenceName().equals(binarySequenceRecord.getSequenceName())) {
- throw new SAMFormatException("For sequence " + i + ", text and binary have different names in file " +
- source);
- }
- if (sequenceRecord.getSequenceLength() != binarySequenceRecord.getSequenceLength()) {
- throw new SAMFormatException("For sequence " + i + ", text and binary have different lengths in file " +
- source);
- }
- }
- } else {
- // If only binary sequences are present, copy them into samFileHeader
- final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>(sequenceCount);
- for (int i = 0; i < sequenceCount; i++) {
- sequences.add(readSequenceRecord(stream, source));
- }
- samFileHeader.setSequenceDictionary(new SAMSequenceDictionary(sequences));
- }
-
- return samFileHeader;
- }
-
- /**
- * Reads a single binary sequence record from the file or stream
- * @param source Note that this is used only for reporting errors.
- */
- private static SAMSequenceRecord readSequenceRecord(final BinaryCodec stream, final String source) {
- final int nameLength = stream.readInt();
- if (nameLength <= 1) {
- throw new SAMFormatException("Invalid BAM file header: missing sequence name in file " + source);
- }
- final String sequenceName = stream.readString(nameLength - 1);
- // Skip the null terminator
- stream.readByte();
- final int sequenceLength = stream.readInt();
- return new SAMSequenceRecord(SAMSequenceRecord.truncateSequenceName(sequenceName), sequenceLength);
- }
-
- /**
- * Encapsulates the restriction that only one iterator may be open at a time.
- */
- private abstract class AbstractBamIterator implements CloseableIterator<SAMRecord> {
-
- private boolean isClosed = false;
-
- public void close() {
- if (!isClosed) {
- if (mCurrentIterator != null && this != mCurrentIterator) {
- throw new IllegalStateException("Attempt to close non-current iterator");
- }
- mCurrentIterator = null;
- isClosed = true;
- }
- }
-
- protected void assertOpen() {
- if (isClosed) throw new AssertionError("Iterator has been closed");
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Not supported: remove");
- }
-
- }
-
- private class EmptyBamIterator extends AbstractBamIterator {
- @Override
- public boolean hasNext() {
- return false;
- }
-
- @Override
- public SAMRecord next() {
- throw new NoSuchElementException("next called on empty iterator");
- }
- }
-
- /**
-
- /**
- * Iterator for non-indexed sequential iteration through all SAMRecords in file.
- * Starting point of iteration is wherever current file position is when the iterator is constructed.
- */
- private class BAMFileIterator extends AbstractBamIterator {
- private SAMRecord mNextRecord = null;
- private final BAMRecordCodec bamRecordCodec;
- private long samRecordIndex = 0; // Records at what position (counted in records) we are at in the file
-
- BAMFileIterator() {
- this(true);
- }
-
- /**
- * @param advance Trick to enable subclass to do more setup before advancing
- */
- BAMFileIterator(final boolean advance) {
- this.bamRecordCodec = new BAMRecordCodec(getFileHeader(), samRecordFactory);
- this.bamRecordCodec.setInputStream(BAMFileReader.this.mStream.getInputStream(),
- BAMFileReader.this.mStream.getInputFileName());
-
- if (advance) {
- advance();
- }
- }
-
- public boolean hasNext() {
- assertOpen();
- return (mNextRecord != null);
- }
-
- public SAMRecord next() {
- assertOpen();
- final SAMRecord result = mNextRecord;
- advance();
- return result;
- }
-
- void advance() {
- try {
- mNextRecord = getNextRecord();
-
- if (mNextRecord != null) {
- ++this.samRecordIndex;
- // Because some decoding is done lazily, the record needs to remember the validation stringency.
- mNextRecord.setValidationStringency(mValidationStringency);
-
- if (mValidationStringency != ValidationStringency.SILENT) {
- final List<SAMValidationError> validationErrors = mNextRecord.isValid(mValidationStringency == ValidationStringency.STRICT);
- SAMUtils.processValidationErrors(validationErrors,
- this.samRecordIndex, BAMFileReader.this.getValidationStringency());
- }
- }
- if (eagerDecode && mNextRecord != null) {
- mNextRecord.eagerDecode();
- }
- } catch (final IOException exc) {
- throw new RuntimeIOException(exc.getMessage(), exc);
- }
- }
-
- /**
- * Read the next record from the input stream.
- */
- SAMRecord getNextRecord() throws IOException {
- final long startCoordinate = mCompressedInputStream.getFilePointer();
- final SAMRecord next = bamRecordCodec.decode();
- final long stopCoordinate = mCompressedInputStream.getFilePointer();
-
- if(mReader != null && next != null)
- next.setFileSource(new SAMFileSource(mReader,new BAMFileSpan(new Chunk(startCoordinate,stopCoordinate))));
-
- return next;
- }
-
- /**
- * @return The record that will be return by the next call to next()
- */
- protected SAMRecord peek() {
- return mNextRecord;
- }
- }
-
- /**
- * Prepare to iterate through SAMRecords in the given reference that start exactly at the given start coordinate.
- * @param referenceIndex Desired reference sequence.
- * @param start 1-based alignment start.
- */
- private CloseableIterator<SAMRecord> createStartingAtIndexIterator(final int referenceIndex,
- final int start) {
-
- // Hit the index to determine the chunk boundaries for the required data.
- final BAMIndex fileIndex = getIndex();
- final BAMFileSpan fileSpan = fileIndex.getSpanOverlapping(referenceIndex, start, 0);
- final long[] filePointers = fileSpan != null ? fileSpan.toCoordinateArray() : null;
-
- // Create an iterator over the above chunk boundaries.
- final BAMFileIndexIterator iterator = new BAMFileIndexIterator(filePointers);
-
- // Add some preprocessing filters for edge-case reads that don't fit into this
- // query type.
- return new BAMQueryFilteringIterator(iterator,new BAMStartingAtIteratorFilter(referenceIndex,start));
- }
-
- /**
- * @throws java.lang.IllegalArgumentException if the intervals are not optimized
- * @see QueryInterval#optimizeIntervals(QueryInterval[])
- */
- private void assertIntervalsOptimized(final QueryInterval[] intervals) {
- if (intervals.length == 0) return;
- for (int i = 1; i < intervals.length; ++i) {
- final QueryInterval prev = intervals[i-1];
- final QueryInterval thisInterval = intervals[i];
- if (prev.compareTo(thisInterval) >= 0) {
- throw new IllegalArgumentException(String.format("List of intervals is not sorted: %s >= %s", prev, thisInterval));
- }
- if (prev.overlaps(thisInterval)) {
- throw new IllegalArgumentException(String.format("List of intervals is not optimized: %s intersects %s", prev, thisInterval));
- }
- if (prev.abuts(thisInterval)) {
- throw new IllegalArgumentException(String.format("List of intervals is not optimized: %s abuts %s", prev, thisInterval));
- }
- }
- }
-
- private CloseableIterator<SAMRecord> createIndexIterator(final QueryInterval[] intervals,
- final boolean contained) {
-
- assertIntervalsOptimized(intervals);
-
- // Hit the index to determine the chunk boundaries for the required data.
- final BAMFileSpan[] inputSpans = new BAMFileSpan[intervals.length];
- final BAMIndex fileIndex = getIndex();
- for (int i = 0; i < intervals.length; ++i) {
- final QueryInterval interval = intervals[i];
- final BAMFileSpan span = fileIndex.getSpanOverlapping(interval.referenceIndex, interval.start, interval.end);
- inputSpans[i] = span;
- }
- final long[] filePointers;
- if (inputSpans.length > 0) {
- filePointers = BAMFileSpan.merge(inputSpans).toCoordinateArray();
- } else {
- filePointers = null;
- }
-
- // Create an iterator over the above chunk boundaries.
- final BAMFileIndexIterator iterator = new BAMFileIndexIterator(filePointers);
-
- // Add some preprocessing filters for edge-case reads that don't fit into this
- // query type.
- return new BAMQueryFilteringIterator(iterator, new BAMQueryMultipleIntervalsIteratorFilter(intervals, contained));
- }
-
- /**
- * Iterate over the SAMRecords defined by the sections of the file described in the ctor argument.
- */
- private class BAMFileIndexIterator extends BAMFileIterator {
-
- private long[] mFilePointers = null;
- private int mFilePointerIndex = 0;
- private long mFilePointerLimit = -1;
-
- /**
- * Prepare to iterate through SAMRecords stored in the specified compressed blocks at the given offset.
- * @param filePointers the block / offset combination, stored in chunk format.
- */
- BAMFileIndexIterator(final long[] filePointers) {
- super(false); // delay advance() until after construction
- mFilePointers = filePointers;
- advance();
- }
-
- SAMRecord getNextRecord()
- throws IOException {
- // Advance to next file block if necessary
- while (mCompressedInputStream.getFilePointer() >= mFilePointerLimit) {
- if (mFilePointers == null ||
- mFilePointerIndex >= mFilePointers.length) {
- return null;
- }
- final long startOffset = mFilePointers[mFilePointerIndex++];
- final long endOffset = mFilePointers[mFilePointerIndex++];
- mCompressedInputStream.seek(startOffset);
- mFilePointerLimit = endOffset;
- }
- // Pull next record from stream
- return super.getNextRecord();
- }
- }
-
- /**
- * Pull SAMRecords from a coordinate-sorted iterator, and filter out any that do not match the filter.
- */
- public class BAMQueryFilteringIterator extends AbstractBamIterator {
- /**
- * The wrapped iterator.
- */
- protected final CloseableIterator<SAMRecord> wrappedIterator;
- /**
- * The next record to be returned. Will be null if no such record exists.
- */
- protected SAMRecord mNextRecord;
- private final BAMIteratorFilter iteratorFilter;
-
- public BAMQueryFilteringIterator(final CloseableIterator<SAMRecord> iterator,
- final BAMIteratorFilter iteratorFilter) {
- this.wrappedIterator = iterator;
- this.iteratorFilter = iteratorFilter;
- mNextRecord = advance();
- }
-
- /**
- * Returns true if a next element exists; false otherwise.
- */
- public boolean hasNext() {
- assertOpen();
- return mNextRecord != null;
- }
-
- /**
- * Gets the next record from the given iterator.
- * @return The next SAM record in the iterator.
- */
- public SAMRecord next() {
- if(!hasNext())
- throw new NoSuchElementException("BAMQueryFilteringIterator: no next element available");
- final SAMRecord currentRead = mNextRecord;
- mNextRecord = advance();
- return currentRead;
- }
-
- SAMRecord advance() {
- while (true) {
- // Pull next record from stream
- if(!wrappedIterator.hasNext())
- return null;
-
- final SAMRecord record = wrappedIterator.next();
- switch (iteratorFilter.compareToFilter(record)) {
- case MATCHES_FILTER: return record;
- case STOP_ITERATION: return null;
- case CONTINUE_ITERATION: break; // keep looping
- default: throw new SAMException("Unexpected return from compareToFilter");
- }
- }
- }
- }
-
- /**
- * A decorating iterator that filters out records that do not match the given reference and start position.
- */
- private class BAMStartingAtIteratorFilter implements BAMIteratorFilter {
-
- private final int mReferenceIndex;
- private final int mRegionStart;
-
- public BAMStartingAtIteratorFilter(final int referenceIndex, final int start) {
- mReferenceIndex = referenceIndex;
- mRegionStart = start;
- }
-
- /**
- *
- * @return MATCHES_FILTER if this record matches the filter;
- * CONTINUE_ITERATION if does not match filter but iteration should continue;
- * STOP_ITERATION if does not match filter and iteration should end.
- */
- @Override
- public FilteringIteratorState compareToFilter(final SAMRecord record) {
- // If beyond the end of this reference sequence, end iteration
- final int referenceIndex = record.getReferenceIndex();
- if (referenceIndex < 0 || referenceIndex > mReferenceIndex) {
- return FilteringIteratorState.STOP_ITERATION;
- } else if (referenceIndex < mReferenceIndex) {
- // If before this reference sequence, continue
- return FilteringIteratorState.CONTINUE_ITERATION;
- }
- final int alignmentStart = record.getAlignmentStart();
- if (alignmentStart > mRegionStart) {
- // If scanned beyond target region, end iteration
- return FilteringIteratorState.STOP_ITERATION;
- } else if (alignmentStart == mRegionStart) {
- return FilteringIteratorState.MATCHES_FILTER;
- } else {
- return FilteringIteratorState.CONTINUE_ITERATION;
- }
- }
-
- }
-
- private class BAMFileIndexUnmappedIterator extends BAMFileIterator {
- private BAMFileIndexUnmappedIterator() {
- while (this.hasNext() && peek().getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- advance();
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileSpan.java b/src/main/java/htsjdk/samtools/BAMFileSpan.java
deleted file mode 100644
index 193e443..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileSpan.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An ordered list of chunks, capable of representing a set of discontiguous
- * regions in the BAM file. FileSpans are mutable within the package, but perceived
- * as immutable outside the package.
- *
- * Some operations on FileSpans assume that the spans are sorted. In these cases,
- * sort order will be validated.
- *
- * @author mhanna
- * @version 0.1
- */
-public class BAMFileSpan implements SAMFileSpan, Serializable {
- private static final long serialVersionUID = 1L;
-
- /**
- * The constituent chunks of this list.
- */
- private final List<Chunk> chunks;
-
- /**
- * Create a new empty list of chunks.
- */
- public BAMFileSpan() {
- this.chunks = new ArrayList<Chunk>();
- }
-
- /**
- * Convenience constructor to construct a BAM file span from
- * a single chunk.
- * @param chunk Chunk to use as the sole region in this span.
- */
- public BAMFileSpan(final Chunk chunk) {
- this.chunks = new ArrayList<Chunk>();
- chunks.add(chunk);
- }
-
- /**
- * Create a new chunk list from the given list of chunks.
- * @param chunks Constituent chunks.
- */
- public BAMFileSpan(final List<Chunk> chunks) {
- this.chunks = new ArrayList<Chunk>(chunks);
- }
-
- /**
- * Does this chunk list map to any position within the BAM file?
- * @return True iff the ChunkList points to any data within the BAM.
- */
- public boolean isEmpty() {
- return chunks.isEmpty();
- }
-
- /**
- * Deep clone the given chunk list.
- * @return A copy of the chunk list.
- */
- public BAMFileSpan clone() {
- final BAMFileSpan clone = new BAMFileSpan();
- for(final Chunk chunk: chunks)
- clone.chunks.add(chunk.clone());
- return clone;
- }
-
- /**
- * Creates a new file span by removing all chunks before the given file span starts.
- * If a chunk in the chunk list starts before and ends after the given
- * chunk, the first portion of the chunk will be deleted.
- * @param fileSpan The filespan before which to eliminate.
- * @return A new BAMFileSpan which contains the portion of the chunk list after the given chunk.
- */
- public SAMFileSpan removeContentsBefore(final SAMFileSpan fileSpan) {
- if(fileSpan == null)
- return clone();
-
- if(!(fileSpan instanceof BAMFileSpan))
- throw new SAMException("Unable to compare ");
-
- final BAMFileSpan bamFileSpan = (BAMFileSpan)fileSpan;
-
- if(bamFileSpan.isEmpty())
- return clone();
-
- validateSorted();
-
- final BAMFileSpan trimmedChunkList = new BAMFileSpan();
- for(final Chunk chunkToTrim: chunks) {
- if(chunkToTrim.getChunkEnd() > chunkToTrim.getChunkStart()) {
- if(chunkToTrim.getChunkStart() >= bamFileSpan.chunks.get(0).getChunkStart()) {
- // This chunk from the list is completely beyond the start of the filtering chunk.
- trimmedChunkList.add(chunkToTrim.clone());
- }
- else {
- // This chunk from the list partially overlaps the filtering chunk and must be trimmed.
- trimmedChunkList.add(new Chunk(bamFileSpan.chunks.get(0).getChunkStart(),chunkToTrim.getChunkEnd()));
- }
- }
- }
- return trimmedChunkList;
- }
-
- /**
- * Gets a file span over the data immediately following this span.
- * @return The a pointer to data immediately following this span.
- */
- public SAMFileSpan getContentsFollowing() {
- if(chunks.isEmpty())
- throw new SAMException("Unable to get the file pointer following this one: no data present.");
- validateSorted();
- return new BAMFileSpan(new Chunk(chunks.get(chunks.size()-1).getChunkEnd(),Long.MAX_VALUE));
- }
-
- /**
- * Merge one span into another
- *
- * @param span - span with chunks to add to this one
- */
- protected void add(final BAMFileSpan span) {
- for (final Chunk c : span.chunks) {
- chunks.add(c);
- }
- }
-
- /**
- * Adds a new chunk to this list. Visible only within the BAm.
- * @param chunk Chunk to add.
- */
- protected void add(final Chunk chunk) {
- chunks.add(chunk);
- }
-
- /**
- * Convert the chunk list to an array of offsets, paired in [start,end) format.
- * @return Array of offsets.
- */
- public long[] toCoordinateArray() {
- final int count = chunks.size() * 2;
- if (count == 0) {
- return null;
- }
- int index = 0;
- final long[] result = new long[count];
- for (final Chunk chunk : chunks) {
- result[index++] = chunk.getChunkStart();
- result[index++] = chunk.getChunkEnd();
- }
- return result;
- }
-
- /**
- * Find the first offset in the chunk list
- * @return The first offset in the span
- */
- public long getFirstOffset() {
- final long result = 0;
- if (chunks == null){
- return result;
- }
- for (final Chunk chunk : chunks) {
- return chunk.getChunkStart();
- }
- return result;
- }
-
- /**
- * Gets the constituent chunks stored in this span.
- * @return An unmodifiable list of chunks.
- */
- public List<Chunk> getChunks() {
- return Collections.unmodifiableList(chunks);
- }
-
- /**
- * Checks that there is only a single chunk for this span and returns it.
- * @return The single chunk stored in this span
- */
- protected Chunk getSingleChunk() {
- if (chunks.size() != 1){
- throw new SAMException("Expecting a single chunk for span. Found " + chunks.size());
- }
- return chunks.get(0);
- }
-
- /**
- * The list of chunks is often represented as an array of
- * longs where every even-numbered index is a start coordinate
- * and every odd-numbered index is a stop coordinate. Convert
- * from that format back to a list of chunks.
- * @param coordinateArray List of chunks to convert.
- * @return A list of chunks.
- */
- protected static SAMFileSpan toChunkList(final long[] coordinateArray) {
- if(coordinateArray.length % 2 != 0)
- throw new SAMException("Data supplied does not appear to be in coordinate array format.");
-
- final BAMFileSpan chunkList = new BAMFileSpan();
- for(int i = 0; i < coordinateArray.length; i += 2)
- chunkList.add(new Chunk(coordinateArray[i],coordinateArray[i+1]));
-
- chunkList.validateSorted();
-
- return chunkList;
- }
-
- /**
- * Validates the list of chunks to ensure that they appear in sorted order.
- */
- private void validateSorted() {
- for(int i = 1; i < chunks.size(); i++) {
- if(chunks.get(i).getChunkStart() < chunks.get(i-1).getChunkEnd())
- throw new SAMException(String.format("Chunk list is unsorted; chunk %s is before chunk %s",chunks.get(i-1),chunks.get(i)));
- }
- }
-
- /**
- * Creates a string representation of this chunk list.
- */
- @Override
- public String toString() {
- return StringUtil.join(";", chunks);
- }
-
- /**
- *
- * @return A single BAMFileSpan that is an intelligent merge of the input spans, i.e. contiguous, overlapping
- * and contained chunks are intelligently merged, and the chunks are sorted.
- */
- public static BAMFileSpan merge(final BAMFileSpan[] spans) {
- final ArrayList<Chunk> inputChunks = new ArrayList<Chunk>();
- for (final BAMFileSpan span : spans) {
- if(span != null){
- inputChunks.addAll(span.chunks);
- }
- }
- return new BAMFileSpan(Chunk.optimizeChunkList(inputChunks, 0));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMFileWriter.java b/src/main/java/htsjdk/samtools/BAMFileWriter.java
deleted file mode 100644
index f6a474e..0000000
--- a/src/main/java/htsjdk/samtools/BAMFileWriter.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Concrete implementation of SAMFileWriter for writing gzipped BAM files.
- */
-class BAMFileWriter extends SAMFileWriterImpl {
-
- private final BinaryCodec outputBinaryCodec;
- private BAMRecordCodec bamRecordCodec = null;
- private final BlockCompressedOutputStream blockCompressedOutputStream;
- private BAMIndexer bamIndexer = null;
-
- protected BAMFileWriter(final File path) {
- blockCompressedOutputStream = new BlockCompressedOutputStream(path);
- outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- outputBinaryCodec.setOutputFileName(path.getAbsolutePath());
- }
-
- protected BAMFileWriter(final File path, final int compressionLevel) {
- blockCompressedOutputStream = new BlockCompressedOutputStream(path, compressionLevel);
- outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- outputBinaryCodec.setOutputFileName(path.getAbsolutePath());
- }
-
- protected BAMFileWriter(final OutputStream os, final File file) {
- blockCompressedOutputStream = new BlockCompressedOutputStream(os, file);
- outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- outputBinaryCodec.setOutputFileName(getPathString(file));
- }
-
- protected BAMFileWriter(final OutputStream os, final File file, final int compressionLevel) {
- blockCompressedOutputStream = new BlockCompressedOutputStream(os, file, compressionLevel);
- outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- outputBinaryCodec.setOutputFileName(getPathString(file));
- }
-
- protected BAMFileWriter(final OutputStream os, final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
- blockCompressedOutputStream = new BlockCompressedOutputStream(os, file, compressionLevel, deflaterFactory);
- outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- outputBinaryCodec.setOutputFileName(getPathString(file));
- }
-
- private void prepareToWriteAlignments() {
- if (bamRecordCodec == null) {
- bamRecordCodec = new BAMRecordCodec(getFileHeader());
- bamRecordCodec.setOutputStream(outputBinaryCodec.getOutputStream(), getFilename());
- }
- }
-
- /** @return absolute path, or null if arg is null. */
- private String getPathString(final File path){
- return (path != null) ? path.getAbsolutePath() : null;
- }
-
- // Allow enabling the bam index construction
- // only enabled by factory method before anything is written
- void enableBamIndexConstruction () {
- if (!getSortOrder().equals(SAMFileHeader.SortOrder.coordinate)){
- throw new SAMException("Not creating BAM index since not sorted by coordinates: " + getSortOrder());
- }
- if(getFilename() == null){
- throw new SAMException("Not creating BAM index since we don't have an output file name");
- }
- bamIndexer = createBamIndex(getFilename());
- }
-
- private BAMIndexer createBamIndex(final String path) {
- try {
- final String indexFileBase = path.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION) ?
- path.substring(0, path.lastIndexOf('.')) : path;
- final File indexFile = new File(indexFileBase + BAMIndex.BAMIndexSuffix);
- if (indexFile.exists()) {
- if (!indexFile.canWrite()) {
- throw new SAMException("Not creating BAM index since unable to write index file " + indexFile);
- }
- }
- return new BAMIndexer(indexFile, getFileHeader());
- } catch (Exception e) {
- throw new SAMException("Not creating BAM index", e);
- }
- }
-
- protected void writeAlignment(final SAMRecord alignment) {
- prepareToWriteAlignments();
-
- if (bamIndexer != null) {
- try {
- final long startOffset = blockCompressedOutputStream.getFilePointer();
- bamRecordCodec.encode(alignment);
- final long stopOffset = blockCompressedOutputStream.getFilePointer();
- // set the alignment's SourceInfo and then prepare its index information
- alignment.setFileSource(new SAMFileSource(null, new BAMFileSpan(new Chunk(startOffset, stopOffset))));
- bamIndexer.processAlignment(alignment);
- } catch (Exception e) {
- bamIndexer = null;
- throw new SAMException("Exception when processing alignment for BAM index " + alignment, e);
- }
- } else {
- bamRecordCodec.encode(alignment);
- }
- }
-
- protected void writeHeader(final String textHeader) {
- writeHeader(outputBinaryCodec, getFileHeader(), textHeader);
- }
-
- protected void finish() {
- outputBinaryCodec.close();
- try {
- if (bamIndexer != null) {
- bamIndexer.finish();
- }
- } catch (Exception e) {
- throw new SAMException("Exception writing BAM index file", e);
- }
- }
-
- /** @return absolute path, or null if this writer does not correspond to a file. */
- protected String getFilename() {
- return outputBinaryCodec.getOutputFileName();
- }
-
- /**
- * Writes a header to a BAM file. samFileHeader and headerText are redundant - one can be used to regenerate the other but in
- * some instances we already have both so this allows us to save some cycles
- */
- protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAMFileHeader samFileHeader, final String headerText) {
- outputBinaryCodec.writeBytes(BAMFileConstants.BAM_MAGIC);
-
- // calculate and write the length of the SAM file header text and the header text
- outputBinaryCodec.writeString(headerText, true, false);
-
- // write the sequences binarily. This is redundant with the text header
- outputBinaryCodec.writeInt(samFileHeader.getSequenceDictionary().size());
- for (final SAMSequenceRecord sequenceRecord: samFileHeader.getSequenceDictionary().getSequences()) {
- outputBinaryCodec.writeString(sequenceRecord.getSequenceName(), true, true);
- outputBinaryCodec.writeInt(sequenceRecord.getSequenceLength());
- }
- }
-
- /**
- * Writes a header to a BAM file. Might need to regenerate the String version of the header, if one already has both the
- * samFileHeader and the String, use the version of this method which takes both.
- */
- protected static void writeHeader(final BinaryCodec outputBinaryCodec, final SAMFileHeader samFileHeader) {
- // Do not use SAMFileHeader.getTextHeader() as it is not updated when changes to the underlying object are made
- final String headerString;
- final Writer stringWriter = new StringWriter();
- new SAMTextHeaderCodec().encode(stringWriter, samFileHeader, true);
- headerString = stringWriter.toString();
-
- writeHeader(outputBinaryCodec, samFileHeader, headerString);
- }
-
- protected static void writeHeader(final OutputStream outputStream, final SAMFileHeader samFileHeader) {
- final BlockCompressedOutputStream blockCompressedOutputStream = new BlockCompressedOutputStream(outputStream, null);
- final BinaryCodec outputBinaryCodec = new BinaryCodec(new DataOutputStream(blockCompressedOutputStream));
- writeHeader(outputBinaryCodec, samFileHeader);
- try {
- blockCompressedOutputStream.flush();
- } catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndex.java b/src/main/java/htsjdk/samtools/BAMIndex.java
deleted file mode 100644
index 3663df9..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndex.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-/**
- * A basic interface for querying BAM indices.
- *
- * @author mhanna
- * @version 0.1
- */
-public interface BAMIndex extends Closeable {
-
- public static final String BAMIndexSuffix = ".bai";
-
- /**
- * Gets the compressed chunks which should be searched for the contents of records contained by the span
- * referenceIndex:startPos-endPos, inclusive. See the BAM spec for more information on how a chunk is
- * represented.
- *
- * @param referenceIndex The contig.
- * @param startPos Genomic start of query.
- * @param endPos Genomic end of query.
- * @return A file span listing the chunks in the BAM file.
- */
- BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos);
-
- /**
- * Gets the start of the last linear bin in the index.
- * @return The chunk indicating the start of the last bin in the linear index.
- */
- long getStartOfLastLinearBin();
-
- /**
- * Gets meta data for the given reference including information about number of aligned, unaligned, and noCoordinate records
- * @param reference the reference of interest
- * @return meta data for the reference
- */
- public BAMIndexMetaData getMetaData(int reference);
-
- /**
- * Close the index and release any associated resources.
- */
- void close();
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexContent.java b/src/main/java/htsjdk/samtools/BAMIndexContent.java
deleted file mode 100644
index be9d856..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexContent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Represents the contents of a bam index file for one reference.
- * A BAM index (.bai) file contains information for all references in the bam file.
- * This class describes the data present in the index file for one of these references;
- * including the bins, chunks, and linear index.
- */
-class BAMIndexContent extends BinningIndexContent {
- /**
- * Chunks containing metaData for the reference, e.g. number of aligned and unaligned records
- */
- private final BAMIndexMetaData mMetaData;
-
-
-
- /**
- * @param referenceSequence Content corresponds to this reference.
- * @param binList Array of bins represented by this content, possibly sparse
- * @param metaData Extra information about the reference in this index
- * @param linearIndex Additional index used to optimize queries
- */
- BAMIndexContent(final int referenceSequence, final BinList binList, final BAMIndexMetaData metaData, final LinearIndex linearIndex) {
- super(referenceSequence, binList, linearIndex);
- this.mMetaData = metaData;
- }
-
- /**
- * @param referenceSequence Content corresponds to this reference.
- * @param bins Array of bins represented by this content, possibly sparse
- * @param numberOfBins Number of non-null bins
- * @param metaData Extra information about the reference in this index
- * @param linearIndex Additional index used to optimize queries
- */
- BAMIndexContent(final int referenceSequence, final Bin[] bins, final int numberOfBins, final BAMIndexMetaData metaData, final LinearIndex linearIndex) {
- this(referenceSequence, new BinList(bins, numberOfBins), metaData, linearIndex);
- }
-
- /**
- * @return the meta data chunks for this content
- */
- public BAMIndexMetaData getMetaData() {
- return mMetaData;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexMetaData.java b/src/main/java/htsjdk/samtools/BAMIndexMetaData.java
deleted file mode 100644
index 3dceab2..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexMetaData.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Metadata about the bam index contained within the bam index.
- * One instance created per index file.
- */
-public class BAMIndexMetaData {
-
- // information for the entire index.
- // stored at the end of the index
- private long noCoordinateRecords = 0;
-
- // information for each reference.
- // stored in two chunks in bin # MAX_BINS
- private long firstOffset = -1;
- private long lastOffset = 0;
- private int alignedRecords = 0;
- private int unAlignedRecords = 0; // unmapped, but associated with this reference
-
-
- /**
- * Constructor used when writing an index
- * construct one instance for each index generated
- */
- BAMIndexMetaData() {
- noCoordinateRecords = 0;
- newReference();
- }
-
- /**
- * Constructor used when reading an index
- * construct one instance for each index generated
- */
- BAMIndexMetaData(List<Chunk> chunkList) {
- noCoordinateRecords = 0;
-
- if (chunkList == null || chunkList.isEmpty()) {
- // System.out.println("No metadata chunks");
- } else if (chunkList.size() != 2) {
- throw new SAMException("Unexpected number of metadata chunks " + (chunkList.size()));
- }
- // fill in the first/lastOffset un/alignedRecords from this
- boolean firstChunk = true;
- if (chunkList != null) {
- for (Chunk c : chunkList) {
- long start = c.getChunkStart();
- long end = c.getChunkEnd();
- if (firstChunk) {
- firstOffset = start;
- lastOffset = end;
- firstChunk = false;
- } else {
- firstChunk = true;
- alignedRecords = (int) start;
- unAlignedRecords = (int) end;
- }
- }
- }
- }
-
- /**
- * @return the count of aligned records associated with this reference
- */
- public int getAlignedRecordCount() {
- return alignedRecords;
- }
-
- /**
- * @return the count of unaligned records associated with this reference
- */
- public int getUnalignedRecordCount() {
- return unAlignedRecords;
- }
-
- /**
- * Call for each new reference sequence encountered
- */
- void newReference() {
- firstOffset = -1;
- lastOffset = 0;
- alignedRecords = 0;
- unAlignedRecords = 0;
- }
-
- /**
- * Extract relevant metaData from the record and its filePointer
- * Call only once per record in the file being indexed
- *
- * @param rec
- */
- void recordMetaData(final SAMRecord rec) {
-
- final int alignmentStart = rec.getAlignmentStart();
- if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
- incrementNoCoordinateRecordCount();
- return;
- }
-
- if (rec.getFileSource() == null) {
- throw new SAMException("BAM cannot be indexed without setting a fileSource for record " + rec);
- }
- final Chunk newChunk = ((BAMFileSpan) rec.getFileSource().getFilePointer()).getSingleChunk();
- final long start = newChunk.getChunkStart();
- final long end = newChunk.getChunkEnd();
-
- if (rec.getReadUnmappedFlag()) {
- unAlignedRecords++;
- } else {
- alignedRecords++;
- }
- if (BlockCompressedFilePointerUtil.compare(start, firstOffset) < 1 || firstOffset == -1) {
- this.firstOffset = start;
- }
- if (BlockCompressedFilePointerUtil.compare(lastOffset, end) < 1) {
- this.lastOffset = end;
- }
- }
-
- /**
- * @param slice
- */
- void recordMetaData(Slice slice) {
-
- final int alignmentStart = slice.alignmentStart;
- if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
- noCoordinateRecords+=slice.nofRecords;
- return;
- }
-
- final long start = slice.offset;
- final long end = slice.offset + 0;
-
- if (slice.alignmentSpan < 1) {
- unAlignedRecords += slice.nofRecords;
- } else {
- alignedRecords += slice.nofRecords;
- }
- if (BlockCompressedFilePointerUtil.compare(start, firstOffset) < 1 || firstOffset == -1) {
- this.firstOffset = start;
- }
- if (BlockCompressedFilePointerUtil.compare(lastOffset, end) < 1) {
- this.lastOffset = end;
- }
- }
-
- /**
- * Call whenever a reference with no coordinate information is encountered in the bam file
- */
- void incrementNoCoordinateRecordCount() {
- noCoordinateRecords++;
- }
-
- /**
- * Set local variable. Normally noCoordinateRecord count accessed from AbstractBAMFileIndex when reading
- */
- private void setNoCoordinateRecordCount(long count) {
- noCoordinateRecords = count;
- }
-
-
- /**
- * @return the count of records with no coordinate information in the bam file.
- * Not public, since only used by BAMIndexer when writing bam index.
- * Readers of bam index should use AbstractBAMFileIndex.getNoCoordinateRecordCount.
- */
- long getNoCoordinateRecordCount() {
- return noCoordinateRecords;
- }
-
- /**
- * @return the first virtual file offset used by this reference
- */
- long getFirstOffset() {
- return firstOffset;
- }
-
- /**
- * @return the last virtual file offset used by this reference
- */
- long getLastOffset() {
- return lastOffset;
- }
-
- /**
- * Prints meta-data statistics from BAM index (.bai) file
- * Statistics include count of aligned and unaligned reads for each reference sequence
- * and a count of all records with no start coordinate
- */
- static public void printIndexStats(final File inputBamFile) {
- try {
- final BAMFileReader bam = new BAMFileReader(inputBamFile, null, false, false, ValidationStringency.SILENT, new DefaultSAMRecordFactory());
- if (!bam.hasIndex()) {
- throw new SAMException("No index for bam file " + inputBamFile);
- }
- BAMIndexMetaData[] data = getIndexStats(bam);
- // read through all the bins of every reference.
- int nRefs = bam.getFileHeader().getSequenceDictionary().size();
- for (int i = 0; i < nRefs; i++) {
- final SAMSequenceRecord seq = bam.getFileHeader().getSequence(i);
- if (seq == null) continue;
- final String sequenceName = seq.getSequenceName();
- final int sequenceLength = seq.getSequenceLength();
- System.out.print(sequenceName + ' ' + "length=\t" + sequenceLength);
- if (data[i] == null) {
- System.out.println();
- continue;
- }
- System.out.println("\tAligned= " + data[i].getAlignedRecordCount() +
- "\tUnaligned= " + data[i].getUnalignedRecordCount());
- }
- System.out.println("NoCoordinateCount= " + data[0].getNoCoordinateRecordCount());
- } catch (IOException e) {
- throw new SAMException("Exception in getting index statistics", e);
- }
- }
-
- /**
- * Prints meta-data statistics from BAM index (.bai) file
- * Statistics include count of aligned and unaligned reads for each reference sequence
- * and a count of all records with no start coordinate
- */
- static public BAMIndexMetaData[] getIndexStats(final BAMFileReader bam) {
-
- AbstractBAMFileIndex index = (AbstractBAMFileIndex) bam.getIndex();
- // read through all the bins of every reference.
- int nRefs = index.getNumberOfReferences();
- BAMIndexMetaData[] result = new BAMIndexMetaData[nRefs == 0 ? 1 : nRefs];
- for (int i = 0; i < nRefs; i++) {
- result[i] = index.getMetaData(i);
- }
-
- if (result[0] == null) {
- result[0] = new BAMIndexMetaData();
- }
- final Long noCoordCount = index.getNoCoordinateCount();
- if (noCoordCount != null) // null in old index files without metadata
- result[0].setNoCoordinateRecordCount(noCoordCount);
-
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIndexWriter.java b/src/main/java/htsjdk/samtools/BAMIndexWriter.java
deleted file mode 100644
index b036b68..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-/**
- * A basic interface for writing BAM index files
- *
- * @author mborkan
- */
-interface BAMIndexWriter extends Closeable { // note - only package visibility
-
- /**
- * Write the data for one alignments to one reference sequence
- *
- * @param content BAMIndexContent containing the information for one reference
- */
- public void writeReference(final BAMIndexContent content);
-
- /**
- * Writes out the count of records without coordinates
- *
- * @param count
- */
- public void writeNoCoordinateRecordCount(final Long count);
-
- /**
- * Any necessary processing at the end of the file
- */
- public void close();
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/BAMIndexer.java b/src/main/java/htsjdk/samtools/BAMIndexer.java
deleted file mode 100644
index f5b1558..0000000
--- a/src/main/java/htsjdk/samtools/BAMIndexer.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.util.function.Function;
-
-/**
- * Class for both constructing BAM index content and writing it out.
- * There are two usage patterns:
- * 1) Building a bam index from an existing bam file
- * 2) Building a bam index while building the bam file
- * In both cases, processAlignment is called for each alignment record and
- * finish() is called at the end.
- */
-public class BAMIndexer {
-
- // The number of references (chromosomes) in the BAM file
- private final int numReferences;
-
- // output written as binary, or (for debugging) as text
- private final BAMIndexWriter outputWriter;
-
- private int currentReference = 0;
-
- // content is built up from the input bam file using this
- private final BAMIndexBuilder indexBuilder;
-
- private static final Log log = Log.getInstance(BAMIndexer.class);
-
- /**
- * @param output binary BAM Index (.bai) file
- * @param fileHeader header for the corresponding bam file
- */
- public BAMIndexer(final File output, final SAMFileHeader fileHeader) {
- this(fileHeader, numRefs -> new BinaryBAMIndexWriter(numRefs, output));
- }
-
- /**
- * Prepare to index a BAM.
- *
- * @param output Index will be written here. output will be closed when finish() method is called.
- * @param fileHeader header for the corresponding bam file.
- */
- public BAMIndexer(final OutputStream output, final SAMFileHeader fileHeader) {
- this(fileHeader, numRefs -> new BinaryBAMIndexWriter(numRefs, output));
- }
-
- /*
- * Prepare to index a BAM.
- *
- * @param fileHeader header for the corresponding bam file.
- * @param createWrite a lambda that, given an Integer numReferences value, will create a BinaryBAMIndexWriter
- * with that value and an appropriate output.
- */
- private BAMIndexer(final SAMFileHeader fileHeader, Function<Integer, BinaryBAMIndexWriter> createWriter) {
- if (fileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- if (fileHeader.getSortOrder() == SAMFileHeader.SortOrder.unsorted) {
- log.warn("For indexing, the BAM file is required to be coordinate sorted. Attempting to index \"unsorted\" BAM file.");
- }
- else {
- throw new SAMException("Indexing requires a coordinate-sorted input BAM.");
- }
- }
- numReferences = fileHeader.getSequenceDictionary().size();
- indexBuilder = new BAMIndexBuilder(fileHeader.getSequenceDictionary());
- outputWriter = createWriter.apply(numReferences);
- }
-
- /**
- * Record any index information for a given BAM record.
- * If this alignment starts a new reference, write out the old reference.
- * Requires a non-null value for rec.getFileSource().
- *
- * @param rec The BAM record
- */
- public void processAlignment(final SAMRecord rec) {
- try {
- final int reference = rec.getReferenceIndex();
- if (reference != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && reference != currentReference) {
- // process any completed references
- advanceToReference(reference);
- }
- indexBuilder.processAlignment(rec);
- } catch (final Exception e) {
- throw new SAMException("Exception creating BAM index for record " + rec, e);
- }
- }
-
- /**
- * After all the alignment records have been processed, finish is called.
- * Writes any final information and closes the output file.
- */
- public void finish() {
- // process any remaining references
- advanceToReference(numReferences);
- outputWriter.writeNoCoordinateRecordCount(indexBuilder.getNoCoordinateRecordCount());
- outputWriter.close();
- }
-
- /** write out any references between the currentReference and the nextReference */
- private void advanceToReference(final int nextReference) {
- while (currentReference < nextReference) {
- final BAMIndexContent content = indexBuilder.processReference(currentReference);
- outputWriter.writeReference(content);
- currentReference++;
- if (currentReference < numReferences) {
- indexBuilder.startNewReference();
- }
- }
- }
-
- /**
- * Generates a BAM index file, either textual or binary, from an input BAI file.
- * Only used for testing, but located here for visibility into CachingBAMFileIndex.
- *
- * @param output BAM Index (.bai) file (or bai.txt file when text)
- * @param textOutput Whether to create text output or binary
- */
- static public void createAndWriteIndex(final File input, final File output, final boolean textOutput) {
-
- // content is from an existing bai file.
-
- final CachingBAMFileIndex existingIndex = new CachingBAMFileIndex(input, null);
- final int n_ref = existingIndex.getNumberOfReferences();
- final BAMIndexWriter outputWriter;
- if (textOutput) {
- outputWriter = new TextualBAMIndexWriter(n_ref, output);
- } else {
- outputWriter = new BinaryBAMIndexWriter(n_ref, output);
- }
-
- // write the content one reference at a time
- try {
- for (int i = 0; i < n_ref; i++) {
- outputWriter.writeReference(existingIndex.getQueryResults(i));
- }
- outputWriter.writeNoCoordinateRecordCount(existingIndex.getNoCoordinateCount());
- outputWriter.close();
-
- } catch (final Exception e) {
- throw new SAMException("Exception creating BAM index", e);
- }
- }
-
- /**
- * Class for constructing BAM index files.
- * One instance is used to construct an entire index.
- * processAlignment is called for each alignment until a new reference is encountered, then
- * processReference is called when all records for the reference have been processed.
- */
- private class BAMIndexBuilder {
-
- private final SAMSequenceDictionary sequenceDictionary;
-
- private BinningIndexBuilder binningIndexBuilder;
-
- private int currentReference = -1;
-
- // information in meta data
- private final BAMIndexMetaData indexStats = new BAMIndexMetaData();
-
- BAMIndexBuilder(final SAMSequenceDictionary sequenceDictionary) {
- this.sequenceDictionary = sequenceDictionary;
- if (!sequenceDictionary.isEmpty()) startNewReference();
- }
-
- /**
- * Record any index information for a given BAM record
- *
- * @param rec The BAM record. Requires rec.getFileSource() is non-null.
- */
- public void processAlignment(final SAMRecord rec) {
-
- // metadata
- indexStats.recordMetaData(rec);
-
- if (rec.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) {
- return; // do nothing for records without coordinates, but count them
- }
-
- // various checks
- final int reference = rec.getReferenceIndex();
- if (reference != currentReference) {
- throw new SAMException("Unexpected reference " + reference +
- " when constructing index for " + currentReference + " for record " + rec);
- }
-
- binningIndexBuilder.processFeature(new BinningIndexBuilder.FeatureToBeIndexed() {
- @Override
- public int getStart() {
- return rec.getAlignmentStart();
- }
-
- @Override
- public int getEnd() {
- return rec.getAlignmentEnd();
- }
-
- @Override
- public Integer getIndexingBin() {
- final Integer binNumber = rec.getIndexingBin();
- return (binNumber == null ? rec.computeIndexingBin() : binNumber);
-
- }
-
- @Override
- public Chunk getChunk() {
- final SAMFileSource source = rec.getFileSource();
- if (source == null) {
- throw new SAMException("No source (virtual file offsets); needed for indexing on BAM Record " + rec);
- }
- return ((BAMFileSpan) source.getFilePointer()).getSingleChunk();
- }
- });
-
- }
-
- /**
- * Creates the BAMIndexContent for this reference.
- * Requires all alignments of the reference have already been processed.
- *
- * @return Null if there are no features for this reference.
- */
- public BAMIndexContent processReference(final int reference) {
-
- if (reference != currentReference) {
- throw new SAMException("Unexpected reference " + reference + " when constructing index for " + currentReference);
- }
-
- final BinningIndexContent indexContent = binningIndexBuilder.generateIndexContent();
- if (indexContent == null) return null;
- return new BAMIndexContent(indexContent.getReferenceSequence(), indexContent.getBins(),
- indexStats, indexContent.getLinearIndex());
-
- }
-
- /**
- * @return the count of records with no coordinate positions
- */
- public long getNoCoordinateRecordCount() {
- return indexStats.getNoCoordinateRecordCount();
- }
-
- /**
- * reinitialize all data structures when the reference changes
- */
- void startNewReference() {
- ++currentReference;
- // I'm not crazy about recycling this object, but that is the way it was originally written and
- // it helps keep track of no-coordinate read count (which shouldn't be stored in this class anyway).
- indexStats.newReference();
- binningIndexBuilder = new BinningIndexBuilder(currentReference,
- sequenceDictionary.getSequence(currentReference).getSequenceLength());
- }
- }
-
- /**
- * Generates a BAM index file from an input BAM file
- *
- * @param reader SamReader for input BAM file
- * @param output File for output index file
- */
- public static void createIndex(SamReader reader, File output) {
- createIndex(reader, output, null);
- }
-
- /**
- * Generates a BAM index file from an input BAM file
- *
- * @param reader SamReader for input BAM file
- * @param output File for output index file
- */
- public static void createIndex(SamReader reader, File output, Log log) {
-
- BAMIndexer indexer = new BAMIndexer(output, reader.getFileHeader());
-
- long totalRecords = 0;
-
- // create and write the content
- for (SAMRecord rec : reader) {
- if (++totalRecords % 1000000 == 0) {
- if (null != log) log.info(totalRecords + " reads processed ...");
- }
- indexer.processAlignment(rec);
- }
- indexer.finish();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMIteratorFilter.java b/src/main/java/htsjdk/samtools/BAMIteratorFilter.java
deleted file mode 100644
index bc7d2c0..0000000
--- a/src/main/java/htsjdk/samtools/BAMIteratorFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools;
-
-
-/**
- * Interface implemented by filetering iterators used for BAM/CRAM readers.
- */
-interface BAMIteratorFilter {
- public enum IntervalComparison {
- BEFORE, AFTER, OVERLAPPING, CONTAINED
- }
-
- /**
- * Type returned by BAMIteratorFilter that tell iterators implementing this interface
- * how to handle each SAMRecord.
- */
- public enum FilteringIteratorState {
- MATCHES_FILTER, STOP_ITERATION, CONTINUE_ITERATION
- }
-
- /**
- * Determine if given record passes the filter, and if it does not, whether iteration
- * should continue or if this record is beyond the region(s) of interest.
- */
- FilteringIteratorState compareToFilter(final SAMRecord record);
-}
-
diff --git a/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java b/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java
deleted file mode 100644
index 8dadc69..0000000
--- a/src/main/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CoordMath;
-
-/**
- * Filters out records that do not match any of the given intervals and query type.
- */
-public class BAMQueryMultipleIntervalsIteratorFilter implements BAMIteratorFilter {
- final QueryInterval[] intervals;
- final boolean contained;
- int intervalIndex = 0;
-
-
- public BAMQueryMultipleIntervalsIteratorFilter(final QueryInterval[] intervals,
- final boolean contained) {
- this.contained = contained;
- this.intervals = intervals;
- }
-
- @Override
- public FilteringIteratorState compareToFilter(final SAMRecord record) {
- while (intervalIndex < intervals.length) {
- final IntervalComparison comparison = compareIntervalToRecord(intervals[intervalIndex], record);
- switch (comparison) {
- // Interval is before SAMRecord. Try next interval;
- case BEFORE: ++intervalIndex; break;
- // Interval is after SAMRecord. Keep scanning forward in SAMRecords
- case AFTER: return FilteringIteratorState.CONTINUE_ITERATION;
- // Found a good record
- case CONTAINED: return FilteringIteratorState.MATCHES_FILTER;
- // Either found a good record, or else keep scanning SAMRecords
- case OVERLAPPING: return
- (contained ? FilteringIteratorState.CONTINUE_ITERATION : FilteringIteratorState.MATCHES_FILTER);
- }
- }
- // Went past the last interval
- return FilteringIteratorState.STOP_ITERATION;
- }
-
- public static IntervalComparison compareIntervalToRecord(final QueryInterval interval, final SAMRecord record) {
- // interval.end <= 0 implies the end of the reference sequence.
- final int intervalEnd = (interval.end <= 0? Integer.MAX_VALUE: interval.end);
- final int alignmentEnd;
- if (record.getReadUnmappedFlag() && record.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
- // Unmapped read with coordinate of mate.
- alignmentEnd = record.getAlignmentStart();
- } else {
- alignmentEnd = record.getAlignmentEnd();
- }
-
- if (interval.referenceIndex < record.getReferenceIndex()) return IntervalComparison.BEFORE;
- else if (interval.referenceIndex > record.getReferenceIndex()) return IntervalComparison.AFTER;
- else if (intervalEnd < record.getAlignmentStart()) return IntervalComparison.BEFORE;
- else if (alignmentEnd < interval.start) return IntervalComparison.AFTER;
- else if (CoordMath.encloses(interval.start, intervalEnd, record.getAlignmentStart(), alignmentEnd)) {
- return IntervalComparison.CONTAINED;
- } else return IntervalComparison.OVERLAPPING;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMRecord.java b/src/main/java/htsjdk/samtools/BAMRecord.java
deleted file mode 100644
index c45566f..0000000
--- a/src/main/java/htsjdk/samtools/BAMRecord.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-
-/**
- * Wrapper class for binary BAM records.
- * Delays unpacking all data binary until requested.
- */
-public class BAMRecord extends SAMRecord {
- /**
- * Offset of the read name in the variable length section of the disk representation of BAMRecord
- */
- private static final int READ_NAME_OFFSET = 0;
-
- /**
- * Variable-length part of BAMRecord. Lazily decoded.
- */
- private byte[] mRestOfBinaryData = null;
-
- // Various lengths are stored, because they are in the fixed-length part of the BAMRecord, and it is
- // more efficient to remember them than decode the element they store the length of.
- // The length becomes invalid if the element is changed with a set() method.
- private int mReadLength = 0;
- private boolean mReadLengthValid = true;
- private final short mReadNameLength;
- private boolean mReadNameLengthValid = true;
- private final int mCigarLength;
- private boolean mCigarLengthValid = true;
-
- // Whether or not the getter needs to decode the corresponding element.
- // For all the other variable length elements, null == not yet decoded.
- private boolean mAttributesDecoded = false;
- private boolean mCigarDecoded = false;
-
- /**
- * If any of the properties set from mRestOfBinaryData have been overridden by calls to setters,
- * this is set to true, indicating that mRestOfBinaryData cannot be used to write this record to disk.
- */
- private boolean mBinaryDataStale;
-
- /**
- * Create a new BAM Record. If the reference sequence index or mate reference sequence index are any value other
- * than NO_ALIGNMENT_REFERENCE_INDEX (-1), then the specified index values must exist in the sequence dictionary
- * in the header argument.
- */
- protected BAMRecord(final SAMFileHeader header,
- final int referenceID,
- final int coordinate,
- final short readNameLength,
- final short mappingQuality,
- final int indexingBin,
- final int cigarLen,
- final int flags,
- final int readLen,
- final int mateReferenceID,
- final int mateCoordinate,
- final int insertSize,
- final byte[] restOfData) {
- super(header);
- setReferenceIndex(referenceID);
- setAlignmentStart(coordinate);
- mReadNameLength = readNameLength;
- setMappingQuality(mappingQuality);
- mCigarLength = cigarLen;
- setFlags(flags);
- mReadLength = readLen;
- setMateReferenceIndex(mateReferenceID);
- setMateAlignmentStart(mateCoordinate);
- setInferredInsertSize(insertSize);
- mRestOfBinaryData = restOfData;
-
- // Set these to null in order to mark them as being candidates for lazy initialization.
- // If this is not done, they will have non-null defaults.
- super.setReadName(null);
- super.setCigarString(null);
- super.setReadBases(null);
- super.setBaseQualities(null);
-
- // Do this after the above because setCigarString will clear it.
- setIndexingBin(indexingBin);
-
- // Mark the binary block as being valid for writing back out to disk
- mBinaryDataStale = false;
- }
-
- /**
- * Force all the lazily-initialized attributes to be decoded.
- */
- protected void eagerDecode() {
- getReadName();
- getCigar();
- getReadBases();
- getBaseQualities();
- getBinaryAttributes();
- super.eagerDecode();
- mRestOfBinaryData = null;
- }
-
- /**
- * If this record has a valid binary representation of the variable-length portion of a binary record stored,
- * return that byte array, otherwise return null. This will never be true for SAMRecords. It will be true
- * for BAMRecords that have not been eagerDecoded(), and for which none of the data in the variable-length
- * portion has been changed.
- */
- @Override
- public byte[] getVariableBinaryRepresentation() {
- if (mBinaryDataStale) {
- return null;
- }
- // This may have been set to null by eagerDecode()
- return mRestOfBinaryData;
- }
-
- /**
- * Depending on the concrete implementation, the binary file size of attributes may be known without
- * computing them all.
- *
- * @return binary file size of attribute, if known, else -1.
- */
- @Override
- public int getAttributesBinarySize() {
- if (mBinaryDataStale || mRestOfBinaryData == null) {
- return -1;
- }
- final int tagsOffset = readNameSize() + cigarSize() + basesSize() + qualsSize();
- return mRestOfBinaryData.length - tagsOffset;
- }
-
- @Override
- public void setReadName(final String value) {
- super.setReadName(value);
- mBinaryDataStale = true;
- mReadNameLengthValid = false;
- }
-
- @Override
- public void setCigar(final Cigar cigar) {
- super.setCigar(cigar);
- mBinaryDataStale = true;
- mCigarLengthValid = false;
- mCigarDecoded = true;
- }
-
- @Override
- public void setCigarString(final String value) {
- super.setCigarString(value);
- mBinaryDataStale = true;
- mCigarLengthValid = false;
- mCigarDecoded = true;
- }
-
- @Override
- public void setReadBases(final byte[] value) {
- super.setReadBases(value);
- mBinaryDataStale = true;
- mReadLengthValid = false;
- }
-
- @Override
- public void setBaseQualities(final byte[] value) {
- super.setBaseQualities(value);
- mBinaryDataStale = true;
- }
-
- @Override
- protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
- // populate all the attributes from the binary block before overwriting one
- getBinaryAttributes();
- super.setAttribute(tag, value, isUnsignedArray);
- mBinaryDataStale = true;
- }
-
- /**
- * Removes all attributes.
- */
- @Override
- public void clearAttributes() {
- mAttributesDecoded = true;
- mBinaryDataStale = true;
- super.clearAttributes();
- }
-
- /**
- * Avoids decoding binary block to get read length.
- */
- @Override
- public int getReadLength() {
- if (mReadLengthValid) {
- return mReadLength;
- }
- return super.getReadLength();
- }
-
- @Override
- public String getReadName() {
- String result = super.getReadName();
- if (mRestOfBinaryData != null && result == null) {
- result = decodeReadName();
- super.setReadName(result);
- }
- return result;
- }
-
- /**
- * Avoids decoding read name to get read name length. Do not include null terminator.
- */
- @Override
- public int getReadNameLength() {
- if (mReadNameLengthValid) {
- return mReadNameLength - 1;
- }
- return super.getReadNameLength();
- }
-
- @Override
- public Cigar getCigar() {
- if (mRestOfBinaryData != null && !mCigarDecoded) {
- final int cigarOffset = readNameSize();
- final ByteBuffer byteBuffer = ByteBuffer.wrap(mRestOfBinaryData, cigarOffset, cigarSize());
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- super.initializeCigar(BinaryCigarCodec.decode(byteBuffer));
- mCigarDecoded = true;
- if (null != getHeader() && getValidationStringency() != ValidationStringency.SILENT && !this.getReadUnmappedFlag()) {
- // Don't know line number, and don't want to force read name to be decoded.
- SAMUtils.processValidationErrors(validateCigar(-1L), -1, getValidationStringency());
- }
- }
- return super.getCigar();
- }
-
- /**
- * Avoids decoding CIGAR in order to get length.
- */
- @Override
- public int getCigarLength() {
- if (mCigarLengthValid) {
- return mCigarLength;
- } else {
- return super.getCigarLength();
- }
- }
-
- @Override
- public byte[] getReadBases() {
- byte[] result = super.getReadBases();
- if (mRestOfBinaryData != null && result == null) {
- result = decodeReadBases();
- super.setReadBases(result);
- }
- return result;
- }
-
- @Override
- public byte[] getBaseQualities() {
- byte[] ret = super.getBaseQualities();
- if (mRestOfBinaryData != null && ret == null) {
- ret = decodeBaseQualities();
- super.setBaseQualities(ret);
- }
- return ret;
- }
-
- @Override
- public Object getAttribute(final short tag) {
- if (!mAttributesDecoded) {
- decodeAttributes();
- }
- return super.getAttribute(tag);
- }
-
- @Override
- protected SAMBinaryTagAndValue getBinaryAttributes() {
- if (!mAttributesDecoded) {
- decodeAttributes();
- }
- return super.getBinaryAttributes();
- }
-
- private void decodeAttributes() {
- if (mAttributesDecoded) {
- return;
- }
- mAttributesDecoded = true;
- final int tagsOffset = readNameSize() + cigarSize() + basesSize() + qualsSize();
- final int tagsSize = mRestOfBinaryData.length - tagsOffset;
- final SAMBinaryTagAndValue attributes = BinaryTagCodec.readTags(mRestOfBinaryData, tagsOffset, tagsSize, getValidationStringency());
- setAttributes(attributes);
- }
-
- private byte[] decodeBaseQualities() {
- if (mReadLength == 0) {
- return SAMRecord.NULL_QUALS;
- }
- final int qualsOffset = readNameSize() + cigarSize() + basesSize();
- final byte[] ret = new byte[qualsSize()];
- System.arraycopy(mRestOfBinaryData, qualsOffset, ret, 0, qualsSize());
- if (ret.length > 0 && ret[0] == (byte) 0xFF) {
- // BAM files store missing qualities as an array of 0xFF bytes.
- // 0xFF is an illegal quality score value (it cannot be encoded in SAM)
- // and so the first byte is a suitable marker.
- // We hide this quirk of the BAM encoding so that the BAM interface looks the same as SAM.
- return NULL_QUALS;
- }
- return ret;
- }
-
- private String decodeReadName() {
- // Don't include terminating null
- return StringUtil.bytesToString(mRestOfBinaryData, READ_NAME_OFFSET, mReadNameLength-1);
- }
-
- private byte[] decodeReadBases() {
- if (mReadLength == 0) {
- return NULL_SEQUENCE;
- }
- final int basesOffset = readNameSize() + cigarSize();
- return SAMUtils.compressedBasesToBytes(mReadLength, mRestOfBinaryData, basesOffset);
- }
-
- /* methods for computing disk size of variably-sized elements, in order to locate
- * elements in mRestOfBinaryData */
-
- private int readNameSize() {
- return mReadNameLength;
- }
-
- private int cigarSize() {
- return mCigarLength * 4;
- }
-
- private int basesSize() {
- return (mReadLength + 1)/2;
- }
-
- private int qualsSize() {
- return mReadLength;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BAMRecordCodec.java b/src/main/java/htsjdk/samtools/BAMRecordCodec.java
deleted file mode 100644
index dc1ca81..0000000
--- a/src/main/java/htsjdk/samtools/BAMRecordCodec.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.RuntimeEOFException;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Class for translating between in-memory and disk representation of BAMRecord.
- */
-public class BAMRecordCodec implements SortingCollection.Codec<SAMRecord> {
- private final SAMFileHeader header;
- private final BinaryCodec binaryCodec = new BinaryCodec();
- private final BinaryTagCodec binaryTagCodec = new BinaryTagCodec(binaryCodec);
- private final SAMRecordFactory samRecordFactory;
-
- public BAMRecordCodec(final SAMFileHeader header) {
- this(header, new DefaultSAMRecordFactory());
- }
-
- public BAMRecordCodec(final SAMFileHeader header, final SAMRecordFactory factory) {
- this.header = header;
- this.samRecordFactory = factory;
- }
-
- public BAMRecordCodec clone() {
- // Do not clone the references to codecs, as they must be distinct for each instance.
- return new BAMRecordCodec(this.header, this.samRecordFactory);
- }
-
-
- /** Sets the output stream that records will be written to. */
- public void setOutputStream(final OutputStream os) {
- this.binaryCodec.setOutputStream(os);
- }
-
- /** Sets the output stream that records will be written to. */
- public void setOutputStream(final OutputStream os, final String filename) {
- this.binaryCodec.setOutputStream(os);
- this.binaryCodec.setOutputFileName(filename);
- }
-
- /** Sets the input stream that records will be read from. */
- public void setInputStream(final InputStream is) {
- this.binaryCodec.setInputStream(is);
- }
-
- /** Sets the input stream that records will be read from. */
- public void setInputStream(final InputStream is, final String filename) {
- this.binaryCodec.setInputStream(is);
- this.binaryCodec.setInputFileName(filename);
- }
-
- /**
- * Write object to OutputStream.
- * Reference and mate reference indices must be resolvable, which either means that these have been set into the
- * SAMRecord directly, or the SAMRecord must have a header assigned into it so that reference names can be
- * resolved into indices.
- *
- * @param alignment Record to be written.
- */
- public void encode(final SAMRecord alignment) {
- // Compute block size, as it is the first element of the file representation of SAMRecord
- final int readLength = alignment.getReadLength();
-
- final int cigarLength = alignment.getCigarLength();
-
- int blockSize = BAMFileConstants.FIXED_BLOCK_SIZE + alignment.getReadNameLength() + 1 + // null terminated
- cigarLength * 4 +
- (readLength + 1) / 2 + // 2 bases per byte, round up
- readLength;
-
- final int attributesSize = alignment.getAttributesBinarySize();
- if (attributesSize != -1) {
- // binary attribute size already known, don't need to compute.
- blockSize += attributesSize;
- } else {
- SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
- while (attribute != null) {
- blockSize += (BinaryTagCodec.getTagSize(attribute.value));
- attribute = attribute.getNext();
- }
- }
-
- int indexBin = 0;
- if (alignment.getReferenceIndex() >= 0) {
- if (alignment.getIndexingBin() != null) {
- indexBin = alignment.getIndexingBin();
- } else {
- indexBin = alignment.computeIndexingBin();
- }
- }
-
- // Blurt out the elements
- this.binaryCodec.writeInt(blockSize);
- this.binaryCodec.writeInt(alignment.getReferenceIndex());
- // 0-based!!
- this.binaryCodec.writeInt(alignment.getAlignmentStart() - 1);
- this.binaryCodec.writeUByte((short)(alignment.getReadNameLength() + 1));
- this.binaryCodec.writeUByte((short)alignment.getMappingQuality());
- this.binaryCodec.writeUShort(indexBin);
- this.binaryCodec.writeUShort(cigarLength);
- this.binaryCodec.writeUShort(alignment.getFlags());
- this.binaryCodec.writeInt(alignment.getReadLength());
- this.binaryCodec.writeInt(alignment.getMateReferenceIndex());
- this.binaryCodec.writeInt(alignment.getMateAlignmentStart() - 1);
- this.binaryCodec.writeInt(alignment.getInferredInsertSize());
- final byte[] variableLengthBinaryBlock = alignment.getVariableBinaryRepresentation();
- if (variableLengthBinaryBlock != null) {
- // Don't need to encode variable-length block, because it is unchanged from
- // when the record was read from a BAM file.
- this.binaryCodec.writeBytes(variableLengthBinaryBlock);
- } else {
- if (alignment.getReadLength() != alignment.getBaseQualities().length &&
- alignment.getBaseQualities().length != 0) {
- throw new RuntimeException("Mismatch between read length and quals length writing read " +
- alignment.getReadName() + "; read length: " + alignment.getReadLength() +
- "; quals length: " + alignment.getBaseQualities().length);
- }
- this.binaryCodec.writeString(alignment.getReadName(), false, true);
- final int[] binaryCigar = BinaryCigarCodec.encode(alignment.getCigar());
- for (final int cigarElement : binaryCigar) {
- // Assumption that this will fit into an integer, despite the fact
- // that it is specced as a uint.
- this.binaryCodec.writeInt(cigarElement);
- }
- this.binaryCodec.writeBytes(SAMUtils.bytesToCompressedBases(alignment.getReadBases()));
- byte[] qualities = alignment.getBaseQualities();
- if (qualities.length == 0) {
- qualities = new byte[alignment.getReadLength()];
- Arrays.fill(qualities, (byte) 0xFF);
- }
- this.binaryCodec.writeBytes(qualities);
- SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
- while (attribute != null) {
- this.binaryTagCodec.writeTag(attribute.tag, attribute.value, attribute.isUnsignedArray());
- attribute = attribute.getNext();
- }
- }
- }
-
- /**
- * Read the next record from the input stream and convert into a java object.
- *
- * @return null if no more records. Should throw exception if EOF is encountered in the middle of
- * a record.
- */
- public SAMRecord decode() {
- int recordLength = 0;
- try {
- recordLength = this.binaryCodec.readInt();
- }
- catch (RuntimeEOFException e) {
- return null;
- }
-
- if (recordLength < BAMFileConstants.FIXED_BLOCK_SIZE) {
- throw new SAMFormatException("Invalid record length: " + recordLength);
- }
-
- final int referenceID = this.binaryCodec.readInt();
- final int coordinate = this.binaryCodec.readInt() + 1;
- final short readNameLength = this.binaryCodec.readUByte();
- final short mappingQuality = this.binaryCodec.readUByte();
- final int bin = this.binaryCodec.readUShort();
- final int cigarLen = this.binaryCodec.readUShort();
- final int flags = this.binaryCodec.readUShort();
- final int readLen = this.binaryCodec.readInt();
- final int mateReferenceID = this.binaryCodec.readInt();
- final int mateCoordinate = this.binaryCodec.readInt() + 1;
- final int insertSize = this.binaryCodec.readInt();
- final byte[] restOfRecord = new byte[recordLength - BAMFileConstants.FIXED_BLOCK_SIZE];
- this.binaryCodec.readBytes(restOfRecord);
- final BAMRecord ret = this.samRecordFactory.createBAMRecord(
- header, referenceID, coordinate, readNameLength, mappingQuality,
- bin, cigarLen, flags, readLen, mateReferenceID, mateCoordinate, insertSize, restOfRecord);
-
- if (null != header) {
- // don't reset a null header as this will clobber the reference and mate reference indices
- ret.setHeader(header);
- }
- return ret;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BamFileIoUtils.java b/src/main/java/htsjdk/samtools/BamFileIoUtils.java
deleted file mode 100644
index b5c587a..0000000
--- a/src/main/java/htsjdk/samtools/BamFileIoUtils.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-public class BamFileIoUtils {
- private static final Log LOG = Log.getInstance(BamFileIoUtils.class);
-
- public static final String BAM_FILE_EXTENSION = ".bam";
-
- public static boolean isBamFile(final File file) {
- return ((file != null) && file.getName().endsWith(BAM_FILE_EXTENSION));
- }
-
- public static void reheaderBamFile(final SAMFileHeader samFileHeader, final File inputFile, final File outputFile) {
- reheaderBamFile(samFileHeader, inputFile, outputFile, true, true);
- }
-
- /**
- * Copy a BAM file but replacing the header
- *
- * @param samFileHeader The header to use in the new file
- * @param inputFile The BAM file to copy, sans header
- * @param outputFile The new BAM file, constructed with the new header and the content from inputFile
- * @param createMd5 Whether or not to create an MD5 file for the new BAM
- * @param createIndex Whether or not to create an index file for the new BAM
- */
- public static void reheaderBamFile(final SAMFileHeader samFileHeader, final File inputFile, final File outputFile, final boolean createMd5, final boolean createIndex) {
- IOUtil.assertFileIsReadable(inputFile);
- IOUtil.assertFileIsWritable(outputFile);
-
- try {
- BlockCompressedInputStream.assertNonDefectiveFile(inputFile);
- assertSortOrdersAreEqual(samFileHeader, inputFile);
-
- final OutputStream outputStream = buildOutputStream(outputFile, createMd5, createIndex);
-
- BAMFileWriter.writeHeader(outputStream, samFileHeader);
- blockCopyBamFile(inputFile, outputStream, true, false);
-
- CloserUtil.close(inputFile);
- outputStream.close();
- } catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-
- /**
- * Copy data from a BAM file to an OutputStream by directly copying the gzip blocks
- *
- * @param inputFile The file to be copied
- * @param outputStream The stream to write the copied data to
- * @param skipHeader If true, the header of the input file will not be copied to the output stream
- * @param skipTerminator If true, the terminator block of the input file will not be written to the output stream
- */
- public static void blockCopyBamFile(final File inputFile, final OutputStream outputStream, final boolean skipHeader, final boolean skipTerminator) {
- FileInputStream in = null;
- try {
- in = new FileInputStream(inputFile);
-
- // a) It's good to check that the end of the file is valid and b) we need to know if there's a terminator block and not copy it if skipTerminator is true
- final BlockCompressedInputStream.FileTermination term = BlockCompressedInputStream.checkTermination(inputFile);
- if (term == BlockCompressedInputStream.FileTermination.DEFECTIVE)
- throw new SAMException(inputFile.getAbsolutePath() + " does not have a valid GZIP block at the end of the file.");
-
- if (skipHeader) {
- final long vOffsetOfFirstRecord = SAMUtils.findVirtualOffsetOfFirstRecordInBam(inputFile);
- final BlockCompressedInputStream blockIn = new BlockCompressedInputStream(inputFile);
- blockIn.seek(vOffsetOfFirstRecord);
- final long remainingInBlock = blockIn.available();
-
- // If we found the end of the header then write the remainder of this block out as a
- // new gzip block and then break out of the while loop
- if (remainingInBlock >= 0) {
- final BlockCompressedOutputStream blockOut = new BlockCompressedOutputStream(outputStream, null);
- IOUtil.transferByStream(blockIn, blockOut, remainingInBlock);
- blockOut.flush();
- // Don't close blockOut because closing underlying stream would break everything
- }
-
- long pos = BlockCompressedFilePointerUtil.getBlockAddress(blockIn.getFilePointer());
- blockIn.close();
- while (pos > 0) {
- pos -= in.skip(pos);
- }
- }
-
- // Copy remainder of input stream into output stream
- final long currentPos = in.getChannel().position();
- final long length = inputFile.length();
- final long skipLast = ((term == BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK) && skipTerminator) ?
- BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length : 0;
- final long bytesToWrite = length - skipLast - currentPos;
-
- IOUtil.transferByStream(in, outputStream, bytesToWrite);
- } catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- } finally {
- CloserUtil.close(in);
- }
- }
-
- /**
- * Assumes that all inputs and outputs are block compressed VCF files and copies them without decompressing and parsing
- * most of the gzip blocks. Will decompress and parse blocks up to the one containing the end of the header in each file
- * (often the first block) and re-compress any data remaining in that block into a new block in the output file. Subsequent
- * blocks (excluding a terminator block if present) are copied directly from input to output.
- */
- public static void gatherWithBlockCopying(final List<File> bams, final File output, final boolean createIndex, final boolean createMd5) {
- try {
- OutputStream out = new FileOutputStream(output);
- if (createMd5) out = new Md5CalculatingOutputStream(out, new File(output.getAbsolutePath() + ".md5"));
- File indexFile = null;
- if (createIndex) {
- indexFile = new File(output.getParentFile(), IOUtil.basename(output) + BAMIndex.BAMIndexSuffix);
- out = new StreamInflatingIndexingOutputStream(out, indexFile);
- }
-
- boolean isFirstFile = true;
-
- for (final File f : bams) {
- LOG.info(String.format("Block copying %s ...", f.getAbsolutePath()));
- blockCopyBamFile(f, out, !isFirstFile, true);
- isFirstFile = false;
- }
-
- // And lastly add the Terminator block and close up
- out.write(BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK);
- out.close();
-
- // It is possible that the modified time on the index file is ever so slightly older than the original BAM file
- // and this makes ValidateSamFile unhappy.
- if (createIndex && (output.lastModified() > indexFile.lastModified())) {
- final boolean success = indexFile.setLastModified(System.currentTimeMillis());
- if (!success) {
- System.err.print(String.format("Index file is older than BAM file for %s and unable to resolve this", output.getAbsolutePath()));
- }
- }
- } catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-
- private static OutputStream buildOutputStream(final File outputFile, final boolean createMd5, final boolean createIndex) throws IOException {
- OutputStream outputStream = new FileOutputStream(outputFile);
- if (createMd5) {
- outputStream = new Md5CalculatingOutputStream(outputStream, new File(outputFile.getAbsolutePath() + ".md5"));
- }
- if (createIndex) {
- outputStream = new StreamInflatingIndexingOutputStream(outputStream, new File(outputFile.getParentFile(), IOUtil.basename(outputFile) + BAMIndex.BAMIndexSuffix));
- }
- return outputStream;
- }
-
- private static void assertSortOrdersAreEqual(final SAMFileHeader newHeader, final File inputFile) throws IOException {
- final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
- final SAMFileHeader origHeader = reader.getFileHeader();
- final SAMFileHeader.SortOrder newSortOrder = newHeader.getSortOrder();
- if (newSortOrder != SAMFileHeader.SortOrder.unsorted && newSortOrder != origHeader.getSortOrder()) {
- throw new SAMException("Sort order of new header does not match the original file, needs to be " + origHeader.getSortOrder());
- }
- reader.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BamIndexValidator.java b/src/main/java/htsjdk/samtools/BamIndexValidator.java
deleted file mode 100644
index fb1c8d8..0000000
--- a/src/main/java/htsjdk/samtools/BamIndexValidator.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Class to validate (at two different levels of thoroughness) the index for a BAM file.
- *
- * This class is [<em>not</em>] thread safe [because it is immutable].
- */
-public class BamIndexValidator {
-
- public enum IndexValidationStringency {
- EXHAUSTIVE, LESS_EXHAUSTIVE, NONE
- }
-
- public static int exhaustivelyTestIndex(final SamReader reader) { // throws Exception {
- // look at all chunk offsets in a linear index to make sure they are valid
-
- if (reader.indexing().hasBrowseableIndex()) {
-
- // content is from an existing bai file
- final CachingBAMFileIndex existingIndex = (CachingBAMFileIndex) reader.indexing().getBrowseableIndex(); // new CachingBAMFileIndex(inputBai, null);
- final int numRefs = existingIndex.getNumberOfReferences();
-
- int chunkCount = 0;
- int indexCount = 0;
- for (int i = 0; i < numRefs; i++) {
- final BAMIndexContent content = existingIndex.getQueryResults(i);
- for (final Chunk c : content.getAllChunks()) {
- final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(c));
- chunkCount++;
- SAMRecord sam = null;
- try {
- sam = iter.next();
- iter.close();
- } catch (final Exception e) {
- throw new SAMException("Exception in BamIndexValidator. Last good record " + sam + " in chunk " + c + " chunkCount=" + chunkCount, e);
- }
- }
- // also seek to every position in the linear index
- // final BAMRecordCodec bamRecordCodec = new BAMRecordCodec(reader.getFileHeader());
- // bamRecordCodec.setInputStream(reader.getInputStream());
-
- final LinearIndex linearIndex = content.getLinearIndex();
- for (final long l : linearIndex.getIndexEntries()) {
- try {
- if (l != 0) {
- final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(new Chunk(l, l + 1)));
- final SAMRecord sam = iter.next(); // read the first record identified by the linear index
- indexCount++;
- iter.close();
- }
- } catch (final Exception e) {
- throw new SAMException("Exception in BamIndexValidator. Linear index access failure " + l + " indexCount=" + indexCount, e);
- }
-
- }
- }
- return chunkCount;
- // System.out.println("Found " chunkCount + " chunks in test " + inputBai +
- // " linearIndex positions = " + indexCount);
- } // else not a bam file with a browseable index
- // System.err.println("No browseableIndex for reader");
- return 0;
- }
-
- /**
- * A less time-consuming index validation that only looks at the first and last references in the index
- * and the first and last chunks in each of those
- *
- * @param reader
- * @return # of chunks examined, or 0 if there is no browseable index for the reader
- */
- public static int lessExhaustivelyTestIndex(final SamReader reader) {
- // look at all chunk offsets in a linear index to make sure they are valid
- if (reader.indexing().hasBrowseableIndex()) {
-
- // content is from an existing bai file
- final CachingBAMFileIndex existingIndex = (CachingBAMFileIndex) reader.indexing().getBrowseableIndex();
- final int numRefs = existingIndex.getNumberOfReferences();
-
- int chunkCount = 0;
- int indexCount = 0;
- for (int i = 0; i < numRefs; i++) {
-
- final BAMIndexContent content = existingIndex.getQueryResults(i);
-
- final List<Chunk> chunks = content.getAllChunks();
- final int numChunks = chunks.size();
- // We are looking only at the first and last chunks
- for (final int chunkNo : Arrays.asList(0, numChunks - 1)) {
- chunkCount++;
-
- final Chunk c = chunks.get(chunkNo);
- final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(c));
- try {
- final SAMRecord sam = iter.next();
- iter.close();
- } catch (final Exception e) {
- throw new SAMException("Exception querying chunk " + chunkNo + " from reference index " + i, e);
- }
- }
-
- // also seek to first and last position in the linear index
- final long linearIndexEntries[] = content.getLinearIndex().getIndexEntries();
- for (final int binNo : Arrays.asList(0, linearIndexEntries.length - 1)) {
- indexCount++;
- final long l = linearIndexEntries[binNo];
- try {
- if (l != 0) {
- final CloseableIterator<SAMRecord> iter = ((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader).iterator(new BAMFileSpan(new Chunk(l, l + 1)));
- final SAMRecord sam = iter.next(); // read the first record identified by the linear index
- iter.close();
- }
- } catch (final Exception e) {
- throw new SAMException("Exception in BamIndexValidator. Linear index access failure " + l + " indexCount=" + indexCount, e);
- }
- }
- }
- return chunkCount;
- }
- // else it's not a bam file with a browseable index
- return 0;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/Bin.java b/src/main/java/htsjdk/samtools/Bin.java
deleted file mode 100644
index 1ac5724..0000000
--- a/src/main/java/htsjdk/samtools/Bin.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An individual bin in a BAM file.
- *
- * @author mhanna
- * @version 0.1
- */
-public class Bin implements Comparable<Bin> {
- /**
- * The reference sequence associated with this bin.
- */
- private final int referenceSequence;
-
- /**
- * The number of this bin within the BAM file.
- */
- private final int binNumber;
-
- /**
- * The chunks associated with this bin.
- */
- private List<Chunk> chunkList;
-
- /**
- * The last chunk in the chunkList. Only maintained during index building,
- * not when reading existing index
- */
- private Chunk lastChunk;
-
- public Bin(final int referenceSequence, final int binNumber) {
- this.referenceSequence = referenceSequence;
- this.binNumber = binNumber;
- }
-
- protected int getReferenceSequence() {
- return referenceSequence;
- }
-
- public int getBinNumber() {
- return binNumber;
- }
-
- /**
- * See whether two bins are equal. If the ref seq and the bin number
- * are equal, assume equality of the chunk list.
- * @param other The other Bin to which to compare this.
- * @return True if the two bins are equal. False otherwise.
- */
- @Override
- public boolean equals(final Object other) {
- if(other == null) return false;
- if(!(other instanceof Bin)) return false;
-
- final Bin otherBin = (Bin)other;
- return this.referenceSequence == otherBin.referenceSequence && this.binNumber == otherBin.binNumber;
- }
-
- /**
- * Compute a unique hash code for the given reference sequence and bin number.
- * @return A unique hash code.
- */
- @Override
- public int hashCode() {
- return ((Integer)referenceSequence).hashCode() ^ ((Integer)binNumber).hashCode();
- }
-
- /**
- * Returns whether the bin currently contains chunks.
- * @return True if the bin has chunks, false otherwise.
- */
- public boolean containsChunks() {
- return chunkList != null;
- }
-
- /**
- * Compare two bins to see what ordering they should appear in.
- * @param other Other bin to which this bin should be compared.
- * @return -1 if this < other, 0 if this == other, 1 if this > other.
- */
- public int compareTo(final Bin other) {
- if(other == null)
- throw new ClassCastException("Cannot compare to a null object");
-
- // Check the reference sequences first.
- if(this.referenceSequence != other.referenceSequence)
- return referenceSequence - other.referenceSequence;
-
- // Then check the bin ordering.
- return binNumber - other.binNumber;
- }
-
- /**
- * Adds the first chunk to the bin
- */
- public void addInitialChunk(final Chunk newChunk){
- final List<Chunk> oldChunks = new ArrayList<Chunk>();
- setChunkList(oldChunks);
- setLastChunk(newChunk);
- oldChunks.add(newChunk);
- }
-
- /**
- * Sets the chunks associated with this bin
- */
- public void setChunkList(final List<Chunk> list){
- chunkList = list;
- }
-
- /**
- * Gets the list of chunks associated with this bin.
- * @return the chunks in this bin. If no chunks are associated, an empty list will be returned.
- */
- public List<Chunk> getChunkList(){
- if(chunkList == null)
- return Collections.<Chunk>emptyList();
- return chunkList;
- }
-
- /**
- * Optimization to keep lastChunk instead of iterating over all chunks repeatedly
- */
- public void setLastChunk(final Chunk c){
- lastChunk = c;
- }
-
- /**
- * Warning: Currently only valid during index building, not when reading existing index,
- * (AbstractBAMFileIndex.optimizeChunkList doesn't maintain this)
- * @return the last Chunk of the chunkList
- */
- public Chunk getLastChunk(){
- return lastChunk;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BinList.java b/src/main/java/htsjdk/samtools/BinList.java
deleted file mode 100644
index e7107d4..0000000
--- a/src/main/java/htsjdk/samtools/BinList.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.BitSet;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Provides a list of all bins which could exist in the BAM file.
- * Allows the user to iterate over all bins, selecting ones of interest
- * for later inspection.
- *
- * @author mhanna
- * @version 0.1
- */
-public class BinList implements Iterable<Bin> {
- /**
- * The reference sequence relevant to this bin list.
- */
- private final int referenceSequence;
-
- /**
- * For each sequence, which bins should be included in the BitSet.
- */
- private final BitSet bins;
-
- /**
- * Create a new BinList over sequenceCount sequences, consisting of the given bins.
- * @param referenceSequence Reference sequence to which these bins are relevant.
- * @param bins The given bins to include.
- */
- protected BinList(final int referenceSequence, final BitSet bins) {
- this.referenceSequence = referenceSequence;
- this.bins = bins;
- }
-
- /**
- * Gets an iterator over all selected bins.
- * @return An iterator over all selected bins.
- */
- public Iterator<Bin> iterator() {
- return new BinIterator();
- }
-
- /**
- * Get the reference sequence to which this bin belongs.
- * @return Integer representing the reference sequence.
- */
- protected int getReferenceSequence() {
- return referenceSequence;
- }
-
- /**
- * Retrieves the bins stored in this list.
- * @return A bitset where a bin is present in the list if the bit is true.
- */
- protected BitSet getBins() {
- return bins;
- }
-
- private class BinIterator implements Iterator<Bin> {
- /**
- * Stores the bin currently in use. Will be -1 if no more bins remain in the set.
- */
- private int nextBin;
-
- public BinIterator() {
- // Initialize the bin iterator to just before the first bin.
- nextBin = bins.nextSetBit(0);
- }
-
- /**
- * Are there more bins in this set, waiting to be returned?
- * @return True if more bins are remaining.
- */
- public boolean hasNext() {
- return nextBin >= 0;
- }
-
- /**
- * Gets the next bin in the provided BinList.
- * @return the next available bin in the BinList.
- */
- public Bin next() {
- if(!hasNext())
- throw new NoSuchElementException("This BinIterator is currently empty");
- int currentBin = nextBin;
- nextBin = bins.nextSetBit(nextBin+1);
- return new Bin(referenceSequence,currentBin);
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Unable to remove from a bin iterator");
- }
- }
-}
-
diff --git a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java b/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java
deleted file mode 100644
index 35a22f7..0000000
--- a/src/main/java/htsjdk/samtools/BinaryBAMIndexWriter.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * Class for writing binary BAM index files
- */
-class BinaryBAMIndexWriter implements BAMIndexWriter {
-
- protected final int nRef;
- private final BinaryCodec codec;
- private int count = 0;
-
- /**
- * constructor
- *
- * @param nRef Number of reference sequences
- * @param output BAM Index output file
- */
- public BinaryBAMIndexWriter(final int nRef, final File output) {
-
- this.nRef = nRef;
-
- try {
- codec = new BinaryCodec(output, true);
- writeHeader();
- } catch (final Exception e) {
- throw new SAMException("Exception opening output file " + output, e);
- }
- }
-
- /**
- *
- * @param nRef Number of reference sequences.
- * @param output BAM index output stream. This stream will be closed when BinaryBAMIndexWriter.close() is called.
- */
- public BinaryBAMIndexWriter(final int nRef, final OutputStream output) {
-
- this.nRef = nRef;
-
- try {
- codec = new BinaryCodec(output);
- writeHeader();
- } catch (final Exception e) {
- throw new SAMException("Exception opening output stream", e);
- }
- }
-
- /**
- * Write this content as binary output
- */
- public void writeReference(final BAMIndexContent content) {
-
- if (content == null) {
- writeNullContent();
- count++;
- return;
- }
-
- if (content.getReferenceSequence() != count){
- throw new SAMException("Unexpectedly writing reference " + content.getReferenceSequence() +
- ", expecting reference " + count);
- }
- count ++;
-
- // write bins
-
- final BAMIndexContent.BinList bins = content.getBins();
- final int size = bins == null ? 0 : content.getNumberOfNonNullBins();
-
- if (size == 0) {
- writeNullContent();
- return;
- }
-
- //final List<Chunk> chunks = content.getMetaData() == null ? null
- // : content.getMetaData().getMetaDataChunks();
- final BAMIndexMetaData metaData = content.getMetaData();
-
- codec.writeInt(size + ((metaData != null)? 1 : 0 ));
- // codec.writeInt(size);
- for (final Bin bin : bins) { // note, bins will always be sorted
- if (bin.getBinNumber() == GenomicIndexUtil.MAX_BINS)
- continue;
- writeBin(bin);
- }
-
- // write metadata "bin" and chunks
- if (metaData != null)
- writeChunkMetaData(metaData);
-
- // write linear index
-
- final LinearIndex linearIndex = content.getLinearIndex();
- final long[] entries = linearIndex == null ? null : linearIndex.getIndexEntries();
- final int indexStart = linearIndex == null ? 0 : linearIndex.getIndexStart();
- final int n_intv = entries == null ? indexStart : entries.length + indexStart;
- codec.writeInt(n_intv);
- if (entries == null) {
- return;
- }
- // since indexStart is usually 0, this is usually a no-op
- for (int i = 0; i < indexStart; i++) {
- codec.writeLong(0);
- }
- for (int k = 0; k < entries.length; k++) {
- codec.writeLong(entries[k]);
- }
- try {
- codec.getOutputStream().flush();
- } catch (final IOException e) {
- throw new SAMException("IOException in BinaryBAMIndexWriter reference " + content.getReferenceSequence(), e);
- }
- }
-
- /**
- * Writes out the count of records without coordinates
- *
- * @param count
- */
- public void writeNoCoordinateRecordCount(final Long count) {
- codec.writeLong(count == null ? 0 : count);
- }
-
- /**
- * Any necessary processing at the end of the file
- */
- public void close() {
- codec.close();
- }
-
- private void writeBin(final Bin bin) {
- final int binNumber = bin.getBinNumber();
- if (binNumber >= GenomicIndexUtil.MAX_BINS){
- throw new SAMException("Unexpected bin number when writing bam index " + binNumber);
- }
-
- codec.writeInt(binNumber);
- if (bin.getChunkList() == null){
- codec.writeInt(0);
- return;
- }
- final List<Chunk> chunkList = bin.getChunkList();
- final int n_chunk = chunkList.size();
- codec.writeInt(n_chunk);
- for (final Chunk c : chunkList) {
- codec.writeLong(c.getChunkStart());
- codec.writeLong(c.getChunkEnd());
- }
- }
-
- /**
- * Write the meta data represented by the chunkLists associated with bin MAX_BINS 37450
- *
- * @param metaData information describing numAligned records, numUnAligned, etc
- */
- private void writeChunkMetaData(final BAMIndexMetaData metaData) {
- codec.writeInt(GenomicIndexUtil.MAX_BINS);
- final int nChunk = 2;
- codec.writeInt(nChunk);
- codec.writeLong(metaData.getFirstOffset());
- codec.writeLong(metaData.getLastOffset());
- codec.writeLong(metaData.getAlignedRecordCount());
- codec.writeLong(metaData.getUnalignedRecordCount());
-
- }
-
- private void writeHeader() {
- // magic string
- final byte[] magic = BAMFileConstants.BAM_INDEX_MAGIC;
- codec.writeBytes(magic);
- codec.writeInt(nRef);
- }
-
- private void writeNullContent() {
- codec.writeLong(0); // 0 bins , 0 intv
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BinaryCigarCodec.java b/src/main/java/htsjdk/samtools/BinaryCigarCodec.java
deleted file mode 100644
index 95c8e13..0000000
--- a/src/main/java/htsjdk/samtools/BinaryCigarCodec.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.nio.ByteBuffer;
-
-/**
- * Converter between disk and in-memory (object, not String) CIGAR representation.
- */
-class BinaryCigarCodec {
-
- /**
- * Convert CIGAR from object representation to disk representation.
- * @return Array of unsigned ints, one for each element of CIGAR.
- */
- static int[] encode(final Cigar cigar) {
- if (cigar.numCigarElements() == 0) {
- return new int[0];
- }
-
- // Binary rep can be no longer than 1/2 of text rep
- // Although this is documented as uint, I think lengths will never get that long,
- // and it's a pain in Java.
- final int[] binaryCigar = new int[cigar.numCigarElements()];
- int binaryCigarLength = 0;
- for (int i = 0; i < cigar.numCigarElements(); ++i) {
- final CigarElement cigarElement = cigar.getCigarElement(i);
- final int op = CigarOperator.enumToBinary(cigarElement.getOperator());
- binaryCigar[binaryCigarLength++] = cigarElement.getLength() << 4 | op;
- }
- return binaryCigar;
- }
-
- /**
- * Convert CIGAR from disk representation to object.
- * @param binaryCigar ByteArray that is assumed to have byte order set appropriately for extracting ints.
- */
- static Cigar decode(final ByteBuffer binaryCigar) {
- final Cigar ret = new Cigar();
- while (binaryCigar.hasRemaining()) {
- final int cigarette = binaryCigar.getInt();
- ret.add(binaryCigarToCigarElement(cigarette));
- }
- return ret;
- }
-
- /**
- * Convert CIGAR from disk representation to object.
- * @param binaryCigar Array of unsigned ints, one for each CIGAR element.
- */
- static Cigar decode(final int[] binaryCigar) {
- final Cigar ret = new Cigar();
- for (final int cigarette : binaryCigar) {
- ret.add(binaryCigarToCigarElement(cigarette));
- }
- return ret;
- }
-
- /**
- * @param cigarette CIGAR element (operator + length) encoded as an unsigned int.
- * @return Object representation of the CIGAR element.
- */
- private static CigarElement binaryCigarToCigarElement(final int cigarette) {
- final int binaryOp = cigarette & 0xf;
- final int length = cigarette >>> 4;
- return new CigarElement(length, CigarOperator.binaryToEnum(binaryOp));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BinaryTagCodec.java b/src/main/java/htsjdk/samtools/BinaryTagCodec.java
deleted file mode 100644
index 5603cfc..0000000
--- a/src/main/java/htsjdk/samtools/BinaryTagCodec.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.StringUtil;
-
-import java.lang.reflect.Array;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Converter between disk and in-memory representation of a SAMRecord tag.
- */
-public class BinaryTagCodec {
- // Size in bytes of the fixed part of the disk representation of a tag,
- // i.e. the number of bytes occupied by the tag name and tag type fields.
- private static final int FIXED_TAG_SIZE = 3;
-
- // Size in bytes of the fixed part of the value of a binary array,
- // i.e. the number of bytes occupied by the array type and the array length.
- private static final int FIXED_BINARY_ARRAY_TAG_SIZE = 5;
-
- // Integers are stored in the smallest size that will hold them.
- private static final long MAX_INT = Integer.MAX_VALUE;
- private static final long MAX_UINT = MAX_INT * 2 + 1;
- private static final long MAX_SHORT = Short.MAX_VALUE;
- private static final long MAX_USHORT = MAX_SHORT * 2 + 1;
- private static final long MAX_BYTE = Byte.MAX_VALUE;
- private static final long MAX_UBYTE = MAX_BYTE * 2 + 1;
-
- // Source or sink for disk representation.
- final BinaryCodec binaryCodec;
-
- /**
- * For writing tags.
- * For reading tags, a BinaryCodec is not used. See readTags() below.
- * @param binaryCodec where to write the file rep of the tags
- */
- public BinaryTagCodec(final BinaryCodec binaryCodec) {
- this.binaryCodec = binaryCodec;
- }
-
- /**
- * @param attributeValue In-memory representation of a tag value.
- * @return Size in bytes to store the value on disk.
- */
- private static int getBinaryValueSize(final Object attributeValue) {
- switch (getTagValueType(attributeValue)) {
- case 'Z':
- return ((String)attributeValue).length() + 1;
- case 'A':
- return 1;
- case 'I':
- case 'i':
- return 4;
- case 's':
- case 'S':
- return 2;
- case 'c':
- case 'C':
- return 1;
- case 'f':
- return 4;
- case 'H':
- final byte[] byteArray = (byte[])attributeValue;
- return byteArray.length * 2 + 1;
- case 'B':
- final int numElements = Array.getLength(attributeValue);
- final int elementSize;
- if(attributeValue instanceof byte[]) {
- elementSize = 1;
- } else if(attributeValue instanceof short[]) {
- elementSize = 2;
- } else if(attributeValue instanceof int[]) {
- elementSize = 4;
- } else if(attributeValue instanceof float[]) {
- elementSize = 4;
- } else {
- throw new IllegalArgumentException("Unsupported array type: " + attributeValue.getClass());
- }
- return numElements * elementSize + FIXED_BINARY_ARRAY_TAG_SIZE;
- default:
- throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
- attributeValue.getClass().getName());
- }
- }
-
- /**
- * @param value In-memory representation of a tag value.
- * @return Size in bytes to store the tag name, tag type and tag value on disk.
- */
- static int getTagSize(final Object value) {
- return FIXED_TAG_SIZE + getBinaryValueSize(value);
- }
-
- /**
- * @param value In-memory representation of a tag value.
- * @return One-character disk representation of tag type.
- */
- static char getTagValueType(final Object value) {
- if (value instanceof String) {
- return 'Z';
- } else if (value instanceof Character) {
- return 'A';
- } else if (value instanceof Float) {
- return 'f';
- } else if (value instanceof Number) {
- if (!(value instanceof Byte || value instanceof Short || value instanceof Integer || value instanceof Long)) {
- throw new IllegalArgumentException("Unrecognized tag type " + value.getClass().getName());
- }
- return getIntegerType(((Number)value).longValue());
- } /*
- Note that H tag type is never written anymore, because B style is more compact.
- else if (value instanceof byte[]) {
- return 'H';
- }
- */
- else if (value instanceof byte[] || value instanceof short[] || value instanceof int[] || value instanceof float[]) {
- return 'B';
- } else {
- throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
- value.getClass().getName());
- }
- }
-
- /**
- * @param val Integer tag value.
- * @return Tag type corresponding to the smallest integer type that will hold the given value.
- */
- static private char getIntegerType(final long val) {
- if (val > MAX_UINT) {
- throw new IllegalArgumentException("Integer attribute value too large to be encoded in BAM");
- }
- if (val > MAX_INT) {
- return 'I';
- }
- if (val > MAX_USHORT) {
- return 'i';
- }
- if (val > MAX_SHORT) {
- return 'S';
- }
- if (val > MAX_UBYTE) {
- return 's';
- }
- if (val > MAX_BYTE) {
- return 'C';
- }
- if (val >= Byte.MIN_VALUE) {
- return 'c';
- }
- if (val >= Short.MIN_VALUE) {
- return 's';
- }
- if (val >= Integer.MIN_VALUE) {
- return 'i';
- }
- throw new IllegalArgumentException("Integer attribute value too negative to be encoded in BAM");
- }
-
- /**
- * Write the given tag name and value to disk.
- */
- public void writeTag(final short tag, final Object value, final boolean isUnsignedArray) {
- binaryCodec.writeShort(tag);
- final char tagValueType = getTagValueType(value);
- binaryCodec.writeByte(tagValueType);
-
- switch (tagValueType) {
- case 'Z':
- binaryCodec.writeString((String)value, false, true);
- break;
- case 'A':
- binaryCodec.writeByte(((Character)value));
- break;
- case 'I':
- binaryCodec.writeUInt((Long)value);
- break;
- case 'i':
- binaryCodec.writeInt(((Number)value).intValue());
- break;
- case 's':
- binaryCodec.writeShort(((Number)value).shortValue());
- break;
- case 'S':
- binaryCodec.writeUShort(((Number)value).intValue());
- break;
- case 'c':
- binaryCodec.writeByte(((Number)value).byteValue());
- break;
- case 'C':
- binaryCodec.writeUByte(((Integer)value).shortValue());
- break;
- case 'f':
- binaryCodec.writeFloat((Float)value);
- break;
- /*
- Writing H is no longer supported
- case 'H':
- final byte[] byteArray = (byte[])value;
- binaryCodec.writeString(StringUtil.bytesToHexString(byteArray), false, true);
- break;
- */
- case 'B':
- writeArray(value, isUnsignedArray);
- break;
- default:
- throw new IllegalArgumentException("When writing BAM, unrecognized tag type " +
- value.getClass().getName());
- }
- }
-
- private void writeArray(final Object value, final boolean isUnsignedArray) {
- if (value instanceof byte[]) {
- binaryCodec.writeByte(isUnsignedArray? 'C': 'c');
- final byte[] array = (byte[]) value;
- binaryCodec.writeInt(array.length);
- for (final byte element: array) binaryCodec.writeByte(element);
-
- } else if (value instanceof short[]) {
- binaryCodec.writeByte(isUnsignedArray? 'S': 's');
- final short[] array = (short[]) value;
- binaryCodec.writeInt(array.length);
- for (final short element: array) binaryCodec.writeShort(element);
-
- } else if (value instanceof int[]) {
- binaryCodec.writeByte(isUnsignedArray? 'I': 'i');
- final int[] array = (int[]) value;
- binaryCodec.writeInt(array.length);
- for (final int element: array) binaryCodec.writeInt(element);
-
- } else if (value instanceof float[]) {
- binaryCodec.writeByte('f');
- final float[] array = (float[]) value;
- binaryCodec.writeInt(array.length);
- for (final float element: array) binaryCodec.writeFloat(element);
-
- } else throw new SAMException("Unrecognized array value type: " + value.getClass());
- }
-
- /**
- * Convert tags from little-endian disk representation to in-memory representation.
- * @param binaryRep Byte buffer containing file representation of tags.
- * @param offset Where in binaryRep tags start.
- * @param length How many bytes in binaryRep are tag storage.
- */
- public static SAMBinaryTagAndValue readTags(final byte[] binaryRep, final int offset,
- final int length, final ValidationStringency validationStringency) {
- final ByteBuffer byteBuffer = ByteBuffer.wrap(binaryRep, offset, length);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-
- SAMBinaryTagAndValue head = null;
- SAMBinaryTagAndValue tail = null;
-
- while (byteBuffer.hasRemaining()) {
- final short tag = byteBuffer.getShort();
- final byte tagType = byteBuffer.get();
- final SAMBinaryTagAndValue tmp;
- if (tagType != 'B') {
- tmp = new SAMBinaryTagAndValue(tag, readSingleValue(tagType, byteBuffer, validationStringency));
- } else {
- final TagValueAndUnsignedArrayFlag valueAndFlag = readArray(byteBuffer, validationStringency);
- if (valueAndFlag.isUnsignedArray) tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, valueAndFlag.value);
- else tmp = new SAMBinaryTagAndValue(tag, valueAndFlag.value);
- }
-
- // If samjdk wrote the BAM then the attributes will be in lowest->highest tag order, to inserting at the
- // head each time will be very inefficient. To fix that we check here to see if the tag should go right on
- // the tail and if so stick it there, else insert it through the head.
- if (head == null) {
- head = tmp;
- tail = tmp;
- }
- else if (tmp.tag > tail.tag) {
- tail.insert(tmp);
- tail = tmp;
- }
- else {
- head = head.insert(tmp);
- }
- }
-
- return head;
- }
-
- /**
- * Read value of specified non-array type.
- * @param tagType What type to read.
- * @param byteBuffer Little-ending byte buffer to read value from.
- * @return Value in in-memory Object form.
- */
- private static Object readSingleValue(final byte tagType, final ByteBuffer byteBuffer,
- final ValidationStringency validationStringency) {
- switch (tagType) {
- case 'Z':
- return readNullTerminatedString(byteBuffer);
- case 'A':
- return (char)byteBuffer.get();
- case 'I':
- final long val = byteBuffer.getInt() & 0xffffffffL;
- if ( val <= Integer.MAX_VALUE ) {
- return (int)val;
- }
- // If it won't fit into a signed integer, but is within range for an unsigned 32-bit integer,
- // return it directly as a long
- if (! SAMUtils.isValidUnsignedIntegerAttribute(val)) {
- SAMUtils.processValidationError(new SAMValidationError(SAMValidationError.Type.TAG_VALUE_TOO_LARGE,
- "Unsigned integer is out of range for a 32-bit unsigned value: " + val, null), validationStringency);
- }
- return val;
- case 'i':
- return byteBuffer.getInt();
- case 's':
- return (int)byteBuffer.getShort();
- case 'S':
- // Convert to unsigned short stored in an int
- return byteBuffer.getShort() & 0xffff;
- case 'c':
- return (int)byteBuffer.get();
- case 'C':
- // Convert to unsigned byte stored in an int
- return (int)byteBuffer.get() & 0xff;
- case 'f':
- return byteBuffer.getFloat();
- case 'H':
- final String hexRep = readNullTerminatedString(byteBuffer);
- return StringUtil.hexStringToBytes(hexRep);
- default:
- throw new SAMFormatException("Unrecognized tag type: " + (char)tagType);
- }
- }
-
-
-
-
- /**
- * Read value of specified type.
- * @param byteBuffer Little-ending byte buffer to read value from.
- * @return CVO containing the value in in-memory Object form, and a flag indicating whether it is unsigned or not.
- */
- private static TagValueAndUnsignedArrayFlag readArray(final ByteBuffer byteBuffer,
- final ValidationStringency validationStringency) {
- final byte arrayType = byteBuffer.get();
- final boolean isUnsigned = Character.isUpperCase(arrayType);
- final int length = byteBuffer.getInt();
- final Object value;
- switch (Character.toLowerCase(arrayType)) {
- case 'c': {
- final byte[] array = new byte[length];
- value = array;
- byteBuffer.get(array);
- break;
- }
- case 's': {
- final short[] array = new short[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getShort();
- }
- break;
- }
-
- case 'i': {
- final int[] array = new int[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getInt();
- }
- break;
- }
-
- case 'f': {
- final float[] array = new float[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getFloat();
- }
- break;
- }
-
- default:
- throw new SAMFormatException("Unrecognized tag array type: " + (char)arrayType);
- }
- return new TagValueAndUnsignedArrayFlag(value, isUnsigned);
- }
-
- private static String readNullTerminatedString(final ByteBuffer byteBuffer) {
- // Count the number of bytes in the string
- byteBuffer.mark();
- final int startPosition = byteBuffer.position();
- while (byteBuffer.get() != 0) {}
- final int endPosition = byteBuffer.position();
-
- // Don't count null terminator
- final byte[] buf = new byte[endPosition - startPosition - 1];
- // Go back to the start of the string and read out the bytes
- byteBuffer.reset();
- byteBuffer.get(buf);
- // Skip over the null terminator
- byteBuffer.get();
- return StringUtil.bytesToString(buf);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BinningIndexBuilder.java b/src/main/java/htsjdk/samtools/BinningIndexBuilder.java
deleted file mode 100644
index 37933f4..0000000
--- a/src/main/java/htsjdk/samtools/BinningIndexBuilder.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.util.List;
-
-import static htsjdk.samtools.GenomicIndexUtil.MAX_BINS;
-
-/**
- * Builder for a BinningIndexContent object.
- */
-public class BinningIndexBuilder {
- private final int referenceSequence;
- // the bins for the current reference
- private final Bin[] bins; // made only as big as needed for each reference
- private int binsSeen = 0;
-
- // linear index for the current reference
- private final long[] index = new long[LinearIndex.MAX_LINEAR_INDEX_SIZE];
- private int largestIndexSeen = -1;
-
-
- /**
- *
- * @param referenceSequence
- * @param sequenceLength 0 implies unknown length. Known length will reduce memory use.
- */
- public BinningIndexBuilder(final int referenceSequence, final int sequenceLength) {
- this.referenceSequence = referenceSequence;
- final int numBins;
- if (sequenceLength <= 0) numBins = MAX_BINS + 1;
- else numBins = AbstractBAMFileIndex.getMaxBinNumberForSequenceLength(sequenceLength) + 1;
- bins = new Bin[numBins];
- }
-
- public BinningIndexBuilder(final int referenceSequence) {
- this(referenceSequence, 0);
- }
-
- /**
- * coordinates are 1-based, inclusive
- */
- public interface FeatureToBeIndexed {
- public int getStart();
- public int getEnd();
- public Integer getIndexingBin();
- public Chunk getChunk();
- }
-
- public void processFeature(final FeatureToBeIndexed feature) {
-
- // process bins
-
- final Integer binNumber = feature.getIndexingBin();
- final int binNum = binNumber == null ? computeIndexingBin(feature) : binNumber;
-
-
- // is there a bin already represented for this index? if not, add one
- final Bin bin;
- if (bins[binNum] != null) {
- bin = bins[binNum];
- } else {
- bin = new Bin(referenceSequence, binNum);
- bins[binNum] = bin;
- binsSeen++;
- }
-
- // process chunks
-
- final Chunk newChunk = feature.getChunk();
- final long chunkStart = newChunk.getChunkStart();
- final long chunkEnd = newChunk.getChunkEnd();
-
- final List<Chunk> oldChunks = bin.getChunkList();
- if (!bin.containsChunks()) {
- bin.addInitialChunk(newChunk);
-
- } else {
- final Chunk lastChunk = bin.getLastChunk();
-
- // Coalesce chunks that are in the same or adjacent file blocks.
- // Similar to AbstractBAMFileIndex.optimizeChunkList,
- // but no need to copy the list, no minimumOffset, and maintain bin.lastChunk
- if (BlockCompressedFilePointerUtil.areInSameOrAdjacentBlocks(lastChunk.getChunkEnd(), chunkStart)) {
- lastChunk.setChunkEnd(chunkEnd); // coalesced
- } else {
- oldChunks.add(newChunk);
- bin.setLastChunk(newChunk);
- }
- }
-
- // process linear index
-
- // the smallest file offset that appears in the 16k window for this bin
- final int featureEnd = feature.getEnd();
- int startWindow = LinearIndex.convertToLinearIndexOffset(feature.getStart()); // the 16k window
- final int endWindow;
-
- if (featureEnd == GenomicIndexUtil.UNSET_GENOMIC_LOCATION) { // assume feature uses one position
- // Next line for C (samtools index) compatibility. Differs only when on a window boundary
- startWindow = LinearIndex.convertToLinearIndexOffset(feature.getStart() - 1);
- endWindow = startWindow;
- } else {
- endWindow = LinearIndex.convertToLinearIndexOffset(featureEnd);
- }
-
- if (endWindow > largestIndexSeen) {
- largestIndexSeen = endWindow;
- }
-
- // set linear index at every 16K window that this feature overlaps
- for (int win = startWindow; win <= endWindow; win++) {
- if (index[win] == 0 || chunkStart < index[win]) {
- index[win] = chunkStart;
- }
- }
- }
-
- /**
- * Creates the BAMIndexContent for this reference.
- * Requires all features of the reference have already been processed.
- */
- public BinningIndexContent generateIndexContent() {
-
-
- // process bins
- if (binsSeen == 0) return null; // no bins for this reference
-
- // process chunks
- // nothing needed
-
- // process linear index
- // linear index will only be as long as the largest index seen
- final long[] newIndex = new long[largestIndexSeen + 1]; // in java1.6 Arrays.copyOf(index, largestIndexSeen + 1);
-
- // C (samtools index) also fills in intermediate 0's with values. This seems unnecessary, but safe
- long lastNonZeroOffset = 0;
- for (int i = 0; i <= largestIndexSeen; i++) {
- if (index[i] == 0) {
- index[i] = lastNonZeroOffset; // not necessary, but C (samtools index) does this
- // note, if you remove the above line BAMIndexWriterTest.compareTextual and compareBinary will have to change
- } else {
- lastNonZeroOffset = index[i];
- }
- newIndex[i] = index[i];
- }
-
- final LinearIndex linearIndex = new LinearIndex(referenceSequence, 0, newIndex);
-
- return new BinningIndexContent(referenceSequence, new BinningIndexContent.BinList(bins, binsSeen), linearIndex);
- }
-
- private int computeIndexingBin(final FeatureToBeIndexed feature) {
- // regionToBin has zero-based, half-open API
- final int start = feature.getStart()-1;
- int end = feature.getEnd();
- if (end <= 0) {
- // If feature end cannot be determined (e.g. because a read is not really aligned),
- // then treat this as a one base feature for indexing purposes.
- end = start + 1;
- }
- return GenomicIndexUtil.regionToBin(start, end);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BinningIndexContent.java b/src/main/java/htsjdk/samtools/BinningIndexContent.java
deleted file mode 100644
index 9e32601..0000000
--- a/src/main/java/htsjdk/samtools/BinningIndexContent.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * In-memory representation of the binning index for a single reference. BAM and Tabix are both binning indices
- * with slightly different disk formats but identical in-memory representations.
- */
-public class BinningIndexContent {
- /**
- * The reference sequence for the data currently loaded.
- */
- private final int mReferenceSequence;
-
- /**
- * A list of all bins in the above reference sequence.
- */
- private final BinList mBinList;
-
- /**
- * The linear index for the reference sequence above.
- */
- private final LinearIndex mLinearIndex;
-
-
- /**
- * @param referenceSequence Content corresponds to this reference.
- * @param binList Array of bins represented by this content, possibly sparse
- * @param linearIndex Additional index used to optimize queries
- */
- public BinningIndexContent(final int referenceSequence, final BinList binList, final LinearIndex linearIndex) {
- this.mReferenceSequence = referenceSequence;
- this.mBinList = binList;
- this.mLinearIndex = linearIndex;
- }
-
- /**
- * Reference for this Content
- */
- public int getReferenceSequence() {
- return mReferenceSequence;
- }
-
- /**
- * Does this content have anything in this bin?
- */
- public boolean containsBin(final Bin bin) {
- return mBinList.getBin(bin.getBinNumber()) != null;
- }
-
- /**
- * @return iterable list of bins represented by this content
- */
- public BinList getBins() {
- return mBinList;
- }
-
- /**
- * @return the number of non-null bins represented by this content
- */
- int getNumberOfNonNullBins() {
- return mBinList.getNumberOfNonNullBins();
- }
-
- /**
- * @return all chunks associated with all bins in this content
- */
- public List<Chunk> getAllChunks() {
- final List<Chunk> allChunks = new ArrayList<Chunk>();
- for (final Bin b : mBinList)
- if (b.getChunkList() != null) {
- allChunks.addAll(b.getChunkList());
- }
- return Collections.unmodifiableList(allChunks);
- }
-
- /**
- * @return the linear index represented by this content
- */
- public LinearIndex getLinearIndex() {
- return mLinearIndex;
- }
-
-
- /**
- *
- * @param startPos 1-based, inclusive
- * @param endPos 1-based, inclusive
- * @return List of Chunks overlapping the given region. May return null if there are none.
- */
- public List<Chunk> getChunksOverlapping(final int startPos, final int endPos) {
- final BitSet overlappingBins = GenomicIndexUtil.regionToBins(startPos,endPos);
- if (overlappingBins == null) return null;
-
- // System.out.println("# Sequence target TID: " + referenceIndex);
- final List<Chunk> chunkList = new ArrayList<Chunk>();
-
- for (int index = overlappingBins.nextSetBit(0); index >= 0; index = overlappingBins.nextSetBit(index + 1)) {
- final Bin bin = getBins().getBin(index);
- if (bin != null) {
- for (final Chunk chunk : bin.getChunkList()) {
- chunkList.add(chunk.clone());
- }
- }
- }
-
- if (chunkList.isEmpty()) {
- return null;
- }
-
- return Chunk.optimizeChunkList(chunkList, getLinearIndex().getMinimumOffset(startPos));
- }
- /**
- * This class is used to encapsulate the list of Bins store in the BAMIndexContent
- * While it is currently represented as an array, we may decide to change it to an ArrayList or other structure
- */
- public static class BinList implements Iterable<Bin> {
-
- private final Bin[] mBinArray;
- public final int numberOfNonNullBins;
- public final int maxBinNumber; // invariant: maxBinNumber = mBinArray.length -1 since array is 0 based
-
- /**
- * @param binArray a sparse array representation of the bins. The index into the array is the bin number.
- * @param numberOfNonNullBins
- */
- public BinList(final Bin[] binArray, final int numberOfNonNullBins) {
- this.mBinArray = binArray;
- this.numberOfNonNullBins = numberOfNonNullBins;
- this.maxBinNumber = mBinArray.length - 1;
- }
-
- Bin getBin(final int binNumber) {
- if (binNumber > maxBinNumber) return null;
- return mBinArray[binNumber];
- }
-
- int getNumberOfNonNullBins() {
- return numberOfNonNullBins;
- }
-
- /**
- * @return An iterator over all non-empty bins.
- */
- public Iterator<Bin> iterator() {
- return new BinIterator();
- }
-
- private class BinIterator implements Iterator<Bin> {
- /**
- * Stores the bin # of the Bin currently in use.
- */
- private int nextBin;
-
- public BinIterator() {
- nextBin = 0;
- }
-
- /**
- * Are there more bins in this set, waiting to be returned?
- *
- * @return True if more bins are remaining.
- */
- public boolean hasNext() {
- while (nextBin <= maxBinNumber) {
- if (getBin(nextBin) != null) return true;
- nextBin++;
- }
- return false;
- }
-
- /**
- * Gets the next bin in the provided BinList.
- *
- * @return the next available bin in the BinList.
- */
- public Bin next() {
- if (!hasNext())
- throw new NoSuchElementException("This BinIterator is currently empty");
- final Bin result = getBin(nextBin);
- nextBin++;
- return result;
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Unable to remove from a bin iterator");
- }
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final BinList bins = (BinList) o;
-
- if (maxBinNumber != bins.maxBinNumber) return false;
- if (numberOfNonNullBins != bins.numberOfNonNullBins) return false;
- if (!Arrays.equals(mBinArray, bins.mBinArray)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = Arrays.hashCode(mBinArray);
- result = 31 * result + numberOfNonNullBins;
- result = 31 * result + maxBinNumber;
- return result;
- }
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final BinningIndexContent that = (BinningIndexContent) o;
-
- if (mReferenceSequence != that.mReferenceSequence) return false;
- if (!mBinList.equals(that.mBinList)) return false;
- if (!mLinearIndex.equals(that.mLinearIndex)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = mReferenceSequence;
- result = 31 * result + mBinList.hashCode();
- result = 31 * result + mLinearIndex.hashCode();
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java b/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java
deleted file mode 100644
index c6eca51..0000000
--- a/src/main/java/htsjdk/samtools/BrowseableBAMIndex.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * An index interface with additional functionality for querying and inspecting the structure of a BAM index.
- *
- * @author mhanna
- * @version 0.1
- */
-public interface BrowseableBAMIndex extends BAMIndex {
-
- /**
- * Gets the size (number of bins in) a given level of a BAM index.
- * @param levelNumber Level for which to inspect the size.
- * @return Size of the given level.
- */
- public int getLevelSize(final int levelNumber);
-
- /**
- * Gets the level associated with the given bin number.
- * @param bin The bin for which to determine the level.
- * @return the level associated with the given bin number.
- */
- public int getLevelForBin(final Bin bin);
-
- /**
- * Gets the first locus that this bin can index into.
- * @param bin The bin to test.
- * @return The last position that the given bin can represent.
- */
- int getFirstLocusInBin(final Bin bin);
-
- /**
- * Gets the last locus that this bin can index into.
- * @param bin The bin to test.
- * @return The last position that the given bin can represent.
- */
- int getLastLocusInBin(final Bin bin);
-
- /**
- * Get a list of bins in the BAM file that may contain SAMRecords for the given range.
- * @param referenceIndex sequence of desired SAMRecords
- * @param startPos 1-based start of the desired interval, inclusive
- * @param endPos 1-based end of the desired interval, inclusive
- * @return a list of bins that contain relevant data.
- */
- BinList getBinsOverlapping(final int referenceIndex, final int startPos, final int endPos);
-
- /**
- * Perform an overlapping query of all bins bounding the given location.
- * @param bin The bin over which to perform an overlapping query.
- * @return The file pointers
- */
- BAMFileSpan getSpanOverlapping(final Bin bin);
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java b/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java
deleted file mode 100755
index 352e9e1..0000000
--- a/src/main/java/htsjdk/samtools/CRAMBAIIndexer.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * Class for both constructing BAM index content and writing it out.
- * There are two usage patterns:
- * 1) Building a bam index from an existing cram file
- * 2) Building a bam index while building the cram file
- * In both cases, processAlignment is called for each cram slice and
- * finish() is called at the end.
- */
-public class CRAMBAIIndexer {
-
- // The number of references (chromosomes) in the BAM file
- private final int numReferences;
-
- // output written as binary, or (for debugging) as text
- private final BAMIndexWriter outputWriter;
-
- private int currentReference = 0;
-
- // content is built up from the input bam file using this
- private final BAMIndexBuilder indexBuilder;
-
- /**
- * Create a CRAM indexer that writes BAI to a file.
- *
- * @param output binary BAM Index (.bai) file
- * @param fileHeader header for the corresponding bam file
- */
- public CRAMBAIIndexer(final File output, final SAMFileHeader fileHeader) {
-
- numReferences = fileHeader.getSequenceDictionary().size();
- indexBuilder = new BAMIndexBuilder(fileHeader);
- outputWriter = new BinaryBAMIndexWriter(numReferences, output);
- }
-
- /**
- * Create a CRAM indexer that writes BAI to a stream.
- *
- * @param output Index will be written here. output will be closed when finish() method is called.
- * @param fileHeader header for the corresponding bam file.
- */
- public CRAMBAIIndexer(final OutputStream output, final SAMFileHeader fileHeader) {
-
- numReferences = fileHeader.getSequenceDictionary().size();
- indexBuilder = new BAMIndexBuilder(fileHeader);
- outputWriter = new BinaryBAMIndexWriter(numReferences, output);
- }
-
- /**
- * Index a container, any of mapped, unmapped and multiple references are allowed. The only requirement is sort
- * order by coordinate.
- * For multiref containers the method reads the container through unpacking all reads. This is slower than single
- * reference but should be faster than normal reading.
- *
- * @param container container to be indexed
- */
- public void processContainer(final Container container, final ValidationStringency validationStringency) {
- try {
- if (container == null || container.isEOF()) {
- return;
- }
-
- int sliceIndex = 0;
- for (final Slice slice : container.slices) {
- slice.containerOffset = container.offset;
- slice.index = sliceIndex++;
- if (slice.isMultiref()) {
- final ContainerParser parser = new ContainerParser(indexBuilder.bamHeader);
- final Map<Integer, AlignmentSpan> refSet = parser.getReferences(container, validationStringency);
- final Slice fakeSlice = new Slice();
- slice.containerOffset = container.offset;
- slice.index = sliceIndex++;
- /**
- * Unmapped span must be processed after mapped spans:
- */
- AlignmentSpan unmappedSpan = refSet.remove(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- for (final int refId : new TreeSet<>(refSet.keySet())) {
- final AlignmentSpan span = refSet.get(refId);
- fakeSlice.sequenceId = refId;
- fakeSlice.containerOffset = slice.containerOffset;
- fakeSlice.offset = slice.offset;
- fakeSlice.index = slice.index;
-
- fakeSlice.alignmentStart = span.getStart();
- fakeSlice.alignmentSpan = span.getSpan();
- fakeSlice.nofRecords = span.getCount();
- processSingleReferenceSlice(fakeSlice);
- }
- if (unmappedSpan != null) {
- final AlignmentSpan span = unmappedSpan;
- fakeSlice.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- fakeSlice.containerOffset = slice.containerOffset;
- fakeSlice.offset = slice.offset;
- fakeSlice.index = slice.index;
-
- fakeSlice.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
- fakeSlice.alignmentSpan = 0;
- fakeSlice.nofRecords = span.getCount();
- processSingleReferenceSlice(fakeSlice);
- }
- } else {
- processSingleReferenceSlice(slice);
- }
- }
-
- } catch (final IOException e) {
- throw new RuntimeIOException("Failed to read cram container", e);
- }
- }
-
- /**
- * Record index information for a given CRAM slice that contains either unmapped reads or
- * reads mapped to a single reference.
- * If this alignment starts a new reference, write out the old reference.
- *
- * @param slice The CRAM slice, single ref or unmapped only.
- * @throws htsjdk.samtools.SAMException if slice refers to multiple reference sequences.
- */
- public void processSingleReferenceSlice(final Slice slice) {
- try {
- final int reference = slice.sequenceId;
- if (reference == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return;
- }
- if (slice.sequenceId == Slice.MULTI_REFERENCE) {
- throw new SAMException("Expecting a single reference slice.");
- }
- if (reference != currentReference) {
- // process any completed references
- advanceToReference(reference);
- }
- indexBuilder.processSingleReferenceSlice(slice);
- } catch (final Exception e) {
- throw new SAMException("Exception creating BAM index for slice " + slice, e);
- }
- }
-
- /**
- * After all the slices have been processed, finish is called.
- * Writes any final information and closes the output file.
- */
- public void finish() {
- // process any remaining references
- advanceToReference(numReferences);
- outputWriter.writeNoCoordinateRecordCount(indexBuilder.getNoCoordinateRecordCount());
- outputWriter.close();
- }
-
- /**
- * write out any references between the currentReference and the nextReference
- */
- private void advanceToReference(final int nextReference) {
- while (currentReference < nextReference) {
- final BAMIndexContent content = indexBuilder.processReference(currentReference);
- outputWriter.writeReference(content);
- currentReference++;
- indexBuilder.startNewReference();
- }
- }
-
- /**
- * Class for constructing BAM index files.
- * One instance is used to construct an entire index.
- * processAlignment is called for each alignment until a new reference is encountered, then
- * processReference is called when all records for the reference have been processed.
- */
- private class BAMIndexBuilder {
-
- private final SAMFileHeader bamHeader;
-
- // the bins for the current reference
- private Bin[] bins; // made only as big as needed for each reference
- private int binsSeen = 0;
-
- // linear index for the current reference
- private final long[] index = new long[LinearIndex.MAX_LINEAR_INDEX_SIZE];
- private int largestIndexSeen = -1;
-
- // information in meta data
- private final BAMIndexMetaData indexStats = new BAMIndexMetaData();
-
- /**
- * @param header SAMFileHeader used for reference name (in index stats) and for max bin number
- */
- BAMIndexBuilder(final SAMFileHeader header) {
- this.bamHeader = header;
- }
-
- private int computeIndexingBin(final Slice slice) {
- // regionToBin has zero-based, half-open API
- final int alignmentStart = slice.alignmentStart - 1;
- int alignmentEnd = slice.alignmentStart + slice.alignmentSpan - 1;
- if (alignmentEnd <= alignmentStart) {
- // If alignment end cannot be determined (e.g. because this read is not really aligned),
- // then treat this as a one base alignment for indexing purposes.
- alignmentEnd = alignmentStart + 1;
- }
- return GenomicIndexUtil.regionToBin(alignmentStart, alignmentEnd);
- }
-
-
- /**
- * Record any index information for a given CRAM slice
- *
- * @param slice CRAM slice, single ref or unmapped only.
- */
- private void processSingleReferenceSlice(final Slice slice) {
-
- // metadata
- indexStats.recordMetaData(slice);
-
- final int alignmentStart = slice.alignmentStart;
- if (alignmentStart == SAMRecord.NO_ALIGNMENT_START) {
- return; // do nothing for records without coordinates, but count them
- }
-
- // various checks
- final int reference = slice.sequenceId;
- if (reference != currentReference) {
- throw new SAMException("Unexpected reference " + reference +
- " when constructing index for " + currentReference + " for record " + slice);
- }
-
- // process bins
-
- final int binNum = computeIndexingBin(slice);
-
- // has the bins array been allocated? If not, do so
- if (bins == null) {
- final SAMSequenceRecord seq = bamHeader.getSequence(reference);
- if (seq == null) {
- bins = new Bin[GenomicIndexUtil.MAX_BINS + 1];
- } else {
- bins = new Bin[AbstractBAMFileIndex.getMaxBinNumberForSequenceLength(seq.getSequenceLength()) + 1];
- }
- }
-
- // is there a bin already represented for this index? if not, add one
- final Bin bin;
- if (bins[binNum] != null) {
- bin = bins[binNum];
- } else {
- bin = new Bin(reference, binNum);
- bins[binNum] = bin;
- binsSeen++;
- }
-
- // process chunks
-
- final long chunkStart = (slice.containerOffset << 16) | slice.index;
- final long chunkEnd = ((slice.containerOffset << 16) | slice.index) + 1;
-
- final Chunk newChunk = new Chunk(chunkStart, chunkEnd);
-
- final List<Chunk> oldChunks = bin.getChunkList();
- if (!bin.containsChunks()) {
- bin.addInitialChunk(newChunk);
-
- } else {
- final Chunk lastChunk = bin.getLastChunk();
-
- // Coalesce chunks that are in the same or adjacent file blocks.
- // Similar to AbstractBAMFileIndex.optimizeChunkList,
- // but no need to copy the list, no minimumOffset, and maintain bin.lastChunk
- if (BlockCompressedFilePointerUtil.areInSameOrAdjacentBlocks(lastChunk.getChunkEnd(), chunkStart)) {
- lastChunk.setChunkEnd(chunkEnd); // coalesced
- } else {
- oldChunks.add(newChunk);
- bin.setLastChunk(newChunk);
- }
- }
-
- // process linear index
-
- // the smallest file offset that appears in the 16k window for this bin
- final int alignmentEnd = slice.alignmentStart + slice.alignmentSpan;
- int startWindow = LinearIndex.convertToLinearIndexOffset(alignmentStart); // the 16k window
- final int endWindow;
-
- if (alignmentEnd == SAMRecord.NO_ALIGNMENT_START) { // assume alignment uses one position
- // Next line for C (samtools index) compatibility. Differs only when on a window boundary
- startWindow = LinearIndex.convertToLinearIndexOffset(alignmentStart - 1);
- endWindow = startWindow;
- } else {
- endWindow = LinearIndex.convertToLinearIndexOffset(alignmentEnd);
- }
-
- if (endWindow > largestIndexSeen) {
- largestIndexSeen = endWindow;
- }
-
- // set linear index at every 16K window that this alignment overlaps
- for (int win = startWindow; win <= endWindow; win++) {
- if (index[win] == 0 || chunkStart < index[win]) {
- index[win] = chunkStart;
- }
- }
- }
-
- /**
- * Creates the BAMIndexContent for this reference.
- * Requires all alignments of the reference have already been processed.
- */
- public BAMIndexContent processReference(final int reference) {
-
- if (reference != currentReference) {
- throw new SAMException("Unexpected reference " + reference + " when constructing index for " + currentReference);
- }
-
- // process bins
- if (binsSeen == 0) {
- return null; // no bins for this reference
- }
-
- // process chunks
- // nothing needed
-
- // process linear index
- // linear index will only be as long as the largest index seen
- final long[] newIndex = new long[largestIndexSeen + 1]; // in java1.6 Arrays.copyOf(index, largestIndexSeen + 1);
-
- // C (samtools index) also fills in intermediate 0's with values. This seems unnecessary, but safe
- long lastNonZeroOffset = 0;
- for (int i = 0; i <= largestIndexSeen; i++) {
- if (index[i] == 0) {
- index[i] = lastNonZeroOffset; // not necessary, but C (samtools index) does this
- // note, if you remove the above line BAMIndexWriterTest.compareTextual and compareBinary will have to change
- } else {
- lastNonZeroOffset = index[i];
- }
- newIndex[i] = index[i];
- }
-
- final LinearIndex linearIndex = new LinearIndex(reference, 0, newIndex);
-
- return new BAMIndexContent(reference, bins, binsSeen, indexStats, linearIndex);
- }
-
- /**
- * @return the count of records with no coordinate positions
- */
- public long getNoCoordinateRecordCount() {
- return indexStats.getNoCoordinateRecordCount();
- }
-
- /**
- * reinitialize all data structures when the reference changes
- */
- void startNewReference() {
- bins = null;
- if (binsSeen > 0) {
- Arrays.fill(index, 0);
- }
- binsSeen = 0;
- largestIndexSeen = -1;
- indexStats.newReference();
- }
- }
-
- /**
- * Generates a BAI index file from an input CRAM stream
- *
- * @param stream CRAM stream to index
- * @param output File for output index file
- * @param log optional {@link htsjdk.samtools.util.Log} to output progress
- */
- public static void createIndex(final SeekableStream stream, final File output, final Log log, final ValidationStringency validationStringency) throws IOException {
-
- final CramHeader cramHeader = CramIO.readCramHeader(stream);
- if (cramHeader.getSamFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- throw new SAMException("Expecting a coordinate sorted file.");
- }
- final CRAMBAIIndexer indexer = new CRAMBAIIndexer(output, cramHeader.getSamFileHeader());
-
- int totalRecords = 0;
- Container container = null;
- ProgressLogger progressLogger = new ProgressLogger(log, 1, "indexed", "slices");
- do {
- try {
- final long offset = stream.position();
- container = ContainerIO.readContainer(cramHeader.getVersion(), stream);
- if (container == null || container.isEOF()) {
- break;
- }
-
- container.offset = offset;
-
- indexer.processContainer(container, validationStringency);
-
- if (null != log) {
- String sequenceName;
- switch (container.sequenceId) {
- case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
- sequenceName = "?";
- break;
- case Slice.MULTI_REFERENCE:
- sequenceName = "???";
- break;
- default:
- sequenceName = cramHeader.getSamFileHeader().getSequence(container.sequenceId).getSequenceName();
- break;
- }
- progressLogger.record(sequenceName, container.alignmentStart);
- }
-
- } catch (final IOException e) {
- throw new RuntimeException("Failed to read cram container", e);
- }
-
- } while (!container.isEOF());
-
- indexer.finish();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java b/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java
deleted file mode 100644
index 4599d9b..0000000
--- a/src/main/java/htsjdk/samtools/CRAMCRAIIndexer.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.structure.*;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.BufferedOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-import java.util.Scanner;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Indexer for creating/reading/writing a CRAIIndex for a CRAM file/stream. There
- * are three ways to obtain an index:
- * </p><ul>
- * <li>create an index for an entire CRAM stream and write it to an output stream</li>
- * <li>create an index on-the-fly by processing one container at a time</li>
- * <li>read an existing index from an input stream</li>
- * </ul><p>
- */
-public class CRAMCRAIIndexer {
-
- final private CRAIIndex craiIndex = new CRAIIndex();
- final private GZIPOutputStream os;
-
- /**
- * Create a CRAMCRAIIndexer that writes to the given output stream.
- * @param os output stream to which the index will be written
- * @param samHeader SAMFileHeader - user to verify sort order
- */
- public CRAMCRAIIndexer(OutputStream os, SAMFileHeader samHeader) {
- if (samHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- throw new SAMException("CRAM file be coordinate-sorted for indexing.");
- }
- try {
- this.os = new GZIPOutputStream(new BufferedOutputStream(os));
- }
- catch (IOException e) {
- throw new RuntimeIOException("Error opening CRAI index output stream");
- }
- }
-
- /**
- * Create index entries for a single container.
- * @param container the container to index
- */
- public void processContainer(final Container container) {
- craiIndex.processContainer(container);
- }
-
- // TODO this is only used by test code
- public void addEntry(CRAIEntry entry) {
- craiIndex.addEntry(entry);
- }
-
- /**
- * Finish creating the index by writing the accumulated entries out to the stream.
- */
- public void finish() {
- try {
- craiIndex.writeIndex(os);
- os.flush();
- os.close();
- }
- catch (IOException e) {
- throw new RuntimeIOException("Error writing CRAI index to output stream");
- }
- }
-
- /**
- * Generate and write a CRAI index to an output stream from a CRAM input stream
- *
- * @param cramStream CRAM stream to index; must be coordinate sorted
- * @param craiStream stream for output index
- */
- public static void writeIndex(final SeekableStream cramStream, OutputStream craiStream) {
- try {
- final CramHeader cramHeader = CramIO.readCramHeader(cramStream);
- final CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(craiStream, cramHeader.getSamFileHeader());
- final Version cramVersion = cramHeader.getVersion();
-
- // get the first container and it's offset
- long offset = cramStream.position();
- Container container = ContainerIO.readContainer(cramVersion, cramStream);
-
- while (container != null && !container.isEOF()) {
- container.offset = offset;
- indexer.processContainer(container);
- offset = cramStream.position();
- container = ContainerIO.readContainer(cramVersion, cramStream);
- }
-
- indexer.finish();
- }
- catch (IOException e) {
- throw new RuntimeIOException("Error writing CRAI index to output stream");
- }
- }
-
- /**
- * Read an input stream containing a .crai index and return a CRAIIndex object.
- * @param is Input stream to read
- * @return A CRAIIndex object representing the index.
- */
- public static CRAIIndex readIndex(final InputStream is) {
- CRAIIndex craiIndex = new CRAIIndex();
- Scanner scanner = null;
-
- try {
- scanner = new Scanner(new GZIPInputStream(is));
- while (scanner.hasNextLine()) {
- final String line = scanner.nextLine();
- craiIndex.addEntry(new CRAIEntry(line));
- }
- }
- catch (IOException e) {
- throw new RuntimeIOException("Error reading CRAI index from output stream");
- }
- finally {
- if (null != scanner) {
- scanner.close();
- }
- }
-
- return craiIndex;
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java b/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java
deleted file mode 100644
index 4707b7b..0000000
--- a/src/main/java/htsjdk/samtools/CRAMContainerStreamWriter.java
+++ /dev/null
@@ -1,495 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerFactory;
-import htsjdk.samtools.cram.build.Cram2SamRecordFactory;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.Sam2CramRecordFactory;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.lossy.PreservationPolicy;
-import htsjdk.samtools.cram.lossy.QualityScorePreservation;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- * Class for writing SAMRecords into a series of CRAM containers on an output stream.
- */
-public class CRAMContainerStreamWriter {
- private static final Version cramVersion = CramVersions.DEFAULT_CRAM_VERSION;
-
- static int DEFAULT_RECORDS_PER_SLICE = 10000;
- static int MIN_SINGLE_REF_RECORDS = 1000;
- protected final int recordsPerSlice = DEFAULT_RECORDS_PER_SLICE;
- private static final int DEFAULT_SLICES_PER_CONTAINER = 1;
- protected final int containerSize = recordsPerSlice * DEFAULT_SLICES_PER_CONTAINER;
- private static final int REF_SEQ_INDEX_NOT_INITIALIZED = -3;
-
- private final SAMFileHeader samFileHeader;
- private final String cramID;
- private final OutputStream outputStream;
- private CRAMReferenceSource source;
-
- private final List<SAMRecord> samRecords = new ArrayList<SAMRecord>();
- private ContainerFactory containerFactory;
- private int refSeqIndex = REF_SEQ_INDEX_NOT_INITIALIZED;
-
- private static final Log log = Log.getInstance(CRAMContainerStreamWriter.class);
-
- private boolean preserveReadNames = true;
- private QualityScorePreservation preservation = null;
- private boolean captureAllTags = true;
- private Set<String> captureTags = new TreeSet<String>();
- private Set<String> ignoreTags = new TreeSet<String>();
-
- private CRAMBAIIndexer indexer;
- private long offset;
-
- /**
- * Create a CRAMContainerStreamWriter for writing SAM records into a series of CRAM
- * containers on output stream, with an optional index.
- *
- * @param outputStream where to write the CRAM stream.
- * @param indexStream where to write the output index. Can be null if no index is required.
- * @param source reference source
- * @param samFileHeader {@link SAMFileHeader} to be used. Sort order is determined by the sortOrder property of this arg.
- * @param cramId used for display in error message display
- */
- public CRAMContainerStreamWriter(
- final OutputStream outputStream,
- final OutputStream indexStream,
- final CRAMReferenceSource source,
- final SAMFileHeader samFileHeader,
- final String cramId) {
- this.outputStream = outputStream;
- this.samFileHeader = samFileHeader;
- this.cramID = cramId;
- this.source = source;
- containerFactory = new ContainerFactory(samFileHeader, recordsPerSlice);
- if (indexStream != null) {
- indexer = new CRAMBAIIndexer(indexStream, samFileHeader);
- }
- }
-
- /**
- * Write an alignment record.
- * @param alignment must not be null
- */
- public void writeAlignment(final SAMRecord alignment) {
- if (shouldFlushContainer(alignment)) {
- try {
- flushContainer();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- updateReferenceContext(alignment.getReferenceIndex());
-
- samRecords.add(alignment);
- }
-
- /**
- * Write a CRAM file header and SAM header to the stream.
-
- * @param header SAMFileHeader to write
- */
- public void writeHeader(final SAMFileHeader header) {
- // TODO: header must be written exactly once per writer life cycle.
- offset = CramIO.writeHeader(cramVersion, outputStream, header, cramID);
- }
-
- /**
- * Finish writing to the stream. Flushes the record cache and optionally emits an EOF container.
- * @param writeEOFContainer true if an EOF container should be written. Only use false if writing a CRAM file
- * fragment which will later be aggregated into a complete CRAM file.
- */
- public void finish(final boolean writeEOFContainer) {
- try {
- if (!samRecords.isEmpty()) {
- flushContainer();
- }
- if (writeEOFContainer) {
- CramIO.issueEOF(cramVersion, outputStream);
- }
- outputStream.flush();
- if (indexer != null) {
- indexer.finish();
- }
- outputStream.close();
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- } catch (final IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- public boolean isPreserveReadNames() {
- return preserveReadNames;
- }
-
- public void setPreserveReadNames(final boolean preserveReadNames) {
- this.preserveReadNames = preserveReadNames;
- }
-
- public List<PreservationPolicy> getPreservationPolicies() {
- if (preservation == null) {
- // set up greedy policy by default:
- preservation = new QualityScorePreservation("*8");
- }
- return preservation.getPreservationPolicies();
- }
-
- public boolean isCaptureAllTags() {
- return captureAllTags;
- }
-
- public void setCaptureAllTags(final boolean captureAllTags) {
- this.captureAllTags = captureAllTags;
- }
-
- public Set<String> getCaptureTags() {
- return captureTags;
- }
-
- public void setCaptureTags(final Set<String> captureTags) {
- this.captureTags = captureTags;
- }
-
- public Set<String> getIgnoreTags() {
- return ignoreTags;
- }
-
- public void setIgnoreTags(final Set<String> ignoreTags) {
- this.ignoreTags = ignoreTags;
- }
-
- /**
- * Decide if the current container should be completed and flushed. The decision is based on a) number of records and b) if the
- * reference sequence id has changed.
- *
- * @param nextRecord the record to be added into the current or next container
- * @return true if the current container should be flushed and the following records should go into a new container; false otherwise.
- */
- protected boolean shouldFlushContainer(final SAMRecord nextRecord) {
- if (samRecords.isEmpty()) {
- refSeqIndex = nextRecord.getReferenceIndex();
- return false;
- }
-
- if (samRecords.size() >= containerSize) {
- return true;
- }
-
- if (samFileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- return false;
- }
-
- // make unmapped reads don't get into multiref containers:
- if (refSeqIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && nextRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return true;
- }
-
- if (refSeqIndex == Slice.MULTI_REFERENCE) {
- return false;
- }
-
- final boolean sameRef = (refSeqIndex == nextRecord.getReferenceIndex());
- if (sameRef) {
- return false;
- }
-
- /**
- * Protection against too small containers: flush at least X single refs, switch to multiref otherwise.
- */
- if (samRecords.size() > MIN_SINGLE_REF_RECORDS) {
- return true;
- } else {
- refSeqIndex = Slice.MULTI_REFERENCE;
- return false;
- }
- }
-
- private static void updateTracks(final List<SAMRecord> samRecords, final ReferenceTracks tracks) {
- for (final SAMRecord samRecord : samRecords) {
- if (samRecord.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
- int refPos = samRecord.getAlignmentStart();
- int readPos = 0;
- for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
- if (cigarElement.getOperator().consumesReferenceBases()) {
- for (int elementIndex = 0; elementIndex < cigarElement.getLength(); elementIndex++)
- tracks.addCoverage(refPos + elementIndex, 1);
- }
- switch (cigarElement.getOperator()) {
- case M:
- case X:
- case EQ:
- for (int pos = readPos; pos < cigarElement.getLength(); pos++) {
- final byte readBase = samRecord.getReadBases()[readPos + pos];
- final byte refBase = tracks.baseAt(refPos + pos);
- if (readBase != refBase) tracks.addMismatches(refPos + pos, 1);
- }
- break;
-
- default:
- break;
- }
-
- readPos += cigarElement.getOperator().consumesReadBases() ? cigarElement.getLength() : 0;
- refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement.getLength() : 0;
- }
- }
- }
- }
-
- /**
- * Complete the current container and flush it to the output stream.
- *
- * @throws IllegalArgumentException
- * @throws IllegalAccessException
- * @throws IOException
- */
- protected void flushContainer() throws IllegalArgumentException, IllegalAccessException, IOException {
-
- final byte[] refs;
- String refSeqName = null;
- switch (refSeqIndex) {
- case Slice.MULTI_REFERENCE:
- if (preservation != null && preservation.areReferenceTracksRequired()) {
- throw new SAMException("Cannot apply reference-based lossy compression on non-coordinate sorted reads.");
- }
- refs = new byte[0];
- break;
- case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
- refs = new byte[0];
- break;
- default:
- final SAMSequenceRecord sequence = samFileHeader.getSequence(refSeqIndex);
- refs = source.getReferenceBases(sequence, true);
- refSeqName = sequence.getSequenceName();
- break;
- }
-
- int start = SAMRecord.NO_ALIGNMENT_START;
- int stop = SAMRecord.NO_ALIGNMENT_START;
- for (final SAMRecord r : samRecords) {
- if (r.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) continue;
-
- if (start == SAMRecord.NO_ALIGNMENT_START) start = r.getAlignmentStart();
-
- start = Math.min(r.getAlignmentStart(), start);
- stop = Math.max(r.getAlignmentEnd(), stop);
- }
-
- ReferenceTracks tracks = null;
- if (preservation != null && preservation.areReferenceTracksRequired()) {
- tracks = new ReferenceTracks(refSeqIndex, refSeqName, refs);
-
- tracks.ensureRange(start, stop - start + 1);
- updateTracks(samRecords, tracks);
- }
-
- final List<CramCompressionRecord> cramRecords = new ArrayList<CramCompressionRecord>(samRecords.size());
-
- final Sam2CramRecordFactory sam2CramRecordFactory = new Sam2CramRecordFactory(refs, samFileHeader, cramVersion);
- sam2CramRecordFactory.preserveReadNames = preserveReadNames;
- sam2CramRecordFactory.captureAllTags = captureAllTags;
- sam2CramRecordFactory.captureTags.addAll(captureTags);
- sam2CramRecordFactory.ignoreTags.addAll(ignoreTags);
- containerFactory.setPreserveReadNames(preserveReadNames);
-
- int index = 0;
- int prevAlStart = start;
- for (final SAMRecord samRecord : samRecords) {
- if (samRecord.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && refSeqIndex != samRecord.getReferenceIndex()) {
- // this may load all ref sequences into memory:
- sam2CramRecordFactory.setRefBases(source.getReferenceBases(samFileHeader.getSequence(samRecord.getReferenceIndex()), true));
- }
- final CramCompressionRecord cramRecord = sam2CramRecordFactory.createCramRecord(samRecord);
- cramRecord.index = ++index;
- cramRecord.alignmentDelta = samRecord.getAlignmentStart() - prevAlStart;
- cramRecord.alignmentStart = samRecord.getAlignmentStart();
- prevAlStart = samRecord.getAlignmentStart();
-
- cramRecords.add(cramRecord);
-
- if (preservation != null) preservation.addQualityScores(samRecord, cramRecord, tracks);
- else if (cramRecord.qualityScores != SAMRecord.NULL_QUALS) cramRecord.setForcePreserveQualityScores(true);
- }
-
-
- if (sam2CramRecordFactory.getBaseCount() < 3 * sam2CramRecordFactory.getFeatureCount())
- log.warn("Abnormally high number of mismatches, possibly wrong reference.");
-
- {
- if (samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate) {
- // mating:
- final Map<String, CramCompressionRecord> primaryMateMap = new TreeMap<String, CramCompressionRecord>();
- final Map<String, CramCompressionRecord> secondaryMateMap = new TreeMap<String, CramCompressionRecord>();
- for (final CramCompressionRecord r : cramRecords) {
- if (!r.isMultiFragment()) {
- r.setDetached(true);
-
- r.setHasMateDownStream(false);
- r.recordsToNextFragment = -1;
- r.next = null;
- r.previous = null;
- } else {
- final String name = r.readName;
- final Map<String, CramCompressionRecord> mateMap = r.isSecondaryAlignment() ? secondaryMateMap : primaryMateMap;
- final CramCompressionRecord mate = mateMap.get(name);
- if (mate == null) {
- mateMap.put(name, r);
- } else {
- CramCompressionRecord prev = mate;
- while (prev.next != null) prev = prev.next;
- prev.recordsToNextFragment = r.index - prev.index - 1;
- prev.next = r;
- r.previous = prev;
- r.previous.setHasMateDownStream(true);
- r.setHasMateDownStream(false);
- r.setDetached(false);
- r.previous.setDetached(false);
- }
- }
- }
-
- // mark unpredictable reads as detached:
- for (final CramCompressionRecord cramRecord : cramRecords) {
- if (cramRecord.next == null || cramRecord.previous != null) continue;
- CramCompressionRecord last = cramRecord;
- while (last.next != null) last = last.next;
-
- if (cramRecord.isFirstSegment() && last.isLastSegment()) {
-
- final int templateLength = CramNormalizer.computeInsertSize(cramRecord, last);
-
- if (cramRecord.templateSize == templateLength) {
- last = cramRecord.next;
- while (last.next != null) {
- if (last.templateSize != -templateLength)
- break;
-
- last = last.next;
- }
- if (last.templateSize != -templateLength) detach(cramRecord);
- }else detach(cramRecord);
- } else detach(cramRecord);
- }
-
- for (final CramCompressionRecord cramRecord : primaryMateMap.values()) {
- if (cramRecord.next != null) continue;
- cramRecord.setDetached(true);
-
- cramRecord.setHasMateDownStream(false);
- cramRecord.recordsToNextFragment = -1;
- cramRecord.next = null;
- cramRecord.previous = null;
- }
-
- for (final CramCompressionRecord cramRecord : secondaryMateMap.values()) {
- if (cramRecord.next != null) continue;
- cramRecord.setDetached(true);
-
- cramRecord.setHasMateDownStream(false);
- cramRecord.recordsToNextFragment = -1;
- cramRecord.next = null;
- cramRecord.previous = null;
- }
- }
- else {
- for (final CramCompressionRecord cramRecord : cramRecords) {
- cramRecord.setDetached(true);
- }
- }
- }
-
-
- {
- /**
- * The following passage is for paranoid mode only. When java is run with asserts on it will throw an {@link AssertionError} if
- * read bases or quality scores of a restored SAM record mismatch the original. This is effectively a runtime round trip test.
- */
- @SuppressWarnings("UnusedAssignment") boolean assertsEnabled = false;
- //noinspection AssertWithSideEffects,ConstantConditions
- assert assertsEnabled = true;
- //noinspection ConstantConditions
- if (assertsEnabled) {
- final Cram2SamRecordFactory f = new Cram2SamRecordFactory(samFileHeader);
- for (int i = 0; i < samRecords.size(); i++) {
- final SAMRecord restoredSamRecord = f.create(cramRecords.get(i));
- assert (restoredSamRecord.getAlignmentStart() == samRecords.get(i).getAlignmentStart());
- assert (restoredSamRecord.getReferenceName().equals(samRecords.get(i).getReferenceName()));
- assert (restoredSamRecord.getReadString().equals(samRecords.get(i).getReadString()));
- assert (restoredSamRecord.getBaseQualityString().equals(samRecords.get(i).getBaseQualityString()));
- }
- }
- }
-
- final Container container = containerFactory.buildContainer(cramRecords);
- for (final Slice slice : container.slices) {
- slice.setRefMD5(refs);
- }
- container.offset = offset;
- offset += ContainerIO.writeContainer(cramVersion, container, outputStream);
- if (indexer != null) {
- /**
- * Using silent validation here because the reads have been through validation already or
- * they have been generated somehow through the htsjdk.
- */
- indexer.processContainer(container, ValidationStringency.SILENT);
- }
- samRecords.clear();
- refSeqIndex = REF_SEQ_INDEX_NOT_INITIALIZED;
- }
-
- /**
- * Traverse the graph and mark all segments as detached.
- *
- * @param cramRecord the starting point of the graph
- */
- private static void detach(CramCompressionRecord cramRecord) {
- do {
- cramRecord.setDetached(true);
-
- cramRecord.setHasMateDownStream(false);
- cramRecord.recordsToNextFragment = -1;
- }
- while ((cramRecord = cramRecord.next) != null);
- }
-
- /**
- * Check if the reference has changed and create a new record factory using the new reference.
- *
- * @param samRecordReferenceIndex index of the new reference sequence
- */
- private void updateReferenceContext(final int samRecordReferenceIndex) {
- if (refSeqIndex == Slice.MULTI_REFERENCE) {
- return;
- }
-
- if (refSeqIndex == REF_SEQ_INDEX_NOT_INITIALIZED) {
- refSeqIndex = samRecordReferenceIndex;
- } else if (refSeqIndex != samRecordReferenceIndex) {
- refSeqIndex = Slice.MULTI_REFERENCE;
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMFileReader.java b/src/main/java/htsjdk/samtools/CRAMFileReader.java
deleted file mode 100644
index 9a29d36..0000000
--- a/src/main/java/htsjdk/samtools/CRAMFileReader.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-import htsjdk.samtools.SamReader.Type;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeEOFException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.NoSuchElementException;
-
-/**
- * {@link htsjdk.samtools.BAMFileReader BAMFileReader} analogue for CRAM files.
- * Supports random access using BAI index file formats.
- *
- * @author vadim
- */
- at SuppressWarnings("UnusedDeclaration")
-public class CRAMFileReader extends SamReader.ReaderImplementation implements SamReader.Indexing {
- private File cramFile;
- private final CRAMReferenceSource referenceSource;
- private InputStream inputStream;
- private CRAMIterator iterator;
- private BAMIndex mIndex;
- private File mIndexFile;
- private boolean mEnableIndexCaching;
- private boolean mEnableIndexMemoryMapping;
-
- private ValidationStringency validationStringency;
-
- private final static Log log = Log.getInstance(CRAMFileReader.class);
-
- /**
- * Create a CRAMFileReader from either a file or input stream using the reference source returned by
- * {@link ReferenceSource#getDefaultCRAMReferenceSource() getDefaultCRAMReferenceSource}.
- *
- * @param cramFile CRAM file to open
- * @param inputStream CRAM stream to read
- *
- * @throws IllegalArgumentException if the {@code cramFile} and the {@code inputStream} are both null
- * @throws IllegalStateException if a {@link ReferenceSource#getDefaultCRAMReferenceSource() default}
- * reference source cannot be acquired
- */
- public CRAMFileReader(final File cramFile, final InputStream inputStream) {
- this(cramFile, inputStream, ReferenceSource.getDefaultCRAMReferenceSource());
- }
-
- /**
- * Create a CRAMFileReader from either a file or input stream using the supplied reference source.
- *
- * @param cramFile CRAM file to read
- * @param inputStream CRAM stream to read
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.ReferenceSource source} of
- * reference sequences. May not be null.
- *
- * @throws IllegalArgumentException if the {@code cramFile} and the {@code inputStream} are both null
- * or if the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final File cramFile, final InputStream inputStream,
- final CRAMReferenceSource referenceSource) {
- if (cramFile == null && inputStream == null) {
- throw new IllegalArgumentException("Either file or input stream is required.");
- }
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM readers");
- }
-
- this.cramFile = cramFile;
- this.inputStream = inputStream;
- this.referenceSource = referenceSource;
- if (cramFile != null) {
- mIndexFile = findIndexForFile(null, cramFile);
- }
- getIterator();
- }
-
- /**
- * Create a CRAMFileReader from a file and optional index file using the supplied reference source. If index file
- * is supplied then random access will be available.
- *
- * @param cramFile CRAM file to read. May not be null.
- * @param indexFile index file to be used for random access. May be null.
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
- * reference sequences. May not be null.
- * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final File cramFile, final File indexFile,
- final CRAMReferenceSource referenceSource) {
- if (cramFile == null)
- throw new IllegalArgumentException("File is required.");
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM readers");
- }
-
- this.cramFile = cramFile;
- mIndexFile = findIndexForFile(indexFile, cramFile);
- this.referenceSource = referenceSource;
-
- getIterator();
- }
-
- /**
- * Create a CRAMFileReader from a file using the supplied reference source.
- *
- * @param cramFile CRAM file to read. Can not be null.
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
- * reference sequences. May not be null.
- * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final File cramFile, final CRAMReferenceSource referenceSource) {
- if (cramFile == null)
- throw new IllegalArgumentException("CRAM file cannot be null.");
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM readers");
- }
-
- this.cramFile = cramFile;
- this.referenceSource = referenceSource;
- mIndexFile = findIndexForFile(null, cramFile);
-
- getIterator();
- }
-
- /**
- * Create a CRAMFileReader from an input stream and optional index stream using the supplied reference
- * source and validation stringency.
- *
- * @param inputStream CRAM stream to read. May not be null.
- * @param indexInputStream index stream to be used for random access. May be null.
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
- * reference sequences. May not be null.
- * @param validationStringency Validation stringency to be used when reading
- *
- * @throws IllegalArgumentException if the {@code inputStream} or the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final InputStream inputStream, final SeekableStream indexInputStream,
- final CRAMReferenceSource referenceSource, final ValidationStringency validationStringency) throws IOException {
- if (inputStream == null) {
- throw new IllegalArgumentException("Input stream can not be null for CRAM reader");
- }
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM readers");
- }
- this.referenceSource = referenceSource;
- initWithStreams(inputStream, indexInputStream, validationStringency);
- }
-
- /**
- * Create a CRAMFileReader from an input stream and optional index file using the supplied reference
- * source and validation stringency.
- *
- * @param stream CRAM stream to read. May not be null.
- * @param indexFile index file to be used for random access. May be null.
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
- * reference sequences. May not be null.
- * @param validationStringency Validation stringency to be used when reading
- *
- * @throws IllegalArgumentException if the {@code inputStream} or the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final InputStream stream,
- final File indexFile, final CRAMReferenceSource referenceSource,
- final ValidationStringency validationStringency) throws IOException {
- this(stream, indexFile == null ? null : new SeekableFileStream(indexFile), referenceSource, validationStringency);
- }
-
- /**
- * Create a CRAMFileReader from a CRAM file and optional index file using the supplied reference
- * source and validation stringency.
- *
- * @param cramFile CRAM stream to read. May not be null.
- * @param indexFile index file to be used for random access. May be null.
- * @param referenceSource a {@link htsjdk.samtools.cram.ref.CRAMReferenceSource source} of
- * reference sequences. May not be null.
- * @param validationStringency Validation stringency to be used when reading
- *
- * @throws IllegalArgumentException if the {@code cramFile} or the {@code CRAMReferenceSource} is null
- */
- public CRAMFileReader(final File cramFile, final File indexFile, final CRAMReferenceSource referenceSource,
- final ValidationStringency validationStringency) throws IOException {
- if (cramFile == null) {
- throw new IllegalArgumentException("Input file can not be null for CRAM reader");
- }
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM readers");
- }
- this.cramFile = cramFile;
- this.referenceSource = referenceSource;
- this.mIndexFile = findIndexForFile(indexFile, cramFile);
- final SeekableFileStream indexStream = this.mIndexFile == null ? null : new SeekableFileStream(this.mIndexFile);
- initWithStreams(new FileInputStream(cramFile), indexStream, validationStringency);
- }
-
- private void initWithStreams(final InputStream inputStream, final SeekableStream indexInputStream,
- final ValidationStringency validationStringency) throws IOException {
- this.inputStream = inputStream;
- this.validationStringency = validationStringency;
- iterator = new CRAMIterator(inputStream, referenceSource, validationStringency);
- if (indexInputStream != null) {
- SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(indexInputStream, iterator.getSAMFileHeader().getSequenceDictionary());
- if (null != baiStream) {
- mIndex = new CachingBAMFileIndex(baiStream, iterator.getSAMFileHeader().getSequenceDictionary());
- }
- else {
- throw new IllegalArgumentException("CRAM index must be a BAI or CRAI stream");
- }
- }
- }
-
- private File findIndexForFile(File indexFile, final File cramFile) {
- indexFile = indexFile == null ? SamFiles.findIndex(cramFile) : indexFile;
- if (indexFile != null && indexFile.lastModified() < cramFile.lastModified()) {
- log.warn("CRAM index file " + indexFile.getAbsolutePath() +
- " is older than CRAM " + cramFile.getAbsolutePath());
- }
- return indexFile;
- }
-
- @Override
- void enableIndexCaching(final boolean enabled) {
- // relevant to BAI only
- mEnableIndexCaching = enabled;
- }
-
- @Override
- void enableIndexMemoryMapping(final boolean enabled) {
- // relevant to BAI only
- mEnableIndexMemoryMapping = enabled;
- }
-
- @Override
- void enableCrcChecking(final boolean enabled) {
- // inapplicable to CRAM: do nothing
- }
-
- @Override
- void setSAMRecordFactory(final SAMRecordFactory factory) {
- }
-
- @Override
- public boolean hasIndex() {
- return mIndex != null || mIndexFile != null;
- }
-
- @Override
- public BAMIndex getIndex() {
- if (!hasIndex())
- throw new SAMException("No index is available for this CRAM file.");
- if (mIndex == null) {
- final SAMSequenceDictionary dictionary = getFileHeader()
- .getSequenceDictionary();
- if (mIndexFile.getName().endsWith(BAMIndex.BAMIndexSuffix)) {
- mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(mIndexFile,
- dictionary, mEnableIndexMemoryMapping)
- : new DiskBasedBAMFileIndex(mIndexFile, dictionary,
- mEnableIndexMemoryMapping);
- return mIndex;
- }
-
- if (!mIndexFile.getName().endsWith(CRAIIndex.CRAI_INDEX_SUFFIX)) return null;
- // convert CRAI into BAI:
- final SeekableStream baiStream;
- try {
- baiStream = SamIndexes.asBaiSeekableStreamOrNull(new SeekableFileStream(mIndexFile), iterator.getSAMFileHeader().getSequenceDictionary());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- mIndex = mEnableIndexCaching ? new CachingBAMFileIndex(baiStream, getFileHeader().getSequenceDictionary()) :
- new DiskBasedBAMFileIndex(baiStream, getFileHeader().getSequenceDictionary());
- }
- return mIndex;
- }
-
- @Override
- public boolean hasBrowseableIndex() {
- return false;
- }
-
- @Override
- public BrowseableBAMIndex getBrowseableIndex() {
- return null;
- }
-
- @Override
- public SAMRecordIterator iterator(final SAMFileSpan fileSpan) {
- // get the file coordinates for the span:
- final long[] coordinateArray = ((BAMFileSpan) fileSpan).toCoordinateArray();
- if (coordinateArray == null || coordinateArray.length == 0) return emptyIterator;
- try {
- // create an input stream that reads the source cram stream only within the coordinate pairs:
- final SeekableStream seekableStream = getSeekableStreamOrFailWithRTE();
- return new CRAMIterator(seekableStream, referenceSource, coordinateArray, validationStringency);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public SAMFileHeader getFileHeader() {
- return iterator.getSAMFileHeader();
- }
-
- @Override
- public SAMRecordIterator getIterator() {
- if (iterator != null && cramFile == null)
- return iterator;
- try {
- final CRAMIterator newIterator;
- if (cramFile != null) {
- newIterator = new CRAMIterator(new FileInputStream(cramFile),
- referenceSource, validationStringency);
- } else
- newIterator = new CRAMIterator(inputStream, referenceSource, validationStringency);
-
- iterator = newIterator;
- return iterator;
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan fileSpan) {
- return iterator(fileSpan);
- }
-
- @Override
- public SAMFileSpan getFilePointerSpanningReads() {
- return new BAMFileSpan(new Chunk(iterator.firstContainerOffset << 16, Long.MAX_VALUE));
- }
-
- private static final SAMRecordIterator emptyIterator = new SAMRecordIterator() {
-
- @Override
- public boolean hasNext() {
- return false;
- }
-
- @Override
- public SAMRecord next() {
- throw new RuntimeException("No records.");
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("Remove not supported.");
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
- return this;
- }
- };
-
- @Override
- public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence,
- final int start) {
- final SAMFileHeader fileHeader = getFileHeader();
- final int referenceIndex = fileHeader.getSequenceIndex(sequence);
- return new CRAMIntervalIterator(new QueryInterval[]{new QueryInterval(referenceIndex, start, -1)}, true);
- }
-
- @Override
- public CloseableIterator<SAMRecord> queryUnmapped() {
- final long startOfLastLinearBin = getIndex().getStartOfLastLinearBin();
-
- final SeekableStream seekableStream = getSeekableStreamOrFailWithRTE();
- final CRAMIterator newIterator;
- try {
- seekableStream.seek(0);
- newIterator = new CRAMIterator(seekableStream, referenceSource, validationStringency);
- seekableStream.seek(startOfLastLinearBin >>> 16);
- final Container container = ContainerIO.readContainerHeader(newIterator.getCramHeader().getVersion().major, seekableStream);
- seekableStream.seek(seekableStream.position() + container.containerByteSize);
- iterator = newIterator;
- boolean atAlignments;
- do {
- atAlignments = iterator.advanceToAlignmentInContainer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, SAMRecord.NO_ALIGNMENT_START);
- } while (!atAlignments && iterator.hasNext());
- } catch (final IOException e) {
- throw new RuntimeEOFException(e);
- }
-
- return iterator;
- }
-
- private SeekableStream getSeekableStreamOrFailWithRTE() {
- SeekableStream seekableStream = null;
- if (cramFile != null) {
- try {
- seekableStream = new SeekableFileStream(cramFile);
- } catch (final FileNotFoundException e) {
- throw new RuntimeException(e);
- }
- } else if (inputStream instanceof SeekableStream) {
- seekableStream = (SeekableStream) inputStream;
- }
- return seekableStream;
- }
-
- @Override
- public void close() {
- CloserUtil.close(iterator);
- CloserUtil.close(inputStream);
- CloserUtil.close(mIndex);
- }
-
- @Override
- void setValidationStringency(final ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- if (iterator != null) iterator.setValidationStringency(validationStringency);
- }
-
- @Override
- public ValidationStringency getValidationStringency() {
- return validationStringency;
- }
-
- @Override
- public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals,
- final boolean contained) {
- return new CRAMIntervalIterator(intervals, contained);
- }
-
- @Override
- public Type type() {
- return Type.CRAM_TYPE;
- }
-
- @Override
- void enableFileSource(final SamReader reader, final boolean enabled) {
- if (iterator != null)
- iterator.setFileSource(enabled ? reader : null);
- }
-
- private class CRAMIntervalIterator
- extends BAMQueryMultipleIntervalsIteratorFilter
- implements SAMRecordIterator {
-
- // the granularity of this iterator is the container, so the records returned
- // by it must still be filtered to find those matching the filter criteria
- private CRAMIterator unfilteredIterator;
- SAMRecord nextRec = null;
-
- public CRAMIntervalIterator(final QueryInterval[] queries, final boolean contained) {
- super(queries, contained);
-
- long[] coordinates = coordinatesFromQueryIntervals(getIndex(), queries);
- if (coordinates != null && coordinates.length != 0) {
- try {
- unfilteredIterator = new CRAMIterator(
- getSeekableStreamOrFailWithRTE(),
- referenceSource,
- coordinates,
- validationStringency
- );
- } catch (final IOException e) {
- throw new RuntimeEOFException(e);
- }
- getNextRecord(); // advance to the first record that matches the filter criteria
- }
- }
-
- // convert queries -> merged BAMFileSpan -> coordinate array
- private long[] coordinatesFromQueryIntervals(BAMIndex index, QueryInterval[] queries) {
- ArrayList<BAMFileSpan> spanList = new ArrayList<>(1);
- Arrays.asList(queries).forEach(qi -> spanList.add(mIndex.getSpanOverlapping(qi.referenceIndex, qi.start, qi.end)));
- BAMFileSpan spanArray[] = new BAMFileSpan[spanList.size()];
- for (int i = 0; i < spanList.size(); i++) {
- spanArray[i] = spanList.get(i);
- }
-
- return BAMFileSpan.merge(spanArray).toCoordinateArray();
- }
-
- @Override
- public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
- return null;
- }
-
- @Override
- public void close() {
- if (unfilteredIterator != null) {
- unfilteredIterator.close();
- }
- }
-
- @Override
- public boolean hasNext() {
- return nextRec != null;
- }
-
- @Override
- public SAMRecord next() {
- if (!hasNext()) {
- throw new NoSuchElementException("Next called on empty CRAMIntervalIterator");
- }
- return getNextRecord();
- }
-
- private SAMRecord getNextRecord() {
- final SAMRecord result = nextRec;
- nextRec = null;
- while(nextRec == null && unfilteredIterator.hasNext()) {
- SAMRecord nextRecord = unfilteredIterator.next();
- switch(compareToFilter(nextRecord)) {
- case MATCHES_FILTER:
- nextRec = nextRecord;
- break;
- case CONTINUE_ITERATION:
- continue;
- case STOP_ITERATION:
- break;
- default:
- throw new SAMException("Unexpected return from compareToFilter");
- }
- }
- return result;
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("Method \"remove\" not implemented for CRAMIntervalIterator.");
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMFileWriter.java b/src/main/java/htsjdk/samtools/CRAMFileWriter.java
deleted file mode 100644
index 5d3f2e2..0000000
--- a/src/main/java/htsjdk/samtools/CRAMFileWriter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.lossy.PreservationPolicy;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Set;
-
- at SuppressWarnings("UnusedDeclaration")
-public class CRAMFileWriter extends SAMFileWriterImpl {
- private CRAMContainerStreamWriter cramContainerStream;
- private final SAMFileHeader samFileHeader;
- private final String fileName;
-
- private static final Log log = Log.getInstance(CRAMFileWriter.class);
-
- /**
- * Create a CRAMFileWriter on an output stream. Requires input records to be presorted to match the
- * sort order defined by the input {@code samFileHeader}.
- *
- * @param outputStream where to write the output. Can not be null.
- * @param referenceSource reference source. Can not be null.
- * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
- * @param fileName used for display in error messages
- *
- * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
- */
- public CRAMFileWriter(
- final OutputStream outputStream,
- final CRAMReferenceSource referenceSource,
- final SAMFileHeader samFileHeader,
- final String fileName)
- {
- this(outputStream, null, referenceSource, samFileHeader, fileName); // defaults to presorted == true
- }
-
- /**
- * Create a CRAMFileWriter and optional index on output streams. Requires input records to be presorted to match the
- * sort order defined by the input {@code samFileHeader}.
- *
- * @param outputStream where to write the output. Can not be null.
- * @param indexOS where to write the output index. Can be null if no index is required.
- * @param referenceSource reference source
- * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
- * @param fileName used for display in error messages
- *
- * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
- */
- public CRAMFileWriter(
- final OutputStream outputStream,
- final OutputStream indexOS,
- final CRAMReferenceSource referenceSource,
- final SAMFileHeader samFileHeader,
- final String fileName)
- {
- this(outputStream, indexOS, true, referenceSource, samFileHeader, fileName); // defaults to presorted==true
- }
-
- /**
- * Create a CRAMFileWriter and optional index on output streams.
- *
- * @param outputStream where to write the output. Can not be null.
- * @param indexOS where to write the output index. Can be null if no index is required.
- * @param presorted if true records written to this writer must already be sorted in the order specified by the header
- * @param referenceSource reference source
- * @param samFileHeader {@link SAMFileHeader} to be used. Can not be null. Sort order is determined by the sortOrder property of this arg.
- * @param fileName used for display in error message display
- *
- * @throws IllegalArgumentException if the {@code outputStream}, {@code referenceSource} or {@code samFileHeader} are null
- */
- public CRAMFileWriter(final OutputStream outputStream, final OutputStream indexOS, final boolean presorted,
- final CRAMReferenceSource referenceSource, final SAMFileHeader samFileHeader, final String fileName) {
- if (outputStream == null) {
- throw new IllegalArgumentException("CRAMWriter output stream can not be null.");
- }
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required for CRAM writers");
- }
- if (samFileHeader == null) {
- throw new IllegalArgumentException("A valid SAMFileHeader is required for CRAM writers");
- }
- this.samFileHeader = samFileHeader;
- this.fileName = fileName;
- setSortOrder(samFileHeader.getSortOrder(), presorted);
- cramContainerStream = new CRAMContainerStreamWriter(outputStream, indexOS, referenceSource, samFileHeader, fileName);
- setHeader(samFileHeader);
- }
-
- /**
- * Write an alignment record.
- * @param alignment must not be null and must have a valid SAMFileHeader.
- */
- @Override
- protected void writeAlignment(final SAMRecord alignment) {
- cramContainerStream.writeAlignment(alignment);
- }
-
- @Override
- protected void writeHeader(final String textHeader) {
- cramContainerStream.writeHeader(
- new SAMTextHeaderCodec().decode(new StringLineReader(textHeader),fileName != null ? fileName : null));
- }
-
- @Override
- protected void finish() {
- cramContainerStream.finish(true); // flush the last container and issue EOF
- }
-
- @Override
- protected String getFilename() {
- return fileName;
- }
-
- public boolean isPreserveReadNames() {
- return cramContainerStream.isPreserveReadNames();
- }
-
- public void setPreserveReadNames(final boolean preserveReadNames) {
- cramContainerStream.setPreserveReadNames(preserveReadNames);
- }
-
- public List<PreservationPolicy> getPreservationPolicies() {
- return cramContainerStream.getPreservationPolicies();
- }
-
- public boolean isCaptureAllTags() {
- return cramContainerStream.isCaptureAllTags();
- }
-
- public void setCaptureAllTags(final boolean captureAllTags) {
- cramContainerStream.setCaptureAllTags(captureAllTags);
- }
-
- public Set<String> getCaptureTags() {
- return cramContainerStream.getCaptureTags();
- }
-
- public void setCaptureTags(final Set<String> captureTags) {
- cramContainerStream.setCaptureTags(captureTags);
- }
-
- public Set<String> getIgnoreTags() {
- return cramContainerStream.getIgnoreTags();
- }
-
- public void setIgnoreTags(final Set<String> ignoreTags) {
- cramContainerStream.setIgnoreTags(ignoreTags);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CRAMIterator.java b/src/main/java/htsjdk/samtools/CRAMIterator.java
deleted file mode 100644
index f8179e6..0000000
--- a/src/main/java/htsjdk/samtools/CRAMIterator.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License countingInputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.Cram2SamRecordFactory;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.CramSpanContainerIterator;
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import htsjdk.samtools.cram.CRAMException;
-
-public class CRAMIterator implements SAMRecordIterator {
- private static final Log log = Log.getInstance(CRAMIterator.class);
- private final CountingInputStream countingInputStream;
- private CramHeader cramHeader;
- private ArrayList<SAMRecord> records;
- private SAMRecord nextRecord = null;
- private CramNormalizer normalizer;
- private byte[] refs;
- private int prevSeqId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- public Container container;
- private SamReader mReader;
- long firstContainerOffset = 0;
- private Iterator<Container> containerIterator;
-
- private ContainerParser parser;
- private final CRAMReferenceSource referenceSource;
-
- private Iterator<SAMRecord> iterator = Collections.<SAMRecord>emptyList().iterator();
-
- private ValidationStringency validationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-
- public ValidationStringency getValidationStringency() {
- return validationStringency;
- }
-
- public void setValidationStringency(
- final ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- }
-
- private long samRecordIndex;
- private ArrayList<CramCompressionRecord> cramRecords;
-
- public CRAMIterator(final InputStream inputStream, final CRAMReferenceSource referenceSource, final ValidationStringency validationStringency)
- throws IOException {
- if (null == referenceSource) {
- throw new CRAMException("A reference source is required for CRAM files");
- }
- this.countingInputStream = new CountingInputStream(inputStream);
- this.referenceSource = referenceSource;
- this.validationStringency = validationStringency;
- final CramContainerIterator containerIterator = new CramContainerIterator(this.countingInputStream);
- cramHeader = containerIterator.getCramHeader();
- this.containerIterator = containerIterator;
-
- firstContainerOffset = this.countingInputStream.getCount();
- records = new ArrayList<SAMRecord>(10000);
- normalizer = new CramNormalizer(cramHeader.getSamFileHeader(),
- referenceSource);
- parser = new ContainerParser(cramHeader.getSamFileHeader());
- }
-
- public CRAMIterator(final SeekableStream seekableStream, final CRAMReferenceSource referenceSource, final long[] coordinates, final ValidationStringency validationStringency)
- throws IOException {
- if (null == referenceSource) {
- throw new CRAMException("A reference source is required for CRAM files");
- }
- this.countingInputStream = new CountingInputStream(seekableStream);
- this.referenceSource = referenceSource;
- this.validationStringency = validationStringency;
- final CramSpanContainerIterator containerIterator = CramSpanContainerIterator.fromFileSpan(seekableStream, coordinates);
- cramHeader = containerIterator.getCramHeader();
- this.containerIterator = containerIterator;
-
- firstContainerOffset = containerIterator.getFirstContainerOffset();
- records = new ArrayList<SAMRecord>(10000);
- normalizer = new CramNormalizer(cramHeader.getSamFileHeader(),
- referenceSource);
- parser = new ContainerParser(cramHeader.getSamFileHeader());
- }
-
- @Deprecated
- public CRAMIterator(final SeekableStream seekableStream, final CRAMReferenceSource referenceSource, final long[] coordinates)
- throws IOException {
- this(seekableStream, referenceSource, coordinates, ValidationStringency.DEFAULT_STRINGENCY);
- }
-
- public CramHeader getCramHeader() {
- return cramHeader;
- }
-
- void nextContainer() throws IOException, IllegalArgumentException,
- IllegalAccessException, CRAMException {
-
- if (containerIterator != null) {
- if (!containerIterator.hasNext()) {
- records.clear();
- nextRecord = null;
- return;
- }
- container = containerIterator.next();
- if (container.isEOF()) {
- records.clear();
- nextRecord = null;
- return;
- }
- } else {
- container = ContainerIO.readContainer(cramHeader.getVersion(), countingInputStream);
- if (container.isEOF()) {
- records.clear();
- nextRecord = null;
- return;
- }
- }
-
- if (records == null)
- records = new ArrayList<SAMRecord>(container.nofRecords);
- else
- records.clear();
- if (cramRecords == null)
- cramRecords = new ArrayList<CramCompressionRecord>(container.nofRecords);
- else
- cramRecords.clear();
-
- parser.getRecords(container, cramRecords, validationStringency);
-
- if (container.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- refs = new byte[]{};
- prevSeqId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- } else if (container.sequenceId == Slice.MULTI_REFERENCE) {
- refs = null;
- prevSeqId = Slice.MULTI_REFERENCE;
- } else if (prevSeqId < 0 || prevSeqId != container.sequenceId) {
- final SAMSequenceRecord sequence = cramHeader.getSamFileHeader()
- .getSequence(container.sequenceId);
- refs = referenceSource.getReferenceBases(sequence, true);
- if (refs == null) {
- throw new CRAMException(String.format("Contig %s not found in the reference file.", sequence.getSequenceName()));
- }
- prevSeqId = container.sequenceId;
- }
-
- for (int i = 0; i < container.slices.length; i++) {
- final Slice slice = container.slices[i];
- if (slice.sequenceId < 0)
- continue;
- if (!slice.validateRefMD5(refs)) {
- final String msg = String.format(
- "Reference sequence MD5 mismatch for slice: sequence id %d, start %d, span %d, expected MD5 %s",
- slice.sequenceId,
- slice.alignmentStart,
- slice.alignmentSpan,
- String.format("%032x", new BigInteger(1, slice.refMD5)));
- throw new CRAMException(msg);
- }
- }
-
- normalizer.normalize(cramRecords, refs, 0,
- container.header.substitutionMatrix);
-
- final Cram2SamRecordFactory cramToSamRecordFactory = new Cram2SamRecordFactory(
- cramHeader.getSamFileHeader());
-
- for (final CramCompressionRecord cramRecord : cramRecords) {
- final SAMRecord samRecord = cramToSamRecordFactory.create(cramRecord);
- if (!cramRecord.isSegmentUnmapped()) {
- final SAMSequenceRecord sequence = cramHeader.getSamFileHeader()
- .getSequence(cramRecord.sequenceId);
- refs = referenceSource.getReferenceBases(sequence, true);
- }
-
- samRecord.setValidationStringency(validationStringency);
-
- if (validationStringency != ValidationStringency.SILENT) {
- final List<SAMValidationError> validationErrors = samRecord.isValid();
- SAMUtils.processValidationErrors(validationErrors,
- samRecordIndex, validationStringency);
- }
-
- if (mReader != null) {
- final long chunkStart = (container.offset << 16) | cramRecord.sliceIndex;
- final long chunkEnd = ((container.offset << 16) | cramRecord.sliceIndex) + 1;
- nextRecord.setFileSource(new SAMFileSource(mReader,
- new BAMFileSpan(new Chunk(chunkStart, chunkEnd))));
- }
-
- records.add(samRecord);
- samRecordIndex++;
- }
- cramRecords.clear();
- iterator = records.iterator();
- }
-
- /**
- * Skip cached records until given alignment start position.
- *
- * @param refIndex reference sequence index
- * @param pos alignment start to skip to
- */
- public boolean advanceToAlignmentInContainer(final int refIndex, final int pos) {
- if (!hasNext()) return false;
- int i = 0;
- for (final SAMRecord record : records) {
- if (refIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX && record.getReferenceIndex() != refIndex) continue;
-
- if (pos <= 0) {
- if (record.getAlignmentStart() == SAMRecord.NO_ALIGNMENT_START) {
- iterator = records.listIterator(i);
- return true;
- }
- } else {
- if (record.getAlignmentStart() >= pos) {
- iterator = records.listIterator(i);
- return true;
- }
- }
- i++;
- }
- iterator = Collections.<SAMRecord>emptyList().iterator();
- return false;
- }
-
- @Override
- public boolean hasNext() {
- if (container != null && container.isEOF()) return false;
- if (!iterator.hasNext()) {
- try {
- nextContainer();
- } catch (IOException e) {
- throw new SAMException(e);
- } catch (IllegalAccessException e) {
- throw new SAMException(e);
- }
- }
-
- return !records.isEmpty();
- }
-
- @Override
- public SAMRecord next() {
- return iterator.next();
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("Removal of records not implemented.");
- }
-
- @Override
- public void close() {
- records.clear();
- //noinspection EmptyCatchBlock
- try {
- if (countingInputStream != null)
- countingInputStream.close();
- } catch (final IOException e) {
- }
- }
-
- @Override
- public SAMRecordIterator assertSorted(final SortOrder sortOrder) {
- throw new RuntimeException("Not implemented.");
- }
-
- public SamReader getFileSource() {
- return mReader;
- }
-
- public void setFileSource(final SamReader mReader) {
- this.mReader = mReader;
- }
-
- public SAMFileHeader getSAMFileHeader() {
- return cramHeader.getSamFileHeader();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java b/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java
deleted file mode 100644
index 8010ce5..0000000
--- a/src/main/java/htsjdk/samtools/CachingBAMFileIndex.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.List;
-import java.util.WeakHashMap;
-
-/**
- * Class for reading BAM file indices, caching each contig as it's loaded and
- * dropping values when the next contig is loaded.
- */
-class CachingBAMFileIndex extends AbstractBAMFileIndex implements BrowseableBAMIndex
-{
- private Integer mLastReferenceRetrieved = null;
- private final WeakHashMap<Integer,BAMIndexContent> mQueriesByReference = new WeakHashMap<Integer,BAMIndexContent>();
-
- public CachingBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
- super(file, dictionary);
- }
-
- public CachingBAMFileIndex(final SeekableStream stream, final SAMSequenceDictionary dictionary) {
- super(stream, dictionary);
- }
-
- public CachingBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
- super(file, dictionary, useMemoryMapping);
- }
-
- /**
- * Get list of regions of BAM file that may contain SAMRecords for the given range
- * @param referenceIndex sequence of desired SAMRecords
- * @param startPos 1-based start of the desired interval, inclusive
- * @param endPos 1-based end of the desired interval, inclusive
- * @return the virtual file position. Each pair is the first and last virtual file position
- * in a range that can be scanned to find SAMRecords that overlap the given positions.
- * May return null if there is no content overlapping the region.
- */
- public BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos) {
- final BAMIndexContent queryResults = getQueryResults(referenceIndex);
-
- if(queryResults == null)
- return null;
-
- final List<Chunk> chunkList = queryResults.getChunksOverlapping(startPos, endPos);
- if (chunkList == null) return null;
-
- return new BAMFileSpan(chunkList);
- }
-
- /**
- * Get a list of bins in the BAM file that may contain SAMRecords for the given range.
- * @param referenceIndex sequence of desired SAMRecords
- * @param startPos 1-based start of the desired interval, inclusive
- * @param endPos 1-based end of the desired interval, inclusive
- * @return a list of bins that contain relevant data.
- */
- public BinList getBinsOverlapping(final int referenceIndex, final int startPos, final int endPos) {
- final BitSet regionBins = GenomicIndexUtil.regionToBins(startPos, endPos);
- if (regionBins == null) {
- return null;
- }
- return new BinList(referenceIndex,regionBins);
- }
-
- /**
- * Perform an overlapping query of all bins bounding the given location.
- * @param bin The bin over which to perform an overlapping query.
- * @return The file pointers
- */
- public BAMFileSpan getSpanOverlapping(final Bin bin) {
- if(bin == null)
- return null;
-
- final int referenceSequence = bin.getReferenceSequence();
- final BAMIndexContent indexQuery = getQueryResults(referenceSequence);
-
- if(indexQuery == null)
- return null;
-
- final int binLevel = getLevelForBin(bin);
- final int firstLocusInBin = getFirstLocusInBin(bin);
-
- // Add the specified bin to the tree if it exists.
- final List<Bin> binTree = new ArrayList<Bin>();
- if(indexQuery.containsBin(bin))
- binTree.add(indexQuery.getBins().getBin(bin.getBinNumber()));
-
- int currentBinLevel = binLevel;
- while(--currentBinLevel >= 0) {
- final int binStart = getFirstBinInLevel(currentBinLevel);
- final int binWidth = getMaxAddressibleGenomicLocation()/getLevelSize(currentBinLevel);
- final int binNumber = firstLocusInBin/binWidth + binStart;
- final Bin parentBin = indexQuery.getBins().getBin(binNumber);
- if(parentBin != null && indexQuery.containsBin(parentBin))
- binTree.add(parentBin);
- }
-
- List<Chunk> chunkList = new ArrayList<Chunk>();
- for(final Bin coveringBin: binTree) {
- for(final Chunk chunk: coveringBin.getChunkList())
- chunkList.add(chunk.clone());
- }
-
- final int start = getFirstLocusInBin(bin);
- chunkList = Chunk.optimizeChunkList(chunkList,indexQuery.getLinearIndex().getMinimumOffset(start));
- return new BAMFileSpan(chunkList);
- }
-
- /**
- * Looks up the cached BAM query results if they're still in the cache and not expired. Otherwise,
- * retrieves the cache results from disk.
- * @param referenceIndex The reference to load. CachingBAMFileIndex only stores index data for entire references.
- * @return The index information for this reference.
- */
- protected BAMIndexContent getQueryResults(final int referenceIndex) {
- // WeakHashMap is a bit weird in that its lookups are done via equals() equality, but expirations must be
- // handled via == equality. This implementation jumps through a few hoops to make sure that == equality still
- // holds even in the context of boxing/unboxing.
-
- // If this query is for the same reference index as the last query, return it.
- if(mLastReferenceRetrieved!=null && mLastReferenceRetrieved == referenceIndex)
- return mQueriesByReference.get(referenceIndex);
-
- // If not, check to see whether it's available in the cache.
- BAMIndexContent queryResults = mQueriesByReference.get(referenceIndex);
- if(queryResults != null) {
- mLastReferenceRetrieved = referenceIndex;
- mQueriesByReference.put(referenceIndex,queryResults);
- return queryResults;
- }
-
- // If not in the cache, attempt to load it from disk.
- queryResults = query(referenceIndex,1,-1);
- if(queryResults != null) {
- mLastReferenceRetrieved = referenceIndex;
- mQueriesByReference.put(referenceIndex,queryResults);
- return queryResults;
- }
-
- // Not even available on disk.
- return null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java b/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java
deleted file mode 100644
index 4fa3a7d..0000000
--- a/src/main/java/htsjdk/samtools/ChainedDownsamplingIterator.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A DownsamplingIterator that combines the ConstantMemory and HighAccuracy downsampling techniques to provide an
- * iterator that has accuracy approaching that of HighAccuracy, but with more limited memory usage. Instead of
- * requiring memory proportional to number of read names in the incoming stream of reads, requires memory
- * approximately proportional to the number of output reads.
- *
- * @author Tim Fennell
- */
-class ChainedDownsamplingIterator extends HighAccuracyDownsamplingIterator {
- public static final int MIN_ACCURATE_INPUT_READS = 50000;
-
- /**
- * Constructs a chained iterator that will read from the provided iterator and attempt to downsampling to the provided proportion.
- */
- ChainedDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
- super(new ConstantMemoryDownsamplingIterator(iterator, adjustProportion(proportion), seed), proportion, seed);
-
- // Deal with the fact that the iterator will advance and discard some reads at construction
- final long discarded = ((ConstantMemoryDownsamplingIterator) getUnderlyingIterator()).getDiscardedCount();
- recordDiscardRecords(discarded);
- }
-
- /**
- * Calculates the upper bound of 99.9% CI given the proportion, that is used to "buffer" the proportion on
- * the constant memory downsampler, to make sure it leaves enough reads for us to downsample.
- *
- * Uses an assumed number of reads tested as this is often not known until after the fact.
- */
- private static double adjustProportion(final double p) {
- final double ciAdjustment99_9 = 3.3 * Math.sqrt(p/MIN_ACCURATE_INPUT_READS);
- return Math.min(1, p + ciAdjustment99_9);
- }
-
-
- /**
- * Resets statistics before reading from the underlying iterator.
- */
- @Override
- protected void readFromUnderlyingIterator(final List<SAMRecord> recs, final Set<String> names, final int templatesToRead) {
- // Reset the stats on the underlying iterator
- ((ConstantMemoryDownsamplingIterator) getUnderlyingIterator()).resetStatistics();
-
- // Read from the underlying iterator
- super.readFromUnderlyingIterator(recs, names, templatesToRead);
- }
-
- @Override
- protected int calculateTemplatesToKeep(final int templatesRead, final double overallProportion) {
- // Calculate an adjusted proportion to keep, knowing what proportion the underlying iterator discarded
- final ConstantMemoryDownsamplingIterator iter = (ConstantMemoryDownsamplingIterator) getUnderlyingIterator();
- final double priorProportion = iter.getAcceptedFraction();
- final double p = Math.max(0, Math.min(1, overallProportion / priorProportion));
- final int retval = super.calculateTemplatesToKeep(templatesRead, p);
-
- // Record all the discarded records to keep the overall statistics accurate, but do it after
- // the call to super() so it doesn't affect the proportion calculation.
- recordDiscardRecords(iter.getDiscardedCount());
-
- return retval;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/Chunk.java b/src/main/java/htsjdk/samtools/Chunk.java
deleted file mode 100644
index 0d77b0c..0000000
--- a/src/main/java/htsjdk/samtools/Chunk.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BlockCompressedFilePointerUtil;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A [start,stop) file pointer pairing into the BAM file, stored
- * as a BAM file index. A chunk is represented as a single 64-bit
- * value where the high-order 48 bits point to the location of the
- * start of a compressed BGZF block within a BGZF file and the
- * low-order 16 bits point to a position within the decompressed
- * data in the BGZF block.
- *
- * See the SAM/BAM spec for more details.
- */
-public class Chunk implements Cloneable, Serializable,Comparable<Chunk> {
- private static final long serialVersionUID = 1L;
-
- /**
- * A pointer to the start of a region in a SAM/BAM file. The
- * start is inclusive: start reading from this point.
- */
- private long mChunkStart;
-
- /**
- * A pointer to the end of a region in a SAM/BAM file. The end
- * is exclusive: this pointer points to one byte past the end
- * of the region of interest inside the file.
- */
- private long mChunkEnd;
-
- public Chunk(final long start, final long end) {
- mChunkStart = start;
- mChunkEnd = end;
- }
-
- public Chunk clone() {
- return new Chunk(mChunkStart,mChunkEnd);
- }
-
- public long getChunkStart() {
- return mChunkStart;
- }
-
- protected void setChunkStart(final long value) {
- mChunkStart = value;
- }
-
- public long getChunkEnd() {
- return mChunkEnd;
- }
-
- protected void setChunkEnd(final long value) {
- mChunkEnd = value;
- }
-
- public int compareTo(final Chunk chunk) {
- int result = Long.signum(mChunkStart - chunk.mChunkStart);
- if (result == 0) {
- result = Long.signum(mChunkEnd - chunk.mChunkEnd);
- }
- return result;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final Chunk chunk = (Chunk) o;
-
- if (mChunkEnd != chunk.mChunkEnd) return false;
- if (mChunkStart != chunk.mChunkStart) return false;
-
- return true;
- }
-
- /**
- * Returns whether two chunks overlap.
- * @param other Chunk to which this should be compared.
- * @return True if the chunks overlap. Returns false if the two chunks abut or are disjoint.
- */
- public boolean overlaps(final Chunk other) {
- final int comparison = this.compareTo(other);
- if(comparison == 0)
- return true;
-
- // "sort" the two chunks using the comparator.
- final Chunk leftMost = comparison==-1 ? this : other;
- final Chunk rightMost = comparison==1 ? this : other;
-
- final long leftMostBlockAddress = BlockCompressedFilePointerUtil.getBlockAddress(leftMost.getChunkEnd());
- final long rightMostBlockAddress = BlockCompressedFilePointerUtil.getBlockAddress(rightMost.getChunkStart());
-
- // If the left block's address is after the right block's address, compare the two blocks.
- // If the two blocks are identical, compare the block offsets.
- // If the right block is after the left block, no overlap is possible.
- if(leftMostBlockAddress > rightMostBlockAddress)
- return true;
- else if(leftMostBlockAddress == rightMostBlockAddress) {
- final int leftMostOffset = BlockCompressedFilePointerUtil.getBlockOffset(leftMost.getChunkEnd());
- final int rightMostOffset = BlockCompressedFilePointerUtil.getBlockOffset(rightMost.getChunkStart());
- return leftMostOffset > rightMostOffset;
- }
- else
- return false;
- }
-
- /**
- * Returns whether two chunks overlap.
- * @param other Chunk to which this should be compared.
- * @return True if the two chunks are adjacent. Returns false if the chunks overlap or are discontinuous.
- */
- public boolean isAdjacentTo(final Chunk other) {
- // Simpler implementation would be to == the chunk end of one to the chunk start of the other. Chose this implementation to ensure that all chunk
- // comparisons point directly to the
- return (BlockCompressedFilePointerUtil.getBlockAddress(this.getChunkEnd()) == BlockCompressedFilePointerUtil.getBlockAddress(other.getChunkStart()) &&
- BlockCompressedFilePointerUtil.getBlockOffset(this.getChunkEnd()) == BlockCompressedFilePointerUtil.getBlockOffset(other.getChunkStart())) ||
- (BlockCompressedFilePointerUtil.getBlockAddress(this.getChunkStart()) == BlockCompressedFilePointerUtil.getBlockAddress(other.getChunkEnd()) &&
- BlockCompressedFilePointerUtil.getBlockOffset(this.getChunkStart()) == BlockCompressedFilePointerUtil.getBlockOffset(other.getChunkEnd()));
- }
-
- @Override
- public int hashCode() {
- int result = (int) (mChunkStart ^ (mChunkStart >>> 32));
- result = 31 * result + (int) (mChunkEnd ^ (mChunkEnd >>> 32));
- return result;
- }
-
- @Override
- public String toString() {
- return String.format("%d:%d-%d:%d",mChunkStart >> 16,mChunkStart & 0xFFFF,mChunkEnd >> 16,mChunkEnd & 0xFFFF);
- }
-
- /**
- * @param minimumOffset Discard chunks that end before this file offset.
- * @return sorted list of chunks in which adjacent chunks are coalesced.
- */
- public static List<Chunk> optimizeChunkList(final List<Chunk> chunks, final long minimumOffset) {
- Chunk lastChunk = null;
- Collections.sort(chunks);
- final List<Chunk> result = new ArrayList<Chunk>();
- for (final Chunk chunk : chunks) {
- if (chunk.getChunkEnd() <= minimumOffset) {
- continue; // linear index optimization
- }
- if (result.isEmpty()) {
- result.add(chunk);
- lastChunk = chunk;
- continue;
- }
- // Coalesce chunks that are in adjacent file blocks.
- // This is a performance optimization.
- if (!lastChunk.overlaps(chunk) && !lastChunk.isAdjacentTo(chunk)) {
- result.add(chunk);
- lastChunk = chunk;
- } else {
- if (chunk.getChunkEnd() > lastChunk.getChunkEnd()) {
- lastChunk.setChunkEnd(chunk.getChunkEnd());
- }
- }
- }
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/Cigar.java b/src/main/java/htsjdk/samtools/Cigar.java
deleted file mode 100644
index 12ffd0c..0000000
--- a/src/main/java/htsjdk/samtools/Cigar.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A list of CigarElements, which describes how a read aligns with the reference.
- * E.g. the Cigar string 10M1D25M means
- * * match or mismatch for 10 bases
- * * deletion of 1 base
- * * match or mismatch for 25 bases
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for complete CIGAR specification.
- */
-public class Cigar implements Serializable, Iterable<CigarElement> {
- public static final long serialVersionUID = 1L;
-
- private final List<CigarElement> cigarElements = new ArrayList<CigarElement>();
-
- public Cigar() {
- }
-
- public Cigar(final List<CigarElement> cigarElements) {
- this.cigarElements.addAll(cigarElements);
- }
-
- public List<CigarElement> getCigarElements() {
- return Collections.unmodifiableList(cigarElements);
- }
-
- public CigarElement getCigarElement(final int i) {
- return cigarElements.get(i);
- }
-
- public void add(final CigarElement cigarElement) {
- cigarElements.add(cigarElement);
- }
-
- public int numCigarElements() {
- return cigarElements.size();
- }
-
- public boolean isEmpty() {
- return cigarElements.isEmpty();
- }
-
- /**
- * @return The number of reference bases that the read covers, excluding padding.
- */
- public int getReferenceLength() {
- int length = 0;
- for (final CigarElement element : cigarElements) {
- switch (element.getOperator()) {
- case M:
- case D:
- case N:
- case EQ:
- case X:
- length += element.getLength();
- break;
- default: break;
- }
- }
- return length;
- }
-
- /**
- * @return The number of reference bases that the read covers, including padding.
- */
- public int getPaddedReferenceLength() {
- int length = 0;
- for (final CigarElement element : cigarElements) {
- switch (element.getOperator()) {
- case M:
- case D:
- case N:
- case EQ:
- case X:
- case P:
- length += element.getLength();
- break;
- default: break;
- }
- }
- return length;
- }
-
- /**
- * @return The number of read bases that the read covers.
- */
- public int getReadLength() {
- return getReadLength(cigarElements);
- }
-
- /**
- * @return The number of read bases that the read covers.
- */
- public static int getReadLength(final List<CigarElement> cigarElements) {
- int length = 0;
- for (final CigarElement element : cigarElements) {
- if (element.getOperator().consumesReadBases()){
- length += element.getLength();
- }
- }
- return length;
- }
-
- /**
- * Exhaustive validation of CIGAR.
- * Note that this method deliberately returns null rather than Collections.emptyList() if there
- * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
- * @param readName For error reporting only. May be null if not known.
- * @param recordNumber For error reporting only. May be -1 if not known.
- * @return List of validation errors, or null if no errors.
- */
- public List<SAMValidationError> isValid(final String readName, final long recordNumber) {
- if (this.isEmpty()) {
- return null;
- }
- List<SAMValidationError> ret = null;
- boolean seenRealOperator = false;
- for (int i = 0; i < cigarElements.size(); ++i) {
- final CigarElement element = cigarElements.get(i);
- if (element.getLength() == 0) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "CIGAR element with zero length", readName, recordNumber));
- }
- // clipping operator can only be at start or end of CIGAR
- final CigarOperator op = element.getOperator();
- if (isClippingOperator(op)) {
- if (op == CigarOperator.H) {
- if (i != 0 && i != cigarElements.size() - 1) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Hard clipping operator not at start or end of CIGAR", readName, recordNumber));
- }
- } else {
- if (op != CigarOperator.S) throw new IllegalStateException("Should never happen: " + op.name());
- if (i == 0 || i == cigarElements.size() - 1) {
- // Soft clip at either end is fine
- } else if (i == 1) {
- if (cigarElements.size() == 3 && cigarElements.get(2).getOperator() == CigarOperator.H) {
- // Handle funky special case in which S operator is both one from the beginning and one
- // from the end.
- } else if (cigarElements.get(0).getOperator() != CigarOperator.H) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Soft clipping CIGAR operator can only be inside of hard clipping operator",
- readName, recordNumber));
- }
- } else if (i == cigarElements.size() - 2) {
- if (cigarElements.get(cigarElements.size() - 1).getOperator() != CigarOperator.H) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Soft clipping CIGAR operator can only be inside of hard clipping operator",
- readName, recordNumber));
- }
- } else {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Soft clipping CIGAR operator can at start or end of read, or be inside of hard clipping operator",
- readName, recordNumber));
- }
-
- }
- } else if (isRealOperator(op)) {
- // Must be at least one real operator (MIDN)
- seenRealOperator = true;
- // There should be an M or P operator between any pair of IDN operators
- if (isInDelOperator(op)) {
- for (int j = i+1; j < cigarElements.size(); ++j) {
- final CigarOperator nextOperator = cigarElements.get(j).getOperator();
- // Allow
- if ((isRealOperator(nextOperator) && !isInDelOperator(nextOperator)) || isPaddingOperator(nextOperator)) {
- break;
- }
- if (isInDelOperator(nextOperator) && op == nextOperator) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR,
- "No M or N operator between pair of " + op.name() + " operators in CIGAR", readName, recordNumber));
- }
- }
- }
- } else if (isPaddingOperator(op)) {
- if (i == 0) {
- /*
- * Removed restriction that padding not be the first operator because if a read starts in the middle of a pad
- * in a padded reference, it is necessary to precede the read with padding so that alignment start refers to a
- * position on the unpadded reference.
- */
- } else if (i == cigarElements.size() - 1) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Padding operator not valid at end of CIGAR", readName, recordNumber));
- } else if (!isRealOperator(cigarElements.get(i-1).getOperator()) ||
- !isRealOperator(cigarElements.get(i+1).getOperator())) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "Padding operator not between real operators in CIGAR", readName, recordNumber));
- }
- }
- }
- if (!seenRealOperator) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,
- "No real operator (M|I|D|N) in CIGAR", readName, recordNumber));
- }
- return ret;
- }
-
- private static boolean isRealOperator(final CigarOperator op) {
- return op == CigarOperator.M || op == CigarOperator.EQ || op == CigarOperator.X ||
- op == CigarOperator.I || op == CigarOperator.D || op == CigarOperator.N;
- }
-
- private static boolean isInDelOperator(final CigarOperator op) {
- return op !=null && op.isIndel();
- }
-
- private static boolean isClippingOperator(final CigarOperator op) {
- return op !=null && op.isClipping();
- }
-
- private static boolean isPaddingOperator(final CigarOperator op) {
- return op !=null && op.isPadding();
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (!(o instanceof Cigar)) return false;
-
- final Cigar cigar = (Cigar) o;
-
- return cigarElements.equals(cigar.cigarElements);
- }
-
- /** build a new Cigar object from a list of cigar operators.
- * This can be used if you have the operators associated to
- * each base in the read.
- *
- * e.g: read length =10 with cigar= <code>[M,M,M,M,M,M,M,M,M,M]</code>, here
- * fromCigarOperators would generate the cigar '10M'
- *
- * later the user resolved the 'M' to '=' or 'X', the array is now
- *
- * <code>[=,=,=,=,=,X,X,=,=,=]</code>
- *
- * fromCigarOperators would generate the cigar '5M2X3M'
- *
- * */
- public static Cigar fromCigarOperators(final List<CigarOperator> cigarOperators) {
- if (cigarOperators == null) throw new IllegalArgumentException("cigarOperators is null");
- final List<CigarElement> cigarElementList = new ArrayList<>();
- int i = 0;
- // find adjacent operators and build list of cigar elements
- while (i < cigarOperators.size() ) {
- final CigarOperator currentOp = cigarOperators.get(i);
- int j = i + 1;
- while (j < cigarOperators.size() && cigarOperators.get(j).equals(currentOp)) {
- j++;
- }
- cigarElementList.add(new CigarElement(j - i, currentOp));
- i = j;
- }
- return new Cigar(cigarElementList);
- }
-
- /** shortcut to <code>getCigarElements().iterator()</code> */
- @Override
- public Iterator<CigarElement> iterator() {
- return this.getCigarElements().iterator();
- }
-
- /** returns true if the cigar string contains the given operator */
- public boolean containsOperator(final CigarOperator operator) {
- return this.cigarElements.stream().anyMatch( element -> element.getOperator() == operator);
- }
-
- /** returns the first cigar element */
- public CigarElement getFirstCigarElement() {
- return isEmpty() ? null : this.cigarElements.get(0);
- }
-
- /** returns the last cigar element */
- public CigarElement getLastCigarElement() {
- return isEmpty() ? null : this.cigarElements.get(this.numCigarElements() - 1 );
- }
-
- /** returns true if the cigar string starts With a clipping operator */
- public boolean isLeftClipped() {
- return !isEmpty() && isClippingOperator(getFirstCigarElement().getOperator());
- }
-
- /** returns true if the cigar string ends With a clipping operator */
- public boolean isRightClipped() {
- return !isEmpty() && isClippingOperator(getLastCigarElement().getOperator());
- }
-
- /** returns true if the cigar is clipped */
- public boolean isClipped() {
- return isLeftClipped() || isRightClipped();
- }
-
- @Override
- public int hashCode() {
- return cigarElements.hashCode();
- }
-
- public String toString() {
- return TextCigarCodec.encode(this);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CigarElement.java b/src/main/java/htsjdk/samtools/CigarElement.java
deleted file mode 100644
index c645e6c..0000000
--- a/src/main/java/htsjdk/samtools/CigarElement.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * One component of a cigar string. The component comprises the operator, and the number of bases to which
- * the operator applies.
- */
-public class CigarElement implements Serializable {
- public static final long serialVersionUID = 1L;
-
- private final int length;
- private final CigarOperator operator;
-
- public CigarElement(final int length, final CigarOperator operator) {
- this.length = length;
- this.operator = operator;
- }
-
- public int getLength() {
- return length;
- }
-
- public CigarOperator getOperator() {
- return operator;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (!(o instanceof CigarElement)) return false;
-
- final CigarElement that = (CigarElement) o;
-
- if (length != that.length) return false;
- if (operator != that.operator) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = length;
- result = 31 * result + (operator != null ? operator.hashCode() : 0);
- return result;
- }
-
- @Override
- public String toString() {
- return String.valueOf(this.length)+this.operator;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CigarOperator.java b/src/main/java/htsjdk/samtools/CigarOperator.java
deleted file mode 100644
index 46ea539..0000000
--- a/src/main/java/htsjdk/samtools/CigarOperator.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * The operators that can appear in a cigar string, and information about their disk representations.
- */
-public enum CigarOperator {
- /** Match or mismatch */
- M(true, true, 'M'),
- /** Insertion vs. the reference. */
- I(true, false, 'I'),
- /** Deletion vs. the reference. */
- D(false, true, 'D'),
- /** Skipped region from the reference. */
- N(false, true, 'N'),
- /** Soft clip. */
- S(true, false, 'S'),
- /** Hard clip. */
- H(false, false, 'H'),
- /** Padding. */
- P(false, false, 'P'),
- /** Matches the reference. */
- EQ(true, true, '='),
- /** Mismatches the reference. */
- X(true, true, 'X')
- ;
-
- // Representation of CigarOperator in BAM file
- private static final byte OP_M = 0;
- private static final byte OP_I = 1;
- private static final byte OP_D = 2;
- private static final byte OP_N = 3;
- private static final byte OP_S = 4;
- private static final byte OP_H = 5;
- private static final byte OP_P = 6;
- private static final byte OP_EQ = 7;
- private static final byte OP_X = 8;
-
- private final boolean consumesReadBases;
- private final boolean consumesReferenceBases;
- private final byte character;
- private final String string;
-
- // Readable synonyms of the above enums
- public static final CigarOperator MATCH_OR_MISMATCH = M;
- public static final CigarOperator INSERTION = I;
- public static final CigarOperator DELETION = D;
- public static final CigarOperator SKIPPED_REGION = N;
- public static final CigarOperator SOFT_CLIP = S;
- public static final CigarOperator HARD_CLIP = H;
- public static final CigarOperator PADDING = P;
-
- /** Default constructor. */
- CigarOperator(boolean consumesReadBases, boolean consumesReferenceBases, char character) {
- this.consumesReadBases = consumesReadBases;
- this.consumesReferenceBases = consumesReferenceBases;
- this.character = (byte) character;
- this.string = new String(new char[] {character}).intern();
- }
-
- /** If true, represents that this cigar operator "consumes" bases from the read bases. */
- public boolean consumesReadBases() { return consumesReadBases; }
-
- /** If true, represents that this cigar operator "consumes" bases from the reference sequence. */
- public boolean consumesReferenceBases() { return consumesReferenceBases; }
-
- /**
- * @param b CIGAR operator in character form as appears in a text CIGAR string
- * @return CigarOperator enum value corresponding to the given character.
- */
- public static CigarOperator characterToEnum(final int b) {
- switch (b) {
- case 'M':
- return M;
- case 'I':
- return I;
- case 'D':
- return D;
- case 'N':
- return N;
- case 'S':
- return S;
- case 'H':
- return H;
- case 'P':
- return P;
- case '=':
- return EQ;
- case 'X':
- return X;
- default:
- throw new IllegalArgumentException("Unrecognized CigarOperator: " + b);
- }
- }
-
- /**
- * @param i CIGAR operator in binary form as appears in a BAMRecord.
- * @return CigarOperator enum value corresponding to the given int value.
- */
- public static CigarOperator binaryToEnum(final int i) {
- switch(i) {
- case OP_M:
- return M;
- case OP_I:
- return I;
- case OP_D:
- return D;
- case OP_N:
- return N;
- case OP_S:
- return S;
- case OP_H:
- return H;
- case OP_P:
- return P;
- case OP_EQ:
- return EQ;
- case OP_X:
- return X;
- default:
- throw new IllegalArgumentException("Unrecognized CigarOperator: " + i);
- }
- }
-
- /**
- *
- * @param e CigarOperator enum value.
- * @return CIGAR operator corresponding to the enum value in binary form as appears in a BAMRecord.
- */
- public static int enumToBinary(final CigarOperator e) {
- switch(e) {
- case M:
- return OP_M;
- case I:
- return OP_I;
- case D:
- return OP_D;
- case N:
- return OP_N;
- case S:
- return OP_S;
- case H:
- return OP_H;
- case P:
- return OP_P;
- case EQ:
- return OP_EQ;
- case X:
- return OP_X;
- default:
- throw new IllegalArgumentException("Unrecognized CigarOperator: " + e);
- }
- }
-
- /** Returns the character that should be used within a SAM file. */
- public static byte enumToCharacter(final CigarOperator e) {
- return e.character;
- }
-
- /** Returns true if the operator is a clipped (hard or soft) operator */
- public boolean isClipping() {
- return this == S || this == H;
- }
-
- /** Returns true if the operator is a Insertion or Deletion operator */
- public boolean isIndel() {
- return this == I || this == D;
- }
-
- /** Returns true if the operator is a Skipped Region Insertion or Deletion operator */
- public boolean isIndelOrSkippedRegion() {
- return this == N || isIndel();
- }
-
- /** Returns true if the operator is a M, a X or a EQ */
- public boolean isAlignment() {
- return this == M || this == X || this == EQ;
- }
-
- /** Returns true if the operator is a Padding operator */
- public boolean isPadding() {
- return this == P;
- }
-
- /** Returns the cigar operator as it would be seen in a SAM file. */
- @Override public String toString() {
- return this.string;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java b/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java
deleted file mode 100644
index 06186a1..0000000
--- a/src/main/java/htsjdk/samtools/ComparableSamRecordIterator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Comparator;
-
-/**
- * Iterator for SAM records that implements comparable to enable sorting of iterators.
- * The comparison is performed by comparing the next record in the iterator to the next
- * record in another iterator and returning the ordering between those SAM records.
- */
-class ComparableSamRecordIterator extends PeekableIterator<SAMRecord> implements Comparable<ComparableSamRecordIterator> {
- private final Comparator<SAMRecord> comparator;
- private final SamReader reader;
-
- /**
- * Constructs a wrapping iterator around the given iterator that will be able
- * to compare itself to other ComparableSamRecordIterators using the given comparator.
- *
- * @param iterator the wrapped iterator.
- * @param comparator the Comparator to use to provide ordering fo SAMRecords
- */
- public ComparableSamRecordIterator(final SamReader sam, final CloseableIterator<SAMRecord> iterator, final Comparator<SAMRecord> comparator) {
- super(iterator);
- this.reader = sam;
- this.comparator = comparator;
- }
-
- /** Returns the reader from which this iterator was constructed. */
- public SamReader getReader() {
- return reader;
- }
-
- /**
- * Compares this iterator to another comparable iterator based on the next record
- * available in each iterator. If the two comparable iterators have different
- * comparator types internally an exception is thrown.
- *
- * @param that another iterator to compare to
- * @return a negative, 0 or positive number as described in the Comparator interface
- */
- public int compareTo(final ComparableSamRecordIterator that) {
- if (this.comparator.getClass() != that.comparator.getClass()) {
- throw new IllegalStateException("Attempt to compare two ComparableSAMRecordIterators that " +
- "have different orderings internally");
- }
-
- final SAMRecord record = this.peek();
- final SAMRecord record2 = that.peek();
- return comparator.compare(record, record2);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- return compareTo((ComparableSamRecordIterator) o) == 0;
- }
-
- @Override
- public int hashCode() {
- throw new UnsupportedOperationException("ComparableSamRecordIterator should not be hashed because it can change value");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java b/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java
deleted file mode 100644
index c6e0de4..0000000
--- a/src/main/java/htsjdk/samtools/ConstantMemoryDownsamplingIterator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-
-/**
- * A DownsamplingIterator that runs in constant (and very small) memory. For each read the read name is hashed
- * using the Murmur3_32 hash algorithm to obtain an integer value that is, enough for our purposes, uniformly
- * distributed between the min and max int values even for highly similar inputs. The proportion is used to
- * calculate a maximum acceptable hash value within the range. Records whose hash value is below the limit
- * are emitted, records whose hash value is above the limit are discarded.
- *
- * Does not make any attempt to be accurate (have actual proportion == requested proportion) beyond what would
- * be expected for a random process and so may become quite inaccurate when downsampling to small numbers of
- * reads.
- *
- * @author Tim Fennell
- */
-class ConstantMemoryDownsamplingIterator extends DownsamplingIterator {
- private final PeekableIterator<SAMRecord> underlyingIterator;
- private final int maxHashValue;
- private final Murmur3 hasher;
-
-
- /** Constructs a downsampling iterator upon the supplied iterator, using the Random as the source of randomness. */
- ConstantMemoryDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
- super(proportion);
- this.hasher = new Murmur3(seed);
- this.underlyingIterator = new PeekableIterator<SAMRecord>(iterator);
-
- final long range = (long) Integer.MAX_VALUE - (long) Integer.MIN_VALUE;
- this.maxHashValue = Integer.MIN_VALUE + (int) Math.round(range * proportion);
-
- advanceToNextAcceptedRead();
- }
-
- /** Returns true if there is another record available post-downsampling, false otherwise. */
- @Override public boolean hasNext() {
- // The underlying iterator is always left at the next return-able read, so if it has a next read, so do we
- return this.underlyingIterator.hasNext();
- }
-
- /**
- * Advances the underlying, peekable, iterator until the next records is one that is to be emitted.
- * @return true if there is at least one emittable record ready for emission, false otherwise
- */
- private boolean advanceToNextAcceptedRead() {
- while (this.underlyingIterator.hasNext() && this.hasher.hashUnencodedChars(this.underlyingIterator.peek().getReadName()) > this.maxHashValue) {
- this.underlyingIterator.next();
- recordDiscardedRecord();
- }
-
- return this.underlyingIterator.hasNext();
- }
-
- /** Returns the next record from the iterator, or throws an exception if there is no next record. */
- @Override public SAMRecord next() {
- final SAMRecord rec = this.underlyingIterator.next();
- recordAcceptedRecord();
- advanceToNextAcceptedRead();
- return rec;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java b/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java
deleted file mode 100644
index d892d65..0000000
--- a/src/main/java/htsjdk/samtools/CoordinateSortedPairInfoMap.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FileAppendStreamLRUCache;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Holds info about a mate pair for use when processing a coordinate sorted file. When one read of a pair is encountered,
- * the caller should add a record to this map. When the other read of a pair is encountered, the record should be removed.
- * This class assumes that reads will be processed in order of reference sequence index. When the map is queried for
- * a record for a given reference sequence index, all the records for that sequence are loaded from temp file into RAM, so there
- * must be sufficient RAM to hold all the records for one reference sequence. If the records are not processed in
- * reference sequence order, loading and unloading of records will cause performance to be terrible.
- * @param <KEY> KEY + reference sequence index are used to identify the record being stored or retrieved.
- * @param <REC> The type of record being retrieved.
- */
-public class CoordinateSortedPairInfoMap<KEY, REC> implements Iterable<Map.Entry<KEY, REC>> {
- // -1 is a valid sequence index in this case
- private final int INVALID_SEQUENCE_INDEX = -2;
- /**
- * directory where files will go
- */
- private final File workDir = IOUtil.createTempDir("CSPI.", null);
- private int sequenceIndexOfMapInRam = INVALID_SEQUENCE_INDEX;
- private Map<KEY, REC> mapInRam = null;
- private final FileAppendStreamLRUCache outputStreams;
- private final Codec<KEY, REC> elementCodec;
- // Key is reference index (which is in the range [-1 .. max sequence index].
- // Value is the number of records on disk for this index.
- private final Map<Integer, Integer> sizeOfMapOnDisk = new HashMap<Integer, Integer>();
-
- // No other methods may be called when iteration is in progress, because iteration depends on and changes
- // internal state.
- private boolean iterationInProgress = false;
-
- public CoordinateSortedPairInfoMap(final int maxOpenFiles, final Codec<KEY, REC> elementCodec) {
- this.elementCodec = elementCodec;
- workDir.deleteOnExit();
- outputStreams = new FileAppendStreamLRUCache(maxOpenFiles);
- }
-
- /**
- *
- * @param sequenceIndex
- * @param key
- * @return The record corresponding to the given sequenceIndex and key, or null if it is not present.
- */
- public REC remove(final int sequenceIndex, final KEY key) {
- if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
- ensureSequenceLoaded(sequenceIndex);
- return mapInRam.remove(key);
- }
-
- private void ensureSequenceLoaded(final int sequenceIndex) {
- try {
- if (sequenceIndexOfMapInRam == sequenceIndex) {
- return;
- }
-
- // Spill map in RAM to disk
- if (mapInRam != null) {
- final File spillFile = makeFileForSequence(sequenceIndexOfMapInRam);
- if (spillFile.exists()) throw new IllegalStateException(spillFile + " should not exist.");
- if (!mapInRam.isEmpty()) {
- // Do not create file or entry in sizeOfMapOnDisk if there is nothing to write.
- final OutputStream os = getOutputStreamForSequence(sequenceIndexOfMapInRam);
- elementCodec.setOutputStream(os);
- for (final Map.Entry<KEY, REC> entry : mapInRam.entrySet()) {
- elementCodec.encode(entry.getKey(), entry.getValue());
- }
- sizeOfMapOnDisk.put(sequenceIndexOfMapInRam, mapInRam.size());
- mapInRam.clear();
- }
- } else {
- mapInRam = new HashMap<KEY, REC>();
- }
-
- sequenceIndexOfMapInRam = sequenceIndex;
-
- // Load map from disk if it existed
- File mapOnDisk = makeFileForSequence(sequenceIndex);
- if (outputStreams.containsKey(mapOnDisk)) {
- outputStreams.remove(mapOnDisk).close();
- }
- final Integer numRecords = sizeOfMapOnDisk.remove(sequenceIndex);
- if (mapOnDisk.exists()) {
- if (numRecords == null)
- throw new IllegalStateException("null numRecords for " + mapOnDisk);
- FileInputStream is = null;
- try {
- is = new FileInputStream(mapOnDisk);
- elementCodec.setInputStream(is);
- for (int i = 0; i < numRecords; ++i) {
- final Map.Entry<KEY, REC> keyAndRecord = elementCodec.decode();
- if (mapInRam.containsKey(keyAndRecord.getKey()))
- throw new SAMException("Value was put into PairInfoMap more than once. " +
- sequenceIndex + ": " + keyAndRecord.getKey());
- mapInRam.put(keyAndRecord.getKey(), keyAndRecord.getValue());
- }
- } finally {
- CloserUtil.close(is);
- }
- htsjdk.samtools.util.IOUtil.deleteFiles(mapOnDisk);
- } else if (numRecords != null && numRecords > 0)
- throw new IllegalStateException("Non-zero numRecords but " + mapOnDisk + " does not exist");
- } catch (IOException e) {
- throw new SAMException("Error loading new map from disk.", e);
- }
- }
-
- /**
- * Store the record with the given sequence index and key. It is assumed that value did not previously exist
- * in the map, and an exception is thrown (possibly at a later time) if that is not the case.
- * @param sequenceIndex
- * @param key
- * @param record
- */
- public void put(final int sequenceIndex, final KEY key, final REC record) {
- if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
- if (sequenceIndex == sequenceIndexOfMapInRam) {
- // Store in RAM map
- if (mapInRam.containsKey(key))
- throw new IllegalArgumentException("Putting value into PairInfoMap that already existed. " +
- sequenceIndex + ": " + key);
- mapInRam.put(key, record);
- } else {
- // Append to file
- final OutputStream os = getOutputStreamForSequence(sequenceIndex);
- elementCodec.setOutputStream(os);
- elementCodec.encode(key, record);
- Integer prevCount = sizeOfMapOnDisk.get(sequenceIndex);
- if (prevCount == null) prevCount = 0;
- sizeOfMapOnDisk.put(sequenceIndex, prevCount + 1);
- }
- }
-
- private File makeFileForSequence(final int index) {
- final File file = new File(workDir, index + ".tmp");
- file.deleteOnExit();
- return file;
- }
-
- private OutputStream getOutputStreamForSequence(final int mateSequenceIndex) {
- return outputStreams.get(makeFileForSequence(mateSequenceIndex));
- }
-
- public int size() {
- int total = sizeInRam();
- for (final Integer mapSize : sizeOfMapOnDisk.values()) {
- if (mapSize != null) {
- total += mapSize;
- }
- }
- return total;
- }
-
- /**
- * @return number of elements stored in RAM. Always <= size()
- */
- public int sizeInRam() {
- return mapInRam != null? mapInRam.size(): 0;
- }
-
- /**
- * Creates an iterator over all elements in map, in arbitrary order. Elements may not be added
- * or removed from map when iteration is in progress, nor may a second iteration be started.
- * Iterator must be closed in order to allow normal access to the map.
- */
- public CloseableIterator<Map.Entry<KEY, REC>> iterator() {
- if (iterationInProgress) throw new IllegalStateException("Cannot be called when iteration is in progress");
- iterationInProgress = true;
- return new MapIterator();
- }
-
- private class MapIterator implements CloseableIterator<Map.Entry<KEY, REC>> {
- private boolean closed = false;
- private Set<Integer> referenceIndices = new HashSet<Integer>(sizeOfMapOnDisk.keySet());
- private final Iterator<Integer> referenceIndexIterator;
- private Iterator<Map.Entry<KEY, REC>> currentReferenceIterator = null;
-
- private MapIterator() {
- if (sequenceIndexOfMapInRam != INVALID_SEQUENCE_INDEX)
- referenceIndices.add(sequenceIndexOfMapInRam);
- referenceIndexIterator = referenceIndices.iterator();
- advanceToNextNonEmptyReferenceIndex();
- }
-
- private void advanceToNextNonEmptyReferenceIndex() {
- while (referenceIndexIterator.hasNext()) {
- int nextReferenceIndex = referenceIndexIterator.next();
- ensureSequenceLoaded(nextReferenceIndex);
- if (!mapInRam.isEmpty()) {
- createIteratorForMapInRam();
- return;
- }
- }
- // no more.
- currentReferenceIterator = null;
- }
-
- private void createIteratorForMapInRam() {
- currentReferenceIterator = mapInRam.entrySet().iterator();
- }
-
- public void close() {
- closed = true;
- iterationInProgress = false;
- }
-
- public boolean hasNext() {
- if (closed) throw new IllegalStateException("Iterator has been closed");
- if (currentReferenceIterator != null && !currentReferenceIterator.hasNext())
- throw new IllegalStateException("Should not happen");
- return currentReferenceIterator != null;
- }
-
- public Map.Entry<KEY, REC> next() {
- if (closed) throw new IllegalStateException("Iterator has been closed");
- if (!hasNext()) throw new NoSuchElementException();
- final Map.Entry<KEY, REC> ret = currentReferenceIterator.next();
- if (!currentReferenceIterator.hasNext()) advanceToNextNonEmptyReferenceIndex();
- return ret;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * Client must implement this class, which defines the way in which records are written to and
- * read from file.
- */
- public interface Codec<KEY, REC> {
- /**
- * Where to write encoded output
- * @param os
- */
- void setOutputStream(OutputStream os);
-
- /**
- * Where to read encoded input from
- * @param is
- */
- void setInputStream(InputStream is);
-
- /**
- * Write object to output stream. If the key is part of the record, then there is no need to write
- * it separately.
- */
- void encode(KEY key, REC record);
-
- /**
- * Read the next key and record from the input stream and convert into a java object.
- * @return null if no more records. Should throw exception if EOF is encountered in the middle of
- * a record.
- */
- Map.Entry<KEY, REC> decode();
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/CustomReaderFactory.java b/src/main/java/htsjdk/samtools/CustomReaderFactory.java
deleted file mode 100644
index bb00da7..0000000
--- a/src/main/java/htsjdk/samtools/CustomReaderFactory.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.net.URL;
-import java.net.URLClassLoader;
-
-
-/**
- * Factory for creating custom readers for accessing API based resources,
- * e.g. ga4gh.
- * The configuration is controlled via custom_reader property (@see Defaults).
- * This allows injection of such readers from code bases outside HTSJDK.
- */
-public class CustomReaderFactory {
- private final static Log LOG = Log.getInstance(CustomReaderFactory.class);
- /**
- * Interface to be implemented by custom factory classes that register
- * themselves with this factory and are loaded dynamically.
- */
- public interface ICustomReaderFactory {
- SamReader open(URL url);
- }
-
- private static final CustomReaderFactory DEFAULT_FACTORY;
- private static CustomReaderFactory currentFactory;
-
- private String urlPrefix = "";
- private String factoryClassName = "";
- private String jarFile = "";
- private ICustomReaderFactory factory;
-
- static {
- DEFAULT_FACTORY = new CustomReaderFactory();
- currentFactory = DEFAULT_FACTORY;
- }
-
- public static void setInstance(final CustomReaderFactory factory){
- currentFactory = factory;
- }
-
- public static void resetToDefaultInstance() {
- setInstance(DEFAULT_FACTORY);
- }
-
- public static CustomReaderFactory getInstance(){
- return currentFactory;
- }
-
- /**
- * Initializes factory based on the custom_reader property specification.
- */
- private CustomReaderFactory() {
- this(Defaults.CUSTOM_READER_FACTORY);
- }
-
- CustomReaderFactory(String cfg) {
- final String[] cfgComponents = cfg.split(",");
- if (cfgComponents.length < 2) {
- return;
- }
- urlPrefix = cfgComponents[0].toLowerCase();
- factoryClassName = cfgComponents[1];
- if (cfgComponents.length > 2) {
- jarFile = cfgComponents[2];
- }
- }
-
- /**
- * Lazily creates factory based on the configuration.
- * @return null if creation fails, factory instance otherwise.
- */
- private synchronized ICustomReaderFactory getFactory() {
- if (factory == null) {
- try {
- Class clazz = null;
-
- if (!jarFile.isEmpty()) {
- LOG.info("Attempting to load factory class " + factoryClassName +
- " from " + jarFile);
- final URL jarURL = new URL("file:///"+jarFile);
- clazz = Class.forName(factoryClassName, true,
- new URLClassLoader (new URL[] { jarURL },
- this.getClass().getClassLoader()));
- } else {
- LOG.info("Attempting to load factory class " + factoryClassName);
- clazz = Class.forName(factoryClassName);
- }
-
- factory = (ICustomReaderFactory)clazz.newInstance();
- LOG.info("Created custom factory for " + urlPrefix + " from " +
- factoryClassName + " loaded from " + (jarFile.isEmpty() ?
- " this jar" : jarFile));
- } catch (Exception e) {
- LOG.error(e);
- return null;
- }
- }
- return factory;
- }
-
- /**
- * Check if the url is supposed to be handled by the custom factory and if so
- * attempt to create reader via an instance of this custom factory.
- *
- * @return null if the url is not handled by this factory, SamReader otherwise.
- */
- public SamReader maybeOpen(URL url) {
- if (urlPrefix.isEmpty() ||
- !url.toString().toLowerCase().startsWith(urlPrefix)) {
- return null;
- }
- LOG.info("Attempting to open " + url + " with custom factory");
- final ICustomReaderFactory factory = getFactory();
- if (factory == null) {
- return null;
- }
- return factory.open(url);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java b/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java
deleted file mode 100644
index 7e3848e..0000000
--- a/src/main/java/htsjdk/samtools/DefaultSAMRecordFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * Default factory for creating SAM and BAM records used by the {@link SamReader} classes.
- *
- * @author Tim Fennell
- */
-public class DefaultSAMRecordFactory implements SAMRecordFactory {
-
- private static final DefaultSAMRecordFactory INSTANCE = new DefaultSAMRecordFactory();
-
- public static DefaultSAMRecordFactory getInstance() {
- return INSTANCE;
- }
-
- /** Create a new SAMRecord to be filled in */
- public SAMRecord createSAMRecord(final SAMFileHeader header) {
- return new SAMRecord(header);
- }
-
- /**
- * Create a new BAM Record. If the reference sequence index or mate reference sequence index are
- * any value other than NO_ALIGNMENT_REFERENCE_INDEX, the values must be resolvable against the sequence
- * dictionary in the header argument.
- */
- public BAMRecord createBAMRecord (final SAMFileHeader header,
- final int referenceSequenceIndex,
- final int alignmentStart,
- final short readNameLength,
- final short mappingQuality,
- final int indexingBin,
- final int cigarLen,
- final int flags,
- final int readLen,
- final int mateReferenceSequenceIndex,
- final int mateAlignmentStart,
- final int insertSize,
- final byte[] variableLengthBlock) {
-
- return new BAMRecord(header,
- referenceSequenceIndex,
- alignmentStart,
- readNameLength,
- mappingQuality,
- indexingBin,
- cigarLen,
- flags,
- readLen,
- mateReferenceSequenceIndex,
- mateAlignmentStart,
- insertSize,
- variableLengthBlock);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/Defaults.java b/src/main/java/htsjdk/samtools/Defaults.java
deleted file mode 100644
index 5e3f6da..0000000
--- a/src/main/java/htsjdk/samtools/Defaults.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * Embodies defaults for global values that affect how the SAM JDK operates. Defaults are encoded in the class
- * and are also overridable using system properties.
- *
- * @author Tim Fennell
- */
-public class Defaults {
- private static Log log = Log.getInstance(Defaults.class);
-
- /** Should BAM index files be created when writing out coordinate sorted BAM files? Default = false. */
- public static final boolean CREATE_INDEX;
-
- /** Should MD5 files be created when writing out SAM and BAM files? Default = false. */
- public static final boolean CREATE_MD5;
-
- /** Should asynchronous read I/O be used where supported by the samtools package (one thread per file).
- * Default = false.
- */
- public static final boolean USE_ASYNC_IO_READ_FOR_SAMTOOLS;
-
- /** Should asynchronous write I/O be used where supported by the samtools package (one thread per file).
- * Default = false.
- */
- public static final boolean USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
-
- /** Should asynchronous write I/O be used where supported by the tribble package (one thread per file).
- * Default = false.
- */
- public static final boolean USE_ASYNC_IO_WRITE_FOR_TRIBBLE;
-
- /** Compresion level to be used for writing BAM and other block-compressed outputs. Default = 5. */
- public static final int COMPRESSION_LEVEL;
-
- /** Buffer size, in bytes, used whenever reading/writing files or streams. Default = 128k. */
- public static final int BUFFER_SIZE;
-
- /** The output format of the flag field when writing SAM text. Ignored for reading SAM text. */
- public static final SamFlagField SAM_FLAG_FIELD_FORMAT;
-
- /**
- * Even if BUFFER_SIZE is 0, this is guaranteed to be non-zero. If BUFFER_SIZE is non-zero,
- * this == BUFFER_SIZE
- */
- public static final int NON_ZERO_BUFFER_SIZE;
-
- /**
- * The reference FASTA file. If this is not set, the file is null. This file may be required for reading
- * writing SAM files (ex. CRAM).
- */
- public static final File REFERENCE_FASTA;
-
- /** Custom reader factory able to handle URL based resources like ga4gh.
- * Expected format: <url prefix>,<fully qualified factory class name>[,<jar file name>]
- * E.g. https://www.googleapis.com/genomics/v1beta/reads/,com.google.genomics.ReaderFactory
- * OR https://www.googleapis.com/genomics/v1beta/reads/,com.google.genomics.ReaderFactory,/tmp/genomics.jar
- */
- public static final String CUSTOM_READER_FACTORY;
-
- /**
- * Boolean describing whether downloading a reference file is allowed (for CRAM files),
- * in case the reference file is not specified by the user
- * Enabling this is not necessarily a good idea, since this process often fails
- */
- public static final boolean USE_CRAM_REF_DOWNLOAD;
-
- /**
- * A mask (pattern) to use when building EBI reference service URL for a
- * given MD5 checksum. Must contain one and only one string placeholder.
- */
- public static final String EBI_REFERENCE_SERVICE_URL_MASK;
-
- /**
- * Boolean describing whether downloading of SRA native libraries is allowed,
- * in case such native libraries are not found locally
- */
- public static final boolean SRA_LIBRARIES_DOWNLOAD;
-
-
- static {
- CREATE_INDEX = getBooleanProperty("create_index", false);
- CREATE_MD5 = getBooleanProperty("create_md5", false);
- USE_ASYNC_IO_READ_FOR_SAMTOOLS = getBooleanProperty("use_async_io_read_samtools", false);
- USE_ASYNC_IO_WRITE_FOR_SAMTOOLS = getBooleanProperty("use_async_io_write_samtools", false);
- USE_ASYNC_IO_WRITE_FOR_TRIBBLE = getBooleanProperty("use_async_io_write_tribble", false);
- COMPRESSION_LEVEL = getIntProperty("compression_level", 5);
- BUFFER_SIZE = getIntProperty("buffer_size", 1024 * 128);
- if (BUFFER_SIZE == 0) {
- NON_ZERO_BUFFER_SIZE = 1024 * 128;
- } else {
- NON_ZERO_BUFFER_SIZE = BUFFER_SIZE;
- }
- REFERENCE_FASTA = getFileProperty("reference_fasta", null);
- USE_CRAM_REF_DOWNLOAD = getBooleanProperty("use_cram_ref_download", false);
- EBI_REFERENCE_SERVICE_URL_MASK = "http://www.ebi.ac.uk/ena/cram/md5/%s";
- CUSTOM_READER_FACTORY = getStringProperty("custom_reader", "");
- SAM_FLAG_FIELD_FORMAT = SamFlagField.valueOf(getStringProperty("sam_flag_field_format", SamFlagField.DECIMAL.name()));
- SRA_LIBRARIES_DOWNLOAD = getBooleanProperty("sra_libraries_download", false);
- }
-
- /**
- * Returns a map of all default values (keys are names), lexicographically sorted by keys.
- * The returned map is unmodifiable.
- * This function is useful for example when logging all defaults.
- */
- public static SortedMap<String, Object> allDefaults(){
- final SortedMap<String, Object> result = new TreeMap<>();
- result.put("CREATE_INDEX", CREATE_INDEX);
- result.put("CREATE_MD5", CREATE_MD5);
- result.put("USE_ASYNC_IO_READ_FOR_SAMTOOLS", USE_ASYNC_IO_READ_FOR_SAMTOOLS);
- result.put("USE_ASYNC_IO_WRITE_FOR_SAMTOOLS", USE_ASYNC_IO_WRITE_FOR_SAMTOOLS);
- result.put("USE_ASYNC_IO_WRITE_FOR_TRIBBLE", USE_ASYNC_IO_WRITE_FOR_TRIBBLE);
- result.put("COMPRESSION_LEVEL", COMPRESSION_LEVEL);
- result.put("BUFFER_SIZE", BUFFER_SIZE);
- result.put("NON_ZERO_BUFFER_SIZE", NON_ZERO_BUFFER_SIZE);
- result.put("REFERENCE_FASTA", REFERENCE_FASTA);
- result.put("USE_CRAM_REF_DOWNLOAD", USE_CRAM_REF_DOWNLOAD);
- result.put("EBI_REFERENCE_SERVICE_URL_MASK", EBI_REFERENCE_SERVICE_URL_MASK);
- result.put("CUSTOM_READER_FACTORY", CUSTOM_READER_FACTORY);
- result.put("SAM_FLAG_FIELD_FORMAT", SAM_FLAG_FIELD_FORMAT);
- return Collections.unmodifiableSortedMap(result);
- }
-
- /** Gets a string system property, prefixed with "samjdk." using the default
- * if the property does not exist or if the java.security manager raises an exception for
- * applications started with -Djava.security.manager . */
- private static String getStringProperty(final String name, final String def) {
- try {
- return System.getProperty("samjdk." + name, def);
- } catch (final java.security.AccessControlException error) {
- log.warn(error,"java Security Manager forbids 'System.getProperty(\"" + name + "\")' , returning default value: " + def );
- return def;
- }
- }
-
- /** Checks whether a string system property, prefixed with "samjdk.", exists.
- * If the property does not exist or if the java.security manager raises an exception for
- * applications started with -Djava.security.manager this method returns false. */
- private static boolean hasProperty(final String name){
- try {
- return null != System.getProperty("samjdk." + name);
- } catch (final java.security.AccessControlException error) {
- log.warn(error,"java Security Manager forbids 'System.getProperty(\"" + name + "\")' , returning false");
- return false;
- }
- }
-
- /** Gets a boolean system property, prefixed with "samjdk." using the default if the property does not exist. */
- private static boolean getBooleanProperty(final String name, final boolean def) {
- final String value = getStringProperty(name, Boolean.toString(def));
- return Boolean.parseBoolean(value);
- }
-
- /** Gets an int system property, prefixed with "samjdk." using the default if the property does not exist. */
- private static int getIntProperty(final String name, final int def) {
- final String value = getStringProperty(name, Integer.toString(def));
- return Integer.parseInt(value);
- }
-
- /** Gets a File system property, prefixed with "samjdk." using the default if the property does not exist. */
- private static File getFileProperty(final String name, final String def) {
- final String value = getStringProperty(name, def);
- // TODO: assert that it is readable
- return (null == value) ? null : new File(value);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java b/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java
deleted file mode 100644
index b5d6f59..0000000
--- a/src/main/java/htsjdk/samtools/DiskBasedBAMFileIndex.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for reading BAM file indices, hitting the disk once per query.
- */
-public class DiskBasedBAMFileIndex extends AbstractBAMFileIndex
-{
- public DiskBasedBAMFileIndex(final File file, final SAMSequenceDictionary dictionary) {
- super(file, dictionary);
- }
-
- public DiskBasedBAMFileIndex(final SeekableStream stream, final SAMSequenceDictionary dictionary) {
- super(stream, dictionary);
- }
-
- public DiskBasedBAMFileIndex(final File file, final SAMSequenceDictionary dictionary, final boolean useMemoryMapping) {
- super(file, dictionary, useMemoryMapping);
- }
-
- /**
- * Get list of regions of BAM file that may contain SAMRecords for the given range
- * @param referenceIndex sequence of desired SAMRecords
- * @param startPos 1-based start of the desired interval, inclusive
- * @param endPos 1-based end of the desired interval, inclusive
- * @return array of pairs of virtual file positions. Each pair is the first and last
- * virtual file position in a range that can be scanned to find SAMRecords that overlap the given
- * positions. The last position in each pair is a virtual file pointer to the first SAMRecord beyond
- * the range that may contain the indicated SAMRecords.
- */
- public BAMFileSpan getSpanOverlapping(final int referenceIndex, final int startPos, final int endPos) {
- final BAMIndexContent queryResults = query(referenceIndex,startPos,endPos);
-
- if(queryResults == null)
- return null;
-
- List<Chunk> chunkList = new ArrayList<Chunk>();
- for(final Chunk chunk: queryResults.getAllChunks())
- chunkList.add(chunk.clone());
- chunkList = Chunk.optimizeChunkList(chunkList,queryResults.getLinearIndex().getMinimumOffset(startPos));
- return new BAMFileSpan(chunkList);
- }
-
- protected BAMIndexContent getQueryResults(final int reference){
- throw new UnsupportedOperationException();
- // todo: there ought to be a way to support this using the first startPos for the reference and the last
- // return query(reference, 1, -1);
- // If this were implemented, BAMIndexer.createAndWriteIndex could extend DiskBasedBAMFileIndex -or- CachingBAMFileIndex
- }
-}
diff --git a/src/main/java/htsjdk/samtools/DownsamplingIterator.java b/src/main/java/htsjdk/samtools/DownsamplingIterator.java
deleted file mode 100644
index 8ca0d84..0000000
--- a/src/main/java/htsjdk/samtools/DownsamplingIterator.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * Abstract base class for all DownsamplingIterators that provides a uniform interface for recording
- * and reporting statistics bout how many records have been kept and discarded.
- *
- * A DownsamplingIterator is an iterator that takes another iterator of SAMRecords and filters out a
- * subset of those records in a random way, while ensuring that all records for a template (i.e. record name)
- * are either retained or discarded. Strictly speaking the proportion parameter applies to templates,
- * though in most instances it is safe to think about it being applied to records.
- *
- * @author Tim Fennell
- */
-public abstract class DownsamplingIterator implements CloseableIterator<SAMRecord> {
- private long recordsSeen;
- private long recordsAccepted;
- private double targetProportion;
-
- /** Constructs a downsampling iterator that aims to retain the targetProportion of reads. */
- public DownsamplingIterator(final double targetProportion) {
- if (targetProportion < 0) throw new IllegalArgumentException("targetProportion must be >= 0");
- if (targetProportion > 1) throw new IllegalArgumentException("targetProportion must be <= 1");
- this.targetProportion = targetProportion;
- }
-
- /** Does nothing. */
- @Override public void close() { /** No Op. */ }
-
- /** Returns the number of records seen, including accepted and discarded, since creation of the last call to resetStatistics. */
- public long getSeenCount() { return this.recordsSeen; }
-
- /** Returns the number of records returned since creation of the last call to resetStatistics. */
- public long getAcceptedCount() { return this.recordsAccepted; }
-
- /** Returns the number of records discarded since creation of the last call to resetStatistics. */
- public long getDiscardedCount() { return this.recordsSeen - this.recordsAccepted; }
-
- /** Gets the fraction of records discarded since creation or the last call to resetStatistics(). */
- public double getDiscardedFraction() { return getDiscardedCount() / (double) getSeenCount(); }
-
- /** Gets the fraction of records accepted since creation or the last call to resetStatistics(). */
- public double getAcceptedFraction() { return getAcceptedCount() / (double) getSeenCount(); }
-
- /** Resets the statistics for records seen/accepted/discarded. */
- public void resetStatistics() {
- this.recordsSeen = 0;
- this.recordsAccepted = 0;
- }
-
- /** Gets the target proportion of records that should be retained during downsampling. */
- public double getTargetProportion() {
- return targetProportion;
- }
-
- /** Method for subclasses to record a record as being discarded. */
- protected final void recordDiscardedRecord() { this.recordsSeen++; }
-
- /**
- * Method for subclasses to record a specific record as being accepted. Null may be passed if a record
- * was discarded but access to the object is no longer available.
- */
- protected final void recordAcceptedRecord() { this.recordsSeen++; this.recordsAccepted++; }
-
- /** Record one or more records as having been discarded. */
- protected final void recordDiscardRecords(final long n) {
- this.recordsSeen += n;
- }
-
- /** Record one or more records as having been discarded. */
- protected final void recordAcceptedRecords(final long n) {
- this.recordsSeen += n;
- this.recordsAccepted += n;
- }
-
- /**
- * Indicates whether or not the strategy implemented by this DownsamplingIterator makes any effort to
- * increase accuracy beyond random sampling (i.e. to reduce the delta between the requested proportion
- * of reads and the actually emitted proportion of reads).
- */
- public boolean isHigherAccuracy() {
- return false;
- }
-
- /** Not supported. */
- @Override public void remove() {
- throw new UnsupportedOperationException("remove() not supported in DownsamplingIterators");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java b/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java
deleted file mode 100644
index d54e706..0000000
--- a/src/main/java/htsjdk/samtools/DownsamplingIteratorFactory.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.util.Iterator;
-
-/**
- * A factory for creating DownsamplingIterators that uses a number of different strategies to achieve downsampling while
- * meeting various criteria.
- *
- * @author Tim Fennell
- */
-public class DownsamplingIteratorFactory {
- public static final String HIGH_ACCURACY_DESCRIPTION =
- "Attempts (but does not guarantee) to provide accuracy up to a specified limit. Accuracy is defined as emitting " +
- "a proportion of reads as close to the requested proportion as possible. In order to do so this strategy requires " +
- "memory that is proportional to the number of template names in the incoming stream of reads, and will thus require " +
- "large amounts of memory when running on large input files.";
-
- public static final String CONSTANT_MEMORY_DESCRPTION =
- "Downsamples a stream or file of SAMRecords using a hash-projection strategy such that it can run in constant memory. " +
- "The downsampling is stochastic, and therefore the actual retained proportion will vary around the requested proportion. Due " +
- "to working in fixed memory this strategy is good for large inputs, and due to the stochastic nature the accuracy of this strategy " +
- "is highest with a high number of output records, and diminishes at low output volumes.";
-
- public static final String CHAINED_DESCRIPTION =
- "Attempts to provide a compromise strategy that offers some of the advantages of both the ConstantMemory and HighAccuracy strategies. " +
- "Uses a ConstantMemory strategy to downsample the incoming stream to approximately the desired proportion, and then a HighAccuracy " +
- "strategy to finish. Works in a single pass, and will provide accuracy close to (but often not as good as) HighAccuracy while requiring " +
- "memory proportional to the set of reads emitted from the ConstantMemory strategy to the HighAccuracy strategy. Works well when downsampling " +
- "large inputs to small proportions (e.g. downsampling hundreds of millions of reads and retaining only 2%. Should be accurate 99.9% of the time " +
- "when the input contains >= 50,000 templates (read names). For smaller inputs, HighAccuracy is recommended instead.";
-
- /** Describes the available downsampling strategies. */
- public enum Strategy {
- HighAccuracy(HIGH_ACCURACY_DESCRIPTION),
- ConstantMemory(CONSTANT_MEMORY_DESCRPTION),
- Chained(CHAINED_DESCRIPTION);
-
- public final String description;
-
- Strategy(final String description) {
- this.description = description;
- }
-
- /** Gets the description of the strategy. */
- public String getDescription() {
- return description;
- }
- }
-
- /**
- * Creates a new DownsamplingIterator using the supplied Strategy that attempts to read from the provided iterator and return
- * approximately proportion of the records read.
- *
- * @param iterator The iterator from which to consume SAMRecords
- * @param strategy The downsampling strategy to use
- * @param proportion The proportion of records the downsampling strategy should attempt to emit
- * @param accuracy If supported by the downsampling strategy, the accuracy goal for the downsampler. Higher accuracy will generally
- * require higher memory usage. An accuracy value of 0.0001 tells the strategy to try and ensure the emitted proportion
- * is within proportion +/0 0.0001.
- * @param seed The seed value to use for any random process used in down-sampling.
- */
- public static DownsamplingIterator make(final Iterator<SAMRecord> iterator, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
- if (strategy == null) throw new IllegalArgumentException("strategy may not be null");
- if (iterator == null) throw new IllegalArgumentException("iterator may not be null");
- if (proportion < 0) throw new IllegalArgumentException("proportion must be greater than 0");
- if (proportion > 1) throw new IllegalArgumentException("proportion must be less than 1");
-
- switch (strategy) {
- case HighAccuracy: return new HighAccuracyDownsamplingIterator(iterator, proportion, seed).setTargetAccuracy(accuracy);
- case ConstantMemory: return new ConstantMemoryDownsamplingIterator(iterator, proportion, seed);
- case Chained: return new ChainedDownsamplingIterator(iterator, proportion, seed).setTargetAccuracy(accuracy);
- default: throw new IllegalStateException("Unexpected value for Strategy enum in switch statement. Bug!!");
- }
- }
-
- /**
- * Convenience method that constructs a downsampling iterator for all the reads in a SAM file.
- * See {@link DownsamplingIteratorFactory#make(Iterator, Strategy, double, double, int)} for detailed parameter information.
- */
- public static DownsamplingIterator make(final File samFile, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
- IOUtil.assertFileIsReadable(samFile);
- return make(SamReaderFactory.makeDefault().open(samFile), strategy, proportion, accuracy, seed);
- }
-
- /**
- * Convenience method that constructs a downsampling iterator for all the reads available from a SamReader.
- * See {@link DownsamplingIteratorFactory#make(Iterator, Strategy, double, double, int)} for detailed parameter information.
- */
- public static DownsamplingIterator make(final SamReader reader, final Strategy strategy, final double proportion, final double accuracy, final int seed) {
- return make(reader.iterator(), strategy, proportion, accuracy, seed);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java b/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java
deleted file mode 100644
index 1abd514..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateScoringStrategy.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-
-/**
- * This class helps us compute and compare duplicate scores, which are used for selecting the non-duplicate
- * during duplicate marking (see MarkDuplicates).
- * @author nhomer
- */
-public class DuplicateScoringStrategy {
-
- public enum ScoringStrategy {
- SUM_OF_BASE_QUALITIES,
- TOTAL_MAPPED_REFERENCE_LENGTH,
- RANDOM,
- }
-
- /** Hash used for the RANDOM scoring strategy. */
- private static final Murmur3 hasher = new Murmur3(1);
-
- /** An enum to use for storing temporary attributes on SAMRecords. */
- private static enum Attr { DuplicateScore }
-
- /** Calculates a score for the read which is the sum of scores over Q15. */
- private static short getSumOfBaseQualities(final SAMRecord rec) {
- short score = 0;
- for (final byte b : rec.getBaseQualities()) {
- if (b >= 15) score += b;
- }
-
- return score;
- }
-
- /**
- * Returns the duplicate score computed from the given fragment.
- */
- public static short computeDuplicateScore(final SAMRecord record, final ScoringStrategy scoringStrategy) {
- return computeDuplicateScore(record, scoringStrategy, false);
- }
-
- /**
- * Returns the duplicate score computed from the given fragment.
- *
- * If true is given to assumeMateCigar, then any score that can use the mate cigar to compute the mate's score will return the score
- * computed on both ends.
- */
- public static short computeDuplicateScore(final SAMRecord record, final ScoringStrategy scoringStrategy, final boolean assumeMateCigar) {
- Short storedScore = (Short) record.getTransientAttribute(Attr.DuplicateScore);
-
- if (storedScore == null) {
- short score = 0;
-
- switch (scoringStrategy) {
- case SUM_OF_BASE_QUALITIES:
- score += getSumOfBaseQualities(record);
- break;
- case TOTAL_MAPPED_REFERENCE_LENGTH:
- if (!record.getReadUnmappedFlag()) {
- score += record.getCigar().getReferenceLength();
- }
- if (assumeMateCigar && record.getReadPairedFlag() && !record.getMateUnmappedFlag()) {
- score += SAMUtils.getMateCigar(record).getReferenceLength();
- }
- break;
- case RANDOM:
- score += (short) (hasher.hashUnencodedChars(record.getReadName()) >> 16);
- }
-
- storedScore = score;
- record.setTransientAttribute(Attr.DuplicateScore, storedScore);
- }
-
- return storedScore;
- }
-
- /**
- * Compare two records based on their duplicate scores. If the scores are equal, we break ties based on mapping quality
- * (added to the mate's mapping quality if paired and mapped), then library/read name.
- *
- * If true is given to assumeMateCigar, then any score that can use the mate cigar to to compute the mate's score will return the score
- * computed on both ends.
- *
- * We allow different scoring strategies. We return <0 if rec1 has a better strategy than rec2.
- */
- public static int compare(final SAMRecord rec1, final SAMRecord rec2, final ScoringStrategy scoringStrategy, final boolean assumeMateCigar) {
- int cmp;
-
- // always prefer paired over non-paired
- if (rec1.getReadPairedFlag() != rec2.getReadPairedFlag()) return rec1.getReadPairedFlag() ? 1 : -1;
-
- cmp = computeDuplicateScore(rec2, scoringStrategy, assumeMateCigar) - computeDuplicateScore(rec1, scoringStrategy, assumeMateCigar);
-
- /**
- * Finally, use library ID and read name
- * This is important because we cannot control the order in which reads appear for reads that are comparable up to now (i.e. cmp == 0). We want to deterministically
- * choose them, and so we need this.
- */
- if (0 == cmp) cmp = SAMUtils.getCanonicalRecordName(rec1).compareTo(SAMUtils.getCanonicalRecordName(rec2));
-
- return cmp;
- }
-
- /**
- * Compare two records based on their duplicate scores. The duplicate scores for each record is assume to be
- * pre-computed by computeDuplicateScore and stored in the "DS" tag. If the scores are equal, we break
- * ties based on mapping quality (added to the mate's mapping quality if paired and mapped), then library/read name.
- *
- * We allow different scoring strategies. We return <0 if rec1 has a better strategy than rec2.
- */
- public static int compare(final SAMRecord rec1, final SAMRecord rec2, final ScoringStrategy scoringStrategy) {
- return compare(rec1, rec2, scoringStrategy, false);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/DuplicateSet.java b/src/main/java/htsjdk/samtools/DuplicateSet.java
deleted file mode 100644
index 8333069..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateSet.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Stores a set of records that are duplicates of each other. The first records in the list of records is
- * considered the representative of the duplicate, and typically does not have it's duplicate flag set.
- * The records' duplicate flag will be set appropriately as records are added. This behavior can be
- * turned off.
- *
- * At this time, this set does not track optical duplicates.
- *
- * @author nhomer
- */
-public class DuplicateSet {
-
- private final List<SAMRecord> records;
-
- private static final SAMRecordDuplicateComparator defaultComparator = new SAMRecordDuplicateComparator();
-
- private final SAMRecordDuplicateComparator comparator;
-
- private SAMRecord representative = null;
-
- private boolean needsSorting = false;
-
- private boolean setDuplicateFlag = false;
-
- /** Sets the duplicate flag by default */
- public DuplicateSet() {
- this(true);
- }
-
- public DuplicateSet(final boolean setDuplicateFlag) {
- this(setDuplicateFlag, defaultComparator);
- }
-
- public DuplicateSet(final SAMRecordDuplicateComparator comparator) {
- this(true, comparator);
- }
-
- public DuplicateSet(final boolean setDuplicateFlag, final SAMRecordDuplicateComparator comparator) {
- records = new ArrayList<SAMRecord>(10);
- this.setDuplicateFlag = setDuplicateFlag;
- this.comparator = comparator;
- }
-
- /**
- * Adds a record to the set and returns zero if either the set is empty, or it is a duplicate of the records already in the set. Otherwise,
- * it does not add the record and returns non-zero.
- * @param record the record to add.
- * @return zero if the record belongs in this set, -1 in a previous set, or 1 in a subsequent set, according to the comparison order
- */
- public int add(final SAMRecord record) {
-
- if (!this.records.isEmpty()) {
- final int cmp = this.comparator.duplicateSetCompare(this.representative, record);
- if (0 != cmp) {
- return cmp;
- }
-
- // update representative
- if (0 < this.comparator.compare(this.representative, record)) {
- this.representative = record;
- }
- }
- else {
- this.representative = record;
- }
-
- this.records.add(record);
- needsSorting = true;
-
- return 0;
- }
-
- private void sort() {
- if (!records.isEmpty()) {
- if (1 < records.size()) {
- Collections.sort(records, this.comparator);
- }
-
- if (setDuplicateFlag) {
- // reset duplicate flags
- for (final SAMRecord record : records) {
- if (!record.getReadUnmappedFlag() && !record.isSecondaryOrSupplementary() && !record.getReadName().equals(representative.getReadName())) {
- record.setDuplicateReadFlag(true);
- }
- }
- records.get(0).setDuplicateReadFlag(false);
- }
-
- if (!records.get(0).equals(this.representative)) {
- throw new SAMException("BUG: the representative was not the first record after sorting."
- + "\nFIRST: " + records.get(0).getSAMString() + "\nSECOND: " + this.representative.getSAMString());
- }
- }
- needsSorting = false; // this could be in the if above if you think hard about it
- }
-
- /**
- * Gets the list of records from this set.
- *
- * Setting sort to false likely will not yield records in duplicate order within the set.
- *
- * @param sort true if we want the records in the duplicate set sorted by duplicate order, false if we do not care about the order.
- */
- public List<SAMRecord> getRecords(final boolean sort) {
- if (sort && needsSorting) {
- sort();
- }
-
- return this.records;
- }
-
- /**
- * Gets the list of records from this set.
- */
- public List<SAMRecord> getRecords() {
- return getRecords(true);
- }
-
- /**
- * Gets the representative record according to the duplicate comparator.
- */
- public SAMRecord getRepresentative() {
- return this.representative;
- }
-
- /**
- * Returns the number of records in this set.
- */
- public int size() {
- return this.records.size();
- }
-
- /**
- * Returns the number of duplicates in this set, including the representative record. Does not include records that are unmapped,
- * secondary, or supplementary.
- */
- public int numDuplicates() {
- int n = 0;
- for (final SAMRecord record : records) {
- if (!record.getReadUnmappedFlag() && !record.isSecondaryOrSupplementary()) {
- n++;
- }
- }
- return n;
- }
-
- public boolean isEmpty() {
- return this.records.isEmpty();
- }
-
- /**
- * Controls if we should update the duplicate flag of the records in this set.
- */
- public void setDuplicateFlag(final boolean setDuplicateFlag) { this.setDuplicateFlag = setDuplicateFlag; }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/DuplicateSetIterator.java b/src/main/java/htsjdk/samtools/DuplicateSetIterator.java
deleted file mode 100644
index 9a0c6f1..0000000
--- a/src/main/java/htsjdk/samtools/DuplicateSetIterator.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.File;
-import java.util.Collections;
-
-/**
- * An iterator of sets of duplicates. Duplicates are defined currently by the ordering in
- * SAMRecordDuplicateComparator.
- * <p/>
- * If the input records are not pre-sorted according to the duplicate ordering, the records
- * will be sorted on-the-fly. This may require extra memory or disk to buffer records, and
- * also computational time to perform the sorting.
- *
- * @author nhomer
- */
-public class DuplicateSetIterator implements CloseableIterator<DuplicateSet> {
-
- private final CloseableIterator<SAMRecord> wrappedIterator;
-
- private DuplicateSet duplicateSet = null;
-
- private final SAMRecordDuplicateComparator comparator;
-
- public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator, final SAMFileHeader header) {
- this(iterator, header, false);
- }
-
- public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
- final SAMFileHeader header,
- final boolean preSorted) {
- this(iterator, header, preSorted, null);
- }
-
- public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
- final SAMFileHeader header,
- final boolean preSorted,
- final SAMRecordDuplicateComparator comparator) {
- this(iterator, header, preSorted, comparator, null);
- }
-
- /**
- * Allows the user of this iterator to skip the sorting of the input if the input is already sorted. If the records are said to be
- * sorted but not actually sorted in the correct order, an exception during iteration will be thrown. Progress information will
- * be printed for sorting of the input if `log` is provided.
- */
- public DuplicateSetIterator(final CloseableIterator<SAMRecord> iterator,
- final SAMFileHeader header,
- final boolean preSorted,
- final SAMRecordDuplicateComparator comparator,
- final Log log) {
- this.comparator = (comparator == null) ? new SAMRecordDuplicateComparator(Collections.singletonList(header)) : comparator;
-
- if (preSorted) {
- this.wrappedIterator = iterator;
- } else {
- ProgressLogger progressLogger = null;
- if (log != null) {
- progressLogger = new ProgressLogger(log, 100000);
- log.info("Duplicate set iterator initializing.");
- }
-
- // Sort it!
- final int maxRecordsInRam = SAMFileWriterImpl.getDefaultMaxRecordsInRam();
- final File tmpDir = new File(System.getProperty("java.io.tmpdir"));
- final SortingCollection<SAMRecord> alignmentSorter = SortingCollection.newInstance(SAMRecord.class,
- new BAMRecordCodec(header), this.comparator,
- maxRecordsInRam, tmpDir);
-
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- alignmentSorter.add(record);
- if (progressLogger != null) progressLogger.record(record);
- }
- iterator.close();
-
- this.wrappedIterator = alignmentSorter.iterator();
- if (log != null) log.info("Duplicate set iterator initialized.");
- }
-
- this.duplicateSet = new DuplicateSet(this.comparator);
-
- if (hasNext()) {
- this.duplicateSet.add(this.wrappedIterator.next());
- }
-
- }
-
- @Deprecated
- /** Do not use this method as the first duplicate set will not be compared with this scoring strategy.
- * Instead, provide a comparator to the constructor that has the scoring strategy set. */
- public void setScoringStrategy(final DuplicateScoringStrategy.ScoringStrategy scoringStrategy) {
- this.comparator.setScoringStrategy(scoringStrategy);
- }
-
- public DuplicateSet next() {
- DuplicateSet duplicateSet = null;
-
- int cmp = 0;
-
- while (0 == cmp) {
- if (!wrappedIterator.hasNext()) { // no more!
- duplicateSet = this.duplicateSet;
- this.duplicateSet = new DuplicateSet(this.comparator);
- break;
- } else {
- // get another one
- final SAMRecord record = this.wrappedIterator.next();
-
- // assumes that the duplicate set always has at least one record inside!
- final SAMRecord representative = this.duplicateSet.getRepresentative();
-
- if (representative.getReadUnmappedFlag() || representative.isSecondaryOrSupplementary()) {
- duplicateSet = this.duplicateSet;
- this.duplicateSet = new DuplicateSet(this.comparator);
- this.duplicateSet.add(record);
- break; // exits the 0 == cmp loop
- } else {
- // compare against the representative for set membership, not ordering
- cmp = this.duplicateSet.add(record);
-
- if (0 < cmp) {
- throw new SAMException("The input records were not sorted in duplicate order:\n" +
- representative.getSAMString() + record.getSAMString());
- } else if (cmp < 0) {
- duplicateSet = this.duplicateSet;
- this.duplicateSet = new DuplicateSet(this.comparator);
- this.duplicateSet.add(record);
- } // otherwise it was already added
- }
- }
- }
-
- return duplicateSet;
- }
-
- public void close() { wrappedIterator.close(); }
-
- public boolean hasNext() {
- return (!duplicateSet.isEmpty() || wrappedIterator.hasNext());
- }
-
- // Does nothing!
- public void remove() { }
-}
diff --git a/src/main/java/htsjdk/samtools/FileTruncatedException.java b/src/main/java/htsjdk/samtools/FileTruncatedException.java
deleted file mode 100644
index 0adf799..0000000
--- a/src/main/java/htsjdk/samtools/FileTruncatedException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Thrown when it is possible to detect that a SAM or BAM file is truncated.
- *
- * @author alecw at broadinstitute.org
- */
-public class FileTruncatedException extends SAMException {
- public FileTruncatedException() {
- }
-
- public FileTruncatedException(final String s) {
- super(s);
- }
-
- public FileTruncatedException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public FileTruncatedException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/FixBAMFile.java b/src/main/java/htsjdk/samtools/FixBAMFile.java
deleted file mode 100755
index 6bea56e..0000000
--- a/src/main/java/htsjdk/samtools/FixBAMFile.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloserUtil;
-
-import java.io.File;
-
-public class FixBAMFile {
- public static void main(String[] args) {
- File inputFile = new File(args[0]);
- File outputFile = new File(args[1]);
- SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inputFile);
- SAMFileHeader header = reader.getFileHeader();
- SAMFileWriter writer = new SAMFileWriterFactory().makeBAMWriter(header, true, outputFile);
- for (SAMRecord record : reader) {
- if (record.getIndexingBin() != null) {
- record.setIndexingBin(record.computeIndexingBin());
- }
- writer.addAlignment(record);
- }
- writer.close();
- CloserUtil.close(reader);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/GenomicIndexUtil.java b/src/main/java/htsjdk/samtools/GenomicIndexUtil.java
deleted file mode 100644
index f634932..0000000
--- a/src/main/java/htsjdk/samtools/GenomicIndexUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.BitSet;
-
-/**
- * Constants and methods used by BAM and Tribble indices
- */
-public class GenomicIndexUtil {
- /**
- * Reports the total amount of genomic data that any bin can index.
- */
- public static final int BIN_GENOMIC_SPAN = 512*1024*1024;
-
- /**
- * What is the starting bin for each level?
- */
- public static final int[] LEVEL_STARTS = {0,1,9,73,585,4681};
-
- /**
- * Reports the maximum number of bins that can appear in a binning index.
- */
- public static final int MAX_BINS = 37450; // =(8^6-1)/7+1
-
- public static final int MAX_LINEAR_INDEX_SIZE = MAX_BINS+1-LEVEL_STARTS[LEVEL_STARTS.length-1];
-
-
- /**
- * E.g. for a SAMRecord with no genomic coordinate.
- */
- public static final int UNSET_GENOMIC_LOCATION = 0;
-
- /**
- * calculate the bin given an alignment in [beg,end)
- * Described in "The Human Genome Browser at UCSC. Kent & al. doi: 10.1101/gr.229102 "
- * @param beg 0-based start of read (inclusive)
- * @param end 0-based end of read (exclusive)
- */
- public static int regionToBin(final int beg, int end)
- {
- --end;
-
- if (beg>>14 == end>>14) return ((1<<15)-1)/7 + (beg>>14);
- if (beg>>17 == end>>17) return ((1<<12)-1)/7 + (beg>>17);
- if (beg>>20 == end>>20) return ((1<<9)-1)/7 + (beg>>20);
- if (beg>>23 == end>>23) return ((1<<6)-1)/7 + (beg>>23);
- if (beg>>26 == end>>26) return ((1<<3)-1)/7 + (beg>>26);
- return 0;
- }
-
- // TODO: It is disturbing that regionToBins is 0-based, but regionToBins is 1-based.
- // TODO: It is also suspicious that regionToBins decrements endPos. Test it!
- // TODO: However end is decremented in regionToBins so perhaps there is no conflict.
- /**
- * Get candidate bins for the specified region
- * @param startPos 1-based start of target region, inclusive.
- * @param endPos 1-based end of target region, inclusive.
- * @return bit set for each bin that may contain SAMRecords in the target region.
- */
- public static BitSet regionToBins(final int startPos, final int endPos) {
- final int maxPos = 0x1FFFFFFF;
- final int start = (startPos <= 0) ? 0 : (startPos-1) & maxPos;
- final int end = (endPos <= 0) ? maxPos : (endPos-1) & maxPos;
- if (start > end) {
- return null;
- }
- int k;
- final BitSet bitSet = new BitSet(GenomicIndexUtil.MAX_BINS);
- bitSet.set(0);
- for (k = 1 + (start>>26); k <= 1 + (end>>26); ++k) bitSet.set(k);
- for (k = 9 + (start>>23); k <= 9 + (end>>23); ++k) bitSet.set(k);
- for (k = 73 + (start>>20); k <= 73 + (end>>20); ++k) bitSet.set(k);
- for (k = 585 + (start>>17); k <= 585 + (end>>17); ++k) bitSet.set(k);
- for (k = 4681 + (start>>14); k <= 4681 + (end>>14); ++k) bitSet.set(k);
- return bitSet;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java b/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java
deleted file mode 100644
index 2dd3b6c..0000000
--- a/src/main/java/htsjdk/samtools/HighAccuracyDownsamplingIterator.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * A DownsamplingIterator that attempts to provide very high accuracy (minimizing the difference between emitted proportion
- * and requested proportion) at the expense of using memory proportional to the number of reads in the incoming stream.
- *
- * @author Tim Fennell
- */
-class HighAccuracyDownsamplingIterator extends DownsamplingIterator {
- private final Iterator<SAMRecord> underlyingIterator;
- private final Random random;
- private SAMRecord nextRecord;
- private final Map<String, Boolean> decisions = new HashMap<String, Boolean>();
-
- private double targetAccuracy = 0.0001;
- private long totalTemplates, keptTemplates;
- private Iterator<SAMRecord> bufferedRecords = new ArrayList<SAMRecord>().iterator();
- private Set<String> bufferedRecordsToKeep;
-
- /** Override method to make it clear that this iterator attempts to provide a higher accuracy of downsampling. */
- @Override public boolean isHigherAccuracy() {
- return true;
- }
-
- /** Constructs a downsampling iterator upon the supplied iterator, using the Random as the source of randomness. */
- HighAccuracyDownsamplingIterator(final Iterator<SAMRecord> iterator, final double proportion, final int seed) {
- super(proportion);
- this.underlyingIterator = iterator;
- this.random = new Random(seed);
- }
-
- /**
- * Sets the target accuracy of the downsampling iterator. The value should be thought of as
- * probability +/- accuracy. So a value of 0.001 would instruct the downsampling iterator to
- * attempt to guarantee at accuracy to within 0.1%. The downsampler will need to buffer reads
- * for 1/accuracy templates, so setting this to extremely small numbers is not advisable.
- */
- public DownsamplingIterator setTargetAccuracy(final double accuracy) {
- if (accuracy >= 1 || accuracy <= 1d/Integer.MAX_VALUE) throw new IllegalArgumentException("Illegal value. Must be 1/MAX_INT < accuracy < 1");
- this.targetAccuracy = accuracy;
- return this;
- }
-
- /** Returns true if there is another record available post-downsampling, false otherwise. */
- @Override public boolean hasNext() {
- return this.nextRecord != null || advance();
- }
-
- /** Returns the next record from the iterator, or throws an exception if there is no next record. */
- @Override public SAMRecord next() {
- if (this.nextRecord == null) {
- throw new NoSuchElementException("Call to next() when hasNext() == false");
- }
- else {
- final SAMRecord retval = this.nextRecord;
- advance();
- return retval;
- }
- }
-
- /** Returns the underlying iterator so that subclasses may manipulate it. */
- protected Iterator<SAMRecord> getUnderlyingIterator() {
- return this.underlyingIterator;
- }
-
- /**
- * Clears the current record and attempts to advance through the underlying iterator until a
- * record is kept during downsampling. If no more records are kept and the end of the input
- * is reached this.nextRecord will be null.
- *
- * @return true if a record is available after advancing, false otherwise
- */
- protected boolean advance() {
- this.nextRecord = null;
-
- while (this.nextRecord == null && (this.bufferedRecords.hasNext() || bufferNextChunkOfRecords(getTargetProportion(), this.targetAccuracy))) {
- final SAMRecord rec = this.bufferedRecords.next();
- final String key = rec.getReadName();
- final Boolean previous = decisions.get(key);
- final boolean keepThisRecord;
-
- if (previous == null) {
- keepThisRecord = this.bufferedRecordsToKeep.contains(rec.getReadName());
- decisions.put(key, keepThisRecord);
- }
- else {
- keepThisRecord = previous;
- }
-
- if (keepThisRecord) {
- this.nextRecord = rec;
- recordAcceptedRecord();
- }
- else {
- recordDiscardedRecord();
- }
- }
-
- return this.nextRecord != null;
- }
-
- /**
- * Buffers reads until either the end of the file is reached or enough reads have been buffered such
- * that downsampling can be performed to the desired target accuracy. Once reads have been buffered,
- * template names are randomly sampled out for discarding until the desired number of reads have
- * been discarded.
- *
- * @return True if one or more reads have been buffered, false otherwise
- */
- protected boolean bufferNextChunkOfRecords(final double proportion, final double accuracy) {
- final int templatesToRead = (int) Math.ceil(1 / accuracy);
- final Set<String> names = new HashSet<String>();
- final List<SAMRecord> recs = new ArrayList<SAMRecord>(templatesToRead);
-
- readFromUnderlyingIterator(recs, names, templatesToRead);
-
- // Determine how many templates to keep/discard
- final int templatesRead = names.size();
- final int templatesToKeep = calculateTemplatesToKeep(templatesRead, proportion);
-
- // Randomly shuffle a list of all the template names, and then remove some from the set
- final int templatesToDiscard = templatesRead - templatesToKeep;
- final List<String> tmp = new ArrayList<String>(names);
- Collections.shuffle(tmp, this.random);
- for (int i = 0; i < templatesToDiscard; ++i) names.remove(tmp.get(i));
-
- // Set all the instance state so that advance()/next() get what they need
- this.bufferedRecordsToKeep = names;
- this.bufferedRecords = recs.iterator();
- this.totalTemplates += templatesRead;
- this.keptTemplates += names.size();
- return !recs.isEmpty();
- }
-
- /**
- * Calculates the number of templates to keep in a specific batch of reads having just read templatesRead reads
- * and wanting to keep proportion of them. Rounds the final number up or down based on whether, to this point,
- * the iterator is under or over it's goal proportion.
- *
- * Implemented as second method to allow ChainedDownsamplingIterator to tamper with the strategy!
- */
- protected int calculateTemplatesToKeep(final int templatesRead, final double proportion) {
- final double rawTemplatesToKeep = templatesRead * proportion;
- return (keptTemplates / (double) totalTemplates < proportion)
- ? (int) Math.ceil(rawTemplatesToKeep) : (int) Math.floor(rawTemplatesToKeep);
- }
-
- /**
- * Reads from the underlying iterator until it has observed templatesToRead templates (i.e. read names) that it has not yet
- * observed, so that templatesToRead new keep/reject decisions can be made. The records that are read are placed into recs
- * and _novel_ template names are placed into names.
- */
- protected void readFromUnderlyingIterator(final List<SAMRecord> recs, final Set<String> names, final int templatesToRead) {
- while (this.underlyingIterator.hasNext() && names.size() < templatesToRead) {
- final SAMRecord rec = this.underlyingIterator.next();
- recs.add(rec);
-
- if (this.decisions.containsKey(rec.getReadName())) continue;
- names.add(rec.getReadName());
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/LinearIndex.java b/src/main/java/htsjdk/samtools/LinearIndex.java
deleted file mode 100644
index bccdfe8..0000000
--- a/src/main/java/htsjdk/samtools/LinearIndex.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Arrays;
-
-/**
- * The linear index associated with a given reference in a BAM index.
- *
- * @author mhanna
- * @version 0.1
- */
-public class LinearIndex {
-
- public static final int MAX_LINEAR_INDEX_SIZE = GenomicIndexUtil.MAX_LINEAR_INDEX_SIZE;
-
- public static final int BAM_LIDX_SHIFT = 14;
-
- /**
- * The reference sequence number for this linear index.
- */
- private final int mReferenceSequence;
-
- /**
- * Dictates the first stored element of the index.
- */
- private final int mIndexStart;
-
- /**
- * The linear index entries within this bin.
- */
- private final long[] mIndexEntries;
-
- public LinearIndex(final int referenceSequence, final int indexStart, final long[] indexEntries) {
- this.mReferenceSequence = referenceSequence;
- this.mIndexStart = indexStart;
- this.mIndexEntries = indexEntries;
- }
-
- public int getReferenceSequence() {
- return mReferenceSequence;
- }
-
- public int size() {
- return mIndexEntries.length;
- }
-
- public long get(final int index) {
- return mIndexEntries[index-mIndexStart];
- }
-
- public static int convertToLinearIndexOffset(final int contigPos) {
- final int indexPos = (contigPos <= 0) ? 0 : contigPos-1;
- return indexPos >> BAM_LIDX_SHIFT;
- }
-
- /**
- * Gets the minimum offset of any alignment start appearing in this index, according to the linear index.
- * @param startPos Starting position for this query.
- * @return The minimum offset, in chunk format, of any read appearing in this position.
- */
- public long getMinimumOffset(final int startPos) {
- final int start = (startPos <= 0) ? 0 : startPos-1;
- final int regionLinearBin = start >> BAM_LIDX_SHIFT;
- // System.out.println("# regionLinearBin: " + regionLinearBin);
- long minimumOffset = 0;
- if (regionLinearBin-mIndexStart < mIndexEntries.length)
- minimumOffset = mIndexEntries[regionLinearBin-mIndexStart];
- return minimumOffset;
- }
-
- /**
- * Direct access to the array. Be careful!
- * @return The elements of the linear index.
- */
- public long[] getIndexEntries() {
- return mIndexEntries;
- }
-
- public int getIndexStart() {
- return mIndexStart;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final LinearIndex that = (LinearIndex) o;
-
- if (mIndexStart != that.mIndexStart) return false;
- if (mReferenceSequence != that.mReferenceSequence) return false;
- if (!Arrays.equals(mIndexEntries, that.mIndexEntries)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = mReferenceSequence;
- result = 31 * result + mIndexStart;
- result = 31 * result + Arrays.hashCode(mIndexEntries);
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java b/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java
deleted file mode 100644
index a294752..0000000
--- a/src/main/java/htsjdk/samtools/MergingSamRecordIterator.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.PriorityQueue;
-
-/**
- * Provides an iterator interface for merging multiple underlying iterators into a single
- * iterable stream. The underlying iterators/files must all have the same sort order unless
- * the requested output format is unsorted, in which case any combination is valid.
- */
-public class MergingSamRecordIterator implements CloseableIterator<SAMRecord> {
- private final PriorityQueue<ComparableSamRecordIterator> pq;
- private final SamFileHeaderMerger samHeaderMerger;
- private final Collection<SamReader> readers;
- private final SAMFileHeader.SortOrder sortOrder;
- private final SAMRecordComparator comparator;
-
- private boolean initialized = false;
-
- /**
- * Constructs a new merging iterator with the same set of readers and sort order as
- * provided by the header merger parameter.
- *
- * @param headerMerger The merged header and contents of readers.
- * @param forcePresorted True to ensure that the iterator checks the headers of the readers for appropriate sort order.
- * @deprecated replaced by {@link #MergingSamRecordIterator(SamFileHeaderMerger, Collection, boolean)}
- */
- @Deprecated
- public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, final boolean forcePresorted) {
- this(headerMerger, headerMerger.getReaders(), forcePresorted);
- }
-
- /**
- * Constructs a new merging iterator with the same set of readers and sort order as
- * provided by the header merger parameter.
- *
- * @param headerMerger The merged header and contents of readers.
- * @param assumeSorted false ensures that the iterator checks the headers of the readers for appropriate sort order.
- */
- public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, Collection<SamReader> readers, final boolean assumeSorted) {
- this.samHeaderMerger = headerMerger;
- this.sortOrder = headerMerger.getMergedHeader().getSortOrder();
- this.comparator = getComparator();
- this.readers = readers;
-
- this.pq = new PriorityQueue<ComparableSamRecordIterator>(readers.size());
-
- for (final SamReader reader : readers) {
- if (!samHeaderMerger.getHeaders().contains(reader.getFileHeader()))
- throw new SAMException("All iterators to be merged must be accounted for in the SAM header merger");
- if (!assumeSorted && this.sortOrder != SAMFileHeader.SortOrder.unsorted &&
- reader.getFileHeader().getSortOrder() != this.sortOrder) {
- throw new SAMException("Files are not compatible with sort order");
- }
- }
- }
-
- /**
- * Add a set of SAM file iterators to the merging iterator. Use this to restrict the merged iteration to a given genomic interval,
- * rather than iterating over every read in the backing file or stream.
- *
- * @param headerMerger The merged header and contents of readers.
- * @param iterators Iterator traversing over reader contents.
- */
- public MergingSamRecordIterator(final SamFileHeaderMerger headerMerger, final Map<SamReader, CloseableIterator<SAMRecord>> iterators, final boolean assumeSorted) {
- this(headerMerger, iterators.keySet(), assumeSorted);
- for (final Map.Entry<SamReader, CloseableIterator<SAMRecord>> mapping : iterators.entrySet())
- addIfNotEmpty(new ComparableSamRecordIterator(mapping.getKey(), mapping.getValue(), comparator));
- initialized = true;
- }
-
- private void startIterationIfRequired() {
- if (initialized)
- return;
- for (final SamReader reader : readers)
- addIfNotEmpty(new ComparableSamRecordIterator(reader, reader.iterator(), comparator));
- initialized = true;
- }
-
- /**
- * Close down all open iterators.
- */
- public void close() {
- // Iterators not in the priority queue have already been closed; only close down the iterators that are still in the priority queue.
- for (CloseableIterator<SAMRecord> iterator : pq)
- iterator.close();
- }
-
- /** Returns true if any of the underlying iterators has more records, otherwise false. */
- public boolean hasNext() {
- startIterationIfRequired();
- return !this.pq.isEmpty();
- }
-
- /** Returns the next record from the top most iterator during merging. */
- public SAMRecord next() {
- startIterationIfRequired();
-
- final ComparableSamRecordIterator iterator = this.pq.poll();
- final SAMRecord record = iterator.next();
- addIfNotEmpty(iterator);
- // this will resolve the reference indices against the new, merged header
- record.setHeader(this.samHeaderMerger.getMergedHeader());
-
- // Fix the read group if needs be
- if (this.samHeaderMerger.hasReadGroupCollisions()) {
- final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.READ_GROUP_ID);
- if (oldGroupId != null) {
- final String newGroupId = this.samHeaderMerger.getReadGroupId(iterator.getReader().getFileHeader(), oldGroupId);
- record.setAttribute(ReservedTagConstants.READ_GROUP_ID, newGroupId);
- }
- }
-
- // Fix the program group if needs be
- if (this.samHeaderMerger.hasProgramGroupCollisions()) {
- final String oldGroupId = (String) record.getAttribute(ReservedTagConstants.PROGRAM_GROUP_ID);
- if (oldGroupId != null) {
- final String newGroupId = this.samHeaderMerger.getProgramGroupId(iterator.getReader().getFileHeader(), oldGroupId);
- record.setAttribute(ReservedTagConstants.PROGRAM_GROUP_ID, newGroupId);
- }
- }
-
- return record;
- }
-
- /**
- * Adds iterator to priority queue. If the iterator has more records it is added
- * otherwise it is closed and not added.
- */
- private void addIfNotEmpty(final ComparableSamRecordIterator iterator) {
- if (iterator.hasNext()) {
- pq.offer(iterator);
- } else {
- iterator.close();
- }
- }
-
- /** Unsupported operation. */
- public void remove() {
- throw new UnsupportedOperationException("MergingSAMRecorderIterator.remove()");
- }
-
- /**
- * Get the right comparator for a given sort order (coordinate, alphabetic). In the
- * case of "unsorted" it will return a comparator that gives an arbitrary but reflexive
- * ordering.
- */
- private SAMRecordComparator getComparator() {
- // For unsorted build a fake comparator that compares based on object ID
- if (this.sortOrder == SAMFileHeader.SortOrder.unsorted) {
- return new SAMRecordComparator() {
- public int fileOrderCompare(final SAMRecord lhs, final SAMRecord rhs) {
- return System.identityHashCode(lhs) - System.identityHashCode(rhs);
- }
-
- public int compare(final SAMRecord lhs, final SAMRecord rhs) {
- return fileOrderCompare(lhs, rhs);
- }
- };
- }
- if (samHeaderMerger.hasMergedSequenceDictionary() && sortOrder.equals(SAMFileHeader.SortOrder.coordinate)) {
- return new MergedSequenceDictionaryCoordinateOrderComparator();
- }
-
- // Otherwise try and figure out what kind of comparator to return and build it
- return this.sortOrder.getComparatorInstance();
- }
-
- /** Returns the merged header that the merging iterator is working from. */
- public SAMFileHeader getMergedHeader() {
- return this.samHeaderMerger.getMergedHeader();
- }
-
- /**
- * Ugh. Basically does a regular coordinate compare, but looks up the sequence indices in the merged
- * sequence dictionary. I hate the fact that this extends SAMRecordCoordinateComparator, but it avoids
- * more copy & paste.
- */
- private class MergedSequenceDictionaryCoordinateOrderComparator extends SAMRecordCoordinateComparator implements Serializable {
- private static final long serialVersionUID = 1L;
-
- public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- final int referenceIndex1 = getReferenceIndex(samRecord1);
- final int referenceIndex2 = getReferenceIndex(samRecord2);
- if (referenceIndex1 != referenceIndex2) {
- if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return 1;
- } else if (referenceIndex2 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return -1;
- } else {
- return referenceIndex1 - referenceIndex2;
- }
- }
- if (referenceIndex1 == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- // Both are unmapped.
- return 0;
- }
- return samRecord1.getAlignmentStart() - samRecord2.getAlignmentStart();
- }
-
- private int getReferenceIndex(final SAMRecord samRecord) {
- if (samRecord.getReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getReferenceIndex());
- }
- if (samRecord.getMateReferenceIndex() != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- return samHeaderMerger.getMergedSequenceIndex(samRecord.getHeader(), samRecord.getMateReferenceIndex());
- }
- return SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java b/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java
deleted file mode 100644
index 787da16..0000000
--- a/src/main/java/htsjdk/samtools/NotPrimarySkippingIterator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekIterator;
-
-/**
- * Wrapper around SAMRecord iterator that skips over non-primary elements.
- * This iterator conflates a filtering iterator and a peekable iterator. It would be cleaner to
- * handle those concerns separately.
- */
-public class NotPrimarySkippingIterator {
- private final PeekIterator<SAMRecord> it;
-
- public NotPrimarySkippingIterator(final CloseableIterator<SAMRecord> underlyingIt) {
- it = new PeekIterator<SAMRecord>(underlyingIt);
- skipAnyNotprimary();
- }
-
- public boolean hasCurrent() {
- return it.hasNext();
- }
-
- public SAMRecord getCurrent() {
- assert(hasCurrent());
- return it.peek();
- }
-
- public boolean advance() {
- it.next();
- skipAnyNotprimary();
- return hasCurrent();
- }
-
- private void skipAnyNotprimary() {
- while (it.hasNext() && it.peek().getNotPrimaryAlignmentFlag()) {
- it.next();
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/QueryInterval.java b/src/main/java/htsjdk/samtools/QueryInterval.java
deleted file mode 100644
index bdfb52c..0000000
--- a/src/main/java/htsjdk/samtools/QueryInterval.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CoordMath;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Interval relative to a reference, for querying a BAM file.
- */
-public class QueryInterval implements Comparable<QueryInterval> {
-
- /** Index of reference sequence, based on the sequence dictionary of the BAM file being queried. */
- public final int referenceIndex;
- /** 1-based, inclusive */
- public final int start;
- /** 1-based, inclusive. If <= 0, implies that the interval goes to the end of the reference sequence */
- public final int end;
-
-
- public QueryInterval(final int referenceIndex, final int start, final int end) {
- if (referenceIndex < 0) {
- throw new IllegalArgumentException("Invalid reference index " + referenceIndex);
- }
- this.referenceIndex = referenceIndex;
- this.start = start;
- this.end = end;
- }
-
-
- public int compareTo(final QueryInterval other) {
- int comp = this.referenceIndex - other.referenceIndex;
- if (comp != 0) return comp;
- comp = this.start - other.start;
- if (comp != 0) return comp;
- else if (this.end == other.end) return 0;
- else if (this.end == 0) return 1;
- else if (other.end == 0) return -1;
- else return this.end - other.end;
- }
-
- /**
- * @return true if both are on same reference, and other starts exactly where this ends.
- */
- public boolean abuts(final QueryInterval other) {
- return this.referenceIndex == other.referenceIndex && this.end == other.start;
- }
-
- /**
- * @return true if both are on same reference, and the overlap.
- */
- public boolean overlaps(final QueryInterval other) {
- if (this.referenceIndex != other.referenceIndex) {
- return false;
- }
- final int thisEnd = (this.end == 0 ? Integer.MAX_VALUE : this.end);
- final int otherEnd = (other.end == 0 ? Integer.MAX_VALUE : other.end);
- return CoordMath.overlaps(this.start, thisEnd, other.start, otherEnd);
- }
-
- @Override
- public String toString() {
- return String.format("%d:%d-%d", referenceIndex, start, end);
- }
-
- private static final QueryInterval[] EMPTY_QUERY_INTERVAL_ARRAY = new QueryInterval[0];
-
- /**
- * @param inputIntervals WARNING: This list is modified (sorted) by this method.
- * @return Ordered list of intervals in which abutting and overlapping intervals are merged.
- */
- public static QueryInterval[] optimizeIntervals(final QueryInterval[] inputIntervals) {
- if (inputIntervals.length == 0) return EMPTY_QUERY_INTERVAL_ARRAY;
- Arrays.sort(inputIntervals);
-
- final List<QueryInterval> unique = new ArrayList<QueryInterval>();
- QueryInterval previous = inputIntervals[0];
-
-
- for (int i = 1; i < inputIntervals.length; ++i) {
- final QueryInterval next = inputIntervals[i];
- if (previous.abuts(next) || previous.overlaps(next)) {
- final int newEnd = ((previous.end == 0 || next.end == 0) ? 0 : Math.max(previous.end, next.end));
- previous = new QueryInterval(previous.referenceIndex, previous.start, newEnd);
- } else {
- unique.add(previous);
- previous = next;
- }
- }
-
- if (previous != null) unique.add(previous);
-
- return unique.toArray(EMPTY_QUERY_INTERVAL_ARRAY);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/ReservedTagConstants.java b/src/main/java/htsjdk/samtools/ReservedTagConstants.java
deleted file mode 100644
index c0d03b8..0000000
--- a/src/main/java/htsjdk/samtools/ReservedTagConstants.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Constants for tags used in our SAM/BAM files
- */
-public class ReservedTagConstants {
- public static final String READ_GROUP_ID = SAMTag.RG.name(); // Specified in the SAM spec doc
- public static final String PROGRAM_GROUP_ID = SAMTag.PG.name(); // Specified in the SAM spec doc
-
- /** Present and set to 1 if a read is a noise read. */
- public static final String XN = "XN";
-
- /** Number of nucleotide differences (Specified in the SAM spec doc) */
- public static final String NM = SAMTag.NM.name();
-
- /** The sum of the mismatched qualities. */
- public static final String XQ = "XQ";
-
- /**
- * The name of an attribute which stores the 1-based index of the start of
- * sequence within a read (in original orientation) that should be clipped
- * or trimmed before alignment and downstream use.
- * The region to be clipped extends from this position to the end of the read.
- */
- public static final String XT = "XT";
-
- /** The original sequence before 454 cafie and homopolymer correction */
- public static final String XS = "XS";
-
- /** The Four54 edit string of 454 cafie and homopolymer corrections
- * <pre>
- * editString ::= {base operator position [- position]}* ; // Cafie needs 2 positions
- * base ::= A | T | G | C | N ; // N only for undercall
- * operator ::= o | u | c ; // o = Overcall, u = Undercall, c = Cafie.
- * position is 0 based position of the correction (assuming forward strand) . Cafie positions are to-from.
- * For example: XF :Z:Gc4-6Nu11Co15 means a cafie correction moved a G from position 6 to 4,
- * an N was inserted for an undercall at position 11, and a C was removed as an overcall at position 15
- */
- public static final String XF = "XF";
-
- /** The original pred quality scores before modifications such as 454 cafie and homopolymer correction */
- public static final String OQ = SAMTag.OQ.name();
-
- /** The original cigar before indel cleaning, or 454 cafie and homopolymer correction */
- public static final String OC = "OC";
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java b/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java
deleted file mode 100644
index 507e319..0000000
--- a/src/main/java/htsjdk/samtools/SAMBinaryTagAndUnsignedArrayValue.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Simple extension to SAMBinaryTagAndValue in order to distinguish unsigned array values, because
- * signedness cannot be determined by introspection of value. Must be array of byte, short, or int.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMBinaryTagAndUnsignedArrayValue extends SAMBinaryTagAndValue {
- public SAMBinaryTagAndUnsignedArrayValue(final short tag, final Object value) {
- super(tag, value);
- if (!value.getClass().isArray() || value instanceof float[]) {
- throw new IllegalArgumentException("Attribute type " + value.getClass() +
- " cannot be encoded as an unsigned array. Tag: " +
- SAMTagUtil.getSingleton().makeStringTag(tag));
- }
- }
-
- /** Creates and returns a shallow copy of the list of tag/values. */
- @Override
- public SAMBinaryTagAndValue copy() {
- final SAMBinaryTagAndValue retval = new SAMBinaryTagAndUnsignedArrayValue(this.tag, this.value);
- if (next != null) retval.next = next.copy();
- return retval;
- }
-
- /** Creates and returns a deep copy of the list of tag/values. */
- @Override
- public SAMBinaryTagAndValue deepCopy() {
- final SAMBinaryTagAndValue retval = new SAMBinaryTagAndUnsignedArrayValue(this.tag, cloneValue());
- if (next != null) {
- retval.next = next.deepCopy();
- }
- return retval;
- }
-
-
- @Override
- public boolean isUnsignedArray() {
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java b/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java
deleted file mode 100644
index 0778190..0000000
--- a/src/main/java/htsjdk/samtools/SAMBinaryTagAndValue.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * Holds a SAMRecord attribute and the tagname (in binary form) for that attribute.
- * SAMRecord stores tag name and value in this form, because much String creation is avoided this way.
- * See SAMTagUtil to convert the tag to String form.
- *
- * Values associated with attribute tags must be of a type that implements {@link Serializable} or else
- * serialization will fail. Accepted types are String, scalar types Short, Integer, Character, Float,
- * and Long (see below); array types byte[], short[], int[] and float[]. Cannot be null.
- *
- * Long valued attributes are constrained to the range [Integer.MIN_VALUE, BinaryCodec.MAX_UINT],
- * which includes the entire range of signed ints [Integer.MIN_VALUE, Integer.MAX_VALUE] and
- * the entire range of unsigned ints that can be stored per the BAM spec [0, (Integer.MAX_VALUE * 2) + 1].
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMBinaryTagAndValue implements Serializable {
- public static final long serialVersionUID = 1L;
-
- public final short tag;
- public final Object value;
- protected SAMBinaryTagAndValue next = null;
-
- /**
- * @param tag tagname (in binary form) for this attribute
- * @param value value for this attribute (must be of a type that implements {@link Serializable}
- * or else serialization will fail). Cannot be null.
- */
- public SAMBinaryTagAndValue(final short tag, final Object value) {
- if (null == value) {
- throw new IllegalArgumentException("SAMBinaryTagAndValue value may not be null");
- }
- if (!isAllowedAttributeValue(value)) {
- throw new IllegalArgumentException("Attribute type " + value.getClass() + " not supported. Tag: " +
- SAMTagUtil.getSingleton().makeStringTag(tag));
- }
- this.tag = tag;
- this.value = value;
- }
-
- // Inspect the proposed value to determine if it is an allowed value type,
- // and if the value is in range.
- protected static boolean isAllowedAttributeValue(final Object value) {
- if (value instanceof Byte ||
- value instanceof Short ||
- value instanceof Integer ||
- value instanceof String ||
- value instanceof Character ||
- value instanceof Float ||
- value instanceof byte[] ||
- value instanceof short[] ||
- value instanceof int[] ||
- value instanceof float[]) {
- return true;
- }
-
- // A special case for Longs: we require Long values to fit into either a uint32_t or an int32_t,
- // as that is what the BAM spec allows.
- if (value instanceof Long) {
- return SAMUtils.isValidUnsignedIntegerAttribute((Long) value)
- || ((Long) value >= Integer.MIN_VALUE && (Long) value <= Integer.MAX_VALUE);
- }
- return false;
- }
-
- @Override public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- return typeSafeEquals((SAMBinaryTagAndValue) o);
- }
-
- /** Type safe equals method that recurses down the list looking for equality. */
- private boolean typeSafeEquals(final SAMBinaryTagAndValue that) {
- if (this.tag != that.tag) return false;
- if (this.valueEquals(that)) {
- if (this.next == null) return that.next == null;
- else return this.next.equals(that.next);
- }
- else {
- return false;
- }
- }
-
- private boolean valueEquals(SAMBinaryTagAndValue that) {
- if (this.value instanceof byte[]) {
- return that.value instanceof byte[] ?
- Arrays.equals((byte[])this.value, (byte[])that.value) : false;
- }
- else if (this.value instanceof short[]) {
- return that.value instanceof short[] ?
- Arrays.equals((short[])this.value, (short[])that.value) : false;
- }
- else if (this.value instanceof int[]) {
- return that.value instanceof int[] ?
- Arrays.equals((int[])this.value, (int[])that.value) : false;
- }
- else if (this.value instanceof float[]) {
- return that.value instanceof float[] ?
- Arrays.equals((float[])this.value, (float[])that.value) : false;
- }
- else {
- // otherwise, the api limits the remaining possible value types to
- // immutable (String or boxed primitive) types
- return this.value.equals(that.value);
- }
- }
-
- @Override
- public int hashCode() {
- int valueHash;
- if (this.value instanceof byte[]) {
- valueHash = Arrays.hashCode((byte[])this.value);
- }
- else if (this.value instanceof short[]) {
- valueHash = Arrays.hashCode((short[])this.value);
- }
- else if (this.value instanceof int[]) {
- valueHash = Arrays.hashCode((int[])this.value);
- }
- else if (this.value instanceof float[]) {
- valueHash = Arrays.hashCode((float[])this.value);
- }
- else {
- // otherwise, the api limits the remaining possible value types to
- // immutable (String or boxed primitive) types
- valueHash = value.hashCode();
- }
-
- return 31 * tag + valueHash;
- }
-
- /** Creates and returns a shallow copy of the list of tag/values. */
- public SAMBinaryTagAndValue copy() {
- final SAMBinaryTagAndValue retval = new SAMBinaryTagAndValue(this.tag, this.value);
- if (next != null) {
- retval.next = next.copy();
- }
- return retval;
- }
-
- /** Creates and returns a deep copy of the list of tag/values. */
- public SAMBinaryTagAndValue deepCopy() {
- final SAMBinaryTagAndValue retval = new SAMBinaryTagAndValue(this.tag, cloneValue());
- if (next != null) {
- retval.next = next.deepCopy();
- }
- return retval;
- }
-
- /* Create and return a clone of value object */
- protected Object cloneValue() {
- Object valueClone;
-
- if (value instanceof byte[]) {
- valueClone = ((byte[]) value).clone();
- }
- else if (value instanceof short[]) {
- valueClone = ((short[]) value).clone();
- }
- else if (value instanceof int[]) {
- valueClone = ((int[]) value).clone();
- }
- else if (value instanceof float[]) {
- valueClone = ((float[]) value).clone();
- }
- else {
- // otherwise, the api limits the remaining possible value types to
- // immutable (String or boxed primitive) types
- valueClone = value;
- }
- return valueClone;
- }
-
- // The methods below are for implementing a light-weight, single-direction linked list
-
- public SAMBinaryTagAndValue getNext() { return this.next; }
-
- /** Inserts at item into the ordered list of attributes and returns the head of the list/sub-list */
- public SAMBinaryTagAndValue insert(final SAMBinaryTagAndValue attr) {
- if (attr == null) return this;
- if (attr.next != null) throw new IllegalStateException("Can only insert single tag/value combinations.");
-
- if (attr.tag < this.tag) {
- // attr joins the list ahead of this element
- attr.next = this;
- return attr;
- }
- else if (this.tag == attr.tag) {
- // attr replaces this in the list
- attr.next = this.next;
- return attr;
- }
- else if (this.next == null) {
- // attr gets stuck on the end
- this.next = attr;
- return this;
- }
- else {
- // attr gets inserted somewhere in the tail
- this.next = this.next.insert(attr);
- return this;
- }
- }
-
- /** Removes a tag from the list and returns the new head of the list/sub-list. */
- public SAMBinaryTagAndValue remove(final short tag) {
- if (this.tag == tag) return this.next;
- else {
- if (this.next != null) this.next = this.next.remove(tag);
- return this;
- }
- }
-
- /** Returns the SAMBinaryTagAndValue that contains the required tag, or null if not contained. */
- public SAMBinaryTagAndValue find(final short tag) {
- if (this.tag == tag) return this;
- else if (this.tag > tag || this.next == null) return null;
- else return this.next.find(tag);
- }
-
- public boolean isUnsignedArray() {
- return false;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMException.java b/src/main/java/htsjdk/samtools/SAMException.java
deleted file mode 100644
index add0745..0000000
--- a/src/main/java/htsjdk/samtools/SAMException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SAMException extends RuntimeException {
- public SAMException() {
- }
-
- public SAMException(final String s) {
- super(s);
- }
-
- public SAMException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public SAMException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileHeader.java b/src/main/java/htsjdk/samtools/SAMFileHeader.java
deleted file mode 100644
index 47543c2..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileHeader.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.StringLineReader;
-
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Header information from a SAM or BAM file.
- */
-public class SAMFileHeader extends AbstractSAMHeaderRecord
-{
- public static final String VERSION_TAG = "VN";
- public static final String SORT_ORDER_TAG = "SO";
- public static final String GROUP_ORDER_TAG = "GO";
- public static final String CURRENT_VERSION = "1.5";
- public static final Set<String> ACCEPTABLE_VERSIONS =
- new HashSet<String>(Arrays.asList("1.0", "1.3", "1.4", "1.5"));
-
- /**
- * These tags are of known type, so don't need a type field in the text representation.
- */
- public static final Set<String> STANDARD_TAGS =
- new HashSet<String>(Arrays.asList(VERSION_TAG, SORT_ORDER_TAG, GROUP_ORDER_TAG));
-
- Set<String> getStandardTags() {
- return STANDARD_TAGS;
- }
-
- /**
- * Ways in which a SAM or BAM may be sorted.
- */
- public enum SortOrder {
-
- unsorted(null),
- queryname(SAMRecordQueryNameComparator.class),
- coordinate(SAMRecordCoordinateComparator.class),
- duplicate(SAMRecordDuplicateComparator.class); // NB: this is not in the SAM spec!
-
- private final Class<? extends SAMRecordComparator> comparator;
-
- SortOrder(final Class<? extends SAMRecordComparator> comparatorClass) {
- this.comparator = comparatorClass;
- }
-
- /**
- * @return Comparator class to sort in the specified order, or null if unsorted.
- */
- public Class<? extends SAMRecordComparator> getComparator() {
- return comparator;
- }
-
- /**
- * @return Comparator to sort in the specified order, or null if unsorted.
- */
- public SAMRecordComparator getComparatorInstance() {
- if (comparator != null) {
- try {
- final Constructor<? extends SAMRecordComparator> ctor = comparator.getConstructor();
- return ctor.newInstance();
- }
- catch (Exception e) {
- throw new IllegalStateException("Could not instantiate a comparator for sort order: " +
- this.name(), e);
- }
- }
- return null;
- }
- }
-
- public enum GroupOrder {
- none, query, reference
- }
-
- private List<SAMReadGroupRecord> mReadGroups =
- new ArrayList<SAMReadGroupRecord>();
- private List<SAMProgramRecord> mProgramRecords = new ArrayList<SAMProgramRecord>();
- private final Map<String, SAMReadGroupRecord> mReadGroupMap =
- new HashMap<String, SAMReadGroupRecord>();
- private final Map<String, SAMProgramRecord> mProgramRecordMap = new HashMap<String, SAMProgramRecord>();
- private SAMSequenceDictionary mSequenceDictionary = new SAMSequenceDictionary();
- final private List<String> mComments = new ArrayList<String>();
- private String textHeader;
- private final List<SAMValidationError> mValidationErrors = new ArrayList<SAMValidationError>();
-
- public SAMFileHeader() {
- setAttribute(VERSION_TAG, CURRENT_VERSION);
- }
-
- /** Constructor that initializes the sequence dictionary with the provided one. */
- public SAMFileHeader(final SAMSequenceDictionary dict) {
- this();
- setSequenceDictionary(dict);
- }
-
- public String getVersion() {
- return (String) getAttribute("VN");
- }
-
- public String getCreator() {
- return (String) getAttribute("CR");
- }
-
- public SAMSequenceDictionary getSequenceDictionary() {
- return mSequenceDictionary;
- }
-
- public List<SAMReadGroupRecord> getReadGroups() {
- return Collections.unmodifiableList(mReadGroups);
- }
-
- /**
- * Look up sequence record by name.
- */
- public SAMSequenceRecord getSequence(final String name) {
- return mSequenceDictionary.getSequence(name);
- }
-
- /**
- * Look up read group record by name.
- */
- public SAMReadGroupRecord getReadGroup(final String name) {
- return mReadGroupMap.get(name);
- }
-
- /**
- * Replace entire sequence dictionary. The given sequence dictionary is stored, not copied.
- */
- public void setSequenceDictionary(final SAMSequenceDictionary sequenceDictionary) {
- mSequenceDictionary = sequenceDictionary;
- }
-
- public void addSequence(final SAMSequenceRecord sequenceRecord) {
- mSequenceDictionary.addSequence(sequenceRecord);
- }
-
- /**
- * Look up a sequence record by index. First sequence in the header is the 0th.
- * @return The corresponding sequence record, or null if the index is out of range.
- */
- public SAMSequenceRecord getSequence(final int sequenceIndex) {
- return mSequenceDictionary.getSequence(sequenceIndex);
- }
-
- /**
- *
- * @return Sequence index for the given sequence name, or -1 if the name is not found.
- */
- public int getSequenceIndex(final String sequenceName) {
- return mSequenceDictionary.getSequenceIndex(sequenceName);
- }
-
- /**
- * Replace entire list of read groups. The given list is stored, not copied.
- */
- public void setReadGroups(final List<SAMReadGroupRecord> readGroups) {
- mReadGroups = readGroups;
- mReadGroupMap.clear();
- for (final SAMReadGroupRecord readGroupRecord : readGroups) {
- mReadGroupMap.put(readGroupRecord.getReadGroupId(), readGroupRecord);
- }
- }
-
- public void addReadGroup(final SAMReadGroupRecord readGroup) {
- if (mReadGroupMap.containsKey(readGroup.getReadGroupId())) {
- throw new IllegalArgumentException("Read group with group id " +
- readGroup.getReadGroupId() + " already exists in SAMFileHeader!");
- }
- mReadGroups.add(readGroup);
- mReadGroupMap.put(readGroup.getReadGroupId(), readGroup);
- }
-
- public List<SAMProgramRecord> getProgramRecords() {
- return Collections.unmodifiableList(mProgramRecords);
- }
-
- public void addProgramRecord(final SAMProgramRecord programRecord) {
- if (mProgramRecordMap.containsKey(programRecord.getProgramGroupId())) {
- throw new IllegalArgumentException("Program record with group id " +
- programRecord.getProgramGroupId() + " already exists in SAMFileHeader!");
- }
- this.mProgramRecords.add(programRecord);
- this.mProgramRecordMap.put(programRecord.getProgramGroupId(), programRecord);
- }
-
- public SAMProgramRecord getProgramRecord(final String pgId) {
- return this.mProgramRecordMap.get(pgId);
- }
-
- /**
- * Replace entire list of program records
- * @param programRecords This list is used directly, not copied.
- */
- public void setProgramRecords(final List<SAMProgramRecord> programRecords) {
- this.mProgramRecords = programRecords;
- this.mProgramRecordMap.clear();
- for (final SAMProgramRecord programRecord : this.mProgramRecords) {
- this.mProgramRecordMap.put(programRecord.getProgramGroupId(), programRecord);
- }
- }
-
- /**
- * @return a new SAMProgramRecord with an ID guaranteed to not exist in this SAMFileHeader
- */
- public SAMProgramRecord createProgramRecord() {
- for (int i = 0; i < Integer.MAX_VALUE; ++i) {
- final String s = Integer.toString(i);
- if (!this.mProgramRecordMap.containsKey(s)) {
- final SAMProgramRecord ret = new SAMProgramRecord(s);
- addProgramRecord(ret);
- return ret;
- }
- }
- throw new IllegalStateException("Surprising number of SAMProgramRecords");
- }
-
- public SortOrder getSortOrder() {
- final String so = getAttribute("SO");
- if (so == null || so.equals("unknown")) {
- return SortOrder.unsorted;
- }
- return SortOrder.valueOf((String) so);
- }
-
- public void setSortOrder(final SortOrder so) {
- setAttribute("SO", so.name());
- }
-
- public GroupOrder getGroupOrder() {
- if (getAttribute("GO") == null) {
- return GroupOrder.none;
- }
- return GroupOrder.valueOf((String)getAttribute("GO"));
- }
-
- public void setGroupOrder(final GroupOrder go) {
- setAttribute("GO", go.name());
- }
-
- /**
- * If this SAMHeader was read from a file, this property contains the header
- * as it appeared in the file, otherwise it is null. Note that this is not a toString()
- * operation. Changes to the SAMFileHeader object after reading from the file are not reflected in this value.
- *
- * In addition this value is only set if one of the following is true:
- * - The size of the header is < 1,048,576 characters (1MB ascii, 2MB unicode)
- * - There are either validation or parsing errors associated with the header
- *
- * Invalid header lines may appear in value but are not stored in the SAMFileHeader object.
- */
- public String getTextHeader() {
- return textHeader;
- }
-
- public void setTextHeader(final String textHeader) {
- this.textHeader = textHeader;
- }
-
- public List<String> getComments() {
- return Collections.unmodifiableList(mComments);
- }
-
- public void addComment(String comment) {
- if (!comment.startsWith(SAMTextHeaderCodec.COMMENT_PREFIX)) {
- comment = SAMTextHeaderCodec.COMMENT_PREFIX + comment;
- }
- mComments.add(comment);
- }
-
-
- /**
- * Replace existing comments with the contents of the given collection.
- */
- public void setComments(final Collection<String> comments) {
- mComments.clear();
- for (final String comment : comments) {
- addComment(comment);
- }
- }
-
- public List<SAMValidationError> getValidationErrors() {
- return Collections.unmodifiableList(mValidationErrors);
- }
-
- public void addValidationError(final SAMValidationError error) {
- mValidationErrors.add(error);
- }
-
- /**
- * Replace list of validation errors with the elements of the given list.
- */
- public void setValidationErrors(final Collection<SAMValidationError> errors) {
- mValidationErrors.clear();
- mValidationErrors.addAll(errors);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final SAMFileHeader that = (SAMFileHeader) o;
-
- if (!attributesEqual(that)) return false;
- if (mProgramRecords != null ? !mProgramRecords.equals(that.mProgramRecords) : that.mProgramRecords != null)
- return false;
- if (mReadGroups != null ? !mReadGroups.equals(that.mReadGroups) : that.mReadGroups != null) return false;
- if (mSequenceDictionary != null ? !mSequenceDictionary.equals(that.mSequenceDictionary) : that.mSequenceDictionary != null)
- return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = attributesHashCode();
- result = 31 * result + (mSequenceDictionary != null ? mSequenceDictionary.hashCode() : 0);
- result = 31 * result + (mReadGroups != null ? mReadGroups.hashCode() : 0);
- result = 31 * result + (mProgramRecords != null ? mProgramRecords.hashCode() : 0);
- return result;
- }
-
- public final SAMFileHeader clone() {
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- codec.setValidationStringency(ValidationStringency.SILENT);
- final StringWriter stringWriter = new StringWriter();
- codec.encode(stringWriter, this);
- return codec.decode(new StringLineReader(stringWriter.toString()), "SAMFileHeader.clone");
- }
-
- /** Little class to generate program group IDs */
- public static class PgIdGenerator {
- private int recordCounter;
-
- private final Set<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
- public PgIdGenerator(final SAMFileHeader header) {
- for (final SAMProgramRecord pgRecord : header.getProgramRecords()) {
- idsThatAreAlreadyTaken.add(pgRecord.getProgramGroupId());
- }
- recordCounter = idsThatAreAlreadyTaken.size();
- }
-
- public String getNonCollidingId(final String recordId) {
- if (!idsThatAreAlreadyTaken.contains(recordId)) {
- // don't remap 1st record. If there are more records
- // with this id, they will be remapped in the 'else'.
- idsThatAreAlreadyTaken.add(recordId);
- ++recordCounter;
- return recordId;
- } else {
- String newId;
- // Below we tack on one of roughly 1.7 million possible 4 digit base36 at random. We do this because
- // our old process of just counting from 0 upward and adding that to the previous id led to 1000s of
- // calls idsThatAreAlreadyTaken.contains() just to resolve 1 collision when merging 1000s of similarly
- // processed bams.
- while (idsThatAreAlreadyTaken.contains(newId = recordId + "." + SamFileHeaderMerger.positiveFourDigitBase36Str(recordCounter++)))
- ;
-
- idsThatAreAlreadyTaken.add(newId);
- return newId;
- }
-
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileSource.java b/src/main/java/htsjdk/samtools/SAMFileSource.java
deleted file mode 100644
index 3130a73..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileSource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Represents the origin of a SAM record.
- *
- * @author mhanna
- * @version 0.1
- */
-public class SAMFileSource {
- /**
- * The reader originating this SAM record.
- */
- private SamReader mReader;
-
- /**
- * The point on disk from which a record originates.
- */
- private SAMFileSpan mFilePointer;
-
- /**
- * Create a new SAMFileSource with the given reader and file pointer.
- * @param reader reader.
- * @param filePointer File pointer.
- */
- public SAMFileSource(final SamReader reader, final SAMFileSpan filePointer) {
- this.mReader = reader;
- this.mFilePointer = filePointer;
- }
-
- /**
- * Retrieves the reader from which this read was initially retrieved.
- * @return The reader.
- */
- public SamReader getReader() {
- return mReader;
- }
-
- /**
- * A pointer to the region on disk from which the read originated.
- * @return A pointer within the file.
- */
- public SAMFileSpan getFilePointer() {
- return mFilePointer;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileSpan.java b/src/main/java/htsjdk/samtools/SAMFileSpan.java
deleted file mode 100644
index 4122b24..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileSpan.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * A interface representing a collection of (possibly) discontinuous segments in the
- * BAM file, possibly representing the results of an index query.
- */
-public interface SAMFileSpan extends Cloneable {
- /**
- * Gets a pointer over the data immediately following this span.
- * @return The a pointer to data immediately following this span.
- */
- public SAMFileSpan getContentsFollowing();
-
- /**
- * Remove all pointers in this file span before the given file span starts.
- * @param fileSpan The filespan before which to eliminate.
- * @return The portion of the chunk list after the given chunk.
- */
- public SAMFileSpan removeContentsBefore(final SAMFileSpan fileSpan);
-
- /**
- * Does this file span point to any data, or is it completely empty?
- * @return True if the file span is empty, false otherwise.
- */
- public boolean isEmpty();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriter.java b/src/main/java/htsjdk/samtools/SAMFileWriter.java
deleted file mode 100644
index fe99591..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Closeable;
-
-import htsjdk.samtools.util.ProgressLoggerInterface;
-
-/**
- * Interface for SAMText and BAM file writers. Clients need not care which they write to,
- * once the object is constructed.
- */
-public interface SAMFileWriter extends Closeable {
-
- void addAlignment(SAMRecord alignment);
-
- SAMFileHeader getFileHeader();
-
- /**
- * Sets a ProgressLogger on this writer. This is useful when pulling, for instance, from a
- * SortingCollection.
- */
- void setProgressLogger(final ProgressLoggerInterface progress);
-
- /**
- * Must be called to flush or file will likely be defective.
- */
- void close();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java b/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java
deleted file mode 100644
index 61f1c9c..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriterFactory.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.Deflater;
-
-/**
- * Create a writer for writing SAM, BAM, or CRAM files.
- */
-public class SAMFileWriterFactory implements Cloneable {
- private final static Log log = Log.getInstance(SAMFileWriterFactory.class);
- private static boolean defaultCreateIndexWhileWriting = Defaults.CREATE_INDEX;
- private boolean createIndex = defaultCreateIndexWhileWriting;
- private static boolean defaultCreateMd5File = Defaults.CREATE_MD5;
- private boolean createMd5File = defaultCreateMd5File;
- private boolean useAsyncIo = Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
- private int asyncOutputBufferSize = AsyncSAMFileWriter.DEFAULT_QUEUE_SIZE;
- private int bufferSize = Defaults.BUFFER_SIZE;
- private File tmpDir;
- /** compression level 0: min 9:max */
- private int compressionLevel = BlockCompressedOutputStream.getDefaultCompressionLevel();
- private SamFlagField samFlagFieldOutput = SamFlagField.NONE;
- private Integer maxRecordsInRam = null;
- private DeflaterFactory deflaterFactory = BlockCompressedOutputStream.getDefaultDeflaterFactory();
-
- /** simple constructor */
- public SAMFileWriterFactory() {
- }
-
- /** copy constructor */
- public SAMFileWriterFactory( final SAMFileWriterFactory other) {
- if( other == null ) throw new IllegalArgumentException("SAMFileWriterFactory(null)");
- this.createIndex = other.createIndex;
- this.createMd5File = other.createMd5File;
- this.useAsyncIo = other.useAsyncIo;
- this.asyncOutputBufferSize = other.asyncOutputBufferSize;
- this.bufferSize = other.bufferSize;
- this.tmpDir = other.tmpDir;
- this.compressionLevel = other.compressionLevel;
- this.maxRecordsInRam = other.maxRecordsInRam;
- }
-
- @Override
- public SAMFileWriterFactory clone() {
- return new SAMFileWriterFactory(this);
- }
-
- /**
- * Sets the default for whether to create md5Files for BAM files this factory.
- */
- public static void setDefaultCreateMd5File(final boolean createMd5File) {
- defaultCreateMd5File = createMd5File;
- }
-
- /**
- * Sets whether to create md5Files for BAMs from this factory.
- */
- public SAMFileWriterFactory setCreateMd5File(final boolean createMd5File) {
- this.createMd5File = createMd5File;
- return this;
- }
-
- /**
- * Set the deflater factory used by BAM writers created by this writer factory. Must not be null.
- * If this method is not called, the default {@link DeflaterFactory} is used which creates the default JDK {@link Deflater}.
- * This method returns the SAMFileWriterFactory itself. */
- public SAMFileWriterFactory setDeflaterFactory(final DeflaterFactory deflaterFactory){
- if (deflaterFactory == null){
- throw new IllegalArgumentException("null deflater factory");
- }
- this.deflaterFactory = deflaterFactory;
- return this;
- }
-
- /** set compression level 0!none 9: max */
- public SAMFileWriterFactory setCompressionLevel(final int compressionLevel) {
- this.compressionLevel = Math.min(9, Math.max(0, compressionLevel));
- return this;
- }
-
- public int getCompressionLevel() {
- return compressionLevel;
- }
-
- /**
- * Sets the default for subsequent SAMFileWriterFactories
- * that do not specify whether to create an index.
- * If a BAM (not SAM) file is created, the setting is true, and the file header specifies coordinate order,
- * then a BAM index file will be written along with the BAM file.
- *
- * @param setting whether to attempt to create a BAM index while creating the BAM file
- */
- public static void setDefaultCreateIndexWhileWriting(final boolean setting) {
- defaultCreateIndexWhileWriting = setting;
- }
-
- /**
- * Convenience method allowing newSAMFileWriterFactory().setCreateIndex(true);
- * Equivalent to SAMFileWriterFactory.setDefaultCreateIndexWhileWriting(true); newSAMFileWriterFactory();
- * If a BAM or CRAM (not SAM) file is created, the setting is true, and the file header specifies coordinate order,
- * then a BAM index file will be written along with the BAM file.
- *
- * @param setting whether to attempt to create a BAM index while creating the BAM file.
- * @return this factory object
- */
- public SAMFileWriterFactory setCreateIndex(final boolean setting) {
- this.createIndex = setting;
- return this;
- }
-
- /**
- * Before creating a writer that is not presorted, this method may be called in order to override
- * the default number of SAMRecords stored in RAM before spilling to disk
- * (c.f. SAMFileWriterImpl.MAX_RECORDS_IN_RAM). When writing very large sorted SAM files, you may need
- * call this method in order to avoid running out of file handles. The RAM available to the JVM may need
- * to be increased in order to hold the specified number of records in RAM. This value affects the number
- * of records stored in subsequent calls to one of the make...() methods.
- *
- * @param maxRecordsInRam Number of records to store in RAM before spilling to temporary file when
- * creating a sorted SAM or BAM file.
- */
- public SAMFileWriterFactory setMaxRecordsInRam(final int maxRecordsInRam) {
- this.maxRecordsInRam = maxRecordsInRam;
- return this;
- }
-
- /**
- * Turn on or off the use of asynchronous IO for writing output SAM and BAM files. If true then
- * each SAMFileWriter creates a dedicated thread which is used for compression and IO activities.
- */
- public SAMFileWriterFactory setUseAsyncIo(final boolean useAsyncIo) {
- this.useAsyncIo = useAsyncIo;
- return this;
- }
-
- /**
- * If and only if using asynchronous IO then sets the maximum number of records that can be buffered per
- * SAMFileWriter before producers will block when trying to write another SAMRecord.
- */
- public SAMFileWriterFactory setAsyncOutputBufferSize(final int asyncOutputBufferSize) {
- this.asyncOutputBufferSize = asyncOutputBufferSize;
- return this;
- }
-
- /**
- * Controls size of write buffer.
- * Default value: [[htsjdk.samtools.Defaults#BUFFER_SIZE]]
- */
- public SAMFileWriterFactory setBufferSize(final int bufferSize) {
- this.bufferSize = bufferSize;
- return this;
- }
-
- /**
- * Set the temporary directory to use when sort data.
- *
- * @param tmpDir Path to the temporary directory
- */
- public SAMFileWriterFactory setTempDirectory(final File tmpDir) {
- this.tmpDir = tmpDir;
- return this;
- }
-
- /**
- * Set the flag output format only when writing text.
- * Default value: [[htsjdk.samtools.SAMTextWriter.samFlagFieldOutput.DECIMAL]]
- */
- public SAMFileWriterFactory setSamFlagFieldOutput(final SamFlagField samFlagFieldOutput) {
- if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
- this.samFlagFieldOutput = samFlagFieldOutput;
- return this;
- }
-
- /**
- * Create a BAMFileWriter that is ready to receive SAMRecords. Uses default compression level.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output.
- */
- public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
- return makeBAMWriter(header, presorted, outputFile, this.getCompressionLevel());
- }
-
- /**
- * Create a BAMFileWriter that is ready to receive SAMRecords.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output.
- * @param compressionLevel Override default compression level with the given value, between 0 (fastest) and 9 (smallest).
- */
- public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile,
- final int compressionLevel) {
- try {
- final boolean createMd5File = this.createMd5File && IOUtil.isRegularPath(outputFile);
- if (this.createMd5File && !createMd5File) {
- log.warn("Cannot create MD5 file for BAM because output file is not a regular file: " + outputFile.getAbsolutePath());
- }
- OutputStream os = IOUtil.maybeBufferOutputStream(new FileOutputStream(outputFile, false), bufferSize);
- if (createMd5File) os = new Md5CalculatingOutputStream(os, new File(outputFile.getAbsolutePath() + ".md5"));
- final BAMFileWriter ret = new BAMFileWriter(os, outputFile, compressionLevel, deflaterFactory);
- final boolean createIndex = this.createIndex && IOUtil.isRegularPath(outputFile);
- if (this.createIndex && !createIndex) {
- log.warn("Cannot create index for BAM because output file is not a regular file: " + outputFile.getAbsolutePath());
- }
- if (this.tmpDir != null) ret.setTempDirectory(this.tmpDir);
- initializeBAMWriter(ret, header, presorted, createIndex);
-
- if (this.useAsyncIo) return new AsyncSAMFileWriter(ret, this.asyncOutputBufferSize);
- else return ret;
- } catch (final IOException ioe) {
- throw new RuntimeIOException("Error opening file: " + outputFile.getAbsolutePath());
- }
- }
-
- private void initializeBAMWriter(final BAMFileWriter writer, final SAMFileHeader header, final boolean presorted, final boolean createIndex) {
- writer.setSortOrder(header.getSortOrder(), presorted);
- if (maxRecordsInRam != null) {
- writer.setMaxRecordsInRam(maxRecordsInRam);
- }
- writer.setHeader(header);
- if (createIndex && writer.getSortOrder().equals(SAMFileHeader.SortOrder.coordinate)) {
- writer.enableBamIndexConstruction();
- }
- }
-
- /**
- * Create a SAMTextWriter that is ready to receive SAMRecords.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output.
- */
- public SAMFileWriter makeSAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
- /**
- * Use the value specified from Defaults.SAM_FLAG_FIELD_FORMAT when samFlagFieldOutput value has not been set. This should
- * be SamFlagField.DECIMAL when the user has not set Defaults.SAM_FLAG_FIELD_FORMAT.
- */
- if (samFlagFieldOutput == SamFlagField.NONE) {
- samFlagFieldOutput = Defaults.SAM_FLAG_FIELD_FORMAT;
- }
- try {
- final SAMTextWriter ret = this.createMd5File
- ? new SAMTextWriter(new Md5CalculatingOutputStream(new FileOutputStream(outputFile, false),
- new File(outputFile.getAbsolutePath() + ".md5")), samFlagFieldOutput)
- : new SAMTextWriter(outputFile, samFlagFieldOutput);
- ret.setSortOrder(header.getSortOrder(), presorted);
- if (maxRecordsInRam != null) {
- ret.setMaxRecordsInRam(maxRecordsInRam);
- }
- ret.setHeader(header);
-
- if (this.useAsyncIo) return new AsyncSAMFileWriter(ret, this.asyncOutputBufferSize);
- else return ret;
- } catch (final IOException ioe) {
- throw new RuntimeIOException("Error opening file: " + outputFile.getAbsolutePath());
- }
- }
-
- /**
- * Create a SAMTextWriter for writing to a stream that is ready to receive SAMRecords.
- * This method does not support the creation of an MD5 file
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param stream the stream to write records to. Note that this method does not buffer the stream, so the
- * caller must buffer if desired. Note that PrintStream is buffered.
- */
- public SAMFileWriter makeSAMWriter(final SAMFileHeader header, final boolean presorted, final OutputStream stream) {
- /**
- * Use the value specified from Defaults.SAM_FLAG_FIELD_FORMAT when samFlagFieldOutput value has not been set. This should
- * be samFlagFieldOutput.DECIMAL when the user has not set Defaults.SAM_FLAG_FIELD_FORMAT.
- */
- if (samFlagFieldOutput == SamFlagField.NONE) {
- samFlagFieldOutput = Defaults.SAM_FLAG_FIELD_FORMAT;
- }
- return initWriter(header, presorted, false, new SAMTextWriter(stream, samFlagFieldOutput));
- }
-
- /**
- * Create a BAMFileWriter for writing to a stream that is ready to receive SAMRecords.
- * This method does not support the creation of an MD5 file
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param stream the stream to write records to. Note that this method does not buffer the stream, so the
- * caller must buffer if desired. Note that PrintStream is buffered.
- */
-
- public SAMFileWriter makeBAMWriter(final SAMFileHeader header, final boolean presorted, final OutputStream stream) {
- return initWriter(header, presorted, true, new BAMFileWriter(stream, null, this.getCompressionLevel(), this.deflaterFactory));
- }
-
- /**
- * Initialize SAMTextWriter or a BAMFileWriter and possibly wrap in AsyncSAMFileWriter
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param binary do we want to generate a BAM or a SAM
- * @param writer SAM or BAM writer to initialize and maybe wrap.
- */
-
- private SAMFileWriter initWriter(final SAMFileHeader header, final boolean presorted, final boolean binary,
- final SAMFileWriterImpl writer) {
- writer.setSortOrder(header.getSortOrder(), presorted);
- if (maxRecordsInRam != null) {
- writer.setMaxRecordsInRam(maxRecordsInRam);
- }
- writer.setHeader(header);
-
- if (this.useAsyncIo) return new AsyncSAMFileWriter(writer, this.asyncOutputBufferSize);
- else return writer;
- }
-
- /**
- * Create either a SAM or a BAM writer based on examination of the outputFile extension.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output. Must end with .sam or .bam.
- * @return SAM or BAM writer based on file extension of outputFile.
- */
- public SAMFileWriter makeSAMOrBAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile) {
- final String filename = outputFile.getName();
- if (filename.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION)) {
- return makeBAMWriter(header, presorted, outputFile);
- }
- if (filename.endsWith(".sam")) {
- return makeSAMWriter(header, presorted, outputFile);
- }
- return makeBAMWriter(header, presorted, outputFile);
- }
-
- /**
- *
- * Create a SAM, BAM or CRAM writer based on examination of the outputFile extension.
- *
- * @param header header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output. Must end with .sam, .bam or .cram.
- * @param referenceFasta reference sequence file
- * @return SAMFileWriter appropriate for the file type specified in outputFile
- *
- */
- public SAMFileWriter makeWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) {
- if (outputFile.getName().endsWith(SamReader.Type.CRAM_TYPE.fileExtension())) {
- return makeCRAMWriter(header, presorted, outputFile, referenceFasta);
- }
- else {
- return makeSAMOrBAMWriter(header, presorted, outputFile);
- }
- }
-
- /**
- * Create a CRAMFileWriter on an output stream. Requires the input to be presorted to match the sort order defined
- * by the input header.
- *
- * Note: does not honor factory settings for CREATE_MD5, CREATE_INDEX, USE_ASYNC_IO.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param stream where to write the output.
- * @param referenceFasta reference sequence file
- * @return CRAMFileWriter
- */
- public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final OutputStream stream, final File referenceFasta) {
- // create the CRAMFileWriter directly without propagating factory settings
- final CRAMFileWriter writer = new CRAMFileWriter(stream, new ReferenceSource(referenceFasta), header, null);
- setCRAMWriterDefaults(writer);
- return writer;
- }
-
- /**
- * Create a CRAMFileWriter on an output file. Requires input record to be presorted to match the
- * sort order defined by the input header.
- *
- * Note: does not honor factory settings for USE_ASYNC_IO.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param outputFile where to write the output. Must end with .sam, .bam or .cram.
- * @param referenceFasta reference sequence file
- * @return CRAMFileWriter
- *
- */
- public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final File outputFile, final File referenceFasta) {
- return createCRAMWriterWithSettings(header, true, outputFile, referenceFasta);
- }
-
- /**
- * Create a CRAMFileWriter on an output file.
- *
- * Note: does not honor factory setting for USE_ASYNC_IO.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output. Must end with .sam, .bam or .cram.
- * @param referenceFasta reference sequence file
- * @return CRAMFileWriter
- *
- */
- public CRAMFileWriter makeCRAMWriter(final SAMFileHeader header, final boolean presorted, final File outputFile, final File referenceFasta) {
- return createCRAMWriterWithSettings(header, presorted, outputFile, referenceFasta);
- }
-
- /**
- * Create a CRAMFileWriter on an output file based on factory settings.
- *
- * Note: does not honor the factory setting for USE_ASYNC_IO.
- *
- * @param header entire header. Sort order is determined by the sortOrder property of this arg.
- * @param presorted if true, SAMRecords must be added to the SAMFileWriter in order that agrees with header.sortOrder.
- * @param outputFile where to write the output. Must end with .sam, .bam or .cram.
- * @param referenceFasta reference sequence file
- * @return CRAMFileWriter
- */
- private CRAMFileWriter createCRAMWriterWithSettings(
- final SAMFileHeader header,
- final boolean presorted,
- final File outputFile,
- final File referenceFasta) {
- OutputStream cramOS = null;
- OutputStream indexOS = null ;
-
- if (createIndex) {
- if (!IOUtil.isRegularPath(outputFile)) {
- log.warn("Cannot create index for CRAM because output file is not a regular file: " + outputFile.getAbsolutePath());
- }
- else {
- try {
- final File indexFile = new File(outputFile.getAbsolutePath() + BAMIndex.BAMIndexSuffix) ;
- indexOS = new FileOutputStream(indexFile) ;
- }
- catch (final IOException ioe) {
- throw new RuntimeIOException("Error creating index file for: " + outputFile.getAbsolutePath()+ BAMIndex.BAMIndexSuffix);
- }
- }
- }
-
- try {
- cramOS = IOUtil.maybeBufferOutputStream(new FileOutputStream(outputFile, false), bufferSize);
- }
- catch (final IOException ioe) {
- throw new RuntimeIOException("Error creating CRAM file: " + outputFile.getAbsolutePath());
- }
-
- final CRAMFileWriter writer = new CRAMFileWriter(
- createMd5File ? new Md5CalculatingOutputStream(cramOS, new File(outputFile.getAbsolutePath() + ".md5")) : cramOS,
- indexOS,
- presorted,
- new ReferenceSource(referenceFasta),
- header,
- outputFile.getAbsolutePath());
- setCRAMWriterDefaults(writer);
-
- return writer;
- }
-
- // Set the default CRAM writer preservation parameters
- private void setCRAMWriterDefaults(final CRAMFileWriter writer) {
- writer.setPreserveReadNames(true);
- writer.setCaptureAllTags(true);
- }
-
- @Override
- public String toString() {
- return "SAMFileWriterFactory [createIndex=" + createIndex + ", createMd5File=" + createMd5File + ", useAsyncIo="
- + useAsyncIo + ", asyncOutputBufferSize=" + asyncOutputBufferSize + ", bufferSize=" + bufferSize
- + ", tmpDir=" + tmpDir + ", compressionLevel=" + compressionLevel + ", maxRecordsInRam="
- + maxRecordsInRam + "]";
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java b/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java
deleted file mode 100644
index 130ecea..0000000
--- a/src/main/java/htsjdk/samtools/SAMFileWriterImpl.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.ProgressLoggerInterface;
-import htsjdk.samtools.util.SortingCollection;
-
-import java.io.File;
-import java.io.StringWriter;
-
-/**
- * Base class for implementing SAM writer with any underlying format.
- * Mostly this manages accumulation & sorting of SAMRecords when appropriate,
- * and produces the text version of the header, since that seems to be a popular item
- * in both text and binary file formats.
- */
-public abstract class SAMFileWriterImpl implements SAMFileWriter
-{
- private static int DEAFULT_MAX_RECORDS_IN_RAM = 500000;
- private int maxRecordsInRam = DEAFULT_MAX_RECORDS_IN_RAM;
- private SAMFileHeader.SortOrder sortOrder;
- private SAMFileHeader header;
- private SortingCollection<SAMRecord> alignmentSorter;
- private File tmpDir = new File(System.getProperty("java.io.tmpdir"));
- private ProgressLoggerInterface progressLogger = null;
- private boolean isClosed = false;
-
- // If true, records passed to addAlignment are already in the order specified by sortOrder
- private boolean presorted;
-
- // For validating presorted records.
- private SAMSortOrderChecker sortOrderChecker;
-
- /**
- * When writing records that are not presorted, specify the number of records stored in RAM
- * before spilling to disk. This method sets the default value for all SamFileWriterImpl
- * instances. Must be called before the constructor is called.
- * @param maxRecordsInRam
- */
- public static void setDefaultMaxRecordsInRam(final int maxRecordsInRam) {
- DEAFULT_MAX_RECORDS_IN_RAM = maxRecordsInRam;
- }
-
- /**
- * When writing records that are not presorted, this number determines the
- * number of records stored in RAM before spilling to disk.
- * @return DEAFULT_MAX_RECORDS_IN_RAM
- */
- public static int getDefaultMaxRecordsInRam() {
- return DEAFULT_MAX_RECORDS_IN_RAM;
- }
-
- /**
- * Sets the progress logger used by this implementation. Setting this lets this writer emit log
- * messages as SAM records in a SortingCollection are being written to disk.
- */
- public void setProgressLogger(final ProgressLoggerInterface progress) {
- this.progressLogger = progress;
- }
-
- /**
- * Must be called before calling setHeader(). SortOrder value in the header passed
- * to setHeader() is ignored. If setSortOrder is not called, default is SortOrder.unsorted.
- */
- public void setSortOrder(final SAMFileHeader.SortOrder sortOrder, final boolean presorted) {
- if (header != null) {
- throw new IllegalStateException("Cannot call SAMFileWriterImpl.setSortOrder after setHeader for " +
- getFilename());
- }
- this.sortOrder = sortOrder;
- this.presorted = presorted;
- }
-
- /**
- * Must be called after calling setHeader().
- */
- protected SAMFileHeader.SortOrder getSortOrder() {
- return this.sortOrder;
- }
-
- /**
- * When writing records that are not presorted, specify the number of records stored in RAM
- * before spilling to disk. Must be called before setHeader().
- * @param maxRecordsInRam
- */
- void setMaxRecordsInRam(final int maxRecordsInRam) {
- if (this.header != null) {
- throw new IllegalStateException("setMaxRecordsInRam must be called before setHeader()");
- }
- this.maxRecordsInRam = maxRecordsInRam;
- }
-
- /**
- * When writing records that are not presorted, specify the path of the temporary directory
- * for spilling to disk. Must be called before setHeader().
- * @param tmpDir path to the temporary directory
- */
- void setTempDirectory(final File tmpDir) {
- if (tmpDir!=null) {
- this.tmpDir = tmpDir;
- }
- }
-
- /**
- * Must be called before addAlignment. Header cannot be null.
- */
- public void setHeader(final SAMFileHeader header)
- {
- if (null == header) {
- throw new IllegalArgumentException("A non-null SAMFileHeader is required for a writer");
- }
- this.header = header;
- if (sortOrder == null) {
- sortOrder = SAMFileHeader.SortOrder.unsorted;
- }
- header.setSortOrder(sortOrder);
- final StringWriter headerTextBuffer = new StringWriter();
- new SAMTextHeaderCodec().encode(headerTextBuffer, header);
- final String headerText = headerTextBuffer.toString();
-
- writeHeader(headerText);
-
- if (presorted) {
- if (sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
- presorted = false;
- } else {
- sortOrderChecker = new SAMSortOrderChecker(sortOrder);
- }
- } else if (!sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
- alignmentSorter = SortingCollection.newInstance(SAMRecord.class,
- new BAMRecordCodec(header), makeComparator(), maxRecordsInRam, tmpDir);
- }
- }
-
- public SAMFileHeader getFileHeader() {
- return header;
- }
-
- private SAMRecordComparator makeComparator() {
- switch (sortOrder) {
- case coordinate:
- return new SAMRecordCoordinateComparator();
- case queryname:
- return new SAMRecordQueryNameComparator();
- case duplicate:
- return new SAMRecordDuplicateComparator();
- case unsorted:
- return null;
- }
- throw new IllegalStateException("sortOrder should not be null");
- }
-
- /**
- * Add an alignment record to be emitted by the writer.
- *
- * @param alignment Must not be null. The record will be updated to use the header used by this writer, which will
- * in turn cause any unresolved reference and mate reference indices to be resolved against the
- * header's sequence dictionary.
- * @throws IllegalArgumentException if the record's reference or mate reference indices cannot be
- * resolved against the writer's header using the current reference and mate reference names
- */
- public void addAlignment(final SAMRecord alignment)
- {
- alignment.setHeaderStrict(header); // re-establish the record header and resolve reference indices
- if (sortOrder.equals(SAMFileHeader.SortOrder.unsorted)) {
- writeAlignment(alignment);
- } else if (presorted) {
- assertPresorted(alignment);
- writeAlignment(alignment);
- } else {
- alignmentSorter.add(alignment);
- }
- }
-
- private void assertPresorted(final SAMRecord alignment) {
- final SAMRecord prev = sortOrderChecker.getPreviousRecord();
- if (!sortOrderChecker.isSorted(alignment)) {
- throw new IllegalArgumentException("Alignments added out of order in SAMFileWriterImpl.addAlignment for " +
- getFilename() + ". Sort order is " + this.sortOrder + ". Offending records are at ["
- + sortOrderChecker.getSortKey(prev) + "] and ["
- + sortOrderChecker.getSortKey(alignment) + "]");
- }
- }
-
- /**
- * Must be called or else file will likely be defective.
- */
- public final void close()
- {
- if (!isClosed) {
- if (alignmentSorter != null) {
- for (final SAMRecord alignment : alignmentSorter) {
- writeAlignment(alignment);
- if (progressLogger != null) progressLogger.record(alignment);
- }
- alignmentSorter.cleanup();
- }
- finish();
- }
- isClosed = true;
- }
-
- /**
- * Writes the record to disk. Sort order has been taken care of by the time
- * this method is called. The record must hava a non-null SAMFileHeader.
- * @param alignment
- */
- abstract protected void writeAlignment(SAMRecord alignment);
-
- /**
- * Write the header to disk. Header object is available via getHeader().
- * @param textHeader for convenience if the implementation needs it.
- */
- abstract protected void writeHeader(String textHeader);
-
- /**
- * Do any required flushing here.
- */
- abstract protected void finish();
-
- /**
- * For producing error messages.
- * @return Output filename, or null if there isn't one.
- */
- abstract protected String getFilename();
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFlag.java b/src/main/java/htsjdk/samtools/SAMFlag.java
deleted file mode 100644
index 11dc155..0000000
--- a/src/main/java/htsjdk/samtools/SAMFlag.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * The MIT License
- *
- * Author: Pierre Lindenbaum PhD @yokofakun
- * Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * SAM flags as enum, to be used in GUI, menu, etc...
- */
-public enum SAMFlag {
- READ_PAIRED( 0x1, "Template having multiple segments in sequencing"),
- PROPER_PAIR( 0x2, "Each segment properly aligned according to the aligner"),
- READ_UNMAPPED( 0x4, "Segment unmapped"),
- MATE_UNMAPPED( 0x8, "Next segment in the template unmapped"),
- READ_REVERSE_STRAND( 0x10, "SEQ being reverse complemented"),
- MATE_REVERSE_STRAND( 0x20, "SEQ of the next segment in the template being reverse complemented"),
- FIRST_OF_PAIR( 0x40, "The first segment in the template"),
- SECOND_OF_PAIR( 0x80, "The last segment in the template"),
- NOT_PRIMARY_ALIGNMENT( 0x100, "Secondary alignment"),
- READ_FAILS_VENDOR_QUALITY_CHECK(0x200, "Not passing quality controls"),
- DUPLICATE_READ( 0x400, "PCR or optical duplicate"),
- SUPPLEMENTARY_ALIGNMENT( 0x800, "Supplementary alignment")
- ;
-
- /* visible for the package, to be used by SAMRecord */
- final int flag;
- private final String description;
-
- SAMFlag(int flag, String description) {
- this.flag = flag;
- this.description = description;
- }
-
- /** @return this flag as an int */
- public int intValue() {
- return flag;
- }
-
- /** @return a human label for this SAMFlag */
- public String getLabel() {
- return name().toLowerCase().replace('_', ' ');
- }
-
- /** @return a human description for this SAMFlag */
- public String getDescription() {
- return this.description;
- }
-
- /** @return the SAMFlag for the value 'flag' or null if it was not found */
- public static SAMFlag valueOf(int flag) {
- for (SAMFlag f : values()) {
- if (flag == f.flag)
- return f;
- }
- return null;
- }
-
- /** @return find SAMFlag the flag by name, or null if it was not found */
- public static SAMFlag findByName(String flag)
- {
- for (SAMFlag f : values()) {
- if (f.name().equals(flag))
- return f;
- }
- return null;
- }
-
- /** @returns true if the bit for is set for flag */
- public boolean isSet(int flag) {
- return (this.flag & flag) != 0;
- }
-
- /** @returns true if the bit for is not set for flag */
- public boolean isUnset(int flag) {
- return !isSet(flag);
- }
-
- /** @returns the java.util.Set of SAMFlag for 'flag' */
- public static Set<SAMFlag> getFlags(int flag) {
- Set<SAMFlag> set = new HashSet<SAMFlag>();
- for (SAMFlag f : values()) {
- if (f.isSet(flag))
- set.add(f);
- }
- return set;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMFormatException.java b/src/main/java/htsjdk/samtools/SAMFormatException.java
deleted file mode 100644
index bce82bc..0000000
--- a/src/main/java/htsjdk/samtools/SAMFormatException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Thrown when a SAM file being read or decoded (text or binary) looks bad.
- */
-public class SAMFormatException extends SAMException {
- public SAMFormatException() {
- }
-
- public SAMFormatException(final String s) {
- super(s);
- }
-
- public SAMFormatException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public SAMFormatException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java b/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java
deleted file mode 100644
index f48df4d..0000000
--- a/src/main/java/htsjdk/samtools/SAMHeaderRecordComparator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Provides ordering based on SAM header records' attribute values. Provide the list of attributes to use
- * in the comparison to the constructor. Null attribute values (i.e., those attributes not present in the
- * record) sort behind those that have values.
- */
-public class SAMHeaderRecordComparator<T extends AbstractSAMHeaderRecord> implements Comparator<T>, Serializable {
- private static final long serialVersionUID = 1L;
-
- private final String[] attributes;
-
- public SAMHeaderRecordComparator(final String... attributes) {
- this.attributes = attributes;
- }
-
- @Override
- public int compare(final T left, final T right) {
- for (final String attribute : attributes) {
- final String leftValue = left.getAttribute(attribute);
- final String rightValue = right.getAttribute(attribute);
-
- if (leftValue == null) {
- // Fastest comparison possible; two empty values are
- // equivalent, so move along to the next attribute
- if (rightValue == null) continue;
-
- // Otherwise left < right, since right has a value
- else return -1;
- }
-
- // left is not null; if right is, left > right
- if (rightValue == null) return 1;
-
- final int compare = leftValue.compareTo(rightValue);
- if (compare != 0) return compare;
- }
-
- return 0;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMLineParser.java b/src/main/java/htsjdk/samtools/SAMLineParser.java
deleted file mode 100644
index f73a67e..0000000
--- a/src/main/java/htsjdk/samtools/SAMLineParser.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * This class enables creation of a SAMRecord object from a String in SAM text format. The SAM flag field will be inferred
- * for each record separately, unless the expected format is set using `withSamFlagField`.
- */
-public class SAMLineParser {
-
- // From SAM specification
- private static final int QNAME_COL = 0;
- private static final int FLAG_COL = 1;
- private static final int RNAME_COL = 2;
- private static final int POS_COL = 3;
- private static final int MAPQ_COL = 4;
- private static final int CIGAR_COL = 5;
- private static final int MRNM_COL = 6;
- private static final int MPOS_COL = 7;
- private static final int ISIZE_COL = 8;
- private static final int SEQ_COL = 9;
- private static final int QUAL_COL = 10;
-
- private static final int NUM_REQUIRED_FIELDS = 11;
-
- /**
- * Allocate this once rather than for every line as a performance
- * optimization. The size is arbitrary -- merely large enough to handle the
- * maximum number of fields we might expect from a reasonable SAM file.
- */
- private final String[] mFields = new String[10000];
-
- /**
- * Add information about the origin (reader and position) to SAM records.
- */
- private final SamReader mParentReader;
- private final SAMRecordFactory samRecordFactory;
- private final ValidationStringency validationStringency;
- private final SAMFileHeader mFileHeader;
- private final File mFile;
- private Optional<SamFlagField> samFlagField = Optional.empty();
-
- private final TextTagCodec tagCodec = new TextTagCodec();
-
- private int currentLineNumber;
- private String currentLine;
-
- //
- // Constructors
- //
-
- /**
- * Public constructor. Use the default SAMRecordFactory and stringency.
- *
- * @param samFileHeader SAM file header
- */
- public SAMLineParser(final SAMFileHeader samFileHeader) {
-
- this(new DefaultSAMRecordFactory(),
- ValidationStringency.DEFAULT_STRINGENCY, samFileHeader,
- null, null);
- }
-
- /**
- * Public constructor. Use the default SAMRecordFactory and stringency.
- *
- * @param samFileHeader SAM file header
- * @param samFileReader SAM file reader For passing to SAMRecord.setFileSource, may be null.
- * @param samFile SAM file being read (for error message only, may be null)
- */
- public SAMLineParser(final SAMFileHeader samFileHeader,
- final SamReader samFileReader, final File samFile) {
-
- this(new DefaultSAMRecordFactory(),
- ValidationStringency.DEFAULT_STRINGENCY, samFileHeader,
- samFileReader, samFile);
- }
-
- /**
- * Public constructor.
- *
- * @param samRecordFactory SamRecord Factory
- * @param validationStringency validation stringency
- * @param samFileHeader SAM file header
- * @param samFileReader SAM file reader For passing to SAMRecord.setFileSource, may be null.
- * @param samFile SAM file being read (for error message only, may be null)
- */
- public SAMLineParser(final SAMRecordFactory samRecordFactory,
- final ValidationStringency validationStringency,
- final SAMFileHeader samFileHeader, final SamReader samFileReader,
- final File samFile) {
-
- if (samRecordFactory == null)
- throw new NullPointerException("The SamRecordFactory must be set");
-
- if (validationStringency == null)
- throw new NullPointerException("The validationStringency must be set");
-
- if (samFileHeader == null)
- throw new NullPointerException("The mFileHeader must be set");
-
- this.samRecordFactory = samRecordFactory;
- this.validationStringency = validationStringency;
- this.mFileHeader = samFileHeader;
-
- // Can be null
- this.mParentReader = samFileReader;
-
- // Can be null
- this.mFile = samFile;
- }
-
- /**
- * Get the File header.
- *
- * @return the SAM file header
- */
- public SAMFileHeader getFileHeader() {
-
- return this.mFileHeader;
- }
-
- /**
- * Get validation stringency.
- *
- * @return validation stringency
- */
- public ValidationStringency getValidationStringency() {
- return this.validationStringency;
- }
-
- /**
- * Sets the expected SAM flag type expected for all records.
- */
- public SAMLineParser withSamFlagField(final SamFlagField samFlagField) {
- if (samFlagField == null) throw new IllegalArgumentException("Sam flag field was null");
- this.samFlagField = Optional.of(samFlagField);
- return this;
- }
-
- private int parseInt(final String s, final String fieldName) {
- final int ret;
- try {
- ret = Integer.parseInt(s);
- } catch (NumberFormatException e) {
- throw reportFatalErrorParsingLine("Non-numeric value in " + fieldName + " column");
- }
- return ret;
- }
-
- private int parseFlag(final String s, final String fieldName) {
- try {
- return samFlagField.isPresent() ? samFlagField.get().parse(s) : SamFlagField.parseDefault(s);
- } catch (NumberFormatException e) {
- throw reportFatalErrorParsingLine("Non-numeric value in " + fieldName + " column");
- } catch (SAMFormatException e) {
- throw reportFatalErrorParsingLine("Error in " + fieldName + " column: " + e.getMessage(), e);
- }
- }
-
- private void validateReferenceName(final String rname, final String fieldName) {
- if (rname.equals("=")) {
- if (fieldName.equals("MRNM")) {
- return;
- }
- reportErrorParsingLine("= is not a valid value for "
- + fieldName + " field.");
- }
- if (!this.mFileHeader.getSequenceDictionary().isEmpty()) {
- if (this.mFileHeader.getSequence(rname) == null) {
- reportErrorParsingLine(fieldName
- + " '" + rname + "' not found in any SQ record");
- }
- }
- }
-
- /**
- * Parse a SAM line.
- *
- * @param line line to parse
- * @return a new SAMRecord object
- */
- public SAMRecord parseLine(final String line) {
-
- return parseLine(line, -1);
- }
-
- /**
- * Parse a SAM line.
- *
- * @param line line to parse
- * @param lineNumber line number in the file. If the line number is not known
- * can be <=0.
- * @return a new SAMRecord object
- */
- public SAMRecord parseLine(final String line, final int lineNumber) {
-
- this.currentLineNumber = lineNumber;
- this.currentLine = line;
-
- final int numFields = StringUtil.split(line, mFields, '\t');
- if (numFields < NUM_REQUIRED_FIELDS) {
- throw reportFatalErrorParsingLine("Not enough fields");
- }
- if (numFields == mFields.length) {
- reportErrorParsingLine("Too many fields in SAM text record.");
- }
- for (int i = 0; i < numFields; ++i) {
- if (mFields[i].isEmpty()) {
- reportErrorParsingLine("Empty field at position " + i + " (zero-based)");
- }
- }
- final SAMRecord samRecord =
- samRecordFactory.createSAMRecord(this.mFileHeader);
- samRecord.setValidationStringency(this.validationStringency);
- if (mParentReader != null)
- samRecord.setFileSource(new SAMFileSource(mParentReader, null));
- samRecord.setHeader(this.mFileHeader);
- samRecord.setReadName(mFields[QNAME_COL]);
-
- final int flags = parseFlag(mFields[FLAG_COL], "FLAG");
- samRecord.setFlags(flags);
-
- String rname = mFields[RNAME_COL];
- if (!rname.equals("*")) {
- rname = SAMSequenceRecord.truncateSequenceName(rname);
- validateReferenceName(rname, "RNAME");
- samRecord.setReferenceName(rname);
- } else if (!samRecord.getReadUnmappedFlag()) {
- reportErrorParsingLine("RNAME is not specified but flags indicate mapped");
- }
-
- final int pos = parseInt(mFields[POS_COL], "POS");
- final int mapq = parseInt(mFields[MAPQ_COL], "MAPQ");
- final String cigar = mFields[CIGAR_COL];
- if (!SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(samRecord
- .getReferenceName())) {
- if (pos == 0) {
- reportErrorParsingLine("POS must be non-zero if RNAME is specified");
- }
- if (!samRecord.getReadUnmappedFlag() && cigar.equals("*")) {
- reportErrorParsingLine("CIGAR must not be '*' if RNAME is specified");
- }
- } else {
- if (pos != 0) {
- reportErrorParsingLine("POS must be zero if RNAME is not specified");
- }
- if (mapq != 0) {
- reportErrorParsingLine("MAPQ must be zero if RNAME is not specified");
- }
- if (!cigar.equals("*")) {
- reportErrorParsingLine("CIGAR must be '*' if RNAME is not specified");
- }
- }
- samRecord.setAlignmentStart(pos);
- samRecord.setMappingQuality(mapq);
- samRecord.setCigarString(cigar);
-
- String mateRName = mFields[MRNM_COL];
- if (mateRName.equals("*")) {
- if (samRecord.getReadPairedFlag() && !samRecord.getMateUnmappedFlag()) {
- reportErrorParsingLine("MRNM not specified but flags indicate mate mapped");
- }
- } else {
- if (!samRecord.getReadPairedFlag()) {
- reportErrorParsingLine("MRNM specified but flags indicate unpaired");
- }
- if (!"=".equals(mateRName)) {
- mateRName = SAMSequenceRecord.truncateSequenceName(mateRName);
- }
- validateReferenceName(mateRName, "MRNM");
- if (mateRName.equals("=")) {
- if (samRecord.getReferenceName() == null) {
- reportErrorParsingLine("MRNM is '=', but RNAME is not set");
- }
- samRecord.setMateReferenceName(samRecord.getReferenceName());
- } else {
- samRecord.setMateReferenceName(mateRName);
- }
- }
-
- final int matePos = parseInt(mFields[MPOS_COL], "MPOS");
- final int isize = parseInt(mFields[ISIZE_COL], "ISIZE");
- if (!samRecord.getMateReferenceName().equals(
- SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
- if (matePos == 0) {
- reportErrorParsingLine("MPOS must be non-zero if MRNM is specified");
- }
- } else {
- if (matePos != 0) {
- reportErrorParsingLine("MPOS must be zero if MRNM is not specified");
- }
- if (isize != 0) {
- reportErrorParsingLine("ISIZE must be zero if MRNM is not specified");
- }
- }
- samRecord.setMateAlignmentStart(matePos);
- samRecord.setInferredInsertSize(isize);
- if (!mFields[SEQ_COL].equals("*")) {
- validateReadBases(mFields[SEQ_COL]);
- samRecord.setReadString(mFields[SEQ_COL]);
- } else {
- samRecord.setReadBases(SAMRecord.NULL_SEQUENCE);
- }
- if (!mFields[QUAL_COL].equals("*")) {
- if (samRecord.getReadBases() == SAMRecord.NULL_SEQUENCE) {
- reportErrorParsingLine("QUAL should not be specified if SEQ is not specified");
- }
- if (samRecord.getReadString().length() != mFields[QUAL_COL].length()) {
- reportErrorParsingLine("length(QUAL) != length(SEQ)");
- }
- samRecord.setBaseQualityString(mFields[QUAL_COL]);
- } else {
- samRecord.setBaseQualities(SAMRecord.NULL_QUALS);
- }
-
- for (int i = NUM_REQUIRED_FIELDS; i < numFields; ++i) {
- parseTag(samRecord, mFields[i]);
- }
-
- // Only call samRecord.isValid() if errors would be reported since the validation
- // is quite expensive in and of itself.
- if (this.validationStringency != ValidationStringency.SILENT) {
- final List<SAMValidationError> validationErrors = samRecord.isValid();
- if (validationErrors != null) {
- for (final SAMValidationError errorMessage : validationErrors) {
- reportErrorParsingLine(errorMessage.getMessage());
- }
- }
- }
-
- return samRecord;
- }
-
- private void validateReadBases(final String bases) {
- /*
- * Using regex is slow, so check for invalid characters via
- * isValidReadBase(), which hopefully the JIT will optimize. if
- * (!VALID_BASES.matcher(bases).matches()) {
- * reportErrorParsingLine("Invalid character in read bases"); }
- */
- for (int i = 0; i < bases.length(); ++i) {
- if (!isValidReadBase(bases.charAt(i))) {
- reportErrorParsingLine("Invalid character in read bases");
- return;
- }
- }
- }
-
- private boolean isValidReadBase(final char base) {
- switch (base) {
- case 'a':
- case 'c':
- case 'm':
- case 'g':
- case 'r':
- case 's':
- case 'v':
- case 't':
- case 'w':
- case 'y':
- case 'h':
- case 'k':
- case 'd':
- case 'b':
- case 'n':
- case 'A':
- case 'C':
- case 'M':
- case 'G':
- case 'R':
- case 'S':
- case 'V':
- case 'T':
- case 'W':
- case 'Y':
- case 'H':
- case 'K':
- case 'D':
- case 'B':
- case 'N':
- case '.':
- case '=':
- return true;
- default:
- return false;
- }
- }
-
- private void parseTag(final SAMRecord samRecord, final String tag) {
- Map.Entry<String, Object> entry = null;
- try {
- entry = tagCodec.decode(tag);
- } catch (SAMFormatException e) {
- reportErrorParsingLine(e);
- }
- if (entry != null) {
- if (entry.getValue() instanceof TagValueAndUnsignedArrayFlag) {
- final TagValueAndUnsignedArrayFlag valueAndFlag =
- (TagValueAndUnsignedArrayFlag) entry.getValue();
- if (valueAndFlag.isUnsignedArray) {
- samRecord.setUnsignedArrayAttribute(entry.getKey(),
- valueAndFlag.value);
- } else {
- samRecord.setAttribute(entry.getKey(), valueAndFlag.value);
- }
- } else {
- samRecord.setAttribute(entry.getKey(), entry.getValue());
- }
- }
- }
-
- //
- // Error methods
- //
-
- private RuntimeException reportFatalErrorParsingLine(final String reason) {
- return new SAMFormatException(makeErrorString(reason));
- }
-
- private RuntimeException reportFatalErrorParsingLine(final String reason, final Throwable throwable) {
- return new SAMFormatException(makeErrorString(reason), throwable);
- }
-
- private void reportErrorParsingLine(final String reason) {
- final String errorMessage = makeErrorString(reason);
-
- if (validationStringency == ValidationStringency.STRICT) {
- throw new SAMFormatException(errorMessage);
- } else if (validationStringency == ValidationStringency.LENIENT) {
- System.err
- .println("Ignoring SAM validation error due to lenient parsing:");
- System.err.println(errorMessage);
- }
- }
-
- private void reportErrorParsingLine(final Exception e) {
- final String errorMessage = makeErrorString(e.getMessage());
- if (validationStringency == ValidationStringency.STRICT) {
- throw new SAMFormatException(errorMessage);
- } else if (validationStringency == ValidationStringency.LENIENT) {
- System.err
- .println("Ignoring SAM validation error due to lenient parsing:");
- System.err.println(errorMessage);
- }
- }
-
- private String makeErrorString(final String reason) {
- String fileMessage = "";
- if (mFile != null) {
- fileMessage = "File " + mFile + "; ";
- }
- return "Error parsing text SAM file. "
- + reason + "; " + fileMessage + "Line "
- + (this.currentLineNumber <= 0 ? "unknown" : this.currentLineNumber)
- + "\nLine: " + this.currentLine;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMProgramRecord.java b/src/main/java/htsjdk/samtools/SAMProgramRecord.java
deleted file mode 100644
index 3bbecf9..0000000
--- a/src/main/java/htsjdk/samtools/SAMProgramRecord.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * In-memory representation of @PG SAM header record.
- */
-public class SAMProgramRecord extends AbstractSAMHeaderRecord {
- public static final String PROGRAM_GROUP_ID_TAG = "ID";
- public static final String PROGRAM_NAME_TAG = "PN";
- public static final String PROGRAM_VERSION_TAG = "VN";
- public static final String COMMAND_LINE_TAG = "CL";
- public static final String PREVIOUS_PROGRAM_GROUP_ID_TAG = "PP";
- private String mProgramGroupId;
- public static final Set<String> STANDARD_TAGS = Collections.unmodifiableSet(
- new HashSet<String>(Arrays.asList(PROGRAM_GROUP_ID_TAG,
- PROGRAM_NAME_TAG,
- PROGRAM_VERSION_TAG,
- COMMAND_LINE_TAG,
- PREVIOUS_PROGRAM_GROUP_ID_TAG)) );
-
- public SAMProgramRecord(final String programGroupId) {
- this.mProgramGroupId = programGroupId;
- }
-
- public SAMProgramRecord(final String id, SAMProgramRecord srcProgramRecord) {
- mProgramGroupId = id;
- for (final Map.Entry<String, String> entry : srcProgramRecord.getAttributes()) {
- setAttribute(entry.getKey(), entry.getValue());
- }
- }
-
- public String getId() {
- return getProgramGroupId();
- }
-
- public String getProgramGroupId() {
- return mProgramGroupId;
- }
-
- public String getProgramName() {
- return (String)getAttribute(PROGRAM_NAME_TAG);
- }
-
- public void setProgramName(final String name) {
- setAttribute(PROGRAM_NAME_TAG, name);
- }
-
- public String getProgramVersion() {
- return (String)getAttribute(PROGRAM_VERSION_TAG);
- }
-
- public void setProgramVersion(final String version) {
- setAttribute(PROGRAM_VERSION_TAG, version);
- }
-
- public String getCommandLine() {
- return (String)getAttribute(COMMAND_LINE_TAG);
- }
-
- public void setCommandLine(final String commandLine) {
- setAttribute(COMMAND_LINE_TAG, commandLine);
- }
-
- public String getPreviousProgramGroupId() {
- return (String)getAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG);
- }
-
- public void setPreviousProgramGroupId(final String id) {
- setAttribute(PREVIOUS_PROGRAM_GROUP_ID_TAG, id);
- }
-
-
-
- /**
- * @return true if this == that except for the program group ID, which is arbitrary
- */
- public boolean equivalent(final SAMProgramRecord that) {
- return attributesEqual(that);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final SAMProgramRecord that = (SAMProgramRecord) o;
-
- if (!attributesEqual(that)) return false;
- if (mProgramGroupId != null ? !mProgramGroupId.equals(that.mProgramGroupId) : that.mProgramGroupId != null) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = mProgramGroupId != null ? mProgramGroupId.hashCode() : 0;
- result = 31 * result + attributesHashCode();
- return result;
- }
-
- Set<String> getStandardTags() {
- return STANDARD_TAGS;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java b/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java
deleted file mode 100644
index fd81852..0000000
--- a/src/main/java/htsjdk/samtools/SAMReadGroupRecord.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.Iso8601Date;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Header information about a read group.
- */
-public class SAMReadGroupRecord extends AbstractSAMHeaderRecord
-{
- private String mReadGroupId = null;
- public static final String READ_GROUP_ID_TAG = "ID";
- public static final String SEQUENCING_CENTER_TAG = "CN";
- public static final String DESCRIPTION_TAG = "DS";
- public static final String DATE_RUN_PRODUCED_TAG = "DT";
- public static final String FLOW_ORDER_TAG = "FO";
- public static final String KEY_SEQUENCE_TAG = "KS";
- public static final String LIBRARY_TAG = "LB";
- public static final String PROGRAM_GROUP_TAG = "PG";
- public static final String PREDICTED_MEDIAN_INSERT_SIZE_TAG = "PI";
- public static final String PLATFORM_TAG = "PL";
- public static final String PLATFORM_MODEL_TAG = "PM";
- public static final String PLATFORM_UNIT_TAG = "PU";
- public static final String READ_GROUP_SAMPLE_TAG = "SM";
-
- /* Platform values for the @RG-PL tag */
- public enum PlatformValue {
- CAPILLARY, LS454, ILLUMINA,
- SOLID, HELICOS, IONTORRENT,
- ONT, PACBIO
- }
-
- public static final Set<String> STANDARD_TAGS =
- new HashSet<String>(Arrays.asList(READ_GROUP_ID_TAG, SEQUENCING_CENTER_TAG, DESCRIPTION_TAG,
- DATE_RUN_PRODUCED_TAG, FLOW_ORDER_TAG, KEY_SEQUENCE_TAG, LIBRARY_TAG,
- PROGRAM_GROUP_TAG, PREDICTED_MEDIAN_INSERT_SIZE_TAG, PLATFORM_TAG, PLATFORM_MODEL_TAG,
- PLATFORM_UNIT_TAG, READ_GROUP_SAMPLE_TAG));
-
- public SAMReadGroupRecord(final String id) { mReadGroupId = id; }
-
- public SAMReadGroupRecord(final String id, final SAMReadGroupRecord srcProgramRecord) {
- mReadGroupId = id;
- for (final Map.Entry<String, String> entry : srcProgramRecord.getAttributes()) {
- setAttribute(entry.getKey(), entry.getValue());
- }
- }
-
- public String getId() { return getReadGroupId(); }
- public String getReadGroupId() { return mReadGroupId; }
-
- public String getSample() { return getAttribute(READ_GROUP_SAMPLE_TAG); }
- public void setSample(final String value) { setAttribute(READ_GROUP_SAMPLE_TAG, value); }
-
- public String getLibrary() { return getAttribute(LIBRARY_TAG); }
- public void setLibrary(final String value) { setAttribute(LIBRARY_TAG, value); }
-
- public String getPlatformUnit() { return getAttribute(PLATFORM_UNIT_TAG); }
- public void setPlatformUnit(final String pu) { setAttribute(PLATFORM_UNIT_TAG, pu); }
-
- public String getPlatform() { return getAttribute(PLATFORM_TAG); }
- public void setPlatform(final String platform) { setAttribute(PLATFORM_TAG, platform); }
-
- public Date getRunDate() {
- final String dt = getAttribute(DATE_RUN_PRODUCED_TAG);
- if (dt == null) return null;
- else return new Iso8601Date(dt);
- }
-
- public String getFlowOrder() { return getAttribute(FLOW_ORDER_TAG); }
- public void setFlowOrder(final String flowOrder) { setAttribute(FLOW_ORDER_TAG, flowOrder); }
-
- public String getKeySequence() { return getAttribute(KEY_SEQUENCE_TAG); }
- public void setKeySequence(final String keySequence) { setAttribute(KEY_SEQUENCE_TAG, keySequence); }
-
- /**
- * Converts to Iso8601Date if not already in that form.
- */
- public void setRunDate(Date runDate) {
- if (runDate != null && !(runDate instanceof Iso8601Date)) {
- runDate = new Iso8601Date(runDate);
- }
- setAttribute(DATE_RUN_PRODUCED_TAG, runDate != null ? runDate.toString() : null);
- }
-
- public String getSequencingCenter() { return getAttribute(SEQUENCING_CENTER_TAG); }
- public void setSequencingCenter(final String center) { setAttribute(SEQUENCING_CENTER_TAG, center); }
-
- public String getDescription() { return getAttribute(DESCRIPTION_TAG); }
- public void setDescription(final String description) { setAttribute(DESCRIPTION_TAG, description); }
-
- public Integer getPredictedMedianInsertSize() {
- final String stringRep = getAttribute(PREDICTED_MEDIAN_INSERT_SIZE_TAG);
- if (stringRep == null) return null;
- return Integer.parseInt(stringRep);
- }
- public void setPredictedMedianInsertSize(final Integer predictedMedianInsertSize) {
-
- setAttribute(PREDICTED_MEDIAN_INSERT_SIZE_TAG, (predictedMedianInsertSize == null? null: predictedMedianInsertSize.toString()));
- }
-
- public String getProgramGroup() { return getAttribute(PROGRAM_GROUP_TAG); }
- public void setProgramGroup(final String programGroup) { setAttribute(PROGRAM_GROUP_TAG, programGroup); }
-
- public String getPlatformModel() { return getAttribute(PLATFORM_MODEL_TAG); }
- public void setPlatformModel(final String platformModel) { setAttribute(PLATFORM_MODEL_TAG, platformModel); }
-
- /**
- * @return true if this == that except for the read group ID, which is arbitrary
- */
- public boolean equivalent(final SAMReadGroupRecord that) {
- return attributesEqual(that);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final SAMReadGroupRecord that = (SAMReadGroupRecord) o;
-
- if (!attributesEqual(that)) return false;
- if (mReadGroupId != null ? !mReadGroupId.equals(that.mReadGroupId) : that.mReadGroupId != null) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- return mReadGroupId.hashCode();
- }
-
- Set<String> getStandardTags() {
- return STANDARD_TAGS;
- }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMRecord.java b/src/main/java/htsjdk/samtools/SAMRecord.java
deleted file mode 100644
index 13ec386..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecord.java
+++ /dev/null
@@ -1,2378 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.Locatable;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.*;
-
-
-/**
- * Java binding for a SAM file record. c.f. http://samtools.sourceforge.net/SAM1.pdf
- * <p>
- * The presence of reference name/reference index and alignment start
- * do not necessarily mean that a read is aligned. Those values may merely be set to force a SAMRecord
- * to appear in a certain place in the sort order. The readUnmappedFlag must be checked to determine whether
- * or not a read is mapped. Only if the readUnmappedFlag is false can the reference name/index and alignment start
- * be interpreted as indicating an actual alignment position.
- * <p>
- * Likewise, presence of mate reference name/index and mate alignment start do not necessarily mean that the
- * mate is aligned. These may be set for an unaligned mate if the mate has been forced into a particular place
- * in the sort order per the above paragraph. Only if the mateUnmappedFlag is false can the mate reference name/index
- * and mate alignment start be interpreted as indicating the actual alignment position of the mate.
- * <p>
- * Note also that there are a number of getters & setters that are linked, i.e. they present different representations
- * of the same underlying data. In these cases there is typically a representation that is preferred because it
- * ought to be faster than some other representation. The following are the preferred representations:
- * </p><ul>
- * <li>getReadNameLength() is preferred to getReadName().length()</li>
- * <li>get/setReadBases() is preferred to get/setReadString()</li>
- * <li>get/setBaseQualities() is preferred to get/setBaseQualityString()</li>
- * <li>get/setReferenceIndex() is preferred to get/setReferenceName() for records with valid SAMFileHeaders</li>
- * <li>get/setMateReferenceIndex() is preferred to get/setMateReferenceName() for records with valid SAMFileHeaders</li>
- * <li>getCigarLength() is preferred to getCigar().getNumElements()</li>
- * <li>get/setCigar() is preferred to get/setCigarString()</li>
- * </ul>
- * <p>
- * setHeader() is called by the SAM reading code, so the get/setReferenceIndex() and get/setMateReferenceIndex()
- * methods will have access to the sequence dictionary to resolve reference and mate reference names to dictionary
- * indices.
- * <p>
- * setHeader() need not be called explicitly when writing SAMRecords, however the writers require a record
- * in order to call get/setReferenceIndex() and get/setMateReferenceIndex(). Therefore adding records to a writer
- * has a side effect: any record that does not have an assigned header at the time it is added to a writer will be
- * updated and assigned the header associated with the writer.
- * <p>
- * Some of the get() methods return values that are mutable, due to the limitations of Java. A caller should
- * never change the value returned by a get() method. If you want to change the value of some attribute of a
- * SAMRecord, create a new value object and call the appropriate set() method.
- * </p>
- * Note that setIndexingBin() need not be called when writing SAMRecords. It will be computed as necessary. It is only
- * present as an optimization in the event that the value is already known and need not be computed.
- * <p>
- * By default, extensive validation of SAMRecords is done when they are read. Very limited validation is done when
- * values are set onto SAMRecords.
- * <p>
- * <h3>Notes on Headerless SAMRecords</h3>
- * <p>
- * If the header is null, the following SAMRecord methods may throw exceptions:
- * <ul>
- * <li>getReferenceIndex</li>
- * <li>setReferenceIndex</li>
- * <li>getMateReferenceIndex</li>
- * <li>setMateReferenceIndex</li>
- * </ul><p>
- * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
- * non-null header values.
- * <p>
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- * <p>
- * Also, SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require the reference and mate reference names to be valid
- * in order to be written. At the time a record is added to a writer it will be updated to use the header associated
- * with the writer and the reference and mate reference names must be valid for that header. If the names cannot be
- * resolved using the writer's header, an exception will be thrown.
- * <p>
- * @author alecw at broadinstitute.org
- * @author mishali.naik at intel.com
- */
-public class SAMRecord implements Cloneable, Locatable, Serializable {
- public static final long serialVersionUID = 1L;
-
- /**
- * Alignment score for a good alignment, but where computing a Phred-score is not feasible.
- */
- public static final int UNKNOWN_MAPPING_QUALITY = 255;
-
- /**
- * Alignment score for an unaligned read.
- */
- public static final int NO_MAPPING_QUALITY = 0;
-
- /**
- * If a read has this reference name, it is unaligned, but not all unaligned reads have
- * this reference name (see above).
- */
- public static final String NO_ALIGNMENT_REFERENCE_NAME = "*";
-
- /**
- * If a read has this reference index, it is unaligned, but not all unaligned reads have
- * this reference index (see above).
- */
- public static final int NO_ALIGNMENT_REFERENCE_INDEX = -1;
-
- /**
- * Cigar string for an unaligned read.
- */
- public static final String NO_ALIGNMENT_CIGAR = "*";
-
- /**
- * If a read has reference name "*", it will have this value for position.
- */
- public static final int NO_ALIGNMENT_START = GenomicIndexUtil.UNSET_GENOMIC_LOCATION;
-
- /**
- * This should rarely be used, since a read with no sequence doesn't make much sense.
- */
- public static final byte[] NULL_SEQUENCE = new byte[0];
-
- public static final String NULL_SEQUENCE_STRING = "*";
-
- /**
- * This should rarely be used, since all reads should have quality scores.
- */
- public static final byte[] NULL_QUALS = new byte[0];
- public static final String NULL_QUALS_STRING = "*";
-
- /**
- * abs(insertSize) must be <= this
- */
- public static final int MAX_INSERT_SIZE = 1<<29;
-
- /**
- * Tags that are known to need the reverse complement if the read is reverse complemented.
- */
- public static List<String> TAGS_TO_REVERSE_COMPLEMENT = Arrays.asList(SAMTag.E2.name(), SAMTag.SQ.name());
-
- /**
- * Tags that are known to need the reverse if the read is reverse complemented.
- */
- public static List<String> TAGS_TO_REVERSE = Arrays.asList(SAMTag.OQ.name(), SAMTag.U2.name());
-
- private String mReadName = null;
- private byte[] mReadBases = NULL_SEQUENCE;
- private byte[] mBaseQualities = NULL_QUALS;
- private String mReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
- private int mAlignmentStart = NO_ALIGNMENT_START;
- private transient int mAlignmentEnd = NO_ALIGNMENT_START;
- private int mMappingQuality = NO_MAPPING_QUALITY;
- private String mCigarString = NO_ALIGNMENT_CIGAR;
- private Cigar mCigar = null;
- private List<AlignmentBlock> mAlignmentBlocks = null;
- private int mFlags = 0;
- private String mMateReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
- private int mMateAlignmentStart = 0;
- private int mInferredInsertSize = 0;
- private SAMBinaryTagAndValue mAttributes = null;
- protected Integer mReferenceIndex = null;
- protected Integer mMateReferenceIndex = null;
- private Integer mIndexingBin = null;
-
- /**
- * Some attributes (e.g. CIGAR) are not decoded immediately. Use this to decide how to validate when decoded.
- */
- private ValidationStringency mValidationStringency = ValidationStringency.SILENT;
-
- /**
- * File source of this record. May be null. Note that this field is not serializable (and therefore marked
- * as transient) due to encapsulated stream objects within it -- so serializing a SAMRecord will cause its
- * file source to be lost (if it had one).
- */
- private transient SAMFileSource mFileSource;
- private SAMFileHeader mHeader = null;
-
- /** Transient Map of attributes for use by anyone. */
- private transient Map<Object,Object> transientAttributes;
-
- public SAMRecord(final SAMFileHeader header) {
- mHeader = header;
- }
-
- public String getReadName() {
- return mReadName;
- }
-
- /**
- * This method is preferred over getReadName().length(), because for BAMRecord
- * it may be faster.
- * @return length not including a null terminator.
- */
- public int getReadNameLength() {
- return mReadName.length();
- }
-
- public void setReadName(final String value) {
- mReadName = value;
- }
-
- /**
- * @return read sequence as a string of ACGTN=.
- */
- public String getReadString() {
- final byte[] readBases = getReadBases();
- if (readBases.length == 0) {
- return NULL_SEQUENCE_STRING;
- }
- return StringUtil.bytesToString(readBases);
- }
-
- public void setReadString(final String value) {
- if (NULL_SEQUENCE_STRING.equals(value)) {
- mReadBases = NULL_SEQUENCE;
- } else {
- final byte[] bases = StringUtil.stringToBytes(value);
- SAMUtils.normalizeBases(bases);
- setReadBases(bases);
- }
- }
-
-
- /**
- * Do not modify the value returned by this method. If you want to change the bases, create a new
- * byte[] and call setReadBases() or call setReadString().
- * @return read sequence as ASCII bytes ACGTN=.
- */
- public byte[] getReadBases() {
- return mReadBases;
- }
-
- public void setReadBases(final byte[] value) {
- mReadBases = value;
- }
-
- /**
- * This method is preferred over getReadBases().length, because for BAMRecord it may be faster.
- * @return number of bases in the read.
- */
- public int getReadLength() {
- return getReadBases().length;
- }
-
- /**
- * @return Base qualities, encoded as a FASTQ string.
- */
- public String getBaseQualityString() {
- if (Arrays.equals(NULL_QUALS, getBaseQualities())) {
- return NULL_QUALS_STRING;
- }
- return SAMUtils.phredToFastq(getBaseQualities());
- }
-
- public void setBaseQualityString(final String value) {
- if (NULL_QUALS_STRING.equals(value)) {
- setBaseQualities(NULL_QUALS);
- } else {
- setBaseQualities(SAMUtils.fastqToPhred(value));
- }
- }
-
- /**
- * Do not modify the value returned by this method. If you want to change the qualities, create a new
- * byte[] and call setBaseQualities() or call setBaseQualityString().
- * @return Base qualities, as binary phred scores (not ASCII).
- */
- public byte[] getBaseQualities() {
- return mBaseQualities;
- }
-
- public void setBaseQualities(final byte[] value) {
- mBaseQualities = value;
- }
-
- /**
- * If the original base quality scores have been store in the "OQ" tag will return the numeric
- * score as a byte[]
- */
- public byte[] getOriginalBaseQualities() {
- final String oqString = (String) getAttribute("OQ");
- if (oqString != null && !oqString.isEmpty()) {
- return SAMUtils.fastqToPhred(oqString);
- }
- else {
- return null;
- }
- }
-
- /**
- * Sets the original base quality scores into the "OQ" tag as a String. Supplied value should be
- * as phred-scaled numeric qualities.
- */
- public void setOriginalBaseQualities(final byte[] oq) {
- setAttribute("OQ", SAMUtils.phredToFastq(oq));
- }
-
- private static boolean hasReferenceName(final Integer referenceIndex, final String referenceName) {
- return (referenceIndex != null && !referenceIndex.equals(NO_ALIGNMENT_REFERENCE_INDEX)) ||
- (!NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName));
- }
-
- /**
- * @return true if this SAMRecord has a reference, either as a String or index (or both).
- */
- private boolean hasReferenceName() {
- return hasReferenceName(mReferenceIndex, mReferenceName);
- }
-
- /**
- * @return true if this SAMRecord has a mate reference, either as a String or index (or both).
- */
- private boolean hasMateReferenceName() {
- return hasReferenceName(mMateReferenceIndex, mMateReferenceName);
- }
-
- /**
- * @return Reference name, or NO_ALIGNMENT_REFERENCE_NAME (*) if the record has no reference name
- */
- public String getReferenceName() { return mReferenceName; }
-
- /**
- * Sets the reference name for this record. If the record has a valid SAMFileHeader and the reference
- * name is present in the associated sequence dictionary, the record's reference index will also be
- * updated with the corresponding sequence index. If referenceName is NO_ALIGNMENT_REFERENCE_NAME, sets
- * the reference index to NO_ALIGNMENT_REFERENCE_INDEX.
- *
- * @param referenceName - must not be null
- * @throws IllegalArgumentException if {@code referenceName} is null
- */
- public void setReferenceName(final String referenceName) {
- if (null == referenceName) {
- throw new IllegalArgumentException(
- "Reference name must not be null. Use SAMRecord.NO_ALIGNMENT_REFERENCE_NAME to reset the reference name.");
- }
- if (null != mHeader) {
- mReferenceIndex = resolveIndexFromName(referenceName, mHeader, false);
- // String.intern() is surprisingly expensive, so avoid it by calling resolveNameFromIndex
- // and using the interned value in the sequence dictionary if possible
- mReferenceName = null == mReferenceIndex ?
- referenceName.intern() :
- resolveNameFromIndex(mReferenceIndex, mHeader);
- }
- else if (NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName)) {
- mReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
- mReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
- }
- else {
- mReferenceName = referenceName.intern();
- mReferenceIndex = null;
- }
- }
-
- /**
- * Returns the reference index for this record.
- *
- * If the reference name for this record has previously been resolved against the sequence dictionary, the corresponding
- * index is returned directly. Otherwise, the record must have a non-null SAMFileHeader that can be used to
- * resolve the index for the record's current reference name, unless the reference name is NO_ALIGNMENT_REFERENCE_NAME.
- * If the record has a header, and the name does not appear in the header's sequence dictionary, the value
- * NO_ALIGNMENT_REFERENCE_INDEX (-1) will be returned. If the record does not have a header, an IllegalStateException
- * is thrown.
- *
- * @return Index in the sequence dictionary of the reference sequence. If the read has no reference sequence, or if
- * the reference name is not found in the sequence index, NO_ALIGNMENT_REFERENCE_INDEX (-1) is returned.
- *
- * @throws IllegalStateException if the reference index must be resolved but cannot be because the SAMFileHeader
- * for the record is null.
- */
- public Integer getReferenceIndex() {
- if (null == mReferenceIndex) { // try to resolve the reference index
- mReferenceIndex = resolveIndexFromName(mReferenceName, mHeader, false);
- if (null == mReferenceIndex) {
- mReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
- }
- }
- return mReferenceIndex;
- }
-
- /**
- * Updates the reference index. The record must have a valid SAMFileHeader unless the referenceIndex parameter equals
- * NO_ALIGNMENT_REFERENCE_INDEX, and the reference index must appear in the header's sequence dictionary. If the
- * reference index is valid, the reference name will also be resolved and updated to the name for the sequence
- * dictionary entry corresponding to the index.
- *
- * @param referenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the
- * record must have a SAMFileHeader and the index must exist in the associated sequence
- * dictionary.
- * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_INDEX and the
- * SAMFileHeader is null for this record
- * @throws IllegalArgumentException if {@code referenceIndex} is not found in the sequence dictionary in the header
- * for this record.
- */
- public void setReferenceIndex(final int referenceIndex) {
- // resolveNameFromIndex throws if the index can't be resolved
- setReferenceName(resolveNameFromIndex(referenceIndex, mHeader));
- // setReferenceName does this as a side effect, but set the value here to be explicit
- mReferenceIndex = referenceIndex;
- }
-
- /**
- * @return Mate reference name, or NO_ALIGNMENT_REFERENCE_NAME (*) if the record has no mate reference name
- */
- public String getMateReferenceName() {
- return mMateReferenceName;
- }
-
- /**
- * Sets the mate reference name for this record. If the record has a valid SAMFileHeader and the mate reference
- * name is present in the associated sequence dictionary, the record's mate reference index will also be
- * updated with the corresponding sequence index. If mateReferenceName is NO_ALIGNMENT_REFERENCE_NAME, sets the
- * mate reference index to NO_ALIGNMENT_REFERENCE_INDEX.
- *
- * @param mateReferenceName - must not be null
- * @throws IllegalArgumentException if {@code mateReferenceName} is null
- */
- public void setMateReferenceName(final String mateReferenceName) {
- if (null == mateReferenceName) {
- throw new IllegalArgumentException("Mate reference name must not be null. Use SAMRecord.NO_ALIGNMENT_REFERENCE_NAME to reset the mate reference name.");
- }
- if (null != mHeader) {
- mMateReferenceIndex = resolveIndexFromName(mateReferenceName, mHeader, false);
- // String.intern() is surprisingly expensive, so avoid it by calling resolveNameFromIndex
- // and using the interned value in the sequence dictionary if possible
- mMateReferenceName = null == mMateReferenceIndex ?
- mateReferenceName.intern() :
- resolveNameFromIndex(mMateReferenceIndex, mHeader);
- }
- else if (NO_ALIGNMENT_REFERENCE_NAME.equals(mateReferenceName)) {
- mMateReferenceName = NO_ALIGNMENT_REFERENCE_NAME;
- mMateReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
- }
- else {
- mMateReferenceName = mateReferenceName.intern();
- mMateReferenceIndex = null;
- }
- }
-
- /**
- * Returns the mate reference index for this record.
- *
- * If the mate reference name for this record has previously been resolved against the sequence dictionary, the
- * corresponding index is returned directly. Otherwise, the record must have a non-null SAMFileHeader that can be
- * used to resolve the index for the record's current mate reference name, unless the mate reference name is
- * NO_ALIGNMENT_REFERENCE_NAME. If the record has a header, and the name does not appear in the header's
- * sequence dictionary, the value NO_ALIGNMENT_REFERENCE_INDEX (-1) will be returned. If the record does not have
- * a header, an IllegalStateException is thrown.
- *
- * @return Index in the sequence dictionary of the mate reference sequence. If the read has no mate reference
- * sequence, or if the mate reference name is not found in the sequence index, NO_ALIGNMENT_REFERENCE_INDEX (-1)
- * is returned.
- *
- * @throws IllegalStateException if the mate reference index must be resolved but cannot be because the
- * SAMFileHeader for the record is null.
- */
- public Integer getMateReferenceIndex() {
- if (null == mMateReferenceIndex) { // try to resolve the mate reference index
- mMateReferenceIndex = resolveIndexFromName(mMateReferenceName, mHeader, false);
- if (null == mMateReferenceIndex) {
- mMateReferenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
- }
- }
- return mMateReferenceIndex;
- }
-
- /**
- * Updates the mate reference index. The record must have a valid SAMFileHeader, and the mate reference index must appear in
- * the header's sequence dictionary, unless the mateReferenceIndex parameter equals NO_ALIGNMENT_REFERENCE_INDEX. If the mate
- * reference index is valid, the mate reference name will also be resolved and updated to the name for the sequence dictionary
- * entry corresponding to the index.
- *
- * @param mateReferenceIndex Must either equal NO_ALIGNMENT_REFERENCE_INDEX (-1) indicating no reference, or the
- * record must have a SAMFileHeader and the index must exist in the associated sequence
- * dictionary.
- * @throws IllegalStateException if the SAMFileHeader is null for this record
- * @throws IllegalArgumentException if the mate reference index is not found in the sequence dictionary in the header for this record.
- */
- public void setMateReferenceIndex(final int mateReferenceIndex) {
- // resolveNameFromIndex throws if the index can't be resolved
- setMateReferenceName(resolveNameFromIndex(mateReferenceIndex, mHeader));
- // setMateReferenceName does this as a side effect, but set the value here to be explicit
- mMateReferenceIndex = mateReferenceIndex;
- }
-
- /**
- * Static method that resolves and returns the reference index corresponding to a given reference name.
- *
- * @param referenceName If {@code referenceName} is NO_ALIGNMENT_REFERENCE_NAME, the value NO_ALIGNMENT_REFERENCE_INDEX
- * is returned directly. Otherwise {@code referenceName} must be looked up in the header's sequence
- * dictionary.
- * @param header SAMFileHeader to use when resolving {@code referenceName} to an index. Must be non null if the
- * {@code referenceName} is not NO_ALIGNMENT_REFERENCE_NAME.
- * @param strict if true, throws if {@code referenceName} does not appear in the header's sequence dictionary
- * @returns the reference index corresponding to the {@code referenceName}, or null if strict is false and {@code referenceName}
- * does not appear in the header's sequence dictionary.
- * @throws IllegalStateException if {@code referenceName} is not equal to NO_ALIGNMENT_REFERENCE_NAME and the header is null
- * @throws IllegalArgumentException if strict is true and the name does not appear in header's sequence dictionary.
- *
- * Does not mutate the SAMRecord.
- */
- protected static Integer resolveIndexFromName(final String referenceName, final SAMFileHeader header, final boolean strict) {
- Integer referenceIndex = NO_ALIGNMENT_REFERENCE_INDEX;
- if (!NO_ALIGNMENT_REFERENCE_NAME.equals(referenceName)) {
- if (null == header) {
- throw new IllegalStateException("A non-null SAMFileHeader is required to resolve the reference index or name");
- }
- referenceIndex = header.getSequenceIndex(referenceName);
- if (NO_ALIGNMENT_REFERENCE_INDEX == referenceIndex) {
- if (strict) {
- throw new IllegalArgumentException("Reference index for '" + referenceName + "' not found in sequence dictionary.");
- }
- else {
- referenceIndex = null; // unresolved.
- }
- }
- }
- return referenceIndex;
- }
-
- /**
- * Static method that resolves and returns the reference name corresponding to a given reference index.
- *
- * @param referenceIndex If {@code referenceIndex} is NO_ALIGNMENT_REFERENCE_INDEX, the value NO_ALIGNMENT_REFERENCE_NAME
- * is returned directly. Otherwise {@code referenceIndex} must be looked up in the header's sequence
- * dictionary.
- * @param header SAMFileHeader to use when resolving {@code referenceIndex} to a name. Must be non null unless the
- * the {@code referenceIndex} is NO_ALIGNMENT_REFERENCE_INDEX.
- * @returns the reference name corresponding to {@code referenceIndex}
- * @throws IllegalStateException if {@code referenceIndex} is not equal to NO_ALIGNMENT_REFERENCE_NAME and the header
- * is null
- * @throws IllegalArgumentException if {@code referenceIndex} does not appear in header's sequence dictionary.
- *
- * Does not mutate the SAMRecord.
- */
- protected static String resolveNameFromIndex(final int referenceIndex, final SAMFileHeader header) {
- String referenceName = NO_ALIGNMENT_REFERENCE_NAME;
- if (NO_ALIGNMENT_REFERENCE_INDEX != referenceIndex) {
- if (null == header) {
- throw new IllegalStateException("A non-null SAMFileHeader is required to resolve the reference index or name");
- }
- SAMSequenceRecord samSeq = header.getSequence(referenceIndex);
- if (null == samSeq) {
- throw new IllegalArgumentException("Reference name for '" + referenceIndex + "' not found in sequence dictionary.");
- }
- referenceName = samSeq.getSequenceName();
- }
-
- return referenceName;
- }
-
- /**
- * @return 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
- */
- public int getAlignmentStart() {
- return mAlignmentStart;
- }
-
- /**
- * @param value 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
- */
- public void setAlignmentStart(final int value) {
- mAlignmentStart = value;
- // Clear cached alignment end
- mAlignmentEnd = NO_ALIGNMENT_START;
- // Change to alignmentStart could change indexing bin
- setIndexingBin(null);
- }
-
- /**
- * @return 1-based inclusive rightmost position of the clipped sequence, or 0 read if unmapped.
- */
- public int getAlignmentEnd() {
- if (getReadUnmappedFlag()) {
- return NO_ALIGNMENT_START;
- }
- else if (this.mAlignmentEnd == NO_ALIGNMENT_START) {
- this.mAlignmentEnd = mAlignmentStart + getCigar().getReferenceLength() - 1;
- }
-
- return this.mAlignmentEnd;
- }
-
- /**
- * @return the alignment start (1-based, inclusive) adjusted for clipped bases. For example if the read
- * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
- * then this method will return 96.
- *
- * Invalid to call on an unmapped read.
- */
- public int getUnclippedStart() {
- return SAMUtils.getUnclippedStart(getAlignmentStart(), getCigar());
- }
-
- /**
- * @return the alignment end (1-based, inclusive) adjusted for clipped bases. For example if the read
- * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
- * then this method will return 107.
- *
- * Invalid to call on an unmapped read.
- */
- public int getUnclippedEnd() {
- return SAMUtils.getUnclippedEnd(getAlignmentEnd(), getCigar());
- }
-
-
- /**
- * @param offset 1-based location within the unclipped sequence or 0 if there is no position.
- * <p/>
- * Non static version of the static function with the same name.
- * @return 1-based inclusive reference position of the unclipped sequence at a given offset,
- */
- public int getReferencePositionAtReadPosition(final int offset) {
- return getReferencePositionAtReadPosition(this, offset);
- }
-
- /**
- * @param rec record to use
- * @param offset 1-based location within the unclipped sequence
- * @return 1-based inclusive reference position of the unclipped sequence at a given offset,
- * or 0 if there is no position.
- * For example, given the sequence NNNAAACCCGGG, cigar 3S9M, and an alignment start of 1,
- * and a (1-based)offset 10 (start of GGG) it returns 7 (1-based offset starting after the soft clip.
- * For example: given the sequence AAACCCGGGTTT, cigar 4M1D6M, an alignment start of 1,
- * an offset of 4 returns reference position 4, an offset of 5 returns reference position 6.
- * Another example: given the sequence AAACCCGGGTTT, cigar 4M1I6M, an alignment start of 1,
- * an offset of 4 returns reference position 4, an offset of 5 returns 0.
- */
- public static int getReferencePositionAtReadPosition(final SAMRecord rec, final int offset) {
-
- if (offset == 0) return 0;
-
- for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
- if (CoordMath.getEnd(alignmentBlock.getReadStart(), alignmentBlock.getLength()) < offset) {
- continue;
- } else if (offset < alignmentBlock.getReadStart()) {
- return 0;
- } else {
- return alignmentBlock.getReferenceStart() + offset - alignmentBlock.getReadStart();
- }
- }
- return 0; // offset not located in an alignment block
- }
-
-
- /**
- * @param pos 1-based reference position
- * return the offset
- * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
- * unclipped sequence at a given reference position, or 0 if there is no such position.
- *
- * See examples in the static version below
- */
- public int getReadPositionAtReferencePosition(final int pos) {
- return getReadPositionAtReferencePosition(this, pos, false);
- }
-
- /**
- * @param pos 1-based reference position
- * @param returnLastBaseIfDeleted if positive, and reference position matches a deleted base in the read, function will
- * return the offset
- * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
- * unclipped sequence at a given reference position,
- * or 0 if there is no such position. If returnLastBaseIfDeleted is true deletions are assumed to "live" on the last read base
- * in the preceding block.
- *
- * Non-static version of static function with the same name. See examples below.
- */
- public int getReadPositionAtReferencePosition(final int pos, final boolean returnLastBaseIfDeleted) {
- return getReadPositionAtReferencePosition(this, pos, returnLastBaseIfDeleted);
- }
-
- /**
- * @param rec record to use
- * @param pos 1-based reference position
- * @param returnLastBaseIfDeleted if positive, and reference position matches a deleted base in the read, function will
- * return the offset
- * @return 1-based (to match getReferencePositionAtReadPosition behavior) inclusive position into the
- * unclipped sequence at a given reference position,
- * or 0 if there is no such position. If returnLastBaseIfDeleted is true deletions are assumed to "live" on the last read base
- * in the preceding block.
- * For example, given the sequence NNNAAACCCGGG, cigar 3S9M, and an alignment start of 1,
- * and a (1-based)pos of 7 (start of GGG) it returns 10 (1-based offset including the soft clip.
- * For example: given the sequence AAACCCGGGT, cigar 4M1D6M, an alignment start of 1,
- * a reference position of 4 returns offset of 4, a reference of 5 also returns an offset 4 (using "left aligning") if returnLastBaseIfDeleted
- * and 0 otherwise.
- * For example: given the sequence AAACtCGGGTT, cigar 4M1I6M, an alignment start of 1,
- * a position 4 returns an offset 5, a position of 5 returns 6 (the inserted base is the 5th offset), a position of 11 returns 0 since
- * that position in the reference doesn't overlap the read at all.
- *
- */
- public static int getReadPositionAtReferencePosition(final SAMRecord rec, final int pos, final boolean returnLastBaseIfDeleted) {
-
- if (pos <= 0) {
- return 0;
- }
-
- int lastAlignmentOffset = 0;
- for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
- if (CoordMath.getEnd(alignmentBlock.getReferenceStart(), alignmentBlock.getLength()) >= pos) {
- if (pos < alignmentBlock.getReferenceStart()) {
- //There must have been a deletion block that skipped
- return returnLastBaseIfDeleted ? lastAlignmentOffset : 0;
- } else {
- return pos - alignmentBlock.getReferenceStart() + alignmentBlock.getReadStart() ;
- }
- } else {
- // record the offset to the last base in the current block, in case the next block starts too late
- lastAlignmentOffset = alignmentBlock.getReadStart() + alignmentBlock.getLength() - 1 ;
- }
- }
- // if we are here, the reference position was not overlapping the read at all
- return 0;
- }
-
- /**
- * @return 1-based inclusive leftmost position of the clipped mate sequence, or 0 if there is no position.
- */
- public int getMateAlignmentStart() {
- return mMateAlignmentStart;
- }
-
- public void setMateAlignmentStart(final int mateAlignmentStart) {
- this.mMateAlignmentStart = mateAlignmentStart;
- }
-
- /**
- * @return insert size (difference btw 5' end of read & 5' end of mate), if possible, else 0.
- * Negative if mate maps to lower position than read.
- */
- public int getInferredInsertSize() {
- return mInferredInsertSize;
- }
-
- public void setInferredInsertSize(final int inferredInsertSize) {
- this.mInferredInsertSize = inferredInsertSize;
- }
-
- /**
- * @return phred scaled mapping quality. 255 implies valid mapping but quality is hard to compute.
- */
- public int getMappingQuality() {
- return mMappingQuality;
- }
-
- public void setMappingQuality(final int value) {
- mMappingQuality = value;
- }
-
- public String getCigarString() {
- if (mCigarString == null && getCigar() != null) {
- mCigarString = TextCigarCodec.encode(getCigar());
- }
- return mCigarString;
- }
-
- public void setCigarString(final String value) {
- mCigarString = value;
- mCigar = null;
- mAlignmentBlocks = null;
- // Clear cached alignment end
- mAlignmentEnd = NO_ALIGNMENT_START;
- // Change to cigar could change alignmentEnd, and thus indexing bin
- setIndexingBin(null);
- }
-
- /**
- * Do not modify the value returned by this method. If you want to change the Cigar, create a new
- * Cigar and call setCigar() or call setCigarString()
- * @return Cigar object for the read, or null if there is none.
- */
- public Cigar getCigar() {
- if (mCigar == null && mCigarString != null) {
- mCigar = TextCigarCodec.decode(mCigarString);
- if (null != getHeader() &&
- getValidationStringency() != ValidationStringency.SILENT &&
- !this.getReadUnmappedFlag()) {
- // Don't know line number, and don't want to force read name to be decoded.
- SAMUtils.processValidationErrors(this.validateCigar(-1L), -1L, getValidationStringency());
- }
- }
- return mCigar;
- }
-
- /**
- * This method is preferred over getCigar().getNumElements(), because for BAMRecord it may be faster.
- * @return number of cigar elements (number + operator) in the cigar string.
- */
- public int getCigarLength() {
- return getCigar().numCigarElements();
- }
-
- public void setCigar(final Cigar cigar) {
- initializeCigar(cigar);
- // Change to cigar could change alignmentEnd, and thus indexing bin
- setIndexingBin(null);
- }
-
- /**
- * For setting the Cigar string when BAMRecord has decoded it. Use this rather than setCigar()
- * so that indexing bin doesn't get clobbered.
- */
- protected void initializeCigar(final Cigar cigar) {
- this.mCigar = cigar;
- mCigarString = null;
- mAlignmentBlocks = null;
- // Clear cached alignment end
- mAlignmentEnd = NO_ALIGNMENT_START;
- }
-
- /**
- * Get the SAMReadGroupRecord for this SAMRecord.
- * @return The SAMReadGroupRecord from the SAMFileHeader for this SAMRecord, or null if
- * 1) this record has no RG tag, or 2) the header doesn't contain the read group with
- * the given ID.or 3) this record has no SAMFileHeader
- * @throws ClassCastException if RG tag does not have a String value.
- */
- public SAMReadGroupRecord getReadGroup() {
- final String rgId = (String)getAttribute(SAMTagUtil.getSingleton().RG);
- if (rgId == null || getHeader() == null) {
- return null;
- } else {
- return getHeader().getReadGroup(rgId);
- }
- }
-
- /**
- * It is preferable to use the get*Flag() methods that handle the flag word symbolically.
- */
- public int getFlags() {
- return mFlags;
- }
-
- public void setFlags(final int value) {
- mFlags = value;
- // Could imply change to readUnmapped flag, which could change indexing bin
- setIndexingBin(null);
- }
-
- /**
- * the read is paired in sequencing, no matter whether it is mapped in a pair.
- */
- public boolean getReadPairedFlag() {
- return (mFlags & SAMFlag.READ_PAIRED.flag) != 0;
- }
-
- private void requireReadPaired() {
- if (!getReadPairedFlag()) {
- throw new IllegalStateException("Inappropriate call if not paired read");
- }
- }
-
- /**
- * the read is mapped in a proper pair (depends on the protocol, normally inferred during alignment).
- */
- public boolean getProperPairFlag() {
- requireReadPaired();
- return getProperPairFlagUnchecked();
- }
-
- private boolean getProperPairFlagUnchecked() {
- return (mFlags & SAMFlag.PROPER_PAIR.flag) != 0;
- }
-
- /**
- * the query sequence itself is unmapped.
- */
- public boolean getReadUnmappedFlag() {
- return (mFlags & SAMFlag.READ_UNMAPPED.flag) != 0;
- }
-
- /**
- * the mate is unmapped.
- */
- public boolean getMateUnmappedFlag() {
- requireReadPaired();
- return getMateUnmappedFlagUnchecked();
- }
-
- private boolean getMateUnmappedFlagUnchecked() {
- return (mFlags & SAMFlag.MATE_UNMAPPED.flag) != 0;
- }
-
- /**
- * strand of the query (false for forward; true for reverse strand).
- */
- public boolean getReadNegativeStrandFlag() {
- return (mFlags & SAMFlag.READ_REVERSE_STRAND.flag) != 0;
- }
-
- /**
- * strand of the mate (false for forward; true for reverse strand).
- */
- public boolean getMateNegativeStrandFlag() {
- requireReadPaired();
- return getMateNegativeStrandFlagUnchecked();
- }
-
- private boolean getMateNegativeStrandFlagUnchecked() {
- return (mFlags & SAMFlag.MATE_REVERSE_STRAND.flag) != 0;
- }
-
- /**
- * the read is the first read in a pair.
- */
- public boolean getFirstOfPairFlag() {
- requireReadPaired();
- return getFirstOfPairFlagUnchecked();
- }
-
- private boolean getFirstOfPairFlagUnchecked() {
- return (mFlags & SAMFlag.FIRST_OF_PAIR.flag) != 0;
- }
-
- /**
- * the read is the second read in a pair.
- */
- public boolean getSecondOfPairFlag() {
- requireReadPaired();
- return getSecondOfPairFlagUnchecked();
- }
-
- private boolean getSecondOfPairFlagUnchecked() {
- return (mFlags & SAMFlag.SECOND_OF_PAIR.flag) != 0;
- }
-
- /**
- * the alignment is not primary (a read having split hits may have multiple primary alignment records).
- */
- public boolean getNotPrimaryAlignmentFlag() {
- return (mFlags & SAMFlag.NOT_PRIMARY_ALIGNMENT.flag) != 0;
- }
-
- /**
- * the alignment is supplementary (TODO: further explanation?).
- */
- public boolean getSupplementaryAlignmentFlag() {
- return (mFlags & SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag) != 0;
- }
-
- /**
- * the read fails platform/vendor quality checks.
- */
- public boolean getReadFailsVendorQualityCheckFlag() {
- return (mFlags & SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag) != 0;
- }
-
- /**
- * the read is either a PCR duplicate or an optical duplicate.
- */
- public boolean getDuplicateReadFlag() {
- return (mFlags & SAMFlag.DUPLICATE_READ.flag) != 0;
- }
-
- /**
- * the read is paired in sequencing, no matter whether it is mapped in a pair.
- */
- public void setReadPairedFlag(final boolean flag) {
- setFlag(flag, SAMFlag.READ_PAIRED.flag);
- }
-
- /**
- * the read is mapped in a proper pair (depends on the protocol, normally inferred during alignment).
- */
- public void setProperPairFlag(final boolean flag) {
- setFlag(flag, SAMFlag.PROPER_PAIR.flag);
- }
-
- /**
- * the query sequence itself is unmapped. This method name is misspelled.
- * Use {@link #setReadUnmappedFlag} instead.
- * @deprecated
- */
- @Deprecated
- public void setReadUmappedFlag(final boolean flag) {
- setReadUnmappedFlag(flag);
- }
-
- /**
- * the query sequence itself is unmapped.
- */
- public void setReadUnmappedFlag(final boolean flag) {
- setFlag(flag, SAMFlag.READ_UNMAPPED.flag);
- // Change to readUnmapped could change indexing bin
- setIndexingBin(null);
- }
-
- /**
- * the mate is unmapped.
- */
- public void setMateUnmappedFlag(final boolean flag) {
- setFlag(flag, SAMFlag.MATE_UNMAPPED.flag);
- }
-
- /**
- * strand of the query (false for forward; true for reverse strand).
- */
- public void setReadNegativeStrandFlag(final boolean flag) {
- setFlag(flag, SAMFlag.READ_REVERSE_STRAND.flag);
- }
-
- /**
- * strand of the mate (false for forward; true for reverse strand).
- */
- public void setMateNegativeStrandFlag(final boolean flag) {
- setFlag(flag, SAMFlag.MATE_REVERSE_STRAND.flag);
- }
-
- /**
- * the read is the first read in a pair.
- */
- public void setFirstOfPairFlag(final boolean flag) {
- setFlag(flag, SAMFlag.FIRST_OF_PAIR.flag);
- }
-
- /**
- * the read is the second read in a pair.
- */
- public void setSecondOfPairFlag(final boolean flag) {
- setFlag(flag, SAMFlag.SECOND_OF_PAIR.flag);
- }
-
- /**
- * the alignment is not primary (a read having split hits may have multiple primary alignment records).
- */
- public void setNotPrimaryAlignmentFlag(final boolean flag) {
- setFlag(flag, SAMFlag.NOT_PRIMARY_ALIGNMENT.flag);
- }
-
- /**
- * the alignment is supplementary (TODO: further explanation?).
- */
- public void setSupplementaryAlignmentFlag(final boolean flag) {
- setFlag(flag, SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag);
- }
-
- /**
- * the read fails platform/vendor quality checks.
- */
- public void setReadFailsVendorQualityCheckFlag(final boolean flag) {
- setFlag(flag, SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag);
- }
-
- /**
- * the read is either a PCR duplicate or an optical duplicate.
- */
- public void setDuplicateReadFlag(final boolean flag) {
- setFlag(flag, SAMFlag.DUPLICATE_READ.flag);
- }
-
- /**
- * Tests if this record is either a secondary and/or supplementary alignment;
- * equivalent to {@code (getNotPrimaryAlignmentFlag() || getSupplementaryAlignmentFlag())}.
- */
- public boolean isSecondaryOrSupplementary() {
- return getNotPrimaryAlignmentFlag() || getSupplementaryAlignmentFlag();
- }
-
- private void setFlag(final boolean flag, final int bit) {
- if (flag) {
- mFlags |= bit;
- } else {
- mFlags &= ~bit;
- }
- }
-
- public ValidationStringency getValidationStringency() {
- return mValidationStringency;
- }
-
- /**
- * Control validation of lazily-decoded elements.
- */
- public void setValidationStringency(final ValidationStringency validationStringency) {
- this.mValidationStringency = validationStringency;
- }
-
- /**
- * Get the value for a SAM tag.
- * WARNING: Some value types (e.g. byte[]) are mutable. It is dangerous to change one of these values in
- * place, because some SAMRecord implementations keep track of when attributes have been changed. If you
- * want to change an attribute value, call setAttribute() to replace the value.
- *
- * @param tag Two-character tag name.
- * @return Appropriately typed tag value, or null if the requested tag is not present.
- */
- public Object getAttribute(final String tag) {
- return getAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag));
- }
-
- /**
- * Get the tag value and attempt to coerce it into the requested type.
- * @param tag The requested tag.
- * @return The value of a tag, converted into a signed Integer if possible.
- * @throws RuntimeException If the value is not an integer type, or will not fit in a signed Integer.
- */
- public Integer getIntegerAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof Integer) {
- return (Integer)val;
- }
- if (!(val instanceof Number)) {
- throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
- }
- final long longVal = ((Number)val).longValue();
- if (longVal < Integer.MIN_VALUE || longVal > Integer.MAX_VALUE) {
- throw new RuntimeException("Value for tag " + tag + " is not in Integer range: " + longVal);
- }
- return (int)longVal;
- }
-
- /**
- * A convenience method that will return a valid unsigned integer as a Long,
- * or fail with an exception if the tag value is invalid.
- *
- * @param tag Two-character tag name.
- * @return valid unsigned integer associated with the tag, as a Long
- * @throws {@link htsjdk.samtools.SAMException} if the value is out of range for a 32-bit unsigned value, or not a Number
- */
- public Long getUnsignedIntegerAttribute(final String tag) throws SAMException {
- return getUnsignedIntegerAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag));
- }
-
- /**
- * A convenience method that will return a valid unsigned integer as a Long,
- * or fail with an exception if the tag value is invalid.
- *
- * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
- * @return valid unsigned integer associated with the tag, as a Long
- * @throws {@link htsjdk.samtools.SAMException} if the value is out of range for a 32-bit unsigned value, or not a Number
- */
- public Long getUnsignedIntegerAttribute(final short tag) throws SAMException {
- final Object value = getAttribute(tag);
- if (value == null) {
- return null;
- }
-
- if (value instanceof Number) {
- final long lValue = ((Number)value).longValue();
- if (SAMUtils.isValidUnsignedIntegerAttribute(lValue)) {
- return lValue;
- } else {
- throw new SAMException("Unsigned integer value of tag " +
- SAMTagUtil.getSingleton().makeStringTag(tag) + " is out of bounds for a 32-bit unsigned integer: " + lValue);
- }
- } else {
- throw new SAMException("Unexpected attribute value data type " + value.getClass() + " for tag " +
- SAMTagUtil.getSingleton().makeStringTag(tag));
- }
- }
-
- /**
- * Get the tag value and attempt to coerce it into the requested type.
- * @param tag The requested tag.
- * @return The value of a tag, converted into a Short if possible.
- * @throws RuntimeException If the value is not an integer type, or will not fit in a Short.
- */
- public Short getShortAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof Short) {
- return (Short)val;
- }
- if (!(val instanceof Number)) {
- throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
- }
- final long longVal = ((Number)val).longValue();
- if (longVal < Short.MIN_VALUE || longVal > Short.MAX_VALUE) {
- throw new RuntimeException("Value for tag " + tag + " is not in Short range: " + longVal);
- }
- return (short)longVal;
- }
-
- /**
- * Get the tag value and attempt to coerce it into the requested type.
- * @param tag The requested tag.
- * @return The value of a tag, converted into a Byte if possible.
- * @throws RuntimeException If the value is not an integer type, or will not fit in a Byte.
- */
- public Byte getByteAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof Byte) {
- return (Byte)val;
- }
- if (!(val instanceof Number)) {
- throw new RuntimeException("Value for tag " + tag + " is not Number: " + val.getClass());
- }
- final long longVal = ((Number)val).longValue();
- if (longVal < Byte.MIN_VALUE || longVal > Byte.MAX_VALUE) {
- throw new RuntimeException("Value for tag " + tag + " is not in Short range: " + longVal);
- }
- return (byte)longVal;
- }
-
- public String getStringAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof String) {
- return (String)val;
- }
- throw new SAMException("Value for tag " + tag + " is not a String: " + val.getClass());
- }
-
- public Character getCharacterAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof Character) {
- return (Character)val;
- }
- throw new SAMException("Value for tag " + tag + " is not a Character: " + val.getClass());
- }
-
- public Float getFloatAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof Float) {
- return (Float)val;
- }
- throw new SAMException("Value for tag " + tag + " is not a Float: " + val.getClass());
- }
-
- /** Will work for signed byte array, unsigned byte array, or old-style hex array */
- public byte[] getByteArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof byte[]) {
- return (byte[])val;
- }
- throw new SAMException("Value for tag " + tag + " is not a byte[]: " + val.getClass());
- }
-
- public byte[] getUnsignedByteArrayAttribute(final String tag) {
- final byte[] ret = getByteArrayAttribute(tag);
- if (ret != null) requireUnsigned(tag);
- return ret;
- }
-
- /** Will work for signed byte array or old-style hex array */
- public byte[] getSignedByteArrayAttribute(final String tag) {
- final byte[] ret = getByteArrayAttribute(tag);
- if (ret != null) requireSigned(tag);
- return ret;
- }
-
- public short[] getUnsignedShortArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof short[]) {
- requireUnsigned(tag);
- return (short[]) val;
- }
- throw new SAMException("Value for tag " + tag + " is not a short[]: " + val.getClass());
- }
-
- public short[] getSignedShortArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof short[]) {
- requireSigned(tag);
- return (short[]) val;
- }
- throw new SAMException("Value for tag " + tag + " is not a short[]: " + val.getClass());
- }
-
- public int[] getUnsignedIntArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof int[]) {
- requireUnsigned(tag);
- return (int[]) val;
- }
- throw new SAMException("Value for tag " + tag + " is not a int[]: " + val.getClass());
- }
-
- public int[] getSignedIntArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val == null) return null;
- if (val instanceof int[]) {
- requireSigned(tag);
- return (int[]) val;
- }
- throw new SAMException("Value for tag " + tag + " is not a int[]: " + val.getClass());
- }
-
- public float[] getFloatArrayAttribute(final String tag) {
- final Object val = getAttribute(tag);
- if (val != null && !(val instanceof float[])) {
- throw new SAMException("Value for tag " + tag + " is not a float[]: " + val.getClass());
- }
- return (float[]) val;
- }
-
- /**
- * @return True if this tag is an unsigned array, else false.
- * @throws SAMException if the tag is not present.
- */
- public boolean isUnsignedArrayAttribute(final String tag) {
- final SAMBinaryTagAndValue tmp = this.mAttributes.find(SAMTagUtil.getSingleton().makeBinaryTag(tag));
- if (tmp != null) return tmp.isUnsignedArray();
- throw new SAMException("Tag " + tag + " is not present in this SAMRecord");
- }
-
- private void requireSigned(final String tag) {
- if (isUnsignedArrayAttribute(tag)) throw new SAMException("Value for tag " + tag + " is not signed");
- }
-
- private void requireUnsigned(final String tag) {
- if (!isUnsignedArrayAttribute(tag)) throw new SAMException("Value for tag " + tag + " is not unsigned");
- }
-
- /**
- * @see SAMRecord#getAttribute(java.lang.String)
- * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
- */
- public Object getAttribute(final short tag) {
- if (this.mAttributes == null) return null;
- else {
- final SAMBinaryTagAndValue tmp = this.mAttributes.find(tag);
- if (tmp != null) return tmp.value;
- else return null;
- }
- }
-
- /**
- * Set a named attribute onto the SAMRecord. Passing a null value causes the attribute to be cleared.
- * @param tag two-character tag name. See http://samtools.sourceforge.net/SAM1.pdf for standard and user-defined tags.
- * @param value Supported types are String, Char, Integer, Float,
- * Long (for values that fit into a signed or unsigned 32-bit integer only),
- * byte[], short[], int[], float[].
- * If value == null, tag is cleared.
- *
- * Byte and Short are allowed but discouraged. If written to a SAM file, these will be converted to Integer,
- * whereas if written to BAM, getAttribute() will return as Byte or Short, respectively.
- *
- * Long is allowed for values that fit into a signed or unsigned 32-bit integer only, but discouraged.
- *
- * To set unsigned byte[], unsigned short[] or unsigned int[] (which is discouraged because of poor Java language
- * support), setUnsignedArrayAttribute() must be used instead of this method.
- *
- * String values are not validated to ensure that they conform to SAM spec.
- */
- public void setAttribute(final String tag, final Object value) {
- if (value != null && value.getClass().isArray() && Array.getLength(value) == 0) {
- throw new IllegalArgumentException("Empty value passed for tag " + tag);
- }
- setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value);
- }
-
- /**
- * Because Java does not support unsigned integer types, we think it is a bad idea to encode them in SAM
- * files. If you must do so, however, you must call this method rather than setAttribute, because calling
- * this method is the way to indicate that, e.g. a short array should be interpreted as unsigned shorts.
- * @param value must be one of byte[], short[], int[]
- */
- public void setUnsignedArrayAttribute(final String tag, final Object value) {
- if (!value.getClass().isArray()) {
- throw new IllegalArgumentException("Non-array passed to setUnsignedArrayAttribute for tag " + tag);
- }
- if (Array.getLength(value) == 0) {
- throw new IllegalArgumentException("Empty array passed to setUnsignedArrayAttribute for tag " + tag);
- }
- setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value, true);
- }
-
- /**
- * @see htsjdk.samtools.SAMRecord#setAttribute(java.lang.String, java.lang.Object)
- * @param tag Binary representation of a 2-char String tag as created by SAMTagUtil.
- */
- protected void setAttribute(final short tag, final Object value) {
- setAttribute(tag, value, false);
- }
-
- /**
- * Checks if the value is allowed as an attribute value.
- *
- * @param value the value to be checked
- * @return true if the value is valid and false otherwise
-
- * @deprecated
- * The attribute type and value checks have been moved directly into
- * {@link SAMBinaryTagAndValue}.
- */
- @Deprecated
- protected static boolean isAllowedAttributeValue(final Object value) {
- return SAMBinaryTagAndValue.isAllowedAttributeValue(value);
- }
-
- protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
- if (value == null) {
- if (this.mAttributes != null) {
- // setting a tag value to null removes the tag:
- this.mAttributes = this.mAttributes.remove(tag);
- }
- } else {
- final SAMBinaryTagAndValue tmp;
- if (!isUnsignedArray) {
- tmp = new SAMBinaryTagAndValue(tag, value);
- } else {
- tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, value);
- }
-
- if (this.mAttributes == null) {
- this.mAttributes = tmp;
- } else {
- this.mAttributes = this.mAttributes.insert(tmp);
- }
- }
- }
-
- /**
- * Removes all attributes.
- */
- public void clearAttributes() {
- mAttributes = null;
- }
-
- /**
- * Replace any existing attributes with the given linked item.
- */
- protected void setAttributes(final SAMBinaryTagAndValue attributes) {
- mAttributes = attributes;
- }
-
- /**
- * @return Pointer to the first of the tags. Returns null if there are no tags.
- */
- protected SAMBinaryTagAndValue getBinaryAttributes() {
- return mAttributes;
- }
-
- /**
- * @return reference name, null if this is unmapped
- */
- @Override
- public String getContig() {
- if( getReadUnmappedFlag()) {
- return null;
- } else {
- return getReferenceName();
- }
- }
-
- /**
- * an alias of {@link #getAlignmentStart()
- * @return 1-based inclusive leftmost position of the clipped sequence, or 0 if there is no position.
- */
- @Override
- public int getStart() {
- return getAlignmentStart();
- }
-
- /**
- * an alias of {@link #getAlignmentEnd()}
- * @return 1-based inclusive rightmost position of the clipped sequence, or 0 read if unmapped.
- */
- @Override
- public int getEnd() {
- return getAlignmentEnd();
- }
-
- /**
- * Tag name and value of an attribute, for getAttributes() method.
- */
- public static class SAMTagAndValue {
- public final String tag;
- public final Object value;
-
- public SAMTagAndValue(final String tag, final Object value) {
- this.tag = tag;
- this.value = value;
- }
- }
-
- /**
- * @return list of {tag, value} tuples
- */
- public List<SAMTagAndValue> getAttributes() {
- SAMBinaryTagAndValue binaryAttributes = getBinaryAttributes();
- final List<SAMTagAndValue> ret = new ArrayList<SAMTagAndValue>();
- while (binaryAttributes != null) {
- ret.add(new SAMTagAndValue(SAMTagUtil.getSingleton().makeStringTag(binaryAttributes.tag),
- binaryAttributes.value));
- binaryAttributes = binaryAttributes.getNext();
- }
- return ret;
- }
-
- Integer getIndexingBin() {
- return mIndexingBin;
- }
-
- /**
- * Used internally when writing BAMRecords.
- * @param mIndexingBin c.f. http://samtools.sourceforge.net/SAM1.pdf
- */
- void setIndexingBin(final Integer mIndexingBin) {
- this.mIndexingBin = mIndexingBin;
- }
-
- /**
- * Does not change state of this.
- * @return indexing bin based on alignment start & end.
- */
- int computeIndexingBin() {
- // regionToBin has zero-based, half-open API
- final int alignmentStart = getAlignmentStart()-1;
- int alignmentEnd = getAlignmentEnd();
- if (alignmentEnd <= 0) {
- // If alignment end cannot be determined (e.g. because this read is not really aligned),
- // then treat this as a one base alignment for indexing purposes.
- alignmentEnd = alignmentStart + 1;
- }
- return GenomicIndexUtil.regionToBin(alignmentStart, alignmentEnd);
- }
-
- /**
- * @return the SAMFileHeader for this record. If the header is null, the following SAMRecord methods may throw
- * exceptions:
- * <p><ul>
- * <li>getReferenceIndex</li>
- * <li>setReferenceIndex</li>
- * <li>getMateReferenceIndex</li>
- * <li>setMateReferenceIndex</li>
- * </ul><p>
- * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
- * non-null header values.
- * <p>
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- * <p>
- * SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require records to have a valid header in order to be
- * written. Any record that does not have a header at the time it is added to the writer will be updated to use the
- * header associated with the writer.
- */
- public SAMFileHeader getHeader() {
- return mHeader;
- }
-
- /**
- * Sets the SAMFileHeader for this record. Setting the header into SAMRecord facilitates conversion between reference
- * sequence names and indices.
- * <p>
- * <b>NOTE:</b> If the record has a reference or mate reference name, the corresponding reference and mate reference
- * indices are resolved and updated using the sequence dictionary in the new header. setHeader does not throw an
- * exception if either the reference or mate reference name does not appear in the new header's sequence dictionary.
- * <p>
- * When the SAMFileHeader is set to null, the reference and mate reference indices are cleared. Therefore, calls to
- * the following SAMRecord methods on records with a null header may throw IllegalArgumentExceptions:
- * <ul>
- * <li>getReferenceIndex</li>
- * <li>setReferenceIndex</li>
- * <li>getMateReferenceIndex</li>
- * <li>setMateReferenceIndex</li>
- * </ul><p>
- * Record comparators (i.e. SAMRecordCoordinateComparator and SAMRecordDuplicateComparator) require records with
- * non-null header values.
- * <p>
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- * <p>
- * SAMTextWriter, BAMFileWriter, and CRAMFileWriter all require records to have a valid header in order to be
- * written. Any record that does not have a header at the time it is added to the writer will be updated to use the
- * header associated with the writer.
- *
- * @param header contains sequence dictionary for this SAMRecord
- */
- public void setHeader(final SAMFileHeader header) {
- this.mHeader = header;
- if (null == header) {
- // mark the reference indices as unresolved
- mReferenceIndex = null;
- mMateReferenceIndex = null;
- }
- else {
- // attempt to resolve the existing reference names and indices against the new sequence dictionary, but
- // don't throw if the names don't appear in the dictionary
- setReferenceName(mReferenceName);
- setMateReferenceName(mMateReferenceName);
- }
- }
-
- /**
- * Establishes the SAMFileHeader for this record and forces resolution of the record's reference and mate reference
- * names against the header using the sequence dictionary in the new header. If either the reference or mate
- * reference name does not appear in the new header's sequence dictionary, an IllegalArgumentException is thrown.
- *
- * @param header new header for this record. May be null.
- * @throws IllegalArgumentException if the record has reference or mate reference names that cannot be resolved
- * to indices using the new header.
- */
- public void setHeaderStrict(final SAMFileHeader header) {
- if (null == header) {
- // mark the reference indices as unresolved
- mReferenceIndex = null;
- mMateReferenceIndex = null;
- }
- else {
- // Attempt to resolve the existing reference names against the new sequence dictionary
- // and throw if the names don't appear.
- Integer referenceIndex = resolveIndexFromName(mReferenceName, header, true);
- Integer mateReferenceIndex = resolveIndexFromName(mMateReferenceName, header, true);
-
- // Mutate the record once we know the values are valid
- mReferenceIndex = referenceIndex;
- mMateReferenceIndex = mateReferenceIndex;
- }
- this.mHeader = header;
- }
-
- /**
- * If this record has a valid binary representation of the variable-length portion of a binary record stored,
- * return that byte array, otherwise return null. This will never be true for SAMRecords. It will be true
- * for BAMRecords that have not been eagerDecoded(), and for which none of the data in the variable-length
- * portion has been changed.
- */
- public byte[] getVariableBinaryRepresentation() {
- return null;
- }
-
- /**
- * Depending on the concrete implementation, the binary file size of attributes may be known without
- * computing them all.
- * @return binary file size of attribute, if known, else -1
- */
- public int getAttributesBinarySize() {
- return -1;
- }
-
- /**
- *
- * @return String representation of this.
- * @deprecated This method is not guaranteed to return a valid SAM text representation of the SAMRecord.
- * To get standard SAM text representation, {@link SAMRecord#getSAMString}.
- */
- @Deprecated
- public String format() {
- final StringBuilder buffer = new StringBuilder();
- addField(buffer, getReadName(), null, null);
- addField(buffer, getFlags(), null, null);
- addField(buffer, getReferenceName(), null, "*");
- addField(buffer, getAlignmentStart(), 0, "*");
- addField(buffer, getMappingQuality(), 0, "0");
- addField(buffer, getCigarString(), null, "*");
- addField(buffer, getMateReferenceName(), null, "*");
- addField(buffer, getMateAlignmentStart(), 0, "*");
- addField(buffer, getInferredInsertSize(), 0, "*");
- addField(buffer, getReadString(), null, "*");
- addField(buffer, getBaseQualityString(), null, "*");
- if (mAttributes != null) {
- SAMBinaryTagAndValue entry = getBinaryAttributes();
- while (entry != null) {
- addField(buffer, formatTagValue(entry.tag, entry.value));
- entry = entry.getNext();
- }
- }
- return buffer.toString();
- }
-
- private void addField(final StringBuilder buffer, final Object value, final Object defaultValue, final String defaultString) {
- if (safeEquals(value, defaultValue)) {
- addField(buffer, defaultString);
- } else if (value == null) {
- addField(buffer, "");
- } else {
- addField(buffer, value.toString());
- }
- }
-
- private void addField(final StringBuilder buffer, final String field) {
- if (buffer.length() > 0) {
- buffer.append('\t');
- }
- buffer.append(field);
- }
-
- private String formatTagValue(final short tag, final Object value) {
- final String tagString = SAMTagUtil.getSingleton().makeStringTag(tag);
- if (value == null || value instanceof String) {
- return tagString + ":Z:" + value;
- } else if (value instanceof Integer || value instanceof Long ||
- value instanceof Short || value instanceof Byte) {
- return tagString + ":i:" + value;
- } else if (value instanceof Character) {
- return tagString + ":A:" + value;
- } else if (value instanceof Float) {
- return tagString + ":f:" + value;
- } else if (value instanceof byte[]) {
- return tagString + ":H:" + StringUtil.bytesToHexString((byte[]) value);
- } else {
- throw new RuntimeException("Unexpected value type for tag " + tagString +
- ": " + value + " of class " + value.getClass().getName());
- }
- }
-
- private boolean safeEquals(final Object o1, final Object o2) {
- if (o1 == o2) {
- return true;
- } else if (o1 == null || o2 == null) {
- return false;
- } else {
- return o1.equals(o2);
- }
- }
-
- /**
- * Force all lazily-initialized data members to be initialized. If a subclass overrides this method,
- * typically it should also call super method.
- */
- protected void eagerDecode() {
- getCigar();
- getCigarString();
- }
-
- /**
- * Returns blocks of the read sequence that have been aligned directly to the
- * reference sequence. Note that clipped portions of the read and inserted and
- * deleted bases (vs. the reference) are not represented in the alignment blocks.
- */
- public List<AlignmentBlock> getAlignmentBlocks() {
- if (this.mAlignmentBlocks == null) {
- this.mAlignmentBlocks = SAMUtils.getAlignmentBlocks(getCigar(), getAlignmentStart(), "read cigar");
- }
- return this.mAlignmentBlocks;
- }
-
- /**
- * Run all validations of CIGAR. These include validation that the CIGAR makes sense independent of
- * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
- * @param recordNumber For error reporting. -1 if not known.
- * @return List of errors, or null if no errors.
- */
- public List<SAMValidationError> validateCigar(final long recordNumber) {
- List<SAMValidationError> ret = null;
-
- if (null != getHeader() && getValidationStringency() != ValidationStringency.SILENT && !this.getReadUnmappedFlag()) {
- try {
- //make sure that the cashed version is good
- //wrapped in a try to catch an un-parsable string
- return SAMUtils.validateCigar(this, getCigar(), getReferenceIndex(), getAlignmentBlocks(), recordNumber, "Read CIGAR");
- } catch( final IllegalArgumentException e){
- return Collections.singletonList(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR,e.getMessage(),getReadName(),recordNumber));
- }
- }
- return ret;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (!(o instanceof SAMRecord)) return false;
-
- final SAMRecord samRecord = (SAMRecord) o;
-
- // First check all the elements that do not require decoding
- if (mAlignmentStart != samRecord.mAlignmentStart) return false;
- if (mFlags != samRecord.mFlags) return false;
- if (mInferredInsertSize != samRecord.mInferredInsertSize) return false;
- if (mMappingQuality != samRecord.mMappingQuality) return false;
- if (mMateAlignmentStart != samRecord.mMateAlignmentStart) return false;
- if (mIndexingBin != null ? !mIndexingBin.equals(samRecord.mIndexingBin) : samRecord.mIndexingBin != null)
- return false;
- if (mMateReferenceIndex != null ? !mMateReferenceIndex.equals(samRecord.mMateReferenceIndex) : samRecord.mMateReferenceIndex != null)
- return false;
- if (mReferenceIndex != null ? !mReferenceIndex.equals(samRecord.mReferenceIndex) : samRecord.mReferenceIndex != null)
- return false;
-
- eagerDecode();
- samRecord.eagerDecode();
-
- if (mReadName != null ? !mReadName.equals(samRecord.mReadName) : samRecord.mReadName != null) return false;
- if (mAttributes != null ? !mAttributes.equals(samRecord.mAttributes) : samRecord.mAttributes != null)
- return false;
- if (!Arrays.equals(mBaseQualities, samRecord.mBaseQualities)) return false;
- if (mCigar != null ? !mCigar.equals(samRecord.mCigar) : samRecord.mCigar != null)
- return false;
- if (mMateReferenceName != null ? !mMateReferenceName.equals(samRecord.mMateReferenceName) : samRecord.mMateReferenceName != null)
- return false;
- if (!Arrays.equals(mReadBases, samRecord.mReadBases)) return false;
- if (mReferenceName != null ? !mReferenceName.equals(samRecord.mReferenceName) : samRecord.mReferenceName != null)
- return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- eagerDecode();
- int result = mReadName != null ? mReadName.hashCode() : 0;
- result = 31 * result + (mReadBases != null ? Arrays.hashCode(mReadBases) : 0);
- result = 31 * result + (mBaseQualities != null ? Arrays.hashCode(mBaseQualities) : 0);
- result = 31 * result + (mReferenceName != null ? mReferenceName.hashCode() : 0);
- result = 31 * result + mAlignmentStart;
- result = 31 * result + mMappingQuality;
- result = 31 * result + (mCigarString != null ? mCigarString.hashCode() : 0);
- result = 31 * result + mFlags;
- result = 31 * result + (mMateReferenceName != null ? mMateReferenceName.hashCode() : 0);
- result = 31 * result + mMateAlignmentStart;
- result = 31 * result + mInferredInsertSize;
- result = 31 * result + (mAttributes != null ? mAttributes.hashCode() : 0);
- result = 31 * result + (mReferenceIndex != null ? mReferenceIndex.hashCode() : 0);
- result = 31 * result + (mMateReferenceIndex != null ? mMateReferenceIndex.hashCode() : 0);
- result = 31 * result + (mIndexingBin != null ? mIndexingBin.hashCode() : 0);
- return result;
- }
-
- /**
- * Perform various validations of SAMRecord.
- * Note that this method deliberately returns null rather than Collections.emptyList() if there
- * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
- *
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- *
- * @return null if valid. If invalid, returns a list of error messages.
- *
- */
- public List<SAMValidationError> isValid() {
- return isValid(false);
- }
-
- /**
- * Perform various validations of SAMRecord.
- * Note that this method deliberately returns null rather than Collections.emptyList() if there
- * are no validation errors, because callers tend to assume that if a non-null list is returned, it is modifiable.
- *
- * A record with null a header may be validated by the isValid method, but the reference and mate reference indices,
- * read group, sequence dictionary, and alignment start will not be fully validated unless a header is present.
- *
- * @param firstOnly return only the first error if true, false otherwise
- * @return null if valid. If invalid, returns a list of error messages.
- */
- public List<SAMValidationError> isValid(final boolean firstOnly) {
- // ret is only instantiate if there are errors to report, in order to reduce GC in the typical case
- // in which everything is valid. It's ugly, but more efficient.
- ArrayList<SAMValidationError> ret = null;
- if (!getReadPairedFlag()) {
- if (getProperPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getMateUnmappedFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED, "Mate unmapped flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getMateNegativeStrandFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_NEG_STRAND, "Mate negative strand flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getFirstOfPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_FIRST_OF_PAIR, "First of pair flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getSecondOfPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_SECOND_OF_PAIR, "Second of pair flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (null != getHeader() && getMateReferenceIndex() != NO_ALIGNMENT_REFERENCE_INDEX) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MATE_REF_INDEX, "MRNM should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
- } else {
- final List<SAMValidationError> errors = isValidReferenceIndexAndPosition(mMateReferenceIndex, mMateReferenceName,
- getMateAlignmentStart(), true, firstOnly);
- if (errors != null) {
- if (firstOnly) return errors;
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.addAll(errors);
- }
- if (!hasMateReferenceName() && !getMateUnmappedFlag()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED, "Mapped mate should have mate reference name", getReadName()));
- if (firstOnly) return ret;
- }
- if (!getFirstOfPairFlagUnchecked() && !getSecondOfPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.PAIRED_READ_NOT_MARKED_AS_FIRST_OR_SECOND,
- "Paired read should be marked as first of pair or second of pair.", getReadName()));
- if (firstOnly) return ret;
- }
-/*
- TODO: PIC-97 This validation should be enabled, but probably at this point there are too many
- BAM files that have the proper pair flag set when read or mate is unmapped.
- if (getMateUnmappedFlag() && getProperPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unpaired read.", getReadName()));
- if (firstOnly) return ret;
- }
-*/
- }
- if (getInferredInsertSize() > MAX_INSERT_SIZE || getInferredInsertSize() < -MAX_INSERT_SIZE) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INSERT_SIZE, "Insert size out of range", getReadName()));
- if (firstOnly) return ret;
- }
- if (getReadUnmappedFlag()) {
- if (getNotPrimaryAlignmentFlag()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_NOT_PRIM_ALIGNMENT, "Not primary alignment flag should not be set for unmapped read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getSupplementaryAlignmentFlag()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_SUPPLEMENTARY_ALIGNMENT, "Supplementary alignment flag should not be set for unmapped read.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getMappingQuality() != 0) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MAPPING_QUALITY, "MAPQ should be 0 for unmapped read.", getReadName()));
- if (firstOnly) return ret;
- }
- /* non-empty CIGAR on unmapped read is now allowed, because there are special reads when SAM is used to store assembly. */
-/*
- TODO: PIC-97 This validation should be enabled, but probably at this point there are too many
- BAM files that have the proper pair flag set when read or mate is unmapped.
- if (getProperPairFlagUnchecked()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR, "Proper pair flag should not be set for unmapped read.", getReadName()));
- }
-*/
- } else {
- if (getMappingQuality() >= 256) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_MAPPING_QUALITY, "MAPQ should be < 256.", getReadName()));
- if (firstOnly) return ret;
- }
- if (getCigarLength() == 0) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR, "CIGAR should have > zero elements for mapped read.", getReadName()));
- /* todo - will uncomment once unit tests are added
- } else if (getCigar().getReadLength() != getReadLength()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_CIGAR, "CIGAR read length " + getCigar().getReadLength() + " doesn't match read length " + getReadLength(), getReadName()));
- */
- if (firstOnly) return ret;
- }
- if (getHeader() != null && getHeader().getSequenceDictionary().isEmpty()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.MISSING_SEQUENCE_DICTIONARY, "Empty sequence dictionary.", getReadName()));
- if (firstOnly) return ret;
- }
- if (!hasReferenceName()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_FLAG_READ_UNMAPPED, "Mapped read should have valid reference name", getReadName()));
- if (firstOnly) return ret;
- }
-/*
- Oops! We know this is broken in older BAM files, so this having this validation will cause all sorts of
- problems!
- if (getIndexingBin() != null && getIndexingBin() != computeIndexingBin()) {
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INDEXING_BIN,
- "Indexing bin (" + getIndexingBin() + ") does not agree with computed value (" + computeIndexingBin() + ")",
- getReadName()));
-
- }
-*/
- }
- // Validate the RG ID is found in header
- final String rgId = (String)getAttribute(SAMTagUtil.getSingleton().RG);
- if (rgId != null && getHeader() != null && getHeader().getReadGroup(rgId) == null) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.READ_GROUP_NOT_FOUND,
- "RG ID on SAMRecord not found in header: " + rgId, getReadName()));
- if (firstOnly) return ret;
- }
- final List<SAMValidationError> errors = isValidReferenceIndexAndPosition(mReferenceIndex, mReferenceName, getAlignmentStart(), false);
- if (errors != null) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.addAll(errors);
- if (firstOnly) return ret;
- }
- // TODO(mccowan): Is this asking "is this the primary alignment"?
- if (this.getReadLength() == 0 && !this.getNotPrimaryAlignmentFlag()) {
- final Object fz = getAttribute(SAMTagUtil.getSingleton().FZ);
- if (fz == null) {
- final String cq = (String)getAttribute(SAMTagUtil.getSingleton().CQ);
- final String cs = (String)getAttribute(SAMTagUtil.getSingleton().CS);
- if (cq == null || cq.isEmpty() || cs == null || cs.isEmpty()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.EMPTY_READ,
- "Zero-length read without FZ, CS or CQ tag", getReadName()));
- if (firstOnly) return ret;
- } else if (!getReadUnmappedFlag()) {
- boolean hasIndel = false;
- for (final CigarElement cigarElement : getCigar().getCigarElements()) {
- if (cigarElement.getOperator() == CigarOperator.DELETION ||
- cigarElement.getOperator() == CigarOperator.INSERTION) {
- hasIndel = true;
- break;
- }
- }
- if (!hasIndel) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.EMPTY_READ,
- "Colorspace read with zero-length bases but no indel", getReadName()));
- if (firstOnly) return ret;
- }
- }
- }
- }
- if (this.getReadLength() != getBaseQualities().length && !Arrays.equals(getBaseQualities(), NULL_QUALS)) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_QUALS_LENGTH,
- "Read length does not match quals length", getReadName()));
- if (firstOnly) return ret;
- }
-
- if (this.getAlignmentStart() != NO_ALIGNMENT_START && this.getIndexingBin() != null &&
- this.computeIndexingBin() != this.getIndexingBin()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_INDEXING_BIN,
- "bin field of BAM record does not equal value computed based on alignment start and end, and length of sequence to which read is aligned",
- getReadName()));
- if (firstOnly) return ret;
- }
-
- if (ret == null || ret.isEmpty()) {
- return null;
- }
- return ret;
- }
-
- /**
- * Gets the source of this SAM record -- both the reader that retrieved the record and the position on disk from
- * whence it came.
- * @return The file source. Note that the reader will be null if the reader source has not be set.
- */
- public SAMFileSource getFileSource() {
- return mFileSource;
- }
-
- /**
- * Sets a marker providing the source reader for this file and the position in the file from which the read originated.
- * @param fileSource source of the given file.
- */
- protected void setFileSource(final SAMFileSource fileSource) {
- mFileSource = fileSource;
- }
-
- private List<SAMValidationError> isValidReferenceIndexAndPosition(final Integer referenceIndex, final String referenceName,
- final int alignmentStart, final boolean isMate) {
- return isValidReferenceIndexAndPosition(referenceIndex, referenceName, alignmentStart, isMate, false);
- }
-
- private List<SAMValidationError> isValidReferenceIndexAndPosition(final Integer referenceIndex, final String referenceName,
- final int alignmentStart, final boolean isMate, final boolean firstOnly) {
- final boolean hasReference = hasReferenceName(referenceIndex, referenceName);
-
- // ret is only instantiate if there are errors to report, in order to reduce GC in the typical case
- // in which everything is valid. It's ugly, but more efficient.
- ArrayList<SAMValidationError> ret = null;
- if (!hasReference) {
- if (alignmentStart != 0) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start should be 0 because reference name = *.", isMate), getReadName()));
- if (firstOnly) return ret;
- }
- } else {
- if (alignmentStart == 0) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start should != 0 because reference name != *.", isMate), getReadName()));
- if (firstOnly) return ret;
- }
- if (getHeader() != null && !getHeader().getSequenceDictionary().isEmpty()) {
- final SAMSequenceRecord sequence =
- (referenceIndex != null? getHeader().getSequence(referenceIndex): getHeader().getSequence(referenceName));
- if (sequence == null) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_REFERENCE_INDEX, buildMessage("Reference sequence not found in sequence dictionary.", isMate), getReadName()));
- if (firstOnly) return ret;
- } else {
- if (alignmentStart > sequence.getSequenceLength()) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.INVALID_ALIGNMENT_START, buildMessage("Alignment start (" + alignmentStart + ") must be <= reference sequence length (" +
- sequence.getSequenceLength() + ") on reference " + sequence.getSequenceName(), isMate), getReadName()));
- if (firstOnly) return ret;
- }
- }
- }
- }
- return ret;
- }
-
- private String buildMessage(final String baseMessage, final boolean isMate) {
- return isMate ? "Mate " + baseMessage : baseMessage;
- }
-
- /**
- * Note that this does a shallow copy of everything, except for the attribute list, for which a copy of the list
- * is made, but the attributes themselves are copied by reference. This should be safe because callers should
- * never modify a mutable value returned by any of the get() methods anyway. If one of the cloned record's SEQ or
- * QUAL needs to be modified, a deeper copy should be made (e.g. Reverse Complement).
- */
- @Override
- public Object clone() throws CloneNotSupportedException {
- final SAMRecord newRecord = (SAMRecord)super.clone();
- if (mAttributes != null) {
- newRecord.mAttributes = this.mAttributes.copy();
- }
-
- return newRecord;
- }
-
- /**
- * Returns a deep copy of the SAM record, with the following exceptions:
- *
- * - The header field, which shares the header reference with the original record
- * - The file source field, which will always always be set to null in the copy
- */
- public SAMRecord deepCopy() {
- final SAMRecord newSAM = new SAMRecord(getHeader());
-
- newSAM.setReadName(getReadName());
- newSAM.setReadBases(Arrays.copyOf(getReadBases(), getReadLength()));
- final byte baseQualities[] = getBaseQualities();
- newSAM.setBaseQualities(Arrays.copyOf(baseQualities, baseQualities.length));
- newSAM.setReferenceName(getReferenceName());
- newSAM.setAlignmentStart(getAlignmentStart()); // clears mAlignmentEnd
- newSAM.setMappingQuality(getMappingQuality());
- newSAM.setCigarString(getCigarString()); // clears Cigar element and alignmentBlocks
- newSAM.setFileSource(null);
-
- newSAM.setFlags(getFlags());
- newSAM.setMateReferenceName(getMateReferenceName());
- newSAM.setMateAlignmentStart(getMateAlignmentStart());
- newSAM.setInferredInsertSize(getInferredInsertSize());
- // transfer the reference indices directly to avoid mutating
- // the source record
- newSAM.mReferenceIndex = this.mReferenceIndex;
- newSAM.mMateReferenceIndex = this.mMateReferenceIndex;
- newSAM.setValidationStringency(getValidationStringency());
- SAMBinaryTagAndValue attributes = getBinaryAttributes();
- if (null != attributes) {
- newSAM.setAttributes(attributes.deepCopy());
- }
- newSAM.setIndexingBin(getIndexingBin());
-
- return newSAM;
- }
-
- /** Simple toString() that gives a little bit of useful info about the read. */
- @Override
- public String toString() {
- final StringBuilder builder = new StringBuilder(64);
- builder.append(getReadName());
- if (getReadPairedFlag()) {
- if (getFirstOfPairFlag()) {
- builder.append(" 1/2");
- }
- else {
- builder.append(" 2/2");
- }
- }
-
- builder.append(' ')
- .append(String.valueOf(getReadLength()))
- .append('b');
-
- if (getReadUnmappedFlag()) {
- builder.append(" unmapped read.");
- }
- else {
- builder.append(" aligned read.");
- }
-
- return builder.toString();
- }
-
- /**
- Returns the record in the SAM line-based text format. Fields are
- separated by '\t' characters, and the String is terminated by '\n'.
- */
- public String getSAMString() {
- return SAMTextWriter.getSAMString(this);
- }
-
- public String getPairedReadName() {
- final StringBuilder builder = new StringBuilder(64);
- builder.append(getReadName());
- if (getReadPairedFlag()) {
- if (getFirstOfPairFlag()) {
- builder.append(" 1/2");
- } else {
- builder.append(" 2/2");
- }
- }
- return builder.toString();
- }
-
- /**
- * shortcut to <pre>SAMFlag.getFlags( this.getFlags() );</pre>
- * @returns a set of SAMFlag associated to this sam record */
- public final Set<SAMFlag> getSAMFlags() {
- return SAMFlag.getFlags(this.getFlags());
- }
-
- /**
- * Fetches the value of a transient attribute on the SAMRecord, of null if not set.
- *
- * The intended use for transient attributes is to store values that are 1-to-1 with the SAMRecord,
- * may be needed many times and are expensive to compute. These values can be computed lazily and
- * then stored as transient attributes to avoid frequent re-computation.
- */
- public final Object getTransientAttribute(final Object key) {
- return (this.transientAttributes == null) ? null : this.transientAttributes.get(key);
- }
-
- /**
- * Sets the value of a transient attribute, and returns the previous value if defined.
- *
- * The intended use for transient attributes is to store values that are 1-to-1 with the SAMRecord,
- * may be needed many times and are expensive to compute. These values can be computed lazily and
- * then stored as transient attributes to avoid frequent re-computation.
- */
- public final Object setTransientAttribute(final Object key, final Object value) {
- if (this.transientAttributes == null) this.transientAttributes = new HashMap<Object,Object>();
- return this.transientAttributes.put(key, value);
- }
-
- /**
- * Removes a transient attribute if it is stored, and returns the stored value. If there is not
- * a stored value, will return null.
- */
- public final Object removeTransientAttribute(final Object key) {
- if (this.transientAttributes != null) return this.transientAttributes.remove(key);
- else return null;
- }
-
- /**
- * Reverse-complement bases and reverse quality scores along with known optional attributes that
- * need the same treatment. Changes made after making a copy of the bases, qualities,
- * and any attributes that will be altered. If in-place update is needed use
- * {@link #reverseComplement(boolean)}.
- * See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
- * for the default set of tags that are handled.
- */
- public void reverseComplement() {
- reverseComplement(false);
- }
-
- /**
- * Reverse-complement bases and reverse quality scores along with known optional attributes that
- * need the same treatment. Optionally makes a copy of the bases, qualities or attributes instead
- * of altering them in-place. See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
- * for the default set of tags that are handled.
- *
- * @param inplace Setting this to false will clone all attributes, bases and qualities before changing the values.
- */
- public void reverseComplement(boolean inplace) {
- reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, inplace);
- }
-
- /**
- * Reverse complement bases and reverse quality scores. In addition reverse complement any
- * non-null attributes specified by tagsToRevcomp and reverse and non-null attributes
- * specified by tagsToReverse.
- */
- public void reverseComplement(final Collection<String> tagsToRevcomp, final Collection<String> tagsToReverse, boolean inplace) {
- final byte[] readBases = inplace ? getReadBases() : getReadBases().clone();
- SequenceUtil.reverseComplement(readBases);
- setReadBases(readBases);
- final byte qualities[] = inplace ? getBaseQualities() : getBaseQualities().clone();
- reverseArray(qualities);
- setBaseQualities(qualities);
-
- // Deal with tags that need to be reverse complemented
- if (tagsToRevcomp != null) {
- for (final String tag: tagsToRevcomp) {
- Object value = getAttribute(tag);
- if (value != null) {
- if (value instanceof byte[]) {
- value = inplace ? value : ((byte[]) value).clone();
- SequenceUtil.reverseComplement((byte[]) value);
- } else if (value instanceof String) {
- //SequenceUtil.reverseComplement is in-place for bytes but copies Strings since they are immutable.
- value = SequenceUtil.reverseComplement((String) value);
- } else {
- throw new UnsupportedOperationException("Don't know how to reverse complement: " + value);
- }
- setAttribute(tag, value);
- }
- }
- }
-
- // Deal with tags that needed to just be reversed
- if (tagsToReverse != null) {
- for (final String tag : tagsToReverse) {
- Object value = getAttribute(tag);
- if (value != null) {
- if (value instanceof String) {
- value = StringUtil.reverseString((String) value);
- } else if (value.getClass().isArray()) {
- if (value instanceof byte[]) {
- value = inplace ? value : ((byte[]) value).clone();
- reverseArray((byte[]) value);
- } else if (value instanceof short[]) {
- value = inplace ? value : ((short[]) value).clone();
- reverseArray((short[]) value);
- } else if (value instanceof int[]) {
- value = inplace ? value : ((int[]) value).clone();
- reverseArray((int[]) value);
- } else if (value instanceof float[]) {
- value = inplace ? value : ((float[]) value).clone();
- reverseArray((float[]) value);
- } else {
- throw new UnsupportedOperationException("Reversing array attribute of type " + value.getClass().getComponentType() + " not supported.");
- }
- } else {
- throw new UnsupportedOperationException("Don't know how to reverse: " + value);
- }
-
- setAttribute(tag, value);
- }
- }
- }
- }
-
- private static void reverseArray(final byte[] array) {
- for (int i=0, j=array.length-1; i<j; ++i, --j) {
- final byte tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- }
-
- private static void reverseArray(final short[] array) {
- for (int i=0, j=array.length-1; i<j; ++i, --j) {
- final short tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- }
-
- private static void reverseArray(final int[] array) {
- for (int i=0, j=array.length-1; i<j; ++i, --j) {
- final int tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- }
-
- private static void reverseArray(final float[] array) {
- for (int i=0, j=array.length-1; i<j; ++i, --j) {
- final float tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordComparator.java b/src/main/java/htsjdk/samtools/SAMRecordComparator.java
deleted file mode 100644
index a39bedb..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordComparator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.util.Comparator;
-
-/**
- * Interface for comparators that define the various SAM sort orders.
- */
-public interface SAMRecordComparator extends Comparator<SAMRecord> {
-
- /**
- * Less stringent compare method than the regular compare. If the two records
- * are equal enough that their ordering in a sorted SAM file would be arbitrary,
- * this method returns 0.
- * @return negative if samRecord1 < samRecord2, 0 if equal, else positive
- */
- public int fileOrderCompare(SAMRecord samRecord1, SAMRecord samRecord2);
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java b/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java
deleted file mode 100644
index e8887bc..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordCoordinateComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Comparator for sorting SAMRecords by coordinate. Note that the header is required because
- * the order of sequences in the header defines the major sort order.
- *
- * Ideally this method would only return 0 for completely equal SAMRecords, so that sort is
- * completely deterministic. This implementation does not achieve this completely, but it
- * comes pretty close, while avoiding decoding the variable length fields, except for read name,
- * which is decoded if coordinate and strand are equal.
- *
- * Extreme care must be taken to ensure the following:
- * if A == B, then B == A
- * if A < B, then B > A
- * if A < B && B < C, then A < C
- *
- */
-public class SAMRecordCoordinateComparator implements SAMRecordComparator, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- int cmp = fileOrderCompare(samRecord1, samRecord2);
- if (cmp != 0) {
- return cmp;
- }
- // Test of negative strand flag is not really necessary, because it is tested
- // with cmp if getFlags, but it is left here because that is the way it was done
- // in the past.
- if (samRecord1.getReadNegativeStrandFlag() == samRecord2.getReadNegativeStrandFlag()) {
- cmp = samRecord1.getReadName().compareTo(samRecord2.getReadName());
- if (cmp != 0) return cmp;
- cmp = compareInts(samRecord1.getFlags(), samRecord2.getFlags());
- if (cmp != 0) return cmp;
- cmp = compareInts(samRecord1.getMappingQuality(), samRecord2.getMappingQuality());
- if (cmp != 0) return cmp;
- cmp = compareInts(samRecord1.getMateReferenceIndex(), samRecord2.getMateReferenceIndex());
- if (cmp != 0) return cmp;
- cmp = compareInts(samRecord1.getMateAlignmentStart(), samRecord2.getMateAlignmentStart());
- if (cmp != 0) return cmp;
- cmp = compareInts(samRecord1.getInferredInsertSize(), samRecord2.getInferredInsertSize());
- return cmp;
-
- }
- else return (samRecord1.getReadNegativeStrandFlag()? 1: -1);
- }
-
- private int compareInts(int i1, int i2) {
- if (i1 < i2) return -1;
- else if (i1 > i2) return 1;
- else return 0;
- }
-
- /**
- * Less stringent compare method than the regular compare. If the two records
- * are equal enough that their ordering in a sorted SAM file would be arbitrary,
- * this method returns 0. If read is paired and unmapped, use the mate mapping to sort.
- * Records being compared must have non-null SAMFileHeaders.
- *
- * @return negative if samRecord1 < samRecord2, 0 if equal, else positive
- */
- public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
-
- if (null == samRecord1.getHeader() || null == samRecord2.getHeader()) {
- throw new IllegalArgumentException("Records must have non-null SAMFileHeaders to be compared");
- }
-
- final int refIndex1 = samRecord1.getReferenceIndex();
- final int refIndex2 = samRecord2.getReferenceIndex();
- if (refIndex1 == -1) {
- return (refIndex2 == -1? 0: 1);
- } else if (refIndex2 == -1) {
- return -1;
- }
- final int cmp = refIndex1 - refIndex2;
- if (cmp != 0) {
- return cmp;
- }
- return samRecord1.getAlignmentStart() - samRecord2.getAlignmentStart();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java b/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java
deleted file mode 100644
index 4ed2bb5..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordDuplicateComparator.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.DuplicateScoringStrategy.ScoringStrategy;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Compares records based on if they should be considered PCR Duplicates (see MarkDuplicates).
- *
- * There are three orderings provided by this comparator: compare, duplicateSetCompare, and fileOrderCompare.
- *
- * Specify the headers when constructing this comparator if you would like to consider the library as the major sort key.
- * The records being compared must also have non-null SAMFileHeaders.
- *
- * @author nhomer
- */
-public class SAMRecordDuplicateComparator implements SAMRecordComparator, Serializable {
- private static final long serialVersionUID = 1L;
-
- /** An enum to provide type-safe keys for transient attributes the comparator puts on SAMRecords. */
- private static enum Attr {
- LibraryId, ReadCoordinate, MateCoordinate
- }
-
- private static final byte FF = 0, FR = 1, F = 2, RF = 3, RR = 4, R = 5;
-
- private final Map<String, Short> libraryIds = new HashMap<String, Short>(); // from library string to library id
- private short nextLibraryId = 1;
-
- private ScoringStrategy scoringStrategy = ScoringStrategy.TOTAL_MAPPED_REFERENCE_LENGTH;
-
- public SAMRecordDuplicateComparator() {}
-
- public SAMRecordDuplicateComparator(final List<SAMFileHeader> headers) {
- // pre-populate the library names
- for (final SAMFileHeader header : headers) {
- for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
- final String libraryName = readGroup.getLibrary();
- if (null != libraryName) {
- final short libraryId = this.nextLibraryId++;
- this.libraryIds.put(libraryName, libraryId);
- }
- }
- }
- }
-
- public void setScoringStrategy(final ScoringStrategy scoringStrategy) {
- this.scoringStrategy = scoringStrategy;
- }
-
- /**
- * Populates the set of transient attributes on SAMRecords if they are not already there.
- */
- private void populateTransientAttributes(final SAMRecord... recs) {
- for (final SAMRecord rec : recs) {
- if (rec.getTransientAttribute(Attr.LibraryId) != null) continue;
- rec.setTransientAttribute(Attr.LibraryId, getLibraryId(rec));
- rec.setTransientAttribute(Attr.ReadCoordinate, rec.getReadNegativeStrandFlag() ? rec.getUnclippedEnd() : rec.getUnclippedStart());
- rec.setTransientAttribute(Attr.MateCoordinate, getMateCoordinate(rec));
- }
- }
-
- /**
- * Gets the library name from the header for the record. If the RG tag is not present on
- * the record, or the library isn't denoted on the read group, a constant string is
- * returned.
- */
- private static String getLibraryName(final SAMRecord rec) {
- final String readGroupId = (String) rec.getAttribute("RG");
-
- if (readGroupId != null) {
- final SAMFileHeader samHeader = rec.getHeader();
- if (null != samHeader) {
- final SAMReadGroupRecord rg = samHeader.getReadGroup(readGroupId);
- if (rg != null) {
- final String libraryName = rg.getLibrary();
- if (null != libraryName) return libraryName;
- }
- }
- }
-
- return "Unknown Library";
- }
-
- /** Get the library ID for the given SAM record. */
- private short getLibraryId(final SAMRecord rec) {
- final String library = getLibraryName(rec);
- Short libraryId = this.libraryIds.get(library);
-
- if (libraryId == null) {
- libraryId = this.nextLibraryId++;
- this.libraryIds.put(library, libraryId);
- }
-
- return libraryId;
- }
-
- /**
- * Convenience method for comparing two orientation bytes. This is critical if we have mapped reads compared to fragment reads.
- */
- private int compareOrientationByteCollapseOrientation(final int orientation1, final int orientation2) {
- // F == FR, F == FF
- // R == RF, R == RR
- if (F == orientation1 || R == orientation1) { // first orientation is fragment
- /**
- * We want
- * F == FR, F == FF
- * R == RF, R == RR
- */
- if (F == orientation1) {
- if (F == orientation2 || FR == orientation2 || FF == orientation2) {
- return 0;
- }
- }
- else { // R == orientation1
- if (R == orientation2 || RF == orientation2 || RR == orientation2) {
- return 0;
- }
- }
- }
- else if (F == orientation2 || R == orientation2) { // first orientation is paired, second is fragment
- return -compareOrientationByteCollapseOrientation(orientation2, orientation1);
- }
-
- return orientation1 - orientation2;
- }
-
- /**
- * Returns a single byte that encodes the orientation of the two reads in a pair.
- */
- private static byte getPairedOrientationByte(final boolean read1NegativeStrand, final boolean read2NegativeStrand) {
- if (read1NegativeStrand) {
- if (read2NegativeStrand) return SAMRecordDuplicateComparator.RR;
- else return SAMRecordDuplicateComparator.RF;
- } else {
- if (read2NegativeStrand) return SAMRecordDuplicateComparator.FR;
- else return SAMRecordDuplicateComparator.FF;
- }
- }
-
- private int getFragmentOrientation(final SAMRecord record) {
- return record.getReadNegativeStrandFlag() ? SAMRecordDuplicateComparator.R : SAMRecordDuplicateComparator.F;
- }
-
- private int getPairedOrientation(final SAMRecord record) {
- if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
- return getPairedOrientationByte(record.getReadNegativeStrandFlag(), record.getMateNegativeStrandFlag());
- } else {
- return getFragmentOrientation(record);
- }
- }
-
- private int getMateReferenceIndex(final SAMRecord record) {
- if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
- return record.getMateReferenceIndex();
- } else {
- return -1;
- }
- }
-
- private int getMateCoordinate(final SAMRecord record) {
- if (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag()) {
- return record.getMateNegativeStrandFlag() ? SAMUtils.getMateUnclippedEnd(record) : SAMUtils.getMateUnclippedStart(record);
- } else {
- return -1;
- }
- }
-
- /** Is one end of a pair, or the fragment, unmapped? */
- private boolean hasUnmappedEnd(final SAMRecord record) {
- return (record.getReadUnmappedFlag() || (record.getReadPairedFlag() && record.getMateUnmappedFlag()));
- }
-
- /** Are both ends of a pair, or the fragment, mapped? */
- private boolean hasMappedEnd(final SAMRecord record) {
- return (!record.getReadUnmappedFlag() || (record.getReadPairedFlag() && !record.getMateUnmappedFlag()));
- }
-
- /** Is this paired end and are both ends of a pair mapped */
- private boolean pairedEndAndBothMapped(final SAMRecord record) {
- return (record.getReadPairedFlag() && !record.getReadUnmappedFlag() && !record.getMateUnmappedFlag());
-
- }
-
- /**
- * Most stringent comparison.
- *
- * Two records are compared based on if they are duplicates of each other, and then based
- * on if they should be prioritized for being the most "representative". Typically, the representative
- * is the record in the SAM file that is *not* marked as a duplicate within a set of duplicates.
- *
- * Compare by file order, then duplicate scoring strategy, read name.
- *
- * If both reads are paired and both ends mapped, always prefer the first end over the second end. This is needed to
- * properly choose the first end for optical duplicate identification when both ends are mapped to the same position etc.
- */
- public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- populateTransientAttributes(samRecord1, samRecord2);
- int cmp;
-
- // temporary variables for comparisons
- int samRecord1Value, samRecord2Value;
-
- cmp = fileOrderCompare(samRecord1, samRecord2);
- // the duplicate scoring strategy
- if (cmp == 0) {
- cmp = DuplicateScoringStrategy.compare(samRecord1, samRecord2, this.scoringStrategy, true);
- }
- // the read name
- if (cmp == 0) {
- cmp = samRecord1.getReadName().compareTo(samRecord2.getReadName());
- }
- // needed for optical duplicate detection when both ends are mapped to the same position.
- if (cmp == 0) {
- if (samRecord1.getReadPairedFlag() && samRecord2.getReadPairedFlag()) {
- samRecord1Value = samRecord1.getFirstOfPairFlag() ? 0 : 1;
- samRecord2Value = samRecord2.getFirstOfPairFlag() ? 0 : 1;
- cmp = samRecord1Value - samRecord2Value;
- }
- }
-
- return cmp;
- }
-
- /**
- * Compares: Library identifier, reference index, read coordinate, orientation of the read (or read pair), mate's coordinate (if paired and mapped),
- * mapped ends, ...
- *
- * collapseOrientation - true if we want cases where fragment orientation to paired end orientation can be equal (ex. F == FR), false otherwise
- * considerNumberOfEndsMappedAndPairing - true if we want to prefer paired ends with both ends mapped over paired ends with only one end mapped, or paired ends with end
- * mapped over fragment reads, false otherwise.
- *
- */
- private int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2, final boolean collapseOrientation, final boolean considerNumberOfEndsMappedAndPairing) {
- populateTransientAttributes(samRecord1, samRecord2);
- int cmp;
-
- if (null == samRecord1.getHeader() || null == samRecord2.getHeader()) {
- throw new IllegalArgumentException("Records must have non-null SAMFileHeaders to be compared");
- }
-
- // temporary variables for comparisons
- int samRecord1Value, samRecord2Value;
-
- // library identifier
- {
- samRecord1Value = (Short) samRecord1.getTransientAttribute(Attr.LibraryId);
- samRecord2Value = (Short) samRecord2.getTransientAttribute(Attr.LibraryId);
- cmp = samRecord1Value - samRecord2Value;
- }
- // reference index
- if (cmp == 0) {
- samRecord1Value = samRecord1.getReferenceIndex();
- samRecord2Value = samRecord2.getReferenceIndex();
- // NB: this accounts for unmapped reads to be placed at the ends of the file
- if (samRecord1Value == -1) {
- cmp = (samRecord2Value == -1) ? 0 : 1;
- }
- else if (samRecord2Value == -1) {
- cmp = -1;
- }
- else {
- cmp = samRecord1Value - samRecord2Value;
- }
- }
- // read coordinate
- if (cmp == 0) {
- samRecord1Value = (Integer) samRecord1.getTransientAttribute(Attr.ReadCoordinate);
- samRecord2Value = (Integer) samRecord2.getTransientAttribute(Attr.ReadCoordinate);
- cmp = samRecord1Value - samRecord2Value;
- }
- // orientation
- if (cmp == 0) {
- samRecord1Value = getPairedOrientation(samRecord1);
- samRecord2Value = getPairedOrientation(samRecord2);
- if (collapseOrientation) {
- cmp = compareOrientationByteCollapseOrientation(samRecord1Value, samRecord2Value);
- }
- else {
- cmp = samRecord1Value - samRecord2Value;
- }
- }
- // both ends need to be mapped
- if (pairedEndAndBothMapped(samRecord1) && pairedEndAndBothMapped(samRecord2)) {
- // mate's reference index
- if (cmp == 0) {
- samRecord1Value = getMateReferenceIndex(samRecord1);
- samRecord2Value = getMateReferenceIndex(samRecord2);
- cmp = samRecord1Value - samRecord2Value;
- }
- // mate's coordinate
- if (cmp == 0) {
- samRecord1Value = (Integer) samRecord1.getTransientAttribute(Attr.MateCoordinate);
- samRecord2Value = (Integer) samRecord2.getTransientAttribute(Attr.MateCoordinate);;
- cmp = samRecord1Value - samRecord2Value;
- }
- }
- if (cmp == 0) {
- samRecord1Value = hasMappedEnd(samRecord1) ? 0 : 1;
- samRecord2Value = hasMappedEnd(samRecord2) ? 0 : 1;
- cmp = samRecord1Value - samRecord2Value;
- }
- // if both paired or both unpaired, then check if one of the two ends (or single end) is unmapped
- // else prefer the one that is paired end
- if (cmp == 0 && considerNumberOfEndsMappedAndPairing) {
- if (samRecord1.getReadPairedFlag() == samRecord2.getReadPairedFlag()) {
- // Is this unmapped or its mate?
- samRecord1Value = hasUnmappedEnd(samRecord1) ? 1 : 0;
- samRecord2Value = hasUnmappedEnd(samRecord2) ? 1 : 0;
- cmp = samRecord1Value - samRecord2Value;
- }
- else { // if we care if one is paired and the other is not
- cmp = samRecord1.getReadPairedFlag() ? -1 : 1;
- }
- }
-
- return cmp;
- }
-
- /**
- * Less stringent than compare, such that two records are equal enough such that their ordering within their duplicate set would be arbitrary.
- *
- * Major difference between this and fileOrderCompare is how we compare the orientation byte. Here we want:
- * F == FR, F == FF
- * R == RF, R == RR
- */
- public int duplicateSetCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- return fileOrderCompare(samRecord1, samRecord2, true, false);
- }
-
- /**
- * Less stringent than duplicateSetCompare, such that two records are equal enough such that their ordering in a sorted SAM file would be arbitrary.
- */
- public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- return fileOrderCompare(samRecord1, samRecord2, false, true);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordFactory.java b/src/main/java/htsjdk/samtools/SAMRecordFactory.java
deleted file mode 100644
index 0db0646..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * Factory interface which allows plugging in of different classes for generating instances of
- * SAMRecord and BAMRecord when reading from SAM/BAM files.
- *
- * @author Tim Fennell
- */
-public interface SAMRecordFactory {
-
- /** Create a new SAMRecord to be filled in */
- public SAMRecord createSAMRecord(SAMFileHeader header);
-
- /** Create a new BAM Record. */
- public BAMRecord createBAMRecord(final SAMFileHeader header,
- final int referenceSequenceIndex,
- final int alignmentStart,
- final short readNameLength,
- final short mappingQuality,
- final int indexingBin,
- final int cigarLen,
- final int flags,
- final int readLen,
- final int mateReferenceSequenceIndex,
- final int mateAlignmentStart,
- final int insertSize,
- final byte[] variableLengthBlock);
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordIterator.java b/src/main/java/htsjdk/samtools/SAMRecordIterator.java
deleted file mode 100755
index 4ba5807..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordIterator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * A general interface that adds functionality to a CloseableIterator of
- * SAMRecords. Currently, this interface is implemented by iterators that
- * want to validate as they are iterating that that the records in the
- * underlying SAM/BAM file are in a particular order.
- */
-public interface SAMRecordIterator extends CloseableIterator<SAMRecord> {
-
- /**
- * Establishes that records returned by this iterator are expected to
- * be in the specified sort order. If this method has been called,
- * then implementers must throw an IllegalStateException from next()
- * when a record is read that violates the sort order. This method
- * may be called multiple times over the course of an iteration,
- * changing the expected sort, if desired -- from the time it is called,
- * it validates whatever sort is set, or stops validating if it
- * is set to null or SAMFileHeader.SortOrder.unsorted. If this method
- * is not called, then no validation of the iterated records is done.
- *
- * @param sortOrder The order in which records are expected to be returned
- * @return This SAMRecordIterator
- */
- public SAMRecordIterator assertSorted(SAMFileHeader.SortOrder sortOrder);
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java b/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java
deleted file mode 100644
index dce2ffb..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordQueryHashComparator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Murmur3;
-
-import java.io.Serializable;
-
-/**
- * SAMRecord comparator that provides an ordering based on a hash of the queryname. Has
- * the useful property that reads with the same name will be grouped together, but that
- * reads appear in an otherwise random order. Useful for when the read names in a BAM
- * are correlated to something else (e.g. position, read group), making a straight
- * queryname sort undesirable.
- *
- * @author Tim Fennell
- */
-public class SAMRecordQueryHashComparator extends SAMRecordQueryNameComparator implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private final Murmur3 hasher = new Murmur3(42);
-
- /**
- * Compares two records based on an integer hash of their read name's. If the hash
- * values are equal, falls back to the behaviour of SAMRecordQueryNameComparator
- * to break the tie.
- */
- @Override
- public int compare(final SAMRecord lhs, final SAMRecord rhs) {
- final int retval = compareHashes(lhs, rhs);
- if (retval == 0) return super.compare(lhs, rhs);
- else return retval;
- }
-
- /**
- * Compares two records based on an integer hash of their read names. If the hash
- * values are equal, falls back to the behaviour of SAMRecordQueryNameComparator
- * to break the tie.
- */
- @Override
- public int fileOrderCompare(final SAMRecord lhs, final SAMRecord rhs) {
- final int retval = compareHashes(lhs, rhs);
- if (retval == 0) return super.fileOrderCompare(lhs, rhs);
- else return retval;
- }
-
- /** Compares the hash values for two records. */
- private int compareHashes(final SAMRecord lhs, final SAMRecord rhs) {
- return Integer.compare(this.hasher.hashUnencodedChars(lhs.getReadName()), this.hasher.hashUnencodedChars(rhs.getReadName()));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java b/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java
deleted file mode 100644
index 7fd97f5..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordQueryNameComparator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Comparator for "queryname" ordering of SAMRecords.
- */
-public class SAMRecordQueryNameComparator implements SAMRecordComparator, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- int cmp = fileOrderCompare(samRecord1, samRecord2);
- if (cmp != 0) {
- return cmp;
- }
-
- final boolean r1Paired = samRecord1.getReadPairedFlag();
- final boolean r2Paired = samRecord2.getReadPairedFlag();
-
- if (r1Paired || r2Paired) {
- if (!r1Paired) return 1;
- else if (!r2Paired) return -1;
- else if (samRecord1.getFirstOfPairFlag() && samRecord2.getSecondOfPairFlag()) return -1;
- else if (samRecord1.getSecondOfPairFlag() && samRecord2.getFirstOfPairFlag()) return 1;
- }
-
- if (samRecord1.getReadNegativeStrandFlag() != samRecord2.getReadNegativeStrandFlag()) {
- return (samRecord1.getReadNegativeStrandFlag()? 1: -1);
- }
- if (samRecord1.getNotPrimaryAlignmentFlag() != samRecord2.getNotPrimaryAlignmentFlag()) {
- return samRecord2.getNotPrimaryAlignmentFlag()? -1: 1;
- }
- if (samRecord1.getSupplementaryAlignmentFlag() != samRecord2.getSupplementaryAlignmentFlag()) {
- return samRecord2.getSupplementaryAlignmentFlag() ? -1 : 1;
- }
- final Integer hitIndex1 = samRecord1.getIntegerAttribute(SAMTag.HI.name());
- final Integer hitIndex2 = samRecord2.getIntegerAttribute(SAMTag.HI.name());
- if (hitIndex1 != null) {
- if (hitIndex2 == null) return 1;
- else {
- cmp = hitIndex1.compareTo(hitIndex2);
- if (cmp != 0) return cmp;
- }
- } else if (hitIndex2 != null) return -1;
- return 0;
- }
-
- /**
- * Less stringent compare method than the regular compare. If the two records
- * are equal enough that their ordering in a sorted SAM file would be arbitrary,
- * this method returns 0.
- *
- * @return negative if samRecord1 < samRecord2, 0 if equal, else positive
- */
- public int fileOrderCompare(final SAMRecord samRecord1, final SAMRecord samRecord2) {
- return compareReadNames(samRecord1.getReadName(), samRecord2.getReadName());
- }
-
- /**
- * Encapsulate algorithm for comparing read names in queryname-sorted file, since there have been
- * conversations about changing the behavior.
- */
- public static int compareReadNames(final String readName1, final String readName2) {
- return readName1.compareTo(readName2);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java b/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java
deleted file mode 100644
index 2af91c3..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordSetBuilder.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.DuplicateScoringStrategy.ScoringStrategy;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-import java.util.TreeSet;
-
-/**
- * Factory class for creating SAMRecords for testing purposes. Various methods can be called
- * to add new SAM records (or pairs of records) to a list which can then be returned at
- * any point. The records must reference human chromosomes (excluding randoms etc.).
- * <p/>
- * Although this is a class for testing, it is in the src tree because it is included in the sam jarfile.
- *
- * @author Tim Fennell
- */
-public class SAMRecordSetBuilder implements Iterable<SAMRecord> {
- private static final String[] chroms = {
- "chr1", "chr2", "chr3", "chr4", "chr5", "chr6", "chr7", "chr8", "chr9", "chr10",
- "chr11", "chr12", "chr13", "chr14", "chr15", "chr16", "chr17", "chr18", "chr19", "chr20",
- "chr21", "chr22", "chrX", "chrY", "chrM"
- };
- private static final byte[] BASES = {'A', 'C', 'G', 'T'};
- private static final String READ_GROUP_ID = "1";
- private static final String SAMPLE = "FREE_SAMPLE";
- private final Random random = new Random();
-
- private SAMFileHeader header;
- private final Collection<SAMRecord> records;
-
- private int readLength = 36;
-
- private SAMProgramRecord programRecord = null;
- private SAMReadGroupRecord readGroup = null;
- private boolean useNmFlag = false;
-
- private boolean unmappedHasBasesAndQualities = true;
-
- public static final int DEFAULT_CHROMOSOME_LENGTH = 200000000;
-
- public static final ScoringStrategy DEFAULT_DUPLICATE_SCORING_STRATEGY = ScoringStrategy.TOTAL_MAPPED_REFERENCE_LENGTH;
-
- /**
- * Constructs a new SAMRecordSetBuilder with all the data needed to keep the records
- * sorted in coordinate order.
- */
- public SAMRecordSetBuilder() {
- this(true, SAMFileHeader.SortOrder.coordinate);
- }
-
- /**
- * Construct a new SAMRecordSetBuilder.
- *
- * @param sortOrder If sortForMe, defines the sort order.
- * @param sortForMe If true, keep the records created in sorted order.
- */
- public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
- this(sortForMe, sortOrder, true);
- }
-
- public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup) {
- this(sortForMe, sortOrder, addReadGroup, DEFAULT_CHROMOSOME_LENGTH);
- }
-
- public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup, final int defaultChromosomeLength) {
- this(sortForMe, sortOrder, addReadGroup, defaultChromosomeLength, DEFAULT_DUPLICATE_SCORING_STRATEGY);
- }
-
- public SAMRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder, final boolean addReadGroup,
- final int defaultChromosomeLength, final ScoringStrategy duplicateScoringStrategy) {
- final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>();
- for (final String chrom : chroms) {
- final SAMSequenceRecord sequenceRecord = new SAMSequenceRecord(chrom, defaultChromosomeLength);
- sequences.add(sequenceRecord);
- }
-
- this.header = new SAMFileHeader();
- this.header.setSequenceDictionary(new SAMSequenceDictionary(sequences));
- this.header.setSortOrder(sortOrder);
- if (sortForMe) {
- final SAMRecordComparator comparator;
- if (sortOrder == SAMFileHeader.SortOrder.queryname) {
- comparator = new SAMRecordQueryNameComparator();
- } else {
- comparator = new SAMRecordCoordinateComparator();
- }
- this.records = new TreeSet<SAMRecord>(comparator);
- } else {
- this.records = new ArrayList<SAMRecord>();
- }
-
- if (addReadGroup) {
- final SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord(READ_GROUP_ID);
- readGroupRecord.setSample(SAMPLE);
- readGroupRecord.setPlatform("ILLUMINA");
- final List<SAMReadGroupRecord> readGroups = new ArrayList<SAMReadGroupRecord>();
- readGroups.add(readGroupRecord);
- this.header.setReadGroups(readGroups);
- }
- }
-
- public void setUnmappedHasBasesAndQualities(final boolean value) {
- this.unmappedHasBasesAndQualities = value;
- }
-
- public int size() {
- return this.records.size();
- }
-
- /**
- * Set the seed of the random number generator for cases in which repeatable result is desired.
- *
- * @param seed
- */
- public void setRandomSeed(final long seed) {
- random.setSeed(seed);
- }
-
- /**
- * Adds the given program record to the header, and assigns the PG tag to any SAMRecords
- * created after it has been added. May be called multiple times in order to assign different
- * PG IDs to different SAMRecords. programRecord may be null to stop assignment of PG tag.
- * It is up to the caller to ensure that program record IDs do not collide.
- */
- public void setProgramRecord(final SAMProgramRecord programRecord) {
- this.programRecord = programRecord;
- if (programRecord != null) {
- this.header.addProgramRecord(programRecord);
- }
- }
-
- public void setUseNmFlag(final boolean useNmFlag) {
- this.useNmFlag = useNmFlag;
- }
-
- public void setReadGroup(final SAMReadGroupRecord readGroup) {
- this.readGroup = readGroup;
- if (readGroup != null) {
- this.header.addReadGroup(readGroup);
- }
- }
-
- /** Returns the accumulated list of sam records. */
- public Collection<SAMRecord> getRecords() { return this.records; }
-
- public void setHeader(final SAMFileHeader header) {
- this.header = header.clone();
- }
-
-
- /** The record should already have the DS and MC tags computed */
- public void addRecord(final SAMRecord record) {
- if (record.getReadPairedFlag() && !record.getMateUnmappedFlag() &&
- null == record.getAttribute(SAMTagUtil.getSingleton().MC)) {
- throw new SAMException("Mate Cigar tag (MC) not found in: " + record.getReadName());
- }
- this.records.add(record);
- }
-
- /** Returns a CloseableIterator over the collection of SAMRecords. */
- public CloseableIterator<SAMRecord> iterator() {
- return new CloseableIterator<SAMRecord>() {
- private final Iterator<SAMRecord> iterator = records.iterator();
-
- public void close() { /** Do nothing. */}
-
- public boolean hasNext() { return this.iterator.hasNext(); }
-
- public SAMRecord next() { return this.iterator.next(); }
-
- public void remove() { this.iterator.remove(); }
- };
- }
-
- /**
- * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
- * cigar string, quality string or default quality score. This does not modify the flag field, which should be updated
- * if desired before adding the return to the list of records.
- */
- private SAMRecord createReadNoFlag(final String name, final int contig, final int start, final boolean negativeStrand,
- final boolean recordUnmapped, final String cigar, final String qualityString,
- final int defaultQuality) throws SAMException {
- final SAMRecord rec = new SAMRecord(this.header);
- rec.setReadName(name);
- if (header.getSequenceDictionary().size() <= contig) {
- throw new SAMException("Contig too big [" + header.getSequenceDictionary().size() + " < " + contig);
- }
- if (0 <= contig) {
- rec.setReferenceIndex(contig);
- rec.setAlignmentStart(start);
- }
- if (!recordUnmapped) {
- rec.setReadNegativeStrandFlag(negativeStrand);
- if (null != cigar) {
- rec.setCigarString(cigar);
- } else if (!rec.getReadUnmappedFlag()) {
- rec.setCigarString(readLength + "M");
- }
- rec.setMappingQuality(255);
- } else {
- rec.setReadUnmappedFlag(true);
- }
- rec.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
-
- if(useNmFlag){
- rec.setAttribute(SAMTag.NM.name(), SequenceUtil.calculateSamNmTagFromCigar(rec));
- }
-
- if (programRecord != null) {
- rec.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
- }
-
- if (readGroup != null) {
- rec.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
- }
-
- if (!recordUnmapped || this.unmappedHasBasesAndQualities) {
- fillInBasesAndQualities(rec, qualityString, defaultQuality);
- }
-
- return rec;
- }
-
- /**
- * Adds a skeletal fragment (non-PE) record to the set using the provided
- * contig start and strand information.
- */
- public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand) {
- return addFrag(name, contig, start, negativeStrand, false, null, null, -1);
- }
-
- /**
- * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
- * cigar string, quality string or default quality score.
- */
- public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
- final boolean recordUnmapped, final String cigar, final String qualityString,
- final int defaultQuality) throws SAMException {
- return addFrag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality, false);
- }
-
- /**
- * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
- * cigar string, quality string or default quality score.
- */
- public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
- final boolean recordUnmapped, final String cigar, final String qualityString,
- final int defaultQuality, final boolean isSecondary) throws SAMException {
- final htsjdk.samtools.SAMRecord rec = createReadNoFlag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality);
- if (isSecondary) rec.setNotPrimaryAlignmentFlag(true);
- this.records.add(rec);
- return rec;
- }
-
- /**
- * Adds a fragment record (mapped or unmapped) to the set using the provided contig start and optionally the strand,
- * cigar string, quality string or default quality score.
- */
- public SAMRecord addFrag(final String name, final int contig, final int start, final boolean negativeStrand,
- final boolean recordUnmapped, final String cigar, final String qualityString,
- final int defaultQuality, final boolean isSecondary, final boolean isSupplementary) throws SAMException {
- final htsjdk.samtools.SAMRecord rec = createReadNoFlag(name, contig, start, negativeStrand, recordUnmapped, cigar, qualityString, defaultQuality);
- if (isSecondary) rec.setNotPrimaryAlignmentFlag(true);
- if (isSupplementary) rec.setSupplementaryAlignmentFlag(true);
- this.records.add(rec);
- return rec;
- }
-
-
- /**
- * Fills in the bases and qualities for the given record. Quality data is randomly generated if the defaultQuality
- * is set to -1. Otherwise all qualities will be set to defaultQuality. If a quality string is provided that string
- * will be used instead of the defaultQuality.
- */
- private void fillInBasesAndQualities(final SAMRecord rec, final String qualityString, final int defaultQuality) {
-
- if (null == qualityString) {
- fillInBasesAndQualities(rec, defaultQuality);
- } else {
- fillInBases(rec);
- rec.setBaseQualityString(qualityString);
- }
- }
-
- /**
- * Randomly fills in the bases for the given record.
- */
- private void fillInBases(final SAMRecord rec) {
- final int length = this.readLength;
- final byte[] bases = new byte[length];
-
- for (int i = 0; i < length; ++i) {
- bases[i] = BASES[this.random.nextInt(BASES.length)];
- }
-
- rec.setReadBases(bases);
- }
-
- /**
- * Adds an unmapped fragment read to the builder.
- */
- public void addUnmappedFragment(final String name) {
- addFrag(name, -1, -1, false, true, null, null, -1, false);
- }
-
-
- /**
- * Adds a skeletal pair of records to the set using the provided
- * contig starts. The pair is assumed to be a well
- * formed pair sitting on a single contig.
- */
- public void addPair(final String name, final int contig, final int start1, final int start2) {
- final SAMRecord end1 = new SAMRecord(this.header);
- final SAMRecord end2 = new SAMRecord(this.header);
- final boolean end1IsFirstOfPair = this.random.nextBoolean();
-
- end1.setReadName(name);
- end1.setReferenceIndex(contig);
- end1.setAlignmentStart(start1);
- end1.setReadNegativeStrandFlag(false);
- end1.setCigarString(readLength + "M");
- if(useNmFlag) end1.setAttribute(ReservedTagConstants.NM, 0);
- end1.setMappingQuality(255);
- end1.setReadPairedFlag(true);
- end1.setProperPairFlag(true);
- end1.setMateReferenceIndex(contig);
- end1.setAttribute(SAMTag.MC.name(), readLength + "M");
- end1.setMateAlignmentStart(start2);
- end1.setMateNegativeStrandFlag(true);
- end1.setFirstOfPairFlag(end1IsFirstOfPair);
- end1.setSecondOfPairFlag(!end1IsFirstOfPair);
- end1.setInferredInsertSize((int) CoordMath.getLength(start1, CoordMath.getEnd(start2, this.readLength)));
- end1.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
- if (programRecord != null) {
- end1.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
- }
- if (readGroup != null) {
- end1.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
- }
- fillInBasesAndQualities(end1);
-
- end2.setReadName(name);
- end2.setReferenceIndex(contig);
- end2.setAlignmentStart(start2);
- end2.setReadNegativeStrandFlag(true);
- end2.setCigarString(readLength + "M");
- if(useNmFlag) end2.setAttribute(ReservedTagConstants.NM,0);
- end2.setMappingQuality(255);
- end2.setReadPairedFlag(true);
- end2.setProperPairFlag(true);
- end2.setMateReferenceIndex(contig);
- end2.setAttribute(SAMTag.MC.name(), readLength + "M");
- end2.setMateAlignmentStart(start1);
- end2.setMateNegativeStrandFlag(false);
- end2.setFirstOfPairFlag(!end1IsFirstOfPair);
- end2.setSecondOfPairFlag(end1IsFirstOfPair);
- end2.setInferredInsertSize(end1.getInferredInsertSize());
- end2.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
- if (programRecord != null) {
- end2.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
- }
- if (readGroup != null) {
- end2.setAttribute(SAMTag.RG.name(), readGroup.getReadGroupId());
- }
- fillInBasesAndQualities(end2);
-
- this.records.add(end1);
- this.records.add(end2);
- }
-
- /**
- * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
- * The pair is assumed to be a well formed pair sitting on a single contig.
- */
- public List<SAMRecord> addPair(final String name, final int contig, final int start1, final int start2,
- final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
- final String cigar2, final boolean strand1, final boolean strand2, final int defaultQuality) {
- return this.addPair(name, contig, contig, start1, start2, record1Unmapped, record2Unmapped, cigar1, cigar2, strand1, strand2, false, false, defaultQuality);
- }
-
- /**
- * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
- * The pair is assumed to be a well formed pair sitting on a single contig.
- */
- public List<SAMRecord> addPair(final String name, final int contig1, final int contig2, final int start1, final int start2,
- final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
- final String cigar2, final boolean strand1, final boolean strand2, final boolean record1NonPrimary,
- final boolean record2NonPrimary, final int defaultQuality) {
- final List<SAMRecord> recordsList = new LinkedList<SAMRecord>();
-
- final SAMRecord end1 = createReadNoFlag(name, contig1, start1, strand1, record1Unmapped, cigar1, null, defaultQuality);
- final SAMRecord end2 = createReadNoFlag(name, contig2, start2, strand2, record2Unmapped, cigar2, null, defaultQuality);
-
- end1.setReadPairedFlag(true);
- end1.setFirstOfPairFlag(true);
-
- if (!record1Unmapped && !record2Unmapped) {
- end1.setProperPairFlag(true);
- end2.setProperPairFlag(true);
- }
- end2.setReadPairedFlag(true);
- end2.setSecondOfPairFlag(true);
-
- if (record1NonPrimary) end1.setNotPrimaryAlignmentFlag(true);
- if (record2NonPrimary) end2.setNotPrimaryAlignmentFlag(true);
-
- if (record1NonPrimary) end1.setNotPrimaryAlignmentFlag(true);
- if (record2NonPrimary) end2.setNotPrimaryAlignmentFlag(true);
-
- // set mate info
- SamPairUtil.setMateInfo(end1, end2, true);
-
- recordsList.add(end1);
- recordsList.add(end2);
-
- records.add(end1);
- records.add(end2);
-
- return recordsList;
- }
-
- /**
- * Adds a pair of records (mapped or unmmapped) to the set using the provided contig starts.
- * The pair is assumed to be a well formed pair sitting on a single contig.
- */
- public List<SAMRecord> addPair(final String name, final int contig, final int start1, final int start2,
- final boolean record1Unmapped, final boolean record2Unmapped, final String cigar1,
- final String cigar2, final boolean strand1, final boolean strand2, final boolean record1NonPrimary,
- final boolean record2NonPrimary, final int defaultQuality) {
- return addPair(name, contig, contig, start1, start2, record1Unmapped, record2Unmapped, cigar1, cigar2, strand1, strand2,
- record1NonPrimary, record2NonPrimary, defaultQuality);
- }
-
- /**
- * Adds a pair with both ends unmapped to the builder.
- */
- public void addUnmappedPair(final String name) {
- final SAMRecord end1 = new SAMRecord(this.header);
- final SAMRecord end2 = new SAMRecord(this.header);
- final boolean end1IsFirstOfPair = this.random.nextBoolean();
-
- end1.setReadName(name);
- end1.setReadPairedFlag(true);
- end1.setReadUnmappedFlag(true);
- end1.setAttribute(SAMTag.MC.name(), null);
- end1.setProperPairFlag(false);
- end1.setFirstOfPairFlag(end1IsFirstOfPair);
- end1.setSecondOfPairFlag(!end1IsFirstOfPair);
- end1.setMateUnmappedFlag(true);
- end1.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
- if (programRecord != null) {
- end1.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
- }
- if (this.unmappedHasBasesAndQualities) {
- fillInBasesAndQualities(end1);
- }
-
- end2.setReadName(name);
- end2.setReadPairedFlag(true);
- end2.setReadUnmappedFlag(true);
- end2.setAttribute(SAMTag.MC.name(), null);
- end2.setProperPairFlag(false);
- end2.setFirstOfPairFlag(!end1IsFirstOfPair);
- end2.setSecondOfPairFlag(end1IsFirstOfPair);
- end2.setMateUnmappedFlag(true);
- end2.setAttribute(SAMTag.RG.name(), READ_GROUP_ID);
- if (programRecord != null) {
- end2.setAttribute(SAMTag.PG.name(), programRecord.getProgramGroupId());
- }
- if (this.unmappedHasBasesAndQualities) {
- fillInBasesAndQualities(end2);
- }
-
- this.records.add(end1);
- this.records.add(end2);
- }
-
- /**
- * Fills in bases and qualities with randomly generated data.
- * Relies on the alignment start and end having been set to get read length.
- */
- private void fillInBasesAndQualities(final SAMRecord rec) {
- fillInBasesAndQualities(rec, -1);
- }
-
- /**
- * Fills in bases and qualities with a set default quality. If the defaultQuality is set to -1 quality scores will
- * be randomly generated.
- * Relies on the alignment start and end having been set to get read length.
- */
- private void fillInBasesAndQualities(final SAMRecord rec, final int defaultQuality) {
- final int length = this.readLength;
- final byte[] quals = new byte[length];
-
- if (-1 != defaultQuality) {
- Arrays.fill(quals, (byte) defaultQuality);
- } else {
- for (int i = 0; i < length; ++i) {
- quals[i] = (byte) this.random.nextInt(50);
- }
- }
- rec.setBaseQualities(quals);
- fillInBases(rec);
- }
-
- /**
- * Creates samFileReader from the data in instance of this class
- *
- * @return SamReader
- */
- public SamReader getSamReader() {
-
- final File tempFile;
-
- try {
- tempFile = File.createTempFile("temp", ".sam");
- } catch (final IOException e) {
- throw new RuntimeIOException("problems creating tempfile", e);
- }
-
- this.header.setAttribute("VN", "1.0");
- final SAMFileWriter w = new SAMFileWriterFactory().makeBAMWriter(this.header, true, tempFile);
- for (final SAMRecord r : this.getRecords()) {
- w.addAlignment(r);
- }
-
- w.close();
-
- final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(tempFile);
- tempFile.deleteOnExit();
-
- return reader;
- }
-
- public SAMFileHeader getHeader() {
- return header;
- }
-
- public void setReadLength(final int readLength) { this.readLength = readLength; }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SAMRecordUtil.java b/src/main/java/htsjdk/samtools/SAMRecordUtil.java
deleted file mode 100644
index d778789..0000000
--- a/src/main/java/htsjdk/samtools/SAMRecordUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- *
- * Use {@link SAMRecord#reverseComplement()} instead, which defaults to making a copy of attributes for reverse
- * complement rather than changing them in-place.
- *
- * @author alecw at broadinstitute.org
- */
- at Deprecated
-public class SAMRecordUtil {
- public static List<String> TAGS_TO_REVERSE_COMPLEMENT = Arrays.asList(SAMTag.E2.name(), SAMTag.SQ.name());
- public static List<String> TAGS_TO_REVERSE = Arrays.asList(SAMTag.OQ.name(), SAMTag.U2.name());
-
- /**
- * Reverse-complement bases and reverse quality scores along with known optional attributes that
- * need the same treatment. Changes made in-place, instead of making a copy of the bases, qualities,
- * or attributes. If a copy is needed use {@link #reverseComplement(SAMRecord, boolean)}.
- * See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
- * for the default set of tags that are handled.
- */
- public static void reverseComplement(final SAMRecord rec) {
- rec.reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, true);
- }
-
- /**
- * Reverse-complement bases and reverse quality scores along with known optional attributes that
- * need the same treatment. Optionally makes a copy of the bases, qualities or attributes instead
- * of altering them in-place. See {@link #TAGS_TO_REVERSE_COMPLEMENT} {@link #TAGS_TO_REVERSE}
- * for the default set of tags that are handled.
- *
- * @param rec Record to reverse complement.
- * @param inplace Setting this to false will clone all attributes, bases and qualities before changing the values.
- */
- public static void reverseComplement(final SAMRecord rec, boolean inplace) {
- rec.reverseComplement(TAGS_TO_REVERSE_COMPLEMENT, TAGS_TO_REVERSE, inplace);
- }
-
- /**
- * Reverse complement bases and reverse quality scores. In addition reverse complement any
- * non-null attributes specified by tagsToRevcomp and reverse and non-null attributes
- * specified by tagsToReverse.
- */
- public static void reverseComplement(final SAMRecord rec, final Collection<String> tagsToRevcomp, final Collection<String> tagsToReverse, boolean inplace) {
- rec.reverseComplement(tagsToRevcomp, tagsToReverse, inplace);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java b/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java
deleted file mode 100644
index b7744d7..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceDictionary.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.Log;
-
-import java.io.Serializable;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.util.*;
-import java.util.stream.Collector;
-import java.util.stream.Collectors;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-
-import static htsjdk.samtools.SAMSequenceRecord.*;
-import static java.util.stream.Collectors.toList;
-
-/**
- * Collection of SAMSequenceRecords.
- */
- at XmlRootElement(name="References")
-public class SAMSequenceDictionary implements Serializable {
- public static final long serialVersionUID = 1L;
-
- /* xml Serialization , for `m_sequence` we use the field instead of the
- getter because the later wraps the list into an unmodifiable List
- see http://tech.joshuacummings.com/2010/10/problems-with-defensive-collection.html */
- @XmlElement(name="Reference")
- private List<SAMSequenceRecord> mSequences = new ArrayList<SAMSequenceRecord>();
- private final Map<String, SAMSequenceRecord> mSequenceMap = new HashMap<String, SAMSequenceRecord>();
-
- public SAMSequenceDictionary() {
- }
-
- public SAMSequenceDictionary(final List<SAMSequenceRecord> list) {
- this();
- setSequences(list);
- }
-
- @XmlTransient //we use the field instead of getter/setter
- public List<SAMSequenceRecord> getSequences() {
- return Collections.unmodifiableList(mSequences);
- }
-
- private static Log log = Log.getInstance(SAMSequenceDictionary.class);
-
- public SAMSequenceRecord getSequence(final String name) {
- return mSequenceMap.get(name);
- }
-
- /**
- * Replaces the existing list of SAMSequenceRecords with the given list.
- * Reset the aliases
- *
- * @param list This value is used directly, rather than being copied.
- */
- public void setSequences(final List<SAMSequenceRecord> list) {
- mSequences = list;
- mSequenceMap.clear();
- int index = 0;
- for (final SAMSequenceRecord record : list) {
- record.setSequenceIndex(index++);
- if (mSequenceMap.put(record.getSequenceName(), record) != null) {
- throw new IllegalArgumentException("Cannot add sequence that already exists in SAMSequenceDictionary: " +
- record.getSequenceName());
- }
- }
- }
-
- public void addSequence(final SAMSequenceRecord sequenceRecord) {
- if (mSequenceMap.containsKey(sequenceRecord.getSequenceName())) {
- throw new IllegalArgumentException("Cannot add sequence that already exists in SAMSequenceDictionary: " +
- sequenceRecord.getSequenceName());
- }
- sequenceRecord.setSequenceIndex(mSequences.size());
- mSequences.add(sequenceRecord);
- mSequenceMap.put(sequenceRecord.getSequenceName(), sequenceRecord);
- }
-
- /**
- * @return The SAMSequenceRecord with the given index, or null if index is out of range.
- */
- public SAMSequenceRecord getSequence(final int sequenceIndex) {
- if (sequenceIndex < 0 || sequenceIndex >= mSequences.size()) {
- return null;
- }
- return mSequences.get(sequenceIndex);
- }
-
- /**
- * @return The index for the given sequence name, or -1 if the name is not found.
- */
- public int getSequenceIndex(final String sequenceName) {
- final SAMSequenceRecord record = mSequenceMap.get(sequenceName);
- if (record == null) {
- return -1;
- }
- return record.getSequenceIndex();
- }
-
- /**
- * @return number of SAMSequenceRecord(s) in this dictionary
- */
- public int size() {
- return mSequences.size();
- }
-
- /**
- * @return The sum of the lengths of the sequences in this dictionary
- */
- public long getReferenceLength() {
- long len = 0L;
- for (final SAMSequenceRecord seq : getSequences()) {
- len += seq.getSequenceLength();
- }
- return len;
- }
-
- /**
- * @return true is the dictionary is empty
- */
- public boolean isEmpty() {
- return mSequences.isEmpty();
- }
-
- private static String DICT_MISMATCH_TEMPLATE = "SAM dictionaries are not the same: %s.";
- /**
- * Non-comprehensive {@link #equals(Object)}-assertion: instead of calling {@link SAMSequenceRecord#equals(Object)} on constituent
- * {@link SAMSequenceRecord}s in this dictionary against its pair in the target dictionary, in order, call
- * {@link SAMSequenceRecord#isSameSequence(SAMSequenceRecord)}.
- * Aliases are ignored.
- *
- * @throws AssertionError When the dictionaries are not the same, with some human-readable information as to why
- */
- public void assertSameDictionary(final SAMSequenceDictionary that) {
- if (this == that) return;
-
- final Iterator<SAMSequenceRecord> thatSequences = that.mSequences.iterator();
- for (final SAMSequenceRecord thisSequence : mSequences) {
- if (!thatSequences.hasNext())
- throw new AssertionError(String.format(DICT_MISMATCH_TEMPLATE, thisSequence + " is present in only one dictionary"));
- else {
- final SAMSequenceRecord thatSequence = thatSequences.next();
- if(!thatSequence.isSameSequence(thisSequence))
- throw new AssertionError(
- String.format(DICT_MISMATCH_TEMPLATE, thatSequence + " was found when " + thisSequence + " was expected")
- );
- }
- }
- if (thatSequences.hasNext())
- throw new AssertionError(String.format(DICT_MISMATCH_TEMPLATE, thatSequences.next() + " is present in only one dictionary"));
- }
-
- /** returns true if the two dictionaries are the same, aliases are NOT considered */
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- SAMSequenceDictionary that = (SAMSequenceDictionary) o;
-
- if (!mSequences.equals(that.mSequences)) return false;
-
- return true;
- }
-
- /**
- * Add an alias to a SAMSequenceRecord. This can be use to provide some
- * alternate names fo a given contig. e.g:
- * <code>1,chr1,chr01,01,CM000663,NC_000001.10</code> e.g:
- * <code>MT,chrM</code>
- *
- * @param originalName
- * existing contig name
- * @param altName
- * new contig name
- * @return the contig associated to the 'originalName/altName'
- */
- public SAMSequenceRecord addSequenceAlias(final String originalName,
- final String altName) {
- if (originalName == null) throw new IllegalArgumentException("original name cannot be null");
- if (altName == null) throw new IllegalArgumentException("alt name cannot be null");
- final SAMSequenceRecord originalSeqRecord = getSequence(originalName);
- if (originalSeqRecord == null) throw new IllegalArgumentException("Sequence " + originalName + " doesn't exist in dictionary.");
- // same name, nothing to do
- if (originalName.equals(altName)) return originalSeqRecord;
- final SAMSequenceRecord altSeqRecord = getSequence(altName);
- if (altSeqRecord != null) {
- // alias was already set to the same record
- if (altSeqRecord.equals(originalSeqRecord)) return originalSeqRecord;
- // alias was already set to another record
- throw new IllegalArgumentException("Alias " + altName +
- " was already set to " + altSeqRecord.getSequenceName());
- }
- mSequenceMap.put(altName, originalSeqRecord);
- return originalSeqRecord;
- }
-
- /**
- * return a MD5 sum for ths dictionary, the checksum is re-computed each
- * time this method is called.
- *
- * <pre>
- * md5( (seq1.md5_if_available) + ' '+(seq2.name+seq2.length) + ' '+...)
- * </pre>
- *
- * @return a MD5 checksum for this dictionary or the empty string if it is
- * empty
- */
- public String md5() {
- if (isEmpty())
- return "";
- try {
- final MessageDigest md5 = MessageDigest.getInstance("MD5");
- md5.reset();
- for (final SAMSequenceRecord samSequenceRecord : mSequences) {
- if (samSequenceRecord.getSequenceIndex() > 0)
- md5.update((byte) ' ');
- final String md5_tag = samSequenceRecord.getAttribute(SAMSequenceRecord.MD5_TAG);
- if (md5_tag != null) {
- md5.update(md5_tag.getBytes());
- } else {
- md5.update(samSequenceRecord.getSequenceName().getBytes());
- md5.update(String.valueOf(samSequenceRecord.getSequenceLength()).getBytes());
- }
- }
- String hash = new BigInteger(1, md5.digest()).toString(16);
- if (hash.length() != 32) {
- final String zeros = "00000000000000000000000000000000";
- hash = zeros.substring(0, 32 - hash.length()) + hash;
- }
- return hash;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public int hashCode() {
- return mSequences.hashCode();
- }
-
- @Override
- public String toString() {
- return "SAMSequenceDictionary:( sequences:"+ size()+
- " length:"+ getReferenceLength()+" "+
- " md5:"+md5()+")";
- }
-
- public static final List<String> DEFAULT_DICTIONARY_EQUAL_TAG = Arrays.asList(
- SAMSequenceRecord.MD5_TAG,
- SAMSequenceRecord.SEQUENCE_LENGTH_TAG);
-
- /**
- * Will merge dictionaryTags from two dictionaries into one focusing on merging the tags rather than the sequences.
- *
- * Requires that dictionaries have the same SAMSequence records in the same order.
- * For each sequenceIndex, the union of the tags from both sequences will be added to the new sequence, mismatching
- * values (for tags that are in both) will generate a warning, and the value from dict1 will be used.
- * For tags that are in tagsToEquate an unequal value will generate an error (an IllegalArgumentException will
- * be thrown.) tagsToEquate must include LN and MD.
- *
- * @param dict1 first dictionary
- * @param dict2 first dictionary
- * @param tagsToMatch list of tags that must be equal if present in both sequence. Must contain MD, and LN
- * @return dictionary consisting of the same sequences as the two inputs with the merged values of tags.
- */
- static public SAMSequenceDictionary mergeDictionaries(final SAMSequenceDictionary dict1,
- final SAMSequenceDictionary dict2,
- final List<String> tagsToMatch) {
-
- // We require MD and LN to match.
- if (!tagsToMatch.contains(MD5_TAG) || !tagsToMatch.contains(SEQUENCE_LENGTH_TAG)) {
- throw new IllegalArgumentException("Both " + MD5_TAG + " and " + SEQUENCE_LENGTH_TAG + " must be matched " +
- "when merging dictionaries. Found: " + String.join(",", tagsToMatch));
- }
-
- if (!dict1.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(Collectors.toList()).equals(
- dict2.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(Collectors.toList()))) {
-
- throw new IllegalArgumentException(String.format("Do not use this function to merge dictionaries with " +
- "different sequences in them. Sequences must be in the same order as well. Found [%s] and [%s].",
- String.join(", ", dict1.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(toList())),
- String.join(", ", dict2.getSequences().stream().map(SAMSequenceRecord::getSequenceName).collect(toList()))));
- }
-
- final SAMSequenceDictionary finalDict = new SAMSequenceDictionary();
- for (int sequenceIndex = 0; sequenceIndex < dict1.getSequences().size(); sequenceIndex++) {
- final SAMSequenceRecord s1 = dict1.getSequence(sequenceIndex);
- final SAMSequenceRecord s2 = dict2.getSequence(sequenceIndex);
-
- final String sName = s1.getSequenceName();
- final SAMSequenceRecord sMerged = new SAMSequenceRecord(sName, UNKNOWN_SEQUENCE_LENGTH);
- finalDict.addSequence(sMerged);
-
- final Set<String> allTags = new HashSet<>();
- s1.getAttributes().stream().forEach(a -> allTags.add(a.getKey()));
- s2.getAttributes().stream().forEach(a -> allTags.add(a.getKey()));
-
- for (final String tag : allTags) {
- final String value1 = s1.getAttribute(tag);
- final String value2 = s2.getAttribute(tag);
-
- if (value1 != null && value2 != null && !value1.equals(value2)) {
- String baseMessage = String.format("Found sequence entry for which " +
- "tags differ: %s and tag %s has the two values: %s and %s.",
- sName, tag, value1, value2);
-
- if (tagsToMatch.contains(tag)) {
- log.error("Cannot merge dictionaries. ", baseMessage);
- throw new IllegalArgumentException("Cannot merge dictionaries. " + baseMessage);
- } else {
- log.warn(baseMessage, " Using ", value1);
- }
- }
- sMerged.setAttribute(tag, value1 == null ? value2 : value1);
- }
-
- final int length1 = s1.getSequenceLength();
- final int length2 = s2.getSequenceLength();
-
- if (length1 != UNKNOWN_SEQUENCE_LENGTH && length2 != UNKNOWN_SEQUENCE_LENGTH && length1 != length2) {
- throw new IllegalArgumentException(String.format("Cannot merge the two dictionaries. " +
- "Found sequence entry for which " + "lengths differ: %s has lengths %s and %s", sName, length1, length2));
- }
- sMerged.setSequenceLength(length1 == UNKNOWN_SEQUENCE_LENGTH ? length2 : length1);
- }
- return finalDict;
- }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java b/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java
deleted file mode 100644
index e6e3ba5..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceDictionaryCodec.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.LineReader;
-import java.io.BufferedWriter;
-
-/**
- * "On the fly" codec SAMSequenceDictionaryCodec.
- * Encodes each sequence and directly writes it to the Dictionary file.
- *
- * To use this class you should provide BufferedWriter to it, and so you should close it as you stop using this class.
- * You can work with this class as shown below.
- *
- * Example of using this class:
- *
- * List<SAMSequenceRecord> dict = ...;
- *
- * //open BufferedReader and close in try-with-resources
- * try(BufferedWriter writer = new BufferedWriter(new FileWriter("path/to/file"))) {
- * SAMSequenceDictionaryCodec codec = new SAMSequenceDictionaryCodec(writer);
- *
- * //we have list of sequences, so encode header line and after that encode each sequence
- * codec.encodeHeaderLine(false);
- * dict.forEach(codec::encodeSequenceRecord);
- *}
- *
- * or
- *
- * SAMSequenceDictionary dict = ...;
- *
- * //open BufferedReader and close in try-with-resources
- * try(BufferedWriter writer = new BufferedWriter(new FileWriter("path/to/file"))) {
- * SAMSequenceDictionaryCodec codec = new SAMSequenceDictionaryCodec(writer);
- *
- * //we have complete {@link SAMSequenceDictionary}, so just encode it.
- * codec.encode(dict);
- *}
- *
- * @author Pavel_Silin at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SAMSequenceDictionaryCodec {
-
- private static final SAMFileHeader EMPTY_HEADER = new SAMFileHeader();
-
- private final SAMTextHeaderCodec codec;
-
- public SAMSequenceDictionaryCodec(final BufferedWriter writer) {
- codec = new SAMTextHeaderCodec();
- codec.setmFileHeader(EMPTY_HEADER);
- codec.setWriter(writer);
- }
-
- /**
- * Write {@link SAMSequenceRecord}.
- * @param sequenceRecord object to be converted to text.
- */
- public void encodeSequenceRecord(final SAMSequenceRecord sequenceRecord) {
- codec.encodeSequenceRecord(sequenceRecord);
- }
-
- /**
- * Write Header line.
- * @param keepExistingVersionNumber boolean flag to keep existing version number.
- */
- public void encodeHeaderLine(final boolean keepExistingVersionNumber) {
- codec.encodeHeaderLine(keepExistingVersionNumber);
- }
-
- /**
- * Reads text SAM header and converts to a SAMSequenceDictionary object.
- * @param reader Where to get header text from.
- * @param source Name of the input file, for error messages. May be null.
- * @return complete SAMSequenceDictionary object.
- */
- public SAMSequenceDictionary decode(final LineReader reader, final String source) {
- return codec.decode(reader, source).getSequenceDictionary();
- }
-
- /**
- * Convert {@link SAMSequenceDictionary} from in-memory representation to text representation.
- * @param dictionary object to be converted to text.
- */
- public void encode(final SAMSequenceDictionary dictionary) {
- codec.encodeHeaderLine(false);
- dictionary.getSequences().forEach(this::encodeSequenceRecord);
- }
-
- public void setValidationStringency(final ValidationStringency validationStringency) {
- codec.setValidationStringency(validationStringency);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java b/src/main/java/htsjdk/samtools/SAMSequenceRecord.java
deleted file mode 100644
index 6bca979..0000000
--- a/src/main/java/htsjdk/samtools/SAMSequenceRecord.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.math.BigInteger;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlValue;
-
-/**
- * Header information about a reference sequence. Corresponds to @SQ header record in SAM text header.
- */
- at XmlRootElement(name="Reference")
-public class SAMSequenceRecord extends AbstractSAMHeaderRecord implements Cloneable
-{
- public static final long serialVersionUID = 1L; // AbstractSAMHeaderRecord implements Serializable
- private String mSequenceName = null; // Value must be interned() if it's ever set/modified
- private int mSequenceIndex = -1;
- private int mSequenceLength = 0;
- public static final String SEQUENCE_NAME_TAG = "SN";
- public static final String SEQUENCE_LENGTH_TAG = "LN";
- public static final String MD5_TAG = "M5";
- public static final String ASSEMBLY_TAG = "AS";
- public static final String URI_TAG = "UR";
- public static final String SPECIES_TAG = "SP";
-
- /** If one sequence has this length, and another sequence had a different length, isSameSequence will
- * not complain that they are different sequences. */
- public static final int UNKNOWN_SEQUENCE_LENGTH = 0;
-
-
- /**
- * This is not a valid sequence name, because it is reserved in the MRNM field of SAM text format
- * to mean "same reference as RNAME field."
- */
- public static final String RESERVED_MRNM_SEQUENCE_NAME = "=";
-
- /**
- * The standard tags are stored in text header without type information, because the type of these tags is known.
- */
- public static final Set<String> STANDARD_TAGS =
- new HashSet<String>(Arrays.asList(SEQUENCE_NAME_TAG, SEQUENCE_LENGTH_TAG, ASSEMBLY_TAG, MD5_TAG, URI_TAG,
- SPECIES_TAG));
-
- // Split on any whitespace
- private static Pattern SEQUENCE_NAME_SPLITTER = Pattern.compile("\\s");
- // These are the chars matched by \\s.
- private static char[] WHITESPACE_CHARS = {' ', '\t', '\n', '\013', '\f', '\r'}; // \013 is vertical tab
-
- /** a (private) empty constructor is required for JAXB.XML-serialisation */
- @SuppressWarnings("unused")
- private SAMSequenceRecord() {
- }
-
- /**
- * @deprecated Use {@link #SAMSequenceRecord(String, int)} instead.
- * sequenceLength is required for the object to be considered valid.
- */
- @Deprecated
- public SAMSequenceRecord(final String name) {
- this(name, UNKNOWN_SEQUENCE_LENGTH);
- }
-
- public SAMSequenceRecord(final String name, final int sequenceLength) {
- if (name != null) {
- if (SEQUENCE_NAME_SPLITTER.matcher(name).find()) {
- throw new SAMException("Sequence name contains invalid character: " + name);
- }
- validateSequenceName(name);
- mSequenceName = name.intern();
- }
- mSequenceLength = sequenceLength;
- }
-
- @XmlValue
- public String getSequenceName() { return mSequenceName; }
-
- /* this private method is used by XML serialization */
- @SuppressWarnings("unused")
- private void setSequenceName(final String name) {
- if (name != null) {
- mSequenceName = name.intern();
- }
- else {
- mSequenceName = null;
- }
- }
-
- @XmlAttribute(name="length")
- public int getSequenceLength() { return mSequenceLength; }
- public void setSequenceLength(final int value) { mSequenceLength = value; }
-
- @XmlAttribute(name="assembly")
- public String getAssembly() { return (String) getAttribute(ASSEMBLY_TAG); }
- public void setAssembly(final String value) { setAttribute(ASSEMBLY_TAG, value); }
-
- @XmlAttribute(name="species")
- public String getSpecies() { return (String) getAttribute(SPECIES_TAG); }
- public void setSpecies(final String value) { setAttribute(SPECIES_TAG, value); }
-
- @XmlAttribute(name="md5")
- public String getMd5() { return (String) getAttribute(MD5_TAG); }
- public void setMd5(final String value) { setAttribute(MD5_TAG, value); }
-
- /**
- * @return Index of this record in the sequence dictionary it lives in.
- */
- @XmlAttribute(name="index")
- public int getSequenceIndex() { return mSequenceIndex; }
-
- // Private state used only by SAM implementation.
- public void setSequenceIndex(final int value) { mSequenceIndex = value; }
-
- /**
- * Looser comparison than equals(). We look only at sequence index, sequence length, and MD5 tag value
- * (or sequence names, if there is no MD5 tag in either record.
- */
- public boolean isSameSequence(final SAMSequenceRecord that) {
- if (this == that) return true;
- if (that == null) return false;
-
- if (mSequenceIndex != that.mSequenceIndex) return false;
- // PIC-439. Allow undefined length.
- if (mSequenceLength != UNKNOWN_SEQUENCE_LENGTH && that.mSequenceLength != UNKNOWN_SEQUENCE_LENGTH && mSequenceLength != that.mSequenceLength)
- return false;
- if (this.getAttribute(SAMSequenceRecord.MD5_TAG) != null && that.getAttribute(SAMSequenceRecord.MD5_TAG) != null) {
- final BigInteger thisMd5 = new BigInteger((String)this.getAttribute(SAMSequenceRecord.MD5_TAG), 16);
- final BigInteger thatMd5 = new BigInteger((String)that.getAttribute(SAMSequenceRecord.MD5_TAG), 16);
- if (!thisMd5.equals(thatMd5)) {
- return false;
- }
- }
- else {
- if (mSequenceName != that.mSequenceName) return false; // Compare using == since we intern() the Strings
- }
-
- return true;
- }
-
- private URI makeURI(final String s) throws URISyntaxException {
- URI uri = new URI(s);
- if (uri.getScheme() == null) {
- uri = new URI("file", uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment());
- }
- return uri;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (!(o instanceof SAMSequenceRecord)) return false;
-
- final SAMSequenceRecord that = (SAMSequenceRecord) o;
-
- if (mSequenceIndex != that.mSequenceIndex) return false;
- if (mSequenceLength != that.mSequenceLength) return false;
- if (!attributesEqual(that)) return false;
- if (mSequenceName != that.mSequenceName) return false; // Compare using == since we intern() the name
-
- return true;
- }
-
- @Override
- public int hashCode() {
- return mSequenceName != null ? mSequenceName.hashCode() : 0;
- }
-
- Set<String> getStandardTags() {
- return STANDARD_TAGS;
- }
-
- public final SAMSequenceRecord clone() {
- final SAMSequenceRecord ret = new SAMSequenceRecord(this.mSequenceName, this.mSequenceLength);
- ret.mSequenceIndex = this.mSequenceIndex;
- for (final Map.Entry<String, String> entry : this.getAttributes()) {
- ret.setAttribute(entry.getKey(), entry.getValue());
- }
- return ret;
- }
-
- /**
- * Truncate sequence name at first whitespace.
- */
- public static String truncateSequenceName(final String sequenceName) {
- /*
- * Instead of using regex split, do it manually for better performance.
- return SEQUENCE_NAME_SPLITTER.split(sequenceName, 2)[0];
- */
- int truncateAt = sequenceName.length();
- for (final char c : WHITESPACE_CHARS) {
- int index = sequenceName.indexOf(c);
- if (index != -1 && index < truncateAt) {
- truncateAt = index;
- }
- }
- return sequenceName.substring(0, truncateAt);
- }
-
- /**
- * Throw an exception if the sequence name is not valid.
- */
- public static void validateSequenceName(final String name) {
- if (RESERVED_MRNM_SEQUENCE_NAME.equals(name)) {
- throw new SAMException("'" + RESERVED_MRNM_SEQUENCE_NAME + "' is not a valid sequence name");
- }
- }
-
- @Override
- public String toString() {
- return String.format(
- "SAMSequenceRecord(name=%s,length=%s,dict_index=%s,assembly=%s)",
- getSequenceName(),
- getSequenceLength(),
- getSequenceIndex(),
- getAssembly()
- );
- }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java b/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java
deleted file mode 100644
index b6b7dd4..0000000
--- a/src/main/java/htsjdk/samtools/SAMSortOrderChecker.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Encapsulates simple check for SAMRecord order.
- * @author alecw at broadinstitute.org
- */
-public class SAMSortOrderChecker {
- private final SAMFileHeader.SortOrder sortOrder;
- private SAMRecord prev;
- private final SAMRecordComparator comparator;
-
- public SAMSortOrderChecker(final SAMFileHeader.SortOrder sortOrder) {
- this.sortOrder = sortOrder;
- switch (sortOrder) {
- case coordinate:
- comparator = new SAMRecordCoordinateComparator();
- break;
- case queryname:
- comparator = new SAMRecordQueryNameComparator();
- break;
- case duplicate:
- comparator = new SAMRecordDuplicateComparator();
- break;
- case unsorted:
- default:
- comparator = null;
- break;
- }
- }
-
- /**
- * Check if given SAMRecord violates sort order relative to previous SAMRecord.
- * @return True if sort order is unsorted, if this is the first record, or if previous <= rec.
- */
- public boolean isSorted(final SAMRecord rec) {
- if (comparator == null) {
- return true;
- }
- boolean ret = true;
- if (prev != null) {
- ret = comparator.fileOrderCompare(prev, rec) <= 0;
- }
- prev = rec;
- return ret;
- }
-
- public SAMRecord getPreviousRecord() {
- return prev;
- }
-
- /**
- * Return the sort key used for the given sort order. Useful in error messages.
- */
- public String getSortKey(final SAMRecord rec) {
- switch (sortOrder) {
-
- case coordinate:
- return rec.getReferenceName() + ":" + rec.getAlignmentStart();
- case queryname:
- return rec.getReadName();
- case unsorted:
- default:
- return null;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTag.java b/src/main/java/htsjdk/samtools/SAMTag.java
deleted file mode 100644
index fa25728..0000000
--- a/src/main/java/htsjdk/samtools/SAMTag.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * The standard tags for a SAM record that are defined in the SAM spec.
- */
-public enum SAMTag {
- AM,
- AS,
- BC,
- BQ,
- CC,
- CM,
- CO,
- CP,
- CQ,
- CS,
- CT,
- E2,
- FI,
- FS,
- FT,
- FZ,
- GC, // for backwards compatibility
- GS, // for backwards compatibility
- GQ, // for backwards compatibility
- LB,
- H0,
- H1,
- H2,
- HI,
- IH,
- MC,
- MF, // for backwards compatibility
- MD,
- MQ,
- NH,
- NM,
- OQ,
- OP,
- OC,
- OF,
- OR,
- PG,
- PQ,
- PT,
- PU,
- QT,
- Q2,
- R2,
- RG,
- RT,
- S2, // for backwards compatibility
- SA,
- SM,
- SQ, // for backwards compatibility
- TC,
- U2,
- UQ
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTagUtil.java b/src/main/java/htsjdk/samtools/SAMTagUtil.java
deleted file mode 100644
index 0266b0e..0000000
--- a/src/main/java/htsjdk/samtools/SAMTagUtil.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Facility for converting between String and short representation of a SAM tag. short representation
- * is used by SAM JDK internally and is much more efficient. Callers are encouraged to obtain the short
- * value for a tag of interest once, and then use the SAMRecord attribute API that takes shorts rather than
- * Strings.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMTagUtil {
-
- // Standard tags pre-computed for convenience
- public final short RG = makeBinaryTag(SAMTag.RG.name());
- public final short LB = makeBinaryTag(SAMTag.LB.name());
- public final short PU = makeBinaryTag(SAMTag.PU.name());
- public final short PG = makeBinaryTag(SAMTag.PG.name());
- public final short AS = makeBinaryTag(SAMTag.AS.name());
- public final short SQ = makeBinaryTag(SAMTag.SQ.name());
- public final short MQ = makeBinaryTag(SAMTag.MQ.name());
- public final short NM = makeBinaryTag(SAMTag.NM.name());
- public final short H0 = makeBinaryTag(SAMTag.H0.name());
- public final short H1 = makeBinaryTag(SAMTag.H1.name());
- public final short H2 = makeBinaryTag(SAMTag.H2.name());
- public final short UQ = makeBinaryTag(SAMTag.UQ.name());
- public final short PQ = makeBinaryTag(SAMTag.PQ.name());
- public final short NH = makeBinaryTag(SAMTag.NH.name());
- public final short IH = makeBinaryTag(SAMTag.IH.name());
- public final short HI = makeBinaryTag(SAMTag.HI.name());
- public final short MD = makeBinaryTag(SAMTag.MD.name());
- public final short CS = makeBinaryTag(SAMTag.CS.name());
- public final short CQ = makeBinaryTag(SAMTag.CQ.name());
- public final short CM = makeBinaryTag(SAMTag.CM.name());
- public final short R2 = makeBinaryTag(SAMTag.R2.name());
- public final short Q2 = makeBinaryTag(SAMTag.Q2.name());
- public final short S2 = makeBinaryTag(SAMTag.S2.name());
- public final short CC = makeBinaryTag(SAMTag.CC.name());
- public final short CP = makeBinaryTag(SAMTag.CP.name());
- public final short SM = makeBinaryTag(SAMTag.SM.name());
- public final short AM = makeBinaryTag(SAMTag.AM.name());
- public final short MF = makeBinaryTag(SAMTag.MF.name());
- public final short E2 = makeBinaryTag(SAMTag.E2.name());
- public final short U2 = makeBinaryTag(SAMTag.U2.name());
- public final short OQ = makeBinaryTag(SAMTag.OQ.name());
- public final short FZ = makeBinaryTag(SAMTag.FZ.name());
- public final short SA = makeBinaryTag(SAMTag.SA.name());
- public final short MC = makeBinaryTag(SAMTag.MC.name());
-
- private static SAMTagUtil singleton;
-
- // Cache of already-converted tags. Should speed up SAM text generation.
- // Not synchronized because race condition is not a problem.
- private final String[] stringTags = new String[Short.MAX_VALUE];
-
- /**
- * Despite the fact that this class has state, it should be thread-safe because the cache
- * gets filled with the same values by any thread.
- */
- public static SAMTagUtil getSingleton() {
- if (singleton == null) {
- singleton = new SAMTagUtil();
- }
- return singleton;
- }
-
-
- /**
- * Convert from String representation of tag name to short representation.
- *
- * @param tag 2-character String representation of a tag name.
- * @return Tag name packed as 2 ASCII bytes in a short.
- */
- public short makeBinaryTag(final String tag) {
- if (tag.length() != 2) {
- throw new IllegalArgumentException("String tag does not have length() == 2: " + tag);
- }
- return (short)(tag.charAt(1) << 8 | tag.charAt(0));
- }
-
- /**
- * Convert from short representation of tag name to String representation.
- *
- * @param tag Tag name packed as 2 ASCII bytes in a short.
- * @return 2-character String representation of a tag name.
- */
- public String makeStringTag(final short tag) {
- String ret = stringTags[tag];
- if (ret == null) {
- final byte[] stringConversionBuf = new byte[2];
- stringConversionBuf[0] = (byte)(tag & 0xff);
- stringConversionBuf[1] = (byte)((tag >> 8) & 0xff);
- ret = StringUtil.bytesToString(stringConversionBuf);
- stringTags[tag] = ret;
- }
- return ret;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTestUtil.java b/src/main/java/htsjdk/samtools/SAMTestUtil.java
deleted file mode 100644
index 83766f3..0000000
--- a/src/main/java/htsjdk/samtools/SAMTestUtil.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Misc methods for SAM-related unit tests. These are in the src tree rather than the tests tree
- * so that they will be included in sam.jar, and therefore can be used by tests outside of htsjdk.samtools.
- */
-public class SAMTestUtil {
-
- /**
- * Indicates that a required sanity-check condition was not met.
- */
- public static class SanityCheckFailedException extends RuntimeException {
- public SanityCheckFailedException(String message) {
- super(message);
- }
- }
-
- /**
- * Basic sanity check for a pair of SAMRecords.
- * @throws SanityCheckFailedException if the sanity check failed
- */
- public void assertPairValid(final SAMRecord firstEnd, final SAMRecord secondEnd) throws SanityCheckFailedException {
- assertEquals(firstEnd.getReadName(), secondEnd.getReadName());
- assertTrue(firstEnd.getFirstOfPairFlag());
- assertTrue(secondEnd.getSecondOfPairFlag());
- assertFalse(secondEnd.getFirstOfPairFlag());
- assertFalse(firstEnd.getSecondOfPairFlag());
- if (!firstEnd.getReadUnmappedFlag() && !secondEnd.getReadUnmappedFlag()) {
- assertNotSame(firstEnd.getReadNegativeStrandFlag(),
- secondEnd.getReadNegativeStrandFlag());
- }
- }
-
- /**
- * Basic sanity check for a SAMRecord.
- * @throws SanityCheckFailedException if the sanity check failed
- */
- public void assertReadValid(final SAMRecord read) throws SanityCheckFailedException {
- assertEquals(read.getReadBases().length, read.getBaseQualities().length);
- // Note that it is possible to have an unmapped read that has a coordinate
- if (read.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
- assertEquals(read.getAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
- assertTrue(read.getReadUnmappedFlag());
- } else {
- assertNotSame(read.getAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
- }
- if (read.getReadUnmappedFlag()) {
- assertEquals(read.getMappingQuality(), SAMRecord.NO_MAPPING_QUALITY);
- assertEquals(read.getCigar().getCigarElements().size(), 0);
- } else {
- assertNotSame(read.getCigar().getCigarElements(), 0);
- }
- if (read.getReadPairedFlag()) {
- if (read.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
- assertEquals(read.getMateAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
- assertTrue(read.getMateUnmappedFlag());
- } else {
- // Even if the mate is unmapped, if it has a reference name, it should have a position.
- assertNotSame(read.getMateAlignmentStart(), SAMRecord.NO_ALIGNMENT_START);
- }
- if (read.getReadUnmappedFlag() || read.getMateUnmappedFlag() ||
- !read.getReferenceName().equals(read.getMateReferenceName())) {
- assertEquals(read.getInferredInsertSize(), 0);
- } else {
- assertNotSame(read.getInferredInsertSize(), 0);
- }
- if (!read.getReadUnmappedFlag() && !read.getMateUnmappedFlag()) {
- assertNotSame(read.getReadNegativeStrandFlag(), read.getMateNegativeStrandFlag());
- assertNotSame(read.getMateNegativeStrandFlag(),
- read.getReadName());
- }
-
- } else {
- assertEquals(read.getInferredInsertSize(), 0);
- }
- }
-
- private static <T> void assertEquals(T a, T b) {
- if (a == null) {
- if (b != null) {
- throw new SanityCheckFailedException("\"" + a + "\" does not equal \"" + b + "\"");
- }
- } else if (!a.equals(b)) {
- throw new SanityCheckFailedException("\"" + a + "\" does not equal \"" + b + "\"");
- }
- }
-
- private static <T> void assertNotSame(T a, T b) {
- if (a != b) {
- throw new SanityCheckFailedException("\"" + a + "\" and \"" + b + "\" are not the same object");
- }
- }
-
- private static void assertTrue(boolean condition) {
- if (!condition) {
- throw new SanityCheckFailedException("The condition is false");
- }
- }
-
- private static void assertFalse(boolean condition) {
- if (condition) {
- throw new SanityCheckFailedException("The condition is true");
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java b/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java
deleted file mode 100644
index fb4b02a..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextHeaderCodec.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.DateParser;
-import htsjdk.samtools.util.LineReader;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Parser for a SAM text header, and a generator of SAM text header.
- */
-public class SAMTextHeaderCodec {
- private static final String HEADER_LINE_START = "@";
-
- // These attributes are populated when parsing or generating
- private SAMFileHeader mFileHeader;
- private final TextTagCodec mTagCodec = new TextTagCodec();
-
- // These attributes are populated when parsing text
- private String mCurrentLine;
- private LineReader mReader;
- private String mSource;
- private List<SAMSequenceRecord> sequences;
- private List<SAMReadGroupRecord> readGroups;
- // Accumulate header while reading it from input.
- private final StringBuilder textHeader = new StringBuilder();
-
- // For error reporting when parsing
- private ValidationStringency validationStringency = ValidationStringency.SILENT;
-
- // These attributes are populated when generating text
- private BufferedWriter writer;
-
- private static final String TAG_KEY_VALUE_SEPARATOR = ":";
- private static final char TAG_KEY_VALUE_SEPARATOR_CHAR = ':';
- private static final String FIELD_SEPARATOR = "\t";
- private static final char FIELD_SEPARATOR_CHAR = '\t';
- private static final Pattern FIELD_SEPARATOR_RE = Pattern.compile(FIELD_SEPARATOR);
-
- public static final String COMMENT_PREFIX = HEADER_LINE_START + HeaderRecordType.CO.name() + FIELD_SEPARATOR;
-
- void setWriter(final BufferedWriter writer) {
- this.writer = writer;
- }
-
- void setmFileHeader(final SAMFileHeader header) {
- this.mFileHeader = header;
- }
-
- /**
- * Reads text SAM header and converts to a SAMFileHeader object.
- * @param reader Where to get header text from.
- * @param source Name of the input file, for error messages. May be null.
- * @return complete header object.
- */
- public SAMFileHeader decode(final LineReader reader, final String source) {
- mFileHeader = new SAMFileHeader();
- mReader = reader;
- mSource = source;
- sequences = new ArrayList<>();
- readGroups = new ArrayList<>();
-
- while (advanceLine() != null) {
- final ParsedHeaderLine parsedHeaderLine = new ParsedHeaderLine(mCurrentLine);
- if (!parsedHeaderLine.isLineValid()) {
- continue;
- }
- switch (parsedHeaderLine.getHeaderRecordType()) {
-
- case HD:
- parseHDLine(parsedHeaderLine);
- break;
- case PG:
- parsePGLine(parsedHeaderLine);
- break;
- case RG:
- parseRGLine(parsedHeaderLine);
- break;
- case SQ:
- parseSQLine(parsedHeaderLine);
- break;
- case CO:
- mFileHeader.addComment(mCurrentLine);
- break;
- default:
- throw new IllegalStateException("Unrecognized header record type: " +
- parsedHeaderLine.getHeaderRecordType());
- }
- }
- mFileHeader.setSequenceDictionary(new SAMSequenceDictionary(sequences));
- mFileHeader.setReadGroups(readGroups);
-
- // Only store the header text if there was a parsing error or the it's less than 1MB on disk / 2MB in mem
- if (!mFileHeader.getValidationErrors().isEmpty() || textHeader.length() < (1024 * 1024)) {
- mFileHeader.setTextHeader(textHeader.toString());
- }
-
- SAMUtils.processValidationErrors(mFileHeader.getValidationErrors(), -1, validationStringency);
- return mFileHeader;
- }
-
- private String advanceLine() {
- final int nextChar = mReader.peek();
- if (nextChar != '@') {
- return null;
- }
- mCurrentLine = mReader.readLine();
- textHeader.append(mCurrentLine).append('\n');
- return mCurrentLine;
- }
-
- /**
- * Transfer standard and non-standard tags from text representation to in-memory representation.
- * All values are now stored as Strings.
- * @param record attributes get set into this object.
- * @param textAttributes Map of tag type to value. Some values may be removed by this method.
- */
- private void transferAttributes(final AbstractSAMHeaderRecord record, final Map<String, String> textAttributes) {
- // All header tags are now of type String, so no need to distinguish standard from non-standard.
- for (final Map.Entry<String, String> entry : textAttributes.entrySet()) {
- record.setAttribute(entry.getKey(), entry.getValue());
- }
-
- }
-
- private void parsePGLine(final ParsedHeaderLine parsedHeaderLine) {
- assert(HeaderRecordType.PG.equals(parsedHeaderLine.getHeaderRecordType()));
- if (!parsedHeaderLine.requireTag(SAMProgramRecord.PROGRAM_GROUP_ID_TAG)) {
- return;
- }
- final SAMProgramRecord programRecord = new SAMProgramRecord(parsedHeaderLine.removeValue(SAMProgramRecord.PROGRAM_GROUP_ID_TAG));
-
- transferAttributes(programRecord, parsedHeaderLine.mKeyValuePairs);
- mFileHeader.addProgramRecord(programRecord);
- }
-
- private void parseRGLine(final ParsedHeaderLine parsedHeaderLine) {
- assert(HeaderRecordType.RG.equals(parsedHeaderLine.getHeaderRecordType()));
- if (!parsedHeaderLine.requireTag(SAMReadGroupRecord.READ_GROUP_ID_TAG)) {
- return;
- }
- // Allow no SM tag if validation stringency is not strict. This call has the side effect of reporting an error
- // or throwing an exception depending on validation stringency if this is missing.
- parsedHeaderLine.requireTag(SAMReadGroupRecord.READ_GROUP_SAMPLE_TAG);
- final SAMReadGroupRecord samReadGroupRecord = new SAMReadGroupRecord(parsedHeaderLine.removeValue(SAMReadGroupRecord.READ_GROUP_ID_TAG));
- transferAttributes(samReadGroupRecord, parsedHeaderLine.mKeyValuePairs);
-
- // Convert non-String attributes to the appropriate types
- final String predictedMedianInsertSize =
- (String)samReadGroupRecord.getAttribute(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG);
- if (predictedMedianInsertSize != null) {
- try {
- Integer.parseInt(predictedMedianInsertSize);
- samReadGroupRecord.setAttribute(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG,predictedMedianInsertSize);
- } catch (NumberFormatException e) {
- reportErrorParsingLine(SAMReadGroupRecord.PREDICTED_MEDIAN_INSERT_SIZE_TAG +
- " is not numeric: " + predictedMedianInsertSize, SAMValidationError.Type.INVALID_PREDICTED_MEDIAN_INSERT_SIZE,
- e);
- }
- }
-
- final String dateRunProduced = (String)samReadGroupRecord.getAttribute(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG);
- if (dateRunProduced != null) {
- Object date;
- try {
- date = mTagCodec.decodeDate(dateRunProduced);
- } catch (DateParser.InvalidDateException e) {
- // Can't convert date string into Date object. Treat it as a string if validation
- // stringency allows it.
- date = dateRunProduced;
- reportErrorParsingLine(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG + " tag value '" +
- dateRunProduced + "' is not parseable as a date", SAMValidationError.Type.INVALID_DATE_STRING,
- e);
- }
- samReadGroupRecord.setAttribute(SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG, date.toString());
- }
-
- readGroups.add(samReadGroupRecord);
- }
-
- private void parseSQLine(final ParsedHeaderLine parsedHeaderLine) {
- assert(HeaderRecordType.SQ.equals(parsedHeaderLine.getHeaderRecordType()));
- if (!parsedHeaderLine.requireTag(SAMSequenceRecord.SEQUENCE_NAME_TAG) ||
- !parsedHeaderLine.requireTag(SAMSequenceRecord.SEQUENCE_LENGTH_TAG)) {
- return;
- }
- String sequenceName = parsedHeaderLine.removeValue(SAMSequenceRecord.SEQUENCE_NAME_TAG);
- sequenceName = SAMSequenceRecord.truncateSequenceName(sequenceName);
- final SAMSequenceRecord samSequenceRecord = new SAMSequenceRecord(sequenceName,
- Integer.parseInt(parsedHeaderLine.removeValue(SAMSequenceRecord.SEQUENCE_LENGTH_TAG)));
- transferAttributes(samSequenceRecord, parsedHeaderLine.mKeyValuePairs);
- sequences.add(samSequenceRecord);
- }
-
- private void parseHDLine(final ParsedHeaderLine parsedHeaderLine) {
- assert(HeaderRecordType.HD.equals(parsedHeaderLine.getHeaderRecordType()));
- if (!parsedHeaderLine.requireTag(SAMFileHeader.VERSION_TAG)) {
- return;
- }
- transferAttributes(mFileHeader, parsedHeaderLine.mKeyValuePairs);
- }
-
- private void reportErrorParsingLine(String reason, final SAMValidationError.Type type, final Throwable nestedException) {
- reason = "Error parsing SAM header. " + reason + ". Line:\n" + mCurrentLine;
- if (validationStringency != ValidationStringency.STRICT) {
- final SAMValidationError error = new SAMValidationError(type, reason, null, mReader.getLineNumber());
- error.setSource(mSource);
- mFileHeader.addValidationError(error);
- } else {
- String fileMessage = "";
- if (mSource != null) {
- fileMessage = "File " + mSource;
- }
- throw new SAMFormatException(reason + "; " + fileMessage +
- "; Line number " + mReader.getLineNumber(), nestedException);
- }
- }
-
- private enum HeaderRecordType {
- HD, SQ, RG, PG, CO
- }
-
- /**
- * Takes a header line as a String and converts it into a HeaderRecordType, and a map of key:value strings.
- * If the line does not contain a recognized HeaderRecordType, then the line is considered invalid, and will
- * not have any key:value pairs.
- */
- private class ParsedHeaderLine {
- private HeaderRecordType mHeaderRecordType;
- private final Map<String, String> mKeyValuePairs = new LinkedHashMap<String, String>();
- private boolean lineValid = false;
-
- ParsedHeaderLine(final String line) {
- assert(line.startsWith(HEADER_LINE_START));
-
- // Tab-separate
- String[] fields = new String[1024];
- int numFields = StringUtil.split(line, fields, FIELD_SEPARATOR_CHAR);
- if (numFields == fields.length) {
- // Lots of fields, so fall back
- fields = FIELD_SEPARATOR_RE.split(line);
- numFields = fields.length;
- }
-
- // Parse the HeaderRecordType
- try {
- mHeaderRecordType = HeaderRecordType.valueOf(fields[0].substring(1));
- } catch (IllegalArgumentException e) {
- reportErrorParsingLine("Unrecognized header record type", SAMValidationError.Type.UNRECOGNIZED_HEADER_TYPE, null);
- mHeaderRecordType = null;
- return;
- }
-
- // Do not parse key:value pairs for comment lines.
- if (mHeaderRecordType == HeaderRecordType.CO) {
- lineValid = true;
- return;
- }
-
- final String[] keyAndValue = new String[2];
- // Parse they key:value pairs
- for (int i = 1; i < numFields; ++i) {
- if (StringUtil.splitConcatenateExcessTokens(fields[i], keyAndValue, TAG_KEY_VALUE_SEPARATOR_CHAR) != 2) {
- reportErrorParsingLine("Problem parsing " + HEADER_LINE_START + mHeaderRecordType +
- " key:value pair", SAMValidationError.Type.POORLY_FORMATTED_HEADER_TAG, null);
- continue;
- }
- if (mKeyValuePairs.containsKey(keyAndValue[0]) &&
- ! mKeyValuePairs.get(keyAndValue[0]).equals(keyAndValue[1])) {
- reportErrorParsingLine("Problem parsing " + HEADER_LINE_START + mHeaderRecordType +
- " key:value pair " + keyAndValue[0] + ":" + keyAndValue[1] +
- " clashes with " + keyAndValue[0] + ":" + mKeyValuePairs.get(keyAndValue[0]),
- SAMValidationError.Type.HEADER_TAG_MULTIPLY_DEFINED, null);
- continue;
- }
- mKeyValuePairs.put(keyAndValue[0], keyAndValue[1]);
- }
- lineValid = true;
- }
-
- /**
- * True if the line is recognized as one of the valid HeaderRecordTypes.
- */
- public boolean isLineValid() {
- return lineValid;
- }
-
- /**
- * Handling depends on the validation stringency. If the tag is not present, and stringency is strict,
- * an exception is thrown. If stringency is not strict, false is returned.
- * @param tag Must be present for the line to be considered value.
- * @return True if tag is present.
- */
- boolean requireTag(final String tag) {
- if (!mKeyValuePairs.containsKey(tag)) {
- reportErrorParsingLine(HEADER_LINE_START + mHeaderRecordType + " line missing " + tag + " tag",
- SAMValidationError.Type.HEADER_RECORD_MISSING_REQUIRED_TAG, null);
- return false;
- }
- return true;
- }
-
- /**
- * @return null if line is invalid, otherwise the parsed HeaderRecordType
- */
- public HeaderRecordType getHeaderRecordType() {
- return mHeaderRecordType;
- }
-
- boolean containsKey(final String key) {
- return mKeyValuePairs.containsKey(key);
- }
-
- String getValue(final String key) {
- return mKeyValuePairs.get(key);
- }
-
- String removeValue(final String key) {
- final String ret = mKeyValuePairs.get(key);
- mKeyValuePairs.remove(key);
- return ret;
- }
-
- }
-
- /**
- * Convert SAMFileHeader from in-memory representation to text representation. Always writes
- * SAMFileHeader.CURRENT_VERSION as the version in the header.
- * @param writer where to write the header text.
- * @param header object to be converted to text.
- */
- public void encode(final Writer writer, final SAMFileHeader header) {
- encode(writer, header, false);
- }
-
- /**
- * Convert SAMFileHeader from in-memory representation to text representation.
- * @param writer where to write the header text.
- * @param header object to be converted to text.
- * @param keepExistingVersionNumber If true, writes whatever version # was in the header. If false, writes
- * SAMFileHeader.CURRENT_VERSION.
- */
- public void encode(final Writer writer, final SAMFileHeader header, final boolean keepExistingVersionNumber) {
- mFileHeader = header;
- this.writer = new BufferedWriter(writer);
- writeHDLine(keepExistingVersionNumber);
- for (final SAMSequenceRecord sequenceRecord: header.getSequenceDictionary().getSequences()) {
- writeSQLine(sequenceRecord);
- }
-
- for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
- writeRGLine(readGroup);
- }
- for (final SAMProgramRecord programRecord : header.getProgramRecords()) {
- writePGLine(programRecord);
- }
- for (final String comment : header.getComments()) {
- println(comment);
- }
- try {
- this.writer.flush();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Encode {@link SAMSequenceRecord}.
- * Designed for using in {@link SAMSequenceDictionaryCodec}, allows to implement recording on the fly.
- * @throws IllegalStateException, if writer is null.
- */
- void encodeSequenceRecord(final SAMSequenceRecord sequenceRecord) {
- if (writer == null) {
- throw new IllegalStateException("writer couldn't be null");
- }
- writeSQLine(sequenceRecord);
- }
-
- /**
- * Encode HD line.
- * Designed for using in {@link SAMSequenceDictionaryCodec}, allows to implement recording on the fly.
- * @throws IllegalStateException, if writer is null.
- */
- void encodeHeaderLine(final boolean keepExistingVersionNumber) {
- if (writer == null) {
- throw new IllegalStateException("writer couldn't be null");
- }
- writeHDLine(keepExistingVersionNumber);
- }
-
- private void println(final String s) {
- try {
- writer.append(s);
- writer.append("\n");
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- private void writePGLine(final SAMProgramRecord programRecord) {
- if (programRecord == null) {
- return;
- }
- final String[] fields = new String[2 + programRecord.getAttributes().size()];
- fields[0] = HEADER_LINE_START + HeaderRecordType.PG;
- fields[1] = SAMProgramRecord.PROGRAM_GROUP_ID_TAG + TAG_KEY_VALUE_SEPARATOR + programRecord.getProgramGroupId();
- encodeTags(programRecord, fields, 2);
- println(StringUtil.join(FIELD_SEPARATOR, fields));
- }
-
- private void writeRGLine(final SAMReadGroupRecord readGroup) {
- final String[] fields = new String[2 + readGroup.getAttributes().size()];
- fields[0] = HEADER_LINE_START + HeaderRecordType.RG;
- fields[1] = SAMReadGroupRecord.READ_GROUP_ID_TAG + TAG_KEY_VALUE_SEPARATOR + readGroup.getReadGroupId();
- encodeTags(readGroup, fields, 2);
- println(StringUtil.join(FIELD_SEPARATOR, fields));
- }
-
- private void writeHDLine(final boolean keepExistingVersionNumber) {
- final SAMFileHeader newHeader;
- if (keepExistingVersionNumber) {
- newHeader = mFileHeader;
- } else {
- // Make a copy of the header, excluding the version from the input header, so that
- // output get CURRENT_VERSION instead of whatever the version of the input header was.
- newHeader = new SAMFileHeader();
-
- for (final Map.Entry<String, String> entry : mFileHeader.getAttributes()) {
- if (!entry.getKey().equals(SAMFileHeader.VERSION_TAG)) {
- newHeader.setAttribute(entry.getKey(), entry.getValue());
- }
- }
- }
-
- final String[] fields = new String[1 + newHeader.getAttributes().size()];
- fields[0] = HEADER_LINE_START + HeaderRecordType.HD;
- encodeTags(newHeader, fields, 1);
- println(StringUtil.join(FIELD_SEPARATOR, fields));
- }
-
- private void writeSQLine(final SAMSequenceRecord sequenceRecord) {
- final int numAttributes = sequenceRecord.getAttributes() != null ? sequenceRecord.getAttributes().size() : 0;
- final String[] fields = new String[3 + numAttributes];
- fields[0] = HEADER_LINE_START + HeaderRecordType.SQ;
- fields[1] = SAMSequenceRecord.SEQUENCE_NAME_TAG + TAG_KEY_VALUE_SEPARATOR + sequenceRecord.getSequenceName();
- fields[2] = SAMSequenceRecord.SEQUENCE_LENGTH_TAG + TAG_KEY_VALUE_SEPARATOR + Integer.toString(sequenceRecord.getSequenceLength());
- encodeTags(sequenceRecord, fields, 3);
- println(StringUtil.join(FIELD_SEPARATOR, fields));
- }
-
- /**
- * Encode all the attributes in the given object as text
- * @param rec object containing attributes, and knowledge of which are standard tags
- * @param fields where to put the text representation of the tags. Must be big enough to hold all tags.
- * @param offset where to start putting text tag representations.
- */
- private void encodeTags(final AbstractSAMHeaderRecord rec, final String[] fields, int offset) {
- for (final Map.Entry<String, String> entry: rec.getAttributes()) {
- fields[offset++] = mTagCodec.encodeUntypedTag(entry.getKey(), entry.getValue());
- }
- }
-
- public void setValidationStringency(final ValidationStringency validationStringency) {
- if (validationStringency == null) {
- throw new IllegalArgumentException("null validationStringency not allowed");
- }
- this.validationStringency = validationStringency;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTextReader.java b/src/main/java/htsjdk/samtools/SAMTextReader.java
deleted file mode 100644
index 3968f1c..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextReader.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.File;
-import java.io.InputStream;
-
-
-/**
- * Internal class for reading SAM text files.
- */
-class SAMTextReader extends SamReader.ReaderImplementation {
-
-
- private SAMRecordFactory samRecordFactory;
- private BufferedLineReader mReader;
- private SAMFileHeader mFileHeader = null;
- private String mCurrentLine = null;
- private RecordIterator mIterator = null;
- private File mFile = null;
-
- private ValidationStringency validationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-
- /**
- * Add information about the origin (reader and position) to SAM records.
- */
- private SamReader mParentReader;
-
- /**
- * Prepare to read a SAM text file.
- *
- * @param stream Need not be buffered, as this class provides buffered reading.
- */
- public SAMTextReader(final InputStream stream, final ValidationStringency validationStringency, final SAMRecordFactory factory) {
- mReader = new BufferedLineReader(stream);
- this.validationStringency = validationStringency;
- this.samRecordFactory = factory;
- readHeader();
- }
-
- /**
- * Prepare to read a SAM text file.
- *
- * @param stream Need not be buffered, as this class provides buffered reading.
- * @param file For error reporting only.
- */
- public SAMTextReader(final InputStream stream, final File file, final ValidationStringency validationStringency, final SAMRecordFactory factory) {
- this(stream, validationStringency, factory);
- mFile = file;
- }
-
- /**
- * If true, writes the source of every read into the source SAMRecords.
- *
- * @param enabled true to write source information into each SAMRecord.
- */
- public void enableFileSource(final SamReader reader, final boolean enabled) {
- this.mParentReader = enabled ? reader : null;
- }
-
- void enableIndexCaching(final boolean enabled) {
- throw new UnsupportedOperationException("Cannot enable index caching for a SAM text reader");
- }
-
- void enableIndexMemoryMapping(final boolean enabled) {
- throw new UnsupportedOperationException("Cannot enable index memory mapping for a SAM text reader");
- }
-
- void enableCrcChecking(final boolean enabled) {
- // Do nothing - this has no meaning for SAM reading
- }
-
- void setSAMRecordFactory(final SAMRecordFactory factory) {
- this.samRecordFactory = factory;
- }
-
- @Override
- public SamReader.Type type() {
- return SamReader.Type.SAM_TYPE;
- }
-
- public boolean hasIndex() {
- return false;
- }
-
- public BAMIndex getIndex() {
- throw new UnsupportedOperationException();
- }
-
- public void close() {
- if (mReader != null) {
- try {
- mReader.close();
- } finally {
- mReader = null;
- }
- }
- }
-
- public SAMFileHeader getFileHeader() {
- return mFileHeader;
- }
-
- public ValidationStringency getValidationStringency() {
- return validationStringency;
- }
-
- public void setValidationStringency(final ValidationStringency stringency) {
- this.validationStringency = stringency;
- }
-
- /**
- * There can only be one extant iterator on a SAMTextReader at a time. The previous one must
- * be closed before calling getIterator(). Because the input stream is not seekable, a subsequent
- * call to getIterator() returns an iterator that starts where the last one left off.
- *
- * @return Iterator of SAMRecords in file order.
- */
- public CloseableIterator<SAMRecord> getIterator() {
- if (mReader == null) {
- throw new IllegalStateException("File reader is closed");
- }
- if (mIterator != null) {
- throw new IllegalStateException("Iteration in progress");
- }
- mIterator = new RecordIterator();
- return mIterator;
- }
-
- /**
- * Generally loads data at a given point in the file. Unsupported for SAMTextReaders.
- *
- * @param fileSpan The file span.
- * @return An iterator over the given file span.
- */
- public CloseableIterator<SAMRecord> getIterator(final SAMFileSpan fileSpan) {
- throw new UnsupportedOperationException("Cannot directly iterate over regions within SAM text files.");
- }
-
- /**
- * Generally gets a pointer to the first read in the file. Unsupported for SAMTextReaders.
- *
- * @return An pointer to the first read in the file.
- */
- public SAMFileSpan getFilePointerSpanningReads() {
- throw new UnsupportedOperationException("Cannot retrieve file pointers within SAM text files.");
- }
-
- /**
- * Unsupported for SAM text files.
- */
- public CloseableIterator<SAMRecord> query(final String sequence, final int start, final int end, final boolean contained) {
- throw new UnsupportedOperationException("Cannot query SAM text files");
- }
-
- @Override
- public CloseableIterator<SAMRecord> query(final QueryInterval[] intervals, final boolean contained) {
- throw new UnsupportedOperationException("Cannot query SAM text files");
- }
-
- /**
- * Unsupported for SAM text files.
- */
- public CloseableIterator<SAMRecord> queryAlignmentStart(final String sequence, final int start) {
- throw new UnsupportedOperationException("Cannot query SAM text files");
- }
-
- public CloseableIterator<SAMRecord> queryUnmapped() {
- throw new UnsupportedOperationException("Cannot query SAM text files");
- }
-
- private void readHeader() {
- final SAMTextHeaderCodec headerCodec = new SAMTextHeaderCodec();
- headerCodec.setValidationStringency(validationStringency);
- mFileHeader = headerCodec.decode(mReader, (mFile != null ? mFile.toString() : null));
- advanceLine();
- }
-
- private String advanceLine() {
- mCurrentLine = mReader.readLine();
- return mCurrentLine;
- }
-
- /**
- * SAMRecord iterator for SAMTextReader
- */
- private class RecordIterator implements CloseableIterator<SAMRecord> {
-
- private final SAMLineParser parser = new SAMLineParser(samRecordFactory, validationStringency,
- mFileHeader, mParentReader, mFile);
-
- private RecordIterator() {
- if (mReader == null) {
- throw new IllegalStateException("Reader is closed.");
- }
- }
-
- public void close() {
- SAMTextReader.this.close();
- }
-
- public boolean hasNext() {
- return mCurrentLine != null;
- }
-
- public SAMRecord next() {
- if (!hasNext()) {
- throw new IllegalStateException("Cannot call next() on exhausted iterator");
- }
- try {
- return parseLine();
- } finally {
- advanceLine();
- }
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Not supported: remove");
- }
-
- private SAMRecord parseLine() {
-
- return parser.parseLine(mCurrentLine, mReader.getLineNumber());
- }
-
- }
-}
-
diff --git a/src/main/java/htsjdk/samtools/SAMTextWriter.java b/src/main/java/htsjdk/samtools/SAMTextWriter.java
deleted file mode 100644
index 0786d67..0000000
--- a/src/main/java/htsjdk/samtools/SAMTextWriter.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.AsciiWriter;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Writer for text-format SAM files.
- */
-public class SAMTextWriter extends SAMFileWriterImpl {
- private static final String FIELD_SEPARATOR = "\t";
-
- private final Writer out;
- // For error reporting only.
- private final File file;
- private final TextTagCodec tagCodec = new TextTagCodec();
- private final SAMTagUtil tagUtil = new SAMTagUtil();
-
- private final SamFlagField samFlagFieldOutput;
-
- /**
- * Constructs a SAMTextWriter that outputs to a Writer.
- * @param out Writer.
- */
- public SAMTextWriter(final Writer out) {
- this(out, SamFlagField.DECIMAL);
- }
-
- /**
- * Constructs a SAMTextWriter that writes to a File.
- * @param file Where to write the output.
- */
- public SAMTextWriter(final File file) {
- this(file, SamFlagField.DECIMAL);
- }
-
- /**
- * Returns the Writer used by this instance. Useful for flushing the output.
- */
- public Writer getWriter() {
- return out;
- }
-
- /**
- * Constructs a SAMTextWriter that writes to an OutputStream. The OutputStream
- * is wrapped in an AsciiWriter, which can be retrieved with getWriter().
- * @param stream Need not be buffered because this class provides buffering.
- */
- public SAMTextWriter(final OutputStream stream) {
- this(stream, SamFlagField.DECIMAL);
- }
-
- /**
- * Constructs a SAMTextWriter that outputs to a Writer.
- * @param out Writer.
- */
- public SAMTextWriter(final Writer out, final SamFlagField samFlagFieldOutput) {
- if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
- this.out = out;
- this.file = null;
- this.samFlagFieldOutput = samFlagFieldOutput;
- }
-
- /**
- * Constructs a SAMTextWriter that writes to a File.
- * @param file Where to write the output.
- */
- public SAMTextWriter(final File file, final SamFlagField samFlagFieldOutput) {
- if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
- try {
- this.file = file;
- this.out = new AsciiWriter(new FileOutputStream(file));
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- this.samFlagFieldOutput = samFlagFieldOutput;
- }
-
- /**
- * Constructs a SAMTextWriter that writes to an OutputStream. The OutputStream
- * is wrapped in an AsciiWriter, which can be retrieved with getWriter().
- * @param stream Need not be buffered because this class provides buffering.
- */
- public SAMTextWriter(final OutputStream stream, final SamFlagField samFlagFieldOutput) {
- if (samFlagFieldOutput == null) throw new IllegalArgumentException("Sam flag field was null");
- this.file = null;
- this.out = new AsciiWriter(stream);
- this.samFlagFieldOutput = samFlagFieldOutput;
- }
-
- /**
- * Write the record.
- *
- * @param alignment SAMRecord.
- */
- public void writeAlignment(final SAMRecord alignment) {
- try {
- out.write(alignment.getReadName());
- out.write(FIELD_SEPARATOR);
- out.write(this.samFlagFieldOutput.format(alignment.getFlags()));
- out.write(FIELD_SEPARATOR);
- out.write(alignment.getReferenceName());
- out.write(FIELD_SEPARATOR);
- out.write(Integer.toString(alignment.getAlignmentStart()));
- out.write(FIELD_SEPARATOR);
- out.write(Integer.toString(alignment.getMappingQuality()));
- out.write(FIELD_SEPARATOR);
- out.write(alignment.getCigarString());
- out.write(FIELD_SEPARATOR);
-
- // == is OK here because these strings are interned
- if (alignment.getReferenceName() == alignment.getMateReferenceName() &&
- SAMRecord.NO_ALIGNMENT_REFERENCE_NAME != alignment.getReferenceName()) {
- out.write("=");
- } else {
- out.write(alignment.getMateReferenceName());
- }
- out.write(FIELD_SEPARATOR);
- out.write(Integer.toString(alignment.getMateAlignmentStart()));
- out.write(FIELD_SEPARATOR);
- out.write(Integer.toString(alignment.getInferredInsertSize()));
- out.write(FIELD_SEPARATOR);
- out.write(alignment.getReadString());
- out.write(FIELD_SEPARATOR);
- out.write(alignment.getBaseQualityString());
- SAMBinaryTagAndValue attribute = alignment.getBinaryAttributes();
- while (attribute != null) {
- out.write(FIELD_SEPARATOR);
- final String encodedTag;
- if (attribute.isUnsignedArray()) {
- encodedTag = tagCodec.encodeUnsignedArray(tagUtil.makeStringTag(attribute.tag), attribute.value);
- } else {
- encodedTag = tagCodec.encode(tagUtil.makeStringTag(attribute.tag), attribute.value);
- }
- out.write(encodedTag);
- attribute = attribute.getNext();
- }
- out.write("\n");
-
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /* This method is called by SAMRecord.getSAMString(). */
- private static SAMTextWriter textWriter = null;
- private static StringWriter stringWriter = null;
- static synchronized String getSAMString(final SAMRecord alignment) {
- if (stringWriter == null) stringWriter = new StringWriter();
- if (textWriter == null) textWriter = new SAMTextWriter(stringWriter);
- stringWriter.getBuffer().setLength(0);
- textWriter.writeAlignment(alignment);
- return stringWriter.toString();
- }
-
- /**
- * Write the header text. This method can also be used to write
- * an arbitrary String, not necessarily the header.
- *
- * @param textHeader String containing the text to write.
- */
- public void writeHeader(final String textHeader) {
- try {
- out.write(textHeader);
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Do any required flushing here.
- */
- public void finish() {
- try {
- out.close();
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * For producing error messages.
- *
- * @return Output filename, or null if there isn't one.
- */
- public String getFilename() {
- if (file == null) {
- return null;
- }
- return file.getAbsolutePath();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMTools.java b/src/main/java/htsjdk/samtools/SAMTools.java
deleted file mode 100644
index 551f846..0000000
--- a/src/main/java/htsjdk/samtools/SAMTools.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.File;
-
-
-/**
- * Command line utility for manipulating SAM/BAM files.
- */
-public class SAMTools {
- private String mCommand = null;
- private File mInputFile = null;
-
-
- public static void main(final String[] args)
- throws Exception {
- final int status = new SAMTools().run(args);
- if (status != 0) {
- System.exit(status);
- }
- }
-
- private SAMTools() {
- }
-
- private void usage() {
- System.out.println();
- System.out.println("SAMTools version 0.1.0");
- System.out.println("Tools for manipulating SAM/BAM files");
- System.out.println();
- System.out.println("Usage: SAMTools <command> <options...>");
- System.out.println();
- System.out.println("Commands:");
- System.out.println(" help");
- System.out.println(" view <file>");
- System.out.println();
- }
-
- private boolean parseArguments(final String[] args) {
- if (args.length == 0) {
- usage();
- return true;
- }
- final String command = args[0];
- final int argpos = 1;
- final int argcount = args.length - argpos;
- if (command.equals("help")) {
- usage();
- return true;
- } else if (command.equals("view")) {
- if (argcount != 1) {
- usage();
- return false;
- }
- mInputFile = new File(args[1]);
- if (!mInputFile.exists()) {
- System.out.println("Input file not found: " + mInputFile);
- return false;
- }
- } else {
- System.out.println("Unrecognized command: " + command);
- System.out.println();
- usage();
- return false;
- }
- mCommand = command;
- return true;
- }
-
- private int run(final String[] args)
- throws Exception {
- if (!parseArguments(args)) {
- return 1;
- }
- if (mCommand == null) {
- return 0;
- }
- if (mCommand.equals("view")) {
- return runView();
- }
- return 1;
- }
-
- private int runView() {
- final SamReader reader = SamReaderFactory.makeDefault().open(mInputFile);
- final CloseableIterator<SAMRecord> iterator = reader.iterator();
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- System.out.println(record.getSAMString());
- }
- iterator.close();
- return 0;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMUtils.java b/src/main/java/htsjdk/samtools/SAMUtils.java
deleted file mode 100644
index 25b6799..0000000
--- a/src/main/java/htsjdk/samtools/SAMUtils.java
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.CigarUtil;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.RuntimeEOFException;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-
-
-/**
- * Utilty methods.
- */
-public final class SAMUtils {
- /** regex for semicolon, used in {@link SAMUtils#getOtherCanonicalAlignments(SAMRecord)} */
- private static final Pattern SEMICOLON_PAT = Pattern.compile("[;]");
- /** regex for comma, used in {@link SAMUtils#getOtherCanonicalAlignments(SAMRecord)} */
- private static final Pattern COMMA_PAT = Pattern.compile("[,]");
-
- // Representation of bases, one for when in low-order nybble, one for when in high-order nybble.
- private static final byte COMPRESSED_EQUAL_LOW = 0;
- private static final byte COMPRESSED_A_LOW = 1;
- private static final byte COMPRESSED_C_LOW = 2;
- private static final byte COMPRESSED_M_LOW = 3;
- private static final byte COMPRESSED_G_LOW = 4;
- private static final byte COMPRESSED_R_LOW = 5;
- private static final byte COMPRESSED_S_LOW = 6;
- private static final byte COMPRESSED_V_LOW = 7;
- private static final byte COMPRESSED_T_LOW = 8;
- private static final byte COMPRESSED_W_LOW = 9;
- private static final byte COMPRESSED_Y_LOW = 10;
- private static final byte COMPRESSED_H_LOW = 11;
- private static final byte COMPRESSED_K_LOW = 12;
- private static final byte COMPRESSED_D_LOW = 13;
- private static final byte COMPRESSED_B_LOW = 14;
- private static final byte COMPRESSED_N_LOW = 15;
- private static final byte COMPRESSED_EQUAL_HIGH = COMPRESSED_EQUAL_LOW << 4;
- private static final byte COMPRESSED_A_HIGH = COMPRESSED_A_LOW << 4;
- private static final byte COMPRESSED_C_HIGH = COMPRESSED_C_LOW << 4;
- private static final byte COMPRESSED_G_HIGH = COMPRESSED_G_LOW << 4;
- private static final byte COMPRESSED_T_HIGH = (byte) (COMPRESSED_T_LOW << 4);
- private static final byte COMPRESSED_N_HIGH = (byte) (COMPRESSED_N_LOW << 4);
-
- private static final byte COMPRESSED_M_HIGH = (byte) (COMPRESSED_M_LOW << 4);
- private static final byte COMPRESSED_R_HIGH = (byte) (COMPRESSED_R_LOW << 4);
- private static final byte COMPRESSED_S_HIGH = (byte) (COMPRESSED_S_LOW << 4);
- private static final byte COMPRESSED_V_HIGH = (byte) (COMPRESSED_V_LOW << 4);
- private static final byte COMPRESSED_W_HIGH = (byte) (COMPRESSED_W_LOW << 4);
- private static final byte COMPRESSED_Y_HIGH = (byte) (COMPRESSED_Y_LOW << 4);
- private static final byte COMPRESSED_H_HIGH = (byte) (COMPRESSED_H_LOW << 4);
- private static final byte COMPRESSED_K_HIGH = (byte) (COMPRESSED_K_LOW << 4);
- private static final byte COMPRESSED_D_HIGH = (byte) (COMPRESSED_D_LOW << 4);
- private static final byte COMPRESSED_B_HIGH = (byte) (COMPRESSED_B_LOW << 4);
-
- private static final byte [] COMPRESSED_LOOKUP_TABLE =
- new byte[]{
- '=',
- 'A',
- 'C',
- 'M',
- 'G',
- 'R',
- 'S',
- 'V',
- 'T',
- 'W',
- 'Y',
- 'H',
- 'K',
- 'D',
- 'B',
- 'N'
- };
-
- public static final int MAX_PHRED_SCORE = 93;
-
- /**
- * Convert from a byte array containing =AaCcGgTtNn represented as ASCII, to a byte array half as long,
- * with =, A, C, G, T converted to 0, 1, 2, 4, 8, 15.
- *
- * @param readBases Bases as ASCII bytes.
- * @return New byte array with bases represented as nybbles, in BAM binary format.
- */
- static byte[] bytesToCompressedBases(final byte[] readBases) {
- final byte[] compressedBases = new byte[(readBases.length + 1) / 2];
- int i;
- for (i = 1; i < readBases.length; i += 2) {
- compressedBases[i / 2] = (byte) (charToCompressedBaseHigh(readBases[i - 1]) |
- charToCompressedBaseLow(readBases[i]));
- }
- // Last nybble
- if (i == readBases.length) {
- compressedBases[i / 2] = charToCompressedBaseHigh((char) readBases[i - 1]);
- }
- return compressedBases;
- }
-
- /**
- * Convert from a byte array with basese stored in nybbles, with =, A, C, G, T represented as 0, 1, 2, 4, 8, 15,
- * to a a byte array containing =AaCcGgTtNn represented as ASCII.
- *
- * @param length Number of bases (not bytes) to convert.
- * @param compressedBases Bases represented as nybbles, in BAM binary format.
- * @param compressedOffset Byte offset in compressedBases to start.
- * @return New byte array with bases as ASCII bytes.
- */
- public static byte[] compressedBasesToBytes(final int length, final byte[] compressedBases, final int compressedOffset) {
- final byte[] ret = new byte[length];
- int i;
- for (i = 1; i < length; i += 2) {
- final int compressedIndex = i / 2 + compressedOffset;
- ret[i - 1] = compressedBaseToByteHigh(compressedBases[compressedIndex]);
- ret[i] = compressedBaseToByteLow(compressedBases[compressedIndex]);
- }
- // Last nybble
- if (i == length) {
- ret[i - 1] = compressedBaseToByteHigh(compressedBases[i / 2 + compressedOffset]);
- }
- return ret;
- }
-
- /**
- * Convert from ASCII byte to BAM nybble representation of a base in low-order nybble.
- *
- * @param base One of =AaCcGgTtNn.
- * @return Low-order nybble-encoded equivalent.
- */
- private static byte charToCompressedBaseLow(final int base) {
- switch (base) {
- case '=':
- return COMPRESSED_EQUAL_LOW;
- case 'a':
- case 'A':
- return COMPRESSED_A_LOW;
- case 'c':
- case 'C':
- return COMPRESSED_C_LOW;
- case 'g':
- case 'G':
- return COMPRESSED_G_LOW;
- case 't':
- case 'T':
- return COMPRESSED_T_LOW;
- case 'n':
- case 'N':
- case '.':
- return COMPRESSED_N_LOW;
-
- // IUPAC ambiguity codes
- case 'M':
- case 'm':
- return COMPRESSED_M_LOW;
- case 'R':
- case 'r':
- return COMPRESSED_R_LOW;
- case 'S':
- case 's':
- return COMPRESSED_S_LOW;
- case 'V':
- case 'v':
- return COMPRESSED_V_LOW;
- case 'W':
- case 'w':
- return COMPRESSED_W_LOW;
- case 'Y':
- case 'y':
- return COMPRESSED_Y_LOW;
- case 'H':
- case 'h':
- return COMPRESSED_H_LOW;
- case 'K':
- case 'k':
- return COMPRESSED_K_LOW;
- case 'D':
- case 'd':
- return COMPRESSED_D_LOW;
- case 'B':
- case 'b':
- return COMPRESSED_B_LOW;
- default:
- throw new IllegalArgumentException("Bad byte passed to charToCompressedBase: " + base);
- }
- }
-
- /**
- * Convert from ASCII byte to BAM nybble representation of a base in high-order nybble.
- *
- * @param base One of =AaCcGgTtNn.
- * @return High-order nybble-encoded equivalent.
- */
- private static byte charToCompressedBaseHigh(final int base) {
- switch (base) {
- case '=':
- return COMPRESSED_EQUAL_HIGH;
- case 'a':
- case 'A':
- return COMPRESSED_A_HIGH;
- case 'c':
- case 'C':
- return COMPRESSED_C_HIGH;
- case 'g':
- case 'G':
- return COMPRESSED_G_HIGH;
- case 't':
- case 'T':
- return COMPRESSED_T_HIGH;
- case 'n':
- case 'N':
- case '.':
- return COMPRESSED_N_HIGH;
-
- // IUPAC ambiguity codes
- case 'M':
- case 'm':
- return COMPRESSED_M_HIGH;
- case 'R':
- case 'r':
- return COMPRESSED_R_HIGH;
- case 'S':
- case 's':
- return COMPRESSED_S_HIGH;
- case 'V':
- case 'v':
- return COMPRESSED_V_HIGH;
- case 'W':
- case 'w':
- return COMPRESSED_W_HIGH;
- case 'Y':
- case 'y':
- return COMPRESSED_Y_HIGH;
- case 'H':
- case 'h':
- return COMPRESSED_H_HIGH;
- case 'K':
- case 'k':
- return COMPRESSED_K_HIGH;
- case 'D':
- case 'd':
- return COMPRESSED_D_HIGH;
- case 'B':
- case 'b':
- return COMPRESSED_B_HIGH;
- default:
- throw new IllegalArgumentException("Bad byte passed to charToCompressedBase: " + base);
- }
- }
-
- /**
- * Returns the byte corresponding to a certain nybble
- * @param base One of COMPRESSED_*_LOW, a low-order nybble encoded base.
- * @return ASCII base, one of ACGTN=.
- */
- private static byte compressedBaseToByte(byte base){
- try{
- return COMPRESSED_LOOKUP_TABLE[base];
- }catch(IndexOutOfBoundsException e){
- throw new IllegalArgumentException("Bad byte passed to charToCompressedBase: " + base);
- }
- }
-
- /**
- * Convert from BAM nybble representation of a base in low-order nybble to ASCII byte.
- *
- * @param base One of COMPRESSED_*_LOW, a low-order nybble encoded base.
- * @return ASCII base, one of ACGTN=.
- */
- private static byte compressedBaseToByteLow(final int base) {
- return compressedBaseToByte((byte)(base & 0xf));
- }
-
- /**
- * Convert from BAM nybble representation of a base in high-order nybble to ASCII byte.
- *
- * @param base One of COMPRESSED_*_HIGH, a high-order nybble encoded base.
- * @return ASCII base, one of ACGTN=.
- */
- private static byte compressedBaseToByteHigh(final int base) {
- return compressedBaseToByte((byte)((base >> 4) & 0xf));
- }
-
- /**
- * Convert bases in place into canonical form, upper case, and with no-call represented as N.
- *
- * @param bases
- */
- static void normalizeBases(final byte[] bases) {
- for (int i = 0; i < bases.length; ++i) {
- bases[i] = StringUtil.toUpperCase(bases[i]);
- if (bases[i] == '.') {
- bases[i] = 'N';
- }
- }
- }
-
- /**
- * Convert an array of bytes, in which each byte is a binary phred quality score, to
- * printable ASCII representation of the quality scores, ala FASTQ format.
- * <p/>
- * Equivalent to phredToFastq(data, 0, data.length)
- *
- * @param data Array of bytes in which each byte is a binar phred score.
- * @return String with ASCII representation of those quality scores.
- */
- public static String phredToFastq(final byte[] data) {
- if (data == null) {
- return null;
- }
- return phredToFastq(data, 0, data.length);
- }
-
- /**
- * Convert an array of bytes, in which each byte is a binary phred quality score, to
- * printable ASCII representation of the quality scores, ala FASTQ format.
- *
- * @param buffer Array of bytes in which each byte is a binar phred score.
- * @param offset Where in buffer to start conversion.
- * @param length How many bytes of buffer to convert.
- * @return String with ASCII representation of those quality scores.
- */
- public static String phredToFastq(final byte[] buffer, final int offset, final int length) {
- final char[] chars = new char[length];
- for (int i = 0; i < length; i++) {
- chars[i] = phredToFastq(buffer[offset + i] & 0xFF);
- }
- return new String(chars);
- }
-
- /**
- * Convert a single binary phred score to printable ASCII representation, ala FASTQ format.
- *
- * @param phredScore binary phred score.
- * @return Printable ASCII representation of phred score.
- */
- public static char phredToFastq(final int phredScore) {
- if (phredScore < 0 || phredScore > MAX_PHRED_SCORE) {
- throw new IllegalArgumentException("Cannot encode phred score: " + phredScore);
- }
- return (char) (33 + phredScore);
- }
-
- /**
- * Convert a string with phred scores in printable ASCII FASTQ format to an array
- * of binary phred scores.
- *
- * @param fastq Phred scores in FASTQ printable ASCII format.
- * @return byte array of binary phred scores in which each byte corresponds to a character in the input string.
- */
- public static byte[] fastqToPhred(final String fastq) {
- if (fastq == null) {
- return null;
- }
- final int length = fastq.length();
- final byte[] scores = new byte[length];
- for (int i = 0; i < length; i++) {
- scores[i] = (byte) fastqToPhred(fastq.charAt(i));
- }
- return scores;
- }
-
- /**
- * Converts printable qualities in Sanger fastq format to binary phred scores.
- */
- public static void fastqToPhred(final byte[] fastq) {
- for (int i = 0; i < fastq.length; ++i) {
- fastq[i] = (byte) fastqToPhred((char) (fastq[i] & 0xff));
- }
- }
-
- /**
- * Convert a single printable ASCII FASTQ format phred score to binary phred score.
- *
- * @param ch Printable ASCII FASTQ format phred score.
- * @return Binary phred score.
- */
- public static int fastqToPhred(final char ch) {
- if (ch < 33 || ch > 126) {
- throw new IllegalArgumentException("Invalid fastq character: " + ch);
- }
- return (ch - 33);
- }
-
- /**
- * calculate the bin given an alignment in [beg,end)
- * Copied from SAM spec.
- *
- * @param beg 0-based start of read (inclusive)
- * @param end 0-based end of read (exclusive)
- * @deprecated Use {@link GenomicIndexUtil#regionToBin}
- */
- @Deprecated
- static int reg2bin(final int beg, final int end) {
- return GenomicIndexUtil.regionToBin(beg, end);
- }
-
- /**
- * Handle a list of validation errors according to the validation stringency.
- *
- * @param validationErrors List of errors to report, or null if there are no errors.
- * @param samRecordIndex Record number of the SAMRecord corresponding to the validation errors, or -1 if
- * the record number is not known.
- * @param validationStringency If STRICT, throw a SAMFormatException. If LENIENT, print the validation
- * errors to stderr. If SILENT, do nothing.
- */
- public static void processValidationErrors(final List<SAMValidationError> validationErrors,
- final long samRecordIndex,
- final ValidationStringency validationStringency) {
- if (validationErrors != null && !validationErrors.isEmpty()) {
- for (final SAMValidationError validationError : validationErrors) {
- validationError.setRecordNumber(samRecordIndex);
- }
- if (validationStringency == ValidationStringency.STRICT) {
- throw new SAMFormatException("SAM validation error: " + validationErrors.get(0));
- } else if (validationStringency == ValidationStringency.LENIENT) {
- for (final SAMValidationError error : validationErrors) {
- System.err.println("Ignoring SAM validation error: " + error);
- }
- }
- }
- }
-
- public static void processValidationError(final SAMValidationError validationError,
- final ValidationStringency validationStringency) {
- if (validationStringency == ValidationStringency.STRICT) {
- throw new SAMFormatException("SAM validation error: " + validationError);
- } else if (validationStringency == ValidationStringency.LENIENT) {
- System.err.println("Ignoring SAM validation error: " + validationError);
- }
-
- }
-
- private static final SAMHeaderRecordComparator<SAMReadGroupRecord> HEADER_RECORD_COMPARATOR =
- new SAMHeaderRecordComparator<SAMReadGroupRecord>(
- SAMReadGroupRecord.PLATFORM_UNIT_TAG,
- SAMReadGroupRecord.LIBRARY_TAG,
- SAMReadGroupRecord.DATE_RUN_PRODUCED_TAG,
- SAMReadGroupRecord.READ_GROUP_SAMPLE_TAG,
- SAMReadGroupRecord.SEQUENCING_CENTER_TAG,
- SAMReadGroupRecord.PLATFORM_TAG,
- SAMReadGroupRecord.DESCRIPTION_TAG,
- SAMReadGroupRecord.READ_GROUP_ID_TAG // We don't actually want to compare with ID but it's suitable
- // "just in case" since it's the only one that's actually required
- );
-
- /**
- * Calculate a hash code from identifying information in the RG (read group) records in a SAM file's
- * header. This hash code changes any time read groups are added or removed. Comparing one file's
- * hash code to another's tells you if the read groups in the BAM files are different.
- */
- public static String calculateReadGroupRecordChecksum(final File input, final File referenceFasta) {
- final String ENCODING = "UTF-8";
-
- final MessageDigest digest;
- try {
- digest = MessageDigest.getInstance("MD5");
- } catch (final NoSuchAlgorithmException nsae) {
- throw new Error("No MD5 algorithm was available in a Java JDK? Unheard-of!");
- }
-
- // Sort the read group records by their first
- final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(referenceFasta).open(input);
- final List<SAMReadGroupRecord> sortedRecords = new ArrayList<SAMReadGroupRecord>(reader.getFileHeader().getReadGroups());
- Collections.sort(sortedRecords, HEADER_RECORD_COMPARATOR);
-
- for (final SAMReadGroupRecord rgRecord : sortedRecords) {
- final TreeMap<String, String> sortedAttributes = new TreeMap<String, String>();
- for (final Map.Entry<String, String> attributeEntry : rgRecord.getAttributes()) {
- sortedAttributes.put(attributeEntry.getKey(), attributeEntry.getValue());
- }
-
- try {
- for (final Map.Entry<String, String> sortedEntry : sortedAttributes.entrySet()) {
- if (!sortedEntry.getKey().equals(SAMReadGroupRecord.READ_GROUP_ID_TAG)) { // Redundant check, safety first
- digest.update(sortedEntry.getKey().getBytes(ENCODING));
- digest.update(sortedEntry.getValue().getBytes(ENCODING));
- }
- }
- } catch (final UnsupportedEncodingException uee) {
- throw new Error("No " + ENCODING + "!? WTH?");
- }
- }
-
- // Convert to a String and pad to get the full 32 chars.
- final StringBuilder hashText = new StringBuilder((new BigInteger(1, digest.digest())).toString(16));
- while (hashText.length() < 32) hashText.insert(0, "0");
-
- CloserUtil.close(reader);
- return hashText.toString();
- }
-
- /**
- * Chains <code>program</code> in front of the first "head" item in the list of
- * SAMProgramRecords in <code>header</code>. This method should not be used
- * when there are multiple chains of program groups in a header, only when
- * it can safely be assumed that there is only one chain. It correctly handles
- * the case where <code>program</code> has already been added to the header, so
- * it can be used whether creating a SAMProgramRecord with a constructor or when
- * calling SAMFileHeader.createProgramRecord().
- */
- public static void chainSAMProgramRecord(final SAMFileHeader header, final SAMProgramRecord program) {
-
- final List<SAMProgramRecord> pgs = header.getProgramRecords();
- if (!pgs.isEmpty()) {
- final List<String> referencedIds = new ArrayList<String>();
- for (final SAMProgramRecord pg : pgs) {
- if (pg.getPreviousProgramGroupId() != null) {
- referencedIds.add(pg.getPreviousProgramGroupId());
- }
- }
- for (final SAMProgramRecord pg : pgs) {
- // if record being chained has already been added, ignore it
- if (pg.getProgramGroupId().equals(program.getProgramGroupId())) {
- continue;
- }
- if (!referencedIds.contains(pg.getProgramGroupId())) {
- program.setPreviousProgramGroupId(pg.getProgramGroupId());
- break;
- }
- }
- }
- }
-
- /**
- * Strip mapping information from a SAMRecord.
- *
- * WARNING: by clearing the secondary and supplementary flags,
- * this may have the affect of producing multiple distinct records with the
- * same read name and flags, which may lead to invalid SAM/BAM output.
- * Callers of this method should make sure to deal with this issue.
- */
- public static void makeReadUnmapped(final SAMRecord rec) {
- if (rec.getReadNegativeStrandFlag()) {
- SAMRecordUtil.reverseComplement(rec);
- rec.setReadNegativeStrandFlag(false);
- }
- rec.setDuplicateReadFlag(false);
- rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
- rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
- rec.setInferredInsertSize(0);
- rec.setNotPrimaryAlignmentFlag(false);
- rec.setSupplementaryAlignmentFlag(false);
- rec.setProperPairFlag(false);
- rec.setReadUnmappedFlag(true);
- }
-
- /**
- * Strip mapping information from a SAMRecord, but preserve it in the 'O' tags if it isn't already set.
- */
- public static void makeReadUnmappedWithOriginalTags(final SAMRecord rec) {
- if (!hasOriginalMappingInformation(rec)) {
- rec.setAttribute(SAMTag.OP.name(), rec.getAlignmentStart());
- rec.setAttribute(SAMTag.OC.name(), rec.getCigarString());
- rec.setAttribute(SAMTag.OF.name(), rec.getFlags());
- rec.setAttribute(SAMTag.OR.name(), rec.getReferenceName());
- }
- makeReadUnmapped(rec);
- }
-
- /**
- * See if any tags pertaining to original mapping information have been set.
- */
- public static boolean hasOriginalMappingInformation(final SAMRecord rec) {
- return rec.getAttribute(SAMTag.OP.name()) != null
- || rec.getAttribute(SAMTag.OC.name()) != null
- || rec.getAttribute(SAMTag.OF.name()) != null
- || rec.getAttribute(SAMTag.OR.name()) != null;
- }
-
- /**
- * Determines if a cigar has any element that both consumes read bases and consumes reference bases
- * (e.g. is not all soft-clipped)
- */
- public static boolean cigarMapsNoBasesToRef(final Cigar cigar) {
- for (final CigarElement el : cigar.getCigarElements()) {
- if (el.getOperator().consumesReadBases() && el.getOperator().consumesReferenceBases()) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Tests if the provided record is mapped entirely beyond the end of the reference (i.e., the alignment start is greater than the
- * length of the sequence to which the record is mapped).
- * @param record must not have a null SamFileHeader
- */
- public static boolean recordMapsEntirelyBeyondEndOfReference(final SAMRecord record) {
- if (record.getHeader() == null) {
- throw new SAMException("A non-null SAMHeader is required to resolve the mapping position: " + record.getReadName());
- }
- else {
- return record.getHeader().getSequence(record.getReferenceIndex()).getSequenceLength() < record.getAlignmentStart();
- }
- }
-
- /**
- * @return negative if mapq1 < mapq2, etc.
- * Note that MAPQ(0) < MAPQ(255) < MAPQ(1)
- */
- public static int compareMapqs(final int mapq1, final int mapq2) {
- if (mapq1 == mapq2) return 0;
- if (mapq1 == 0) return -1;
- else if (mapq2 == 0) return 1;
- else if (mapq1 == 255) return -1;
- else if (mapq2 == 255) return 1;
- else return mapq1 - mapq2;
- }
-
-
- /**
- * Hokey algorithm for combining two MAPQs into values that are comparable, being cognizant of the fact
- * that in MAPQ world, 1 > 255 > 0. In this algorithm, 255 is treated as if it were 0.01, so that
- * CombinedMapq(1,0) > CombinedMapq(255, 255) > CombinedMapq(0, 0).
- * The return value should not be used for anything other than comparing to the return value of other
- * invocations of this method.
- */
- public static int combineMapqs(int m1, int m2) {
- if (m1 == 255) m1 = 1;
- else m1 *= 100;
-
- if (m2 == 255) m2 = 1;
- else m2 *= 100;
-
- return m1 + m2;
-
- }
-
- /**
- * Returns the virtual file offset of the first record in a BAM file - i.e. the virtual file
- * offset after skipping over the text header and the sequence records.
- */
- public static long findVirtualOffsetOfFirstRecordInBam(final File bamFile) {
- try {
- return BAMFileReader.findVirtualOffsetOfFirstRecord(bamFile);
- } catch (final IOException ioe) {
- throw new RuntimeEOFException(ioe);
- }
- }
-
- /**
- * Given a Cigar, Returns blocks of the sequence that have been aligned directly to the
- * reference sequence. Note that clipped portions, and inserted and deleted bases (vs. the reference)
- * are not represented in the alignment blocks.
- *
- * @param cigar The cigar containing the alignment information
- * @param alignmentStart The start (1-based) of the alignment
- * @param cigarTypeName The type of cigar passed - for error logging.
- * @return List of alignment blocks
- */
- public static List<AlignmentBlock> getAlignmentBlocks(final Cigar cigar, final int alignmentStart, final String cigarTypeName) {
- if (cigar == null) return Collections.emptyList();
-
- final List<AlignmentBlock> alignmentBlocks = new ArrayList<AlignmentBlock>();
- int readBase = 1;
- int refBase = alignmentStart;
-
- for (final CigarElement e : cigar.getCigarElements()) {
- switch (e.getOperator()) {
- case H:
- break; // ignore hard clips
- case P:
- break; // ignore pads
- case S:
- readBase += e.getLength();
- break; // soft clip read bases
- case N:
- refBase += e.getLength();
- break; // reference skip
- case D:
- refBase += e.getLength();
- break;
- case I:
- readBase += e.getLength();
- break;
- case M:
- case EQ:
- case X:
- final int length = e.getLength();
- alignmentBlocks.add(new AlignmentBlock(readBase, refBase, length));
- readBase += length;
- refBase += length;
- break;
- default:
- throw new IllegalStateException("Case statement didn't deal with " + cigarTypeName + " op: " + e.getOperator());
- }
- }
- return Collections.unmodifiableList(alignmentBlocks);
- }
-
- /**
- * @param alignmentStart The start (1-based) of the alignment
- * @param cigar The cigar containing the alignment information
- * @return the alignment start (1-based, inclusive) adjusted for clipped bases. For example if the read
- * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
- * then this method will return 96.
- * <p/>
- * Invalid to call on an unmapped read.
- * Invalid to call with cigar = null
- */
- public static int getUnclippedStart(final int alignmentStart, final Cigar cigar) {
- int unClippedStart = alignmentStart;
- for (final CigarElement cig : cigar.getCigarElements()) {
- final CigarOperator op = cig.getOperator();
- if (op == CigarOperator.SOFT_CLIP || op == CigarOperator.HARD_CLIP) {
- unClippedStart -= cig.getLength();
- } else {
- break;
- }
- }
-
- return unClippedStart;
- }
-
- /**
- * @param alignmentEnd The end (1-based) of the alignment
- * @param cigar The cigar containing the alignment information
- * @return the alignment end (1-based, inclusive) adjusted for clipped bases. For example if the read
- * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
- * then this method will return 107.
- * <p/>
- * Invalid to call on an unmapped read.
- * Invalid to call with cigar = null
- */
- public static int getUnclippedEnd(final int alignmentEnd, final Cigar cigar) {
- int unClippedEnd = alignmentEnd;
- final List<CigarElement> cigs = cigar.getCigarElements();
- for (int i = cigs.size() - 1; i >= 0; --i) {
- final CigarElement cig = cigs.get(i);
- final CigarOperator op = cig.getOperator();
-
- if (op == CigarOperator.SOFT_CLIP || op == CigarOperator.HARD_CLIP) {
- unClippedEnd += cig.getLength();
- } else {
- break;
- }
- }
-
- return unClippedEnd;
- }
-
- /**
- * Returns the Mate Cigar String as stored in the attribute 'MC'.
- *
- * @param rec the SAM record
- * @return Mate Cigar String, or null if there is none.
- */
- public static String getMateCigarString(final SAMRecord rec) {
- return rec.getStringAttribute(SAMTag.MC.name());
- }
-
- /**
- * Returns the Mate Cigar or null if there is none.
- *
- * @param rec the SAM record
- * @param withValidation true if we are to validate the mate cigar before returning, false otherwise.
- * @return Cigar object for the read's mate, or null if there is none.
- */
- public static Cigar getMateCigar(final SAMRecord rec, final boolean withValidation) {
- final String mateCigarString = getMateCigarString(rec);
- Cigar mateCigar = null;
- if (mateCigarString != null) {
- mateCigar = TextCigarCodec.decode(mateCigarString);
- if (withValidation && rec.getValidationStringency() != ValidationStringency.SILENT) {
- final List<AlignmentBlock> alignmentBlocks = getAlignmentBlocks(mateCigar, rec.getMateAlignmentStart(), "mate cigar");
- SAMUtils.processValidationErrors(validateCigar(rec, mateCigar, rec.getMateReferenceIndex(), alignmentBlocks, -1, "Mate CIGAR"), -1L, rec.getValidationStringency());
- }
- }
- return mateCigar;
- }
-
- /**
- * Returns the Mate Cigar or null if there is none. No validation is done on the returned cigar.
- *
- * @param rec the SAM record
- * @return Cigar object for the read's mate, or null if there is none.
- */
- public static Cigar getMateCigar(final SAMRecord rec) {
- return getMateCigar(rec, false);
- }
-
- /**
- * @param rec the SAM record
- * @return number of cigar elements (number + operator) in the mate cigar string.
- */
- public static int getMateCigarLength(final SAMRecord rec) {
- final Cigar mateCigar = getMateCigar(rec);
- return (mateCigar != null) ? mateCigar.numCigarElements() : 0;
- }
-
- /**
- * This method uses the MateCigar value as determined from the attribute MC. It must be non-null.
- *
- * @param rec the SAM record
- * @return 1-based inclusive rightmost position of the clipped mate sequence, or 0 read if unmapped.
- */
- public static int getMateAlignmentEnd(final SAMRecord rec) {
- if (rec.getMateUnmappedFlag()) {
- throw new RuntimeException("getMateAlignmentEnd called on an unmapped mate.");
- }
- final Cigar mateCigar = SAMUtils.getMateCigar(rec);
- if (mateCigar == null) {
- throw new SAMException("Mate CIGAR (Tag MC) not found.");
- }
- return CoordMath.getEnd(rec.getMateAlignmentStart(), mateCigar.getReferenceLength());
- }
-
- /**
- * @param rec the SAM record
- * @return the mate alignment start (1-based, inclusive) adjusted for clipped bases. For example if the mate
- * has an alignment start of 100 but the first 4 bases were clipped (hard or soft clipped)
- * then this method will return 96.
- * <p/>
- * Invalid to call on an unmapped read.
- */
- public static int getMateUnclippedStart(final SAMRecord rec) {
- if (rec.getMateUnmappedFlag())
- throw new RuntimeException("getMateUnclippedStart called on an unmapped mate.");
- final Cigar mateCigar = getMateCigar(rec);
- if (mateCigar == null) {
- throw new SAMException("Mate CIGAR (Tag MC) not found.");
- }
- return SAMUtils.getUnclippedStart(rec.getMateAlignmentStart(), mateCigar);
- }
-
-
- /**
- * @param rec the SAM record
- * @return the mate alignment end (1-based, inclusive) adjusted for clipped bases. For example if the mate
- * has an alignment end of 100 but the last 7 bases were clipped (hard or soft clipped)
- * then this method will return 107.
- * <p/>
- * Invalid to call on an unmapped read.
- */
- public static int getMateUnclippedEnd(final SAMRecord rec) {
- if (rec.getMateUnmappedFlag()) {
- throw new RuntimeException("getMateUnclippedEnd called on an unmapped mate.");
- }
- final Cigar mateCigar = SAMUtils.getMateCigar(rec);
- if (mateCigar == null) {
- throw new SAMException("Mate CIGAR (Tag MC) not found.");
- }
- return SAMUtils.getUnclippedEnd(getMateAlignmentEnd(rec), mateCigar);
- }
-
- /**
- * @param rec the SAM record
- * Returns blocks of the mate sequence that have been aligned directly to the
- * reference sequence. Note that clipped portions of the mate and inserted and
- * deleted bases (vs. the reference) are not represented in the alignment blocks.
- */
- public static List<AlignmentBlock> getMateAlignmentBlocks(final SAMRecord rec) {
- return getAlignmentBlocks(getMateCigar(rec), rec.getMateAlignmentStart(), "mate cigar");
- }
-
- /**
- * Run all validations of the mate's CIGAR. These include validation that the CIGAR makes sense independent of
- * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
- *
- * @param rec the SAM record
- * @param cigar The cigar containing the alignment information
- * @param referenceIndex The reference index
- * @param alignmentBlocks The alignment blocks (parsed from the cigar)
- * @param recordNumber For error reporting. -1 if not known.
- * @param cigarTypeName For error reporting. "Read CIGAR" or "Mate Cigar"
- * @return List of errors, or null if no errors.
- */
-
- public static List<SAMValidationError> validateCigar(final SAMRecord rec,
- final Cigar cigar,
- final Integer referenceIndex,
- final List<AlignmentBlock> alignmentBlocks,
- final long recordNumber,
- final String cigarTypeName) {
- // Don't know line number, and don't want to force read name to be decoded.
- List<SAMValidationError> ret = cigar.isValid(rec.getReadName(), recordNumber);
- if (referenceIndex != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- SAMFileHeader samHeader = rec.getHeader();
- if (null == samHeader) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.MISSING_HEADER,
- cigarTypeName + " A non-null SAMHeader is required to validate cigar elements for: ", rec.getReadName(), recordNumber));
- }
- else {
- final SAMSequenceRecord sequence = samHeader.getSequence(referenceIndex);
- final int referenceSequenceLength = sequence.getSequenceLength();
- for (final AlignmentBlock alignmentBlock : alignmentBlocks) {
- if (alignmentBlock.getReferenceStart() + alignmentBlock.getLength() - 1 > referenceSequenceLength) {
- if (ret == null) ret = new ArrayList<SAMValidationError>();
- ret.add(new SAMValidationError(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE,
- cigarTypeName + " M operator maps off end of reference", rec.getReadName(), recordNumber));
- break;
- }
- }
- }
- }
- return ret;
- }
-
- /**
- * Run all validations of the mate's CIGAR. These include validation that the CIGAR makes sense independent of
- * placement, plus validation that CIGAR + placement yields all bases with M operator within the range of the reference.
- *
- * @param rec the SAM record
- * @param recordNumber For error reporting. -1 if not known.
- * @return List of errors, or null if no errors.
- */
- public static List<SAMValidationError> validateMateCigar(final SAMRecord rec, final long recordNumber) {
- List<SAMValidationError> ret = null;
-
- if (rec.getValidationStringency() != ValidationStringency.SILENT) {
- if (rec.getReadPairedFlag() && !rec.getMateUnmappedFlag()) { // The mateCigar will be defined if the mate is mapped
- if (getMateCigarString(rec) != null) {
- ret = SAMUtils.validateCigar(rec, getMateCigar(rec), rec.getMateReferenceIndex(), getMateAlignmentBlocks(rec), recordNumber, "Mate CIGAR");
- }
- } else {
- if (getMateCigarString(rec) != null) {
- ret = new ArrayList<SAMValidationError>();
- if (!rec.getReadPairedFlag()) {
- // If the read is not paired, and the Mate Cigar String (MC Attribute) exists, that is a validation error
- ret.add(new SAMValidationError(SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE,
- "Mate CIGAR String (MC Attribute) present for a read that is not paired", rec.getReadName(), recordNumber));
- } else { // will hit here if rec.getMateUnmappedFlag() is true
- // If the Mate is unmapped, and the Mate Cigar String (MC Attribute) exists, that is a validation error.
- ret.add(new SAMValidationError(SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE,
- "Mate CIGAR String (MC Attribute) present for a read whose mate is unmapped", rec.getReadName(), recordNumber));
- }
- }
- }
- }
-
- return ret;
- }
-
- /**
- * Checks to see if it is valid for this record to have a mate CIGAR (MC) and then if there is a mate CIGAR available. This is done by
- * checking that this record is paired, its mate is mapped, and that it returns a non-null mate CIGAR.
- *
- * @param rec
- * @return
- */
- public static boolean hasMateCigar(SAMRecord rec) {
- // NB: use getMateCigarString rather than getMateCigar to avoid validation.
- return (rec.getReadPairedFlag() && !rec.getMateUnmappedFlag() && null != SAMUtils.getMateCigarString(rec));
- }
-
- /**
- * Returns a string that is the the read group ID and read name separated by a colon. This is meant to cannonically
- * identify a given record within a set of records.
- *
- * @param record
- * @return
- */
- public static String getCanonicalRecordName(final SAMRecord record) {
- String name = record.getStringAttribute(ReservedTagConstants.READ_GROUP_ID);
- if (null == name) name = record.getReadName();
- else name = name + ":" + record.getReadName();
- return name;
- }
-
- /**
- * Returns the number of bases that need to be clipped due to overlapping pairs. If the record is not paired,
- * or the given record's start position is greater than its mate's start position, zero is automatically returned.
- * NB: This method assumes that the record's mate is not contained within the given record's alignment.
- *
- * @param rec
- * @return the number of bases at the end of the read that need to be clipped such that there would be no overlapping bases with its mate.
- * Read bases include only those from insertion, match, or mismatch Cigar operators.
- */
- public static int getNumOverlappingAlignedBasesToClip(final SAMRecord rec) {
- // NB: ignores how to handle supplemental records when present for both ends by just using the mate information in the record.
-
- if (!rec.getReadPairedFlag() || rec.getReadUnmappedFlag() || rec.getMateUnmappedFlag()) return 0;
-
- // Only clip records that are left-most in genomic order and overlapping.
- if (rec.getMateAlignmentStart() < rec.getAlignmentStart()) return 0; // right-most, so ignore.
- else if (rec.getMateAlignmentStart() == rec.getAlignmentStart() && rec.getFirstOfPairFlag()) return 0; // same start, so pick the first end
-
- // Find the number of read bases after the given mate's alignment start.
- int numBasesToClip = 0;
- final int refStartPos = rec.getMateAlignmentStart(); // relative reference position after which we should start clipping
- final Cigar cigar = rec.getCigar();
- int refPos = rec.getAlignmentStart();
- for (final CigarElement el : cigar.getCigarElements()) {
- final CigarOperator operator = el.getOperator();
- final int refBasesLength = operator.consumesReferenceBases() ? el.getLength() : 0;
- if (refStartPos <= refPos + refBasesLength - 1) { // add to clipped bases
- if (operator == CigarOperator.MATCH_OR_MISMATCH) { // M
- if (refStartPos < refPos) numBasesToClip += refBasesLength; // use all of the bases
- else numBasesToClip += (refPos + refBasesLength) - refStartPos; // since the mate's alignment start can be in the middle of a cigar element
- }
- else if (operator == CigarOperator.SOFT_CLIP || operator == CigarOperator.HARD_CLIP || operator == CigarOperator.PADDING || operator == CigarOperator.SKIPPED_REGION) {
- // ignore
- }
- else { // ID
- numBasesToClip += operator.consumesReadBases() ? el.getLength() : 0; // clip all the bases in the read from this operator
- }
- }
- refPos += refBasesLength;
- }
-
- if (numBasesToClip < 0) return 0; // left-most but not overlapping
-
- return numBasesToClip;
- }
-
- /**
- * Returns a (possibly new) record that has been clipped if isa mapped paired and has overlapping bases with its mate.
- * See {@link #getNumOverlappingAlignedBasesToClip(SAMRecord)} for how the number of overlapping bases is computed.
- * NB: this does not properly consider a cigar like: 100M20S10H.
- * NB: This method assumes that the record's mate is not contained within the given record's alignment.
- *
- * @param record the record from which to clip bases.
- * @param noSideEffects if true a modified clone of the original record is returned, otherwise we modify the record directly.
- * @return
- */
- public static SAMRecord clipOverlappingAlignedBases(final SAMRecord record, final boolean noSideEffects) {
- return clipOverlappingAlignedBases(record, getNumOverlappingAlignedBasesToClip(record), noSideEffects);
- }
-
- /**
- * Returns a (possibly new) SAMRecord with the given number of bases soft-clipped at the end of the read if is a mapped
- * paired and has overlapping bases with its mate.
- * NB: this does not properly consider a cigar like: 100M20S10H.
- * NB: This method assumes that the record's mate is not contained within the given record's alignment.
- *
- * @param record the record from which to clip bases.
- * @param numOverlappingBasesToClip the number of bases to clip at the end of the read.
- * @param noSideEffects if true a modified clone of the original record is returned, otherwise we modify the record directly.
- * @return
- */
- public static SAMRecord clipOverlappingAlignedBases(final SAMRecord record, final int numOverlappingBasesToClip, final boolean noSideEffects) {
- // NB: ignores how to handle supplemental records when present for both ends by just using the mate information in the record.
-
- if (numOverlappingBasesToClip <= 0 || record.getReadUnmappedFlag() || record.getMateUnmappedFlag()) return record;
-
- try {
- final SAMRecord rec = noSideEffects ? ((SAMRecord)record.clone()) : record;
-
- // watch out for when the second read overlaps all of the first read
- if (rec.getMateAlignmentStart() <= rec.getAlignmentStart()) { // make it unmapped
- rec.setReadUnmappedFlag(true);
- return rec;
- }
-
- // 1-based index of first base in read to clip.
- int clipFrom = rec.getReadLength() - numOverlappingBasesToClip + 1;
- // we have to check if the last cigar element is soft-clipping, so we can subtract that from clipFrom
- final CigarElement cigarElement = rec.getCigar().getCigarElement(rec.getCigarLength()-1);
- if (CigarOperator.SOFT_CLIP == cigarElement.getOperator()) clipFrom -= cigarElement.getLength();
- // FIXME: does not properly consider a cigar like: 100M20S10H
-
- // clip it, clip it good
- rec.setCigar(new Cigar(CigarUtil.softClipEndOfRead(clipFrom, rec.getCigar().getCigarElements())));
- return rec;
- } catch (final CloneNotSupportedException e) {
- throw new SAMException(e.getMessage(), e);
- }
- }
-
- /**
- * Checks if a long attribute value is within the allowed range of a 32-bit unsigned integer.
- *
- * @param value a long value to check
- * @return true if value is >= 0 and <= {@link BinaryCodec#MAX_UINT}, and false otherwise
- */
- public static boolean isValidUnsignedIntegerAttribute(long value) {
- return value >= 0 && value <= BinaryCodec.MAX_UINT;
- }
-
- /**
- * Extract a List of 'other canonical alignments' from a SAM record. Those alignments are stored as a string in the 'SA' tag as defined
- * in the SAM specification.
- * The name, sequence and qualities, mate data are copied from the original record.
- * @param record must be non null and must have a non-null associated header.
- * @return a list of 'other canonical alignments' SAMRecords. The list is empty if the 'SA' attribute is missing.
- */
- public static List<SAMRecord> getOtherCanonicalAlignments(final SAMRecord record) {
- if( record == null ) throw new IllegalArgumentException("record is null");
- if( record.getHeader() == null ) throw new IllegalArgumentException("record.getHeader() is null");
- /* extract value of SA tag */
- final Object saValue = record.getAttribute( SAMTagUtil.getSingleton().SA );
- if( saValue == null ) return Collections.emptyList();
- if( ! (saValue instanceof String) ) throw new SAMException(
- "Expected a String for attribute 'SA' but got " + saValue.getClass() );
-
- final SAMRecordFactory samReaderFactory = new DefaultSAMRecordFactory();
-
- /* the spec says: "Other canonical alignments in a chimeric alignment, formatted as a
- * semicolon-delimited list: (rname,pos,strand,CIGAR,mapQ,NM;)+.
- * Each element in the list represents a part of the chimeric alignment.
- * Conventionally, at a supplementary line, the 1rst element points to the primary line.
- */
-
- /* break string using semicolon */
- final String semiColonStrs[] = SEMICOLON_PAT.split((String)saValue);
-
- /* the result list */
- final List<SAMRecord> alignments = new ArrayList<>( semiColonStrs.length );
-
- /* base SAM flag */
- int record_flag = record.getFlags() ;
- record_flag &= ~SAMFlag.PROPER_PAIR.flag;
- record_flag &= ~SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag;
- record_flag &= ~SAMFlag.READ_REVERSE_STRAND.flag;
-
-
- for(int i=0; i< semiColonStrs.length;++i ) {
- final String semiColonStr = semiColonStrs[i];
- /* ignore empty string */
- if( semiColonStr.isEmpty() ) continue;
-
- /* break string using comma */
- final String commaStrs[] = COMMA_PAT.split(semiColonStr);
- if( commaStrs.length != 6 ) throw new SAMException("Bad 'SA' attribute in " + semiColonStr);
-
- /* create the new record */
- final SAMRecord otherRec = samReaderFactory.createSAMRecord( record.getHeader() );
-
- /* copy fields from the original record */
- otherRec.setReadName( record.getReadName() );
- otherRec.setReadBases( record.getReadBases() );
- otherRec.setBaseQualities( record.getBaseQualities() );
- if( record.getReadPairedFlag() && !record.getMateUnmappedFlag()) {
- otherRec.setMateReferenceIndex( record.getMateReferenceIndex() );
- otherRec.setMateAlignmentStart( record.getMateAlignmentStart() );
- }
-
-
- /* get reference sequence */
- final int tid = record.getHeader().getSequenceIndex( commaStrs[0] );
- if( tid == -1 ) throw new SAMException("Unknown contig in " + semiColonStr);
- otherRec.setReferenceIndex( tid );
-
- /* fill POS */
- final int alignStart;
- try {
- alignStart = Integer.parseInt(commaStrs[1]);
- } catch( final NumberFormatException err ) {
- throw new SAMException("bad POS in "+semiColonStr, err);
- }
-
- otherRec.setAlignmentStart( alignStart );
-
- /* set TLEN */
- if( record.getReadPairedFlag() &&
- !record.getMateUnmappedFlag() &&
- record.getMateReferenceIndex() == tid ) {
- otherRec.setInferredInsertSize( record.getMateAlignmentStart() - alignStart );
- }
-
- /* set FLAG */
- int other_flag = record_flag;
- other_flag |= (commaStrs[2].equals("+") ? 0 : SAMFlag.READ_REVERSE_STRAND.flag) ;
- /* spec: Conventionally, at a supplementary line, the 1st element points to the primary line */
- if( !( record.getSupplementaryAlignmentFlag() && i==0 ) ) {
- other_flag |= SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag;
- }
- otherRec.setFlags(other_flag);
-
- /* set CIGAR */
- otherRec.setCigar( TextCigarCodec.decode( commaStrs[3] ) );
-
- /* set MAPQ */
- try {
- otherRec.setMappingQuality( Integer.parseInt(commaStrs[4]) );
- } catch (final NumberFormatException err) {
- throw new SAMException("bad MAPQ in "+semiColonStr, err);
- }
-
- /* fill NM */
- try {
- if (!commaStrs[5].equals("*")) {
- otherRec.setAttribute(SAMTagUtil.getSingleton().NM, Integer.parseInt(commaStrs[5]));
- }
- } catch (final NumberFormatException err) {
- throw new SAMException("bad NM in "+semiColonStr, err);
- }
-
- /* if strand is not the same: reverse-complement */
- if( otherRec.getReadNegativeStrandFlag() != record.getReadNegativeStrandFlag() ) {
- SAMRecordUtil.reverseComplement(otherRec);
- }
-
- /* add the alignment */
- alignments.add( otherRec );
- }
- return alignments;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SAMValidationError.java b/src/main/java/htsjdk/samtools/SAMValidationError.java
deleted file mode 100644
index d560b11..0000000
--- a/src/main/java/htsjdk/samtools/SAMValidationError.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import java.io.Serializable;
-
-/**
- * Class that encapsulates a validation error message as well as a type code so that
- * errors can be aggregated by type.
- *
- * @author Doug Voet
- */
-public class SAMValidationError implements Serializable {
- public static final long serialVersionUID = 1L;
-
- public enum Severity {
- WARNING, ERROR
- }
-
- public enum Type {
- /** quality encodings out of range; appear to be Solexa or Illumina when Phread expected */
- INVALID_QUALITY_FORMAT(Severity.WARNING),
-
- /** proper pair flag set for unpaired read */
- INVALID_FLAG_PROPER_PAIR,
-
- /** mate unmapped flag set when mate is mapped or not set when mate is not mapped */
- INVALID_FLAG_MATE_UNMAPPED,
-
- /** mate unmapped flag does not match read unmapped flag of mate */
- MISMATCH_FLAG_MATE_UNMAPPED,
-
- /** mate negative strand flag set for unpaired read */
- INVALID_FLAG_MATE_NEG_STRAND,
-
- /** mate negative strand flag does not match read negative strand flag of mate */
- MISMATCH_FLAG_MATE_NEG_STRAND,
-
- /** first of pair flag set for unpaired read */
- INVALID_FLAG_FIRST_OF_PAIR,
-
- /** second of pair flag set for unpaired read */
- INVALID_FLAG_SECOND_OF_PAIR,
-
- /** pair flag set but not marked as first or second of pair */
- PAIRED_READ_NOT_MARKED_AS_FIRST_OR_SECOND(Severity.WARNING),
-
- /** not primary alignment flag set for unmapped read */
- INVALID_FLAG_NOT_PRIM_ALIGNMENT,
-
- /** supplementary alignment flag set for unmapped read */
- INVALID_FLAG_SUPPLEMENTARY_ALIGNMENT,
-
- /** mapped read flat not set for mapped read */
- INVALID_FLAG_READ_UNMAPPED,
-
- /**
- * inferred insert size is out of range
- * @see SAMRecord#MAX_INSERT_SIZE
- */
- INVALID_INSERT_SIZE,
-
- /** mapping quality set for unmapped read or is >= 256 */
- INVALID_MAPPING_QUALITY,
-
- /** CIGAR string is empty for mapped read or not empty of unmapped read, or other CIGAR badness. */
- INVALID_CIGAR,
-
- /** CIGAR string contains I followed by D, or vice versa */
- ADJACENT_INDEL_IN_CIGAR(Severity.WARNING),
-
- /** mate reference index (MRNM) set for unpaired read */
- INVALID_MATE_REF_INDEX,
-
- /** mate reference index (MRNM) does not match reference index of mate */
- MISMATCH_MATE_REF_INDEX,
-
- /** reference index not found in sequence dictionary */
- INVALID_REFERENCE_INDEX,
-
- /** alignment start is can not be correct */
- INVALID_ALIGNMENT_START,
-
- /** mate alignment does not match alignment start of mate */
- MISMATCH_MATE_ALIGNMENT_START,
-
- /** the record's mate fields do not match the corresponding fields of the mate */
- MATE_FIELD_MISMATCH,
-
- /** the NM tag (nucleotide differences) is incorrect */
- INVALID_TAG_NM,
-
- /** the NM tag (nucleotide differences) is missing */
- MISSING_TAG_NM(Severity.WARNING),
-
- /** the sam/bam file is missing the header */
- MISSING_HEADER,
-
- /** there is no sequence dictionary in the header */
- MISSING_SEQUENCE_DICTIONARY,
-
- /** the header is missing read group information */
- MISSING_READ_GROUP,
-
- /** the record is out of order */
- RECORD_OUT_OF_ORDER,
-
- /** A read group ID on a SAMRecord is not found in the header */
- READ_GROUP_NOT_FOUND,
-
- /** A SAMRecord is found with no read group id */
- RECORD_MISSING_READ_GROUP(Severity.WARNING),
-
- /** Indexing bin set on SAMRecord does not agree with computed value. */
- INVALID_INDEXING_BIN,
-
- MISSING_VERSION_NUMBER,
-
- INVALID_VERSION_NUMBER,
-
- TRUNCATED_FILE,
-
- MISMATCH_READ_LENGTH_AND_QUALS_LENGTH,
-
- EMPTY_READ,
-
- /**
- * Bases corresponding to M operator in CIGAR are beyond the end of the reference.
- */
- CIGAR_MAPS_OFF_REFERENCE,
-
- /** Length of E2 (secondary base calls) and U2 (secondary base quals) tag values should match read length */
- MISMATCH_READ_LENGTH_AND_E2_LENGTH,
- MISMATCH_READ_LENGTH_AND_U2_LENGTH,
-
- /** Secondary base calls should not be the same as primary, unless one or the other is N */
- E2_BASE_EQUALS_PRIMARY_BASE(Severity.WARNING),
-
- /** BAM appears to be healthy, but is an older file so doesn't have terminator block. */
- BAM_FILE_MISSING_TERMINATOR_BLOCK(Severity.WARNING),
-
- /** Header record is not one of the standard types */
- UNRECOGNIZED_HEADER_TYPE,
-
- /** Header tag does not have colon */
- POORLY_FORMATTED_HEADER_TAG,
-
- /** Header tag appears more than once in header line with different value */
- HEADER_TAG_MULTIPLY_DEFINED,
-
- HEADER_RECORD_MISSING_REQUIRED_TAG,
-
- /** Date string is not ISO-8601 */
- INVALID_DATE_STRING(Severity.WARNING),
-
- /** Unsigned integer tag value is deprecated in BAM. */
- TAG_VALUE_TOO_LARGE,
-
- /** Invalid virtualFilePointer in index */
- INVALID_INDEX_FILE_POINTER,
-
- /** PI tag value is not numeric. */
- INVALID_PREDICTED_MEDIAN_INSERT_SIZE,
-
- /** Same read group id appears more than once */
- DUPLICATE_READ_GROUP_ID,
-
- /** The read group is missing its PL (platform unit) field */
- MISSING_PLATFORM_VALUE,
-
- /** The read group has an invalid value set for its PL field */
- INVALID_PLATFORM_VALUE,
-
- /** Same program group id appears more than once */
- DUPLICATE_PROGRAM_GROUP_ID,
-
- /** Read is marked as paired, but its pair was not found. */
- MATE_NOT_FOUND,
-
- /** Both mates are marked as first of pair, or both mates are marked as second of pair. */
- MATES_ARE_SAME_END,
-
- /** The Cigar String in the MC Tag does not match the Cigar String for the mate of this read. */
- MISMATCH_MATE_CIGAR_STRING,
-
- /** There is a Cigar String (stored in the MC Tag) for a read whose mate is NOT mapped. */
- MATE_CIGAR_STRING_INVALID_PRESENCE;
-
- public final Severity severity;
-
- private Type() {
- this.severity = Severity.ERROR;
- }
-
- private Type(final Severity severity) {
- this.severity = severity;
- }
-
- /**
- * @return Format for writing to histogram summary output.
- */
- public String getHistogramString() {
- return this.severity.name() + ":" + this.name();
- }
- }
-
- private final Type type;
- private final String message;
- private final String readName;
- private long recordNumber = -1;
- private String source;
-
- /**
- * Construct a SAMValidationError with unknown record number.
- * @param type
- * @param message
- * @param readName May be null if readName is not known.
- */
- public SAMValidationError(final Type type, final String message, final String readName) {
- this.type = type;
- this.message = message;
- this.readName = readName;
- }
-
- /**
- * Construct a SAMValidationError with possibly-known record number.
- * @param type
- * @param message
- * @param readName May be null if readName is not known.
- * @param recordNumber Position of the record in the SAM file it has been read from. -1 if not known.
- */
- public SAMValidationError(final Type type, final String message, final String readName, final long recordNumber) {
- this(type, message, readName);
- this.recordNumber = recordNumber;
- }
-
- public String toString() {
- final StringBuilder builder = new StringBuilder();
- builder.append(type.severity.toString()).append(": ");
- if (source != null) {
- builder.append("File ").append(source.toString()).append(", ");
- }
- if (recordNumber > 0) {
- builder.append("Record ").append(recordNumber).append(", ");
- }
- if (readName != null) {
- builder.append("Read name ").append(readName).append(", ");
- }
- return builder.append(message).toString();
- }
-
- public Type getType() { return type; }
- public String getMessage() { return message; }
-
- /** may be null */
- public String getReadName() { return readName; }
-
- /** 1-based. -1 if not known. */
- public long getRecordNumber() { return recordNumber; }
-
- public void setRecordNumber(final long recordNumber) { this.recordNumber = recordNumber; }
-
- public String getSource() {
- return source;
- }
-
- public void setSource(final String source) {
- this.source = source;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SQTagUtil.java b/src/main/java/htsjdk/samtools/SQTagUtil.java
deleted file mode 100644
index daee4c3..0000000
--- a/src/main/java/htsjdk/samtools/SQTagUtil.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * Utility methods for encoding and decoding the SQ tag value of SAMRecord.
- *
- * @author alecw at broadinstitute.org
- */
-public class SQTagUtil {
- /**
- * The ordinals of these are stored in the high-order 2 bits of each byte of the SQ tag.
- * Note that these have the convenient property that the binary complement of each ordinal, masked to
- * the two low-order bits, is the complementary base.
- */
- public enum SQBase {
- SQ_A('A'), SQ_C('C'), SQ_G('G'), SQ_T('T');
- private final Character base;
-
- SQBase(final Character base) {
- this.base = base;
- }
-
- public Character getBase() {
- return base;
- }
- }
-
- /**
- * For complementing SQBase ordinals.
- */
- private static final int COMPLEMENT_MASK = 3;
-
- private static final int QUALITY_MASK = 0x3f;
- public static final byte MAX_QUALITY = QUALITY_MASK;
- private static final int BASE_INDEX_SHIFT = 6;
-
- /**
- * Convert a pair of likelihoods into a value suitable for passing to baseAndProbDiffToSqValue.
- * @param secondBestLikelihood Probability of the 2nd-best base call. 1 > secondBestLikelihood > thirdBestLikelihood.
- * @param thirdBestLikelihood Probability of the 3rd-best base call. thirdBestLikelihood > 0.
- * @return ratio of input probabilities for storing in SQ tag.
- */
- public static byte sqScaledProbabilityRatio(final double secondBestLikelihood, final double thirdBestLikelihood) {
- if (secondBestLikelihood >= 1.0 || thirdBestLikelihood <= 0 || thirdBestLikelihood > secondBestLikelihood) {
- throw new IllegalArgumentException("Likelihoods out of range. second best: " + secondBestLikelihood +
- "; third best: " + thirdBestLikelihood);
- }
- // Cap value at QUALITY_MASK
- return (byte)(Math.min(Math.round(-10.0 * Math.log10(thirdBestLikelihood/secondBestLikelihood)), QUALITY_MASK));
- }
-
- /**
- * Compress a base and a log probabiliy difference (-10log10(p3/p2)) into
- * a single byte so that it can be output in a SAMRecord's SQ field.
- *
- * @param base the 2nd-best base.
- * @param probRatio the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)),
- * rounded to an integer and capped so it fits in 6 bits.
- * @return a byte containing the index and the log probability difference.
- */
- public static byte baseAndProbDiffToSqValue(final SQBase base, final byte probRatio) {
- return baseAndProbDiffToSqValue(base.ordinal(), probRatio);
- }
-
- /**
- * Compress a base and a log probabiliy difference (-10log10(p3/p2)) into
- * a single byte so that it can be output in a SAMRecord's SQ field.
- *
- * @param base the 2nd-best base (A=0, C=1, G=2, T=3).
- * @param probRatio the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)),
- * rounded to an integer and capped so it fits in 6 bits. If this value is > MAX_QUALITY, it is truncated to that.
- * @return a byte containing the index and the log probability difference.
- */
- public static byte baseAndProbDiffToSqValue(final int base, final byte probRatio) {
- return (byte)((base << BASE_INDEX_SHIFT) | Math.min(probRatio, QUALITY_MASK));
- }
-
- /**
- * Retrieve SQ-scaled probability ratio from SQ value.
- * @param sqValue
- * @return the log probability difference between the secondary and tertiary bases (-10log10(p3/p2)).
- */
- public static byte sqValueToProbRatio(final byte sqValue) {
- return (byte)(sqValue & QUALITY_MASK);
- }
-
- /**
- * Retrieve the 2nd-best base call from SQ value.
- * @param sqValue
- * @return 2nd-best base call.
- */
- public static SQBase sqValueToBase(final byte sqValue) {
- return SQBase.values()[sqValueToBaseOrdinal(sqValue)];
- }
-
- /**
- * Retrieve the 2nd-best base call from SQ value.
- * @param sqValue
- * @return Ordinal of 2nd-best base call.
- */
- public static int sqValueToBaseOrdinal(final byte sqValue) {
- return (sqValue & 0xff) >>> BASE_INDEX_SHIFT;
- }
-
-
- /**
- * Reverses and complements the sqValues in place.
- * @param sqArray Array of SQ-values, with 2nd-best base in high-order 2 bits, and probability diff
- * in low-order 6 bits.
- */
- public static void reverseComplementSqArray(final byte[] sqArray) {
- final int lastIndex = sqArray.length - 1;
-
- int i, j;
- for (i=0, j=lastIndex; i<j; ++i, --j) {
- final byte tmp = complementSqValue(sqArray[i]);
- sqArray[i] = complementSqValue(sqArray[j]);
- sqArray[j] = tmp;
- }
- if (sqArray.length % 2 == 1) {
- sqArray[i] = complementSqValue(sqArray[i]);
- }
- }
-
- private static byte complementSqValue(final byte sqValue) {
- final byte probDiff = sqValueToProbRatio(sqValue);
- final int baseOrdinal = sqValueToBaseOrdinal(sqValue);
- final int complementOrdinal = COMPLEMENT_MASK & ~baseOrdinal;
- return baseAndProbDiffToSqValue(complementOrdinal, probDiff);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SRAFileReader.java b/src/main/java/htsjdk/samtools/SRAFileReader.java
deleted file mode 100644
index e76e10b..0000000
--- a/src/main/java/htsjdk/samtools/SRAFileReader.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-/**
- * Created by andrii.nikitiuk on 8/11/15.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.sra.ReferenceCache;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.CloseableIterator;
-
-import htsjdk.samtools.SamReader.Type;
-
-import htsjdk.samtools.util.Log;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.ReadGroupIterator;
-import ngs.ReferenceIterator;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class SRAFileReader extends SamReader.ReaderImplementation implements SamReader.Indexing {
- private static final Log log = Log.getInstance(SRAFileReader.class);
- private SRAAccession acc;
- private SAMFileHeader virtualHeader;
- private ReadCollection run;
- private ValidationStringency validationStringency;
- private SRAIterator.RecordRangeInfo recordRangeInfo;
- private SRAIndex index;
- private ReferenceCache cachedReferences;
-
- public SRAFileReader(final SRAAccession acc) {
- this.acc = acc;
-
- if (!acc.isValid()) {
- throw new IllegalArgumentException("SRAFileReader: cannot resolve SRA accession '" + acc + "'\n" +
- "Possible causes are an invalid SRA accession or a connection problem.");
- }
-
- try {
- run = gov.nih.nlm.ncbi.ngs.NGS.openReadCollection(acc.toString());
- virtualHeader = loadSamHeader();
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
-
- cachedReferences = new ReferenceCache(run, virtualHeader);
- recordRangeInfo = SRAIterator.getRecordsRangeInfo(run);
- index = new SRAIndex(virtualHeader, recordRangeInfo);
- }
-
- @Override
- public Type type() {
- return Type.SRA_TYPE;
- }
-
- @Override
- public boolean hasIndex() {
- return true;
- }
-
- @Override
- public BAMIndex getIndex() {
- return index;
- }
-
- @Override
- public SAMFileHeader getFileHeader() {
- return virtualHeader;
- }
-
- @Override
- public CloseableIterator<SAMRecord> getIterator() {
- return getIterator(getFilePointerSpanningReads());
- }
-
- @Override
- public CloseableIterator<SAMRecord> getIterator(SAMFileSpan chunks) {
- if (run == null) {
- throw new RuntimeException("Cannot create iterator - SRA run is uninitialized");
- }
-
- if (virtualHeader == null) {
- throw new RuntimeException("Cannot create iterator - SAM file header is uninitialized");
- }
-
- List<Chunk> chunkList = ((BAMFileSpan) chunks).getChunks();
-
- final SRAIterator newIterator = new SRAIterator(acc, run, virtualHeader, cachedReferences, recordRangeInfo, chunkList);
- if (validationStringency != null) {
- newIterator.setValidationStringency(validationStringency);
- }
-
- return newIterator;
- }
-
- @Override
- public SAMFileSpan getFilePointerSpanningReads() {
- if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
- throw new RuntimeException("Cannot create file span - SRA file is empty");
- }
-
- return new BAMFileSpan(new Chunk(0, recordRangeInfo.getTotalRecordRangeLength()));
- }
-
- @Override
- public CloseableIterator<SAMRecord> query(QueryInterval[] intervals, boolean contained) {
- BAMFileSpan span = new BAMFileSpan();
- BrowseableBAMIndex index = getBrowseableIndex();
-
- for (QueryInterval interval : intervals) {
- BAMFileSpan intervalSpan;
- if (!contained) {
- intervalSpan = index.getSpanOverlapping(interval.referenceIndex, interval.start, interval.end);
-
- } else {
- intervalSpan = getSpanContained(interval.referenceIndex, interval.start, interval.end);
- }
- span.add(intervalSpan);
- }
-
- return getIterator(span);
- }
-
- @Override
- public CloseableIterator<SAMRecord> queryAlignmentStart(String sequence, int start) {
- int sequenceIndex = virtualHeader.getSequenceIndex(sequence);
- if (sequenceIndex == -1) {
- throw new IllegalArgumentException("Unknown sequence '" + sequence + "' was passed to SRAFileReader");
- }
-
- return getIterator(getSpanContained(sequenceIndex, start, -1));
- }
-
- @Override
- public CloseableIterator<SAMRecord> queryUnmapped() {
- if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
- throw new RuntimeException("Cannot create file span - SRA file is empty");
- }
-
- SAMFileSpan span = new BAMFileSpan(new Chunk(recordRangeInfo.getTotalReferencesLength(), recordRangeInfo.getTotalRecordRangeLength()));
- return getIterator(span);
- }
-
- @Override
- public void close() {
- run = null;
- }
-
- @Override
- public ValidationStringency getValidationStringency() {
- return validationStringency;
- }
-
-
- /** INDEXING */
-
-
- /**
- * Returns true if the supported index is browseable, meaning the bins in it can be traversed
- * and chunk data inspected and retrieved.
- *
- * @return True if the index supports the BrowseableBAMIndex interface. False otherwise.
- */
- @Override
- public boolean hasBrowseableIndex() {
- return true;
- }
-
- /**
- * Gets an index tagged with the BrowseableBAMIndex interface. Throws an exception if no such
- * index is available.
- *
- * @return An index with a browseable interface, if possible.
- * @throws SAMException if no such index is available.
- */
- @Override
- public BrowseableBAMIndex getBrowseableIndex() {
- return index;
- }
-
- /**
- * Iterate through the given chunks in the file.
- *
- * @param chunks List of chunks for which to retrieve data.
- * @return An iterator over the given chunks.
- */
- @Override
- public SAMRecordIterator iterator(final SAMFileSpan chunks) {
- CloseableIterator<SAMRecord> it = getIterator(chunks);
- if (it == null) {
- return null;
- }
- return (SAMRecordIterator) it;
- }
-
- /** ReaderImplementation */
- @Override
- void enableFileSource(final SamReader reader, final boolean enabled) {
- log.info("enableFileSource is not supported");
- }
-
- @Override
- void enableIndexCaching(final boolean enabled) {
- log.info("enableIndexCaching is not supported");
- }
-
- @Override
- void enableIndexMemoryMapping(final boolean enabled) {
- log.info("enableIndexMemoryMapping is not supported");
- }
-
- @Override
- void enableCrcChecking(final boolean enabled) {
- log.info("enableCrcChecking is not supported");
- }
-
- @Override
- void setSAMRecordFactory(final SAMRecordFactory factory) {
- log.info("setSAMRecordFactory is not supported");
- }
-
- @Override
- void setValidationStringency(final ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- }
-
- protected SRAIterator.RecordRangeInfo getRecordsRangeInfo() {
- return recordRangeInfo;
- }
-
- private SAMFileHeader loadSamHeader() throws ErrorMsg {
- if (run == null) {
- throw new RuntimeException("Cannot load SAMFileHeader - SRA run is uninitialized");
- }
-
- String runName = run.getName();
-
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
- ReadGroupIterator itRg = run.getReadGroups();
- while (itRg.nextReadGroup()) {
- String rgName = itRg.getName();
- if (rgName.isEmpty())
- rgName = runName;
- SAMReadGroupRecord rg = new SAMReadGroupRecord(rgName);
- rg.setSample(runName);
- header.addReadGroup(rg);
- }
-
- ReferenceIterator itRef = run.getReferences();
- while (itRef.nextReference()) {
- header.addSequence(new SAMSequenceRecord(itRef.getCanonicalName(), (int) itRef.getLength()));
- }
-
- return header;
- }
-
- private BAMFileSpan getSpanContained(int sequenceIndex, long start, long end) {
- if (recordRangeInfo.getTotalRecordRangeLength() <= 0) {
- throw new RuntimeException("Cannot create file span - SRA file is empty");
- }
-
- long sequenceOffset = recordRangeInfo.getReferenceOffsets().get(sequenceIndex);
- long sequenceLength = recordRangeInfo.getReferenceLengthsAligned().get(sequenceIndex);
- if (end == -1) {
- end = sequenceLength;
- }
-
- if (start > sequenceLength) {
- throw new IllegalArgumentException("Sequence start position is larger than its length");
- }
-
- if (end > sequenceLength) {
- throw new IllegalArgumentException("Sequence end position is larger than its length");
- }
-
- return new BAMFileSpan(new Chunk(sequenceOffset + start, sequenceOffset + end));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SRAIndex.java b/src/main/java/htsjdk/samtools/SRAIndex.java
deleted file mode 100644
index b74ee63..0000000
--- a/src/main/java/htsjdk/samtools/SRAIndex.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools;
-
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Emulates BAM index so that we can request chunks of records from SRAFileReader
- *
- * Here is how it works:
- * SRA allows reading of alignments by Reference position fast, so we divide our "file" range for alignments as
- * a length of all references. Reading unaligned reads is then fast if we use read positions for lookup and (internally)
- * filter out aligned fragments.
- *
- * Total SRA "file" range is calculated as sum of all reference lengths plus number of reads (both aligned and unaligned)
- * in SRA archive.
- *
- * Now, we can use Chunks to lookup for aligned and unaligned fragments.
- *
- * We emulate BAM index bins by mapping SRA reference positions to bin numbers.
- * And then we map from bin number to list of chunks, which represent SRA "file" positions (which are simply reference
- * positions).
- *
- * We only emulate last level of BAM index bins (and they refer to a portion of reference SRA_BIN_SIZE bases long).
- * For all other bins RuntimeException will be returned (but since nobody else creates bins, except SRAIndex class
- * that is fine).
- *
- * But since the last level of bins was not meant to refer to fragments that only partially overlap bin reference
- * positions, we also return chunk that goes 5000 bases left before beginning of the bin to assure fragments that
- * start before the bin positions but still overlap with it can be retrieved by SRA reader.
- * Later we will add support to NGS API to get a maximum number of bases that we need to go left to retrieve such fragments.
- *
- * Created by andrii.nikitiuk on 9/4/15.
- */
-public class SRAIndex implements BrowseableBAMIndex {
- /**
- * Number of reference bases bins in last level can represent
- */
- public static final int SRA_BIN_SIZE = 16 * 1024;
-
- /**
- * Chunks of that size will be created when using SRA index
- */
- public static final int SRA_CHUNK_SIZE = 50000;
-
- /**
- * First bin number in last level
- */
- private static final int SRA_BIN_INDEX_OFFSET = GenomicIndexUtil.LEVEL_STARTS[GenomicIndexUtil.LEVEL_STARTS.length - 1];
-
- /**
- * How many bases should we go left on the reference to find all fragments that start before requested interval
- * but overlap with it
- */
- private static final int MAX_FRAGMENT_OVERLAP = 5000;
-
- private SAMFileHeader header;
- private SRAIterator.RecordRangeInfo recordRangeInfo;
-
- /**
- * @param header sam header
- * @param recordRangeInfo info about record ranges withing SRA archive
- */
- public SRAIndex(SAMFileHeader header, SRAIterator.RecordRangeInfo recordRangeInfo) {
- this.header = header;
- this.recordRangeInfo = recordRangeInfo;
- }
-
- /**
- * Gets the size (number of bins in) a given level of a BAM index.
- * @param levelNumber Level for which to inspect the size.
- * @return Size of the given level.
- */
- @Override
- public int getLevelSize(int levelNumber) {
- if (levelNumber == GenomicIndexUtil.LEVEL_STARTS.length - 1)
- return GenomicIndexUtil.MAX_BINS - GenomicIndexUtil.LEVEL_STARTS[levelNumber]-1;
- else
- return GenomicIndexUtil.LEVEL_STARTS[levelNumber+1] - GenomicIndexUtil.LEVEL_STARTS[levelNumber];
- }
-
- /**
- * SRA only operates on bins from last level
- * @param bin The bin for which to determine the level.
- * @return bin level
- */
- @Override
- public int getLevelForBin(Bin bin) {
- if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
- throw new RuntimeException("SRA only supports bins from the last level");
- }
- return GenomicIndexUtil.LEVEL_STARTS.length - 1;
- }
-
- /**
- * Gets the first locus that this bin can index into.
- * @param bin The bin to test.
- * @return first position that associated with given bin number
- */
- @Override
- public int getFirstLocusInBin(Bin bin) {
- if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
- throw new RuntimeException("SRA only supports bins from the last level");
- }
-
- return (bin.getBinNumber() - SRA_BIN_INDEX_OFFSET) * SRA_BIN_SIZE + 1;
- }
-
- /**
- * Gets the last locus that this bin can index into.
- * @param bin The bin to test.
- * @return last position that associated with given bin number
- */
- @Override
- public int getLastLocusInBin(Bin bin) {
- if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
- throw new RuntimeException("SRA only supports bins from the last level");
- }
-
- return (bin.getBinNumber() - SRA_BIN_INDEX_OFFSET + 1) * SRA_BIN_SIZE;
- }
-
- /**
- * Provides a list of bins that contain bases at requested positions
- * @param referenceIndex sequence of desired SAMRecords
- * @param startPos 1-based start of the desired interval, inclusive
- * @param endPos 1-based end of the desired interval, inclusive
- * @return a list of bins that contain relevant data
- */
- @Override
- public BinList getBinsOverlapping(int referenceIndex, int startPos, int endPos) {
- long refLength = recordRangeInfo.getReferenceLengthsAligned().get(referenceIndex);
-
- // convert to chunk address space within reference
- long refStartPos = startPos - 1;
- long refEndPos = endPos;
- if (refEndPos >= refLength) {
- throw new RuntimeException("refEndPos is larger than reference length");
- }
-
- int firstBinNumber = (int)refStartPos / SRA_BIN_SIZE;
- int lastBinNumber = (int)(refEndPos - 1) / SRA_BIN_SIZE;
-
- int numberOfBins = ((int)refLength / SRA_BIN_SIZE) + 1;
-
- BitSet binBitSet = new BitSet();
- binBitSet.set(0, SRA_BIN_INDEX_OFFSET, false);
- if (firstBinNumber > 0) {
- binBitSet.set(SRA_BIN_INDEX_OFFSET, SRA_BIN_INDEX_OFFSET + firstBinNumber, false);
- }
- binBitSet.set(SRA_BIN_INDEX_OFFSET + firstBinNumber, SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, true);
- if (lastBinNumber + 1 < numberOfBins) {
- binBitSet.set(SRA_BIN_INDEX_OFFSET + lastBinNumber + 1, SRA_BIN_INDEX_OFFSET + numberOfBins, false);
- }
-
- return new BinList(referenceIndex, binBitSet);
- }
-
- @Override
- public BAMFileSpan getSpanOverlapping(Bin bin) {
- return new BAMFileSpan(getBinChunks(bin));
- }
-
- @Override
- public BAMFileSpan getSpanOverlapping(int referenceIndex, int startPos, int endPos) {
- BinList binList = getBinsOverlapping(referenceIndex, startPos, endPos);
- BAMFileSpan result = new BAMFileSpan();
- Set<Chunk> savedChunks = new HashSet<Chunk>();
- for (Bin bin : binList) {
- List<Chunk> chunks = getSpanOverlapping(bin).getChunks();
- for (Chunk chunk : chunks) {
- if (!savedChunks.contains(chunk)) {
- savedChunks.add(chunk);
- result.add(chunk);
- }
- }
- }
-
- return result;
- }
-
- /**
- * @return a position where aligned fragments end
- */
- @Override
- public long getStartOfLastLinearBin() {
- int numberOfReferences = recordRangeInfo.getReferenceLengthsAligned().size();
- long refOffset = recordRangeInfo.getReferenceOffsets().get(numberOfReferences - 1);
- long lastChunkNumber = recordRangeInfo.getReferenceLengthsAligned().get(numberOfReferences - 1) / SRA_CHUNK_SIZE;
- return lastChunkNumber * SRA_CHUNK_SIZE + refOffset;
- }
-
- @Override
- public BAMIndexMetaData getMetaData(int reference) {
- throw new UnsupportedOperationException("Getting of BAM index metadata for SRA is not implemented");
- }
-
- @Override
- public void close() { }
-
- /**
- * @param bin Requested bin
- * @return chunks that represent all bases of requested bin
- */
- private List<Chunk> getBinChunks(Bin bin) {
- if (bin.containsChunks()) {
- return bin.getChunkList();
- }
-
- if (bin.getBinNumber() < SRA_BIN_INDEX_OFFSET) {
- throw new RuntimeException("SRA only supports bins from the last level");
- }
- int binNumber = bin.getBinNumber() - SRA_BIN_INDEX_OFFSET;
- long refOffset = recordRangeInfo.getReferenceOffsets().get(bin.getReferenceSequence());
-
- // move requested position MAX_FRAGMENT_OVERLAP bases behind, so that we take all the reads that overlap requested position
- int firstChunkCorrection = binNumber == 0 ? 0 : -MAX_FRAGMENT_OVERLAP;
-
- long binGlobalOffset = binNumber * SRA_BIN_SIZE + refOffset;
- long firstChunkNumber = (binGlobalOffset + firstChunkCorrection) / SRA_CHUNK_SIZE;
- long lastChunkNumber = (binGlobalOffset + SRA_BIN_SIZE - 1) / SRA_CHUNK_SIZE;
- List<Chunk> chunks = new ArrayList<Chunk>();
- for (long chunkNumber = firstChunkNumber; chunkNumber <= lastChunkNumber; chunkNumber++) {
- chunks.add(new Chunk(chunkNumber * SRA_CHUNK_SIZE, (chunkNumber + 1) * SRA_CHUNK_SIZE));
- }
-
- return chunks;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SRAIterator.java b/src/main/java/htsjdk/samtools/SRAIterator.java
deleted file mode 100644
index 9fbbc97..0000000
--- a/src/main/java/htsjdk/samtools/SRAIterator.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-/**
- * Created by andrii.nikitiuk on 8/11/15.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMFileHeader.SortOrder;
-
-import htsjdk.samtools.sra.ReferenceCache;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.sra.SRAAlignmentIterator;
-import htsjdk.samtools.sra.SRAUnalignmentIterator;
-import htsjdk.samtools.sra.SRAUtils;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * SRA iterator which returns SAMRecords for requested list of chunks
- */
-public class SRAIterator implements SAMRecordIterator {
- private ValidationStringency validationStringency;
-
- private SRAAccession accession;
- private ReadCollection run;
- private SAMFileHeader header;
- private ReferenceCache cachedReferences;
- private RecordRangeInfo recordRangeInfo;
- private Iterator<Chunk> chunksIterator;
- private Chunk currentChunk;
-
- private SRAAlignmentIterator alignmentIterator;
- private SRAUnalignmentIterator unalignmentIterator;
-
- /**
- * Describes record ranges info needed for emulating BAM index
- */
- public static class RecordRangeInfo {
- private List<Long> referenceOffsets;
- private List<Long> referenceLengthsAligned;
- private long totalReferencesLength;
- private long numberOfReads; // is used for unaligned read space
- private long totalRecordRangeLength;
-
- /**
- * @param referenceLengthsAligned a list with lengths of each reference
- * @param numberOfReads total number of reads within SRA archive
- */
- public RecordRangeInfo(List<Long> referenceLengthsAligned, long numberOfReads) {
- this.numberOfReads = numberOfReads;
- this.referenceLengthsAligned = referenceLengthsAligned;
-
- referenceOffsets = new ArrayList<Long>();
-
- totalReferencesLength = 0;
- for (Long refLen : referenceLengthsAligned) {
- referenceOffsets.add(totalReferencesLength);
- totalReferencesLength += refLen;
- }
-
- totalRecordRangeLength = totalReferencesLength + this.numberOfReads;
- }
-
- public long getNumberOfReads() {
- return numberOfReads;
- }
-
- public long getTotalReferencesLength() {
- return totalReferencesLength;
- }
-
- public long getTotalRecordRangeLength() {
- return totalRecordRangeLength;
- }
-
- public final List<Long> getReferenceOffsets() {
- return Collections.unmodifiableList(referenceOffsets);
- }
-
- public final List<Long> getReferenceLengthsAligned() {
- return Collections.unmodifiableList(referenceLengthsAligned);
- }
- }
-
- /**
- * Loads record ranges needed for emulating BAM index
- * @param run read collection
- * @return record ranges
- */
- public static RecordRangeInfo getRecordsRangeInfo(ReadCollection run) {
- try {
- return new RecordRangeInfo(SRAUtils.getReferencesLengthsAligned(run), SRAUtils.getNumberOfReads(run));
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * @param run opened read collection
- * @param header sam header
- * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader
- * @param recordRangeInfo info about record ranges withing SRA archive
- * @param chunks used to determine which records the iterator should return
- */
- public SRAIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences,
- final RecordRangeInfo recordRangeInfo, final List<Chunk> chunks) {
- this.accession = accession;
- this.run = run;
- this.header = header;
- this.cachedReferences = cachedReferences;
- this.recordRangeInfo = recordRangeInfo;
- chunksIterator = chunks.iterator();
- if (chunksIterator.hasNext()) {
- currentChunk = chunksIterator.next();
- }
-
- hasNext();
- }
-
- /**
- * NGS iterators implement a single method "nextObject" which return true if the operation was successful or
- * false if there are no more objects available.
- * That means that there is no way to check "hasNext" without actually moving the iterator forward.
- * Because of that all the logic of moving iterator forward is actually happens in "hasNext".
- *
- * Here is explanation of how it works:
- * Iterator holds a list of chunks of requested records. Here we have chunksIterator that walks though that list.
- * We walk though that list using chunksIterator. If current chunk can represent aligned fragments then we create
- * SRAAlignmentIterator iterator, pass the chunk into it and ask if it can find any record. If record was found,
- * we say that we have next; otherwise we check if the chunk can represent unaligned fragments and then create
- * SRAUnalignmentIterator if so and do the same steps as with alignemnt iterator.
- *
- * If record was not found in both SRAAlignmentIterator and SRAUnalignmentIterator (it is possible that reference
- * range has no alignments or that reads range has all aligned fragment), we try the next chunk.
- *
- * When there are no more chunks and both iterators have no more records we return false.
- *
- * @return true if there are more records available
- */
- @Override
- public boolean hasNext() {
- while (currentChunk != null) {
- if (alignmentIterator == null) {
- if (currentChunk.getChunkStart() < recordRangeInfo.getTotalReferencesLength()) {
- alignmentIterator = new SRAAlignmentIterator(accession, run, header, cachedReferences, recordRangeInfo, currentChunk);
- if (validationStringency != null) {
- alignmentIterator.setValidationStringency(validationStringency);
- }
- }
- }
-
- if (alignmentIterator != null && alignmentIterator.hasNext()) {
- return true;
- }
-
- if (unalignmentIterator == null) {
- if (currentChunk.getChunkEnd() > recordRangeInfo.getTotalReferencesLength()) {
- unalignmentIterator = new SRAUnalignmentIterator(accession, run, header, recordRangeInfo, currentChunk);
- if (validationStringency != null) {
- unalignmentIterator.setValidationStringency(validationStringency);
- }
- }
- }
- if (unalignmentIterator != null && unalignmentIterator.hasNext()) {
- return true;
- }
-
- if (alignmentIterator != null) {
- alignmentIterator.close();
- }
- alignmentIterator = null;
- unalignmentIterator = null;
- if (chunksIterator.hasNext()) {
- currentChunk = chunksIterator.next();
- } else {
- currentChunk = null;
- }
- }
- return false;
- }
-
- /**
- * Call hasNext to make sure that one of inner iterators points to the next record, the retrieve the record from
- * one of them.
- * @return lazy SRA record
- */
- @Override
- public SAMRecord next() {
- if (!hasNext()) {
- throw new NoSuchElementException("No more records are available in SRAIterator");
- }
-
- if (alignmentIterator != null && alignmentIterator.hasNext()) {
- return alignmentIterator.next();
- }
-
- return unalignmentIterator.next();
- }
-
- @Override
- public void remove() { throw new UnsupportedOperationException("Removal of records not implemented."); }
-
- @Override
- public void close() {
- if (alignmentIterator != null) {
- alignmentIterator.close();
- alignmentIterator = null;
- }
- }
-
- @Override
- public SAMRecordIterator assertSorted(final SortOrder sortOrder) { throw new UnsupportedOperationException("assertSorted is not implemented."); }
-
- public void setValidationStringency(ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
-
- if (alignmentIterator != null) {
- alignmentIterator.setValidationStringency(validationStringency);
- }
- if (unalignmentIterator != null) {
- unalignmentIterator.setValidationStringency(validationStringency);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java b/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java
deleted file mode 100644
index b3f588c..0000000
--- a/src/main/java/htsjdk/samtools/SamFileHeaderMerger.java
+++ /dev/null
@@ -1,786 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Merges SAMFileHeaders that have the same sequences into a single merged header
- * object while providing read group translation for cases where read groups
- * clash across input headers.
- */
-public class SamFileHeaderMerger {
-
- /**
- * A 4-digit base 36 number is going to be attached to colliding SAMFileHeaderRecords,
- * To do this we first create an array of values to convert integer remainders into
- * base 36 values, we use base 36 because we have 10 digits and 26 numbers
- */
- private static final char[] INT_TO_BASE36 = new char[36];
-
- static {
- int aVal = (int) 'A';
- int zeroVal = (int) '0';
-
- for (int i = 0; i < 10; i++) {
- INT_TO_BASE36[i] = (char) (zeroVal + i);
- }
-
- for (int i = 0; i < 26; i++) {
- INT_TO_BASE36[i + 10] = (char) (aVal + i);
- }
- }
-
- //Super Header to construct
- private final SAMFileHeader mergedHeader;
- private Collection<SamReader> readers;
- private final Collection<SAMFileHeader> headers;
- private int recordCounter;
-
- //Translation of old group ids to new group ids
- private final Map<SAMFileHeader, Map<String, String>> samReadGroupIdTranslation =
- new IdentityHashMap<SAMFileHeader, Map<String, String>>();
-
- //the read groups from different files use the same group ids
- private boolean hasReadGroupCollisions = false;
-
- //the program records from different files use the same program record ids
- private boolean hasProgramGroupCollisions = false;
-
- //Translation of old program group ids to new program group ids
- private final Map<SAMFileHeader, Map<String, String>> samProgramGroupIdTranslation =
- new IdentityHashMap<SAMFileHeader, Map<String, String>>();
-
- private boolean hasMergedSequenceDictionary = false;
-
- // Translation of old sequence dictionary ids to new dictionary ids
- // This is an IdentityHashMap because it can be quite expensive to compute the hashCode for
- // large SAMFileHeaders. It is possible that two input files will have identical headers so that
- // the regular HashMap would fold them together, but the value stored in each of the two
- // Map entries will be the same, so it should not hurt anything.
- private final Map<SAMFileHeader, Map<Integer, Integer>> samSeqDictionaryIdTranslationViaHeader =
- new IdentityHashMap<SAMFileHeader, Map<Integer, Integer>>();
-
- //HeaderRecordFactory that creates SAMReadGroupRecord instances.
- private static final HeaderRecordFactory<SAMReadGroupRecord> READ_GROUP_RECORD_FACTORY = new HeaderRecordFactory<SAMReadGroupRecord>() {
- public SAMReadGroupRecord createRecord(final String id, final SAMReadGroupRecord srcReadGroupRecord) {
- return new SAMReadGroupRecord(id, srcReadGroupRecord);
- }
- };
-
- //HeaderRecordFactory that creates SAMProgramRecord instances.
- private static final HeaderRecordFactory<SAMProgramRecord> PROGRAM_RECORD_FACTORY = new HeaderRecordFactory<SAMProgramRecord>() {
- public SAMProgramRecord createRecord(final String id, final SAMProgramRecord srcProgramRecord) {
- return new SAMProgramRecord(id, srcProgramRecord);
- }
- };
-
- //comparator used to sort lists of program group and read group records
- private static final Comparator<AbstractSAMHeaderRecord> RECORD_ID_COMPARATOR = new Comparator<AbstractSAMHeaderRecord>() {
- public int compare(final AbstractSAMHeaderRecord o1, final AbstractSAMHeaderRecord o2) {
- return o1.getId().compareTo(o2.getId());
- }
- };
-
- /**
- * Create SAMFileHeader with additional information. Required that sequence dictionaries agree.
- *
- * @param readers sam file readers to combine
- * @param sortOrder sort order new header should have
- * @deprecated replaced by {@link #SamFileHeaderMerger(SAMFileHeader.SortOrder, Collection, boolean)}
- */
- @Deprecated
- public SamFileHeaderMerger(final Collection<SamReader> readers, final SAMFileHeader.SortOrder sortOrder) {
- this(readers, sortOrder, false);
- }
-
- /**
- * Create SAMFileHeader with additional information.
- *
- * @param readers sam file readers to combine
- * @param sortOrder sort order new header should have
- * @param mergeDictionaries If true, merge sequence dictionaries in new header. If false, require that
- * all input sequence dictionaries be identical.
- * @deprecated replaced by {@link #SamFileHeaderMerger(SAMFileHeader.SortOrder, Collection, boolean)}
- */
- @Deprecated
- public SamFileHeaderMerger(final Collection<SamReader> readers, final SAMFileHeader.SortOrder sortOrder, final boolean mergeDictionaries) {
- this(sortOrder, getHeadersFromReaders(readers), mergeDictionaries);
- this.readers = readers;
- }
-
- /**
- * Create SAMFileHeader with additional information.. This is the preferred constructor.
- *
- * @param sortOrder sort order new header should have
- * @param headers sam file headers to combine
- * @param mergeDictionaries If true, merge sequence dictionaries in new header. If false, require that
- * all input sequence dictionaries be identical.
- */
- public SamFileHeaderMerger(final SAMFileHeader.SortOrder sortOrder, final Collection<SAMFileHeader> headers, final boolean mergeDictionaries) {
- this.headers = new LinkedHashSet<SAMFileHeader>(headers);
- this.mergedHeader = new SAMFileHeader();
-
- SAMSequenceDictionary sequenceDictionary;
- try {
- sequenceDictionary = getSequenceDictionary(headers);
- this.hasMergedSequenceDictionary = false;
- } catch (SequenceUtil.SequenceListsDifferException pe) {
- if (mergeDictionaries) {
- sequenceDictionary = mergeSequenceDictionaries(headers);
- this.hasMergedSequenceDictionary = true;
- } else {
- throw pe;
- }
- }
-
- this.mergedHeader.setSequenceDictionary(sequenceDictionary);
-
- // Set program that creates input alignments
- for (final SAMProgramRecord program : mergeProgramGroups(headers)) {
- this.mergedHeader.addProgramRecord(program);
- }
-
- // Set read groups for merged header
- final List<SAMReadGroupRecord> readGroups = mergeReadGroups(headers);
- this.mergedHeader.setReadGroups(readGroups);
- this.mergedHeader.setGroupOrder(SAMFileHeader.GroupOrder.none);
-
- this.mergedHeader.setSortOrder(sortOrder);
-
- for (final SAMFileHeader header : headers) {
- for (final String comment : header.getComments()) {
- this.mergedHeader.addComment(comment);
- }
- }
- }
-
- // Utility method to make use with old constructor
- private static List<SAMFileHeader> getHeadersFromReaders(final Collection<SamReader> readers) {
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>(readers.size());
- for (final SamReader reader : readers) {
- headers.add(reader.getFileHeader());
- }
- return headers;
- }
-
-
- /**
- * Checks to see if there are clashes where different readers are using the same read
- * group IDs. If yes, then those IDs that collided are remapped.
- *
- * @param headers headers to combine
- * @return new list of read groups constructed from all the readers
- */
- private List<SAMReadGroupRecord> mergeReadGroups(final Collection<SAMFileHeader> headers) {
- //prepare args for mergeHeaderRecords(..) call
- final HashSet<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
- final List<HeaderRecordAndFileHeader<SAMReadGroupRecord>> readGroupsToProcess = new LinkedList<HeaderRecordAndFileHeader<SAMReadGroupRecord>>();
- for (final SAMFileHeader header : headers) {
- for (final SAMReadGroupRecord readGroup : header.getReadGroups()) {
- //verify that there are no existing id collisions in this input file
- if (!idsThatAreAlreadyTaken.add(readGroup.getId()))
- throw new SAMException("Input file: " + header + " contains more than one RG with the same id (" + readGroup.getId() + ")");
-
- readGroupsToProcess.add(new HeaderRecordAndFileHeader<SAMReadGroupRecord>(readGroup, header));
- }
- idsThatAreAlreadyTaken.clear();
- }
-
- final List<SAMReadGroupRecord> result = new LinkedList<SAMReadGroupRecord>();
-
- recordCounter = 0;
- hasReadGroupCollisions = mergeHeaderRecords(readGroupsToProcess, READ_GROUP_RECORD_FACTORY, idsThatAreAlreadyTaken, samReadGroupIdTranslation, result);
-
- //sort the result list by record id
- Collections.sort(result, RECORD_ID_COMPARATOR);
-
- return result;
- }
-
-
- /**
- * Checks to see if there are clashes where different readers are using the same program
- * group IDs. If yes, then those IDs that collided are remapped.
- *
- * @param headers headers to combine
- * @return new list of program groups constructed from all the readers
- */
- private List<SAMProgramRecord> mergeProgramGroups(final Collection<SAMFileHeader> headers) {
-
- final List<SAMProgramRecord> overallResult = new LinkedList<SAMProgramRecord>();
-
- //this Set will accumulate all SAMProgramRecord ids that have been encountered so far.
- final HashSet<String> idsThatAreAlreadyTaken = new HashSet<String>();
-
- //need to process all program groups
- List<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcess = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
- for (final SAMFileHeader header : headers) {
- for (final SAMProgramRecord programGroup : header.getProgramRecords()) {
- //verify that there are no existing id collisions in this input file
- if (!idsThatAreAlreadyTaken.add(programGroup.getId()))
- throw new SAMException("Input file: " + header + " contains more than one PG with the same id (" + programGroup.getId() + ")");
-
- programGroupsLeftToProcess.add(new HeaderRecordAndFileHeader<SAMProgramRecord>(programGroup, header));
- }
- idsThatAreAlreadyTaken.clear();
- }
-
- recordCounter = 0;
-
- //A program group header (lets say ID=2 PN=B PP=1) may have a PP (previous program) attribute which chains it to
- //another program group header (lets say ID=1 PN=A) to indicate that the given file was
- //processed by program A followed by program B. These PP attributes potentially
- //connect headers into one or more tree structures. Merging is done by
- //first merging all headers that don't have PP attributes (eg. tree roots),
- //then updating and merging all headers whose PPs point to the tree-root headers,
- //and so on until all program group headers are processed.
-
- //currentProgramGroups is the list of records to merge next. Start by merging the programGroups that don't have a PP attribute (eg. the tree roots).
- List<HeaderRecordAndFileHeader<SAMProgramRecord>> currentProgramGroups = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
- for (final Iterator<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) {
- final HeaderRecordAndFileHeader<SAMProgramRecord> pair = programGroupsLeftToProcessIterator.next();
- if (pair.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG) == null) {
- programGroupsLeftToProcessIterator.remove();
- currentProgramGroups.add(pair);
- }
- }
-
- //merge currentProgramGroups
- while (!currentProgramGroups.isEmpty()) {
- final List<SAMProgramRecord> currentResult = new LinkedList<SAMProgramRecord>();
-
- hasProgramGroupCollisions |= mergeHeaderRecords(currentProgramGroups, PROGRAM_RECORD_FACTORY, idsThatAreAlreadyTaken, samProgramGroupIdTranslation, currentResult);
-
- //add currentResults to overallResults
- overallResult.addAll(currentResult);
-
- //apply the newly-computed id translations to currentProgramGroups and programGroupsLeftToProcess
- currentProgramGroups = translateIds(currentProgramGroups, samProgramGroupIdTranslation, false);
- programGroupsLeftToProcess = translateIds(programGroupsLeftToProcess, samProgramGroupIdTranslation, true);
-
- //find all records in programGroupsLeftToProcess whose ppId points to a record that was just processed (eg. a record that's in currentProgramGroups),
- //and move them to the list of programGroupsToProcessNext.
- final LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsToProcessNext = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
- for (final Iterator<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroupsLeftToProcessIterator = programGroupsLeftToProcess.iterator(); programGroupsLeftToProcessIterator.hasNext(); ) {
- final HeaderRecordAndFileHeader<SAMProgramRecord> pairLeftToProcess = programGroupsLeftToProcessIterator.next();
- final Object ppIdOfRecordLeftToProcess = pairLeftToProcess.getHeaderRecord().getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG);
- //find what currentProgramGroups this ppId points to (NOTE: they have to come from the same file)
- for (final HeaderRecordAndFileHeader<SAMProgramRecord> justProcessedPair : currentProgramGroups) {
- final String idJustProcessed = justProcessedPair.getHeaderRecord().getId();
- if (pairLeftToProcess.getFileHeader() == justProcessedPair.getFileHeader() && ppIdOfRecordLeftToProcess.equals(idJustProcessed)) {
- programGroupsLeftToProcessIterator.remove();
- programGroupsToProcessNext.add(pairLeftToProcess);
- break;
- }
- }
- }
-
- currentProgramGroups = programGroupsToProcessNext;
- }
-
- //verify that all records were processed
- if (!programGroupsLeftToProcess.isEmpty()) {
- final StringBuffer errorMsg = new StringBuffer(programGroupsLeftToProcess.size() + " program groups weren't processed. Do their PP ids point to existing PGs? \n");
- for (final HeaderRecordAndFileHeader<SAMProgramRecord> pair : programGroupsLeftToProcess) {
- final SAMProgramRecord record = pair.getHeaderRecord();
- errorMsg.append("@PG ID:" + record.getProgramGroupId() + " PN:" + record.getProgramName() + " PP:" + record.getPreviousProgramGroupId() + "\n");
- }
- throw new SAMException(errorMsg.toString());
- }
-
- //sort the result list by record id
- Collections.sort(overallResult, RECORD_ID_COMPARATOR);
-
- return overallResult;
- }
-
-
- /**
- * Utility method that takes a list of program groups and remaps all their
- * ids (including ppIds if requested) using the given idTranslationTable.
- * <p/>
- * NOTE: when remapping, this method creates new SAMProgramRecords and
- * doesn't mutate any records in the programGroups list.
- *
- * @param programGroups The program groups to translate.
- * @param idTranslationTable The translation table.
- * @param translatePpIds Whether ppIds should be translated as well.
- * @return The list of translated records.
- */
- private List<HeaderRecordAndFileHeader<SAMProgramRecord>> translateIds(
- final List<HeaderRecordAndFileHeader<SAMProgramRecord>> programGroups,
- final Map<SAMFileHeader, Map<String, String>> idTranslationTable,
- final boolean translatePpIds) {
-
- //go through programGroups and translate any IDs and PPs based on the idTranslationTable.
- final List<HeaderRecordAndFileHeader<SAMProgramRecord>> result = new LinkedList<HeaderRecordAndFileHeader<SAMProgramRecord>>();
- for (final HeaderRecordAndFileHeader<SAMProgramRecord> pair : programGroups) {
- final SAMProgramRecord record = pair.getHeaderRecord();
- final String id = record.getProgramGroupId();
- final String ppId = (String) record.getAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG);
-
- final SAMFileHeader header = pair.getFileHeader();
- final Map<String, String> translations = idTranslationTable.get(header);
-
- //see if one or both ids need to be translated
- SAMProgramRecord translatedRecord = null;
- if (translations != null) {
- final String translatedId = translations.get(id);
- final String translatedPpId = translatePpIds ? translations.get(ppId) : null;
-
- final boolean needToTranslateId = translatedId != null && !translatedId.equals(id);
- final boolean needToTranslatePpId = translatedPpId != null && !translatedPpId.equals(ppId);
-
- if (needToTranslateId && needToTranslatePpId) {
- translatedRecord = new SAMProgramRecord(translatedId, record);
- translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId);
- } else if (needToTranslateId) {
- translatedRecord = new SAMProgramRecord(translatedId, record);
- } else if (needToTranslatePpId) {
- translatedRecord = new SAMProgramRecord(id, record);
- translatedRecord.setAttribute(SAMProgramRecord.PREVIOUS_PROGRAM_GROUP_ID_TAG, translatedPpId);
- }
- }
-
- if (translatedRecord != null) {
- result.add(new HeaderRecordAndFileHeader<SAMProgramRecord>(translatedRecord, header));
- } else {
- result.add(pair); //keep the original record
- }
- }
-
- return result;
- }
-
-
- /**
- * Utility method for merging a List of AbstractSAMHeaderRecords. If it finds
- * records that have identical ids and attributes, it will collapse them
- * into one record. If it finds records that have identical ids but
- * non-identical attributes, this is treated as a collision. When collision happens,
- * the records' ids are remapped, and an old-id to new-id mapping is added to the idTranslationTable.
- * <p/>
- * NOTE: Non-collided records also get recorded in the idTranslationTable as
- * old-id to old-id. This way, an idTranslationTable lookup should never return null.
- *
- * @param headerRecords The header records to merge.
- * @param headerRecordFactory Constructs a specific subclass of AbstractSAMHeaderRecord.
- * @param idsThatAreAlreadyTaken If the id of a headerRecord matches an id in this set, it will be treated as a collision, and the headRecord's id will be remapped.
- * @param idTranslationTable When records collide, their ids are remapped, and an old-id to new-id
- * mapping is added to the idTranslationTable. Non-collided records also get recorded in the idTranslationTable as
- * old-id to old-id. This way, an idTranslationTable lookup should never return null.
- * @param result The list of merged header records.
- * @return True if there were collisions.
- */
- private <RecordType extends AbstractSAMHeaderRecord> boolean mergeHeaderRecords(final List<HeaderRecordAndFileHeader<RecordType>> headerRecords, final HeaderRecordFactory<RecordType> headerRecordFactory,
- final HashSet<String> idsThatAreAlreadyTaken, final Map<SAMFileHeader, Map<String, String>> idTranslationTable, final List<RecordType> result) {
-
- //The outer Map bins the header records by their ids. The nested Map further collapses
- //header records which, in addition to having the same id, also have identical attributes.
- //In other words, each key in the nested map represents one or more
- //header records which have both identical ids and identical attributes. The List of
- //SAMFileHeaders keeps track of which readers these header record(s) came from.
- final Map<String, Map<RecordType, List<SAMFileHeader>>> idToRecord =
- new LinkedHashMap<String, Map<RecordType, List<SAMFileHeader>>>();
-
- //Populate the idToRecord and seenIds data structures
- for (final HeaderRecordAndFileHeader<RecordType> pair : headerRecords) {
- final RecordType record = pair.getHeaderRecord();
- final SAMFileHeader header = pair.getFileHeader();
- final String recordId = record.getId();
- Map<RecordType, List<SAMFileHeader>> recordsWithSameId = idToRecord.get(recordId);
- if (recordsWithSameId == null) {
- recordsWithSameId = new LinkedHashMap<RecordType, List<SAMFileHeader>>();
- idToRecord.put(recordId, recordsWithSameId);
- }
-
- List<SAMFileHeader> fileHeaders = recordsWithSameId.get(record);
- if (fileHeaders == null) {
- fileHeaders = new LinkedList<SAMFileHeader>();
- recordsWithSameId.put(record, fileHeaders);
- }
-
- fileHeaders.add(header);
- }
-
- //Resolve any collisions between header records by remapping their ids.
- boolean hasCollisions = false;
- for (final Map.Entry<String, Map<RecordType, List<SAMFileHeader>>> entry : idToRecord.entrySet()) {
- final String recordId = entry.getKey();
- final Map<RecordType, List<SAMFileHeader>> recordsWithSameId = entry.getValue();
-
-
- for (final Map.Entry<RecordType, List<SAMFileHeader>> recordWithUniqueAttr : recordsWithSameId.entrySet()) {
- final RecordType record = recordWithUniqueAttr.getKey();
- final List<SAMFileHeader> fileHeaders = recordWithUniqueAttr.getValue();
-
- String newId;
- if (!idsThatAreAlreadyTaken.contains(recordId)) {
- //don't remap 1st record. If there are more records
- //with this id, they will be remapped in the 'else'.
- newId = recordId;
- idsThatAreAlreadyTaken.add(recordId);
- ++recordCounter;
- } else {
- //there is more than one record with this id.
- hasCollisions = true;
-
- //Below we tack on one of roughly 1.7 million possible 4 digit base36 at random we do this because
- //our old process of just counting from 0 upward and adding that to the previous id led to 1000s of hits on
- //idsThatAreAlreadyTaken.contains just to resolve 1 collision when merging 1000s of similarly processed bams
- while (idsThatAreAlreadyTaken.contains(newId = recordId + "." + positiveFourDigitBase36Str(recordCounter++))) ;
-
- idsThatAreAlreadyTaken.add(newId);
- }
-
- for (final SAMFileHeader fileHeader : fileHeaders) {
- Map<String, String> readerTranslationTable = idTranslationTable.get(fileHeader);
- if (readerTranslationTable == null) {
- readerTranslationTable = new HashMap<String, String>();
- idTranslationTable.put(fileHeader, readerTranslationTable);
- }
- readerTranslationTable.put(recordId, newId);
- }
-
- result.add(headerRecordFactory.createRecord(newId, record));
- }
- }
-
- return hasCollisions;
- }
-
- /**
- * Convert an integer to base36, protected solely for testing
- *
- * @param leftOver Both the initial value and the running quotient
- * @return A four digit string composed of base 36 symbols
- */
- public static String positiveFourDigitBase36Str(int leftOver) {
- if (leftOver == 0) {
- return "0";
- }
-
- final StringBuilder builder = new StringBuilder(10);
-
- while (leftOver > 0) {
- final int valueIndex = leftOver % 36;
- builder.append(INT_TO_BASE36[valueIndex]);
- leftOver /= 36;
- }
-
- return builder.reverse().toString();
- }
-
-
- /**
- * Get the sequences off the SAMFileHeader. Throws runtime exception if the sequence
- * are different from one another.
- *
- * @param headers headers to pull sequences from
- * @return sequences from files. Each file should have the same sequence
- */
- private SAMSequenceDictionary getSequenceDictionary(final Collection<SAMFileHeader> headers) {
- SAMSequenceDictionary sequences = null;
- for (final SAMFileHeader header : headers) {
-
- if (sequences == null) {
- sequences = header.getSequenceDictionary();
- } else {
- final SAMSequenceDictionary currentSequences = header.getSequenceDictionary();
- SequenceUtil.assertSequenceDictionariesEqual(sequences, currentSequences);
- }
- }
-
- return sequences;
- }
-
- /**
- * Get the sequences from the SAMFileHeader, and merge the resulting sequence dictionaries.
- *
- * @param headers headers to pull sequences from
- * @return sequences from files. Each file should have the same sequence
- */
- private SAMSequenceDictionary mergeSequenceDictionaries(final Collection<SAMFileHeader> headers) {
- SAMSequenceDictionary sequences = new SAMSequenceDictionary();
- for (final SAMFileHeader header : headers) {
- final SAMSequenceDictionary currentSequences = header.getSequenceDictionary();
- sequences = mergeSequences(sequences, currentSequences);
- }
- // second pass, make a map of the original seqeunce id -> new sequence id
- createSequenceMapping(headers, sequences);
- return sequences;
- }
-
- /**
- * They've asked to merge the sequence headers. What we support right now is finding the sequence name superset.
- *
- * @param mergeIntoDict the result of merging so far. All SAMSequenceRecords in here have been cloned from the originals.
- * @param mergeFromDict A new sequence dictionary to merge into mergeIntoDict.
- * @return A new sequence dictionary that resulting from merging the two inputs.
- */
- private SAMSequenceDictionary mergeSequences(final SAMSequenceDictionary mergeIntoDict, final SAMSequenceDictionary mergeFromDict) {
-
- // a place to hold the sequences that we haven't found a home for, in the order the appear in mergeFromDict.
- final LinkedList<SAMSequenceRecord> holder = new LinkedList<SAMSequenceRecord>();
-
- // Return value will be created from this.
- final LinkedList<SAMSequenceRecord> resultingDict = new LinkedList<SAMSequenceRecord>();
- for (final SAMSequenceRecord sequenceRecord : mergeIntoDict.getSequences()) {
- resultingDict.add(sequenceRecord);
- }
-
- // Index into resultingDict of previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict.
- int prevloc = -1;
- // Previous SAMSequenceRecord from mergeFromDict that already existed in mergeIntoDict.
- SAMSequenceRecord previouslyMerged = null;
-
- for (final SAMSequenceRecord sequenceRecord : mergeFromDict.getSequences()) {
- // Does it already exist in resultingDict?
- final int loc = getIndexOfSequenceName(resultingDict, sequenceRecord.getSequenceName());
- if (loc == -1) {
- // If doesn't already exist in resultingDict, save it an decide where to insert it later.
- holder.add(sequenceRecord.clone());
- } else if (prevloc > loc) {
- // If sequenceRecord already exists in resultingDict, but prior to the previous one
- // from mergeIntoDict that already existed, cannot merge.
- throw new SAMException("Cannot merge sequence dictionaries because sequence " +
- sequenceRecord.getSequenceName() + " and " + previouslyMerged.getSequenceName() +
- " are in different orders in two input sequence dictionaries.");
- } else {
- // Since sequenceRecord already exists in resultingDict, don't need to add it.
- // Add in all the sequences prior to it that have been held in holder.
- resultingDict.addAll(loc, holder);
- // Remember the index of sequenceRecord so can check for merge incompatibility.
- prevloc = loc + holder.size();
- previouslyMerged = sequenceRecord;
- holder.clear();
- }
- }
- // Append anything left in holder.
- if (!holder.isEmpty()) {
- resultingDict.addAll(holder);
- }
- return new SAMSequenceDictionary(resultingDict);
- }
-
- /**
- * Find sequence in list.
- *
- * @param list List to search for the sequence name.
- * @param sequenceName Name to search for.
- * @return Index of SAMSequenceRecord with the given name in list, or -1 if not found.
- */
- private static int getIndexOfSequenceName(final List<SAMSequenceRecord> list, final String sequenceName) {
- for (int i = 0; i < list.size(); ++i) {
- if (list.get(i).getSequenceName().equals(sequenceName)) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * create the sequence mapping. This map is used to convert the unmerged header sequence ID's to the merged
- * list of sequence id's.
- *
- * @param headers the collections of headers.
- * @param masterDictionary the superset dictionary we've created.
- */
- private void createSequenceMapping(final Collection<SAMFileHeader> headers, final SAMSequenceDictionary masterDictionary) {
- final LinkedList<String> resultingDictStr = new LinkedList<>();
- for (final SAMSequenceRecord r : masterDictionary.getSequences()) {
- resultingDictStr.add(r.getSequenceName());
- }
- for (final SAMFileHeader header : headers) {
- final Map<Integer, Integer> seqMap = new HashMap<>();
- final SAMSequenceDictionary dict = header.getSequenceDictionary();
- for (final SAMSequenceRecord rec : dict.getSequences()) {
- seqMap.put(rec.getSequenceIndex(), resultingDictStr.indexOf(rec.getSequenceName()));
- }
- this.samSeqDictionaryIdTranslationViaHeader.put(header, seqMap);
- }
- }
-
-
- /**
- * Returns the read group id that should be used for the input read and RG id.
- *
- * @deprecated replaced by {@link #getReadGroupId(SAMFileHeader, String)}
- */
- @Deprecated
- public String getReadGroupId(final SamReader reader, final String originalReadGroupId) {
- return getReadGroupId(reader.getFileHeader(), originalReadGroupId);
- }
-
- /** Returns the read group id that should be used for the input read and RG id. */
- public String getReadGroupId(final SAMFileHeader header, final String originalReadGroupId) {
- return this.samReadGroupIdTranslation.get(header).get(originalReadGroupId);
- }
-
- /**
- * @param reader one of the input files
- * @param originalProgramGroupId a program group ID from the above input file
- * @return new ID from the merged list of program groups in the output file
- * @deprecated replaced by {@link #getProgramGroupId(SAMFileHeader, String)}
- */
- @Deprecated
- public String getProgramGroupId(final SamReader reader, final String originalProgramGroupId) {
- return getProgramGroupId(reader.getFileHeader(), originalProgramGroupId);
- }
-
- /**
- * @param header one of the input headers
- * @param originalProgramGroupId a program group ID from the above input file
- * @return new ID from the merged list of program groups in the output file
- */
- public String getProgramGroupId(final SAMFileHeader header, final String originalProgramGroupId) {
- return this.samProgramGroupIdTranslation.get(header).get(originalProgramGroupId);
- }
-
- /** Returns true if there are read group duplicates within the merged headers. */
- public boolean hasReadGroupCollisions() {
- return this.hasReadGroupCollisions;
- }
-
- /** Returns true if there are program group duplicates within the merged headers. */
- public boolean hasProgramGroupCollisions() {
- return hasProgramGroupCollisions;
- }
-
- /** @return if we've merged the sequence dictionaries, return true */
- public boolean hasMergedSequenceDictionary() {
- return hasMergedSequenceDictionary;
- }
-
- /** Returns the merged header that should be written to any output merged file. */
- public SAMFileHeader getMergedHeader() {
- return this.mergedHeader;
- }
-
- /**
- * Returns the collection of readers that this header merger is working with. May return null.
- *
- * @deprecated replaced by {@link #getHeaders()}
- */
- @Deprecated
- public Collection<SamReader> getReaders() {
- return this.readers;
- }
-
- /**
- * Returns the collection of readers that this header merger is working with.
- */
- public Collection<SAMFileHeader> getHeaders() {
- return this.headers;
- }
-
- /**
- * returns the new mapping for a specified reader, given it's old sequence index
- *
- * @param reader the reader
- * @param oldReferenceSequenceIndex the old sequence (also called reference) index
- * @return the new index value
- * @deprecated replaced by {@link #getMergedSequenceIndex(SAMFileHeader, Integer)}
- */
- @Deprecated
- public Integer getMergedSequenceIndex(final SamReader reader, final Integer oldReferenceSequenceIndex) {
- return this.getMergedSequenceIndex(reader.getFileHeader(), oldReferenceSequenceIndex);
- }
-
- /**
- * Another mechanism for getting the new sequence index, for situations in which the reader is not available.
- * Note that if the SAMRecord has already had its header replaced with the merged header, this won't work.
- *
- * @param header The original header for the input record in question.
- * @param oldReferenceSequenceIndex The original sequence index.
- * @return the new index value that is compatible with the merged sequence index.
- */
- public Integer getMergedSequenceIndex(final SAMFileHeader header, final Integer oldReferenceSequenceIndex) {
- final Map<Integer, Integer> mapping = this.samSeqDictionaryIdTranslationViaHeader.get(header);
- if (mapping == null) {
- throw new SAMException("No sequence dictionary mapping available for header: " + header);
- }
-
- final Integer newIndex = mapping.get(oldReferenceSequenceIndex);
- if (newIndex == null) {
- throw new SAMException("No mapping for reference index " + oldReferenceSequenceIndex + " from header: " + header);
- }
-
- return newIndex;
- }
-
-
- /**
- * Implementations of this interface are used by mergeHeaderRecords(..) to instantiate
- * specific subclasses of AbstractSAMHeaderRecord.
- */
- private interface HeaderRecordFactory<RecordType extends AbstractSAMHeaderRecord> {
-
- /**
- * Constructs a new instance of RecordType.
- *
- * @param id The id of the new record.
- * @param srcRecord Except for the id, the new record will be a copy of this source record.
- */
- RecordType createRecord(final String id, RecordType srcRecord);
- }
-
- /**
- * Struct that groups together a subclass of AbstractSAMHeaderRecord with the
- * SAMFileHeader that it came from.
- */
- private static class HeaderRecordAndFileHeader<RecordType extends AbstractSAMHeaderRecord> {
- private final RecordType headerRecord;
- private final SAMFileHeader samFileHeader;
-
- public HeaderRecordAndFileHeader(final RecordType headerRecord, final SAMFileHeader samFileHeader) {
- this.headerRecord = headerRecord;
- this.samFileHeader = samFileHeader;
- }
-
- public RecordType getHeaderRecord() {
- return headerRecord;
- }
-
- public SAMFileHeader getFileHeader() {
- return samFileHeader;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFileValidator.java b/src/main/java/htsjdk/samtools/SamFileValidator.java
deleted file mode 100644
index e40bfe9..0000000
--- a/src/main/java/htsjdk/samtools/SamFileValidator.java
+++ /dev/null
@@ -1,872 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009-2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.SAMValidationError.Type;
-import htsjdk.samtools.BamIndexValidator.IndexValidationStringency;
-import htsjdk.samtools.metrics.MetricBase;
-import htsjdk.samtools.metrics.MetricsFile;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileWalker;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FastqQualityFormat;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.samtools.util.QualityEncodingDetector;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Validates SAM files as follows:
- * <ul>
- * <li>checks sam file header for sequence dictionary</li>
- * <li>checks sam file header for read groups</li>
- * <li>for each sam record
- * <ul>
- * <li>reports error detected by SAMRecord.isValid()</li>
- * <li>validates NM (nucleotide differences) exists and matches reality</li>
- * <li>validates mate fields agree with data in the mate record</li>
- * </ul>
- * </li>
- * </ul>
- *
- * @author Doug Voet
- * @see SAMRecord#isValid()
- */
-public class SamFileValidator {
-
- private final static Log log = Log.getInstance(SamFileValidator.class);
-
- private final PrintWriter out;
- private Histogram<Type> errorsByType;
- private PairEndInfoMap pairEndInfoByName;
- private ReferenceSequenceFileWalker refFileWalker;
- private boolean verbose;
- private int maxVerboseOutput;
- private SAMSortOrderChecker orderChecker;
- private Set<Type> errorsToIgnore;
- private boolean ignoreWarnings;
- private boolean bisulfiteSequenced;
- private IndexValidationStringency indexValidationStringency;
- private boolean sequenceDictionaryEmptyAndNoWarningEmitted;
-
- private final int maxTempFiles;
-
- public SamFileValidator(final PrintWriter out, final int maxTempFiles) {
- this.out = out;
- this.maxTempFiles = maxTempFiles;
- this.errorsByType = new Histogram<>();
- this.refFileWalker = null;
- this.maxVerboseOutput = 100;
- this.indexValidationStringency = IndexValidationStringency.NONE;
- this.errorsToIgnore = EnumSet.noneOf(Type.class);
- this.verbose = false;
- this.ignoreWarnings = false;
- this.bisulfiteSequenced = false;
- this.sequenceDictionaryEmptyAndNoWarningEmitted = false;
- }
-
- Histogram<Type> getErrorsByType() {
- return errorsByType;
- }
-
- /**
- * Sets one or more error types that should not be reported on.
- */
- public void setErrorsToIgnore(final Collection<Type> types) {
- if (!types.isEmpty()) {
- this.errorsToIgnore = EnumSet.copyOf(types);
- }
- }
-
- public void setIgnoreWarnings(final boolean ignoreWarnings) {
- this.ignoreWarnings = ignoreWarnings;
- }
-
- /**
- * Outputs validation summary report to out.
- *
- * @param samReader records to validate
- * @param reference if null, NM tag validation is skipped
- * @return boolean true if there are no validation errors, otherwise false
- */
- public boolean validateSamFileSummary(final SamReader samReader, final ReferenceSequenceFile reference) {
- init(reference, samReader.getFileHeader());
-
- validateSamFile(samReader, out);
-
- boolean result = errorsByType.isEmpty();
-
- if (errorsByType.getCount() > 0) {
- // Convert to a histogram with String IDs so that WARNING: or ERROR: can be prepended to the error type.
- final Histogram<String> errorsAndWarningsByType = new Histogram<>("Error Type", "Count");
- for (final Histogram.Bin<Type> bin : errorsByType.values()) {
- errorsAndWarningsByType.increment(bin.getId().getHistogramString(), bin.getValue());
- }
- final MetricsFile<ValidationMetrics, String> metricsFile = new MetricsFile<ValidationMetrics, String>();
- errorsByType.setBinLabel("Error Type");
- errorsByType.setValueLabel("Count");
- metricsFile.setHistogram(errorsAndWarningsByType);
- metricsFile.write(out);
- }
- cleanup();
- return result;
- }
-
- /**
- * Outputs validation error details to out.
- *
- * @param samReader records to validate
- * @param reference if null, NM tag validation is skipped
- * processing will stop after this threshold has been reached
- * @return boolean true if there are no validation errors, otherwise false
- */
- public boolean validateSamFileVerbose(final SamReader samReader, final ReferenceSequenceFile reference) {
- init(reference, samReader.getFileHeader());
-
- try {
- validateSamFile(samReader, out);
- } catch (MaxOutputExceededException e) {
- out.println("Maximum output of [" + maxVerboseOutput + "] errors reached.");
- }
- boolean result = errorsByType.isEmpty();
- cleanup();
- return result;
- }
-
- public void validateBamFileTermination(final File inputFile) {
- BufferedInputStream inputStream = null;
- try {
- inputStream = IOUtil.toBufferedStream(new FileInputStream(inputFile));
- if (!BlockCompressedInputStream.isValidFile(inputStream)) {
- return;
- }
- final BlockCompressedInputStream.FileTermination terminationState =
- BlockCompressedInputStream.checkTermination(inputFile);
- if (terminationState.equals(BlockCompressedInputStream.FileTermination.DEFECTIVE)) {
- addError(new SAMValidationError(Type.TRUNCATED_FILE, "BAM file has defective last gzip block",
- inputFile.getPath()));
- } else if (terminationState.equals(BlockCompressedInputStream.FileTermination.HAS_HEALTHY_LAST_BLOCK)) {
- addError(new SAMValidationError(Type.BAM_FILE_MISSING_TERMINATOR_BLOCK,
- "Older BAM file -- does not have terminator block",
- inputFile.getPath()));
-
- }
- } catch (IOException e) {
- throw new SAMException("IOException", e);
- } finally {
- if (inputStream != null) {
- CloserUtil.close(inputStream);
- }
- }
- }
-
- private void validateSamFile(final SamReader samReader, final PrintWriter out) {
- try {
- validateHeader(samReader.getFileHeader());
- orderChecker = new SAMSortOrderChecker(samReader.getFileHeader().getSortOrder());
- validateSamRecordsAndQualityFormat(samReader, samReader.getFileHeader());
- validateUnmatchedPairs();
- if (indexValidationStringency != IndexValidationStringency.NONE) {
- try {
- if (indexValidationStringency == IndexValidationStringency.LESS_EXHAUSTIVE) {
- BamIndexValidator.lessExhaustivelyTestIndex(samReader);
- }
- else {
- BamIndexValidator.exhaustivelyTestIndex(samReader);
- }
- } catch (Exception e) {
- addError(new SAMValidationError(Type.INVALID_INDEX_FILE_POINTER, e.getMessage(), null));
- }
- }
-
- if (errorsByType.isEmpty()) {
- out.println("No errors found");
- }
- } finally {
- out.flush();
- }
- }
-
-
- /**
- * Report on reads marked as paired, for which the mate was not found.
- */
- private void validateUnmatchedPairs() {
- final InMemoryPairEndInfoMap inMemoryPairMap;
- if (pairEndInfoByName instanceof CoordinateSortedPairEndInfoMap) {
- // For the coordinate-sorted map, need to detect mate pairs in which the mateReferenceIndex on one end
- // does not match the readReference index on the other end, so the pairs weren't united and validated.
- inMemoryPairMap = new InMemoryPairEndInfoMap();
- CloseableIterator<Map.Entry<String, PairEndInfo>> it = ((CoordinateSortedPairEndInfoMap) pairEndInfoByName).iterator();
- while (it.hasNext()) {
- Map.Entry<String, PairEndInfo> entry = it.next();
- PairEndInfo pei = inMemoryPairMap.remove(entry.getValue().readReferenceIndex, entry.getKey());
- if (pei != null) {
- // Found a mismatch btw read.mateReferenceIndex and mate.readReferenceIndex
- List<SAMValidationError> errors = pei.validateMates(entry.getValue(), entry.getKey());
- for (final SAMValidationError error : errors) {
- addError(error);
- }
- } else {
- // Mate not found.
- inMemoryPairMap.put(entry.getValue().mateReferenceIndex, entry.getKey(), entry.getValue());
- }
- }
- it.close();
- } else {
- inMemoryPairMap = (InMemoryPairEndInfoMap) pairEndInfoByName;
- }
- // At this point, everything in InMemoryMap is a read marked as a pair, for which a mate was not found.
- for (final Map.Entry<String, PairEndInfo> entry : inMemoryPairMap) {
- addError(new SAMValidationError(Type.MATE_NOT_FOUND, "Mate not found for paired read", entry.getKey()));
- }
- }
-
- /**
- * SAM record and quality format validations are combined into a single method because validation must be completed
- * in only a single pass of the SamRecords (because a SamReader's iterator() method may not return the same
- * records on a subsequent call).
- */
- private void validateSamRecordsAndQualityFormat(final Iterable<SAMRecord> samRecords, final SAMFileHeader header) {
- final SAMRecordIterator iter = (SAMRecordIterator) samRecords.iterator();
- final ProgressLogger progress = new ProgressLogger(log, 10000000, "Validated Read");
- final QualityEncodingDetector qualityDetector = new QualityEncodingDetector();
- try {
- while (iter.hasNext()) {
- final SAMRecord record = iter.next();
-
- qualityDetector.add(record);
-
- final long recordNumber = progress.getCount() + 1;
- final Collection<SAMValidationError> errors = record.isValid();
- if (errors != null) {
- for (final SAMValidationError error : errors) {
- error.setRecordNumber(recordNumber);
- addError(error);
- }
- }
-
- validateMateFields(record, recordNumber);
- final boolean hasValidSortOrder = validateSortOrder(record, recordNumber);
- validateReadGroup(record, header);
- final boolean cigarIsValid = validateCigar(record, recordNumber);
- if (cigarIsValid) {
- try {
- validateNmTag(record, recordNumber);
- }
- catch (SAMException e) {
- if (hasValidSortOrder) {
- // If a CRAM file has an invalid sort order, the ReferenceFileWalker will throw a
- // SAMException due to an out of order request when retrieving reference bases during NM
- // tag validation; rethrow the exception only if the sort order is valid, otherwise
- // swallow the exception and carry on validating
- throw e;
- }
- }
- }
- validateSecondaryBaseCalls(record, recordNumber);
- validateTags(record, recordNumber);
- if (sequenceDictionaryEmptyAndNoWarningEmitted && !record.getReadUnmappedFlag()) {
- addError(new SAMValidationError(Type.MISSING_SEQUENCE_DICTIONARY, "Sequence dictionary is empty", null));
- sequenceDictionaryEmptyAndNoWarningEmitted = false;
-
- }
- progress.record(record);
- }
-
- try {
- if (progress.getCount() > 0) { // Avoid exception being thrown as a result of no qualities being read
- final FastqQualityFormat format = qualityDetector.generateBestGuess(QualityEncodingDetector.FileContext.SAM, FastqQualityFormat.Standard);
- if (format != FastqQualityFormat.Standard) {
- addError(new SAMValidationError(Type.INVALID_QUALITY_FORMAT, String.format("Detected %s quality score encoding, but expected %s.", format, FastqQualityFormat.Standard), null));
- }
- }
- } catch (SAMException e) {
- addError(new SAMValidationError(Type.INVALID_QUALITY_FORMAT, e.getMessage(), null));
- }
- } catch (SAMFormatException e) {
- // increment record number because the iterator behind the SamReader
- // reads one record ahead so we will get this failure one record ahead
- final String msg = "SAMFormatException on record " + progress.getCount() + 1;
- out.println(msg);
- throw new SAMException(msg, e);
- } catch (FileTruncatedException e) {
- addError(new SAMValidationError(Type.TRUNCATED_FILE, "File is truncated", null));
- } finally {
- iter.close();
- }
- }
-
- private void validateReadGroup(final SAMRecord record, final SAMFileHeader header) {
- final SAMReadGroupRecord rg = record.getReadGroup();
- if (rg == null) {
- addError(new SAMValidationError(Type.RECORD_MISSING_READ_GROUP,
- "A record is missing a read group", record.getReadName()));
- } else if (header.getReadGroup(rg.getId()) == null) {
- addError(new SAMValidationError(Type.READ_GROUP_NOT_FOUND,
- "A record has a read group not found in the header: ",
- record.getReadName() + ", " + rg.getReadGroupId()));
- }
- }
-
- /**
- * Report error if a tag value is a Long.
- */
- private void validateTags(final SAMRecord record, final long recordNumber) {
- for (final SAMRecord.SAMTagAndValue tagAndValue : record.getAttributes()) {
- if (tagAndValue.value instanceof Long) {
- addError(new SAMValidationError(Type.TAG_VALUE_TOO_LARGE,
- "Numeric value too large for tag " + tagAndValue.tag,
- record.getReadName(), recordNumber));
- }
- }
- }
-
- private void validateSecondaryBaseCalls(final SAMRecord record, final long recordNumber) {
- final String e2 = (String) record.getAttribute(SAMTag.E2.name());
- if (e2 != null) {
- if (e2.length() != record.getReadLength()) {
- addError(new SAMValidationError(Type.MISMATCH_READ_LENGTH_AND_E2_LENGTH,
- String.format("E2 tag length (%d) != read length (%d)", e2.length(), record.getReadLength()),
- record.getReadName(), recordNumber));
- }
- final byte[] bases = record.getReadBases();
- final byte[] secondaryBases = StringUtil.stringToBytes(e2);
- for (int i = 0; i < Math.min(bases.length, secondaryBases.length); ++i) {
- if (SequenceUtil.isNoCall(bases[i]) || SequenceUtil.isNoCall(secondaryBases[i])) {
- continue;
- }
- if (SequenceUtil.basesEqual(bases[i], secondaryBases[i])) {
- addError(new SAMValidationError(Type.E2_BASE_EQUALS_PRIMARY_BASE,
- String.format("Secondary base call (%c) == primary base call (%c)",
- (char) secondaryBases[i], (char) bases[i]),
- record.getReadName(), recordNumber));
- break;
- }
- }
- }
- final String u2 = (String) record.getAttribute(SAMTag.U2.name());
- if (u2 != null && u2.length() != record.getReadLength()) {
- addError(new SAMValidationError(Type.MISMATCH_READ_LENGTH_AND_U2_LENGTH,
- String.format("U2 tag length (%d) != read length (%d)", u2.length(), record.getReadLength()),
- record.getReadName(), recordNumber));
- }
- }
-
- private boolean validateCigar(final SAMRecord record, final long recordNumber) {
- if (record.getReadUnmappedFlag()) {
- return true;
- }
- return validateCigar(record, recordNumber, true);
- }
-
- private boolean validateMateCigar(final SAMRecord record, final long recordNumber) {
- return validateCigar(record, recordNumber, false);
- }
-
- private boolean validateCigar(final SAMRecord record, final long recordNumber, final boolean isReadCigar) {
- final ValidationStringency savedStringency = record.getValidationStringency();
- record.setValidationStringency(ValidationStringency.LENIENT);
- final List<SAMValidationError> errors = isReadCigar ? record.validateCigar(recordNumber) : SAMUtils.validateMateCigar(record, recordNumber);
- record.setValidationStringency(savedStringency);
- if (errors == null) {
- return true;
- }
- boolean valid = true;
- for (final SAMValidationError error : errors) {
- addError(error);
- valid = false;
- }
- return valid;
- }
-
-
- private boolean validateSortOrder(final SAMRecord record, final long recordNumber) {
- final SAMRecord prev = orderChecker.getPreviousRecord();
- boolean isValidSortOrder = orderChecker.isSorted(record);
- if (!isValidSortOrder) {
- addError(new SAMValidationError(
- Type.RECORD_OUT_OF_ORDER,
- String.format(
- "The record is out of [%s] order, prior read name [%s], prior coodinates [%d:%d]",
- record.getHeader().getSortOrder().name(),
- prev.getReadName(),
- prev.getReferenceIndex(),
- prev.getAlignmentStart()),
- record.getReadName(),
- recordNumber));
- }
- return isValidSortOrder;
- }
-
- private void init(final ReferenceSequenceFile reference, final SAMFileHeader header) {
- if (header.getSortOrder() == SAMFileHeader.SortOrder.coordinate) {
- this.pairEndInfoByName = new CoordinateSortedPairEndInfoMap();
- } else {
- this.pairEndInfoByName = new InMemoryPairEndInfoMap();
- }
- if (reference != null) {
- this.refFileWalker = new ReferenceSequenceFileWalker(reference);
- }
- }
-
- private void cleanup() {
- this.errorsByType = null;
- this.pairEndInfoByName = null;
- this.refFileWalker = null;
- }
-
- private void validateNmTag(final SAMRecord record, final long recordNumber) {
- if (!record.getReadUnmappedFlag()) {
- final Integer tagNucleotideDiffs = record.getIntegerAttribute(ReservedTagConstants.NM);
- if (tagNucleotideDiffs == null) {
- addError(new SAMValidationError(
- Type.MISSING_TAG_NM,
- "NM tag (nucleotide differences) is missing",
- record.getReadName(),
- recordNumber));
- } else if (refFileWalker != null) {
- final ReferenceSequence refSequence = refFileWalker.get(record.getReferenceIndex());
- final int actualNucleotideDiffs = SequenceUtil.calculateSamNmTag(record, refSequence.getBases(),
- 0, isBisulfiteSequenced());
-
- if (!tagNucleotideDiffs.equals(actualNucleotideDiffs)) {
- addError(new SAMValidationError(
- Type.INVALID_TAG_NM,
- "NM tag (nucleotide differences) in file [" + tagNucleotideDiffs +
- "] does not match reality [" + actualNucleotideDiffs + "]",
- record.getReadName(),
- recordNumber));
- }
- }
- }
- }
-
- private void validateMateFields(final SAMRecord record, final long recordNumber) {
- if (!record.getReadPairedFlag() || record.isSecondaryOrSupplementary()) {
- return;
- }
- validateMateCigar(record, recordNumber);
-
- final PairEndInfo pairEndInfo = pairEndInfoByName.remove(record.getReferenceIndex(), record.getReadName());
- if (pairEndInfo == null) {
- pairEndInfoByName.put(record.getMateReferenceIndex(), record.getReadName(), new PairEndInfo(record, recordNumber));
- } else {
- final List<SAMValidationError> errors =
- pairEndInfo.validateMates(new PairEndInfo(record, recordNumber), record.getReadName());
- for (final SAMValidationError error : errors) {
- addError(error);
- }
- }
- }
-
- private void validateHeader(final SAMFileHeader fileHeader) {
- for (final SAMValidationError error : fileHeader.getValidationErrors()) {
- addError(error);
- }
- if (fileHeader.getVersion() == null) {
- addError(new SAMValidationError(Type.MISSING_VERSION_NUMBER, "Header has no version number", null));
- } else if (!SAMFileHeader.ACCEPTABLE_VERSIONS.contains(fileHeader.getVersion())) {
- addError(new SAMValidationError(Type.INVALID_VERSION_NUMBER, "Header version: " +
- fileHeader.getVersion() + " does not match any of the acceptable versions: " +
- StringUtil.join(", ", SAMFileHeader.ACCEPTABLE_VERSIONS.toArray(new String[0])),
- null));
- }
- if (fileHeader.getSequenceDictionary().isEmpty()) {
- sequenceDictionaryEmptyAndNoWarningEmitted = true;
- }
- if (fileHeader.getReadGroups().isEmpty()) {
- addError(new SAMValidationError(Type.MISSING_READ_GROUP, "Read groups is empty", null));
- }
- final List<SAMProgramRecord> pgs = fileHeader.getProgramRecords();
- for (int i = 0; i < pgs.size() - 1; i++) {
- for (int j = i + 1; j < pgs.size(); j++) {
- if (pgs.get(i).getProgramGroupId().equals(pgs.get(j).getProgramGroupId())) {
- addError(new SAMValidationError(Type.DUPLICATE_PROGRAM_GROUP_ID, "Duplicate " +
- "program group id: " + pgs.get(i).getProgramGroupId(), null));
- }
- }
- }
-
- final List<SAMReadGroupRecord> rgs = fileHeader.getReadGroups();
- final Set<String> readGroupIDs = new HashSet<String>();
-
- for (final SAMReadGroupRecord record : rgs) {
- final String readGroupID = record.getReadGroupId();
- if (readGroupIDs.contains(readGroupID)) {
- addError(new SAMValidationError(Type.DUPLICATE_READ_GROUP_ID, "Duplicate " +
- "read group id: " + readGroupID, null));
- } else {
- readGroupIDs.add(readGroupID);
- }
-
- final String platformValue = record.getPlatform();
- if (platformValue == null || "".equals(platformValue)) {
- addError(new SAMValidationError(Type.MISSING_PLATFORM_VALUE,
- "A platform (PL) attribute was not found for read group ",
- readGroupID));
- }
- else {
- // NB: cannot be null, so not catching a NPE
- try {
- SAMReadGroupRecord.PlatformValue.valueOf(platformValue.toUpperCase());
- } catch (IllegalArgumentException e) {
- addError(new SAMValidationError(Type.INVALID_PLATFORM_VALUE,
- "The platform (PL) attribute (" + platformValue + ") + was not one of the valid values for read group ",
- readGroupID));
- }
- }
- }
- }
-
- private void addError(final SAMValidationError error) {
- // Just ignore an error if it's of a type we're not interested in
- if (this.errorsToIgnore.contains(error.getType())) return;
-
- if (this.ignoreWarnings && error.getType().severity == SAMValidationError.Severity.WARNING) return;
-
- this.errorsByType.increment(error.getType());
- if (verbose) {
- out.println(error);
- out.flush();
- if (this.errorsByType.getCount() >= maxVerboseOutput) {
- throw new MaxOutputExceededException();
- }
- }
- }
-
- /**
- * Control verbosity
- *
- * @param verbose True in order to emit a message per error or warning.
- * @param maxVerboseOutput If verbose, emit no more than this many messages. Ignored if !verbose.
- */
- public void setVerbose(final boolean verbose, final int maxVerboseOutput) {
- this.verbose = verbose;
- this.maxVerboseOutput = maxVerboseOutput;
- }
-
- public boolean isBisulfiteSequenced() {
- return bisulfiteSequenced;
- }
-
- public void setBisulfiteSequenced(boolean bisulfiteSequenced) {
- this.bisulfiteSequenced = bisulfiteSequenced;
- }
-
- /**
- * @deprecated use {@link #setIndexValidationStringency} instead
- */
- @Deprecated
- public SamFileValidator setValidateIndex(final boolean validateIndex) {
- // The SamReader must also have IndexCaching enabled to have the index validated,
- return this.setIndexValidationStringency(validateIndex ? IndexValidationStringency.EXHAUSTIVE : IndexValidationStringency.NONE);
- }
-
- public SamFileValidator setIndexValidationStringency(final IndexValidationStringency stringency) {
- this.indexValidationStringency = stringency;
- return this;
- }
-
- public static class ValidationMetrics extends MetricBase {
- }
-
- /**
- * This class is used so we don't have to store the entire SAMRecord in memory while we wait
- * to find a record's mate and also to store the record number.
- */
- private static class PairEndInfo {
- private final int readAlignmentStart;
- private final int readReferenceIndex;
- private final boolean readNegStrandFlag;
- private final boolean readUnmappedFlag;
- private final String readCigarString;
-
- private final int mateAlignmentStart;
- private final int mateReferenceIndex;
- private final boolean mateNegStrandFlag;
- private final boolean mateUnmappedFlag;
- private final String mateCigarString;
-
- private final boolean firstOfPairFlag;
-
- private final long recordNumber;
-
- public PairEndInfo(final SAMRecord record, final long recordNumber) {
- this.recordNumber = recordNumber;
-
- this.readAlignmentStart = record.getAlignmentStart();
- this.readNegStrandFlag = record.getReadNegativeStrandFlag();
- this.readReferenceIndex = record.getReferenceIndex();
- this.readUnmappedFlag = record.getReadUnmappedFlag();
- this.readCigarString = record.getCigarString();
-
- this.mateAlignmentStart = record.getMateAlignmentStart();
- this.mateNegStrandFlag = record.getMateNegativeStrandFlag();
- this.mateReferenceIndex = record.getMateReferenceIndex();
- this.mateUnmappedFlag = record.getMateUnmappedFlag();
- final Object mcs = record.getAttribute(SAMTag.MC.name());
- this.mateCigarString = (mcs != null) ? (String) mcs : null;
-
- this.firstOfPairFlag = record.getFirstOfPairFlag();
- }
-
- private PairEndInfo(int readAlignmentStart, int readReferenceIndex, boolean readNegStrandFlag, boolean readUnmappedFlag,
- String readCigarString,
- int mateAlignmentStart, int mateReferenceIndex, boolean mateNegStrandFlag, boolean mateUnmappedFlag,
- String mateCigarString,
- boolean firstOfPairFlag, long recordNumber) {
- this.readAlignmentStart = readAlignmentStart;
- this.readReferenceIndex = readReferenceIndex;
- this.readNegStrandFlag = readNegStrandFlag;
- this.readUnmappedFlag = readUnmappedFlag;
- this.readCigarString = readCigarString;
- this.mateAlignmentStart = mateAlignmentStart;
- this.mateReferenceIndex = mateReferenceIndex;
- this.mateNegStrandFlag = mateNegStrandFlag;
- this.mateUnmappedFlag = mateUnmappedFlag;
- this.mateCigarString = mateCigarString;
- this.firstOfPairFlag = firstOfPairFlag;
- this.recordNumber = recordNumber;
- }
-
- public List<SAMValidationError> validateMates(final PairEndInfo mate, final String readName) {
- final List<SAMValidationError> errors = new ArrayList<SAMValidationError>();
- validateMateFields(this, mate, readName, errors);
- validateMateFields(mate, this, readName, errors);
- // Validations that should not be repeated on both ends
- if (this.firstOfPairFlag == mate.firstOfPairFlag) {
- final String whichEnd = this.firstOfPairFlag ? "first" : "second";
- errors.add(new SAMValidationError(
- Type.MATES_ARE_SAME_END,
- "Both mates are marked as " + whichEnd + " of pair",
- readName,
- this.recordNumber
- ));
- }
- return errors;
- }
-
- private void validateMateFields(final PairEndInfo end1, final PairEndInfo end2, final String readName, final List<SAMValidationError> errors) {
- if (end1.mateAlignmentStart != end2.readAlignmentStart) {
- errors.add(new SAMValidationError(
- Type.MISMATCH_MATE_ALIGNMENT_START,
- "Mate alignment does not match alignment start of mate",
- readName,
- end1.recordNumber));
- }
- if (end1.mateNegStrandFlag != end2.readNegStrandFlag) {
- errors.add(new SAMValidationError(
- Type.MISMATCH_FLAG_MATE_NEG_STRAND,
- "Mate negative strand flag does not match read negative strand flag of mate",
- readName,
- end1.recordNumber));
- }
- if (end1.mateReferenceIndex != end2.readReferenceIndex) {
- errors.add(new SAMValidationError(
- Type.MISMATCH_MATE_REF_INDEX,
- "Mate reference index (MRNM) does not match reference index of mate",
- readName,
- end1.recordNumber));
- }
- if (end1.mateUnmappedFlag != end2.readUnmappedFlag) {
- errors.add(new SAMValidationError(
- Type.MISMATCH_FLAG_MATE_UNMAPPED,
- "Mate unmapped flag does not match read unmapped flag of mate",
- readName,
- end1.recordNumber));
- }
- if ((end1.mateCigarString != null) && (!end1.mateCigarString.equals(end2.readCigarString))) {
- errors.add(new SAMValidationError(
- Type.MISMATCH_MATE_CIGAR_STRING,
- "Mate CIGAR string does not match CIGAR string of mate",
- readName,
- end1.recordNumber));
- }
- // Note - don't need to validate that the mateCigarString is a valid cigar string, since this
- // will be validated by validateCigar on the mate's record itself.
- }
- }
-
- /**
- * Thrown in addError indicating that maxVerboseOutput has been exceeded and processing should stop
- */
- private static class MaxOutputExceededException extends SAMException {
- MaxOutputExceededException() {
- super("maxVerboseOutput exceeded.");
- }
- }
-
- interface PairEndInfoMap extends Iterable<Map.Entry<String, PairEndInfo>> {
- void put(int mateReferenceIndex, String key, PairEndInfo value);
-
- PairEndInfo remove(int mateReferenceIndex, String key);
-
- CloseableIterator<Map.Entry<String, PairEndInfo>> iterator();
- }
-
- private class CoordinateSortedPairEndInfoMap implements PairEndInfoMap {
- private final CoordinateSortedPairInfoMap<String, PairEndInfo> onDiskMap =
- new CoordinateSortedPairInfoMap<String, PairEndInfo>(maxTempFiles, new Codec());
-
- public void put(int mateReferenceIndex, String key, PairEndInfo value) {
- onDiskMap.put(mateReferenceIndex, key, value);
- }
-
- public PairEndInfo remove(int mateReferenceIndex, String key) {
- return onDiskMap.remove(mateReferenceIndex, key);
- }
-
- public CloseableIterator<Map.Entry<String, PairEndInfo>> iterator() {
- return onDiskMap.iterator();
- }
-
- private class Codec implements CoordinateSortedPairInfoMap.Codec<String, PairEndInfo> {
- private DataInputStream in;
- private DataOutputStream out;
-
- public void setOutputStream(final OutputStream os) {
- this.out = new DataOutputStream(os);
- }
-
- public void setInputStream(final InputStream is) {
- this.in = new DataInputStream(is);
- }
-
- public void encode(final String key, final PairEndInfo record) {
- try {
- out.writeUTF(key);
- out.writeInt(record.readAlignmentStart);
- out.writeInt(record.readReferenceIndex);
- out.writeBoolean(record.readNegStrandFlag);
- out.writeBoolean(record.readUnmappedFlag);
- out.writeUTF(record.readCigarString);
- out.writeInt(record.mateAlignmentStart);
- out.writeInt(record.mateReferenceIndex);
- out.writeBoolean(record.mateNegStrandFlag);
- out.writeBoolean(record.mateUnmappedFlag);
- // writeUTF can't take null, so store a null mateCigarString as an empty string
- out.writeUTF(record.mateCigarString != null ? record.mateCigarString : "");
- out.writeBoolean(record.firstOfPairFlag);
- out.writeLong(record.recordNumber);
- } catch (IOException e) {
- throw new SAMException("Error spilling PairInfo to disk", e);
- }
- }
-
- public Map.Entry<String, PairEndInfo> decode() {
- try {
- final String key = in.readUTF();
- final int readAlignmentStart = in.readInt();
- final int readReferenceIndex = in.readInt();
- final boolean readNegStrandFlag = in.readBoolean();
- final boolean readUnmappedFlag = in.readBoolean();
- final String readCigarString = in.readUTF();
-
- final int mateAlignmentStart = in.readInt();
- final int mateReferenceIndex = in.readInt();
- final boolean mateNegStrandFlag = in.readBoolean();
- final boolean mateUnmappedFlag = in.readBoolean();
-
- // read mateCigarString - note that null value is stored as an empty string
- final String mcs = in.readUTF();
- final String mateCigarString = !mcs.isEmpty() ? mcs : null;
-
- final boolean firstOfPairFlag = in.readBoolean();
-
- final long recordNumber = in.readLong();
- final PairEndInfo rec = new PairEndInfo(readAlignmentStart, readReferenceIndex, readNegStrandFlag,
- readUnmappedFlag, readCigarString, mateAlignmentStart, mateReferenceIndex, mateNegStrandFlag,
- mateUnmappedFlag, mateCigarString,
- firstOfPairFlag, recordNumber);
- return new AbstractMap.SimpleEntry(key, rec);
- } catch (IOException e) {
- throw new SAMException("Error reading PairInfo from disk", e);
- }
- }
- }
- }
-
- private static class InMemoryPairEndInfoMap implements PairEndInfoMap {
- private final Map<String, PairEndInfo> map = new HashMap<String, PairEndInfo>();
-
- public void put(int mateReferenceIndex, String key, PairEndInfo value) {
- if (mateReferenceIndex != value.mateReferenceIndex)
- throw new IllegalArgumentException("mateReferenceIndex does not agree with PairEndInfo");
- map.put(key, value);
- }
-
- public PairEndInfo remove(int mateReferenceIndex, String key) {
- return map.remove(key);
- }
-
- public CloseableIterator<Map.Entry<String, PairEndInfo>> iterator() {
- final Iterator<Map.Entry<String, PairEndInfo>> it = map.entrySet().iterator();
- return new CloseableIterator<Map.Entry<String, PairEndInfo>>() {
- public void close() {
- // do nothing
- }
-
- public boolean hasNext() {
- return it.hasNext();
- }
-
- public Map.Entry<String, PairEndInfo> next() {
- return it.next();
- }
-
- public void remove() {
- it.remove();
- }
- };
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFiles.java b/src/main/java/htsjdk/samtools/SamFiles.java
deleted file mode 100644
index 874fc10..0000000
--- a/src/main/java/htsjdk/samtools/SamFiles.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.build.CramIO;
-
-import htsjdk.samtools.util.Log;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/**
- * @author mccowan
- */
-public class SamFiles {
-
- private final static Log LOG = Log.getInstance(SamFiles.class);
-
- /**
- * Finds the index file associated with the provided SAM file. The index file must exist and be reachable to be found.
- *
- * If the file is a symlink and the index cannot be found, try to unsymlink the file and look for the bai in the actual file path.
- *
- * @return The index for the provided SAM, or null if one was not found.
- */
- public static File findIndex(final File samFile) {
- Path path = findIndex(samFile.toPath());
- return path == null ? null : path.toFile();
- }
-
- /**
- * Finds the index file associated with the provided SAM file. The index file must exist and be reachable to be found.
- *
- * If the file is a symlink and the index cannot be found, try to unsymlink the file and look for the bai in the actual file path.
- *
- * @return The index for the provided SAM, or null if one was not found.
- */
- public static Path findIndex(final Path samPath) {
- final Path indexPath = lookForIndex(samPath); //try to find the index
- if (indexPath == null) {
- return unsymlinkAndLookForIndex(samPath);
- } else {
- return indexPath;
- }
- }
-
- /**
- * resolve the canonical path of samFile and attempt to find an index there.
- * @return an index file or null if no index is found.
- */
- private static Path unsymlinkAndLookForIndex(Path samPath) {
- try {
- final Path canonicalSamPath = samPath.toRealPath(); // resolve symbolic links
- final Path canonicalIndexPath = lookForIndex(canonicalSamPath);
- if ( canonicalIndexPath != null) {
- LOG.warn("The index file " + canonicalIndexPath.toAbsolutePath()
- + " was found by resolving the canonical path of a symlink: "
- + samPath.toAbsolutePath() + " -> " + samPath.toRealPath());
- }
- return canonicalIndexPath;
- } catch (IOException e) {
- return null;
- }
- }
-
- private static Path lookForIndex(final Path samPath) {// If input is foo.bam, look for foo.bai
- Path indexPath;
- final String fileName = samPath.getFileName().toString(); // works for all path types (e.g. HDFS)
- if (fileName.endsWith(BamFileIoUtils.BAM_FILE_EXTENSION)) {
- final String bai = fileName.substring(0, fileName.length() - BamFileIoUtils.BAM_FILE_EXTENSION.length()) + BAMIndex.BAMIndexSuffix;
- indexPath = samPath.resolveSibling(bai);
- if (Files.isRegularFile(indexPath)) { // works for all path types (e.g. HDFS)
- return indexPath;
- }
-
-
- } else if (fileName.endsWith(CramIO.CRAM_FILE_EXTENSION)) {
- final String crai = fileName.substring(0, fileName.length() - CramIO.CRAM_FILE_EXTENSION.length()) + CRAIIndex.CRAI_INDEX_SUFFIX;
- indexPath = samPath.resolveSibling(crai);
- if (Files.isRegularFile(indexPath)) {
- return indexPath;
- }
-
- indexPath = samPath.resolveSibling(fileName + CRAIIndex.CRAI_INDEX_SUFFIX);
- if (Files.isRegularFile(indexPath)) {
- return indexPath;
- }
- }
-
- // If foo.bai doesn't exist look for foo.bam.bai or foo.cram.bai
- indexPath = samPath.resolveSibling(fileName + BAMIndex.BAMIndexSuffix);
- if (Files.isRegularFile(indexPath)) {
- return indexPath;
- }
-
- return null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamFlagField.java b/src/main/java/htsjdk/samtools/SamFlagField.java
deleted file mode 100644
index 82f2a29..0000000
--- a/src/main/java/htsjdk/samtools/SamFlagField.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Nils Homer
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-/**
- * This determines how flag fields are represented in the SAM file.
- *
- * In a string FLAG, each character represents one bit with
- * p=0x1 (paired), P=0x2 (properly paired), u=0x4 (unmapped),
- * U=0x8 (mate unmapped), r=0x10 (reverse), R=0x20 (mate reverse)
- * 1=0x40 (first), 2=0x80 (second), s=0x100 (not primary),
- * x=0x200 (failure), d=0x400 (duplicate), and S=0x800 (secondary).
- * This was inspired by 'samtools view -X'.
- *
- * We also output a character when the following bits *are not* set:
- * m=0x4 (mapped), M=0x8 (mate mapped), f=0x10 (forward), F=0x20
- * (mate forward).
- *
- * @author nhomer
- */
-public enum SamFlagField {
- NONE {
- @Override
- public String format(final int flag) {
- throw new SAMFormatException("NONE not allowed for the SamFlagField when writing the SAM flag field.");
- }
- @Override
- protected int parseWithoutValidation(final String flag) {
- throw new SAMFormatException("NONE not allowed for the SamFlagField when reading the SAM flag field.");
- }
- },
- DECIMAL {
- @Override
- public String format(final int flag) {
- return Integer.toString(flag);
- }
- /** Throws NumberFormatException if it can't parse the flag **/
- @Override
- protected int parseWithoutValidation(final String flag) {
- return Integer.parseInt(flag);
- }
- },
- HEXADECIMAL {
- @Override
- public String format(final int flag) {
- return String.format("%#x", flag);
- }
- @Override
- protected int parseWithoutValidation(final String flag) {
- return Integer.valueOf(flag.substring(2), 16);
- }
- },
- OCTAL {
- @Override
- public String format(final int flag) {
- return String.format("%#o", flag);
- }
- @Override
- protected int parseWithoutValidation(final String flag) {
- return Integer.valueOf(flag, 8);
- }
- },
- STRING {
- /*
- It is important that the first character of a string does not start with a digit, so we can
- determine which format given an input flag value. See of.
- */
-
- @Override
- public String format(final int flag) {
- // Adapted from the the implementation here:
- // https://github.com/jmarshall/cansam/blob/master/lib/alignment.cpp
- final StringBuilder value = new StringBuilder();
-
- if ((flag & SAMFlag.READ_UNMAPPED.flag) != 0) value.append('u');
- else value.append('m');
-
- if ((flag & SAMFlag.READ_REVERSE_STRAND.flag) != 0) value.append('r');
- else if ((flag & SAMFlag.READ_UNMAPPED.flag) == 0) value.append('f');
-
- if ((flag & SAMFlag.MATE_UNMAPPED.flag) != 0) value.append('U');
- else if ((flag & SAMFlag.READ_PAIRED.flag) != 0) value.append('M');
-
- if ((flag & SAMFlag.MATE_REVERSE_STRAND.flag) != 0) value.append('R');
- else if ((flag & SAMFlag.READ_PAIRED.flag) != 0) value.append('F');
-
- if ((flag & SAMFlag.READ_PAIRED.flag) != 0) value.append('p');
- if ((flag & SAMFlag.PROPER_PAIR.flag) != 0) value.append('P');
- if ((flag & SAMFlag.FIRST_OF_PAIR.flag) != 0) value.append('1');
- if ((flag & SAMFlag.SECOND_OF_PAIR.flag) != 0) value.append('2');
-
- if ((flag & SAMFlag.NOT_PRIMARY_ALIGNMENT.flag) != 0) value.append('s');
- if ((flag & SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag) != 0) value.append('S');
- if ((flag & SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag) != 0) value.append('x');
- if ((flag & SAMFlag.DUPLICATE_READ.flag) != 0) value.append('d');
-
- return value.toString();
- }
-
- @Override
- protected int parseWithoutValidation(final String flag) {
- SamFlagField.validate(flag, STRING);
-
- // Adapted from the the implementation here:
- // https://github.com/jmarshall/cansam/blob/master/lib/alignment.cpp
-
- int value = 0;
-
- for (int i = 0; i < flag.length(); i++) {
- switch (flag.charAt(i)) {
- case 'p': value |= SAMFlag.READ_PAIRED.flag; break;
- case 'P': value |= SAMFlag.PROPER_PAIR.flag; break;
- case 'u': value |= SAMFlag.READ_UNMAPPED.flag; break;
- case 'U': value |= SAMFlag.MATE_UNMAPPED.flag; break;
- case 'r': value |= SAMFlag.READ_REVERSE_STRAND.flag; break;
- case 'R': value |= SAMFlag.MATE_REVERSE_STRAND.flag; break;
- case '1': value |= SAMFlag.FIRST_OF_PAIR.flag; break;
- case '2': value |= SAMFlag.SECOND_OF_PAIR.flag; break;
- case 's': value |= SAMFlag.NOT_PRIMARY_ALIGNMENT.flag; break;
- case 'x': value |= SAMFlag.READ_FAILS_VENDOR_QUALITY_CHECK.flag; break;
- case 'd': value |= SAMFlag.DUPLICATE_READ.flag; break;
- case 'S': value |= SAMFlag.SUPPLEMENTARY_ALIGNMENT.flag; break;
- case 'f':
- case 'F':
- case 'm':
- case 'M':
- case '_':
- break;
- default:
- throw new SAMFormatException("Unknown flag character '" + flag.charAt(i) + "' in flag '" + flag + "'");
- }
- }
-
- return value;
- }
- };
-
- /** Returns the string associated with this flag field. */
- abstract public String format(final int flag);
-
- /** Parses the flag. Validates that the flag is of the correct type. */
- public final int parse(final String flag) {
- return parse(flag, true);
- }
-
- /** Infers the format from the flag string and parses the flag. */
- public static int parseDefault(final String flag) {
- return SamFlagField.of(flag).parse(flag, false);
- }
-
- /** Performs the actual parsing based on the radix. No validation that the flag is of the correct radix
- * should be performed.
- */
- abstract protected int parseWithoutValidation(final String flag);
-
- /** Parses the flag. Performs optional validation that the flag is of the correct type. */
- private int parse(final String flag, final boolean withValidation) {
- if (withValidation) SamFlagField.validate(flag, this);
- return parseWithoutValidation(flag);
- }
-
- /**
- * Returns the type of flag field for this string. This does not guarantee it is of the flag field,
- * as it only checks the first two characters.
- */
- public static SamFlagField of(final String s) {
- if (s.isEmpty()) throw new SAMFormatException("Could not determine flag field type; saw an empty flag field");
- else if (s.startsWith("0x")) return HEXADECIMAL;
- else if (s.startsWith("0X")) return HEXADECIMAL;
- else if (s.startsWith("0") && s.length() > 1) return OCTAL;
- else if (Character.isDigit(s.charAt(0))) return DECIMAL;
- else return STRING;
- }
-
- private static void validate(final String flag, final SamFlagField expectedField) {
- final SamFlagField actualField = SamFlagField.of(flag);
- if (actualField != expectedField) {
- throw new SAMFormatException(expectedField.name() + " sam flag must start with [1-9] but found '" + flag + "' (" + actualField.name() + ")");
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/SamIndexes.java b/src/main/java/htsjdk/samtools/SamIndexes.java
deleted file mode 100644
index a888811..0000000
--- a/src/main/java/htsjdk/samtools/SamIndexes.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * A helper class to read BAI and CRAI indexes. Main goal is to provide BAI stream as a sort of common API for all index types.
- * <p/>
- * Created by vadim on 14/08/2015.
- */
-public enum SamIndexes {
- BAI(BAMIndex.BAMIndexSuffix, "BAI\1".getBytes()),
- // CRAI is gzipped text, so it's magic is same as {@link java.util.zip.GZIPInputStream.GZIP_MAGIC}
- CRAI(CRAIIndex.CRAI_INDEX_SUFFIX, new byte[]{(byte) 0x1f, (byte) 0x8b});
-
- public final String fileNameSuffix;
- public final byte[] magic;
-
- SamIndexes(final String fileNameSuffix, final byte[] magic) {
- this.fileNameSuffix = fileNameSuffix;
- this.magic = magic;
- }
-
- public static InputStream openIndexFileAsBaiOrNull(final File file, final SAMSequenceDictionary dictionary) throws IOException {
- return openIndexUrlAsBaiOrNull(file.toURI().toURL(), dictionary);
- }
-
- public static InputStream openIndexUrlAsBaiOrNull(final URL url, final SAMSequenceDictionary dictionary) throws IOException {
- if (url.getFile().toLowerCase().endsWith(BAI.fileNameSuffix.toLowerCase())) {
- return url.openStream();
- }
- if (url.getFile().toLowerCase().endsWith(CRAI.fileNameSuffix.toLowerCase())) {
- return CRAIIndex.openCraiFileAsBaiStream(url.openStream(), dictionary);
- }
-
- return null;
- }
-
- public static InputStream asBaiStreamOrNull(final InputStream inputStream, final SAMSequenceDictionary dictionary) throws IOException {
- final BufferedInputStream bis = new BufferedInputStream(inputStream);
- bis.mark(BAI.magic.length);
- if (doesStreamStartWith(bis, BAI.magic)) {
- bis.reset();
- return bis;
- } else {
- bis.reset();
- }
-
- bis.mark(CRAI.magic.length);
- if (doesStreamStartWith(bis, CRAI.magic)) {
- bis.reset();
- return CRAIIndex.openCraiFileAsBaiStream(bis, dictionary);
- } else {
- bis.reset();
- }
-
- return null;
- }
-
- public static SeekableStream asBaiSeekableStreamOrNull(final SeekableStream inputStream, final SAMSequenceDictionary dictionary) throws IOException {
- final SeekableBufferedStream bis = new SeekableBufferedStream(inputStream);
- bis.seek(0);
- if (doesStreamStartWith(bis, BAI.magic)) {
- bis.seek(0);
- return bis;
- }
-
- bis.seek(0);
- if (doesStreamStartWith(bis, CRAI.magic)) {
- bis.seek(0);
- return CRAIIndex.openCraiFileAsBaiStream(bis, dictionary);
- } else {
- bis.reset();
- }
-
- return null;
- }
-
- private static boolean doesStreamStartWith(final InputStream is, final byte[] bytes) throws IOException {
- for (final byte b : bytes) {
- if (is.read() != (0xFF & b)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamInputResource.java b/src/main/java/htsjdk/samtools/SamInputResource.java
deleted file mode 100644
index f25d97b..0000000
--- a/src/main/java/htsjdk/samtools/SamInputResource.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekablePathStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.Lazy;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.file.FileSystemNotFoundException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-/**
- * Describes a SAM-like resource, including its data (where the records are), and optionally an index.
- * <p/>
- * A data or index source may originate from a {@link java.io.File}, {@link java.io.InputStream}, {@link URL}, or
- * {@link htsjdk.samtools.seekablestream.SeekableStream}; look for the appropriate overload for
- * {@code htsjdk.samtools.SamInputResource#of()}.
- *
- * @author mccowan
- */
-public class SamInputResource {
- private final InputResource source;
- private InputResource index;
-
- SamInputResource(final InputResource data) {
- this(data, null);
- }
-
- SamInputResource(final InputResource source, final InputResource index) {
- if (source == null) throw new NullPointerException("source");
- this.source = source;
- this.index = index;
- }
-
- /** The resource that is the SAM data (e.g., records) */
- InputResource data() {
- return source;
- }
-
- /**
- * The resource that is the SAM index
- *
- * @return null, if no index is defined for this resource
- */
- InputResource indexMaybe() {
- return index;
- }
-
- @Override
- public String toString() {
- return String.format("data=%s;index=%s", source, index);
- }
-
- /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
- public static SamInputResource of(final File file) { return new SamInputResource(new FileInputResource(file)); }
-
- /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
- public static SamInputResource of(final Path path) { return new SamInputResource(new PathInputResource(path)); }
-
- /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
- public static SamInputResource of(final InputStream inputStream) { return new SamInputResource(new InputStreamInputResource(inputStream)); }
-
- /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
- public static SamInputResource of(final URL url) { return new SamInputResource(new UrlInputResource(url)); }
-
- /** Creates a {@link SamInputResource} reading from the provided resource, with no index. */
- public static SamInputResource of(final SeekableStream seekableStream) { return new SamInputResource(new SeekableStreamInputResource(seekableStream)); }
-
- public static SamInputResource of(final SRAAccession acc) { return new SamInputResource(new SRAInputResource(acc)); }
-
- /** Creates a {@link SamInputResource} from a string specifying *either* a url or a file path */
- public static SamInputResource of(final String string) {
- try {
- URL url = new URL(string); // this will throw if its not a url
- return of(url);
- } catch (MalformedURLException e) {
- // ignore
- }
- return of(new File(string));
- }
-
- /** Updates the index to point at the provided resource, then returns itself. */
- public SamInputResource index(final File file) {
- this.index = new FileInputResource(file);
- return this;
- }
-
- /** Updates the index to point at the provided resource, then returns itself. */
- public SamInputResource index(final Path path) {
- this.index = new PathInputResource(path);
- return this;
- }
-
- /** Updates the index to point at the provided resource, then returns itself. */
- public SamInputResource index(final InputStream inputStream) {
- this.index = new InputStreamInputResource(inputStream);
- return this;
- }
-
- /** Updates the index to point at the provided resource, then returns itself. */
- public SamInputResource index(final URL url) {
- this.index = new UrlInputResource(url);
- return this;
- }
-
- /** Updates the index to point at the provided resource, then returns itself. */
- public SamInputResource index(final SeekableStream seekableStream) {
- this.index = new SeekableStreamInputResource(seekableStream);
- return this;
- }
-
-}
-
-/**
- * Describes an arbitrary input source, which is something that can be accessed as either a
- * {@link htsjdk.samtools.seekablestream.SeekableStream} or {@link java.io.InputStream}. A concrete implementation of this class exists for
- * each of {@link InputResource.Type}.
- */
-abstract class InputResource {
- protected InputResource(final Type type) {this.type = type;}
-
- enum Type {
- FILE, PATH, URL, SEEKABLE_STREAM, INPUT_STREAM, SRA_ACCESSION
- }
-
- private final Type type;
-
- final Type type() {
- return type;
- }
-
- /** Returns null if this resource cannot be represented as a {@link File}. */
- abstract File asFile();
-
- /** Returns null if this resource cannot be represented as a {@link Path}. */
- abstract Path asPath();
-
- /** Returns null if this resource cannot be represented as a {@link URL}. */
- abstract URL asUrl();
-
- /** Returns null if this resource cannot be represented as a {@link htsjdk.samtools.seekablestream.SeekableStream}. */
- abstract SeekableStream asUnbufferedSeekableStream();
-
- /** All resource types support {@link java.io.InputStream} generation. */
- abstract InputStream asUnbufferedInputStream();
-
- /** SRA archive resource */
- abstract SRAAccession asSRAAccession();
-
- @Override
- public String toString() {
- final String childToString;
- switch (type()) {
- case FILE:
- childToString = asFile().toString();
- break;
- case PATH:
- childToString = asPath().toString();
- break;
- case INPUT_STREAM:
- childToString = asUnbufferedInputStream().toString();
- break;
- case SEEKABLE_STREAM:
- childToString = asUnbufferedSeekableStream().toString();
- break;
- case URL:
- childToString = asUrl().toString();
- break;
- case SRA_ACCESSION:
- childToString = asSRAAccession().toString();
- break;
- default:
- throw new IllegalStateException();
- }
- return String.format("%s:%s", type(), childToString);
- }
-}
-
-class FileInputResource extends InputResource {
-
- final File fileResource;
- final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
- @Override
- public SeekableStream make() {
- try {
- return new SeekableFileStream(fileResource);
- } catch (final FileNotFoundException e) {
- throw new RuntimeIOException(e);
- }
- }
- });
-
-
- FileInputResource(final File fileResource) {
- super(Type.FILE);
- this.fileResource = fileResource;
- }
-
- @Override
- public File asFile() {
- return fileResource;
- }
-
- @Override
- public Path asPath() {
- return fileResource.toPath();
- }
-
- @Override
- public URL asUrl() {
- try {
- return asPath().toUri().toURL();
- } catch (MalformedURLException e) {
- return null;
- }
- }
-
- @Override
- public SeekableStream asUnbufferedSeekableStream() {
- return lazySeekableStream.get();
- }
-
- @Override
- public InputStream asUnbufferedInputStream() {
- return asUnbufferedSeekableStream();
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return null;
- }
-}
-
-class PathInputResource extends InputResource {
-
- final Path pathResource;
- final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
- @Override
- public SeekableStream make() {
- try {
- return new SeekablePathStream(pathResource);
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
- });
-
-
- PathInputResource(final Path pathResource) {
- super(Type.PATH);
- this.pathResource = pathResource;
- }
-
- @Override
- public File asFile() {
- try {
- return asPath().toFile();
- } catch (UnsupportedOperationException e) {
- return null;
- }
- }
-
- @Override
- public Path asPath() {
- return pathResource;
- }
-
- @Override
- public URL asUrl() {
- try {
- return asPath().toUri().toURL();
- } catch (MalformedURLException e) {
- return null;
- }
- }
-
- @Override
- public SeekableStream asUnbufferedSeekableStream() {
- return lazySeekableStream.get();
- }
-
- @Override
- public InputStream asUnbufferedInputStream() {
- return asUnbufferedSeekableStream();
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return null;
- }
-}
-
-class UrlInputResource extends InputResource {
-
- final URL urlResource;
- final Lazy<SeekableStream> lazySeekableStream = new Lazy<SeekableStream>(new Lazy.LazyInitializer<SeekableStream>() {
- @Override
- public SeekableStream make() {
- try { return SeekableStreamFactory.getInstance().getStreamFor(urlResource); }
- catch (final IOException ioe) { throw new RuntimeIOException(ioe); }
- }
- });
-
- UrlInputResource(final URL urlResource) {
- super(Type.URL);
- this.urlResource = urlResource;
- }
-
- @Override
- public File asFile() {
- return null;
- }
-
- @Override
- public Path asPath() {
- try {
- return Paths.get(urlResource.toURI());
- } catch (URISyntaxException | IllegalArgumentException |
- FileSystemNotFoundException | SecurityException e) {
- return null;
- }
- }
-
- @Override
- public URL asUrl() {
- return urlResource;
- }
-
- @Override
- public SeekableStream asUnbufferedSeekableStream() {
- return lazySeekableStream.get();
- }
-
- @Override
- public InputStream asUnbufferedInputStream() {
- return asUnbufferedSeekableStream();
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return null;
- }
-}
-
-class SeekableStreamInputResource extends InputResource {
-
- final SeekableStream seekableStreamResource;
-
- SeekableStreamInputResource(final SeekableStream seekableStreamResource) {
- super(Type.SEEKABLE_STREAM);
- this.seekableStreamResource = seekableStreamResource;
- }
-
- @Override
- File asFile() {
- return null;
- }
-
- @Override
- Path asPath() {
- return null;
- }
-
- @Override
- URL asUrl() {
- return null;
- }
-
- @Override
- SeekableStream asUnbufferedSeekableStream() {
- return seekableStreamResource;
- }
-
- @Override
- InputStream asUnbufferedInputStream() {
- return asUnbufferedSeekableStream();
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return null;
- }
-}
-
-class InputStreamInputResource extends InputResource {
-
- final InputStream inputStreamResource;
-
- InputStreamInputResource(final InputStream inputStreamResource) {
- super(Type.INPUT_STREAM);
- this.inputStreamResource = inputStreamResource;
- }
-
- @Override
- File asFile() {
- return null;
- }
-
- @Override
- Path asPath() {
- return null;
- }
-
- @Override
- URL asUrl() {
- return null;
- }
-
- @Override
- SeekableStream asUnbufferedSeekableStream() {
- return null;
- }
-
- @Override
- InputStream asUnbufferedInputStream() {
- return inputStreamResource;
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return null;
- }
-}
-
-class SRAInputResource extends InputResource {
-
- final SRAAccession accession;
-
- SRAInputResource(final SRAAccession accession) {
- super(Type.SRA_ACCESSION);
- this.accession = accession;
- }
-
- @Override
- File asFile() {
- return null;
- }
-
- @Override
- Path asPath() {
- return null;
- }
-
- @Override
- URL asUrl() {
- return null;
- }
-
- @Override
- SeekableStream asUnbufferedSeekableStream() {
- return null;
- }
-
- @Override
- InputStream asUnbufferedInputStream() {
- return null;
- }
-
- @Override
- public SRAAccession asSRAAccession() {
- return accession;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamPairUtil.java b/src/main/java/htsjdk/samtools/SamPairUtil.java
deleted file mode 100644
index ee1707b..0000000
--- a/src/main/java/htsjdk/samtools/SamPairUtil.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-/**
- * Utility methods for pairs of SAMRecords
- */
-public class SamPairUtil {
-
- /**
- * The possible orientations of paired reads.
- *
- * F = mapped to forward strand
- * R = mapped to reverse strand
- *
- * FR means the read that's mapped to the forward strand comes before the
- * read mapped to the reverse strand when their 5'-end coordinates are
- * compared.
- */
- public static enum PairOrientation
- {
- FR, // ( 5' --F--> <--R-- 5' ) - aka. innie
- RF, // ( <--R-- 5' 5' --F--> ) - aka. outie
- TANDEM // ( 5' --F--> 5' --F--> or ( <--R-- 5' <--R-- 5' )
-
- }
-
-
- /**
- * Computes the pair orientation of the given SAMRecord.
- * @param r
- * @return PairOrientation of the given SAMRecord.
- * @throws IllegalArgumentException If the record is not a paired read, or
- * one or both reads are unmapped.
- */
- public static PairOrientation getPairOrientation(final SAMRecord r)
- {
- final boolean readIsOnReverseStrand = r.getReadNegativeStrandFlag();
-
- if(r.getReadUnmappedFlag() || !r.getReadPairedFlag() || r.getMateUnmappedFlag()) {
- throw new IllegalArgumentException("Invalid SAMRecord: " + r.getReadName() + ". This method only works for SAMRecords " +
- "that are paired reads with both reads aligned.");
- }
-
- if(readIsOnReverseStrand == r.getMateNegativeStrandFlag() ) {
- return PairOrientation.TANDEM;
- }
-
- final long positiveStrandFivePrimePos = ( readIsOnReverseStrand
- ? r.getMateAlignmentStart() //mate's 5' position ( x---> )
- : r.getAlignmentStart() ); //read's 5' position ( x---> )
-
- final long negativeStrandFivePrimePos = ( readIsOnReverseStrand
- ? r.getAlignmentEnd() //read's 5' position ( <---x )
- : r.getAlignmentStart() + r.getInferredInsertSize() ); //mate's 5' position ( <---x )
-
- return ( positiveStrandFivePrimePos < negativeStrandFivePrimePos
- ? PairOrientation.FR
- : PairOrientation.RF );
- }
-
-
-
- // TODO: KT and TF say this is more complicated than what I have here
- public static boolean isProperPair(final SAMRecord firstEnd, final SAMRecord secondEnd,
- final List<PairOrientation> expectedOrientations) {
- // are both records mapped?
- if (firstEnd.getReadUnmappedFlag() || secondEnd.getReadUnmappedFlag()) {
- return false;
- }
- if (firstEnd.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME)) {
- return false;
- }
- // AND are they both mapped to the same chromosome
-
- if (!firstEnd.getReferenceName().equals(secondEnd.getReferenceName())) {
- return false;
- }
-
- // AND is the pair orientation in the set of expected orientations
- final PairOrientation actual = getPairOrientation(firstEnd);
- return expectedOrientations.contains(actual);
- }
-
- public static void assertMate(final SAMRecord firstOfPair, final SAMRecord secondOfPair) {
- // Validate paired reads arrive as first of pair, then second of pair
-
- if (firstOfPair == null) {
- throw new SAMException(
- "First record does not exist - cannot perform mate assertion!");
- } else if (secondOfPair == null) {
- throw new SAMException(
- firstOfPair.toString() + " is missing its mate");
- } else if (!firstOfPair.getReadPairedFlag()) {
- throw new SAMException(
- "First record is not marked as paired: " + firstOfPair.toString());
- } else if (!secondOfPair.getReadPairedFlag()) {
- throw new SAMException(
- "Second record is not marked as paired: " + secondOfPair.toString());
- } else if (!firstOfPair.getFirstOfPairFlag()) {
- throw new SAMException(
- "First record is not marked as first of pair: " + firstOfPair.toString());
- } else if (!secondOfPair.getSecondOfPairFlag()) {
- throw new SAMException(
- "Second record is not marked as second of pair: " + secondOfPair.toString());
- } else if (!firstOfPair.getReadName().equals(secondOfPair.getReadName())) {
- throw new SAMException(
- "First [" + firstOfPair.getReadName() + "] and Second [" +
- secondOfPair.getReadName() + "] readnames do not match!");
- }
- }
-
- /**
- * Obtain the secondOfPair mate belonging to the firstOfPair SAMRecord
- * (assumed to be in the next element of the specified samRecordIterator)
- * @param samRecordIterator the iterator assumed to contain the secondOfPair SAMRecord in the
- * next element in the iteration
- * @param firstOfPair the firstOfPair SAMRecord
- * @return the secondOfPair SAMRecord
- * @throws SAMException when the secondOfPair mate cannot be obtained due to assertion failures
- */
- public static SAMRecord obtainAssertedMate(final Iterator<SAMRecord> samRecordIterator,
- final SAMRecord firstOfPair) {
- if (samRecordIterator.hasNext()) {
- final SAMRecord secondOfPair = samRecordIterator.next();
- assertMate(firstOfPair, secondOfPair);
- return secondOfPair;
- } else {
- throw new SAMException(
- "Second record does not exist: " + firstOfPair.getReadName());
- }
- }
-
- /**
- * Compute SAMRecord insert size
- * @param firstEnd
- * @param secondEnd
- * @return note that when storing insert size on the secondEnd, the return value must be negated.
- */
- public static int computeInsertSize(final SAMRecord firstEnd, final SAMRecord secondEnd) {
- if (firstEnd.getReadUnmappedFlag() || secondEnd.getReadUnmappedFlag()) {
- return 0;
- }
- if (!firstEnd.getReferenceName().equals(secondEnd.getReferenceName())) {
- return 0;
- }
-
- final int firstEnd5PrimePosition = firstEnd.getReadNegativeStrandFlag()? firstEnd.getAlignmentEnd(): firstEnd.getAlignmentStart();
- final int secondEnd5PrimePosition = secondEnd.getReadNegativeStrandFlag()? secondEnd.getAlignmentEnd(): secondEnd.getAlignmentStart();
-
- final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1;
- return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment;
- }
-
- /**
- * Write the mate info for two SAMRecords. This will always clear/remove any mate cigar tag that is present.
- * @param rec1 the first SAM record
- * @param rec2 the second SAM record
- */
- public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2) {
- setMateInfo(rec1, rec2, false);
- }
-
- /**
- * Write the mate info for two SAMRecords
- * @param rec1 the first SAM record. Must have a non-null SAMFileHeader.
- * @param rec2 the second SAM record. Must have a non-null SAMFileHeader.
- * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- */
- public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final boolean setMateCigar) {
- // If neither read is unmapped just set their mate info
- if (!rec1.getReadUnmappedFlag() && !rec2.getReadUnmappedFlag()) {
- rec1.setMateReferenceIndex(rec2.getReferenceIndex());
- rec1.setMateAlignmentStart(rec2.getAlignmentStart());
- rec1.setMateNegativeStrandFlag(rec2.getReadNegativeStrandFlag());
- rec1.setMateUnmappedFlag(false);
- rec1.setAttribute(SAMTag.MQ.name(), rec2.getMappingQuality());
-
- rec2.setMateReferenceIndex(rec1.getReferenceIndex());
- rec2.setMateAlignmentStart(rec1.getAlignmentStart());
- rec2.setMateNegativeStrandFlag(rec1.getReadNegativeStrandFlag());
- rec2.setMateUnmappedFlag(false);
- rec2.setAttribute(SAMTag.MQ.name(), rec1.getMappingQuality());
-
- if (setMateCigar) {
- rec1.setAttribute(SAMTag.MC.name(), rec2.getCigarString());
- rec2.setAttribute(SAMTag.MC.name(), rec1.getCigarString());
- }
- else {
- rec1.setAttribute(SAMTag.MC.name(), null);
- rec2.setAttribute(SAMTag.MC.name(), null);
- }
- }
- // Else if they're both unmapped set that straight
- else if (rec1.getReadUnmappedFlag() && rec2.getReadUnmappedFlag()) {
- rec1.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec1.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec1.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec1.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec1.setMateNegativeStrandFlag(rec2.getReadNegativeStrandFlag());
- rec1.setMateUnmappedFlag(true);
- rec1.setAttribute(SAMTag.MQ.name(), null);
- rec1.setAttribute(SAMTag.MC.name(), null);
- rec1.setInferredInsertSize(0);
-
- rec2.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec2.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec2.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec2.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec2.setMateNegativeStrandFlag(rec1.getReadNegativeStrandFlag());
- rec2.setMateUnmappedFlag(true);
- rec2.setAttribute(SAMTag.MQ.name(), null);
- rec2.setAttribute(SAMTag.MC.name(), null);
- rec2.setInferredInsertSize(0);
- }
- // And if only one is mapped copy it's coordinate information to the mate
- else {
- final SAMRecord mapped = rec1.getReadUnmappedFlag() ? rec2 : rec1;
- final SAMRecord unmapped = rec1.getReadUnmappedFlag() ? rec1 : rec2;
- unmapped.setReferenceIndex(mapped.getReferenceIndex());
- unmapped.setAlignmentStart(mapped.getAlignmentStart());
-
- mapped.setMateReferenceIndex(unmapped.getReferenceIndex());
- mapped.setMateAlignmentStart(unmapped.getAlignmentStart());
- mapped.setMateNegativeStrandFlag(unmapped.getReadNegativeStrandFlag());
- mapped.setMateUnmappedFlag(true);
- mapped.setAttribute(SAMTag.MQ.name(), null);
- mapped.setAttribute(SAMTag.MC.name(), null);
- mapped.setInferredInsertSize(0);
-
- unmapped.setMateReferenceIndex(mapped.getReferenceIndex());
- unmapped.setMateAlignmentStart(mapped.getAlignmentStart());
- unmapped.setMateNegativeStrandFlag(mapped.getReadNegativeStrandFlag());
- unmapped.setMateUnmappedFlag(false);
- unmapped.setAttribute(SAMTag.MQ.name(), mapped.getMappingQuality());
- // For the unmapped read, set mateCigar to the mate's Cigar, since the mate must be mapped
- if (setMateCigar) unmapped.setAttribute(SAMTag.MC.name(), mapped.getCigarString());
- else unmapped.setAttribute(SAMTag.MC.name(), null);
- unmapped.setInferredInsertSize(0);
- }
-
- final int insertSize = SamPairUtil.computeInsertSize(rec1, rec2);
- rec1.setInferredInsertSize(insertSize);
- rec2.setInferredInsertSize(-insertSize);
- }
-
- /**
- * Write the mate info for two SAMRecords
- * @param rec1 the first SAM record
- * @param rec2 the second SAM record
- * @param header the SAM file header
- * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- * @deprecated use {@link #setMateInfo(SAMRecord, SAMRecord, boolean)} instead
- */
- @Deprecated
- public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final SAMFileHeader header, final boolean setMateCigar) {
- setMateInfo(rec1, rec2, setMateCigar);
- }
-
- /**
- * Write the mate info for two SAMRecords. This will always clear/remove any mate cigar tag that is present.
- * @param rec1 the first SAM record
- * @param rec2 the second SAM record
- * @param header the SAM file header
- * @deprecated use {@link #setMateInfo(SAMRecord, SAMRecord)} instead
- */
- @Deprecated
- public static void setMateInfo(final SAMRecord rec1, final SAMRecord rec2, final SAMFileHeader header) {
- setMateInfo(rec1, rec2);
- }
-
- /**
- * Sets mate pair information appropriately on a supplemental SAMRecord (e.g. from a split alignment)
- * using the primary alignment of the read's mate.
- * @param supplemental a supplemental alignment for the mate pair of the primary supplied
- * @param matePrimary the primary alignment of the the mate pair of the supplemental
- * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- */
- public static void setMateInformationOnSupplementalAlignment( final SAMRecord supplemental,
- final SAMRecord matePrimary,
- final boolean setMateCigar) {
- supplemental.setMateReferenceIndex(matePrimary.getReferenceIndex());
- supplemental.setMateAlignmentStart(matePrimary.getAlignmentStart());
- supplemental.setMateNegativeStrandFlag(matePrimary.getReadNegativeStrandFlag());
- supplemental.setMateUnmappedFlag(matePrimary.getReadUnmappedFlag());
- supplemental.setInferredInsertSize(-matePrimary.getInferredInsertSize());
- if (setMateCigar && !matePrimary.getReadUnmappedFlag()) {
- supplemental.setAttribute(SAMTag.MC.name(), matePrimary.getCigarString());
- }
- else {
- supplemental.setAttribute(SAMTag.MC.name(), null);
- }
- }
-
- /**
- * Sets mate pair information appropriately on a supplemental SAMRecord (e.g. from a split alignment)
- * using the primary alignment of the read's mate.
- * @param supplemental a supplemental alignment for the mate pair of the primary supplied
- * @param matePrimary the primary alignment of the the mate pair of the supplemental
- */
- public static void setMateInformationOnSupplementalAlignment( final SAMRecord supplemental,
- final SAMRecord matePrimary) {
- setMateInformationOnSupplementalAlignment(supplemental, matePrimary, false);
- }
-
- /**
- * This method will clear any mate cigar already present.
- * @deprecated use {@link #setProperPairAndMateInfo(SAMRecord, SAMRecord, List)} instead
- */
- @Deprecated
- public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
- final SAMFileHeader header,
- final List<PairOrientation> expectedOrientations) {
- setProperPairAndMateInfo(rec1, rec2, expectedOrientations);
- }
-
- /**
- * @param addMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- * @deprecated use {@link #setProperPairAndMateInfo(SAMRecord, SAMRecord, List, boolean)}
- */
- @Deprecated
- public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
- final SAMFileHeader header,
- final List<PairOrientation> expectedOrientations,
- final boolean addMateCigar) {
- setProperPairAndMateInfo(rec1, rec2, expectedOrientations, addMateCigar);
- }
-
- /**
- * This method will clear any mate cigar already present.
- */
- public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
- final List<PairOrientation> expectedOrientations) {
- setProperPairAndMateInfo(rec1, rec2, expectedOrientations, false);
- }
-
- /**
- * @param addMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- */
- public static void setProperPairAndMateInfo(final SAMRecord rec1, final SAMRecord rec2,
- final List<PairOrientation> expectedOrientations,
- final boolean addMateCigar) {
- setMateInfo(rec1, rec2, addMateCigar);
- setProperPairFlags(rec1, rec2, expectedOrientations);
- }
-
- public static void setProperPairFlags(final SAMRecord rec1, final SAMRecord rec2, final List<PairOrientation> expectedOrientations) {
- final boolean properPair = (!rec1.getReadUnmappedFlag() && !rec2.getReadUnmappedFlag())
- ? isProperPair(rec1, rec2, expectedOrientations)
- : false;
- rec1.setProperPairFlag(properPair);
- rec2.setProperPairFlag(properPair);
- }
-
- /**
- * A class to iterate through SAMRecords and set mate information on the given records, and optionally
- * set the mate cigar tag (true by default).
- */
- public static class SetMateInfoIterator extends PeekableIterator<SAMRecord> {
-
- private final Queue<SAMRecord> records = new LinkedList<SAMRecord>();
- private final boolean setMateCigar;
- private final boolean ignoreMissingMates;
- private long numMateCigarsAdded = 0;
-
- /**
- * By default, the mate cigar tag is set
- * @param iterator the iterator to wrap
- */
- public SetMateInfoIterator(final Iterator<SAMRecord> iterator) {
- this(iterator, true);
- }
-
- /**
- * @param iterator the iterator to wrap
- * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- */
- public SetMateInfoIterator(final Iterator<SAMRecord> iterator, final boolean setMateCigar) {
- this(iterator, setMateCigar, false);
- }
-
- /**
- * @param iterator the iterator to wrap
- * @param setMateCigar true if we are to update/create the Mate CIGAR (MC) optional tag, false if we are to clear any mate cigar tag that is present.
- * @param ignoreMissingMates set this to true if we are to ignore missing mates, otherwise an exception will be thrown when a missing mate is encountered
- */
- public SetMateInfoIterator(final Iterator<SAMRecord> iterator, final boolean setMateCigar, final boolean ignoreMissingMates) {
- super(iterator);
- this.setMateCigar = setMateCigar;
- this.ignoreMissingMates = ignoreMissingMates;
- }
-
- /**
- * @return the current number of mate cigars added. This could be more than the number of records returned.
- */
- public long getNumMateCigarsAdded() { return this.numMateCigarsAdded; }
-
- public boolean hasNext() {
- return (!records.isEmpty() || super.hasNext());
- }
-
- /**
- * Populate this.records if necessary.
- */
- private void advance() {
-
- // No need to advance if we have records remaining
- if (!records.isEmpty()) return;
-
- /**
- * Get all records with the same name, and then identify the canonical first and second end to which we
- * want to set mate info.
- */
- SAMRecord firstPrimaryRecord = null, secondPrimaryRecord = null;
- final SAMRecord first = super.peek(); // peek so we consider it in the following loop
- boolean containsSupplementalRecord = false;
- while (super.hasNext() && super.peek().getReadName().equals(first.getReadName())) {
- final SAMRecord record = super.next();
- // We must make sure that we find only one "primary" alignments for each end
- if (record.getReadPairedFlag()) {
- if (!record.isSecondaryOrSupplementary()) {
- if (record.getFirstOfPairFlag()) {
- if (null != firstPrimaryRecord) {
- throw new SAMException("Found two records that are paired, not supplementary, and first of the pair");
- }
- firstPrimaryRecord = record;
- } else if (record.getSecondOfPairFlag()) {
- if (null != secondPrimaryRecord) {
- throw new SAMException("Found two records that are paired, not supplementary, and second of the pair");
- }
- secondPrimaryRecord = record;
- }
- }
- if (record.getSupplementaryAlignmentFlag()) containsSupplementalRecord = true;
- }
- records.add(record);
- }
- // TODO: should we check that we do not have a mix of paired and fragment reads?
-
-
- // we must find both records to update the mate info
- if (null != firstPrimaryRecord && null != secondPrimaryRecord) {
- // Update mate info
- SamPairUtil.setMateInfo(firstPrimaryRecord, secondPrimaryRecord, this.setMateCigar);
- if (this.setMateCigar) this.numMateCigarsAdded += 2;
-
- // Set mate information on supplemental records
- if (containsSupplementalRecord) {
- for (final SAMRecord record : records) {
- if (record.getReadPairedFlag() && record.getSupplementaryAlignmentFlag()) {
- if (record.getFirstOfPairFlag()) {
- SamPairUtil.setMateInformationOnSupplementalAlignment(record, secondPrimaryRecord, this.setMateCigar);
- } else {
- SamPairUtil.setMateInformationOnSupplementalAlignment(record, firstPrimaryRecord, this.setMateCigar);
- }
- this.numMateCigarsAdded++;
- }
- }
- }
- } else if (!this.ignoreMissingMates) {
- if (null != firstPrimaryRecord && firstPrimaryRecord.getReadPairedFlag()) {
- throw new SAMException("Missing second read of pair: " + firstPrimaryRecord.getReadName());
- } else if (null != secondPrimaryRecord && secondPrimaryRecord.getReadPairedFlag()) {
- throw new SAMException("Missing first read of pair: " + secondPrimaryRecord.getReadName());
- }
- }
- }
-
- public SAMRecord next() {
- advance();
- if (records.isEmpty()) throw new IllegalStateException("Unexpectedly found an empty record list");
- return this.records.poll();
- }
-
- public SAMRecord peek() {
- advance();
- if (records.isEmpty()) throw new IllegalStateException("Unexpectedly found an empty record list");
- return this.records.peek();
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamReader.java b/src/main/java/htsjdk/samtools/SamReader.java
deleted file mode 100644
index 2f1b2f9..0000000
--- a/src/main/java/htsjdk/samtools/SamReader.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-import java.io.Closeable;
-import java.text.MessageFormat;
-
-/**
- * Describes functionality for objects that produce {@link SAMRecord}s and associated information.
- *
- * Currently, only deprecated readers implement this directly; actual readers implement this
- * via {@link ReaderImplementation} and {@link PrimitiveSamReader}, which {@link SamReaderFactory}
- * converts into full readers by using {@link PrimitiveSamReaderToSamReaderAdapter}.
- *
- * @author mccowan
- */
-public interface SamReader extends Iterable<SAMRecord>, Closeable {
-
- /** Describes a type of SAM file. */
- public abstract class Type {
- /** A string representation of this type. */
- abstract String name();
-
- /** The recommended file extension for SAMs of this type, without a period. */
- public abstract String fileExtension();
-
- /** The recommended file extension for SAM indexes of this type, without a period, or null if this type is not associated with indexes. */
- abstract String indexExtension();
-
- static class TypeImpl extends Type {
- final String name, fileExtension, indexExtension;
-
- TypeImpl(final String name, final String fileExtension, final String indexExtension) {
- this.name = name;
- this.fileExtension = fileExtension;
- this.indexExtension = indexExtension;
- }
-
- @Override
- String name() {
- return name;
- }
-
- @Override
- public String fileExtension() {
- return fileExtension;
- }
-
- @Override
- String indexExtension() {
- return indexExtension;
- }
-
- @Override
- public String toString() {
- return String.format("TypeImpl{name='%s', fileExtension='%s', indexExtension='%s'}", name, fileExtension, indexExtension);
- }
- }
-
- public static Type SRA_TYPE = new TypeImpl("SRA", "sra", null);
- public static Type CRAM_TYPE = new TypeImpl("CRAM", "cram", "crai");
- public static Type BAM_TYPE = new TypeImpl("BAM", "bam", "bai");
- public static Type SAM_TYPE = new TypeImpl("SAM", "sam", null);
- }
-
- /**
- * Facet for index-related operations.
- */
- public interface Indexing {
- /**
- * Retrieves the index for the given file type. Ensure that the index is of the specified type.
- *
- * @return An index of the given type.
- */
- public BAMIndex getIndex();
-
- /**
- * Returns true if the supported index is browseable, meaning the bins in it can be traversed
- * and chunk data inspected and retrieved.
- *
- * @return True if the index supports the BrowseableBAMIndex interface. False otherwise.
- */
- public boolean hasBrowseableIndex();
-
- /**
- * Gets an index tagged with the BrowseableBAMIndex interface. Throws an exception if no such
- * index is available.
- *
- * @return An index with a browseable interface, if possible.
- * @throws SAMException if no such index is available.
- */
- public BrowseableBAMIndex getBrowseableIndex();
-
- /**
- * Iterate through the given chunks in the file.
- *
- * @param chunks List of chunks for which to retrieve data.
- * @return An iterator over the given chunks.
- */
- public SAMRecordIterator iterator(final SAMFileSpan chunks);
-
- /**
- * Gets a pointer spanning all reads in the BAM file.
- *
- * @return Unbounded pointer to the first record, in chunk format.
- */
- public SAMFileSpan getFilePointerSpanningReads();
-
- }
-
- public SAMFileHeader getFileHeader();
-
- /**
- * @return the {@link htsjdk.samtools.SamReader.Type} of this {@link htsjdk.samtools.SamReader}
- */
- public Type type();
-
- /**
- * @return a human readable description of the resource backing this sam reader
- */
- public String getResourceDescription();
-
- /**
- * @return true if ths is a BAM file, and has an index
- */
- public boolean hasIndex();
-
- /**
- * Exposes the {@link SamReader.Indexing} facet of this {@link SamReader}.
- *
- * @throws java.lang.UnsupportedOperationException If {@link #hasIndex()} returns false.
- */
- public Indexing indexing();
-
- /**
- * Iterate through file in order. For a SamReader constructed from an InputStream, and for any SAM file,
- * a 2nd iteration starts where the 1st one left off. For a BAM constructed from a SeekableStream or File, each new iteration
- * starts at the first record.
- * <p/>
- * Only a single open iterator on a SAM or BAM file may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- */
- public SAMRecordIterator iterator();
-
- /**
- * Iterate over records that match the given interval. Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first. You can use a second SamReader to iterate
- * in parallel over the same underlying file.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param sequence Reference sequence of interest.
- * @param start 1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
- * @param end 1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
- * @param contained If true, each SAMRecord returned will have its alignment completely contained in the
- * interval of interest. If false, the alignment of the returned SAMRecords need only overlap the interval of interest.
- * @return Iterator over the SAMRecords matching the interval.
- */
- public SAMRecordIterator query(final String sequence, final int start, final int end, final boolean contained);
-
- /**
- * Iterate over records that overlap the given interval. Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param sequence Reference sequence of interest.
- * @param start 1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
- * @param end 1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
- * @return Iterator over the SAMRecords overlapping the interval.
- */
- public SAMRecordIterator queryOverlapping(final String sequence, final int start, final int end);
-
- /**
- * Iterate over records that are contained in the given interval. Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param sequence Reference sequence of interest.
- * @param start 1-based, inclusive start of interval of interest. Zero implies start of the reference sequence.
- * @param end 1-based, inclusive end of interval of interest. Zero implies end of the reference sequence.
- * @return Iterator over the SAMRecords contained in the interval.
- */
- public SAMRecordIterator queryContained(final String sequence, final int start, final int end);
-
- /**
- * Iterate over records that match one of the given intervals. This may be more efficient than querying
- * each interval separately, because multiple reads of the same SAMRecords is avoided.
- * <p/>
- * Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first. You can use a second SamReader to iterate
- * in parallel over the same underlying file.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match an interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param intervals Intervals to be queried. The intervals must be optimized, i.e. in order, with overlapping
- * and abutting intervals merged. This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
- * @param contained If true, each SAMRecord returned is will have its alignment completely contained in one of the
- * intervals of interest. If false, the alignment of the returned SAMRecords need only overlap one of
- * the intervals of interest.
- * @return Iterator over the SAMRecords matching the interval.
- */
- public SAMRecordIterator query(final QueryInterval[] intervals, final boolean contained);
-
- /**
- * Iterate over records that overlap any of the given intervals. This may be more efficient than querying
- * each interval separately, because multiple reads of the same SAMRecords is avoided.
- * <p/>
- * Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param intervals Intervals to be queried. The intervals must be optimized, i.e. in order, with overlapping
- * and abutting intervals merged. This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
- */
- public SAMRecordIterator queryOverlapping(final QueryInterval[] intervals);
-
- /**
- * Iterate over records that are contained in the given interval. This may be more efficient than querying
- * each interval separately, because multiple reads of the same SAMRecords is avoided.
- * <p/>
- * Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * is in the query region.
- *
- * @param intervals Intervals to be queried. The intervals must be optimized, i.e. in order, with overlapping
- * and abutting intervals merged. This can be done with {@link htsjdk.samtools.QueryInterval#optimizeIntervals}
- * @return Iterator over the SAMRecords contained in any of the intervals.
- */
- public SAMRecordIterator queryContained(final QueryInterval[] intervals);
-
-
- public SAMRecordIterator queryUnmapped();
-
- /**
- * Iterate over records that map to the given sequence and start at the given position. Only valid to call this if hasIndex() == true.
- * <p/>
- * Only a single open iterator on a given SamReader may be extant at any one time. If you want to start
- * a second iteration, the first one must be closed first.
- * <p/>
- * Note that indexed lookup is not perfectly efficient in terms of disk I/O. I.e. some SAMRecords may be read
- * and then discarded because they do not match the interval of interest.
- * <p/>
- * Note that an unmapped read will be returned by this call if it has a coordinate for the purpose of sorting that
- * matches the arguments.
- *
- * @param sequence Reference sequence of interest.
- * @param start Alignment start of interest.
- * @return Iterator over the SAMRecords with the given alignment start.
- */
- public SAMRecordIterator queryAlignmentStart(final String sequence, final int start);
-
- /**
- * Fetch the mate for the given read. Only valid to call this if hasIndex() == true.
- * This will work whether the mate has a coordinate or not, so long as the given read has correct
- * mate information. This method iterates over the SAM file, so there may not be an unclosed
- * iterator on the SAM file when this method is called.
- * <p/>
- * Note that it is not possible to call queryMate when iterating over the SamReader, because queryMate
- * requires its own iteration, and there cannot be two simultaneous iterations on the same SamReader. The
- * work-around is to open a second SamReader on the same input file, and call queryMate on the second
- * reader.
- *
- * @param rec Record for which mate is sought. Must be a paired read.
- * @return rec's mate, or null if it cannot be found.
- */
- public SAMRecord queryMate(final SAMRecord rec);
-
- /**
- * The minimal subset of functionality needed for a {@link SAMRecord} data source.
- * {@link SamReader} itself is somewhat large and bulky, but the core functionality can be captured in
- * relatively few methods, which are included here. For documentation, see the corresponding methods
- * in {@link SamReader}.
- *
- * See also: {@link PrimitiveSamReaderToSamReaderAdapter}, {@link ReaderImplementation}
- *
- */
- public interface PrimitiveSamReader {
- Type type();
-
- boolean hasIndex();
-
- BAMIndex getIndex();
-
- SAMFileHeader getFileHeader();
-
- CloseableIterator<SAMRecord> getIterator();
-
- CloseableIterator<SAMRecord> getIterator(SAMFileSpan fileSpan);
-
- SAMFileSpan getFilePointerSpanningReads();
-
- CloseableIterator<SAMRecord> query(QueryInterval[] intervals, boolean contained);
-
- CloseableIterator<SAMRecord> queryAlignmentStart(String sequence, int start);
-
- CloseableIterator<SAMRecord> queryUnmapped();
-
- void close();
-
- ValidationStringency getValidationStringency();
- }
-
- /**
- * Decorator for a {@link SamReader.PrimitiveSamReader} that expands its functionality into a {@link SamReader},
- * given the backing {@link SamInputResource}.
- *
- * Wraps the {@link Indexing} interface as well, which was originally separate from {@link SamReader} but in practice
- * the two are always implemented by the same class.
- *
- */
- class PrimitiveSamReaderToSamReaderAdapter implements SamReader, Indexing {
- final PrimitiveSamReader p;
- final SamInputResource resource;
-
- public PrimitiveSamReaderToSamReaderAdapter(final PrimitiveSamReader p, final SamInputResource resource) {
- this.p = p;
- this.resource = resource;
- }
-
- PrimitiveSamReader underlyingReader() {
- return p;
- }
-
- @Override
- public SAMRecordIterator queryOverlapping(final String sequence, final int start, final int end) {
- return query(sequence, start, end, false);
- }
-
- @Override
- public SAMRecordIterator queryOverlapping(final QueryInterval[] intervals) {
- return query(intervals, false);
- }
-
- @Override
- public SAMRecordIterator queryContained(final String sequence, final int start, final int end) {
- return query(sequence, start, end, true);
- }
-
- @Override
- public SAMRecordIterator queryContained(final QueryInterval[] intervals) {
- return query(intervals, true);
- }
-
- /**
- * Wraps the boilerplate code for querying a record's mate, which is common across many implementations.
- *
- * @param rec Record for which mate is sought. Must be a paired read.
- * @return
- */
- @Override
- public SAMRecord queryMate(final SAMRecord rec) {
- if (!rec.getReadPairedFlag()) {
- throw new IllegalArgumentException("queryMate called for unpaired read.");
- }
- if (rec.getFirstOfPairFlag() == rec.getSecondOfPairFlag()) {
- throw new IllegalArgumentException("SAMRecord must be either first and second of pair, but not both.");
- }
- final boolean firstOfPair = rec.getFirstOfPairFlag();
- final CloseableIterator<SAMRecord> it;
- if (rec.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- it = queryUnmapped();
- } else {
- it = queryAlignmentStart(rec.getMateReferenceName(), rec.getMateAlignmentStart());
- }
- try {
- SAMRecord mateRec = null;
- while (it.hasNext()) {
- final SAMRecord next = it.next();
- if (!next.getReadPairedFlag()) {
- if (rec.getReadName().equals(next.getReadName())) {
- throw new SAMFormatException("Paired and unpaired reads with same name: " + rec.getReadName());
- }
- continue;
- }
- if (firstOfPair) {
- if (next.getFirstOfPairFlag()) continue;
- } else {
- if (next.getSecondOfPairFlag()) continue;
- }
- if (rec.getReadName().equals(next.getReadName())) {
- if (mateRec != null) {
- throw new SAMFormatException("Multiple SAMRecord with read name " + rec.getReadName() +
- " for " + (firstOfPair ? "second" : "first") + " end.");
- }
- mateRec = next;
- }
- }
- return mateRec;
- } finally {
- it.close();
- }
- }
-
- @Override
- public boolean hasBrowseableIndex() {
- return hasIndex() && getIndex() instanceof BrowseableBAMIndex;
- }
-
- @Override
- public BrowseableBAMIndex getBrowseableIndex() {
- final BAMIndex index = getIndex();
- if (!(index instanceof BrowseableBAMIndex))
- throw new SAMException("Cannot return index: index created by BAM is not browseable.");
- return BrowseableBAMIndex.class.cast(index);
- }
-
- @Override
- public SAMRecordIterator iterator() {
- return new AssertingIterator(p.getIterator());
- }
-
- @Override
- public SAMRecordIterator iterator(final SAMFileSpan chunks) {
- return new AssertingIterator(p.getIterator(chunks));
- }
-
- @Override
- public void close() {
- p.close();
- }
-
- @Override
- public SAMFileSpan getFilePointerSpanningReads() {
- return p.getFilePointerSpanningReads();
- }
-
- @Override
- public SAMFileHeader getFileHeader() {
- return p.getFileHeader();
- }
-
- @Override
- public Type type() {
- return p.type();
- }
-
- @Override
- public String getResourceDescription() {
- return this.resource.toString();
- }
-
- @Override
- public boolean hasIndex() {
- return p.hasIndex();
- }
-
- @Override
- public Indexing indexing() {
- return this;
- }
-
- @Override
- public BAMIndex getIndex() {
- return p.getIndex();
- }
-
- @Override
- public SAMRecordIterator query(final QueryInterval[] intervals, final boolean contained) {
- return AssertingIterator.of(p.query(intervals, contained));
- }
-
- @Override
- public SAMRecordIterator query(final String sequence, final int start, final int end, final boolean contained) {
- return query(new QueryInterval[]{new QueryInterval(getFileHeader().getSequenceIndex(sequence), start, end)}, contained);
- }
-
- @Override
- public SAMRecordIterator queryUnmapped() {
- return AssertingIterator.of(p.queryUnmapped());
- }
-
- @Override
- public SAMRecordIterator queryAlignmentStart(final String sequence, final int start) {
- return AssertingIterator.of(p.queryAlignmentStart(sequence, start));
- }
-
- }
-
- static class AssertingIterator implements SAMRecordIterator {
-
- static AssertingIterator of(final CloseableIterator<SAMRecord> iterator) {
- return new AssertingIterator(iterator);
- }
-
- private final CloseableIterator<SAMRecord> wrappedIterator;
- private SAMRecord previous = null;
- private SAMRecordComparator comparator = null;
-
- public AssertingIterator(final CloseableIterator<SAMRecord> iterator) {
- wrappedIterator = iterator;
- }
-
- public SAMRecordIterator assertSorted(final SAMFileHeader.SortOrder sortOrder) {
-
- if (sortOrder == null || sortOrder == SAMFileHeader.SortOrder.unsorted) {
- comparator = null;
- return this;
- }
-
- comparator = sortOrder.getComparatorInstance();
- return this;
- }
-
- public SAMRecord next() {
- final SAMRecord result = wrappedIterator.next();
- if (comparator != null) {
- if (previous != null) {
- if (comparator.fileOrderCompare(previous, result) > 0) {
- throw new IllegalStateException(MessageFormat.format(
- "Records {0} ({1}:{2}) should come after {3} ({4}:{5}) when sorting with {6}",
- previous.getReadName(),
- previous.getReferenceName(),
- previous.getAlignmentStart(),
- result.getReadName(),
- result.getReferenceName(),
- result.getAlignmentStart(),
- comparator.getClass().getName())
- );
- }
- }
- previous = result;
- }
- return result;
- }
-
- public void close() { wrappedIterator.close(); }
-
- public boolean hasNext() { return wrappedIterator.hasNext(); }
-
- public void remove() { wrappedIterator.remove(); }
- }
-
- /**
- * Internal interface for SAM/BAM/CRAM file reader implementations,
- * as distinct from non-file-based readers.
- *
- * Implemented as an abstract class to enforce better access control.
- *
- * TODO -- Many of these methods only apply for a subset of implementations,
- * TODO -- and either no-op or throw an exception for the others.
- * TODO -- We should consider refactoring things to avoid this;
- * TODO -- perhaps we can get away with not having this class at all.
- */
- abstract class ReaderImplementation implements PrimitiveSamReader {
- abstract void enableFileSource(final SamReader reader, final boolean enabled);
-
- abstract void enableIndexCaching(final boolean enabled);
-
- abstract void enableIndexMemoryMapping(final boolean enabled);
-
- abstract void enableCrcChecking(final boolean enabled);
-
- abstract void setSAMRecordFactory(final SAMRecordFactory factory);
-
- abstract void setValidationStringency(final ValidationStringency validationStringency);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamReaderFactory.java b/src/main/java/htsjdk/samtools/SamReaderFactory.java
deleted file mode 100644
index 8769f48..0000000
--- a/src/main/java/htsjdk/samtools/SamReaderFactory.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.sra.SRAAccession;
-import htsjdk.samtools.util.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.zip.GZIPInputStream;
-
-/**
- * <p>Describes the functionality for producing {@link SamReader}, and offers a
- * handful of static generators.</p>
- * <pre>
- * SamReaderFactory.makeDefault().open(new File("/my/bam.bam");
- * </pre>
- * <p>Example: Configure a factory</p>
- * <pre>
- * final {@link SamReaderFactory} factory =
- * SamReaderFactory.makeDefault()
- * .enable({@link Option#INCLUDE_SOURCE_IN_RECORDS}, {@link Option#VALIDATE_CRC_CHECKSUMS})
- * .validationStringency({@link ValidationStringency#SILENT});
- *
- * </pre>
- * <p>Example: Open two bam files from different sources, using different options</p>
- * <pre>
- * final {@link SamReaderFactory} factory =
- * SamReaderFactory.makeDefault()
- * .enable({@link Option#INCLUDE_SOURCE_IN_RECORDS}, {@link Option#VALIDATE_CRC_CHECKSUMS})
- * .validationStringency({@link ValidationStringency#SILENT});
- *
- * // File-based bam
- * final {@link SamReader} fileReader = factory.open(new File("/my/bam.bam"));
- *
- * // HTTP-hosted BAM with index from an arbitrary stream
- * final SeekableStream myBamIndexStream = ...
- * final {@link SamInputResource} resource =
- * {@link SamInputResource}.of(new URL("http://example.com/data.bam")).index(myBamIndexStream);
- * final {@link SamReader} complicatedReader = factory.open(resource);
- * </pre>
- *
- * @author mccowan
- */
-public abstract class SamReaderFactory {
-
- private static ValidationStringency defaultValidationStringency = ValidationStringency.DEFAULT_STRINGENCY;
-
- abstract public SamReader open(final File file);
-
- public SamReader open(final Path path) {
- final SamInputResource r = SamInputResource.of(path);
- final Path indexMaybe = SamFiles.findIndex(path);
- if (indexMaybe != null) r.index(indexMaybe);
- return open(r);
- }
-
- abstract public SamReader open(final SamInputResource resource);
-
- abstract public ValidationStringency validationStringency();
-
- abstract public CRAMReferenceSource referenceSource();
-
- /** Set this factory's {@link htsjdk.samtools.SAMRecordFactory} to the provided one, then returns itself. */
- abstract public SamReaderFactory samRecordFactory(final SAMRecordFactory samRecordFactory);
-
- /** Enables the provided {@link Option}s, then returns itself. */
- abstract public SamReaderFactory enable(final Option... options);
-
- /** Disables the provided {@link Option}s, then returns itself. */
- abstract public SamReaderFactory disable(final Option... options);
-
- /** Sets a specific Option to a boolean value. * */
- abstract public SamReaderFactory setOption(final Option option, boolean value);
-
- /** Sets the specified reference sequence * */
- abstract public SamReaderFactory referenceSequence(File referenceSequence);
-
- /** Sets the specified reference sequence * */
- abstract public SamReaderFactory referenceSource(CRAMReferenceSource referenceSequence);
-
- /** Utility method to open the file get the header and close the file */
- abstract public SAMFileHeader getFileHeader(File samFile);
-
- /** Reapplies any changed options to the reader * */
- abstract public void reapplyOptions(SamReader reader);
-
- /** Set this factory's {@link ValidationStringency} to the provided one, then returns itself. */
- abstract public SamReaderFactory validationStringency(final ValidationStringency validationStringency);
-
- /** Set whether readers created by this factory will use asynchronous IO.
- * If this methods is not called, this flag will default to the value of {@link Defaults#USE_ASYNC_IO_FOR_SAMTOOLS}.
- * Note that this option may not be applicable to all readers returned from this factory.
- * Returns the factory itself. */
- abstract public SamReaderFactory setUseAsyncIo(final boolean asynchronousIO);
-
- private static SamReaderFactoryImpl DEFAULT =
- new SamReaderFactoryImpl(Option.DEFAULTS, defaultValidationStringency, DefaultSAMRecordFactory.getInstance());
-
- public static void setDefaultValidationStringency(final ValidationStringency defaultValidationStringency) {
- SamReaderFactory.defaultValidationStringency = defaultValidationStringency;
- // The default may have changed, so reset the default SamReader
- DEFAULT = new SamReaderFactoryImpl(Option.DEFAULTS, defaultValidationStringency, DefaultSAMRecordFactory.getInstance());
- }
-
- /** Creates a copy of the default {@link SamReaderFactory}. */
- public static SamReaderFactory makeDefault() {
- return SamReaderFactoryImpl.copyOf(DEFAULT);
- }
-
- /**
- * Creates an "empty" factory with no enabled {@link Option}s, {@link ValidationStringency#DEFAULT_STRINGENCY}, and
- * {@link htsjdk.samtools.DefaultSAMRecordFactory}.
- */
- public static SamReaderFactory make() {
- return new SamReaderFactoryImpl(EnumSet.noneOf(Option.class), ValidationStringency.DEFAULT_STRINGENCY, DefaultSAMRecordFactory.getInstance());
- }
-
- private static class SamReaderFactoryImpl extends SamReaderFactory {
- private final static Log LOG = Log.getInstance(SamReaderFactory.class);
- private final EnumSet<Option> enabledOptions;
- private ValidationStringency validationStringency;
- private boolean asynchronousIO = Defaults.USE_ASYNC_IO_READ_FOR_SAMTOOLS;
- private SAMRecordFactory samRecordFactory;
- private CustomReaderFactory customReaderFactory;
- private CRAMReferenceSource referenceSource;
-
- private SamReaderFactoryImpl(final EnumSet<Option> enabledOptions, final ValidationStringency validationStringency, final SAMRecordFactory samRecordFactory) {
- this.enabledOptions = EnumSet.copyOf(enabledOptions);
- this.samRecordFactory = samRecordFactory;
- this.validationStringency = validationStringency;
- this.customReaderFactory = CustomReaderFactory.getInstance();
- }
-
- @Override
- public SamReader open(final File file) {
- final SamInputResource r = SamInputResource.of(file);
- final File indexMaybe = SamFiles.findIndex(file);
- if (indexMaybe != null) r.index(indexMaybe);
- return open(r);
- }
-
-
- @Override
- public ValidationStringency validationStringency() {
- return validationStringency;
- }
-
- @Override
- public CRAMReferenceSource referenceSource() {
- return referenceSource;
- }
-
- @Override
- public SamReaderFactory samRecordFactory(final SAMRecordFactory samRecordFactory) {
- this.samRecordFactory = samRecordFactory;
- return this;
- }
-
- @Override
- public SamReaderFactory enable(final Option... options) {
- Collections.addAll(this.enabledOptions, options);
- return this;
- }
-
- @Override
- public SamReaderFactory disable(final Option... options) {
- for (final Option option : options) {
- this.enabledOptions.remove(option);
- }
- return this;
- }
-
- @Override
- public SamReaderFactory setOption(final Option option, final boolean value) {
- if (value) {
- return enable(option);
- } else {
- return disable(option);
- }
- }
-
- @Override
- public SamReaderFactory referenceSequence(final File referenceSequence) {
- this.referenceSource = new ReferenceSource(referenceSequence);
- return this;
- }
-
- @Override
- public SamReaderFactory referenceSource(final CRAMReferenceSource referenceSource) {
- this.referenceSource = referenceSource;
- return this;
- }
-
- @Override
- public SAMFileHeader getFileHeader(final File samFile) {
- final SamReader reader = open(samFile);
- final SAMFileHeader header = reader.getFileHeader();
- CloserUtil.close(reader);
- return header;
- }
-
- @Override
- public void reapplyOptions(final SamReader reader) {
- for (final Option option : enabledOptions) {
- option.applyTo((SamReader.PrimitiveSamReaderToSamReaderAdapter) reader);
- }
- }
-
- @Override
- public SamReaderFactory validationStringency(final ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- return this;
- }
-
- @Override
- public SamReaderFactory setUseAsyncIo(final boolean asynchronousIO){
- this.asynchronousIO = asynchronousIO;
- return this;
- }
-
- @Override
- public SamReader open(final SamInputResource resource) {
- final SamReader.PrimitiveSamReader primitiveSamReader;
- try {
- final InputResource data = resource.data();
- final InputResource indexMaybe = resource.indexMaybe();
- final boolean indexDefined = indexMaybe != null;
-
- final InputResource.Type type = data.type();
- if (type == InputResource.Type.URL) {
- SamReader reader = customReaderFactory.maybeOpen(
- data.asUrl());
- if (reader != null) {
- return reader;
- }
- }
- if (type == InputResource.Type.SEEKABLE_STREAM || type == InputResource.Type.URL) {
- if (SamStreams.sourceLikeBam(data.asUnbufferedSeekableStream())) {
- final SeekableStream bufferedIndexStream;
- if (indexDefined && indexMaybe.asUnbufferedSeekableStream() != null) {
- bufferedIndexStream = IOUtil.maybeBufferedSeekableStream(indexMaybe.asUnbufferedSeekableStream());
- } else {
- // TODO: Throw an exception here? An index _may_ have been provided, but we're ignoring it
- bufferedIndexStream = null;
- }
- primitiveSamReader = new BAMFileReader(
- IOUtil.maybeBufferedSeekableStream(data.asUnbufferedSeekableStream()),
- bufferedIndexStream,
- false,
- asynchronousIO,
- validationStringency,
- this.samRecordFactory
- );
- } else if (SamStreams.sourceLikeCram(data.asUnbufferedSeekableStream())) {
- if (referenceSource == null) {
- referenceSource = ReferenceSource.getDefaultCRAMReferenceSource();
- }
- SeekableStream bufferedIndexStream = indexDefined ?
- IOUtil.maybeBufferedSeekableStream(indexMaybe.asUnbufferedSeekableStream()) :
- null;
- primitiveSamReader = new CRAMFileReader(
- IOUtil.maybeBufferedSeekableStream(data.asUnbufferedSeekableStream()),
- bufferedIndexStream, referenceSource, validationStringency);
- } else {
- // assume its a SAM file/no index
- LOG.warn("Unable to detect file format from input URL or stream, assuming SAM format.");
- primitiveSamReader = new SAMTextReader(
- IOUtil.toBufferedStream(data.asUnbufferedInputStream()),
- validationStringency, this.samRecordFactory);
- }
- } else if (type == InputResource.Type.SRA_ACCESSION) {
- primitiveSamReader = new SRAFileReader(data.asSRAAccession());
- } else {
- InputStream bufferedStream =
- IOUtil.maybeBufferInputStream(
- data.asUnbufferedInputStream(),
- Math.max(Defaults.BUFFER_SIZE, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE)
- );
- File sourceFile = data.asFile();
- // calling asFile is safe even if indexMaybe is a Google Cloud Storage bucket
- // (in that case we just get null)
- final File indexFile = indexMaybe == null ? null : indexMaybe.asFile();
- if (SamStreams.isBAMFile(bufferedStream)) {
- if (sourceFile == null || !sourceFile.isFile()) {
- // check whether we can seek
- final SeekableStream indexSeekable = indexMaybe == null ? null : indexMaybe.asUnbufferedSeekableStream();
- // do not close bufferedStream, it's the same stream we're getting here.
- SeekableStream sourceSeekable = data.asUnbufferedSeekableStream();
- if (null == sourceSeekable || null == indexSeekable) {
- // not seekable.
- // it's OK that we consumed a bit of the stream already, this ctor expects it.
- primitiveSamReader = new BAMFileReader(bufferedStream, indexFile, false, asynchronousIO, validationStringency, this.samRecordFactory);
- } else {
- // seekable.
- // need to return to the beginning because it's the same stream we used earlier
- // and read a bit from, and that form of the ctor expects the stream to start at 0.
- sourceSeekable.seek(0);
- primitiveSamReader = new BAMFileReader(
- sourceSeekable, indexSeekable, false, asynchronousIO, validationStringency, this.samRecordFactory);
- }
- } else {
- bufferedStream.close();
- primitiveSamReader = new BAMFileReader(sourceFile, indexFile, false, asynchronousIO, validationStringency, this.samRecordFactory);
- }
- } else if (BlockCompressedInputStream.isValidFile(bufferedStream)) {
- primitiveSamReader = new SAMTextReader(new BlockCompressedInputStream(bufferedStream), validationStringency, this.samRecordFactory);
- } else if (SamStreams.isGzippedSAMFile(bufferedStream)) {
- primitiveSamReader = new SAMTextReader(new GZIPInputStream(bufferedStream), validationStringency, this.samRecordFactory);
- } else if (SamStreams.isCRAMFile(bufferedStream)) {
- if (referenceSource == null) {
- referenceSource = ReferenceSource.getDefaultCRAMReferenceSource();
- }
- if (sourceFile == null || !sourceFile.isFile()) {
- primitiveSamReader = new CRAMFileReader(bufferedStream, indexFile, referenceSource, validationStringency);
- } else {
- bufferedStream.close();
- primitiveSamReader = new CRAMFileReader(sourceFile, indexFile, referenceSource, validationStringency);
- }
- } else if (sourceFile != null && isSra(sourceFile)) {
- if (bufferedStream != null) {
- bufferedStream.close();
- }
- primitiveSamReader = new SRAFileReader(new SRAAccession(sourceFile.getPath()));
- } else {
- if (indexDefined) {
- bufferedStream.close();
- throw new RuntimeException("Cannot use index file with textual SAM file");
- }
- primitiveSamReader = new SAMTextReader(bufferedStream, sourceFile, validationStringency, this.samRecordFactory);
- }
- }
-
- // Apply the options defined by this factory to this reader
- final SamReader.PrimitiveSamReaderToSamReaderAdapter reader =
- new SamReader.PrimitiveSamReaderToSamReaderAdapter(primitiveSamReader, resource);
-
- for (final Option option : enabledOptions) {
- option.applyTo(reader);
- }
-
- return reader;
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /** Attempts to detect whether the file is an SRA accessioned file. If SRA support is not available, returns false. */
- private boolean isSra(final File sourceFile) {
- try {
- // if SRA fails to initialize (the most common reason is a failure to find/load native libraries),
- // it will throw a subclass of java.lang.Error and here we only catch subclasses of java.lang.Exception
- //
- // Note: SRA initialization errors should not be ignored, but rather shown to user
- return SRAAccession.isValid(sourceFile.getPath());
- } catch (final Exception e) {
- return false;
- }
- }
-
- public static SamReaderFactory copyOf(final SamReaderFactoryImpl target) {
- return new SamReaderFactoryImpl(target.enabledOptions, target.validationStringency, target.samRecordFactory);
- }
- }
-
- /** A collection of binary {@link SamReaderFactory} options. */
- public enum Option {
- /**
- * The factory's {@link SamReader}s will produce populated (non-null) values when calling {@link SAMRecord#getFileSource()}.
- * <p/>
- * This option increases memory footprint slightly per {@link htsjdk.samtools.SAMRecord}.
- */
- INCLUDE_SOURCE_IN_RECORDS {
- @Override
- void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableFileSource(reader, true);
- }
-
- @Override
- void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
- underlyingReader.enableFileSource(reader, true);
- }
-
- @Override
- void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableFileSource(reader, true);
- }
-
- @Override
- void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableFileSource(reader, true);
- }
- },
-
- /**
- * The factory's {@link SamReader}s' {@link SamReader#indexing()}'s calls to {@link SamReader.Indexing#getIndex()} will produce
- * {@link BAMIndex}es that do some caching in memory instead of reading the index from the disk for each query operation.
- *
- * @see SamReader#indexing()
- * @see htsjdk.samtools.SamReader.Indexing#getIndex()
- */
- CACHE_FILE_BASED_INDEXES {
- @Override
- void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexCaching(true);
- }
-
- @Override
- void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexCaching(true);
- }
-
- @Override
- void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexCaching(true);
- }
- },
-
- /**
- * The factory's {@link SamReader}s' will not use memory mapping for accessing index files (which is used by default). This is
- * slower but more scalable when accessing large numbers of BAM files sequentially.
- *
- * @see SamReader#indexing()
- * @see htsjdk.samtools.SamReader.Indexing#getIndex()
- */
- DONT_MEMORY_MAP_INDEX {
- @Override
- void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexMemoryMapping(false);
- }
-
- @Override
- void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexMemoryMapping(false);
- }
-
- @Override
- void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableIndexMemoryMapping(false);
- }
- },
-
- /**
- * Eagerly decode {@link htsjdk.samtools.SamReader}'s {@link htsjdk.samtools.SAMRecord}s, which can reduce memory footprint if many
- * fields are being read per record, or if fields are going to be updated.
- */
- EAGERLY_DECODE {
- @Override
- void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.setEagerDecode(true);
- }
-
- @Override
- void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
- },
-
- /**
- * For {@link htsjdk.samtools.SamReader}s backed by block-compressed streams, enable CRC validation of those streams. This is an
- * expensive operation, but serves to ensure validity of the stream.
- */
- VALIDATE_CRC_CHECKSUMS {
- @Override
- void applyTo(final BAMFileReader underlyingReader, final SamReader reader) {
- underlyingReader.enableCrcChecking(true);
- }
-
- @Override
- void applyTo(final SAMTextReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final CRAMFileReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- @Override
- void applyTo(final SRAFileReader underlyingReader, final SamReader reader) {
- logDebugIgnoringOption(reader, this);
- }
-
- };
-
- public static EnumSet<Option> DEFAULTS = EnumSet.noneOf(Option.class);
-
- /** Applies this option to the provided reader, if applicable. */
- void applyTo(final SamReader.PrimitiveSamReaderToSamReaderAdapter reader) {
- final SamReader.PrimitiveSamReader underlyingReader = reader.underlyingReader();
- if (underlyingReader instanceof BAMFileReader) {
- applyTo((BAMFileReader) underlyingReader, reader);
- } else if (underlyingReader instanceof SAMTextReader) {
- applyTo((SAMTextReader) underlyingReader, reader);
- } else if (underlyingReader instanceof CRAMFileReader) {
- applyTo((CRAMFileReader) underlyingReader, reader);
- } else if (underlyingReader instanceof SRAFileReader) {
- applyTo((SRAFileReader) underlyingReader, reader);
- } else {
- throw new IllegalArgumentException(String.format("Unrecognized reader type: %s.", underlyingReader.getClass()));
- }
-
- }
-
- private static void logDebugIgnoringOption(final SamReader r, final Option option) {
- LOG.debug(String.format("Ignoring %s option; does not apply to %s readers.", option, r.getClass().getSimpleName()));
- }
-
- private final static Log LOG = Log.getInstance(Option.class);
-
- abstract void applyTo(final BAMFileReader underlyingReader, final SamReader reader);
-
- abstract void applyTo(final SAMTextReader underlyingReader, final SamReader reader);
-
- abstract void applyTo(final CRAMFileReader underlyingReader, final SamReader reader);
-
- abstract void applyTo(final SRAFileReader underlyingReader, final SamReader reader);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/SamStreams.java b/src/main/java/htsjdk/samtools/SamStreams.java
deleted file mode 100644
index 114d23b..0000000
--- a/src/main/java/htsjdk/samtools/SamStreams.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.zip.GZIPInputStream;
-
-/**
- * Utilities related to processing of {@link java.io.InputStream}s encoding SAM data
- *
- * @author mccowan
- */
-public class SamStreams {
- private static int readBytes(final InputStream stream, final byte[] buffer, final int offset, final int length)
- throws IOException {
- int bytesRead = 0;
- while (bytesRead < length) {
- final int count = stream.read(buffer, offset + bytesRead, length - bytesRead);
- if (count <= 0) {
- break;
- }
- bytesRead += count;
- }
- return bytesRead;
- }
-
- public static boolean isCRAMFile(final InputStream stream) throws IOException {
- stream.mark(4);
- final int buffSize = CramHeader.MAGIC.length;
- final byte[] buffer = new byte[buffSize];
- readBytes(stream, buffer, 0, buffSize);
- stream.reset();
-
- return Arrays.equals(buffer, CramHeader.MAGIC);
- }
-
- /**
- * @param stream stream.markSupported() must be true
- * @return true if this looks like a BAM file.
- */
- public static boolean isBAMFile(final InputStream stream)
- throws IOException {
- if (!BlockCompressedInputStream.isValidFile(stream)) {
- return false;
- }
- final int buffSize = BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE;
- stream.mark(buffSize);
- final byte[] buffer = new byte[buffSize];
- readBytes(stream, buffer, 0, buffSize);
- stream.reset();
- try(final BlockCompressedInputStream bcis = new BlockCompressedInputStream(new ByteArrayInputStream(buffer))){
- final byte[] magicBuf = new byte[4];
- final int magicLength = readBytes(bcis, magicBuf, 0, 4);
- return magicLength == BAMFileConstants.BAM_MAGIC.length && Arrays.equals(BAMFileConstants.BAM_MAGIC, magicBuf);
- }
- }
-
- /**
- * Checks whether the file is a gzipped sam file. Returns true if it
- * is and false otherwise.
- */
- public static boolean isGzippedSAMFile(final InputStream stream) {
- if (!stream.markSupported()) {
- throw new IllegalArgumentException("Cannot test a stream that doesn't support marking.");
- }
- stream.mark(8000);
-
- try {
- final GZIPInputStream gunzip = new GZIPInputStream(stream);
- final int ch = gunzip.read();
- return true;
- } catch (final IOException ioe) {
- return false;
- } finally {
- try {
- stream.reset();
- } catch (final IOException ioe) {
- throw new IllegalStateException("Could not reset stream.");
- }
- }
- }
-
- // Its too expensive to examine the remote file to determine type.
- // Rely on file extension.
- public static boolean sourceLikeBam(final SeekableStream strm) {
- String source = strm.getSource();
- if (source == null) {
- // assume any stream with a null source is a BAM file
- // (https://github.com/samtools/htsjdk/issues/619)
- return true;
- }
-
- //Source will typically be a file path or URL
- //If it's a URL we require one of the query parameters to be a cram file
- try {
- final URL sourceURL = new URL(source);
- final String urlPath = sourceURL.getPath().toLowerCase();
- String queryParams = sourceURL.getQuery();
- if (queryParams != null) {
- queryParams = queryParams.toLowerCase();
- }
- return urlPath.endsWith(".bam") ||
- (queryParams != null &&
- (queryParams.endsWith(".bam") ||
- queryParams.contains(".bam?") ||
- queryParams.contains(".bam&") ||
- queryParams.contains(".bam%26"))
- );
- }
- catch (MalformedURLException e) {
- source = source.toLowerCase();
- return source.endsWith(".bam") ||
- source.contains(".bam?") ||
- source.contains(".bam&") ||
- source.contains(".bam%26");
- }
- }
-
- // Its too expensive to examine the remote file to determine type.
- // Rely on file extension.
- public static boolean sourceLikeCram(final SeekableStream strm) {
- String source = strm.getSource();
- if (source == null) {
- // sourceLikeBam assumes any stream with a null source is a BAM file
- // (https://github.com/samtools/htsjdk/issues/619); in order to not
- // propagate more chaos we return false here
- return false;
- }
-
- // Source will typically be a file path or URL
- // If it's a URL we require one of the query parameters to be a cram file
- try {
- final URL sourceURL = new URL(source);
- final String urlPath = sourceURL.getPath().toLowerCase();
- String queryParams = sourceURL.getQuery();
- if (queryParams != null) {
- queryParams = queryParams.toLowerCase();
- }
- return urlPath.endsWith(".cram") ||
- (queryParams != null &&
- (queryParams.endsWith(".cram") ||
- queryParams.contains(".cram?") ||
- queryParams.contains(".cram&") ||
- queryParams.contains(".cram%26"))
- );
- }
- catch (MalformedURLException e) {
- source = source.toLowerCase();
- return source.endsWith(".cram") ||
- source.contains(".cram?") ||
- source.contains(".cram&") ||
- source.contains(".cram%26");
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java b/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java
deleted file mode 100644
index 328e748..0000000
--- a/src/main/java/htsjdk/samtools/SecondaryOrSupplementarySkippingIterator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.PeekIterator;
-
-/**
- * Wrapper around SAMRecord iterator that skips over secondary and supplementary elements.
- * This iterator conflates a filtering iterator and a peekable iterator. It would be cleaner to
- * handle those concerns separately. This class should be viewed as a replacement for NotPrimarySkippingIterator,
- * in that we did not want to change the functionality of NPSI to no longer match its name
- */
-public class SecondaryOrSupplementarySkippingIterator {
- private final PeekIterator<SAMRecord> it;
-
- public SecondaryOrSupplementarySkippingIterator(final CloseableIterator<SAMRecord> underlyingIt) {
- it = new PeekIterator<SAMRecord>(underlyingIt);
- skipAnyNotprimary();
- }
-
- public boolean hasCurrent() {
- return it.hasNext();
- }
-
- public SAMRecord getCurrent() {
- assert(hasCurrent());
- return it.peek();
- }
-
- public boolean advance() {
- it.next();
- skipAnyNotprimary();
- return hasCurrent();
- }
-
- private void skipAnyNotprimary() {
- while (it.hasNext() && it.peek().isSecondaryOrSupplementary()) {
- it.next();
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java b/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java
deleted file mode 100644
index 6b653fe..0000000
--- a/src/main/java/htsjdk/samtools/StreamInflatingIndexingOutputStream.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package htsjdk.samtools;
-
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-
-/**
- * OutputStream implementation that writes output to an underlying output stream while also copying the
- * same bytes to a PipedOutputStream that routes the data back into an Indexer to generate a BAMIndex
- * by inflating and decoding the stream and feeding the SAMRecords to a BAMIndexer.
- */
-class StreamInflatingIndexingOutputStream extends OutputStream {
- private final OutputStream s1;
- private final PipedOutputStream s2;
- private final Thread thread;
-
- public StreamInflatingIndexingOutputStream(final OutputStream s1, final File indexFile) {
- try {
- this.s1 = s1;
- this.s2 = new PipedOutputStream();
- final PipedInputStream pin = new PipedInputStream(this.s2, Defaults.NON_ZERO_BUFFER_SIZE);
- this.thread = new Thread(new Indexer(indexFile, pin), "BamIndexingThread");
- this.thread.start();
- } catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-
- @Override
- public final void write(final int b) throws IOException {
- this.s1.write(b);
- this.s2.write(b);
- }
-
- @Override
- public final void write(final byte[] b) throws IOException {
- this.s1.write(b);
- this.s2.write(b);
- }
-
- @Override
- public final void write(final byte[] b, final int off, final int len) throws IOException {
- this.s1.write(b, off, len);
- this.s2.write(b, off, len);
- }
-
- @Override
- public final void flush() throws IOException {
- this.s1.flush();
- this.s2.flush();
- }
-
- @Override
- public final void close() throws IOException {
- this.s1.close();
- this.s2.close();
-
- try {
- this.thread.join();
- } catch (final InterruptedException ie) {
- throw new RuntimeException(ie);
- }
- }
-}
-
-/**
- * A little class that takes an InputStream from which it reads a BAM file, generates
- * a BAMIndex and then writes the index to the File provided. All operations are designed
- * to be carried out in a separate thread.
- */
-class Indexer implements Runnable {
- private final File index;
- private final InputStream stream;
-
- /** Constructs an indexer that reads from the stream provided and writes an index to the File provided. */
- Indexer(final File index, final InputStream stream) {
- this.index = index;
- this.stream = stream;
- }
-
- /** Runnable implementation that reads the entire stream and writes the index. */
- @Override
- public void run() {
- final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).disable(SamReaderFactory.Option.VALIDATE_CRC_CHECKSUMS)
- .open(SamInputResource.of(this.stream));
-
- final BAMIndexer indexer = new BAMIndexer(this.index, in.getFileHeader());
- for (final SAMRecord rec : in) {
- indexer.processAlignment(rec);
- }
-
- indexer.finish();
- CloserUtil.close(in);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java b/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java
deleted file mode 100644
index 084d9c0..0000000
--- a/src/main/java/htsjdk/samtools/TagValueAndUnsignedArrayFlag.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-/**
- * CVO to use as a method return value.
- */
-public class TagValueAndUnsignedArrayFlag {
- public final Object value;
- public final boolean isUnsignedArray;
-
- public TagValueAndUnsignedArrayFlag(Object value, boolean unsignedArray) {
- this.value = value;
- isUnsignedArray = unsignedArray;
- }
-
- TagValueAndUnsignedArrayFlag(Object value) {
- this.value = value;
- this.isUnsignedArray = false;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/TextCigarCodec.java b/src/main/java/htsjdk/samtools/TextCigarCodec.java
deleted file mode 100755
index 6175443..0000000
--- a/src/main/java/htsjdk/samtools/TextCigarCodec.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Convert between String and Cigar class representations of CIGAR.
- */
-public class TextCigarCodec
-{
- private static final byte ZERO_BYTE = "0".getBytes()[0];
- private static final byte NINE_BYTE = "9".getBytes()[0];
-
- /**
- * Convert from Cigar class representation to String.
- * @param cigar in Cigar class format
- * @return CIGAR in String form ala SAM text file. "*" means empty CIGAR.
- */
- public static String encode(final Cigar cigar) {
- if (cigar.isEmpty()) {
- return SAMRecord.NO_ALIGNMENT_CIGAR;
- }
- final StringBuilder ret = new StringBuilder();
- for (final CigarElement cigarElement : cigar.getCigarElements()) {
- ret.append(cigarElement.getLength());
- ret.append(cigarElement.getOperator());
- }
- return ret.toString();
- }
-
- /**
- * Convert from String CIGAR representation to Cigar class representation. Does not
- * do validation beyond the most basic CIGAR string well-formedness, i.e. each operator is
- * valid, and preceded by a decimal length.
- * @param textCigar CIGAR in String form ala SAM text file. "*" means empty CIGAR.
- * @throws RuntimeException if textCigar is invalid at the most basic level.
- * @return cigar in Cigar class format
- */
- public static Cigar decode(final String textCigar) {
- if (SAMRecord.NO_ALIGNMENT_CIGAR.equals(textCigar)) {
- return new Cigar();
- }
- final Cigar ret = new Cigar();
- final byte[] cigarBytes = StringUtil.stringToBytes(textCigar);
- for (int i = 0; i < cigarBytes.length; ++i) {
- if (!isDigit(cigarBytes[i])) {
- throw new IllegalArgumentException("Malformed CIGAR string: " + textCigar);
- }
- int length = (cigarBytes[i] - ZERO_BYTE);
- for (++i; isDigit(cigarBytes[i]); ++i) {
- length = (length * 10) + cigarBytes[i] - ZERO_BYTE;
- }
- final CigarOperator operator = CigarOperator.characterToEnum(cigarBytes[i]);
- ret.add(new CigarElement(length, operator));
- }
- return ret;
- }
-
- private static boolean isDigit(final byte c) {
- return c >= ZERO_BYTE && c <= NINE_BYTE;
- }
-
-
-
-}
-
-/******************************************************************/
-/**************************[END OF TextCigarCodec.java]*************************/
-/******************************************************************/
diff --git a/src/main/java/htsjdk/samtools/TextTagCodec.java b/src/main/java/htsjdk/samtools/TextTagCodec.java
deleted file mode 100644
index 60363e1..0000000
--- a/src/main/java/htsjdk/samtools/TextTagCodec.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.DateParser;
-import htsjdk.samtools.util.Iso8601Date;
-import htsjdk.samtools.util.StringUtil;
-
-import java.lang.reflect.Array;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Map;
-
-/**
- * Converter between SAM text representation of a tag, and in-memory Object representation.
- * Note that this class is not thread-safe, in that some local variables have been made into instance
- * variables in order to reduce object creation, but it should not ever be the case that the same
- * instance is used in multiple threads.
- */
-public class TextTagCodec {
- // 3 fields for non-empty strings 2 fields if the string is empty.
- private static final int NUM_TAG_FIELDS = 3;
-
- /**
- * This is really a local variable of decode(), but allocated here to reduce allocations.
- */
- private final String[] fields = new String[NUM_TAG_FIELDS];
-
- /**
- * Convert in-memory representation of tag to SAM text representation.
- * @param tagName Two-character tag name.
- * @param value Tag value as approriate Object subclass.
- * @return SAM text String representation, i.e. name:type:value
- */
- public String encode(final String tagName, Object value) {
- final StringBuilder sb = new StringBuilder(tagName);
- sb.append(':');
- char tagType = BinaryTagCodec.getTagValueType(value);
- switch (tagType) {
- case 'c':
- case 'C':
- case 's':
- case 'S':
- case 'I':
- tagType = 'i';
- }
- if (tagType == 'H') {
- // H should never happen anymore.
- value = StringUtil.bytesToHexString((byte[])value);
- } else if (tagType == 'B') {
- value = getArrayType(value, false) + "," + encodeArrayValue(value);
- } else if (tagType == 'i') {
- final long longVal = ((Number) value).longValue();
- // as the spec says: [-2^31, 2^32)
- if (longVal < Integer.MIN_VALUE || longVal > BinaryCodec.MAX_UINT) {
- throw new IllegalArgumentException("Value for tag " + tagName + " cannot be stored in either a signed or unsigned 32-bit integer: " + longVal);
- }
- }
- sb.append(tagType).append(':').append(value.toString());
- return sb.toString();
- }
-
- private char getArrayType(final Object array, final boolean isUnsigned) {
- final char type;
- final Class<?> componentType = array.getClass().getComponentType();
- if (componentType == Float.TYPE) {
- if (isUnsigned) throw new IllegalArgumentException("float array cannot be unsigned");
- return 'f';
- }
- else if (componentType == Byte.TYPE) type = 'c';
- else if (componentType == Short.TYPE) type = 's';
- else if (componentType == Integer.TYPE) type = 'i';
- else throw new IllegalArgumentException("Unrecognized array type " + componentType);
- return (isUnsigned? Character.toUpperCase(type): type);
- }
-
- private String encodeArrayValue(final Object value) {
- final StringBuilder ret = new StringBuilder(Array.get(value, 0).toString());
- final int length = Array.getLength(value);
- for (int i = 1; i < length; ++i) {
- ret.append(',');
- ret.append(Array.get(value, i).toString());
- }
- return ret.toString();
-
- }
-
- private long[] widenToUnsigned(final Object array) {
- final Class<?> componentType = array.getClass().getComponentType();
- final long mask;
- if (componentType == Byte.TYPE) mask = 0xffL;
- else if (componentType == Short.TYPE) mask = 0xffffL;
- else if (componentType == Integer.TYPE) mask = 0xffffffffL;
- else throw new IllegalArgumentException("Unrecognized unsigned array type " + componentType);
- final long[] ret = new long[Array.getLength(array)];
- for (int i = 0; i < ret.length; ++i) {
- ret[i] = Array.getLong(array, i) & mask;
- }
- return ret;
- }
-
- String encodeUnsignedArray(final String tagName, final Object array) {
- if (!array.getClass().isArray()) {
- throw new IllegalArgumentException("Non-array passed to encodeUnsignedArray: " + array.getClass());
- }
- final long[] widened = widenToUnsigned(array);
- return tagName + ":B:" + getArrayType(array, true) + "," + encodeArrayValue(widened);
- }
-
- /**
- * Encode a standard header tag, which should not have a type field.
- * @param tagName 2-character String.
- * @param value Not necessarily a String. Some of these are integers but the type is implied by
- * the tagName. Converted to String with toString().
- * @return Colon-separated text representation suitable for a SAM header, i.e. name:value.
- */
- public String encodeUntypedTag(final String tagName, final Object value) {
- return new StringBuilder(tagName).append(':')
- .append(value.toString()).toString();
- }
-
- /**
- * Convert typed tag in SAM text format (name:type:value) into tag name and Object value representation.
- * @param tag SAM text format name:type:value tag.
- * @return Tag name as 2-character String, and tag value in appropriate class based on tag type.
- * If value is an unsigned array, then the value is a TagValueAndUnsignedArrayFlag object.
- */
- public Map.Entry<String, Object> decode(final String tag) {
- final int numFields = StringUtil.splitConcatenateExcessTokens(tag, fields, ':');
- if (numFields != TextTagCodec.NUM_TAG_FIELDS && numFields != TextTagCodec.NUM_TAG_FIELDS - 1) {
- throw new SAMFormatException("Not enough fields in tag '" + tag + "'");
- }
- final String key = fields[0];
- final String type = fields[1];
- final String stringVal = numFields == TextTagCodec.NUM_TAG_FIELDS ? fields[2] : "";
- final Object val = convertStringToObject(type, stringVal);
- return new Map.Entry<String, Object>() {
- public String getKey() {
- return key;
- }
-
- public Object getValue() {
- return val;
- }
-
- public Object setValue(final Object o) {
- throw new UnsupportedOperationException();
- }
- };
- }
-
- private Object convertStringToObject(final String type, final String stringVal) {
- if (type.equals("Z")) {
- return stringVal;
- } else if (type.equals("A")) {
- if (stringVal.length() != 1) {
- throw new SAMFormatException("Tag of type A should have a single-character value");
- }
- return stringVal.charAt(0);
- } else if (type.equals("i")) {
- final long lValue;
- try {
- lValue = Long.valueOf(stringVal);
- } catch (NumberFormatException e) {
- throw new SAMFormatException("Tag of type i should have signed decimal value");
- }
-
- if (lValue >= Integer.MIN_VALUE && lValue <= Integer.MAX_VALUE) {
- return (int) lValue;
- }
- else if (SAMUtils.isValidUnsignedIntegerAttribute(lValue)) {
- return lValue;
- }
- else {
- throw new SAMFormatException("Integer is out of range for both a 32-bit signed and unsigned integer: " + stringVal);
- }
- } else if (type.equals("f")) {
- try {
- return new Float(stringVal);
- } catch (NumberFormatException e) {
- throw new SAMFormatException("Tag of type f should have single-precision floating point value");
- }
- } else if (type.equals("H")) {
- try {
- return StringUtil.hexStringToBytes(stringVal);
- } catch (NumberFormatException e) {
- throw new SAMFormatException("Tag of type H should have valid hex string with even number of digits");
- }
- } else if (type.equals("B")) {
- return covertStringArrayToObject(stringVal);
- } else {
- throw new SAMFormatException("Unrecognized tag type: " + type);
- }
- }
-
- private Object covertStringArrayToObject(final String stringVal) {
- final String[] elementTypeAndValue = new String[2];
- if (StringUtil.splitConcatenateExcessTokens(stringVal, elementTypeAndValue, ',') != 2) {
- throw new SAMFormatException("Tag of type B should have an element type followed by comma");
- }
- if (elementTypeAndValue[0].length() != 1) {
- throw new SAMFormatException("Unrecognized element type for array tag value: " + elementTypeAndValue[0]);
- }
- final char elementType = elementTypeAndValue[0].charAt(0);
- final String[] stringValues = elementTypeAndValue[1].split(",");
- if (stringValues.length == 0) throw new SAMFormatException("Tag of type B should have at least one element");
- if (elementType == 'f') {
- final float[] ret = new float[stringValues.length];
- for (int i = 0; i < stringValues.length; ++i) {
- try {
- ret[i] = Float.parseFloat(stringValues[i]);
- } catch (NumberFormatException e) {
- throw new SAMFormatException("Array tag of type f should have single-precision floating point value");
- }
- }
- return ret;
- }
- long mask = Long.MAX_VALUE;
- long minValue = Long.MAX_VALUE;
- long maxValue = Long.MIN_VALUE;
- final boolean isUnsigned = Character.isUpperCase(elementType);
- switch (Character.toLowerCase(elementType)) {
- case 'c':
- if (isUnsigned) {
- mask = 0xffL;
- } else {
- minValue = Byte.MIN_VALUE;
- maxValue = Byte.MAX_VALUE;
- }
- break;
- case 's':
- if (isUnsigned) {
- mask = 0xffffL;
- } else {
- minValue = Short.MIN_VALUE;
- maxValue = Short.MAX_VALUE;
- }
- break;
- case 'i':
- if (isUnsigned) {
- mask = 0xffffffffL;
- } else {
- minValue = Integer.MIN_VALUE;
- maxValue = Integer.MAX_VALUE;
- }
- break;
- default:
- throw new SAMFormatException("Unrecognized array tag element type: " + elementType);
- }
- if (isUnsigned) {
- minValue = 0;
- maxValue = mask;
- }
- final long[] longValues = new long[stringValues.length];
- for (int i = 0; i < stringValues.length; ++i) {
- final long longValue;
- try {
- longValue = Long.parseLong(stringValues[i]);
- } catch (NumberFormatException e) {
- throw new SAMFormatException("Array tag of type " + elementType + " should have integral value");
- }
- if (longValue < minValue || longValue > maxValue) {
- throw new SAMFormatException("Value for element of array tag of type " + elementType +
- " is out of allowed range: " + longValue);
- }
- longValues[i] = longValue;
- }
-
- switch (Character.toLowerCase(elementType)) {
- case 'c': {
- final byte[] array = new byte[longValues.length];
- for (int i = 0; i < longValues.length; ++i) array[i] = (byte)longValues[i];
- if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
- else return array;
- }
- case 's': {
- final short[] array = new short[longValues.length];
- for (int i = 0; i < longValues.length; ++i) array[i] = (short)longValues[i];
- if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
- else return array;
- }
- case 'i':{
- final int[] array = new int[longValues.length];
- for (int i = 0; i < longValues.length; ++i) array[i] = (int)longValues[i];
- if (isUnsigned) return new TagValueAndUnsignedArrayFlag(array, true);
- else return array;
- }
- default:
- throw new SAMFormatException("Unrecognized array tag element type: " + elementType);
- }
- }
-
- Iso8601Date decodeDate(final String dateStr) {
- try {
- return new Iso8601Date(dateStr);
- } catch (DateParser.InvalidDateException ex) {
- try {
- return new Iso8601Date(DateFormat.getDateTimeInstance().parse(dateStr));
- } catch (ParseException e) {
- try {
- return new Iso8601Date(new Date(dateStr));
- } catch (Exception e1) {
- throw new DateParser.InvalidDateException("Could not parse as date: " + dateStr, e);
- }
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java b/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java
deleted file mode 100644
index d790270..0000000
--- a/src/main/java/htsjdk/samtools/TextualBAMIndexWriter.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-import java.util.List;
-
-/**
- * Class for writing binary BAM index files as human-readable text.
- * Used for testing only.
-
- */
-class TextualBAMIndexWriter implements BAMIndexWriter {
-
- protected final int nRef;
- protected final File output;
- private final PrintWriter pw;
- private int count = 0;
-
- /**
- * constructor
- *
- * @param nRef Number of reference sequences
- * @param output BAM Index output file
- */
- public TextualBAMIndexWriter(final int nRef, final File output) {
- this.output = output;
- this.nRef = nRef;
- try {
- pw = new PrintWriter(output);
- } catch (final FileNotFoundException e) {
- throw new SAMException("Can't find output file " + output, e);
- }
- writeHeader();
- }
-
- /**
- * Write header information at the beginning of the file
- */
- private void writeHeader() {
- pw.println("n_ref=" + nRef);
- }
-
- /**
- * Write this content as human-readable text
- */
- public void writeReference(final BAMIndexContent content) {
-
- final int reference = content.getReferenceSequence();
-
- if (content == null) {
- writeNullContent(reference);
- count++;
- return;
- }
-
- if (reference != count){
- throw new SAMException("Reference on content is " + reference + " but expecting reference " + count);
- }
- count++;
-
- final BAMIndexContent.BinList bins = content.getBins();
- final int size = bins == null ? 0 : content.getNumberOfNonNullBins();
-
- if (size == 0) {
- writeNullContent(reference);
- return;
- }
-
- //final List<Chunk> chunks = content.getMetaData() == null ? null
- // : content.getMetaData().getMetaDataChunks();
- final BAMIndexMetaData metaData = content.getMetaData();
-
- pw.println("Reference " + reference + " has n_bin= " + Integer.toString(size + (metaData != null? 1 : 0)));
-
- // chunks
- for (final Bin bin : bins) { // note, bins will always be sorted
- if (bin.getBinNumber() == GenomicIndexUtil.MAX_BINS) break;
- if (bin.getChunkList() == null) {
- pw.println(" Ref " + reference + " bin " + bin.getBinNumber() + " has no binArray"); // remove?
- continue;
- }
- final List<Chunk> chunkList = bin.getChunkList();
- if (chunkList == null) {
- pw.println(" Ref " + reference + " bin " + bin.getBinNumber() + " has no chunkList");
- continue;
- }
- pw.print(" Ref " + reference + " bin " + bin.getBinNumber() + " has n_chunk= " + chunkList.size());
- if (chunkList.isEmpty()) {
- pw.println();
- }
- for (final Chunk c : chunkList) {
- pw.println(" Chunk: " + c.toString() +
- " start: " + Long.toString(c.getChunkStart(), 16) +
- " end: " + Long.toString(c.getChunkEnd(), 16));
- }
- }
-
- writeChunkMetaData(reference, metaData);
-
- // linear index
- final LinearIndex linearIndex = content.getLinearIndex();
- if (linearIndex == null || linearIndex.getIndexEntries() == null) {
- pw.println("Reference " + reference + " has n_intv= 0");
- return;
- }
- final long[] entries = linearIndex.getIndexEntries();
- final int indexStart = linearIndex.getIndexStart();
- // System.out.println("index start is " + indexStart);
- final int n_intv = entries.length + indexStart;
- pw.println("Reference " + reference + " has n_intv= " + n_intv);
- for (int k = 0; k < entries.length; k++) {
- if (entries[k] != 0) {
- pw.println(" Ref " + reference + " ioffset for " + (k + indexStart) + " is " + Long.toString(entries[k]));
- }
- }
- pw.flush (); // write each reference to disk as it's being created
- }
-
- /**
- * Write the meta data represented by the chunkLists associated with bin MAX_BINS 37450
- *
- * @param metaData information describing numAligned records, numUnAligned, etc
- */
- private void writeChunkMetaData(final int reference, final BAMIndexMetaData metaData) {
- final int nChunks = metaData == null ? 0 : 2;
- pw.print(" Ref " + reference + " bin 37450 has n_chunk= " + nChunks);
- if (nChunks == 0) {
- pw.println();
- } else {
- pw.println(" Chunk: " + // c.toString() +
- " start: " + Long.toString(metaData.getFirstOffset(), 16) +
- " end: " + Long.toString(metaData.getLastOffset(), 16));
- pw.println(" Chunk: " + // c.toString() +
- " start: " + Long.toString(metaData.getAlignedRecordCount(), 16) +
- " end: " + Long.toString(metaData.getUnalignedRecordCount(), 16));
- }
-
- }
-
- private void writeNullContent(final int reference) {
- pw.println("Reference " + reference + " has n_bin=0");
- pw.println("Reference " + reference + " has n_intv=0");
- }
-
- /**
- * Write count of records without coordinates
- *
- * @param noCoordinateCount the count of records seen with no coordinate positions in the start coordinate
- */
- public void writeNoCoordinateRecordCount(final Long noCoordinateCount) {
- pw.println("No Coordinate Count=" + noCoordinateCount);
- }
-
- /**
- * Any necessary processing at the end of the file
- */
- public void close() {
- pw.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/ValidationStringency.java b/src/main/java/htsjdk/samtools/ValidationStringency.java
deleted file mode 100644
index 1fe2124..0000000
--- a/src/main/java/htsjdk/samtools/ValidationStringency.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * How strict to be when reading a SAM or BAM, beyond bare minimum validation.
- */
-public enum ValidationStringency {
- /**
- * Do the right thing, throw an exception if something looks wrong.
- */
- STRICT,
- /**
- * Emit warnings but keep going if possible.
- */
- LENIENT,
- /**
- * Like LENIENT, only don't emit warning messages.
- */
- SILENT;
-
- public static final ValidationStringency DEFAULT_STRINGENCY = STRICT;
-}
diff --git a/src/main/java/htsjdk/samtools/apps/TimeChannel.java b/src/main/java/htsjdk/samtools/apps/TimeChannel.java
deleted file mode 100644
index e3f707a..0000000
--- a/src/main/java/htsjdk/samtools/apps/TimeChannel.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.apps;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class TimeChannel {
- public static void main(String[] args) throws Exception {
- long fileSize = new File(args[0]).length();
- FileInputStream in = new FileInputStream(args[0]);
- FileChannel channel = in.getChannel();
- byte[] buf = new byte[64 * 1024];
- long totalBytesRead = 0;
- long mappedOffset = 0;
- // Map a round number of bytes that might correspond to some kind of page size boundary.
- long maxToMapAtATime = 1024 * 1024 * 1024;
- long mappedSize = Math.min(fileSize, maxToMapAtATime);
- while (totalBytesRead < fileSize) {
- System.err.println("mappedOffset: " + mappedOffset + "; mappedSize: " + mappedSize);
- System.err.println("fileSize: " + fileSize + "; totalBytesRead: " + totalBytesRead);
- MappedByteBuffer mappedBuffer = channel.map(FileChannel.MapMode.READ_ONLY, mappedOffset, mappedSize);
- while (mappedBuffer.remaining() > 0) {
- int bytesRead = Math.min(mappedBuffer.remaining(), buf.length);
- mappedBuffer.get(buf, 0, bytesRead);
- totalBytesRead += bytesRead;
- }
- mappedOffset += mappedSize;
- mappedSize = Math.min(fileSize - totalBytesRead, maxToMapAtATime);
- }
- System.out.println("Total bytes: " + totalBytesRead);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java b/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java
deleted file mode 100644
index bebb948..0000000
--- a/src/main/java/htsjdk/samtools/apps/TimeRandomAccessFile.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.apps;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class TimeRandomAccessFile {
- public static void main(String[] args) throws Exception {
- RandomAccessFile raf = new RandomAccessFile(new File(args[0]), "r");
- byte[] buf = new byte[64 * 1024];
- long totalBytesRead = 0;
- int bytesRead;
- while ((bytesRead = readBytes(raf, buf, 0, buf.length)) > 0) {
- totalBytesRead += bytesRead;
- }
- System.out.println("Total bytes: " + totalBytesRead);
- }
- private static int readBytes(final RandomAccessFile file, final byte[] buffer, final int offset, final int length)
- throws IOException {
- int bytesRead = 0;
- while (bytesRead < length) {
- final int count = file.read(buffer, offset + bytesRead, length - bytesRead);
- if (count <= 0) {
- break;
- }
- bytesRead += count;
- }
- return bytesRead;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAIEntry.java b/src/main/java/htsjdk/samtools/cram/CRAIEntry.java
deleted file mode 100644
index dd22a00..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAIEntry.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A class representing CRAI index entry: file and alignment offsets for each slice.
- * Created by vadim on 10/08/2015.
- */
-public class CRAIEntry implements Comparable<CRAIEntry>, Cloneable {
- public int sequenceId;
- public int alignmentStart;
- public int alignmentSpan;
- public long containerStartOffset;
- public int sliceOffset;
- public int sliceSize;
- public int sliceIndex;
-
- private static int CRAI_INDEX_COLUMNS = 6;
- private static String entryFormat = "%d\t%d\t%d\t%d\t%d\t%d";
-
- public CRAIEntry() {
- }
-
- /**
- * Create a CRAI Entry from a serialized CRAI index line.
- *
- * @param line string formatted as a CRAI index entry
- * @throws CRAIIndex.CRAIIndexException
- */
- public CRAIEntry(final String line) throws CRAIIndex.CRAIIndexException {
- final String[] chunks = line.split("\t");
- if (chunks.length != CRAI_INDEX_COLUMNS) {
- throw new CRAIIndex.CRAIIndexException(
- "Malformed CRAI index entry: expecting " + CRAI_INDEX_COLUMNS + " columns but got " + chunks.length);
- }
-
- try {
- sequenceId = Integer.parseInt(chunks[0]);
- alignmentStart = Integer.parseInt(chunks[1]);
- alignmentSpan = Integer.parseInt(chunks[2]);
- containerStartOffset = Long.parseLong(chunks[3]);
- sliceOffset = Integer.parseInt(chunks[4]);
- sliceSize = Integer.parseInt(chunks[5]);
- } catch (final NumberFormatException e) {
- throw new CRAIIndex.CRAIIndexException(e);
- }
- }
-
- /**
- * Serialize the entry to a CRAI index stream.
- * @param os stream to write to
- */
- public void writeToStream(OutputStream os) {
- try {
- os.write(serializeToString().getBytes());
- os.write('\n');
- }
- catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Format the entry as a string suitable for serialization in the CRAI index
- */
- private String serializeToString() {
- return String.format(entryFormat,
- sequenceId, alignmentStart, alignmentSpan,
- containerStartOffset, sliceOffset, sliceSize);
- }
-
- @Override
- public String toString() { return serializeToString(); }
-
- public static List<CRAIEntry> fromContainer(final Container container) {
- final List<CRAIEntry> entries = new ArrayList<>(container.slices.length);
- for (int i = 0; i < container.slices.length; i++) {
- final Slice s = container.slices[i];
- final CRAIEntry e = new CRAIEntry();
- e.sequenceId = s.sequenceId;
- e.alignmentStart = s.alignmentStart;
- e.alignmentSpan = s.alignmentSpan;
- e.containerStartOffset = s.containerOffset;
- e.sliceOffset = container.landmarks[i];
- e.sliceSize = s.size;
-
- e.sliceIndex = i;
- entries.add(e);
- }
- return entries;
- }
-
- @Override
- public int compareTo(final CRAIEntry o) {
- if (o == null) {
- return 1;
- }
- if (sequenceId != o.sequenceId) {
- return sequenceId - o.sequenceId;
- }
- if (alignmentStart != o.alignmentStart) {
- return alignmentStart - o.alignmentStart;
- }
-
- return (int) (containerStartOffset - o.containerStartOffset);
- }
-
- @Override
- public CRAIEntry clone() throws CloneNotSupportedException {
- super.clone();
- final CRAIEntry entry = new CRAIEntry();
- entry.sequenceId = sequenceId;
- entry.alignmentStart = alignmentStart;
- entry.alignmentSpan = alignmentSpan;
- entry.containerStartOffset = containerStartOffset;
- entry.sliceOffset = sliceOffset;
- entry.sliceSize = sliceSize;
- return entry;
- }
-
- public static Comparator<CRAIEntry> byEnd = new Comparator<CRAIEntry>() {
-
- @Override
- public int compare(final CRAIEntry o1, final CRAIEntry o2) {
- if (o1.sequenceId != o2.sequenceId) {
- return o2.sequenceId - o1.sequenceId;
- }
- if (o1.alignmentStart + o1.alignmentSpan != o2.alignmentStart + o2.alignmentSpan) {
- return o1.alignmentStart + o1.alignmentSpan - o2.alignmentStart - o2.alignmentSpan;
- }
-
- return (int) (o1.containerStartOffset - o2.containerStartOffset);
- }
- };
-
- public static final Comparator<CRAIEntry> byStart = new Comparator<CRAIEntry>() {
-
- @Override
- public int compare(final CRAIEntry o1, final CRAIEntry o2) {
- if (o1.sequenceId != o2.sequenceId) {
- return o2.sequenceId - o1.sequenceId;
- }
- if (o1.alignmentStart != o2.alignmentStart) {
- return o1.alignmentStart - o2.alignmentStart;
- }
-
- return (int) (o1.containerStartOffset - o2.containerStartOffset);
- }
- };
-
- public static Comparator<CRAIEntry> byStartDesc = new Comparator<CRAIEntry>() {
-
- @Override
- public int compare(CRAIEntry o1, CRAIEntry o2) {
- if (o1.sequenceId != o2.sequenceId) {
- if (o1.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
- return 1;
- if (o2.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
- return -1;
- return -o2.sequenceId + o1.sequenceId;
- }
- if (o1.alignmentStart != o2.alignmentStart)
- return o1.alignmentStart - o2.alignmentStart;
-
- return (int) (o1.containerStartOffset - o2.containerStartOffset);
- }
- };
-
- public static boolean intersect(final CRAIEntry e0, final CRAIEntry e1) {
- if (e0.sequenceId != e1.sequenceId) {
- return false;
- }
- if (e0.sequenceId < 0) {
- return false;
- }
-
- final int a0 = e0.alignmentStart;
- final int a1 = e1.alignmentStart;
-
- final int b0 = a0 + e0.alignmentSpan;
- final int b1 = a1 + e1.alignmentSpan;
-
- return Math.abs(a0 + b0 - a1 - b1) < (e0.alignmentSpan + e1.alignmentSpan);
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAIIndex.java b/src/main/java/htsjdk/samtools/cram/CRAIIndex.java
deleted file mode 100644
index 256b35e..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAIIndex.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.CRAMBAIIndexer;
-import htsjdk.samtools.CRAMCRAIIndexer;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory;
-import htsjdk.samtools.cram.encoding.reader.RefSeqIdReader;
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.structure.*;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.ValidationStringency;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import java.util.List;
-
-/**
- * CRAI index used for CRAM files.
- */
-public class CRAIIndex {
- public static final String CRAI_INDEX_SUFFIX = ".crai";
- final private List<CRAIEntry> entries = new ArrayList<>();
-
- /**
- * Add a single entry to the CRAI index.
- * @param entry entry to be added
- */
- public void addEntry(CRAIEntry entry) {
- entries.add(entry);
- }
-
- // This is used for testing and should be removed when there are no more
- // consumers that know about the internal structure of a CRAI
- public List<CRAIEntry> getCRAIEntries() {
- return entries;
- }
-
- /**
- * Write out the index to an output stream;
- * @param os Stream to write index to
- */
- public void writeIndex(final OutputStream os) {
- Collections.sort(entries, CRAIEntry.byStartDesc);
- entries.stream().forEach(e -> e.writeToStream(os));
- }
-
- /**
- * Create index entries for a single container.
- * @param c the container to index
- */
- public void processContainer(final Container c) {
- // TODO: this should be refactored and delegate to container/slice
- if (!c.isEOF()) {
- for (int i = 0; i < c.slices.length; i++) {
- Slice s = c.slices[i];
- if (s.sequenceId == Slice.MULTI_REFERENCE) {
- this.entries.addAll(getCRAIEntriesForMultiRefSlice(s, c.header, c.offset, c.landmarks));
- }
- else {
- CRAIEntry e = new CRAIEntry();
-
- e.sequenceId = c.sequenceId;
- e.alignmentStart = s.alignmentStart;
- e.alignmentSpan = s.alignmentSpan;
- e.containerStartOffset = c.offset;
- e.sliceOffset = c.landmarks[i];
- e.sliceSize = s.size;
- e.sliceIndex = i;
-
- entries.add(e);
- }
- }
- }
- }
-
- /**
- * Return a list of CRAI Entries; one for each reference in the multireference slice.
- * TODO: this should be refactored and delegate to container/slice
- */
- private static Collection<CRAIEntry> getCRAIEntriesForMultiRefSlice(
- final Slice slice,
- final CompressionHeader header,
- final long containerOffset,
- final int[] landmarks)
- {
- final DataReaderFactory dataReaderFactory = new DataReaderFactory();
- final Map<Integer, InputStream> inputMap = new HashMap<>();
- for (final Integer exId : slice.external.keySet()) {
- inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId).getRawContent()));
- }
-
- final RefSeqIdReader reader = new RefSeqIdReader(
- slice.sequenceId,
- slice.alignmentStart,
- ValidationStringency.DEFAULT_STRINGENCY);
- dataReaderFactory.buildReader(
- reader,
- new DefaultBitInputStream(new ByteArrayInputStream(slice.coreBlock.getRawContent())),
- inputMap,
- header,
- slice.sequenceId
- );
- reader.APDelta = header.APDelta;
-
- for (int i = 0; i < slice.nofRecords; i++) {
- final CramCompressionRecord record = new CramCompressionRecord();
- record.sliceIndex = slice.index;
- record.index = i;
-
- reader.read();
-
- if (record.sequenceId == slice.sequenceId) {
- record.sequenceId = slice.sequenceId;
- }
- else if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- }
- }
-
- Map<Integer, AlignmentSpan> spans = reader.getReferenceSpans();
- List<CRAIEntry> entries = new ArrayList<>(spans.size());
- for (int seqId : spans.keySet()) {
- CRAIEntry e = new CRAIEntry();
- e.sequenceId = seqId;
- AlignmentSpan span = spans.get(seqId);
- e.alignmentStart = span.getStart();
- e.alignmentSpan = span.getSpan();
- e.sliceSize = slice.size;
- e.sliceIndex = slice.index;
- e.containerStartOffset = containerOffset;
- e.sliceOffset = landmarks[slice.index];
-
- entries.add(e);
- }
-
- return entries;
- }
-
- public static SeekableStream openCraiFileAsBaiStream(final File cramIndexFile, final SAMSequenceDictionary dictionary) throws IOException {
- return openCraiFileAsBaiStream(new FileInputStream(cramIndexFile), dictionary);
- }
-
- public static SeekableStream openCraiFileAsBaiStream(final InputStream indexStream, final SAMSequenceDictionary dictionary) throws IOException, CRAIIndexException {
- final List<CRAIEntry> full = CRAMCRAIIndexer.readIndex(indexStream).getCRAIEntries();
- Collections.sort(full);
-
- final SAMFileHeader header = new SAMFileHeader();
- header.setSequenceDictionary(dictionary);
-
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final CRAMBAIIndexer indexer = new CRAMBAIIndexer(baos, header);
-
- for (final CRAIEntry entry : full) {
- final Slice slice = new Slice();
- slice.containerOffset = entry.containerStartOffset;
- slice.alignmentStart = entry.alignmentStart;
- slice.alignmentSpan = entry.alignmentSpan;
- slice.sequenceId = entry.sequenceId;
- // https://github.com/samtools/htsjdk/issues/531
- // entry.sliceSize is the slice size in bytes, not the number of
- // records; this results in the BAMIndex metadata being wrong
- slice.nofRecords = entry.sliceSize;
- slice.index = entry.sliceIndex;
- slice.offset = entry.sliceOffset;
-
- indexer.processSingleReferenceSlice(slice);
- }
- indexer.finish();
-
- return new SeekableMemoryStream(baos.toByteArray(), "CRAI to BAI converter");
- }
-
- public static List<CRAIEntry> find(final List<CRAIEntry> list, final int seqId, final int start, final int span) {
- final boolean whole = start < 1 || span < 1;
- final CRAIEntry query = new CRAIEntry();
- query.sequenceId = seqId;
- query.alignmentStart = start < 1 ? 1 : start;
- query.alignmentSpan = span < 1 ? Integer.MAX_VALUE : span;
- query.containerStartOffset = Long.MAX_VALUE;
- query.sliceOffset = Integer.MAX_VALUE;
- query.sliceSize = Integer.MAX_VALUE;
-
- final List<CRAIEntry> l = new ArrayList<>();
- for (final CRAIEntry e : list) {
- if (e.sequenceId != seqId) {
- continue;
- }
- if (whole || CRAIEntry.intersect(e, query)) {
- l.add(e);
- }
- }
- Collections.sort(l, CRAIEntry.byStart);
- return l;
- }
-
- public static CRAIEntry getLeftmost(final List<CRAIEntry> list) {
- if (list == null || list.isEmpty()) {
- return null;
- }
- CRAIEntry left = list.get(0);
-
- for (final CRAIEntry e : list) {
- if (e.alignmentStart < left.alignmentStart) {
- left = e;
- }
- }
-
- return left;
- }
-
- /**
- * Find index of the last aligned entry in the list. Assumes the index is sorted by coordinate and unmapped entries (with sequence id = -1) follow the mapped entries.
- *
- * @param list a list of CRAI entries
- * @return integer index of the last entry with sequence id not equal to -1
- */
- public static int findLastAlignedEntry(final List<CRAIEntry> list) {
- if (list.isEmpty()) {
- return -1;
- }
-
- int low = 0;
- int high = list.size() - 1;
-
- while (low <= high) {
- final int mid = (low + high) >>> 1;
- final CRAIEntry midVal = list.get(mid);
-
- if (midVal.sequenceId >= 0) {
- low = mid + 1;
- } else {
- high = mid - 1;
- }
- }
- if (low >= list.size()) {
- return list.size() - 1;
- }
- for (; low >= 0 && list.get(low).sequenceId == -1; low--) {
- }
- return low;
- }
-
- public static class CRAIIndexException extends RuntimeException {
-
- public CRAIIndexException(final String s) {
- super(s);
- }
-
- public CRAIIndexException(final NumberFormatException e) {
- super(e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/CRAMException.java b/src/main/java/htsjdk/samtools/cram/CRAMException.java
deleted file mode 100644
index 7d5fb72..0000000
--- a/src/main/java/htsjdk/samtools/cram/CRAMException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Created by edwardk on 8/13/15.
- */
-public class CRAMException extends SAMException {
- public CRAMException() {}
-
- public CRAMException(final String s) {
- super(s);
- }
-
- public CRAMException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public CRAMException(final Throwable throwable) {
- super(throwable);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java b/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java
deleted file mode 100644
index c958fa4..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.ByteArrayLenEncoding;
-import htsjdk.samtools.cram.encoding.ByteArrayStopEncoding;
-import htsjdk.samtools.cram.encoding.ExternalByteEncoding;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.ExternalIntegerEncoding;
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanIntegerEncoding;
-import htsjdk.samtools.cram.encoding.rans.RANS;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * A class responsible for decisions about which encodings to use for a given set of records.
- * This particular version relies heavily on GZIP and RANS for better compression.
- */
-public class CompressionHeaderFactory {
- private static final int TAG_VALUE_BUFFER_SIZE = 1024 * 1024;
- public static final int BYTE_SPACE_SIZE = 256;
- public static final int ALL_BYTES_USED = -1;
- private final Map<Integer, EncodingDetails> bestEncodings = new HashMap<>();
- private final ByteArrayOutputStream baosForTagValues;
-
- public CompressionHeaderFactory() {
- baosForTagValues = new ByteArrayOutputStream(TAG_VALUE_BUFFER_SIZE);
- }
-
- /**
- * Decides on compression methods to use for the given records.
- *
- * @param records
- * the data to be compressed
- * @param substitutionMatrix
- * a matrix of base substitution frequencies, can be null, in
- * which case it is re-calculated.
- * @param sorted
- * if true the records are assumed to be sorted by alignment
- * position
- * @return {@link htsjdk.samtools.cram.structure.CompressionHeader} object
- * describing the encoding chosen for the data
- */
- public CompressionHeader build(final List<CramCompressionRecord> records, SubstitutionMatrix substitutionMatrix,
- final boolean sorted) {
-
- final CompressionHeaderBuilder builder = new CompressionHeaderBuilder(sorted);
-
- builder.addExternalIntegerRansOrderZeroEncoding(EncodingKey.AP_AlignmentPositionOffset);
- builder.addExternalByteRansOrderOneEncoding(EncodingKey.BA_Base);
- // BB is not used
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.BF_BitFlags);
- builder.addExternalByteGzipEncoding(EncodingKey.BS_BaseSubstitutionCode);
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.CF_CompressionBitFlags);
- builder.addExternalIntegerGzipEncoding(EncodingKey.DL_DeletionLength);
- builder.addExternalByteGzipEncoding(EncodingKey.FC_FeatureCode);
- builder.addExternalIntegerGzipEncoding(EncodingKey.FN_NumberOfReadFeatures);
- builder.addExternalIntegerGzipEncoding(EncodingKey.FP_FeaturePosition);
- builder.addExternalIntegerGzipEncoding(EncodingKey.HC_HardClip);
- builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.IN_Insertion);
- builder.addExternalIntegerGzipEncoding(EncodingKey.MF_MateBitFlags);
- builder.addExternalIntegerGzipEncoding(EncodingKey.MQ_MappingQualityScore);
- builder.addExternalIntegerGzipEncoding(EncodingKey.NF_RecordsToNextFragment);
- builder.addExternalIntegerGzipEncoding(EncodingKey.NP_NextFragmentAlignmentStart);
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.NS_NextFragmentReferenceSequenceID);
- builder.addExternalIntegerGzipEncoding(EncodingKey.PD_padding);
- // QQ is not used
- builder.addExternalByteRansOrderOneEncoding(EncodingKey.QS_QualityScore);
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.RG_ReadGroup);
- builder.addExternalIntegerRansOrderZeroEncoding(EncodingKey.RI_RefId);
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.RL_ReadLength);
- builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.RN_ReadName);
- builder.addExternalIntegerGzipEncoding(EncodingKey.RS_RefSkip);
- builder.addExternalByteArrayStopTabGzipEncoding(EncodingKey.SC_SoftClip);
- builder.addExternalIntegerGzipEncoding(EncodingKey.TC_TagCount);
- builder.addExternalIntegerEncoding(EncodingKey.TL_TagIdList, ExternalCompressor.createGZIP());
- builder.addExternalIntegerGzipEncoding(EncodingKey.TN_TagNameAndType);
- builder.addExternalIntegerRansOrderOneEncoding(EncodingKey.TS_InsetSize);
-
- builder.setTagIdDictionary(buildTagIdDictionary(records));
-
- buildTagEncodings(records, builder);
-
- if (substitutionMatrix == null) {
- substitutionMatrix = new SubstitutionMatrix(buildFrequencies(records));
- updateSubstitutionCodes(records, substitutionMatrix);
- }
- builder.setSubstitutionMatrix(substitutionMatrix);
- return builder.getHeader();
- }
-
- /**
- * Iterate over the records and for each tag found come up with an encoding.
- * Tag encodings are registered via the builder.
- *
- * @param records
- * CRAM records holding the tags to be encoded
- * @param builder
- * compression header builder to register encodings
- */
- private void buildTagEncodings(final List<CramCompressionRecord> records, final CompressionHeaderBuilder builder) {
- final Set<Integer> tagIdSet = new HashSet<>();
-
- for (final CramCompressionRecord record : records) {
- if (record.tags == null || record.tags.length == 0) {
- continue;
- }
-
- for (final ReadTag tag : record.tags) {
- tagIdSet.add(tag.keyType3BytesAsInt);
- }
- }
-
- for (final int tagId : tagIdSet) {
- if (bestEncodings.containsKey(tagId)) {
- builder.addTagEncoding(tagId, bestEncodings.get(tagId));
- } else {
- final EncodingDetails e = buildEncodingForTag(records, tagId);
- builder.addTagEncoding(tagId, e);
- bestEncodings.put(tagId, e);
- }
- }
- }
-
- /**
- * Given the records update the substitution matrix with actual substitution
- * codes.
- *
- * @param records
- * CRAM records
- * @param substitutionMatrix
- * the matrix to be updated
- */
- static void updateSubstitutionCodes(final List<CramCompressionRecord> records,
- final SubstitutionMatrix substitutionMatrix) {
- for (final CramCompressionRecord record : records) {
- if (record.readFeatures != null) {
- for (final ReadFeature recordFeature : record.readFeatures) {
- if (recordFeature.getOperator() == Substitution.operator) {
- final Substitution substitution = ((Substitution) recordFeature);
- if (substitution.getCode() == Substitution.NO_CODE) {
- final byte refBase = substitution.getReferenceBase();
- final byte base = substitution.getBase();
- substitution.setCode(substitutionMatrix.code(refBase, base));
- }
- }
- }
- }
- }
- }
-
- /**
- * Build an array of substitution frequencies for the given CRAM records.
- *
- * @param records
- * CRAM records to scan
- * @return a 2D array of frequencies, see
- * {@link htsjdk.samtools.cram.structure.SubstitutionMatrix}
- */
- static long[][] buildFrequencies(final List<CramCompressionRecord> records) {
- final long[][] frequencies = new long[BYTE_SPACE_SIZE][BYTE_SPACE_SIZE];
- for (final CramCompressionRecord record : records) {
- if (record.readFeatures != null) {
- for (final ReadFeature readFeature : record.readFeatures) {
- if (readFeature.getOperator() == Substitution.operator) {
- final Substitution substitution = ((Substitution) readFeature);
- final byte refBase = substitution.getReferenceBase();
- final byte base = substitution.getBase();
- frequencies[refBase][base]++;
- }
- }
- }
- }
- return frequencies;
- }
-
- /**
- * Build a dictionary of tag ids.
- *
- * @param records
- * records holding the tags
- * @return a 3D byte array: a set of unique lists of tag ids.
- */
- private static byte[][][] buildTagIdDictionary(final List<CramCompressionRecord> records) {
- final Comparator<ReadTag> comparator = new Comparator<ReadTag>() {
-
- @Override
- public int compare(final ReadTag o1, final ReadTag o2) {
- return o1.keyType3BytesAsInt - o2.keyType3BytesAsInt;
- }
- };
-
- final Comparator<byte[]> baComparator = new Comparator<byte[]>() {
-
- @Override
- public int compare(final byte[] o1, final byte[] o2) {
- if (o1.length - o2.length != 0) {
- return o1.length - o2.length;
- }
-
- for (int i = 0; i < o1.length; i++) {
- if (o1[i] != o2[i]) {
- return o1[i] - o2[i];
- }
- }
-
- return 0;
- }
- };
-
- final Map<byte[], MutableInt> map = new TreeMap<>(baComparator);
- final MutableInt noTagCounter = new MutableInt();
- map.put(new byte[0], noTagCounter);
- for (final CramCompressionRecord record : records) {
- if (record.tags == null) {
- noTagCounter.value++;
- record.tagIdsIndex = noTagCounter;
- continue;
- }
-
- Arrays.sort(record.tags, comparator);
- record.tagIds = new byte[record.tags.length * 3];
-
- int tagIndex = 0;
- for (int i = 0; i < record.tags.length; i++) {
- record.tagIds[i * 3] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(0);
- record.tagIds[i * 3 + 1] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(1);
- record.tagIds[i * 3 + 2] = (byte) record.tags[tagIndex].keyType3Bytes.charAt(2);
- tagIndex++;
- }
-
- MutableInt count = map.get(record.tagIds);
- if (count == null) {
- count = new MutableInt();
- map.put(record.tagIds, count);
- }
- count.value++;
- record.tagIdsIndex = count;
- }
-
- final byte[][][] dictionary = new byte[map.size()][][];
- int i = 0;
- for (final byte[] idsAsBytes : map.keySet()) {
- final int nofIds = idsAsBytes.length / 3;
- dictionary[i] = new byte[nofIds][];
- for (int j = 0; j < idsAsBytes.length;) {
- final int idIndex = j / 3;
- dictionary[i][idIndex] = new byte[3];
- dictionary[i][idIndex][0] = idsAsBytes[j++];
- dictionary[i][idIndex][1] = idsAsBytes[j++];
- dictionary[i][idIndex][2] = idsAsBytes[j++];
- }
- map.get(idsAsBytes).value = i++;
- }
- return dictionary;
- }
-
- /**
- * Tag id is and integer where the first byte is its type and the other 2
- * bytes represent the name. For example 'OQZ', where 'OQ' stands for
- * original quality score tag and 'Z' stands for string type.
- *
- * @param tagID
- * a 3 byte tag id stored in an int
- * @return tag type, the lowest byte in the tag id
- */
- static byte getTagType(final int tagID) {
- return (byte) (tagID & 0xFF);
- }
-
- static ExternalCompressor getBestExternalCompressor(final byte[] data) {
- final ExternalCompressor gzip = ExternalCompressor.createGZIP();
- final int gzipLen = gzip.compress(data).length;
-
- final ExternalCompressor rans0 = ExternalCompressor.createRANS(RANS.ORDER.ZERO);
- final int rans0Len = rans0.compress(data).length;
-
- final ExternalCompressor rans1 = ExternalCompressor.createRANS(RANS.ORDER.ONE);
- final int rans1Len = rans1.compress(data).length;
-
- // find the best of general purpose codecs:
- final int minLen = Math.min(gzipLen, Math.min(rans0Len, rans1Len));
- if (minLen == rans0Len) {
- return rans0;
- } else if (minLen == rans1Len) {
- return rans1;
- } else {
- return gzip;
- }
- }
-
- byte[] getDataForTag(final List<CramCompressionRecord> records, final int tagID) {
- baosForTagValues.reset();
-
- for (final CramCompressionRecord record : records) {
- if (record.tags == null) {
- continue;
- }
-
- for (final ReadTag tag : record.tags) {
- if (tag.keyType3BytesAsInt != tagID) {
- continue;
- }
- final byte[] valueBytes = tag.getValueAsByteArray();
- try {
- baosForTagValues.write(valueBytes);
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
- }
-
- return baosForTagValues.toByteArray();
- }
-
- static ByteSizeRange geByteSizeRangeOfTagValues(final List<CramCompressionRecord> records, final int tagID) {
- final byte type = getTagType(tagID);
- final ByteSizeRange stats = new ByteSizeRange();
- for (final CramCompressionRecord record : records) {
- if (record.tags == null) {
- continue;
- }
-
- for (final ReadTag tag : record.tags) {
- if (tag.keyType3BytesAsInt != tagID) {
- continue;
- }
- final int size = getTagValueByteSize(type, tag.getValue());
- if (stats.min > size)
- stats.min = size;
- if (stats.max < size)
- stats.max = size;
- }
- }
- return stats;
- }
-
- /**
- * Find a byte value never mentioned in the array
- * @param array bytes
- * @return byte value or -1 if the array contains all possible byte values.
- */
- static int getUnusedByte(final byte[] array) {
- final byte[] usage = new byte[BYTE_SPACE_SIZE];
- for (final byte b : array) {
- usage[0xFF & b] = 1;
- }
-
- for (int i = 0; i < usage.length; i++) {
- if (usage[i] == 0)
- return i;
- }
- return ALL_BYTES_USED;
- }
-
- static class ByteSizeRange {
- int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
- }
-
- /**
- * A combination of external compressor and encoding params. This is all
- * that is needed to encode a data series.
- */
- private static class EncodingDetails {
- ExternalCompressor compressor;
- EncodingParams params;
- }
-
- /**
- * Build an encoding for a specific tag for given records.
- *
- * @param records
- * CRAM records holding the tags
- * @param tagID
- * an integer id of the tag
- * @return an encoding for the tag
- */
- private EncodingDetails buildEncodingForTag(final List<CramCompressionRecord> records, final int tagID) {
- final EncodingDetails details = new EncodingDetails();
- final byte[] data = getDataForTag(records, tagID);
-
- details.compressor = getBestExternalCompressor(data);
-
- final byte type = getTagType(tagID);
- switch (type) {
- case 'A':
- case 'c':
- case 'C':
- details.params = ByteArrayLenEncoding.toParam(
- HuffmanIntegerEncoding.toParam(new int[] { 1 }, new int[] { 0 }),
- ExternalByteEncoding.toParam(tagID));
- return details;
- case 'I':
- case 'i':
- case 'f':
- details.params = ByteArrayLenEncoding.toParam(
- HuffmanIntegerEncoding.toParam(new int[] { 4 }, new int[] { 0 }),
- ExternalByteEncoding.toParam(tagID));
- return details;
-
- case 's':
- case 'S':
- details.params = ByteArrayLenEncoding.toParam(
- HuffmanIntegerEncoding.toParam(new int[] { 2 }, new int[] { 0 }),
- ExternalByteEncoding.toParam(tagID));
- return details;
- case 'Z':
- case 'B':
- final ByteSizeRange stats = geByteSizeRangeOfTagValues(records, tagID);
- final boolean singleSize = stats.min == stats.max;
- if (singleSize) {
- details.params = ByteArrayLenEncoding.toParam(
- HuffmanIntegerEncoding.toParam(new int[] { stats.min }, new int[] { 0 }),
- ExternalByteEncoding.toParam(tagID));
- return details;
- }
-
- if (type == 'Z') {
- details.params = ByteArrayStopEncoding.toParam((byte) '\t', tagID);
- return details;
- }
-
- final int minSize_threshold_ForByteArrayStopEncoding = 100;
- if (stats.min > minSize_threshold_ForByteArrayStopEncoding) {
- final int unusedByte = getUnusedByte(data);
- if (unusedByte > ALL_BYTES_USED) {
- details.params = ByteArrayStopEncoding.toParam((byte) unusedByte, tagID);
- return details;
- }
- }
-
- details.params = ByteArrayLenEncoding.toParam(ExternalIntegerEncoding.toParam(tagID),
- ExternalByteEncoding.toParam(tagID));
- return details;
- default:
- throw new IllegalArgumentException("Unknown tag type: " + (char) type);
- }
- }
-
- /**
- * A helper class to build
- * {@link htsjdk.samtools.cram.structure.CompressionHeader} object.
- */
- private static class CompressionHeaderBuilder {
- private final CompressionHeader header;
-
- CompressionHeaderBuilder(final boolean sorted) {
- header = new CompressionHeader();
- header.externalIds = new ArrayList<>();
- header.tMap = new TreeMap<>();
-
- header.encodingMap = new TreeMap<>();
- header.APDelta = sorted;
- }
-
- CompressionHeader getHeader() {
- return header;
- }
-
- void addExternalEncoding(final EncodingKey encodingKey, final EncodingParams params,
- final ExternalCompressor compressor) {
- header.externalIds.add(encodingKey.ordinal());
- header.externalCompressors.put(encodingKey.ordinal(), compressor);
- header.encodingMap.put(encodingKey, params);
- }
-
- void addExternalByteArrayStopTabGzipEncoding(final EncodingKey encodingKey) {
- addExternalEncoding(encodingKey, ByteArrayStopEncoding.toParam((byte) '\t', encodingKey.ordinal()),
- ExternalCompressor.createGZIP());
- }
-
- void addExternalIntegerEncoding(final EncodingKey encodingKey, final ExternalCompressor compressor) {
- addExternalEncoding(encodingKey, ExternalIntegerEncoding.toParam(encodingKey.ordinal()), compressor);
- }
-
- void addExternalIntegerGzipEncoding(final EncodingKey encodingKey) {
- addExternalEncoding(encodingKey, ExternalIntegerEncoding.toParam(encodingKey.ordinal()),
- ExternalCompressor.createGZIP());
- }
-
- void addExternalByteGzipEncoding(final EncodingKey encodingKey) {
- addExternalEncoding(encodingKey, ExternalByteEncoding.toParam(encodingKey.ordinal()),
- ExternalCompressor.createGZIP());
- }
-
- void addExternalByteRansOrderOneEncoding(final EncodingKey encodingKey) {
- addExternalEncoding(encodingKey, ExternalByteEncoding.toParam(encodingKey.ordinal()),
- ExternalCompressor.createRANS(RANS.ORDER.ONE));
- }
-
- void addExternalIntegerRansOrderOneEncoding(final EncodingKey encodingKey) {
- addExternalIntegerEncoding(encodingKey, ExternalCompressor.createRANS(RANS.ORDER.ONE));
- }
-
- void addExternalIntegerRansOrderZeroEncoding(final EncodingKey encodingKey) {
- addExternalIntegerEncoding(encodingKey, ExternalCompressor.createRANS(RANS.ORDER.ZERO));
- }
-
- void addTagEncoding(final int tagId, final EncodingDetails encodingDetails) {
- header.externalIds.add(tagId);
- header.externalCompressors.put(tagId, encodingDetails.compressor);
- header.tMap.put(tagId, encodingDetails.params);
- }
-
- void setTagIdDictionary(final byte[][][] dictionary) {
- header.dictionary = dictionary;
- }
-
- void setSubstitutionMatrix(final SubstitutionMatrix substitutionMatrix) {
- header.substitutionMatrix = substitutionMatrix;
- }
- }
-
- /**
- * Calculate byte size of a tag value based on it's type and value class
- * @param type tag type, like 'A' or 'i'
- * @param value object representing the tag value
- * @return number of bytes used for the tag value
- */
- static int getTagValueByteSize(final byte type, final Object value) {
- switch (type) {
- case 'A':
- return 1;
- case 'I':
- return 4;
- case 'i':
- return 4;
- case 's':
- return 2;
- case 'S':
- return 2;
- case 'c':
- return 1;
- case 'C':
- return 1;
- case 'f':
- return 4;
- case 'Z':
- return ((String) value).length()+1;
- case 'B':
- if (value instanceof byte[])
- return 1+ 4+ ((byte[]) value).length;
- if (value instanceof short[])
- return 1+ 4+ ((short[]) value).length * 2;
- if (value instanceof int[])
- return 1+ 4+ ((int[]) value).length * 4;
- if (value instanceof float[])
- return 1+ 4+ ((float[]) value).length * 4;
- if (value instanceof long[])
- return 1+ 4+ ((long[]) value).length * 4;
-
- throw new RuntimeException("Unknown tag array class: " + value.getClass());
- default:
- throw new RuntimeException("Unknown tag type: " + (char) type);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java b/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java
deleted file mode 100644
index 1c39ed2..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/ContainerFactory.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.digest.ContentDigests;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.writer.DataWriterFactory;
-import htsjdk.samtools.cram.encoding.writer.Writer;
-import htsjdk.samtools.cram.io.DefaultBitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.BlockContentType;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ContainerFactory {
- private final SAMFileHeader samFileHeader;
- private int recordsPerSlice = 10000;
- private boolean preserveReadNames = true;
- private long globalRecordCounter = 0;
-
- public ContainerFactory(final SAMFileHeader samFileHeader, final int recordsPerSlice) {
- this.samFileHeader = samFileHeader;
- this.recordsPerSlice = recordsPerSlice;
- }
-
- public Container buildContainer(final List<CramCompressionRecord> records)
- throws IllegalArgumentException, IllegalAccessException,
- IOException {
- return buildContainer(records, null);
- }
-
- Container buildContainer(final List<CramCompressionRecord> records,
- final SubstitutionMatrix substitutionMatrix)
- throws IllegalArgumentException, IllegalAccessException,
- IOException {
- // get stats, create compression header and slices
- final long time1 = System.nanoTime();
- final CompressionHeader header = new CompressionHeaderFactory().build(records,
- substitutionMatrix, samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate);
- header.APDelta = samFileHeader.getSortOrder() == SAMFileHeader.SortOrder.coordinate;
- final long time2 = System.nanoTime();
-
- header.readNamesIncluded = preserveReadNames;
-
- final List<Slice> slices = new ArrayList<Slice>();
-
- final Container container = new Container();
- container.header = header;
- container.nofRecords = records.size();
- container.globalRecordCounter = globalRecordCounter;
- container.bases = 0;
- container.blockCount = 0;
-
- final long time3 = System.nanoTime();
- long lastGlobalRecordCounter = container.globalRecordCounter;
- for (int i = 0; i < records.size(); i += recordsPerSlice) {
- final List<CramCompressionRecord> sliceRecords = records.subList(i,
- Math.min(records.size(), i + recordsPerSlice));
- final Slice slice = buildSlice(sliceRecords, header);
- slice.globalRecordCounter = lastGlobalRecordCounter;
- lastGlobalRecordCounter += slice.nofRecords;
- container.bases += slice.bases;
- slices.add(slice);
-
- // assuming one sequence per container max:
- if (container.sequenceId == -1 && slice.sequenceId != -1)
- container.sequenceId = slice.sequenceId;
- }
-
- final long time4 = System.nanoTime();
-
- container.slices = slices.toArray(new Slice[slices.size()]);
- calculateAlignmentBoundaries(container);
-
- container.buildHeaderTime = time2 - time1;
- container.buildSlicesTime = time4 - time3;
-
- globalRecordCounter += records.size();
- return container;
- }
-
- private static void calculateAlignmentBoundaries(final Container container) {
- int start = Integer.MAX_VALUE;
- int end = Integer.MIN_VALUE;
- for (final Slice s : container.slices) {
- if (s.sequenceId != SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- start = Math.min(start, s.alignmentStart);
- end = Math.max(end, s.alignmentStart + s.alignmentSpan);
- }
- }
-
- if (start < Integer.MAX_VALUE) {
- container.alignmentStart = start;
- container.alignmentSpan = end - start;
- }
- }
-
- private static Slice buildSlice(final List<CramCompressionRecord> records,
- final CompressionHeader header)
- throws IllegalArgumentException, IllegalAccessException,
- IOException {
- final Map<Integer, ExposedByteArrayOutputStream> map = new HashMap<Integer, ExposedByteArrayOutputStream>();
- for (final int id : header.externalIds) {
- map.put(id, new ExposedByteArrayOutputStream());
- }
-
- final DataWriterFactory dataWriterFactory = new DataWriterFactory();
- final ExposedByteArrayOutputStream bitBAOS = new ExposedByteArrayOutputStream();
- final DefaultBitOutputStream bitOutputStream = new DefaultBitOutputStream(bitBAOS);
-
- final Slice slice = new Slice();
- slice.nofRecords = records.size();
-
- int minAlStart = Integer.MAX_VALUE;
- int maxAlEnd = SAMRecord.NO_ALIGNMENT_START;
- {
- // @formatter:off
- /*
- * 1) Count slice bases.
- * 2) Decide if the slice is single ref, unmapped or multi reference.
- * 3) Detect alignment boundaries for the slice if not multi reference.
- */
- // @formatter:on
- slice.sequenceId = records.get(0).sequenceId;
- final ContentDigests hasher = ContentDigests.create(ContentDigests.ALL);
- for (final CramCompressionRecord record : records) {
- slice.bases += record.readLength;
- hasher.add(record);
- if (slice.sequenceId == Slice.MULTI_REFERENCE) continue;
-
- if (slice.sequenceId != record.sequenceId) {
- slice.sequenceId = Slice.MULTI_REFERENCE;
- } else if (record.alignmentStart != SAMRecord.NO_ALIGNMENT_START) {
- minAlStart = Math.min(record.alignmentStart, minAlStart);
- maxAlEnd = Math.max(record.getAlignmentEnd(), maxAlEnd);
- }
- }
-
- slice.sliceTags = hasher.getAsTags();
- }
-
- if (slice.sequenceId == Slice.MULTI_REFERENCE
- || minAlStart == Integer.MAX_VALUE) {
- slice.alignmentStart = Slice.NO_ALIGNMENT_START;
- slice.alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
- } else {
- slice.alignmentStart = minAlStart;
- slice.alignmentSpan = maxAlEnd - minAlStart + 1;
- }
-
- final Writer writer = dataWriterFactory.buildWriter(bitOutputStream, map, header, slice.sequenceId);
- int prevAlStart = slice.alignmentStart;
- for (final CramCompressionRecord record : records) {
- record.alignmentDelta = record.alignmentStart - prevAlStart;
- prevAlStart = record.alignmentStart;
- writer.write(record);
- }
-
- bitOutputStream.close();
- slice.coreBlock = Block.buildNewCore(bitBAOS.toByteArray());
-
- slice.external = new HashMap<Integer, Block>();
- for (final Integer key : map.keySet()) {
- final ExposedByteArrayOutputStream os = map.get(key);
-
- final Block externalBlock = new Block();
- externalBlock.setContentId(key);
- externalBlock.setContentType(BlockContentType.EXTERNAL);
-
- final ExternalCompressor compressor = header.externalCompressors.get(key);
- final byte[] rawData = os.toByteArray();
- final byte[] compressed = compressor.compress(rawData);
- externalBlock.setContent(rawData, compressed);
- externalBlock.setMethod(compressor.getMethod());
- slice.external.put(key, externalBlock);
- }
-
- return slice;
- }
-
- public boolean isPreserveReadNames() {
- return preserveReadNames;
- }
-
- public void setPreserveReadNames(final boolean preserveReadNames) {
- this.preserveReadNames = preserveReadNames;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java b/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java
deleted file mode 100644
index 050fce7..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/ContainerParser.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.encoding.reader.CramRecordReader;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory;
-import htsjdk.samtools.cram.encoding.reader.DataReaderFactory.DataReaderWithStats;
-import htsjdk.samtools.cram.encoding.reader.RefSeqIdReader;
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class ContainerParser {
- private static final Log log = Log.getInstance(ContainerParser.class);
-
- private final SAMFileHeader samFileHeader;
- private final Map<String, Long> nanosecondsMap = new TreeMap<String, Long>();
-
- public ContainerParser(final SAMFileHeader samFileHeader) {
- this.samFileHeader = samFileHeader;
- }
-
- public List<CramCompressionRecord> getRecords(final Container container,
- ArrayList<CramCompressionRecord> records, final ValidationStringency validationStringency) throws IllegalArgumentException,
- IllegalAccessException {
- if (container.isEOF()) return Collections.emptyList();
- final long time1 = System.nanoTime();
- if (records == null) {
- records = new ArrayList<CramCompressionRecord>(container.nofRecords);
- }
-
- for (final Slice slice : container.slices) {
- records.addAll(getRecords(slice, container.header, validationStringency));
- }
-
- final long time2 = System.nanoTime();
-
- container.parseTime = time2 - time1;
-
- if (log.isEnabled(LogLevel.DEBUG)) {
- for (final String key : nanosecondsMap.keySet()) {
- log.debug(String.format("%s: %dms.", key, nanosecondsMap.get(key) / 1000000));
- }
- }
-
- return records;
- }
-
- public Map<Integer, AlignmentSpan> getReferences(final Container container, final ValidationStringency validationStringency) throws IOException {
- final Map<Integer, AlignmentSpan> containerSpanMap = new HashMap<>();
- for (final Slice slice : container.slices) {
- addAllSpans(containerSpanMap, getReferences(slice, container.header, validationStringency));
- }
- return containerSpanMap;
- }
-
- private static void addSpan(final int seqId, final int start, final int span, final int count, final Map<Integer, AlignmentSpan> map) {
- if (map.containsKey(seqId)) {
- map.get(seqId).add(start, span, count);
- } else {
- map.put(seqId, new AlignmentSpan(start, span, count));
- }
- }
-
- private static Map<Integer, AlignmentSpan> addAllSpans(final Map<Integer, AlignmentSpan> spanMap, final Map<Integer, AlignmentSpan> addition) {
- for (final Map.Entry<Integer, AlignmentSpan> entry:addition.entrySet()) {
- addSpan(entry.getKey(), entry.getValue().getStart(), entry.getValue().getCount(), entry.getValue().getSpan(), spanMap);
- }
- return spanMap;
- }
-
- Map<Integer, AlignmentSpan> getReferences(final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency) throws IOException {
- final Map<Integer, AlignmentSpan> spanMap = new HashMap<>();
- switch (slice.sequenceId) {
- case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
- spanMap.put(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, AlignmentSpan.UNMAPPED_SPAN);
- break;
- case Slice.MULTI_REFERENCE:
- final DataReaderFactory dataReaderFactory = new DataReaderFactory();
- final Map<Integer, InputStream> inputMap = new HashMap<Integer, InputStream>();
- for (final Integer exId : slice.external.keySet()) {
- inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId)
- .getRawContent()));
- }
-
- final RefSeqIdReader reader = new RefSeqIdReader(Slice.MULTI_REFERENCE, slice.alignmentStart, validationStringency);
- dataReaderFactory.buildReader(reader, new DefaultBitInputStream(
- new ByteArrayInputStream(slice.coreBlock.getRawContent())),
- inputMap, header, slice.sequenceId);
-
- for (int i = 0; i < slice.nofRecords; i++) {
- reader.read();
- }
- addAllSpans(spanMap, reader.getReferenceSpans());
- break;
- default:
- addSpan(slice.sequenceId, slice.alignmentStart, slice.alignmentSpan, slice.nofRecords, spanMap);
- break;
- }
- return spanMap;
- }
-
- ArrayList<CramCompressionRecord> getRecords(ArrayList<CramCompressionRecord> records,
- final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency) throws IllegalArgumentException,
- IllegalAccessException {
- String seqName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- switch (slice.sequenceId) {
- case SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX:
- case -2:
- break;
-
- default:
- final SAMSequenceRecord sequence = samFileHeader
- .getSequence(slice.sequenceId);
- seqName = sequence.getSequenceName();
- break;
- }
-
- final DataReaderFactory dataReaderFactory = new DataReaderFactory();
- final Map<Integer, InputStream> inputMap = new HashMap<Integer, InputStream>();
- for (final Integer exId : slice.external.keySet()) {
- log.debug("Adding external data: " + exId);
- inputMap.put(exId, new ByteArrayInputStream(slice.external.get(exId)
- .getRawContent()));
- }
-
- long time;
- final CramRecordReader reader = new CramRecordReader(validationStringency);
- dataReaderFactory.buildReader(reader, new DefaultBitInputStream(
- new ByteArrayInputStream(slice.coreBlock.getRawContent())),
- inputMap, header, slice.sequenceId);
-
- if (records == null) {
- records = new ArrayList<CramCompressionRecord>(slice.nofRecords);
- }
-
- long readNanos = 0;
- int prevStart = slice.alignmentStart;
- for (int i = 0; i < slice.nofRecords; i++) {
- final CramCompressionRecord record = new CramCompressionRecord();
- record.sliceIndex = slice.index;
- record.index = i;
-
- time = System.nanoTime();
- reader.read(record);
- readNanos += System.nanoTime() - time;
-
- if (record.sequenceId == slice.sequenceId) {
- record.sequenceName = seqName;
- record.sequenceId = slice.sequenceId;
- } else {
- if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- } else {
- record.sequenceName = samFileHeader.getSequence(record.sequenceId)
- .getSequenceName();
- }
- }
-
- records.add(record);
-
- if (header.APDelta) {
- prevStart += record.alignmentDelta;
- record.alignmentStart = prevStart;
- }
- }
- log.debug("Slice records read time: " + readNanos / 1000000);
-
- final Map<String, DataReaderWithStats> statMap = dataReaderFactory.getStats(reader);
- for (final String key : statMap.keySet()) {
- final long value;
- if (!nanosecondsMap.containsKey(key)) {
- nanosecondsMap.put(key, 0L);
- value = 0;
- } else {
- value = nanosecondsMap.get(key);
- }
- nanosecondsMap.put(key, value + statMap.get(key).nanos);
- }
- return records;
- }
-
- List<CramCompressionRecord> getRecords(final Slice slice, final CompressionHeader header, final ValidationStringency validationStringency)
- throws IllegalArgumentException, IllegalAccessException {
- return getRecords(null, slice, header, validationStringency);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java b/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java
deleted file mode 100644
index 699bd2a..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Cram2SamRecordFactory.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public class Cram2SamRecordFactory {
-
- private final SAMFileHeader header;
-
- public Cram2SamRecordFactory(final SAMFileHeader header) {
- this.header = header;
- }
-
- public SAMRecord create(final CramCompressionRecord cramRecord) {
- final SAMRecord samRecord = new SAMRecord(header);
-
- samRecord.setReadName(cramRecord.readName);
- copyFlags(cramRecord, samRecord);
-
- if (cramRecord.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- samRecord.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- samRecord.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
- samRecord.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- } else {
- samRecord.setReferenceIndex(cramRecord.sequenceId);
- samRecord.setAlignmentStart(cramRecord.alignmentStart);
- samRecord.setMappingQuality(cramRecord.mappingQuality);
- }
-
- if (cramRecord.isSegmentUnmapped())
- samRecord.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
- else
- samRecord.setCigar(getCigar2(cramRecord.readFeatures,
- cramRecord.readLength));
-
- if (samRecord.getReadPairedFlag()) {
- samRecord.setMateReferenceIndex(cramRecord.mateSequenceID);
- samRecord
- .setMateAlignmentStart(cramRecord.mateAlignmentStart > 0 ? cramRecord.mateAlignmentStart : SAMRecord
- .NO_ALIGNMENT_START);
- samRecord.setMateNegativeStrandFlag(cramRecord.isMateNegativeStrand());
- samRecord.setMateUnmappedFlag(cramRecord.isMateUnmapped());
- } else {
- samRecord
- .setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- samRecord.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- }
-
- samRecord.setInferredInsertSize(cramRecord.templateSize);
- samRecord.setReadBases(cramRecord.readBases);
- samRecord.setBaseQualities(cramRecord.qualityScores);
-
- if (cramRecord.tags != null)
- for (final ReadTag tag : cramRecord.tags)
- samRecord.setAttribute(tag.getKey(), tag.getValue());
-
- if (cramRecord.readGroupID > -1) {
- final SAMReadGroupRecord readGroupRecord = header.getReadGroups().get(
- cramRecord.readGroupID);
- samRecord.setAttribute("RG", readGroupRecord.getId());
- }
-
- return samRecord;
- }
-
- private static void copyFlags(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
- samRecord.setReadPairedFlag(cramRecord.isMultiFragment());
- samRecord.setProperPairFlag(cramRecord.isProperPair());
- samRecord.setReadUnmappedFlag(cramRecord.isSegmentUnmapped());
- samRecord.setReadNegativeStrandFlag(cramRecord.isNegativeStrand());
- samRecord.setFirstOfPairFlag(cramRecord.isFirstSegment());
- samRecord.setSecondOfPairFlag(cramRecord.isLastSegment());
- samRecord.setNotPrimaryAlignmentFlag(cramRecord.isSecondaryAlignment());
- samRecord.setReadFailsVendorQualityCheckFlag(cramRecord.isVendorFiltered());
- samRecord.setDuplicateReadFlag(cramRecord.isDuplicate());
- samRecord.setSupplementaryAlignmentFlag(cramRecord.isSupplementary());
- }
-
- private static Cigar getCigar2(final Collection<ReadFeature> features,
- final int readLength) {
- if (features == null || features.isEmpty()) {
- final CigarElement cigarElement = new CigarElement(readLength, CigarOperator.M);
- return new Cigar(Collections.singletonList(cigarElement));
- }
-
- final List<CigarElement> list = new ArrayList<CigarElement>();
- int totalOpLen = 1;
- CigarElement cigarElement;
- CigarOperator lastOperator = CigarOperator.MATCH_OR_MISMATCH;
- int lastOpLen = 0;
- int lastOpPos = 1;
- CigarOperator cigarOperator;
- int readFeatureLength;
- for (final ReadFeature feature : features) {
-
- final int gap = feature.getPosition() - (lastOpPos + lastOpLen);
- if (gap > 0) {
- if (lastOperator != CigarOperator.MATCH_OR_MISMATCH) {
- list.add(new CigarElement(lastOpLen, lastOperator));
- lastOpPos += lastOpLen;
- totalOpLen += lastOpLen;
- lastOpLen = gap;
- } else {
- lastOpLen += gap;
- }
-
- lastOperator = CigarOperator.MATCH_OR_MISMATCH;
- }
-
- switch (feature.getOperator()) {
- case Insertion.operator:
- cigarOperator = CigarOperator.INSERTION;
- readFeatureLength = ((Insertion) feature).getSequence().length;
- break;
- case SoftClip.operator:
- cigarOperator = CigarOperator.SOFT_CLIP;
- readFeatureLength = ((SoftClip) feature).getSequence().length;
- break;
- case HardClip.operator:
- cigarOperator = CigarOperator.HARD_CLIP;
- readFeatureLength = ((HardClip) feature).getLength();
- break;
- case InsertBase.operator:
- cigarOperator = CigarOperator.INSERTION;
- readFeatureLength = 1;
- break;
- case Deletion.operator:
- cigarOperator = CigarOperator.DELETION;
- readFeatureLength = ((Deletion) feature).getLength();
- break;
- case RefSkip.operator:
- cigarOperator = CigarOperator.SKIPPED_REGION;
- readFeatureLength = ((RefSkip) feature).getLength();
- break;
- case Padding.operator:
- cigarOperator = CigarOperator.PADDING;
- readFeatureLength = ((Padding) feature).getLength();
- break;
- case Substitution.operator:
- case ReadBase.operator:
- cigarOperator = CigarOperator.MATCH_OR_MISMATCH;
- readFeatureLength = 1;
- break;
- default:
- continue;
- }
-
- if (lastOperator != cigarOperator) {
- // add last feature
- if (lastOpLen > 0) {
- list.add(new CigarElement(lastOpLen, lastOperator));
- totalOpLen += lastOpLen;
- }
- lastOperator = cigarOperator;
- lastOpLen = readFeatureLength;
- lastOpPos = feature.getPosition();
- } else
- lastOpLen += readFeatureLength;
-
- if (!cigarOperator.consumesReadBases())
- lastOpPos -= readFeatureLength;
- }
-
- if (lastOperator != null) {
- if (lastOperator != CigarOperator.M) {
- list.add(new CigarElement(lastOpLen, lastOperator));
- if (readLength >= lastOpPos + lastOpLen) {
- cigarElement = new CigarElement(readLength - (lastOpLen + lastOpPos)
- + 1, CigarOperator.M);
- list.add(cigarElement);
- }
- } else if (readLength == 0 || readLength > lastOpPos - 1) {
- if (readLength == 0)
- cigarElement = new CigarElement(lastOpLen, CigarOperator.M);
- else
- cigarElement = new CigarElement(readLength - lastOpPos + 1,
- CigarOperator.M);
- list.add(cigarElement);
- }
- }
-
- if (list.isEmpty()) {
- cigarElement = new CigarElement(readLength, CigarOperator.M);
- return new Cigar(Collections.singletonList(cigarElement));
- }
-
- return new Cigar(list);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java
deleted file mode 100644
index a38e6b8..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramContainerIterator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-/**
- * An iterator of CRAM containers read from an {@link java.io.InputStream}.
- */
-public class CramContainerIterator implements Iterator<Container> {
- private CramHeader cramHeader;
- private InputStream inputStream;
- private Container nextContainer;
- private boolean eof = false;
- private long offset = 0;
-
- public CramContainerIterator(final InputStream inputStream) throws IOException {
- cramHeader = CramIO.readCramHeader(inputStream);
- this.inputStream = inputStream;
- }
-
- void readNextContainer() {
- try {
- final CountingInputStream cis = new CountingInputStream(inputStream);
- nextContainer = ContainerIO.readContainer(cramHeader.getVersion(), cis);
- final long containerSizeInBytes = cis.getCount();
-
- nextContainer.offset = offset;
- offset += containerSizeInBytes;
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
-
- if (nextContainer.isEOF()) {
- eof = true;
- nextContainer = null;
- }
- }
-
- @Override
- public boolean hasNext() {
- if (eof) return false;
- if (nextContainer == null) readNextContainer();
- return !eof;
- }
-
- @Override
- public Container next() {
- final Container result = nextContainer;
- nextContainer = null;
- return result;
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("Read only iterator.");
- }
-
- public CramHeader getCramHeader() {
- return cramHeader;
- }
-
- public void close() {
- nextContainer = null;
- cramHeader = null;
- //noinspection EmptyCatchBlock
- try {
- inputStream.close();
- } catch (final Exception e) {
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramIO.java b/src/main/java/htsjdk/samtools/cram/build/CramIO.java
deleted file mode 100644
index 04ac339..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramIO.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.CountingInputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-
-/**
- * A collection of methods to open and close CRAM files.
- */
-public class CramIO {
- public static final String CRAM_FILE_EXTENSION = ".cram";
- /**
- * The 'zero-B' EOF marker as per CRAM specs v2.1. This is basically a serialized empty CRAM container with sequence id set to some
- * number to spell out 'EOF' in hex.
- */
- public static final byte[] ZERO_B_EOF_MARKER = bytesFromHex("0b 00 00 00 ff ff ff ff ff e0 45 4f 46 00 00 00 00 01 00 00 01 00 06 06 01 00 " +
- "" + "01 00 01 00");
- /**
- * The zero-F EOF marker as per CRAM specs v3.0. This is basically a serialized empty CRAM container with sequence id set to some number
- * to spell out 'EOF' in hex.
- */
- public static final byte[] ZERO_F_EOF_MARKER = bytesFromHex("0f 00 00 00 ff ff ff ff 0f e0 45 4f 46 00 00 00 00 01 00 05 bd d9 4f 00 01 00 " +
- "" + "06 06 01 00 01 00 01 00 ee 63 01 4b");
-
-
- private static final int DEFINITION_LENGTH = 4 + 1 + 1 + 20;
- private static final Log log = Log.getInstance(CramIO.class);
-
- private static byte[] bytesFromHex(final String string) {
- final String clean = string.replaceAll("[^0-9a-fA-F]", "");
- if (clean.length() % 2 != 0) throw new RuntimeException("Not a hex string: " + string);
- final byte[] data = new byte[clean.length() / 2];
- for (int i = 0; i < clean.length(); i += 2) {
- data[i / 2] = (Integer.decode("0x" + clean.charAt(i) + clean.charAt(i + 1))).byteValue();
- }
- return data;
- }
-
- /**
- * Write an end-of-file marker to the {@link OutputStream}. The specific EOF marker is chosen based on the CRAM version.
- *
- * @param version the CRAM version to assume
- * @param outputStream the stream to write to
- * @return the number of bytes written out
- * @throws IOException as per java IO contract
- */
- public static long issueEOF(final Version version, final OutputStream outputStream) throws IOException {
- if (version.compatibleWith(CramVersions.CRAM_v3)) {
- outputStream.write(ZERO_F_EOF_MARKER);
- return ZERO_F_EOF_MARKER.length;
- }
-
- if (version.compatibleWith(CramVersions.CRAM_v2_1)) {
- outputStream.write(ZERO_B_EOF_MARKER);
- return ZERO_B_EOF_MARKER.length;
- }
- return 0;
- }
-
- /**
- * Write a CRAM File header and a SAM Header to an output stream.
- *
- * @param cramVersion
- * @param outStream
- * @param samFileHeader
- * @param cramID
- * @return the offset in the stream after writing the headers
- */
-
- public static long writeHeader(final Version cramVersion, final OutputStream outStream, final SAMFileHeader samFileHeader, String cramID) {
- final CramHeader cramHeader = new CramHeader(cramVersion, cramID, samFileHeader);
- try {
- return CramIO.writeCramHeader(cramHeader, outStream);
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- private static boolean streamEndsWith(final SeekableStream seekableStream, final byte[] marker) throws IOException {
- final byte[] tail = new byte[marker.length];
-
- seekableStream.seek(seekableStream.length() - marker.length);
- InputStreamUtils.readFully(seekableStream, tail, 0, tail.length);
-
- if (Arrays.equals(tail, marker)) return true ;
- // relaxing the ITF8 hanging bits:
- tail[8] = marker[8];
- return Arrays.equals(tail, marker);
- }
-
- /**
- * Check if the {@link SeekableStream} is properly terminated with a end-of-file marker.
- *
- * @param version CRAM version to assume
- * @param seekableStream the stream to read from
- * @return true if the stream ends with a correct EOF marker, false otherwise
- * @throws IOException as per java IO contract
- */
- @SuppressWarnings("SimplifiableIfStatement")
- private static boolean checkEOF(final Version version, final SeekableStream seekableStream) throws IOException {
-
- if (version.compatibleWith(CramVersions.CRAM_v3)) return streamEndsWith(seekableStream, ZERO_F_EOF_MARKER);
- if (version.compatibleWith(CramVersions.CRAM_v2_1)) return streamEndsWith(seekableStream, ZERO_B_EOF_MARKER);
-
- return false;
- }
-
- /**
- * Check if the file: 1) contains proper CRAM header. 2) given the version info from the header check the end of file marker.
- *
- * @param file the CRAM file to check
- * @return true if the file is a valid CRAM file and is properly terminated with respect to the version.
- * @throws IOException as per java IO contract
- */
- public static boolean checkHeaderAndEOF(final File file) throws IOException {
- final SeekableStream seekableStream = new SeekableFileStream(file);
- final CramHeader cramHeader = readCramHeader(seekableStream);
- return checkEOF(cramHeader.getVersion(), seekableStream);
- }
-
- /**
- * Writes CRAM header into the specified {@link OutputStream}.
- *
- * @param cramHeader the {@link CramHeader} object to write
- * @param outputStream the output stream to write to
- * @return the number of bytes written out
- * @throws IOException as per java IO contract
- */
- public static long writeCramHeader(final CramHeader cramHeader, final OutputStream outputStream) throws IOException {
-// if (cramHeader.getVersion().major < 3) throw new RuntimeException("Deprecated CRAM version: " + cramHeader.getVersion().major);
- outputStream.write("CRAM".getBytes("US-ASCII"));
- outputStream.write(cramHeader.getVersion().major);
- outputStream.write(cramHeader.getVersion().minor);
- outputStream.write(cramHeader.getId());
- for (int i = cramHeader.getId().length; i < 20; i++)
- outputStream.write(0);
-
- final long length = CramIO.writeContainerForSamFileHeader(cramHeader.getVersion().major, cramHeader.getSamFileHeader(), outputStream);
-
- return CramIO.DEFINITION_LENGTH + length;
- }
-
- private static CramHeader readFormatDefinition(final InputStream inputStream) throws IOException {
- for (final byte magicByte : CramHeader.MAGIC) {
- if (magicByte != inputStream.read()) throw new RuntimeException("Unknown file format.");
- }
-
- final Version version = new Version(inputStream.read(), inputStream.read(), 0);
-
- final CramHeader header = new CramHeader(version, null, null);
-
- final DataInputStream dataInputStream = new DataInputStream(inputStream);
- dataInputStream.readFully(header.getId());
-
- return header;
- }
-
- /**
- * Read CRAM header from the given {@link InputStream}.
- *
- * @param inputStream input stream to read from
- * @return complete {@link CramHeader} object
- * @throws IOException as per java IO contract
- */
- public static CramHeader readCramHeader(final InputStream inputStream) throws IOException {
- final CramHeader header = readFormatDefinition(inputStream);
-
- final SAMFileHeader samFileHeader = readSAMFileHeader(header.getVersion(), inputStream, new String(header.getId()));
-
- return new CramHeader(header.getVersion(), new String(header.getId()), samFileHeader);
- }
-
- private static byte[] toByteArray(final SAMFileHeader samFileHeader) {
- final ExposedByteArrayOutputStream headerBodyOS = new ExposedByteArrayOutputStream();
- final OutputStreamWriter outStreamWriter = new OutputStreamWriter(headerBodyOS);
- new SAMTextHeaderCodec().encode(outStreamWriter, samFileHeader);
- try {
- outStreamWriter.close();
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
-
- final ByteBuffer buf = ByteBuffer.allocate(4);
- buf.order(ByteOrder.LITTLE_ENDIAN);
- buf.putInt(headerBodyOS.size());
- buf.flip();
- final byte[] bytes = new byte[buf.limit()];
- buf.get(bytes);
-
- final ByteArrayOutputStream headerOS = new ByteArrayOutputStream();
- try {
- headerOS.write(bytes);
- headerOS.write(headerBodyOS.getBuffer(), 0, headerBodyOS.size());
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
-
- return headerOS.toByteArray();
- }
-
- private static long writeContainerForSamFileHeader(final int major, final SAMFileHeader samFileHeader, final OutputStream os) throws IOException {
- final byte[] data = toByteArray(samFileHeader);
- final int length = Math.max(1024, data.length + data.length / 2);
- final byte[] blockContent = new byte[length];
- System.arraycopy(data, 0, blockContent, 0, Math.min(data.length, length));
- final Block block = Block.buildNewFileHeaderBlock(blockContent);
-
- final Container container = new Container();
- container.blockCount = 1;
- container.blocks = new Block[]{block};
- container.landmarks = new int[0];
- container.slices = new Slice[0];
- container.alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
- container.alignmentStart = Slice.NO_ALIGNMENT_START;
- container.bases = 0;
- container.globalRecordCounter = 0;
- container.nofRecords = 0;
- container.sequenceId = 0;
-
- final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
- block.write(major, byteArrayOutputStream);
- container.containerByteSize = byteArrayOutputStream.size();
-
- final int containerHeaderByteSize = ContainerIO.writeContainerHeader(major, container, os);
- os.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
-
- return containerHeaderByteSize + byteArrayOutputStream.size();
- }
-
- private static SAMFileHeader readSAMFileHeader(final Version version, InputStream inputStream, final String id) throws IOException {
- final Container container = ContainerIO.readContainerHeader(version.major, inputStream);
- final Block block;
- {
- if (version.compatibleWith(CramVersions.CRAM_v3)) {
- final byte[] bytes = new byte[container.containerByteSize];
- InputStreamUtils.readFully(inputStream, bytes, 0, bytes.length);
- block = Block.readFromInputStream(version.major, new ByteArrayInputStream(bytes));
- // ignore the rest of the container
- } else {
- /*
- * pending issue: container.containerByteSize inputStream 2 bytes shorter
- * then needed in the v21 test cram files.
- */
- block = Block.readFromInputStream(version.major, inputStream);
- }
- }
-
- inputStream = new ByteArrayInputStream(block.getRawContent());
-
- final ByteBuffer buffer = ByteBuffer.allocate(4);
- buffer.order(ByteOrder.LITTLE_ENDIAN);
- for (int i = 0; i < 4; i++)
- buffer.put((byte) inputStream.read());
- buffer.flip();
- final int size = buffer.asIntBuffer().get();
-
- final DataInputStream dataInputStream = new DataInputStream(inputStream);
- final byte[] bytes = new byte[size];
- dataInputStream.readFully(bytes);
-
- final BufferedLineReader bufferedLineReader = new BufferedLineReader(new ByteArrayInputStream(bytes));
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- return codec.decode(bufferedLineReader, id);
- }
-
- /**
- * Attempt to replace the SAM file header in the CRAM file. This will succeed only if there is sufficient space reserved in the existing
- * CRAM header. The implementation re-writes the first FILE_HEADER block in the first container of the CRAM file using random file
- * access.
- *
- * @param file the CRAM file
- * @param newHeader the new CramHeader container a new SAM file header
- * @return true if successfully replaced the header, false otherwise
- * @throws IOException as per java IO contract
- */
- public static boolean replaceCramHeader(final File file, final CramHeader newHeader) throws IOException {
-
- final CountingInputStream countingInputStream = new CountingInputStream(new FileInputStream(file));
-
- final CramHeader header = readFormatDefinition(countingInputStream);
- final Container c = ContainerIO.readContainerHeader(header.getVersion().major, countingInputStream);
- final long pos = countingInputStream.getCount();
- countingInputStream.close();
-
- final Block block = Block.buildNewFileHeaderBlock(toByteArray(newHeader.getSamFileHeader()));
- final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
- block.write(newHeader.getVersion().major, byteArrayOutputStream);
- if (byteArrayOutputStream.size() > c.containerByteSize) {
- log.error("Failed to replace CRAM header because the new header does not fit.");
- return false;
- }
- final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
- randomAccessFile.seek(pos);
- randomAccessFile.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
- randomAccessFile.close();
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java b/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java
deleted file mode 100644
index 1be1aa5..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramNormalizer.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.ref.CRAMReferenceSource;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import htsjdk.samtools.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class CramNormalizer {
- private final SAMFileHeader header;
- private int readCounter = 0;
-
- private static Log log = Log.getInstance(CramNormalizer.class);
- private CRAMReferenceSource referenceSource;
-
- private CramNormalizer(final SAMFileHeader header) {
- this.header = header;
- }
-
- public CramNormalizer(final SAMFileHeader header, final CRAMReferenceSource referenceSource) {
- if (referenceSource == null) {
- throw new IllegalArgumentException("A reference is required.");
- }
- this.header = header;
- this.referenceSource = referenceSource;
- }
-
- public void normalize(final ArrayList<CramCompressionRecord> records,
- final byte[] ref, final int refOffset_zeroBased,
- final SubstitutionMatrix substitutionMatrix) {
-
- final int startCounter = readCounter;
-
- for (final CramCompressionRecord record : records) {
- record.index = ++readCounter;
-
- if (record.sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- record.sequenceName = SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- record.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
- } else {
- record.sequenceName = header.getSequence(record.sequenceId)
- .getSequenceName();
- }
- }
-
- {// restore pairing first:
- for (final CramCompressionRecord record : records) {
- if (!record.isMultiFragment() || record.isDetached()) {
- record.recordsToNextFragment = -1;
-
- record.next = null;
- record.previous = null;
- continue;
- }
- if (record.isHasMateDownStream()) {
- final CramCompressionRecord downMate = records.get(record.index
- + record.recordsToNextFragment - startCounter);
- record.next = downMate;
- downMate.previous = record;
- }
- }
- for (final CramCompressionRecord record : records) {
- if (record.previous != null) continue;
- if (record.next == null) continue;
- restoreMateInfo(record);
- }
- }
-
- // assign some read names if needed:
- for (final CramCompressionRecord record : records) {
- if (record.readName == null) {
- final String readNamePrefix = "";
- final String name = readNamePrefix + record.index;
- record.readName = name;
- if (record.next != null)
- record.next.readName = name;
- if (record.previous != null)
- record.previous.readName = name;
- }
- }
-
- // resolve bases:
- for (final CramCompressionRecord record : records) {
- if (record.isSegmentUnmapped())
- continue;
-
- byte[] refBases = ref;
- {
- // ref could be supplied (aka forced) already or needs looking up:
- // ref.length=0 is a special case of seqId=-2 (multiref)
- if ((ref == null || ref.length == 0) && referenceSource != null)
- refBases = referenceSource.getReferenceBases(
- header.getSequence(record.sequenceId), true);
- }
-
- if (record.isUnknownBases()) {
- record.readBases = SAMRecord.NULL_SEQUENCE;
- } else
- record.readBases = restoreReadBases(record, refBases, refOffset_zeroBased,
- substitutionMatrix);
- }
-
- // restore quality scores:
- final byte defaultQualityScore = '?' - '!';
- restoreQualityScores(defaultQualityScore, records);
- }
-
- private static void restoreMateInfo(final CramCompressionRecord record) {
- if (record.next == null) {
-
- return;
- }
- CramCompressionRecord cur;
- cur = record;
- while (cur.next != null) {
- setNextMate(cur, cur.next);
- cur = cur.next;
- }
-
- // cur points to the last segment now:
- final CramCompressionRecord last = cur;
- setNextMate(last, record);
-// record.setFirstSegment(true);
-// last.setLastSegment(true);
-
- final int templateLength = computeInsertSize(record, last);
- record.templateSize = templateLength;
- last.templateSize = -templateLength;
- }
-
- private static void setNextMate(final CramCompressionRecord record, final CramCompressionRecord next) {
- record.mateAlignmentStart = next.alignmentStart;
- record.setMateUnmapped(next.isSegmentUnmapped());
- record.setMateNegativeStrand(next.isNegativeStrand());
- record.mateSequenceID = next.sequenceId;
- if (record.mateSequenceID == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)
- record.mateAlignmentStart = SAMRecord.NO_ALIGNMENT_START;
- }
-
- public static void restoreQualityScores(final byte defaultQualityScore,
- final List<CramCompressionRecord> records) {
- for (final CramCompressionRecord record : records)
- restoreQualityScores(defaultQualityScore, record);
- }
-
- private static byte[] restoreQualityScores(final byte defaultQualityScore,
- final CramCompressionRecord record) {
- if (!record.isForcePreserveQualityScores()) {
- boolean star = true;
- final byte[] scores = new byte[record.readLength];
- Arrays.fill(scores, defaultQualityScore);
- if (record.readFeatures != null)
- for (final ReadFeature feature : record.readFeatures) {
- switch (feature.getOperator()) {
- case BaseQualityScore.operator:
- int pos = feature.getPosition();
- scores[pos - 1] = ((BaseQualityScore) feature).getQualityScore();
- star = false;
- break;
- case ReadBase.operator:
- pos = feature.getPosition();
- scores[pos - 1] = ((ReadBase) feature).getQualityScore();
- star = false;
- break;
-
- default:
- break;
- }
- }
-
- if (star)
- record.qualityScores = SAMRecord.NULL_QUALS;
- else
- record.qualityScores = scores;
- } else {
- final byte[] scores = record.qualityScores;
- int missingScores = 0;
- for (int i = 0; i < scores.length; i++)
- if (scores[i] == -1) {
- scores[i] = defaultQualityScore;
- missingScores++;
- }
- if (missingScores == scores.length)
- record.qualityScores = SAMRecord.NULL_QUALS;
- }
-
- return record.qualityScores;
- }
-
- private static byte[] restoreReadBases(final CramCompressionRecord record, final byte[] ref,
- final int refOffsetZeroBased, final SubstitutionMatrix substitutionMatrix) {
- if (record.isUnknownBases() || record.readLength == 0) return SAMRecord.NULL_SEQUENCE;
- final int readLength = record.readLength;
- final byte[] bases = new byte[readLength];
-
- int posInRead = 1;
- final int alignmentStart = record.alignmentStart - 1;
-
- int posInSeq = 0;
- if (record.readFeatures == null || record.readFeatures.isEmpty()) {
- if (ref.length + refOffsetZeroBased < alignmentStart
- + bases.length) {
- Arrays.fill(bases, (byte) 'N');
- System.arraycopy(
- ref,
- alignmentStart - refOffsetZeroBased,
- bases,
- 0,
- Math.min(bases.length, ref.length + refOffsetZeroBased
- - alignmentStart));
- } else
- System.arraycopy(ref, alignmentStart - refOffsetZeroBased,
- bases, 0, bases.length);
- return bases;
- }
- final List<ReadFeature> variations = record.readFeatures;
- for (final ReadFeature variation : variations) {
- for (; posInRead < variation.getPosition(); posInRead++) {
- final int rp = alignmentStart + posInSeq++ - refOffsetZeroBased;
- bases[posInRead - 1] = getByteOrDefault(ref, rp, (byte) 'N');
- }
-
- switch (variation.getOperator()) {
- case Substitution.operator:
- final Substitution substitution = (Substitution) variation;
- byte refBase = getByteOrDefault(ref, alignmentStart + posInSeq
- - refOffsetZeroBased, (byte) 'N');
- refBase = Utils.normalizeBase(refBase);
- final byte base = substitutionMatrix.base(refBase, substitution.getCode());
- substitution.setBase(base);
- substitution.setReferenceBase(refBase);
- bases[posInRead++ - 1] = base;
- posInSeq++;
- break;
- case Insertion.operator:
- final Insertion insertion = (Insertion) variation;
- for (int i = 0; i < insertion.getSequence().length; i++)
- bases[posInRead++ - 1] = insertion.getSequence()[i];
- break;
- case SoftClip.operator:
- final SoftClip softClip = (SoftClip) variation;
- for (int i = 0; i < softClip.getSequence().length; i++)
- bases[posInRead++ - 1] = softClip.getSequence()[i];
- break;
- case Deletion.operator:
- final Deletion deletion = (Deletion) variation;
- posInSeq += deletion.getLength();
- break;
- case InsertBase.operator:
- final InsertBase insert = (InsertBase) variation;
- bases[posInRead++ - 1] = insert.getBase();
- break;
- case RefSkip.operator:
- posInSeq += ((RefSkip) variation).getLength();
- break;
- }
- }
- for (; posInRead <= readLength
- && alignmentStart + posInSeq - refOffsetZeroBased < ref.length; posInRead++, posInSeq++) {
- bases[posInRead - 1] = ref[alignmentStart + posInSeq
- - refOffsetZeroBased];
- }
-
- // ReadBase overwrites bases:
- for (final ReadFeature variation : variations) {
- switch (variation.getOperator()) {
- case ReadBase.operator:
- final ReadBase readBase = (ReadBase) variation;
- bases[variation.getPosition() - 1] = readBase.getBase();
- break;
- default:
- break;
- }
- }
-
- for (int i = 0; i < bases.length; i++) {
- bases[i] = Utils.normalizeBase(bases[i]);
- }
-
- return bases;
- }
-
- private static byte getByteOrDefault(final byte[] array, final int pos,
- final byte outOfBoundsValue) {
- if (pos >= array.length)
- return outOfBoundsValue;
- else
- return array[pos];
- }
-
- /**
- * The method is similar in semantics to
- * {@link htsjdk.samtools.SamPairUtil#computeInsertSize(SAMRecord, SAMRecord)
- * computeInsertSize} but operates on CRAM native records instead of
- * SAMRecord objects.
- *
- * @param firstEnd first mate of the pair
- * @param secondEnd second mate of the pair
- * @return template length
- */
- public static int computeInsertSize(final CramCompressionRecord firstEnd,
- final CramCompressionRecord secondEnd) {
- if (firstEnd.isSegmentUnmapped() || secondEnd.isSegmentUnmapped()) {
- return 0;
- }
- if (firstEnd.sequenceId != secondEnd.sequenceId) {
- return 0;
- }
-
- final int firstEnd5PrimePosition = firstEnd.isNegativeStrand() ? firstEnd.getAlignmentEnd() : firstEnd.alignmentStart;
- final int secondEnd5PrimePosition = secondEnd.isNegativeStrand() ? secondEnd.getAlignmentEnd() : secondEnd.alignmentStart;
-
- final int adjustment = (secondEnd5PrimePosition >= firstEnd5PrimePosition) ? +1 : -1;
- return secondEnd5PrimePosition - firstEnd5PrimePosition + adjustment;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java b/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java
deleted file mode 100644
index 2956cda..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/CramSpanContainerIterator.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An iterator of CRAM containers read from locations in {@link htsjdk.samtools.seekablestream.SeekableStream}. The locations are specified with
- * pairs of coordinates, they are basically file pointers as returned for example by {@link htsjdk.samtools.SamReader.Indexing#getFilePointerSpanningReads()}
- */
-public class CramSpanContainerIterator implements Iterator<Container> {
- private final CramHeader cramHeader;
- private final SeekableStream seekableStream;
- private Iterator<Boundary> containerBoundaries;
- private Boundary currentBoundary;
- private long firstContainerOffset;
-
- private CramSpanContainerIterator(final SeekableStream seekableStream, final long[] coordinates) throws IOException {
- this.seekableStream = seekableStream;
- seekableStream.seek(0);
- this.cramHeader = CramIO.readCramHeader(seekableStream);
- firstContainerOffset = seekableStream.position();
-
- final List<Boundary> boundaries = new ArrayList<Boundary>();
- for (int i = 0; i < coordinates.length; i += 2) {
- boundaries.add(new Boundary(coordinates[i], coordinates[i + 1]));
- }
-
- containerBoundaries = boundaries.iterator();
- currentBoundary = containerBoundaries.next();
- }
-
- public static CramSpanContainerIterator fromFileSpan(final SeekableStream seekableStream, final long[] coordinates) throws IOException {
- return new CramSpanContainerIterator(seekableStream, coordinates);
- }
-
- @Override
- public boolean hasNext() {
- try {
- if (currentBoundary.hasNext()) return true;
- if (!containerBoundaries.hasNext()) return false;
- currentBoundary = containerBoundaries.next();
- return currentBoundary.hasNext();
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public Container next() {
- try {
- return currentBoundary.next();
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("Not allowed.");
- }
-
- public CramHeader getCramHeader() {
- return cramHeader;
- }
-
- private class Boundary {
- final long start;
- final long end;
-
- public Boundary(final long start, final long end) {
- this.start = start;
- this.end = end;
- if (start >= end) throw new RuntimeException("Boundary start is greater than end.");
- }
-
- boolean hasNext() throws IOException {
- return seekableStream.position() <= (end >> 16);
- }
-
- Container next() throws IOException {
- if (seekableStream.position() < (start >> 16)) seekableStream.seek(start >> 16);
- if (seekableStream.position() > (end >> 16)) throw new RuntimeException("No more containers in this boundary.");
- final long offset = seekableStream.position();
- final Container c = ContainerIO.readContainer(cramHeader.getVersion(), seekableStream);
- c.offset = offset;
- return c;
- }
- }
-
- public long getFirstContainerOffset() {
- return firstContainerOffset;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java b/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java
deleted file mode 100644
index b7ffcb1..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Sam2CramRecordFactory.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecord.SAMTagAndValue;
-import htsjdk.samtools.SAMTag;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class Sam2CramRecordFactory {
-
- public static final String UNKNOWN_READ_GROUP_ID = "UNKNOWN";
- public static final String UNKNOWN_READ_GROUP_SAMPLE = "UNKNOWN";
-
- private final static byte QS_asciiOffset = 33;
- public final static byte unsetQualityScore = 32;
- public final static byte ignorePositionsWithQualityScore = -1;
-
- private byte[] refBases;
- private final Version version;
- private byte[] refSNPs;
-
- final private SAMFileHeader header;
-
- private static final Log log = Log.getInstance(Sam2CramRecordFactory.class);
-
- private final Map<String, Integer> readGroupMap = new HashMap<String, Integer>();
-
- private long landedRefMaskScores = 0;
- private long landedTotalScores = 0;
-
- public boolean captureAllTags = false;
- public boolean preserveReadNames = false;
- public final Set<String> captureTags = new TreeSet<String>();
- public final Set<String> ignoreTags = new TreeSet<String>();
-
- {
- ignoreTags.add(SAMTag.RG.name());
- }
-
- private final List<ReadTag> readTagList = new ArrayList<ReadTag>();
-
- private long baseCount = 0;
- private long featureCount = 0;
-
- public Sam2CramRecordFactory(final byte[] refBases, final SAMFileHeader samFileHeader, final Version version) {
- this.refBases = refBases;
- this.version = version;
- this.header = samFileHeader;
-
- final List<SAMReadGroupRecord> readGroups = samFileHeader.getReadGroups();
- for (int i = 0; i < readGroups.size(); i++) {
- final SAMReadGroupRecord readGroupRecord = readGroups.get(i);
- readGroupMap.put(readGroupRecord.getId(), i);
- }
- }
-
- /**
- * Create a CramCompressionRecord.
- *
- * @param record If the input record does not have an associated SAMFileHeader, it will be updated
- * with the header used for the factory in order to allow reference indices to be resolved.
- * @return CramCompressionRecord
- */
- public CramCompressionRecord createCramRecord(final SAMRecord record) {
- if (null == record.getHeader()) {
- record.setHeader(header);
- }
- final CramCompressionRecord cramRecord = new CramCompressionRecord();
- if (record.getReadPairedFlag()) {
- cramRecord.mateAlignmentStart = record.getMateAlignmentStart();
- cramRecord.setMateUnmapped(record.getMateUnmappedFlag());
- cramRecord.setMateNegativeStrand(record.getMateNegativeStrandFlag());
- cramRecord.mateSequenceID = record.getMateReferenceIndex();
- } else cramRecord.mateSequenceID = -1;
- cramRecord.sequenceId = record.getReferenceIndex();
- cramRecord.readName = record.getReadName();
- cramRecord.alignmentStart = record.getAlignmentStart();
-
- cramRecord.setMultiFragment(record.getReadPairedFlag());
- cramRecord.setProperPair(record.getReadPairedFlag() && record.getProperPairFlag());
- cramRecord.setSegmentUnmapped(record.getReadUnmappedFlag());
- cramRecord.setNegativeStrand(record.getReadNegativeStrandFlag());
- cramRecord.setFirstSegment(record.getReadPairedFlag() && record.getFirstOfPairFlag());
- cramRecord.setLastSegment(record.getReadPairedFlag() && record.getSecondOfPairFlag());
- cramRecord.setSecondaryAlignment(record.getNotPrimaryAlignmentFlag());
- cramRecord.setVendorFiltered(record.getReadFailsVendorQualityCheckFlag());
- cramRecord.setDuplicate(record.getDuplicateReadFlag());
- cramRecord.setSupplementary(record.getSupplementaryAlignmentFlag());
-
- cramRecord.readLength = record.getReadLength();
- cramRecord.mappingQuality = record.getMappingQuality();
- cramRecord.setDuplicate(record.getDuplicateReadFlag());
-
- cramRecord.templateSize = record.getInferredInsertSize();
-
- final SAMReadGroupRecord readGroup = record.getReadGroup();
- if (readGroup != null) cramRecord.readGroupID = readGroupMap.get(readGroup.getId());
- else cramRecord.readGroupID = -1;
-
- if (!record.getReadPairedFlag()) cramRecord.setLastSegment(false);
- else {
- if (record.getFirstOfPairFlag()) cramRecord.setLastSegment(false);
- else if (record.getSecondOfPairFlag()) cramRecord.setLastSegment(true);
- }
-
- if (!record.getReadUnmappedFlag() && record.getAlignmentStart() != SAMRecord.NO_ALIGNMENT_START) {
- cramRecord.readFeatures = checkedCreateVariations(cramRecord, record);
- } else cramRecord.readFeatures = Collections.emptyList();
-
- cramRecord.readBases = record.getReadBases();
- cramRecord.qualityScores = record.getBaseQualities();
- landedTotalScores += cramRecord.readLength;
- if (version.compatibleWith(CramVersions.CRAM_v3))
- cramRecord.setUnknownBases(record.getReadBases() == SAMRecord.NULL_SEQUENCE);
-
- readTagList.clear();
- if (captureAllTags) {
- final List<SAMTagAndValue> attributes = record.getAttributes();
- for (final SAMTagAndValue tagAndValue : attributes) {
- if (ignoreTags.contains(tagAndValue.tag)) continue;
- readTagList.add(ReadTag.deriveTypeFromValue(tagAndValue.tag, tagAndValue.value));
- }
- } else {
- if (!captureTags.isEmpty()) {
- final List<SAMTagAndValue> attributes = record.getAttributes();
- cramRecord.tags = new ReadTag[attributes.size()];
- for (final SAMTagAndValue tagAndValue : attributes) {
- if (captureTags.contains(tagAndValue.tag)) {
- readTagList.add(ReadTag.deriveTypeFromValue(tagAndValue.tag, tagAndValue.value));
- }
- }
- }
- }
- cramRecord.tags = readTagList.toArray(new ReadTag[readTagList.size()]);
-
- cramRecord.setVendorFiltered(record.getReadFailsVendorQualityCheckFlag());
-
- if (preserveReadNames) cramRecord.readName = record.getReadName();
-
- return cramRecord;
- }
-
- /**
- * A wrapper method to provide better diagnostics for ArrayIndexOutOfBoundsException.
- *
- * @param cramRecord CRAM record
- * @param samRecord SAM record
- * @return a list of read features created for the given {@link htsjdk.samtools.SAMRecord}
- */
- private List<ReadFeature> checkedCreateVariations(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
- try {
- return createVariations(cramRecord, samRecord);
- } catch (final ArrayIndexOutOfBoundsException e) {
- log.error("Reference bases array length=" + refBases.length);
- log.error("Offensive CRAM record: " + cramRecord.toString());
- log.error("Offensive SAM record: " + samRecord.getSAMString());
- throw e;
- }
- }
-
- private List<ReadFeature> createVariations(final CramCompressionRecord cramRecord, final SAMRecord samRecord) {
- final List<ReadFeature> features = new LinkedList<ReadFeature>();
- int zeroBasedPositionInRead = 0;
- int alignmentStartOffset = 0;
- int cigarElementLength;
-
- final List<CigarElement> cigarElements = samRecord.getCigar().getCigarElements();
-
- int cigarLen = 0;
- for (final CigarElement cigarElement : cigarElements)
- if (cigarElement.getOperator().consumesReadBases())
- cigarLen += cigarElement.getLength();
-
- byte[] bases = samRecord.getReadBases();
- if (bases.length == 0) {
- bases = new byte[cigarLen];
- Arrays.fill(bases, (byte) 'N');
- }
- final byte[] qualityScore = samRecord.getBaseQualities();
-
- for (final CigarElement cigarElement : cigarElements) {
- cigarElementLength = cigarElement.getLength();
- final CigarOperator operator = cigarElement.getOperator();
-
- switch (operator) {
- case D:
- features.add(new Deletion(zeroBasedPositionInRead + 1, cigarElementLength));
- break;
- case N:
- features.add(new RefSkip(zeroBasedPositionInRead + 1, cigarElementLength));
- break;
- case P:
- features.add(new Padding(zeroBasedPositionInRead + 1, cigarElementLength));
- break;
- case H:
- features.add(new HardClip(zeroBasedPositionInRead + 1, cigarElementLength));
- break;
- case S:
- addSoftClip(features, zeroBasedPositionInRead, cigarElementLength, bases);
- break;
- case I:
- addInsertion(features, zeroBasedPositionInRead, cigarElementLength, bases);
- break;
- case M:
- case X:
- case EQ:
- addSubstitutionsAndMaskedBases(cramRecord, features, zeroBasedPositionInRead, alignmentStartOffset,
- cigarElementLength, bases, qualityScore);
- break;
- default:
- throw new IllegalArgumentException("Unsupported cigar operator: " + cigarElement.getOperator());
- }
-
- if (cigarElement.getOperator().consumesReadBases()) zeroBasedPositionInRead += cigarElementLength;
- if (cigarElement.getOperator().consumesReferenceBases()) alignmentStartOffset += cigarElementLength;
- }
-
- this.baseCount += bases.length;
- this.featureCount += features.size();
-
- return features;
- }
-
- private void addSoftClip(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
- final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
- final SoftClip softClip = new SoftClip(zeroBasedPositionInRead + 1, insertedBases);
- features.add(softClip);
- }
-
- private void addHardClip(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
- final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
- final HardClip hardClip = new HardClip(zeroBasedPositionInRead + 1, insertedBases.length);
- features.add(hardClip);
- }
-
- private void addInsertion(final List<ReadFeature> features, final int zeroBasedPositionInRead, final int cigarElementLength, final byte[] bases) {
- final byte[] insertedBases = Arrays.copyOfRange(bases, zeroBasedPositionInRead, zeroBasedPositionInRead + cigarElementLength);
-
-
- for (int i = 0; i < insertedBases.length; i++) {
- // single base insertion:
- final InsertBase insertBase = new InsertBase();
- insertBase.setPosition(zeroBasedPositionInRead + 1 + i);
- insertBase.setBase(insertedBases[i]);
- features.add(insertBase);
- }
- }
-
- private void addSubstitutionsAndMaskedBases(final CramCompressionRecord cramRecord, final List<ReadFeature> features, final int fromPosInRead, final int
- alignmentStartOffset, final int nofReadBases, final byte[] bases, final byte[] qualityScore) {
- int oneBasedPositionInRead;
- final boolean noQS = (qualityScore.length == 0);
-
- int i;
- boolean qualityAdded;
- byte refBase;
- for (i = 0; i < nofReadBases; i++) {
- oneBasedPositionInRead = i + fromPosInRead + 1;
- final int referenceCoordinates = cramRecord.alignmentStart + i + alignmentStartOffset - 1;
- qualityAdded = false;
- if (referenceCoordinates >= refBases.length) refBase = 'N';
- else refBase = refBases[referenceCoordinates];
- refBase = Utils.normalizeBase(refBase);
-
- if (bases[i + fromPosInRead] != refBase) {
- final Substitution substitution = new Substitution();
- substitution.setPosition(oneBasedPositionInRead);
- substitution.setBase(bases[i + fromPosInRead]);
- substitution.setReferenceBase(refBase);
-
- features.add(substitution);
-
- if (noQS) continue;
- }
-
- if (noQS) continue;
-
- if (refSNPs != null) {
- final byte snpOrNot = refSNPs[referenceCoordinates];
- if (snpOrNot != 0) {
- final byte score = (byte) (QS_asciiOffset + qualityScore[i + fromPosInRead]);
- features.add(new BaseQualityScore(oneBasedPositionInRead, score));
- qualityAdded = true;
- landedRefMaskScores++;
- }
- }
-
- if (qualityAdded) landedTotalScores++;
- }
- }
-
- public long getLandedRefMaskScores() {
- return landedRefMaskScores;
- }
-
- public long getLandedTotalScores() {
- return landedTotalScores;
- }
-
- public byte[] getRefBases() {
- return refBases;
- }
-
- public void setRefBases(final byte[] refBases) {
- this.refBases = refBases;
- }
-
- public byte[] getRefSNPs() {
- return refSNPs;
- }
-
- public void setRefSNPs(final byte[] refSNPs) {
- this.refSNPs = refSNPs;
- }
-
- public Map<String, Integer> getReadGroupMap() {
- return readGroupMap;
- }
-
-
- public long getBaseCount() {
- return baseCount;
- }
-
- public long getFeatureCount() {
- return featureCount;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/build/Utils.java b/src/main/java/htsjdk/samtools/cram/build/Utils.java
deleted file mode 100644
index 7fdeeba..0000000
--- a/src/main/java/htsjdk/samtools/cram/build/Utils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.build;
-
-final public class Utils {
-
- private Utils() {};
-
- /**
- * CRAM operates with upper case bases, so both read and ref bases should be
- * upper-cased and vocab controlled. This method does exactly this: upper
- * case acgt and replace everything else with N.
- *
- * @param base a base to normalize
- * @return a normalized base
- */
- public static byte normalizeBase(final byte base) {
- switch (base) {
- case 'a':
- case 'A':
- return 'A';
-
- case 'c':
- case 'C':
- return 'C';
-
- case 'g':
- case 'G':
- return 'G';
-
- case 't':
- case 'T':
- return 'T';
-
- default:
- return 'N';
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java b/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java
deleted file mode 100644
index fa1eafb..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/CramVersionPolicies.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-import htsjdk.samtools.util.Log;
-
-/**
- * The class provides version-dependant rules and policies for CRAM data.
- */
-public class CramVersionPolicies {
- private static final Log log = Log.getInstance(CramVersionPolicies.class);
-
- /**
- * The method holds the behaviour for when the EOF marker is not found. Depending on the CRAM version this will be ignored, a warning
- * issued or an exception produced.
- *
- * @param version CRAM version to assume
- */
- public static void eofNotFound(final Version version) {
- if (version.compatibleWith(CramVersions.CRAM_v3)) {
- log.error("Incomplete data: EOF marker not found.");
- throw new RuntimeException("EOF not found.");
- }
- if (version.compatibleWith(CramVersions.CRAM_v2_1)) log.warn("EOF marker not found, possibly incomplete file/stream.");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/CramVersions.java b/src/main/java/htsjdk/samtools/cram/common/CramVersions.java
deleted file mode 100644
index 26d5685..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/CramVersions.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-public class CramVersions {
- public static final Version CRAM_v2_1 = new Version(2, 1, 0);
- public static final Version CRAM_v3 = new Version(3, 0, 0);
-
- /**
- * The default CRAM version when creating a new CRAM output file or stream.
- */
- public static final Version DEFAULT_CRAM_VERSION = CRAM_v3;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java b/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java
deleted file mode 100644
index f2bca06..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/IntHashMap.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.common;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Note: originally released under the GNU LGPL v2.1,
- * but re-released by the original author under the ASF license (above).
- */
-
-/**
- * <p>
- * A hash map that uses primitive ints for the key rather than objects.
- * </p>
- * <p/>
- * <p>
- * Note that this class is for internal optimization purposes only, and may not
- * be supported in future releases of Apache Commons Lang. Utilities of this
- * sort may be included in future releases of Apache Commons Collections.
- * </p>
- *
- * @author Justin Couch
- * @author Alex Chaffee (alex at apache.org)
- * @author Stephen Colebourne
- * @version $Revision: 561230 $
- * @see java.util.HashMap
- * @since 2.0
- */
-public class IntHashMap<T> {
-
- /**
- * The hash table data.
- */
- private transient Entry<T> table[];
-
- /**
- * The total number of entries in the hash table.
- */
- private transient int count;
-
- /**
- * The table is rehashed when its size exceeds this threshold. (The value of
- * this field is (int)(capacity * loadFactor).)
- *
- * @serial
- */
- private int threshold;
-
- /**
- * The load factor for the hashtable.
- *
- * @serial
- */
- private float loadFactor;
-
- /**
- * <p>
- * Innerclass that acts as a datastructure to create a new entry in the
- * table.
- * </p>
- */
- private static class Entry<E> {
- final int hash;
- final int key;
- E value;
- Entry<E> next;
-
- /**
- * <p>
- * Create a new entry with the given values.
- * </p>
- *
- * @param hash The code used to hash the object with
- * @param key The key used to enter this in the table
- * @param value The value for this key
- * @param next A reference to the next entry in the table
- */
- protected Entry(final int hash, final int key, final E value, final Entry<E> next) {
- this.hash = hash;
- this.key = key;
- this.value = value;
- this.next = next;
- }
- }
-
- /**
- * <p>
- * Constructs a new, empty hashtable with a default capacity and load
- * factor, which is <code>20</code> and <code>0.75</code> respectively.
- * </p>
- */
- public IntHashMap() {
- this(20, 0.75f);
- }
-
- /**
- * <p>
- * Constructs a new, empty hashtable with the specified initial capacity and
- * default load factor, which is <code>0.75</code>.
- * </p>
- *
- * @param initialCapacity the initial capacity of the hashtable.
- * @throws IllegalArgumentException if the initial capacity is less than zero.
- */
- public IntHashMap(final int initialCapacity) {
- this(initialCapacity, 0.75f);
- }
-
- /**
- * <p>
- * Constructs a new, empty hashtable with the specified initial capacity and
- * the specified load factor.
- * </p>
- *
- * @param initialCapacity the initial capacity of the hashtable.
- * @param loadFactor the load factor of the hashtable.
- * @throws IllegalArgumentException if the initial capacity is less than zero, or if the load
- * factor is non-positive.
- */
- public IntHashMap(int initialCapacity, final float loadFactor) {
- super();
- if (initialCapacity < 0) {
- throw new IllegalArgumentException("Illegal Capacity: "
- + initialCapacity);
- }
- if (loadFactor <= 0) {
- throw new IllegalArgumentException("Illegal Load: " + loadFactor);
- }
- if (initialCapacity == 0) {
- initialCapacity = 1;
- }
-
- this.loadFactor = loadFactor;
- table = new Entry[initialCapacity];
- threshold = (int) (initialCapacity * loadFactor);
- }
-
- /**
- * <p>
- * Returns the number of keys in this hashtable.
- * </p>
- *
- * @return the number of keys in this hashtable.
- */
- public int size() {
- return count;
- }
-
- /**
- * <p>
- * Tests if this hashtable maps no keys to values.
- * </p>
- *
- * @return <code>true</code> if this hashtable maps no keys to values;
- * <code>false</code> otherwise.
- */
- public boolean isEmpty() {
- return count == 0;
- }
-
- /**
- * <p>
- * Tests if some key maps into the specified value in this hashtable. This
- * operation is more expensive than the <code>containsKey</code> method.
- * </p>
- * <p/>
- * <p>
- * Note that this method is identical in functionality to containsValue,
- * (which is part of the Map interface in the collections framework).
- * </p>
- *
- * @param value a value to search for.
- * @return <code>true</code> if and only if some key maps to the
- * <code>value</code> argument in this hashtable as determined by
- * the <tt>equals</tt> method; <code>false</code> otherwise.
- * @throws NullPointerException if the value is <code>null</code>.
- * @see #containsKey(int)
- * @see #containsValue(Object)
- * @see java.util.Map
- */
- public boolean contains(final Object value) {
- if (value == null) {
- throw new NullPointerException();
- }
-
- final Entry<T>[] tab = table;
- for (int i = tab.length; i-- > 0; ) {
- for (Entry<T> e = tab[i]; e != null; e = e.next) {
- if (e.value.equals(value)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * <p>
- * Returns <code>true</code> if this HashMap maps one or more keys to this
- * value.
- * </p>
- * <p/>
- * <p>
- * Note that this method is identical in functionality to contains (which
- * predates the Map interface).
- * </p>
- *
- * @param value value whose presence in this HashMap is to be tested.
- * @return boolean <code>true</code> if the value is contained
- * @see java.util.Map
- * @since JDK1.2
- */
- public boolean containsValue(final Object value) {
- return contains(value);
- }
-
- /**
- * <p>
- * Tests if the specified object is a key in this hashtable.
- * </p>
- *
- * @param key possible key.
- * @return <code>true</code> if and only if the specified object is a key in
- * this hashtable, as determined by the <tt>equals</tt> method;
- * <code>false</code> otherwise.
- * @see #contains(Object)
- */
- public boolean containsKey(final int key) {
- final Entry<T>[] tab = table;
- final int index = (key & 0x7FFFFFFF) % tab.length;
- for (Entry<T> entry = tab[index]; entry != null; entry = entry.next) {
- if (entry.hash == key) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * <p>
- * Returns the value to which the specified key is mapped in this map.
- * </p>
- *
- * @param key a key in the hashtable.
- * @return the value to which the key is mapped in this hashtable;
- * <code>null</code> if the key is not mapped to any value in this
- * hashtable.
- * @see #put(int, Object)
- */
- public T get(final int key) {
- final Entry<T>[] tab = table;
- final int index = (key & 0x7FFFFFFF) % tab.length;
- for (Entry<T> e = tab[index]; e != null; e = e.next) {
- if (e.hash == key) {
- return e.value;
- }
- }
- return null;
- }
-
- /**
- * <p>
- * Increases the capacity of and internally reorganizes this hashtable, in
- * order to accommodate and access its entries more efficiently.
- * </p>
- * <p/>
- * <p>
- * This method is called automatically when the number of keys in the
- * hashtable exceeds this hashtable's capacity and load factor.
- * </p>
- */
- protected void rehash() {
- final int oldCapacity = table.length;
- final Entry<T>[] oldMap = table;
-
- final int newCapacity = oldCapacity * 2 + 1;
- final Entry<T>[] newMap = new Entry[newCapacity];
-
- threshold = (int) (newCapacity * loadFactor);
- table = newMap;
-
- for (int i = oldCapacity; i-- > 0; ) {
- for (Entry<T> old = oldMap[i]; old != null; ) {
- final Entry<T> entry = old;
- old = old.next;
-
- final int index = (entry.hash & 0x7FFFFFFF) % newCapacity;
- entry.next = newMap[index];
- newMap[index] = entry;
- }
- }
- }
-
- /**
- * <p>
- * Maps the specified <code>key</code> to the specified <code>value</code>
- * in this hashtable. The key cannot be <code>null</code>.
- * </p>
- * <p/>
- * <p>
- * The value can be retrieved by calling the <code>get</code> method with a
- * key that is equal to the original key.
- * </p>
- *
- * @param key the hashtable key.
- * @param value the value.
- * @return the previous value of the specified key in this hashtable, or
- * <code>null</code> if it did not have one.
- * @throws NullPointerException if the key is <code>null</code>.
- * @see #get(int)
- */
- public Object put(final int key, final T value) {
- // Makes sure the key is not already in the hashtable.
- Entry<T> tab[] = table;
- int index = (key & 0x7FFFFFFF) % tab.length;
- for (Entry<T> entry = tab[index]; entry != null; entry = entry.next) {
- if (entry.hash == key) {
- final Object old = entry.value;
- entry.value = value;
- return old;
- }
- }
-
- if (count >= threshold) {
- // Rehash the table if the threshold is exceeded
- rehash();
-
- tab = table;
- index = (key & 0x7FFFFFFF) % tab.length;
- }
-
- // Creates the new entry.
- final Entry<T> entry = new Entry<T>(key, key, value, tab[index]);
- tab[index] = entry;
- count++;
- return null;
- }
-
- /**
- * <p>
- * Removes the key (and its corresponding value) from this hashtable.
- * </p>
- * <p/>
- * <p>
- * This method does nothing if the key is not present in the hashtable.
- * </p>
- *
- * @param key the key that needs to be removed.
- * @return the value to which the key had been mapped in this hashtable, or
- * <code>null</code> if the key did not have a mapping.
- */
- public Object remove(final int key) {
- final Entry<T>[] tab = table;
- final int index = (key & 0x7FFFFFFF) % tab.length;
- for (Entry<T> entry = tab[index], prev = null; entry != null; prev = entry, entry = entry.next) {
- if (entry.hash == key) {
- if (prev != null) {
- prev.next = entry.next;
- } else {
- tab[index] = entry.next;
- }
- count--;
- final Object oldValue = entry.value;
- entry.value = null;
- return oldValue;
- }
- }
- return null;
- }
-
- /**
- * <p>
- * Clears this hashtable so that it contains no keys.
- * </p>
- */
- public synchronized void clear() {
- final Entry<T>[] tab = table;
- for (int index = tab.length; --index >= 0; ) {
- tab[index] = null;
- }
- count = 0;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/MutableInt.java b/src/main/java/htsjdk/samtools/cram/common/MutableInt.java
deleted file mode 100644
index 4b3d4ff..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/MutableInt.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.common;
-
-public class MutableInt {
- public int value = 0;
-
- @Override
- public int hashCode() {
- return value;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/common/Version.java b/src/main/java/htsjdk/samtools/cram/common/Version.java
deleted file mode 100644
index d20ecf9..0000000
--- a/src/main/java/htsjdk/samtools/cram/common/Version.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package htsjdk.samtools.cram.common;
-
-/**
- * A class to represent a version information, 3 number: major, minor and build number.
- */
-public class Version implements Comparable<Version> {
- public final int major;
- public final int minor;
- private final int build;
-
- public Version(final int major, final int minor, final int build) {
- this.major = major;
- this.minor = minor;
- this.build = build;
- }
-
- public Version(final String version) {
- final String[] numbers = version.split("[\\.\\-b]");
- major = Integer.valueOf(numbers[0]);
- minor = Integer.valueOf(numbers[1]);
- if (numbers.length > 3) build = Integer.valueOf(numbers[3]);
- else build = 0;
- }
-
- @Override
- public String toString() {
- if (build > 0) return String.format("%d.%d-b%d", major, minor, build);
- else return String.format("%d.%d", major, minor);
- }
-
- /**
- * Compare with another version.
- *
- * @param o another version
- * @return 0 if both versions are the same, a negative if the other version is higher and a positive otherwise.
- */
- @Override
- public int compareTo(@SuppressWarnings("NullableProblems") final Version o) {
- if (o == null) return -1;
- if (major - o.major != 0) return major - o.major;
- if (minor - o.minor != 0) return minor - o.minor;
-
- if (build < 1 || o.build < 1) return 0;
- return build - o.build;
- }
-
- /**
- * Check if another version is exactly the same as this one.
- *
- * @param obj another version object
- * @return true if both versions are the same, false otherwise.
- */
- @Override
- public boolean equals(final Object obj) {
- if (obj == null || !(obj instanceof Version)) return false;
- final Version version = (Version) obj;
- return major == version.major && minor == version.minor;
- }
-
- public boolean compatibleWith(final Version version) {
- return compareTo(version) >= 0;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java b/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java
deleted file mode 100644
index f1a2f18..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/AbstractSerialDigest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-abstract class AbstractSerialDigest<T> {
- private final Combine<T> combine;
- T value;
-
- AbstractSerialDigest(final Combine<T> combine, final T value) {
- this.combine = combine;
- this.value = value;
- }
-
- protected abstract void resetAndUpdate(byte[] data);
-
- protected abstract T getValue();
-
- protected abstract byte[] asByteArray();
-
- void add(final byte[] data) {
- resetAndUpdate(data);
- final T updateValue = getValue();
- if (value == null)
- value = updateValue;
- else
- value = combine.combine(value, updateValue);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java b/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java
deleted file mode 100644
index 25dd77f..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/ByteSumCombine.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-class ByteSumCombine implements Combine<byte[]> {
-
- @Override
- public byte[] combine(final byte[] state, final byte[] update) {
- for (int i = 0; i < state.length; i++)
- state[i] += update[i];
- return state;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/Combine.java b/src/main/java/htsjdk/samtools/cram/digest/Combine.java
deleted file mode 100644
index 4868127..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/Combine.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-interface Combine<T> {
-
- T combine(T state, T update);
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java b/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java
deleted file mode 100644
index bbfe1ed..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/ContentDigests.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.util.Log;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.List;
-
-public class ContentDigests {
- public static final EnumSet<KNOWN_DIGESTS> ALL = EnumSet
- .allOf(KNOWN_DIGESTS.class);
- public static final EnumSet<KNOWN_DIGESTS> CRC32 = EnumSet.of(
- KNOWN_DIGESTS.BD, KNOWN_DIGESTS.SD);
-
- private static final Log log = Log.getInstance(ContentDigests.class);
- private List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
-
- public static ContentDigests create(final EnumSet<KNOWN_DIGESTS> requestedDigests) {
- final List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
- for (final KNOWN_DIGESTS digest : requestedDigests)
- digesters.add(digest.createDigester());
- return new ContentDigests(digesters);
- }
-
- public static ContentDigests create(final SAMBinaryTagAndValue binaryTags) {
- final List<Digester> digesters = new LinkedList<ContentDigests.Digester>();
- SAMBinaryTagAndValue binaryTag = binaryTags;
- while (binaryTag != null) {
- final String tagID = SAMTagUtil.getSingleton().makeStringTag(
- binaryTag.tag);
- final KNOWN_DIGESTS hash;
- try {
- hash = KNOWN_DIGESTS.valueOf(tagID);
- digesters.add(hash.createDigester());
- } catch (final IllegalArgumentException e) {
- // The tag is not one of the known content digest tags.
- }
- binaryTag = binaryTag.getNext();
- }
- return new ContentDigests(digesters);
- }
-
- private ContentDigests(final List<Digester> hashers) {
- this.digesters = hashers;
- }
-
- void add(final SAMRecord record) {
- for (final Digester digester : digesters)
- digester.add(record);
- }
-
- public void add(final CramCompressionRecord record) {
- for (final Digester digester : digesters)
- digester.addCramRecord(record);
- }
-
- public void addSAMRecords(final Iterable<SAMRecord> records) {
- for (final SAMRecord record : records)
- add(record);
- }
-
- public void addCramRecords(final Iterable<CramCompressionRecord> records) {
- for (final CramCompressionRecord record : records)
- add(record);
- }
-
- public SAMBinaryTagAndValue getAsTags() {
- SAMBinaryTagAndValue tag = null;
- for (final Digester digester : digesters) {
- if (tag == null)
- tag = digester.toTag();
- else
- tag = tag.insert(digester.toTag());
- }
-
- return tag;
- }
-
- public boolean test(final SAMBinaryTagAndValue tags) {
- for (final Digester digester : digesters) {
- final SAMBinaryTagAndValue foundTag = tags.find(digester.tagCode);
- if (foundTag == null)
- continue;
-
- if (!(foundTag.value instanceof byte[]))
- throw new RuntimeException("Expecting a byte array but got: "
- + foundTag.value.getClass().getName());
-
- final byte[] expected = (byte[]) foundTag.value;
- final byte[] actual = digester.digest.asByteArray();
- if (!Arrays.equals(expected, actual)) {
- final String expectedString = toHexString(expected);
- final String actualString = toHexString(actual);
- log.error(String
- .format("Content hash mismatch for tag %s, actual: %s; expected: %s",
- digester.tagID, actualString, expectedString));
- return false;
- } else
- log.debug("Content digest ok: " + digester.tagID);
- }
- return true;
- }
-
- private static String toHex(final byte[] bytes) {
- final StringBuilder sb = new StringBuilder();
- for (final byte t : bytes) {
- sb.append(String.format("%02x", (0xFF & t)).toUpperCase()).append(
- ' ');
- }
- return sb.toString();
- }
-
- private static String toHexString(final byte[] bytes) {
- return toHex(bytes).replace(" ", "");
- }
-
- private static class Digester {
- final AbstractSerialDigest<?> digest;
- final SERIES series;
- final String tagID;
- final short tagCode;
-
- Digester(final AbstractSerialDigest<?> digest, final SERIES series, final String tagID) {
- this.digest = digest;
- this.series = series;
- this.tagID = tagID;
- this.tagCode = SAMTagUtil.getSingleton().makeBinaryTag(tagID);
- }
-
- void add(final SAMRecord record) {
- digest.add(series.getBytes(record));
- }
-
- void addCramRecord(final CramCompressionRecord record) {
- digest.add(series.getBytes(record));
- }
-
- SAMBinaryTagAndValue toTag() {
- return new SAMBinaryTagAndValue(tagCode, digest.asByteArray());
- }
- }
-
- public enum KNOWN_DIGESTS {
- BD {
- @Override
- Digester createDigester() {
- return new Digester(new Crc32Hasher(new IntegerSumCombine()),
- SERIES.BASES, name());
- }
- },
- SD {
- @Override
- Digester createDigester() {
- return new Digester(new Crc32Hasher(new IntegerSumCombine()),
- SERIES.SCORES, name());
- }
- },
- B5 {
- @Override
- Digester createDigester() {
- try {
- return new Digester(new MessageDigestHasher(
- MessageDigest.getInstance("SHA-512"),
- new ByteSumCombine(), null), SERIES.BASES, name());
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
- },
- S5 {
- @Override
- Digester createDigester() {
- try {
- return new Digester(new MessageDigestHasher(
- MessageDigest.getInstance("SHA-512"),
- new ByteSumCombine(), null), SERIES.SCORES, name());
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
- },
- B1 {
- @Override
- Digester createDigester() {
- try {
- return new Digester(new MessageDigestHasher(
- MessageDigest.getInstance("SHA-1"),
- new ByteSumCombine(), null), SERIES.BASES, name());
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
- },
- S1 {
- @Override
- Digester createDigester() {
- try {
- return new Digester(new MessageDigestHasher(
- MessageDigest.getInstance("SHA-1"),
- new ByteSumCombine(), null), SERIES.SCORES, name());
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
- };
-
- abstract Digester createDigester();
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java b/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java
deleted file mode 100644
index 464e220..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/Crc32Hasher.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import java.nio.ByteOrder;
-import java.util.zip.CRC32;
-
-class Crc32Hasher extends AbstractSerialDigest<Integer> {
- private final CRC32 crc32 = new CRC32();
- private final ByteOrder byteOrder = ByteOrder.LITTLE_ENDIAN;
-
- Crc32Hasher(final Combine<Integer> combine) {
- super(combine, null);
- }
-
- @Override
- protected void resetAndUpdate(final byte[] data) {
- crc32.reset();
- crc32.update(data);
- }
-
- @Override
- protected Integer getValue() {
- return (int) (crc32.getValue() & 0xFFFFFFFFL);
- }
-
- @Override
- protected byte[] asByteArray() {
- final byte[] array = new byte[4];
- if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
- array[3] = (byte) ((value >>> 24) & 0xFF);
- array[2] = (byte) ((value >>> 16) & 0xFF);
- array[1] = (byte) ((value >>> 8) & 0xFF);
- array[0] = (byte) ((value) & 0xFF);
- } else {
- array[0] = (byte) ((value >>> 24) & 0xFF);
- array[1] = (byte) ((value >>> 16) & 0xFF);
- array[2] = (byte) ((value >>> 8) & 0xFF);
- array[3] = (byte) ((value) & 0xFF);
- }
- return array;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java b/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java
deleted file mode 100644
index d6b18e0..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/IntegerSumCombine.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-class IntegerSumCombine implements Combine<Integer> {
-
- @Override
- public Integer combine(final Integer state, final Integer update) {
- return state + update;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java b/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java
deleted file mode 100644
index e5f8f35..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/MessageDigestHasher.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import java.security.MessageDigest;
-
-class MessageDigestHasher extends AbstractSerialDigest<byte[]> {
- private final MessageDigest messageDigest;
-
- MessageDigestHasher(final MessageDigest messageDigest, final Combine<byte[]> combine,
- final byte[] value) {
- super(combine, value);
- this.messageDigest = messageDigest;
- }
-
- @Override
- protected void resetAndUpdate(final byte[] data) {
- messageDigest.reset();
- messageDigest.update(data);
- }
-
- @Override
- protected byte[] getValue() {
- return messageDigest.digest();
- }
-
- @Override
- protected byte[] asByteArray() {
- return messageDigest.digest();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/digest/SERIES.java b/src/main/java/htsjdk/samtools/cram/digest/SERIES.java
deleted file mode 100644
index 82ce6f6..0000000
--- a/src/main/java/htsjdk/samtools/cram/digest/SERIES.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.samtools.cram.digest;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-
-enum SERIES {
- BASES {
- @Override
- byte[] getBytes(final SAMRecord record) {
- return record.getReadBases();
- }
-
- @Override
- byte[] getBytes(final CramCompressionRecord record) {
- return record.readBases;
- }
- },
- SCORES {
- @Override
- byte[] getBytes(final SAMRecord record) {
- return record.getBaseQualities();
- }
-
- @Override
- byte[] getBytes(final CramCompressionRecord record) {
- return record.qualityScores;
- }
- };
-
- abstract byte[] getBytes(SAMRecord record);
-
- abstract byte[] getBytes(CramCompressionRecord record);
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java
deleted file mode 100644
index a15c893..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/AbstractBitCodec.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-public abstract class AbstractBitCodec<T> implements BitCodec<T> {
-
- @Override
- public abstract T read(BitInputStream bitInputStream) throws IOException;
-
- @Override
- public abstract T read(BitInputStream bitInputStream, int valueLen) throws IOException;
-
- @Override
- public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
- final int valueLen) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
- @Override
- public void skip(final BitInputStream bitInputStream) throws IOException {
- read(bitInputStream);
- }
-
- @Override
- public void skip(final BitInputStream bitInputStream, final int length) throws IOException {
- read(bitInputStream, length);
- }
-
- @Override
- public abstract long write(BitOutputStream bitOutputStream, T object)
- throws IOException;
-
- @Override
- public abstract long numberOfBits(T object);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java
deleted file mode 100644
index 496f5a6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerCodec.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class BetaIntegerCodec extends AbstractBitCodec<Integer> {
- private int offset = 0;
- private final int readNofBits;
-
- public BetaIntegerCodec(final int offset, final int readNofBits) {
- this.offset = offset;
- this.readNofBits = readNofBits;
- }
-
- @Override
- public final Integer read(final BitInputStream bitInputStream) throws IOException {
- return bitInputStream.readBits(readNofBits) - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
- final int nofBits = (int) numberOfBits(value);
- final long newValue = value + offset;
- bitOutputStream.write(newValue, nofBits);
- return nofBits;
- }
-
- @Override
- public final long numberOfBits(final Integer value) {
- if (value > (1L << readNofBits))
- throw new IllegalArgumentException("Value written is bigger then allowed: value=" + value
- + ", max nof bits=" + readNofBits);
-
- return readNofBits;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java
deleted file mode 100644
index 486ae36..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BetaIntegerEncoding.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class BetaIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.BETA;
- private int offset;
- private int bitLimit;
-
- public BetaIntegerEncoding() {
- }
-
- public BetaIntegerEncoding(final int offset, final int bitLimit) {
- this.offset = offset;
- this.bitLimit = bitLimit;
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int offset, final int bitLimit) {
- final BetaIntegerEncoding encoding = new BetaIntegerEncoding();
- encoding.offset = offset;
- encoding.bitLimit = bitLimit;
- return new EncodingParams(ENCODING_ID, encoding.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- ITF8.writeUnsignedITF8(bitLimit, buffer);
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- offset = ITF8.readUnsignedITF8(buffer);
- bitLimit = ITF8.readUnsignedITF8(buffer);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new BetaIntegerCodec(offset, bitLimit);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java
deleted file mode 100644
index 2920f11..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/BitCodec.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-/**
- * An interface that defines requirements for serializing/deserializing objects into and from a bit stream.
- *
- * @param <T> data series type to be read or written
- * @noinspection UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier, UnnecessaryInterfaceModifier
- */
-public interface BitCodec<T> {
-
- /**
- * Read a single object from the bit stream.
- *
- * @param bitInputStream the bit input stream to rad from
- * @return an object from the stream
- * @throws IOException as per java IO contract
- */
- T read(BitInputStream bitInputStream) throws IOException;
-
- /**
- * Read a array of specified length from the bit stream.
- *
- * @param bitInputStream the bit input stream to rad from
- * param valueLen the number of elements to read
- * @return an object from the stream
- * @throws IOException as per java IO contract
- */
- T read(BitInputStream bitInputStream, int valueLen) throws IOException;
-
- /**
- * Read a array of specified length from the bit stream into a given byte array.
- * This method is a way to optimize byte array IO operations by bypassing abstraction. Leaky, I know.
- *
- * @param bitInputStream the bit input stream to rad from
- * @param array the array to read into
- * @param offset offset in the array
- * @param valueLen number of elements to read
- * @throws IOException as per java IO contract
- */
- void readInto(BitInputStream bitInputStream, byte[] array, int offset,
- int valueLen) throws IOException;
-
- /**
- * Skip the next object in the bit stream.
- * @param bitInputStream the bit stream to operate on
- * @throws IOException as per java IO contract
- */
- void skip(BitInputStream bitInputStream) throws IOException;
-
- /**
- * Skip the next length objects in the bit stream.
- * @param bitInputStream the bit stream to operate on
- * @param length the number of objects to skip
- *
- * @throws IOException as per java IO contract
- */
- void skip(BitInputStream bitInputStream, int length) throws IOException;
-
- /**
- * Write an object into the bit stream
- * @param bitOutputStream the output bit stream to write to
- * @param object the object to write
- * @return the number of bits written out
- * @throws IOException as per java IO contract
- */
- long write(BitOutputStream bitOutputStream, T object) throws IOException;
-
- /**
- * Calculate the number of bits that the object would take in bit serialized form.
- * @param object an object
- * @return the number of bits
- */
- long numberOfBits(T object);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java
deleted file mode 100644
index 0c76a5b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayLenEncoding.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class ByteArrayLenEncoding implements Encoding<byte[]> {
- private final static EncodingID ID = EncodingID.BYTE_ARRAY_LEN;
- private Encoding<Integer> lenEncoding;
- private Encoding<byte[]> byteEncoding;
-
- public ByteArrayLenEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ID;
- }
-
- public static EncodingParams toParam(final EncodingParams lenParams,
- final EncodingParams byteParams) {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- try {
- byteArrayOutputStream.write((byte) lenParams.id.ordinal());
- ITF8.writeUnsignedITF8(lenParams.params.length, byteArrayOutputStream);
- byteArrayOutputStream.write(lenParams.params);
-
- byteArrayOutputStream.write((byte) byteParams.id.ordinal());
- ITF8.writeUnsignedITF8(byteParams.params.length, byteArrayOutputStream);
- byteArrayOutputStream.write(byteParams.params);
- } catch (final IOException e) {
- throw new RuntimeException("It never happened. ");
- }
- return new EncodingParams(ID, byteArrayOutputStream.toByteArray());
- }
-
- public byte[] toByteArray() {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- try {
- byteArrayOutputStream.write((byte) lenEncoding.id().ordinal());
- final byte[] lenBytes = lenEncoding.toByteArray();
- ITF8.writeUnsignedITF8(lenBytes.length, byteArrayOutputStream);
- byteArrayOutputStream.write(lenBytes);
-
- byteArrayOutputStream.write((byte) byteEncoding.id().ordinal());
- final byte[] byteBytes = byteEncoding.toByteArray();
- ITF8.writeUnsignedITF8(byteBytes.length, byteArrayOutputStream);
- byteArrayOutputStream.write(byteBytes);
- } catch (final IOException e) {
- throw new RuntimeException("It never happened. ");
- }
- return byteArrayOutputStream.toByteArray();
- }
-
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
-
- final EncodingFactory encodingFactory = new EncodingFactory();
-
- final EncodingID lenID = EncodingID.values()[buffer.get()];
- lenEncoding = encodingFactory.createEncoding(DataSeriesType.INT, lenID);
- int length = ITF8.readUnsignedITF8(buffer);
- byte[] bytes = new byte[length];
- buffer.get(bytes);
- lenEncoding.fromByteArray(bytes);
-
- final EncodingID byteID = EncodingID.values()[buffer.get()];
- byteEncoding = encodingFactory.createEncoding(DataSeriesType.BYTE_ARRAY, byteID);
- length = ITF8.readUnsignedITF8(buffer);
- bytes = new byte[length];
- buffer.get(bytes);
- byteEncoding.fromByteArray(bytes);
- }
-
- @Override
- public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new ByteArrayLenCodec(
- lenEncoding.buildCodec(inputMap, outputMap),
- byteEncoding.buildCodec(inputMap, outputMap));
- }
-
- private static class ByteArrayLenCodec extends AbstractBitCodec<byte[]> {
- private final BitCodec<Integer> lenCodec;
- private final BitCodec<byte[]> byteCodec;
-
- public ByteArrayLenCodec(final BitCodec<Integer> lenCodec,
- final BitCodec<byte[]> byteCodec) {
- super();
- this.lenCodec = lenCodec;
- this.byteCodec = byteCodec;
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream) throws IOException {
- final int length = lenCodec.read(bitInputStream);
- return byteCodec.read(bitInputStream, length);
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final byte[] object)
- throws IOException {
- long length = lenCodec.write(bitOutputStream, object.length);
- length += byteCodec.write(bitOutputStream, object);
- return length;
- }
-
- @Override
- public long numberOfBits(final byte[] object) {
- return lenCodec.numberOfBits(object.length)
- + byteCodec.numberOfBits(object);
- }
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java
deleted file mode 100644
index c46d967..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ByteArrayStopEncoding.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Map;
-
-public class ByteArrayStopEncoding implements Encoding<byte[]> {
- private final static EncodingID ID = EncodingID.BYTE_ARRAY_STOP;
- private byte stopByte = 0;
- private int externalId;
-
- public ByteArrayStopEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ID;
- }
-
- private ByteArrayStopEncoding(final byte stopByte, final int externalId) {
- this.stopByte = stopByte;
- this.externalId = externalId;
- }
-
- public static EncodingParams toParam(final byte stopByte, final int externalId) {
- final ByteArrayStopEncoding e = new ByteArrayStopEncoding(stopByte,
- externalId);
- return new EncodingParams(ID, e.toByteArray());
- }
-
- public byte[] toByteArray() {
- final ByteBuffer buf = ByteBuffer.allocate(1024);
- buf.order(ByteOrder.LITTLE_ENDIAN);
- buf.put(stopByte);
- ITF8.writeUnsignedITF8(externalId, buf);
-
- buf.flip();
- final byte[] array = new byte[buf.limit()];
- buf.get(array);
-
- return array;
- }
-
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buf = ByteBuffer.wrap(data);
- buf.order(ByteOrder.LITTLE_ENDIAN);
- stopByte = buf.get();
- externalId = ITF8.readUnsignedITF8(buf);
- }
-
- @Override
- public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final InputStream is = inputMap == null ? null : inputMap.get(externalId);
- final ExposedByteArrayOutputStream os = outputMap == null ? null : outputMap
- .get(externalId);
- return new ByteArrayStopCodec(stopByte, is, os);
- }
-
- public static class ByteArrayStopCodec extends AbstractBitCodec<byte[]> {
-
- private final int stop;
- private final InputStream inputStream;
- private final OutputStream outputStream;
- private final ByteArrayOutputStream readingBAOS = new ByteArrayOutputStream();
- private int b;
-
- public ByteArrayStopCodec(final byte stopByte, final InputStream inputStream, final OutputStream outputStream) {
- this.stop = 0xFF & stopByte;
- this.inputStream = inputStream;
- this.outputStream = outputStream;
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream) throws IOException {
- readingBAOS.reset();
- while ((b = inputStream.read()) != -1 && b != stop)
- readingBAOS.write(b);
-
- return readingBAOS.toByteArray();
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final byte[] object)
- throws IOException {
- outputStream.write(object);
- outputStream.write(stop);
- return object.length + 1;
- }
-
- @Override
- public long numberOfBits(final byte[] object) {
- return object.length + 1;
- }
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java
deleted file mode 100644
index de4fd5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeries.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.structure.EncodingKey;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation to denote a data series field in a java class.
- * Some data can be represented as a set of column (data series) where
- * each column is characterized by it's intention ({@link htsjdk.samtools.cram.structure.EncodingKey} for CRAM)
- * and it's data type, like {@link java.lang.Integer}or {@link java.lang.String}.
- * Annotating fields in a class with this annotation allows for automated discovery of such column (data series)
- * and attaching specific codec to serialise/deserialize data.
- */
- at Target(ElementType.FIELD)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface DataSeries {
- /**
- * One of the pre-defined CRAM data series names
- * @return CRAM data series name (key)
- */
- EncodingKey key();
-
- /**
- * Data type of the series.
- * @return data type of the series
- */
- DataSeriesType type();
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java
deleted file mode 100644
index b16ab8d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesMap.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Target(ElementType.FIELD)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface DataSeriesMap {
- String name() default "TAG";
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java b/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java
deleted file mode 100644
index 6eecb7c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/DataSeriesType.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-/**
- * Data series types known to CRAM.
- */
-public enum DataSeriesType {
-
- /**
- * A single signed byte (256 distinct values)
- */
- BYTE,
- /**
- * A signed integer ~4 billions of them.
- */
- INT,
- /**
- * A signed long value, 64 bits, too many to count.
- */
- LONG,
- /**
- * An array of bytes.
- */
- BYTE_ARRAY
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java b/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java
deleted file mode 100644
index 1fc18df..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/Encoding.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.EncodingID;
-
-import java.io.InputStream;
-import java.util.Map;
-
-/**
- * An interface to describe how a data series is encoded.
- * It also has methods to serialize/deserialize to/from byte array and a method to construct
- * a {@link htsjdk.samtools.cram.encoding.BitCodec} instance.
- *
- * @param <T> data series type
- */
-public interface Encoding<T> {
-
- EncodingID id();
-
- byte[] toByteArray();
-
- void fromByteArray(byte[] data);
-
- BitCodec<T> buildCodec(Map<Integer, InputStream> inputMap,
- Map<Integer, ExposedByteArrayOutputStream> outputMap);
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java
deleted file mode 100644
index 258e148..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/EncodingFactory.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanByteEncoding;
-import htsjdk.samtools.cram.encoding.huffman.codec.HuffmanIntegerEncoding;
-import htsjdk.samtools.cram.structure.EncodingID;
-
-/**
- * A helper class to instantiate an appropriate {@link htsjdk.samtools.cram.encoding.Encoding}
- * for a given {@link htsjdk.samtools.cram.encoding.DataSeriesType} and
- * {@link htsjdk.samtools.cram.encoding.Encoding}.
- * Also useful to hide encoding implementations.
- */
- at SuppressWarnings("unchecked")
-public class EncodingFactory {
-
- /**
- * Create an encoding for the data series type and encoding id.
- * @param valueType data type of the values to be produced/consumed by the encoding
- * @param id encoding id used for data serialization
- * @param <T> encoding object type, like Integer or String.
- * @return a new encoding with the requested parameters
- */
- public <T> Encoding<T> createEncoding(final DataSeriesType valueType,
- final EncodingID id) {
- switch (valueType) {
- case BYTE:
- switch (id) {
- case EXTERNAL:
- return (Encoding<T>) new ExternalByteEncoding();
- case HUFFMAN:
- return (Encoding<T>) new HuffmanByteEncoding();
- case NULL:
- return new NullEncoding<T>();
-
- default:
- break;
- }
-
- break;
-
- case INT:
- switch (id) {
- case HUFFMAN:
- return (Encoding<T>) new HuffmanIntegerEncoding();
- case NULL:
- return new NullEncoding<T>();
- case EXTERNAL:
- return (Encoding<T>) new ExternalIntegerEncoding();
- case GOLOMB:
- return (Encoding<T>) new GolombIntegerEncoding();
- case GOLOMB_RICE:
- return (Encoding<T>) new GolombRiceIntegerEncoding();
- case BETA:
- return (Encoding<T>) new BetaIntegerEncoding();
- case GAMMA:
- return (Encoding<T>) new GammaIntegerEncoding();
- case SUBEXPONENTIAL:
- return (Encoding<T>) new SubexponentialIntegerEncoding();
-
- default:
- break;
- }
- break;
-
- case LONG:
- switch (id) {
- case NULL:
- return new NullEncoding<T>();
- case GOLOMB:
- return (Encoding<T>) new GolombLongEncoding();
- case EXTERNAL:
- return (Encoding<T>) new ExternalLongEncoding();
-
- default:
- break;
- }
- break;
-
- case BYTE_ARRAY:
- switch (id) {
- case NULL:
- return new NullEncoding<T>();
- case BYTE_ARRAY_LEN:
- return (Encoding<T>) new ByteArrayLenEncoding();
- case BYTE_ARRAY_STOP:
- return (Encoding<T>) new ByteArrayStopEncoding();
- case EXTERNAL:
- return (Encoding<T>) new ExternalByteArrayEncoding();
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- return null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java
deleted file mode 100644
index 4ebad39..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayCodec.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-class ExternalByteArrayCodec extends AbstractBitCodec<byte[]> {
- private final OutputStream outputStream;
- private final InputStream inputStream;
-
- public ExternalByteArrayCodec(final OutputStream outputStream, final InputStream inputStream) {
- this.outputStream = outputStream;
- this.inputStream = inputStream;
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream, final int length) throws IOException {
- return InputStreamUtils.readFully(inputStream, length);
- }
-
- @Override
- public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
- final int valueLen) throws IOException {
- InputStreamUtils.readFully(inputStream, array, offset, valueLen);
- }
-
- @Override
- public void skip(final BitInputStream bitInputStream) throws IOException {
- //noinspection ResultOfMethodCallIgnored
- inputStream.skip(1);
- }
-
- @Override
- public void skip(final BitInputStream bitInputStream, final int length) throws IOException {
- //noinspection ResultOfMethodCallIgnored
- inputStream.skip(length);
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final byte[] object) throws IOException {
- outputStream.write(object);
- return numberOfBits(object);
- }
-
- @Override
- public long numberOfBits(final byte[] object) {
- return object.length * 8;
- }
-
- @Override
- public byte[] read(final BitInputStream bitInputStream) throws IOException {
- throw new RuntimeException("Cannot read byte array of unknown length.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java
deleted file mode 100644
index 2fc707c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteArrayEncoding.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalByteArrayEncoding implements Encoding<byte[]> {
- private static final EncodingID encodingId = EncodingID.EXTERNAL;
- private int contentId = -1;
-
- public ExternalByteArrayEncoding() {
- }
-
- public static EncodingParams toParam(final int contentId) {
- final ExternalByteArrayEncoding e = new ExternalByteArrayEncoding();
- e.contentId = contentId;
- return new EncodingParams(encodingId, e.toByteArray());
- }
-
- public byte[] toByteArray() {
- return ITF8.writeUnsignedITF8(contentId);
- }
-
- public void fromByteArray(final byte[] data) {
- contentId = ITF8.readUnsignedITF8(data);
- }
-
- @Override
- public BitCodec<byte[]> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
- final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap
- .get(contentId);
- return new ExternalByteArrayCodec(outputStream, inputStream);
- }
-
- @Override
- public EncodingID id() {
- return encodingId;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java
deleted file mode 100644
index b1c8529..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteCodec.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalByteCodec extends AbstractBitCodec<Byte> {
- private final OutputStream outputStream;
- private final InputStream inputStream;
-
- public ExternalByteCodec(final OutputStream outputStream, final InputStream inputStream) {
- this.outputStream = outputStream;
- this.inputStream = inputStream;
- }
-
- @Override
- public Byte read(final BitInputStream bitInputStream) throws IOException {
- return (byte) inputStream.read();
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final Byte object) throws IOException {
- outputStream.write(object);
- return 8;
- }
-
- @Override
- public long numberOfBits(final Byte object) {
- return 8;
- }
-
- @Override
- public Byte read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
- @Override
- public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
- final int valueLen) throws IOException {
- InputStreamUtils.readFully(inputStream, array, offset, valueLen);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java
deleted file mode 100644
index 0fed720..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalByteEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalByteEncoding implements Encoding<Byte> {
- private static final EncodingID encodingId = EncodingID.EXTERNAL;
- private int contentId = -1;
-
- public ExternalByteEncoding() {
- }
-
- public static EncodingParams toParam(final int contentId) {
- final ExternalByteEncoding externalByteEncoding = new ExternalByteEncoding();
- externalByteEncoding.contentId = contentId;
- return new EncodingParams(encodingId, externalByteEncoding.toByteArray());
- }
-
- public byte[] toByteArray() {
- return ITF8.writeUnsignedITF8(contentId);
- }
-
- public void fromByteArray(final byte[] data) {
- contentId = ITF8.readUnsignedITF8(data);
- }
-
- @Override
- public BitCodec<Byte> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
- final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
- return new ExternalByteCodec(outputStream, inputStream);
- }
-
- @Override
- public EncodingID id() {
- return encodingId;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java
deleted file mode 100644
index 0987294..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalCompressor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.encoding.rans.RANS.ORDER;
-import htsjdk.samtools.cram.io.ExternalCompression;
-import htsjdk.samtools.cram.structure.BlockCompressionMethod;
-
-import java.io.IOException;
-
-public abstract class ExternalCompressor {
- private final BlockCompressionMethod method;
-
- private ExternalCompressor(final BlockCompressionMethod method) {
- this.method = method;
- }
-
- public BlockCompressionMethod getMethod() {
- return method;
- }
-
- public abstract byte[] compress(byte[] data);
-
- public static ExternalCompressor createRAW() {
- return new ExternalCompressor(BlockCompressionMethod.RAW) {
-
- @Override
- public byte[] compress(final byte[] data) {
- return data;
- }
- };
- }
-
- public static ExternalCompressor createGZIP() {
- return new ExternalCompressor(BlockCompressionMethod.GZIP) {
-
- @Override
- public byte[] compress(final byte[] data) {
- try {
- return ExternalCompression.gzip(data);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
-
- public static ExternalCompressor createLZMA() {
- return new ExternalCompressor(BlockCompressionMethod.LZMA) {
-
- @Override
- public byte[] compress(final byte[] data) {
- try {
- return ExternalCompression.xz(data);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
-
- public static ExternalCompressor createBZIP2() {
- return new ExternalCompressor(BlockCompressionMethod.BZIP2) {
-
- @Override
- public byte[] compress(final byte[] data) {
- try {
- return ExternalCompression.bzip2(data);
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
-
- }
-
- public static ExternalCompressor createRANS(final ORDER order) {
- return new ExternalCompressor(BlockCompressionMethod.RANS) {
-
- @Override
- public byte[] compress(final byte[] data) {
- return ExternalCompression.rans(data, order);
- }
- };
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java
deleted file mode 100644
index d26b0db..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerCodec.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalIntegerCodec extends AbstractBitCodec<Integer> {
- private final OutputStream outputStream;
- private final InputStream inputStream;
- private final OutputStream nullOutputStream = new OutputStream() {
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
- }
-
- @Override
- public void write(final int b) throws IOException {
- }
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
- }
- };
-
- public ExternalIntegerCodec(final OutputStream outputStream, final InputStream inputStream) {
- this.outputStream = outputStream;
- this.inputStream = inputStream;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream) throws IOException {
- return ITF8.readUnsignedITF8(inputStream);
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
- return ITF8.writeUnsignedITF8(value, outputStream);
- }
-
- @Override
- public long numberOfBits(final Integer value) {
- try {
- return ITF8.writeUnsignedITF8(value, nullOutputStream);
- } catch (final IOException e) {
- // this should never happened but still:
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java
deleted file mode 100644
index a7c5736..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalIntegerEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID encodingId = EncodingID.EXTERNAL;
- private int contentId = -1;
-
- public ExternalIntegerEncoding() {
- }
-
- public static EncodingParams toParam(final int contentId) {
- final ExternalIntegerEncoding externalIntegerEncoding = new ExternalIntegerEncoding();
- externalIntegerEncoding.contentId = contentId;
- return new EncodingParams(encodingId, externalIntegerEncoding.toByteArray());
- }
-
- public byte[] toByteArray() {
- return ITF8.writeUnsignedITF8(contentId);
- }
-
- public void fromByteArray(final byte[] data) {
- contentId = ITF8.readUnsignedITF8(data);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
- final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
- return new ExternalIntegerCodec(outputStream, inputStream);
- }
-
- @Override
- public EncodingID id() {
- return encodingId;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java
deleted file mode 100644
index 328f940..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongCodec.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License inputStream distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-
-class ExternalLongCodec extends AbstractBitCodec<Long> {
- private final OutputStream outputStream;
- private final InputStream inputStream;
-
- public ExternalLongCodec(final OutputStream outputStream, final InputStream inputStream) {
- this.outputStream = outputStream;
- this.inputStream = inputStream;
- }
-
- @Override
- public Long read(final BitInputStream bitInputStream) throws IOException {
- long result = 0;
- for (int i = 0; i < 8; i++) {
- result <<= 8;
- result |= inputStream.read();
- }
- return result;
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, Long value) throws IOException {
- for (int i = 0; i < 8; i++) {
- outputStream.write((int) (value & 0xFF));
- value >>>= 8;
- }
- return 64;
- }
-
- @Override
- public long numberOfBits(final Long object) {
- return 8;
- }
-
- @Override
- public Long read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java
deleted file mode 100644
index 402cea8..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/ExternalLongEncoding.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ExternalLongEncoding implements Encoding<Long> {
- private static final EncodingID encodingId = EncodingID.EXTERNAL;
- private int contentId = -1;
-
- public ExternalLongEncoding() {
- }
-
- public static EncodingParams toParam(final int contentId) {
- final ExternalLongEncoding externalLongEncoding = new ExternalLongEncoding();
- externalLongEncoding.contentId = contentId;
- return new EncodingParams(encodingId, externalLongEncoding.toByteArray());
- }
-
- public byte[] toByteArray() {
- return ITF8.writeUnsignedITF8(contentId);
- }
-
- public void fromByteArray(final byte[] data) {
- contentId = ITF8.readUnsignedITF8(data);
- }
-
- @Override
- public BitCodec<Long> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final InputStream inputStream = inputMap == null ? null : inputMap.get(contentId);
- final ExposedByteArrayOutputStream outputStream = outputMap == null ? null : outputMap.get(contentId);
- return new ExternalLongCodec(outputStream, inputStream);
- }
-
- @Override
- public EncodingID id() {
- return encodingId;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java
deleted file mode 100644
index 9b6cc7f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerCodec.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-class GammaIntegerCodec extends AbstractBitCodec<Integer> {
- private int offset = 0;
-
- public GammaIntegerCodec(final int offset) {
- this.offset = offset;
- }
-
- @Override
- public final Integer read(final BitInputStream bitInputStream) throws IOException {
- int length = 1;
- final boolean lenCodingBit = false;
- //noinspection ConstantConditions,PointlessBooleanExpression
- while (bitInputStream.readBit() == lenCodingBit)
- length++;
- final int readBits = bitInputStream.readBits(length - 1);
- final int value = readBits | 1 << (length - 1);
- return value - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
- if (value + offset < 1)
- throw new IllegalArgumentException("Gamma codec handles only positive values: " + value);
-
- final long newValue = value + offset;
- final int betaCodeLength = 1 + (int) (Math.log(newValue) / Math.log(2));
- if (betaCodeLength > 1)
- bitOutputStream.write(0L, betaCodeLength - 1);
-
- bitOutputStream.write(newValue, betaCodeLength);
- return betaCodeLength * 2 - 1;
- }
-
- @Override
- public final long numberOfBits(final Integer value) {
- final long newValue = value + offset;
- if (newValue < 1)
- throw new RuntimeException("Invalid valid: " + newValue);
- final int betaCodeLength = 1 + (int) (Math.log(newValue) / Math.log(2));
- return betaCodeLength * 2 - 1;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java
deleted file mode 100644
index 00c38a2..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GammaIntegerEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GammaIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.GAMMA;
- private int offset;
-
- public GammaIntegerEncoding() {
- this(0);
- }
-
- public GammaIntegerEncoding(final int offset) {
- this.offset = offset;
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int offset) {
- final GammaIntegerEncoding gammaIntegerEncoding = new GammaIntegerEncoding();
- gammaIntegerEncoding.offset = offset;
- return new EncodingParams(ENCODING_ID, gammaIntegerEncoding.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- offset = ITF8.readUnsignedITF8(data);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new GammaIntegerCodec(offset);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java
deleted file mode 100644
index 1a15efa..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerCodec.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombIntegerCodec extends AbstractBitCodec<Integer> {
- private int m;
- private boolean quotientBit = true;
- private int offset = 0;
-
- public GolombIntegerCodec(final int m, final Integer offset) {
- if (m < 2)
- throw new IllegalArgumentException(
- "M parameter must be at least 2.");
- this.m = m;
- this.quotientBit = true;
- this.offset = offset;
- }
-
- @Override
- public final Integer read(final BitInputStream bitInputStream) throws IOException {
- int quotient = 0;
- while (bitInputStream.readBit() == quotientBit)
- quotient++;
-
- final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
- int reminder = bitInputStream.readBits(ceiling - 1);
- if (reminder >= Math.pow(2, ceiling) - m) {
- reminder <<= 1;
- reminder |= bitInputStream.readBits(1);
- reminder -= Math.pow(2, ceiling) - m;
- }
-
- return (quotient * m + reminder) - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Integer value)
- throws IOException {
- final int newValue = value + offset;
- final int quotient = newValue / m;
- final int reminder = newValue % m;
- final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
-
- int length = quotient + 1;
- bitOutputStream.write(quotientBit, quotient);
- bitOutputStream.write(!quotientBit);
-
- if (reminder < Math.pow(2, ceiling) - m) {
- bitOutputStream.write(reminder, ceiling - 1);
- length += ceiling - 1;
- } else {
- bitOutputStream.write((int) (reminder + Math.pow(2, ceiling) - m),
- ceiling);
- length += ceiling;
- }
- return length;
- }
-
- @Override
- public final long numberOfBits(final Integer value) {
- final int newValue = value + offset;
- final int quotient = newValue / m;
- final int reminder = newValue % m;
- final int ceiling = (int) (Math.log(m) / Math.log(2) + 1);
- int l = quotient + 1;
-
- if (reminder < Math.pow(2, ceiling) - m)
- l += ceiling - 1;
- else
- l += ceiling;
-
- return l;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Multi-value read method not defined.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java
deleted file mode 100644
index 2332b5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombIntegerEncoding.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.GOLOMB;
- private int m;
- private int offset;
-
- public GolombIntegerEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int m) {
- final GolombIntegerEncoding golombIntegerEncoding = new GolombIntegerEncoding();
- golombIntegerEncoding.m = m;
- golombIntegerEncoding.offset = 0;
- return new EncodingParams(ENCODING_ID, golombIntegerEncoding.toByteArray());
- }
-
- public static EncodingParams toParam(final int m, final int offset) {
- final GolombIntegerEncoding e = new GolombIntegerEncoding();
- e.m = m;
- e.offset = offset;
- return new EncodingParams(ENCODING_ID, e.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- ITF8.writeUnsignedITF8(m, buffer);
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- offset = ITF8.readUnsignedITF8(buffer);
- m = ITF8.readUnsignedITF8(buffer);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new GolombIntegerCodec(m, offset);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java
deleted file mode 100644
index ef0c12c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongCodec.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombLongCodec extends AbstractBitCodec<Long> {
- private int m;
- private boolean quotientBit = true;
- private long offset = 0L;
-
- public GolombLongCodec(final long offset, final int m) {
- if (m < 2)
- throw new IllegalArgumentException(
- "M parameter must be at least 2.");
- this.m = m;
- this.quotientBit = true;
- this.offset = offset;
- }
-
- @Override
- public final Long read(final BitInputStream bitInputStream) throws IOException {
- long quotient = 0L;
- while (bitInputStream.readBit() == quotientBit)
- quotient++;
-
- final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
- long reminder = bitInputStream.readBits((int) (ceiling - 1));
- if (reminder >= Math.pow(2, ceiling) - m) {
- reminder <<= 1;
- reminder |= bitInputStream.readBits(1);
- reminder -= Math.pow(2, ceiling) - m;
- }
-
- return (quotient * m + reminder) - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Long value)
- throws IOException {
- final long newValue = value + offset;
- final long quotient = newValue / m;
- final long reminder = newValue % m;
- final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
-
- long length = quotient + 1;
- bitOutputStream.write(quotientBit, quotient);
- bitOutputStream.write(!quotientBit);
-
- if (reminder < Math.pow(2, ceiling) - m) {
- bitOutputStream.write(reminder, (int) ceiling - 1);
- length += ceiling - 1;
- } else {
- bitOutputStream.write((int) (reminder + Math.pow(2, ceiling) - m),
- (int) ceiling);
- length += ceiling;
- }
- return length;
- }
-
- @Override
- public final long numberOfBits(final Long value) {
- final long newValue = value + offset;
- final long quotient = newValue / m;
- final long reminder = newValue % m;
- final long ceiling = (long) (Math.log(m) / Math.log(2) + 1);
- long l = quotient + 1;
-
- if (reminder < Math.pow(2, ceiling) - m)
- l += ceiling - 1;
- else
- l += ceiling;
-
- return l;
- }
-
- @Override
- public Long read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Multi-value read method not defined.");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java
deleted file mode 100644
index eabec1b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombLongEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombLongEncoding implements Encoding<Long> {
- private static final EncodingID ENCODING_ID = EncodingID.GOLOMB;
- private int m;
- private int offset;
-
- public GolombLongEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int offset, final int m) {
- final GolombLongEncoding golombLongEncoding = new GolombLongEncoding();
- golombLongEncoding.offset = offset;
- golombLongEncoding.m = m;
- return new EncodingParams(ENCODING_ID, golombLongEncoding.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- ITF8.writeUnsignedITF8(m, buffer);
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- offset = ITF8.readUnsignedITF8(buffer);
- m = ITF8.readUnsignedITF8(buffer);
- }
-
- @Override
- public BitCodec<Long> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new GolombLongCodec(offset, m);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java
deleted file mode 100644
index e5962a1..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerCodec.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class GolombRiceIntegerCodec extends AbstractBitCodec<Integer> {
- private final int m;
- private final int log2m;
- private final long mask;
- private boolean quotientBit = false;
- private int offset = 0;
-
- public GolombRiceIntegerCodec(final int offset, final int log2m) {
- this.log2m = log2m;
- m = 1 << log2m;
- this.quotientBit = true;
- this.offset = offset;
- mask = ~(~0 << log2m);
- }
-
- public final Integer read(final BitInputStream bitInputStream) throws IOException {
-
- int unary = 0;
- while (bitInputStream.readBit() == quotientBit)
- unary++;
-
- final int remainder = bitInputStream.readBits(log2m);
-
- final int result = unary * m + remainder;
- return result - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
- final long newValue = value + offset;
- final long quotient = newValue >>> log2m;
- if (quotient > 0x7fffffffL)
- for (long i = 0; i < quotient; i++)
- bitOutputStream.write(quotientBit);
-
- else if (quotient > 0) {
- final int qi = (int) quotient;
- for (int i = 0; i < qi; i++)
- bitOutputStream.write(quotientBit);
- }
- bitOutputStream.write(!quotientBit);
- final long remainder = newValue & mask;
- long reminderMask = 1 << (log2m - 1);
- for (int i = log2m - 1; i >= 0; i--) {
- final long b = remainder & reminderMask;
- bitOutputStream.write(b != 0L);
- reminderMask >>>= 1;
- }
- return quotient + 1 + log2m;
- }
-
- @Override
- public final long numberOfBits(final Integer value) {
- return (value + offset) / m + 1 + log2m;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java
deleted file mode 100644
index 8f8d27b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/GolombRiceIntegerEncoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class GolombRiceIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.GOLOMB_RICE;
- private int offset;
- private int m;
-
- public GolombRiceIntegerEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int offset, final int m) {
- final GolombRiceIntegerEncoding golombRiceIntegerEncoding = new GolombRiceIntegerEncoding();
- golombRiceIntegerEncoding.offset = offset;
- golombRiceIntegerEncoding.m = m;
- return new EncodingParams(ENCODING_ID, golombRiceIntegerEncoding.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- ITF8.writeUnsignedITF8(m, buffer);
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- offset = ITF8.readUnsignedITF8(buffer);
- m = ITF8.readUnsignedITF8(buffer);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new GolombRiceIntegerCodec(offset, m);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java
deleted file mode 100644
index 6f1038c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/NullCodec.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class NullCodec<T> extends AbstractBitCodec<T> {
- private final T defaultValue = null;
-
- public NullCodec() {
- }
-
- @Override
- public T read(final BitInputStream bitInputStream) throws IOException {
- return defaultValue;
- }
-
- @Override
- public T read(final BitInputStream bitInputStream, final int length) throws IOException {
- return defaultValue;
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final T object) throws IOException {
- return 0;
- }
-
- @Override
- public long numberOfBits(final T object) {
- return 0;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java
deleted file mode 100644
index 9af54bd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/NullEncoding.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class NullEncoding<T> implements Encoding<T> {
- private static final EncodingID ENCODING_ID = EncodingID.NULL;
-
- public NullEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam() {
- return new EncodingParams(ENCODING_ID, new NullEncoding().toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- return new byte[]{};
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- }
-
- @Override
- public BitCodec<T> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new NullCodec<T>();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java
deleted file mode 100644
index 54dc809..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerCodec.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class SubexponentialIntegerCodec extends AbstractBitCodec<Integer> {
- private int offset = 0;
- private int k = 2;
- private boolean unaryBit = true;
-
- SubexponentialIntegerCodec(final int offset, final int k) {
- this.offset = offset;
- this.k = k;
- this.unaryBit = true;
- }
-
- @Override
- public final Integer read(final BitInputStream bitInputStream) throws IOException {
- int u = 0;
- while (bitInputStream.readBit() == unaryBit)
- u++;
-
- final int b;
- final int n;
- if (u == 0) {
- b = k;
- n = bitInputStream.readBits(b);
- } else {
- b = u + k - 1;
- n = (1 << b) | bitInputStream.readBits(b);
- }
-
- return n - offset;
- }
-
- @Override
- public final long write(final BitOutputStream bitOutputStream, final Integer value) throws IOException {
- if (value + offset < 0)
- throw new IllegalArgumentException("Value is less then offset: " + value);
-
- final long newValue = value + offset;
- final int b;
- final int u;
- if (newValue < (1L << k)) {
- b = k;
- u = 0;
- } else {
- b = (int) (Math.log(newValue) / Math.log(2));
- u = b - k + 1;
- }
-
- bitOutputStream.write(unaryBit, u);
- bitOutputStream.write(!unaryBit);
-
- bitOutputStream.write(newValue, b);
- return u + 1 + b;
- }
-
- @Override
- public final long numberOfBits(final Integer value) {
- final long newValue = value + offset;
- final long b;
- final long u;
- if (newValue < (1L << k)) {
- b = k;
- u = 0;
- } else {
- b = (long) Math.floor(Math.log(newValue) / Math.log(2));
- u = b - k + 1;
- }
- return u + 1 + b;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java
deleted file mode 100644
index 03911b6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/SubexponentialIntegerEncoding.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding;
-
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class SubexponentialIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.SUBEXPONENTIAL;
- private int offset;
- private int k;
-
- public SubexponentialIntegerEncoding() {
- }
-
- public SubexponentialIntegerEncoding(final int offset, final int k) {
- this.offset = offset;
- this.k = k;
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- public static EncodingParams toParam(final int offset, final int k) {
- final SubexponentialIntegerEncoding subexponentialIntegerEncoding = new SubexponentialIntegerEncoding();
- subexponentialIntegerEncoding.offset = offset;
- subexponentialIntegerEncoding.k = k;
- return new EncodingParams(ENCODING_ID, subexponentialIntegerEncoding.toByteArray());
- }
-
- @Override
- public byte[] toByteArray() {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- ITF8.writeUnsignedITF8(offset, buffer);
- ITF8.writeUnsignedITF8(k, buffer);
- buffer.flip();
- final byte[] bytes = new byte[buffer.limit()];
- buffer.get(bytes);
- return bytes;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- offset = ITF8.readUnsignedITF8(buffer);
- k = ITF8.readUnsignedITF8(buffer);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new SubexponentialIntegerCodec(offset, k);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java
deleted file mode 100644
index cbb855f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanCode.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class HuffmanCode {
-
- public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) {
- final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>();
- for (int i = 0; i < charFrequencies.length; i++)
- if (charFrequencies[i] > 0)
- list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i]));
-
- final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() {
-
- @Override
- public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) {
- return o1.frequency - o2.frequency;
- }
- };
-
- while (list.size() > 1) {
- Collections.sort(list, comparator);
- // dumpList(list) ;
- final HuffmanTree<T> left = list.remove();
- final HuffmanTree<T> right = list.remove();
- list.add(new HuffmanNode<T>(left, right));
- }
- return list.isEmpty() ? null : list.remove();
- }
-
- public static <T> void getValuesAndBitLengths(final List<T> values,
- final List<Integer> lens, final HuffmanTree<T> tree) {
- final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>();
- getBitCode(tree, new HuffmanBitCode<T>(), codes);
-
- for (final T value : codes.keySet()) {
- final HuffmanBitCode<T> code = codes.get(value);
- values.add(value);
- lens.add(code.bitLength);
- }
- }
-
- private static class HuffmanBitCode<T> {
- long bitCode;
- int bitLength;
- }
-
- private static <T> void getBitCode(final HuffmanTree<T> tree,
- final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) {
- if (tree instanceof HuffmanLeaf) {
- final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree;
- final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>();
- readyCode.bitCode = code.bitCode;
- readyCode.bitLength = code.bitLength;
- codes.put(leaf.value, readyCode);
-
- } else if (tree instanceof HuffmanNode) {
- final HuffmanNode<T> node = (HuffmanNode<T>) tree;
-
- // traverse left
- code.bitCode = code.bitCode << 1;
- code.bitLength++;
-
- getBitCode(node.left, code, codes);
- code.bitCode = code.bitCode >>> 1;
- code.bitLength--;
-
- // traverse right
- code.bitCode = code.bitCode << 1 | 1;
- code.bitLength++;
-
- getBitCode(node.right, code, codes);
- code.bitCode = code.bitCode >>> 1;
- code.bitLength--;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java
deleted file mode 100644
index 81b3f56..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanLeaf.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-class HuffmanLeaf<T> extends HuffmanTree<T> {
- // user object, attached to the leaf:
- public final T value;
-
- public HuffmanLeaf(final int freq, final T val) {
- super(freq);
- value = val;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java
deleted file mode 100644
index 2411c4a..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanNode.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-class HuffmanNode<T> extends HuffmanTree<T> {
- public final HuffmanTree<T> left, right;
-
- public HuffmanNode(final HuffmanTree<T> left, final HuffmanTree<T> right) {
- super(left.frequency + right.frequency);
- this.left = left;
- this.right = right;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java
deleted file mode 100644
index 43500c4..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/HuffmanTree.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman;
-
-public abstract class HuffmanTree<T> implements Comparable<HuffmanTree<T>> {
- public final int frequency;
-
- HuffmanTree(final int freq) {
- frequency = freq;
- }
-
- public int compareTo(@SuppressWarnings("NullableProblems") final HuffmanTree<T> tree) {
- return frequency - tree.frequency;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java
deleted file mode 100644
index 83b001c..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanByteCodec.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.AbstractBitCodec;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-class CanonicalHuffmanByteCodec extends AbstractBitCodec<Byte> {
- private final HuffmanByteHelper helper;
-
- /*
- * values[]: the alphabet (provided as Integers) bitLengths[]: the number of
- * bits of symbol's huffman code
- */
- public CanonicalHuffmanByteCodec(final byte[] values, final int[] bitLengths) {
- helper = new HuffmanByteHelper(values, bitLengths);
- }
-
- @Override
- public Byte read(final BitInputStream bitInputStream) throws IOException {
- return helper.read(bitInputStream);
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final Byte object) throws IOException {
- return helper.write(bitOutputStream, object);
- }
-
- @Override
- public long numberOfBits(final Byte object) {
- final HuffmanBitCode bitCode;
- try {
- //noinspection SuspiciousMethodCalls
- bitCode = helper.codes.get(object);
- return bitCode.bitLength;
- } catch (final NullPointerException e) {
- throw new RuntimeException("Value " + object + " not found.", e);
- }
- }
-
- @Override
- public Byte read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented");
- }
-
- @Override
- public void readInto(final BitInputStream bitInputStream, final byte[] array, final int offset,
- final int valueLen) throws IOException {
- for (int i = 0; i < valueLen; i++)
- array[offset + i] = helper.read(bitInputStream);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java
deleted file mode 100644
index 96dfc78..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/CanonicalHuffmanIntegerCodec.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.AbstractBitCodec;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-
-
-class CanonicalHuffmanIntegerCodec extends AbstractBitCodec<Integer> {
- private final HuffmanIntHelper helper;
-
- /*
- * values[]: the alphabet (provided as Integers) bitLengths[]: the number of
- * bits of symbol's huffman code
- */
- public CanonicalHuffmanIntegerCodec(final int[] values, final int[] bitLengths) {
- helper = new HuffmanIntHelper(values, bitLengths);
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream) throws IOException {
- return helper.read(bitInputStream);
- }
-
- @Override
- public long write(final BitOutputStream bitOutputStream, final Integer object) throws IOException {
- return helper.write(bitOutputStream, object);
- }
-
- @Override
- public long numberOfBits(final Integer object) {
- final HuffmanBitCode bitCode;
- bitCode = helper.codes.get(object);
- return bitCode.bitLength;
- }
-
- @Override
- public Integer read(final BitInputStream bitInputStream, final int length) throws IOException {
- throw new RuntimeException("Not implemented");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java
deleted file mode 100644
index 7d4c0e0..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanBitCode.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-class HuffmanBitCode {
- int bitCode;
- int bitLength;
- int value;
-
- @Override
- public String toString() {
- return value + ":\t" + Integer.toBinaryString(bitCode).substring(32 - bitLength) + " " + bitCode;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java
deleted file mode 100644
index 64a6729..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteEncoding.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Map;
-
-public class HuffmanByteEncoding implements Encoding<Byte> {
- private static final EncodingID ENCODING_ID = EncodingID.HUFFMAN;
- private int[] bitLengths;
- private byte[] values;
- private ByteBuffer buf = ByteBuffer.allocate(1024);
-
- public HuffmanByteEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- @Override
- public byte[] toByteArray() {
- buf.clear();
- if (buf.capacity() < values.length * 8)
- buf = ByteBuffer.allocate(values.length * 8);
-
- ITF8.writeUnsignedITF8(values.length, buf);
- for (final byte value : values)
- buf.put(value);
-
- ITF8.writeUnsignedITF8(bitLengths.length, buf);
- for (final int value : bitLengths)
- ITF8.writeUnsignedITF8(value, buf);
-
- buf.flip();
- final byte[] array = new byte[buf.limit()];
- buf.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buf = ByteBuffer.wrap(data);
- int size = ITF8.readUnsignedITF8(buf);
- values = new byte[size];
- buf.get(values);
-
- size = ITF8.readUnsignedITF8(buf);
- bitLengths = new int[size];
- for (int i = 0; i < size; i++)
- bitLengths[i] = ITF8.readUnsignedITF8(buf);
- }
-
- @Override
- public BitCodec<Byte> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new CanonicalHuffmanByteCodec(values, bitLengths);
- }
-
- public static EncodingParams toParam(final byte[] bfValues, final int[] bfBitLens) {
- final HuffmanByteEncoding e = new HuffmanByteEncoding();
- e.values = bfValues;
- e.bitLengths = bfBitLens;
- return new EncodingParams(ENCODING_ID, e.toByteArray());
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java
deleted file mode 100644
index af62c5e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanByteHelper.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-class HuffmanByteHelper {
- TreeMap<Integer, HuffmanBitCode> codes;
-
- private final int[] values;
- private final int[] bitLengths;
- private TreeMap<Integer, SortedSet<Integer>> codeBook;
-
- private final HuffmanBitCode[] sortedCodes;
- private final int[] sortedValuesByBitCode;
- private final int[] sortedBitLensByBitCode;
- private final int[] bitCodeToValue;
- private final HuffmanBitCode[] valueToCode;
-
- HuffmanByteHelper(final byte[] values, final int[] bitLengths) {
- this.values = new int[values.length];
- for (int i = 0; i < values.length; i++)
- this.values[i] = 0xFF & values[i];
-
- this.bitLengths = bitLengths;
-
- buildCodeBook();
- buildCodes();
-
- final ArrayList<HuffmanBitCode> list = new ArrayList<HuffmanBitCode>(
- codes.size());
- list.addAll(codes.values());
- Collections.sort(list, bitCodeComparator);
- sortedCodes = list.toArray(new HuffmanBitCode[list
- .size()]);
-
- final byte[] sortedValues = Arrays.copyOf(values, values.length);
- Arrays.sort(sortedValues);
-
- sortedValuesByBitCode = new int[sortedCodes.length];
- sortedBitLensByBitCode = new int[sortedCodes.length];
- int maxBitCode = 0;
- for (int i = 0; i < sortedCodes.length; i++) {
- sortedValuesByBitCode[i] = sortedCodes[i].value;
- sortedBitLensByBitCode[i] = sortedCodes[i].bitLength;
- if (maxBitCode < sortedCodes[i].bitCode)
- maxBitCode = sortedCodes[i].bitCode;
- }
-
- bitCodeToValue = new int[maxBitCode + 1];
- Arrays.fill(bitCodeToValue, -1);
- for (int i = 0; i < sortedCodes.length; i++) {
- bitCodeToValue[sortedCodes[i].bitCode] = i;
- }
-
- valueToCode = new HuffmanBitCode[255];
- Arrays.fill(valueToCode, null);
- for (final HuffmanBitCode code : sortedCodes) {
- valueToCode[code.value] = code;
- }
- }
-
- private void buildCodeBook() {
- codeBook = new TreeMap<Integer, SortedSet<Integer>>();
- for (int i = 0; i < values.length; i++) {
- if (codeBook.containsKey(bitLengths[i]))
- codeBook.get(bitLengths[i]).add(values[i]);
- else {
- final TreeSet<Integer> entry = new TreeSet<Integer>();
- entry.add(values[i]);
- codeBook.put(bitLengths[i], entry);
- }
- }
- }
-
- private void buildCodes() {
- codes = new TreeMap<Integer, HuffmanBitCode>();
- int codeLength = 0, codeValue = -1;
- for (final Object key : codeBook.keySet()) { // Iterate over code lengths
-
- @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key);
- final int intKey = Integer.parseInt(key.toString());
- for (final Integer entry : get) { // Iterate over symbols
- final HuffmanBitCode code = new HuffmanBitCode();
- code.bitLength = intKey; // given: bit length
- code.value = entry; // given: symbol
-
- codeValue++; // increment bit value by 1
- final int delta = intKey - codeLength; // new length?
- codeValue = codeValue << delta; // pad with 0's
- code.bitCode = codeValue; // calculated: huffman code
- codeLength += delta; // adjust current code length
-
- if (NumberOfSetBits(codeValue) > intKey)
- throw new IllegalArgumentException("Symbol out of range");
-
- codes.put(entry, code); // Store HuffmanBitCode
-
- }
-
- }
- }
-
- final long write(final BitOutputStream bitOutputStream, final byte value)
- throws IOException {
- final HuffmanBitCode code = valueToCode[value];
- if (code.value != value)
- throw new RuntimeException(String.format(
- "Searching for %d but found %s.", value, code.toString()));
- bitOutputStream.write(code.bitCode, code.bitLength);
- // System.out.println("Writing: " + code.toString());
- return code.bitLength;
- }
-
- final byte read(final BitInputStream bitInputStream) throws IOException {
- int prevLen = 0;
- int bits = 0;
- for (int i = 0; i < sortedCodes.length; i++) {
- final int length = sortedCodes[i].bitLength;
- bits <<= length - prevLen;
- bits |= bitInputStream.readBits(length - prevLen);
- prevLen = length;
-
- final int index = bitCodeToValue[bits];
- if (index > -1 && sortedBitLensByBitCode[index] == length)
- return (byte) (0xFF & sortedValuesByBitCode[index]);
-
- for (int j = i; sortedCodes[j + 1].bitLength == length
- && j < sortedCodes.length; j++)
- i++;
- }
-
- throw new RuntimeException("Not found.");
- }
-
- private static final Comparator<HuffmanBitCode> bitCodeComparator = new Comparator<HuffmanBitCode>() {
-
- @Override
- public int compare(final HuffmanBitCode o1, final HuffmanBitCode o2) {
- final int result = o1.bitLength - o2.bitLength;
- if (result == 0)
- return o1.bitCode - o2.bitCode;
- else
- return result;
- }
- };
-
- private static int NumberOfSetBits(int i) {
- i = i - ((i >> 1) & 0x55555555);
- i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
- return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java
deleted file mode 100644
index 7f7e564..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntHelper.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.io.BitOutputStream;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-class HuffmanIntHelper {
- TreeMap<Integer, HuffmanBitCode> codes;
-
- private final int[] values;
- private final int[] bitLengths;
- private TreeMap<Integer, SortedSet<Integer>> codeBook;
-
- private final HuffmanBitCode[] sortedCodes;
- private final HuffmanBitCode[] sortedByValue;
- private final int[] sortedValues;
- private final int[] sortedValuesByBitCode;
- private final int[] sortedBitLensByBitCode;
- private final int[] bitCodeToValue;
-
- public HuffmanIntHelper(final int[] values, final int[] bitLengths) {
- this.values = values;
- this.bitLengths = bitLengths;
-
- buildCodeBook();
- buildCodes();
-
- final ArrayList<HuffmanBitCode> list = new ArrayList<HuffmanBitCode>(
- codes.size());
- list.addAll(codes.values());
- Collections.sort(list, bitCodeComparator);
- sortedCodes = list.toArray(new HuffmanBitCode[list
- .size()]);
-
- sortedValues = Arrays.copyOf(values, values.length);
- Arrays.sort(sortedValues);
- {
- int i = 0;
- sortedByValue = new HuffmanBitCode[sortedValues.length];
- for (final int value : sortedValues)
- sortedByValue[i++] = codes.get(value);
- }
-
- final int[] sortedBitCodes = new int[sortedCodes.length];
- sortedValuesByBitCode = new int[sortedCodes.length];
- sortedBitLensByBitCode = new int[sortedCodes.length];
- int maxBitCode = 0;
- for (int i = 0; i < sortedBitCodes.length; i++) {
- sortedBitCodes[i] = sortedCodes[i].bitCode;
- sortedValuesByBitCode[i] = sortedCodes[i].value;
- sortedBitLensByBitCode[i] = sortedCodes[i].bitLength;
- if (maxBitCode < sortedCodes[i].bitCode)
- maxBitCode = sortedCodes[i].bitCode;
- }
-
- bitCodeToValue = new int[maxBitCode + 1];
- Arrays.fill(bitCodeToValue, -1);
- for (int i = 0; i < sortedBitCodes.length; i++) {
- bitCodeToValue[sortedCodes[i].bitCode] = i;
- }
- }
-
- private void buildCodeBook() {
- codeBook = new TreeMap<Integer, SortedSet<Integer>>();
- for (int i = 0; i < values.length; i++) {
- if (codeBook.containsKey(bitLengths[i]))
- codeBook.get(bitLengths[i]).add(values[i]);
- else {
- final TreeSet<Integer> entry = new TreeSet<Integer>();
- entry.add(values[i]);
- codeBook.put(bitLengths[i], entry);
- }
- }
- }
-
- private void buildCodes() {
- codes = new TreeMap<Integer, HuffmanBitCode>();
- int codeLength = 0, codeValue = -1;
- for (final Object key : codeBook.keySet()) { // Iterate over code lengths
-
- @SuppressWarnings("SuspiciousMethodCalls") final SortedSet<Integer> get = codeBook.get(key);
- final int intKey = Integer.parseInt(key.toString());
- for (final Integer entry : get) { // Iterate over symbols
- final HuffmanBitCode code = new HuffmanBitCode();
- code.bitLength = intKey; // given: bit length
- code.value = entry; // given: symbol
-
- codeValue++; // increment bit value by 1
- final int delta = intKey - codeLength; // new length?
- codeValue = codeValue << delta; // pad with 0's
- code.bitCode = codeValue; // calculated: huffman code
- codeLength += delta; // adjust current code length
-
- if (NumberOfSetBits(codeValue) > intKey)
- throw new IllegalArgumentException("Symbol out of range");
-
- codes.put(entry, code); // Store HuffmanBitCode
-
- }
-
- }
- }
-
- public final long write(final BitOutputStream bitOutputStream, final int value) throws IOException {
- final int index = Arrays.binarySearch(sortedValues, value);
- final HuffmanBitCode code = sortedByValue[index];
- if (code.value != value)
- throw new RuntimeException(String.format(
- "Searching for %d but found %s.", value, code.toString()));
- bitOutputStream.write(code.bitCode, code.bitLength);
- return code.bitLength;
- }
-
- public final int read(final BitInputStream bitInputStream) throws IOException {
- int prevLen = 0;
- int bits = 0;
- for (int i = 0; i < sortedCodes.length; i++) {
- final int length = sortedCodes[i].bitLength;
- bits <<= length - prevLen;
- bits |= bitInputStream.readBits(length - prevLen);
- prevLen = length;
- { // Variant 2:
- final int index = bitCodeToValue[bits];
- if (index > -1 && sortedBitLensByBitCode[index] == length)
- return sortedValuesByBitCode[index];
-
- for (int j = i; sortedCodes[j + 1].bitLength == length
- && j < sortedCodes.length; j++)
- i++;
- }
- }
-
- throw new RuntimeException("Not found.");
- }
-
- private static final Comparator<HuffmanBitCode> bitCodeComparator = new Comparator<HuffmanBitCode>() {
-
- @Override
- public int compare(final HuffmanBitCode o1, final HuffmanBitCode o2) {
- final int result = o1.bitLength - o2.bitLength;
- if (result == 0)
- return o1.bitCode - o2.bitCode;
- else
- return result;
- }
- };
-
- private static int NumberOfSetBits(int i) {
- i = i - ((i >> 1) & 0x55555555);
- i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
- return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java
deleted file mode 100644
index 230a664..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanIntegerEncoding.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Map;
-
-public class HuffmanIntegerEncoding implements Encoding<Integer> {
- private static final EncodingID ENCODING_ID = EncodingID.HUFFMAN;
- private int[] bitLengths;
- private int[] values;
- private final ByteBuffer buf = ByteBuffer.allocate(1024 * 10);
-
- public HuffmanIntegerEncoding() {
- }
-
- @Override
- public EncodingID id() {
- return ENCODING_ID;
- }
-
- @Override
- public byte[] toByteArray() {
- buf.clear();
- ITF8.writeUnsignedITF8(values.length, buf);
- for (final int value : values)
- ITF8.writeUnsignedITF8(value, buf);
-
- ITF8.writeUnsignedITF8(bitLengths.length, buf);
- for (final int value : bitLengths)
- ITF8.writeUnsignedITF8(value, buf);
-
- buf.flip();
- final byte[] array = new byte[buf.limit()];
- buf.get(array);
- return array;
- }
-
- @Override
- public void fromByteArray(final byte[] data) {
- final ByteBuffer buf = ByteBuffer.wrap(data);
- int size = ITF8.readUnsignedITF8(buf);
- values = new int[size];
-
- for (int i = 0; i < size; i++)
- values[i] = ITF8.readUnsignedITF8(buf);
-
- size = ITF8.readUnsignedITF8(buf);
- bitLengths = new int[size];
- for (int i = 0; i < size; i++)
- bitLengths[i] = ITF8.readUnsignedITF8(buf);
- }
-
- @Override
- public BitCodec<Integer> buildCodec(final Map<Integer, InputStream> inputMap,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- return new CanonicalHuffmanIntegerCodec(values, bitLengths);
- }
-
- public static EncodingParams toParam(final int[] bfValues, final int[] bfBitLens) {
- final HuffmanIntegerEncoding e = new HuffmanIntegerEncoding();
- e.values = bfValues;
- e.bitLengths = bfBitLens;
- return new EncodingParams(ENCODING_ID, e.toByteArray());
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (obj instanceof HuffmanIntegerEncoding) {
- final HuffmanIntegerEncoding foe = (HuffmanIntegerEncoding) obj;
- return Arrays.equals(bitLengths, foe.bitLengths) && Arrays.equals(values, foe.values);
-
- }
- return false;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java b/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java
deleted file mode 100644
index c489a73..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanParamsCalculator.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.huffman.HuffmanCode;
-import htsjdk.samtools.cram.encoding.huffman.HuffmanTree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * A utility class to calculate Huffman encoding parameters based on the values to be encoded.
- */
-class HuffmanParamsCalculator {
- private final HashMap<Integer, MutableInt> countMap = new HashMap<>();
- private int[] values = new int[]{};
- private int[] bitLens = new int[]{};
-
- public void add(final int value) {
- MutableInt counter = countMap.get(value);
- if (counter == null) {
- counter = new MutableInt();
- countMap.put(value, counter);
- }
- counter.value++;
- }
-
- public void add(final Integer value, final int inc) {
- MutableInt counter = countMap.get(value);
- if (counter == null) {
- counter = new MutableInt();
- countMap.put(value, counter);
- }
- counter.value += inc;
- }
-
- public int[] bitLens() {
- return bitLens;
- }
-
- public int[] values() {
- return values;
- }
-
- public Integer[] valuesAsAutoIntegers() {
- final Integer[] intValues = new Integer[values.length];
- for (int i = 0; i < intValues.length; i++) {
- intValues[i] = values[i];
- }
-
- return intValues;
- }
-
- public byte[] valuesAsBytes() {
- final byte[] byteValues = new byte[values.length];
- for (int i = 0; i < byteValues.length; i++) {
- byteValues[i] = (byte) (0xFF & values[i]);
- }
-
- return byteValues;
- }
-
- public Byte[] valuesAsAutoBytes() {
- final Byte[] byteValues = new Byte[values.length];
- for (int i = 0; i < byteValues.length; i++) {
- byteValues[i] = (byte) (0xFF & values[i]);
- }
-
- return byteValues;
- }
-
- public void calculate() {
- final HuffmanTree<Integer> tree;
- {
- final int size = countMap.size();
- final int[] frequencies = new int[size];
- final int[] values = new int[size];
-
- int i = 0;
- for (final Integer key : countMap.keySet()) {
- values[i] = key;
- frequencies[i] = countMap.get(key).value;
- i++;
- }
- tree = HuffmanCode.buildTree(frequencies, autobox(values));
- }
-
- final List<Integer> valueList = new ArrayList<Integer>();
- final List<Integer> lens = new ArrayList<Integer>();
- HuffmanCode.getValuesAndBitLengths(valueList, lens, tree);
-
- // the following sorting is not really required, but whatever:
- final BitCode[] codes = new BitCode[valueList.size()];
- for (int i = 0; i < valueList.size(); i++) {
- codes[i] = new BitCode(valueList.get(i), lens.get(i));
- }
- Arrays.sort(codes);
-
- values = new int[codes.length];
- bitLens = new int[codes.length];
-
- for (int i = 0; i < codes.length; i++) {
- final BitCode code = codes[i];
- bitLens[i] = code.length;
- values[i] = code.value;
- }
- }
-
- private static Integer[] autobox(final int[] array) {
- final Integer[] newArray = new Integer[array.length];
- for (int i = 0; i < array.length; i++) {
- newArray[i] = array[i];
- }
- return newArray;
- }
-
- private static class BitCode implements Comparable<BitCode> {
- final int value;
- final int length;
-
- public BitCode(final int value, final int length) {
- this.value = value;
- this.length = length;
- }
-
- @Override
- public int compareTo(@SuppressWarnings("NullableProblems") final BitCode o) {
- final int result = value - o.value;
- if (result != 0) {
- return result;
- }
- return length - o.length;
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java
deleted file mode 100644
index 2981aa5..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Constants.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-class Constants {
- static final int TF_SHIFT = 12;
- static final int TOTFREQ = (1 << TF_SHIFT);
- static final int RANS_BYTE_L = 1 << 23;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java
deleted file mode 100644
index 69990b3..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/D04.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
-class D04 {
- static void uncompress(final ByteBuffer in, final Decoding.AriDecoder D,
- final Decoding.RansDecSymbol[] syms, final ByteBuffer out) {
- int rans0, rans1, rans2, rans3;
- rans0 = in.getInt();
- rans1 = in.getInt();
- rans2 = in.getInt();
- rans3 = in.getInt();
-
- final int out_sz = out.remaining();
- final int out_end = (out_sz & ~3);
- for (int i = 0; i < out_end; i += 4) {
- final byte c0 = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
- final byte c1 = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
- final byte c2 = D.R[Decoding.RansDecGet(rans2, Constants.TF_SHIFT)];
- final byte c3 = D.R[Decoding.RansDecGet(rans3, Constants.TF_SHIFT)];
-
- out.put(i, c0);
- out.put(i + 1, c1);
- out.put(i + 2, c2);
- out.put(i + 3, c3);
-
- rans0 = Decoding.RansDecAdvanceSymbolStep(rans0, syms[0xFF & c0],
- Constants.TF_SHIFT);
- rans1 = Decoding.RansDecAdvanceSymbolStep(rans1, syms[0xFF & c1],
- Constants.TF_SHIFT);
- rans2 = Decoding.RansDecAdvanceSymbolStep(rans2, syms[0xFF & c2],
- Constants.TF_SHIFT);
- rans3 = Decoding.RansDecAdvanceSymbolStep(rans3, syms[0xFF & c3],
- Constants.TF_SHIFT);
-
- rans0 = Decoding.RansDecRenormalize(rans0, in);
- rans1 = Decoding.RansDecRenormalize(rans1, in);
- rans2 = Decoding.RansDecRenormalize(rans2, in);
- rans3 = Decoding.RansDecRenormalize(rans3, in);
- }
-
- out.position(out_end);
- byte c;
- switch (out_sz & 3) {
- case 0:
- break;
- case 1:
- c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
- break;
-
- case 2:
- c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
-
- c = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans1, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
- break;
-
- case 3:
- c = D.R[Decoding.RansDecGet(rans0, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans0, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
-
- c = D.R[Decoding.RansDecGet(rans1, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans1, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
-
- c = D.R[Decoding.RansDecGet(rans2, Constants.TF_SHIFT)];
- Decoding.RansDecAdvanceSymbol(rans2, in, syms[0xFF & c],
- Constants.TF_SHIFT);
- out.put(c);
- break;
- }
-
- out.position(0);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java
deleted file mode 100644
index 9523d2e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/D14.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-class D14 {
- static void uncompress(final ByteBuffer in, final ByteBuffer out_buf, final Decoding.AriDecoder[] D,
- final Decoding.RansDecSymbol[][] syms) {
- final int out_sz = out_buf.remaining();
- int rans0, rans1, rans2, rans7;
- in.order(ByteOrder.LITTLE_ENDIAN);
- rans0 = in.getInt();
- rans1 = in.getInt();
- rans2 = in.getInt();
- rans7 = in.getInt();
-
- final int isz4 = out_sz >> 2;
- int i0 = 0;
- int i1 = isz4;
- int i2 = 2 * isz4;
- int i7 = 3 * isz4;
- int l0 = 0;
- int l1 = 0;
- int l2 = 0;
- int l7 = 0;
- for (; i0 < isz4; i0++, i1++, i2++, i7++) {
- final int c0 = 0xFF & D[l0].R[Decoding.RansDecGet(rans0,
- Constants.TF_SHIFT)];
- final int c1 = 0xFF & D[l1].R[Decoding.RansDecGet(rans1,
- Constants.TF_SHIFT)];
- final int c2 = 0xFF & D[l2].R[Decoding.RansDecGet(rans2,
- Constants.TF_SHIFT)];
- final int c7 = 0xFF & D[l7].R[Decoding.RansDecGet(rans7,
- Constants.TF_SHIFT)];
-
- out_buf.put(i0, (byte) c0);
- out_buf.put(i1, (byte) c1);
- out_buf.put(i2, (byte) c2);
- out_buf.put(i7, (byte) c7);
-
- rans0 = Decoding.RansDecAdvanceSymbolStep(rans0, syms[l0][c0],
- Constants.TF_SHIFT);
- rans1 = Decoding.RansDecAdvanceSymbolStep(rans1, syms[l1][c1],
- Constants.TF_SHIFT);
- rans2 = Decoding.RansDecAdvanceSymbolStep(rans2, syms[l2][c2],
- Constants.TF_SHIFT);
- rans7 = Decoding.RansDecAdvanceSymbolStep(rans7, syms[l7][c7],
- Constants.TF_SHIFT);
-
- rans0 = Decoding.RansDecRenormalize(rans0, in);
- rans1 = Decoding.RansDecRenormalize(rans1, in);
- rans2 = Decoding.RansDecRenormalize(rans2, in);
- rans7 = Decoding.RansDecRenormalize(rans7, in);
-
- l0 = c0;
- l1 = c1;
- l2 = c2;
- l7 = c7;
- }
-
- // Remainder
- for (; i7 < out_sz; i7++) {
- final int c7 = 0xFF & D[l7].R[Decoding.RansDecGet(rans7,
- Constants.TF_SHIFT)];
- out_buf.put(i7, (byte) c7);
- rans7 = Decoding.RansDecAdvanceSymbol(rans7, in, syms[l7][c7],
- Constants.TF_SHIFT);
- l7 = c7;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java
deleted file mode 100644
index fd29ab7..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Decoding.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
- at SuppressWarnings("SameParameterValue")
-class Decoding {
-
- static class FC {
- int F, C;
- }
-
- static class AriDecoder {
- final FC[] fc = new FC[256];
- byte[] R;
- }
-
- static class RansDecSymbol {
- int start; // Start of range.
- int freq; // Symbol frequency.
- }
-
- // Initialize a decoder symbol to start "start" and frequency "freq"
- static void RansDecSymbolInit(final RansDecSymbol symbol, final int start, final int freq) {
- assert (start <= (1 << 16));
- assert (freq <= (1 << 16) - start);
- symbol.start = start;
- symbol.freq = freq;
- }
-
- // Advances in the bit stream by "popping" a single symbol with range start
- // "start" and frequency "freq". All frequencies are assumed to sum to
- // "1 << scale_bits".
- // No renormalization or output happens.
- private static int RansDecAdvanceStep(final int r, final int start, final int freq, final int scale_bits) {
- final int mask = ((1 << scale_bits) - 1);
-
- // s, x = D(x)
- return freq * (r >> scale_bits) + (r & mask) - start;
- }
-
- // Equivalent to RansDecAdvanceStep that takes a symbol.
- static int RansDecAdvanceSymbolStep(final int r, final RansDecSymbol sym, final int scale_bits) {
- return RansDecAdvanceStep(r, sym.start, sym.freq, scale_bits);
- }
-
- // Returns the current cumulative frequency (map it to a symbol yourself!)
- static int RansDecGet(final int r, final int scale_bits) {
- return r & ((1 << scale_bits) - 1);
- }
-
- // Equivalent to RansDecAdvance that takes a symbol.
- static int RansDecAdvanceSymbol(final int r, final ByteBuffer pptr, final RansDecSymbol sym,
- final int scale_bits) {
- return Decoding
- .RansDecAdvance(r, pptr, sym.start, sym.freq, scale_bits);
- }
-
- // Advances in the bit stream by "popping" a single symbol with range start
- // "start" and frequency "freq". All frequencies are assumed to sum to
- // "1 << scale_bits",
- // and the resulting bytes get written to ptr (which is updated).
- private static int RansDecAdvance(int r, final ByteBuffer pptr, final int start, final int freq,
- final int scale_bits) {
- final int mask = (1 << scale_bits) - 1;
-
- // s, x = D(x)
- r = freq * (r >> scale_bits) + (r & mask) - start;
-
- // re-normalize
- if (r < Constants.RANS_BYTE_L) {
- do {
- final int b = 0xFF & pptr.get();
- r = (r << 8) | b;
- } while (r < Constants.RANS_BYTE_L);
-
- }
-
- return r;
- }
-
- // Re-normalize.
- static int RansDecRenormalize(int r, final ByteBuffer pptr) {
- // re-normalize
- if (r < Constants.RANS_BYTE_L) {
- do
- r = (r << 8) | (0xFF & pptr.get());
- while (r < Constants.RANS_BYTE_L);
- }
-
- return r;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java
deleted file mode 100644
index 456520f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/E04.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-
-class E04 {
-
- static int compress(final ByteBuffer in, final RansEncSymbol[] syms,
- final ByteBuffer cp) {
- final int cdata_size;
- final int in_size = in.remaining();
- int rans0, rans1, rans2, rans3;
- final ByteBuffer ptr = cp.slice();
-
- rans0 = Constants.RANS_BYTE_L;
- rans1 = Constants.RANS_BYTE_L;
- rans2 = Constants.RANS_BYTE_L;
- rans3 = Constants.RANS_BYTE_L;
-
- int i;
- switch (i = (in_size & 3)) {
- case 3:
- rans2 = Encoding.RansEncPutSymbol(rans2, ptr,
- syms[0xFF & in.get(in_size - (i - 2))]);
- case 2:
- rans1 = Encoding.RansEncPutSymbol(rans1, ptr,
- syms[0xFF & in.get(in_size - (i - 1))]);
- case 1:
- rans0 = Encoding.RansEncPutSymbol(rans0, ptr,
- syms[0xFF & in.get(in_size - (i))]);
- case 0:
- break;
- }
- for (i = (in_size & ~3); i > 0; i -= 4) {
- final int c3 = 0xFF & in.get(i - 1);
- final int c2 = 0xFF & in.get(i - 2);
- final int c1 = 0xFF & in.get(i - 3);
- final int c0 = 0xFF & in.get(i - 4);
-
- rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3]);
- rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[c2]);
- rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[c1]);
- rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[c0]);
- }
-
- ptr.putInt(rans3);
- ptr.putInt(rans2);
- ptr.putInt(rans1);
- ptr.putInt(rans0);
- ptr.flip();
- cdata_size = ptr.limit();
- // reverse the compressed bytes, so that they become in REVERSE
- // order:
- Utils.reverse(ptr);
- in.position(in.limit());
- return cdata_size;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java
deleted file mode 100644
index 01602c6..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/E14.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
- at SuppressWarnings("UnusedAssignment")
-class E14 {
-
- static int compress(final ByteBuffer in, final RansEncSymbol[][] syms,
- final ByteBuffer out_buf) {
- final int in_size = in.remaining();
- final int compressedBlob_size;
- int rans0, rans1, rans2, rans3;
- rans0 = Constants.RANS_BYTE_L;
- rans1 = Constants.RANS_BYTE_L;
- rans2 = Constants.RANS_BYTE_L;
- rans3 = Constants.RANS_BYTE_L;
-
- /*
- * Slicing is needed for buffer reversing later.
- */
- final ByteBuffer ptr = out_buf.slice();
-
- final int isz4 = in_size >> 2;
- int i0 = isz4 - 2;
- int i1 = 2 * isz4 - 2;
- int i2 = 3 * isz4 - 2;
- int i3 = 4 * isz4 - 2;
-
- int l0 = 0;
- if (i0 + 1 >= 0)
- l0 = 0xFF & in.get(i0 + 1);
- int l1 = 0;
- if (i1 + 1 >= 0)
- l1 = 0xFF & in.get(i1 + 1);
- int l2 = 0;
- if (i2 + 1 >= 0)
- l2 = 0xFF & in.get(i2 + 1);
- int l3;
-
- // Deal with the remainder
- l3 = 0xFF & in.get(in_size - 1);
- for (i3 = in_size - 2; i3 > 4 * isz4 - 2 && i3 >= 0; i3--) {
- final int c3 = 0xFF & in.get(i3 > -1 ? i3 : 0);
- rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3][l3]);
- l3 = c3;
- }
-
- for (; i0 >= 0; i0--, i1--, i2--, i3--) {
- final int c0 = 0xFF & in.get(i0);
- final int c1 = 0xFF & in.get(i1);
- final int c2 = 0xFF & in.get(i2);
- final int c3 = 0xFF & in.get(i3);
-
- rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[c3][l3]);
- rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[c2][l2]);
- rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[c1][l1]);
- rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[c0][l0]);
-
- l0 = c0;
- l1 = c1;
- l2 = c2;
- l3 = c3;
- }
-
- rans3 = Encoding.RansEncPutSymbol(rans3, ptr, syms[0][l3]);
- rans2 = Encoding.RansEncPutSymbol(rans2, ptr, syms[0][l2]);
- rans1 = Encoding.RansEncPutSymbol(rans1, ptr, syms[0][l1]);
- rans0 = Encoding.RansEncPutSymbol(rans0, ptr, syms[0][l0]);
-
- ptr.order(ByteOrder.BIG_ENDIAN);
- ptr.putInt(rans3);
- ptr.putInt(rans2);
- ptr.putInt(rans1);
- ptr.putInt(rans0);
- ptr.flip();
- compressedBlob_size = ptr.limit();
- Utils.reverse(ptr);
- /*
- * Depletion of the in buffer cannot be confirmed because of the get(int
- * position) method use during encoding, hence enforcing:
- */
- in.position(in.limit());
- return compressedBlob_size;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java
deleted file mode 100644
index 069b946..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Encoding.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
- at SuppressWarnings("SameParameterValue")
-class Encoding {
-
- static class RansEncSymbol {
- int x_max; // (Exclusive) upper bound of pre-normalization interval
- int rcp_freq; // Fixed-point reciprocal frequency
- int bias; // Bias
- int cmpl_freq; // Complement of frequency: (1 << scale_bits) - freq
- int rcp_shift; // Reciprocal shift
- }
-
- static void RansEncSymbolInit(final RansEncSymbol s, final int start, final int freq,
- final int scale_bits) {
- // RansAssert(scale_bits <= 16); RansAssert(start <= (1u <<
- // scale_bits)); RansAssert(freq <= (1u << scale_bits) - start);
-
- s.x_max = ((Constants.RANS_BYTE_L >> scale_bits) << 8) * freq;
- s.cmpl_freq = (1 << scale_bits) - freq;
- if (freq < 2) {
- s.rcp_freq = (int) ~0L;
- s.rcp_shift = 0;
- s.bias = start + (1 << scale_bits) - 1;
- } else {
- // Alverson, "Integer Division using reciprocals"
- // shift=ceil(log2(freq))
- int shift = 0;
- while (freq > (1L << shift))
- shift++;
-
- s.rcp_freq = (int) (((1L << (shift + 31)) + freq - 1) / freq);
- s.rcp_shift = shift - 1;
-
- // With these values, 'q' is the correct quotient, so we
- // have bias=start.
- s.bias = start;
- }
-
- s.rcp_shift += 32; // Avoid the extra >>32 in RansEncPutSymbol
- }
-
- static int RansEncPutSymbol(int r, final ByteBuffer ptr, final RansEncSymbol sym) {
- assert (sym.x_max != 0); // can't encode symbol with freq=0
-
- // re-normalize
- int x = r;
- final int x_max = sym.x_max;
- if (x >= x_max) {
- if (x >= x_max) {
- ptr.put((byte) (x & 0xFF));
- x >>= 8;
- if (x >= x_max) {
- ptr.put((byte) (x & 0xFF));
- x >>= 8;
- }
- }
- }
-
- // x = C(s,x)
- // NOTE: written this way so we get a 32-bit "multiply high" when
- // available. If you're on a 64-bit platform with cheap multiplies
- // (e.g. x64), just bake the +32 into rcp_shift.
- // int q = (int) (((uint64_t)x * sym.rcp_freq) >> 32) >> sym.rcp_shift;
-
- // The extra >>32 has already been added to RansEncSymbolInit
- final long q = ((x * (0xFFFFFFFFL & sym.rcp_freq)) >> sym.rcp_shift);
- r = (int) (x + sym.bias + q * sym.cmpl_freq);
- return r;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java
deleted file mode 100644
index bf6fc5d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Frequencies.java
+++ /dev/null
@@ -1,331 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
- at SuppressWarnings({"ConstantConditions", "StatementWithEmptyBody"})
-class Frequencies {
-
- static void readStats_o0(final ByteBuffer cp, final Decoding.AriDecoder decoder, final Decoding.RansDecSymbol[] syms) {
- // Pre-compute reverse lookup of frequency.
- int rle = 0;
- int x = 0;
- int j = cp.get() & 0xFF;
- do {
- if (decoder.fc[j] == null)
- decoder.fc[j] = new Decoding.FC();
- if ((decoder.fc[j].F = (cp.get() & 0xFF)) >= 128) {
- decoder.fc[j].F &= ~128;
- decoder.fc[j].F = ((decoder.fc[j].F & 127) << 8) | (cp.get() & 0xFF);
- }
- decoder.fc[j].C = x;
-
- Decoding.RansDecSymbolInit(syms[j], decoder.fc[j].C, decoder.fc[j].F);
-
- /* Build reverse lookup table */
- if (decoder.R == null)
- decoder.R = new byte[Constants.TOTFREQ];
- Arrays.fill(decoder.R, x, x + decoder.fc[j].F, (byte) j);
-
- x += decoder.fc[j].F;
-
- if (rle == 0 && j + 1 == (0xFF & cp.get(cp.position()))) {
- j = cp.get() & 0xFF;
- rle = cp.get() & 0xFF;
- } else if (rle != 0) {
- rle--;
- j++;
- } else {
- j = cp.get() & 0xFF;
- }
- } while (j != 0);
-
- assert (x < Constants.TOTFREQ);
- }
-
- static void readStats_o1(final ByteBuffer cp, final Decoding.AriDecoder[] D,
- final Decoding.RansDecSymbol[][] syms) {
- int rle_i = 0;
- int i = 0xFF & cp.get();
- do {
- int rle_j = 0;
- int x = 0;
- int j = 0xFF & cp.get();
- if (D[i] == null)
- D[i] = new Decoding.AriDecoder();
- do {
- if (D[i].fc[j] == null)
- D[i].fc[j] = new Decoding.FC();
- if ((D[i].fc[j].F = (0xFF & cp.get())) >= 128) {
- D[i].fc[j].F &= ~128;
- D[i].fc[j].F = ((D[i].fc[j].F & 127) << 8)
- | (0xFF & cp.get());
- }
- D[i].fc[j].C = x;
-
- if (D[i].fc[j].F == 0)
- D[i].fc[j].F = Constants.TOTFREQ;
-
- if (syms[i][j] == null)
- syms[i][j] = new Decoding.RansDecSymbol();
-
- Decoding.RansDecSymbolInit(syms[i][j], D[i].fc[j].C,
- D[i].fc[j].F);
-
- /* Build reverse lookup table */
- if (D[i].R == null)
- D[i].R = new byte[Constants.TOTFREQ];
- Arrays.fill(D[i].R, x, x + D[i].fc[j].F, (byte) j);
-
- x += D[i].fc[j].F;
- assert (x <= Constants.TOTFREQ);
-
- if (rle_j == 0 && j + 1 == (0xFF & cp.get(cp.position()))) {
- j = (0xFF & cp.get());
- rle_j = (0xFF & cp.get());
- } else if (rle_j != 0) {
- rle_j--;
- j++;
- } else {
- j = (0xFF & cp.get());
- }
- } while (j != 0);
-
- if (rle_i == 0 && i + 1 == (0xFF & cp.get(cp.position()))) {
- i = (0xFF & cp.get());
- rle_i = (0xFF & cp.get());
- } else if (rle_i != 0) {
- rle_i--;
- i++;
- } else {
- i = (0xFF & cp.get());
- }
- } while (i != 0);
- }
-
- static int[] calcFrequencies_o0(final ByteBuffer in) {
- final int in_size = in.remaining();
-
- // Compute statistics
- final int[] F = new int[256];
- int T = 0;
- for (int i = 0; i < in_size; i++) {
- F[0xFF & in.get()]++;
- T++;
- }
- final long tr = ((long) Constants.TOTFREQ << 31) / T + (1 << 30) / T;
-
- // Normalise so T[i] == TOTFREQ
- int m = 0, M = 0;
- for (int j = 0; j < 256; j++) {
- if (m < F[j]) {
- m = F[j];
- M = j;
- }
- }
-
- int fsum = 0;
- for (int j = 0; j < 256; j++) {
- if (F[j] == 0)
- continue;
- if ((F[j] = (int) ((F[j] * tr) >> 31)) == 0)
- F[j] = 1;
- fsum += F[j];
- }
-
- fsum++;
- if (fsum < Constants.TOTFREQ)
- F[M] += Constants.TOTFREQ - fsum;
- else
- F[M] -= fsum - Constants.TOTFREQ;
-
- assert (F[M] > 0);
- return F;
- }
-
- static int[][] calcFrequencies_o1(final ByteBuffer in) {
- final int in_size = in.remaining();
-
- final int[][] F = new int[256][256];
- final int[] T = new int[256];
- int c;
-
- int last_i = 0;
- for (int i = 0; i < in_size; i++) {
- F[last_i][c = (0xFF & in.get())]++;
- T[last_i]++;
- last_i = c;
- }
- F[0][0xFF & in.get((in_size >> 2))]++;
- F[0][0xFF & in.get(2 * (in_size >> 2))]++;
- F[0][0xFF & in.get(3 * (in_size >> 2))]++;
- T[0] += 3;
-
- for (int i = 0; i < 256; i++) {
- if (T[i] == 0)
- continue;
-
- final double p = ((double) Constants.TOTFREQ) / T[i];
- int t2 = 0, m = 0, M = 0;
- for (int j = 0; j < 256; j++) {
- if (F[i][j] == 0)
- continue;
-
- if (m < F[i][j]) {
- m = F[i][j];
- M = j;
- }
-
- if ((F[i][j] *= p) == 0)
- F[i][j] = 1;
- t2 += F[i][j];
- }
-
- t2++;
- if (t2 < Constants.TOTFREQ)
- F[i][M] += Constants.TOTFREQ - t2;
- else
- F[i][M] -= t2 - Constants.TOTFREQ;
- }
-
- return F;
- }
-
- static RansEncSymbol[] buildSyms_o0(final int[] F) {
- final int[] C = new int[256];
- final RansEncSymbol[] syms = new RansEncSymbol[256];
- for (int i = 0; i < syms.length; i++)
- syms[i] = new RansEncSymbol();
-
- int T = 0;
- for (int j = 0; j < 256; j++) {
- C[j] = T;
- T += F[j];
- if (F[j] != 0) {
- Encoding.RansEncSymbolInit(syms[j], C[j], F[j],
- Constants.TF_SHIFT);
- }
- }
- return syms;
- }
-
- static int writeFrequencies_o0(final ByteBuffer cp, final int[] F) {
- final int start = cp.position();
-
- int rle = 0;
- for (int j = 0; j < 256; j++) {
- if (F[j] != 0) {
- // j
- if (rle != 0) {
- rle--;
- } else {
- cp.put((byte) j);
- if (rle == 0 && j != 0 && F[j - 1] != 0) {
- for (rle = j + 1; rle < 256 && F[rle] != 0; rle++)
- ;
- rle -= j + 1;
- cp.put((byte) rle);
- }
- }
-
- // F[j]
- if (F[j] < 128) {
- cp.put((byte) (F[j]));
- } else {
- cp.put((byte) (128 | (F[j] >> 8)));
- cp.put((byte) (F[j] & 0xff));
- }
- }
- }
-
- cp.put((byte) 0);
- return cp.position() - start;
- }
-
- static RansEncSymbol[][] buildSyms_o1(final int[][] F) {
- final RansEncSymbol[][] syms = new RansEncSymbol[256][256];
- for (int i = 0; i < syms.length; i++)
- for (int j = 0; j < syms[i].length; j++)
- syms[i][j] = new RansEncSymbol();
-
- for (int i = 0; i < 256; i++) {
- final int[] F_i_ = F[i];
- int x = 0;
- for (int j = 0; j < 256; j++) {
- if (F_i_[j] != 0) {
- Encoding.RansEncSymbolInit(syms[i][j], x, F_i_[j],
- Constants.TF_SHIFT);
- x += F_i_[j];
- }
- }
- }
-
- return syms;
- }
-
- static int writeFrequencies_o1(final ByteBuffer cp, final int[][] F) {
- final int start = cp.position();
- final int[] T = new int[256];
-
- for (int i = 0; i < 256; i++)
- for (int j = 0; j < 256; j++)
- T[i] += F[i][j];
-
- int rle_i = 0;
- for (int i = 0; i < 256; i++) {
- if (T[i] == 0)
- continue;
-
- // Store frequency table
- // i
- if (rle_i != 0) {
- rle_i--;
- } else {
- cp.put((byte) i);
- // FIXME: could use order-0 statistics to observe which alphabet
- // symbols are present and base RLE on that ordering instead.
- if (i != 0 && T[i - 1] != 0) {
- for (rle_i = i + 1; rle_i < 256 && T[rle_i] != 0; rle_i++)
- ;
- rle_i -= i + 1;
- cp.put((byte) rle_i);
- }
- }
-
- final int[] F_i_ = F[i];
- int rle_j = 0;
- for (int j = 0; j < 256; j++) {
- if (F_i_[j] != 0) {
-
- // j
- if (rle_j != 0) {
- rle_j--;
- } else {
- cp.put((byte) j);
- if (rle_j == 0 && j != 0 && F_i_[j - 1] != 0) {
- for (rle_j = j + 1; rle_j < 256 && F_i_[rle_j] != 0; rle_j++)
- ;
- rle_j -= j + 1;
- cp.put((byte) rle_j);
- }
- }
-
- // F_i_[j]
- if (F_i_[j] < 128) {
- cp.put((byte) F_i_[j]);
- } else {
- cp.put((byte) (128 | (F_i_[j] >> 8)));
- cp.put((byte) (F_i_[j] & 0xff));
- }
- }
- }
- cp.put((byte) 0);
- }
- cp.put((byte) 0);
-
- return cp.position() - start;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java
deleted file mode 100644
index c75881a..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/RANS.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import htsjdk.samtools.cram.encoding.rans.Encoding.RansEncSymbol;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-public class RANS {
- public enum ORDER {
- ZERO, ONE;
-
- public static ORDER fromInt(final int value) {
- try {
- return ORDER.values()[value];
- } catch (final ArrayIndexOutOfBoundsException e) {
- throw new RuntimeException("Unknown rANS order: " + value);
- }
- }
- }
-
- private static final int ORDER_BYTE_LENGTH = 1;
- private static final int COMPRESSED_BYTE_LENGTH = 4;
- private static final int RAW_BYTE_LENGTH = 4;
- private static final int PREFIX_BYTE_LENGTH = ORDER_BYTE_LENGTH
- + COMPRESSED_BYTE_LENGTH + RAW_BYTE_LENGTH;
- private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0);
-
- public static ByteBuffer uncompress(final ByteBuffer in, ByteBuffer out) {
- if (in.remaining() == 0)
- return ByteBuffer.allocate(0);
-
- final ORDER order = ORDER.fromInt(in.get());
-
- in.order(ByteOrder.LITTLE_ENDIAN);
- final int in_sz = in.getInt();
- if (in_sz != in.remaining() - RAW_BYTE_LENGTH)
- throw new RuntimeException("Incorrect input length.");
- final int out_sz = in.getInt();
- if (out == null)
- out = ByteBuffer.allocate(out_sz);
- else
- out.limit(out_sz);
- if (out.remaining() < out_sz)
- throw new RuntimeException("Output buffer too small to fit "
- + out_sz + " bytes.");
-
- switch (order) {
- case ZERO:
- return uncompress_order0_way4(in, out);
-
- case ONE:
- return uncompress_order1_way4(in, out);
-
- default:
- throw new RuntimeException("Unknown rANS order: " + order);
- }
- }
-
- public static ByteBuffer compress(final ByteBuffer in, final ORDER order, final ByteBuffer out) {
- if (in.remaining() == 0)
- return EMPTY_BUFFER;
-
- if (in.remaining() < 4)
- return encode_order0_way4(in, out);
-
- switch (order) {
- case ZERO:
- return encode_order0_way4(in, out);
- case ONE:
- return encode_order1_way4(in, out);
-
- default:
- throw new RuntimeException("Unknown rANS order: " + order);
- }
- }
-
- private static ByteBuffer allocateIfNeeded(final int in_size,
- final ByteBuffer out_buf) {
- final int compressedSize = (int) (1.05 * in_size + 257 * 257 * 3 + 4);
- if (out_buf == null)
- return ByteBuffer.allocate(compressedSize);
- if (out_buf.remaining() < compressedSize)
- throw new RuntimeException("Insufficient buffer size.");
- out_buf.order(ByteOrder.LITTLE_ENDIAN);
- return out_buf;
- }
-
- private static ByteBuffer encode_order0_way4(final ByteBuffer in,
- ByteBuffer out_buf) {
- final int in_size = in.remaining();
- out_buf = allocateIfNeeded(in_size, out_buf);
- final int freqTableStart = PREFIX_BYTE_LENGTH;
- out_buf.position(freqTableStart);
-
- final int[] F = Frequencies.calcFrequencies_o0(in);
- final RansEncSymbol[] syms = Frequencies.buildSyms_o0(F);
-
- final ByteBuffer cp = out_buf.slice();
- final int frequencyTable_size = Frequencies.writeFrequencies_o0(cp, F);
-
- in.rewind();
- final int compressedBlob_size = E04.compress(in, syms, cp);
-
- finalizeCompressed(0, out_buf, in_size, frequencyTable_size,
- compressedBlob_size);
- return out_buf;
- }
-
- private static ByteBuffer encode_order1_way4(final ByteBuffer in,
- ByteBuffer out_buf) {
- final int in_size = in.remaining();
- out_buf = allocateIfNeeded(in_size, out_buf);
- final int freqTableStart = PREFIX_BYTE_LENGTH;
- out_buf.position(freqTableStart);
-
- final int[][] F = Frequencies.calcFrequencies_o1(in);
- final RansEncSymbol[][] syms = Frequencies.buildSyms_o1(F);
-
- final ByteBuffer cp = out_buf.slice();
- final int frequencyTable_size = Frequencies.writeFrequencies_o1(cp, F);
-
- in.rewind();
- final int compressedBlob_size = E14.compress(in, syms, cp);
-
- finalizeCompressed(1, out_buf, in_size, frequencyTable_size,
- compressedBlob_size);
- return out_buf;
- }
-
- private static void finalizeCompressed(final int order, final ByteBuffer out_buf,
- final int in_size, final int frequencyTable_size, final int compressedBlob_size) {
- out_buf.limit(PREFIX_BYTE_LENGTH + frequencyTable_size
- + compressedBlob_size);
- out_buf.put(0, (byte) order);
- out_buf.order(ByteOrder.LITTLE_ENDIAN);
- final int compressedSizeOffset = ORDER_BYTE_LENGTH;
- out_buf.putInt(compressedSizeOffset, frequencyTable_size
- + compressedBlob_size);
- final int rawSizeOffset = ORDER_BYTE_LENGTH + COMPRESSED_BYTE_LENGTH;
- out_buf.putInt(rawSizeOffset, in_size);
- out_buf.rewind();
- }
-
- private static ByteBuffer uncompress_order0_way4(final ByteBuffer in,
- final ByteBuffer out) {
- in.order(ByteOrder.LITTLE_ENDIAN);
- final Decoding.AriDecoder D = new Decoding.AriDecoder();
- final Decoding.RansDecSymbol[] syms = new Decoding.RansDecSymbol[256];
- for (int i = 0; i < syms.length; i++)
- syms[i] = new Decoding.RansDecSymbol();
-
- Frequencies.readStats_o0(in, D, syms);
-
- D04.uncompress(in, D, syms, out);
-
- return out;
- }
-
- private static ByteBuffer uncompress_order1_way4(final ByteBuffer in,
- final ByteBuffer out_buf) {
- final Decoding.AriDecoder[] D = new Decoding.AriDecoder[256];
- final Decoding.RansDecSymbol[][] syms = new Decoding.RansDecSymbol[256][256];
- for (int i = 0; i < syms.length; i++)
- for (int j = 0; j < syms[i].length; j++)
- syms[i][j] = new Decoding.RansDecSymbol();
- Frequencies.readStats_o1(in, D, syms);
-
- D14.uncompress(in, out_buf, D, syms);
-
- return out_buf;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java b/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java
deleted file mode 100644
index e424c20..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/rans/Utils.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import java.nio.ByteBuffer;
-
-class Utils {
- private static void reverse(final byte[] array, final int offset, final int size) {
- if (array == null) {
- return;
- }
- int i = offset;
- int j = offset + size - 1;
- byte tmp;
- while (j > i) {
- tmp = array[j];
- array[j] = array[i];
- array[i] = tmp;
- j--;
- i++;
- }
- }
-
- static void reverse(final ByteBuffer ptr) {
- byte tmp;
- if (ptr.hasArray()) {
- reverse(ptr.array(), ptr.arrayOffset(), ptr.limit());
- } else {
- for (int i = 0; i < ptr.limit(); i++) {
- tmp = ptr.get(i);
- ptr.put(i, ptr.get(ptr.limit() - i - 1));
- ptr.put(ptr.limit() - i - 1, tmp);
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java
deleted file mode 100644
index 83446f4..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/AbstractReader.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.cram.common.IntHashMap;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.nio.charset.Charset;
-
- at SuppressWarnings({"WeakerAccess", "UnusedDeclaration"})
-public abstract class AbstractReader {
- final Charset charset = Charset.forName("UTF8");
- public boolean captureReadNames = false;
- public byte[][][] tagIdDictionary;
-
- @DataSeries(key = EncodingKey.BF_BitFlags, type = DataSeriesType.INT)
- public DataReader<Integer> bitFlagsCodec;
-
- @DataSeries(key = EncodingKey.CF_CompressionBitFlags, type = DataSeriesType.BYTE)
- public DataReader<Byte> compressionBitFlagsCodec;
-
- @DataSeries(key = EncodingKey.RL_ReadLength, type = DataSeriesType.INT)
- public DataReader<Integer> readLengthCodec;
-
- @DataSeries(key = EncodingKey.AP_AlignmentPositionOffset, type = DataSeriesType.INT)
- public DataReader<Integer> alignmentStartCodec;
-
- @DataSeries(key = EncodingKey.RG_ReadGroup, type = DataSeriesType.INT)
- public DataReader<Integer> readGroupCodec;
-
- @DataSeries(key = EncodingKey.RN_ReadName, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> readNameCodec;
-
- @DataSeries(key = EncodingKey.NF_RecordsToNextFragment, type = DataSeriesType.INT)
- public DataReader<Integer> distanceToNextFragmentCodec;
-
- @DataSeriesMap(name = "TAG")
- public IntHashMap<DataReader<byte[]>> tagValueCodecs;
-
- @DataSeries(key = EncodingKey.FN_NumberOfReadFeatures, type = DataSeriesType.INT)
- public DataReader<Integer> numberOfReadFeaturesCodec;
-
- @DataSeries(key = EncodingKey.FP_FeaturePosition, type = DataSeriesType.INT)
- public DataReader<Integer> readFeaturePositionCodec;
-
- @DataSeries(key = EncodingKey.FC_FeatureCode, type = DataSeriesType.BYTE)
- public DataReader<Byte> readFeatureCodeCodec;
-
- @DataSeries(key = EncodingKey.BA_Base, type = DataSeriesType.BYTE)
- public DataReader<Byte> baseCodec;
-
- @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE)
- public DataReader<Byte> qualityScoreCodec;
-
- @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> qualityScoresCodec;
-
- @DataSeries(key = EncodingKey.BS_BaseSubstitutionCode, type = DataSeriesType.BYTE)
- public DataReader<Byte> baseSubstitutionCodec;
-
- @DataSeries(key = EncodingKey.IN_Insertion, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> insertionCodec;
-
- @DataSeries(key = EncodingKey.SC_SoftClip, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> softClipCodec;
-
- @DataSeries(key = EncodingKey.HC_HardClip, type = DataSeriesType.INT)
- public DataReader<Integer> hardClipCodec;
-
- @DataSeries(key = EncodingKey.PD_padding, type = DataSeriesType.INT)
- public DataReader<Integer> paddingCodec;
-
- @DataSeries(key = EncodingKey.DL_DeletionLength, type = DataSeriesType.INT)
- public DataReader<Integer> deletionLengthCodec;
-
- @DataSeries(key = EncodingKey.MQ_MappingQualityScore, type = DataSeriesType.INT)
- public DataReader<Integer> mappingScoreCodec;
-
- @DataSeries(key = EncodingKey.MF_MateBitFlags, type = DataSeriesType.BYTE)
- public DataReader<Byte> mateBitFlagCodec;
-
- @DataSeries(key = EncodingKey.NS_NextFragmentReferenceSequenceID, type = DataSeriesType.INT)
- public DataReader<Integer> mateReferenceIdCodec;
-
- @DataSeries(key = EncodingKey.NP_NextFragmentAlignmentStart, type = DataSeriesType.INT)
- public DataReader<Integer> mateAlignmentStartCodec;
-
- @DataSeries(key = EncodingKey.TS_InsetSize, type = DataSeriesType.INT)
- public DataReader<Integer> insertSizeCodec;
-
- @DataSeries(key = EncodingKey.TL_TagIdList, type = DataSeriesType.INT)
- public DataReader<Integer> tagIdListCodec;
-
- @DataSeries(key = EncodingKey.RI_RefId, type = DataSeriesType.INT)
- public DataReader<Integer> refIdCodec;
-
- @DataSeries(key = EncodingKey.RS_RefSkip, type = DataSeriesType.INT)
- public DataReader<Integer> refSkipCodec;
-
- @DataSeries(key = EncodingKey.BB_bases, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> basesCodec;
-
- @DataSeries(key = EncodingKey.QQ_scores, type = DataSeriesType.BYTE_ARRAY)
- public DataReader<byte[]> scoresCodec;
-
- public int refId;
- SubstitutionMatrix substitutionMatrix;
- public boolean APDelta = true;
-
- static int detachedCount = 0;
- int recordCounter = 0;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java
deleted file mode 100644
index 7cbd98d..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/CramRecordReader.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.SAMFormatException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Bases;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.Scores;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-
-import java.util.LinkedList;
-
-public class CramRecordReader extends AbstractReader {
- private CramCompressionRecord prevRecord;
- private ValidationStringency validationStringency;
-
- public CramRecordReader(ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- }
-
- @SuppressWarnings("ConstantConditions")
- public void read(final CramCompressionRecord cramRecord) {
- try {
- // int mark = testCodec.readData();
- // if (Writer.TEST_MARK != mark) {
- // System.err.println("Record counter=" + recordCount);
- // System.err.println(cramRecord.toString());
- // throw new RuntimeException("Test mark not found.");
- // }
-
- cramRecord.flags = bitFlagsCodec.readData();
- cramRecord.compressionFlags = compressionBitFlagsCodec.readData();
- if (refId == -2)
- cramRecord.sequenceId = refIdCodec.readData();
- else
- cramRecord.sequenceId = refId;
-
- cramRecord.readLength = readLengthCodec.readData();
- if (APDelta)
- cramRecord.alignmentDelta = alignmentStartCodec.readData();
- else
- cramRecord.alignmentStart = alignmentStartCodec.readData();
- cramRecord.readGroupID = readGroupCodec.readData();
-
- if (captureReadNames)
- cramRecord.readName = new String(readNameCodec.readData(), charset);
-
- // mate record:
- if (cramRecord.isDetached()) {
- cramRecord.mateFlags = mateBitFlagCodec.readData();
- if (!captureReadNames)
- cramRecord.readName = new String(readNameCodec.readData(), charset);
-
- cramRecord.mateSequenceID = mateReferenceIdCodec.readData();
- cramRecord.mateAlignmentStart = mateAlignmentStartCodec.readData();
- cramRecord.templateSize = insertSizeCodec.readData();
- detachedCount++;
- } else if (cramRecord.isHasMateDownStream())
- cramRecord.recordsToNextFragment = distanceToNextFragmentCodec.readData();
-
- final Integer tagIdList = tagIdListCodec.readData();
- final byte[][] ids = tagIdDictionary[tagIdList];
- if (ids.length > 0) {
- final int tagCount = ids.length;
- cramRecord.tags = new ReadTag[tagCount];
- for (int i = 0; i < ids.length; i++) {
- final int id = ReadTag.name3BytesToInt(ids[i]);
- final DataReader<byte[]> dataReader = tagValueCodecs.get(id);
- final ReadTag tag = new ReadTag(id, dataReader.readData(), validationStringency);
- cramRecord.tags[i] = tag;
- }
- }
-
- if (!cramRecord.isSegmentUnmapped()) {
- // reading read features:
- final int size = numberOfReadFeaturesCodec.readData();
- int prevPos = 0;
- final java.util.List<ReadFeature> readFeatures = new LinkedList<ReadFeature>();
- cramRecord.readFeatures = readFeatures;
- for (int i = 0; i < size; i++) {
- final Byte operator = readFeatureCodeCodec.readData();
-
- final int pos = prevPos + readFeaturePositionCodec.readData();
- prevPos = pos;
-
- switch (operator) {
- case ReadBase.operator:
- final ReadBase readBase = new ReadBase(pos, baseCodec.readData(), qualityScoreCodec.readData());
- readFeatures.add(readBase);
- break;
- case Substitution.operator:
- final Substitution substitution = new Substitution();
- substitution.setPosition(pos);
- final byte code = baseSubstitutionCodec.readData();
- substitution.setCode(code);
- readFeatures.add(substitution);
- break;
- case Insertion.operator:
- final Insertion insertion = new Insertion(pos, insertionCodec.readData());
- readFeatures.add(insertion);
- break;
- case SoftClip.operator:
- final SoftClip softClip = new SoftClip(pos, softClipCodec.readData());
- readFeatures.add(softClip);
- break;
- case HardClip.operator:
- final HardClip hardCLip = new HardClip(pos, hardClipCodec.readData());
- readFeatures.add(hardCLip);
- break;
- case Padding.operator:
- final Padding padding = new Padding(pos, paddingCodec.readData());
- readFeatures.add(padding);
- break;
- case Deletion.operator:
- final Deletion deletion = new Deletion(pos, deletionLengthCodec.readData());
- readFeatures.add(deletion);
- break;
- case RefSkip.operator:
- final RefSkip refSkip = new RefSkip(pos, refSkipCodec.readData());
- readFeatures.add(refSkip);
- break;
- case InsertBase.operator:
- final InsertBase insertBase = new InsertBase(pos, baseCodec.readData());
- readFeatures.add(insertBase);
- break;
- case BaseQualityScore.operator:
- final BaseQualityScore baseQualityScore = new BaseQualityScore(pos, qualityScoreCodec.readData());
- readFeatures.add(baseQualityScore);
- break;
- case Bases.operator:
- final Bases bases = new Bases(pos, basesCodec.readData());
- readFeatures.add(bases);
- break;
- case Scores.operator:
- final Scores scores = new Scores(pos, scoresCodec.readData());
- readFeatures.add(scores);
- break;
- default:
- throw new RuntimeException("Unknown read feature operator: " + operator);
- }
- }
-
- // mapping quality:
- cramRecord.mappingQuality = mappingScoreCodec.readData();
- if (cramRecord.isForcePreserveQualityScores()) {
- cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
- }
- } else {
- if (cramRecord.isUnknownBases()) {
- cramRecord.readBases = SAMRecord.NULL_SEQUENCE;
- cramRecord.qualityScores = SAMRecord.NULL_QUALS;
- } else {
- final byte[] bases = new byte[cramRecord.readLength];
- for (int i = 0; i < bases.length; i++)
- bases[i] = baseCodec.readData();
- cramRecord.readBases = bases;
-
-
- if (cramRecord.isForcePreserveQualityScores()) {
- cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
- }
- }
- }
-
- recordCounter++;
-
- prevRecord = cramRecord;
- }
- catch (final SAMFormatException e) {
- if (prevRecord != null) {
- System.err.printf("Failed at record %d. Here is the previously read record: %s\n", recordCounter,
- prevRecord.toString());
- }
- throw e;
- }
- catch (final Exception e) {
- if (prevRecord != null) {
- System.err.printf("Failed at record %d. Here is the previously read record: %s\n", recordCounter,
- prevRecord.toString());
- }
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java
deleted file mode 100644
index 47fba2f..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReader.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import java.io.IOException;
-
-/**
- * A basic interface for reading data. The details of what is data and from where to read are implementation specific. Pure consumer.
- *
- * @param <T> data type of the series to be read
- */
-public interface DataReader<T> {
-
- /**
- * Read a single object
- * @return an object or a primitive value read
- * @throws IOException as per java IO contract
- */
- T readData() throws IOException;
-
- /**
- * Read an array of specified length. Normally this is a byte array. The intent here is optimization: reading an array may be faster than reading elements one by one.
- * @param length the length of the array to be read
- * @return the array of objects
- * @throws IOException as per java IO contract
- */
- T readDataArray(int length) throws IOException;
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java
deleted file mode 100644
index 253ab15..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/DataReaderFactory.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.common.IntHashMap;
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.encoding.EncodingFactory;
-import htsjdk.samtools.cram.io.BitInputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class DataReaderFactory {
- private static Log log = Log.getInstance(DataReaderFactory.class);
-
- private final static boolean collectStats = false;
-
- public AbstractReader buildReader(final AbstractReader reader,
- final BitInputStream bitInputStream, final Map<Integer, InputStream> inputMap,
- final CompressionHeader header, final int refId) throws IllegalArgumentException {
- reader.captureReadNames = header.readNamesIncluded;
- reader.refId = refId;
- reader.APDelta = header.APDelta;
-
- for (final Field field : reader.getClass().getFields()) {
- if (field.isAnnotationPresent(DataSeries.class)) {
- final DataSeries dataSeries = field.getAnnotation(DataSeries.class);
- final EncodingKey key = dataSeries.key();
- final DataSeriesType type = dataSeries.type();
- if (header.encodingMap.get(key) != null) {
- try {
- field.set(reader,
- createReader(type, header.encodingMap.get(key), bitInputStream, inputMap));
- } catch (IllegalAccessException e) {
- throw new CRAMException(e);
- }
- }
- }
-
- if (field.isAnnotationPresent(DataSeriesMap.class)) {
- final DataSeriesMap dataSeriesMap = field.getAnnotation(DataSeriesMap.class);
- final String name = dataSeriesMap.name();
- if ("TAG".equals(name)) {
- final IntHashMap map = new IntHashMap();
- for (final Integer key : header.tMap.keySet()) {
- final EncodingParams params = header.tMap.get(key);
- final DataReader<byte[]> tagReader = createReader(
- DataSeriesType.BYTE_ARRAY, params, bitInputStream,
- inputMap);
- map.put(key, tagReader);
- }
- try {
- field.set(reader, map);
- } catch (IllegalAccessException e) {
- throw new CRAMException(e);
- }
- }
- }
- }
-
- reader.tagIdDictionary = header.dictionary;
- return reader;
- }
-
- private <T> DataReader<T> createReader(final DataSeriesType valueType,
- final EncodingParams params, final BitInputStream bitInputStream,
- final Map<Integer, InputStream> inputMap) {
- if (params.id == EncodingID.NULL)
- //noinspection ConstantConditions
- return collectStats ? new DataReaderWithStats(
- buildNullReader(valueType)) : buildNullReader(valueType);
-
- final EncodingFactory encodingFactory = new EncodingFactory();
- final Encoding<T> encoding = encodingFactory.createEncoding(valueType, params.id);
- if (encoding == null)
- throw new RuntimeException("Encoding not found for value type "
- + valueType.name() + ", id=" + params.id);
- encoding.fromByteArray(params.params);
-
- //noinspection ConstantConditions
- return collectStats ? new DataReaderWithStats(new DefaultDataReader<T>(
- encoding.buildCodec(inputMap, null), bitInputStream))
- : new DefaultDataReader<T>(encoding.buildCodec(inputMap, null),
- bitInputStream);
- }
-
- private static <T> DataReader<T> buildNullReader(final DataSeriesType valueType) {
- switch (valueType) {
- case BYTE:
- return (DataReader<T>) new SingleValueReader<Byte>((byte) 0);
- case INT:
- return (DataReader<T>) new SingleValueReader<Integer>(
- 0);
- case LONG:
- return (DataReader<T>) new SingleValueReader<Long>((long) 0);
- case BYTE_ARRAY:
- return (DataReader<T>) new SingleValueReader<byte[]>(new byte[]{});
-
- default:
- throw new RuntimeException("Unknown data type: " + valueType.name());
- }
- }
-
- private static class DefaultDataReader<T> implements DataReader<T> {
- private final BitCodec<T> codec;
- private final BitInputStream bitInputStream;
-
- public DefaultDataReader(final BitCodec<T> codec, final BitInputStream bitInputStream) {
- this.codec = codec;
- this.bitInputStream = bitInputStream;
- }
-
- @Override
- public T readData() throws IOException {
- return codec.read(bitInputStream);
- }
-
- @Override
- public T readDataArray(final int length) throws IOException {
- return codec.read(bitInputStream, length);
- }
-
- }
-
- private static class SingleValueReader<T> implements DataReader<T> {
- private final T value;
-
- public SingleValueReader(final T value) {
- this.value = value;
- }
-
- @Override
- public T readData() throws IOException {
- return value;
- }
-
- @Override
- public T readDataArray(final int length) {
- return value;
- }
- }
-
- public static class DataReaderWithStats<T> implements DataReader<T> {
- public long nanos = 0;
- final DataReader<T> delegate;
-
- public DataReaderWithStats(final DataReader<T> delegate) {
- this.delegate = delegate;
- }
-
- @Override
- public T readData() throws IOException {
- final long time = System.nanoTime();
- final T value = delegate.readData();
- nanos += System.nanoTime() - time;
- return value;
- }
-
- @Override
- public T readDataArray(final int length) throws IOException {
- final long time = System.nanoTime();
- final T value = delegate.readDataArray(length);
- nanos += System.nanoTime() - time;
- return value;
- }
- }
-
- public Map<String, DataReaderWithStats> getStats(final CramRecordReader reader)
- throws IllegalArgumentException, IllegalAccessException {
- final Map<String, DataReaderWithStats> map = new TreeMap<String, DataReaderFactory.DataReaderWithStats>();
- //noinspection ConstantConditions,PointlessBooleanExpression
- if (!collectStats)
- return map;
-
- for (final Field field : reader.getClass().getFields()) {
- if (field.isAnnotationPresent(DataSeries.class)) {
- final DataSeries dataSeries = field.getAnnotation(DataSeries.class);
- final EncodingKey key = dataSeries.key();
- map.put(key.name(), (DataReaderWithStats) field.get(reader));
- }
-
- if (field.isAnnotationPresent(DataSeriesMap.class)) {
- final DataSeriesMap dataSeriesMap = field.getAnnotation(DataSeriesMap.class);
- final String name = dataSeriesMap.name();
- if ("TAG".equals(name)) {
- final Map<Integer, DataReader<byte[]>> tagMap = (Map<Integer, DataReader<byte[]>>) field
- .get(reader);
- for (final Integer key : tagMap.keySet()) {
- final String tag = ReadTag.intToNameType4Bytes(key);
- map.put(tag, (DataReaderWithStats) tagMap.get(key));
- }
- }
- }
- }
-
- return map;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java b/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java
deleted file mode 100644
index 1289429..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/reader/RefSeqIdReader.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright 2013 EMBL-EBI
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- ******************************************************************************/
-package htsjdk.samtools.cram.encoding.reader;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Bases;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.Scores;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * A reader that only keeps track of alignment spans. The intended use is for
- * CRAI index.
- *
- * @author vadim
- *
- */
-public class RefSeqIdReader extends AbstractReader {
- /**
- * Reference sequence id set by default
- */
- private final int globalReferenceSequenceId;
-
- /**
- * Alignment start to start counting from
- */
- private int alignmentStart;
- private ValidationStringency validationStringency;
- /**
- * For diagnostic purposes
- */
- private int recordCounter = 0;
-
- /**
- * Single record to use for capturing read fields:
- */
- private final CramCompressionRecord cramRecord = new CramCompressionRecord();
-
- /**
- * Detected sequence spans
- */
- private final Map<Integer, AlignmentSpan> spans = new HashMap<>();
-
- public RefSeqIdReader(final int seqId, final int alignmentStart, ValidationStringency validationStringency) {
- super();
- this.globalReferenceSequenceId = seqId;
- this.alignmentStart = alignmentStart;
- this.validationStringency = validationStringency;
- }
-
- public Map<Integer, AlignmentSpan> getReferenceSpans() {
- return spans;
- }
-
- public void read() {
- cramRecord.sequenceId = globalReferenceSequenceId;
- try {
- cramRecord.flags = bitFlagsCodec.readData();
- cramRecord.compressionFlags = compressionBitFlagsCodec.readData();
- if (refId == Slice.MULTI_REFERENCE)
- cramRecord.sequenceId = refIdCodec.readData();
- else
- cramRecord.sequenceId = refId;
-
- cramRecord.readLength = readLengthCodec.readData();
- if (APDelta) {
- cramRecord.alignmentDelta = alignmentStartCodec.readData();
- alignmentStart += cramRecord.alignmentDelta;
- }
- else {
- cramRecord.alignmentStart = alignmentStartCodec.readData();
- alignmentStart = cramRecord.alignmentStart;
- }
-
- cramRecord.readGroupID = readGroupCodec.readData();
-
- if (captureReadNames)
- cramRecord.readName = new String(readNameCodec.readData(), charset);
-
- // mate record:
- if (cramRecord.isDetached()) {
- cramRecord.mateFlags = mateBitFlagCodec.readData();
- if (!captureReadNames)
- cramRecord.readName = new String(readNameCodec.readData(), charset);
-
- cramRecord.mateSequenceID = mateReferenceIdCodec.readData();
- cramRecord.mateAlignmentStart = mateAlignmentStartCodec.readData();
- cramRecord.templateSize = insertSizeCodec.readData();
- detachedCount++;
- } else if (cramRecord.isHasMateDownStream())
- cramRecord.recordsToNextFragment = distanceToNextFragmentCodec.readData();
-
- final Integer tagIdList = tagIdListCodec.readData();
- final byte[][] ids = tagIdDictionary[tagIdList];
- if (ids.length > 0) {
- final int tagCount = ids.length;
- cramRecord.tags = new ReadTag[tagCount];
- for (int i = 0; i < ids.length; i++) {
- final int id = ReadTag.name3BytesToInt(ids[i]);
- final DataReader<byte[]> dataReader = tagValueCodecs.get(id);
- final ReadTag tag = new ReadTag(id, dataReader.readData(), validationStringency);
- cramRecord.tags[i] = tag;
- }
- }
-
- if (!cramRecord.isSegmentUnmapped()) {
- // reading read features:
- final int size = numberOfReadFeaturesCodec.readData();
- int prevPos = 0;
- final java.util.List<ReadFeature> readFeatures = new LinkedList<>();
- cramRecord.readFeatures = readFeatures;
- for (int i = 0; i < size; i++) {
- final Byte operator = readFeatureCodeCodec.readData();
-
- final int pos = prevPos + readFeaturePositionCodec.readData();
- prevPos = pos;
-
- switch (operator) {
- case ReadBase.operator:
- final ReadBase readBase = new ReadBase(pos, baseCodec.readData(), qualityScoreCodec.readData());
- readFeatures.add(readBase);
- break;
- case Substitution.operator:
- final Substitution substitution = new Substitution();
- substitution.setPosition(pos);
- final byte code = baseSubstitutionCodec.readData();
- substitution.setCode(code);
- readFeatures.add(substitution);
- break;
- case Insertion.operator:
- final Insertion insertion = new Insertion(pos, insertionCodec.readData());
- readFeatures.add(insertion);
- break;
- case SoftClip.operator:
- final SoftClip softClip = new SoftClip(pos, softClipCodec.readData());
- readFeatures.add(softClip);
- break;
- case HardClip.operator:
- final HardClip hardCLip = new HardClip(pos, hardClipCodec.readData());
- readFeatures.add(hardCLip);
- break;
- case Padding.operator:
- final Padding padding = new Padding(pos, paddingCodec.readData());
- readFeatures.add(padding);
- break;
- case Deletion.operator:
- final Deletion deletion = new Deletion(pos, deletionLengthCodec.readData());
- readFeatures.add(deletion);
- break;
- case RefSkip.operator:
- final RefSkip refSkip = new RefSkip(pos, refSkipCodec.readData());
- readFeatures.add(refSkip);
- break;
- case InsertBase.operator:
- final InsertBase insertBase = new InsertBase(pos, baseCodec.readData());
- readFeatures.add(insertBase);
- break;
- case BaseQualityScore.operator:
- final BaseQualityScore baseQualityScore = new BaseQualityScore(pos,
- qualityScoreCodec.readData());
- readFeatures.add(baseQualityScore);
- break;
- case Bases.operator:
- final Bases bases = new Bases(pos, basesCodec.readData());
- readFeatures.add(bases);
- break;
- case Scores.operator:
- final Scores scores = new Scores(pos, scoresCodec.readData());
- readFeatures.add(scores);
- break;
- default:
- throw new RuntimeException("Unknown read feature operator: " + operator);
- }
- }
-
- // mapping quality:
- cramRecord.mappingQuality = mappingScoreCodec.readData();
- if (cramRecord.isForcePreserveQualityScores()) {
- cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
- }
- } else {
- if (cramRecord.isUnknownBases()) {
- cramRecord.readBases = SAMRecord.NULL_SEQUENCE;
- cramRecord.qualityScores = SAMRecord.NULL_QUALS;
- } else {
- final byte[] bases = new byte[cramRecord.readLength];
- for (int i = 0; i < bases.length; i++)
- bases[i] = baseCodec.readData();
- cramRecord.readBases = bases;
-
- if (cramRecord.isForcePreserveQualityScores()) {
- cramRecord.qualityScores = qualityScoresCodec.readDataArray(cramRecord.readLength);
- }
- }
- }
-
- recordCounter++;
-
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
-
- if (!spans.containsKey(cramRecord.sequenceId)) {
- spans.put(cramRecord.sequenceId, new AlignmentSpan(alignmentStart, cramRecord.readLength));
- } else
- spans.get(cramRecord.sequenceId).addSingle(alignmentStart, cramRecord.readLength);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java
deleted file mode 100644
index 41a69d2..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/BaseQualityScore.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single quality score in a read.
- */
-public class BaseQualityScore implements Serializable, ReadFeature {
-
- private int position;
- private byte qualityScore;
-
- public static final byte operator = 'Q';
-
- public BaseQualityScore(final int position, final byte qualityScore) {
- this.position = position;
- this.qualityScore = qualityScore;
- }
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- @Override
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public byte getQualityScore() {
- return qualityScore;
- }
-
- public void setQualityScore(final byte qualityScore) {
- this.qualityScore = qualityScore;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof BaseQualityScore))
- return false;
-
- final BaseQualityScore v = (BaseQualityScore) obj;
-
- return position == v.position && qualityScore == v.qualityScore;
-
- }
-
- @Override
- public String toString() {
- return new StringBuilder().append((char) operator).append('@')
- .append(position).append('#').appendCodePoint(qualityScore).toString();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java
deleted file mode 100644
index b2f066b..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Bases.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-public class Bases implements Serializable, ReadFeature {
-
- private int position;
- private byte[] bases;
-
- public byte[] getBases() {
- return bases;
- }
-
- public void setBases(final byte[] bases) {
- this.bases = bases;
- }
-
- public Bases() {
- }
-
- public Bases(final int position, final byte[] sequence) {
- this.position = position;
- this.bases = sequence;
- }
-
- public static final byte operator = 'b';
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- @Override
- public int getPosition() {
- return position;
- }
-
- @Override
- public void setPosition(final int position) {
- this.position = position;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Bases))
- return false;
-
- final Bases bases = (Bases) obj;
-
- return position == bases.position && !Arrays.equals(this.bases, bases.bases);
-
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + "position=" + position + "; bases=" + new String(bases) + "] ";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java
deleted file mode 100644
index b4a0181..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Deletion.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a deletion of one or more bases similar to {@link htsjdk.samtools.CigarOperator#D}.
- */
-public class Deletion implements Serializable, ReadFeature {
-
- private int position;
- private int length;
- public static final byte operator = 'D';
-
- public Deletion() {
- }
-
- public Deletion(final int position, final int length) {
- this.position = position;
- this.length = length;
- }
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- @Override
- public int getPosition() {
- return position;
- }
-
- @Override
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public int getLength() {
- return length;
- }
-
- public void setLength(final int length) {
- this.length = length;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Deletion))
- return false;
-
- final Deletion deleteion = (Deletion) obj;
-
- return position == deleteion.position && length == deleteion.length;
-
- }
-
- @Override
- public String toString() {
- return String.valueOf((char) operator) + '@' + position + '+' + length;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java
deleted file mode 100644
index 3c3c7ad..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/HardClip.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a hard clip similar to {@link htsjdk.samtools.CigarOperator#H}.
- */
-public class HardClip implements Serializable, ReadFeature {
- public static final byte operator = 'H';
-
- private int position;
- private int length;
-
- public HardClip() {
- }
-
- public HardClip(final int position, final int length) {
- this.position = position;
- this.length = length;
- }
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public int getLength() {
- return length;
- }
-
- public void setLength(final int length) {
- this.length = length;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof HardClip))
- return false;
-
- final HardClip hardClip = (HardClip) obj;
-
- return position == hardClip.position && length == hardClip.length;
-
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + "position=" + position + "; length=" + length + "] ";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java
deleted file mode 100644
index 5970413..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/InsertBase.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single insert base.
- */
-public class InsertBase implements Serializable, ReadFeature {
-
- private int position;
- private byte base;
- public static final byte operator = 'i';
-
- public InsertBase() {
- }
-
- public InsertBase(final int position, final byte base) {
- this.position = position;
- this.base = base;
- }
-
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof InsertBase))
- return false;
-
- final InsertBase insertBase = (InsertBase) obj;
-
- return position == insertBase.position && base == insertBase.base;
-
- }
-
- @Override
- public String toString() {
- return new StringBuilder().append((char) operator).append('@')
- .append(position).append('\\').appendCodePoint(base).toString();
- }
-
- public byte getBase() {
- return base;
- }
-
- public void setBase(final byte base) {
- this.base = base;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java
deleted file mode 100644
index e0182c3..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Insertion.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a multi-base insertion.
- */
-public class Insertion implements Serializable, ReadFeature {
-
- private int position;
- private byte[] sequence;
- public static final byte operator = 'I';
-
- public Insertion() {
- }
-
- public Insertion(final int position, final byte[] sequence) {
- this.position = position;
- this.sequence = sequence;
- }
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public byte[] getSequence() {
- return sequence;
- }
-
- public void setSequence(final byte[] sequence) {
- this.sequence = sequence;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Insertion))
- return false;
-
- final Insertion insertion = (Insertion) obj;
-
- return position == insertion.position && Arrays.equals(sequence, insertion.sequence);
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + "position=" + position + "; sequence=" + new String(sequence) + "] ";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java
deleted file mode 100644
index 85e90fd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Padding.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing padding, similar to {@link htsjdk.samtools.CigarOperator#P}.
- */
-public class Padding implements Serializable, ReadFeature {
-
- private int position;
- private int length;
- public static final byte operator = 'P';
-
- public Padding() {
- }
-
- public Padding(final int position, final int length) {
- this.position = position;
- this.length = length;
- }
-
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public int getLength() {
- return length;
- }
-
- public void setLength(final int length) {
- this.length = length;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Padding))
- return false;
-
- final Padding padding = (Padding) obj;
-
- return position == padding.position && length == padding.length;
-
- }
-
- @Override
- public String toString() {
- return String.valueOf((char) operator) + '@' + position + '+' + length;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java
deleted file mode 100644
index 73ae208..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadBase.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a single base with associated quality score.
- */
-public class ReadBase implements Serializable, ReadFeature {
-
- private int position;
- private byte base;
- private byte qualityScore;
-
- public static final byte operator = 'B';
-
- public ReadBase(final int position, final byte base, final byte qualityScore) {
- this.position = position;
- this.base = base;
- this.qualityScore = qualityScore;
- }
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- @Override
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public byte getQualityScore() {
- return qualityScore;
- }
-
- public void setQualityScore(final byte qualityScore) {
- this.qualityScore = qualityScore;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof ReadBase))
- return false;
-
- final ReadBase readBase = (ReadBase) obj;
-
- return position == readBase.position && base == readBase.base && qualityScore == readBase.qualityScore;
-
- }
-
- @Override
- public String toString() {
- return new StringBuilder(getClass().getSimpleName() + "[")
- .append("position=").append(position)
- .append("; base=").appendCodePoint(base)
- .append("; score=").appendCodePoint(qualityScore)
- .append("] ").toString();
- }
-
- public byte getBase() {
- return base;
- }
-
- public void setBase(final byte base) {
- this.base = base;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java
deleted file mode 100644
index 863cd18..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/ReadFeature.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-/**
- * An interface to capture data in read coordinates.
- */
-public interface ReadFeature {
- /**
- * @return zero-based position in the read
- */
- int getPosition();
-
- void setPosition(int position);
-
- /**
- * Read features are distinguished by operator, similar to cigar operator.
- * @return type of the read feature
- */
- byte getOperator();
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java
deleted file mode 100644
index 1b99f09..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/RefSkip.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A read feature representing a reference skip similar to {@link htsjdk.samtools.CigarOperator#N}.
- */
-public class RefSkip implements Serializable, ReadFeature {
-
- private int position;
- private int length;
- public static final byte operator = 'N';
-
- public RefSkip() {
- }
-
- public RefSkip(final int position, final int length) {
- this.position = position;
- this.length = length;
- }
-
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public int getLength() {
- return length;
- }
-
- public void setLength(final int length) {
- this.length = length;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof RefSkip))
- return false;
-
- final RefSkip refSkip = (RefSkip) obj;
-
- return position == refSkip.position && length == refSkip.length;
-
- }
-
- @Override
- public String toString() {
- return String.valueOf((char) operator) + '@' + position + '+' + length;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java
deleted file mode 100644
index bd409fd..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Scores.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a contiguous stretch of quality scores in a read.
- */
-public class Scores implements Serializable, ReadFeature {
-
- private int position;
- private byte[] scores;
-
- public byte[] getScores() {
- return scores;
- }
-
- public void setScores(final byte[] scores) {
- this.scores = scores;
- }
-
- public Scores() {
- }
-
- public Scores(final int position, final byte[] sequence) {
- this.position = position;
- this.scores = sequence;
- }
-
- public static final byte operator = 'q';
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- @Override
- public int getPosition() {
- return position;
- }
-
- @Override
- public void setPosition(final int position) {
- this.position = position;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Scores))
- return false;
-
- final Scores scores = (Scores) obj;
-
- return position == scores.position && !Arrays.equals(this.scores, scores.scores);
-
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + "position=" + position + "; scores=" + new String(scores) + "] ";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java
deleted file mode 100644
index b142595..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/SoftClip.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * A read feature representing a soft clip similar to {@link htsjdk.samtools.CigarOperator#S}.
- */
-public class SoftClip implements Serializable, ReadFeature {
-
- private int position;
- private byte[] sequence;
-
- public byte[] getSequence() {
- return sequence;
- }
-
- public void setSequence(final byte[] sequence) {
- this.sequence = sequence;
- }
-
- public SoftClip() {
- }
-
- public SoftClip(final int position, final byte[] sequence) {
- this.position = position;
- this.sequence = sequence;
- }
-
- public static final byte operator = 'S';
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof SoftClip))
- return false;
-
- final SoftClip softClip = (SoftClip) obj;
-
- return position == softClip.position && !Arrays.equals(sequence, softClip.sequence);
-
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "[" + "position=" + position + "; bases=" + new String(sequence) + "] ";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java b/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java
deleted file mode 100644
index b2ed5de..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/readfeatures/Substitution.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.readfeatures;
-
-import java.io.Serializable;
-
-/**
- * A substitution event captured in read coordinates. It is characterized by position in read, read base and reference base.
- * The class is also responsible for converting combinations of read base and reference base into a byte value (code).
- */
-public class Substitution implements Serializable, ReadFeature {
- public static final int NO_CODE = -1;
-
- /**
- * zero-based position in read
- */
- private int position;
- /**
- * The read base (ACGTN)
- */
- private byte base = -1;
- /**
- * The reference sequence base matching the position of this substitution.
- */
- private byte referenceBase = -1;
- /**
- * A byte value denoting combination of the read base and the reference base.
- */
- private byte code = NO_CODE;
-
- public byte getCode() {
- return code;
- }
-
- public void setCode(final byte code) {
- this.code = code;
- }
-
- public static final byte operator = 'X';
-
- @Override
- public byte getOperator() {
- return operator;
- }
-
- public int getPosition() {
- return position;
- }
-
- public void setPosition(final int position) {
- this.position = position;
- }
-
- public byte getBase() {
- return base;
- }
-
- public void setBase(final byte base) {
- this.base = base;
- }
-
- public byte getReferenceBase() {
- return referenceBase;
- }
-
- public void setReferenceBase(final byte referenceBase) {
- this.referenceBase = referenceBase;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof Substitution))
- return false;
-
- final Substitution substitution = (Substitution) obj;
-
- if (position != substitution.position)
- return false;
-
- if ((code != substitution.code) & (code == NO_CODE || substitution.code == NO_CODE)) {
- return false;
- }
-
- if (code > NO_CODE && substitution.code > NO_CODE) {
- if (referenceBase != substitution.referenceBase) return false;
- if (base != substitution.base) return false;
- }
- return true;
- }
-
- @Override
- public String toString() {
- return String.valueOf((char) operator) + '@' + position + '\\' + (char) base + (char) referenceBase;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java
deleted file mode 100644
index c50254e..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import java.io.IOException;
-
-/**
- * A basic interface defining a writer. It can ... write!
- * In terms of CRAM this is an abstraction to get rid off implementation details like what is data and where to write to. Pure consumer.
- * Note: the interface does not have writeArray method like it's counterpart {@link htsjdk.samtools.cram.encoding.reader.DataReader} because
- * array length is known when writing, therefore the same interface can be used both for single objects and arrays.
- *
- * @param <T> data type of the series to be written.
- */
-public interface DataWriter<T> {
-
- /**
- * Write some data out.
- *
- * @param value data to be written
- * @return number of bits written
- * @throws IOException as per java IO contract
- */
- @SuppressWarnings("UnusedReturnValue")
- long writeData(T value) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java
deleted file mode 100644
index 3980c82..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/DataWriterFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import htsjdk.samtools.cram.encoding.BitCodec;
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.Encoding;
-import htsjdk.samtools.cram.encoding.EncodingFactory;
-import htsjdk.samtools.cram.io.BitOutputStream;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.EncodingParams;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class DataWriterFactory {
-
- public Writer buildWriter(final BitOutputStream bitOutputStream,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap,
- final CompressionHeader h, final int refId) throws IllegalArgumentException,
- IllegalAccessException {
- final Writer writer = new Writer();
- writer.setCaptureReadNames(h.readNamesIncluded);
- writer.refId = refId;
- writer.substitutionMatrix = h.substitutionMatrix;
- writer.AP_delta = h.APDelta;
-
- for (final Field f : writer.getClass().getFields()) {
- if (f.isAnnotationPresent(DataSeries.class)) {
- final DataSeries ds = f.getAnnotation(DataSeries.class);
- final EncodingKey key = ds.key();
- final DataSeriesType type = ds.type();
-
- f.set(writer,
- createWriter(type, h.encodingMap.get(key), bitOutputStream, outputMap));
- }
-
- if (f.isAnnotationPresent(DataSeriesMap.class)) {
- final DataSeriesMap dsm = f.getAnnotation(DataSeriesMap.class);
- final String name = dsm.name();
- if ("TAG".equals(name)) {
- final Map<Integer, DataWriter<byte[]>> map = new HashMap<Integer, DataWriter<byte[]>>();
- for (final Integer key : h.tMap.keySet()) {
- final EncodingParams params = h.tMap.get(key);
- final DataWriter<byte[]> tagWriter = createWriter(
- DataSeriesType.BYTE_ARRAY, params, bitOutputStream,
- outputMap);
- map.put(key, tagWriter);
- }
- f.set(writer, map);
- }
- }
- }
-
- return writer;
- }
-
- private <T> DataWriter<T> createWriter(final DataSeriesType valueType,
- final EncodingParams params, final BitOutputStream bitOutputStream,
- final Map<Integer, ExposedByteArrayOutputStream> outputMap) {
- final EncodingFactory f = new EncodingFactory();
- final Encoding<T> encoding = f.createEncoding(valueType, params.id);
- if (encoding == null)
- throw new RuntimeException("Encoding not found: value type="
- + valueType.name() + ", encoding id=" + params.id.name());
-
- encoding.fromByteArray(params.params);
-
- return new DefaultDataWriter<T>(encoding.buildCodec(null, outputMap),
- bitOutputStream);
- }
-
- private static class DefaultDataWriter<T> implements DataWriter<T> {
- private final BitCodec<T> codec;
- private final BitOutputStream bitOutputStream;
-
- public DefaultDataWriter(final BitCodec<T> codec, final BitOutputStream bitOutputStream) {
- this.codec = codec;
- this.bitOutputStream = bitOutputStream;
- }
-
- @Override
- public long writeData(final T value) throws IOException {
- return codec.write(bitOutputStream, value);
- }
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java b/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java
deleted file mode 100644
index 3686f44..0000000
--- a/src/main/java/htsjdk/samtools/cram/encoding/writer/Writer.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.encoding.writer;
-
-import htsjdk.samtools.cram.encoding.DataSeries;
-import htsjdk.samtools.cram.encoding.DataSeriesMap;
-import htsjdk.samtools.cram.encoding.DataSeriesType;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.HardClip;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.Padding;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadBase;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.RefSkip;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.Map;
-
- at SuppressWarnings({"UnusedDeclaration", "WeakerAccess"})
-public class Writer {
-
- private Charset charset = Charset.forName("UTF8");
- private boolean captureReadNames = false;
-
- @DataSeries(key = EncodingKey.BF_BitFlags, type = DataSeriesType.INT)
- public DataWriter<Integer> bitFlagsC;
-
- @DataSeries(key = EncodingKey.CF_CompressionBitFlags, type = DataSeriesType.BYTE)
- public DataWriter<Byte> compBitFlagsC;
-
- @DataSeries(key = EncodingKey.RL_ReadLength, type = DataSeriesType.INT)
- public DataWriter<Integer> readLengthC;
-
- @DataSeries(key = EncodingKey.AP_AlignmentPositionOffset, type = DataSeriesType.INT)
- public DataWriter<Integer> alStartC;
-
- @DataSeries(key = EncodingKey.RG_ReadGroup, type = DataSeriesType.INT)
- public DataWriter<Integer> readGroupC;
-
- @DataSeries(key = EncodingKey.RN_ReadName, type = DataSeriesType.BYTE_ARRAY)
- public DataWriter<byte[]> readNameC;
-
- @DataSeries(key = EncodingKey.NF_RecordsToNextFragment, type = DataSeriesType.INT)
- public DataWriter<Integer> distanceC;
-
- @DataSeriesMap(name = "TAG")
- public Map<Integer, DataWriter<byte[]>> tagValueCodecs;
-
- @DataSeries(key = EncodingKey.FN_NumberOfReadFeatures, type = DataSeriesType.INT)
- public DataWriter<Integer> numberOfReadFeaturesCodec;
-
- @DataSeries(key = EncodingKey.FP_FeaturePosition, type = DataSeriesType.INT)
- public DataWriter<Integer> featurePositionCodec;
-
- @DataSeries(key = EncodingKey.FC_FeatureCode, type = DataSeriesType.BYTE)
- public DataWriter<Byte> featuresCodeCodec;
-
- @DataSeries(key = EncodingKey.BA_Base, type = DataSeriesType.BYTE)
- public DataWriter<Byte> baseCodec;
-
- @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE)
- public DataWriter<Byte> qualityScoreCodec;
-
- @DataSeries(key = EncodingKey.QS_QualityScore, type = DataSeriesType.BYTE_ARRAY)
- public DataWriter<byte[]> qualityScoreArrayCodec;
-
- @DataSeries(key = EncodingKey.BS_BaseSubstitutionCode, type = DataSeriesType.BYTE)
- public DataWriter<Byte> baseSubstitutionCodeCodec;
-
- @DataSeries(key = EncodingKey.IN_Insertion, type = DataSeriesType.BYTE_ARRAY)
- public DataWriter<byte[]> insertionCodec;
-
- @DataSeries(key = EncodingKey.SC_SoftClip, type = DataSeriesType.BYTE_ARRAY)
- public DataWriter<byte[]> softClipCodec;
-
- @DataSeries(key = EncodingKey.HC_HardClip, type = DataSeriesType.INT)
- public DataWriter<Integer> hardClipCodec;
-
- @DataSeries(key = EncodingKey.PD_padding, type = DataSeriesType.INT)
- public DataWriter<Integer> paddingCodec;
-
- @DataSeries(key = EncodingKey.DL_DeletionLength, type = DataSeriesType.INT)
- public DataWriter<Integer> deletionLengthCodec;
-
- @DataSeries(key = EncodingKey.MQ_MappingQualityScore, type = DataSeriesType.INT)
- public DataWriter<Integer> mappingQualityScoreCodec;
-
- @DataSeries(key = EncodingKey.MF_MateBitFlags, type = DataSeriesType.BYTE)
- public DataWriter<Byte> mateBitFlagsCodec;
-
- @DataSeries(key = EncodingKey.NS_NextFragmentReferenceSequenceID, type = DataSeriesType.INT)
- public DataWriter<Integer> nextFragmentReferenceSequenceIDCodec;
-
- @DataSeries(key = EncodingKey.NP_NextFragmentAlignmentStart, type = DataSeriesType.INT)
- public DataWriter<Integer> nextFragmentAlignmentStart;
-
- @DataSeries(key = EncodingKey.TS_InsetSize, type = DataSeriesType.INT)
- public DataWriter<Integer> templateSize;
-
- @DataSeries(key = EncodingKey.TL_TagIdList, type = DataSeriesType.INT)
- public DataWriter<Integer> tagIdListCodec;
-
- @DataSeries(key = EncodingKey.RI_RefId, type = DataSeriesType.INT)
- public DataWriter<Integer> refIdCodec;
-
- @DataSeries(key = EncodingKey.RS_RefSkip, type = DataSeriesType.INT)
- public DataWriter<Integer> refSkipCodec;
-
- public int refId;
- public SubstitutionMatrix substitutionMatrix;
- public boolean AP_delta = true;
-
- public static int detachedCount = 0;
-
- public void write(final CramCompressionRecord r) throws IOException {
- bitFlagsC.writeData(r.flags);
- compBitFlagsC.writeData(r.getCompressionFlags());
- if (refId == -2)
- refIdCodec.writeData(r.sequenceId);
-
- readLengthC.writeData(r.readLength);
-
- if (AP_delta)
- alStartC.writeData(r.alignmentDelta);
- else
- alStartC.writeData(r.alignmentStart);
-
- readGroupC.writeData(r.readGroupID);
-
- if (isCaptureReadNames()) {
- readNameC.writeData(r.readName.getBytes(charset));
- }
-
- // mate record:
- if (r.isDetached()) {
- mateBitFlagsCodec.writeData(r.getMateFlags());
- if (!isCaptureReadNames())
- readNameC.writeData(r.readName.getBytes(charset));
-
- nextFragmentReferenceSequenceIDCodec.writeData(r.mateSequenceID);
- nextFragmentAlignmentStart.writeData(r.mateAlignmentStart);
- templateSize.writeData(r.templateSize);
-
- detachedCount++;
- } else if (r.isHasMateDownStream())
- distanceC.writeData(r.recordsToNextFragment);
-
- // tag records:
- tagIdListCodec.writeData(r.tagIdsIndex.value);
- if (r.tags != null) {
- for (int i = 0; i < r.tags.length; i++) {
- final DataWriter<byte[]> writer = tagValueCodecs.get(r.tags[i].keyType3BytesAsInt);
- writer.writeData(r.tags[i].getValueAsByteArray());
- }
- }
-
- if (!r.isSegmentUnmapped()) {
- // writing read features:
- numberOfReadFeaturesCodec.writeData(r.readFeatures.size());
- int prevPos = 0;
- for (final ReadFeature f : r.readFeatures) {
- featuresCodeCodec.writeData(f.getOperator());
- switch (f.getOperator()) {
- case Substitution.operator:
- break;
-
- default:
- break;
- }
-
- featurePositionCodec.writeData(f.getPosition() - prevPos);
- prevPos = f.getPosition();
-
- switch (f.getOperator()) {
- case ReadBase.operator:
- final ReadBase rb = (ReadBase) f;
- baseCodec.writeData(rb.getBase());
- qualityScoreCodec.writeData(rb.getQualityScore());
- break;
- case Substitution.operator:
- final Substitution sv = (Substitution) f;
- if (sv.getCode() < 0)
- baseSubstitutionCodeCodec.writeData(substitutionMatrix.code(sv.getReferenceBase(), sv.getBase()));
- else
- baseSubstitutionCodeCodec.writeData(sv.getCode());
- // baseSubstitutionCodec.writeData((byte) sv.getBaseChange().getChange());
- break;
- case Insertion.operator:
- final Insertion iv = (Insertion) f;
- insertionCodec.writeData(iv.getSequence());
- break;
- case SoftClip.operator:
- final SoftClip fv = (SoftClip) f;
- softClipCodec.writeData(fv.getSequence());
- break;
- case HardClip.operator:
- final HardClip hv = (HardClip) f;
- hardClipCodec.writeData(hv.getLength());
- break;
- case Padding.operator:
- final Padding pv = (Padding) f;
- paddingCodec.writeData(pv.getLength());
- break;
- case Deletion.operator:
- final Deletion dv = (Deletion) f;
- deletionLengthCodec.writeData(dv.getLength());
- break;
- case RefSkip.operator:
- final RefSkip rsv = (RefSkip) f;
- refSkipCodec.writeData(rsv.getLength());
- break;
- case InsertBase.operator:
- final InsertBase ib = (InsertBase) f;
- baseCodec.writeData(ib.getBase());
- break;
- case BaseQualityScore.operator:
- final BaseQualityScore bqs = (BaseQualityScore) f;
- qualityScoreCodec.writeData(bqs.getQualityScore());
- break;
- default:
- throw new RuntimeException("Unknown read feature operator: " + (char) f.getOperator());
- }
- }
-
- // mapping quality:
- mappingQualityScoreCodec.writeData(r.mappingQuality);
- if (r.isForcePreserveQualityScores()) {
- qualityScoreArrayCodec.writeData(r.qualityScores);
- }
- } else {
- if (!r.isUnknownBases())
- for (final byte b : r.readBases)
- baseCodec.writeData(b);
- if (r.isForcePreserveQualityScores()) {
- qualityScoreArrayCodec.writeData(r.qualityScores);
- }
- }
- }
-
- public boolean isCaptureReadNames() {
- return captureReadNames;
- }
-
- public void setCaptureReadNames(final boolean captureReadNames) {
- this.captureReadNames = captureReadNames;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java b/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java
deleted file mode 100644
index 95300f3..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/BitInputStream.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An interface to describe the requirements for reading bit data as opposed to bytes. Implementors must keep track of the amount of data
- * read similar to {@link InputStream} concept.
- */
-public interface BitInputStream {
-
- /**
- * Reads a single bit from the stream.
- *
- * @throws IOException as per streaming contract in java.
- */
- boolean readBit() throws IOException;
-
- /**
- * Read specified number of bits from the stream. The bits are return in an integer value.
- *
- * @param length number of bits to read
- * @throws IOException as per streaming contract in java.
- */
- int readBits(int length) throws IOException;
-
- /**
- * Read specified number of bits from the stream. The bits are return in a long value.
- *
- * @param length number of bits to read
- * @throws IOException as per streaming contract in java.
- */
- long readLongBits(int length) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java
deleted file mode 100644
index b2a081f..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/BitOutputStream.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.Closeable;
-import java.io.Flushable;
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-/**
- * An interface to describe the requirements for writing out bits as opposed to bytes. Implementors must keep track of the amount of data
- * written similar to {@link OutputStream} concept and provide flush/close functionality accordingly.
- */
-public interface BitOutputStream extends Closeable, Flushable {
-
- /**
- * Write specified number of bits supplied in the integer value. The method is naturally limited to 32 bits max.
- * @param bitContainer an integer containing the bits to be written out
- * @param nofBits the number of bits to written out, minimum 0, maximum 32.
- * @throws IOException as per streaming contract in java.
- */
- void write(int bitContainer, int nofBits) throws IOException;
-
-
- /**
- * Write specified number of bits supplied in the long value. The method is naturally limited to 64 bits max.
- * @param bitContainer an integer containing the bits to be written out
- * @param nofBits the number of bits to written out, minimum 0, maximum 64.
- * @throws IOException as per streaming contract in java.
- */
- void write(long bitContainer, int nofBits) throws IOException;
-
-
- /**
- * Write specified number of bits supplied in the byte value. The method is naturally limited to 8 bits max.
- * @param bitContainer an integer containing the bits to be written out
- * @param nofBits the number of bits to written out, minimum 0, maximum 8.
- * @throws IOException as per streaming contract in java.
- */
- void write(byte bitContainer, int nofBits) throws IOException;
-
-
- /**
- * Write a single bit specified in the boolean argument.
- * @param bit emit 1 if true, 0 otherwise.
- * @throws IOException as per streaming contract in java.
- */
- void write(boolean bit) throws IOException;
-
- /**
- * Write a single bit specified in the boolean argument repeatedly.
- * @param bit emit 1 if true, 0 otherwise.
- * @param repeat the number of bits to emit.
- * @throws IOException as per streaming contract in java.
- */
- void write(boolean bit, long repeat) throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java b/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java
deleted file mode 100644
index 31e957e..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CRC32InputStream.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.CRC32;
-
-/**
- * An input stream that calculates CRC32 of all the bytes passed through it. The java {@link java.util.zip.CRC32}
- * class is used to internally.
- */
-public class CRC32InputStream extends InputStream {
- private final InputStream delegate;
- private final CRC32 crc32 = new CRC32();
-
- public CRC32InputStream(final InputStream delegate) {
- super();
- this.delegate = delegate;
- }
-
- public int getCRC32() {
- return (int) (crc32.getValue());
- }
-
- @Override
- public int read() throws IOException {
- final int value = delegate.read();
- if (value != -1)
- crc32.update(value);
- return value;
- }
-
- @Override
- public int read(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
- final int result = delegate.read(b);
- if (result != -1)
- crc32.update(b, 0, result);
- return result;
- }
-
- @Override
- public int read(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
- final int result = delegate.read(b, off, length);
- crc32.update(b, off, result);
- return result;
- }
-
- @Override
- public long skip(final long n) throws IOException {
- return delegate.skip(n);
- }
-
- @Override
- public int available() throws IOException {
- return delegate.available();
- }
-
- @Override
- public void close() throws IOException {
- delegate.close();
- }
-
- @Override
- public void mark(final int readLimit) {
- delegate.mark(readLimit);
- }
-
- @Override
- public void reset() throws IOException {
- delegate.reset();
- }
-
- @Override
- public boolean markSupported() {
- return delegate.markSupported();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java b/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java
deleted file mode 100644
index dff2137..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CRC32OutputStream.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.CRC32;
-
-/**
- * An output stream that calculates CRC32 checksum of all the bytes written through the stream. The java {@link java.util.zip.CRC32}
- * class is used to internally.
- */
-public class CRC32OutputStream extends FilterOutputStream {
-
- private final CRC32 crc32 = new CRC32();
-
- public CRC32OutputStream(final OutputStream out) {
- super(out);
- }
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
- crc32.update(b, off, length);
- out.write(b, off, length);
- }
-
- @Override
- public void write(final int b) throws IOException {
- crc32.update(b);
- out.write(b);
- }
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
- crc32.update(b);
- out.write(b);
- }
-
- public long getLongCrc32() {
- return crc32.getValue();
- }
-
- public byte[] getCrc32_BigEndian() {
- final long value = crc32.getValue();
- return new byte[]{(byte) (0xFF & (value >> 24)),
- (byte) (0xFF & (value >> 16)), (byte) (0xFF & (value >> 8)),
- (byte) (0xFF & value)};
- }
-
- public byte[] getCrc32_LittleEndian() {
- final long value = crc32.getValue();
- return new byte[]{(byte) (0xFF & (value)),
- (byte) (0xFF & (value >> 8)), (byte) (0xFF & (value >> 16)),
- (byte) (0xFF & (value >> 24))};
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java b/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java
deleted file mode 100644
index b5e5642..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CountingInputStream.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An input stream that counts the bytes read from it.
- */
-public class CountingInputStream extends InputStream {
- private final InputStream delegate;
- private long count = 0;
-
- public CountingInputStream(final InputStream inputStream) {
- delegate = inputStream;
- }
-
- @Override
- public int read() throws IOException {
- count++;
- return delegate.read();
- }
-
- public int read(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
- final int read = delegate.read(b);
- count += read;
- return read;
- }
-
- public int read(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
- final int read = delegate.read(b, off, length);
- count += read;
- return read;
- }
-
- public long skip(final long n) throws IOException {
- final long skipped = delegate.skip(n);
- count += skipped;
- return skipped;
- }
-
- public int available() throws IOException {
- return delegate.available();
- }
-
- public void close() throws IOException {
- if (delegate != null)
- delegate.close();
- }
-
- public void mark(final int readLimit) {
- delegate.mark(readLimit);
- }
-
- public void reset() throws IOException {
- delegate.reset();
- count = 0;
- }
-
- public boolean markSupported() {
- return delegate.markSupported();
- }
-
- public long getCount() {
- return count;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CramArray.java b/src/main/java/htsjdk/samtools/cram/io/CramArray.java
deleted file mode 100644
index 819319e..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CramArray.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Methods to read and write CRAM array of integers data type.
- */
-public class CramArray {
- /**
- * Read CRAM int array from a {@link InputStream}.
- *
- * @param inputStream the inputs stream to read from
- * @return array of integers from the input stream
- * @throws IOException as per java IO contract
- */
- public static int[] array(final InputStream inputStream) throws IOException {
- final int size = ITF8.readUnsignedITF8(inputStream);
- final int[] array = new int[size];
- for (int i = 0; i < size; i++)
- array[i] = ITF8.readUnsignedITF8(inputStream);
-
- return array;
- }
-
- /**
- * Write CRAM int array to a {@link OutputStream}.
- *
- * @param array the array to be written
- * @param outputStream the output stream to write to
- * @return the number of bits written out
- * @throws IOException as per java IO contract
- */
- public static int write(final int[] array, final OutputStream outputStream) throws IOException {
- int length = ITF8.writeUnsignedITF8(array.length, outputStream);
- for (final int intValue : array) length += ITF8.writeUnsignedITF8(intValue, outputStream);
-
- return length;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/CramInt.java b/src/main/java/htsjdk/samtools/cram/io/CramInt.java
deleted file mode 100644
index 1b0432f..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/CramInt.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-/**
- * Methods to read and write CRAM int values as given in the file format specification.
- */
-
-public class CramInt {
- /**
- * Read unsigned little-endian 4 byte integer from an {@link InputStream}.
- *
- * @param inputStream input stream to read from
- * @return an integer value read
- * @throws IOException as per java IO contract
- */
- public static int int32(final InputStream inputStream) throws IOException {
- return inputStream.read() | inputStream.read() << 8 | inputStream.read() << 16 | inputStream.read() << 24;
- }
-
- /**
- * Read unsigned little-endian 4 byte integer from an array of bytes.
- *
- * @param data input stream to read from
- * @return an integer value read
- */
- public static int int32(final byte[] data) {
- if (data.length != 4)
- throw new IllegalArgumentException("Expecting a 4-byte integer. ");
- return (0xFF & data[0]) | ((0xFF & data[1]) << 8) | ((0xFF & data[2]) << 16) | ((0xFF & data[3]) << 24);
- }
-
- /**
- * Read unsigned little-endian 4 byte integer from an {@link ByteBuffer}.
- *
- * @param buffer {@link ByteBuffer} to read from
- * @return an integer value read from the buffer
- */
- public static int int32(final ByteBuffer buffer) {
- return buffer.get() | buffer.get() << 8 | buffer.get() << 16 | buffer.get() << 24;
- }
-
- /**
- * Write int value to {@link OutputStream} encoded as CRAM int data type.
- *
- * @param value value to be written out
- * @param outputStream the output stream
- * @return the number of bits written out
- * @throws IOException as per java IO contract
- */
- @SuppressWarnings("SameReturnValue")
- public static int writeInt32(final int value, final OutputStream outputStream) throws IOException {
- outputStream.write((byte) value);
- outputStream.write((byte) (value >> 8));
- outputStream.write((byte) (value >> 16));
- outputStream.write((byte) (value >> 24));
- return 4 * 8;
- }
-
- /**
- * Write int value to {@link OutputStream} encoded as CRAM int data type.
- *
- * @param value value to be written out
- * @return the byte array holding the value encoded as CRAM int data type
- */
- public static byte[] writeInt32(final int value) {
- final byte[] data = new byte[4];
- data[0] = (byte) (value & 0xFF);
- data[1] = (byte) (value >> 8 & 0xFF);
- data[2] = (byte) (value >> 16 & 0xFF);
- data[3] = (byte) (value >> 24 & 0xFF);
- return data;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java b/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java
deleted file mode 100644
index 519cf9d..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/DefaultBitInputStream.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Must not read from delegate unless no bits left in the buffer!!!
- *
- * @author vadim
- */
-public class DefaultBitInputStream extends DataInputStream implements BitInputStream {
-
- private int nofBufferedBits = 0;
- private int byteBuffer = 0;
- private boolean throwEOF = false;
- private static final long[] masks = new long[]{0, (1L << 1) - 1, (1L << 2) - 1, (1L << 3) - 1, (1L << 4) - 1,
- (1L << 5) - 1, (1L << 6) - 1, (1L << 7) - 1, (1L << 8) - 1};
-
- public DefaultBitInputStream(final InputStream in) {
-
- super(in);
- this.throwEOF = true;
- }
-
- public final boolean readBit() throws IOException {
- if (--nofBufferedBits >= 0)
- return ((byteBuffer >>> nofBufferedBits) & 1) == 1;
-
- nofBufferedBits = 7;
- byteBuffer = in.read();
- if (byteBuffer == -1) {
- if (throwEOF)
- throw new EOFException("End of stream.");
- }
-
- return ((byteBuffer >>> 7) & 1) == 1;
- }
-
- public final int readBits(int n) throws IOException {
- if (n == 0)
- return 0;
- int x = 0;
- while (n > nofBufferedBits) {
- n -= nofBufferedBits;
- x |= rightBits(nofBufferedBits, byteBuffer) << n;
- byteBuffer = in.read();
- if (byteBuffer == -1) {
- throw new EOFException("End of stream.");
- }
-
- nofBufferedBits = 8;
- }
- nofBufferedBits -= n;
- return x | rightBits(n, byteBuffer >>> nofBufferedBits);
- }
-
- private static int rightBits(final int n, final int x) {
- return x & ((1 << n) - 1);
- }
-
- public final long readLongBits(int n) throws IOException {
- if (n > 64)
- throw new RuntimeException("More then 64 bits are requested in one read from bit stream.");
-
- if (n == 0)
- return 0;
-
- long x = 0;
- long byteBuffer = this.byteBuffer;
- if (nofBufferedBits == 0) {
- byteBuffer = in.read();
- if (byteBuffer == -1) {
- throw new EOFException("End of stream.");
- }
- nofBufferedBits = 8;
- }
- byteBuffer &= masks[nofBufferedBits];
- while (n > nofBufferedBits) {
- n -= nofBufferedBits;
- x |= byteBuffer << n;
- byteBuffer = in.read();
- if (byteBuffer == -1) {
- throw new EOFException("End of stream.");
- }
- nofBufferedBits = 8;
- }
- nofBufferedBits -= n;
- this.byteBuffer = (int) (byteBuffer & masks[nofBufferedBits]);
- return x | (byteBuffer >>> nofBufferedBits);
- }
-
- public void reset() {
- nofBufferedBits = 0;
- byteBuffer = 0;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java
deleted file mode 100644
index 2d702ee..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/DefaultBitOutputStream.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class DefaultBitOutputStream extends OutputStream implements BitOutputStream {
-
- private static final byte[] bitMasks = new byte[8];
-
- static {
- for (byte i = 0; i < 8; i++)
- bitMasks[i] = (byte) (~(0xFF >>> i));
- }
-
- private final OutputStream out;
-
- private int bufferByte = 0;
- private int bufferedNumberOfBits = 0;
-
- public DefaultBitOutputStream(final OutputStream delegate) {
- this.out = delegate;
- }
-
- public void write(final byte b) throws IOException {
- out.write((int) b);
- }
-
- @Override
- public void write(final int value) throws IOException {
- out.write(value);
- }
-
- @Override
- public String toString() {
- return "DefaultBitOutputStream: "
- + Integer.toBinaryString(bufferByte).substring(0, bufferedNumberOfBits);
- }
-
- public void write(final long bitContainer, final int nofBits) throws IOException {
- if (nofBits == 0)
- return;
-
- if (nofBits < 1 || nofBits > 64)
- throw new IOException("Expecting 1 to 64 bits, got: value=" + bitContainer + ", nofBits=" + nofBits);
-
- if (nofBits <= 8)
- write((byte) bitContainer, nofBits);
- else {
- for (int i = nofBits - 8; i >= 0; i -= 8) {
- final byte v = (byte) (bitContainer >>> i);
- writeByte(v);
- }
- if (nofBits % 8 != 0) {
- final byte v = (byte) bitContainer;
- write(v, nofBits % 8);
- }
- }
- }
-
- void write_int_LSB_0(final int value, final int nofBitsToWrite) throws IOException {
- if (nofBitsToWrite == 0)
- return;
-
- if (nofBitsToWrite < 1 || nofBitsToWrite > 32)
- throw new IOException("Expecting 1 to 32 bits.");
-
- if (nofBitsToWrite <= 8)
- write((byte) value, nofBitsToWrite);
- else {
- for (int i = nofBitsToWrite - 8; i >= 0; i -= 8) {
- final byte v = (byte) (value >>> i);
- writeByte(v);
- }
- if (nofBitsToWrite % 8 != 0) {
- final byte v = (byte) value;
- write(v, nofBitsToWrite % 8);
- }
- }
- }
-
- public void write(final int bitContainer, final int nofBits) throws IOException {
- write_int_LSB_0(bitContainer, nofBits);
- }
-
- private void writeByte(final int value) throws IOException {
- if (bufferedNumberOfBits == 0)
- out.write(value);
- else {
- bufferByte = ((value & 0xFF) >>> bufferedNumberOfBits) | bufferByte;
- out.write(bufferByte);
- bufferByte = (value << (8 - bufferedNumberOfBits)) & 0xFF;
- }
- }
-
- public void write(byte bitContainer, final int nofBits) throws IOException {
- if (nofBits < 0 || nofBits > 8)
- throw new IOException("Expecting 0 to 8 bits.");
-
- if (nofBits == 8)
- writeByte(bitContainer);
- else {
- if (bufferedNumberOfBits == 0) {
- bufferByte = (bitContainer << (8 - nofBits)) & 0xFF;
- bufferedNumberOfBits = nofBits;
- } else {
- bitContainer = (byte) (bitContainer & ~bitMasks[8 - nofBits]);
- int bits = 8 - bufferedNumberOfBits - nofBits;
- if (bits < 0) {
- bits = -bits;
- bufferByte |= (bitContainer >>> bits);
- out.write(bufferByte);
- bufferByte = (bitContainer << (8 - bits)) & 0xFF;
- bufferedNumberOfBits = bits;
- } else if (bits == 0) {
- bufferByte = bufferByte | bitContainer;
- out.write(bufferByte);
- bufferedNumberOfBits = 0;
- } else {
- bufferByte = bufferByte | (bitContainer << bits);
- bufferedNumberOfBits = 8 - bits;
- }
- }
- }
- }
-
- @Override
- public void write(final boolean bit) throws IOException {
- write(bit ? (byte) 1 : (byte) 0, 1);
- }
-
- public void write(final boolean bit, final long repeat) throws IOException {
- for (long i = 0; i < repeat; i++)
- write(bit);
- }
-
- @Override
- public void close() throws IOException {
- flush();
- out.close();
- }
-
- @Override
- public void flush() throws IOException {
- if (bufferedNumberOfBits > 0)
- out.write(bufferByte);
-
- bufferedNumberOfBits = 0;
- out.flush();
- }
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b) throws IOException {
- out.write(b);
- }
-
- @Override
- public void write(@SuppressWarnings("NullableProblems") final byte[] b, final int off, final int length) throws IOException {
- out.write(b, off, length);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java b/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java
deleted file mode 100644
index 0bac0dd..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ExposedByteArrayOutputStream.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import java.io.ByteArrayOutputStream;
-
-public class ExposedByteArrayOutputStream extends ByteArrayOutputStream {
- public byte[] getBuffer() {
- return buf;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java b/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java
deleted file mode 100644
index 4905a96..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ExternalCompression.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.cram.encoding.rans.RANS;
-import htsjdk.samtools.util.IOUtil;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
-import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
-import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Methods to provide CRAM external compression/decompression features.
- */
-public class ExternalCompression {
- private static final int GZIP_COMPRESSION_LEVEL = Integer.valueOf(System.getProperty("gzip.compression.level", "5"));
-
- /**
- * Compress a byte array into GZIP blob. The method obeys {@link ExternalCompression#GZIP_COMPRESSION_LEVEL} compression level.
- *
- * @param data byte array to compress
- * @return compressed blob
- */
- public static byte[] gzip(final byte[] data) throws IOException {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- final GZIPOutputStream gos = new GZIPOutputStream(byteArrayOutputStream) {
- {
- def.setLevel(GZIP_COMPRESSION_LEVEL);
- }
- };
- IOUtil.copyStream(new ByteArrayInputStream(data), gos);
- gos.close();
-
- return byteArrayOutputStream.toByteArray();
- }
-
- /**
- * Uncompress a GZIP data blob into a new byte array.
- *
- * @param data compressed data blob
- * @return uncompressed data
- * @throws IOException as per java IO contract
- */
- public static byte[] gunzip(final byte[] data) throws IOException {
- final GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(data));
- return InputStreamUtils.readFully(gzipInputStream);
- }
-
- /**
- * Compress a byte array into BZIP2 blob.
- *
- * @param data byte array to compress
- * @return compressed blob
- */
- public static byte[] bzip2(final byte[] data) throws IOException {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- final BZip2CompressorOutputStream bos = new BZip2CompressorOutputStream(byteArrayOutputStream);
- IOUtil.copyStream(new ByteArrayInputStream(data), bos);
- bos.close();
- return byteArrayOutputStream.toByteArray();
- }
-
- /**
- * Uncompress a BZIP2 data blob into a new byte array.
- *
- * @param data compressed data blob
- * @return uncompressed data
- * @throws IOException as per java IO contract
- */
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static byte[] unbzip2(final byte[] data) throws IOException {
- final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
- return InputStreamUtils.readFully(new BZip2CompressorInputStream(byteArrayInputStream));
- }
-
- /**
- * Compress a byte array into rANS blob.
- *
- * @param data byte array to compress
- * @param order rANS order
- * @return compressed blob
- */
- public static byte[] rans(final byte[] data, final RANS.ORDER order) {
- final ByteBuffer buffer = RANS.compress(ByteBuffer.wrap(data), order, null);
- return toByteArray(buffer);
- }
-
- /**
- * Compress a byte array into rANS blob.
- *
- * @param data byte array to compress
- * @param order rANS order
- * @return compressed blob
- */
- public static byte[] rans(final byte[] data, final int order) {
- final ByteBuffer buffer = RANS.compress(ByteBuffer.wrap(data), RANS.ORDER.fromInt(order), null);
- return toByteArray(buffer);
- }
-
- /**
- * Uncompress a rANS data blob into a new byte array.
- *
- * @param data compressed data blob
- * @return uncompressed data
- */
- public static byte[] unrans(final byte[] data) {
- final ByteBuffer buf = RANS.uncompress(ByteBuffer.wrap(data), null);
- return toByteArray(buf);
- }
-
-
- /**
- * Compress a byte array into XZ blob.
- *
- * @param data byte array to compress
- * @return compressed blob
- */
- public static byte[] xz(final byte[] data) throws IOException {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(data.length * 2);
- final XZCompressorOutputStream xzCompressorOutputStream = new XZCompressorOutputStream(byteArrayOutputStream);
- xzCompressorOutputStream.write(data);
- xzCompressorOutputStream.close();
- return byteArrayOutputStream.toByteArray();
- }
-
-
- /**
- * Uncompress a XZ data blob into a new byte array.
- *
- * @param data compressed data blob
- * @return uncompressed data
- * @throws IOException as per java IO contract
- */
- public static byte[] unxz(final byte[] data) throws IOException {
- final XZCompressorInputStream xzCompressorInputStream = new XZCompressorInputStream(new ByteArrayInputStream(data));
- return InputStreamUtils.readFully(xzCompressorInputStream);
- }
-
-
- private static byte[] toByteArray(final ByteBuffer buffer) {
- if (buffer.hasArray() && buffer.arrayOffset() == 0 && buffer.array().length == buffer.limit()) return buffer.array();
-
- final byte[] bytes = new byte[buffer.remaining()];
- buffer.get(bytes);
- return bytes;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/ITF8.java b/src/main/java/htsjdk/samtools/cram/io/ITF8.java
deleted file mode 100644
index edaca09..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/ITF8.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-
-/**
- * Methods to read and write int values as per ITF8 specification in CRAM.
- */
-public class ITF8 {
-
- /**
- * Reads an unsigned (32 bit) integer from an {@link InputStream}. The sign bit should be interpreted as a value bit.
- *
- * @param inputStream the stream to read from
- * @return the value read
- * @throws IOException as per java IO contract
- */
- public static int readUnsignedITF8(final InputStream inputStream) throws IOException {
- final int b1 = inputStream.read();
- if (b1 == -1)
- throw new EOFException();
-
- if ((b1 & 128) == 0)
- return b1;
-
- if ((b1 & 64) == 0)
- return ((b1 & 127) << 8) | inputStream.read();
-
- if ((b1 & 32) == 0) {
- final int b2 = inputStream.read();
- final int b3 = inputStream.read();
- return ((b1 & 63) << 16) | b2 << 8 | b3;
- }
-
- if ((b1 & 16) == 0)
- return ((b1 & 31) << 24) | inputStream.read() << 16 | inputStream.read() << 8 | inputStream.read();
-
- return ((b1 & 15) << 28) | inputStream.read() << 20 | inputStream.read() << 12 | inputStream.read() << 4 | (15 & inputStream.read());
- }
-
- /**
- * Writes an unsigned (32 bit) integer to an {@link OutputStream} encoded as ITF8. The sign bit is interpreted as a value bit.
- *
- * @param value the value to be written out
- * @param outputStream the stream to write to
- * @return number of bits written
- * @throws IOException as per java IO contract
- */
- public static int writeUnsignedITF8(final int value, final OutputStream outputStream) throws IOException {
- if ((value >>> 7) == 0) {
- outputStream.write(value);
- return 8;
- }
-
- if ((value >>> 14) == 0) {
- outputStream.write(((value >> 8) | 128));
- outputStream.write((value & 0xFF));
- return 16;
- }
-
- if ((value >>> 21) == 0) {
- outputStream.write(((value >> 16) | 192));
- outputStream.write(((value >> 8) & 0xFF));
- outputStream.write((value & 0xFF));
- return 24;
- }
-
- if ((value >>> 28) == 0) {
- outputStream.write(((value >> 24) | 224));
- outputStream.write(((value >> 16) & 0xFF));
- outputStream.write(((value >> 8) & 0xFF));
- outputStream.write((value & 0xFF));
- return 32;
- }
-
- outputStream.write(((value >> 28) | 240));
- outputStream.write(((value >> 20) & 0xFF));
- outputStream.write(((value >> 12) & 0xFF));
- outputStream.write(((value >> 4) & 0xFF));
- outputStream.write((value & 0xFF));
- return 40;
- }
-
- /**
- * Reads an unsigned (32 bit) integer from an array of bytes. The sign bit should be interpreted as a value bit.
- *
- * @param data the bytes to read from
- * @return the value read
- */
- public static int readUnsignedITF8(final byte[] data) {
- final ByteBuffer buffer = ByteBuffer.wrap(data);
- final int value = readUnsignedITF8(buffer);
- buffer.clear();
-
- return value;
- }
-
- /**
- * Writes an unsigned (32 bit) integer to a byte new array encoded as ITF8. The sign bit is interpreted as a value bit.
- *
- * @param value the value to be written out
- * @return the bytes holding ITF8 representation of the value
- */
- public static byte[] writeUnsignedITF8(final int value) {
- final ByteBuffer buffer = ByteBuffer.allocate(10);
- writeUnsignedITF8(value, buffer);
-
- buffer.flip();
- final byte[] array = new byte[buffer.limit()];
- buffer.get(array);
-
- buffer.clear();
- return array;
- }
-
- /**
- * Reads an unsigned (32 bit) integer from a {@link ByteBuffer}. The sign bit should be interpreted as a value bit.
- *
- * @param buffer the bytes to read from
- * @return unsigned integer value from the buffer
- */
- public static int readUnsignedITF8(final ByteBuffer buffer) {
- final int b1 = 0xFF & buffer.get();
-
- if ((b1 & 128) == 0)
- return b1;
-
- if ((b1 & 64) == 0)
- return ((b1 & 127) << 8) | (0xFF & buffer.get());
-
- if ((b1 & 32) == 0) {
- final int b2 = 0xFF & buffer.get();
- final int b3 = 0xFF & buffer.get();
- return ((b1 & 63) << 16) | b2 << 8 | b3;
- }
-
- if ((b1 & 16) == 0)
- return ((b1 & 31) << 24) | (0xFF & buffer.get()) << 16 | (0xFF & buffer.get()) << 8 | (0xFF & buffer.get());
-
- return ((b1 & 15) << 28) | (0xFF & buffer.get()) << 20 | (0xFF & buffer.get()) << 12 | (0xFF & buffer.get()) << 4
- | (15 & buffer.get());
- }
-
- /**
- * Writes an unsigned (32 bit) integer to an {@link OutputStream} encoded as ITF8. The sign bit is interpreted as a value bit.
- *
- * @param value the value to be written out
- * @param buffer the {@link ByteBuffer} to write to
- */
- public static void writeUnsignedITF8(final int value, final ByteBuffer buffer) {
- if ((value >>> 7) == 0) {
- buffer.put((byte) value);
- return;
- }
-
- if ((value >>> 14) == 0) {
- buffer.put((byte) ((value >> 8) | 128));
- buffer.put((byte) (value & 0xFF));
- return;
- }
-
- if ((value >>> 21) == 0) {
- buffer.put((byte) ((value >> 16) | 192));
- buffer.put((byte) ((value >> 8) & 0xFF));
- buffer.put((byte) (value & 0xFF));
- return;
- }
-
- if ((value >>> 28) == 0) {
- buffer.put((byte) ((value >> 24) | 224));
- buffer.put((byte) ((value >> 16) & 0xFF));
- buffer.put((byte) ((value >> 8) & 0xFF));
- buffer.put((byte) (value & 0xFF));
- return;
- }
-
- buffer.put((byte) ((value >> 28) | 240));
- buffer.put((byte) ((value >> 20) & 0xFF));
- buffer.put((byte) ((value >> 12) & 0xFF));
- buffer.put((byte) ((value >> 4) & 0xFF));
- buffer.put((byte) (value & 0xFF));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java b/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java
deleted file mode 100644
index 3d1c96d..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/InputStreamUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Convenience methods to read from {@link java.io.InputStream}.
- */
-public class InputStreamUtils {
-
- /**
- * Read the {@link InputStream} until the end into a new byte array.
- *
- * @param input the input stream to read
- * @return a new byte array containing data from the input stream
- */
- public static byte[] readFully(final InputStream input) {
- final ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtil.copyStream(input, output);
- return output.toByteArray();
- }
-
- /**
- * Read the specified number of bytes from the {@link InputStream} into a new byte array. The length of the array is less or equal to
- * length.
- *
- * @param inputStream the input stream to read from
- * @param length the number of bytes to read
- * @return a new byte array containing data from the input stream
- * @throws IOException as per java IO contract
- * @throws EOFException if there is less than length bytes in the stream
- */
- public static byte[] readFully(final InputStream inputStream, final int length) throws IOException {
- final byte[] b = new byte[length];
- readFully(inputStream, b, 0, length);
- return b;
- }
-
- /**
- * Read the specified number of bytes from the {@link InputStream} into the byte array starting from the specified position. The length
- * of the array is less or equal to length.
- *
- * @param inputStream the input stream to read from
- * @param b the byte array to read into
- * @param off offset in the byte array
- * @param length the number of bytes to read
- * @throws IOException as per java IO contract
- * @throws EOFException if there is less than length bytes in the stream
- */
- public static void readFully(final InputStream inputStream, final byte[] b, final int off, final int length) throws IOException {
- if (length < 0) throw new IndexOutOfBoundsException();
- int n = 0;
- while (n < length) {
- final int count = inputStream.read(b, off + n, length - n);
- if (count < 0) throw new EOFException();
- n += count;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/io/LTF8.java b/src/main/java/htsjdk/samtools/cram/io/LTF8.java
deleted file mode 100644
index 3e98ba6..0000000
--- a/src/main/java/htsjdk/samtools/cram/io/LTF8.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Methods to read and write LTF8 as per CRAM specs.
- */
-public class LTF8 {
- /**
- * Reads an unsigned long value from the input stream. The sign bit should be interpreted just as other bits in the value.
- *
- * @param inputStream input stream to be read from
- * @return value encoded in the stream as LTF8
- * @throws IOException as per java IO contract
- */
- public static long readUnsignedLTF8(final InputStream inputStream) throws IOException {
- final int b1 = inputStream.read();
- if (b1 == -1)
- throw new EOFException();
-
- if ((b1 & 128) == 0)
- return b1;
-
- if ((b1 & 64) == 0)
- return ((b1 & 127) << 8) | inputStream.read();
-
- if ((b1 & 32) == 0) {
- final int b2 = inputStream.read();
- final int b3 = inputStream.read();
- return ((b1 & 63) << 16) | b2 << 8 | b3;
- }
-
- if ((b1 & 16) == 0) {
- long result = ((long) (b1 & 31) << 24);
- result |= inputStream.read() << 16;
- result |= inputStream.read() << 8;
- result |= inputStream.read();
- return result;
- }
-
- if ((b1 & 8) == 0) {
- long value = ((long) (b1 & 15) << 32);
- value |= ((0xFF & ((long) inputStream.read())) << 24);
- value |= (inputStream.read() << 16);
- value |= (inputStream.read() << 8);
- value |= inputStream.read();
- return value;
- }
-
- if ((b1 & 4) == 0) {
- long result = ((long) (b1 & 7) << 40);
- result |= (0xFF & ((long) inputStream.read())) << 32;
- result |= (0xFF & ((long) inputStream.read())) << 24;
- result |= inputStream.read() << 16;
- result |= inputStream.read() << 8;
- result |= inputStream.read();
- return result;
- }
-
- if ((b1 & 2) == 0) {
- long result = ((long) (b1 & 3) << 48);
- result |= (0xFF & ((long) inputStream.read())) << 40;
- result |= (0xFF & ((long) inputStream.read())) << 32;
- result |= (0xFF & ((long) inputStream.read())) << 24;
- result |= inputStream.read() << 16;
- result |= inputStream.read() << 8;
- result |= inputStream.read();
- return result;
- }
-
- if ((b1 & 1) == 0) {
- long result = (0xFF & ((long) inputStream.read())) << 48;
- result |= (0xFF & ((long) inputStream.read())) << 40;
- result |= (0xFF & ((long) inputStream.read())) << 32;
- result |= (0xFF & ((long) inputStream.read())) << 24;
- result |= inputStream.read() << 16;
- result |= inputStream.read() << 8;
- result |= inputStream.read();
- return result;
- }
-
- long result = (0xFF & ((long) inputStream.read())) << 56;
- result |= (0xFF & ((long) inputStream.read())) << 48;
- result |= (0xFF & ((long) inputStream.read())) << 40;
- result |= (0xFF & ((long) inputStream.read())) << 32;
- result |= (0xFF & ((long) inputStream.read())) << 24;
- result |= inputStream.read() << 16;
- result |= inputStream.read() << 8;
- result |= inputStream.read();
- return result;
- }
-
- /**
- * Writes an unsigned long value to the output stream. The sign bit is interpreted just as other bits in the value.
- *
- * @param value the value to be written
- * @param outputStream the output stream to write to
- * @return the number of bits written
- * @throws IOException as per java IO contract
- */
- public static int writeUnsignedLTF8(final long value, final OutputStream outputStream) throws IOException {
- if ((value >>> 7) == 0) {
- // no control bits
- outputStream.write((int) value);
- return 8;
- }
-
- if ((value >>> 14) == 0) {
- // one control bit
- outputStream.write((int) ((value >> 8) | 0x80));
- outputStream.write((int) (value & 0xFF));
- return 16;
- }
-
- if ((value >>> 21) == 0) {
- // two control bits
- outputStream.write((int) ((value >> 16) | 0xC0));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 24;
- }
-
- if ((value >>> 28) == 0) {
- // three control bits
- outputStream.write((int) ((value >> 24) | 0xE0));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 32;
- }
-
- if ((value >>> 35) == 0) {
- // four control bits
- outputStream.write((int) ((value >> 32) | 0xF0));
- outputStream.write((int) ((value >> 24) & 0xFF));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 40;
- }
-
- if ((value >>> 42) == 0) {
- // five control bits
- outputStream.write((int) ((value >> 40) | 0xF8));
- outputStream.write((int) ((value >> 32) & 0xFF));
- outputStream.write((int) ((value >> 24) & 0xFF));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 48;
- }
-
- if ((value >>> 49) == 0) {
- // six control bits
- outputStream.write((int) ((value >> 48) | 0xFC));
- outputStream.write((int) ((value >> 40) & 0xFF));
- outputStream.write((int) ((value >> 32) & 0xFF));
- outputStream.write((int) ((value >> 24) & 0xFF));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 56;
- }
-
- if ((value >>> 56) == 0) {
- // seven control bits
- outputStream.write(0xFE);
- outputStream.write((int) ((value >> 48) & 0xFF));
- outputStream.write((int) ((value >> 40) & 0xFF));
- outputStream.write((int) ((value >> 32) & 0xFF));
- outputStream.write((int) ((value >> 24) & 0xFF));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 64;
- }
-
- // eight control bits
- outputStream.write((0xFF));
- outputStream.write((int) ((value >> 56) & 0xFF));
- outputStream.write((int) ((value >> 48) & 0xFF));
- outputStream.write((int) ((value >> 40) & 0xFF));
- outputStream.write((int) ((value >> 32) & 0xFF));
- outputStream.write((int) ((value >> 28) & 0xFF));
- outputStream.write((int) ((value >> 16) & 0xFF));
- outputStream.write((int) ((value >> 8) & 0xFF));
- outputStream.write((int) (value & 0xFF));
- return 72;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java b/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java
deleted file mode 100644
index ca40a92..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class BaseCategory {
- public final BaseCategoryType type;
- public final int param;
-
- private BaseCategory(final BaseCategoryType type, final int param) {
- this.type = type;
- this.param = param;
- }
-
- public static BaseCategory match() {
- return new BaseCategory(BaseCategoryType.MATCH, -1);
- }
-
- public static BaseCategory mismatch() {
- return new BaseCategory(BaseCategoryType.MISMATCH, -1);
- }
-
- public static BaseCategory flankingDeletion() {
- return new BaseCategory(BaseCategoryType.FLANKING_DELETION, -1);
- }
-
- public static BaseCategory pileup(final int threshold) {
- return new BaseCategory(BaseCategoryType.PILEUP, threshold);
- }
-
- public static BaseCategory lowerThanCoverage(final int coverage) {
- return new BaseCategory(BaseCategoryType.LOWER_COVERAGE, coverage);
- }
-
- public static BaseCategory insertion() {
- return new BaseCategory(BaseCategoryType.INSERTION, -1);
- }
-
- @Override
- public String toString() {
- return String.format("[%s%d]", type.name(), param);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java b/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java
deleted file mode 100644
index 93e98cc..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/BaseCategoryType.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum BaseCategoryType {
- MATCH('R'), MISMATCH('N'), FLANKING_DELETION('D'), PILEUP('P'), LOWER_COVERAGE(
- 'X'), INSERTION('I');
-
- @SuppressWarnings("FieldCanBeLocal")
- private final char code;
-
- BaseCategoryType(final char code) {
- this.code = code;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/Binning.java b/src/main/java/htsjdk/samtools/cram/lossy/Binning.java
deleted file mode 100644
index 2ff6d9b..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/Binning.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-class Binning {
-
- // @formatter:off
- // NCBI binning scheme:
- // Low High Value
- // 0 0 0
- // 1 1 1
- // 2 2 2
- // 3 14 9
- // 15 19 17
- // 20 24 22
- // 25 29 28
- // 30 noLimit 35
- // @formatter:on
- public static byte[] NCBI_BINNING_MATRIX = new byte[]{
- // @formatter:off
- 0, 1, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17,
- 22, 22, 22, 22,
- 22,
- 28,
- 28,
- 28,
- 28,
- 28,
- // @formatter:on
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35};
-
- // @formatter:off
-
- // Illumina binning scheme:
- // 2-9 6
- // 10-19 15
- // 20-24 22
- // 25-29 27
- // 30-34 33
- // 35-39 37
- // greater than or equal to 40 40
- // @formatter:on
- public static final byte[] ILLUMINA_BINNING_MATRIX = new byte[]{
- // @formatter:off
- 0, 1, 6, 6, 6, 6, 6, 6, 6, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 22, 22, 22, 22, 22, 27, 27, 27, 27, 27, 33, 33, 33, 33, 33, 37,
- 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40};
- // @formatter:on
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java b/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java
deleted file mode 100644
index fa8c5d3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/PreservationPolicy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PreservationPolicy {
- public ReadCategory readCategory;
- public final List<BaseCategory> baseCategories = new ArrayList<BaseCategory>();
-
- public QualityScoreTreatment treatment;
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder();
- if (readCategory != null)
- sb.append(readCategory.toString());
-
- if (baseCategories != null)
- for (final BaseCategory c : baseCategories)
- sb.append(c.toString());
-
- sb.append(treatment.toString());
- return sb.toString();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java
deleted file mode 100644
index 5ffe3c1..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScorePreservation.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.BaseQualityScore;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class QualityScorePreservation {
- private final List<PreservationPolicy> policyList;
-
- public QualityScorePreservation(final String specification) {
- policyList = parsePolicies(specification);
- }
-
- public List<PreservationPolicy> getPreservationPolicies() {
- return policyList;
- }
-
- private static int readParam(final LinkedList<Character> list) {
- int value = 0;
-
- while (!list.isEmpty() && Character.isDigit(list.getFirst()))
- value = value * 10 + (list.removeFirst() - 48);
-
- return value;
- }
-
- private static QualityScoreTreatment readTreatment(
- final LinkedList<Character> list) {
- final int param = readParam(list);
- final QualityScoreTreatment qualityScoreTreatment;
- switch (param) {
- case 0:
- qualityScoreTreatment = QualityScoreTreatment.drop();
- break;
- case 40:
- qualityScoreTreatment = QualityScoreTreatment.preserve();
- break;
-
- default:
- qualityScoreTreatment = QualityScoreTreatment.bin(param);
- break;
-
- }
- return qualityScoreTreatment;
- }
-
- private static List<PreservationPolicy> parsePolicies(final String spec) {
- final List<PreservationPolicy> policyList = new ArrayList<PreservationPolicy>();
- for (final String string : spec.split("-")) {
- if (string.isEmpty())
- continue;
- final PreservationPolicy policy = parseSinglePolicy(string);
- policyList.add(policy);
- }
-
- Collections.sort(policyList, new Comparator<PreservationPolicy>() {
-
- @Override
- public int compare(final PreservationPolicy o1, final PreservationPolicy o2) {
- final QualityScoreTreatment t1 = o1.treatment;
- final QualityScoreTreatment t2 = o2.treatment;
- final int result = t2.type.ordinal() - t1.type.ordinal();
- if (result != 0)
- return result;
-
- return 0;
- }
- });
-
- return policyList;
- }
-
- private static PreservationPolicy parseSinglePolicy(final String spec) {
- final PreservationPolicy preservationPolicy = new PreservationPolicy();
- final LinkedList<Character> list = new LinkedList<Character>();
- for (final char character : spec.toCharArray())
- list.add(character);
-
- while (!list.isEmpty()) {
- final char code = list.removeFirst();
- switch (code) {
- case 'R':
- preservationPolicy.baseCategories.add(BaseCategory.match());
- preservationPolicy.treatment = readTreatment(list);
- break;
- case 'N':
- preservationPolicy.baseCategories.add(BaseCategory.mismatch());
- preservationPolicy.treatment = readTreatment(list);
- break;
- case 'X':
- final int coverage = readParam(list);
- preservationPolicy.baseCategories
- .add(BaseCategory.lowerThanCoverage(coverage));
- break;
- case 'D':
- preservationPolicy.baseCategories.add(BaseCategory.flankingDeletion());
- preservationPolicy.treatment = readTreatment(list);
- break;
- case 'M':
- int score = readParam(list);
- preservationPolicy.readCategory = ReadCategory.higher_than_mapping_score(score);
- break;
- case 'm':
- score = readParam(list);
- preservationPolicy.readCategory = ReadCategory.lower_than_mapping_score(score);
- break;
- case 'U':
- preservationPolicy.readCategory = ReadCategory.unplaced();
- preservationPolicy.treatment = readTreatment(list);
- break;
- case 'P':
- final int mismatches = readParam(list);
- preservationPolicy.baseCategories.add(BaseCategory.pileup(mismatches));
- preservationPolicy.treatment = readTreatment(list);
- break;
- case 'I':
- preservationPolicy.baseCategories.add(BaseCategory.insertion());
- preservationPolicy.treatment = readTreatment(list);
- break;
- case '_':
- preservationPolicy.treatment = readTreatment(list);
- break;
- case '*':
- preservationPolicy.readCategory = ReadCategory.all();
- preservationPolicy.treatment = readTreatment(list);
- break;
-
- default:
- throw new RuntimeException("Unknown read or base category: "
- + code);
- }
-
- if (preservationPolicy.treatment == null)
- preservationPolicy.treatment = QualityScoreTreatment.preserve();
- }
-
- return preservationPolicy;
- }
-
- private static void applyBinning(final byte[] scores) {
- for (int i = 0; i < scores.length; i++)
- scores[i] = Binning.ILLUMINA_BINNING_MATRIX[scores[i]];
- }
-
- private static byte applyTreatment(final byte score, final QualityScoreTreatment qualityScoreTreatment) {
- switch (qualityScoreTreatment.type) {
- case BIN:
- return Binning.ILLUMINA_BINNING_MATRIX[score];
- case DROP:
- return -1;
- case PRESERVE:
- return score;
-
- }
- throw new RuntimeException("Unknown quality score treatment type: "
- + qualityScoreTreatment.type.name());
- }
-
- public void addQualityScores(final SAMRecord samRecord, final CramCompressionRecord cramRecord,
- final ReferenceTracks referenceTracks) {
- if (samRecord.getBaseQualities() == SAMRecord.NULL_QUALS) {
- cramRecord.qualityScores = SAMRecord.NULL_QUALS;
- cramRecord.setForcePreserveQualityScores(false);
- return;
- }
-
- final byte[] scores = new byte[samRecord.getReadLength()];
- Arrays.fill(scores, (byte) -1);
- for (final PreservationPolicy preservationPolicy : policyList)
- addQS(samRecord, cramRecord, scores, referenceTracks, preservationPolicy);
-
- if (!cramRecord.isForcePreserveQualityScores()) {
- for (int i = 0; i < scores.length; i++) {
- if (scores[i] > -1) {
- if (cramRecord.readFeatures == null)
- cramRecord.readFeatures = new LinkedList<ReadFeature>();
- cramRecord.readFeatures.add(new BaseQualityScore(i + 1, scores[i]));
- }
- }
- if (cramRecord.readFeatures != null)
- Collections.sort(cramRecord.readFeatures, readFeaturePositionComparator);
- }
- cramRecord.qualityScores = scores;
- }
-
- private static final Comparator<ReadFeature> readFeaturePositionComparator = new Comparator<ReadFeature>() {
-
- @Override
- public int compare(final ReadFeature o1, final ReadFeature o2) {
- return o1.getPosition() - o2.getPosition();
- }
- };
-
- public boolean areReferenceTracksRequired() {
- if (policyList == null || policyList.isEmpty()) return false;
- for (final PreservationPolicy preservationPolicy : policyList) {
- if (preservationPolicy.baseCategories == null || preservationPolicy.baseCategories.isEmpty())
- continue;
- for (final BaseCategory c : preservationPolicy.baseCategories) {
- switch (c.type) {
- case LOWER_COVERAGE:
- case PILEUP:
- return true;
-
- default:
- break;
- }
- }
- }
- return false;
-
- }
-
- private static void addQS(final SAMRecord samRecord, final CramCompressionRecord cramRecord,
- final byte[] scores, final ReferenceTracks referenceTracks, final PreservationPolicy preservationPolicy) {
- final int alSpan = samRecord.getAlignmentEnd() - samRecord.getAlignmentStart();
- final byte[] qualityScores = samRecord.getBaseQualities();
-
- // check if read is falling into the read category:
- if (preservationPolicy.readCategory != null) {
- @SuppressWarnings("UnusedAssignment") boolean properRead = false;
- switch (preservationPolicy.readCategory.type) {
- case ALL:
- properRead = true;
- break;
- case UNPLACED:
- properRead = samRecord.getReadUnmappedFlag();
- break;
- case LOWER_MAPPING_SCORE:
- properRead = samRecord.getMappingQuality() < preservationPolicy.readCategory.param;
- break;
- case HIGHER_MAPPING_SCORE:
- properRead = samRecord.getMappingQuality() > preservationPolicy.readCategory.param;
- break;
-
- default:
- throw new RuntimeException("Unknown read category: "
- + preservationPolicy.readCategory.type.name());
- }
-
- if (!properRead) // nothing to do here:
- return;
- }
-
- // apply treatment if there is no per-base policy:
- if (preservationPolicy.baseCategories == null || preservationPolicy.baseCategories.isEmpty()) {
- switch (preservationPolicy.treatment.type) {
- case BIN:
- if (cramRecord.qualityScores == null)
- cramRecord.qualityScores = samRecord.getBaseQualities();
- System.arraycopy(samRecord.getBaseQualities(), 0, scores, 0,
- scores.length);
- applyBinning(scores);
- cramRecord.setForcePreserveQualityScores(true);
- break;
- case PRESERVE:
- System.arraycopy(samRecord.getBaseQualities(), 0, scores, 0,
- scores.length);
- cramRecord.setForcePreserveQualityScores(true);
- break;
- case DROP:
- cramRecord.qualityScores = null;
- cramRecord.setForcePreserveQualityScores(false);
- break;
-
- default:
- throw new RuntimeException(
- "Unknown quality score treatment type: "
- + preservationPolicy.treatment.type.name());
- }
-
- // nothing else to do here:
- return;
- }
-
- // here we go, scan all bases to check if the policy applies:
- final boolean[] mask = new boolean[qualityScores.length];
-
- final int alStart = samRecord.getAlignmentStart();
- // must be a mapped read at this point:
- if (alStart == SAMRecord.NO_ALIGNMENT_START)
- return;
- referenceTracks.ensureRange(alStart, alSpan);
-
- for (final BaseCategory baseCategory : preservationPolicy.baseCategories) {
- int pos;
- int refPos;
- switch (baseCategory.type) {
- case FLANKING_DELETION:
- pos = 0;
- for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
- if (cigarElement.getOperator() == CigarOperator.D) {
- // if (pos > 0)
- mask[pos] = true;
- if (pos + 1 < mask.length)
- mask[pos + 1] = true;
- }
-
- pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
- .getLength() : 0;
- }
- break;
- case MATCH:
- case MISMATCH:
- pos = 0;
- refPos = samRecord.getAlignmentStart();
- for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
- if (cigarElement.getOperator().consumesReadBases()) {
- for (int i = 0; i < cigarElement.getLength(); i++) {
- final boolean match = samRecord.getReadBases()[pos + i] == referenceTracks
- .baseAt(refPos + i);
- mask[pos + i] = (baseCategory.type == BaseCategoryType.MATCH && match)
- || (baseCategory.type == BaseCategoryType.MISMATCH && !match);
- }
- pos += cigarElement.getLength();
- }
- refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement
- .getLength() : 0;
- }
- break;
- case INSERTION:
- pos = 0;
- for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
- switch (cigarElement.getOperator()) {
- case I:
- for (int i = 0; i < cigarElement.getLength(); i++)
- mask[pos + i] = true;
- break;
- default:
- break;
- }
-
- pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
- .getLength() : 0;
- }
- break;
- case LOWER_COVERAGE:
- pos = 1;
- refPos = samRecord.getAlignmentStart();
- for (final CigarElement cigarElement : samRecord.getCigar().getCigarElements()) {
- switch (cigarElement.getOperator()) {
- case M:
- case EQ:
- case X:
- for (int i = 0; i < cigarElement.getLength(); i++)
- mask[pos + i - 1] = referenceTracks.coverageAt(refPos + i) < baseCategory.param;
- break;
- default:
- break;
- }
-
- pos += cigarElement.getOperator().consumesReadBases() ? cigarElement
- .getLength() : 0;
- refPos += cigarElement.getOperator().consumesReferenceBases() ? cigarElement
- .getLength() : 0;
- }
- break;
- case PILEUP:
- for (int i = 0; i < qualityScores.length; i++)
- if (referenceTracks.mismatchesAt(alStart + i) > baseCategory.param)
- mask[i] = true;
- break;
-
- default:
- break;
- }
-
- }
-
- int maskedCount = 0;
- for (int i = 0; i < mask.length; i++)
- if (mask[i]) {
- scores[i] = applyTreatment(qualityScores[i], preservationPolicy.treatment);
- maskedCount++;
- }
-
- // safety latch, store all qs if there are too many individual score
- // to store:
- if (maskedCount > samRecord.getReadLength() / 2)
- cramRecord.setForcePreserveQualityScores(true);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java
deleted file mode 100644
index 6f9a7e3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatment.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class QualityScoreTreatment {
- public final QualityScoreTreatmentType type;
- public final int param;
-
- private QualityScoreTreatment(final QualityScoreTreatmentType type, final int param) {
- this.type = type;
- this.param = param;
- }
-
- public static QualityScoreTreatment preserve() {
- return new QualityScoreTreatment(
- QualityScoreTreatmentType.PRESERVE, 40);
- }
-
- public static QualityScoreTreatment drop() {
- return new QualityScoreTreatment(QualityScoreTreatmentType.DROP, 40);
- }
-
- public static QualityScoreTreatment bin(final int bins) {
- return new QualityScoreTreatment(QualityScoreTreatmentType.BIN,
- bins);
- }
-
- @Override
- public String toString() {
- return String.format("[%s%d]", type.name(), param);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java b/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java
deleted file mode 100644
index dfb61dc..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/QualityScoreTreatmentType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum QualityScoreTreatmentType {
- PRESERVE, BIN, DROP
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java b/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java
deleted file mode 100644
index 14a41b3..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public class ReadCategory {
- public final ReadCategoryType type;
- public final int param;
-
- private ReadCategory(final ReadCategoryType type, final int param) {
- this.type = type;
- this.param = param;
- }
-
- public static ReadCategory unplaced() {
- return new ReadCategory(ReadCategoryType.UNPLACED, -1);
- }
-
- public static ReadCategory higher_than_mapping_score(final int score) {
- return new ReadCategory(ReadCategoryType.HIGHER_MAPPING_SCORE,
- score);
- }
-
- public static ReadCategory lower_than_mapping_score(final int score) {
- return new ReadCategory(ReadCategoryType.LOWER_MAPPING_SCORE, score);
- }
-
- public static ReadCategory all() {
- return new ReadCategory(ReadCategoryType.ALL, -1);
- }
-
- @Override
- public String toString() {
- return String.format("[%s%d]", type.name(), param);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java b/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java
deleted file mode 100644
index 7924550..0000000
--- a/src/main/java/htsjdk/samtools/cram/lossy/ReadCategoryType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.lossy;
-
-public enum ReadCategoryType {
- UNPLACED('P'), HIGHER_MAPPING_SCORE('M'), LOWER_MAPPING_SCORE('m'), ALL('*');
-
- @SuppressWarnings("FieldCanBeLocal")
- private final char code;
-
- ReadCategoryType(final char code) {
- this.code = code;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java b/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java
deleted file mode 100644
index c77aaae..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/CRAMReferenceSource.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Interface used to supply a reference source when reading CRAM files.
- */
-public interface CRAMReferenceSource {
-
- /**
- * getReferenceBases
- * @param sequenceRecord the SAMSequenceRecord identifying the reference
- * being requested
- * @param tryNameVariants if true, attempt to match the requested sequence name
- * against the reference by using common name variations,
- * such as adding or removing a leading "chr" prefix
- * from the requested name. if false, use exact match
- * @return the upper cased, normalized (see {@link htsjdk.samtools.cram.build.Utils#normalizeBase})
- * bases representing the requested sequence, or null if the sequence cannot be found
- */
- byte[] getReferenceBases(final SAMSequenceRecord sequenceRecord, final boolean tryNameVariants);
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java b/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java
deleted file mode 100644
index 4d99d1e..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/EnaRefService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class EnaRefService {
- private static final Log log = Log.getInstance(EnaRefService.class);
- private static final int HTTP_OK = 200;
- private static final int HTTP_FOUND = 302;
- private static final int HTTP_NOT_FOUND = 404;
- private static final int HTTP_INTERNAL_SEVER_PROBLEM = 500;
- private static final int HTTP_CONNECTION_TIMEOUT = 522;
-
- byte[] getSequence(final String md5) throws GaveUpException {
- final int restBetweenTries_ms = 0;
- final int maxTries = 1;
- final int timeout_ms = 0;
- return getSequence(md5, timeout_ms, maxTries, restBetweenTries_ms);
- }
-
- /**
- * Tries to download sequence bases using its md5 checksum. This method can
- * try downloading the sequence many times before giving up.
- *
- * @param md5 MD5 checksum string of the sequence to download
- * @param timeoutMs timeout in milliseconds before failing with the {@link EnaRefService.GaveUpException}
- * @param maxTries maximum number of tries before failing with the {@link EnaRefService.GaveUpException}
- * @param restBetweenTriesMs wait this number of milliseconds before repeating attempt
- * @return sequence bases or null if there is no sequence with such md5
- * @throws GaveUpException if the sequence could not be downloaded within the time/try
- * limit.
- */
- byte[] getSequence(final String md5, final long timeoutMs, int maxTries, final long restBetweenTriesMs) throws
- GaveUpException {
- if (md5 == null)
- throw new NullPointerException("Expecting sequence md5 but got null.");
- if (!md5.matches("[a-z0-9]{32}"))
- throw new RuntimeException("Does not look like an md5 checksum: " + md5);
-
- final String httpEbiString = "http://www.ebi.ac.uk/ena/cram/md5/%s";
- final String urlString = String.format(httpEbiString, md5);
- final URL url;
- try {
- url = new URL(urlString);
- } catch (final MalformedURLException e) {
- throw new RuntimeException("Invalid sequence url: " + urlString, e);
- }
-
- InputStream inputStream = null;
- final long startTime = System.currentTimeMillis();
- do {
- try {
- final HttpURLConnection http = (HttpURLConnection) url.openConnection();
- final int readTimeoutMs = 0;
- http.setReadTimeout(readTimeoutMs);
- final int code = http.getResponseCode();
- switch (code) {
- case HTTP_OK:
- inputStream = http.getInputStream();
- if (inputStream == null)
- throw new RuntimeException("Failed to download sequence for md5: " + md5);
-
- log.info("Downloading reference sequence: " + urlString);
- final byte[] bases = InputStreamUtils.readFully(inputStream);
- log.info("Downloaded " + bases.length + " bases.");
- return bases;
- case HTTP_NOT_FOUND:
- return null;
- case HTTP_CONNECTION_TIMEOUT:
- case HTTP_INTERNAL_SEVER_PROBLEM:
- break;
- default:
- throw new RuntimeException("Unknown http status code: " + code);
- }
-
- if (startTime - System.currentTimeMillis() < timeoutMs && maxTries > 1 && restBetweenTriesMs > 0)
- try {
- Thread.sleep(restBetweenTriesMs);
- } catch (final InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- } catch (final IOException e) {
- log.error("Connection attempt failed: " + e.getMessage());
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (final Exception e) {
- log.error(e.getMessage());
- }
- }
- }
-
- } while (startTime - System.currentTimeMillis() < timeoutMs && --maxTries > 0);
-
- throw new GaveUpException(md5);
- }
-
- public static class GaveUpException extends Exception {
- private static final long serialVersionUID = -8997576068346912410L;
- private String md5;
-
- public GaveUpException(final String md5) {
- this.setMd5(md5);
- }
-
- public String getMd5() {
- return md5;
- }
-
- public void setMd5(final String md5) {
- this.md5 = md5;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java b/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java
deleted file mode 100644
index 34bfc19..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/InMemoryReferenceSequenceFile.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-class InMemoryReferenceSequenceFile implements ReferenceSequenceFile {
- private Map<Integer, byte[]> sequences = new HashMap<Integer, byte[]>();
- private SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- private int currentIndex = 0;
-
- public void addSequence(final String name, final byte[] bases) {
- final SAMSequenceRecord r = new SAMSequenceRecord(name, bases.length);
- dictionary.addSequence(r);
- final int index = getSequenceDictionary().getSequenceIndex(name);
- sequences.put(index, bases);
- }
-
- @Override
- public ReferenceSequence getSequence(final String name) {
- final int index = getSequenceDictionary().getSequenceIndex(name);
- return new ReferenceSequence(name, index, sequences.get(index));
- }
-
- @Override
- public SAMSequenceDictionary getSequenceDictionary() {
- return dictionary;
- }
-
- @Override
- public ReferenceSequence getSubsequenceAt(final String name, final long start, final long stop) {
- final int index = getSequenceDictionary().getSequenceIndex(name);
- final byte[] bases = Arrays.copyOfRange(sequences.get(index), (int) start,
- (int) stop + 1);
- return new ReferenceSequence(name, index, bases);
- }
-
- @Override
- public void close() throws IOException {
- sequences = null;
- dictionary = null;
- }
-
- /**
- * Returns a new object representing the requested region on the reference sequence.
- * @param name name of the reference sequence
- * @param start inclusive starting position on the reference sequence
- * @param stop inclusive end position on the reference sequence
- * @return a new region object
- */
- public ReferenceRegion getRegion(final String name, final long start, final long stop) {
- final int index = getSequenceDictionary().getSequenceIndex(name);
- if (!sequences.containsKey(index))
- throw new RuntimeException("Sequence not found: " + name);
-
- return new ReferenceRegion(sequences.get(index),
- index, name, start, stop);
- }
-
- @Override
- public boolean isIndexed() {
- return true;
- }
-
- @Override
- public ReferenceSequence nextSequence() {
- if (currentIndex >= dictionary.size())
- return null;
-
- final SAMSequenceRecord sequence = dictionary.getSequence(currentIndex++);
- return getSequence(sequence.getSequenceName());
- }
-
- @Override
- public void reset() {
- currentIndex = 0;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java
deleted file mode 100644
index 14799d2..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceRegion.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import java.util.Arrays;
-
-/**
- * A class representing a region on a reference sequence.
- */
-class ReferenceRegion {
- private final int index;
- private final String name;
- private long alignmentStart;
- private int arrayStart;
- private final byte[] array;
-
- /**
- * Construct reference sequence region with the given bases.
- * @param bases the bases for the sequence
- * @param sequenceIndex index in the {@link htsjdk.samtools.SAMSequenceDictionary}
- * @param sequenceName name of the reference sequence
- * @param alignmentStart 1-based inclusive position of the region start on the reference sequence
- * @param alignmentEnd 1-based inclusive position of the region end on the reference sequence
- */
- public ReferenceRegion(final byte[] bases, final int sequenceIndex,
- final String sequenceName, final long alignmentStart, long alignmentEnd) {
- this.array = bases;
- this.index = sequenceIndex;
- this.name = sequenceName;
-
- if (alignmentEnd == -1)
- alignmentEnd = bases.length;
-
- if (alignmentStart < 1 || alignmentEnd < alignmentStart
- || alignmentEnd - alignmentStart > bases.length
- || alignmentEnd - 1 > bases.length)
- throw new IllegalArgumentException(String.format(
- "Invalid reference region: %s, %d, %d.", sequenceName,
- alignmentStart, alignmentEnd));
-
- this.alignmentStart = alignmentStart;
-
- this.arrayStart = (int) (alignmentStart - 1);
- }
-
- int arrayPosition(final long alignmentPosition) {
- final int arrayPosition = (int) (arrayStart + (alignmentPosition - alignmentStart));
-
- if (arrayPosition < 0 || arrayPosition > array.length)
- throw new IllegalArgumentException(
- "The alignment position is out of the region: "
- + alignmentPosition);
-
- return arrayPosition;
- }
-
- public byte base(final long alignmentPosition) {
- return array[arrayPosition(alignmentPosition)];
- }
-
- public byte[] copy(final long alignmentStart, final int alignmentSpan) {
- final int from = arrayPosition(alignmentStart);
- final int to = arrayPosition(alignmentStart + alignmentSpan);
- return Arrays.copyOfRange(array, from, to);
- }
-
- public int getIndex() {
- return index;
- }
-
- public String getName() {
- return name;
- }
-
- public long getAlignmentStart() {
- return alignmentStart;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java
deleted file mode 100644
index e73fb41..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceSource.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.build.Utils;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.ref.WeakReference;
-import java.net.URL;
-import java.nio.file.Path;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Used to represent a CRAM reference, the backing source for which can either be
- * a file or the EBI ENA reference service.
- *
- * NOTE: In a future release, this class will be renamed and the functionality it
- * contains will be refactored and distributed into one or more separate reference
- * source implementations, each corresponding to the type of resource backing the
- * reference.
- */
-public class ReferenceSource implements CRAMReferenceSource {
- private static final Log log = Log.getInstance(ReferenceSource.class);
- private ReferenceSequenceFile rsFile;
- private int downloadTriesBeforeFailing = 2;
-
- private final Map<String, WeakReference<byte[]>> cacheW = new HashMap<String, WeakReference<byte[]>>();
-
- private ReferenceSource() {
- }
-
- public ReferenceSource(final File file) {
- this(file == null ? null : file.toPath());
- }
-
- public ReferenceSource(final Path path) {
- if (path != null)
- rsFile = ReferenceSequenceFileFactory.getReferenceSequenceFile(path);
- }
-
- public ReferenceSource(final ReferenceSequenceFile rsFile) {
- this.rsFile = rsFile;
- }
-
- /**
- * Attempts to construct a default CRAMReferenceSource for use with CRAM files when
- * one has not been explicitly provided.
- *
- * @return CRAMReferenceSource if one can be acquired. Guaranteed to not be null if none
- * of the listed exceptions is thrown.
- * @throws IllegalStateException if no default reference source can be acquired
- * @throws IllegalArgumentException if the reference_fasta environment variable refers to a
- * a file that doesn't exist
- *<p>
- * Construct a default reference source to use when an explicit reference has not been
- * provided by checking for fallback sources in this order:
- *<p><ul>
- * <li>Defaults.REFERENCE_FASTA - the value of the system property "reference_fasta". If set,
- * must refer to a valid reference file.</li>
- * <li>ENA Reference Service if it is enabled</li>
- * </ul>
- */
- public static CRAMReferenceSource getDefaultCRAMReferenceSource() {
- if (null != Defaults.REFERENCE_FASTA) {
- if (Defaults.REFERENCE_FASTA.exists()) {
- return new ReferenceSource(Defaults.REFERENCE_FASTA);
- }
- else {
- throw new IllegalArgumentException(
- "The file specified by the reference_fasta property does not exist: " + Defaults.REFERENCE_FASTA.getName());
- }
- }
- else if (Defaults.USE_CRAM_REF_DOWNLOAD) {
- return new ReferenceSource();
- }
- else {
- throw new IllegalStateException(
- "A valid CRAM reference was not supplied and one cannot be acquired via the property settings reference_fasta or use_cram_ref_download");
- }
- }
-
- public void clearCache() {
- cacheW.clear();
- }
-
- private byte[] findInCache(final String name) {
- final WeakReference<byte[]> weakReference = cacheW.get(name);
- if (weakReference != null) {
- final byte[] bytes = weakReference.get();
- if (bytes != null)
- return bytes;
- }
- return null;
- }
-
- // Upper case and normalize (-> ACGTN) in-place, and add to the cache
- private byte[] addToCache(final String sequenceName, final byte[] bases) {
- for (int i = 0; i < bases.length; i++) {
- bases[i] = Utils.normalizeBase(bases[i]);
- }
- cacheW.put(sequenceName, new WeakReference<byte[]>(bases));
- return bases;
- }
-
- public synchronized byte[] getReferenceBases(final SAMSequenceRecord record,
- final boolean tryNameVariants) {
- { // check cache by sequence name:
- final String name = record.getSequenceName();
- final byte[] bases = findInCache(name);
- if (bases != null) {
- return bases;
- }
- }
-
- final String md5 = record.getAttribute(SAMSequenceRecord.MD5_TAG);
- { // check cache by md5:
- if (md5 != null) {
- byte[] bases = findInCache(md5);
- if (bases != null)
- return bases;
- bases = findInCache(md5.toLowerCase());
- if (bases != null)
- return bases;
- bases = findInCache(md5.toUpperCase());
- if (bases != null)
- return bases;
- }
- }
-
- byte[] bases;
-
- { // try to fetch sequence by name:
- bases = findBasesByName(record.getSequenceName(), tryNameVariants);
- if (bases != null) {
- return addToCache(record.getSequenceName(), bases);
- }
- }
-
- {
- if (Defaults.USE_CRAM_REF_DOWNLOAD) { // try to fetch sequence by md5:
- if (md5 != null) {
- try {
- bases = findBasesByMD5(md5.toLowerCase());
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
- if (bases != null) {
- return addToCache(md5, bases);
- }
- }
- }
-
- // sequence not found, give up:
- return null;
- }
-
- byte[] findBasesByName(final String name, final boolean tryVariants) {
- if (rsFile == null || !rsFile.isIndexed())
- return null;
-
- ReferenceSequence sequence = null;
- try {
- sequence = rsFile.getSequence(name);
- } catch (final SAMException e) {
- // the only way to test if rsFile contains the sequence is to try and catch exception.
- }
- if (sequence != null)
- return sequence.getBases();
-
- if (tryVariants) {
- for (final String variant : getVariants(name)) {
- try {
- sequence = rsFile.getSequence(variant);
- } catch (final SAMException e) {
- log.warn("Sequence not found: " + variant);
- }
- if (sequence != null)
- return sequence.getBases();
- }
- }
- return null;
- }
-
- byte[] findBasesByMD5(final String md5) throws
- IOException {
- final String url = String.format(Defaults.EBI_REFERENCE_SERVICE_URL_MASK, md5);
-
- for (int i = 0; i < downloadTriesBeforeFailing; i++) {
- final InputStream is = new URL(url).openStream();
- if (is == null)
- return null;
-
- log.debug("Downloading reference sequence: " + url);
- final byte[] data = InputStreamUtils.readFully(is);
- log.debug("Downloaded " + data.length + " bytes for md5 " + md5);
- is.close();
-
- try {
- final String downloadedMD5 = SequenceUtil.calculateMD5String(data);
- if (md5.equals(downloadedMD5)) {
- return data;
- } else {
- final String message = String
- .format("Downloaded sequence is corrupt: requested md5=%s, received md5=%s",
- md5, downloadedMD5);
- log.error(message);
- }
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
- throw new RuntimeException("Giving up on downloading sequence for md5 "
- + md5);
- }
-
- private static final Pattern chrPattern = Pattern.compile("chr.*",
- Pattern.CASE_INSENSITIVE);
-
- List<String> getVariants(final String name) {
- final List<String> variants = new ArrayList<String>();
-
- if (name.equals("M"))
- variants.add("MT");
-
- if (name.equals("MT"))
- variants.add("M");
-
- final boolean chrPatternMatch = chrPattern.matcher(name).matches();
- if (chrPatternMatch)
- variants.add(name.substring(3));
- else
- variants.add("chr" + name);
-
- if ("chrM".equals(name)) {
- // chrM case:
- variants.add("MT");
- }
- return variants;
- }
-
- public int getDownloadTriesBeforeFailing() {
- return downloadTriesBeforeFailing;
- }
-
- public void setDownloadTriesBeforeFailing(final int downloadTriesBeforeFailing) {
- this.downloadTriesBeforeFailing = downloadTriesBeforeFailing;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java b/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java
deleted file mode 100644
index f81faed..0000000
--- a/src/main/java/htsjdk/samtools/cram/ref/ReferenceTracks.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.ref;
-
-import java.util.Arrays;
-
-public class ReferenceTracks {
- public static final int DEFAULT_WINDOW_SIZE = 1000000;
- private final int sequenceId;
- private final String sequenceName;
- private final byte[] reference;
-
- private int position;
-
- // a copy of ref bases for the given range:
- private final byte[] bases;
- private final short[] coverage;
- private final short[] mismatches;
-
-
- public ReferenceTracks(final int sequenceId, final String sequenceName,
- final byte[] reference) {
- this(sequenceId, sequenceName, reference, DEFAULT_WINDOW_SIZE);
- }
-
- private ReferenceTracks(final int sequenceId, final String sequenceName,
- final byte[] reference, final int windowSize) {
- this.sequenceId = sequenceId;
- this.sequenceName = sequenceName;
- this.reference = reference;
-
- bases = new byte[Math.min(windowSize, reference.length)];
- coverage = new short[Math.min(windowSize, reference.length)];
- mismatches = new short[Math.min(windowSize, reference.length)];
- position = 1;
-
- reset();
- }
-
- public int getSequenceId() {
- return sequenceId;
- }
-
- public String getSequenceName() {
- return sequenceName;
- }
-
- public int getWindowPosition() {
- return position;
- }
-
- public int getWindowLength() {
- return bases.length;
- }
-
- public int getReferenceLength() {
- return reference.length;
- }
-
- public void ensure(final int start, final int end) {
- if (end - start > bases.length)
- throw new RuntimeException("Window is too small for start " + start
- + " end " + end);
- if (position < start)
- moveForwardTo(start);
- }
-
- /**
- * Shift the window forward to a new position on the reference.
- *
- * @param newPos 1-based reference coordinate, must be greater than current
- * position and smaller than reference length.
- */
- void moveForwardTo(int newPos) {
- if (newPos - 1 >= reference.length)
- throw new RuntimeException("New position is beyond the reference: "
- + newPos);
-
- if (newPos < position)
- throw new RuntimeException(
- "Cannot shift to smaller position on the reference.");
-
- if (newPos > reference.length - bases.length + 1)
- newPos = reference.length - bases.length + 1;
-
- if (newPos == position)
- return;
-
- System.arraycopy(reference, newPos - 1, bases, 0,
- Math.min(bases.length, reference.length - newPos + 1));
-
- if (newPos > position && position + bases.length - newPos > 0) {
- for (int i = 0; i < coverage.length; i++) {
- if (i + newPos - position < coverage.length) {
- coverage[i] = coverage[i + newPos - position];
- mismatches[i] = mismatches[i + newPos - position];
- } else {
- coverage[i] = 0;
- mismatches[i] = 0;
- }
- }
- } else {
- Arrays.fill(coverage, (short) 0);
- Arrays.fill(mismatches, (short) 0);
- }
-
- this.position = newPos;
- }
-
- void reset() {
- System.arraycopy(reference, position - 1, bases, 0,
- Math.min(bases.length, reference.length - position + 1));
- Arrays.fill(coverage, (short) 0);
- Arrays.fill(mismatches, (short) 0);
- }
-
- public void ensureRange(final int start, final int length) {
- if (start < position)
- throw new RuntimeException("Cannot move the window backwards: "
- + start);
-
- if (start > position || start + length > position + bases.length)
- moveForwardTo(start);
- }
-
- public final byte baseAt(final int pos) {
- if (pos - this.position < coverage.length)
- return bases[pos - this.position];
- else
- return 'N';
- }
-
- public final short coverageAt(final int pos) {
- if (pos - this.position >= coverage.length)
- return 0;
- else {
- return coverage[pos - this.position];
- }
- }
-
- public final short mismatchesAt(final int pos) {
- if (pos - this.position >= coverage.length)
- return 0;
- else
- return mismatches[pos - this.position];
- }
-
- public final void addCoverage(final int pos, final int amount) {
- if (pos - this.position < coverage.length)
- coverage[pos - this.position] += amount;
- }
-
- public final void addMismatches(final int pos, final int amount) {
- if (pos - this.position < coverage.length)
- mismatches[pos - this.position] += amount;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java b/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java
deleted file mode 100644
index 6e18dd2..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/AlignmentSpan.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * A span of reads on a single reference.
- */
-public class AlignmentSpan {
- /**
- * A constant to represent an unmapped span.
- */
- public static final AlignmentSpan UNMAPPED_SPAN = new AlignmentSpan(SAMRecord.NO_ALIGNMENT_START, 0);
-
- private int start;
- private int span;
- private int count;
-
- /**
- * Create a new span with a single read in it.
- *
- * @param start alignment start of the span
- * @param span alignment span
- */
- public AlignmentSpan(final int start, final int span) {
- this.setStart(start);
- this.setSpan(span);
- this.count = 1;
- }
-
- /**
- * Create a new span with a multiple reads in it.
- *
- * @param start alignment start of the span
- * @param span alignment span
- * @param count number of reads in the span
- */
- public AlignmentSpan(final int start, final int span, final int count) {
- this.setStart(start);
- this.setSpan(span);
- this.count = count;
- }
-
- /**
- * Add multiple reads to the span.
- *
- * @param start alignment start
- * @param span alignment span
- * @param count number of reads to add
- */
- public void add(final int start, final int span, final int count) {
- if (this.getStart() > start) {
- this.setSpan(Math.max(this.getStart() + this.getSpan(), start + span) - start);
- this.setStart(start);
- } else if (this.getStart() < start) {
- this.setSpan(Math.max(this.getStart() + this.getSpan(), start + span) - this.getStart());
- } else {
- this.setSpan(Math.max(this.getSpan(), span));
- }
-
- this.count += count;
- }
-
- /**
- * Add a single read to the span
- *
- * @param start alignment start
- * @param span read span on the reference
- */
- public void addSingle(final int start, final int span) {
- add(start, span, 1);
- }
-
- public int getStart() {
- return start;
- }
-
- public void setStart(final int start) {
- this.start = start;
- }
-
- public int getSpan() {
- return span;
- }
-
- public void setSpan(final int span) {
- this.span = span;
- }
-
- public int getCount() {
- return count;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Block.java b/src/main/java/htsjdk/samtools/cram/structure/Block.java
deleted file mode 100644
index 2e99b8a..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Block.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.io.CRC32InputStream;
-import htsjdk.samtools.cram.io.CRC32OutputStream;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.ExternalCompression;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Class representing CRAM block concept and some methods to operate with block content. CRAM block is used to hold some (usually
- * homogeneous) binary data. An external compression can be applied to the content of a block. The class provides some instantiation static
- * methods, for example to read a block from an input stream. Blocks can be written out to an output stream, this may be considered as a way
- * to serialize/deserialize blocks.
- */
-public class Block {
- /**
- * Compression method that applied to this block's content.
- */
- private BlockCompressionMethod method;
- /**
- * Identifies CRAM content type of the block.
- */
- private BlockContentType contentType;
- /**
- * A handle to bind the block with it's metadata.
- */
- private int contentId;
- /**
- * The size of the compressed content in bytes.
- */
- private int compressedContentSize;
- /**
- * The size of the uncompressed content in bytes.
- */
- private int rawContentSize;
-
- /**
- * Uncompressed and compressed contents respectively.
- */
- private byte[] rawContent, compressedContent;
-
- public Block() {
- }
-
- /**
- * Deserialize the block from the {@link InputStream}. The reading is parametrized by the major CRAM version number.
- *
- * @param major CRAM version major number
- * @param inputStream input stream to read the block from
- * @return a new {@link Block} object with fields and content from the input stream
- * @throws IOException as per java IO contract
- */
- public static Block readFromInputStream(final int major, InputStream inputStream) throws IOException {
- final Block block = new Block();
- final boolean v3OrHigher = major >= CramVersions.CRAM_v3.major;
- if (v3OrHigher) inputStream = new CRC32InputStream(inputStream);
- block.setMethod(BlockCompressionMethod.values()[inputStream.read()]);
-
- final int contentTypeId = inputStream.read();
- block.setContentType(BlockContentType.values()[contentTypeId]);
-
- block.setContentId(ITF8.readUnsignedITF8(inputStream));
- block.compressedContentSize = ITF8.readUnsignedITF8(inputStream);
- block.rawContentSize = ITF8.readUnsignedITF8(inputStream);
-
- block.compressedContent = new byte[block.compressedContentSize];
- InputStreamUtils.readFully(inputStream, block.compressedContent, 0, block.compressedContent.length);
- if (v3OrHigher) {
- final int actualChecksum = ((CRC32InputStream) inputStream).getCRC32();
- final int checksum = CramInt.int32(inputStream);
- if (checksum != actualChecksum)
- throw new RuntimeException(String.format("Block CRC32 mismatch: %04x vs %04x", checksum, actualChecksum));
- }
-
- block.uncompress();
- return block;
- }
-
- /**
- * Create a new slice header block with the given uncompressed content. The block wil have RAW (no compression) and MAPPED_SLICE content
- * type.
- *
- * @param rawContent the content of the block
- * @return a new mapped slice {@link Block} object
- */
- public static Block buildNewSliceHeaderBlock(final byte[] rawContent) {
- return new Block(BlockContentType.MAPPED_SLICE, rawContent);
- }
-
- /**
- * Create a new core block with the given uncompressed content. The block wil have RAW (no compression) and CORE content type.
- *
- * @param rawContent the content of the block
- * @return a new core {@link Block} object
- */
- public static Block buildNewCore(final byte[] rawContent) {
- return new Block(BlockContentType.CORE, rawContent);
- }
-
- /**
- * Create a new core block with the given uncompressed content. The block wil have RAW (no compression) and CORE content type.
- *
- * @param rawContent the content of the block
- * @return a new core {@link Block} object
- */
- public static Block buildNewFileHeaderBlock(final byte[] rawContent) {
- final Block block = new Block(BlockContentType.FILE_HEADER, rawContent);
- block.compress();
- return block;
- }
-
- private Block(final BlockContentType contentType, final byte[] rawContent) {
- this.setMethod(BlockCompressionMethod.RAW);
- this.setContentType(contentType);
- this.setContentId(0);
- if (rawContent != null) setRawContent(rawContent);
- }
-
- @Override
- public String toString() {
- final String raw = rawContent == null ? "NULL" : Arrays.toString(Arrays.copyOf(rawContent, Math.min(5, rawContent.length)));
- final String comp = compressedContent == null ? "NULL" : Arrays.toString(Arrays.copyOf(compressedContent, Math.min(5,
- compressedContent.length)));
-
- return String.format("method=%s, type=%s, id=%d, raw size=%d, compressed size=%d, raw=%s, comp=%s.", getMethod().name(),
- getContentType().name(), getContentId(), rawContentSize, compressedContentSize, raw, comp);
- }
-
- boolean isCompressed() {
- return compressedContent != null;
- }
-
- boolean isUncompressed() {
- return rawContent != null;
- }
-
- public void setRawContent(final byte[] raw) {
- rawContent = raw;
- rawContentSize = raw == null ? 0 : raw.length;
-
- compressedContent = null;
- compressedContentSize = 0;
- }
-
- public byte[] getRawContent() {
- if (rawContent == null) uncompress();
- return rawContent;
- }
-
- public int getRawContentSize() {
- return rawContentSize;
- }
-
- public void setContent(final byte[] raw, final byte[] compressed) {
- rawContent = raw;
- compressedContent = compressed;
-
- if (raw == null) rawContentSize = 0;
- else rawContentSize = raw.length;
-
- if (compressed == null) compressedContentSize = 0;
- else compressedContentSize = compressed.length;
- }
-
- void setCompressedContent(final byte[] compressed) {
- this.compressedContent = compressed;
- compressedContentSize = compressed == null ? 0 : compressed.length;
-
- rawContent = null;
- rawContentSize = 0;
- }
-
- byte[] getCompressedContent() {
- if (compressedContent == null) compress();
- return compressedContent;
- }
-
- private void compress() {
- if (compressedContent != null || rawContent == null) return;
-
- switch (getMethod()) {
- case RAW:
- compressedContent = rawContent;
- compressedContentSize = rawContentSize;
- break;
- case GZIP:
- try {
- compressedContent = ExternalCompression.gzip(rawContent);
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.", e);
- }
- compressedContentSize = compressedContent.length;
- break;
- case RANS:
- compressedContent = ExternalCompression.rans(rawContent, 1);
- compressedContentSize = compressedContent.length;
- break;
- default:
- break;
- }
- }
-
- private void uncompress() {
- if (rawContent != null || compressedContent == null) return;
-
- switch (getMethod()) {
- case RAW:
- rawContent = compressedContent;
- rawContentSize = compressedContentSize;
- break;
- case GZIP:
- try {
- rawContent = ExternalCompression.gunzip(compressedContent);
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.", e);
- }
- break;
- case BZIP2:
- try {
- rawContent = ExternalCompression.unbzip2(compressedContent);
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.", e);
- }
- break;
- case LZMA:
- try {
- rawContent = ExternalCompression.unxz(compressedContent);
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.", e);
- }
- break;
- case RANS:
- rawContent = ExternalCompression.unrans(compressedContent);
- break;
- default:
- throw new RuntimeException("Unknown block compression method: " + getMethod().name());
- }
- }
-
- /**
- * Write the block out to the the specified {@link OutputStream}. The method is parametrized with CRAM major version number.
- *
- * @param major CRAM version major number
- * @param outputStream output stream to write to
- * @throws IOException as per java IO contract
- */
- public void write(final int major, final OutputStream outputStream) throws IOException {
- if (major >= CramVersions.CRAM_v3.major) {
-
- final CRC32OutputStream crc32OutputStream = new CRC32OutputStream(outputStream);
-
- doWrite(crc32OutputStream);
-
- outputStream.write(crc32OutputStream.getCrc32_LittleEndian());
- } else doWrite(outputStream);
- }
-
- private void doWrite(final OutputStream outputStream) throws IOException {
- if (!isCompressed()) compress();
- if (!isUncompressed()) uncompress();
-
- outputStream.write(getMethod().ordinal());
- outputStream.write(getContentType().ordinal());
-
- ITF8.writeUnsignedITF8(getContentId(), outputStream);
- ITF8.writeUnsignedITF8(compressedContentSize, outputStream);
- ITF8.writeUnsignedITF8(rawContentSize, outputStream);
-
- outputStream.write(getCompressedContent());
- }
-
- BlockCompressionMethod getMethod() {
- return method;
- }
-
- public void setMethod(final BlockCompressionMethod method) {
- this.method = method;
- }
-
- public BlockContentType getContentType() {
- return contentType;
- }
-
- public void setContentType(final BlockContentType contentType) {
- this.contentType = contentType;
- }
-
- public int getContentId() {
- return contentId;
- }
-
- public void setContentId(final int contentId) {
- this.contentId = contentId;
- }
-
- public int getCompressedContentSize() {
- return compressedContentSize;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java b/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java
deleted file mode 100644
index 918b3bd..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/BlockCompressionMethod.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum BlockCompressionMethod {
- RAW, GZIP, BZIP2, LZMA, RANS
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java b/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java
deleted file mode 100644
index e10b9f1..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/BlockContentType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum BlockContentType {
- FILE_HEADER, COMPRESSION_HEADER, MAPPED_SLICE, RESERVED, EXTERNAL, CORE
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java b/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java
deleted file mode 100644
index 2278bf1..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CompressionHeader.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.encoding.ExternalCompressor;
-import htsjdk.samtools.cram.encoding.NullEncoding;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class CompressionHeader {
- private static final String RN_readNamesIncluded = "RN";
- private static final String AP_alignmentPositionIsDelta = "AP";
- private static final String RR_referenceRequired = "RR";
- private static final String TD_tagIdsDictionary = "TD";
- private static final String SM_substitutionMatrix = "SM";
-
- private static final Log log = Log.getInstance(CompressionHeader.class);
-
- public boolean readNamesIncluded;
- public boolean APDelta = true;
- private boolean referenceRequired = true;
-
- public Map<EncodingKey, EncodingParams> encodingMap;
- public Map<Integer, EncodingParams> tMap;
- public final Map<Integer, ExternalCompressor> externalCompressors = new HashMap<Integer, ExternalCompressor>();
-
- public SubstitutionMatrix substitutionMatrix;
-
- public List<Integer> externalIds;
-
- public byte[][][] dictionary;
-
- public CompressionHeader() {
- }
-
- private CompressionHeader(final InputStream inputStream) throws IOException {
- read(inputStream);
- }
-
- private byte[][][] parseDictionary(final byte[] bytes) {
- final List<List<byte[]>> dictionary = new ArrayList<List<byte[]>>();
- {
- int i = 0;
- while (i < bytes.length) {
- final List<byte[]> list = new ArrayList<byte[]>();
- while (bytes[i] != 0) {
- list.add(Arrays.copyOfRange(bytes, i, i + 3));
- i += 3;
- }
- i++;
- dictionary.add(list);
- }
- }
-
- int maxWidth = 0;
- for (final List<byte[]> list : dictionary)
- maxWidth = Math.max(maxWidth, list.size());
-
- final byte[][][] array = new byte[dictionary.size()][][];
- for (int i = 0; i < dictionary.size(); i++) {
- final List<byte[]> list = dictionary.get(i);
- array[i] = list.toArray(new byte[list.size()][]);
- }
-
- return array;
- }
-
- private byte[] dictionaryToByteArray() {
- int size = 0;
- for (final byte[][] dictionaryArrayArray : dictionary) {
- for (final byte[] dictionaryArray : dictionaryArrayArray) size += dictionaryArray.length;
- size++;
- }
-
- final byte[] bytes = new byte[size];
- final ByteBuffer buffer = ByteBuffer.wrap(bytes);
- for (final byte[][] dictionaryArrayArray : dictionary) {
- for (final byte[] dictionaryArray : dictionaryArrayArray) buffer.put(dictionaryArray);
- buffer.put((byte) 0);
- }
-
- return bytes;
- }
-
- public byte[][] getTagIds(final int id) {
- return dictionary[id];
- }
-
- public void read(final byte[] data) {
- try {
- read(new ByteArrayInputStream(data));
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.");
- }
- }
-
- void read(final InputStream is) throws IOException {
- { // preservation map:
- final int byteSize = ITF8.readUnsignedITF8(is);
- final byte[] bytes = new byte[byteSize];
- InputStreamUtils.readFully(is, bytes, 0, bytes.length);
- final ByteBuffer buffer = ByteBuffer.wrap(bytes);
-
- final int mapSize = ITF8.readUnsignedITF8(buffer);
- for (int i = 0; i < mapSize; i++) {
- final String key = new String(new byte[]{buffer.get(), buffer.get()});
- if (RN_readNamesIncluded.equals(key))
- readNamesIncluded = buffer.get() == 1;
- else if (AP_alignmentPositionIsDelta.equals(key))
- APDelta = buffer.get() == 1;
- else if (RR_referenceRequired.equals(key))
- referenceRequired = buffer.get() == 1;
- else if (TD_tagIdsDictionary.equals(key)) {
- final int size = ITF8.readUnsignedITF8(buffer);
- final byte[] dictionaryBytes = new byte[size];
- buffer.get(dictionaryBytes);
- dictionary = parseDictionary(dictionaryBytes);
- } else if (SM_substitutionMatrix.equals(key)) {
- // parse subs matrix here:
- final byte[] matrixBytes = new byte[5];
- buffer.get(matrixBytes);
- substitutionMatrix = new SubstitutionMatrix(matrixBytes);
- } else
- throw new RuntimeException("Unknown preservation map key: "
- + key);
- }
- }
-
- { // encoding map:
- final int byteSize = ITF8.readUnsignedITF8(is);
- final byte[] bytes = new byte[byteSize];
- InputStreamUtils.readFully(is, bytes, 0, bytes.length);
- final ByteBuffer buffer = ByteBuffer.wrap(bytes);
-
- final int mapSize = ITF8.readUnsignedITF8(buffer);
- encodingMap = new TreeMap<EncodingKey, EncodingParams>();
- for (final EncodingKey encodingKey : EncodingKey.values())
- encodingMap.put(encodingKey, NullEncoding.toParam());
-
- for (int i = 0; i < mapSize; i++) {
- final String key = new String(new byte[]{buffer.get(), buffer.get()});
- final EncodingKey encodingKey = EncodingKey.byFirstTwoChars(key);
- if (encodingKey == null) {
- throw new CRAMException("Unknown encoding key: " + key);
- }
-
- final EncodingID id = EncodingID.values()[buffer.get()];
- final int paramLen = ITF8.readUnsignedITF8(buffer);
- final byte[] paramBytes = new byte[paramLen];
- buffer.get(paramBytes);
-
- encodingMap.put(encodingKey, new EncodingParams(id, paramBytes));
-
- log.debug(String.format("FOUND ENCODING: %s, %s, %s.",
- encodingKey.name(), id.name(),
- Arrays.toString(Arrays.copyOf(paramBytes, 20))));
- }
- }
-
- { // tag encoding map:
- final int byteSize = ITF8.readUnsignedITF8(is);
- final byte[] bytes = new byte[byteSize];
- InputStreamUtils.readFully(is, bytes, 0, bytes.length);
- final ByteBuffer buf = ByteBuffer.wrap(bytes);
-
- final int mapSize = ITF8.readUnsignedITF8(buf);
- tMap = new TreeMap<Integer, EncodingParams>();
- for (int i = 0; i < mapSize; i++) {
- final int key = ITF8.readUnsignedITF8(buf);
-
- final EncodingID id = EncodingID.values()[buf.get()];
- final int paramLen = ITF8.readUnsignedITF8(buf);
- final byte[] paramBytes = new byte[paramLen];
- buf.get(paramBytes);
-
- tMap.put(key, new EncodingParams(id, paramBytes));
- }
- }
- }
-
- public byte[] toByteArray() throws IOException {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- write(byteArrayOutputStream);
- return byteArrayOutputStream.toByteArray();
- }
-
- void write(final OutputStream outputStream) throws IOException {
-
- { // preservation map:
- final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
- ITF8.writeUnsignedITF8(5, mapBuffer);
-
- mapBuffer.put(RN_readNamesIncluded.getBytes());
- mapBuffer.put((byte) (readNamesIncluded ? 1 : 0));
-
- mapBuffer.put(AP_alignmentPositionIsDelta.getBytes());
- mapBuffer.put((byte) (APDelta ? 1 : 0));
-
- mapBuffer.put(RR_referenceRequired.getBytes());
- mapBuffer.put((byte) (referenceRequired ? 1 : 0));
-
- mapBuffer.put(SM_substitutionMatrix.getBytes());
- mapBuffer.put(substitutionMatrix.getEncodedMatrix());
-
- mapBuffer.put(TD_tagIdsDictionary.getBytes());
- {
- final byte[] dictionaryBytes = dictionaryToByteArray();
- ITF8.writeUnsignedITF8(dictionaryBytes.length, mapBuffer);
- mapBuffer.put(dictionaryBytes);
- }
-
- mapBuffer.flip();
- final byte[] mapBytes = new byte[mapBuffer.limit()];
- mapBuffer.get(mapBytes);
-
- ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
- outputStream.write(mapBytes);
- }
-
- { // encoding map:
- int size = 0;
- for (final EncodingKey encodingKey : encodingMap.keySet()) {
- if (encodingMap.get(encodingKey).id != EncodingID.NULL)
- size++;
- }
-
- final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
- ITF8.writeUnsignedITF8(size, mapBuffer);
- for (final EncodingKey encodingKey : encodingMap.keySet()) {
- if (encodingMap.get(encodingKey).id == EncodingID.NULL)
- continue;
-
- mapBuffer.put((byte) encodingKey.name().charAt(0));
- mapBuffer.put((byte) encodingKey.name().charAt(1));
-
- final EncodingParams params = encodingMap.get(encodingKey);
- mapBuffer.put((byte) (0xFF & params.id.ordinal()));
- ITF8.writeUnsignedITF8(params.params.length, mapBuffer);
- mapBuffer.put(params.params);
- }
- mapBuffer.flip();
- final byte[] mapBytes = new byte[mapBuffer.limit()];
- mapBuffer.get(mapBytes);
-
- ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
- outputStream.write(mapBytes);
- }
-
- { // tag encoding map:
- final ByteBuffer mapBuffer = ByteBuffer.allocate(1024 * 100);
- ITF8.writeUnsignedITF8(tMap.size(), mapBuffer);
- for (final Integer encodingKey : tMap.keySet()) {
- ITF8.writeUnsignedITF8(encodingKey, mapBuffer);
-
- final EncodingParams params = tMap.get(encodingKey);
- mapBuffer.put((byte) (0xFF & params.id.ordinal()));
- ITF8.writeUnsignedITF8(params.params.length, mapBuffer);
- mapBuffer.put(params.params);
- }
- mapBuffer.flip();
- final byte[] mapBytes = new byte[mapBuffer.limit()];
- mapBuffer.get(mapBytes);
-
- ITF8.writeUnsignedITF8(mapBytes.length, outputStream);
- outputStream.write(mapBytes);
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Container.java b/src/main/java/htsjdk/samtools/cram/structure/Container.java
deleted file mode 100644
index 2a4eb3b..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Container.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-
-public class Container {
- // container header as defined in the specs:
- /**
- * Byte size of the content excluding header.
- */
- public int containerByteSize;
- public int sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- public int alignmentStart = Slice.NO_ALIGNMENT_START;
- public int alignmentSpan = Slice.NO_ALIGNMENT_SPAN;
- public int nofRecords = 0;
- public long globalRecordCounter = 0;
-
- public long bases = 0;
- public int blockCount = -1;
- public int[] landmarks;
- public int checksum = 0;
-
- /**
- * Container data
- */
- public Block[] blocks;
-
- public CompressionHeader header;
-
- // slices found in the container:
- public Slice[] slices;
-
- // for performance measurement:
- public long buildHeaderTime;
- public long buildSlicesTime;
- public long writeTime;
- public long parseTime;
- public long readTime;
-
- // for indexing:
- /**
- * Container start in the stream.
- */
- public long offset;
-
- @Override
- public String toString() {
- return String
- .format("seqID=%d, start=%d, span=%d, records=%d, slices=%d, blocks=%d.",
- sequenceId, alignmentStart, alignmentSpan, nofRecords,
- slices == null ? -1 : slices.length, blockCount);
- }
-
- public boolean isEOF() {
- final boolean v3 = containerByteSize == 15 && sequenceId == -1
- && alignmentStart == 4542278 && blockCount == 1
- && nofRecords == 0 && (slices == null || slices.length == 0);
-
- final boolean v2 = containerByteSize == 11 && sequenceId == -1
- && alignmentStart == 4542278 && blockCount == 1
- && nofRecords == 0 && (slices == null || slices.length == 0);
-
- return v3 || v2;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java b/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java
deleted file mode 100644
index fd6edfe..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ContainerHeaderIO.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.io.CRC32OutputStream;
-import htsjdk.samtools.cram.io.CramArray;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.LTF8;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-class ContainerHeaderIO {
-
- public boolean readContainerHeader(final Container container, final InputStream inputStream)
- throws IOException {
- return readContainerHeader(2, container, inputStream);
- }
-
- public boolean readContainerHeader(final int major, final Container container, final InputStream inputStream)
- throws IOException {
- final byte[] peek = new byte[4];
- int character = inputStream.read();
- if (character == -1)
- return false;
-
- peek[0] = (byte) character;
- for (int i = 1; i < peek.length; i++) {
- character = inputStream.read();
- if (character == -1)
- throw new RuntimeException("Incomplete or broken stream.");
- peek[i] = (byte) character;
- }
-
- container.containerByteSize = CramInt.int32(peek);
- container.sequenceId = ITF8.readUnsignedITF8(inputStream);
- container.alignmentStart = ITF8.readUnsignedITF8(inputStream);
- container.alignmentSpan = ITF8.readUnsignedITF8(inputStream);
- container.nofRecords = ITF8.readUnsignedITF8(inputStream);
- container.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream);
- container.bases = LTF8.readUnsignedLTF8(inputStream);
- container.blockCount = ITF8.readUnsignedITF8(inputStream);
- container.landmarks = CramArray.array(inputStream);
- if (major >= 3)
- container.checksum = CramInt.int32(inputStream);
-
- return true;
- }
-
- /**
- * Write CRAM {@link Container} out into the given {@link OutputStream}.
- * @param major CRAM major version
- * @param container container to be written
- * @param outputStream the output stream to write the container to
- * @return number of bytes written out to the output stream
- * @throws IOException as per java IO contract
- */
- public int writeContainerHeader(final int major, final Container container, final OutputStream outputStream)
- throws IOException {
- final CRC32OutputStream crc32OutputStream = new CRC32OutputStream(outputStream);
-
- int length = (CramInt.writeInt32(container.containerByteSize, crc32OutputStream) + 7) / 8;
- length += (ITF8.writeUnsignedITF8(container.sequenceId, crc32OutputStream) + 7) / 8;
- length += (ITF8.writeUnsignedITF8(container.alignmentStart, crc32OutputStream) + 7) / 8;
- length += (ITF8.writeUnsignedITF8(container.alignmentSpan, crc32OutputStream) + 7) / 8;
- length += (ITF8.writeUnsignedITF8(container.nofRecords, crc32OutputStream) + 7) / 8;
- length += (LTF8.writeUnsignedLTF8(container.globalRecordCounter, crc32OutputStream) + 7) / 8;
- length += (LTF8.writeUnsignedLTF8(container.bases, crc32OutputStream) + 7) / 8;
- length += (ITF8.writeUnsignedITF8(container.blockCount, crc32OutputStream) + 7) / 8;
- length += (CramArray.write(container.landmarks, crc32OutputStream) + 7) / 8;
-
- if (major >= 3) {
- outputStream.write(crc32OutputStream.getCrc32_LittleEndian());
- length += 4 ;
- }
-
- return length;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java b/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java
deleted file mode 100644
index 6796d34..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ContainerIO.java
+++ /dev/null
@@ -1,237 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.CramVersionPolicies;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.ExposedByteArrayOutputStream;
-import htsjdk.samtools.util.Log;
-import org.apache.commons.compress.utils.CountingOutputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Methods to read and write CRAM containers.
- */
-public class ContainerIO {
- private static final Log log = Log.getInstance(ContainerIO.class);
-
- /**
- * Reads a CRAM container from the input stream. Returns an EOF container when there is no more data or the EOF marker found.
- *
- * @param version CRAM version to expect
- * @param inputStream the stream to read from
- * @return a new container object read from the stream
- * @throws IOException as per java IO contract
- */
- public static Container readContainer(final Version version, final InputStream inputStream) throws IOException {
- final Container container = readContainer(version.major, inputStream);
- if (container == null) {
- // this will cause System.exit(1):
- CramVersionPolicies.eofNotFound(version);
-
- return readContainer(version.major, new ByteArrayInputStream(CramIO.ZERO_B_EOF_MARKER));
- }
- if (container.isEOF()) log.debug("EOF marker found, file/stream is complete.");
-
- return container;
- }
-
- /**
- * Reads next container from the stream.
- *
- * @param inputStream the stream to read from
- * @return CRAM container or null if no more data
- * @throws IOException
- */
- private static Container readContainer(final int major, final InputStream inputStream) throws IOException {
- return readContainer(major, inputStream, 0, Integer.MAX_VALUE);
- }
-
- /**
- * Reads container header only from a {@link InputStream}.
- *
- * @param major the CRAM version to assume
- * @param inputStream the input stream to read from
- * @return a new {@link Container} object with container header values filled out but empty body (no slices and blocks).
- * @throws IOException as per java IO contract
- */
- public static Container readContainerHeader(final int major, final InputStream inputStream) throws IOException {
- final Container container = new Container();
- final ContainerHeaderIO containerHeaderIO = new ContainerHeaderIO();
- if (!containerHeaderIO.readContainerHeader(major, container, inputStream)) {
- containerHeaderIO.readContainerHeader(container, new ByteArrayInputStream((major >= 3 ? CramIO.ZERO_F_EOF_MARKER : CramIO.ZERO_B_EOF_MARKER)));
- return container;
- }
- return container;
- }
-
- @SuppressWarnings("SameParameterValue")
- private static Container readContainer(final int major, final InputStream inputStream, final int fromSlice, int howManySlices) throws IOException {
-
- final long time1 = System.nanoTime();
- final Container container = readContainerHeader(major, inputStream);
- if (container.isEOF()) return container;
-
- final Block block = Block.readFromInputStream(major, inputStream);
- if (block.getContentType() != BlockContentType.COMPRESSION_HEADER)
- throw new RuntimeException("Content type does not match: " + block.getContentType().name());
- container.header = new CompressionHeader();
- container.header.read(block.getRawContent());
-
- howManySlices = Math.min(container.landmarks.length, howManySlices);
-
- if (fromSlice > 0) //noinspection ResultOfMethodCallIgnored
- inputStream.skip(container.landmarks[fromSlice]);
-
- final List<Slice> slices = new ArrayList<Slice>();
- for (int sliceCount = fromSlice; sliceCount < howManySlices - fromSlice; sliceCount++) {
- final Slice slice = new Slice();
- SliceIO.read(major, slice, inputStream);
- slice.index = sliceCount;
- slices.add(slice);
- }
-
- container.slices = slices.toArray(new Slice[slices.size()]);
-
- calculateSliceOffsetsAndSizes(container);
-
- final long time2 = System.nanoTime();
-
- log.debug("READ CONTAINER: " + container.toString());
- container.readTime = time2 - time1;
-
- return container;
- }
-
- private static void calculateSliceOffsetsAndSizes(final Container container) {
- if (container.slices.length == 0) return;
- for (int i = 0; i < container.slices.length - 1; i++) {
- final Slice slice = container.slices[i];
- slice.offset = container.landmarks[i];
- slice.size = container.landmarks[i + 1] - slice.offset;
- slice.containerOffset = container.offset;
- slice.index = i;
- }
- final Slice lastSlice = container.slices[container.slices.length - 1];
- lastSlice.offset = container.landmarks[container.landmarks.length - 1];
- lastSlice.size = container.containerByteSize - lastSlice.offset;
- lastSlice.containerOffset = container.offset;
- lastSlice.index = container.slices.length - 1;
- }
-
- /**
- * Writes a {@link Container} header information to a {@link OutputStream}.
- *
- * @param major the CRAM version to assume
- * @param container the container holding the header to write
- * @param outputStream the stream to write to
- * @return the number of bytes written
- * @throws IOException as per java IO contract
- */
- public static int writeContainerHeader(final int major, final Container container, final OutputStream outputStream) throws IOException {
- return new ContainerHeaderIO().writeContainerHeader(major, container, outputStream);
- }
-
- /**
- * Writes a complete {@link Container} with it's header to a {@link OutputStream}. The method is aware of file header containers and is
- * suitable for general purpose use: basically any container is allowed.
- *
- * @param version the CRAM version to assume
- * @param container the container to write
- * @param outputStream the stream to write to
- * @return the number of bytes written out
- * @throws IOException as per java IO contract
- */
- public static int writeContainer(final Version version, final Container container, final OutputStream outputStream) throws IOException {
- {
- if (container.blocks != null && container.blocks.length > 0) {
-
- final Block firstBlock = container.blocks[0];
- final boolean isFileHeaderContainer = firstBlock.getContentType() == BlockContentType.FILE_HEADER;
- if (isFileHeaderContainer) {
- final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
- firstBlock.write(version.major, byteArrayOutputStream);
- container.containerByteSize = byteArrayOutputStream.size();
-
- final int containerHeaderByteSize = new ContainerHeaderIO().writeContainerHeader(version.major, container, outputStream);
- outputStream.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
- return containerHeaderByteSize + byteArrayOutputStream.size();
- }
- }
- }
-
- final long time1 = System.nanoTime();
- final ExposedByteArrayOutputStream byteArrayOutputStream = new ExposedByteArrayOutputStream();
-
- final Block block = new Block();
- block.setContentType(BlockContentType.COMPRESSION_HEADER);
- block.setContentId(0);
- block.setMethod(BlockCompressionMethod.RAW);
- final byte[] bytes;
- try {
- bytes = container.header.toByteArray();
- } catch (final IOException e) {
- throw new RuntimeException("This should have never happened.");
- }
- block.setRawContent(bytes);
- block.write(version.major, byteArrayOutputStream);
- container.blockCount = 1;
-
- final List<Integer> landmarks = new ArrayList<Integer>();
- for (int i = 0; i < container.slices.length; i++) {
- final Slice slice = container.slices[i];
- landmarks.add(byteArrayOutputStream.size());
- SliceIO.write(version.major, slice, byteArrayOutputStream);
- container.blockCount++;
- container.blockCount++;
- if (slice.embeddedRefBlock != null) container.blockCount++;
- container.blockCount += slice.external.size();
- }
- container.landmarks = new int[landmarks.size()];
- for (int i = 0; i < container.landmarks.length; i++)
- container.landmarks[i] = landmarks.get(i);
-
- container.containerByteSize = byteArrayOutputStream.size();
- calculateSliceOffsetsAndSizes(container);
-
- int length = new ContainerHeaderIO().writeContainerHeader(version.major, container, outputStream);
- outputStream.write(byteArrayOutputStream.getBuffer(), 0, byteArrayOutputStream.size());
- length += byteArrayOutputStream.size();
-
- final long time2 = System.nanoTime();
-
- log.debug("CONTAINER WRITTEN: " + container.toString());
- container.writeTime = time2 - time1;
-
- return length;
- }
-
- /**
- * Calculates the byte size of a container based on the CRAM version.
- *
- * @param version the CRAM version to assume
- * @param container the container to be weighted
- * @return the total number of bytes the container would occupy if written out
- */
- public static long getByteSize(final Version version, final Container container) {
- final CountingOutputStream countingOutputStream = new CountingOutputStream(new OutputStream() {
- @Override
- public void write(final int b) throws IOException {
- }
- });
-
- try {
- writeContainer(version, container, countingOutputStream);
- countingOutputStream.close();
- } catch (final IOException e) {
- throw new RuntimeException(e);
- }
-
- return countingOutputStream.getBytesWritten();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java b/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java
deleted file mode 100644
index 4997194..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CramCompressionRecord.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.common.MutableInt;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-public class CramCompressionRecord {
- private static final int MULTI_FRAGMENT_FLAG = 0x1;
- private static final int PROPER_PAIR_FLAG = 0x2;
- private static final int SEGMENT_UNMAPPED_FLAG = 0x4;
- private static final int NEGATIVE_STRAND_FLAG = 0x10;
- private static final int FIRST_SEGMENT_FLAG = 0x40;
- private static final int LAST_SEGMENT_FLAG = 0x80;
- private static final int SECONDARY_ALIGNMENT_FLAG = 0x100;
- private static final int VENDOR_FILTERED_FLAG = 0x200;
- private static final int DUPLICATE_FLAG = 0x400;
- private static final int SUPPLEMENTARY_FLAG = 0x800;
-
- private static final int MATE_NEG_STRAND_FLAG = 0x1;
- private static final int MATE_UNMAPPED_FLAG = 0x2;
-
- private static final int FORCE_PRESERVE_QS_FLAG = 0x1;
- private static final int DETACHED_FLAG = 0x2;
- private static final int HAS_MATE_DOWNSTREAM_FLAG = 0x4;
- private static final int UNKNOWN_BASES = 0x8;
-
- // sequential index of the record in a stream:
- public int index = 0;
- public int alignmentStart;
- public int alignmentDelta;
- private int alignmentEnd = -1;
- private int alignmentSpan = -1;
-
- public int readLength;
-
- public int recordsToNextFragment = -1;
-
- public byte[] readBases;
- public byte[] qualityScores;
-
- public List<ReadFeature> readFeatures;
-
- public int readGroupID = 0;
-
- // bit flags:
- public int flags = 0;
- public int mateFlags = 0;
- public int compressionFlags = 0;
-
- // pointers to the previous and next segments in the template:
- public CramCompressionRecord next, previous;
-
- public int mateSequenceID = -1;
- public int mateAlignmentStart = 0;
-
- public int mappingQuality;
-
- public String sequenceName;
- public int sequenceId;
- public String readName;
-
- // insert size:
- public int templateSize;
-
- public ReadTag[] tags;
- public byte[] tagIds;
- public MutableInt tagIdsIndex;
-
- public int sliceIndex = 0;
-
- public byte getMateFlags() {
- return (byte) (0xFF & mateFlags);
- }
-
- public byte getCompressionFlags() {
- return (byte) (0xFF & compressionFlags);
- }
-
- @SuppressWarnings("SimplifiableIfStatement")
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof CramCompressionRecord)) return false;
-
- final CramCompressionRecord cramRecord = (CramCompressionRecord) obj;
-
- if (alignmentStart != cramRecord.alignmentStart) return false;
- if (isNegativeStrand() != cramRecord.isNegativeStrand()) return false;
- if (isVendorFiltered() != cramRecord.isVendorFiltered()) return false;
- if (isSegmentUnmapped() != cramRecord.isSegmentUnmapped()) return false;
- if (readLength != cramRecord.readLength) return false;
- if (isLastSegment() != cramRecord.isLastSegment()) return false;
- if (recordsToNextFragment != cramRecord.recordsToNextFragment) return false;
- if (isFirstSegment() != cramRecord.isFirstSegment()) return false;
- if (mappingQuality != cramRecord.mappingQuality) return false;
-
- if (!deepEquals(readFeatures, cramRecord.readFeatures)) return false;
-
- if (!Arrays.equals(readBases, cramRecord.readBases)) return false;
- return Arrays.equals(qualityScores, cramRecord.qualityScores) && areEqual(flags, cramRecord.flags) && areEqual(readName, cramRecord.readName);
-
- }
-
- private boolean areEqual(final Object o1, final Object o2) {
- return o1 == null && o2 == null || o1 != null && o1.equals(o2);
- }
-
- private boolean deepEquals(final Collection<?> c1, final Collection<?> c2) {
- return (c1 == null || c1.isEmpty()) && (c2 == null || c2.isEmpty()) || c1 != null && c1.equals(c2);
- }
-
- @Override
- public String toString() {
- final StringBuilder stringBuilder = new StringBuilder("[");
- if (readName != null) stringBuilder.append(readName).append("; ");
- stringBuilder.append("flags=").append(flags)
- .append("; alignmentOffset=").append(alignmentDelta)
- .append("; mateOffset=").append(recordsToNextFragment)
- .append("; mappingQuality=").append(mappingQuality);
-
- if (readFeatures != null) for (final ReadFeature feature : readFeatures)
- stringBuilder.append("; ").append(feature.toString());
-
- if (readBases != null) stringBuilder.append("; ").append("bases: ").append(new String(readBases));
- if (qualityScores != null) stringBuilder.append("; ").append("scores: ").append(new String(qualityScores));
-
- stringBuilder.append(']');
- return stringBuilder.toString();
- }
-
- public int getAlignmentSpan() {
- if (alignmentSpan < 0) calculateAlignmentBoundaries();
- return alignmentSpan;
- }
-
- void calculateAlignmentBoundaries() {
- if (isSegmentUnmapped()) {
- alignmentSpan = 0;
- alignmentEnd = SAMRecord.NO_ALIGNMENT_START;
- } else if (readFeatures == null || readFeatures.isEmpty()) {
- alignmentSpan = readLength;
- alignmentEnd = alignmentStart + alignmentSpan - 1;
- } else {
- alignmentSpan = readLength;
- for (final ReadFeature readFeature : readFeatures) {
- switch (readFeature.getOperator()) {
- case InsertBase.operator:
- alignmentSpan--;
- break;
- case Insertion.operator:
- alignmentSpan -= ((Insertion) readFeature).getSequence().length;
- break;
- case SoftClip.operator:
- alignmentSpan -= ((SoftClip) readFeature).getSequence().length;
- break;
- case Deletion.operator:
- alignmentSpan += ((Deletion) readFeature).getLength();
- break;
-
- default:
- break;
- }
- }
- alignmentEnd = alignmentStart + alignmentSpan - 1;
- }
- }
-
- public int getAlignmentEnd() {
- if (alignmentEnd < 0) calculateAlignmentBoundaries();
- return alignmentEnd;
- }
-
- public boolean isMultiFragment() {
- return (flags & MULTI_FRAGMENT_FLAG) != 0;
- }
-
- public void setMultiFragment(final boolean multiFragment) {
- flags = multiFragment ? flags | MULTI_FRAGMENT_FLAG : flags & ~MULTI_FRAGMENT_FLAG;
- }
-
- public boolean isSegmentUnmapped() {
- return (flags & SEGMENT_UNMAPPED_FLAG) != 0;
- }
-
- public void setSegmentUnmapped(final boolean segmentUnmapped) {
- flags = segmentUnmapped ? flags | SEGMENT_UNMAPPED_FLAG : flags & ~SEGMENT_UNMAPPED_FLAG;
- }
-
- public boolean isFirstSegment() {
- return (flags & FIRST_SEGMENT_FLAG) != 0;
- }
-
- public void setFirstSegment(final boolean firstSegment) {
- flags = firstSegment ? flags | FIRST_SEGMENT_FLAG : flags & ~FIRST_SEGMENT_FLAG;
- }
-
- public boolean isLastSegment() {
- return (flags & LAST_SEGMENT_FLAG) != 0;
- }
-
- public void setLastSegment(final boolean lastSegment) {
- flags = lastSegment ? flags | LAST_SEGMENT_FLAG : flags & ~LAST_SEGMENT_FLAG;
- }
-
- public boolean isSecondaryAlignment() {
- return (flags & SECONDARY_ALIGNMENT_FLAG) != 0;
- }
-
- public void setSecondaryAlignment(final boolean secondaryAlignment) {
- flags = secondaryAlignment ? flags | SECONDARY_ALIGNMENT_FLAG : flags & ~SECONDARY_ALIGNMENT_FLAG;
- }
-
- public boolean isVendorFiltered() {
- return (flags & VENDOR_FILTERED_FLAG) != 0;
- }
-
- public void setVendorFiltered(final boolean vendorFiltered) {
- flags = vendorFiltered ? flags | VENDOR_FILTERED_FLAG : flags & ~VENDOR_FILTERED_FLAG;
- }
-
- public boolean isProperPair() {
- return (flags & PROPER_PAIR_FLAG) != 0;
- }
-
- public void setProperPair(final boolean properPair) {
- flags = properPair ? flags | PROPER_PAIR_FLAG : flags & ~PROPER_PAIR_FLAG;
- }
-
- public boolean isDuplicate() {
- return (flags & DUPLICATE_FLAG) != 0;
- }
-
- public void setDuplicate(final boolean duplicate) {
- flags = duplicate ? flags | DUPLICATE_FLAG : flags & ~DUPLICATE_FLAG;
- }
-
- public boolean isNegativeStrand() {
- return (flags & NEGATIVE_STRAND_FLAG) != 0;
- }
-
- public void setNegativeStrand(final boolean negativeStrand) {
- flags = negativeStrand ? flags | NEGATIVE_STRAND_FLAG : flags & ~NEGATIVE_STRAND_FLAG;
- }
-
- public boolean isMateUnmapped() {
- return (mateFlags & MATE_UNMAPPED_FLAG) != 0;
- }
-
- public void setMateUnmapped(final boolean mateUnmapped) {
- mateFlags = mateUnmapped ? mateFlags | MATE_UNMAPPED_FLAG : mateFlags & ~MATE_UNMAPPED_FLAG;
- }
-
- public boolean isMateNegativeStrand() {
- return (mateFlags & MATE_NEG_STRAND_FLAG) != 0;
- }
-
- public void setMateNegativeStrand(final boolean mateNegativeStrand) {
- mateFlags = mateNegativeStrand ? mateFlags | MATE_NEG_STRAND_FLAG : mateFlags & ~MATE_NEG_STRAND_FLAG;
- }
-
- public boolean isHasMateDownStream() {
- return (compressionFlags & HAS_MATE_DOWNSTREAM_FLAG) != 0;
- }
-
- public void setHasMateDownStream(final boolean hasMateDownStream) {
- compressionFlags = hasMateDownStream ? compressionFlags | HAS_MATE_DOWNSTREAM_FLAG : compressionFlags & ~HAS_MATE_DOWNSTREAM_FLAG;
- }
-
- public boolean isDetached() {
- return (compressionFlags & DETACHED_FLAG) != 0;
- }
-
- public void setDetached(final boolean detached) {
- compressionFlags = detached ? compressionFlags | DETACHED_FLAG : compressionFlags & ~DETACHED_FLAG;
- }
-
- public boolean isForcePreserveQualityScores() {
- return (compressionFlags & FORCE_PRESERVE_QS_FLAG) != 0;
- }
-
- public void setForcePreserveQualityScores(final boolean forcePreserveQualityScores) {
- compressionFlags = forcePreserveQualityScores ? compressionFlags | FORCE_PRESERVE_QS_FLAG : compressionFlags &
- ~FORCE_PRESERVE_QS_FLAG;
- }
-
- public boolean isUnknownBases() {
- return (compressionFlags & UNKNOWN_BASES) != 0;
- }
-
- public void setUnknownBases(final boolean unknownBases) {
- compressionFlags = unknownBases ? compressionFlags | UNKNOWN_BASES : compressionFlags &
- ~UNKNOWN_BASES;
- }
-
- public boolean isSupplementary() {
- return (flags & SUPPLEMENTARY_FLAG) != 0;
- }
-
- public void setSupplementary(final boolean supplementary) {
- flags = supplementary ? flags | SUPPLEMENTARY_FLAG : flags & ~SUPPLEMENTARY_FLAG;
- }
-
- public static class BAM_FLAGS {
- public static final int READ_PAIRED_FLAG = 0x1;
- public static final int PROPER_PAIR_FLAG = 0x2;
- public static final int READ_UNMAPPED_FLAG = 0x4;
- public static final int MATE_UNMAPPED_FLAG = 0x8;
- public static final int READ_STRAND_FLAG = 0x10;
- public static final int MATE_STRAND_FLAG = 0x20;
- public static final int FIRST_OF_PAIR_FLAG = 0x40;
- public static final int SECOND_OF_PAIR_FLAG = 0x80;
- public static final int NOT_PRIMARY_ALIGNMENT_FLAG = 0x100;
- public static final int READ_FAILS_VENDOR_QUALITY_CHECK_FLAG = 0x200;
- public static final int DUPLICATE_READ_FLAG = 0x400;
- public static final int SUPPLEMENTARY_FLAG = 0x800;
- }
-
- public static int getBAMFlags(final int cramFlags, final byte cramMateFlags) {
- int value = cramFlags;
- if ((cramMateFlags & MATE_NEG_STRAND_FLAG) != 0) value |= BAM_FLAGS.MATE_STRAND_FLAG;
- if ((cramMateFlags & MATE_UNMAPPED_FLAG) != 0) value |= BAM_FLAGS.MATE_UNMAPPED_FLAG;
- return value;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java b/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java
deleted file mode 100644
index 05e772a..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/CramHeader.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.cram.common.Version;
-
-import java.util.Arrays;
-
-/**
- * A starting object when dealing with CRAM files. A {@link CramHeader} holds 2 things: 1. File format definition, including content id and
- * version information 2. SAM file header
- */
-public final class CramHeader {
- public static final byte[] MAGIC = "CRAM".getBytes();
-
- private Version version;
- private final byte[] id = new byte[20];
-
- {
- Arrays.fill(id, (byte) 0);
- }
-
- private SAMFileHeader samFileHeader;
-
- /**
- * Create a new {@link CramHeader} empty object.
- */
- private CramHeader() {
- }
-
- /**
- * Create a new {@link CramHeader} object with the specified version, id and SAM file header.
- * The id field by default is guaranteed to be byte[20].
- *
- * @param version the CRAM version to assume
- * @param id an identifier of the content associated with this header
- * @param samFileHeader the SAM file header
- */
- public CramHeader(final Version version, final String id, final SAMFileHeader samFileHeader) {
- this.version = version;
-
- if (id != null) System.arraycopy(id.getBytes(), 0, this.id, 0, Math.min(id.length(), this.id.length));
- this.samFileHeader = samFileHeader;
- }
-
- /**
- * Set the id of the header. A typical use is for example file name to be used when streaming or a checksum of the data contained in the
- * file.
- *
- * @param stringID a new id; only first 20 bytes from byte representation of java {@link String} will be used.
- */
- public void setID(final String stringID) {
- System.arraycopy(stringID.getBytes(), 0, this.id, 0, Math.min(this.id.length, stringID.length()));
- }
-
- /**
- * Copy the CRAM header into a new {@link CramHeader} object.
- * @return a complete copy of the header
- */
- @SuppressWarnings("CloneDoesntCallSuperClone")
- @Override
- public CramHeader clone() {
- final CramHeader clone = new CramHeader();
- clone.version = version;
- System.arraycopy(id, 0, clone.id, 0, id.length);
- clone.samFileHeader = getSamFileHeader().clone();
-
- return clone;
- }
-
-
- /**
- * Checks if content of a header is the same as this one.
- * @param obj another header to compare to
- * @return true if versions, ids and SAM file header are exactly the same, false otherwise
- */
- @Override
- public boolean equals(final Object obj) {
- if (obj == null) return false;
- if (!(obj instanceof CramHeader)) return false;
-
- final CramHeader header = (CramHeader) obj;
-
- if (getVersion().major != header.getVersion().major) return false;
- //noinspection SimplifiableIfStatement
- if (getVersion().minor != header.getVersion().minor) return false;
- return Arrays.equals(id, header.id) && getSamFileHeader().equals(header.getSamFileHeader());
- }
-
- /**
- * Get the {@link SAMFileHeader} object associated with this CRAM file header.
- * @return the SAM file header
- */
- public SAMFileHeader getSamFileHeader() {
- return samFileHeader;
- }
-
- public byte[] getId() {
- return id;
- }
-
- public Version getVersion() {
- return version;
- }
-
- public void setVersion(final Version version) { this.version = version; }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java
deleted file mode 100644
index 3073704..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingID.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-/**
- * Encoding ID as defined in the CRAM specs. These are basically ways to serialize a data series.
- */
-public enum EncodingID {
- /**
- * "Do nothing" encoding. Should throw an exception when trying reading or writing with this encoding.
- */
- NULL,
- /**
- * Shove the data into a byte array for compressing later with a generic compressor like GZIP.
- */
- EXTERNAL,
- /**
- * 'naf said: http://en.wikipedia.org/wiki/Golomb_coding
- */
- GOLOMB,
- /**
- * http://en.wikipedia.org/wiki/Huffman_coding
- */
- HUFFMAN,
- /**
- * A byte array serialized as [length][elements]
- */
- BYTE_ARRAY_LEN,
- /**
- * A byte array serialized as [elements][stop]
- */
- BYTE_ARRAY_STOP,
- /**
- * http://en.wikipedia.org/wiki/Beta_Code
- */
- BETA,
- /**
- * Subexponential codes, see the CRAM specs for details.
- */
- SUBEXPONENTIAL,
- /**
- * A variant of GOLOMB encoding: http://en.wikipedia.org/wiki/Golomb_coding
- */
- GOLOMB_RICE,
- /**
- * http://en.wikipedia.org/wiki/Elias_gamma_coding
- */
- GAMMA
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java
deleted file mode 100644
index e7b85ff..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingKey.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-public enum EncodingKey {
- BF_BitFlags, AP_AlignmentPositionOffset, FP_FeaturePosition,
- FC_FeatureCode, QS_QualityScore, DL_DeletionLength, BA_Base, TN_TagNameAndType,
- NF_RecordsToNextFragment, RL_ReadLength, RG_ReadGroup, MQ_MappingQualityScore,
- RN_ReadName, NP_NextFragmentAlignmentStart, TS_InsetSize, FN_NumberOfReadFeatures,
- BS_BaseSubstitutionCode, IN_Insertion, TC_TagCount, MF_MateBitFlags,
- NS_NextFragmentReferenceSequenceID, CF_CompressionBitFlags, TV_TestMark, TM_TestMark,
- TL_TagIdList, RI_RefId, RS_RefSkip, SC_SoftClip, HC_HardClip, PD_padding, BB_bases, QQ_scores;
-
- public static EncodingKey byFirstTwoChars(final String chars) {
- for (final EncodingKey encodingKey : values()) {
- if (encodingKey.name().startsWith(chars))
- return encodingKey;
- }
- return null;
- }
-
- public static byte[] toTwoBytes(final EncodingKey key) {
- return new byte[]{(byte) key.name().charAt(0), (byte) key.name().charAt(1)};
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java b/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java
deleted file mode 100644
index 586fa90..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/EncodingParams.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-
-import java.util.Arrays;
-
-public class EncodingParams {
-
- public final EncodingID id;
- public final byte[] params;
-
- public EncodingParams(final EncodingID id, final byte[] params) {
- super();
- this.id = id;
- this.params = params;
- }
-
- @Override
- public String toString() {
- return id.name() + ":" + javax.xml.bind.DatatypeConverter.printHexBinary(Arrays.copyOfRange(params, 0, Math.max(20, params.length)));
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java b/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java
deleted file mode 100644
index 791bf2c..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/ReadTag.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFormatException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecord.SAMTagAndValue;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.TagValueAndUnsignedArrayFlag;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.util.StringUtil;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-
-/**
- * CRAM counterpart of {@link htsjdk.samtools.SAMTag}.
- * TODO: consider merging/dropping this class in favour of SAMTag or a SAMTag implementation.
- */
-public class ReadTag implements Comparable<ReadTag> {
- private static final long MAX_INT = Integer.MAX_VALUE;
- private static final long MAX_UINT = MAX_INT * 2 + 1;
- private static final long MAX_SHORT = Short.MAX_VALUE;
- private static final long MAX_USHORT = MAX_SHORT * 2 + 1;
- private static final long MAX_BYTE = Byte.MAX_VALUE;
- private static final long MAX_UBYTE = MAX_BYTE * 2 + 1;
-
- // non-null
- private String key;
- private String keyAndType;
- public String keyType3Bytes;
- public int keyType3BytesAsInt;
- private char type;
- private Object value;
- private short code;
- private byte index;
-
- public ReadTag(final int id, final byte[] dataAsByteArray, ValidationStringency validationStringency) {
- this.type = (char) (0xFF & id);
- key = new String(new char[]{(char) ((id >> 16) & 0xFF), (char) ((id >> 8) & 0xFF)});
- value = restoreValueFromByteArray(type, dataAsByteArray, validationStringency);
- keyType3Bytes = this.key + this.type;
-
- keyType3BytesAsInt = id;
-
- code = SAMTagUtil.getSingleton().makeBinaryTag(this.key);
- }
-
- private ReadTag(final String key, final char type, final Object value) {
- if (key == null)
- throw new NullPointerException("Tag key cannot be null.");
- if (value == null)
- throw new NullPointerException("Tag value cannot be null.");
-
- this.value = value;
-
- if (key.length() == 2) {
- this.key = key;
- this.type = type;
- // this.type = getTagValueType(value);
- keyAndType = key + ":" + getType();
- } else if (key.length() == 4) {
- this.key = key.substring(0, 2);
- this.type = key.charAt(3);
- }
-
- keyType3Bytes = this.key + this.type;
- keyType3BytesAsInt = nameType3BytesToInt(this.key, this.type);
-
- code = SAMTagUtil.getSingleton().makeBinaryTag(this.key);
- }
-
- public static int name3BytesToInt(final byte[] name) {
- int value = 0xFF & name[0];
- value <<= 8;
- value |= 0xFF & name[1];
- value <<= 8;
- value |= 0xFF & name[2];
-
- return value;
- }
-
- public static int nameType3BytesToInt(final String name, final char type) {
- int value = 0xFF & name.charAt(0);
- value <<= 8;
- value |= 0xFF & name.charAt(1);
- value <<= 8;
- value |= 0xFF & type;
-
- return value;
- }
-
- public static String intToNameType3Bytes(final int value) {
- final byte b3 = (byte) (0xFF & value);
- final byte b2 = (byte) (0xFF & (value >> 8));
- final byte b1 = (byte) (0xFF & (value >> 16));
-
- return new String(new byte[]{b1, b2, b3});
- }
-
- public static String intToNameType4Bytes(final int value) {
- final byte b3 = (byte) (0xFF & value);
- final byte b2 = (byte) (0xFF & (value >> 8));
- final byte b1 = (byte) (0xFF & (value >> 16));
-
- return new String(new byte[]{b1, b2, ':', b3});
- }
-
- public SAMTagAndValue createSAMTag() {
- return new SAMTagAndValue(key, value);
- }
-
- public static ReadTag deriveTypeFromKeyAndType(final String keyAndType, final Object value) {
- if (keyAndType.length() != 4)
- throw new RuntimeException("Tag key and type must be 4 char long: " + keyAndType);
-
- return new ReadTag(keyAndType.substring(0, 2), keyAndType.charAt(3), value);
- }
-
- public static ReadTag deriveTypeFromValue(final String key, final Object value) {
- if (key.length() != 2)
- throw new RuntimeException("Tag key must be 2 char long: " + key);
-
- return new ReadTag(key, getTagValueType(value), value);
- }
-
- public String getKey() {
- return key;
- }
-
- @Override
- public int compareTo(@SuppressWarnings("NullableProblems") final ReadTag o) {
- return key.compareTo(o.key);
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof ReadTag))
- return false;
-
- final ReadTag foe = (ReadTag) obj;
- return key.equals(foe.key) && (value == null && foe.value == null || value != null && value.equals(foe.value));
-
- }
-
- @Override
- public int hashCode() {
- return key.hashCode();
- }
-
- public Object getValue() {
- return value;
- }
-
- char getType() {
- return type;
- }
-
- public String getKeyAndType() {
- return keyAndType;
- }
-
- public byte[] getValueAsByteArray() {
- return writeSingleValue((byte) type, value, false);
- }
-
- private static Object restoreValueFromByteArray(final char type, final byte[] array, ValidationStringency validationStringency) {
- final ByteBuffer buffer = ByteBuffer.wrap(array);
- buffer.order(ByteOrder.LITTLE_ENDIAN);
- return readSingleValue((byte) type, buffer, validationStringency);
- }
-
- // copied from net.sf.samtools.BinaryTagCodec 1.62:
- private static char getTagValueType(final Object value) {
- if (value instanceof String) {
- return 'Z';
- } else if (value instanceof Character) {
- return 'A';
- } else if (value instanceof Float) {
- return 'f';
- } else if (value instanceof Number) {
- if (!(value instanceof Byte || value instanceof Short
- || value instanceof Integer || value instanceof Long)) {
- throw new IllegalArgumentException("Unrecognized tag type "
- + value.getClass().getName());
- }
- return getIntegerType(((Number) value).longValue());
- } /*
- * Note that H tag type is never written anymore, because B style is
- * more compact. else if (value instanceof byte[]) { return 'H'; }
- */ else if (value instanceof byte[] || value instanceof short[]
- || value instanceof int[] || value instanceof float[]) {
- return 'B';
- } else {
- throw new IllegalArgumentException(
- "When writing BAM, unrecognized tag type "
- + value.getClass().getName());
- }
- }
-
- // copied from net.sf.samtools.BinaryTagCodec:
- static private char getIntegerType(final long val) {
- if (val > MAX_UINT) {
- throw new IllegalArgumentException("Integer attribute value too large: "+val);
- }
- if (val > MAX_INT) {
- return 'I';
- }
- if (val > MAX_USHORT) {
- return 'i';
- }
- if (val > MAX_SHORT) {
- return 'S';
- }
- if (val > MAX_UBYTE) {
- return 's';
- }
- if (val > MAX_BYTE) {
- return 'C';
- }
- if (val >= Byte.MIN_VALUE) {
- return 'c';
- }
- if (val >= Short.MIN_VALUE) {
- return 's';
- }
- if (val >= Integer.MIN_VALUE) {
- return 'i';
- }
- throw new IllegalArgumentException(
- "Integer attribute value too negative to be encoded in BAM");
- }
-
- public void setIndex(final byte i) {
- this.index = i;
- }
-
- public byte getIndex() {
- return index;
- }
-
- // yeah, I'm that risky:
- // with a little less thread risky.
- private static final ThreadLocal<ByteBuffer> bufferLocal = new ThreadLocal<ByteBuffer>() {
- @Override
- protected ByteBuffer initialValue() {
- final ByteBuffer buf = ByteBuffer.allocateDirect(10 * 1024 * 1024);
- buf.order(ByteOrder.LITTLE_ENDIAN);
- return buf;
- }
- };
-
- private static final Charset charset = Charset.forName("US-ASCII");
-
- public static byte[] writeSingleValue(final byte tagType, final Object value,
- final boolean isUnsignedArray) {
-
- final ByteBuffer buffer = bufferLocal.get();
- buffer.clear();
- switch (tagType) {
- case 'Z':
- String s = (String) value;
- buffer.put(s.getBytes(charset));
- buffer.put((byte) 0);
- break;
- case 'A':
- buffer.put((byte) ((Character) value).charValue());
- break;
- case 'I':
- // this is tricky:
- buffer.putLong((Long) value);
- buffer.position(buffer.position() - 4);
- break;
- case 'i':
- buffer.putInt(((Number) value).intValue());
- break;
- case 's':
- buffer.putShort(((Number) value).shortValue());
- break;
- case 'S':
- // Convert to unsigned short stored in an int
- buffer.putInt(((Number) value).intValue());
- buffer.position(buffer.position() - 2);
- break;
- case 'c':
- buffer.put(((Number) value).byteValue());
- break;
- case 'C':
- // Convert to unsigned byte stored in an int
- buffer.putShort(((Integer) value).shortValue());
- buffer.position(buffer.position() - 1);
- break;
- case 'f':
- buffer.putFloat((Float) value);
- break;
- case 'H':
- s = StringUtil.bytesToHexString((byte[]) value);
- buffer.put(s.getBytes(charset));
- buffer.put((byte) 0);
- break;
- case 'B':
- writeArray(value, isUnsignedArray, buffer);
- break;
- default:
- throw new SAMFormatException("Unrecognized tag type: "
- + (char) tagType);
- }
-
- buffer.flip();
- final byte[] bytes = new byte[buffer.limit()];
- buffer.get(bytes);
-
- return bytes;
- }
-
- private static void writeArray(final Object value,
- final boolean isUnsignedArray, final ByteBuffer buffer) {
- if (value instanceof byte[]) {
- buffer.put((byte) (isUnsignedArray ? 'C' : 'c'));
- final byte[] array = (byte[]) value;
- buffer.putInt(array.length);
- for (final byte element : array)
- buffer.put(element);
-
- } else if (value instanceof short[]) {
- buffer.put((byte) (isUnsignedArray ? 'S' : 's'));
- final short[] array = (short[]) value;
- buffer.putInt(array.length);
- for (final short element : array)
- buffer.putShort(element);
-
- } else if (value instanceof int[]) {
- buffer.put((byte) (isUnsignedArray ? 'I' : 'i'));
- final int[] array = (int[]) value;
- buffer.putInt(array.length);
- for (final int element : array)
- buffer.putInt(element);
-
- } else if (value instanceof float[]) {
- buffer.put((byte) 'f');
- final float[] array = (float[]) value;
- buffer.putInt(array.length);
- for (final float element : array)
- buffer.putFloat(element);
-
- } else
- throw new SAMException("Unrecognized array value type: "
- + value.getClass());
- }
-
- public static Object readSingleValue(final byte tagType,
- final ByteBuffer byteBuffer, ValidationStringency validationStringency) {
- switch (tagType) {
- case 'Z':
- return readNullTerminatedString(byteBuffer);
- case 'A':
- return (char) byteBuffer.get();
- case 'I':
- final long val = byteBuffer.getInt() & 0xffffffffL;
- if (val <= Integer.MAX_VALUE) {
- return (int)val;
- }
- // If it won't fit into a signed integer, but is within range for an unsigned 32-bit integer,
- // return it directly as a long
- if (! SAMUtils.isValidUnsignedIntegerAttribute(val)) {
- SAMUtils.processValidationError(new SAMValidationError(SAMValidationError.Type.TAG_VALUE_TOO_LARGE,
- "Unsigned integer is out of range for a 32-bit unsigned value: " + val, null), validationStringency);
- }
- return val;
- case 'i':
- return byteBuffer.getInt();
- case 's':
- return (int) byteBuffer.getShort();
- case 'S':
- // Convert to unsigned short stored in an int
- return byteBuffer.getShort() & 0xffff;
- case 'c':
- return (int) byteBuffer.get();
- case 'C':
- // Convert to unsigned byte stored in an int
- return byteBuffer.get() & 0xff;
- case 'f':
- return byteBuffer.getFloat();
- case 'H':
- final String hexRep = readNullTerminatedString(byteBuffer);
- return StringUtil.hexStringToBytes(hexRep);
- case 'B':
- final TagValueAndUnsignedArrayFlag valueAndFlag = readArray(
- byteBuffer);
- return valueAndFlag.value;
- default:
- throw new SAMFormatException("Unrecognized tag type: "
- + (char) tagType);
- }
- }
-
- /**
- * Read value of specified type.
- *
- * @param byteBuffer Little-ending byte buffer to read value from.
- * @return CVO containing the value in in-memory Object form, and a flag
- * indicating whether it is unsigned or not.
- */
- private static TagValueAndUnsignedArrayFlag readArray(
- final ByteBuffer byteBuffer) {
- final byte arrayType = byteBuffer.get();
- final boolean isUnsigned = Character.isUpperCase(arrayType);
- final int length = byteBuffer.getInt();
- final Object value;
- switch (Character.toLowerCase(arrayType)) {
- case 'c': {
- final byte[] array = new byte[length];
- value = array;
- byteBuffer.get(array);
- break;
- }
- case 's': {
- final short[] array = new short[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getShort();
- }
- break;
- }
-
- case 'i': {
- final int[] array = new int[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getInt();
- }
- break;
- }
-
- case 'f': {
- final float[] array = new float[length];
- value = array;
- for (int i = 0; i < length; ++i) {
- array[i] = byteBuffer.getFloat();
- }
- break;
- }
-
- default:
- throw new SAMFormatException("Unrecognized tag array type: "
- + (char) arrayType);
- }
- return new TagValueAndUnsignedArrayFlag(value, isUnsigned);
- }
-
- private static String readNullTerminatedString(final ByteBuffer byteBuffer) {
- // Count the number of bytes in the string
- byteBuffer.mark();
- final int startPosition = byteBuffer.position();
- //noinspection StatementWithEmptyBody
- while (byteBuffer.get() != 0) ;
- final int endPosition = byteBuffer.position();
-
- // Don't count null terminator
- final byte[] buf = new byte[endPosition - startPosition - 1];
- // Go back to the start of the string and read out the bytes
- byteBuffer.reset();
- byteBuffer.get(buf);
- // Skip over the null terminator
- byteBuffer.get();
- return StringUtil.bytesToString(buf);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/Slice.java b/src/main/java/htsjdk/samtools/cram/structure/Slice.java
deleted file mode 100644
index 30f0a74..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/Slice.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at4
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMBinaryTagAndUnsignedArrayValue;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.SequenceUtil;
-
-import java.lang.reflect.Array;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Map;
-
-/**
- * CRAM slice is a logical union of blocks into for example alignment slices.
- */
-public class Slice {
- public static final int MULTI_REFERENCE = -2;
- public static final int NO_ALIGNMENT_START = -1;
- public static final int NO_ALIGNMENT_SPAN = 0;
- private static final Log log = Log.getInstance(Slice.class);
-
- // as defined in the specs:
- public int sequenceId = -1;
- public int alignmentStart = -1;
- public int alignmentSpan = -1;
- public int nofRecords = -1;
- public long globalRecordCounter = -1;
- public int nofBlocks = -1;
- public int[] contentIDs;
- public int embeddedRefBlockContentID = -1;
- public byte[] refMD5 = new byte[16];
-
- // content associated with ids:
- public Block headerBlock;
- public Block coreBlock;
- public Block embeddedRefBlock;
- public Map<Integer, Block> external;
-
- // for indexing purposes:
- public int offset = -1;
- public long containerOffset = -1;
- public int size = -1;
- public int index = -1;
-
- // to pass this to the container:
- public long bases;
-
- public SAMBinaryTagAndValue sliceTags;
-
- private void alignmentBordersSanityCheck(final byte[] ref) {
- if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return ;
- if (alignmentStart > 0 && sequenceId >= 0 && ref == null) throw new IllegalArgumentException ("Mapped slice reference is null.");
-
- if (alignmentStart > ref.length) {
- log.error(String.format("Slice mapped outside of reference: seqID=%d, start=%d, counter=%d.", sequenceId, alignmentStart,
- globalRecordCounter));
- throw new RuntimeException("Slice mapped outside of the reference.");
- }
-
- if (alignmentStart - 1 + alignmentSpan > ref.length) {
- log.warn(String.format("Slice partially mapped outside of reference: seqID=%d, start=%d, span=%d, counter=%d.",
- sequenceId, alignmentStart, alignmentSpan, globalRecordCounter));
- }
- }
-
- public boolean validateRefMD5(final byte[] ref) {
- if(sequenceId == Slice.MULTI_REFERENCE)
- throw new SAMException("Cannot verify a slice with multiple references on a single reference.");
-
- if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return true;
-
- alignmentBordersSanityCheck(ref);
-
- if (!validateRefMD5(ref, alignmentStart, alignmentSpan, refMD5)) {
- final int shoulderLength = 10;
- final String excerpt = getBrief(alignmentStart, alignmentSpan, ref, shoulderLength);
-
- if (validateRefMD5(ref, alignmentStart, alignmentSpan - 1, refMD5)) {
- log.warn(String.format("Reference MD5 matches partially for slice %d:%d-%d, %s", sequenceId, alignmentStart,
- alignmentStart + alignmentSpan - 1, excerpt));
- return true;
- }
-
- log.error(String.format("Reference MD5 mismatch for slice %d:%d-%d, %s", sequenceId, alignmentStart, alignmentStart +
- alignmentSpan - 1, excerpt));
- return false;
- }
-
- return true;
- }
-
- private static boolean validateRefMD5(final byte[] ref, final int alignmentStart, final int alignmentSpan, final byte[] expectedMD5) {
- final int span = Math.min(alignmentSpan, ref.length - alignmentStart + 1);
- final String md5 = SequenceUtil.calculateMD5String(ref, alignmentStart - 1, span);
- return md5.equals(String.format("%032x", new BigInteger(1, expectedMD5)));
- }
-
- private static String getBrief(final int startOneBased, final int span, final byte[] bases, final int shoulderLength) {
- if (span >= bases.length)
- return new String(bases);
-
- final StringBuilder sb = new StringBuilder();
- final int fromInc = startOneBased - 1;
-
- int toExc = startOneBased + span - 1;
- toExc = Math.min(toExc, bases.length);
-
- if (toExc - fromInc <= 2 * shoulderLength) {
- sb.append(new String(Arrays.copyOfRange(bases, fromInc, toExc)));
- } else {
- sb.append(new String(Arrays.copyOfRange(bases, fromInc, fromInc + shoulderLength)));
- sb.append("...");
- sb.append(new String(Arrays.copyOfRange(bases, toExc - shoulderLength, toExc)));
- }
-
- return sb.toString();
- }
-
- @Override
- public String toString() {
- return String.format("slice: seqID %d, start %d, span %d, records %d.", sequenceId, alignmentStart, alignmentSpan, nofRecords);
- }
-
- public void setRefMD5(final byte[] ref) {
- alignmentBordersSanityCheck(ref);
-
- if (sequenceId < 0 && alignmentStart < 1) {
- refMD5 = new byte[16];
- Arrays.fill(refMD5, (byte) 0);
-
- log.debug("Empty slice ref md5 is set.");
- } else {
-
- final int span = Math.min(alignmentSpan, ref.length - alignmentStart + 1);
-
- if (alignmentStart + span > ref.length + 1)
- throw new RuntimeException("Invalid alignment boundaries.");
-
- refMD5 = SequenceUtil.calculateMD5(ref, alignmentStart - 1, span);
-
- if (log.isEnabled(Log.LogLevel.DEBUG)) {
- final StringBuilder sb = new StringBuilder();
- final int shoulder = 10;
- if (ref.length <= shoulder * 2)
- sb.append(new String(ref));
- else {
-
- sb.append(getBrief(alignmentStart, alignmentSpan, ref, shoulder));
- }
-
- log.debug(String.format("Slice md5: %s for %d:%d-%d, %s",
- String.format("%032x", new BigInteger(1, refMD5)),
- sequenceId, alignmentStart, alignmentStart + span - 1,
- sb.toString()));
- }
- }
- }
-
- /**
- * Hijacking attributes-related methods from SAMRecord:
- */
-
- /**
- * Get tag value attached to the slice.
- * @param tag tag ID as a short integer as returned by {@link htsjdk.samtools.SAMTagUtil#makeBinaryTag(java.lang.String)}
- * @return a value of the tag
- */
- public Object getAttribute(final short tag) {
- if (this.sliceTags == null) return null;
- else {
- final SAMBinaryTagAndValue tmp = this.sliceTags.find(tag);
- if (tmp != null) return tmp.value;
- else return null;
- }
- }
-
- /**
- * Set a value for the tag.
- * @param tag tag ID as a short integer as returned by {@link htsjdk.samtools.SAMTagUtil#makeBinaryTag(java.lang.String)}
- * @param value tag value
- */
- public void setAttribute(final String tag, final Object value) {
- if (value != null && value.getClass().isArray() && Array.getLength(value) == 0) {
- throw new IllegalArgumentException("Empty value passed for tag " + tag);
- }
- setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value);
- }
-
- public void setUnsignedArrayAttribute(final String tag, final Object value) {
- if (!value.getClass().isArray()) {
- throw new IllegalArgumentException("Non-array passed to setUnsignedArrayAttribute for tag " + tag);
- }
- if (Array.getLength(value) == 0) {
- throw new IllegalArgumentException("Empty array passed to setUnsignedArrayAttribute for tag " + tag);
- }
- setAttribute(SAMTagUtil.getSingleton().makeBinaryTag(tag), value, true);
- }
-
- void setAttribute(final short tag, final Object value) {
- setAttribute(tag, value, false);
- }
-
- void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
- if (value == null) {
- if (this.sliceTags != null) this.sliceTags = this.sliceTags.remove(tag);
- } else {
- final SAMBinaryTagAndValue tmp;
- if (!isUnsignedArray) {
- tmp = new SAMBinaryTagAndValue(tag, value);
- } else {
- tmp = new SAMBinaryTagAndUnsignedArrayValue(tag, value);
- }
- if (this.sliceTags == null) this.sliceTags = tmp;
- else this.sliceTags = this.sliceTags.insert(tmp);
- }
- }
-
- public boolean isMapped() {
- return sequenceId > SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- }
-
- public boolean isMultiref() {
- return sequenceId == Slice.MULTI_REFERENCE;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java b/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java
deleted file mode 100644
index 4ccbb36..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/SliceIO.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.BinaryTagCodec;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.io.CramArray;
-import htsjdk.samtools.cram.io.ITF8;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.io.LTF8;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-
-class SliceIO {
- private static final Log log = Log.getInstance(SliceIO.class);
-
- private static void readSliceHeadBlock(final int major, final Slice slice, final InputStream inputStream) throws IOException {
- slice.headerBlock = Block.readFromInputStream(major, inputStream);
- parseSliceHeaderBlock(major, slice);
- }
-
- private static void parseSliceHeaderBlock(final int major, final Slice slice) throws IOException {
- final InputStream inputStream = new ByteArrayInputStream(slice.headerBlock.getRawContent());
-
- slice.sequenceId = ITF8.readUnsignedITF8(inputStream);
- slice.alignmentStart = ITF8.readUnsignedITF8(inputStream);
- slice.alignmentSpan = ITF8.readUnsignedITF8(inputStream);
- slice.nofRecords = ITF8.readUnsignedITF8(inputStream);
- slice.globalRecordCounter = LTF8.readUnsignedLTF8(inputStream);
- slice.nofBlocks = ITF8.readUnsignedITF8(inputStream);
-
- slice.contentIDs = CramArray.array(inputStream);
- slice.embeddedRefBlockContentID = ITF8.readUnsignedITF8(inputStream);
- slice.refMD5 = new byte[16];
- InputStreamUtils.readFully(inputStream, slice.refMD5, 0, slice.refMD5.length);
-
- final byte[] bytes = InputStreamUtils.readFully(inputStream);
-
- if (major >= CramVersions.CRAM_v3.major) {
- slice.sliceTags = BinaryTagCodec.readTags(bytes, 0, bytes.length, ValidationStringency.DEFAULT_STRINGENCY);
-
- SAMBinaryTagAndValue tags = slice.sliceTags;
- while (tags != null) {
- log.debug(String.format("Found slice tag: %s", SAMTagUtil.getSingleton().makeStringTag(tags.tag)));
- tags = tags.getNext();
- }
- }
- }
-
- private static byte[] createSliceHeaderBlockContent(final int major, final Slice slice) throws IOException {
- final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- ITF8.writeUnsignedITF8(slice.sequenceId, byteArrayOutputStream);
- ITF8.writeUnsignedITF8(slice.alignmentStart, byteArrayOutputStream);
- ITF8.writeUnsignedITF8(slice.alignmentSpan, byteArrayOutputStream);
- ITF8.writeUnsignedITF8(slice.nofRecords, byteArrayOutputStream);
- LTF8.writeUnsignedLTF8(slice.globalRecordCounter, byteArrayOutputStream);
- ITF8.writeUnsignedITF8(slice.nofBlocks, byteArrayOutputStream);
-
- slice.contentIDs = new int[slice.external.size()];
- int i = 0;
- for (final int id : slice.external.keySet())
- slice.contentIDs[i++] = id;
- CramArray.write(slice.contentIDs, byteArrayOutputStream);
- ITF8.writeUnsignedITF8(slice.embeddedRefBlockContentID, byteArrayOutputStream);
- byteArrayOutputStream.write(slice.refMD5 == null ? new byte[16] : slice.refMD5);
-
- if (major >= CramVersions.CRAM_v3.major) {
- if (slice.sliceTags != null) {
- final BinaryCodec binaryCoded = new BinaryCodec(byteArrayOutputStream);
- final BinaryTagCodec binaryTagCodec = new BinaryTagCodec(binaryCoded);
- SAMBinaryTagAndValue samBinaryTagAndValue = slice.sliceTags;
- do {
- log.debug("Writing slice tag: " + SAMTagUtil.getSingleton().makeStringTag(samBinaryTagAndValue.tag));
- binaryTagCodec.writeTag(samBinaryTagAndValue.tag, samBinaryTagAndValue.value, samBinaryTagAndValue.isUnsignedArray());
- } while ((samBinaryTagAndValue = samBinaryTagAndValue.getNext()) != null);
- // BinaryCodec doesn't seem to cache things.
- // In any case, not calling baseCodec.close() because it's behaviour is
- // irrelevant here.
- }
- }
-
- return byteArrayOutputStream.toByteArray();
- }
-
- private static void readSliceBlocks(final int major, final Slice slice, final InputStream inputStream) throws IOException {
- slice.external = new HashMap<Integer, Block>();
- for (int i = 0; i < slice.nofBlocks; i++) {
- final Block block = Block.readFromInputStream(major, inputStream);
-
- switch (block.getContentType()) {
- case CORE:
- slice.coreBlock = block;
- break;
- case EXTERNAL:
- if (slice.embeddedRefBlockContentID == block.getContentId()) slice.embeddedRefBlock = block;
- slice.external.put(block.getContentId(), block);
- break;
-
- default:
- throw new RuntimeException("Not a slice block, content type id " + block.getContentType().name());
- }
- }
- }
-
- public static void write(final int major, final Slice slice, final OutputStream outputStream) throws IOException {
-
- slice.nofBlocks = 1 + slice.external.size() + (slice.embeddedRefBlock == null ? 0 : 1);
-
- {
- slice.contentIDs = new int[slice.external.size()];
- final int i = 0;
- for (final int id : slice.external.keySet())
- slice.contentIDs[i] = id;
- }
-
- slice.headerBlock = Block.buildNewSliceHeaderBlock(createSliceHeaderBlockContent(major, slice));
- slice.headerBlock.write(major, outputStream);
-
- slice.coreBlock.write(major, outputStream);
- for (final Block block : slice.external.values())
- block.write(major, outputStream);
- }
-
- public static void read(final int major, final Slice slice, final InputStream inputStream) throws IOException {
- readSliceHeadBlock(major, slice, inputStream);
- readSliceBlocks(major, slice, inputStream);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java b/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java
deleted file mode 100644
index d9948be..0000000
--- a/src/main/java/htsjdk/samtools/cram/structure/SubstitutionMatrix.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * ****************************************************************************
- * Copyright 2013 EMBL-EBI
- * <p/>
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ****************************************************************************
- */
-package htsjdk.samtools.cram.structure;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-public class SubstitutionMatrix {
- public static final byte[] BASES = new byte[]{'A', 'C', 'G', 'T', 'N'};
- private static final byte[] BASES_LC = new byte[]{'a', 'c', 'g', 't', 'n'};
- private static final byte[] ORDER;
-
- static {
- ORDER = new byte[255];
- Arrays.fill(ORDER, (byte) -1);
- ORDER['A'] = 0;
- ORDER['C'] = 1;
- ORDER['G'] = 2;
- ORDER['T'] = 3;
- ORDER['N'] = 4;
- }
-
- private byte[] bytes = new byte[5];
- private final byte[][] codes = new byte[255][255];
- private final byte[][] bases = new byte[255][255];
-
- public SubstitutionMatrix(final long[][] frequencies) {
- for (final byte base : BASES) {
- bytes[ORDER[base]] = rank(base, frequencies[base]);
- }
- for (final byte[] base : bases) Arrays.fill(base, (byte) 'N');
-
- for (int i = 0; i < BASES.length; i++) {
- final byte r = BASES[i];
- for (final byte b : BASES) {
- if (r == b)
- continue;
- bases[r][codes[r][b]] = b;
- bases[BASES_LC[i]][codes[r][b]] = b;
- }
- }
- }
-
- @Override
- public String toString() {
- final StringBuilder stringBuilder = new StringBuilder();
- for (final byte r : "ACGTN".getBytes()) {
- stringBuilder.append((char) r);
- stringBuilder.append(':');
- for (int i = 0; i < 4; i++) {
- stringBuilder.append((char) bases[r][i]);
- }
- stringBuilder.append('\t');
- }
- return stringBuilder.toString();
- }
-
- public SubstitutionMatrix(final byte[] matrix) {
- this.bytes = matrix;
-
- for (final byte[] base : bases) Arrays.fill(base, (byte) 'N');
-
- bases['A'][(bytes[0] >> 6) & 3] = 'C';
- bases['A'][(bytes[0] >> 4) & 3] = 'G';
- bases['A'][(bytes[0] >> 2) & 3] = 'T';
- bases['A'][(bytes[0]) & 3] = 'N';
- System.arraycopy(bases['A'], 0, bases['a'], 0, 4);
-
- bases['C'][(bytes[1] >> 6) & 3] = 'A';
- bases['C'][(bytes[1] >> 4) & 3] = 'G';
- bases['C'][(bytes[1] >> 2) & 3] = 'T';
- bases['C'][(bytes[1]) & 3] = 'N';
- System.arraycopy(bases['C'], 0, bases['c'], 0, 4);
-
- bases['G'][(bytes[2] >> 6) & 3] = 'A';
- bases['G'][(bytes[2] >> 4) & 3] = 'C';
- bases['G'][(bytes[2] >> 2) & 3] = 'T';
- bases['G'][(bytes[2]) & 3] = 'N';
- System.arraycopy(bases['G'], 0, bases['g'], 0, 4);
-
- bases['T'][(bytes[3] >> 6) & 3] = 'A';
- bases['T'][(bytes[3] >> 4) & 3] = 'C';
- bases['T'][(bytes[3] >> 2) & 3] = 'G';
- bases['T'][(bytes[3]) & 3] = 'N';
- System.arraycopy(bases['T'], 0, bases['t'], 0, 4);
-
- bases['N'][(bytes[4] >> 6) & 3] = 'A';
- bases['N'][(bytes[4] >> 4) & 3] = 'C';
- bases['N'][(bytes[4] >> 2) & 3] = 'G';
- bases['N'][(bytes[4]) & 3] = 'T';
-
- for (final byte refBase : BASES) {
- for (byte code = 0; code < 4; code++)
- codes[refBase][bases[refBase][code]] = code;
- }
- }
-
- public byte[] getEncodedMatrix() {
- return bytes;
- }
-
- private static class SubCode {
- final byte base;
- long freq;
- byte rank;
-
- public SubCode(final byte base, final long freq) {
- this.base = base;
- this.freq = freq;
- }
-
- }
-
- private static final Comparator<SubCode> comparator = new Comparator<SubstitutionMatrix.SubCode>() {
-
- @Override
- public int compare(final SubCode o1, final SubCode o2) {
- if (o1.freq != o2.freq)
- return (int) (o2.freq - o1.freq);
- return ORDER[o1.base] - ORDER[o2.base];
- }
- };
-
- private byte rank(final byte refBase, final long[] frequencies) {
- // in alphabetical order:
- final SubCode[] subCodes = new SubCode[4];
- {
- int i = 0;
- for (final byte base : BASES) {
- if (refBase == base)
- continue;
- subCodes[i++] = new SubCode(base, frequencies[base]);
- }
- }
-
- Arrays.sort(subCodes, comparator);
-
- for (byte i = 0; i < subCodes.length; i++)
- subCodes[i].rank = i;
-
- for (final SubCode subCode1 : subCodes) subCode1.freq = 0;
-
- Arrays.sort(subCodes, comparator);
-
- byte rank = 0;
- for (final SubCode subCode : subCodes) {
- rank <<= 2;
- rank |= subCode.rank;
- }
-
- for (final SubCode s : subCodes)
- codes[refBase][s.base] = s.rank;
-
- return rank;
- }
-
- public byte code(final byte refBase, final byte readBase) {
- return codes[refBase][readBase];
- }
-
- public byte base(final byte refBase, final byte code) {
- return bases[refBase][code];
- }
-}
diff --git a/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java b/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java
deleted file mode 100644
index 925e053..0000000
--- a/src/main/java/htsjdk/samtools/example/ExampleSamUsage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.example;
-
-import htsjdk.samtools.DefaultSAMRecordFactory;
-import htsjdk.samtools.SAMFileWriter;
-import htsjdk.samtools.SAMFileWriterFactory;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class ExampleSamUsage {
- public static SeekableStream myIndexSeekableStream() {
- throw new UnsupportedOperationException();
- }
-
- /** Example usages of {@link htsjdk.samtools.SamReaderFactory} */
- public void openSamExamples() throws MalformedURLException {
- /**
- * Simplest case
- */
- final SamReader reader = SamReaderFactory.makeDefault().open(new File("/my.bam"));
-
- /**
- * With different reader options
- */
- final SamReader readerFromConfiguredFactory =
- SamReaderFactory.make()
- .enable(SamReaderFactory.Option.DONT_MEMORY_MAP_INDEX)
- .validationStringency(ValidationStringency.SILENT)
- .samRecordFactory(DefaultSAMRecordFactory.getInstance())
- .open(new File("/my.bam"));
-
- /**
- * With a more complicated source
- */
- final SamReader complicatedReader =
- SamReaderFactory.makeDefault()
- .open(
- SamInputResource.of(new URL("http://broadinstitute.org/my.bam")).index(myIndexSeekableStream())
- );
-
- /**
- * Broken down
- */
- final SamReaderFactory factory =
- SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.VALIDATE_CRC_CHECKSUMS).validationStringency(ValidationStringency.LENIENT);
-
- final SamInputResource resource = SamInputResource.of(new File("/my.bam")).index(new URL("http://broadinstitute.org/my.bam.bai"));
-
- final SamReader myReader = factory.open(resource);
-
- for (final SAMRecord samRecord : myReader) {
- System.err.print(samRecord);
- }
-
- }
-
- /**
- * Read a SAM or BAM file, convert each read name to upper case, and write a new
- * SAM or BAM file.
- */
- public void convertReadNamesToUpperCase(final File inputSamOrBamFile, final File outputSamOrBamFile) throws IOException {
-
- final SamReader reader = SamReaderFactory.makeDefault().open(inputSamOrBamFile);
-
- // makeSAMorBAMWriter() writes a file in SAM text or BAM binary format depending
- // on the file extension, which must be either .sam or .bam.
-
- // Since the SAMRecords will be written in the same order as they appear in the input file,
- // and the output file is specified as having the same sort order (as specified in
- // SAMFileHeader.getSortOrder(), presorted == true. This is much more efficient than
- // presorted == false, if coordinate or queryname sorting is specified, because the SAMRecords
- // can be written to the output file directly rather than being written to a temporary file
- // and sorted after all records have been sent to outputSam.
-
- final SAMFileWriter outputSam = new SAMFileWriterFactory().makeSAMOrBAMWriter(reader.getFileHeader(),
- true, outputSamOrBamFile);
-
- for (final SAMRecord samRecord : reader) {
- // Convert read name to upper case.
- samRecord.setReadName(samRecord.getReadName().toUpperCase());
- outputSam.addAlignment(samRecord);
- }
-
- outputSam.close();
- reader.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/example/PrintReadsExample.java b/src/main/java/htsjdk/samtools/example/PrintReadsExample.java
deleted file mode 100755
index 7bbec0a..0000000
--- a/src/main/java/htsjdk/samtools/example/PrintReadsExample.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.samtools.example;
-
-import htsjdk.samtools.*;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-
-/**
- * This is a example program showing how to use SAM readers and (optionally) writers.
- * It's also useful for measuring time.
- * An example invocation is:
- * <code>java -cp dist/htsjdk-2.1.1.jar htsjdk.samtools.example.PrintReadsExample in.bam false a.bam</code>
- * Arguments:
- * - the first argument is the input file (SAM or BAM)
- * - the second argument is a boolean (true or false) that indicates whether reads are to be eagerly decoded (useful for benchmarking)
- * - the third argument is optional and is the name of the output file (nothing gets written if this argument is missing)
- */
-public final class PrintReadsExample {
- private PrintReadsExample() {
- }
-
- private static final Log log = Log.getInstance(PrintReadsExample.class);
-
- public static void main(String[] args) throws IOException {
- if (args.length < 2) {
- System.out.println("Usage: " + PrintReadsExample.class.getCanonicalName() + " inFile eagerDecode [outFile]");
- System.exit(1);
- }
- final File inputFile = new File(args[0]);
- final boolean eagerDecode = Boolean.parseBoolean(args[1]); //useful to test (realistic) scenarios in which every record is always fully decoded.
- final File outputFile = args.length >= 3 ? new File(args[2]) : null;
-
- final long start = System.currentTimeMillis();
-
- log.info("Start with args:" + Arrays.toString(args));
- printConfigurationInfo();
-
- SamReaderFactory readerFactory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
- if (eagerDecode) {
- readerFactory = readerFactory.enable(SamReaderFactory.Option.EAGERLY_DECODE);
- }
-
- try (final SamReader reader = readerFactory.open(inputFile)) {
- final SAMFileHeader header = reader.getFileHeader();
- try (final SAMFileWriter writer = outputFile != null ? new SAMFileWriterFactory().makeBAMWriter(header, true, outputFile) : null) {
- final ProgressLogger pl = new ProgressLogger(log, 1000000);
- for (final SAMRecord record : reader) {
- if (writer != null) {
- writer.addAlignment(record);
- }
- pl.record(record);
- }
- }
- }
- final long end = System.currentTimeMillis();
- log.info(String.format("Done. Elapsed time %.3f seconds", (end - start) / 1000.0));
- }
-
- private static void printConfigurationInfo() throws IOException {
- log.info("Executing as " +
- System.getProperty("user.name") + '@' + InetAddress.getLocalHost().getHostName() +
- " on " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") +
- ' ' + System.getProperty("os.arch") + "; " + System.getProperty("java.vm.name") +
- ' ' + System.getProperty("java.runtime.version"));
-
- final List<String> list = Defaults.allDefaults().entrySet().stream().map(e -> e.getKey() + ':' + e.getValue()).collect(Collectors.toList());
- log.info(String.join(" ", list));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java b/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java
deleted file mode 100644
index dee0a16..0000000
--- a/src/main/java/htsjdk/samtools/fastq/AsyncFastqWriter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-
-/**
- * Implementation of a FastqWriter that provides asynchronous output.
- * @author Tim Fennell
- */
-public class AsyncFastqWriter extends AbstractAsyncWriter<FastqRecord> implements FastqWriter {
- private final FastqWriter writer;
-
- public AsyncFastqWriter(final FastqWriter out, final int queueSize) {
- super(queueSize);
- this.writer = out;
- }
-
- @Override protected String getThreadNamePrefix() { return "FastqWriterThread-"; }
- @Override protected void synchronouslyWrite(final FastqRecord item) { this.writer.write(item); }
- @Override protected void synchronouslyClose() { this.writer.close(); }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java b/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java
deleted file mode 100644
index 8a5afd3..0000000
--- a/src/main/java/htsjdk/samtools/fastq/BasicFastqWriter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.Flushable;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * In general FastqWriterFactory should be used so that AsyncFastqWriter can be enabled, but there are some
- * cases in which that behavior is explicitly not wanted.
- */
-public class BasicFastqWriter implements FastqWriter,Flushable {
- private final String path;
- private final PrintStream writer;
-
- public BasicFastqWriter(final File file) {
- this(file, false);
- }
-
- public BasicFastqWriter(final File file, final boolean createMd5) {
- this(file, new PrintStream(IOUtil.maybeBufferOutputStream(maybeMd5Wrap(file, createMd5))));
- }
-
- private BasicFastqWriter(final File file, final PrintStream writer) {
- this.path = (file != null? file.getAbsolutePath(): "");
- this.writer = writer;
- }
-
- public BasicFastqWriter(final PrintStream writer) {
- this(null, writer);
- }
-
- @Override
- public void write(final FastqRecord rec) {
- writer.print(FastqConstants.SEQUENCE_HEADER);
- writer.println(rec.getReadHeader());
- writer.println(rec.getReadString());
- writer.print(FastqConstants.QUALITY_HEADER);
- writer.println(rec.getBaseQualityHeader() == null ? "" : rec.getBaseQualityHeader());
- writer.println(rec.getBaseQualityString());
- if (writer.checkError()) {
- throw new SAMException("Error in writing fastq file " + path);
- }
- }
-
- @Override
- public void flush() {
- writer.flush();
- }
-
- @Override
- public void close() {
- writer.close();
- }
-
- private static OutputStream maybeMd5Wrap(final File file, final boolean createMd5) {
- if (createMd5) {
- return IOUtil.openFileForMd5CalculatingWriting(file);
- } else {
- return IOUtil.openFileForWriting(file);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqConstants.java b/src/main/java/htsjdk/samtools/fastq/FastqConstants.java
deleted file mode 100644
index f5d4150..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqConstants.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class FastqConstants {
- public static final String SEQUENCE_HEADER = "@" ;
- public static final String QUALITY_HEADER = "+" ;
-
- public enum FastqExtensions {
- FASTQ(".fastq"),
- FASTQ_GZ(".fastq.gz"),
- FQ(".fq"),
- FQ_GZ(".fq.gz"),
- BFQ(".bfq");
-
- private final String extension;
-
- private FastqExtensions(final String extension) {
- this.extension = extension;
- }
-
- public String getExtension() { return this.extension; }
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqReader.java b/src/main/java/htsjdk/samtools/fastq/FastqReader.java
deleted file mode 100755
index 8086dfa..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqReader.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Reads a FASTQ file with four lines per record.
- * WARNING: Despite the fact that this class implements Iterable, calling iterator() method does not
- * start iteration from the beginning of the file. Developers should probably not call iterator()
- * directly. It is provided so that this class can be used in Java for-each loop.
- */
-public class FastqReader implements Iterator<FastqRecord>, Iterable<FastqRecord>, Closeable {
- final private File fastqFile;
- final private BufferedReader reader;
- private FastqRecord nextRecord;
- private int line=1;
-
- final private boolean skipBlankLines;
-
- public FastqReader(final File file) {
- this(file,false);
- }
-
- /**
- * Constructor
- * @param file of FASTQ to read read. Will be opened with htsjdk.samtools.util.IOUtil.openFileForBufferedReading
- * @param skipBlankLines should we skip blank lines ?
- */
- public FastqReader(final File file, final boolean skipBlankLines) {
- this.skipBlankLines=skipBlankLines;
- fastqFile = file;
- reader = IOUtil.openFileForBufferedReading(fastqFile);
- nextRecord = readNextRecord();
- }
-
- public FastqReader(final BufferedReader reader) {
- this(null, reader);
- }
-
- /**
- * Constructor
- * @param file Name of FASTQ being read, or null if not known.
- * @param reader input reader . Will be closed by the close method
- * @param skipBlankLines should we skip blank lines ?
- */
- public FastqReader(final File file, final BufferedReader reader,boolean skipBlankLines) {
- this.fastqFile = file;
- this.reader = reader;
- this.nextRecord = readNextRecord();
- this.skipBlankLines = skipBlankLines;
- }
-
- public FastqReader(final File file, final BufferedReader reader) {
- this(file,reader,false);
- }
-
- private FastqRecord readNextRecord() {
- try {
-
- // Read sequence header
- final String seqHeader = readLineConditionallySkippingBlanks();
- if (seqHeader == null) return null ;
- if (StringUtil.isBlank(seqHeader)) {
- throw new SAMException(error("Missing sequence header"));
- }
- if (!seqHeader.startsWith(FastqConstants.SEQUENCE_HEADER)) {
- throw new SAMException(error("Sequence header must start with "+ FastqConstants.SEQUENCE_HEADER+": "+seqHeader));
- }
-
- // Read sequence line
- final String seqLine = readLineConditionallySkippingBlanks();
- checkLine(seqLine,"sequence line");
-
- // Read quality header
- final String qualHeader = readLineConditionallySkippingBlanks();
- checkLine(qualHeader,"quality header");
- if (!qualHeader.startsWith(FastqConstants.QUALITY_HEADER)) {
- throw new SAMException(error("Quality header must start with "+ FastqConstants.QUALITY_HEADER+": "+qualHeader));
- }
-
- // Read quality line
- final String qualLine = readLineConditionallySkippingBlanks();
- checkLine(qualLine,"quality line");
-
- // Check sequence and quality lines are same length
- if (seqLine.length() != qualLine.length()) {
- throw new SAMException(error("Sequence and quality line must be the same length"));
- }
-
- final FastqRecord frec = new FastqRecord(seqHeader.substring(1, seqHeader.length()), seqLine,
- qualHeader.substring(1, qualHeader.length()), qualLine);
- line += 4 ;
- return frec ;
-
- } catch (IOException e) {
- throw new SAMException(String.format("Error reading fastq '%s'", getAbsolutePath()), e);
- }
- }
-
- public boolean hasNext() { return nextRecord != null; }
-
- public FastqRecord next() {
- if (!hasNext()) {
- throw new NoSuchElementException("next() called when !hasNext()");
- }
- final FastqRecord rec = nextRecord;
- nextRecord = readNextRecord();
- return rec;
- }
-
- public void remove() { throw new UnsupportedOperationException("Unsupported operation"); }
-
- /**
- * WARNING: Despite the fact that this class implements Iterable, calling iterator() method does not
- * start iteration from the beginning of the file. Developers should probably not call iterator()
- * directly. It is provided so that this class can be used in Java for-each loop.
- */
- public Iterator<FastqRecord> iterator() { return this; }
-
- public int getLineNumber() { return line ; }
-
-
- /**
- * @return Name of FASTQ being read, or null if not known.
- */
- public File getFile() { return fastqFile ; }
-
- @Override
- public void close() {
- try {
- reader.close();
- } catch (IOException e) {
- throw new SAMException("IO problem in fastq file "+getAbsolutePath(), e);
- }
- }
-
- private void checkLine(final String line, final String kind) {
- if (line == null) {
- throw new SAMException(error("File is too short - missing "+kind+" line"));
- }
- if (StringUtil.isBlank(line)) {
- throw new SAMException(error("Missing "+kind));
- }
- }
-
- private String error(final String msg) {
- return msg + " at line "+line+" in fastq "+getAbsolutePath();
- }
-
- private String getAbsolutePath() {
- if (fastqFile == null) return "";
- else return fastqFile.getAbsolutePath();
- }
-
- private String readLineConditionallySkippingBlanks() throws IOException {
- String line;
- do {
- line = reader.readLine();
- if (line == null) return line;
- } while(skipBlankLines && StringUtil.isBlank(line));
- return line;
- }
-
- @Override
- public String toString() {
- return "FastqReader["+(this.fastqFile == null?"":this.fastqFile)+ " Line:"+getLineNumber()+"]";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java b/src/main/java/htsjdk/samtools/fastq/FastqRecord.java
deleted file mode 100755
index b1d3f75..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqRecord.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import java.io.Serializable;
-
-/**
- * Represents a fastq record, fairly literally, i.e. without any conversion.
- */
-public class FastqRecord implements Serializable {
- private static final long serialVersionUID = 1L;
- private final String seqHeaderPrefix;
- private final String seqLine;
- private final String qualHeaderPrefix;
- private final String qualLine;
-
- public FastqRecord(final String seqHeaderPrefix, final String seqLine, final String qualHeaderPrefix, final String qualLine) {
- if (seqHeaderPrefix != null && !seqHeaderPrefix.isEmpty()) this.seqHeaderPrefix = seqHeaderPrefix;
- else this.seqHeaderPrefix = null;
- if (qualHeaderPrefix != null && !qualHeaderPrefix.isEmpty()) this.qualHeaderPrefix = qualHeaderPrefix;
- else this.qualHeaderPrefix = null;
- this.seqLine = seqLine ;
- this.qualLine = qualLine ;
- }
-
- /** copy constructor */
- public FastqRecord(final FastqRecord other) {
- if( other == null ) throw new IllegalArgumentException("new FastqRecord(null)");
- this.seqHeaderPrefix = other.seqHeaderPrefix;
- this.seqLine = other.seqLine;
- this.qualHeaderPrefix = other.qualHeaderPrefix;
- this.qualLine = other.qualLine;
- }
-
- /** @return the read name */
- public String getReadHeader() { return seqHeaderPrefix; }
- /** @return the read DNA sequence */
- public String getReadString() { return seqLine; }
- /** @return the quality header */
- public String getBaseQualityHeader() { return qualHeaderPrefix; }
- /** @return the quality string */
- public String getBaseQualityString() { return qualLine; }
- /** shortcut to getReadString().length() */
- public int length() { return this.seqLine==null?0:this.seqLine.length();}
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime
- * result
- + ((qualHeaderPrefix == null) ? 0 : qualHeaderPrefix.hashCode());
- result = prime * result
- + ((qualLine == null) ? 0 : qualLine.hashCode());
- result = prime * result
- + ((seqHeaderPrefix == null) ? 0 : seqHeaderPrefix.hashCode());
- result = prime * result + ((seqLine == null) ? 0 : seqLine.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- FastqRecord other = (FastqRecord) obj;
- if (seqLine == null) {
- if (other.seqLine != null)
- return false;
- } else if (!seqLine.equals(other.seqLine))
- return false;
- if (qualHeaderPrefix == null) {
- if (other.qualHeaderPrefix != null)
- return false;
- } else if (!qualHeaderPrefix.equals(other.qualHeaderPrefix))
- return false;
- if (qualLine == null) {
- if (other.qualLine != null)
- return false;
- } else if (!qualLine.equals(other.qualLine))
- return false;
- if (seqHeaderPrefix == null) {
- if (other.seqHeaderPrefix != null)
- return false;
- } else if (!seqHeaderPrefix.equals(other.seqHeaderPrefix))
- return false;
-
- return true;
- }
-
- @Override
- public String toString() {
- return new StringBuilder().
- append(FastqConstants.SEQUENCE_HEADER).append(this.seqHeaderPrefix==null?"":this.seqHeaderPrefix).append('\n').
- append(this.seqLine==null?"":this.seqLine).append('\n').
- append(FastqConstants.QUALITY_HEADER).append(this.qualHeaderPrefix==null?"":this.qualHeaderPrefix).append('\n').
- append(this.qualLine==null?"":this.qualLine).
- toString();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqWriter.java b/src/main/java/htsjdk/samtools/fastq/FastqWriter.java
deleted file mode 100644
index e37aec5..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqWriter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import java.io.Closeable;
-
-/**
- * Simple interface for a class that can write out fastq records.
- *
- * @author Tim Fennell
- */
-public interface FastqWriter extends Closeable {
- void write(final FastqRecord rec);
- void close();
-}
diff --git a/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java b/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java
deleted file mode 100644
index 273e352..0000000
--- a/src/main/java/htsjdk/samtools/fastq/FastqWriterFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.File;
-
-/**
- * Factory class for creating FastqWriter objects.
- *
- * @author Tim Fennell
- */
-public class FastqWriterFactory {
- boolean useAsyncIo = Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS;
- boolean createMd5 = Defaults.CREATE_MD5;
-
- /** Sets whether or not to use async io (i.e. a dedicated thread per writer. */
- public void setUseAsyncIo(final boolean useAsyncIo) { this.useAsyncIo = useAsyncIo; }
-
- /** If true, compute MD5 and write appropriately-named file when file is closed. */
- public void setCreateMd5(final boolean createMd5) { this.createMd5 = createMd5; }
-
- public FastqWriter newWriter(final File out) {
- final FastqWriter writer = new BasicFastqWriter(out, createMd5);
- if (useAsyncIo) {
- return new AsyncFastqWriter(writer, AsyncFastqWriter.DEFAULT_QUEUE_SIZE);
- }
- else {
- return writer;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java b/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java
deleted file mode 100644
index 9163735..0000000
--- a/src/main/java/htsjdk/samtools/filter/AbstractJavascriptFilter.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-
-import javax.script.Bindings;
-import javax.script.Compilable;
-import javax.script.CompiledScript;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-import javax.script.SimpleBindings;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeScriptException;
-
-/**
- * Javascript filter with HEADER type containing TYPE records. contains two
- * static method to get a SAM Read filter or a VariantFilter.
- *
- * warning: tools, like galaxy, using this class are not safe because a script
- * can access the filesystem.
- *
- * @author Pierre Lindenbaum PhD
- */
-public abstract class AbstractJavascriptFilter<HEADER, TYPE> {
- public static final String DEFAULT_HEADER_KEY = "header";
- /** compiled user script */
- private CompiledScript script = null;
-
- /** javascript bindings */
- protected Bindings bindings;
-
- /**
- * constructor using a java.io.File script, compiles the script, puts
- * 'header' in the bindings
- */
- protected AbstractJavascriptFilter(final File scriptFile, final HEADER header) throws IOException {
- this(new FileReader(scriptFile), header);
- }
-
- /**
- * constructor using a java.lang.String script, compiles the script, puts
- * 'header' in the bindings
- */
- protected AbstractJavascriptFilter(final String scriptExpression, final HEADER header) {
- this(new StringReader(scriptExpression), header);
- }
-
- /**
- * Constructor, compiles script, put header in the bindings
- *
- * @param scriptReader
- * reader containing the script. will be closed.
- * @param header
- * the header to be injected in the javascript context
- */
- protected AbstractJavascriptFilter(final Reader scriptReader, final HEADER header) {
- final ScriptEngineManager manager = new ScriptEngineManager();
- /* get javascript engine */
- final ScriptEngine engine = manager.getEngineByName("js");
- if (engine == null) {
- CloserUtil.close(scriptReader);
- throw new RuntimeScriptException("The embedded 'javascript' engine is not available in java. "
- + "Do you use the SUN/Oracle Java Runtime ?");
- }
- if (scriptReader == null) {
- throw new RuntimeScriptException("missing ScriptReader.");
- }
-
- try {
- final Compilable compilingEngine = getCompilable(engine);
- this.script = compilingEngine.compile(scriptReader);
- } catch (ScriptException err) {
- throw new RuntimeScriptException("Script error in input", err);
- } finally {
- CloserUtil.close(scriptReader);
- }
-
- /*
- * create the javascript bindings and put the file header in that
- * context
- */
- this.bindings = new SimpleBindings();
- this.bindings.put(DEFAULT_HEADER_KEY, header);
- }
-
- /** return a javascript engine as a Compilable */
- private static Compilable getCompilable(final ScriptEngine engine) {
- if (!(engine instanceof Compilable)) {
- throw new IllegalStateException("The current javascript engine (" + engine.getClass()
- + ") cannot be cast to Compilable. " + "Do you use the SUN/Oracle Java Runtime ?");
- }
- return Compilable.class.cast(engine);
- }
-
- /** returns key used for header binding */
- public String getHeaderKey() {
- return DEFAULT_HEADER_KEY;
- }
-
- /** returns key used for record binding */
- public abstract String getRecordKey();
-
- /**
- * Evaluates this predicate on the given argument
- *
- * @param record
- * the record to test. It will be inject in the javascript
- * context using getRecordKey()
- * @return true (keep) if the user script returned 1 or true, else false
- * (reject).
- */
- protected boolean accept(final TYPE record) {
- try {
- /* insert the record into the javascript context */
- this.bindings.put(getRecordKey(), record);
- /* get the result */
- final Object result = this.script.eval(this.bindings);
- if (result == null) {
- return false;
- } else if (result instanceof Boolean) {
- return Boolean.TRUE.equals(result);
- } else if (result instanceof Number) {
- return (((Number) result).intValue() == 1);
- } else {
- return false;
- }
- } catch (ScriptException err) {
- throw new RuntimeException(err);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AggregateFilter.java b/src/main/java/htsjdk/samtools/filter/AggregateFilter.java
deleted file mode 100644
index f396c59..0000000
--- a/src/main/java/htsjdk/samtools/filter/AggregateFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.List;
-
-/**
- * Aggregates multiple filters and provides a method for applying them all to a given record with
- * one method call.
- *
- * $Id$
- */
-public class AggregateFilter implements SamRecordFilter {
-
- private final List<SamRecordFilter> filters;
-
- /**
- * Constructor
- * @param filters the list of filters that this Aggregator applies
- */
- public AggregateFilter(final List<SamRecordFilter> filters) {
- this.filters = filters;
- }
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches at least one filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- for (final SamRecordFilter filter : filters) {
- if (filter.filterOut(record)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- for (final SamRecordFilter filter : filters) {
- if (filter.filterOut(first, second)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/AlignedFilter.java b/src/main/java/htsjdk/samtools/filter/AlignedFilter.java
deleted file mode 100644
index c70453d..0000000
--- a/src/main/java/htsjdk/samtools/filter/AlignedFilter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter to either include or exclude aligned reads
- *
- * $Id$
- */
-public class AlignedFilter implements SamRecordFilter {
-
- private boolean includeAligned = false;
-
- public AlignedFilter(final boolean includeAligned) {
- this.includeAligned = includeAligned;
- }
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- *
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- if (includeAligned) {
- if (!record.getReadUnmappedFlag()) {
- return false;
- }
- } else {
- // exclude aligned
- if (record.getReadUnmappedFlag()) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
-
- if (includeAligned) {
- // both first and second must be mapped for it to not be filtered out
- if (!first.getReadUnmappedFlag() && !second.getReadUnmappedFlag()) {
- return false;
- }
- } else {
- // exclude aligned - if either first or second is unmapped don't filter it out
- if (first.getReadUnmappedFlag() || second.getReadUnmappedFlag()) {
- return false;
- }
- }
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java b/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java
deleted file mode 100644
index c79b3cc..0000000
--- a/src/main/java/htsjdk/samtools/filter/DuplicateReadFilter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with DuplicateRead flag set
- *
- * $Id$
- */
-public class DuplicateReadFilter implements SamRecordFilter {
- /**
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- return record.getDuplicateReadFlag();
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- throw new UnsupportedOperationException("Paired DuplicateReadFilter filter not implemented!");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java b/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java
deleted file mode 100644
index 7c6825c..0000000
--- a/src/main/java/htsjdk/samtools/filter/FailsVendorReadQualityFilter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter for filtering out reads that do not pass the quality filter
- *
- * $Id$
- */
-public class FailsVendorReadQualityFilter implements SamRecordFilter {
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- return record.getReadFailsVendorQualityCheckFlag();
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // if either fails, exclude them both
- return (first.getReadFailsVendorQualityCheckFlag() || second.getReadFailsVendorQualityCheckFlag());
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FilteringIterator.java b/src/main/java/htsjdk/samtools/filter/FilteringIterator.java
deleted file mode 100644
index 3ce9f96..0000000
--- a/src/main/java/htsjdk/samtools/filter/FilteringIterator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.Iterator;
-
-/**
- * Filtering Iterator which takes a filter and an iterator and iterates through only those records
- * which are not rejected by the filter.
- * <p/>
- * $Id$
- *
- * @author Kathleen Tibbetts
- *
- * use {@link FilteringSamIterator} instead
- */
-
- at Deprecated /** use {@link FilteringSamIterator} instead **/
-public class FilteringIterator extends FilteringSamIterator{
-
- public FilteringIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter, final boolean filterByPair) {
- super(iterator, filter, filterByPair);
- }
-
- public FilteringIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter) {
- super(iterator, filter);
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java b/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java
deleted file mode 100644
index 7ac1c0a..0000000
--- a/src/main/java/htsjdk/samtools/filter/FilteringSamIterator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamPairUtil;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.PeekableIterator;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Filtering Iterator which takes a filter and an iterator and iterates through only those records
- * which are not rejected by the filter.
- * <p/>
- * $Id$
- *
- * @author Kathleen Tibbetts
- */
-public class FilteringSamIterator implements CloseableIterator<SAMRecord> {
-
- private final PeekableIterator<SAMRecord> iterator;
- private final SamRecordFilter filter;
- private boolean filterReadPairs = false;
- private SAMRecord next = null;
-
- /**
- * Constructor
- *
- * @param iterator the backing iterator
- * @param filter the filter (which may be a FilterAggregator)
- * @param filterByPair if true, filter reads in pairs
- */
- public FilteringSamIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter,
- final boolean filterByPair) {
-
- if (filterByPair && iterator instanceof SAMRecordIterator) {
- ((SAMRecordIterator)iterator).assertSorted(SAMFileHeader.SortOrder.queryname);
- }
-
- this.iterator = new PeekableIterator<SAMRecord>(iterator);
- this.filter = filter;
- this.filterReadPairs = filterByPair;
- next = getNextRecord();
- }
-
- /**
- * Constructor
- *
- * @param iterator the backing iterator
- * @param filter the filter (which may be a FilterAggregator)
- */
- public FilteringSamIterator(final Iterator<SAMRecord> iterator, final SamRecordFilter filter) {
- this.iterator = new PeekableIterator<SAMRecord>(iterator);
- this.filter = filter;
- next = getNextRecord();
- }
-
- /**
- * Returns true if the iteration has more elements.
- *
- * @return true if the iteration has more elements. Otherwise returns false.
- */
- public boolean hasNext() {
- return next != null;
- }
-
- /**
- * Returns the next element in the iteration.
- *
- * @return the next element in the iteration
- * @throws java.util.NoSuchElementException
- *
- */
- public SAMRecord next() {
- if (next == null) {
- throw new NoSuchElementException("Iterator has no more elements.");
- }
- final SAMRecord result = next;
- next = getNextRecord();
- return result;
- }
-
- /**
- * Required method for Iterator API.
- *
- * @throws UnsupportedOperationException
- */
- public void remove() {
- throw new UnsupportedOperationException("Remove() not supported by FilteringSamIterator");
- }
-
- public void close() {
- CloserUtil.close(iterator);
- }
-
- /**
- * Gets the next record from the underlying iterator that passes the filter
- *
- * @return SAMRecord the next filter-passing record
- */
- private SAMRecord getNextRecord() {
-
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
-
- if (filterReadPairs && record.getReadPairedFlag() && record.getFirstOfPairFlag() &&
- iterator.hasNext()) {
-
- SamPairUtil.assertMate(record, iterator.peek());
-
- if (filter.filterOut(record, iterator.peek())) {
- // skip second read
- iterator.next();
- } else {
- return record;
- }
- } else if (filterReadPairs && record.getReadPairedFlag() &&
- record.getSecondOfPairFlag()) {
- // assume that we did a pass(first, second) and it passed the filter
- return record;
- } else if (!filter.filterOut(record)) {
- return record;
- }
- }
-
- return null;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java b/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java
deleted file mode 100644
index 1e99fa9..0000000
--- a/src/main/java/htsjdk/samtools/filter/InsertSizeFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter things that fall outside a specified range of insert sizes.
- * This will automatically omit unpaired reads.
- */
-public class InsertSizeFilter implements SamRecordFilter {
- final int minInsertSize;
- final int maxInsertSize;
-
- public InsertSizeFilter(final int minInsertSize, final int maxInsertSize) {
- if (minInsertSize > maxInsertSize) throw new SAMException("Cannot have minInsertSize > maxInsertSize");
- this.minInsertSize = minInsertSize;
- this.maxInsertSize = maxInsertSize;
- }
-
- @Override
- public boolean filterOut(final SAMRecord rec) {
- if (!rec.getReadPairedFlag()) return true;
- final int ins = Math.abs(rec.getInferredInsertSize());
- return ins < minInsertSize || ins > maxInsertSize;
- }
-
- @Override
- public boolean filterOut(final SAMRecord r1, final SAMRecord r2) {
- return filterOut(r1) || filterOut(r2);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/IntervalFilter.java b/src/main/java/htsjdk/samtools/filter/IntervalFilter.java
deleted file mode 100644
index ff3620a..0000000
--- a/src/main/java/htsjdk/samtools/filter/IntervalFilter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.IntervalUtil;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Filter SAMRecords so that only those that overlap the given list of intervals.
- * It is required that the SAMRecords are passed in coordinate order, and have non-null SAMFileHeaders.
- *
- * $Id$
- *
- * @author alecw at broadinstitute.org
- */
-public class IntervalFilter implements SamRecordFilter {
- private final Iterator<Interval> intervals;
- /**
- * Null only if there are no more intervals
- */
- private final SAMFileHeader samHeader;
- private Interval currentInterval;
- private int currentSequenceIndex;
-
- /**
- * Prepare to filter out SAMRecords that do not overlap the given list of intervals
- * @param intervals -- must be locus-ordered & non-overlapping
- */
- public IntervalFilter(final List<Interval> intervals, final SAMFileHeader samHeader) {
- this.samHeader = samHeader;
- IntervalUtil.assertOrderedNonOverlapping(intervals.iterator(), samHeader.getSequenceDictionary());
- this.intervals = intervals.iterator();
- advanceInterval();
- }
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- while (currentInterval != null &&
- (currentSequenceIndex < record.getReferenceIndex() ||
- (currentSequenceIndex == record.getReferenceIndex() && currentInterval.getEnd() < record.getAlignmentStart()))) {
- advanceInterval();
- }
- // Return true if record should be filtered out
- return !(currentInterval != null && currentSequenceIndex == record.getReferenceIndex() &&
- currentInterval.getStart() <= record.getAlignmentEnd());
- }
-
- private void advanceInterval() {
- if (intervals.hasNext()) {
- currentInterval = intervals.next();
- currentSequenceIndex = samHeader.getSequenceIndex(currentInterval.getContig());
- } else {
- currentInterval = null;
- }
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // This can never be implemented because if the bam is coordinate sorted,
- // which it has to be for this filter, it will never get both the first and second reads together
- // and the filterOut method goes in order of the intervals in coordinate order so it will miss reads.
- throw new UnsupportedOperationException("Paired IntervalFilter filter cannot be implemented, use IntervalKeepPairFilter.");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java b/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java
deleted file mode 100644
index 5a7961b..0000000
--- a/src/main/java/htsjdk/samtools/filter/IntervalKeepPairFilter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Filter out SAMRecords where neither record of a pair overlaps a given set of
- * intervals. If one record of a pair overlaps the interval list, than both are
- * kept. It is required that the SAMRecords are passed in coordinate order, have
- * non-null SAMFileHeaders, and that Mate Cigar (MC) is present.
- *
- * @author kbergin at broadinstitute.org
- */
-public class IntervalKeepPairFilter implements SamRecordFilter {
- private final OverlapDetector<Interval> intervalOverlapDetector;
-
- /**
- * Prepare to filter out SAMRecords that do not overlap the given list of
- * intervals
- * @param intervals
- */
- public IntervalKeepPairFilter(final List<Interval> intervals) {
- this.intervalOverlapDetector = new OverlapDetector<>(0, 0);
- this.intervalOverlapDetector.addAll(intervals, intervals);
- }
-
- /**
- * Determines whether a SAMRecord matches this filter. Takes record, finds
- * the location of its mate using the MC tag. Checks if either record
- * overlaps the current interval using overlap detector. If yes, return
- * false -> don't filter it out.
- *
- * If a read is secondary or supplementary, filter read out. Use
- * {@link IntervalFilter} if you want to keep these reads, but NOTE: the
- * resulting bam may not be valid.
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- if (record.isSecondaryOrSupplementary()) {
- return true;
- }
-
- if (!record.getReadUnmappedFlag()
- && hasOverlaps(record.getReferenceName(), record.getStart(), record.getEnd())) {
- return false;
- }
-
- return record.getMateUnmappedFlag() || !hasOverlaps(record.getMateReferenceName(),
- record.getMateAlignmentStart(), SAMUtils.getMateAlignmentEnd(record));
- }
-
- /**
- * Returns true if the record overlaps any intervals in list, false otherwise.
- *
- * @param refSequence Reference contig name where record maps
- * @param start Record alignment start
- * @param end Record alignment end
- * @return true if SAMRecord overlaps any intervals in list
- */
- private boolean hasOverlaps(final String refSequence, final int start, final int end) {
- final Interval readInterval = new Interval(refSequence, start, end);
- final Collection<Interval> overlapsRead = intervalOverlapDetector.getOverlaps(readInterval);
-
- return !overlapsRead.isEmpty();
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if both SAMRecords do not overlap the interval list
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- return filterOut(first) && filterOut(second);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java b/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java
deleted file mode 100644
index 20c784b..0000000
--- a/src/main/java/htsjdk/samtools/filter/JavascriptSamRecordFilter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * javascript based read filter
- *
- *
- * The script puts the following variables in the script context:
- *
- * - 'record' a SamRecord (
- * https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/
- * SAMRecord.java ) - 'header' (
- * https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/
- * SAMFileHeader.java )
- *
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-public class JavascriptSamRecordFilter extends AbstractJavascriptFilter<SAMFileHeader, SAMRecord>
- implements SamRecordFilter {
- /**
- * constructor using a javascript File
- *
- * @param scriptFile
- * the javascript file to be compiled
- * @param header
- * the SAMHeader
- */
- public JavascriptSamRecordFilter(final File scriptFile, final SAMFileHeader header) throws IOException {
- super(scriptFile, header);
- }
-
- /**
- * constructor using a javascript expression
- *
- * @param scriptExpression
- * the javascript expression to be compiled
- * @param header
- * the SAMHeader
- */
- public JavascriptSamRecordFilter(final String scriptExpression, final SAMFileHeader header) {
- super(scriptExpression, header);
- }
-
- /**
- * constructor using a java.io.Reader
- *
- * @param scriptReader
- * the javascript reader to be compiled. will be closed
- * @param header
- * the SAMHeader
- */
- public JavascriptSamRecordFilter(final Reader scriptReader, final SAMFileHeader header) {
- super(scriptReader, header);
- }
-
- /** return true of both records are filteredOut (AND) */
- @Override
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- return filterOut(first) && filterOut(second);
- }
-
- /** read is filtered out if the javascript program returns false */
- @Override
- public boolean filterOut(final SAMRecord record) {
- return !accept(record);
- }
-
- @Override
- public String getRecordKey() {
- return "record";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java b/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java
deleted file mode 100644
index d25df73..0000000
--- a/src/main/java/htsjdk/samtools/filter/MappingQualityFilter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter things with low mapping quality.
- */
-public class MappingQualityFilter implements SamRecordFilter {
-
- private int minimumMappingQuality = Integer.MIN_VALUE;
-
- public MappingQualityFilter(final int minimumMappingQuality) {
- this.minimumMappingQuality = minimumMappingQuality;
- }
-
- @Override
- public boolean filterOut(final SAMRecord record) {
- return record.getMappingQuality() < this.minimumMappingQuality;
- }
-
- @Override
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- return filterOut(first) || filterOut(second);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java b/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java
deleted file mode 100644
index 0f2364c..0000000
--- a/src/main/java/htsjdk/samtools/filter/NotPrimaryAlignmentFilter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with NotPrimaryAlignment flag set
- *
- * $Id$
- */
-public class NotPrimaryAlignmentFilter implements SamRecordFilter {
- /**
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- return record.getNotPrimaryAlignmentFlag();
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // if either fails, exclude them both
- return (first.getNotPrimaryAlignmentFlag() || second.getNotPrimaryAlignmentFlag());
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java b/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java
deleted file mode 100644
index 2e8f43f..0000000
--- a/src/main/java/htsjdk/samtools/filter/OverclippedReadFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filters out reads with very few unclipped bases, likely due to the read coming
- * from a foreign organism, e.g. bacterial contamination.
- *
- * Based on GATK's OverclippedReadFilter.
- */
-public class OverclippedReadFilter implements SamRecordFilter {
- // if the number of unclipped bases is below this threshold, the read is considered overclipped
- private final int unclippedBasesThreshold;
- // if set to true, then reads with at least one clipped end will be filtered; if false, we require both ends to be clipped
- private final boolean filterSingleEndClips;
-
- public OverclippedReadFilter(final int unclippedBasesThreshold, final boolean filterSingleEndClips) {
- if (unclippedBasesThreshold < 0) throw new SAMException("unclippedBasesThreshold must be non-negative");
- this.unclippedBasesThreshold = unclippedBasesThreshold;
- this.filterSingleEndClips = filterSingleEndClips;
- }
-
- @Override
- public boolean filterOut(final SAMRecord record) {
- int alignedLength = 0;
- int softClipBlocks = 0;
- int minSoftClipBlocks = filterSingleEndClips ? 1 : 2;
- CigarOperator lastOperator = null;
-
- for ( final CigarElement element : record.getCigar().getCigarElements() ) {
- if ( element.getOperator() == CigarOperator.S ) {
- //Treat consecutive S blocks as a single one
- if(lastOperator != CigarOperator.S){
- softClipBlocks += 1;
- }
-
- } else if ( element.getOperator().consumesReadBases() ) { // M, I, X, and EQ (S was already accounted for above)
- alignedLength += element.getLength();
- }
- lastOperator = element.getOperator();
- }
-
- return(alignedLength < unclippedBasesThreshold && softClipBlocks >= minSoftClipBlocks);
- }
-
- @Override
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- return filterOut(first) || filterOut(second);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java b/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java
deleted file mode 100644
index e4b2a20..0000000
--- a/src/main/java/htsjdk/samtools/filter/ReadNameFilter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Filter by a set of specified readnames
- * <p/>
- * $Id$
- */
-public class ReadNameFilter implements SamRecordFilter {
-
- private boolean includeReads = false;
- private Set<String> readNameFilterSet = new HashSet<String>();
-
- public ReadNameFilter(final File readNameFilterFile, final boolean includeReads) {
-
- IOUtil.assertFileIsReadable(readNameFilterFile);
- IOUtil.assertFileSizeNonZero(readNameFilterFile);
-
- try {
- final BufferedReader in = IOUtil.openFileForBufferedReading(readNameFilterFile);
-
- String line = null;
-
- while ((line = in.readLine()) != null) {
- if (!line.trim().isEmpty()) {
- readNameFilterSet.add(line.split("\\s+")[0]);
- }
- }
-
- in.close();
- } catch (IOException e) {
- throw new SAMException(e.getMessage(), e);
- }
-
- this.includeReads = includeReads;
- }
-
- public ReadNameFilter(final Set<String> readNameFilterSet, final boolean includeReads) {
- this.readNameFilterSet = readNameFilterSet;
- this.includeReads = includeReads;
- }
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- *
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- if (includeReads) {
- if (readNameFilterSet.contains(record.getReadName())) {
- return false;
- }
- } else {
- if (!readNameFilterSet.contains(record.getReadName())) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Determines whether a pair of SAMRecords matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the pair of records matches filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- if (includeReads) {
- if (readNameFilterSet.contains(first.getReadName()) &&
- readNameFilterSet.contains(second.getReadName())) {
- return false;
- }
- } else {
- if (!readNameFilterSet.contains(first.getReadName()) &&
- !readNameFilterSet.contains(second.getReadName())) {
- return false;
- }
- }
-
- return true;
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java b/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java
deleted file mode 100644
index 5ca280e..0000000
--- a/src/main/java/htsjdk/samtools/filter/SamRecordFilter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * API for filtering SAMRecords
- *
- * $Id$
- */
-public interface SamRecordFilter {
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- *
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(SAMRecord record);
-
- /**
- * Determines whether a pair of SAMRecords matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the pair of records matches filter, otherwise false
- */
- public boolean filterOut(SAMRecord first, SAMRecord second);
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java b/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java
deleted file mode 100644
index d91212d..0000000
--- a/src/main/java/htsjdk/samtools/filter/SecondaryAlignmentFilter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * SamRecordFilter that filters out secondary alignments, but not supplemental alignments.
- */
-public class SecondaryAlignmentFilter implements SamRecordFilter {
- /**
- * Returns true if the read is marked as secondary.
- */
- public boolean filterOut(final SAMRecord record) { return record.getNotPrimaryAlignmentFlag(); }
-
- /**
- * Returns true if either read is marked as secondary.
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- return first.getNotPrimaryAlignmentFlag() || second.getNotPrimaryAlignmentFlag();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java b/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java
deleted file mode 100644
index ae57fd9..0000000
--- a/src/main/java/htsjdk/samtools/filter/SecondaryOrSupplementaryFilter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter out SAMRecords with NotPrimaryAlignment or Supplementary flag set
- * This class should be viewed as a replacement for NotPrimarySkippingIterator,
- * in that we did not want to change the functionality of NPSI to no longer match its name
- * $Id$
- */
-public class SecondaryOrSupplementaryFilter implements SamRecordFilter {
- /**
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- return record.isSecondaryOrSupplementary();
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // if either fails, exclude them both
- return first.isSecondaryOrSupplementary() || second.isSecondaryOrSupplementary();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java b/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java
deleted file mode 100644
index bfb31d6..0000000
--- a/src/main/java/htsjdk/samtools/filter/SolexaNoiseFilter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.util.SequenceUtil;
-
-/**
- * Filter to determine whether a read is "noisy" due to a poly-A run that is a sequencing artifact.
- * Currently we filter out only reads that are composed entirely of As.
- *
- * $Id$
- */
-public class SolexaNoiseFilter implements SamRecordFilter {
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord record) {
- final byte[] sequence = record.getReadBases();
- for (final byte base : sequence) {
- if (base != 'A' && base != 'a' &&
- !SequenceUtil.isNoCall(base)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Determines whether a pair of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // only filter out the pair if both first and second reads have all As
- return (filterOut(first) && filterOut(second));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/TagFilter.java b/src/main/java/htsjdk/samtools/filter/TagFilter.java
deleted file mode 100644
index 5182e83..0000000
--- a/src/main/java/htsjdk/samtools/filter/TagFilter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Filter class for matching tag attributes in SAMRecords
- *
- * $Id$
- */
-public class TagFilter implements SamRecordFilter {
-
- private final String tag; // The key of the tag to match
- private final List<Object> values; // The list of matching values
-
- /**
- * Constructor for a single value
- *
- * @param tag the key of the tag to match
- * @param value the value to match
- */
- public TagFilter(String tag, Object value) {
- this.tag = tag;
- this.values = Arrays.asList(value);
- }
-
- /**
- * Constructor for multiple values
- *
- * @param tag the key of the tag to match
- * @param values the matching values
- */
- public TagFilter(String tag, List<Object> values) {
- this.tag = tag;
- this.values = values;
- }
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, otherwise false
- */
- public boolean filterOut(SAMRecord record) {
- return values.contains(record.getAttribute(tag));
- }
-
- /**
- * Determines whether a paired of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // both first and second must have the tag in order for it to be filtered out
- return values.contains(first.getAttribute(tag)) && values.contains(second.getAttribute(tag));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java b/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java
deleted file mode 100644
index 2a1566c..0000000
--- a/src/main/java/htsjdk/samtools/filter/WholeReadClippedFilter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.ReservedTagConstants;
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Filter SAMRecords so that only those that have at least one un-clipped base are
- * returned.
- *
- * $Id$
- *
- * @author ktibbett at broadinstitute.org
- */
-public class WholeReadClippedFilter implements SamRecordFilter {
-
- /**
- * Determines whether a SAMRecord matches this filter
- *
- * @param record the SAMRecord to evaluate
- * @return true if the SAMRecord matches the filter, and should be filtered out,
- * otherwise false
- */
- @Override
- public boolean filterOut(final SAMRecord record) {
- return record.getAttribute(ReservedTagConstants.XT) != null
- && (Integer)record.getAttribute(ReservedTagConstants.XT) == 1;
- }
-
- /**
- * Determines whether a paired of SAMRecord matches this filter
- *
- * @param first the first SAMRecord to evaluate
- * @param second the second SAMRecord to evaluate
- *
- * @return true if the SAMRecords matches the filter, otherwise false
- */
- public boolean filterOut(final SAMRecord first, final SAMRecord second) {
- // if either fails, exclude them both
- return (filterOut(first) || filterOut(second));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/liftover/Chain.java b/src/main/java/htsjdk/samtools/liftover/Chain.java
deleted file mode 100644
index 8ac87fb..0000000
--- a/src/main/java/htsjdk/samtools/liftover/Chain.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Holds a single chain from a UCSC chain file. Chain file format is described here: http://genome.ucsc.edu/goldenPath/help/chain.html
- *
- * In a chain file, a chain consists of a header line followed by alignment data lines. Chain class embodies the header
- * line, and the list of ContinuousBlocks embodies the alignment data lines.
- *
- * A continuous block represents a continuous range of the "from" genome that maps to a continuous range of the "to"
- * genome of the same length. A chain is an ordered list of continuous blocks, with gaps between the continuous blocks.
- * All the continuous blocks in a chain must map from a single "from" sequence to a single "to" sequence. All the
- * continuous blocks in a chain map from the positive strand in the "from" genome build to the same strand in the
- * "to" genome build. The gaps in between the continuous blocks in a chain represent un-lift-overable regions.
- * A gap in a chain may be found in another chain (e.g. if a portion of a sequence is reversed in the "to" genome).
- *
- * In UCSC liftOver terminology, the "target" is the "from" genome build, and the "query" is the "to" genome build.
- * E.g. when mapping from HG18 to HG19, the HG18 coordinates are "target" and HG19 is "query." The USCS terminology
- * is not used here because it confuses me.
- *
- * Chain coordinates are zero-based, half open. However, there is also an Interval attribute of Chain that is in
- * standard Picard coordinates, i.e. one-based inclusive.
- *
- * @author alecw at broadinstitute.org
- */
-class Chain {
- // For parsing chain file
- private static final Pattern SPLITTER = Pattern.compile("\\s");
-
- /** Score is not used in basic liftover implementation, but is stored so that chain can be written to disk. */
- final double score;
- /** one-based, inclusive, so that Chain can be stored in an OverlapDetector */
- final Interval interval;
- /** Total score for chain is not used in basic liftover so not stored. */
- // final double score;
- final String fromSequenceName;
- /** Overall size of the "from" sequence. */
- final int fromSequenceSize;
- /* tStrand always +, so not stored */
- /** Start of range covered in "from" sequence. */
- final int fromChainStart;
- /** End of range covered in "from" sequence. */
- final int fromChainEnd;
- final String toSequenceName;
- /** Overall size of the "to" sequence. */
- final int toSequenceSize;
- /** "to" strand. If this is true, then the region covered by this chain is flipped in the "to" genome. */
- final boolean toOppositeStrand;
- /** Start of range covered in "to" sequence. */
- final int toChainStart;
- /** End of range covered in "to" sequence. */
- final int toChainEnd;
- /** ID of chain in file. */
- final int id;
- private final List<ContinuousBlock> blockList = new ArrayList<ContinuousBlock>();
-
- /**
- * Construct a Chain from the parsed header fields.
- */
- private Chain(final double score, final String fromSequenceName, final int fromSequenceSize, final int fromChainStart, final int fromChainEnd,
- final String toSequenceName, final int toSequenceSize, final boolean toOppositeStrand,
- final int toChainStart, final int toChainEnd, final int id) {
- // Convert to one-based, inclusive for Interval.
- interval = new Interval(fromSequenceName, fromChainStart + 1, fromChainEnd);
- this.score = score;
- this.toChainEnd = toChainEnd;
- this.toSequenceName = toSequenceName;
- this.toOppositeStrand = toOppositeStrand;
- this.toSequenceSize = toSequenceSize;
- this.toChainStart = toChainStart;
- // not used
- //this.score = score;
- this.fromChainEnd = fromChainEnd;
- this.fromSequenceName = fromSequenceName;
- this.fromSequenceSize = fromSequenceSize;
- this.fromChainStart = fromChainStart;
- this.id = id;
- }
-
-
- /**
- * Holds a range that continuously lines up between target and query genome builds.
- * Indices are 0-based, half-open.
- */
- static class ContinuousBlock {
- final int fromStart; /* Start of range covered in "from". */
- final int toStart; /* Range covered in "to". */
- final int blockLength; /* length of continuous block of that maps btw from and to */
- //int score; /* Score of block. */
-
- private ContinuousBlock(final int fromStart, final int toStart, final int blockLength) {
- this.fromStart = fromStart;
- this.toStart = toStart;
- this.blockLength = blockLength;
- }
-
- /**
- * @return 0-based, half-open end of region in "from"
- */
- int getFromEnd() {
- return fromStart + blockLength;
- }
-
- /**
- * @return 0-based, half-open end of region in "to"
- */
- int getToEnd() {
- return toStart + blockLength;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final ContinuousBlock that = (ContinuousBlock) o;
-
- if (blockLength != that.blockLength) return false;
- if (fromStart != that.fromStart) return false;
- if (toStart != that.toStart) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = fromStart;
- result = 31 * result + toStart;
- result = 31 * result + blockLength;
- return result;
- }
- }
-
- private void addBlock(final int tStart, final int qStart, final int blockLength) {
- blockList.add(new ContinuousBlock(tStart, qStart, blockLength));
- }
-
- /**
- * @return The ith ContinuousBlock in this Chain.
- */
- ContinuousBlock getBlock(final int i) {
- return blockList.get(i);
- }
-
- /**
- * @return Unmodifiable list of ContinuousBlocks in this Chain.
- */
- List<ContinuousBlock> getBlocks() {
- return Collections.unmodifiableList(blockList);
- }
-
- void write(final PrintWriter writer) {
- writer.printf("chain\t%f\t%s\t%d\t+\t%d\t%d\t%s\t%d\t%s\t%d\t%d\t%d\n",
- score, fromSequenceName, fromSequenceSize, fromChainStart, fromChainEnd,
- toSequenceName, toSequenceSize, (toOppositeStrand ? "-": "+"), toChainStart, toChainEnd, id);
- for (int i = 0; i < blockList.size() - 1; ++i) {
- final ContinuousBlock thisBlock = blockList.get(i);
- final ContinuousBlock nextBlock = blockList.get(i+1);
-
- final int fromGap = nextBlock.fromStart - thisBlock.getFromEnd();
- final int toGap = nextBlock.toStart - thisBlock.getToEnd();
- writer.printf("%d\t%d\t%d\n", thisBlock.blockLength, fromGap, toGap);
- }
- writer.printf("%d\n", blockList.get(blockList.size() - 1).blockLength);
- writer.println();
- }
-
- /**
- * Throw an exception if Chain looks strange.
- */
- void validate() {
- validatePositive("fromSequenceSize", fromSequenceSize);
- validateNonNegative("fromChainStart", fromChainStart);
- validateNonNegative("fromChainEnd", fromChainEnd);
- validatePositive("toSequenceSize", toSequenceSize);
- validateNonNegative("toChainStart", toChainStart);
- validateNonNegative("toChainEnd", toChainEnd);
- int fromLength = fromChainEnd - fromChainStart;
- validatePositive("from length", fromLength);
- int toLength = toChainEnd - toChainStart;
- validatePositive("to length", toLength);
- if (fromLength > fromSequenceSize) throw new SAMException("From chain length (" + fromLength +
- ") < from sequence length (" + fromSequenceSize + ") for chain " + id);
- if (toLength > toSequenceSize) throw new SAMException("To chain length (" + toLength +
- ") < to sequence length (" + toSequenceSize + ") for chain " + id);
- if (fromSequenceName.isEmpty()) throw new SAMException("Chain " + id + "has empty from sequence name.");
- if (toSequenceName.isEmpty()) throw new SAMException("Chain " + id + "has empty to sequence name.");
- if (blockList.isEmpty()) throw new SAMException("Chain " + id + " has empty block list.");
- final ContinuousBlock firstBlock = blockList.get(0);
- if (firstBlock.fromStart != fromChainStart) {
- throw new SAMException("First block from start != chain from start for chain " + id);
- }
- if (firstBlock.toStart != toChainStart) {
- throw new SAMException("First block to start != chain to start for chain " + id);
- }
- final ContinuousBlock lastBlock = blockList.get(blockList.size() - 1);
- if (lastBlock.getFromEnd() != fromChainEnd) {
- throw new SAMException("Last block from end != chain from end for chain " + id);
- }
- if (lastBlock.getToEnd() != toChainEnd) {
- throw new SAMException("Last block to end < chain to end for chain " + id);
- }
- for (int i = 1; i < blockList.size(); ++i) {
- final ContinuousBlock thisBlock = blockList.get(i);
- final ContinuousBlock prevBlock = blockList.get(i-1);
- if (thisBlock.fromStart < prevBlock.getFromEnd()) {
- throw new SAMException("Continuous block " + i + " from starts before previous block ends for chain " + id);
- }
- if (thisBlock.toStart < prevBlock.getToEnd()) {
- throw new SAMException("Continuous block " + i + " to starts before previous block ends for chain " + id);
- }
- }
- }
-
- private void validatePositive(final String attributeName, final int attribute) {
- if (attribute <= 0) {
- throw new SAMException(attributeName + " is not positive: " + attribute + " for chain " + id);
- }
- }
-
- private void validateNonNegative(final String attributeName, final int attribute) {
- if (attribute < 0) {
- throw new SAMException(attributeName + " is negative: " + attribute + " for chain " + id);
- }
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final Chain chain = (Chain) o;
-
- if (fromChainEnd != chain.fromChainEnd) return false;
- if (fromChainStart != chain.fromChainStart) return false;
- if (fromSequenceSize != chain.fromSequenceSize) return false;
- if (id != chain.id) return false;
- if (Double.compare(chain.score, score) != 0) return false;
- if (toChainEnd != chain.toChainEnd) return false;
- if (toChainStart != chain.toChainStart) return false;
- if (toOppositeStrand != chain.toOppositeStrand) return false;
- if (toSequenceSize != chain.toSequenceSize) return false;
- if (blockList != null ? !blockList.equals(chain.blockList) : chain.blockList != null) return false;
- if (fromSequenceName != null ? !fromSequenceName.equals(chain.fromSequenceName) : chain.fromSequenceName != null)
- return false;
- if (interval != null ? !interval.equals(chain.interval) : chain.interval != null) return false;
- if (toSequenceName != null ? !toSequenceName.equals(chain.toSequenceName) : chain.toSequenceName != null)
- return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result;
- long temp;
- temp = score != +0.0d ? Double.doubleToLongBits(score) : 0L;
- result = (int) (temp ^ (temp >>> 32));
- result = 31 * result + (interval != null ? interval.hashCode() : 0);
- result = 31 * result + (fromSequenceName != null ? fromSequenceName.hashCode() : 0);
- result = 31 * result + fromSequenceSize;
- result = 31 * result + fromChainStart;
- result = 31 * result + fromChainEnd;
- result = 31 * result + (toSequenceName != null ? toSequenceName.hashCode() : 0);
- result = 31 * result + toSequenceSize;
- result = 31 * result + (toOppositeStrand ? 1 : 0);
- result = 31 * result + toChainStart;
- result = 31 * result + toChainEnd;
- result = 31 * result + id;
- result = 31 * result + (blockList != null ? blockList.hashCode() : 0);
- return result;
- }
-
- /**
- * Read all the chains and load into an OverlapDetector.
- * @param chainFile File in UCSC chain format.
- * @return OverlapDetector will all Chains from reader loaded into it.
- */
- static OverlapDetector<Chain> loadChains(final File chainFile) {
- final BufferedLineReader reader = new BufferedLineReader(IOUtil.openFileForReading(chainFile));
- final OverlapDetector<Chain> ret = new OverlapDetector<Chain>(0, 0);
- Chain chain;
- while ((chain = Chain.loadChain(reader, chainFile.toString())) != null) {
- ret.addLhs(chain, chain.interval);
- }
- reader.close();
- return ret;
- }
-
- /**
- * Read a single Chain from reader.
- * @param reader Text representation of chains.
- * @param chainFile For error messages only.
- * @return New Chain with associated ContinuousBlocks.
- */
- private static Chain loadChain(final BufferedLineReader reader, final String chainFile) {
- String line;
- while (true) {
- line = reader.readLine();
- if (line == null) {
- return null;
- }
- // Skip comment lines
- if (!line.startsWith("#")) {
- break;
- }
- }
- final String[] chainFields = SPLITTER.split(line);
- if (chainFields.length != 13) {
- throwChainFileParseException("chain line has wrong number of fields", chainFile, reader.getLineNumber());
- }
- if (!"chain".equals(chainFields[0])) {
- throwChainFileParseException("chain line does not start with 'chain'", chainFile, reader.getLineNumber());
- }
- double score = 0;
- String fromSequenceName = null;
- int fromSequenceSize = 0;
- int fromChainStart = 0;
- int fromChainEnd = 0;
- String toSequenceName = null;
- int toSequenceSize = 0;
- boolean toNegativeStrand = false;
- int toChainStart = 0;
- int toChainEnd = 0;
- int id = 0;
- try {
- score = Double.parseDouble(chainFields[1]);
- fromSequenceName = chainFields[2];
- fromSequenceSize = Integer.parseInt(chainFields[3]);
- // Strand ignored because it is always +
- fromChainStart = Integer.parseInt(chainFields[5]);
- fromChainEnd = Integer.parseInt(chainFields[6]);
- toSequenceName = chainFields[7];
- toSequenceSize = Integer.parseInt(chainFields[8]);
- toNegativeStrand = chainFields[9].equals("-");
- toChainStart = Integer.parseInt(chainFields[10]);
- toChainEnd = Integer.parseInt(chainFields[11]);
- id = Integer.parseInt(chainFields[12]);
- } catch (NumberFormatException e) {
- throwChainFileParseException("Invalid field", chainFile, reader.getLineNumber());
- }
- final Chain chain = new Chain(score, fromSequenceName, fromSequenceSize, fromChainStart, fromChainEnd, toSequenceName, toSequenceSize, toNegativeStrand, toChainStart,
- toChainEnd, id);
- int toBlockStart = chain.toChainStart;
- int fromBlockStart = chain.fromChainStart;
- boolean sawLastLine = false;
- while (true) {
- line = reader.readLine();
- if (line == null || line.equals("")) {
- if (!sawLastLine) {
- throwChainFileParseException("Reached end of chain without seeing terminal block", chainFile, reader.getLineNumber());
- }
- break;
- }
- if (sawLastLine) {
- throwChainFileParseException("Terminal block seen before end of chain", chainFile, reader.getLineNumber());
- }
- String[] blockFields = SPLITTER.split(line);
- if (blockFields.length == 1) {
- sawLastLine = true;
- } else if (blockFields.length != 3) {
- throwChainFileParseException("Block line has unexpected number of fields", chainFile, reader.getLineNumber());
- }
- int size = Integer.parseInt(blockFields[0]);
- chain.addBlock(fromBlockStart, toBlockStart, size);
- if (!sawLastLine) {
- fromBlockStart += Integer.parseInt(blockFields[1]) + size;
- toBlockStart += Integer.parseInt(blockFields[2]) + size;
- }
-
- }
- chain.validate();
- return chain;
- }
-
- private static void throwChainFileParseException(final String message, final String chainFile, final int lineNumber) {
- throw new SAMException(message + " in chain file " + chainFile + " at line " + lineNumber);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/liftover/LiftOver.java b/src/main/java/htsjdk/samtools/liftover/LiftOver.java
deleted file mode 100644
index e422a72..0000000
--- a/src/main/java/htsjdk/samtools/liftover/LiftOver.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.OverlapDetector;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Java port of UCSC liftOver. Only the most basic liftOver functionality is implemented.
- * Internally coordinates are 0-based, half-open. The API is standard Picard 1-based, inclusive.
- *
- * @author alecw at broadinstitute.org
- */
-public class LiftOver {
- private static final Log LOG = Log.getInstance(LiftOver.class);
-
- public static final double DEFAULT_LIFTOVER_MINMATCH = 0.95;
-
- private double liftOverMinMatch = DEFAULT_LIFTOVER_MINMATCH;
- private final OverlapDetector<Chain> chains;
- private final Map<String, Set<String>> contigMap = new HashMap<>();
-
- /**
- * Load UCSC chain file in order to lift over Intervals.
- */
- public LiftOver(File chainFile) {
- IOUtil.assertFileIsReadable(chainFile);
- chains = Chain.loadChains(chainFile);
-
- for (final Chain chain : this.chains.getAll()) {
- final String from = chain.fromSequenceName;
- final String to = chain.toSequenceName;
- final Set<String> names;
- if (contigMap.containsKey(from)) {
- names = contigMap.get(from);
- }
- else {
- names = new HashSet<>();
- contigMap.put(from, names);
- }
- names.add(to);
- }
- }
-
- /**
- * Throw an exception if all the "to" sequence names in the chains are not found in the given sequence dictionary.
- */
- public void validateToSequences(final SAMSequenceDictionary sequenceDictionary) {
- for (final Chain chain : chains.getAll()) {
- if (sequenceDictionary.getSequence(chain.toSequenceName) == null) {
- throw new SAMException("Sequence " + chain.toSequenceName + " from chain file is not found in sequence dictionary.");
- }
- }
-
- }
-
- /**
- * Lift over the given interval to the new genome build using the liftOverMinMatch set for this
- * LiftOver object.
- * @param interval Interval to be lifted over.
- * @return Interval in the output build coordinates, or null if it cannot be lifted over.
- */
- public Interval liftOver(final Interval interval) {
- return liftOver(interval, liftOverMinMatch);
- }
-
- /**
- * Lift over the given interval to the new genome build.
- * @param interval Interval to be lifted over.
- * @param liftOverMinMatch Minimum fraction of bases that must remap.
- * @return Interval in the output build coordinates, or null if it cannot be lifted over.
- */
- public Interval liftOver(final Interval interval, final double liftOverMinMatch) {
- if (interval.length() == 0) {
- throw new IllegalArgumentException("Zero-length interval cannot be lifted over. Interval: " +
- interval.getName());
- }
- Chain chainHit = null;
- TargetIntersection targetIntersection = null;
- // Number of bases in interval that can be lifted over must be >= this.
- double minMatchSize = liftOverMinMatch * interval.length();
-
- // Find the appropriate Chain, and the part of the chain corresponding to the interval to be lifted over.
- for (final Chain chain : chains.getOverlaps(interval)) {
- final TargetIntersection candidateIntersection = targetIntersection(chain, interval);
- if (candidateIntersection != null && candidateIntersection.intersectionLength >= minMatchSize) {
- if (chainHit != null) {
- // In basic liftOver, multiple hits are not allowed.
- return null;
- }
- chainHit = chain;
- targetIntersection = candidateIntersection;
- } else if (candidateIntersection != null) {
- LOG.info("Interval " + interval.getName() + " failed to match chain " + chain.id +
- " because intersection length " + candidateIntersection.intersectionLength + " < minMatchSize "
- + minMatchSize +
- " (" + (candidateIntersection.intersectionLength/(float)interval.length()) + " < " + liftOverMinMatch + ")");
- }
- }
- if (chainHit == null) {
- // Can't be lifted over.
- return null;
- }
-
- return createToInterval(interval.getName(), interval.isNegativeStrand(), targetIntersection);
- }
-
- public List<PartialLiftover> diagnosticLiftover(final Interval interval) {
- final List<PartialLiftover> ret = new ArrayList<PartialLiftover>();
- if (interval.length() == 0) {
- throw new IllegalArgumentException("Zero-length interval cannot be lifted over. Interval: " +
- interval.getName());
- }
- for (final Chain chain : chains.getOverlaps(interval)) {
- Interval intersectingChain = interval.intersect(chain.interval);
- final TargetIntersection targetIntersection = targetIntersection(chain, intersectingChain);
- if (targetIntersection == null) {
- ret.add(new PartialLiftover(intersectingChain, chain.id));
- } else {
- Interval toInterval = createToInterval(interval.getName(), interval.isNegativeStrand(), targetIntersection);
- float percentLiftedOver = targetIntersection.intersectionLength/(float)interval.length();
- ret.add(new PartialLiftover(intersectingChain, toInterval, targetIntersection.chain.id, percentLiftedOver));
- }
- }
- return ret;
- }
-
- /**
- * @return the set of destination contigs for each source contig in the chains file.
- */
- public Map<String, Set<String>> getContigMap() {
- return Collections.unmodifiableMap(contigMap);
- }
-
- private static Interval createToInterval(final String intervalName, final boolean sourceNegativeStrand, final TargetIntersection targetIntersection) {
- // Compute the query interval given the offsets of the target interval start and end into the first and
- // last ContinuousBlocks.
- int toStart = targetIntersection.chain.getBlock(targetIntersection.firstBlockIndex).toStart + targetIntersection.startOffset;
- int toEnd = targetIntersection.chain.getBlock(targetIntersection.lastBlockIndex).getToEnd() - targetIntersection.offsetFromEnd;
- if (toEnd <= toStart || toStart < 0) {
- throw new SAMException("Something strange lifting over interval " + intervalName);
- }
-
- if (targetIntersection.chain.toOppositeStrand) {
- // Flip if query is negative.
- int negativeStart = targetIntersection.chain.toSequenceSize - toEnd;
- int negativeEnd = targetIntersection.chain.toSequenceSize - toStart;
- toStart = negativeStart;
- toEnd = negativeEnd;
- }
- // Convert to 1-based, inclusive.
- final boolean negativeStrand = targetIntersection.chain.toOppositeStrand ? !sourceNegativeStrand : sourceNegativeStrand;
- return new Interval(targetIntersection.chain.toSequenceName, toStart+1, toEnd, negativeStrand, intervalName);
- }
-
- /**
- * Add up overlap btw the blocks in this chain and the given interval.
- * @return Length of overlap, offsets into first and last ContinuousBlocks, and indices of first and
- * last ContinuousBlocks.
- */
- private static TargetIntersection targetIntersection(final Chain chain, final Interval interval) {
- int intersectionLength = 0;
- // Convert interval to 0-based, half-open
- int start = interval.getStart() - 1;
- int end = interval.getEnd();
- int firstBlockIndex = -1;
- int lastBlockIndex = -1;
- int startOffset = -1;
- int offsetFromEnd = -1;
- List<Chain.ContinuousBlock> blockList = chain.getBlocks();
- for (int i = 0; i < blockList.size(); ++i) {
- final Chain.ContinuousBlock block = blockList.get(i);
- if (block.fromStart >= end) {
- break;
- } else if (block.getFromEnd() <= start) {
- continue;
- }
- if (firstBlockIndex == -1) {
- firstBlockIndex = i;
- if (start > block.fromStart) {
- startOffset = start - block.fromStart;
- } else {
- startOffset = 0;
- }
- }
- lastBlockIndex = i;
- if (block.getFromEnd() > end) {
- offsetFromEnd = block.getFromEnd() - end;
- } else {
- offsetFromEnd = 0;
- }
- int thisIntersection = Math.min(end, block.getFromEnd()) - Math.max(start, block.fromStart);
- if (thisIntersection <= 0) {
- throw new SAMException("Should have been some intersection.");
- }
- intersectionLength += thisIntersection;
- }
- if (intersectionLength == 0) {
- return null;
- }
- return new TargetIntersection(chain, intersectionLength, startOffset, offsetFromEnd, firstBlockIndex, lastBlockIndex);
- }
-
- /**
- * Get minimum fraction of bases that must remap.
- */
- public double getLiftOverMinMatch() {
- return liftOverMinMatch;
- }
-
- /**
- * Set minimum fraction of bases that must remap.
- */
- public void setLiftOverMinMatch(final double liftOverMinMatch) {
- this.liftOverMinMatch = liftOverMinMatch;
- }
-
- /**
- * Value class returned by targetIntersection()
- */
- private static class TargetIntersection {
- /** Chain used for this intersection */
- final Chain chain;
- /** Total intersectionLength length */
- final int intersectionLength;
- /** Offset of target interval start in first block. */
- final int startOffset;
- /** Distance from target interval end to end of last block. */
- final int offsetFromEnd;
- /** Index of first ContinuousBlock matching interval. */
- final int firstBlockIndex;
- /** Index of last ContinuousBlock matching interval. */
- final int lastBlockIndex;
-
- TargetIntersection(final Chain chain,final int intersectionLength, final int startOffset,
- final int offsetFromEnd, final int firstBlockIndex, final int lastBlockIndex) {
- this.chain = chain;
- this.intersectionLength = intersectionLength;
- this.startOffset = startOffset;
- this.offsetFromEnd = offsetFromEnd;
- this.firstBlockIndex = firstBlockIndex;
- this.lastBlockIndex = lastBlockIndex;
- }
- }
-
- /**
- * Represents a portion of a liftover operation, for use in diagnosing liftover failures.
- */
- public static class PartialLiftover {
- /** Intersection between "from" interval and "from" region of a chain. */
- final Interval fromInterval;
- /**
- * Result of lifting over fromInterval (with no percentage mapped requirement). This is null
- * if fromInterval falls entirely with a gap of the chain. */
- final Interval toInterval;
- /** id of chain used for this liftover */
- final int chainId;
- /** Percentage of bases in fromInterval that lifted over. 0 if fromInterval is not covered by any chain. */
- final float percentLiftedOver;
-
- PartialLiftover(final Interval fromInterval, final Interval toInterval, final int chainId, final float percentLiftedOver) {
- this.fromInterval = fromInterval;
- this.toInterval = toInterval;
- this.chainId = chainId;
- this.percentLiftedOver = percentLiftedOver;
- }
-
- PartialLiftover(final Interval fromInterval, final int chainId) {
- this.fromInterval = fromInterval;
- this.toInterval = null;
- this.chainId = chainId;
- this.percentLiftedOver = 0.0f;
- }
-
- public String toString() {
- if (toInterval == null) {
- // Matched a chain, but entirely within a gap.
- return fromInterval.toString() + " (len " + fromInterval.length() + ")=>null using chain " + chainId;
- }
- final String strand = toInterval.isNegativeStrand()? "-": "+";
- return fromInterval.toString() + " (len " + fromInterval.length() + ")=>" + toInterval + "(" + strand
- + ") using chain " + chainId + " ; pct matched " + percentLiftedOver;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/Header.java b/src/main/java/htsjdk/samtools/metrics/Header.java
deleted file mode 100644
index 3672d8b..0000000
--- a/src/main/java/htsjdk/samtools/metrics/Header.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import java.io.Serializable;
-
-/**
- * A header for a metrics file. A header simply consists of a type and some arbitrary
- * data, but must be able to turn itself into a String and parse it's data back out
- * of that String at a later date.
- *
- * @author Tim Fennell
- */
-public interface Header extends Serializable {
- /** Converts the header to a String for persisting to a file. */
- public String toString();
-
- /** Parses the data contained in the String version of the header. */
- public void parse(String in);
-
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/MetricBase.java b/src/main/java/htsjdk/samtools/metrics/MetricBase.java
deleted file mode 100644
index 119a479..0000000
--- a/src/main/java/htsjdk/samtools/metrics/MetricBase.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.FormatUtil;
-
-import java.lang.reflect.Field;
-
-/**
- * A base class from which all Metric classes should inherit.
- *
- * @author Tim Fennell
- */
-public class MetricBase {
- /**
- * An equals method that checks equality by asserting that the classes are of the exact
- * same type and that all public fields are equivalent. Equivalence is checked by formatting
- * the field as it would be written to disk and then checking String equality.
- *
- * @param o an instance to compare to
- * @return true if they are equal, false otherwise
- */
- public boolean equals(final Object o) {
- if (o == null) return false;
- if (o.getClass() != getClass()) return false;
-
- final FormatUtil formatter = new FormatUtil();
- // Loop through all the fields and check that they are either
- // null in both objects or equal in both objects
- for (final Field f : getClass().getFields()) {
- try {
- final Object lhs = f.get(this);
- final Object rhs = f.get(o);
-
- if (lhs == null) {
- if (rhs == null) {
- // keep going
- }
- else {
- return false;
- }
- }
- else {
- if (formatter.format(lhs).equals(formatter.format(rhs))) //compare based on the serialized representation
- {
- // keep going
- }
- else {
- return false;
- }
- }
- }
- catch (IllegalAccessException iae) {
- throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
- }
- }
-
- // If we got this far all the fields are equal
- return true;
- }
-
- /**
- * Computes a hashcode by formatting each field into its on disk representation
- * and summing the hashcodes of all the fields.
- */
- public int hashCode() {
- int result = 0;
- FormatUtil formatter = new FormatUtil();
- for (final Field f : getClass().getFields()) {
- try {
- Object value = f.get(this);
- value = formatter.format(value); //format the value the way it will be written to disk
- final int fieldHash = value != null ? value.hashCode() : 0;
- result = 31 * result + fieldHash;
- } catch (IllegalAccessException e) {
- throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
- }
- }
- return result;
- }
-
- /** Converts the metric class to a human readable string. */
- public String toString() {
- final StringBuilder buffer = new StringBuilder();
- final FormatUtil formatter = new FormatUtil();
-
- for (final Field f : getClass().getFields()) {
- try {
- buffer.append(f.getName());
- buffer.append('\t');
- buffer.append(formatter.format(f.get(this)));
- buffer.append('\n');
- }
- catch (IllegalAccessException iae) {
- throw new SAMException("Could not read field " + f.getName() + " from a " + getClass().getSimpleName());
- }
- }
-
- return buffer.toString();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/MetricsFile.java b/src/main/java/htsjdk/samtools/metrics/MetricsFile.java
deleted file mode 100644
index ac0628a..0000000
--- a/src/main/java/htsjdk/samtools/metrics/MetricsFile.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.FormatUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.*;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Contains a set of metrics that can be written to a file and parsed back
- * again. The set of metrics is composed of zero or more instances of a class,
- * BEAN, that extends {@link MetricBase} (all instances must be of the same type)
- * and may optionally include one or more histograms that share the same key set.
- *
- * @author Tim Fennell
- */
-public class MetricsFile<BEAN extends MetricBase, HKEY extends Comparable> implements Serializable {
- private static final long serialVersionUID = 1L;
-
- public static final String MAJOR_HEADER_PREFIX = "## ";
- public static final String MINOR_HEADER_PREFIX = "# ";
- public static final String SEPARATOR = "\t";
- public static final String HISTO_HEADER = "## HISTOGRAM\t";
- public static final String METRIC_HEADER = "## METRICS CLASS\t";
-
- private final Set<String> columnLabels = new HashSet<>();
- private final List<Header> headers = new ArrayList<>();
- private final List<BEAN> metrics = new ArrayList<>();
- private final List<Histogram<HKEY>> histograms = new ArrayList<>();
-
- /** Adds a header to the collection of metrics. */
- public void addHeader(Header h) { this.headers.add(h); }
-
- /** Returns the list of headers. */
- public List<Header> getHeaders() { return Collections.unmodifiableList(this.headers); }
-
- /** Adds a bean to the collection of metrics. */
- public void addMetric(final BEAN bean) { this.metrics.add(bean); }
-
- /** Add multiple metric beans at once. */
- public void addAllMetrics(final Iterable<BEAN> beanz) {
- for (final BEAN bean : beanz) { this.addMetric(bean); }
- }
-
- /** Returns the list of headers. */
- public List<BEAN> getMetrics() { return Collections.unmodifiableList(this.metrics); }
-
- public Set<String> getMetricsColumnLabels() { return Collections.unmodifiableSet(this.columnLabels); }
-
- /** Returns the histogram contained in the metrics file if any. */
- public Histogram<HKEY> getHistogram() {
- if (!histograms.isEmpty()) return this.histograms.get(0);
- else return null;
- }
-
- /** Sets the histogram contained in the metrics file. */
- public void setHistogram(final Histogram<HKEY> histogram) {
- if (this.histograms.isEmpty()) {
- if (histogram != null) this.histograms.add(histogram);
- }
- else {
- this.histograms.set(0, histogram);
- }
- }
-
- /** Adds a histogram to the list of histograms in the metrics file. */
- public void addHistogram(final Histogram<HKEY> histogram) {
- this.histograms.add(histogram);
- }
-
- //** Returns an unmodifiable version of the histogram list */
- public List<Histogram<HKEY>> getAllHistograms() {
- return Collections.unmodifiableList(histograms);
- }
-
- /** Returns the number of histograms added to the metrics file. */
- public int getNumHistograms()
- {
- return this.histograms.size();
- }
-
- /** Returns the list of headers with the specified type. */
- public List<Header> getHeaders(final Class<? extends Header> type) {
- List<Header> tmp = new ArrayList<Header>();
- for (final Header h : this.headers) {
- if (h.getClass().equals(type)) {
- tmp.add(h);
- }
- }
-
- return tmp;
- }
-
- /**
- * Writes out the metrics file to the supplied file. The file is written out
- * headers first, metrics second and histogram third.
- *
- * @param f a File into which to write the metrics
- */
- public void write(final File f) {
- FileWriter w = null;
- try {
- w = new FileWriter(f);
- write(w);
- }
- catch (IOException ioe) {
- throw new SAMException("Could not write metrics to file: " + f.getAbsolutePath(), ioe);
- }
- finally {
- if (w != null) {
- try {
- w.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- /**
- * Writes out the metrics file to the supplied writer. The file is written out
- * headers first, metrics second and histogram third.
- *
- * @param w a Writer into which to write the metrics
- */
- public void write(final Writer w) {
- try {
- final FormatUtil formatter = new FormatUtil();
- final BufferedWriter out = new BufferedWriter(w);
- printHeaders(out);
- out.newLine();
-
- printBeanMetrics(out, formatter);
- out.newLine();
-
- printHistogram(out, formatter);
- out.newLine();
- out.flush();
- }
- catch (IOException ioe) {
- throw new SAMException("Could not write metrics file.", ioe);
- }
- }
-
- /** Prints the headers into the provided PrintWriter. */
- private void printHeaders(final BufferedWriter out) throws IOException {
- for (final Header h : this.headers) {
- out.append(MAJOR_HEADER_PREFIX);
- out.append(h.getClass().getName());
- out.newLine();
- out.append(MINOR_HEADER_PREFIX);
- out.append(h.toString());
- out.newLine();
- }
- }
-
- /** Prints each of the metrics entries into the provided PrintWriter. */
- private void printBeanMetrics(final BufferedWriter out, final FormatUtil formatter) throws IOException {
- if (this.metrics.isEmpty()) {
- return;
- }
-
- // Write out a header row with the type of the metric class
- out.append(METRIC_HEADER + getBeanType().getName());
- out.newLine();
-
- // Write out the column headers
- final Field[] fields = getBeanType().getFields();
- final int fieldCount = fields.length;
-
- // Write out the column headers
- for (int i=0; i<fieldCount; ++i) {
- out.append(fields[i].getName());
- if (i < fieldCount - 1) {
- out.append(MetricsFile.SEPARATOR);
- }
- else {
- out.newLine();
- }
- }
-
- // Write out each of the data rows
- for (final BEAN bean : this.metrics) {
- for (int i=0; i<fieldCount; ++i) {
- try {
- final Object value = fields[i].get(bean);
- out.append(StringUtil.assertCharactersNotInString(formatter.format(value), '\t', '\n'));
-
- if (i < fieldCount - 1) {
- out.append(MetricsFile.SEPARATOR);
- }
- else {
- out.newLine();
- }
- }
- catch (IllegalAccessException iae) {
- throw new SAMException("Could not read property " + fields[i].getName()
- + " from class of type " + bean.getClass());
- }
- }
- }
-
- out.flush();
- }
-
- /** Prints the histogram if one is present. */
- private void printHistogram(final BufferedWriter out, final FormatUtil formatter) throws IOException {
- final List<Histogram<HKEY>> nonEmptyHistograms = new ArrayList<Histogram<HKEY>>();
- for (final Histogram<HKEY> histo : this.histograms) {
- if (!histo.isEmpty()) nonEmptyHistograms.add(histo);
- }
-
- if (nonEmptyHistograms.isEmpty()) {
- return;
- }
-
- // Build a combined key set. Assume comparator is the same for all Histograms
- final java.util.Set<HKEY> keys = new TreeSet<HKEY>(nonEmptyHistograms.get(0).comparator());
- for (final Histogram<HKEY> histo : nonEmptyHistograms) {
- if (histo != null) keys.addAll(histo.keySet());
- }
-
- // Add a header for the histogram key type
- out.append(HISTO_HEADER + nonEmptyHistograms.get(0).keySet().iterator().next().getClass().getName());
- out.newLine();
-
- // Output a header row
- out.append(StringUtil.assertCharactersNotInString(nonEmptyHistograms.get(0).getBinLabel(), '\t', '\n'));
- for (final Histogram<HKEY> histo : nonEmptyHistograms) {
- out.append(SEPARATOR);
- out.append(StringUtil.assertCharactersNotInString(histo.getValueLabel(), '\t', '\n'));
- }
- out.newLine();
-
- for (final HKEY key : keys) {
- out.append(key.toString());
-
- for (final Histogram<HKEY> histo : nonEmptyHistograms) {
- final Histogram.Bin<HKEY> bin = histo.get(key);
- final double value = (bin == null ? 0 : bin.getValue());
-
- out.append(SEPARATOR);
- out.append(formatter.format(value));
- }
-
- out.newLine();
- }
- }
-
- /** Gets the type of the metrics bean being used. */
- private Class<?> getBeanType() {
- if (this.metrics.isEmpty()) {
- return null;
- } else {
- return this.metrics.get(0).getClass();
- }
- }
-
- /** Reads the Metrics in from the given reader. */
- public void read(final Reader r) {
- final BufferedReader in = new BufferedReader(r);
- final FormatUtil formatter = new FormatUtil();
- String line = null;
-
- try {
- // First read the headers
- Header header = null;
- while ((line = in.readLine()) != null) {
- line = line.trim();
- if ("".equals(line)) {
- // Do nothing! Nothing to be done!
- }
- else if (line.startsWith(METRIC_HEADER) || line.startsWith(HISTO_HEADER)) {
- // A line that starts with "## METRICS CLASS" heralds the start of the actual
- // data. Bounce our butts out of header parsing without reading the next line.
- // This isn't in the while loop's conditional because we want to trim() first.
- break;
- }
- else if (line.startsWith(MAJOR_HEADER_PREFIX)) {
- if (header != null) {
- throw new IllegalStateException("Consecutive header class lines encountered.");
- }
-
- final String className = line.substring(MAJOR_HEADER_PREFIX.length()).trim();
- try {
- header = (Header) loadClass(className, true).newInstance();
- }
- catch (final Exception e) {
- throw new SAMException("Error load and/or instantiating an instance of " + className, e);
- }
- }
- else if (line.startsWith(MINOR_HEADER_PREFIX)) {
- if (header == null) {
- throw new IllegalStateException("Header class must precede header value:" + line);
- }
- header.parse(line.substring(MINOR_HEADER_PREFIX.length()));
- this.headers.add(header);
- header = null;
- }
- else {
- throw new SAMException("Illegal state. Found following string in metrics file header: " + line);
- }
- }
-
- // Read space between headers and metrics, if any
- while (line != null && ! line.trim().startsWith(MAJOR_HEADER_PREFIX)) {
- line = in.readLine();
- }
-
-
- if (line != null) {
- line = line.trim();
-
- // Then read the metrics if there are any
- if (line.startsWith(METRIC_HEADER)) {
- // Get the metric class from the header
- final String className = line.split(SEPARATOR)[1];
- Class<?> type = null;
- try {
- type = loadClass(className, true);
- }
- catch (final ClassNotFoundException cnfe) {
- throw new SAMException("Could not locate class with name " + className, cnfe);
- }
-
- // Read the next line with the column headers
- final String[] fieldNames = in.readLine().split(SEPARATOR);
- Collections.addAll(columnLabels, fieldNames);
- final Field[] fields = new Field[fieldNames.length];
- for (int i=0; i<fieldNames.length; ++i) {
- try {
- fields[i] = type.getField(fieldNames[i]);
- }
- catch (final Exception e) {
- throw new SAMException("Could not get field with name " + fieldNames[i] +
- " from class " + type.getName());
- }
- }
-
- // Now read the values
- while ((line = in.readLine()) != null) {
- if ("".equals(line.trim())) {
- break;
- }
- else {
- final String[] values = line.split(SEPARATOR, -1);
- BEAN bean = null;
-
- try { bean = (BEAN) type.newInstance(); }
- catch (final Exception e) { throw new SAMException("Error instantiating a " + type.getName(), e); }
-
- for (int i=0; i<fields.length; ++i) {
- Object value = null;
- if (values[i] != null && !values[i].isEmpty()) {
- value = formatter.parseObject(values[i], fields[i].getType());
- }
-
- try { fields[i].set(bean, value); }
- catch (final Exception e) {
- throw new SAMException("Error setting field " + fields[i].getName() +
- " on class of type " + type.getName(), e);
- }
- }
-
- this.metrics.add(bean);
- }
- }
- }
- }
-
- // Read away any blank lines between metrics and histograms
- while (line != null && ! line.trim().startsWith(MAJOR_HEADER_PREFIX)) {
- line = in.readLine();
- }
-
- // Then read the histograms if any are present
- if (line != null) {
- line = line.trim();
-
- if (line.startsWith(HISTO_HEADER)) {
- // Get the key type of the histogram
- final String keyClassName = line.split(SEPARATOR)[1].trim();
- Class<?> keyClass = null;
-
- try { keyClass = loadClass(keyClassName, true); }
- catch (final ClassNotFoundException cnfe) { throw new SAMException("Could not load class with name " + keyClassName); }
-
- // Read the next line with the bin and value labels
- final String[] labels = in.readLine().split(SEPARATOR);
- for (int i=1; i<labels.length; ++i) {
- this.histograms.add(new Histogram<HKEY>(labels[0], labels[i]));
- }
-
- // Read the entries in the histograms
- while ((line = in.readLine()) != null && !"".equals(line)) {
- final String[] fields = line.trim().split(SEPARATOR);
- final HKEY key = (HKEY) formatter.parseObject(fields[0], keyClass);
-
- for (int i=1; i<fields.length; ++i) {
- final double value = formatter.parseDouble(fields[i]);
- this.histograms.get(i-1).increment(key, value);
- }
- }
- }
- }
- }
- catch (final IOException ioe) {
- throw new SAMException("Could not read metrics from reader.", ioe);
- }
- finally{
- CloserUtil.close(in);
- }
- }
-
- /** Attempts to load a class, taking into account that some classes have "migrated" from the broad to sf. */
- private Class<?> loadClass(final String className, final boolean tryOtherPackages) throws ClassNotFoundException {
- // List of alternative packages to check in case classes moved around
- final String[] packages = new String[] {
- "edu.mit.broad.picard.genotype.concordance",
- "edu.mit.broad.picard.genotype.fingerprint",
- "edu.mit.broad.picard.ic",
- "edu.mit.broad.picard.illumina",
- "edu.mit.broad.picard.jumping",
- "edu.mit.broad.picard.quality",
- "edu.mit.broad.picard.samplevalidation",
- "htsjdk.samtools.analysis",
- "htsjdk.samtools.analysis.directed",
- "htsjdk.samtools.sam",
- "htsjdk.samtools.metrics",
- "picard.sam",
- "picard.metrics",
- "picard.illumina",
- "picard.analysis",
- "picard.analysis.directed",
- "picard.vcf"
- };
-
- try { return Class.forName(className); }
- catch (ClassNotFoundException cnfe) {
- if (tryOtherPackages) {
- for (final String p : packages) {
- try {
- return loadClass(p + className.substring(className.lastIndexOf('.')), false);
- }
- catch (ClassNotFoundException cnf2) {/* do nothing */}
- // If it ws an inner class, try and see if it's a stand-alone class now
- if (className.indexOf('$') > -1) {
- try {
- return loadClass(p + "." + className.substring(className.lastIndexOf('$') + 1), false);
- }
- catch (ClassNotFoundException cnf2) {/* do nothing */}
- }
- }
- }
-
- throw cnfe;
- }
- }
-
- /** Checks that the headers, metrics and histogram are all equal. */
- @Override
- public boolean equals(final Object o) {
- if (o == null) {
- return false;
- }
- if (getClass() != o.getClass()) {
- return false;
- }
- final MetricsFile that = (MetricsFile) o;
-
- if (!areHeadersEqual(that)) {
- return false;
- }
- if (!areMetricsEqual(that)) {
- return false;
- }
- if (!areHistogramsEqual(that)) {
- return false;
- }
-
- return true;
- }
-
- public boolean areHeadersEqual(final MetricsFile that) {
- return this.headers.equals(that.headers);
- }
-
- public boolean areMetricsEqual(final MetricsFile that) {
- return this.metrics.equals(that.metrics);
- }
-
- public boolean areHistogramsEqual(final MetricsFile that) {
- return this.histograms.equals(that.histograms);
- }
-
- @Override
- public int hashCode() {
- int result = headers.hashCode();
- result = 31 * result + metrics.hashCode();
- return result;
- }
-
- /**
- * Convenience method to read all the Metric beans from a metrics file.
- * @param file to be read.
- * @return list of beans from the file.
- */
- public static <T extends MetricBase> List<T> readBeans(final File file) {
- final MetricsFile<T, ?> metricsFile = new MetricsFile<>();
- final Reader in = IOUtil.openFileForBufferedReading(file);
- metricsFile.read(in);
- CloserUtil.close(in);
- return metricsFile.getMetrics();
- }
-
- /**
- * Method to read the header from a metrics file.
- */
- public static List<Header> readHeaders(final File file) {
- try {
- final MetricsFile<MetricBase, ?> metricsFile = new MetricsFile<>();
- metricsFile.read(new FileReader(file));
- return metricsFile.getHeaders();
- } catch (FileNotFoundException e) {
- throw new SAMException(e.getMessage(), e);
- }
- }
-
- /**
- * Compare the metrics in two files, ignoring headers and histograms.
- */
- public static boolean areMetricsEqual(final File file1, final File file2) {
- try {
- final MetricsFile<MetricBase, ?> mf1 = new MetricsFile<>();
- final MetricsFile<MetricBase, ?> mf2 = new MetricsFile<>();
- mf1.read(new FileReader(file1));
- mf2.read(new FileReader(file2));
- return mf1.areMetricsEqual(mf2);
- } catch (FileNotFoundException e) {
- throw new SAMException(e.getMessage(), e);
- }
-
- }
-
- /**
- * Compare the metrics and histograms in two files, ignoring headers.
- */
- public static boolean areMetricsAndHistogramsEqual(final File file1, final File file2) {
- try {
- final MetricsFile<MetricBase, ?> mf1 = new MetricsFile<>();
- final MetricsFile<MetricBase, ?> mf2 = new MetricsFile<>();
- mf1.read(new FileReader(file1));
- mf2.read(new FileReader(file2));
-
- return mf1.areMetricsEqual(mf2) && mf1.areHistogramsEqual(mf2);
-
- } catch (FileNotFoundException e) {
- throw new SAMException(e.getMessage(), e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/StringHeader.java b/src/main/java/htsjdk/samtools/metrics/StringHeader.java
deleted file mode 100644
index ced1595..0000000
--- a/src/main/java/htsjdk/samtools/metrics/StringHeader.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * A simple header who's data type is a single String. Should not be used for anything other
- * than comments or descriptive text.
- *
- * @author Tim Fennell
- */
-public class StringHeader implements Header {
- private String value;
-
- /** Default constructor. */
- public StringHeader() {}
-
- /** Constructor that uses the supplied value as the value of the header. */
- public StringHeader(String value) {
- setValue(value);
- }
-
- public void parse(String in) { value = in.trim(); }
- public String toString() { return value; }
-
- public String getValue() { return value; }
- public void setValue(String value) { this.value = StringUtil.assertCharactersNotInString(value, '\n'); }
-
- /** Checks equality on the value of the header. */
- public boolean equals(Object o) {
- if (o != null && o instanceof StringHeader) {
- StringHeader that = (StringHeader) o;
- if (this.value == null) {
- return that.value == null;
- }
- else {
- return this.value.equals(that.value);
- }
- }
- else {
- return false;
- }
- }
-
- @Override
- public int hashCode() {
- return value != null ? value.hashCode() : 0;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/metrics/VersionHeader.java b/src/main/java/htsjdk/samtools/metrics/VersionHeader.java
deleted file mode 100644
index ae08455..0000000
--- a/src/main/java/htsjdk/samtools/metrics/VersionHeader.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Header that stores information about the version of some piece of software or
- * data used to create the metrics file. Payload consists of a name or description
- * of the versioned item and a version string.
- *
- * @author Tim Fennell
- */
-public class VersionHeader implements Header {
- private String versionedItem;
- private String versionString;
-
- public void parse(String in) {
- String[] fields = in.split("\t");
- this.versionedItem = fields[0];
- this.versionString = fields[1];
- }
-
- public String toString() {
- return this.versionedItem + "\t" + this.versionString;
- }
-
- public String getVersionedItem() { return versionedItem; }
- public void setVersionedItem(String versionedItem) {
- this.versionedItem = StringUtil.assertCharactersNotInString(versionedItem, '\t', '\n');
- }
-
- public String getVersionString() { return versionString; }
- public void setVersionString(String versionString) {
- this.versionString = StringUtil.assertCharactersNotInString(versionString, '\t', '\n');
- }
-
- /** Equals method that checks that both the item and version string are equal. */
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- VersionHeader that = (VersionHeader) o;
-
- if (versionString != null ? !versionString.equals(that.versionString) : that.versionString != null)
- return false;
- if (versionedItem != null ? !versionedItem.equals(that.versionedItem) : that.versionedItem != null)
- return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = versionedItem != null ? versionedItem.hashCode() : 0;
- result = 31 * result + (versionString != null ? versionString.hashCode() : 0);
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java
deleted file mode 100644
index 86f11fe..0000000
--- a/src/main/java/htsjdk/samtools/reference/AbstractFastaSequenceFile.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/**
- * Provide core sequence dictionary functionality required by all fasta file readers.
- * @author Matt Hanna
- */
-abstract class AbstractFastaSequenceFile implements ReferenceSequenceFile {
- private final Path path;
- protected SAMSequenceDictionary sequenceDictionary;
-
- /**
- * Finds and loads the sequence file dictionary.
- * @param file Fasta file to read. Also acts as a prefix for supporting files.
- */
- AbstractFastaSequenceFile(final File file) {
- this(file == null ? null : file.toPath());
- }
-
- /**
- * Finds and loads the sequence file dictionary.
- * @param path Fasta file to read. Also acts as a prefix for supporting files.
- */
- AbstractFastaSequenceFile(final Path path) {
- this.path = path;
- final Path dictionary = findSequenceDictionary(path);
-
- if (dictionary != null) {
- IOUtil.assertFileIsReadable(dictionary);
-
- try {
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- final BufferedLineReader reader = new BufferedLineReader(Files.newInputStream(dictionary));
- final SAMFileHeader header = codec.decode(reader,
- dictionary.toString());
- if (header.getSequenceDictionary() != null && !header.getSequenceDictionary().isEmpty()) {
- this.sequenceDictionary = header.getSequenceDictionary();
- }
- reader.close();
- }
- catch (Exception e) {
- throw new SAMException("Could not open sequence dictionary file: " + dictionary, e);
- }
- }
- }
-
- protected static File findSequenceDictionary(final File file) {
- if (file == null) {
- return null;
- }
- Path dictionary = findSequenceDictionary(file.toPath());
- if (dictionary == null) {
- return null;
- }
- return dictionary.toFile();
- }
-
- protected static Path findSequenceDictionary(final Path path) {
- if (path == null) {
- return null;
- }
- // Try and locate the dictionary
- Path dictionary = path.toAbsolutePath();
- Path dictionaryExt = path.toAbsolutePath();
- boolean fileTypeSupported = false;
- for (final String extension : ReferenceSequenceFileFactory.FASTA_EXTENSIONS) {
- String filename = dictionary.getFileName().toString();
- if (filename.endsWith(extension)) {
- dictionaryExt = dictionary.resolveSibling(filename + IOUtil
- .DICT_FILE_EXTENSION);
- String filenameNoExt = filename.substring(0, filename.lastIndexOf(extension));
- dictionary = dictionary.resolveSibling(filenameNoExt+ IOUtil.DICT_FILE_EXTENSION);
- fileTypeSupported = true;
- break;
- }
- }
- if (!fileTypeSupported)
- throw new IllegalArgumentException("File is not a supported reference file type: " + path.toAbsolutePath());
-
- if (Files.exists(dictionary))
- return dictionary;
- // try without removing the file extension
- if (Files.exists(dictionaryExt))
- return dictionaryExt;
- else return null;
- }
-
- /** Returns the path to the reference file. */
- protected Path getPath() {
- return path;
- }
-
- /**
- * Returns the list of sequence records associated with the reference sequence if found
- * otherwise null.
- */
- public SAMSequenceDictionary getSequenceDictionary() {
- return this.sequenceDictionary;
- }
-
- /** Returns the full path to the reference file. */
- protected String getAbsolutePath() {
- return path.toAbsolutePath().toString();
- }
-
- /** Returns the full path to the reference file. */
- public String toString() {
- return getAbsolutePath();
- }
-
- /** default implementation -- override if index is supported */
- public boolean isIndexed() {return false;}
-
- /** default implementation -- override if index is supported */
- public ReferenceSequence getSequence( String contig ) {
- throw new UnsupportedOperationException();
- }
-
- /** default implementation -- override if index is supported */
- public ReferenceSequence getSubsequenceAt( String contig, long start, long stop ) {
- throw new UnsupportedOperationException("Index does not appear to exist for " + getAbsolutePath() + ". samtools faidx can be used to create an index");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java
deleted file mode 100644
index 72c0583..0000000
--- a/src/main/java/htsjdk/samtools/reference/FastaSequenceFile.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.FastLineReader;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.StringUtil;
-
-import java.io.File;
-import java.nio.file.Path;
-
-/**
- * Implementation of ReferenceSequenceFile for reading from FASTA files.
- *
- * @author Tim Fennell
- */
-public class FastaSequenceFile extends AbstractFastaSequenceFile {
-
- private final boolean truncateNamesAtWhitespace;
- private FastLineReader in;
- private int sequenceIndex = -1;
- private final byte[] basesBuffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
-
-
- /** Constructs a FastaSequenceFile that reads from the specified file. */
- public FastaSequenceFile(final File file, final boolean truncateNamesAtWhitespace) {
- this(file == null ? null : file.toPath(), truncateNamesAtWhitespace);
- }
-
- /** Constructs a FastaSequenceFile that reads from the specified file. */
- public FastaSequenceFile(final Path path, final boolean truncateNamesAtWhitespace) {
- super(path);
- this.truncateNamesAtWhitespace = truncateNamesAtWhitespace;
- this.in = new FastLineReader(IOUtil.openFileForReading(path));
- }
-
- /**
- * It's good to call this to free up memory.
- */
- public void close() {
- in.close();
- }
-
- public ReferenceSequence nextSequence() {
- this.sequenceIndex += 1;
-
- // Read the header line
- final String name = readSequenceName();
- if (name == null) {
- close();
- return null;
- }
-
- // Read the sequence
- final int knownLength = (this.sequenceDictionary == null) ? -1 : this.sequenceDictionary.getSequence(this.sequenceIndex).getSequenceLength();
- final byte[] bases = readSequence(knownLength);
-
- return new ReferenceSequence(name, this.sequenceIndex, bases);
- }
-
- public void reset() {
- this.sequenceIndex = -1;
- this.in.close();
- this.in = new FastLineReader(IOUtil.openFileForReading(getPath()));
-
- }
-
- private String readSequenceName() {
- in.skipNewlines();
- if (in.eof()) {
- return null;
- }
- final byte b = in.getByte();
- if (b != '>') {
- throw new SAMException("Format exception reading FASTA " + getAbsolutePath() + ". Expected > but saw chr(" +
- b + ") at start of sequence with index " + this.sequenceIndex);
- }
- final byte[] nameBuffer = new byte[4096];
- int nameLength = 0;
- do {
- if (in.eof()) {
- break;
- }
- nameLength += in.readToEndOfOutputBufferOrEoln(nameBuffer, nameLength);
- if (nameLength == nameBuffer.length && !in.atEoln()) {
- throw new SAMException("Sequence name too long in FASTA " + getAbsolutePath());
- }
- } while (!in.atEoln());
- if (nameLength == 0) {
- throw new SAMException("Missing sequence name in FASTA " + getAbsolutePath());
- }
- String name = StringUtil.bytesToString(nameBuffer, 0, nameLength).trim();
- if (truncateNamesAtWhitespace) {
- name = SAMSequenceRecord.truncateSequenceName(name);
- }
- return name;
- }
-
- /**
- * Read bases from input
- * @param knownLength For performance:: -1 if length is not known, otherwise the length of the sequence.
- * @return ASCII bases for sequence
- */
- private byte[] readSequence(final int knownLength) {
- byte[] bases = (knownLength == -1) ? basesBuffer : new byte[knownLength] ;
-
- int sequenceLength = 0;
- while (!in.eof()) {
- final boolean sawEoln = in.skipNewlines();
- if (in.eof()) {
- break;
- }
- if (sawEoln && in.peekByte() == '>') {
- break;
- }
- sequenceLength += in.readToEndOfOutputBufferOrEoln(bases, sequenceLength);
- while (sequenceLength > 0 && Character.isWhitespace(StringUtil.byteToChar(bases[sequenceLength - 1]))) {
- --sequenceLength;
- }
- if (sequenceLength == knownLength) {
- // When length is known, make sure there is no trailing whitespace that hasn't been traversed.
- skipToEoln();
- break;
- }
- if (sequenceLength == bases.length) {
- final byte[] tmp = new byte[bases.length * 2];
- System.arraycopy(bases, 0, tmp, 0, sequenceLength);
- bases = tmp;
- }
- }
-
- // And lastly resize the array down to the right size
- if (sequenceLength != bases.length || bases == basesBuffer) {
- final byte[] tmp = new byte[sequenceLength];
- System.arraycopy(bases, 0, tmp, 0, sequenceLength);
- bases = tmp;
- }
- return bases;
- }
-
- private void skipToEoln() {
- byte[] ignoreBuffer = new byte[1024];
- while (!in.eof() && !in.atEoln()) {
- in.readToEndOfOutputBufferOrEoln(ignoreBuffer, 0);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java b/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java
deleted file mode 100644
index e314fcc..0000000
--- a/src/main/java/htsjdk/samtools/reference/FastaSequenceIndex.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.regex.MatchResult;
-
-/**
- * Reads a fasta index file (.fai), as generated by `samtools faidx`.
- */
-public class FastaSequenceIndex implements Iterable<FastaSequenceIndexEntry> {
- /**
- * Store the entries. Use a LinkedHashMap for consistent iteration in insertion order.
- */
- private final Map<String,FastaSequenceIndexEntry> sequenceEntries = new LinkedHashMap<String,FastaSequenceIndexEntry>();
-
- /**
- * Build a sequence index from the specified file.
- * @param indexFile File to open.
- * @throws FileNotFoundException if the index file cannot be found.
- */
- public FastaSequenceIndex( File indexFile ) {
- this(indexFile == null ? null : indexFile.toPath());
- }
-
- /**
- * Build a sequence index from the specified file.
- * @param indexFile File to open.
- * @throws FileNotFoundException if the index file cannot be found.
- */
- public FastaSequenceIndex( Path indexFile ) {
- IOUtil.assertFileIsReadable(indexFile);
- parseIndexFile(indexFile);
- }
-
- /**
- * Empty, protected constructor for unit testing.
- */
- protected FastaSequenceIndex() {}
-
- /**
- * Add a new index entry to the list. Protected for unit testing.
- * @param indexEntry New index entry to add.
- */
- protected void add(FastaSequenceIndexEntry indexEntry) {
- final FastaSequenceIndexEntry ret = sequenceEntries.put(indexEntry.getContig(),indexEntry);
- if (ret != null) {
- throw new SAMException("Contig '" + indexEntry.getContig() + "' already exists in fasta index.");
- }
- }
-
- /**
- * Renames the existing index entry to the new index entry with the specified name.
- * @param entry entry to update.
- * @param newName New name for the index entry.
- */
- protected void rename(FastaSequenceIndexEntry entry,String newName) {
- sequenceEntries.remove(entry.getContig());
- entry.setContig(newName);
- add(entry);
- }
-
- /**
- * Compare two FastaSequenceIndex objects for equality.
- * @param other Another FastaSequenceIndex to compare
- * @return True if index has the same entries as other instance, in the same order
- */
- public boolean equals(Object other) {
- if(!(other instanceof FastaSequenceIndex))
- return false;
-
- if (this == other) return true;
-
- FastaSequenceIndex otherIndex = (FastaSequenceIndex)other;
- if(this.size() != otherIndex.size())
- return false;
-
- Iterator<FastaSequenceIndexEntry> iter = this.iterator();
- Iterator<FastaSequenceIndexEntry> otherIter = otherIndex.iterator();
- while (iter.hasNext()) {
- if (!otherIter.hasNext())
- return false;
- if (!iter.next().equals(otherIter.next()))
- return false;
- }
- return true;
- }
-
- /**
- * Parse the contents of an index file, caching the results internally.
- * @param indexFile File to parse.
- * @throws IOException Thrown if file could not be opened.
- */
- private void parseIndexFile(Path indexFile) {
- try {
- Scanner scanner = new Scanner(indexFile);
- int sequenceIndex = 0;
- while( scanner.hasNext() ) {
- // Tokenize and validate the index line.
- String result = scanner.findInLine("(.+)\\t+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
- if( result == null )
- throw new SAMException("Found invalid line in index file:" + scanner.nextLine());
- MatchResult tokens = scanner.match();
- if( tokens.groupCount() != 5 )
- throw new SAMException("Found invalid line in index file:" + scanner.nextLine());
-
- // Skip past the line separator
- scanner.nextLine();
-
- // Parse the index line.
- String contig = tokens.group(1);
- long size = Long.valueOf(tokens.group(2));
- long location = Long.valueOf(tokens.group(3));
- int basesPerLine = Integer.valueOf(tokens.group(4));
- int bytesPerLine = Integer.valueOf(tokens.group(5));
-
- contig = SAMSequenceRecord.truncateSequenceName(contig);
- // Build sequence structure
- add(new FastaSequenceIndexEntry(contig,location,size,basesPerLine,bytesPerLine, sequenceIndex++) );
- }
- scanner.close();
- } catch (IOException e) {
- throw new SAMException("Fasta index file could not be opened: " + indexFile, e);
-
- }
- }
-
- /**
- * Does the given contig name have a corresponding entry?
- * @param contigName The contig name for which to search.
- * @return True if contig name is present; false otherwise.
- */
- public boolean hasIndexEntry( String contigName ) {
- return sequenceEntries.containsKey(contigName);
- }
-
- /**
- * Retrieve the index entry associated with the given contig.
- * @param contigName Name of the contig for which to search.
- * @return Index entry associated with the given contig.
- * @throws SAMException if the associated index entry can't be found.
- */
- public FastaSequenceIndexEntry getIndexEntry( String contigName ) {
- if( !hasIndexEntry(contigName) )
- throw new SAMException("Unable to find entry for contig: " + contigName);
-
- return sequenceEntries.get(contigName);
- }
-
- /**
- * Creates an iterator which can iterate through all entries in a fasta index.
- * @return iterator over all fasta index entries.
- */
- public Iterator<FastaSequenceIndexEntry> iterator() {
- return sequenceEntries.values().iterator();
- }
-
- /**
- * Returns the number of elements in the index.
- * @return Number of elements in the index.
- */
- public int size() {
- return sequenceEntries.size();
- }
-}
-
-/**
- * Hold an individual entry in a fasta sequence index file.
- */
-class FastaSequenceIndexEntry {
- private String contig;
- private long location;
- private long size;
- private int basesPerLine;
- private int bytesPerLine;
- private final int sequenceIndex;
-
- /**
- * Create a new entry with the given parameters.
- * @param contig Contig this entry represents.
- * @param location Location (byte coordinate) in the fasta file.
- * @param size The number of bases in the contig.
- * @param basesPerLine How many bases are on each line.
- * @param bytesPerLine How many bytes are on each line (includes newline characters).
- */
- public FastaSequenceIndexEntry( String contig,
- long location,
- long size,
- int basesPerLine,
- int bytesPerLine,
- int sequenceIndex) {
- this.contig = contig;
- this.location = location;
- this.size = size;
- this.basesPerLine = basesPerLine;
- this.bytesPerLine = bytesPerLine;
- this.sequenceIndex = sequenceIndex;
- }
-
- /**
- * Gets the contig associated with this entry.
- * @return String representation of the contig.
- */
- public String getContig() {
- return contig;
- }
-
- /**
- * Sometimes contigs need to be adjusted on-the-fly to
- * match sequence dictionary entries. Provide that capability
- * to other classes w/i the package.
- * @param contig New value for the contig.
- */
- protected void setContig(String contig) {
- this.contig = contig;
- }
-
- /**
- * Gets the location of this contig within the fasta.
- * @return seek position within the fasta.
- */
- public long getLocation() {
- return location;
- }
-
- /**
- * Gets the size, in bytes, of the data in the contig.
- * @return size of the contig bases in bytes.
- */
- public long getSize() {
- return size;
- }
-
- /**
- * Gets the number of bases in a given line.
- * @return Number of bases in the fasta line.
- */
- public int getBasesPerLine() {
- return basesPerLine;
- }
-
- /**
- * How many bytes (bases + whitespace) are consumed by the
- * given line?
- * @return Number of bytes in a line.
- */
- public int getBytesPerLine() {
- return bytesPerLine;
- }
-
- public int getSequenceIndex() {
- return sequenceIndex;
- }
-
- /**
- * For debugging. Emit the contents of each contig line.
- * @return A string representation of the contig line.
- */
- public String toString() {
- return String.format("contig %s; location %d; size %d; basesPerLine %d; bytesPerLine %d", contig,
- location,
- size,
- basesPerLine,
- bytesPerLine );
- }
-
- /**
- * Compare this index entry to another index entry.
- * @param other another FastaSequenceIndexEntry
- * @return True if each has the same name, location, size, basesPerLine and bytesPerLine
- */
- public boolean equals(Object other) {
- if(!(other instanceof FastaSequenceIndexEntry))
- return false;
-
- if (this == other) return true;
-
- FastaSequenceIndexEntry otherEntry = (FastaSequenceIndexEntry)other;
- return (contig.equals(otherEntry.contig) && size == otherEntry.size && location == otherEntry.location
- && basesPerLine == otherEntry.basesPerLine && bytesPerLine == otherEntry.bytesPerLine);
- }
-
- /**
- * In general, we expect one entry per contig, so compute the hash based only on the contig.
- * @return A unique hash code representing this object.
- */
- public int hashCode() {
- return contig.hashCode();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java b/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java
deleted file mode 100644
index 60cc3b1..0000000
--- a/src/main/java/htsjdk/samtools/reference/IndexedFastaSequenceFile.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Iterator;
-
-/**
- * A fasta file driven by an index for fast, concurrent lookups. Supports two interfaces:
- * the ReferenceSequenceFile for old-style, stateful lookups and a direct getter.
- */
-public class IndexedFastaSequenceFile extends AbstractFastaSequenceFile implements Closeable {
- /**
- * The interface facilitating direct access to the fasta.
- */
- private final SeekableByteChannel channel;
-
- /**
- * A representation of the sequence index, stored alongside the fasta in a .fasta.fai file.
- */
- private final FastaSequenceIndex index;
-
- /**
- * An iterator into the fasta index, for traversing iteratively across the fasta.
- */
- private Iterator<FastaSequenceIndexEntry> indexIterator;
-
- /**
- * Open the given indexed fasta sequence file. Throw an exception if the file cannot be opened.
- * @param file The file to open.
- * @param index Pre-built FastaSequenceIndex, for the case in which one does not exist on disk.
- * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
- */
- public IndexedFastaSequenceFile(final File file, final FastaSequenceIndex index) {
- this(file == null ? null : file.toPath(), index);
- }
-
- /**
- * Open the given indexed fasta sequence file. Throw an exception if the file cannot be opened.
- * @param file The file to open.
- * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
- */
- public IndexedFastaSequenceFile(final File file) throws FileNotFoundException {
- this(file, new FastaSequenceIndex((findRequiredFastaIndexFile(file))));
- }
-
- /**
- * Open the given indexed fasta sequence file. Throw an exception if the file cannot be opened.
- * @param path The file to open.
- * @param index Pre-built FastaSequenceIndex, for the case in which one does not exist on disk.
- */
- public IndexedFastaSequenceFile(final Path path, final FastaSequenceIndex index) {
- super(path);
- if (index == null) throw new IllegalArgumentException("Null index for fasta " + path);
- this.index = index;
- IOUtil.assertFileIsReadable(path);
- try {
- this.channel = Files.newByteChannel(path);
- } catch (IOException e) {
- throw new SAMException("Fasta file should be readable but is not: " + path, e);
- }
- reset();
-
- if(getSequenceDictionary() != null)
- sanityCheckDictionaryAgainstIndex(path.toAbsolutePath().toString(),sequenceDictionary,index);
- }
-
- /**
- * Open the given indexed fasta sequence file. Throw an exception if the file cannot be opened.
- * @param path The file to open.
- * @throws FileNotFoundException If the fasta or any of its supporting files cannot be found.
- */
- public IndexedFastaSequenceFile(final Path path) throws FileNotFoundException {
- this(path, new FastaSequenceIndex((findRequiredFastaIndexFile(path))));
- }
-
- public boolean isIndexed() {return true;}
-
- private static File findFastaIndex(File fastaFile) {
- File indexFile = getFastaIndexFileName(fastaFile);
- if (!indexFile.exists()) return null;
- return indexFile;
- }
-
- private static File getFastaIndexFileName(File fastaFile) {
- return new File(fastaFile.getAbsolutePath() + ".fai");
- }
-
- private static File findRequiredFastaIndexFile(File fastaFile) throws FileNotFoundException {
- File ret = findFastaIndex(fastaFile);
- if (ret == null) throw new FileNotFoundException(getFastaIndexFileName(fastaFile) + " not found.");
- return ret;
- }
-
- public static boolean canCreateIndexedFastaReader(final File fastaFile) {
- return (fastaFile.exists() &&
- findFastaIndex(fastaFile) != null);
- }
-
- private static Path findFastaIndex(Path fastaFile) {
- Path indexFile = getFastaIndexFileName(fastaFile);
- if (!Files.exists(indexFile)) return null;
- return indexFile;
- }
-
- private static Path getFastaIndexFileName(Path fastaFile) {
- return fastaFile.resolveSibling(fastaFile.getFileName() + ".fai");
- }
-
- private static Path findRequiredFastaIndexFile(Path fastaFile) throws FileNotFoundException {
- Path ret = findFastaIndex(fastaFile);
- if (ret == null) throw new FileNotFoundException(getFastaIndexFileName(fastaFile) + " not found.");
- return ret;
- }
-
- public static boolean canCreateIndexedFastaReader(final Path fastaFile) {
- return (Files.exists(fastaFile) &&
- findFastaIndex(fastaFile) != null);
- }
-
- /**
- * Do some basic checking to make sure the dictionary and the index match.
- * @param fastaFile Used for error reporting only.
- * @param sequenceDictionary sequence dictionary to check against the index.
- * @param index index file to check against the dictionary.
- */
- protected static void sanityCheckDictionaryAgainstIndex(final String fastaFile,
- final SAMSequenceDictionary sequenceDictionary,
- final FastaSequenceIndex index) {
- // Make sure dictionary and index are the same size.
- if( sequenceDictionary.getSequences().size() != index.size() )
- throw new SAMException("Sequence dictionary and index contain different numbers of contigs");
-
- Iterator<SAMSequenceRecord> sequenceIterator = sequenceDictionary.getSequences().iterator();
- Iterator<FastaSequenceIndexEntry> indexIterator = index.iterator();
-
- while(sequenceIterator.hasNext() && indexIterator.hasNext()) {
- SAMSequenceRecord sequenceEntry = sequenceIterator.next();
- FastaSequenceIndexEntry indexEntry = indexIterator.next();
-
- if(!sequenceEntry.getSequenceName().equals(indexEntry.getContig())) {
- throw new SAMException(String.format("Mismatch between sequence dictionary fasta index for %s, sequence '%s' != '%s'.",
- fastaFile, sequenceEntry.getSequenceName(),indexEntry.getContig()));
- }
-
- // Make sure sequence length matches index length.
- if( sequenceEntry.getSequenceLength() != indexEntry.getSize())
- throw new SAMException("Index length does not match dictionary length for contig: " + sequenceEntry.getSequenceName() );
- }
- }
-
- /**
- * Retrieves the sequence dictionary for the fasta file.
- * @return sequence dictionary of the fasta.
- */
- public SAMSequenceDictionary getSequenceDictionary() {
- return sequenceDictionary;
- }
-
- /**
- * Retrieves the complete sequence described by this contig.
- * @param contig contig whose data should be returned.
- * @return The full sequence associated with this contig.
- */
- public ReferenceSequence getSequence( String contig ) {
- return getSubsequenceAt( contig, 1, (int)index.getIndexEntry(contig).getSize() );
- }
-
- /**
- * Gets the subsequence of the contig in the range [start,stop]
- * @param contig Contig whose subsequence to retrieve.
- * @param start inclusive, 1-based start of region.
- * @param stop inclusive, 1-based stop of region.
- * @return The partial reference sequence associated with this range.
- */
- public ReferenceSequence getSubsequenceAt( String contig, long start, long stop ) {
- if(start > stop + 1)
- throw new SAMException(String.format("Malformed query; start point %d lies after end point %d",start,stop));
-
- FastaSequenceIndexEntry indexEntry = index.getIndexEntry(contig);
-
- if(stop > indexEntry.getSize())
- throw new SAMException("Query asks for data past end of contig");
-
- int length = (int)(stop - start + 1);
-
- byte[] target = new byte[length];
- ByteBuffer targetBuffer = ByteBuffer.wrap(target);
-
- final int basesPerLine = indexEntry.getBasesPerLine();
- final int bytesPerLine = indexEntry.getBytesPerLine();
- final int terminatorLength = bytesPerLine - basesPerLine;
-
- long startOffset = ((start-1)/basesPerLine)*bytesPerLine + (start-1)%basesPerLine;
- // Cast to long so the second argument cannot overflow a signed integer.
- final long minBufferSize = Math.min((long) Defaults.NON_ZERO_BUFFER_SIZE, (long)(length / basesPerLine + 2) * (long)bytesPerLine);
- if (minBufferSize > Integer.MAX_VALUE) throw new SAMException("Buffer is too large: " + minBufferSize);
-
- // Allocate a buffer for reading in sequence data.
- final ByteBuffer channelBuffer = ByteBuffer.allocate((int)minBufferSize);
-
- while(targetBuffer.position() < length) {
- // If the bufferOffset is currently within the eol characters in the string, push the bufferOffset forward to the next printable character.
- startOffset += Math.max((int)(startOffset%bytesPerLine - basesPerLine + 1),0);
-
- try {
- startOffset += readFromPosition(channel, channelBuffer, indexEntry.getLocation()+startOffset);
- }
- catch(IOException ex) {
- throw new SAMException("Unable to load " + contig + "(" + start + ", " + stop + ") from " + getAbsolutePath(), ex);
- }
-
- // Reset the buffer for outbound transfers.
- channelBuffer.flip();
-
- // Calculate the size of the next run of bases based on the contents we've already retrieved.
- final int positionInContig = (int)start-1+targetBuffer.position();
- final int nextBaseSpan = Math.min(basesPerLine-positionInContig%basesPerLine,length-targetBuffer.position());
- // Cap the bytes to transfer by limiting the nextBaseSpan to the size of the channel buffer.
- int bytesToTransfer = Math.min(nextBaseSpan,channelBuffer.capacity());
-
- channelBuffer.limit(channelBuffer.position()+bytesToTransfer);
-
- while(channelBuffer.hasRemaining()) {
- targetBuffer.put(channelBuffer);
-
- bytesToTransfer = Math.min(basesPerLine,length-targetBuffer.position());
- channelBuffer.limit(Math.min(channelBuffer.position()+bytesToTransfer+terminatorLength,channelBuffer.capacity()));
- channelBuffer.position(Math.min(channelBuffer.position()+terminatorLength,channelBuffer.capacity()));
- }
-
- // Reset the buffer for inbound transfers.
- channelBuffer.flip();
- }
-
- return new ReferenceSequence( contig, indexEntry.getSequenceIndex(), target );
- }
-
- /**
- * Reads a sequence of bytes from this channel into the given buffer,
- * starting at the given file position.
- * @param channel the channel to read from
- * @param buffer the buffer into which bytes are to be transferred
- * @param position the position to start reading at
- * @return the number of bytes read
- * @throws IOException if an I/O error occurs while reading
- */
- private static int readFromPosition(final SeekableByteChannel channel, final ByteBuffer buffer, long position) throws IOException {
- if (channel instanceof FileChannel) { // special case to take advantage of native code path
- return ((FileChannel) channel).read(buffer,position);
- } else {
- long oldPos = channel.position();
- try {
- channel.position(position);
- return channel.read(buffer);
- } finally {
- channel.position(oldPos);
- }
- }
- }
-
- /**
- * Gets the next sequence if available, or null if not present.
- * @return next sequence if available, or null if not present.
- */
- public ReferenceSequence nextSequence() {
- if( !indexIterator.hasNext() )
- return null;
- return getSequence( indexIterator.next().getContig() );
- }
-
- /**
- * Reset the iterator over the index.
- */
- public void reset() {
- indexIterator = index.iterator();
- }
-
- /**
- * A simple toString implementation for debugging.
- * @return String representation of the file.
- */
- public String toString() {
- return getAbsolutePath();
- }
-
- @Override
- public void close() throws IOException {
- channel.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java
deleted file mode 100644
index a7ddb44..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequence.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.util.StringUtil;
-
-/**
- * Wrapper around a reference sequence that has been read from a reference file.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequence {
- private final String name;
- private final byte[] bases;
- private final int contigIndex;
- private final int length;
-
- /**
- * creates a fully formed ReferenceSequence
- *
- * @param name the name of the sequence from the source file
- * @param index the zero based index of this contig in the source file
- * @param bases the bases themselves stored as one-byte characters
- */
- public ReferenceSequence(String name, int index, byte[] bases) {
- this.name = name;
- this.contigIndex = index;
- this.bases = bases;
- this.length = bases.length;
- }
-
- /** Gets the set of names given to this sequence in the source file. */
- public String getName() { return name; }
-
- /**
- * Gets the array of bases that define this sequence. The bases can include any
- * letter and possibly include masking information in the form of lower case
- * letters. This array is mutable (obviously!) and it NOT a clone of the array
- * held interally. Do not modify it!!!
- */
- public byte[] getBases() { return bases; }
-
- /**
- * Returns the bases represented by this ReferenceSequence as a String. Since this will copy the bases
- * and convert them to two-byte characters, this should not be used on very long reference sequences,
- * but as a convenience when manipulating short sequences returned by
- * {@link ReferenceSequenceFile#getSubsequenceAt(String, long, long)}
- *
- * @return The set of bases represented by this ReferenceSequence, as a String
- */
- public String getBaseString() { return StringUtil.bytesToString(bases); }
-
- /** Gets the 0-based index of this contig in the source file from which it came. */
- public int getContigIndex() { return contigIndex; }
-
- /** Gets the length of this reference sequence in bases. */
- public int length() { return length; }
-
- public String toString() {
- return "ReferenceSequence " + getName();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java
deleted file mode 100644
index e7d3c28..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFile.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * An interface for working with files of reference sequences regardless of the file format
- * being used.
- *
- * @author Tim Fennell
- */
-public interface ReferenceSequenceFile extends Closeable {
-
- /**
- * Must return a sequence dictionary with at least the following fields completed
- * for each sequence: name, length.
- *
- * @return a list of sequence records representing the sequences in this reference file
- */
- public SAMSequenceDictionary getSequenceDictionary();
-
- /**
- * Retrieves the next whole sequences from the file.
- * @return a ReferenceSequence or null if at the end of the file
- */
- public ReferenceSequence nextSequence();
-
- /**
- * Resets the ReferenceSequenceFile so that the next call to nextSequence() will return
- * the first sequence in the file.
- */
- public void reset();
-
-
- /**
- * @return true if getSequence and getSubsequenceAt methods are allowed.
- */
- public boolean isIndexed();
-
- /**
- * Retrieves the complete sequence described by this contig.
- * @param contig contig whose data should be returned.
- * @return The full sequence associated with this contig.
- * @throws UnsupportedOperationException if !sIndexed.
- */
- public ReferenceSequence getSequence( String contig );
-
- /**
- * Gets the subsequence of the contig in the range [start,stop]
- * @param contig Contig whose subsequence to retrieve.
- * @param start inclusive, 1-based start of region.
- * @param stop inclusive, 1-based stop of region.
- * @return The partial reference sequence associated with this range.
- * @throws UnsupportedOperationException if !sIndexed.
- */
- public ReferenceSequence getSubsequenceAt( String contig, long start, long stop );
-
- /**
- * @return Reference name, file name, or something other human-readable representation.
- */
- public String toString();
-
- public void close() throws IOException;
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java
deleted file mode 100644
index 5978072..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.nio.file.Path;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Factory class for creating ReferenceSequenceFile instances for reading reference
- * sequences store in various formats.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequenceFileFactory {
- public static final Set<String> FASTA_EXTENSIONS = new HashSet<String>() {{
- add(".fasta");
- add(".fasta.gz");
- add(".fa");
- add(".fa.gz");
- add(".fna");
- add(".fna.gz");
- add(".txt");
- add(".txt.gz");
- }};
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it. Sequence names
- * will be truncated at first whitespace, if any.
- *
- * @param file the reference sequence file on disk
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final File file) {
- return getReferenceSequenceFile(file, true);
- }
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it.
- *
- * @param file the reference sequence file on disk
- * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final File file, final boolean truncateNamesAtWhitespace) {
- return getReferenceSequenceFile(file, truncateNamesAtWhitespace, true);
- }
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it.
- *
- * @param file the reference sequence file on disk
- * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
- * @param preferIndexed if true attempt to return an indexed reader that supports non-linear traversal, else return the non-indexed reader
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final File file, final boolean truncateNamesAtWhitespace, final boolean preferIndexed) {
- return getReferenceSequenceFile(file.toPath(), truncateNamesAtWhitespace, preferIndexed);
- }
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it. Sequence names
- * will be truncated at first whitespace, if any.
- *
- * @param path the reference sequence file on disk
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final Path path) {
- return getReferenceSequenceFile(path, true);
- }
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it.
- *
- * @param path the reference sequence file on disk
- * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, final boolean truncateNamesAtWhitespace) {
- return getReferenceSequenceFile(path, truncateNamesAtWhitespace, true);
- }
-
- /**
- * Attempts to determine the type of the reference file and return an instance
- * of ReferenceSequenceFile that is appropriate to read it.
- *
- * @param path the reference sequence file path
- * @param truncateNamesAtWhitespace if true, only include the first word of the sequence name
- * @param preferIndexed if true attempt to return an indexed reader that supports non-linear traversal, else return the non-indexed reader
- */
- public static ReferenceSequenceFile getReferenceSequenceFile(final Path path, final boolean truncateNamesAtWhitespace, final boolean preferIndexed) {
- final String name = path.getFileName().toString();
- for (final String ext : FASTA_EXTENSIONS) {
- if (name.endsWith(ext)) {
- // Using faidx requires truncateNamesAtWhitespace
- if (truncateNamesAtWhitespace && preferIndexed && IndexedFastaSequenceFile.canCreateIndexedFastaReader(path)) {
- try {
- return new IndexedFastaSequenceFile(path);
- }
- catch (final FileNotFoundException e) {
- throw new IllegalStateException("Should never happen, because existence of files has been checked.", e);
- }
- }
- else {
- return new FastaSequenceFile(path, truncateNamesAtWhitespace);
- }
- }
- }
-
- throw new IllegalArgumentException("File is not a supported reference file type: " + path.toAbsolutePath());
- }
-}
diff --git a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java b/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java
deleted file mode 100644
index d66f0f8..0000000
--- a/src/main/java/htsjdk/samtools/reference/ReferenceSequenceFileWalker.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Manages a ReferenceSequenceFile. Loads the requested sequence, ensuring that
- * access is in order, and confirming that sequence name and index agree.
- *
- * @author alecw at broadinstitute.org
- */
-public class ReferenceSequenceFileWalker implements Closeable {
- private final ReferenceSequenceFile referenceSequenceFile;
- private ReferenceSequence referenceSequence = null;
-
- public ReferenceSequenceFileWalker(final ReferenceSequenceFile referenceSequenceFile) {
- this.referenceSequenceFile = referenceSequenceFile;
- }
-
- public ReferenceSequenceFileWalker(final File file) {
- this(ReferenceSequenceFileFactory.getReferenceSequenceFile(file, true, false));
- }
-
- /**
- * Ensure that the requested sequence is loaded. Throws an exception if out-of-order
- * request is made, or if there is a mismatch between the requested name and the name
- * found in the ReferenceSequenceFile
- */
- public ReferenceSequence get(final int sequenceIndex, final String sequenceName, final int length) {
- // Has the side-effect of setting referenceSequence member
- get(sequenceIndex);
- if (!referenceSequence.getName().equals(sequenceName)) {
- // Sanity check the sequence names against the sequence dictionary while scanning through.
- throw new SAMException("Sequence name mismatch at sequence index (" + referenceSequence.getContigIndex() +
- ", " + referenceSequence.getName() + ") != " + sequenceName);
- }
- if (referenceSequence.getBases().length != length) {
- throw new SAMException("Sequence length mismatch for (" + sequenceIndex + ", " + sequenceName +
- "). expected " + length + " but found " + referenceSequence.getBases().length);
- }
- return referenceSequence;
- }
-
- /**
- * Get reference sequence without validating name or length. This is OK if the entire sequence
- * dictionary was validated before reading sequences.
- */
- public ReferenceSequence get(final int sequenceIndex) {
- if (referenceSequence != null && referenceSequence.getContigIndex() == sequenceIndex) {
- return referenceSequence;
- }
- if (referenceSequence != null && referenceSequence.getContigIndex() > sequenceIndex) {
- throw new SAMException("Requesting earlier reference sequence: " + sequenceIndex + " < " +
- referenceSequence.getContigIndex());
- }
- referenceSequence = null;
-
- if(referenceSequenceFile.isIndexed()) {
- final SAMSequenceRecord samSequenceRecord = referenceSequenceFile.getSequenceDictionary().getSequence(sequenceIndex);
- if(samSequenceRecord != null) {
- referenceSequence = referenceSequenceFile.getSequence(samSequenceRecord.getSequenceName()) ;
- } // else referenceSequence will remain null
- } else {
- do {
- referenceSequence = referenceSequenceFile.nextSequence();
- }
- while (referenceSequence != null && referenceSequence.getContigIndex() < sequenceIndex);
- }
- if (referenceSequence == null || referenceSequence.getContigIndex() != sequenceIndex) {
- throw new SAMException("Reference sequence (" + sequenceIndex +
- ") not found in " + referenceSequenceFile.toString());
- }
- return referenceSequence;
- }
-
- public SAMSequenceDictionary getSequenceDictionary() {
- return referenceSequenceFile.getSequenceDictionary();
- }
-
- public void close() throws IOException {
- referenceSequenceFile.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java b/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java
deleted file mode 100644
index 4f8c322..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/ByteArraySeekableStream.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-
-/**
-* Created by vadim on 23/03/2015.
-*/
-public class ByteArraySeekableStream extends SeekableStream {
- private byte[] bytes;
- private long position = 0;
-
- public ByteArraySeekableStream(byte[] bytes) {
- this.bytes = bytes;
- }
-
- @Override
- public long length() {
- return bytes.length;
- }
-
- @Override
- public long position() throws IOException {
- return position;
- }
-
- @Override
- public void seek(long position) throws IOException {
- this.position = position;
- }
-
- @Override
- public int read() throws IOException {
- if (position < bytes.length)
- return 0xFF & bytes[((int) position++)];
- else return -1;
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException {
- if (b == null) {
- throw new NullPointerException();
- } else if (off < 0 || len < 0 || len > b.length - off) {
- throw new IndexOutOfBoundsException();
- }
- if (position >= bytes.length) {
- return -1;
- }
- if (position + len > bytes.length) {
- len = (int) (bytes.length - position);
- }
- if (len <= 0) {
- return 0;
- }
- System.arraycopy(bytes, (int) position, b, off, len);
- position += len;
- return len;
- }
-
- @Override
- public void close() throws IOException {
- bytes = null;
- }
-
- @Override
- public boolean eof() throws IOException {
- return position >= bytes.length;
- }
-
- @Override
- public String getSource() {
- return null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java b/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java
deleted file mode 100644
index dff28b0..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/ISeekableStreamFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Factory for creating {@link SeekableStream}s based on URLs/paths.
- * Implementations can be set as the default with {@link SeekableStreamFactory#setInstance(ISeekableStreamFactory)}
- * @author jacob
- * @date 2013-Oct-24
- */
-public interface ISeekableStreamFactory {
-
- public SeekableStream getStreamFor(URL url) throws IOException;
-
- public SeekableStream getStreamFor(String path) throws IOException;
-
- /**
- * Return a buffered {@code SeekableStream} which wraps the input {@code stream}
- * using the default buffer size
- * @param stream
- * @return
- */
- public SeekableStream getBufferedStream(SeekableStream stream);
-
- /**
- * Return a buffered {@code SeekableStream} which wraps the input {@code stream}
- * @param stream
- * @param bufferSize
- * @return
- */
- public SeekableStream getBufferedStream(SeekableStream stream, int bufferSize);
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java
deleted file mode 100644
index 56b4d0c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableBufferedStream.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A wrapper class to provide buffered read access to a SeekableStream. Just wrapping such a stream with
- * a BufferedInputStream will not work as it does not support seeking. In this implementation a
- * seek call is delegated to the wrapped stream, and the buffer reset.
- */
-public class SeekableBufferedStream extends SeekableStream {
-
- /** Little extension to buffered input stream to give access to the available bytes in the buffer. */
- private class ExtBufferedInputStream extends BufferedInputStream {
- private ExtBufferedInputStream(final InputStream inputStream, final int i) {
- super(inputStream, i);
- }
-
- /** Returns the number of bytes that can be read from the buffer without reading more into the buffer. */
- int getBytesInBufferAvailable() {
- if (this.count == this.pos) return 0; // documented test for "is buffer empty"
- else return this.buf.length - this.pos;
- }
- }
-
-
- public static final int DEFAULT_BUFFER_SIZE = 512000;
-
- final private int bufferSize;
- final SeekableStream wrappedStream;
- ExtBufferedInputStream bufferedStream;
- long position;
-
- public SeekableBufferedStream(final SeekableStream stream, final int bufferSize) {
- this.bufferSize = bufferSize;
- this.wrappedStream = stream;
- this.position = 0;
- bufferedStream = new ExtBufferedInputStream(wrappedStream, bufferSize);
- }
-
- public SeekableBufferedStream(final SeekableStream stream) {
- this(stream, DEFAULT_BUFFER_SIZE);
- }
-
- public long length() {
- return wrappedStream.length();
- }
-
- @Override
- public long skip(final long skipLength) throws IOException {
- if (skipLength < this.bufferedStream.getBytesInBufferAvailable()) {
- final long retval = this.bufferedStream.skip(skipLength);
- this.position += retval;
- return retval;
- } else {
- final long position = this.position + skipLength;
- seek(position);
- return skipLength;
- }
- }
-
- public void seek(final long position) throws IOException {
- this.position = position;
- wrappedStream.seek(position);
- bufferedStream = new ExtBufferedInputStream(wrappedStream, bufferSize);
- }
-
- public int read() throws IOException {
- int b = bufferedStream.read();
- position++;
- return b;
- }
-
- public int read(final byte[] buffer, final int offset, final int length) throws IOException {
- int nBytesRead = bufferedStream.read(buffer, offset, length);
- if (nBytesRead > 0) {
- //if we can't read as many bytes as we are asking for then attempt another read to reset the buffer.
- if (nBytesRead < length) {
- final int additionalBytesRead = bufferedStream.read(buffer, nBytesRead + offset, length - nBytesRead);
- //if there were additional bytes read then update nBytesRead
- if (additionalBytesRead > 0) {
- nBytesRead += additionalBytesRead;
- }
- }
- position += nBytesRead;
- }
- return nBytesRead;
- }
-
- public void close() throws IOException {
- wrappedStream.close();
- }
-
- public boolean eof() throws IOException {
- return position >= wrappedStream.length();
- }
-
- @Override
- public String getSource() {
- return wrappedStream.getSource();
- }
-
- @Override
- public long position() throws IOException {
- return position;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java
deleted file mode 100644
index 0a64a7c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStream.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Unfortunately the seekable stream classes exist for both Tribble and Picard, and we need both. This class
- * is for use with Tribble and delegates all the work to a helper.
- *
- * @author jrobinso
- * @date Oct 27, 2010
- */
-public class SeekableFTPStream extends SeekableStream {
-
- SeekableFTPStreamHelper helper;
- public SeekableFTPStream(URL url) throws IOException {
- this(url, null);
- }
-
- public SeekableFTPStream(URL url, UserPasswordInput userPasswordInput) throws IOException {
- helper = new SeekableFTPStreamHelper(url, userPasswordInput);
- }
-
- public void seek(long position) {
- helper.seek(position);
- }
-
- public long position() {
- return helper.position();
- }
-
- @Override
- public boolean eof() throws IOException {
- return helper.eof();
- }
-
- @Override
- public String getSource() {
- return null; //TODO
- }
-
- @Override
- public long length() {
- return helper.length();
- }
-
-
- @Override
- public long skip(long n) throws IOException {
- return helper.skip(n);
- }
-
-
- @Override
- public int read(byte[] buffer, int offset, int len) throws IOException {
- return helper.read(buffer, offset, len);
- }
-
-
- public void close() throws IOException {
- helper.close();
- }
-
- public int read() throws IOException {
- return helper.read();
- }
-
-// private static final String EXPECTED = "Apache Software Foundation";
- private static final String EXPECTED1 = "\u00cf\u00ac\u00c9\u0075\u0043\u00d4\u00d5\u0079";
- private static final String EXPECTED2 = "\u00e4\u006c\u0077\u000c\u0016\u00f1\u0030\u008f";
- public static void main(String[] args) throws IOException {
-// String testURL = (args.length < 1) ? "ftp://apache.cs.utah.edu/apache.org/HEADER.html" : args[0];
- String testURL = (args.length < 1) ? "ftp://hgdownload.cse.ucsc.edu/goldenPath/panTro3/vsHg19/panTro3.hg19.all.chain.gz" : args[0];
- long startPosition = (args.length < 2) ? 0x0b66c78l : Long.parseLong(args[1]);
- int len = (args.length < 3) ? 8 : Integer.parseInt(args[2]);
- int skipLen = (args.length < 4) ? 0x18 : Integer.parseInt(args[3]);
- SeekableStream s = SeekableStreamFactory.getInstance().getStreamFor(testURL);
- byte[] buffer = new byte[len];
- s.seek(startPosition);
- s.read(buffer, 0, len);
- if (s.position() != startPosition + len && s.position() != s.length()) {
- System.out.println("1) updated position is incorrect");
- }
- String data = new String(buffer);
- System.out.println("1) read:" + data);
- if (args.length == 0) {
- System.out.println("1) expected:" + EXPECTED1);
- System.out.println("1) values do" + (EXPECTED1.equals(data) ? "" : " not") + " match");
- }
- s.skip(skipLen);
- s.read(buffer, 0, len);
- if (s.position() != startPosition + 2 * len + skipLen && s.position() != s.length()) {
- System.out.println("2) updated position is incorrect");
- }
- String data2 = new String(buffer);
- System.out.println("2) read:" + data2);
- if (args.length == 0) {
- System.out.println("2) expected:" + EXPECTED2);
- System.out.println("2) values do" + (EXPECTED2.equals(data2) ? "" : " not") + " match");
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java
deleted file mode 100644
index 10b1391..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFTPStreamHelper.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPReply;
-import htsjdk.samtools.util.ftp.FTPUtils;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * @author jrobinso
- * @date Oct 27, 2010
- */
-public class SeekableFTPStreamHelper {
-
- private long position = 0;
- private long contentLength = -1;
- private String host;
- private String path;
- private String userInfo;
- FTPClient ftp = null;
- private UserPasswordInput userPasswordInput;
-
- SeekableFTPStreamHelper(URL url, UserPasswordInput userPasswordInput) throws IOException {
- this.userInfo = url.getUserInfo();
- this.host = url.getHost();
- this.path = url.getPath();
- this.userPasswordInput = userPasswordInput;
- ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
-
- ftp.binary();
- FTPReply reply = ftp.size(path);
- if(reply.isSuccess()) {
- contentLength = Long.parseLong(reply.getReplyString());
- }
-
- }
-
- public void seek(long position) {
- this.position = position;
- }
-
- public long position() {
- return position;
- }
-
- public boolean eof() throws IOException {
- return false;
- }
-
- public long length() {
- return contentLength;
- }
-
-
- public long skip(long n) throws IOException {
- long bytesToSkip = n;
- position += bytesToSkip;
- if (ftp != null) {
- ftp.setRestPosition(position);
- }
- return bytesToSkip;
- }
-
- public int read(byte[] buffer, int offset, int len) throws IOException {
-
- if (ftp == null) {
- ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
- }
-
- if (offset < 0 || len < 0 || (offset + len) > buffer.length) {
- throw new IndexOutOfBoundsException();
- }
-
- if (len == 0) {
- return 0;
- }
-
- int n = 0;
- try {
-
- FTPReply reply = ftp.pasv();
-
- // If we are positioned at or beyond the EOF return -1
- if(contentLength >= 0 && position >= contentLength) {
- return -1;
- }
-
- if (position > 0) ftp.setRestPosition(position);
-
- reply = ftp.retr(path);
-
- InputStream is = ftp.getDataStream();
-
- while (n < len) {
- int count = is.read(buffer, offset + n, len - n);
- if (count < 0) {
- if (n == 0) {
- return -1;
- } else {
- break;
- }
- }
- n += count;
- }
-
- position += n;
-
- return n;
- } catch (EOFException e) {
- if (n < 0) {
- return -1;
- } else {
- position += n;
- return n;
- }
- } finally {
- // ALWAYS close ftp connection, this is more robust than trying to resue them,
- // and we don't want open connections hanging about
- ftp.disconnect();
- ftp = null;
- }
- }
-
-
- private void reconnect() throws IOException {
- if (ftp != null) {
- ftp.disconnect();
- }
- ftp = FTPUtils.connect(host, userInfo, userPasswordInput);
- }
-
-
- public void close() throws IOException {
- if (ftp != null) {
- ftp.disconnect();
- ftp = null;
- }
- }
-
-
- public int read() throws IOException {
- throw new UnsupportedOperationException("read() is not supported on SeekableHTTPStream. Must read in blocks.");
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java
deleted file mode 100644
index 38191d7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableFileStream.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-/**
- *
- * @author jrobinso
- */
-public class SeekableFileStream extends SeekableStream {
-
- /**
- * Collection of all open instances. SeekableFileStream objects are usually open and kept open for the
- * duration of a session. This collection supports a method to close them all.
- */
- static Collection<SeekableFileStream> allInstances =
- Collections.synchronizedCollection(new HashSet<SeekableFileStream>());
-
-
- File file;
- RandomAccessFile fis;
-
- public SeekableFileStream(final File file) throws FileNotFoundException {
- this.file = file;
- fis = new RandomAccessFile(file, "r");
- allInstances.add(this);
- }
-
- public long length() {
- return file.length();
- }
-
- public boolean eof() throws IOException {
- return fis.length() == fis.getFilePointer();
- }
-
- public void seek(final long position) throws IOException {
- fis.seek(position);
- }
-
- public long position() throws IOException {
- return fis.getChannel().position();
- }
-
- @Override
- public long skip(long n) throws IOException {
- long initPos = position();
- fis.getChannel().position(initPos + n);
- return position() - initPos;
- }
-
- public int read(final byte[] buffer, final int offset, final int length) throws IOException {
- if (length < 0) {
- throw new IndexOutOfBoundsException();
- }
- int n = 0;
- while (n < length) {
- final int count = fis.read(buffer, offset + n, length - n);
- if (count < 0) {
- if (n > 0) {
- return n;
- } else {
- return count;
- }
- }
- n += count;
- }
- return n;
-
- }
-
- public int read() throws IOException {
- return fis.read();
- }
-
- @Override
- public int read(byte[] b) throws IOException {
- return fis.read(b);
- }
-
- @Override
- public String getSource() {
- return file.getAbsolutePath();
- }
-
-
- public void close() throws IOException {
- allInstances.remove(this);
- fis.close();
-
- }
-
- public static synchronized void closeAllInstances() {
- Collection<SeekableFileStream> clonedInstances = new HashSet<SeekableFileStream>();
- clonedInstances.addAll(allInstances);
- for (SeekableFileStream sfs : clonedInstances) {
- try {
- sfs.close();
- } catch (IOException e) {
- //TODO
- //log.error("Error closing SeekableFileStream", e);
- }
- }
- allInstances.clear();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java
deleted file mode 100644
index 4a864b7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableHTTPStream.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.HttpUtils;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.Proxy;
-import java.net.URL;
-
-/**
- * @author jrobinso
- */
-public class SeekableHTTPStream extends SeekableStream {
-
- private long position = 0;
- private long contentLength = -1;
- private final URL url;
- private final Proxy proxy;
-
- public SeekableHTTPStream(final URL url) {
- this(url, null);
-
- }
-
- public SeekableHTTPStream(final URL url, Proxy proxy) {
-
- this.proxy = proxy;
- this.url = url;
-
- // Try to get the file length
- // Note: This also sets setDefaultUseCaches(false), which is important
- final String contentLengthString = HttpUtils.getHeaderField(url, "Content-Length");
- if (contentLengthString != null) {
- try {
- contentLength = Long.parseLong(contentLengthString);
- }
- catch (NumberFormatException ignored) {
- System.err.println("WARNING: Invalid content length (" + contentLengthString + " for: " + url);
- contentLength = -1;
- }
- }
-
- }
-
- public long position() {
- return position;
- }
-
- public long length() {
- return contentLength;
- }
-
- @Override
- public long skip(long n) throws IOException {
- long bytesToSkip = Math.min(n, contentLength - position);
- position += bytesToSkip;
- return bytesToSkip;
- }
-
- public boolean eof() throws IOException {
- return contentLength > 0 && position >= contentLength;
- }
-
- public void seek(final long position) {
- this.position = position;
- }
-
- public int read(byte[] buffer, int offset, int len) throws IOException {
-
- if (offset < 0 || len < 0 || (offset + len) > buffer.length) {
- throw new IndexOutOfBoundsException("Offset="+offset+",len="+len+",buflen="+buffer.length);
- }
- if (len == 0 || position == contentLength) {
- return 0;
- }
-
- HttpURLConnection connection = null;
- InputStream is = null;
- String byteRange = "";
- int n = 0;
- try {
- connection = proxy == null ?
- (HttpURLConnection) url.openConnection() :
- (HttpURLConnection) url.openConnection(proxy);
-
- long endRange = position + len - 1;
- // IF we know the total content length, limit the end range to that.
- if (contentLength > 0) {
- endRange = Math.min(endRange, contentLength);
- }
- byteRange = "bytes=" + position + "-" + endRange;
- connection.setRequestProperty("Range", byteRange);
-
- is = connection.getInputStream();
-
- while (n < len) {
- int count = is.read(buffer, offset + n, len - n);
- if (count < 0) {
- if (n == 0) {
- return -1;
- } else {
- break;
- }
- }
- n += count;
- }
-
- position += n;
-
- return n;
-
- }
-
- catch (IOException e) {
- // THis is a bit of a hack, but its not clear how else to handle this. If a byte range is specified
- // that goes past the end of the file the response code will be 416. The MAC os translates this to
- // an IOException with the 416 code in the message. Windows translates the error to an EOFException.
- //
- // The BAM file iterator uses the return value to detect end of file (specifically looks for n == 0).
- if (e.getMessage().contains("416") || (e instanceof EOFException)) {
- if (n == 0) {
- return -1;
- } else {
- position += n;
- // As we are at EOF, the contentLength and position are by definition =
- contentLength = position;
- return n;
- }
- } else {
- throw e;
- }
-
- }
-
- finally {
- if (is != null) {
- is.close();
- }
- if (connection != null) {
- connection.disconnect();
- }
- }
- }
-
-
- public void close() throws IOException {
- // Nothing to do
- }
-
-
- public int read() throws IOException {
- byte []tmp=new byte[1];
- read(tmp,0,1);
- return (int) tmp[0] & 0xFF;
- }
-
- @Override
- public String getSource() {
- return url.toString();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java
deleted file mode 100644
index 37a5ab4..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableMemoryStream.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class SeekableMemoryStream extends SeekableStream {
- private final ByteBuffer buf;
- private final String source;
-
- public SeekableMemoryStream(final byte[] data, final String source) {
- this.buf = ByteBuffer.wrap(data);
- this.source = source;
- }
-
- @Override
- public void close() throws IOException {
- buf.clear();
- }
-
- @Override
- public boolean eof() throws IOException {
- return buf.position() == buf.limit();
- }
-
- @Override
- public String getSource() {
- return source;
- }
-
- @Override
- public long length() {
- return buf.array().length - buf.arrayOffset();
- }
-
- @Override
- public int read(final byte[] buffer, final int offset, final int length) throws IOException {
- int availableLength = Math.min(length, buf.remaining());
- if (availableLength < 1) {
- return -1;
- }
- buf.get(buffer, offset, availableLength);
- return availableLength;
- }
-
- @Override
- public void seek(final long position) throws IOException {
- buf.position((int) position);
- }
-
- @Override
- public int read() throws IOException {
- if (buf.position() < buf.limit()) {
- return buf.get() & 0xFF;
- } else {
- return -1;
- }
- }
-
- @Override
- public long position() throws IOException {
- return buf.position();
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java
deleted file mode 100644
index 18a41e7..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekablePathStream.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.Log;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SeekableByteChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-/**
- * An implementation of {@link SeekableStream} for {@link Path}.
- */
-public class SeekablePathStream extends SeekableStream {
-
- private final static Log LOG = Log.getInstance(SeekablePathStream.class);
-
- /**
- * Collection of all open instances. SeekablePathStream objects are usually open and kept open for the
- * duration of a session. This collection supports a method to close them all.
- */
- private static final Collection<SeekablePathStream> ALL_INSTANCES =
- Collections.synchronizedCollection(new HashSet<SeekablePathStream>());
-
- private final Path path;
- private final SeekableByteChannel sbc;
- private final ByteBuffer oneByteBuf = ByteBuffer.allocate(1);
-
- public SeekablePathStream(final Path path) throws IOException {
- this.path = path;
- this.sbc = Files.newByteChannel(path);
- ALL_INSTANCES.add(this);
- }
-
- @Override
- public long length() {
- try {
- return sbc.size();
- } catch (IOException e) {
- LOG.error("Cannot find length of path: " + path, e);
- return 0; // consistent with java.io.File
- }
- }
-
- @Override
- public boolean eof() throws IOException {
- return length() == position();
- }
-
- @Override
- public void seek(final long position) throws IOException {
- sbc.position(position);
- }
-
- @Override
- public long position() throws IOException {
- return sbc.position();
- }
-
- @Override
- public long skip(long n) throws IOException {
- long initPos = position();
- sbc.position(initPos + n);
- return position() - initPos;
- }
-
- @Override
- public int read(final byte[] buffer, final int offset, final int length) throws IOException {
- if (length < 0) {
- throw new IndexOutOfBoundsException();
- }
- ByteBuffer buf = ByteBuffer.wrap(buffer, offset, length);
- int n = 0;
- while (n < length) {
- final int count = sbc.read(buf);
- if (count < 0) {
- if (n > 0) {
- return n;
- } else {
- return count;
- }
- }
- n += count;
- }
- return n;
- }
-
- @Override
- public int read() throws IOException {
- oneByteBuf.clear();
- int n = sbc.read(oneByteBuf);
- return n == 1 ? oneByteBuf.array()[0] & 0xff : n;
- }
-
- @Override
- public String getSource() {
- return path.toAbsolutePath().toString();
- }
-
-
- @Override
- public void close() throws IOException {
- ALL_INSTANCES.remove(this);
- sbc.close();
- }
-
- public static synchronized void closeAllInstances() {
- Collection<SeekablePathStream> clonedInstances = new HashSet<SeekablePathStream>();
- clonedInstances.addAll(ALL_INSTANCES);
- for (SeekablePathStream sfs : clonedInstances) {
- try {
- sfs.close();
- } catch (IOException e) {
- LOG.error("Error closing SeekablePathStream", e);
- }
- }
- ALL_INSTANCES.clear();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java
deleted file mode 100644
index 673f08c..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableStream.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-public abstract class SeekableStream extends InputStream {
-
- public abstract long length();
-
- public abstract long position() throws IOException;
-
- public abstract void seek(long position) throws IOException;
-
- public abstract int read(byte[] buffer, int offset, int length) throws IOException;
-
- public abstract void close() throws IOException;
-
- public abstract boolean eof() throws IOException;
-
- /**
- * @return String representation of source (e.g. URL, file path, etc.), or null if not available.
- */
- public abstract String getSource();
-
- /**
- * Read enough bytes to fill the input buffer.
- * @param b
- * @throws EOFException If EOF is reached before buffer is filled
- */
- public void readFully(byte b[]) throws IOException {
- int len = b.length;
- if (len < 0){
- throw new IndexOutOfBoundsException();
- }
- int n = 0;
- while (n < len) {
- int count = read(b, n, len - n);
- if (count < 0){
- throw new EOFException();
- }
- n += count;
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java b/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java
deleted file mode 100644
index fe8f42a..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/SeekableStreamFactory.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Singleton class for getting {@link SeekableStream}s from URL/paths
- * Applications using this library can set their own factory
- * @author jrobinso
- * @date Nov 30, 2009
- */
-public class SeekableStreamFactory{
-
- private static final ISeekableStreamFactory DEFAULT_FACTORY;
- private static ISeekableStreamFactory currentFactory;
-
- static{
- DEFAULT_FACTORY = new DefaultSeekableStreamFactory();
- currentFactory = DEFAULT_FACTORY;
- }
-
- private SeekableStreamFactory(){}
-
- public static void setInstance(final ISeekableStreamFactory factory){
- currentFactory = factory;
- }
-
- public static ISeekableStreamFactory getInstance(){
- return currentFactory;
- }
-
- /**
- * Does this path point to a regular file on disk and not something like a URL?
- * @param path the path to test
- * @return true if the path is to a file on disk
- */
- public static boolean isFilePath(final String path) {
- return ! ( path.startsWith("http:") || path.startsWith("https:") || path.startsWith("ftp:") );
- }
-
- private static class DefaultSeekableStreamFactory implements ISeekableStreamFactory {
-
- public SeekableStream getStreamFor(final URL url) throws IOException {
- return getStreamFor(url.toExternalForm());
- }
-
- public SeekableStream getStreamFor(final String path) throws IOException {
- // todo -- add support for SeekableBlockInputStream
-
- if (path.startsWith("http:") || path.startsWith("https:")) {
- final URL url = new URL(path);
- return new SeekableHTTPStream(url);
- } else if (path.startsWith("ftp:")) {
- return new SeekableFTPStream(new URL(path));
- } else if (path.startsWith("file:")) {
- return new SeekableFileStream(new File(new URL(path).getPath()));
- } else {
- return new SeekableFileStream(new File(path));
- }
- }
-
- public SeekableStream getBufferedStream(SeekableStream stream){
- return getBufferedStream(stream, SeekableBufferedStream.DEFAULT_BUFFER_SIZE);
- }
-
- public SeekableStream getBufferedStream(SeekableStream stream, int bufferSize){
- if (bufferSize == 0) return stream;
- else return new SeekableBufferedStream(stream, bufferSize);
- }
-
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java b/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java
deleted file mode 100644
index eda1ef2..0000000
--- a/src/main/java/htsjdk/samtools/seekablestream/UserPasswordInput.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-public interface UserPasswordInput {
- public void setHost(String host);
- public boolean showDialog();
- public String getUser();
- public String getPassword();
-}
diff --git a/src/main/java/htsjdk/samtools/sra/ReferenceCache.java b/src/main/java/htsjdk/samtools/sra/ReferenceCache.java
deleted file mode 100644
index 9eb389a..0000000
--- a/src/main/java/htsjdk/samtools/sra/ReferenceCache.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMFileHeader;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-
-/**
- * That is a thread-safe wrapper for a list of cache Reference objects.
- * Those objects can be used from different threads without issues, however to load and save a Reference object, we
- * need to acquire a lock.
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class ReferenceCache {
- private ReadCollection run;
- private SAMFileHeader virtualHeader;
- private Reference cachedReference;
-
- public ReferenceCache(ReadCollection run, SAMFileHeader virtualHeader) {
- this.run = run;
- this.virtualHeader = virtualHeader;
- }
-
- /**
- * This method returns Reference objects by reference indexes in SAM header
- * Those objects do not maintain thread safety
- *
- * @param referenceIndex reference index in
- * @return a Reference object
- */
- public Reference get(int referenceIndex) {
- String contig = virtualHeader.getSequence(referenceIndex).getSequenceName();
-
- try {
- if (cachedReference == null || !cachedReference.getCanonicalName().equals(contig)) {
- cachedReference = run.getReference(contig);
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- return cachedReference;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAAccession.java b/src/main/java/htsjdk/samtools/sra/SRAAccession.java
deleted file mode 100644
index 9aeb10f..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAAccession.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import gov.nih.nlm.ncbi.ngs.error.LibraryLoadError;
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.util.Log;
-import gov.nih.nlm.ncbi.ngs.NGS;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-
-/**
- * Describes a single SRA accession for SRA read collection
- * Also provides app string functionality and allows to check if working SRA is supported on the running platform
- *
- * Important: due to checks performed in SRAAccession.isValid(), we won't recognise any accessions other
- * than ones that follow the pattern "^[SED]RR[0-9]{6,9}$", e.g. SRR000123
- */
-public class SRAAccession implements Serializable {
- private static final Log log = Log.getInstance(SRAAccession.class);
-
- private static boolean noLibraryDownload;
- private static boolean initTried = false;
- private static String appVersionString = null;
- private final static String defaultAppVersionString = "[unknown software]";
- private final static String htsJdkVersionString = "HTSJDK-NGS";
-
- static final String REMOTE_ACCESSION_PATTERN = "^[SED]RR[0-9]{6,9}$";
-
- private String acc;
-
- static {
- noLibraryDownload = !Defaults.SRA_LIBRARIES_DOWNLOAD;
- if (noLibraryDownload) {
- System.setProperty("vdb.System.noLibraryDownload", "1");
- }
- }
-
- /**
- * Sets an app version string which will let SRA know which software uses it.
- * @param appVersionString a string that describes running application
- */
- public static void setAppVersionString(String appVersionString) {
- SRAAccession.appVersionString = appVersionString;
- }
-
- /**
- * @return true if SRA successfully loaded native libraries and fully initialized,
- * false otherwise
- * @deprecated use {@link #checkIfInitialized} instead
- */
- @Deprecated
- public static boolean isSupported() {
- return checkIfInitialized() == null;
- }
-
- /**
- * Tries to initialize SRA. Initialization error is saved during first call,
- * all subsequent calls will return the same saved error or null.
- *
- * @return ExceptionInInitializerError if initialization failed, null if initialization was successful
- */
- public static ExceptionInInitializerError checkIfInitialized() {
- final ExceptionInInitializerError ngsInitError;
- if (!initTried) {
- log.debug("Initializing SRA module");
- ngsInitError = NGS.getInitializationError();
- if (ngsInitError != null) {
- log.info("SRA initialization failed. Will not be able to read from SRA");
- } else {
- NGS.setAppVersionString(getFullVersionString());
- }
- initTried = true;
- } else {
- ngsInitError = NGS.getInitializationError();
- }
- return ngsInitError;
- }
-
- /**
- * @param acc accession
- * @return true if a string is a valid SRA accession
- */
- public static boolean isValid(String acc) {
- boolean looksLikeSRA = false;
- File f = new File(acc);
- if (f.isFile()) {
- byte[] buffer = new byte[8];
- byte[] signature1 = "NCBI.sra".getBytes();
- byte[] signature2 = "NCBInenc".getBytes();
-
- try (InputStream is = new FileInputStream(f)) {
- int numRead = is.read(buffer);
-
- looksLikeSRA = numRead == buffer.length &&
- (Arrays.equals(buffer, signature1) || Arrays.equals(buffer, signature2));
- } catch (IOException e) {
- looksLikeSRA = false;
- }
- } else if (f.exists()) {
- // anything else local other than a file is not an SRA archive
- looksLikeSRA = false;
- } else {
- looksLikeSRA = acc.toUpperCase().matches ( REMOTE_ACCESSION_PATTERN );
- }
-
- if (!looksLikeSRA) return false;
-
- final ExceptionInInitializerError initError = checkIfInitialized();
- if (initError != null) {
- if (noLibraryDownload && initError instanceof LibraryLoadError) {
- throw new LinkageError(
- "Failed to load SRA native libraries and auto-download is disabled. " +
- "Please re-run with JVM argument -Dsamjdk.sra_libraries_download=true to enable auto-download of native libraries",
- initError
- );
- } else {
- throw initError;
- }
- }
-
- return NGS.isValid(acc);
- }
-
- /**
- * @param acc accession
- */
- public SRAAccession(String acc) {
- this.acc = acc;
- }
-
- public String toString() {
- return acc;
- }
-
- /**
- * @return true if contained string is an SRA accession
- */
- public boolean isValid() {
- return SRAAccession.isValid(acc);
- }
-
- private static String getFullVersionString() {
- String versionString = appVersionString == null ? defaultAppVersionString : appVersionString;
- versionString += " through " + htsJdkVersionString;
- return versionString;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java b/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java
deleted file mode 100644
index 650ddce..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAAlignmentIterator.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAIterator;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.util.CloseableIterator;
-import ngs.Alignment;
-import ngs.AlignmentIterator;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-
-/**
- * Iterator for aligned reads.
- * Is used from SRAIterator.
- * Created by andrii.nikitiuk on 9/3/15.
- */
-public class SRAAlignmentIterator implements CloseableIterator<SAMRecord> {
- private ValidationStringency validationStringency;
-
- private SRAAccession accession;
- private ReadCollection run;
- private SAMFileHeader header;
- private ReferenceCache cachedReferences;
- private List<Long> referencesLengths;
- private Iterator<Chunk> referencesChunksIterator;
- private int currentReference = -1;
-
- private boolean hasMoreReferences = true;
-
- private AlignmentIterator alignedIterator;
- private Boolean hasMoreAlignments = false;
-
- private SRALazyRecord lastRecord;
-
- /**
- * @param run opened read collection
- * @param header sam header
- * @param cachedReferences list of cached references shared among all iterators from a single SRAFileReader
- * @param recordRangeInfo info about record ranges withing SRA archive
- * @param chunk used to determine which alignments the iterator should return
- */
- public SRAAlignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, ReferenceCache cachedReferences,
- final SRAIterator.RecordRangeInfo recordRangeInfo, final Chunk chunk) {
- this.accession = accession;
- this.run = run;
- this.header = header;
- this.cachedReferences = cachedReferences;
- this.referencesLengths = recordRangeInfo.getReferenceLengthsAligned();
-
- referencesChunksIterator = getReferenceChunks(chunk).iterator();
-
- try {
- nextReference();
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public boolean hasNext() {
- // check aligned
- if (lastRecord != null) {
- lastRecord.detachFromIterator();
- lastRecord = null;
- }
-
- if (hasMoreAlignments == null) {
- try {
- hasMoreAlignments = alignedIterator.nextAlignment();
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
- while (!hasMoreAlignments && hasMoreReferences) {
- nextReference();
- }
-
- return hasMoreAlignments;
- }
-
- @Override
- public SAMRecord next() {
- if (!hasNext()) {
- throw new NoSuchElementException("No more alignments are available");
- }
-
- return nextAlignment();
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("Removal of records not implemented.");
- }
-
- public void setValidationStringency(ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- }
-
- private SAMRecord nextAlignment() {
- try {
- lastRecord = new SRALazyRecord(header, accession, run, alignedIterator, alignedIterator.getReadId(), alignedIterator.getAlignmentId());
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- if (validationStringency != null) {
- lastRecord.setValidationStringency(validationStringency);
- }
-
- hasMoreAlignments = null;
-
- return lastRecord;
- }
-
- private void nextReference() {
- if (!hasMoreReferences) {
- throw new NoSuchElementException("Cannot get next reference - already at last one");
- }
-
- try {
- alignedIterator = null;
- hasMoreAlignments = false;
-
- hasMoreReferences = referencesChunksIterator.hasNext();
- if (!hasMoreReferences) {
- return;
- }
-
- currentReference++;
- Chunk refChunk = referencesChunksIterator.next();
- if (refChunk == null) {
- return;
- }
-
- Reference reference = cachedReferences.get(currentReference);
-
- alignedIterator = reference.getFilteredAlignmentSlice(
- refChunk.getChunkStart(), refChunk.getChunkEnd() - refChunk.getChunkStart(),
- Alignment.all, Alignment.startWithinSlice | Alignment.passDuplicates | Alignment.passFailed, 0);
-
- hasMoreAlignments = alignedIterator.nextAlignment();
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private List<Chunk> getReferenceChunks(final Chunk chunk) {
- List<Chunk> referencesChunks = new ArrayList<Chunk>();
- long refOffset = 0;
- for (Long refLen : referencesLengths) {
- if (chunk.getChunkStart() - refOffset >= refLen || chunk.getChunkEnd() - refOffset <= 0) {
- referencesChunks.add(null);
- } else {
- long refChunkStart = Math.max(chunk.getChunkStart() - refOffset, 0);
- long refChunkEnd = Math.min(chunk.getChunkEnd() - refOffset, refLen);
- referencesChunks.add(new Chunk(refChunkStart, refChunkEnd));
- }
-
- refOffset += refLen;
- }
-
- return referencesChunks;
- }
-
- @Override
- public void close() {
- if (lastRecord != null) {
- lastRecord.detachFromIterator();
- lastRecord = null;
- }
-
- alignedIterator = null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java b/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java
deleted file mode 100644
index 1d9a471..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAIndexedSequenceFile.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import ngs.ErrorMsg;
-import ngs.ReadCollection;
-import ngs.Reference;
-import ngs.ReferenceIterator;
-
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Allows reading Reference data from SRA
- */
-public class SRAIndexedSequenceFile implements ReferenceSequenceFile {
- private SRAAccession acc;
- private ReadCollection run;
- private Reference cachedReference;
-
- private Iterator<SAMSequenceRecord> sequenceRecordIterator;
-
- protected SAMSequenceDictionary sequenceDictionary;
-
- /**
- * @param acc accession
- */
- public SRAIndexedSequenceFile(SRAAccession acc) {
- this.acc = acc;
-
- if (!acc.isValid()) {
- throw new RuntimeException("Passed an invalid SRA accession into SRA reader: " + acc);
- }
-
- try {
- run = gov.nih.nlm.ncbi.ngs.NGS.openReadCollection(acc.toString());
- sequenceDictionary = loadSequenceDictionary();
- } catch (final ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- reset();
- }
-
- @Override
- public SAMSequenceDictionary getSequenceDictionary() {
- return sequenceDictionary;
- }
-
- @Override
- public ReferenceSequence nextSequence() {
- SAMSequenceRecord sequence = sequenceRecordIterator.next();
- return getSubsequenceAt(sequence.getSequenceName(), 1L, sequence.getSequenceLength());
- }
-
- @Override
- public void reset() {
- sequenceRecordIterator = sequenceDictionary.getSequences().iterator();
- }
-
- @Override
- public boolean isIndexed() {
- return true;
- }
-
- @Override
- public ReferenceSequence getSequence(String contig) {
- return getSubsequenceAt(contig, 1L, sequenceDictionary.getSequence(contig).getSequenceLength());
- }
-
- @Override
- public ReferenceSequence getSubsequenceAt(String contig, long start, long stop) {
- SAMSequenceRecord sequence = sequenceDictionary.getSequence(contig);
- int referenceIndex = sequence.getSequenceIndex();
-
- byte[] bases;
-
- try {
- Reference reference;
- synchronized (this) {
- if (cachedReference == null || !cachedReference.getCanonicalName().equals(contig)) {
- cachedReference = run.getReference(contig);
- }
- reference = cachedReference;
-
- bases = reference.getReferenceBases(start - 1, stop - (start - 1)).getBytes();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- return new ReferenceSequence(contig, referenceIndex, bases);
- }
-
- @Override
- public void close() throws IOException {
- cachedReference = null;
- }
-
- protected SAMSequenceDictionary loadSequenceDictionary() throws ErrorMsg {
- SAMSequenceDictionary dict = new SAMSequenceDictionary();
-
- ReferenceIterator itRef = run.getReferences();
- while (itRef.nextReference()) {
- dict.addSequence(new SAMSequenceRecord(itRef.getCanonicalName(), (int) itRef.getLength()));
- }
-
- return dict;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java b/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java
deleted file mode 100644
index 4391857..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRALazyRecord.java
+++ /dev/null
@@ -1,1056 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import gov.nih.nlm.ncbi.ngs.NGS;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMTagUtil;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.SAMBinaryTagAndValue;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.util.Log;
-import ngs.ReadCollection;
-import ngs.AlignmentIterator;
-import ngs.Alignment;
-import ngs.ReadIterator;
-import ngs.Read;
-import ngs.Fragment;
-import ngs.ErrorMsg;
-
-import java.io.IOException;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * Extends SAMRecord so that any of the fields will be loaded only when needed.
- * Since SRA is a column oriented database, it is very inefficient to load all the fields at once.
- * However, loading only set of actually needed fields will be even faster than in row oriented databases.
- *
- * Because of that we are providing lazy loading of fields, flags and attributes.
- *
- * Created by andrii.nikitiuk on 8/25/15.
- */
-public class SRALazyRecord extends SAMRecord {
- private static final Log log = Log.getInstance(SRALazyRecord.class);
-
- private SRAAccession accession;
- private boolean isAligned;
- private transient ReadCollection run;
- private transient Alignment alignmentIterator;
- private transient Read unalignmentIterator;
- private String sraReadId;
- private String sraAlignmentId;
- private int unalignedReadFragmentIndex = -1;
-
-
- private Set<LazyField> initializedFields = EnumSet.noneOf(LazyField.class);
- private Set<LazyFlag> initializedFlags = EnumSet.noneOf(LazyFlag.class);
- private Set<LazyAttribute> initializedAttributes = EnumSet.noneOf(LazyAttribute.class);
-
- private enum LazyField {
- ALIGNMENT_START {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getAlignmentStart();
- }
- },
- MAPPING_QUALITY {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getMappingQuality();
- }
- },
- REFERENCE_NAME {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getReferenceName();
- }
- },
- CIGAR_STRING {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getCigarString();
- }
- },
- BASES {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getReadBases();
- }
- },
- QUALS {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getBaseQualities();
- }
- },
- MATE_ALIGNMENT_START {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getMateAlignmentStart();
- }
- },
- MATE_REFERENCE_NAME {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getMateReferenceName();
- }
- },
- INFERRED_INSERT_SIZE {
- @Override
- public void loadValue(SRALazyRecord self) {
- self.getInferredInsertSize();
- }
- };
-
- public abstract void loadValue(SRALazyRecord self);
- }
-
- private enum LazyFlag {
- READ_NEGATIVE_STRAND(true) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getReadNegativeStrandFlag();
- }
- },
- READ_PAIRED(true) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getReadPairedFlag();
- }
- },
- PROPER_PAIR(false) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getProperPairFlag();
- }
- },
- NOT_PRIMARY_ALIGNMENT(true) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getNotPrimaryAlignmentFlag();
- }
- },
- MATE_NEGATIVE_STRAND(false) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getMateNegativeStrandFlag();
- }
- },
- MATE_UNMAPPED(false) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getMateUnmappedFlag();
- }
- },
- FIRST_OF_PAIR(false) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getFirstOfPairFlag();
- }
- },
- SECOND_OF_PAIR(false) {
- @Override
- public boolean getFlag(SRALazyRecord self) {
- return self.getSecondOfPairFlag();
- }
- };
-
- private final boolean canCallOnNotPaired;
-
- LazyFlag(final boolean canCallOnNotPaired) {
- this.canCallOnNotPaired = canCallOnNotPaired;
- }
-
- public boolean canCallOnNotPaired() { return canCallOnNotPaired; }
-
- public abstract boolean getFlag(SRALazyRecord self);
- }
-
- private enum LazyAttribute {
- RG {
- @Override
- public String getAttribute(SRALazyRecord self) {
- return self.getAttributeGroupNameImpl();
- }
- };
-
- public abstract String getAttribute(SRALazyRecord self);
- }
-
- private static Map<Short, LazyAttribute> lazyAttributeTags;
- static
- {
- lazyAttributeTags = new HashMap<Short, LazyAttribute>();
- lazyAttributeTags.put(SAMTagUtil.getSingleton().RG, LazyAttribute.RG);
- }
-
- public SRALazyRecord(final SAMFileHeader header, SRAAccession accession, ReadCollection run, AlignmentIterator alignmentIterator, String readId, String alignmentId) {
- this(header, accession, readId, alignmentId);
-
- this.run = run;
- this.alignmentIterator = alignmentIterator;
- }
-
- public SRALazyRecord(final SAMFileHeader header, SRAAccession accession, ReadCollection run, ReadIterator unalignmentIterator, String readId, int unalignedReadFragmentIndex) {
- this(header, accession, readId, unalignedReadFragmentIndex);
-
- this.run = run;
- this.unalignmentIterator = unalignmentIterator;
- }
-
- protected SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, String alignmentId) {
- this(header, accession, readId, true);
-
- this.sraAlignmentId = alignmentId;
- }
-
- protected SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, int unalignedReadFragmentIndex) {
- this(header, accession, readId, false);
-
- this.unalignedReadFragmentIndex = unalignedReadFragmentIndex;
- }
-
- private SRALazyRecord(final SAMFileHeader header, SRAAccession accession, String readId, boolean isAligned) {
- super(header);
-
- this.accession = accession;
- this.isAligned = isAligned;
- this.sraReadId = readId;
- setReadName(readId);
- setReadUnmappedFlag(!isAligned);
- }
-
- /**
- * Is being called when original NGS iterator is being moved to the next object.
- * Later, if any of uninitialized fields is requested, either Read object or Alignment has to be retrieved from
- * ReadCollection
- */
- public void detachFromIterator() {
- alignmentIterator = null;
- unalignmentIterator = null;
- }
-
- // ===== fields =====
-
- @Override
- public int getAlignmentStart() {
- if (!initializedFields.contains(LazyField.ALIGNMENT_START)) {
- setAlignmentStart(getAlignmentStartImpl());
- }
- return super.getAlignmentStart();
- }
-
- @Override
- public void setAlignmentStart(final int value) {
- if (!initializedFields.contains(LazyField.ALIGNMENT_START)) {
- initializedFields.add(LazyField.ALIGNMENT_START);
- }
- super.setAlignmentStart(value);
- }
-
- @Override
- public int getMappingQuality() {
- if (!initializedFields.contains(LazyField.MAPPING_QUALITY)) {
- setMappingQuality(getMappingQualityImpl());
- }
- return super.getMappingQuality();
- }
-
- @Override
- public void setMappingQuality(final int value) {
- if (!initializedFields.contains(LazyField.MAPPING_QUALITY)) {
- initializedFields.add(LazyField.MAPPING_QUALITY);
- }
- super.setMappingQuality(value);
- }
-
- @Override
- public String getReferenceName() {
- if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
- setReferenceName(getReferenceNameImpl());
- }
- return super.getReferenceName();
- }
-
- @Override
- public void setReferenceName(final String value) {
- if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
- initializedFields.add(LazyField.REFERENCE_NAME);
- }
- super.setReferenceName(value);
- }
-
- @Override
- public Integer getReferenceIndex() {
- if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
- setReferenceName(getReferenceNameImpl());
- }
- return super.getReferenceIndex();
- }
-
- @Override
- public void setReferenceIndex(final int value) {
- if (!initializedFields.contains(LazyField.REFERENCE_NAME)) {
- initializedFields.add(LazyField.REFERENCE_NAME);
- }
- super.setReferenceIndex(value);
- }
-
- @Override
- public String getCigarString() {
- if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
- setCigarString(getCigarStringImpl());
- }
- return super.getCigarString();
- }
-
- @Override
- public void setCigarString(final String value) {
- if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
- initializedFields.add(LazyField.CIGAR_STRING);
- }
- super.setCigarString(value);
- }
-
- @Override
- public Cigar getCigar() {
- if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
- setCigarString(getCigarStringImpl());
- }
- return super.getCigar();
- }
-
- @Override
- public void setCigar(final Cigar value) {
- if (!initializedFields.contains(LazyField.CIGAR_STRING)) {
- initializedFields.add(LazyField.CIGAR_STRING);
- }
- super.setCigar(value);
- }
-
- @Override
- public byte[] getReadBases() {
- if (!initializedFields.contains(LazyField.BASES)) {
- setReadBases(getReadBasesImpl());
- }
- return super.getReadBases();
- }
-
- @Override
- public void setReadBases(final byte[] value) {
- if (!initializedFields.contains(LazyField.BASES)) {
- initializedFields.add(LazyField.BASES);
- }
- super.setReadBases(value);
- }
-
- @Override
- public byte[] getBaseQualities() {
- if (!initializedFields.contains(LazyField.QUALS)) {
- setBaseQualities(getBaseQualitiesImpl());
- }
- return super.getBaseQualities();
- }
-
- @Override
- public void setBaseQualities(final byte[] value) {
- if (!initializedFields.contains(LazyField.QUALS)) {
- initializedFields.add(LazyField.QUALS);
- }
- super.setBaseQualities(value);
- }
-
- @Override
- public int getMateAlignmentStart() {
- if (!initializedFields.contains(LazyField.MATE_ALIGNMENT_START)) {
- setMateAlignmentStart(getMateAlignmentStartImpl());
- }
- return super.getMateAlignmentStart();
- }
-
- @Override
- public void setMateAlignmentStart(final int value) {
- if (!initializedFields.contains(LazyField.MATE_ALIGNMENT_START)) {
- initializedFields.add(LazyField.MATE_ALIGNMENT_START);
- }
- super.setMateAlignmentStart(value);
- }
-
- @Override
- public String getMateReferenceName() {
- if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
- setMateReferenceName(getMateReferenceNameImpl());
- }
- return super.getMateReferenceName();
- }
-
- @Override
- public void setMateReferenceName(final String value) {
- if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
- initializedFields.add(LazyField.MATE_REFERENCE_NAME);
- }
- super.setMateReferenceName(value);
- }
-
- @Override
- public Integer getMateReferenceIndex() {
- if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
- setMateReferenceName(getMateReferenceNameImpl());
- }
- return super.getMateReferenceIndex();
- }
-
- @Override
- public void setMateReferenceIndex(final int value) {
- if (!initializedFields.contains(LazyField.MATE_REFERENCE_NAME)) {
- initializedFields.add(LazyField.MATE_REFERENCE_NAME);
- }
- super.setMateReferenceIndex(value);
- }
-
- @Override
- public int getInferredInsertSize() {
- if (!initializedFields.contains(LazyField.INFERRED_INSERT_SIZE)) {
- setInferredInsertSize(getInferredInsertSizeImpl());
- }
- return super.getInferredInsertSize();
- }
-
- @Override
- public void setInferredInsertSize(final int value) {
- if (!initializedFields.contains(LazyField.INFERRED_INSERT_SIZE)) {
- initializedFields.add(LazyField.INFERRED_INSERT_SIZE);
- }
- super.setInferredInsertSize(value);
- }
-
- // ===== flags =====
-
- @Override
- public int getFlags() {
- for (LazyFlag flag : LazyFlag.values()) {
- if (initializedFlags.contains(flag)) {
- continue;
- }
-
- if (flag.canCallOnNotPaired() || getReadPairedFlag()) {
- flag.getFlag(this);
- }
- }
-
- return super.getFlags();
- }
-
- @Override
- public void setFlags(final int value) {
- for (LazyFlag flag : LazyFlag.values()) {
- if (!initializedFlags.contains(flag)) {
- initializedFlags.add(flag);
- }
- }
- super.setFlags(value);
- }
-
- @Override
- public boolean getReadNegativeStrandFlag() {
- if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) {
- setReadNegativeStrandFlag(getReadNegativeStrandFlagImpl());
- }
- return super.getReadNegativeStrandFlag();
- }
-
- @Override
- public void setReadNegativeStrandFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.READ_NEGATIVE_STRAND)) {
- initializedFlags.add(LazyFlag.READ_NEGATIVE_STRAND);
- }
- super.setReadNegativeStrandFlag(flag);
- }
-
- @Override
- public boolean getReadPairedFlag() {
- if (!initializedFlags.contains(LazyFlag.READ_PAIRED)) {
- setReadPairedFlag(getReadPairedFlagImpl());
- }
- return super.getReadPairedFlag();
- }
-
- @Override
- public void setReadPairedFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.READ_PAIRED)) {
- initializedFlags.add(LazyFlag.READ_PAIRED);
- }
- super.setReadPairedFlag(flag);
- }
-
- @Override
- public boolean getProperPairFlag() {
- if (!initializedFlags.contains(LazyFlag.PROPER_PAIR)) {
- setProperPairFlag(getProperPairFlagImpl());
- }
- return super.getProperPairFlag();
- }
-
- @Override
- public void setProperPairFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.PROPER_PAIR)) {
- initializedFlags.add(LazyFlag.PROPER_PAIR);
- }
- super.setProperPairFlag(flag);
- }
-
- @Override
- public boolean getNotPrimaryAlignmentFlag() {
- if (!initializedFlags.contains(LazyFlag.NOT_PRIMARY_ALIGNMENT)) {
- setNotPrimaryAlignmentFlag(getNotPrimaryAlignmentFlagImpl());
- }
- return super.getNotPrimaryAlignmentFlag();
- }
-
- @Override
- public void setNotPrimaryAlignmentFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.NOT_PRIMARY_ALIGNMENT)) {
- initializedFlags.add(LazyFlag.NOT_PRIMARY_ALIGNMENT);
- }
- super.setNotPrimaryAlignmentFlag(flag);
- }
-
- @Override
- public boolean getMateNegativeStrandFlag() {
- if (!initializedFlags.contains(LazyFlag.MATE_NEGATIVE_STRAND)) {
- setMateNegativeStrandFlag(getMateNegativeStrandFlagImpl());
- }
- return super.getMateNegativeStrandFlag();
- }
-
- @Override
- public void setMateNegativeStrandFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.MATE_NEGATIVE_STRAND)) {
- initializedFlags.add(LazyFlag.MATE_NEGATIVE_STRAND);
- }
- super.setMateNegativeStrandFlag(flag);
- }
-
- @Override
- public boolean getMateUnmappedFlag() {
- if (!initializedFlags.contains(LazyFlag.MATE_UNMAPPED)) {
- setMateUnmappedFlag(getMateUnmappedFlagImpl());
- }
- return super.getMateUnmappedFlag();
- }
-
- @Override
- public void setMateUnmappedFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.MATE_UNMAPPED)) {
- initializedFlags.add(LazyFlag.MATE_UNMAPPED);
- }
- super.setMateUnmappedFlag(flag);
- }
-
- @Override
- public boolean getFirstOfPairFlag() {
- if (!initializedFlags.contains(LazyFlag.FIRST_OF_PAIR)) {
- setFirstOfPairFlag(getFirstOfPairFlagImpl());
- }
- return super.getFirstOfPairFlag();
- }
-
- @Override
- public void setFirstOfPairFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.FIRST_OF_PAIR)) {
- initializedFlags.add(LazyFlag.FIRST_OF_PAIR);
- }
- super.setFirstOfPairFlag(flag);
- }
-
- @Override
- public boolean getSecondOfPairFlag() {
- if (!initializedFlags.contains(LazyFlag.SECOND_OF_PAIR)) {
- setSecondOfPairFlag(getSecondOfPairFlagImpl());
- }
- return super.getSecondOfPairFlag();
- }
-
- @Override
- public void setSecondOfPairFlag(final boolean flag) {
- if (!initializedFlags.contains(LazyFlag.SECOND_OF_PAIR)) {
- initializedFlags.add(LazyFlag.SECOND_OF_PAIR);
- }
- super.setSecondOfPairFlag(flag);
- }
-
-
- // ===== attributes =====
-
- @Override
- public Object getAttribute(final short tag) {
- LazyAttribute attr = lazyAttributeTags.get(tag);
- if (attr != null) {
- if (!initializedAttributes.contains(attr)) {
- setAttribute(tag, attr.getAttribute(this));
- }
- }
- return super.getAttribute(tag);
- }
-
- @Override
- public void setAttribute(final short tag, final Object value) {
- LazyAttribute attr = lazyAttributeTags.get(tag);
- if (attr != null && !initializedAttributes.contains(attr)) {
- initializedAttributes.add(attr);
- }
- super.setAttribute(tag, value);
- }
-
- @Override
- protected void setAttribute(final short tag, final Object value, final boolean isUnsignedArray) {
- LazyAttribute attr = lazyAttributeTags.get(tag);
- if (attr != null && !initializedAttributes.contains(attr)) {
- initializedAttributes.add(attr);
- }
- super.setAttribute(tag, value, isUnsignedArray);
- }
-
- @Override
- public void clearAttributes() {
- for (LazyAttribute lazyAttribute : LazyAttribute.values()) {
- if (!initializedAttributes.contains(lazyAttribute)) {
- initializedAttributes.add(lazyAttribute);
- }
- }
- super.clearAttributes();
- }
-
- @Override
- protected void setAttributes(final SAMBinaryTagAndValue attributes) {
- for (LazyAttribute lazyAttribute : LazyAttribute.values()) {
- if (!initializedAttributes.contains(lazyAttribute)) {
- initializedAttributes.add(lazyAttribute);
- }
- }
- super.setAttributes(attributes);
- }
-
- @Override
- protected SAMBinaryTagAndValue getBinaryAttributes() {
- for (Map.Entry<Short, LazyAttribute> info : lazyAttributeTags.entrySet()) {
- if (!initializedAttributes.contains(info.getValue())) {
- getAttribute(info.getKey());
- }
- }
-
- return super.getBinaryAttributes();
- }
-
- public boolean isUnsignedArrayAttribute(final String tag) {
- Short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag(tag);
- LazyAttribute attr = lazyAttributeTags.get(binaryTag);
- if (attr != null && !initializedAttributes.contains(attr)) {
- getAttribute(binaryTag);
- }
-
- return super.isUnsignedArrayAttribute(tag);
- }
-
- // ===== misc ====
-
- /**
- * For records equality, we should only compare read id, reference and position on the reference.
- * Since read id is a constructor parameter, we only need to make sure that reference info is loaded.
- * @param o other
- * @return comparison result
- */
- @Override
- public boolean equals(final Object o) {
- if (o instanceof SRALazyRecord) {
- SRALazyRecord otherRecord = (SRALazyRecord)o;
- otherRecord.getReferenceIndex();
- otherRecord.getAlignmentStart();
- }
-
- getReferenceIndex();
- getAlignmentStart();
-
- return super.equals(o);
- }
-
- /**
- * The same approach as with 'equals' method. We only load reference and position.
- */
- @Override
- public int hashCode() {
- getReferenceIndex();
- getAlignmentStart();
-
- return super.hashCode();
- }
-
- /**
- * Performs a deep copy of the SAMRecord and detaches a copy from NGS iterator
- * @return new object
- * @throws CloneNotSupportedException
- */
- @Override
- public Object clone() throws CloneNotSupportedException {
- SRALazyRecord newObject = (SRALazyRecord)super.clone();
- newObject.initializedFields = EnumSet.copyOf(this.initializedFields);
- newObject.initializedFlags = EnumSet.copyOf(this.initializedFlags);
- newObject.initializedAttributes = EnumSet.copyOf(this.initializedAttributes);
- newObject.detachFromIterator();
-
- return newObject;
- }
-
- @Override
- public String format() {
- if (!initializedAttributes.contains(LazyAttribute.RG)) {
- getAttribute("RG");
- }
- return super.format();
- }
-
- @Override
- public List<SAMValidationError> isValid(final boolean firstOnly) {
- loadFields();
- getFlags();
- getBinaryAttributes();
-
- return super.isValid(firstOnly);
- }
-
- // =============================== Implementation ========================================
-
- private ReadCollection getReadCollection() {
- if (run != null) {
- return run;
- }
-
- log.debug("Recovering SRA read collection. Accession: " + accession);
- try {
- return run = NGS.openReadCollection(accession.toString());
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private Alignment getCurrentAlignment() throws ErrorMsg {
- if (!isAligned) {
- throw new RuntimeException("Should be called for aligned records only");
- }
-
- if (alignmentIterator == null) {
- log.debug("Recovering SAM record after detaching from iterator. Alignment id: " + sraAlignmentId);
- if (sraAlignmentId == null) {
- throw new RuntimeException("Cannot recover SAM object after detaching from iterator: no alignment id");
- }
-
- alignmentIterator = getReadCollection().getAlignment(sraAlignmentId);
- }
- return alignmentIterator;
- }
-
- private Read getCurrentUnalignedRead() throws ErrorMsg {
- if (isAligned) {
- throw new RuntimeException("Should be called for unaligned records only");
- }
-
- if (unalignmentIterator == null) {
- log.debug("Recovering SAM record after detaching from iterator. Read id: " + sraReadId + ", fragment index: " + unalignedReadFragmentIndex);
- if (sraReadId == null) {
- throw new RuntimeException("Cannot recover SAM object after detaching from iterator: no read id");
- }
-
- Read read = getReadCollection().getRead(sraReadId);
- for (int i = 0; i < unalignedReadFragmentIndex + 1; i++) {
- read.nextFragment();
- }
-
- unalignmentIterator = read;
- }
- return unalignmentIterator;
- }
-
- // ===== fields =====
-
- private void loadFields() {
- for (LazyField field : LazyField.values()) {
- if (initializedFields.contains(field)) {
- continue;
- }
-
- field.loadValue(this);
- }
- }
-
- private int getAlignmentStartImpl() {
- try {
- if (isAligned) {
- return (int) getCurrentAlignment().getAlignmentPosition() + 1;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_ALIGNMENT_START;
- }
-
- private int getMappingQualityImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getMappingQuality();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_MAPPING_QUALITY;
- }
-
- private String getReferenceNameImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getReferenceSpec();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- }
-
- private String getCigarStringImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getShortCigar(false);
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_ALIGNMENT_CIGAR;
- }
-
- private byte[] getReadBasesImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getAlignedFragmentBases().getBytes();
- } else {
- return getCurrentUnalignedRead().getFragmentBases().getBytes();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private byte[] getBaseQualitiesImpl() {
- try {
- Fragment fragment;
- if (isAligned) {
- fragment = getCurrentAlignment();
- } else {
- fragment = getCurrentUnalignedRead();
- }
-
- // quals are being taken from PRIMARY_ALIGNMENT.SAM_QUALITY column which reverse automatically them if needed
- return SAMUtils.fastqToPhred(fragment.getFragmentQualities());
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private int getMateAlignmentStartImpl() {
- try {
- if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
- Alignment mate = getCurrentAlignment().getMateAlignment();
- return (int) mate.getAlignmentPosition() + 1;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_ALIGNMENT_START;
- }
-
- private String getMateReferenceNameImpl() {
- try {
- if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
- return getCurrentAlignment().getMateReferenceSpec();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return SAMRecord.NO_ALIGNMENT_REFERENCE_NAME;
- }
-
- private int getInferredInsertSizeImpl() {
- try {
- if (isAligned) {
- return (int) getCurrentAlignment().getTemplateLength();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return 0;
- }
-
- // ===== flags =====
-
- private boolean getReadNegativeStrandFlagImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getIsReversedOrientation();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- return false;
- }
-
- private boolean getReadPairedFlagImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().isPaired();
- } else {
- return getCurrentUnalignedRead().getNumFragments() > 1;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private boolean getProperPairFlagImpl() {
- return isAligned && getReadPairedFlag() && !getMateUnmappedFlag();
- }
-
- private boolean getNotPrimaryAlignmentFlagImpl() {
- try {
- if (isAligned) {
- return getCurrentAlignment().getAlignmentCategory() == Alignment.secondaryAlignment;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- return false;
- }
-
- private boolean getMateNegativeStrandFlagImpl() {
- try {
- if (isAligned && getReadPairedFlag() && !getMateUnmappedFlag()) {
- Alignment mate = getCurrentAlignment().getMateAlignment();
- return mate.getIsReversedOrientation();
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- return false;
- }
-
- private boolean getMateUnmappedFlagImpl() {
- try {
- if (isAligned) {
- return !getCurrentAlignment().hasMate();
- } else {
- Read unalignedRead = getCurrentUnalignedRead();
- int numFragments = unalignedRead.getNumFragments();
- int nextFragmentIdx = unalignedReadFragmentIndex + 1;
- if (nextFragmentIdx == numFragments) {
- nextFragmentIdx = 0;
- }
-
- return unalignedRead.fragmentIsAligned(nextFragmentIdx);
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private boolean getFirstOfPairFlagImpl() {
- if (!getReadPairedFlag()) {
- return false;
- }
- try {
- if (isAligned) {
- String fragmentId = getCurrentAlignment().getFragmentId();
- if (!fragmentId.contains(".FA")) {
- throw new RuntimeException("Invalid fragment id: " + fragmentId);
- }
-
- return fragmentId.contains(".FA0.");
- } else {
- return unalignedReadFragmentIndex == 0;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- private boolean getSecondOfPairFlagImpl() {
- if (!getReadPairedFlag()) {
- return false;
- }
- try {
- if (isAligned) {
- String fragmentId = getCurrentAlignment().getFragmentId();
- if (!fragmentId.contains(".FA")) {
- throw new RuntimeException("Invalid fragment id: " + fragmentId);
- }
-
- return !fragmentId.contains(".FA0.");
- } else {
- return unalignedReadFragmentIndex != 0;
- }
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-
- // ===== attributes =====
-
- private String getAttributeGroupNameImpl() {
- try {
- String readGroupName;
- if (isAligned) {
- readGroupName = getCurrentAlignment().getReadGroup();
- } else {
- readGroupName = getCurrentUnalignedRead().getReadGroup();
- }
-
- if (!readGroupName.isEmpty()) {
- return readGroupName;
- }
- return getReadCollection().getName();
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java b/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java
deleted file mode 100644
index f128a2b..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAUnalignmentIterator.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAIterator;
-import htsjdk.samtools.ValidationStringency;
-import ngs.ErrorMsg;
-import ngs.Read;
-import ngs.ReadCollection;
-import ngs.ReadIterator;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Iterator for unaligned reads.
- * Is used from SRAIterator.
- *
- * Created by andrii.nikitiuk on 9/3/15.
- */
-public class SRAUnalignmentIterator implements Iterator<SAMRecord> {
- private ValidationStringency validationStringency;
-
- private SRAAccession accession;
- private ReadCollection run;
- private SAMFileHeader header;
- private SRAIterator.RecordRangeInfo recordRangeInfo;
-
- private ReadIterator unalignedIterator;
- private boolean hasMoreUnalignedReads = true;
- private Boolean hasMoreUnalignedFragments = false;
- private int lastUnalignedFragmentIndex;
-
- private SRALazyRecord lastRecord;
-
- /**
- *
- * @param run opened read collection
- * @param header sam header
- * @param recordRangeInfo info about record ranges withing SRA archive
- * @param chunk used to determine which unaligned reads the iterator should return
- */
- public SRAUnalignmentIterator(SRAAccession accession, final ReadCollection run, final SAMFileHeader header, SRAIterator.RecordRangeInfo recordRangeInfo, Chunk chunk) {
- this.accession = accession;
- this.run = run;
- this.header = header;
- this.recordRangeInfo = recordRangeInfo;
-
- long readStart = chunk.getChunkStart() - recordRangeInfo.getTotalReferencesLength();
- if (readStart < 0) {
- readStart = 0;
- } else if (readStart >= recordRangeInfo.getNumberOfReads()) {
- throw new RuntimeException("Invalid chunk provided: chunkStart position is after last read");
- }
-
- long readEnd = chunk.getChunkEnd() - recordRangeInfo.getTotalReferencesLength();
- if (readEnd > recordRangeInfo.getNumberOfReads()) {
- readEnd = recordRangeInfo.getNumberOfReads();
- } else if (readEnd <= 0) {
- throw new RuntimeException("Invalid chunk provided: chunkEnd position is before last read");
- }
-
- try {
- unalignedIterator = run.getReadRange(readStart + 1, readEnd - readStart, Read.partiallyAligned | Read.unaligned);
- nextUnalignedFragment();
-
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public boolean hasNext() {
- // check unaligned
- if (hasMoreUnalignedFragments == null) {
- try {
- lastRecord.detachFromIterator();
- nextUnalignedFragment();
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
- }
- return hasMoreUnalignedFragments;
- }
-
- @Override
- public SAMRecord next() {
- if (!hasNext()) {
- throw new NoSuchElementException("No more alignments are available");
- }
-
- return nextUnalignment();
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("Removal of records not implemented.");
- }
-
- public void setValidationStringency(ValidationStringency validationStringency) {
- this.validationStringency = validationStringency;
- }
-
- private SAMRecord nextUnalignment() {
- try {
- lastRecord = new SRALazyRecord(header, accession, run, unalignedIterator, unalignedIterator.getReadId(), lastUnalignedFragmentIndex);
- } catch (ErrorMsg e) {
- throw new RuntimeException(e);
- }
-
- if (validationStringency != null) {
- lastRecord.setValidationStringency(validationStringency);
- }
-
- hasMoreUnalignedFragments = null;
-
- return lastRecord;
- }
-
- private void nextUnalignedFragment() throws ErrorMsg {
- while (hasMoreUnalignedFragments == null || hasMoreUnalignedFragments) {
- hasMoreUnalignedFragments = unalignedIterator.nextFragment();
- lastUnalignedFragmentIndex++;
-
- if (hasMoreUnalignedFragments && !unalignedIterator.isAligned()) {
- return;
- }
- }
-
- if (!hasMoreUnalignedReads) {
- throw new RuntimeException("Cannot get next unaligned read - already at last one");
- }
-
- while (true) {
- hasMoreUnalignedReads = unalignedIterator.nextRead();
- lastUnalignedFragmentIndex = -1;
- if (!hasMoreUnalignedReads) {
- break;
- }
-
- // search for unaligned fragment
- do {
- hasMoreUnalignedFragments = unalignedIterator.nextFragment();
- lastUnalignedFragmentIndex++;
- } while (hasMoreUnalignedFragments && unalignedIterator.isAligned());
-
- // means that we found fragment
- if (hasMoreUnalignedFragments) {
- return;
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/sra/SRAUtils.java b/src/main/java/htsjdk/samtools/sra/SRAUtils.java
deleted file mode 100644
index e72caa8..0000000
--- a/src/main/java/htsjdk/samtools/sra/SRAUtils.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import ngs.ErrorMsg;
-import ngs.Read;
-import ngs.ReadCollection;
-import ngs.ReferenceIterator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Provides some functionality which can be used by other classes
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class SRAUtils {
- /**
- * References are stored in SRA table in chunks of 5k bases per row, while last chunk of a reference is less or
- * equal than 5k bases in size (even if the next reference follows).
- * So, it will be optimal if we align reference sizes to 5k bases to read by reference rows.
- */
- public static final int REFERENCE_ALIGNMENT = 5000;
-
- /**
- * Is used to build RecordRangeInfo
- * @param run open read collection
- * @return total number of reads (both aligned and unaligned) in SRA archive
- * @throws ErrorMsg
- */
- public static long getNumberOfReads(ReadCollection run) throws ErrorMsg {
- return run.getReadCount(Read.all);
- }
-
- /**
- * Loads reference lengths from a read collection.
- * Aligns reference lengths by REFERENCE_ALIGNMENT bases for optimal loads of alignments
- * (references are stored in REFERENCE_ALIGNMENT bases chunks in SRA table)
- *
- * Is used to build RecordRangeInfo
- * @param run single opened read collection
- * @return list with references lengths
- * @throws ErrorMsg
- */
- public static List<Long> getReferencesLengthsAligned(ReadCollection run) throws ErrorMsg {
- ReferenceIterator refIt = run.getReferences();
- List<Long> lengths = new ArrayList<Long>();
- while (refIt.nextReference()) {
- long refLen = refIt.getLength();
- // lets optimize references so they always align in 5000 bases positions
- if (refLen % REFERENCE_ALIGNMENT != 0) {
- refLen += REFERENCE_ALIGNMENT - (refLen % REFERENCE_ALIGNMENT);
- }
- lengths.add(refLen);
- }
- return lengths;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java b/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java
deleted file mode 100644
index ef1803b..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractAsyncWriter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * Abstract class that is designed to be extended and specialized to provide an asynchronous
- * wrapper around any kind of Writer class that takes an object and writes it out somehow.
- *
- * NOTE: Objects of subclasses of this class are not intended to be shared between threads.
- * In particular there must be only one thread that calls {@link #write} and {@link #close}.
- *
- * NOTE: Any exception thrown by the underlying Writer will be propagated back to the caller
- * during the next available call to {@link #write} or {@link #close}. After the exception
- * has been thrown to the caller, it is not safe to attempt further operations on the instance.
- *
- * @author Tim Fennell
- */
-public abstract class AbstractAsyncWriter<T> implements Closeable {
- private static volatile int threadsCreated = 0; // Just used for thread naming.
- public static final int DEFAULT_QUEUE_SIZE = 2000;
-
- private final AtomicBoolean isClosed = new AtomicBoolean(false);
- private final BlockingQueue<T> queue;
- private final Thread writer;
- private final WriterRunnable writerRunnable;
- private final AtomicReference<Throwable> ex = new AtomicReference<Throwable>(null);
-
- /** Returns the prefix to use when naming threads. */
- protected abstract String getThreadNamePrefix();
-
- protected abstract void synchronouslyWrite(final T item);
-
- protected abstract void synchronouslyClose();
-
- /**
- * Creates an AbstractAsyncWriter that will use the provided WriterRunnable to consume from the
- * internal queue and write records into the synchronous writer.
- */
- protected AbstractAsyncWriter(final int queueSize) {
- this.queue = new ArrayBlockingQueue<T>(queueSize);
- this.writerRunnable = new WriterRunnable();
- this.writer = new Thread(writerRunnable, getThreadNamePrefix() + threadsCreated++);
- this.writer.setDaemon(true);
- this.writer.start();
- }
-
- /**
- * Public method for sub-classes or ultimately consumers to put an item into the queue
- * to be written out.
- */
- public void write(final T item) {
- if (this.isClosed.get()) throw new RuntimeIOException("Attempt to add record to closed writer.");
-
- checkAndRethrow();
- try { this.queue.put(item); }
- catch (final InterruptedException ie) { throw new RuntimeException("Interrupted queueing item for writing.", ie); }
- checkAndRethrow();
- }
-
- /**
- * Attempts to finish draining the queue and then calls synchronouslyClose() to allow implementation
- * to do any one time clean up.
- */
- public void close() {
- checkAndRethrow();
-
- if (!this.isClosed.getAndSet(true)) {
- try {
- if (this.queue.isEmpty()) this.writer.interrupt(); // signal to writer clean up
- this.writer.join();
- } catch (final InterruptedException ie) {
- throw new RuntimeException("Interrupted waiting on writer thread.", ie);
- }
-
- //The queue should be empty but if it's not, we'll drain it here to protect against any lost data.
- //There's no need to timeout on poll because poll is called only when queue is not empty and
- // at this point the writer thread is definitely dead and noone is removing items from the queue.
- //The item pulled will never be null (same reasoning).
- while (!this.queue.isEmpty()) {
- final T item = queue.poll();
- synchronouslyWrite(item);
- }
-
- synchronouslyClose();
- checkAndRethrow();
- }
- }
-
- /**
- * Checks to see if an exception has been raised in the writer thread and if so rethrows it as an Error
- * or RuntimeException as appropriate.
- */
- private final void checkAndRethrow() {
- final Throwable t = this.ex.getAndSet(null);
- if (t != null) {
- this.isClosed.set(true); // Ensure no further attempts to write
- if (t instanceof Error) throw (Error) t;
- if (t instanceof RuntimeException) throw (RuntimeException) t;
- else throw new RuntimeException(t);
- }
- }
-
- /**
- * Small Runnable implementation that simply reads from the blocking queue and writes to the
- * synchronous writer.
- */
- private class WriterRunnable implements Runnable {
- public void run() {
- try {
- //The order of the two conditions is important, see https://github.com/samtools/htsjdk/issues/564
- //because we want to make sure that emptiness status of the queue does not change after we have evaluated isClosed
- //as it is now (isClosed checked before queue.isEmpty),
- //the two operations are effectively atomic if isClosed returns true
- while (!isClosed.get() || !queue.isEmpty()) {
- try {
- final T item = queue.poll(2, TimeUnit.SECONDS);
- if (item != null) synchronouslyWrite(item);
- }
- catch (final InterruptedException ie) {
- /* Do Nothing */
- }
- }
- }
- catch (final Throwable t) {
- ex.compareAndSet(null, t);
- // In case a writer was blocking on a full queue before ex has been set, clear the queue
- // so that the writer will no longer be blocked so that it can see the exception.
- queue.clear();
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractIterator.java b/src/main/java/htsjdk/samtools/util/AbstractIterator.java
deleted file mode 100644
index 2e75dc4..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractIterator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * Base class of implementing iterators. All you have to do is implement advance which gets
- * the next element.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public abstract class AbstractIterator<E> implements Iterator<E> {
- protected E next;
- private boolean iterating = false;
-
- @Override
- public boolean hasNext() {
- // If this is the start of iteration, queue up the first item
- if (!iterating) {
- next = advance();
- iterating = true;
- }
- return next != null;
- }
-
- @Override
- public E next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
-
- E ret = next;
- next = advance();
- return ret;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("Remove() not supported.");
- }
-
- /**
- * @return the next element or null if the iterator is at the end
- */
- protected abstract E advance();
-
- /**
- * Returns the next element in the iterator, if one exists. Otherwise, returns null. Invoking this method does not advance the iterator.
- * @return The next element in the iterator, without advancing, or, if no other element exists, null.
- */
- public E peek() {
- return next;
- }
-
- /**
- * @return true after the first time hasNext() or next() have been called
- */
- protected boolean isIterating() {
- return iterating;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java b/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java
deleted file mode 100644
index 4e02007..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractLocusInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * The unit of iteration for AbstractLocusIterator.
- * Holds information about the locus (the SAMSequenceRecord and 1-based position on the reference),
- * plus list of AbstractRecordAndOffset objects,
- * If <code>RecordAndOffset</code> class is used, one object represents one aligned read that overlaps the locus.
- * If <code>TypedRecordAndOffset</code> class is used, one object represents one aligned read,
- * that starts or ends at the locus.
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-public class AbstractLocusInfo<E extends AbstractRecordAndOffset> implements Locus {
- /**
- * Reference sequence, to which the reads are aligned.
- **/
- private final SAMSequenceRecord referenceSequence;
- /**
- * Position in the sequence, to which the reads are aligned.
- **/
- private final int position;
-
- /**
- * Initial size for the list of <code>AbstractRecordAndOffset</code> objects
- **/
- private final static int INITIAL_LIST_SIZE = 100;
-
- /**
- * List of aligned to current position reads
- **/
- private final List<E> recordAndOffsets = new ArrayList<>(INITIAL_LIST_SIZE);
-
- /**
- * @param referenceSequence reference sequence to which the reads are aligned
- * @param position position in the sequence to which the reads are aligned
- */
- public AbstractLocusInfo(final SAMSequenceRecord referenceSequence, final int position) {
- this.referenceSequence = referenceSequence;
- this.position = position;
- }
-
- /**
- * Accumulates info for one read aligned to the locus. Method doesn't check, that <code>recordAndOffset</code>
- * is really aligned to current reference position, so it must have valid reference sequence and
- * position or further processing can go wrong.
- *
- * @param recordAndOffset object to add to current locus
- */
- public void add(E recordAndOffset) {
- recordAndOffsets.add(recordAndOffset);
- }
-
- /**
- * @return the index of reference sequence
- */
- public int getSequenceIndex() {
- return referenceSequence.getSequenceIndex();
- }
-
- /**
- * @return 1-based reference position
- */
- public int getPosition() {
- return position;
- }
-
- /**
- * @deprecated since name of the method can be confusing, new implementation should be used
- * {@code getRecordAndOffsets()}
- * @return unmodifiable list of aligned to the reference position <code>recordsAndOffsets</code>
- */
- @Deprecated
- public List<E> getRecordAndPositions() {
- return Collections.unmodifiableList(recordAndOffsets);
- }
-
- /**
- * @return unmodifiable list of aligned to the reference position <code>recordsAndOffsets</code>
- */
- public List<E> getRecordAndOffsets() {
- return Collections.unmodifiableList(recordAndOffsets);
- }
-
- /**
- * @return the name of reference sequence
- */
- public String getSequenceName() {
- return referenceSequence.getSequenceName();
- }
-
- @Override
- public String toString() {
- return referenceSequence.getSequenceName() + ":" + position;
- }
-
- /**
- * @return the length of reference sequence
- */
- public int getSequenceLength() {
- return referenceSequence.getSequenceLength();
- }
-
- /**
- * @return the number of records overlapping the position
- */
- public int size() {
- return this.recordAndOffsets.size();
- }
-
- /**
- * @return <code>true</code> if RecordAndOffset list is empty;
- */
- public boolean isEmpty() {
- return getRecordAndOffsets().isEmpty();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java b/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java
deleted file mode 100644
index 6ff8e83..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractLocusIterator.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.filter.AggregateFilter;
-import htsjdk.samtools.filter.DuplicateReadFilter;
-import htsjdk.samtools.filter.FilteringSamIterator;
-import htsjdk.samtools.filter.SamRecordFilter;
-import htsjdk.samtools.filter.SecondaryOrSupplementaryFilter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list. If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out. Filtering may be changed
- * via setSamFilters().
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-
-public abstract class AbstractLocusIterator<T extends AbstractRecordAndOffset, K extends AbstractLocusInfo<T>> implements Iterable<K>, CloseableIterator<K> {
-
- static final Log LOG = Log.getInstance(AbstractLocusIterator.class);
-
- private final SamReader samReader;
- final private ReferenceSequenceMask referenceSequenceMask;
- private PeekableIterator<SAMRecord> samIterator;
- private List<SamRecordFilter> samFilters = Arrays.asList(new SecondaryOrSupplementaryFilter(),
- new DuplicateReadFilter());
- final List<Interval> intervals;
-
- /**
- * If true, do indexed lookup to improve performance. Not relevant if intervalList == null.
- * It is no longer the case the useIndex==true can make performance worse. It should always perform at least
- * as well as useIndex==false, and generally will be much faster.
- */
- private final boolean useIndex;
-
- /**
- * LocusInfos on this list are ready to be returned by iterator. All reads that overlap
- * the locus have been accumulated before the AbstractLocusInfo is moved into this list.
- */
- private final ArrayList<K> complete = new ArrayList<>(100);
-
- /**
- * LocusInfos for which accumulation is in progress. When {@link #accumulateSamRecord(SAMRecord)} is called
- * the state of this list is guaranteed to be either:
- * a) Empty, or
- * b) That the element at index 0 corresponds to the same genomic locus as the first aligned base
- * in the read being accumulated
- * <p>
- * Before each new read is accumulated the accumulator is examined and:
- * i) any LocusInfos at positions earlier than the read start are moved to {@link #complete}
- * ii) any uncovered positions between the last AbstractLocusInfo and the first aligned base of the new read
- * have LocusInfos created and added to {@link #complete} if we are emitting uncovered loci
- */
- final ArrayList<K> accumulator = new ArrayList<>(100);
-
- private int qualityScoreCutoff = Integer.MIN_VALUE;
- private int mappingQualityScoreCutoff = Integer.MIN_VALUE;
- private boolean includeNonPfReads = true;
-
- /**
- * If true, emit a AbstractLocusInfo for every locus in the target map, or if no target map,
- * emit a AbstractLocusInfo for every locus in the reference sequence.
- * If false, emit a AbstractLocusInfo only if a locus has coverage.
- */
- private boolean emitUncoveredLoci = true;
-
- /**
- * If set, this will cap the number of reads we accumulate for any given position.
- * Note that if we hit the maximum threshold at the first position in the accumulation queue,
- * then we throw further reads overlapping that position completely away (including for subsequent positions).
- * This is a useful feature if one wants to minimize the memory footprint in files with a few massively large pileups,
- * but it must be pointed out that it could cause major bias because of the non-random nature with which the cap is
- * applied (the first maxReadsToAccumulatePerLocus reads are kept and all subsequent ones are dropped).
- */
- private int maxReadsToAccumulatePerLocus = Integer.MAX_VALUE;
-
- /**
- * Set to true when we have enforced the accumulation limit for the first time
- */
- private boolean enforcedAccumulationLimit = false;
-
- /**
- * If true, include indels in the LocusInfo
- */
- protected boolean includeIndels = false;
-
- /**
- * When there is a target mask, these members remember the last locus for which a AbstractLocusInfo has been
- * returned, so that any uncovered locus in the target mask can be covered by a 0-coverage AbstractLocusInfo
- */
- private int lastReferenceSequence = 0;
-
- /**
- * Last processed locus position in the reference
- */
- private int lastPosition = 0;
-
- /**
- * Set to true when past all aligned reads in input SAM file
- */
- private boolean finishedAlignedReads = false;
-
- private final LocusComparator<Locus> locusComparator = new LocusComparator<>();
-
- /**
- * Last processed interval, relevant only if list of intervals is defined.
- */
- private int lastInterval = 0;
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments
- *
- * @param samReader must be coordinate sorted
- * @param intervalList Either the list of desired intervals, or null. Note that if an intervalList is
- * passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
- * @param useIndex If true, do indexed lookup to improve performance. Not relevant if intervalList == null.
- * It is no longer the case the useIndex==true can make performance worse. It should always perform at least
- * as well as useIndex==false, and generally will be much faster.
- */
-
- public AbstractLocusIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
- final String className = this.getClass().getSimpleName();
- if (samReader.getFileHeader().getSortOrder() == null || samReader.getFileHeader().getSortOrder() == SAMFileHeader.SortOrder.unsorted) {
-
- LOG.warn(className + " constructed with samReader that has SortOrder == unsorted. ", "" +
- "Assuming SAM is coordinate sorted, but exceptions may occur if it is not.");
- } else if (samReader.getFileHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- throw new SAMException(className + " cannot operate on a SAM file that is not coordinate sorted.");
- }
- this.samReader = samReader;
- this.useIndex = useIndex;
- if (intervalList != null) {
- intervals = intervalList.uniqued().getIntervals();
- this.referenceSequenceMask = new IntervalListReferenceSequenceMask(intervalList);
- } else {
- intervals = null;
- this.referenceSequenceMask = new WholeGenomeReferenceSequenceMask(samReader.getFileHeader());
- }
- }
-
- /**
- * @return iterator over all/all covered locus position in reference according to <code>emitUncoveredLoci</code>
- * value.
- */
- public Iterator<K> iterator() {
- if (samIterator != null) {
- throw new IllegalStateException("Cannot call iterator() more than once on " + this.getClass().getSimpleName());
- }
- CloseableIterator<SAMRecord> tempIterator;
- if (intervals != null) {
- tempIterator = new SamRecordIntervalIteratorFactory().makeSamRecordIntervalIterator(samReader, intervals, useIndex);
- } else {
- tempIterator = samReader.iterator();
- }
- if (samFilters != null) {
- tempIterator = new FilteringSamIterator(tempIterator, new AggregateFilter(samFilters));
- }
- samIterator = new PeekableIterator<>(tempIterator);
- return this;
- }
-
- /**
- * Closes inner <code>SamIterator</>.
- */
- public void close() {
- this.samIterator.close();
- }
-
- private boolean samHasMore() {
- return !finishedAlignedReads && (samIterator.peek() != null);
- }
-
- /**
- * Returns true if there are more AbstractLocusInfo<T> objects that can be returned, due to any of the following reasons:
- * 1) there are more aligned reads in the SAM file
- * 2) there are AbstractLocusInfo<T>s in some stage of accumulation
- * 3) there are loci in the target mask that have yet to be accumulated (even if there are no reads covering them)
- */
- public boolean hasNext() {
- if (this.samIterator == null) {
- iterator();
- }
-
- while (complete.isEmpty() && ((!accumulator.isEmpty()) || samHasMore() || hasRemainingMaskBases())) {
- final K locusInfo = next();
- if (locusInfo != null) {
- complete.add(0, locusInfo);
- }
- }
- return !complete.isEmpty();
- }
-
- /**
- * @return true if there are more bases at which the locus iterator must emit AbstractLocusInfo<T>s because
- * there are loci beyond the last emitted loci which are in the set of loci to be emitted and
- * the iterator is setup to emit uncovered loci - so we can guarantee we'll emit those loci.
- */
- private boolean hasRemainingMaskBases() {
- // if there are more sequences in the mask, by definition some of them must have
- // marked bases otherwise if we're in the last sequence, but we're not at the last marked position,
- // there is also more in the mask
- if (!emitUncoveredLoci) {
- // If not emitting uncovered loci, this check is irrelevant
- return false;
- }
- return (lastReferenceSequence < referenceSequenceMask.getMaxSequenceIndex() ||
- (lastReferenceSequence == referenceSequenceMask.getMaxSequenceIndex() &&
- lastPosition < referenceSequenceMask.nextPosition(lastReferenceSequence, lastPosition)));
- }
-
- /**
- * hasNext() has been fixed so that if it returns true, next() is now guaranteed not to return null.
- *
- * @return information about next locus position in reference sequence
- */
- public K next() {
- // if we don't have any completed entries to return, try and make some!
- while (complete.isEmpty() && samHasMore()) {
- final SAMRecord rec = samIterator.peek();
-
- // There might be unmapped reads mixed in with the mapped ones, but when a read
- // is encountered with no reference index it means that all the mapped reads have been seen.
- if (rec.getReferenceIndex() == -1) {
- this.finishedAlignedReads = true;
- continue;
-
- }
- // Skip over an unaligned read that has been forced to be sorted with the aligned reads
- if (rec.getReadUnmappedFlag()
- || rec.getMappingQuality() < this.mappingQualityScoreCutoff
- || (!this.includeNonPfReads && rec.getReadFailsVendorQualityCheckFlag())) {
- samIterator.next();
- continue;
- }
-
- int start = rec.getAlignmentStart();
- // only if we are including indels and the record does not start in the first base of the reference
- // the stop locus to populate the queue is not the same if the record starts with an insertion
- if (includeIndels && start != 1 && startWithInsertion(rec.getCigar())) {
- // the start to populate is one less
- start--;
- }
- final Locus alignmentStart = new LocusImpl(rec.getReferenceIndex(), start);
- // emit everything that is before the start of the current read, because we know no more
- // coverage will be accumulated for those loci.
- while (!accumulator.isEmpty() && locusComparator.compare(accumulator.get(0), alignmentStart) < 0) {
- final K first = accumulator.get(0);
- populateCompleteQueue(alignmentStart);
- if (!complete.isEmpty()) {
- return complete.remove(0);
- }
- if (!accumulator.isEmpty() && first == accumulator.get(0)) {
- throw new SAMException("Stuck in infinite loop");
- }
- }
-
- // at this point, either the accumulator list is empty or the head should
- // be the same position as the first base of the read (or insertion if first)
- if (!accumulator.isEmpty()) {
- if (accumulator.get(0).getSequenceIndex() != rec.getReferenceIndex() ||
- accumulator.get(0).getPosition() != start) {
- throw new IllegalStateException("accumulator should be empty or aligned with current SAMRecord");
- }
- }
-
- // Store the loci for the read in the accumulator
- if (!surpassedAccumulationThreshold()) {
- accumulateSamRecord(rec);
- // Store the indels if requested
- if (includeIndels) {
- accumulateIndels(rec);
- }
- }
- samIterator.next();
- }
-
- final Locus endLocus = new LocusImpl(Integer.MAX_VALUE, Integer.MAX_VALUE);
- // if we have nothing to return to the user, and we're at the end of the SAM iterator,
- // push everything into the complete queue
- if (complete.isEmpty() && !samHasMore()) {
- while (!accumulator.isEmpty()) {
- populateCompleteQueue(endLocus);
- if (!complete.isEmpty()) {
- return complete.remove(0);
- }
- }
- }
-
- // if there are completed entries, return those
- if (!complete.isEmpty()) {
- return complete.remove(0);
- } else if (emitUncoveredLoci) {
- final Locus afterLastMaskPositionLocus = new LocusImpl(referenceSequenceMask.getMaxSequenceIndex(),
- referenceSequenceMask.getMaxPosition() + 1);
- // In this case... we're past the last read from SAM so see if we can
- // fill out any more (zero coverage) entries from the mask
- return createNextUncoveredLocusInfo(afterLastMaskPositionLocus);
- } else {
- return null;
- }
- }
-
-
- /**
- * @return true if we have surpassed the maximum accumulation threshold for the first locus in the accumulator, false otherwise
- */
-
- private boolean surpassedAccumulationThreshold() {
- final boolean surpassesThreshold = !accumulator.isEmpty() && accumulator.get(0).getRecordAndOffsets().size() >= maxReadsToAccumulatePerLocus;
- if (surpassesThreshold && !enforcedAccumulationLimit) {
- LOG.warn("We have encountered greater than " + maxReadsToAccumulatePerLocus + " reads at position " + accumulator.get(0).toString() + " and will ignore the remaining reads at this position. Note that further warnings will be suppressed.");
- enforcedAccumulationLimit = true;
- }
- return surpassesThreshold;
- }
-
- /**
- * Capture the loci covered by the given SAMRecord in the LocusInfos in the accumulator,
- * creating new LocusInfos as needed.
- *
- * @param rec record to add to accumulator
- */
- abstract void accumulateSamRecord(final SAMRecord rec);
-
-
- /**
- * Requires that the accumulator for the record is previously fill with
- * {@link #accumulateSamRecord(htsjdk.samtools.SAMRecord)}.
- * Include in the LocusInfo the indels; the quality threshold does not affect insertions/deletions
- */
- abstract void accumulateIndels(final SAMRecord rec);
-
- /**
- * @param rec aligned SamRecord
- * @param readOffset offset from start of read
- * @param length length of aligned block
- * @param refPosition position in the reference sequence
- * @return RecordAndOffset
- */
- abstract T createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPosition);
-
- /**
- * Create the next relevant zero-coverage AbstractLocusInfo<T>
- *
- * @param stopBeforeLocus don't go up to this sequence and position
- * @return a zero-coverage AbstractLocusInfo<T>, or null if there is none before the stopBefore locus
- */
- private K createNextUncoveredLocusInfo(final Locus stopBeforeLocus) {
- while (lastReferenceSequence <= stopBeforeLocus.getSequenceIndex() &&
- lastReferenceSequence <= referenceSequenceMask.getMaxSequenceIndex()) {
-
- if (lastReferenceSequence == stopBeforeLocus.getSequenceIndex() &&
- lastPosition + 1 >= stopBeforeLocus.getPosition()) {
- return null;
- }
-
- final int nextbit = referenceSequenceMask.nextPosition(lastReferenceSequence, lastPosition);
-
- // try the next reference sequence
- if (nextbit == -1) {
- // No more in this reference sequence
- if (lastReferenceSequence == stopBeforeLocus.getSequenceIndex()) {
- lastPosition = stopBeforeLocus.getPosition();
- return null;
- }
- lastReferenceSequence++;
- lastPosition = 0;
- } else if (lastReferenceSequence < stopBeforeLocus.getSequenceIndex() || nextbit < stopBeforeLocus.getPosition()) {
- lastPosition = nextbit;
- return createLocusInfo(getReferenceSequence(lastReferenceSequence), lastPosition);
- } else if (nextbit >= stopBeforeLocus.getPosition()) {
- return null;
- }
- }
- return null;
- }
-
- /**
- * @param referenceSequence processed reference sequence
- * @param lastPosition last processed reference locus position
- * @return <code>AbstractLocusInfo<T></code> for the lastPosition
- */
- abstract K createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition);
-
- /**
- * Pop the first entry from the AbstractLocusInfo<T> accumulator into the complete queue. In addition,
- * check the ReferenceSequenceMask and if there are intervening mask positions between the last popped base and the one
- * about to be popped, put those on the complete queue as well.
- * Note that a single call to this method may not empty the accumulator completely, or even
- * empty it at all, because it may just put a zero-coverage AbstractLocusInfo<T> into the complete queue.
- *
- * @param stopBeforeLocus don't go up to this sequence and position
- */
- private void populateCompleteQueue(final Locus stopBeforeLocus) {
- // Because of gapped alignments, it is possible to create LocusInfo's with no reads associated with them.
- // Skip over these if not including indels
- while (!accumulator.isEmpty() && accumulator.get(0).isEmpty() &&
- locusComparator.compare(accumulator.get(0), stopBeforeLocus) < 0) {
- accumulator.remove(0);
- }
- if (accumulator.isEmpty()) {
- return;
- }
- final K locusInfo = accumulator.get(0);
- if (locusComparator.compare(stopBeforeLocus, locusInfo) <= 0) {
- return;
- }
-
- // If necessary, emit a zero-coverage LocusInfo
- if (emitUncoveredLoci) {
- final K zeroCoverage = createNextUncoveredLocusInfo(locusInfo);
- if (zeroCoverage != null) {
- complete.add(zeroCoverage);
- return;
- }
- }
-
- // At this point we know we're going to process the LocusInfo, so remove it from the accumulator.
- accumulator.remove(0);
-
- // fill in any gaps based on our genome mask
- final int sequenceIndex = locusInfo.getSequenceIndex();
-
-
- // only add to the complete queue if it's in the mask (or we have no mask!)
- if (referenceSequenceMask.get(locusInfo.getSequenceIndex(), locusInfo.getPosition())) {
- complete.add(locusInfo);
- }
-
- lastReferenceSequence = sequenceIndex;
- lastPosition = locusInfo.getPosition();
- }
-
- protected SAMSequenceRecord getReferenceSequence(final int referenceSequenceIndex) {
- return samReader.getFileHeader().getSequence(referenceSequenceIndex);
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Can not remove records from a SAM file via an iterator!");
- }
-
- /**
- * Check if cigar start with an insertion, ignoring other operators that do not consume references bases
- *
- * @param cigar the cigar
- * @return <code>true</code> if the first operator to consume reference bases or be an insertion, is an insertion; <code>false</code> otherwise
- */
- protected static boolean startWithInsertion(final Cigar cigar) {
- for (final CigarElement element : cigar.getCigarElements()) {
- if (element.getOperator() == CigarOperator.I) return true;
- if (!element.getOperator().consumesReferenceBases()) continue;
- break;
- }
- return false;
- }
-
- // --------------------------------------------------------------------------------------------
- // Helper methods below this point...
- // --------------------------------------------------------------------------------------------
-
- /**
- * Controls which, if any, SAMRecords are filtered. By default duplicate reads and non-primary alignments
- * are filtered out. The list of filters passed here replaces any existing filters.
- *
- * @param samFilters list of filters, or null if no filtering is desired.
- */
- public void setSamFilters(final List<SamRecordFilter> samFilters) {
- this.samFilters = samFilters;
- }
-
- public int getQualityScoreCutoff() {
- return qualityScoreCutoff;
- }
-
- public void setQualityScoreCutoff(final int qualityScoreCutoff) {
- this.qualityScoreCutoff = qualityScoreCutoff;
- }
-
- public int getMappingQualityScoreCutoff() {
- return mappingQualityScoreCutoff;
- }
-
- public void setMappingQualityScoreCutoff(final int mappingQualityScoreCutoff) {
- this.mappingQualityScoreCutoff = mappingQualityScoreCutoff;
- }
-
- public boolean isIncludeNonPfReads() {
- return includeNonPfReads;
- }
-
- public void setIncludeNonPfReads(final boolean includeNonPfReads) {
- this.includeNonPfReads = includeNonPfReads;
- }
-
- public boolean isEmitUncoveredLoci() {
- return emitUncoveredLoci;
- }
-
- public void setEmitUncoveredLoci(final boolean emitUncoveredLoci) {
- this.emitUncoveredLoci = emitUncoveredLoci;
- }
-
- public int getMaxReadsToAccumulatePerLocus() {
- return maxReadsToAccumulatePerLocus;
- }
-
- /**
- * If set, this will cap the number of reads we accumulate for any given position.
- * As is pointed out above, setting this could cause major bias because of the non-random nature with which the
- * cap is applied (the first maxReadsToAccumulatePerLocus reads are kept and all subsequent ones are dropped).
- */
- public void setMaxReadsToAccumulatePerLocus(final int maxReadsToAccumulatePerLocus) {
- this.maxReadsToAccumulatePerLocus = maxReadsToAccumulatePerLocus;
- }
-
- protected List<Interval> getIntervals() {
- return intervals;
- }
-
- protected Interval getCurrentInterval() {
- if (intervals == null) return null;
- return intervals.get(lastInterval);
- }
-
- public boolean isIncludeIndels() {
- return includeIndels;
- }
-
- public void setIncludeIndels(final boolean includeIndels) {
- this.includeIndels = includeIndels;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java b/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java
deleted file mode 100644
index de1f694..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractProgressLogger.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-
-/**
- * Abstract implementation of a Little progress logging class to facilitate consistent output of useful information when progressing
- * through a stream of SAM records.
- *
- * Concrete subclasses must provide the logger
- */
-abstract public class AbstractProgressLogger implements ProgressLoggerInterface {
- private final int n;
- private final String verb;
- private final String noun;
- private final long startTime = System.currentTimeMillis();
- private final NumberFormat fmt = new DecimalFormat("#,###");
- private final NumberFormat timeFmt = new DecimalFormat("00");
- private long processed = 0;
- // Set to -1 until the first record is added
- private long lastStartTime = -1;
-
- /**
- * Construct an AbstractProgressLogger.
- *
- * This must be called by any subclasses
- *
- * @param n the frequency with which to output (i.e. every N records)
- * @param verb the verb to log, e.g. "Processed, Read, Written".
- * @param noun the noun to use when logging, e.g. "Records, Variants, Loci"
- */
- protected AbstractProgressLogger(final String noun, final String verb, final int n) {
- this.noun = noun;
- this.verb = verb;
- this.n = n;
- }
-
- /**
- * Log a message to whatever logger is being used
- *
- * @param message a message to be logged by the logger (recommended output level is INFO or the equivalent)
- */
- abstract protected void log(String ... message);
-
- @Override
- public synchronized boolean record(final String chrom, final int pos) {
- if (this.lastStartTime == -1) this.lastStartTime = System.currentTimeMillis();
- if (++this.processed % this.n == 0) {
- final long now = System.currentTimeMillis();
- final long lastPeriodSeconds = (now - this.lastStartTime) / 1000;
- this.lastStartTime = now;
-
- final long seconds = (System.currentTimeMillis() - startTime) / 1000;
- final String elapsed = formatElapseTime(seconds);
- final String period = pad(fmt.format(lastPeriodSeconds), 4);
- final String processed = pad(fmt.format(this.processed), 13);
-
- final String readInfo;
- if (chrom == null) readInfo = "*/*";
- else readInfo = chrom + ":" + fmt.format(pos);
-
- log(this.verb, " ", processed, " " + noun + ". Elapsed time: ", elapsed, "s. Time for last ", fmt.format(this.n),
- ": ", period, "s. Last read position: ", readInfo);
- return true;
- }
- else {
- return false;
- }
- }
-
- /**
- * Records that a given record has been processed and triggers logging if necessary.
- * @return boolean true if logging was triggered, false otherwise
- */
- @Override
- public synchronized boolean record(final SAMRecord rec) {
- if (SAMRecord.NO_ALIGNMENT_REFERENCE_NAME.equals(rec.getReferenceName())) {
- return record(null, 0);
- }
- else {
- return record(rec.getReferenceName(), rec.getAlignmentStart());
- }
- }
-
- /** Records multiple SAMRecords and triggers logging if necessary. */
- @Override
- public boolean record(final SAMRecord... recs) {
- boolean triggered = false;
- for (final SAMRecord rec : recs) triggered = record(rec) || triggered;
- return triggered;
- }
-
- /** Returns the count of records processed. */
- public synchronized long getCount() { return this.processed; }
-
- /** Returns the number of seconds since progress tracking began. */
- public long getElapsedSeconds() { return (System.currentTimeMillis() - this.startTime) / 1000; }
-
- /** Left pads a string until it is at least the given length. */
- private String pad (String in, final int length) {
- while (in.length() < length) {
- in = " " + in;
- }
-
- return in;
- }
-
- /** Formats a number of seconds into hours:minutes:seconds. */
- private String formatElapseTime(final long seconds) {
- final long s = seconds % 60;
- final long allMinutes = seconds / 60;
- final long m = allMinutes % 60;
- final long h = allMinutes / 60;
-
- return timeFmt.format(h) + ":" + timeFmt.format(m) + ":" + timeFmt.format(s);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java b/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java
deleted file mode 100644
index 28b9d34..0000000
--- a/src/main/java/htsjdk/samtools/util/AbstractRecordAndOffset.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Holds a SAMRecord plus the zero-based offset into that SAMRecord's bases and quality scores that corresponds
- * to the base and quality at the genomic position described the containing AbstractLocusInfo. One object represents
- * one base for <code>SamLocusIterator.RecordAndOffset</code> implementation or one alignment block of
- * <code>SAMRecord</code> for <code>TypedRecordAndOffset</code> implementation.
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class AbstractRecordAndOffset {
-
- /**
- * A SAMRecord aligned to reference position
- */
- protected final SAMRecord record;
- /**
- * Zero-based offset in the read corresponding to the current position in AbstractLocusInfo
- */
- protected final int offset;
-
- /**
- * @param record inner SAMRecord
- * @param offset from the start of the read
- * @param length of alignment block
- * @param refPos corresponding to read offset reference position
- */
- public AbstractRecordAndOffset(final SAMRecord record, final int offset, int length, int refPos) {
- this(record, offset);
- }
-
- /**
- * @param record inner SAMRecord
- * @param offset from the start of the read
- */
- public AbstractRecordAndOffset(final SAMRecord record, final int offset) {
- this.offset = offset;
- this.record = record;
- }
-
- /**
- * @return offset of aligned read base from the start of the read.
- */
- public int getOffset() {
- return offset;
- }
-
- /**
- * @return inner <code>SAMRecord</code> object.
- */
- public SAMRecord getRecord() {
- return record;
- }
-
- /**
- * @return the read base according to <code>offset</code>.
- */
- public byte getReadBase() {
- return record.getReadBases()[offset];
- }
-
- /**
- * @return the length of alignment block represented by the object.
- */
- public int getLength() {
- return 1;
- }
-
- /**
- * @return the position in reference sequence, to which the start of alignment block is aligned.
- */
- public int getRefPos() {
- return -1;
- }
-
- /**
- * @return read name of inner SAMRecord.
- */
- public String getReadName() {
- return record.getReadName();
- }
-
- /**
- * @return array of base qualities of inner SAMRecord.
- */
- public byte[] getBaseQualities() {
- return record.getBaseQualities();
- }
-
- /**
- * @return the base quality according to <code>offset</code>.
- */
- public byte getBaseQuality() {
- return record.getBaseQualities()[offset];
- }
-
- protected void validateOffset(int offset, final byte[] array) {
- if (offset < 0 || offset >= array.length) {
- throw new IllegalArgumentException("The requested position is not covered by this " + this.getClass().getSimpleName() +
- " object.");
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AsciiWriter.java b/src/main/java/htsjdk/samtools/util/AsciiWriter.java
deleted file mode 100644
index 00c6f7f..0000000
--- a/src/main/java/htsjdk/samtools/util/AsciiWriter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * Fast (I hope) buffered Writer that converts char to byte merely by casting, rather than charset conversion.
- */
-public class AsciiWriter extends Writer {
-
- private final OutputStream os;
- // Buffer size has not been tuned.
- private final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
- private int numBytes;
-
- /**
- * @param os need not be buffered as this class buffers
- */
- public AsciiWriter(final OutputStream os) {
- this.os = os;
- numBytes = 0;
- }
-
- /**
- * flushes and closes underlying OutputStream.
- */
- public void close() throws IOException {
- flush();
- os.close();
- }
-
- /**
- * flushes underlying OutputStream
- */
- public void flush() throws IOException {
- os.write(buffer, 0, numBytes);
- numBytes = 0;
- os.flush();
- }
-
- /**
- * All other Writer methods vector through this, so this is the only one that must be overridden.
- */
- public void write(final char[] chars, int offset, int length) throws IOException {
- while (length > 0) {
- final int charsToConvert = Math.min(length, buffer.length - numBytes);
- StringUtil.charsToBytes(chars, offset, charsToConvert, buffer, numBytes);
- numBytes += charsToConvert;
- offset += charsToConvert;
- length -= charsToConvert;
- if (numBytes == buffer.length) {
- os.write(buffer, 0, numBytes);
- numBytes = 0;
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java b/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java
deleted file mode 100644
index bf78ecb..0000000
--- a/src/main/java/htsjdk/samtools/util/AsyncBufferedIterator.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Daniel Cameron
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Iterator that uses a dedicated background thread to perform read-ahead to improve
- * throughput at the expense of increased latency. This iterator will block
- * until the background thread has read a full buffer of records.
- *
- * Note that this implementation is not synchronized. If multiple threads
- * access an instance concurrently, it must be synchronized externally.
- *
- * @author Daniel Cameron
- *
- */
-public class AsyncBufferedIterator<T> implements CloseableIterator<T> {
- private static final Log log = Log.getInstance(AsyncBufferedIterator.class);
- private static final AtomicInteger threadsCreated = new AtomicInteger(0);
- private final int bufferSize;
- /**
- * A dedicated background thread is required since these iterators can be chained
- * thus able to block on each other. Usage of a thread pool would result in
- * a deadlock due to task dependencies.
- */
- private Thread backgroundThread;
- private final Iterator<T> underlyingIterator;
- private final BlockingQueue<IteratorBuffer<T>> buffers;
- private IteratorBuffer<T> currentBlock = new IteratorBuffer<>(Collections.emptyList());
-
- /**
- * Creates a new iterator that traverses the given iterator on a background
- * thread
- *
- * @param iterator iterator to traverse
- * @param bufferSize size of read-ahead buffer. A larger size will increase both throughput and latency.
- * Double buffering is used so the maximum number of records on which read-ahead is performed is twice this.
- */
- public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize) {
- this(iterator, bufferSize, 1, null);
- }
-
- /**
- * Creates a new iterator that traverses the given iterator on a background
- * thread
- *
- * @param iterator iterator to traverse
- * @param bufferSize size of each read-ahead buffer. A larger size will increase both throughput and latency.
- * @param bufferCount number of read-ahead buffers
- */
- public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize, final int bufferCount) {
- this(iterator, bufferSize, bufferCount, null);
- }
-
- /**
- * Creates a new iterator that traverses the given iterator on a background
- * thread
- *
- * @param iterator iterator to traverse
- * @param bufferSize size of each read-ahead buffer. A larger size will increase both throughput and latency.
- * @param bufferCount number of read-ahead buffers
- * @param threadName background thread name. A name will be automatically generated if this parameter is null.
- */
- public AsyncBufferedIterator(final Iterator<T> iterator, final int bufferSize, final int bufferCount, final String threadName) {
- if (iterator == null) throw new IllegalArgumentException("iterator cannot be null");
- if (bufferCount <= 0) throw new IllegalArgumentException("Must use at least 1 buffer.");
- if (bufferSize <= 0) throw new IllegalArgumentException("Buffer size must be at least 1 record.");
- this.underlyingIterator = iterator;
- this.buffers = new ArrayBlockingQueue<>(bufferCount);
- this.bufferSize = bufferSize;
- int threadNumber = threadsCreated.incrementAndGet();
- this.backgroundThread = new Thread(new Runnable() {
- @Override
- public void run() {
- backgroundRun();
- }
- }, threadName != null ? threadName : getThreadNamePrefix() + threadNumber);
- this.backgroundThread.setDaemon(true);
- log.debug("Starting thread " + this.backgroundThread.getName());
- this.backgroundThread.start();
- }
-
- protected String getThreadNamePrefix() {
- return AsyncBufferedIterator.class.getSimpleName();
- }
-
- @Override
- public void close() {
- if (backgroundThread != null) {
- try {
- backgroundThread.interrupt();
- buffers.clear();
- backgroundThread.join();
- } catch (InterruptedException ie) {
- throw new RuntimeException("Interrupted waiting for background thread to complete", ie);
- } finally {
- CloserUtil.close(underlyingIterator);
- backgroundThread = null;
- currentBlock = null;
- }
- }
- }
-
- private void ensureHasNext() {
- if (!currentBlock.hasNext()) {
- // Rethrow any exceptions raised on the background thread
- // at the point the exception would have been encountered
- // if we had performed synchronous iteration
- raiseBackgroundThreadException();
- if (!currentBlock.isEndOfStream()) {
- try {
- // Load the next block
- // All exceptions on the background thread are swallowed (except InterruptedException)
- // so there's no risk of blocking forever except when the background thread is
- // interrupted as we aren't. This does not happen during normal operation as
- // interrupting the background thread should only happen during the close() method.
- currentBlock = buffers.take();
- } catch (InterruptedException e) {
- throw new RuntimeException("Error reading from background thread", e);
- }
- }
- }
- }
-
- @Override
- public boolean hasNext() {
- if (backgroundThread == null) {
- throw new IllegalStateException("iterator has been closed");
- }
- ensureHasNext();
- return currentBlock.hasNext();
- }
-
- /**
- * Raises any exception encountered when processing records on
- * the background thread back to the foreground caller
- * @throws Error
- */
- private void raiseBackgroundThreadException() throws Error {
- Throwable t = currentBlock.getException();
- if (t != null) {
- if (t instanceof Error) {
- throw (Error) t;
- } else if (t instanceof RuntimeException) {
- throw (RuntimeException) t;
- } else {
- throw new RuntimeException(t);
- }
- }
- }
-
- @Override
- public T next() {
- if (hasNext()) {
- return currentBlock.next();
- }
- throw new NoSuchElementException("next");
- }
-
- /**
- * Performs 1 buffer worth of read-ahead on the underlying iterator
- * (background thread method)
- */
- private IteratorBuffer<T> readAhead() {
- List<T> readAhead = null;
- try {
- if (!underlyingIterator.hasNext()) return new IteratorBuffer<>();
- readAhead = new ArrayList<>(bufferSize);
- for (int i = 0; i < bufferSize && underlyingIterator.hasNext(); i++) {
- if (Thread.currentThread().isInterrupted()) {
- // eager abort if we've been told to stop
- return new IteratorBuffer<>(readAhead, new InterruptedException());
- }
- readAhead.add(underlyingIterator.next());
- }
- return new IteratorBuffer<>(readAhead);
- } catch (Throwable t) {
- // Catch absolutely everything so we can try to raise it on the foreground thread
- return new IteratorBuffer<>(readAhead, t);
- }
- }
- /**
- * Background thread run loop
- * @throws InterruptedException
- */
- private void backgroundRun() {
- try {
- IteratorBuffer<T> block;
- do {
- block = readAhead();
- if (block.getException() instanceof InterruptedException) {
- // stop thread immediately if we've been told to stop
- return;
- }
- buffers.put(block);
- } while (!block.isEndOfStream());
- } catch (InterruptedException e) {
- // stop thread
- }
- }
- /**
- * Block of records from the underlying iterator
- */
- private static class IteratorBuffer<U> implements Iterator<U> {
- private final Throwable exception;
- private final Iterator<U> it;
- public IteratorBuffer(Iterable<U> it) {
- this.it = it != null ? it.iterator() : null;;
- this.exception = null;
- }
-
- /**
- * Record block with exception thrown when attempting to retrieve the next record
- * @param it records successfully iterated over
- * @param exception exception thrown when attempting to iterate over the next record
- */
- public IteratorBuffer(Iterable<U> it, Throwable exception) {
- this.it = it != null ? it.iterator() : null;
- this.exception = exception;
- }
-
- /**
- * Record block indicating end of stream
- */
- public IteratorBuffer() {
- this.it = null;
- this.exception = null;
- }
-
- @Override
- public boolean hasNext() {
- return it != null && it.hasNext();
- }
-
- @Override
- public U next() {
- return it.next();
- }
-
- public boolean isEndOfStream() {
- return it == null;
- }
-
- /**
- * Exception thrown when attempting to retrieve records from the underlying stream
- * @return exception thrown on background thread, null if no exception occurred
- */
- public Throwable getException() {
- return exception;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BinaryCodec.java b/src/main/java/htsjdk/samtools/util/BinaryCodec.java
deleted file mode 100644
index 8933ee3..0000000
--- a/src/main/java/htsjdk/samtools/util/BinaryCodec.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.SyncFailedException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Encapsulates file representation of various primitive data types. Forces little-endian disk representation.
- * Note that this class is currently not very efficient. There are plans to increase the size of the ByteBuffer,
- * and move data between the ByteBuffer and the underlying input or output stream in larger chunks.
- *
- * All the read methods throw RuntimeEOFException if the input stream is exhausted before the required number
- * of bytes are read.
- *
- * @author Dave Tefft
- */
-public class BinaryCodec implements Closeable {
-
- //Outstream to write to
- private OutputStream outputStream;
- //If a file or filename was given it will be stored here. Used for error reporting.
- private String outputFileName;
-
- //Input stream to read from
- private InputStream inputStream;
- //If a file or filename was give to read from it will be stored here. Used for error reporting.
- private String inputFileName;
-
- /*
- Mode that the BinaryCodec is in. It is either writing to a binary file or reading from.
- This is set to true if it is writing to a binary file
- Right now we don't support reading and writing to the same file with the same BinaryCodec instance
- */
- private boolean isWriting;
-
- /**
- * For byte swapping.
- */
- private ByteBuffer byteBuffer;
-
- /**
- * For reading Strings of known length, this can reduce object creation
- */
- private final byte[] scratchBuffer = new byte[16];
-
- // Byte order used in BAM files.
- private static final ByteOrder LITTLE_ENDIAN = ByteOrder.LITTLE_ENDIAN;
- private static final byte NULL_BYTE[] = {0};
-
- public static final long MAX_UBYTE = (Byte.MAX_VALUE * 2) + 1;
- public static final long MAX_USHORT = (Short.MAX_VALUE * 2) + 1;
- public static final long MAX_UINT = ((long)Integer.MAX_VALUE * 2) + 1;
-
- // We never serialize more than this much at a time (except for Strings)
- private static final int MAX_BYTE_BUFFER = 8;
-
- //////////////////////////////////////////////////
- // Constructors //
- //////////////////////////////////////////////////
-
- /**
- * Constructs BinaryCodec from a file and set it's mode to writing or not
- *
- * @param file file to be written to or read from
- * @param writing whether the file is being written to
- */
- public BinaryCodec(final File file, final boolean writing) {
- this();
- try {
- this.isWriting = writing;
- if (this.isWriting) {
- this.outputStream = IOUtil.maybeBufferOutputStream(new FileOutputStream(file));
- this.outputFileName = file.getName();
- } else {
- this.inputStream = IOUtil.maybeBufferInputStream(new FileInputStream(file));
- this.inputFileName = file.getName();
- }
- } catch (FileNotFoundException e) {
- throw new RuntimeIOException("File not found: " + file, e);
- }
- }
-
- /**
- * Constructs BinaryCodec from a file name and set it's mode to writing or not
- *
- * @param fileName name of the file to be written to or read from
- * @param writing writing whether the file is being written to
- */
- public BinaryCodec(final String fileName, final boolean writing) {
- this(new File(fileName), writing);
- }
-
- /**
- * Constructs BinaryCodec from an output stream
- *
- * @param outputStream Stream to write to, since it's an output stream we know that isWriting
- * should be set to true
- */
- public BinaryCodec(final OutputStream outputStream) {
- this();
- setOutputStream(outputStream);
- }
-
- /**
- * Constructs BinaryCodec from an input stream
- *
- * @param inputStream Stream to read from, since we are reading isWriting is set to false
- */
- public BinaryCodec(final InputStream inputStream) {
- this();
- setInputStream(inputStream);
- }
-
- /**
- * Ambiguous whether reading or writing until set{In,Out}putStream is called
- */
- public BinaryCodec() {
- initByteBuffer();
- }
-
- /**
- * Shared among ctors.
- * Note that if endianness is changed, all the unsigned methods must also be changed.
- */
- private void initByteBuffer() {
- byteBuffer = ByteBuffer.allocate(MAX_BYTE_BUFFER);
- byteBuffer.order(LITTLE_ENDIAN);
- }
-
- //////////////////////////////////////////////////
- // Writing methods //
- //////////////////////////////////////////////////
-
-
- /**
- * Write whatever has been put into the byte buffer
- * @param numBytes -- how much to write. Note that in case of writing an unsigned value,
- * more bytes were put into the ByteBuffer than will get written out.
- */
- private void writeByteBuffer(final int numBytes) {
- assert(numBytes <= byteBuffer.limit());
- writeBytes(byteBuffer.array(), 0, numBytes);
- }
-
- /**
- * Writes a byte to the output buffer
- *
- * @param bite byte array to write
- */
- public void writeByte(final byte bite) {
- byteBuffer.clear();
- byteBuffer.put(bite);
- writeByteBuffer(1);
- }
-
- public void writeByte(final int b) {
- writeByte((byte)b);
- }
-
- /**
- * Writes a byte array to the output buffer
- *
- * @param bytes value to write
- */
- public void writeBytes(final byte[] bytes) {
- writeBytes(bytes, 0, bytes.length);
- }
-
- public void writeBytes(final byte[] bytes, final int startOffset, final int numBytes) {
- if (!isWriting) {
- throw new IllegalStateException("Calling write method on BinaryCodec open for read.");
- }
- try {
- outputStream.write(bytes, startOffset, numBytes);
- } catch (IOException e) {
- throw new RuntimeIOException(constructErrorMessage("Write error"), e);
- }
- }
-
- /**
- * Write a 32-bit int to the output stream
- *
- * @param value int to write
- */
- public void writeInt(final int value) {
- byteBuffer.clear();
- byteBuffer.putInt(value);
- writeByteBuffer(4);
- }
-
- /**
- * Write a double (8 bytes) to the output stream
- *
- * @param value double to write
- */
- public void writeDouble(final double value) {
- byteBuffer.clear();
- byteBuffer.putDouble(value);
- writeByteBuffer(8);
- }
-
- /**
- * Write a 64-bit long to the output stream
- *
- * @param value long to write
- */
- public void writeLong(final long value) {
- byteBuffer.clear();
- byteBuffer.putLong(value);
- writeByteBuffer(8);
- }
-
-
- /**
- * Write a 16-bit short to output stream
- */
- public void writeShort(final short value) {
- byteBuffer.clear();
- byteBuffer.putShort(value);
- writeByteBuffer(2);
- }
-
- /**
- * Write a float (4 bytes) to the output stream
- *
- * @param value float to write
- */
- public void writeFloat(final float value) {
- byteBuffer.clear();
- byteBuffer.putFloat(value);
- writeByteBuffer(4);
- }
-
- /**
- * Writes a boolean (1 byte) to the output buffer
- *
- * @param value boolean to write
- */
- public void writeBoolean(final boolean value) {
- byteBuffer.clear();
- byteBuffer.put(value ? (byte)1 : (byte)0);
- writeByteBuffer(1);
- }
-
- /**
- * Writes a string to the buffer as ASCII bytes
- *
- * @param value string to write to buffer
- * @param writeLength prefix the string with the length as a 32-bit int
- * @param appendNull add a null byte to the end of the string
- */
- public void writeString(final String value, final boolean writeLength, final boolean appendNull) {
- if (writeLength) {
- int lengthToWrite = value.length();
- if (appendNull) lengthToWrite++;
- writeInt(lengthToWrite);
- }
-
- //Actually writes the string to a buffer
- writeString(value);
-
- if (appendNull) writeBytes(NULL_BYTE);
-
- }
-
-
- /**
- * Write a string to the buffer as ASCII bytes
- *
- * @param value string to write
- */
- private void writeString(final String value) {
- writeBytes(StringUtil.stringToBytes(value));
- }
-
- /**
- * Write an 8-bit unsigned byte.
- * NOTE: This method will break if we change to big-endian.
- */
- public void writeUByte(final short val) {
- if (val < 0) {
- throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
- }
- if (val > MAX_UBYTE) {
- throw new IllegalArgumentException("Value (" + val + ") to large to be written as ubyte.");
- }
- byteBuffer.clear();
- byteBuffer.putShort(val);
- writeByteBuffer(1);
- }
-
- /**
- * Write a 16-bit unsigned short.
- * NOTE: This method will break if we change to big-endian.
- */
- public void writeUShort(final int val) {
- if (val < 0) {
- throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
- }
- if (val > MAX_USHORT) {
- throw new IllegalArgumentException("Value (" + val + ") too large to be written as ushort.");
- }
- byteBuffer.clear();
- byteBuffer.putInt(val);
- writeByteBuffer(2);
- }
-
- /**
- * Write a 32-bit unsigned int.
- * NOTE: This method will break if we change to big-endian.
- */
- public void writeUInt(final long val) {
- if (val < 0) {
- throw new IllegalArgumentException("Negative value (" + val + ") passed to unsigned writing method.");
- }
- if (val > MAX_UINT) {
- throw new IllegalArgumentException("Value (" + val + ") to large to be written as uint.");
- }
- byteBuffer.clear();
- byteBuffer.putLong(val);
- writeByteBuffer(4);
- }
-
- //////////////////////////////////////////////////
- // Reading methods //
- //////////////////////////////////////////////////
-
- /**
- * Read a byte array from the input stream.
- *
- * @throws htsjdk.samtools.util.RuntimeEOFException if fewer than buffer.length bytes to read
- */
- public void readBytes(final byte[] buffer) {
- readBytes(buffer, 0, buffer.length);
- }
-
- /**
- * Read a byte array from the input stream
- *
- * @param buffer where to put bytes read
- * @param offset offset to start putting bytes into buffer
- * @param length number of bytes to read
- * @throws RuntimeEOFException if fewer than length bytes to read
- */
- public void readBytes(final byte[] buffer, final int offset, final int length) {
- int totalNumRead = 0;
- do {
- final int numRead = readBytesOrFewer(buffer, offset + totalNumRead, length - totalNumRead);
- if (numRead < 0) {
- String msg = String.format("Premature EOF. Expected %d but only received %d", length, totalNumRead);
- throw new RuntimeEOFException(constructErrorMessage(msg));
- } else {
- totalNumRead += numRead;
- }
- } while (totalNumRead < length);
- }
-
- /**
- * Reads a byte array from the input stream.
- *
- * @param buffer where to put bytes read
- * @param offset offset to start putting bytes into buffer
- * @param length number of bytes to read. Fewer bytes may be read if EOF is reached before length bytes
- * have been read.
- * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
- */
- public int readBytesOrFewer(final byte[] buffer, final int offset, final int length) {
- if (isWriting) {
- throw new IllegalStateException("Calling read method on BinaryCodec open for write.");
- }
- try {
- return inputStream.read(buffer, offset, length);
- } catch (IOException e) {
- throw new RuntimeIOException(constructErrorMessage("Read error"), e);
- }
- }
-
- /**
- * @return a single byte read from the input stream.
- */
- public byte readByte() {
- if (isWriting) {
- throw new IllegalStateException("Calling read method on BinaryCodec open for write.");
- }
- try {
- final int ret = inputStream.read();
- if (ret == -1) {
- throw new RuntimeEOFException(constructErrorMessage("Premature EOF"));
- }
- return (byte)ret;
- } catch (IOException e) {
- throw new RuntimeIOException(constructErrorMessage("Read error"), e);
- }
- }
-
- /**
- * @return true if it is possible to know for sure if at EOF, and it is known for sure.
- * If the input stream is a ByteArrayInputStream, this is faster than causing a RuntimeEOFException
- * to be thrown.
- */
- public boolean knownAtEof() {
- if (isWriting) {
- throw new IllegalStateException("Calling knownAtEof method on BinaryCodec open for write.");
- }
- try {
- return inputStream instanceof ByteArrayInputStream && inputStream.available() == 0;
- } catch (IOException e) {
- throw new RuntimeIOException(constructErrorMessage("available() error"), e);
- }
- }
-
- /**
- * Read a string off the input stream, as ASCII bytes
- *
- * @param length length of string to read
- * @return String read from stream
- */
- public String readString(final int length) {
- final byte[] buffer;
- // Recycle single buffer if possible
- if (length <= scratchBuffer.length) {
- buffer = scratchBuffer;
- } else {
- buffer = new byte[length];
-
- }
- readBytes(buffer, 0, length);
-
- return StringUtil.bytesToString(buffer, 0, length);
- }
-
- /**
- * Read ASCII bytes from the input stream until a null byte is read
- * @return String constructed from the ASCII bytes read
- */
- public String readNullTerminatedString() {
- return StringUtil.readNullTerminatedString(this);
- }
-
- /**
- * Read an int length, and then a String of that length
- * @param devourNull if true, the length include a null terminator, which is read and discarded
- */
- public String readLengthAndString(final boolean devourNull) {
- int length = readInt();
- if (devourNull) {
- --length;
- }
- final String ret = readString(length);
- if (devourNull) {
- readByte();
- }
- return ret;
- }
-
- private void readByteBuffer(final int numBytes) {
- assert(numBytes <= byteBuffer.capacity());
- readBytes(byteBuffer.array(), 0, numBytes);
- byteBuffer.limit(byteBuffer.capacity());
- byteBuffer.position(numBytes);
- }
-
- /**
- * Read an int off the input stream
- *
- * @return int from input stream
- */
- public int readInt() {
- readByteBuffer(4);
- byteBuffer.flip();
- return byteBuffer.getInt();
- }
-
- /**
- * Reads a double off the input stream
- *
- * @return double
- */
- public double readDouble() {
- readByteBuffer(8);
- byteBuffer.flip();
- return byteBuffer.getDouble();
- }
-
- /**
- * Reads a long off the input stream
- *
- * @return long
- */
- public long readLong() {
- readByteBuffer(8);
- byteBuffer.flip();
- return byteBuffer.getLong();
- }
-
- public short readShort() {
- readByteBuffer(2);
- byteBuffer.flip();
- return byteBuffer.getShort();
- }
-
- /**
- * Reads a float off the input stream
- *
- * @return float
- */
- public float readFloat() {
- readByteBuffer(4);
- byteBuffer.flip();
- return byteBuffer.getFloat();
- }
-
- /**
- * Reads a boolean off the input stream, represented as a byte with value 1 or 0
- *
- * @return boolean
- */
- public boolean readBoolean() {
- return (((int)readByte()) == 1);
- }
-
- /**
- * Reads an 8-bit unsigned byte from the input stream.
- * This method assumes little-endianness.
- */
- public short readUByte() {
- readByteBuffer(1);
- byteBuffer.put((byte)0);
- byteBuffer.flip();
- return byteBuffer.getShort();
- }
-
- /**
- * Reads a 16-bit unsigned short from the input stream.
- * This method assumes little-endianness.
- */
- public int readUShort() {
- readByteBuffer(2);
- byteBuffer.putShort((short)0);
- byteBuffer.flip();
- return byteBuffer.getInt();
- }
-
- /**
- * Reads a 32-bit unsigned int from the input stream.
- * This method assumes little-endianness.
- */
- public long readUInt() {
- readByteBuffer(4);
- byteBuffer.putInt(0);
- byteBuffer.flip();
- return byteBuffer.getLong();
- }
-
- /**
- * Close the appropriate stream
- */
- public void close() {
- try {
- if (this.isWriting) {
- // To the degree possible, make sure the bytes get forced to the file system,
- // or else cause an exception to be thrown.
- this.outputStream.flush();
- if (this.outputStream instanceof FileOutputStream) {
- FileOutputStream fos = (FileOutputStream)this.outputStream;
- try {
- fos.getFD().sync();
- } catch (SyncFailedException e) {
- // Since the sync is belt-and-suspenders anyway, don't throw an exception if it fails,
- // because on some OSs it will fail for some types of output. E.g. writing to /dev/null
- // on some Unixes.
- }
- }
- this.outputStream.close();
- }
- else this.inputStream.close();
- } catch (IOException e) {
- throw new RuntimeIOException(e.getMessage(), e);
- }
- }
-
- private String constructErrorMessage(final String msg) {
- final StringBuilder sb = new StringBuilder(msg);
- sb.append("; BinaryCodec in ")
- .append(isWriting? "write": "read").append("mode; ");
- final String filename = isWriting? outputFileName: inputFileName;
- if (filename != null) {
- sb.append("file: ").append(filename);
- } else {
- sb.append("streamed file (filename not available)");
- }
- return sb.toString();
- }
-
- //////////////////////////////////////////////////
- // Some getters //
- //////////////////////////////////////////////////
-
-
- public String getInputFileName() {
- return inputFileName;
- }
-
- public String getOutputFileName() {
- return outputFileName;
- }
-
- public void setOutputFileName(final String outputFileName) {
- this.outputFileName = outputFileName;
- }
-
- public void setInputFileName(final String inputFileName) {
- this.inputFileName = inputFileName;
- }
-
- public boolean isWriting() {
- return isWriting;
- }
-
- public OutputStream getOutputStream() {
- return outputStream;
- }
-
- public InputStream getInputStream() {
- return inputStream;
- }
-
- public void setInputStream(final InputStream is) {
- isWriting = false;
- this.inputStream = is;
- }
-
- public void setOutputStream(final OutputStream os) {
- isWriting = true;
- this.outputStream = os;
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java b/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java
deleted file mode 100644
index 634534c..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedFilePointerUtil.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Static for manipulating virtual file pointers in BGZF files.
- */
-public class BlockCompressedFilePointerUtil {
- private static final int SHIFT_AMOUNT = 16;
- private static final int OFFSET_MASK = 0xffff;
- private static final long ADDRESS_MASK = 0xFFFFFFFFFFFFL;
-
- public static final long MAX_BLOCK_ADDRESS = ADDRESS_MASK;
- public static final int MAX_OFFSET = OFFSET_MASK;
-
- /**
- * @param vfp1
- * @param vfp2
- * @return negative if vfp1 is earlier in file than vfp2, positive if it is later, 0 if equal.
- */
- public static int compare(final long vfp1, final long vfp2) {
- if (vfp1 == vfp2) return 0;
- // When treating as unsigned, negative number is > positive.
- if (vfp1 < 0 && vfp2 >= 0) return 1;
- if (vfp1 >= 0 && vfp2 < 0) return -1;
- // Either both negative or both non-negative, so regular comparison works.
- if (vfp1 < vfp2) return -1;
- return 1; // vfp1 > vfp2
- }
-
- /**
- * @return true if vfp2 points to somewhere in the same BGZF block, or the one immediately following vfp1's BGZF block.
- */
- public static boolean areInSameOrAdjacentBlocks(final long vfp1, final long vfp2) {
- final long block1 = getBlockAddress(vfp1);
- final long block2 = getBlockAddress(vfp2);
- return (block1 == block2 || block1 + 1 == block2);
- }
-
- /**
- * @param blockAddress File offset of start of BGZF block.
- * @param blockOffset Offset into uncompressed block.
- * @return Virtual file pointer that embodies the input parameters.
- */
- static long makeFilePointer(final long blockAddress, final int blockOffset) {
- if (blockOffset < 0) {
- throw new IllegalArgumentException("Negative blockOffset " + blockOffset + " not allowed.");
- }
- if (blockAddress < 0) {
- throw new IllegalArgumentException("Negative blockAddress " + blockAddress + " not allowed.");
- }
- if (blockOffset > MAX_OFFSET) {
- throw new IllegalArgumentException("blockOffset " + blockOffset + " too large.");
- }
- if (blockAddress > MAX_BLOCK_ADDRESS) {
- throw new IllegalArgumentException("blockAddress " + blockAddress + " too large.");
- }
- return blockAddress << SHIFT_AMOUNT | blockOffset;
- }
-
- /**
- * @param virtualFilePointer
- * @return File offset of start of BGZF block for this virtual file pointer.
- */
- public static long getBlockAddress(final long virtualFilePointer) {
- return (virtualFilePointer >> SHIFT_AMOUNT) & ADDRESS_MASK;
- }
-
- /**
- * @param virtualFilePointer
- * @return Offset into uncompressed block for this virtual file pointer.
- */
- public static int getBlockOffset(final long virtualFilePointer) {
- return (int) (virtualFilePointer & OFFSET_MASK);
- }
-
- public static String asString(final long vfp) {
- return String.format("%d(0x%x): (block address: %d, offset: %d)", vfp, vfp, getBlockAddress(vfp), getBlockOffset(vfp));
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java
deleted file mode 100755
index b0ac001..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedInputStream.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.FileTruncatedException;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.RandomAccessFile;
-import java.net.URL;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-
-/*
- * Utility class for reading BGZF block compressed files. The caller can treat this file like any other InputStream.
- * It probably is not necessary to wrap this stream in a buffering stream, because there is internal buffering.
- * The advantage of BGZF over conventional GZip format is that BGZF allows for seeking without having to read the
- * entire file up to the location being sought. Note that seeking is only possible if the ctor(File) is used.
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for details of BGZF format
- */
-public class BlockCompressedInputStream extends InputStream implements LocationAware {
-
- public final static String INCORRECT_HEADER_SIZE_MSG = "Incorrect header size for file: ";
- public final static String UNEXPECTED_BLOCK_LENGTH_MSG = "Unexpected compressed block length: ";
- public final static String PREMATURE_END_MSG = "Premature end of file: ";
- public final static String CANNOT_SEEK_STREAM_MSG = "Cannot seek on stream based file ";
- public final static String INVALID_FILE_PTR_MSG = "Invalid file pointer: ";
-
- private InputStream mStream = null;
- private SeekableStream mFile = null;
- private byte[] mFileBuffer = null;
- private byte[] mCurrentBlock = null;
- private int mCurrentOffset = 0;
- private long mBlockAddress = 0;
- private int mLastBlockLength = 0;
- private final BlockGunzipper blockGunzipper = new BlockGunzipper();
-
-
- /**
- * Note that seek() is not supported if this ctor is used.
- */
- public BlockCompressedInputStream(final InputStream stream) {
- this(stream, true);
- }
-
- /**
- * Note that seek() is not supported if this ctor is used.
- */
- public BlockCompressedInputStream(final InputStream stream, final boolean allowBuffering) {
- if (allowBuffering) {
- mStream = IOUtil.toBufferedStream(stream);
- }
- else {
- mStream = stream;
- }
-
- mFile = null;
- }
-
- /**
- * Use this ctor if you wish to call seek()
- */
- public BlockCompressedInputStream(final File file) throws IOException {
- mFile = new SeekableFileStream(file);
- mStream = null;
-
- }
-
- public BlockCompressedInputStream(final URL url) {
- mFile = new SeekableBufferedStream(new SeekableHTTPStream(url));
- mStream = null;
- }
-
- /**
- * For providing some arbitrary data source. No additional buffering is
- * provided, so if the underlying source is not buffered, wrap it in a
- * SeekableBufferedStream before passing to this ctor.
- */
- public BlockCompressedInputStream(final SeekableStream strm) {
- mFile = strm;
- mStream = null;
- }
-
- /**
- * Determines whether or not the inflater will re-calculated the CRC on the decompressed data
- * and check it against the value stored in the GZIP header. CRC checking is an expensive
- * operation and should be used accordingly.
- */
- public void setCheckCrcs(final boolean check) {
- this.blockGunzipper.setCheckCrcs(check);
- }
-
- /**
- * @return the number of bytes that can be read (or skipped over) from this input stream without blocking by the
- * next caller of a method for this input stream. The next caller might be the same thread or another thread.
- * Note that although the next caller can read this many bytes without blocking, the available() method call itself
- * may block in order to fill an internal buffer if it has been exhausted.
- */
- public int available() throws IOException {
- if (mCurrentBlock == null || mCurrentOffset == mCurrentBlock.length) {
- readBlock();
- }
- if (mCurrentBlock == null) {
- return 0;
- }
- return mCurrentBlock.length - mCurrentOffset;
- }
-
- /**
- * @return <code>true</code> if the stream is at the end of a BGZF block,
- * <code>false</code> otherwise.
- */
- public boolean endOfBlock() {
- return (mCurrentBlock != null && mCurrentOffset == mCurrentBlock.length);
- }
-
- /**
- * Closes the underlying InputStream or RandomAccessFile
- */
- public void close() throws IOException {
- if (mFile != null) {
- mFile.close();
- mFile = null;
- } else if (mStream != null) {
- mStream.close();
- mStream = null;
- }
- // Encourage garbage collection
- mFileBuffer = null;
- mCurrentBlock = null;
- }
-
- /**
- * Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255.
- * If no byte is available because the end of the stream has been reached, the value -1 is returned.
- * This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
-
- * @return the next byte of data, or -1 if the end of the stream is reached.
- */
- public int read() throws IOException {
- return (available() > 0) ? (mCurrentBlock[mCurrentOffset++] & 0xFF) : -1;
- }
-
- /**
- * Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes
- * actually read is returned as an integer. This method blocks until input data is available, end of file is detected,
- * or an exception is thrown.
- *
- * read(buf) has the same effect as read(buf, 0, buf.length).
- *
- * @param buffer the buffer into which the data is read.
- * @return the total number of bytes read into the buffer, or -1 is there is no more data because the end of
- * the stream has been reached.
- */
- public int read(final byte[] buffer) throws IOException {
- return read(buffer, 0, buffer.length);
- }
-
- private volatile ByteArrayOutputStream buf = null;
- private static final byte eol = '\n';
- private static final byte eolCr = '\r';
-
- /**
- * Reads a whole line. A line is considered to be terminated by either a line feed ('\n'),
- * carriage return ('\r') or carriage return followed by a line feed ("\r\n").
- *
- * @return A String containing the contents of the line, excluding the line terminating
- * character, or null if the end of the stream has been reached
- *
- * @exception IOException If an I/O error occurs
- * @
- */
- public String readLine() throws IOException {
- int available = available();
- if (available == 0) {
- return null;
- }
- if(null == buf){ // lazy initialisation
- buf = new ByteArrayOutputStream(8192);
- }
- buf.reset();
- boolean done = false;
- boolean foundCr = false; // \r found flag
- while (!done) {
- int linetmpPos = mCurrentOffset;
- int bCnt = 0;
- while((available-- > 0)){
- final byte c = mCurrentBlock[linetmpPos++];
- if(c == eol){ // found \n
- done = true;
- break;
- } else if(foundCr){ // previous char was \r
- --linetmpPos; // current char is not \n so put it back
- done = true;
- break;
- } else if(c == eolCr){ // found \r
- foundCr = true;
- continue; // no ++bCnt
- }
- ++bCnt;
- }
- if(mCurrentOffset < linetmpPos){
- buf.write(mCurrentBlock, mCurrentOffset, bCnt);
- mCurrentOffset = linetmpPos;
- }
- available = available();
- if(available == 0){
- // EOF
- done = true;
- }
- }
- return buf.toString();
- }
-
- /**
- * Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read
- * as many as len bytes, but a smaller number may be read. The number of bytes actually read is returned as an integer.
- *
- * This method blocks until input data is available, end of file is detected, or an exception is thrown.
- *
- * @param buffer buffer into which data is read.
- * @param offset the start offset in array b at which the data is written.
- * @param length the maximum number of bytes to read.
- * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of
- * the stream has been reached.
- */
- public int read(final byte[] buffer, int offset, int length) throws IOException {
- final int originalLength = length;
- while (length > 0) {
- final int available = available();
- if (available == 0) {
- // Signal EOF to caller
- if (originalLength == length) {
- return -1;
- }
- break;
- }
- final int copyLength = Math.min(length, available);
- System.arraycopy(mCurrentBlock, mCurrentOffset, buffer, offset, copyLength);
- mCurrentOffset += copyLength;
- offset += copyLength;
- length -= copyLength;
- }
- return originalLength - length;
- }
-
- /**
- * Seek to the given position in the file. Note that pos is a special virtual file pointer,
- * not an actual byte offset.
- *
- * @param pos virtual file pointer
- */
- public void seek(final long pos) throws IOException {
- if (mFile == null) {
- throw new IOException(CANNOT_SEEK_STREAM_MSG);
- }
- // Decode virtual file pointer
- // Upper 48 bits is the byte offset into the compressed stream of a block.
- // Lower 16 bits is the byte offset into the uncompressed stream inside the block.
- final long compressedOffset = BlockCompressedFilePointerUtil.getBlockAddress(pos);
- final int uncompressedOffset = BlockCompressedFilePointerUtil.getBlockOffset(pos);
- final int available;
- if (mBlockAddress == compressedOffset && mCurrentBlock != null) {
- available = mCurrentBlock.length;
- } else {
- mFile.seek(compressedOffset);
- mBlockAddress = compressedOffset;
- mLastBlockLength = 0;
- readBlock();
- available = available();
- }
- if (uncompressedOffset > available ||
- (uncompressedOffset == available && !eof())) {
- throw new IOException(INVALID_FILE_PTR_MSG + pos + " for " + mFile.getSource());
- }
- mCurrentOffset = uncompressedOffset;
- }
-
- private boolean eof() throws IOException {
- if (mFile.eof()) {
- return true;
- }
- // If the last remaining block is the size of the EMPTY_GZIP_BLOCK, this is the same as being at EOF.
- return (mFile.length() - (mBlockAddress + mLastBlockLength) == BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length);
- }
-
- /**
- * @return virtual file pointer that can be passed to seek() to return to the current position. This is
- * not an actual byte offset, so arithmetic on file pointers cannot be done to determine the distance between
- * the two.
- */
- public long getFilePointer() {
- if (mCurrentOffset == mCurrentBlock.length) {
- // If current offset is at the end of the current block, file pointer should point
- // to the beginning of the next block.
- return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress + mLastBlockLength, 0);
- }
- return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress, mCurrentOffset);
- }
-
- @Override
- public long getPosition() {
- return getFilePointer();
- }
-
- public static long getFileBlock(final long bgzfOffset) {
- return BlockCompressedFilePointerUtil.getBlockAddress(bgzfOffset);
- }
-
- /**
- * @param stream Must be at start of file. Throws RuntimeException if !stream.markSupported().
- * @return true if the given file looks like a valid BGZF file.
- */
- public static boolean isValidFile(final InputStream stream) throws IOException {
- if (!stream.markSupported()) {
- throw new RuntimeException("Cannot test non-buffered stream");
- }
- stream.mark(BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
- final byte[] buffer = new byte[BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH];
- final int count = readBytes(stream, buffer, 0, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
- stream.reset();
- return count == BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH && isValidBlockHeader(buffer);
- }
-
- private static boolean isValidBlockHeader(final byte[] buffer) {
- return (buffer[0] == BlockCompressedStreamConstants.GZIP_ID1 &&
- (buffer[1] & 0xFF) == BlockCompressedStreamConstants.GZIP_ID2 &&
- (buffer[3] & BlockCompressedStreamConstants.GZIP_FLG) != 0 &&
- buffer[10] == BlockCompressedStreamConstants.GZIP_XLEN &&
- buffer[12] == BlockCompressedStreamConstants.BGZF_ID1 &&
- buffer[13] == BlockCompressedStreamConstants.BGZF_ID2);
- }
-
- private void readBlock() throws IOException {
-
- if (mFileBuffer == null) {
- mFileBuffer = new byte[BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE];
- }
- int count = readBytes(mFileBuffer, 0, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH);
- if (count == 0) {
- // Handle case where there is no empty gzip block at end.
- mCurrentOffset = 0;
- mBlockAddress += mLastBlockLength;
- mCurrentBlock = new byte[0];
- return;
- }
- if (count != BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH) {
- throw new IOException(INCORRECT_HEADER_SIZE_MSG + mFile.getSource());
- }
- final int blockLength = unpackInt16(mFileBuffer, BlockCompressedStreamConstants.BLOCK_LENGTH_OFFSET) + 1;
- if (blockLength < BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH || blockLength > mFileBuffer.length) {
- throw new IOException(UNEXPECTED_BLOCK_LENGTH_MSG + blockLength + " for " + mFile.getSource());
- }
- final int remaining = blockLength - BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH;
- count = readBytes(mFileBuffer, BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH, remaining);
- if (count != remaining) {
- throw new FileTruncatedException(PREMATURE_END_MSG + mFile.getSource());
- }
- inflateBlock(mFileBuffer, blockLength);
- mCurrentOffset = 0;
- mBlockAddress += mLastBlockLength;
- mLastBlockLength = blockLength;
- }
-
- private void inflateBlock(final byte[] compressedBlock, final int compressedLength) throws IOException {
- final int uncompressedLength = unpackInt32(compressedBlock, compressedLength-4);
- byte[] buffer = mCurrentBlock;
- mCurrentBlock = null;
- if (buffer == null || buffer.length != uncompressedLength) {
- try {
- buffer = new byte[uncompressedLength];
- } catch (final NegativeArraySizeException e) {
- throw new RuntimeIOException(mFile.getSource() + " has invalid uncompressedLength: " + uncompressedLength, e);
- }
- }
- blockGunzipper.unzipBlock(buffer, compressedBlock, compressedLength);
- mCurrentBlock = buffer;
- }
-
- private int readBytes(final byte[] buffer, final int offset, final int length) throws IOException {
- if (mFile != null) {
- return readBytes(mFile, buffer, offset, length);
- } else if (mStream != null) {
- return readBytes(mStream, buffer, offset, length);
- } else {
- return 0;
- }
- }
-
- private static int readBytes(final SeekableStream file, final byte[] buffer, final int offset, final int length) throws IOException {
- int bytesRead = 0;
- while (bytesRead < length) {
- final int count = file.read(buffer, offset + bytesRead, length - bytesRead);
- if (count <= 0) {
- break;
- }
- bytesRead += count;
- }
- return bytesRead;
- }
-
- private static int readBytes(final InputStream stream, final byte[] buffer, final int offset, final int length) throws IOException {
- int bytesRead = 0;
- while (bytesRead < length) {
- final int count = stream.read(buffer, offset + bytesRead, length - bytesRead);
- if (count <= 0) {
- break;
- }
- bytesRead += count;
- }
- return bytesRead;
- }
-
- private int unpackInt16(final byte[] buffer, final int offset) {
- return ((buffer[offset] & 0xFF) |
- ((buffer[offset+1] & 0xFF) << 8));
- }
-
- private int unpackInt32(final byte[] buffer, final int offset) {
- return ((buffer[offset] & 0xFF) |
- ((buffer[offset+1] & 0xFF) << 8) |
- ((buffer[offset+2] & 0xFF) << 16) |
- ((buffer[offset+3] & 0xFF) << 24));
- }
-
- public enum FileTermination {HAS_TERMINATOR_BLOCK, HAS_HEALTHY_LAST_BLOCK, DEFECTIVE}
-
- public static FileTermination checkTermination(final File file) throws IOException {
- final long fileSize = file.length();
- if (fileSize < BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length) {
- return FileTermination.DEFECTIVE;
- }
- final RandomAccessFile raFile = new RandomAccessFile(file, "r");
- try {
- raFile.seek(fileSize - BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length);
- byte[] buf = new byte[BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length];
- raFile.readFully(buf);
- if (Arrays.equals(buf, BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK)) {
- return FileTermination.HAS_TERMINATOR_BLOCK;
- }
- final int bufsize = (int)Math.min(fileSize, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE);
- buf = new byte[bufsize];
- raFile.seek(fileSize - bufsize);
- raFile.read(buf);
- for (int i = buf.length - BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK.length;
- i >= 0; --i) {
- if (!preambleEqual(BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE,
- buf, i, BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE.length)) {
- continue;
- }
- final ByteBuffer byteBuffer = ByteBuffer.wrap(buf, i + BlockCompressedStreamConstants.GZIP_BLOCK_PREAMBLE.length, 4);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- final int totalBlockSizeMinusOne = byteBuffer.getShort() & 0xFFFF;
- if (buf.length - i == totalBlockSizeMinusOne + 1) {
- return FileTermination.HAS_HEALTHY_LAST_BLOCK;
- } else {
- return FileTermination.DEFECTIVE;
- }
- }
- return FileTermination.DEFECTIVE;
- } finally {
- raFile.close();
- }
- }
-
- public static void assertNonDefectiveFile(final File file) throws IOException {
- if (checkTermination(file) == FileTermination.DEFECTIVE) {
- throw new SAMException(file.getAbsolutePath() + " does not have a valid GZIP block at the end of the file.");
- }
- }
-
- private static boolean preambleEqual(final byte[] preamble, final byte[] buf, final int startOffset, final int length) {
- for (int i = 0; i < length; ++i) {
- if (preamble[i] != buf[i + startOffset]) {
- return false;
- }
- }
- return true;
- }
-}
-
-
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java b/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java
deleted file mode 100644
index 408282f..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedOutputStream.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.util.zip.DeflaterFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.CRC32;
-import java.util.zip.Deflater;
-
-/**
- * Writer for a file that is a series of gzip blocks (BGZF format). The caller just treats it as an
- * OutputStream, and under the covers a gzip block is written when the amount of uncompressed as-yet-unwritten
- * bytes reaches a threshold.
- *
- * The advantage of BGZF over conventional gzip is that BGZF allows for seeking without having to scan through
- * the entire file up to the position being sought.
- *
- * Note that the flush() method should not be called by client
- * unless you know what you're doing, because it forces a gzip block to be written even if the
- * number of buffered bytes has not reached threshold. close(), on the other hand, must be called
- * when done writing in order to force the last gzip block to be written.
- *
- * c.f. http://samtools.sourceforge.net/SAM1.pdf for details of BGZF file format.
- */
-public class BlockCompressedOutputStream
- extends OutputStream
- implements LocationAware
-{
-
- private static final Log log = Log.getInstance(BlockCompressedOutputStream.class);
-
- private static int defaultCompressionLevel = BlockCompressedStreamConstants.DEFAULT_COMPRESSION_LEVEL;
- private static DeflaterFactory defaultDeflaterFactory = new DeflaterFactory();
-
- /**
- * Sets the GZip compression level for subsequent BlockCompressedOutputStream object creation
- * that do not specify the compression level.
- * @param compressionLevel 1 <= compressionLevel <= 9
- */
- public static void setDefaultCompressionLevel(final int compressionLevel) {
- if (compressionLevel < Deflater.NO_COMPRESSION || compressionLevel > Deflater.BEST_COMPRESSION) {
- throw new IllegalArgumentException("Invalid compression level: " + compressionLevel);
- }
- defaultCompressionLevel = compressionLevel;
- }
-
- public static int getDefaultCompressionLevel() {
- return defaultCompressionLevel;
- }
-
- /**
- * Sets the default {@link DeflaterFactory} that will be used for all instances unless specified otherwise in the constructor.
- * If this method is not called the default is a factory that will create the JDK {@link Deflater}.
- * @param deflaterFactory non-null default factory.
- */
- public static void setDefaultDeflaterFactory(final DeflaterFactory deflaterFactory) {
- if (deflaterFactory == null) {
- throw new IllegalArgumentException("null deflaterFactory");
- }
- defaultDeflaterFactory = deflaterFactory;
- }
-
- public static DeflaterFactory getDefaultDeflaterFactory() {
- return defaultDeflaterFactory;
- }
-
- private final BinaryCodec codec;
- private final byte[] uncompressedBuffer = new byte[BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE];
- private int numUncompressedBytes = 0;
- private final byte[] compressedBuffer =
- new byte[BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE -
- BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH];
- private final Deflater deflater;
-
- // A second deflater is created for the very unlikely case where the regular deflation actually makes
- // things bigger, and the compressed block is too big. It should be possible to downshift the
- // primary deflater to NO_COMPRESSION level, recompress, and then restore it to its original setting,
- // but in practice that doesn't work.
- // The motivation for deflating at NO_COMPRESSION level is that it will predictably produce compressed
- // output that is 10 bytes larger than the input, and the threshold at which a block is generated is such that
- // the size of tbe final gzip block will always be <= 64K. This is preferred over the previous method,
- // which would attempt to compress up to 64K bytes, and if the resulting compressed block was too large,
- // try compressing fewer input bytes (aka "downshifting'). The problem with downshifting is that
- // getFilePointer might return an inaccurate value.
- // I assume (AW 29-Oct-2013) that there is no value in using hardware-assisted deflater for no-compression mode,
- // so just use JDK standard.
- private final Deflater noCompressionDeflater = new Deflater(Deflater.NO_COMPRESSION, true);
- private final CRC32 crc32 = new CRC32();
- private File file = null;
- private long mBlockAddress = 0;
-
-
- // Really a local variable, but allocate once to reduce GC burden.
- private final byte[] singleByteArray = new byte[1];
-
- /**
- * Uses default compression level, which is 5 unless changed by setCompressionLevel
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
- */
- public BlockCompressedOutputStream(final String filename) {
- this(filename, defaultCompressionLevel);
- }
-
- /**
- * Uses default compression level, which is 5 unless changed by setCompressionLevel
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
- */
- public BlockCompressedOutputStream(final File file) {
- this(file, defaultCompressionLevel);
- }
-
- /**
- * Prepare to compress at the given compression level
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * @param compressionLevel 1 <= compressionLevel <= 9
- */
- public BlockCompressedOutputStream(final String filename, final int compressionLevel) {
- this(new File(filename), compressionLevel);
- }
-
- /**
- * Prepare to compress at the given compression level
- * @param compressionLevel 1 <= compressionLevel <= 9
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * Use {@link #BlockCompressedOutputStream(File, int, DeflaterFactory)} to specify a custom factory.
- */
- public BlockCompressedOutputStream(final File file, final int compressionLevel) {
- this(file, compressionLevel, defaultDeflaterFactory);
- }
-
- /**
- * Prepare to compress at the given compression level
- * @param compressionLevel 1 <= compressionLevel <= 9
- * @param deflaterFactory custom factory to create deflaters (overrides the default)
- */
- public BlockCompressedOutputStream(final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
- this.file = file;
- codec = new BinaryCodec(file, true);
- deflater = deflaterFactory.makeDeflater(compressionLevel, true);
- log.debug("Using deflater: " + deflater.getClass().getSimpleName());
- }
-
- /**
- * Uses default compression level, which is 5 unless changed by setCompressionLevel
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * Use {@link #BlockCompressedOutputStream(OutputStream, File, int, DeflaterFactory)} to specify a custom factory.
- *
- * @param file may be null
- */
- public BlockCompressedOutputStream(final OutputStream os, final File file) {
- this(os, file, defaultCompressionLevel);
- }
-
- /**
- * Note: this constructor uses the default {@link DeflaterFactory}, see {@link #getDefaultDeflaterFactory()}.
- * Use {@link #BlockCompressedOutputStream(OutputStream, File, int, DeflaterFactory)} to specify a custom factory.
- */
- public BlockCompressedOutputStream(final OutputStream os, final File file, final int compressionLevel) {
- this(os, file, compressionLevel, defaultDeflaterFactory);
- }
-
- /**
- * Creates the output stream.
- * @param os output stream to create a BlockCompressedOutputStream from
- * @param file file to which to write the output or null if not available
- * @param compressionLevel the compression level (0-9)
- * @param deflaterFactory custom factory to create deflaters (overrides the default)
- */
- public BlockCompressedOutputStream(final OutputStream os, final File file, final int compressionLevel, final DeflaterFactory deflaterFactory) {
- this.file = file;
- codec = new BinaryCodec(os);
- if (file != null) {
- codec.setOutputFileName(file.getAbsolutePath());
- }
- deflater = deflaterFactory.makeDeflater(compressionLevel, true);
- log.debug("Using deflater: " + deflater.getClass().getSimpleName());
- }
-
- /**
- *
- * @param location May be null. Used for error messages, and for checking file termination.
- * @param output May or not already be a BlockCompressedOutputStream.
- * @return A BlockCompressedOutputStream, either by wrapping the given OutputStream, or by casting if it already
- * is a BCOS.
- */
- public static BlockCompressedOutputStream maybeBgzfWrapOutputStream(final File location, OutputStream output) {
- if (!(output instanceof BlockCompressedOutputStream)) {
- return new BlockCompressedOutputStream(output, location);
- } else {
- return (BlockCompressedOutputStream)output;
- }
- }
-
- /**
- * Writes b.length bytes from the specified byte array to this output stream. The general contract for write(b)
- * is that it should have exactly the same effect as the call write(b, 0, b.length).
- * @param bytes the data
- */
- @Override
- public void write(final byte[] bytes) throws IOException {
- write(bytes, 0, bytes.length);
- }
-
- /**
- * Writes len bytes from the specified byte array starting at offset off to this output stream. The general
- * contract for write(b, off, len) is that some of the bytes in the array b are written to the output stream in order;
- * element b[off] is the first byte written and b[off+len-1] is the last byte written by this operation.
- *
- * @param bytes the data
- * @param startIndex the start offset in the data
- * @param numBytes the number of bytes to write
- */
- @Override
- public void write(final byte[] bytes, int startIndex, int numBytes) throws IOException {
- assert(numUncompressedBytes < uncompressedBuffer.length);
- while (numBytes > 0) {
- final int bytesToWrite = Math.min(uncompressedBuffer.length - numUncompressedBytes, numBytes);
- System.arraycopy(bytes, startIndex, uncompressedBuffer, numUncompressedBytes, bytesToWrite);
- numUncompressedBytes += bytesToWrite;
- startIndex += bytesToWrite;
- numBytes -= bytesToWrite;
- assert(numBytes >= 0);
- if (numUncompressedBytes == uncompressedBuffer.length) {
- deflateBlock();
- }
- }
- }
-
- /**
- * WARNING: flush() affects the output format, because it causes the current contents of uncompressedBuffer
- * to be compressed and written, even if it isn't full. Unless you know what you're doing, don't call flush().
- * Instead, call close(), which will flush any unwritten data before closing the underlying stream.
- *
- */
- @Override
- public void flush() throws IOException {
- while (numUncompressedBytes > 0) {
- deflateBlock();
- }
- codec.getOutputStream().flush();
- }
-
- /**
- * close() must be called in order to flush any remaining buffered bytes. An unclosed file will likely be
- * defective.
- *
- */
- @Override
- public void close() throws IOException {
- flush();
- // For debugging...
- // if (numberOfThrottleBacks > 0) {
- // System.err.println("In BlockCompressedOutputStream, had to throttle back " + numberOfThrottleBacks +
- // " times for file " + codec.getOutputFileName());
- // }
- codec.writeBytes(BlockCompressedStreamConstants.EMPTY_GZIP_BLOCK);
- codec.close();
- // Can't re-open something that is not a regular file, e.g. a named pipe or an output stream
- if (this.file == null || !this.file.isFile()) return;
- if (BlockCompressedInputStream.checkTermination(this.file) !=
- BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK) {
- throw new IOException("Terminator block not found after closing BGZF file " + this.file);
- }
- }
-
- /**
- * Writes the specified byte to this output stream. The general contract for write is that one byte is written
- * to the output stream. The byte to be written is the eight low-order bits of the argument b.
- * The 24 high-order bits of b are ignored.
- * @param bite
- * @throws IOException
- */
- public void write(final int bite) throws IOException {
- singleByteArray[0] = (byte)bite;
- write(singleByteArray);
- }
-
- /** Encode virtual file pointer
- * Upper 48 bits is the byte offset into the compressed stream of a block.
- * Lower 16 bits is the byte offset into the uncompressed stream inside the block.
- */
- public long getFilePointer(){
- return BlockCompressedFilePointerUtil.makeFilePointer(mBlockAddress, numUncompressedBytes);
- }
-
- @Override
- public long getPosition() {
- return getFilePointer();
- }
-
- /**
- * Attempt to write the data in uncompressedBuffer to the underlying file in a gzip block.
- * If the entire uncompressedBuffer does not fit in the maximum allowed size, reduce the amount
- * of data to be compressed, and slide the excess down in uncompressedBuffer so it can be picked
- * up in the next deflate event.
- * @return size of gzip block that was written.
- */
- private int deflateBlock() {
- if (numUncompressedBytes == 0) {
- return 0;
- }
- final int bytesToCompress = numUncompressedBytes;
- // Compress the input
- deflater.reset();
- deflater.setInput(uncompressedBuffer, 0, bytesToCompress);
- deflater.finish();
- int compressedSize = deflater.deflate(compressedBuffer, 0, compressedBuffer.length);
-
- // If it didn't all fit in compressedBuffer.length, set compression level to NO_COMPRESSION
- // and try again. This should always fit.
- if (!deflater.finished()) {
- noCompressionDeflater.reset();
- noCompressionDeflater.setInput(uncompressedBuffer, 0, bytesToCompress);
- noCompressionDeflater.finish();
- compressedSize = noCompressionDeflater.deflate(compressedBuffer, 0, compressedBuffer.length);
- if (!noCompressionDeflater.finished()) {
- throw new IllegalStateException("unpossible");
- }
- }
- // Data compressed small enough, so write it out.
- crc32.reset();
- crc32.update(uncompressedBuffer, 0, bytesToCompress);
-
- final int totalBlockSize = writeGzipBlock(compressedSize, bytesToCompress, crc32.getValue());
- assert(bytesToCompress <= numUncompressedBytes);
-
- // Clear out from uncompressedBuffer the data that was written
- if (bytesToCompress == numUncompressedBytes) {
- numUncompressedBytes = 0;
- } else {
- System.arraycopy(uncompressedBuffer, bytesToCompress, uncompressedBuffer, 0,
- numUncompressedBytes - bytesToCompress);
- numUncompressedBytes -= bytesToCompress;
- }
- mBlockAddress += totalBlockSize;
- return totalBlockSize;
- }
-
- /**
- * Writes the entire gzip block, assuming the compressed data is stored in compressedBuffer
- * @return size of gzip block that was written.
- */
- private int writeGzipBlock(final int compressedSize, final int uncompressedSize, final long crc) {
- // Init gzip header
- codec.writeByte(BlockCompressedStreamConstants.GZIP_ID1);
- codec.writeByte(BlockCompressedStreamConstants.GZIP_ID2);
- codec.writeByte(BlockCompressedStreamConstants.GZIP_CM_DEFLATE);
- codec.writeByte(BlockCompressedStreamConstants.GZIP_FLG);
- codec.writeInt(0); // Modification time
- codec.writeByte(BlockCompressedStreamConstants.GZIP_XFL);
- codec.writeByte(BlockCompressedStreamConstants.GZIP_OS_UNKNOWN);
- codec.writeShort(BlockCompressedStreamConstants.GZIP_XLEN);
- codec.writeByte(BlockCompressedStreamConstants.BGZF_ID1);
- codec.writeByte(BlockCompressedStreamConstants.BGZF_ID2);
- codec.writeShort(BlockCompressedStreamConstants.BGZF_LEN);
- final int totalBlockSize = compressedSize + BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH +
- BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH;
-
- // I don't know why we store block size - 1, but that is what the spec says
- codec.writeShort((short)(totalBlockSize - 1));
- codec.writeBytes(compressedBuffer, 0, compressedSize);
- codec.writeInt((int)crc);
- codec.writeInt(uncompressedSize);
- return totalBlockSize;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java b/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java
deleted file mode 100644
index 4f45057..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockCompressedStreamConstants.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-/**
- * Constants shared by BlockCompressed{Input,Output}Stream classes
- */
-public class BlockCompressedStreamConstants {
- // Number of bytes in the gzip block before the deflated data.
- // This is not the standard header size, because we include one optional subfield,
- // but it is the standard for us.
- public static final int BLOCK_HEADER_LENGTH = 18;
-
- // Location in the gzip block of the total block size (actually total block size - 1)
- public static final int BLOCK_LENGTH_OFFSET = 16;
-
- // Number of bytes that follow the deflated data
- public static final int BLOCK_FOOTER_LENGTH = 8;
-
- // We require that a compressed block (including header and footer, be <= this)
- public static final int MAX_COMPRESSED_BLOCK_SIZE = 64 * 1024;
-
- // Gzip overhead is the header, the footer, and the block size (encoded as a short).
- public static final int GZIP_OVERHEAD = BLOCK_HEADER_LENGTH + BLOCK_FOOTER_LENGTH + 2;
-
- // If Deflater has compression level == NO_COMPRESSION, 10 bytes of overhead (determined experimentally).
- public static final int NO_COMPRESSION_OVERHEAD = 10;
-
- // Push out a gzip block when this many uncompressed bytes have been accumulated.
- // This size is selected so that if data is not compressible, if Deflater is given
- // compression level == NO_COMPRESSION, compressed size is guaranteed to be <= MAX_COMPRESSED_BLOCK_SIZE.
- public static final int DEFAULT_UNCOMPRESSED_BLOCK_SIZE = 64 * 1024 - (GZIP_OVERHEAD + NO_COMPRESSION_OVERHEAD);
-
- // Magic numbers
- public static final byte GZIP_ID1 = 31;
- public static final int GZIP_ID2 = 139;
-
- // FEXTRA flag means there are optional fields
- public static final int GZIP_FLG = 4;
-
- // extra flags
- public static final int GZIP_XFL = 0;
-
- // length of extra subfield
- public static final short GZIP_XLEN = 6;
-
- // The deflate compression, which is customarily used by gzip
- public static final byte GZIP_CM_DEFLATE = 8;
-
- public static final int DEFAULT_COMPRESSION_LEVEL = Defaults.COMPRESSION_LEVEL;
-
- // We don't care about OS because we're not doing line terminator translation
- public static final int GZIP_OS_UNKNOWN = 255;
-
- // The subfield ID
- public static final byte BGZF_ID1 = 66;
- public static final byte BGZF_ID2 = 67;
-
- // subfield length in bytes
- public static final byte BGZF_LEN = 2;
-
- public static final byte[] EMPTY_GZIP_BLOCK = {
- BlockCompressedStreamConstants.GZIP_ID1,
- (byte)BlockCompressedStreamConstants.GZIP_ID2,
- BlockCompressedStreamConstants.GZIP_CM_DEFLATE,
- BlockCompressedStreamConstants.GZIP_FLG,
- 0, 0, 0, 0, // Modification time
- BlockCompressedStreamConstants.GZIP_XFL,
- (byte)BlockCompressedStreamConstants.GZIP_OS_UNKNOWN,
- BlockCompressedStreamConstants.GZIP_XLEN, 0, // Little-endian short
- BlockCompressedStreamConstants.BGZF_ID1,
- BlockCompressedStreamConstants.BGZF_ID2,
- BlockCompressedStreamConstants.BGZF_LEN, 0, // Little-endian short
- // Total block size - 1
- BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH +
- BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH - 1 + 2, 0, // Little-endian short
- // Dummy payload?
- 3, 0,
- 0, 0, 0, 0, // crc
- 0, 0, 0, 0, // uncompressedSize
- };
- public static final byte[] GZIP_BLOCK_PREAMBLE = {
- BlockCompressedStreamConstants.GZIP_ID1,
- (byte)BlockCompressedStreamConstants.GZIP_ID2,
- BlockCompressedStreamConstants.GZIP_CM_DEFLATE,
- BlockCompressedStreamConstants.GZIP_FLG,
- 0, 0, 0, 0, // Modification time
- BlockCompressedStreamConstants.GZIP_XFL,
- (byte)BlockCompressedStreamConstants.GZIP_OS_UNKNOWN,
- BlockCompressedStreamConstants.GZIP_XLEN, 0, // Little-endian short
- BlockCompressedStreamConstants.BGZF_ID1,
- BlockCompressedStreamConstants.BGZF_ID2,
- BlockCompressedStreamConstants.BGZF_LEN, 0, // Little-endian short
- };
-}
diff --git a/src/main/java/htsjdk/samtools/util/BlockGunzipper.java b/src/main/java/htsjdk/samtools/util/BlockGunzipper.java
deleted file mode 100644
index 18e9285..0000000
--- a/src/main/java/htsjdk/samtools/util/BlockGunzipper.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFormatException;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.zip.CRC32;
-import java.util.zip.DataFormatException;
-import java.util.zip.Inflater;
-
-/**
- * Alternative to GZIPInputStream, for decompressing GZIP blocks that are already loaded into a byte[].
- * The main advantage is that this object can be used over and over again to decompress many blocks,
- * whereas a new GZIPInputStream and ByteArrayInputStream would otherwise need to be created for each
- * block to be decompressed.
- *
- * This code requires that the GZIP header conform to the GZIP blocks written to BAM files, with
- * a specific subfield and no other optional stuff.
- *
- * @author alecw at broadinstitute.org
- */
-public class BlockGunzipper {
- private final Inflater inflater = new Inflater(true); // GZIP mode
- private final CRC32 crc32 = new CRC32();
- private boolean checkCrcs = false;
-
- /** Allows the caller to decide whether or not to check CRCs on when uncompressing blocks. */
- public void setCheckCrcs(final boolean check) {
- this.checkCrcs = check;
- }
-
- /**
- * Decompress GZIP-compressed data
- * @param uncompressedBlock must be big enough to hold decompressed output.
- * @param compressedBlock compressed data starting at offset 0
- * @param compressedLength size of compressed data, possibly less than the size of the buffer.
- * @return the uncompressed data size.
- */
- public int unzipBlock(byte[] uncompressedBlock, byte[] compressedBlock, int compressedLength) {
- return unzipBlock(uncompressedBlock, 0, compressedBlock, 0, compressedLength);
- }
-
- /**
- * Decompress GZIP-compressed data
- * @param uncompressedBlock must be big enough to hold decompressed output.
- * @param uncompressedBlockOffset the offset into uncompressedBlock.
- * @param compressedBlock compressed data starting at offset 0.
- * @param compressedBlock the offset into the compressed data.
- * @param compressedLength size of compressed data, possibly less than the size of the buffer.
- * @return the uncompressed data size.
- */
- public int unzipBlock(byte[] uncompressedBlock, int uncompressedBlockOffset,
- byte[] compressedBlock, int compressedBlockOffset, int compressedLength) {
- int uncompressedSize;
- try {
- ByteBuffer byteBuffer = ByteBuffer.wrap(compressedBlock, compressedBlockOffset, compressedLength);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-
- // Validate GZIP header
- if (byteBuffer.get() != BlockCompressedStreamConstants.GZIP_ID1 ||
- byteBuffer.get() != (byte)BlockCompressedStreamConstants.GZIP_ID2 ||
- byteBuffer.get() != BlockCompressedStreamConstants.GZIP_CM_DEFLATE ||
- byteBuffer.get() != BlockCompressedStreamConstants.GZIP_FLG
- ) {
- throw new SAMFormatException("Invalid GZIP header");
- }
- // Skip MTIME, XFL, OS fields
- byteBuffer.position(byteBuffer.position() + 6);
- if (byteBuffer.getShort() != BlockCompressedStreamConstants.GZIP_XLEN) {
- throw new SAMFormatException("Invalid GZIP header");
- }
- // Skip blocksize subfield intro
- byteBuffer.position(byteBuffer.position() + 4);
- // Read ushort
- final int totalBlockSize = (byteBuffer.getShort() & 0xffff) + 1;
- if (totalBlockSize != compressedLength) {
- throw new SAMFormatException("GZIP blocksize disagreement");
- }
-
- // Read expected size and CRD from end of GZIP block
- final int deflatedSize = compressedLength - BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH - BlockCompressedStreamConstants.BLOCK_FOOTER_LENGTH;
- byteBuffer.position(byteBuffer.position() + deflatedSize);
- int expectedCrc = byteBuffer.getInt();
- uncompressedSize = byteBuffer.getInt();
- inflater.reset();
-
- // Decompress
- inflater.setInput(compressedBlock, compressedBlockOffset + BlockCompressedStreamConstants.BLOCK_HEADER_LENGTH, deflatedSize);
- final int inflatedBytes = inflater.inflate(uncompressedBlock, uncompressedBlockOffset, uncompressedSize);
- if (inflatedBytes != uncompressedSize) {
- throw new SAMFormatException("Did not inflate expected amount");
- }
-
- // Validate CRC if so desired
- if (this.checkCrcs) {
- crc32.reset();
- crc32.update(uncompressedBlock, uncompressedBlockOffset, uncompressedSize);
- final long crc = crc32.getValue();
- if ((int)crc != expectedCrc) {
- throw new SAMFormatException("CRC mismatch");
- }
- }
- } catch (DataFormatException e)
- {
- throw new RuntimeIOException(e);
- }
- return uncompressedSize;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/BufferedLineReader.java b/src/main/java/htsjdk/samtools/util/BufferedLineReader.java
deleted file mode 100644
index de1115d..0000000
--- a/src/main/java/htsjdk/samtools/util/BufferedLineReader.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.Charset;
-
-/**
- * Implementation of LineReader that is a thin wrapper around BufferedReader. On Linux, this is faster
- * than AsciiLineReaderImpl. If you use AsciiLineReader rather than this class, it will detect the OS
- * and delegate to the preferred implementation.
- *
- * TODO: Replace this with {@link java.io.LineNumberReader}?
- *
- * @author alecw at broadinstitute.org
- */
-public class BufferedLineReader implements LineReader {
-
- private final BufferedReader reader;
- private int lineNumber = 0;
- private String peekedLine;
-
- public BufferedLineReader(final InputStream is) {
- this(is, Defaults.NON_ZERO_BUFFER_SIZE);
- }
-
- public BufferedLineReader(final InputStream is, final int bufferSize) {
- reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")), bufferSize);
- }
-
- /**
- * Read a line and remove the line terminator
- *
- * @return the line read, or null if EOF has been reached.
- */
- public String readLine() {
- ++lineNumber;
- try {
- final String ret;
- if (peekedLine != null) {
- ret = peekedLine;
- peekedLine = null;
- } else {
- ret = reader.readLine();
- }
- return ret;
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * @return 1-based number of line most recently read
- */
- public int getLineNumber() {
- return lineNumber;
- }
-
- /**
- * Non-destructive one-character look-ahead.
- *
- * @return If not eof, the next character that would be read. If eof, -1.
- */
- public int peek() {
- if (peekedLine == null) {
- try {
- peekedLine = reader.readLine();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
- if (peekedLine == null) {
- return -1;
- }
- if (peekedLine.isEmpty()) {
- return '\n';
- }
- return peekedLine.charAt(0);
- }
-
- public void close() {
- peekedLine = null;
- try {
- reader.close();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CigarUtil.java b/src/main/java/htsjdk/samtools/util/CigarUtil.java
deleted file mode 100644
index e6c14ab..0000000
--- a/src/main/java/htsjdk/samtools/util/CigarUtil.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.TextCigarCodec;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class CigarUtil {
- private static final Log log = Log.getInstance(CigarUtil.class);
-
- /** adjust the cigar based on adapter clipping.
- * TODO: If there is hard clipping at the end of the input CIGAR, it is lost. It should not be.
- * *
- * @param clipFrom 1-based position where the clipping starts
- * @param oldCigar The existing unclipped cigar
- * @return New adjusted list of cigar elements
- */
- // package visible so can be unit-tested
- public static List<CigarElement> softClipEndOfRead(final int clipFrom, final List<CigarElement> oldCigar) {
- final int clippedBases = (int)CoordMath.getLength(clipFrom, Cigar.getReadLength(oldCigar));
- List<CigarElement> newCigar = new LinkedList<CigarElement>();
- int pos = 1;
-
- for (CigarElement c : oldCigar) {
- // Distinguish two cases:
- // c occurs before the clipped region
- // c is adjacent to or straddles the boundary between clipped and unclipped region.
- // c never occurs after the clipped region; clipped region is always at the end
-
- final CigarOperator op = c.getOperator();
- final int length = op.consumesReadBases()? c.getLength() : 0;
- final int endPos = pos + length - 1; // same as pos on next iteration
-
- if (endPos < (clipFrom - 1)) {
- // handle elements before clip position (just copy them)
- newCigar.add(c);
-
- } else if (endPos >= (clipFrom - 1)) {
- // handle adjacent or straddling element
- elementStraddlesClippedRead(newCigar, c,
- (clipFrom -1) - (pos -1) , clippedBases);
- break;
- }
-
- pos = endPos + 1; // update pos for next iteration
- } // end loop over cigar elements
- return newCigar;
- }
-
- // a cigar element occurs in the middle of an adapter clipping
- static private void elementStraddlesClippedRead(List<CigarElement> newCigar, CigarElement c,
- int relativeClippedPosition,
- int clippedBases){
- final CigarOperator op = c.getOperator();
- int clipAmount = clippedBases;
- if (op.consumesReadBases()){
- if (op.consumesReferenceBases() & relativeClippedPosition > 0){
- newCigar.add(new CigarElement(relativeClippedPosition, op));
- }
- if (!op.consumesReferenceBases()){
- clipAmount = clippedBases + relativeClippedPosition;
- }
- } else if (relativeClippedPosition != 0){
- throw new SAMException("Unexpected non-0 relativeClippedPosition " + relativeClippedPosition);
- }
- newCigar.add(new CigarElement(clipAmount, CigarOperator.S)); // S is always last element
- }
-
- /**
- * Adds a soft-clip, based on <code>clipFrom</code>, to the SAM record's existing cigar
- * and, for negative strands, also adjusts the SAM record's start position.
- * Soft clips the end of the read as the read came off the sequencer.
- */
- public static void softClip3PrimeEndOfRead(SAMRecord rec, final int clipFrom) {
-
- final Cigar cigar = rec.getCigar();
- // we don't worry about SEED_REGION_LENGTH in clipFrom
- final boolean negativeStrand = rec.getReadNegativeStrandFlag();
- List<CigarElement> oldCigar = cigar.getCigarElements();
-
- if (!isValidCigar(rec, cigar, true)){
- return; // log message already issued
- }
- if (negativeStrand){
- // Can't just use Collections.reverse() here because oldCigar is unmodifiable
- oldCigar = new ArrayList<CigarElement>(oldCigar);
- Collections.reverse(oldCigar);
- }
- List<CigarElement> newCigarElems = CigarUtil.softClipEndOfRead(clipFrom, oldCigar);
-
- if (negativeStrand) {
- Collections.reverse(newCigarElems);
- }
-
- final Cigar newCigar = new Cigar(newCigarElems);
- if (negativeStrand){
- int oldLength = cigar.getReferenceLength();
- int newLength = newCigar.getReferenceLength();
- int sizeChange = oldLength - newLength;
- if (sizeChange > 0){
- rec.setAlignmentStart(rec.getAlignmentStart() + sizeChange);
- } else if (sizeChange < 0){
- throw new SAMException("The clipped length " + newLength +
- " is longer than the old unclipped length " + oldLength);
- }
- }
- rec.setCigar(newCigar);
-
- // Check that the end result is not a read without any aligned bases
- boolean hasMappedBases = false;
- for (final CigarElement elem : newCigar.getCigarElements()) {
- final CigarOperator op = elem.getOperator();
- if (op.consumesReferenceBases() && op.consumesReadBases()) {
- hasMappedBases = true;
- break;
- }
- }
-
- if (!hasMappedBases) {
- rec.setReadUnmappedFlag(true);
- rec.setCigarString(SAMRecord.NO_ALIGNMENT_CIGAR);
- rec.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- rec.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- rec.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY);
- rec.setInferredInsertSize(0);
- }
- else if (!isValidCigar(rec, newCigar, false)){
- // log message already issued
- throw new IllegalStateException("Invalid new Cigar: " + newCigar + " (" + oldCigar + ") for " +
- rec.getReadName());
- }
-
- }
-
- private static boolean isValidCigar(SAMRecord rec, Cigar cigar, boolean isOldCigar) {
- if (cigar == null || cigar.getCigarElements() == null || cigar.getCigarElements().isEmpty()) {
- if (isOldCigar) {
- if (rec.getReadUnmappedFlag()) {
- // don't bother to warn since this does occur for PE reads
- } else {
- log.warn("Cigar is empty for read " + rec);
- }
- } else {
- log.error("Empty new cigar");
- }
- return false;
- }
-
- if (rec.getReadUnmappedFlag()){
- log.info("Unmapped read with cigar: " + rec.getReadName() + " (" + rec.getCigarString() + "/" + cigar.toString() + ")");
-
- }
- final List<SAMValidationError> validationErrors = cigar.isValid(rec.getReadName(), -1);
- if (validationErrors != null && !validationErrors.isEmpty()) {
- log.error("Invalid cigar for read " + rec +
- (isOldCigar ? " " : " for new cigar with clipped adapter ") +
- " (" + rec.getCigarString() + "/" + cigar.toString() + ") " +
- validationErrors);
- return false;
- }
-
- if (rec.getReadLength() != cigar.getReadLength()){
- // throw new SAMException(
- log.error( rec.getReadLength() +
- " read length does not = cigar length " + cigar.getReferenceLength() +
- (isOldCigar? " oldCigar " : " ") +
- rec + " cigar:" + cigar);
- return false;
- }
- return true;
- }
-
- /**
- * Adds additional soft-clipped bases at the 3' and/or 5' end of the cigar. Does not
- * change the existing cigar except to merge the newly added soft-clipped bases if the
- * element at the end of the cigar being modified is also a soft-clip.
- *
- * @param cigar The cigar on which to base the new cigar
- * @param negativeStrand Whether the read is on the negative strand
- * @param threePrimeEnd number of soft-clipped bases to add to the 3' end of the read
- * @param fivePrimeEnd number of soft-clipped bases to add to the 5' end of the read
- */
- public static Cigar addSoftClippedBasesToEndsOfCigar(Cigar cigar, boolean negativeStrand,
- final int threePrimeEnd, final int fivePrimeEnd) {
-
- List<CigarElement> newCigar = new ArrayList<CigarElement>(cigar.getCigarElements());
- if (negativeStrand) {
- Collections.reverse(newCigar);
- }
-
- if (threePrimeEnd > 0) {
- int last = newCigar.size()-1;
- int bases = threePrimeEnd;
- if (newCigar.get(last).getOperator() == CigarOperator.SOFT_CLIP) {
- CigarElement oldSoftClip = newCigar.remove(last);
- bases += oldSoftClip.getLength();
- }
- newCigar.add(new CigarElement(bases, CigarOperator.SOFT_CLIP));
- }
-
- if (fivePrimeEnd > 0) {
- int bases = fivePrimeEnd;
- if (newCigar.get(0).getOperator() == CigarOperator.SOFT_CLIP) {
- CigarElement oldSoftClip = newCigar.remove(0);
- bases += oldSoftClip.getLength();
- }
- newCigar.add(0, new CigarElement(bases, CigarOperator.SOFT_CLIP));
- }
-
- if (negativeStrand) {
- Collections.reverse(newCigar);
- }
- return new Cigar(newCigar);
- }
-
- // unpack a cigar string into an array of cigarOperators
- // to facilitate sequence manipulation
- public static char[] cigarArrayFromElements(List<CigarElement> cigar){
- int pos = 0;
- int length = 0;
- for (CigarElement e : cigar){
- length += e.getLength();
- }
- char[] result = new char[length];
- for (CigarElement e : cigar){
- for (int i = 0; i < e.getLength(); i++){
- CigarOperator o = e.getOperator();
- result[i+pos] = (char) CigarOperator.enumToCharacter(o);
- }
- pos += e.getLength();
- }
- return result;
- }
-
- // unpack a cigar string into an array of cigarOperators
- // to facilitate sequence manipulation
- public static char[] cigarArrayFromString(String cigar){
- return cigarArrayFromElements(TextCigarCodec.decode(cigar).getCigarElements());
- }
-
- // construct a cigar string from an array of cigarOperators.
- public static String cigarStringFromArray(final char[] cigar){
- String result = "";
- int length = cigar.length;
- char lastOp = 0; int lastLen = 0;
- for (int i=0; i < length; i++){
- if (cigar[i] == lastOp){
- lastLen++;
- } else if (cigar[i] == '-'){
- ; // nothing - just ignore '-'
- } else {
- if (lastOp != 0)
- result = result + Integer.toString(lastLen) + Character.toString(lastOp);
- lastLen = 1;
- lastOp = cigar[i];
- }
- }
- return result + Integer.toString(lastLen) + Character.toString(lastOp);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CloseableIterator.java b/src/main/java/htsjdk/samtools/util/CloseableIterator.java
deleted file mode 100755
index d26443e..0000000
--- a/src/main/java/htsjdk/samtools/util/CloseableIterator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Spliterator;
-import java.util.Spliterators;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-/**
- * This interface is used by iterators that use releasable resources during iteration.
- *
- * The consumer of a CloseableIterator should ensure that the close() method is always called,
- * for example by putting such a call in a finally block. Two conventions should be followed
- * by all implementors of CloseableIterator:
- * 1) The close() method should be idempotent: calling close() twice should have no effect.
- * 2) When hasNext() returns false, the iterator implementation should automatically close itself.
- * The latter makes it somewhat safer for consumers to use the for loop syntax for iteration:
- * for (Type obj : getCloseableIterator()) { ... }
- */
-public interface CloseableIterator<T> extends Iterator<T>, Closeable {
- /** Should be implemented to close/release any underlying resources. */
- void close();
-
- /** Consumes the contents of the iterator and returns it as a List. */
- default List<T> toList() {
- final List<T> list = new ArrayList<>();
- while (hasNext()) list.add(next());
- close();
- return list;
- }
-
- /** Returns a Stream that will consume from the underlying iterator. */
- default Stream<T> stream() {
- final Spliterator<T> s = Spliterators.spliteratorUnknownSize(this, Spliterator.ORDERED);
- return StreamSupport.stream(s, false).onClose(this::close);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CloserUtil.java b/src/main/java/htsjdk/samtools/util/CloserUtil.java
deleted file mode 100644
index c236197..0000000
--- a/src/main/java/htsjdk/samtools/util/CloserUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Utility to close things that implement Closeable
- * WARNING: This should only be used for Closeable things open for read, because it ignores exceptions, and
- * the caller will probably want to know about exceptions when closing a file being written to, because
- * this may indicate a failure to flush.
- *
- * @author Kathleen Tibbetts
- */
-public class CloserUtil {
-
- /**
- * Calls close() on <code>obj</code> if it implements Closeable
- *
- * @param obj The potentially closeable object
- */
- public static void close(Object obj) {
- if (obj != null) {
- close(Arrays.asList(obj));
- }
- }
-
- /**
- * Calls close() on all elements of <code>objs</code> that implement Closeable
- *
- * @param objs A list of potentially closeable objects
- *
- * NOTE: This method must take a List<? extends Object>, not List<Object>, otherwise the overload above will be selected
- * if the argument is not exactly List<Object>.
- */
- public static void close(List<? extends Object> objs) {
- for (Object o : objs) {
- if (o instanceof Closeable) {
- try {
- ((Closeable)o).close();
- }
- catch (IOException ioe) {
- // Do nothing
- }
- } else if (o instanceof CloseableIterator) {
- ((CloseableIterator)o).close();
- }
- else {
- try {
- java.lang.reflect.Method m = o.getClass().getMethod("close");
- m.invoke(o);
- }
- catch (Exception e) { /** Ignore */ }
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CodeUtil.java b/src/main/java/htsjdk/samtools/util/CodeUtil.java
deleted file mode 100644
index 29e9348..0000000
--- a/src/main/java/htsjdk/samtools/util/CodeUtil.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Miscellaneous util methods that don't fit anywhere else.
- */
-public class CodeUtil {
-
- /** Mimic of Oracle's nvl() - returns the first value if not null, otherwise the second value. */
- public static <T> T getOrElse(final T value1, final T value2) {
- if (value1 != null) return value1;
- else return value2;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/CollectionUtil.java b/src/main/java/htsjdk/samtools/util/CollectionUtil.java
deleted file mode 100755
index 0354a5b..0000000
--- a/src/main/java/htsjdk/samtools/util/CollectionUtil.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-
-/**
- * Small utility methods for dealing with collection classes.
- * @author mccowan
- */
-public class CollectionUtil {
-
- /** Simple case-insensitive lexical comparator of objects using their {@link Object#toString()} value. */
- final public static Comparator<Object> OBJECT_TOSTRING_COMPARATOR = (o1, o2) -> o1.toString().compareToIgnoreCase(o2.toString());
-
- public static <T> List<T> makeList(final T... list) {
- final List<T> result = new ArrayList<>();
- Collections.addAll(result, list);
-
- return result;
- }
-
- public static <T> Set<T> makeSet(final T... list) {
- final Set<T> result = new HashSet<>();
- Collections.addAll(result, list);
- return result;
- }
-
- public static <T> Collection<T> makeCollection(final Iterator<T> i) {
- final List<T> list = new LinkedList<>();
- while (i.hasNext()) {
- list.add(i.next());
- }
- return list;
- }
-
- /** Construct a string by toString()ing each item in the collection with inBetween between each item. */
- public static String join(final Collection<?> items, final String inBetween) {
- final StringBuilder builder = new StringBuilder();
- for (final Object item : items) {
- if (builder.length() > 0) builder.append(inBetween);
- builder.append(item);
- }
-
- return builder.toString();
- }
-
- public static <T> T getSoleElement(final Collection<T> items) {
- if (items.size() != 1)
- throw new IllegalArgumentException(String.format("Expected a single element in %s, but found %s.", items, items.size()));
- return items.iterator().next();
- }
-
- /** Simple multi-map for convenience of storing collections in map values. */
- public static class MultiMap<K, V> extends HashMap<K, Collection<V>> {
- public void append(final K k, final V v) {
- this.initializeKeyIfUninitialized(k);
- this.get(k).add(v);
- }
-
- public void appendAll(final K k, final Collection<? extends V> v) {
- this.initializeKeyIfUninitialized(k);
- this.get(k).addAll(v);
- }
-
- private void initializeKeyIfUninitialized(final K k) {
- if (!this.containsKey(k))
- this.put(k, new LinkedList<>());
- }
- }
-
- /**
- * Partitions a collection into groups based on a characteristics of that group. Partitions are embodied in a map, whose keys are the
- * value of that characteristic, and the values are the partition of elements whose characteristic evaluate to that key.
- *
- * @deprecated use java8 .stream().collect(Collectors.groupingBy(()-> function)) instead
- */
- @Deprecated
- public static <K, V> Map<K, Collection<V>> partition(final Collection<V> collection, final Partitioner<V, K> p) {
- final MultiMap<K, V> partitionToValues = new MultiMap<>();
- for (final V entry : collection) {
- partitionToValues.append(p.getPartition(entry), entry);
- }
- return partitionToValues;
- }
-
- /**
- * @deprecated use Collectors.groupingBy instead
- */
- @Deprecated
- public static abstract class Partitioner<V, K> {
- public abstract K getPartition(final V v);
- }
-
- /**
- * Partitions a collection into groups based on a characteristics of that group. Partitions are embodied in a map, whose keys are the
- * value of that characteristic, and the values are the partition of elements whose characteristic evaluate to that key.
- */
- public static <K, V> Map<K, Collection<V>> partition(final Collection<V> collection, final Function<? super V, ? extends K> keyer) {
- final MultiMap<K, V> partitionToValues = new MultiMap<>();
- for (final V entry : collection) {
- partitionToValues.append(keyer.apply(entry), entry);
- }
- return partitionToValues;
- }
-
- /**
- * A defaulting map, which returns a default value when a value that does not exist in the map is looked up.
- *
- * This map supports two modes: injecting-on-default, and not injecting-on-default. When injecting on default, when a lookup is
- * performed and a default value is returned, the default value is injected at that key, so that it now lives in the underlying map.
- * Without this mode, the value is simply returned and the underlying map is unaffected.
- *
- * Note: When using injecting-on-default mode, and performing a lookup with a non-key type (the get method accepts any object), a
- * class cast exception will be thrown because a non-key type cannot be added to the map.
- * @param <K>
- * @param <V>
- */
- public static class DefaultingMap<K, V> extends HashMap<K, V> {
- final Factory<V, K> defaultGenerator;
- final boolean injectValueOnDefault;
-
- /** Creates a defaulting map which defaults to the provided value and with injecting-on-default disabled. */
- public DefaultingMap(final V defaultValue) {
- this(k -> defaultValue, false);
- }
-
- /**
- * Creates a defaulting map that generates defaults from the provided factory. This is useful when the default is non-static, or
- * the default is mutable, and the client wishes to get a value and mutate it and persist those changes in the map.
- */
- public DefaultingMap(final Factory<V, K> defaultGenerator, final boolean injectValueOnDefaulting) {
- this.defaultGenerator = defaultGenerator;
- this.injectValueOnDefault = injectValueOnDefaulting;
- }
-
- @Override
- @SuppressWarnings("unchecked") // Expect that the cast is successful; otherwise, client is breaking contract.
- public V get(final Object key) {
- if (!this.containsKey(key)) {
- final V val = this.defaultGenerator.make((K) key);
- if (this.injectValueOnDefault) {
- this.put((K) key, val);
- }
- return val;
- } else {
- return super.get(key);
- }
- }
-
- public interface Factory<V, K> {
- /**
- * @param k
- */
- V make(K k);
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ComparableTuple.java b/src/main/java/htsjdk/samtools/util/ComparableTuple.java
deleted file mode 100644
index 1fe86ed..0000000
--- a/src/main/java/htsjdk/samtools/util/ComparableTuple.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * A simple extension of the Tuple class that, for comparable Types, allows comparing Tuples of non-null elements.
- * <p>
- * The comparison will compare the first arguments and if equal (compareTo returns 0) compare the second arguments.
- *
- * @author farjoun
- */
-public class ComparableTuple<A extends Comparable<A>, B extends Comparable<B>> extends Tuple<A, B> implements Comparable<ComparableTuple<A, B>> {
-
- public ComparableTuple(final A a, final B b) {
- super(a, b);
-
- if (a == null || b == null) {
- throw new IllegalArgumentException("ComparableTuple's behavior is undefined when containing a null.");
- }
- }
-
- @Override
- public int compareTo(final ComparableTuple<A, B> o) {
- int retval = a.compareTo(o.a);
- if (retval == 0) {
- retval = b.compareTo(o.b);
- }
- return retval;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CoordMath.java b/src/main/java/htsjdk/samtools/util/CoordMath.java
deleted file mode 100644
index 7682026..0000000
--- a/src/main/java/htsjdk/samtools/util/CoordMath.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Static methods that encapsulate the standard SAM way of storing ranges: one-based, with both ends
- * inclusive.
- */
-public class CoordMath {
-
- public static int getLength(final int start, final int end) {
- return (end - start) + 1;
- }
-
- public static int getStart(final int end, final int length) {
- return end - length + 1;
- }
-
- public static int getEnd(final int start, final int length) {
- return start + length - 1;
- }
-
- /**
- * Checks to see if the two sets of coordinates have any overlap.
- */
- public static boolean overlaps(final int start, final int end, final int start2, final int end2) {
- return (start2 >= start && start2 <= end) || (end2 >=start && end2 <= end) ||
- encloses(start2, end2, start, end);
- }
-
- /** Returns true if the "inner" coords and totally enclosed by the "outer" coords. */
- public static boolean encloses(final int outerStart, final int outerEnd, final int innerStart, final int innerEnd) {
- return innerStart >= outerStart && innerEnd <= outerEnd;
- }
-
- /**
- * Determines the amount of overlap between two coordinate ranges. Assumes that the two ranges
- * actually do overlap and therefore may produce strange results when they do not!
- */
- public static int getOverlap(final int start, final int end, final int start2, final int end2) {
- return getLength(Math.max(start, start2), Math.min(end, end2));
- }
-
- /**
- * Determines the read cycle number for the base
- *
- * @param isNegativeStrand true if the read is negative strand
- * @param readLength
- * @param readBaseIndex the 0-based index of the read base in question
- */
- public static int getCycle(boolean isNegativeStrand, int readLength, final int readBaseIndex) {
- return isNegativeStrand ? readLength - readBaseIndex : readBaseIndex + 1;
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java b/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java
deleted file mode 100644
index 92f60f7..0000000
--- a/src/main/java/htsjdk/samtools/util/CoordSpanInputSteam.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An input stream that wraps a {@link htsjdk.samtools.seekablestream.SeekableStream} to produce only bytes specified within coordinates.
- * Created by vadim on 25/03/2015.
- */
-public class CoordSpanInputSteam extends InputStream {
- private SeekableStream delegate;
- private Iterator<Chunk> it;
- private Chunk current;
- private boolean eof = false;
-
- /**
- * Wrap {@link htsjdk.samtools.seekablestream.SeekableStream} to read only bytes within boundaries specified in the coords array.
- * The coords array consists of [inclusive; exclusive) pairs of long coordinates.
- * This constructor will throw exception if a start coordinate is beyond stream length.
- * End coordinates are capped at the stream length.
- */
- public CoordSpanInputSteam(SeekableStream delegate, long[] coords) throws IOException {
- this.delegate = delegate;
-
- List<Chunk> chunks = new ArrayList<Chunk>();
- for (int i = 0; i < coords.length; i += 2) {
- if (coords[i] > delegate.length()) throw new RuntimeException("Chunk start is passed EOF: " + coords[i]);
- Chunk chunk = new Chunk(coords[i], coords[i + 1] > delegate.length() ? delegate.length() : coords[i + 1]);
- chunks.add(chunk);
- System.err.printf("Adding chunk: %d - %d\n", chunk.getChunkStart(), chunk.getChunkEnd());
- }
- it = chunks.iterator();
- nextChunk();
- }
-
- private void nextChunk() throws IOException {
- if (eof || !it.hasNext()) {
- eof = true;
- return;
- }
-
- current = it.next();
- delegate.seek(current.getChunkStart());
- }
-
- @Override
- public int read() throws IOException {
- if (eof || delegate.eof()) {
- eof = true;
- return -1;
- }
-
- if (delegate.position() < current.getChunkEnd())
- return delegate.read();
-
- nextChunk();
-
- if (eof) return -1;
- return delegate.read();
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length) throws IOException {
- if (eof || delegate.eof()) {
- eof = true;
- return -1;
- }
-
- int available = available();
- if (available > length) return delegate.read(buffer, offset, length);
-
- int read = delegate.read(buffer, offset, available);
- if (delegate.position() >= current.getChunkEnd())
- nextChunk();
- return read;
- }
-
- /**
- * Returns how many bytes are left in the current chunk.
- *
- * @return number of unread bytes in the current chunk.
- * @throws IOException
- */
- @Override
- public int available() throws IOException {
- return (int) (current.getChunkEnd() - delegate.position());
- }
-
- @Override
- public void close() throws IOException {
- delegate.close();
- it = null;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java b/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java
deleted file mode 100644
index cb3652e..0000000
--- a/src/main/java/htsjdk/samtools/util/CustomGzipOutputStream.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Hacky little class used to allow us to set the compression level on a GZIP output stream which, for some
- * bizarre reason, is not exposed in the standard API.
- *
- * @author Tim Fennell
- */
-public class CustomGzipOutputStream extends GZIPOutputStream {
- CustomGzipOutputStream(final OutputStream outputStream, final int bufferSize, final int compressionLevel) throws
- IOException {
- super(outputStream, bufferSize);
- this.def.setLevel(compressionLevel);
- }
-
- CustomGzipOutputStream(final OutputStream outputStream, final int compressionLevel) throws IOException {
- super(outputStream);
- this.def.setLevel(compressionLevel);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DateParser.java b/src/main/java/htsjdk/samtools/util/DateParser.java
deleted file mode 100644
index 02a9609..0000000
--- a/src/main/java/htsjdk/samtools/util/DateParser.java
+++ /dev/null
@@ -1,337 +0,0 @@
-// DateParser.java
-// $Id: DateParser.java,v 1.3 2001/01/04 13:26:19 bmahe Exp $
-// (c) COPYRIGHT MIT, INRIA and Keio, 2000.
-
-/*
-W3C IPR SOFTWARE NOTICE
-
-Copyright 1995-1998 World Wide Web Consortium, (Massachusetts Institute of
-Technology, Institut National de Recherche en Informatique et en
-Automatique, Keio University). All Rights Reserved.
-http://www.w3.org/Consortium/Legal/
-
-This W3C work (including software, documents, or other related items) is
-being provided by the copyright holders under the following license. By
-obtaining, using and/or copying this work, you (the licensee) agree that you
-have read, understood, and will comply with the following terms and
-conditions:
-
-Permission to use, copy, and modify this software and its documentation,
-with or without modification, for any purpose and without fee or royalty is
-hereby granted, provided that you include the following on ALL copies of the
-software and documentation or portions thereof, including modifications,
-that you make:
-
- 1. The full text of this NOTICE in a location viewable to users of the
- redistributed or derivative work.
- 2. Any pre-existing intellectual property disclaimers, notices, or terms
- and conditions. If none exist, a short notice of the following form
- (hypertext is preferred, text is permitted) should be used within the
- body of any redistributed or derivative code: "Copyright World Wide
- Web Consortium, (Massachusetts Institute of Technology, Institut
- National de Recherche en Informatique et en Automatique, Keio
- University). All Rights Reserved. http://www.w3.org/Consortium/Legal/"
- 3. Notice of any changes or modifications to the W3C files, including the
- date changes were made. (We recommend you provide URIs to the location
- from which the code is derived).
-
-In addition, creators of derivitive works must include the full text of this
-NOTICE in a location viewable to users of the derivitive work.
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
-ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-DOCUMENTATION.
-
-The name and trademarks of copyright holders may NOT be used in advertising
-or publicity pertaining to the software without specific, written prior
-permission. Title to copyright in this software and any associated
-documentation will at all times remain with copyright holders.
-
-____________________________________
-
-This formulation of W3C's notice and license became active on August 14
-1998. See the older formulation for the policy prior to this date. Please
-see our Copyright FAQ for common questions about using materials from our
-site, including specific terms and conditions for packages like libwww,
-Amaya, and Jigsaw. Other questions about this notice can be directed to
-site-policy at w3.org .
-
-
-
-
-webmaster
-(last updated 14-Aug-1998)
-
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
-
-/**
- * NOTE: This code has been taken from w3.org, and modified slightly to handle timezones of the form [-+]DDDD,
- * and also to fix a bug in the application of time zone to the parsed date.
- *
- * Date parser for ISO 8601 format
- * http://www.w3.org/TR/1998/NOTE-datetime-19980827
- * @version $Revision: 1.3 $
- * @author bmahe at w3.org
- */
-public class DateParser {
-
- private static boolean check(StringTokenizer st, String token)
- throws InvalidDateException
- {
- if (!st.hasMoreElements()) return false;
- if (st.nextToken().equals(token)) {
- return true;
- } else {
- throw new InvalidDateException("Missing ["+token+"]");
- }
- }
-
- private static Calendar getCalendar(String isodate)
- throws InvalidDateException
- {
- // YYYY-MM-DDThh:mm:ss.sTZD
- StringTokenizer st = new StringTokenizer(isodate, "-T:.+Z", true);
-
- Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
- calendar.clear();
- try {
- // Year
- if (st.hasMoreTokens()) {
- int year = Integer.parseInt(st.nextToken());
- calendar.set(Calendar.YEAR, year);
- } else {
- return calendar;
- }
- // Month
- if (check(st, "-") && (st.hasMoreTokens())) {
- int month = Integer.parseInt(st.nextToken()) -1;
- calendar.set(Calendar.MONTH, month);
- } else {
- return calendar;
- }
- // Day
- if (check(st, "-") && (st.hasMoreTokens())) {
- int day = Integer.parseInt(st.nextToken());
- calendar.set(Calendar.DAY_OF_MONTH, day);
- } else {
- return calendar;
- }
- // Hour
- if (check(st, "T") && (st.hasMoreTokens())) {
- int hour = Integer.parseInt(st.nextToken());
- calendar.set(Calendar.HOUR_OF_DAY, hour);
- } else {
- calendar.set(Calendar.HOUR_OF_DAY, 0);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- return calendar;
- }
- // Minutes
- if (check(st, ":") && (st.hasMoreTokens())) {
- int minutes = Integer.parseInt(st.nextToken());
- calendar.set(Calendar.MINUTE, minutes);
- } else {
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- return calendar;
- }
-
- //
- // Not mandatory now
- //
-
- // Secondes
- if (! st.hasMoreTokens()) {
- return calendar;
- }
- String tok = st.nextToken();
- if (tok.equals(":")) { // secondes
- if (st.hasMoreTokens()) {
- int secondes = Integer.parseInt(st.nextToken());
- calendar.set(Calendar.SECOND, secondes);
- if (! st.hasMoreTokens()) {
- return calendar;
- }
- // frac sec
- tok = st.nextToken();
- if (tok.equals(".")) {
- // bug fixed, thx to Martin Bottcher
- String nt = st.nextToken();
- while(nt.length() < 3) {
- nt += "0";
- }
- nt = nt.substring( 0, 3 ); //Cut trailing chars..
- int millisec = Integer.parseInt(nt);
- //int millisec = Integer.parseInt(st.nextToken()) * 10;
- calendar.set(Calendar.MILLISECOND, millisec);
- if (! st.hasMoreTokens()) {
- return calendar;
- }
- tok = st.nextToken();
- } else {
- calendar.set(Calendar.MILLISECOND, 0);
- }
- } else {
- throw new InvalidDateException("No secondes specified");
- }
- } else {
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- }
- // Timezone
- if (! tok.equals("Z")) { // UTC
- if (! (tok.equals("+") || tok.equals("-"))) {
- throw new InvalidDateException("only Z, + or - allowed");
- }
- boolean plus = tok.equals("+");
- if (! st.hasMoreTokens()) {
- throw new InvalidDateException("Missing hour field");
- }
- int tzhour = Integer.parseInt(st.nextToken());
- int tzmin = 0;
- if (check(st, ":") && (st.hasMoreTokens())) {
- tzmin = Integer.parseInt(st.nextToken());
- } else {
- // Modified by AW -- minute field is not required, and minutes may be represented
- // without colon between hours and minutes
- // throw new InvalidDateException("Missing minute field");
- if (tzhour >= 100) {
- tzmin = tzhour % 100;
- tzhour /= 100;
- }
- }
- if (!plus) { // Modified by AW -- !plus instead of plus
- calendar.add(Calendar.HOUR, tzhour);
- calendar.add(Calendar.MINUTE, tzmin);
- } else {
- calendar.add(Calendar.HOUR, -tzhour);
- calendar.add(Calendar.MINUTE, -tzmin);
- }
- }
- } catch (NumberFormatException ex) {
- throw new InvalidDateException("["+ex.getMessage()+
- "] is not an integer");
- }
- return calendar;
- }
-
- /**
- * Parse the given string in ISO 8601 format and build a Date object.
- * @param isodate the date in ISO 8601 format
- * @return a Date instance
- * @exception InvalidDateException if the date is not valid
- */
- public static Date parse(String isodate)
- throws InvalidDateException
- {
- Calendar calendar = getCalendar(isodate);
- return calendar.getTime();
- }
-
- private static String twoDigit(int i) {
- if (i >=0 && i < 10) {
- return "0"+String.valueOf(i);
- }
- return String.valueOf(i);
- }
-
- /**
- * Generate a ISO 8601 date
- * @param date a Date instance
- * @return a string representing the date in the ISO 8601 format
- */
- public static String getIsoDate(Date date) {
- Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
- calendar.setTime(date);
- return new StringBuffer().append(calendar.get(Calendar.YEAR))
- .append("-")
- .append(twoDigit(calendar.get(Calendar.MONTH) + 1))
- .append("-")
- .append(twoDigit(calendar.get(Calendar.DAY_OF_MONTH)))
- .append("T")
- .append(twoDigit(calendar.get(Calendar.HOUR_OF_DAY)))
- .append(":")
- .append(twoDigit(calendar.get(Calendar.MINUTE)))
- .append(":")
- .append(twoDigit(calendar.get(Calendar.SECOND)))
- .append(".")
- .append(twoDigit(calendar.get(Calendar.MILLISECOND) / 10))
- .append("Z").toString();
- }
-
- public static void test(String isodate) {
- System.out.println("----------------------------------");
- try {
- Date date = parse(isodate);
- System.out.println(">> "+isodate);
- System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
- System.out.println(">> "+getIsoDate(date));
- } catch (InvalidDateException ex) {
- System.err.println(isodate+" is invalid");
- System.err.println(ex.getMessage());
- }
- System.out.println("----------------------------------");
- }
-
- public static void test(Date date) {
- String isodate = null;
- System.out.println("----------------------------------");
- try {
- System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
- isodate = getIsoDate(date);
- System.out.println(">> "+isodate);
- date = parse(isodate);
- System.out.println(">> "+date.toString()+" ["+date.getTime()+"]");
- } catch (InvalidDateException ex) {
- System.err.println(isodate+" is invalid");
- System.err.println(ex.getMessage());
- }
- System.out.println("----------------------------------");
- }
-
- public static void main(String args[]) {
- test("1997-07-16T19:20:30.45-02:00");
- test("1997-07-16T19:20:30+01:00");
- test("1997-07-16T19:20:30+01:00");
- test("1997-07-16T19:20");
- test("1997-07-16");
- test("1997-07");
- test("1997");
- test(new Date());
- }
-
- public static class InvalidDateException extends SAMException {
- public InvalidDateException() {
- }
-
- public InvalidDateException(final String s) {
- super(s);
- }
-
- public InvalidDateException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public InvalidDateException(final Throwable throwable) {
- super(throwable);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DelegatingIterator.java b/src/main/java/htsjdk/samtools/util/DelegatingIterator.java
deleted file mode 100644
index 054352b..0000000
--- a/src/main/java/htsjdk/samtools/util/DelegatingIterator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Simple iterator class that delegates all method calls to an underlying iterator. Useful
- * for in-line subclassing to add behaviour to one or more methods.
- *
- * @author Tim Fennell
- */
-public class DelegatingIterator<T> implements CloseableIterator<T> {
- private final Iterator<T> iterator;
-
- public DelegatingIterator(final Iterator<T> iterator) {
- this.iterator = iterator;
- }
-
- public void close() {
- if (iterator instanceof CloseableIterator) {
- ((CloseableIterator) this.iterator).close();
- }
- }
-
- public boolean hasNext() {
- return this.iterator.hasNext();
- }
-
- public T next() {
- return this.iterator.next();
- }
-
- public void remove() {
- this.iterator.remove();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java b/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java
deleted file mode 100644
index bbf3818..0000000
--- a/src/main/java/htsjdk/samtools/util/DiskBackedQueue.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-
-/**
- * A single-ended FIFO queue. Writes elements to temporary files when the queue gets too big.
- * External references to elements in this queue are NOT guaranteed to be valid, due to the disk write/read
- * <p/>
- * NB: The queue becomes read-only after the first time that an on-disk record is "next up" to be read (i.e. has been
- * loaded into headRecord). Max size is therefore non-deterministic.
- * This avoids issues arising from conflicts between the input and output streams.
- * This could perhaps be avoided by creating a version of BAMRecordCodec that operates on RandomAccessFiles or channels.
- * <p/>
- *
- *
- * Created by bradt on 4/28/14.
- */
-public class DiskBackedQueue<E> implements Queue<E> {
- private final int maxRecordsInRamQueue;
- private final Queue<E> ramRecords;
- private File diskRecords = null;
- private final TempStreamFactory tempStreamFactory = new TempStreamFactory();
- private OutputStream outputStream = null;
- private InputStream inputStream = null;
- private boolean canAdd = true;
- private int numRecordsOnDisk = 0;
-
- /** Record representing the head of the queue; returned by peek, poll **/
- private E headRecord = null;
-
- /** Directories where file of records go. **/
- private final List<File> tmpDirs;
-
- /**
- * Used to write records to file, and used as a prototype to create codecs for reading.
- */
- private final SortingCollection.Codec<E> codec;
-
-
- /**
- * Prepare to accumulate records
- *
- * @param codec For writing records to file and reading them back into RAM
- * @param maxRecordsInRam how many records to accumulate before spilling to disk
- * @param tmpDirs Where to write files of records that will not fit in RAM
- */
- private DiskBackedQueue(final SortingCollection.Codec<E> codec,
- final int maxRecordsInRam, final List<File> tmpDirs) {
- if (maxRecordsInRam < 0) {
- throw new IllegalArgumentException("maxRecordsInRamQueue must be >= 0");
- }
- if (tmpDirs == null || tmpDirs.isEmpty()) {
- throw new IllegalArgumentException("At least one temp directory must be provided.");
- }
- for (final File tmpDir : tmpDirs) IOUtil.assertDirectoryIsWritable(tmpDir);
- this.tmpDirs = tmpDirs;
- this.codec = codec;
- this.maxRecordsInRamQueue = (maxRecordsInRam == 0) ? 0 : maxRecordsInRam - 1; // the first of our ram records is stored as headRecord
- this.ramRecords = new ArrayDeque<E>(this.maxRecordsInRamQueue);
- }
-
- /**
- * Syntactic sugar around the ctor, to save some typing of type parameters
- *
- * @param codec For writing records to file and reading them back into RAM
- * @param maxRecordsInRam how many records to accumulate in memory before spilling to disk
- * @param tmpDir Where to write files of records that will not fit in RAM
- */
- public static <T> DiskBackedQueue<T> newInstance(final SortingCollection.Codec<T> codec,
- final int maxRecordsInRam,
- final List<File> tmpDir) {
- return new DiskBackedQueue<T>(codec, maxRecordsInRam, tmpDir);
- }
-
- public boolean canAdd() {
- return this.canAdd;
- }
-
- public int getNumRecordsOnDisk() {
- return this.numRecordsOnDisk;
- }
-
- public boolean headRecordIsFromDisk() {
- return (!this.canAdd);
- }
-
- /**
- * Add the record to the tail of the queue, spilling to disk if necessary
- * Must check that (canAdd() == true) before calling this method
- *
- * @param record The record to be added to the queue
- * @return true (if add successful)
- * @throws IllegalStateException if the queue cannot be added to
- */
- public boolean add(final E record) throws IllegalStateException {
- if (!canAdd) throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false");
-
- // NB: we add all the records before removing them, so we can never have spilled to disk unless all the space for ram records
- // have been exhausted.
- if (this.headRecord == null) { // this is the first record in the queue
- if (0 < this.numRecordsOnDisk) throw new SAMException("Head record was null but we have records on disk. Bug!");
- this.headRecord = record;
- }
- else if (this.ramRecords.size() == this.maxRecordsInRamQueue) {
- spillToDisk(record);
- }
- else {
- if (0 < this.numRecordsOnDisk) throw new SAMException("Trying to add records to RAM but there were records on disk. Bug!");
- this.ramRecords.add(record);
- }
- return true;
- }
-
- @Override
- public boolean offer(final E e) {
- return this.canAdd && this.add(e);
- }
-
- @Override
- public E remove() {
- final E element = this.poll();
- if (element == null) {
- throw new NoSuchElementException("Attempting to remove() from empty DiskBackedQueue");
- }
- else {
- return element;
- }
- }
-
- @Override
- public E poll() {
- final E outRecord = this.headRecord;
- if (outRecord != null) {
- updateQueueHead();
- }
- return outRecord;
- }
-
- @Override
- public E element() {
- if (this.headRecord != null) {
- return this.headRecord;
- }
- else {
- throw new NoSuchElementException("Attempting to element() from empty DiskBackedQueue");
- }
- }
-
- @Override
- public E peek() {
- return this.headRecord;
- }
-
- /**
- * Return the total number of elements in the queue, both in memory and on disk
- */
- public int size() {
- return (this.headRecord == null) ? 0 : (1 + this.ramRecords.size() + this.numRecordsOnDisk);
- }
-
- @Override
- public boolean isEmpty() {
- return (this.headRecord == null);
- }
-
- /**
- * Add all elements from collection c to this DiskBackedQueue
- * Must check that (canAdd() == true) before calling this method
- *
- * @param c the collection of elements to add
- * @return true if this collection changed as a result of the call
- * @throws IllegalStateException if the queue cannot be added to
- */
- @Override
- public boolean addAll(final Collection<? extends E> c) {
- try {
- for (final E element : c) {
- this.add(element);
- }
- return true;
- } catch (final IllegalStateException e) {
- throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false", e);
- }
- }
-
- @Override
- public void clear() {
- this.headRecord = null;
- this.ramRecords.clear();
- this.closeIOResources();
- this.outputStream = null;
- this.inputStream = null;
- this.diskRecords = null;
- this.canAdd = true;
- }
-
- /**
- * Clean up disk resources in case clear() has not been explicitly called (as would be preferable)
- * Closes the input and output streams associated with this DiskBackedQueue and deletes the temporary file
- *
- * @throws Throwable
- */
- protected void finalize() throws Throwable {
- this.closeIOResources();
- super.finalize(); // NB: intellij wanted me to do this. Need I? I'm not extending anything
- }
-
- /**
- * Write the present record to the end of a file representing the tail of the queue.
- * @throws RuntimeIOException
- */
- private void spillToDisk(final E record) throws RuntimeIOException {
- try {
- if (this.diskRecords == null) {
- this.diskRecords = newTempFile();
- this.outputStream = tempStreamFactory.wrapTempOutputStream(new FileOutputStream(this.diskRecords), Defaults.BUFFER_SIZE);
- this.codec.setOutputStream(this.outputStream);
- }
- this.codec.encode(record);
- this.outputStream.flush();
- this.numRecordsOnDisk++;
- } catch (final IOException e) {
- throw new RuntimeIOException("Problem writing temporary file. Try setting TMP_DIR to a file system with lots of space.", e);
- }
- }
-
- /**
- * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
- * on JVM exit and then returns it.
- */
- private File newTempFile() throws IOException {
- return IOUtil.newTempFile("diskbackedqueue.", ".tmp", this.tmpDirs.toArray(new File[tmpDirs.size()]), IOUtil.FIVE_GBS);
- }
-
- /**
- * Update the head of the queue with the next record in memory or on disk.
- * Sets headRecord to null if the queue is now empty
- */
- private void updateQueueHead() {
- if (!this.ramRecords.isEmpty()) {
- this.headRecord = this.ramRecords.poll();
- if (0 < numRecordsOnDisk) this.canAdd = false;
- }
- else if (this.diskRecords != null) {
- this.headRecord = this.readFileRecord(this.diskRecords);
- this.canAdd = false;
- }
- else {
- this.canAdd = true;
- this.headRecord = null;
- }
- }
-
- /**
- * Read back a record that had been spilled to disk. Return null if there are no disk records
- * Note- if we are reading disk records, we can no longer add additional elements to this DiskBackedQueue
- *
- * @param file the file to read from
- * @return The next element from the head of the file, or null if end-of-file is reached
- * @throws RuntimeIOException
- */
- private E readFileRecord (final File file) {
- if (this.canAdd) this.canAdd = false; // NB: should this just be an assignment regardless?
-
- // we never wrote a record to disk
- if (file == null) {
- throw new IllegalStateException("The file to read from was null");
- }
- try {
- if (this.inputStream == null) {
- inputStream = new FileInputStream(file);
- this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(inputStream, Defaults.BUFFER_SIZE));
- }
- final E record = this.codec.decode(); // NB: returns null if end-of-file is reached.
- if (record != null) {
- numRecordsOnDisk--;
- }
- return record;
- } catch (final IOException e) {
- throw new RuntimeIOException("DiskBackedQueue encountered an error reading from a file", e);
- }
- }
-
- private void closeIOResources() {
- CloserUtil.close(this.outputStream);
- CloserUtil.close(this.inputStream);
- if (this.diskRecords != null) IOUtil.deleteFiles(this.diskRecords);
- }
-
- /**
- * Not supported. Cannot access particular elements, as some elements may have been written to disk
- *
- * @throws UnsupportedOperationException
- */
- @Override
- public boolean remove(final Object o) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support remove(Object o)");
- }
-
- /**
- * Not supported. Cannot access particular elements, as some elements may have been written to disk
- *
- * @throws UnsupportedOperationException
- */
- @Override
- public boolean removeAll(final Collection<?> c) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support removeAll(Collection<?> c)");
- }
-
- /**
- * Not supported. Cannot access particular elements, as some elements may have been written to disk
- *
- * @throws UnsupportedOperationException
- */
- @Override
- public boolean retainAll(final Collection<?> c) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support retainAll(Collection<?> c)");
- }
-
- /**
- * Not supported. It is not possible to check for the presence of a particular element,
- * as some elements may have been written to disk
- *
- * @throws UnsupportedOperationException
- */
- @Override
- public boolean contains(final Object o) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support contains(Object o)");
- }
-
- /**
- * Not supported. It is not possible to check for the presence of a particular element,
- * as some elements may have been written to disk
- *
- * @throws UnsupportedOperationException
- */
- @Override
- public boolean containsAll(final Collection<?> c) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support containsAll(Collection<?> c)");
- }
-
- /**
- * Not supported at this time
- * @throws UnsupportedOperationException
- */
- @Override
- public Iterator<E> iterator() {
- throw new UnsupportedOperationException("DiskBackedQueue does not support iterator()");
- }
-
- /**
- * Not supported at this time
- * @throws UnsupportedOperationException
- */
- @Override
- public Object[] toArray() {
- throw new UnsupportedOperationException("DiskBackedQueue does not support toArray()");
- }
-
- /**
- * Not supported at this time
- * @throws UnsupportedOperationException
- */
- @Override
- public <T1> T1[] toArray(final T1[] a) {
- throw new UnsupportedOperationException("DiskBackedQueue does not support toArray(T1[] a)");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java b/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java
deleted file mode 100644
index 0d779a8..0000000
--- a/src/main/java/htsjdk/samtools/util/EdgeReadIterator.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list. If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out. Filtering may be changed
- * via setSamFilters(). Difference from SamLocusIterator is that this implementation accumulates data
- * only about start and end of alignment blocks from reads, not about each aligned base.
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-public class EdgeReadIterator extends AbstractLocusIterator<EdgingRecordAndOffset, AbstractLocusInfo<EdgingRecordAndOffset>> {
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments. Do not use
- * BAM index even if available.
- *
- * @param samReader must be coordinate sorted
- */
- public EdgeReadIterator(final SamReader samReader) {
- this(samReader, null);
- }
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments.
- *
- * @param samReader must be coordinate sorted
- * @param intervalList Either the list of desired intervals, or null. Note that if an intervalList is
- * passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
- */
- public EdgeReadIterator(final SamReader samReader, final IntervalList intervalList) {
- this(samReader, intervalList, samReader.hasIndex());
- }
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments
- *
- * @param samReader must be coordinate sorted
- * @param intervalList Either the list of desired intervals, or null. Note that if an intervalList is
- * passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
- * @param useIndex If true, do indexed lookup to improve performance. Not relevant if intervalList == null.
- * It is no longer the case the useIndex==true can make performance worse. It should always perform at least
- * as well as useIndex==false, and generally will be much faster.
- */
- public EdgeReadIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
- super(samReader, intervalList, useIndex);
- }
-
- /**
- * Capture the loci covered by the given SAMRecord in the AbstractLocusInfos in the accumulator,
- * creating new AbstractLocusInfos as needed. EdgingRecordAndOffset object are created only for start
- * and end of each alignment block of SAMRecord.
- * If list of intervals is defined, start or/and length of alignment block are shifted to match the interval, to
- * prevent exceeding the interval.
- * @param rec SAMRecord to process and add to <code>AbstractLocusInfo</code>
- */
- @Override
- void accumulateSamRecord(SAMRecord rec) {
- // interpret the CIGAR string and add the base info
- for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
- // 0-based offset into the read of the current base
- final int readOffset = alignmentBlock.getReadStart() - 1;
- // 1-based reference position that the current base aligns to
- final int refPos = alignmentBlock.getReferenceStart();
-
- // 0-based offset from the aligned position of the first base in the read to the aligned position
- // of the current base.
- final int refOffset = refPos - rec.getAlignmentStart();
- final int refOffsetEnd = refPos - rec.getAlignmentStart() + alignmentBlock.getLength();
-
-
- // Ensure there are AbstractLocusInfos up to and including this position
- for (int j = accumulator.size(); j <= refOffsetEnd; ++j) {
- accumulator.add(createLocusInfo(getReferenceSequence(rec.getReferenceIndex()),
- rec.getAlignmentStart() + j));
- }
-
- /* Let's assume an alignment block starts in some locus.
- * We put two records to the accumulator. The first one has the "begin" type which corresponds to the locus
- * where the block starts. The second one has the "end" type which corresponds to the other locus where the block ends.
- */
- int refOffsetInterval = refOffset; // corresponds to the beginning of the alignment block
- int refOffsetEndInterval = refOffsetEnd;
- int startShift = 0;
-
- // intersect intervals and alignment block
- if (getIntervals() != null) {
- // get the current interval we're processing
- Interval interval = getCurrentInterval();
- if (interval != null) {
- final int intervalEnd = interval.getEnd();
- final int intervalStart = interval.getStart();
- // check if an interval and the alignment block overlap
- if (!CoordMath.overlaps(refPos, refPos + alignmentBlock.getLength(), intervalStart, intervalEnd)) {
- continue;
- }
- // if the alignment block starts out of an interval, shift the starting position
- if (refPos < intervalStart) {
- startShift = intervalStart - refPos;
- refOffsetInterval = refOffsetInterval + startShift;
- }
- // if the alignment block ends out of an interval, shift the ending position
- final int readEnd = refPos + alignmentBlock.getLength();
- if (refPos + alignmentBlock.getLength() > intervalEnd) {
- refOffsetEndInterval = refOffsetEndInterval - (readEnd - intervalEnd) + 1;
- }
- }
- }
- final int length = refOffsetEndInterval - refOffsetInterval;
- // add the alignment block to the accumulator when it starts and when it ends
- final EdgingRecordAndOffset recordAndOffset = createRecordAndOffset(rec, readOffset + startShift, length, refPos + startShift);
- // accumulate start of the alignment block
- accumulator.get(refOffsetInterval).add(recordAndOffset);
- final EdgingRecordAndOffset recordAndOffsetEnd = createRecordAndOffset(recordAndOffset);
- // accumulate end of the alignment block
- accumulator.get(refOffsetEndInterval).add(recordAndOffsetEnd);
- }
- }
-
- @Override
- void accumulateIndels(SAMRecord rec) {
- throw new UnsupportedOperationException("Indels accumulation is not supported for " + getClass().getSimpleName() + ".");
- }
-
- /**
- * Creates a new <code>EdgingRecordAndOffset</code> for given input values
- *
- * @param rec aligned SamRecord
- * @param readOffset offset from start of read
- * @param length length of alignment block
- * @param refPos position in the reference sequence
- * @return created <code>EdgingRecordAndOffset</code>
- */
- @Override
- EdgingRecordAndOffset createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPos) {
- return EdgingRecordAndOffset.createBeginRecord(rec, readOffset, length, refPos);
- }
-
- EdgingRecordAndOffset createRecordAndOffset(EdgingRecordAndOffset startRecord) {
- return EdgingRecordAndOffset.createEndRecord(startRecord);
- }
-
- /**
- * @param referenceSequence processed reference sequence
- * @param lastPosition last processed reference locus position
- * @return <code>AbstractLocusInfo<T></code> for the lastPosition
- */
- @Override
- AbstractLocusInfo<EdgingRecordAndOffset> createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition) {
- return new AbstractLocusInfo<>(referenceSequence, lastPosition);
- }
-
- /**
- * This method isn't supported in current implementation.
- *
- * @param maxReadsToAccumulatePerLocus maximum number of <code>RecordAndOffset</code> objects to store for
- * one loci in reference sequence.
- */
- @Override
- public void setMaxReadsToAccumulatePerLocus(int maxReadsToAccumulatePerLocus) {
- if (getMaxReadsToAccumulatePerLocus() != 0) {
- throw new UnsupportedOperationException("Locus cap is not supported for " + getClass().getSimpleName() + ".");
- }
- }
-
- /**
- * This method isn't supported in current implementation.
- *
- * @param qualityScoreCutoff the minimum base quality to include in <code>AbstractLocusInfo</code>.
- */
- @Override
- public void setQualityScoreCutoff(int qualityScoreCutoff) {
- throw new UnsupportedOperationException("Quality filtering is not supported for " + getClass().getSimpleName() + ".");
- }
-
- /**
- * For correct work of <code>EdgeReadIterator</code> value <code>emitUncoveredLoci</code> must be true.
- *
- * @param emitUncoveredLoci if false, iterator will skip uncovered loci in reference sequence, otherwise
- * empty <code>AbstractLocusInfo</code> will be created for each loci.
- */
- @Override
- public void setEmitUncoveredLoci(boolean emitUncoveredLoci) {
- if (isEmitUncoveredLoci() != emitUncoveredLoci) {
- throw new UnsupportedOperationException(getClass().getSimpleName() + " doesn't support work with skipping " +
- "uncovered bases.");
- }
- }
-
- @Override
- public void setIncludeIndels(boolean includeIndels) {
- if (isIncludeIndels() != includeIndels) {
- throw new UnsupportedOperationException("Indels accumulation is not supported for " + getClass().getSimpleName() + ".");
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java b/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java
deleted file mode 100644
index b83a169..0000000
--- a/src/main/java/htsjdk/samtools/util/EdgingRecordAndOffset.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-import static htsjdk.samtools.util.EdgingRecordAndOffset.Type.BEGIN;
-import static htsjdk.samtools.util.EdgingRecordAndOffset.Type.END;
-
-/**
- * Holds a SAMRecord plus the zero-based offset into that SAMRecord's bases and quality scores that corresponds
- * to the base and quality for the start of alignment block at the genomic position described by the AbstractLocusInfo.
- * This is implementation for EdgeReadIterator, field <code>type</code> added to indicate whether object
- * represents the start or the end of an alignment block.
- * <p>
- * Subclasses StartEdgingRecordAndOffset and EndEdgingRecordAndOffset are used in EdgeReadIterator to
- * distinguish starting and ending of the alignment block
- * as for each alignment block two objects of <code>EdgingRecordAndOffset</code> are created with two different types.
- * The main idea of using EdgeReadIterator is to process alignment block starting from locus where BEGIN type occurs,
- * aggregate information per locus and keep it until END type occurs, then remove alignment block from consideration.
- *
- * @author Darina_Nikolaeva at epam.com, EPAM Systems, Inc. <www.epam.com>
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public abstract class EdgingRecordAndOffset extends AbstractRecordAndOffset {
-
- private EdgingRecordAndOffset(SAMRecord record, int offset) {
- super(record, offset);
- }
-
- public abstract EdgingRecordAndOffset getStart();
-
- public abstract Type getType();
-
- public abstract byte getBaseQuality(int position);
-
- public static EdgingRecordAndOffset createBeginRecord(SAMRecord record, int offset, int length, int refPos) {
- return new StartEdgingRecordAndOffset(record, offset, length, refPos);
- }
-
- public static EdgingRecordAndOffset createEndRecord(EdgingRecordAndOffset startRecord) {
- return new EndEdgingRecordAndOffset(startRecord);
- }
-
- /**
- * Describes the type of <code>TypedRecordAndOffset</code>, whether it represents the start or the end of
- * an alignment block.
- */
- public enum Type {
- BEGIN, END
- }
-
- private static class StartEdgingRecordAndOffset extends EdgingRecordAndOffset {
- /**
- * Length of alignment block of the read
- */
- private final int length;
- /**
- * A reference position to which read offset is aligned.
- */
- private final int refPos;
-
- private int hash = 0;
-
- /**
- * @param record inner SAMRecord
- * @param offset from the start of the read
- * @param length of alignment block
- * @param refPos corresponding to read offset reference position
- */
- protected StartEdgingRecordAndOffset(SAMRecord record, int offset, int length, int refPos) {
- super(record, offset);
- if (length > record.getReadLength()) {
- throw new IllegalArgumentException("Block length cannot be larger than whole read length");
- }
- this.length = length;
- this.refPos = refPos;
- }
-
- /**
- * @param position in the reference
- * @return base quality of a read base, corresponding to a given reference position
- */
- public byte getBaseQuality(int position) {
- int rOffset = getRelativeOffset(position);
- byte[] baseQualities = record.getBaseQualities();
- validateOffset(rOffset, baseQualities);
- return baseQualities[rOffset];
- }
-
- /**
- * @return the length of alignment block represented by the object.
- */
- @Override
- public int getLength() {
- return length;
- }
-
- /**
- * @return the position in reference sequence, to which the start of alignment block is aligned.
- */
- @Override
- public int getRefPos() {
- return refPos;
- }
-
- /**
- * @return type of object
- */
- @Override
- public Type getType() {
- return BEGIN;
- }
-
- /**
- * @return <code>EdgingRecordAndOffset</code> that represents the start of alignment block of the read
- * for object with type END. For object with type BEGIN will return null.
- */
- @Override
- public EdgingRecordAndOffset getStart() {
- return null;
- }
-
- @Override
- public int hashCode() {
- if (hash != 0) return hash;
- hash = record.hashCode();
- hash = 31 * hash + length;
- hash = 31 * hash + offset;
- hash = 31 * hash + refPos;
- return hash;
- }
-
- private int getRelativeOffset(int position) {
- return position - refPos + offset;
- }
- }
-
- private static class EndEdgingRecordAndOffset extends EdgingRecordAndOffset {
-
- /**
- * For object with type END this fields holds the reference to object with type BEGIN for the read.
- */
- final private EdgingRecordAndOffset start;
-
- EndEdgingRecordAndOffset(EdgingRecordAndOffset record) {
- super(record.getRecord(), record.getOffset());
- this.start = record;
- }
-
- /**
- * @param position in the reference
- * @return base quality of a read base, corresponding to a given reference position
- */
- public byte getBaseQuality(int position) {
- return start.getBaseQuality(position);
- }
-
- /**
- * @return the length of alignment block represented by the object.
- */
- @Override
- public int getLength() {
- return start.getLength();
- }
-
- /**
- * @return the position in reference sequence, to which the start of alignment block is aligned.
- */
- @Override
- public int getRefPos() {
- return start.getRefPos();
- }
-
- /**
- * @return type of object
- */
- @Override
- public Type getType() {
- return END;
- }
-
- /**
- * @return <code>EdgingRecordAndOffset</code> that represents the start of alignment block of the read
- * for object with type END
- */
- @Override
- public EdgingRecordAndOffset getStart() {
- return start;
- }
-
- @Override
- public int hashCode() {
- return start.hashCode();
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/FastLineReader.java b/src/main/java/htsjdk/samtools/util/FastLineReader.java
deleted file mode 100644
index d802fad..0000000
--- a/src/main/java/htsjdk/samtools/util/FastLineReader.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Line-oriented InputStream reader that uses one buffer for disk buffering and line-termination-finding,
- * in order to improve performance.
- *
- * Implementation detail: All public methods must leave the input buffer in a non-empty state, unless at EOF.
- *
- * @author alecw at broadinstitute.org
- */
-public class FastLineReader implements Closeable {
- private InputStream in;
- private byte[] fileBuffer = new byte[512000];
- // Next byte to read in fileBuffer
- private int nextByte = 0;
- // Number of bytes in fileBuffer
- private int numBytes = 0;
- private boolean atEof;
-
- public FastLineReader(final InputStream in) {
- this.in = in;
- ensureBufferNotEmpty();
- }
-
- /**
- * @return true if input is exhausted
- */
- public boolean eof() {
- return atEof;
- }
-
- /**
- * @return peeks at the next byte in the stream and returns true if it is CR or LF. Returns false if EOF or
- * next byte is not CR or LF.
- */
- public boolean atEoln() {
- return ensureBufferNotEmpty() && (fileBuffer[nextByte] == '\n' || fileBuffer[nextByte] == '\r');
- }
-
- /**
- * Advance over any EOLN chars (CR or LF)
- * @return true if saw one or more CR or LFs
- */
- public boolean skipNewlines() {
- boolean sawEoln = false;
- while (atEoln()) {
- sawEoln = true;
- ++nextByte;
- }
- return sawEoln;
- }
-
- public void close() {
- CloserUtil.close(in);
- in = null;
- fileBuffer = null;
- }
-
- /**
- * @return Next byte from the input. Do not call if at EOF.
- */
- public byte getByte() {
- final byte ret = peekByte();
- ++nextByte;
- ensureBufferNotEmpty();
- return ret;
- }
-
- /**
- * @return Next byte from the input, without advancing over that byte. Do not call if at EOF.
- */
- public byte peekByte() {
- if (eof()) {
- throw new IllegalStateException("Cannot getByte() if EOF.");
- }
- return fileBuffer[nextByte];
- }
-
- /**
- * Read from input until input is exhausted, EOLN is seen, or output buffer is filled
- * @param outputBuffer where to put bytes read
- * @param startOutputIndex where to start putting bytes read
- * @return number of bytes read
- */
- public int readToEndOfOutputBufferOrEoln(final byte[] outputBuffer, final int startOutputIndex) {
- boolean sawNewline;
- int totalGrabbed = 0;
- do {
- if (!ensureBufferNotEmpty()) {
- break;
- }
- final int startInputIndex = nextByte;
- sawNewline = advanceToEobOrEoln();
- int lengthOfChunk = nextByte - startInputIndex;
-
- // Roll back if went past the amount that can be stored in the output buffer.
- // Assumption is that lines are relatively short so this won't happen very often.
- if (lengthOfChunk > outputBuffer.length - (startOutputIndex + totalGrabbed)) {
- lengthOfChunk = outputBuffer.length - (startOutputIndex + totalGrabbed);
- nextByte = startInputIndex + lengthOfChunk;
- }
- System.arraycopy(fileBuffer, startInputIndex, outputBuffer, startOutputIndex + totalGrabbed, lengthOfChunk);
- totalGrabbed += lengthOfChunk;
- } while (!sawNewline && totalGrabbed < outputBuffer.length - startOutputIndex);
- ensureBufferNotEmpty();
- return totalGrabbed;
- }
-
- /**
- * Advance nextByte to end of currently-buffered input or to line terminator
- * @return true if saw a line terminator
- */
- private boolean advanceToEobOrEoln() {
- while (nextByte < numBytes) {
- if (atEoln()) {
- return true;
- }
- ++nextByte;
- }
- return false;
- }
-
- /**
- * Ensure that fileBuffer has at least one byte available in it. Potentially wipes out
- * what is in fileBuffer so everything from fileBuffer[0..nextByte] should already have been pulled out.
- * @return false if EOF, else true
- */
- private boolean ensureBufferNotEmpty() {
- try {
- if (nextByte < numBytes) {
- return true;
- }
- nextByte = 0;
- numBytes = in.read(fileBuffer);
- atEof = (numBytes < 1);
- return !atEof;
- } catch (IOException e) {
- throw new SAMException("Exception reading InputStream", e);
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java b/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java
deleted file mode 100644
index b7a7bfb..0000000
--- a/src/main/java/htsjdk/samtools/util/FastqQualityFormat.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Enumeration for FastQ quality score formats formats.
- */
-public enum FastqQualityFormat {
- /** Early Solexa/Illumina (pre pipeline 1.3) style scores which encode Solexa qualities using an ASCII offset of 64 */
- Solexa,
- /** Recent Solexa/Illumina (pipeline 1.3+) style scores which encode PHRED qualities using an ASCII offset of 64 */
- Illumina,
- /** Sanger style FASTQ files which encode PHRED qualities using an ASCII offset of 33 */
- Standard
-}
diff --git a/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java b/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java
deleted file mode 100644
index bc8bc01..0000000
--- a/src/main/java/htsjdk/samtools/util/FileAppendStreamLRUCache.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * LRU cache of OutputStreams to handle situation in which it is necessary to have more FileOutputStreams
- * than resource limits will allow. Least-recently-used FileOutputStream is closed when it is pushed out of
- * the cache. When adding a new element to the cache, the file is opened in append mode.
- *
- * Actual elements in the cache are usually BufferedOutputStreams wrapping the FileOutputStreams, but will
- * be FileOutputStreams if Defaults.BUFFER_SIZE = 0.
- *
- * @author alecw at broadinstitute.org
- */
-public class FileAppendStreamLRUCache extends ResourceLimitedMap<File, OutputStream> {
- public FileAppendStreamLRUCache(final int cacheSize) {
- super(cacheSize, new Functor());
- }
-
- private static class Functor implements ResourceLimitedMapFunctor<File, OutputStream> {
- public OutputStream makeValue(final File file) {
- try {
- return IOUtil.maybeBufferOutputStream(new FileOutputStream(file, true));
- }
- catch (final FileNotFoundException e) {
- // In case the file could not be opened because of too many file handles, try to force
- // file handles to be closed.
- System.gc();
- System.runFinalization();
- try {
- return IOUtil.maybeBufferOutputStream(new FileOutputStream(file, true));
- }
- catch (final FileNotFoundException e2) {
- throw new SAMException(file + "not found", e2);
- }
- }
- }
-
- public void finalizeValue(final File file, final OutputStream out) {
- try {
- out.flush();
- out.close();
- }
- catch (final IOException e) {
- throw new SAMException("Exception closing FileOutputStream for " + file, e);
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/FormatUtil.java b/src/main/java/htsjdk/samtools/util/FormatUtil.java
deleted file mode 100644
index a80c240..0000000
--- a/src/main/java/htsjdk/samtools/util/FormatUtil.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.File;
-import java.math.RoundingMode;
-import java.security.InvalidParameterException;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Simple class used to format object values into a standard format for printing.
- *
- * @author Tim Fennell
- */
-public class FormatUtil {
- public static final int DECIMAL_DIGITS_TO_PRINT = 6;
- private final DateFormat dateFormat;
- private final NumberFormat integerFormat;
- private final NumberFormat floatFormat;
-
- /** Constructs a new FormatUtil and initializes various internal formatters.
- * This is necessary because SimpleDateFormat and other formatters are not threadsafe.
- */
- public FormatUtil() {
- this.dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
- this.integerFormat = NumberFormat.getIntegerInstance();
- this.integerFormat.setGroupingUsed(false);
-
- this.floatFormat = NumberFormat.getNumberInstance();
- this.floatFormat.setGroupingUsed(false);
- this.floatFormat.setMaximumFractionDigits(DECIMAL_DIGITS_TO_PRINT);
- this.floatFormat.setRoundingMode(RoundingMode.HALF_DOWN);
- if (this.floatFormat instanceof DecimalFormat) {
- final DecimalFormat decimalFormat = (DecimalFormat)this.floatFormat;
- final DecimalFormatSymbols decimalFormatSymbols = decimalFormat.getDecimalFormatSymbols();
- decimalFormatSymbols.setNaN("?");
- decimalFormatSymbols.setInfinity("?");
- decimalFormat.setDecimalFormatSymbols(decimalFormatSymbols);
- }
- }
-
- /** Formats a short to an integer string. */
- public String format(short value) { return this.integerFormat.format(value); }
-
- /** Formats an int to an integer string. */
- public String format(int value) { return this.integerFormat.format(value); }
-
- /** Formats a long to an integer string. */
- public String format(long value) { return this.integerFormat.format(value); }
-
- /** Formats a float to a floating point string. */
- public String format(float value) {return this.floatFormat.format(value); }
-
- /** Formats a double to a floating point string. */
- public String format(double value) {return this.floatFormat.format(value); }
-
- /** Formats a char as a string. */
- public String format(char value) { return Character.toString(value); }
-
- /** Formats an enum to the String representation of an enum. */
- public String format(Enum value) { return value.name(); }
-
- /** Formats a date to a date string without time. */
- public String format(Date value) { return this.dateFormat.format(value); }
-
- /** Formats date & time */
- public String format(final Iso8601Date value) { return value.toString(); }
-
- /** Formats a boolean value to a String. */
- public String format(boolean value) { if (value) return "Y"; else return "N"; }
-
- /** Attempts to determine the type of value and format it appropriately. */
- public String format(Object value) {
- if (value == null) return "";
- if (value instanceof Short) return format( ((Short) value).shortValue() );
- if (value instanceof Integer) return format( ((Integer) value).intValue() );
- if (value instanceof Long) return format( ((Long) value).longValue() );
- if (value instanceof Float) return format( ((Float) value).floatValue() );
- if (value instanceof Double) return format( ((Double) value).doubleValue() );
- if (value instanceof Enum) return format( ((Enum) value) );
- if (value instanceof Iso8601Date) return format((Iso8601Date)value);
- if (value instanceof Date) return format( ((Date) value) );
- if (value instanceof Boolean) return format( ((Boolean) value).booleanValue() );
- if (value instanceof Character) return format( ((Character)value).charValue() );
- return value.toString();
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // Parsing methods
- ///////////////////////////////////////////////////////////////////////////
-
- /** Parses a String into a short. */
- public short parseShort(String value) { return Short.parseShort(value); }
-
- /** Parses a String into an int. */
- public int parseInt(String value) { return Integer.parseInt(value); }
-
- /** Parses a String into a long. */
- public long parseLong(String value) { return Long.parseLong(value); }
-
- /** Parses a String into a float. */
- public float parseFloat(String value) {
- if ("?".equals(value) || "-?".equals(value)) return Float.NaN;
- else return Float.parseFloat(value);
- }
-
- /** Parses a String into a double. */
- public double parseDouble(String value) {
- if ("?".equals(value) || "-?".equals(value)) return Double.NaN;
- else return Double.parseDouble(value);
- }
-
- /** Parses a String into an Enum of the given type. */
- public <E extends Enum> E parseEnum(String value, Class<E> type) { return (E) Enum.valueOf(type, value); }
-
- /** Parses a String into a date. */
- public Date parseDate(String value) {
- try {
- return this.dateFormat.parse(value);
- }
- catch (ParseException pe) {
- throw new SAMException("Could not parse value as date: " + value, pe);
- }
- }
-
- /** Parse a String into an Iso8601 Date */
- public Iso8601Date parseIso8601Date(String value) { return new Iso8601Date(value); }
-
- /** Parses a String into a boolean, as per the above convention that true = Y and false = N. */
- public boolean parseBoolean(String value) {
- if (value == null || value.isEmpty()) return false;
- char ch = Character.toUpperCase(value.charAt(0));
- return (ch == 'Y');
- }
-
- /** Parses a String into a char. We expect the String to have a length of exactly one, otherwise throw an exception. */
- public char parseChar(String value) {
- if (value == null) {
- throw new SAMException("Cannot parse null string into char");
- } else if (value.length() != 1) {
- throw new SAMException("Cannot parse string into char because length != 1 : " + value);
- } else {
- return value.charAt(0);
- }
- }
-
- /**
- * Attempts to determine the correct parse method to call based on the desired
- * return type and then parses the String and returns the value.
- *
- * @param value the String value to be parsed
- * @param returnType the desired return type
- * @return an object of the returnType
- */
- public Object parseObject(String value, Class<?> returnType) {
- if (returnType == Short.class || returnType == Short.TYPE) return parseShort(value);
- if (returnType == Integer.class || returnType == Integer.TYPE) return parseInt(value);
- if (returnType == Long.class || returnType == Long.TYPE) return parseLong(value);
- if (returnType == Float.class || returnType == Float.TYPE) return parseFloat(value);
- if (returnType == Double.class || returnType == Double.TYPE) return parseDouble(value);
- if (returnType == Boolean.class || returnType == Boolean.TYPE) return parseBoolean(value);
- if (returnType == Byte.class || returnType == Byte.TYPE) return parseInt(value);
- if (returnType == Character.class || returnType == Character.TYPE) return parseChar(value);
- if (returnType == Iso8601Date.class) return parseIso8601Date(value);
- if (returnType == Date.class) return parseDate(value);
- if (returnType == File.class) return new File(value);
- if (Enum.class.isAssignableFrom(returnType)) return parseEnum(value, (Class<? extends Enum>)returnType);
- if (returnType == String.class) return value;
-
- throw new InvalidParameterException("Don't know how to convert a String to a " + returnType.getName());
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Histogram.java b/src/main/java/htsjdk/samtools/util/Histogram.java
deleted file mode 100644
index 19cbc1d..0000000
--- a/src/main/java/htsjdk/samtools/util/Histogram.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-import java.util.*;
-
-import static java.lang.Math.*;
-
-/**
- * Class for computing and accessing histogram type data. Stored internally in
- * a sorted Map so that keys can be iterated in order.
- *
- * @author Tim Fennell
- */
-public final class Histogram<K extends Comparable> implements Serializable {
- private static final long serialVersionUID = 1L;
- private String binLabel = "BIN";
- private String valueLabel = "VALUE";
- private final NavigableMap<K, Bin<K>> map;
-
- /** Constructs a new Histogram with default bin and value labels. */
- public Histogram() {
- this.map = new TreeMap<>();
- }
-
- /** Constructs a new Histogram with supplied bin and value labels. */
- public Histogram(final String binLabel, final String valueLabel) {
- this();
- this.binLabel = binLabel;
- this.valueLabel = valueLabel;
- }
-
- /** Constructs a new Histogram that'll use the supplied comparator to sort keys. */
- public Histogram(final Comparator<? super K> comparator) {
- this.map = new TreeMap<>(comparator);
- }
-
- /** Constructor that takes labels for the bin and values and a comparator to sort the bins. */
- public Histogram(final String binLabel, final String valueLabel, final Comparator<? super K> comparator) {
- this(comparator);
- this.binLabel = binLabel;
- this.valueLabel = valueLabel;
- }
-
- /** Copy constructor for a histogram. */
- public Histogram(final Histogram<K> in) {
- this.map = new TreeMap<>(in.map);
- this.binLabel = in.binLabel;
- this.valueLabel = in.valueLabel;
- }
-
- /** Represents a bin in the Histogram. */
- public static class Bin<K extends Comparable> implements Serializable {
- private static final long serialVersionUID = 1L;
- private final K id;
- private double value = 0;
-
- /** Constructs a new bin with the given ID. */
- private Bin(final K id) { this.id = id; }
-
- /** Gets the ID of this bin. */
- public K getId() { return id; }
-
- /** Gets the value in the bin. */
- public double getValue() { return value; }
-
- /** Returns the String format for the value in the bin. */
- @Override
- public String toString() { return String.valueOf(this.value); }
-
- /** Checks the equality of the bin by ID and value. */
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final Bin<K> bin = (Bin<K>) o;
-
- if (Double.compare(bin.value, value) != 0) return false;
- if (!id.equals(bin.id)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result;
- final long temp;
- result = id.hashCode();
- temp = value != +0.0d ? Double.doubleToLongBits(value) : 0L;
- result = 31 * result + (int) (temp ^ (temp >>> 32));
- return result;
- }
-
- public double getIdValue() {
- if (id instanceof Number) {
- return ((Number) id).doubleValue();
- } else {
- throw new UnsupportedOperationException("getIdValue only supported for Histogram<? extends Number>");
- }
- }
- }
-
- /** Prefill the histogram with the supplied set of bins. */
- public void prefillBins(final K... ids) {
- for (final K id : ids) {
- map.put(id, new Bin<>(id));
- }
- }
-
- /** Increments the value in the designated bin by 1. */
- public void increment(final K id) {
- increment(id, 1d);
- }
-
- /** Increments the value in the designated bin by the supplied increment. */
- public void increment(final K id, final double increment) {
- Bin<K> bin = map.get(id);
- if (bin == null) {
- bin = new Bin<>(id);
- map.put(id, bin);
- }
-
- bin.value += increment;
- }
-
- public String getBinLabel() { return binLabel; }
- public void setBinLabel(final String binLabel) { this.binLabel = binLabel; }
-
- public String getValueLabel() { return valueLabel; }
- public void setValueLabel(final String valueLabel) { this.valueLabel = valueLabel; }
-
- /** Checks that the labels and values in the two histograms are identical. */
- @Override
- public boolean equals(final Object o) {
- if (o == this) {
- return true;
- }
- return o != null &&
- (o instanceof Histogram) &&
- ((Histogram) o).binLabel.equals(this.binLabel) &&
- ((Histogram) o).valueLabel.equals(this.valueLabel) &&
- ((Histogram) o).map.equals(this.map);
- }
-
- @Override
- public String toString() {
- return map.toString();
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(binLabel, valueLabel, map);
- }
-
- /**
- * Assuming that the key type for the histogram is a Number type, returns the mean of
- * all the items added to the histogram.
- */
- public double getMean() {
- // Could use simply getSum() / getCount(), but that would require iterating over the
- // values() set twice, which seems inefficient given how simply the computation is.
- double product=0, totalCount=0;
- for (final Bin<K> bin : map.values()) {
- final double idValue = bin.getIdValue();
- final double count = bin.getValue();
-
- product += idValue * count;
- totalCount += count;
- }
-
- return product / totalCount;
- }
-
- /**
- * Returns the sum of the products of the histgram bin ids and the number of entries in each bin.
- * Note: This is only supported if this histogram stores instances of Number.
- */
- public double getSum() {
- double total = 0;
- for (final Bin<K> bin : map.values()) {
- total += bin.getValue() * bin.getIdValue();
- }
-
- return total;
- }
-
- /**
- * Returns the sum of the number of entries in each bin.
- */
- public double getSumOfValues() {
- double total = 0;
- for (final Bin<K> bin : map.values()) {
- total += bin.getValue();
- }
-
- return total;
- }
-
- public double getStandardDeviation() {
- final double mean = getMean();
-
- double count = 0;
- double total = 0;
-
- for (final Bin<K> bin : map.values()) {
- final double localCount = bin.getValue();
- final double value = bin.getIdValue();
-
- count += localCount;
- total += localCount * pow(value - mean, 2);
- }
-
- return Math.sqrt(total / (count-1));
- }
-
- /**
- * Calculates the mean bin size
- */
- public double getMeanBinSize() {
- return (getSumOfValues() / size());
- }
-
- /**
- * Returns the size of this histogram.
- */
- public int size() {
- return map.size();
- }
-
- /**
- * Returns the comparator used to order the keys in this histogram, or
- * {@code null} if this histogram uses the {@linkplain Comparable
- * natural ordering} of its keys.
- *
- * @return the comparator used to order the keys in this histogram,
- * or {@code null} if this histogram uses the natural ordering
- * of its keys
- */
- public Comparator<? super K> comparator() {
- return map.comparator();
- }
-
- /**
- * Calculates the median bin size
- */
- public double getMedianBinSize() {
- if (size() == 0) {
- return 0;
- }
-
- final List<Double> binValues = new ArrayList<>();
- for (final Bin<K> bin : values()) {
- binValues.add(bin.getValue());
- }
- Collections.sort(binValues);
-
- final int midPoint = binValues.size() / 2;
- double median = binValues.get(midPoint);
- if (binValues.size() % 2 == 0) {
- median = (median + binValues.get(midPoint-1)) / 2;
- }
-
- return median;
- }
-
- /**
- * Returns a {@link Collection} view of the values contained in this histogram.
- * The collection's iterator returns the values in ascending order
- * of the corresponding keys.
- */
- public Collection<Bin<K>> values() {
- return map.values();
- }
-
- /**
- * Calculates the standard deviation of the bin size
- */
- public double getStandardDeviationBinSize(final double mean) {
- double total = 0;
- for(final Bin<K> bin : values()) {
- total += Math.pow(bin.getValue() - mean, 2);
- }
- return Math.sqrt(total / (Math.max(1,values().size()-1)));
- }
-
- /**
- * Gets the bin in which the given percentile falls.
- *
- * @param percentile a value between 0 and 1
- * @return the bin value in which the percentile falls
- */
- public double getPercentile(final double percentile) {
- if (percentile <= 0) throw new IllegalArgumentException("Cannot query percentiles of 0 or below");
- if (percentile >= 1) throw new IllegalArgumentException("Cannot query percentiles of 1 or above");
-
- double total = getCount();
- double sofar = 0;
- for (Bin<K> bin : values()) {
- sofar += bin.getValue();
- if (sofar / total >= percentile) return bin.getIdValue();
- }
-
- throw new IllegalStateException("Could not find percentile: " + percentile);
- }
-
- /**
- * Returns the cumulative probability of observing a value <= v when sampling the
- * distribution represented by this histogram.
- * @throws UnsupportedOperationException if this histogram does not store instances of Number
- */
- public double getCumulativeProbability(final double v) {
- double count = 0;
- double total = 0;
-
- for (final Bin<K> bin : values()) {
- final double binValue = bin.getIdValue();
- if (binValue <= v) count += bin.getValue();
- total += bin.getValue();
- }
-
- return count / total;
- }
-
- public double getMedian() {
- double total = 0;
- double count = getCount();
-
- // Base cases
- if (count == 0) return 0;
- if (count == 1) return values().iterator().next().getIdValue();
-
- final double midLow, midHigh;
- if (count % 2 == 0) {
- midLow = count / 2;
- midHigh = midLow + 1;
- }
- else {
- midLow = Math.ceil(count / 2);
- midHigh = midLow;
- }
-
- Double midLowValue = null;
- Double midHighValue = null;
- for (final Bin<K> bin : values()) {
- total += bin.getValue();
- if (midLowValue == null && total >= midLow) midLowValue = bin.getIdValue();
- if (midHighValue == null && total >= midHigh) midHighValue = bin.getIdValue();
- if (midLowValue != null && midHighValue != null) break;
- }
-
- return (midLowValue + midHighValue) / 2;
- }
-
- /** Gets the median absolute deviation of the distribution. */
- public double getMedianAbsoluteDeviation() {
- final double median = getMedian();
- final Histogram<Double> deviations = new Histogram<>();
- for (final Bin<K> bin : values()) {
- final double dev = abs(bin.getIdValue() - median);
- deviations.increment(dev, bin.getValue());
- }
-
- return deviations.getMedian();
- }
-
- /**
- * Returns a value that is intended to estimate the mean of the distribution, if the distribution is
- * essentially normal, by using the median absolute deviation to remove the effect of
- * erroneous massive outliers.
- */
- public double estimateSdViaMad() {
- return 1.4826 * getMedianAbsoluteDeviation();
- }
-
- /** Returns id of the Bin that's the mode of the distribution (i.e. the largest bin).
- * @throws UnsupportedOperationException if this histogram does not store instances of Number
- */
- public double getMode() {
- return getModeBin().getIdValue();
- }
-
- /** Returns the Bin that's the mode of the distribution (i.e. the largest bin). */
- private Bin<K> getModeBin() {
- Bin<K> modeBin = null;
-
- for (final Bin<K> bin : values()) {
- if (modeBin == null || modeBin.value < bin.value) {
- modeBin = bin;
- }
- }
-
- return modeBin;
- }
-
-
- /**
- * Returns the key with the lowest count.
- * @throws UnsupportedOperationException if this histogram does not store instances of Number
- */
- public double getMin() {
- return map.firstEntry().getValue().getIdValue();
- }
-
- /**
- * Returns the key with the highest count.
- * @throws UnsupportedOperationException if this histogram does not store instances of Number
- */
- public double getMax() {
- return map.lastEntry().getValue().getIdValue();
- }
-
- public double getCount() {
- double count = 0;
- for (final Bin<K> bin : values()) {
- count += bin.value;
- }
-
- return count;
- }
-
- /** Gets the geometric mean of the distribution. */
- public double getGeometricMean() {
- double total = 0;
- double count = 0;
- for (final Bin<K> bin : values()) {
- total += bin.value * log(bin.getIdValue());
- count += bin.value;
- }
-
- return exp(total / count);
- }
-
- /**
- * Trims the histogram when the bins in the tail of the distribution contain fewer than mode/tailLimit items
- */
- public void trimByTailLimit(final int tailLimit) {
- if (isEmpty()) {
- return;
- }
-
- final Bin<K> modeBin = getModeBin();
- final double mode = modeBin.getIdValue();
- final double sizeOfModeBin = modeBin.getValue();
- final double minimumBinSize = sizeOfModeBin/tailLimit;
- Bin<K> lastBin = null;
-
- final List<K> binsToKeep = new ArrayList<>();
- for (Bin<K> bin : values()) {
- double binId = ((Number)bin.getId()).doubleValue();
-
- if (binId <= mode) {
- binsToKeep.add(bin.getId());
- }
- else if ((lastBin != null && ((Number)lastBin.getId()).doubleValue() != binId - 1) || bin.getValue() < minimumBinSize) {
- break;
- }
- else {
- binsToKeep.add(bin.getId());
- }
- lastBin = bin;
- }
-
- final Object keys[] = keySet().toArray();
- for (Object binId : keys) {
- if (!binsToKeep.contains(binId)) {
- remove(binId);
- }
- }
- }
-
- private Bin<K> remove(final Object key) {
- return map.remove(key);
- }
-
- /**
- * Returns true if this histogram has no data in in, false otherwise.
- */
- public boolean isEmpty() {
- return map.isEmpty();
- }
-
- /**
- * Trims the histogram so that only bins <= width are kept.
- */
- public void trimByWidth(final int width) {
- final Iterator<K> it = map.descendingKeySet().iterator();
- while (it.hasNext()) {
-
- if (((Number)it.next()).doubleValue() > width) {
- it.remove();
- } else break;
- }
- }
-
- /***
- * Immutable method that divides the current Histogram by an input Histogram and generates a new one
- * Throws an exception if the bins don't match up exactly
- * @param divisorHistogram
- * @return
- * @throws IllegalArgumentException if the keySet of this histogram is not equal to the keySet of the given divisorHistogram
- */
- public Histogram<K> divideByHistogram(final Histogram<K> divisorHistogram) {
- final Histogram<K> output = new Histogram<K>();
- if (!this.keySet().equals(divisorHistogram.keySet())) throw new IllegalArgumentException("Attempting to divide Histograms with non-identical bins");
- for (final K key : this.keySet()){
- final Bin<K> dividend = this.get(key);
- final Bin<K> divisor = divisorHistogram.get(key);
- output.increment(key, dividend.getValue()/divisor.getValue());
- }
- return output;
- }
-
- /***
- * Mutable method that allows the addition of a Histogram into the current one.
- * @param addHistogram
- */
- public void addHistogram(final Histogram<K> addHistogram) {
- for (final K key : addHistogram.keySet()){
- this.increment(key, addHistogram.get(key).getValue());
- }
- }
-
- /**
- * Retrieves the bin associated with the given key.
- */
- public Bin<K> get(final K key) {
- return map.get(key);
- }
-
- /**
- * Returns the set of keys for this histogram.
- */
- public Set<K> keySet() {
- return map.keySet();
- }
-
- /**
- * Return whether this histogram contains the given key.
- */
- public boolean containsKey(final K key){
- return map.containsKey(key);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/HttpUtils.java b/src/main/java/htsjdk/samtools/util/HttpUtils.java
deleted file mode 100644
index 49ec560..0000000
--- a/src/main/java/htsjdk/samtools/util/HttpUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * User: jrobinso
- * Date: Sep 23, 2009
- */
-public class HttpUtils {
-
- public static String getETag(final URL url) {
- return getHeaderField(url, "ETag");
- }
-
- private static URLConnection openConnection(final URL url) throws IOException{
- URLConnection conn = url.openConnection();
- conn.setReadTimeout(3000);
- conn.setDefaultUseCaches(false);
- conn.setUseCaches(false);
- return conn;
- }
-
- public static String getHeaderField(final URL url, final String name) {
- URLConnection conn = null;
- try {
- // Create a URLConnection object for a URL
- conn = openConnection(url);
- return conn.getHeaderField(name);
-
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- finally {
- if (conn != null && conn instanceof HttpURLConnection) {
- ((HttpURLConnection) conn).disconnect();
- }
- }
- }
-
- public static void printHeaderFields(final URL url) {
-
- URLConnection conn = null;
- try {
- // Create a URLConnection object for a URL
- conn = openConnection(url);
-
- for (final String name : conn.getHeaderFields().keySet()) {
- System.out.println(name + "\t" + conn.getHeaderField(name));
-
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- finally {
- if (conn != null && conn instanceof HttpURLConnection) {
- ((HttpURLConnection) conn).disconnect();
- }
- }
- }
-
- public static boolean resourceAvailable(final URL url) {
- return getETag(url) != null;
- }
-
- public static void main(final String[] args) throws MalformedURLException {
- //printHeaderFields(new URL(
- // "http://www.broadinstitute.org/igvdata/1KG/DCC_merged/freeze5/NA12891.pilot2.SLX.bam"));
- System.out.println(getETag(new URL(
- "http://www.broadinstitute.org/igvdata/test/sam/303KY.8.paired1.bam.tdf")));
- System.out.println(resourceAvailable(new URL(
- "http://www.broadinstitute.org/igvdata/test/sam/303KY.8.paired1.bam.tdf")));
-
-
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IOUtil.java b/src/main/java/htsjdk/samtools/util/IOUtil.java
deleted file mode 100644
index 07ae900..0000000
--- a/src/main/java/htsjdk/samtools/util/IOUtil.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Stack;
-import java.util.regex.Pattern;
-import java.util.zip.Deflater;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Miscellaneous stateless static IO-oriented methods.
- * Also used for utility methods that wrap or aggregate functionality in Java IO.
- */
-public class IOUtil {
- /**
- * @deprecated Use {@link Defaults#NON_ZERO_BUFFER_SIZE} instead.
- */
- @Deprecated
- public static final int STANDARD_BUFFER_SIZE = Defaults.NON_ZERO_BUFFER_SIZE;
-
- public static final long ONE_GB = 1024 * 1024 * 1024;
- public static final long TWO_GBS = 2 * ONE_GB;
- public static final long FIVE_GBS = 5 * ONE_GB;
-
- /** Possible extensions for VCF files and related formats. */
- public static final String[] VCF_EXTENSIONS = new String[] {".vcf", ".vcf.gz", ".bcf"};
-
- public static final String INTERVAL_LIST_FILE_EXTENSION = IntervalList.INTERVAL_LIST_FILE_EXTENSION;
-
- public static final String SAM_FILE_EXTENSION = ".sam";
-
- public static final String DICT_FILE_EXTENSION = ".dict";
-
- private static int compressionLevel = Defaults.COMPRESSION_LEVEL;
-
- /**
- * Sets the GZip compression level for subsequent GZIPOutputStream object creation.
- * @param compressionLevel 0 <= compressionLevel <= 9
- */
- public static void setCompressionLevel(final int compressionLevel) {
- if (compressionLevel < Deflater.NO_COMPRESSION || compressionLevel > Deflater.BEST_COMPRESSION) {
- throw new IllegalArgumentException("Invalid compression level: " + compressionLevel);
- }
- IOUtil.compressionLevel = compressionLevel;
- }
-
- public static int getCompressionLevel() {
- return compressionLevel;
- }
-
- /**
- * Wrap the given stream in a BufferedInputStream, if it isn't already wrapper
- *
- * @param stream stream to be wrapped
- * @return A BufferedInputStream wrapping stream, or stream itself if stream instanceof BufferedInputStream.
- */
- public static BufferedInputStream toBufferedStream(final InputStream stream) {
- if (stream instanceof BufferedInputStream) {
- return (BufferedInputStream) stream;
- } else {
- return new BufferedInputStream(stream, Defaults.NON_ZERO_BUFFER_SIZE);
- }
- }
-
- /**
- * Transfers from the input stream to the output stream using stream operations and a buffer.
- */
- public static void transferByStream(final InputStream in, final OutputStream out, final long bytes) {
- final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
- long remaining = bytes;
-
- try {
- while (remaining > 0) {
- final int read = in.read(buffer, 0, (int) Math.min(buffer.length, remaining));
- out.write(buffer, 0, read);
- remaining -= read;
- }
- }
- catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-
- /**
- * @return If Defaults.BUFFER_SIZE > 0, wrap os in BufferedOutputStream, else return os itself.
- */
- public static OutputStream maybeBufferOutputStream(final OutputStream os) {
- return maybeBufferOutputStream(os, Defaults.BUFFER_SIZE);
- }
-
- /**
- * @return If bufferSize > 0, wrap os in BufferedOutputStream, else return os itself.
- */
- public static OutputStream maybeBufferOutputStream(final OutputStream os, final int bufferSize) {
- if (bufferSize > 0) return new BufferedOutputStream(os, bufferSize);
- else return os;
- }
-
- public static SeekableStream maybeBufferedSeekableStream(final SeekableStream stream, final int bufferSize) {
- return bufferSize > 0 ? new SeekableBufferedStream(stream, bufferSize) : stream;
- }
-
- public static SeekableStream maybeBufferedSeekableStream(final SeekableStream stream) {
- return maybeBufferedSeekableStream(stream, Defaults.BUFFER_SIZE);
- }
-
- public static SeekableStream maybeBufferedSeekableStream(final File file) {
- try {
- return maybeBufferedSeekableStream(new SeekableFileStream(file));
- } catch (final FileNotFoundException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- public static SeekableStream maybeBufferedSeekableStream(final URL url) {
- return maybeBufferedSeekableStream(new SeekableHTTPStream(url));
- }
-
- /**
- * @return If Defaults.BUFFER_SIZE > 0, wrap is in BufferedInputStream, else return is itself.
- */
- public static InputStream maybeBufferInputStream(final InputStream is) {
- return maybeBufferInputStream(is, Defaults.BUFFER_SIZE);
- }
-
- /**
- * @return If bufferSize > 0, wrap is in BufferedInputStream, else return is itself.
- */
- public static InputStream maybeBufferInputStream(final InputStream is, final int bufferSize) {
- if (bufferSize > 0) return new BufferedInputStream(is, bufferSize);
- else return is;
- }
-
- public static Reader maybeBufferReader(Reader reader, final int bufferSize) {
- if (bufferSize > 0) reader = new BufferedReader(reader, bufferSize);
- return reader;
- }
-
- public static Reader maybeBufferReader(final Reader reader) {
- return maybeBufferReader(reader, Defaults.BUFFER_SIZE);
- }
-
- public static Writer maybeBufferWriter(Writer writer, final int bufferSize) {
- if (bufferSize > 0) writer = new BufferedWriter(writer, bufferSize);
- return writer;
- }
-
- public static Writer maybeBufferWriter(final Writer writer) {
- return maybeBufferWriter(writer, Defaults.BUFFER_SIZE);
- }
-
-
- /**
- * Delete a list of files, and write a warning message if one could not be deleted.
- *
- * @param files Files to be deleted.
- */
- public static void deleteFiles(final File... files) {
- for (final File f : files) {
- if (!f.delete()) {
- System.err.println("Could not delete file " + f);
- }
- }
- }
-
- public static void deleteFiles(final Iterable<File> files) {
- for (final File f : files) {
- if (!f.delete()) {
- System.err.println("Could not delete file " + f);
- }
- }
- }
-
-
- /**
- * @return true if the path is not a device (e.g. /dev/null or /dev/stdin), and is not
- * an existing directory. I.e. is is a regular path that may correspond to an existing
- * file, or a path that could be a regular output file.
- */
- public static boolean isRegularPath(final File file) {
- return !file.exists() || file.isFile();
- }
-
- /**
- * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
- * on JVM exit and then returns it.
- */
- public static File newTempFile(final String prefix, final String suffix,
- final File[] tmpDirs, final long minBytesFree) throws IOException {
- File f = null;
-
- for (int i = 0; i < tmpDirs.length; ++i) {
- if (i == tmpDirs.length - 1 || tmpDirs[i].getUsableSpace() > minBytesFree) {
- f = File.createTempFile(prefix, suffix, tmpDirs[i]);
- f.deleteOnExit();
- break;
- }
- }
-
- return f;
- }
-
- /** Creates a new tmp file on one of the potential filesystems that has at least 5GB free. */
- public static File newTempFile(final String prefix, final String suffix,
- final File[] tmpDirs) throws IOException {
- return newTempFile(prefix, suffix, tmpDirs, FIVE_GBS);
- }
-
-
- /** Returns a default tmp directory. */
- public static File getDefaultTmpDir() {
- final String user = System.getProperty("user.name");
- final String tmp = System.getProperty("java.io.tmpdir");
-
- if (tmp.endsWith(File.separatorChar + user)) return new File(tmp);
- else return new File(tmp, user);
- }
-
- /** Returns the name of the file minus the extension (i.e. text after the last "." in the filename). */
- public static String basename(final File f) {
- final String full = f.getName();
- final int index = full.lastIndexOf('.');
- if (index > 0 && index > full.lastIndexOf(File.separator)) {
- return full.substring(0, index);
- }
- else {
- return full;
- }
- }
-
- /**
- * Checks that an input is is non-null, a URL or a file, exists,
- * and if its a file then it is not a directory and is readable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param input the input to check for validity
- */
- public static void assertInputIsValid(final String input) {
- if (input == null) {
- throw new IllegalArgumentException("Cannot check validity of null input.");
- }
- if (!isUrl(input)) {
- assertFileIsReadable(new File(input));
- }
- }
-
- /**
- * Returns true iff the string is a url.
- * Helps distinguish url inputs form file path inputs.
- */
- public static boolean isUrl(final String input) {
- try {
- new URL(input);
- return true;
- } catch (MalformedURLException e) {
- return false;
- }
- }
-
- /**
- * Checks that a file is non-null, exists, is not a directory and is readable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param file the file to check for readability
- */
- public static void assertFileIsReadable(final File file) {
- assertFileIsReadable(file == null ? null : file.toPath());
- }
-
- /**
- * Checks that a file is non-null, exists, is not a directory and is readable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param path the file to check for readability
- */
- public static void assertFileIsReadable(final Path path) {
- if (path == null) {
- throw new IllegalArgumentException("Cannot check readability of null file.");
- } else if (!Files.exists(path)) {
- throw new SAMException("Cannot read non-existent file: " + path.toAbsolutePath());
- }
- else if (Files.isDirectory(path)) {
- throw new SAMException("Cannot read file because it is a directory: " + path.toAbsolutePath());
- }
- else if (!Files.isReadable(path)) {
- throw new SAMException("File exists but is not readable: " + path.toAbsolutePath());
- }
- }
-
- /**
- * Checks that each file is non-null, exists, is not a directory and is readable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param files the list of files to check for readability
- */
- public static void assertFilesAreReadable(final List<File> files) {
- for (final File file : files) assertFileIsReadable(file);
- }
-
- /**
- * Checks that each string is non-null, exists or is a URL,
- * and if it is a file then not a directory and is readable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param files the list of files to check for readability
- */
- public static void assertInputsAreValid(final List<String> inputs) {
- for (final String input : inputs) assertInputIsValid(input);
- }
-
- /**
- * Checks that a file is non-null, and is either extent and writable, or non-existent but
- * that the parent directory exists and is writable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param file the file to check for writability
- */
- public static void assertFileIsWritable(final File file) {
- if (file == null) {
- throw new IllegalArgumentException("Cannot check readability of null file.");
- } else if (!file.exists()) {
- // If the file doesn't exist, check that it's parent directory does and is writable
- final File parent = file.getAbsoluteFile().getParentFile();
- if (!parent.exists()) {
- throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
- "Neither file nor parent directory exist.");
- }
- else if (!parent.isDirectory()) {
- throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
- "File does not exist and parent is not a directory.");
- }
- else if (!parent.canWrite()) {
- throw new SAMException("Cannot write file: " + file.getAbsolutePath() + ". " +
- "File does not exist and parent directory is not writable..");
- }
- }
- else if (file.isDirectory()) {
- throw new SAMException("Cannot write file because it is a directory: " + file.getAbsolutePath());
- }
- else if (!file.canWrite()) {
- throw new SAMException("File exists but is not writable: " + file.getAbsolutePath());
- }
- }
-
- /**
- * Checks that each file is non-null, and is either extent and writable, or non-existent but
- * that the parent directory exists and is writable. If any
- * condition is false then a runtime exception is thrown.
- *
- * @param files the list of files to check for writability
- */
- public static void assertFilesAreWritable(final List<File> files) {
- for (final File file : files) assertFileIsWritable(file);
- }
-
- /**
- * Checks that a directory is non-null, extent, writable and a directory
- * otherwise a runtime exception is thrown.
- *
- * @param dir the dir to check for writability
- */
- public static void assertDirectoryIsWritable(final File dir) {
- if (dir == null) {
- throw new IllegalArgumentException("Cannot check readability of null file.");
- }
- else if (!dir.exists()) {
- throw new SAMException("Directory does not exist: " + dir.getAbsolutePath());
- }
- else if (!dir.isDirectory()) {
- throw new SAMException("Cannot write to directory because it is not a directory: " + dir.getAbsolutePath());
- }
- else if (!dir.canWrite()) {
- throw new SAMException("Directory exists but is not writable: " + dir.getAbsolutePath());
- }
- }
-
- /**
- * Checks that a directory is non-null, extent, readable and a directory
- * otherwise a runtime exception is thrown.
- *
- * @param dir the dir to check for writability
- */
- public static void assertDirectoryIsReadable(final File dir) {
- if (dir == null) {
- throw new IllegalArgumentException("Cannot check readability of null file.");
- }
- else if (!dir.exists()) {
- throw new SAMException("Directory does not exist: " + dir.getAbsolutePath());
- }
- else if (!dir.isDirectory()) {
- throw new SAMException("Cannot read from directory because it is not a directory: " + dir.getAbsolutePath());
- }
- else if (!dir.canRead()) {
- throw new SAMException("Directory exists but is not readable: " + dir.getAbsolutePath());
- }
- }
-
- /**
- * Checks that the two files are the same length, and have the same content, otherwise throws a runtime exception.
- */
- public static void assertFilesEqual(final File f1, final File f2) {
- try {
- if (f1.length() != f2.length()) {
- throw new SAMException("Files " + f1 + " and " + f2 + " are different lengths.");
- }
- final FileInputStream s1 = new FileInputStream(f1);
- final FileInputStream s2 = new FileInputStream(f2);
- final byte[] buf1 = new byte[1024 * 1024];
- final byte[] buf2 = new byte[1024 * 1024];
- int len1;
- while ((len1 = s1.read(buf1)) != -1) {
- final int len2 = s2.read(buf2);
- if (len1 != len2) {
- throw new SAMException("Unexpected EOF comparing files that are supposed to be the same length.");
- }
- if (!Arrays.equals(buf1, buf2)) {
- throw new SAMException("Files " + f1 + " and " + f2 + " differ.");
- }
- }
- s1.close();
- s2.close();
- } catch (IOException e) {
- throw new SAMException("Exception comparing files " + f1 + " and " + f2, e);
- }
-
- }
-
- /**
- * Checks that a file is of non-zero length
- */
- public static void assertFileSizeNonZero(final File file) {
- if (file.length() == 0) {
- throw new SAMException(file.getAbsolutePath() + " has length 0");
- }
- }
-
- /**
- * Opens a file for reading, decompressing it if necessary
- *
- * @param file The file to open
- * @return the input stream to read from
- */
- public static InputStream openFileForReading(final File file) {
- return openFileForReading(file.toPath());
- }
-
- /**
- * Opens a file for reading, decompressing it if necessary
- *
- * @param path The file to open
- * @return the input stream to read from
- */
- public static InputStream openFileForReading(final Path path) {
-
- try {
- if (path.getFileName().toString().endsWith(".gz") ||
- path.getFileName().toString().endsWith(".bfq")) {
- return openGzipFileForReading(path);
- }
- else {
- return Files.newInputStream(path);
- }
- }
- catch (IOException ioe) {
- throw new SAMException("Error opening file: " + path, ioe);
- }
-
- }
-
- /**
- * Opens a GZIP-encoded file for reading, decompressing it if necessary
- *
- * @param file The file to open
- * @return the input stream to read from
- */
- public static InputStream openGzipFileForReading(final File file) {
- return openGzipFileForReading(file.toPath());
- }
-
- /**
- * Opens a GZIP-encoded file for reading, decompressing it if necessary
- *
- * @param path The file to open
- * @return the input stream to read from
- */
- public static InputStream openGzipFileForReading(final Path path) {
-
- try {
- return new GZIPInputStream(Files.newInputStream(path));
- }
- catch (IOException ioe) {
- throw new SAMException("Error opening file: " + path, ioe);
- }
- }
-
- /**
- * Opens a file for writing, overwriting the file if it already exists
- *
- * @param file the file to write to
- * @return the output stream to write to
- */
- public static OutputStream openFileForWriting(final File file) {
- return openFileForWriting(file, false);
- }
-
- /**
- * Opens a file for writing
- *
- * @param file the file to write to
- * @param append whether to append to the file if it already exists (we overwrite it if false)
- * @return the output stream to write to
- */
- public static OutputStream openFileForWriting(final File file, final boolean append) {
-
- try {
- if (file.getName().endsWith(".gz") ||
- file.getName().endsWith(".bfq")) {
- return openGzipFileForWriting(file, append);
- }
- else {
- return new FileOutputStream(file, append);
- }
- }
- catch (IOException ioe) {
- throw new SAMException("Error opening file for writing: " + file.getName(), ioe);
- }
- }
-
- /**
- * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
- */
- public static BufferedWriter openFileForBufferedWriting(final File file, final boolean append) {
- return new BufferedWriter(new OutputStreamWriter(openFileForWriting(file, append)), Defaults.NON_ZERO_BUFFER_SIZE);
- }
-
- /**
- * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
- */
- public static BufferedWriter openFileForBufferedWriting(final File file) {
- return openFileForBufferedWriting(file, false);
- }
-
- /**
- * Preferred over PrintStream and PrintWriter because an exception is thrown on I/O error
- */
- public static BufferedWriter openFileForBufferedUtf8Writing(final File file) {
- return new BufferedWriter(new OutputStreamWriter(openFileForWriting(file), Charset.forName("UTF-8")),
- Defaults.NON_ZERO_BUFFER_SIZE);
- }
-
- /**
- * Opens a file for reading, decompressing it if necessary
- *
- * @param file The file to open
- * @return the input stream to read from
- */
- public static BufferedReader openFileForBufferedUtf8Reading(final File file) {
- return new BufferedReader(new InputStreamReader(openFileForReading(file), Charset.forName("UTF-8")));
- }
-
- /**
- * Opens a GZIP encoded file for writing
- *
- * @param file the file to write to
- * @param append whether to append to the file if it already exists (we overwrite it if false)
- * @return the output stream to write to
- */
- public static OutputStream openGzipFileForWriting(final File file, final boolean append) {
-
- try {
- if (Defaults.BUFFER_SIZE > 0) {
- return new CustomGzipOutputStream(new FileOutputStream(file, append),
- Defaults.BUFFER_SIZE,
- compressionLevel);
- } else {
- return new CustomGzipOutputStream(new FileOutputStream(file, append), compressionLevel);
- }
- }
- catch (IOException ioe) {
- throw new SAMException("Error opening file for writing: " + file.getName(), ioe);
- }
- }
-
- public static OutputStream openFileForMd5CalculatingWriting(final File file) {
- return new Md5CalculatingOutputStream(IOUtil.openFileForWriting(file), new File(file.getAbsolutePath() + ".md5"));
- }
-
- /**
- * Utility method to copy the contents of input to output. The caller is responsible for
- * opening and closing both streams.
- *
- * @param input contents to be copied
- * @param output destination
- */
- public static void copyStream(final InputStream input, final OutputStream output) {
- try {
- final byte[] buffer = new byte[Defaults.NON_ZERO_BUFFER_SIZE];
- int bytesRead = 0;
- while((bytesRead = input.read(buffer)) > 0) {
- output.write(buffer, 0, bytesRead);
- }
- } catch (IOException e) {
- throw new SAMException("Exception copying stream", e);
- }
- }
-
- /**
- * Copy input to output, overwriting output if it already exists.
- */
- public static void copyFile(final File input, final File output) {
- try {
- final InputStream is = new FileInputStream(input);
- final OutputStream os = new FileOutputStream(output);
- copyStream(is, os);
- os.close();
- is.close();
- } catch (IOException e) {
- throw new SAMException("Error copying " + input + " to " + output, e);
- }
- }
-
- /**
- *
- * @param directory
- * @param regexp
- * @return list of files matching regexp.
- */
- public static File[] getFilesMatchingRegexp(final File directory, final String regexp) {
- final Pattern pattern = Pattern.compile(regexp);
- return getFilesMatchingRegexp(directory, pattern);
- }
-
- public static File[] getFilesMatchingRegexp(final File directory, final Pattern regexp) {
- return directory.listFiles( new FilenameFilter() {
- public boolean accept(final File dir, final String name) {
- return regexp.matcher(name).matches();
- }
- });
- }
-
- /**
- * Delete the given file or directory. If a directory, all enclosing files and subdirs are also deleted.
- */
- public static boolean deleteDirectoryTree(final File fileOrDirectory) {
- boolean success = true;
-
- if (fileOrDirectory.isDirectory()) {
- for (final File child : fileOrDirectory.listFiles()) {
- success = success && deleteDirectoryTree(child);
- }
- }
-
- success = success && fileOrDirectory.delete();
- return success;
- }
-
- /**
- * Returns the size (in bytes) of the file or directory and all it's children.
- */
- public static long sizeOfTree(final File fileOrDirectory) {
- long total = fileOrDirectory.length();
- if (fileOrDirectory.isDirectory()) {
- for (final File f : fileOrDirectory.listFiles()) {
- total += sizeOfTree(f);
- }
- }
-
- return total;
- }
-
- /**
- *
- * Copies a directory tree (all subdirectories and files) recursively to a destination
- */
- public static void copyDirectoryTree(final File fileOrDirectory, final File destination) {
- if (fileOrDirectory.isDirectory()) {
- destination.mkdir();
- for(final File f : fileOrDirectory.listFiles()) {
- final File destinationFileOrDirectory = new File(destination.getPath(),f.getName());
- if (f.isDirectory()){
- copyDirectoryTree(f,destinationFileOrDirectory);
- }
- else {
- copyFile(f,destinationFileOrDirectory);
- }
- }
- }
- }
-
- /**
- * Create a temporary subdirectory in the default temporary-file directory, using the given prefix and suffix to generate the name.
- * Note that this method is not completely safe, because it create a temporary file, deletes it, and then creates
- * a directory with the same name as the file. Should be good enough.
- *
- * @param prefix The prefix string to be used in generating the file's name; must be at least three characters long
- * @param suffix The suffix string to be used in generating the file's name; may be null, in which case the suffix ".tmp" will be used
- * @return File object for new directory
- */
- public static File createTempDir(final String prefix, final String suffix) {
- try {
- final File tmp = File.createTempFile(prefix, suffix);
- if (!tmp.delete()) {
- throw new SAMException("Could not delete temporary file " + tmp);
- }
- if (!tmp.mkdir()) {
- throw new SAMException("Could not create temporary directory " + tmp);
- }
- return tmp;
- } catch (IOException e) {
- throw new SAMException("Exception creating temporary directory.", e);
- }
- }
-
- /** Checks that a file exists and is readable, and then returns a buffered reader for it. */
- public static BufferedReader openFileForBufferedReading(final File file) {
- return new BufferedReader(new InputStreamReader(openFileForReading(file)), Defaults.NON_ZERO_BUFFER_SIZE);
- }
-
- /** Takes a string and replaces any characters that are not safe for filenames with an underscore */
- public static String makeFileNameSafe(final String str) {
- return str.trim().replaceAll("[\\s!\"#$%&'()*/:;<=>?@\\[\\]\\\\^`{|}~]", "_");
- }
-
- /** Returns the name of the file extension (i.e. text after the last "." in the filename) including the . */
- public static String fileSuffix(final File f) {
- final String full = f.getName();
- final int index = full.lastIndexOf('.');
- if (index > 0 && index > full.lastIndexOf(File.separator)) {
- return full.substring(index);
- } else {
- return null;
- }
- }
-
- /** Returns the full path to the file with all symbolic links resolved **/
- public static String getFullCanonicalPath(final File file) {
- try {
- File f = file.getCanonicalFile();
- String canonicalPath = "";
- while (f != null && !f.getName().equals("")) {
- canonicalPath = "/" + f.getName() + canonicalPath;
- f = f.getParentFile();
- if (f != null) f = f.getCanonicalFile();
- }
- return canonicalPath;
- } catch (final IOException ioe) {
- throw new RuntimeIOException("Error getting full canonical path for " +
- file + ": " + ioe.getMessage(), ioe);
- }
- }
-
- /**
- * Reads everything from an input stream as characters and returns a single String.
- */
- public static String readFully(final InputStream in) {
- try {
- final BufferedReader r = new BufferedReader(new InputStreamReader(in), Defaults.NON_ZERO_BUFFER_SIZE);
- final StringBuilder builder = new StringBuilder(512);
- String line = null;
-
- while ((line = r.readLine()) != null) {
- if (builder.length() > 0) builder.append('\n');
- builder.append(line);
- }
-
- return builder.toString();
- }
- catch (final IOException ioe) {
- throw new RuntimeIOException("Error reading stream", ioe);
- }
- }
-
- /**
- * Returns an iterator over the lines in a text file. The underlying resources are automatically
- * closed when the iterator hits the end of the input, or manually by calling close().
- *
- * @param f a file that is to be read in as text
- * @return an iterator over the lines in the text file
- */
- public static IterableOnceIterator<String> readLines(final File f) {
- try {
- final BufferedReader in = IOUtil.openFileForBufferedReading(f);
-
- return new IterableOnceIterator<String>() {
- private String next = in.readLine();
-
- /** Returns true if there is another line to read or false otherwise. */
- @Override public boolean hasNext() { return next != null; }
-
- /** Returns the next line in the file or null if there are no more lines. */
- @Override public String next() {
- try {
- final String tmp = next;
- next = in.readLine();
- if (next == null) in.close();
- return tmp;
- }
- catch (final IOException ioe) { throw new RuntimeIOException(ioe); }
- }
-
- /** Closes the underlying input stream. Not required if end of stream has already been hit. */
- @Override public void close() throws IOException { CloserUtil.close(in); }
- };
- }
- catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /** Returns all of the untrimmed lines in the provided file. */
- public static List<String> slurpLines(final File file) throws FileNotFoundException {
- return slurpLines(new FileInputStream(file));
- }
-
- public static List<String> slurpLines(final InputStream is) throws FileNotFoundException {
- /** See {@link java.util.Scanner} source for origin of delimiter used here. */
- return tokenSlurp(is, Charset.defaultCharset(), "\r\n|[\n\r\u2028\u2029\u0085]");
- }
-
- /** Convenience overload for {@link #slurp(java.io.InputStream, java.nio.charset.Charset)} using the default charset {@link java.nio.charset.Charset#defaultCharset()}. */
- public static String slurp(final File file) throws FileNotFoundException {
- return slurp(new FileInputStream(file));
- }
-
- /** Convenience overload for {@link #slurp(java.io.InputStream, java.nio.charset.Charset)} using the default charset {@link java.nio.charset.Charset#defaultCharset()}. */
- public static String slurp(final InputStream is) {
- return slurp(is, Charset.defaultCharset());
- }
-
- /** Reads all of the stream into a String, decoding with the provided {@link java.nio.charset.Charset} then closes the stream quietly. */
- public static String slurp(final InputStream is, final Charset charSet) {
- final List<String> tokenOrEmpty = tokenSlurp(is, charSet, "\\A");
- return tokenOrEmpty.isEmpty() ? StringUtil.EMPTY_STRING : CollectionUtil.getSoleElement(tokenOrEmpty);
- }
-
- /** Tokenizes the provided input stream into memory using the given delimiter. */
- private static List<String> tokenSlurp(final InputStream is, final Charset charSet, final String delimiterPattern) {
- try {
- final Scanner s = new Scanner(is, charSet.toString()).useDelimiter(delimiterPattern);
- final LinkedList<String> tokens = new LinkedList<String>();
- while (s.hasNext()) {
- tokens.add(s.next());
- }
- return tokens;
- } finally {
- CloserUtil.close(is);
- }
- }
-
- /**
- * Go through the files provided and if they have one of the provided file extensions pass the file into the output
- * otherwise assume that file is a list of filenames and unfold it into the output.
- */
- public static List<File> unrollFiles(final Collection<File> inputs, final String... extensions) {
- if (extensions.length < 1) throw new IllegalArgumentException("Must provide at least one extension.");
-
- final Stack<File> stack = new Stack<File>();
- final List<File> output = new ArrayList<File>();
- stack.addAll(inputs);
-
- while (!stack.empty()) {
- final File f = stack.pop();
- final String name = f.getName();
- boolean matched = false;
-
- for (final String ext : extensions) {
- if (!matched && name.endsWith(ext)) {
- output.add(f);
- matched = true;
- }
- }
-
- // If the file didn't match a given extension, treat it as a list of files
- if (!matched) {
- IOUtil.assertFileIsReadable(f);
-
- for (final String s : IOUtil.readLines(f)) {
- if (!s.trim().isEmpty()) stack.push(new File(s.trim()));
- }
- }
- }
-
- // Preserve input order (since we're using a stack above) for things that care
- Collections.reverse(output);
-
- return output;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Interval.java b/src/main/java/htsjdk/samtools/util/Interval.java
deleted file mode 100644
index 779bb25..0000000
--- a/src/main/java/htsjdk/samtools/util/Interval.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.util.Collection;
-
-/**
- * Represents a simple interval on a sequence. Coordinates are 1-based closed ended.
- *
- * @author Tim Fennell
- */
-public class Interval implements Comparable<Interval>, Cloneable, Locatable {
- private final boolean negativeStrand;
- private final String name;
- private final String contig;
- private final int start;
- private final int end;
-
- /**
- * Constructs an interval with the supplied sequence and start and end. If the end
- * position is less than the start position an exception is thrown.
- *
- * @param sequence the name of the sequence
- * @param start the start position of the interval on the sequence
- * @param end the end position of the interval on the sequence
- */
- public Interval(final String sequence, final int start, final int end) {
- this(sequence, start, end, false, null);
- }
-
- /**
- * Constructs an interval with the supplied sequence and start, end, strand and name.
- * If the end position is less than the start position an exception is thrown.
- *
- * @param sequence the name of the sequence
- * @param start the start position of the interval on the sequence
- * @param end the end position of the interval on the sequence
- * @param negative true to indicate negative strand, false otherwise
- * @param name the name (possibly null) of the interval
- *
- */
- public Interval(final String sequence, final int start, final int end, final boolean negative, final String name) {
- this.contig = sequence;
- this.start = start;
- this.end = end;
- this.negativeStrand = negative;
- this.name = name;
- }
-
- /** Gets the name of the sequence on which the interval resides.
- * This is a simple alias of getContig()
- * @deprecated use getContig() instead
- */
- @Deprecated
- public String getSequence() { return getContig(); }
-
-
- /** Returns true if the interval is on the negative strand, otherwise false. */
- public boolean isNegativeStrand() { return this.negativeStrand; }
-
- /** Returns true if the interval is on the positive strand, otherwise false. */
- public boolean isPositiveStrand() { return !this.negativeStrand; }
-
- /** Returns the name of the interval, possibly null. */
- public String getName() { return this.name; }
-
- /** Returns true if this interval overlaps the other interval, otherwise false. */
- public boolean intersects(final Interval other) {
- return (this.getContig().equals(other.getContig()) &&
- CoordMath.overlaps(this.getStart(), this.getEnd(), other.getStart(), other.getEnd()));
- }
-
- public int getIntersectionLength(final Interval other) {
- if (this.intersects(other)) {
- return (int)CoordMath.getOverlap(this.getStart(), this.getEnd(), other.getStart(), other.getEnd());
- }
- return 0;
- }
-
-
- /** Returns a new Interval that represents the intersection between the two intervals. */
- public Interval intersect(final Interval that) {
- if (!intersects(that)) throw new IllegalArgumentException(that + " does not intersect " + this);
- return new Interval(this.getContig(),
- Math.max(this.getStart(), that.getStart()),
- Math.min(this.getEnd(), that.getEnd()),
- this.negativeStrand,
- this.name + " intersection " + that.name);
- }
-
-
- /** Returns true if this interval overlaps the other interval, otherwise false. */
- public boolean abuts(final Interval other) {
- return this.getContig().equals(other.getContig()) &&
- (this.getStart() == other.getEnd() + 1 || other.getStart() == this.getEnd() + 1);
- }
-
- /** Gets the length of this interval. */
- public int length() { return this.getEnd() - this.getStart() + 1; }
-
- /** Returns a new interval that is padded by the amount of bases specified on either side. */
- public Interval pad(final int left, final int right) {
- return new Interval(this.getContig(), this.getStart()-left, this.getEnd()+right, this.negativeStrand, this.name);
- }
-
- /** Counts the total number of bases a collection of intervals. */
- public static long countBases(final Collection<Interval> intervals) {
- long total = 0;
- for (final Interval i : intervals) {
- total += i.length();
- }
-
- return total;
- }
-
-
- /**
- * Sort based on sequence.compareTo, then start pos, then end pos
- * with null objects coming lexically last
- */
- public int compareTo(final Interval that) {
- if (that == null) return -1; // nulls last
-
- int result = this.getContig().compareTo(that.getContig());
- if (result == 0) {
- if (this.getStart() == that.getStart()) {
- result = this.getEnd() - that.getEnd();
- }
- else {
- result = this.getStart() - that.getStart();
- }
- }
-
- return result;
- }
-
- /** Equals method that agrees with {@link #compareTo(Interval)}. */
- public boolean equals(final Object other) {
- if (!(other instanceof Interval)) return false;
- else if (this == other) return true;
- else {
- Interval that = (Interval)other;
- return (this.compareTo(that) == 0);
- }
- }
-
- @Override
- public int hashCode() {
- int result = getContig().hashCode();
- result = 31 * result + getStart();
- result = 31 * result + getEnd();
- return result;
- }
-
- public String toString() {
- return getContig() + ":" + getStart() + "-" + getEnd() + "\t" + (negativeStrand ? '-' : '+') + "\t" + ((null == name) ? '.' : name);
- }
-
- @Override
- public Interval clone() {
- try { return (Interval) super.clone(); }
- catch (CloneNotSupportedException cnse) { throw new SAMException("That's unpossible", cnse); }
- }
-
- @Override
- public String getContig() {
- return contig;
- }
-
- @Override
- public int getStart() {
- return start;
- }
-
- @Override
- public int getEnd() {
- return end;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalList.java b/src/main/java/htsjdk/samtools/util/IntervalList.java
deleted file mode 100644
index 76cb508..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalList.java
+++ /dev/null
@@ -1,790 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMTextHeaderCodec;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Represents a list of intervals against a reference sequence that can be written to
- * and read from a file. The file format is relatively simple and reflects the SAM
- * alignment format to a degree.
- *
- * A SAM style header must be present in the file which lists the sequence records
- * against which the intervals are described. After the header the file then contains
- * records one per line in text format with the following values tab-separated:
- * Sequence name,
- * Start position (1-based),
- * End position (1-based, end inclusive),
- * Strand (either + or -),
- * Interval name (an, ideally unique, name for the interval),
- *
- * @author Tim Fennell
- * @author Yossi Farjoun
- */
-public class IntervalList implements Iterable<Interval> {
- public static final String INTERVAL_LIST_FILE_EXTENSION = ".interval_list";
-
- private final SAMFileHeader header;
- private final List<Interval> intervals = new ArrayList<Interval>();
-
- private static final Log log = Log.getInstance(IntervalList.class);
-
- /** Constructs a new interval list using the supplied header information. */
- public IntervalList(final SAMFileHeader header) {
- if (header == null) throw new IllegalArgumentException("SAMFileHeader must be supplied.");
- this.header = header;
- }
-
- /** Constructs a new interval list using the supplied header information. */
- public IntervalList(final SAMSequenceDictionary dict) {
- this(new SAMFileHeader(dict));
- }
-
- /** Gets the header (if there is one) for the interval list. */
- public SAMFileHeader getHeader() { return header; }
-
- /** Returns an iterator over the intervals. */
- public Iterator<Interval> iterator() { return this.intervals.iterator(); }
-
- /** Adds an interval to the list of intervals. */
- public void add(final Interval interval) {
- if (header.getSequence(interval.getContig()) == null) {
- throw new IllegalArgumentException(String.format("Cannot add interval %s, contig not in header", interval.toString()));
- }
- this.intervals.add(interval);
- }
-
- /** Adds a Collection of intervals to the list of intervals. */
- public void addall(final Collection<Interval> intervals) {
- //use this instead of addAll so that the contig checking happens.
- for (Interval interval : intervals) {
- add(interval);
- }
- }
-
- /**
- * Sorts the internal collection of intervals by coordinate.
- *
- * Note: this function modifies the object in-place and is therefore difficult to work with.
- *
- * @deprecated use {@link #sorted()} instead.
- */
- @Deprecated
- public void sort() {
- Collections.sort(this.intervals, new IntervalCoordinateComparator(this.header));
- this.header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- }
-
- /** Returns a new IntervalList where each interval is padded by the specified amount of bases. */
- public IntervalList padded(final int before, final int after) {
- if (before < 0 || after < 0) throw new IllegalArgumentException("Padding values must be >= 0.");
- final IntervalList padded = new IntervalList(this.getHeader().clone());
- final SAMSequenceDictionary dict = padded.getHeader().getSequenceDictionary();
- for (final Interval i : this) {
- final SAMSequenceRecord seq = dict.getSequence(i.getContig());
- final int start = Math.max(1, i.getStart() - before);
- final int end = Math.min(seq.getSequenceLength(), i.getEnd() + after);
- padded.add(new Interval(i.getContig(), start, end, i.isNegativeStrand(), i.getName()));
- }
-
- return padded;
- }
-
- /** Returns a new IntervalList where each interval is padded by 'padding' bases on each side. */
- public IntervalList padded(final int padding) {
- return padded(padding, padding);
- }
-
- /** returns an independent sorted IntervalList*/
- public IntervalList sorted() {
- final IntervalList sorted = IntervalList.copyOf(this);
- Collections.sort(sorted.intervals, new IntervalCoordinateComparator(sorted.header));
- sorted.header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- return sorted;
- }
-
- /** Returned an independent IntervalList that is sorted and uniquified. */
- public IntervalList uniqued() {
- return uniqued(true);
- }
-
- /**
- * Returned an independent IntervalList that is sorted and uniquified.
- * @param concatenateNames If false, interval names are not concatenated when merging intervals to save space.
- */
- public IntervalList uniqued(final boolean concatenateNames) {
- final List<Interval> tmp = getUniqueIntervals(sorted(), concatenateNames);
- final IntervalList value = new IntervalList(this.header.clone());
- value.intervals.addAll(tmp);
- return value;
- }
-
- /**
- * Sorts and uniques the list of intervals held within this interval list.
- *
- * Note: this function modifies the object in-place and is therefore difficult to work with.
- *
- * @deprecated use {@link #uniqued()} instead.
- */
- @Deprecated
- public void unique() {
- unique(true);
- }
-
- /**
- * Sorts and uniques the list of intervals held within this interval list.
- *
- * Note: this function modifies the object in-place and is therefore difficult to work with.
- *
- * @param concatenateNames If false, interval names are not concatenated when merging intervals to save space.
- * @deprecated use {@link #uniqued(boolean)} instead.
- */
- @Deprecated
- public void unique(final boolean concatenateNames) {
- sort();
- final List<Interval> tmp = getUniqueIntervals(concatenateNames);
- this.intervals.clear();
- this.intervals.addAll(tmp);
- }
-
- /** Gets the set of intervals as held internally. */
- public List<Interval> getIntervals() {
- return Collections.unmodifiableList(this.intervals);
- }
-
- /**
- * Merges the list of intervals and then reduces them down where regions overlap
- * or are directly adjacent to one another. During this process the "merged" interval
- * will retain the strand and name of the 5' most interval merged.
- *
- * Note: has the side-effect of sorting the stored intervals in coordinate order if not already sorted.
- *
- * Note: this function modifies the object in-place and is therefore difficult to work with.
- *
- * @return the set of unique intervals condensed from the contained intervals
- * @deprecated use {@link #uniqued()#getIntervals()} instead.
- */
- @Deprecated
- public List<Interval> getUniqueIntervals() {
- return getUniqueIntervals(true);
- }
-
- //NO SIDE EFFECTS HERE!
- /**
- * Merges list of intervals and reduces them like htsjdk.samtools.util.IntervalList#getUniqueIntervals()
- * @param concatenateNames If false, the merged interval has the name of the earlier interval. This keeps name shorter.
- */
- public static List<Interval> getUniqueIntervals(final IntervalList list, final boolean concatenateNames) {
- return getUniqueIntervals(list, concatenateNames, false);
- }
-
- //NO SIDE EFFECTS HERE!
- /**
- * Merges list of intervals and reduces them like htsjdk.samtools.util.IntervalList#getUniqueIntervals()
- * @param concatenateNames If false, the merged interval has the name of the earlier interval. This keeps name shorter.
- * @param enforceSameStrands enforce that merged intervals have the same strand, otherwise ignore.
- */
- public static List<Interval> getUniqueIntervals(final IntervalList list, final boolean concatenateNames, final boolean enforceSameStrands) {
-
- final List<Interval> intervals;
- if (list.getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- intervals = list.sorted().intervals;
- }
- else {
- intervals = list.intervals;
- }
-
- final List<Interval> unique = new ArrayList<Interval>();
- final TreeSet<Interval> toBeMerged = new TreeSet<Interval>();
- Interval current = null;
-
- for (final Interval next : intervals) {
- if (current == null) {
- toBeMerged.add(next);
- current = next;
- }
- else if (current.intersects(next) || current.abuts(next)) {
- if (enforceSameStrands && current.isNegativeStrand() != next.isNegativeStrand()) throw new SAMException("Strands were not equal for: " + current.toString() + " and " + next.toString());
- toBeMerged.add(next);
- current = new Interval(current.getContig(), current.getStart(), Math.max(current.getEnd(), next.getEnd()), current.isNegativeStrand(), null);
- }
- else {
- // Emit merged/unique interval
- unique.add(merge(toBeMerged, concatenateNames));
-
- // Set current == next for next iteration
- toBeMerged.clear();
- current = next;
- toBeMerged.add(current);
- }
- }
-
- if (!toBeMerged.isEmpty()) unique.add(merge(toBeMerged, concatenateNames));
- return unique;
- }
-
- /**
- * Merges list of intervals and reduces them like {@link #getUniqueIntervals()}.
- *
- * Note: this function modifies the object in-place and is therefore difficult to work with.
- *
- * @param concatenateNames If false, the merged interval has the name of the earlier interval. This keeps name shorter.
- * @deprecated use {@link #uniqued(boolean)#getIntervals()} or {@link #getUniqueIntervals(IntervalList, boolean)} instead.
- */
- @Deprecated
- public List<Interval> getUniqueIntervals(final boolean concatenateNames) {
- if (getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- sort();
- }
-
- return getUniqueIntervals(this, concatenateNames);
- }
-
- /**
- * Given a list of Intervals and a band multiple, this method will return a list of Intervals such that all of the intervals
- * do not straddle integer multiples of that band.
- *
- * ex: if there is an interval (7200-9300) and the bandMultiple is 1000, the interval will be split into:
- * (7200-7999, 8000-8999, 9000-9300)
- * @param intervals A list of Interval
- * @param bandMultiple integer value (> 0) to break up intervals in the list at integer multiples of
- * @return list of intervals that are broken up
- */
- public static List<Interval> breakIntervalsAtBandMultiples(final List<Interval> intervals, final int bandMultiple) {
- final List<Interval> brokenUpIntervals = new ArrayList<Interval>();
- for (final Interval interval : intervals) {
- if (interval.getEnd() >= interval.getStart()) { // Normal, non-empty intervals
- final int startIndex = interval.getStart() / bandMultiple;
- final int endIndex = interval.getEnd() / bandMultiple;
- if (startIndex == endIndex) {
- brokenUpIntervals.add(interval);
- } else {
- brokenUpIntervals.addAll(breakIntervalAtBandMultiples(interval, bandMultiple));
- }
- }
- else { // Special case - empty intervals ex: (100-99)
- brokenUpIntervals.add(interval);
- }
- }
- return brokenUpIntervals;
- }
-
- /**
- * Given an Interval and a band multiple, this method will return a list of Intervals such that all of the intervals
- * do not straddle integer multiples of that band.
- *
- * ex: if the interval is (7200-9300) and the bandMultiple is 1000, the interval will be split into:
- * (7200-7999, 8000-8999, 9000-9300)
- * @param interval an Interval
- * @param bandMultiple integer value (> 0) to break up intervals in the list at integer multiples of
- * @return list of intervals that are broken up
- */
- private static List<Interval> breakIntervalAtBandMultiples(final Interval interval, final int bandMultiple) {
- final List<Interval> brokenUpIntervals = new ArrayList<Interval>();
-
- int startPos = interval.getStart();
- final int startOfIntervalIndex = startPos / bandMultiple;
- int startIndex = startOfIntervalIndex;
- final int endIndex = interval.getEnd() / bandMultiple;
- while (startIndex <= endIndex) {
- int endPos = (startIndex + 1) * bandMultiple -1;
- if (endPos > interval.getEnd()) {
- endPos = interval.getEnd();
- }
- // add start/end to list of broken up intervals to return (and uniquely name it).
- brokenUpIntervals.add(new Interval(interval.getContig(), startPos, endPos, interval.isNegativeStrand(), interval.getName() + "." + (startIndex - startOfIntervalIndex + 1)));
- startIndex++;
- startPos = startIndex * bandMultiple;
- }
- return brokenUpIntervals;
- }
-
-
- /** Merges a sorted collection of intervals and optionally concatenates unique names or takes the first name. */
- static Interval merge(final SortedSet<Interval> intervals, final boolean concatenateNames) {
- final String chrom = intervals.first().getContig();
- int start = intervals.first().getStart();
- int end = intervals.last().getEnd();
- final boolean neg = intervals.first().isNegativeStrand();
- final LinkedHashSet<String> names = new LinkedHashSet<String>();
- final String name;
-
- for (final Interval i : intervals) {
- if (i.getName() != null) names.add(i.getName());
- start = Math.min(start, i.getStart());
- end = Math.max(end, i.getEnd());
- }
-
- if (concatenateNames) {
- if (names.isEmpty()) name = null;
- else name = StringUtil.join("|", names);
- }
- else { name = names.iterator().next(); }
-
- return new Interval(chrom, start, end, neg, name);
- }
-
- /** Gets the (potentially redundant) sum of the length of the intervals in the list. */
- public long getBaseCount() {
- return Interval.countBases(this.intervals);
- }
-
- /** Gets the count of unique bases represented by the intervals in the list. */
- public long getUniqueBaseCount() {
- return uniqued().getBaseCount();
- }
-
- /** Returns the count of intervals in the list. */
- public int size() {
- return this.intervals.size();
- }
-
- /** creates a independent copy of the given IntervalList
- *
- * @param list
- * @return
- */
- public static IntervalList copyOf(final IntervalList list){
- final IntervalList clone = new IntervalList(list.header.clone());
- clone.intervals.addAll(list.intervals);
- return clone;
- }
-
- /**
- * Parses an interval list from a file.
- * @param file the file containing the intervals
- * @return an IntervalList object that contains the headers and intervals from the file
- */
- public static IntervalList fromFile(final File file) {
- final BufferedReader reader= IOUtil.openFileForBufferedReading(file);
- final IntervalList list = fromReader(reader);
- try {
- reader.close();
- } catch (final IOException e) {
- throw new SAMException(String.format("Failed to close file %s after reading",file));
- }
-
- return list;
- }
-
- /**
- * Creates an IntervalList from the given sequence name
- * @param header header to use to create IntervalList
- * @param sequenceName name of sequence in header
- * @return a new intervalList with given header that contains the reference name
- */
- public static IntervalList fromName(final SAMFileHeader header, final String sequenceName) {
- final IntervalList ref = new IntervalList(header);
- ref.add(new Interval(sequenceName, 1, header.getSequence(sequenceName).getSequenceLength()));
-
- return ref;
- }
-
- /**
- * Calls {@link #fromFile(java.io.File)} on the provided files, and returns their {@link #union(java.util.Collection)}.
- */
- public static IntervalList fromFiles(final Collection<File> intervalListFiles) {
- final Collection<IntervalList> intervalLists = new ArrayList<IntervalList>();
- for (final File file : intervalListFiles) {
- intervalLists.add(IntervalList.fromFile(file));
- }
- return IntervalList.union(intervalLists);
- }
-
- /**
- * Parses an interval list from a reader in a stream based fashion.
- * @param in a BufferedReader that can be read from
- * @return an IntervalList object that contains the headers and intervals from the file
- */
- public static IntervalList fromReader(final BufferedReader in) {
- try {
- // Setup a reader and parse the header
- final StringBuilder builder = new StringBuilder(4096);
- String line = null;
-
- while ((line = in.readLine()) != null) {
- if (line.startsWith("@")) {
- builder.append(line).append('\n');
- }
- else {
- break;
- }
- }
-
- if (builder.length() == 0) {
- throw new IllegalStateException("Interval list file must contain header. ");
- }
-
- final StringLineReader headerReader = new StringLineReader(builder.toString());
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- final IntervalList list = new IntervalList(codec.decode(headerReader, "BufferedReader"));
- final SAMSequenceDictionary dict = list.getHeader().getSequenceDictionary();
-
- //there might not be any lines after the header, in which case we should return an empty list
- if(line == null) return list;
-
- // Then read in the intervals
- final FormatUtil format = new FormatUtil();
- do {
- if (line.trim().isEmpty()) continue; // skip over blank lines
-
- // Make sure we have the right number of fields
- final String[] fields = line.split("\t");
- if (fields.length != 5) {
- throw new SAMException("Invalid interval record contains " +
- fields.length + " fields: " + line);
- }
-
- // Then parse them out
- final String seq = fields[0];
- final int start = format.parseInt(fields[1]);
- final int end = format.parseInt(fields[2]);
-
- final boolean negative;
- if (fields[3].equals("-")) negative = true;
- else if (fields[3].equals("+")) negative = false;
- else throw new IllegalArgumentException("Invalid strand field: " + fields[3]);
-
- final String name = fields[4];
-
- final Interval interval = new Interval(seq, start, end, negative, name);
- if (dict.getSequence(seq) == null) {
- log.warn("Ignoring interval for unknown reference: " + interval);
- }
- else {
- list.intervals.add(interval);
- }
- }
- while ((line = in.readLine()) != null);
-
- return list;
- }
- catch (final IOException ioe) {
- throw new SAMException("Error parsing interval list.", ioe);
- }
- finally {
- try { in.close(); } catch (final Exception e) { /* do nothing */ }
- }
- }
-
- /**
- * Writes out the list of intervals to the supplied file.
- * @param file a file to write to. If exists it will be overwritten.
- */
- public void write(final File file) {
- try {
- final BufferedWriter out = IOUtil.openFileForBufferedWriting(file);
- final FormatUtil format = new FormatUtil();
-
- // Write out the header
- if (this.header != null) {
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- codec.encode(out, this.header);
- }
-
- // Write out the intervals
- for (final Interval interval : this) {
- out.write(interval.getContig());
- out.write('\t');
- out.write(format.format(interval.getStart()));
- out.write('\t');
- out.write(format.format(interval.getEnd()));
- out.write('\t');
- out.write(interval.isPositiveStrand() ? '+' : '-');
- out.write('\t');
- if(interval.getName() != null){
- out.write(interval.getName());
- }
- else{
- out.write(".");
- }
- out.newLine();
- }
-
- out.flush();
- out.close();
- }
- catch (final IOException ioe) {
- throw new SAMException("Error writing out interval list to file: " + file.getAbsolutePath(), ioe);
- }
- }
-
- /**
- * A utility function for generating the intersection of two IntervalLists, checks for equal dictionaries.
- *
- * @param list1 the first IntervalList
- * @param list2 the second IntervalList
- * @return the intersection of list1 and list2.
- */
-
- public static IntervalList intersection(final IntervalList list1, final IntervalList list2) {
-
- final IntervalList result;
- // Ensure that all the sequence dictionaries agree and merge the lists
- SequenceUtil.assertSequenceDictionariesEqual(list1.getHeader().getSequenceDictionary(),
- list2.getHeader().getSequenceDictionary());
-
- result = new IntervalList(list1.getHeader().clone());
-
- final OverlapDetector<Interval> detector = new OverlapDetector<Interval>(0, 0);
-
- detector.addAll(list1.getIntervals(), list1.getIntervals());
-
- for (final Interval i : list2.getIntervals()) {
- final Collection<Interval> as = detector.getOverlaps(i);
- for (final Interval j : as) {
- final Interval tmp = i.intersect(j);
-
- result.add(tmp);
- }
- }
- return result.uniqued();
-
- }
-
- /**
- * A utility function for intersecting a list of IntervalLists, checks for equal dictionaries.
- *
- * @param lists the list of IntervalList
- * @return the intersection of all the IntervalLists in lists.
- */
-
-
- public static IntervalList intersection(final Collection<IntervalList> lists) {
-
- IntervalList intersection = null;
- for (final IntervalList list : lists) {
- if(intersection == null){
- intersection = list;
- }
- else{
- intersection = intersection(intersection, list);
- }
- }
- return intersection;
- }
-
- /**
- * A utility function for merging a list of IntervalLists, checks for equal dictionaries.
- * Merging does not look for overlapping intervals nor uniquify
- *
- * @param lists a list of IntervalList
- * @return the union of all the IntervalLists in lists.
- */
- public static IntervalList concatenate(final Collection<IntervalList> lists) {
- if(lists.isEmpty()){
- throw new SAMException("Cannot concatenate an empty list of IntervalLists.");
- }
-
- // Ensure that all the sequence dictionaries agree and merge the lists
- final SAMFileHeader header = lists.iterator().next().getHeader().clone();
- header.setSortOrder(SAMFileHeader.SortOrder.unsorted);
-
- final IntervalList merged = new IntervalList(header);
-
- for (final IntervalList in : lists) {
- SequenceUtil.assertSequenceDictionariesEqual(merged.getHeader().getSequenceDictionary(),
- in.getHeader().getSequenceDictionary());
-
- merged.addall(in.intervals);
- }
-
- return merged;
- }
-
- /**
- * A utility function for finding the union of a list of IntervalLists, checks for equal dictionaries.
- * also looks for overlapping intervals, uniquifies, and sorts (by coordinate)
- *
- * @param lists the list of IntervalList
- * @return the union of all the IntervalLists in lists.
- */
- public static IntervalList union(final Collection<IntervalList> lists) {
- final IntervalList merged = concatenate(lists);
- return merged.uniqued();
- }
-
- public static IntervalList union(final IntervalList list1, final IntervalList list2) {
- final Collection<IntervalList> duo = CollectionUtil.makeList(list1, list2);
- return IntervalList.union(duo);
- }
-
- /** inverts an IntervalList and returns one that has exactly all the bases in the dictionary that the original one does not.
- *
- * @param list an IntervalList
- * @return an IntervalList that is complementary to list
- */
- public static IntervalList invert(final IntervalList list) {
- final IntervalList inverse = new IntervalList(list.header.clone());
-
- final ListMap<Integer,Interval> map = new ListMap<Integer,Interval>();
-
- //add all the intervals (uniqued and therefore also sorted) to a ListMap from sequenceIndex to a list of Intervals
- for(final Interval i : list.uniqued().getIntervals()){
- map.add(list.getHeader().getSequenceIndex(i.getContig()),i);
- }
-
- // a counter to supply newly-created intervals with a name
- int intervals = 0;
-
- //iterate over the contigs in the dictionary
- for (final SAMSequenceRecord samSequenceRecord : list.getHeader().getSequenceDictionary().getSequences()) {
- final Integer sequenceIndex = samSequenceRecord.getSequenceIndex();
- final String sequenceName = samSequenceRecord.getSequenceName();
- final int sequenceLength = samSequenceRecord.getSequenceLength();
-
- Integer lastCoveredPosition = 0; //start at beginning of sequence
- //iterate over list of intervals that are in sequence
- if (map.containsKey(sequenceIndex)) // if there are intervals in the ListMap on this contig, iterate over them (in order)
- for (final Interval i : map.get(sequenceIndex)) {
- if (i.getStart() > lastCoveredPosition + 1) //if there's space between the last interval and the current one, add an interval between them
- inverse.add(new Interval(sequenceName, lastCoveredPosition + 1, i.getStart() - 1, false, "interval-" + (++intervals)));
- lastCoveredPosition = i.getEnd(); //update the last covered position
- }
- //finally, if there's room between the last covered position and the end of the sequence, add an interval
- if (sequenceLength > lastCoveredPosition) //if there's space between the last interval and the next
- // one, add an interval. This also covers the case that there are no intervals in the ListMap for a contig.
- inverse.add(new Interval(sequenceName, lastCoveredPosition + 1, sequenceLength, false, "interval-" + (++intervals)));
- }
-
- return inverse;
- }
-
- /**
- * A utility function for subtracting a collection of IntervalLists from another. Resulting loci are those that are in the first collection
- * but not the second.
- *
- * @param lhs the collection of IntervalList from which to subtract intervals
- * @param rhs the collection of intervals to subtract
- * @return an IntervalList comprising all loci that are in the first collection but not the second lhs-rhs=answer.
- */
- public static IntervalList subtract(final Collection<IntervalList> lhs, final Collection<IntervalList> rhs) {
- return intersection(
- union(lhs),
- invert(union(rhs)));
- }
-
- /**
- * A utility function for subtracting a single IntervalList from another. Resulting loci are those that are in the first List
- * but not the second.
- *
- * @param lhs the IntervalList from which to subtract intervals
- * @param rhs the IntervalList to subtract
- * @return an IntervalList comprising all loci that are in first IntervalList but not the second. lhs-rhs=answer
- */
- public static IntervalList subtract(final IntervalList lhs, final IntervalList rhs) {
- return subtract(Collections.singletonList(lhs),
- Collections.singletonList(rhs));
- }
-
- /**
- * A utility function for finding the difference between two IntervalLists.
- *
- * @param lists1 the first collection of IntervalLists
- * @param lists2 the second collection of IntervalLists
- * @return the difference between the two intervals, i.e. the loci that are only in one IntervalList but not both
- */
- public static IntervalList difference(final Collection<IntervalList> lists1, final Collection<IntervalList> lists2) {
- return union(
- subtract(lists1, lists2),
- subtract(lists2, lists1));
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final IntervalList intervals1 = (IntervalList) o;
-
- return header.equals(intervals1.header) && intervals.equals(intervals1.intervals);
- }
-
- @Override
- public int hashCode() {
- int result = header.hashCode();
- result = 31 * result + intervals.hashCode();
- return result;
- }
-}
-
-/**
- * Comparator that orders intervals based on their sequence index, by coordinate
- * then by strand and finally by name.
- */
-class IntervalCoordinateComparator implements Comparator<Interval>, Serializable {
- private static final long serialVersionUID = 1L;
-
- private final SAMFileHeader header;
-
- /** Constructs a comparator using the supplied sequence header. */
- IntervalCoordinateComparator(final SAMFileHeader header) {
- this.header = header;
- }
-
- public int compare(final Interval lhs, final Interval rhs) {
- final int lhsIndex = this.header.getSequenceIndex(lhs.getContig());
- final int rhsIndex = this.header.getSequenceIndex(rhs.getContig());
- int retval = lhsIndex - rhsIndex;
-
- if (retval == 0) retval = lhs.getStart() - rhs.getStart();
- if (retval == 0) retval = lhs.getEnd() - rhs.getEnd();
- if (retval == 0) {
- if (lhs.isPositiveStrand() && rhs.isNegativeStrand()) retval = -1;
- else if (lhs.isNegativeStrand() && rhs.isPositiveStrand()) retval = 1;
- }
- if (retval == 0) {
- if (lhs.getName() == null) {
- if (rhs.getName() == null) return 0;
- else return -1;
- } else if (rhs.getName() == null) {
- return 1;
- }
- else {
- return lhs.getName().compareTo(rhs.getName());
- }
- }
-
- return retval;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java
deleted file mode 100644
index 1ddd164..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalListReferenceSequenceMask.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-
-import java.util.BitSet;
-import java.util.List;
-
-/**
- * Serve up loci of interest based on an interval list.
- *
- * @author alecw at broadinstitute dot oh are gee
- */
-public class IntervalListReferenceSequenceMask implements ReferenceSequenceMask {
-
- private final SAMFileHeader header;
- // if memory usage becomes a problem... this could be changed to a SparseBitSet
- // http://java.sun.com/developer/onlineTraining/collections/magercises/BitSet/index.html
- private final BitSet currentBitSet = new BitSet();
- private int currentSequenceIndex = -1;
- private final PeekableIterator<Interval> intervalIterator;
- private final int lastSequenceIndex;
- private final int lastPosition;
-
- public IntervalListReferenceSequenceMask(final IntervalList intervalList) {
- this.header = intervalList.getHeader();
- if (intervalList.getHeader().getSortOrder() != SAMFileHeader.SortOrder.coordinate) {
- intervalList.sorted();
- }
- final List<Interval> uniqueIntervals = intervalList.uniqued().getIntervals();
- if (uniqueIntervals.isEmpty()) {
- lastSequenceIndex = -1;
- lastPosition = 0;
- } else {
- final Interval lastInterval = uniqueIntervals.get(uniqueIntervals.size() - 1);
- lastSequenceIndex = header.getSequenceIndex((lastInterval.getContig()));
- lastPosition = lastInterval.getEnd();
- }
- intervalIterator = new PeekableIterator<Interval>(uniqueIntervals.iterator());
- }
-
- /**
- * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
- *
- * @return true if the mask is set for the given sequence and position
- */
- public boolean get(final int sequenceIndex, final int position) {
- ensureSequenceLoaded(sequenceIndex);
- return currentBitSet.get(position);
- }
-
- /**
- * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
- *
- * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
- */
- public int nextPosition(final int sequenceIndex, final int position) {
- ensureSequenceLoaded(sequenceIndex);
- // nextSetBit returns the first set bit on or after the starting index, therefore position+1
- return currentBitSet.nextSetBit(position + 1);
- }
-
- private void ensureSequenceLoaded(final int sequenceIndex) {
- if (sequenceIndex < this.currentSequenceIndex) {
- throw new IllegalArgumentException("Cannot look at an earlier sequence. Current: " +
- this.currentSequenceIndex + "; requested: " + sequenceIndex);
- }
- if (sequenceIndex > currentSequenceIndex) {
- currentBitSet.clear();
- while (intervalIterator.hasNext()) {
- final Interval interval = intervalIterator.peek();
- final int nextSequenceIndex = header.getSequenceIndex(interval.getContig());
- if (nextSequenceIndex < sequenceIndex) {
- intervalIterator.next();
- } else if (nextSequenceIndex == sequenceIndex) {
- currentBitSet.set(interval.getStart(), interval.getEnd() + 1);
- intervalIterator.next();
- } else {
- break;
- }
- }
- currentSequenceIndex = sequenceIndex;
- }
- }
-
- /**
- * @return Largest sequence index for which there are set bits.
- */
- public int getMaxSequenceIndex() {
- return lastSequenceIndex;
- }
-
- /**
- * @return the largest position on the last sequence index
- */
- public int getMaxPosition() {
- return lastPosition;
- }
-
- public SAMFileHeader getHeader() {
- return header;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalTree.java b/src/main/java/htsjdk/samtools/util/IntervalTree.java
deleted file mode 100644
index 49c3017..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalTree.java
+++ /dev/null
@@ -1,1227 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * A Red-Black tree with intervals for keys.
- * Not thread-safe, and cannot be made so.
- *
- * 7/24/2008: This was copied from the tedUtils package.
- * IMPORTANT!!! It has been modified to use the Reseq way of
- * handling coordinates (end-inclusive).
- *
- * @author tsharpe
- */
-public class IntervalTree<V> implements Iterable<IntervalTree.Node<V>>
-{
- /**
- * Return the number of intervals in the tree.
- * @return The number of intervals.
- */
- public int size()
- {
- return mRoot == null ? 0 : mRoot.getSize();
- }
-
- /**
- * Remove all entries.
- */
- public void clear()
- {
- mRoot = null;
- }
-
- /**
- * Put a new interval into the tree (or update the value associated with an existing interval).
- * If the interval is novel, the special sentinel value is returned.
- * @param start The interval's start.
- * @param end The interval's end.
- * @param value The associated value.
- * @return The old value associated with that interval, or the sentinel.
- */
- @SuppressWarnings("null")
- public V put( final int start, final int end, final V value )
- {
- if ( start > end )
- throw new IllegalArgumentException("Start cannot exceed end.");
-
- V result = mSentinel;
-
- if ( mRoot == null )
- {
- mRoot = new Node<V>(start,end,value);
- }
- else
- {
- Node<V> parent = null;
- Node<V> node = mRoot;
- int cmpVal = 0;
-
- while ( node != null )
- {
- parent = node; // last non-null node
- cmpVal = node.compare(start,end);
- if ( cmpVal == 0 )
- {
- break;
- }
-
- node = cmpVal < 0 ? node.getLeft() : node.getRight();
- }
-
- if ( cmpVal == 0 )
- {
- result = parent.setValue(value);
- }
- else
- {
- if ( cmpVal < 0 )
- {
- mRoot = parent.insertLeft(start,end,value,mRoot);
- }
- else
- {
- mRoot = parent.insertRight(start,end,value,mRoot);
- }
- }
- }
-
- return result;
- }
-
- /**
- * Remove an interval from the tree. If the interval does not exist in the tree the
- * special sentinel value is returned.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The value associated with that interval, or the sentinel.
- */
- public V remove( final int start, final int end )
- {
- V result = mSentinel;
- Node<V> node = mRoot;
-
- while ( node != null )
- {
- final int cmpVal = node.compare(start,end);
- if ( cmpVal == 0 )
- {
- result = node.getValue();
- mRoot = node.remove(mRoot);
- break;
- }
-
- node = cmpVal < 0 ? node.getLeft() : node.getRight();
- }
-
- return result;
- }
-
- /**
- * Find an interval.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The Node that represents that interval, or null.
- */
- public Node<V> find( final int start, final int end )
- {
- Node<V> node = mRoot;
-
- while ( node != null )
- {
- final int cmpVal = node.compare(start,end);
- if ( cmpVal == 0 )
- {
- break;
- }
-
- node = cmpVal < 0 ? node.getLeft() : node.getRight();
- }
-
- return node;
- }
-
- /**
- * Find the nth interval in the tree.
- * @param idx The rank of the interval sought (from 0 to size()-1).
- * @return The Node that represents the nth interval.
- */
- public Node<V> findByIndex( final int idx )
- {
- return Node.findByRank(mRoot,idx+1);
- }
-
- /**
- * Find the rank of the specified interval. If the specified interval is not in the
- * tree, then -1 is returned.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The rank of that interval, or -1.
- */
- public int getIndex( final int start, final int end )
- {
- return Node.getRank(mRoot,start,end) - 1;
- }
-
- /**
- * Find the least interval in the tree.
- * @return The earliest interval, or null if the tree is empty.
- */
- public Node<V> min()
- {
- Node<V> result = null;
- Node<V> node = mRoot;
-
- while ( node != null )
- {
- result = node;
- node = node.getLeft();
- }
-
- return result;
- }
-
- /**
- * Find the earliest interval in the tree greater than or equal to the specified interval.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The earliest >= interval, or null if there is none.
- */
- @SuppressWarnings("null")
- public Node<V> min( final int start, final int end )
- {
- Node<V> result = null;
- Node<V> node = mRoot;
- int cmpVal = 0;
-
- while ( node != null )
- {
- result = node;
- cmpVal = node.compare(start,end);
- if ( cmpVal == 0 )
- {
- break;
- }
-
- node = cmpVal < 0 ? node.getLeft() : node.getRight();
- }
-
- if ( cmpVal > 0 )
- {
- result = result.getNext();
- }
-
- return result;
- }
-
- /**
- * Find the earliest interval in the tree that overlaps the specified interval.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The earliest overlapping interval, or null if there is none.
- */
- public Node<V> minOverlapper( final int start, final int end )
- {
- Node<V> result = null;
- Node<V> node = mRoot;
-
- if ( node != null && node.getMaxEnd() >= start )
- {
- while ( true )
- {
- if ( node.getStart() <= end && start <= node.getEnd() )
- { // this node overlaps. there might be a lesser overlapper down the left sub-tree.
- // no need to consider the right sub-tree: even if there's an overlapper, if won't be minimal
- result = node;
- node = node.getLeft();
- if ( node == null || node.getMaxEnd() < start )
- break; // no left sub-tree or all nodes end too early
- }
- else
- { // no overlap. if there might be a left sub-tree overlapper, consider the left sub-tree.
- final Node<V> left = node.getLeft();
- if ( left != null && left.getMaxEnd() >= start )
- {
- node = left;
- }
- else
- { // left sub-tree cannot contain an overlapper. consider the right sub-tree.
- if ( node.getStart() > end )
- break; // everything in the right sub-tree is past the end of the query interval
-
- node = node.getRight();
- if ( node == null || node.getMaxEnd() < start )
- break; // no right sub-tree or all nodes end too early
- }
- }
- }
- }
-
- return result;
- }
-
- /**
- * Find the greatest interval in the tree.
- * @return The latest interval, or null if the tree is empty.
- */
- public Node<V> max()
- {
- Node<V> result = null;
- Node<V> node = mRoot;
-
- while ( node != null )
- {
- result = node;
- node = node.getRight();
- }
-
- return result;
- }
-
- /**
- * Find the latest interval in the tree less than or equal to the specified interval.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return The latest >= interval, or null if there is none.
- */
- @SuppressWarnings("null")
- public Node<V> max( final int start, final int end )
- {
- Node<V> result = null;
- Node<V> node = mRoot;
- int cmpVal = 0;
-
- while ( node != null )
- {
- result = node;
- cmpVal = node.compare(start,end);
- if ( cmpVal == 0 )
- {
- break;
- }
-
- node = cmpVal < 0 ? node.getLeft() : node.getRight();
- }
-
- if ( cmpVal < 0 )
- {
- result = result.getPrev();
- }
-
- return result;
- }
-
- /**
- * Return an iterator over the entire tree.
- * @return An iterator.
- */
- public Iterator<Node<V>> iterator()
- {
- return new FwdIterator(min());
- }
-
- /**
- * Return an iterator over all intervals greater than or equal to the specified interval.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return An iterator.
- */
- public Iterator<Node<V>> iterator( final int start, final int end )
- {
- return new FwdIterator(min(start,end));
- }
-
- /**
- * Return an iterator over all intervals overlapping the specified range.
- * @param start The range start.
- * @param end The range end.
- * @return An iterator.
- */
- public Iterator<Node<V>> overlappers( final int start, final int end )
- {
- return new OverlapIterator(start,end);
- }
-
- /**
- * Return an iterator over the entire tree that returns intervals in reverse order.
- * @return An iterator.
- */
- public Iterator<Node<V>> reverseIterator()
- {
- return new RevIterator(max());
- }
-
- /**
- * Return an iterator over all intervals less than or equal to the specified interval, in reverse order.
- * @param start The interval's start.
- * @param end The interval's end.
- * @return An iterator.
- */
- public Iterator<Node<V>> reverseIterator( final int start, final int end )
- {
- return new RevIterator(max(start,end));
- }
-
- /**
- * Get the special sentinel value that will be used to signal novelty when putting a new interval
- * into the tree, or to signal "not found" when removing an interval. This is null by default.
- * @return The sentinel value.
- */
- public V getSentinel()
- {
- return mSentinel;
- }
-
- /**
- * Set the special sentinel value that will be used to signal novelty when putting a new interval
- * into the tree, or to signal "not found" when removing an interval.
- * @param sentinel The new sentinel value.
- * @return The old sentinel value.
- */
- public V setSentinel( final V sentinel )
- {
- final V result = mSentinel;
- mSentinel = sentinel;
- return result;
- }
-
- /**
- * This method is only for debugging.
- * It verifies whether the tree is internally consistent with respect to the mMaxEnd cached on each node.
- * @throws IllegalStateException If an inconsistency is detected.
- */
- public void checkMaxEnds() {
- if (mRoot != null) mRoot.checkMaxEnd();
- }
-
- /**
- * This method draws a nested picture of the tree on System.out.
- * Useful for debugging.
- */
- public void printTree() {
- if (mRoot != null) mRoot.printNode();
- }
-
- void removeNode( final Node<V> node )
- {
- mRoot = node.remove(mRoot);
- }
-
- private Node<V> mRoot;
- private V mSentinel;
-
- public static class Node<V1>
- {
- // bit-wise definitions from which the other constants are composed
- public static final int HAS_LESSER_PART = 1;
- public static final int HAS_OVERLAPPING_PART = 2;
- public static final int HAS_GREATER_PART = 4;
- public static final int IS_ADJACENT_AND_EMPTY = 0;
- public static final int IS_STRICTLY_LESS = HAS_LESSER_PART; // 1
- public static final int IS_SUBSET = HAS_OVERLAPPING_PART; // 2
- public static final int IS_LEFT_OVERHANGING_OVERLAPPER = HAS_LESSER_PART | HAS_OVERLAPPING_PART; // 3
- public static final int IS_STRICTLY_GREATER = HAS_GREATER_PART; // 4
- // there is no value that equals 5, since that would imply overhanging on left and right without overlapping
- public static final int IS_RIGHT_OVERHANGING_OVERLAPPER = HAS_GREATER_PART | HAS_OVERLAPPING_PART; // 6
- public static final int IS_SUPERSET = HAS_LESSER_PART | HAS_OVERLAPPING_PART | HAS_GREATER_PART; // 7
-
- Node( final int start, final int end, final V1 value )
- {
- mStart = start;
- mEnd = end;
- mValue = value;
- mSize = 1;
- mMaxEnd = mEnd;
- mIsBlack = true;
- }
-
- Node( final Node<V1> parent, final int start, final int end, final V1 value )
- {
- mParent = parent;
- mStart = start;
- mEnd = end;
- mValue = value;
- mMaxEnd = mEnd;
- mSize = 1;
- }
-
- public int getStart()
- {
- return mStart;
- }
-
- public int getEnd()
- {
- return mEnd;
- }
-
- public int getLength()
- {
- return mEnd - mStart;
- }
-
- public int getRelationship( final Node<V1> interval )
- {
- int result = 0;
- if ( mStart < interval.getStart() )
- result = HAS_LESSER_PART;
- if ( mEnd > interval.getEnd() )
- result |= HAS_GREATER_PART;
- if ( mStart < interval.getEnd() && interval.getStart() < mEnd )
- result |= HAS_OVERLAPPING_PART;
- return result;
- }
-
- public boolean isAdjacent( final Node<V1> interval )
- {
- return mStart == interval.getEnd() || mEnd == interval.getStart();
- }
-
- public V1 getValue()
- {
- return mValue;
- }
-
- public V1 setValue( final V1 value )
- {
- final V1 result = mValue;
- mValue = value;
- return result;
- }
-
- int getSize()
- {
- return mSize;
- }
-
- int getMaxEnd()
- {
- return mMaxEnd;
- }
-
- Node<V1> getLeft()
- {
- return mLeft;
- }
-
- Node<V1> insertLeft( final int start, final int end, final V1 value, final Node<V1> root )
- {
- mLeft = new Node<V1>(this,start,end,value);
- return insertFixup(mLeft,root);
- }
-
- Node<V1> getRight()
- {
- return mRight;
- }
-
- Node<V1> insertRight( final int start, final int end, final V1 value, final Node<V1> root )
- {
- mRight = new Node<V1>(this,start,end,value);
- return insertFixup(mRight,root);
- }
-
- Node<V1> getNext()
- {
- Node<V1> result;
-
- if ( mRight != null )
- {
- result = mRight;
- while ( result.mLeft != null )
- {
- result = result.mLeft;
- }
- }
- else
- {
- Node<V1> node = this;
- result = mParent;
- while ( result != null && node == result.mRight )
- {
- node = result;
- result = result.mParent;
- }
- }
-
- return result;
- }
-
- Node<V1> getPrev()
- {
- Node<V1> result;
-
- if ( mLeft != null )
- {
- result = mLeft;
- while ( result.mRight != null )
- {
- result = result.mRight;
- }
- }
- else
- {
- Node<V1> node = this;
- result = mParent;
- while ( result != null && node == result.mLeft )
- {
- node = result;
- result = result.mParent;
- }
- }
-
- return result;
- }
-
- boolean wasRemoved()
- {
- return mSize == 0;
- }
-
- Node<V1> remove( Node<V1> root )
- {
- if ( mSize == 0 )
- {
- throw new IllegalStateException("Entry was already removed.");
- }
-
- if ( mLeft == null )
- {
- if ( mRight == null )
- { // no children
- if ( mParent == null )
- {
- root = null;
- }
- else if ( mParent.mLeft == this )
- {
- mParent.mLeft = null;
- fixup(mParent);
-
- if ( mIsBlack )
- root = removeFixup(mParent,null,root);
- }
- else
- {
- mParent.mRight = null;
- fixup(mParent);
-
- if ( mIsBlack )
- root = removeFixup(mParent,null,root);
- }
- }
- else
- { // single child on right
- root = spliceOut(mRight,root);
- }
- }
- else if ( mRight == null )
- { // single child on left
- root = spliceOut(mLeft,root);
- }
- else
- { // two children
- final Node<V1> next = getNext();
- root = next.remove(root);
-
- // put next into tree in same position as this, effectively removing this
- if ( (next.mParent = mParent) == null )
- root = next;
- else if ( mParent.mLeft == this )
- mParent.mLeft = next;
- else
- mParent.mRight = next;
-
- if ( (next.mLeft = mLeft) != null )
- {
- mLeft.mParent = next;
- }
-
- if ( (next.mRight = mRight) != null )
- {
- mRight.mParent = next;
- }
-
- next.mIsBlack = mIsBlack;
- next.mSize = mSize;
-
- // PIC-123 fix
- fixup(next);
- }
-
- mSize = 0;
- return root;
- }
-
- // backwards comparison! compares start+end to this.
- int compare( final int start, final int end )
- {
- int result = 0;
-
- if ( start > mStart )
- result = 1;
- else if ( start < mStart )
- result = -1;
- else if ( end > mEnd )
- result = 1;
- else if ( end < mEnd )
- result = -1;
-
- return result;
- }
-
- @SuppressWarnings("null")
- static <V1> Node<V1> getNextOverlapper( Node<V1> node, final int start, final int end )
- {
- do
- {
- Node<V1> nextNode = node.mRight;
- if ( nextNode != null && nextNode.mMaxEnd >= start )
- {
- node = nextNode;
- while ( (nextNode = node.mLeft) != null && nextNode.mMaxEnd >= start )
- node = nextNode;
- }
- else
- {
- nextNode = node;
- while ( (node = nextNode.mParent) != null && node.mRight == nextNode )
- nextNode = node;
- }
-
- if ( node != null && node.mStart > end )
- node = null;
- }
- while ( node != null && !(node.mStart <= end && start <= node.mEnd) );
-
- return node;
- }
-
- static <V1> Node<V1> findByRank( Node<V1> node, int rank )
- {
- while ( node != null )
- {
- final int nodeRank = node.getRank();
- if ( rank == nodeRank )
- break;
-
- if ( rank < nodeRank )
- {
- node = node.mLeft;
- }
- else
- {
- node = node.mRight;
- rank -= nodeRank;
- }
- }
-
- return node;
- }
-
- static <V1> int getRank( Node<V1> node, final int start, final int end )
- {
- int rank = 0;
-
- while ( node != null )
- {
- final int cmpVal = node.compare(start,end);
- if ( cmpVal < 0 )
- {
- node = node.mLeft;
- }
- else
- {
- rank += node.getRank();
- if ( cmpVal == 0 )
- return rank; // EARLY RETURN!!!
-
- node = node.mRight;
- }
- }
-
- return 0;
- }
-
- private int getRank()
- {
- int result = 1;
- if ( mLeft != null )
- result = mLeft.mSize + 1;
- return result;
- }
-
- private Node<V1> spliceOut( final Node<V1> child, Node<V1> root )
- {
- if ( (child.mParent = mParent) == null )
- {
- root = child;
- child.mIsBlack = true;
- }
- else
- {
- if ( mParent.mLeft == this )
- mParent.mLeft = child;
- else
- mParent.mRight = child;
- fixup(mParent);
-
- if ( mIsBlack )
- root = removeFixup(mParent,child,root);
- }
-
- return root;
- }
-
- private Node<V1> rotateLeft( Node<V1> root )
- {
- final Node<V1> child = mRight;
-
- final int childSize = child.mSize;
- child.mSize = mSize;
- mSize -= childSize;
-
- if ( (mRight = child.mLeft) != null )
- {
- mRight.mParent = this;
- mSize += mRight.mSize;
- }
-
- if ( (child.mParent = mParent) == null )
- root = child;
- else if ( this == mParent.mLeft )
- mParent.mLeft = child;
- else
- mParent.mRight = child;
-
- child.mLeft = this;
- mParent = child;
-
- setMaxEnd();
- child.setMaxEnd();
-
- return root;
- }
-
- private Node<V1> rotateRight( Node<V1> root )
- {
- final Node<V1> child = mLeft;
-
- final int childSize = child.mSize;
- child.mSize = mSize;
- mSize -= childSize;
-
- if ( (mLeft = child.mRight) != null )
- {
- mLeft.mParent = this;
- mSize += mLeft.mSize;
- }
-
- if ( (child.mParent = mParent) == null )
- root = child;
- else if ( this == mParent.mLeft )
- mParent.mLeft = child;
- else
- mParent.mRight = child;
-
- child.mRight = this;
- mParent = child;
-
- setMaxEnd();
- child.setMaxEnd();
-
- return root;
- }
-
- private void setMaxEnd()
- {
- mMaxEnd = mEnd;
- if ( mLeft != null )
- mMaxEnd = Math.max(mMaxEnd,mLeft.mMaxEnd);
- if ( mRight != null )
- mMaxEnd = Math.max(mMaxEnd,mRight.mMaxEnd);
- }
-
- private static <V1> void fixup( Node<V1> node )
- {
- do
- {
- node.mSize = 1;
- node.mMaxEnd = node.mEnd;
- if ( node.mLeft != null )
- {
- node.mSize += node.mLeft.mSize;
- node.mMaxEnd = Math.max(node.mMaxEnd,node.mLeft.mMaxEnd);
- }
- if ( node.mRight != null )
- {
- node.mSize += node.mRight.mSize;
- node.mMaxEnd = Math.max(node.mMaxEnd,node.mRight.mMaxEnd);
- }
- }
- while ( (node = node.mParent) != null );
- }
-
- private static <V1> Node<V1> insertFixup( Node<V1> daughter, Node<V1> root )
- {
- Node<V1> mom = daughter.mParent;
- fixup(mom);
-
- while( mom != null && !mom.mIsBlack )
- {
- final Node<V1> gramma = mom.mParent;
- Node<V1> auntie = gramma.mLeft;
- if ( auntie == mom )
- {
- auntie = gramma.mRight;
- if ( auntie != null && !auntie.mIsBlack )
- {
- mom.mIsBlack = true;
- auntie.mIsBlack = true;
- gramma.mIsBlack = false;
- daughter = gramma;
- }
- else
- {
- if ( daughter == mom.mRight )
- {
- root = mom.rotateLeft(root);
- mom = daughter;
- }
- mom.mIsBlack = true;
- gramma.mIsBlack = false;
- root = gramma.rotateRight(root);
- break;
- }
- }
- else
- {
- if ( auntie != null && !auntie.mIsBlack )
- {
- mom.mIsBlack = true;
- auntie.mIsBlack = true;
- gramma.mIsBlack = false;
- daughter = gramma;
- }
- else
- {
- if ( daughter == mom.mLeft )
- {
- root = mom.rotateRight(root);
- mom = daughter;
- }
- mom.mIsBlack = true;
- gramma.mIsBlack = false;
- root = gramma.rotateLeft(root);
- break;
- }
- }
- mom = daughter.mParent;
- }
- root.mIsBlack = true;
- return root;
- }
-
- private static <V1> Node<V1> removeFixup( Node<V1> parent, Node<V1> node, Node<V1> root )
- {
- do
- {
- if ( node == parent.mLeft )
- {
- Node<V1> sister = parent.mRight;
- if ( !sister.mIsBlack )
- {
- sister.mIsBlack = true;
- parent.mIsBlack = false;
- root = parent.rotateLeft(root);
- sister = parent.mRight;
- }
- if ( (sister.mLeft == null || sister.mLeft.mIsBlack) && (sister.mRight == null || sister.mRight.mIsBlack) )
- {
- sister.mIsBlack = false;
- node = parent;
- }
- else
- {
- if ( sister.mRight == null || sister.mRight.mIsBlack )
- {
- sister.mLeft.mIsBlack = true;
- sister.mIsBlack = false;
- root = sister.rotateRight(root);
- sister = parent.mRight;
- }
- sister.mIsBlack = parent.mIsBlack;
- parent.mIsBlack = true;
- sister.mRight.mIsBlack = true;
- root = parent.rotateLeft(root);
- node = root;
- }
- }
- else
- {
- Node<V1> sister = parent.mLeft;
- if ( !sister.mIsBlack )
- {
- sister.mIsBlack = true;
- parent.mIsBlack = false;
- root = parent.rotateRight(root);
- sister = parent.mLeft;
- }
- if ( (sister.mLeft == null || sister.mLeft.mIsBlack) && (sister.mRight == null || sister.mRight.mIsBlack) )
- {
- sister.mIsBlack = false;
- node = parent;
- }
- else
- {
- if ( sister.mLeft == null || sister.mLeft.mIsBlack )
- {
- sister.mRight.mIsBlack = true;
- sister.mIsBlack = false;
- root = sister.rotateLeft(root);
- sister = parent.mLeft;
- }
- sister.mIsBlack = parent.mIsBlack;
- parent.mIsBlack = true;
- sister.mLeft.mIsBlack = true;
- root = parent.rotateRight(root);
- node = root;
- }
- }
- parent = node.mParent;
- }
- while ( parent != null && node.mIsBlack );
-
- node.mIsBlack = true;
- return root;
- }
-
- public void checkMaxEnd() {
- if (mMaxEnd != calcMaxEnd()) {
- throw new IllegalStateException("Max end mismatch " + mMaxEnd + " vs " + calcMaxEnd() + ": " + this);
- }
- if (mLeft != null) mLeft.checkMaxEnd();
- if (mRight != null) mRight.checkMaxEnd();
- }
-
- private int calcMaxEnd() {
- int end = mEnd;
- if (mLeft != null) end = Math.max(end, mLeft.mMaxEnd);
- if (mRight != null) end = Math.max(end, mRight.mMaxEnd);
- return end;
- }
-
- public void printNode() {
- this.printNodeInternal("", "root: ");
- }
-
- private void printNodeInternal(final String padding, final String tag) {
- System.out.println(padding + tag + " " + this);
- if (mLeft != null) mLeft.printNodeInternal(padding + " ", "left: ");
- if (mRight != null) mRight.printNodeInternal(padding + " ", "right:");
- }
-
- public String toString() {
- return "Node(" + mStart + "," + mEnd + "," + mValue + "," + mSize + "," + mMaxEnd + "," + mIsBlack + ")";
- }
-
- private Node<V1> mParent;
- private Node<V1> mLeft;
- private Node<V1> mRight;
- private final int mStart;
- private final int mEnd;
- private V1 mValue;
- private int mSize;
- private int mMaxEnd;
- private boolean mIsBlack;
- }
-
- public class FwdIterator
- implements Iterator<Node<V>>
- {
- public FwdIterator( final Node<V> node )
- {
- mNext = node;
- }
-
- public boolean hasNext()
- {
- return mNext != null;
- }
-
- public Node<V> next()
- {
- if ( mNext == null )
- {
- throw new NoSuchElementException("No next element.");
- }
-
- if ( mNext.wasRemoved() )
- {
- mNext = min(mNext.getStart(),mNext.getEnd());
- if ( mNext == null )
- throw new ConcurrentModificationException("Current element was removed, and there are no more elements.");
- }
- mLast = mNext;
- mNext = mNext.getNext();
- return mLast;
- }
-
- public void remove()
- {
- if ( mLast == null )
- {
- throw new IllegalStateException("No entry to remove.");
- }
-
- removeNode(mLast);
- mLast = null;
- }
-
- private Node<V> mNext;
- private Node<V> mLast;
- }
-
- public class RevIterator
- implements Iterator<Node<V>>
- {
- public RevIterator( final Node<V> node )
- {
- mNext = node;
- }
-
- public boolean hasNext()
- {
- return mNext != null;
- }
-
- public Node<V> next()
- {
- if ( mNext == null )
- throw new NoSuchElementException("No next element.");
- if ( mNext.wasRemoved() )
- {
- mNext = max(mNext.getStart(),mNext.getEnd());
- if ( mNext == null )
- throw new ConcurrentModificationException("Current element was removed, and there are no more elements.");
- }
- mLast = mNext;
- mNext = mNext.getPrev();
- return mLast;
- }
-
- public void remove()
- {
- if ( mLast == null )
- {
- throw new IllegalStateException("No entry to remove.");
- }
-
- removeNode(mLast);
- mLast = null;
- }
-
- private Node<V> mNext;
- private Node<V> mLast;
- }
-
- public class OverlapIterator
- implements Iterator<Node<V>>
- {
- public OverlapIterator( final int start, final int end )
- {
- mNext = minOverlapper(start,end);
- mStart = start;
- mEnd = end;
- }
-
- public boolean hasNext()
- {
- return mNext != null;
- }
-
- public Node<V> next()
- {
- if ( mNext == null )
- {
- throw new NoSuchElementException("No next element.");
- }
-
- if ( mNext.wasRemoved() )
- {
- throw new ConcurrentModificationException("Current element was removed.");
- }
-
- mLast = mNext;
- mNext = Node.getNextOverlapper(mNext,mStart,mEnd);
- return mLast;
- }
-
- public void remove()
- {
- if ( mLast == null )
- {
- throw new IllegalStateException("No entry to remove.");
- }
-
- removeNode(mLast);
- mLast = null;
- }
-
- private Node<V> mNext;
- private Node<V> mLast;
- private final int mStart;
- private final int mEnd;
- }
-
- public static class ValuesIterator<V1>
- implements Iterator<V1>
- {
- public ValuesIterator( final Iterator<Node<V1>> itr )
- {
- mItr = itr;
- }
-
- public boolean hasNext()
- {
- return mItr.hasNext();
- }
-
- public V1 next()
- {
- return mItr.next().getValue();
- }
-
- public void remove()
- {
- mItr.remove();
- }
-
- private final Iterator<Node<V1>> mItr;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java b/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java
deleted file mode 100644
index ffeae94..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalTreeMap.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.AbstractMap;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Utility class that implements an interval map.
- * This class functions as a java map but also supports efficient interval overlap queries.
- *
- * @author Bob Handsaker
- */
-public class IntervalTreeMap<T>
- extends AbstractMap<Interval, T>
-{
- private final Map<String, IntervalTree<T>> mSequenceMap = new HashMap<String, IntervalTree<T>>();
- private final EntrySet mEntrySet = new EntrySet();
-
- public IntervalTree<T> debugGetTree(final String sequence) {
- return mSequenceMap.get(sequence);
- }
-
- public IntervalTreeMap() {
- }
-
- public IntervalTreeMap(final Map<? extends Interval, ? extends T> map) {
- for (final Map.Entry<? extends Interval, ? extends T> entry : map.entrySet()) {
- put(entry.getKey(), entry.getValue());
- }
- }
-
- public void clear() {
- mSequenceMap.clear();
- }
-
- public boolean containsKey(final Object object) {
- if (!(object instanceof Interval)) {
- return false;
- }
- return containsKey((Interval) object);
- }
-
- public boolean containsKey(final Interval key) {
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree == null) {
- return false;
- }
- return (tree.find(key.getStart(), key.getEnd()) != null);
- }
-
- public Set<Entry<Interval, T>> entrySet() {
- return mEntrySet;
- }
-
- @SuppressWarnings("rawtypes")
- public boolean equals(final Object o) {
- if (!(o instanceof IntervalTreeMap)) {
- return false;
- }
- return mSequenceMap.equals(((IntervalTreeMap)o).mSequenceMap);
- }
-
- public int hashCode() {
- return mSequenceMap.hashCode();
- }
-
- public T get(final Object object) {
- if (!(object instanceof Interval)) {
- return null;
- }
- return get((Interval) object);
- }
-
- public T get(final Interval key) {
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree == null) {
- return null;
- }
- final IntervalTree.Node<T> node = tree.find(key.getStart(), key.getEnd());
- if (node == null) {
- return null;
- }
- return node.getValue();
- }
-
- public boolean isEmpty() {
- for (final IntervalTree<T> tree : mSequenceMap.values()) {
- if (tree.size() > 0) {
- return false;
- }
- }
- return true;
- }
-
- public T put(final Interval key, final T value) {
- IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree == null) {
- tree = new IntervalTree<T>();
- mSequenceMap.put(key.getContig(), tree);
- }
- return tree.put(key.getStart(), key.getEnd(), value);
- }
-
- public T remove(final Object object) {
- if (!(object instanceof Interval)) {
- return null;
- }
- return remove((Interval)object);
- }
-
- public T remove(final Interval key) {
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree == null) {
- return null;
- }
- return tree.remove(key.getStart(), key.getEnd());
- }
-
- public int size() {
- // Note: We should think about caching the size to avoid having to recompute it.
- int size = 0;
- for (final IntervalTree<T> tree : mSequenceMap.values()) {
- size += tree.size();
- }
- return size;
- }
- /**
- * Test overlapping interval
- * @param key the interval
- * @return true if it contains an object overlapping the interval
- */
- public boolean containsOverlapping(final Interval key) {
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- return tree!=null && tree.overlappers(key.getStart(), key.getEnd()).hasNext();
- }
-
-
- public Collection<T> getOverlapping(final Interval key) {
- final List<T> result = new ArrayList<T>();
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree != null) {
- final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
- while (iterator.hasNext()) {
- result.add(iterator.next().getValue());
- }
- }
- return result;
- }
- /**
- * Test if this contains an object that is contained by 'key'
- * @param key the interval
- * @return true if it contains an object is contained by 'key'
- */
- public boolean containsContained(final Interval key) {
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if(tree==null) return false;
- final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
- while (iterator.hasNext()) {
- final IntervalTree.Node<T> node = iterator.next();
- if (node.getStart() >= key.getStart() && node.getEnd() <= key.getEnd()) {
- return true;
- }
- }
- return false;
- }
-
-
- public Collection<T> getContained(final Interval key) {
- final List<T> result = new ArrayList<T>();
- final IntervalTree<T> tree = mSequenceMap.get(key.getContig());
- if (tree != null) {
- final Iterator<IntervalTree.Node<T>> iterator = tree.overlappers(key.getStart(), key.getEnd());
- while (iterator.hasNext()) {
- final IntervalTree.Node<T> node = iterator.next();
- if (node.getStart() >= key.getStart() && node.getEnd() <= key.getEnd()) {
- result.add(node.getValue());
- }
- }
- }
- return result;
- }
-
- private class EntrySet
- extends AbstractSet<Map.Entry<Interval,T>> {
-
- public void clear() {
- IntervalTreeMap.this.clear();
- }
-
- public boolean contains(final Map.Entry<Interval,T> entry) {
- if (entry == null) {
- return false;
- }
- return entry.getValue().equals(IntervalTreeMap.this.get(entry.getKey()));
- }
-
- public boolean isEmpty() {
- return IntervalTreeMap.this.isEmpty();
- }
-
- public Iterator<Map.Entry<Interval,T>> iterator() {
- return new EntryIterator();
- }
-
- @SuppressWarnings("unchecked")
- public boolean remove(final Object object) {
- // Note: Could not figure out how to eliminate the unchecked cast.
- if (!(object instanceof Map.Entry)) {
- return false;
- }
- return remove((Map.Entry<Interval,T>)object);
- }
-
- public boolean remove(final Map.Entry<Interval,T> entry) {
- if (this.contains(entry)) {
- IntervalTreeMap.this.remove(entry.getKey());
- return true;
- } else {
- return false;
- }
- }
-
- public int size() {
- return IntervalTreeMap.this.size();
- }
- }
-
- private class EntryIterator
- implements Iterator<Map.Entry<Interval, T>> {
-
- private String mSequence = null;
- private Iterator<String> mSequenceIterator = null;
- private Iterator<IntervalTree.Node<T>> mTreeIterator = null;
-
- EntryIterator() {
- mSequenceIterator = mSequenceMap.keySet().iterator();
- advanceSequence();
- }
-
- public boolean hasNext() {
- return (mTreeIterator != null && mTreeIterator.hasNext());
- }
-
- public Map.Entry<Interval,T> next() {
- if (!hasNext()) {
- throw new NoSuchElementException("Iterator exhausted");
- }
- final IntervalTree.Node<T> node = mTreeIterator.next();
- final String sequence = mSequence;
- if (!mTreeIterator.hasNext()) {
- advanceSequence();
- }
- final Interval key = new Interval(sequence, node.getStart(), node.getEnd());
- final T value = node.getValue();
- return new MapEntry(key, value);
- }
-
- public void remove() {
- if (mTreeIterator == null) {
- throw new IllegalStateException("Iterator.next() has not been called");
- }
- mTreeIterator.remove();
- }
-
- private void advanceSequence() {
- while (mSequenceIterator.hasNext()) {
- mSequence = mSequenceIterator.next();
- mTreeIterator = mSequenceMap.get(mSequence).iterator();
- if (mTreeIterator.hasNext()) {
- break;
- }
- }
- }
- }
-
- private class MapEntry
- implements Map.Entry<Interval,T> {
-
- private final Interval mKey;
- private T mValue;
-
- MapEntry(final Interval key, final T value) {
- mKey = key;
- mValue = value;
- }
-
- public Interval getKey() {
- return mKey;
- }
-
- public T getValue() {
- return mValue;
- }
-
- public T setValue(final T value) {
- mValue = value;
- return IntervalTreeMap.this.put(mKey, mValue);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IntervalUtil.java b/src/main/java/htsjdk/samtools/util/IntervalUtil.java
deleted file mode 100644
index d761707..0000000
--- a/src/main/java/htsjdk/samtools/util/IntervalUtil.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.util.Iterator;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class IntervalUtil {
-
- /** Return true if the sequence/position lie in the provided interval. */
- public static boolean contains(final Interval interval, final String sequenceName, final long position) {
- return interval.getContig().equals(sequenceName) && (position >= interval.getStart() && position <= interval.getEnd());
- }
-
- /** Return true if the sequence/position lie in the provided interval list. */
- public static boolean contains(final IntervalList intervalList, final String sequenceName, final long position) {
- for (final Interval interval : intervalList.uniqued().getIntervals()) {
- if (contains(interval, sequenceName, position))
- return true;
- }
- return false;
- }
-
- /**
- * Throws RuntimeException if the given intervals are not locus ordered and non-overlapping
- *
- * @param intervals
- * @param sequenceDictionary used to determine order of sequences
- */
- public static void assertOrderedNonOverlapping(final Iterator<Interval> intervals, final SAMSequenceDictionary sequenceDictionary) {
- if (!intervals.hasNext()) {
- return;
- }
- Interval prevInterval = intervals.next();
- int prevSequenceIndex = sequenceDictionary.getSequenceIndex(prevInterval.getContig());
- while (intervals.hasNext()) {
- final Interval interval = intervals.next();
- if (prevInterval.intersects(interval)) {
- throw new SAMException("Intervals should not overlap: " + prevInterval + "; " + interval);
- }
- final int thisSequenceIndex = sequenceDictionary.getSequenceIndex(interval.getContig());
- if (prevSequenceIndex > thisSequenceIndex ||
- (prevSequenceIndex == thisSequenceIndex && prevInterval.compareTo(interval) >= 0)) {
- throw new SAMException("Intervals not in order: " + prevInterval + "; " + interval);
- }
- prevInterval = interval;
- prevSequenceIndex = thisSequenceIndex;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Iso8601Date.java b/src/main/java/htsjdk/samtools/util/Iso8601Date.java
deleted file mode 100644
index 9128867..0000000
--- a/src/main/java/htsjdk/samtools/util/Iso8601Date.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Use this type rather than java.util.Date in command-line options in order to get ISO 8601 parsing.
- * The ctors below truncate milliseconds, since our formatter does not write them. Note that it is possible
- * to modify an Iso8601Date so that it has fractional seconds, but that is discouraged.
- *
- * @author alecw at broadinstitute.org
- */
-public class Iso8601Date extends Date {
- private static final ThreadLocal<DateFormat> iso8601DateFormatter = new ThreadLocal<DateFormat>() {
- protected synchronized DateFormat initialValue() {
- return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
- }
- };
-
- public Iso8601Date(final String dateStr) {
- super(DateParser.parse(dateStr).getTime());
- truncateMilliseconds();
- }
-
- public Iso8601Date(final Date date) {
- super(date.getTime());
- truncateMilliseconds();
- }
-
- public String toString() {
- return iso8601DateFormatter.get().format(this);
- }
-
- private void truncateMilliseconds() {
- long time = getTime();
- long mod = time % 1000;
- if (mod != 0) {
- super.setTime(time - mod);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IterableAdapter.java b/src/main/java/htsjdk/samtools/util/IterableAdapter.java
deleted file mode 100644
index f31d6b1..0000000
--- a/src/main/java/htsjdk/samtools/util/IterableAdapter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-
-/**
- * Provides an adapter to wrap an Iterator with an Iterable, allowing it to be run through a foreach loop. Will only
- * allow iterator() to be called a single time - this is intended to be called inline.
- *
- * @author jgentry at broadinstitute.org
- */
-public class IterableAdapter<T> implements Iterable<T> {
- private boolean isIteratorCalled = false;
- private final Iterator<T> theIterator;
-
- public IterableAdapter(final Iterator<T> theIterator) {
- this.theIterator = theIterator;
- }
-
- @Override
- public Iterator<T> iterator() {
- if (isIteratorCalled) {
- throw new ConcurrentModificationException("iterator() can only be called once!");
- }
-
- isIteratorCalled = true;
- return theIterator;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java b/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java
deleted file mode 100644
index 5ca4bc1..0000000
--- a/src/main/java/htsjdk/samtools/util/IterableOnceIterator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Abstract implementation of an iterator that also implements Iterable (to return itself)
- * so that it can be used if for() loops. Only supports calling iterator() once since new
- * iterators are not manufactured but the same object returned.
- *
- * @author Tim Fennell
- */
-public abstract class IterableOnceIterator<T> implements Iterable<T>, Iterator<T>, Closeable {
- private boolean iterated = false;
-
- /**
- * On the first call returns this object which is also an iterator. On subsequent calls throws
- * an exception since new iterators cannot be generated.
- */
- @Override
- public Iterator<T> iterator() {
- if (iterated) {
- throw new IllegalStateException("May not call iterator() more than once on IterableOnceIterator.");
- }
- else {
- iterated = true;
- return this;
- }
- }
-
- /** Operation not supported. */
- @Override
- public void remove() {
- throw new UnsupportedOperationException("remove() not supported");
- }
-
- /** Does nothing, intended to be overridden when needed. */
- @Override public void close() throws IOException {
- // Default do nothing implementation
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Iterables.java b/src/main/java/htsjdk/samtools/util/Iterables.java
deleted file mode 100644
index 46c8d5a..0000000
--- a/src/main/java/htsjdk/samtools/util/Iterables.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author mccowan
- */
-public class Iterables {
- private Iterables() {
-
- }
-
- public static <T> List<T> slurp(final Iterator<T> iterator) {
- final List<T> ts = new ArrayList<T>();
- while (iterator.hasNext()) ts.add(iterator.next());
- return ts;
- }
-
- public static <T> List<T> slurp(final Iterable<T> iterable) {
- return slurp(iterable.iterator());
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Lazy.java b/src/main/java/htsjdk/samtools/util/Lazy.java
deleted file mode 100644
index 13726b8..0000000
--- a/src/main/java/htsjdk/samtools/util/Lazy.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Simple utility for building an on-demand (lazy) object-initializer.
- *
- * Works by accepting an initializer describing how to build the on-demand object, which is only called once and only after the first
- * invocation of {@link #get()} (or it may not be called at all).
- *
- * @author mccowan
- */
-public class Lazy<T> {
- private final LazyInitializer<T> initializer;
- private boolean isInitialized = false;
- private T instance;
-
- /** Simple cons */
- public Lazy(final LazyInitializer<T> initializer) {
- this.initializer = initializer;
- }
-
- /** Returns the instance associated with this {@link Lazy}, initializing it if necessary. */
- public synchronized T get() {
- if (!isInitialized) {
- this.instance = initializer.make();
- isInitialized = true;
- }
- return instance;
- }
-
- /** Describes how to build the instance of the lazy object. */
- @FunctionalInterface
- public interface LazyInitializer<T> {
- /** Returns the desired object instance. */
- T make();
- }
-
- public boolean isInitialized() {
- return isInitialized;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/LineReader.java b/src/main/java/htsjdk/samtools/util/LineReader.java
deleted file mode 100644
index 0185700..0000000
--- a/src/main/java/htsjdk/samtools/util/LineReader.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Closeable;
-
-/**
- * Interface allows for implementations that read lines from a String, an ASCII file, or somewhere else.
- */
-public interface LineReader extends Closeable{
-
- /**
- * Read a line and remove the line terminator
- * @return the line read, or null if EOF has been reached.
- */
- String readLine();
-
- /**
- * @return 1-based number of line most recently read
- */
- int getLineNumber();
-
- /**
- * Non-destructive one-character look-ahead.
- * @return If not eof, the next character that would be read. If eof, -1.
- */
- int peek();
-
- public void close();
-}
diff --git a/src/main/java/htsjdk/samtools/util/ListMap.java b/src/main/java/htsjdk/samtools/util/ListMap.java
deleted file mode 100755
index 385c2e8..0000000
--- a/src/main/java/htsjdk/samtools/util/ListMap.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * A Map class that holds a list of entries under each key instead of a single entry, and
- * provides utility methods for adding an entry under a key.
- *
- * @author Tim Fennell
- */
-public class ListMap<K,V> extends HashMap<K, List<V>> {
- /** Adds a single value to the list stored under a key. */
- public void add(K key, V value) {
- List<V> values = get(key);
- if (values == null) {
- values = new ArrayList<V>();
- put(key, values);
- }
-
- values.add(value);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Locatable.java b/src/main/java/htsjdk/samtools/util/Locatable.java
deleted file mode 100644
index 0d70090..0000000
--- a/src/main/java/htsjdk/samtools/util/Locatable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Any class that has a single logical mapping onto the genome should implement Locatable
- * positions should be reported as 1-based and closed at both ends
- *
- */
-public interface Locatable {
-
- /**
- * Gets the contig name for the contig this is mapped to. May return null if there is no unique mapping.
- * @return name of the contig this is mapped to, potentially null
- */
- String getContig();
-
- /**
- * @return 1-based start position, undefined if getContig() == null
- */
- int getStart();
-
- /**
- * @return 1-based closed-ended position, undefined if getContig() == null
- */
- int getEnd();
-}
diff --git a/src/main/java/htsjdk/samtools/util/LocationAware.java b/src/main/java/htsjdk/samtools/util/LocationAware.java
deleted file mode 100644
index 46e1d2d..0000000
--- a/src/main/java/htsjdk/samtools/util/LocationAware.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Describes API for getting current position in a stream, writer, or underlying file.
- *
- * The expected functionality is simple: if you are a output stream / writer, and you've written 50 bytes to the stream, then
- * {@link #getPosition()} should return 50; if you are an input stream or file reader, and you've read 25 bytes from the object, then it
- * should return 25.
- *
- * In the context of an iterator or any producer-like object that doesn't map directly to a byte stream, {@link #getPosition()} should
- * return the position (in the underlying stream being read/written to) of the most-recently read/written element. For example, if you
- * are reading lines from a file with a {@link htsjdk.tribble.readers.AsciiLineReaderIterator}, calling {@link #getPosition()} should return the byte position
- * of the start of the most recent line returned by {@link htsjdk.tribble.readers.AsciiLineReaderIterator#next()}.
- *
- * @author mccowan
- */
-public interface LocationAware {
- /**
- * The current offset, in bytes, of this stream/writer/file. Or, if this is an iterator/producer, the offset (in bytes) of the
- * END of the most recently returned record (since a produced record corresponds to something that has been read already). See class
- * javadoc for more.
- *
- * Note that for BGZF files, this does not represent an actually file position, but a virtual file pointer.
- */
- public long getPosition();
-}
diff --git a/src/main/java/htsjdk/samtools/util/Locus.java b/src/main/java/htsjdk/samtools/util/Locus.java
deleted file mode 100644
index 8012263..0000000
--- a/src/main/java/htsjdk/samtools/util/Locus.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Location info about a locus.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public interface Locus {
- int getSequenceIndex();
-
- /** @return 1-based position */
- int getPosition();
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/util/LocusComparator.java b/src/main/java/htsjdk/samtools/util/LocusComparator.java
deleted file mode 100644
index e0f04d9..0000000
--- a/src/main/java/htsjdk/samtools/util/LocusComparator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * compares first by sequence index then by position
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public class LocusComparator<T extends Locus> implements Comparator<T>, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(T thing1, T thing2) {
- int refCompare = thing1.getSequenceIndex() - thing2.getSequenceIndex();
- return refCompare == 0 ? thing1.getPosition() - thing2.getPosition() : refCompare;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/LocusImpl.java b/src/main/java/htsjdk/samtools/util/LocusImpl.java
deleted file mode 100644
index 8629078..0000000
--- a/src/main/java/htsjdk/samtools/util/LocusImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Simple implementation of Locus interface for ease of passing as an arg and comparing with other Locus implementations.
- * @author alecw at broadinstitute.org
- */
-public class LocusImpl implements Locus {
- private final int sequenceIndex;
- private final int position;
-
- public LocusImpl(int sequenceIndex, int position) {
- this.position = position;
- this.sequenceIndex = sequenceIndex;
- }
-
- public int getSequenceIndex() {
- return sequenceIndex;
- }
-
- /**
- * @return 1-based position
- */
- public int getPosition() {
- return position;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Log.java b/src/main/java/htsjdk/samtools/util/Log.java
deleted file mode 100644
index acbd3c4..0000000
--- a/src/main/java/htsjdk/samtools/util/Log.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.PrintStream;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-
-/**
- * <p>A <em>wafer thin</em> wrapper around System.err that uses var-args to make it
- * much more efficient to call the logging methods in without having to
- * surround every call site with calls to Log.isXXXEnabled(). All the methods on this
- * class take a variable length list of arguments and, only if logging is enabled for
- * the level and channel being logged to, will those arguments be toString()'d and
- * appended together.</p>
- *
- * @author Tim Fennell
- */
-public final class Log {
- /** Enumeration for setting log levels. */
- public static enum LogLevel { ERROR, WARNING, INFO, DEBUG }
-
- private static LogLevel globalLogLevel = LogLevel.INFO;
-
- private final Class<?> clazz;
- private final String className;
- private final PrintStream out = System.err;
-
- /**
- * Private constructor
- */
- private Log(final Class<?> clazz) {
- this.clazz = clazz;
- this.className = clazz.getSimpleName();
- }
-
- /**
- * Get a Log instance to perform logging within the Class specified. Returns an instance
- * of this class which wraps an instance of the commons logging Log class.
- * @param clazz the Class which is going to be doing the logging
- * @return a Log instance with which to log
- */
- public static Log getInstance(final Class<?> clazz) {
- return new Log(clazz);
- }
-
- public static void setGlobalLogLevel(final LogLevel logLevel) {
- globalLogLevel = logLevel;
- }
-
- /** Returns true if the specified log level is enabled otherwise false. */
- public static final boolean isEnabled(final LogLevel level) {
- return level.ordinal() <= globalLogLevel.ordinal();
- }
-
- /**
- * Private method that does the actual printing of messages to a PrintWriter. Outputs the log level,
- * class name and parts followed by the stack trace if a throwable is provided.
- *
- * @param level the Log level being logged at
- * @param throwable a Throwable if one is available otherwise null
- * @param parts the parts of the message to be concatenated
- */
- private void emit(final LogLevel level, final Throwable throwable, final Object... parts) {
- if (isEnabled(level)) {
- StringBuffer tmp = new StringBuffer();
- tmp.append(level.name())
- .append('\t')
- .append(getTimestamp())
- .append('\t')
- .append(this.className)
- .append('\t');
-
- for (final Object part : parts) {
- if (part != null && part.getClass().isArray()) {
- final Class<?> component = part.getClass().getComponentType();
- if (component.equals(Boolean.TYPE)) tmp.append(Arrays.toString( (boolean[]) part));
- else if (component.equals(Byte.TYPE)) tmp.append(Arrays.toString( (byte[]) part));
- else if (component.equals(Character.TYPE)) tmp.append(Arrays.toString( (char[]) part));
- else if (component.equals(Double.TYPE)) tmp.append(Arrays.toString( (double[]) part));
- else if (component.equals(Float.TYPE)) tmp.append(Arrays.toString( (float[]) part));
- else if (component.equals(Integer.TYPE)) tmp.append(Arrays.toString( (int[]) part));
- else if (component.equals(Long.TYPE)) tmp.append(Arrays.toString( (long[]) part));
- else if (component.equals(Short.TYPE)) tmp.append(Arrays.toString( (short[]) part));
- else tmp.append(Arrays.toString( (Object[]) part));
- }
- else {
- tmp.append(part);
- }
- }
-
- // Print out the exception if there is one
- if (throwable != null) {
- synchronized (this.out) {
- this.out.println(tmp.toString());
- throwable.printStackTrace(this.out);
- }
- }
- else {
- this.out.println(tmp.toString());
- }
- }
- }
-
- /**
- * Creates a date string for insertion into the log. Given that logs are sometimes held statically
- * and SimpleDateFormat is not thread safe, currently creates an instance each time :/
- */
- protected String getTimestamp() {
- final DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- return fmt.format(new Date());
- }
-
- /**
- * Logs a Throwable and optional message parts at level error.
- * @param throwable an instance of Throwable that should be logged with stack trace
- * @param messageParts zero or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void error(final Throwable throwable, final Object... messageParts) {
- emit(LogLevel.ERROR, throwable, messageParts);
- }
-
- /**
- * Logs a Throwable and optional message parts at level warn.
- * @param throwable an instance of Throwable that should be logged with stack trace
- * @param messageParts zero or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void warn(final Throwable throwable, final Object... messageParts) {
- emit(LogLevel.WARNING, throwable, messageParts);
- }
-
- /**
- * Logs a Throwable and optional message parts at level info.
- * @param throwable an instance of Throwable that should be logged with stack trace
- * @param messageParts zero or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void info(final Throwable throwable, final Object... messageParts) {
- emit(LogLevel.INFO, throwable, messageParts);
- }
-
- /**
- * Logs a Throwable and optional message parts at level debug.
- * @param throwable an instance of Throwable that should be logged with stack trace
- * @param messageParts zero or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void debug(final Throwable throwable, final Object... messageParts) {
- emit(LogLevel.DEBUG, throwable, messageParts);
- }
-
- // Similar methods, but without Throwables, follow
-
- /**
- * Logs one or more message parts at level error.
- * @param messageParts one or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void error(final Object... messageParts) {
- emit(LogLevel.ERROR, null, messageParts);
- }
-
- /**
- * Logs one or more message parts at level warn.
- * @param messageParts one or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void warn(final Object... messageParts) {
- emit(LogLevel.WARNING, null, messageParts);
- }
-
- /**
- * Logs one or more message parts at level info.
- * @param messageParts one or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void info(final Object... messageParts) {
- emit(LogLevel.INFO, null, messageParts);
- }
-
- /**
- * Logs one or more message parts at level debug.
- * @param messageParts one or more objects which should be combined, by calling toString()
- * to form the log message.
- */
- public final void debug(final Object... messageParts) {
- emit(LogLevel.DEBUG, null, messageParts);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java b/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java
deleted file mode 100755
index e0e7cd5..0000000
--- a/src/main/java/htsjdk/samtools/util/Md5CalculatingInputStream.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Class to generate an MD5 string for a file as it is being read
- *
- * @author ktibbett at broadinstitue.org
- */
-public class Md5CalculatingInputStream extends InputStream {
-
- private final InputStream is;
- private final MessageDigest md5;
- private final File digestFile;
- private String hash;
-
- /**
- * Constructor that takes in the InputStream that we are wrapping
- * and creates the MD5 MessageDigest
- */
- public Md5CalculatingInputStream(InputStream is, File digestFile) {
- super();
- this.is = is;
- this.digestFile = digestFile;
- this.hash = null;
-
- try {
- md5 = MessageDigest.getInstance("MD5");
- md5.reset();
- }
- catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("MD5 algorithm not found", e);
- }
- }
-
- public int read() throws IOException {
- int result = is.read();
- if (result != -1) md5.update((byte)result);
- return result;
- }
-
- public int read(byte[] b) throws IOException {
- int result = is.read(b);
- if (result != -1) md5.update(b, 0, result);
- return result;
- }
-
-
- public int read(byte[] b, int off, int len) throws IOException {
- int result = is.read(b, off, len);
- if (result != -1) md5.update(b, off, result);
- return result;
- }
-
- public String md5() {
- if(hash == null) {
- throw new SAMException("Attempting to access md5 digest before the entire file is read! Call close first.");
- }
- return hash;
- }
-
- private String makeHash() {
- if(hash == null) {
- hash = new BigInteger(1, md5.digest()).toString(16);
- if (hash.length() != 32) {
- final String zeros = "00000000000000000000000000000000";
- hash = zeros.substring(0, 32 - hash.length()) + hash;
- }
- return hash;
- } else {
- throw new SAMException("MD5InputStream is already closed!");
- }
- }
-
- public void close() throws IOException {
- is.close();
- makeHash();
-
- if(digestFile != null) {
- BufferedWriter writer = new BufferedWriter(new FileWriter(digestFile));
- writer.write(hash);
- writer.close();
- }
- }
-
- // Methods not supported or overridden because they would not result in a valid hash
- public boolean markSupported() { return false; }
- public void mark(int readlimit) {
- throw new UnsupportedOperationException("mark() is not supported by the MD5CalculatingInputStream");
- }
- public void reset() throws IOException {
- throw new UnsupportedOperationException("reset() is not supported by the MD5CalculatingInputStream");
- }
- public long skip(long n) throws IOException {
- throw new UnsupportedOperationException("skip() is not supported by the MD5CalculatingInputStream");
- }
-
- // Methods delegated to the wrapped InputStream
- public int available() throws IOException { return is.available(); }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java b/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java
deleted file mode 100755
index 3c5a492..0000000
--- a/src/main/java/htsjdk/samtools/util/Md5CalculatingOutputStream.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Class to generate an MD5 string for a file as it is being read
- *
- * @author ktibbett at broadinstitue.org
- */
-public class Md5CalculatingOutputStream extends OutputStream {
-
- private final OutputStream os;
- private final MessageDigest md5;
- private final File digestFile;
- private String hash;
-
- /**
- * Constructor that takes in the OutputStream that we are wrapping
- * and creates the MD5 MessageDigest
- */
- public Md5CalculatingOutputStream(OutputStream os, File digestFile) {
- super();
- this.hash = null;
- this.os = os;
- this.digestFile = digestFile;
-
- try {
- md5 = MessageDigest.getInstance("MD5");
- md5.reset();
- }
- catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("MD5 algorithm not found", e);
- }
- }
-
- public void write(int b) throws IOException {
- md5.update((byte)b);
- os.write(b);
- }
-
- public void write(byte[] b) throws IOException {
- md5.update(b);
- os.write(b);
- }
-
-
- public void write(byte[] b, int off, int len) throws IOException {
- md5.update(b, off, len);
- os.write(b, off, len);
- }
-
- public String md5() {
- if(hash == null) {
- throw new SAMException("Attempting to access md5 digest before the entire file is written! Call close first.");
- }
-
- return hash;
- }
-
- private String makeHash() {
- if(hash == null) {
- hash = new BigInteger(1, md5.digest()).toString(16);
- if (hash.length() != 32) {
- final String zeros = "00000000000000000000000000000000";
- hash = zeros.substring(0, 32 - hash.length()) + hash;
- }
- return hash;
- } else {
- throw new SAMException("Calling close on Md5CalculatingOutputStream twice!");
- }
- }
-
- public void close() throws IOException {
- os.close();
- makeHash();
-
- if(digestFile != null) {
- BufferedWriter writer = new BufferedWriter(new FileWriter(digestFile));
- writer.write(hash);
- writer.close();
- }
- }
-
- // Pass-through method
- public void flush() throws IOException { os.flush(); }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/MergingIterator.java b/src/main/java/htsjdk/samtools/util/MergingIterator.java
deleted file mode 100644
index 14da4b0..0000000
--- a/src/main/java/htsjdk/samtools/util/MergingIterator.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.PriorityQueue;
-
-/**
- * An iterator over Iterators that return Ts. Calling next() returns the next T ordered according
- * to Comparator provided at construction time. Importantly, the elements in the input Iterators
- * must already be sorted according to the provided Comparator.
- */
-public class MergingIterator<T> implements CloseableIterator<T> {
-
- /*
- * An Iterator whose natural ordering is by the T that will be returned by the next call to
- * next().
- */
- private class ComparableIterator extends PeekableIterator<T> implements Comparable<ComparableIterator> {
-
- public ComparableIterator(final Iterator<T> iterator) {
- super(iterator);
- }
-
- @Override
- public int compareTo(final ComparableIterator that) {
- if (comparator.getClass() != comparator.getClass()) {
- throw new IllegalStateException("Can't compare two ComparableIterators that have different orderings.");
- }
-
- return comparator.compare(this.peek(), that.peek());
- }
- }
-
- /*
- * The general flow is to pull the "top" (according to the ComparableIterator's compareTo())
- * iterator off on calls to this.next(), get iterator.next() and then re-add the iterator to
- * the queue. Readding reorders the queue so the next "top" iterator is ready.
- */
- private final PriorityQueue<ComparableIterator> queue;
-
- private final Comparator<T> comparator;
-
- // This is the last T returned by the call to next(). It's used to make sure that the comparators
- // always return correctly ordered Ts.
- private T lastReturned;
-
- /**
- * Creates a MergingIterator over the given Collection of iterators whose elements will be
- * returned in the order defined by the given Comparator.
- */
- public MergingIterator(final Comparator<T> comparator, final Collection<CloseableIterator<T>> iterators) {
- if (iterators.isEmpty()) throw new IllegalArgumentException("One or more CloseableIterators must be provided.");
-
- this.comparator = comparator;
-
- this.queue = new PriorityQueue<ComparableIterator>();
- for (final CloseableIterator<T> iterator : iterators) {
- this.addIfNotEmpty(new ComparableIterator(iterator));
- }
-
- // If there are no iterators to read from after adding them all to the prioqueue,
- // should we throw? it's prob'ly an error.
- }
-
- /**
- * @see java.util.Iterator<T>.hasNext
- */
- @Override
- public boolean hasNext() {
- return ! this.queue.isEmpty();
- }
-
- /**
- * @see java.util.Iterator<T>.next
- */
- @Override
- public T next() {
- if ( ! this.hasNext()) throw new NoSuchElementException();
-
- final ComparableIterator recordIterator = this.queue.poll();
- // Assumes the iterator is closed & removed from the queue before recordIterator.hasNext() == false
- final T next = recordIterator.next();
- // I don't like having to test for null here -- it's really only null before the first call
- // to next() -- but I don't see any other way
- if (this.lastReturned != null && this.comparator.compare(lastReturned, next) > 0) {
- throw new IllegalStateException(
- "The elements of the input Iterators are not sorted according to the comparator " +
- this.comparator.getClass().getName());
- }
-
- addIfNotEmpty(recordIterator);
- this.lastReturned = next;
- return next;
- }
-
- /**
- * Unsupported.
- */
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Closes every CloseableIterator in this MergingIterator. After calling, calls to
- * hasNext() will always return false.
- */
- @Override
- public void close() {
- for (final ComparableIterator iterator : this.queue) {
- iterator.close();
- this.queue.remove(iterator);
- }
- }
-
- private void addIfNotEmpty(final ComparableIterator iterator) {
- if (iterator.hasNext()) queue.offer(iterator);
- else iterator.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Murmur3.java b/src/main/java/htsjdk/samtools/util/Murmur3.java
deleted file mode 100644
index b0c4a3a..0000000
--- a/src/main/java/htsjdk/samtools/util/Murmur3.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2011 The Guava Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- *
- * MurmurHash3 was written by Austin Appleby, and is placed in the public
- * domain. The author hereby disclaims copyright to this source code.
- *
- * Source:
- * http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
- * (Modified to adapt to Guava coding conventions and to use the HashFunction interface)
- *
- * Modified to remove stuff Clojure doesn't need, placed under clojure.lang namespace,
- * all fns made static, added hashOrdered/Unordered
- *
- * Modified again by Tim Fennell to remove code not needed by HTSJDK, to make methods non-static (so that different uses can
- * supply different seed values without colliding) and to comform to HTSJDK coding conventions where possible.
- *
- * @author Austin Appleby
- * @author Dimitris Andreou
- * @author Kurt Alfred Kluever
- */
-package htsjdk.samtools.util;
-
-import java.io.Serializable;
-
-/**
- * Provides an implementation of the Murmur3_32 hash algorithm that has desirable properties in terms of randomness
- * and uniformity of the distribution of output values that make it a useful hashing algorithm for downsampling.
- */
-public final class Murmur3 implements Serializable{
- private static final long serialVersionUID = 1L;
-
- private final int seed ;
-
- /** Constructs a Murmur3 hash with the given seed. */
- public Murmur3(final int seed) {
- this.seed = seed;
- }
-
- /** Hashes a character stream to an int using Murmur3. */
- public int hashUnencodedChars(CharSequence input){
- int h1 = this.seed;
-
- // step through the CharSequence 2 chars at a time
- final int length = input.length();
- for(int i = 1; i < length; i += 2) {
- int k1 = input.charAt(i - 1) | (input.charAt(i) << 16);
- k1 = mixK1(k1);
- h1 = mixH1(h1, k1);
- }
-
- // deal with any remaining characters
- if((length & 1) == 1) {
- int k1 = input.charAt(length - 1);
- k1 = mixK1(k1);
- h1 ^= k1;
- }
-
- return fmix(h1, 2 * length);
- }
-
- private int hashInt(int input){
- if(input == 0) return 0;
- int k1 = mixK1(input);
- int h1 = mixH1(this.seed, k1);
-
- return fmix(h1, 4);
- }
-
- private int hashLong(long input){
- if(input == 0) return 0;
- int low = (int) input;
- int high = (int) (input >>> 32);
-
- int k1 = mixK1(low);
- int h1 = mixH1(this.seed, k1);
-
- k1 = mixK1(high);
- h1 = mixH1(h1, k1);
-
- return fmix(h1, 8);
- }
-
- private static int mixK1(int k1){
- final int c1 = 0xcc9e2d51;
- final int c2 = 0x1b873593;
- k1 *= c1;
- k1 = Integer.rotateLeft(k1, 15);
- k1 *= c2;
- return k1;
- }
-
- private static int mixH1(int h1, int k1){
- h1 ^= k1;
- h1 = Integer.rotateLeft(h1, 13);
- h1 = h1 * 5 + 0xe6546b64;
- return h1;
- }
-
- // Finalization mix - force all bits of a hash block to avalanche
- private static int fmix(int h1, int length){
- h1 ^= length;
- h1 ^= h1 >>> 16;
- h1 *= 0x85ebca6b;
- h1 ^= h1 >>> 13;
- h1 *= 0xc2b2ae35;
- h1 ^= h1 >>> 16;
- return h1;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/samtools/util/OverlapDetector.java b/src/main/java/htsjdk/samtools/util/OverlapDetector.java
deleted file mode 100644
index ba177b7..0000000
--- a/src/main/java/htsjdk/samtools/util/OverlapDetector.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.*;
-
-/**
- * Utility class to efficiently do in memory overlap detection between a large
- * set of mapping like objects, and one or more candidate mappings.
- *
- * You can use it for example to detect all locatables overlapping a given set of locatables:
- * <pre>{@code
- * OverlapDetector<Locatable> detector = OverlapDetector.create(locatables);
- * Set<Locatable> overlaps = detector.getOverlaps(query);
- *
- * boolean anyOverlap = detector.overlapsAny(query); //faster API for checking presence of any overlap
- * }</pre>
- */
-public class OverlapDetector<T> {
- private final Map<Object, IntervalTree<Set<T>>> cache = new HashMap<>();
- private final int lhsBuffer;
- private final int rhsBuffer;
-
- /**
- * Constructs an overlap detector.
- * @param lhsBuffer the amount by which to "trim" coordinates of mappings on the left
- * hand side when calculating overlaps
- * @param rhsBuffer the amount by which to "trim" coordinates of mappings on the right
- * hand side when calculating overlaps
- */
- public OverlapDetector(int lhsBuffer, int rhsBuffer) {
- this.lhsBuffer = lhsBuffer;
- this.rhsBuffer = rhsBuffer;
- }
-
- /**
- * Creates a new OverlapDetector with no trim and the given set of intervals.
- */
- public static <T extends Locatable> OverlapDetector<T> create(final List<T> intervals) {
- final OverlapDetector<T> detector = new OverlapDetector<>(0, 0);
- detector.addAll(intervals, intervals);
- return detector;
- }
-
- /** Adds a Locatable to the set of Locatables against which to match candidates. */
- public void addLhs(final T object, final Locatable interval) {
- if (object == null) {
- throw new IllegalArgumentException("null object");
- }
- if (interval == null) {
- throw new IllegalArgumentException("null interval");
- }
- final String seqId = interval.getContig();
-
- IntervalTree<Set<T>> tree = this.cache.get(seqId);
- if (tree == null) {
- tree = new IntervalTree<>();
- this.cache.put(seqId, tree);
- }
-
- final int start = interval.getStart() + this.lhsBuffer;
- final int end = interval.getEnd() - this.lhsBuffer;
-
- final Set<T> objects = new HashSet<>(1);
- objects.add(object);
- if (start <= end) { // Don't put in sequences that have no overlappable bases
- final Set<T> alreadyThere = tree.put(start, end, objects);
- if (alreadyThere != null) {
- alreadyThere.add(object);
- tree.put(start, end, alreadyThere);
- }
- }
- }
-
- /**
- * Adds all items to the overlap detector.
- *
- * The order of the lists matters only in the sense that it needs to be the same for the intervals
- * and the corresponding objects.
- */
- public void addAll(final List<T> objects, final List<? extends Locatable> intervals) {
- if (objects == null) {
- throw new IllegalArgumentException("null objects");
- }
- if (intervals == null) {
- throw new IllegalArgumentException("null intervals");
- }
- if (objects.size() != intervals.size()) {
- throw new IllegalArgumentException("Objects and intervals must be the same size but were " + objects.size() + " and " + intervals.size());
- }
-
- for (int i=0; i<objects.size(); ++i) {
- addLhs(objects.get(i), intervals.get(i));
- }
- }
-
- /**
- * Gets all the objects that could be returned by the overlap detector.
- */
- public Set<T> getAll() {
- final Set<T> all = new HashSet<>();
- for (final IntervalTree<Set<T>> tree : this.cache.values()) {
- for (IntervalTree.Node<Set<T>> node : tree) {
- all.addAll(node.getValue());
- }
- }
- return all;
- }
-
- /**
- * Returns true iff the given locatable overlaps any locatable in this detector.
- *
- * This is a performance shortcut API functionally equivalent to:
- * <pre>{@code
- * ! getOverlaps(locatable).isEmpty()
- * }</pre>
- */
- public boolean overlapsAny(final Locatable locatable) {
- if (locatable == null) {
- throw new IllegalArgumentException("null locatable");
- }
- final String seqId = locatable.getContig();
- final IntervalTree<Set<T>> tree = this.cache.get(seqId);
- if (tree == null) {
- return false;
- }
- final int start = locatable.getStart() + this.rhsBuffer;
- final int end = locatable.getEnd() - this.rhsBuffer;
-
- if (start > end) {
- return false;
- }
-
- final Iterator<IntervalTree.Node<Set<T>>> it = tree.overlappers(start, end);
- while (it.hasNext()) {
- final IntervalTree.Node<Set<T>> node = it.next();
- if (!node.getValue().isEmpty()) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Gets the Set of objects that overlap the provided locatable.
- * The returned set may not be modifiable.
- */
- public Set<T> getOverlaps(final Locatable locatable) {
- if (locatable == null) {
- throw new IllegalArgumentException("null locatable");
- }
- final String seqId = locatable.getContig();
- final IntervalTree<Set<T>> tree = this.cache.get(seqId);
- if (tree == null) {
- return Collections.emptySet();
- }
- final int start = locatable.getStart() + this.rhsBuffer;
- final int end = locatable.getEnd() - this.rhsBuffer;
-
- if (start > end) {
- return Collections.emptySet();
- }
-
- final Set<T> matches = new HashSet<>();
- final Iterator<IntervalTree.Node<Set<T>>> it = tree.overlappers(start, end);
- while (it.hasNext()) {
- final IntervalTree.Node<Set<T>> node = it.next();
- matches.addAll(node.getValue());
- }
- return matches;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PeekIterator.java b/src/main/java/htsjdk/samtools/util/PeekIterator.java
deleted file mode 100644
index 9f16a51..0000000
--- a/src/main/java/htsjdk/samtools/util/PeekIterator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Wrapper around an iterator that enables non-destructive peeking at the next element that would
- * be returned by next()
- */
-public class PeekIterator<T> implements Iterator<T> {
- Iterator<T> underlyingIterator;
- T peekedElement = null;
-
- public PeekIterator(final Iterator<T> underlyingIterator) {
- this.underlyingIterator = underlyingIterator;
- }
-
- /**
- * @return true if the iteration has more elements. (In other words, returns true if next would return an element
- * rather than throwing an exception.)
- */
- public boolean hasNext() {
- return peekedElement != null || underlyingIterator.hasNext();
- }
-
- /**
- * @return the next element in the iteration. Calling this method repeatedly until the hasNext() method returns
- * false will return each element in the underlying collection exactly once.
- */
- public T next() {
- if (peekedElement != null) {
- final T ret = peekedElement;
- peekedElement = null;
- return ret;
- }
- return underlyingIterator.next();
- }
-
- /**
- * @return the next element in the iteration, but without removing it, so the next call to next() or peek()
- * will return the same element as returned by the current call to peek().
- */
- public T peek() {
- if (peekedElement == null) {
- peekedElement = underlyingIterator.next();
- }
- return peekedElement;
- }
-
- /**
- * Unsupported
- */
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @return the iterator wrapped by this object.
- */
- public Iterator<T> getUnderlyingIterator() {
- return underlyingIterator;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PeekableIterator.java b/src/main/java/htsjdk/samtools/util/PeekableIterator.java
deleted file mode 100644
index 1587dd2..0000000
--- a/src/main/java/htsjdk/samtools/util/PeekableIterator.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.Iterator;
-
-/**
- * Generic Closable Iterator that allows you to peek at the next value before calling next
- */
-public class PeekableIterator<Object> implements CloseableIterator<Object> {
- private Iterator<Object> iterator;
- private Object nextObject;
-
- /** Constructs a new iterator that wraps the supplied iterator. */
- public PeekableIterator(Iterator<Object> iterator) {
- this.iterator = iterator;
- advance();
- }
-
- /** Closes the underlying iterator. */
- public void close() {
- CloserUtil.close(iterator);
- }
-
- /** True if there are more items, in which case both next() and peek() will return a value. */
- public boolean hasNext() {
- return this.nextObject != null;
- }
-
- /** Returns the next object and advances the iterator. */
- public Object next() {
- Object retval = this.nextObject;
- advance();
- return retval;
- }
-
- /**
- * Returns the next object but does not advance the iterator. Subsequent calls to peek()
- * and next() will return the same object.
- */
- public Object peek(){
- return this.nextObject;
- }
-
- private void advance(){
- if (this.iterator.hasNext()) {
- this.nextObject = iterator.next();
- }
- else {
- this.nextObject = null;
- }
- }
-
- /** Unsupported Operation. */
- public void remove() {
- throw new UnsupportedOperationException("Not supported: remove");
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java b/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java
deleted file mode 100644
index ef28be6..0000000
--- a/src/main/java/htsjdk/samtools/util/PositionalOutputStream.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.samtools.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Wraps output stream in a manner which keeps track of the position within the file and allowing writes
- * at arbitrary points
- */
-public final class PositionalOutputStream extends OutputStream implements LocationAware
-{
- private final OutputStream out;
- private long position = 0;
-
- public PositionalOutputStream(final OutputStream out) {
- this.out = out;
- }
-
- public final void write(final byte[] bytes) throws IOException {
- write(bytes, 0, bytes.length);
- }
-
- public final void write(final byte[] bytes, final int startIndex, final int numBytes) throws IOException {
- position += numBytes;
- out.write(bytes, startIndex, numBytes);
- }
-
- public final void write(final int c) throws IOException {
- position++;
- out.write(c);
- }
-
- public final long getPosition() { return position; }
-
- @Override
- public void close() throws IOException {
- super.close();
- out.close();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProcessExecutor.java b/src/main/java/htsjdk/samtools/util/ProcessExecutor.java
deleted file mode 100644
index 5ff6673..0000000
--- a/src/main/java/htsjdk/samtools/util/ProcessExecutor.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-
-/**
- * Utility class that will execute sub processes via Runtime.getRuntime().exec(...) and read
- * off the output from stderr and stdout of the sub process. This implementation uses a different
- * thread to read each stream: the current thread for stdout and another, internal thread for
- * stderr. This utility is able to handle concurrent executions, spawning as many threads as
- * are required to handle the concurrent load.
- *
- * @author Doug Voet (dvoet at broadinstitute dot org)
- */
-public class ProcessExecutor {
- private static final Log log = Log.getInstance(ProcessExecutor.class);
- private static final ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() {
- @Override
- public Thread newThread(final Runnable r) {
- return new Thread(r, "ProcessExecutor Thread");
- }
- });
-
- /**
- * Executes the command via Runtime.getRuntime().exec() then writes stderr to log.error
- * and stdout to log.info and blocks until the command is complete.
- *
- * @see Runtime#exec(String)
- *
- * @param command command string
- * @return return code of command
- */
- public static int execute(final String command) {
- try {
- final Process process = Runtime.getRuntime().exec(command);
- return readStreamsAndWaitFor(process);
- } catch (Throwable t) {
- throw new SAMException("Unexpected exception executing [" + htsjdk.samtools.util.StringUtil.join(" ", command) + "]", t);
- }
- }
-
- /**
- * Executes the command via Runtime.getRuntime().exec() then writes stderr to log.error
- * and stdout to log.info and blocks until the command is complete.
- *
- * @see Runtime#exec(String[])
- *
- * @param commandParts command string
- * @return return code of command
- */
- public static int execute(final String[] commandParts) {
- return execute(commandParts, null);
- }
-
- /**
- * Executes the command via Runtime.getRuntime().exec(), writes <code>outputStreamString</code>
- * to the process output stream if it is not null, then writes stderr to log.error
- * and stdout to log.info and blocks until the command is complete.
- *
- * @see Runtime#exec(String[])
- *
- * @param commandParts command string
- * @return return code of command
- */
- public static int execute(final String[] commandParts, String outputStreamString) {
- try {
- final Process process = Runtime.getRuntime().exec(commandParts);
- if (outputStreamString != null) {
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
- writer.write(outputStreamString);
- writer.newLine();
- writer.close();
- }
- return readStreamsAndWaitFor(process);
- } catch (Throwable t) {
- throw new SAMException("Unexpected exception executing [" + htsjdk.samtools.util.StringUtil.join(" ", commandParts) + "]", t);
- }
- }
-
- public static String executeAndReturnResult(final String command) {
- try {
- final Process process = Runtime.getRuntime().exec(command);
- final StringBuilderProcessOutputReader err = new StringBuilderProcessOutputReader(process.getErrorStream());
- final Future<?> stderrReader = executorService.submit(err);
- final StringBuilderProcessOutputReader stdout = new StringBuilderProcessOutputReader(process.getInputStream());
- stdout.run();
- // wait for stderr reader to be done
- stderrReader.get();
- final int result = process.waitFor();
- return result == 0 ? stdout.getOutput() : err.getOutput();
- } catch (Throwable t) {
- throw new SAMException("Unexpected exception executing [" + command + "]", t);
- }
-
- }
-
- public static class ExitStatusAndOutput {
- public final int exitStatus;
- public final String stdout;
- /** May be null if interleaved */
- public final String stderr;
-
- public ExitStatusAndOutput(int exitStatus, String stdout, String stderr) {
- this.exitStatus = exitStatus;
- this.stdout = stdout;
- this.stderr = stderr;
- }
- }
-
- /**
- * Execute the command and capture stdout and stderr.
- * @return Exit status of command, and both stderr and stdout interleaved into stdout attribute.
- */
- public static ExitStatusAndOutput executeAndReturnInterleavedOutput(final String command) {
- try {
- final Process process = Runtime.getRuntime().exec(command);
- return interleaveProcessOutput(process);
-
- } catch (Throwable t) {
- throw new SAMException("Unexpected exception executing [" + command + "]", t);
- }
- }
-
- /**
- * Execute the command and capture stdout and stderr.
- * @return Exit status of command, and both stderr and stdout interleaved into stdout attribute.
- */
- public static ExitStatusAndOutput executeAndReturnInterleavedOutput(final String[] commandArray) {
- try {
- final Process process = Runtime.getRuntime().exec(commandArray);
- return interleaveProcessOutput(process);
-
- } catch (Throwable t) {
- throw new SAMException("Unexpected exception executing [" + StringUtil.join(" ", commandArray) + "]", t);
- }
- }
-
- private static ExitStatusAndOutput interleaveProcessOutput(final Process process) throws InterruptedException, IOException {
- final BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
- final BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
- final StringBuilder sb = new StringBuilder();
-
- String stdoutLine = null;
- String stderrLine = null;
- while ((stderrLine = stderrReader.readLine()) != null ||
- (stdoutLine = stdoutReader.readLine()) != null) {
- if (stderrLine!= null) sb.append(stderrLine).append('\n');
- if (stdoutLine!= null) sb.append(stdoutLine).append('\n');
- stderrLine = null;
- stdoutLine = null;
- }
- return new ExitStatusAndOutput(process.waitFor(), sb.toString(), null);
-
- }
-
- private static int readStreamsAndWaitFor(final Process process)
- throws InterruptedException, ExecutionException {
- final Future<?> stderrReader = executorService.submit(new LogErrorProcessOutputReader(process.getErrorStream()));
- new LogInfoProcessOutputReader(process.getInputStream()).run();
- // wait for stderr reader to be done
- stderrReader.get();
- return process.waitFor();
- }
-
-
- /**
- * Runnable that reads off the given stream and logs it somewhere.
- */
- private static abstract class ProcessOutputReader implements Runnable {
- private final BufferedReader reader;
- public ProcessOutputReader(final InputStream stream) {
- reader = new BufferedReader(new InputStreamReader(stream));
- }
-
- @Override
- public void run() {
- try {
- String line;
- while ((line = reader.readLine()) != null) {
- write(line);
- }
- } catch (IOException e) {
- throw new SAMException("Unexpected exception reading from process stream", e);
- }
- }
-
- protected abstract void write(String message);
- }
-
-
- private static class LogErrorProcessOutputReader extends ProcessOutputReader {
- public LogErrorProcessOutputReader(final InputStream stream) { super(stream); }
- @Override protected void write(final String message) { log.error(message); }
- }
-
- private static class LogInfoProcessOutputReader extends ProcessOutputReader {
- public LogInfoProcessOutputReader(final InputStream stream) { super(stream); }
- @Override protected void write(final String message) { log.info(message); }
- }
-
- private static class StringBuilderProcessOutputReader extends ProcessOutputReader {
- private final StringBuilder sb = new StringBuilder();
- public StringBuilderProcessOutputReader(final InputStream stream) { super(stream); }
- @Override protected void write(final String message) { sb.append(message).append('\n'); }
- public String getOutput() { return sb.toString(); }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProgressLogger.java b/src/main/java/htsjdk/samtools/util/ProgressLogger.java
deleted file mode 100644
index 6a293d6..0000000
--- a/src/main/java/htsjdk/samtools/util/ProgressLogger.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * Little progress logging class to facilitate consistent output of useful information when progressing
- * through a stream of SAM records.
- *
- * @author Tim Fennell
- */
-public class ProgressLogger extends AbstractProgressLogger {
-
- private final Log log;
-
- /**
- * Construct a progress logger.
- * @param log the Log object to write outputs to
- * @param n the frequency with which to output (i.e. every N records)
- * @param verb the verb to log, e.g. "Processed, Read, Written".
- * @param noun the noun to use when logging, e.g. "Records, Variants, Loci"
- */
- public ProgressLogger(final Log log, final int n, final String verb, final String noun) {
- super(noun, verb, n);
- this.log = log;
- }
-
- /**
- * Construct a progress logger.
- * @param log the Log object to write outputs to
- * @param n the frequency with which to output (i.e. every N records)
- * @param verb the verb to log, e.g. "Processed, Read, Written".
- */
- public ProgressLogger(final Log log, final int n, final String verb) {
- this(log, n, verb, "records");
- }
-
- /**
- * Construct a progress logger with the desired log and frequency and the verb "Processed".
- * @param log the Log object to write outputs to
- * @param n the frequency with which to output (i.e. every N records)
- */
- public ProgressLogger(final Log log, final int n) { this(log, n, "Processed"); }
-
- /**
- * Construct a progress logger with the desired log, the verb "Processed" and a period of 1m records.
- * @param log the Log object to write outputs to
- */
- public ProgressLogger(final Log log) { this(log, 1000000); }
-
- @Override
- protected void log(final String... message) {
- log.info((Object[])message);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java b/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java
deleted file mode 100644
index a3ef7bc..0000000
--- a/src/main/java/htsjdk/samtools/util/ProgressLoggerInterface.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * An interface defining the record() methods of the Picard-public ProgressLogger implementation.
- */
-public interface ProgressLoggerInterface {
-
- boolean record(final String chrom, final int pos);
- boolean record(final SAMRecord rec);
- boolean record(final SAMRecord... recs);
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java b/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java
deleted file mode 100644
index b0a965c..0000000
--- a/src/main/java/htsjdk/samtools/util/QualityEncodingDetector.java
+++ /dev/null
@@ -1,405 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.fastq.FastqReader;
-import htsjdk.samtools.fastq.FastqRecord;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-import java.util.Set;
-
-import static java.util.Arrays.asList;
-
-/**
- * Utility for determining the type of quality encoding/format (see {@link FastqQualityFormat}) used in a SAM/BAM or Fastq.
- * <p/>
- * To use this class, invoke the detect() method with a {@link SamReader} or {@link FastqReader}, as appropriate. The consumer is
- * responsible for closing readers.
- *
- * @author mccowan at broadinstitute.org
- */
-public class QualityEncodingDetector {
-
- private QualityRecordAggregator qualityAggregator = new QualityRecordAggregator();
-
- /**
- * The maximum number of records over which the detector will iterate before making a determination, by default.
- */
- public static final long DEFAULT_MAX_RECORDS_TO_ITERATE = 10000;
- private static final Log log = Log.getInstance(QualityEncodingDetector.class);
-
- public enum FileContext {FASTQ, SAM}
-
- static class Range {
- final int low, high;
-
- Range(final int low, final int high) {
- this.low = low;
- this.high = high;
- }
-
- boolean contains(final int value) {
- return value <= high && value >= low;
- }
- }
-
- /**
- * Collection of data about the different quality formats and how they are interpreted.
- */
- enum QualityScheme {
- Phred(
- new Range(0, 93), // Raw value range
- new Range(33, 126), // ASCII value range
- asList(new Range(33, 58)), // Ranges into which we expect at least one ASCII value to fall
- FastqQualityFormat.Standard // Associated quality format
- ),
- Solexa(
- new Range(-5, 62),
- new Range(59, 126),
- new ArrayList<Range>(),
- FastqQualityFormat.Solexa
- ),
- Illumina(
- new Range(0, 62),
- new Range(64, 126),
- new ArrayList<Range>(),
- FastqQualityFormat.Illumina
- );
- final Range rawRange, asciiRange;
- /**
- * Ranges into which we expect at least one value to fall if this formatting is being used. For example, for
- * Standard encoding, we expect to at least one ASCII value between 33 and 58 (0 and 25); otherwise, it's
- * probably not Standard-encoded.
- */
- final List<Range> expectedAsciiRanges;
- final FastqQualityFormat qualityFormat;
-
- QualityScheme(final Range rawRange, final Range asciiRange, final List<Range> expectedAsciiRanges, final FastqQualityFormat qualityFormat) {
- this.rawRange = rawRange;
- this.asciiRange = asciiRange;
- this.expectedAsciiRanges = expectedAsciiRanges;
- this.qualityFormat = qualityFormat;
- }
- }
-
- /**
- * Collecting reads and their quality scores for later analysis. Uses ASCII values since those are the inherently
- * "raw-est", read unmodified from the file.
- */
- private static class QualityRecordAggregator {
- private Set<Integer> observedAsciiQualities = new HashSet<Integer>();
-
- public Set<Integer> getObservedAsciiQualities() {
- return Collections.unmodifiableSet(observedAsciiQualities);
- }
-
- /**
- * Adds the FastqRecord's quality scores.
- */
- public void add(final FastqRecord fastqRecord) {
- addAsciiQuality(fastqRecord.getBaseQualityString().getBytes());
- }
-
- /**
- * Adds the SAMRecord's quality scores.
- * <p/>
- * Does not assume Phred quality encoding (for obvious reasons); getBaseQualityString() is used to read the
- * unmodified ASCII score. To elaborate, the {@link SamReader}, which is generating these {@link SAMRecord}s, builds the
- * SAMRecord by subtracting a value from each quality score and storing that transformed value internally.
- * Since we desire original scores here (whatever was in the file to begin with), we effectively undo this
- * transformation by asking {@link SAMRecord} to convert the quality back into the ASCII that was read in the file.
- */
- public void add(final SAMRecord samRecord, final boolean useOriginalQualities) {
- addAsciiQuality(useOriginalQualities && samRecord.getOriginalBaseQualities() != null
- ? SAMUtils.phredToFastq(samRecord.getOriginalBaseQualities()).getBytes()
- : samRecord.getBaseQualityString().getBytes());
- }
-
- public void add(final SAMRecord samRecord) {
- add(samRecord, false);
- }
-
- private void addAsciiQuality(final byte... asciiQualities) {
- for (final byte asciiQuality : asciiQualities) {
- observedAsciiQualities.add((int) asciiQuality);
- }
- }
- }
-
- /**
- * Adds the provided reader's records to the detector.
- *
- * @return The number of records read
- */
- public long add(final long maxRecords, final FastqReader... readers) {
- final Iterator<FastqRecord> iterator = generateInterleavedFastqIterator(readers);
- long recordCount = 0;
- while (iterator.hasNext() && recordCount++ != maxRecords) {
- this.add(iterator.next());
- }
- log.debug(String.format("Read %s records from %s.", recordCount, Arrays.toString(readers)));
- return recordCount;
- }
-
- /**
- * Adds the provided reader's records to the detector.
- *
- * @return The number of records read
- */
- public long add(final long maxRecords, final SamReader reader) {
- return add(maxRecords, reader.iterator());
- }
-
- /**
- * Adds the provided iterator's records (optionally using the original qualities) to the detector.
- *
- * @return The number of records read
- */
- public long add(final long maxRecords, final CloseableIterator<SAMRecord> iterator, final boolean useOriginalQualities) {
- long recordCount = 0;
- try {
- while (iterator.hasNext() && recordCount++ != maxRecords) {
- this.add(iterator.next(), useOriginalQualities);
- }
-
- return recordCount;
- } finally {
- iterator.close();
- }
- }
-
- public long add(final long maxRecords, final CloseableIterator<SAMRecord> iterator) {
- return add(maxRecords, iterator, false);
- }
-
- /**
- * Adds the provided record's qualities to the detector.
- */
- public void add(final FastqRecord fastqRecord) {
- this.qualityAggregator.add(fastqRecord);
- }
-
- /**
- * Adds the provided record's qualities to the detector.
- */
- public void add(final SAMRecord samRecord, final boolean useOriginalQualities) {
- this.qualityAggregator.add(samRecord, useOriginalQualities);
- }
-
- public void add(final SAMRecord samRecord) {
- this.add(samRecord, false);
- }
-
- /**
- * Tests whether or not the detector can make a determination without guessing (i.e., if all but one quality format
- * can be excluded using established exclusion conventions).
- *
- * @return True if more than one format is possible after exclusions; false otherwise
- */
- public boolean isDeterminationAmbiguous() {
- return this.generateCandidateQualities(true).size() > 1;
- }
-
- /**
- * Processes collected quality data and applies rules to determine which quality formats are possible.
- * <p/>
- * Specifically, for each format's known range of possible values (its "quality scheme"), exclude formats if any
- * observed values fall outside of that range. Additionally, exclude formats for which we expect to see at
- * least one quality in a range of values, but do not. (For example, for Phred, we expect to eventually see
- * a value below 58. If we never see such a value, we exclude Phred as a possible format unless the checkExpected
- * flag is set to false in which case we leave Phred as a possible quality format.)
- */
- public EnumSet<FastqQualityFormat> generateCandidateQualities(final boolean checkExpected) {
- final EnumSet<FastqQualityFormat> candidateFormats = EnumSet.allOf(FastqQualityFormat.class);
- final Set<Integer> observedAsciiQualities = this.qualityAggregator.getObservedAsciiQualities();
- if (observedAsciiQualities.isEmpty())
- throw new SAMException("Cannot determine candidate qualities: no qualities found.");
-
- for (final QualityScheme scheme : QualityScheme.values()) {
- final Iterator<Integer> qualityBinIterator = observedAsciiQualities.iterator();
- final Collection<Range> remainingExpectedValueRanges = new ArrayList<Range>(scheme.expectedAsciiRanges);
- while (qualityBinIterator.hasNext()) {
- final int quality = qualityBinIterator.next();
- if (!scheme.asciiRange.contains(quality)) {
- candidateFormats.remove(scheme.qualityFormat);
- }
-
- final Iterator<Range> expectedValueRangeIterator = remainingExpectedValueRanges.iterator();
- while (expectedValueRangeIterator.hasNext()) {
- if (expectedValueRangeIterator.next().contains(quality)) {
- expectedValueRangeIterator.remove();
- }
- }
- }
-
- /**
- * We remove elements from this list as we observe values in the corresponding range; if the list isn't
- * empty, we haven't seen a value in that range. In other words, we haven't seen a value we expected.
- * Consequently, we remove the corresponding format from the running possibilities.
- */
- if (!remainingExpectedValueRanges.isEmpty() && checkExpected) {
- candidateFormats.remove(scheme.qualityFormat);
- }
- }
-
- return candidateFormats;
- }
-
- /**
- * Interleaves FastqReader iterators so that serial-iteration of the result cycles between the constituent iterators.
- */
- private static Iterator<FastqRecord> generateInterleavedFastqIterator(final FastqReader... readers) {
- return new Iterator<FastqRecord>() {
- private Queue<Iterator<FastqRecord>> queue = new LinkedList<Iterator<FastqRecord>>();
-
- {
- for (final FastqReader reader : readers) {
- queue.add(reader.iterator());
- }
- }
-
- public boolean hasNext() {
- // If this returns true, the head of the queue will have a next element
- while (!queue.isEmpty()) {
- if (queue.peek().hasNext()) {
- return true;
- }
- queue.poll();
- }
- return false;
- }
-
- public FastqRecord next() {
- if (!hasNext()) throw new NoSuchElementException();
- final Iterator<FastqRecord> i = queue.poll();
- final FastqRecord result = i.next();
- queue.offer(i);
- return result;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- };
- }
-
- /**
- * Reads through the records in the provided fastq reader and uses their quality scores to determine the quality
- * format used in the fastq.
- *
- * @param readers The fastq readers from which qualities are to be read; at least one must be provided
- * @param maxRecords The maximum number of records to read from the reader before making a determination (a guess,
- * so more records is better)
- * @return The determined quality format
- */
- public static FastqQualityFormat detect(final long maxRecords, final FastqReader... readers) {
- final QualityEncodingDetector detector = new QualityEncodingDetector();
- final long recordCount = detector.add(maxRecords, readers);
- log.debug(String.format("Read %s records from %s.", recordCount, Arrays.toString(readers)));
- return detector.generateBestGuess(FileContext.FASTQ, null);
- }
-
- public static FastqQualityFormat detect(final FastqReader... readers) {
- return detect(DEFAULT_MAX_RECORDS_TO_ITERATE, readers);
- }
-
- /**
- * Reads through the records in the provided SAM reader and uses their quality scores to determine the quality
- * format used in the SAM.
- *
- * @param iterator The iterator from which SAM records are to be read
- * @param maxRecords The maximum number of records to read from the reader before making a determination (a guess,
- * @param useOriginalQualities whether to use the original qualities (if available) rather than the current ones
- * so more records is better)
- * @return The determined quality format
- */
- public static FastqQualityFormat detect(final long maxRecords, final CloseableIterator<SAMRecord> iterator, final boolean useOriginalQualities) {
- final QualityEncodingDetector detector = new QualityEncodingDetector();
- final long recordCount = detector.add(maxRecords, iterator, useOriginalQualities);
- log.debug(String.format("Read %s records.", recordCount));
- return detector.generateBestGuess(FileContext.SAM, null);
-
- }
-
- public static FastqQualityFormat detect(final long maxRecords, final CloseableIterator<SAMRecord> iterator) {
- return detect(maxRecords, iterator, false);
- }
-
- public static FastqQualityFormat detect(final long maxRecords, final SamReader reader) {
- return detect(maxRecords, reader.iterator());
- }
-
- public static FastqQualityFormat detect(final SamReader reader) {
- return detect(DEFAULT_MAX_RECORDS_TO_ITERATE, reader);
- }
-
-
- /**
- * Reads through the records in the provided SAM reader and uses their quality scores to sanity check the expected
- * quality passed in. If the expected quality format is sane we just hand this back otherwise we throw a
- * {@link SAMException}.
- */
- public static FastqQualityFormat detect(final SamReader reader, final FastqQualityFormat expectedQualityFormat) {
- //sanity check expectedQuality
- final QualityEncodingDetector detector = new QualityEncodingDetector();
- final long recordCount = detector.add(DEFAULT_MAX_RECORDS_TO_ITERATE, reader.iterator());
- log.debug(String.format("Read %s records from %s.", recordCount, reader));
- return detector.generateBestGuess(FileContext.SAM, expectedQualityFormat);
- }
-
- /**
- * Make the best guess at the quality format. If an expected quality is passed in the values are sanity checked
- * (ignoring expected range) and if they are deemed acceptable the expected quality is passed back. Otherwise we use
- * a set of heuristics to make our best guess.
- */
- public FastqQualityFormat generateBestGuess(final FileContext context, final FastqQualityFormat expectedQuality) {
- final EnumSet<FastqQualityFormat> possibleFormats;
- if (null != expectedQuality) {
- possibleFormats = this.generateCandidateQualities(false);
- if (possibleFormats.contains(expectedQuality)) {
- return expectedQuality;
- } else {
- throw new SAMException(
- String.format("The quality values do not fall in the range appropriate for the expected quality of %s.",
- expectedQuality.name()));
- }
- } else {
- possibleFormats = this.generateCandidateQualities(true);
- switch (possibleFormats.size()) {
- case 1:
- return possibleFormats.iterator().next();
- case 2:
- if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Illumina, FastqQualityFormat.Solexa))) {
- return FastqQualityFormat.Illumina;
- } else if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Illumina, FastqQualityFormat.Standard))) {
- switch (context) {
- case FASTQ:
- return FastqQualityFormat.Illumina;
- case SAM:
- return FastqQualityFormat.Standard;
- }
- } else if (possibleFormats.equals(EnumSet.of(FastqQualityFormat.Standard, FastqQualityFormat.Solexa))) {
- return FastqQualityFormat.Standard;
- } else throw new SAMException("Unreachable code.");
- case 3:
- throw new SAMException("The quality format cannot be determined: no formats were excluded.");
- case 0:
- throw new SAMException("The quality format cannot be determined: all formats were excluded.");
- default:
- throw new SAMException("Unreachable code.");
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/QualityUtil.java b/src/main/java/htsjdk/samtools/util/QualityUtil.java
deleted file mode 100644
index e9ad9ec..0000000
--- a/src/main/java/htsjdk/samtools/util/QualityUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * Utility class for working with quality scores and error probabilities.
- *
- * @author Tim Fennell
- */
-public final class QualityUtil {
- private static final double[] errorProbabilityByPhredScore;
-
- static {
- errorProbabilityByPhredScore = new double[101];
- for (int i=0; i<errorProbabilityByPhredScore.length; ++i) {
- errorProbabilityByPhredScore[i] = 1d/Math.pow(10d, i/10d);
- }
- }
-
- /** Given a phred score between 0 and 100 returns the probability of error. */
- public static double getErrorProbabilityFromPhredScore(final int i) {
- return errorProbabilityByPhredScore[i];
- }
-
- /** Gets the phred score for any given probability of error. */
- public static int getPhredScoreFromErrorProbability(final double probability) {
- return (int) Math.round(-10 * Math.log10(probability));
- }
-
- /** Gets the phred score given the specified observations and errors. */
- public static int getPhredScoreFromObsAndErrors(final double observations, final double errors) {
- return getPhredScoreFromErrorProbability(errors / observations);
- }
-
- /**
- * Calculates the sum of error probabilities for all read bases in the SAM record. Takes
- * the SAM record as opposed to the qualities directly so that it can make sure to count
- * no-calls as 1 instead of what the quality score says.
- * */
- public static double sumOfErrorProbabilities(final SAMRecord rec) {
- final byte[] bases = rec.getReadBases();
- final byte[] quals = rec.getBaseQualities();
-
- double sum = 0;
-
- for (int i=0; i<bases.length; ++i) {
- if (SequenceUtil.isNoCall(bases[i])) ++sum;
- else sum += QualityUtil.getErrorProbabilityFromPhredScore(quals[i]);
- }
-
- return sum;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java
deleted file mode 100644
index 302825a..0000000
--- a/src/main/java/htsjdk/samtools/util/ReferenceSequenceMask.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Interface for specifying loci of interest for genotype calling and other operations.
- * It is a requirement that the sequences be probed in ascending order.
- *
- * @author alecw at broadinstitute dot oh are gee
- */
-public interface ReferenceSequenceMask {
-
- /**
- * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
- * @return true if the mask is set for the given sequence and position
- */
- boolean get(int sequenceIndex, int position);
-
- /**
- * It is required that sequenceIndex is >= any previous sequenceIndex passed to this class.
- * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
- */
- int nextPosition(int sequenceIndex, int position);
-
- /**
- * @return Largest sequence index for which there are set bits.
- */
- int getMaxSequenceIndex();
-
- /**
- * @return the largest position on the last sequence index
- */
- int getMaxPosition();
-}
diff --git a/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java b/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java
deleted file mode 100644
index ebcb44f..0000000
--- a/src/main/java/htsjdk/samtools/util/RelativeIso8601Date.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package htsjdk.samtools.util;
-
-import java.util.Date;
-
-/**
- * Like {@link Iso8601Date}, but also comes in a "lazy now" flavor.
- * <p/>
- * When "lazy now" mode is enabled, this instance's date value is undefined until the first time it is queried, at which time it is set to
- * {@link System#currentTimeMillis()}. This value is returned on subsequent queries, so it is consistent.
- * <p/>
- * The "lazy state" is conveyed via {@link #toString()}. A "lazy now" instance will answer {@link #toString()} with
- * {@link #LAZY_NOW_LABEL} if the time has not yet been queried/set, or a {@link Iso8601Date}-formatted date of the query time if it
- * has been queried. This characteristic is useful for serialization and persistence purposes.
- * <p/>
- * Consumers can create "lazy now" instances via the {@link #generateLazyNowInstance()} factory method or by passing {@link #LAZY_NOW_LABEL} to
- * {@link #RelativeIso8601Date(String)}.
- *
- * @author mccowan
- */
-public class RelativeIso8601Date extends Iso8601Date {
-
- public static final String LAZY_NOW_LABEL = "NOW";
-
- /** Flag that indicates this instance is lazy and has not yet been queried (and so its value should be updated at the next query). */
- private boolean doSetTimeNextQuery = false;
-
- /** Returns a "lazy now" instance. */
- public static RelativeIso8601Date generateLazyNowInstance() {
- return new RelativeIso8601Date(LAZY_NOW_LABEL);
- }
-
- public RelativeIso8601Date(final Date date) {
- super(date);
- doSetTimeNextQuery = false;
- }
-
- public RelativeIso8601Date(final String dateStr) {
- /**
- * We must pass a date parsable {@link Iso8601Date#Iso8601Date(String)}; we will never actually read the passed value, so it doesn't
- * matter what it is.
- */
- super(LAZY_NOW_LABEL.equals(dateStr) ? new Iso8601Date(new Date()).toString() : dateStr);
- doSetTimeNextQuery = LAZY_NOW_LABEL.equals(dateStr);
- }
-
- /** Updates the time stored by this instance if it's a "lazy now" instance and has never been stored. */
- private synchronized void conditionallyUpdateTime() {
- if (doSetTimeNextQuery) {
- super.setTime(System.currentTimeMillis());
- doSetTimeNextQuery = false;
- }
- }
-
- /**
- * Returns a {@link String} representation of this date.
- *
- * @return An {@link Iso8601Date}-formatted string, or the value of {@link #LAZY_NOW_LABEL} if this is a "lazy now" instance.
- */
- @Override
- public String toString() {
- return doSetTimeNextQuery ? LAZY_NOW_LABEL : super.toString();
- }
-
- @Override
- public long getTime() {
- conditionallyUpdateTime();
- return super.getTime();
- }
-
- @Override
- public boolean after(final Date when) {
- conditionallyUpdateTime();
- return super.after(when);
- }
-
- @Override
- public boolean before(final Date when) {
- conditionallyUpdateTime();
- return super.before(when);
- }
-
- @Override
- public Object clone() {
- conditionallyUpdateTime();
- return super.clone();
- }
-
- @Override
- public int compareTo(final Date anotherDate) {
- conditionallyUpdateTime();
- return super.compareTo(anotherDate);
- }
-
- @Override
- public boolean equals(final Object obj) {
- conditionallyUpdateTime();
- return super.equals(obj);
- }
-
- @Override
- @Deprecated
- public int getDate() {
- conditionallyUpdateTime();
- return super.getDate();
- }
-
- @Override
- @Deprecated
- public int getDay() {
- conditionallyUpdateTime();
- return super.getDay();
- }
-
- @Override
- @Deprecated
- public int getHours() {
- conditionallyUpdateTime();
- return super.getHours();
- }
-
- @Override
- @Deprecated
- public int getMinutes() {
- conditionallyUpdateTime();
- return super.getMinutes();
- }
-
- @Override
- @Deprecated
- public int getMonth() {
- conditionallyUpdateTime();
- return super.getMonth();
- }
-
- @Override
- @Deprecated
- public int getSeconds() {
- conditionallyUpdateTime();
- return super.getSeconds();
- }
-
- @Override
- @Deprecated
- public int getTimezoneOffset() {
- conditionallyUpdateTime();
- return super.getTimezoneOffset();
- }
-
- @Override
- @Deprecated
- public int getYear() {
- conditionallyUpdateTime();
- return super.getYear();
- }
-
- @Override
- public int hashCode() {
- conditionallyUpdateTime();
- return super.hashCode();
- }
-
- @Override
- @Deprecated
- public void setDate(final int date) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setHours(final int hours) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setMinutes(final int minutes) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setMonth(final int month) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setSeconds(final int seconds) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setTime(final long time) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- @Deprecated
- public void setYear(final int year) {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java b/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java
deleted file mode 100644
index 51f91da..0000000
--- a/src/main/java/htsjdk/samtools/util/ResourceLimitedMap.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * LRU collection class for managing objects that place some resource burden such that not too many of them
- * can existing in the VM at one time, but they can be reconstructed ias necessary.
- * Original motivation was for an LRU cache of FileOutputStreams.
- *
- * @author alecw at broadinstitute.org
- */
-public class ResourceLimitedMap<Key, Value> {
- private static final float hashTableLoadFactor = 0.75f;
-
- private final LinkedHashMap<Key,Value> map;
- private final int cacheSize;
- private final ResourceLimitedMapFunctor<Key, Value> functor;
-
- /**
- * Create LRU cache
- * @param cacheSize Max number of objects to be stored in the cache.
- * @param functor Encapsulates methods for creating a new object if it isn't in the cache, and
- * for finalizing an object that is getting LRU'ed out of the cache.
- */
- public ResourceLimitedMap(final int cacheSize, final ResourceLimitedMapFunctor<Key, Value> functor) {
- this.cacheSize = cacheSize;
- this.functor = functor;
- // Make hash table big enough so that it never gets resized.
- final int hashTableCapacity = (int)Math.ceil(cacheSize / hashTableLoadFactor) + 1;
-
- // Created LinkedHashMap in LRU mode
- map = new LinkedHashMap<Key,Value>(hashTableCapacity, hashTableLoadFactor, true) {
- @Override protected boolean removeEldestEntry (final Map.Entry<Key,Value> eldest) {
- if (size() > ResourceLimitedMap.this.cacheSize) {
- ResourceLimitedMap.this.functor.finalizeValue(eldest.getKey(), eldest.getValue());
- return true;
- } else {
- return false;
- }
- }
- };
- }
-
- /**
- * Return an existing value, or create a new one if necessary. If creating a new one and the
- * cache is full, the eldest object is pushed out of the cache.
- * @param key Key of desired value.
- * @return Either existing value, or new value created from key and inserted into map.
- */
- public Value get(final Key key) {
- if (!map.containsKey(key)) {
- map.put(key, functor.makeValue(key));
- }
- return map.get(key);
- }
-
- public Value remove(final Key key) {
- return map.remove(key);
- }
-
- /**
- * Determine if the map contains the given key. Note that even if the map does not contain
- * the key, get(key) will return a value, because one will be created.
- * @param key
- * @return true if the map currently contains the given key. It is unknown whether the map
- * may have contained the key in the past.
- */
- public boolean containsKey(final Key key) {
- return map.containsKey(key);
- }
-
- /**
- * Remove all the values from the map, and call functory.finalizeValue() on each of them.
- */
- public void finalizeAll() {
- for (final Map.Entry<Key, Value> entry : map.entrySet()) {
- functor.finalizeValue(entry.getKey(), entry.getValue());
- }
- map.clear();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java b/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java
deleted file mode 100644
index 6ca8031..0000000
--- a/src/main/java/htsjdk/samtools/util/ResourceLimitedMapFunctor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * c.f. ResourceLimitedMap for details.
- * @param <Key> Used to find and create value.
- * @param <Value> Type stored in ResourceLimitedMap, which is created as necessary
- * and finalized when it is the least-recently used.
- */
-public interface ResourceLimitedMapFunctor<Key, Value> {
-
- /**
- * Create a new value corresponding to the key
- * @param key
- * @return a new value corresponding to the key
- */
- Value makeValue(final Key key);
-
- /**
- * Clean up an existing value in conjunction with removing from ResourceLimitedMap.
- * @param key
- * @param value
- */
- void finalizeValue(final Key key, final Value value);
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java b/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java
deleted file mode 100644
index 2e80fa6..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeEOFException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Thrown by various codecs to indicate EOF without having to clutter the API with throws clauses
- */
-public class RuntimeEOFException extends SAMException {
- public RuntimeEOFException() {
- }
-
- public RuntimeEOFException(final String s) {
- super(s);
- }
-
- public RuntimeEOFException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public RuntimeEOFException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeIOException.java b/src/main/java/htsjdk/samtools/util/RuntimeIOException.java
deleted file mode 100644
index 571571b..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeIOException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-/**
- * Thrown by various IO classes to indicate IOException without having to clutter the API with throws clauses
- */
-public class RuntimeIOException extends SAMException {
- public RuntimeIOException() {
- }
-
- public RuntimeIOException(final String s) {
- super(s);
- }
-
- public RuntimeIOException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public RuntimeIOException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java b/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java
deleted file mode 100644
index 570a64e..0000000
--- a/src/main/java/htsjdk/samtools/util/RuntimeScriptException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Pierre Lindenbaum PhD @yokofakun
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-/**
- * Thrown by classes handling script engines like the javascript-based filters for SAM/VCF
- */
-public class RuntimeScriptException extends RuntimeException {
- public RuntimeScriptException() {
- }
-
- public RuntimeScriptException(final String s) {
- super(s);
- }
-
- public RuntimeScriptException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public RuntimeScriptException(final Throwable throwable) {
- super(throwable);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java b/src/main/java/htsjdk/samtools/util/SamLocusIterator.java
deleted file mode 100644
index 7a60756..0000000
--- a/src/main/java/htsjdk/samtools/util/SamLocusIterator.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SamReader;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Iterator that traverses a SAM File, accumulating information on a per-locus basis.
- * Optionally takes a target interval list, in which case the loci returned are the ones covered by
- * the interval list. If no target interval list, whatever loci are covered by the input reads are returned.
- * By default duplicate reads and non-primary alignments are filtered out. Filtering may be changed
- * via setSamFilters().
- *
- * @author alecw at broadinstitute.org
- */
-
-public class SamLocusIterator extends AbstractLocusIterator<SamLocusIterator.RecordAndOffset, SamLocusIterator.LocusInfo> {
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments. Do not use
- * BAM index even if available.
- *
- * @param samReader must be coordinate sorted
- */
- public SamLocusIterator(final SamReader samReader) {
- this(samReader, null);
- }
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments. Do not use
- * BAM index even if available.
- *
- * @param samReader must be coordinate sorted
- * @param intervalList Either the list of desired intervals, or null. Note that if an intervalList is
- * passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
- */
- public SamLocusIterator(final SamReader samReader, final IntervalList intervalList) {
- this(samReader, intervalList, samReader.hasIndex());
- }
-
- /**
- * Prepare to iterate through the given SAM records, skipping non-primary alignments
- *
- * @param samReader must be coordinate sorted
- * @param intervalList Either the list of desired intervals, or null. Note that if an intervalList is
- * passed in that is not coordinate sorted, it will eventually be coordinated sorted by this class.
- * @param useIndex If true, do indexed lookup to improve performance. Not relevant if intervalList == null.
- * It is no longer the case the useIndex==true can make performance worse. It should always perform at least
- * as well as useIndex==false, and generally will be much faster.
- */
- public SamLocusIterator(final SamReader samReader, final IntervalList intervalList, final boolean useIndex) {
- super(samReader, intervalList, useIndex);
- }
-
- /**
- * Capture the loci covered by the given SAMRecord in the LocusInfos in the accumulator,
- * creating new LocusInfos as needed. RecordAndOffset object are created for each aligned base of
- * <code>SAMRecord</code>.
- *
- * @param rec SAMRecord to process and add to <code>LocusInfo</code>
- */
- @Override
- void accumulateSamRecord(final SAMRecord rec) {
- // get the accumulator offset
- int accOffset = getAccumulatorOffset(rec);
-
- final int minQuality = getQualityScoreCutoff();
- final boolean dontCheckQualities = minQuality == 0;
- final byte[] baseQualities = dontCheckQualities ? null : rec.getBaseQualities();
-
- // interpret the CIGAR string and add the base info
- for (final AlignmentBlock alignmentBlock : rec.getAlignmentBlocks()) {
- final int readStart = alignmentBlock.getReadStart();
- final int refStart = alignmentBlock.getReferenceStart();
- final int blockLength = alignmentBlock.getLength();
-
- for (int i = 0; i < blockLength; ++i) {
- // 0-based offset into the read of the current base
- final int readOffset = readStart + i - 1;
-
- // if the quality score cutoff is met, accumulate the base info
- if (dontCheckQualities || baseQualities.length == 0 || baseQualities[readOffset] >= minQuality) {
- // 0-based offset from the aligned position of the first base in the read to the aligned position of the current base.
- final int refOffset = refStart + i - accOffset;
- accumulator.get(refOffset).add(new RecordAndOffset(rec, readOffset));
- }
- }
- }
- }
-
- /**
- * Requires that the accumulator for the record is previously fill with
- * {@link #accumulateSamRecord(htsjdk.samtools.SAMRecord)}.
- * Include in the LocusInfo the indels; the quality threshold does not affect insertions/deletions
- */
- @Override
- void accumulateIndels(SAMRecord rec) {
- // get the cigar elements
- final List<CigarElement> cigar = rec.getCigar().getCigarElements();
- // 0-based offset into the read of the current base
- int readBase = 0;
- // 0-based offset for the reference of the current base
- // the accumulator could have the previous position because an indel is accumulating
- int refBase = rec.getAlignmentStart() - getAccumulatorOffset(rec);
- // iterate over the cigar element
- for (int elementIndex = 0; elementIndex < cigar.size(); elementIndex++) {
- final CigarElement e = cigar.get(elementIndex);
- final CigarOperator operator = e.getOperator();
- if (operator.equals(CigarOperator.I)) {
- System.err.println("");
- // insertions are included in the previous base
- accumulator.get(refBase - 1).addInserted(rec, readBase);
- readBase += e.getLength();
- } else if (operator.equals(CigarOperator.D)) {
- // accumulate for each position that spans the deletion
- for (int i = 0; i < e.getLength(); i++) {
- // the offset is the one for the previous base
- accumulator.get(refBase + i).addDeleted(rec, readBase - 1);
- }
- refBase += e.getLength();
- } else {
- if (operator.consumesReadBases()) readBase += e.getLength();
- if (operator.consumesReferenceBases()) refBase += e.getLength();
- }
- }
- }
-
- /**
- * Ensure that the queue is populated and get the accumulator offset for the current record
- */
- private int getAccumulatorOffset(SAMRecord rec) {
- final SAMSequenceRecord ref = getReferenceSequence(rec.getReferenceIndex());
- final int alignmentStart = rec.getAlignmentStart();
- final int alignmentEnd = rec.getAlignmentEnd();
- final int alignmentLength = alignmentEnd - alignmentStart;
- // get the offset for an insertion if we are tracking them
- final int insOffset = (includeIndels && startWithInsertion(rec.getCigar())) ? 1 : 0;
- // if there is an insertion in the first base and it is not tracked in the accumulator, add it
- if (insOffset == 1 && accumulator.isEmpty()) {
- accumulator.add(new LocusInfo(ref, alignmentStart - 1));
- }
- // Ensure there are LocusInfos up to and including this position
- for (int i = accumulator.size(); i <= alignmentLength + insOffset; ++i) {
- accumulator.add(new LocusInfo(ref, alignmentStart + i - insOffset));
- }
- return alignmentStart - insOffset;
- }
-
-
- /**
- * @param rec aligned SamRecord
- * @param readOffset offset from start of read
- * @param length 1, as object represents only one aligned base
- * @param refPos -1, as this filed isn't used for this implementation
- * @param type null for this implementation
- * @return created RecordAndOffset
- */
- @Override
- RecordAndOffset createRecordAndOffset(SAMRecord rec, int readOffset, int length, int refPos) {
- return new RecordAndOffset(rec, readOffset);
- }
-
- /**
- * @param referenceSequence processed reference sequence
- * @param lastPosition last processed reference locus position
- * @return <code>LocusInfo<T></code> for the lastPosition
- */
- @Override
- LocusInfo createLocusInfo(SAMSequenceRecord referenceSequence, int lastPosition) {
- return new LocusInfo(referenceSequence, lastPosition);
- }
-
- // --------------------------------------------------------------------------------------------
- // Helper methods below this point...
- // --------------------------------------------------------------------------------------------
-
- /**
- * Implementation of <code>AbstractRecordAndOffset</code> class for <code>SamLocusIterator</code>.
- * One object represents one aligned base of inner <code>SAMRecord</code>.
- */
- public static class RecordAndOffset extends AbstractRecordAndOffset {
-
- /**
- * @param record inner <code>SAMRecord</code>
- * @param offset 0-based offset from the start of <code>SAMRecord</code>
- */
- public RecordAndOffset(final SAMRecord record, final int offset) {
- super(record, offset);
- }
- }
-
- /**
- * The unit of iteration. Holds information about the locus (the SAMSequenceRecord and 1-based position
- * on the reference), plus List of ReadAndOffset objects, one for each read that overlaps the locus;
- * two more List_s_ of ReadAndOffset objects include reads that overlap the locus with insertions and deletions
- * respectively
- */
- public static final class LocusInfo extends AbstractLocusInfo<RecordAndOffset> {
-
- private List<RecordAndOffset> deletedInRecord = null;
- private List<RecordAndOffset> insertedInRecord = null;
-
- /**
- * @param referenceSequence reference sequence at which the reads are aligned
- * @param position position in the sequence at which the reads are aligned
- */
- public LocusInfo(SAMSequenceRecord referenceSequence, int position) {
- super(referenceSequence, position);
- }
-
- /**
- * Accumulate info for one read with a deletion
- */
- public void addDeleted(final SAMRecord read, int previousPosition) {
- if (deletedInRecord == null) {
- deletedInRecord = new ArrayList<>();
- }
- deletedInRecord.add(new RecordAndOffset(read, previousPosition));
- }
-
- /**
- * Accumulate info for one read with an insertion.
- * For this locus, the reads in the insertion are included also in recordAndOffsets
- */
-
- public void addInserted(final SAMRecord read, int firstPosition) {
-
- if (insertedInRecord == null) {
- insertedInRecord = new ArrayList<>();
- }
- insertedInRecord.add(new RecordAndOffset(read, firstPosition));
- }
-
- public List<RecordAndOffset> getDeletedInRecord() {
- return (deletedInRecord == null) ? Collections.emptyList() : Collections.unmodifiableList(deletedInRecord);
- }
-
- public List<RecordAndOffset> getInsertedInRecord() {
- return (insertedInRecord == null) ? Collections.emptyList() : Collections.unmodifiableList(insertedInRecord);
- }
-
- /**
- * @return the number of records overlapping the position, with deletions included if they are being tracked.
- */
- @Override
- public int size() {
- return super.size() + ((deletedInRecord == null) ? 0 : deletedInRecord.size());
- }
-
-
- /**
- * @return <code>true</code> if all the RecordAndOffset lists are empty;
- * <code>false</code> if at least one have records
- */
- @Override
- public boolean isEmpty() {
- return getRecordAndPositions().isEmpty() &&
- (deletedInRecord == null || deletedInRecord.isEmpty()) &&
- (insertedInRecord == null || insertedInRecord.isEmpty());
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java b/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java
deleted file mode 100644
index 5d173a5..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordIntervalIteratorFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.QueryInterval;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.filter.IntervalFilter;
-import htsjdk.samtools.filter.SamRecordFilter;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Create an iterator over a {@link SamReader} that only returns reads that overlap one of the intervals
- * in an interval list.
- *
- * @author alecw at broadinstitute.org
- */
-public class SamRecordIntervalIteratorFactory {
-
- /**
- * @param samReader
- * @param uniqueIntervals list of intervals of interest, with overlaps merged, in coordinate order
- * @param useIndex if false, do not use a BAM index even if it is present.
- * @return an iterator that will be filtered so that only SAMRecords overlapping the intervals
- * in uniqueIntervals will be returned. If a BAM index is available, it will be used to improve performance.
- * Note however that if there are many intervals that cover a great deal of the genome, using the BAM
- * index may actually make performance worse.
- */
- public CloseableIterator<SAMRecord> makeSamRecordIntervalIterator(final SamReader samReader,
- final List<Interval> uniqueIntervals,
- final boolean useIndex) {
- if (!samReader.hasIndex() || !useIndex) {
- final int stopAfterSequence;
- final int stopAfterPosition;
- if (uniqueIntervals.isEmpty()) {
- stopAfterSequence = -1;
- stopAfterPosition = -1;
- } else {
- final Interval lastInterval = uniqueIntervals.get(uniqueIntervals.size() - 1);
- stopAfterSequence = samReader.getFileHeader().getSequenceIndex(lastInterval.getContig());
- stopAfterPosition = lastInterval.getEnd();
- }
- final IntervalFilter intervalFilter = new IntervalFilter(uniqueIntervals, samReader.getFileHeader());
- return new StopAfterFilteringIterator(samReader.iterator(), intervalFilter, stopAfterSequence, stopAfterPosition);
- } else {
- final QueryInterval[] queryIntervals = new QueryInterval[uniqueIntervals.size()];
- for (int i = 0; i < queryIntervals.length; ++i) {
- final Interval inputInterval = uniqueIntervals.get(i);
- queryIntervals[i] = new QueryInterval(samReader.getFileHeader().getSequenceIndex(inputInterval.getContig()),
- inputInterval.getStart(), inputInterval.getEnd());
- }
- return samReader.queryOverlapping(queryIntervals);
- }
- }
-
- /**
- * Halt iteration after a read is encountered that starts after the given sequence and position.
- * Note that most of this code is copied from FilteringSamIterator. It would be nice just to override getNextRecord,
- * but that method is called FilteringSamIterator ctor, so the stopAfter members can't be initialized before
- * it is called.
- * FilteringSamIterator ctor could take a boolean "advance" that would tell it whether or not to call getNextRecord
- * in the ctor, so that it could be delayed in the subclass. If this pattern happens again, we should do that.
- */
- private class StopAfterFilteringIterator implements CloseableIterator<SAMRecord> {
- private final int stopAfterSequence;
- private final int stopAfterPosition;
- private final Iterator<SAMRecord> iterator;
- private final SamRecordFilter filter;
- private SAMRecord next = null;
-
- private StopAfterFilteringIterator(Iterator<SAMRecord> iterator, SamRecordFilter filter,
- int stopAfterSequence, int stopAfterPosition) {
- this.stopAfterSequence = stopAfterSequence;
- this.stopAfterPosition = stopAfterPosition;
- this.iterator = iterator;
- this.filter = filter;
- next = getNextRecord();
- }
-
-
- /**
- * Returns true if the iteration has more elements.
- *
- * @return true if the iteration has more elements. Otherwise returns false.
- */
- public boolean hasNext() {
- return next != null;
- }
-
- /**
- * Returns the next element in the iteration.
- *
- * @return the next element in the iteration
- * @throws java.util.NoSuchElementException
- */
- public SAMRecord next() {
- if (next == null) {
- throw new NoSuchElementException("Iterator has no more elements.");
- }
- final SAMRecord result = next;
- next = getNextRecord();
- return result;
- }
-
- /**
- * Required method for Iterator API.
- *
- * @throws UnsupportedOperationException
- */
- public void remove() {
- throw new UnsupportedOperationException("Remove() not supported by FilteringSamIterator");
- }
-
- public void close() {
- CloserUtil.close(iterator);
- }
-
- protected SAMRecord getNextRecord() {
- while (iterator.hasNext()) {
- SAMRecord record = iterator.next();
- if (record.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) return null;
- else if (record.getReferenceIndex() > stopAfterSequence) return null;
- else if (record.getReferenceIndex() == stopAfterSequence && record.getAlignmentStart() > stopAfterPosition) {
- return null;
- }
- if (!filter.filterOut(record)) {
- return record;
- }
- }
- return null;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java b/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java
deleted file mode 100644
index 46cf8bf..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordTrackingBuffer.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.BAMRecordCodec;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-
-import java.io.File;
-import java.util.ArrayDeque;
-import java.util.BitSet;
-import java.util.Deque;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * This class stores SAMRecords for return. The purpose of this class is to buffer records that need to be modified or processed in some
- * fashion, and only return (or emit) them when they have been recorded as being fully examined. If we have too many records in RAM,
- * we can spill over to disk. The order in which they are given (via SamRecordWithOrdinal) determines their order of being returned. It is the
- * responsibility of the user of this class to make sure all records have unique index and are added in order.
- *
- * When a record is examined, we also store a result state. This is currently a boolean to reduce on memory and disk footprint.
- *
- * We store groups of records in blocks and the size of these blocks can be controlled. If we have too many records in RAM, we start
- * spilling blocks to disk.
- *
- * Users should check isEmpty() to see if any records are still being tracked. If so, they should check canEmit() to see if the
- * next record can be returned. If so, they can call next() to get that record.
- *
- * When users are done with this structure, call close().
- *
- * @author bradtaylor
- */
-public class SamRecordTrackingBuffer<T extends SamRecordWithOrdinal> {
- private int availableRecordsInMemory; // how many more records can we store in memory
- private final int blockSize; // the size of each block
- private final List<File> tmpDirs; // the list of temporary directories to use
- private long queueHeadRecordIndex; // the index of the head of the buffer
- private long queueTailRecordIndex; // the index of the tail of the buffer
- private final Deque<BufferBlock> blocks; // the queue of blocks, in which records are contained
- private final SAMFileHeader header;
-
- private final Class<T> clazz; // the class to create
-
- /**
- * @param maxRecordsInRam how many records to buffer before spilling to disk
- * @param blockSize the number of records in a given block
- * @param tmpDirs the temporary directories to use when spilling to disk
- * @param header the header
- * @param clazz the class that extends SamRecordWithOrdinal
- */
- public SamRecordTrackingBuffer(final int maxRecordsInRam, final int blockSize, final List<File> tmpDirs, final SAMFileHeader header, final Class<T> clazz) {
- this.availableRecordsInMemory = maxRecordsInRam;
- this.blockSize = blockSize;
- this.tmpDirs = tmpDirs;
- this.queueHeadRecordIndex = -1;
- this.queueTailRecordIndex = -1;
- this.blocks = new ArrayDeque<BufferBlock>();
- this.header = header;
- this.clazz = clazz;
- }
-
- /** Returns true if we are tracking no records, false otherwise */
- public boolean isEmpty() { return (blocks.isEmpty() || this.blocks.getFirst().isEmpty()); }
-
- /** Returns true if we can return the next record (it has been examined). */
- public boolean canEmit() { return (!this.blocks.isEmpty() && this.blocks.getFirst().canEmit()); }
-
- /**
- * Add the given SAMRecordIndex to the buffer. The records must be added in order.
- * @param samRecordWithOrdinal The samRecordWithOrdinal to be added
- */
- public void add(final SamRecordWithOrdinal samRecordWithOrdinal) {
- if (this.isEmpty()) {
- this.queueHeadRecordIndex = samRecordWithOrdinal.getRecordOrdinal();
- this.queueTailRecordIndex = samRecordWithOrdinal.getRecordOrdinal() - 1;
- }
- this.queueTailRecordIndex++;
- if (samRecordWithOrdinal.getRecordOrdinal() != this.queueTailRecordIndex) {
- throw new SAMException("The records were added out of order");
- }
- // If necessary, create a new block, using as much ram as available up to its total size
- if (this.blocks.isEmpty() || !this.blocks.getLast().canAdd()) {
- // once ram is given to a block, we can't give it to another block (until some is recovered from the head of the queue)
- final int blockRam = Math.min(this.blockSize, this.availableRecordsInMemory);
- this.availableRecordsInMemory = this.availableRecordsInMemory - blockRam;
- final BufferBlock block = new BufferBlock(this.blockSize, blockRam, this.tmpDirs, this.header, samRecordWithOrdinal.getRecordOrdinal());
- this.blocks.addLast(block);
- }
- this.blocks.getLast().add(samRecordWithOrdinal);
- }
-
- /**
- * Returns the next element in the iteration.
- *
- * @return The next element in the iteration.
- * @throws java.util.NoSuchElementException if the buffer is empty.
- * @throws SAMException if the buffer is not competent to emit (canEmit returns false)
- */
- public SamRecordWithOrdinal next() {
- if (this.isEmpty())
- throw new NoSuchElementException("Attempting to remove an element from an empty SamRecordTrackingBuffer");
- final BufferBlock headBlock = this.blocks.getFirst();
- if (!headBlock.canEmit())
- throw new SAMException("Attempting to get a samRecordWithOrdinal from the SamRecordTrackingBuffer that has not been through " +
- "marked as examined. canEmit() must return true in order to call next()");
-
- // If the samRecordWithOrdinal was stored in memory, reclaim its ram for use in additional blocks at tail of queue
- // NB: this must be checked before calling next(), as that method updates the block-head
- if (!headBlock.headRecordIsFromDisk()) {
- this.availableRecordsInMemory++;
- }
- final SamRecordWithOrdinal samRecordWithOrdinal = headBlock.next();
- if (headBlock.hasBeenDrained()) {
- blocks.poll(); // remove the block as it is now empty
- headBlock.clear(); // free any disk io resources associated with empty block
- }
- this.queueHeadRecordIndex++;
- return samRecordWithOrdinal;
- }
-
- /** Removes the next record from this buffer */
- public void remove() { this.next(); }
-
- /**
- * Return the total number of elements in the queue, both in memory and on disk
- */
- public long size() { return this.queueTailRecordIndex - this.queueHeadRecordIndex + 1; }
-
- /** Returns the block that holds the sam record at the given index, null if no such block exists */
- private BufferBlock getBlock(final SamRecordWithOrdinal samRecordWithOrdinal) {
- for (final BufferBlock block : this.blocks) {
- if (block.getStartIndex() <= samRecordWithOrdinal.getRecordOrdinal() && block.getEndIndex() >= samRecordWithOrdinal.getRecordOrdinal()) {
- return block;
- }
- }
- return null;
- }
-
- /** Returns true if this buffer contains the record at the given index, false otherwise */
- public boolean contains(final SamRecordWithOrdinal samRecordWithOrdinal) {
- return (null != getBlock(samRecordWithOrdinal));
- }
-
- /**
- * Mark the current samRecordWithOrdinal as having been examined.
- *
- * @param samRecordWithOrdinal The samRecordWithOrdinal to be marked
- * @param resultState Boolean flag indicating the result of the examination of this record.
- * @throws SAMException if the provided recordIndex is not found within the SamRecordTrackingBuffer
- */
- public void setResultState(final SamRecordWithOrdinal samRecordWithOrdinal, final boolean resultState) {
- final BufferBlock block = getBlock(samRecordWithOrdinal);
- if (null == block) {
- throw new SAMException("Attempted to set examined information on a samRecordWithOrdinal whose index is not found " +
- "in the SamRecordTrackingBuffer. recordIndex: " + samRecordWithOrdinal.getRecordOrdinal());
- }
- block.setResultState(samRecordWithOrdinal, resultState);
- }
-
- /**
- * Close IO resources associated with each underlying BufferBlock
- */
- public void close() {
- while (!blocks.isEmpty()) {
- final BufferBlock block = blocks.pollFirst();
- block.clear();
- }
- }
-
- /**
- * This stores blocks of records, either in memory or on disk, or both!
- */
- private class BufferBlock {
- private final DiskBackedQueue<SAMRecord> recordsQueue;
- private final int maxBlockSize;
- private long currentStartIndex;
- private final long originalStartIndex;
- private long endIndex;
-
- private final BitSet wasExaminedIndexes;
- private final BitSet resultStateIndexes;
-
- /** Creates an empty block buffer, with an allowable # of records in RAM */
- public BufferBlock(final int maxBlockSize, final int maxBlockRecordsInMemory, final List<File> tmpDirs,
- final SAMFileHeader header,
- final long originalStartIndex) {
- this.recordsQueue = DiskBackedQueue.newInstance(new BAMRecordCodec(header), maxBlockRecordsInMemory, tmpDirs);
- this.maxBlockSize = maxBlockSize;
- this.currentStartIndex = 0;
- this.endIndex = -1;
- this.wasExaminedIndexes = new BitSet(maxBlockSize);
- this.resultStateIndexes = new BitSet(maxBlockSize);
- this.originalStartIndex = originalStartIndex;
- }
-
- /**
- * Check that the tail of the block has not grown past the maximum block size (even if records were popped) and that the underlying queue can be added to.
- * TODO - reimplement with a circular byte array buffer PROVIDED RECORDS ARE IN MEMORY
- * @return
- */
- public boolean canAdd() { return (this.endIndex - this.originalStartIndex + 1) < this.maxBlockSize && this.recordsQueue.canAdd(); }
-
- /** Returns true if the record at the front of the buffer is on disk */
- public boolean headRecordIsFromDisk() { return this.recordsQueue.headRecordIsFromDisk(); }
-
- /**
- * Check whether we have read all possible records from this block (and it is available to be destroyed)
- * @return true if we have read the last /possible/ record (ie the block size, or if !canAdd the end index)
- */
- public boolean hasBeenDrained() {
- final long maximalIndex = (this.canAdd()) ? (this.originalStartIndex + this.maxBlockSize) : this.endIndex;
- return this.currentStartIndex > maximalIndex; //NB: watch out for an off by one here
- }
-
- /** Gets the index of the first record in this block */
- public long getStartIndex() { return this.currentStartIndex; }
-
- /** Gets the index of the last record in this block */
- public long getEndIndex() { return this.endIndex; }
-
- /** Add a record to this block */
- public void add(final SamRecordWithOrdinal samRecordWithOrdinal) {
- if (this.recordsQueue.canAdd()) {
- if (this.recordsQueue.isEmpty()) {
- this.currentStartIndex = samRecordWithOrdinal.getRecordOrdinal();
- this.endIndex = samRecordWithOrdinal.getRecordOrdinal() - 1;
- }
- this.recordsQueue.add(samRecordWithOrdinal.getRecord());
- this.endIndex++;
- } else {
- throw new IllegalStateException("Cannot add to DiskBackedQueue whose canAdd() method returns false");
- }
- }
-
- private int ensureIndexFitsInAnInt(final long value) {
- if (value < Integer.MIN_VALUE || Integer.MAX_VALUE < value) throw new SAMException("Error: index out of range: " + value);
- return (int)value;
- }
-
- /**
- * Mark the current samRecordWithOrdinal as having been examined with a given result state.
- *
- * @param samRecordWithOrdinal The samRecordWithOrdinal to be marked
- * @param resultState Boolean flag indicating the result of the examination of this record.
- *
- * This assumes that this record index does not fall out of range.
- */
- public void setResultState(final SamRecordWithOrdinal samRecordWithOrdinal, final boolean resultState) {
- // find the correct byte array index and update both metadata byte arrays
- this.wasExaminedIndexes.set(ensureIndexFitsInAnInt(samRecordWithOrdinal.getRecordOrdinal() - this.originalStartIndex), true);
- this.resultStateIndexes.set(ensureIndexFitsInAnInt(samRecordWithOrdinal.getRecordOrdinal() - this.originalStartIndex), resultState);
- }
-
- public boolean isEmpty() {
- return (this.recordsQueue.isEmpty());
- }
-
- public boolean canEmit() {
- // TODO: what if isEmpty() == true?
- return this.wasExaminedIndexes.get(ensureIndexFitsInAnInt(this.currentStartIndex - this.originalStartIndex));
- }
-
- public SamRecordWithOrdinal next() throws IllegalStateException {
- if (this.canEmit()) {
- try {
- // create a wrapped record for the head of the queue, and set the underlying record's examined information appropriately
- final SamRecordWithOrdinal samRecordWithOrdinal = clazz.newInstance();
- samRecordWithOrdinal.setRecord(this.recordsQueue.poll());
- samRecordWithOrdinal.setRecordOrdinal(this.currentStartIndex);
- samRecordWithOrdinal.setResultState(this.resultStateIndexes.get(ensureIndexFitsInAnInt(this.currentStartIndex - this.originalStartIndex)));
- this.currentStartIndex++;
- return samRecordWithOrdinal;
- } catch (final Exception e) {
- throw new RuntimeException(e);
- }
- } else {
- throw new IllegalStateException("Cannot call next() on a buffer block where canEmit() is false!");
- }
- }
-
- /**
- * Remove, but do not return, the next samRecordWithOrdinal in the iterator
- */
- public void remove() { this.next(); }
-
- /**
- * Return the total number of elements in the block, both in memory and on disk
- */
- public long size() { return this.endIndex - this.currentStartIndex + 1; }
-
- /**
- * Close disk IO resources associated with the underlying records queue.
- * This must be called when a block is no longer needed in order to prevent memory leaks.
- */
- public void clear() { this.recordsQueue.clear(); }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java b/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java
deleted file mode 100644
index 096c416..0000000
--- a/src/main/java/htsjdk/samtools/util/SamRecordWithOrdinal.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecord;
-
-/**
- * A little class to store the unique index associated with this record. The index is determined as records are read in, so is in fact
- * gives the ordinal of the record in the input file. All sub-classes should have a default constructor. Additionally, all implementations
- * of this class must implement setResultState, as this class is typically used when wanting to return SAMRecord's in same input order,
- * but only when some computation (ex. duplicate marking) has been performed.
- */
-public abstract class SamRecordWithOrdinal {
- private SAMRecord record;
- private long recordOrdinal;
-
- public SamRecordWithOrdinal() {
- this.record = null;
- this.recordOrdinal = -1;
- }
-
- public SamRecordWithOrdinal(final SAMRecord record, final long recordOrdinal) {
- this.record = record;
- this.recordOrdinal = recordOrdinal;
- }
-
- public SAMRecord getRecord() { return this.record; }
- public void setRecord(final SAMRecord record) { this.record = record; }
- public long getRecordOrdinal() { return this.recordOrdinal; }
- public void setRecordOrdinal(final long recordOrdinal) { this.recordOrdinal = recordOrdinal; }
-
- /** Set the result state on this record. */
- abstract public void setResultState(final boolean resultState);
-}
diff --git a/src/main/java/htsjdk/samtools/util/SequenceUtil.java b/src/main/java/htsjdk/samtools/util/SequenceUtil.java
deleted file mode 100644
index 3108cee..0000000
--- a/src/main/java/htsjdk/samtools/util/SequenceUtil.java
+++ /dev/null
@@ -1,1031 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.AlignmentBlock;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMTag;
-
-import java.io.File;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class SequenceUtil {
- /** Byte typed variables for all normal bases. */
- public static final byte a = 'a', c = 'c', g = 'g', t = 't', n = 'n', A = 'A', C = 'C', G = 'G', T = 'T', N = 'N';
-
- public static final byte[] VALID_BASES_UPPER = new byte[]{A, C, G, T};
- public static final byte[] VALID_BASES_LOWER = new byte[]{a, c, g, t};
-
- private static final byte A_MASK = 1;
- private static final byte C_MASK = 2;
- private static final byte G_MASK = 4;
- private static final byte T_MASK = 8;
-
- private static final byte[] bases = new byte[127];
-
- /*
- * Definition of IUPAC codes:
- * http://www.bioinformatics.org/sms2/iupac.html
- */
- static {
- Arrays.fill(bases, (byte) 0);
- bases[A] = A_MASK;
- bases[C] = C_MASK;
- bases[G] = G_MASK;
- bases[T] = T_MASK;
- bases['M'] = A_MASK | C_MASK;
- bases['R'] = A_MASK | G_MASK;
- bases['W'] = A_MASK | T_MASK;
- bases['S'] = C_MASK | G_MASK;
- bases['Y'] = C_MASK | T_MASK;
- bases['K'] = G_MASK | T_MASK;
- bases['V'] = A_MASK | C_MASK | G_MASK;
- bases['H'] = A_MASK | C_MASK | T_MASK;
- bases['D'] = A_MASK | G_MASK | T_MASK;
- bases['B'] = C_MASK | G_MASK | T_MASK;
- bases['N'] = A_MASK | C_MASK | G_MASK | T_MASK;
- // Also store the bases in lower case
- for (int i = 'A'; i <= 'Z'; i++) {
- bases[(byte) i + 32] = bases[(byte) i];
- }
- bases['.'] = A_MASK | C_MASK | G_MASK | T_MASK;
- };
-
-
- /**
- * Calculate the reverse complement of the specified sequence
- * (Stolen from Reseq)
- *
- * @param sequenceData
- * @return reverse complement
- */
- public static String reverseComplement(final String sequenceData) {
- final byte[] bases = htsjdk.samtools.util.StringUtil.stringToBytes(sequenceData);
- reverseComplement(bases);
- return htsjdk.samtools.util.StringUtil.bytesToString(bases);
- }
-
-
- /**
- * Efficiently compare two IUPAC base codes, simply returning true if they are equal (ignoring case),
- * without considering the set relationships between ambiguous codes.
- */
- public static boolean basesEqual(final byte lhs, final byte rhs) {
- return (bases[lhs] == bases[rhs]);
- }
-
- /**
- * Efficiently compare two IUPAC base codes, one coming from a read sequence and the other coming from
- * a reference sequence, using the reference code as a 'pattern' that the read base must match.
- *
- * We take ambiguous codes into account, returning true if the set of possible bases
- * represented by the read value is a (non-strict) subset of the possible bases represented
- * by the reference value.
- *
- * Since the comparison is directional, make sure to pass read / ref codes in correct order.
- */
- public static boolean readBaseMatchesRefBaseWithAmbiguity(final byte readBase, final byte refBase) {
- return (bases[readBase] & bases[refBase]) == bases[readBase];
- }
-
- /**
- * returns true if the value of base represents a no call
- */
- public static boolean isNoCall(final byte base) {
- return base == 'N' || base == 'n' || base == '.';
- }
-
- /** Returns true if the byte is in [acgtACGT]. */
- public static boolean isValidBase(final byte b) {
- return isValidBase(b, VALID_BASES_UPPER) || isValidBase(b, VALID_BASES_LOWER);
- }
-
- private static boolean isValidBase(final byte b, final byte[] validBases) {
- for (final byte validBase : validBases) {
- if (b == validBase) return true;
- }
- return false;
- }
-
- /** Calculates the fraction of bases that are G/C in the sequence. */
- public static double calculateGc(final byte[] bases) {
- int gcs = 0;
- for (int i = 0; i < bases.length; ++i) {
- final byte b = bases[i];
- if (b == 'C' || b == 'G' || b == 'c' || b == 'g') ++gcs;
- }
-
- return gcs / (double) bases.length;
- }
-
- /**
- * default signature that forces the lists to be the same size
- *
- * @param s1 a list of sequence headers
- * @param s2 a second list of sequence headers
- */
- public static void assertSequenceListsEqual(final List<SAMSequenceRecord> s1, final List<SAMSequenceRecord> s2) {
- assertSequenceListsEqual(s1, s2, false);
- }
- /**
- * Throws an exception only if both (first) parameters are not null
- * optionally check that one list is a (nonempty) prefix of the other.
- *
- * @param s1 a list of sequence headers
- * @param s2 a second list of sequence headers
- * @param checkPrefixOnly a flag specifying whether to only look at the first records in the lists. This will then check that the
- * records of the smaller dictionary are equal to the records of the beginning of the larger dictionary, which can be useful since
- * sometimes different pipelines choose to use only the first contigs of a standard reference.
- */
- public static void assertSequenceListsEqual(final List<SAMSequenceRecord> s1, final List<SAMSequenceRecord> s2, final boolean checkPrefixOnly) {
- if (s1 != null && s2 != null) {
-
- final int sizeToTest;
-
- if (checkPrefixOnly) {
- sizeToTest = Math.min(s1.size(), s2.size());
- if (sizeToTest == 0) {
- throw new SequenceListsDifferException("Neither of the dictionaries can be empty.");
- }
- } else {
- sizeToTest = s1.size();
- if (s1.size() != s2.size()) {
- throw new SequenceListsDifferException(
- "Sequence dictionaries are not the same size (" + s1.size() + ", " + s2.size() +
- ")");
- }
- }
- for (int i = 0; i < sizeToTest; ++i) {
- if (!s1.get(i).isSameSequence(s2.get(i))) {
- String s1Attrs = "";
- for (final java.util.Map.Entry<String, String> entry : s1.get(i)
- .getAttributes()) {
- s1Attrs += "/" + entry.getKey() + "=" + entry.getValue();
- }
- String s2Attrs = "";
- for (final java.util.Map.Entry<String, String> entry : s2.get(i)
- .getAttributes()) {
- s2Attrs += "/" + entry.getKey() + "=" + entry.getValue();
- }
- throw new SequenceListsDifferException(
- "Sequences at index " + i + " don't match: " +
- s1.get(i).getSequenceIndex() + "/" + s1.get(i).getSequenceLength() +
- "/" + s1.get(i).getSequenceName() + s1Attrs + " " +
- s2.get(i).getSequenceIndex() + "/" + s2.get(i).getSequenceLength() +
- "/" + s2.get(i).getSequenceName() + s2Attrs);
- }
- }
- }
- }
-
- public static class SequenceListsDifferException extends SAMException {
- public SequenceListsDifferException() {
- }
-
- public SequenceListsDifferException(final String s) {
- super(s);
- }
-
- public SequenceListsDifferException(final String s, final Throwable throwable) {
- super(s, throwable);
- }
-
- public SequenceListsDifferException(final Throwable throwable) {
- super(throwable);
- }
- }
-
- /**
- * Returns true if both parameters are null or equal, otherwise returns false
- *
- * @param s1 a list of sequence headers
- * @param s2 a second list of sequence headers
- */
- public static boolean areSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2) {
- if (s1 == null && s2 == null) return true;
- if (s1 == null || s2 == null) return false;
-
- try {
- assertSequenceListsEqual(s1.getSequences(), s2.getSequences());
- return true;
- } catch (final SequenceListsDifferException e) {
- return false;
- }
- }
-
- /**
- * Throws an exception if both parameters are non-null and unequal.
- *
- * @param s1 a list of sequence headers
- * @param s2 a second list of sequence headers
- */
- public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2) {
- assertSequenceDictionariesEqual(s1, s2, false);
- }
-
- /**
- * Throws an exception if both (first) parameters are non-null and unequal (if checkPrefixOnly, checks prefix of lists only).
- *
- * @param s1 a list of sequence headers
- * @param s2 a second list of sequence headers
- * @param checkPrefixOnly a flag specifying whether to only look at the first records in the lists. This will then check that the
- * records of the smaller dictionary are equal to the records of the beginning of the larger dictionary, which can be useful since
- * sometimes different pipelines choose to use only the first contigs of a standard reference.
- */
- public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2, final boolean checkPrefixOnly) {
- if (s1 == null || s2 == null) return;
- assertSequenceListsEqual(s1.getSequences(), s2.getSequences(), checkPrefixOnly);
- }
-
- /**
- * Throws an exception if both parameters are non-null and unequal, including the filenames.
- */
- public static void assertSequenceDictionariesEqual(final SAMSequenceDictionary s1, final SAMSequenceDictionary s2,
- final File f1, final File f2) {
- try {
- assertSequenceDictionariesEqual(s1, s2);
- } catch (final SequenceListsDifferException e) {
- throw new SequenceListsDifferException("In files " + f1.getAbsolutePath() + " and " + f2.getAbsolutePath(), e);
- }
- }
-
- /**
- * Create a simple ungapped cigar string, which might have soft clipping at either end
- *
- * @param alignmentStart raw aligment start, which may result in read hanging off beginning or end of read
- * @return cigar string that may have S operator at beginning or end, and has M operator for the rest of the read
- */
- public static String makeCigarStringWithPossibleClipping(final int alignmentStart, final int readLength, final int referenceSequenceLength) {
- int start = alignmentStart;
- int leftSoftClip = 0;
- if (start < 1) {
- leftSoftClip = 1 - start;
- start = 1;
- }
- int rightSoftClip = 0;
- if (alignmentStart + readLength > referenceSequenceLength + 1) {
- rightSoftClip = alignmentStart + readLength - referenceSequenceLength - 1;
- }
- // CIGAR is trivial because there are no indels or clipping in Gerald
- final int matchLength = readLength - leftSoftClip - rightSoftClip;
- if (matchLength < 1) {
- throw new SAMException("Unexpected cigar string with no M op for read.");
- }
- return makeSoftClipCigar(leftSoftClip) + Integer.toString(matchLength) + "M" + makeSoftClipCigar(rightSoftClip);
- }
-
- /**
- * Create a cigar string for a gapped alignment, which may have soft clipping at either end
- *
- * @param alignmentStart raw alignment start, which may result in read hanging off beginning or end of read
- * @param readLength
- * @param referenceSequenceLength
- * @param indelPosition number of matching bases before indel. Must be > 0
- * @param indelLength length of indel. Positive for insertion, negative for deletion.
- * @return cigar string that may have S operator at beginning or end, has one or two M operators, and an I or a D.
- */
- public static String makeCigarStringWithIndelPossibleClipping(final int alignmentStart,
- final int readLength,
- final int referenceSequenceLength,
- final int indelPosition,
- final int indelLength) {
- int start = alignmentStart;
- int leftSoftClip = 0;
- if (start < 1) {
- leftSoftClip = 1 - start;
- start = 1;
- }
- int rightSoftClip = 0;
- final int alignmentEnd = alignmentStart + readLength - indelLength;
- if (alignmentEnd > referenceSequenceLength + 1) {
- rightSoftClip = alignmentEnd - referenceSequenceLength - 1;
- }
- if (leftSoftClip >= indelPosition) {
- throw new IllegalStateException("Soft clipping entire pre-indel match. leftSoftClip: " + leftSoftClip +
- "; indelPosition: " + indelPosition);
- }
- // CIGAR is trivial because there are no indels or clipping in Gerald
- final int firstMatchLength = indelPosition - leftSoftClip;
- final int secondMatchLength = readLength - indelPosition - (indelLength > 0 ? indelLength : 0) - rightSoftClip;
- if (secondMatchLength < 1) {
- throw new SAMException("Unexpected cigar string with no M op for read.");
- }
- return makeSoftClipCigar(leftSoftClip) + Integer.toString(firstMatchLength) + "M" +
- Math.abs(indelLength) + (indelLength > 0 ? "I" : "D") +
- Integer.toString(secondMatchLength) + "M" +
- makeSoftClipCigar(rightSoftClip);
- }
-
- public static String makeSoftClipCigar(final int clipLength) {
- if (clipLength == 0) {
- return "";
- }
- return Integer.toString(clipLength) + "S";
- }
-
- /**
- * Helper method to handle the various use cases of base comparison.
- *
- * @param readBase the read base to match
- * @param refBase the reference base to match
- * @param negativeStrand set to true if the base to test is on the negative strand and should be reverse complemented (only applies if bisulfiteSequence is true)
- * @param bisulfiteSequence set to true if the base to match is a bisulfite sequence and needs to be converted
- * @param matchAmbiguousRef causes the match to return true when the read base is a subset of the possible IUPAC reference bases, but not the other way around
- * @return true if the bases match, false otherwise
- */
- private static boolean basesMatch(final byte readBase, final byte refBase, final boolean negativeStrand,
- final boolean bisulfiteSequence, final boolean matchAmbiguousRef) {
- if (bisulfiteSequence) {
- if (matchAmbiguousRef) return bisulfiteBasesMatchWithAmbiguity(negativeStrand, readBase, refBase);
- else return bisulfiteBasesEqual(negativeStrand, readBase, refBase);
- } else {
- if (matchAmbiguousRef) return readBaseMatchesRefBaseWithAmbiguity(readBase, refBase);
- else return basesEqual(readBase, refBase);
- }
- }
-
- /** Calculates the number of mismatches between the read and the reference sequence provided. */
- public static int countMismatches(final SAMRecord read, final byte[] referenceBases) {
- return countMismatches(read, referenceBases, 0, false);
- }
-
- /** Calculates the number of mismatches between the read and the reference sequence provided. */
- public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset) {
- return countMismatches(read, referenceBases, referenceOffset, false);
- }
-
- /**
- * Calculates the number of mismatches between the read and the reference sequence provided.
- *
- * @param referenceBases Array of ASCII bytes that covers at least the the portion of the reference sequence
- * to which read is aligned from getReferenceStart to getReferenceEnd.
- * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
- * of that reference sequence.
- * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
- * and C->T on the positive strand and G->A on the negative strand will not be counted
- * as mismatches.
- */
- public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset, final boolean bisulfiteSequence) {
- return countMismatches(read, referenceBases, referenceOffset, bisulfiteSequence, false);
- }
-
- public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final int referenceOffset,
- final boolean bisulfiteSequence, final boolean matchAmbiguousRef) {
- try {
- int mismatches = 0;
-
- final byte[] readBases = read.getReadBases();
-
- for (final AlignmentBlock block : read.getAlignmentBlocks()) {
- final int readBlockStart = block.getReadStart() - 1;
- final int referenceBlockStart = block.getReferenceStart() - 1 - referenceOffset;
- final int length = block.getLength();
-
- for (int i = 0; i < length; ++i) {
- if (!basesMatch(readBases[readBlockStart + i], referenceBases[referenceBlockStart + i],
- read.getReadNegativeStrandFlag(), bisulfiteSequence, matchAmbiguousRef)) {
- ++mismatches;
- }
- }
- }
- return mismatches;
- } catch (final Exception e) {
- throw new SAMException("Exception counting mismatches for read " + read, e);
- }
- }
-
- /**
- * Calculates the number of mismatches between the read and the reference sequence provided.
- *
- * @param referenceBases Array of ASCII bytes that covers at least the the portion of the reference sequence
- * to which read is aligned from getReferenceStart to getReferenceEnd.
- * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
- * and C->T on the positive strand and G->A on the negative strand will not be counted
- * as mismatches.
- */
- public static int countMismatches(final SAMRecord read, final byte[] referenceBases, final boolean bisulfiteSequence) {
- return countMismatches(read, referenceBases, 0, bisulfiteSequence);
- }
-
- /**
- * Calculates the sum of qualities for mismatched bases in the read.
- *
- * @param referenceBases Array of ASCII bytes in which the 0th position in the array corresponds
- * to the first element of the reference sequence to which read is aligned.
- */
- public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases) {
- return sumQualitiesOfMismatches(read, referenceBases, 0, false);
- }
-
- /**
- * Calculates the sum of qualities for mismatched bases in the read.
- *
- * @param referenceBases Array of ASCII bytes that covers at least the the portion of the reference sequence
- * to which read is aligned from getReferenceStart to getReferenceEnd.
- * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
- * of that reference sequence.
- */
- public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases,
- final int referenceOffset) {
- return sumQualitiesOfMismatches(read, referenceBases, referenceOffset, false);
- }
-
- /**
- * Calculates the sum of qualities for mismatched bases in the read.
- *
- * @param referenceBases Array of ASCII bytes that covers at least the the portion of the reference sequence
- * to which read is aligned from getReferenceStart to getReferenceEnd.
- * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
- * of that reference sequence.
- * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
- * and C->T on the positive strand and G->A on the negative strand will not be counted
- * as mismatches.
- */
- public static int sumQualitiesOfMismatches(final SAMRecord read, final byte[] referenceBases,
- final int referenceOffset, final boolean bisulfiteSequence) {
- int qualities = 0;
-
- final byte[] readBases = read.getReadBases();
- final byte[] readQualities = read.getBaseQualities();
-
- if (read.getAlignmentStart() <= referenceOffset) {
- throw new IllegalArgumentException("read.getAlignmentStart(" + read.getAlignmentStart() +
- ") <= referenceOffset(" + referenceOffset + ")");
- }
-
- for (final AlignmentBlock block : read.getAlignmentBlocks()) {
- final int readBlockStart = block.getReadStart() - 1;
- final int referenceBlockStart = block.getReferenceStart() - 1 - referenceOffset;
- final int length = block.getLength();
-
- for (int i = 0; i < length; ++i) {
- if (!bisulfiteSequence) {
- if (!basesEqual(readBases[readBlockStart + i], referenceBases[referenceBlockStart + i])) {
- qualities += readQualities[readBlockStart + i];
- }
-
- } else {
- if (!bisulfiteBasesEqual(read.getReadNegativeStrandFlag(), readBases[readBlockStart + i],
- referenceBases[referenceBlockStart + i])) {
- qualities += readQualities[readBlockStart + i];
- }
- }
- }
- }
-
- return qualities;
- }
-
- public static int countInsertedBases(final Cigar cigar) {
- int ret = 0;
- for (final CigarElement element : cigar.getCigarElements()) {
- if (element.getOperator() == CigarOperator.INSERTION) ret += element.getLength();
- }
- return ret;
- }
-
- public static int countDeletedBases(final Cigar cigar) {
- int ret = 0;
- for (final CigarElement element : cigar.getCigarElements()) {
- if (element.getOperator() == CigarOperator.DELETION) ret += element.getLength();
- }
- return ret;
- }
-
- public static int countInsertedBases(final SAMRecord read) {
- return countInsertedBases(read.getCigar());
- }
-
- public static int countDeletedBases(final SAMRecord read) {
- return countDeletedBases(read.getCigar());
- }
-
- /**
- * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
- * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
- * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
- */
- public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases) {
- return calculateSamNmTag(read, referenceBases, 0, false);
- }
-
- /**
- * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
- * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
- * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
- *
- * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
- * of that reference sequence.
- */
- public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases,
- final int referenceOffset) {
- return calculateSamNmTag(read, referenceBases, referenceOffset, false);
- }
-
- /**
- * Calculates the predefined NM tag from the SAM spec: (# of mismatches + # of indels)
- * For the purposes for calculating mismatches, we do not yet support IUPAC ambiguous codes
- * (see <code>readBaseMatchesRefBaseWithAmbiguity</code> method).
- *
- * @param referenceOffset 0-based offset of the first element of referenceBases relative to the start
- * of that reference sequence.
- * @param bisulfiteSequence If this is true, it is assumed that the reads were bisulfite treated
- * and C->T on the positive strand and G->A on the negative strand will not be counted
- * as mismatches.
- */
- public static int calculateSamNmTag(final SAMRecord read, final byte[] referenceBases,
- final int referenceOffset, final boolean bisulfiteSequence) {
- int samNm = countMismatches(read, referenceBases, referenceOffset, bisulfiteSequence, false);
- for (final CigarElement el : read.getCigar().getCigarElements()) {
- if (el.getOperator() == CigarOperator.INSERTION || el.getOperator() == CigarOperator.DELETION) {
- samNm += el.getLength();
- }
- }
- return samNm;
- }
-
- /**
- * Attempts to calculate the predefined NM tag from the SAM spec using the cigar string alone.
- * It may calculate incorrectly if ambiguous operators (Like M) are used.
- *
- * Needed for testing infrastructure: SAMRecordSetBuilder
- */
- public static int calculateSamNmTagFromCigar(final SAMRecord record) {
- int samNm = 0;
- for (final CigarElement el : record.getCigar().getCigarElements()) {
- if ( el.getOperator() == CigarOperator.X ||
- el.getOperator() == CigarOperator.INSERTION ||
- el.getOperator() == CigarOperator.DELETION) {
- samNm += el.getLength();
- }
- }
- return samNm;
- }
-
- /** Returns the complement of a single byte. */
- public static byte complement(final byte b) {
- switch (b) {
- case a:
- return t;
- case c:
- return g;
- case g:
- return c;
- case t:
- return a;
- case A:
- return T;
- case C:
- return G;
- case G:
- return C;
- case T:
- return A;
- default:
- return b;
- }
- }
-
- /** Reverses and complements the bases in place. */
- public static void reverseComplement(final byte[] bases) {
- final int lastIndex = bases.length - 1;
-
- int i, j;
- for (i = 0, j = lastIndex; i < j; ++i, --j) {
- final byte tmp = complement(bases[i]);
- bases[i] = complement(bases[j]);
- bases[j] = tmp;
- }
- if (bases.length % 2 == 1) {
- bases[i] = complement(bases[i]);
- }
- }
-
- /** Reverses the quals in place. */
- public static void reverseQualities(final byte[] quals) {
- final int lastIndex = quals.length - 1;
-
- int i, j;
- for (i = 0, j = lastIndex; i < j; ++i, --j) {
- final byte tmp = quals[i];
- quals[i] = quals[j];
- quals[j] = tmp;
- }
- }
-
- /**
- * Returns true if the bases are equal OR if the mismatch can be accounted for by
- * bisulfite treatment. C->T on the positive strand and G->A on the negative strand
- * do not count as mismatches.
- */
- public static boolean bisulfiteBasesEqual(final boolean negativeStrand, final byte read, final byte reference) {
- return (basesEqual(read, reference)) || (isBisulfiteConverted(read, reference, negativeStrand));
- }
-
- public static boolean bisulfiteBasesEqual(final byte read, final byte reference) {
- return bisulfiteBasesEqual(false, read, reference);
- }
-
- /**
- * Same as above, but use <code>readBaseMatchesRefBaseWithAmbiguity</code> instead of <code>basesEqual</code>.
- * Note that <code>isBisulfiteConverted</code> is not affected because it only applies when the
- * reference base is non-ambiguous.
- */
- public static boolean bisulfiteBasesMatchWithAmbiguity(final boolean negativeStrand, final byte read, final byte reference) {
- return (readBaseMatchesRefBaseWithAmbiguity(read, reference)) || (isBisulfiteConverted(read, reference, negativeStrand));
- }
-
- /**
- * Checks for bisulfite conversion, C->T on the positive strand and G->A on the negative strand.
- */
- public static boolean isBisulfiteConverted(final byte read, final byte reference, final boolean negativeStrand) {
- if (negativeStrand) {
- if (basesEqual(reference, G) && basesEqual(read, A)) {
- return true;
- }
- } else {
- if (basesEqual(reference, C) && basesEqual(read, T)) {
- return true;
- }
- }
- return false;
- }
-
- public static boolean isBisulfiteConverted(final byte read, final byte reference) {
- return isBisulfiteConverted(read, reference, false);
- }
-
- /*
- * Regexp for MD string.
- *
- * \G = end of previous match.
- * (?:[0-9]+) non-capturing (why non-capturing?) group of digits. For this number of bases read matches reference.
- * - or -
- * Single reference base for case in which reference differs from read.
- * - or -
- * ^one or more reference bases that are deleted in read.
- *
- */
- static final Pattern mdPat = Pattern.compile("\\G(?:([0-9]+)|([ACTGNactgn])|(\\^[ACTGNactgn]+))");
-
- /**
- * Produce reference bases from an aligned SAMRecord with MD string and Cigar.
- *
- * @param rec Must contain non-empty CIGAR and MD attribute.
- * @param includeReferenceBasesForDeletions If true, include reference bases that are deleted in the read.
- * This will make the returned array not line up with the read if there are deletions.
- * @return References bases corresponding to the read. If there is an insertion in the read, reference contains
- * '-'. If the read is soft-clipped, reference contains '0'. If there is a skipped region and
- * includeReferenceBasesForDeletions==true, reference will have Ns for the skipped region.
- */
- public static byte[] makeReferenceFromAlignment(final SAMRecord rec, final boolean includeReferenceBasesForDeletions) {
- final String md = rec.getStringAttribute(SAMTag.MD.name());
- if (md == null) {
- throw new SAMException("Cannot create reference from SAMRecord with no MD tag, read: " + rec.getReadName());
- }
- // Not sure how long output will be, but it will be no longer than this.
- int maxOutputLength = 0;
- final Cigar cigar = rec.getCigar();
- if (cigar == null) {
- throw new SAMException("Cannot create reference from SAMRecord with no CIGAR, read: " + rec.getReadName());
- }
- for (final CigarElement cigarElement : cigar.getCigarElements()) {
- maxOutputLength += cigarElement.getLength();
- }
- final byte[] ret = new byte[maxOutputLength];
- int outIndex = 0;
-
- final Matcher match = mdPat.matcher(md);
- int curSeqPos = 0;
-
- int savedBases = 0;
- final byte[] seq = rec.getReadBases();
- for (final CigarElement cigEl : cigar.getCigarElements()) {
- final int cigElLen = cigEl.getLength();
- final CigarOperator cigElOp = cigEl.getOperator();
-
-
- if (cigElOp == CigarOperator.SKIPPED_REGION) {
- // We've decided that MD tag will not contain bases for skipped regions, as they
- // could be megabases long, so just put N in there if caller wants reference bases,
- // otherwise ignore skipped regions.
- if (includeReferenceBasesForDeletions) {
- for (int i = 0; i < cigElLen; ++i) {
- ret[outIndex++] = N;
- }
- }
- }
- // If it consumes reference bases, it's either a match or a deletion in the sequence
- // read. Either way, we're going to need to parse through the MD.
- else if (cigElOp.consumesReferenceBases()) {
- // We have a match region, go through the MD
- int basesMatched = 0;
-
- // Do we have any saved matched bases?
- while ((savedBases > 0) && (basesMatched < cigElLen)) {
- ret[outIndex++] = seq[curSeqPos++];
- savedBases--;
- basesMatched++;
- }
-
- while (basesMatched < cigElLen) {
- boolean matched = match.find();
- if (matched) {
- String mg;
- if (((mg = match.group(1)) != null) && (!mg.isEmpty())) {
- // It's a number , meaning a series of matches
- final int num = Integer.parseInt(mg);
- for (int i = 0; i < num; i++) {
- if (basesMatched < cigElLen) {
- ret[outIndex++] = seq[curSeqPos++];
- } else {
- savedBases++;
- }
- basesMatched++;
- }
- } else if (((mg = match.group(2)) != null) && (!mg.isEmpty())) {
- // It's a single nucleotide, meaning a mismatch
- if (basesMatched < cigElLen) {
- ret[outIndex++] = StringUtil.charToByte(mg.charAt(0));
- curSeqPos++;
- } else {
- throw new IllegalStateException("Should never happen.");
- }
- basesMatched++;
- } else if (((mg = match.group(3)) != null) && (!mg.isEmpty())) {
- // It's a deletion, starting with a caret
- // don't include caret
- if (includeReferenceBasesForDeletions) {
- final byte[] deletedBases = StringUtil.stringToBytes(mg);
- System.arraycopy(deletedBases, 1, ret, outIndex, deletedBases.length - 1);
- outIndex += deletedBases.length - 1;
- }
- basesMatched += mg.length() - 1;
-
- // Check just to make sure.
- if (basesMatched != cigElLen) {
- throw new SAMException("Got a deletion in CIGAR (" + cigar + ", deletion " + cigElLen +
- " length) with an unequal ref insertion in MD (" + md + ", md " + basesMatched + " length");
- }
- if (cigElOp != CigarOperator.DELETION) {
- throw new SAMException("Got an insertion in MD (" + md + ") without a corresponding deletion in cigar (" + cigar + ")");
- }
-
- } else {
- matched = false;
- }
- }
-
- if (!matched) {
- throw new SAMException("Illegal MD pattern: " + md + " for read " + rec.getReadName() +
- " with CIGAR " + rec.getCigarString());
- }
- }
-
- } else if (cigElOp.consumesReadBases()) {
- // We have an insertion in read
- for (int i = 0; i < cigElLen; i++) {
- final char c = (cigElOp == CigarOperator.SOFT_CLIP) ? '0' : '-';
- ret[outIndex++] = StringUtil.charToByte(c);
- curSeqPos++;
- }
- } else {
- // It's an op that consumes neither read nor reference bases. Do we just ignore??
- }
-
- }
- if (outIndex < ret.length) {
- final byte[] shorter = new byte[outIndex];
- System.arraycopy(ret, 0, shorter, 0, outIndex);
- return shorter;
- }
- return ret;
- }
-
- public static void reverse(final byte[] array, final int offset, final int len) {
- final int lastIndex = len - 1;
-
- int i, j;
- for (i = offset, j = offset + lastIndex; i < j; ++i, --j) {
- final byte tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- if (len % 2 == 1) {
- array[i] = array[i];
- }
- }
-
- public static void reverseComplement(final byte[] bases, final int offset, final int len) {
- final int lastIndex = len - 1;
-
- int i, j;
- for (i = offset, j = offset + lastIndex; i < j; ++i, --j) {
- final byte tmp = complement(bases[i]);
- bases[i] = complement(bases[j]);
- bases[j] = tmp;
- }
- if (len % 2 == 1) {
- bases[i] = complement(bases[i]);
- }
- }
-
- public static String calculateMD5String(final byte[] data)
- throws NoSuchAlgorithmException {
- return SequenceUtil.calculateMD5String(data, 0, data.length);
- }
-
- public static String calculateMD5String(final byte[] data, final int offset, final int len) {
- final byte[] digest = calculateMD5(data, offset, len);
- return String.format("%032x", new BigInteger(1, digest));
- }
-
- public static byte[] calculateMD5(final byte[] data, final int offset, final int len) {
- final MessageDigest md5_MessageDigest;
- try {
- md5_MessageDigest = MessageDigest.getInstance("MD5");
- md5_MessageDigest.reset();
-
- md5_MessageDigest.update(data, offset, len);
- return md5_MessageDigest.digest();
- } catch (final NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Calculate MD and NM similarly to Samtools, except that N->N is a match.
- *
- * @param record Input record for which to calculate NM and MD.
- * The appropriate tags will be added/updated in the record
- * @param ref The reference bases for the sequence to which the record is mapped
- * @param calcMD A flag indicating whether to update the MD tag in the record
- * @param calcNM A flag indicating whether to update the NM tag in the record
- */
- public static void calculateMdAndNmTags(final SAMRecord record, final byte[] ref,
- final boolean calcMD, final boolean calcNM) {
- if (!calcMD && !calcNM)
- return;
-
- final Cigar cigar = record.getCigar();
- final List<CigarElement> cigarElements = cigar.getCigarElements();
- final byte[] seq = record.getReadBases();
- final int alignmentStart = record.getAlignmentStart() - 1;
- int cigarIndex, blockRefPos, blockReadStart, matchCount = 0;
- int nmCount = 0;
- final StringBuilder mdString = new StringBuilder();
-
- final int nElements = cigarElements.size();
- for (cigarIndex = blockReadStart = 0, blockRefPos = alignmentStart; cigarIndex < nElements; ++cigarIndex) {
- final CigarElement ce = cigarElements.get(cigarIndex);
- int inBlockOffset;
- final int blockLength = ce.getLength();
- final CigarOperator op = ce.getOperator();
- if (op == CigarOperator.MATCH_OR_MISMATCH || op == CigarOperator.EQ
- || op == CigarOperator.X) {
- for (inBlockOffset = 0; inBlockOffset < blockLength; ++inBlockOffset) {
- final int readOffset = blockReadStart + inBlockOffset;
-
- if (ref.length <= blockRefPos + inBlockOffset) break; // out of boundary
-
- final byte readBase = seq[readOffset];
- final byte refBase = ref[blockRefPos + inBlockOffset];
-
- if ((bases[readBase] == bases[refBase]) || readBase == 0) {
- // a match
- ++matchCount;
- } else {
- mdString.append(matchCount);
- mdString.appendCodePoint(refBase);
- matchCount = 0;
- ++nmCount;
- }
- }
- if (inBlockOffset < blockLength) break;
- blockRefPos += blockLength;
- blockReadStart += blockLength;
- } else if (op == CigarOperator.DELETION) {
- mdString.append(matchCount);
- mdString.append('^');
- for (inBlockOffset = 0; inBlockOffset < blockLength; ++inBlockOffset) {
- if (ref[blockRefPos + inBlockOffset] == 0) break;
- mdString.appendCodePoint(ref[blockRefPos + inBlockOffset]);
- }
- matchCount = 0;
- if (inBlockOffset < blockLength) break;
- blockRefPos += blockLength;
- nmCount += blockLength;
- } else if (op == CigarOperator.INSERTION
- || op == CigarOperator.SOFT_CLIP) {
- blockReadStart += blockLength;
- if (op == CigarOperator.INSERTION) nmCount += blockLength;
- } else if (op == CigarOperator.SKIPPED_REGION) {
- blockRefPos += blockLength;
- }
- }
- mdString.append(matchCount);
-
- if (calcMD) record.setAttribute(SAMTag.MD.name(), mdString.toString());
- if (calcNM) record.setAttribute(SAMTag.NM.name(), nmCount);
- }
-
- public static byte upperCase(final byte base) {
- return base >= a ? (byte) (base - (a - A)) : base;
- }
-
- public static byte[] upperCase(final byte[] bases) {
- for (int i = 0; i < bases.length; i++)
- bases[i] = upperCase(bases[i]);
- return bases;
- }
-
- /** Generates all possible unambiguous kmers (upper-case) of length and returns them as byte[]s. */
- public static List<byte[]> generateAllKmers(final int length) {
- final List<byte[]> sofar = new LinkedList<>();
-
- if (sofar.isEmpty()) {
- sofar.add(new byte[length]);
- }
-
- while (true) {
- final byte[] bs = sofar.remove(0);
- int indexOfNextBase = -1;
- for (int i = 0; i < bs.length; ++i) {
- if (bs[i] == 0) {
- indexOfNextBase = i;
- break;
- }
- }
-
- if (indexOfNextBase == -1) {
- sofar.add(bs);
- break;
- } else {
- for (final byte b : VALID_BASES_UPPER) {
- final byte[] next = Arrays.copyOf(bs, bs.length);
- next[indexOfNextBase] = b;
- sofar.add(next);
- }
- }
- }
-
- return sofar;
- }
-
- /**
- * Returns a read name from a FASTQ header string suitable for use in a SAM/BAM file. Any letters after the first space are ignored.
- * Ths method also strips trailing "/1" or "/2" so that paired end reads have the same name.
- *
- * @param fastqHeader the header from a {@link htsjdk.samtools.fastq.FastqRecord}.
- * @return a read name appropriate for output in a SAM/BAM file.
- */
- // Read names cannot contain blanks
- public static String getSamReadNameFromFastqHeader(final String fastqHeader) {
- final int idx = fastqHeader.indexOf(" ");
- String readName = (idx == -1) ? fastqHeader : fastqHeader.substring(0,idx);
-
- // NOTE: the while loop isn't necessarily the most efficient way to handle this but we don't
- // expect this to ever happen more than once, just trapping pathological cases
- while ((readName.endsWith("/1") || readName.endsWith("/2"))) {
- // If this is an unpaired run we want to make sure that "/1" isn't tacked on the end of the read name,
- // as this can cause problems down the road (ex. in Picard's MergeBamAlignment).
- readName = readName.substring(0, readName.length() - 2);
- }
-
- return readName;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SnappyLoader.java b/src/main/java/htsjdk/samtools/util/SnappyLoader.java
deleted file mode 100644
index 52abcef..0000000
--- a/src/main/java/htsjdk/samtools/util/SnappyLoader.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import org.xerial.snappy.LoadSnappy;
-import org.xerial.snappy.SnappyInputStream;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Constructor;
-
-/**
- * If Snappy is available, obtain single-arg ctors for SnappyInputStream and SnappyOutputStream.
- */
-public class SnappyLoader {
- private static final int SNAPPY_BLOCK_SIZE = 32768; // keep this as small as can be without hurting compression ratio.
- private final Constructor<InputStream> SnappyInputStreamCtor;
- private final Constructor<OutputStream> SnappyOutputStreamCtor;
- public final boolean SnappyAvailable;
-
- // Force Snappy-java code to be loaded into executable jars.
- private final SnappyInputStream ignoreMe = null;
-
- // Force bcel to load Snappy.
- //private static final Class SnappyClass = SnappyInputStream.class;
-
- private static final boolean DefaultVerbosity = Boolean.valueOf(System.getProperty("snappy.loader.verbosity", "false"));
-
- public SnappyLoader() {
- this(DefaultVerbosity);
- }
-
- /**
- * Constructs a new SnappyLoader which will check to see if snappy is available in the JVM/library path.
- * @param verbose if true output a small number of debug messages to System.err
- */
- public SnappyLoader(final boolean verbose) {
- Constructor<InputStream> inputStreamCtor = null;
- Constructor<OutputStream> outputStreamCtor = null;
- Class<Error> snappyErrorClass = null;
-
- if (java.lang.Boolean.valueOf(System.getProperty("snappy.disable", "false"))) {
- System.err.println("Snappy is disabled via system property.");
- }
- else {
- try {
- final Class<InputStream> snappyInputStreamClass = (Class<InputStream>)Class.forName("org.xerial.snappy.SnappyInputStream");
- final Class<OutputStream> snappyOutputStreamClass = (Class<OutputStream>)Class.forName("org.xerial.snappy.SnappyOutputStream");
- snappyErrorClass = (Class<Error>)Class.forName("org.xerial.snappy.SnappyError");
- inputStreamCtor = snappyInputStreamClass.getConstructor(InputStream.class);
- outputStreamCtor = snappyOutputStreamClass.getConstructor(OutputStream.class, Integer.TYPE);
- }
- catch (NoSuchMethodException e) { /* Do nothing. */ }
- catch (ClassNotFoundException e) { /* Do nothing. */ }
- }
-
- this.SnappyInputStreamCtor = inputStreamCtor;
- this.SnappyOutputStreamCtor = outputStreamCtor;
-
- if (this.SnappyInputStreamCtor != null && this.SnappyOutputStreamCtor != null) {
- // Don't try to call any Snappy code until classes have been found via reflection above.
- boolean tmpSnappyAvailable;
- try {
- if (!LoadSnappy.load()) {
- if (verbose) System.err.println("Snappy dll failed to load.");
- tmpSnappyAvailable = false;
- }
- else {
- if (verbose) System.err.println("Snappy stream classes loaded.");
- tmpSnappyAvailable = true;
- }
- } catch (Error e) {
- if (e.getClass().equals(snappyErrorClass)) {
- if (verbose) System.err.println("Snappy dll failed to load: " + e.getMessage());
- tmpSnappyAvailable = false;
- } else {
- throw e;
- }
- }
- SnappyAvailable = tmpSnappyAvailable;
- }
- else {
- if (verbose) System.err.println("Snappy stream classes not loaded.");
- SnappyAvailable = false;
- }
- }
-
- /** Wrap an InputStream in a SnappyInputStream. If Snappy is not available will throw an exception. */
- public InputStream wrapInputStream(final InputStream inputStream) {
- try {
- return SnappyInputStreamCtor.newInstance(inputStream);
- } catch (Exception e) {
- throw new SAMException("Error instantiating SnappyInputStream", e);
- }
- }
-
- /** Wrap an InputStream in a SnappyInputStream. If Snappy is not available will throw an exception. */
- public OutputStream wrapOutputStream(final OutputStream outputStream) {
- try {
- return SnappyOutputStreamCtor.newInstance(outputStream, SNAPPY_BLOCK_SIZE);
- } catch (Exception e) {
- throw new SAMException("Error instantiating SnappyOutputStream", e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java b/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java
deleted file mode 100644
index ba12678..0000000
--- a/src/main/java/htsjdk/samtools/util/SolexaQualityConverter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Optimized method for converting Solexa ASCII qualities into Phred scores.
- * Pre-computes all values in order to eliminate repeated computation.
- */
-public class SolexaQualityConverter {
-
- /**
- * This value is added to a Solexa quality score to make it printable ASCII
- */
- public static final int SOLEXA_ADDEND = 64;
-
- /**
- * This value is added to a Phred scord to make it printable ASCII
- */
- public static final int PHRED_ADDEND = 33;
-
- /**
- * This value is removed from an Illumina 1.8 quality score to make it a Phred score
- */
- public final static int ILLUMINA_TO_PHRED_SUBTRAHEND = SOLEXA_ADDEND - PHRED_ADDEND;
-
- private static SolexaQualityConverter singleton = null;
-
- public static synchronized SolexaQualityConverter getSingleton() {
- if (singleton == null) {
- singleton = new SolexaQualityConverter();
- }
- return singleton;
- }
-
- /**
- * Mapping from ASCII value in Gerald export file to phred score
- */
- private final byte[] phredScore = new byte[256];
-
- private SolexaQualityConverter() {
- for (int i = 0; i < SOLEXA_ADDEND; ++i) {
- phredScore[i] = 0;
- }
- for (int i = SOLEXA_ADDEND; i < phredScore.length; ++i) {
- phredScore[i] = convertSolexaQualityCharToPhredBinary(i);
- }
- }
-
-
- /** Converts a solexa character quality into a phred numeric quality. */
- private byte convertSolexaQualityCharToPhredBinary(final int solexaQuality) {
- return (byte) Math.round(10d * Math.log10(1d+Math.pow(10d, (solexaQuality - SOLEXA_ADDEND)/10d)));
- }
-
- /**
- * Convert a solexa quality ASCII character into a phred score.
- */
- public byte solexaCharToPhredBinary(final byte solexaQuality) {
- return phredScore[solexaQuality];
- }
-
- /**
- * @return a byte array that can be indexed by Solexa ASCII quality, with value
- * of corresponding Phred score. Elements 0-63 are invalid because Solexa qualities
- * should all be >= 64. Do not modify this array!
- */
- public byte[] getSolexaToPhredConversionTable() {
- return phredScore;
- }
-
- /**
- * Decodes an array of solexa quality ASCII chars into Phred numeric space.
- * Decode in place in order to avoid extra object allocation.
- */
- public void convertSolexaQualityCharsToPhredBinary(final byte[] solexaQuals) {
- for (int i=0; i<solexaQuals.length; ++i) {
- solexaQuals[i] = phredScore[solexaQuals[i]];
- }
- }
-
- /**
- * Decodes an array of solexa quality ASCII chars into Phred ASCII space.
- * Decode in place in order to avoid extra object allocation.
- */
- public void convertSolexaQualityCharsToPhredChars(final byte[] solexaQuals) {
- for (int i=0; i<solexaQuals.length; ++i) {
- solexaQuals[i] = (byte)((phredScore[solexaQuals[i]] + PHRED_ADDEND) & 0xff);
- }
- }
-
- /**
- * Casava 1.3 stores phred-scaled qualities, but non-standard because they have 64 added to them
- * rather than the standard 33.
- * @param solexaQuals qualities are converted in place.
- */
- public void convertSolexa_1_3_QualityCharsToPhredBinary(final byte[] solexaQuals) {
- for (int i=0; i<solexaQuals.length; ++i) {
- solexaQuals[i] -= SOLEXA_ADDEND;
- }
- }
-
- public void convertSolexa_1_3_QualityCharsToPhredBinary(int offset, int length, final byte[] solexaQuals) {
- final int limit = offset + length;
- for (int i=offset; i < limit; ++i) {
- solexaQuals[i] -= SOLEXA_ADDEND;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SortingCollection.java b/src/main/java/htsjdk/samtools/util/SortingCollection.java
deleted file mode 100644
index 6babd4e..0000000
--- a/src/main/java/htsjdk/samtools/util/SortingCollection.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Defaults;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.TreeSet;
-
-/**
- * Collection to which many records can be added. After all records are added, the collection can be
- * iterated, and the records will be returned in order defined by the comparator. Records may be spilled
- * to a temporary directory if there are more records added than will fit in memory. As a result of this,
- * the objects returned may not be identical to the objects added to the collection, but they should be
- * equal as determined by the codec used to write them to disk and read them back.
- *
- * When iterating over the collection, the number of file handles required is numRecordsInCollection/maxRecordsInRam.
- * If this becomes a limiting factor, a file handle cache could be added.
- *
- * If Snappy DLL is available and snappy.disable system property is not set to true, then Snappy is used
- * to compress temporary files.
- */
-public class SortingCollection<T> implements Iterable<T> {
-
- /**
- * Client must implement this class, which defines the way in which records are written to and
- * read from file.
- */
- public interface Codec<T> extends Cloneable {
- /**
- * Where to write encoded output
- * @param os
- */
- void setOutputStream(OutputStream os);
-
- /**
- * Where to read encoded input from
- * @param is
- */
- void setInputStream(InputStream is);
- /**
- * Write object to output stream
- * @param val what to write
- */
- void encode(T val);
-
- /**
- * Read the next record from the input stream and convert into a java object.
- * @return null if no more records. Should throw exception if EOF is encountered in the middle of
- * a record.
- */
- T decode();
-
- /**
- * Must return a cloned copy of the codec that can be used independently of
- * the original instance. This is required so that multiple codecs can exist simultaneously
- * that each is reading a separate file.
- */
- Codec<T> clone();
- }
-
- /** Directories where files of sorted records go. */
- private final File[] tmpDirs;
-
- /** The minimum amount of space free on a temp filesystem to write a file there. */
- private final long TMP_SPACE_FREE = IOUtil.FIVE_GBS;
-
- /**
- * Used to write records to file, and used as a prototype to create codecs for reading.
- */
- private final SortingCollection.Codec<T> codec;
-
- /**
- * For sorting, both when spilling records to file, and merge sorting.
- */
- private final Comparator<T> comparator;
- private final int maxRecordsInRam;
- private int numRecordsInRam = 0;
- private T[] ramRecords;
- private boolean iterationStarted = false;
- private boolean doneAdding = false;
-
- /**
- * Set to true when all temp files have been cleaned up
- */
- private boolean cleanedUp = false;
-
- /**
- * List of files in tmpDir containing sorted records
- */
- private final List<File> files = new ArrayList<File>();
-
- private boolean destructiveIteration = true;
-
- private TempStreamFactory tempStreamFactory = new TempStreamFactory();
-
- /**
- * Prepare to accumulate records to be sorted
- * @param componentType Class of the record to be sorted. Necessary because of Java generic lameness.
- * @param codec For writing records to file and reading them back into RAM
- * @param comparator Defines output sort order
- * @param maxRecordsInRam how many records to accumulate before spilling to disk
- * @param tmpDir Where to write files of records that will not fit in RAM
- */
- private SortingCollection(final Class<T> componentType, final SortingCollection.Codec<T> codec,
- final Comparator<T> comparator, final int maxRecordsInRam, final File... tmpDir) {
- if (maxRecordsInRam <= 0) {
- throw new IllegalArgumentException("maxRecordsInRam must be > 0");
- }
-
- if (tmpDir == null || tmpDir.length == 0) {
- throw new IllegalArgumentException("At least one temp directory must be provided.");
- }
-
- this.tmpDirs = tmpDir;
- this.codec = codec;
- this.comparator = comparator;
- this.maxRecordsInRam = maxRecordsInRam;
- this.ramRecords = (T[])Array.newInstance(componentType, maxRecordsInRam);
- }
-
- public void add(final T rec) {
- if (doneAdding) {
- throw new IllegalStateException("Cannot add after calling doneAdding()");
- }
- if (iterationStarted) {
- throw new IllegalStateException("Cannot add after calling iterator()");
- }
- if (numRecordsInRam == maxRecordsInRam) {
- spillToDisk();
- }
- ramRecords[numRecordsInRam++] = rec;
- }
-
- /**
- * This method can be called after caller is done adding to collection, in order to possibly free
- * up memory. If iterator() is called immediately after caller is done adding, this is not necessary,
- * because iterator() triggers the same freeing.
- */
- public void doneAdding() {
- if (this.cleanedUp) {
- throw new IllegalStateException("Cannot call doneAdding() after cleanup() was called.");
- }
- if (doneAdding) {
- return;
- }
-
- doneAdding = true;
-
- if (this.files.isEmpty()) {
- return;
- }
-
- if (this.numRecordsInRam > 0) {
- spillToDisk();
- }
-
- // Facilitate GC
- this.ramRecords = null;
- }
-
- /**
- * @return True if this collection is allowed to discard data during iteration in order to reduce memory
- * footprint, precluding a second iteration over the collection.
- */
- public boolean isDestructiveIteration() {
- return destructiveIteration;
- }
-
- /**
- * Tell this collection that it is allowed to discard data during iteration in order to reduce memory footprint,
- * precluding a second iteration. This is true by default.
- */
- public void setDestructiveIteration(boolean destructiveIteration) {
- this.destructiveIteration = destructiveIteration;
- }
-
- /**
- * Sort the records in memory, write them to a file, and clear the buffer of records in memory.
- */
- private void spillToDisk() {
- try {
- Arrays.sort(this.ramRecords, 0, this.numRecordsInRam, this.comparator);
- final File f = newTempFile();
- OutputStream os = null;
- try {
- os = tempStreamFactory.wrapTempOutputStream(new FileOutputStream(f), Defaults.BUFFER_SIZE);
- this.codec.setOutputStream(os);
- for (int i = 0; i < this.numRecordsInRam; ++i) {
- this.codec.encode(ramRecords[i]);
- // Facilitate GC
- this.ramRecords[i] = null;
- }
-
- os.flush();
- } catch (RuntimeIOException ex) {
- throw new RuntimeIOException("Problem writing temporary file " + f.getAbsolutePath() +
- ". Try setting TMP_DIR to a file system with lots of space.", ex);
- } finally {
- if (os != null) {
- os.close();
- }
- }
-
- this.numRecordsInRam = 0;
- this.files.add(f);
-
- }
- catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Creates a new tmp file on one of the available temp filesystems, registers it for deletion
- * on JVM exit and then returns it.
- */
- private File newTempFile() throws IOException {
- return IOUtil.newTempFile("sortingcollection.", ".tmp", this.tmpDirs, TMP_SPACE_FREE);
- }
-
- /**
- * Prepare to iterate through the records in order. This method may be called more than once,
- * but add() may not be called after this method has been called.
- */
- public CloseableIterator<T> iterator() {
- if (this.cleanedUp) {
- throw new IllegalStateException("Cannot call iterator() after cleanup() was called.");
- }
- doneAdding();
-
- this.iterationStarted = true;
- if (this.files.isEmpty()) {
- return new InMemoryIterator();
- } else {
- return new MergingIterator();
- }
- }
-
- /**
- * Delete any temporary files. After this method is called, iterator() may not be called.
- */
- public void cleanup() {
- this.iterationStarted = true;
- this.cleanedUp = true;
-
- IOUtil.deleteFiles(this.files);
- }
-
- /**
- * Syntactic sugar around the ctor, to save some typing of type parameters
- *
- * @param componentType Class of the record to be sorted. Necessary because of Java generic lameness.
- * @param codec For writing records to file and reading them back into RAM
- * @param comparator Defines output sort order
- * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
- * @param tmpDir Where to write files of records that will not fit in RAM
- */
- public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
- final SortingCollection.Codec<T> codec,
- final Comparator<T> comparator,
- final int maxRecordsInRAM,
- final File... tmpDir) {
- return new SortingCollection<T>(componentType, codec, comparator, maxRecordsInRAM, tmpDir);
-
- }
-
- /**
- * Syntactic sugar around the ctor, to save some typing of type parameters
- *
- * @param componentType Class of the record to be sorted. Necessary because of Java generic lameness.
- * @param codec For writing records to file and reading them back into RAM
- * @param comparator Defines output sort order
- * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
- * @param tmpDirs Where to write files of records that will not fit in RAM
- */
- public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
- final SortingCollection.Codec<T> codec,
- final Comparator<T> comparator,
- final int maxRecordsInRAM,
- final Collection<File> tmpDirs) {
- return new SortingCollection<T>(componentType,
- codec,
- comparator,
- maxRecordsInRAM,
- tmpDirs.toArray(new File[tmpDirs.size()]));
-
- }
-
-
- /**
- * Syntactic sugar around the ctor, to save some typing of type parameters. Writes files to java.io.tmpdir
- *
- * @param componentType Class of the record to be sorted. Necessary because of Java generic lameness.
- * @param codec For writing records to file and reading them back into RAM
- * @param comparator Defines output sort order
- * @param maxRecordsInRAM how many records to accumulate in memory before spilling to disk
- */
- public static <T> SortingCollection<T> newInstance(final Class<T> componentType,
- final SortingCollection.Codec<T> codec,
- final Comparator<T> comparator,
- final int maxRecordsInRAM) {
-
- final File tmpDir = new File(System.getProperty("java.io.tmpdir"));
- return new SortingCollection<T>(componentType, codec, comparator, maxRecordsInRAM, tmpDir);
- }
-
- /**
- * For iteration when number of records added is less than the threshold for spilling to disk.
- */
- class InMemoryIterator implements CloseableIterator<T> {
- private int iterationIndex = 0;
-
- InMemoryIterator() {
- Arrays.sort(SortingCollection.this.ramRecords,
- 0,
- SortingCollection.this.numRecordsInRam,
- SortingCollection.this.comparator);
- }
-
- public void close() {
- // nothing to do
- }
-
- public boolean hasNext() {
- return this.iterationIndex < SortingCollection.this.numRecordsInRam;
- }
-
- public T next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- T ret = SortingCollection.this.ramRecords[iterationIndex];
- if (destructiveIteration) SortingCollection.this.ramRecords[iterationIndex] = null;
- ++iterationIndex;
- return ret;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * For iteration when spilling to disk has occurred.
- * Each file is has records in sort order within the file.
- * This iterator automatically closes when it iterates to the end, but if not iterating
- * to the end it is a good idea to call close().
- *
- * Algorithm: MergingIterator maintains a PriorityQueue of PeekFileRecordIterators.
- * Each PeekFileRecordIterator iterates through a file in which the records are sorted.
- * The comparator for PeekFileRecordIterator used by the PriorityQueue peeks at the next record from
- * the file, so the first element in the PriorityQueue is the file that has the next record to be emitted.
- * In order to get the next record, the first PeekFileRecordIterator in the PriorityQueue is popped,
- * the record is obtained from that iterator, and then if that iterator is not empty, it is pushed back into
- * the PriorityQueue. Because it now has a different record as its next element, it may go into another
- * location in the PriorityQueue
- */
- class MergingIterator implements CloseableIterator<T> {
- private final TreeSet<PeekFileRecordIterator> queue;
-
- MergingIterator() {
- this.queue = new TreeSet<PeekFileRecordIterator>(new PeekFileRecordIteratorComparator());
- int n = 0;
- for (final File f : SortingCollection.this.files) {
- final FileRecordIterator it = new FileRecordIterator(f);
- if (it.hasNext()) {
- this.queue.add(new PeekFileRecordIterator(it, n++));
- }
- else {
- it.close();
- }
- }
- }
-
- public boolean hasNext() {
- return !this.queue.isEmpty();
- }
-
- public T next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
-
- final PeekFileRecordIterator fileIterator = queue.pollFirst();
- final T ret = fileIterator.next();
- if (fileIterator.hasNext()) {
- this.queue.add(fileIterator);
- }
- else {
- ((CloseableIterator<T>)fileIterator.getUnderlyingIterator()).close();
- }
-
- return ret;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- public void close() {
- while (!this.queue.isEmpty()) {
- final PeekFileRecordIterator it = this.queue.pollFirst();
- ((CloseableIterator<T>)it.getUnderlyingIterator()).close();
- }
- }
- }
-
- /**
- * Read a file of records in format defined by the codec
- */
- class FileRecordIterator implements CloseableIterator<T> {
- private final File file;
- private final FileInputStream is;
- private final Codec<T> codec;
- private T currentRecord = null;
-
- FileRecordIterator(final File file) {
- this.file = file;
- try {
- this.is = new FileInputStream(file);
- this.codec = SortingCollection.this.codec.clone();
- this.codec.setInputStream(tempStreamFactory.wrapTempInputStream(this.is, Defaults.BUFFER_SIZE));
- advance();
- }
- catch (FileNotFoundException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- public boolean hasNext() {
- return this.currentRecord != null;
- }
-
- public T next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- final T ret = this.currentRecord;
- advance();
- return ret;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- private void advance() {
- this.currentRecord = this.codec.decode();
- }
-
- public void close() {
- CloserUtil.close(this.is);
- }
- }
-
-
- /**
- * Just a typedef
- */
- class PeekFileRecordIterator extends PeekIterator<T> {
- final int n; // A serial number used for tie-breaking in the sort
- PeekFileRecordIterator(final Iterator<T> underlyingIterator, final int n) {
- super(underlyingIterator);
- this.n = n;
- }
- }
-
- class PeekFileRecordIteratorComparator implements Comparator<PeekFileRecordIterator>, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(final PeekFileRecordIterator lhs, final PeekFileRecordIterator rhs) {
- final int result = comparator.compare(lhs.peek(), rhs.peek());
- if (result == 0) return lhs.n - rhs.n;
- else return result;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/SortingLongCollection.java b/src/main/java/htsjdk/samtools/util/SortingLongCollection.java
deleted file mode 100644
index 4cf0c36..0000000
--- a/src/main/java/htsjdk/samtools/util/SortingLongCollection.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.PriorityQueue;
-
-/**
- * Accumulate a list of longs that can then be sorted in natural order and iterated over.
- * If there are more values accumulated than a specified maximum, values are spilled to disk.
- * <p/>
- * Note that because this class returns primitive longs rather than Longs, it does not conform to
- * any of the Collection iteration interfaces. Use as follows:
- * <p/>
- * 1. ctor
- * 2. call add() as many times as desired.
- * 3. call doneAddingStartIteration().
- * 4. call hasNext() and next() until exhausted or had enough.
- * 5. optionally call cleanup() to free space in temporary directory as soon as possible.
- * <p/>
- * If there are few enough values so that they all can be kept in RAM, then the array is sorted
- * and iterated over trivially.
- * <p/>
- * If there are more values that can fit in RAM, then values are sorted and written to a temp file when the max
- * number to be stored in RAM is reached. Multiple temp files are then merged during iteration via PriorityQueue.
- * <p/>
- * c.f. SortingCollection for more details.
- *
- * @author alecw at broadinstitute.org
- */
-public class SortingLongCollection {
- public static final int SIZEOF = 8;
- public static final int MAX_ITEMS_IN_RAM = (int) Math.floor((Integer.MAX_VALUE / 8) * .999);
-
- /**
- * Where files of sorted values go.
- */
- private final File[] tmpDir;
-
- private final int maxValuesInRam;
- private int numValuesInRam = 0;
- private long[] ramValues;
-
-
- /**
- * Set to true when done adding and ready to iterate
- */
- private boolean doneAdding = false;
-
- /**
- * Set to true when all temp files have been cleaned up
- */
- private boolean cleanedUp = false;
-
- /**
- * List of files in tmpDir containing sorted values
- */
- private final List<File> files = new ArrayList<File>();
-
- // for in-memory iteration
- private int iterationIndex = 0;
-
- // For disk-based iteration
- private PriorityQueue<PeekFileValueIterator> priorityQueue;
-
- /**
- * Prepare to accumulate values to be sorted
- *
- * @param maxValuesInRam how many values to accumulate before spilling to disk
- * @param tmpDir Where to write files of values that will not fit in RAM
- */
- public SortingLongCollection(final int maxValuesInRam, final File... tmpDir) {
- if (maxValuesInRam <= 0) {
- throw new IllegalArgumentException("maxValuesInRam must be > 0");
- }
- this.tmpDir = tmpDir;
- this.maxValuesInRam = Math.min(maxValuesInRam, MAX_ITEMS_IN_RAM);
- this.ramValues = new long[maxValuesInRam];
- }
-
- /**
- * Add a value to the collection.
- *
- * @param value
- */
- public void add(final long value) {
- if (doneAdding) {
- throw new IllegalStateException("Cannot add after calling doneAddingStartIteration()");
- }
- if (numValuesInRam == maxValuesInRam) {
- spillToDisk();
- }
- ramValues[numValuesInRam++] = value;
- }
-
- /**
- * This method must be called after done adding, and before calling hasNext() or next().
- */
- public void doneAddingStartIteration() {
- if (cleanedUp || doneAdding) {
- throw new IllegalStateException("Cannot call doneAddingStartIteration() after cleanup() was called.");
- }
- doneAdding = true;
-
- if (this.files.isEmpty()) {
- Arrays.sort(this.ramValues, 0, this.numValuesInRam);
- return;
- }
-
- if (this.numValuesInRam > 0) {
- spillToDisk();
- }
-
- this.priorityQueue = new PriorityQueue<PeekFileValueIterator>(files.size(),
- new PeekFileValueIteratorComparator());
- for (final File f : files) {
- final FileValueIterator it = new FileValueIterator(f);
- if (it.hasNext()) {
- this.priorityQueue.offer(new PeekFileValueIterator(it));
- }
- }
-
- // Facilitate GC
- this.ramValues = null;
- }
-
- /**
- * Sort the values in memory, write them to a file, and clear the buffer of values in memory.
- */
- private void spillToDisk() {
-
- try {
- Arrays.sort(this.ramValues, 0, this.numValuesInRam);
- final File f = IOUtil.newTempFile("sortingcollection.", ".tmp", this.tmpDir, IOUtil.FIVE_GBS);
- DataOutputStream os = null;
- try {
- final long numBytes = this.numValuesInRam * SIZEOF;
- os = new DataOutputStream(IOUtil.maybeBufferOutputStream(new FileOutputStream(f)));
- f.deleteOnExit();
- for (int i = 0; i < this.numValuesInRam; ++i) {
- os.writeLong(ramValues[i]);
- }
- os.flush();
- } finally {
- if (os != null) {
- os.close();
- }
- }
-
- this.numValuesInRam = 0;
- this.files.add(f);
-
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Delete any temporary files. After this method is called, no other method calls should be made on this object.
- */
- public void cleanup() {
- this.doneAdding = true;
- this.cleanedUp = true;
- this.ramValues = null;
-
- IOUtil.deleteFiles(this.files);
- }
-
-
- /**
- * Call only after doneAddingStartIteration() has been called.
- *
- * @return true if there is another value to be gotten.
- */
- public boolean hasNext() {
- if (!doneAdding || cleanedUp) {
- throw new IllegalStateException();
- }
- if (this.ramValues != null) {
- // in-memory iteration
- return this.iterationIndex < numValuesInRam;
- } else {
- return !priorityQueue.isEmpty();
- }
- }
-
- /**
- * Call only if hasNext() == true.
- *
- * @return next value from collection, in natural sort order.
- */
- public long next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- if (this.ramValues != null) {
- // in-memory iteration
- return ramValues[iterationIndex++];
- } else {
-
- final PeekFileValueIterator fileIterator = priorityQueue.poll();
- final long ret = fileIterator.next();
- if (fileIterator.hasNext()) {
- this.priorityQueue.offer(fileIterator);
- } else {
- fileIterator.close();
- }
- return ret;
- }
- }
-
- /**
- * Read a file of longs
- */
- private static class FileValueIterator {
- private final File file;
- private final DataInputStream is;
- private long currentRecord = 0;
- private boolean isCurrentRecord = true;
-
- FileValueIterator(final File file) {
- this.file = file;
- try {
- is = new DataInputStream(IOUtil.maybeBufferInputStream(new FileInputStream(file)));
- next();
- } catch (FileNotFoundException e) {
- throw new RuntimeIOException(file.getAbsolutePath(), e);
- }
- }
-
- boolean hasNext() {
- return isCurrentRecord;
- }
-
- long next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- final long ret = currentRecord;
- try {
- currentRecord = is.readLong();
- } catch (final EOFException eof) {
- isCurrentRecord = false;
- currentRecord = 0;
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- return ret;
- }
-
- void close() {
- CloserUtil.close(is);
- }
- }
-
-
- /**
- * Add peek() functionality to FileValueIterator
- */
- private static class PeekFileValueIterator {
- private FileValueIterator underlyingIterator;
- private long peekValue;
- private boolean hasPeekedValue = false;
-
- PeekFileValueIterator(final FileValueIterator underlyingIterator) {
- this.underlyingIterator = underlyingIterator;
- }
-
- boolean hasNext() {
- return hasPeekedValue || underlyingIterator.hasNext();
- }
-
- long next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- if (hasPeekedValue) {
- hasPeekedValue = false;
- return peekValue;
- }
- return underlyingIterator.next();
- }
-
- long peek() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- if (!hasPeekedValue) {
- peekValue = underlyingIterator.next();
- hasPeekedValue = true;
- }
- return peekValue;
- }
-
- void close() {
- underlyingIterator.close();
- hasPeekedValue = false;
- underlyingIterator = null;
- }
- }
-
- private static class PeekFileValueIteratorComparator implements Comparator<PeekFileValueIterator>, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(final PeekFileValueIterator it1, final PeekFileValueIterator it2) {
- if (it1.peek() < it2.peek()) {
- return -1;
- }
- if (it1.peek() == it2.peek()) {
- return 0;
- }
- return 1;
- }
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StopWatch.java b/src/main/java/htsjdk/samtools/util/StopWatch.java
deleted file mode 100644
index 8e12916..0000000
--- a/src/main/java/htsjdk/samtools/util/StopWatch.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Utility to help in performance testing.
- */
-public class StopWatch {
-
- private long startTime = 0;
- private long elapsedTime = 0;
- private boolean running = false;
-
-
- public void start() {
- this.startTime = System.currentTimeMillis();
- this.running = true;
- }
-
-
- public void stop() {
- long stopTime = System.currentTimeMillis();
- elapsedTime += stopTime - startTime;
- this.running = false;
- }
-
- public void reset() {
- stop();
- elapsedTime = 0;
- startTime = 0;
- }
-
- /**
- * Returns the cumulative time between all the start() and stop() calls made to this object. If the
- * StopWatch is currently running, also includes the time between the most recent start() and now.
- * @return elapsedTime in milliseconds
- */
- public long getElapsedTime() {
- final long currentElapsed;
- if (running) {
- currentElapsed = (System.currentTimeMillis() - startTime);
- } else {
- currentElapsed = 0;
- }
- return currentElapsed + elapsedTime;
- }
-
-
- /**
- * @return same as getElapsedTime(), but truncated to seconds.
- */
- public long getElapsedTimeSecs() {
- return getElapsedTime() / 1000;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StringLineReader.java b/src/main/java/htsjdk/samtools/util/StringLineReader.java
deleted file mode 100644
index ed383a2..0000000
--- a/src/main/java/htsjdk/samtools/util/StringLineReader.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import java.util.regex.Pattern;
-
-/**
- * Implementation of LineReader that gets its input from a String. No charset conversion
- * is necessary because the String is in unicode. Handles CR, LF or CRLF line termination,
- * but if asked to return the line terminator, it always comes back as LF.
- */
-public class StringLineReader implements LineReader {
- private static final Pattern CRLF = Pattern.compile("\r\n");
- private final String theString;
- private int curPos = 0;
- private int lineNumber = 0;
-
- public StringLineReader(final String s) {
- // Simplify later processing by replacing crlf with just lf, and replacing solo cr with lf.
- // Note that String.replace(String, String) causes a regex to be used, so precompilation should be
- // the best we can do short of handling the string directly.
- this.theString = CRLF.matcher(s).replaceAll("\n").replace('\r', '\n');
- }
-
- /**
- * Read a line and remove the line terminator
- */
- public String readLine() {
- return readLine(false);
- }
-
- /**
- * Read a line and optionally include the line terminator
- *
- * @param includeTerminators
- * @return the next line from the input, with \n terminator if present and requested, or null if no more input.
- */
- private String readLine(final boolean includeTerminators) {
- if (curPos == theString.length()) {
- return null;
- }
- final int nextLfIndex = theString.indexOf('\n', curPos);
- if (nextLfIndex == -1) {
- final int startPos = curPos;
- curPos = theString.length();
- ++lineNumber;
- return theString.substring(startPos);
- }
- final int startPos = curPos;
- final int endPos = nextLfIndex + (includeTerminators? 1: 0);
- curPos = nextLfIndex + 1;
- ++lineNumber;
- return theString.substring(startPos, endPos);
- }
-
- /**
- * @return 1-based number of line most recently read
- */
- public int getLineNumber() {
- return lineNumber;
- }
-
- /**
- * Non-destructive one-character look-ahead.
- *
- * @return If not eof, the next character that would be read. If eof, -1.
- */
- public int peek() {
- if (curPos == theString.length()) {
- return -1;
- }
- return theString.charAt(curPos);
- }
-
- public void close() {
- curPos = theString.length();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/StringUtil.java b/src/main/java/htsjdk/samtools/util/StringUtil.java
deleted file mode 100644
index 9049253..0000000
--- a/src/main/java/htsjdk/samtools/util/StringUtil.java
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Grab-bag of stateless String-oriented utilities.
- */
-public class StringUtil {
- private static final byte UPPER_CASE_OFFSET = 'A' - 'a';
-
- /**
- * @param separator String to interject between each string in strings arg
- * @param objs List of objs to be joined
- * @return String that concatenates the result of each item's to String method for all items in objs, with separator between each of them.
- */
- public static <T> String join(final String separator, final Collection<T> objs) {
- if (objs.isEmpty()) {
- return "";
- }
-
- boolean notFirst = false;
-
- final StringBuilder ret = new StringBuilder();
- for (final Object obj : objs) {
- if(notFirst) {
- ret.append(separator);
- }
- ret.append(obj.toString());
- notFirst = true;
- }
- return ret.toString();
- }
-
- public static <T> String join(final String separator, final T... objs) {
- final List<T> values = Arrays.asList(objs);
- return join(separator, values);
- }
-
-
- /**
- * Split the string into tokens separated by the given delimiter. Profiling has
- * revealed that the standard string.split() method typically takes > 1/2
- * the total time when used for parsing ascii files.
- * Note that if tokens arg is not large enough to all the tokens in the string, excess tokens are discarded.
- *
- * @param aString the string to split
- * @param tokens an array to hold the parsed tokens
- * @param delim character that delimits tokens
- * @return the number of tokens parsed
- */
- public static int split(final String aString, final String[] tokens, final char delim) {
-
- final int maxTokens = tokens.length;
- int nTokens = 0;
- int start = 0;
- int end = aString.indexOf(delim);
- if(end < 0) {
- tokens[nTokens++] = aString;
- return nTokens;
- }
- while ((end >= 0) && (nTokens < maxTokens))
- {
- tokens[nTokens++] = aString.substring(start, end);
- start = end + 1;
- end = aString.indexOf(delim, start);
-
- }
- // Add the trailing string, if there is room and if it is not empty.
- if (nTokens < maxTokens)
- {
- final String trailingString = aString.substring(start);
- if (!trailingString.isEmpty())
- {
- tokens[nTokens++] = trailingString;
- }
- }
- return nTokens;
- }
-
- /**
- * Split the string into tokens separated by the given delimiter. Profiling has
- * revealed that the standard string.split() method typically takes > 1/2
- * the total time when used for parsing ascii files.
- * Note that the string is split into no more elements than tokens arg will hold, so the final tokenized
- * element may contain delimiter chars.
- *
- * @param aString the string to split
- * @param tokens an array to hold the parsed tokens
- * @param delim character that delimits tokens
- * @return the number of tokens parsed
- */
- public static int splitConcatenateExcessTokens(final String aString, final String[] tokens, final char delim) {
-
- final int maxTokens = tokens.length;
- int nTokens = 0;
- int start = 0;
- int end = aString.indexOf(delim);
- if(end < 0) {
- tokens[nTokens++] = aString;
- return nTokens;
- }
- while ((end >= 0) && (nTokens < maxTokens - 1))
- {
- tokens[nTokens++] = aString.substring(start, end);
- start = end + 1;
- end = aString.indexOf(delim, start);
-
- }
- // Add the trailing string, if it is not empty.
- final String trailingString = aString.substring(start);
- if (!trailingString.isEmpty())
- {
- tokens[nTokens++] = trailingString;
- }
- return nTokens;
- }
-
- /**
- * @param b ASCII character
- * @return lowercase version of arg if it was uppercase, otherwise returns arg
- */
- public static byte toLowerCase(final byte b) {
- if (b < 'A' || b > 'Z') {
- return b;
- }
- return (byte)(b - UPPER_CASE_OFFSET);
- }
-
- /**
- * @param b ASCII character
- * @return uppercase version of arg if it was lowercase, otherwise returns arg
- */
- public static byte toUpperCase(final byte b) {
- if (b < 'a' || b > 'z') {
- return b;
- }
- return (byte)(b + UPPER_CASE_OFFSET);
- }
-
- /**
- * Converts in place all lower case letters to upper case in the byte array provided.
- */
- public static void toUpperCase(final byte[] bytes) {
- final int length = bytes.length;
- for (int i=0; i<length; ++i) {
- if (bytes[i] >= 'a' && bytes[i] <= 'z') {
- bytes[i] = (byte) (bytes[i] + UPPER_CASE_OFFSET);
- }
- }
- }
-
-
- /**
- * Checks that a String doesn't contain one or more characters of interest.
- *
- * @param illegalChars the String to check
- * @param chars the characters to check for
- * @return String the input String for convenience
- * @throws IllegalArgumentException if the String contains one or more of the characters
- */
- public static String assertCharactersNotInString(final String illegalChars, final char... chars) {
- for (final char illegalChar : illegalChars.toCharArray()) {
- for (final char ch: chars) {
- if (illegalChar == ch) {
- throw new IllegalArgumentException("Supplied String contains illegal character '" + illegalChar + "'.");
- }
- }
- }
-
- return illegalChars;
- }
-
- /**
- * Return input string with newlines inserted to ensure that all lines
- * have length <= maxLineLength. if a word is too long, it is simply broken
- * at maxLineLength. Does not handle tabs intelligently (due to implementer laziness).
- */
- public static String wordWrap(final String s, final int maxLineLength) {
- final String[] lines = s.split("\n");
- final StringBuilder sb = new StringBuilder();
- for (final String line: lines) {
- if (sb.length() > 0) {
- sb.append('\n');
- }
- sb.append(wordWrapSingleLine(line, maxLineLength));
- }
- if (s.endsWith("\n")) {
- sb.append('\n');
- }
- return sb.toString();
- }
-
- public static String wordWrapSingleLine(final String s, final int maxLineLength) {
- if (s.length() <= maxLineLength) {
- return s;
- }
- final StringBuilder sb = new StringBuilder();
- int startCopyFrom = 0;
- while (startCopyFrom < s.length()) {
- int lastSpaceIndex = startCopyFrom;
- int i;
- // Find break point (if it exists)
- for (i = startCopyFrom; i < s.length() && i - startCopyFrom < maxLineLength; ++i) {
- if (Character.isWhitespace(s.charAt(i))) {
- lastSpaceIndex = i;
- }
- }
- if (i - startCopyFrom < maxLineLength) {
- lastSpaceIndex = i;
- }
- // Include any trailing whitespace
- for (; lastSpaceIndex < s.length() && Character.isWhitespace(s.charAt(lastSpaceIndex)); ++lastSpaceIndex) {}
- if (sb.length() > 0) {
- sb.append('\n');
- }
- // Handle situation in which there is no word break. Just break the word in the middle.
- if (lastSpaceIndex == startCopyFrom) {
- lastSpaceIndex = i;
- }
- sb.append(s.substring(startCopyFrom, lastSpaceIndex));
- startCopyFrom = lastSpaceIndex;
- }
- return sb.toString();
- }
-
-
- public static String intValuesToString(final int[] intVals) {
- final StringBuilder sb = new StringBuilder(intVals.length);
- if(intVals.length > 0) {
- sb.append(String.valueOf(intVals[0]));
- for(int i = 1; i < intVals.length; i++) {
- sb.append(", ");
- sb.append(String.valueOf(intVals[i]));
- }
- }
-
- return sb.toString();
- }
-
- public static String intValuesToString(final short[] shortVals) {
- final StringBuilder sb = new StringBuilder(shortVals.length);
- if(shortVals.length > 0) {
- sb.append(String.valueOf(shortVals[0]));
- for(int i = 1; i < shortVals.length; i++) {
- sb.append(", ");
- sb.append(String.valueOf(shortVals[i]));
- }
- }
-
- return sb.toString();
- }
-
- ////////////////////////////////////////////////////////////////////
- // The following methods all convert btw bytes and Strings, without
- // using the Java character set mechanism.
- ////////////////////////////////////////////////////////////////////
-
- public static String bytesToString(final byte[] data) {
- if (data == null) {
- return null;
- }
- return bytesToString(data, 0, data.length);
- }
-
- @SuppressWarnings("deprecation")
- public static String bytesToString(final byte[] buffer, final int offset, final int length) {
-/*
- The non-deprecated way, that requires allocating char[]
- final char[] charBuffer = new char[length];
- for (int i = 0; i < length; ++i) {
- charBuffer[i] = (char)buffer[i+offset];
- }
- return new String(charBuffer);
-*/
- return new String(buffer, 0, offset, length);
- }
-
- @SuppressWarnings("deprecation")
- public static byte[] stringToBytes(final String s) {
-/*
- The non-deprecated way, that requires allocating char[]
- final byte[] byteBuffer = new byte[s.length()];
- final char[] charBuffer = s.toCharArray();
- for (int i = 0; i < charBuffer.length; ++i) {
- byteBuffer[i] = (byte)(charBuffer[i] & 0xff);
- }
- return byteBuffer;
-*/
- final byte[] byteBuffer = new byte[s.length()];
- s.getBytes(0, byteBuffer.length, byteBuffer, 0);
- return byteBuffer;
- }
-
- @SuppressWarnings("deprecation")
- public static byte[] stringToBytes(final String s, final int offset, final int length) {
- final byte[] byteBuffer = new byte[length];
- s.getBytes(offset, offset + length, byteBuffer, 0);
- return byteBuffer;
- }
-
- // This method might more appropriately live in BinaryCodec, but all the byte <=> char conversion
- // should be in the same place.
- public static String readNullTerminatedString(final BinaryCodec binaryCodec) {
- final StringBuilder ret = new StringBuilder();
- for (byte b = binaryCodec.readByte(); b != 0; b = binaryCodec.readByte()) {
- ret.append((char)(b & 0xff));
- }
- return ret.toString();
- }
-
- /**
- * Convert chars to bytes merely by casting
- * @param chars input chars
- * @param charOffset where to start converting from chars array
- * @param length how many chars to convert
- * @param bytes where to put the converted output
- * @param byteOffset where to start writing the converted output.
- */
- public static void charsToBytes(final char[] chars, final int charOffset, final int length,
- final byte[] bytes, final int byteOffset) {
- for (int i = 0; i < length; ++i) {
- bytes[byteOffset + i] = (byte)chars[charOffset + i];
- }
- }
-
- /**
- * Convert ASCII char to byte.
- */
- public static byte charToByte(final char c) {
- return (byte)c;
- }
-
- /**
- * Convert ASCII byte to ASCII char.
- */
- public static char byteToChar(final byte b) {
- return (char)(b & 0xff);
- }
-
- /**
- * Convert a byte array into a String hex representation.
- * @param data Input to be converted.
- * @return String twice as long as data.length with hex representation of data.
- */
- public static String bytesToHexString(final byte[] data) {
- final char[] chars = new char[2 * data.length];
- for (int i = 0; i < data.length; i++) {
- final byte b = data[i];
- chars[2*i] = toHexDigit((b >> 4) & 0xF);
- chars[2*i+1] = toHexDigit(b & 0xF);
- }
- return new String(chars);
- }
-
- /**
- * Convert a String containing hex characters into an array of bytes with the binary representation
- * of the hex string
- * @param s Hex string. Length must be even because each pair of hex chars is converted into a byte.
- * @return byte array with binary representation of hex string.
- * @throws NumberFormatException
- */
- public static byte[] hexStringToBytes(final String s) throws NumberFormatException {
- if (s.length() % 2 != 0) {
- throw new NumberFormatException("Hex representation of byte string does not have even number of hex chars: " + s);
- }
- final byte[] ret = new byte[s.length() / 2];
- for (int i = 0; i < ret.length; ++i) {
- ret[i] = (byte) ((fromHexDigit(s.charAt(i * 2)) << 4) | fromHexDigit(s.charAt(i * 2 + 1)));
- }
- return ret;
- }
-
- public static char toHexDigit(final int value) {
- return (char) ((value < 10) ? ('0' + value) : ('A' + value - 10));
- }
-
- public static int fromHexDigit(final char c) throws NumberFormatException {
- final int ret = Character.digit(c, 16);
- if (ret == -1) {
- throw new NumberFormatException("Not a valid hex digit: " + c);
- }
- return ret;
- }
-
- /**
- * Reverse the given string. Does not check for null.
- * @param s String to be reversed.
- * @return New string that is the reverse of the input string.
- */
- public static String reverseString(final String s) {
- final StringBuilder sb = new StringBuilder(s);
- sb.reverse();
- return sb.toString();
- }
-
- /**
- * <p>Checks if a String is whitespace, empty ("") or null.</p>
- *
- * <pre>
- * StringUtils.isBlank(null) = true
- * StringUtils.isBlank("") = true
- * StringUtils.isBlank(" ") = true
- * StringUtils.isBlank("sam") = false
- * StringUtils.isBlank(" sam ") = false
- * </pre>
- *
- * @param str the String to check, may be null
- * @return <code>true</code> if the String is null, empty or whitespace
- */
- public static boolean isBlank(String str) {
- int strLen;
- if (str == null || (strLen = str.length()) == 0) {
- return true;
- }
- for (int i = 0; i < strLen; i++) {
- if (!Character.isWhitespace(str.charAt(i)) ) {
- return false;
- }
- }
- return true;
- }
-
- /* <p>Generates a string of one character to a specified length</p>
- *
- * @param c the Character to repeat
- * @param repeatNumber the number of times to repeat the character
- * @return String with the character c repeated repeatNumber times
- */
- public static String repeatCharNTimes(char c, int repeatNumber) {
- char[] output = new char[repeatNumber];
- Arrays.fill(output, c);
- return String.valueOf(output);
- }
-
- /** Returns {@link Object#toString()} of the provided value if it isn't null; "" otherwise. */
- public static final String EMPTY_STRING = "";
- public static String asEmptyIfNull(final Object string) {
- return string == null ? EMPTY_STRING : string.toString();
- }
-
- /*
- * This is from GIT!
- * This function implements the Damerau-Levenshtein algorithm to
- * calculate a distance between strings.
- *
- * Basically, it says how many letters need to be swapped, substituted,
- * deleted from, or added to string1, at least, to get string2.
- *
- * The idea is to build a distance matrix for the substrings of both
- * strings. To avoid a large space complexity, only the last three rows
- * are kept in memory (if swaps had the same or higher cost as one deletion
- * plus one insertion, only two rows would be needed).
- *
- * At any stage, "i + 1" denotes the length of the current substring of
- * string1 that the distance is calculated for.
- *
- * row2 holds the current row, row1 the previous row (i.e. for the substring
- * of string1 of length "i"), and row0 the row before that.
- *
- * In other words, at the start of the big loop, row2[j + 1] contains the
- * Damerau-Levenshtein distance between the substring of string1 of length
- * "i" and the substring of string2 of length "j + 1".
- *
- * All the big loop does is determine the partial minimum-cost paths.
- *
- * It does so by calculating the costs of the path ending in characters
- * i (in string1) and j (in string2), respectively, given that the last
- * operation is a substitution, a swap, a deletion, or an insertion.
- *
- * This implementation allows the costs to be weighted:
- *
- * Note that this algorithm calculates a distance _iff_ d == a.
- */
- public static int levenshteinDistance(final String string1, final String string2, int swap, int substitution, int insertion, int deletion) {
- int i, j;
-
- int[] row0 = new int[(string2.length() + 1)];
- int[] row1 = new int[(string2.length() + 1)];
- int[] row2 = new int[(string2.length() + 1)];
- int[] dummy;
-
- final byte[] str1 = string1.getBytes();
- final byte[] str2 = string2.getBytes();
-
- for (j = 0; j < str2.length; j++) {
- row1[j] = j * insertion;
- }
- for (i = 0; i < str1.length; i++) {
- row2[0] = (i + 1) * deletion;
- for (j = 0; j < str2.length; j++) {
- /* substitution */
- row2[j + 1] = row1[j];
- if (str1[i] != str2[j]) {
- row2[j + 1] += substitution;
- }
- /* swap */
- if (i > 0 && j > 0 && str1[i - 1] == str2[j] &&
- str1[i] == str2[j - 1] &&
- row2[j + 1] > row0[j - 1] + swap) {
- row2[j + 1] = row0[j - 1] + swap;
- }
- /* deletion */
- if (row2[j + 1] > row1[j + 1] + deletion) {
- row2[j + 1] = row1[j + 1] + deletion;
- }
- /* insertion */
- if (row2[j + 1] > row2[j] + insertion) {
- row2[j + 1] = row2[j] + insertion;
- }
- }
-
- dummy = row0;
- row0 = row1;
- row1 = row2;
- row2 = dummy;
- }
-
- i = row1[str2.length];
-
- return i;
- }
-
- /**
- * Calculates the Hamming distance (number of character mismatches) between two strings s1 and s2.
- * Since Hamming distance is not defined for strings of differing lengths, we throw an exception if
- * the two strings are of different lengths. Hamming distance is case sensitive and does not have
- * any special treatment for DNA.
- *
- * @param s1 The first string to compare
- * @param s2 The second string to compare, note that if s1 and s2 are swapped the value returned will be identical.
- * @return Hamming distance between s1 and s2.
- * @throws IllegalArgumentException If the two strings have differing lengths.
- */
- public static int hammingDistance(final String s1, final String s2) {
- if (s1.length() != s2.length()) {
- throw new IllegalArgumentException("Attempted to determine Hamming distance of strings with differing lengths. " +
- "The first string has length " + s1.length() + " and the second string has length " + s2.length() + ".");
- }
- int measuredDistance = 0;
- for (int i = 0;i < s1.length();i++) {
- if (s1.charAt(i) != s2.charAt(i)) {
- measuredDistance++;
- }
- }
- return measuredDistance;
- }
-
- /**
- * Determines if two strings s1 and s2 are within maxHammingDistance of each other using the Hamming distance metric.
- * Since Hamming distance is not defined for strings of differing lengths, we throw an exception if
- * the two strings are of different lengths. Hamming distance is case sensitive and does not have any
- * special treatment for DNA.
- *
- * @param s1 The first string to compare
- * @param s2 The second string to compare, note that if s1 and s2 are swapped the value returned will be identical.
- * @param maxHammingDistance The largest Hamming distance the strings can have for this function to return true.
- * @return true if the two strings are within maxHammingDistance of each other, false otherwise.
- * @throws IllegalArgumentException If the two strings have differing lengths.
- */
- public static boolean isWithinHammingDistance(final String s1, final String s2, final int maxHammingDistance) {
- if (s1.length() != s2.length()) {
- throw new IllegalArgumentException("Attempted to determine if two strings of different length were within a specified edit distance.");
- }
- int measuredDistance = 0;
- for (int i = 0;i < s1.length();i++) {
- if (s1.charAt(i) != s2.charAt(i)) {
- measuredDistance++;
- // If the measuredDistance is larger than the maxHammingDistance we can short circuit and return
- // false, there is no need to continue evaluating the distance.
- if (measuredDistance > maxHammingDistance) {
- return false;
- }
- }
- }
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TempStreamFactory.java b/src/main/java/htsjdk/samtools/util/TempStreamFactory.java
deleted file mode 100644
index 0915037..0000000
--- a/src/main/java/htsjdk/samtools/util/TempStreamFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Factory class for wrapping input and output streams for temporary files. If available, Snappy is used to
- * compress output files. Therefore, if a temporary output file is written with an output stream obtained
- * from this class, it must be read by an input stream created by this class, otherwise a file written with
- * compression will not be read with decompression.
- */
-public class TempStreamFactory {
- private static SnappyLoader snappyLoader = null;
-
- private static synchronized SnappyLoader getSnappyLoader() {
- if (snappyLoader == null) snappyLoader = new SnappyLoader();
- return snappyLoader;
- }
-
- /**
- * Wrap the given InputStream in a SnappyInputStream if available.
- * @return If Snappy is available, a SnappyInputStream wrapping inputStream.
- * If not, and bufferSize > 0, a BufferedInputStream.
- * Otherwise inputStream is returned.
- */
- public InputStream wrapTempInputStream(final InputStream inputStream, final int bufferSize) {
- InputStream is = IOUtil.maybeBufferInputStream(inputStream, bufferSize);
- if (getSnappyLoader().SnappyAvailable) {
- try {
- return getSnappyLoader().wrapInputStream(is);
- } catch (Exception e) {
- throw new SAMException("Error creating SnappyInputStream", e);
- }
- } else {
- return is;
- }
- }
-
- /**
- * Wrap the given OutputStream in a SnappyOutputStream if available.
- * @return If Snappy is available, a SnappyOutputStream wrapping outputStream.
- * If not, and bufferSize > 0, a BufferedOutputStream.
- * Otherwise outputStream is returned.
- */
- public OutputStream wrapTempOutputStream(final OutputStream outputStream, final int bufferSize) {
- OutputStream os = outputStream;
- if (bufferSize > 0) os = new BufferedOutputStream(os, bufferSize);
- if (getSnappyLoader().SnappyAvailable) {
- try {
- os = getSnappyLoader().wrapOutputStream(os);
- } catch (Exception e) {
- throw new SAMException("Error creating SnappyOutputStream", e);
- }
- }
- return os;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TestUtil.java b/src/main/java/htsjdk/samtools/util/TestUtil.java
deleted file mode 100644
index fd840d1..0000000
--- a/src/main/java/htsjdk/samtools/util/TestUtil.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.*;
-
-public class TestUtil {
-
- /**
- * Base url where all test files for http tests are found
- */
- public static final String BASE_URL_FOR_HTTP_TESTS = "https://personal.broadinstitute.org/picard/testdata/";
-
- public static File getTempDirectory(final String prefix, final String suffix) {
- final File tempDirectory;
- try {
- tempDirectory = File.createTempFile(prefix, suffix);
- } catch (IOException e) {
- throw new SAMException("Failed to create temporary file.", e);
- }
- if (!tempDirectory.delete())
- throw new SAMException("Failed to delete file: " + tempDirectory);
- if (!tempDirectory.mkdir())
- throw new SAMException("Failed to make directory: " + tempDirectory);
- tempDirectory.deleteOnExit();
- return tempDirectory;
- }
-
- /**
- * @deprecated Use properly spelled method. {@link #getTempDirectory}
- */
- @Deprecated
- public static File getTempDirecory(final String prefix, final String suffix) {
- return getTempDirectory(prefix, suffix);
- }
-
- /**
- * Little test utility to help tests that create multiple levels of subdirectories
- * clean up after themselves.
- *
- * @param directory The directory to be deleted (along with its subdirectories)
- */
- public static void recursiveDelete(final File directory) {
- for (final File f : directory.listFiles()) {
- if (f.isDirectory()) {
- recursiveDelete(f);
- }
- f.delete();
- }
- }
-
- /**
- * Serialize and Deserialize an object
- * Useful for testing if serialization is correctly handled for a class.
- * @param input an object to serialize and then deserialize
- * @param <T> any Serializable type
- * @return a copy of the initial object
- * @throws IOException
- * @throws ClassNotFoundException
- */
- public static <T extends Serializable> T serializeAndDeserialize(T input) throws IOException, ClassNotFoundException {
- final ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
- final ObjectOutputStream out = new ObjectOutputStream(byteArrayStream);
-
- out.writeObject(input);
- final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteArrayStream.toByteArray()));
-
- @SuppressWarnings("unchecked")
- final T result = (T) in.readObject();
-
- out.close();
- in.close();
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/TrimmingUtil.java b/src/main/java/htsjdk/samtools/util/TrimmingUtil.java
deleted file mode 100644
index 06667d3..0000000
--- a/src/main/java/htsjdk/samtools/util/TrimmingUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-/**
- * Utility code for performing quality trimming.
- *
- * @author Tim Fennell
- */
-public class TrimmingUtil {
- /**
- * Implements phred-style quality trimming. Takes in an array of quality values as a
- * byte[] and return the first index within the byte array that should be clipped,
- * such that the caller can then invoke things like:
- * int retval = findQualityTrimPoint(10, quals);
- * final byte[] trimmedQuals = Arrays.copyOfRange(quals, 0, retval);
- * final String trimmedBases = bases.substring(0, retval);
- *
- * If the entire read is of low quality this function may return 0! It is left to the caller
- * to decide whether or not to trim reads down to 0-bases, or to enforce some minimum length.
- *
- * @param quals a byte[] of quality scores in phred scaling (i.e. integer values between 0 and ~60)
- * @param trimQual the lowest quality that is considered "good". In the simplest case
- * where a read is composed exclusively of "good" qualities followed by
- * "bad" qualities, this is the lowest quality value left after trimming.
- * @return The zero-based index of the first base within the quality string that should be trimmed.
- * When no trimming is required, quals.length (i.e. an index one greater than the last valid
- * index) will be returned.
- */
- public static int findQualityTrimPoint(final byte[] quals, final int trimQual) {
- final int length = quals.length;
- int score = 0, maxScore = 0, trimPoint = length;
- if (trimQual < 1 || length == 0) return 0;
-
- for (int i=length-1; i>=0; --i) {
- score += trimQual - (quals[i]);
- if (score < 0) break;
- if (score > maxScore) {
- maxScore = score;
- trimPoint = i;
- }
- }
-
- return trimPoint;
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/Tuple.java b/src/main/java/htsjdk/samtools/util/Tuple.java
deleted file mode 100644
index 2177920..0000000
--- a/src/main/java/htsjdk/samtools/util/Tuple.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.samtools.util;
-
-/**
- * A simple tuple class.
- *
- * @author mccowan
- */
-public class Tuple<A, B> {
- public final A a;
- public final B b;
-
- public Tuple(final A a, final B b) {
- this.a = a;
- this.b = b;
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final Tuple<?, ?> tuple = (Tuple<?, ?>) o;
-
- if (a != null ? !a.equals(tuple.a) : tuple.a != null) return false;
-
- return !(b != null ? !b.equals(tuple.b) : tuple.b != null);
- }
-
- @Override
- public int hashCode() {
- int result = a != null ? a.hashCode() : 0;
- result = 31 * result + (b != null ? b.hashCode() : 0);
-
- return result;
- }
-
- @Override
- public String toString() {
- return "[" + a + ", " + b + "]";
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java b/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java
deleted file mode 100644
index 1263285..0000000
--- a/src/main/java/htsjdk/samtools/util/WholeGenomeReferenceSequenceMask.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Implementation of ReferenceSequenceMask that indicates that all the loci in the sequence dictionary are of interest.
- * @author alecw at broadinstitute dot org
- */
-public class WholeGenomeReferenceSequenceMask implements ReferenceSequenceMask {
-
- SAMFileHeader header;
-
- public WholeGenomeReferenceSequenceMask(final SAMFileHeader header) {
- this.header = header;
- }
-
- /**
- * @return true if the mask is set for the given sequence and position
- */
- public boolean get(final int sequenceIndex, final int position) {
- if (sequenceIndex < 0) {
- throw new IllegalArgumentException("Negative sequence index " + sequenceIndex);
- }
- if (sequenceIndex >= header.getSequenceDictionary().size()) {
- return false;
- }
- final SAMSequenceRecord sequenceRecord = header.getSequence(sequenceIndex);
- return position <= sequenceRecord.getSequenceLength();
- }
-
- /**
- * @return the next pos on the given sequence >= position that is set, or -1 if there are no more set positions
- */
- public int nextPosition(final int sequenceIndex, final int position) {
- if (get(sequenceIndex, position + 1)) {
- return position + 1;
- } else {
- return -1;
- }
- }
-
- /**
- * @return Largest sequence index for which there are set bits.
- */
- public int getMaxSequenceIndex() {
- return header.getSequenceDictionary().size() - 1;
- }
-
- /**
- * @return the largest position on the last sequence index
- */
- public int getMaxPosition() {
- SAMSequenceRecord lastSequenceRecord = header.getSequence(getMaxSequenceIndex());
- return lastSequenceRecord.getSequenceLength();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java b/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java
deleted file mode 100644
index 3af6deb..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPClient.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTIES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import htsjdk.samtools.SAMException;
-
-import java.io.BufferedReader;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.net.Socket;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-
-/**
- * @author jrobinso
- * @date Oct 30, 2010
- */
-public class FTPClient {
-
- private Socket commandSocket = null;
-
- public static int READ_TIMEOUT = 5 * 60 * 1000;
-
- /**
- * Stream to write commands.
- * NOTE -- a PrintStream is used no purpose (as opposed to PrintWriter). PrintWriter will not work!
- */
- private PrintStream commandStream = null;
- private BufferedReader responseReader = null;
- private InputStream dataStream;
- private String passiveHost;
- private int passivePort;
- long restPosition = -1;
- String host;
-
- /**
- * Connects to the given FTP host on the default port.
- */
- public FTPReply connect(String host) throws IOException {
- this.host = host;
- commandSocket = new Socket(host, 21);
- commandSocket.setSoTimeout(READ_TIMEOUT);
- commandStream = new PrintStream(commandSocket.getOutputStream());
- responseReader = new BufferedReader(new InputStreamReader(commandSocket.getInputStream()));
-
- FTPReply reply = new FTPReply(responseReader);
-
- if (!reply.isPositiveCompletion()) {
- disconnect();
- }
-
- return reply;
- }
-
-
- /**
- * Executes the given FTP command on our current connection, returning the
- * three digit response code from the server. This method only works for
- * commands that do not require an additional data port.
- */
- public FTPReply executeCommand(String command) throws IOException {
- commandStream.println(command);
- return new FTPReply(responseReader);
- }
-
-
- /**
- * Wrapper for the commands <code>user [username]</code> and <code>pass
- * [password]</code>.
- */
- public FTPReply login(String username, String password) throws IOException {
- FTPReply response = executeCommand("user " + username);
- if (!response.isPositiveIntermediate()) return response;
- response = executeCommand("pass " + password);
- return response;
- }
-
- public FTPReply quit() throws IOException {
- return executeCommand("QUIT");
- }
-
- public FTPReply binary() throws IOException {
- return executeCommand("TYPE I");
- }
-
-
- public FTPReply pasv() throws IOException {
-
- FTPReply reply = executeCommand("PASV");
-
- if (reply.getCode() == 226 || reply.getCode() == 426) {
- reply = getReply();
- }
-
- String response = reply.getReplyString();
-
-
- int code = reply.getCode();
-
- int opening = response.indexOf('(');
- int closing = response.indexOf(')', opening + 1);
- if (closing > 0) {
- String dataLink = response.substring(opening + 1, closing);
- StringTokenizer tokenizer = new StringTokenizer(dataLink, ",");
- try {
- passiveHost = tokenizer.nextToken() + "." + tokenizer.nextToken() + "."
- + tokenizer.nextToken() + "." + tokenizer.nextToken();
- passivePort = Integer.parseInt(tokenizer.nextToken()) * 256
- + Integer.parseInt(tokenizer.nextToken());
- } catch (NumberFormatException e) {
- throw new IOException("SimpleFTP received bad data link information: " + response);
- } catch (NoSuchElementException e){
- throw new IOException("SimpleFTP received bad data link information: " + response);
- }
- }
-
- if (reply.isPositiveCompletion()) {
- if (dataStream == null) {
- Socket dataSocket = new Socket(passiveHost, passivePort);
- dataSocket.setSoTimeout(READ_TIMEOUT);
- dataStream = new SocketInputStream(dataSocket, dataSocket.getInputStream());
- }
- }
- return reply;
- }
-
- public void setRestPosition(long position) {
- this.restPosition = position;
- }
-
- public FTPReply retr(String file) throws IOException {
-
- if (restPosition >= 0) {
- FTPReply restReply = executeCommand("REST " + restPosition);
- if (!restReply.isSuccess()) {
- return restReply;
- }
- }
-
- return executeCommand("RETR " + file);
- }
-
- public FTPReply getReply() throws IOException {
- return new FTPReply(responseReader);
- }
-
- /**
- * Return the size of the remote file
- *
- * @param file
- * @return
- * @throws IOException
- */
- public FTPReply size(String file) throws IOException {
-
- return executeCommand("SIZE " + file);
-
- }
-
-
- public InputStream getDataStream() throws IOException {
- return dataStream;
- }
-
- public void closeDataStream() throws IOException {
- // NOTE -- some ftp servers seem to need a pause before closing the data stream
- // if (dataStream != null) {
- // try {
- // //
- // Thread.sleep(3000);
- // } catch (InterruptedException e) {
- //
- // }
- dataStream.close();
- //}
- dataStream = null;
- }
-
-
- /**
- * Disconnects from the host to which we are currently connected.
- */
- public void disconnect() {
- try {
- //quit();
- if (commandStream != null) {
- commandStream.close();
- responseReader.close();
- commandSocket.close();
-
- if (dataStream != null) {
- dataStream.close();
- }
- }
- } catch (IOException e) {
- throw new SAMException("Error disconnecting", e);
- }
-
- commandStream = null;
- responseReader = null;
- commandSocket = null;
- }
-
- class SocketInputStream extends FilterInputStream {
-
- Socket socket;
-
- SocketInputStream(Socket socket, InputStream inputStream) {
- super(inputStream);
- this.socket = socket;
- }
-
- @Override
- public void close() throws IOException {
- super.close();
- socket.close();
- FTPClient.this.dataStream = null;
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java b/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java
deleted file mode 100644
index 4648d9d..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPReply.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-
-/**
- * @author jrobinso
- * @date Oct 30, 2010
- */
-public class FTPReply {
-
- String reply;
- int code;
-
- public FTPReply(BufferedReader inputStream) throws IOException {
-
- String response = null;
- do {
- response = inputStream.readLine();
- } while (response != null &&
- !(Character.isDigit(response.charAt(0)) &&
- Character.isDigit(response.charAt(1)) &&
- Character.isDigit(response.charAt(2)) &&
- response.charAt(3) == ' '));
- if (response == null || response.length() < 3) {
- code = -1;
- } else {
- code = Integer.parseInt(response.substring(0, 3));
- reply = response.substring(3).trim();
-
- }
- }
-
- /**
- * Gets server reply code from the control port after an ftp command has
- * been executed. It knows the last line of the response because it begins
- * with a 3 digit number and a space, (a dash instead of a space would be a
- * continuation).
- */
-
- public int getCode() throws IOException {
- return code;
- }
-
-
- /**
- * Gets server reply string from the control port after an ftp command has
- * been executed. This consists only of the last line of the response,
- * and only the part after the response code.
- */
- public String getReplyString()
- throws IOException {
-
- return reply;
- }
-
-
- public boolean isSuccess() {
- return isPositiveCompletion() || isPositiveIntermediate();
- }
-
- /**
- * Determine if a reply code is a positive completion response. All
- * codes beginning with a 2 are positive completion responses.
- * The FTP server will send a positive completion response on the final
- * successful completion of a command.
- * <p/>
- *
- * @return True if a reply code is a postive completion response, false
- * if not.
- * *
- */
- public boolean isPositiveCompletion() {
- return (code >= 200 && code < 300);
- }
-
-
- /**
- * Determine if a reply code is a positive intermediate response. All
- * codes beginning with a 3 are positive intermediate responses.
- * The FTP server will send a positive intermediate response on the
- * successful completion of one part of a multi-part sequence of
- * commands. For example, after a successful USER command, a positive
- * intermediate response will be sent to indicate that the server is
- * ready for the PASS command.
- * <p/>
- *
- * @return True if a reply code is a postive intermediate response, false
- * if not.
- * *
- */
- public boolean isPositiveIntermediate() {
- return (code >= 300 && code < 400);
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java b/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java
deleted file mode 100644
index 11a531c..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPStream.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-
-/**
- * A "non-seekable" ftp stream. This one doesn't support random access.
- *
- * It is assumed that the ftp client has been connected, put in passive mode,
- * set to binary, and otherwise prepped for reading before creating this stream.
- *
- * @author jrobinso
- * @date Oct 31, 2010
- */
-public class FTPStream extends FilterInputStream {
-
- FTPClient ftp;
-
- public FTPStream(FTPClient ftp) throws IOException {
- super(ftp.getDataStream());
- this.ftp = ftp;
- }
-
-
- @Override
- public int read(byte[] bytes, int i, int i1) throws IOException {
- return super.read(bytes, i, i1); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- @Override
- public void close() throws IOException {
- super.close();
- ftp.disconnect();
- }
-}
diff --git a/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java b/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java
deleted file mode 100644
index a9f8cde..0000000
--- a/src/main/java/htsjdk/samtools/util/ftp/FTPUtils.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.samtools.util.ftp;
-
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.seekablestream.UserPasswordInput;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * @author jrobinso
- * @date Aug 31, 2010
- */
-public class FTPUtils {
-
- static Map<String, String> userCredentials = new HashMap<String, String>();
-
- static int TIMEOUT = 10000;
-
- public static boolean resourceAvailable(URL url) {
- InputStream is = null;
- try {
- URLConnection conn = url.openConnection();
- conn.setConnectTimeout(TIMEOUT);
- conn.setReadTimeout(TIMEOUT);
- is = conn.getInputStream();
- return (is.read() >= 0);
-
- } catch (IOException e) {
- return false;
- }
- finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- throw new SAMException("Error closing connection", e);
- }
- }
- }
- }
-
- public static long getContentLength(URL url) throws IOException {
- FTPClient ftp = null;
- try {
- ftp = FTPUtils.connect(url.getHost(), url.getUserInfo(), null);
- String sizeString = ftp.executeCommand("size " + url.getPath()).getReplyString();
- return Integer.parseInt(sizeString);
- } catch (Exception e) {
- return -1 ;
- }
- finally {
- if(ftp != null) {
- ftp.disconnect();
- }
- }
- }
-
-
- /**
- * Connect to an FTP server
- *
- * @param host
- * @param userInfo
- * @param userPasswordInput Dialog with which a user can enter credentials, if login fails
- * @return
- * @throws IOException
- */
- public static synchronized FTPClient connect(String host, String userInfo, UserPasswordInput userPasswordInput) throws IOException {
-
- FTPClient ftp = new FTPClient();
- FTPReply reply = ftp.connect(host);
- if (!reply.isSuccess()) {
- throw new RuntimeIOException("Could not connect to " + host);
- }
-
- String user = "anonymous";
- String password = "igv at broadinstitute.org";
-
- if (userInfo == null) {
- userInfo = userCredentials.get(host);
- }
- if (userInfo != null) {
- String[] tmp = userInfo.split(":");
- user = tmp[0];
- if (tmp.length > 1) {
- password = tmp[1];
- }
- }
-
- reply = ftp.login(user, password);
- if (!reply.isSuccess()) {
- if (userPasswordInput == null) {
- throw new RuntimeIOException("Login failure for host: " + host);
- }
- else {
- userPasswordInput.setHost(host);
- boolean success = false;
- while (!success) {
- if (userPasswordInput.showDialog()) {
- user = userPasswordInput.getUser();
- password = userPasswordInput.getPassword();
- reply = ftp.login(user, password);
- success = reply.isSuccess();
- } else {
- // canceled
- break;
- }
-
- }
- if (success) {
- userInfo = user + ":" + password;
- userCredentials.put(host, userInfo);
- } else {
- throw new RuntimeIOException("Login failure for host: " + host);
- }
- }
- }
-
- reply = ftp.binary();
- if (!(reply.isSuccess())) {
- throw new RuntimeIOException("Could not set binary mode on host: " + host);
- }
-
- return ftp;
-
- }
-
-}
-
diff --git a/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java b/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java
deleted file mode 100644
index c15e7c6..0000000
--- a/src/main/java/htsjdk/samtools/util/zip/DeflaterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util.zip;
-
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import java.util.zip.Deflater;
-
-/**
- * Factory for {@link Deflater} objects used by {@link BlockCompressedOutputStream}.
- * This class may be extended to provide alternative deflaters (e.g., for improved performance).
- */
-public class DeflaterFactory {
-
- public DeflaterFactory() {
- //Note: made explicit constructor to make searching for references easier
- }
-
- /**
- * Returns a deflater object that will be used when writing BAM files.
- * Subclasses may override to provide their own deflater implementation.
- * @param compressionLevel the compression level (0-9)
- * @param nowrap if true then use GZIP compatible compression
- */
- public Deflater makeDeflater(final int compressionLevel, final boolean nowrap) {
- return new Deflater(compressionLevel, nowrap);
- }
-}
diff --git a/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java b/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java
deleted file mode 100644
index a1e2771..0000000
--- a/src/main/java/htsjdk/tribble/AbstractFeatureCodec.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import java.io.IOException;
-
-/**
- * Simple basic class providing much of the basic functionality of codecs
- * Every concrete subclass must implement {@link FeatureCodec#canDecode(String)} to indicate whether it can decode the file.
- * Note that that method is the only way that the right codec for a file is identified and that <bold>only one</bold> codec
- * is allowed to identify itself as being able to decode any given file.
- */
-public abstract class AbstractFeatureCodec<FEATURE_TYPE extends Feature, SOURCE> implements FeatureCodec<FEATURE_TYPE, SOURCE> {
- private final Class<FEATURE_TYPE> myClass;
-
- protected AbstractFeatureCodec(final Class<FEATURE_TYPE> myClass) {
- this.myClass = myClass;
- }
-
- @Override
- public Feature decodeLoc(final SOURCE source) throws IOException {
- return decode(source);
- }
-
- @Override
- public Class<FEATURE_TYPE> getFeatureType() {
- return myClass;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java b/src/main/java/htsjdk/tribble/AbstractFeatureReader.java
deleted file mode 100644
index 80d9a6c..0000000
--- a/src/main/java/htsjdk/tribble/AbstractFeatureReader.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * jrobinso
- * <p/>
- * the feature reader class, which uses indices and codecs to read in Tribble file formats.
- */
-public abstract class AbstractFeatureReader<T extends Feature, SOURCE> implements FeatureReader<T> {
- // the logging destination for this source
- //private final static Logger log = Logger.getLogger("BasicFeatureSource");
-
- // the path to underlying data source
- String path;
-
- // the query source, codec, and header
- // protected final QuerySource querySource;
- protected final FeatureCodec<T, SOURCE> codec;
- protected FeatureCodecHeader header;
-
- private static ComponentMethods methods = new ComponentMethods();
-
- public static final Set<String> BLOCK_COMPRESSED_EXTENSIONS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(".gz", ".gzip", ".bgz", ".bgzf")));
-
- /**
- * Calls {@link #getFeatureReader(String, FeatureCodec, boolean)} with {@code requireIndex} = true
- */
- public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureFile, final FeatureCodec<FEATURE, SOURCE> codec) throws TribbleException {
- return getFeatureReader(featureFile, codec, true);
- }
-
- /**
- * {@link #getFeatureReader(String, String, FeatureCodec, boolean)} with {@code null} for indexResource
- * @throws TribbleException
- */
- public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, final FeatureCodec<FEATURE, SOURCE> codec, final boolean requireIndex) throws TribbleException {
- return getFeatureReader(featureResource, null, codec, requireIndex);
- }
-
- /**
- *
- * @param featureResource the feature file to create from
- * @param indexResource the index for the feature file. If null, will auto-generate (if necessary)
- * @param codec
- * @param requireIndex whether an index is required for this file
- * @return
- * @throws TribbleException
- */
- public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, String indexResource, final FeatureCodec<FEATURE, SOURCE> codec, final boolean requireIndex) throws TribbleException {
-
- try {
- // Test for tabix index
- if (methods.isTabix(featureResource, indexResource)) {
- if ( ! (codec instanceof AsciiFeatureCodec) )
- throw new TribbleException("Tabix indexed files only work with ASCII codecs, but received non-Ascii codec " + codec.getClass().getSimpleName());
- return new TabixFeatureReader<FEATURE, SOURCE>(featureResource, indexResource, (AsciiFeatureCodec) codec);
- }
- // Not tabix => tribble index file (might be gzipped, but not block gzipped)
- else {
- return new TribbleIndexedFeatureReader<FEATURE, SOURCE>(featureResource, indexResource, codec, requireIndex);
- }
- } catch (IOException e) {
- throw new TribbleException.MalformedFeatureFile("Unable to create BasicFeatureReader using feature file ", featureResource, e);
- } catch (TribbleException e) {
- e.setSource(featureResource);
- throw e;
- }
- }
-
- /**
- * Return a reader with a supplied index.
- *
- * @param featureResource the path to the source file containing the features
- * @param codec used to decode the features
- * @param index index of featureResource
- * @return a reader for this data
- * @throws TribbleException
- */
- public static <FEATURE extends Feature, SOURCE> AbstractFeatureReader<FEATURE, SOURCE> getFeatureReader(final String featureResource, final FeatureCodec<FEATURE, SOURCE> codec, final Index index) throws TribbleException {
- try {
- return new TribbleIndexedFeatureReader<FEATURE, SOURCE>(featureResource, codec, index);
- } catch (IOException e) {
- throw new TribbleException.MalformedFeatureFile("Unable to create AbstractFeatureReader using feature file ", featureResource, e);
- }
-
- }
-
- protected AbstractFeatureReader(final String path, final FeatureCodec<T, SOURCE> codec) {
- this.path = path;
- this.codec = codec;
- }
-
- /**
- * Whether the reader has an index or not
- * Default implementation returns false
- * @return
- */
- public boolean hasIndex(){
- return false;
- }
-
- public static void setComponentMethods(ComponentMethods methods){
- AbstractFeatureReader.methods = methods;
- }
-
- /**
- * Whether a filename ends in one of the BLOCK_COMPRESSED_EXTENSIONS
- * @param fileName
- * @return
- */
- public static boolean hasBlockCompressedExtension (final String fileName) {
- for (final String extension : BLOCK_COMPRESSED_EXTENSIONS) {
- if (fileName.toLowerCase().endsWith(extension))
- return true;
- }
- return false;
- }
-
- /**
- * Whether the name of a file ends in one of the BLOCK_COMPRESSED_EXTENSIONS
- * @param file
- * @return
- */
- public static boolean hasBlockCompressedExtension (final File file) {
- return hasBlockCompressedExtension(file.getName());
- }
-
- /**
- * Whether the path of a URI resource ends in one of the BLOCK_COMPRESSED_EXTENSIONS
- * @param uri a URI representing the resource to check
- * @return
- */
- public static boolean hasBlockCompressedExtension (final URI uri) {
- return hasBlockCompressedExtension(uri.getPath());
- }
-
- /**
- * get the header
- *
- * @return the header object we've read-in
- */
- public Object getHeader() {
- return header.getHeaderValue();
- }
-
- static class EmptyIterator<T extends Feature> implements CloseableTribbleIterator<T> {
- public Iterator iterator() { return this; }
- public boolean hasNext() { return false; }
- public T next() { return null; }
- public void remove() { }
- @Override public void close() { }
- }
-
- public static class ComponentMethods{
-
- public boolean isTabix(String resourcePath, String indexPath) throws IOException{
- if(indexPath == null){
- indexPath = ParsingUtils.appendToPath(resourcePath, TabixUtils.STANDARD_INDEX_EXTENSION);
- }
- return hasBlockCompressedExtension(resourcePath) && ParsingUtils.resourceExists(indexPath);
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java b/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java
deleted file mode 100644
index 141b764..0000000
--- a/src/main/java/htsjdk/tribble/AsciiFeatureCodec.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.readers.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A convenience base class for codecs that want to read in features from ASCII lines.
- * <p/>
- * This class overrides the general decode locs for streams and presents instead
- * Strings to decode(String) and readHeader(LineReader) functions.
- *
- * @param <T> The feature type this codec reads
- */
-public abstract class AsciiFeatureCodec<T extends Feature> extends AbstractFeatureCodec<T, LineIterator> {
- protected AsciiFeatureCodec(final Class<T> myClass) {
- super(myClass);
- }
-
- @Override
- public void close(final LineIterator lineIterator) {
- CloserUtil.close(lineIterator);
- }
-
- @Override
- public boolean isDone(final LineIterator lineIterator) {
- return !lineIterator.hasNext();
- }
-
- @Override
- public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream) {
- final PositionalBufferedStream pbs;
- if (bufferedInputStream instanceof PositionalBufferedStream) {
- pbs = (PositionalBufferedStream) bufferedInputStream;
- } else {
- pbs = new PositionalBufferedStream(bufferedInputStream);
- }
- return new AsciiLineReaderIterator(new AsciiLineReader(pbs));
- }
-
- @Override
- public LineIterator makeSourceFromStream(final InputStream bufferedInputStream) {
- return new LineIteratorImpl(new SynchronousLineReader(bufferedInputStream));
- }
-
- /**
- * Convenience method. Decoding in ASCII files operates line-by-line, so obviate the need to call
- * {@link htsjdk.tribble.readers.LineIterator#next()} in implementing classes and, instead, have them implement
- * {@link AsciiFeatureCodec#decode(String)}.
- */
- @Override
- public T decode(final LineIterator lineIterator) {
- return decode(lineIterator.next());
- }
-
- /** @see AsciiFeatureCodec#decode(htsjdk.tribble.readers.LineIterator) */
- public abstract T decode(String s);
-
- @Override
- public FeatureCodecHeader readHeader(final LineIterator lineIterator) throws IOException {
- // TODO: Track header end here, rather than assuming there isn't one.
- return new FeatureCodecHeader(readActualHeader(lineIterator), FeatureCodecHeader.NO_HEADER_END);
- }
-
- /**
- * Read and return the header, or null if there is no header.
- *
- * @return the actual header data in the file, or null if none is available
- */
- abstract public Object readActualHeader(final LineIterator reader);
-}
diff --git a/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java b/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java
deleted file mode 100644
index dbd0afc..0000000
--- a/src/main/java/htsjdk/tribble/BinaryFeatureCodec.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Implements common methods of {@link FeatureCodec}s that read from {@link htsjdk.tribble.readers.PositionalBufferedStream}s.
- * @author mccowan
- */
-abstract public class BinaryFeatureCodec<T extends Feature> implements FeatureCodec<T, PositionalBufferedStream> {
- @Override
- public PositionalBufferedStream makeSourceFromStream(final InputStream bufferedInputStream) {
- if (bufferedInputStream instanceof PositionalBufferedStream)
- return (PositionalBufferedStream) bufferedInputStream;
- else
- return new PositionalBufferedStream(bufferedInputStream);
- }
-
- /** {@link PositionalBufferedStream} is already {@link LocationAware}. */
- @Override
- public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream) {
- return makeSourceFromStream(bufferedInputStream);
- }
-
- @Override
- public void close(final PositionalBufferedStream source) {
- CloserUtil.close(source);
- }
-
- @Override
- public boolean isDone(final PositionalBufferedStream source) {
- try {
- return source.isDone();
- } catch (final IOException e) {
- throw new RuntimeIOException("Failure reading from stream.", e);
- }
- }
-
- /**
- * Marked as final because binary features could not be tabix indexed
- */
- @Override
- public final TabixFormat getTabixFormat() {
- throw new TribbleException("Binary codecs does not support tabix");
- }
-}
diff --git a/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java b/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java
deleted file mode 100644
index 71c2cf6..0000000
--- a/src/main/java/htsjdk/tribble/CloseableTribbleIterator.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.CloseableIterator;
-
-/**
- * The basic iterator we use in Tribble, which allows closing and basic iteration.
- * @param <T> the feature type
- */
-public interface CloseableTribbleIterator<T extends Feature> extends CloseableIterator<T>, Iterable<T> {}
diff --git a/src/main/java/htsjdk/tribble/Feature.java b/src/main/java/htsjdk/tribble/Feature.java
deleted file mode 100644
index 941790f..0000000
--- a/src/main/java/htsjdk/tribble/Feature.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-
-import htsjdk.samtools.util.Locatable;
-
-/**
- * Represents a locus on a reference sequence. All Features are expected to return 1-based closed-ended intervals.
- */
-public interface Feature extends Locatable {
-
- /**
- * Return the features reference sequence name, e.g chromosome or contig
- * @deprecated use getContig() instead
- */
- @Deprecated
- default public String getChr() {
- return getContig();
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureCodec.java b/src/main/java/htsjdk/tribble/FeatureCodec.java
deleted file mode 100644
index f14191a..0000000
--- a/src/main/java/htsjdk/tribble/FeatureCodec.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.index.tabix.TabixFormat;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * The base interface for classes that read in features.
- * <p/>
- * FeatureCodecs have to implement two key methods:
- * <p/>
- * {@link #readHeader(SOURCE)} - Reads the header, provided a {@link SOURCE} pointing at the beginning of the source input.
- * {@link #decode(SOURCE)} - Reads a {@link Feature} record, provided a {@link SOURCE} pointing at the beginning of a record within the
- * source input.
- * <p/>
- * Note that it's not safe to carry state about the {@link SOURCE} within the codec. There's no guarantee about its state between calls.
- *
- * @param <FEATURE_TYPE> The type of {@link Feature} this codec generates
- * @param <SOURCE> The type of the data source this codec reads from
- */
-public interface FeatureCodec<FEATURE_TYPE extends Feature, SOURCE> {
- /**
- * Decode a line to obtain just its FeatureLoc for indexing -- contig, start, and stop.
- *
- * @param source the input stream from which to decode the next record
- * @return Return the FeatureLoc encoded by the line, or null if the line does not represent a feature (e.g. is
- * a comment)
- */
- public Feature decodeLoc(final SOURCE source) throws IOException;
-
- /**
- * Decode a single {@link Feature} from the {@link SOURCE}, reading no further in the underlying source than beyond that feature.
- *
- * @param source the input stream from which to decode the next record
- * @return Return the Feature encoded by the line, or null if the line does not represent a feature (e.g. is
- * a comment)
- */
- public FEATURE_TYPE decode(final SOURCE source) throws IOException;
-
- /**
- * Read and return the header, or null if there is no header.
- *
- * Note: Implementers of this method must be careful to read exactly as much from {@link SOURCE} as needed to parse the header, and no
- * more. Otherwise, data that might otherwise be fed into parsing a {@link Feature} may be lost.
- *
- * @param source the source from which to decode the header
- * @return header object
- */
- public FeatureCodecHeader readHeader(final SOURCE source) throws IOException;
-
- /**
- * <p>
- * This function returns the object the codec generates. This is allowed to be Feature in the case where
- * conditionally different types are generated. Be as specific as you can though.
- * </p>
- * <p>
- * This function is used by reflections based tools, so we can know the underlying type
- * </p>
- *
- * @return the feature type this codec generates.
- */
- public Class<FEATURE_TYPE> getFeatureType();
-
- /**
- * Generates a reader of type {@link SOURCE} appropriate for use by this codec from the generic input stream. Implementers should
- * assume the stream is buffered.
- */
- public SOURCE makeSourceFromStream(final InputStream bufferedInputStream);
-
- /**
- * Generates a {@link LocationAware} reader of type {@link SOURCE}. Like {@link #makeSourceFromStream(java.io.InputStream)}, except
- * the {@link LocationAware} compatibility is required for creating indexes.
- *
- * Implementers of this method must return a type that is both {@link LocationAware} as well as {@link SOURCE}. Note that this
- * requirement cannot be enforced via the method signature due to limitations in Java's generic typing system. Instead, consumers
- * should cast the call result into a {@link SOURCE} when applicable.
- */
- public LocationAware makeIndexableSourceFromStream(final InputStream bufferedInputStream);
-
- /** Adapter method that assesses whether the provided {@link SOURCE} has more data. True if it does, false otherwise. */
- public boolean isDone(final SOURCE source);
-
- /** Adapter method that closes the provided {@link SOURCE}. */
- public void close(final SOURCE source);
-
- /**
- * <p>
- * This function returns true iff the File potentialInput can be parsed by this
- * codec. Note that checking the file's extension is a perfectly acceptable implementation of this method
- * and file contents only rarely need to be checked.
- * </p>
- * <p>
- * There is an assumption that there's never a situation where two different Codecs
- * return true for the same file. If this occurs, the recommendation would be to error out.
- * </p>
- * Note this function must never throw an error. All errors should be trapped
- * and false returned.
- *
- * @param path the file to test for parsability with this codec
- * @return true if potentialInput can be parsed, false otherwise
- */
- public boolean canDecode(final String path);
-
- /**
- * Define the tabix format for the feature, used for indexing. Default implementation throws an exception.
- *
- * Note that only {@link AsciiFeatureCodec} could read tabix files as defined in
- * {@link AbstractFeatureReader#getFeatureReader(String, String, FeatureCodec, boolean)}
- *
- * @return the format to use with tabix
- * @throws TribbleException if the format is not defined
- */
- default public TabixFormat getTabixFormat() {
- throw new TribbleException(this.getClass().getSimpleName() + "does not have defined tabix format");
- }
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureCodecHeader.java b/src/main/java/htsjdk/tribble/FeatureCodecHeader.java
deleted file mode 100644
index 042f1d0..0000000
--- a/src/main/java/htsjdk/tribble/FeatureCodecHeader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-/**
- * A class to represent a header of a feature containing file. Specific to a codec. All
- * codecs must return a non-null value now for their header, but the header can be the
- * empty header object or the end case be set to NO_HEADER_END.
- *
- * Note that if the headerEnd value is > 0 the readers will skip the header for the codec upfront,
- * so that decode() doesn't have to deal with potentially seeing header records in the inputstream.
- *
- * @author Mark DePristo
- * @since 5/2/12
- */
-public class FeatureCodecHeader {
- /** The value of the headerEnd field when there's no header */
- public final static long NO_HEADER_END = 0;
-
- /** An public instance representing no header */
- public final static FeatureCodecHeader EMPTY_HEADER = new FeatureCodecHeader(null, NO_HEADER_END);
-
- private final Object headerValue;
- private final long headerEnd;
-
- /**
- * Create a FeatureCodecHeader indicating the contents of the header (can be null)
- * and the byte position in the file where the header ends (not inclusive). headerEnd
- * should be NO_HEADER_END when no header is present.
- *
- * @param headerValue the header data read by the codec
- * @param headerEnd the position (not inclusive) of the end of the header. 1 would
- * mean just the first byte of the file is the header. Zero indicates
- * there's no header at all
- */
- public FeatureCodecHeader(final Object headerValue, final long headerEnd) {
- if ( headerEnd < 0 ) throw new TribbleException("Header end < 0");
- this.headerValue = headerValue;
- this.headerEnd = headerEnd;
- }
-
- /**
- * @return the header value provided by the codec for this file
- */
- public Object getHeaderValue() {
- return headerValue;
- }
-
- /**
- * @return to position, not inclusive, where the header ends. Must be >= 0
- */
- public long getHeaderEnd() {
- return headerEnd;
- }
-
- /**
- * @return true if we should skip some bytes to skip this header
- */
- public boolean skipHeaderBytes() {
- return getHeaderEnd() != NO_HEADER_END;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/FeatureReader.java b/src/main/java/htsjdk/tribble/FeatureReader.java
deleted file mode 100644
index 3471393..0000000
--- a/src/main/java/htsjdk/tribble/FeatureReader.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * the basic interface that feature sources need to match
- * @param <T> a feature type
- */
-public interface FeatureReader<T extends Feature> extends Closeable {
-
- public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException;
-
- public CloseableTribbleIterator<T> iterator() throws IOException;
-
- public void close() throws IOException;
-
- public List<String> getSequenceNames();
-
- public Object getHeader();
-
-}
diff --git a/src/main/java/htsjdk/tribble/NameAwareCodec.java b/src/main/java/htsjdk/tribble/NameAwareCodec.java
deleted file mode 100755
index ce90f5c..0000000
--- a/src/main/java/htsjdk/tribble/NameAwareCodec.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble;
-
-/**
- * Created by IntelliJ IDEA.
- * User: depristo
- * Date: Jun 29, 2010
- * Time: 3:48:47 PM
- * To change this template use File | Settings | File Templates.
- */
-public interface NameAwareCodec {
- public String getName();
- public void setName(String name);
-}
diff --git a/src/main/java/htsjdk/tribble/SimpleFeature.java b/src/main/java/htsjdk/tribble/SimpleFeature.java
deleted file mode 100644
index ddc62fa..0000000
--- a/src/main/java/htsjdk/tribble/SimpleFeature.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package htsjdk.tribble;
-
-/*
- * Copyright (c) 2012, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * A simple concrete Feature.
- */
-public class SimpleFeature implements Feature {
-
- private final String contig;
- private final int start;
- private final int end;
-
- public SimpleFeature(final String contig, final int start, final int end) {
- this.contig = contig;
- this.start = start;
- this.end = end;
- }
-
- public String getContig() {
- return contig;
- }
-
- public int getStart() {
- return start;
- }
-
- public int getEnd() {
- return end;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/TabixFeatureReader.java b/src/main/java/htsjdk/tribble/TabixFeatureReader.java
deleted file mode 100644
index 5d90295..0000000
--- a/src/main/java/htsjdk/tribble/TabixFeatureReader.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.readers.*;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author Jim Robinson
- * @since 2/11/12
- */
-public class TabixFeatureReader<T extends Feature, SOURCE> extends AbstractFeatureReader<T, SOURCE> {
-
- TabixReader tabixReader;
- List<String> sequenceNames;
-
- /**
- *
- * @param featureFile - path to a feature file. Can be a local file, http url, or ftp url
- * @param codec
- * @throws IOException
- */
- public TabixFeatureReader(final String featureFile, final AsciiFeatureCodec codec) throws IOException {
- super(featureFile, codec);
- tabixReader = new TabixReader(featureFile);
- sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
- readHeader();
- }
-
- /**
- *
- * @param featureFile - path to a feature file. Can be a local file, http url, or ftp url
- * @param indexFile - path to the index file.
- * @param codec
- * @throws IOException
- */
- public TabixFeatureReader(final String featureFile, final String indexFile, final AsciiFeatureCodec codec) throws IOException {
- super(featureFile, codec);
- tabixReader = new TabixReader(featureFile, indexFile);
- sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
- readHeader();
- }
-
-
- /**
- * read the header
- *
- * @return a Object, representing the file header, if available
- * @throws IOException throws an IOException if we can't open the file
- */
- private void readHeader() throws IOException {
- SOURCE source = null;
- try {
- source = codec.makeSourceFromStream(new PositionalBufferedStream(new BlockCompressedInputStream(ParsingUtils.openInputStream(path))));
- header = codec.readHeader(source);
- } catch (Exception e) {
- throw new TribbleException.MalformedFeatureFile("Unable to parse header with error: " + e.getMessage(), path, e);
- } finally {
- if (source != null) {
- codec.close(source);
- }
- }
- }
-
- @Override
- public boolean hasIndex(){
- return true;
- }
-
-
- public List<String> getSequenceNames() {
- return sequenceNames;
- }
-
- /**
- * Return iterator over all features overlapping the given interval
- *
- * @param chr
- * @param start
- * @param end
- * @return
- * @throws IOException
- */
- public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException {
- final List<String> mp = getSequenceNames();
- if (mp == null) throw new TribbleException.TabixReaderFailure("Unable to find sequence named " + chr +
- " in the tabix index. ", path);
- if (!mp.contains(chr)) {
- return new EmptyIterator<T>();
- }
- final TabixIteratorLineReader lineReader = new TabixIteratorLineReader(tabixReader.query(tabixReader.chr2tid(chr), start - 1, end));
- return new FeatureIterator<T>(lineReader, start - 1, end);
- }
-
- public CloseableTribbleIterator<T> iterator() throws IOException {
- final InputStream is = new BlockCompressedInputStream(ParsingUtils.openInputStream(path));
- final PositionalBufferedStream stream = new PositionalBufferedStream(is);
- final LineReader reader = new SynchronousLineReader(stream);
- return new FeatureIterator<T>(reader, 0, Integer.MAX_VALUE);
- }
-
- public void close() throws IOException {
- tabixReader.close();
- }
-
-
- class FeatureIterator<T extends Feature> implements CloseableTribbleIterator<T> {
- private T currentRecord;
- private LineReader lineReader;
- private int start;
- private int end;
-
- public FeatureIterator(final LineReader lineReader, final int start, final int end) throws IOException {
- this.lineReader = lineReader;
- this.start = start;
- this.end = end;
- readNextRecord();
- }
-
-
- /**
- * Advance to the next record in the query interval.
- *
- * @throws IOException
- */
- protected void readNextRecord() throws IOException {
- currentRecord = null;
- String nextLine;
- while (currentRecord == null && (nextLine = lineReader.readLine()) != null) {
- final Feature f;
- try {
- f = ((AsciiFeatureCodec)codec).decode(nextLine);
- if (f == null) {
- continue; // Skip
- }
- if (f.getStart() > end) {
- return; // Done
- }
- if (f.getEnd() <= start) {
- continue; // Skip
- }
-
- currentRecord = (T) f;
-
- } catch (TribbleException e) {
- e.setSource(path);
- throw e;
- } catch (NumberFormatException e) {
- String error = "Error parsing line: " + nextLine;
- throw new TribbleException.MalformedFeatureFile(error, path, e);
- }
-
-
- }
- }
-
-
- public boolean hasNext() {
- return currentRecord != null;
- }
-
- public T next() {
- T ret = currentRecord;
- try {
- readNextRecord();
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to read the next record, the last record was at " +
- ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
- }
- return ret;
-
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Remove is not supported in Iterators");
- }
-
- public void close() {
- lineReader.close();
- }
-
- public Iterator<T> iterator() {
- return this;
- }
- }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/Tribble.java b/src/main/java/htsjdk/tribble/Tribble.java
deleted file mode 100644
index 468f55d..0000000
--- a/src/main/java/htsjdk/tribble/Tribble.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.File;
-
-/**
- * Common, tribble wide constants and static functions
- */
-public class Tribble {
- private Tribble() { } // can't be instantiated
-
- public final static String STANDARD_INDEX_EXTENSION = ".idx";
-
- /**
- * Return the name of the index file for the provided vcf {@code filename}
- * Does not actually create an index
- * @param filename name of the vcf file
- * @return non-null String representing the index filename
- */
- public static String indexFile(final String filename) {
- return indexFile(filename, STANDARD_INDEX_EXTENSION);
- }
-
- /**
- * Return the File of the index file for the provided vcf {@code file}
- * Does not actually create an index
- * @param file the vcf file
- * @return a non-null File representing the index
- */
- public static File indexFile(final File file) {
- return indexFile(file.getAbsoluteFile(), STANDARD_INDEX_EXTENSION);
- }
-
- /**
- * Return the name of the tabix index file for the provided vcf {@code filename}
- * Does not actually create an index
- * @param filename name of the vcf file
- * @return non-null String representing the index filename
- */
- public static String tabixIndexFile(final String filename) {
- return indexFile(filename, TabixUtils.STANDARD_INDEX_EXTENSION);
- }
-
- /**
- * Return the File of the tabix index file for the provided vcf {@code file}
- * Does not actually create an index
- * @param file the vcf file
- * @return a non-null File representing the index
- */
- public static File tabixIndexFile(final File file) {
- return indexFile(file.getAbsoluteFile(), TabixUtils.STANDARD_INDEX_EXTENSION);
- }
-
- /**
- * Return the name of the index file for the provided vcf {@code filename} and {@code extension}
- * Does not actually create an index
- * @param filename name of the vcf file
- * @param extension the extension to use for the index
- * @return non-null String representing the index filename
- */
- private static String indexFile(final String filename, final String extension) {
- return ParsingUtils.appendToPath(filename, extension);
- }
-
- /**
- * Return the File of the index file for the provided vcf {@code file} and {@code extension}
- * Does not actually create an index
- * @param file the vcf file
- * @param extension the extension to use for the index
- * @return a non-null File representing the index
- */
- private static File indexFile(final File file, final String extension) {
- return new File(file.getAbsoluteFile() + extension);
- }
-}
diff --git a/src/main/java/htsjdk/tribble/TribbleException.java b/src/main/java/htsjdk/tribble/TribbleException.java
deleted file mode 100644
index 86202eb..0000000
--- a/src/main/java/htsjdk/tribble/TribbleException.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-
-/**
- * @author Aaron
- *
- * The base Tribble exception; this allows external libraries to catch any exception Tribble generates
- *
- */
-public class TribbleException extends RuntimeException {
- // what file or input source we are working from
- String source;
-
- public TribbleException(String msg) {
- super(msg);
- }
-
- public TribbleException(String message, Throwable throwable) {
- super(message, throwable);
- }
-
- /**
- * set the source for the file; where we got lines from
- * @param source the source location, usually a file though it could be a http link or other source
- */
- public void setSource(String source) {
- this.source = source;
- }
-
- /**
- * override the default message with ours, which attaches the source file in question
- * @return a string with our internal error, along with the causitive source file (or other input source)
- */
- public String getMessage() {
- String ret = super.getMessage();
- if ( source != null )
- ret = ret + ", for input source: " + source;
- return ret;
- }
-
- // //////////////////////////////////////////////////////////////////////
- // other more specific exceptions generated in Tribble
- // //////////////////////////////////////////////////////////////////////
-
-
- // //////////////////////////////////////////////////////////////////////
- // Codec exception
- // //////////////////////////////////////////////////////////////////////
- // if the line to decode is incorrect
- public static class InvalidDecodeLine extends TribbleException {
- public InvalidDecodeLine(String message, String line) { super (message + ", line = " + line); }
-
- public InvalidDecodeLine(String message, int lineNo) { super (message + ", at line number " + lineNo); }
- }
-
- public static class InvalidHeader extends TribbleException {
- public InvalidHeader(String message) { super ("Your input file has a malformed header: " + message); }
- }
-
- // capture other internal codec exceptions
- public static class InternalCodecException extends TribbleException {
- public InternalCodecException(String message) { super (message); }
- }
-
- // //////////////////////////////////////////////////////////////////////
- // Index exceptions
- // //////////////////////////////////////////////////////////////////////
- public static class UnableToCreateCorrectIndexType extends TribbleException {
- public UnableToCreateCorrectIndexType(String message, Exception e) {
- super(message,e);
- }
- public UnableToCreateCorrectIndexType(String message) {
- super(message);
- }
- }
-
- // //////////////////////////////////////////////////////////////////////
- // Source exceptions
- // //////////////////////////////////////////////////////////////////////
- public static class FeatureFileDoesntExist extends TribbleException {
- public FeatureFileDoesntExist(String message, String file) {
- super(message);
- setSource(file);
- }
- }
-
- public static class MalformedFeatureFile extends TribbleException {
- public MalformedFeatureFile(String message, String f, Exception e) {
- super(message,e);
- setSource(f);
- }
- public MalformedFeatureFile(String message, String f) {
- super(message);
- setSource(f);
- }
- }
-
- public static class UnableToReadIndexFile extends TribbleException {
- public UnableToReadIndexFile(String message, String f, Exception e) {
- super(message,e);
- setSource(f);
- }
- }
-
- public static class TabixReaderFailure extends TribbleException {
- public TabixReaderFailure(String message, String f, Exception e) {
- super(message,e);
- setSource(f);
- }
-
- public TabixReaderFailure(String message, String f) {
- super(message);
- setSource(f);
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java b/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java
deleted file mode 100644
index 514782d..0000000
--- a/src/main/java/htsjdk/tribble/TribbleIndexedFeatureReader.java
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.zip.GZIPInputStream;
-
-/**
- * A reader for text feature files (i.e. not tabix files). This includes tribble-indexed and non-indexed files. If
- * index both iterate() and query() methods are supported.
- * <p/>
- * Note: Non-indexed files can be gzipped, but not bgzipped.
- *
- * @author Jim Robinson
- * @since 2/11/12
- */
-public class TribbleIndexedFeatureReader<T extends Feature, SOURCE> extends AbstractFeatureReader<T, SOURCE> {
-
- private Index index;
-
- /**
- * is the path pointing to our source data a regular file?
- */
- private final boolean pathIsRegularFile;
-
- /**
- * a potentially reusable seekable stream for queries over regular files
- */
- private SeekableStream seekableStream = null;
-
- /**
- * We lazy-load the index but it might not even exist
- * Don't want to keep checking if that's the case
- */
- private boolean needCheckForIndex = true;
-
- /**
- * @param featurePath - path to the feature file, can be a local file path, http url, or ftp url
- * @param codec - codec to decode the features
- * @param requireIndex - true if the reader will be queries for specific ranges. An index (idx) file must exist
- * @throws IOException
- */
- public TribbleIndexedFeatureReader(final String featurePath, final FeatureCodec<T, SOURCE> codec, final boolean requireIndex) throws IOException {
-
- super(featurePath, codec);
-
- if (requireIndex) {
- this.loadIndex();
- if(!this.hasIndex()){
- throw new TribbleException("An index is required, but none found.");
- }
- }
-
- // does path point to a regular file?
- this.pathIsRegularFile = SeekableStreamFactory.isFilePath(path);
-
- readHeader();
- }
-
- /**
- * @param featureFile - path to the feature file, can be a local file path, http url, or ftp url
- * @param indexFile - path to the index file
- * @param codec - codec to decode the features
- * @param requireIndex - true if the reader will be queries for specific ranges. An index (idx) file must exist
- * @throws IOException
- */
- public TribbleIndexedFeatureReader(final String featureFile, final String indexFile, final FeatureCodec<T, SOURCE> codec, final boolean requireIndex) throws IOException {
- this(featureFile, codec, false); // required to read the header
- if (indexFile != null && ParsingUtils.resourceExists(indexFile)) {
- index = IndexFactory.loadIndex(indexFile);
- this.needCheckForIndex = false;
- } else {
- if (requireIndex) {
- this.loadIndex();
- if(!this.hasIndex()){
- throw new TribbleException("An index is required, but none found.");
- }
- }
- }
- }
-
- /**
- * @param featureFile - path to the feature file, can be a local file path, http url, or ftp url
- * @param codec - codec to decode the features
- * @param index - a tribble Index object
- * @throws IOException
- */
- public TribbleIndexedFeatureReader(final String featureFile, final FeatureCodec<T, SOURCE> codec, final Index index) throws IOException {
- this(featureFile, codec, false); // required to read the header
- this.index = index;
- this.needCheckForIndex = false;
- }
-
- /**
- * Attempt to load the index for the specified {@link #path}.
- * If the {@link #path} has no available index file,
- * does nothing
- * @throws IOException
- */
- private void loadIndex() throws IOException{
- String indexFile = Tribble.indexFile(this.path);
- if (ParsingUtils.resourceExists(indexFile)) {
- index = IndexFactory.loadIndex(indexFile);
- } else {
- // See if the index itself is gzipped
- indexFile = ParsingUtils.appendToPath(indexFile, ".gz");
- if (ParsingUtils.resourceExists(indexFile)) {
- index = IndexFactory.loadIndex(indexFile);
- }
- }
- this.needCheckForIndex = false;
- }
-
- /**
- * Get a seekable stream appropriate to read information from the current feature path
- * <p/>
- * This function ensures that if reuseStreamInQuery returns true then this function will only
- * ever return a single unique instance of SeekableStream for all calls given this instance of
- * TribbleIndexedFeatureReader. If reuseStreamInQuery() returns false then the returned SeekableStream
- * will be newly opened each time, and should be closed after each use.
- *
- * @return a SeekableStream
- */
- private SeekableStream getSeekableStream() throws IOException {
- final SeekableStream result;
- if (reuseStreamInQuery()) {
- // if the stream points to an underlying file, only create the underlying seekable stream once
- if (seekableStream == null) seekableStream = SeekableStreamFactory.getInstance().getStreamFor(path);
- result = seekableStream;
- } else {
- // we are not reusing the stream, so make a fresh copy each time we request it
- result = SeekableStreamFactory.getInstance().getStreamFor(path);
- }
-
- return result;
- }
-
- /**
- * Are we attempting to reuse the underlying stream in query() calls?
- *
- * @return true if
- */
- private boolean reuseStreamInQuery() {
- return pathIsRegularFile;
- }
-
- public void close() throws IOException {
- // close the seekable stream if that's necessary
- if (seekableStream != null) seekableStream.close();
- }
-
- /**
- * Return the sequence (chromosome/contig) names in this file, if known.
- *
- * @return list of strings of the contig names
- */
- public List<String> getSequenceNames() {
- return !this.hasIndex() ? new ArrayList<String>() : new ArrayList<String>(index.getSequenceNames());
- }
-
- @Override
- public boolean hasIndex() {
- if(index == null && this.needCheckForIndex){
- try {
- this.loadIndex();
- } catch (IOException e) {
- throw new TribbleException("Error loading index file: " + e.getMessage(), e);
- }
- }
- return index != null;
- }
-
- /**
- * read the header from the file
- *
- * @throws IOException throws an IOException if we can't open the file
- */
- private void readHeader() throws IOException {
- InputStream is = null;
- PositionalBufferedStream pbs = null;
- try {
- is = ParsingUtils.openInputStream(path);
- if (hasBlockCompressedExtension(new URI(URLEncoder.encode(path, "UTF-8")))) {
- // TODO -- warning I don't think this can work, the buffered input stream screws up position
- is = new GZIPInputStream(new BufferedInputStream(is));
- }
- pbs = new PositionalBufferedStream(is);
- final SOURCE source = codec.makeSourceFromStream(pbs);
- header = codec.readHeader(source);
- } catch (Exception e) {
- throw new TribbleException.MalformedFeatureFile("Unable to parse header with error: " + e.getMessage(), path, e);
- } finally {
- if (pbs != null) pbs.close();
- else if (is != null) is.close();
- }
- }
-
- /**
- * Return an iterator to iterate over features overlapping the specified interval
- * <p/>
- * Note that TribbleIndexedFeatureReader only supports issuing and manipulating a single query
- * for each reader. That is, the behavior of the following code is undefined:
- * <p/>
- * reader = new TribbleIndexedFeatureReader()
- * Iterator it1 = reader.query("x", 10, 20)
- * Iterator it2 = reader.query("x", 1000, 1010)
- * <p/>
- * As a consequence of this, the TribbleIndexedFeatureReader are also not thread-safe.
- *
- * @param chr contig
- * @param start start position
- * @param end end position
- * @return an iterator of records in this interval
- * @throws IOException
- */
- public CloseableTribbleIterator<T> query(final String chr, final int start, final int end) throws IOException {
-
- if (!this.hasIndex()) {
- throw new TribbleException("Index not found for: " + path);
- }
-
- if (index.containsChromosome(chr)) {
- final List<Block> blocks = index.getBlocks(chr, start - 1, end);
- return new QueryIterator(chr, start, end, blocks);
- } else {
- return new EmptyIterator<T>();
- }
- }
-
-
- /**
- * @return Return an iterator to iterate over the entire file
- * @throws IOException
- */
- public CloseableTribbleIterator<T> iterator() throws IOException {
- return new WFIterator();
- }
-
- /**
- * @deprecated use {@link #hasBlockCompressedExtension(String)} instead
- */
- //Visible for testing
- @Deprecated
- static boolean isGZIPPath(final String path) {
- if (path.toLowerCase().endsWith(".gz")) {
- return true;
- }
- else {
- String uriPath = null;
- try {
- URI uri = new URI(path);
- if (uri != null) {
- uriPath = uri.getPath();
- return uriPath != null && uriPath.toLowerCase().endsWith(".gz");
- }
- return false;
- }
- catch (URISyntaxException e) {
- return false;
- }
- }
- }
-
- /**
- * Class to iterator over an entire file.
- */
- class WFIterator implements CloseableTribbleIterator<T> {
- private T currentRecord;
- private SOURCE source;
-
- /**
- * Constructor for iterating over the entire file (seekableStream).
- *
- * @throws IOException
- */
- public WFIterator() throws IOException {
- final InputStream inputStream = ParsingUtils.openInputStream(path);
-
- final PositionalBufferedStream pbs;
- if (hasBlockCompressedExtension(path)) {
- // Gzipped -- we need to buffer the GZIPInputStream methods as this class makes read() calls,
- // and seekableStream does not support single byte reads
- final InputStream is = new GZIPInputStream(new BufferedInputStream(inputStream, 512000));
- pbs = new PositionalBufferedStream(is, 1000); // Small buffer as this is buffered already.
- } else {
- pbs = new PositionalBufferedStream(inputStream, 512000);
- }
- /**
- * The header was already read from the original source in the constructor; don't read it again, since some codecs keep state
- * about its initializagtion. Instead, skip that part of the stream.
- */
- pbs.skip(header.getHeaderEnd());
- source = codec.makeSourceFromStream(pbs);
- readNextRecord();
- }
-
- @Override
- public boolean hasNext() {
- return currentRecord != null;
- }
-
- @Override
- public T next() {
- final T ret = currentRecord;
- try {
- readNextRecord();
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to read the next record, the last record was at " +
- ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
- }
- return ret;
- }
-
- /**
- * Advance to the next record in the query interval.
- *
- * @throws IOException
- */
- private void readNextRecord() throws IOException {
- currentRecord = null;
-
- while (!codec.isDone(source)) {
- final T f;
- try {
- f = codec.decode(source);
-
- if (f == null) {
- continue;
- }
-
- currentRecord = f;
- return;
-
- } catch (TribbleException e) {
- e.setSource(path);
- throw e;
- } catch (NumberFormatException e) {
- final String error = "Error parsing line at byte position: " + source;
- throw new TribbleException.MalformedFeatureFile(error, path, e);
- }
- }
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("Remove is not supported in Iterators");
- }
-
- @Override
- public void close() {
- codec.close(source);
- }
-
- @Override
- public WFIterator iterator() {
- return this;
- }
- }
-
- /**
- * Iterator for a query interval
- */
- class QueryIterator implements CloseableTribbleIterator<T> {
- private String chrAlias;
- int start;
- int end;
- private T currentRecord;
- private SOURCE source;
- private SeekableStream mySeekableStream;
- private Iterator<Block> blockIterator;
-
-
- public QueryIterator(final String chr, final int start, final int end, final List<Block> blocks) throws IOException {
- this.start = start;
- this.end = end;
- mySeekableStream = getSeekableStream();
- blockIterator = blocks.iterator();
- advanceBlock();
- readNextRecord();
-
- // The feature chromosome might not be the query chromosome, due to alias definitions. We assume
- // the chromosome of the first record is correct and record it here. This is not pretty.
- chrAlias = (currentRecord == null ? chr : currentRecord.getContig());
-
- }
-
-
- public boolean hasNext() {
- return currentRecord != null;
- }
-
- public T next() {
- final T ret = currentRecord;
- try {
- readNextRecord();
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to read the next record, the last record was at " +
- ret.getContig() + ":" + ret.getStart() + "-" + ret.getEnd(), e);
- }
- return ret;
- }
-
-
- private void advanceBlock() throws IOException {
- while (blockIterator != null && blockIterator.hasNext()) {
- final Block block = blockIterator.next();
- if (block.getSize() > 0) {
- final int bufferSize = Math.min(2000000, block.getSize() > 100000000 ? 10000000 : (int) block.getSize());
- source = codec.makeSourceFromStream(new PositionalBufferedStream(new BlockStreamWrapper(mySeekableStream, block), bufferSize));
- // note we don't have to skip the header here as the block should never start in the header
- return;
- }
- }
-
- // If we get here the blocks are exhausted, set reader to null
- if (source != null) {
- codec.close(source);
- source = null;
- }
- }
-
- /**
- * Advance to the next record in the query interval.
- *
- * @throws IOException
- */
- private void readNextRecord() throws IOException {
-
- if (source == null) {
- return; // <= no more features to read
- }
-
- currentRecord = null;
-
- while (true) { // Loop through blocks
- while (!codec.isDone(source)) { // Loop through current block
- final T f;
- try {
- f = codec.decode(source);
- if (f == null) {
- continue; // Skip
- }
- if ((chrAlias != null && !f.getContig().equals(chrAlias)) || f.getStart() > end) {
- if (blockIterator.hasNext()) {
- advanceBlock();
- continue;
- } else {
- return; // Done
- }
- }
- if (f.getEnd() < start) {
- continue; // Skip
- }
-
- currentRecord = f; // Success
- return;
-
- } catch (TribbleException e) {
- e.setSource(path);
- throw e;
- } catch (NumberFormatException e) {
- final String error = "Error parsing line: " + source;
- throw new TribbleException.MalformedFeatureFile(error, path, e);
- }
- }
- if (blockIterator != null && blockIterator.hasNext()) {
- advanceBlock(); // Advance to next block
- } else {
- return; // No blocks left, we're done.
- }
- }
- }
-
-
- public void remove() {
- throw new UnsupportedOperationException("Remove is not supported.");
- }
-
-
- public void close() {
- // Note that this depends on BlockStreamWrapper not actually closing the underlying stream
- codec.close(source);
- if (!reuseStreamInQuery()) {
- // if we are going to reuse the underlying stream we don't close the underlying stream.
- try {
- mySeekableStream.close();
- } catch (IOException e) {
- throw new TribbleException("Couldn't close seekable stream", e);
- }
- }
- }
-
- public Iterator<T> iterator() {
- return this;
- }
- }
-
-
- /**
- * Wrapper around a SeekableStream that limits reading to the specified "block" of bytes. Attempts to
- * read beyond the end of the block should return -1 (EOF).
- */
- static class BlockStreamWrapper extends InputStream {
-
- SeekableStream seekableStream;
- long maxPosition;
-
- BlockStreamWrapper(final SeekableStream seekableStream, final Block block) throws IOException {
- this.seekableStream = seekableStream;
- seekableStream.seek(block.getStartPosition());
- maxPosition = block.getEndPosition();
- }
-
- @Override
- public int read() throws IOException {
- return (seekableStream.position() > maxPosition) ? -1 : seekableStream.read();
- }
-
- @Override
- public int read(final byte[] bytes, final int off, final int len) throws IOException {
- // note the careful treatment here to ensure we can continue to
- // read very long > Integer sized blocks
- final long maxBytes = maxPosition - seekableStream.position();
- if (maxBytes <= 0) {
- return -1;
- }
-
- final int bytesToRead = (int) Math.min(len, Math.min(maxBytes, Integer.MAX_VALUE));
- return seekableStream.read(bytes, off, bytesToRead);
-
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/annotation/Strand.java b/src/main/java/htsjdk/tribble/annotation/Strand.java
deleted file mode 100644
index 581a885..0000000
--- a/src/main/java/htsjdk/tribble/annotation/Strand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.annotation;
-
-/**
- * Enum for strand, which can be encoded as string
- */
-public enum Strand {
- POSITIVE("+"), NEGATIVE("-"), NONE("!"); // not really sure what we should do for the NONE Enum
-
- /**
- * How we represent the strand information as text
- */
- private String encoding;
- Strand(String str) {
- encoding = str;
- }
-
- /**
- * provide a way to take an encoding string, and produce a Strand
- * @param encoding the encoding string
- * @return a Strand object, if an appropriate one cannot be located an IllegalArg exception
- */
- public static Strand toStrand(String encoding) {
- for (Strand st : Strand.values())
- if (st.encoding.equals(encoding))
- return st;
- throw new IllegalArgumentException("Unable to match encoding to Strand enum for encoding string " + encoding);
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/bed/BEDCodec.java b/src/main/java/htsjdk/tribble/bed/BEDCodec.java
deleted file mode 100644
index ea1e889..0000000
--- a/src/main/java/htsjdk/tribble/bed/BEDCodec.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.annotation.Strand;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.util.ParsingUtils;
-
-import java.util.regex.Pattern;
-
-/**
- * Codec for parsing BED file, as described by UCSC
- * See https://genome.ucsc.edu/FAQ/FAQformat.html#format1
- *
- * @author jrobinso
- * Date: Dec 20, 2009
- */
-public class BEDCodec extends AsciiFeatureCodec<BEDFeature> {
-
- /** Default extension for BED files. */
- public static final String BED_EXTENSION = ".bed";
-
- private static final Pattern SPLIT_PATTERN = Pattern.compile("\\t|( +)");
- private final int startOffsetValue;
-
- /**
- * Calls {@link #BEDCodec(StartOffset)} with an argument
- * of {@code StartOffset.ONE}
- */
- public BEDCodec() {
- this(StartOffset.ONE);
- }
-
-
- /**
- * BED format is 0-based, but Tribble is 1-based.
- * Set desired start position at either ZERO or ONE
- */
- public BEDCodec(final StartOffset startOffset) {
- super(BEDFeature.class);
- this.startOffsetValue = startOffset.value();
- }
-
-
- public BEDFeature decodeLoc(String line) {
- return decode(line);
- }
-
- @Override
- public BEDFeature decode(String line) {
-
- if (line.trim().isEmpty()) {
- return null;
- }
-
- if (line.startsWith("#") || line.startsWith("track") || line.startsWith("browser")) {
- this.readHeaderLine(line);
- return null;
- }
-
- String[] tokens = SPLIT_PATTERN.split(line, -1);
- return decode(tokens);
- }
-
- @Override
- public Object readActualHeader(LineIterator reader) {
- return null;
- }
-
- public BEDFeature decode(String[] tokens) {
- int tokenCount = tokens.length;
-
- // The first 3 columns are non optional for BED. We will relax this
- // and only require 2.
-
- if (tokenCount < 2) {
- return null;
- }
-
- String chr = tokens[0];
-
- // The BED format uses a first-base-is-zero convention, Tribble features use 1 => add 1.
- int start = Integer.parseInt(tokens[1]) + startOffsetValue;
-
- int end = start;
- if (tokenCount > 2) {
- end = Integer.parseInt(tokens[2]);
- }
-
- FullBEDFeature feature = new FullBEDFeature(chr, start, end);
-
- // The rest of the columns are optional. Stop parsing upon encountering
- // a non-expected value
-
- // Name
- if (tokenCount > 3) {
- String name = tokens[3].replaceAll("\"", "");
- feature.setName(name);
- }
-
- // Score
- if (tokenCount > 4) {
- try {
- float score = Float.parseFloat(tokens[4]);
- feature.setScore(score);
- } catch (NumberFormatException numberFormatException) {
-
- // Unexpected, but does not invalidate the previous values.
- // Stop parsing the line here but keep the feature
- // Don't log, would just slow parsing down.
- return feature;
- }
- }
-
- // Strand
- if (tokenCount > 5) {
- String strandString = tokens[5].trim();
- char strand = (strandString.isEmpty())
- ? ' ' : strandString.charAt(0);
-
- if (strand == '-') {
- feature.setStrand(Strand.NEGATIVE);
- } else if (strand == '+') {
- feature.setStrand(Strand.POSITIVE);
- } else {
- feature.setStrand(Strand.NONE);
- }
- }
-
- //Color
- if (tokenCount > 8) {
- String colorString = tokens[8];
- feature.setColor(ParsingUtils.parseColor(colorString));
- }
-
- // Coding information is optional
- if (tokenCount > 11) {
- createExons(start, tokens, feature, feature.getStrand());
- }
-
- return feature;
- }
-
- protected boolean readHeaderLine(String line) {
- //We don't parse BED header
- return false;
- }
-
- private void createExons(int start, String[] tokens, FullBEDFeature gene,
- Strand strand) throws NumberFormatException {
-
- int cdStart = Integer.parseInt(tokens[6]) + startOffsetValue;
- int cdEnd = Integer.parseInt(tokens[7]);
-
- int exonCount = Integer.parseInt(tokens[9]);
- String[] exonSizes = new String[exonCount];
- String[] startsBuffer = new String[exonCount];
- ParsingUtils.split(tokens[10], exonSizes, ',');
- ParsingUtils.split(tokens[11], startsBuffer, ',');
-
- int exonNumber = (strand == Strand.NEGATIVE ? exonCount : 1);
-
- if (startsBuffer.length == exonSizes.length) {
- for (int i = 0; i < startsBuffer.length; i++) {
- int exonStart = start + Integer.parseInt(startsBuffer[i]);
- int exonEnd = exonStart + Integer.parseInt(exonSizes[i]) - 1;
- gene.addExon(exonStart, exonEnd, cdStart, cdEnd, exonNumber);
-
- if (strand == Strand.NEGATIVE) {
- exonNumber--;
- } else {
- exonNumber++;
- }
- }
- }
- }
-
- @Override
- public boolean canDecode(final String path) {
- final String toDecode;
- if (AbstractFeatureReader.hasBlockCompressedExtension(path)) {
- toDecode = path.substring(0, path.lastIndexOf("."));
- } else {
- toDecode = path;
- }
- return toDecode.toLowerCase().endsWith(BED_EXTENSION);
- }
-
- public int getStartOffset() {
- return this.startOffsetValue;
- }
-
- /**
- * Indicate whether co-ordinates or 0-based or 1-based.
- * <p/>
- * Tribble uses 1-based, BED files use 0.
- * e.g.:
- * start_position = bedline_start_position - startIndex.value()
- */
- public enum StartOffset {
- ZERO(0),
- ONE(1);
- private int start;
-
- private StartOffset(int start) {
- this.start = start;
- }
-
- public int value() {
- return this.start;
- }
- }
-
- @Override
- public TabixFormat getTabixFormat() {
- return TabixFormat.BED;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/bed/BEDFeature.java b/src/main/java/htsjdk/tribble/bed/BEDFeature.java
deleted file mode 100644
index d70e605..0000000
--- a/src/main/java/htsjdk/tribble/bed/BEDFeature.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.annotation.Strand;
-
-import java.awt.*;
-
-/**
- * @author jrobinso
- * @date Dec 24, 2009
- *
- * BED feature start and end positions must adhere to the Feature interval specifications.
- * This is different than the 0-based representation in a BED file. This conversion is handled by {@link BEDCodec}.
- * Anyone writing a bed file should be aware of this difference.
- */
-public interface BEDFeature extends Feature {
- Strand getStrand();
-
- String getType();
-
- Color getColor();
-
- String getDescription();
-
- java.util.List<FullBEDFeature.Exon> getExons();
-
- String getName();
-
- float getScore();
-
- String getLink();
-}
diff --git a/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java b/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java
deleted file mode 100644
index eab5688..0000000
--- a/src/main/java/htsjdk/tribble/bed/FullBEDFeature.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.annotation.Strand;
-
-import java.util.ArrayList;
-
-/**
- * Object for full BED file.
- */
-public class FullBEDFeature extends SimpleBEDFeature implements BEDFeature {
-
- private java.util.List<Exon> exons = new ArrayList();
-
- public FullBEDFeature(String chr, int start, int end) {
- super(start, end, chr);
-
- }
-
- public java.util.List<Exon> getExons() {
- return exons;
- }
-
- public void setExons(java.util.List<Exon> exons) {
- this.exons = exons;
- }
-
- public void addExon(Exon exon) {
- if (exon == null) {
- this.exons = new ArrayList();
- }
- exons.add(exon);
- }
-
- public void addExon(int exonStart, int exonEnd, int cdStart, int cdEnd, int exonNumber) {
- Exon exon = new Exon(exonStart, exonEnd);
- exon.setCodingStart(cdStart);
- exon.setCodingEnd(cdEnd);
- exon.setNumber(exonNumber);
- addExon(exon);
- }
-
- /**
- * A sub region of a feature. For example, a Gene exon
- *
- * @author jrobinso
- */
- public class Exon {
-
- int start;
- int end;
- /**
- * The index of the exon relative to the start codon. The exon with the start
- * codon is number "1".
- */
- private int number;
- private int readingFrame = -1;
-
- /**
- * Coding start position. This is the leftmost position of the coding region, not neccessarily the 5'utr end
- */
- private int codingStart;
- private int codingEnd;
- boolean utr = false;
-
- // The position of the first base of this exon relative to the start of the mRNA. This will correspond
- // to either the beginning or end of the exon, depending on the strand
- private int mrnaBase = -1;
-
-
- public void setMrnaBase(int base) {
- this.mrnaBase = base;
- }
-
-
- /**
- * Constructs ...
- *
- * @param start
- * @param end
- */
- public Exon(int start, int end) {
- this.start = start;
- this.end = end;
-
- // By default the entre exon is a coding region
- this.codingStart = start;
- this.codingEnd = end;
- }
-
- /**
- * Flag indicating that the entire exon is the UTR.
- *
- * @param utr
- */
- public void setUTR(boolean utr) {
- this.utr = utr;
- if (strand == Strand.POSITIVE) {
- codingStart = codingEnd = end;
- } else {
- codingStart = codingEnd = start;
- }
- }
-
- /**
- * Method description
- *
- * @param codingStart
- */
- public void setCodingStart(int codingStart) {
- this.codingStart = Math.max(start, codingStart);
- }
-
- /**
- * Method description
- *
- * @param codingEnd
- */
- public void setCodingEnd(int codingEnd) {
- this.codingEnd = Math.min(end, codingEnd);
- }
-
- /**
- * Method description
- *
- * @param offset
- */
- public void setReadingFrame(int offset) {
- this.readingFrame = offset;
- }
-
- /**
- * Method description
- *
- * @param phase
- */
- public void setPhase(int phase) {
- if (strand == Strand.POSITIVE) {
- readingFrame = phase;
- } else if (strand == Strand.NEGATIVE) {
- int modLen = (getCodingLength() - phase) % 3;
- readingFrame = modLen;
- }
- }
-
-
- /**
- * Method description
- *
- * @return
- */
- public int getCdStart() {
- return codingStart;
- }
-
- /**
- * Method description
- *
- * @return
- */
- public int getCdEnd() {
- return this.codingEnd;
- }
-
- /**
- * Method description
- *
- * @return
- */
- public int getCodingLength() {
- return utr ? 0 : Math.max(0, codingEnd - codingStart + 1);
- }
-
- /**
- * This is exposed for unit tests.
- *
- * @return
- */
- int getReadingShift() {
- return readingFrame;
- }
-
-
- public String getValueString(double position) {
- String msg = number > 0 ? "Exon number: " + number : "";
- return msg;
- }
-
- public int getNumber() {
- return number;
- }
-
- public void setNumber(int number) {
- this.number = number;
- }
- }
-
-
- public class Exon2 {
-
- /**
- * The index of the exon relative to the start codon. The exon with the start
- * codon is number "1".
- */
- private int number;
- private int readingFrame = -1;
-
- /**
- * Coding start position. This is the leftmost position of the coding region, not neccessarily the 5'utr end
- */
- private int start;
- private int end;
- private int codingStart;
- private int codingEnd;
- //private AminoAcidSequence aminoAcidSequence;
- boolean utr = false;
-
- // The position of the first base of this exon relative to the start of the mRNA. This will correspond
- // to either the beginning or end of the exon, depending on the strand
- private int mrnaBase = -1;
-
-
- public Exon2(int start, int end, int codingStart, int codingDne) {
-
- this.start = start;
- this.end = end;
- this.codingStart = codingStart;
- this.codingEnd = codingDne;
- }
-
-
- public void setMrnaBase(int base) {
- this.mrnaBase = base;
- }
-
- public int getAminoAcidNumber(int genomeCoordinate) {
- if (mrnaBase < 0) {
- return -1;
- }
- if (genomeCoordinate < getStart() || genomeCoordinate > getEnd()) {
- throw new IndexOutOfBoundsException();
- }
- if (getStrand() == Strand.POSITIVE) {
- int mrnaCoord = mrnaBase + (genomeCoordinate - codingStart) - 1;
- return mrnaCoord < 0 ? -1 : mrnaCoord / 3 + 1;
-
- } else if (getStrand() == Strand.NEGATIVE) {
- int mrnaCoord = mrnaBase + (codingEnd - genomeCoordinate);
- return mrnaCoord < 0 ? -1 : mrnaCoord / 3 + 1;
-
- } else {
- return 0;
- }
- }
-
- /**
- * Flag indicating that the entire exon is the UTR.
- *
- * @param utr
- */
- public void setUTR(boolean utr) {
- this.utr = utr;
- if (getStrand() == Strand.POSITIVE) {
- codingStart = codingEnd = getEnd();
- } else {
- codingStart = codingEnd = getStart();
- }
- }
-
- /**
- * Method description
- *
- * @param codingStart
- */
- public void setCodingStart(int codingStart) {
- this.codingStart = Math.max(getStart(), codingStart);
- }
-
- /**
- * Method description
- *
- * @param codingEnd
- */
- public void setCodingEnd(int codingEnd) {
- this.codingEnd = Math.min(getEnd(), codingEnd);
- }
-
- /**
- * Method description
- *
- * @param offset
- */
- public void setReadingFrame(int offset) {
- this.readingFrame = offset;
- }
-
- /**
- * Method description
- *
- * @param phase
- */
- public void setPhase(int phase) {
- if (getStrand() == Strand.POSITIVE) {
- readingFrame = phase;
- } else if (getStrand() == Strand.NEGATIVE) {
- int modLen = (getCodingLength() - phase) % 3;
- readingFrame = modLen;
- }
- }
-
-
- /**
- * Method description
- *
- * @return
- */
- public int getCdStart() {
- return codingStart;
- }
-
- /**
- * Method description
- *
- * @return
- */
- public int getCdEnd() {
- return this.codingEnd;
- }
-
- /**
- * Method description
- *
- * @return
- */
- public int getCodingLength() {
- return utr ? 0 : Math.max(0, codingEnd - codingStart);
- }
-
- /**
- * This is exposed for unit tests.
- *
- * @return
- */
- int getReadingShift() {
- return readingFrame;
- }
-
-
- /**
- * Method description
- *
- * @return
- */
- /*
- public AminoAcidSequence getAminoAcidSequence() {
- if (aminoAcidSequence == null) {
- computeAminoAcidSequence();
- }
- return aminoAcidSequence;
- }
- */
-
-
- /*
- public void setAminoAcidSequence(AminoAcidSequence aminoAcidSequence) {
- this.aminoAcidSequence = aminoAcidSequence;
- }
- */
-
- /*
- private void computeAminoAcidSequence() {
-
- if (utr) {
- return;
- }
- int start = getStart();
- int end = getEnd();
- String chr = getChr();
- if (readingFrame >= 0) {
- int readStart = (codingStart > start) ? codingStart : start + readingFrame;
- int readEnd = Math.min(end, codingEnd);
- if (readEnd > readStart + 3) {
- String genome = IGVModel.getInstance().getViewContext().getGenomeId();
- aminoAcidSequence = AminoAcidManager.getAminoAcidSequence(genome, chr, readStart,
- readEnd, getStrand());
- }
- }
- }
- */
-
-
- public String getValueString(double position) {
- String msg = number > 0 ? "Exon number: " + number : "";
- int aaNumber = this.getAminoAcidNumber((int) position);
- if (aaNumber > 0) {
- msg += "<br>Amino acid number: " + aaNumber;
- }
- return msg;
- }
-
- public int getNumber() {
- return number;
- }
-
- public void setNumber(int number) {
- this.number = number;
- }
-
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java b/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java
deleted file mode 100644
index 77a030f..0000000
--- a/src/main/java/htsjdk/tribble/bed/SimpleBEDFeature.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.annotation.Strand;
-
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Feature from a BED file without exon blocks.
- */
-public class SimpleBEDFeature implements BEDFeature {
- protected String chr;
- protected int start = -1;
- protected int end = -1;
- protected Strand strand = Strand.NONE;
- private String name = "";
- private float score = Float.NaN;
- private String type = "";
- private Color color;
- private String description;//protected float confidence;
- //private String identifier;
- private String link;
-
- public SimpleBEDFeature(int start, int end, String chr) {
- this.start = start;
- this.end = end;
- this.chr = chr;
- }
-
- @Override
- public String getContig() {
- return chr;
- }
-
- public int getStart() {
- return start;
- }
-
- public int getEnd() {
- return end;
- }
-
- public Strand getStrand() {
- return strand;
- }
-
- public void setStrand(Strand strand) {
- this.strand = strand;
- }
-
- public void setChr(String chr) {
- this.chr = chr;
- }
-
- public void setStart(int start) {
- this.start = start;
- }
-
- public void setEnd(int end) {
- this.end = end;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public Color getColor() {
- return color;
- }
-
- public void setColor(Color color) {
- this.color = color;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public float getScore() {
- return score;
- }
-
- public void setScore(float score) {
- this.score = score;
- }
-
- public String getLink() {
- return link;
- }
-
- public void setLink(String link) {
- this.link = link;
- }
-
- final static List<FullBEDFeature.Exon> emptyExonList = new ArrayList();
-
- public java.util.List<FullBEDFeature.Exon> getExons() {
- return emptyExonList;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/example/CountRecords.java b/src/main/java/htsjdk/tribble/example/CountRecords.java
deleted file mode 100644
index 230c1bf..0000000
--- a/src/main/java/htsjdk/tribble/example/CountRecords.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.gelitext.GeliTextCodec;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * An example of how to index a feature file, and then count all the records in the file.
- * This is also useful for testing the feature reader
- */
-public class CountRecords {
-
- /**
- * The main method of this class:
- * 1) checks to see that the feature file exists
- * 2) loads an index from disk, if one doesn't exist, it creates it and writes it to disk
- * 3) creates a FeatureSource
- * 4) iterates over the records, emitting a final tally for the number of features seen
- *
- * @param args a single parameter, the file name to load
- */
- public static void main(String[] args) {
-
- // check yourself before you wreck yourself - we require one arg, the input file
- if (args.length > 2)
- printUsage();
-
- // our feature file
- File featureFile = new File(args[0]);
- if (!featureFile.exists()) {
- System.err.println("File " + featureFile.getAbsolutePath() + " doesnt' exist");
- printUsage();
- }
-
- int optimizeIndex = args.length == 2 ? Integer.valueOf(args[1]) : -1;
-
- // determine the codec
- FeatureCodec codec = getFeatureCodec(featureFile);
-
- runWithIndex(featureFile, codec, optimizeIndex);
-
- }
-
- /**
- *
- * @see htsjdk.tribble.index.linear.LinearIndex#optimize(double)
- * @param featureInput File containing features
- * @param codec Codec used to read the features
- * @param optimizeThreshold Threshold used to optimize the linear index
- * @return
- */
- public static long runWithIndex(File featureInput, FeatureCodec codec, int optimizeThreshold) {
- // get an index
- Index index = loadIndex(featureInput, codec);
- if ( optimizeThreshold != -1 )
- ((LinearIndex)index).optimize(optimizeThreshold);
-
- // get a reader
- AbstractFeatureReader reader = null;
- try {
- reader = AbstractFeatureReader.getFeatureReader(featureInput.getAbsolutePath(), codec, index);
-
- // now read iterate over the file
- long recordCount = 0l;
-
- // this call could be replaced with a query
- Iterator<Feature> iter = reader.iterator();
-
- // cycle through the iterators
- while (iter.hasNext()) {
- Feature feat = iter.next();
- ++recordCount;
- }
-
- System.err.println("We saw " + recordCount + " record in file " + featureInput);
- return recordCount;
-
- } catch (IOException e) {
- throw new RuntimeIOException("Something went wrong while reading feature file " + featureInput, e);
- }
- }
-
- /**
- * print usage information
- */
- public static void printUsage() {
- System.err.println("Usage: java -jar CountRecords.jar <inputFile>");
- System.err.println(" Where input can be of type: VCF (ends in .vcf or .VCF");
- System.err.println(" Bed (ends in .bed or .bed");
- /**
- * you could add others here; also look in the GATK code-base for an example of a dynamic way
- * to load Tribble codecs.
- */
- System.exit(1);
- }
-
- /**
- *
- * @param featureFile the feature file
- * @param codec the codec to decode features with
- * @return an index instance
- */
- public static Index loadIndex(File featureFile, FeatureCodec codec) {
- // lets setup a index file name
- File indexFile = Tribble.indexFile(featureFile);
-
- // our index instance;
- Index index = null;
-
- // can we read the index file
- if (indexFile.canRead()) {
- System.err.println("Loading index from disk for index file -> " + indexFile);
- index = IndexFactory.loadIndex(indexFile.getAbsolutePath());
- // else we want to make the index, and write it to disk if possible
- } else {
- System.err.println("Creating the index and memory, then writing to disk for index file -> " + indexFile);
- index = createAndWriteNewIndex(featureFile,indexFile,codec);
- }
-
- return index;
- }
-
- /**
- * creates a new index, given the feature file and the codec
- * @param featureFile the feature file (i.e. .vcf, .bed)
- * @param indexFile the index file; the location we should be writing the index to
- * @param codec the codec to read features with
- * @return an index instance
- */
- public static Index createAndWriteNewIndex(File featureFile, File indexFile, FeatureCodec codec) {
- try {
- Index index = IndexFactory.createLinearIndex(featureFile, codec);
-
- // try to write it to disk
- LittleEndianOutputStream stream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(indexFile)));
-
- index.write(stream);
- stream.close();
-
- return index;
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to create index from file " + featureFile,e);
- }
- }
-
- /**
- * Return a {@code FeatureCodec} instance appropriate for the given
- * {@code featureFile}. Codec is generated based on file extension
- * @param featureFile
- * @return
- * @throws IllegalArgumentException If a codec cannot be found
- */
- public static FeatureCodec getFeatureCodec(File featureFile) {
- // quickly determine the codec type
- //if (featureFile.getName().endsWith(".vcf") || featureFile.getName().endsWith(".VCF") )
- // return new VCFCodec();
- if (featureFile.getName().endsWith(".bed") || featureFile.getName().endsWith(".BED") )
- return new BEDCodec();
- if (featureFile.getName().endsWith(".geli.calls") || featureFile.getName().endsWith(".geli") )
- return new GeliTextCodec();
- throw new IllegalArgumentException("Unable to determine correct file type based on the file name, for file -> " + featureFile);
- }
-}
diff --git a/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java b/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java
deleted file mode 100644
index 9628cc4..0000000
--- a/src/main/java/htsjdk/tribble/example/ExampleBinaryCodec.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.SimpleFeature;
-import htsjdk.tribble.BinaryFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.readers.AsciiLineReader;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * An example binary codec that encodes / decodes contig / start / stop values via DataInputStreams
- *
- * @author Mark DePristo
- */
-public class ExampleBinaryCodec extends BinaryFeatureCodec<Feature> {
- public final static String HEADER_LINE = "# BinaryTestFeature";
-
- @Override
- public Feature decodeLoc(final PositionalBufferedStream stream) throws IOException {
- return decode(stream);
- }
-
- @Override
- public Feature decode(final PositionalBufferedStream stream) throws IOException {
- DataInputStream dis = new DataInputStream(stream);
- String contig = dis.readUTF();
- int start = dis.readInt();
- int stop = dis.readInt();
- return new SimpleFeature(contig, start, stop);
- }
-
- @Override
- public FeatureCodecHeader readHeader(final PositionalBufferedStream stream) throws IOException {
- // Construct a reader that does not read ahead (because we don't want to consume data from the stream that is not the header)
- final AsciiLineReader nonReadAheadLineReader = new AsciiLineReader(stream);
- final List<String> headerLines = new ArrayList<String>();
- long headerLengthInBytes = 0;
- while (stream.peek() == ('#' & 0xff)) { // Look for header lines, which are prefixed by '#'.
- headerLines.add(nonReadAheadLineReader.readLine());
- headerLengthInBytes = stream.getPosition();
- }
- return new FeatureCodecHeader(headerLines, headerLengthInBytes);
- }
-
- @Override
- public Class<Feature> getFeatureType() {
-
- return Feature.class;
- }
- @Override
- public boolean canDecode(final String path) {
- return false;
- }
-
- /**
- * Convenience method that creates an ExampleBinaryCodec file from another feature file.
- *
- * For testing purposes really
- *
- * @param source file containing the features
- * @param dest the place to write the binary features
- * @param codec of the source file features
- * @throws IOException
- */
- public static <FEATURE_TYPE extends Feature> void convertToBinaryTest(final File source, final File dest, final FeatureCodec<FEATURE_TYPE, LineIterator> codec) throws IOException {
- final FeatureReader<FEATURE_TYPE> reader = AbstractFeatureReader.getFeatureReader(source.getAbsolutePath(), codec, false); // IndexFactory.loadIndex(idxFile));
- final OutputStream output = new FileOutputStream(dest);
- ExampleBinaryCodec.convertToBinaryTest(reader, output);
- }
-
- /**
- * Convenience method that creates an ExampleBinaryCodec file from another feature file.
- *
- * For testing purposes really
- *
- * @throws IOException
- */
- public static <FEATURE_TYPE extends Feature> void convertToBinaryTest(final FeatureReader<FEATURE_TYPE> reader, final OutputStream out) throws IOException {
- DataOutputStream dos = new DataOutputStream(out);
- dos.writeBytes(HEADER_LINE + "\n");
- Iterator<FEATURE_TYPE> it = reader.iterator();
- while ( it.hasNext() ) {
- final Feature f = it.next();
- dos.writeUTF(f.getContig());
- dos.writeInt(f.getStart());
- dos.writeInt(f.getEnd());
- }
- dos.close();
- reader.close();
- }
-}
diff --git a/src/main/java/htsjdk/tribble/example/IndexToTable.java b/src/main/java/htsjdk/tribble/example/IndexToTable.java
deleted file mode 100644
index 9cf6c70..0000000
--- a/src/main/java/htsjdk/tribble/example/IndexToTable.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
-
-public class IndexToTable {
-
- /**
- * this class:
- * 1) checks to see that the feature file exists
- * 2) loads an index from disk, if one doesn't exist, it creates it and writes it to disk
- * 3) Converts the index to a human readable table
- * @see htsjdk.tribble.index.linear.LinearIndex#writeTable(java.io.PrintStream)
- *
- * @param args 2 parameters:
- * 1) The path of the file to index
- * 2) The output file path
- */
- public static void main(String[] args) {
-
- // check yourself before you wreck yourself - we require one arg, the input file
- if (args.length != 2)
- printUsage();
-
- //LinearIndex.enableAdaptiveIndexing = false;
- LinearIndex idx = (LinearIndex) IndexFactory.loadIndex(new File(args[0]).getAbsolutePath());
- try {
- idx.writeTable(new PrintStream(new FileOutputStream(new File(args[1]))));
- } catch ( FileNotFoundException e ) {
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- /**
- * print usage information
- */
- public static void printUsage() {
- System.err.println("Usage: java -jar IndexToTable.jar index.file output.table");
- System.exit(1);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java b/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java
deleted file mode 100644
index b0ea712..0000000
--- a/src/main/java/htsjdk/tribble/example/IndicesAreEqual.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-
-import java.io.File;
-
-/**
- * Check with two index files are equal
- */
-public class IndicesAreEqual {
-
- /**
- *
- * @param args 2 parameters, the paths of the two index files to compare
- */
- public static void main(String[] args) {
- if ( args.length != 2 )
- printUsage();
- else {
- Index index1 = loadIndex(args[0]);
- Index index2 = loadIndex(args[1]);
- System.out.printf("%n");
- System.out.printf("index1: %s%n", args[0]);
- System.out.printf("index2: %s%n", args[1]);
- boolean eq = index1.equals(index2);
- System.out.printf(" equals() = %b%n", eq);
- }
- }
-
- /**
- * print usage information
- */
- public static void printUsage() {
- System.err.println("Usage: java -jar IndicesAreEqual.jar index1 index2");
- System.err.println(" Prints out true / false if index1 and index2 are equal");
- System.exit(1);
- }
-
- /**
- * @return an index instance
- */
- public static Index loadIndex(String filename) {
- //System.err.println("Loading index from disk for index file -> " + filename);
- File file = new File(filename);
- if (file.canRead()) {
- return IndexFactory.loadIndex(file.getAbsolutePath());
- } else {
- printUsage();
- return null;
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java b/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java
deleted file mode 100644
index 6e3ef13..0000000
--- a/src/main/java/htsjdk/tribble/example/ProfileIndexReading.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.example;
-
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-
-public class ProfileIndexReading {
-
- /**
- * This class times the loading of an index file a number of times,
- * and prints the result of each trial
- * @param args Two parameters:
- * 1) The number of trials to run
- * 2) Index file to load
- */
- public static void main(String[] args) {
-
- // check yourself before you wreck yourself - we require one arg, the input file
- if (args.length < 2)
- printUsage();
-
- int iterations = Integer.valueOf(args[0]);
- for ( int j = 1; j < args.length; j++ ) {
- String indexFile = args[j];
- System.out.printf("Reading %s%n", indexFile);
- long startTime = System.currentTimeMillis();
- for ( int i = 0; i < iterations; i++ ) {
- System.out.printf(" iteration %d%n", i);
- Index index = IndexFactory.loadIndex(indexFile);
- }
- long stopTime = System.currentTimeMillis();
- System.out.printf("Runtime %s %.2f%n", indexFile, (stopTime - startTime) / 1000.0);
- }
- }
-
- /**
- * print usage information
- */
- public static void printUsage() {
- System.err.println("Usage: java -jar ReadIndices.jar iterations index.file...");
- System.exit(1);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java b/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java
deleted file mode 100644
index 8cc3042..0000000
--- a/src/main/java/htsjdk/tribble/exception/CodecLineParsingException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.exception;
-
-
-/**
- * Class CodecLineParsingException
- *
- * a generic exception we use if the codec has trouble parsing the line its given
- *
- * @author aaron
- */
-public class CodecLineParsingException extends RuntimeException {
-
- public CodecLineParsingException(Throwable cause) {
- super(cause);
- }
-
- public CodecLineParsingException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public CodecLineParsingException(String message) {
- super(message);
- }
-
- public CodecLineParsingException() {
- }
-}
diff --git a/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java b/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java
deleted file mode 100644
index 7f5e387..0000000
--- a/src/main/java/htsjdk/tribble/exception/UnsortedFileException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.exception;
-
-/**
- * an exception for when we've discovered that an input file is unsorted; sorted files are required by Tribble
- */
-public class UnsortedFileException extends RuntimeException {
-
- public UnsortedFileException(Throwable cause) {
- super(cause);
- }
-
- public UnsortedFileException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public UnsortedFileException(String message) {
- super(message);
- }
-
- public UnsortedFileException() {
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java b/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java
deleted file mode 100644
index f533432..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/DiploidGenotype.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-
-/**
- * Class DiploidGenotype
- *
- * Enum describing all possible combinations of diploid genotype variations;
- * AA, AC, etc.
- *
- * @author aaron
- */
- at Deprecated
-public enum DiploidGenotype {
- AA, AC, AG, AT, CC, CG, CT, GG, GT, TT;
-
- public static DiploidGenotype toDiploidGenotype(String genotype) {
- if (genotype.length() != 2)
- throw new DiploidGenotypeException("Genotype string for conversion should be of length 2, we were passed = " + genotype);
- genotype = genotype.toUpperCase();
- for (DiploidGenotype g: DiploidGenotype.values())
- if (g.toString().equals(genotype)) return g;
- throw new DiploidGenotypeException("Unable to find genotype matching " + genotype);
- }
-
- public boolean isHet() {
- return toString().toCharArray()[0] != toString().toCharArray()[1];
- }
-
- public boolean containsBase(char base) {
- return (toString().charAt(0) == base || toString().charAt(1) == base);
- }
-}
-
- at Deprecated
-class DiploidGenotypeException extends RuntimeException {
- DiploidGenotypeException(String s) {
- super(s);
- }
-
- DiploidGenotypeException(String s, Throwable throwable) {
- super(s, throwable);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java b/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java
deleted file mode 100644
index 394b5dc..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/GeliTextCodec.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-import htsjdk.samtools.util.CollectionUtil;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.exception.CodecLineParsingException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.Arrays;
-
-
-/**
- * <p/>
- * A codec for parsing geli text files, which is the text version of the geli binary format.
- * <p/>
- * <p/>
- * GELI text has the following tab-seperated fields:
- * contig the contig (string)
- * position the position on the contig (long)
- * refBase the reference base (char)
- * depthOfCoverage the depth of coverage at this position (int)
- * maximumMappingQual the maximum mapping quality of a read at this position (int)
- * genotype the called genotype (string)
- * LODBestToReference the LOD score of the best to the reference (double)
- * LODBestToNext the LOD score of the best to the next best genotype (double)
- * likelihoods the array of all genotype likelihoods, in ordinal ordering (array of 10 doubles, in ordinal order)
- *
- * @author aaron
- * @deprecated This is deprecated and unsupported.
- */
- at Deprecated
-public class GeliTextCodec extends AsciiFeatureCodec<GeliTextFeature> {
- public GeliTextCodec() {
- super(GeliTextFeature.class);
- }
-
- public Feature decodeLoc(final String line) {
- return decode(line);
- }
-
- @Override
- public GeliTextFeature decode(final String line) {
- // clean out header lines and comments
- if (line.startsWith("#") || line.startsWith("@"))
- return null;
-
- // parse into tokens
- final String[] parts = line.trim().split("\\s+");
- return decode(parts);
- }
-
- @Override
- public boolean canDecode(String path){
- return path.toLowerCase().endsWith(".geli.calls") || path.toLowerCase().endsWith(".geli");
- }
-
- @Override
- public Object readActualHeader(LineIterator reader) {
- return null;
- }
-
- public GeliTextFeature decode(final String[] tokens) {
- try {
- // check that we got the correct number of tokens in the split
- if (tokens.length != 18)
- throw new CodecLineParsingException("Invalid GeliTextFeature row found -- incorrect element count. Expected 18, got " + tokens.length + " line = " + CollectionUtil.join(Arrays.asList(tokens), " "));
-
- // UPPER case and sort
- final char[] x = tokens[5].toUpperCase().toCharArray();
- Arrays.sort(x);
- final String bestGenotype = new String(x);
-
- final double[] genotypeLikelihoods = new double[10];
- for (int pieceIndex = 8, offset = 0; pieceIndex < 18; pieceIndex++, offset++) {
- genotypeLikelihoods[offset] = Double.valueOf(tokens[pieceIndex]);
- }
- return new GeliTextFeature(tokens[0],
- Long.valueOf(tokens[1]),
- Character.toUpperCase(tokens[2].charAt(0)),
- Integer.valueOf(tokens[3]),
- Integer.valueOf(tokens[4]),
- DiploidGenotype.toDiploidGenotype(bestGenotype),
- Double.valueOf(tokens[6]),
- Double.valueOf(tokens[7]),
- genotypeLikelihoods);
- } catch (CodecLineParsingException e) {
- e.printStackTrace();
- throw new RuntimeException("Unable to parse line " + CollectionUtil.join(Arrays.asList(tokens), " "), e);
- } catch (NumberFormatException e) {
- e.printStackTrace();
- throw new RuntimeException("Unable to parse line " + CollectionUtil.join(Arrays.asList(tokens), " "), e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java b/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java
deleted file mode 100644
index baad1ca..0000000
--- a/src/main/java/htsjdk/tribble/gelitext/GeliTextFeature.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.gelitext;
-
-import htsjdk.tribble.Feature;
-
-import java.util.Arrays;
-
-
-/**
- * <p/>
- * Class GeliTextFeature
- * <p/>
- * This is a feature for the Geli text object, which is the text version of the Geli binary genotyping format.
- *
- * @author aaron
- * @deprecated this is deprecated and no longer supported
- */
- at Deprecated
-public class GeliTextFeature implements Feature {
-
- private final String contig; // the contig name
- private final long position; // the position on the contig
- private final char refBase; // the reference base
- private final int depthOfCoverage; // the depth of coverage at this position
- private final int maximumMappingQual; // the maximum mapping quality of a read at this position
- private final DiploidGenotype genotype; // the called genotype
- private final double LODBestToReference; // the LOD score of the best to the reference
- private final double LODBestToNext; // the LOD score of the best to the next best genotype
- private final double likelihoods[]; // the array of all genotype likelihoods, in ordinal order
-
- /**
- * Create a geli text feature, given:
- *
- * @param contig the contig
- * @param position the position on the contig
- * @param refBase the reference base
- * @param depthOfCoverage the depth of coverage at this position
- * @param maximumMappingQual the maximum mapping quality of a read at this position
- * @param genotype the called genotype
- * @param LODBestToReference the LOD score of the best to the reference
- * @param LODBestToNext the LOD score of the best to the next best genotype
- * @param likelihoods the array of all genotype likelihoods, in ordinal ordering
- */
- public GeliTextFeature(String contig,
- long position,
- char refBase,
- int depthOfCoverage,
- int maximumMappingQual,
- DiploidGenotype genotype,
- double LODBestToReference,
- double LODBestToNext,
- double[] likelihoods) {
- this.contig = contig;
- this.position = position;
- this.refBase = refBase;
- this.depthOfCoverage = depthOfCoverage;
- this.maximumMappingQual = maximumMappingQual;
- this.genotype = genotype;
- this.LODBestToReference = LODBestToReference;
- this.LODBestToNext = LODBestToNext;
- this.likelihoods = likelihoods;
- }
-
- @Override
- public String getContig() {
- return this.contig;
- }
-
- /** Return the start position in 1-based coordinates (first base is 1) */
- public int getStart() {
- return (int) this.position;
- }
-
- /**
- * Return the end position following 1-based fully closed conventions. The length of a feature is
- * end - start + 1;
- */
- public int getEnd() {
- return (int) this.position;
- }
-
- public char getRefBase() {
- return refBase;
- }
-
- public int getDepthOfCoverage() {
- return depthOfCoverage;
- }
-
- public int getMaximumMappingQual() {
- return maximumMappingQual;
- }
-
- public DiploidGenotype getGenotype() {
- return genotype;
- }
-
- public double getLODBestToNext() {
- return LODBestToNext;
- }
-
- public double getLODBestToReference() {
- return LODBestToReference;
- }
-
- public double[] getLikelihoods() {
- return likelihoods;
- }
-
- private static double Epsilon = 0.0001;
- public boolean equals(Object o) {
- if (!(o instanceof GeliTextFeature)) return false;
- GeliTextFeature other = (GeliTextFeature)o;
- if (!Arrays.equals(likelihoods,other.likelihoods)) return false;
- if (!contig.equals(other.contig)) return false;
- if (!(position == other.position)) return false;
- if (!(refBase == other.refBase)) return false;
- if (!(depthOfCoverage == other.depthOfCoverage)) return false;
- if (!(maximumMappingQual == other.maximumMappingQual)) return false;
- if (!(genotype == other.genotype)) return false;
- if (!(Math.abs(LODBestToReference - other.LODBestToReference) < Epsilon)) return false;
- if (!(Math.abs(LODBestToNext - other.LODBestToNext) < Epsilon)) return false;
- return true;
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/index/AbstractIndex.java b/src/main/java/htsjdk/tribble/index/AbstractIndex.java
deleted file mode 100644
index 47e31cc..0000000
--- a/src/main/java/htsjdk/tribble/index/AbstractIndex.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p/>
- * An abstract implementation of the index class. This class takes care of the basics that are common
- * to all of the current indexing classes; including the version information, common header properties,
- * and reading and writing the header to disk.
- *
- * @author jrobinso
- */
-public abstract class AbstractIndex implements MutableIndex {
-
- public enum IndexType {
- LINEAR(1),
- INTERVAL_TREE(2);
- public final int fileHeaderTypeIdentifier;
-
- IndexType(int fileHeaderTypeIdentifier) {
- this.fileHeaderTypeIdentifier = fileHeaderTypeIdentifier;
- }
- }
-
- // todo -- up to version 4 and use ETag to detect out of date
- // todo -- inode number + size in bytes + modification time
- // todo -- remove MD5
-
- // the current version of the index
- public static final int VERSION = 3;
- public static final int MAGIC_NUMBER = 1480870228; // byte[]{'T', 'I', 'D', 'X'};
-
-
- private final static String NO_MD5 = "";
- private final static long NO_FILE_SIZE = -1L;
- private final static long NO_TS = -1L;
-
- protected int version; // Our version value
- protected File indexedFile = null; // The file we've created this index for
- protected long indexedFileSize = NO_FILE_SIZE; // The size of the indexed file
- protected long indexedFileTS = NO_TS; // The timestamp
- protected String indexedFileMD5 = NO_MD5; // The MD5 value, generally not filled in (expensive to calc)
- protected int flags;
-
- public boolean hasFileSize() {
- return indexedFileSize != NO_FILE_SIZE;
- }
-
- public boolean hasTimestamp() {
- return indexedFileTS != NO_TS;
- }
-
- public boolean hasMD5() {
- return indexedFileMD5 != NO_MD5;
- }
-
- private LinkedHashMap<String, String> properties;
-
- /**
- * the map of our chromosome bins
- */
- protected LinkedHashMap<String, ChrIndex> chrIndices;
-
- /**
- * Any flags we're using
- */
- private static final int SEQUENCE_DICTIONARY_FLAG = 0x8000; // if we have a sequence dictionary in our header
-
- /**
- * @param obj
- * @return true if this and obj are 'effectively' equivalent data structures.
- */
- public boolean equalsIgnoreProperties(final Object obj) {
- if (this == obj) return true;
- if (!(obj instanceof AbstractIndex)) {
- System.err.printf("equals: %s not instance of AbstractIndex", obj);
- return false;
- }
-
- final AbstractIndex other = (AbstractIndex) obj;
-
- if (version != other.version) {
- System.err.printf("equals version: this %d != other %d%n", version, other.version);
- return false;
- }
-
- if (indexedFile != other.indexedFile && (indexedFile == null || !indexedFile.equals(other.indexedFile))) {
- System.err.printf("equals indexedFile: this %s != other %s%n", indexedFile, other.indexedFile);
- return false;
- }
-
- if (indexedFileSize != other.indexedFileSize) {
- System.err.printf("equals indexedFileSize: this %d != other %d%n", indexedFileSize, other.indexedFileSize);
- return false;
- }
-
- if (!indexedFileMD5.equals(other.indexedFileMD5)) {
- System.err.printf("equals indexedFileMD5: this %s != other %s%n", indexedFileMD5, other.indexedFileMD5);
- return false;
- }
-
- if (flags != other.flags) {
- System.err.printf("equals flags: this %d != other %d%n", flags, other.flags);
- return false;
- }
-
- if (!chrIndices.equals(other.chrIndices)) {
- System.err.printf("equals chrIndeces: this %s != other %s%n", chrIndices, other.chrIndices);
- return false;
- }
-
- return true;
- }
-
- /**
- * create an abstract index, with defaults for the version value, and empty properties and chromosome lists
- */
- public AbstractIndex() {
- this.version = VERSION; // <= is overriden when file is read
- this.properties = new LinkedHashMap<String, String>();
- chrIndices = new LinkedHashMap<String, ChrIndex>();
- }
-
- /**
- * create an index file from the target feature file
- *
- * @param featureFile the feature file to create an index from
- */
- public AbstractIndex(final String featureFile) {
- this(new File(featureFile));
- }
-
- public AbstractIndex(final File featureFile) {
- this();
- this.indexedFile = featureFile;
- }
-
- public AbstractIndex(final AbstractIndex parent) {
- this();
- this.version = parent.version;
- this.indexedFile = parent.indexedFile;
- this.indexedFileSize = parent.indexedFileSize;
- this.indexedFileTS = parent.indexedFileTS;
- this.indexedFileMD5 = parent.indexedFileMD5;
- this.flags = parent.flags;
- this.properties = (LinkedHashMap<String, String>) parent.properties.clone();
- }
-
- protected void validateIndexHeader(final int indexType, final LittleEndianInputStream dis) throws IOException {
- final int magicNumber = dis.readInt();
- if (magicNumber != MAGIC_NUMBER) {
- throw new TribbleException(String.format("Unexpected magic number %d", magicNumber));
- }
- final int type = dis.readInt();
- if (type != indexType) {
- throw new TribbleException(String.format("Unexpected index type %d", type));
- }
-
- }
-
- /**
- * check the current version against the version we read in
- *
- * @return true if we're up to date, false otherwise
- */
- public boolean isCurrentVersion() {
- return version == VERSION;
- }
-
- public File getIndexedFile() {
- return indexedFile;
- }
-
- public long getIndexedFileSize() {
- return indexedFileSize;
- }
-
- public long getIndexedFileTS() {
- return indexedFileTS;
- }
-
- public String getIndexedFileMD5() {
- return indexedFileMD5;
- }
-
- public int getFlags() {
- return flags;
- }
-
- public int getVersion() {
- return version;
- }
-
- public void setMD5(final String md5) {
- this.indexedFileMD5 = md5;
- }
-
- public boolean containsChromosome(final String chr) {
- return chrIndices.containsKey(chr);
- }
-
- public void finalizeIndex() {
- // these two functions must be called now because the file may be being written during on the fly indexing
- if (indexedFile != null) {
- this.indexedFileSize = indexedFile.length();
- this.indexedFileTS = indexedFile.lastModified();
- }
- }
-
- /**
- * write the header to the target output stream
- *
- * @param dos the little endian output stream
- * @throws IOException an exception when we can't write to the file
- */
- private void writeHeader(final LittleEndianOutputStream dos) throws IOException {
- dos.writeInt(MAGIC_NUMBER);
- dos.writeInt(getType());
- dos.writeInt(version);
- dos.writeString(indexedFile.getAbsolutePath());
- dos.writeLong(indexedFileSize);
- dos.writeLong(indexedFileTS);
- dos.writeString(indexedFileMD5);
- dos.writeInt(flags);
-
- // Properties (Version 3 and later)
- dos.writeInt(properties.size());
- for (final Map.Entry<String, String> prop : properties.entrySet()) {
- dos.writeString(prop.getKey());
- dos.writeString(prop.getValue());
- }
- }
-
- /**
- * read the header from the input stream
- *
- * @param dis the little endian input stream
- * @throws IOException if we fail to read from the file at any point
- */
- private void readHeader(final LittleEndianInputStream dis) throws IOException {
-
- version = dis.readInt();
- indexedFile = new File(dis.readString());
- indexedFileSize = dis.readLong();
- indexedFileTS = dis.readLong();
- indexedFileMD5 = dis.readString();
- flags = dis.readInt();
- if (version < 3 && (flags & SEQUENCE_DICTIONARY_FLAG) == SEQUENCE_DICTIONARY_FLAG) {
- readSequenceDictionary(dis);
- }
-
- if (version >= 3) {
- int nProperties = dis.readInt();
- while (nProperties-- > 0) {
- final String key = dis.readString();
- final String value = dis.readString();
- properties.put(key, value);
- }
- }
- }
-
- /**
- * Kept to maintain backward compatibility with pre version 3 indexes. The sequence dictionary is no longer
- * used, use getSequenceNames() instead.
- *
- * @param dis
- * @throws IOException
- */
- private void readSequenceDictionary(final LittleEndianInputStream dis) throws IOException {
- final int size = dis.readInt();
- if (size < 0) throw new IllegalStateException("Size of the sequence dictionary entries is negative");
- for (int x = 0; x < size; x++) {
- dis.readString();
- dis.readInt();
- }
- }
-
- public List<String> getSequenceNames() {
- return new ArrayList<String>(chrIndices.keySet());
- }
-
- public List<Block> getBlocks(final String chr, final int start, final int end) {
- return getChrIndex(chr).getBlocks(start, end);
- }
-
- public List<Block> getBlocks(final String chr) {
- return getChrIndex(chr).getBlocks();
- }
-
- /**
- * @param chr
- * @return return the ChrIndex associated with chr,
- * @throws IllegalArgumentException if {@code chr} not found
- */
- private final ChrIndex getChrIndex(final String chr) {
- final ChrIndex chrIdx = chrIndices.get(chr);
- if (chrIdx == null) {
- throw new IllegalArgumentException("getBlocks() called with of unknown contig " + chr);
- } else {
- return chrIdx;
- }
- }
-
- public void write(final LittleEndianOutputStream stream) throws IOException {
- writeHeader(stream);
-
- //# of chromosomes
- stream.writeInt(chrIndices.size());
- for (final ChrIndex chrIdx : chrIndices.values()) {
- chrIdx.write(stream);
- }
- }
-
- @Override
- public void write(final File idxFile) throws IOException {
- try(final LittleEndianOutputStream idxStream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(idxFile)))) {
- write(idxStream);
- }
- }
-
- @Override
- public void writeBasedOnFeatureFile(final File featureFile) throws IOException {
- if (!featureFile.isFile()) return;
- write(Tribble.indexFile(featureFile));
- }
-
- public void read(final LittleEndianInputStream dis) throws IOException {
- try {
- readHeader(dis);
-
- int nChromosomes = dis.readInt();
- chrIndices = new LinkedHashMap<String, ChrIndex>(nChromosomes);
-
- while (nChromosomes-- > 0) {
- final ChrIndex chrIdx = (ChrIndex) getChrIndexClass().newInstance();
- chrIdx.read(dis);
- chrIndices.put(chrIdx.getName(), chrIdx);
- }
-
- } catch (final InstantiationException e) {
- throw new TribbleException.UnableToCreateCorrectIndexType("Unable to create class " + getChrIndexClass(), e);
- } catch (final IllegalAccessException e) {
- throw new TribbleException.UnableToCreateCorrectIndexType("Unable to create class " + getChrIndexClass(), e);
- } finally {
- dis.close();
- }
-
- //printIndexInfo();
- }
-
- protected void printIndexInfo() {
- System.out.println(String.format("Index for %s with %d indices", indexedFile, chrIndices.size()));
- final BlockStats stats = getBlockStats(true);
- System.out.println(String.format(" total blocks %d", stats.total));
- System.out.println(String.format(" total empty blocks %d", stats.empty));
- }
-
- protected static class BlockStats {
- long total = 0, empty = 0, objects = 0, size = 0;
- }
-
- protected BlockStats getBlockStats(final boolean logDetails) {
- final BlockStats stats = new BlockStats();
- for (final Map.Entry<String, ChrIndex> elt : chrIndices.entrySet()) {
- final List<Block> blocks = elt.getValue().getBlocks();
-
- if (blocks != null) {
- final int nBlocks = blocks.size();
-
- int nEmptyBlocks = 0;
- for (final Block b : elt.getValue().getBlocks()) {
- if (b.getSize() == 0) nEmptyBlocks++;
- }
- stats.empty += nEmptyBlocks;
- stats.total += nBlocks;
-
- if (logDetails)
- System.out.println(String.format(" %s => %d blocks, %d empty, %.2f", elt.getKey(), nBlocks, nEmptyBlocks, (100.0 * nEmptyBlocks) / nBlocks));
- }
- }
-
- return stats;
- }
-
- protected String statsSummary() {
- final BlockStats stats = getBlockStats(false);
- return String.format("%12d blocks (%12d empty (%.2f%%))", stats.total, stats.empty, (100.0 * stats.empty) / stats.total);
- }
-
- public void addProperty(final String key, final String value) {
- properties.put(key, value);
- }
-
- public void addProperties(final Map<String, String> properties) {
- this.properties.putAll(properties);
- }
-
- /**
- * return a mapping of name to property value
- *
- * @return the mapping of values as an unmodifiable map
- */
- public Map<String, String> getProperties() {
- return Collections.unmodifiableMap(properties);
- }
-
- /**
- * get the index type
- *
- * @return The index type
- */
- protected abstract int getType();
-
- /**
- * returns the class for the index type
- *
- * @return a Class, from which a new instance can be created
- */
- public abstract Class getChrIndexClass();
-}
diff --git a/src/main/java/htsjdk/tribble/index/Block.java b/src/main/java/htsjdk/tribble/index/Block.java
deleted file mode 100644
index 15ac799..0000000
--- a/src/main/java/htsjdk/tribble/index/Block.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-/**
- * Represents a contiguous block of bytes in a file, defined by a start position and size (in bytes)
-*/
-public class Block {
-
- private final long startPosition;
- private long size;
-
- /**
- * @param startPosition in bytes
- * @param size in bytes
- */
- public Block(final long startPosition, final long size) {
- this.startPosition = startPosition;
- this.size = size;
- }
-
- /**
- * @return the startPosition
- */
- public long getStartPosition() {
- return startPosition;
- }
-
- public long getEndPosition() {
- return startPosition + size;
- }
-
- /**
- * This method is used to aid in consolidating blocks.
- * Sets the size based on the provided {@code endPosition}
- * @param endPosition Where the block ends, in bytes
- */
- public void setEndPosition(final long endPosition) {
- if(endPosition < startPosition)
- throw new IllegalArgumentException("Attempting to set block end position to " +
- endPosition + " which is before the start of " + startPosition);
- size = endPosition - startPosition;
-
- }
-
- /**
- * @return the # of bytes in this block. Note that for block-compressed files, this is not truly the
- * size of the block in the file. getEndPosition should be used to determine the virtual file offset
- * of the end of the region of interest.
- */
- public long getSize() {
- return size;
- }
-
- public boolean equals(final Object obj) {
- if ( this == obj ) return true;
- if ( ! (obj instanceof Block) ) return false;
- final Block otherBlock = (Block)obj;
- return this.startPosition == otherBlock.startPosition && this.size == otherBlock.size;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/ChrIndex.java b/src/main/java/htsjdk/tribble/index/ChrIndex.java
deleted file mode 100644
index b1582ea..0000000
--- a/src/main/java/htsjdk/tribble/index/ChrIndex.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Represents an index on a specific chromosome
- */
-
-public interface ChrIndex {
-
- public String getName();
-
- /**
- * @return all blocks in ChrIndex
- */
- List<Block> getBlocks();
-
- /**
- * @param start the start position, one based
- * @param end the end position, one based
- * @return a list of blocks that include the region defined from start to stop. Can never return null
- */
- List<Block> getBlocks(int start, int end);
-
- void write(LittleEndianOutputStream dos) throws IOException;
-
- void read(LittleEndianInputStream dis) throws IOException;
-}
diff --git a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java b/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java
deleted file mode 100644
index 52153a5..0000000
--- a/src/main/java/htsjdk/tribble/index/DynamicIndexCreator.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.interval.IntervalIndexCreator;
-import htsjdk.tribble.index.linear.LinearIndexCreator;
-import htsjdk.tribble.util.MathUtils;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-
-/**
- * A DynamicIndexCreator creates the proper index based on an {@link IndexFactory.IndexBalanceApproach} and
- * the characteristics of the file. Ultimately this is either a LinearIndex or an IntervalTreeIndex, with index
- * parameters based on whether seek time or file size is to be minimized.
- */
-public class DynamicIndexCreator extends TribbleIndexCreator {
- IndexFactory.IndexBalanceApproach iba;
- Map<IndexFactory.IndexType,TribbleIndexCreator> creators;
-
- /**
- * we're interested in two stats:
- * the longest feature and the density of features
- */
- int longestFeatureLength = 0;
- long featureCount = 0;
-
- MathUtils.RunningStat stats = new MathUtils.RunningStat();
- long basesSeen = 0;
- Feature lastFeature = null;
- File inputFile;
-
- public DynamicIndexCreator(final File inputFile, final IndexFactory.IndexBalanceApproach iba) {
- this.iba = iba;
- // get a list of index creators
- this.inputFile = inputFile;
- creators = getIndexCreators(inputFile,iba);
- }
-
- public Index finalizeIndex(final long finalFilePosition) {
- // finalize all of the indexes
- // return the score of the indexes we've generated
- final Map<Double,TribbleIndexCreator> mapping = scoreIndexes((double)featureCount/(double)basesSeen, creators, longestFeatureLength, iba);
- final TribbleIndexCreator creator = getMinIndex(mapping, this.iba);
-
- for (final Map.Entry<String, String> entry : properties.entrySet()) {
- creator.addProperty(entry.getKey(), entry.getValue());
- }
-
- // add our statistics to the file
- creator.addProperty("FEATURE_LENGTH_MEAN",String.valueOf(stats.mean()));
- creator.addProperty("FEATURE_LENGTH_STD_DEV",String.valueOf(stats.standardDeviation()));
- creator.addProperty("MEAN_FEATURE_VARIANCE",String.valueOf(stats.variance()));
-
- // add the feature count
- creator.addProperty("FEATURE_COUNT",String.valueOf(featureCount));
-
- // Now let's finalize and create the index itself
- return creator.finalizeIndex(finalFilePosition);
- }
-
- /**
- * create a list of index creators (initialized) representing the common index types we'd suspect they'd like to use
- * @param inputFile the input file to use to create the indexes
- * @return a map of index type to the best index for that balancing approach
- */
- private Map<IndexFactory.IndexType,TribbleIndexCreator> getIndexCreators(final File inputFile, final IndexFactory.IndexBalanceApproach iba) {
- final Map<IndexFactory.IndexType,TribbleIndexCreator> creators = new HashMap<IndexFactory.IndexType,TribbleIndexCreator>();
-
- if (iba == IndexFactory.IndexBalanceApproach.FOR_SIZE) {
- // add a linear index with the default bin size
- final LinearIndexCreator linearNormal = new LinearIndexCreator(inputFile, LinearIndexCreator.DEFAULT_BIN_WIDTH);
- creators.put(IndexFactory.IndexType.LINEAR,linearNormal);
-
- // create a tree index with the default size
- final IntervalIndexCreator treeNormal = new IntervalIndexCreator(inputFile, IntervalIndexCreator.DEFAULT_FEATURE_COUNT);
- creators.put(IndexFactory.IndexType.INTERVAL_TREE,treeNormal);
- }
-
- // this section is a little more arbitrary; we're creating indexes with a bin size that's a portion of the default; these
- // values were determined experimentally
- if (iba == IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME) {
- // create a linear index with a small bin size
- final LinearIndexCreator linearSmallBin =
- new LinearIndexCreator(inputFile, Math.max(200, LinearIndexCreator.DEFAULT_BIN_WIDTH / 4));
- creators.put(IndexFactory.IndexType.LINEAR,linearSmallBin);
-
- // create a tree index with a small index size
- final IntervalIndexCreator treeSmallBin =
- new IntervalIndexCreator(inputFile, Math.max(20, IntervalIndexCreator.DEFAULT_FEATURE_COUNT / 8));
- creators.put(IndexFactory.IndexType.INTERVAL_TREE,treeSmallBin);
- }
-
- return creators;
- }
-
-
- public void addFeature(final Feature f, final long filePosition) {
- // protected static Map<Double,Index> createIndex(FileBasedFeatureIterator<Feature> iterator, Map<IndexType,IndexCreator> creators, IndexBalanceApproach iba) {
- // feed each feature to the indexes we've created
- // first take care of the stats
- featureCount++;
-
- // calculate the number of bases seen - we have to watch out for the situation where the last record was on the previous chromosome
- basesSeen = (lastFeature == null) ? basesSeen + f.getStart() :
- ((f.getStart() - lastFeature.getStart() >= 0) ? basesSeen + (f.getStart() - lastFeature.getStart()) : basesSeen + f.getStart());
-
- longestFeatureLength = Math.max(longestFeatureLength,(f.getEnd()-f.getStart()) + 1);
-
- // push the longest feature to the running stats
- stats.push(longestFeatureLength);
-
- // now feed the feature to each of our creators
- for (final IndexCreator creator : creators.values()) {
- creator.addFeature(f,filePosition);
- }
-
- //Redundant check, done in IndexFactory
- // if the last feature is after the current feature, exception out
-// if (lastFeature != null && f.getStart() < lastFeature.getStart() && lastFeature.getChr().equals(f.getChr()))
-// throw new TribbleException.MalformedFeatureFile("We saw a record with a start of " + f.getChr() + ":" + f.getStart() +
-// " after a record with a start of " + lastFeature.getChr() + ":" + lastFeature.getStart(), inputFile.getAbsolutePath());
-
- // save the last feature
- lastFeature = f;
- }
-
- /**
- * score the available indexes for the specified density and feature lengths
- *
- * The scoring method is trying to determine how many features would be returned for a sample one base query; or:
- * (features/seek). For the interval index this is clear: it's the bin size (interval is binned by feature count).
- * for Linear indexes it's the density of features X the number of bins we need to retrieve (which is determined
- * by the bin size X the longest feature).
- *
- * @param densityOfFeatures the density of features (features/base)
- * @param indexes Map from IndexType -> IndexCreator
- * @param longestFeature the longest feature we've found
- * @param iba the index balancing approach
- * @return the best index available for the target indexes
- */
- protected static LinkedHashMap<Double,TribbleIndexCreator> scoreIndexes(final double densityOfFeatures, final Map<IndexFactory.IndexType,TribbleIndexCreator> indexes, final int longestFeature, final IndexFactory.IndexBalanceApproach iba) {
- if (indexes.size() < 1) throw new IllegalArgumentException("Please specify at least one index to evaluate");
-
- final LinkedHashMap<Double,TribbleIndexCreator> scores = new LinkedHashMap<Double,TribbleIndexCreator>();
-
- for (final Map.Entry<IndexFactory.IndexType,TribbleIndexCreator> entry : indexes.entrySet()) {
- // we have different scoring
- if (entry.getValue() instanceof LinearIndexCreator) {
- final double binSize = ((LinearIndexCreator)(entry.getValue())).getBinSize();
- scores.put(binSize * densityOfFeatures * Math.ceil((double) longestFeature / binSize), entry.getValue());
- } else if (entry.getValue() instanceof IntervalIndexCreator) {
- scores.put((double) ((IntervalIndexCreator)entry.getValue()).getFeaturesPerInterval(), entry.getValue());
- } else {
- throw new TribbleException.UnableToCreateCorrectIndexType("Unknown index type, we don't have a scoring method for " + entry.getValue().getClass());
- }
- }
- return scores;
- }
-
- /**
- * utility function to find the min of a list
- * @param scores the list of scaled features/bin scores for each index type
- * @return the best score <b>index value</b>
- */
- private TribbleIndexCreator getMinIndex(final Map<Double,TribbleIndexCreator> scores, final IndexFactory.IndexBalanceApproach iba) {
- final TreeMap<Double,TribbleIndexCreator> map = new TreeMap<Double,TribbleIndexCreator>();
- map.putAll(scores);
-
- // if we are optimizing for seek time, choose the lowest score (adjusted features/bin value), if for storage size, choose the opposite
- final TribbleIndexCreator idx = (iba != IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME) ? map.get(map.lastKey()) : map.get(map.firstKey());
- return idx;
- }
-
- @Override
- public void addProperty(final String key, final String value) {
- for (final TribbleIndexCreator creator : creators.values()) {
- creator.addProperty(key, value);
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/Index.java b/src/main/java/htsjdk/tribble/index/Index.java
deleted file mode 100644
index ca6cc60..0000000
--- a/src/main/java/htsjdk/tribble/index/Index.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Interface for all index implementations.
- * An index file is used for efficient lookup of features from a feature file;
- * and Index represents that index file.
- */
-public interface Index {
- /**
- * Query the index.
- * @param chr the chromosome
- * @param start the start position
- * @param end the end position
- * @return a list of blocks that contain the specified interval. Can never return null
- * @throws IllegalArgumentException of chr isn't part of this index
- */
- List<Block> getBlocks(String chr, int start, int end);
-
- /**
- * @return true if the index is up to date, false otherwise
- */
- public boolean isCurrentVersion();
-
- /**
- * @return a list of the sequence names we've seen during indexing, in order
- */
- List<String> getSequenceNames();
-
- /**
- * @param chr the chromosome (or contig) name
- * @return true if we have an entry; false otherwise
- */
- public boolean containsChromosome(final String chr);
-
- /**
- * all indexes are writable to disk
- * @param stream the stream to write the index to. Caller must close after invocation.
- * @throws IOException if the index is unable to write to the specified location
- */
- public void write(LittleEndianOutputStream stream) throws IOException;
-
- /**
- * Writes the index into a file.
- *
- * @param idxFile Where to write the index.
- * @throws IOException if the index is unable to write to the specified file
- */
- public void write(final File idxFile) throws IOException;
-
- /**
- * Write an appropriately named and located Index file based on the name and location of the featureFile.
- * If featureFile is not a normal file, the index will silently not be written.
- * @param featureFile
- */
- public void writeBasedOnFeatureFile(File featureFile) throws IOException;
-
- /**
- * @return get the list of properties for this index. Returns null if no properties.
- */
- public Map<String,String> getProperties();
-
- /**
- * Returns true if this and obj are 'effectively' equivalent indices. Ignores the
- * time stamp on the file, as this may not be the same for even identical indices
- * @param obj
- * @return
- */
- public boolean equalsIgnoreProperties(Object obj);
-}
diff --git a/src/main/java/htsjdk/tribble/index/IndexCreator.java b/src/main/java/htsjdk/tribble/index/IndexCreator.java
deleted file mode 100644
index c90ec9f..0000000
--- a/src/main/java/htsjdk/tribble/index/IndexCreator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.Feature;
-
-/**
- *
- * An interface for creating indexes
- *
- * @author jrobinso
- */
-public interface IndexCreator {
- /**
- * Add a feature to the index
- * @param feature the feature, of which start, end, and contig must be filled in
- * @param filePosition the current file position, at the beginning of the specified feature
- */
- public void addFeature(Feature feature, long filePosition);
-
- /**
- * Create the index, given the stream of features passed in to this point
- * @param finalFilePosition the final file position, for indexes that have to close out with the final position
- * @return an index object
- */
- public Index finalizeIndex(long finalFilePosition);
-
- /**
- * Set the sequence dictionary for the index. Default implementation does nothing.
- * @param dict the dictionary to add to the index.
- */
- public default void setIndexSequenceDictionary(final SAMSequenceDictionary dict) { }
-}
-
-
diff --git a/src/main/java/htsjdk/tribble/index/IndexFactory.java b/src/main/java/htsjdk/tribble/index/IndexFactory.java
deleted file mode 100644
index 4e23e93..0000000
--- a/src/main/java/htsjdk/tribble/index/IndexFactory.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedStreamConstants;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.*;
-import htsjdk.tribble.index.interval.IntervalIndexCreator;
-import htsjdk.tribble.index.interval.IntervalTreeIndex;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.linear.LinearIndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-import htsjdk.tribble.readers.PositionalBufferedStream;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.zip.GZIPInputStream;
-
-/**
- * Factory class for creating indexes. It is the responsibility of this class to determine and create the
- * correct index type from the input file or stream. Only LinearIndex and IntervalTreeIndex are supported
- * by this factory.
- */
-public class IndexFactory {
- /** We can optimize index-file-creation for different factors. As of this writing, those are index-file size or seeking time. */
- public enum IndexBalanceApproach {
- FOR_SIZE,
- FOR_SEEK_TIME
- }
-
- /**
- * an enum that contains all of the information about the index types, and how to create them
- */
- public enum IndexType {
- LINEAR(LinearIndex.MAGIC_NUMBER, LinearIndex.INDEX_TYPE, LinearIndexCreator.class, LinearIndex.class, LinearIndexCreator.DEFAULT_BIN_WIDTH),
- INTERVAL_TREE(IntervalTreeIndex.MAGIC_NUMBER, IntervalTreeIndex.INDEX_TYPE, IntervalIndexCreator.class, IntervalTreeIndex.class, IntervalIndexCreator.DEFAULT_FEATURE_COUNT),
- // Tabix index initialization requires additional information, so generic construction won't work, thus indexCreatorClass is null.
- TABIX(TabixIndex.MAGIC_NUMBER, null, null, TabixIndex.class, -1);
-
- private final int magicNumber;
- private final Integer tribbleIndexType;
- private final Class<IndexCreator> indexCreatorClass;
- private final int defaultBinSize;
- private final Class<Index> indexType;
-
- public int getDefaultBinSize() {
- return defaultBinSize;
- }
-
- public IndexCreator getIndexCreator() {
- try {
- return indexCreatorClass.newInstance();
- } catch ( final InstantiationException e ) {
- throw new TribbleException("Couldn't make index creator in " + this, e);
- } catch ( final IllegalAccessException e ) {
- throw new TribbleException("Couldn't make index creator in " + this, e);
- }
- }
-
- public boolean canCreate() {
- return indexCreatorClass != null;
- }
-
- IndexType(final int magicNumber, final Integer tribbleIndexType, final Class creator, final Class indexClass, final int defaultBinSize) {
- this.magicNumber = magicNumber;
- this.tribbleIndexType = tribbleIndexType;
- indexCreatorClass = creator;
- indexType = indexClass;
- this.defaultBinSize = defaultBinSize;
- }
-
- public Integer getTribbleIndexType() {
- return tribbleIndexType;
- }
-
- public Class<Index> getIndexType() {
- return indexType;
- }
-
- public int getMagicNumber() { return magicNumber; }
-
- /**
- *
- * @param is InputStream of index. This will be reset to location it was at when method was invoked.
- * @return The {@code IndexType} based on the {@code headerValue}
- * @throws TribbleException.UnableToCreateCorrectIndexType
- */
- public static IndexType getIndexType(final BufferedInputStream is) {
- // Currently only need 8 bytes, so this should be plenty
- is.mark(128);
- final LittleEndianInputStream dis = new LittleEndianInputStream(is);
- final int magicNumber;
- final int type;
-
- try {
- // Read the type and version, then create the appropriate type
- magicNumber = dis.readInt();
- // This is not appropriate for all types, but it doesn't hurt to read it.
- type = dis.readInt();
- is.reset();
-
- for (final IndexType indexType : IndexType.values()) {
- if (indexType.magicNumber == magicNumber &&
- (indexType.tribbleIndexType == null || indexType.tribbleIndexType == type)) {
- return indexType;
- }
- }
- } catch (final IOException e) {
- throw new TribbleException("Problem detecting index type", e);
- }
-
- throw new TribbleException.UnableToCreateCorrectIndexType(
- String.format("Unknown index type. magic number: 0x%x; type %d", magicNumber, type));
- }
- }
-
-
- /**
- * Load in index from the specified file. The type of index (LinearIndex or IntervalTreeIndex) is determined
- * at run time by reading the type flag in the file.
- *
- * @param indexFile from which to load the index
- */
- public static Index loadIndex(final String indexFile) {
- // Must be buffered, because getIndexType uses mark and reset
- try (BufferedInputStream bufferedInputStream = new BufferedInputStream(indexFileInputStream(indexFile), Defaults.NON_ZERO_BUFFER_SIZE)){
- final Class<Index> indexClass = IndexType.getIndexType(bufferedInputStream).getIndexType();
- final Constructor<Index> ctor = indexClass.getConstructor(InputStream.class);
- return ctor.newInstance(bufferedInputStream);
- } catch (final IOException ex) {
- throw new TribbleException.UnableToReadIndexFile("Unable to read index file", indexFile, ex);
- } catch (final Exception ex) {
- throw new RuntimeException(ex);
- }
- }
-
- private static InputStream indexFileInputStream(final String indexFile) throws IOException {
- final InputStream inputStreamInitial = ParsingUtils.openInputStream(indexFile);
- if (indexFile.endsWith(".gz")) {
- return new GZIPInputStream(inputStreamInitial);
- }
- else if (indexFile.endsWith(TabixUtils.STANDARD_INDEX_EXTENSION)) {
- return new BlockCompressedInputStream(inputStreamInitial);
- }
- else {
- return inputStreamInitial;
- }
- }
-
- /**
- * a helper method for creating a linear binned index with default bin size
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- */
- public static LinearIndex createLinearIndex(final File inputFile, final FeatureCodec codec) {
- return createLinearIndex(inputFile, codec, LinearIndexCreator.DEFAULT_BIN_WIDTH);
- }
-
- /**
- * a helper method for creating a linear binned index
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- * @param binSize the bin size
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> LinearIndex createLinearIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final int binSize) {
- final LinearIndexCreator indexCreator = new LinearIndexCreator(inputFile, binSize);
- return (LinearIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
- }
-
- /**
- * create an interval-tree index with the default features per bin count
- *
- * @param inputFile the file containing the features
- * @param codec to decode the features
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> IntervalTreeIndex createIntervalIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec) {
- return createIntervalIndex(inputFile, codec, IntervalIndexCreator.DEFAULT_FEATURE_COUNT);
- }
-
-
- /**
- * a helper method for creating an interval-tree index
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- * @param featuresPerInterval
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> IntervalTreeIndex createIntervalIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final int featuresPerInterval) {
- final IntervalIndexCreator indexCreator = new IntervalIndexCreator(inputFile, featuresPerInterval);
- return (IntervalTreeIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
- }
-
- /**
- * Create a dynamic index with the default balancing approach
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createDynamicIndex(final File inputFile, final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec) {
- return createDynamicIndex(inputFile, codec, IndexBalanceApproach.FOR_SEEK_TIME);
- }
-
- /**
- * Create a index of the specified type with default binning parameters
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- * @param type the type of index to create
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final IndexType type) {
- return createIndex(inputFile, codec, type, null);
- }
-
- /**
- * Create an index of the specified type with default binning parameters
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- * @param type the type of index to create
- * @param sequenceDictionary May be null, but if present may reduce memory footprint for tabix index creation
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final IndexType type,
- final SAMSequenceDictionary sequenceDictionary) {
- switch (type) {
- case INTERVAL_TREE: return createIntervalIndex(inputFile, codec);
- case LINEAR: return createLinearIndex(inputFile, codec);
- case TABIX: return createTabixIndex(inputFile, codec, sequenceDictionary);
- }
- throw new IllegalArgumentException("Unrecognized IndexType " + type);
- }
-
- /**
- * Write the index to a file; little endian.
- * @param idx
- * @param idxFile
- * @throws IOException
- * @deprecated use {@link Index#write(File)} instead
- */
- @Deprecated
- public static void writeIndex(final Index idx, final File idxFile) throws IOException {
- idx.write(idxFile);
- }
-
- /**
- * create a dynamic index, given an input file, codec, and balance approach
- *
- * @param inputFile the input file to load features from
- * @param codec the codec to use for decoding records
- * @param iba the index balancing approach
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> Index createDynamicIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final IndexBalanceApproach iba) {
- // get a list of index creators
- final DynamicIndexCreator indexCreator = new DynamicIndexCreator(inputFile, iba);
- return createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
- }
-
- /**
- * @param inputFile The file to be indexed.
- * @param codec Mechanism for reading inputFile.
- * @param tabixFormat Header fields for TabixIndex to be produced.
- * @param sequenceDictionary May be null, but if present may reduce memory footprint for index creation. Features
- * in inputFile must be in the order defined by sequenceDictionary, if it is present.
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> TabixIndex createTabixIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final TabixFormat tabixFormat,
- final SAMSequenceDictionary sequenceDictionary) {
- final TabixIndexCreator indexCreator = new TabixIndexCreator(sequenceDictionary, tabixFormat);
- return (TabixIndex)createIndex(inputFile, new FeatureIterator<FEATURE_TYPE, SOURCE_TYPE>(inputFile, codec), indexCreator);
- }
-
- /**
- * @param inputFile The file to be indexed.
- * @param codec the codec to use for decoding records
- * @param sequenceDictionary May be null, but if present may reduce memory footprint for index creation. Features
- * in inputFile must be in the order defined by sequenceDictionary, if it is present.
- *
- */
- public static <FEATURE_TYPE extends Feature, SOURCE_TYPE> TabixIndex createTabixIndex(final File inputFile,
- final FeatureCodec<FEATURE_TYPE, SOURCE_TYPE> codec,
- final SAMSequenceDictionary sequenceDictionary) {
- return createTabixIndex(inputFile, codec, codec.getTabixFormat(), sequenceDictionary);
- }
-
- private static Index createIndex(final File inputFile, final FeatureIterator iterator, final IndexCreator creator) {
- Feature lastFeature = null;
- Feature currentFeature;
- final Map<String, Feature> visitedChromos = new HashMap<String, Feature>(40);
- while (iterator.hasNext()) {
- final long position = iterator.getPosition();
- currentFeature = iterator.next();
-
- checkSorted(inputFile, lastFeature, currentFeature);
- //should only visit chromosomes once
- final String curChr = currentFeature.getContig();
- final String lastChr = lastFeature != null ? lastFeature.getContig() : null;
- if(!curChr.equals(lastChr)){
- if(visitedChromos.containsKey(curChr)){
- String msg = "Input file must have contiguous chromosomes.";
- msg += " Saw feature " + featToString(visitedChromos.get(curChr));
- msg += " followed later by " + featToString(lastFeature);
- msg += " and then " + featToString(currentFeature);
- throw new TribbleException.MalformedFeatureFile(msg, inputFile.getAbsolutePath());
- }else{
- visitedChromos.put(curChr, currentFeature);
- }
- }
-
- creator.addFeature(currentFeature, position);
-
- lastFeature = currentFeature;
- }
-
- iterator.close();
- return creator.finalizeIndex(iterator.getPosition());
- }
-
- private static String featToString(final Feature feature){
- return feature.getContig() + ":" + feature.getStart() + "-" + feature.getEnd();
- }
-
- private static void checkSorted(final File inputFile, final Feature lastFeature, final Feature currentFeature){
- // if the last currentFeature is after the current currentFeature, exception out
- if (lastFeature != null && currentFeature.getStart() < lastFeature.getStart() && lastFeature.getContig().equals(currentFeature.getContig()))
- throw new TribbleException.MalformedFeatureFile("Input file is not sorted by start position. \n" +
- "We saw a record with a start of " + currentFeature.getContig() + ":" + currentFeature.getStart() +
- " after a record with a start of " + lastFeature.getContig() + ":" + lastFeature.getStart(), inputFile.getAbsolutePath());
- }
-
-
- /**
- * Iterator for reading features from a file, given a {@code FeatureCodec}.
- */
- static class FeatureIterator<FEATURE_TYPE extends Feature, SOURCE> implements CloseableTribbleIterator<Feature> {
- // the stream we use to get features
- private final SOURCE source;
- // the next feature
- private Feature nextFeature;
- // our codec
- private final FeatureCodec<FEATURE_TYPE, SOURCE> codec;
- private final File inputFile;
-
- // we also need cache our position
- private long cachedPosition;
-
- /**
- *
- * @param inputFile The file from which to read. Stream for reading is opened on construction.
- * @param codec
- */
- public FeatureIterator(final File inputFile, final FeatureCodec<FEATURE_TYPE, SOURCE> codec) {
- this.codec = codec;
- this.inputFile = inputFile;
- final FeatureCodecHeader header = readHeader();
- source = (SOURCE) codec.makeIndexableSourceFromStream(initStream(inputFile, header.getHeaderEnd()));
- readNextFeature();
- }
-
- /**
- * Some codecs, e.g. VCF files, need the header to decode features. This is a rather poor design,
- * the internal header is set as a side-affect of reading it, but we have to live with it for now.
- */
- private FeatureCodecHeader readHeader() {
- try {
- final SOURCE source = this.codec.makeSourceFromStream(initStream(inputFile, 0));
- final FeatureCodecHeader header = this.codec.readHeader(source);
- codec.close(source);
- return header;
- } catch (final IOException e) {
- throw new TribbleException.InvalidHeader("Error reading header " + e.getMessage());
- }
- }
-
- private PositionalBufferedStream initStream(final File inputFile, final long skip) {
- try {
- final FileInputStream fileStream = new FileInputStream(inputFile);
- final InputStream is;
-
- // if this looks like a block compressed file and it in fact is, we will use it
- // otherwise we will use the file as is
- if (AbstractFeatureReader.hasBlockCompressedExtension(inputFile)) {
- // make a buffered stream to test that this is in fact a valid block compressed file
- final int bufferSize = Math.max(Defaults.BUFFER_SIZE, BlockCompressedStreamConstants.MAX_COMPRESSED_BLOCK_SIZE);
- final BufferedInputStream bufferedStream = new BufferedInputStream(fileStream, bufferSize);
-
- if (!BlockCompressedInputStream.isValidFile(bufferedStream)) {
- throw new TribbleException.MalformedFeatureFile("Input file is not in valid block compressed format.", inputFile.getAbsolutePath());
- }
-
- final ISeekableStreamFactory ssf = SeekableStreamFactory.getInstance();
- // if we got here, the file is valid, make a SeekableStream for the BlockCompressedInputStream to read from
- final SeekableStream seekableStream =
- ssf.getBufferedStream(ssf.getStreamFor(inputFile.getAbsolutePath()));
- is = new BlockCompressedInputStream(seekableStream);
- }
- else {
- is = fileStream;
- }
-
- final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-
- if ( skip > 0 ) pbs.skip(skip);
- return pbs;
- } catch (final FileNotFoundException e) {
- throw new TribbleException.FeatureFileDoesntExist("Unable to open the input file, most likely the file doesn't exist.", inputFile.getAbsolutePath());
- } catch (final IOException e) {
- throw new TribbleException.MalformedFeatureFile("Error initializing stream", inputFile.getAbsolutePath(), e);
- }
- }
-
- public boolean hasNext() {
- return nextFeature != null;
- }
-
- public Feature next() {
- final Feature ret = nextFeature;
- readNextFeature();
- return ret;
- }
-
- /**
- * @throws UnsupportedOperationException
- */
- public void remove() {
- throw new UnsupportedOperationException("We cannot remove");
- }
-
-
- /**
- * @return the file position from the underlying reader
- */
- public long getPosition() {
- return (hasNext()) ? cachedPosition : ((LocationAware) source).getPosition();
- }
-
- @Override
- public Iterator<Feature> iterator() {
- return this;
- }
-
- @Override
- public void close() {
- codec.close(source);
- }
-
- /**
- * Read the next feature from the stream
- * @throws TribbleException.MalformedFeatureFile
- */
- private void readNextFeature() {
- cachedPosition = ((LocationAware) source).getPosition();
- try {
- nextFeature = null;
- while (nextFeature == null && !codec.isDone(source)) {
- nextFeature = codec.decodeLoc(source);
- }
- } catch (final IOException e) {
- throw new TribbleException.MalformedFeatureFile("Unable to read a line from the file", inputFile.getAbsolutePath(), e);
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/MutableIndex.java b/src/main/java/htsjdk/tribble/index/MutableIndex.java
deleted file mode 100644
index 425b996..0000000
--- a/src/main/java/htsjdk/tribble/index/MutableIndex.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import java.util.Map;
-
-/**
- * Some Index implementations can be modified in memory. Also, properties do not make sense for all index types.
- * Only the relevant index implementations implement this interface.
- */
-public interface MutableIndex extends Index {
- void addProperty(String key, String value);
-
- void addProperties(Map<String, String> properties);
-}
diff --git a/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java b/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java
deleted file mode 100644
index f7385e8..0000000
--- a/src/main/java/htsjdk/tribble/index/TribbleIndexCreator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-import java.util.LinkedHashMap;
-
-/**
- * Base class for Tribble-specific index creators.
- */
-public abstract class TribbleIndexCreator implements IndexCreator {
- // a constant we use for marking sequence dictionary entries in the Tribble index property list
- private static final String SEQUENCE_DICTIONARY_PROPERTY_PREDICATE = "DICT:";
-
- protected LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>();
-
- public void addProperty(final String key, final String value) {
- properties.put(key, value);
- }
-
- /** Set the sequence dictionary entries for the index property list. */
- @Override
- public void setIndexSequenceDictionary(final SAMSequenceDictionary dict) {
- for (final SAMSequenceRecord seq : dict.getSequences()) {
- final String contig = SEQUENCE_DICTIONARY_PROPERTY_PREDICATE + seq.getSequenceName();
- final String length = String.valueOf(seq.getSequenceLength());
- addProperty(contig,length);
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/interval/Interval.java b/src/main/java/htsjdk/tribble/index/interval/Interval.java
deleted file mode 100644
index 9d47877..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/Interval.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.index.Block;
-
-
-/**
- * Quick and dirty interval class
- * Describes a genomic interval and where in a file information for that
- * interval can be obtained
- */
-public class Interval implements Comparable {
- /**
- * Start of the interval in genomic coordinates -- this is exposed on purpose, getters have a significant
- * performance penalty for this field.
- */
- final int start;
-
- /**
- * End of the interval in genomic coordinates -- this is exposed on purpose, getters have a significant
- * performance penalty for this field.
- */
- final int end;
-
- /**
- * File block (position, size) containing the data for this interval
- */
- private Block block;
-
- public Interval(int start, int end) {
- assert start <= end;
- this.start = start;
- this.end = end;
- }
-
-
- public Interval(int start, int end, Block block) {
- assert start <= end;
- this.start = start;
- this.end = end;
- this.block = block;
- }
-
-
- public boolean equals(Object other) {
- if (this == other)
- return true;
- if (this.getClass().equals(other.getClass())) {
- Interval otherInterval = (Interval) other;
- return (this.start == otherInterval.start &&
- this.end == otherInterval.end);
- }
- return false;
- }
-
-
- public int hashCode() {
- return start;
- }
-
-
- public int compareTo(Object o) {
- Interval other = (Interval) o;
- if (this.start < other.start)
- return -1;
- if (this.start > other.start)
- return 1;
-
- if (this.end < other.end)
- return -1;
- if (this.end > other.end)
- return 1;
-
- return 0;
- }
-
- public String toString() {
- return "Interval[" + this.start + ", " + this.end + "]";
- }
-
-
- /**
- * @return whether this interval overlaps the other.
- */
- public boolean overlaps(Interval other) {
- return (this.start <= other.end &&
- other.start <= this.end);
- }
-
-
- /**
- * @return The file block for this interval
- */
- public Block getBlock() {
- return block;
- }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java b/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java
deleted file mode 100644
index e826eda..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalIndexCreator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.TribbleIndexCreator;
-import htsjdk.tribble.index.interval.IntervalTreeIndex.ChrIndex;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * Creates interval indexes from a stream of features
- * @author jrobinso
- */
-public class IntervalIndexCreator extends TribbleIndexCreator {
-
- public static int DEFAULT_FEATURE_COUNT = 600;
-
- /**
- * Maximum number of features stored per interval.
- * @see #DEFAULT_FEATURE_COUNT
- */
- private int featuresPerInterval = DEFAULT_FEATURE_COUNT;
-
- private final LinkedList<ChrIndex> chrList = new LinkedList<ChrIndex>();
-
- /**
- * Instance variable for the number of features we currently are storing in the interval
- */
- private int featureCount = 0;
-
- private final ArrayList<MutableInterval> intervals = new ArrayList<MutableInterval>();
-
- File inputFile;
-
- public IntervalIndexCreator(final File inputFile, final int featuresPerInterval) {
- this.inputFile = inputFile;
- this.featuresPerInterval = featuresPerInterval;
- }
-
- public IntervalIndexCreator(final File inputFile) {
- this(inputFile, DEFAULT_FEATURE_COUNT);
- }
-
- public void addFeature(final Feature feature, final long filePosition) {
- // if we don't have a chrIndex yet, or if the last one was for the previous contig, create a new one
- if (chrList.isEmpty() || !chrList.getLast().getName().equals(feature.getContig())) {
- // if we're creating a new chrIndex (not the first), make sure to dump the intervals to the old chrIndex
- if (!chrList.isEmpty())
- addIntervalsToLastChr(filePosition);
-
- // create a new chr index for the current contig
- chrList.add(new ChrIndex(feature.getContig()));
- intervals.clear();
- }
-
- // if we're about to overflow the current bin, make a new one
- if (featureCount >= featuresPerInterval || intervals.isEmpty()) {
- final MutableInterval i = new MutableInterval();
- i.setStart(feature.getStart());
- i.setStartFilePosition(filePosition);
- if(!intervals.isEmpty()) intervals.get(intervals.size()-1).setEndFilePosition(filePosition);
- featureCount = 0; // reset the feature count
- intervals.add(i);
- }
-
- // make sure we update the ending position of the bin
- intervals.get(intervals.size()-1).setStop(Math.max(feature.getEnd(),intervals.get(intervals.size()-1).getStop()));
- featureCount++;
- }
-
- /**
- * dump the intervals we have stored to the last chrList entry
- * @param currentPos the current position, for the last entry in the interval list
- */
- private void addIntervalsToLastChr(final long currentPos) {
- for (int x = 0; x < intervals.size(); x++) {
- if (x == intervals.size()-1) intervals.get(x).setEndFilePosition(currentPos);
- chrList.getLast().insert(intervals.get(x).toInterval());
- }
- }
-
- /**
- * finalize the index; create a tree index given the feature list passed in so far
- * @param finalFilePosition the final file position, for indexes that have to close out with the final position
- * @return a Tree Index
- */
- public Index finalizeIndex(final long finalFilePosition) {
- final IntervalTreeIndex featureIndex = new IntervalTreeIndex(inputFile.getAbsolutePath());
- // dump the remaining bins to the index
- addIntervalsToLastChr(finalFilePosition);
- featureIndex.setChrIndex(chrList);
- featureIndex.addProperties(properties);
- featureIndex.finalizeIndex();
- return featureIndex;
- }
-
- public int getFeaturesPerInterval() {
- return featuresPerInterval;
- }
-}
-
-/**
- * The interval class isn't mutable; use this private class as a temporary storage until we're ready to make intervals
- */
-class MutableInterval {
-
- // the start, the stop, and the start position
- private int start;
- private int stop;
- private long startFilePosition;
- private long endFilePosition;
-
- public void setStart(final int start) {
- if (start < 0) throw new IllegalArgumentException("Start must be greater than 0!");
- this.start = start;
- }
-
- public void setStop(final int stop) {
- if (stop < 0) throw new IllegalArgumentException("Start must be greater than 0!");
- this.stop = stop;
- }
-
- public void setStartFilePosition(final long startFilePosition) {
- this.startFilePosition = startFilePosition;
- }
-
- public void setEndFilePosition(final long endFilePosition) {
- this.endFilePosition = endFilePosition;
- }
-
- public Interval toInterval() {
- return new Interval(start,stop,new Block(startFilePosition, endFilePosition - startFilePosition));
- }
-
- public int getStop() {
- return stop;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java b/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java
deleted file mode 100644
index 855ade9..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalTree.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An implementation of an interval tree, following the explanation.
- * from CLR. For efficiently finding all intervals which overlap a given
- * interval or point.
- * <p/>
- * References:
- * http://en.wikipedia.org/wiki/Interval_tree
- * <p/>
- * Cormen, Thomas H.; Leiserson, Charles E., Rivest, Ronald L. (1990). Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill. ISBN 0-262-03141-8
- */
-public class IntervalTree {
-
- Node root;
- Node NIL = Node.NIL;
-
- /**
- * See {@link #getSize()}
- */
- int size;
-
- public IntervalTree() {
- this.root = NIL;
- this.size = 0;
- }
-
-
- public void insert(Interval interval) {
- Node node = new Node(interval);
- insert(node);
- size++;
- }
-
- /**
- * The estimated size of the tree. We keep a running count
- * on each insert, this getter returns that count.
- *
- * @return
- * @see #size()
- */
- public int getSize() {
- return size;
- }
-
- /**
- * @param interval
- * @return all matches as a list of Intervals
- */
- public List<Interval> findOverlapping(Interval interval) {
-
- if (root().isNull()) {
- return Collections.emptyList();
- }
-
- List<Interval> results = new ArrayList<Interval>();
- searchAll(interval, root(), results);
- return results;
- }
-
- public String toString() {
- return root().toString();
- }
-
- private List<Interval> searchAll(Interval interval, Node node, List<Interval> results) {
- if (node.interval.overlaps(interval)) {
- results.add(node.interval);
- }
- if (!node.left.isNull() && node.left.max >= interval.start) {
- searchAll(interval, node.left, results);
- }
- if (!node.right.isNull() && node.right.min <= interval.end) {
- searchAll(interval, node.right, results);
- }
- return results;
- }
-
- /**
- * Return all intervals in tree.
- * TODO: an iterator would be more effecient.
- *
- * @return
- */
- public List<Interval> getIntervals() {
- if (root().isNull()) {
- return Collections.emptyList();
- }
- List<Interval> results = new ArrayList<Interval>(size);
- getAll(root(), results);
- return results;
- }
-
- /**
- * Get all nodes which are descendants of {@code node}, inclusive.
- * {@code results} is modified in place
- *
- * @param node
- * @param results
- * @return the total list of descendants, including original {@code results}
- */
- private List<Interval> getAll(Node node, List<Interval> results) {
-
- results.add(node.interval);
- if (!node.left.isNull()) {
- getAll(node.left, results);
- }
- if (!node.right.isNull()) {
- getAll(node.right, results);
- }
- return results;
- }
-
-
- /**
- * Used for testing only.
- *
- * @param node
- * @return
- */
- private int getRealMax(Node node) {
- if (node.isNull())
- return Integer.MIN_VALUE;
- int leftMax = getRealMax(node.left);
- int rightMax = getRealMax(node.right);
- int nodeHigh = (node.interval).end;
-
- int max1 = (leftMax > rightMax ? leftMax : rightMax);
- return (max1 > nodeHigh ? max1 : nodeHigh);
- }
-
- /**
- * Used for testing only
- *
- * @param node
- * @return
- */
- private int getRealMin(Node node) {
- if (node.isNull())
- return Integer.MAX_VALUE;
-
- int leftMin = getRealMin(node.left);
- int rightMin = getRealMin(node.right);
- int nodeLow = (node.interval).start;
-
- int min1 = (leftMin < rightMin ? leftMin : rightMin);
- return (min1 < nodeLow ? min1 : nodeLow);
- }
-
-
- private void insert(Node x) {
- assert (x != null);
- assert (!x.isNull());
-
- treeInsert(x);
- x.color = Node.RED;
- while (x != this.root && x.parent.color == Node.RED) {
- if (x.parent == x.parent.parent.left) {
- Node y = x.parent.parent.right;
- if (y.color == Node.RED) {
- x.parent.color = Node.BLACK;
- y.color = Node.BLACK;
- x.parent.parent.color = Node.RED;
- x = x.parent.parent;
- } else {
- if (x == x.parent.right) {
- x = x.parent;
- this.leftRotate(x);
- }
- x.parent.color = Node.BLACK;
- x.parent.parent.color = Node.RED;
- this.rightRotate(x.parent.parent);
- }
- } else {
- Node y = x.parent.parent.left;
- if (y.color == Node.RED) {
- x.parent.color = Node.BLACK;
- y.color = Node.BLACK;
- x.parent.parent.color = Node.RED;
- x = x.parent.parent;
- } else {
- if (x == x.parent.left) {
- x = x.parent;
- this.rightRotate(x);
- }
- x.parent.color = Node.BLACK;
- x.parent.parent.color = Node.RED;
- this.leftRotate(x.parent.parent);
- }
- }
- }
- this.root.color = Node.BLACK;
- }
-
-
- private Node root() {
- return this.root;
- }
-
-
- private void leftRotate(Node x) {
- Node y = x.right;
- x.right = y.left;
- if (y.left != NIL) {
- y.left.parent = x;
- }
- y.parent = x.parent;
- if (x.parent == NIL) {
- this.root = y;
- } else {
- if (x.parent.left == x) {
- x.parent.left = y;
- } else {
- x.parent.right = y;
- }
- }
- y.left = x;
- x.parent = y;
-
- applyUpdate(x);
- // no need to apply update on y, since it'll y is an ancestor
- // of x, and will be touched by applyUpdate().
- }
-
-
- private void rightRotate(Node x) {
- Node y = x.left;
- x.left = y.right;
- if (y.right != NIL) {
- y.right.parent = x;
- }
- y.parent = x.parent;
- if (x.parent == NIL) {
- this.root = y;
- } else {
- if (x.parent.right == x) {
- x.parent.right = y;
- } else {
- x.parent.left = y;
- }
- }
- y.right = x;
- x.parent = y;
-
-
- applyUpdate(x);
- // no need to apply update on y, since it'll y is an ancestor
- // of x, and will be touched by applyUpdate().
- }
-
-
- /**
- * Note: Does not maintain RB constraints, this is done post insert
- *
- * @param x
- */
- private void treeInsert(Node x) {
- Node node = this.root;
- Node y = NIL;
- while (node != NIL) {
- y = node;
- if (x.interval.start <= node.interval.start) {
- node = node.left;
- } else {
- node = node.right;
- }
- }
- x.parent = y;
-
- if (y == NIL) {
- this.root = x;
- x.left = x.right = NIL;
- } else {
- if (x.interval.start <= y.interval.start) {
- y.left = x;
- } else {
- y.right = x;
- }
- }
-
- this.applyUpdate(x);
- }
-
-
- // Applies the statistic update on the node and its ancestors.
-
- private void applyUpdate(Node node) {
- while (!node.isNull()) {
- this.update(node);
- node = node.parent;
- }
- }
-
- private void update(Node node) {
- node.max = Math.max(Math.max(node.left.max, node.right.max), node.interval.end);
- node.min = Math.min(Math.min(node.left.min, node.right.min), node.interval.start);
- }
-
- /**
- * @return Returns the number of nodes in the tree.
- * Recalculated each call
- * @see #getSize()
- */
- public int size() {
- return _size(this.root);
- }
-
-
- private int _size(Node node) {
- if (node.isNull())
- return 0;
- return 1 + _size(node.left) + _size(node.right);
- }
-
-
- private boolean allRedNodesFollowConstraints(Node node) {
- if (node.isNull())
- return true;
-
- if (node.color == Node.BLACK) {
- return (allRedNodesFollowConstraints(node.left) &&
- allRedNodesFollowConstraints(node.right));
- }
-
- // At this point, we know we're on a RED node.
- return (node.left.color == Node.BLACK &&
- node.right.color == Node.BLACK &&
- allRedNodesFollowConstraints(node.left) &&
- allRedNodesFollowConstraints(node.right));
- }
-
-
- // Check that both ends are equally balanced in terms of black height.
-
- private boolean isBalancedBlackHeight(Node node) {
- if (node.isNull())
- return true;
- return (blackHeight(node.left) == blackHeight(node.right) &&
- isBalancedBlackHeight(node.left) &&
- isBalancedBlackHeight(node.right));
- }
-
-
- // The black height of a node should be left/right equal.
-
- private int blackHeight(Node node) {
- if (node.isNull())
- return 0;
- int leftBlackHeight = blackHeight(node.left);
- if (node.color == Node.BLACK) {
- return leftBlackHeight + 1;
- } else {
- return leftBlackHeight;
- }
- }
-
-
- /**
- * Test code: make sure that the tree has all the properties
- * defined by Red Black trees and interval trees
- * <p/>
- * o. Root is black.
- * <p/>
- * o. NIL is black.
- * <p/>
- * o. Red nodes have black children.
- * <p/>
- * o. Every path from root to leaves contains the same number of
- * black nodes.
- * <p/>
- * o. getMax(node) is the maximum of any interval rooted at that node..
- * <p/>
- * This code is expensive, and only meant to be used for
- * assertions and testing.
- */
- public boolean isValid() {
- if (this.root.color != Node.BLACK) {
- //logger.warn("root color is wrong");
- return false;
- }
- if (NIL.color != Node.BLACK) {
- //logger.warn("NIL color is wrong");
- return false;
- }
- if (allRedNodesFollowConstraints(this.root) == false) {
- //logger.warn("red node doesn't follow constraints");
- return false;
- }
- if (isBalancedBlackHeight(this.root) == false) {
- //logger.warn("black height unbalanced");
- return false;
- }
-
- return hasCorrectMaxFields(this.root) &&
- hasCorrectMinFields(this.root);
- }
-
-
- private boolean hasCorrectMaxFields(Node node) {
- if (node.isNull())
- return true;
- return (getRealMax(node) == (node.max) &&
- hasCorrectMaxFields(node.left) &&
- hasCorrectMaxFields(node.right));
- }
-
-
- private boolean hasCorrectMinFields(Node node) {
- if (node.isNull())
- return true;
- return (getRealMin(node) == (node.min) &&
- hasCorrectMinFields(node.left) &&
- hasCorrectMinFields(node.right));
- }
-
-
- static class Node {
-
- public static boolean BLACK = false;
- public static boolean RED = true;
-
- Interval interval;
- int min;
- int max;
- Node left;
- Node right;
-
- // Color and parent are used for inserts. If tree is immutable these are not required (no requirement
- // to store these persistently).
- boolean color;
- Node parent;
-
-
- private Node() {
- this.max = Integer.MIN_VALUE;
- this.min = Integer.MAX_VALUE;
- }
-
- public void store(DataOutputStream dos) throws IOException {
- dos.writeInt(interval.start);
- dos.writeInt(interval.end);
- dos.writeInt(min);
- dos.writeInt(max);
-
- }
-
- public Node(Interval interval) {
- this();
- this.parent = NIL;
- this.left = NIL;
- this.right = NIL;
- this.interval = interval;
- this.color = RED;
- }
-
-
- static Node NIL;
-
- static {
- NIL = new Node();
- NIL.color = BLACK;
- NIL.parent = NIL;
- NIL.left = NIL;
- NIL.right = NIL;
- }
-
-
- public boolean isNull() {
- return this == NIL;
- }
-
-
- public String toString() {
-
- // Make some shorthand for the nodes
- Map<Interval, Integer> keys = new LinkedHashMap<Interval, Integer>();
-
- if (this == NIL) {
- return "nil";
- }
-
- StringBuffer buf = new StringBuffer();
- _toString(buf, keys);
-
- buf.append('\n');
- for (Map.Entry<Interval, Integer> entry : keys.entrySet()) {
- buf.append(entry.getValue() + " = " + entry.getKey());
- buf.append('\n');
- }
-
- return buf.toString();
- }
-
- public void _toString(StringBuffer buf, Map<Interval, Integer> keys) {
- if (this == NIL) {
- buf.append("nil");
- buf.append('\n');
- return;
- }
-
- Integer selfKey = keys.get(this.interval);
- if (selfKey == null) {
- selfKey = keys.size();
- keys.put(this.interval, selfKey);
- }
- Integer leftKey = keys.get(this.left.interval);
- if (leftKey == null) {
- leftKey = keys.size();
- keys.put(this.left.interval, leftKey);
- }
- Integer rightKey = keys.get(this.right.interval);
- if (rightKey == null) {
- rightKey = keys.size();
- keys.put(this.right.interval, rightKey);
- }
-
-
- buf.append(selfKey + " -> " + leftKey + " , " + rightKey);
- buf.append('\n');
- this.left._toString(buf, keys);
- this.right._toString(buf, keys);
- }
- }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java b/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java
deleted file mode 100644
index 055888e..0000000
--- a/src/main/java/htsjdk/tribble/index/interval/IntervalTreeIndex.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.index.AbstractIndex;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Index based on an interval tree
- *
- * @author jrobinso
- * @date Jul 9, 2010
- * @see IntervalTree
- */
-public class IntervalTreeIndex extends AbstractIndex {
- public static final int INDEX_TYPE = IndexType.INTERVAL_TREE.fileHeaderTypeIdentifier;
-
- /**
- * Load from file.
- *
- * @param inputStream This method assumes that the input stream is already buffered as appropriate. Caller
- * should close after this object is constructed.
- */
- public IntervalTreeIndex(final InputStream inputStream) throws IOException {
- final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
- validateIndexHeader(INDEX_TYPE, dis);
- read(dis);
- }
-
- /**
- * Prepare to build an index.
- *
- * @param featureFile File which we are indexing
- */
- public IntervalTreeIndex(final String featureFile) {
- super(featureFile);
- }
-
- @Override
- public Class getChrIndexClass() {
- return ChrIndex.class;
- }
-
- @Override
- protected int getType() {
- return INDEX_TYPE;
- }
-
- /**
- * Add a new interval to this index
- *
- * @param chr Chromosome
- * @param interval
- */
- public void insert(final String chr, final Interval interval) {
- ChrIndex chrIdx = (ChrIndex) chrIndices.get(chr);
- if (chrIdx == null) {
- chrIdx = new ChrIndex(chr);
- chrIndices.put(chr, chrIdx);
- }
- chrIdx.insert(interval);
- }
-
- protected void setChrIndex(final List<ChrIndex> indicies) {
- for (final ChrIndex index : indicies) {
- chrIndices.put(index.getName(), index);
- }
- }
-
- public void printTree() {
-
- for (final String chr : chrIndices.keySet()) {
- System.out.println(chr + ":");
- final ChrIndex chrIdx = (ChrIndex) chrIndices.get(chr);
- chrIdx.printTree();
- System.out.println();
- }
- }
-
- public static class ChrIndex implements htsjdk.tribble.index.ChrIndex {
-
- IntervalTree tree;
- String name;
-
- /**
- * Default constructor needed for factory methods -- DO NOT REMOVE
- */
- public ChrIndex() {
-
- }
-
- public ChrIndex(final String name) {
- this.name = name;
- tree = new IntervalTree();
- }
-
- public String getName() {
- return name;
- }
-
- public void insert(final Interval iv) {
- tree.insert(iv);
- }
-
- public List<Block> getBlocks() {
- return null;
- }
-
-
- public List<Block> getBlocks(final int start, final int end) {
-
- // Get intervals and build blocks list
- final List<Interval> intervals = tree.findOverlapping(new Interval(start, end));
-
- // save time (and save throwing an exception) if the blocks are empty, return now
- if (intervals == null || intervals.isEmpty()) return new ArrayList<Block>();
-
- final Block[] blocks = new Block[intervals.size()];
- int idx = 0;
- for (final Interval iv : intervals) {
- blocks[idx++] = iv.getBlock();
- }
-
- // Sort blocks by start position
- Arrays.sort(blocks, new Comparator<Block>() {
- public int compare(final Block b1, final Block b2) {
- // this is a little cryptic because the normal method (b1.getStartPosition() - b2.getStartPosition()) wraps in int space and we incorrectly sort the blocks in extreme cases
- return b1.getStartPosition() - b2.getStartPosition() < 1 ? -1 : (b1.getStartPosition() - b2.getStartPosition() > 1 ? 1 : 0);
- }
- });
-
- // Consolidate blocks that are close together
- final List<Block> consolidatedBlocks = new ArrayList<Block>(blocks.length);
- Block lastBlock = blocks[0];
- consolidatedBlocks.add(lastBlock);
- for (int i = 1; i < blocks.length; i++) {
- final Block block = blocks[i];
- if (block.getStartPosition() < (lastBlock.getEndPosition() + 1000)) {
- lastBlock.setEndPosition(block.getEndPosition());
- } else {
- lastBlock = block;
- consolidatedBlocks.add(lastBlock);
- }
- }
-
- return consolidatedBlocks;
- }
-
- public void printTree() {
- System.out.println(tree.toString());
- }
-
- public void write(final LittleEndianOutputStream dos) throws IOException {
-
- dos.writeString(name);
- final List<Interval> intervals = tree.getIntervals();
-
- dos.writeInt(intervals.size());
- for (final Interval interval : intervals) {
- dos.writeInt(interval.start);
- dos.writeInt(interval.end);
- dos.writeLong(interval.getBlock().getStartPosition());
- dos.writeInt((int) interval.getBlock().getSize());
- }
-
- }
-
- public void read(final LittleEndianInputStream dis) throws IOException {
-
- tree = new IntervalTree();
-
- name = dis.readString();
- int nIntervals = dis.readInt();
- while (nIntervals-- > 0) {
-
- final int start = dis.readInt();
- final int end = dis.readInt();
- final long pos = dis.readLong();
- final int size = dis.readInt();
-
- final Interval iv = new Interval(start, end, new Block(pos, size));
- tree.insert(iv);
- }
-
-
- }
-
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java
deleted file mode 100644
index 4f4d910..0000000
--- a/src/main/java/htsjdk/tribble/index/linear/LinearIndex.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.index.AbstractIndex;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Index defined by dividing the genome by chromosome, then each chromosome into bins of fixed width (in
- * genomic coordinates). Features are allocated to bins by start position. The longest feature in each
- * recorded and used to adjust the start position of a query to include all bins that might have a feature
- * that overlaps the query interval. This works well for feature sets of approximately homogeneous length,
- * or whose longest feature is on the order of the bin width or less.
- * <p/>
- * magicNumber integer
- * type integer
- * version integer
- * filename null terminated character array
- * filesize long
- * lastModified long
- * md5 String
- * flags integer
- * <p/>
- * ------ LINEAR INDEX
- * nChromosomes integer
- */
-public class LinearIndex extends AbstractIndex {
-
- // NOTE: To debug uncomment the System.getProperty and recompile.
- public static final double MAX_FEATURES_PER_BIN = Double.valueOf(System.getProperty("MAX_FEATURES_PER_BIN", "100"));
- public static final int INDEX_TYPE = IndexType.LINEAR.fileHeaderTypeIdentifier;
-
- private final static int MAX_BIN_WIDTH = 1 * 1000 * 1000 * 1000; // widths must be less than 1 billion
-
- // 1MB: we will no merge bins with any features in them beyond this size, no matter how sparse, per chromosome
- private static final long MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX = Long.valueOf(System.getProperty("MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX", "1024000"));
-
- public static boolean enableAdaptiveIndexing = true;
-
- /**
- * Initialize using the specified {@code indices}
- * @param indices
- * @param featureFile
- */
- public LinearIndex(final List<ChrIndex> indices, final File featureFile) {
- super(featureFile.getAbsolutePath());
- for (final ChrIndex index : indices)
- chrIndices.put(index.getName(), index);
- }
-
- private LinearIndex(final LinearIndex parent, final List<ChrIndex> indices) {
- super(parent);
- for (final ChrIndex index : indices)
- chrIndices.put(index.getName(), index);
- }
-
- /**
- * Initialize with default parameters
- * @param featureFile File for which this is an index
- */
- public LinearIndex(final String featureFile) {
- super(featureFile);
- }
-
- /**
- * Load from file.
- * @param inputStream This method assumes that the input stream is already buffered as appropriate.
- */
- public LinearIndex(final InputStream inputStream) throws IOException {
- final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
- validateIndexHeader(INDEX_TYPE, dis);
- read(dis);
- }
-
- public boolean isCurrentVersion() {
- if (!super.isCurrentVersion()) return false;
-
- // todo fixme nasty hack to determine if this is an old style V3 linear index (without nFeaturesPerBin)
- for (final htsjdk.tribble.index.ChrIndex chrIndex : chrIndices.values())
- if (((ChrIndex) chrIndex).OLD_V3_INDEX)
- return false;
-
- return true;
- }
-
- @Override
- protected int getType() {
- return INDEX_TYPE;
- }
-
- public List<String> getSequenceNames() {
- return (chrIndices == null ? Collections.EMPTY_LIST :
- Collections.unmodifiableList(new ArrayList<String>(chrIndices.keySet())));
- }
-
- @Override
- public Class getChrIndexClass() {
- return ChrIndex.class;
- }
-
-
- /**
- * Blocks are organized as a simple flat list:
- * <p/>
- * Block 0
- * Block 1
- * Block 2
- * <p/>
- * There's a constant bin width, so that each block corresponds to a specific interval
- * over the genome based on its index, as in:
- * <p/>
- * Block 0: (0 - binWidth]
- * Block 1: (binWidth - 2 * binWidth]
- * Block 2: (2 * binWidth - 3 * binWidth]
- * <p/>
- * Note that covered regions are open on the left ( and closed on the right ].
- * <p/>
- * In general, if block i is the ith block (starting from 0), then block i
- * contains all records that have starting position > (i * binWidth) and
- * <= ((i + 1) * binWidth))
- */
- public static class ChrIndex implements htsjdk.tribble.index.ChrIndex {
- private String name = "";
- private int binWidth;
- private int longestFeature;
- private int nFeatures;
- private List<Block> blocks;
-
- private boolean OLD_V3_INDEX = false;
-
- /**
- * Default constructor needed for factory methods -- DO NOT REMOVE
- */
- public ChrIndex() {
-
- }
-
- ChrIndex(final String name, final int binWidth) {
- this.name = name;
- this.binWidth = binWidth;
- this.blocks = new ArrayList<Block>(100);
- this.longestFeature = 0;
- //this.largestBlockSize = 0;
- this.nFeatures = 0;
- }
-
- public String getName() {
- return name;
- }
-
- void addBlock(final Block block) {
- blocks.add(block);
- //largestBlockSize = Math.max(largestBlockSize, block.getSize());
- }
-
- public int getNBlocks() {
- return blocks.size();
- }
-
- public List<Block> getBlocks() {
- return blocks;
- }
-
- public List<Block> getBlocks(final int start, final int end) {
- if (blocks.isEmpty()) {
- return Collections.emptyList();
- } else {
- // Adjust position for the longest feature in this chromosome. This insures we get
- // features that start before the bin but extend into it
- final int adjustedPosition = Math.max(start - longestFeature, 0);
- final int startBinNumber = adjustedPosition / binWidth;
- if (startBinNumber >= blocks.size()) // are we off the end of the bin list, so return nothing
- return Collections.emptyList();
- else {
- final int endBinNumber = Math.min((end - 1) / binWidth, blocks.size() - 1);
-
- // By definition blocks are adjacent for the liner index. Combine them into one merged block
-
- final long startPos = blocks.get(startBinNumber).getStartPosition();
- final long endPos = blocks.get(endBinNumber).getStartPosition() + blocks.get(endBinNumber).getSize();
- final long size = endPos - startPos;
- if (size == 0) {
- return Collections.EMPTY_LIST;
- } else {
- final Block mergedBlock = new Block(startPos, size);
- return Arrays.asList(mergedBlock);
- }
- }
- }
- }
-
-
- public void updateLongestFeature(final int featureLength) {
- longestFeature = Math.max(longestFeature, featureLength);
- }
-
- public int getNFeatures() {
- return this.nFeatures;
- }
-
- public void incrementFeatureCount() {
- this.nFeatures++;
- }
-
- public void write(final LittleEndianOutputStream dos) throws IOException {
-
- // Chr name, binSize, # bins, longest feature
- dos.writeString(name);
- dos.writeInt(binWidth);
- dos.writeInt(blocks.size());
- dos.writeInt(longestFeature);
- dos.writeInt(0); // no longer used
- //dos.writeInt(largestBlockSize);
- dos.writeInt(nFeatures);
-
- long pos = 0;
- long size = 0;
- for (final Block block : blocks) {
- pos = block.getStartPosition();
- size = block.getSize();
- dos.writeLong(pos);
- }
- // End of last block for this chromosome
- dos.writeLong(pos + size);
- }
-
- public void read(final LittleEndianInputStream dis) throws IOException {
- name = dis.readString();
- binWidth = dis.readInt();
- final int nBins = dis.readInt();
- longestFeature = dis.readInt();
- //largestBlockSize = dis.readInt();
- // largestBlockSize and totalBlockSize are old V3 index values. largest block size should be 0 for
- // all newer V3 block. This is a nasty hack that should be removed when we go to V4 (XML!) indices
- OLD_V3_INDEX = dis.readInt() > 0;
- nFeatures = dis.readInt();
-
- // note the code below accounts for > 60% of the total time to read an index
- blocks = new ArrayList<Block>(nBins);
- long pos = dis.readLong();
- for (int binNumber = 0; binNumber < nBins; binNumber++) {
- final long nextPos = dis.readLong();
- final long size = nextPos - pos;
- blocks.add(new Block(pos, size));
- pos = nextPos;
- }
- }
-
- public boolean equals(final Object obj) {
- if (this == obj) return true;
- if (!(obj instanceof ChrIndex)) return false;
- final ChrIndex other = (ChrIndex) obj;
- return binWidth == other.binWidth
- && longestFeature == other.longestFeature
- //&& largestBlockSize == other.largestBlockSize
- && nFeatures == other.nFeatures
- && name.equals(other.name)
- && blocks.equals(other.blocks);
- }
-
- /**
- * @return Total size of all blocks
- */
- public long getTotalSize() {
- long n = 0;
- for (final Block b : getBlocks())
- n += b.getSize();
- return n;
- }
-
- public double getAverageFeatureSize() {
- return (1.0 * getTotalSize()) / getNFeatures();
- }
-
- public double getFeaturesPerBlock() {
- return (1.0 * getNFeatures()) / getNBlocks();
- }
-
- private double getNFeaturesOfMostDenseBlock(final double featureSize) {
- double m = -1;
- for (final Block b : getBlocks()) {
- final double n = b.getSize() / featureSize;
- if (m == -1 || n > m) m = n;
- }
- return m;
- }
-
- private double optimizeScore() {
- return getNFeaturesOfMostDenseBlock(getAverageFeatureSize());
- }
-
- public ChrIndex optimize(final double threshold) {
- return optimize(this, threshold, 0);
- }
-
- private static boolean badBinWidth(final ChrIndex idx) {
- if (idx.binWidth > MAX_BIN_WIDTH || idx.binWidth < 0) // an overflow occurred
- return true;
- else if (MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX != 0 && idx.getNFeatures() > 1 && idx.binWidth > MAX_BIN_WIDTH_FOR_OCCUPIED_CHR_INDEX) {
- return true;
- } else {
- return false;
- }
- }
-
- private static ChrIndex optimize(ChrIndex idx, final double threshold, int level) {
- ChrIndex best = idx;
-
- while (true) {
- final double score = idx.optimizeScore();
-
- if (score > threshold || idx.getNBlocks() == 1 || badBinWidth(idx))
- break;
- else {
- best = idx; // remember the last best option
-
- // try to make a better one
- idx = mergeBlocks(idx);
- level++;
- }
-
- if (level > 30) throw new IllegalStateException("Too many iterations");
- }
-
- return best;
- }
-
- private static ChrIndex mergeBlocks(final ChrIndex idx) {
- final ChrIndex merged = new ChrIndex(idx.name, idx.binWidth * 2); // increasing width by 2 each time
- merged.longestFeature = idx.longestFeature;
- merged.nFeatures = idx.nFeatures;
-
- final Iterator<Block> blocks = idx.getBlocks().iterator();
- if (!blocks.hasNext())
- throw new IllegalStateException("Block iterator cannot be empty at the start for " + idx.getName());
-
- // extremely simple merging algorithm. Walk left to right, joining up blocks adjacent blocks.
- while (blocks.hasNext()) {
- final Block b1 = blocks.next();
- final Block b2 = blocks.hasNext() ? blocks.next() : null;
-
- if (b2 == null)
- merged.addBlock(b1);
- else
- // the new block is simply the start of the first block and the size of both together
- merged.addBlock(new Block(b1.getStartPosition(), b1.getSize() + b2.getSize()));
- }
-
- return merged;
- }
-
- private static String dupString(final char c, final int nCopies) {
- final char[] chars = new char[nCopies];
- Arrays.fill(chars, c);
- return new String(chars);
- }
- }
-
- /**
- * Adapative optimization of the linear index
- * @param threshold threshold to use for optimizing each constituent {@code chrIndex}
- * @return The new optimized index
- */
- public Index optimize(final double threshold) {
- if (enableAdaptiveIndexing) {
-
- final List<ChrIndex> newIndices = new ArrayList<ChrIndex>(this.chrIndices.size());
- for (final String name : chrIndices.keySet()) {
- final LinearIndex.ChrIndex oldIdx = (LinearIndex.ChrIndex) chrIndices.get(name);
- final LinearIndex.ChrIndex newIdx = oldIdx.optimize(threshold);
- newIndices.add(newIdx);
- }
- return new LinearIndex(this, newIndices);
- } else {
- return this;
- }
- }
-
- public Index optimize() {
- return optimize(MAX_FEATURES_PER_BIN);
- }
-
- /**
- * Code to convert linear index to a text table for analysis
- * @param out Stream to which to write out table to
- */
- public void writeTable(final PrintStream out) {
- out.printf("chr binWidth avg.feature.size nFeatures.total block.id start.pos size nFeatures%n");
- for (final String name : chrIndices.keySet()) {
- final LinearIndex.ChrIndex chrIdx = (LinearIndex.ChrIndex) chrIndices.get(name);
- int blockCount = 0;
- for (final Block b : chrIdx.getBlocks()) {
- out.printf("%s %d %.2f %d %d %d %d %d%n", name, chrIdx.binWidth, chrIdx.getAverageFeatureSize(), chrIdx.getNFeatures(), blockCount,
- blockCount * chrIdx.binWidth, b.getSize(), (int) (b.getSize() / chrIdx.getAverageFeatureSize()));
- blockCount++;
- }
- }
- }
-
- // purely for testing purposes
- protected final void setTS(final long ts) {
- this.indexedFileTS = ts;
- }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java b/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java
deleted file mode 100644
index 1158fdf..0000000
--- a/src/main/java/htsjdk/tribble/index/linear/LinearIndexCreator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.TribbleIndexCreator;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * For creating a LinearIndex from a stream of features.
- *
- * @author jrobinso
- */
-public class LinearIndexCreator extends TribbleIndexCreator {
- public static int DEFAULT_BIN_WIDTH = 8000;
- // the set bin width
- private int binWidth = DEFAULT_BIN_WIDTH;
-
- // the input file
- private final File inputFile;
-
- private final LinkedList<LinearIndex.ChrIndex> chrList = new LinkedList<LinearIndex.ChrIndex>();
- private int longestFeature= 0;
-
- private final ArrayList<Block> blocks = new ArrayList<Block>();
-
- public LinearIndexCreator(final File inputFile, final int binSize) {
- this.inputFile = inputFile;
- binWidth = binSize;
- }
-
- public LinearIndexCreator(final File inputFile) {
- this(inputFile, DEFAULT_BIN_WIDTH);
- }
-
- /**
- * add a feature to the index
- * @param feature the feature, from which we use the contig, start, and stop
- * @param filePosition the position of the file at the BEGINNING of the current feature
- */
- public void addFeature(final Feature feature, final long filePosition) {
- // fi we don't have a chrIndex yet, or if the last one was for the previous contig, create a new one
- if (chrList.isEmpty() || !chrList.getLast().getName().equals(feature.getContig())) {
- // if we're creating a new chrIndex (not the first), make sure to dump the blocks to the old chrIndex
- if (!chrList.isEmpty())
- for (int x = 0; x < blocks.size(); x++) {
- blocks.get(x).setEndPosition((x + 1 == blocks.size()) ? filePosition : blocks.get(x + 1).getStartPosition());
- chrList.getLast().addBlock(blocks.get(x));
- }
- chrList.add(new LinearIndex.ChrIndex(feature.getContig(),binWidth));
- blocks.clear();
-
- // Add the first block
- blocks.add(new Block(filePosition, 0));
- longestFeature = 0;
- }
-
- // if start > current bin location, make new bins until we're at the correct location
- while (feature.getStart() > blocks.size() * binWidth) {
- blocks.add(new Block(filePosition,0));
- }
- if ((feature.getEnd()- feature.getStart())+1 > longestFeature) {
- longestFeature = (feature.getEnd()- feature.getStart())+1;
- chrList.getLast().updateLongestFeature(longestFeature);
- }
- chrList.getLast().incrementFeatureCount();
- }
-
- /**
- * finalize the index; producing an index object
- * @param finalFilePosition the final file position, for indexes that have to close out with the final position
- * @return an Index object
- */
- public Index finalizeIndex(final long finalFilePosition) {
- if (finalFilePosition == 0)
- throw new IllegalArgumentException("finalFilePosition != 0, -> " + finalFilePosition);
-
- for (int x = 0; x < blocks.size(); x++) {
- blocks.get(x).setEndPosition((x + 1 == blocks.size()) ? finalFilePosition : blocks.get(x+1).getStartPosition());
- chrList.getLast().addBlock(blocks.get(x));
- }
- blocks.clear();
-
- final LinearIndex index = new LinearIndex(chrList,inputFile);
- index.addProperties(properties);
- index.finalizeIndex();
- return index.optimize();
- }
-
- /**
- * the current default bin size
- * @return
- */
- public int defaultBinSize() {
- return DEFAULT_BIN_WIDTH;
- }
-
- public int getBinSize() { return binWidth; }
-}
-
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java b/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java
deleted file mode 100644
index 0cf910f..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixFormat.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.tribble.TribbleException;
-
-/**
- * The values in a Tabix header that define the format of the file being indexed, e.g. gff, bed, vcf
- */
-public class TabixFormat implements Cloneable {
- public static final int ZERO_BASED = 0x10000;
- public static final int GENERIC_FLAGS = 0;
- public static final int SAM_FLAGS = 1;
- public static final int VCF_FLAGS = 2;
- public static final int UCSC_FLAGS = GENERIC_FLAGS | ZERO_BASED;
-
- /** Predefined headers for known formats */
- public static TabixFormat GFF = new TabixFormat(GENERIC_FLAGS, 1, 4, 5, '#', 0);
- public static TabixFormat BED = new TabixFormat(UCSC_FLAGS, 1, 2, 3, '#', 0);
- public static TabixFormat PSLTBL = new TabixFormat(UCSC_FLAGS, 15, 17, 18, '#', 0);
- public static TabixFormat SAM = new TabixFormat(SAM_FLAGS, 3, 4, 0, '@', 0);
- public static TabixFormat VCF = new TabixFormat(VCF_FLAGS, 1, 2, 0, '#', 0);
-
- /** Describes interpretation of file being indexed. See FLAGS constants above. */
- public int flags;
- /** One-based index of the column in the file being indexed containing the sequence name */
- public int sequenceColumn;
- /** One-based index of the column in the file being indexed containing the start position. */
- public int startPositionColumn;
- /**
- * One-based index of the column in the file being indexed containing the end position. Zero implies
- * there is no end position column.
- */
- public int endPositionColumn;
- /** Lines in the file being indexed that start with this character are ignored. */
- public char metaCharacter;
- /** This is part of the index header, but does not appear to be used. */
- public int numHeaderLinesToSkip;
-
- public TabixFormat() {
- }
-
- public TabixFormat(final int flags, final int sequenceColumn, final int startPositionColumn, final int endPositionColumn, final char metaCharacter, final int numHeaderLinesToSkip) {
- this.flags = flags;
- this.sequenceColumn = sequenceColumn;
- this.startPositionColumn = startPositionColumn;
- this.endPositionColumn = endPositionColumn;
- this.metaCharacter = metaCharacter;
- this.numHeaderLinesToSkip = numHeaderLinesToSkip;
- }
-
- @Override
- public TabixFormat clone() {
- try {
- return (TabixFormat)super.clone();
- } catch (final CloneNotSupportedException e) {
- throw new TribbleException("unpossible!");
- }
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final TabixFormat that = (TabixFormat) o;
-
- if (endPositionColumn != that.endPositionColumn) return false;
- if (flags != that.flags) return false;
- if (metaCharacter != that.metaCharacter) return false;
- if (numHeaderLinesToSkip != that.numHeaderLinesToSkip) return false;
- if (sequenceColumn != that.sequenceColumn) return false;
- if (startPositionColumn != that.startPositionColumn) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = flags;
- result = 31 * result + sequenceColumn;
- result = 31 * result + startPositionColumn;
- result = 31 * result + endPositionColumn;
- result = 31 * result + (int) metaCharacter;
- result = 31 * result + numHeaderLinesToSkip;
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java b/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java
deleted file mode 100644
index 044cefe..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixIndex.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.Bin;
-import htsjdk.samtools.BinningIndexContent;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.LinearIndex;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StringUtil;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.util.LittleEndianInputStream;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.*;
-
-/**
- * This class represent a Tabix index that has been built in memory or read from a file. It can be queried or
- * written to a file.
- */
-public class TabixIndex implements Index {
- private static final byte[] MAGIC = {'T', 'B', 'I', 1};
- public static final int MAGIC_NUMBER;
-
- static {
- final ByteBuffer bb = ByteBuffer.allocate(MAGIC.length);
- bb.put(MAGIC);
- bb.flip();
- MAGIC_NUMBER = bb.order(ByteOrder.LITTLE_ENDIAN).getInt();
- }
-
- private final TabixFormat formatSpec;
- private final List<String> sequenceNames;
- private final BinningIndexContent[] indices;
-
- /**
- * @param formatSpec Information about how to interpret the file being indexed. Unused by this class other than
- * written to an output file.
- * @param sequenceNames Sequences in the file being indexed, in the order they appear in the file.
- * @param indices One for each element of sequenceNames
- */
- public TabixIndex(final TabixFormat formatSpec, final List<String> sequenceNames, final BinningIndexContent[] indices) {
- if (sequenceNames.size() != indices.length) {
- throw new IllegalArgumentException("sequenceNames.size() != indices.length");
- }
- this.formatSpec = formatSpec.clone();
- this.sequenceNames = Collections.unmodifiableList(new ArrayList<String>(sequenceNames));
- this.indices = indices;
- }
-
- /**
- * @param inputStream This is expected to be buffered and be gzip-decompressing as appropriate. Caller
- * should close input stream after ctor returns.
- */
- public TabixIndex(final InputStream inputStream) throws IOException {
- this(inputStream, false);
- }
-
- /**
- * Convenient ctor that opens the file, wraps with with BGZF reader, and closes after reading index.
- */
- public TabixIndex(final File tabixFile) throws IOException {
- this(new BlockCompressedInputStream(tabixFile), true);
- }
-
- private TabixIndex(final InputStream inputStream, final boolean closeInputStream) throws IOException {
- final LittleEndianInputStream dis = new LittleEndianInputStream(inputStream);
- if (dis.readInt() != MAGIC_NUMBER) {
- throw new TribbleException(String.format("Unexpected magic number 0x%x", MAGIC_NUMBER));
- }
- final int numSequences = dis.readInt();
- indices = new BinningIndexContent[numSequences];
- formatSpec = new TabixFormat();
- formatSpec.flags = dis.readInt();
- formatSpec.sequenceColumn = dis.readInt();
- formatSpec.startPositionColumn = dis.readInt();
- formatSpec.endPositionColumn = dis.readInt();
- formatSpec.metaCharacter = (char) dis.readInt();
- formatSpec.numHeaderLinesToSkip = dis.readInt();
- final int nameBlockSize = dis.readInt();
- final byte[] nameBlock = new byte[nameBlockSize];
- if (dis.read(nameBlock) != nameBlockSize) throw new EOFException("Premature end of file reading Tabix header");
- final List<String> sequenceNames = new ArrayList<String>(numSequences);
- int startPos = 0;
- for (int i = 0; i < numSequences; ++i) {
- int endPos = startPos;
- while (nameBlock[endPos] != '\0') ++endPos;
- sequenceNames.add(StringUtil.bytesToString(nameBlock, startPos, endPos - startPos));
- startPos = endPos + 1;
- }
- if (startPos != nameBlockSize) {
- throw new TribbleException("Tabix header format exception. Sequence name block is longer than expected");
- }
- for (int i = 0; i < numSequences; ++i) {
- indices[i] = loadSequence(i, dis);
- }
- if (closeInputStream) CloserUtil.close(dis);
- this.sequenceNames = Collections.unmodifiableList(sequenceNames);
- }
-
- /**
- * @param chr the chromosome
- * @param start the start position, one-based, inclusive.
- * @param end the end position, one-based, inclusive.
- * @return List of regions of file that are candidates for the given query.
- * <p/>
- * TODO: This method has not yet been tested, since the primary task is index writing.
- */
- @Override
- public List<Block> getBlocks(final String chr, final int start, final int end) {
- final int sequenceIndex = sequenceNames.indexOf(chr);
- if (sequenceIndex == -1 || indices[sequenceIndex] == null) {
- return Collections.emptyList();
- }
- final List<Chunk> chunks = indices[sequenceIndex].getChunksOverlapping(start, end);
- if (chunks == null) {
- return Collections.emptyList();
- } else {
- final List<Block> ret = new ArrayList<>(chunks.size());
- chunks.stream()
- .map(chunk -> new Block(chunk.getChunkStart(), chunk.getChunkEnd() - chunk.getChunkStart()))
- .forEach(ret::add);
- return ret;
- }
- }
-
- @Override
- public boolean isCurrentVersion() {
- return true;
- }
-
- @Override
- public List<String> getSequenceNames() {
- return sequenceNames;
- }
-
- @Override
- public boolean containsChromosome(final String chr) {
- return sequenceNames.contains(chr);
- }
-
- /**
- * No arbitrary properties in Tabix
- */
- @Override
- public Map<String, String> getProperties() {
- return null;
- }
-
- @Override
- public boolean equalsIgnoreProperties(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final TabixIndex that = (TabixIndex) o;
-
- if (!formatSpec.equals(that.formatSpec)) return false;
- if (!Arrays.equals(indices, that.indices)) return false;
- return sequenceNames.equals(that.sequenceNames);
-
- }
-
- public TabixFormat getFormatSpec() {
- return formatSpec;
- }
-
- /**
- * Writes the index with BGZF.
- *
- * @param tabixFile Where to write the index.
- */
- @Override
- public void write(final File tabixFile) throws IOException {
- try(final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(tabixFile))) {
- write(los);
- }
- }
-
- /**
- * Writes to a file with appropriate name and directory based on feature file.
- *
- * @param featureFile File being indexed.
- */
- @Override
- public void writeBasedOnFeatureFile(final File featureFile) throws IOException {
- if (!featureFile.isFile()) return;
- write(new File(featureFile.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION));
- }
-
- /**
- * @param los It is assumes that caller has done appropriate buffering and BlockCompressedOutputStream wrapping.
- * Caller should close output stream after invoking this method.
- * @throws IOException
- */
- @Override
- public void write(final LittleEndianOutputStream los) throws IOException {
- los.writeInt(MAGIC_NUMBER);
- los.writeInt(sequenceNames.size());
- los.writeInt(formatSpec.flags);
- los.writeInt(formatSpec.sequenceColumn);
- los.writeInt(formatSpec.startPositionColumn);
- los.writeInt(formatSpec.endPositionColumn);
- los.writeInt(formatSpec.metaCharacter);
- los.writeInt(formatSpec.numHeaderLinesToSkip);
- int nameBlockSize = sequenceNames.size(); // null terminators
- for (final String sequenceName : sequenceNames) nameBlockSize += sequenceName.length();
- los.writeInt(nameBlockSize);
- for (final String sequenceName : sequenceNames) {
- los.write(StringUtil.stringToBytes(sequenceName));
- los.write(0);
- }
- for (final BinningIndexContent index : indices) {
- writeSequence(index, los);
- }
- }
-
- private void writeSequence(final BinningIndexContent indexContent, final LittleEndianOutputStream los) throws IOException {
- if (indexContent == null) {
- los.writeInt(0);
- } else {
- final BinningIndexContent.BinList binList = indexContent.getBins();
- los.writeInt(binList.numberOfNonNullBins);
- for (final Bin bin : binList) {
- writeBin(bin, los);
- }
- writeLinearIndex(indexContent.getLinearIndex(), los);
- }
- }
-
- private void writeLinearIndex(final LinearIndex linearIndex, final LittleEndianOutputStream los) throws IOException {
- if (linearIndex.getIndexStart() != 0) {
- // This could be handled by writing zeroes, but it is not expected so just fail.
- throw new IllegalArgumentException("Non-zero linear index start");
- }
- final long[] entries = linearIndex.getIndexEntries();
- los.writeInt(entries.length);
- for (final long entry : entries) los.writeLong(entry);
- }
-
- private void writeBin(final Bin bin, final LittleEndianOutputStream los) throws IOException {
- los.writeInt(bin.getBinNumber());
- final List<Chunk> chunkList = bin.getChunkList();
- los.writeInt(chunkList.size());
- for (final Chunk chunk : chunkList) {
- los.writeLong(chunk.getChunkStart());
- los.writeLong(chunk.getChunkEnd());
- }
- }
-
- /**
- * Although this is probably identical to BAM index reading code, code does not exist there to load directly
- * into a BinningIndexContent object, so that is implemented here.
- *
- * @param referenceSequenceIndex Merely for setting in the returned object, not for seeking into the file.
- * @param dis This method assumes that the current position is at the start of the reference.
- */
- private BinningIndexContent loadSequence(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
- final int numBins = dis.readInt();
- if (numBins == 0) return null;
- int nonNullBins = 0;
- final ArrayList<Bin> bins = new ArrayList<Bin>();
- for (int i = 0; i < numBins; ++i) {
- final Bin bin = loadBin(referenceSequenceIndex, dis);
- if (bin != null) {
- // File is not sparse, but array being produced is sparse, so grow array with nulls as appropriate
- // so that bin number == index into array.
- ++nonNullBins;
- if (bins.size() > bin.getBinNumber()) {
- if (bins.get(bin.getBinNumber()) != null) {
- throw new TribbleException("Bin " + bin.getBinNumber() + " appears more than once in file");
- }
- bins.set(bin.getBinNumber(), bin);
- } else {
- // Grow bins array as needed.
- bins.ensureCapacity(bin.getBinNumber() + 1);
- while (bins.size() < bin.getBinNumber()) bins.add(null);
- bins.add(bin);
- }
- }
- }
- final LinearIndex linearIndex = loadLinearIndex(referenceSequenceIndex, dis);
- return new BinningIndexContent(referenceSequenceIndex,
- new BinningIndexContent.BinList(bins.toArray(new Bin[bins.size()]), nonNullBins), linearIndex);
- }
-
- private LinearIndex loadLinearIndex(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
- final int numElements = dis.readInt();
- final long[] elements = new long[numElements];
- for (int i = 0; i < numElements; ++i) {
- elements[i] = dis.readLong();
- }
- return new LinearIndex(referenceSequenceIndex, 0, elements);
- }
-
- private Bin loadBin(final int referenceSequenceIndex, final LittleEndianInputStream dis) throws IOException {
- final int binNumber = dis.readInt();
- final Bin ret = new Bin(referenceSequenceIndex, binNumber);
- final int numChunks = dis.readInt();
- final List<Chunk> chunkList = new ArrayList<Chunk>(numChunks);
- for (int i = 0; i < numChunks; ++i) {
- chunkList.add(loadChunk(dis));
- }
- ret.setChunkList(chunkList);
- return ret;
- }
-
- private Chunk loadChunk(final LittleEndianInputStream dis) throws IOException {
- final long start = dis.readLong();
- final long end = dis.readLong();
- return new Chunk(start, end);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final TabixIndex index = (TabixIndex) o;
-
- if (!formatSpec.equals(index.formatSpec)) return false;
- if (!Arrays.equals(indices, index.indices)) return false;
- if (!sequenceNames.equals(index.sequenceNames)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = formatSpec.hashCode();
- result = 31 * result + sequenceNames.hashCode();
- result = 31 * result + Arrays.hashCode(indices);
- return result;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java b/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java
deleted file mode 100644
index 001dabc..0000000
--- a/src/main/java/htsjdk/tribble/index/tabix/TabixIndexCreator.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.BinningIndexBuilder;
-import htsjdk.samtools.BinningIndexContent;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexCreator;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * IndexCreator for Tabix.
- * Features are expected to be 1-based, inclusive.
- */
-public class TabixIndexCreator implements IndexCreator {
- private final TabixFormat formatSpec;
- private final List<BinningIndexContent> indexContents = new ArrayList<BinningIndexContent>();
- private final List<String> sequenceNames = new ArrayList<String>();
- // Merely a faster way to ensure that features are added in a specific sequence name order
- private final Set<String> sequenceNamesSeen = new HashSet<String>();
- // A sequence dictionary is not required, but if it is provided all sequences names must be present in it.
- // It is used to determine the length of a sequence in order to optimize index memory allocation.
- private final SAMSequenceDictionary sequenceDictionary;
-
- private String currentSequenceName = null;
- private BinningIndexBuilder indexBuilder = null;
- // A feature can't be added to the index until the next feature is added because the next feature
- // defines the location of the end of the previous feature in the output file.
- private TabixFeature previousFeature = null;
-
-
- /**
- * @param sequenceDictionary is not required, but if present all features added must refer to sequences in the
- * dictionary. It is used to optimize the memory needed to build the index.
- */
- public TabixIndexCreator(final SAMSequenceDictionary sequenceDictionary,
- final TabixFormat formatSpec) {
- this.sequenceDictionary = sequenceDictionary;
- this.formatSpec = formatSpec.clone();
- }
-
- public TabixIndexCreator(final TabixFormat formatSpec) {
- this(null, formatSpec);
- }
-
- @Override
- public void addFeature(final Feature feature, final long filePosition) {
- final String sequenceName = feature.getContig();
- final int referenceIndex;
- if (sequenceName.equals(currentSequenceName)) {
- referenceIndex = sequenceNames.size() - 1;
- } else {
- referenceIndex = sequenceNames.size();
- if (currentSequenceName != null && sequenceNamesSeen.contains(sequenceName)) {
- throw new IllegalArgumentException("Sequence " + feature + " added out sequence of order");
- }
- }
- final TabixFeature thisFeature = new TabixFeature(referenceIndex, feature.getStart(), feature.getEnd(), filePosition);
- if (previousFeature != null) {
- if (previousFeature.compareTo(thisFeature) > 0) {
- throw new IllegalArgumentException(String.format("Features added out of order: previous (%s) > next (%s)",
- previousFeature, thisFeature));
- }
- finalizeFeature(filePosition);
- }
- previousFeature = thisFeature;
- if (referenceIndex == sequenceNames.size()) {
- advanceToReference(sequenceName);
- }
- }
-
- private void finalizeFeature(final long featureEndPosition) {
- previousFeature.featureEndFilePosition = featureEndPosition;
- if (previousFeature.featureStartFilePosition >= previousFeature.featureEndFilePosition) {
- throw new IllegalArgumentException(String.format("Feature start position %d >= feature end position %d",
- previousFeature.featureStartFilePosition, previousFeature.featureEndFilePosition));
- }
- indexBuilder.processFeature(previousFeature);
- }
-
- private void advanceToReference(final String sequenceName) {
- if (indexBuilder != null) {
- indexContents.add(indexBuilder.generateIndexContent());
- }
- // If sequence dictionary is provided, BinningIndexBuilder can reduce size of array it allocates.
- final int sequenceLength;
- if (sequenceDictionary != null) {
- sequenceLength = sequenceDictionary.getSequence(sequenceName).getSequenceLength();
- } else {
- sequenceLength = 0;
- }
- indexBuilder = new BinningIndexBuilder(sequenceNames.size(), sequenceLength);
- sequenceNames.add(sequenceName);
- currentSequenceName = sequenceName;
- sequenceNamesSeen.add(sequenceName);
- }
-
- @Override
- public Index finalizeIndex(final long finalFilePosition) {
- if (previousFeature != null) {
- finalizeFeature(finalFilePosition);
- }
- if (indexBuilder != null) {
- indexContents.add(indexBuilder.generateIndexContent());
- }
- // Make this as big as the sequence dictionary, even if there is not content for every sequence,
- // but truncate the sequence dictionary before its end if there are sequences in the sequence dictionary without
- // any features.
- final BinningIndexContent[] indices = indexContents.toArray(new BinningIndexContent[sequenceNames.size()]);
- return new TabixIndex(formatSpec, sequenceNames, indices);
- }
-
-
- private static class TabixFeature implements BinningIndexBuilder.FeatureToBeIndexed, Comparable<TabixFeature> {
- private final int referenceIndex;
- private final int start;
- private final int end;
- private final long featureStartFilePosition;
- // Position after this feature in the file.
- private long featureEndFilePosition = -1;
-
- private TabixFeature(final int referenceIndex, final int start, final int end, final long featureStartFilePosition) {
- this.referenceIndex = referenceIndex;
- this.start = start;
- this.end = end;
- this.featureStartFilePosition = featureStartFilePosition;
- }
-
- @Override
- public int getStart() {
- return start;
- }
-
- @Override
- public int getEnd() {
- return end;
- }
-
- /**
- *
- * @return null -- Let index builder compute this.
- */
- @Override
- public Integer getIndexingBin() {
- return null;
- }
-
- @Override
- public Chunk getChunk() {
- if (featureEndFilePosition == -1) {
- throw new IllegalStateException("End position is not set");
- }
- return new Chunk(featureStartFilePosition, featureEndFilePosition);
- }
-
- @Override
- public int compareTo(final TabixFeature other) {
- final int ret = this.referenceIndex - other.referenceIndex;
- if (ret != 0) return ret;
- return this.start - other.start;
- }
-
- @Override
- public String toString() {
- return "TabixFeature{" +
- "referenceIndex=" + referenceIndex +
- ", start=" + start +
- ", end=" + end +
- ", featureStartFilePosition=" + featureStartFilePosition +
- ", featureEndFilePosition=" + featureEndFilePosition +
- '}';
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java b/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java
deleted file mode 100644
index 8f06205..0000000
--- a/src/main/java/htsjdk/tribble/readers/AsciiLineReader.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.TribbleException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A simple class that provides {@link #readLine()} functionality around a PositionalBufferedStream
- *
- * {@link BufferedReader} and its {@link java.io.BufferedReader#readLine()} method should be used in preference to this class (when the
- * {@link htsjdk.samtools.util.LocationAware} functionality is not required) because it offers greater performance.
- *
- * @author jrobinso
- */
-public class AsciiLineReader implements LineReader, LocationAware {
- private static final int BUFFER_OVERFLOW_INCREASE_FACTOR = 2;
- private static final byte LINEFEED = (byte) ('\n' & 0xff);
- private static final byte CARRIAGE_RETURN = (byte) ('\r' & 0xff);
-
- PositionalBufferedStream is;
- char[] lineBuffer;
-
- public AsciiLineReader(final InputStream is){
- this(new PositionalBufferedStream(is));
- }
-
- public AsciiLineReader(final PositionalBufferedStream is) {
- this.is = is;
- // Allocate this only once, even though it is essentially a local variable of
- // readLine. This makes a huge difference in performance
- lineBuffer = new char[10000];
- }
-
- /**
- * @return The position of the InputStream
- */
- public long getPosition(){
- if(is == null){
- throw new TribbleException("getPosition() called but no default stream was provided to the class on creation");
- }
- return is.getPosition();
- }
-
- /**
- * Read a line of text. A line is considered to be terminated by any one
- * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
- * followed immediately by a linefeed.
- *
- * @param stream the stream to read the next line from
- * @return A String containing the contents of the line or null if the
- * end of the stream has been reached
- */
- public final String readLine(final PositionalBufferedStream stream) throws IOException{
- int linePosition = 0;
-
- while (true) {
- final int b = stream.read();
-
- if (b == -1) {
- // eof reached. Return the last line, or null if this is a new line
- if (linePosition > 0) {
- return new String(lineBuffer, 0, linePosition);
- } else {
- return null;
- }
- }
-
- final char c = (char) (b & 0xFF);
- if (c == LINEFEED || c == CARRIAGE_RETURN) {
- if (c == CARRIAGE_RETURN && stream.peek() == LINEFEED) {
- stream.read(); // <= skip the trailing \n in case of \r\n termination
- }
-
- return new String(lineBuffer, 0, linePosition);
- } else {
- // Expand line buffer size if neccessary. Reserve at least 2 characters
- // for potential line-terminators in return string
-
- if (linePosition > (lineBuffer.length - 3)) {
- final char[] temp = new char[BUFFER_OVERFLOW_INCREASE_FACTOR * lineBuffer.length];
- System.arraycopy(lineBuffer, 0, temp, 0, lineBuffer.length);
- lineBuffer = temp;
- }
-
- lineBuffer[linePosition++] = c;
- }
- }
- }
-
- /**
- * Same as {@link #readLine(PositionalBufferedStream)} but uses the stream provided in the constructor
- *
- * @return
- */
- public final String readLine() throws IOException{
- if ( is == null ){
- throw new TribbleException("readLine() called without an explicit stream argument but no default stream was provided to the class on creation");
- }
- return readLine(is);
- }
-
- @Override
- public void close() {
- if ( is != null ) is.close();
- lineBuffer = null;
- }
-
- public static void main(final String[] args) throws Exception {
- final File testFile = new File(args[0]);
- final int iterations = Integer.valueOf(args[1]);
- final boolean includeBufferedReader = Boolean.valueOf(args[2]);
- long t0, lineCount, dt;
- double rate;
-
- System.out.printf("Testing %s%n", args[0]);
- for (int i = 0; i < iterations; i++) {
- if ( includeBufferedReader ) {
- final BufferedReader reader2 = new BufferedReader(new FileReader(testFile));
- t0 = System.currentTimeMillis();
- lineCount = 0;
- while (reader2.readLine() != null) {
- lineCount++;
- }
- dt = System.currentTimeMillis() - t0;
- rate = ((double) lineCount) / dt;
- printStatus("BufferedReader", lineCount, rate, dt);
- reader2.close();
- }
-
- if ( includeBufferedReader ) {
- final LongLineBufferedReader longLineBufferedReader = new LongLineBufferedReader(new BufferedReader(new FileReader(testFile)));
- t0 = System.currentTimeMillis();
- lineCount = 0;
- while (longLineBufferedReader.readLine() != null) {
- lineCount++;
- }
- dt = System.currentTimeMillis() - t0;
- rate = ((double) lineCount) / dt;
- printStatus("BufferedReader", lineCount, rate, dt);
- longLineBufferedReader.close();
- }
-
- final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(testFile));
- final LineReader reader = new AsciiLineReader(pbs);
- t0 = System.currentTimeMillis();
- lineCount = 0;
- while (reader.readLine() != null) {
- lineCount++;
- }
- dt = System.currentTimeMillis() - t0;
- rate = ((double) lineCount) / dt;
- printStatus("PositionalBufferedStream", lineCount, rate, dt);
- pbs.close();
- }
- }
-
- private static final void printStatus(final String name, final long lineCount, final double rate, final long dt) {
- System.out.printf("%30s: %d lines read. Rate = %.2e lines per second. DT = %d%n", name, lineCount, rate, dt);
- System.out.flush();
- }
-}
-
diff --git a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java b/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java
deleted file mode 100644
index 5db3b91..0000000
--- a/src/main/java/htsjdk/tribble/readers/AsciiLineReaderIterator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.AbstractIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.Tuple;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * A class that iterates over the lines and line positions in an {@link AsciiLineReader}.
- *
- * This class is slower than other {@link LineIterator}s because it is driven by {@link AsciiLineReader}, but offers the benefit of
- * implementing {@link htsjdk.samtools.util.LocationAware}, which is required for indexing. If you do not require {@link htsjdk.samtools.util.LocationAware}, consider using
- * {@link LineIteratorImpl} as an alternative to this class.
- *
- * Note an important distinction in the way this class and its inner iterator differ: in the inner iterator, the position stored with
- * a line is the position at the start of that line. However, {@link #getPosition()} of the outer class must return the position at the
- * end of the most-recently-returned line (or the start of the underlying {@link AsciiLineReader}, if no line has been read). The latter
- * bit of logic here is required to conform with the interface described by {@link htsjdk.samtools.util.LocationAware#getPosition()}.
- *
- * @author mccowan
- */
-public class AsciiLineReaderIterator implements LocationAware, LineIterator, Closeable {
- private final AsciiLineReader asciiLineReader;
- private final TupleIterator i;
- private Tuple<String, Long> current = null;
-
- public AsciiLineReaderIterator(final AsciiLineReader asciiLineReader) {
- this.asciiLineReader = asciiLineReader;
- this.i = new TupleIterator();
- }
-
- @Override
- public void close() throws IOException {
- CloserUtil.close(asciiLineReader);
- }
-
- @Override
- public boolean hasNext() {
- return i.hasNext();
- }
-
- @Override
- public String next() {
- current = i.next();
- return current.a;
- }
-
- @Override
- public void remove() {
- i.remove();
- }
-
- /**
- * Returns the byte position at the end of the most-recently-read line (a.k.a., the beginning of the next line) from {@link #next()} in
- * the underlying {@link AsciiLineReader}.
- */
- @Override
- public long getPosition() {
- return i.getPosition();
- }
-
- @Override
- public String peek() {
- return i.peek().a;
- }
-
- /**
- * This is stored internally since it iterates over {@link htsjdk.samtools.util.Tuple}, not {@link String} (and the outer
- * class can't do both).
- */
- private class TupleIterator extends AbstractIterator<Tuple<String, Long>> implements LocationAware {
-
- public TupleIterator() {
- hasNext(); // Initialize the iterator, which appears to be a requirement of the parent class. TODO: Really?
- }
-
- @Override
- protected Tuple<String, Long> advance() {
- final String line;
- final long position = asciiLineReader.getPosition(); // A line's position is where it starts, so get it before reading the line.
- try {
- line = asciiLineReader.readLine();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- return line == null ? null : new Tuple<String, Long>(line, position);
- }
-
- /** Returns the byte position at the beginning of the next line. */
- @Override
- public long getPosition() {
- final Tuple<String, Long> peek = peek();
- // Be careful: peek will be null at the end of the stream.
- return peek != null ? peek.b : asciiLineReader.getPosition();
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineIterator.java b/src/main/java/htsjdk/tribble/readers/LineIterator.java
deleted file mode 100644
index f582025..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineIterator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package htsjdk.tribble.readers;
-
-import java.util.Iterator;
-
-/**
- * A very simple descriptor for line-iterables.
- * @author mccowan
- */
-public interface LineIterator extends Iterator<String> {
- /** Peeks at the next line, without expending any elements in the underlying iterator. */
- public String peek();
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java b/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java
deleted file mode 100644
index be24dc7..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineIteratorImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.AbstractIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/** A simple iterator over the elements in LineReader. */
-public class LineIteratorImpl extends AbstractIterator<String> implements LineIterator, Closeable {
- private final LineReader lineReader;
-
- /**
- * @param lineReader The line reader whose elements are to be iterated over.
- */
- public LineIteratorImpl(final LineReader lineReader) {
- this.lineReader = lineReader;
- }
-
- @Override
- protected String advance() {
- try {
- return lineReader.readLine();
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- @Override
- public void close() throws IOException {
- CloserUtil.close(lineReader);
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineReader.java b/src/main/java/htsjdk/tribble/readers/LineReader.java
deleted file mode 100644
index 969b6b5..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineReader.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import java.io.Closeable;
-import java.io.IOException;
-
-/**
- * Interface for line-oriented readers.
- */
-public interface LineReader extends Closeable {
-
- /**
- * @return The next "line" from the source. Typically a line is a set of characters
- * terminated by '\n', '\r', or '\r\n'. The line-terminator is not included
- * @throws IOException
- */
- public String readLine() throws IOException;
-
-
- public void close();
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java b/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java
deleted file mode 100644
index 83a0545..0000000
--- a/src/main/java/htsjdk/tribble/readers/LineReaderUtil.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package htsjdk.tribble.readers;
-
-import java.io.InputStream;
-import java.io.StringReader;
-
-/**
- * A collection of factories for generating {@link LineReader}s.
- *
- * @Deprecated use {@link SynchronousLineReader} directly.
- * @author mccowan
- */
- at Deprecated
-public class LineReaderUtil {
- @Deprecated
- public enum LineReaderOption {
- ASYNCHRONOUS, //Note: the asynchronous option has no effect - this class does not provide asynchronous reading anymore
- SYNCHRONOUS
- }
-
- /**
- * Creates a line reader from the given stream.
- * @Deprecated use <code>new SynchronousLineReader(stream);</code>
- */
- @Deprecated
- public static LineReader fromBufferedStream(final InputStream stream) {
- return new SynchronousLineReader(stream);
- }
-
- /**
- * Creates a line reader from the given string reader.
- * @Deprecated use <code>new SynchronousLineReader(stringReader);</code>
- */
- @Deprecated
- public static LineReader fromStringReader(final StringReader stringReader) {
- return new SynchronousLineReader(stringReader);
- }
-
- /**
- * Creates a line reader from the given string reader.
- * @Deprecated Asynchronous mode is not going to be supported. Use <code>new SynchronousLineReader(stringReader);</code>
- */
- @Deprecated
- public static LineReader fromStringReader(final StringReader stringReader, final Object ignored) {
- return new SynchronousLineReader(stringReader);
- }
-
- /**
- * Convenience factory for composing a LineReader from an InputStream.
- * @Deprecated Asynchronous mode is not going to be supported. Use <code>new SynchronousLineReader(bufferedStream);</code>
- */
- @Deprecated
- public static LineReader fromBufferedStream(final InputStream bufferedStream, final Object ignored) {
- return new SynchronousLineReader(bufferedStream);
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java b/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java
deleted file mode 100644
index 5ca8e8d..0000000
--- a/src/main/java/htsjdk/tribble/readers/LongLineBufferedReader.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.tribble.readers;
-
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * A variant of {@link java.io.BufferedReader} with improved performance reading files with long lines.
- *
- * This class is almost identical to BufferedReader, but it retains a single line buffer for accumulating characters in a line, and allows
- * its size to grow. Conversely, {@link java.io.BufferedReader} assumes each new line will be approximately 80 characters and its
- * performance suffers when that is not the case.
- *
- * Unlike {@link java.io.BufferedReader}, this class is not thread safe.
- *
- * @author mccowan
- */
-public class LongLineBufferedReader extends Reader {
-
- private Reader in;
-
- private char cb[];
- private int nChars, nextChar;
-
- private static final int INVALIDATED = -2;
- private static final int UNMARKED = -1;
- private int markedChar = UNMARKED;
- private int readAheadLimit = 0; /* Valid only when markedChar > 0 */
-
- /**
- * If the next character is a line feed, skip it
- */
- private boolean skipLF = false;
-
- /**
- * The skipLF flag when the mark was set
- */
- private boolean markedSkipLF = false;
-
- private static final int DEFAULT_CHAR_BUFFER_SIZE = 8192;
- private static final int DEFAULT_EXPECTED_LINE_LENGTH = 80;
-
- private StringBuilder lineBuffer = new StringBuilder(DEFAULT_EXPECTED_LINE_LENGTH);
-
- /**
- * Creates a buffering character-input stream that uses an input buffer of
- * the specified size.
- *
- * @param in A Reader
- * @param sz Input-buffer size
- * @throws IllegalArgumentException If sz is <= 0
- */
- public LongLineBufferedReader(Reader in, int sz) {
- super(in);
- if (sz <= 0)
- throw new IllegalArgumentException("Buffer size <= 0");
- this.in = in;
- cb = new char[sz];
- nextChar = nChars = 0;
- }
-
- /**
- * Creates a buffering character-input stream that uses a default-sized
- * input buffer.
- *
- * @param in A Reader
- */
- public LongLineBufferedReader(Reader in) {
- this(in, DEFAULT_CHAR_BUFFER_SIZE);
- }
-
- /**
- * Checks to make sure that the stream has not been closed
- */
- private void ensureOpen() throws IOException {
- if (in == null)
- throw new IOException("Stream closed");
- }
-
- /**
- * Fills the input buffer, taking the mark into account if it is valid.
- */
- private void fill() throws IOException {
- int dst;
- if (markedChar <= UNMARKED) {
- /* No mark */
- dst = 0;
- } else {
- /* Marked */
- int delta = nextChar - markedChar;
- if (delta >= readAheadLimit) {
- /* Gone past read-ahead limit: Invalidate mark */
- markedChar = INVALIDATED;
- readAheadLimit = 0;
- dst = 0;
- } else {
- if (readAheadLimit <= cb.length) {
- /* Shuffle in the current buffer */
- System.arraycopy(cb, markedChar, cb, 0, delta);
- markedChar = 0;
- dst = delta;
- } else {
- /* Reallocate buffer to accommodate read-ahead limit */
- char ncb[] = new char[readAheadLimit];
- System.arraycopy(cb, markedChar, ncb, 0, delta);
- cb = ncb;
- markedChar = 0;
- dst = delta;
- }
- nextChar = nChars = delta;
- }
- }
-
- int n;
- do {
- n = in.read(cb, dst, cb.length - dst);
- } while (n == 0);
- if (n > 0) {
- nChars = dst + n;
- nextChar = dst;
- }
- }
-
- /**
- * Reads a single character.
- *
- * @return The character read, as an integer in the range
- * 0 to 65535 (<tt>0x00-0xffff</tt>), or -1 if the
- * end of the stream has been reached
- * @throws IOException If an I/O error occurs
- */
- public int read() throws IOException {
- synchronized (lock) {
- ensureOpen();
- for (; ; ) {
- if (nextChar >= nChars) {
- fill();
- if (nextChar >= nChars)
- return -1;
- }
- if (skipLF) {
- skipLF = false;
- if (cb[nextChar] == '\n') {
- nextChar++;
- continue;
- }
- }
- return cb[nextChar++];
- }
- }
- }
-
- /**
- * Reads characters into a portion of an array, reading from the underlying
- * stream if necessary.
- */
- private int read1(char[] cbuf, int off, int len) throws IOException {
- if (nextChar >= nChars) {
- /* If the requested length is at least as large as the buffer, and
- if there is no mark/reset activity, and if line feeds are not
- being skipped, do not bother to copy the characters into the
- local buffer. In this way buffered streams will cascade
- harmlessly. */
- if (len >= cb.length && markedChar <= UNMARKED && !skipLF) {
- return in.read(cbuf, off, len);
- }
- fill();
- }
- if (nextChar >= nChars) return -1;
- if (skipLF) {
- skipLF = false;
- if (cb[nextChar] == '\n') {
- nextChar++;
- if (nextChar >= nChars)
- fill();
- if (nextChar >= nChars)
- return -1;
- }
- }
- int n = Math.min(len, nChars - nextChar);
- System.arraycopy(cb, nextChar, cbuf, off, n);
- nextChar += n;
- return n;
- }
-
- /**
- * Reads characters into a portion of an array.
- * <p/>
- * <p> This method implements the general contract of the corresponding
- * <code>{@link Reader#read(char[], int, int) read}</code> method of the
- * <code>{@link Reader}</code> class. As an additional convenience, it
- * attempts to read as many characters as possible by repeatedly invoking
- * the <code>read</code> method of the underlying stream. This iterated
- * <code>read</code> continues until one of the following conditions becomes
- * true: <ul>
- * <p/>
- * <li> The specified number of characters have been read,
- * <p/>
- * <li> The <code>read</code> method of the underlying stream returns
- * <code>-1</code>, indicating end-of-file, or
- * <p/>
- * <li> The <code>ready</code> method of the underlying stream
- * returns <code>false</code>, indicating that further input requests
- * would block.
- * <p/>
- * </ul> If the first <code>read</code> on the underlying stream returns
- * <code>-1</code> to indicate end-of-file then this method returns
- * <code>-1</code>. Otherwise this method returns the number of characters
- * actually read.
- * <p/>
- * <p> Subclasses of this class are encouraged, but not required, to
- * attempt to read as many characters as possible in the same fashion.
- * <p/>
- * <p> Ordinarily this method takes characters from this stream's character
- * buffer, filling it from the underlying stream as necessary. If,
- * however, the buffer is empty, the mark is not valid, and the requested
- * length is at least as large as the buffer, then this method will read
- * characters directly from the underlying stream into the given array.
- * Thus redundant <code>BufferedReaderTwo</code>s will not copy data
- * unnecessarily.
- *
- * @param cbuf Destination buffer
- * @param off Offset at which to start storing characters
- * @param len Maximum number of characters to read
- * @return The number of characters read, or -1 if the end of the
- * stream has been reached
- * @throws IOException If an I/O error occurs
- */
- public int read(char cbuf[], int off, int len) throws IOException {
- synchronized (lock) {
- ensureOpen();
- if ((off < 0) || (off > cbuf.length) || (len < 0) ||
- ((off + len) > cbuf.length) || ((off + len) < 0)) {
- throw new IndexOutOfBoundsException();
- } else if (len == 0) {
- return 0;
- }
-
- int n = read1(cbuf, off, len);
- if (n <= 0) return n;
- while ((n < len) && in.ready()) {
- int n1 = read1(cbuf, off + n, len - n);
- if (n1 <= 0) break;
- n += n1;
- }
- return n;
- }
- }
-
- /**
- * Reads a line of text. A line is considered to be terminated by any one
- * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
- * followed immediately by a linefeed.
- *
- * @param ignoreLF If true, the next '\n' will be skipped
- * @return A String containing the contents of the line, not including
- * any line-termination characters, or null if the end of the
- * stream has been reached
- * @throws IOException If an I/O error occurs
- * @see java.io.LineNumberReader#readLine()
- */
- String readLine(boolean ignoreLF) throws IOException {
- int startChar;
- lineBuffer.setLength(0);
-
- synchronized (lock) {
- ensureOpen();
- boolean omitLF = ignoreLF || skipLF;
-
- bufferLoop:
- for (; ; ) {
-
- if (nextChar >= nChars)
- fill();
- if (nextChar >= nChars) { /* EOF */
- if (lineBuffer != null && lineBuffer.length() > 0)
- return lineBuffer.toString();
- else
- return null;
- }
- boolean eol = false;
- char c = 0;
- int i;
-
- /* Skip a leftover '\n', if necessary */
- if (omitLF && (cb[nextChar] == '\n'))
- nextChar++;
- skipLF = false;
- omitLF = false;
-
- charLoop:
- for (i = nextChar; i < nChars; i++) {
- c = cb[i];
- if ((c == '\n') || (c == '\r')) {
- eol = true;
- break charLoop;
- }
- }
-
- startChar = nextChar;
- nextChar = i;
-
- if (eol) {
- String str;
- lineBuffer.append(cb, startChar, i - startChar);
- str = lineBuffer.toString();
- nextChar++;
- if (c == '\r') {
- skipLF = true;
- }
- return str;
- }
-
- lineBuffer.append(cb, startChar, i - startChar);
- }
- }
- }
-
- /**
- * Reads a line of text. A line is considered to be terminated by any one
- * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
- * followed immediately by a linefeed.
- *
- * @return A String containing the contents of the line, not including
- * any line-termination characters, or null if the end of the
- * stream has been reached
- * @throws IOException If an I/O error occurs
- */
- public String readLine() throws IOException {
- return readLine(false);
- }
-
- /**
- * Skips characters.
- *
- * @param n The number of characters to skip
- * @return The number of characters actually skipped
- * @throws IllegalArgumentException If <code>n</code> is negative.
- * @throws IOException If an I/O error occurs
- */
- public long skip(long n) throws IOException {
- if (n < 0L) {
- throw new IllegalArgumentException("skip value is negative");
- }
- synchronized (lock) {
- ensureOpen();
- long r = n;
- while (r > 0) {
- if (nextChar >= nChars)
- fill();
- if (nextChar >= nChars) /* EOF */
- break;
- if (skipLF) {
- skipLF = false;
- if (cb[nextChar] == '\n') {
- nextChar++;
- }
- }
- long d = nChars - nextChar;
- if (r <= d) {
- nextChar += r;
- r = 0;
- break;
- } else {
- r -= d;
- nextChar = nChars;
- }
- }
- return n - r;
- }
- }
-
- /**
- * Tells whether this stream is ready to be read. A buffered character
- * stream is ready if the buffer is not empty, or if the underlying
- * character stream is ready.
- *
- * @throws IOException If an I/O error occurs
- */
- public boolean ready() throws IOException {
- synchronized (lock) {
- ensureOpen();
-
- /*
- * If newline needs to be skipped and the next char to be read
- * is a newline character, then just skip it right away.
- */
- if (skipLF) {
- /* Note that in.ready() will return true if and only if the next
- * read on the stream will not block.
- */
- if (nextChar >= nChars && in.ready()) {
- fill();
- }
- if (nextChar < nChars) {
- if (cb[nextChar] == '\n')
- nextChar++;
- skipLF = false;
- }
- }
- return (nextChar < nChars) || in.ready();
- }
- }
-
- /**
- * Tells whether this stream supports the mark() operation, which it does.
- */
- public boolean markSupported() {
- return true;
- }
-
- /**
- * Marks the present position in the stream. Subsequent calls to reset()
- * will attempt to reposition the stream to this point.
- *
- * @param readAheadLimit Limit on the number of characters that may be
- * read while still preserving the mark. An attempt
- * to reset the stream after reading characters
- * up to this limit or beyond may fail.
- * A limit value larger than the size of the input
- * buffer will cause a new buffer to be allocated
- * whose size is no smaller than limit.
- * Therefore large values should be used with care.
- * @throws IllegalArgumentException If readAheadLimit is < 0
- * @throws IOException If an I/O error occurs
- */
- public void mark(int readAheadLimit) throws IOException {
- if (readAheadLimit < 0) {
- throw new IllegalArgumentException("Read-ahead limit < 0");
- }
- synchronized (lock) {
- ensureOpen();
- this.readAheadLimit = readAheadLimit;
- markedChar = nextChar;
- markedSkipLF = skipLF;
- }
- }
-
- /**
- * Resets the stream to the most recent mark.
- *
- * @throws IOException If the stream has never been marked,
- * or if the mark has been invalidated
- */
- public void reset() throws IOException {
- synchronized (lock) {
- ensureOpen();
- if (markedChar < 0)
- throw new IOException((markedChar == INVALIDATED)
- ? "Mark invalid"
- : "Stream not marked");
- nextChar = markedChar;
- skipLF = markedSkipLF;
- }
- }
-
- public void close() throws IOException {
- synchronized (lock) {
- if (in == null)
- return;
- in.close();
- in = null;
- cb = null;
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/Positional.java b/src/main/java/htsjdk/tribble/readers/Positional.java
deleted file mode 100644
index 50f4039..0000000
--- a/src/main/java/htsjdk/tribble/readers/Positional.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.LocationAware;
-
-import java.io.IOException;
-
-/**
- * Minimal interface for an object at support getting the current position in the stream / writer / file, as well as a handful of other
- * reader-like features.
- *
- * @author depristo
- */
-public interface Positional extends LocationAware {
- /**
- * Is the stream done? Equivalent to ! hasNext() for an iterator?
- * @return true if the stream has reached EOF, false otherwise
- */
- public boolean isDone() throws IOException;
-
- /**
- * Skip the next nBytes in the stream.
- * @param nBytes to skip, must be >= 0
- * @return the number of bytes actually skippped.
- * @throws IOException
- */
- public long skip(long nBytes) throws IOException;
-
- /**
- * Return the next byte in the first, without actually reading it from the stream.
- *
- * Has the same output as read()
- *
- * @return the next byte, or -1 if EOF encountered
- * @throws IOException
- */
- public int peek() throws IOException;
-}
diff --git a/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java b/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java
deleted file mode 100644
index ac642df..0000000
--- a/src/main/java/htsjdk/tribble/readers/PositionalBufferedStream.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 2007-2009 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TribbleException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-/**
- * A wrapper around an {@code InputStream} which performs it's own buffering, and keeps track of the position.
- *
- * @author depristo
- */
-public final class PositionalBufferedStream extends InputStream implements Positional {
- final InputStream is;
- final byte[] buffer;
- int nextChar;
- int nChars;
- long position;
-
- public PositionalBufferedStream(final InputStream is) {
- this(is, 512000);
- }
-
- public PositionalBufferedStream(final InputStream is, final int bufferSize) {
- this.is = is;
- buffer = new byte[bufferSize];
- nextChar = nChars = 0;
- }
-
- public final long getPosition() {
- return position;
- }
-
- @Override
- public final int read() throws IOException {
- final int c = peek();
- if ( c >= 0 ) {
- // update position and buffer offset if peek says we aren't yet done
- position++;
- nextChar++;
- }
- return c;
- }
-
- @Override
- public final int read(final byte[] bytes, final int start, final int len) throws IOException {
- if ( len == 0 ) // If len is zero, then no bytes are read and 0 is returned
- return 0;
- if (nChars < 0) // If no byte is available because the stream is at end of file, the value -1 is returned
- return -1;
- else {
- int nRead = 0;
- int remaining = len;
-
- while ( remaining > 0 ) {
- // Try to Refill buffer if at the end of current buffer
- if ( nChars == nextChar )
- if ( fill() < 0 ) { // EOF
- break;
- }
-
- // we copy as many bytes from the buffer as possible, up to the number of need
- final int nCharsToCopy = Math.min(nChars - nextChar, remaining);
- System.arraycopy(buffer, nextChar, bytes, start + nRead, nCharsToCopy);
-
- // update nextChar (pointer into buffer) and keep track of nRead and remaining
- nextChar += nCharsToCopy;
- nRead += nCharsToCopy;
- remaining -= nCharsToCopy;
- }
-
- // make sure we update our position tracker to reflect having advanced by nRead bytes
- position += nRead;
-
- /** Conform to {@link InputStream#read(byte[], int, int)} contract by returning -1 if EOF and no data was read. */
- return nRead == 0 ? -1 : nRead;
- }
- }
-
- @Override
- public final int read(final byte[] bytes) throws IOException {
- return read(bytes, 0, bytes.length);
- }
-
- @Override
- public final boolean isDone() throws IOException {
- return nChars == -1 || peek() == -1;
- }
-
- @Override
- public final int peek() throws IOException {
- // Check for EOF
- if (nChars < 0) {
- return -1;
- } else if (nextChar == nChars){
- //Try to Refill buffer if at the end of current buffer
- if ( fill() < 0 ){
- return -1;
- }
- }
-
- return byteToInt(buffer[nextChar]);
- }
-
- private final int fill() throws IOException {
- nChars = is.read(buffer);
- nextChar = 0;
- return nChars;
- }
-
- public final long skip(final long nBytes) throws IOException {
- long remainingToSkip = nBytes;
-
- // because we have this buffer, that may be shorter than nBytes
- // we loop while there are bytes to skip, filling the buffer
- // When the buffer contains enough data that we have less than
- // its less left to skip we increase nextChar by the remaining
- // amount
- while ( remainingToSkip > 0 && ! isDone() ) {
- final long bytesLeftInBuffer = nChars - nextChar;
- if ( remainingToSkip > bytesLeftInBuffer ) {
- // we need to refill the buffer and continue our skipping
- remainingToSkip -= bytesLeftInBuffer;
- fill();
- } else {
- // there are enough bytes in the buffer to not read again
- // we just push forward the pointer nextChar
- nextChar += remainingToSkip;
- remainingToSkip = 0;
- }
- }
-
- final long actuallySkipped = nBytes - remainingToSkip;
- position += actuallySkipped;
- return actuallySkipped;
- }
-
- public final void close() {
- try {
- is.close();
- } catch (IOException ex) {
- new TribbleException("Failed to close PositionalBufferedStream", ex);
- }
- }
-
- private final static int byteToInt(byte b) {
- return b & 0xFF;
- }
-
- public static void main(String[] args) throws Exception {
- final File testFile = new File(args[0]);
- final int iterations = Integer.valueOf(args[1]);
- final boolean includeInputStream = Boolean.valueOf(args[2]);
- final boolean doReadFileInChunks = Boolean.valueOf(args[3]);
-
- System.out.printf("Testing %s%n", args[0]);
- for (int i = 0; i < iterations; i++) {
- if ( includeInputStream ) {
- final InputStream is = new FileInputStream(testFile);
- if ( doReadFileInChunks )
- readFileInChunks("InputStream", is);
- else
- readFileByLine("InputStream", is);
- is.close();
- }
-
- final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(testFile));
- if ( doReadFileInChunks )
- readFileInChunks("PositionalBufferedStream", pbs);
- else
- readFileByLine("PositionalBufferedStream", pbs);
- pbs.close();
- }
- }
-
- private static void readFileByLine(final String name, final InputStream is) throws IOException {
- final BufferedReader reader2 = new BufferedReader(new InputStreamReader(is));
- final long t0 = System.currentTimeMillis();
- long lineCount = 0;
- while (reader2.readLine() != null) {
- lineCount++;
- }
- final long dt = System.currentTimeMillis() - t0;
- final double rate = ((double) lineCount) / dt;
- printStatus(name, lineCount, rate, dt);
- reader2.close();
- }
-
- private static void readFileInChunks(final String name, final InputStream is) throws IOException {
- final long t0 = System.currentTimeMillis();
- long chunk = 0;
- final byte[] bytes = new byte[4096];
- while (is.read(bytes) != -1) {
- chunk++;
- }
- final long dt = System.currentTimeMillis() - t0;
- final double rate = ((double) chunk) / dt;
- printStatus(name, chunk, rate, dt);
- is.close();
- }
-
-
- private static final void printStatus(final String name, long lineCount, double rate, long dt) {
- System.out.printf("%30s: %d lines read. Rate = %.2e lines per second. DT = %d%n", name, lineCount, rate, dt);
- System.out.flush();
- }
-}
-
diff --git a/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java b/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java
deleted file mode 100644
index 5de8b22..0000000
--- a/src/main/java/htsjdk/tribble/readers/SynchronousLineReader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-/**
- * Implementation of {@link LineReader} that reads lines directly from the underlying stream or reader.
- */
-public final class SynchronousLineReader implements LineReader{
- private final LongLineBufferedReader longLineBufferedReader;
-
- public SynchronousLineReader(final InputStream stream){
- this(new InputStreamReader(stream));
- }
-
- public SynchronousLineReader(final Reader reader){
- this.longLineBufferedReader = new LongLineBufferedReader(reader);
- }
-
- @Override
- public String readLine() {
- try {
- return longLineBufferedReader.readLine();
- } catch (final IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- @Override
- public void close() {
- CloserUtil.close(longLineBufferedReader);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java b/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java
deleted file mode 100644
index 49b6f0c..0000000
--- a/src/main/java/htsjdk/tribble/readers/TabixIteratorLineReader.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.util.RuntimeIOException;
-
-import java.io.IOException;
-
-/**
- * @author Jim Robinson
- * @date 2/11/12
- */
-public class TabixIteratorLineReader implements LineReader {
-
- TabixReader.Iterator iterator;
-
-
- public TabixIteratorLineReader(TabixReader.Iterator iterator) {
- this.iterator = iterator;
- }
-
- public String readLine() {
- try {
- return iterator != null ? iterator.next() : null;
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- public void close() {
- // Ignore -
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readers/TabixReader.java b/src/main/java/htsjdk/tribble/readers/TabixReader.java
deleted file mode 100644
index 8867d07..0000000
--- a/src/main/java/htsjdk/tribble/readers/TabixReader.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.readers;
-
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.tribble.util.TabixUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Heng Li <hengli at broadinstitute.org>
- */
-public class TabixReader {
- private String mFn;
- private String mIdxFn;
- private BlockCompressedInputStream mFp;
-
- private int mPreset;
- private int mSc;
- private int mBc;
- private int mEc;
- private int mMeta;
- //private int mSkip; (not used)
- private String[] mSeq;
-
- private Map<String, Integer> mChr2tid;
-
- private static int MAX_BIN = 37450;
- //private static int TAD_MIN_CHUNK_GAP = 32768; (not used)
- private static int TAD_LIDX_SHIFT = 14;
-
- protected static class TPair64 implements Comparable<TPair64> {
- long u, v;
-
- public TPair64(final long _u, final long _v) {
- u = _u;
- v = _v;
- }
-
- public TPair64(final TPair64 p) {
- u = p.u;
- v = p.v;
- }
-
- public int compareTo(final TPair64 p) {
- return u == p.u ? 0 : ((u < p.u) ^ (u < 0) ^ (p.u < 0)) ? -1 : 1; // unsigned 64-bit comparison
- }
- }
-
- protected static class TIndex {
- HashMap<Integer, TPair64[]> b; // binning index
- long[] l; // linear index
- }
-
- protected TIndex[] mIndex;
-
- private static class TIntv {
- int tid, beg, end;
- }
-
- private static boolean less64(final long u, final long v) { // unsigned 64-bit comparison
- return (u < v) ^ (u < 0) ^ (v < 0);
- }
-
- /**
- * @param fn File name of the data file
- */
- public TabixReader(final String fn) throws IOException {
- this(fn, null, SeekableStreamFactory.getInstance().getBufferedStream(SeekableStreamFactory.getInstance().getStreamFor(fn)));
- }
-
- /**
- * @param fn File name of the data file
- * @param idxFn Full path to the index file. Auto-generated if null
- */
- public TabixReader(final String fn, final String idxFn) throws IOException {
- this(fn, idxFn, SeekableStreamFactory.getInstance().getBufferedStream(SeekableStreamFactory.getInstance().getStreamFor(fn)));
- }
-
- /**
- * @param fn File name of the data file (used for error messages only)
- * @param stream Seekable stream from which the data is read
- */
- public TabixReader(final String fn, SeekableStream stream) throws IOException {
- this(fn, null, stream);
- }
-
- /**
- * @param fn File name of the data file (used for error messages only)
- * @param idxFn Full path to the index file. Auto-generated if null
- * @param stream Seekable stream from which the data is read
- */
- public TabixReader(final String fn, final String idxFn, SeekableStream stream) throws IOException {
- mFn = fn;
- mFp = new BlockCompressedInputStream(stream);
- if(idxFn == null){
- mIdxFn = ParsingUtils.appendToPath(fn, TabixUtils.STANDARD_INDEX_EXTENSION);
- } else {
- mIdxFn = idxFn;
- }
- readIndex();
- }
-
- /** return the source (filename/URL) of that reader */
- public String getSource()
- {
- return this.mFn;
- }
-
- private static int reg2bins(final int beg, final int _end, final int[] list) {
- int i = 0, k, end = _end;
- if (beg >= end) return 0;
- if (end >= 1 << 29) end = 1 << 29;
- --end;
- list[i++] = 0;
- for (k = 1 + (beg >> 26); k <= 1 + (end >> 26); ++k) list[i++] = k;
- for (k = 9 + (beg >> 23); k <= 9 + (end >> 23); ++k) list[i++] = k;
- for (k = 73 + (beg >> 20); k <= 73 + (end >> 20); ++k) list[i++] = k;
- for (k = 585 + (beg >> 17); k <= 585 + (end >> 17); ++k) list[i++] = k;
- for (k = 4681 + (beg >> 14); k <= 4681 + (end >> 14); ++k) list[i++] = k;
- return i;
- }
-
- public static int readInt(final InputStream is) throws IOException {
- byte[] buf = new byte[4];
- is.read(buf);
- return ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getInt();
- }
-
- public static long readLong(final InputStream is) throws IOException {
- byte[] buf = new byte[8];
- is.read(buf);
- return ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).getLong();
- }
-
- public static String readLine(final InputStream is) throws IOException {
- StringBuffer buf = new StringBuffer();
- int c;
- while ((c = is.read()) >= 0 && c != '\n')
- buf.append((char) c);
- if (c < 0) return null;
- return buf.toString();
- }
-
- /**
- * Read the Tabix index from a file
- *
- * @param fp File pointer
- */
- private void readIndex(SeekableStream fp) throws IOException {
- if (fp == null) return;
- BlockCompressedInputStream is = new BlockCompressedInputStream(fp);
- byte[] buf = new byte[4];
-
- is.read(buf, 0, 4); // read "TBI\1"
- mSeq = new String[readInt(is)]; // # sequences
- mChr2tid = new HashMap<String, Integer>();
- mPreset = readInt(is);
- mSc = readInt(is);
- mBc = readInt(is);
- mEc = readInt(is);
- mMeta = readInt(is);
- readInt(is);//unused
- // read sequence dictionary
- int i, j, k, l = readInt(is);
- buf = new byte[l];
- is.read(buf);
- for (i = j = k = 0; i < buf.length; ++i) {
- if (buf[i] == 0) {
- byte[] b = new byte[i - j];
- System.arraycopy(buf, j, b, 0, b.length);
- String s = new String(b);
- mChr2tid.put(s, k);
- mSeq[k++] = s;
- j = i + 1;
- }
- }
- // read the index
- mIndex = new TIndex[mSeq.length];
- for (i = 0; i < mSeq.length; ++i) {
- // the binning index
- int n_bin = readInt(is);
- mIndex[i] = new TIndex();
- mIndex[i].b = new HashMap<Integer, TPair64[]>(n_bin);
- for (j = 0; j < n_bin; ++j) {
- int bin = readInt(is);
- TPair64[] chunks = new TPair64[readInt(is)];
- for (k = 0; k < chunks.length; ++k) {
- long u = readLong(is);
- long v = readLong(is);
- chunks[k] = new TPair64(u, v); // in C, this is inefficient
- }
- mIndex[i].b.put(bin, chunks);
- }
- // the linear index
- mIndex[i].l = new long[readInt(is)];
- for (k = 0; k < mIndex[i].l.length; ++k)
- mIndex[i].l[k] = readLong(is);
- }
- // close
- is.close();
- }
-
- /**
- * Read the Tabix index from the default file.
- */
- private void readIndex() throws IOException {
- ISeekableStreamFactory ssf = SeekableStreamFactory.getInstance();
- readIndex(ssf.getBufferedStream(ssf.getStreamFor(mIdxFn), 128000));
- }
-
- /**
- * Read one line from the data file.
- */
- public String readLine() throws IOException {
- return readLine(mFp);
- }
-
- /** return chromosome ID or -1 if it is unknown */
- public int chr2tid(final String chr) {
- Integer tid=this.mChr2tid.get(chr);
- return tid==null?-1:tid;
- }
-
- /** return the chromosomes in that tabix file */
- public Set<String> getChromosomes()
- {
- return Collections.unmodifiableSet(this.mChr2tid.keySet());
- }
-
- /**
- * Parse a region in the format of "chr1", "chr1:100" or "chr1:100-1000"
- *
- * @param reg Region string
- * @return An array where the three elements are sequence_id,
- * region_begin and region_end. On failure, sequence_id==-1.
- */
- public int[] parseReg(final String reg) { // FIXME: NOT working when the sequence name contains : or -.
- String chr;
- int colon, hyphen;
- int[] ret = new int[3];
- colon = reg.indexOf(':');
- hyphen = reg.indexOf('-');
- chr = colon >= 0 ? reg.substring(0, colon) : reg;
- ret[1] = colon >= 0 ? Integer.parseInt(reg.substring(colon + 1, hyphen >= 0 ? hyphen : reg.length())) - 1 : 0;
- ret[2] = hyphen >= 0 ? Integer.parseInt(reg.substring(hyphen + 1)) : 0x7fffffff;
- ret[0] = this.chr2tid(chr);
- return ret;
- }
-
- private TIntv getIntv(final String s) {
- TIntv intv = new TIntv();
- int col = 0, end = 0, beg = 0;
- while ((end = s.indexOf('\t', beg)) >= 0 || end == -1) {
- ++col;
- if (col == mSc) {
- intv.tid = chr2tid(end != -1 ? s.substring(beg, end) : s.substring(beg));
- } else if (col == mBc) {
- intv.beg = intv.end = Integer.parseInt(end != -1 ? s.substring(beg, end) : s.substring(beg));
- if ((mPreset & 0x10000) != 0) ++intv.end;
- else --intv.beg;
- if (intv.beg < 0) intv.beg = 0;
- if (intv.end < 1) intv.end = 1;
- } else { // FIXME: SAM supports are not tested yet
- if ((mPreset & 0xffff) == 0) { // generic
- if (col == mEc)
- intv.end = Integer.parseInt(end != -1 ? s.substring(beg, end) : s.substring(beg));
- } else if ((mPreset & 0xffff) == 1) { // SAM
- if (col == 6) { // CIGAR
- int l = 0, i, j;
- String cigar = s.substring(beg, end);
- for (i = j = 0; i < cigar.length(); ++i) {
- if (cigar.charAt(i) > '9') {
- int op = cigar.charAt(i);
- if (op == 'M' || op == 'D' || op == 'N')
- l += Integer.parseInt(cigar.substring(j, i));
- j = i + 1;
- }
- }
- intv.end = intv.beg + l;
- }
- } else if ((mPreset & 0xffff) == 2) { // VCF
- String alt;
- alt = end >= 0 ? s.substring(beg, end) : s.substring(beg);
- if (col == 4) { // REF
- if (!alt.isEmpty()) intv.end = intv.beg + alt.length();
- } else if (col == 8) { // INFO
- int e_off = -1, i = alt.indexOf("END=");
- if (i == 0) e_off = 4;
- else if (i > 0) {
- i = alt.indexOf(";END=");
- if (i >= 0) e_off = i + 5;
- }
- if (e_off > 0) {
- i = alt.indexOf(';', e_off);
- intv.end = Integer.parseInt(i > e_off ? alt.substring(e_off, i) : alt.substring(e_off));
- }
- }
- }
- }
- if (end == -1) break;
- beg = end + 1;
- }
- return intv;
- }
-
- public interface Iterator
- {
- /** return null when there is no more data to read */
- public String next() throws IOException;
- }
-
- /** iterator returned instead of null when there is no more data */
- private static final Iterator EOF_ITERATOR=new Iterator() {
- @Override
- public String next() throws IOException {
- return null;
- }
- };
-
- /** default implementation of Iterator */
- private class IteratorImpl implements Iterator {
- private int i;
- //private int n_seeks;
- private int tid, beg, end;
- private TPair64[] off;
- private long curr_off;
- private boolean iseof;
-
- private IteratorImpl(final int _tid, final int _beg, final int _end, final TPair64[] _off) {
- i = -1;
- //n_seeks = 0;
- curr_off = 0;
- iseof = false;
- off = _off;
- tid = _tid;
- beg = _beg;
- end = _end;
- }
-
- @Override
- public String next() throws IOException {
- if (iseof) return null;
- for (; ;) {
- if (curr_off == 0 || !less64(curr_off, off[i].v)) { // then jump to the next chunk
- if (i == off.length - 1) break; // no more chunks
- if (i >= 0) assert (curr_off == off[i].v); // otherwise bug
- if (i < 0 || off[i].v != off[i + 1].u) { // not adjacent chunks; then seek
- mFp.seek(off[i + 1].u);
- curr_off = mFp.getFilePointer();
- //++n_seeks;
- }
- ++i;
- }
- String s;
- if ((s = readLine(mFp)) != null) {
- TIntv intv;
- char[] str = s.toCharArray();
- curr_off = mFp.getFilePointer();
- if (str.length == 0 || str[0] == mMeta) continue;
- intv = getIntv(s);
- if (intv.tid != tid || intv.beg >= end) break; // no need to proceed
- else if (intv.end > beg && intv.beg < end) return s; // overlap; return
- } else break; // end of file
- }
- iseof = true;
- return null;
- }
- }
-
- /**
- * Return
- * @param tid Sequence id
- * @param beg beginning of interval, genomic coords
- * @param end end of interval, genomic coords
- * @return an iterator over the lines within the specified interval
- */
- public Iterator query(final int tid, final int beg, final int end) {
- TPair64[] off, chunks;
- long min_off;
- if(tid< 0 || tid>=this.mIndex.length) return EOF_ITERATOR;
- TIndex idx = mIndex[tid];
- int[] bins = new int[MAX_BIN];
- int i, l, n_off, n_bins = reg2bins(beg, end, bins);
- if (idx.l.length > 0)
- min_off = (beg >> TAD_LIDX_SHIFT >= idx.l.length) ? idx.l[idx.l.length - 1] : idx.l[beg >> TAD_LIDX_SHIFT];
- else min_off = 0;
- for (i = n_off = 0; i < n_bins; ++i) {
- if ((chunks = idx.b.get(bins[i])) != null)
- n_off += chunks.length;
- }
- if (n_off == 0) return EOF_ITERATOR;
- off = new TPair64[n_off];
- for (i = n_off = 0; i < n_bins; ++i)
- if ((chunks = idx.b.get(bins[i])) != null)
- for (int j = 0; j < chunks.length; ++j)
- if (less64(min_off, chunks[j].v))
- off[n_off++] = new TPair64(chunks[j]);
- Arrays.sort(off, 0, n_off);
- // resolve completely contained adjacent blocks
- for (i = 1, l = 0; i < n_off; ++i) {
- if (less64(off[l].v, off[i].v)) {
- ++l;
- off[l].u = off[i].u;
- off[l].v = off[i].v;
- }
- }
- n_off = l + 1;
- // resolve overlaps between adjacent blocks; this may happen due to the merge in indexing
- for (i = 1; i < n_off; ++i)
- if (!less64(off[i - 1].v, off[i].u)) off[i - 1].v = off[i].u;
- // merge adjacent blocks
- for (i = 1, l = 0; i < n_off; ++i) {
- if (off[l].v >> 16 == off[i].u >> 16) off[l].v = off[i].v;
- else {
- ++l;
- off[l].u = off[i].u;
- off[l].v = off[i].v;
- }
- }
- n_off = l + 1;
- // return
- TPair64[] ret = new TPair64[n_off];
- for (i = 0; i < n_off; ++i) {
- if (off[i] != null) ret[i] = new TPair64(off[i].u, off[i].v); // in C, this is inefficient
- }
- if (ret.length == 0 || (ret.length == 1 && ret[0] == null))
- return EOF_ITERATOR;
- return new TabixReader.IteratorImpl(tid, beg, end, ret);
- }
-
- /**
- *
- * @see #parseReg(String)
- * @param reg A region string of the form acceptable by {@link #parseReg(String)}
- * @return
- */
- public Iterator query(final String reg) {
- int[] x = parseReg(reg);
- if(x[0]<0) return EOF_ITERATOR;
- return query(x[0], x[1], x[2]);
- }
-
- /**
- *
- * @see #parseReg(String)
- * @param reg a chromosome
- * @param start start interval
- * @param end end interval
- * @return a tabix iterator
- */
- public Iterator query(final String reg,int start,int end) {
- int tid=this.chr2tid(reg);
- if(tid==-1) return EOF_ITERATOR;
- return query(tid, start, end);
- }
-
- public static void main(String[] args) {
- if (args.length < 1) {
- System.out.println("Usage: java -cp .:sam.jar TabixReader <in.gz> [region]");
- System.exit(1);
- }
- try {
- TabixReader tr = new TabixReader(args[0]);
- String s;
- if (args.length == 1) { // no region is specified; print the whole file
- while ((s = tr.readLine()) != null)
- System.out.println(s);
- } else { // a region is specified; random access
- TabixReader.Iterator iter = tr.query(args[1]); // get the iterator
- while ((s = iter.next()) != null)
- System.out.println(s);
- }
- } catch (IOException e) {
- }
- }
-
- // ADDED BY JTR
- public void close() {
- if(mFp != null) {
- try {
- mFp.close();
- } catch (IOException e) {
-
- }
- }
- }
-
- @Override
- public String toString() {
- return "TabixReader: filename:"+getSource();
- }
-}
diff --git a/src/main/java/htsjdk/tribble/readme.txt b/src/main/java/htsjdk/tribble/readme.txt
deleted file mode 100644
index 6ee86c3..0000000
--- a/src/main/java/htsjdk/tribble/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-Source root for tribble project -- indexed, queryable genomic file formats
\ No newline at end of file
diff --git a/src/main/java/htsjdk/tribble/util/FTPHelper.java b/src/main/java/htsjdk/tribble/util/FTPHelper.java
deleted file mode 100644
index c28650f..0000000
--- a/src/main/java/htsjdk/tribble/util/FTPHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.tribble.util;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPStream;
-import htsjdk.samtools.util.ftp.FTPUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * @author jacob
- * @date 2013-Apr-11
- */
-public class FTPHelper implements URLHelper {
-
- private URL url;
-
- public FTPHelper(URL url) {
- if (!url.getProtocol().toLowerCase().equals("ftp")) {
- throw new IllegalArgumentException("FTPHelper can only be used with ftp protocol, not " + url.getProtocol());
- }
- this.url = url;
- }
-
- @Override
- public URL getUrl() {
- return this.url;
- }
-
- @Override
- public long getContentLength() throws IOException {
- return FTPUtils.getContentLength(this.url);
- }
-
- @Override
- public InputStream openInputStream() throws IOException {
- String file = url.getPath();
- FTPClient ftp = FTPUtils.connect(url.getHost(), url.getUserInfo(), null);
- ftp.pasv();
- ftp.retr(file);
- return new FTPStream(ftp);
- }
-
- @Override
- @Deprecated
- public InputStream openInputStreamForRange(long start, long end) throws IOException {
- throw new UnsupportedOperationException("Cannot perform range operations over FTP");
- }
-
- @Override
- public boolean exists() throws IOException {
- return FTPUtils.resourceAvailable(this.url);
- }
-}
diff --git a/src/main/java/htsjdk/tribble/util/HTTPHelper.java b/src/main/java/htsjdk/tribble/util/HTTPHelper.java
deleted file mode 100644
index 90e6228..0000000
--- a/src/main/java/htsjdk/tribble/util/HTTPHelper.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.tribble.util;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.Proxy;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * Simple implementation of URLHelper based on the JDK URL and HttpURLConnection classes. This
- * version optionally takes a proxy, but does not support authentication.
- *
- * @author jrobinso
- * @date Jun 28, 2011
- */
-public class HTTPHelper implements URLHelper {
- /**
- * Global proxy setting -- shared by all instances
- */
- static Proxy proxy;
-
- private URL url;
-
- public HTTPHelper(URL url) {
- this.url = url;
- proxy = null;
-
- try {
- URLConnection conn = openConnection();
- conn.setDefaultUseCaches(false);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public static synchronized void setProxy(Proxy p) {
- proxy = p;
- }
-
- public URL getUrl() {
- return url;
- }
-
- /**
- * @return content length of the resource
- * @throws IOException
- */
- public long getContentLength() throws IOException {
-
- HttpURLConnection con = null;
- try {
- con = openConnection();
- con.setRequestMethod("HEAD");
- if ((con.getResponseCode() != HttpURLConnection.HTTP_OK)) {
- System.out.println("Error (" + con.getResponseMessage() + " ) fetching content length: " + url);
- return -1;
- } else {
- String contentLength = con.getHeaderField("Content-Length");
- return contentLength == null ? -1 : Long.parseLong(contentLength);
- }
- } finally {
- if (con != null) con.disconnect();
- }
- }
-
-
- public InputStream openInputStream() throws IOException {
-
- HttpURLConnection connection = openConnection();
- return new WrapperInputStream(connection, connection.getInputStream());
- }
-
-
- /**
- * Open an input stream for the requested byte range. Its the client's responsibility to close the stream.
- *
- * @param start start of range in bytes
- * @param end end of range ni bytes
- * @return
- * @throws IOException
- */
- @Deprecated
- public InputStream openInputStreamForRange(long start, long end) throws IOException {
-
- HttpURLConnection connection = openConnection();
- String byteRange = "bytes=" + start + "-" + end;
- connection.setRequestProperty("Range", byteRange);
- return new WrapperInputStream(connection, connection.getInputStream());
- }
-
- private HttpURLConnection openConnection() throws IOException {
- HttpURLConnection connection;
- if (proxy == null) {
- connection = (HttpURLConnection) url.openConnection();
- } else {
- connection = (HttpURLConnection) url.openConnection(proxy);
- }
- return connection;
- }
-
- public boolean exists() throws IOException {
- HttpURLConnection con = null;
- try {
- con = openConnection();
- con.setRequestMethod("HEAD");
- return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
- } catch (IOException e) {
- // This is what we are testing for, so its not really an exception
- return false;
- } finally {
- if (con != null) con.disconnect();
- }
- }
-
- class WrapperInputStream extends FilterInputStream {
-
- HttpURLConnection connection;
-
- protected WrapperInputStream(HttpURLConnection connection, InputStream inputStream) {
- super(inputStream);
- this.connection = connection;
- }
-
- @Override
- public void close() throws IOException {
- super.close();
- connection.disconnect();
- }
- }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java b/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java
deleted file mode 100644
index 350f47c..0000000
--- a/src/main/java/htsjdk/tribble/util/LittleEndianInputStream.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-* Adapted from example code in
-* Title: Hardcore Java
-* Title: Java I/O
-* Second Edition: May 2006
-* ISBN 10: 0-596-52750-0
-* ISBN 13: 9780596527501
-*
-* http://www.javafaq.nu/java-example-code-1078.html
-*
-*/
-package htsjdk.tribble.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.EOFException;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-/**
- * Input stream with methods to convert byte arrays to numeric values using "little endian" order.
- * <p/>
- * Note: This class is not thread safe => instances should not be shared amongst threads
- */
-public class LittleEndianInputStream extends FilterInputStream {
-
- byte[] buffer;
-
- public LittleEndianInputStream(InputStream in) {
- super(in);
- buffer = new byte[8];
-
- }
-
- /**
- *
- * @return the next byte of this input stream, interpreted as an unsigned 8-bit number
- * @throws IOException
- */
- public byte readByte() throws IOException {
- int ch = in.read();
- if (ch < 0) {
- throw new EOFException();
- }
- return (byte) (ch);
- }
-
- public short readShort() throws IOException {
- int byte1 = in.read();
- int byte2 = in.read();
- if (byte2 < 0) {
- throw new EOFException();
- }
-
- return (short) (((byte2 << 24) >>> 16) + ((byte1 << 24) >>> 24));
- }
-
-
- public int readInt() throws IOException {
- int byte1 = in.read();
- int byte2 = in.read();
- int byte3 = in.read();
- int byte4 = in.read();
- if (byte4 < 0) {
- throw new EOFException();
- }
- return (byte4 << 24)
- + ((byte3 << 24) >>> 8)
- + ((byte2 << 24) >>> 16)
- + ((byte1 << 24) >>> 24);
-
- }
-
- /**
- *
- */
-
- public long readLong() throws IOException {
- readFully(buffer);
- long byte1 = (long) buffer[0];
- long byte2 = (long) buffer[1];
- long byte3 = (long) buffer[2];
- long byte4 = (long) buffer[3];
- long byte5 = (long) buffer[4];
- long byte6 = (long) buffer[5];
- long byte7 = (long) buffer[6];
- long byte8 = (long) buffer[7];
- return (byte8 << 56)
- + ((byte7 << 56) >>> 8)
- + ((byte6 << 56) >>> 16)
- + ((byte5 << 56) >>> 24)
- + ((byte4 << 56) >>> 32)
- + ((byte3 << 56) >>> 40)
- + ((byte2 << 56) >>> 48)
- + ((byte1 << 56) >>> 56);
- }
-
- public final double readDouble() throws IOException {
- return Double.longBitsToDouble(this.readLong());
- }
-
- public final float readFloat() throws IOException {
- return Float.intBitsToFloat(this.readInt());
- }
-
- /**
- * Read a null terminated byte array and return result as a string
- *
- * @return
- * @throws IOException
- */
-
- public String readString() throws IOException {
- ByteArrayOutputStream bis = new ByteArrayOutputStream(100);
- byte b;
- while ((b = (byte) in.read()) != 0) {
- if(b < 0) {
- throw new EOFException();
- }
- bis.write(b);
- }
- return new String(bis.toByteArray());
- }
-
-
- /**
- * Keep reading until the input buffer is filled.
- */
- private void readFully(byte b[]) throws IOException {
- int len = b.length;
- if (len < 0)
- throw new IndexOutOfBoundsException();
- int n = 0;
- while (n < len) {
- int count = read(b, n, len - n);
- if (count < 0)
- throw new EOFException();
- n += count;
- }
- }
-
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java b/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java
deleted file mode 100644
index 9bec071..0000000
--- a/src/main/java/htsjdk/tribble/util/LittleEndianOutputStream.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-* Adapted from example code in
-* Title: Hardcore Java
-* Title: Java I/O
-* Second Edition: May 2006
-* ISBN 10: 0-596-52750-0
-* ISBN 13: 9780596527501
-*
-* http://www.javafaq.nu/java-example-code-1078.html
-*
-*/
-
-package htsjdk.tribble.util;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-
-public final class LittleEndianOutputStream extends FilterOutputStream {
-
- protected long written;
-
- public LittleEndianOutputStream(OutputStream out) {
- super(out);
- }
-
- public void write(int b) throws IOException {
- out.write(b);
- written++;
- }
-
- public void write(byte[] data, int offset, int length)
- throws IOException {
- out.write(data, offset, length);
- written += length;
- }
-
- public void writeBoolean(boolean b) throws IOException {
- if (b) this.write(1);
- else this.write(0);
- }
-
- public void writeByte(int b) throws IOException {
- out.write(b);
- written++;
- }
-
- public void writeShort(int s) throws IOException {
- out.write(s & 0xFF);
- out.write((s >>> 8) & 0xFF);
- written += 2;
- }
-
- public void writeChar(int c) throws IOException {
- out.write(c & 0xFF);
- out.write((c >>> 8) & 0xFF);
- written += 2;
- }
-
- public void writeInt(int i) throws IOException {
-
- out.write(i & 0xFF);
- out.write((i >>> 8) & 0xFF);
- out.write((i >>> 16) & 0xFF);
- out.write((i >>> 24) & 0xFF);
- written += 4;
-
- }
-
- public void writeLong(long l) throws IOException {
-
- out.write((int) l & 0xFF);
- out.write((int) (l >>> 8) & 0xFF);
- out.write((int) (l >>> 16) & 0xFF);
- out.write((int) (l >>> 24) & 0xFF);
- out.write((int) (l >>> 32) & 0xFF);
- out.write((int) (l >>> 40) & 0xFF);
- out.write((int) (l >>> 48) & 0xFF);
- out.write((int) (l >>> 56) & 0xFF);
- written += 8;
-
- }
-
- public final void writeFloat(float f) throws IOException {
- this.writeInt(Float.floatToIntBits(f));
- }
-
- public final void writeDouble(double d) throws IOException {
- this.writeLong(Double.doubleToLongBits(d));
- }
-
- public void writeBytes(String s) throws IOException {
- int length = s.length();
- for (int i = 0; i < length; i++) {
- out.write((byte) s.charAt(i));
- }
- written += length;
- }
-
- /**
- * Srite a string as a null terminated byte array.
- *
- * @param s
- * @throws IOException
- */
- public void writeString(String s) throws IOException {
- writeBytes(s);
- write((byte) 0);
- }
-
- public long getWrittenCount() {
- return written;
- }
-
- // Method provide to enable "reseting" to a previous state.
- public void setWrittenCount(long count) {
- this.written = count;
- }
-}// end LittleEndianOutputStream
diff --git a/src/main/java/htsjdk/tribble/util/MathUtils.java b/src/main/java/htsjdk/tribble/util/MathUtils.java
deleted file mode 100644
index 9b4d8ce..0000000
--- a/src/main/java/htsjdk/tribble/util/MathUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-/**
- * a collection of functions and classes for various common calculations
- */
-public class MathUtils {
-
- /**
- * a class for calculating moving statistics - this class returns the
- * mean, variance, and std dev after accumulating any number of records.
- * taken from http://www.johndcook.com/standard_deviation.html
- */
- public static class RunningStat {
- private double oldMean, newMean, oldStdDev, newStdDev;
- private long recordCount = 0;
-
- /**
- * @param x the value to add to the running mean and variance
- */
- public void push(double x) {
- recordCount++;
- // See Knuth TAOCP vol 2, 3rd edition, page 232
- if (recordCount == 1) {
- oldMean = newMean = x;
- oldStdDev = 0.0;
- } else {
- newMean = oldMean + (x - oldMean) / recordCount;
- newStdDev = oldStdDev + (x - oldMean) * (x - newMean);
-
- // set up for next iteration
- oldMean = newMean;
- oldStdDev = newStdDev;
- }
- }
-
- public void clear() { recordCount = 0; }
- public final long numDataValues() { return recordCount; }
- public final double mean() { return (recordCount > 0) ? newMean : 0.0; }
- public double variance() { return ((recordCount > 1) ? newStdDev / (recordCount - 1) : 0.0); }
- public double standardDeviation() { return Math.sqrt(variance()); }
- }
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/ParsingUtils.java b/src/main/java/htsjdk/tribble/util/ParsingUtils.java
deleted file mode 100644
index 2a88ed7..0000000
--- a/src/main/java/htsjdk/tribble/util/ParsingUtils.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-import java.awt.Color;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * @author jrobinso
- */
-public class ParsingUtils {
-
- public static Map<Object, Color> colorCache = new WeakHashMap<Object, Color>(100);
-
- // HTML 4.1 color table, + orange and magenta
- static Map<String, String> colorSymbols = new HashMap();
-
- private static final Class defaultUrlHelperClass = RemoteURLHelper.class;
- public static Class urlHelperClass = defaultUrlHelperClass;
-
- static {
- colorSymbols.put("white", "FFFFFF");
- colorSymbols.put("silver", "C0C0C0");
- colorSymbols.put("gray", "808080");
- colorSymbols.put("black", "000000");
- colorSymbols.put("red", "FF0000");
- colorSymbols.put("maroon", "800000");
- colorSymbols.put("yellow", "FFFF00");
- colorSymbols.put("olive", "808000");
- colorSymbols.put("lime", "00FF00");
- colorSymbols.put("green", "008000");
- colorSymbols.put("aqua", "00FFFF");
- colorSymbols.put("teal", "008080");
- colorSymbols.put("blue", "0000FF");
- colorSymbols.put("navy", "000080");
- colorSymbols.put("fuchsia", "FF00FF");
- colorSymbols.put("purple", "800080");
- colorSymbols.put("orange", "FFA500");
- colorSymbols.put("magenta", "FF00FF");
- }
-
-
- public static InputStream openInputStream(String path)
- throws IOException {
-
- InputStream inputStream;
-
- if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("ftp:")) {
- inputStream = getURLHelper(new URL(path)).openInputStream();
- } else {
- File file = new File(path);
- inputStream = new FileInputStream(file);
- }
-
- return inputStream;
- }
-
- //public static String join(String separator, Collection<String> strings) {
- // return join( separator, strings.toArray(new String[0]) );
- //}
-
- public static <T> String join(String separator, Collection<T> objects) {
- if (objects.isEmpty()) {
- return "";
- }
- Iterator<T> iter = objects.iterator();
- final StringBuilder ret = new StringBuilder(iter.next().toString());
- while (iter.hasNext()) {
- ret.append(separator);
- ret.append(iter.next().toString());
- }
-
- return ret.toString();
- }
-
- /**
- * a small utility function for sorting a list
- *
- * @param list
- * @param <T>
- * @return
- */
- public static <T extends Comparable> List<T> sortList(Collection<T> list) {
- ArrayList<T> ret = new ArrayList<T>();
- ret.addAll(list);
- Collections.sort(ret);
- return ret;
- }
-
- public static <T extends Comparable<T>, V> String sortedString(Map<T, V> c) {
- List<T> t = new ArrayList<T>(c.keySet());
- Collections.sort(t);
-
- List<String> pairs = new ArrayList<String>();
- for (T k : t) {
- pairs.add(k + "=" + c.get(k));
- }
-
- return "{" + ParsingUtils.join(", ", pairs.toArray(new String[pairs.size()])) + "}";
- }
-
- /**
- * join an array of strings given a seperator
- *
- * @param separator the string to insert between each array element
- * @param strings the array of strings
- * @return a string, which is the joining of all array values with the separator
- */
- public static String join(String separator, String[] strings) {
- return join(separator, strings, 0, strings.length);
- }
-
- /**
- * join a set of strings, using the separator provided, from index start to index stop
- *
- * @param separator the separator to use
- * @param strings the list of strings
- * @param start the start position (index in the list)0
- * @param end the end position (index in the list)
- * @return a joined string, or "" if end - start == 0
- */
- public static String join(String separator, String[] strings, int start, int end) {
- if ((end - start) == 0) {
- return "";
- }
- StringBuilder ret = new StringBuilder(strings[start]);
- for (int i = start + 1; i < end; ++i) {
- ret.append(separator);
- ret.append(strings[i]);
- }
- return ret.toString();
- }
-
-
- /**
- * Split the string into tokens separated by the given delimiter. This looks
- * suspiciously like what String.split should do. It is here because
- * String.split has particularly poor performance for this use case in some
- * versions of the Java SE API because of use of java.util.regex APIs
- * (see bug report at http://bugs.java.com/view_bug.do?bug_id=6840246 for
- * information).
- *
- * @param input the string to split
- * @param delim the character that delimits tokens
- * @return a list of the tokens
- */
- public static List<String> split(String input, char delim) {
- if (input.isEmpty()) return Arrays.asList("");
- final ArrayList<String> output = new ArrayList<String>(1+input.length()/2);
- int from = -1, to;
- for (to = input.indexOf(delim);
- to >= 0;
- from = to, to = input.indexOf(delim, from+1)) {
- output.add(input.substring(from+1, to));
- }
- output.add(input.substring(from+1));
- return output;
- }
-
-
- /**
- * Split the string into tokesn separated by the given delimiter. Profiling has
- * revealed that the standard string.split() method typically takes > 1/2
- * the total time when used for parsing ascii files.
- *
- * @param aString the string to split
- * @param tokens an array to hold the parsed tokens
- * @param delim character that delimits tokens
- * @return the number of tokens parsed
- */
- public static int split(String aString, String[] tokens, char delim) {
- return split(aString, tokens, delim, false);
- }
-
- /**
- * Split the string into tokens separated by the given delimiter. Profiling has
- * revealed that the standard string.split() method typically takes > 1/2
- * the total time when used for parsing ascii files.
- *
- * @param aString the string to split
- * @param tokens an array to hold the parsed tokens
- * @param delim character that delimits tokens
- * @param condenseTrailingTokens if true and there are more tokens than will fit in the tokens array,
- * condense all trailing tokens into the last token
- * @return the number of tokens parsed
- */
- public static int split(String aString, String[] tokens, char delim, boolean condenseTrailingTokens) {
-
- int maxTokens = tokens.length;
- int nTokens = 0;
- int start = 0;
- int end = aString.indexOf(delim);
-
- if (end == 0) {
- if (aString.length() > 1) {
- start = 1;
- end = aString.indexOf(delim, start);
- } else {
- return 0;
- }
- }
-
- if (end < 0) {
- tokens[nTokens++] = aString.substring(start);
- return nTokens;
- }
-
- while ((end > 0) && (nTokens < maxTokens)) {
- tokens[nTokens++] = aString.substring(start, end);
- start = end + 1;
- end = aString.indexOf(delim, start);
- }
-
- // condense if appropriate
- if (condenseTrailingTokens && nTokens == maxTokens) {
- tokens[nTokens - 1] = tokens[nTokens - 1] + delim + aString.substring(start);
- }
- // Add the trailing string
- else if (nTokens < maxTokens) {
- String trailingString = aString.substring(start);
- tokens[nTokens++] = trailingString;
- }
-
- return nTokens;
- }
-
-
- // trim a string for the given character (i.e. not just whitespace)
-
- public static String trim(String str, char ch) {
- char[] array = str.toCharArray();
- int start = 0;
- while (start < array.length && array[start] == ch)
- start++;
-
- int end = array.length - 1;
- while (end > start && array[end] == ch)
- end--;
-
- return str.substring(start, end + 1);
- }
-
-
- /**
- * Split the string into tokens separated by tab or space(s). This method
- * was added so support wig and bed files, which apparently accept space delimiters.
- * <p/>
- * Note: TODO REGEX expressions are not used for speed. This should be re-evaluated with JDK 1.5 or later
- *
- * @param aString the string to split
- * @param tokens an array to hold the parsed tokens
- * @return the number of tokens parsed
- */
- public static int splitWhitespace(String aString, String[] tokens) {
-
- int maxTokens = tokens.length;
- int nTokens = 0;
- int start = 0;
- int tabEnd = aString.indexOf('\t');
- int spaceEnd = aString.indexOf(' ');
- int end = tabEnd < 0 ? spaceEnd : spaceEnd < 0 ? tabEnd : Math.min(spaceEnd, tabEnd);
- while ((end > 0) && (nTokens < maxTokens)) {
- //tokens[nTokens++] = new String(aString.toCharArray(), start, end-start); // aString.substring(start, end);
- tokens[nTokens++] = aString.substring(start, end);
-
- start = end + 1;
- // Gobble up any whitespace before next token -- don't gobble tabs, consecutive tabs => empty cell
- while (start < aString.length() && aString.charAt(start) == ' ') {
- start++;
- }
-
- tabEnd = aString.indexOf('\t', start);
- spaceEnd = aString.indexOf(' ', start);
- end = tabEnd < 0 ? spaceEnd : spaceEnd < 0 ? tabEnd : Math.min(spaceEnd, tabEnd);
-
- }
-
- // Add the trailing string
- if (nTokens < maxTokens) {
- String trailingString = aString.substring(start);
- tokens[nTokens++] = trailingString;
- }
- return nTokens;
- }
-
- public static <T extends Comparable<? super T>> boolean isSorted(Iterable<T> iterable) {
- Iterator<T> iter = iterable.iterator();
- if (!iter.hasNext())
- return true;
-
- T t = iter.next();
- while (iter.hasNext()) {
- T t2 = iter.next();
- if (t.compareTo(t2) > 0)
- return false;
-
- t = t2;
- }
-
- return true;
- }
-
- /**
- * Convert an rgb string, hex, or symbol to a color.
- *
- * @param string
- * @return
- */
- public static Color parseColor(String string) {
- try {
- Color c = colorCache.get(string);
- if (c == null) {
- if (string.contains(",")) {
- String[] rgb = string.split(",");
- int red = Integer.parseInt(rgb[0]);
- int green = Integer.parseInt(rgb[1]);
- int blue = Integer.parseInt(rgb[2]);
- c = new Color(red, green, blue);
- } else if (string.startsWith("#")) {
- c = hexToColor(string.substring(1));
- } else {
- String hexString = colorSymbols.get(string.toLowerCase());
- if (hexString != null) {
- c = hexToColor(hexString);
- }
- }
-
- if (c == null) {
- c = Color.black;
- }
- colorCache.put(string, c);
- }
- return c;
-
- } catch (NumberFormatException numberFormatException) {
- //TODO Throw this exception?
- return Color.black;
- }
- }
-
-
- private static Color hexToColor(String string) {
- if (string.length() == 6) {
- int red = Integer.parseInt(string.substring(0, 2), 16);
- int green = Integer.parseInt(string.substring(2, 4), 16);
- int blue = Integer.parseInt(string.substring(4, 6), 16);
- return new Color(red, green, blue);
- } else {
- return null;
- }
-
- }
-
- public static boolean resourceExists(String resource) throws IOException{
-
- boolean remoteFile = resource.startsWith("http://") || resource.startsWith("https://") || resource.startsWith("ftp://");
- if (remoteFile) {
- URL url = null;
- try {
- url = new URL(resource);
- } catch (MalformedURLException e) {
- // Malformed URLs by definition don't exist
- return false;
- }
- URLHelper helper = getURLHelper(url);
- return helper.exists();
- } else {
- return (new File(resource)).exists();
- }
- }
-
- /**
- * Return the registered URLHelper, constructed with the provided URL
- * @see #registerHelperClass(Class)
- * @param url
- * @return
- */
- public static URLHelper getURLHelper(URL url) {
- try {
- return getURLHelper(urlHelperClass, url);
- } catch (Exception e) {
- return getURLHelper(defaultUrlHelperClass, url);
- }
- }
-
- private static URLHelper getURLHelper(Class helperClass, URL url) {
- try {
- Constructor constr = helperClass.getConstructor(URL.class);
- return (URLHelper) constr.newInstance(url);
- } catch (Exception e) {
- String errMsg = "Error instantiating url helper for class: " + helperClass;
- throw new IllegalStateException(errMsg, e);
- }
- }
-
- /**
- * Register a {@code URLHelper} class to be used for URL operations. The helper
- * may be used for both FTP and HTTP operations, so if any FTP URLs are used
- * the {@code URLHelper} must support it.
- *
- * The default helper class is {@link RemoteURLHelper}, which delegates to FTP/HTTP
- * helpers as appropriate.
- *
- * @see URLHelper
- * @param helperClass Class which implements {@link URLHelper}, and have a constructor
- * which takes a URL as it's only argument.
- */
- public static void registerHelperClass(Class helperClass) {
- if (!URLHelper.class.isAssignableFrom(helperClass)) {
- throw new IllegalArgumentException("helperClass must implement URLHelper");
- //TODO check that it has 1 arg constructor of proper type
- }
- urlHelperClass = helperClass;
- }
-
- /**
- * Add the {@code indexExtension} to the {@code filepath}, preserving
- * query string elements if present. Intended for use where {@code filepath}
- * is a URL. Will behave correctly on regular file paths (just add the extension
- * to the end)
- * @param filepath
- * @param indexExtension
- * @return
- */
- public static String appendToPath(String filepath, String indexExtension) {
- String tabxIndex = null;
- URL url = null;
- try{
- url = new URL(filepath);
- }catch (MalformedURLException e){
- //pass
- }
- if (url != null) {
- String path = url.getPath();
- String indexPath = path + indexExtension;
- tabxIndex = filepath.replace(path, indexPath);
- } else {
- tabxIndex = filepath + indexExtension;
- }
- return tabxIndex;
- }
-}
diff --git a/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java b/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java
deleted file mode 100644
index 2493edb..0000000
--- a/src/main/java/htsjdk/tribble/util/RemoteURLHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package htsjdk.tribble.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * Implementation of URLHelper designed for remote resources.
- * Determines appropriate helper based on protocol (ftp/http),
- * and then delegates.
- *
- * @author jacob
- * @date 2013-Apr-11
- */
-public class RemoteURLHelper implements URLHelper {
-
- private URLHelper wrappedHelper;
-
- public RemoteURLHelper(URL url) {
- String protocol = url.getProtocol().toLowerCase();
- if (protocol.startsWith("http")) {
- this.wrappedHelper = new HTTPHelper(url);
- } else if (protocol.startsWith("ftp")) {
- this.wrappedHelper = new FTPHelper(url);
- } else {
- throw new IllegalArgumentException("Unable to create helper for url with protocol " + protocol);
- }
- }
-
- @Override
- public URL getUrl() {
- return this.wrappedHelper.getUrl();
- }
-
- @Override
- public long getContentLength() throws IOException {
- return this.wrappedHelper.getContentLength();
- }
-
- @Override
- public InputStream openInputStream() throws IOException {
- return this.wrappedHelper.openInputStream();
- }
-
- @Override
- @Deprecated
- public InputStream openInputStreamForRange(long start, long end) throws IOException {
- return this.wrappedHelper.openInputStreamForRange(start, end);
- }
-
- @Override
- public boolean exists() throws IOException {
- return this.wrappedHelper.exists();
- }
-}
diff --git a/src/main/java/htsjdk/tribble/util/TabixUtils.java b/src/main/java/htsjdk/tribble/util/TabixUtils.java
deleted file mode 100644
index aa365cd..0000000
--- a/src/main/java/htsjdk/tribble/util/TabixUtils.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.util;
-
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.TabixReader;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * classes that have anything to do with tabix
- */
-public class TabixUtils {
-
- public static final String STANDARD_INDEX_EXTENSION = ".tbi";
-
- public static class TPair64 implements Comparable<TPair64> {
- public long u, v;
-
- public TPair64(final long _u, final long _v) {
- u = _u;
- v = _v;
- }
-
- public TPair64(final TPair64 p) {
- u = p.u;
- v = p.v;
- }
-
- public int compareTo(final TPair64 p) {
- return u == p.u ? 0 : ((u < p.u) ^ (u < 0) ^ (p.u < 0)) ? -1 : 1; // unsigned 64-bit comparison
- }
- }
-
- public static class TIndex {
- public HashMap<Integer, TPair64[]> b; // binning index
- public long[] l; // linear index
- }
-
-
- public static class TIntv {
- public int tid, beg, end;
- }
-
-
- public static boolean less64(final long u, final long v) { // unsigned 64-bit comparison
- return (u < v) ^ (u < 0) ^ (v < 0);
- }
-
- /**
- * Generates the SAMSequenceDictionary from the given tabix index file
- *
- * @param tabixIndex the tabix index file
- * @return non-null sequence dictionary
- */
- public static SAMSequenceDictionary getSequenceDictionary(final File tabixIndex) {
- if (tabixIndex == null) throw new IllegalArgumentException();
-
- try {
- final BlockCompressedInputStream is = new BlockCompressedInputStream(tabixIndex);
-
- // read preliminary bytes
- byte[] buf = new byte[32];
- is.read(buf, 0, 32);
-
- // read sequence dictionary
- int i, j, len = TabixReader.readInt(is);
- buf = new byte[len];
- is.read(buf);
-
- final List<SAMSequenceRecord> sequences = new ArrayList<SAMSequenceRecord>();
- for (i = j = 0; i < buf.length; ++i) {
- if (buf[i] == 0) {
- byte[] b = new byte[i - j];
- System.arraycopy(buf, j, b, 0, b.length);
- sequences.add(new SAMSequenceRecord(new String(b), b.length));
- j = i + 1;
- }
- }
- is.close();
-
- return new SAMSequenceDictionary(sequences);
- } catch (Exception e) {
- throw new TribbleException("Unable to read tabix index: " + e.getMessage());
- }
- }
-}
diff --git a/src/main/java/htsjdk/tribble/util/URLHelper.java b/src/main/java/htsjdk/tribble/util/URLHelper.java
deleted file mode 100644
index 9a4fdcb..0000000
--- a/src/main/java/htsjdk/tribble/util/URLHelper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2007-2011 by The Broad Institute of MIT and Harvard. All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL),
- * Version 2.1 which is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR
- * WARRANTES OF ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING,
- * WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER
- * OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR RESPECTIVE
- * TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES
- * OF ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
- * ECONOMIC DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER
- * THE BROAD OR MIT SHALL BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT
- * SHALL KNOW OF THE POSSIBILITY OF THE FOREGOING.
- */
-
-package htsjdk.tribble.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * Interface defining a helper class for dealing with URL resources. Purpose of this class is to provide the
- * flexibility to use either URLConnection or Apache HTTPClient. Also want to delegate to either HTTP or FTP
- *
- * @see HTTPHelper
- * @see FTPHelper
- * @author jrobinso
- * @date Jun 28, 2011
- */
-public interface URLHelper {
-
- URL getUrl();
-
- long getContentLength() throws IOException;
-
- InputStream openInputStream() throws IOException;
-
- /**
- * May throw an OperationUnsupportedException
- * @deprecated Will be removed in a future release, as is somewhat fragile
- * and not used.
- * @param start
- * @param end
- * @return
- * @throws IOException
- */
- @Deprecated
- InputStream openInputStreamForRange(long start, long end) throws IOException;
-
- public boolean exists() throws IOException;
-
-}
diff --git a/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java b/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java
deleted file mode 100755
index 8cee877..0000000
--- a/src/main/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculation.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.util.popgen;
-
-/**
-* The Broad Institute
-* SOFTWARE COPYRIGHT NOTICE AGREEMENT
-* This software and its documentation are copyright 2004 by the
-* Broad Institute/Massachusetts Institute of Technology. All rights are reserved.
-*
-* This software is supplied without any warranty or guaranteed support whatsoever. Neither
-* the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
-*/
-
-/**
-* This class calculates a HardyWeinberg p-value given three values representing
-* the observed frequences of homozygous and heterozygous genotypes in the
-* test population.
-*
-* @author Bob Handsaker
-*/
-public final class HardyWeinbergCalculation {
- /**
- * This class is not instantiable.
- */
- private HardyWeinbergCalculation() {
- }
-
- /**
- * Calculates exact two-sided hardy-weinberg p-value. Parameters
- * are number of genotypes, number of rare alleles observed and
- * number of heterozygotes observed.
- *
- * (c) 2003 Jan Wigginton, Goncalo Abecasis (goncalo at umich.edu)
- */
- public static double hwCalculate(int obsAA, int obsAB, int obsBB) {
- int diplotypes = obsAA + obsAB + obsBB;
- int rare = (obsAA * 2) + obsAB;
- int hets = obsAB;
-
- //make sure "rare" allele is really the rare allele
- if (rare > diplotypes) {
- rare = (2 * diplotypes) - rare;
- }
-
- //make sure numbers aren't screwy
- if (hets > rare) {
- return -1;
- }
-
- double[] tailProbs = new double[rare + 1];
-
- for (int z = 0; z < tailProbs.length; z++) {
- tailProbs[z] = 0;
- }
-
- //start at midpoint
- //cast to long and back to int to avoid overflow at large numbers
- int mid = (int) (((long) rare * ((2 * diplotypes) - rare)) / (2 * diplotypes));
-
- //check to ensure that midpoint and rare alleles have same parity
- if (((rare & 1) ^ (mid & 1)) != 0) {
- mid++;
- }
-
- int het = mid;
- int hom_r = (rare - mid) / 2;
- int hom_c = diplotypes - het - hom_r;
-
- //Calculate probability for each possible observed heterozygote
- //count up to a scaling constant, to avoid underflow and overflow
- tailProbs[mid] = 1.0;
-
- double sum = tailProbs[mid];
-
- for (het = mid; het > 1; het -= 2) {
- tailProbs[het - 2] = (tailProbs[het] * het * (het - 1.0)) / (4.0 * (hom_r + 1.0) * (hom_c +
- 1.0));
- sum += tailProbs[het - 2];
-
- //2 fewer hets for next iteration -> add one rare and one common homozygote
- hom_r++;
- hom_c++;
- }
-
- het = mid;
- hom_r = (rare - mid) / 2;
- hom_c = diplotypes - het - hom_r;
-
- for (het = mid; het <= (rare - 2); het += 2) {
- tailProbs[het + 2] = (tailProbs[het] * 4.0 * hom_r * hom_c) / ((het + 2.0) * (het +
- 1.0));
- sum += tailProbs[het + 2];
-
- //2 more hets for next iteration -> subtract one rare and one common homozygote
- hom_r--;
- hom_c--;
- }
-
- for (int z = 0; z < tailProbs.length; z++) {
- tailProbs[z] /= sum;
- }
-
- double top = tailProbs[hets];
-
- for (int i = hets + 1; i <= rare; i++) {
- top += tailProbs[i];
- }
-
- double otherSide = tailProbs[hets];
-
- for (int i = hets - 1; i >= 0; i--) {
- otherSide += tailProbs[i];
- }
-
- if ((top > 0.5) && (otherSide > 0.5)) {
- return 1.0;
- }
-
- if (top < otherSide) {
- return top * 2;
- }
-
- return otherSide * 2;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java b/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java
deleted file mode 100644
index a945764..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Codec.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.BinaryFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.variantcontext.VariantContextUtils;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Decode BCF2 files
- */
-public final class BCF2Codec extends BinaryFeatureCodec<VariantContext> {
- private final static int ALLOWED_MAJOR_VERSION = 2;
- private final static int MIN_MINOR_VERSION = 1;
-
- private BCFVersion bcfVersion = null;
-
- private VCFHeader header = null;
-
- /**
- * Maps offsets (encoded in BCF) into contig names (from header) for the CHROM field
- */
- private final ArrayList<String> contigNames = new ArrayList<String>();
-
- /**
- * Maps header string names (encoded in VCF) into strings found in the BCF header
- *
- * Initialized when processing the header
- */
- private ArrayList<String> dictionary;
-
- /**
- * Our decoder that reads low-level objects from the BCF2 records
- */
- private final BCF2Decoder decoder = new BCF2Decoder();
-
- /**
- * Provides some sanity checking on the header
- */
- private final static int MAX_HEADER_SIZE = 0x08000000;
-
- /**
- * Genotype field decoders that are initialized when the header is read
- */
- private BCF2GenotypeFieldDecoders gtFieldDecoders = null;
-
- /**
- * A cached array of GenotypeBuilders for efficient genotype decoding.
- *
- * Caching it allows us to avoid recreating this intermediate data
- * structure each time we decode genotypes
- */
- private GenotypeBuilder[] builders = null;
-
- // for error handling
- private int recordNo = 0;
- private int pos = 0;
-
-
- // ----------------------------------------------------------------------
- //
- // Feature codec interface functions
- //
- // ----------------------------------------------------------------------
-
- @Override
- public Feature decodeLoc( final PositionalBufferedStream inputStream ) {
- return decode(inputStream);
- }
-
- @Override
- public VariantContext decode( final PositionalBufferedStream inputStream ) {
- try {
- recordNo++;
- final VariantContextBuilder builder = new VariantContextBuilder();
-
- final int sitesBlockSize = decoder.readBlockSize(inputStream);
- final int genotypeBlockSize = decoder.readBlockSize(inputStream);
-
- decoder.readNextBlock(sitesBlockSize, inputStream);
- decodeSiteLoc(builder);
- final SitesInfoForDecoding info = decodeSitesExtendedInfo(builder);
-
- decoder.readNextBlock(genotypeBlockSize, inputStream);
- createLazyGenotypesDecoder(info, builder);
- return builder.fullyDecoded(true).make();
- } catch ( IOException e ) {
- throw new TribbleException("Failed to read BCF file", e);
- }
- }
-
- @Override
- public Class<VariantContext> getFeatureType() {
- return VariantContext.class;
- }
-
- @Override
- public FeatureCodecHeader readHeader( final PositionalBufferedStream inputStream ) {
- try {
- // note that this reads the magic as well, and so does double duty
- bcfVersion = BCFVersion.readBCFVersion(inputStream);
- if ( bcfVersion == null )
- error("Input stream does not contain a BCF encoded file; BCF magic header info not found");
-
- if ( bcfVersion.getMajorVersion() != ALLOWED_MAJOR_VERSION )
- error("BCF2Codec can only process BCF2 files, this file has major version " + bcfVersion.getMajorVersion());
- if ( bcfVersion.getMinorVersion() < MIN_MINOR_VERSION )
- error("BCF2Codec can only process BCF2 files with minor version >= " + MIN_MINOR_VERSION + " but this file has minor version " + bcfVersion.getMinorVersion());
-
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("Parsing data stream with BCF version " + bcfVersion);
- }
-
- final int headerSizeInBytes = BCF2Type.INT32.read(inputStream);
-
- if ( headerSizeInBytes <= 0 || headerSizeInBytes > MAX_HEADER_SIZE) // no bigger than 8 MB
- error("BCF2 header has invalid length: " + headerSizeInBytes + " must be >= 0 and < "+ MAX_HEADER_SIZE);
-
- final byte[] headerBytes = new byte[headerSizeInBytes];
- if ( inputStream.read(headerBytes) != headerSizeInBytes )
- error("Couldn't read all of the bytes specified in the header length = " + headerSizeInBytes);
-
- final PositionalBufferedStream bps = new PositionalBufferedStream(new ByteArrayInputStream(headerBytes));
- final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(bps));
- final VCFCodec headerParser = new VCFCodec();
- this.header = (VCFHeader) headerParser.readActualHeader(lineIterator);
- bps.close();
- } catch ( IOException e ) {
- throw new TribbleException("I/O error while reading BCF2 header");
- }
-
- // create the config offsets
- if ( ! header.getContigLines().isEmpty() ) {
- contigNames.clear();
- for ( final VCFContigHeaderLine contig : header.getContigLines()) {
- if ( contig.getID() == null || contig.getID().equals("") )
- error("found a contig with an invalid ID " + contig);
- contigNames.add(contig.getID());
- }
- } else {
- error("Didn't find any contig lines in BCF2 file header");
- }
-
- // create the string dictionary
- dictionary = parseDictionary(header);
-
- // prepare the genotype field decoders
- gtFieldDecoders = new BCF2GenotypeFieldDecoders(header);
-
- // create and initialize the genotype builder array
- final int nSamples = header.getNGenotypeSamples();
- builders = new GenotypeBuilder[nSamples];
- for ( int i = 0; i < nSamples; i++ ) {
- builders[i] = new GenotypeBuilder(header.getGenotypeSamples().get(i));
- }
-
- // position right before next line (would be right before first real record byte at end of header)
- return new FeatureCodecHeader(header, inputStream.getPosition());
- }
-
- @Override
- public boolean canDecode( final String path ) {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(path);
- final BCFVersion version = BCFVersion.readBCFVersion(fis);
- return version != null && version.getMajorVersion() == ALLOWED_MAJOR_VERSION;
- } catch ( FileNotFoundException e ) {
- return false;
- } catch ( IOException e ) {
- return false;
- } finally {
- try {
- if ( fis != null ) fis.close();
- } catch ( IOException e ) {
- // do nothing
- }
- }
- }
-
- // --------------------------------------------------------------------------------
- //
- // implicit block
- //
- // The first four records of BCF are inline untype encoded data of:
- //
- // 4 byte integer chrom offset
- // 4 byte integer start
- // 4 byte integer ref length
- // 4 byte float qual
- //
- // --------------------------------------------------------------------------------
-
- /**
- * Decode the sites level data from this classes decoder
- *
- * @param builder
- * @return
- */
- private final void decodeSiteLoc(final VariantContextBuilder builder) throws IOException {
- final int contigOffset = decoder.decodeInt(BCF2Type.INT32);
- final String contig = lookupContigName(contigOffset);
- builder.chr(contig);
-
- this.pos = decoder.decodeInt(BCF2Type.INT32) + 1; // GATK is one based, BCF2 is zero-based
- final int refLength = decoder.decodeInt(BCF2Type.INT32);
- builder.start((long)pos);
- builder.stop((long)(pos + refLength - 1)); // minus one because GATK has closed intervals but BCF2 is open
- }
-
- /**
- * Decode the sites level data from this classes decoder
- *
- * @param builder
- * @return
- */
- private final SitesInfoForDecoding decodeSitesExtendedInfo(final VariantContextBuilder builder) throws IOException {
- final Object qual = decoder.decodeSingleValue(BCF2Type.FLOAT);
- if ( qual != null ) {
- builder.log10PError(((Double)qual) / -10.0);
- }
-
- final int nAlleleInfo = decoder.decodeInt(BCF2Type.INT32);
- final int nFormatSamples = decoder.decodeInt(BCF2Type.INT32);
- final int nAlleles = nAlleleInfo >> 16;
- final int nInfo = nAlleleInfo & 0x0000FFFF;
- final int nFormatFields = nFormatSamples >> 24;
- final int nSamples = nFormatSamples & 0x00FFFFF;
-
- if ( header.getNGenotypeSamples() != nSamples )
- error("Reading BCF2 files with different numbers of samples per record " +
- "is not currently supported. Saw " + header.getNGenotypeSamples() +
- " samples in header but have a record with " + nSamples + " samples");
-
- decodeID(builder);
- final List<Allele> alleles = decodeAlleles(builder, pos, nAlleles);
- decodeFilter(builder);
- decodeInfo(builder, nInfo);
-
- final SitesInfoForDecoding info = new SitesInfoForDecoding(nFormatFields, nSamples, alleles);
- if ( ! info.isValid() )
- error("Sites info is malformed: " + info);
- return info;
- }
-
- protected final static class SitesInfoForDecoding {
- final int nFormatFields;
- final int nSamples;
- final List<Allele> alleles;
-
- private SitesInfoForDecoding(final int nFormatFields, final int nSamples, final List<Allele> alleles) {
- this.nFormatFields = nFormatFields;
- this.nSamples = nSamples;
- this.alleles = alleles;
- }
-
- public boolean isValid() {
- return nFormatFields >= 0 &&
- nSamples >= 0 &&
- alleles != null && ! alleles.isEmpty() && alleles.get(0).isReference();
- }
-
- @Override
- public String toString() {
- return String.format("nFormatFields = %d, nSamples = %d, alleles = %s", nFormatFields, nSamples, alleles);
- }
- }
-
- /**
- * Decode the id field in this BCF2 file and store it in the builder
- * @param builder
- */
- private void decodeID( final VariantContextBuilder builder ) throws IOException {
- final String id = (String)decoder.decodeTypedValue();
-
- if ( id == null )
- builder.noID();
- else
- builder.id(id);
- }
-
- /**
- * Decode the alleles from this BCF2 file and put the results in builder
- * @param builder
- * @param pos
- * @param nAlleles
- * @return the alleles
- */
- private List<Allele> decodeAlleles( final VariantContextBuilder builder, final int pos, final int nAlleles ) throws IOException {
- // TODO -- probably need inline decoder for efficiency here (no sense in going bytes -> string -> vector -> bytes
- List<Allele> alleles = new ArrayList<Allele>(nAlleles);
- String ref = null;
-
- for ( int i = 0; i < nAlleles; i++ ) {
- final String alleleBases = (String)decoder.decodeTypedValue();
-
- final boolean isRef = i == 0;
- final Allele allele = Allele.create(alleleBases, isRef);
- if ( isRef ) ref = alleleBases;
-
- alleles.add(allele);
- }
- assert ref != null;
-
- builder.alleles(alleles);
-
- assert !ref.isEmpty();
-
- return alleles;
- }
-
- /**
- * Decode the filter field of this BCF2 file and store the result in the builder
- * @param builder
- */
- private void decodeFilter( final VariantContextBuilder builder ) throws IOException {
- final Object value = decoder.decodeTypedValue();
-
- if ( value == null )
- builder.unfiltered();
- else {
- if ( value instanceof Integer ) {
- // fast path for single integer result
- final String filterString = getDictionaryString((Integer)value);
- if ( VCFConstants.PASSES_FILTERS_v4.equals(filterString))
- builder.passFilters();
- else
- builder.filter(filterString);
- } else {
- for ( final int offset : (List<Integer>)value )
- builder.filter(getDictionaryString(offset));
- }
- }
- }
-
- /**
- * Loop over the info field key / value pairs in this BCF2 file and decode them into the builder
- *
- * @param builder
- * @param numInfoFields
- */
- private void decodeInfo( final VariantContextBuilder builder, final int numInfoFields ) throws IOException {
- if ( numInfoFields == 0 )
- // fast path, don't bother doing any work if there are no fields
- return;
-
- final Map<String, Object> infoFieldEntries = new HashMap<String, Object>(numInfoFields);
- for ( int i = 0; i < numInfoFields; i++ ) {
- final String key = getDictionaryString();
- Object value = decoder.decodeTypedValue();
- final VCFCompoundHeaderLine metaData = VariantContextUtils.getMetaDataForField(header, key);
- if ( metaData.getType() == VCFHeaderLineType.Flag ) value = true; // special case for flags
- infoFieldEntries.put(key, value);
- }
-
- builder.attributes(infoFieldEntries);
- }
-
- // --------------------------------------------------------------------------------
- //
- // Decoding Genotypes
- //
- // --------------------------------------------------------------------------------
-
- /**
- * Create the lazy loader for the genotypes data, and store it in the builder
- * so that the VC will be able to decode on demand the genotypes data
- *
- * @param siteInfo
- * @param builder
- */
- private void createLazyGenotypesDecoder( final SitesInfoForDecoding siteInfo,
- final VariantContextBuilder builder ) {
- if (siteInfo.nSamples > 0) {
- final LazyGenotypesContext.LazyParser lazyParser =
- new BCF2LazyGenotypesDecoder(this, siteInfo.alleles, siteInfo.nSamples, siteInfo.nFormatFields, builders);
-
- final LazyData lazyData = new LazyData(header, siteInfo.nFormatFields, decoder.getRecordBytes());
- final LazyGenotypesContext lazy = new LazyGenotypesContext(lazyParser, lazyData, header.getNGenotypeSamples());
-
- // did we resort the sample names? If so, we need to load the genotype data
- if ( !header.samplesWereAlreadySorted() )
- lazy.decode();
-
- builder.genotypesNoValidation(lazy);
- }
- }
-
- public static class LazyData {
- final public VCFHeader header;
- final public int nGenotypeFields;
- final public byte[] bytes;
-
- public LazyData(final VCFHeader header, final int nGenotypeFields, final byte[] bytes) {
- this.header = header;
- this.nGenotypeFields = nGenotypeFields;
- this.bytes = bytes;
- }
- }
-
- private final String getDictionaryString() throws IOException {
- return getDictionaryString((Integer) decoder.decodeTypedValue());
- }
-
- protected final String getDictionaryString(final int offset) {
- return dictionary.get(offset);
- }
-
- /**
- * Translate the config offset as encoded in the BCF file into the actual string
- * name of the contig from the dictionary
- *
- * @param contigOffset
- * @return
- */
- private final String lookupContigName( final int contigOffset ) {
- return contigNames.get(contigOffset);
- }
-
- private final ArrayList<String> parseDictionary(final VCFHeader header) {
- final ArrayList<String> dict = BCF2Utils.makeDictionary(header);
-
- // if we got here we never found a dictionary, or there are no elements in the dictionary
- if ( dict.isEmpty() )
- error("Dictionary header element was absent or empty");
-
- return dict;
- }
-
- /**
- * @return the VCFHeader we found in this BCF2 file
- */
- protected VCFHeader getHeader() {
- return header;
- }
-
- protected BCF2GenotypeFieldDecoders.Decoder getGenotypeFieldDecoder(final String field) {
- return gtFieldDecoders.getDecoder(field);
- }
-
- private void error(final String message) throws RuntimeException {
- throw new TribbleException(String.format("%s, at record %d with position %d:", message, recordNo, pos));
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java b/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java
deleted file mode 100644
index 0dd166e..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Decoder.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public final class BCF2Decoder {
- byte[] recordBytes = null;
- ByteArrayInputStream recordStream = null;
-
- public BCF2Decoder() {
- // nothing to do
- }
-
- /**
- * Create a new decoder ready to read BCF2 data from the byte[] recordBytes, for testing purposes
- *
- * @param recordBytes
- */
- protected BCF2Decoder(final byte[] recordBytes) {
- setRecordBytes(recordBytes);
- }
-
- // ----------------------------------------------------------------------
- //
- // Routines to load, set, skip blocks of underlying data we are decoding
- //
- // ----------------------------------------------------------------------
-
- /**
- * Reads the next record from input stream and prepare this decoder to decode values from it
- *
- * @param stream
- */
- public void readNextBlock(final int blockSizeInBytes, final InputStream stream) {
- if ( blockSizeInBytes < 0 ) throw new TribbleException("Invalid block size " + blockSizeInBytes);
- setRecordBytes(readRecordBytes(blockSizeInBytes, stream));
- }
-
- /**
- * Skips the next record from input stream, invalidating current block data
- *
- * @param stream
- */
- public void skipNextBlock(final int blockSizeInBytes, final InputStream stream) {
- try {
- final int bytesRead = (int)stream.skip(blockSizeInBytes);
- validateReadBytes(bytesRead, 1, blockSizeInBytes);
- } catch ( IOException e ) {
- throw new TribbleException("I/O error while reading BCF2 file", e);
- }
- this.recordBytes = null;
- this.recordStream = null;
- }
-
- /**
- * Returns the byte[] for the block of data we are currently decoding
- * @return
- */
- public byte[] getRecordBytes() {
- return recordBytes;
- }
-
- /**
- * The size of the current block in bytes
- *
- * @return
- */
- public int getBlockSize() {
- return recordBytes.length;
- }
-
- public boolean blockIsFullyDecoded() {
- return recordStream.available() == 0;
- }
-
- /**
- * Use the recordBytes[] to read BCF2 records from now on
- *
- * @param recordBytes
- */
- public void setRecordBytes(final byte[] recordBytes) {
- this.recordBytes = recordBytes;
- this.recordStream = new ByteArrayInputStream(recordBytes);
- }
-
- // ----------------------------------------------------------------------
- //
- // High-level decoder
- //
- // ----------------------------------------------------------------------
-
- public final Object decodeTypedValue() throws IOException {
- final byte typeDescriptor = readTypeDescriptor();
- return decodeTypedValue(typeDescriptor);
- }
-
- public final Object decodeTypedValue(final byte typeDescriptor) throws IOException {
- final int size = decodeNumberOfElements(typeDescriptor);
- return decodeTypedValue(typeDescriptor, size);
- }
-
- public final Object decodeTypedValue(final byte typeDescriptor, final int size) throws IOException {
- if ( size == 0 ) {
- // missing value => null in java
- return null;
- } else {
- final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
- if ( type == BCF2Type.CHAR ) { // special case string decoding for efficiency
- return decodeLiteralString(size);
- } else if ( size == 1 ) {
- return decodeSingleValue(type);
- } else {
- final ArrayList<Object> ints = new ArrayList<Object>(size);
- for ( int i = 0; i < size; i++ ) {
- final Object val = decodeSingleValue(type);
- if ( val == null ) continue; // auto-pruning. We remove trailing nulls
- ints.add(val);
- }
- return ints.isEmpty() ? null : ints; // return null when all of the values are null
- }
- }
- }
-
- public final Object decodeSingleValue(final BCF2Type type) throws IOException {
- // TODO -- decodeTypedValue should integrate this routine
- final int value = decodeInt(type);
-
- if ( value == type.getMissingBytes() )
- return null;
- else {
- switch (type) {
- case INT8:
- case INT16:
- case INT32: return value;
- case FLOAT: return rawFloatToFloat(value);
- case CHAR: return value & 0xFF; // TODO -- I cannot imagine why we'd get here, as string needs to be special cased
- default: throw new TribbleException("BCF2 codec doesn't know how to decode type " + type );
- }
- }
- }
-
- // ----------------------------------------------------------------------
- //
- // Decode raw primitive data types (ints, floats, and strings)
- //
- // ----------------------------------------------------------------------
-
- private final Object decodeLiteralString(final int size) {
- assert size > 0;
-
- // TODO -- assumes size > 0
- final byte[] bytes = new byte[size]; // TODO -- in principle should just grab bytes from underlying array
- try {
- recordStream.read(bytes);
-
- int goodLength = 0;
- for ( ; goodLength < bytes.length ; goodLength++ )
- if ( bytes[goodLength] == 0 ) break;
-
- if ( goodLength == 0 )
- return null;
- else {
- final String s = new String(bytes, 0, goodLength);
- return BCF2Utils.isCollapsedString(s) ? BCF2Utils.explodeStringList(s) : s;
- }
- } catch ( IOException e ) {
- throw new TribbleException("readByte failure", e);
- }
- }
-
- public final int decodeNumberOfElements(final byte typeDescriptor) throws IOException {
- if ( BCF2Utils.sizeIsOverflow(typeDescriptor) )
- // -1 ensures we explode immediately with a bad size if the result is missing
- return decodeInt(readTypeDescriptor(), -1);
- else
- // the size is inline, so just decode it
- return BCF2Utils.decodeSize(typeDescriptor);
- }
-
- /**
- * Decode an int from the stream. If the value in the stream is missing,
- * returns missingValue. Requires the typeDescriptor indicate an inline
- * single element event
- *
- * @param typeDescriptor
- * @return
- */
- public final int decodeInt(final byte typeDescriptor, final int missingValue) throws IOException {
- final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
- final int i = decodeInt(type);
- return i == type.getMissingBytes() ? missingValue : i;
- }
-
- public final int decodeInt(final BCF2Type type) throws IOException {
- return type.read(recordStream);
- }
-
- /**
- * Low-level reader for int[]
- *
- * Requires a typeDescriptor so the function knows how many elements to read,
- * and how they are encoded.
- *
- * If size == 0 => result is null
- * If size > 0 => result depends on the actual values in the stream
- * -- If the first element read is MISSING, result is null (all values are missing)
- * -- Else result = int[N] where N is the first N non-missing values decoded
- *
- * @param maybeDest if not null we'll not allocate space for the vector, but instead use
- * the externally allocated array of ints to store values. If the
- * size of this vector is < the actual size of the elements, we'll be
- * forced to use freshly allocated arrays. Also note that padded
- * int elements are still forced to do a fresh allocation as well.
- * @return see description
- */
- public final int[] decodeIntArray(final int size, final BCF2Type type, int[] maybeDest) throws IOException {
- if ( size == 0 ) {
- return null;
- } else {
- if ( maybeDest != null && maybeDest.length < size )
- maybeDest = null; // by nulling this out we ensure that we do fresh allocations as maybeDest is too small
-
- final int val1 = decodeInt(type);
- if ( val1 == type.getMissingBytes() ) {
- // fast path for first element being missing
- for ( int i = 1; i < size; i++ ) decodeInt(type);
- return null;
- } else {
- // we know we will have at least 1 element, so making the int[] is worth it
- final int[] ints = maybeDest == null ? new int[size] : maybeDest;
- ints[0] = val1; // we already read the first one
- for ( int i = 1; i < size; i++ ) {
- ints[i] = decodeInt(type);
- if ( ints[i] == type.getMissingBytes() ) {
- // read the rest of the missing values, dropping them
- for ( int j = i + 1; j < size; j++ ) decodeInt(type);
- // deal with auto-pruning by returning an int[] containing
- // only the non-MISSING values. We do this by copying the first
- // i elements, as i itself is missing
- return Arrays.copyOf(ints, i);
- }
- }
- return ints; // all of the elements were non-MISSING
- }
- }
- }
-
- public final int[] decodeIntArray(final byte typeDescriptor, final int size) throws IOException {
- final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
- return decodeIntArray(size, type, null);
- }
-
- private double rawFloatToFloat(final int rawFloat) {
- return (double)Float.intBitsToFloat(rawFloat);
- }
-
- // ----------------------------------------------------------------------
- //
- // Utility functions
- //
- // ----------------------------------------------------------------------
-
- /**
- * Read the size of the next block from inputStream
- *
- * @param inputStream
- * @return
- */
- public final int readBlockSize(final InputStream inputStream) throws IOException {
- return BCF2Type.INT32.read(inputStream);
- }
-
- /**
- * Read all bytes for a BCF record block into a byte[], and return it
- *
- * Is smart about reading from the stream multiple times to fill the buffer, if necessary
- *
- * @param blockSizeInBytes number of bytes to read
- * @param inputStream the stream to read from
- * @return a non-null byte[] containing exactly blockSizeInBytes bytes from the inputStream
- */
- private static byte[] readRecordBytes(final int blockSizeInBytes, final InputStream inputStream) {
- assert blockSizeInBytes >= 0;
-
- final byte[] record = new byte[blockSizeInBytes];
- try {
- int bytesRead = 0;
- int nReadAttempts = 0; // keep track of how many times we've read
-
- // because we might not read enough bytes from the file in a single go, do it in a loop until we get EOF
- while ( bytesRead < blockSizeInBytes ) {
- final int read1 = inputStream.read(record, bytesRead, blockSizeInBytes - bytesRead);
- if ( read1 == -1 )
- validateReadBytes(bytesRead, nReadAttempts, blockSizeInBytes);
- else
- bytesRead += read1;
- }
-
- if ( GeneralUtils.DEBUG_MODE_ENABLED && nReadAttempts > 1 ) { // TODO -- remove me
- System.err.println("Required multiple read attempts to actually get the entire BCF2 block, unexpected behavior");
- }
-
- validateReadBytes(bytesRead, nReadAttempts, blockSizeInBytes);
- } catch ( IOException e ) {
- throw new TribbleException("I/O error while reading BCF2 file", e);
- }
-
- return record;
- }
-
- /**
- * Make sure we read the right number of bytes, or throw an error
- *
- * @param actuallyRead
- * @param nReadAttempts
- * @param expected
- */
- private static void validateReadBytes(final int actuallyRead, final int nReadAttempts, final int expected) {
- assert expected >= 0;
-
- if ( actuallyRead < expected ) {
- throw new TribbleException(
- String.format("Failed to read next complete record: expected %d bytes but read only %d after %d iterations",
- expected, actuallyRead, nReadAttempts));
- }
- }
-
- public final byte readTypeDescriptor() throws IOException {
- return BCF2Utils.readByte(recordStream);
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java b/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java
deleted file mode 100644
index 13c2716..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2GenotypeFieldDecoders.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * An efficient scheme for building and obtaining specialized
- * genotype field decoders. Used by the BCFCodec to parse
- * with little overhead the fields from BCF2 encoded genotype
- * records
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class BCF2GenotypeFieldDecoders {
- private final static boolean ENABLE_FASTPATH_GT = true;
- private final static int MIN_SAMPLES_FOR_FASTPATH_GENOTYPES = 0; // TODO -- update to reasonable number
-
- // initialized once per writer to allow parallel writers to work
- private final HashMap<String, Decoder> genotypeFieldDecoder = new HashMap<String, Decoder>();
- private final Decoder defaultDecoder = new GenericDecoder();
-
- public BCF2GenotypeFieldDecoders(final VCFHeader header) {
- // TODO -- fill in appropriate decoders for each FORMAT field in the header
-
- genotypeFieldDecoder.put(VCFConstants.GENOTYPE_KEY, new GTDecoder());
- // currently the generic decoder handles FILTER values properly, in so far as we don't tolerate multiple filter field values per genotype
- genotypeFieldDecoder.put(VCFConstants.GENOTYPE_FILTER_KEY, new FTDecoder());
- genotypeFieldDecoder.put(VCFConstants.DEPTH_KEY, new DPDecoder());
- genotypeFieldDecoder.put(VCFConstants.GENOTYPE_ALLELE_DEPTHS, new ADDecoder());
- genotypeFieldDecoder.put(VCFConstants.GENOTYPE_PL_KEY, new PLDecoder());
- genotypeFieldDecoder.put(VCFConstants.GENOTYPE_QUALITY_KEY, new GQDecoder());
- }
-
- // -----------------------------------------------------------------
- //
- // Genotype field decoder
- //
- // -----------------------------------------------------------------
-
- /**
- * Return decoder appropriate for field, or the generic decoder if no
- * specialized one is bound
- * @param field the GT field to decode
- * @return a non-null decoder
- */
- public Decoder getDecoder(final String field) {
- final Decoder d = genotypeFieldDecoder.get(field);
- return d == null ? defaultDecoder : d;
- }
-
- /**
- * Decoder a field (implicit from creation) encoded as
- * typeDescriptor in the decoder object in the GenotypeBuilders
- * one for each sample in order.
- *
- * The way this works is that this decode method
- * iterates over the builders, decoding a genotype field
- * in BCF2 for each sample from decoder.
- *
- * This system allows us to easily use specialized
- * decoders for specific genotype field values. For example,
- * we use a special decoder to directly read the BCF2 data for
- * the PL field into a int[] rather than the generic List of Integer
- */
- public interface Decoder {
- public void decode(final List<Allele> siteAlleles,
- final String field,
- final BCF2Decoder decoder,
- final byte typeDescriptor,
- final int numElements,
- final GenotypeBuilder[] gbs) throws IOException;
- }
-
- private class GTDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- if ( ENABLE_FASTPATH_GT && siteAlleles.size() == 2 && numElements == 2 && gbs.length >= MIN_SAMPLES_FOR_FASTPATH_GENOTYPES )
- fastBiallelicDiploidDecode(siteAlleles, decoder, typeDescriptor, gbs);
- else {
- generalDecode(siteAlleles, numElements, decoder, typeDescriptor, gbs);
- }
- }
-
- /**
- * fast path for many samples with diploid genotypes
- *
- * The way this would work is simple. Create a List<Allele> diploidGenotypes[] object
- * After decoding the offset, if that sample is diploid compute the
- * offset into the alleles vector which is simply offset = allele0 * nAlleles + allele1
- * if there's a value at diploidGenotypes[offset], use it, otherwise create the genotype
- * cache it and use that
- *
- * Some notes. If there are nAlleles at the site, there are implicitly actually
- * n + 1 options including
- */
- @SuppressWarnings({"unchecked"})
- private final void fastBiallelicDiploidDecode(final List<Allele> siteAlleles,
- final BCF2Decoder decoder,
- final byte typeDescriptor,
- final GenotypeBuilder[] gbs) throws IOException {
- final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-
- final int nPossibleGenotypes = 3 * 3;
- final Object allGenotypes[] = new Object[nPossibleGenotypes];
-
- for ( final GenotypeBuilder gb : gbs ) {
- final int a1 = decoder.decodeInt(type);
- final int a2 = decoder.decodeInt(type);
-
- if ( a1 == type.getMissingBytes() ) {
- assert a2 == type.getMissingBytes();
- // no called sample GT = .
- gb.alleles(null);
- } else if ( a2 == type.getMissingBytes() ) {
- gb.alleles(Arrays.asList(getAlleleFromEncoded(siteAlleles, a1)));
- } else {
- // downshift to remove phase
- final int offset = (a1 >> 1) * 3 + (a2 >> 1);
- assert offset < allGenotypes.length;
-
- // TODO -- how can I get rid of this cast?
- List<Allele> gt = (List<Allele>)allGenotypes[offset];
- if ( gt == null ) {
- final Allele allele1 = getAlleleFromEncoded(siteAlleles, a1);
- final Allele allele2 = getAlleleFromEncoded(siteAlleles, a2);
- gt = Arrays.asList(allele1, allele2);
- allGenotypes[offset] = gt;
- }
-
- gb.alleles(gt);
- }
-
- final boolean phased = (a1 & 0x01) == 1;
- gb.phased(phased);
- }
- }
-
- private final void generalDecode(final List<Allele> siteAlleles,
- final int ploidy,
- final BCF2Decoder decoder,
- final byte typeDescriptor,
- final GenotypeBuilder[] gbs) throws IOException {
- final BCF2Type type = BCF2Utils.decodeType(typeDescriptor);
-
- // a single cache for the encoded genotypes, since we don't actually need this vector
- final int[] tmp = new int[ploidy];
-
- for ( final GenotypeBuilder gb : gbs ) {
- final int[] encoded = decoder.decodeIntArray(ploidy, type, tmp);
- if ( encoded == null )
- // no called sample GT = .
- gb.alleles(null);
- else {
- assert encoded.length > 0;
-
- // we have at least some alleles to decode
- final List<Allele> gt = new ArrayList<Allele>(encoded.length);
-
- // note that the auto-pruning of fields magically handles different
- // ploidy per sample at a site
- for ( final int encode : encoded )
- gt.add(getAlleleFromEncoded(siteAlleles, encode));
-
- gb.alleles(gt);
- final boolean phased = (encoded[0] & 0x01) == 1;
- gb.phased(phased);
- }
- }
- }
-
- private final Allele getAlleleFromEncoded(final List<Allele> siteAlleles, final int encode) {
- final int offset = encode >> 1;
- return offset == 0 ? Allele.NO_CALL : siteAlleles.get(offset - 1);
- }
- }
-
- private class DPDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- // the -1 is for missing
- gb.DP(decoder.decodeInt(typeDescriptor, -1));
- }
- }
- }
-
- private class GQDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- // the -1 is for missing
- gb.GQ(decoder.decodeInt(typeDescriptor, -1));
- }
- }
- }
-
- private class ADDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- gb.AD(decoder.decodeIntArray(typeDescriptor, numElements));
- }
- }
- }
-
- private class PLDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- gb.PL(decoder.decodeIntArray(typeDescriptor, numElements));
- }
- }
- }
-
- private class GenericDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- Object value = decoder.decodeTypedValue(typeDescriptor, numElements);
- if ( value != null ) { // don't add missing values
- if ( value instanceof List && ((List)value).size() == 1) {
- // todo -- I really hate this, and it suggests that the code isn't completely right
- // the reason it's here is that it's possible to prune down a vector to a singleton
- // value and there we have the contract that the value comes back as an atomic value
- // not a vector of size 1
- value = ((List)value).get(0);
- }
- gb.attribute(field, value);
- }
- }
- }
- }
-
- private class FTDecoder implements Decoder {
- @Override
- public void decode(final List<Allele> siteAlleles, final String field, final BCF2Decoder decoder, final byte typeDescriptor, final int numElements, final GenotypeBuilder[] gbs) throws IOException {
- for ( final GenotypeBuilder gb : gbs ) {
- Object value = decoder.decodeTypedValue(typeDescriptor, numElements);
- assert value == null || value instanceof String;
- gb.filter((String)value);
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java b/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java
deleted file mode 100644
index aadea53..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2LazyGenotypesDecoder.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Lazy version of genotypes decoder for BCF2 genotypes
- *
- * @author Mark DePristo
- * @since 5/12
- */
-public class BCF2LazyGenotypesDecoder implements LazyGenotypesContext.LazyParser {
- // the essential information for us to use to decode the genotypes data
- // initialized when this lazy decoder is created, as we know all of this from the BCF2Codec
- // and its stored here again for code cleanliness
- private final BCF2Codec codec;
- private final List<Allele> siteAlleles;
- private final int nSamples;
- private final int nFields;
- private final GenotypeBuilder[] builders;
-
- BCF2LazyGenotypesDecoder(final BCF2Codec codec, final List<Allele> alleles, final int nSamples,
- final int nFields, final GenotypeBuilder[] builders) {
- this.codec = codec;
- this.siteAlleles = alleles;
- this.nSamples = nSamples;
- this.nFields = nFields;
- this.builders = builders;
- }
-
- @Override
- public LazyGenotypesContext.LazyData parse(final Object data) {
- try {
-
- // load our byte[] data into the decoder
- final BCF2Decoder decoder = new BCF2Decoder(((BCF2Codec.LazyData)data).bytes);
-
- for ( int i = 0; i < nSamples; i++ )
- builders[i].reset(true);
-
- for ( int i = 0; i < nFields; i++ ) {
- // get the field name
- final int offset = (Integer) decoder.decodeTypedValue();
- final String field = codec.getDictionaryString(offset);
-
- // the type of each element
- final byte typeDescriptor = decoder.readTypeDescriptor();
- final int numElements = decoder.decodeNumberOfElements(typeDescriptor);
- final BCF2GenotypeFieldDecoders.Decoder fieldDecoder = codec.getGenotypeFieldDecoder(field);
- try {
- fieldDecoder.decode(siteAlleles, field, decoder, typeDescriptor, numElements, builders);
- } catch ( ClassCastException e ) {
- throw new TribbleException("BUG: expected encoding of field " + field
- + " inconsistent with the value observed in the decoded value");
- }
- }
-
- final ArrayList<Genotype> genotypes = new ArrayList<Genotype>(nSamples);
- for ( final GenotypeBuilder gb : builders )
- genotypes.add(gb.make());
-
- return new LazyGenotypesContext.LazyData(genotypes, codec.getHeader().getSampleNamesInOrder(), codec.getHeader().getSampleNameToOffset());
- } catch ( IOException e ) {
- throw new TribbleException("Unexpected IOException parsing already read genotypes data block", e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Type.java b/src/main/java/htsjdk/variant/bcf2/BCF2Type.java
deleted file mode 100644
index 11c8edf..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Type.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/**
- * BCF2 types and associated information
- *
- * @author depristo
- * @since 05/12
- */
-public enum BCF2Type {
- // the actual values themselves
- MISSING(0, 0, 0x00) {
- @Override public int read(final InputStream in) throws IOException {
- throw new IllegalArgumentException("Cannot read MISSING type");
- }
- @Override public void write(final int value, final OutputStream out) throws IOException {
- throw new IllegalArgumentException("Cannot write MISSING type");
- }
- },
-
- INT8 (1, 1, 0xFFFFFF80, -127, 127) {
- @Override
- public int read(final InputStream in) throws IOException {
- return BCF2Utils.readByte(in);
- }
-
- @Override
- public void write(final int value, final OutputStream out) throws IOException {
- out.write(0xFF & value); // TODO -- do we need this operation?
- }
- },
-
- INT16(2, 2, 0xFFFF8000, -32767, 32767) {
- @Override
- public int read(final InputStream in) throws IOException {
- final int b2 = BCF2Utils.readByte(in) & 0xFF;
- final int b1 = BCF2Utils.readByte(in) & 0xFF;
- return (short)((b1 << 8) | b2);
- }
-
- @Override
- public void write(final int value, final OutputStream out) throws IOException {
- // TODO -- optimization -- should we put this in a local buffer?
- out.write((0x00FF & value));
- out.write((0xFF00 & value) >> 8);
- }
- },
-
- INT32(3, 4, 0x80000000, -2147483647, 2147483647) {
- @Override
- public int read(final InputStream in) throws IOException {
- final int b4 = BCF2Utils.readByte(in) & 0xFF;
- final int b3 = BCF2Utils.readByte(in) & 0xFF;
- final int b2 = BCF2Utils.readByte(in) & 0xFF;
- final int b1 = BCF2Utils.readByte(in) & 0xFF;
- return (int)(b1 << 24 | b2 << 16 | b3 << 8 | b4);
- }
-
- @Override
- public void write(final int value, final OutputStream out) throws IOException {
- out.write((0x000000FF & value));
- out.write((0x0000FF00 & value) >> 8);
- out.write((0x00FF0000 & value) >> 16);
- out.write((0xFF000000 & value) >> 24);
- }
- },
-
- FLOAT(5, 4, 0x7F800001) {
- @Override
- public int read(final InputStream in) throws IOException {
- return INT32.read(in);
- }
-
- @Override
- public void write(final int value, final OutputStream out) throws IOException {
- INT32.write(value, out);
- }
- },
-
- CHAR (7, 1, 0x00000000) {
- @Override
- public int read(final InputStream in) throws IOException {
- return INT8.read(in);
- }
-
- @Override
- public void write(final int value, final OutputStream out) throws IOException {
- INT8.write(value, out);
- }
- };
-
- private final int id;
- private final Object missingJavaValue;
- private final int missingBytes;
- private final int sizeInBytes;
- private final long minValue, maxValue;
-
- BCF2Type(final int id, final int sizeInBytes, final int missingBytes) {
- this(id, sizeInBytes, missingBytes, 0, 0);
- }
-
- BCF2Type(final int id, final int sizeInBytes, final int missingBytes, final long minValue, final long maxValue) {
- this.id = id;
- this.sizeInBytes = sizeInBytes;
- this.missingJavaValue = null;
- this.missingBytes = missingBytes;
- this.minValue = minValue;
- this.maxValue = maxValue;
- }
-
- /**
- * How many bytes are used to represent this type on disk?
- * @return
- */
- public int getSizeInBytes() {
- return sizeInBytes;
- }
-
- /**
- * The ID according to the BCF2 specification
- * @return
- */
- public int getID() { return id; }
-
- /**
- * Can we encode value v in this type, according to its declared range.
- *
- * Only makes sense for integer values
- *
- * @param v
- * @return
- */
- public final boolean withinRange(final long v) { return v >= minValue && v <= maxValue; }
-
- /**
- * Return the java object (aka null) that is used to represent a missing value for this
- * type in Java
- *
- * @return
- */
- public Object getMissingJavaValue() { return missingJavaValue; }
-
- /**
- * The bytes (encoded as an int) that are used to represent a missing value
- * for this type in BCF2
- *
- * @return
- */
- public int getMissingBytes() { return missingBytes; }
-
- /**
- * An enum set of the types that might represent Integer values
- */
- private final static EnumSet<BCF2Type> INTEGERS = EnumSet.of(INT8, INT16, INT32);
-
- /**
- * @return true if this BCF2Type corresponds to the magic "MISSING" type (0x00)
- */
- public boolean isMissingType() {
- return this == MISSING;
- }
-
- public boolean isIntegerType() {
- return INTEGERS.contains(this);
- }
-
- /**
- * Read a value from in stream of this BCF2 type as an int [32 bit] collection of bits
- *
- * For intX and char values this is just the int / byte value of the underlying data represented as a 32 bit int
- * For a char the result must be converted to a char by (char)(byte)(0x0F & value)
- * For doubles it's necessary to convert subsequently this value to a double via Double.bitsToDouble()
- *
- * @param in
- * @return
- * @throws IOException
- */
- public int read(final InputStream in) throws IOException {
- throw new IllegalArgumentException("Not implemented");
- }
-
- public void write(final int value, final OutputStream out) throws IOException {
- throw new IllegalArgumentException("Not implemented");
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java b/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java
deleted file mode 100644
index f2fb1a8..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCF2Utils.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFIDHeaderLine;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Common utilities for working with BCF2 files
- *
- * Includes convenience methods for encoding, decoding BCF2 type descriptors (size + type)
- *
- * @author depristo
- * @since 5/12
- */
-public final class BCF2Utils {
- public static final int MAX_ALLELES_IN_GENOTYPES = 127;
-
- public static final int OVERFLOW_ELEMENT_MARKER = 15;
- public static final int MAX_INLINE_ELEMENTS = 14;
-
- public final static BCF2Type[] INTEGER_TYPES_BY_SIZE = new BCF2Type[]{BCF2Type.INT8, BCF2Type.INT16, BCF2Type.INT32};
- public final static BCF2Type[] ID_TO_ENUM;
-
- static {
- int maxID = -1;
- for ( BCF2Type v : BCF2Type.values() ) maxID = Math.max(v.getID(), maxID);
- ID_TO_ENUM = new BCF2Type[maxID+1];
- for ( BCF2Type v : BCF2Type.values() ) ID_TO_ENUM[v.getID()] = v;
- }
-
- private BCF2Utils() {}
-
- /**
- * Create a strings dictionary from the VCF header
- *
- * The dictionary is an ordered list of common VCF identifers (FILTER, INFO, and FORMAT)
- * fields.
- *
- * Note that its critical that the list be dedupped and sorted in a consistent manner each time,
- * as the BCF2 offsets are encoded relative to this dictionary, and if it isn't determined exactly
- * the same way as in the header each time it's very bad
- *
- * @param header the VCFHeader from which to build the dictionary
- * @return a non-null dictionary of elements, may be empty
- */
- public static ArrayList<String> makeDictionary(final VCFHeader header) {
- final Set<String> seen = new HashSet<String>();
- final ArrayList<String> dict = new ArrayList<String>();
-
- // special case the special PASS field which doesn't show up in the FILTER field definitions
- seen.add(VCFConstants.PASSES_FILTERS_v4);
- dict.add(VCFConstants.PASSES_FILTERS_v4);
-
- // set up the strings dictionary
- for ( VCFHeaderLine line : header.getMetaDataInInputOrder() ) {
- if ( line.shouldBeAddedToDictionary() ) {
- final VCFIDHeaderLine idLine = (VCFIDHeaderLine)line;
- if ( ! seen.contains(idLine.getID())) {
- dict.add(idLine.getID());
- seen.add(idLine.getID());
- }
- }
- }
-
- return dict;
- }
-
- public static byte encodeTypeDescriptor(final int nElements, final BCF2Type type ) {
- return (byte)((0x0F & nElements) << 4 | (type.getID() & 0x0F));
- }
-
- public static int decodeSize(final byte typeDescriptor) {
- return (0xF0 & typeDescriptor) >> 4;
- }
-
- public static int decodeTypeID(final byte typeDescriptor) {
- return typeDescriptor & 0x0F;
- }
-
- public static BCF2Type decodeType(final byte typeDescriptor) {
- return ID_TO_ENUM[decodeTypeID(typeDescriptor)];
- }
-
- public static boolean sizeIsOverflow(final byte typeDescriptor) {
- return decodeSize(typeDescriptor) == OVERFLOW_ELEMENT_MARKER;
- }
-
- public static byte readByte(final InputStream stream) throws IOException {
- return (byte)(stream.read() & 0xFF);
- }
-
- /**
- * Collapse multiple strings into a comma separated list
- *
- * ["s1", "s2", "s3"] => ",s1,s2,s3"
- *
- * @param strings size > 1 list of strings
- * @return
- */
- public static String collapseStringList(final List<String> strings) {
- if ( strings.isEmpty() ) return "";
- else if ( strings.size() == 1 ) return strings.get(0);
- else {
- final StringBuilder b = new StringBuilder();
- for ( final String s : strings ) {
- if ( s != null ) {
- assert s.indexOf(",") == -1; // no commas in individual strings
- b.append(',').append(s);
- }
- }
- return b.toString();
- }
- }
-
- /**
- * Inverse operation of collapseStringList.
- *
- * ",s1,s2,s3" => ["s1", "s2", "s3"]
- *
- *
- * @param collapsed
- * @return
- */
- public static List<String> explodeStringList(final String collapsed) {
- assert isCollapsedString(collapsed);
- final String[] exploded = collapsed.substring(1).split(",");
- return Arrays.asList(exploded);
- }
-
- public static boolean isCollapsedString(final String s) {
- return !s.isEmpty() && s.charAt(0) == ',';
- }
-
- /**
- * Returns a good name for a shadow BCF file for vcfFile.
- *
- * foo.vcf => foo.bcf
- * foo.xxx => foo.xxx.bcf
- *
- * If the resulting BCF file cannot be written, return null. Happens
- * when vcfFile = /dev/null for example
- *
- * @param vcfFile
- * @return the BCF
- */
- public static final File shadowBCF(final File vcfFile) {
- final String path = vcfFile.getAbsolutePath();
- if ( path.contains(".vcf") )
- return new File(path.replace(".vcf", ".bcf"));
- else {
- final File bcf = new File( path + ".bcf" );
- if ( bcf.canRead() )
- return bcf;
- else {
- try {
- // this is the only way to robustly decide if we could actually write to BCF
- final FileOutputStream o = new FileOutputStream(bcf);
- o.close();
- bcf.delete();
- return bcf;
- } catch ( FileNotFoundException e ) {
- return null;
- } catch ( IOException e ) {
- return null;
- }
- }
- }
- }
-
- public static BCF2Type determineIntegerType(final int value) {
- for ( final BCF2Type potentialType : INTEGER_TYPES_BY_SIZE) {
- if ( potentialType.withinRange(value) )
- return potentialType;
- }
-
- throw new TribbleException("Integer cannot be encoded in allowable range of even INT32: " + value);
- }
-
- public static BCF2Type determineIntegerType(final int[] values) {
- // find the min and max values in the array
- int max = 0, min = 0;
- for ( final int v : values ) {
- if ( v > max ) max = v;
- if ( v < min ) min = v;
- }
-
- final BCF2Type maxType = determineIntegerType(max);
- final BCF2Type minType = determineIntegerType(min);
-
- // INT8 < INT16 < INT32 so this returns the larger of the two
- return maxType.compareTo(minType) >= 0 ? maxType : minType;
- }
-
- /**
- * Returns the maximum BCF2 integer size of t1 and t2
- *
- * For example, if t1 == INT8 and t2 == INT16 returns INT16
- *
- * @param t1
- * @param t2
- * @return
- */
- public static BCF2Type maxIntegerType(final BCF2Type t1, final BCF2Type t2) {
- switch ( t1 ) {
- case INT8: return t2;
- case INT16: return t2 == BCF2Type.INT32 ? t2 : t1;
- case INT32: return t1;
- default: throw new TribbleException("BUG: unexpected BCF2Type " + t1);
- }
- }
-
- public static BCF2Type determineIntegerType(final List<Integer> values) {
- BCF2Type maxType = BCF2Type.INT8;
- for ( final int value : values ) {
- final BCF2Type type1 = determineIntegerType(value);
- switch ( type1 ) {
- case INT8: break;
- case INT16: maxType = BCF2Type.INT16; break;
- case INT32: return BCF2Type.INT32; // fast path for largest possible value
- default: throw new TribbleException("Unexpected integer type " + type1 );
- }
- }
- return maxType;
- }
-
- /**
- * Helper function that takes an object and returns a list representation
- * of it:
- *
- * o == null => []
- * o is a list => o
- * else => [o]
- *
- * @param c the class of the object
- * @param o the object to convert to a Java List
- * @return
- */
- public static <T> List<T> toList(final Class<T> c, final Object o) {
- if ( o == null ) return Collections.emptyList();
- else if ( o instanceof List ) return (List<T>)o;
- else if ( o.getClass().isArray() ) {
- final int arraySize = Array.getLength(o);
- final List<T> list = new ArrayList<T>(arraySize);
- for (int i=0; i<arraySize; i++)
- list.add((T)Array.get(o, i));
- return list;
- }
- else return Collections.singletonList((T)o);
- }
-
- /**
- * Are the elements and their order in the output and input headers consistent so that
- * we can write out the raw genotypes block without decoding and recoding it?
- *
- * If the order of INFO, FILTER, or contrig elements in the output header is different than
- * in the input header we must decode the blocks using the input header and then recode them
- * based on the new output order.
- *
- * If they are consistent, we can simply pass through the raw genotypes block bytes, which is
- * a *huge* performance win for large blocks.
- *
- * Many common operations on BCF2 files (merging them for -nt, selecting a subset of records, etc)
- * don't modify the ordering of the header fields and so can safely pass through the genotypes
- * undecoded. Some operations -- those at add filters or info fields -- can change the ordering
- * of the header fields and so produce invalid BCF2 files if the genotypes aren't decoded
- */
- public static boolean headerLinesAreOrderedConsistently(final VCFHeader outputHeader, final VCFHeader genotypesBlockHeader) {
- // first, we have to have the same samples in the same order
- if ( ! nullAsEmpty(outputHeader.getSampleNamesInOrder()).equals(nullAsEmpty(genotypesBlockHeader.getSampleNamesInOrder())) )
- return false;
-
- final Iterator<? extends VCFIDHeaderLine> outputLinesIt = outputHeader.getIDHeaderLines().iterator();
- final Iterator<? extends VCFIDHeaderLine> inputLinesIt = genotypesBlockHeader.getIDHeaderLines().iterator();
-
- while ( inputLinesIt.hasNext() ) {
- if ( ! outputLinesIt.hasNext() ) // missing lines in output
- return false;
-
- final VCFIDHeaderLine outputLine = outputLinesIt.next();
- final VCFIDHeaderLine inputLine = inputLinesIt.next();
-
- if ( ! inputLine.getClass().equals(outputLine.getClass()) || ! inputLine.getID().equals(outputLine.getID()) )
- return false;
- }
-
- return true;
- }
-
- private static <T> List<T> nullAsEmpty(List<T> l) {
- if ( l == null )
- return Collections.emptyList();
- else
- return l;
- }
-}
diff --git a/src/main/java/htsjdk/variant/bcf2/BCFVersion.java b/src/main/java/htsjdk/variant/bcf2/BCFVersion.java
deleted file mode 100644
index 7605d03..0000000
--- a/src/main/java/htsjdk/variant/bcf2/BCFVersion.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * Simple holder for BCF version information
- *
- * User: depristo
- * Date: 8/2/12
- * Time: 2:16 PM
- */
-public class BCFVersion {
- /**
- * BCF2 begins with the MAGIC info BCF_M_m where M is the major version (currently 2)
- * and m is the minor version, currently 1
- */
- public static final byte[] MAGIC_HEADER_START = "BCF".getBytes();
-
- final int majorVersion;
- final int minorVersion;
-
- public BCFVersion(int majorVersion, int minorVersion) {
- this.majorVersion = majorVersion;
- this.minorVersion = minorVersion;
- }
-
- /**
- * @return the major version number of this BCF file
- */
- public int getMajorVersion() {
- return majorVersion;
- }
-
- /**
- * @return the minor version number of this BCF file
- */
- public int getMinorVersion() {
- return minorVersion;
- }
-
- /**
- * Return a new BCFVersion object describing the major and minor version of the BCF file in stream
- *
- * Note that stream must be at the very start of the file.
- *
- * @param stream
- * @return a BCFVersion object, or null if stream doesn't contain a BCF file
- * @throws IOException
- */
- public static BCFVersion readBCFVersion(final InputStream stream) throws IOException {
- final byte[] magicBytes = new byte[MAGIC_HEADER_START.length];
- stream.read(magicBytes);
- if ( Arrays.equals(magicBytes, MAGIC_HEADER_START) ) {
- // we're a BCF file
- final int majorByte = stream.read();
- final int minorByte = stream.read();
- return new BCFVersion( majorByte, minorByte );
- } else
- return null;
- }
-
- /**
- * Write out the BCF magic information indicating this is a BCF file with corresponding major and minor versions
- * @param out
- * @throws IOException
- */
- public void write(final OutputStream out) throws IOException {
- out.write(MAGIC_HEADER_START);
- out.write(getMajorVersion() & 0xFF);
- out.write(getMinorVersion() & 0xFF);
- }
-
- @Override
- public String toString() {
- return String.format("BCF%d.%d", getMajorVersion(), getMinorVersion());
- }
-}
diff --git a/src/main/java/htsjdk/variant/example/PrintVariantsExample.java b/src/main/java/htsjdk/variant/example/PrintVariantsExample.java
deleted file mode 100755
index 4471cea..0000000
--- a/src/main/java/htsjdk/variant/example/PrintVariantsExample.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- */
-package htsjdk.variant.example;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.ProgressLogger;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.Arrays;
-import java.util.stream.Collectors;
-
-/**
- * This is a example program showing how to use Feature readers and (optionally) writers.
- * It's also useful for measuring time.
- * An example invocation is:
- * java -cp dist/htsjdk-2.1.1.jar htsjdk.variant.example.PrintVariantsExample in.vcf out.vcf
- * <p>
- * Arguments:
- * - the first argument is the input file (VCF)
- * - the second argument is optional and is the name of the output file (nothing gets written if this argument is missing)
- */
-public final class PrintVariantsExample {
- private PrintVariantsExample() {
- }
-
- private static final Log log = Log.getInstance(PrintVariantsExample.class);
-
- public static void main(final String[] args) throws IOException {
- if (args.length < 1) {
- System.out.println("Usage: " + PrintVariantsExample.class.getCanonicalName() + " inFile [outFile]");
- System.exit(1);
- }
- final File inputFile = new File(args[0]);
- final File outputFile = args.length >= 2 ? new File(args[1]) : null;
-
- final long start = System.currentTimeMillis();
-
- log.info("Start with args:" + Arrays.toString(args));
- printConfigurationInfo();
-
- try(final VariantContextWriter writer = outputFile == null ? null : new VariantContextWriterBuilder().setOutputFile(outputFile).setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).unsetOption(Options.INDEX_ON_THE_FLY).build();
- final AbstractFeatureReader<VariantContext, LineIterator> reader = AbstractFeatureReader.getFeatureReader(inputFile.getAbsolutePath(), new VCFCodec(), false)){
-
- log.info(reader.getClass().getSimpleName() + " hasIndex " + reader.hasIndex());
- if (writer != null){
- log.info(writer.getClass().getSimpleName());
- writer.writeHeader((VCFHeader) reader.getHeader());
- }
-
- final ProgressLogger pl = new ProgressLogger(log, 1000000);
- for (final VariantContext vc : reader.iterator()) {
- if (writer != null){
- writer.add(vc);
- }
- pl.record(vc.getContig(), vc.getStart());
- }
- }
-
- final long end = System.currentTimeMillis();
- log.info(String.format("Done. Elapsed time %.3f seconds", (end - start) / 1000.0));
- }
-
- private static void printConfigurationInfo() throws IOException {
- log.info("Executing as " +
- System.getProperty("user.name") + '@' + InetAddress.getLocalHost().getHostName() +
- " on " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") +
- ' ' + System.getProperty("os.arch") + "; " + System.getProperty("java.vm.name") +
- ' ' + System.getProperty("java.runtime.version"));
-
- log.info(Defaults.allDefaults().entrySet().stream().map(e -> e.getKey() + ':' + e.getValue()).collect(Collectors.<String>joining(" ")));
- }
-}
diff --git a/src/main/java/htsjdk/variant/utils/GeneralUtils.java b/src/main/java/htsjdk/variant/utils/GeneralUtils.java
deleted file mode 100644
index 56230ed..0000000
--- a/src/main/java/htsjdk/variant/utils/GeneralUtils.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.utils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Constants and utility methods used throughout the VCF/BCF/VariantContext classes
- */
-public class GeneralUtils {
-
- /**
- * Setting this to true causes the VCF/BCF/VariantContext classes to emit debugging information
- * to standard error
- */
- public static final boolean DEBUG_MODE_ENABLED = false;
-
- /**
- * The smallest log10 value we'll emit from normalizeFromLog10 and other functions
- * where the real-space value is 0.0.
- */
- public final static double LOG10_P_OF_ZERO = -1000000.0;
-
- /**
- * Returns a string of the form elt1.toString() [sep elt2.toString() ... sep elt.toString()] for a collection of
- * elti objects (note there's no actual space between sep and the elti elements). Returns
- * "" if collection is empty. If collection contains just elt, then returns elt.toString()
- *
- * @param separator the string to use to separate objects
- * @param objects a collection of objects. the element order is defined by the iterator over objects
- * @param <T> the type of the objects
- * @return a non-null string
- */
- public static <T> String join(final String separator, final Collection<T> objects) {
- if (objects.isEmpty()) { // fast path for empty collection
- return "";
- } else {
- final Iterator<T> iter = objects.iterator();
- final T first = iter.next();
-
- if ( ! iter.hasNext() ) // fast path for singleton collections
- return first.toString();
- else { // full path for 2+ collection that actually need a join
- final StringBuilder ret = new StringBuilder(first.toString());
- while(iter.hasNext()) {
- ret.append(separator);
- ret.append(iter.next().toString());
- }
- return ret.toString();
- }
- }
- }
-
- /**
- * normalizes the log10-based array. ASSUMES THAT ALL ARRAY ENTRIES ARE <= 0 (<= 1 IN REAL-SPACE).
- *
- * @param array the array to be normalized
- * @return a newly allocated array corresponding the normalized values in array
- */
- public static double[] normalizeFromLog10(double[] array) {
- return normalizeFromLog10(array, false);
- }
-
- /**
- * normalizes the log10-based array. ASSUMES THAT ALL ARRAY ENTRIES ARE <= 0 (<= 1 IN REAL-SPACE).
- *
- * @param array the array to be normalized
- * @param takeLog10OfOutput if true, the output will be transformed back into log10 units
- * @return a newly allocated array corresponding the normalized values in array, maybe log10 transformed
- */
- public static double[] normalizeFromLog10(double[] array, boolean takeLog10OfOutput) {
- return normalizeFromLog10(array, takeLog10OfOutput, false);
- }
-
- /**
- * See #normalizeFromLog10 but with the additional option to use an approximation that keeps the calculation always in log-space
- *
- * @param array
- * @param takeLog10OfOutput
- * @param keepInLogSpace
- *
- * @return
- */
- public static double[] normalizeFromLog10(double[] array, boolean takeLog10OfOutput, boolean keepInLogSpace) {
- // for precision purposes, we need to add (or really subtract, since they're
- // all negative) the largest value; also, we need to convert to normal-space.
- double maxValue = arrayMax(array);
-
- // we may decide to just normalize in log space without converting to linear space
- if (keepInLogSpace) {
- for (int i = 0; i < array.length; i++) {
- array[i] -= maxValue;
- }
- return array;
- }
-
- // default case: go to linear space
- double[] normalized = new double[array.length];
-
- for (int i = 0; i < array.length; i++)
- normalized[i] = Math.pow(10, array[i] - maxValue);
-
- // normalize
- double sum = 0.0;
- for (int i = 0; i < array.length; i++)
- sum += normalized[i];
- for (int i = 0; i < array.length; i++) {
- double x = normalized[i] / sum;
- if (takeLog10OfOutput) {
- x = Math.log10(x);
- if ( x < LOG10_P_OF_ZERO || Double.isInfinite(x) )
- x = array[i] - maxValue;
- }
-
- normalized[i] = x;
- }
-
- return normalized;
- }
-
- public static double arrayMax(final double[] array) {
- return array[maxElementIndex(array, array.length)];
- }
-
- public static int maxElementIndex(final double[] array) {
- return maxElementIndex(array, array.length);
- }
-
- public static int maxElementIndex(final double[] array, final int endIndex) {
- if (array == null || array.length == 0)
- throw new IllegalArgumentException("Array cannot be null!");
-
- int maxI = 0;
- for (int i = 1; i < endIndex; i++) {
- if (array[i] > array[maxI])
- maxI = i;
- }
-
- return maxI;
- }
-
- public static <T> List<T> cons(final T elt, final List<T> l) {
- List<T> l2 = new ArrayList<T>();
- l2.add(elt);
- if (l != null) l2.addAll(l);
- return l2;
- }
-
- /**
- * Make all combinations of N size of objects
- *
- * if objects = [A, B, C]
- * if N = 1 => [[A], [B], [C]]
- * if N = 2 => [[A, A], [B, A], [C, A], [A, B], [B, B], [C, B], [A, C], [B, C], [C, C]]
- *
- * @param objects
- * @param n
- * @param <T>
- * @param withReplacement if false, the resulting permutations will only contain unique objects from objects
- * @return
- */
- public static <T> List<List<T>> makePermutations(final List<T> objects, final int n, final boolean withReplacement) {
- final List<List<T>> combinations = new ArrayList<List<T>>();
-
- if ( n <= 0 )
- ;
- else if ( n == 1 ) {
- for ( final T o : objects )
- combinations.add(Collections.singletonList(o));
- } else {
- final List<List<T>> sub = makePermutations(objects, n - 1, withReplacement);
- for ( List<T> subI : sub ) {
- for ( final T a : objects ) {
- if ( withReplacement || ! subI.contains(a) )
- combinations.add(cons(a, subI));
- }
- }
- }
-
- return combinations;
- }
-
- /**
- * Compares double values for equality (within 1e-6), or inequality.
- *
- * @param a the first double value
- * @param b the second double value
- * @return -1 if a is greater than b, 0 if a is equal to be within 1e-6, 1 if b is greater than a.
- */
- public static byte compareDoubles(double a, double b) {
- return compareDoubles(a, b, 1e-6);
- }
-
- /**
- * Compares double values for equality (within epsilon), or inequality.
- *
- * @param a the first double value
- * @param b the second double value
- * @param epsilon the precision within which two double values will be considered equal
- * @return -1 if a is greater than b, 0 if a is equal to be within epsilon, 1 if b is greater than a.
- */
- public static byte compareDoubles(double a, double b, double epsilon) {
- if (Math.abs(a - b) < epsilon) {
- return 0;
- }
- if (a > b) {
- return -1;
- }
- return 1;
- }
-
- static public final <T> List<T> reverse(final List<T> l) {
- final List<T> newL = new ArrayList<T>(l);
- Collections.reverse(newL);
- return newL;
- }
-}
-
-
diff --git a/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java b/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java
deleted file mode 100644
index 8de9d4e..0000000
--- a/src/main/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractor.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.utils;
-
-import htsjdk.samtools.BamFileIoUtils;
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMTextHeaderCodec;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import htsjdk.samtools.util.BufferedLineReader;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.CollectionUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.IntervalList;
-import htsjdk.variant.vcf.VCFFileReader;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Tiny class for automatically loading a SAMSequenceDictionary given a file
- * @author farjoun on 2/25/2014
- */
-public class SAMSequenceDictionaryExtractor {
-
- enum TYPE {
- FASTA(ReferenceSequenceFileFactory.FASTA_EXTENSIONS) {
- @Override
- SAMSequenceDictionary extractDictionary(final File reference) {
- final SAMSequenceDictionary dict = ReferenceSequenceFileFactory.getReferenceSequenceFile(reference).getSequenceDictionary();
- if (dict == null)
- throw new SAMException("Could not find dictionary next to reference file " + reference.getAbsoluteFile());
- return dict;
- }
- },
- DICTIONARY(IOUtil.DICT_FILE_EXTENSION) {
- @Override
- SAMSequenceDictionary extractDictionary(final File dictionary) {
- BufferedLineReader bufferedLineReader = null;
- try {
- bufferedLineReader = new BufferedLineReader(new FileInputStream(dictionary));
- final SAMTextHeaderCodec codec = new SAMTextHeaderCodec();
- final SAMFileHeader header = codec.decode(bufferedLineReader, dictionary.toString());
- return header.getSequenceDictionary();
- } catch (final FileNotFoundException e) {
- throw new SAMException("Could not open sequence dictionary file: " + dictionary, e);
- } finally {
- CloserUtil.close(bufferedLineReader);
- }
- }
- },
- SAM(IOUtil.SAM_FILE_EXTENSION, BamFileIoUtils.BAM_FILE_EXTENSION) {
- @Override
- SAMSequenceDictionary extractDictionary(final File sam) {
- return SamReaderFactory.makeDefault().getFileHeader(sam).getSequenceDictionary();
- }
- },
- VCF(IOUtil.VCF_EXTENSIONS) {
- @Override
- SAMSequenceDictionary extractDictionary(final File vcf) {
- VCFFileReader vcfFileReader = null;
- try {
- vcfFileReader = new VCFFileReader(vcf, false);
- return vcfFileReader.getFileHeader().getSequenceDictionary();
- } finally {
- CloserUtil.close(vcfFileReader);
- }
- }
- },
- INTERVAL_LIST(IOUtil.INTERVAL_LIST_FILE_EXTENSION) {
- @Override
- SAMSequenceDictionary extractDictionary(final File intervalList) {
- return IntervalList.fromFile(intervalList).getHeader().getSequenceDictionary();
- }
- };
-
- final Collection<String> applicableExtensions;
-
- TYPE(final String... s) {
- applicableExtensions = CollectionUtil.makeSet(s);
- }
-
- TYPE(final Collection<String> extensions) {
- applicableExtensions = extensions;
- }
-
- abstract SAMSequenceDictionary extractDictionary(final File file);
-
- static TYPE forFile(final File dictionaryExtractable) {
- for (final TYPE type : TYPE.values()) {
- for (final String s : type.applicableExtensions) {
- if (dictionaryExtractable.getName().endsWith(s)) {
- return type;
- }
- }
- }
- throw new SAMException("Cannot figure out type of file " + dictionaryExtractable.getAbsolutePath() + " from extension. Current implementation understands the following types: " + Arrays.toString(TYPE.values()));
- }
-
- @Override
- public String toString() {
- return super.toString() + ": " + applicableExtensions.toString();
- }
- }
-
- public static SAMSequenceDictionary extractDictionary(final File file) {
- return TYPE.forFile(file).extractDictionary(file);
- }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/Allele.java b/src/main/java/htsjdk/variant/variantcontext/Allele.java
deleted file mode 100644
index 44fc6aa..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/Allele.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.util.StringUtil;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * Immutable representation of an allele.
- *<p>
- * Types of alleles:
- *</p>
- *<pre>
- Ref: a t C g a // C is the reference base
- : a t G g a // C base is a G in some individuals
- : a t - g a // C base is deleted w.r.t. the reference
- : a t CAg a // A base is inserted w.r.t. the reference sequence
- </pre>
- *<p> In these cases, where are the alleles?</p>
- *<ul>
- * <li>SNP polymorphism of C/G -> { C , G } -> C is the reference allele</li>
- * <li>1 base deletion of C -> { tC , t } -> C is the reference allele and we include the preceding reference base (null alleles are not allowed)</li>
- * <li>1 base insertion of A -> { C ; CA } -> C is the reference allele (because null alleles are not allowed)</li>
- *</ul>
- *<p>
- * Suppose I see a the following in the population:
- *</p>
- *<pre>
- Ref: a t C g a // C is the reference base
- : a t G g a // C base is a G in some individuals
- : a t - g a // C base is deleted w.r.t. the reference
- </pre>
- * <p>
- * How do I represent this? There are three segregating alleles:
- * </p>
- *<blockquote>
- * { C , G , - }
- *</blockquote>
- *<p>and these are represented as:</p>
- *<blockquote>
- * { tC, tG, t }
- *</blockquote>
- *<p>
- * Now suppose I have this more complex example:
- </p>
- <pre>
- Ref: a t C g a // C is the reference base
- : a t - g a
- : a t - - a
- : a t CAg a
- </pre>
- * <p>
- * There are actually four segregating alleles:
- * </p>
- *<blockquote>
- * { Cg , -g, --, and CAg } over bases 2-4
- *</blockquote>
- *<p> represented as:</p>
- *<blockquote>
- * { tCg, tg, t, tCAg }
- *</blockquote>
- *<p>
- * Critically, it should be possible to apply an allele to a reference sequence to create the
- * correct haplotype sequence:</p>
- *<blockquote>
- * Allele + reference => haplotype
- *</blockquote>
- *<p>
- * For convenience, we are going to create Alleles where the GenomeLoc of the allele is stored outside of the
- * Allele object itself. So there's an idea of an A/C polymorphism independent of it's surrounding context.
- *
- * Given list of alleles it's possible to determine the "type" of the variation
- </p>
- <pre>
- A / C @ loc => SNP
- - / A => INDEL
- </pre>
- * <p>
- * If you know where allele is the reference, you can determine whether the variant is an insertion or deletion.
- * </p>
- * <p>
- * Alelle also supports is concept of a NO_CALL allele. This Allele represents a haplotype that couldn't be
- * determined. This is usually represented by a '.' allele.
- * </p>
- * <p>
- * Note that Alleles store all bases as bytes, in **UPPER CASE**. So 'atc' == 'ATC' from the perspective of an
- * Allele.
- * </p>
- * @author ebanks, depristo
- */
-public class Allele implements Comparable<Allele>, Serializable {
- public static final long serialVersionUID = 1L;
-
- private static final byte[] EMPTY_ALLELE_BASES = new byte[0];
-
- private boolean isRef = false;
- private boolean isNoCall = false;
- private boolean isSymbolic = false;
-
- private byte[] bases = null;
-
- /** A generic static NO_CALL allele for use */
- public final static String NO_CALL_STRING = ".";
-
- /** A generic static SPAN_DEL allele for use */
- public final static String SPAN_DEL_STRING = "*";
-
- // no public way to create an allele
- protected Allele(final byte[] bases, final boolean isRef) {
- // null alleles are no longer allowed
- if ( wouldBeNullAllele(bases) ) {
- throw new IllegalArgumentException("Null alleles are not supported");
- }
-
- // no-calls are represented as no bases
- if ( wouldBeNoCallAllele(bases) ) {
- this.bases = EMPTY_ALLELE_BASES;
- isNoCall = true;
- if ( isRef ) throw new IllegalArgumentException("Cannot tag a NoCall allele as the reference allele");
- return;
- }
-
- if ( wouldBeSymbolicAllele(bases) ) {
- isSymbolic = true;
- if ( isRef ) throw new IllegalArgumentException("Cannot tag a symbolic allele as the reference allele");
- }
- else {
- StringUtil.toUpperCase(bases);
- }
-
- this.isRef = isRef;
- this.bases = bases;
-
- if ( ! acceptableAlleleBases(bases, isRef) )
- throw new IllegalArgumentException("Unexpected base in allele bases \'" + new String(bases)+"\'");
- }
-
- protected Allele(final String bases, final boolean isRef) {
- this(bases.getBytes(), isRef);
- }
-
- /**
- * Creates a new allele based on the provided one. Ref state will be copied unless ignoreRefState is true
- * (in which case the returned allele will be non-Ref).
- *
- * This method is efficient because it can skip the validation of the bases (since the original allele was already validated)
- *
- * @param allele the allele from which to copy the bases
- * @param ignoreRefState should we ignore the reference state of the input allele and use the default ref state?
- */
- protected Allele(final Allele allele, final boolean ignoreRefState) {
- this.bases = allele.bases;
- this.isRef = ignoreRefState ? false : allele.isRef;
- this.isNoCall = allele.isNoCall;
- this.isSymbolic = allele.isSymbolic;
- }
-
-
- private final static Allele REF_A = new Allele("A", true);
- private final static Allele ALT_A = new Allele("A", false);
- private final static Allele REF_C = new Allele("C", true);
- private final static Allele ALT_C = new Allele("C", false);
- private final static Allele REF_G = new Allele("G", true);
- private final static Allele ALT_G = new Allele("G", false);
- private final static Allele REF_T = new Allele("T", true);
- private final static Allele ALT_T = new Allele("T", false);
- private final static Allele REF_N = new Allele("N", true);
- private final static Allele ALT_N = new Allele("N", false);
- public final static Allele SPAN_DEL = new Allele(SPAN_DEL_STRING, false);
- public final static Allele NO_CALL = new Allele(NO_CALL_STRING, false);
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // creation routines
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Create a new Allele that includes bases and if tagged as the reference allele if isRef == true. If bases
- * == '-', a Null allele is created. If bases == '.', a no call Allele is created. If bases == '*', a spanning deletions Allele is created.
- *
- * @param bases the DNA sequence of this variation, '-', '.', or '*'
- * @param isRef should we make this a reference allele?
- * @throws IllegalArgumentException if bases contains illegal characters or is otherwise malformated
- */
- public static Allele create(final byte[] bases, final boolean isRef) {
- if ( bases == null )
- throw new IllegalArgumentException("create: the Allele base string cannot be null; use new Allele() or new Allele(\"\") to create a Null allele");
-
- if ( bases.length == 1 ) {
- // optimization to return a static constant Allele for each single base object
- switch (bases[0]) {
- case '.':
- if ( isRef ) throw new IllegalArgumentException("Cannot tag a NoCall allele as the reference allele");
- return NO_CALL;
- case '*':
- if ( isRef ) throw new IllegalArgumentException("Cannot tag a spanning deletions allele as the reference allele");
- return SPAN_DEL;
- case 'A': case 'a' : return isRef ? REF_A : ALT_A;
- case 'C': case 'c' : return isRef ? REF_C : ALT_C;
- case 'G': case 'g' : return isRef ? REF_G : ALT_G;
- case 'T': case 't' : return isRef ? REF_T : ALT_T;
- case 'N': case 'n' : return isRef ? REF_N : ALT_N;
- default: throw new IllegalArgumentException("Illegal base [" + (char)bases[0] + "] seen in the allele");
- }
- } else {
- return new Allele(bases, isRef);
- }
- }
-
- public static Allele create(final byte base, final boolean isRef) {
- return create( new byte[]{ base }, isRef);
- }
-
- public static Allele create(final byte base) {
- return create( base, false );
- }
-
- public static Allele extend(final Allele left, final byte[] right) {
- if (left.isSymbolic())
- throw new IllegalArgumentException("Cannot extend a symbolic allele");
- byte[] bases = new byte[left.length() + right.length];
- System.arraycopy(left.getBases(), 0, bases, 0, left.length());
- System.arraycopy(right, 0, bases, left.length(), right.length);
-
- return create(bases, left.isReference());
- }
-
- /**
- * @param bases bases representing an allele
- * @return true if the bases represent the null allele
- */
- public static boolean wouldBeNullAllele(final byte[] bases) {
- return (bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.NULL_ALLELE) || bases.length == 0;
- }
-
- /**
- * @param bases bases representing an allele
- * @return true if the bases represent the SPAN_DEL allele
- */
- public static boolean wouldBeStarAllele(final byte[] bases) {
- return bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.SPANNING_DELETION_ALLELE;
- }
-
- /**
- * @param bases bases representing an allele
- * @return true if the bases represent the NO_CALL allele
- */
- public static boolean wouldBeNoCallAllele(final byte[] bases) {
- return bases.length == 1 && bases[0] == htsjdk.variant.vcf.VCFConstants.NO_CALL_ALLELE;
- }
-
- /**
- * @param bases bases representing an allele
- * @return true if the bases represent a symbolic allele
- */
- public static boolean wouldBeSymbolicAllele(final byte[] bases) {
- if ( bases.length <= 1 )
- return false;
- else {
- final String strBases = new String(bases);
- return (bases[0] == '<' || bases[bases.length-1] == '>') || // symbolic or large insertion
- (bases[0] == '.' || bases[bases.length-1] == '.') || // single breakend
- (strBases.contains("[") || strBases.contains("]")); // mated breakend
- }
- }
-
- /**
- * @param bases bases representing a reference allele
- * @return true if the bases represent the well formatted allele
- */
- public static boolean acceptableAlleleBases(final String bases) {
- return acceptableAlleleBases(bases.getBytes(), true);
- }
-
- /**
- * @param bases bases representing an allele
- * @param isReferenceAllele is a reference allele
- * @return true if the bases represent the well formatted allele
- */
- public static boolean acceptableAlleleBases(final String bases, boolean isReferenceAllele) {
- return acceptableAlleleBases(bases.getBytes(), isReferenceAllele);
- }
-
- /**
- * @param bases bases representing a reference allele
- * @return true if the bases represent the well formatted allele
- */
- public static boolean acceptableAlleleBases(final byte[] bases) {
- return acceptableAlleleBases(bases, true);
- }
-
- /**
- *
- * @param bases bases representing an allele
- * @param isReferenceAllele true if a reference allele
- * @return true if the bases represent the well formatted allele
- */
- public static boolean acceptableAlleleBases(final byte[] bases, final boolean isReferenceAllele) {
- if ( wouldBeNullAllele(bases) )
- return false;
-
- if ( wouldBeNoCallAllele(bases) || wouldBeSymbolicAllele(bases) )
- return true;
-
- if ( wouldBeStarAllele(bases) )
- return !isReferenceAllele;
-
- for (byte base : bases ) {
- switch (base) {
- case 'A': case 'C': case 'G': case 'T': case 'a': case 'c': case 'g': case 't': case 'N' : case 'n' :
- break;
- default:
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * @see #Allele(byte[], boolean)
- *
- * @param bases bases representing an allele
- * @param isRef is this the reference allele?
- */
- public static Allele create(final String bases, final boolean isRef) {
- return create(bases.getBytes(), isRef);
- }
-
-
- /**
- * Creates a non-Ref allele. @see Allele(byte[], boolean) for full information
- *
- * @param bases bases representing an allele
- */
- public static Allele create(final String bases) {
- return create(bases, false);
- }
-
- /**
- * Creates a non-Ref allele. @see Allele(byte[], boolean) for full information
- *
- * @param bases bases representing an allele
- */
- public static Allele create(final byte[] bases) {
- return create(bases, false);
- }
-
- /**
- * Creates a new allele based on the provided one. Ref state will be copied unless ignoreRefState is true
- * (in which case the returned allele will be non-Ref).
- *
- * This method is efficient because it can skip the validation of the bases (since the original allele was already validated)
- *
- * @param allele the allele from which to copy the bases
- * @param ignoreRefState should we ignore the reference state of the input allele and use the default ref state?
- */
- public static Allele create(final Allele allele, final boolean ignoreRefState) {
- return new Allele(allele, ignoreRefState);
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // accessor routines
- //
- // ---------------------------------------------------------------------------------------------------------
-
- // Returns true if this is the NO_CALL allele
- public boolean isNoCall() { return isNoCall; }
- // Returns true if this is not the NO_CALL allele
- public boolean isCalled() { return ! isNoCall(); }
-
- // Returns true if this Allele is the reference allele
- public boolean isReference() { return isRef; }
- // Returns true if this Allele is not the reference allele
- public boolean isNonReference() { return ! isReference(); }
-
- // Returns true if this Allele is symbolic (i.e. no well-defined base sequence)
- public boolean isSymbolic() { return isSymbolic; }
-
- // Returns a nice string representation of this object
- public String toString() {
- return ( isNoCall() ? NO_CALL_STRING : getDisplayString() ) + (isReference() ? "*" : "");
- }
-
- /**
- * Return the DNA bases segregating in this allele. Note this isn't reference polarized,
- * so the Null allele is represented by a vector of length 0
- *
- * @return the segregating bases
- */
- public byte[] getBases() { return isSymbolic ? EMPTY_ALLELE_BASES : bases; }
-
- /**
- * Return the DNA bases segregating in this allele in String format.
- * This is useful, because toString() adds a '*' to reference alleles and getBases() returns garbage when you call toString() on it.
- *
- * @return the segregating bases
- */
- public String getBaseString() { return isNoCall() ? NO_CALL_STRING : new String(getBases()); }
-
- /**
- * Return the printed representation of this allele.
- * Same as getBaseString(), except for symbolic alleles.
- * For symbolic alleles, the base string is empty while the display string contains <TAG>.
- *
- * @return the allele string representation
- */
- public String getDisplayString() { return new String(bases); }
-
- /**
- * Same as #getDisplayString() but returns the result as byte[].
- *
- * Slightly faster then getDisplayString()
- *
- * @return the allele string representation
- */
- public byte[] getDisplayBases() { return bases; }
-
- /**
- * @param other the other allele
- *
- * @return true if these alleles are equal
- */
- public boolean equals(Object other) {
- return ( ! (other instanceof Allele) ? false : equals((Allele)other, false) );
- }
-
- /**
- * @return hash code
- */
- public int hashCode() {
- int hash = 1;
- for (int i = 0; i < bases.length; i++)
- hash += (i+1) * bases[i];
- return hash;
- }
-
- /**
- * Returns true if this and other are equal. If ignoreRefState is true, then doesn't require both alleles has the
- * same ref tag
- *
- * @param other allele to compare to
- * @param ignoreRefState if true, ignore ref state in comparison
- * @return true if this and other are equal
- */
- public boolean equals(final Allele other, final boolean ignoreRefState) {
- return this == other || (isRef == other.isRef || ignoreRefState) && isNoCall == other.isNoCall && (bases == other.bases || Arrays.equals(bases, other.bases));
- }
-
- /**
- * @param test bases to test against
- *
- * @return true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
- */
- public boolean basesMatch(final byte[] test) { return !isSymbolic && (bases == test || Arrays.equals(bases, test)); }
-
- /**
- * @param test bases to test against
- *
- * @return true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
- */
- public boolean basesMatch(final String test) { return basesMatch(test.toUpperCase().getBytes()); }
-
- /**
- * @param test allele to test against
- *
- * @return true if this Allele contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles
- */
- public boolean basesMatch(final Allele test) { return basesMatch(test.getBases()); }
-
- /**
- * @return the length of this allele. Null and NO_CALL alleles have 0 length.
- */
- public int length() {
- return isSymbolic ? 0 : bases.length;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // useful static functions
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public static Allele getMatchingAllele(final Collection<Allele> allAlleles, final byte[] alleleBases) {
- for ( Allele a : allAlleles ) {
- if ( a.basesMatch(alleleBases) ) {
- return a;
- }
- }
-
- if ( wouldBeNoCallAllele(alleleBases) )
- return NO_CALL;
- else
- return null; // couldn't find anything
- }
-
- public int compareTo(final Allele other) {
- if ( isReference() && other.isNonReference() )
- return -1;
- else if ( isNonReference() && other.isReference() )
- return 1;
- else
- return getBaseString().compareTo(other.getBaseString()); // todo -- potential performance issue
- }
-
- public static boolean oneIsPrefixOfOther(final Allele a1, final Allele a2) {
- if ( a2.length() >= a1.length() )
- return firstIsPrefixOfSecond(a1, a2);
- else
- return firstIsPrefixOfSecond(a2, a1);
- }
-
- private static boolean firstIsPrefixOfSecond(final Allele a1, final Allele a2) {
- String a1String = a1.getBaseString();
- return a2.getBaseString().substring(0, a1String.length()).equals(a1String);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java b/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java
deleted file mode 100644
index e2f9083..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/CommonInfo.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-
-/**
- * Common utility routines for VariantContext and Genotype
- *
- * @author depristo
- */
-public final class CommonInfo implements Serializable {
- public static final long serialVersionUID = 1L;
-
- public static final double NO_LOG10_PERROR = 1.0;
-
- private static Set<String> NO_FILTERS = Collections.emptySet();
- private static Map<String, Object> NO_ATTRIBUTES = Collections.unmodifiableMap(new HashMap<String, Object>());
-
- private double log10PError = NO_LOG10_PERROR;
- private String name = null;
- private Set<String> filters = null;
- private Map<String, Object> attributes = NO_ATTRIBUTES;
-
- public CommonInfo(String name, double log10PError, Set<String> filters, Map<String, Object> attributes) {
- this.name = name;
- setLog10PError(log10PError);
- this.filters = filters;
- if ( attributes != null && ! attributes.isEmpty() ) {
- this.attributes = attributes;
- }
- }
-
- /**
- * @return the name
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the name
- *
- * @param name the name associated with this information
- */
- public void setName(String name) {
- if ( name == null ) throw new IllegalArgumentException("Name cannot be null " + this);
- this.name = name;
- }
-
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Filter
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public Set<String> getFiltersMaybeNull() {
- return filters;
- }
-
- public Set<String> getFilters() {
- return filters == null ? NO_FILTERS : Collections.unmodifiableSet(filters);
- }
-
- public boolean filtersWereApplied() {
- return filters != null;
- }
-
- public boolean isFiltered() {
- return filters == null ? false : !filters.isEmpty();
- }
-
- public boolean isNotFiltered() {
- return ! isFiltered();
- }
-
- public void addFilter(String filter) {
- if ( filters == null ) // immutable -> mutable
- filters = new HashSet<String>();
-
- if ( filter == null ) throw new IllegalArgumentException("BUG: Attempting to add null filter " + this);
- if ( getFilters().contains(filter) ) throw new IllegalArgumentException("BUG: Attempting to add duplicate filter " + filter + " at " + this);
- filters.add(filter);
- }
-
- public void addFilters(Collection<String> filters) {
- if ( filters == null ) throw new IllegalArgumentException("BUG: Attempting to add null filters at" + this);
- for ( String f : filters )
- addFilter(f);
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Working with log error rates
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public boolean hasLog10PError() {
- return getLog10PError() != NO_LOG10_PERROR;
- }
-
- /**
- * @return the -1 * log10-based error estimate
- */
- public double getLog10PError() { return log10PError; }
-
- /**
- * Floating-point arithmetic allows signed zeros such as +0.0 and -0.0.
- * Adding the constant 0.0 to the result ensures that the returned value is never -0.0
- * since (-0.0) + 0.0 = 0.0.
- *
- * When this is set to '0.0', the resulting VCF would be 0 instead of -0.
- *
- * @return double - Phred scaled quality score
- */
- public double getPhredScaledQual() { return (getLog10PError() * -10) + 0.0; }
-
- public void setLog10PError(double log10PError) {
- if ( log10PError > 0 && log10PError != NO_LOG10_PERROR)
- throw new IllegalArgumentException("BUG: log10PError cannot be > 0 : " + this.log10PError);
- if ( Double.isInfinite(this.log10PError) )
- throw new IllegalArgumentException("BUG: log10PError should not be Infinity");
- if ( Double.isNaN(this.log10PError) )
- throw new IllegalArgumentException("BUG: log10PError should not be NaN");
- this.log10PError = log10PError;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Working with attributes
- //
- // ---------------------------------------------------------------------------------------------------------
- public void clearAttributes() {
- attributes = new HashMap<String, Object>();
- }
-
- /**
- * @return the attribute map
- */
- public Map<String, Object> getAttributes() {
- return Collections.unmodifiableMap(attributes);
- }
-
- // todo -- define common attributes as enum
-
- public void setAttributes(Map<String, ?> map) {
- clearAttributes();
- putAttributes(map);
- }
-
- public void putAttribute(String key, Object value) {
- putAttribute(key, value, false);
- }
-
- public void putAttribute(String key, Object value, boolean allowOverwrites) {
- if ( ! allowOverwrites && hasAttribute(key) )
- throw new IllegalStateException("Attempting to overwrite key->value binding: key = " + key + " this = " + this);
-
- if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
- attributes = new HashMap<String, Object>();
-
- attributes.put(key, value);
- }
-
- public void removeAttribute(String key) {
- if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
- attributes = new HashMap<String, Object>();
- attributes.remove(key);
- }
-
- public void putAttributes(Map<String, ?> map) {
- if ( map != null ) {
- // for efficiency, we can skip the validation if the map is empty
- if (attributes.isEmpty()) {
- if ( attributes == NO_ATTRIBUTES ) // immutable -> mutable
- attributes = new HashMap<String, Object>();
- attributes.putAll(map);
- } else {
- for ( Map.Entry<String, ?> elt : map.entrySet() ) {
- putAttribute(elt.getKey(), elt.getValue(), false);
- }
- }
- }
- }
-
- public boolean hasAttribute(String key) {
- return attributes.containsKey(key);
- }
-
- public int getNumAttributes() {
- return attributes.size();
- }
-
- /**
- * @param key the attribute key
- *
- * @return the attribute value for the given key (or null if not set)
- */
- public Object getAttribute(String key) {
- return attributes.get(key);
- }
-
- public Object getAttribute(String key, Object defaultValue) {
- if ( hasAttribute(key) )
- return attributes.get(key);
- else
- return defaultValue;
- }
-
- /**
- * Gets the attributes from a key as a list.
- *
- * Note: int[] and double[] arrays are boxed.
- *
- * @return empty list if the key was not found; {@link Collections#singletonList(Object)} if
- * there is only one value; a list containing the values if the value is a {@link List} or array.
- */
- @SuppressWarnings("unchecked")
- public List<Object> getAttributeAsList(String key) {
- Object o = getAttribute(key);
- if ( o == null ) return Collections.emptyList();
- if ( o instanceof List ) return (List<Object>)o;
- if ( o.getClass().isArray() ) {
- if (o instanceof int[]) {
- return Arrays.stream((int[])o).boxed().collect(Collectors.toList());
- } else if (o instanceof double[]) {
- return Arrays.stream((double[])o).boxed().collect(Collectors.toList());
- }
- return Arrays.asList((Object[])o);
- }
- return Collections.singletonList(o);
- }
-
- private <T> List<T> getAttributeAsList(String key, Function<Object, T> transformer) {
- return getAttributeAsList(key).stream().map(transformer).collect(Collectors.toList());
- }
-
- public List<String> getAttributeAsStringList(String key, String defaultValue) {
- return getAttributeAsList(key, x -> (x == null) ? defaultValue : String.valueOf(x));
- }
-
- public List<Integer> getAttributeAsIntList(String key, Integer defaultValue) {
- return getAttributeAsList(key, x -> {
- if (x == null || x == VCFConstants.MISSING_VALUE_v4) {
- return defaultValue;
- } else if (x instanceof Number) {
- return ((Number) x).intValue();
- } else {
- return Integer.valueOf((String)x); // throws an exception if this isn't a string
- }
- });
- }
-
- public List<Double> getAttributeAsDoubleList(String key, Double defaultValue) {
- return getAttributeAsList(key, x -> {
- if (x == null || x == VCFConstants.MISSING_VALUE_v4) {
- return defaultValue;
- } else if (x instanceof Number) {
- return ((Number) x).doubleValue();
- } else {
- return Double.valueOf((String)x); // throws an exception if this isn't a string
- }
- });
- }
-
- public String getAttributeAsString(String key, String defaultValue) {
- Object x = getAttribute(key);
- if ( x == null ) return defaultValue;
- if ( x instanceof String ) return (String)x;
- return String.valueOf(x); // throws an exception if this isn't a string
- }
-
- public int getAttributeAsInt(String key, int defaultValue) {
- Object x = getAttribute(key);
- if ( x == null || x == VCFConstants.MISSING_VALUE_v4 ) return defaultValue;
- if ( x instanceof Integer ) return (Integer)x;
- return Integer.valueOf((String)x); // throws an exception if this isn't a string
- }
-
- public double getAttributeAsDouble(String key, double defaultValue) {
- Object x = getAttribute(key);
- if ( x == null ) return defaultValue;
- if ( x instanceof Double ) return (Double)x;
- if ( x instanceof Integer ) return (Integer)x;
- return Double.valueOf((String)x); // throws an exception if this isn't a string
- }
-
- public boolean getAttributeAsBoolean(String key, boolean defaultValue) {
- Object x = getAttribute(key);
- if ( x == null ) return defaultValue;
- if ( x instanceof Boolean ) return (Boolean)x;
- return Boolean.valueOf((String)x); // throws an exception if this isn't a string
- }
-
-// public String getAttributeAsString(String key) { return (String.valueOf(getExtendedAttribute(key))); } // **NOTE**: will turn a null Object into the String "null"
-// public int getAttributeAsInt(String key) { Object x = getExtendedAttribute(key); return x instanceof Integer ? (Integer)x : Integer.valueOf((String)x); }
-// public double getAttributeAsDouble(String key) { Object x = getExtendedAttribute(key); return x instanceof Double ? (Double)x : Double.valueOf((String)x); }
-// public boolean getAttributeAsBoolean(String key) { Object x = getExtendedAttribute(key); return x instanceof Boolean ? (Boolean)x : Boolean.valueOf((String)x); }
-// public Integer getAttributeAsIntegerNoException(String key) { try {return getAttributeAsInt(key);} catch (Exception e) {return null;} }
-// public Double getAttributeAsDoubleNoException(String key) { try {return getAttributeAsDouble(key);} catch (Exception e) {return null;} }
-// public String getAttributeAsStringNoException(String key) { if (getExtendedAttribute(key) == null) return null; return getAttributeAsString(key); }
-// public Boolean getAttributeAsBooleanNoException(String key) { try {return getAttributeAsBoolean(key);} catch (Exception e) {return null;} }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java b/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java
deleted file mode 100644
index 665e672..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/FastGenotype.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class encompasses all the basic information about a genotype.
- *
- * For the sake of performance, it does not make a copy of the Collections/arrays it's constructed from, and so
- * subsequent changes to those Collections/arrays will be reflected in the FastGenotype object
- *
- * A genotype has several key fields
- *
- * <ul>
- * <li> a sample name, must be a non-null string</li>
- * <li> an ordered list of alleles, intrepreted as the genotype of the sample,
- * each allele for each chromosome given in order. If alleles = [a*, t]
- * then the sample is a/t, with a (the reference from the *) the first
- * chromosome and t on the second chromosome</li>
- * <li> an <code>isPhased</code> marker indicating where the alleles are phased with respect to some global
- * coordinate system. See VCF4.1 spec for a detailed discussion</li>
- * <li> Inline, optimized <code>int</code>s and <code>int[]</code> values for:
- * <ul>
- * <li> GQ: the phred-scaled genotype quality, or <code>-1</code> if it's missing</li>
- * <li> DP: the count of reads at this locus for this sample, or <code>-1</code> if missing</li>
- * <li> AD: an array of counts of reads at this locus, one for each Allele at the site,
- * that is, for each allele in the surrounding <code>VariantContext</code>. <code>null</code> if missing.</li>
- * <li> PL: phred-scaled genotype likelihoods in standard VCF4.1 order for
- * all combinations of the alleles in the surrounding <code>VariantContext</code>, given
- * the ploidy of the sample (from the alleles vector). <code>null</code> if missing.</li>
- * </ul>
- * </li>
- *
- * <li> A general map from String keys to -> Object values for all other attributes in
- * this genotype. Note that this map should not contain duplicate values for the
- * standard bindings for GQ, DP, AD, and PL. Genotype filters can be put into
- * this genotype, but it isn't respected by the GATK in analyses</li>
- *</ul>
- *
- * <p>The only way to build a <code>Genotype</code> object is with a <code>GenotypeBuilder</code>, which permits values
- * to be set in any order, which means that <code>GenotypeBuilder</code> may at some in the chain of
- * sets pass through invalid states that are not permitted in a fully formed immutable
- * <code>Genotype</code>.</p>
- *
- * <p>Note this is a simplified, refactored Genotype object based on the original
- * generic (and slow) implementation from the original VariantContext + Genotype
- * codebase.</p>
- *
- * @author Mark DePristo
- * @since 05/12
- */
-public final class FastGenotype extends Genotype {
- private final List<Allele> alleles;
- private final boolean isPhased;
- private final int GQ;
- private final int DP;
- private final int[] AD;
- private final int[] PL;
- private final Map<String, Object> extendedAttributes;
-
- /**
- * The only way to make one of these, for use by GenotypeBuilder only
- *
- * @param sampleName
- * @param alleles
- * @param isPhased
- * @param GQ
- * @param DP
- * @param AD
- * @param PL
- * @param extendedAttributes
- */
- protected FastGenotype(final String sampleName,
- final List<Allele> alleles,
- final boolean isPhased,
- final int GQ,
- final int DP,
- final int[] AD,
- final int[] PL,
- final String filters,
- final Map<String, Object> extendedAttributes) {
- super(sampleName, filters);
- this.alleles = alleles;
- this.isPhased = isPhased;
- this.GQ = GQ;
- this.DP = DP;
- this.AD = AD;
- this.PL = PL;
- this.extendedAttributes = extendedAttributes;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Implmenting the abstract methods
- //
- // ---------------------------------------------------------------------------------------------------------
-
- @Override public List<Allele> getAlleles() {
- return alleles;
- }
-
- @Override public Allele getAllele(int i) {
- return alleles.get(i);
- }
-
- @Override public boolean isPhased() {
- return isPhased;
- }
-
- @Override public int getDP() {
- return DP;
- }
-
- @Override public int[] getAD() {
- return AD;
- }
-
- @Override public int getGQ() {
- return GQ;
- }
-
- @Override public int[] getPL() {
- return PL;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // get routines for extended attributes
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public Map<String, Object> getExtendedAttributes() {
- return extendedAttributes;
- }
-
- /**
- * Is values a valid AD or PL field
- * @param values
- * @return
- */
- private static boolean validADorPLField(final int[] values) {
- if ( values != null )
- for ( int v : values )
- if ( v < 0 )
- return false;
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/Genotype.java b/src/main/java/htsjdk/variant/variantcontext/Genotype.java
deleted file mode 100644
index 8d781a0..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/Genotype.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * This class encompasses all the basic information about a genotype. It is immutable.
- *
- * @author Mark DePristo
- */
-public abstract class Genotype implements Comparable<Genotype>, Serializable {
- public static final long serialVersionUID = 1L;
-
- /**
- * A list of genotype field keys corresponding to values we
- * manage inline in the Genotype object. They must not appear in the
- * extended attributes map
- */
- public final static Collection<String> PRIMARY_KEYS = Arrays.asList(
- VCFConstants.GENOTYPE_FILTER_KEY,
- VCFConstants.GENOTYPE_KEY,
- VCFConstants.GENOTYPE_QUALITY_KEY,
- VCFConstants.DEPTH_KEY,
- VCFConstants.GENOTYPE_ALLELE_DEPTHS,
- VCFConstants.GENOTYPE_PL_KEY);
-
- public final static String PHASED_ALLELE_SEPARATOR = "|";
- public final static String UNPHASED_ALLELE_SEPARATOR = "/";
-
- private final String sampleName;
- private GenotypeType type = null;
- private final String filters;
-
- protected Genotype(final String sampleName, final String filters) {
- this.sampleName = sampleName;
- this.filters = filters == null || filters.isEmpty() ? null : filters;
- }
-
- /**
- * @return the alleles for this genotype. Cannot be null. May be empty
- */
- public abstract List<Allele> getAlleles();
-
- /**
- * Returns how many times allele appears in this genotype object?
- *
- * @param allele
- * @return a value >= 0 indicating how many times the allele occurred in this sample's genotype
- */
- public int countAllele(final Allele allele) {
- int c = 0;
- for ( final Allele a : getAlleles() )
- if ( a.equals(allele) )
- c++;
-
- return c;
- }
-
- /**
- * Get the ith allele in this genotype
- *
- * @param i the ith allele, must be < the ploidy, starting with 0
- * @return the allele at position i, which cannot be null
- */
- public abstract Allele getAllele(int i);
-
- /**
- * Are the alleles phased w.r.t. the global phasing system?
- *
- * @return true if yes
- */
- public abstract boolean isPhased();
-
- /**
- * What is the ploidy of this sample?
- *
- * @return the ploidy of this genotype. 0 if the site is no-called.
- */
- public int getPloidy() {
- return getAlleles().size();
- }
-
- /**
- * @return the sequencing depth of this sample, or -1 if this value is missing
- */
- public abstract int getDP();
-
- /**
- * @return the count of reads, one for each allele in the surrounding Variant context,
- * matching the corresponding allele, or null if this value is missing. MUST
- * NOT BE MODIFIED!
- */
- public abstract int[] getAD();
-
- /**
- * Returns the name associated with this sample.
- *
- * @return a non-null String
- */
- public String getSampleName() {
- return sampleName;
- }
-
- /**
- * Returns a phred-scaled quality score, or -1 if none is available
- * @return
- */
- public abstract int getGQ();
-
- /**
- * Does the PL field have a value?
- * @return true if there's a PL field value
- */
- public boolean hasPL() {
- return getPL() != null;
- }
-
- /**
- * Does the AD field have a value?
- * @return true if there's a AD field value
- */
- public boolean hasAD() {
- return getAD() != null;
- }
-
- /**
- * Does the GQ field have a value?
- * @return true if there's a GQ field value
- */
- public boolean hasGQ() {
- return getGQ() != -1;
- }
-
- /**
- * Does the DP field have a value?
- * @return true if there's a DP field value
- */
- public boolean hasDP() {
- return getDP() != -1;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // The type of this genotype
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * @return the high-level type of this sample's genotype
- */
- public GenotypeType getType() {
- if ( type == null ) {
- type = determineType();
- }
- return type;
- }
-
- /**
- * Internal code to determine the type of the genotype from the alleles vector
- * @return the type
- */
- protected GenotypeType determineType() {
- // TODO -- this code is slow and could be optimized for the diploid case
- final List<Allele> alleles = getAlleles();
- if ( alleles.isEmpty() )
- return GenotypeType.UNAVAILABLE;
-
- boolean sawNoCall = false, sawMultipleAlleles = false;
- Allele observedAllele = null;
-
- for ( final Allele allele : alleles ) {
- if ( allele.isNoCall() )
- sawNoCall = true;
- else if ( observedAllele == null )
- observedAllele = allele;
- else if ( !allele.equals(observedAllele) )
- sawMultipleAlleles = true;
- }
-
- if ( sawNoCall ) {
- if ( observedAllele == null )
- return GenotypeType.NO_CALL;
- return GenotypeType.MIXED;
- }
-
- if ( observedAllele == null )
- throw new IllegalStateException("BUG: there are no alleles present in this genotype but the alleles list is not null");
-
- return sawMultipleAlleles ? GenotypeType.HET : observedAllele.isReference() ? GenotypeType.HOM_REF : GenotypeType.HOM_VAR;
- }
-
- /**
- * @return true if all observed alleles are the same (regardless of whether they are ref or alt); if any alleles are no-calls, this method will return false.
- */
- public boolean isHom() { return isHomRef() || isHomVar(); }
-
- /**
- * @return true if all observed alleles are ref; if any alleles are no-calls, this method will return false.
- */
- public boolean isHomRef() { return getType() == GenotypeType.HOM_REF; }
-
- /**
- * @return true if all observed alleles are alt; if any alleles are no-calls, this method will return false.
- */
- public boolean isHomVar() { return getType() == GenotypeType.HOM_VAR; }
-
- /**
- * @return true if we're het (observed alleles differ); if the ploidy is less than 2 or if any alleles are no-calls, this method will return false.
- */
- public boolean isHet() { return getType() == GenotypeType.HET; }
-
- /**
- * @return true if we're het (observed alleles differ) and neither allele is reference; if the ploidy is less than 2 or if any alleles are no-calls, this method will return false.
- */
- public boolean isHetNonRef() { return (getType() == GenotypeType.HET && getAllele(0).isNonReference() && getAllele(1).isNonReference()); }
-
- /**
- * @return true if this genotype is not actually a genotype but a "no call" (e.g. './.' in VCF); if any alleles are not no-calls (even if some are), this method will return false.
- */
- public boolean isNoCall() { return getType() == GenotypeType.NO_CALL; }
-
- /**
- * @return true if this genotype is comprised of any alleles that are not no-calls (even if some are).
- */
- public boolean isCalled() { return getType() != GenotypeType.NO_CALL && getType() != GenotypeType.UNAVAILABLE; }
-
- /**
- * @return true if this genotype is comprised of both calls and no-calls.
- */
- public boolean isMixed() { return getType() == GenotypeType.MIXED; }
-
- /**
- * @return true if the type of this genotype is set.
- */
- public boolean isAvailable() { return getType() != GenotypeType.UNAVAILABLE; }
-
- // ------------------------------------------------------------------------------
- //
- // methods for getting genotype likelihoods for a genotype object, if present
- //
- // ------------------------------------------------------------------------------
-
- /**
- * @return Returns true if this Genotype has PL field values
- */
- public boolean hasLikelihoods() {
- return getPL() != null;
- }
-
- /**
- * Convenience function that returns a string representation of the PL field of this
- * genotype, or . if none is available.
- *
- * @return a non-null String representation for the PL of this sample
- */
- public String getLikelihoodsString() {
- return hasLikelihoods() ? getLikelihoods().toString() : VCFConstants.MISSING_VALUE_v4;
- }
-
- /**
- * Returns the GenotypesLikelihoods data associated with this Genotype, or null if missing
- * @return null or a GenotypesLikelihood object for this sample's PL field
- */
- public GenotypeLikelihoods getLikelihoods() {
- return hasLikelihoods() ? GenotypeLikelihoods.fromPLs(getPL()) : null;
- }
-
- /**
- * Are all likelihoods for this sample non-informative?
- *
- * Returns true if all PLs are 0 => 0,0,0 => true
- * 0,0,0,0,0,0 => true
- * 0,10,100 => false
- *
- * @return true if all samples PLs are equal and == 0
- */
- public boolean isNonInformative() {
- if ( getPL() == null )
- return true;
- else {
- for ( final int PL : getPL() ) {
- if ( PL != 0 )
- return false;
- }
-
- return true;
- }
- }
-
- /**
- * Unsafe low-level accessor the PL field itself, may be null.
- *
- * @return a pointer to the underlying PL data. MUST NOT BE MODIFIED!
- */
- public abstract int[] getPL();
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Many different string representations
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Return a VCF-like string representation for the alleles of this genotype.
- *
- * Does not append the reference * marker on the alleles.
- *
- * @return a string representing the genotypes, or null if the type is unavailable.
- */
- public String getGenotypeString() {
- return getGenotypeString(true);
- }
-
- /**
- * Return a VCF-like string representation for the alleles of this genotype.
- *
- * If ignoreRefState is true, will not append the reference * marker on the alleles.
- *
- * @return a string representing the genotypes, or null if the type is unavailable.
- */
- public String getGenotypeString(boolean ignoreRefState) {
- if ( getPloidy() == 0 )
- return "NA";
-
- // Notes:
- // 1. Make sure to use the appropriate separator depending on whether the genotype is phased
- final String separator = isPhased() ? PHASED_ALLELE_SEPARATOR : UNPHASED_ALLELE_SEPARATOR;
- // 2. If ignoreRefState is true, then we want just the bases of the Alleles (ignoring the '*' indicating a ref Allele)
- if (ignoreRefState) {
- return ParsingUtils.join(separator, getAlleleStrings());
- }
- // 3. So that everything is deterministic with regards to integration tests, we sort Alleles (when the genotype isn't phased, of course)
- List<Allele> alleles = isPhased() ? getAlleles() : ParsingUtils.sortList(getAlleles());
- return ParsingUtils.join(separator, alleles);
- }
-
- /**
- * Utility that returns a list of allele strings corresponding to the alleles in this sample
- * @return
- */
- protected List<String> getAlleleStrings() {
- final List<String> al = new ArrayList<String>(getPloidy());
- for ( Allele a : getAlleles() )
- al.add(a.getBaseString());
-
- return al;
- }
-
- public String toString() {
- return String.format("[%s %s%s%s%s%s%s%s]",
- getSampleName(),
- getGenotypeString(false),
- toStringIfExists(VCFConstants.GENOTYPE_QUALITY_KEY, getGQ()),
- toStringIfExists(VCFConstants.DEPTH_KEY, getDP()),
- toStringIfExists(VCFConstants.GENOTYPE_ALLELE_DEPTHS, getAD()),
- toStringIfExists(VCFConstants.GENOTYPE_PL_KEY, getPL()),
- toStringIfExists(VCFConstants.GENOTYPE_FILTER_KEY, getFilters()),
- sortedString(getExtendedAttributes()));
- }
-
- public String toBriefString() {
- return String.format("%s:Q%d", getGenotypeString(false), getGQ());
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Comparison operations
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * comparable genotypes -> compareTo on the sample names
- * @param genotype
- * @return
- */
- @Override
- public int compareTo(final Genotype genotype) {
- return getSampleName().compareTo(genotype.getSampleName());
- }
-
- public boolean sameGenotype(final Genotype other) {
- return sameGenotype(other, true);
- }
-
- public boolean sameGenotype(final Genotype other, boolean ignorePhase) {
- if (getPloidy() != other.getPloidy())
- return false; // gotta have the same number of allele to be equal
-
- // By default, compare the elements in the lists of alleles, element-by-element
- Collection<Allele> thisAlleles = this.getAlleles();
- Collection<Allele> otherAlleles = other.getAlleles();
-
- if (ignorePhase) { // do not care about order, only identity of Alleles
- thisAlleles = new TreeSet<Allele>(thisAlleles); //implemented Allele.compareTo()
- otherAlleles = new TreeSet<Allele>(otherAlleles);
- }
-
- return thisAlleles.equals(otherAlleles);
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // get routines for extended attributes
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Returns the extended attributes for this object
- * @return is never null, but is often isEmpty()
- */
- public abstract Map<String, Object> getExtendedAttributes();
-
- /**
- * Is key associated with a value (even a null one) in the extended attributes?
- *
- * Note this will not return true for the inline attributes DP, GQ, AD, or PL
- *
- * @param key a non-null string key to check for an association
- * @return true if key has a value in the extendedAttributes
- */
- public boolean hasExtendedAttribute(final String key) {
- return getExtendedAttributes().containsKey(key);
- }
-
- /**
- * Get the extended attribute value associated with key, if possible
- *
- * @param key a non-null string key to fetch a value for
- * @param defaultValue the value to return if key isn't in the extended attributes
- * @return a value (potentially) null associated with key, or defaultValue if no association exists
- */
- public Object getExtendedAttribute(final String key, final Object defaultValue) {
- return hasExtendedAttribute(key) ? getExtendedAttributes().get(key) : defaultValue;
- }
-
- /**
- * Same as #getExtendedAttribute with a null default
- *
- * @param key
- * @return
- */
- public Object getExtendedAttribute(final String key) {
- return getExtendedAttribute(key, null);
- }
-
- /**
- * Returns the filter string associated with this Genotype.
- *
- * @return If this result == null, then the genotype is considered PASSing filters
- * If the result != null, then the genotype has failed filtering for the reason(s)
- * specified in result. To be reference compliant multiple filter field
- * string values can be encoded with a ; separator.
- */
- public final String getFilters() {
- return filters;
- }
-
- /**
- * Is this genotype filtered or not?
- *
- * @return returns false if getFilters() == null
- */
- public final boolean isFiltered() {
- return getFilters() != null;
- }
-
- @Deprecated public boolean hasLog10PError() { return hasGQ(); }
- @Deprecated public double getLog10PError() { return getGQ() / -10.0; }
- @Deprecated public int getPhredScaledQual() { return getGQ(); }
-
- @Deprecated
- public String getAttributeAsString(String key, String defaultValue) {
- Object x = getExtendedAttribute(key);
- if ( x == null ) return defaultValue;
- if ( x instanceof String ) return (String)x;
- return String.valueOf(x); // throws an exception if this isn't a string
- }
-
- @Deprecated
- public int getAttributeAsInt(String key, int defaultValue) {
- Object x = getExtendedAttribute(key);
- if ( x == null || x == VCFConstants.MISSING_VALUE_v4 ) return defaultValue;
- if ( x instanceof Integer ) return (Integer)x;
- return Integer.valueOf((String)x); // throws an exception if this isn't a string
- }
-
- @Deprecated
- public double getAttributeAsDouble(String key, double defaultValue) {
- Object x = getExtendedAttribute(key);
- if ( x == null ) return defaultValue;
- if ( x instanceof Double ) return (Double)x;
- return Double.valueOf((String)x); // throws an exception if this isn't a string
- }
-
- /**
- * A totally generic getter, that allows you to get specific keys that correspond
- * to even inline values (GQ, for example). Can be very expensive. Additionally,
- * all <code>int[]</code> are converted inline into <code>List<Integer></code> for convenience.
- *
- * @param key
- * @return
- */
- public Object getAnyAttribute(final String key) {
- if (key.equals(VCFConstants.GENOTYPE_KEY)) {
- return getAlleles();
- } else if (key.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
- return getGQ();
- } else if (key.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
- if (hasAD()) {
- final List<Integer> intList = new ArrayList<Integer>(getAD().length);
- for(int i : getAD()) intList.add(i);
- return intList;
- }
- return Collections.EMPTY_LIST;
- } else if (key.equals(VCFConstants.GENOTYPE_PL_KEY)) {
- if (hasPL()) {
- final List<Integer> intList = new ArrayList<Integer>(getPL().length);
- for(int i : getPL()) intList.add(i);
- return intList;
- }
- return Collections.EMPTY_LIST;
- } else if (key.equals(VCFConstants.DEPTH_KEY)) {
- return getDP();
- } else if (key.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
- return getFilters();
- } else {
- return getExtendedAttribute(key);
- }
- }
-
- public boolean hasAnyAttribute(final String key) {
- if (key.equals(VCFConstants.GENOTYPE_KEY)) {
- return isAvailable();
- } else if (key.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
- return hasGQ();
- } else if (key.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
- return hasAD();
- } else if (key.equals(VCFConstants.GENOTYPE_PL_KEY)) {
- return hasPL();
- } else if (key.equals(VCFConstants.DEPTH_KEY)) {
- return hasDP();
- } else if (key.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
- return true; //always available
- } else {
- return hasExtendedAttribute(key);
- }
- }
-
- // TODO -- add getAttributesAsX interface here
-
- // ------------------------------------------------------------------------------
- //
- // private utilities
- //
- // ------------------------------------------------------------------------------
-
- /**
- * a utility method for generating sorted strings from a map key set.
- * @param c the map
- * @param <T> the key type
- * @param <V> the value type
- * @return a sting, enclosed in {}, with comma seperated key value pairs in order of the keys
- */
- protected static <T extends Comparable<T>, V> String sortedString(Map<T, V> c) {
-
- // NOTE -- THIS IS COPIED FROM GATK UTILS TO ALLOW US TO KEEP A SEPARATION BETWEEN THE GATK AND VCF CODECS
- final List<T> t = new ArrayList<T>(c.keySet());
- Collections.sort(t);
-
- final List<String> pairs = new ArrayList<String>();
- for (final T k : t) {
- pairs.add(k + "=" + c.get(k));
- }
-
- return pairs.isEmpty() ? "" : " {" + ParsingUtils.join(", ", pairs.toArray(new String[pairs.size()])) + "}";
- }
-
- /**
- * Returns a display name for field name with value v if this isn't -1. Otherwise returns ""
- * @param name of the field ("AD")
- * @param v the value of the field, or -1 if missing
- * @return a non-null string for display if the field is not missing
- */
- protected final static String toStringIfExists(final String name, final int v) {
- return v == -1 ? "" : " " + name + " " + v;
- }
-
- /**
- * Returns a display name for field name with String value v if this isn't null. Otherwise returns ""
- * @param name of the field ("FT")
- * @param v the value of the field, or null if missing
- * @return a non-null string for display if the field is not missing
- */
- protected final static String toStringIfExists(final String name, final String v) {
- return v == null ? "" : " " + name + " " + v;
- }
-
- /**
- * Returns a display name for field name with values vs if this isn't null. Otherwise returns ""
- * @param name of the field ("AD")
- * @param vs the value of the field, or null if missing
- * @return a non-null string for display if the field is not missing
- */
- protected final static String toStringIfExists(final String name, final int[] vs) {
- if ( vs == null )
- return "";
- else {
- StringBuilder b = new StringBuilder();
- b.append(' ').append(name).append(' ');
- for ( int i = 0; i < vs.length; i++ ) {
- if ( i != 0 ) b.append(',');
- b.append(vs[i]);
- }
- return b.toString();
- }
- }
-
- /**
- * Does the attribute map have a mapping involving a forbidden key (i.e.,
- * one that's managed inline by this Genotypes object?
- *
- * @param attributes the extended attributes key
- * @return
- */
- protected final static boolean hasForbiddenKey(final Map<String, Object> attributes) {
- for ( final String forbidden : PRIMARY_KEYS)
- if ( attributes.containsKey(forbidden) )
- return true;
- return false;
- }
-
- protected final static boolean isForbiddenKey(final String key) {
- return PRIMARY_KEYS.contains(key);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java
deleted file mode 100644
index 483e1c6..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeBuilder.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A builder class for genotypes
- *
- * Provides convenience setter methods for all of the Genotype field
- * values. Setter methods can be used in any order, allowing you to
- * pass through states that wouldn't be allowed in the highly regulated
- * immutable Genotype class.
- *
- * All fields default to meaningful MISSING values.
- *
- * Call make() to actually create the corresponding Genotype object from
- * this builder. Can be called multiple times to create independent copies,
- * or with intervening sets to conveniently make similar Genotypes with
- * slight modifications.
- *
- * Re-using the same GenotypeBuilder to build multiple Genotype objects via calls
- * to make() is dangerous, since reference types in the builder (eg., Collections/arrays)
- * don't get copied when making each Genotype. To safely re-use the same builder object
- * multiple times, use makeWithShallowCopy() instead of make().
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public final class GenotypeBuilder {
- private static final List<Allele> HAPLOID_NO_CALL = Arrays.asList(Allele.NO_CALL);
- private static final List<Allele> DIPLOID_NO_CALL = Arrays.asList(Allele.NO_CALL, Allele.NO_CALL);
-
- private String sampleName = null;
- private List<Allele> alleles = Collections.emptyList();
-
- private boolean isPhased = false;
- private int GQ = -1;
- private int DP = -1;
- private int[] AD = null;
- private int[] PL = null;
- private Map<String, Object> extendedAttributes = null;
- private String filters = null;
- private int initialAttributeMapSize = 5;
-
- private final static Map<String, Object> NO_ATTRIBUTES =
- Collections.unmodifiableMap(new HashMap<String, Object>(0));
-
- // -----------------------------------------------------------------
- //
- // Factory methods
- //
- // -----------------------------------------------------------------
-
- public static Genotype create(final String sampleName, final List<Allele> alleles) {
- return new GenotypeBuilder(sampleName, alleles).make();
- }
-
- public static Genotype create(final String sampleName,
- final List<Allele> alleles,
- final Map<String, Object> attributes) {
- return new GenotypeBuilder(sampleName, alleles).attributes(attributes).make();
- }
-
- protected static Genotype create(final String sampleName,
- final List<Allele> alleles,
- final double[] gls) {
- return new GenotypeBuilder(sampleName, alleles).PL(gls).make();
- }
-
- /**
- * Create a new Genotype object for a sample that's missing from the VC (i.e., in
- * the output header). Defaults to a diploid no call genotype ./.
- *
- * @param sampleName the name of this sample
- * @return an initialized Genotype with sampleName that's a diploid ./. no call genotype
- */
- public static Genotype createMissing(final String sampleName, final int ploidy) {
- final GenotypeBuilder builder = new GenotypeBuilder(sampleName);
- switch ( ploidy ) {
- case 1: builder.alleles(HAPLOID_NO_CALL); break;
- case 2: builder.alleles(DIPLOID_NO_CALL); break;
- default: builder.alleles(Collections.nCopies(ploidy, Allele.NO_CALL)); break;
- }
- return builder.make();
- }
-
- /**
- * Create a empty builder. Both a sampleName and alleles must be provided
- * before trying to make a Genotype from this builder.
- */
- public GenotypeBuilder() {}
-
- /**
- * Create a builder using sampleName. Alleles must be provided
- * before trying to make a Genotype from this builder.
- * @param sampleName
- */
- public GenotypeBuilder(final String sampleName) {
- name(sampleName);
- }
-
- /**
- * Make a builder using sampleName and alleles for starting values
- * @param sampleName
- * @param alleles
- */
- public GenotypeBuilder(final String sampleName, final List<Allele> alleles) {
- name(sampleName);
- alleles(alleles);
- }
-
- /**
- * Create a new builder starting with the values in Genotype g
- * @param g
- */
- public GenotypeBuilder(final Genotype g) {
- copy(g);
- }
-
- /**
- * Copy all of the values for this builder from Genotype g
- * @param g
- * @return
- */
- public GenotypeBuilder copy(final Genotype g) {
- name(g.getSampleName());
- alleles(g.getAlleles());
- phased(g.isPhased());
- GQ(g.getGQ());
- DP(g.getDP());
- AD(g.getAD());
- PL(g.getPL());
- filter(g.getFilters());
- attributes(g.getExtendedAttributes());
- return this;
- }
-
- /**
- * Reset all of the builder attributes to their defaults. After this
- * function you must provide sampleName and alleles before trying to
- * make more Genotypes.
- */
- public final void reset(final boolean keepSampleName) {
- if ( ! keepSampleName ) sampleName = null;
- alleles = Collections.emptyList();
- isPhased = false;
- GQ = -1;
- DP = -1;
- AD = null;
- PL = null;
- filters = null;
- extendedAttributes = null;
- }
-
- /**
- * Create a new Genotype object using the values set in this builder.
- *
- * After creation the values in this builder can be modified and more Genotypes
- * created, althrough the contents of array values like PL should never be modified
- * inline as they are not copied for efficiency reasons.
- *
- * Note: if attributes are added via this builder after a call to make(), the new Genotype will
- * be modified. Use {@link #makeWithShallowCopy} to safely re-use the same builder object
- * multiple times.
- *
- * @return a newly minted Genotype object with values provided from this builder
- */
- public Genotype make() {
- final Map<String, Object> ea = (extendedAttributes == null) ? NO_ATTRIBUTES : extendedAttributes;
- return new FastGenotype(sampleName, alleles, isPhased, GQ, DP, AD, PL, filters, ea);
- }
-
- /**
- * Create a new Genotype object using the values set in this builder, and perform a
- * shallow copy of reference types to allow safer re-use of this builder
- *
- * After creation the values in this builder can be modified and more Genotypes
- * created.
- *
- * @return a newly minted Genotype object with values provided from this builder
- */
- public Genotype makeWithShallowCopy() {
- final Map<String, Object> ea = (extendedAttributes == null) ? NO_ATTRIBUTES : new HashMap<>(extendedAttributes);
- final List<Allele> al = new ArrayList<>(alleles);
- final int[] copyAD = (AD == null) ? null : Arrays.copyOf(AD, AD.length);
- final int[] copyPL = (PL == null) ? null : Arrays.copyOf(PL, PL.length);
- return new FastGenotype(sampleName, al, isPhased, GQ, DP, copyAD, copyPL, filters, ea);
- }
-
- /**
- * Set this genotype's name
- * @param sampleName
- * @return
- */
- public GenotypeBuilder name(final String sampleName) {
- this.sampleName = sampleName;
- return this;
- }
-
- /**
- * Set this genotype's alleles
- * @param alleles
- * @return
- */
- public GenotypeBuilder alleles(final List<Allele> alleles) {
- if ( alleles == null )
- this.alleles = Collections.emptyList();
- else
- this.alleles = alleles;
- return this;
- }
-
- /**
- * Is this genotype phased?
- * @param phased
- * @return
- */
- public GenotypeBuilder phased(final boolean phased) {
- isPhased = phased;
- return this;
- }
-
- public GenotypeBuilder GQ(final int GQ) {
- this.GQ = GQ;
- return this;
- }
-
- /** Set the GQ with a log10PError value
- *
- * @param pLog10Error
- * @return
- */
- public GenotypeBuilder log10PError(final double pLog10Error) {
- if ( pLog10Error == CommonInfo.NO_LOG10_PERROR )
- return noGQ();
- else
- return GQ((int)Math.round(pLog10Error * -10));
- }
-
- /**
- * This genotype has no GQ value
- * @return
- */
- public GenotypeBuilder noGQ() { GQ = -1; return this; }
-
- /**
- * This genotype has no AD value
- * @return
- */
- public GenotypeBuilder noAD() { AD = null; return this; }
-
- /**
- * This genotype has no DP value
- * @return
- */
- public GenotypeBuilder noDP() { DP = -1; return this; }
-
- /**
- * This genotype has no PL value
- * @return
- */
- public GenotypeBuilder noPL() { PL = null; return this; }
-
- /**
- * This genotype has this DP value
- * @return
- */
- public GenotypeBuilder DP(final int DP) {
- this.DP = DP;
- return this;
- }
-
- /**
- * This genotype has this AD value
- * @return
- */
- public GenotypeBuilder AD(final int[] AD) {
- this.AD = AD;
- return this;
- }
-
- /**
- * This genotype has this PL value, as int[]. FAST
- * @return
- */
- public GenotypeBuilder PL(final int[] PL) {
- this.PL = PL;
- return this;
- }
-
- /**
- * This genotype has this PL value, converted from double[]. SLOW
- * @return
- */
- public GenotypeBuilder PL(final double[] GLs) {
- this.PL = GenotypeLikelihoods.fromLog10Likelihoods(GLs).getAsPLs();
- return this;
- }
-
- /**
- * This genotype has these attributes. Attributes are added to previous ones.
- *
- * Cannot contain inline attributes (DP, AD, GQ, PL). Note: this is not checked
- * @return
- */
- public GenotypeBuilder attributes(final Map<String, Object> attributes) {
- for ( Map.Entry<String, Object> pair : attributes.entrySet() )
- attribute(pair.getKey(), pair.getValue());
- return this;
- }
-
- /**
- * Tells this builder to remove all extended attributes
- *
- * @return
- */
- public GenotypeBuilder noAttributes() {
- this.extendedAttributes = null;
- return this;
- }
-
- /**
- * This genotype has this attribute key / value pair.
- *
- * Cannot contain inline attributes (DP, AD, GQ, PL). Note: this is not checked
- * @return
- */
- public GenotypeBuilder attribute(final String key, final Object value) {
- if ( extendedAttributes == null )
- extendedAttributes = new HashMap<String, Object>(initialAttributeMapSize);
- extendedAttributes.put(key, value);
- return this;
- }
-
- /**
- * Tells this builder to make a Genotype object that has had filters applied,
- * which may be empty (passes) or have some value indicating the reasons
- * why it's been filtered.
- *
- * @param filters non-null list of filters. empty list => PASS
- * @return this builder
- */
- public GenotypeBuilder filters(final List<String> filters) {
- if ( filters.isEmpty() )
- return filter(null);
- else if ( filters.size() == 1 )
- return filter(filters.get(0));
- else
- return filter(ParsingUtils.join(";", ParsingUtils.sortList(filters)));
- }
-
- /**
- * varargs version of #filters
- * @param filters
- * @return
- */
- public GenotypeBuilder filters(final String ... filters) {
- return filters(Arrays.asList(filters));
- }
-
- /**
- * Most efficient version of setting filters -- just set the filters string to filters
- *
- * @param filter if filters == null or filters.equals("PASS") => genotype is PASS
- * @return
- */
- public GenotypeBuilder filter(final String filter) {
- this.filters = VCFConstants.PASSES_FILTERS_v4.equals(filter) ? null : filter;
- return this;
- }
-
- /**
- * This genotype is unfiltered
- *
- * @return
- */
- public GenotypeBuilder unfiltered() {
- return filter(null);
- }
-
- /**
- * Tell's this builder that we have at most these number of attributes
- * @return
- */
- public GenotypeBuilder maxAttributes(final int i) {
- initialAttributeMapSize = i;
- return this;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java
deleted file mode 100644
index 8d2cd10..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeJEXLContext.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *
- * @author bbimber
- *
- * implements the JEXL context for Genotype; this saves us from
- * having to generate a JEXL context lookup map everytime we want to evaluate an expression.
- *
- */
-public class GenotypeJEXLContext extends VariantJEXLContext {
- private Genotype g;
-
- private interface AttributeGetter {
- public Object get(Genotype g);
- }
-
- private static Map<String, AttributeGetter> attributes = new HashMap<String, AttributeGetter>();
-
- static {
- attributes.put("g", (Genotype g) -> g);
- attributes.put(VCFConstants.GENOTYPE_KEY, Genotype::getGenotypeString);
-
- attributes.put("isHom", (Genotype g) -> g.isHom() ? true_string : false_string);
- attributes.put("isHomRef", (Genotype g) -> g.isHomRef() ? true_string : false_string);
- attributes.put("isHet", (Genotype g) -> g.isHet() ? true_string : false_string);
- attributes.put("isHomVar", (Genotype g) -> g.isHomVar() ? true_string : false_string);
- attributes.put("isCalled", (Genotype g) -> g.isCalled() ? true_string : false_string);
- attributes.put("isNoCall", (Genotype g) -> g.isNoCall() ? true_string : false_string);
- attributes.put("isMixed", (Genotype g) -> g.isMixed() ? true_string : false_string);
- attributes.put("isAvailable", (Genotype g) -> g.isAvailable() ? true_string : false_string);
- attributes.put("isPassFT", (Genotype g) -> g.isFiltered() ? false_string : true_string);
- attributes.put(VCFConstants.GENOTYPE_FILTER_KEY, (Genotype g) -> g.isFiltered()? g.getFilters() : VCFConstants.PASSES_FILTERS_v4);
- attributes.put(VCFConstants.GENOTYPE_QUALITY_KEY, Genotype::getGQ);
- }
-
- public GenotypeJEXLContext(VariantContext vc, Genotype g) {
- super(vc);
- this.g = g;
- }
-
- @Override
- public Object get(String name) {
- //should matching genotype attributes always supersede vc?
- if ( attributes.containsKey(name) ) { // dynamic resolution of name -> value via map
- return attributes.get(name).get(g);
- } else if ( g.hasAnyAttribute(name) ) {
- return g.getAnyAttribute(name);
- } else if ( g.getFilters() != null && g.getFilters().contains(name) ) {
- return true_string;
- } else
- return super.get(name);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java
deleted file mode 100644
index ee3e08d..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeLikelihoods.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-
-public class GenotypeLikelihoods {
- private final static int NUM_LIKELIHOODS_CACHE_N_ALLELES = 5;
- private final static int NUM_LIKELIHOODS_CACHE_PLOIDY = 10;
- // caches likelihoods up to 5 alleles and up to 10 ploidy
- private final static int[][] numLikelihoodCache = new int[NUM_LIKELIHOODS_CACHE_N_ALLELES][NUM_LIKELIHOODS_CACHE_PLOIDY];
-
- public final static int MAX_PL = Integer.MAX_VALUE;
-
- //
- // There are two objects here because we are lazy in creating both representations
- // for this object: a vector of log10 Probs and the PL phred-scaled string. Supports
- // having one set during initializating, and dynamic creation of the other, if needed
- //
- private double[] log10Likelihoods = null;
- private String likelihoodsAsString_PLs = null;
-
- /**
- * initialize num likelihoods cache
- */
- static {
- // must be done before PLIndexToAlleleIndex
- for ( int numAlleles = 1; numAlleles < NUM_LIKELIHOODS_CACHE_N_ALLELES; numAlleles++ ) {
- for ( int ploidy = 1; ploidy < NUM_LIKELIHOODS_CACHE_PLOIDY; ploidy++ ) {
- numLikelihoodCache[numAlleles][ploidy] = calcNumLikelihoods(numAlleles, ploidy);
- }
- }
- }
-
- /**
- * The maximum number of diploid alternate alleles that we can represent as genotype likelihoods
- */
- public final static int MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED = 50;
-
- /**
- * A cache of the PL index to the 2 alleles it represents over all possible numbers of alternate alleles
- */
- private final static GenotypeLikelihoodsAllelePair[] diploidPLIndexToAlleleIndex = calculateDiploidPLcache(MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED);
-
- /**
- * A cache of PL index to a list of alleles for any ploidy.
- * For example, for a ploidy of 3, the allele lists for each PL index is:
- * {0,0,0}, {0,0,1}, {0,1,1}, {1,1,1}, {0,0,2}, {0,1,2}, {1,1,2}, {0,2,2}, {1,2,2}, {2,2,2}
- */
- protected final static Map<Integer, List<List<Integer>>> anyploidPloidyToPLIndexToAlleleIndices = new HashMap<Integer, List<List<Integer>>>();
-
- public final static GenotypeLikelihoods fromPLField(String PLs) {
- return new GenotypeLikelihoods(PLs);
- }
-
- @Deprecated
- public final static GenotypeLikelihoods fromGLField(String GLs) {
- return new GenotypeLikelihoods(parseDeprecatedGLString(GLs));
- }
-
- public final static GenotypeLikelihoods fromLog10Likelihoods(double[] log10Likelihoods) {
- return new GenotypeLikelihoods(log10Likelihoods);
- }
-
- public final static GenotypeLikelihoods fromPLs(final int[] pls) {
- return new GenotypeLikelihoods(PLsToGLs(pls));
- }
-
- //
- // You must use the factory methods now
- //
- private GenotypeLikelihoods(String asString) {
- likelihoodsAsString_PLs = asString;
- }
-
- private GenotypeLikelihoods(double[] asVector) {
- log10Likelihoods = asVector;
- }
-
- /**
- * The genotypes likelihoods in -10log10(x) vector format. pr{AA} = x, this
- * vector returns math.log10(x) for each of the genotypes. Can return null if the
- * genotype likelihoods are "missing".
- *
- * @return genotypes likelihoods in negative log10 vector format
- */
- public double[] getAsVector() {
- // assumes one of the likelihoods vector or the string isn't null
- if ( log10Likelihoods == null ) {
- // make sure we create the GL string if it doesn't already exist
- log10Likelihoods = parsePLsIntoLikelihoods(likelihoodsAsString_PLs);
- }
-
- return log10Likelihoods;
- }
-
- public int[] getAsPLs() {
- final double[] GLs = getAsVector();
- return GLs == null ? null : GLsToPLs(GLs);
- }
-
- public String toString() {
- return getAsString();
- }
-
- public String getAsString() {
- if ( likelihoodsAsString_PLs == null ) {
- // todo -- should we accept null log10Likelihoods and set PLs as MISSING?
- if ( log10Likelihoods == null )
- throw new TribbleException("BUG: Attempted to get likelihoods as strings and neither the vector nor the string is set!");
- likelihoodsAsString_PLs = convertLikelihoodsToPLString(log10Likelihoods);
- }
-
- return likelihoodsAsString_PLs;
- }
-
- @Override public boolean equals(Object aThat) {
- //check for self-comparison
- if ( this == aThat ) return true;
-
- if ( !(aThat instanceof GenotypeLikelihoods) ) return false;
- GenotypeLikelihoods that = (GenotypeLikelihoods)aThat;
-
- // now a proper field-by-field evaluation can be made.
- // GLs are considered equal if the corresponding PLs are equal
- return Arrays.equals(getAsPLs(), that.getAsPLs());
- }
-
- //Return genotype likelihoods as an EnumMap with Genotypes as keys and likelihoods as values
- //Returns null in case of missing likelihoods
- public EnumMap<GenotypeType,Double> getAsMap(boolean normalizeFromLog10){
- //Make sure that the log10likelihoods are set
- double[] likelihoods = normalizeFromLog10 ? GeneralUtils.normalizeFromLog10(getAsVector()) : getAsVector();
- if(likelihoods == null)
- return null;
- EnumMap<GenotypeType,Double> likelihoodsMap = new EnumMap<GenotypeType, Double>(GenotypeType.class);
- likelihoodsMap.put(GenotypeType.HOM_REF,likelihoods[GenotypeType.HOM_REF.ordinal()-1]);
- likelihoodsMap.put(GenotypeType.HET,likelihoods[GenotypeType.HET.ordinal()-1]);
- likelihoodsMap.put(GenotypeType.HOM_VAR, likelihoods[GenotypeType.HOM_VAR.ordinal() - 1]);
- return likelihoodsMap;
- }
-
- //Return the neg log10 Genotype Quality (GQ) for the given genotype
- //Returns Double.NEGATIVE_INFINITY in case of missing genotype
-
- /**
- * This is really dangerous and returns completely wrong results for genotypes from a multi-allelic context.
- * Use <code>getLog10GQ(Genotype,VariantContext)</code>
- * or <code>getLog10GQ(Genotype,List<Allele>)</code> in place of it.
- *
- * If you <strong>know</strong> you're biallelic, use <code>getGQLog10FromLikelihoods</code> directly.
- * @param genotype - actually a genotype type (no call, hom ref, het, hom var)
- * @return an unsafe quantity that could be negative. In the bi-allelic case, the GQ resulting from best minus next best (if the type is the best).
- */
- @Deprecated
- public double getLog10GQ(GenotypeType genotype){
- return getGQLog10FromLikelihoods(genotype.ordinal() - 1 /* NO_CALL IS FIRST */, getAsVector());
- }
-
- private double getLog10GQ(List<Allele> genotypeAlleles,List<Allele> contextAlleles) {
- int allele1Index = contextAlleles.indexOf(genotypeAlleles.get(0));
- int allele2Index = contextAlleles.indexOf(genotypeAlleles.get(1));
- int plIndex = calculatePLindex(allele1Index,allele2Index);
- return getGQLog10FromLikelihoods(plIndex,getAsVector());
- }
-
- public double getLog10GQ(Genotype genotype, List<Allele> vcAlleles ) {
- return getLog10GQ(genotype.getAlleles(),vcAlleles);
- }
-
- public double getLog10GQ(Genotype genotype, VariantContext context) {
- return getLog10GQ(genotype,context.getAlleles());
- }
-
- public static double getGQLog10FromLikelihoods(int iOfChoosenGenotype, double[] likelihoods){
- if(likelihoods == null)
- return Double.NEGATIVE_INFINITY;
-
- double qual = Double.NEGATIVE_INFINITY;
- for (int i=0; i < likelihoods.length; i++) {
- if (i==iOfChoosenGenotype)
- continue;
- if (likelihoods[i] >= qual)
- qual = likelihoods[i];
- }
-
- // qual contains now max(likelihoods[k]) for all k != bestGTguess
- qual = likelihoods[iOfChoosenGenotype] - qual;
-
- if (qual < 0) {
- // QUAL can be negative if the chosen genotype is not the most likely one individually.
- // In this case, we compute the actual genotype probability and QUAL is the likelihood of it not being the chosen one
- double[] normalized = GeneralUtils.normalizeFromLog10(likelihoods);
- double chosenGenotype = normalized[iOfChoosenGenotype];
- return Math.log10(1.0 - chosenGenotype);
- } else {
- // invert the size, as this is the probability of making an error
- return -1 * qual;
- }
- }
-
- private final static double[] parsePLsIntoLikelihoods(String likelihoodsAsString_PLs) {
- if ( !likelihoodsAsString_PLs.equals(VCFConstants.MISSING_VALUE_v4) ) {
- String[] strings = likelihoodsAsString_PLs.split(",");
- double[] likelihoodsAsVector = new double[strings.length];
- try {
- for ( int i = 0; i < strings.length; i++ ) {
- likelihoodsAsVector[i] = Integer.parseInt(strings[i]) / -10.0;
- }
- } catch (NumberFormatException e) {
- throw new TribbleException("The GL/PL tag contains non-integer values: " + likelihoodsAsString_PLs);
- }
- return likelihoodsAsVector;
- } else
- return null;
- }
-
- /**
- * Back-compatibility function to read old style GL formatted genotype likelihoods in VCF format
- * @param GLString
- * @return
- */
- private final static double[] parseDeprecatedGLString(String GLString) {
- if ( !GLString.equals(VCFConstants.MISSING_VALUE_v4) ) {
- String[] strings = GLString.split(",");
- double[] likelihoodsAsVector = new double[strings.length];
- for ( int i = 0; i < strings.length; i++ ) {
- likelihoodsAsVector[i] = Double.parseDouble(strings[i]);
- }
- return likelihoodsAsVector;
- }
-
- return null;
- }
-
- private final static String convertLikelihoodsToPLString(final double[] GLs) {
- if ( GLs == null )
- return VCFConstants.MISSING_VALUE_v4;
-
- final StringBuilder s = new StringBuilder();
- boolean first = true;
- for ( final int pl : GLsToPLs(GLs) ) {
- if ( ! first )
- s.append(',');
- else
- first = false;
-
- s.append(pl);
- }
-
- return s.toString();
- }
-
- private final static int[] GLsToPLs(final double[] GLs) {
- final int[] pls = new int[GLs.length];
- final double adjust = maxPL(GLs);
-
- for ( int i = 0; i < GLs.length; i++ ) {
- pls[i] = (int)Math.round(Math.min(-10 * (GLs[i] - adjust), MAX_PL));
- }
-
- return pls;
- }
-
- private final static double maxPL(final double[] GLs) {
- double adjust = Double.NEGATIVE_INFINITY;
- for ( double l : GLs ) adjust = Math.max(adjust, l);
- return adjust;
- }
-
- private final static double[] PLsToGLs(final int pls[]) {
- double[] likelihoodsAsVector = new double[pls.length];
- for ( int i = 0; i < pls.length; i++ ) {
- likelihoodsAsVector[i] = pls[i] / -10.0;
- }
- return likelihoodsAsVector;
- }
-
- // -------------------------------------------------------------------------------------
- //
- // Static conversion utilities, going from GL/PL index to allele index and vice versa.
- //
- // -------------------------------------------------------------------------------------
-
- /*
- * Class representing the 2 alleles (or rather their indexes into VariantContext.getAllele()) corresponding to a specific PL index.
- * Note that the reference allele is always index=0.
- */
- public static class GenotypeLikelihoodsAllelePair {
- public final int alleleIndex1, alleleIndex2;
-
- public GenotypeLikelihoodsAllelePair(final int alleleIndex1, final int alleleIndex2) {
- this.alleleIndex1 = alleleIndex1;
- this.alleleIndex2 = alleleIndex2;
- }
- }
-
- /**
- * Calculate the cache of diploid alleles for each PL index
- *
- * @param altAlleles number of alternate alleles
- * @return cache of diploid alleles for each PL index
- */
- private static GenotypeLikelihoodsAllelePair[] calculateDiploidPLcache(final int altAlleles) {
- final int numLikelihoods = numLikelihoods(1 + altAlleles, 2);
- final GenotypeLikelihoodsAllelePair[] cache = new GenotypeLikelihoodsAllelePair[numLikelihoods];
-
- // for all possible combinations of 2 alleles
- for ( int allele1 = 0; allele1 <= altAlleles; allele1++ ) {
- for ( int allele2 = allele1; allele2 <= altAlleles; allele2++ ) {
- cache[calculatePLindex(allele1, allele2)] = new GenotypeLikelihoodsAllelePair(allele1, allele2);
- }
- }
-
- // a bit of sanity checking
- for ( int i = 0; i < cache.length; i++ ) {
- if ( cache[i] == null )
- throw new IllegalStateException("BUG: cache entry " + i + " is unexpected null");
- }
-
- return cache;
- }
-
-
- /**
- * Calculate the alleles for each PL index for a ploidy.
- * Creates the ordering for all possible combinations of ploidy alleles. Computed recursively and the
- * result is stored in a cache.
- *
- * The implementation is described in The Variant Call Format Specification VCF 4.3, Section 1.6.2 Genotype fields
- * The likelihoods are ordered for ploidy P and N alternate alleles as follows:
- * for aP = 0...N
- * for aP-1 = 0...aP
- * ...
- * for a1 = 0...a2
- * a1,a2..aP
- *
- * This is implemented recursively:
- *
- * PLIndexToAlleleIndices(N, P, suffix=empty):
- * for a in 0...N
- * if (P == 1) accum += (a + suffix) // have all the alleles for a PL index
- * if (P > 1) PLIndexToAlleleIndices(a, P-1, a + suffix )
- *
- * @param altAlleles Number of alternate alleles
- * @param ploidy Number of chromosomes in set
- * @param anyploidPLIndexToAlleleIndices PL index to the alleles of general ploidy over all possible alternate alleles
- * @param genotype An entry of ploidy alleles
- */
- private static void calculatePLIndexToAlleleIndices(final int altAlleles, final int ploidy, final List<List<Integer>> anyploidPLIndexToAlleleIndices,
- final List<Integer> genotype) {
- for (int a=0; a <= altAlleles; a++) {
- final List<Integer> gt = new ArrayList<Integer>(Arrays.asList(a));
- gt.addAll(genotype);
- if ( ploidy == 1 ) {// have all ploidy alleles for a PL index
- anyploidPLIndexToAlleleIndices.add(gt);
- } else if ( ploidy > 1 ) {
- calculatePLIndexToAlleleIndices(a, ploidy - 1, anyploidPLIndexToAlleleIndices, gt);
- }
- }
- }
-
- /**
- * Calculate the cache of allele indices for each PL index for a ploidy.
- * Calculation in @see #calculatePLIndexToAlleleIndices
- *
- * @param altAlleles Number of alternate alleles
- * @param ploidy Number of chromosomes in set
- * @return PL index to the alleles of general ploidy over all possible alternate alleles
- * @return The alleles for each PL index for a ploidy
- */
- protected static List<List<Integer>> calculateAnyploidPLcache(final int altAlleles, final int ploidy) {
- List<List<Integer>> anyploidPLIndexToAlleleIndices = new ArrayList<List<Integer>>();
- calculatePLIndexToAlleleIndices(altAlleles, ploidy, anyploidPLIndexToAlleleIndices, new ArrayList<Integer>());
- return anyploidPLIndexToAlleleIndices;
- }
-
- // -------------------------------------------------------------------------------------
- //
- // num likelihoods given number of alleles and ploidy
- //
- // -------------------------------------------------------------------------------------
-
- /**
- * Actually does the computation in @see #numLikelihoods
- *
- * @param numAlleles number of alleles
- * @param ploidy number of chromosomes
- * @return number of likelihoods
- */
- private static final int calcNumLikelihoods(final int numAlleles, final int ploidy) {
- if (numAlleles == 1)
- return 1;
- else if (ploidy == 1)
- return numAlleles;
- else {
- int acc =0;
- for (int k=0; k <= ploidy; k++ )
- acc += calcNumLikelihoods(numAlleles - 1, ploidy - k);
- return acc;
- }
- }
-
- /**
- * Compute how many likelihood elements are associated with the given number of alleles
- * Equivalent to asking in how many ways N non-negative integers can add up to P is S(N,P)
- * where P = ploidy (number of chromosomes) and N = total # of alleles.
- * Each chromosome can be in one single state (0,...,N-1) and there are P of them.
- * Naive solution would be to store N*P likelihoods, but this is not necessary because we can't distinguish chromosome states, but rather
- * only total number of alt allele counts in all chromosomes.
- *
- * For example, S(3,2) = 6: For alleles A,B,C, on a diploid organism we have six possible genotypes:
- * AA,AB,BB,AC,BC,CC.
- * Another way of expressing is with vector (#of A alleles, # of B alleles, # of C alleles)
- * which is then, for ordering above, (2,0,0), (1,1,0), (0,2,0), (1,1,0), (0,1,1), (0,0,2)
- * In general, for P=2 (regular biallelic), then S(N,2) = N*(N+1)/2
- *
- * Note this method caches the value for most common num Allele / ploidy combinations for efficiency
- *
- * Recursive implementation:
- * S(N,P) = sum_{k=0}^P S(N-1,P-k)
- * because if we have N integers, we can condition 1 integer to be = k, and then N-1 integers have to sum to P-K
- * With initial conditions
- * S(N,1) = N (only way to have N integers add up to 1 is all-zeros except one element with a one. There are N of these vectors)
- * S(1,P) = 1 (only way to have 1 integer add to P is with that integer P itself).
- *
- * @param numAlleles Number of alleles (including ref)
- * @param ploidy Ploidy, or number of chromosomes in set
- * @return Number of likelihood elements we need to hold.
- */
- public static int numLikelihoods(final int numAlleles, final int ploidy) {
- if ( numAlleles < NUM_LIKELIHOODS_CACHE_N_ALLELES
- && ploidy < NUM_LIKELIHOODS_CACHE_PLOIDY )
- return numLikelihoodCache[numAlleles][ploidy];
- else {
- // have to calculate on the fly
- return calcNumLikelihoods(numAlleles, ploidy);
- }
- }
-
- // As per the VCF spec: "the ordering of genotypes for the likelihoods is given by: F(j/k) = (k*(k+1)/2)+j.
- // In other words, for biallelic sites the ordering is: AA,AB,BB; for triallelic sites the ordering is: AA,AB,BB,AC,BC,CC, etc."
- // Assumes that allele1Index < allele2Index
- public static int calculatePLindex(final int allele1Index, final int allele2Index) {
- return (allele2Index * (allele2Index+1) / 2) + allele1Index;
- }
-
-
- /**
- * Get the diploid allele index pair for the given PL index
- *
- * @param PLindex the PL index
- * @return the diploid allele index pair
- * @throws IllegalStateException if PLindex is negative value or greater than the cache computed by @see #calculateDiploidPLcache
- */
- public static GenotypeLikelihoodsAllelePair getAllelePair(final int PLindex) {
- // check the index, make sure that we've cached enough data
- if ( PLindex < 0 || PLindex >= diploidPLIndexToAlleleIndex.length ) {
- final String msg = "The PL index " + PLindex + " cannot be " + (PLindex < 0 ? " negative" : " more than " + (diploidPLIndexToAlleleIndex.length - 1));
- throw new IllegalStateException(msg);
- }
-
- return diploidPLIndexToAlleleIndex[PLindex];
- }
-
- /**
- * Initialize cache of allele anyploid indices
- * If initialized multiple times with the same ploidy, the alternate alleles from the last initialization will be used
- *
- * @param altAlleles number of alternate alleles
- * @param ploidy number of chromosomes
- * @throws IllegalArgumentException if altAlleles or ploidy <= 0
- */
- public static synchronized void initializeAnyploidPLIndexToAlleleIndices(final int altAlleles, final int ploidy) {
- if ( altAlleles <= 0 )
- throw new IllegalArgumentException("Must have at least one alternate allele, not " + altAlleles );
-
- if ( ploidy <= 0 )
- throw new IllegalArgumentException("Ploidy must be at least 1, not " + ploidy);
-
- // create the allele indices for each PL index for a ploidy
- anyploidPloidyToPLIndexToAlleleIndices.put(ploidy, calculateAnyploidPLcache(altAlleles, ploidy));
- }
-
- /**
- * Get the allele ploidy indices for the given PL index
- * Must use the same ploidy as @see #initializeAnyploidPLIndexToAlleleIndices
- *
- * @param PLindex the PL index
- * @param ploidy number of chromosomes
- * @return the ploidy allele indices
- * @throws IllegalStateException if @see #anyploidPloidyToPLIndexToAlleleIndices does not contain the requested ploidy or PL index
- */
- public static synchronized List<Integer> getAlleles(final int PLindex, final int ploidy) {
- if ( ploidy == 2 ) { // diploid
- final GenotypeLikelihoodsAllelePair pair = getAllelePair(PLindex);
- return Arrays.asList(pair.alleleIndex1, pair.alleleIndex2);
- } else { // non-diploid
- if (!anyploidPloidyToPLIndexToAlleleIndices.containsKey(ploidy))
- throw new IllegalStateException("Must initialize the cache of allele anyploid indices for ploidy " + ploidy);
-
- if (PLindex < 0 || PLindex >= anyploidPloidyToPLIndexToAlleleIndices.get(ploidy).size()) {
- final String msg = "The PL index " + PLindex + " does not exist for " + ploidy + " ploidy, " +
- (PLindex < 0 ? "cannot have a negative value." : "initialized the cache of allele anyploid indices with the incorrect number of alternate alleles.");
- throw new IllegalStateException(msg);
- }
-
- return anyploidPloidyToPLIndexToAlleleIndices.get(ploidy).get(PLindex);
- }
- }
-
- // An index conversion from the deprecated PL ordering to the new VCF-based ordering for up to 3 alternate alleles
- protected static final int[] PLindexConversion = new int[]{0, 1, 3, 6, 2, 4, 7, 5, 8, 9};
-
- /**
- * get the allele index pair for the given PL using the deprecated PL ordering:
- * AA,AB,AC,AD,BB,BC,BD,CC,CD,DD instead of AA,AB,BB,AC,BC,CC,AD,BD,CD,DD.
- * Although it's painful to keep this conversion around, our DiploidSNPGenotypeLikelihoods class uses the deprecated
- * ordering and I know with certainty that external users have built code on top of it; changing it now would
- * cause a whole lot of heartache for our collaborators, so for now at least there's a standard conversion method.
- * This method assumes at most 3 alternate alleles.
- *
- * @param PLindex the PL index
- * @return the allele index pair
- */
- @Deprecated
- public static GenotypeLikelihoodsAllelePair getAllelePairUsingDeprecatedOrdering(final int PLindex) {
- return getAllelePair(PLindexConversion[PLindex]);
- }
-
- /**
- * get the PL indexes (AA, AB, BB) for the given allele pair; assumes allele1Index <= allele2Index.
- *
- * @param allele1Index the index in VariantContext.getAllele() of the first allele
- * @param allele2Index the index in VariantContext.getAllele() of the second allele
- * @return the PL indexes
- */
- public static int[] getPLIndecesOfAlleles(final int allele1Index, final int allele2Index) {
-
- final int[] indexes = new int[3];
- indexes[0] = calculatePLindex(allele1Index, allele1Index);
- indexes[1] = calculatePLindex(allele1Index, allele2Index);
- indexes[2] = calculatePLindex(allele2Index, allele2Index);
- return indexes;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java b/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java
deleted file mode 100644
index d549d97..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypeType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-/**
- * Summary types for Genotype objects
- *
- * @author Your Name
- * @since Date created
- */
-public enum GenotypeType {
- /** The sample is no-called (all alleles are NO_CALL */
- NO_CALL,
- /** The sample is homozygous reference */
- HOM_REF,
- /** The sample is heterozygous, with at least one ref and at least one one alt in any order */
- HET,
- /** All alleles are non-reference */
- HOM_VAR,
- /** There is no allele data availble for this sample (alleles.isEmpty) */
- UNAVAILABLE,
- /** Some chromosomes are NO_CALL and others are called */
- MIXED // no-call and call in the same genotype
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java b/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java
deleted file mode 100644
index c146875..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/GenotypesContext.java
+++ /dev/null
@@ -1,719 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Represents an ordered collection of Genotype objects
- */
-public class GenotypesContext implements List<Genotype>, Serializable {
- public static final long serialVersionUID = 1L;
-
- /**
- * static constant value for an empty GenotypesContext. Useful since so many VariantContexts have no genotypes
- */
- public final static GenotypesContext NO_GENOTYPES =
- new GenotypesContext(new ArrayList<Genotype>(0), new HashMap<String, Integer>(0), Collections.<String>emptyList()).immutable();
-
- /**
- *sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical order
- */
- protected List<String> sampleNamesInOrder = null;
-
- /**
- * a map optimized for efficient lookup. Each genotype in genotypes must have its
- * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
- * genotype in the vector of genotypes
- */
- protected Map<String, Integer> sampleNameToOffset = null;
-
- /**
- * An ArrayList of genotypes contained in this context
- *
- * WARNING: TO ENABLE THE LAZY VERSION OF THIS CLASS, NO METHODS SHOULD DIRECTLY
- * ACCESS THIS VARIABLE. USE getGenotypes() INSTEAD.
- *
- */
- protected ArrayList<Genotype> notToBeDirectlyAccessedGenotypes;
-
- /**
- * Cached value of the maximum ploidy observed among all samples
- */
- private int maxPloidy = -1;
-
- /** Are we allowing users to modify the list? */
- private boolean immutable = false;
-
- /**
- * Custom serialization routine. Needed to ensure that we decode any lazily-decoded data
- * before serialization.
- *
- * @param out stream to which to serialize this object
- */
- private void writeObject(ObjectOutputStream out) throws IOException {
- // If we're a LazyGenotypesContext, decode the genotype data before serialization.
- //
- // Ugly, but we can't do this in LazyGenotypesContext.writeObject(), since
- // by the time that's called we'll already have serialized the superclass
- // data in GenotypesContext, and we need to make sure that we decode any lazy
- // data BEFORE serializing the fields in GenotypesContext.
- if ( getClass() == LazyGenotypesContext.class ) {
- ((LazyGenotypesContext)this).decode();
- }
-
- out.defaultWriteObject();
- }
-
- // ---------------------------------------------------------------------------
- //
- // private constructors -- you have to use static create methods to make these classes
- //
- // ---------------------------------------------------------------------------
-
- /**
- * Create an empty GenotypeContext
- */
- protected GenotypesContext() {
- this(10);
- }
-
- /**
- * Create an empty GenotypeContext, with initial capacity for n elements
- */
- protected GenotypesContext(final int n) {
- this(new ArrayList<Genotype>(n));
- }
-
- /**
- * Create an GenotypeContext containing genotypes
- */
- protected GenotypesContext(final ArrayList<Genotype> genotypes) {
- this.notToBeDirectlyAccessedGenotypes = genotypes;
- this.sampleNameToOffset = null;
- }
-
- /**
- * Create a fully resolved GenotypeContext containing genotypes, sample lookup table,
- * and sorted sample names
- *
- * @param genotypes our genotypes in arbitrary
- * @param sampleNameToOffset map optimized for efficient lookup. Each genotype in genotypes must have its
- * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
- * genotype in the vector of genotypes
- * @param sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical
- * order.
- */
- protected GenotypesContext(final ArrayList<Genotype> genotypes,
- final Map<String, Integer> sampleNameToOffset,
- final List<String> sampleNamesInOrder) {
- this.notToBeDirectlyAccessedGenotypes = genotypes;
- this.sampleNameToOffset = sampleNameToOffset;
- this.sampleNamesInOrder = sampleNamesInOrder;
- }
-
- // ---------------------------------------------------------------------------
- //
- // public static factory methods
- //
- // ---------------------------------------------------------------------------
-
- /**
- * Basic creation routine
- * @return an empty, mutable GenotypeContext
- */
- public static final GenotypesContext create() {
- return new GenotypesContext();
- }
-
- /**
- * Basic creation routine
- * @return an empty, mutable GenotypeContext with initial capacity for nGenotypes
- */
- public static final GenotypesContext create(final int nGenotypes) {
- return new GenotypesContext(nGenotypes);
- }
-
- /**
- * Create a fully resolved GenotypeContext containing genotypes, sample lookup table,
- * and sorted sample names
- *
- * @param genotypes our genotypes in arbitrary
- * @param sampleNameToOffset map optimized for efficient lookup. Each genotype in genotypes must have its
- * sample name in sampleNameToOffset, with a corresponding integer value that indicates the offset of that
- * genotype in the vector of genotypes
- * @param sampleNamesInOrder a list of sample names, one for each genotype in genotypes, sorted in alphabetical
- * order.
- * @return an mutable GenotypeContext containing genotypes with already present lookup data
- */
- public static final GenotypesContext create(final ArrayList<Genotype> genotypes,
- final Map<String, Integer> sampleNameToOffset,
- final List<String> sampleNamesInOrder) {
- return new GenotypesContext(genotypes, sampleNameToOffset, sampleNamesInOrder);
- }
-
- /**
- * Create a fully resolved GenotypeContext containing genotypes
- *
- * @param genotypes our genotypes in arbitrary
- * @return an mutable GenotypeContext containing genotypes
- */
- public static final GenotypesContext create(final ArrayList<Genotype> genotypes) {
- return genotypes == null ? NO_GENOTYPES : new GenotypesContext(genotypes);
- }
-
- /**
- * Create a fully resolved GenotypeContext containing genotypes
- *
- * @param genotypes our genotypes in arbitrary
- * @return an mutable GenotypeContext containing genotypes
- */
- public static final GenotypesContext create(final Genotype... genotypes) {
- return create(new ArrayList<Genotype>(Arrays.asList(genotypes)));
- }
-
- /**
- * Create a freshly allocated GenotypeContext containing the genotypes in toCopy
- *
- * @param toCopy the GenotypesContext to copy
- * @return an mutable GenotypeContext containing genotypes
- */
- public static final GenotypesContext copy(final GenotypesContext toCopy) {
- return create(new ArrayList<Genotype>(toCopy.getGenotypes()));
- }
-
- /**
- * Create a GenotypesContext containing the genotypes in iteration order contained
- * in toCopy
- *
- * @param toCopy the collection of genotypes
- * @return an mutable GenotypeContext containing genotypes
- */
- public static final GenotypesContext copy(final Collection<Genotype> toCopy) {
- return toCopy == null ? NO_GENOTYPES : create(new ArrayList<Genotype>(toCopy));
- }
-
- // ---------------------------------------------------------------------------
- //
- // Mutability methods
- //
- // ---------------------------------------------------------------------------
-
- public final GenotypesContext immutable() {
- immutable = true;
- return this;
- }
-
- public boolean isMutable() {
- return ! immutable;
- }
-
- public final void checkImmutability() {
- if ( immutable )
- throw new IllegalAccessError("GenotypeMap is currently immutable, but a mutator method was invoked on it");
- }
-
- // ---------------------------------------------------------------------------
- //
- // caches
- //
- // ---------------------------------------------------------------------------
-
- protected void invalidateSampleNameMap() {
- sampleNameToOffset = null;
- }
-
- protected void invalidateSampleOrdering() {
- sampleNamesInOrder = null;
- }
-
- protected void ensureSampleOrdering() {
- if ( sampleNamesInOrder == null ) {
- sampleNamesInOrder = new ArrayList<String>(size());
-
- for ( int i = 0; i < size(); i++ ) {
- sampleNamesInOrder.add(getGenotypes().get(i).getSampleName());
- }
- Collections.sort(sampleNamesInOrder);
- }
- }
-
- protected void ensureSampleNameMap() {
- if ( sampleNameToOffset == null ) {
- sampleNameToOffset = new HashMap<String, Integer>(size());
-
- for ( int i = 0; i < size(); i++ ) {
- sampleNameToOffset.put(getGenotypes().get(i).getSampleName(), i);
- }
- }
- }
-
- // ---------------------------------------------------------------------------
- //
- // Lazy methods
- //
- // ---------------------------------------------------------------------------
-
- public boolean isLazyWithData() {
- return this instanceof LazyGenotypesContext &&
- ((LazyGenotypesContext)this).getUnparsedGenotypeData() != null;
- }
-
- // ---------------------------------------------------------------------------
- //
- // Map methods
- //
- // ---------------------------------------------------------------------------
-
- protected ArrayList<Genotype> getGenotypes() {
- return notToBeDirectlyAccessedGenotypes;
- }
-
- @Override
- public void clear() {
- checkImmutability();
- invalidateSampleNameMap();
- invalidateSampleOrdering();
- getGenotypes().clear();
- }
-
- @Override
- public int size() {
- return getGenotypes().size();
- }
-
- @Override
- public boolean isEmpty() {
- return getGenotypes().isEmpty();
- }
-
- /**
- * Adds a single genotype to this context.
- *
- * There are many constraints on this input, and important
- * impacts on the performance of other functions provided by this
- * context.
- *
- * First, the sample name of genotype must be unique within this
- * context. However, this is not enforced in the code itself, through
- * you will invalid the contract on this context if you add duplicate
- * samples and are running with CoFoJa enabled.
- *
- * Second, adding genotype also updates the sample name -> index map,
- * so add() followed by containsSample and related function is an efficient
- * series of operations.
- *
- * Third, adding the genotype invalidates the sorted list of sample names, to
- * add() followed by any of the SampleNamesInOrder operations is inefficient, as
- * each SampleNamesInOrder must rebuild the sorted list of sample names at
- * an O(n log n) cost.
- *
- * @param genotype
- * @return
- */
- @Override
- public boolean add(final Genotype genotype) {
- checkImmutability();
- invalidateSampleOrdering();
-
- if ( sampleNameToOffset != null ) {
- // update the name map by adding entries
- sampleNameToOffset.put(genotype.getSampleName(), size());
- }
-
- return getGenotypes().add(genotype);
- }
-
- @Override
- public void add(final int i, final Genotype genotype) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Adds all of the genotypes to this context
- *
- * See {@link #add(Genotype)} for important information about this functions
- * constraints and performance costs
- *
- * @param genotypes
- * @return
- */
- @Override
- public boolean addAll(final Collection<? extends Genotype> genotypes) {
- checkImmutability();
- invalidateSampleOrdering();
-
- if ( sampleNameToOffset != null ) {
- // update the name map by adding entries
- int pos = size();
- for ( final Genotype g : genotypes ) {
- sampleNameToOffset.put(g.getSampleName(), pos++);
- }
- }
-
- return getGenotypes().addAll(genotypes);
- }
-
- @Override
- public boolean addAll(final int i, final Collection<? extends Genotype> genotypes) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean contains(final Object o) {
- return getGenotypes().contains(o);
- }
-
- @Override
- public boolean containsAll(final Collection<?> objects) {
- return getGenotypes().containsAll(objects);
- }
-
- private boolean containsAny(final Collection<? extends Genotype> genotypes) {
- for ( final Genotype g : genotypes ) {
- if ( contains(g) ) return true;
- }
- return false;
- }
-
- @Override
- public Genotype get(final int i) {
- return getGenotypes().get(i);
- }
-
- /**
- * What is the max ploidy among all samples? Returns defaultPloidy if no genotypes are present
- *
- * @param defaultPloidy the default ploidy, if all samples are no-called
- * @return
- */
- public int getMaxPloidy(final int defaultPloidy) {
- if ( defaultPloidy < 0 ) throw new IllegalArgumentException("defaultPloidy must be greater than or equal to 0");
-
- if ( maxPloidy == -1 ) {
- maxPloidy = 0; // necessary in the case where there are no genotypes
- for ( final Genotype g : getGenotypes() ) {
- maxPloidy = Math.max(g.getPloidy(), maxPloidy);
- }
-
- // everything is no called so we return the default ploidy
- if ( maxPloidy == 0 ) maxPloidy = defaultPloidy;
- }
-
- return maxPloidy;
- }
-
- /**
- * Gets sample associated with this sampleName, or null if none is found
- *
- * @param sampleName
- * @return
- */
- public Genotype get(final String sampleName) {
- Integer offset = getSampleI(sampleName);
- return offset == null ? null : getGenotypes().get(offset);
- }
-
- private Integer getSampleI(final String sampleName) {
- ensureSampleNameMap();
- return sampleNameToOffset.get(sampleName);
- }
-
- @Override
- public int indexOf(final Object o) {
- return getGenotypes().indexOf(o);
- }
-
- @Override
- public Iterator<Genotype> iterator() {
- return getGenotypes().iterator();
- }
-
- @Override
- public int lastIndexOf(final Object o) {
- return getGenotypes().lastIndexOf(o);
- }
-
- @Override
- public ListIterator<Genotype> listIterator() {
- // todo -- must be immutable
- throw new UnsupportedOperationException();
-// return genotypes.listIterator();
- }
-
- @Override
- public ListIterator<Genotype> listIterator(final int i) {
- // todo -- must be immutable
- throw new UnsupportedOperationException();
-// return genotypes.listIterator(i);
- }
-
- /**
- * Note that remove requires us to invalidate our sample -> index
- * cache. The loop:
- *
- * GenotypesContext gc = ...
- * for ( sample in samples )
- * if ( gc.containsSample(sample) )
- * gc.remove(sample)
- *
- * is extremely inefficient, as each call to remove invalidates the cache
- * and containsSample requires us to rebuild it, an O(n) operation.
- *
- * If you must remove many samples from the GC, use either removeAll or retainAll
- * to avoid this O(n * m) operation.
- *
- * @param i
- * @return
- */
- @Override
- public Genotype remove(final int i) {
- checkImmutability();
- invalidateSampleNameMap();
- invalidateSampleOrdering();
- return getGenotypes().remove(i);
- }
-
- /**
- * See for important warning {@link #remove(int)}
- * @param o
- * @return
- */
- @Override
- public boolean remove(final Object o) {
- checkImmutability();
- invalidateSampleNameMap();
- invalidateSampleOrdering();
- return getGenotypes().remove(o);
- }
-
- @Override
- public boolean removeAll(final Collection<?> objects) {
- checkImmutability();
- invalidateSampleNameMap();
- invalidateSampleOrdering();
- return getGenotypes().removeAll(objects);
- }
-
- @Override
- public boolean retainAll(final Collection<?> objects) {
- checkImmutability();
- invalidateSampleNameMap();
- invalidateSampleOrdering();
- return getGenotypes().retainAll(objects);
- }
-
- @Override
- public Genotype set(final int i, final Genotype genotype) {
- checkImmutability();
- final Genotype prev = getGenotypes().set(i, genotype);
-
- invalidateSampleOrdering();
- if ( sampleNameToOffset != null ) {
- // update the name map by removing the old entry and replacing it with the new one
- sampleNameToOffset.remove(prev.getSampleName());
- sampleNameToOffset.put(genotype.getSampleName(), i);
- }
-
- return prev;
- }
-
- /**
- * Replaces the genotype in this context -- note for efficiency
- * reasons we do not add the genotype if it's not present. The
- * return value will be null indicating this happened.
- *
- * Note this operation is preserves the map cache Sample -> Offset but
- * invalidates the sorted list of samples. Using replace within a loop
- * containing any of the SampleNameInOrder operation requires an O(n log n)
- * resorting after each replace operation.
- *
- * @param genotype a non null genotype to bind in this context
- * @return null if genotype was not added, otherwise returns the previous genotype
- */
- public Genotype replace(final Genotype genotype) {
- checkImmutability();
- Integer offset = getSampleI(genotype.getSampleName());
- if ( offset == null )
- return null;
- else
- return set(offset, genotype);
- }
-
- @Override
- public List<Genotype> subList(final int i, final int i1) {
- return getGenotypes().subList(i, i1);
- }
-
- @Override
- public Object[] toArray() {
- return getGenotypes().toArray();
- }
-
- @Override
- public <T> T[] toArray(final T[] ts) {
- return getGenotypes().toArray(ts);
- }
-
- /**
- * Iterate over the Genotypes in this context in the order specified by sampleNamesInOrder
- *
- * @param sampleNamesInOrder a Iterable of String, containing exactly one entry for each Genotype sample name in
- * this context
- * @return a Iterable over the genotypes in this context.
- */
- public Iterable<Genotype> iterateInSampleNameOrder(final Iterable<String> sampleNamesInOrder) {
- return new Iterable<Genotype>() {
- @Override
- public Iterator<Genotype> iterator() {
- return new InOrderIterator(sampleNamesInOrder.iterator());
- }
- };
- }
-
- /**
- * Iterate over the Genotypes in this context in their sample name order (A, B, C)
- * regardless of the underlying order in the vector of genotypes
- * @return a Iterable over the genotypes in this context.
- */
- public Iterable<Genotype> iterateInSampleNameOrder() {
- return iterateInSampleNameOrder(getSampleNamesOrderedByName());
- }
-
- private final class InOrderIterator implements Iterator<Genotype> {
- final Iterator<String> sampleNamesInOrder;
-
- private InOrderIterator(final Iterator<String> sampleNamesInOrder) {
- this.sampleNamesInOrder = sampleNamesInOrder;
- }
-
- @Override
- public boolean hasNext() {
- return sampleNamesInOrder.hasNext();
- }
-
- @Override
- public Genotype next() {
- return get(sampleNamesInOrder.next());
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * @return The set of sample names for all genotypes in this context, in arbitrary order
- */
- public Set<String> getSampleNames() {
- ensureSampleNameMap();
- return sampleNameToOffset.keySet();
- }
-
- /**
- * @return The set of sample names for all genotypes in this context, in their natural ordering (A, B, C)
- */
- public List<String> getSampleNamesOrderedByName() {
- ensureSampleOrdering();
- return sampleNamesInOrder;
- }
-
- public boolean containsSample(final String sample) {
- ensureSampleNameMap();
- return sampleNameToOffset.containsKey(sample);
- }
-
- public boolean containsSamples(final Collection<String> samples) {
- return getSampleNames().containsAll(samples);
- }
-
- /**
- * Return a freshly allocated subcontext of this context containing only the samples
- * listed in samples. Note that samples can contain names not in this context, they
- * will just be ignored.
- *
- * @param samples
- * @return
- */
- public GenotypesContext subsetToSamples( final Set<String> samples ) {
- final int nSamples = samples.size();
-
- if ( nSamples == 0 )
- return NO_GENOTYPES;
- else { // nGenotypes < nSamples
- final GenotypesContext subset = create(samples.size());
- for ( final String sample : samples ) {
- final Genotype g = get(sample);
- if ( g != null )
- subset.add(g);
- }
- return subset;
- }
- }
-
- @Override
- public String toString() {
- final List<String> gS = new ArrayList<String>();
- for ( final Genotype g : this.iterateInSampleNameOrder() )
- gS.add(g.toString());
- return "[" + join(",", gS) + "]";
- }
-
- // copied from Utils
- private static <T> String join(final String separator, final Collection<T> objects) {
- if (objects.isEmpty()) { // fast path for empty collection
- return "";
- } else {
- final Iterator<T> iter = objects.iterator();
- final T first = iter.next();
-
- if ( ! iter.hasNext() ) // fast path for singleton collections
- return first.toString();
- else { // full path for 2+ collection that actually need a join
- final StringBuilder ret = new StringBuilder(first.toString());
- while(iter.hasNext()) {
- ret.append(separator);
- ret.append(iter.next().toString());
- }
- return ret.toString();
- }
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java b/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java
deleted file mode 100644
index 33ec595..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/JEXLMap.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.variantcontext.VariantContextUtils.JexlVCMatchExp;
-import org.apache.commons.jexl2.JexlContext;
-import org.apache.commons.jexl2.JexlException;
-import org.apache.commons.jexl2.MapContext;
-
-import java.util.*;
-
-/**
- * This is an implementation of a Map of {@link JexlVCMatchExp} to true or false values.
- * It lazily initializes each value as requested to save as much processing time as possible.
- */
-
-class JEXLMap implements Map<JexlVCMatchExp, Boolean> {
- /**
- * If a JEXL expression contains values that are not available in the given context, the default behavior is to
- * treat that expression as a miss match.
- */
- public static final JexlMissingValueTreatment DEFAULT_MISSING_VALUE_TREATMENT = JexlMissingValueTreatment.TREAT_AS_MISMATCH;
-
- // our variant context and/or Genotype
- private final VariantContext vc;
- private final Genotype g;
-
- private final JexlMissingValueTreatment howToTreatMissingValues;
-
- /**
- * our mapping from {@link JexlVCMatchExp} to {@link Boolean}s, which will be set to {@code NULL}
- * for previously un-cached {@link JexlVCMatchExp}.
- */
- private final Map<JexlVCMatchExp,Boolean> jexl;
-
- // our context
- private JexlContext jContext = null;
-
- /**
- * Construct a new JEXLMap which can evaluate expressions against a specific genotype and variant context
- * @param jexlCollection collection of expressions to be evaluated
- * @param vc VariantContext to evaluate expressions against
- * @param g genotype to evaluate expressions against, may be null
- * @param howToTreatMissingValues how missing values in vc and g should be treated
- */
- public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc, final Genotype g, final JexlMissingValueTreatment howToTreatMissingValues) {
- this.jexl = initializeMap(jexlCollection);
- this.vc = vc;
- this.g = g;
- this.howToTreatMissingValues = howToTreatMissingValues;
- }
-
-
- /**
- * Construct a new JEXLMap which can evaluate expressions against a specific genotype and variant context
- * @param jexlCollection collection of expressions to be evaluated
- * @param vc VariantContext to evaluate expressions against
- * @param g genotype to evaluate expressions against, may be null
- *
- * missing values are treated as false
- */
- public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc, final Genotype g) {
- this(jexlCollection, vc, g, DEFAULT_MISSING_VALUE_TREATMENT);
- }
-
- /**
- * Construct a new JEXLMap which can evaluate expressions against a specific VariantContext
- * @param jexlCollection collection of expressions to be evaluated
- * @param vc VariantContext to evaluate expressions against
- *
- * missing values are treated as non matches (false)
- */
- public JEXLMap(final Collection<JexlVCMatchExp> jexlCollection, final VariantContext vc) {
- this(jexlCollection, vc, null, DEFAULT_MISSING_VALUE_TREATMENT);
- }
-
- /**
- * Note: due to laziness, this accessor actually modifies the instance by possibly forcing evaluation of an Jexl expression.
- *
- * @throws IllegalArgumentException when {@code key} is {@code null} or
- * when any of the JexlVCMatchExp (i.e. keys) contains invalid Jexl expressions.
- */
- public Boolean get(Object key) {
- if (key == null) {
- throw new IllegalArgumentException("Query key is null");
- }
-
- // if we've already determined the value, return it
- final Boolean value = jexl.get(key);
- if (jexl.containsKey(key) && value != null) {
- return value;
- }
-
- // otherwise cast the expression and try again
- final JexlVCMatchExp exp = (JexlVCMatchExp) key;
- final boolean matches = evaluateExpression(exp);
- jexl.put(exp, matches);
- return matches;
- }
-
- /**
- * do we contain the specified key
- * @param o the key
- * @return true if we have a value for that key
- */
- public boolean containsKey(Object o) { return jexl.containsKey(o); }
-
- public Set<JexlVCMatchExp> keySet() {
- return jexl.keySet();
- }
-
- /**
- * Get all the values of the map, i.e. the {@link Boolean} values.
- * This is an expensive call, since it evaluates all keys that haven't been evaluated yet.
- * This is fine if you truly want all the keys, but if you only want a portion, or know
- * the keys you want, you would be better off using get() to get them by name.
- *
- * Note: due to laziness, this accessor actually modifies the instance by possibly forcing evaluation of an Jexl expression.
- *
- * @return a collection of boolean values, representing the results of all the variants evaluated
- *
- * @throws IllegalArgumentException when any of the JexlVCMatchExp (i.e. keys) contains invalid Jexl expressions.
- */
- public Collection<Boolean> values() {
- for (final JexlVCMatchExp exp : jexl.keySet()) {
- jexl.computeIfAbsent(exp, k -> evaluateExpression(exp));
- }
- return jexl.values();
- }
-
- /**
- * @return the number of keys, i.e. {@link JexlVCMatchExp}'s held by this mapping.
- */
- public int size() {
- return jexl.size();
- }
-
- public boolean isEmpty() { return this.jexl.isEmpty(); }
-
- public Boolean put(JexlVCMatchExp jexlVCMatchExp, Boolean aBoolean) {
- return jexl.put(jexlVCMatchExp, aBoolean);
- }
-
- public void putAll(Map<? extends JexlVCMatchExp, ? extends Boolean> map) {
- jexl.putAll(map);
- }
-
- /**
- * Initializes a map and give all keys with null values indicating that they have not yet been evaluated.
- * The actual value will be computed only when the key is requested via {@link #get(Object)} or {@link #values()}.
- *
- * @return an initialized map of jexlExpression -> null
- */
- private static Map<JexlVCMatchExp,Boolean> initializeMap(final Collection<JexlVCMatchExp> jexlCollection) {
- final Map<JexlVCMatchExp,Boolean> jexlMap = new HashMap<>(jexlCollection.size());
- for (final JexlVCMatchExp exp: jexlCollection) {
- jexlMap.put(exp, null);
- }
-
- return jexlMap;
- }
-
- /**
- * Evaluates a {@link JexlVCMatchExp}'s expression, given the current context (and setup the context if it's {@code null}).
- *
- * @param exp the {@link JexlVCMatchExp} to evaluate
- * @return true if the expression matched the context
- * @throws IllegalArgumentException when {@code exp} is {@code null}, or
- * when the Jexl expression in {@code exp} fails to evaluate the JexlContext
- * constructed with the input VC or genotype.
- */
- private boolean evaluateExpression(final JexlVCMatchExp exp) {
- // if the context is null, we need to create it to evaluate the JEXL expression
- if (this.jContext == null) {
- jContext = createContext();
- }
-
- try {
- //TODO figure out of this can ever evaluate to null or if that isn't actually possible
- final Boolean value = (Boolean) exp.exp.evaluate(jContext);
- return value == null ? howToTreatMissingValues.getMissingValueOrExplode() : value;
- } catch (final JexlException.Variable e) {
- //this occurs when the jexl expression contained a literal that didn't match anything in the given context
- return howToTreatMissingValues.getMissingValueOrExplode();
- } catch (final JexlException e) {
- // todo - might be better if no exception is caught here but let's user decide how to deal with them; note this will propagate to get() and values()
- throw new IllegalArgumentException(String.format("Invalid JEXL expression detected for %s", exp.name), e);
- }
- }
-
- /**
- * Create a new JexlContext
- * This code is where new JEXL context variables should get added.
- * @return a new jexl context initialized appropriately
- */
- private JexlContext createContext() {
- if (vc == null) {
- return new MapContext(Collections.emptyMap());
- } else if (g == null) {
- return new VariantJEXLContext(vc);
- } else {
- return new GenotypeJEXLContext(vc, g);
- }
- }
-
- // //////////////////////////////////////////////////////////////////////////////////////
- // The Following are unsupported at the moment (date: 2016/08/18)
- // //////////////////////////////////////////////////////////////////////////////////////
-
- // this doesn't make much sense to implement, boolean doesn't offer too much variety to deal
- // with evaluating every key in the internal map.
- public boolean containsValue(Object o) {
- throw new UnsupportedOperationException("containsValue() not supported on a JEXLMap");
- }
-
- // this doesn't make much sense
- public Boolean remove(Object o) {
- throw new UnsupportedOperationException("remove() not supported on a JEXLMap");
- }
-
-
- public Set<Entry<JexlVCMatchExp, Boolean>> entrySet() {
- throw new UnsupportedOperationException("entrySet() not supported on a JEXLMap");
- }
-
- // nope
- public void clear() {
- throw new UnsupportedOperationException("clear() not supported on a JEXLMap");
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java b/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java
deleted file mode 100644
index 204cc3f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/JexlMissingValueTreatment.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import java.util.function.Supplier;
-
-/**
- * How to treat values that appear in a jexl expression but are missing in the context it's applied to
- */
-public enum JexlMissingValueTreatment {
- /**
- * Treat expressions with a missing value as a mismatch and evaluate to false
- */
- TREAT_AS_MISMATCH(() -> false),
-
- /**
- * Treat expressions with a missing value as a match and evaluate to true
- */
- TREAT_AS_MATCH(() -> true),
-
- /**
- * Treat expressions with a missing value as an error and throw an {@link IllegalArgumentException}
- */
- THROW(() -> {throw new IllegalArgumentException("Jexl Expression couldn't be evaluated because there was a missing value.");});
-
- private final Supplier<Boolean> resultSupplier;
-
- JexlMissingValueTreatment(final Supplier<Boolean> resultSupplier){
- this.resultSupplier = resultSupplier;
- }
-
- /**
- * get the missing value that corresponds to this option or throw an exception
- * @return the value that should be used in case of a missing value
- * @throws IllegalArgumentException if this should be treated as an error
- */
- boolean getMissingValueOrExplode(){
- return resultSupplier.get();
- }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java b/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java
deleted file mode 100644
index f5781cf..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/LazyGenotypesContext.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Lazy-loading GenotypesContext. A lazy-loading context has access to the
- * VCFParser and a unparsed string of genotype data. If the user attempts to manipulate
- * the genotypes contained in this context, we decode the data and become a full blown
- * GenotypesContext. However, if the user never does this we are spared a lot of expense
- * decoding the genotypes unnecessarily.
- */
-public class LazyGenotypesContext extends GenotypesContext {
-
- /**
- * The LazyParser we'll use to decode unparsedGenotypeData if necessary.
- *
- * Transient because it would be extremely expensive to serialize. Instead, we fully decode
- * all LazyGenotypesContexts before serializing them.
- */
- private transient LazyParser parser;
-
- /**
- * Lazily-parsed raw genotype data.
- *
- * Transient because since we always fully decode the genotype data before serializing it,
- * there is never any case where we need to serialize unparsed genotype data.
- */
- private transient Object unparsedGenotypeData;
-
- /**
- * nUnparsedGenotypes the number of genotypes contained in the unparsedGenotypes data
- * (known already in the parser). Useful for isEmpty and size() optimizations
- */
- private int nUnparsedGenotypes;
-
- /**
- * True if we've already decoded the values in unparsedGenotypeData
- */
- private boolean loaded = false;
-
- /**
- * Custom de-serialization routine to ensure that all LazyGenotypesContexts we de-serialize
- * are fully decoded. Throws an IllegalStateException if that is not the case.
- *
- * Necessary because the LazyParser required to decode the lazy context is transient.
- *
- * Note that the custom writeObject() companion to this method is implemented
- * in the superclass (GenotypesContext), since decoding lazy data writes to superclass
- * fields.
- *
- * @param in stream from which to de-serialize the LazyGenotypesContext
- */
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
- in.defaultReadObject();
-
- if ( ! loaded || unparsedGenotypeData != null ) {
- throw new IllegalStateException("Deserialized LazyGenotypesContext is not fully decoded, but is required to have been fully decoded before serialization");
- }
- }
-
- private final static ArrayList<Genotype> EMPTY = new ArrayList<Genotype>(0);
-
- /**
- * Simple lazy parser interface. Provide an object implementing this
- * interface to LazyGenotypesContext, and it's parse method will be called
- * when the use of the lazy context requires the underlying genotypes data
- * be parsed into Genotype objects. The data argument is the data provided
- * to the LazyGenotypesContext holding encoded genotypes data
- */
- public interface LazyParser {
- public LazyData parse(Object data);
- }
-
- /**
- * Returns the data used in the full GenotypesContext constructor
- *
- * {@link GenotypesContext#GenotypesContext(java.util.ArrayList, java.util.Map, java.util.List)}
- */
- public static class LazyData {
- final ArrayList<Genotype> genotypes;
- final Map<String, Integer> sampleNameToOffset;
- final List<String> sampleNamesInOrder;
-
- public LazyData(final ArrayList<Genotype> genotypes,
- final List<String> sampleNamesInOrder,
- final Map<String, Integer> sampleNameToOffset) {
- this.genotypes = genotypes;
- this.sampleNamesInOrder = sampleNamesInOrder;
- this.sampleNameToOffset = sampleNameToOffset;
- }
- }
-
- /**
- * Creates a new lazy loading genotypes context using the LazyParser to create
- * genotypes data on demand.
- *
- * @param parser the parser to be used to load on-demand genotypes data
- * @param unparsedGenotypeData the encoded genotypes data that we will decode if necessary
- * @param nUnparsedGenotypes the number of genotypes that will be produced if / when we actually decode the genotypes data
- */
- public LazyGenotypesContext(final LazyParser parser, final Object unparsedGenotypeData, final int nUnparsedGenotypes) {
- super(EMPTY);
- this.parser = parser;
- this.unparsedGenotypeData = unparsedGenotypeData;
- this.nUnparsedGenotypes = nUnparsedGenotypes;
- }
-
- /**
- * Overrides the genotypes accessor. If we haven't already, decode the genotypes data
- * and store the decoded results in the appropriate variables. Otherwise we just
- * returned the decoded result directly. Note some care needs to be taken here as
- * the value in notToBeDirectlyAccessedGenotypes may diverge from what would be produced
- * by decode, if after the first decode the genotypes themselves are replaced
- * @return
- */
- @Override
- protected ArrayList<Genotype> getGenotypes() {
- decode();
- return notToBeDirectlyAccessedGenotypes;
- }
-
- /**
- * Force us to decode the genotypes, if not already done
- */
- public void decode() {
- if ( ! loaded ) {
- //System.out.printf("Loading genotypes... %s:%d%n", contig, start);
- LazyData parsed = parser.parse(unparsedGenotypeData);
- notToBeDirectlyAccessedGenotypes = parsed.genotypes;
- sampleNamesInOrder = parsed.sampleNamesInOrder;
- sampleNameToOffset = parsed.sampleNameToOffset;
- loaded = true;
- unparsedGenotypeData = null; // don't hold the unparsed data any longer
- nUnparsedGenotypes = 0;
-
- // warning -- this path allows us to create a VariantContext that doesn't run validateGenotypes()
- // That said, it's not such an important routine -- it's just checking that the genotypes
- // are well formed w.r.t. the alleles list, but this will be enforced within the VCFCodec
- }
- }
-
- /**
- * Overrides the ensure* functionality. If the data hasn't been loaded
- * yet and we want to build the cache, just decode it and we're done. If we've
- * already decoded the data, though, go through the super class
- */
- @Override
- protected synchronized void ensureSampleNameMap() {
- if ( ! loaded ) {
- decode(); // will load up all of the necessary data
- } else {
- super.ensureSampleNameMap();
- }
- }
-
- @Override
- protected synchronized void ensureSampleOrdering() {
- if ( ! loaded ) {
- decode(); // will load up all of the necessary data
- } else {
- super.ensureSampleOrdering();
- }
- }
-
- @Override
- protected void invalidateSampleNameMap() {
- // if the cache is invalidated, and we haven't loaded our data yet, do so
- if ( ! loaded ) decode();
- super.invalidateSampleNameMap();
- }
-
- @Override
- protected void invalidateSampleOrdering() {
- // if the cache is invalidated, and we haven't loaded our data yet, do so
- if ( ! loaded ) decode();
- super.invalidateSampleOrdering();
- }
-
- @Override
- public boolean isEmpty() {
- // optimization -- we know the number of samples in the unparsed data, so use it here to
- // avoid parsing just to know if the genotypes context is empty
- return loaded ? super.isEmpty() : nUnparsedGenotypes == 0;
- }
-
- @Override
- public int size() {
- // optimization -- we know the number of samples in the unparsed data, so use it here to
- // avoid parsing just to know the size of the context
- return loaded ? super.size() : nUnparsedGenotypes;
- }
-
- public Object getUnparsedGenotypeData() {
- return unparsedGenotypeData;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java b/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java
deleted file mode 100644
index 36b517a..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/StructuralVariantType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext;
-
-/**
- * Type of Structural Variant as defined in the VCF spec 4.2
- *
- */
-public enum StructuralVariantType {
- /** Deletion relative to the reference */
- DEL,
- /** Insertion of novel sequence relative to the reference */
- INS,
- /** Region of elevated copy number relative to the reference */
- DUP,
- /** Inversion of reference sequence */
- INV,
- /** Copy number variable region */
- CNV,
- /** breakend structural variation. VCF Specification : <cite>An arbitrary rearrangement
- * event can be summarized as a set of novel adjacencies.
- * Each adjacency ties together two breakends.</cite>
- */
- BND
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantContext.java
deleted file mode 100644
index 55825fb..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContext.java
+++ /dev/null
@@ -1,1734 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- *
- * <h3> High-level overview </h3>
- *
- * The VariantContext object is a single general class system for representing genetic variation data composed of:
- * <ul>
- * <li>Allele: representing single genetic haplotypes (A, T, ATC, -) (note that null alleles are used here for illustration; see the Allele class for how to represent indels)</li>
- * <li>Genotype: an assignment of alleles for each chromosome of a single named sample at a particular locus</li>
- * <li>VariantContext: an abstract class holding all segregating alleles at a locus as well as genotypes
- * for multiple individuals containing alleles at that locus</li>
- * </ul>
- * <p>
- * The class system works by defining segregating alleles, creating a variant context representing the segregating
- * information at a locus, and potentially creating and associating genotypes with individuals in the context.
- *</p>
- *<p>
- * All of the classes are highly validating -- call <code>validate()</code> if you modify them -- so you can rely on the
- * self-consistency of the data once you have a <code>VariantContext</code> in hand. The system has a rich set of assessor
- * and manipulator routines, as well as more complex static support routines in <code>VariantContextUtils</code>.
- *</p>
- *<p>
- * The <code>VariantContext</code> (and <code>Genotype</code>) objects are attributed (supporting addition of arbitrary key/value pairs) and
- * filtered (can represent a variation that is viewed as suspect).
- *</p>
- *<p>
- *<code>VariantContext</code>s are dynamically typed, so whether a <code>VariantContext</code> is a SNP, Indel, or NoVariant depends
- * on the properties of the alleles in the context. See the detailed documentation on the <code>Type</code> parameter below.
- *</p>
- *<p>
- * It's also easy to create subcontexts based on selected genotypes.
- *</p>
- * <h3>Working with Variant Contexts</h3>
- * By default, VariantContexts are immutable. In order to access (in the rare circumstances where you need them)
- * setter routines, you need to create <code>MutableVariantContext</code>s and <code>MutableGenotype</code>s.
- *
- * <h3>Some example data </h3>
- *<pre>
- * Allele A, Aref, T, Tref;
- * Allele del, delRef, ATC, ATCref;
- *</pre>
- *<p>
- * A [ref] / T at 10
- *</p>
- *<pre>
- * GenomeLoc snpLoc = GenomeLocParser.createGenomeLoc("chr1", 10, 10);
- *</pre>
- *<p>
- * A / ATC [ref] from 20-23
- *</p>
- *<pre>
- * GenomeLoc delLoc = GenomeLocParser.createGenomeLoc("chr1", 20, 22);
- *</pre>
- *<p>
- * // A [ref] / ATC immediately after 20
- * </p>
- * <pre>
- * GenomeLoc insLoc = GenomeLocParser.createGenomeLoc("chr1", 20, 20);
- *</pre>
- * <h3> Alleles </h3>
- *
- * See the documentation in the <code>Allele</code> class itself
- *
- * <h4>What are they?</h4>
- *
- * <p>Alleles can be either reference or non-reference</p>
- *
- * <p>Examples of alleles used here:</p>
- *<pre>
- * A = new Allele("A");
- * Aref = new Allele("A", true);
- * T = new Allele("T");
- * ATC = new Allele("ATC");
- *</pre>
- * <h3> Creating variant contexts </h3>
- *
- * <h4> By hand </h4>
- *
- * Here's an example of a A/T polymorphism with the A being reference:
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, snpLoc, Arrays.asList(Aref, T));
- * </pre>
- *
- * If you want to create a non-variant site, just put in a single reference allele
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, snpLoc, Arrays.asList(Aref));
- * </pre>
- *
- * A deletion is just as easy:
- *
- * <pre>
- * VariantContext vc = new VariantContext(name, delLoc, Arrays.asList(ATCref, del));
- * </pre>
- *
- * The only thing that distinguishes between an insertion and deletion is which is the reference allele.
- * An insertion has a reference allele that is smaller than the non-reference allele, and vice versa for deletions.
- *
- * <pre>
- * VariantContext vc = new VariantContext("name", insLoc, Arrays.asList(delRef, ATC));
- * </pre>
- *
- * <h4> Converting rods and other data structures to <code>VariantContext</code>s </h4>
- *
- * You can convert many common types into VariantContexts using the general function:
- *
- * <pre>
- * VariantContextAdaptors.convertToVariantContext(name, myObject)
- * </pre>
- *
- * dbSNP and VCFs, for example, can be passed in as <code>myObject</code> and a <code>VariantContext</code> corresponding to that
- * object will be returned. A <code>null</code> return value indicates that the type isn't yet supported. This is the best
- * and easiest way to create contexts using RODs.
- *
- *
- * <h3> Working with genotypes </h3>
- *
- * <pre>
- * List<Allele> alleles = Arrays.asList(Aref, T);
- * Genotype g1 = new Genotype(Arrays.asList(Aref, Aref), "g1", 10);
- * Genotype g2 = new Genotype(Arrays.asList(Aref, T), "g2", 10);
- * Genotype g3 = new Genotype(Arrays.asList(T, T), "g3", 10);
- * VariantContext vc = new VariantContext(snpLoc, alleles, Arrays.asList(g1, g2, g3));
- * </pre>
- *
- * At this point we have 3 genotypes in our context, g1-g3.
- *
- * You can assess a good deal of information about the genotypes through the <code>VariantContext</code>:
- *
- * <pre>
- * vc.hasGenotypes()
- * vc.isMonomorphicInSamples()
- * vc.isPolymorphicInSamples()
- * vc.getSamples().size()
- *
- * vc.getGenotypes()
- * vc.getGenotypes().get("g1")
- * vc.hasGenotype("g1")
- *
- * vc.getCalledChrCount()
- * vc.getCalledChrCount(Aref)
- * vc.getCalledChrCount(T)
- * </pre>
- *
- * <h3> NO_CALL alleles </h3>
- *
- * The system allows one to create <code>Genotype</code>s carrying special NO_CALL alleles that aren't present in the
- * set of context alleles and that represent undetermined alleles in a genotype:
- *<pre>
- * Genotype g4 = new Genotype(Arrays.asList(Allele.NO_CALL, Allele.NO_CALL), "NO_DATA_FOR_SAMPLE", 10);
- *</pre>
- *
- * <h3> subcontexts </h3>
- * It's also very easy get subcontext based only the data in a subset of the genotypes:
- *
- * <pre>
- * VariantContext vc12 = vc.subContextFromGenotypes(Arrays.asList(g1,g2));
- * VariantContext vc1 = vc.subContextFromGenotypes(Arrays.asList(g1));
- * </pre>
- *
- * <!-- comment by jdenvir: not sure what this tag is supposed to do:-->
- * <!-- <s3> -->
- * <h3>Fully decoding.</h3>
- * Currently <code>VariantContext</code>s support some fields, particularly those
- * stored as generic attributes, to be of any type. For example, a field AB might
- * be naturally a floating point number, 0.51, but when it's read into a VC its
- * not decoded into the Java presentation but left as a string "0.51". A fully
- * decoded <code>VariantContext</code> is one where all values have been converted to their
- * corresponding Java object types, based on the types declared in a <code>VCFHeader</code>.
- *
- * The <code>fullyDecode(...)</code> method takes a header object and creates a new fully decoded <code>VariantContext</code>
- * where all fields are converted to their true java representation. The <code>VCBuilder</code>
- * can be told that all fields are fully decoded, in which case no work is done when
- * asking for a fully decoded version of the VC.
- * <!-- </s3> -->
- *
- * @author depristo
- */
-public class VariantContext implements Feature, Serializable {
- public static final long serialVersionUID = 1L;
-
- private final static boolean WARN_ABOUT_BAD_END = true;
- private final static int MAX_ALLELE_SIZE_FOR_NON_SV = 150;
- private boolean fullyDecoded = false;
- protected CommonInfo commonInfo = null;
- public final static double NO_LOG10_PERROR = CommonInfo.NO_LOG10_PERROR;
-
- public final static Set<String> PASSES_FILTERS = Collections.unmodifiableSet(new LinkedHashSet<String>());
-
- /** The location of this VariantContext */
- final protected String contig;
- final protected long start;
- final protected long stop;
- private final String ID;
-
- /** The type (cached for performance reasons) of this context */
- protected Type type = null;
-
- /** A set of the alleles segregating in this context */
- final protected List<Allele> alleles;
-
- /** A mapping from sampleName -> genotype objects for all genotypes associated with this context */
- protected GenotypesContext genotypes = null;
-
- /** Counts for each of the possible Genotype types in this context */
- protected int[] genotypeCounts = null;
-
- public final static GenotypesContext NO_GENOTYPES = GenotypesContext.NO_GENOTYPES;
-
- // a fast cached access point to the ref / alt alleles for biallelic case
- private Allele REF = null;
-
- // set to the alt allele when biallelic, otherwise == null
- private Allele ALT = null;
-
- /* cached monomorphic value: null -> not yet computed, False, True */
- private Boolean monomorphic = null;
-
- /*
-* Determine which genotype fields are in use in the genotypes in VC
-* @return an ordered list of genotype fields in use in VC. If vc has genotypes this will always include GT first
-*/
- public List<String> calcVCFGenotypeKeys(final VCFHeader header) {
- final Set<String> keys = new HashSet<>();
-
- boolean sawGoodGT = false;
- boolean sawGoodQual = false;
- boolean sawGenotypeFilter = false;
- boolean sawDP = false;
- boolean sawAD = false;
- boolean sawPL = false;
- for (final Genotype g : this.getGenotypes()) {
- keys.addAll(g.getExtendedAttributes().keySet());
- if ( g.isAvailable() ) sawGoodGT = true;
- if ( g.hasGQ() ) sawGoodQual = true;
- if ( g.hasDP() ) sawDP = true;
- if ( g.hasAD() ) sawAD = true;
- if ( g.hasPL() ) sawPL = true;
- if (g.isFiltered()) sawGenotypeFilter = true;
- }
-
- if ( sawGoodQual ) keys.add(VCFConstants.GENOTYPE_QUALITY_KEY);
- if ( sawDP ) keys.add(VCFConstants.DEPTH_KEY);
- if ( sawAD ) keys.add(VCFConstants.GENOTYPE_ALLELE_DEPTHS);
- if ( sawPL ) keys.add(VCFConstants.GENOTYPE_PL_KEY);
- if ( sawGenotypeFilter ) keys.add(VCFConstants.GENOTYPE_FILTER_KEY);
-
- List<String> sortedList = ParsingUtils.sortList(new ArrayList<>(keys));
-
- // make sure the GT is first
- if (sawGoodGT) {
- final List<String> newList = new ArrayList<>(sortedList.size() + 1);
- newList.add(VCFConstants.GENOTYPE_KEY);
- newList.addAll(sortedList);
- sortedList = newList;
- }
-
- if (sortedList.isEmpty() && header.hasGenotypingData()) {
- // this needs to be done in case all samples are no-calls
- return Collections.singletonList(VCFConstants.GENOTYPE_KEY);
- } else {
- return sortedList;
- }
- }
-
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // validation mode
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public enum Validation {
- ALLELES,
- GENOTYPES
- }
-
- private final static EnumSet<Validation> NO_VALIDATION = EnumSet.noneOf(Validation.class);
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // constructors: see VariantContextBuilder
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Copy constructor
- *
- * @param other the VariantContext to copy
- */
- protected VariantContext(VariantContext other) {
- this(other.getSource(), other.getID(), other.getContig(), other.getStart(), other.getEnd(),
- other.getAlleles(), other.getGenotypes(), other.getLog10PError(),
- other.getFiltersMaybeNull(),
- other.getAttributes(),
- other.fullyDecoded, NO_VALIDATION);
- }
-
- /**
- * the actual constructor. Private access only
- *
- * @param source source
- * @param contig the contig
- * @param start the start base (one based)
- * @param stop the stop reference base (one based)
- * @param alleles alleles
- * @param genotypes genotypes map
- * @param log10PError qual
- * @param filters filters: use null for unfiltered and empty set for passes filters
- * @param attributes attributes
- * @param validationToPerform set of validation steps to take
- */
- protected VariantContext(final String source,
- final String ID,
- final String contig,
- final long start,
- final long stop,
- final Collection<Allele> alleles,
- final GenotypesContext genotypes,
- final double log10PError,
- final Set<String> filters,
- final Map<String, Object> attributes,
- final boolean fullyDecoded,
- final EnumSet<Validation> validationToPerform ) {
- if ( contig == null ) { throw new IllegalArgumentException("Contig cannot be null"); }
- this.contig = contig;
- this.start = start;
- this.stop = stop;
-
- // intern for efficiency. equals calls will generate NPE if ID is inappropriately passed in as null
- if ( ID == null || ID.equals("") ) throw new IllegalArgumentException("ID field cannot be the null or the empty string");
- this.ID = ID.equals(VCFConstants.EMPTY_ID_FIELD) ? VCFConstants.EMPTY_ID_FIELD : ID;
-
- this.commonInfo = new CommonInfo(source, log10PError, filters, attributes);
-
- if ( alleles == null ) { throw new IllegalArgumentException("Alleles cannot be null"); }
-
- // we need to make this a LinkedHashSet in case the user prefers a given ordering of alleles
- this.alleles = makeAlleles(alleles);
-
- if ( genotypes == null || genotypes == NO_GENOTYPES ) {
- this.genotypes = NO_GENOTYPES;
- } else {
- this.genotypes = genotypes.immutable();
- }
-
- // cache the REF and ALT alleles
- int nAlleles = alleles.size();
- for ( Allele a : alleles ) {
- if ( a.isReference() ) {
- REF = a;
- } else if ( nAlleles == 2 ) { // only cache ALT when biallelic
- ALT = a;
- }
- }
-
- this.fullyDecoded = fullyDecoded;
-
- if ( ! validationToPerform.isEmpty() ) {
- validate(validationToPerform);
- }
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Selectors
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * This method subsets down to a set of samples.
- *
- * At the same time returns the alleles to just those in use by the samples,
- * if rederiveAllelesFromGenotypes is true, otherwise the full set of alleles
- * in this VC is returned as the set of alleles in the subContext, even if
- * some of those alleles aren't in the samples
- *
- * WARNING: BE CAREFUL WITH rederiveAllelesFromGenotypes UNLESS YOU KNOW WHAT YOU ARE DOING
- *
- * @param sampleNames the sample names
- * @param rederiveAllelesFromGenotypes if true, returns the alleles to just those in use by the samples, true should be default
- * @return new VariantContext subsetting to just the given samples
- */
- public VariantContext subContextFromSamples(Set<String> sampleNames, final boolean rederiveAllelesFromGenotypes ) {
- if ( sampleNames.containsAll(getSampleNames()) && ! rederiveAllelesFromGenotypes ) {
- return this; // fast path when you don't have any work to do
- } else {
- VariantContextBuilder builder = new VariantContextBuilder(this);
- GenotypesContext newGenotypes = genotypes.subsetToSamples(sampleNames);
-
- if ( rederiveAllelesFromGenotypes ) {
- Set<Allele> allelesFromGenotypes = allelesOfGenotypes(newGenotypes);
-
- // ensure original order of genotypes
- List<Allele> rederivedAlleles = new ArrayList<>(allelesFromGenotypes.size());
- for (Allele allele : alleles)
- if (allelesFromGenotypes.contains(allele))
- rederivedAlleles.add(allele);
-
- builder.alleles(rederivedAlleles);
- }
- else {
- builder.alleles(alleles);
- }
-
- return builder.genotypes(newGenotypes).make();
- }
- }
-
- /**
- * @see #subContextFromSamples(java.util.Set, boolean) with rederiveAllelesFromGenotypes = true
- *
- * @param sampleNames
- * @return
- */
- public VariantContext subContextFromSamples(final Set<String> sampleNames) {
- return subContextFromSamples(sampleNames, true);
- }
-
- public VariantContext subContextFromSample(String sampleName) {
- return subContextFromSamples(Collections.singleton(sampleName));
- }
-
- /**
- * helper routine for subcontext
- * @param genotypes genotypes
- * @return allele set
- */
- private final Set<Allele> allelesOfGenotypes(Collection<Genotype> genotypes) {
- final Set<Allele> alleles = new HashSet<>();
-
- boolean addedref = false;
- for ( final Genotype g : genotypes ) {
- for ( final Allele a : g.getAlleles() ) {
- addedref = addedref || a.isReference();
- if ( a.isCalled() )
- alleles.add(a);
- }
- }
- if ( ! addedref ) alleles.add(getReference());
-
- return alleles;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // type operations
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * @see <a href="http://www.ncbi.nlm.nih.gov/bookshelf/br.fcgi?book=handbook&part=ch5&rendertype=table&id=ch5.ch5_t3">NCBI Handbook</a>
- *
- * <h3>Format:</h3>
- * <ul>
- * <li><strong>dbSNP variation class</strong></li>
- * <li>Rules for assigning allele classes</li>
- * <li>Sample allele definition</li>
- * </ul>
- * <h3>Supported Types</h3>
- * <ul>
- * <li><strong>Single Nucleotide Polymorphisms (SNPs)a</strong></li>
- * <li>Strictly defined as single base substitutions involving A, T, C, or G.</li>
- * <li>A/T</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>Deletion/Insertion Polymorphisms (DIPs)</strong></li>
- * <li>Designated using the full sequence of the insertion as one allele, and either a fully
- * defined string for the variant allele or a '-' character to specify the deleted allele.
- * This class will be assigned to a variation if the variation alleles are of different lengths or
- * if one of the alleles is deleted ('-').</li>
- * <li>T/-/CCTA/G</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>No-variation</strong></li>
- * <li>Reports may be submitted for segments of sequence that are assayed and determined to be invariant
- * in the sample.</li>
- * <li>(NoVariation)</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>Mixed</strong></li>
- * <li>Mix of other classes</li>
- * </ul>
- *
- * Also supports NO_VARIATION type, used to indicate that the site isn't polymorphic in the population
- *
- *
- * <h3>Not currently supported:</h3>
- *
- * <ul>
- * <li><strong>Heterozygous sequence</strong></li>
- * <li>The term heterozygous is used to specify a region detected by certain methods that do not
- * resolve the polymorphism into a specific sequence motif. In these cases, a unique flanking
- * sequence must be provided to define a sequence context for the variation.</li>
- * <li>(heterozygous)</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>Microsatellite or short tandem repeat (STR)</strong></li>
- * <li>Alleles are designated by providing the repeat motif and the copy number for each allele.
- * Expansion of the allele repeat motif designated in dbSNP into full-length sequence will
- * be only an approximation of the true genomic sequence because many microsatellite markers are
- * not fully sequenced and are resolved as size variants only.</li>
- * <li>(CAC)8/9/10/11</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>Named variant</strong></li>
- * <li>Applies to insertion/deletion polymorphisms of longer sequence features, such as retroposon
- * dimorphism for Alu or line elements. These variations frequently include a deletion '-' indicator
- * for the absent allele.</li>
- * <li>(alu) / -</li>
- * </ul>
- * <br>
- * <ul>
- * <li><strong>Multi-Nucleotide Polymorphism (MNP)</strong></li>
- * <li>Assigned to variations that are multi-base variations of a single, common length</li>
- * <li>GGA/AGT</li>
- * </ul>
- */
- public enum Type {
- NO_VARIATION,
- SNP,
- MNP, // a multi-nucleotide polymorphism
- INDEL,
- SYMBOLIC,
- MIXED,
- }
-
- /**
- * Determines (if necessary) and returns the type of this variation by examining the alleles it contains.
- *
- * @return the type of this VariantContext
- **/
- public Type getType() {
- if ( type == null )
- determineType();
-
- return type;
- }
-
- /**
- * convenience method for SNPs
- *
- * @return true if this is a SNP, false otherwise
- */
- public boolean isSNP() { return getType() == Type.SNP; }
-
-
- /**
- * convenience method for variants
- *
- * @return true if this is a variant allele, false if it's reference
- */
- public boolean isVariant() { return getType() != Type.NO_VARIATION; }
-
- /**
- * convenience method for point events
- *
- * @return true if this is a SNP or ref site, false if it's an indel or mixed event
- */
- public boolean isPointEvent() { return isSNP() || !isVariant(); }
-
- /**
- * convenience method for indels
- *
- * @return true if this is an indel, false otherwise
- */
- public boolean isIndel() { return getType() == Type.INDEL; }
-
- /**
- * @return true if the alleles indicate a simple insertion (i.e., the reference allele is Null)
- */
- public boolean isSimpleInsertion() {
- // can't just call !isSimpleDeletion() because of complex indels
- return isSimpleIndel() && getReference().length() == 1;
- }
-
- /**
- * @return true if the alleles indicate a simple deletion (i.e., a single alt allele that is Null)
- */
- public boolean isSimpleDeletion() {
- // can't just call !isSimpleInsertion() because of complex indels
- return isSimpleIndel() && getAlternateAllele(0).length() == 1;
- }
-
- /**
- * @return true if the alleles indicate a simple indel, false otherwise.
- */
- public boolean isSimpleIndel() {
- return getType() == Type.INDEL // allelic lengths differ
- && isBiallelic() // exactly 2 alleles
- && getReference().length() > 0 // ref is not null or symbolic
- && getAlternateAllele(0).length() > 0 // alt is not null or symbolic
- && getReference().getBases()[0] == getAlternateAllele(0).getBases()[0] // leading bases match for both alleles
- && (getReference().length() == 1 || getAlternateAllele(0).length() == 1);
- }
-
- /**
- * @return true if the alleles indicate neither a simple deletion nor a simple insertion
- */
- public boolean isComplexIndel() {
- return isIndel() && !isSimpleDeletion() && !isSimpleInsertion();
- }
-
- public boolean isSymbolic() {
- return getType() == Type.SYMBOLIC;
- }
-
- public boolean isStructuralIndel() {
- if ( getType() == Type.INDEL ) {
- List<Integer> sizes = getIndelLengths();
- if ( sizes != null ) {
- for ( Integer length : sizes ) {
- if ( length > MAX_ALLELE_SIZE_FOR_NON_SV ) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- /**
- *
- * @return true if the variant is symbolic or a large indel
- */
- public boolean isSymbolicOrSV() {
- return isSymbolic() || isStructuralIndel();
- }
-
- public boolean isMNP() {
- return getType() == Type.MNP;
- }
-
- /**
- * convenience method for indels
- *
- * @return true if this is an mixed variation, false otherwise
- */
- public boolean isMixed() { return getType() == Type.MIXED; }
-
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Generic accessors
- //
- // ---------------------------------------------------------------------------------------------------------
-
- public boolean hasID() {
- return getID() != VCFConstants.EMPTY_ID_FIELD;
- }
-
- public boolean emptyID() {
- return ! hasID();
- }
-
- public String getID() {
- return ID;
- }
-
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // get routines to access context info fields
- //
- // ---------------------------------------------------------------------------------------------------------
- public String getSource() { return commonInfo.getName(); }
- public Set<String> getFiltersMaybeNull() { return commonInfo.getFiltersMaybeNull(); }
- public Set<String> getFilters() { return commonInfo.getFilters(); }
- public boolean isFiltered() { return commonInfo.isFiltered(); }
- public boolean isNotFiltered() { return commonInfo.isNotFiltered(); }
- public boolean filtersWereApplied() { return commonInfo.filtersWereApplied(); }
- public boolean hasLog10PError() { return commonInfo.hasLog10PError(); }
- public double getLog10PError() { return commonInfo.getLog10PError(); }
- public double getPhredScaledQual() { return commonInfo.getPhredScaledQual(); }
-
- public Map<String, Object> getAttributes() { return commonInfo.getAttributes(); }
- public boolean hasAttribute(String key) { return commonInfo.hasAttribute(key); }
- public Object getAttribute(String key) { return commonInfo.getAttribute(key); }
-
- public Object getAttribute(String key, Object defaultValue) {
- return commonInfo.getAttribute(key, defaultValue);
- }
-
- public String getAttributeAsString(String key, String defaultValue) { return commonInfo.getAttributeAsString(key, defaultValue); }
- public int getAttributeAsInt(String key, int defaultValue) { return commonInfo.getAttributeAsInt(key, defaultValue); }
- public double getAttributeAsDouble(String key, double defaultValue) { return commonInfo.getAttributeAsDouble(key, defaultValue); }
- public boolean getAttributeAsBoolean(String key, boolean defaultValue) { return commonInfo.getAttributeAsBoolean(key, defaultValue); }
- /** returns the value as an empty list if the key was not found,
- as a java.util.List if the value is a List or an Array,
- as a Collections.singletonList if there is only one value */
- public List<Object> getAttributeAsList(String key) { return commonInfo.getAttributeAsList(key); }
- public List<String> getAttributeAsStringList(String key, String defaultValue) { return commonInfo.getAttributeAsStringList(key, defaultValue); }
- public List<Integer> getAttributeAsIntList(String key, int defaultValue) { return commonInfo.getAttributeAsIntList(key, defaultValue); }
- public List<Double> getAttributeAsDoubleList(String key, double defaultValue) { return commonInfo.getAttributeAsDoubleList(key, defaultValue); }
- public CommonInfo getCommonInfo() {
- return commonInfo;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Working with alleles
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * @return the reference allele for this context
- */
- public Allele getReference() {
- Allele ref = REF;
- if ( ref == null )
- throw new IllegalStateException("BUG: no reference allele found at " + this);
- return ref;
- }
-
-
- /**
- * @return true if the context is strictly bi-allelic
- */
- public boolean isBiallelic() {
- return getNAlleles() == 2;
- }
-
- /**
- * @return The number of segregating alleles in this context
- */
- public int getNAlleles() {
- return alleles.size();
- }
-
- /**
- * Returns the maximum ploidy of all samples in this VC, or default if there are no genotypes
- *
- * This function is caching, so it's only expensive on the first call
- *
- * @param defaultPloidy the default ploidy, if all samples are no-called
- * @return default, or the max ploidy
- */
- public int getMaxPloidy(final int defaultPloidy) {
- return genotypes.getMaxPloidy(defaultPloidy);
- }
-
- /**
- * @return The allele sharing the same bases as this String. A convenience method; better to use byte[]
- */
- public Allele getAllele(String allele) {
- return getAllele(allele.getBytes());
- }
-
- /**
- * @return The allele sharing the same bases as this byte[], or null if no such allele is present.
- */
- public Allele getAllele(byte[] allele) {
- return Allele.getMatchingAllele(getAlleles(), allele);
- }
-
- /**
- * @return True if this context contains Allele allele, or false otherwise
- */
- public boolean hasAllele(final Allele allele) {
- return hasAllele(allele, false, true);
- }
-
- public boolean hasAllele(final Allele allele, final boolean ignoreRefState) {
- return hasAllele(allele, ignoreRefState, true);
- }
-
- public boolean hasAlternateAllele(final Allele allele) {
- return hasAllele(allele, false, false);
- }
-
- public boolean hasAlternateAllele(final Allele allele, final boolean ignoreRefState) {
- return hasAllele(allele, ignoreRefState, false);
- }
-
- private boolean hasAllele(final Allele allele, final boolean ignoreRefState, final boolean considerRefAllele) {
- if ( (considerRefAllele && allele == REF) || allele == ALT ) // optimization for cached cases
- return true;
-
- final List<Allele> allelesToConsider = considerRefAllele ? getAlleles() : getAlternateAlleles();
- for ( Allele a : allelesToConsider ) {
- if ( a.equals(allele, ignoreRefState) )
- return true;
- }
-
- return false;
- }
-
-
- /**
- * Gets the alleles. This method should return all of the alleles present at the location,
- * including the reference allele. There are no constraints imposed on the ordering of alleles
- * in the set. If the reference is not an allele in this context it will not be included.
- *
- * @return the set of alleles
- */
- public List<Allele> getAlleles() { return alleles; }
-
- /**
- * Gets the alternate alleles. This method should return all the alleles present at the location,
- * NOT including the reference allele. There are no constraints imposed on the ordering of alleles
- * in the set.
- *
- * @return the set of alternate alleles
- */
- public List<Allele> getAlternateAlleles() {
- return alleles.subList(1, alleles.size());
- }
-
- /**
- * Gets the sizes of the alternate alleles if they are insertion/deletion events, and returns a list of their sizes
- *
- * @return a list of indel lengths ( null if not of type indel or mixed )
- */
- public List<Integer> getIndelLengths() {
- if ( getType() != Type.INDEL && getType() != Type.MIXED ) {
- return null;
- }
-
- List<Integer> lengths = new ArrayList<>();
- for ( Allele a : getAlternateAlleles() ) {
- lengths.add(a.length() - getReference().length());
- }
-
- return lengths;
- }
-
- /**
- * @param i -- the ith allele (from 0 to n - 2 for a context with n alleles including a reference allele)
- * @return the ith non-reference allele in this context
- * @throws IllegalArgumentException if i is invalid
- */
- public Allele getAlternateAllele(int i) {
- return alleles.get(i+1);
- }
-
- /**
- * @param other VariantContext whose alleles to compare against
- * @return true if this VariantContext has the same alleles (both ref and alts) as other,
- * regardless of ordering. Otherwise returns false.
- */
- public boolean hasSameAllelesAs ( final VariantContext other ) {
- return hasSameAlternateAllelesAs(other) && other.getReference().equals(getReference(), false);
- }
-
- /**
- * @param other VariantContext whose alternate alleles to compare against
- * @return true if this VariantContext has the same alternate alleles as other,
- * regardless of ordering. Otherwise returns false.
- */
- public boolean hasSameAlternateAllelesAs ( final VariantContext other ) {
- List<Allele> thisAlternateAlleles = getAlternateAlleles();
- List<Allele> otherAlternateAlleles = other.getAlternateAlleles();
-
- if ( thisAlternateAlleles.size() != otherAlternateAlleles.size() ) {
- return false;
- }
-
- for ( Allele allele : thisAlternateAlleles ) {
- if ( ! otherAlternateAlleles.contains(allele) ) {
- return false;
- }
- }
-
- return true;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Working with genotypes
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * @return the number of samples in the context
- */
- public int getNSamples() {
- return genotypes.size();
- }
-
- /**
- * @return true if the context has associated genotypes
- */
- public boolean hasGenotypes() {
- return ! genotypes.isEmpty();
- }
-
- public boolean hasGenotypes(Collection<String> sampleNames) {
- return genotypes.containsSamples(sampleNames);
- }
-
- /**
- * @return set of all Genotypes associated with this context
- */
- public GenotypesContext getGenotypes() {
- return genotypes;
- }
-
- public Iterable<Genotype> getGenotypesOrderedByName() {
- return genotypes.iterateInSampleNameOrder();
- }
-
- public Iterable<Genotype> getGenotypesOrderedBy(Iterable<String> sampleOrdering) {
- return genotypes.iterateInSampleNameOrder(sampleOrdering);
- }
-
- /**
- * Returns a map from sampleName -> Genotype for the genotype associated with sampleName. Returns a map
- * for consistency with the multi-get function.
- *
- * @param sampleName the sample name
- * @return mapping from sample name to genotype
- * @throws IllegalArgumentException if sampleName isn't bound to a genotype
- */
- public GenotypesContext getGenotypes(String sampleName) {
- return getGenotypes(Collections.singleton(sampleName));
- }
-
- /**
- * Returns a map from sampleName -> Genotype for each sampleName in sampleNames. Returns a map
- * for consistency with the multi-get function.
- *
- * For testing convenience only
- *
- * @param sampleNames a unique list of sample names
- * @return subsetting genotypes context
- * @throws IllegalArgumentException if sampleName isn't bound to a genotype
- */
- protected GenotypesContext getGenotypes(Collection<String> sampleNames) {
- return getGenotypes().subsetToSamples(new HashSet<>(sampleNames));
- }
-
- public GenotypesContext getGenotypes(Set<String> sampleNames) {
- return getGenotypes().subsetToSamples(sampleNames);
- }
-
-
- /**
- * @return the set of all sample names in this context, not ordered
- */
- public Set<String> getSampleNames() {
- return getGenotypes().getSampleNames();
- }
-
- public List<String> getSampleNamesOrderedByName() {
- return getGenotypes().getSampleNamesOrderedByName();
- }
-
- /**
- * @param sample the sample name
- *
- * @return the Genotype associated with the given sample in this context or null if the sample is not in this context
- */
- public Genotype getGenotype(String sample) {
- return getGenotypes().get(sample);
- }
-
- public boolean hasGenotype(String sample) {
- return getGenotypes().containsSample(sample);
- }
-
- /**
- * @param ith the sample index
- *
- * @return the ith genotype in this context or null if there aren't that many genotypes
- */
- public Genotype getGenotype(int ith) {
- return genotypes.size() > ith ? genotypes.get(ith) : null;
- }
-
- /**
- * Returns the number of chromosomes carrying any allele in the genotypes (i.e., excluding NO_CALLS)
- *
- * @return chromosome count
- */
- public int getCalledChrCount() {
- final Set<String> noSamples = Collections.emptySet();
- return getCalledChrCount(noSamples);
- }
-
- /**
- * Returns the number of chromosomes carrying any allele in the genotypes (i.e., excluding NO_CALLS)
- *
- * @param sampleIds IDs of samples to take into account. If empty then all samples are included.
- * @return chromosome count
- */
- public int getCalledChrCount(Set<String> sampleIds) {
- int n = 0;
- GenotypesContext genotypes = sampleIds.isEmpty() ? getGenotypes() : getGenotypes(sampleIds);
-
- for ( final Genotype g : genotypes) {
- for ( final Allele a : g.getAlleles() )
- n += a.isNoCall() ? 0 : 1;
- }
-
- return n;
- }
-
- /**
- * Returns the number of chromosomes carrying allele A in the genotypes
- *
- * @param a allele
- * @return chromosome count
- */
- public int getCalledChrCount(Allele a) {
- return getCalledChrCount(a, new HashSet<>(0));
- }
-
- /**
- * Returns the number of chromosomes carrying allele A in the genotypes
- *
- * @param a allele
- * @param sampleIds - IDs of samples to take into account. If empty then all samples are included.
- * @return chromosome count
- */
- public int getCalledChrCount(Allele a, Set<String> sampleIds) {
- int n = 0;
- GenotypesContext genotypes = sampleIds.isEmpty() ? getGenotypes() : getGenotypes(sampleIds);
-
- for ( final Genotype g : genotypes ) {
- n += g.countAllele(a);
- }
-
- return n;
- }
-
- /**
- * Genotype-specific functions -- are the genotypes monomorphic w.r.t. to the alleles segregating at this
- * site? That is, is the number of alternate alleles among all fo the genotype == 0?
- *
- * @return true if it's monomorphic
- */
- public boolean isMonomorphicInSamples() {
- if ( monomorphic == null )
- monomorphic = ! isVariant() || (hasGenotypes() && getCalledChrCount(getReference()) == getCalledChrCount());
- return monomorphic;
- }
-
- /**
- * Genotype-specific functions -- are the genotypes polymorphic w.r.t. to the alleles segregating at this
- * site? That is, is the number of alternate alleles among all fo the genotype > 0?
- *
- * @return true if it's polymorphic
- */
- public boolean isPolymorphicInSamples() {
- return ! isMonomorphicInSamples();
- }
-
- private void calculateGenotypeCounts() {
- if ( genotypeCounts == null ) {
- genotypeCounts = new int[GenotypeType.values().length];
-
- for ( final Genotype g : getGenotypes() ) {
- genotypeCounts[g.getType().ordinal()]++;
- }
- }
- }
-
- /**
- * Genotype-specific functions -- how many no-calls are there in the genotypes?
- *
- * @return number of no calls
- */
- public int getNoCallCount() {
- calculateGenotypeCounts();
- return genotypeCounts[GenotypeType.NO_CALL.ordinal()];
- }
-
- /**
- * Genotype-specific functions -- how many hom ref calls are there in the genotypes?
- *
- * @return number of hom ref calls
- */
- public int getHomRefCount() {
- calculateGenotypeCounts();
- return genotypeCounts[GenotypeType.HOM_REF.ordinal()];
- }
-
- /**
- * Genotype-specific functions -- how many het calls are there in the genotypes?
- *
- * @return number of het calls
- */
- public int getHetCount() {
- calculateGenotypeCounts();
- return genotypeCounts[GenotypeType.HET.ordinal()];
- }
-
- /**
- * Genotype-specific functions -- how many hom var calls are there in the genotypes?
- *
- * @return number of hom var calls
- */
- public int getHomVarCount() {
- calculateGenotypeCounts();
- return genotypeCounts[GenotypeType.HOM_VAR.ordinal()];
- }
-
- /**
- * Genotype-specific functions -- how many mixed calls are there in the genotypes?
- *
- * @return number of mixed calls
- */
- public int getMixedCount() {
- calculateGenotypeCounts();
- return genotypeCounts[GenotypeType.MIXED.ordinal()];
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // validation: extra-strict validation routines for paranoid users
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Run all extra-strict validation tests on a Variant Context object
- *
- * @param reportedReference the reported reference allele
- * @param observedReference the observed reference allele
- * @param rsIDs the true dbSNP IDs
- */
- public void extraStrictValidation(final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
- // validate the reference
- validateReferenceBases(reportedReference, observedReference);
-
- // validate the RS IDs
- validateRSIDs(rsIDs);
-
- // validate the alternate alleles
- validateAlternateAlleles();
-
- // validate the AN and AC fields
- validateChromosomeCounts();
-
- // TODO: implement me
- //checkReferenceTrack();
- }
-
- public void validateReferenceBases(final Allele reportedReference, final Allele observedReference) {
- if ( reportedReference != null && !reportedReference.basesMatch(observedReference) ) {
- throw new TribbleException.InternalCodecException(String.format("the REF allele is incorrect for the record at position %s:%d, fasta says %s vs. VCF says %s", getContig(), getStart(), observedReference.getBaseString(), reportedReference.getBaseString()));
- }
- }
-
- public void validateRSIDs(Set<String> rsIDs) {
- if ( rsIDs != null && hasID() ) {
- for ( String id : getID().split(VCFConstants.ID_FIELD_SEPARATOR) ) {
- if ( id.startsWith("rs") && !rsIDs.contains(id) )
- throw new TribbleException.InternalCodecException(String.format("the rsID %s for the record at position %s:%d is not in dbSNP", id, getContig(), getStart()));
- }
- }
- }
-
- public void validateAlternateAlleles() {
- if ( !hasGenotypes() )
- return;
-
- // maintain a list of non-symbolic alleles expected in the REF and ALT fields of the record
- // (we exclude symbolic alleles because it's commonly expected that they don't show up in the genotypes, e.g. with GATK gVCFs)
- final List<Allele> reportedAlleles = new ArrayList<Allele>();
- for ( final Allele allele : getAlleles() ) {
- if ( !allele.isSymbolic() )
- reportedAlleles.add(allele);
- }
-
- // maintain a list of non-symbolic alleles observed in the genotypes
- final Set<Allele> observedAlleles = new HashSet<>();
- observedAlleles.add(getReference());
- for ( final Genotype g : getGenotypes() ) {
- if ( g.isCalled() ) {
- for ( final Allele allele : g.getAlleles() ) {
- if ( !allele.isSymbolic() )
- observedAlleles.add(allele);
- }
- }
- }
- if ( observedAlleles.contains(Allele.NO_CALL) )
- observedAlleles.remove(Allele.NO_CALL);
-
- if ( reportedAlleles.size() != observedAlleles.size() )
- throw new TribbleException.InternalCodecException(String.format("one or more of the ALT allele(s) for the record at position %s:%d are not observed at all in the sample genotypes", getContig(), getStart()));
-
- int originalSize = reportedAlleles.size();
- // take the intersection and see if things change
- observedAlleles.retainAll(reportedAlleles);
- if ( observedAlleles.size() != originalSize )
- throw new TribbleException.InternalCodecException(String.format("one or more of the ALT allele(s) for the record at position %s:%d are not observed at all in the sample genotypes", getContig(), getStart()));
- }
-
- private void validateAttributeIsExpectedSize(final String attributeKey, final int numAlternateAlleles ) {
- final List<Object> actualValues = getAttributeAsList(attributeKey);
- if (!actualValues.isEmpty()) {
- // always have at least one actual value
- final int expectedValuesSize = numAlternateAlleles > 0 ? numAlternateAlleles : 1;
- if (actualValues.size() != expectedValuesSize) {
- throw new TribbleException.InternalCodecException(String.format("the %s tag has the incorrect number of records at position %s:%d, %d vs. %d", attributeKey, getContig(), getStart(), actualValues.size(), expectedValuesSize));
- }
- }
- }
-
- public void validateChromosomeCounts() {
- final int numberOfAlternateAlleles = alleles.size() - 1;
- validateAttributeIsExpectedSize(VCFConstants.ALLELE_COUNT_KEY, numberOfAlternateAlleles);
- validateAttributeIsExpectedSize(VCFConstants.ALLELE_FREQUENCY_KEY, numberOfAlternateAlleles);
-
- if ( !hasGenotypes() )
- return;
-
- // AN
- if ( hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) ) {
- final int reportedAN = Integer.valueOf(getAttribute(VCFConstants.ALLELE_NUMBER_KEY).toString());
- final int observedAN = getCalledChrCount();
- if ( reportedAN != observedAN )
- throw new TribbleException.InternalCodecException(String.format("the Allele Number (AN) tag is incorrect for the record at position %s:%d, %d vs. %d", getContig(), getStart(), reportedAN, observedAN));
- }
-
- // AC
- if ( hasAttribute(VCFConstants.ALLELE_COUNT_KEY) ) {
- final ArrayList<Integer> observedACs = new ArrayList<>();
-
- // if there are alternate alleles, record the relevant tags
- if ( numberOfAlternateAlleles > 0 ) {
- for ( Allele allele : getAlternateAlleles() ) {
- observedACs.add(getCalledChrCount(allele));
- }
- }
- else { // otherwise, set them to 0
- observedACs.add(0);
- }
-
- final List<Object> reportedACs = getAttributeAsList(VCFConstants.ALLELE_COUNT_KEY);
-
- for (int i = 0; i < observedACs.size(); i++) {
- // need to cast to int to make sure we don't have an issue below with object equals (earlier bug) - EB
- final int reportedAC = Integer.valueOf(reportedACs.get(i).toString());
- if ( reportedAC != observedACs.get(i) )
- throw new TribbleException.InternalCodecException(String.format("the Allele Count (AC) tag is incorrect for the record at position %s:%d, %s vs. %d", getContig(), getStart(), reportedAC, observedACs.get(i)));
- }
- }
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // validation: the normal validation routines are called automatically upon creation of the VC
- //
- // ---------------------------------------------------------------------------------------------------------
-
- private boolean validate(final EnumSet<Validation> validationToPerform) {
- validateStop();
- for (final Validation val : validationToPerform ) {
- switch (val) {
- case ALLELES: validateAlleles(); break;
- case GENOTYPES: validateGenotypes(); break;
- default: throw new IllegalArgumentException("Unexpected validation mode " + val);
- }
- }
-
- return true;
- }
-
- /**
- * Check that getEnd() == END from the info field, if it's present
- */
- private void validateStop() {
- if ( hasAttribute(VCFConstants.END_KEY) ) {
- final int end = getAttributeAsInt(VCFConstants.END_KEY, -1);
- assert end != -1;
- if ( end != getEnd() ) {
- final String message = "Badly formed variant context at location " + getContig() + ":"
- + getStart() + "; getEnd() was " + getEnd()
- + " but this VariantContext contains an END key with value " + end;
- if ( GeneralUtils.DEBUG_MODE_ENABLED && WARN_ABOUT_BAD_END ) {
- System.err.println(message);
- }
- else {
- throw new TribbleException(message);
- }
- }
- } else {
- final long length = (stop - start) + 1;
- if ( ! hasSymbolicAlleles() && length != getReference().length() ) {
- throw new IllegalStateException("BUG: GenomeLoc " + contig + ":" + start + "-" + stop + " has a size == " + length + " but the variation reference allele has length " + getReference().length() + " this = " + this);
- }
- }
- }
-
- private void validateAlleles() {
-
- boolean alreadySeenRef = false;
-
- for ( final Allele allele : alleles ) {
- // make sure there's only one reference allele
- if ( allele.isReference() ) {
- if ( alreadySeenRef ) throw new IllegalArgumentException("BUG: Received two reference tagged alleles in VariantContext " + alleles + " this=" + this);
- alreadySeenRef = true;
- }
-
- if ( allele.isNoCall() ) {
- throw new IllegalArgumentException("BUG: Cannot add a no call allele to a variant context " + alleles + " this=" + this);
- }
- }
-
- // make sure there's one reference allele
- if ( ! alreadySeenRef )
- throw new IllegalArgumentException("No reference allele found in VariantContext");
- }
-
- private void validateGenotypes() {
- if ( this.genotypes == null ) throw new IllegalStateException("Genotypes is null");
-
- for ( final Genotype g : this.genotypes ) {
- if ( g.isAvailable() ) {
- for ( Allele gAllele : g.getAlleles() ) {
- if ( ! hasAllele(gAllele) && gAllele.isCalled() )
- throw new IllegalStateException("Allele in genotype " + gAllele + " not in the variant context " + alleles);
- }
- }
- }
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // utility routines
- //
- // ---------------------------------------------------------------------------------------------------------
-
- private void determineType() {
- if ( type == null ) {
- switch ( getNAlleles() ) {
- case 0:
- throw new IllegalStateException("Unexpected error: requested type of VariantContext with no alleles!" + this);
- case 1:
- // note that this doesn't require a reference allele. You can be monomorphic independent of having a
- // reference allele
- type = Type.NO_VARIATION;
- break;
- default:
- determinePolymorphicType();
- }
- }
- }
-
- private void determinePolymorphicType() {
- type = null;
-
- // do a pairwise comparison of all alleles against the reference allele
- for ( Allele allele : alleles ) {
- if ( allele == REF )
- continue;
-
- // find the type of this allele relative to the reference
- Type biallelicType = typeOfBiallelicVariant(REF, allele);
-
- // for the first alternate allele, set the type to be that one
- if ( type == null ) {
- type = biallelicType;
- }
- // if the type of this allele is different from that of a previous one, assign it the MIXED type and quit
- else if ( biallelicType != type ) {
- type = Type.MIXED;
- return;
- }
- }
- }
-
- private static Type typeOfBiallelicVariant(Allele ref, Allele allele) {
- if ( ref.isSymbolic() )
- throw new IllegalStateException("Unexpected error: encountered a record with a symbolic reference allele");
-
- if ( allele.isSymbolic() )
- return Type.SYMBOLIC;
-
- if ( ref.length() == allele.length() ) {
- if ( allele.length() == 1 )
- return Type.SNP;
- else
- return Type.MNP;
- }
-
- // Important note: previously we were checking that one allele is the prefix of the other. However, that's not an
- // appropriate check as can be seen from the following example:
- // REF = CTTA and ALT = C,CT,CA
- // This should be assigned the INDEL type but was being marked as a MIXED type because of the prefix check.
- // In truth, it should be absolutely impossible to return a MIXED type from this method because it simply
- // performs a pairwise comparison of a single alternate allele against the reference allele (whereas the MIXED type
- // is reserved for cases of multiple alternate alleles of different types). Therefore, if we've reached this point
- // in the code (so we're not a SNP, MNP, or symbolic allele), we absolutely must be an INDEL.
-
- return Type.INDEL;
-
- // old incorrect logic:
- // if (oneIsPrefixOfOther(ref, allele))
- // return Type.INDEL;
- // else
- // return Type.MIXED;
- }
-
- public String toString() {
- // Note: passing genotypes to String.format() will implicitly decode the genotypes
- // This may not be desirable, so don't decode by default
-
- return genotypes.isLazyWithData() ? toStringUnparsedGenotypes() : toStringDecodeGenotypes();
- }
-
- public String toStringDecodeGenotypes() {
- return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s",
- getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
- hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
- this.getType(),
- ParsingUtils.sortList(this.getAlleles()),
- ParsingUtils.sortedString(this.getAttributes()),
- this.getGenotypes());
- }
-
- private String toStringUnparsedGenotypes() {
- return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s GT=%s",
- getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
- hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
- this.getType(),
- ParsingUtils.sortList(this.getAlleles()),
- ParsingUtils.sortedString(this.getAttributes()),
- ((LazyGenotypesContext)this.genotypes).getUnparsedGenotypeData());
- }
-
- public String toStringWithoutGenotypes() {
- return String.format("[VC %s @ %s Q%s of type=%s alleles=%s attr=%s",
- getSource(), contig + ":" + (start - stop == 0 ? start : start + "-" + stop),
- hasLog10PError() ? String.format("%.2f", getPhredScaledQual()) : ".",
- this.getType(),
- ParsingUtils.sortList(this.getAlleles()),
- ParsingUtils.sortedString(this.getAttributes()));
- }
-
- // protected basic manipulation routines
- private static List<Allele> makeAlleles(Collection<Allele> alleles) {
- final List<Allele> alleleList = new ArrayList<>(alleles.size());
-
- boolean sawRef = false;
- for ( final Allele a : alleles ) {
- for ( final Allele b : alleleList ) {
- if ( a.equals(b, true) )
- throw new IllegalArgumentException("Duplicate allele added to VariantContext: " + a);
- }
-
- // deal with the case where the first allele isn't the reference
- if ( a.isReference() ) {
- if ( sawRef )
- throw new IllegalArgumentException("Alleles for a VariantContext must contain at most one reference allele: " + alleles);
- alleleList.add(0, a);
- sawRef = true;
- }
- else
- alleleList.add(a);
- }
-
- if ( alleleList.isEmpty() )
- throw new IllegalArgumentException("Cannot create a VariantContext with an empty allele list");
-
- if ( alleleList.get(0).isNonReference() )
- throw new IllegalArgumentException("Alleles for a VariantContext must contain at least one reference allele: " + alleles);
-
- return alleleList;
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // Fully decode
- //
- // ---------------------------------------------------------------------------------------------------------
-
- /**
- * Return a VC equivalent to this one but where all fields are fully decoded
- *
- * See VariantContext document about fully decoded
- *
- * @param header containing types about all fields in this VC
- * @return a fully decoded version of this VC
- */
- public VariantContext fullyDecode(final VCFHeader header, final boolean lenientDecoding) {
- if ( isFullyDecoded() )
- return this;
- else {
- // TODO -- warning this is potentially very expensive as it creates copies over and over
- final VariantContextBuilder builder = new VariantContextBuilder(this);
- fullyDecodeInfo(builder, header, lenientDecoding);
- fullyDecodeGenotypes(builder, header);
- builder.fullyDecoded(true);
- return builder.make();
- }
- }
-
- /**
- * See VariantContext document about fully decoded
- * @return true if this is a fully decoded VC
- */
- public boolean isFullyDecoded() {
- return fullyDecoded;
- }
-
- private final void fullyDecodeInfo(final VariantContextBuilder builder, final VCFHeader header, final boolean lenientDecoding) {
- builder.attributes(fullyDecodeAttributes(getAttributes(), header, lenientDecoding));
- }
-
- private final Map<String, Object> fullyDecodeAttributes(final Map<String, Object> attributes,
- final VCFHeader header,
- final boolean lenientDecoding) {
- final Map<String, Object> newAttributes = new HashMap<>(10);
-
- for ( final Map.Entry<String, Object> attr : attributes.entrySet() ) {
- final String field = attr.getKey();
-
- if ( field.equals(VCFConstants.GENOTYPE_FILTER_KEY) )
- continue; // gross, FT is part of the extended attributes
-
- final VCFCompoundHeaderLine format = VariantContextUtils.getMetaDataForField(header, field);
- final Object decoded = decodeValue(field, attr.getValue(), format);
-
- if ( decoded != null &&
- ! lenientDecoding
- && format.getCountType() != VCFHeaderLineCount.UNBOUNDED
- && format.getType() != VCFHeaderLineType.Flag ) { // we expect exactly the right number of elements
- final int obsSize = decoded instanceof List ? ((List) decoded).size() : 1;
- final int expSize = format.getCount(this);
- if ( obsSize != expSize ) {
- throw new TribbleException.InvalidHeader("Discordant field size detected for field " +
- field + " at " + getContig() + ":" + getStart() + ". Field had " + obsSize + " values " +
- "but the header says this should have " + expSize + " values based on header record " +
- format);
- }
- }
- newAttributes.put(field, decoded);
- }
-
- return newAttributes;
- }
-
- private final Object decodeValue(final String field, final Object value, final VCFCompoundHeaderLine format) {
- if ( value instanceof String ) {
- if ( field.equals(VCFConstants.GENOTYPE_PL_KEY) )
- return GenotypeLikelihoods.fromPLField((String)value);
-
- final String string = (String)value;
- if ( string.indexOf(',') != -1 ) {
- final String[] splits = string.split(",");
- final List<Object> values = new ArrayList<>(splits.length);
- for ( int i = 0; i < splits.length; i++ )
- values.add(decodeOne(field, splits[i], format));
- return values;
- } else {
- return decodeOne(field, string, format);
- }
- } else if ( value instanceof List && (((List) value).get(0)) instanceof String ) {
- final List<String> asList = (List<String>)value;
- final List<Object> values = new ArrayList<>(asList.size());
- for ( final String s : asList )
- values.add(decodeOne(field, s, format));
- return values;
- } else {
- return value;
- }
-
- // allowMissingValuesComparedToHeader
- }
-
- private final Object decodeOne(final String field, final String string, final VCFCompoundHeaderLine format) {
- try {
- if ( string.equals(VCFConstants.MISSING_VALUE_v4) )
- return null;
- else {
- switch ( format.getType() ) {
- case Character: return string;
- case Flag:
- final boolean b = Boolean.valueOf(string) || string.equals("1");
- if ( b == false )
- throw new TribbleException("VariantContext FLAG fields " + field + " cannot contain false values"
- + " as seen at " + getContig() + ":" + getStart());
- return b;
- case String: return string;
- case Integer: return Integer.valueOf(string);
- case Float: return Double.valueOf(string);
- default: throw new TribbleException("Unexpected type for field" + field);
- }
- }
- } catch (NumberFormatException e) {
- throw new TribbleException("Could not decode field " + field + " with value " + string + " of declared type " + format.getType());
- }
- }
-
- private final void fullyDecodeGenotypes(final VariantContextBuilder builder, final VCFHeader header) {
- final GenotypesContext gc = new GenotypesContext();
- for ( final Genotype g : getGenotypes() ) {
- gc.add(fullyDecodeGenotypes(g, header));
- }
- builder.genotypesNoValidation(gc);
- }
-
- private final Genotype fullyDecodeGenotypes(final Genotype g, final VCFHeader header) {
- final Map<String, Object> map = fullyDecodeAttributes(g.getExtendedAttributes(), header, true);
- return new GenotypeBuilder(g).attributes(map).make();
- }
-
- // ---------------------------------------------------------------------------------------------------------
- //
- // tribble integration routines -- not for public consumption
- //
- // ---------------------------------------------------------------------------------------------------------
-
- @Override
- public String getContig() {
- return contig;
- }
-
- /**
- * @return 1-based inclusive start position of the Variant
- * INDEL events usually start on the first unaltered reference base before the INDEL
- *
- * <strong>Warning:</strong> be aware that the start position of the VariantContext is defined in terms of the start position specified in the
- * underlying vcf file, VariantContexts representing the same biological event may have different start positions depending on the
- * specifics of the vcf file they are derived from
- */
- public int getStart() {
- return (int)start;
- }
-
- /**
- * @return 1-based closed end position of the Variant
- * If the END info field is specified that value is returned, otherwise the end is the start + reference allele length - 1.
- * For VariantContexts with a single alternate allele, if that allele is an insertion, the end position will be on the reference base
- * before the insertion event. If the single alt allele is a deletion, the end will be on the final deleted reference base.
- */
- public int getEnd() {
- return (int)stop;
- }
-
- public boolean hasSymbolicAlleles() {
- return hasSymbolicAlleles(getAlleles());
- }
-
- public static boolean hasSymbolicAlleles( final List<Allele> alleles ) {
- return alleles.stream().anyMatch(Allele::isSymbolic);
- }
-
- public Allele getAltAlleleWithHighestAlleleCount() {
- // optimization: for bi-allelic sites, just return the only alt allele
- if ( isBiallelic() )
- return getAlternateAllele(0);
-
- return getAlternateAlleles().stream()
- .max(Comparator.comparing(this::getCalledChrCount))
- .orElse(null);
- }
-
- /**
- * Lookup the index of allele in this variant context
- *
- * @param allele the allele whose index we want to get
- * @return the index of the allele into getAlleles(), or -1 if it cannot be found
- */
- public int getAlleleIndex(final Allele allele) {
- return getAlleles().indexOf(allele);
- }
-
- /**
- * Return the allele index #getAlleleIndex for each allele in alleles
- *
- * @param alleles the alleles we want to look up
- * @return a list of indices for each allele, in order
- */
- public List<Integer> getAlleleIndices(final Collection<Allele> alleles) {
- return alleles.stream()
- .map(this::getAlleleIndex)
- .collect(Collectors.toCollection(() -> new ArrayList<>(alleles.size())));
- }
-
- public int[] getGLIndecesOfAlternateAllele(Allele targetAllele) {
- final int index = getAlleleIndex(targetAllele);
- if ( index == -1 ) throw new IllegalArgumentException("Allele " + targetAllele + " not in this VariantContex " + this);
- return GenotypeLikelihoods.getPLIndecesOfAlleles(0, index);
- }
-
- /**
- * Search for the INFO=SVTYPE and return the type of Structural Variant
- * @return the StructuralVariantType of null if there is no property SVTYPE
- * */
- public StructuralVariantType getStructuralVariantType() {
- final String svType = this.getAttributeAsString(VCFConstants.SVTYPE, null);
- return svType == null ? null : StructuralVariantType.valueOf(svType);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java
deleted file mode 100644
index 33844db..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextBuilder.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>Builder class for <code>VariantContext</code>.</p>
- *
- * <p>Some basic assumptions here:</p>
- * <ol>
- * <li> data isn't protectively copied. If you provide an attribute map to
- * the build, and modify it later, the builder will see this and so will any
- * resulting variant contexts. It's best not to modify collections provided
- * to a builder.</li>
- *
- * <li> the system uses the standard builder model, allowing the simple construction idiom:
- *<blockquote>
- * <code>builder.source("a").genotypes(gc).id("x").make()</code> => <code>VariantContext</code>
- *</blockquote></li>
- *<li>The best way to copy a VariantContext is:
- *<blockquote>
- * <code>new VariantContextBuilder(vc).make()</code> => a copy of VC
- *</blockquote>
- * <li> validation of arguments is done at the during the final <code>make()</code> call, so a
- * <code>VariantContextBuilder</code> can exist in an inconsistent state as long as those issues
- * are resolved before the call to <code>make()</code> is issued.
- *</ol>
- * @author depristo
- */
-public class VariantContextBuilder {
- // required fields
- private boolean fullyDecoded = false;
- private String source = null;
- private String contig = null;
- private long start = -1;
- private long stop = -1;
- private Collection<Allele> alleles = null;
-
- // optional -> these are set to the appropriate default value
- private String ID = VCFConstants.EMPTY_ID_FIELD;
- private GenotypesContext genotypes = GenotypesContext.NO_GENOTYPES;
- private double log10PError = VariantContext.NO_LOG10_PERROR;
- private Set<String> filters = null;
- private Map<String, Object> attributes = null;
- private boolean attributesCanBeModified = false;
-
- /** enum of what must be validated */
- final private EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
-
- /**
- * Create an empty VariantContextBuilder where all values adopt their default values. Note that
- * source, chr, start, stop, and alleles must eventually be filled in, or the resulting VariantContext
- * will throw an error.
- */
- public VariantContextBuilder() {}
-
- /**
- * Create an empty VariantContextBuilder where all values adopt their default values, but the bare min.
- * of info (source, chr, start, stop, and alleles) have been provided to start.
- */
- public VariantContextBuilder(final String source, final String contig, final long start, final long stop, final Collection<Allele> alleles) {
- this.source = source;
- this.contig = contig;
- this.start = start;
- this.stop = stop;
- this.alleles = alleles;
- this.attributes = Collections.emptyMap(); // immutable
- toValidate.add(VariantContext.Validation.ALLELES);
- }
-
- /**
- * Returns a new builder based on parent -- the new VC will have all fields initialized
- * to their corresponding values in parent. This is the best way to create a derived VariantContext
- *
- * @param parent Cannot be null
- */
- public VariantContextBuilder(final VariantContext parent) {
- if ( parent == null ) throw new IllegalArgumentException("BUG: VariantContextBuilder parent argument cannot be null in VariantContextBuilder");
- this.alleles = parent.getAlleles();
- this.attributes = parent.getAttributes();
- this.attributesCanBeModified = false;
- this.contig = parent.getContig();
- this.filters = parent.getFiltersMaybeNull();
- this.genotypes = parent.getGenotypes();
- this.ID = parent.getID();
- this.log10PError = parent.getLog10PError();
- this.source = parent.getSource();
- this.start = parent.getStart();
- this.stop = parent.getEnd();
- this.fullyDecoded = parent.isFullyDecoded();
- }
-
- public VariantContextBuilder(final VariantContextBuilder parent) {
- if ( parent == null ) throw new IllegalArgumentException("BUG: VariantContext parent argument cannot be null in VariantContextBuilder");
- this.alleles = parent.alleles;
- this.attributesCanBeModified = false;
- this.contig = parent.contig;
- this.genotypes = parent.genotypes;
- this.ID = parent.ID;
- this.log10PError = parent.log10PError;
- this.source = parent.source;
- this.start = parent.start;
- this.stop = parent.stop;
- this.fullyDecoded = parent.fullyDecoded;
-
- this.attributes(parent.attributes);
- this.filters(parent.filters);
- }
-
- public VariantContextBuilder copy() {
- return new VariantContextBuilder(this);
- }
-
- /**
- * Tells this builder to use this collection of alleles for the resulting VariantContext
- *
- * @param alleles
- * @return this builder
- */
- public VariantContextBuilder alleles(final Collection<Allele> alleles) {
- this.alleles = alleles;
- toValidate.add(VariantContext.Validation.ALLELES);
- return this;
- }
-
- public VariantContextBuilder alleles(final List<String> alleleStrings) {
- final List<Allele> alleles = new ArrayList<Allele>(alleleStrings.size());
-
- for ( int i = 0; i < alleleStrings.size(); i++ ) {
- alleles.add(Allele.create(alleleStrings.get(i), i == 0));
- }
-
- return alleles(alleles);
- }
-
- public VariantContextBuilder alleles(final String ... alleleStrings) {
- return alleles(Arrays.asList(alleleStrings));
- }
-
- public List<Allele> getAlleles() {
- return new ArrayList<Allele>(alleles);
- }
-
- /**
- * Tells this builder to use this map of attributes for the resulting <code>VariantContext</code>. The
- * contents of the Map are copied to a new Map to ensure that modifications to the provided Map post-invocation
- * don't affect the VariantContext and also to ensure additional attributes can be added in case the provided
- * map doesn't support changes (e.g. UnmodifiableMap).
- *
- * Attributes can be <code>null</code> -> meaning there are no attributes. After
- * calling this routine the builder assumes it can modify the attributes
- * object here, if subsequent calls are made to set attribute values
- *
- * Value for each attribute must be of a type that implements {@link Serializable} or else
- * serialization will fail.
- *
- * @param attributes a Map of attributes to replace any existing attributes with
- */
- public VariantContextBuilder attributes(final Map<String, ?> attributes) {
- this.attributes = new HashMap<>();
- if (attributes != null) this.attributes.putAll(attributes);
- this.attributesCanBeModified = true;
- return this;
- }
-
- /**
- * Puts the key -> value mapping into this builder's attributes
- *
- * @param key key for the attribute
- * @param value value for the attribute (must be of a type that implements {@link Serializable} or else serialization will fail)
- */
- public VariantContextBuilder attribute(final String key, final Object value) {
- makeAttributesModifiable();
- attributes.put(key, value);
- return this;
- }
-
- /**
- * Removes key if present in the attributes
- *
- * @param key key to remove
- * @return
- */
- public VariantContextBuilder rmAttribute(final String key) {
- makeAttributesModifiable();
- attributes.remove(key);
- return this;
- }
-
- /**
- * Removes list of keys if present in the attributes
- *
- * @param keys list of keys to remove
- * @return
- */
- public VariantContextBuilder rmAttributes(final List<String> keys) {
- makeAttributesModifiable();
- for ( final String key : keys )
- attributes.remove(key);
- return this;
- }
-
- /**
- * Makes the attributes field modifiable. In many cases attributes is just a pointer to an immutable
- * collection, so methods that want to add / remove records require the attributes to be copied to a
- */
- private void makeAttributesModifiable() {
- if ( ! attributesCanBeModified ) {
- this.attributesCanBeModified = true;
- if (attributes == null) {
- this.attributes = new HashMap<String, Object>();
- } else {
- this.attributes = new HashMap<String, Object>(attributes);
- }
- }
- }
-
- /**
- * This builder's filters are set to this value
- *
- * filters can be <code>null</code> -> meaning there are no filters
- * @param filters
- */
- public VariantContextBuilder filters(final Set<String> filters) {
- this.filters = filters;
- return this;
- }
-
- /**
- * {@link #filters}
- *
- * @param filters
- * @return
- */
- public VariantContextBuilder filters(final String ... filters) {
- filters(new LinkedHashSet<String>(Arrays.asList(filters)));
- return this;
- }
-
- public VariantContextBuilder filter(final String filter) {
- if ( this.filters == null ) this.filters = new LinkedHashSet<String>(1);
- this.filters.add(filter);
- return this;
- }
-
- /**
- * Tells this builder that the resulting VariantContext should have PASS filters
- *
- * @return
- */
- public VariantContextBuilder passFilters() {
- return filters(VariantContext.PASSES_FILTERS);
- }
-
- /**
- * Tells this builder that the resulting VariantContext be unfiltered
- *
- * @return
- */
- public VariantContextBuilder unfiltered() {
- this.filters = null;
- return this;
- }
-
- /**
- * Tells this builder that the resulting <code>VariantContext</code> should use this genotype's <code>GenotypeContext</code>.
- *
- * Note that genotypes can be <code>null</code> -> meaning there are no genotypes
- *
- * @param genotypes
- */
- public VariantContextBuilder genotypes(final GenotypesContext genotypes) {
- this.genotypes = genotypes;
- if ( genotypes != null )
- toValidate.add(VariantContext.Validation.GENOTYPES);
- return this;
- }
-
- public VariantContextBuilder genotypesNoValidation(final GenotypesContext genotypes) {
- this.genotypes = genotypes;
- return this;
- }
-
- /**
- * Tells this builder that the resulting <code>VariantContext</code> should use a <code>GenotypeContext</code> containing genotypes
- *
- * Note that genotypes can be <code>null</code>, meaning there are no genotypes
- *
- * @param genotypes
- */
- public VariantContextBuilder genotypes(final Collection<Genotype> genotypes) {
- return genotypes(GenotypesContext.copy(genotypes));
- }
-
- /**
- * Tells this builder that the resulting <code>VariantContext</code> should use a <code>GenotypeContext</code> containing genotypes
- * @param genotypes
- */
- public VariantContextBuilder genotypes(final Genotype ... genotypes) {
- return genotypes(GenotypesContext.copy(Arrays.asList(genotypes)));
- }
-
- /**
- * Tells this builder that the resulting VariantContext should not contain any GenotypeContext
- */
- public VariantContextBuilder noGenotypes() {
- this.genotypes = null;
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have ID
- * @param ID
- * @return
- */
- public VariantContextBuilder id(final String ID) {
- this.ID = ID;
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should not have an ID
- * @return
- */
- public VariantContextBuilder noID() {
- return id(VCFConstants.EMPTY_ID_FIELD);
- }
-
- /**
- * Tells us that the resulting VariantContext should have log10PError
- * @param log10PError
- * @return
- */
- public VariantContextBuilder log10PError(final double log10PError) {
- this.log10PError = log10PError;
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have source field set to source
- * @param source
- * @return
- */
- public VariantContextBuilder source(final String source) {
- this.source = source;
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have the specified location
- * @param contig
- * @param start
- * @param stop
- * @return
- */
- public VariantContextBuilder loc(final String contig, final long start, final long stop) {
- this.contig = contig;
- this.start = start;
- this.stop = stop;
- toValidate.add(VariantContext.Validation.ALLELES);
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have the specified contig chr
- * @param contig
- * @return
- */
- public VariantContextBuilder chr(final String contig) {
- this.contig = contig;
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have the specified contig start
- * @param start
- * @return
- */
- public VariantContextBuilder start(final long start) {
- this.start = start;
- toValidate.add(VariantContext.Validation.ALLELES);
- return this;
- }
-
- /**
- * Tells us that the resulting VariantContext should have the specified contig stop
- * @param stop
- * @return
- */
- public VariantContextBuilder stop(final long stop) {
- this.stop = stop;
- return this;
- }
-
- /**
- * @see #computeEndFromAlleles(java.util.List, int, int) with endForSymbolicAlleles == -1
- */
- public VariantContextBuilder computeEndFromAlleles(final List<Allele> alleles, final int start) {
- return computeEndFromAlleles(alleles, start, -1);
- }
-
- /**
- * Compute the end position for this VariantContext from the alleles themselves
- *
- * assigns this builder the stop position computed.
- *
- * @param alleles the list of alleles to consider. The reference allele must be the first one
- * @param start the known start position of this event
- * @param endForSymbolicAlleles the end position to use if any of the alleles is symbolic. Can be -1
- * if no is expected but will throw an error if one is found
- * @return this builder
- */
- public VariantContextBuilder computeEndFromAlleles(final List<Allele> alleles, final int start, final int endForSymbolicAlleles) {
- stop(VariantContextUtils.computeEndFromAlleles(alleles, start, endForSymbolicAlleles));
- return this;
- }
-
- /**
- * @return true if this builder contains fully decoded data
- *
- * See VariantContext for more information
- */
- public boolean isFullyDecoded() {
- return fullyDecoded;
- }
-
- /**
- * Sets this builder's fully decoded state to true.
- *
- * A fully decoded builder indicates that all fields are represented by their
- * proper java objects (e.g., Integer(10) not "10").
- *
- * See VariantContext for more information
- *
- * @param isFullyDecoded
- */
- public VariantContextBuilder fullyDecoded(boolean isFullyDecoded) {
- this.fullyDecoded = isFullyDecoded;
- return this;
- }
-
- /**
- * Takes all of the builder data provided up to this point, and instantiates
- * a freshly allocated VariantContext with all of the builder data. This
- * VariantContext is validated as appropriate and if not failing QC (and
- * throwing an exception) is returned.
- *
- * Note that this function can be called multiple times to create multiple
- * VariantContexts from the same builder.
- */
- public VariantContext make() {
- return make(false);
- }
-
- public VariantContext make(final boolean leaveModifyableAsIs) {
- if(!leaveModifyableAsIs) attributesCanBeModified = false;
-
- return new VariantContext(source, ID, contig, start, stop, alleles,
- genotypes, log10PError, filters, attributes,
- fullyDecoded, toValidate);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java
deleted file mode 100644
index d4e288f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextComparator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A Comparator that orders VariantContexts by the ordering of the contigs/chromosomes in the List
- * provided at construction time, then by start position with each contig/chromosome.
- */
-public class VariantContextComparator implements Comparator<VariantContext>, Serializable {
- private static final long serialVersionUID = 1L;
-
- public static List<String> getSequenceNameList(final SAMSequenceDictionary dictionary) {
- final List<String> list = new ArrayList<String>();
- for (final SAMSequenceRecord record : dictionary.getSequences()) {
- list.add(record.getSequenceName());
- }
- return list;
- }
-
- // For fast lookup of the contig's index in the contig list
- private final Map<String, Integer> contigIndexLookup;
-
- public VariantContextComparator(final List<String> contigs) {
- if (contigs.isEmpty()) throw new IllegalArgumentException("One or more contigs must be in the contig list.");
-
- final Map<String, Integer> protoContigIndexLookup = new HashMap<String, Integer>();
- int index = 0;
- for (final String contig : contigs) {
- protoContigIndexLookup.put(contig, index++);
- }
-
- if (protoContigIndexLookup.size() != contigs.size()) {
- throw new IllegalArgumentException("There are duplicate contigs/chromosomes in the input contig list.");
- }
-
- this.contigIndexLookup = Collections.unmodifiableMap(protoContigIndexLookup);
- }
-
- /**
- * Creates a VariantContextComparator from the given VCF contig header lines. The header lines'
- * index values are used to order the contigs. Throws IllegalArgumentException if there are dupe
- *
- */
- public VariantContextComparator(final Collection<VCFContigHeaderLine> headerLines) {
- if (headerLines.isEmpty()) throw new IllegalArgumentException("One or more header lines must be in the header line collection.");
-
- final Map<String, Integer> protoContigIndexLookup = new HashMap<String, Integer>();
- for (final VCFContigHeaderLine headerLine : headerLines) {
- protoContigIndexLookup.put(headerLine.getID(), headerLine.getContigIndex());
- }
-
- if (protoContigIndexLookup.size() != headerLines.size()) {
- throw new IllegalArgumentException("There are duplicate contigs/chromosomes in the input header line collection.");
- }
-
- final Set<Integer> protoIndexValues = new HashSet<Integer>(protoContigIndexLookup.values());
- if (protoIndexValues.size() != headerLines.size()) {
- throw new IllegalArgumentException("One or more contigs share the same index number.");
- }
-
- this.contigIndexLookup = Collections.unmodifiableMap(protoContigIndexLookup);
- }
-
- public VariantContextComparator(final SAMSequenceDictionary dictionary) {
- this(getSequenceNameList(dictionary));
- }
-
- @Override
- public int compare(final VariantContext firstVariantContext, final VariantContext secondVariantContext) {
- // Will throw NullPointerException -- happily -- if either of the chromosomes/contigs aren't
- // present. This error checking should already have been done in the constructor but it's left
- // in as defence anyway.
- final int contigCompare =
- this.contigIndexLookup.get(firstVariantContext.getContig()) - this.contigIndexLookup.get(secondVariantContext.getContig());
- return contigCompare != 0
- ? contigCompare
- : firstVariantContext.getStart() - secondVariantContext.getStart();
- }
-
- /**
- * Returns true if the given header lines are from a file sorted according to this VariantContextComparator.
- * For sorting to work properly, the contig in each header line must have the same index.
- */
- public boolean isCompatible(final Collection<VCFContigHeaderLine> headerLines) {
- for (final VCFContigHeaderLine headerLine : headerLines) {
- final Integer existingIndex = this.contigIndexLookup.get(headerLine.getID());
- if (existingIndex == null || headerLine.getContigIndex() != existingIndex.intValue()) return false;
- }
-
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java b/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java
deleted file mode 100644
index face55b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantContextUtils.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.samtools.util.Lazy;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-import org.apache.commons.jexl2.Expression;
-import org.apache.commons.jexl2.JexlEngine;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class VariantContextUtils {
- private static Set<String> MISSING_KEYS_WARNED_ABOUT = new HashSet<String>();
-
- /** Use a {@link Lazy} {@link JexlEngine} instance to avoid class-loading issues. (Applications that access this class are otherwise
- * forced to build a {@link JexlEngine} instance, which depends on some apache logging libraries that mightn't be packaged.) */
- final public static Lazy<JexlEngine> engine = new Lazy<JexlEngine>(new Lazy.LazyInitializer<JexlEngine>() {
- @Override
- public JexlEngine make() {
- final JexlEngine jexl = new JexlEngine();
- jexl.setSilent(false); // will throw errors now for selects that don't evaluate properly
- jexl.setLenient(false);
- jexl.setDebug(false);
- return jexl;
- }
- });
- private final static boolean ASSUME_MISSING_FIELDS_ARE_STRINGS = false;
-
- /**
- * Computes the alternate allele frequency at the provided {@link VariantContext} by dividing its "AN" by its "AC".
- * @param vc The variant whose alternate allele frequency is computed
- * @return The alternate allele frequency in [0, 1]
- * @throws AssertionError When either annotation is missing, or when the compuated frequency is outside the expected range
- */
- public static double calculateAltAlleleFrequency(final VariantContext vc) {
- if (!vc.hasAttribute(VCFConstants.ALLELE_NUMBER_KEY) || !vc.hasAttribute(VCFConstants.ALLELE_COUNT_KEY))
- throw new AssertionError(String.format(
- "Cannot compute the provided variant's alt allele frequency because it does not have both %s and %s annotations: %s",
- VCFConstants.ALLELE_NUMBER_KEY,
- VCFConstants.ALLELE_COUNT_KEY,
- vc));
- final double altAlleleCount = vc.getAttributeAsInt(VCFConstants.ALLELE_COUNT_KEY, 0);
- final double totalCount = vc.getAttributeAsInt(VCFConstants.ALLELE_NUMBER_KEY, 0);
- final double aaf = altAlleleCount / totalCount;
- if (aaf > 1 || aaf < 0)
- throw new AssertionError(String.format("Expected a minor allele frequency in the range [0, 1], but got %s. vc=%s", aaf, vc));
- return aaf;
- }
-
- /**
- * Update the attributes of the attributes map given the VariantContext to reflect the
- * proper chromosome-based VCF tags
- *
- * @param vc the VariantContext
- * @param attributes the attributes map to populate; must not be null; may contain old values
- * @param removeStaleValues should we remove stale values from the mapping?
- * @return the attributes map provided as input, returned for programming convenience
- */
- public static Map<String, Object> calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues) {
- return calculateChromosomeCounts(vc, attributes, removeStaleValues, new HashSet<String>(0));
- }
-
- /**
- * Update the attributes of the attributes map given the VariantContext to reflect the
- * proper chromosome-based VCF tags
- *
- * @param vc the VariantContext
- * @param attributes the attributes map to populate; must not be null; may contain old values
- * @param removeStaleValues should we remove stale values from the mapping?
- * @param founderIds - Set of founders Ids to take into account. AF and FC will be calculated over the founders.
- * If empty or null, counts are generated for all samples as unrelated individuals
- * @return the attributes map provided as input, returned for programming convenience
- */
- public static Map<String, Object> calculateChromosomeCounts(VariantContext vc, Map<String, Object> attributes, boolean removeStaleValues, final Set<String> founderIds) {
- final int AN = vc.getCalledChrCount();
-
- // if everyone is a no-call, remove the old attributes if requested
- if ( AN == 0 && removeStaleValues ) {
- if ( attributes.containsKey(VCFConstants.ALLELE_COUNT_KEY) )
- attributes.remove(VCFConstants.ALLELE_COUNT_KEY);
- if ( attributes.containsKey(VCFConstants.ALLELE_FREQUENCY_KEY) )
- attributes.remove(VCFConstants.ALLELE_FREQUENCY_KEY);
- if ( attributes.containsKey(VCFConstants.ALLELE_NUMBER_KEY) )
- attributes.remove(VCFConstants.ALLELE_NUMBER_KEY);
- return attributes;
- }
-
- if ( vc.hasGenotypes() ) {
- attributes.put(VCFConstants.ALLELE_NUMBER_KEY, AN);
-
- // if there are alternate alleles, record the relevant tags
- if (!vc.getAlternateAlleles().isEmpty()) {
- ArrayList<Double> alleleFreqs = new ArrayList<Double>();
- ArrayList<Integer> alleleCounts = new ArrayList<Integer>();
- ArrayList<Integer> foundersAlleleCounts = new ArrayList<Integer>();
- double totalFoundersChromosomes = (double)vc.getCalledChrCount(founderIds);
- int foundersAltChromosomes;
- for ( Allele allele : vc.getAlternateAlleles() ) {
- foundersAltChromosomes = vc.getCalledChrCount(allele,founderIds);
- alleleCounts.add(vc.getCalledChrCount(allele));
- foundersAlleleCounts.add(foundersAltChromosomes);
- if ( AN == 0 ) {
- alleleFreqs.add(0.0);
- } else {
- final Double freq = (double)foundersAltChromosomes / totalFoundersChromosomes;
- alleleFreqs.add(freq);
- }
- }
-
- attributes.put(VCFConstants.ALLELE_COUNT_KEY, alleleCounts.size() == 1 ? alleleCounts.get(0) : alleleCounts);
- attributes.put(VCFConstants.ALLELE_FREQUENCY_KEY, alleleFreqs.size() == 1 ? alleleFreqs.get(0) : alleleFreqs);
- } else {
- // if there's no alt AC and AF shouldn't be present
- attributes.remove(VCFConstants.ALLELE_COUNT_KEY);
- attributes.remove(VCFConstants.ALLELE_FREQUENCY_KEY);
- }
- }
-
- return attributes;
- }
-
- /**
- * Update the attributes of the attributes map in the VariantContextBuilder to reflect the proper
- * chromosome-based VCF tags based on the current VC produced by builder.make()
- *
- * @param builder the VariantContextBuilder we are updating
- * @param removeStaleValues should we remove stale values from the mapping?
- */
- public static void calculateChromosomeCounts(VariantContextBuilder builder, boolean removeStaleValues) {
- VariantContext vc = builder.make();
- builder.attributes(calculateChromosomeCounts(vc, new HashMap<>(vc.getAttributes()), removeStaleValues, new HashSet<>(0)));
- }
-
- /**
- * Update the attributes of the attributes map in the VariantContextBuilder to reflect the proper
- * chromosome-based VCF tags based on the current VC produced by builder.make()
- *
- * @param builder the VariantContextBuilder we are updating
- * @param founderIds - Set of founders to take into account. AF and FC will be calculated over the founders only.
- * If empty or null, counts are generated for all samples as unrelated individuals
- * @param removeStaleValues should we remove stale values from the mapping?
- */
- public static void calculateChromosomeCounts(VariantContextBuilder builder, boolean removeStaleValues, final Set<String> founderIds) {
- VariantContext vc = builder.make();
- builder.attributes(calculateChromosomeCounts(vc, new HashMap<>(vc.getAttributes()), removeStaleValues, founderIds));
- }
-
- public final static VCFCompoundHeaderLine getMetaDataForField(final VCFHeader header, final String field) {
- VCFCompoundHeaderLine metaData = header.getFormatHeaderLine(field);
- if ( metaData == null ) metaData = header.getInfoHeaderLine(field);
- if ( metaData == null ) {
- if ( ASSUME_MISSING_FIELDS_ARE_STRINGS ) {
- if ( ! MISSING_KEYS_WARNED_ABOUT.contains(field) ) {
- MISSING_KEYS_WARNED_ABOUT.add(field);
- if ( GeneralUtils.DEBUG_MODE_ENABLED )
- System.err.println("Field " + field + " missing from VCF header, assuming it is an unbounded string type");
- }
- return new VCFInfoHeaderLine(field, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Auto-generated string header for " + field);
- }
- else
- throw new TribbleException("Fully decoding VariantContext requires header line for all fields, but none was found for " + field);
- }
- return metaData;
- }
-
- /**
- * A simple but common wrapper for matching {@link VariantContext} objects using JEXL expressions
- */
- public static class JexlVCMatchExp {
- public String name;
- public Expression exp;
-
- /**
- * Create a new matcher expression with name and JEXL expression exp
- * @param name name
- * @param exp expression
- * @throws IllegalArgumentException if either argument is {@code null}
- */
- public JexlVCMatchExp(String name, Expression exp) {
- if (name == null) { throw new IllegalArgumentException("Cannot create JexlVCMatchExp with null name."); }
- if (exp == null) { throw new IllegalArgumentException("Cannot create JexlVCMatchExp with null expression."); }
-
- this.name = name;
- this.exp = exp;
- }
- }
-
- /**
- * Method for creating JexlVCMatchExp from input walker arguments names and exps. These two arrays contain
- * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
- * a list of JexlVCMatchExp, in order, that correspond to the names and exps. These are suitable input to
- * match() below.
- *
- * @param names names
- * @param exps expressions
- * @return list of matches
- */
- public static List<JexlVCMatchExp> initializeMatchExps(String[] names, String[] exps) {
- if ( names == null || exps == null )
- throw new IllegalArgumentException("BUG: neither names nor exps can be null: names " + Arrays.toString(names) + " exps=" + Arrays.toString(exps) );
-
- if ( names.length != exps.length )
- throw new IllegalArgumentException("Inconsistent number of provided filter names and expressions: names=" + Arrays.toString(names) + " exps=" + Arrays.toString(exps));
-
- Map<String, String> map = new HashMap<String, String>();
- for ( int i = 0; i < names.length; i++ ) { map.put(names[i], exps[i]); }
-
- return VariantContextUtils.initializeMatchExps(map);
- }
-
- /**
- * Method for creating JexlVCMatchExp from input walker arguments names and exps. These two lists contain
- * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
- * a list of JexlVCMatchExp, in order, that correspond to the names and exps. These are suitable input to
- * match() below.
- *
- * @param names names
- * @param exps expressions
- * @return list of matches
- */
- public static List<JexlVCMatchExp> initializeMatchExps(List<String> names, List<String> exps) {
- String[] nameArray = new String[names.size()];
- String[] expArray = new String[exps.size()];
- return initializeMatchExps(names.toArray(nameArray), exps.toArray(expArray));
- }
-
- /**
- * Method for creating JexlVCMatchExp from input walker arguments mapping from names to exps. These two arrays contain
- * the name associated with each JEXL expression. initializeMatchExps will parse each expression and return
- * a list of JexlVCMatchExp, in order, that correspond to the names and exps. These are suitable input to
- * match() below.
- *
- * @param names_and_exps mapping of names to expressions
- * @return list of matches
- */
- public static List<JexlVCMatchExp> initializeMatchExps(Map<String, String> names_and_exps) {
- List<JexlVCMatchExp> exps = new ArrayList<>();
-
- for ( Map.Entry<String, String> elt : names_and_exps.entrySet() ) {
- String name = elt.getKey();
- String expStr = elt.getValue();
-
- if ( name == null || expStr == null ) throw new IllegalArgumentException("Cannot create null expressions : " + name + " " + expStr);
- try {
- Expression exp = engine.get().createExpression(expStr);
- exps.add(new JexlVCMatchExp(name, exp));
- } catch (Exception e) {
- throw new IllegalArgumentException("Argument " + name + "has a bad value. Invalid expression used (" + expStr + "). Please see the JEXL docs for correct syntax.") ;
- }
- }
-
- return exps;
- }
-
- /**
- * Returns true if {@code exp} match {@code vc}.
- * See {@link #match(VariantContext, Collection)} for full docs.
- * @param vc variant context
- * @param exp expression
- * @return true if there is a match
- */
- public static boolean match(VariantContext vc, JexlVCMatchExp exp) {
- return match(vc, Collections.singletonList(exp)).get(exp);
- }
-
- /**
- * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc},
- * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
- * This the best way to apply JEXL expressions to {@link VariantContext} records.
- * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
- *
- * Expressions that contain literals not available in the VariantContext or Genotype will be treated as not matching
- * @param vc variant context
- * @param exps expressions
- * @return true if there is a match
- */
- public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Collection<JexlVCMatchExp> exps) {
- return new JEXLMap(exps,vc);
- }
-
- /**
- * Returns true if {@code exp} match {@code vc}, {@code g}.
- * See {@link #match(VariantContext, Genotype, Collection)} for full docs.
- * @param vc variant context
- * @param g genotype
- * @param exp expression
- * @return true if there is a match
- */
- public static boolean match(VariantContext vc, Genotype g, JexlVCMatchExp exp) {
- return match(vc, g, Collections.singletonList(exp), JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT).get(exp);
- }
-
- /**
- * Returns true if {@code exp} match {@code vc}, {@code g}.
- * See {@link #match(VariantContext, Genotype, Collection)} for full docs.
- * @param vc variant context
- * @param g genotype
- * @param exp expression
- * @param howToTreatMissingValues what to do if the jexl expression contains literals that aren't in the context
- * @return true if there is a match
- */
- public static boolean match(VariantContext vc, Genotype g, JexlVCMatchExp exp, JexlMissingValueTreatment howToTreatMissingValues) {
- return match(vc, g, Collections.singletonList(exp), howToTreatMissingValues).get(exp);
- }
-
- /**
- * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc}, {@code g},
- * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
- * This the best way to apply JEXL expressions to {@link VariantContext} records.
- * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
- *
- * Expressions that contain literals not available in the VariantContext or Genotype will be treated as not matching
- * @param vc variant context
- * @param g genotype
- * @param exps expressions
- * @return true if there is a match
- */
- public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Genotype g, Collection<JexlVCMatchExp> exps) {
- return match(vc, g, exps, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT);
- }
-
- /**
- * Matches each {@link JexlVCMatchExp} exp against the data contained in {@code vc}, {@code g},
- * and returns a map from these expressions to {@code true} (if they matched) or {@code false} (if they didn't).
- * This the best way to apply JEXL expressions to {@link VariantContext} records.
- * Use the various {@code initializeMatchExps()}'s to create the list of {@link JexlVCMatchExp} expressions.
- *
- * @param vc variant context
- * @param g genotype
- * @param exps expressions
- * @param howToTreatMissingValues what to do if the jexl expression contains literals that aren't in the context
- * @return true if there is a match
- */
- public static Map<JexlVCMatchExp, Boolean> match(VariantContext vc, Genotype g, Collection<JexlVCMatchExp> exps, JexlMissingValueTreatment howToTreatMissingValues) {
- return new JEXLMap(exps, vc, g, howToTreatMissingValues);
- }
-
- /**
- * Answers if the provided variant is transitional (otherwise, it's transversional).
- * Transitions:
- * A->G
- * G->A
- * C->T
- * T->C
- * <p/>
- * Transversions:
- * A->C
- * A->T
- * C->A
- * C->G
- * G->C
- * G->T
- * T->A
- * T->G
- *
- * @param vc a biallelic polymorphic SNP
- * @return true if a transition and false if transversion
- * @throws IllegalArgumentException if vc is monomorphic, not a SNP or not bi-allelic.
-
- */
- static public boolean isTransition(final VariantContext vc) throws IllegalArgumentException {
- final byte refAllele = vc.getReference().getBases()[0];
- final Collection<Allele> altAlleles = vc.getAlternateAlleles();
-
- if(vc.getType() == VariantContext.Type.NO_VARIATION) {
- throw new IllegalArgumentException("Variant context is monomorphic: " + vc.toString());
- }
-
- if(vc.getType() != VariantContext.Type.SNP) {
- throw new IllegalArgumentException("Variant context is not a SNP: " + vc.toString());
- }
-
- if(altAlleles.size() != 1 ) {
- throw new IllegalArgumentException("Expected exactly 1 alternative Allele. Found: " + altAlleles.size());
- }
-
- final Byte altAllele = altAlleles.iterator().next().getBases()[0];
-
- return (refAllele == 'A' && altAllele == 'G')
- || (refAllele == 'G' && altAllele == 'A')
- || (refAllele == 'C' && altAllele == 'T')
- || (refAllele == 'T' && altAllele == 'C');
- }
-
- /**
- * Returns a newly allocated VC that is the same as VC, but without genotypes
- * @param vc variant context
- * @return new VC without genotypes
- */
- public static VariantContext sitesOnlyVariantContext(VariantContext vc) {
- return new VariantContextBuilder(vc).noGenotypes().make();
- }
-
- /**
- * Returns a newly allocated list of VC, where each VC is the same as the input VCs, but without genotypes
- * @param vcs collection of VCs
- * @return new VCs without genotypes
- */
- public static Collection<VariantContext> sitesOnlyVariantContexts(Collection<VariantContext> vcs) {
- List<VariantContext> r = new ArrayList<VariantContext>();
- for ( VariantContext vc : vcs )
- r.add(sitesOnlyVariantContext(vc));
- return r;
- }
-
- public static int getSize( VariantContext vc ) {
- return vc.getEnd() - vc.getStart() + 1;
- }
-
- public static Set<String> genotypeNames(final Collection<Genotype> genotypes) {
- final Set<String> names = new HashSet<String>(genotypes.size());
- for ( final Genotype g : genotypes )
- names.add(g.getSampleName());
- return names;
- }
-
- /**
- * Compute the end position for this VariantContext from the alleles themselves
- *
- * In the trivial case this is a single BP event and end = start (open intervals)
- * In general the end is start + ref length - 1, handling the case where ref length == 0
- * However, if alleles contains a symbolic allele then we use endForSymbolicAllele in all cases
- *
- * @param alleles the list of alleles to consider. The reference allele must be the first one
- * @param start the known start position of this event
- * @param endForSymbolicAlleles the end position to use if any of the alleles is symbolic. Can be -1
- * if no is expected but will throw an error if one is found
- * @return this builder
- */
- public static int computeEndFromAlleles(final List<Allele> alleles, final int start, final int endForSymbolicAlleles) {
- final Allele ref = alleles.get(0);
-
- if ( ref.isNonReference() )
- throw new IllegalStateException("computeEndFromAlleles requires first allele to be reference");
-
- if ( VariantContext.hasSymbolicAlleles(alleles) ) {
- if ( endForSymbolicAlleles == -1 )
- throw new IllegalStateException("computeEndFromAlleles found a symbolic allele but endForSymbolicAlleles was provided");
- return endForSymbolicAlleles;
- } else {
- return start + Math.max(ref.length() - 1, 0);
- }
- }
-
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java b/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java
deleted file mode 100644
index 34cde33..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/VariantJEXLContext.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import org.apache.commons.jexl2.JexlContext;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *
- * @author aaron
- * @author depristo
- *
- * Class VariantJEXLContext
- *
- * implements the JEXL context for VariantContext; this saves us from
- * having to generate a JEXL context lookup map everytime we want to evaluate an expression.
- *
- * This is package protected, only classes in variantcontext should have access to it.
- *
- */
-
-class VariantJEXLContext implements JexlContext {
- // our stored variant context
- private VariantContext vc;
-
- static final String true_string = "1";
- static final String false_string = "0";
-
- private interface AttributeGetter {
- public Object get(VariantContext vc);
- }
-
- private static Map<String, AttributeGetter> attributes = new HashMap<String, AttributeGetter>();
-
- static {
- attributes.put("vc", (VariantContext vc) -> vc);
- attributes.put("CHROM", VariantContext::getContig);
- attributes.put("POS", VariantContext::getStart);
- attributes.put("TYPE", (VariantContext vc) -> vc.getType().toString());
- attributes.put("QUAL", (VariantContext vc) -> -10 * vc.getLog10PError());
- attributes.put("ALLELES", VariantContext::getAlleles);
- attributes.put("N_ALLELES", VariantContext::getNAlleles);
- attributes.put("FILTER", (VariantContext vc) -> vc.isFiltered() ? true_string : false_string);
-
- attributes.put("homRefCount", VariantContext::getHomRefCount);
- attributes.put("hetCount", VariantContext::getHetCount);
- attributes.put("homVarCount", VariantContext::getHomVarCount);
- }
-
- public VariantJEXLContext(VariantContext vc) {
- this.vc = vc;
- }
-
- public Object get(String name) {
- Object result = null;
- if ( attributes.containsKey(name) ) { // dynamic resolution of name -> value via map
- result = attributes.get(name).get(vc);
- } else if ( vc.hasAttribute(name)) {
- result = vc.getAttribute(name);
- } else if ( vc.getFilters().contains(name) ) {
- result = true_string;
- }
-
- return result;
- }
-
- public boolean has(String name) {
- return get(name) != null;
- }
-
- /**
- * @throws UnsupportedOperationException
- */
- public void set(String name, Object value) {
- throw new UnsupportedOperationException("remove() not supported on a VariantJEXLContext");
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java
deleted file mode 100644
index 9a3724a..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/CompoundFilter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.ArrayList;
-
-/**
- * A Predicate on VariantContexts that returns true when either all its sub-predicates are true, or none are false.
- *
- * @author Yossi Farjoun
- */
-public class CompoundFilter extends ArrayList<VariantContextFilter> implements VariantContextFilter {
-
- final boolean requireAll;
-
- /**
- * A constructor that will determine if this compound filter will require that *all* the included filters pass
- * or *some* of them pass (depending on the requireAll parameter in the constructor).
- *
- * @param requireAll a boolean parameter determining whether this filter requires all its elements to pass (true) for
- * it to pass, or only one (false). If there are no variantfilters it will return true.
- */
- public CompoundFilter(final boolean requireAll) {
- super();
- this.requireAll = requireAll;
- }
-
- /**
- * @param variantContext the record to examine against the sub-filters
- * @return true if variantContext either passes all the filters (when requireAll==true)
- * or doesn't fail any of the filters (when requireAll==false)
- */
- @Override
- public boolean test(final VariantContext variantContext) {
-
- if (requireAll) {
- for (final VariantContextFilter filter : this) {
- if (!filter.test(variantContext)) return false;
- }
-
- return true;
- } else {
- for (final VariantContextFilter filter : this) {
- if (filter.test(variantContext)) return true;
- }
-
- return isEmpty();
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java b/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java
deleted file mode 100644
index 04609a8..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringIterator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.Iterator;
-
-/**
- * A filtering iterator for VariantContexts that takes a base iterator and a VariantContextFilter.
- *
- * The iterator returns all the variantcontexts for which the filter's function "test" returns true (and only those)
- *
- * @author Yossi Farjoun
- *
- * use {@link FilteringVariantContextIterator} instead
- */
-
- at Deprecated
-public class FilteringIterator extends FilteringVariantContextIterator{
- public FilteringIterator(final Iterator<VariantContext> iterator, final VariantContextFilter filter) {
- super(iterator, filter);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java b/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java
deleted file mode 100644
index e61d9a5..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIterator.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * A filtering iterator for VariantContexts that takes a base iterator and a VariantContextFilter.
- *
- * The iterator returns all the variantcontexts for which the filter's function "test" returns true (and only those)
- *
- * @author Yossi Farjoun
- */
-public class FilteringVariantContextIterator implements CloseableIterator<VariantContext>, Iterable<VariantContext>{
- private final Iterator<VariantContext> iterator;
- private final VariantContextFilter filter;
- private VariantContext next = null;
-
- /**
- * Constructor of an iterator based on the provided iterator and predicate. The resulting
- * records will be all those VariantContexts from iterator for which filter.test( . ) is true
- *
- * @param iterator the backing iterator
- * @param filter the filter
- */
- public FilteringVariantContextIterator(final Iterator<VariantContext> iterator, final VariantContextFilter filter) {
- this.iterator = iterator;
- this.filter = filter;
- next = getNextVC();
- }
-
- @Override
- public void close() {
- CloserUtil.close(iterator);
- }
-
- /**
- * Returns true if the iteration has more elements.
- *
- * @return true if the iteration has more elements. Otherwise returns false.
- */
- @Override
- public boolean hasNext() {
- return next != null;
- }
-
- /**
- * Returns the next element in the iteration.
- *
- * @return the next element in the iteration
- * @throws NoSuchElementException if there are no more elements to return
- *
- */
- @Override
- public VariantContext next() throws NoSuchElementException {
- if (next == null) {
- throw new NoSuchElementException("Iterator has no more elements.");
- }
- final VariantContext result = next;
- next = getNextVC();
- return result;
- }
-
- /**
- * Required method for Iterator API.
- *
- * @throws UnsupportedOperationException since it is unsupported here.
- */
- @Override
- public void remove() {
- throw new UnsupportedOperationException("Remove() not supported by FilteringVariantContextIterator");
- }
-
- /**
- * Gets the next record from the underlying iterator that passes the filter
- *
- * @return VariantContext the next filter-passing record
- */
- private VariantContext getNextVC() {
-
- while (iterator.hasNext()) {
- final VariantContext record = iterator.next();
-
- if (filter.test(record)) {
- return record;
- }
- }
- return null;
- }
-
- /**
- * function to satisfy the Iterable interface
- *
- * @return itself since the class inherits from Iterator
- */
- @Override
- public Iterator<VariantContext> iterator() {
- return this;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java
deleted file mode 100644
index 862dcce..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that returns true at sites that are either unfiltered, or passing (as variants).
- *
- * @author Yossi Farjoun
- */
-public class GenotypeQualityFilter implements VariantContextFilter {
-
- final private String sample;
- final private int gqThreshold;
-
- /**
- * Constructor for a filter that will keep VC for which the
- * genotype quality (GQ) of sample passes a threshold. If sample is null, the first genotype in the
- * variant context will be used.
- *
- * @param gqThreshold the smallest value of GQ that this filter will pass
- * @param sample the name of the sample in the variant context whose genotype should be examined.
- */
- public GenotypeQualityFilter(final int gqThreshold, final String sample ) {
- this.sample = sample;
- this.gqThreshold = gqThreshold;
- }
-
- /**
- * Constructor as above that doesn't take a sample, instead it will look at the first genotype of the variant context.
- * @param gqThreshold the smallest value of GQ that this filter will pass
- */
- public GenotypeQualityFilter(final int gqThreshold) {
- this( gqThreshold, null);
- }
-
- /**
- * @return true if variantContext is to be kept, otherwise false
- * Assumes that this.sample is a sample in the variantContext, if not null,
- * otherwise looks for the first genotype (and assumes it exists).
- * @param variantContext the record to examine for GQ
- */
- @Override
- public boolean test(final VariantContext variantContext) {
- final Genotype gt = (sample == null) ? variantContext.getGenotype(0) : variantContext.getGenotype(sample);
-
- if (gt == null) {
- throw new IllegalArgumentException((sample == null) ?
- "Cannot find any genotypes in VariantContext: " + variantContext :
- "Cannot find sample requested: " + sample);
- }
-
- return gt.getGQ() >= gqThreshold;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java
deleted file mode 100644
index 0675b25..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that either returns true at heterozygous sites (invertible to false).
- * if optional "sample" argument to constructor is given, the genotype of that sample will be examined,
- * otherwise first genotype will be used.
- *
- * Missing sample, or no genotype will result in an exception being thrown.
- *
- * @author Yossi Farjoun
- */
-public class HeterozygosityFilter implements VariantContextFilter {
-
- final private String sample;
- final private boolean keepHets;
-
- /**
- * Constructor for a filter that will keep (or remove, if keepHets is false) VC for which the
- * genotype of sample is heterozygous. If sample is null, the first genotype in the
- * variant context will be used.
- *
- * @param keepHets determine whether to keep the het sites (true) or filter them out (false)
- * @param sample the name of the sample in the variant context whose genotype should be examined.
- */
- public HeterozygosityFilter(final boolean keepHets, final String sample) {
- this.keepHets = keepHets;
- this.sample = sample;
- }
-
- /**
- * Constructor as above that doesn't take a sample, instead it will look at the first genotype of the variant context.
- * @param keepHets if true, the heterozygous variant contexts will pass the filter, otherwise they will fail.
- */
- public HeterozygosityFilter(final boolean keepHets) {
- this(keepHets, null);
- }
-
- /**
- * @return true if variantContext is to be kept, otherwise false
- * Assumes that this.sample is a sample in the variantContext, if not null,
- * otherwise looks for the first genotype (and assumes it exists).
- * @param variantContext the record to examine for heterozygosity
- */
- @Override
- public boolean test(final VariantContext variantContext) {
- final Genotype gt = (sample == null) ? variantContext.getGenotype(0) : variantContext.getGenotype(sample);
-
- if (gt == null) {
- throw new IllegalArgumentException((sample == null) ?
- "Cannot find any genotypes in VariantContext: " + variantContext :
- "Cannot find sample requested: " + sample);
- }
-
- //XOR operator to reverse behaviour if keepHets is true.
- return gt.isHet() ^ !keepHets;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java
deleted file mode 100644
index bf8fa8e..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-
-import htsjdk.samtools.filter.AbstractJavascriptFilter;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * javascript based variant filter The script puts the following variables in
- * the script context:
- *
- * - 'header' a htsjdk.variant.vcf.VCFHeader
- * - 'variant' a htsjdk.variant.variantcontext.VariantContext
- *
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-public class JavascriptVariantFilter extends AbstractJavascriptFilter<VCFHeader, VariantContext>
- implements VariantContextFilter {
- /**
- * constructor using a javascript File
- *
- * @param scriptFile
- * the javascript file to be compiled
- * @param header
- * the SAMHeader
- */
- public JavascriptVariantFilter(final File scriptFile, final VCFHeader header) throws IOException {
- super(scriptFile, header);
- }
-
- /**
- * constructor using a Reader
- *
- * @param scriptReader
- * the reader for the script to be compiled. Will be closed
- * @param header
- * the SAMHeader
- */
- public JavascriptVariantFilter(final Reader scriptReader, final VCFHeader header) throws IOException {
- super(scriptReader, header);
- }
-
- /**
- * constructor using a javascript expression
- *
- * @param scriptExpression
- * the javascript expression to be compiled
- * @param header
- * the SAMHeader
- */
- public JavascriptVariantFilter(final String scriptExpression, final VCFHeader header) {
- super(scriptExpression, header);
- }
-
- /**
- * Determines whether a VariantContext matches this filter
- *
- * @param record
- * the VariantContext to evaluate
- * @return true if accept(record) returned true
- */
- @Override
- public boolean test(final VariantContext record) {
- return accept(record);
- }
-
- @Override
- public String getRecordKey() {
- return "variant";
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java
deleted file mode 100644
index f24678f..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/PassingVariantFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that returns true at sites that are either unfiltered, or passing (as variants).
- *
- * @author Yossi Farjoun
- */
-public class PassingVariantFilter implements VariantContextFilter {
-
- /**
- * @return true if variantContext is a SNP
- * @param variantContext the record to examine for being a SNP
- */
- @Override
- public boolean test(final VariantContext variantContext) {
- return variantContext.isNotFiltered();
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java
deleted file mode 100644
index 4d8b17b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/SnpFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A Predicate on VariantContexts that returns true at sites that are SNPs
- *
- * @author Yossi Farjoun
- */
-public class SnpFilter implements VariantContextFilter {
-
- /**
- * @return true if variantContext is a SNP
- * @param variantContext the record to examine for being a SNP
- */
- @Override
- public boolean test(final VariantContext variantContext) {
- return variantContext.isSNP();
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java b/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java
deleted file mode 100644
index 451dc63..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/filter/VariantContextFilter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- *
- * API for filtering VariantContexts
- *
- * @author Yossi Farjoun
- *
- */
-public interface VariantContextFilter {
- /**
- * Determines whether a VariantContext matches this filter
- *
- * @param record the VariantContext to evaluate
- * @return true if the VariantContext matches the filter, otherwise false
- */
- boolean test(VariantContext record);
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java
deleted file mode 100644
index 4604316..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/AsyncVariantContextWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.util.AbstractAsyncWriter;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * AsyncVariantContextWriter that can be wrapped around an underlying AsyncVariantContextWriter to provide asynchronous output. Records
- * added are placed into a queue, the queue is then drained into the underlying VariantContextWriter by a thread owned
- * by the instance.
- *
- * Exceptions experienced by the writer thread will be emitted back to the caller in subsequent calls to either
- * add() or close().
- *
- * @author George Grant
- */
-public class AsyncVariantContextWriter extends AbstractAsyncWriter<VariantContext> implements VariantContextWriter {
- private final VariantContextWriter underlyingWriter;
-
- /**
- * Creates a new AsyncVariantContextWriter wrapping the provided VariantContextWriter.
- */
- public AsyncVariantContextWriter(final VariantContextWriter out) {
- this(out, DEFAULT_QUEUE_SIZE);
- }
-
- /**
- * Creates an AsyncVariantContextWriter wrapping the provided VariantContextWriter and using the specified
- * queue size for buffer VariantContexts.
- */
- public AsyncVariantContextWriter(final VariantContextWriter out, final int queueSize) {
- super(queueSize);
- this.underlyingWriter = out;
- }
-
- @Override protected void synchronouslyWrite(final VariantContext item) { this.underlyingWriter.add(item); }
-
- @Override protected void synchronouslyClose() { this.underlyingWriter.close(); }
-
- @Override protected final String getThreadNamePrefix() { return "VariantContextWriterThread-"; }
-
- public void add(final VariantContext vc) {
- write(vc);
- }
-
- public void writeHeader(final VCFHeader header) {
- this.underlyingWriter.writeHeader(header);
- }
-
- @Override
- public boolean checkError() {
- return false;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java
deleted file mode 100644
index 495cd93..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Encoder.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public final class BCF2Encoder {
- // TODO -- increase default size?
- public static final int WRITE_BUFFER_INITIAL_SIZE = 16384;
- private ByteArrayOutputStream encodeStream = new ByteArrayOutputStream(WRITE_BUFFER_INITIAL_SIZE);
-
- // --------------------------------------------------------------------------------
- //
- // Functions to return the data being encoded here
- //
- // --------------------------------------------------------------------------------
-
- public byte[] getRecordBytes() {
- byte[] bytes = encodeStream.toByteArray();
- encodeStream.reset();
- return bytes;
- }
-
- // --------------------------------------------------------------------------------
- //
- // Writing typed values (have type byte)
- //
- // --------------------------------------------------------------------------------
-
- public final void encodeTypedMissing(final BCF2Type type) throws IOException {
- encodeType(0, type);
- }
-
- public final void encodeTyped(final Object value, final BCF2Type type) throws IOException {
- if ( value == null )
- encodeTypedMissing(type);
- else {
- switch ( type ) {
- case INT8:
- case INT16:
- case INT32: encodeTypedInt((Integer)value, type); break;
- case FLOAT: encodeTypedFloat((Double) value); break;
- case CHAR: encodeTypedString((String) value); break;
- default: throw new IllegalArgumentException("Illegal type encountered " + type);
- }
- }
- }
-
- public final void encodeTypedInt(final int v) throws IOException {
- final BCF2Type type = BCF2Utils.determineIntegerType(v);
- encodeTypedInt(v, type);
- }
-
- public final void encodeTypedInt(final int v, final BCF2Type type) throws IOException {
- encodeType(1, type);
- encodeRawInt(v, type);
- }
-
- public final void encodeTypedString(final String s) throws IOException {
- encodeTypedString(s.getBytes());
- }
-
- public final void encodeTypedString(final byte[] s) throws IOException {
- if ( s == null )
- encodeType(0, BCF2Type.CHAR);
- else {
- encodeType(s.length, BCF2Type.CHAR);
- for ( int i = 0; i < s.length; i++ ) {
- encodeRawChar(s[i]);
- }
- }
- }
-
- public final void encodeTypedFloat(final double d) throws IOException {
- encodeType(1, BCF2Type.FLOAT);
- encodeRawFloat(d);
- }
-
- public final void encodeTyped(List<? extends Object> v, final BCF2Type type) throws IOException {
- if ( type == BCF2Type.CHAR && !v.isEmpty()) {
- final String s = BCF2Utils.collapseStringList((List<String>) v);
- v = stringToBytes(s);
- }
-
- encodeType(v.size(), type);
- encodeRawValues(v, type);
- }
-
- // --------------------------------------------------------------------------------
- //
- // Writing raw values (don't have a type byte)
- //
- // --------------------------------------------------------------------------------
-
- public final <T extends Object> void encodeRawValues(final Collection<T> v, final BCF2Type type) throws IOException {
- for ( final T v1 : v ) {
- encodeRawValue(v1, type);
- }
- }
-
- public final <T extends Object> void encodeRawValue(final T value, final BCF2Type type) throws IOException {
- try {
- if ( value == type.getMissingJavaValue() )
- encodeRawMissingValue(type);
- else {
- switch (type) {
- case INT8:
- case INT16:
- case INT32: encodeRawBytes((Integer) value, type); break;
- case FLOAT: encodeRawFloat((Double) value); break;
- case CHAR: encodeRawChar((Byte) value); break;
- default: throw new IllegalArgumentException("Illegal type encountered " + type);
- }
- }
- } catch ( ClassCastException e ) {
- throw new ClassCastException("BUG: invalid type cast to " + type + " from " + value);
- }
- }
-
- public final void encodeRawMissingValue(final BCF2Type type) throws IOException {
- encodeRawBytes(type.getMissingBytes(), type);
- }
-
- public final void encodeRawMissingValues(final int size, final BCF2Type type) throws IOException {
- for ( int i = 0; i < size; i++ )
- encodeRawMissingValue(type);
- }
-
- // --------------------------------------------------------------------------------
- //
- // low-level encoders
- //
- // --------------------------------------------------------------------------------
-
- public final void encodeRawChar(final byte c) throws IOException {
- encodeStream.write(c);
- }
-
- public final void encodeRawFloat(final double value) throws IOException {
- encodeRawBytes(Float.floatToIntBits((float) value), BCF2Type.FLOAT);
- }
-
- public final void encodeType(final int size, final BCF2Type type) throws IOException {
- if ( size <= BCF2Utils.MAX_INLINE_ELEMENTS ) {
- final int typeByte = BCF2Utils.encodeTypeDescriptor(size, type);
- encodeStream.write(typeByte);
- } else {
- final int typeByte = BCF2Utils.encodeTypeDescriptor(BCF2Utils.OVERFLOW_ELEMENT_MARKER, type);
- encodeStream.write(typeByte);
- // write in the overflow size
- encodeTypedInt(size);
- }
- }
-
- public final void encodeRawInt(final int value, final BCF2Type type) throws IOException {
- type.write(value, encodeStream);
- }
-
- public final void encodeRawBytes(final int value, final BCF2Type type) throws IOException {
- type.write(value, encodeStream);
- }
-
- // --------------------------------------------------------------------------------
- //
- // utility functions
- //
- // --------------------------------------------------------------------------------
-
- public void encodeRawString(final String s, final int sizeToWrite) throws IOException {
- final byte[] bytes = s.getBytes();
- for ( int i = 0; i < sizeToWrite; i++ )
- if ( i < bytes.length )
- encodeRawChar(bytes[i]);
- else
- encodeRawMissingValue(BCF2Type.CHAR);
- }
-
- /**
- * Totally generic encoder that examines o, determines the best way to encode it, and encodes it
- *
- * This method is incredibly slow, but it's only used for UnitTests so it doesn't matter
- *
- * @param o
- * @return
- */
- public final BCF2Type encode(final Object o) throws IOException {
- if ( o == null ) throw new IllegalArgumentException("Generic encode cannot deal with null values");
-
- if ( o instanceof List ) {
- final BCF2Type type = determineBCFType(((List) o).get(0));
- encodeTyped((List) o, type);
- return type;
- } else {
- final BCF2Type type = determineBCFType(o);
- encodeTyped(o, type);
- return type;
- }
- }
-
- private final BCF2Type determineBCFType(final Object arg) {
- final Object toType = arg instanceof List ? ((List)arg).get(0) : arg;
-
- if ( toType instanceof Integer )
- return BCF2Utils.determineIntegerType((Integer) toType);
- else if ( toType instanceof String )
- return BCF2Type.CHAR;
- else if ( toType instanceof Double )
- return BCF2Type.FLOAT;
- else
- throw new IllegalArgumentException("No native encoding for Object of type " + arg.getClass().getSimpleName());
- }
-
- private final List<Byte> stringToBytes(final String v) throws IOException {
- if ( v == null || v.equals("") )
- return Collections.emptyList();
- else {
- // TODO -- this needs to be optimized away for efficiency
- final byte[] bytes = v.getBytes();
- final List<Byte> l = new ArrayList<Byte>(bytes.length);
- for ( int i = 0; i < bytes.length; i++) l.add(bytes[i]);
- return l;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java
deleted file mode 100644
index 7d1f0de..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldEncoder.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public abstract class BCF2FieldEncoder {
- /**
- * The header line describing the field we will encode values of
- */
- final VCFCompoundHeaderLine headerLine;
-
- /**
- * The BCF2 type we'll use to encoder this field, if it can be determined statically.
- * If not, this variable must be null
- */
- final BCF2Type staticType;
-
- /**
- * The integer offset into the strings map of the BCF2 file corresponding to this
- * field.
- */
- final int dictionaryOffset;
-
- /**
- * The integer type we use to encode our dictionary offset in the BCF2 file
- */
- final BCF2Type dictionaryOffsetType;
-
- // ----------------------------------------------------------------------
- //
- // Constructor
- //
- // ----------------------------------------------------------------------
-
- private BCF2FieldEncoder(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict, final BCF2Type staticType) {
- this.headerLine = headerLine;
- this.staticType = staticType;
-
- final Integer offset = dict.get(getField());
- if ( offset == null ) throw new IllegalStateException("Format error: could not find string " + getField() + " in header as required by BCF");
- this.dictionaryOffset = offset;
- dictionaryOffsetType = BCF2Utils.determineIntegerType(offset);
- }
-
- // ----------------------------------------------------------------------
- //
- // Basic accessors
- //
- // ----------------------------------------------------------------------
-
- public final String getField() { return headerLine.getID(); }
-
- /**
- * Write the field key (dictionary offset and type) into the BCF2Encoder stream
- *
- * @param encoder where we write our dictionary offset
- * @throws IOException
- */
- public final void writeFieldKey(final BCF2Encoder encoder) throws IOException {
- encoder.encodeTypedInt(dictionaryOffset, dictionaryOffsetType);
- }
-
- @Override
- public String toString() {
- return "BCF2FieldEncoder for " + getField() + " with count " + getCountType() + " encoded with " + getClass().getSimpleName();
- }
-
- // ----------------------------------------------------------------------
- //
- // methods to determine the number of encoded elements
- //
- // ----------------------------------------------------------------------
-
- protected final VCFHeaderLineCount getCountType() {
- return headerLine.getCountType();
- }
-
- /**
- * @return True if this field has a constant, fixed number of elements (such as 1 for an atomic integer)
- */
- public boolean hasConstantNumElements() {
- return getCountType() == VCFHeaderLineCount.INTEGER;
- }
-
- /**
- * @return True if the only way to determine how many elements this field contains is by
- * inspecting the actual value directly, such as when the number of elements
- * is a variable length list per site or per genotype.
- */
- public boolean hasValueDeterminedNumElements() {
- return getCountType() == VCFHeaderLineCount.UNBOUNDED;
- }
-
- /**
- * @return True if this field has a non-fixed number of elements that depends only on the properties
- * of the current VariantContext, such as one value per Allele or per genotype configuration.
- */
- public boolean hasContextDeterminedNumElements() {
- return ! hasConstantNumElements() && ! hasValueDeterminedNumElements();
- }
-
- /**
- * @return the number of elements, assuming this field has a constant number of elements.
- */
- public int numElements() {
- return headerLine.getCount();
- }
-
- /**
- * @return the number of elements by looking at the actual value provided
- */
- public int numElements(final Object value) {
- return numElementsFromValue(value);
- }
-
- /**
- * @return the number of elements, assuming this field has context-determined number of elements.
- */
- public int numElements(final VariantContext vc) {
- return headerLine.getCount(vc);
- }
-
- /**
- * A convenience access for the number of elements.
- * @param vc
- * @param value
- * @return the number of encoded elements, either from the fixed number
- * it has, from the VC, or from the value itself.
- */
- public final int numElements(final VariantContext vc, final Object value) {
- if ( hasConstantNumElements() ) return numElements();
- else if ( hasContextDeterminedNumElements() ) return numElements(vc);
- else return numElements(value);
- }
-
- /**
- * Given a value, return the number of elements we will encode for it.
- *
- * Assumes the value is encoded as a List
- *
- * @param value
- * @return the number of elements we will encode for {@param value}.
- */
- protected int numElementsFromValue(final Object value) {
- if ( value == null ) return 0;
- else if ( value instanceof List ) return ((List) value).size();
- else return 1;
- }
-
- // ----------------------------------------------------------------------
- //
- // methods to determine the BCF2 type of the encoded values
- //
- // ----------------------------------------------------------------------
-
- /**
- * Is the BCF2 type of this field static, or does it have to be determine from
- * the actual field value itself?
- * @return true if the field is static
- */
- public final boolean isStaticallyTyped() { return ! isDynamicallyTyped(); }
-
- /**
- * Is the BCF2 type of this field static, or does it have to be determine from
- * the actual field value itself?
- * @return true if the field is not static
- */
- public final boolean isDynamicallyTyped() { return staticType == null; }
-
- /**
- * Get the BCF2 type for this field, either from the static type of the
- * field itself or by inspecting the value itself.
- *
- * @return the BCF2 type for this field
- */
- public final BCF2Type getType(final Object value) {
- return isDynamicallyTyped() ? getDynamicType(value) : getStaticType();
- }
-
- public final BCF2Type getStaticType() {
- return staticType;
- }
-
- public BCF2Type getDynamicType(final Object value) {
- throw new IllegalStateException("BUG: cannot get dynamic type for statically typed BCF2 field " + getField());
- }
-
- // ----------------------------------------------------------------------
- //
- // methods to encode values, including the key abstract method
- //
- // ----------------------------------------------------------------------
-
- /**
- * Key abstract method that should encode a value of the given type into the encoder.
- *
- * Value will be of a type appropriate to the underlying encoder. If the genotype field is represented as
- * an int[], this will be value, and the encoder needs to handle encoding all of the values in the int[].
- *
- * The argument should be used, not the getType() method in the superclass as an outer loop might have
- * decided a more general type (int16) to use, even through this encoder could have been done with int8.
- *
- * If minValues > 0, then encodeValue must write in at least minValues items from value. If value is atomic,
- * this means that minValues - 1 MISSING values should be added to the encoder. If minValues is a collection
- * type (int[]) then minValues - values.length should be added. This argument is intended to handle padding
- * of values in genotype fields.
- *
- * @param encoder
- * @param value
- * @param type
- * @param minValues
- * @throws IOException
- */
- public abstract void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException;
-
- // ----------------------------------------------------------------------
- //
- // Subclass to encode Strings
- //
- // ----------------------------------------------------------------------
-
- public static class StringOrCharacter extends BCF2FieldEncoder {
- public StringOrCharacter(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, BCF2Type.CHAR);
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- final String s = javaStringToBCF2String(value);
- encoder.encodeRawString(s, Math.max(s.length(), minValues));
- }
-
- //
- // Regardless of what the header says, BCF2 strings and characters are always encoded
- // as arrays of CHAR type, which has a variable number of elements depending on the
- // exact string being encoded
- //
- @Override public boolean hasConstantNumElements() { return false; }
- @Override public boolean hasContextDeterminedNumElements() { return false; }
- @Override public boolean hasValueDeterminedNumElements() { return true; }
- @Override protected int numElementsFromValue(final Object value) {
- return value == null ? 0 : javaStringToBCF2String(value).length();
- }
-
- /**
- * Recode the incoming object to a String, compacting it into a
- * BCF2 string if the value is a list.
- *
- * @param value a String or List<String> to encode, or null
- * @return a non-null string to encode
- */
- private String javaStringToBCF2String(final Object value) {
- if ( value == null )
- return "";
- else if (value instanceof List) {
- final List<String> l = (List<String>)value;
- return BCF2Utils.collapseStringList(l);
- } else if ( value.getClass().isArray() ) {
- final List<String> l = new ArrayList<String>();
- Collections.addAll(l, (String[])value);
- return BCF2Utils.collapseStringList(l);
- } else
- return (String)value;
- }
- }
-
- // ----------------------------------------------------------------------
- //
- // Subclass to encode FLAG
- //
- // ----------------------------------------------------------------------
-
- public static class Flag extends BCF2FieldEncoder {
- public Flag(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, BCF2Type.INT8);
- if ( ! headerLine.isFixedCount() || headerLine.getCount() != 0 )
- throw new IllegalStateException("Flag encoder only supports atomic flags for field " + getField());
- }
-
- @Override
- public int numElements() {
- return 1; // the header says 0 but we will write 1 value
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- encoder.encodeRawBytes(1, getStaticType());
- }
- }
-
- // ----------------------------------------------------------------------
- //
- // Subclass to encode FLOAT
- //
- // ----------------------------------------------------------------------
-
- public static class Float extends BCF2FieldEncoder {
- final boolean isAtomic;
-
- public Float(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, BCF2Type.FLOAT);
- isAtomic = hasConstantNumElements() && numElements() == 1;
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- int count = 0;
- // TODO -- can be restructured to avoid toList operation
- if ( isAtomic ) {
- // fast path for fields with 1 fixed float value
- if ( value != null ) {
- encoder.encodeRawFloat((Double)value);
- count++;
- }
- } else {
- // handle generic case
- final List<Double> doubles = BCF2Utils.toList(Double.class, value);
- for ( final Double d : doubles ) {
- if ( d != null ) { // necessary because .,. => [null, null] in VC
- encoder.encodeRawFloat(d);
- count++;
- }
- }
- }
- for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
- }
- }
-
- // ----------------------------------------------------------------------
- //
- // Subclass to encode int[]
- //
- // ----------------------------------------------------------------------
-
- public static class IntArray extends BCF2FieldEncoder {
- public IntArray(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, null);
- }
-
- @Override
- protected int numElementsFromValue(final Object value) {
- return value == null ? 0 : ((int[])value).length;
- }
-
- @Override
- public BCF2Type getDynamicType(final Object value) {
- return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType((int[])value);
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- int count = 0;
- if ( value != null ) {
- for ( final int i : (int[])value ) {
- encoder.encodeRawInt(i, type);
- count++;
- }
- }
- for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
- }
- }
-
- // ----------------------------------------------------------------------
- //
- // Subclass to encode List<Integer>
- //
- // ----------------------------------------------------------------------
-
- /**
- * Specialized int encoder for atomic (non-list) integers
- */
- public static class AtomicInt extends BCF2FieldEncoder {
- public AtomicInt(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, null);
- }
-
- @Override
- public BCF2Type getDynamicType(final Object value) {
- return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType((Integer)value);
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- int count = 0;
- if ( value != null ) {
- encoder.encodeRawInt((Integer)value, type);
- count++;
- }
- for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
- }
- }
-
- public static class GenericInts extends BCF2FieldEncoder {
- public GenericInts(final VCFCompoundHeaderLine headerLine, final Map<String, Integer> dict ) {
- super(headerLine, dict, null);
- }
-
- @Override
- public BCF2Type getDynamicType(final Object value) {
- return value == null ? BCF2Type.INT8 : BCF2Utils.determineIntegerType(BCF2Utils.toList(Integer.class, value));
- }
-
- @Override
- public void encodeValue(final BCF2Encoder encoder, final Object value, final BCF2Type type, final int minValues) throws IOException {
- int count = 0;
- for ( final Integer i : BCF2Utils.toList(Integer.class, value) ) {
- if ( i != null ) { // necessary because .,. => [null, null] in VC
- encoder.encodeRawInt(i, type);
- count++;
- }
- }
- for ( ; count < minValues; count++ ) encoder.encodeRawMissingValue(type);
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java
deleted file mode 100644
index f9dd458..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriter.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public abstract class BCF2FieldWriter {
- private final VCFHeader header;
- private final BCF2FieldEncoder fieldEncoder;
-
- protected BCF2FieldWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- this.header = header;
- this.fieldEncoder = fieldEncoder;
- }
-
- protected VCFHeader getHeader() { return header; }
- protected BCF2FieldEncoder getFieldEncoder() {
- return fieldEncoder;
- }
- protected String getField() { return getFieldEncoder().getField(); }
-
- public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- fieldEncoder.writeFieldKey(encoder);
- }
-
- public void done(final BCF2Encoder encoder, final VariantContext vc) throws IOException { } // TODO -- overload done so that we null out values and test for correctness
-
- @Override
- public String toString() {
- return "BCF2FieldWriter " + getClass().getSimpleName() + " with encoder " + getFieldEncoder();
- }
-
- // --------------------------------------------------------------------------------
- //
- // Sites writers
- //
- // --------------------------------------------------------------------------------
-
- public static abstract class SiteWriter extends BCF2FieldWriter {
- protected SiteWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- }
-
- public abstract void site(final BCF2Encoder encoder, final VariantContext vc) throws IOException;
- }
-
- public static class GenericSiteWriter extends SiteWriter {
- public GenericSiteWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- }
-
- @Override
- public void site(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- final Object rawValue = vc.getAttribute(getField(), null);
- final BCF2Type type = getFieldEncoder().getType(rawValue);
- if ( rawValue == null ) {
- // the value is missing, just write in null
- encoder.encodeType(0, type);
- } else {
- final int valueCount = getFieldEncoder().numElements(vc, rawValue);
- encoder.encodeType(valueCount, type);
- getFieldEncoder().encodeValue(encoder, rawValue, type, valueCount);
- }
- }
- }
-
- // --------------------------------------------------------------------------------
- //
- // Genotypes writers
- //
- // --------------------------------------------------------------------------------
-
- public static abstract class GenotypesWriter extends BCF2FieldWriter {
- int nValuesPerGenotype = -1;
- BCF2Type encodingType = null;
-
- protected GenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
-
- if ( fieldEncoder.hasConstantNumElements() ) {
- nValuesPerGenotype = getFieldEncoder().numElements();
- }
- }
-
- @Override
- public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- // writes the key information
- super.start(encoder, vc);
-
- // only update if we need to
- if ( ! getFieldEncoder().hasConstantNumElements() ) {
- if ( getFieldEncoder().hasContextDeterminedNumElements() )
- // we are cheap -- just depends on genotype of allele counts
- nValuesPerGenotype = getFieldEncoder().numElements(vc);
- else
- // we have to go fishing through the values themselves (expensive)
- nValuesPerGenotype = computeMaxSizeOfGenotypeFieldFromValues(vc);
- }
-
- encoder.encodeType(nValuesPerGenotype, encodingType);
- }
-
- public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
- final Object fieldValue = g.getExtendedAttribute(getField(), null);
- getFieldEncoder().encodeValue(encoder, fieldValue, encodingType, nValuesPerGenotype);
- }
-
- protected int numElements(final VariantContext vc, final Genotype g) {
- return getFieldEncoder().numElements(vc, g.getExtendedAttribute(getField()));
- }
-
- private final int computeMaxSizeOfGenotypeFieldFromValues(final VariantContext vc) {
- int size = -1;
-
- for ( final Genotype g : vc.getGenotypes() ) {
- size = Math.max(size, numElements(vc, g));
- }
-
- return size;
- }
- }
-
- public static class StaticallyTypeGenotypesWriter extends GenotypesWriter {
- public StaticallyTypeGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- encodingType = getFieldEncoder().getStaticType();
- }
- }
-
- public static class IntegerTypeGenotypesWriter extends GenotypesWriter {
- public IntegerTypeGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- }
-
- @Override
- public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- // the only value that is dynamic are integers
- final List<Integer> values = new ArrayList<Integer>(vc.getNSamples());
- for ( final Genotype g : vc.getGenotypes() ) {
- for ( final Integer i : BCF2Utils.toList(Integer.class, g.getExtendedAttribute(getField(), null)) ) {
- if ( i != null ) values.add(i);
- }
- }
-
- encodingType = BCF2Utils.determineIntegerType(values);
- super.start(encoder, vc);
- }
- }
-
- public static class IGFGenotypesWriter extends GenotypesWriter {
- final IntGenotypeFieldAccessors.Accessor ige;
-
- public IGFGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder, final IntGenotypeFieldAccessors.Accessor ige) {
- super(header, fieldEncoder);
- this.ige = ige;
-
- if ( ! (fieldEncoder instanceof BCF2FieldEncoder.IntArray) )
- throw new IllegalArgumentException("BUG: IntGenotypesWriter requires IntArray encoder for field " + getField());
- }
-
- @Override
- public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- // TODO
- // TODO this piece of code consumes like 10% of the runtime alone because fo the vc.getGenotypes() iteration
- // TODO
- encodingType = BCF2Type.INT8;
- for ( final Genotype g : vc.getGenotypes() ) {
- final int[] pls = ige.getValues(g);
- final BCF2Type plsType = getFieldEncoder().getType(pls);
- encodingType = BCF2Utils.maxIntegerType(encodingType, plsType);
- if ( encodingType == BCF2Type.INT32 )
- break; // stop early
- }
-
- super.start(encoder, vc);
- }
-
- @Override
- public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
- getFieldEncoder().encodeValue(encoder, ige.getValues(g), encodingType, nValuesPerGenotype);
- }
-
- @Override
- protected int numElements(final VariantContext vc, final Genotype g) {
- return ige.getSize(g);
- }
- }
-
- public static class FTGenotypesWriter extends StaticallyTypeGenotypesWriter {
- public FTGenotypesWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- }
-
- public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
- final String fieldValue = g.getFilters();
- getFieldEncoder().encodeValue(encoder, fieldValue, encodingType, nValuesPerGenotype);
- }
-
- @Override
- protected int numElements(final VariantContext vc, final Genotype g) {
- return getFieldEncoder().numElements(vc, g.getFilters());
- }
- }
-
- public static class GTWriter extends GenotypesWriter {
- final Map<Allele, Integer> alleleMapForTriPlus = new HashMap<Allele, Integer>(5);
- Allele ref, alt1;
-
- public GTWriter(final VCFHeader header, final BCF2FieldEncoder fieldEncoder) {
- super(header, fieldEncoder);
- }
-
- @Override
- public void start(final BCF2Encoder encoder, final VariantContext vc) throws IOException {
- if ( vc.getNAlleles() > BCF2Utils.MAX_ALLELES_IN_GENOTYPES )
- throw new IllegalStateException("Current BCF2 encoder cannot handle sites " +
- "with > " + BCF2Utils.MAX_ALLELES_IN_GENOTYPES + " alleles, but you have "
- + vc.getNAlleles() + " at " + vc.getContig() + ":" + vc.getStart());
-
- encodingType = BCF2Type.INT8;
- buildAlleleMap(vc);
- nValuesPerGenotype = vc.getMaxPloidy(2);
-
- super.start(encoder, vc);
- }
-
- @Override
- public void addGenotype(final BCF2Encoder encoder, final VariantContext vc, final Genotype g) throws IOException {
- final int samplePloidy = g.getPloidy();
- for ( int i = 0; i < nValuesPerGenotype; i++ ) {
- if ( i < samplePloidy ) {
- // we encode the actual allele
- final Allele a = g.getAllele(i);
- final int offset = getAlleleOffset(a);
- final int encoded = ((offset+1) << 1) | (g.isPhased() ? 0x01 : 0x00);
- encoder.encodeRawBytes(encoded, encodingType);
- } else {
- // we need to pad with missing as we have ploidy < max for this sample
- encoder.encodeRawBytes(encodingType.getMissingBytes(), encodingType);
- }
- }
- }
-
- /**
- * Fast path code to determine the offset.
- *
- * Inline tests for == against ref (most common, first test)
- * == alt1 (second most common, second test)
- * == NO_CALL (third)
- * and finally in the map from allele => offset for all alt 2+ alleles
- *
- * @param a the allele whose offset we wish to determine
- * @return the offset (from 0) of the allele in the list of variant context alleles (-1 means NO_CALL)
- */
- private final int getAlleleOffset(final Allele a) {
- if ( a == ref ) return 0;
- else if ( a == alt1 ) return 1;
- else if ( a == Allele.NO_CALL ) return -1;
- else {
- final Integer o = alleleMapForTriPlus.get(a);
- if ( o == null ) throw new IllegalStateException("BUG: Couldn't find allele offset for allele " + a);
- return o;
- }
- }
-
- private final void buildAlleleMap(final VariantContext vc) {
- // these are fast path options to determine the offsets for
- final int nAlleles = vc.getNAlleles();
- ref = vc.getReference();
- alt1 = nAlleles > 1 ? vc.getAlternateAllele(0) : null;
-
- if ( nAlleles > 2 ) {
- // for multi-allelics we need to clear the map, and add additional looks
- alleleMapForTriPlus.clear();
- final List<Allele> alleles = vc.getAlleles();
- for ( int i = 2; i < alleles.size(); i++ ) {
- alleleMapForTriPlus.put(alleles.get(i), i);
- }
- }
- }
- }
-}
-
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java
deleted file mode 100644
index 20f9ce6..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2FieldWriterManager.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFCompoundHeaderLine;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * See #BCFWriter for documentation on this classes role in encoding BCF2 files
- *
- * @author Mark DePristo
- * @since 06/12
- */
-public class BCF2FieldWriterManager {
- final Map<String, BCF2FieldWriter.SiteWriter> siteWriters = new HashMap<String, BCF2FieldWriter.SiteWriter>();
- final Map<String, BCF2FieldWriter.GenotypesWriter> genotypesWriters = new HashMap<String, BCF2FieldWriter.GenotypesWriter>();
- final IntGenotypeFieldAccessors intGenotypeFieldAccessors = new IntGenotypeFieldAccessors();
-
- public BCF2FieldWriterManager() { }
-
- /**
- * Setup the FieldWriters appropriate to each INFO and FORMAT in the VCF header
- *
- * Must be called before any of the getter methods will work
- *
- * @param header a VCFHeader containing description for every INFO and FORMAT field we'll attempt to write out to BCF
- * @param encoder the encoder we are going to use to write out the BCF2 data
- * @param stringDictionary a map from VCFHeader strings to their offsets for encoding
- */
- public void setup(final VCFHeader header, final BCF2Encoder encoder, final Map<String, Integer> stringDictionary) {
- for (final VCFInfoHeaderLine line : header.getInfoHeaderLines()) {
- final String field = line.getID();
- final BCF2FieldWriter.SiteWriter writer = createInfoWriter(header, line, encoder, stringDictionary);
- add(siteWriters, field, writer);
- }
-
- for (final VCFFormatHeaderLine line : header.getFormatHeaderLines()) {
- final String field = line.getID();
- final BCF2FieldWriter.GenotypesWriter writer = createGenotypesWriter(header, line, encoder, stringDictionary);
- add(genotypesWriters, field, writer);
- }
- }
-
- private final <T> void add(final Map<String, T> map, final String field, final T writer) {
- if ( map.containsKey(field) )
- throw new IllegalStateException("BUG: field " + field + " already seen in VCFHeader while building BCF2 field encoders");
- map.put(field, writer);
- }
-
- // -----------------------------------------------------------------
- //
- // Master routine to look at the header, a specific line, and
- // build an appropriate SiteWriter for that header element
- //
- // -----------------------------------------------------------------
-
- private BCF2FieldWriter.SiteWriter createInfoWriter(final VCFHeader header,
- final VCFInfoHeaderLine line,
- final BCF2Encoder encoder,
- final Map<String, Integer> dict) {
- return new BCF2FieldWriter.GenericSiteWriter(header, createFieldEncoder(line, encoder, dict, false));
- }
-
- private BCF2FieldEncoder createFieldEncoder(final VCFCompoundHeaderLine line,
- final BCF2Encoder encoder,
- final Map<String, Integer> dict,
- final boolean createGenotypesEncoders ) {
-
- if ( createGenotypesEncoders && intGenotypeFieldAccessors.getAccessor(line.getID()) != null ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED && line.getType() != VCFHeaderLineType.Integer )
- System.err.println("Warning: field " + line.getID() + " expected to encode an integer but saw " + line.getType() + " for record " + line);
- return new BCF2FieldEncoder.IntArray(line, dict);
- } else if ( createGenotypesEncoders && line.getID().equals(VCFConstants.GENOTYPE_KEY) ) {
- return new BCF2FieldEncoder.GenericInts(line, dict);
- } else {
- switch ( line.getType() ) {
- case Character:
- case String:
- return new BCF2FieldEncoder.StringOrCharacter(line, dict);
- case Flag:
- return new BCF2FieldEncoder.Flag(line, dict);
- case Float:
- return new BCF2FieldEncoder.Float(line, dict);
- case Integer:
- if ( line.isFixedCount() && line.getCount() == 1 )
- return new BCF2FieldEncoder.AtomicInt(line, dict);
- else
- return new BCF2FieldEncoder.GenericInts(line, dict);
- default:
- throw new IllegalArgumentException("Unexpected type for field " + line.getID());
- }
- }
- }
-
- // -----------------------------------------------------------------
- //
- // Master routine to look at the header, a specific line, and
- // build an appropriate Genotypes for that header element
- //
- // -----------------------------------------------------------------
-
- private BCF2FieldWriter.GenotypesWriter createGenotypesWriter(final VCFHeader header,
- final VCFFormatHeaderLine line,
- final BCF2Encoder encoder,
- final Map<String, Integer> dict) {
- final String field = line.getID();
- final BCF2FieldEncoder fieldEncoder = createFieldEncoder(line, encoder, dict, true);
-
- if ( field.equals(VCFConstants.GENOTYPE_KEY) ) {
- return new BCF2FieldWriter.GTWriter(header, fieldEncoder);
- } else if ( line.getID().equals(VCFConstants.GENOTYPE_FILTER_KEY) ) {
- return new BCF2FieldWriter.FTGenotypesWriter(header, fieldEncoder);
- } else if ( intGenotypeFieldAccessors.getAccessor(field) != null ) {
- return new BCF2FieldWriter.IGFGenotypesWriter(header, fieldEncoder, intGenotypeFieldAccessors.getAccessor(field));
- } else if ( line.getType() == VCFHeaderLineType.Integer ) {
- return new BCF2FieldWriter.IntegerTypeGenotypesWriter(header, fieldEncoder);
- } else {
- return new BCF2FieldWriter.StaticallyTypeGenotypesWriter(header, fieldEncoder);
- }
- }
-
- // -----------------------------------------------------------------
- //
- // Accessors to get site / genotype writers
- //
- // -----------------------------------------------------------------
-
- /**
- * Get a site writer specialized to encode values for site info field
- * @param field key found in the VCF header INFO records
- * @return non-null writer if one can be found, or null if none exists for field
- */
- public BCF2FieldWriter.SiteWriter getSiteFieldWriter(final String field) {
- return getWriter(field, siteWriters);
- }
-
- /**
- * Get a genotypes writer specialized to encode values for genotypes field
- * @param field key found in the VCF header FORMAT records
- * @return non-null writer if one can be found, or null if none exists for field
- */
- public BCF2FieldWriter.GenotypesWriter getGenotypeFieldWriter(final String field) {
- return getWriter(field, genotypesWriters);
- }
-
- public <T> T getWriter(final String key, final Map<String, T> map) {
- return map.get(key);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java b/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java
deleted file mode 100644
index 8c16aac..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/BCF2Writer.java
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.bcf2.BCF2Type;
-import htsjdk.variant.bcf2.BCF2Utils;
-import htsjdk.variant.bcf2.BCFVersion;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFUtils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * VariantContextWriter that emits BCF2 binary encoding
- *
- * Overall structure of this writer is complex for efficiency reasons
- *
- * -- The BCF2Writer manages the low-level BCF2 encoder, the mappings
- * from contigs and strings to offsets, the VCF header, and holds the
- * lower-level encoders that map from VC and Genotype fields to their
- * specific encoders. This class also writes out the standard BCF2 fields
- * like POS, contig, the size of info and genotype data, QUAL, etc. It
- * has loops over the INFO and GENOTYPES to encode each individual datum
- * with the generic field encoders, but the actual encoding work is
- * done with by the FieldWriters classes themselves
- *
- * -- BCF2FieldWriter are specialized classes for writing out SITE and
- * genotype information for specific SITE/GENOTYPE fields (like AC for
- * sites and GQ for genotypes). These are objects in themselves because
- * the manage all of the complexity of relating the types in the VCF header
- * with the proper encoding in BCF as well as the type representing this
- * in java. Relating all three of these pieces of information together
- * is the main complexity challenge in the encoder. The piece of code
- * that determines which FieldWriters to associate with each SITE and
- * GENOTYPE field is the BCF2FieldWriterManager. These FieldWriters
- * are specialized for specific combinations of encoders (see below)
- * and contexts (genotypes) for efficiency, so they smartly manage
- * the writing of PLs (encoded as int[]) directly into the lowest
- * level BCFEncoder.
- *
- * -- At the third level is the BCF2FieldEncoder, relatively simple
- * pieces of code that handle the task of determining the right
- * BCF2 type for specific field values, as well as reporting back
- * information such as the number of elements used to encode it
- * (simple for atomic values like Integer but complex for PLs
- * or lists of strings)
- *
- * -- At the lowest level is the BCF2Encoder itself. This provides
- * just the limited encoding methods specified by the BCF2 specification. This encoder
- * doesn't do anything but make it possible to conveniently write out valid low-level
- * BCF2 constructs.
- *
- * @author Mark DePristo
- * @since 06/12
- */
-class BCF2Writer extends IndexingVariantContextWriter {
- public static final int MAJOR_VERSION = 2;
- public static final int MINOR_VERSION = 1;
-
- final private static boolean ALLOW_MISSING_CONTIG_LINES = false;
-
- private final OutputStream outputStream; // Note: do not flush until completely done writing, to avoid issues with eventual BGZF support
- private VCFHeader header;
- private final Map<String, Integer> contigDictionary = new HashMap<String, Integer>();
- private final Map<String, Integer> stringDictionaryMap = new LinkedHashMap<String, Integer>();
- private final boolean doNotWriteGenotypes;
- private String[] sampleNames = null;
-
- private final BCF2Encoder encoder = new BCF2Encoder(); // initialized after the header arrives
- final BCF2FieldWriterManager fieldManager = new BCF2FieldWriterManager();
-
- /**
- * cached results for whether we can write out raw genotypes data.
- */
- private VCFHeader lastVCFHeaderOfUnparsedGenotypes = null;
- private boolean canPassOnUnparsedGenotypeDataForLastVCFHeader = false;
-
- public BCF2Writer(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes) {
- super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing);
- this.outputStream = getOutputStream();
- this.doNotWriteGenotypes = doNotWriteGenotypes;
- }
-
- public BCF2Writer(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator,
- final boolean enableOnTheFlyIndexing, final boolean doNotWriteGenotypes) {
- super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing, indexCreator);
- this.outputStream = getOutputStream();
- this.doNotWriteGenotypes = doNotWriteGenotypes;
- }
-
- // --------------------------------------------------------------------------------
- //
- // Interface functions
- //
- // --------------------------------------------------------------------------------
-
- @Override
- public void writeHeader(VCFHeader header) {
- // make sure the header is sorted correctly
- header = new VCFHeader(header.getMetaDataInSortedOrder(), header.getGenotypeSamples());
-
- // create the config offsets map
- if ( header.getContigLines().isEmpty() ) {
- if ( ALLOW_MISSING_CONTIG_LINES ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("No contig dictionary found in header, falling back to reference sequence dictionary");
- }
- createContigDictionary(VCFUtils.makeContigHeaderLines(getRefDict(), null));
- } else {
- throw new IllegalStateException("Cannot write BCF2 file with missing contig lines");
- }
- } else {
- createContigDictionary(header.getContigLines());
- }
-
- // set up the map from dictionary string values -> offset
- final ArrayList<String> dict = BCF2Utils.makeDictionary(header);
- for ( int i = 0; i < dict.size(); i++ ) {
- stringDictionaryMap.put(dict.get(i), i);
- }
-
- sampleNames = header.getGenotypeSamples().toArray(new String[header.getNGenotypeSamples()]);
-
- // setup the field encodings
- fieldManager.setup(header, encoder, stringDictionaryMap);
-
- try {
- // write out the header into a byte stream, get its length, and write everything to the file
- final ByteArrayOutputStream capture = new ByteArrayOutputStream();
- final OutputStreamWriter writer = new OutputStreamWriter(capture);
- this.header = VCFWriter.writeHeader(header, writer, doNotWriteGenotypes, VCFWriter.getVersionLine(), "BCF2 stream");
- writer.append('\0'); // the header is null terminated by a byte
- writer.close();
-
- final byte[] headerBytes = capture.toByteArray();
- new BCFVersion(MAJOR_VERSION, MINOR_VERSION).write(outputStream);
- BCF2Type.INT32.write(headerBytes.length, outputStream);
- outputStream.write(headerBytes);
- } catch (IOException e) {
- throw new RuntimeIOException("BCF2 stream: Got IOException while trying to write BCF2 header", e);
- }
- }
-
- @Override
- public void add( VariantContext vc ) {
- if ( doNotWriteGenotypes )
- vc = new VariantContextBuilder(vc).noGenotypes().make();
- vc = vc.fullyDecode(header, false);
-
- super.add(vc); // allow on the fly indexing
-
- try {
- final byte[] infoBlock = buildSitesData(vc);
- final byte[] genotypesBlock = buildSamplesData(vc);
-
- // write the two blocks to disk
- writeBlock(infoBlock, genotypesBlock);
- }
- catch ( IOException e ) {
- throw new RuntimeIOException("Error writing record to BCF2 file: " + vc.toString(), e);
- }
- }
-
- @Override
- public void close() {
- try {
- outputStream.flush();
- }
- catch ( IOException e ) {
- throw new RuntimeIOException("Failed to flush BCF2 file");
- }
- super.close();
- }
-
- // --------------------------------------------------------------------------------
- //
- // implicit block
- //
- // The first four records of BCF are inline untype encoded data of:
- //
- // 4 byte integer chrom offset
- // 4 byte integer start
- // 4 byte integer ref length
- // 4 byte float qual
- //
- // --------------------------------------------------------------------------------
- private byte[] buildSitesData( VariantContext vc ) throws IOException {
- final int contigIndex = contigDictionary.get(vc.getContig());
- if ( contigIndex == -1 )
- throw new IllegalStateException(String.format("Contig %s not found in sequence dictionary from reference", vc.getContig()));
-
- // note use of encodeRawValue to not insert the typing byte
- encoder.encodeRawValue(contigIndex, BCF2Type.INT32);
-
- // pos. GATK is 1 based, BCF2 is 0 based
- encoder.encodeRawValue(vc.getStart() - 1, BCF2Type.INT32);
-
- // ref length. GATK is closed, but BCF2 is open so the ref length is GATK end - GATK start + 1
- // for example, a SNP is in GATK at 1:10-10, which has ref length 10 - 10 + 1 = 1
- encoder.encodeRawValue(vc.getEnd() - vc.getStart() + 1, BCF2Type.INT32);
-
- // qual
- if ( vc.hasLog10PError() )
- encoder.encodeRawFloat((float) vc.getPhredScaledQual());
- else
- encoder.encodeRawMissingValue(BCF2Type.FLOAT);
-
- // info fields
- final int nAlleles = vc.getNAlleles();
- final int nInfo = vc.getAttributes().size();
- final int nGenotypeFormatFields = getNGenotypeFormatFields(vc);
- final int nSamples = header.getNGenotypeSamples();
-
- encoder.encodeRawInt((nAlleles << 16) | (nInfo & 0x0000FFFF), BCF2Type.INT32);
- encoder.encodeRawInt((nGenotypeFormatFields << 24) | (nSamples & 0x00FFFFF), BCF2Type.INT32);
-
- buildID(vc);
- buildAlleles(vc);
- buildFilter(vc);
- buildInfo(vc);
-
- return encoder.getRecordBytes();
- }
-
-
- /**
- * Can we safely write on the raw (undecoded) genotypes of an input VC?
- *
- * The cache depends on the undecoded lazy data header == lastVCFHeaderOfUnparsedGenotypes, in
- * which case we return the previous result. If it's not cached, we use the BCF2Util to
- * compare the VC header with our header (expensive) and cache it.
- *
- * @param lazyData
- * @return
- */
- private boolean canSafelyWriteRawGenotypesBytes(final BCF2Codec.LazyData lazyData) {
- if ( lazyData.header != lastVCFHeaderOfUnparsedGenotypes ) {
- // result is already cached
- canPassOnUnparsedGenotypeDataForLastVCFHeader = BCF2Utils.headerLinesAreOrderedConsistently(this.header,lazyData.header);
- lastVCFHeaderOfUnparsedGenotypes = lazyData.header;
- }
-
- return canPassOnUnparsedGenotypeDataForLastVCFHeader;
- }
-
- private BCF2Codec.LazyData getLazyData(final VariantContext vc) {
- if ( vc.getGenotypes().isLazyWithData() ) {
- final LazyGenotypesContext lgc = (LazyGenotypesContext)vc.getGenotypes();
-
- if ( lgc.getUnparsedGenotypeData() instanceof BCF2Codec.LazyData &&
- canSafelyWriteRawGenotypesBytes((BCF2Codec.LazyData) lgc.getUnparsedGenotypeData())) {
- return (BCF2Codec.LazyData)lgc.getUnparsedGenotypeData();
- } else {
- lgc.decode(); // WARNING -- required to avoid keeping around bad lazy data for too long
- }
- }
-
- return null;
- }
-
- /**
- * Try to get the nGenotypeFields as efficiently as possible.
- *
- * If this is a lazy BCF2 object just grab the field count from there,
- * otherwise do the whole counting by types test in the actual data
- *
- * @param vc
- * @return
- */
- private int getNGenotypeFormatFields(final VariantContext vc) {
- final BCF2Codec.LazyData lazyData = getLazyData(vc);
- return lazyData != null ? lazyData.nGenotypeFields : vc.calcVCFGenotypeKeys(header).size();
- }
-
- private void buildID( VariantContext vc ) throws IOException {
- encoder.encodeTypedString(vc.getID());
- }
-
- private void buildAlleles( VariantContext vc ) throws IOException {
- for ( Allele allele : vc.getAlleles() ) {
- final byte[] s = allele.getDisplayBases();
- if ( s == null )
- throw new IllegalStateException("BUG: BCF2Writer encountered null padded allele" + allele);
- encoder.encodeTypedString(s);
- }
- }
-
- private void buildFilter( VariantContext vc ) throws IOException {
- if ( vc.isFiltered() ) {
- encodeStringsByRef(vc.getFilters());
- } else if ( vc.filtersWereApplied() ) {
- encodeStringsByRef(Collections.singleton(VCFConstants.PASSES_FILTERS_v4));
- } else {
- encoder.encodeTypedMissing(BCF2Type.INT8);
- }
- }
-
- private void buildInfo( VariantContext vc ) throws IOException {
- for ( Map.Entry<String, Object> infoFieldEntry : vc.getAttributes().entrySet() ) {
- final String field = infoFieldEntry.getKey();
- final BCF2FieldWriter.SiteWriter writer = fieldManager.getSiteFieldWriter(field);
- if ( writer == null ) errorUnexpectedFieldToWrite(vc, field, "INFO");
- writer.start(encoder, vc);
- writer.site(encoder, vc);
- writer.done(encoder, vc);
- }
- }
-
- private byte[] buildSamplesData(final VariantContext vc) throws IOException {
- final BCF2Codec.LazyData lazyData = getLazyData(vc); // has critical side effects
- if ( lazyData != null ) {
- // we never decoded any data from this BCF file, so just pass it back
- return lazyData.bytes;
- }
-
- // we have to do work to convert the VC into a BCF2 byte stream
- final List<String> genotypeFields = vc.calcVCFGenotypeKeys(header);
- for ( final String field : genotypeFields ) {
- final BCF2FieldWriter.GenotypesWriter writer = fieldManager.getGenotypeFieldWriter(field);
- if ( writer == null ) errorUnexpectedFieldToWrite(vc, field, "FORMAT");
-
- assert writer != null;
-
- writer.start(encoder, vc);
- for ( final String name : sampleNames ) {
- Genotype g = vc.getGenotype(name);
- if ( g == null ) g = GenotypeBuilder.createMissing(name, writer.nValuesPerGenotype);
- writer.addGenotype(encoder, vc, g);
- }
- writer.done(encoder, vc);
- }
- return encoder.getRecordBytes();
- }
-
- /**
- * Throws a meaningful error message when a field (INFO or FORMAT) is found when writing out a file
- * but there's no header line for it.
- *
- * @param vc
- * @param field
- * @param fieldType
- */
- private void errorUnexpectedFieldToWrite(final VariantContext vc, final String field, final String fieldType) {
- throw new IllegalStateException("Found field " + field + " in the " + fieldType + " fields of VariantContext at " +
- vc.getContig() + ":" + vc.getStart() + " from " + vc.getSource() + " but this hasn't been defined in the VCFHeader");
- }
-
- // --------------------------------------------------------------------------------
- //
- // Low-level block encoding
- //
- // --------------------------------------------------------------------------------
-
- /**
- * Write the data in the encoder to the outputstream as a length encoded
- * block of data. After this call the encoder stream will be ready to
- * start a new data block
- *
- * @throws IOException
- */
- private void writeBlock(final byte[] infoBlock, final byte[] genotypesBlock) throws IOException {
- BCF2Type.INT32.write(infoBlock.length, outputStream);
- BCF2Type.INT32.write(genotypesBlock.length, outputStream);
- outputStream.write(infoBlock);
- outputStream.write(genotypesBlock);
- }
-
- private BCF2Type encodeStringsByRef(final Collection<String> strings) throws IOException {
- final List<Integer> offsets = new ArrayList<Integer>(strings.size());
-
- // iterate over strings until we find one that needs 16 bits, and break
- for ( final String string : strings ) {
- final Integer got = stringDictionaryMap.get(string);
- if ( got == null ) throw new IllegalStateException("Format error: could not find string " + string + " in header as required by BCF");
- final int offset = got;
- offsets.add(offset);
- }
-
- final BCF2Type type = BCF2Utils.determineIntegerType(offsets);
- encoder.encodeTyped(offsets, type);
- return type;
- }
-
- /**
- * Create the contigDictionary from the contigLines extracted from the VCF header
- *
- * @param contigLines
- */
- private void createContigDictionary(final Collection<VCFContigHeaderLine> contigLines) {
- int offset = 0;
- for ( VCFContigHeaderLine contig : contigLines )
- contigDictionary.put(contig.getID(), offset++);
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java
deleted file mode 100644
index 6a77f6b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/IndexingVariantContextWriter.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.DynamicIndexCreator;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.samtools.util.PositionalOutputStream;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * this class writes VCF files
- */
-abstract class IndexingVariantContextWriter implements VariantContextWriter {
- private final String name;
- private final File location;
- private final SAMSequenceDictionary refDict;
-
- private OutputStream outputStream;
- private LocationAware locationSource = null;
- private IndexCreator indexer = null;
-
- private IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict) {
- this.name = name;
- this.location = location;
- this.outputStream = output;
- this.refDict = refDict;
- }
-
- /**
- * Create a VariantContextWriter with an associated index using the default index creator
- *
- * @param name the name of this writer (i.e. the file name or stream)
- * @param location the path to the output file
- * @param output the output stream to write to
- * @param refDict the reference dictionary
- * @param enableOnTheFlyIndexing is OTF indexing enabled?
- */
- protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final boolean enableOnTheFlyIndexing) {
- this(name, location, output, refDict);
-
- if ( enableOnTheFlyIndexing ) {
- initIndexingWriter(new DynamicIndexCreator(location, IndexFactory.IndexBalanceApproach.FOR_SEEK_TIME));
- }
- }
-
- /**
- * Create a VariantContextWriter with an associated index using a custom index creator
- *
- * @param name the name of this writer (i.e. the file name or stream)
- * @param location the path to the output file
- * @param output the output stream to write to
- * @param refDict the reference dictionary
- * @param enableOnTheFlyIndexing is OTF indexing enabled?
- * @param idxCreator the custom index creator. NOTE: must be initialized
- */
- protected IndexingVariantContextWriter(final String name, final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final boolean enableOnTheFlyIndexing, final IndexCreator idxCreator) {
- this(name, location, output, refDict);
-
- if ( enableOnTheFlyIndexing ) {
- // TODO: Handle non-Tribble IndexCreators
- initIndexingWriter(idxCreator);
- }
- }
-
- private void initIndexingWriter(final IndexCreator idxCreator) {
- indexer = idxCreator;
- if (outputStream instanceof LocationAware) {
- locationSource = (LocationAware)outputStream;
- } else {
- final PositionalOutputStream positionalOutputStream = new PositionalOutputStream(outputStream);
- locationSource = positionalOutputStream;
- outputStream = positionalOutputStream;
- }
- }
-
- /** return true is the underlying stream is a PrintStream and
- * its checkError returned true. Used to stop linux pipelines
- */
- @Override
- public boolean checkError() {
- return (getOutputStream() instanceof PrintStream) &&
- PrintStream.class.cast(getOutputStream()).checkError();
- }
-
- public OutputStream getOutputStream() {
- return outputStream;
- }
-
- public String getStreamName() {
- return name;
- }
-
- public abstract void writeHeader(VCFHeader header);
-
- /**
- * attempt to close the VCF file
- */
- public void close() {
- try {
- // close the underlying output stream
- outputStream.close();
-
- // close the index stream (keep it separate to help debugging efforts)
- if (indexer != null) {
- indexer.setIndexSequenceDictionary(refDict);
- final Index index = indexer.finalizeIndex(locationSource.getPosition());
- index.writeBasedOnFeatureFile(location);
- }
-
-
- } catch (final IOException e) {
- throw new RuntimeIOException("Unable to close index for " + getStreamName(), e);
- }
- }
-
- /**
- * @return the reference sequence dictionary used for the variant contexts being written
- */
- public SAMSequenceDictionary getRefDict() {
- return refDict;
- }
-
- /**
- * add a record to the file
- *
- * @param vc the Variant Context object
- */
- public void add(final VariantContext vc) {
- // if we are doing on the fly indexing, add the record ***before*** we write any bytes
- if ( indexer != null )
- indexer.addFeature(vc, locationSource.getPosition());
- }
-
- /**
- * Returns a reasonable "name" for this writer, to display to the user if something goes wrong
- *
- * @param location
- * @param stream
- * @return
- */
- protected static final String writerName(final File location, final OutputStream stream) {
- return location == null ? stream.toString() : location.getAbsolutePath();
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java b/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java
deleted file mode 100644
index 1934d8d..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/IntGenotypeFieldAccessors.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.vcf.VCFConstants;
-
-import java.util.HashMap;
-
-/**
- * A convenient way to provide a single view on the many int and int[] field values we work with,
- * for writing out the values. This class makes writing out the inline AD, GQ, PL, DP fields
- * easy and fast
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class IntGenotypeFieldAccessors {
- // initialized once per writer to allow parallel writers to work
- private final HashMap<String, Accessor> intGenotypeFieldEncoders = new HashMap<String, Accessor>();
-
- public IntGenotypeFieldAccessors() {
- intGenotypeFieldEncoders.put(VCFConstants.DEPTH_KEY, new IntGenotypeFieldAccessors.DPAccessor());
- intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_ALLELE_DEPTHS, new IntGenotypeFieldAccessors.ADAccessor());
- intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_PL_KEY, new IntGenotypeFieldAccessors.PLAccessor());
- intGenotypeFieldEncoders.put(VCFConstants.GENOTYPE_QUALITY_KEY, new IntGenotypeFieldAccessors.GQAccessor());
- }
-
- /**
- * Return an accessor for field, or null if none exists
- * @param field
- * @return
- */
- public Accessor getAccessor(final String field) {
- return intGenotypeFieldEncoders.get(field);
- }
-
- public static abstract class Accessor {
- public abstract int[] getValues(final Genotype g);
-
- public final int getSize(final Genotype g) {
- final int[] v = getValues(g);
- return v == null ? 0 : v.length;
- }
- }
-
- private static abstract class AtomicAccessor extends Accessor {
- private final int[] singleton = new int[1];
-
- @Override
- public int[] getValues(final Genotype g) {
- singleton[0] = getValue(g);
- return singleton[0] == -1 ? null : singleton;
- }
-
- public abstract int getValue(final Genotype g);
- }
-
- public static class GQAccessor extends AtomicAccessor {
- @Override public int getValue(final Genotype g) { return Math.min(g.getGQ(), VCFConstants.MAX_GENOTYPE_QUAL); }
- }
-
- public static class DPAccessor extends AtomicAccessor {
- @Override public int getValue(final Genotype g) { return g.getDP(); }
- }
-
- public static class ADAccessor extends Accessor {
- @Override public int[] getValues(final Genotype g) { return g.getAD(); }
- }
-
- public static class PLAccessor extends Accessor {
- @Override public int[] getValues(final Genotype g) { return g.getPL(); }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/Options.java b/src/main/java/htsjdk/variant/variantcontext/writer/Options.java
deleted file mode 100644
index 50db1e9..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/Options.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-/**
- * Available writer options for VariantContextWriters
- *
- * @author Mark DePristo
- * @since 5/12
- */
-public enum Options {
- INDEX_ON_THE_FLY,
- DO_NOT_WRITE_GENOTYPES,
- ALLOW_MISSING_FIELDS_IN_HEADER,
- FORCE_BCF,
- USE_ASYNC_IO, // Turn on or off the use of asynchronous IO for writing output VCF files.
- WRITE_FULL_FORMAT_FIELD // Write the complete format field, even if trailing missing values could be trimmed?
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java
deleted file mode 100644
index 2185482..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * this class writes VCF files, allowing records to be passed in unsorted (up to a certain genomic distance away)
- */
-public class SortingVariantContextWriter extends SortingVariantContextWriterBase {
-
- // the maximum START distance between records that we'll cache
- private int maxCachingStartDistance;
-
- /**
- * create a local-sorting VCF writer, given an inner VCF writer to write to
- *
- * @param innerWriter the VCFWriter to write to
- * @param maxCachingStartDistance the maximum start distance between records that we'll cache
- * @param takeOwnershipOfInner Should this Writer close innerWriter when it's done with it
- */
- public SortingVariantContextWriter(VariantContextWriter innerWriter, int maxCachingStartDistance, boolean takeOwnershipOfInner) {
- super(innerWriter, takeOwnershipOfInner);
- this.maxCachingStartDistance = maxCachingStartDistance;
- }
-
- public SortingVariantContextWriter(VariantContextWriter innerWriter, int maxCachingStartDistance) {
- this(innerWriter, maxCachingStartDistance, false); // by default, don't own inner
- }
-
- protected void noteCurrentRecord(VariantContext vc) {
- super.noteCurrentRecord(vc); // first, check for errors
-
- // then, update mostUpstreamWritableLoc:
- int mostUpstreamWritableIndex = vc.getStart() - maxCachingStartDistance;
- this.mostUpstreamWritableLoc = Math.max(BEFORE_MOST_UPSTREAM_LOC, mostUpstreamWritableIndex);
- }
-
- @Override
- public boolean checkError() {
- return false;
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java b/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java
deleted file mode 100644
index 690a781..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/SortingVariantContextWriterBase.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.Queue;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.PriorityBlockingQueue;
-
-/**
- * This class writes VCF files, allowing records to be passed in unsorted.
- * It also enforces that it is never passed records of the same chromosome with any other chromosome in between them.
- */
-abstract class SortingVariantContextWriterBase implements VariantContextWriter {
-
- // The VCFWriter to which to actually write the sorted VCF records
- private final VariantContextWriter innerWriter;
-
- // the current queue of un-emitted records
- private final Queue<VCFRecord> queue;
-
- // The locus until which we are permitted to write out (inclusive)
- protected Integer mostUpstreamWritableLoc;
- protected static final int BEFORE_MOST_UPSTREAM_LOC = 0; // No real locus index is <= 0
-
- // The set of chromosomes already passed over and to which it is forbidden to return
- private final Set<String> finishedChromosomes;
-
- // Should we call innerWriter.close() in close()
- private final boolean takeOwnershipOfInner;
-
- // --------------------------------------------------------------------------------
- //
- // Constructors
- //
- // --------------------------------------------------------------------------------
-
- /**
- * create a local-sorting VCF writer, given an inner VCF writer to write to
- *
- * @param innerWriter the VCFWriter to write to
- * @param takeOwnershipOfInner Should this Writer close innerWriter when it's done with it
- */
- public SortingVariantContextWriterBase(VariantContextWriter innerWriter, boolean takeOwnershipOfInner) {
- this.innerWriter = innerWriter;
- this.finishedChromosomes = new TreeSet<String>();
- this.takeOwnershipOfInner = takeOwnershipOfInner;
-
- // has to be PriorityBlockingQueue to be thread-safe
- this.queue = new PriorityBlockingQueue<VCFRecord>(50, new VariantContextComparator());
-
- this.mostUpstreamWritableLoc = BEFORE_MOST_UPSTREAM_LOC;
- }
-
- public SortingVariantContextWriterBase(VariantContextWriter innerWriter) {
- this(innerWriter, false); // by default, don't own inner
- }
-
- // --------------------------------------------------------------------------------
- //
- // public interface functions
- //
- // --------------------------------------------------------------------------------
-
- @Override
- public void writeHeader(VCFHeader header) {
- innerWriter.writeHeader(header);
- }
-
- /**
- * attempt to close the VCF file; we need to flush the queue first
- */
- @Override
- public void close() {
- stopWaitingToSort();
-
- if (takeOwnershipOfInner)
- innerWriter.close();
- }
-
-
- /**
- * add a record to the file
- *
- * @param vc the Variant Context object
- */
- @Override
- public synchronized void add(VariantContext vc) {
- /* Note that the code below does not prevent the successive add()-ing of: (chr1, 10), (chr20, 200), (chr15, 100)
- since there is no implicit ordering of chromosomes:
- */
- VCFRecord firstRec = queue.peek();
- if (firstRec != null && !vc.getContig().equals(firstRec.vc.getContig())) { // if we hit a new contig, flush the queue
- if (finishedChromosomes.contains(vc.getContig()))
- throw new IllegalArgumentException("Added a record at " + vc.getContig() + ":" + vc.getStart() + ", but already finished with chromosome" + vc.getContig());
-
- finishedChromosomes.add(firstRec.vc.getContig());
- stopWaitingToSort();
- }
-
- noteCurrentRecord(vc); // possibly overwritten
-
- queue.add(new VCFRecord(vc));
- emitSafeRecords();
- }
-
- /**
- * Gets a string representation of this object.
- * @return a string representation of this object
- */
- @Override
- public String toString() {
- return getClass().getName();
- }
-
- // --------------------------------------------------------------------------------
- //
- // protected interface functions for subclasses to use
- //
- // --------------------------------------------------------------------------------
-
- private synchronized void stopWaitingToSort() {
- emitRecords(true);
- mostUpstreamWritableLoc = BEFORE_MOST_UPSTREAM_LOC;
- }
-
- protected synchronized void emitSafeRecords() {
- emitRecords(false);
- }
-
- protected void noteCurrentRecord(VariantContext vc) {
- // did the user break the contract by giving a record too late?
- if (mostUpstreamWritableLoc != null && vc.getStart() < mostUpstreamWritableLoc) // went too far back, since may have already written anything that is <= mostUpstreamWritableLoc
- throw new IllegalArgumentException("Permitted to write any record upstream of position " + mostUpstreamWritableLoc + ", but a record at " + vc.getContig() + ":" + vc.getStart() + " was just added.");
- }
-
- // --------------------------------------------------------------------------------
- //
- // private implementation functions
- //
- // --------------------------------------------------------------------------------
-
- private synchronized void emitRecords(boolean emitUnsafe) {
- while (!queue.isEmpty()) {
- VCFRecord firstRec = queue.peek();
-
- // No need to wait, waiting for nothing, or before what we're waiting for:
- if (emitUnsafe || mostUpstreamWritableLoc == null || firstRec.vc.getStart() <= mostUpstreamWritableLoc) {
- queue.poll();
- innerWriter.add(firstRec.vc);
- }
- else {
- break;
- }
- }
- }
-
- private static class VariantContextComparator implements Comparator<VCFRecord>, Serializable {
- private static final long serialVersionUID = 1L;
-
- public int compare(VCFRecord r1, VCFRecord r2) {
- return r1.vc.getStart() - r2.vc.getStart();
- }
- }
-
- private static class VCFRecord {
- public VariantContext vc;
-
- public VCFRecord(VariantContext vc) {
- this.vc = vc;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java
deleted file mode 100644
index 71aef13..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VCFWriter.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFEncoder;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderVersion;
-
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-/**
- * this class writes VCF files
- */
-class VCFWriter extends IndexingVariantContextWriter {
-
- private static final String VERSION_LINE =
- VCFHeader.METADATA_INDICATOR + VCFHeaderVersion.VCF4_2.getFormatString() + "=" + VCFHeaderVersion.VCF4_2.getVersionString();
-
- // Initialized when the header is written to the output stream
- private VCFEncoder vcfEncoder = null;
-
- // the VCF header we're storing
- protected VCFHeader mHeader = null;
-
- private final boolean allowMissingFieldsInHeader;
-
- // should we write genotypes or just sites?
- private final boolean doNotWriteGenotypes;
-
- // should we always output a complete format record, even if we could drop trailing fields?
- private final boolean writeFullFormatField;
-
- /*
- * The VCF writer uses an internal Writer, based by the ByteArrayOutputStream lineBuffer,
- * to temp. buffer the header and per-site output before flushing the per line output
- * in one go to the super.getOutputStream. This results in high-performance, proper encoding,
- * and allows us to avoid flushing explicitly the output stream getOutputStream, which
- * allows us to properly compress vcfs in gz format without breaking indexing on the fly
- * for uncompressed streams.
- */
- private static final int INITIAL_BUFFER_SIZE = 1024 * 16;
- private final ByteArrayOutputStream lineBuffer = new ByteArrayOutputStream(INITIAL_BUFFER_SIZE);
- /* Wrapping in a {@link BufferedWriter} avoids frequent conversions with individual writes to OutputStreamWriter. */
- private final Writer writer = new BufferedWriter(new OutputStreamWriter(lineBuffer, VCFEncoder.VCF_CHARSET));
-
- public VCFWriter(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final boolean enableOnTheFlyIndexing,
- final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader,
- final boolean writeFullFormatField) {
- super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing);
- this.doNotWriteGenotypes = doNotWriteGenotypes;
- this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
- this.writeFullFormatField = writeFullFormatField;
- }
-
- public VCFWriter(final File location, final OutputStream output, final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator, final boolean enableOnTheFlyIndexing,
- final boolean doNotWriteGenotypes, final boolean allowMissingFieldsInHeader,
- final boolean writeFullFormatField) {
- super(writerName(location, output), location, output, refDict, enableOnTheFlyIndexing, indexCreator);
- this.doNotWriteGenotypes = doNotWriteGenotypes;
- this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
- this.writeFullFormatField = writeFullFormatField;
- }
- // --------------------------------------------------------------------------------
- //
- // VCFWriter interface functions
- //
- // --------------------------------------------------------------------------------
-
- /*
- * Write String s to the internal buffered writer.
- *
- * writeAndResetBuffer() must be called to actually write the data to the true output stream.
- *
- * @param s the string to write
- * @throws IOException
- */
- private void write(final String s) throws IOException {
- writer.write(s);
- }
-
- /*
- * Actually write the line buffer contents to the destination output stream. After calling this function
- * the line buffer is reset so the contents of the buffer can be reused
- */
- private void writeAndResetBuffer() throws IOException {
- writer.flush();
- getOutputStream().write(lineBuffer.toByteArray());
- lineBuffer.reset();
- }
-
- @Override
- public void writeHeader(final VCFHeader header) {
- // note we need to update the mHeader object after this call because they header
- // may have genotypes trimmed out of it, if doNotWriteGenotypes is true
- try {
- this.mHeader = writeHeader(header, writer, doNotWriteGenotypes, getVersionLine(), getStreamName());
- this.vcfEncoder = new VCFEncoder(this.mHeader, this.allowMissingFieldsInHeader, this.writeFullFormatField);
- writeAndResetBuffer();
-
- } catch ( IOException e ) {
- throw new RuntimeIOException("Couldn't write file " + getStreamName(), e);
- }
- }
-
- public static String getVersionLine() {
- return VERSION_LINE;
- }
-
- public static VCFHeader writeHeader(VCFHeader header,
- final Writer writer,
- final boolean doNotWriteGenotypes,
- final String versionLine,
- final String streamNameForError) {
- header = doNotWriteGenotypes ? new VCFHeader(header.getMetaDataInSortedOrder()) : header;
-
- try {
- // the file format field needs to be written first
- writer.write(versionLine + "\n");
-
- for (final VCFHeaderLine line : header.getMetaDataInSortedOrder() ) {
- if ( VCFHeaderVersion.isFormatString(line.getKey()) )
- continue;
-
- writer.write(VCFHeader.METADATA_INDICATOR);
- writer.write(line.toString());
- writer.write("\n");
- }
-
- // write out the column line
- writer.write(VCFHeader.HEADER_INDICATOR);
- boolean isFirst = true;
- for (final VCFHeader.HEADER_FIELDS field : header.getHeaderFields() ) {
- if ( isFirst )
- isFirst = false; // don't write out a field separator
- else
- writer.write(VCFConstants.FIELD_SEPARATOR);
- writer.write(field.toString());
- }
-
- if ( header.hasGenotypingData() ) {
- writer.write(VCFConstants.FIELD_SEPARATOR);
- writer.write("FORMAT");
- for (final String sample : header.getGenotypeSamples() ) {
- writer.write(VCFConstants.FIELD_SEPARATOR);
- writer.write(sample);
- }
- }
-
- writer.write("\n");
- writer.flush(); // necessary so that writing to an output stream will work
- }
- catch (IOException e) {
- throw new RuntimeIOException("IOException writing the VCF header to " + streamNameForError, e);
- }
-
- return header;
- }
-
- /**
- * attempt to close the VCF file
- */
- @Override
- public void close() {
- // try to close the vcf stream
- try {
- // TODO -- would it be useful to null out the line buffer so we don't have it around unnecessarily?
- writer.close();
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to close " + getStreamName(), e);
- }
-
- super.close();
- }
-
- /**
- * Add a record to the file
- */
- @Override
- public void add(final VariantContext context) {
- try {
- super.add(context);
-
- if (this.doNotWriteGenotypes) write(this.vcfEncoder.encode(new VariantContextBuilder(context).noGenotypes().make()));
- else write(this.vcfEncoder.encode(context));
- write("\n");
-
- writeAndResetBuffer();
-
- } catch (IOException e) {
- throw new RuntimeIOException("Unable to write the VCF object to " + getStreamName(), e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java
deleted file mode 100644
index 187ff17..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import java.io.Closeable;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFHeader;
-
-/**
- * this class writes VCF files
- */
-public interface VariantContextWriter extends Closeable {
-
- public void writeHeader(VCFHeader header);
-
- /**
- * attempt to close the VCF file
- */
- public void close();
-
- /**
- * @return true if the underlying stream is a java.io.PrintStream and its checkError returned true, used for pipelines
- */
- public boolean checkError();
-
- public void add(VariantContext vc);
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java
deleted file mode 100644
index 56c8b8b..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilder.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
-* Copyright (c) 2014 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Md5CalculatingOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/*
- * Created with IntelliJ IDEA.
- * User: thibault
- * Date: 3/7/14
- * Time: 2:07 PM
- */
-/**
- * @author thibault
- *
- * <p>
- * Provides methods for creating <code>VariantContextWriter</code>s using the Builder pattern.
- * Replaces <code>VariantContextWriterFactory</code>.
- * </p>
- * <p>
- * The caller must choose an output file or an output stream for the <code>VariantContextWriter</code> to write to.
- * When a file is chosen, the output stream is created implicitly based on Defaults and options passed to the builder.
- * When a stream is chosen, it is passed unchanged to the <code>VariantContextWriter</code>.
- * </p>
- * <p>
- * Example: Create a series of files with buffering and indexing on the fly.
- * Determine the appropriate file type based on filename.
- * </p>
-
- <pre>
- VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(refDict)
- .setOption(Options.INDEX_ON_THE_FLY)
- .setBuffer(8192);
-
- VariantContextWriter sample1_writer = builder
- .setOutputFile("sample1.vcf")
- .build();
- VariantContextWriter sample2_writer = builder
- .setOutputFile("sample2.bcf")
- .build();
- VariantContextWriter sample3_writer = builder
- .setOutputFile("sample3.vcf.bgzf")
- .build();
- </pre>
-
- <p>
- * Example: Explicitly turn off buffering and explicitly set the file type
- * </p>
- *
- * <pre>
- VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(refDict)
- .setOption(Options.INDEX_ON_THE_FLY)
- .unsetBuffering();
-
- VariantContextWriter sample1_writer = builder
- .setOutputFile("sample1.custom_extension")
- .setOutputFileType(OutputType.VCF)
- .build();
- VariantContextWriter sample2_writer = builder
- .setOutputFile("sample2.custom_extension")
- .setOutputFileType(OutputType.BLOCK_COMPRESSED_VCF)
- .build();
- </pre>
- */
-public class VariantContextWriterBuilder {
- public static final EnumSet<Options> DEFAULT_OPTIONS = EnumSet.of(Options.INDEX_ON_THE_FLY);
- public static final EnumSet<Options> NO_OPTIONS = EnumSet.noneOf(Options.class);
-
- public enum OutputType {
- UNSPECIFIED,
- VCF,
- BCF,
- BLOCK_COMPRESSED_VCF,
- VCF_STREAM,
- BCF_STREAM
- }
-
- public static final EnumSet<OutputType> FILE_TYPES = EnumSet.of(OutputType.VCF, OutputType.BCF, OutputType.BLOCK_COMPRESSED_VCF);
- public static final EnumSet<OutputType> STREAM_TYPES = EnumSet.of(OutputType.VCF_STREAM, OutputType.BCF_STREAM);
-
- private SAMSequenceDictionary refDict = null;
- private OutputType outType = OutputType.UNSPECIFIED;
- private File outFile = null;
- private OutputStream outStream = null;
- private IndexCreator idxCreator = null;
- private int bufferSize = Defaults.BUFFER_SIZE;
- private boolean createMD5 = Defaults.CREATE_MD5;
- protected EnumSet<Options> options = DEFAULT_OPTIONS.clone();
-
- /**
- * Default constructor. Adds <code>USE_ASYNC_IO</code> to the Options if it is present in Defaults.
- */
- public VariantContextWriterBuilder() {
- if (Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE) {
- options.add(Options.USE_ASYNC_IO);
- }
- }
-
- /**
- * Set the reference dictionary to be used by <code>VariantContextWriter</code>s created by this builder.
- *
- * @param refDict the reference dictionary
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setReferenceDictionary(final SAMSequenceDictionary refDict) {
- this.refDict = refDict;
- return this;
- }
-
- /**
- * Set the output file for the next <code>VariantContextWriter</code> created by this builder.
- * Determines file type implicitly from the filename.
- *
- * @param outFile the file the <code>VariantContextWriter</code> will write to
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOutputFile(final File outFile) {
- this.outFile = outFile;
- this.outStream = null;
- this.outType = determineOutputTypeFromFile(outFile);
- return this;
- }
-
- /**
- * Set the output file for the next <code>VariantContextWriter</code> created by this builder.
- * Determines file type implicitly from the filename.
- *
- * @param outFile the file the <code>VariantContextWriter</code> will write to
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOutputFile(final String outFile) {
- return setOutputFile(new File(outFile));
- }
-
- /**
- * Set the output file type for the next <code>VariantContextWriter</code> created by this builder.
- *
- * @param outType the type of file the <code>VariantContextWriter</code> will write to
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOutputFileType(final OutputType outType) {
- if (!FILE_TYPES.contains(outType))
- throw new IllegalArgumentException("Must choose a file type, not other output types.");
-
- if (this.outFile == null || this.outStream != null)
- throw new IllegalArgumentException("Cannot set a file type if the output is not to a file.");
-
- this.outType = outType;
- return this;
- }
-
- /**
- * Set the output VCF stream for the next <code>VariantContextWriter</code> created by this builder.
- * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
- *
- * @param outStream the output stream to write to
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOutputVCFStream(final OutputStream outStream) {
- this.outStream = outStream;
- this.outFile = null;
- this.outType = OutputType.VCF_STREAM;
- return this;
- }
-
- /**
- * Set the output BCF stream for the next <code>VariantContextWriter</code> created by this builder.
- * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
- *
- * @param outStream the output stream to write to
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOutputBCFStream(final OutputStream outStream) {
- this.outStream = outStream;
- this.outFile = null;
- this.outType = OutputType.BCF_STREAM;
- return this;
- }
-
- /**
- * Set the output stream (VCF, by default) for the next <code>VariantContextWriter</code> created by this builder.
- * If buffered writing is desired, caller must provide some kind of buffered <code>OutputStream</code>.
- *
- * @param outStream the output stream to write to
- * @return this VariantContextWriterBuilder
- */
- public VariantContextWriterBuilder setOutputStream(final OutputStream outStream) {
- return setOutputVCFStream(outStream);
- }
-
- /**
- * Set an IndexCreator for the next <code>VariantContextWriter</code> created by this builder.
- *
- * @param idxCreator the <code>IndexCreator</code> to use
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setIndexCreator(final IndexCreator idxCreator) {
- this.idxCreator = idxCreator;
- return this;
- }
-
- /**
- * Do not pass an <code>IndexCreator</code> to the next <code>VariantContextWriter</code> created by this builder.
- *
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder clearIndexCreator() {
- this.idxCreator = null;
- return this;
- }
-
- /**
- * Set a buffer size for the file output stream passed to the next <code>VariantContextWriter</code> created by this builder.
- * Set to 0 for no buffering.
- * Does not affect OutputStreams passed directly to <code>VariantContextWriterBuilder</code>.
- *
- * @param bufferSize the buffer size to use
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setBuffer(final int bufferSize) {
- this.bufferSize = bufferSize;
- return this;
- }
-
- /**
- * Do not use buffering in the next <code>VariantContextWriter</code> created by this builder.
- * Does not affect <code>OutputStream</code>s passed directly to <code>VariantContextWriterBuilder</code>.
- *
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder unsetBuffering() {
- this.bufferSize = 0;
- return this;
- }
-
- /**
- * Choose whether to also create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
- *
- * @param createMD5 boolean, <code>true</code> to create an MD5 digest
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setCreateMD5(final boolean createMD5) {
- this.createMD5 = createMD5;
- return this;
- }
-
- /**
- * Create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
- *
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setCreateMD5() {
- return setCreateMD5(true);
- }
-
- /**
- * Don't create an MD5 digest file for the next <code>VariantContextWriter</code> created by this builder.
- *
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder unsetCreateMD5() {
- return setCreateMD5(false);
- }
-
- /**
- * Replace the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code> with a new set.
- *
- * @param options the complete set of options to use
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOptions(final EnumSet<Options> options) {
- this.options = options;
- return this;
- }
-
- /**
- * Add one option to the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>, if it's not already present.
- *
- * @param option the option to set
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder setOption(final Options option) {
- this.options.add(option);
- return this;
- }
-
- /**
- * Remove one option from the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>, if it's present.
- *
- * @param option the option to unset
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder unsetOption(final Options option) {
- this.options.remove(option);
- return this;
- }
-
- /**
- * Set or unset option depending on the boolean given
- * @param option the option to modify
- * @param setIt true to set the option, false to unset it.
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public VariantContextWriterBuilder modifyOption(final Options option, final boolean setIt) {
- return (setIt) ? this.setOption(option) : this.unsetOption(option);
- }
-
- /**
- * Add one option to the set of default <code>Options</code> that will be used as the initial set of options
- * for all VariantContextWriterBuilders created after this call.
- *
- * @param option the option to set
- */
- public static void setDefaultOption(final Options option) {
- VariantContextWriterBuilder.DEFAULT_OPTIONS.add(option);
- }
-
- /**
- * Remove an option from the set of default <code>Options</code> that will be used as the initial set of options
- * for all VariantContextWriterBuilders created after this call.
- *
- * @param option the option to unset
- * @return this <code>VariantContextWriterBuilder</code>
- */
- public static void unsetDefaultOption(final Options option) {
- VariantContextWriterBuilder.DEFAULT_OPTIONS.remove(option);
- }
-
- /**
- * Remove all options from the set of <code>Options</code> for the <code>VariantContextWriterBuilder</code>.
- *
- * @return this VariantContextWriterBuilder
- */
- public VariantContextWriterBuilder clearOptions() {
- this.options = NO_OPTIONS.clone();
- return this;
- }
-
- /**
- * Used for testing; tests if the option is set
- * @param option the option to test
- * @return true if the option is set, false otherwise.
- */
- boolean isOptionSet(final Options option) {
- return this.options.contains(option);
- }
-
- /**
- * Validate and build the <code>VariantContextWriter</code>.
- *
- * @return the <code>VariantContextWriter</code> as specified by previous method calls
- * @throws RuntimeIOException if the writer is configured to write to a file, and the corresponding path does not exist.
- * @throws IllegalArgumentException if no output file or stream is specified.
- * @throws IllegalArgumentException if <code>Options.INDEX_ON_THE_FLY</code> is specified and no reference dictionary is provided.
- * @throws IllegalArgumentException if <code>Options.INDEX_ON_THE_FLY</code> is specified and a stream output is specified.
- */
- public VariantContextWriter build() {
- VariantContextWriter writer = null;
-
- // don't allow FORCE_BCF to modify the outType state
- OutputType typeToBuild = this.outType;
-
- if (this.options.contains(Options.FORCE_BCF)) {
- if (FILE_TYPES.contains(this.outType))
- typeToBuild = OutputType.BCF;
- else if (STREAM_TYPES.contains(this.outType))
- typeToBuild = OutputType.BCF_STREAM;
- }
-
- OutputStream outStreamFromFile = this.outStream;
- if (FILE_TYPES.contains(this.outType)) {
- try {
- outStreamFromFile = IOUtil.maybeBufferOutputStream(new FileOutputStream(outFile), bufferSize);
- } catch (final FileNotFoundException e) {
- throw new RuntimeIOException("File not found: " + outFile, e);
- }
-
- if (createMD5)
- outStreamFromFile = new Md5CalculatingOutputStream(outStreamFromFile, new File(outFile.getAbsolutePath() + ".md5"));
- }
-
- switch (typeToBuild) {
- case UNSPECIFIED:
- throw new IllegalArgumentException("Must specify file or stream output type.");
- case VCF:
- if ((refDict == null) && (options.contains(Options.INDEX_ON_THE_FLY)))
- throw new IllegalArgumentException("A reference dictionary is required for creating Tribble indices on the fly");
-
- writer = createVCFWriter(outFile, outStreamFromFile);
- break;
- case BLOCK_COMPRESSED_VCF:
- if (refDict == null)
- idxCreator = new TabixIndexCreator(TabixFormat.VCF);
- else
- idxCreator = new TabixIndexCreator(refDict, TabixFormat.VCF);
-
- writer = createVCFWriter(outFile, new BlockCompressedOutputStream(outStreamFromFile, outFile));
- break;
- case BCF:
- if ((refDict == null) && (options.contains(Options.INDEX_ON_THE_FLY)))
- throw new IllegalArgumentException("A reference dictionary is required for creating Tribble indices on the fly");
-
- writer = createBCFWriter(outFile, outStreamFromFile);
- break;
- case VCF_STREAM:
- if (options.contains(Options.INDEX_ON_THE_FLY))
- throw new IllegalArgumentException("VCF index creation not supported for stream output.");
-
- writer = createVCFWriter(null, outStream);
- break;
- case BCF_STREAM:
- if (options.contains(Options.INDEX_ON_THE_FLY))
- throw new IllegalArgumentException("BCF index creation not supported for stream output.");
-
- writer = createBCFWriter(null, outStream);
- break;
- }
-
- if (this.options.contains(Options.USE_ASYNC_IO))
- writer = new AsyncVariantContextWriter(writer, AsyncVariantContextWriter.DEFAULT_QUEUE_SIZE);
-
- return writer;
- }
-
- /**
- * Attempts to determine the type of file/data to write based on the File path being
- * written to. Will attempt to determine using the logical filename; if that fails it will
- * attempt to resolve any symlinks and try again. If that fails, and the output file exists
- * but is neither a file or directory then VCF_STREAM is returned.
- */
- protected static OutputType determineOutputTypeFromFile(final File f) {
- if (isBCF(f)) {
- return OutputType.BCF;
- } else if (isCompressedVCF(f)) {
- return OutputType.BLOCK_COMPRESSED_VCF;
- } else if (isVCF(f)) {
- return OutputType.VCF;
- }
- else {
- // See if we have a special file (device, named pipe, etc.)
- final File canonical = new File(IOUtil.getFullCanonicalPath(f));
- if (!canonical.equals(f)) {
- return determineOutputTypeFromFile(canonical);
- }
- else if (f.exists() && !f.isFile() && !f.isDirectory()) {
- return OutputType.VCF_STREAM;
- } else {
- return OutputType.UNSPECIFIED;
- }
- }
- }
-
- private static boolean isVCF(final File outFile) {
- return outFile != null && outFile.getName().endsWith(".vcf");
- }
-
- private static boolean isBCF(final File outFile) {
- return outFile != null && outFile.getName().endsWith(".bcf");
- }
-
- private static boolean isCompressedVCF(final File outFile) {
- if (outFile == null)
- return false;
-
- return AbstractFeatureReader.hasBlockCompressedExtension(outFile);
- }
-
- private VariantContextWriter createVCFWriter(final File writerFile, final OutputStream writerStream) {
- if (idxCreator == null) {
- return new VCFWriter(writerFile, writerStream, refDict,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD));
- }
- else {
- return new VCFWriter(writerFile, writerStream, refDict, idxCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD));
- }
- }
-
- private VariantContextWriter createBCFWriter(final File writerFile, final OutputStream writerStream) {
- if (idxCreator == null) {
- return new BCF2Writer(writerFile, writerStream, refDict,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES));
- }
- else {
- return new BCF2Writer(writerFile, writerStream, refDict, idxCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES));
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java b/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java
deleted file mode 100644
index e1e0026..0000000
--- a/src/main/java/htsjdk/variant/variantcontext/writer/VariantContextWriterFactory.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.index.IndexCreator;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndexCreator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.EnumSet;
-
-/**
- * Factory methods to create VariantContext writers
- *
- * @author depristo
- * @since 5/12
- *
- * @deprecated Replaced by {@link VariantContextWriterBuilder}
- */
- at Deprecated
-public class VariantContextWriterFactory {
-
- public static final EnumSet<Options> DEFAULT_OPTIONS = EnumSet.of(Options.INDEX_ON_THE_FLY);
- public static final EnumSet<Options> NO_OPTIONS = EnumSet.noneOf(Options.class);
-
- static {
- if (Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE) {
- DEFAULT_OPTIONS.add(Options.USE_ASYNC_IO);
- }
- }
-
- private VariantContextWriterFactory() {}
-
- public static VariantContextWriter create(final File location, final SAMSequenceDictionary refDict) {
- return create(location, openOutputStream(location), refDict, DEFAULT_OPTIONS);
- }
-
- public static VariantContextWriter create(final File location, final SAMSequenceDictionary refDict, final EnumSet<Options> options) {
- return create(location, openOutputStream(location), refDict, options);
- }
-
- /**
- * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
- */
- public static VariantContextWriter create(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict) {
- return create(location, output, refDict, DEFAULT_OPTIONS);
- }
-
- /**
- * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
- */
- public static VariantContextWriter create(final OutputStream output,
- final SAMSequenceDictionary refDict,
- final EnumSet<Options> options) {
- return create(null, output, refDict, options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
- * but does not control where the file is written
- * @param output This is where the BCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createBcf2(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final EnumSet<Options> options) {
- return maybeWrapWithAsyncWriter(new BCF2Writer(location, output, refDict,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES)), options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
- * but does not control where the file is written
- * @param output This is where the BCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createBcf2(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator,
- final EnumSet<Options> options) {
- return maybeWrapWithAsyncWriter(new BCF2Writer(location, output, refDict, indexCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES)), options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
- * but does not control where the file is written
- * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createVcf(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final EnumSet<Options> options) {
- return maybeWrapWithAsyncWriter(new VCFWriter(location, output, refDict,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages, and for naming the index,
- * but does not control where the file is written
- * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createVcf(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator,
- final EnumSet<Options> options) {
- return maybeWrapWithAsyncWriter(new VCFWriter(location, output, refDict, indexCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages,
- * but does not control where the file is written
- * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createBlockCompressedVcf(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final EnumSet<Options> options) {
- final TabixIndexCreator indexCreator;
- if (options.contains(Options.INDEX_ON_THE_FLY)) {
- indexCreator = new TabixIndexCreator(refDict, TabixFormat.VCF);
- } else {
- indexCreator = null;
- }
- return maybeWrapWithAsyncWriter(new VCFWriter(location, BlockCompressedOutputStream.maybeBgzfWrapOutputStream(location, output),
- refDict, indexCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
- }
-
- /**
- * @param location Note that this parameter is used to producing intelligent log messages,
- * but does not control where the file is written
- * @param output This is where the VCF is actually written. If buffered writing is desired, caller must provide
- * some kind of buffered OutputStream.
- */
- public static VariantContextWriter createBlockCompressedVcf(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator,
- final EnumSet<Options> options) {
- return maybeWrapWithAsyncWriter(new VCFWriter(location, BlockCompressedOutputStream.maybeBgzfWrapOutputStream(location, output),
- refDict, indexCreator,
- options.contains(Options.INDEX_ON_THE_FLY),
- options.contains(Options.DO_NOT_WRITE_GENOTYPES),
- options.contains(Options.ALLOW_MISSING_FIELDS_IN_HEADER),
- options.contains(Options.WRITE_FULL_FORMAT_FIELD)), options);
- }
-
- public static VariantContextWriter create(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final EnumSet<Options> options) {
-
- if (isBCFOutput(location, options)) {
- return createBcf2(location, output, refDict, options);
- } else if (isCompressedVcf(location)) {
- return createBlockCompressedVcf(location, output, refDict, options);
- } else {
- return createVcf(location, output, refDict, options);
- }
- }
-
- /**
- * @param output If buffered writing is desired, caller must provide some kind of buffered OutputStream.
- */
- public static VariantContextWriter create(final File location,
- final OutputStream output,
- final SAMSequenceDictionary refDict,
- final IndexCreator indexCreator,
- final EnumSet<Options> options) {
-
- if (isBCFOutput(location, options)) {
- return createBcf2(location, output, refDict, indexCreator, options);
- } else if (isCompressedVcf(location)) {
- return createBlockCompressedVcf(location, output, refDict, indexCreator, options);
- } else {
- return createVcf(location, output, refDict, indexCreator, options);
- }
- }
-
- private static VariantContextWriter maybeWrapWithAsyncWriter(final VariantContextWriter writer,
- final EnumSet<Options> options) {
- if (options.contains(Options.USE_ASYNC_IO)) {
- return new AsyncVariantContextWriter(writer, AsyncVariantContextWriter.DEFAULT_QUEUE_SIZE);
- }
- else return writer;
- }
-
- /**
- * Should we output a BCF file based solely on the name of the file at location?
- *
- * @param location
- * @return
- */
- public static boolean isBCFOutput(final File location) {
- return isBCFOutput(location, EnumSet.noneOf(Options.class));
- }
-
- public static boolean isBCFOutput(final File location, final EnumSet<Options> options) {
- return options.contains(Options.FORCE_BCF) || (location != null && location.getName().contains(".bcf"));
- }
-
- public static boolean isCompressedVcf(final File location) {
- if (location == null)
- return false;
-
- return AbstractFeatureReader.hasBlockCompressedExtension(location);
- }
-
- public static VariantContextWriter sortOnTheFly(final VariantContextWriter innerWriter, final int maxCachingStartDistance) {
- return sortOnTheFly(innerWriter, maxCachingStartDistance, false);
- }
-
- public static VariantContextWriter sortOnTheFly(final VariantContextWriter innerWriter, final int maxCachingStartDistance, final boolean takeOwnershipOfInner) {
- return new SortingVariantContextWriter(innerWriter, maxCachingStartDistance, takeOwnershipOfInner);
- }
-
- /**
- * Returns a output stream writing to location, or throws an exception if this fails
- * @param location
- * @return
- */
- protected static OutputStream openOutputStream(final File location) {
- try {
- return IOUtil.maybeBufferOutputStream(new FileOutputStream(location));
- } catch (final FileNotFoundException e) {
- throw new RuntimeIOException(location + ": Unable to create VCF writer", e);
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java b/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java
deleted file mode 100644
index 16857b4..0000000
--- a/src/main/java/htsjdk/variant/vcf/AbstractVCFCodec.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.BlockCompressedInputStream;
-import htsjdk.tribble.AsciiFeatureCodec;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.NameAwareCodec;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypeLikelihoods;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.zip.GZIPInputStream;
-
-
-public abstract class AbstractVCFCodec extends AsciiFeatureCodec<VariantContext> implements NameAwareCodec {
- public final static int MAX_ALLELE_SIZE_BEFORE_WARNING = (int)Math.pow(2, 20);
-
- protected final static int NUM_STANDARD_FIELDS = 8; // INFO is the 8th column
-
- // we have to store the list of strings that make up the header until they're needed
- protected VCFHeader header = null;
- protected VCFHeaderVersion version = null;
-
- // a mapping of the allele
- protected Map<String, List<Allele>> alleleMap = new HashMap<String, List<Allele>>(3);
-
- // for performance testing purposes
- public static boolean validate = true;
-
- // a key optimization -- we need a per thread string parts array, so we don't allocate a big array over and over
- // todo: make this thread safe?
- protected String[] parts = null;
- protected String[] genotypeParts = null;
- protected final String[] locParts = new String[6];
-
- // for performance we cache the hashmap of filter encodings for quick lookup
- protected HashMap<String,List<String>> filterHash = new HashMap<String,List<String>>();
-
- // we store a name to give to each of the variant contexts we emit
- protected String name = "Unknown";
-
- protected int lineNo = 0;
-
- protected Map<String, String> stringCache = new HashMap<String, String>();
-
- protected boolean warnedAboutNoEqualsForNonFlag = false;
-
- /**
- * If true, then we'll magically fix up VCF headers on the fly when we read them in
- */
- protected boolean doOnTheFlyModifications = true;
-
- /**
- * If non-null, we will replace the sample name read from the VCF header with this sample name. This feature works
- * only for single-sample VCFs.
- */
- protected String remappedSampleName = null;
-
- protected AbstractVCFCodec() {
- super(VariantContext.class);
- }
-
- /**
- * Creates a LazyParser for a LazyGenotypesContext to use to decode
- * our genotypes only when necessary. We do this instead of eagarly
- * decoding the genotypes just to turn around and reencode in the frequent
- * case where we don't actually want to manipulate the genotypes
- */
- class LazyVCFGenotypesParser implements LazyGenotypesContext.LazyParser {
- final List<Allele> alleles;
- final String contig;
- final int start;
-
- LazyVCFGenotypesParser(final List<Allele> alleles, final String contig, final int start) {
- this.alleles = alleles;
- this.contig = contig;
- this.start = start;
- }
-
- @Override
- public LazyGenotypesContext.LazyData parse(final Object data) {
- //System.out.printf("Loading genotypes... %s:%d%n", contig, start);
- return createGenotypeMap((String) data, alleles, contig, start);
- }
- }
-
- /**
- * parse the filter string, first checking to see if we already have parsed it in a previous attempt
- * @param filterString the string to parse
- * @return a set of the filters applied
- */
- protected abstract List<String> parseFilters(String filterString);
-
- /**
- * create a VCF header from a set of header record lines
- *
- * @param headerStrings a list of strings that represent all the ## and # entries
- * @return a VCFHeader object
- */
- protected VCFHeader parseHeaderFromLines( final List<String> headerStrings, final VCFHeaderVersion version ) {
- this.version = version;
-
- Set<VCFHeaderLine> metaData = new LinkedHashSet<VCFHeaderLine>();
- Set<String> sampleNames = new LinkedHashSet<String>();
- int contigCounter = 0;
- // iterate over all the passed in strings
- for ( String str : headerStrings ) {
- if ( !str.startsWith(VCFHeader.METADATA_INDICATOR) ) {
- String[] strings = str.substring(1).split(VCFConstants.FIELD_SEPARATOR);
- if ( strings.length < VCFHeader.HEADER_FIELDS.values().length )
- throw new TribbleException.InvalidHeader("there are not enough columns present in the header line: " + str);
-
- int arrayIndex = 0;
- for (VCFHeader.HEADER_FIELDS field : VCFHeader.HEADER_FIELDS.values()) {
- try {
- if (field != VCFHeader.HEADER_FIELDS.valueOf(strings[arrayIndex]))
- throw new TribbleException.InvalidHeader("we were expecting column name '" + field + "' but we saw '" + strings[arrayIndex] + "'");
- } catch (IllegalArgumentException e) {
- throw new TribbleException.InvalidHeader("unknown column name '" + strings[arrayIndex] + "'; it does not match a legal column header name.");
- }
- arrayIndex++;
- }
-
- boolean sawFormatTag = false;
- if ( arrayIndex < strings.length ) {
- if ( !strings[arrayIndex].equals("FORMAT") )
- throw new TribbleException.InvalidHeader("we were expecting column name 'FORMAT' but we saw '" + strings[arrayIndex] + "'");
- sawFormatTag = true;
- arrayIndex++;
- }
-
- while ( arrayIndex < strings.length )
- sampleNames.add(strings[arrayIndex++]);
-
- if ( sawFormatTag && sampleNames.isEmpty())
- throw new TribbleException.InvalidHeader("The FORMAT field was provided but there is no genotype/sample data");
-
- // If we're performing sample name remapping and there is exactly one sample specified in the header, replace
- // it with the remappedSampleName. Throw an error if there are 0 or multiple samples and remapping was requested
- // for this file.
- if ( remappedSampleName != null ) {
- // We currently only support on-the-fly sample name remapping for single-sample VCFs
- if ( sampleNames.isEmpty() || sampleNames.size() > 1 ) {
- throw new TribbleException(String.format("Cannot remap sample name to %s because %s samples are specified in the VCF header, and on-the-fly sample name remapping is only supported for single-sample VCFs",
- remappedSampleName, sampleNames.isEmpty() ? "no" : "multiple"));
- }
-
- sampleNames.clear();
- sampleNames.add(remappedSampleName);
- }
-
- } else {
- if ( str.startsWith(VCFConstants.INFO_HEADER_START) ) {
- final VCFInfoHeaderLine info = new VCFInfoHeaderLine(str.substring(7), version);
- metaData.add(info);
- } else if ( str.startsWith(VCFConstants.FILTER_HEADER_START) ) {
- final VCFFilterHeaderLine filter = new VCFFilterHeaderLine(str.substring(9), version);
- metaData.add(filter);
- } else if ( str.startsWith(VCFConstants.FORMAT_HEADER_START) ) {
- final VCFFormatHeaderLine format = new VCFFormatHeaderLine(str.substring(9), version);
- metaData.add(format);
- } else if ( str.startsWith(VCFConstants.CONTIG_HEADER_START) ) {
- final VCFContigHeaderLine contig = new VCFContigHeaderLine(str.substring(9), version, VCFConstants.CONTIG_HEADER_START.substring(2), contigCounter++);
- metaData.add(contig);
- } else if ( str.startsWith(VCFConstants.ALT_HEADER_START) ) {
- final VCFSimpleHeaderLine alt = new VCFSimpleHeaderLine(str.substring(6), version, VCFConstants.ALT_HEADER_START.substring(2), Arrays.asList("ID", "Description"));
- metaData.add(alt);
- } else {
- int equals = str.indexOf('=');
- if ( equals != -1 )
- metaData.add(new VCFHeaderLine(str.substring(2, equals), str.substring(equals+1)));
- }
- }
- }
-
- this.header = new VCFHeader(metaData, sampleNames);
- if ( doOnTheFlyModifications )
- this.header = VCFStandardHeaderLines.repairStandardHeaderLines(this.header);
- return this.header;
- }
-
- /**
- * Explicitly set the VCFHeader on this codec. This will overwrite the header read from the file
- * and the version state stored in this instance; conversely, reading the header from a file will
- * overwrite whatever is set here. The returned header may not be identical to the header argument
- * since the header lines may be "repaired" (i.e., rewritten) if doOnTheFlyModifications is set.
- */
- public VCFHeader setVCFHeader(final VCFHeader header, final VCFHeaderVersion version) {
- this.version = version;
-
- if (this.doOnTheFlyModifications) this.header = VCFStandardHeaderLines.repairStandardHeaderLines(header);
- else this.header = header;
-
- return this.header;
- }
-
- /**
- * the fast decode function
- * @param line the line of text for the record
- * @return a feature, (not guaranteed complete) that has the correct start and stop
- */
- public Feature decodeLoc(String line) {
- return decodeLine(line, false);
- }
-
- /**
- * decode the line into a feature (VariantContext)
- * @param line the line
- * @return a VariantContext
- */
- public VariantContext decode(String line) {
- return decodeLine(line, true);
- }
-
- private VariantContext decodeLine(final String line, final boolean includeGenotypes) {
- // the same line reader is not used for parsing the header and parsing lines, if we see a #, we've seen a header line
- if (line.startsWith(VCFHeader.HEADER_INDICATOR)) return null;
-
- // our header cannot be null, we need the genotype sample names and counts
- if (header == null) throw new TribbleException("VCF Header cannot be null when decoding a record");
-
- if (parts == null)
- parts = new String[Math.min(header.getColumnCount(), NUM_STANDARD_FIELDS+1)];
-
- final int nParts = ParsingUtils.split(line, parts, VCFConstants.FIELD_SEPARATOR_CHAR, true);
-
- // if we have don't have a header, or we have a header with no genotyping data check that we
- // have eight columns. Otherwise check that we have nine (normal columns + genotyping data)
- if (( (header == null || !header.hasGenotypingData()) && nParts != NUM_STANDARD_FIELDS) ||
- (header != null && header.hasGenotypingData() && nParts != (NUM_STANDARD_FIELDS + 1)) )
- throw new TribbleException("Line " + lineNo + ": there aren't enough columns for line " + line + " (we expected " + (header == null ? NUM_STANDARD_FIELDS : NUM_STANDARD_FIELDS + 1) +
- " tokens, and saw " + nParts + " )");
-
- return parseVCFLine(parts, includeGenotypes);
- }
-
- /**
- * parse out the VCF line
- *
- * @param parts the parts split up
- * @return a variant context object
- */
- private VariantContext parseVCFLine(final String[] parts, final boolean includeGenotypes) {
- VariantContextBuilder builder = new VariantContextBuilder();
- builder.source(getName());
-
- // increment the line count
- // TODO -- because of the way the engine utilizes Tribble, we can parse a line multiple times (especially when
- // TODO -- the first record is far along the contig) and the line counter can get out of sync
- lineNo++;
-
- // parse out the required fields
- final String chr = getCachedString(parts[0]);
- builder.chr(chr);
- int pos = -1;
- try {
- pos = Integer.valueOf(parts[1]);
- } catch (NumberFormatException e) {
- generateException(parts[1] + " is not a valid start position in the VCF format");
- }
- builder.start(pos);
-
- if ( parts[2].isEmpty() )
- generateException("The VCF specification requires a valid ID field");
- else if ( parts[2].equals(VCFConstants.EMPTY_ID_FIELD) )
- builder.noID();
- else
- builder.id(parts[2]);
-
- final String ref = getCachedString(parts[3].toUpperCase());
- final String alts = getCachedString(parts[4]);
- builder.log10PError(parseQual(parts[5]));
-
- final List<String> filters = parseFilters(getCachedString(parts[6]));
- if ( filters != null ) builder.filters(new HashSet<String>(filters));
- final Map<String, Object> attrs = parseInfo(parts[7]);
- builder.attributes(attrs);
-
- if ( attrs.containsKey(VCFConstants.END_KEY) ) {
- // update stop with the end key if provided
- try {
- builder.stop(Integer.valueOf(attrs.get(VCFConstants.END_KEY).toString()));
- } catch (Exception e) {
- generateException("the END value in the INFO field is not valid");
- }
- } else {
- builder.stop(pos + ref.length() - 1);
- }
-
- // get our alleles, filters, and setup an attribute map
- final List<Allele> alleles = parseAlleles(ref, alts, lineNo);
- builder.alleles(alleles);
-
- // do we have genotyping data
- if (parts.length > NUM_STANDARD_FIELDS && includeGenotypes) {
- final LazyGenotypesContext.LazyParser lazyParser = new LazyVCFGenotypesParser(alleles, chr, pos);
- final int nGenotypes = header.getNGenotypeSamples();
- LazyGenotypesContext lazy = new LazyGenotypesContext(lazyParser, parts[8], nGenotypes);
-
- // did we resort the sample names? If so, we need to load the genotype data
- if ( !header.samplesWereAlreadySorted() )
- lazy.decode();
-
- builder.genotypesNoValidation(lazy);
- }
-
- VariantContext vc = null;
- try {
- vc = builder.make();
- } catch (Exception e) {
- generateException(e.getMessage());
- }
-
- return vc;
- }
-
- /**
- * get the name of this codec
- * @return our set name
- */
- public String getName() {
- return name;
- }
-
- /**
- * set the name of this codec
- * @param name new name
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * Return a cached copy of the supplied string.
- *
- * @param str string
- * @return interned string
- */
- protected String getCachedString(String str) {
- String internedString = stringCache.get(str);
- if ( internedString == null ) {
- internedString = new String(str);
- stringCache.put(internedString, internedString);
- }
- return internedString;
- }
-
- /**
- * parse out the info fields
- * @param infoField the fields
- * @return a mapping of keys to objects
- */
- private Map<String, Object> parseInfo(String infoField) {
- Map<String, Object> attributes = new HashMap<String, Object>();
-
- if ( infoField.isEmpty() )
- generateException("The VCF specification requires a valid (non-zero length) info field");
-
- if ( !infoField.equals(VCFConstants.EMPTY_INFO_FIELD) ) {
- if ( infoField.indexOf('\t') != -1 || infoField.indexOf(' ') != -1 )
- generateException("The VCF specification does not allow for whitespace in the INFO field. Offending field value was \"" + infoField + "\"");
-
- List<String> infoFields = ParsingUtils.split(infoField, VCFConstants.INFO_FIELD_SEPARATOR_CHAR);
- for (int i = 0; i < infoFields.size(); i++) {
- String key;
- Object value;
-
- int eqI = infoFields.get(i).indexOf("=");
- if ( eqI != -1 ) {
- key = infoFields.get(i).substring(0, eqI);
- String valueString = infoFields.get(i).substring(eqI + 1);
-
- // split on the INFO field separator
- List<String> infoValueSplit = ParsingUtils.split(valueString, VCFConstants.INFO_FIELD_ARRAY_SEPARATOR_CHAR);
- if ( infoValueSplit.size() == 1 ) {
- value = infoValueSplit.get(0);
- final VCFInfoHeaderLine headerLine = header.getInfoHeaderLine(key);
- if ( headerLine != null && headerLine.getType() == VCFHeaderLineType.Flag && value.equals("0") ) {
- // deal with the case where a flag field has =0, such as DB=0, by skipping the add
- continue;
- }
- } else {
- value = infoValueSplit;
- }
- } else {
- key = infoFields.get(i);
- final VCFInfoHeaderLine headerLine = header.getInfoHeaderLine(key);
- if ( headerLine != null && headerLine.getType() != VCFHeaderLineType.Flag ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED && ! warnedAboutNoEqualsForNonFlag ) {
- System.err.println("Found info key " + key + " without a = value, but the header says the field is of type "
- + headerLine.getType() + " but this construct is only value for FLAG type fields");
- warnedAboutNoEqualsForNonFlag = true;
- }
-
- value = VCFConstants.MISSING_VALUE_v4;
- } else {
- value = true;
- }
- }
-
- // this line ensures that key/value pairs that look like key=; are parsed correctly as MISSING
- if ( "".equals(value) ) value = VCFConstants.MISSING_VALUE_v4;
-
- attributes.put(key, value);
- }
- }
-
- return attributes;
- }
-
- /**
- * create a an allele from an index and an array of alleles
- * @param index the index
- * @param alleles the alleles
- * @return an Allele
- */
- protected static Allele oneAllele(String index, List<Allele> alleles) {
- if ( index.equals(VCFConstants.EMPTY_ALLELE) )
- return Allele.NO_CALL;
- final int i;
- try {
- i = Integer.valueOf(index);
- } catch ( NumberFormatException e ) {
- throw new TribbleException.InternalCodecException("The following invalid GT allele index was encountered in the file: " + index);
- }
- if ( i >= alleles.size() )
- throw new TribbleException.InternalCodecException("The allele with index " + index + " is not defined in the REF/ALT columns in the record");
- return alleles.get(i);
- }
-
-
- /**
- * parse genotype alleles from the genotype string
- * @param GT GT string
- * @param alleles list of possible alleles
- * @param cache cache of alleles for GT
- * @return the allele list for the GT string
- */
- protected static List<Allele> parseGenotypeAlleles(String GT, List<Allele> alleles, Map<String, List<Allele>> cache) {
- // cache results [since they are immutable] and return a single object for each genotype
- List<Allele> GTAlleles = cache.get(GT);
-
- if ( GTAlleles == null ) {
- StringTokenizer st = new StringTokenizer(GT, VCFConstants.PHASING_TOKENS);
- GTAlleles = new ArrayList<Allele>(st.countTokens());
- while ( st.hasMoreTokens() ) {
- String genotype = st.nextToken();
- GTAlleles.add(oneAllele(genotype, alleles));
- }
- cache.put(GT, GTAlleles);
- }
-
- return GTAlleles;
- }
-
- /**
- * parse out the qual value
- * @param qualString the quality string
- * @return return a double
- */
- protected static Double parseQual(String qualString) {
- // if we're the VCF 4 missing char, return immediately
- if ( qualString.equals(VCFConstants.MISSING_VALUE_v4))
- return VariantContext.NO_LOG10_PERROR;
-
- Double val = Double.valueOf(qualString);
-
- // check to see if they encoded the missing qual score in VCF 3 style, with either the -1 or -1.0. check for val < 0 to save some CPU cycles
- if ((val < 0) && (Math.abs(val - VCFConstants.MISSING_QUALITY_v3_DOUBLE) < VCFConstants.VCF_ENCODING_EPSILON))
- return VariantContext.NO_LOG10_PERROR;
-
- // scale and return the value
- return val / -10.0;
- }
-
- /**
- * parse out the alleles
- * @param ref the reference base
- * @param alts a string of alternates to break into alleles
- * @param lineNo the line number for this record
- * @return a list of alleles, and a pair of the shortest and longest sequence
- */
- protected static List<Allele> parseAlleles(String ref, String alts, int lineNo) {
- List<Allele> alleles = new ArrayList<Allele>(2); // we are almost always biallelic
- // ref
- checkAllele(ref, true, lineNo);
- Allele refAllele = Allele.create(ref, true);
- alleles.add(refAllele);
-
- if ( alts.indexOf(',') == -1 ) // only 1 alternatives, don't call string split
- parseSingleAltAllele(alleles, alts, lineNo);
- else
- for ( String alt : alts.split(",") )
- parseSingleAltAllele(alleles, alt, lineNo);
-
- return alleles;
- }
-
- /**
- * check to make sure the allele is an acceptable allele
- * @param allele the allele to check
- * @param isRef are we the reference allele?
- * @param lineNo the line number for this record
- */
- private static void checkAllele(String allele, boolean isRef, int lineNo) {
- if ( allele == null || allele.isEmpty() )
- generateException(generateExceptionTextForBadAlleleBases(""), lineNo);
-
- if ( GeneralUtils.DEBUG_MODE_ENABLED && MAX_ALLELE_SIZE_BEFORE_WARNING != -1 && allele.length() > MAX_ALLELE_SIZE_BEFORE_WARNING ) {
- System.err.println(String.format("Allele detected with length %d exceeding max size %d at approximately line %d, likely resulting in degraded VCF processing performance", allele.length(), MAX_ALLELE_SIZE_BEFORE_WARNING, lineNo));
- }
-
- if ( isSymbolicAllele(allele) ) {
- if ( isRef ) {
- generateException("Symbolic alleles not allowed as reference allele: " + allele, lineNo);
- }
- } else {
- // check for VCF3 insertions or deletions
- if ( (allele.charAt(0) == VCFConstants.DELETION_ALLELE_v3) || (allele.charAt(0) == VCFConstants.INSERTION_ALLELE_v3) )
- generateException("Insertions/Deletions are not supported when reading 3.x VCF's. Please" +
- " convert your file to VCF4 using VCFTools, available at http://vcftools.sourceforge.net/index.html", lineNo);
-
- if (!Allele.acceptableAlleleBases(allele, isRef))
- generateException(generateExceptionTextForBadAlleleBases(allele), lineNo);
-
- if ( isRef && allele.equals(VCFConstants.EMPTY_ALLELE) )
- generateException("The reference allele cannot be missing", lineNo);
- }
- }
-
- /**
- * Generates the exception text for the case where the allele string contains unacceptable bases.
- *
- * @param allele non-null allele string
- * @return non-null exception text string
- */
- private static String generateExceptionTextForBadAlleleBases(final String allele) {
- if ( allele.isEmpty() )
- return "empty alleles are not permitted in VCF records";
- if ( allele.contains("[") || allele.contains("]") || allele.contains(":") || allele.contains(".") )
- return "VCF support for complex rearrangements with breakends has not yet been implemented";
- return "unparsable vcf record with allele " + allele;
- }
-
- /**
- * return true if this is a symbolic allele (e.g. <SOMETAG>) or
- * structural variation breakend (with [ or ]), otherwise false
- * @param allele the allele to check
- * @return true if the allele is a symbolic allele, otherwise false
- */
- private static boolean isSymbolicAllele(String allele) {
- return (allele != null && allele.length() > 2 &&
- ((allele.startsWith("<") && allele.endsWith(">")) ||
- (allele.contains("[") || allele.contains("]"))));
- }
-
- /**
- * parse a single allele, given the allele list
- * @param alleles the alleles available
- * @param alt the allele to parse
- * @param lineNo the line number for this record
- */
- private static void parseSingleAltAllele(List<Allele> alleles, String alt, int lineNo) {
- checkAllele(alt, false, lineNo);
-
- Allele allele = Allele.create(alt, false);
- if ( ! allele.isNoCall() )
- alleles.add(allele);
- }
-
- public static boolean canDecodeFile(final String potentialInput, final String MAGIC_HEADER_LINE) {
- try {
- //isVCFStream closes the stream that's passed in
- return isVCFStream(new FileInputStream(potentialInput), MAGIC_HEADER_LINE) ||
- isVCFStream(new GZIPInputStream(new FileInputStream(potentialInput)), MAGIC_HEADER_LINE) ||
- isVCFStream(new BlockCompressedInputStream(new FileInputStream(potentialInput)), MAGIC_HEADER_LINE);
- } catch ( FileNotFoundException e ) {
- return false;
- } catch ( IOException e ) {
- return false;
- }
- }
-
- private static boolean isVCFStream(final InputStream stream, final String MAGIC_HEADER_LINE) {
- try {
- byte[] buff = new byte[MAGIC_HEADER_LINE.length()];
- int nread = stream.read(buff, 0, MAGIC_HEADER_LINE.length());
- boolean eq = Arrays.equals(buff, MAGIC_HEADER_LINE.getBytes());
- return eq;
- } catch ( IOException e ) {
- return false;
- } catch ( RuntimeException e ) {
- return false;
- } finally {
- try { stream.close(); } catch ( IOException e ) {}
- }
- }
-
-
- /**
- * create a genotype map
- *
- * @param str the string
- * @param alleles the list of alleles
- * @return a mapping of sample name to genotype object
- */
- public LazyGenotypesContext.LazyData createGenotypeMap(final String str,
- final List<Allele> alleles,
- final String chr,
- final int pos) {
- if (genotypeParts == null)
- genotypeParts = new String[header.getColumnCount() - NUM_STANDARD_FIELDS];
-
- int nParts = ParsingUtils.split(str, genotypeParts, VCFConstants.FIELD_SEPARATOR_CHAR);
- if ( nParts != genotypeParts.length )
- generateException("there are " + (nParts-1) + " genotypes while the header requires that " + (genotypeParts.length-1) + " genotypes be present for all records at " + chr + ":" + pos, lineNo);
-
- ArrayList<Genotype> genotypes = new ArrayList<Genotype>(nParts);
-
- // get the format keys
- List<String> genotypeKeys = ParsingUtils.split(genotypeParts[0], VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR);
-
- // cycle through the sample names
- Iterator<String> sampleNameIterator = header.getGenotypeSamples().iterator();
-
- // clear out our allele mapping
- alleleMap.clear();
-
- // cycle through the genotype strings
- for (int genotypeOffset = 1; genotypeOffset < nParts; genotypeOffset++) {
- List<String> genotypeValues = ParsingUtils.split(genotypeParts[genotypeOffset], VCFConstants.GENOTYPE_FIELD_SEPARATOR_CHAR);
-
- final String sampleName = sampleNameIterator.next();
- final GenotypeBuilder gb = new GenotypeBuilder(sampleName);
-
- // check to see if the value list is longer than the key list, which is a problem
- if (genotypeKeys.size() < genotypeValues.size())
- generateException("There are too many keys for the sample " + sampleName + ", keys = " + parts[8] + ", values = " + parts[genotypeOffset]);
-
- int genotypeAlleleLocation = -1;
- if (!genotypeKeys.isEmpty()) {
- gb.maxAttributes(genotypeKeys.size() - 1);
-
- for (int i = 0; i < genotypeKeys.size(); i++) {
- final String gtKey = genotypeKeys.get(i);
- boolean missing = i >= genotypeValues.size();
-
- // todo -- all of these on the fly parsing of the missing value should be static constants
- if (gtKey.equals(VCFConstants.GENOTYPE_KEY)) {
- genotypeAlleleLocation = i;
- } else if ( missing ) {
- // if its truly missing (there no provided value) skip adding it to the attributes
- } else if (gtKey.equals(VCFConstants.GENOTYPE_FILTER_KEY)) {
- final List<String> filters = parseFilters(getCachedString(genotypeValues.get(i)));
- if ( filters != null ) gb.filters(filters);
- } else if ( genotypeValues.get(i).equals(VCFConstants.MISSING_VALUE_v4) ) {
- // don't add missing values to the map
- } else {
- if (gtKey.equals(VCFConstants.GENOTYPE_QUALITY_KEY)) {
- if ( genotypeValues.get(i).equals(VCFConstants.MISSING_GENOTYPE_QUALITY_v3) )
- gb.noGQ();
- else
- gb.GQ((int)Math.round(Double.valueOf(genotypeValues.get(i))));
- } else if (gtKey.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS)) {
- gb.AD(decodeInts(genotypeValues.get(i)));
- } else if (gtKey.equals(VCFConstants.GENOTYPE_PL_KEY)) {
- gb.PL(decodeInts(genotypeValues.get(i)));
- } else if (gtKey.equals(VCFConstants.GENOTYPE_LIKELIHOODS_KEY)) {
- gb.PL(GenotypeLikelihoods.fromGLField(genotypeValues.get(i)).getAsPLs());
- } else if (gtKey.equals(VCFConstants.DEPTH_KEY)) {
- gb.DP(Integer.valueOf(genotypeValues.get(i)));
- } else {
- gb.attribute(gtKey, genotypeValues.get(i));
- }
- }
- }
- }
-
- // check to make sure we found a genotype field if our version is less than 4.1 file
- if ( ! version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_1) && genotypeAlleleLocation == -1 )
- generateException("Unable to find the GT field for the record; the GT field is required before VCF4.1");
- if ( genotypeAlleleLocation > 0 )
- generateException("Saw GT field at position " + genotypeAlleleLocation + ", but it must be at the first position for genotypes when present");
-
- final List<Allele> GTalleles = (genotypeAlleleLocation == -1 ? new ArrayList<Allele>(0) : parseGenotypeAlleles(genotypeValues.get(genotypeAlleleLocation), alleles, alleleMap));
- gb.alleles(GTalleles);
- gb.phased(genotypeAlleleLocation != -1 && genotypeValues.get(genotypeAlleleLocation).indexOf(VCFConstants.PHASED) != -1);
-
- // add it to the list
- try {
- genotypes.add(gb.make());
- } catch (TribbleException e) {
- throw new TribbleException.InternalCodecException(e.getMessage() + ", at position " + chr+":"+pos);
- }
- }
-
- return new LazyGenotypesContext.LazyData(genotypes, header.getSampleNamesInOrder(), header.getSampleNameToOffset());
- }
-
- private static final int[] decodeInts(final String string) {
- List<String> split = ParsingUtils.split(string, ',');
- int [] values = new int[split.size()];
- try {
- for (int i = 0; i < values.length; i++) {
- values[i] = Integer.parseInt(split.get(i));
- }
- } catch (final NumberFormatException e) {
- return null;
- }
- return values;
- }
-
- /**
- * Forces all VCFCodecs to not perform any on the fly modifications to the VCF header
- * of VCF records. Useful primarily for raw comparisons such as when comparing
- * raw VCF records
- */
- public final void disableOnTheFlyModifications() {
- doOnTheFlyModifications = false;
- }
-
- /**
- * Replaces the sample name read from the VCF header with the remappedSampleName. Works
- * only for single-sample VCFs -- attempting to perform sample name remapping for multi-sample
- * VCFs will produce an Exception.
- *
- * @param remappedSampleName replacement sample name for the sample specified in the VCF header
- */
- public void setRemappedSampleName( final String remappedSampleName ) {
- this.remappedSampleName = remappedSampleName;
- }
-
- protected void generateException(String message) {
- throw new TribbleException(String.format("The provided VCF file is malformed at approximately line number %d: %s", lineNo, message));
- }
-
- protected static void generateException(String message, int lineNo) {
- throw new TribbleException(String.format("The provided VCF file is malformed at approximately line number %d: %s", lineNo, message));
- }
-
- @Override
- public TabixFormat getTabixFormat() {
- return TabixFormat.VCF;
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCF3Codec.java b/src/main/java/htsjdk/variant/vcf/VCF3Codec.java
deleted file mode 100644
index 5f4f48e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCF3Codec.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * A feature codec for the VCF3 specification, to read older VCF files. VCF3 has been
- * depreciated in favor of VCF4 (See VCF codec for the latest information)
- *
- * <p>
- * Reads historical VCF3 encoded files (1000 Genomes Pilot results, for example)
- * </p>
- *
- * <p>
- * See also: @see <a href="http://vcftools.sourceforge.net/specs.html">VCF specification</a><br>
- * See also: @see <a href="http://www.ncbi.nlm.nih.gov/pubmed/21653522">VCF spec. publication</a>
- * </p>
- *
- * @author Mark DePristo
- * @since 2010
- */
-public class VCF3Codec extends AbstractVCFCodec {
- public final static String VCF3_MAGIC_HEADER = "##fileformat=VCFv3";
-
- /**
- * @param reader the line reader to take header lines from
- * @return the number of header lines
- */
- public Object readActualHeader(final LineIterator reader) {
- final List<String> headerStrings = new ArrayList<String>();
-
- VCFHeaderVersion version = null;
- boolean foundHeaderVersion = false;
- while (reader.hasNext()) {
- lineNo++;
- final String line = reader.peek();
- if (line.startsWith(VCFHeader.METADATA_INDICATOR)) {
- final String[] lineFields = line.substring(2).split("=");
- if (lineFields.length == 2 && VCFHeaderVersion.isFormatString(lineFields[0]) ) {
- if ( !VCFHeaderVersion.isVersionString(lineFields[1]) )
- throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
- foundHeaderVersion = true;
- version = VCFHeaderVersion.toHeaderVersion(lineFields[1]);
- if ( version != VCFHeaderVersion.VCF3_3 && version != VCFHeaderVersion.VCF3_2 )
- throw new TribbleException.InvalidHeader("This codec is strictly for VCFv3 and does not support " + lineFields[1]);
- }
- headerStrings.add(reader.next());
- }
- else if (line.startsWith(VCFHeader.HEADER_INDICATOR)) {
- if (!foundHeaderVersion) {
- throw new TribbleException.InvalidHeader("We never saw a header line specifying VCF version");
- }
- headerStrings.add(reader.next());
- return super.parseHeaderFromLines(headerStrings, version);
- }
- else {
- throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
- }
-
- }
- throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
- }
-
-
- /**
- * parse the filter string, first checking to see if we already have parsed it in a previous attempt
- * @param filterString the string to parse
- * @return a set of the filters applied
- */
- protected List<String> parseFilters(String filterString) {
-
- // null for unfiltered
- if ( filterString.equals(VCFConstants.UNFILTERED) )
- return null;
-
- // empty set for passes filters
- List<String> fFields = new ArrayList<String>();
-
- if ( filterString.equals(VCFConstants.PASSES_FILTERS_v3) )
- return new ArrayList<String>(fFields);
-
- if (filterString.isEmpty())
- generateException("The VCF specification requires a valid filter status");
-
- // do we have the filter string cached?
- if ( filterHash.containsKey(filterString) )
- return new ArrayList<String>(filterHash.get(filterString));
-
- // otherwise we have to parse and cache the value
- if ( filterString.indexOf(VCFConstants.FILTER_CODE_SEPARATOR) == -1 )
- fFields.add(filterString);
- else
- fFields.addAll(Arrays.asList(filterString.split(VCFConstants.FILTER_CODE_SEPARATOR)));
-
- filterHash.put(filterString, fFields);
-
- return fFields;
- }
-
- @Override
- public boolean canDecode(final String potentialInput) {
- return canDecodeFile(potentialInput, VCF3_MAGIC_HEADER);
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFCodec.java b/src/main/java/htsjdk/variant/vcf/VCFCodec.java
deleted file mode 100644
index 89d6881..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFCodec.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.LineIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * A feature codec for the VCF 4 specification
- *
- * <p>
- * VCF is a text file format (most likely stored in a compressed manner). It contains meta-information lines, a
- * header line, and then data lines each containing information about a position in the genome.
- * </p>
- * <p>One of the main uses of next-generation sequencing is to discover variation amongst large populations
- * of related samples. Recently the format for storing next-generation read alignments has been
- * standardised by the SAM/BAM file format specification. This has significantly improved the
- * interoperability of next-generation tools for alignment, visualisation, and variant calling.
- * We propose the Variant Call Format (VCF) as a standarised format for storing the most prevalent
- * types of sequence variation, including SNPs, indels and larger structural variants, together
- * with rich annotations. VCF is usually stored in a compressed manner and can be indexed for
- * fast data retrieval of variants from a range of positions on the reference genome.
- * The format was developed for the 1000 Genomes Project, and has also been adopted by other projects
- * such as UK10K, dbSNP, or the NHLBI Exome Project. VCFtools is a software suite that implements
- * various utilities for processing VCF files, including validation, merging and comparing,
- * and also provides a general Perl and Python API.
- * The VCF specification and VCFtools are available from http://vcftools.sourceforge.net.</p>
- *
- * <p>
- * See also: @see <a href="http://vcftools.sourceforge.net/specs.html">VCF specification</a><br>
- * See also: @see <a href="http://www.ncbi.nlm.nih.gov/pubmed/21653522">VCF spec. publication</a>
- * </p>
- *
- * <h2>File format example</h2>
- * <pre>
- * ##fileformat=VCFv4.0
- * #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878
- * chr1 109 . A T 0 PASS AC=1 GT:AD:DP:GL:GQ 0/1:610,327:308:-316.30,-95.47,-803.03:99
- * chr1 147 . C A 0 PASS AC=1 GT:AD:DP:GL:GQ 0/1:294,49:118:-57.87,-34.96,-338.46:99
- * </pre>
- *
- * @author Mark DePristo
- * @since 2010
- */
-public class VCFCodec extends AbstractVCFCodec {
- // Our aim is to read in the records and convert to VariantContext as quickly as possible, relying on VariantContext to do the validation of any contradictory (or malformed) record parameters.
- public final static String VCF4_MAGIC_HEADER = "##fileformat=VCFv4";
-
- /**
- * Reads all of the header from the provided iterator, but no reads no further.
- * @param lineIterator the line reader to take header lines from
- * @return The parsed header
- */
- @Override
- public Object readActualHeader(final LineIterator lineIterator) {
- final List<String> headerStrings = new ArrayList<String>();
-
- String line;
- boolean foundHeaderVersion = false;
- while (lineIterator.hasNext()) {
- line = lineIterator.peek();
- lineNo++;
- if (line.startsWith(VCFHeader.METADATA_INDICATOR)) {
- final String[] lineFields = line.substring(2).split("=");
- if (lineFields.length == 2 && VCFHeaderVersion.isFormatString(lineFields[0]) ) {
- if ( !VCFHeaderVersion.isVersionString(lineFields[1]) )
- throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
- foundHeaderVersion = true;
- version = VCFHeaderVersion.toHeaderVersion(lineFields[1]);
- if ( ! version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) )
- throw new TribbleException.InvalidHeader("This codec is strictly for VCFv4; please use the VCF3 codec for " + lineFields[1]);
- if ( version != VCFHeaderVersion.VCF4_0 && version != VCFHeaderVersion.VCF4_1 && version != VCFHeaderVersion.VCF4_2 )
- throw new TribbleException.InvalidHeader("This codec is strictly for VCFv4 and does not support " + lineFields[1]);
- }
- headerStrings.add(lineIterator.next());
- }
- else if (line.startsWith(VCFHeader.HEADER_INDICATOR)) {
- if (!foundHeaderVersion) {
- throw new TribbleException.InvalidHeader("We never saw a header line specifying VCF version");
- }
- headerStrings.add(lineIterator.next());
- super.parseHeaderFromLines(headerStrings, version);
- return this.header;
- }
- else {
- throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
- }
-
- }
- throw new TribbleException.InvalidHeader("We never saw the required CHROM header line (starting with one #) for the input VCF file");
- }
-
- /**
- * parse the filter string, first checking to see if we already have parsed it in a previous attempt
- *
- * @param filterString the string to parse
- * @return a set of the filters applied or null if filters were not applied to the record (e.g. as per the missing value in a VCF)
- */
- protected List<String> parseFilters(final String filterString) {
- // null for unfiltered
- if ( filterString.equals(VCFConstants.UNFILTERED) )
- return null;
-
- if ( filterString.equals(VCFConstants.PASSES_FILTERS_v4) )
- return Collections.emptyList();
- if ( filterString.equals(VCFConstants.PASSES_FILTERS_v3) )
- generateException(VCFConstants.PASSES_FILTERS_v3 + " is an invalid filter name in vcf4", lineNo);
- if (filterString.isEmpty())
- generateException("The VCF specification requires a valid filter status: filter was " + filterString, lineNo);
-
- // do we have the filter string cached?
- if ( filterHash.containsKey(filterString) )
- return filterHash.get(filterString);
-
- // empty set for passes filters
- final List<String> fFields = new LinkedList<String>();
- // otherwise we have to parse and cache the value
- if ( !filterString.contains(VCFConstants.FILTER_CODE_SEPARATOR) )
- fFields.add(filterString);
- else
- fFields.addAll(Arrays.asList(filterString.split(VCFConstants.FILTER_CODE_SEPARATOR)));
-
- filterHash.put(filterString, Collections.unmodifiableList(fFields));
-
- return fFields;
- }
-
- @Override
- public boolean canDecode(final String potentialInput) {
- return canDecodeFile(potentialInput, VCF4_MAGIC_HEADER);
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java
deleted file mode 100644
index 48e0cdf..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFCompoundHeaderLine.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.GenotypeLikelihoods;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * a base class for compound header lines, which include info lines and format lines (so far)
- */
-public abstract class VCFCompoundHeaderLine extends VCFHeaderLine implements VCFIDHeaderLine {
-
- public enum SupportedHeaderLineType {
- INFO(true), FORMAT(false);
-
- public final boolean allowFlagValues;
- SupportedHeaderLineType(boolean flagValues) {
- allowFlagValues = flagValues;
- }
- }
-
- // the field types
- private String name;
- private int count = -1;
- private VCFHeaderLineCount countType;
- private String description;
- private VCFHeaderLineType type;
-
- // access methods
- public String getID() { return name; }
- public String getDescription() { return description; }
- public VCFHeaderLineType getType() { return type; }
- public VCFHeaderLineCount getCountType() { return countType; }
- public boolean isFixedCount() { return countType == VCFHeaderLineCount.INTEGER; }
- public int getCount() {
- if (!isFixedCount())
- throw new TribbleException("Asking for header line count when type is not an integer");
- return count;
- }
-
- /**
- * Get the number of values expected for this header field, given the properties of VariantContext vc
- *
- * If the count is a fixed count, return that. For example, a field with size of 1 in the header returns 1
- * If the count is of type A, return vc.getNAlleles - 1
- * If the count is of type R, return vc.getNAlleles
- * If the count is of type G, return the expected number of genotypes given the number of alleles in VC and the
- * max ploidy among all samples. Note that if the max ploidy of the VC is 0 (there's no GT information
- * at all, then implicitly assume diploid samples when computing G values.
- * If the count is UNBOUNDED return -1
- *
- * @param vc
- * @return
- */
- public int getCount(final VariantContext vc) {
- switch (countType) {
- case INTEGER:
- return count;
- case UNBOUNDED:
- return -1;
- case A:
- return vc.getNAlleles() - 1;
- case R:
- return vc.getNAlleles();
- case G:
- final int ploidy = vc.getMaxPloidy(2);
- return GenotypeLikelihoods.numLikelihoods(vc.getNAlleles(), ploidy);
- default:
- throw new TribbleException("Unknown count type: " + countType);
- }
- }
-
- public void setNumberToUnbounded() {
- countType = VCFHeaderLineCount.UNBOUNDED;
- count = -1;
- }
-
- // our type of line, i.e. format, info, etc
- private final SupportedHeaderLineType lineType;
-
- /**
- * create a VCF format header line
- *
- * @param name the name for this header line
- * @param count the count for this header line
- * @param type the type for this header line
- * @param description the description for this header line
- * @param lineType the header line type
- */
- protected VCFCompoundHeaderLine(String name, int count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) {
- super(lineType.toString(), "");
- this.name = name;
- this.countType = VCFHeaderLineCount.INTEGER;
- this.count = count;
- this.type = type;
- this.description = description;
- this.lineType = lineType;
- validate();
- }
-
- /**
- * create a VCF format header line
- *
- * @param name the name for this header line
- * @param count the count type for this header line
- * @param type the type for this header line
- * @param description the description for this header line
- * @param lineType the header line type
- */
- protected VCFCompoundHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description, SupportedHeaderLineType lineType) {
- super(lineType.toString(), "");
- this.name = name;
- this.countType = count;
- this.type = type;
- this.description = description;
- this.lineType = lineType;
- validate();
- }
-
- /**
- * create a VCF format header line
- *
- * @param line the header line
- * @param version the VCF header version
- * @param lineType the header line type
- *
- */
- protected VCFCompoundHeaderLine(String line, VCFHeaderVersion version, SupportedHeaderLineType lineType) {
- super(lineType.toString(), "");
-
- final ArrayList<String> expectedTags = new ArrayList(Arrays.asList("ID", "Number", "Type", "Description"));
- if (version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_2))
- expectedTags.add("Version");
- final Map<String, String> mapping = VCFHeaderLineTranslator.parseLine(version, line, expectedTags);
- name = mapping.get("ID");
- count = -1;
- final String numberStr = mapping.get("Number");
- if (numberStr.equals(VCFConstants.PER_ALTERNATE_COUNT)) {
- countType = VCFHeaderLineCount.A;
- } else if (numberStr.equals(VCFConstants.PER_ALLELE_COUNT)) {
- countType = VCFHeaderLineCount.R;
- } else if (numberStr.equals(VCFConstants.PER_GENOTYPE_COUNT)) {
- countType = VCFHeaderLineCount.G;
- } else if ((version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) && numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v4)) ||
- (!version.isAtLeastAsRecentAs(VCFHeaderVersion.VCF4_0) && numberStr.equals(VCFConstants.UNBOUNDED_ENCODING_v3))) {
- countType = VCFHeaderLineCount.UNBOUNDED;
- } else {
- countType = VCFHeaderLineCount.INTEGER;
- count = Integer.valueOf(numberStr);
-
- }
-
- if (count < 0 && countType == VCFHeaderLineCount.INTEGER)
- throw new TribbleException.InvalidHeader("Count < 0 for fixed size VCF header field " + name);
-
- try {
- type = VCFHeaderLineType.valueOf(mapping.get("Type"));
- } catch (Exception e) {
- throw new TribbleException(mapping.get("Type") + " is not a valid type in the VCF specification (note that types are case-sensitive)");
- }
- if (type == VCFHeaderLineType.Flag && !allowFlagValues())
- throw new IllegalArgumentException("Flag is an unsupported type for this kind of field");
-
- description = mapping.get("Description");
- if (description == null && ALLOW_UNBOUND_DESCRIPTIONS) // handle the case where there's no description provided
- description = UNBOUND_DESCRIPTION;
-
- this.lineType = lineType;
-
- validate();
- }
-
- private void validate() {
- if (name == null || type == null || description == null || lineType == null)
- throw new IllegalArgumentException(String.format("Invalid VCFCompoundHeaderLine: key=%s name=%s type=%s desc=%s lineType=%s",
- super.getKey(), name, type, description, lineType));
- if (name.contains("<") || name.contains(">"))
- throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets");
- if (name.contains("="))
- throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain an equals sign");
-
- if (type == VCFHeaderLineType.Flag && count != 0) {
- count = 0;
- if (GeneralUtils.DEBUG_MODE_ENABLED) {
- System.err.println("FLAG fields must have a count value of 0, but saw " + count + " for header line " + getID() + ". Changing it to 0 inside the code");
- }
- }
- }
-
- /**
- * make a string representation of this header line
- * @return a string representation
- */
- protected String toStringEncoding() {
- Map<String, Object> map = new LinkedHashMap<String, Object>();
- map.put("ID", name);
- Object number;
- switch (countType) {
- case A:
- number = VCFConstants.PER_ALTERNATE_COUNT;
- break;
- case R:
- number = VCFConstants.PER_ALLELE_COUNT;
- break;
- case G:
- number = VCFConstants.PER_GENOTYPE_COUNT;
- break;
- case UNBOUNDED:
- number = VCFConstants.UNBOUNDED_ENCODING_v4;
- break;
- case INTEGER:
- default:
- number = count;
- }
- map.put("Number", number);
- map.put("Type", type);
- map.put("Description", description);
- return lineType.toString() + "=" + VCFHeaderLine.toStringEncoding(map);
- }
-
- /**
- * returns true if we're equal to another compound header line
- * @param o a compound header line
- * @return true if equal
- */
- @Override
- public boolean equals(final Object o) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
- return false;
- }
-
- final VCFCompoundHeaderLine that = (VCFCompoundHeaderLine) o;
- return equalsExcludingDescription(that) &&
- description.equals(that.description);
- }
-
- @Override
- public int hashCode() {
- int result = super.hashCode();
- result = 31 * result + name.hashCode();
- result = 31 * result + count;
- result = 31 * result + (countType != null ? countType.hashCode() : 0); // only nullable field according to validate()
- result = 31 * result + description.hashCode();
- result = 31 * result + type.hashCode();
- result = 31 * result + lineType.hashCode();
- return result;
- }
-
- public boolean equalsExcludingDescription(VCFCompoundHeaderLine other) {
- return count == other.count &&
- countType == other.countType &&
- type == other.type &&
- lineType == other.lineType &&
- name.equals(other.name);
- }
-
- public boolean sameLineTypeAndName(VCFCompoundHeaderLine other) {
- return lineType == other.lineType &&
- name.equals(other.name);
- }
-
- /**
- * do we allow flag (boolean) values? (i.e. booleans where you don't have specify the value, AQ means AQ=true)
- * @return true if we do, false otherwise
- */
- abstract boolean allowFlagValues();
-
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFConstants.java b/src/main/java/htsjdk/variant/vcf/VCFConstants.java
deleted file mode 100644
index 6a52d1d..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFConstants.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.Locale;
-
-public final class VCFConstants {
- public static final Locale VCF_LOCALE = Locale.US;
-
- // reserved INFO/FORMAT field keys
- public static final String ANCESTRAL_ALLELE_KEY = "AA";
- public static final String ALLELE_COUNT_KEY = "AC";
- public static final String ALLELE_FREQUENCY_KEY = "AF";
- public static final String ALLELE_NUMBER_KEY = "AN";
- public static final String RMS_BASE_QUALITY_KEY = "BQ";
- public static final String CIGAR_KEY = "CIGAR";
- public static final String DBSNP_KEY = "DB";
- public static final String DEPTH_KEY = "DP";
- public static final String END_KEY = "END";
-
- public static final String GENOTYPE_FILTER_KEY = "FT";
- public static final String GENOTYPE_KEY = "GT";
- public static final String GENOTYPE_POSTERIORS_KEY = "GP";
- public static final String GENOTYPE_QUALITY_KEY = "GQ";
- public static final String GENOTYPE_ALLELE_DEPTHS = "AD"; //AD isn't reserved, but is specifically handled by VariantContext
- public static final String GENOTYPE_PL_KEY = "PL"; // phred-scaled genotype likelihoods
- public static final String EXPECTED_ALLELE_COUNT_KEY = "EC";
- @Deprecated public static final String GENOTYPE_LIKELIHOODS_KEY = "GL"; // log10 scaled genotype likelihoods
-
- public static final String HAPMAP2_KEY = "H2";
- public static final String HAPMAP3_KEY = "H3";
- public static final String HAPLOTYPE_QUALITY_KEY = "HQ";
- public static final String RMS_MAPPING_QUALITY_KEY = "MQ";
- public static final String MAPPING_QUALITY_ZERO_KEY = "MQ0";
- public static final String SAMPLE_NUMBER_KEY = "NS";
- public static final String PHASE_QUALITY_KEY = "PQ";
- public static final String PHASE_SET_KEY = "PS";
- public static final String OLD_DEPTH_KEY = "RD";
- public static final String STRAND_BIAS_KEY = "SB";
- public static final String SOMATIC_KEY = "SOMATIC";
- public static final String VALIDATED_KEY = "VALIDATED";
- public static final String THOUSAND_GENOMES_KEY = "1000G";
-
- // reserved INFO for structural variants
- /** INFO Type of structural variant */
- public static final String SVTYPE = "SVTYPE";
-
- // separators
- public static final String FORMAT_FIELD_SEPARATOR = ":";
- public static final String GENOTYPE_FIELD_SEPARATOR = ":";
- public static final char GENOTYPE_FIELD_SEPARATOR_CHAR = ':';
- public static final String FIELD_SEPARATOR = "\t";
- public static final char FIELD_SEPARATOR_CHAR = '\t';
- public static final String FILTER_CODE_SEPARATOR = ";";
- public static final String INFO_FIELD_ARRAY_SEPARATOR = ",";
- public static final char INFO_FIELD_ARRAY_SEPARATOR_CHAR = ',';
- public static final String ID_FIELD_SEPARATOR = ";";
- public static final String INFO_FIELD_SEPARATOR = ";";
- public static final char INFO_FIELD_SEPARATOR_CHAR = ';';
- public static final String UNPHASED = "/";
- public static final String PHASED = "|";
- public static final String PHASED_SWITCH_PROB_v3 = "\\";
- public static final String PHASING_TOKENS = "/|\\";
-
- // header lines
- public static final String FILTER_HEADER_START = "##FILTER";
- public static final String FORMAT_HEADER_START = "##FORMAT";
- public static final String INFO_HEADER_START = "##INFO";
- public static final String ALT_HEADER_START = "##ALT";
- public static final String CONTIG_HEADER_KEY = "contig";
- public static final String CONTIG_HEADER_START = "##" + CONTIG_HEADER_KEY;
-
- // old indel alleles
- public static final char DELETION_ALLELE_v3 = 'D';
- public static final char INSERTION_ALLELE_v3 = 'I';
-
- // special alleles
- public static final char SPANNING_DELETION_ALLELE = '*';
- public static final char NO_CALL_ALLELE = '.';
- public static final char NULL_ALLELE = '-';
-
-
- // missing/default values
- public static final String UNFILTERED = ".";
- public static final String PASSES_FILTERS_v3 = "0";
- public static final String PASSES_FILTERS_v4 = "PASS";
- public static final String EMPTY_ID_FIELD = ".";
- public static final String EMPTY_INFO_FIELD = ".";
- public static final String EMPTY_ALTERNATE_ALLELE_FIELD = ".";
- public static final String MISSING_VALUE_v4 = ".";
- public static final String MISSING_QUALITY_v3 = "-1";
- public static final Double MISSING_QUALITY_v3_DOUBLE = Double.valueOf(MISSING_QUALITY_v3);
-
- public static final String MISSING_GENOTYPE_QUALITY_v3 = "-1";
- public static final String MISSING_HAPLOTYPE_QUALITY_v3 = "-1";
- public static final String MISSING_DEPTH_v3 = "-1";
- public static final String UNBOUNDED_ENCODING_v4 = ".";
- public static final String UNBOUNDED_ENCODING_v3 = "-1";
- public static final String PER_ALTERNATE_COUNT = "A";
- public static final String PER_ALLELE_COUNT = "R";
- public static final String PER_GENOTYPE_COUNT = "G";
- public static final String EMPTY_ALLELE = ".";
- public static final String EMPTY_GENOTYPE = "./.";
- public static final int MAX_GENOTYPE_QUAL = 99;
-
- public static final Double VCF_ENCODING_EPSILON = 0.00005; // when we consider fields equal(), used in the Qual compare
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java
deleted file mode 100644
index 12e400c..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFContigHeaderLine.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.tribble.TribbleException;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * A special class representing a contig VCF header line. Knows the true contig order and sorts on that
- *
- * Note: this class has a natural ordering that is inconsistent with equals()
- *
- * @author mdepristo
- */
-public class VCFContigHeaderLine extends VCFSimpleHeaderLine {
- final Integer contigIndex;
-
- /**
- * create a VCF contig header line
- *
- * @param line the header line
- * @param version the vcf header version
- * @param key the key for this header line
- */
- public VCFContigHeaderLine(final String line, final VCFHeaderVersion version, final String key, final int contigIndex) {
- super(line, version, key, null);
- if (contigIndex < 0) throw new TribbleException("The contig index is less than zero.");
- this.contigIndex = contigIndex;
- }
-
- public VCFContigHeaderLine(final Map<String, String> mapping, final int contigIndex) {
- super(VCFHeader.CONTIG_KEY, mapping);
- if (contigIndex < 0) throw new TribbleException("The contig index is less than zero.");
- this.contigIndex = contigIndex;
- }
-
- VCFContigHeaderLine(final SAMSequenceRecord sequenceRecord, final String assembly) {
- // Using LinkedHashMap to preserve order of keys in contig line (ID, length, assembly)
- super(VCFHeader.CONTIG_KEY, new LinkedHashMap<String, String>() {{
- // Now inside an init block in an anon HashMap subclass
- this.put("ID", sequenceRecord.getSequenceName());
- this.put("length", Integer.toString(sequenceRecord.getSequenceLength()));
- if ( assembly != null ) this.put("assembly", assembly);
- }});
- this.contigIndex = sequenceRecord.getSequenceIndex();
- }
-
- public Integer getContigIndex() {
- return contigIndex;
- }
-
- public SAMSequenceRecord getSAMSequenceRecord() {
- final String lengthString = this.getGenericFieldValue("length");
- if (lengthString == null) throw new TribbleException("Contig " + this.getID() + " does not have a length field.");
- final SAMSequenceRecord record = new SAMSequenceRecord(this.getID(), Integer.valueOf(lengthString));
- record.setAssembly(this.getGenericFieldValue("assembly"));
- record.setSequenceIndex(this.contigIndex);
- return record;
- }
-
- @Override
- public boolean equals(final Object o) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
- return false;
- }
-
- final VCFContigHeaderLine that = (VCFContigHeaderLine) o;
- return contigIndex.equals(that.contigIndex);
- }
-
- @Override
- public int hashCode() {
- int result = super.hashCode();
- result = 31 * result + contigIndex.hashCode();
- return result;
- }
-
- /**
- * IT IS CRITICAL THAT THIS BE OVERRIDDEN SO WE SORT THE CONTIGS IN THE CORRECT ORDER
- */
- @Override
- public int compareTo(final Object other) {
- if ( other instanceof VCFContigHeaderLine )
- return contigIndex.compareTo(((VCFContigHeaderLine) other).contigIndex);
- else {
- return super.compareTo(other);
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java b/src/main/java/htsjdk/variant/vcf/VCFEncoder.java
deleted file mode 100644
index a909066..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFEncoder.java
+++ /dev/null
@@ -1,382 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypesContext;
-import htsjdk.variant.variantcontext.LazyGenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.IntGenotypeFieldAccessors;
-
-import java.lang.reflect.Array;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * Functions specific to encoding VCF records.
- */
-public class VCFEncoder {
-
- /**
- * The encoding used for VCF files: ISO-8859-1
- */
- public static final Charset VCF_CHARSET = Charset.forName("ISO-8859-1");
- private static final String QUAL_FORMAT_STRING = "%.2f";
- private static final String QUAL_FORMAT_EXTENSION_TO_TRIM = ".00";
-
- private final IntGenotypeFieldAccessors GENOTYPE_FIELD_ACCESSORS = new IntGenotypeFieldAccessors();
-
- private VCFHeader header;
-
- private boolean allowMissingFieldsInHeader = false;
-
- private boolean outputTrailingFormatFields = false;
-
- /**
- * Prepare a VCFEncoder that will encode records appropriate to the given VCF header, optionally
- * allowing missing fields in the header.
- */
- public VCFEncoder(final VCFHeader header, final boolean allowMissingFieldsInHeader, final boolean outputTrailingFormatFields) {
- if (header == null) throw new NullPointerException("The VCF header must not be null.");
- this.header = header;
- this.allowMissingFieldsInHeader = allowMissingFieldsInHeader;
- this.outputTrailingFormatFields = outputTrailingFormatFields;
- }
-
- /**
- * Please see the notes in the default constructor
- */
- @Deprecated
- public void setVCFHeader(final VCFHeader header) {
- this.header = header;
- }
-
- /**
- * Please see the notes in the default constructor
- */
- @Deprecated
- public void setAllowMissingFieldsInHeader(final boolean allow) {
- this.allowMissingFieldsInHeader = allow;
- }
-
- public String encode(final VariantContext context) {
- if (this.header == null) {
- throw new NullPointerException("The header field must be set on the VCFEncoder before encoding records.");
- }
-
- final StringBuilder stringBuilder = new StringBuilder();
-
- // CHROM
- stringBuilder.append(context.getContig()).append(VCFConstants.FIELD_SEPARATOR)
- // POS
- .append(String.valueOf(context.getStart())).append(VCFConstants.FIELD_SEPARATOR)
- // ID
- .append(context.getID()).append(VCFConstants.FIELD_SEPARATOR)
- // REF
- .append(context.getReference().getDisplayString()).append(VCFConstants.FIELD_SEPARATOR);
-
- // ALT
- if ( context.isVariant() ) {
- Allele altAllele = context.getAlternateAllele(0);
- String alt = altAllele.getDisplayString();
- stringBuilder.append(alt);
-
- for (int i = 1; i < context.getAlternateAlleles().size(); i++) {
- altAllele = context.getAlternateAllele(i);
- alt = altAllele.getDisplayString();
- stringBuilder.append(',');
- stringBuilder.append(alt);
- }
- } else {
- stringBuilder.append(VCFConstants.EMPTY_ALTERNATE_ALLELE_FIELD);
- }
-
- stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
-
- // QUAL
- if ( ! context.hasLog10PError()) stringBuilder.append(VCFConstants.MISSING_VALUE_v4);
- else stringBuilder.append(formatQualValue(context.getPhredScaledQual()));
- stringBuilder.append(VCFConstants.FIELD_SEPARATOR)
- // FILTER
- .append(getFilterString(context)).append(VCFConstants.FIELD_SEPARATOR);
-
- // INFO
- final Map<String, String> infoFields = new TreeMap<String, String>();
- for (final Map.Entry<String, Object> field : context.getAttributes().entrySet() ) {
- if ( ! this.header.hasInfoLine(field.getKey())) fieldIsMissingFromHeaderError(context, field.getKey(), "INFO");
-
- final String outputValue = formatVCFField(field.getValue());
- if (outputValue != null) infoFields.put(field.getKey(), outputValue);
- }
- writeInfoString(infoFields, stringBuilder);
-
- // FORMAT
- final GenotypesContext gc = context.getGenotypes();
- if (gc.isLazyWithData() && ((LazyGenotypesContext) gc).getUnparsedGenotypeData() instanceof String) {
- stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
- stringBuilder.append(((LazyGenotypesContext) gc).getUnparsedGenotypeData().toString());
- } else {
- final List<String> genotypeAttributeKeys = context.calcVCFGenotypeKeys(this.header);
- if ( ! genotypeAttributeKeys.isEmpty()) {
- for (final String format : genotypeAttributeKeys)
- if ( ! this.header.hasFormatLine(format))
- fieldIsMissingFromHeaderError(context, format, "FORMAT");
-
- final String genotypeFormatString = ParsingUtils.join(VCFConstants.GENOTYPE_FIELD_SEPARATOR, genotypeAttributeKeys);
-
- stringBuilder.append(VCFConstants.FIELD_SEPARATOR);
- stringBuilder.append(genotypeFormatString);
-
- final Map<Allele, String> alleleStrings = buildAlleleStrings(context);
- addGenotypeData(context, alleleStrings, genotypeAttributeKeys, stringBuilder);
- }
- }
-
- return stringBuilder.toString();
- }
-
- VCFHeader getVCFHeader() {
- return this.header;
- }
-
- boolean getAllowMissingFieldsInHeader() {
- return this.allowMissingFieldsInHeader;
- }
-
- private String getFilterString(final VariantContext vc) {
- if (vc.isFiltered()) {
- for (final String filter : vc.getFilters()) {
- if ( ! this.header.hasFilterLine(filter)) fieldIsMissingFromHeaderError(vc, filter, "FILTER");
- }
-
- return ParsingUtils.join(";", ParsingUtils.sortList(vc.getFilters()));
- }
- else if (vc.filtersWereApplied()) return VCFConstants.PASSES_FILTERS_v4;
- else return VCFConstants.UNFILTERED;
- }
-
- private String formatQualValue(final double qual) {
- String s = String.format(QUAL_FORMAT_STRING, qual);
- if ( s.endsWith(QUAL_FORMAT_EXTENSION_TO_TRIM) )
- s = s.substring(0, s.length() - QUAL_FORMAT_EXTENSION_TO_TRIM.length());
- return s;
- }
-
- private void fieldIsMissingFromHeaderError(final VariantContext vc, final String id, final String field) {
- if ( ! allowMissingFieldsInHeader)
- throw new IllegalStateException("Key " + id + " found in VariantContext field " + field
- + " at " + vc.getContig() + ":" + vc.getStart()
- + " but this key isn't defined in the VCFHeader. We require all VCFs to have"
- + " complete VCF headers by default.");
- }
-
- String formatVCFField(final Object val) {
- final String result;
- if ( val == null )
- result = VCFConstants.MISSING_VALUE_v4;
- else if ( val instanceof Double )
- result = formatVCFDouble((Double) val);
- else if ( val instanceof Boolean )
- result = (Boolean)val ? "" : null; // empty string for true, null for false
- else if ( val instanceof List ) {
- result = formatVCFField(((List)val).toArray());
- } else if ( val.getClass().isArray() ) {
- final int length = Array.getLength(val);
- if ( length == 0 )
- return formatVCFField(null);
- final StringBuilder sb = new StringBuilder(formatVCFField(Array.get(val, 0)));
- for ( int i = 1; i < length; i++) {
- sb.append(',');
- sb.append(formatVCFField(Array.get(val, i)));
- }
- result = sb.toString();
- } else
- result = val.toString();
-
- return result;
- }
-
- /**
- * Takes a double value and pretty prints it to a String for display
- *
- * Large doubles => gets %.2f style formatting
- * Doubles < 1 / 10 but > 1/100 => get %.3f style formatting
- * Double < 1/100 => %.3e formatting
- * @param d
- * @return
- */
- public static String formatVCFDouble(final double d) {
- final String format;
- if ( d < 1 ) {
- if ( d < 0.01 ) {
- if ( Math.abs(d) >= 1e-20 )
- format = "%.3e";
- else {
- // return a zero format
- return "0.00";
- }
- } else {
- format = "%.3f";
- }
- } else {
- format = "%.2f";
- }
-
- return String.format(format, d);
- }
-
- static int countOccurrences(final char c, final String s) {
- int count = 0;
- for (int i = 0; i < s.length(); i++) {
- count += s.charAt(i) == c ? 1 : 0;
- }
- return count;
- }
-
- static boolean isMissingValue(final String s) {
- // we need to deal with the case that it's a list of missing values
- return (countOccurrences(VCFConstants.MISSING_VALUE_v4.charAt(0), s) + countOccurrences(',', s) == s.length());
- }
-
- /*
- * Add the genotype data
- */
- public void addGenotypeData(final VariantContext vc, final Map<Allele, String> alleleMap, final List<String> genotypeFormatKeys, final StringBuilder builder) {
- final int ploidy = vc.getMaxPloidy(2);
-
- for (final String sample : this.header.getGenotypeSamples()) {
- builder.append(VCFConstants.FIELD_SEPARATOR);
-
- Genotype g = vc.getGenotype(sample);
- if (g == null) g = GenotypeBuilder.createMissing(sample, ploidy);
-
- final List<String> attrs = new ArrayList<String>(genotypeFormatKeys.size());
- for (final String field : genotypeFormatKeys) {
- if (field.equals(VCFConstants.GENOTYPE_KEY)) {
- if ( ! g.isAvailable()) {
- throw new IllegalStateException("GTs cannot be missing for some samples if they are available for others in the record");
- }
-
- writeAllele(g.getAllele(0), alleleMap, builder);
- for (int i = 1; i < g.getPloidy(); i++) {
- builder.append(g.isPhased() ? VCFConstants.PHASED : VCFConstants.UNPHASED);
- writeAllele(g.getAllele(i), alleleMap, builder);
- }
- continue;
-
- } else {
- final String outputValue;
- if ( field.equals(VCFConstants.GENOTYPE_FILTER_KEY ) ) {
- outputValue = g.isFiltered() ? g.getFilters() : VCFConstants.PASSES_FILTERS_v4;
- } else {
- final IntGenotypeFieldAccessors.Accessor accessor = GENOTYPE_FIELD_ACCESSORS.getAccessor(field);
- if ( accessor != null ) {
- final int[] intValues = accessor.getValues(g);
- if ( intValues == null )
- outputValue = VCFConstants.MISSING_VALUE_v4;
- else if ( intValues.length == 1 ) // fast path
- outputValue = Integer.toString(intValues[0]);
- else {
- final StringBuilder sb = new StringBuilder();
- sb.append(intValues[0]);
- for ( int i = 1; i < intValues.length; i++) {
- sb.append(',');
- sb.append(intValues[i]);
- }
- outputValue = sb.toString();
- }
- } else {
- Object val = g.hasExtendedAttribute(field) ? g.getExtendedAttribute(field) : VCFConstants.MISSING_VALUE_v4;
-
- final VCFFormatHeaderLine metaData = this.header.getFormatHeaderLine(field);
- if ( metaData != null ) {
- final int numInFormatField = metaData.getCount(vc);
- if ( numInFormatField > 1 && val.equals(VCFConstants.MISSING_VALUE_v4) ) {
- // If we have a missing field but multiple values are expected, we need to construct a new string with all fields.
- // For example, if Number=2, the string has to be ".,."
- final StringBuilder sb = new StringBuilder(VCFConstants.MISSING_VALUE_v4);
- for ( int i = 1; i < numInFormatField; i++ ) {
- sb.append(',');
- sb.append(VCFConstants.MISSING_VALUE_v4);
- }
- val = sb.toString();
- }
- }
-
- // assume that if key is absent, then the given string encoding suffices
- outputValue = formatVCFField(val);
- }
- }
-
- if ( outputValue != null )
- attrs.add(outputValue);
- }
- }
-
- // strip off trailing missing values
- if (!outputTrailingFormatFields) {
- for (int i = attrs.size() - 1; i >= 0; i--) {
- if (isMissingValue(attrs.get(i))) attrs.remove(i);
- else break;
- }
- }
-
- for (int i = 0; i < attrs.size(); i++) {
- if ( i > 0 || genotypeFormatKeys.contains(VCFConstants.GENOTYPE_KEY)) {
- builder.append(VCFConstants.GENOTYPE_FIELD_SEPARATOR);
- }
- builder.append(attrs.get(i));
- }
- }
- }
-
- /*
- * Create the info string; assumes that no values are null
- */
- private void writeInfoString(final Map<String, String> infoFields, final StringBuilder builder) {
- if ( infoFields.isEmpty() ) {
- builder.append(VCFConstants.EMPTY_INFO_FIELD);
- return;
- }
-
- boolean isFirst = true;
- for (final Map.Entry<String, String> entry : infoFields.entrySet()) {
- if (isFirst) isFirst = false;
- else builder.append(VCFConstants.INFO_FIELD_SEPARATOR);
-
- builder.append(entry.getKey());
-
- if ( ! entry.getValue().equals("")) {
- final VCFInfoHeaderLine metaData = this.header.getInfoHeaderLine(entry.getKey());
- if ( metaData == null || metaData.getCountType() != VCFHeaderLineCount.INTEGER || metaData.getCount() != 0 ) {
- builder.append('=');
- builder.append(entry.getValue());
- }
- }
- }
- }
-
- public Map<Allele, String> buildAlleleStrings(final VariantContext vc) {
- final Map<Allele, String> alleleMap = new HashMap<Allele, String>(vc.getAlleles().size()+1);
- alleleMap.put(Allele.NO_CALL, VCFConstants.EMPTY_ALLELE); // convenience for lookup
-
- final List<Allele> alleles = vc.getAlleles();
- for ( int i = 0; i < alleles.size(); i++ ) {
- alleleMap.put(alleles.get(i), String.valueOf(i));
- }
-
- return alleleMap;
- }
-
- private void writeAllele(final Allele allele, final Map<Allele, String> alleleMap, final StringBuilder builder) {
- final String encoding = alleleMap.get(allele);
- if ( encoding == null )
- throw new RuntimeException("Allele " + allele + " is not an allele in the variant context");
- builder.append(encoding);
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java b/src/main/java/htsjdk/variant/vcf/VCFFileReader.java
deleted file mode 100644
index 9024f34..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFileReader.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.IntervalList;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Simplified interface for reading from VCF/BCF files.
- */
-public class VCFFileReader implements Closeable, Iterable<VariantContext> {
-
- private final FeatureReader<VariantContext> reader;
-
- /**
- * Returns true if the given file appears to be a BCF file.
- */
- public static boolean isBCF(final File file) {
- return file.getAbsolutePath().endsWith(".bcf");
- }
-
- /**
- * Returns the SAMSequenceDictionary from the provided VCF file.
- */
- public static SAMSequenceDictionary getSequenceDictionary(final File file) {
- final SAMSequenceDictionary dict = new VCFFileReader(file, false).getFileHeader().getSequenceDictionary();
- CloserUtil.close(file);
- return dict;
- }
-
- /** Constructs a VCFFileReader that requires the index to be present. */
- public VCFFileReader(final File file) {
- this(file, true);
- }
-
- /** Constructs a VCFFileReader with a specified index. */
- public VCFFileReader(final File file, final File indexFile) {
- this(file, indexFile, true);
- }
-
- /** Allows construction of a VCFFileReader that will or will not assert the presence of an index as desired. */
- public VCFFileReader(final File file, final boolean requireIndex) {
- // Note how we deal with type safety here, just casting to (FeatureCodec)
- // in the call to getFeatureReader is not enough for Java 8.
- FeatureCodec<VariantContext, ?> codec = isBCF(file) ? new BCF2Codec() : new VCFCodec();
- this.reader = AbstractFeatureReader.getFeatureReader(
- file.getAbsolutePath(),
- codec,
- requireIndex);
- }
-
- /** Allows construction of a VCFFileReader with a specified index file. */
- public VCFFileReader(final File file, final File indexFile, final boolean requireIndex) {
- // Note how we deal with type safety here, just casting to (FeatureCodec)
- // in the call to getFeatureReader is not enough for Java 8.
- FeatureCodec<VariantContext, ?> codec = isBCF(file) ? new BCF2Codec() : new VCFCodec();
- this.reader = AbstractFeatureReader.getFeatureReader(
- file.getAbsolutePath(),
- indexFile.getAbsolutePath(),
- codec,
- requireIndex);
- }
-
- /**
- * Parse a VCF file and convert to an IntervalList The name field of the IntervalList is taken from the ID field of the variant, if it exists. if not,
- * creates a name of the format interval-n where n is a running number that increments only on un-named intervals
- * @param file
- * @return
- */
- public static IntervalList fromVcf(final File file){
- return fromVcf(file, false);
- }
-
- public static IntervalList fromVcf(final File file, final boolean includeFiltered){
- final VCFFileReader vcfFileReader = new VCFFileReader(file, false);
- final IntervalList intervalList = fromVcf(vcfFileReader, includeFiltered);
- vcfFileReader.close();
- return intervalList;
- }
-
- /**
- * Converts a vcf to an IntervalList. The name field of the IntervalList is taken from the ID field of the variant, if it exists. If not,
- * creates a name of the format interval-n where n is a running number that increments only on un-named intervals
- * Will use a "END" tag in the info field as the end of the interval (if exists).
- * @param vcf the vcfReader to be used for the conversion
- * @return an IntervalList constructed from input vcf
- */
-
- public static IntervalList fromVcf(final VCFFileReader vcf){
- return fromVcf(vcf,false);
- }
- public static IntervalList fromVcf(final VCFFileReader vcf, final boolean includeFiltered){
-
- //grab the dictionary from the VCF and use it in the IntervalList
- final SAMSequenceDictionary dict = vcf.getFileHeader().getSequenceDictionary();
- final SAMFileHeader samFileHeader = new SAMFileHeader();
- samFileHeader.setSequenceDictionary(dict);
- final IntervalList list = new IntervalList(samFileHeader);
-
- int intervals=0;
- for(final VariantContext vc : vcf){
- if(includeFiltered || !vc.isFiltered()){
- String name = vc.getID();
- final Integer intervalEnd=vc.getCommonInfo().getAttributeAsInt("END",vc.getEnd());
- if(".".equals(name) || name == null)
- name = "interval-" + (++intervals);
- list.add(new Interval(vc.getContig(), vc.getStart(), intervalEnd, false, name));
- }
- }
-
- return list;
- }
-
- /** Returns the VCFHeader associated with this VCF/BCF file. */
- public VCFHeader getFileHeader() {
- return (VCFHeader) reader.getHeader();
- }
-
- /** Returns an iterator over all records in this VCF/BCF file. */
- public CloseableIterator<VariantContext> iterator() {
- try { return reader.iterator(); }
- catch (final IOException ioe) {
- throw new TribbleException("Could not create an iterator from a feature reader.", ioe);
- }
- }
-
- /** Queries for records within the region specified. */
- public CloseableIterator<VariantContext> query(final String chrom, final int start, final int end) {
- try { return reader.query(chrom, start, end); }
- catch (final IOException ioe) {
- throw new TribbleException("Could not create an iterator from a feature reader.", ioe);
- }
- }
-
- public void close() {
- try { this.reader.close(); }
- catch (final IOException ioe) {
- throw new TribbleException("Could not close a variant context feature reader.", ioe);
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java
deleted file mode 100644
index 5130963..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFilterHeaderLine.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.Arrays;
-
-/**
- * @author ebanks
- *
- * A class representing a key=value entry for FILTER fields in the VCF header
- */
-public class VCFFilterHeaderLine extends VCFSimpleHeaderLine {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * create a VCF filter header line
- *
- * @param name the name for this header line
- * @param description the description for this header line
- */
- public VCFFilterHeaderLine(final String name, final String description) {
- super("FILTER", name, description);
- }
-
- /**
- * Convenience constructor for FILTER whose description is the name
- * @param name
- */
- public VCFFilterHeaderLine(final String name) {
- super("FILTER", name, name);
- }
-
- /**
- * create a VCF info header line
- *
- * @param line the header line
- * @param version the vcf header version
- */
- public VCFFilterHeaderLine(final String line, final VCFHeaderVersion version) {
- super(line, version, "FILTER", Arrays.asList("ID", "Description"));
- }
-
- @Override
- public boolean shouldBeAddedToDictionary() {
- return true;
- }
-
- /**
- * get the "Description" field
- * @return the "Description" field
- */
- public String getDescription() {
- return getGenericFieldValue("Description");
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java
deleted file mode 100644
index 74f4d5e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFFormatHeaderLine.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-
-/**
- * @author ebanks
- * <p>
- * Class VCFFormatHeaderLine
- * </p>
- * <p>
- * A class representing a key=value entry for genotype FORMAT fields in the VCF header</p>
- */
-public class VCFFormatHeaderLine extends VCFCompoundHeaderLine {
-
- public VCFFormatHeaderLine(String name, int count, VCFHeaderLineType type, String description) {
- super(name, count, type, description, SupportedHeaderLineType.FORMAT);
- if (type == VCFHeaderLineType.Flag)
- throw new IllegalArgumentException("Flag is an unsupported type for format fields");
- }
-
- public VCFFormatHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) {
- super(name, count, type, description, SupportedHeaderLineType.FORMAT);
- }
-
- public VCFFormatHeaderLine(String line, VCFHeaderVersion version) {
- super(line, version, SupportedHeaderLineType.FORMAT);
- }
-
- // format fields do not allow flag values (that wouldn't make much sense, how would you encode this in the genotype).
- @Override
- boolean allowFlagValues() {
- return false;
- }
-
- @Override
- public boolean shouldBeAddedToDictionary() {
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeader.java b/src/main/java/htsjdk/variant/vcf/VCFHeader.java
deleted file mode 100644
index 30dce37..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeader.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.VariantContextComparator;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-
-/**
- * A class to represent a VCF header
- *
- * @author aaron
- * NOTE: This class stores header lines in lots of places. The original author noted that this should
- * be cleaned up at some point in the future (jgentry - 5/2013)
- */
-public class VCFHeader implements Serializable {
- public static final long serialVersionUID = 1L;
-
- // the mandatory header fields
- public enum HEADER_FIELDS {
- CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO
- }
-
- // the associated meta data
- private final Set<VCFHeaderLine> mMetaData = new LinkedHashSet<VCFHeaderLine>();
- private final Map<String, VCFInfoHeaderLine> mInfoMetaData = new LinkedHashMap<String, VCFInfoHeaderLine>();
- private final Map<String, VCFFormatHeaderLine> mFormatMetaData = new LinkedHashMap<String, VCFFormatHeaderLine>();
- private final Map<String, VCFFilterHeaderLine> mFilterMetaData = new LinkedHashMap<String, VCFFilterHeaderLine>();
- private final Map<String, VCFHeaderLine> mOtherMetaData = new LinkedHashMap<String, VCFHeaderLine>();
- private final List<VCFContigHeaderLine> contigMetaData = new ArrayList<VCFContigHeaderLine>();
-
- // the list of auxillary tags
- private final List<String> mGenotypeSampleNames = new ArrayList<String>();
-
- // the character string that indicates meta data
- public static final String METADATA_INDICATOR = "##";
-
- // the header string indicator
- public static final String HEADER_INDICATOR = "#";
-
- public static final String SOURCE_KEY = "source";
- public static final String REFERENCE_KEY = "reference";
- public static final String CONTIG_KEY = "contig";
- public static final String INTERVALS_KEY = "intervals";
- public static final String EXCLUDE_INTERVALS_KEY = "excludeIntervals";
- public static final String INTERVAL_MERGING_KEY = "interval_merging";
- public static final String INTERVAL_SET_RULE_KEY = "interval_set_rule";
- public static final String INTERVAL_PADDING_KEY = "interval_padding";
-
- // were the input samples sorted originally (or are we sorting them)?
- private boolean samplesWereAlreadySorted = true;
-
- // cache for efficient conversion of VCF -> VariantContext
- private ArrayList<String> sampleNamesInOrder = null;
- private HashMap<String, Integer> sampleNameToOffset = null;
-
- private boolean writeEngineHeaders = true;
- private boolean writeCommandLine = true;
-
- /**
- * Create an empty VCF header with no header lines and no samples
- */
- public VCFHeader() {
- this(Collections.<VCFHeaderLine>emptySet(), Collections.<String>emptySet());
- }
-
- /**
- * create a VCF header, given a list of meta data and auxiliary tags
- *
- * @param metaData the meta data associated with this header
- */
- public VCFHeader(final Set<VCFHeaderLine> metaData) {
- mMetaData.addAll(metaData);
- removeVCFVersionLines(mMetaData);
- createLookupEntriesForAllHeaderLines();
- checkForDeprecatedGenotypeLikelihoodsKey();
- }
-
- /**
- * Creates a deep copy of the given VCFHeader, duplicating all its metadata and
- * sample names.
- */
- public VCFHeader(final VCFHeader toCopy) {
- this(toCopy.mMetaData, toCopy.mGenotypeSampleNames);
- }
-
- /**
- * create a VCF header, given a list of meta data and auxillary tags
- *
- * @param metaData the meta data associated with this header
- * @param genotypeSampleNames the sample names
- */
- public VCFHeader(final Set<VCFHeaderLine> metaData, final Set<String> genotypeSampleNames) {
- this(metaData, new ArrayList<String>(genotypeSampleNames));
- }
-
- public VCFHeader(final Set<VCFHeaderLine> metaData, final List<String> genotypeSampleNames) {
- this(metaData);
-
- if ( genotypeSampleNames.size() != new HashSet<String>(genotypeSampleNames).size() )
- throw new TribbleException.InvalidHeader("BUG: VCF header has duplicate sample names");
-
- mGenotypeSampleNames.addAll(genotypeSampleNames);
- samplesWereAlreadySorted = ParsingUtils.isSorted(genotypeSampleNames);
- buildVCFReaderMaps(genotypeSampleNames);
- }
-
- /**
- * Tell this VCF header to use pre-calculated sample name ordering and the
- * sample name -> offset map. This assumes that all VariantContext created
- * using this header (i.e., read by the VCFCodec) will have genotypes
- * occurring in the same order
- *
- * @param genotypeSampleNamesInAppearenceOrder genotype sample names, must iterator in order of appearance
- */
- private void buildVCFReaderMaps(final Collection<String> genotypeSampleNamesInAppearenceOrder) {
- sampleNamesInOrder = new ArrayList<String>(genotypeSampleNamesInAppearenceOrder.size());
- sampleNameToOffset = new HashMap<String, Integer>(genotypeSampleNamesInAppearenceOrder.size());
-
- int i = 0;
- for (final String name : genotypeSampleNamesInAppearenceOrder) {
- sampleNamesInOrder.add(name);
- sampleNameToOffset.put(name, i++);
- }
- Collections.sort(sampleNamesInOrder);
- }
-
-
- /**
- * Adds a new line to the VCFHeader. If there is an existing header line of the
- * same type with the same key, the new line is not added and the existing line
- * is preserved.
- *
- * @param headerLine header line to attempt to add
- */
- public void addMetaDataLine(final VCFHeaderLine headerLine) {
- // Try to create a lookup entry for the new line. If this succeeds (because there was
- // no line of this type with the same key), add the line to our master list of header
- // lines in mMetaData.
- if ( addMetadataLineLookupEntry(headerLine) ) {
- mMetaData.add(headerLine);
- checkForDeprecatedGenotypeLikelihoodsKey();
- }
- }
-
- /**
- * @return all of the VCF header lines of the ##contig form in order, or an empty list if none were present
- */
- public List<VCFContigHeaderLine> getContigLines() {
- return Collections.unmodifiableList(contigMetaData);
- }
-
- /**
- * Returns the contigs in this VCF file as a SAMSequenceDictionary. Returns null if contigs lines are
- * not present in the header. Throws SAMException if one or more contig lines do not have length
- * information.
- */
- public SAMSequenceDictionary getSequenceDictionary() {
- final List<VCFContigHeaderLine> contigHeaderLines = this.getContigLines();
- if (contigHeaderLines.isEmpty()) return null;
-
- final List<SAMSequenceRecord> sequenceRecords = new ArrayList<SAMSequenceRecord>(contigHeaderLines.size());
- for (final VCFContigHeaderLine contigHeaderLine : contigHeaderLines) {
- sequenceRecords.add(contigHeaderLine.getSAMSequenceRecord());
- }
-
- return new SAMSequenceDictionary(sequenceRecords);
- }
-
- /**
- * Completely replaces the contig records in this header with those in the given SAMSequenceDictionary.
- */
- public void setSequenceDictionary(final SAMSequenceDictionary dictionary) {
- this.contigMetaData.clear();
-
- // Also need to remove contig record lines from mMetaData
- final List<VCFHeaderLine> toRemove = new ArrayList<VCFHeaderLine>();
- for (final VCFHeaderLine line : mMetaData) {
- if (line instanceof VCFContigHeaderLine) {
- toRemove.add(line);
- }
- }
- mMetaData.removeAll(toRemove);
- for (final SAMSequenceRecord record : dictionary.getSequences()) {
- contigMetaData.add(new VCFContigHeaderLine(record, record.getAssembly()));
- }
-
- this.mMetaData.addAll(contigMetaData);
- }
-
- public VariantContextComparator getVCFRecordComparator() {
- return new VariantContextComparator(this.getContigLines());
- }
-
- /**
- * @return all of the VCF FILTER lines in their original file order, or an empty list if none were present
- */
- public List<VCFFilterHeaderLine> getFilterLines() {
- final List<VCFFilterHeaderLine> filters = new ArrayList<VCFFilterHeaderLine>();
- for (final VCFHeaderLine line : mMetaData) {
- if ( line instanceof VCFFilterHeaderLine ) {
- filters.add((VCFFilterHeaderLine)line);
- }
- }
- return filters;
- }
-
- /**
- * @return all of the VCF FILTER lines in their original file order, or an empty list if none were present
- */
- public List<VCFIDHeaderLine> getIDHeaderLines() {
- final List<VCFIDHeaderLine> filters = new ArrayList<VCFIDHeaderLine>();
- for (final VCFHeaderLine line : mMetaData) {
- if (line instanceof VCFIDHeaderLine) {
- filters.add((VCFIDHeaderLine)line);
- }
- }
- return filters;
- }
-
- /**
- * Remove all lines with a VCF version tag from the provided set of header lines
- */
- private void removeVCFVersionLines( final Set<VCFHeaderLine> headerLines ) {
- final List<VCFHeaderLine> toRemove = new ArrayList<VCFHeaderLine>();
- for (final VCFHeaderLine line : headerLines) {
- if (VCFHeaderVersion.isFormatString(line.getKey())) {
- toRemove.add(line);
- }
- }
- headerLines.removeAll(toRemove);
- }
-
- /**
- * Creates lookup table entries for all header lines in mMetaData.
- */
- private void createLookupEntriesForAllHeaderLines() {
- for (final VCFHeaderLine line : mMetaData) {
- addMetadataLineLookupEntry(line);
- }
- }
-
- /**
- * Add a single header line to the appropriate type-specific lookup table (but NOT to the master
- * list of lines in mMetaData -- this must be done separately if desired).
- *
- * If a header line is present that has the same key as an existing line, it will not be added. A warning
- * will be shown if this occurs when GeneralUtils.DEBUG_MODE_ENABLED is true, otherwise this will occur
- * silently.
- *
- * @param line header line to attempt to add to its type-specific lookup table
- * @return true if the line was added to the appropriate lookup table, false if there was an existing
- * line with the same key and the new line was not added
- */
- private boolean addMetadataLineLookupEntry(final VCFHeaderLine line) {
- if ( line instanceof VCFInfoHeaderLine ) {
- final VCFInfoHeaderLine infoLine = (VCFInfoHeaderLine)line;
- return addMetaDataLineMapLookupEntry(mInfoMetaData, infoLine.getID(), infoLine);
- } else if ( line instanceof VCFFormatHeaderLine ) {
- final VCFFormatHeaderLine formatLine = (VCFFormatHeaderLine)line;
- return addMetaDataLineMapLookupEntry(mFormatMetaData, formatLine.getID(), formatLine);
- } else if ( line instanceof VCFFilterHeaderLine ) {
- final VCFFilterHeaderLine filterLine = (VCFFilterHeaderLine)line;
- return addMetaDataLineMapLookupEntry(mFilterMetaData, filterLine.getID(), filterLine);
- } else if ( line instanceof VCFContigHeaderLine ) {
- return addContigMetaDataLineLookupEntry((VCFContigHeaderLine) line);
- } else {
- return addMetaDataLineMapLookupEntry(mOtherMetaData, line.getKey(), line);
- }
- }
-
- /**
- * Add a contig header line to the lookup list for contig lines (contigMetaData). If there's
- * already a contig line with the same ID, does not add the line.
- *
- * Note: does not add the contig line to the master list of header lines in mMetaData --
- * this must be done separately if desired.
- *
- * @param line contig header line to add
- * @return true if line was added to the list of contig lines, otherwise false
- */
- private boolean addContigMetaDataLineLookupEntry(final VCFContigHeaderLine line) {
- for (VCFContigHeaderLine vcfContigHeaderLine : contigMetaData) {
- // if we are trying to add a contig for the same ID
- if (vcfContigHeaderLine.getID().equals(line.getID())) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("Found duplicate VCF contig header lines for " + line.getID() + "; keeping the first only" );
- }
- // do not add this contig if it exists
- return false;
- }
- }
-
- contigMetaData.add(line);
- return true;
- }
-
- /**
- * Add a header line to the provided map at a given key. If the key already exists, it will not be replaced.
- * If it does already exist and GeneralUtils.DEBUG_MODE_ENABLED is true, it will issue warnings about duplicates,
- * otherwise it will silently leave the existing key/line pair as is.
- *
- * Note: does not add the header line to the master list of header lines in mMetaData --
- * this must be done separately if desired.
- *
- * @param map a map from each key to the associated VCFHeaderLine
- * @param key the key to insert this line at
- * @param line the line to insert at this key
- * @param <T> a type of vcf header line that extends VCFHeaderLine
- * @return true if the line was added to the map, false if it was not added because there's already a line with that key
- */
- private <T extends VCFHeaderLine> boolean addMetaDataLineMapLookupEntry(final Map<String, T> map, final String key, final T line) {
- if ( map.containsKey(key) ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("Found duplicate VCF header lines for " + key + "; keeping the first only" );
- }
- return false;
- }
-
- map.put(key, line);
- return true;
- }
-
- /**
- * Check for the presence of a format line with the deprecated key {@link VCFConstants#GENOTYPE_LIKELIHOODS_KEY}.
- * If one is present, and there isn't a format line with the key {@link VCFConstants#GENOTYPE_PL_KEY}, adds
- * a new format line with the key {@link VCFConstants#GENOTYPE_PL_KEY}.
- */
- private void checkForDeprecatedGenotypeLikelihoodsKey() {
- if ( hasFormatLine(VCFConstants.GENOTYPE_LIKELIHOODS_KEY) && ! hasFormatLine(VCFConstants.GENOTYPE_PL_KEY) ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("Found " + VCFConstants.GENOTYPE_LIKELIHOODS_KEY + " format, but no "
- + VCFConstants.GENOTYPE_PL_KEY + " field. We now only manage PL fields internally"
- + " automatically adding a corresponding PL field to your VCF header");
- }
- addMetaDataLine(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_PL_KEY, VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification"));
- }
- }
-
- /**
- * get the header fields in order they're presented in the input file (which is now required to be
- * the order presented in the spec).
- *
- * @return a set of the header fields, in order
- */
- public Set<HEADER_FIELDS> getHeaderFields() {
- return new LinkedHashSet<HEADER_FIELDS>(Arrays.asList(HEADER_FIELDS.values()));
- }
-
- /**
- * get the meta data, associated with this header, in sorted order
- *
- * @return a set of the meta data
- */
- public Set<VCFHeaderLine> getMetaDataInInputOrder() {
- return makeGetMetaDataSet(mMetaData);
- }
-
- public Set<VCFHeaderLine> getMetaDataInSortedOrder() {
- return makeGetMetaDataSet(new TreeSet<VCFHeaderLine>(mMetaData));
- }
-
- private static Set<VCFHeaderLine> makeGetMetaDataSet(final Set<VCFHeaderLine> headerLinesInSomeOrder) {
- final Set<VCFHeaderLine> lines = new LinkedHashSet<VCFHeaderLine>();
- lines.add(new VCFHeaderLine(VCFHeaderVersion.VCF4_2.getFormatString(), VCFHeaderVersion.VCF4_2.getVersionString()));
- lines.addAll(headerLinesInSomeOrder);
- return Collections.unmodifiableSet(lines);
- }
-
- /**
- * Get the VCFHeaderLine whose key equals key. Returns null if no such line exists
- * @param key
- * @return
- */
- public VCFHeaderLine getMetaDataLine(final String key) {
- for (final VCFHeaderLine line: mMetaData) {
- if ( line.getKey().equals(key) )
- return line;
- }
-
- return null;
- }
-
- /**
- * get the genotyping sample names
- *
- * @return a list of the genotype column names, which may be empty if hasGenotypingData() returns false
- */
- public List<String> getGenotypeSamples() {
- return mGenotypeSampleNames;
- }
-
- public int getNGenotypeSamples() {
- return mGenotypeSampleNames.size();
- }
-
- /**
- * do we have genotyping data?
- *
- * @return true if we have genotyping columns, false otherwise
- */
- public boolean hasGenotypingData() {
- return getNGenotypeSamples() > 0;
- }
-
- /**
- * were the input samples sorted originally?
- *
- * @return true if the input samples were sorted originally, false otherwise
- */
- public boolean samplesWereAlreadySorted() {
- return samplesWereAlreadySorted;
- }
-
- /** @return the column count */
- public int getColumnCount() {
- return HEADER_FIELDS.values().length + (hasGenotypingData() ? mGenotypeSampleNames.size() + 1 : 0);
- }
-
- /**
- * Returns the INFO HeaderLines in their original ordering
- */
- public Collection<VCFInfoHeaderLine> getInfoHeaderLines() {
- return mInfoMetaData.values();
- }
-
- /**
- * Returns the FORMAT HeaderLines in their original ordering
- */
- public Collection<VCFFormatHeaderLine> getFormatHeaderLines() {
- return mFormatMetaData.values();
- }
-
- /**
- * @param id the header key name
- * @return the meta data line, or null if there is none
- */
- public VCFInfoHeaderLine getInfoHeaderLine(final String id) {
- return mInfoMetaData.get(id);
- }
-
- /**
- * @param id the header key name
- * @return the meta data line, or null if there is none
- */
- public VCFFormatHeaderLine getFormatHeaderLine(final String id) {
- return mFormatMetaData.get(id);
- }
-
- /**
- * @param id the header key name
- * @return the meta data line, or null if there is none
- */
- public VCFFilterHeaderLine getFilterHeaderLine(final String id) {
- return mFilterMetaData.get(id);
- }
-
- public boolean hasInfoLine(final String id) {
- return getInfoHeaderLine(id) != null;
- }
-
- public boolean hasFormatLine(final String id) {
- return getFormatHeaderLine(id) != null;
- }
-
- public boolean hasFilterLine(final String id) {
- return getFilterHeaderLine(id) != null;
- }
-
- /**
- * @param key the header key name
- * @return the meta data line, or null if there is none
- */
- public VCFHeaderLine getOtherHeaderLine(final String key) {
- return mOtherMetaData.get(key);
- }
-
- /**
- * Returns the other HeaderLines in their original ordering
- */
- public Collection<VCFHeaderLine> getOtherHeaderLines() {
- return mOtherMetaData.values();
- }
-
- /**
- * If true additional engine headers will be written to the VCF, otherwise only the walker headers will be output.
- * @return true if additional engine headers will be written to the VCF
- */
- public boolean isWriteEngineHeaders() {
- return writeEngineHeaders;
- }
-
- /**
- * If true additional engine headers will be written to the VCF, otherwise only the walker headers will be output.
- * @param writeEngineHeaders true if additional engine headers will be written to the VCF
- */
- public void setWriteEngineHeaders(final boolean writeEngineHeaders) {
- this.writeEngineHeaders = writeEngineHeaders;
- }
-
- /**
- * If true, and isWriteEngineHeaders also returns true, the command line will be written to the VCF.
- * @return true if the command line will be written to the VCF
- */
- public boolean isWriteCommandLine() {
- return writeCommandLine;
- }
-
- /**
- * If true, and isWriteEngineHeaders also returns true, the command line will be written to the VCF.
- * @param writeCommandLine true if the command line will be written to the VCF
- */
- public void setWriteCommandLine(final boolean writeCommandLine) {
- this.writeCommandLine = writeCommandLine;
- }
-
- public ArrayList<String> getSampleNamesInOrder() {
- return sampleNamesInOrder;
- }
-
- public HashMap<String, Integer> getSampleNameToOffset() {
- return sampleNameToOffset;
- }
-
- @Override
- public String toString() {
- final StringBuilder b = new StringBuilder();
- b.append("[VCFHeader:");
- for ( final VCFHeaderLine line : mMetaData )
- b.append("\n\t").append(line);
- return b.append("\n]").toString();
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java
deleted file mode 100644
index c4c1e3b..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLine.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-import java.io.Serializable;
-import java.util.Map;
-
-
-/**
- * @author ebanks
- * <p>
- * Class VCFHeaderLine
- * </p>
- * <p>
- * A class representing a key=value entry in the VCF header
- * </p>
- */
-public class VCFHeaderLine implements Comparable, Serializable {
- public static final long serialVersionUID = 1L;
-
- protected static final boolean ALLOW_UNBOUND_DESCRIPTIONS = true;
- protected static final String UNBOUND_DESCRIPTION = "Not provided in original VCF header";
-
- private String mKey = null;
- private String mValue = null;
-
- /**
- * create a VCF header line
- *
- * @param key the key for this header line
- * @param value the value for this header line
- */
- public VCFHeaderLine(String key, String value) {
- if ( key == null )
- throw new IllegalArgumentException("VCFHeaderLine: key cannot be null");
- if ( key.contains("<") || key.contains(">") )
- throw new IllegalArgumentException("VCFHeaderLine: key cannot contain angle brackets");
- if ( key.contains("=") )
- throw new IllegalArgumentException("VCFHeaderLine: key cannot contain an equals sign");
- mKey = key;
- mValue = value;
- }
-
- /**
- * Get the key
- *
- * @return the key
- */
- public String getKey() {
- return mKey;
- }
-
- /**
- * Get the value
- *
- * @return the value
- */
- public String getValue() {
- return mValue;
- }
-
- /**
- * By default the header lines won't be added to the dictionary, unless this method will be override (for example in FORMAT, INFO or FILTER header lines)
- *
- * @return false
- */
- public boolean shouldBeAddedToDictionary() {
- return false;
- }
-
- public String toString() {
- return toStringEncoding();
- }
-
- /**
- * Should be overloaded in sub classes to do subclass specific
- *
- * @return the string encoding
- */
- protected String toStringEncoding() {
- return mKey + "=" + mValue;
- }
-
- @Override
- public boolean equals(final Object o) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() ) {
- return false;
- }
-
- final VCFHeaderLine that = (VCFHeaderLine) o;
- return mKey.equals(that.mKey) && // key not nullable
- (mValue != null ? mValue.equals(that.mValue) : that.mValue == null); // value is nullable
- }
-
- @Override
- public int hashCode() {
- int result = mKey.hashCode();
- result = 31 * result + (mValue != null ? mValue.hashCode() : 0);
- return result;
- }
-
- public int compareTo(Object other) {
- return toString().compareTo(other.toString());
- }
-
- /**
- * @param line the line
- * @return true if the line is a VCF meta data line, or false if it is not
- */
- public static boolean isHeaderLine(String line) {
- return line != null && !line.isEmpty() && VCFHeader.HEADER_INDICATOR.equals(line.substring(0,1));
- }
-
- /**
- * create a string of a mapping pair for the target VCF version
- * @param keyValues a mapping of the key->value pairs to output
- * @return a string, correctly formatted
- */
- public static String toStringEncoding(Map<String, ? extends Object> keyValues) {
- StringBuilder builder = new StringBuilder();
- builder.append('<');
- boolean start = true;
- for (Map.Entry<String,?> entry : keyValues.entrySet()) {
- if (start) start = false;
- else builder.append(',');
-
- if ( entry.getValue() == null ) throw new TribbleException.InternalCodecException("Header problem: unbound value at " + entry + " from " + keyValues);
-
- builder.append(entry.getKey());
- builder.append('=');
- builder.append(entry.getValue().toString().contains(",") ||
- entry.getValue().toString().contains(" ") ||
- entry.getKey().equals("Description") ? "\""+ escapeQuotes(entry.getValue().toString()) + "\"" : entry.getValue());
- }
- builder.append('>');
- return builder.toString();
- }
-
- private static String escapeQuotes(final String value) {
- // java escaping in a string literal makes this harder to read than it should be
- // without string literal escaping and quoting the regex would be: replaceAll( ([^\])" , $1\" )
- // ie replace: something that's not a backslash ([^\]) followed by a double quote
- // with: the thing that wasn't a backslash ($1), followed by a backslash, followed by a double quote
- return value.replaceAll("([^\\\\])\"", "$1\\\\\"");
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java
deleted file mode 100644
index 080153a..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineCount.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/**
- * the count encodings we use for fields in VCF header lines
- */
-public enum VCFHeaderLineCount {
- INTEGER, A, R, G, UNBOUNDED;
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java
deleted file mode 100644
index 071d815..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineTranslator.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A class for translating between vcf header versions
- */
-public class VCFHeaderLineTranslator {
- private static Map<VCFHeaderVersion,VCFLineParser> mapping;
-
- static {
- mapping = new HashMap<VCFHeaderVersion,VCFLineParser>();
- mapping.put(VCFHeaderVersion.VCF4_0,new VCF4Parser());
- mapping.put(VCFHeaderVersion.VCF4_1,new VCF4Parser());
- mapping.put(VCFHeaderVersion.VCF4_2,new VCF4Parser());
- mapping.put(VCFHeaderVersion.VCF3_3,new VCF3Parser());
- mapping.put(VCFHeaderVersion.VCF3_2,new VCF3Parser());
- }
-
- public static Map<String,String> parseLine(VCFHeaderVersion version, String valueLine, List<String> expectedTagOrder) {
- return mapping.get(version).parseLine(valueLine,expectedTagOrder);
- }
-}
-
-
-interface VCFLineParser {
- public Map<String,String> parseLine(String valueLine, List<String> expectedTagOrder);
-}
-
-
-/**
- * a class that handles the to and from disk for VCF 4 lines
- */
-class VCF4Parser implements VCFLineParser {
- /**
- * parse a VCF4 line
- * @param valueLine the line
- * @return a mapping of the tags parsed out
- */
- public Map<String, String> parseLine(String valueLine, List<String> expectedTagOrder) {
- // our return map
- Map<String, String> ret = new LinkedHashMap<String, String>();
-
- // a builder to store up characters as we go
- StringBuilder builder = new StringBuilder();
-
- // store the key when we're parsing out the values
- String key = "";
-
- // where are we in the stream of characters?
- int index = 0;
-
- // are we inside a quotation? we don't special case ',' then
- boolean inQuote = false;
-
- // if we are in a quote and we see a backslash followed by quote, treat it as an escaped quote
- boolean escape = false;
-
- // a little switch machine to parse out the tags. Regex ended up being really complicated and ugly [yes, but this machine is getting ugly now... MAD]
- for (char c: valueLine.toCharArray()) {
- if ( c == '\"') {
- if (escape) {
- builder.append(c);
- escape = false;
- } else {
- inQuote = !inQuote;
- }
- } else if ( inQuote ) {
- if (escape) {
- // in VCF 4.2 spec the only valid characters to escape are double quote and backslash; otherwise copy the backslash through
- if (c == '\\') {
- builder.append(c);
- } else {
- builder.append('\\');
- builder.append(c);
- }
- escape = false;
- } else if (c != '\\') {
- builder.append(c);
- } else {
- escape = true;
- }
- } else {
- escape = false;
- switch (c) {
- case ('<') : if (index == 0) break; // if we see a open bracket at the beginning, ignore it
- case ('>') : if (index == valueLine.length()-1) ret.put(key,builder.toString().trim()); break; // if we see a close bracket, and we're at the end, add an entry to our list
- case ('=') : key = builder.toString().trim(); builder = new StringBuilder(); break; // at an equals, copy the key and reset the builder
- case (',') : ret.put(key,builder.toString().trim()); builder = new StringBuilder(); break; // drop the current key value to the return map
- default: builder.append(c); // otherwise simply append to the current string
- }
- }
-
- index++;
- }
-
- if (inQuote) {
- throw new TribbleException.InvalidHeader("Unclosed quote in header line value " + valueLine);
- }
-
- // validate the tags against the expected list
- index = 0;
- if ( expectedTagOrder != null ) {
- if ( ret.size() > expectedTagOrder.size() )
- throw new TribbleException.InvalidHeader("unexpected tag count " + ret.size() + " in line " + valueLine);
- for ( String str : ret.keySet() ) {
- if ( !expectedTagOrder.get(index).equals(str) )
- throw new TribbleException.InvalidHeader("Unexpected tag " + str + " in line " + valueLine);
- index++;
- }
- }
- return ret;
- }
-}
-
-class VCF3Parser implements VCFLineParser {
-
- public Map<String, String> parseLine(String valueLine, List<String> expectedTagOrder) {
- // our return map
- Map<String, String> ret = new LinkedHashMap<String, String>();
-
- // a builder to store up characters as we go
- StringBuilder builder = new StringBuilder();
-
- // where are we in the stream of characters?
- int index = 0;
- // where in the expected tag order are we?
- int tagIndex = 0;
-
- // are we inside a quotation? we don't special case ',' then
- boolean inQuote = false;
-
- // a little switch machine to parse out the tags. Regex ended up being really complicated and ugly
- for (char c: valueLine.toCharArray()) {
- switch (c) {
- case ('\"') : inQuote = !inQuote; break; // a quote means we ignore ',' in our strings, keep track of it
- case (',') : if (!inQuote) { ret.put(expectedTagOrder.get(tagIndex++),builder.toString()); builder = new StringBuilder(); break; } // drop the current key value to the return map
- default: builder.append(c); // otherwise simply append to the current string
- }
- index++;
- }
- ret.put(expectedTagOrder.get(tagIndex++),builder.toString());
-
- // validate the tags against the expected list
- index = 0;
- if (tagIndex != expectedTagOrder.size()) throw new IllegalArgumentException("Unexpected tag count " + tagIndex + ", we expected " + expectedTagOrder.size());
- for (String str : ret.keySet()){
- if (!expectedTagOrder.get(index).equals(str)) throw new IllegalArgumentException("Unexpected tag " + str + " in string " + valueLine);
- index++;
- }
- return ret;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java
deleted file mode 100644
index 785449d..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderLineType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/**
- * the type encodings we use for fields in VCF header lines
- */
-public enum VCFHeaderLineType {
- Integer, Float, String, Character, Flag;
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java b/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java
deleted file mode 100644
index b45d423..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFHeaderVersion.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-
-/**
- * information that identifies each header version
- */
-public enum VCFHeaderVersion {
- VCF3_2("VCRv3.2","format"),
- VCF3_3("VCFv3.3","fileformat"),
- VCF4_0("VCFv4.0","fileformat"),
- VCF4_1("VCFv4.1","fileformat"),
- VCF4_2("VCFv4.2","fileformat");
-
- private final String versionString;
- private final String formatString;
-
- /**
- * create the enum, privately, using:
- * @param vString the version string
- * @param fString the format string
- */
- VCFHeaderVersion(String vString, String fString) {
- this.versionString = vString;
- this.formatString = fString;
- }
-
- /**
- * get the header version
- * @param version the version string
- * @return a VCFHeaderVersion object
- */
- public static VCFHeaderVersion toHeaderVersion(String version) {
- version = clean(version);
- for (VCFHeaderVersion hv : VCFHeaderVersion.values())
- if (hv.versionString.equals(version))
- return hv;
- return null;
- }
-
- /**
- * are we a valid version string of some type
- * @param version the version string
- * @return true if we're valid of some type, false otherwise
- */
- public static boolean isVersionString(String version){
- return toHeaderVersion(version) != null;
- }
-
- /**
- * are we a valid format string for some type
- * @param format the format string
- * @return true if we're valid of some type, false otherwise
- */
- public static boolean isFormatString(String format){
- format = clean(format);
- for (VCFHeaderVersion hv : VCFHeaderVersion.values())
- if (hv.formatString.equals(format))
- return true;
- return false;
- }
-
- public static VCFHeaderVersion getHeaderVersion(String versionLine) {
- String[] lineFields = versionLine.split("=");
- if ( lineFields.length != 2 || !isFormatString(lineFields[0].substring(2)) )
- throw new TribbleException.InvalidHeader(versionLine + " is not a valid VCF version line");
-
- if ( !isVersionString(lineFields[1]) )
- throw new TribbleException.InvalidHeader(lineFields[1] + " is not a supported version");
-
- return toHeaderVersion(lineFields[1]);
- }
-
- /**
- * Utility function to clean up a VCF header string
- *
- * @param s string
- * @return trimmed version of s
- */
- private static String clean(String s) {
- return s.trim();
- }
-
- /**
- * Determines whether this version is at least as recent as a given version
- *
- * @param target the target version to compare against
- * @return true if this version is at least as recent as the target version, false otherwise
- */
- public boolean isAtLeastAsRecentAs(final VCFHeaderVersion target) {
- switch (target) {
- case VCF4_2:
- return this == VCF4_2;
- case VCF4_1:
- return this == VCF4_1 || this == VCF4_2;
- case VCF4_0:
- return this != VCF3_2 && this != VCF3_3;
- case VCF3_3:
- return this != VCF3_2;
- case VCF3_2:
- default:
- return true;
- }
- }
-
- public String getVersionString() {
- return versionString;
- }
-
- public String getFormatString() {
- return formatString;
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java
deleted file mode 100644
index 246f89e..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFIDHeaderLine.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-/** an interface for ID-based header lines **/
-public interface VCFIDHeaderLine {
- String getID();
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java
deleted file mode 100644
index afa1f81..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFInfoHeaderLine.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-
-/**
- * @author ebanks
- * <p>
- * Class VCFInfoHeaderLine
- * </p>
- * <p>
- * A class representing a key=value entry for INFO fields in the VCF header
- * </p>
- */
-public class VCFInfoHeaderLine extends VCFCompoundHeaderLine {
- public VCFInfoHeaderLine(String name, int count, VCFHeaderLineType type, String description) {
- super(name, count, type, description, SupportedHeaderLineType.INFO);
- }
-
- public VCFInfoHeaderLine(String name, VCFHeaderLineCount count, VCFHeaderLineType type, String description) {
- super(name, count, type, description, SupportedHeaderLineType.INFO);
- }
-
- public VCFInfoHeaderLine(String line, VCFHeaderVersion version) {
- super(line, version, SupportedHeaderLineType.INFO);
- }
-
- // info fields allow flag values
- @Override
- boolean allowFlagValues() {
- return true;
- }
-
- @Override
- public boolean shouldBeAddedToDictionary() {
- return true;
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java b/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java
deleted file mode 100644
index 8fe9b67..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFRecordCodec.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.samtools.util.SortingCollection;
-import htsjdk.variant.variantcontext.VariantContext;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-/**
- * Writes VariantContext instances to an OutputStream without headers or metadata. For use
- * with SortingCollection ONLY.
- */
-public class VCFRecordCodec implements SortingCollection.Codec<VariantContext> {
- private final VCFCodec vcfDecoder = new VCFCodec();
- private final VCFEncoder vcfEncoder;
- private PrintStream outputStream = null;
- private BufferedReader inputReader = null;
-
- public VCFRecordCodec(final VCFHeader header) {
- this(header, false);
- }
-
- public VCFRecordCodec(final VCFHeader header, final boolean allowMissingFieldsInHeader) {
- this.vcfEncoder = new VCFEncoder(header, allowMissingFieldsInHeader, false);
- // Explicitly set the version because it's not available in the header itself.
- this.vcfDecoder.setVCFHeader(header, VCFHeaderVersion.VCF4_2);
- }
-
- @Override
- public void setOutputStream(final OutputStream stream) {
- this.outputStream = new PrintStream(stream);
- }
-
- @Override
- public void setInputStream(final InputStream stream) {
- this.inputReader = new BufferedReader(new InputStreamReader(stream));
- }
-
- @Override
- public void encode(final VariantContext context) {
- this.outputStream.println(this.vcfEncoder.encode(context));
- }
-
- @Override
- public VariantContext decode() {
- try {
- final String line;
- return ((line = inputReader.readLine()) != null) ? this.vcfDecoder.decode(line) : null;
- } catch (final IOException ioe) {
- throw new RuntimeIOException("Could not decode/read a VCF record for a sorting collection: " + ioe.getMessage(), ioe);
- }
- }
-
- @Override
- public VCFRecordCodec clone() {
- return new VCFRecordCodec(this.vcfEncoder.getVCFHeader(), this.vcfEncoder.getAllowMissingFieldsInHeader());
- }
-}
-
diff --git a/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java b/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java
deleted file mode 100644
index a5da687..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFSimpleHeaderLine.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * @author ebanks
- *
- * A class representing a key=value entry for simple VCF header types
- */
-public class VCFSimpleHeaderLine extends VCFHeaderLine implements VCFIDHeaderLine {
-
- private String name;
- private Map<String, String> genericFields = new LinkedHashMap<String, String>();
-
- /**
- * create a VCF filter header line
- *
- * @param key the key for this header line
- * @param name the name for this header line
- * @param description description for this header line
- */
- public VCFSimpleHeaderLine(String key, String name, String description) {
- super(key, "");
- Map<String, String> map = new LinkedHashMap<String, String>(1);
- map.put("Description", description);
- initialize(name, map);
- }
-
- /**
- * create a VCF info header line
- *
- * @param line the header line
- * @param version the vcf header version
- * @param key the key for this header line
- * @param expectedTagOrdering the tag ordering expected for this header line
- */
- public VCFSimpleHeaderLine(final String line, final VCFHeaderVersion version, final String key, final List<String> expectedTagOrdering) {
- this(key, VCFHeaderLineTranslator.parseLine(version, line, expectedTagOrdering));
- }
-
- public VCFSimpleHeaderLine(final String key, final Map<String, String> mapping) {
- super(key, "");
- name = mapping.get("ID");
- initialize(name, mapping);
- }
-
- /**
- * Returns the String value associated with the given key. Returns null if there is no value. Key
- * must not be null.
- */
- String getGenericFieldValue(final String key) {
- return this.genericFields.get(key);
- }
-
- protected void initialize(String name, Map<String, String> genericFields) {
- if ( name == null || genericFields == null || genericFields.isEmpty() )
- throw new IllegalArgumentException(String.format("Invalid VCFSimpleHeaderLine: key=%s name=%s", super.getKey(), name));
- if ( name.contains("<") || name.contains(">") )
- throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain angle brackets");
- if ( name.contains("=") )
- throw new IllegalArgumentException("VCFHeaderLine: ID cannot contain an equals sign");
-
- this.name = name;
- this.genericFields.putAll(genericFields);
- }
-
- protected String toStringEncoding() {
- Map<String, Object> map = new LinkedHashMap<String, Object>();
- map.put("ID", name);
- map.putAll(genericFields);
- return getKey() + "=" + VCFHeaderLine.toStringEncoding(map);
- }
-
- @Override
- public boolean equals( final Object o ) {
- if ( this == o ) {
- return true;
- }
- if ( o == null || getClass() != o.getClass() || ! super.equals(o) ) {
- return false;
- }
-
- final VCFSimpleHeaderLine that = (VCFSimpleHeaderLine) o;
- return name.equals(that.name) &&
- genericFields.equals(that.genericFields);
- }
-
- @Override
- public int hashCode() {
- int result = super.hashCode();
- result = 31 * result + name.hashCode();
- result = 31 * result + genericFields.hashCode();
- return result;
- }
-
- public String getID() {
- return name;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java b/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java
deleted file mode 100644
index de2817c..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFStandardHeaderLines.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Manages header lines for standard VCF <pre>INFO</pre> and <pre>FORMAT</pre> fields.
- *
- * Provides simple mechanisms for
- * 1) registering standard lines,
- * 2) looking them up, and
- * 3) adding them to headers.
- *
- * @author Mark DePristo
- * @since 6/12
- */
-public class VCFStandardHeaderLines {
- /**
- * Enabling this causes us to repair header lines even if only their descriptions differ.
- */
- private final static boolean REPAIR_BAD_DESCRIPTIONS = false;
- private static Standards<VCFFormatHeaderLine> formatStandards = new Standards<VCFFormatHeaderLine>();
- private static Standards<VCFInfoHeaderLine> infoStandards = new Standards<VCFInfoHeaderLine>();
-
- /**
- * Walks over the VCF header and repairs the standard VCF header lines in it, returning a freshly
- * allocated {@link VCFHeader} with standard VCF header lines repaired as necessary.
- */
- public static VCFHeader repairStandardHeaderLines(final VCFHeader header) {
- final Set<VCFHeaderLine> newLines = new LinkedHashSet<VCFHeaderLine>(header.getMetaDataInInputOrder().size());
- for ( VCFHeaderLine line : header.getMetaDataInInputOrder() ) {
- if ( line instanceof VCFFormatHeaderLine ) {
- line = formatStandards.repair((VCFFormatHeaderLine) line);
- } else if ( line instanceof VCFInfoHeaderLine) {
- line = infoStandards.repair((VCFInfoHeaderLine) line);
- }
-
- newLines.add(line);
- }
-
- return new VCFHeader(newLines, header.getGenotypeSamples());
- }
-
- /**
- * Adds header lines for each of the format fields in IDs to header, returning the set of
- * {@code IDs} without standard descriptions, unless {@code throwErrorForMissing} is true, in which
- * case this situation results in a {@link TribbleException}
- */
- public static Set<String> addStandardFormatLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final Collection<String> IDs) {
- return formatStandards.addToHeader(headerLines, IDs, throwErrorForMissing);
- }
-
- /**
- * @see #addStandardFormatLines(java.util.Set, boolean, java.util.Collection)
- */
- public static Set<String> addStandardFormatLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final String ... IDs) {
- return addStandardFormatLines(headerLines, throwErrorForMissing, Arrays.asList(IDs));
- }
-
- /**
- * Returns the standard format line for {@code ID}.
- * If none exists, return null or throw an exception, depending on {@code throwErrorForMissing}.
- */
- public static VCFFormatHeaderLine getFormatLine(final String ID, final boolean throwErrorForMissing) {
- return formatStandards.get(ID, throwErrorForMissing);
- }
-
- /**
- * Returns the standard format line for {@code ID}.
- * If none exists, throw an {@link TribbleException}
- */
- public static VCFFormatHeaderLine getFormatLine(final String ID) {
- return formatStandards.get(ID, true);
- }
-
- /**
- * Adds header lines for each of the info fields in {@code IDs} to header, returning the set of
- * IDs without standard descriptions, unless {@code throwErrorForMissing} is true, in which
- * case this situation results in a {@link TribbleException}.
- */
- public static Set<String> addStandardInfoLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final Collection<String> IDs) {
- return infoStandards.addToHeader(headerLines, IDs, throwErrorForMissing);
- }
-
- /**
- * @see #addStandardFormatLines(java.util.Set, boolean, java.util.Collection)
- */
- public static Set<String> addStandardInfoLines(final Set<VCFHeaderLine> headerLines, final boolean throwErrorForMissing, final String ... IDs) {
- return addStandardInfoLines(headerLines, throwErrorForMissing, Arrays.asList(IDs));
- }
-
- /**
- * Returns the standard info line for {@code ID}.
- * If none exists, return {@code null} or throw a {@link TribbleException}, depending on {@code throwErrorForMissing}.
- */
- public static VCFInfoHeaderLine getInfoLine(final String ID, final boolean throwErrorForMissing) {
- return infoStandards.get(ID, throwErrorForMissing);
- }
-
- /**
- * Returns the standard info line for {@code ID}.
- * If none exists throw a {@link TribbleException}.
- */
- public static VCFInfoHeaderLine getInfoLine(final String ID) {
- return getInfoLine(ID, true);
- }
-
-
- private static void registerStandard(final VCFInfoHeaderLine line) {
- infoStandards.add(line);
- }
-
- private static void registerStandard(final VCFFormatHeaderLine line) {
- formatStandards.add(line);
- }
-
- //
- // VCF header line constants
- //
- static {
- // FORMAT lines
- registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_KEY, 1, VCFHeaderLineType.String, "Genotype"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_QUALITY_KEY, 1, VCFHeaderLineType.Integer, "Genotype Quality"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.DEPTH_KEY, 1, VCFHeaderLineType.Integer, "Approximate read depth (reads with MQ=255 or with bad mates are filtered)"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_PL_KEY, VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_ALLELE_DEPTHS, VCFHeaderLineCount.R, VCFHeaderLineType.Integer, "Allelic depths for the ref and alt alleles in the order listed"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.GENOTYPE_FILTER_KEY, VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "Genotype-level filter"));
- registerStandard(new VCFFormatHeaderLine(VCFConstants.PHASE_QUALITY_KEY, 1, VCFHeaderLineType.Float, "Read-backed phasing quality"));
-
- // INFO lines
- registerStandard(new VCFInfoHeaderLine(VCFConstants.END_KEY, 1, VCFHeaderLineType.Integer, "Stop position of the interval"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.DBSNP_KEY, 0, VCFHeaderLineType.Flag, "dbSNP Membership"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.DEPTH_KEY, 1, VCFHeaderLineType.Integer, "Approximate read depth; some reads may have been filtered"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.STRAND_BIAS_KEY, 1, VCFHeaderLineType.Float, "Strand Bias"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_FREQUENCY_KEY, VCFHeaderLineCount.A, VCFHeaderLineType.Float, "Allele Frequency, for each ALT allele, in the same order as listed"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_COUNT_KEY, VCFHeaderLineCount.A, VCFHeaderLineType.Integer, "Allele count in genotypes, for each ALT allele, in the same order as listed"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.ALLELE_NUMBER_KEY, 1, VCFHeaderLineType.Integer, "Total number of alleles in called genotypes"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.MAPPING_QUALITY_ZERO_KEY, 1, VCFHeaderLineType.Integer, "Total Mapping Quality Zero Reads"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.RMS_MAPPING_QUALITY_KEY, 1, VCFHeaderLineType.Float, "RMS Mapping Quality"));
- registerStandard(new VCFInfoHeaderLine(VCFConstants.SOMATIC_KEY, 0, VCFHeaderLineType.Flag, "Somatic event"));
- }
-
- private static class Standards<T extends VCFCompoundHeaderLine> {
- private final Map<String, T> standards = new HashMap<String, T>();
-
- public T repair(final T line) {
- final T standard = get(line.getID(), false);
- if ( standard != null ) {
- final boolean badCountType = line.getCountType() != standard.getCountType();
- final boolean badCount = line.isFixedCount() && ! badCountType && line.getCount() != standard.getCount();
- final boolean badType = line.getType() != standard.getType();
- final boolean badDesc = ! line.getDescription().equals(standard.getDescription());
- final boolean needsRepair = badCountType || badCount || badType || (REPAIR_BAD_DESCRIPTIONS && badDesc);
-
- if ( needsRepair ) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED ) {
- System.err.println("Repairing standard header line for field " + line.getID() + " because"
- + (badCountType ? " -- count types disagree; header has " + line.getCountType() + " but standard is " + standard.getCountType() : "")
- + (badType ? " -- type disagree; header has " + line.getType() + " but standard is " + standard.getType() : "")
- + (badCount ? " -- counts disagree; header has " + line.getCount() + " but standard is " + standard.getCount() : "")
- + (badDesc ? " -- descriptions disagree; header has '" + line.getDescription() + "' but standard is '" + standard.getDescription() + "'": ""));
- }
- return standard;
- } else {
- return line;
- }
- } else {
- return line;
- }
- }
-
- public Set<String> addToHeader(final Set<VCFHeaderLine> headerLines, final Collection<String> IDs, final boolean throwErrorForMissing) {
- final Set<String> missing = new HashSet<String>();
- for ( final String ID : IDs ) {
- final T line = get(ID, throwErrorForMissing);
- if ( line == null )
- missing.add(ID);
- else
- headerLines.add(line);
- }
-
- return missing;
- }
-
- public void add(final T line) {
- if ( standards.containsKey(line.getID()) ) {
- throw new TribbleException("Attempting to add multiple standard header lines for ID " + line.getID());
- }
- standards.put(line.getID(), line);
- }
-
- public T get(final String ID, final boolean throwErrorForMissing) {
- final T x = standards.get(ID);
- if ( throwErrorForMissing && x == null ) {
- throw new TribbleException("Couldn't find a standard VCF header line for field " + ID);
- }
- return x;
- }
- }
-}
diff --git a/src/main/java/htsjdk/variant/vcf/VCFUtils.java b/src/main/java/htsjdk/variant/vcf/VCFUtils.java
deleted file mode 100644
index c8eceea..0000000
--- a/src/main/java/htsjdk/variant/vcf/VCFUtils.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.utils.GeneralUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-public class VCFUtils {
-
- public static Set<VCFHeaderLine> smartMergeHeaders(final Collection<VCFHeader> headers, final boolean emitWarnings) throws IllegalStateException {
- // We need to maintain the order of the VCFHeaderLines, otherwise they will be scrambled in the returned Set.
- // This will cause problems for VCFHeader.getSequenceDictionary and anything else that implicitly relies on the line ordering.
- final TreeMap<String, VCFHeaderLine> map = new TreeMap<String, VCFHeaderLine>(); // from KEY.NAME -> line
- final HeaderConflictWarner conflictWarner = new HeaderConflictWarner(emitWarnings);
-
- // todo -- needs to remove all version headers from sources and add its own VCF version line
- for ( final VCFHeader source : headers ) {
- //System.out.printf("Merging in header %s%n", source);
- for ( final VCFHeaderLine line : source.getMetaDataInSortedOrder()) {
-
- String key = line.getKey();
- if ( line instanceof VCFIDHeaderLine )
- key = key + "-" + ((VCFIDHeaderLine)line).getID();
-
- if ( map.containsKey(key) ) {
- final VCFHeaderLine other = map.get(key);
- if ( line.equals(other) ) {
- // continue;
- } else if ( ! line.getClass().equals(other.getClass()) ) {
- throw new IllegalStateException("Incompatible header types: " + line + " " + other );
- } else if ( line instanceof VCFFilterHeaderLine ) {
- final String lineName = ((VCFFilterHeaderLine) line).getID();
- final String otherName = ((VCFFilterHeaderLine) other).getID();
- if ( ! lineName.equals(otherName) )
- throw new IllegalStateException("Incompatible header types: " + line + " " + other );
- } else if ( line instanceof VCFCompoundHeaderLine ) {
- final VCFCompoundHeaderLine compLine = (VCFCompoundHeaderLine)line;
- final VCFCompoundHeaderLine compOther = (VCFCompoundHeaderLine)other;
-
- // if the names are the same, but the values are different, we need to quit
- if (! (compLine).equalsExcludingDescription(compOther) ) {
- if ( compLine.getType().equals(compOther.getType()) ) {
- // The Number entry is an Integer that describes the number of values that can be
- // included with the INFO field. For example, if the INFO field contains a single
- // number, then this value should be 1. However, if the INFO field describes a pair
- // of numbers, then this value should be 2 and so on. If the number of possible
- // values varies, is unknown, or is unbounded, then this value should be '.'.
- conflictWarner.warn(line, "Promoting header field Number to . due to number differences in header lines: " + line + " " + other);
- compOther.setNumberToUnbounded();
- } else if ( compLine.getType() == VCFHeaderLineType.Integer && compOther.getType() == VCFHeaderLineType.Float ) {
- // promote key to Float
- conflictWarner.warn(line, "Promoting Integer to Float in header: " + compOther);
- map.put(key, compOther);
- } else if ( compLine.getType() == VCFHeaderLineType.Float && compOther.getType() == VCFHeaderLineType.Integer ) {
- // promote key to Float
- conflictWarner.warn(line, "Promoting Integer to Float in header: " + compOther);
- } else {
- throw new IllegalStateException("Incompatible header types, collision between these two types: " + line + " " + other );
- }
- }
- if ( ! compLine.getDescription().equals(compOther.getDescription()) )
- conflictWarner.warn(line, "Allowing unequal description fields through: keeping " + compOther + " excluding " + compLine);
- } else {
- // we are not equal, but we're not anything special either
- conflictWarner.warn(line, "Ignoring header line already in map: this header line = " + line + " already present header = " + other);
- }
- } else {
- map.put(key, line);
- //System.out.printf("Adding header line %s%n", line);
- }
- }
- }
- // returning a LinkedHashSet so that ordering will be preserved. Ensures the contig lines do not get scrambled.
- return new LinkedHashSet<VCFHeaderLine>(map.values());
- }
-
- /**
- * Add / replace the contig header lines in the VCFHeader with the in the reference file and master reference dictionary
- *
- * @param oldHeader the header to update
- * @param referenceFile the file path to the reference sequence used to generate this vcf
- * @param refDict the SAM formatted reference sequence dictionary
- */
- public static VCFHeader withUpdatedContigs(final VCFHeader oldHeader, final File referenceFile, final SAMSequenceDictionary refDict) {
- return new VCFHeader(withUpdatedContigsAsLines(oldHeader.getMetaDataInInputOrder(), referenceFile, refDict), oldHeader.getGenotypeSamples());
- }
-
- public static Set<VCFHeaderLine> withUpdatedContigsAsLines(final Set<VCFHeaderLine> oldLines, final File referenceFile, final SAMSequenceDictionary refDict) {
- return withUpdatedContigsAsLines(oldLines, referenceFile, refDict, false);
- }
-
- public static Set<VCFHeaderLine> withUpdatedContigsAsLines(final Set<VCFHeaderLine> oldLines, final File referenceFile, final SAMSequenceDictionary refDict, final boolean referenceNameOnly) {
- final Set<VCFHeaderLine> lines = new LinkedHashSet<VCFHeaderLine>(oldLines.size());
-
- for ( final VCFHeaderLine line : oldLines ) {
- if ( line instanceof VCFContigHeaderLine )
- continue; // skip old contig lines
- if ( line.getKey().equals(VCFHeader.REFERENCE_KEY) )
- continue; // skip the old reference key
- lines.add(line);
- }
-
- for ( final VCFHeaderLine contigLine : makeContigHeaderLines(refDict, referenceFile) )
- lines.add(contigLine);
-
- final String referenceValue;
- if (referenceFile != null) {
- if (referenceNameOnly) {
- final int extensionStart = referenceFile.getName().lastIndexOf('.');
- referenceValue = extensionStart == -1 ? referenceFile.getName() : referenceFile.getName().substring(0, extensionStart);
- }
- else {
- referenceValue = "file://" + referenceFile.getAbsolutePath();
- }
- lines.add(new VCFHeaderLine(VCFHeader.REFERENCE_KEY, referenceValue));
- }
- return lines;
- }
-
- /**
- * Create VCFHeaderLines for each refDict entry, and optionally the assembly if referenceFile != null
- * @param refDict reference dictionary
- * @param referenceFile for assembly name. May be null
- * @return list of vcf contig header lines
- */
- public static List<VCFContigHeaderLine> makeContigHeaderLines(final SAMSequenceDictionary refDict,
- final File referenceFile) {
- final List<VCFContigHeaderLine> lines = new ArrayList<VCFContigHeaderLine>();
- final String assembly = referenceFile != null ? getReferenceAssembly(referenceFile.getName()) : null;
- for ( final SAMSequenceRecord contig : refDict.getSequences() )
- lines.add(makeContigHeaderLine(contig, assembly));
- return lines;
- }
-
- private static VCFContigHeaderLine makeContigHeaderLine(final SAMSequenceRecord contig, final String assembly) {
- final Map<String, String> map = new LinkedHashMap<String, String>(3);
- map.put("ID", contig.getSequenceName());
- map.put("length", String.valueOf(contig.getSequenceLength()));
- if ( assembly != null ) map.put("assembly", assembly);
- return new VCFContigHeaderLine(map, contig.getSequenceIndex());
- }
-
- private static String getReferenceAssembly(final String refPath) {
- // This doesn't need to be perfect as it's not a required VCF header line, but we might as well give it a shot
- String assembly = null;
- if (refPath.contains("b37") || refPath.contains("v37"))
- assembly = "b37";
- else if (refPath.contains("b36"))
- assembly = "b36";
- else if (refPath.contains("hg18"))
- assembly = "hg18";
- else if (refPath.contains("hg19"))
- assembly = "hg19";
- return assembly;
- }
-
- /** Only displays a warning if warnings are enabled and an identical warning hasn't been already issued */
- private static final class HeaderConflictWarner {
- boolean emitWarnings;
- Set<String> alreadyIssued = new HashSet<String>();
-
- private HeaderConflictWarner( final boolean emitWarnings ) {
- this.emitWarnings = emitWarnings;
- }
-
- public void warn(final VCFHeaderLine line, final String msg) {
- if ( GeneralUtils.DEBUG_MODE_ENABLED && emitWarnings && ! alreadyIssued.contains(line.getKey()) ) {
- alreadyIssued.add(line.getKey());
- System.err.println(msg);
- }
- }
- }
-}
diff --git a/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java b/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java
deleted file mode 100644
index 09f6e49..0000000
--- a/src/test/java/htsjdk/cram/io/ExternalCompressionTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import org.apache.commons.compress.utils.IOUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Files;
-
-public class ExternalCompressionTest {
- public static final File BZIP2_FILE = new File("src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2");
- public static final byte [] TEST_BYTES = "This is a simple string to test BZip2".getBytes();
-
- @Test
- public void testBZip2Decompression() throws IOException {
- final byte [] input = Files.readAllBytes(BZIP2_FILE.toPath());
- final byte [] output = ExternalCompression.unbzip2(input);
- Assert.assertEquals(output, "BZip2 worked".getBytes());
- }
-
- @Test
- public void testBZip2Roundtrip() throws IOException {
- final byte [] compressed = ExternalCompression.bzip2(TEST_BYTES);
- final byte [] restored = ExternalCompression.unbzip2(compressed);
- Assert.assertEquals(TEST_BYTES, restored);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java b/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java
deleted file mode 100644
index 74c2dd7..0000000
--- a/src/test/java/htsjdk/samtools/AbstractBAMFileIndexTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class AbstractBAMFileIndexTest {
-
- /**
- * @see <a href="https://github.com/samtools/htsjdk/issues/73">https://github.com/samtools/htsjdk/issues/73</a>
- */
- @Test
- public static void avoidDataExhaustionTest() {
- final AbstractBAMFileIndex.IndexStreamBuffer buffer = new AbstractBAMFileIndex.IndexStreamBuffer(new SeekableStream() {
- @Override
- public long length() {
- return 0;
- }
-
- @Override
- public long position() throws IOException {
- return 0;
- }
-
- @Override
- public void seek(final long position) throws IOException {
-
- }
-
- @Override
- public int read(final byte[] buffer, final int offset, final int length) throws IOException {
- return 2; // This is the important line; pretend we feed 2 bytes at a time, which is fewer than any downstream calls ultimately request
- }
-
- @Override
- public void close() throws IOException {
-
- }
-
- @Override
- public boolean eof() throws IOException {
- return false;
- }
-
- @Override
- public String getSource() {
- return null;
- }
-
- @Override
- public int read() throws IOException {
- return 0;
- }
- });
-
- // Ensure these throw no exceptions
- buffer.readLong();
- buffer.readInteger();
- buffer.readBytes(new byte[10000]);
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java b/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java
deleted file mode 100644
index dd630f9..0000000
--- a/src/test/java/htsjdk/samtools/BAMCigarOverflowTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.annotations.Test;
-import static org.testng.Assert.assertEquals;
-
-import java.io.File;
-
-/**
- * Test the fix of a bug reported by s-andrews in which the use of an arithmetic rather than a logical right shift in BinaryCigarCodec.binaryCigarToCigarElement()
- * causes an overflow in the CIGAR when reading a BAM file for a read that spans a very large intron.
- */
-public class BAMCigarOverflowTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test
- public void testCigarOverflow() throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.LENIENT).open(new File(TEST_DATA_DIR, "BAMCigarOverflowTest/CigarOverflowTest.bam"));
-
- //Load the single read from the BAM file.
- final SAMRecord testBAMRecord = reader.iterator().next();
- CloserUtil.close(reader);
-
- //The BAM file that exposed the bug triggered a SAM validation error because the bin field of the BAM record did not equal the computed value. Here we test for this error.
- //Cast to int to avoid an ambiguity in the assertEquals() call between assertEquals(int,int) and assertEquals(Object,Object).
- assertEquals(testBAMRecord.computeIndexingBin(), (int) testBAMRecord.getIndexingBin());
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/BAMFileIndexTest.java b/src/test/java/htsjdk/samtools/BAMFileIndexTest.java
deleted file mode 100755
index 170bc47..0000000
--- a/src/test/java/htsjdk/samtools/BAMFileIndexTest.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StopWatch;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Test BAM file indexing.
- */
-public class BAMFileIndexTest {
- private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
- private final boolean mVerbose = false;
-
- @Test
- public void testGetSearchBins()
- throws Exception {
- final DiskBasedBAMFileIndex bfi = new DiskBasedBAMFileIndex(new File(BAM_FILE.getPath() + ".bai"),
- null); // todo can null be replaced with a Sequence dictionary for the BAM_FILE?
- final long[] bins = bfi.getSpanOverlapping(1, 0, 0).toCoordinateArray();
- /***
- if (bins == null) {
- System.out.println("Search bins: " + bins);
- return;
- }
- System.out.println("Search bins:");
- for (int i = 0; i < bins.length; i++) {
- System.out.println(" " + Long.toHexString(bins[i]));
- }
- ***/
- assertNotNull(bins);
- assertEquals(bins.length, 2);
- }
-
- @Test
- public void testSpecificQueries()
- throws Exception {
- assertEquals(runQueryTest(BAM_FILE, "chrM", 10400, 10600, true), 1);
- assertEquals(runQueryTest(BAM_FILE, "chrM", 10400, 10600, false), 2);
- }
-
- @Test(groups = {"slow"})
- public void testRandomQueries()
- throws Exception {
- runRandomTest(BAM_FILE, 1000, new Random());
- }
-
- @Test
- public void testWholeChromosomes() {
- checkChromosome("chrM", 23);
- checkChromosome("chr1", 885);
- checkChromosome("chr2", 837);
- /***
- checkChromosome("chr3", 683);
- checkChromosome("chr4", 633);
- checkChromosome("chr5", 611);
- checkChromosome("chr6", 585);
- checkChromosome("chr7", 521);
- checkChromosome("chr8", 507);
- checkChromosome("chr9", 388);
- checkChromosome("chr10", 477);
- checkChromosome("chr11", 467);
- checkChromosome("chr12", 459);
- checkChromosome("chr13", 327);
- checkChromosome("chr14", 310);
- checkChromosome("chr15", 280);
- checkChromosome("chr16", 278);
- checkChromosome("chr17", 269);
- checkChromosome("chr18", 265);
- checkChromosome("chr19", 178);
- checkChromosome("chr20", 228);
- checkChromosome("chr21", 123);
- checkChromosome("chr22", 121);
- checkChromosome("chrX", 237);
- checkChromosome("chrY", 29);
- ***/
- }
-
- @Test
- public void testQueryUnmapped() {
- final StopWatch linearScan = new StopWatch();
- final StopWatch queryUnmapped = new StopWatch();
- int unmappedCountFromLinearScan = 0;
- final File bamFile = BAM_FILE;
- final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
- linearScan.start();
- CloseableIterator<SAMRecord> it = reader.iterator();
- int mappedCount = 0;
- while (it.hasNext()) {
- final SAMRecord rec = it.next();
- if (rec.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- unmappedCountFromLinearScan = 1;
- break;
- }
- ++mappedCount;
- }
- linearScan.stop();
- System.out.println("Found start of unmapped reads. Num mapped reads: " + mappedCount);
- System.out.println("Time so far: " + linearScan.getElapsedTimeSecs());
- linearScan.start();
-
- while (it.hasNext()) {
- final SAMRecord rec = it.next();
- Assert.assertEquals(rec.getReferenceIndex().intValue(), SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- ++unmappedCountFromLinearScan;
- }
- it.close();
- linearScan.stop();
- queryUnmapped.start();
- it = reader.queryUnmapped();
- int unmappedCountFromQueryUnmapped = 0;
- while (it.hasNext()) {
- final SAMRecord rec = it.next();
- Assert.assertEquals(rec.getReferenceIndex().intValue(), SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- ++unmappedCountFromQueryUnmapped;
- }
- it.close();
- queryUnmapped.stop();
- System.out.println("Linear scan total time: " + linearScan.getElapsedTimeSecs());
- System.out.println("queryUnmapped time: " + queryUnmapped.getElapsedTimeSecs());
- System.out.println("Number of unmapped reads:" + unmappedCountFromQueryUnmapped);
- Assert.assertEquals(unmappedCountFromQueryUnmapped, unmappedCountFromLinearScan);
- CloserUtil.close(reader);
- }
-
- @Test
- public void testQueryAlignmentStart() {
- final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
- CloseableIterator<SAMRecord> it = reader.queryAlignmentStart("chr1", 202160268);
- Assert.assertEquals(countElements(it), 2);
- it.close();
- it = reader.queryAlignmentStart("chr1", 201595153);
- Assert.assertEquals(countElements(it), 1);
- it.close();
- // There are records that overlap this position, but none that start here
- it = reader.queryAlignmentStart("chrM", 10400);
- Assert.assertEquals(countElements(it), 0);
- it.close();
- // One past the last chr1 record
- it = reader.queryAlignmentStart("chr1", 246817509);
- Assert.assertEquals(countElements(it), 0);
- it.close();
- CloserUtil.close(reader);
- }
-
- @Test
- public void testQueryMate() {
- final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
-
- // Both ends mapped
- SAMRecord rec = getSingleRecordStartingAt(reader, "chrM", 1687);
- SAMRecord mate = reader.queryMate(rec);
- assertMate(rec, mate);
- SAMRecord originalRec = reader.queryMate(mate);
- Assert.assertEquals(originalRec, rec);
-
- // One end mapped
- rec = getSingleRecordStartingAt(reader, "chr11", 48720338);
- mate = reader.queryMate(rec);
- assertMate(rec, mate);
- originalRec = reader.queryMate(mate);
- Assert.assertEquals(originalRec, rec);
-
- // Both ends mapped
- final CloseableIterator<SAMRecord> it = reader.queryUnmapped();
- rec = null;
- while (it.hasNext()) {
- final SAMRecord next = it.next();
- if (next.getReadName().equals("2615")) {
- rec = next;
- break;
- }
- }
- it.close();
- Assert.assertNotNull(rec);
- mate = reader.queryMate(rec);
- assertMate(rec, mate);
- originalRec = reader.queryMate(mate);
- Assert.assertEquals(originalRec, rec);
- CloserUtil.close(reader);
- }
-
- private void assertMate(final SAMRecord rec, final SAMRecord mate) {
- Assert.assertNotNull(mate);
- Assert.assertEquals(mate.getReadName(), rec.getReadName());
- Assert.assertEquals(mate.getReferenceIndex(), rec.getMateReferenceIndex());
- if (SAMUtils.getMateCigarString(rec) != null) {
- Assert.assertEquals(mate.getCigarString(), SAMUtils.getMateCigarString(rec));
- }
- Assert.assertEquals(mate.getAlignmentStart(), rec.getMateAlignmentStart());
- Assert.assertFalse(mate.getFirstOfPairFlag() == rec.getFirstOfPairFlag());
- }
-
- /**
- * Compare the results of a multi-interval query versus the union of the results from each interval done
- * separately.
- */
- @Test(dataProvider = "testMultiIntervalQueryDataProvider")
- public void testMultiIntervalQuery(final boolean contained) {
- final List<String> referenceNames = getReferenceNames(BAM_FILE);
-
- final QueryInterval[] intervals = generateRandomIntervals(referenceNames.size(), 1000, new Random());
- final Set<SAMRecord> multiIntervalRecords = new HashSet<SAMRecord>();
- final Set<SAMRecord> singleIntervalRecords = new HashSet<SAMRecord>();
- final SamReader reader = SamReaderFactory.makeDefault().open(BAM_FILE);
- for (final QueryInterval interval : intervals) {
- consumeAll(singleIntervalRecords, reader.query(referenceNames.get(interval.referenceIndex), interval.start, interval.end, contained));
- }
-
- final QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
- consumeAll(multiIntervalRecords, reader.query(optimizedIntervals, contained));
- final Iterator<SAMRecord> singleIntervalRecordIterator = singleIntervalRecords.iterator();
- boolean failed = false;
- while (singleIntervalRecordIterator.hasNext()) {
- final SAMRecord record = singleIntervalRecordIterator.next();
- if (!multiIntervalRecords.remove(record)) {
- System.out.println("SingleIntervalQuery found " + record + " but MultiIntervalQuery did not");
- failed = true;
- }
- }
- for (final SAMRecord record : multiIntervalRecords) {
- System.out.println("MultiIntervalQuery found " + record + " but SingleIntervalQuery did not");
- failed = true;
- }
- Assert.assertFalse(failed);
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "testMultiIntervalQueryDataProvider")
- private Object[][] testMultiIntervalQueryDataProvider() {
- return new Object[][]{{true}, {false}};
- }
-
- @Test
- public void testUnmappedMateWithCoordinate() throws Exception {
- // TODO: Use SAMRecordSetBuilder when it is able to create a pair with one end unmapped
- final String samText = "@HD\tVN:1.0\tSO:coordinate\n" +
- "@SQ\tSN:chr1\tLN:101\n" +
- "@SQ\tSN:chr2\tLN:101\n" +
- "@SQ\tSN:chr3\tLN:101\n" +
- "@SQ\tSN:chr4\tLN:101\n" +
- "@SQ\tSN:chr5\tLN:101\n" +
- "@SQ\tSN:chr6\tLN:101\n" +
- "@SQ\tSN:chr7\tLN:404\n" +
- "@SQ\tSN:chr8\tLN:202\n" +
- "@RG\tID:0\tSM:Hi,Mom!\n" +
- "@PG\tID:1\tPN:Hey!\tVN:2.0\n" +
- "one_end_mapped\t73\tchr7\t100\t255\t101M\t*\t0\t0\tCAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN\t)'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/&\tRG:Z:0\n" +
- "one_end_mapped\t133\tchr7\t100\t0\t*\t=\t100\t0\tNCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA\t&/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1\tRG:Z:0\n";
- final ByteArrayInputStream bis = new ByteArrayInputStream(StringUtil.stringToBytes(samText));
- final File bamFile = File.createTempFile("BAMFileIndexTest.", BamFileIoUtils.BAM_FILE_EXTENSION);
- bamFile.deleteOnExit();
- final SamReader textReader = SamReaderFactory.makeDefault().open(SamInputResource.of(bis));
- SAMFileWriterFactory samFileWriterFactory = new SAMFileWriterFactory();
- samFileWriterFactory.setCreateIndex(true);
- final SAMFileWriter writer = samFileWriterFactory.makeBAMWriter(textReader.getFileHeader(), true, bamFile);
- for (final SAMRecord rec : textReader) {
- writer.addAlignment(rec);
- }
- writer.close();
- final SamReader bamReader = SamReaderFactory.makeDefault().open(bamFile);
- SamFiles.findIndex(bamFile).deleteOnExit();
- Assert.assertEquals(countElements(bamReader.queryContained("chr7", 100, 100)), 1);
- Assert.assertEquals(countElements(bamReader.queryOverlapping("chr7", 100, 100)), 2);
- bamReader.close();
- textReader.close();
- }
-
- private <E> void consumeAll(final Collection<E> collection, final CloseableIterator<E> iterator) {
- while (iterator.hasNext()) {
- collection.add(iterator.next());
- }
- iterator.close();
- }
-
- private SAMRecord getSingleRecordStartingAt(final SamReader reader, final String sequence, final int alignmentStart) {
- final CloseableIterator<SAMRecord> it = reader.queryAlignmentStart(sequence, alignmentStart);
- Assert.assertTrue(it.hasNext());
- final SAMRecord rec = it.next();
- Assert.assertNotNull(rec);
- Assert.assertFalse(it.hasNext());
- it.close();
- return rec;
- }
-
- private int countElements(final CloseableIterator<SAMRecord> it) {
- int num;
- for (num = 0; it.hasNext(); ++num, it.next()) {
- }
- it.close();
- return num;
- }
-
- private void checkChromosome(final String name, final int expectedCount) {
- int count = runQueryTest(BAM_FILE, name, 0, 0, true);
- assertEquals(count, expectedCount);
- count = runQueryTest(BAM_FILE, name, 0, 0, false);
- assertEquals(count, expectedCount);
- }
-
- private void runRandomTest(final File bamFile, final int count, final Random generator) {
- final List<String> referenceNames = getReferenceNames(bamFile);
- final QueryInterval[] intervals = generateRandomIntervals(referenceNames.size(), count, generator);
- for (final QueryInterval interval : intervals) {
- final String refName = referenceNames.get(interval.referenceIndex);
- final int startPos = interval.start;
- final int endPos = interval.end;
- System.out.println("Testing query " + refName + ":" + startPos + "-" + endPos + " ...");
- try {
- runQueryTest(bamFile, refName, startPos, endPos, true);
- runQueryTest(bamFile, refName, startPos, endPos, false);
- } catch (final Throwable exc) {
- String message = "Query test failed: " + refName + ":" + startPos + "-" + endPos;
- message += ": " + exc.getMessage();
- throw new RuntimeException(message, exc);
- }
- }
- }
-
- private QueryInterval[] generateRandomIntervals(final int numReferences, final int count, final Random generator) {
- final QueryInterval[] intervals = new QueryInterval[count];
- final int maxCoordinate = 10000000;
- for (int i = 0; i < count; i++) {
- final int referenceIndex = generator.nextInt(numReferences);
- final int coord1 = generator.nextInt(maxCoordinate + 1);
- final int coord2 = generator.nextInt(maxCoordinate + 1);
- final int startPos = Math.min(coord1, coord2);
- final int endPos = Math.max(coord1, coord2);
- intervals[i] = new QueryInterval(referenceIndex, startPos, endPos);
- }
-
- return intervals;
- }
-
- private List<String> getReferenceNames(final File bamFile) {
- final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
- final List<String> result = new ArrayList<String>();
- final List<SAMSequenceRecord> seqRecords = reader.getFileHeader().getSequenceDictionary().getSequences();
- for (final SAMSequenceRecord seqRecord : seqRecords) {
- if (seqRecord.getSequenceName() != null) {
- result.add(seqRecord.getSequenceName());
- }
- }
- CloserUtil.close(reader);
- return result;
- }
-
- private int runQueryTest(final File bamFile, final String sequence, final int startPos, final int endPos, final boolean contained) {
- verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
- final SamReader reader1 = SamReaderFactory.makeDefault().open(bamFile);
- final SamReader reader2 = SamReaderFactory.makeDefault().open(bamFile);
- final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
- final Iterator<SAMRecord> iter2 = reader2.iterator();
- // Compare ordered iterators.
- // Confirm that iter1 is a subset of iter2 that properly filters.
- SAMRecord record1 = null;
- SAMRecord record2 = null;
- int count1 = 0;
- int count2 = 0;
- int beforeCount = 0;
- int afterCount = 0;
- while (true) {
- if (record1 == null && iter1.hasNext()) {
- record1 = iter1.next();
- count1++;
- }
- if (record2 == null && iter2.hasNext()) {
- record2 = iter2.next();
- count2++;
- }
- // System.out.println("Iteration:");
- // System.out.println(" Record1 = " + ((record1 == null) ? "null" : record1.format()));
- // System.out.println(" Record2 = " + ((record2 == null) ? "null" : record2.format()));
- if (record1 == null && record2 == null) {
- break;
- }
- if (record1 == null) {
- checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
- record2 = null;
- afterCount++;
- continue;
- }
- assertNotNull(record2);
- final int ordering = compareCoordinates(record1, record2);
- if (ordering > 0) {
- checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
- record2 = null;
- beforeCount++;
- continue;
- }
- assertTrue(ordering == 0);
- checkPassesFilter(true, record1, sequence, startPos, endPos, contained);
- checkPassesFilter(true, record2, sequence, startPos, endPos, contained);
- assertEquals(record1.getReadName(), record2.getReadName());
- assertEquals(record1.getReadString(), record2.getReadString());
- record1 = null;
- record2 = null;
- }
- CloserUtil.close(reader1);
- CloserUtil.close(reader2);
- verbose("Checked " + count1 + " records against " + count2 + " records.");
- verbose("Found " + (count2 - beforeCount - afterCount) + " records matching.");
- verbose("Found " + beforeCount + " records before.");
- verbose("Found " + afterCount + " records after.");
- return count1;
- }
-
- private void checkPassesFilter(final boolean expected, final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
- final boolean passes = passesFilter(record, sequence, startPos, endPos, contained);
- if (passes != expected) {
- System.out.println("Error: Record erroneously " +
- (passes ? "passed" : "failed") +
- " filter.");
- System.out.println(" Record: " + record.getSAMString());
- System.out.println(" Filter: " + sequence + ":" +
- startPos + "-" + endPos +
- " (" + (contained ? "contained" : "overlapping") + ")");
- assertEquals(passes, expected);
- }
- }
-
- private boolean passesFilter(final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
- if (record == null) {
- return false;
- }
- if (!safeEquals(record.getReferenceName(), sequence)) {
- return false;
- }
- final int alignmentStart = record.getAlignmentStart();
- int alignmentEnd = record.getAlignmentEnd();
- if (alignmentStart <= 0) {
- assertTrue(record.getReadUnmappedFlag());
- return false;
- }
- if (alignmentEnd <= 0) {
- // For indexing-only records, treat as single base alignment.
- assertTrue(record.getReadUnmappedFlag());
- alignmentEnd = alignmentStart;
- }
- if (contained) {
- if (startPos != 0 && alignmentStart < startPos) {
- return false;
- }
- if (endPos != 0 && alignmentEnd > endPos) {
- return false;
- }
- } else {
- if (startPos != 0 && alignmentEnd < startPos) {
- return false;
- }
- if (endPos != 0 && alignmentStart > endPos) {
- return false;
- }
- }
- return true;
- }
-
- private int compareCoordinates(final SAMRecord record1, final SAMRecord record2) {
- final int seqIndex1 = record1.getReferenceIndex();
- final int seqIndex2 = record2.getReferenceIndex();
- if (seqIndex1 == -1) {
- return ((seqIndex2 == -1) ? 0 : -1);
- } else if (seqIndex2 == -1) {
- return 1;
- }
- int result = seqIndex1 - seqIndex2;
- if (result != 0) {
- return result;
- }
- result = record1.getAlignmentStart() - record2.getAlignmentStart();
- return result;
- }
-
- private boolean safeEquals(final Object o1, final Object o2) {
- if (o1 == o2) {
- return true;
- } else if (o1 == null || o2 == null) {
- return false;
- } else {
- return o1.equals(o2);
- }
- }
-
- private void verbose(final String text) {
- if (mVerbose) {
- System.out.println("# " + text);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java b/src/test/java/htsjdk/samtools/BAMFileWriterTest.java
deleted file mode 100644
index a8944d0..0000000
--- a/src/test/java/htsjdk/samtools/BAMFileWriterTest.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Test that BAM writing doesn't blow up. For presorted writing, the resulting BAM file is read and contents are
- * compared with the original SAM file.
- */
-public class BAMFileWriterTest {
-
- private SAMRecordSetBuilder getRecordSetBuilder(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
- final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
- ret.addPair("readB", 20, 200, 300);
- ret.addPair("readA", 20, 100, 150);
- ret.addFrag("readC", 20, 140, true);
- ret.addFrag("readD", 20, 140, false);
- return ret;
- }
-
- /**
- * Parse some SAM text into a SAM object, then write as BAM. If SAM text was presorted, then the BAM file can
- * be read and compared with the SAM object.
- *
- * @param samRecordSetBuilder source of input {@link SamReader} to be written and compared with
- * @param sortOrder How the BAM should be written
- * @param presorted If true, samText is in the order specified by sortOrder
- */
- private void testHelper(final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder sortOrder, final boolean presorted) throws Exception {
- final SamReader samReader = samRecordSetBuilder.getSamReader();
- final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
- bamFile.deleteOnExit();
- samReader.getFileHeader().setSortOrder(sortOrder);
- final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samReader.getFileHeader(), presorted, bamFile);
- CloseableIterator<SAMRecord> it = samReader.iterator();
- while (it.hasNext()) {
- bamWriter.addAlignment(it.next());
- }
- bamWriter.close();
- it.close();
- samReader.close();
-
- if (presorted) { // If SAM text input was presorted, then we can compare SAM object to BAM object
- verifyBAMFile(samRecordSetBuilder, bamFile);
- }
- }
-
- private void verifyBAMFile(final SAMRecordSetBuilder samRecordSetBuilder, final File bamFile) {
-
- final SamReader bamReader = SamReaderFactory.makeDefault().open(bamFile);
- final SamReader samReader = samRecordSetBuilder.getSamReader();
- samReader.getFileHeader().setSortOrder(bamReader.getFileHeader().getSortOrder());
- Assert.assertEquals(bamReader.getFileHeader(), samReader.getFileHeader());
- final CloseableIterator<SAMRecord> it = samReader.iterator();
- final CloseableIterator<SAMRecord> bamIt = bamReader.iterator();
- while (it.hasNext()) {
- Assert.assertTrue(bamIt.hasNext());
- final SAMRecord samRecord = it.next();
- final SAMRecord bamRecord = bamIt.next();
-
- // SAMRecords don't have this set, so stuff it in there
- samRecord.setIndexingBin(bamRecord.getIndexingBin());
-
- // Force reference index attributes to be populated
- samRecord.getReferenceIndex();
- bamRecord.getReferenceIndex();
- samRecord.getMateReferenceIndex();
- bamRecord.getMateReferenceIndex();
-
- Assert.assertEquals(bamRecord, samRecord);
- }
- Assert.assertFalse(bamIt.hasNext());
- CloserUtil.close(samReader);
- }
-
- @DataProvider(name = "test1")
- public Object[][] createTestData() {
- return new Object[][]{
- {"coordinate sorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.coordinate, false},
- {"query sorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.queryname, false},
- {"unsorted", getRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted), SAMFileHeader.SortOrder.unsorted, false},
- {"coordinate presorted", getRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate), SAMFileHeader.SortOrder.coordinate, true},
- {"query presorted", getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname), SAMFileHeader.SortOrder.queryname, true},
- };
- }
-
- @Test(dataProvider = "test1")
- public void testPositive(final String testName, final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder order, final boolean presorted) throws Exception {
-
- testHelper(samRecordSetBuilder, order, presorted);
- }
-
- @Test(dataProvider = "test1")
- public void testNullRecordHeaders(final String testName, final SAMRecordSetBuilder samRecordSetBuilder, final SAMFileHeader.SortOrder order, final boolean presorted) throws Exception {
-
- // test that BAMFileWriter can write records that have a null header
- final SAMFileHeader samHeader = samRecordSetBuilder.getHeader();
- for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
- rec.setHeader(null);
- }
-
- // make sure the records can actually be written out
- final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
- bamFile.deleteOnExit();
- samHeader.setSortOrder(order);
- final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(samHeader, presorted, bamFile);
- for (final SAMRecord rec : samRecordSetBuilder.getRecords()) {
- bamWriter.addAlignment(rec);
- }
- bamWriter.close();
-
- if (presorted) {
- verifyBAMFile(samRecordSetBuilder, bamFile);
- }
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullRecordsMismatchedHeader() throws Exception {
-
- final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname);
- for (final SAMRecord rec : samRecordSetBuilder.getRecords()) {
- rec.setHeader(null);
- }
-
- // create a fake header to make sure the records cannot be written using an invalid
- // sequence dictionary and unresolvable references
- final SAMFileHeader fakeHeader = new SAMFileHeader();
- fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname);
- final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
- bamFile.deleteOnExit();
-
- try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) {
- for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
- bamWriter.addAlignment(rec);
- }
- }
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testRecordsMismatchedHeader() throws Exception {
-
- final SAMRecordSetBuilder samRecordSetBuilder = getRecordSetBuilder(true, SAMFileHeader.SortOrder.queryname);
-
- // create a fake header to make sure the records cannot be written using an invalid
- // sequence dictionary and unresolvable references
- final SAMFileHeader fakeHeader = new SAMFileHeader();
- fakeHeader.setSortOrder(SAMFileHeader.SortOrder.queryname);
- final File bamFile = File.createTempFile("test.", BamFileIoUtils.BAM_FILE_EXTENSION);
- bamFile.deleteOnExit();
-
- try (final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fakeHeader, false, bamFile);) {
- for (SAMRecord rec : samRecordSetBuilder.getRecords()) {
- bamWriter.addAlignment(rec);
- }
- }
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNegativePresorted() throws Exception {
-
- testHelper(getRecordSetBuilder(true, SAMFileHeader.SortOrder.coordinate), SAMFileHeader.SortOrder.queryname, true);
- Assert.fail("Exception should be thrown");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java b/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java
deleted file mode 100644
index 09f9236..0000000
--- a/src/test/java/htsjdk/samtools/BAMIndexWriterTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Test BAM file index creation
- */
-public class BAMIndexWriterTest {
- // Two input files for basic test
- private final String BAM_FILE_LOCATION = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam";
- private final String BAI_FILE_LOCATION = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai";
- private final File BAM_FILE = new File(BAM_FILE_LOCATION);
- private final File BAI_FILE = new File(BAI_FILE_LOCATION);
-
- private final boolean mVerbose = true;
-
- @Test(enabled = true)
- public void testWriteText() throws Exception {
- // Compare the text form of the c-generated bai file and a java-generated one
- final File cBaiTxtFile = File.createTempFile("cBai.", ".bai.txt");
- BAMIndexer.createAndWriteIndex(BAI_FILE, cBaiTxtFile, true);
- verbose("Wrote textual C BAM Index file " + cBaiTxtFile);
-
- final File javaBaiFile = File.createTempFile("javaBai.", "java.bai");
- final File javaBaiTxtFile = new File(javaBaiFile.getAbsolutePath() + ".txt");
- final SamReader bam = SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).open(BAM_FILE);
- BAMIndexer.createIndex(bam, javaBaiFile);
- verbose("Wrote binary Java BAM Index file " + javaBaiFile);
-
- // now, turn the bai file into text
- BAMIndexer.createAndWriteIndex(javaBaiFile, javaBaiTxtFile, true);
- // and compare them
- verbose("diff " + javaBaiTxtFile + " " + cBaiTxtFile);
- IOUtil.assertFilesEqual(javaBaiTxtFile, cBaiTxtFile);
- cBaiTxtFile.deleteOnExit();
- javaBaiFile.deleteOnExit();
- javaBaiTxtFile.deleteOnExit();
- CloserUtil.close(bam);
- }
-
- @Test(enabled = true)
- public void testWriteBinary() throws Exception {
- // Compare java-generated bai file with c-generated and sorted bai file
- final File javaBaiFile = File.createTempFile("javaBai.", ".bai");
- final SamReader bam = SamReaderFactory.makeDefault().enable(SamReaderFactory.Option.INCLUDE_SOURCE_IN_RECORDS).open(BAM_FILE);
- BAMIndexer.createIndex(bam, javaBaiFile);
- verbose("Wrote binary java BAM Index file " + javaBaiFile);
-
- final File cRegeneratedBaiFile = File.createTempFile("cBai.", ".bai");
- BAMIndexer.createAndWriteIndex(BAI_FILE, cRegeneratedBaiFile, false);
- verbose("Wrote sorted C binary BAM Index file " + cRegeneratedBaiFile);
-
- // Binary compare of javaBaiFile and cRegeneratedBaiFile should be the same
- verbose("diff " + javaBaiFile + " " + cRegeneratedBaiFile);
- IOUtil.assertFilesEqual(javaBaiFile, cRegeneratedBaiFile);
- javaBaiFile.deleteOnExit();
- cRegeneratedBaiFile.deleteOnExit();
- CloserUtil.close(bam);
- }
-
- @Test(enabled = false, dataProvider = "linearIndexTestData")
- /** Test linear index at specific references and windows */
- public void testLinearIndex(String testName, String filepath, int problemReference, int problemWindowStart, int problemWindowEnd, int expectedCount) {
- final SamReader sfr = SamReaderFactory.makeDefault().open(new File(filepath));
- for (int problemWindow = problemWindowStart; problemWindow <= problemWindowEnd; problemWindow++) {
- int count = countAlignmentsInWindow(problemReference, problemWindow, sfr, expectedCount);
- if (expectedCount != -1)
- assertEquals(expectedCount, count);
- }
- CloserUtil.close(sfr);
- }
-
- @DataProvider(name = "linearIndexTestData")
- public Object[][] getLinearIndexTestData() {
- // Add data here for test cases, reference, and windows where linear index needs testing
- return new Object[][]{
- new Object[]{"index_test", BAM_FILE_LOCATION, 1, 29, 66, -1}, // 29-66
- new Object[]{"index_test", BAM_FILE_LOCATION, 1, 68, 118, -1}, // 29-66
-
- };
- }
-
- private int countAlignmentsInWindow(int reference, int window, SamReader reader, int expectedCount) {
- final int SIXTEEN_K = 1 << 14; // 1 << LinearIndex.BAM_LIDX_SHIFT
- final int start = window >> 14; // window * SIXTEEN_K;
- final int stop = ((window + 1) >> 14) - 1; // (window + 1 * SIXTEEN_K) - 1;
-
- final String chr = reader.getFileHeader().getSequence(reference).getSequenceName();
-
- // get records for the entire linear index window
- SAMRecordIterator iter = reader.queryOverlapping(chr, start, stop);
- SAMRecord rec;
- int count = 0;
- while (iter.hasNext()) {
- rec = iter.next();
- count++;
- if (expectedCount == -1)
- System.err.println(rec.getReadName());
- }
- iter.close();
- return count;
- }
-
-
- @Test(enabled = false, dataProvider = "indexComparisonData")
- /** Test linear index at all references and windows, comparing with existing index */
- public void compareLinearIndex(String testName, String bamFile, String bamIndexFile) throws IOException {
- // compare index generated from bamFile with existing bamIndex file
- // by testing all the references' windows and comparing the counts
-
- // 1. generate bai file
- // 2. count its references
- // 3. count bamIndex references comparing counts
-
- // 1. generate bai file
- File bam = new File(bamFile);
- assertTrue(bam.exists(), testName + " input bam file doesn't exist: " + bamFile);
-
- File indexFile1 = createIndexFile(bam);
- assertTrue(indexFile1.exists(), testName + " generated bam file's index doesn't exist: " + indexFile1);
-
- // 2. count its references
- File indexFile2 = new File(bamIndexFile);
- assertTrue(indexFile2.exists(), testName + " input index file doesn't exist: " + indexFile2);
-
- final CachingBAMFileIndex existingIndex1 = new CachingBAMFileIndex(indexFile1, null); // todo null sequence dictionary?
- final CachingBAMFileIndex existingIndex2 = new CachingBAMFileIndex(indexFile2, null);
- final int n_ref = existingIndex1.getNumberOfReferences();
- assertEquals(n_ref, existingIndex2.getNumberOfReferences());
-
- final SamReader reader1 = SamReaderFactory.makeDefault().disable(SamReaderFactory.Option.EAGERLY_DECODE).open(bam);
-
- final SamReader reader2 = SamReaderFactory.makeDefault().disable(SamReaderFactory.Option.EAGERLY_DECODE).open(bam);
-
- System.out.println("Comparing " + n_ref + " references in " + indexFile1 + " and " + indexFile2);
-
- for (int i = 0; i < n_ref; i++) {
- final BAMIndexContent content1 = existingIndex1.getQueryResults(i);
- final BAMIndexContent content2 = existingIndex2.getQueryResults(i);
- if (content1 == null) {
- assertTrue(content2 == null, "No content for 1st bam index, but content for second at reference" + i);
- continue;
- }
- int[] counts1 = new int[LinearIndex.MAX_LINEAR_INDEX_SIZE];
- int[] counts2 = new int[LinearIndex.MAX_LINEAR_INDEX_SIZE];
- LinearIndex li1 = content1.getLinearIndex();
- LinearIndex li2 = content2.getLinearIndex();
- // todo not li1 and li2 sizes may differ. Implies 0's in the smaller index windows
- // 3. count bamIndex references comparing counts
- int baiSize = Math.max(li1.size(), li2.size());
- for (int win = 0; win < baiSize; win++) {
- counts1[win] = countAlignmentsInWindow(i, win, reader1, 0);
- counts2[win] = countAlignmentsInWindow(i, win, reader2, counts1[win]);
- assertEquals(counts2[win], counts1[win], "Counts don't match for reference " + i +
- " window " + win);
- }
- }
-
- indexFile1.deleteOnExit();
-
- }
-
- @DataProvider(name = "indexComparisonData")
- public Object[][] getIndexComparisonData() {
- // enter bam file and alternate index file to be tested against generated bam index
- return new Object[][]{
- new Object[]{"index_test", BAM_FILE_LOCATION, BAI_FILE_LOCATION},
- };
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testRequireCoordinateSortOrder() {
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.queryname);
-
- new BAMIndexer(new ByteArrayOutputStream(), header);
- }
-
- /** generates the index file using the latest java index generating code */
- private File createIndexFile(File bamFile) throws IOException {
- final File bamIndexFile = File.createTempFile("Bai.", ".bai");
- final SamReader bam = SamReaderFactory.makeDefault().open(bamFile);
- BAMIndexer.createIndex(bam, bamIndexFile);
- verbose("Wrote BAM Index file " + bamIndexFile);
- bam.close();
- return bamIndexFile;
- }
-
- private void verbose(final String text) {
- if (mVerbose) {
- System.out.println("#BAMIndexWriterTest " + text);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMIteratorTest.java b/src/test/java/htsjdk/samtools/BAMIteratorTest.java
deleted file mode 100644
index 5fa9e7d..0000000
--- a/src/test/java/htsjdk/samtools/BAMIteratorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class BAMIteratorTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test(dataProvider = "dataProvider")
- public void testIterateEmptyBam(final String bam) throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, bam));
- int numRecords = 0;
- for (final SAMRecord rec : reader) {
- ++numRecords;
- }
- Assert.assertEquals(numRecords, 0);
- CloserUtil.close(reader);
- }
-
- @Test(dataProvider = "dataProvider")
- public void testQueryUnmappedEmptyBam(final String bam) throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, bam));
- final CloseableIterator<SAMRecord> it = reader.queryUnmapped();
- int numRecords = 0;
- while (it.hasNext()) {
- it.next();
- ++numRecords;
- }
- Assert.assertEquals(numRecords, 0);
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "dataProvider")
- public Object[][] bams() {
- return new Object[][]{
- {"empty.bam"},
- {"empty_no_empty_gzip_block.bam"}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java b/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java
deleted file mode 100644
index 7c0bb1f..0000000
--- a/src/test/java/htsjdk/samtools/BAMQueryMultipleIntervalsIteratorFilterTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Random;
-
-public class BAMQueryMultipleIntervalsIteratorFilterTest {
-
- private final byte[] BASES = {'A', 'C', 'G', 'T'};
- private final Random random = new Random();
-
- @DataProvider(name="compareIntervalToRecord")
- public Object[][] compareIntervalToRecord() {
- return new Object[][] {
- { new QueryInterval(0, 20, 20), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
- { new QueryInterval(0, 20, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
- { new QueryInterval(1, 10, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
- { new QueryInterval(1, 0, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
- { new QueryInterval(1, -1, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
- { new QueryInterval(1, 1, 22), 0, 10, 5, BAMIteratorFilter.IntervalComparison.AFTER },
-
- { new QueryInterval(0, 0, 4), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 0, 5), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 0, -1), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 1, 0), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 1, -1), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 0, 0), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 9, 9), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 1, 4), 0, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
- { new QueryInterval(0, 1, 4), 1, 10, 5, BAMIteratorFilter.IntervalComparison.BEFORE },
-
- { new QueryInterval(0, 0, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 1, -1), 0, 1, 100, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 1, 0), 0, 1, 100, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 1, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 1, -1), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 10, 15), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
- { new QueryInterval(0, 10, 0), 0, 10, 5, BAMIteratorFilter.IntervalComparison.CONTAINED },
-
- { new QueryInterval(0, 10, 11), 0, 10, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
- { new QueryInterval(0, 1, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
- { new QueryInterval(0, 0, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
- { new QueryInterval(0, 1, 10), 0, 9, 5, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
- { new QueryInterval(0, 1, 5), 0, 5, 10, BAMIteratorFilter.IntervalComparison.OVERLAPPING },
- };
- }
-
- @Test(dataProvider = "compareIntervalToRecord")
- public void testCompareIntervalToRecord(
- final QueryInterval query,
- final int refIndex,
- final int start,
- final int length,
- final BAMIteratorFilter.IntervalComparison expectedState)
- {
- SAMRecord samRec = getSAMRecord(refIndex, start, length);
- Assert.assertEquals(BAMQueryMultipleIntervalsIteratorFilter.compareIntervalToRecord(query, samRec), expectedState);
- }
-
- @DataProvider(name="compareToFilter")
- public Object[][] compareToFilter() {
- return new Object[][] {
- { new QueryInterval[] { new QueryInterval(0, 10, 11), new QueryInterval(1, 1, 10) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 10, 11), new QueryInterval(1, 5, 10) },
- 1, 1, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 20, 20), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 20, 22), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(1, 10, 22), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(1, 0, 22), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(1, -1, 22), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 10, 5), new QueryInterval(1, 1, 22) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 1, -1), new QueryInterval(1, 5, 10) },
- 1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION},
-
- { new QueryInterval[] { new QueryInterval(0, 1, 4), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(0, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION },
- { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(0, 5, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION},
- { new QueryInterval[] { new QueryInterval(0, 0, 5), new QueryInterval(1, 5, 5) },
- 1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.STOP_ITERATION},
-
- { new QueryInterval[] { new QueryInterval(1, 10, 5), new QueryInterval(1, 10, 10) },
- 1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.CONTINUE_ITERATION},
- { new QueryInterval[] { new QueryInterval(1, 10, 5), new QueryInterval(1, 10, 10) },
- 1, 10, 5, false, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER},
-
- { new QueryInterval[] { new QueryInterval(0, 0, -1), new QueryInterval(1, 10, 5) },
- 0, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER },
- { new QueryInterval[] { new QueryInterval(0, 1, -1), new QueryInterval(1, 5, -1) },
- 1, 10, 5, true, BAMIteratorFilter.FilteringIteratorState.MATCHES_FILTER},
- };
- }
-
- @Test(dataProvider = "compareToFilter")
- public void testCompareToFilter(
- final QueryInterval[] query,
- final int refIndex,
- final int start,
- final int length,
- final boolean contained,
- final BAMIteratorFilter.FilteringIteratorState expectedState)
- {
- SAMRecord samRec = getSAMRecord(refIndex, start, length);
- BAMQueryMultipleIntervalsIteratorFilter it = new BAMQueryMultipleIntervalsIteratorFilter(query, contained);
- Assert.assertEquals(it.compareToFilter(samRec), expectedState);
- }
-
- /**
- * Fills in bases for the given record to length.
- */
- private SAMRecord getSAMRecord(final int refIndex, final int start, final int length) {
- final byte[] bases = new byte[length];
-
- SAMFileHeader samHeader = new SAMFileHeader();
- samHeader.setSequenceDictionary(
- new SAMSequenceDictionary(
- Arrays.asList(
- new SAMSequenceRecord("chr1", 200),
- new SAMSequenceRecord("chr2", 200))
- )
- );
- SAMRecord samRec = new SAMRecord(samHeader);
- for (int i = 0; i < length; ++i) {
- bases[i] = BASES[random.nextInt(BASES.length)];
- }
- samRec.setReadBases(bases);
- samRec.setReferenceIndex(refIndex);
- samRec.setAlignmentStart(start);
- samRec.setCigarString(length + "M");
-
- return samRec;
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java b/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java
deleted file mode 100644
index 4b686cf..0000000
--- a/src/test/java/htsjdk/samtools/BAMRemoteFileTest.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import static org.testng.Assert.*;
-
-/**
- * Test BAM file indexing.
- */
-public class BAMRemoteFileTest {
- private final File BAM_INDEX_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
- private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
- private final String BAM_URL_STRING = TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam";
- private final URL bamURL;
-
- private final boolean mVerbose = false;
-
- public BAMRemoteFileTest() throws Exception {
- bamURL = new URL(BAM_URL_STRING);
- }
-
-
- @Test
- void testRemoteLocal()
- throws Exception {
- runLocalRemoteTest(bamURL, BAM_FILE, "chrM", 10400, 10600, false);
- }
-
- @Test
- public void testSpecificQueries()
- throws Exception {
- assertEquals(runQueryTest(bamURL, "chrM", 10400, 10600, true), 1);
- assertEquals(runQueryTest(bamURL, "chrM", 10400, 10600, false), 2);
- }
-
- @Test(enabled = true)
- public void testRandomQueries()
- throws Exception {
- runRandomTest(bamURL, 20, new Random());
- }
-
- @Test
- public void testWholeChromosomes() {
- checkChromosome("chrM", 23);
- checkChromosome("chr1", 885);
- checkChromosome("chr2", 837);
- /***
- checkChromosome("chr3", 683);
- checkChromosome("chr4", 633);
- checkChromosome("chr5", 611);
- checkChromosome("chr6", 585);
- checkChromosome("chr7", 521);
- checkChromosome("chr8", 507);
- checkChromosome("chr9", 388);
- checkChromosome("chr10", 477);
- checkChromosome("chr11", 467);
- checkChromosome("chr12", 459);
- checkChromosome("chr13", 327);
- checkChromosome("chr14", 310);
- checkChromosome("chr15", 280);
- checkChromosome("chr16", 278);
- checkChromosome("chr17", 269);
- checkChromosome("chr18", 265);
- checkChromosome("chr19", 178);
- checkChromosome("chr20", 228);
- checkChromosome("chr21", 123);
- checkChromosome("chr22", 121);
- checkChromosome("chrX", 237);
- checkChromosome("chrY", 29);
- ***/
- }
-
-
- private void checkChromosome(final String name, final int expectedCount) {
- int count = runQueryTest(bamURL, name, 0, 0, true);
- assertEquals(count, expectedCount);
- count = runQueryTest(bamURL, name, 0, 0, false);
- assertEquals(count, expectedCount);
- }
-
- private void runRandomTest(final URL bamFile, final int count, final Random generator) throws IOException {
- final int maxCoordinate = 10000000;
- final List<String> referenceNames = getReferenceNames(bamFile);
- for (int i = 0; i < count; i++) {
- final String refName = referenceNames.get(generator.nextInt(referenceNames.size()));
- final int coord1 = generator.nextInt(maxCoordinate + 1);
- final int coord2 = generator.nextInt(maxCoordinate + 1);
- final int startPos = Math.min(coord1, coord2);
- final int endPos = Math.max(coord1, coord2);
- System.out.println("Testing query " + refName + ":" + startPos + "-" + endPos + " ...");
- try {
- runQueryTest(bamFile, refName, startPos, endPos, true);
- runQueryTest(bamFile, refName, startPos, endPos, false);
- } catch (Throwable exc) {
- String message = "Query test failed: " + refName + ":" + startPos + "-" + endPos;
- message += ": " + exc.getMessage();
- throw new RuntimeException(message, exc);
- }
- }
- }
-
- private List<String> getReferenceNames(final URL bamFile) throws IOException {
-
-
- final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(bamFile.openStream()));
-
- final List<String> result = new ArrayList<String>();
- final List<SAMSequenceRecord> seqRecords = reader.getFileHeader().getSequenceDictionary().getSequences();
- for (final SAMSequenceRecord seqRecord : seqRecords) {
- if (seqRecord.getSequenceName() != null) {
- result.add(seqRecord.getSequenceName());
- }
- }
- reader.close();
- return result;
- }
-
- private void runLocalRemoteTest(final URL bamURL, final File bamFile, final String sequence, final int startPos, final int endPos, final boolean contained) {
- verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
- final SamReader reader1 = SamReaderFactory.makeDefault()
- .disable(SamReaderFactory.Option.EAGERLY_DECODE)
- .open(SamInputResource.of(bamFile).index(BAM_INDEX_FILE));
- final SamReader reader2 = SamReaderFactory.makeDefault()
- .disable(SamReaderFactory.Option.EAGERLY_DECODE)
- .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
- final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
- final Iterator<SAMRecord> iter2 = reader2.query(sequence, startPos, endPos, contained);
-
- final List<SAMRecord> records1 = new ArrayList<SAMRecord>();
- final List<SAMRecord> records2 = new ArrayList<SAMRecord>();
-
- while (iter1.hasNext()) {
- records1.add(iter1.next());
- }
- while (iter2.hasNext()) {
- records2.add(iter2.next());
- }
-
- assertTrue(records1.size() > 0);
- assertEquals(records1.size(), records2.size());
- for (int i = 0; i < records1.size(); i++) {
- //System.out.println(records1.get(i).format());
- assertEquals(records1.get(i).getSAMString(), records2.get(i).getSAMString());
- }
-
-
- }
-
- private int runQueryTest(final URL bamURL, final String sequence, final int startPos, final int endPos, final boolean contained) {
- verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
- final SamReader reader1 = SamReaderFactory.makeDefault()
- .disable(SamReaderFactory.Option.EAGERLY_DECODE)
- .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
- final SamReader reader2 = SamReaderFactory.makeDefault()
- .disable(SamReaderFactory.Option.EAGERLY_DECODE)
- .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
- final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
- final Iterator<SAMRecord> iter2 = reader2.iterator();
- // Compare ordered iterators.
- // Confirm that iter1 is a subset of iter2 that properly filters.
- SAMRecord record1 = null;
- SAMRecord record2 = null;
- int count1 = 0;
- int count2 = 0;
- int beforeCount = 0;
- int afterCount = 0;
- while (true) {
- if (record1 == null && iter1.hasNext()) {
- record1 = iter1.next();
- count1++;
- }
- if (record2 == null && iter2.hasNext()) {
- record2 = iter2.next();
- count2++;
- }
- // System.out.println("Iteration:");
- // System.out.println(" Record1 = " + ((record1 == null) ? "null" : record1.format()));
- // System.out.println(" Record2 = " + ((record2 == null) ? "null" : record2.format()));
- if (record1 == null && record2 == null) {
- break;
- }
- if (record1 == null) {
- checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
- record2 = null;
- afterCount++;
- continue;
- }
- assertNotNull(record2);
- final int ordering = compareCoordinates(record1, record2);
- if (ordering > 0) {
- checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
- record2 = null;
- beforeCount++;
- continue;
- }
- assertTrue(ordering == 0);
- checkPassesFilter(true, record1, sequence, startPos, endPos, contained);
- checkPassesFilter(true, record2, sequence, startPos, endPos, contained);
- assertEquals(record1.getReadName(), record2.getReadName());
- assertEquals(record1.getReadString(), record2.getReadString());
- record1 = null;
- record2 = null;
- }
- CloserUtil.close(reader1);
- CloserUtil.close(reader2);
- verbose("Checked " + count1 + " records against " + count2 + " records.");
- verbose("Found " + (count2 - beforeCount - afterCount) + " records matching.");
- verbose("Found " + beforeCount + " records before.");
- verbose("Found " + afterCount + " records after.");
- return count1;
- }
-
- private void checkPassesFilter(final boolean expected, final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
- final boolean passes = passesFilter(record, sequence, startPos, endPos, contained);
- if (passes != expected) {
- System.out.println("Error: Record erroneously " +
- (passes ? "passed" : "failed") +
- " filter.");
- System.out.println(" Record: " + record.getSAMString());
- System.out.println(" Filter: " + sequence + ":" +
- startPos + "-" + endPos +
- " (" + (contained ? "contained" : "overlapping") + ")");
- assertEquals(passes, expected);
- }
- }
-
- private boolean passesFilter(final SAMRecord record, final String sequence, final int startPos, final int endPos, final boolean contained) {
- if (record == null) {
- return false;
- }
- if (!safeEquals(record.getReferenceName(), sequence)) {
- return false;
- }
- final int alignmentStart = record.getAlignmentStart();
- int alignmentEnd = record.getAlignmentEnd();
- if (alignmentStart <= 0) {
- assertTrue(record.getReadUnmappedFlag());
- return false;
- }
- if (alignmentEnd <= 0) {
- // For indexing-only records, treat as single base alignment.
- assertTrue(record.getReadUnmappedFlag());
- alignmentEnd = alignmentStart;
- }
- if (contained) {
- if (startPos != 0 && alignmentStart < startPos) {
- return false;
- }
- if (endPos != 0 && alignmentEnd > endPos) {
- return false;
- }
- } else {
- if (startPos != 0 && alignmentEnd < startPos) {
- return false;
- }
- if (endPos != 0 && alignmentStart > endPos) {
- return false;
- }
- }
- return true;
- }
-
- private int compareCoordinates(final SAMRecord record1, final SAMRecord record2) {
- final int seqIndex1 = record1.getReferenceIndex();
- final int seqIndex2 = record2.getReferenceIndex();
- if (seqIndex1 == -1) {
- return ((seqIndex2 == -1) ? 0 : -1);
- } else if (seqIndex2 == -1) {
- return 1;
- }
- int result = seqIndex1 - seqIndex2;
- if (result != 0) {
- return result;
- }
- result = record1.getAlignmentStart() - record2.getAlignmentStart();
- return result;
- }
-
- private boolean safeEquals(final Object o1, final Object o2) {
- if (o1 == o2) {
- return true;
- } else if (o1 == null || o2 == null) {
- return false;
- } else {
- return o1.equals(o2);
- }
- }
-
- private void verbose(final String text) {
- if (mVerbose) {
- System.out.println("# " + text);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/BinTest.java b/src/test/java/htsjdk/samtools/BinTest.java
deleted file mode 100644
index 271a411..0000000
--- a/src/test/java/htsjdk/samtools/BinTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Collections;
-
-public class BinTest {
- @Test
- public void testEmptyBin() {
- // Construct a new empty bin and ensure that the bin list is empty, not null.
- Bin bin = new Bin(1,4681);
- Assert.assertEquals(bin.getChunkList(),Collections.<Chunk>emptyList(),"getChunkList() in an empty bin should return an empty list.");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java b/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java
deleted file mode 100644
index 6f3b954..0000000
--- a/src/test/java/htsjdk/samtools/CRAMBAIIndexerTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerFactory;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 12/01/2016.
- */
-public class CRAMBAIIndexerTest {
-
- private static CramCompressionRecord createRecord(int recordIndex, int seqId, int start) {
- byte[] bases = "AAAAA".getBytes();
- int readLength = bases.length;
-
- final CramCompressionRecord record = new CramCompressionRecord();
- record.setSegmentUnmapped(false);
- record.setMultiFragment(false);
- record.sequenceId = seqId;
- record.alignmentStart =start;
- record.readBases = record.qualityScores = bases;
- record.readName = Integer.toString(recordIndex);
- record.readLength = readLength;
- record.readFeatures = Collections.emptyList();
-
- return record;
- }
- @Test
- public void test_processMultiContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- samFileHeader.addSequence(new SAMSequenceRecord("1", 10));
- samFileHeader.addSequence(new SAMSequenceRecord("2", 10));
- samFileHeader.addSequence(new SAMSequenceRecord("3", 10));
- ByteArrayOutputStream indexBAOS = new ByteArrayOutputStream();
- CRAMBAIIndexer indexer = new CRAMBAIIndexer(indexBAOS, samFileHeader);
- int recordsPerContainer = 3;
- ContainerFactory containerFactory = new ContainerFactory(samFileHeader, recordsPerContainer);
- List<CramCompressionRecord> records = new ArrayList<>();
- records.add(createRecord(0, 0, 1));
- records.add(createRecord(1, 1, 2));
- records.add(createRecord(2, 1, 3));
-
- final Container container1 = containerFactory.buildContainer(records);
- Assert.assertNotNull(container1);
- Assert.assertEquals(container1.nofRecords, records.size());
- Assert.assertEquals(container1.sequenceId, Slice.MULTI_REFERENCE);
-
- indexer.processContainer(container1, ValidationStringency.STRICT);
-
- records.clear();
- records.add(createRecord(3, 1, 3));
- records.add(createRecord(4, 2, 3));
- records.add(createRecord(5, 2, 4));
- final Container container2 = containerFactory.buildContainer(records);
- Assert.assertNotNull(container2);
- Assert.assertEquals(container2.nofRecords, records.size());
- Assert.assertEquals(container2.sequenceId, Slice.MULTI_REFERENCE);
-
- indexer.processContainer(container2, ValidationStringency.STRICT);
-
- indexer.finish();
-
- BAMIndex index = new CachingBAMFileIndex(new SeekableMemoryStream(indexBAOS.toByteArray(), null), samFileHeader.getSequenceDictionary());
- final BAMIndexMetaData metaData_0 = index.getMetaData(0);
- Assert.assertNotNull(metaData_0);
- Assert.assertEquals(metaData_0.getAlignedRecordCount(), 1);
-
- final BAMIndexMetaData metaData_1 = index.getMetaData(1);
- Assert.assertNotNull(metaData_1);
- Assert.assertEquals(metaData_1.getAlignedRecordCount(), 3);
-
- final BAMIndexMetaData metaData_2 = index.getMetaData(2);
- Assert.assertNotNull(metaData_2);
- Assert.assertEquals(metaData_2.getAlignedRecordCount(), 2);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java b/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java
deleted file mode 100644
index 11d2f3c..0000000
--- a/src/test/java/htsjdk/samtools/CRAMCRAIIndexerTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Companion to CRAMBAIIndexerTest, for testing CRAI indices created on cram
- * streams;
- */
-public class CRAMCRAIIndexerTest {
-
- @Test
- public void testCRAIIndexerFromContainer() throws IOException {
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/test2.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
- CRAMFileReader reader = new CRAMFileReader(
- CRAMFile,
- null,
- refSource,
- ValidationStringency.STRICT);
- SAMFileHeader samHeader = reader.getFileHeader();
- Iterator<SAMRecord> it = reader.getIterator();
- while(it.hasNext()) {
- SAMRecord samRec = it.next();
- }
-
- reader.close();
-
- FileInputStream fis = new FileInputStream(CRAMFile);
- CramContainerIterator cit = new CramContainerIterator(fis);
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
- CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
- while (cit.hasNext()) {
- craiIndexer.processContainer(cit.next());
- }
- craiIndexer.finish();
- bos.close();
-
- List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries();
- Assert.assertEquals(craiEntries.size(), 1);
- }
-
- @Test
- public void testCRAIIndexerFromStream() throws IOException {
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/test2.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/test2.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
-
- // get the header to use
- CRAMFileReader reader = new CRAMFileReader(
- CRAMFile,
- null,
- refSource,
- ValidationStringency.STRICT);
- SAMFileHeader samHeader = reader.getFileHeader();
- reader.close();
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
- craiIndexer.writeIndex(new SeekableFileStream(CRAMFile), bos);
-
- List<CRAIEntry> craiEntries = CRAMCRAIIndexer.readIndex(new ByteArrayInputStream(bos.toByteArray())).getCRAIEntries();
- Assert.assertEquals(craiEntries.size(), 1);
- }
-
- @Test
- public void testMultiRefContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- samFileHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
- samFileHeader.addSequence(new SAMSequenceRecord("1", 10));
- samFileHeader.addSequence(new SAMSequenceRecord("2", 10));
- samFileHeader.addSequence(new SAMSequenceRecord("3", 10));
-
- ReferenceSource source = new ReferenceSource(new FakeReferenceSequenceFile(samFileHeader.getSequenceDictionary().getSequences()));
-
- ByteArrayOutputStream cramBAOS = new ByteArrayOutputStream();
- ByteArrayOutputStream indexBAOS = new ByteArrayOutputStream();
-
- // force the containers to be small to ensure there are 2
- int originalDefaultSize = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = 3;
-
- try {
- CRAMContainerStreamWriter containerWriter = new CRAMContainerStreamWriter(cramBAOS, indexBAOS, source, samFileHeader, "test");
- containerWriter.writeHeader(samFileHeader);
-
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 0, 0, 1));
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 1, 1, 2));
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 2, 1, 3));
-
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 3, 1, 3));
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 4, 2, 3));
- containerWriter.writeAlignment(createSAMRecord(samFileHeader, 5, 2, 4));
-
- containerWriter.finish(true);
- }
- finally {
- // failing to reset this can cause unrelated tests to fail if this test fails
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = originalDefaultSize;
- }
-
- // These tests all fail due to https://github.com/samtools/htsjdk/issues/531
- // (metadata is incorrect after .crai->.bai conversion)
- //SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(
- // new ByteArrayInputStream(indexBAOS.toByteArray()), samFileHeader.getSequenceDictionary());
- //BAMIndex index = new CachingBAMFileIndex(baiStream, samFileHeader.getSequenceDictionary());
- //final BAMIndexMetaData metaData_0 = index.getMetaData(0);
- //Assert.assertNotNull(metaData_0);
- //Assert.assertEquals(metaData_0.getAlignedRecordCount(), 1);
- //final BAMIndexMetaData metaData_1 = index.getMetaData(1);
- //Assert.assertNotNull(metaData_1);
- //Assert.assertEquals(metaData_1.getAlignedRecordCount(), 3);
- //final BAMIndexMetaData metaData_2 = index.getMetaData(2);
- //Assert.assertNotNull(metaData_2);
- //Assert.assertEquals(metaData_2.getAlignedRecordCount(), 2);
-
- // NOTE: this test uses the default index format created by CRAMContainerStreamWriter
- // which is currently .bai; when the
- CRAMFileReader cramReader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBAOS.toByteArray()),
- new ByteArraySeekableStream(indexBAOS.toByteArray()),
- source,
- ValidationStringency.DEFAULT_STRINGENCY
- );
- Assert.assertTrue(cramReader.hasIndex());
-
- Iterator<SAMRecord> it = cramReader.query(new QueryInterval[]{new QueryInterval(0, 0, 5)}, false);
- long count = getIteratorCount(it);
- Assert.assertEquals(count, 1);
-
- it = cramReader.query(new QueryInterval[]{new QueryInterval(1, 0, 5)}, false);
- count = getIteratorCount(it);
- Assert.assertEquals(count, 3);
-
- it = cramReader.query(new QueryInterval[]{new QueryInterval(2, 0, 5)}, false);
- count = getIteratorCount(it);
- Assert.assertEquals(count, 2);
- }
-
- private static SAMRecord createSAMRecord(SAMFileHeader header, int recordIndex, int seqId, int start) {
- byte[] bases = "AAAAA".getBytes();
-
- final SAMRecord record = new SAMRecord(header);
- record.setReferenceIndex(seqId);
- record.setAlignmentStart(start);
- record.setReadBases(bases);
- record.setBaseQualities(bases);
- record.setReadName(Integer.toString(recordIndex));
-
- return record;
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testRequireCoordinateSortOrder() {
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.queryname);
-
- new CRAMCRAIIndexer(new ByteArrayOutputStream(), header);
- }
-
- private long getIteratorCount(Iterator<SAMRecord> it) {
- long count = 0;
- while (it.hasNext()) {
- count++;
- it.next();
- }
- return count;
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java b/src/test/java/htsjdk/samtools/CRAMComplianceTest.java
deleted file mode 100644
index 81cd2f9..0000000
--- a/src/test/java/htsjdk/samtools/CRAMComplianceTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 28/04/2015.
- */
-public class CRAMComplianceTest {
-
- @DataProvider(name = "test1")
- public Object[][] createData1() {
- return new Object[][]{
- {"auxf#values"},
- {"c1#bounds"},
- {"c1#clip"},
- {"c1#noseq"},
- {"c1#pad1"},
- {"c1#pad2"},
- {"c1#pad3"},
- {"c1#unknown"},
- {"ce#1"},
- {"ce#2"},
- {"ce#5b"},
- {"ce#5"},
- {"ce#large_seq"},
- {"ce#supp"},
- {"ce#tag_depadded"},
- {"ce#tag_padded"},
- {"ce#unmap1"},
- {"ce#unmap2"},
- {"ce#unmap"},
- {"xx#blank"},
- {"xx#large_aux2"},
- {"xx#large_aux"},
- {"xx#minimal"},
- {"xx#pair"},
- {"xx#rg"},
- {"xx#triplet"},
- {"xx#unsorted"},
- };
- }
-
-
- @BeforeTest
- public void beforeTest() {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
- }
-
- private static class TestCase {
- File bamFile;
- File refFile;
- File cramFile_21;
- File cramFile_30;
-
- public TestCase(File root, String name) {
- bamFile = new File(root, name + ".sam");
- refFile = new File(root, name.split("#")[0] + ".fa");
- cramFile_21 = new File(root, name + ".2.1.cram");
- cramFile_30 = new File(root, name + ".3.0.cram");
- }
- }
-
- @Test(dataProvider = "test1")
- public void test(String name) throws IOException {
- TestCase t = new TestCase(new File("src/test/resources/htsjdk/samtools/cram/"), name);
-
- ReferenceSource source = new ReferenceSource(t.refFile);
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(t.bamFile);
-
- final SAMRecordIterator samRecordIterator = reader.iterator();
- List<SAMRecord> samRecords = new ArrayList<SAMRecord>();
- while (samRecordIterator.hasNext())
- samRecords.add(samRecordIterator.next());
- SAMFileHeader samFileHeader = reader.getFileHeader();
- reader.close();
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, samFileHeader, name);
- for (SAMRecord samRecord : samRecords) {
- cramFileWriter.addAlignment(samRecord);
- }
- cramFileWriter.close();
-
-
- CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream)null, source, ValidationStringency.SILENT);
- SAMRecordIterator cramFileReaderIterator = cramFileReader.getIterator();
- for (SAMRecord samRecord : samRecords) {
- Assert.assertTrue(cramFileReaderIterator.hasNext());
- SAMRecord restored = cramFileReaderIterator.next();
- Assert.assertNotNull(restored);
- assertSameRecords(CramVersions.DEFAULT_CRAM_VERSION.major, samRecord, restored);
- }
- Assert.assertFalse(cramFileReaderIterator.hasNext());
-
- //v2.1 test
- cramFileReader = new CRAMFileReader(new FileInputStream(t.cramFile_21), (SeekableStream)null, source, ValidationStringency.SILENT);
- cramFileReaderIterator = cramFileReader.getIterator();
- for (SAMRecord samRecord : samRecords) {
- Assert.assertTrue(cramFileReaderIterator.hasNext());
- SAMRecord restored = cramFileReaderIterator.next();
- Assert.assertNotNull(restored);
- assertSameRecords(CramVersions.CRAM_v2_1.major, samRecord, restored);
- }
- Assert.assertFalse(cramFileReaderIterator.hasNext());
-
- //v3.0 test
- cramFileReader = new CRAMFileReader(new FileInputStream(t.cramFile_30), (SeekableStream)null, source, ValidationStringency.SILENT);
- cramFileReaderIterator = cramFileReader.getIterator();
- for (SAMRecord samRecord : samRecords) {
- Assert.assertTrue(cramFileReaderIterator.hasNext());
- SAMRecord restored = cramFileReaderIterator.next();
- Assert.assertNotNull(restored);
- assertSameRecords(CramVersions.CRAM_v3.major, samRecord, restored);
- }
- Assert.assertFalse(cramFileReaderIterator.hasNext());
- }
-
- private void assertSameRecords(int majorVersion, SAMRecord record1, SAMRecord record2) {
- Assert.assertEquals(record2.getFlags(), record1.getFlags());
- Assert.assertEquals(record2.getReadName(), record1.getReadName());
- Assert.assertEquals(record2.getReferenceName(), record1.getReferenceName());
- Assert.assertEquals(record2.getAlignmentStart(), record1.getAlignmentStart());
-
- /**
- * Known issue: CRAM v2.1 doesn't handle reads with missing bases correctly. This
- * causes '*' bases to arise when reading CRAM. Skipping the base comparison asserts.
- */
- if (record1.getReadBases() != SAMRecord.NULL_SEQUENCE || majorVersion >= CramVersions.CRAM_v3.major) {
- Assert.assertEquals(record2.getReadBases(), record1.getReadBases());
- }
-
- Assert.assertEquals(record2.getBaseQualities(), record1.getBaseQualities());
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java b/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java
deleted file mode 100644
index b26f4b0..0000000
--- a/src/test/java/htsjdk/samtools/CRAMContainerStreamWriterTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-import htsjdk.samtools.util.RuntimeIOException;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class CRAMContainerStreamWriterTest {
-
- @BeforeClass
- public void initClass() {
- Log.setGlobalLogLevel(LogLevel.ERROR);
- }
-
- private List<SAMRecord> createRecords(int count) {
- final List<SAMRecord> list = new ArrayList<SAMRecord>(count);
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- if (builder.getHeader().getReadGroups().isEmpty()) {
- throw new IllegalStateException("Read group expected in the header");
- }
-
- int posInRef = 1;
- for (int i = 0; i < count / 2; i++) {
- builder.addPair(Integer.toString(i), i % 2, posInRef += 1, posInRef += 3);
- }
- list.addAll(builder.getRecords());
-
- Collections.sort(list, new SAMRecordCoordinateComparator());
-
- return list;
- }
-
- private SAMFileHeader createSAMHeader(SAMFileHeader.SortOrder sortOrder) {
- final SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(sortOrder);
- header.addSequence(new SAMSequenceRecord("chr1", 123));
- header.addSequence(new SAMSequenceRecord("chr2", 123));
- SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
- header.addReadGroup(readGroupRecord);
- return header;
- }
-
- private ReferenceSource createReferenceSource() {
- final byte[] refBases = new byte[1024 * 1024];
- Arrays.fill(refBases, (byte) 'A');
- InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
- rsf.add("chr1", refBases);
- rsf.add("chr2", refBases);
- return new ReferenceSource(rsf);
- }
-
- private void doTest(final List<SAMRecord> samRecords, final ByteArrayOutputStream outStream, final OutputStream indexStream) {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ReferenceSource refSource = createReferenceSource();
-
- final CRAMContainerStreamWriter containerStream = new CRAMContainerStreamWriter(outStream, indexStream, refSource, header, "test");
- containerStream.writeHeader(header);
-
- for (SAMRecord record : samRecords) {
- containerStream.writeAlignment(record);
- }
- containerStream.finish(true); // finish and issue EOF
-
- // read all the records back in
- final CRAMFileReader cReader = new CRAMFileReader(null, new ByteArrayInputStream(outStream.toByteArray()), refSource);
- final SAMRecordIterator iterator = cReader.getIterator();
- int count = 0;
- while (iterator.hasNext()) {
- SAMRecord actualRecord = iterator.next();
- count++;
- }
- Assert.assertEquals(count, samRecords.size());
- }
-
- @Test(description = "Test CRAMContainerStream no index")
- public void testCRAMContainerStreamNoIndex() {
- final List<SAMRecord> samRecords = createRecords(100);
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- doTest(samRecords, outStream, null);
- }
-
- @Test(description = "Test CRAMContainerStream aggregating multiple partitions")
- public void testCRAMContainerAggregatePartitions() throws IOException {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ReferenceSource refSource = createReferenceSource();
-
- // create a bunch of records and write them out to separate streams in groups
- final int nRecs = 100;
- final int recsPerPartition = 20;
- final int nPartitions = nRecs/recsPerPartition;
-
- final List<SAMRecord> samRecords = createRecords(nRecs);
- final ArrayList<ByteArrayOutputStream> byteStreamArray = new ArrayList<>(nPartitions);
-
- for (int partition = 0, recNum = 0; partition < nPartitions; partition++) {
- byteStreamArray.add(partition, new ByteArrayOutputStream());
- final CRAMContainerStreamWriter containerStream =
- new CRAMContainerStreamWriter(byteStreamArray.get(partition), null, refSource, header, "test");
-
- // don't write a header for the intermediate streams
- for (int i = 0; i < recsPerPartition; i++) {
- containerStream.writeAlignment(samRecords.get(recNum++));
- }
- containerStream.finish(false); // finish but don't issue EOF container
- }
-
- // now create the final aggregate file by concatenating the individual streams, but this
- // time with a CRAM and SAM header at the front and an EOF container at the end
- final ByteArrayOutputStream aggregateStream = new ByteArrayOutputStream();
- final CRAMContainerStreamWriter aggregateContainerStreamWriter = new CRAMContainerStreamWriter(aggregateStream, null, refSource, header, "test");
- aggregateContainerStreamWriter .writeHeader(header); // write out one CRAM and SAM header
- for (int j = 0; j < nPartitions; j++) {
- byteStreamArray.get(j).writeTo(aggregateStream);
- }
- aggregateContainerStreamWriter.finish(true);// write out the EOF container
-
- // now iterate through all the records in the aggregate file
- final CRAMFileReader cReader = new CRAMFileReader(null, new ByteArrayInputStream(aggregateStream.toByteArray()), refSource);
- final SAMRecordIterator iterator = cReader.getIterator();
- int count = 0;
- while (iterator.hasNext()) {
- Assert.assertEquals(iterator.next().toString(), samRecords.get(count).toString());
- count++;
- }
- Assert.assertEquals(count, nRecs);
- }
-
- @Test(description = "Test CRAMContainerStream with index")
- public void testCRAMContainerStreamWithIndex() throws IOException {
- final List<SAMRecord> samRecords = createRecords(100);
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
- doTest(samRecords, outStream, indexStream);
- outStream.close();
- indexStream.close();
-
- // write the file out
- final File cramTempFile = File.createTempFile("cramContainerStreamTest", ".cram");
- cramTempFile.deleteOnExit();
- final OutputStream cramFileStream = new FileOutputStream(cramTempFile);
- cramFileStream.write(outStream.toByteArray());
- cramFileStream.close();
-
- // write the index out
- final File indexTempFile = File.createTempFile("cramContainerStreamTest", ".bai");
- indexTempFile.deleteOnExit();
- OutputStream indexFileStream = new FileOutputStream(indexTempFile);
- indexFileStream.write(indexStream.toByteArray());
- indexFileStream.close();
-
- final ReferenceSource refSource = createReferenceSource();
- final CRAMFileReader reader = new CRAMFileReader(
- cramTempFile,
- indexTempFile,
- refSource,
- ValidationStringency.SILENT);
- final CloseableIterator<SAMRecord> iterator = reader.query(new QueryInterval[]{new QueryInterval(1, 10, 10)}, false);
- int count = 0;
- while (iterator.hasNext()) {
- SAMRecord actualRecord = iterator.next();
- count++;
- }
- Assert.assertEquals(count, 2);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java b/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java
deleted file mode 100644
index e77e0e8..0000000
--- a/src/test/java/htsjdk/samtools/CRAMEdgeCasesTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * A collection of CRAM test based on round trip comparison of SAMRecord before and after CRAM compression.
- */
-public class CRAMEdgeCasesTest {
-
- @BeforeTest
- public void beforeTest() {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
- }
-
- @Test
- public void testUnsorted() throws IOException {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- builder.addFrag("1", 0, 2, false);
- builder.addFrag("1", 0, 1, false);
- final Collection<SAMRecord> records = builder.getRecords();
-
- testRecords(records, records.iterator().next().getReadBases());
- }
-
- // int test for CRAMException
- // testing for a contig found in the reads but not in the reference
- @Test(expectedExceptions = CRAMException.class)
- public void testContigNotFoundInRef() throws IOException {
- boolean sawException = false;
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa");
- final ReferenceSource refSource = new ReferenceSource(refFile);
- final CRAMIterator iterator = new CRAMIterator(new FileInputStream(CRAMFile), refSource, ValidationStringency.STRICT);
- while (iterator.hasNext()) {
- iterator.next();
- }
- }
-
- @Test
- public void testBizilionTags() throws IOException {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- builder.addFrag("1", 0, 1, false);
- SAMRecord record = builder.getRecords().iterator().next();
- for (int i = 0; i < 1000; i++) {
- char b1 = (char) ('A' + i / 26);
- char b2 = (char) ('A' + i % 26);
- String tag = new String(new char[]{b1, b2});
- if ("RG".equals(tag)) {
- continue;
- }
- record.setAttribute(tag, i);
- }
-
- record.setAlignmentStart(1);
- testSingleRecord(record, record.getReadBases());
- }
-
- @Test
- public void testNullsAndBeyondRef() throws IOException {
- testSingleRecord("A".getBytes(), "!".getBytes(), "A".getBytes());
- testSingleRecord("A".getBytes(), SAMRecord.NULL_QUALS, "A".getBytes());
- testSingleRecord(SAMRecord.NULL_SEQUENCE, SAMRecord.NULL_QUALS, "A".getBytes());
- testSingleRecord("AAA".getBytes(), "!!!".getBytes(), "A".getBytes());
- }
-
- private void testRecords(Collection<SAMRecord> records, byte[] ref) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
- refFile.add("chr1", ref);
- ReferenceSource source = new ReferenceSource(refFile);
- final SAMFileHeader header = records.iterator().next().getHeader();
- CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, header, "whatever");
-
- Iterator<SAMRecord> it = records.iterator();
- while (it.hasNext()) {
- SAMRecord record = it.next();
- cramFileWriter.addAlignment(record);
- }
- cramFileWriter.close();
-
- CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream) null, source, ValidationStringency.SILENT);
- final SAMRecordIterator iterator = cramFileReader.getIterator();
- Assert.assertTrue(iterator.hasNext());
-
- it = records.iterator();
- while (it.hasNext()) {
- SAMRecord record = it.next();
- SAMRecord s2 = iterator.next();
- Assert.assertNotNull(s2);
- Assert.assertEquals(record.getFlags(), s2.getFlags());
- Assert.assertEquals(record.getReadName(), s2.getReadName());
- Assert.assertEquals(record.getReferenceName(), s2.getReferenceName());
- Assert.assertEquals(record.getAlignmentStart(), s2.getAlignmentStart());
- Assert.assertEquals(record.getReadBases(), s2.getReadBases());
- Assert.assertEquals(record.getBaseQualities(), s2.getBaseQualities());
- }
- Assert.assertFalse(iterator.hasNext());
- }
-
- private void testSingleRecord(SAMRecord record, byte[] ref) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
- refFile.add("chr1", ref);
- ReferenceSource source = new ReferenceSource(refFile);
- CRAMFileWriter cramFileWriter = new CRAMFileWriter(baos, source, record.getHeader(), "whatever");
- cramFileWriter.addAlignment(record);
- cramFileWriter.close();
-
- CRAMFileReader cramFileReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (SeekableStream) null, source, ValidationStringency.SILENT);
- final SAMRecordIterator iterator = cramFileReader.getIterator();
- Assert.assertTrue(iterator.hasNext());
- SAMRecord s2 = iterator.next();
- Assert.assertNotNull(s2);
- Assert.assertFalse(iterator.hasNext());
-
- Assert.assertEquals(record.getFlags(), s2.getFlags());
- Assert.assertEquals(record.getReadName(), s2.getReadName());
- Assert.assertEquals(record.getReferenceName(), s2.getReferenceName());
- Assert.assertEquals(record.getAlignmentStart(), s2.getAlignmentStart());
- Assert.assertEquals(record.getReadBases(), s2.getReadBases());
- Assert.assertEquals(record.getBaseQualities(), s2.getBaseQualities());
- }
-
- private void testSingleRecord(byte[] bases, byte[] scores, byte[] ref) throws IOException {
- SAMFileHeader header = new SAMFileHeader();
- header.addReadGroup(new SAMReadGroupRecord("1"));
- header.addSequence(new SAMSequenceRecord("chr1", ref.length));
- SAMRecord s = new SAMRecord(header);
- s.setReadBases(bases);
- s.setBaseQualities(scores);
- s.setFlags(0);
- s.setAlignmentStart(1);
- s.setReferenceName("chr1");
- s.setReadName("1");
- if (bases == SAMRecord.NULL_SEQUENCE) {
- s.setCigarString("10M");
- } else {
- s.setCigarString(s.getReadLength() + "M");
- }
-
- testSingleRecord(s, ref);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java
deleted file mode 100644
index eba2b4c..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileBAIIndexTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * A collection of tests for CRAM BAI index write/read that use BAMFileIndexTest/index_test.bam file as the source of the test data.
- * The test will create a BAI index of the cram file before hand.
- * The scan* tests check that for every records in the BAM file the query returns the same records from the CRAM file.
- * Created by Vadim on 14/03/2015.
- */
-public class CRAMFileBAIIndexTest {
- private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
- private File cramFile;
- private File indexFile;
- private byte[] cramBytes;
- private byte[] baiBytes;
- private ReferenceSource source;
- private int nofUnmappedReads = 279 ;
- private int nofMappedReads = 9721;
- private int nofReads = 10000 ;
- private int nofReadsPerContainer = 1000 ;
-
-
- // Mixes testing queryAlignmentStart with each CRAMFileReaderConstructor
- // Separate into individual tests
- @Test
- public void testConstructors () throws IOException {
- CRAMFileReader reader = new CRAMFileReader(cramFile, indexFile, source, ValidationStringency.SILENT);
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
-
- reader = new CRAMFileReader(new SeekableFileStream(cramFile), indexFile, source, ValidationStringency.SILENT);
- iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
-
- reader = new CRAMFileReader(new SeekableFileStream(cramFile), new SeekableFileStream(indexFile), source, ValidationStringency.SILENT);
- iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
-
- reader = new CRAMFileReader(new SeekableFileStream(cramFile), (File)null, source, ValidationStringency.SILENT);
- try {
- reader.queryAlignmentStart("chrM", 1500);
- Assert.fail("Expecting query to fail when there is no index");
- } catch (SAMException e) {
- }
- reader.close();
-
- reader = new CRAMFileReader(new SeekableFileStream(cramFile), (SeekableFileStream)null, source, ValidationStringency.SILENT);
- try {
- reader.queryAlignmentStart("chrM", 1500);
- Assert.fail("Expecting query to fail when there is no index");
- } catch (SAMException e) {
- }
- reader.close();
- }
-
- // this test is the same as the ones above in testConstructors
- @Test
- public void test_chrM_1500_location() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(cramFile, indexFile, source);
- reader.setValidationStringency(ValidationStringency.SILENT);
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- }
-
- @Test
- public void scanMappedReads() throws IOException {
- SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
- SAMRecordIterator samRecordIterator = samReader.iterator();
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
- reader.setValidationStringency(ValidationStringency.SILENT);
-
- int counter = 0;
- while (samRecordIterator.hasNext()) {
- SAMRecord samRecord = samRecordIterator.next();
- if (samRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) break;
- // test only 1st and 2nd in every 100 to speed the test up:
- if (counter++ %100 > 1) continue;
- String s1 = samRecord.getSAMString();
-
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(samRecord.getReferenceName(), samRecord.getAlignmentStart());
- Assert.assertTrue(iterator.hasNext(), counter + ": " + s1);
- SAMRecord cramRecord = iterator.next();
-
- String s2 = cramRecord.getSAMString();
-
- Assert.assertEquals(samRecord.getReferenceName(), cramRecord.getReferenceName(), s1 + s2);
- // default 'overlap' is true, so test records intersect the query:
- Assert.assertTrue(CoordMath.overlaps(cramRecord.getAlignmentStart(), cramRecord.getAlignmentEnd(), samRecord.getAlignmentStart(), samRecord.getAlignmentEnd()), s1 + s2);
- }
- samRecordIterator.close();
- reader.close();
-
- Assert.assertEquals(counter, nofMappedReads);
- }
-
- @Test
- public void testNoStringencyConstructor() throws IOException {
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
-
- long start = 0;
- long end = CRAMFile.length();
- long[] boundaries = new long[] {start << 16, (end - 1) << 16};
- final CRAMIterator iterator = new CRAMIterator(new SeekableFileStream(CRAMFile), refSource, boundaries);
- long count = 0;
- while (iterator.hasNext()) {
- count++;
- iterator.next();
- }
- Assert.assertEquals(count, 2);
- }
-
- @Test
- public void testIteratorFromFileSpan_WholeFile() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
- reader.setValidationStringency(ValidationStringency.SILENT);
-
- final SAMFileSpan allContainers = reader.getFilePointerSpanningReads();
- final CloseableIterator<SAMRecord> iterator = reader.getIterator(allContainers);
- Assert.assertTrue(iterator.hasNext());
- int counter = 0;
- while (iterator.hasNext()) {
- iterator.next();
- counter++;
- }
- Assert.assertEquals(counter, nofReads);
- }
-
- @Test
- public void testIteratorFromFileSpan_SecondContainer() throws IOException, IllegalAccessException {
- CramContainerIterator it = new CramContainerIterator(new ByteArrayInputStream(cramBytes));
- it.hasNext();
- it.next();
- it.hasNext();
- Container secondContainer = it.next();
- Assert.assertNotNull(secondContainer);
- final Map<Integer, AlignmentSpan> references = new ContainerParser(it.getCramHeader().getSamFileHeader()).getReferences(secondContainer, ValidationStringency.STRICT);
- it.close();
- int refId = new TreeSet<Integer>(references.keySet()).iterator().next();
- final AlignmentSpan alignmentSpan = references.get(refId);
-
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
- reader.setValidationStringency(ValidationStringency.SILENT);
-
- final BAMIndex index = reader.getIndex();
- final SAMFileSpan spanOfSecondContainer = index.getSpanOverlapping(refId, alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
- Assert.assertNotNull(spanOfSecondContainer);
- Assert.assertFalse(spanOfSecondContainer.isEmpty());
- Assert.assertTrue(spanOfSecondContainer instanceof BAMFileSpan);
-
- final CloseableIterator<SAMRecord> iterator = reader.getIterator(spanOfSecondContainer);
- Assert.assertTrue(iterator.hasNext());
- int counter = 0;
- boolean matchFound = false;
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- if (record.getReferenceIndex().intValue() == refId) {
- boolean overlaps = CoordMath.overlaps(record.getAlignmentStart(), record.getAlignmentEnd(), alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
- if (overlaps) matchFound = true;
- }
- counter++;
- }
- Assert.assertTrue(matchFound);
- Assert.assertTrue(counter <= CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE);
- }
-
- @Test
- public void testQueryInterval() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
- QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)};
- final CloseableIterator<SAMRecord> iterator = reader.query(query, false);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord r1 = iterator.next();
- Assert.assertEquals(r1.getReadName(), "3968040");
-
- Assert.assertTrue(iterator.hasNext());
- SAMRecord r2 = iterator.next();
- Assert.assertEquals(r2.getReadName(), "140419");
-
- Assert.assertFalse(iterator.hasNext());
- iterator.close();
- reader.close();
- }
-
- @Test
- public void scanAllUnmappedReads() throws IOException {
- SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(baiBytes), source, ValidationStringency.SILENT);
- reader.setValidationStringency(ValidationStringency.SILENT);
- int counter = 0;
-
- SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped();
- CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped();
- while (unmappedSamIterator.hasNext()) {
- Assert.assertTrue(unmappedCramIterator.hasNext());
- SAMRecord r1 = unmappedSamIterator.next();
- SAMRecord r2 = unmappedCramIterator.next();
- Assert.assertEquals(r1.getReadName(), r2.getReadName());
- Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString());
-
- counter++;
- }
- Assert.assertFalse(unmappedCramIterator.hasNext());
- Assert.assertEquals(counter, nofUnmappedReads);
-
- reader.close();
- }
-
- @BeforeTest
- public void prepare() throws IOException {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
- source = new ReferenceSource(new FakeReferenceSequenceFile(SamReaderFactory.makeDefault().getFileHeader(BAM_FILE).getSequenceDictionary().getSequences()));
- cramBytes = cramFromBAM(BAM_FILE, source);
- cramFile = File.createTempFile(BAM_FILE.getName(), ".cram") ;
- cramFile.deleteOnExit();
- indexFile = new File (cramFile.getAbsolutePath() + ".bai");
- indexFile.deleteOnExit();
- FileOutputStream fos = new FileOutputStream(cramFile);
- fos.write(cramBytes);
- fos.close();
-
- CRAMBAIIndexer.createIndex(new SeekableFileStream(cramFile), indexFile, null, ValidationStringency.STRICT);
- baiBytes = readFile(indexFile);
- }
-
- private static byte[] readFile(File file) throws FileNotFoundException {
- FileInputStream fis = new FileInputStream(file);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- IOUtil.copyStream(fis, baos);
- return baos.toByteArray();
- }
-
- private byte[] cramFromBAM(File bamFile, ReferenceSource source) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
- final SAMRecordIterator iterator = reader.iterator();
- // to reduce granularity let's use this hacky approach:
- int previousValue = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE ;
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = nofReadsPerContainer;
- try {
- CRAMFileWriter writer = new CRAMFileWriter(baos, source, reader.getFileHeader(), bamFile.getName());
- while (iterator.hasNext()) {
- SAMRecord record = iterator.next();
- writer.addAlignment(record);
- }
- writer.close();
- }
- finally {
- // failing to reset this can cause unrelated tests to fail if this test fails
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = previousValue;
- }
- return baos.toByteArray();
- }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java
deleted file mode 100644
index 9084a0f..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileCRAIIndexTest.java
+++ /dev/null
@@ -1,368 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.ContainerParser;
-import htsjdk.samtools.cram.build.CramContainerIterator;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.reference.FakeReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CoordMath;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * Companion tests for the ones in CRAMFileBAIIndexTest, but run against a .bai
- * that has been converted from a .crai.
- *
- * A collection of tests for CRAM CRAI index write/read that use BAMFileIndexTest/index_test.bam
- * file as the source of the test data. The scan* tests check that for every records in the
- * CRAM file the query returns the same records from the CRAM file.
- */
-public class CRAMFileCRAIIndexTest {
- private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
-
- private final int nofReads = 10000 ;
- private final int nofReadsPerContainer = 1000 ;
- private final int nofUnmappedReads = 279 ;
- private final int nofMappedReads = 9721;
-
- private File tmpCramFile;
- private File tmpCraiFile;
- private byte[] cramBytes;
- private byte[] craiBytes;
- private ReferenceSource source;
-
- @Test
- public void testFileFileConstructor () throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- tmpCramFile,
- tmpCraiFile,
- source,
- ValidationStringency.STRICT);
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
-
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
- }
-
- @Test
- public void testStreamFileConstructor () throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new SeekableFileStream(tmpCramFile),
- tmpCraiFile,
- source,
- ValidationStringency.STRICT);
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
- }
-
- @Test
- public void testStreamStreamConstructor() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new SeekableFileStream(tmpCramFile),
- new SeekableFileStream(tmpCraiFile),
- source,
- ValidationStringency.STRICT);
- CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart("chrM", 1500);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
-
- Assert.assertEquals(record.getReferenceName(), "chrM");
- Assert.assertTrue(record.getAlignmentStart() >= 1500);
- reader.close();
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testFileFileConstructorNoIndex () throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new SeekableFileStream(tmpCramFile),
- (File) null,
- source,
- ValidationStringency.STRICT);
- try {
- reader.queryAlignmentStart("chrM", 1500);
- }
- finally {
- reader.close();
- }
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testStreamStreamConstructorNoIndex () throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new SeekableFileStream(tmpCramFile),
- (SeekableFileStream) null,
- source,
- ValidationStringency.STRICT);
- try {
- reader.queryAlignmentStart("chrM", 1500);
- }
- finally {
- reader.close();
- }
- }
-
- @Test
- public void testMappedReads() throws IOException {
-
- try (SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
- SAMRecordIterator samRecordIterator = samReader.iterator())
- {
- Assert.assertEquals(samReader.getFileHeader().getSortOrder(), SAMFileHeader.SortOrder.coordinate);
- CRAMFileReader cramReader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBytes),
- new ByteArraySeekableStream(craiBytes),
- source,
- ValidationStringency.STRICT);
-
- int counter = 0;
- while (samRecordIterator.hasNext()) {
- SAMRecord samRecord = samRecordIterator.next();
- if (samRecord.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX) {
- break;
- }
- if (counter++ % 100 > 1) { // test only 1st and 2nd in every 100 to speed the test up:
- continue;
- }
- String sam1 = samRecord.getSAMString();
-
- CloseableIterator<SAMRecord> iterator = cramReader.queryAlignmentStart(
- samRecord.getReferenceName(),
- samRecord.getAlignmentStart());
-
- Assert.assertTrue(iterator.hasNext(), counter + ": " + sam1);
- SAMRecord cramRecord = iterator.next();
- String sam2 = cramRecord.getSAMString();
- Assert.assertEquals(samRecord.getReferenceName(), cramRecord.getReferenceName(), sam1 + sam2);
-
- // default 'overlap' is true, so test records intersect the query:
- Assert.assertTrue(CoordMath.overlaps(
- cramRecord.getAlignmentStart(),
- cramRecord.getAlignmentEnd(),
- samRecord.getAlignmentStart(),
- samRecord.getAlignmentEnd()),
- sam1 + sam2);
- }
- Assert.assertEquals(counter, nofMappedReads);
- cramReader.close();
- }
- }
-
- @Test
- public void testQueryUnmapped() throws IOException {
- try (final SamReader samReader = SamReaderFactory.makeDefault().open(BAM_FILE);
- final SAMRecordIterator unmappedSamIterator = samReader.queryUnmapped())
- {
- CRAMFileReader reader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBytes),
- new ByteArraySeekableStream(craiBytes),
- source,
- ValidationStringency.STRICT);
- int counter = 0;
- CloseableIterator<SAMRecord> unmappedCramIterator = reader.queryUnmapped();
-
- while (unmappedSamIterator.hasNext()) {
- Assert.assertTrue(unmappedCramIterator.hasNext());
- SAMRecord r1 = unmappedSamIterator.next();
- SAMRecord r2 = unmappedCramIterator.next();
- Assert.assertEquals(r1.getReadName(), r2.getReadName());
- Assert.assertEquals(r1.getBaseQualityString(), r2.getBaseQualityString());
- counter++;
- }
-
- Assert.assertFalse(unmappedCramIterator.hasNext());
- Assert.assertEquals(counter, nofUnmappedReads);
- }
- }
-
- @Test
- public void testIteratorConstructor() throws IOException {
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
-
- long[] boundaries = new long[] {0, (CRAMFile.length() - 1) << 16};
- final CRAMIterator iterator = new CRAMIterator(
- new SeekableFileStream(CRAMFile),
- refSource, boundaries,
- ValidationStringency.STRICT);
- long count = getIteratorCount(iterator);
- Assert.assertEquals(count, 2);
- }
-
- @Test
- public void testNoStringencyIteratorConstructor() throws IOException {
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
-
- long[] boundaries = new long[] {0, (CRAMFile.length() - 1) << 16};
- final CRAMIterator iterator = new CRAMIterator(new SeekableFileStream(CRAMFile), refSource, boundaries);
-
- long count = getIteratorCount(iterator);
- Assert.assertEquals(count, 2);
- }
-
- @Test
- public void testIteratorWholeFileSpan() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBytes),
- new ByteArraySeekableStream(craiBytes),
- source,
- ValidationStringency.STRICT);
-
- final SAMFileSpan allContainers = reader.getFilePointerSpanningReads();
- final CloseableIterator<SAMRecord> iterator = reader.getIterator(allContainers);
- Assert.assertTrue(iterator.hasNext());
- long count = getIteratorCount(iterator);
- Assert.assertEquals(count, nofReads);
- }
-
- @Test
- public void testIteratorSecondContainerSpan() throws IOException, IllegalAccessException {
- CramContainerIterator it = new CramContainerIterator(new ByteArrayInputStream(cramBytes));
- it.hasNext();
- it.next();
- it.hasNext();
- Container secondContainer = it.next();
- Assert.assertNotNull(secondContainer);
- final Map<Integer, AlignmentSpan> references =
- new ContainerParser(it.getCramHeader().getSamFileHeader()).getReferences(secondContainer, ValidationStringency.STRICT);
- it.close();
-
- int refId = new TreeSet<>(references.keySet()).iterator().next();
- final AlignmentSpan alignmentSpan = references.get(refId);
-
- CRAMFileReader reader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBytes),
- new ByteArraySeekableStream(craiBytes),
- source,
- ValidationStringency.STRICT);
-
- final BAMIndex index = reader.getIndex();
- final SAMFileSpan spanOfSecondContainer = index.getSpanOverlapping(refId, alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
- Assert.assertNotNull(spanOfSecondContainer);
- Assert.assertFalse(spanOfSecondContainer.isEmpty());
- Assert.assertTrue(spanOfSecondContainer instanceof BAMFileSpan);
-
- final CloseableIterator<SAMRecord> iterator = reader.getIterator(spanOfSecondContainer);
- Assert.assertTrue(iterator.hasNext());
- int counter = 0;
- boolean matchFound = false;
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- if (record.getReferenceIndex().intValue() == refId) {
- boolean overlaps = CoordMath.overlaps(record.getAlignmentStart(), record.getAlignmentEnd(), alignmentSpan.getStart(), alignmentSpan.getStart()+ alignmentSpan.getSpan());
- if (overlaps) matchFound = true;
- }
- counter++;
- }
- Assert.assertTrue(matchFound);
- Assert.assertTrue(counter <= CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE);
- }
-
- @Test
- public void testQueryInterval() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(
- new ByteArraySeekableStream(cramBytes),
- new ByteArraySeekableStream(craiBytes),
- source,
- ValidationStringency.STRICT);
- QueryInterval[] query = new QueryInterval[]{new QueryInterval(0, 1519, 1520), new QueryInterval(1, 470535, 470536)};
- final CloseableIterator<SAMRecord> iterator = reader.query(query, false);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord r1 = iterator.next();
- Assert.assertEquals(r1.getReadName(), "3968040");
-
- Assert.assertTrue(iterator.hasNext());
- SAMRecord r2 = iterator.next();
- Assert.assertEquals(r2.getReadName(), "140419");
-
- Assert.assertFalse(iterator.hasNext());
- iterator.close();
- reader.close();
- }
-
- @BeforeTest
- public void prepare() throws IOException {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
- source = new ReferenceSource(new FakeReferenceSequenceFile(
- SamReaderFactory.makeDefault().getFileHeader(BAM_FILE).getSequenceDictionary().getSequences()));
-
- tmpCramFile = File.createTempFile(BAM_FILE.getName(), ".cram") ;
- tmpCramFile.deleteOnExit();
- tmpCraiFile = new File (tmpCramFile.getAbsolutePath() + ".crai");
- tmpCraiFile.deleteOnExit();
- cramBytes = cramFromBAM(BAM_FILE, source);
-
- FileOutputStream fos = new FileOutputStream(tmpCramFile);
- fos.write(cramBytes);
- fos.close();
-
- FileOutputStream fios = new FileOutputStream(tmpCraiFile);
- CRAMCRAIIndexer.writeIndex(new SeekableFileStream(tmpCramFile), fios);
- craiBytes = readFile(tmpCraiFile);
- }
-
- private static byte[] readFile(File file) throws FileNotFoundException {
- FileInputStream fis = new FileInputStream(file);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- IOUtil.copyStream(fis, baos);
- return baos.toByteArray();
- }
-
- private byte[] cramFromBAM(File bamFile, ReferenceSource source) throws IOException {
-
- int previousValue = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = nofReadsPerContainer;
-
- try (final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
- final SAMRecordIterator iterator = reader.iterator();
- final ByteArrayOutputStream baos = new ByteArrayOutputStream())
- {
- CRAMFileWriter writer = new CRAMFileWriter(
- baos,
- source,
- reader.getFileHeader(),
- bamFile.getName());
- while (iterator.hasNext()) {
- SAMRecord record = iterator.next();
- writer.addAlignment(record);
- }
- writer.close();
- return baos.toByteArray();
- }
- finally {
- // failing to reset this can cause unrelated tests to fail if this test fails
- CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE = previousValue;
- }
- }
-
- private long getIteratorCount(Iterator<SAMRecord> it) {
- long count = 0;
- while (it.hasNext()) {
- count++;
- it.next();
- }
- return count;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java b/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java
deleted file mode 100644
index 3fcb3bd..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileReaderTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-/**
- * Additional tests for CRAMFileReader are in CRAMFileIndexTest
- */
-public class CRAMFileReaderTest {
-
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
- private static final File CRAM_WITH_CRAI = new File(TEST_DATA_DIR, "cram_with_crai_index.cram");
- private static final File CRAM_WITHOUT_CRAI = new File(TEST_DATA_DIR, "cram_query_sorted.cram");
- private static final ReferenceSource REFERENCE = createReferenceSource();
- private static final File INDEX_FILE = new File(TEST_DATA_DIR, "cram_with_crai_index.cram.crai");
-
-
- @BeforeClass
- public void initClass() {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
- }
-
- private static ReferenceSource createReferenceSource() {
- byte[] refBases = new byte[10 * 10];
- Arrays.fill(refBases, (byte) 'A');
- InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
- rsf.add("chr1", refBases);
- return new ReferenceSource(rsf);
- }
-
- // constructor 1: CRAMFileReader(final File cramFile, final InputStream inputStream)
-
- @Test(description = "Test CRAMReader 1 reference required", expectedExceptions = IllegalStateException.class)
- public void testCRAMReader1_ReferenceRequired() {
- InputStream bis = null;
- // assumes that reference_fasta property is not set and the download service is not enabled
- new CRAMFileReader(CRAM_WITH_CRAI, bis);
- }
-
- // constructor 2: CRAMFileReader(final File cramFile, final InputStream inputStream, final ReferenceSource referenceSource)
-
- @Test(description = "Test CRAMReader 2 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader2ReferenceRequired() {
- InputStream bis = null;
- new CRAMFileReader(CRAM_WITH_CRAI, bis, null);
- }
-
- @Test(description = "Test CRAMReader 2 input required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader2_InputRequired() {
- File file = null;
- InputStream bis = null;
- new CRAMFileReader(file, bis, createReferenceSource());
- }
-
- @Test
- public void testCRAMReader2_ShouldAutomaticallyFindCRAMIndex() {
- InputStream inputStream = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, inputStream, REFERENCE);
- reader.getIndex();
- Assert.assertTrue(reader.hasIndex(), "Can't find CRAM existing index.");
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testCRAMReader2_WithoutCRAMIndex() {
- InputStream inputStream = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, inputStream, REFERENCE);
- reader.getIndex();
- }
-
- // constructor 3: CRAMFileReader(final File cramFile, final File indexFile, final ReferenceSource referenceSource)
-
- @Test(description = "Test CRAMReader 3 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader3_RequiredReference() {
- File indexFile = null;
- ReferenceSource refSource = null;
- new CRAMFileReader(CRAM_WITH_CRAI, indexFile, refSource);
- }
-
- @Test(description = "Test CRAMReader 3 input required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader3_InputRequired() {
- File inputFile = null;
- File indexFile = null;
- ReferenceSource refSource = null;
- new CRAMFileReader(inputFile, indexFile, refSource);
- }
-
- @Test
- public void testCRAMReader3_ShouldAutomaticallyFindCRAMIndex() {
- File indexFile = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, indexFile, REFERENCE);
- reader.getIndex();
- Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
- }
-
- @Test
- public void testCRAMReader3_ShouldUseCRAMIndex() {
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, INDEX_FILE, REFERENCE);
- reader.getIndex();
- Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testCRAMReader3_WithoutCRAMIndex() {
- File indexFile = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, indexFile, REFERENCE);
- reader.getIndex();
- }
-
- // constructor 4: CRAMFileReader(final File cramFile, final ReferenceSource referenceSource)
-
- @Test(description = "Test CRAMReader 4 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader4_ReferenceRequired() {
- ReferenceSource refSource = null;
- new CRAMFileReader(CRAM_WITH_CRAI, refSource);
- }
-
- @Test(description = "Test CRAMReader 4 input required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader4_InputRequired() {
- File inputFile = null;
- new CRAMFileReader(inputFile, createReferenceSource());
- }
-
- @Test
- public void testCRAMReader4_ShouldAutomaticallyFindCRAMIndex() {
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, REFERENCE);
- reader.getIndex();
- Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testCRAMReader4_WithoutCRAMIndex() {
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, REFERENCE);
- reader.getIndex();
- }
-
- // constructor 5: CRAMFileReader(final InputStream inputStream, final SeekableStream indexInputStream,
- // final ReferenceSource referenceSource, final ValidationStringency validationStringency)
- @Test(description = "Test CRAMReader 5 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader5_ReferenceRequired() throws IOException {
- InputStream bis = new ByteArrayInputStream(new byte[0]);
- SeekableFileStream sfs = null;
- ReferenceSource refSource = null;
- new CRAMFileReader(bis, sfs, refSource, ValidationStringency.STRICT);
- }
-
- @Test(description = "Test CRAMReader 5 input required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader5_InputRequired() throws IOException {
- InputStream bis = null;
- SeekableFileStream sfs = null;
- new CRAMFileReader(bis, sfs, createReferenceSource(), ValidationStringency.STRICT);
- }
-
- // constructor 6: CRAMFileReader(final InputStream stream, final File indexFile, final ReferenceSource referenceSource,
- // final ValidationStringency validationStringency)
- @Test(description = "Test CRAMReader 6 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader6_ReferenceRequired() throws IOException {
- InputStream bis = new ByteArrayInputStream(new byte[0]);
- File file = null;
- ReferenceSource refSource = null;
- new CRAMFileReader(bis, file, refSource, ValidationStringency.STRICT);
- }
-
- @Test(description = "Test CRAMReader 6 input required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader6_InputRequired() throws IOException {
- InputStream bis = null;
- File file = null;
- new CRAMFileReader(bis, file, createReferenceSource(), ValidationStringency.STRICT);
- }
-
- // constructor 7: CRAMFileReader(final File cramFile, final File indexFile, final ReferenceSource referenceSource,
- // final ValidationStringency validationStringency)
- @Test(description = "Test CRAMReader 7 reference required", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMReader7_ReferenceRequired() throws IOException {
- ReferenceSource refSource = null;
- new CRAMFileReader(CRAM_WITH_CRAI, CRAM_WITH_CRAI, refSource, ValidationStringency.STRICT);
- }
-
- @Test
- public void testCRAMReader7_ShouldAutomaticallyFindCRAMIndex()throws IOException {
- File indexFile = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, indexFile, REFERENCE, ValidationStringency.STRICT);
- Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
- }
-
- @Test
- public void testCRAMReader7_ShouldUseCRAMIndex() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITH_CRAI, INDEX_FILE, REFERENCE, ValidationStringency.STRICT);
- Assert.assertTrue(reader.hasIndex(), "Can't find existing CRAM index.");
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testCRAMReader7_WithoutCRAMIndex() throws IOException {
- File indexFile = null;
- CRAMFileReader reader = new CRAMFileReader(CRAM_WITHOUT_CRAI, indexFile, REFERENCE, ValidationStringency.STRICT);
- reader.getIndex();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java b/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java
deleted file mode 100644
index c495528..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileWriterTest.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.util.Log;
-import htsjdk.samtools.util.Log.LogLevel;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class CRAMFileWriterTest {
-
- @BeforeClass
- public void initClass() {
- Log.setGlobalLogLevel(LogLevel.ERROR);
- }
-
- @Test(description = "Test for lossy CRAM compression invariants.")
- public void lossyCramInvariantsTest() {
- doTest(createRecords(1000));
- }
-
- @Test(description = "Tests a writing records with null SAMFileHeaders")
- public void writeRecordsWithNullHeader() throws Exception {
-
- final List<SAMRecord> samRecs = createRecords(50);
- for (SAMRecord rec : samRecs) {
- rec.setHeader(null);
- }
- doTest(samRecs);
- }
-
- @Test(description = "Tests a unmapped record with sequence and quality fields")
- public void unmappedWithSequenceAndQualityField() throws Exception {
- unmappedSequenceAndQualityFieldHelper(true);
- }
-
- @Test(description = "Tests a unmapped record with no sequence or quality fields")
- public void unmappedWithNoSequenceAndQualityField() throws Exception {
- unmappedSequenceAndQualityFieldHelper(false);
- }
-
- private void unmappedSequenceAndQualityFieldHelper(boolean unmappedHasBasesAndQualities) throws Exception {
- List<SAMRecord> list = new ArrayList<SAMRecord>(2);
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- if (builder.getHeader().getReadGroups().isEmpty()) {
- throw new Exception("Read group expected in the header");
- }
-
- builder.setUnmappedHasBasesAndQualities(unmappedHasBasesAndQualities);
-
- builder.addUnmappedFragment("test1");
- builder.addUnmappedPair("test2");
-
- list.addAll(builder.getRecords());
-
- Collections.sort(list, new SAMRecordCoordinateComparator());
-
- doTest(list);
- }
-
- private List<SAMRecord> createRecords(int count) {
- List<SAMRecord> list = new ArrayList<SAMRecord>(count);
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- if (builder.getHeader().getReadGroups().isEmpty()) {
- throw new IllegalStateException("Read group expected in the header");
- }
-
- int posInRef = 1;
- for (int i = 0; i < count / 2; i++) {
- builder.addPair(Integer.toString(i), 0, posInRef += 1,
- posInRef += 3);
- }
- list.addAll(builder.getRecords());
-
- Collections.sort(list, new SAMRecordCoordinateComparator());
-
- return list;
- }
-
- private SAMFileHeader createSAMHeader(SAMFileHeader.SortOrder sortOrder) {
- final SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(sortOrder);
- header.addSequence(new SAMSequenceRecord("chr1", 123));
- SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
- header.addReadGroup(readGroupRecord);
- return header;
- }
-
- private ReferenceSource createReferenceSource() {
- byte[] refBases = new byte[1024 * 1024];
- Arrays.fill(refBases, (byte) 'A');
- InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
- rsf.add("chr1", refBases);
- return new ReferenceSource(rsf);
- }
-
- private void writeRecordsToCRAM(CRAMFileWriter writer, List<SAMRecord> samRecords) {
- for (SAMRecord record : samRecords) {
- writer.addAlignment(record);
- }
- writer.close();
- }
-
- private void validateRecords(final List<SAMRecord> expectedRecords, ByteArrayInputStream is, ReferenceSource referenceSource) {
- CRAMFileReader cReader = new CRAMFileReader(null, is, referenceSource);
-
- SAMRecordIterator iterator2 = cReader.getIterator();
- int index = 0;
- while (iterator2.hasNext()) {
- SAMRecord actualRecord = iterator2.next();
- SAMRecord expectedRecord = expectedRecords.get(index++);
-
- Assert.assertEquals(actualRecord.getReadName(), expectedRecord.getReadName());
- Assert.assertEquals(actualRecord.getFlags(), expectedRecord.getFlags());
- Assert.assertEquals(actualRecord.getAlignmentStart(), expectedRecord.getAlignmentStart());
- Assert.assertEquals(actualRecord.getAlignmentEnd(), expectedRecord.getAlignmentEnd());
- Assert.assertEquals(actualRecord.getReferenceName(), expectedRecord.getReferenceName());
- Assert.assertEquals(actualRecord.getMateAlignmentStart(),
- expectedRecord.getMateAlignmentStart());
- Assert.assertEquals(actualRecord.getMateReferenceName(),
- expectedRecord.getMateReferenceName());
- Assert.assertEquals(actualRecord.getReadBases(), expectedRecord.getReadBases());
- Assert.assertEquals(actualRecord.getBaseQualities(), expectedRecord.getBaseQualities());
- }
- cReader.close();
- }
-
- private void doTest(final List<SAMRecord> samRecords) {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ReferenceSource refSource = createReferenceSource();
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
-
- CRAMFileWriter writer = new CRAMFileWriter(os, refSource, header, null);
- writeRecordsToCRAM(writer, samRecords);
-
- validateRecords(samRecords, new ByteArrayInputStream(os.toByteArray()), refSource);
- }
-
- @Test(description = "Test CRAMWriter constructor with index stream")
- public void testCRAMWriterWithIndex() {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ReferenceSource refSource = createReferenceSource();
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
-
- final List<SAMRecord> samRecords = createRecords(100);
- CRAMFileWriter writer = new CRAMFileWriter(outStream, indexStream, refSource, header, null);
-
- writeRecordsToCRAM(writer, samRecords);
- validateRecords(samRecords, new ByteArrayInputStream(outStream.toByteArray()), refSource);
- Assert.assertTrue(indexStream.size() != 0);
- }
-
- @Test(description = "Test CRAMWriter constructor with presorted==false")
- public void testCRAMWriterNotPresorted() {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ReferenceSource refSource = createReferenceSource();
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- final ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
-
- CRAMFileWriter writer = new CRAMFileWriter(outStream, indexStream, false, refSource, header, null);
-
- // force records to not be coordinate sorted to ensure we're relying on presorted=false
- final List<SAMRecord> samRecords = createRecords(100);
- Collections.sort(samRecords, new SAMRecordCoordinateComparator().reversed());
-
- writeRecordsToCRAM(writer, samRecords);
-
- // for validation, restore the sort order of the expected records so they match the order of the written records
- Collections.sort(samRecords, new SAMRecordCoordinateComparator());
- validateRecords(samRecords, new ByteArrayInputStream(outStream.toByteArray()), refSource);
- Assert.assertTrue(indexStream.size() != 0);
- }
-
- @Test(description = "Test CRAMWriter constructor reference required 1", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMWriterConstructorRequiredReference_1() {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- new CRAMFileWriter(outStream, null, header, null);
- }
-
- @Test(description = "Test CRAMWriter constructor reference required 2", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMWriterConstructorRequiredReference_2() {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- new CRAMFileWriter(outStream, null, null, header, null);
- }
-
- @Test(description = "Test CRAMWriter constructor reference required 3", expectedExceptions = IllegalArgumentException.class)
- public void testCRAMWriterConstructorRequiredReference_3() {
- final SAMFileHeader header = createSAMHeader(SAMFileHeader.SortOrder.coordinate);
- final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- new CRAMFileWriter(outStream, null, true, null, header, null);
- }
-
- @Test
- public void test_roundtrip_tlen_preserved() throws IOException {
- SamReader reader = SamReaderFactory.make().open(new File("src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam"));
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final ReferenceSource source = new ReferenceSource(new File("src/test/resources/htsjdk/samtools/cram_tlen.fasta"));
- CRAMFileWriter writer = new CRAMFileWriter(baos, source, reader.getFileHeader(), "test.cram");
- SAMRecordIterator iterator = reader.iterator();
- List<SAMRecord> records = new ArrayList<SAMRecord>();
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- writer.addAlignment(record);
- records.add(record);
- }
- writer.close();
-
- CRAMFileReader cramReader = new CRAMFileReader(new ByteArrayInputStream(baos.toByteArray()), (File) null, source, ValidationStringency.STRICT);
- iterator = cramReader.getIterator();
- int i = 0;
- while (iterator.hasNext()) {
- SAMRecord record1 = iterator.next();
- SAMRecord record2 = records.get(i++);
- Assert.assertEquals(record1.getInferredInsertSize(), record2.getInferredInsertSize(), record1.getReadName());
- }
- Assert.assertEquals(records.size(), i);
- }
-
- @Test
- public void testCRAMQuerySort() throws IOException {
- final File input = new File("src/test/resources/htsjdk/samtools/cram_query_sorted.cram");
- final File reference = new File("src/test/resources/htsjdk/samtools/cram_query_sorted.fasta");
- final File outputFile = File.createTempFile("tmp.", ".cram");
-
- try (final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
- final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader().clone(), false, outputFile, reference)) {
- for (SAMRecord rec : reader) {
- writer.addAlignment(rec);
- }
- }
-
- try (final SamReader outReader = SamReaderFactory.makeDefault().referenceSequence(reference).open(outputFile)) {
- String prevName = null;
- for (final SAMRecord rec : outReader) {
- if (prevName == null) {
- prevName = rec.getReadName();
- continue;
- }
- // test if the read names are sorted alphabetically:
- Assert.assertTrue(rec.getReadName().compareTo(prevName) >= 0);
- }
- }
-
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java b/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java
deleted file mode 100644
index b7e3eab..0000000
--- a/src/test/java/htsjdk/samtools/CRAMFileWriterWithIndexTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.Log;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Created by vadim on 23/03/2015.
- */
-public class CRAMFileWriterWithIndexTest {
- private byte[] cramBytes;
- private byte[] indexBytes;
- private InMemoryReferenceSequenceFile rsf;
- private ReferenceSource source;
- private SAMFileHeader header;
-
- @Test
- public void test() throws IOException {
- CRAMFileReader reader = new CRAMFileReader(new ByteArraySeekableStream(cramBytes), new ByteArraySeekableStream(indexBytes), source, ValidationStringency.SILENT);
- for (SAMSequenceRecord sequenceRecord : reader.getFileHeader().getSequenceDictionary().getSequences()) {
- final CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(sequenceRecord.getSequenceName(), 1);
- Assert.assertNotNull(iterator);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record = iterator.next();
- Assert.assertEquals(record.getReferenceName(), sequenceRecord.getSequenceName());
- Assert.assertEquals(record.getAlignmentStart(), 1);
- }
- }
-
- private static class TabuRegionInputStream extends SeekableStream {
- private SeekableStream delegate;
- private List<Chunk> tabuChunks;
-
- public TabuRegionInputStream(List<Chunk> tabuChunks, SeekableStream delegate) {
- this.tabuChunks = tabuChunks;
- this.delegate = delegate;
- }
-
- private boolean isTabu(long position) {
-
- for (Chunk chunk : tabuChunks) {
- if ((chunk.getChunkStart() >> 16) < position && position < (chunk.getChunkEnd() >> 16)) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public long length() {
- return delegate.length();
- }
-
- @Override
- public long position() throws IOException {
- return delegate.position();
- }
-
- @Override
- public void seek(long position) throws IOException {
- if (isTabu(position)) {
- throw new TabuError();
- }
- delegate.seek(position);
- }
-
- @Override
- public int read() throws IOException {
- if (isTabu(position())) throw new TabuError();
- return delegate.read();
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length) throws IOException {
- for (long pos = position(); pos < position() + length; pos++)
- if (isTabu(pos)) {
- throw new TabuError();
- }
- return delegate.read(buffer, offset, length);
- }
-
- @Override
- public void close() throws IOException {
- delegate.close();
- }
-
- @Override
- public boolean eof() throws IOException {
- return delegate.eof();
- }
-
- @Override
- public String getSource() {
- return delegate.getSource();
- }
- }
-
- private static class TabuError extends RuntimeException {
-
- }
-
- /**
- * This is to check that the indexing actually works and not just skips records. The approach is to forbid reading of the first
- * container and try accessing reads from the first and the second containers. The first attempt should fail but the second should succeed.
- *
- * @throws IOException
- */
- @Test
- public void testUnnecessaryIO() throws IOException {
- final SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(new ByteArraySeekableStream(indexBytes), header.getSequenceDictionary());
-
- BAMIndex index = new CachingBAMFileIndex(baiStream, header.getSequenceDictionary());
- int refID = 0;
- long start = index.getSpanOverlapping(refID, 1, Integer.MAX_VALUE).getFirstOffset();
- long end = index.getSpanOverlapping(refID + 1, 1, Integer.MAX_VALUE).getFirstOffset();
- TabuRegionInputStream tabuIS = new TabuRegionInputStream(Arrays.asList(new Chunk[]{new Chunk(start, end)}), new ByteArraySeekableStream(cramBytes));
-
- CRAMFileReader reader = new CRAMFileReader(tabuIS, new ByteArraySeekableStream(indexBytes), source, ValidationStringency.SILENT);
- try {
- // the attempt to read 1st container, which will happen when the iterator is initialized, must throw
- CloseableIterator<SAMRecord> it = reader.queryAlignmentStart(header.getSequence(refID).getSequenceName(), 1);
- Assert.fail();
- } catch (TabuError e) {
-
- }
-
- // reading after the 1st container should be ok:
- refID = 2;
- final CloseableIterator<SAMRecord> iterator = reader.queryAlignmentStart(header.getSequence(refID).getSequenceName(), 1);
- Assert.assertNotNull(iterator);
- Assert.assertTrue(iterator.hasNext());
- }
-
- @BeforeTest
- public void beforeTest() throws Exception {
- Log.setGlobalLogLevel(Log.LogLevel.ERROR);
-
- header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord("1");
-
- rsf = new InMemoryReferenceSequenceFile();
- int nofSequencesInDictionary = 3;
- int sequenceLength = 1024 * 1024;
- for (int i = 0; i < nofSequencesInDictionary; i++)
- addRandomSequence(header, sequenceLength, rsf);
-
- source = new ReferenceSource(rsf);
-
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
- builder.setHeader(header);
- builder.setReadGroup(readGroupRecord);
- header.addReadGroup(readGroupRecord);
-
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ByteArrayOutputStream indexOS = new ByteArrayOutputStream();
- CRAMFileWriter writer = new CRAMFileWriter(os, indexOS, source, header, null);
-
- int readPairsPerSequence = CRAMContainerStreamWriter.DEFAULT_RECORDS_PER_SLICE;
-
- for (SAMSequenceRecord sequenceRecord : header.getSequenceDictionary().getSequences()) {
- int alignmentStart = 1;
- for (int i = 0; i < readPairsPerSequence / 2; i++) {
- builder.addPair(Integer.toString(i), sequenceRecord.getSequenceIndex(), alignmentStart, alignmentStart + 2);
- alignmentStart++;
- }
- }
-
- List<SAMRecord> list = new ArrayList<SAMRecord>(readPairsPerSequence);
- list.addAll(builder.getRecords());
- Collections.sort(list, new SAMRecordCoordinateComparator());
-
- for (SAMRecord record : list)
- writer.addAlignment(record);
-
- list.clear();
- writer.close();
- cramBytes = os.toByteArray();
- indexBytes = indexOS.toByteArray();
- }
-
- private static void addRandomSequence(SAMFileHeader header, int length, InMemoryReferenceSequenceFile rsf) {
- String name = String.valueOf(header.getSequenceDictionary().size() + 1);
- header.addSequence(new SAMSequenceRecord(name, length));
- byte[] refBases = new byte[length];
- Random random = new Random();
- byte[] alphabet = "ACGTN".getBytes();
- for (int i = 0; i < refBases.length; i++)
- refBases[i] = alphabet[random.nextInt(alphabet.length)];
-
- rsf.add(name, refBases);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java b/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java
deleted file mode 100644
index df94310..0000000
--- a/src/test/java/htsjdk/samtools/CRAMIndexQueryTest.java
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloseableIterator;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.util.function.Function;
-
-/**
- * Test index query calls against a *SamReader* on a CRAM File, which will use
- * whatever index format (.bai or .crai converted to .bai) is available for the
- * target file.
- */
-public class CRAMIndexQueryTest {
-
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/cram");
-
- private static final File cramQueryWithBAI = new File(TEST_DATA_DIR, "cramQueryWithBAI.cram");
- private static final File cramQueryWithCRAI = new File(TEST_DATA_DIR, "cramQueryWithCRAI.cram");
- private static File cramQueryWithLocalCRAI = null; // generated by @BeforeClass from cramQueryWithCRAI
- private static final File cramQueryReference = new File(TEST_DATA_DIR, "human_g1k_v37.20.21.10M-10M200k.fasta");
-
- private static final File cramQueryReadsWithBAI = new File(TEST_DATA_DIR, "cramQueryTest.cram");
- private static File cramQueryReadsWithLocalCRAI = null; // generated by @BeforeClass from cramQueryReadsWithBAI
-
- private static final File cramQueryTestEmptyWithBAI = new File(TEST_DATA_DIR, "cramQueryTestEmpty.cram");
- private static File cramQueryTestEmptyWithLocalCRAI = null; // generated by @BeforeClass from cramQueryTestEmptyWithBAI
- private static final File cramQueryReadsReference = new File(TEST_DATA_DIR,"../hg19mini.fasta");
-
-
- // htsjdk currently generates .bai index files instead of .crai due to https://github.com/samtools/htsjdk/issues/531;
- // however we still want to test the htsjdk CRAI creation code. In order to run these index query tests against CRAI
- // files generated by htsjdk, we copy the checked-in test files into new CRAMs and then manually generate .CRAI files
- // to run to use as additional test cases
- @BeforeClass
- public void createLocallyGeneratedCRAIFiles() throws IOException {
- cramQueryWithLocalCRAI = File.createTempFile("cramQueryWithLocalCRAI.", ".cram");
- cramQueryWithLocalCRAI.deleteOnExit();
- File tempCRAIOut = new File(cramQueryWithLocalCRAI.getAbsolutePath() + ".crai");
- tempCRAIOut.deleteOnExit();
- createLocalCRAMAndCRAI(
- cramQueryWithCRAI,
- cramQueryReference,
- cramQueryWithLocalCRAI,
- tempCRAIOut
- );
-
- cramQueryReadsWithLocalCRAI = File.createTempFile("cramQueryReadsWithLocalCRAI.", ".cram");
- tempCRAIOut = new File(cramQueryReadsWithLocalCRAI.getAbsolutePath() + ".crai");
- tempCRAIOut.deleteOnExit();
- cramQueryReadsWithLocalCRAI.deleteOnExit();
- createLocalCRAMAndCRAI(
- cramQueryReadsWithBAI,
- cramQueryReadsReference,
- cramQueryReadsWithLocalCRAI,
- tempCRAIOut
- );
-
- cramQueryTestEmptyWithLocalCRAI = File.createTempFile("cramQueryTestEmptyWithLocalCRAI.", ".cram");
- tempCRAIOut = new File(cramQueryTestEmptyWithLocalCRAI.getAbsolutePath() +".crai");
- tempCRAIOut.deleteOnExit();
- cramQueryTestEmptyWithLocalCRAI.deleteOnExit();
- createLocalCRAMAndCRAI(
- cramQueryTestEmptyWithBAI,
- cramQueryReference,
- cramQueryTestEmptyWithLocalCRAI,
- tempCRAIOut
- );
- }
-
- private void createLocalCRAMAndCRAI(
- final File inputCRAM,
- final File reference,
- final File outputCRAM,
- final File outputCRAI) throws IOException
- {
- Files.copy(inputCRAM.toPath(), outputCRAM.toPath(), StandardCopyOption.REPLACE_EXISTING);
-
- SAMFileHeader samHeader = null;
- try (SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(inputCRAM)) {
- samHeader = reader.getFileHeader();
- }
- try (FileOutputStream bos = new FileOutputStream(outputCRAI)) {
- CRAMCRAIIndexer craiIndexer = new CRAMCRAIIndexer(bos, samHeader);
- craiIndexer.writeIndex(new SeekableFileStream(outputCRAM), bos);
- }
- }
-
- @DataProvider(name = "singleIntervalOverlapping")
- public Object[][] singleIntervalOverlapping() {
- return new Object[][] {
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100009, 100009), new String[]{"a", "b", "c"}},
-
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100009, 100011), new String[]{"a", "b", "c", "d", "e"}},
-
- // interval with 1 start
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 100010), new String[]{"a", "b", "c", "d"}},
-
- // interval with 0 end
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100015, 0), new String[]{"a", "b", "c", "d", "e", "f"}},
-
- // interval with 1 start and 0 end
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
-
- //totally empty cram file
- {cramQueryTestEmptyWithBAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
- {cramQueryTestEmptyWithLocalCRAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
- };
- }
-
- @Test(dataProvider="singleIntervalOverlapping")
- public void testQueryOverlappingSingleInterval(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.queryOverlapping(new QueryInterval[]{interval}),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalOverlapping")
- public void testQueryOverlappingSequence(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.queryOverlapping(
- reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
- interval.start,
- interval.end
- ),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalOverlapping")
- public void testQuerySingleIntervalContainedFalse(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.query(new QueryInterval[]{interval}, false),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalOverlapping")
- public void testQuerySequenceContainedFalse(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.query(
- reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
- interval.start,
- interval.end,
- false
- ),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "singleIntervalContained")
- public Object[][] singleIntervalContained() {
- return new Object[][] {
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f",}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f",}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100013, 100070), new String[]{"f", "f"}},
-
- // interval with 1 start
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 100100), new String[]{"e", "f", "f"}},
-
- // interval with 0 end
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 100010, 0), new String[]{"d", "e", "f", "f",}},
-
- // interval with 1 start and 0 end
- {cramQueryWithCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
- {cramQueryWithBAI, cramQueryReference, new QueryInterval(0, 1, 0), new String[]{"a", "b", "c", "d", "e", "f", "f"}},
-
- //totally empty cram file
- {cramQueryTestEmptyWithBAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
- {cramQueryTestEmptyWithLocalCRAI, cramQueryReadsReference, new QueryInterval(0, 1, 0), new String[]{}},
- };
- }
-
- @Test(dataProvider="singleIntervalContained")
- public void testQueryContainedSingleInterval(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.queryContained(new QueryInterval[]{interval}),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalContained")
- public void testQueryContainedSequence(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.queryContained(
- reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
- interval.start,
- interval.end
- ),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalContained")
- public void testQuerySingleIntervalContainedTrue(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.query(new QueryInterval[]{interval}, true),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @Test(dataProvider="singleIntervalContained")
- public void testQuerySequenceContainedTrue(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval interval,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.query(
- reader.getFileHeader().getSequence(interval.referenceIndex).getSequenceName(),
- interval.start,
- interval.end,
- true
- ),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "multipleIntervalOverlapping")
- public Object[][] multipleIntervalOverlapping() {
- return new Object[][]{
- {cramQueryWithCRAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
- new String[]{"a", "b", "c", "d", "e"}},
- {cramQueryWithLocalCRAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
- new String[]{"a", "b", "c", "d", "e"}},
- {cramQueryWithBAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100010, 100010), new QueryInterval(0, 100011, 100011)},
- new String[]{"a", "b", "c", "d", "e"}},
- // no matching reads
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
- new String[]{}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
- new String[]{}},
- // matching reads from first interval only
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 300, 301)},
- new String[]{"a", "b"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 300, 301)},
- new String[]{"a", "b"}},
- // matching reads from last interval only
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 701)},
- new String[]{"k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 701)},
- new String[]{"k"}},
- //matching reads from each interval
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 700, 701)},
- new String[]{"a", "b", "k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 206), new QueryInterval(3, 700, 701)},
- new String[]{"a", "b", "k"}},
- //matching reads from each interval - 4 intervals
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{
- new QueryInterval(0, 200, 201), new QueryInterval(1, 500, 501),
- new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
- new String[]{"a", "f", "i", "k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{
- new QueryInterval(0, 200, 201), new QueryInterval(1, 500, 501),
- new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
- new String[]{"a", "f", "i", "k"}},
- // first read is before the first interval
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
- new String[]{"i", "k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 701)},
- new String[]{"i", "k"}},
- // first interval is before the first read
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
- new String[]{"a"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
- new String[]{"a"}},
- // intervals in reverse order
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
- new String[]{"a"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 201)},
- new String[]{"a"}},
- };
- }
-
- @Test(dataProvider="multipleIntervalOverlapping")
- public void testQueryOverlappingMultipleIntervals(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval[] intervals,
- final String[] expectedNames) throws IOException
- {
- QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
- Assert.assertTrue(optimizedIntervals.length > 1);
-
- doQueryTest(
- reader -> reader.queryOverlapping(optimizedIntervals),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "otherMultipleIntervals")
- public Object[][] otherMultipleIntervals() {
- return new Object[][]{
- // accept an empty QueryIntervalArray
- {cramQueryWithBAI, cramQueryReference,
- new QueryInterval[]{},
- new String[]{}},
- // intervals overlapping - optimized to a single interval
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 1000, 1030), new QueryInterval(0, 1020, 1076)},
- new String[]{"d"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 1000, 1030), new QueryInterval(0, 1020, 1076)},
- new String[]{"d"}}
- };
- }
-
- // these are tested separately because we want the normal multi-interval test to
- // assert that the interval list size is > 1 post-optimization to ensure we're
- // using more than one interval; these tests optimize down to 0 or 1 interval
- @Test(dataProvider="otherMultipleIntervals")
- public void testOtherMultipleIntervals(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval[] intervals,
- final String[] expectedNames) throws IOException
- {
- QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
- doQueryTest(
- reader -> reader.queryContained(optimizedIntervals),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- doQueryTest(
- reader -> reader.queryOverlapping(optimizedIntervals),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "multipleIntervalContained")
- public Object[][] multipleIntervalContained() {
- return new Object[][]{
- {cramQueryWithCRAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
- new String[]{"f", "f"}},
- {cramQueryWithLocalCRAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
- new String[]{"f", "f"}},
- {cramQueryWithBAI, cramQueryReference,
- new QueryInterval[]{new QueryInterval(0, 100008, 100008), new QueryInterval(0, 100013, 0)},
- new String[]{"f", "f"}},
- // no matching reads
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
- new String[]{}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 300, 310), new QueryInterval(1, 300, 310)},
- new String[]{}},
- // matching reads from first interval only
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 305), new QueryInterval(3, 300, 301)},
- new String[]{"b", "c"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 205, 305), new QueryInterval(3, 300, 301)},
- new String[]{"b", "c"}},
- // matching reads from last interval only
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 776)},
- new String[]{"k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(3, 700, 776)},
- new String[]{"k"}},
- //matching reads from each interval
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 200, 281), new QueryInterval(3, 700, 776)},
- new String[]{"a", "b", "k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 200, 281), new QueryInterval(3, 700, 776)},
- new String[]{"a", "b", "k"}},
- //matching reads from each interval - 4 intervals
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{
- new QueryInterval(0, 200, 281), new QueryInterval(1, 500, 576),
- new QueryInterval(2, 300, 376), new QueryInterval(3, 700, 776)},
- new String[]{"a", "b", "f", "i", "k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{
- new QueryInterval(0, 200, 281), new QueryInterval(1, 500, 576),
- new QueryInterval(2, 300, 376), new QueryInterval(3, 700, 776)},
- new String[]{"a", "b", "f", "i", "k"}},
- // first read is before the first interval
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 776)},
- new String[]{"k"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(2, 300, 301), new QueryInterval(3, 700, 776)},
- new String[]{"k"}},
- // first interval is before the first read
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 276)},
- new String[]{"a"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 100, 101), new QueryInterval(0, 200, 276)},
- new String[]{"a"}},
- // intervals in reverse order
- {cramQueryReadsWithBAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 200, 276), new QueryInterval(0, 100, 101)},
- new String[]{"a"}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference,
- new QueryInterval[]{new QueryInterval(0, 200, 276), new QueryInterval(0, 100, 101)},
- new String[]{"a"}},
- };
- }
-
- @Test(dataProvider="multipleIntervalContained")
- public void testQueryContainedMultipleIntervals(
- final File cramFileName,
- final File referenceFileName,
- final QueryInterval[] intervals,
- final String[] expectedNames) throws IOException
- {
- QueryInterval[] optimizedIntervals = QueryInterval.optimizeIntervals(intervals);
- Assert.assertTrue(optimizedIntervals.length > 1);
- doQueryTest(
- reader -> reader.queryContained(optimizedIntervals),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "unmappedQueries")
- public Object[][] unmappedQueries() {
- return new Object[][] {
- {cramQueryWithCRAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
- {cramQueryWithLocalCRAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
- {cramQueryWithBAI, cramQueryReference, new String[]{"g", "h", "h", "i", "i"}},
- //no unmapped reads
- {cramQueryReadsWithBAI, cramQueryReadsReference, new String[]{}},
- {cramQueryReadsWithLocalCRAI, cramQueryReadsReference, new String[]{}}
- };
- }
-
- @Test(dataProvider="unmappedQueries")
- public void testQueryUnmapped(
- final File cramFileName,
- final File referenceFileName,
- final String[] expectedNames) throws IOException
- {
- doQueryTest(
- reader -> reader.queryUnmapped(),
- cramFileName,
- referenceFileName,
- expectedNames
- );
- }
-
- @DataProvider(name = "mateQueries")
- public Object[][] mateQueries() {
- return new Object[][] {
- {cramQueryWithCRAI, cramQueryReference, "f"},
- {cramQueryWithLocalCRAI, cramQueryReference, "f"},
- {cramQueryWithBAI, cramQueryReference, "f"}
- };
- }
-
- @Test(dataProvider="mateQueries")
- public void testQueryMate(
- final File cramFileName,
- final File referenceFileName,
- final String expectedName) throws IOException
- {
- SamReaderFactory factory = SamReaderFactory.makeDefault();
- if (referenceFileName != null) {
- factory = factory.referenceSequence(referenceFileName);
- }
- SAMRecord firstRecord = null;
- SAMRecord secondRecord = null;
- try (final SamReader reader = factory.open(cramFileName)) {
- final CloseableIterator<SAMRecord> it = reader.queryAlignmentStart("20", 100013);
- Assert.assertTrue(it.hasNext());
- firstRecord = it.next();
- Assert.assertTrue(it.hasNext());
- secondRecord = it.next();
- Assert.assertFalse(it.hasNext());
- }
-
- // get the mate for the first record
- try (final SamReader reader = factory.open(cramFileName)) {
- final SAMRecord samRecord = reader.queryMate(firstRecord);
- Assert.assertEquals(samRecord, secondRecord);
- }
-
- // now query the mate's mate to ensure we get symmetric results
- try (final SamReader reader = factory.open(cramFileName)) {
- final SAMRecord samRecord = reader.queryMate(secondRecord);
- Assert.assertEquals(samRecord, firstRecord);
- }
- }
-
- private void doQueryTest(
- final Function<SamReader, CloseableIterator <SAMRecord>> getIterator,
- final File cramFileName,
- final File referenceFileName,
- final String[] expectedNames) throws IOException
- {
- SamReaderFactory factory = SamReaderFactory.makeDefault();
- if (referenceFileName != null) {
- factory = factory.referenceSequence(referenceFileName);
- }
- try (final SamReader reader = factory.open(cramFileName);
- final CloseableIterator<SAMRecord> it = getIterator.apply(reader)) {
- int count = 0;
- while (it.hasNext()) {
- SAMRecord samRec = it.next();
- Assert.assertTrue(count < expectedNames.length);
- Assert.assertEquals(samRec.getReadName(), expectedNames[count]);
- count++;
- }
- Assert.assertEquals(count, expectedNames.length);
- }
- }
-
-
- @DataProvider(name = "iteratorStateTests")
- public Object[][] iteratorStateQueries() {
- return new Object[][] {
- {cramQueryWithCRAI, cramQueryReference},
- {cramQueryWithLocalCRAI, cramQueryReference},
- {cramQueryWithBAI, cramQueryReference}
- };
- }
-
- // The current CRAMFileReader implementation allows multiple iterators to exist on a
- // CRAM reader at the same time, but they're not properly isolated from each other. When
- // CRAMFileReader is changed to support the SamReader contract of one-iterator-at-a-time
- // (https://github.com/samtools/htsjdk/issues/563), these can be re-enabled.
- //
- @Test(dataProvider="iteratorStateTests", expectedExceptions=SAMException.class, enabled=false)
- public void testIteratorState(
- final File cramFileName,
- final File referenceFileName,
- final int expectedCount) throws IOException
- {
- SamReaderFactory factory = SamReaderFactory.makeDefault();
- if (referenceFileName != null) {
- factory = factory.referenceSequence(referenceFileName);
- }
-
- try (final SamReader reader = factory.open(cramFileName)) {
- final CloseableIterator<SAMRecord> origIt = reader.iterator();
-
- // opening the second iterator should throw
- final CloseableIterator<SAMRecord> overlapIt = reader.queryOverlapping("20", 100013, 100070);
- }
- }
-
- @DataProvider(name = "unmappedSliceTest")
- public Object[][] unmappedMultiSliceTest() {
- return new Object[][] {
- // the main test feature of these files is that they have several mapped reads followed by
- // some number of unmapped reads, each created with seqs_per_slice = 100 to force the unmapped
- // reads to be distributed over multiple slices (at least for large numbers of unmapped reads)
- // tests the fix to https://github.com/samtools/htsjdk/issues/562
- {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram"),
- new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 0},
- {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram"),
- new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 1},
- {new File(TEST_DATA_DIR, "NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram"),
- new File(TEST_DATA_DIR, "human_g1k_v37.20.21.1-100.fasta"), 500},
- };
- }
-
- @Test(dataProvider = "unmappedSliceTest")
- private void testUnmappedMultiSlice(
- final File cramFileName,
- final File referenceFileName,
- final int expectedCount) throws IOException
- {
- SamReaderFactory factory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
- factory = factory.referenceSequence(referenceFileName);
-
- int count = 0;
- try (final SamReader reader = factory.open(cramFileName);
- final CloseableIterator<SAMRecord> it = reader.queryUnmapped())
- {
- while (it.hasNext()) {
- it.next();
- count++;
- }
- }
- Assert.assertEquals(count, expectedCount);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/ChunkTest.java b/src/test/java/htsjdk/samtools/ChunkTest.java
deleted file mode 100644
index d2bc157..0000000
--- a/src/test/java/htsjdk/samtools/ChunkTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class ChunkTest {
- @Test
- public void testOverlaps() {
- // Test completely disjoint offsets.
- Assert.assertFalse(new Chunk(1,5).overlaps(new Chunk(11,15)),"Test found overlap in non-overlapping offsets");
- Assert.assertFalse(new Chunk(11,15).overlaps(new Chunk(1,5)),"Test found overlap in non-overlapping offsets");
-
- // Test adjacent offsets
- Assert.assertFalse(new Chunk(1,5).overlaps(new Chunk(6,10)),"Test found overlap in adjacent offsets");
- Assert.assertFalse(new Chunk(6,10).overlaps(new Chunk(1,5)),"Test found overlap in adjacent offsets");
-
- // Test overlapping offsets
- Assert.assertTrue(new Chunk(1,5).overlaps(new Chunk(2,6)),"Test returned incorrect value for overlapping offsets");
- Assert.assertTrue(new Chunk(2,6).overlaps(new Chunk(1,5)),"Test returned incorrect value for overlapping offsets");
- Assert.assertTrue(new Chunk(1,5).overlaps(new Chunk(2,6)),"Test returned incorrect value for overlapping offsets");
-
- // Completely disjoint and adjacent blocks
- Assert.assertFalse(new Chunk(1<<16,2<<16).overlaps(new Chunk(3<<16,4<<16)),"Test found overlap in non-overlapping blocks");
- Assert.assertFalse(new Chunk(1<<16,2<<16).overlaps(new Chunk(2<<16,3<<16)),"test found overlap in adjacent blocks");
-
- // True overlaps in the same block
- Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16,2<<16)),"Test failed to find overlap in completely overlapping chunks");
- Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16,1<<16|0xFF00)),"Test failed to find overlap in chunks with head overlapping");
- Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFF00,2<<16)),"Test failed to find overlap in overlapping chunks");
- Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFEFF,1<<16|0xFF00)),"Test failed to find overlap in contained chunk");
- Assert.assertTrue(new Chunk(1<<16|0xFEFF,1<<16|0xFF00).overlaps(new Chunk(1<<16,2<<16)),"Test failed to find overlap in enclosing chunk");
- Assert.assertTrue(new Chunk(1<<16,1<<16|0xFF00).overlaps(new Chunk(1<<16|0xFEFF,2<<16)),"Test failed to find tail->head overlap");
- Assert.assertTrue(new Chunk(1<<16|0xFEFF,2<<16).overlaps(new Chunk(1<<16,1<<16|0xFF00)),"Test failed to find head->tail overlap");
-
- // Test overlaps spanning blocks
- Assert.assertTrue(new Chunk(1<<16,2<<16).overlaps(new Chunk(1<<16|0xFF00,2<<16|0xFF00)),"Test failed to find overlap spanning blocks");
- }
-
- @Test
- public void testAdjacency() {
- // Test offset adjacency
- Assert.assertTrue(new Chunk(1,5).isAdjacentTo(new Chunk(5,9)),"Offsets which should be adjacent are not");
- Assert.assertTrue(new Chunk(5,9).isAdjacentTo(new Chunk(1,5)),"Offsets which should be adjacent are not");
-
- // Test block adjacency
- Assert.assertTrue(new Chunk(1<<16,2<<16).isAdjacentTo(new Chunk(2<<16,3<<16)),"Blocks which should be adjacent are not");
-
- // Test offset-block adjacency
- Assert.assertTrue(new Chunk(1<<16,2<<16|0xFF00).isAdjacentTo(new Chunk(2<<16|0xFF00,3<<16)),"Block-offsets which should be adjacent are not");
-
- // Discontiguous and overlapping blocks
- Assert.assertFalse(new Chunk(1,5).isAdjacentTo(new Chunk(11,15)),"Disjoint block should not be adjacent");
- Assert.assertFalse(new Chunk(1,5).isAdjacentTo(new Chunk(2,3)),"Contained offset should not be adjacent");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CigarCodecTest.java b/src/test/java/htsjdk/samtools/CigarCodecTest.java
deleted file mode 100644
index 8275a94..0000000
--- a/src/test/java/htsjdk/samtools/CigarCodecTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class CigarCodecTest {
-
-
- @Test
- public void testDefault() {
- final Cigar emptyCigar = new Cigar();
- Assert.assertEquals(emptyCigar, BinaryCigarCodec.decode(new int[0]));
- final int[] binaryCigar = BinaryCigarCodec.encode(emptyCigar);
- Assert.assertEquals(0, binaryCigar.length);
- Assert.assertEquals(emptyCigar, TextCigarCodec.decode(SAMRecord.NO_ALIGNMENT_CIGAR));
- Assert.assertEquals(TextCigarCodec.encode(emptyCigar), SAMRecord.NO_ALIGNMENT_CIGAR);
- }
-
- private static class Cigarette {
- final int length;
- final char op;
-
- private Cigarette(final int length, final char op) {
- this.length = length;
- this.op = op;
- }
-
- int getBinaryOp() {
- switch (op) {
- case 'M': return 0;
- case 'I': return 1;
- case 'D': return 2;
- case 'N': return 3;
- case 'S': return 4;
- case 'H': return 5;
- case 'P': return 6;
- case '=': return 7;
- case 'X' : return 8;
- default: Assert.assertTrue(false);
- }
- return -1;
- }
- }
-
- private String makeTextCigar(final Cigarette[] cigarettes) {
- final StringBuilder sb = new StringBuilder();
- for (final Cigarette c : cigarettes) {
- sb.append(Integer.toString(c.length));
- sb.append(c.op);
- }
- return sb.toString();
- }
-
- private int[] makeBinaryCigar(final Cigarette[] cigarettes) {
- final int[] ret = new int[cigarettes.length];
- for (int i = 0; i < cigarettes.length; ++i) {
- ret[i] = cigarettes[i].length << 4 | cigarettes[i].getBinaryOp();
- }
- return ret;
- }
-
- @Test
- public void testSimple() {
- final Cigarette[] cigarettes = {
- new Cigarette(100, 'M'),
- new Cigarette(200, 'I'),
- new Cigarette(50, 'D'),
- new Cigarette(21, 'N'),
- new Cigarette(12, 'S'),
- new Cigarette(99, 'H'),
- new Cigarette(20, 'P'),
- new Cigarette(2, '='),
- new Cigarette(2, 'X')
- };
- final String textCigar = makeTextCigar(cigarettes);
- final int[] binaryCigar = makeBinaryCigar(cigarettes);
- final Cigar fromText = TextCigarCodec.decode(textCigar);
- final Cigar fromBinary = BinaryCigarCodec.decode(binaryCigar);
- Assert.assertEquals(fromText, fromBinary);
- final String anotherTextCigar = TextCigarCodec.encode(fromBinary);
- final int[] anotherBinaryCigar = BinaryCigarCodec.encode(fromText);
- Assert.assertEquals(anotherTextCigar, textCigar);
- Assert.assertTrue(Arrays.equals(anotherBinaryCigar, binaryCigar));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/CigarTest.java b/src/test/java/htsjdk/samtools/CigarTest.java
deleted file mode 100644
index acdc224..0000000
--- a/src/test/java/htsjdk/samtools/CigarTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class CigarTest {
-
- @DataProvider(name = "positiveTestsData")
- public Object[][] testPositive() {
- return new Object[][]{
- {""},
- {"2M1P4M1P2D1P6D"},
- {"10M5N1I12M"},
- {"10M1I5N1I12M"},
- {"9M1D5N1I12M"},
-
- // I followed by D and vice versa is now allowed.
- {"1M1I1D1M"},
- {"1M1D1I1M"},
-
- // Soft-clip inside of hard-clip now allowed.
- {"29M1S15H"},
- };
- }
-
- @Test(dataProvider = "positiveTestsData")
- public void testPositive(final String cigar) {
- Assert.assertNull(TextCigarCodec.decode(cigar).isValid(null, -1));
- }
-
- @DataProvider(name = "negativeTestsData")
- public Object[][] negativeTestsData() {
-
- return new Object[][]{
- // Cannot have two consecutive insertions (of the same type)
- {"1M1D1D1M", SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR},
- {"1M1I1I1M", SAMValidationError.Type.ADJACENT_INDEL_IN_CIGAR},
-
- // Soft clip must be at end of read or inside of hard clip
- {"1M1D1S1M", SAMValidationError.Type.INVALID_CIGAR},
- {"1M1D1S1M1H", SAMValidationError.Type.INVALID_CIGAR},
- {"1M1D1S1S", SAMValidationError.Type.INVALID_CIGAR},
- {"1M1D1S1S1H", SAMValidationError.Type.INVALID_CIGAR},
- {"1H1S1S1M1D", SAMValidationError.Type.INVALID_CIGAR},
- {"1S1S1M1D", SAMValidationError.Type.INVALID_CIGAR},
-
- // Soft clip must be at end of read or inside of hard clip, but there must be something left
- {"1S1S", SAMValidationError.Type.INVALID_CIGAR},
- {"1H1S", SAMValidationError.Type.INVALID_CIGAR},
- {"1S1H", SAMValidationError.Type.INVALID_CIGAR},
- {"1H1H", SAMValidationError.Type.INVALID_CIGAR},
- };
-/*
- // Zero length for an element not allowed. TODO: not sure why this is commented out
- {"100M0D10M1D10M", SAMValidationError.Type.INVALID_CIGAR}
-*/
- }
-
- @Test(dataProvider = "negativeTestsData")
- public void testNegative(final String cigar, final SAMValidationError.Type type) {
- final List<SAMValidationError> errors = TextCigarCodec.decode(cigar).isValid(null, -1);
- Assert.assertEquals(errors.size(), 1, String.format("Got %d error, expected exactly one error.", errors.size()));
- Assert.assertEquals(errors.get(0).getType(), type);
- }
-
- @Test
- public void testMakeCigarFromOperators() {
- final List<CigarOperator> cigarOperators = Arrays.asList(
- CigarOperator.S,
- CigarOperator.M,
- CigarOperator.M,
- CigarOperator.M,
- CigarOperator.I,
- CigarOperator.M,
- CigarOperator.D,
- CigarOperator.M
- );
- final Cigar cigar = Cigar.fromCigarOperators(cigarOperators);
- Assert.assertFalse(cigar.isEmpty());
- Assert.assertEquals(cigar.numCigarElements(), 6);
- Assert.assertEquals(cigar.toString(),"1S3M1I1M1D1M");
- Assert.assertFalse(cigar.containsOperator(CigarOperator.N));
- Assert.assertTrue(cigar.containsOperator(CigarOperator.D));
- Assert.assertTrue(cigar.isLeftClipped());
- Assert.assertFalse(cigar.isRightClipped());
- Assert.assertTrue(cigar.isClipped());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java b/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java
deleted file mode 100644
index e84ee2e..0000000
--- a/src/test/java/htsjdk/samtools/DownsamplingIteratorTests.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.DownsamplingIteratorFactory.Strategy;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Tests for the downsampling iterator class.
- * @author Tim Fennell
- */
-public class DownsamplingIteratorTests {
- final int NUM_TEMPLATES = 50000;
- final EnumMap<Strategy, Double> ACCURACY = new EnumMap<Strategy,Double>(Strategy.class){{
- put(Strategy.HighAccuracy, 0.001);
- put(Strategy.Chained, 0.005);
- put(Strategy.ConstantMemory, 0.01);
- }};
-
- private static Random getRandom(){
- //this test is probably too strict in it's tolerances
- //not every random seed works, 10000 for example is rejected
- return new Random(10001);
- }
-
- @Test
- public void testBasicFunction() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- final Random r = getRandom();
- for (int i=0; i<NUM_TEMPLATES; ++i) {
- builder.addPair("pair" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
- }
- final Collection<SAMRecord> recs = builder.getRecords();
-
- runTests("testBasicFunction", recs);
- }
-
- private void runTests(final String name, final Collection<SAMRecord> recs) {
- for (final DownsamplingIteratorFactory.Strategy strategy : DownsamplingIteratorFactory.Strategy.values()) {
- final double accuracy = ACCURACY.get(strategy);
-
- for (final double p : new double[]{0, 0.01, 0.1, 0.5, 0.9, 1}) {
- final DownsamplingIterator iterator = DownsamplingIteratorFactory.make(recs.iterator(), strategy, p, accuracy, 42);
- final List<SAMRecord> out = new ArrayList<SAMRecord>();
- while (iterator.hasNext()) out.add(iterator.next());
-
- final String testcase = name + ": strategy=" + strategy.name() + ", p=" + p + ", accuracy=" + accuracy;
-
- final double readFraction = iterator.getAcceptedFraction();
- Assert.assertEquals(out.size(), iterator.getAcceptedCount(), "Mismatched sizes with " + testcase);
- Assert.assertTrue(readFraction > p - accuracy && readFraction < p + accuracy, "Read fraction " + readFraction + " out of bounds in " + testcase);
- }
- }
- }
-
- @Test
- public void testMixOfPairsAndFrags() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- final Random r = getRandom();
- for (int i=0; i<NUM_TEMPLATES; ++i) {
- builder.addFrag("frag" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), false);
- builder.addPair("pair" + r.nextInt(), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
- }
-
- final Collection<SAMRecord> recs = builder.getRecords();
- runTests("testMixOfPairsAndFrags", recs);
- }
-
- @Test
- public void testSecondaryAlignments() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- final Random r = getRandom();
- for (int i=0; i<NUM_TEMPLATES; ++i) {
- final int x = r.nextInt();
- builder.addPair("pair" + x, r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000));
- builder.addPair("pair" + x, r.nextInt(24), r.nextInt(24), r.nextInt(1000000), r.nextInt(1000000), false, false, "50M", "50M", false, true, true, true, 20);
- }
-
- final Collection<SAMRecord> recs = builder.getRecords();
- runTests("testSecondaryAlignments", recs);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java b/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java
deleted file mode 100644
index 5952953..0000000
--- a/src/test/java/htsjdk/samtools/DuplicateSetIteratorTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DuplicateSetIteratorTest {
- protected final static int DEFAULT_BASE_QUALITY = 10;
-
- private SAMRecordSetBuilder getSAMRecordSetBuilder() {
- return new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- }
-
- @Test
- public void testSupplementalReads() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false);
- records.addFrag("READ1", 1, 1, false);
-
- //secondary alignment
- records.addFrag("SECN0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true);
- records.addFrag("SECN1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true);
-
- //unmapped
- records.addFrag("UNMP0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("UNMP1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY);
-
- //supplemental
- records.addFrag("SUPP0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, false, true);
- records.addFrag("SUPP1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-
- //supplemental secondary
- records.addFrag("SUSE0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true, true);
- records.addFrag("SUSE1", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-
- //unmapped secondary
- records.addFrag("UNSE0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true);
- records.addFrag("UNSE1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true);
-
- //unmapped supplemental
- records.addFrag("UNSU0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, false, true);
- records.addFrag("UNSU1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, false, true);
-
- //unmapped supplemental secondary
- records.addFrag("UNSS0", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true, true);
- records.addFrag("UNSS1", 1, 1, false, true, "50M", null, DEFAULT_BASE_QUALITY, true, true);
-
- Map<String, DuplicateSet> allSets = new HashMap<String, DuplicateSet>();
-
- DuplicateSetIterator duplicateSetIterator = new DuplicateSetIterator(records.iterator(), getSAMRecordSetBuilder().getHeader(), false);
- while (duplicateSetIterator.hasNext()) {
- DuplicateSet set = duplicateSetIterator.next();
- allSets.put(set.getRepresentative().getReadName(), set);
- }
-
- //we expect 15 duplicate sets one for the initial two reads and one for each of the additional 14 reads.
- Assert.assertEquals(allSets.size(), 15, "Wrong number of duplicate sets.");
- Assert.assertEquals(allSets.get("READ0").size(), 2, "Should be two reads in the READ0 duplicate set, but there are not.");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java b/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java
deleted file mode 100644
index 8f5569c..0000000
--- a/src/test/java/htsjdk/samtools/GenomicIndexUtilTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for GenomicIndexUtil.
- */
-public class GenomicIndexUtilTest {
-
- @Test(dataProvider = "testRegionToBinDataProvider")
- public void testRegionToBin(final int beg, final int end, final int bin) {
- Assert.assertEquals(GenomicIndexUtil.regionToBin(beg, end), bin);
- }
-
- @DataProvider(name = "testRegionToBinDataProvider")
- public Object[][] testRegionToBinDataProvider() {
- return new Object[][] {
- {0, 0, 0},
- {1, 1, 4681},
- {0, 1<<14, 4681},
- {0, (1<<14)+1, 585},
-
- {1<<14, 1<<14, 585},
- {(1<<14)+1, (1<<14)+1, 4682},
- {1<<14, 1<<17, 585},
- {1<<14, (1<<17)+1, 73},
-
- {1<<17, 1<<17, 73},
- {(1<<17)+1, (1<<17)+1, 4689},
- {1<<17, 1<<20, 73},
- {1<<17, (1<<20)+1, 9},
-
- {1<<20, 1<<20, 9},
- {(1<<20)+1, (1<<20)+1, 4745},
- {1<<20, 1<<23, 9},
- {1<<20, (1<<23)+1, 1},
-
- {1<<23, 1<<23, 1},
- {(1<<23)+1, (1<<23)+1, 5193},
- {1<<23, 1<<26, 1},
- {1<<23, (1<<26)+1, 0},
-
- {1<<26, 1<<26, 0},
- {(1<<26)+1, (1<<26)+1, 8777},
- {1<<26, 1<<26+1, 2}
- };
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java b/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java
deleted file mode 100644
index 18c10c7..0000000
--- a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorGroupCollisionTest.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Tests for MultiIterator relating to group collision.
- *
- * @author Dave Tefft, Andre Mesarovic
- */
-public class MergingSamRecordIteratorGroupCollisionTest {
-
- private GroupAdapter padapter = new ProgramGroupAdapter();
- private GroupAdapter radapter = new ReadGroupAdapter();
-
- @DataProvider(name = "adapters")
- public Object[][] adapters() {
- return new Object[][]{
- {new ProgramGroupAdapter()},
- {new ReadGroupAdapter()}
- };
- }
-
-
- /** Test for groups with same ID and same attributes */
- @Test(dataProvider = "adapters")
- public void testSameIdsSameAttrs(GroupAdapter adapter) {
- boolean addReadGroup = addReadGroup(adapter);
-
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
- adapter.setAttribute(group0, "Hi Mom!");
- adapter.setBuilderGroup(builder1, group0);
- builder1.addFrag("read1", 20, 28833, addReadGroup);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group1 = adapter.newGroup("0");
- adapter.setAttribute(group1, "Hi Mom!");
- adapter.setBuilderGroup(builder2, group1);
- builder2.addFrag("read2", 19, 28833, addReadGroup);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
- final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
- Assert.assertEquals(outputGroups.size(), 1);
-
- Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
-
- assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "0");
- CloserUtil.close(readers);
- }
-
- /** Test for groups with same ID but different attributes */
- // @Test(dataProvider = "adapters")
- public void testSameIdsDifferentAttrs(GroupAdapter adapter) {
- boolean addReadGroup = addReadGroup(adapter);
-
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
- adapter.setAttribute(group0, "Hi Mom!");
- adapter.setBuilderGroup(builder1, group0);
- builder1.addFrag("read1", 20, 28833, addReadGroup);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group1 = adapter.newGroup("0");
- adapter.setAttribute(group1, "Hi Dad!");
- adapter.setBuilderGroup(builder2, group1);
- builder2.addFrag("read2", 19, 28833, addReadGroup);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
- final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
- Assert.assertEquals(outputGroups.size(), 2);
- Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
- Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
- assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "0.1");
- CloserUtil.close(readers);
- }
-
-
- /** Test for groups with different ID and same attributes */
- // @Test(dataProvider = "adapters")
- public void testDifferentIdsSameAttrs(GroupAdapter adapter) {
- boolean addReadGroup = addReadGroup(adapter);
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
- adapter.setAttribute(group0, "Hi Mom!");
- adapter.setBuilderGroup(builder1, group0);
- builder1.addFrag("read1", 20, 28833, addReadGroup);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group1 = adapter.newGroup("55");
- adapter.setAttribute(group1, "Hi Mom!");
- adapter.setBuilderGroup(builder2, group1);
- builder2.addFrag("read2", 19, 28833, addReadGroup);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
- final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
- Assert.assertEquals(outputGroups.size(), 2);
- Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
- Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
- assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "55");
- CloserUtil.close(readers);
- }
-
-
- /** Test for groups with different ID and different attributes */
- @Test(dataProvider = "adapters")
- public void testDifferentIdsDifferentAttrs(GroupAdapter adapter) {
- boolean addReadGroup = addReadGroup(adapter);
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group0 = adapter.newGroup("0");
- adapter.setAttribute(group0, "Hi Mom!");
- adapter.setBuilderGroup(builder1, group0);
- builder1.addFrag("read1", 20, 28833, addReadGroup);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, addReadGroup);
- final AbstractSAMHeaderRecord group1 = adapter.newGroup("55");
- adapter.setAttribute(group1, "Hi Dad!");
- adapter.setBuilderGroup(builder2, group1);
- builder2.addFrag("read2", 19, 28833, addReadGroup);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
- final List<? extends AbstractSAMHeaderRecord> outputGroups = adapter.getGroups(headerMerger.getMergedHeader());
- Assert.assertEquals(outputGroups.size(), 2);
- Assert.assertTrue(adapter.equivalent(outputGroups.get(0), group0));
- Assert.assertTrue(adapter.equivalent(outputGroups.get(1), group1));
-
- assertRecords(headerMerger, readers, adapter, addReadGroup, "0", "55");
- CloserUtil.close(readers);
- }
-
- @Test(dataProvider = "adapters")
- public void differentIds(GroupAdapter adapter) throws Exception {
- final String[] groupIds = {"group1", "group2"};
- final List<? extends AbstractSAMHeaderRecord> groups = adapter.createGroups(groupIds);
- Assert.assertEquals(groups.size(), 2);
- int i = 0;
- for (final AbstractSAMHeaderRecord g : groups) {
- Assert.assertEquals(groupIds[i], adapter.getGroupId(g));
- i++;
- }
- }
-
- @Test(dataProvider = "adapters")
- public void sameIds(GroupAdapter adapter) throws Exception {
- final String[] groupIds = {"group1", "group1"};
-
- final List<? extends AbstractSAMHeaderRecord> groups = adapter.createGroups(groupIds);
- Assert.assertEquals(groups.size(), 1);
- AbstractSAMHeaderRecord group = groups.get(0);
- Assert.assertEquals(adapter.getGroupId(group), "group1");
- }
-
- /**
- * List of program groups from the input files are merged, and renumbered, and SAMRecords
- * with PG tags get assigned the updated PG ID.
- * Original ProgramRecord-specific test.
- */
- @Test
- public void testMergingProgramGroups() {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- final SAMProgramRecord program1 = new SAMProgramRecord("0");
- program1.setCommandLine("Hi, Mom!");
- builder1.setProgramRecord(program1);
- builder1.addFrag("read1", 20, 28833, false);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- final SAMProgramRecord program2 = new SAMProgramRecord("0");
- program2.setCommandLine("Hi, Dad!");
- program2.setProgramVersion("123");
- builder2.setProgramRecord(program2);
- builder2.addFrag("read2", 19, 28833, false);
- // No PG tag on this record
- builder2.setProgramRecord(null);
- builder2.addFrag("read3", 19, 28833, false);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-
- final List<SAMProgramRecord> outputProgramGroups = headerMerger.getMergedHeader().getProgramRecords();
- Assert.assertEquals(outputProgramGroups.size(), 2);
- Assert.assertTrue(outputProgramGroups.get(0).equivalent(program1));
- Assert.assertTrue(outputProgramGroups.get(1).equivalent(program2));
-
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, false);
- SAMRecord samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
- samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0.1");
- samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), null);
- Assert.assertFalse(iterator.hasNext());
- CloserUtil.close(readers);
- }
-
- private void assertRecords(SamFileHeaderMerger headerMerger, Collection<SamReader> readers,
- GroupAdapter adapter, boolean addReadGroup, String... attrs) {
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, addReadGroup);
- for (int j = 0; j < attrs.length; j++) {
- SAMRecord samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(adapter.getTagName()), attrs[j]);
- }
- Assert.assertFalse(iterator.hasNext());
- }
-
- private boolean addReadGroup(GroupAdapter adapter) {
- return adapter instanceof ProgramGroupAdapter;
- }
-
- /**
- * List of program groups from the input files are merged, and renumbered, and SAMRecords
- * with PG tags get assigned the updated PG ID.
- * Original ProgramRecord-specific test.
- */
- @Test
- public void testMergingProgramGroupsWithThreeReaders() {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- final SAMProgramRecord program1 = new SAMProgramRecord("0");
- program1.setCommandLine("Hi, Mom!");
- program1.setProgramVersion("123");
- builder1.setProgramRecord(program1);
- builder1.addFrag("read1", 20, 28833, false);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- final SAMProgramRecord program2 = new SAMProgramRecord("0");
- program2.setCommandLine("Hi, Mom!");
- program2.setProgramVersion("123");
- builder2.setProgramRecord(program2);
- builder2.addFrag("read2", 19, 28833, false);
-
-
- final SAMRecordSetBuilder builder3 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- final SAMProgramRecord program3 = new SAMProgramRecord("0");
- program3.setCommandLine("Hi, Dad!");
- builder3.setProgramRecord(program3);
- builder3.addFrag("read3", 19, 28833, false);
-
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
- readers.add(builder3.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
- headers.add(readers.get(2).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
- final List<SAMProgramRecord> outputProgramGroups = headerMerger.getMergedHeader().getProgramRecords();
- Assert.assertEquals(outputProgramGroups.size(), 2);
- Assert.assertTrue(outputProgramGroups.get(0).equivalent(program1));
- Assert.assertTrue(outputProgramGroups.get(1).equivalent(program3));
-
-
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(headerMerger, readers, false);
- SAMRecord samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
- samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0");
- samRecord = iterator.next();
- Assert.assertEquals(samRecord.getAttribute(SAMTag.PG.name()), "0.1");
- Assert.assertFalse(iterator.hasNext());
- CloserUtil.close(readers);
- }
-
- /**
- * List of program groups from the input files are merged, and renumbered, and SAMRecords
- * with PG tags get assigned the updated PG ID.
- * Original ProgramRecord-specific test.
- */
- @Test
- public void testMergingMultipleReadGroups() {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, false);
- builder1.setReadGroup(createSAMReadGroupRecord("a0"));
- builder1.setReadGroup(createSAMReadGroupRecord("a1"));
- builder1.setReadGroup(createSAMReadGroupRecord("a2"));
- builder1.addFrag("read1", 20, 28833, false);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname, false);
- builder2.setReadGroup(createSAMReadGroupRecord("0"));
- builder2.setReadGroup(createSAMReadGroupRecord("a1")); //collision 1
- builder2.setReadGroup(createSAMReadGroupRecord("a2")); //collision 2
- builder2.setReadGroup(createSAMReadGroupRecord("a1.1")); //doesn't collide
- builder2.setReadGroup(createSAMReadGroupRecord("a2.1")); //doesn't collide
- builder2.setReadGroup(createSAMReadGroupRecord("a2.4.9")); //doesn't collide
- builder2.setReadGroup(createSAMReadGroupRecord("a2.4")); //collision
- builder2.addFrag("read1", 20, 28833, false);
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- readers.add(builder1.getSamReader());
- readers.add(builder2.getSamReader());
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- headers.add(readers.get(0).getFileHeader());
- headers.add(readers.get(1).getFileHeader());
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headers, false);
-
- final List<? extends AbstractSAMHeaderRecord> outputGroups = headerMerger.getMergedHeader().getReadGroups();
- // "0, a0, a1, a1.1, a1.3, a2, a2.1, a2.6
- //the merged read groups are sorted in order
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(0)).getReadGroupId(), "0"); //0
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(1)).getReadGroupId(), "a0"); //1
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(2)).getReadGroupId(), "a1"); //2
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(3)).getReadGroupId(), "a1.1"); //3
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(4)).getReadGroupId(), "a1.2"); //4
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(5)).getReadGroupId(), "a2"); //5
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(6)).getReadGroupId(), "a2.1");
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(7)).getReadGroupId(), "a2.4");
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(8)).getReadGroupId(), "a2.4.9");
- Assert.assertEquals(((SAMReadGroupRecord) outputGroups.get(9)).getReadGroupId(), "a2.4.A");
- Assert.assertEquals(outputGroups.size(), 10);
- CloserUtil.close(readers);
- }
-
- private SAMReadGroupRecord createSAMReadGroupRecord(String id) {
- SAMReadGroupRecord readGroupRecord = new SAMReadGroupRecord(id);
- readGroupRecord.setAttribute(SAMTag.SM.name(), Double.toString(Math.random()));
- return readGroupRecord;
- }
-
- /** Captures commonality between ProgramRecord and ReadGroup for having one set of tests */
- abstract class GroupAdapter {
-
- /** Gets the group's group ID */
- abstract String getGroupId(AbstractSAMHeaderRecord group);
-
- /** Gets the groups from header */
- abstract List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header);
-
- /** Gets the group's 'name' tag */
- abstract String getTagName();
-
- /** Creates groups for specified IDs */
- abstract List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds);
-
- /** Sets a group-specific attribute - for CL for ProgramRecord CL, for PU for ReadGroup */
- abstract void setAttribute(AbstractSAMHeaderRecord group, String value);
-
- /** Creates a new group */
- abstract AbstractSAMHeaderRecord newGroup(String groupId);
-
- /** Sets the group for the builder */
- abstract void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group);
-
- /** Attributes equivalent */
- abstract boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2);
-
- SamReader newFileReader() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- builder.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
- return builder.getSamReader();
- }
- }
-
- class ProgramGroupAdapter extends GroupAdapter {
- String getGroupId(AbstractSAMHeaderRecord group) {
- return ((SAMProgramRecord) group).getProgramGroupId();
- }
-
- List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header) {
- return header.getProgramRecords();
- }
-
- String getTagName() {
- return SAMTag.PG.toString();
- }
-
- List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds) {
- final List<SamReader> readers = new ArrayList<SamReader>();
- for (final String groupId : groupIds) {
- final SamReader samReader = newFileReader();
- final List<SAMProgramRecord> records = new ArrayList<SAMProgramRecord>();
- final SAMProgramRecord record = new SAMProgramRecord(groupId);
- records.add(record);
- samReader.getFileHeader().setProgramRecords(records);
- readers.add(samReader);
- }
-
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- for (final SamReader reader : readers) {
- headers.add(reader.getFileHeader());
- }
- CloserUtil.close(readers);
-
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, false);
- return fileHeaderMerger.getMergedHeader().getProgramRecords();
- }
-
- void setAttribute(AbstractSAMHeaderRecord group, String value) {
- ((SAMProgramRecord) group).setCommandLine(value);
- }
-
- AbstractSAMHeaderRecord newGroup(String id) {
- return new SAMProgramRecord(id);
- }
-
- void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group) {
- builder.setProgramRecord((SAMProgramRecord) group);
- }
-
- boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2) {
- return ((SAMProgramRecord) group1).equivalent((SAMProgramRecord) group2);
- }
- }
-
- class ReadGroupAdapter extends GroupAdapter {
- String getGroupId(AbstractSAMHeaderRecord group) {
- return ((SAMReadGroupRecord) group).getReadGroupId();
- }
-
- List<? extends AbstractSAMHeaderRecord> getGroups(SAMFileHeader header) {
- return header.getReadGroups();
- }
-
- String getTagName() {
- return SAMTag.RG.toString();
- }
-
- List<? extends AbstractSAMHeaderRecord> createGroups(final String[] groupIds) {
- final List<SamReader> readers = new ArrayList<SamReader>();
-
- for (final String groupId : groupIds) {
- final SamReader samReader = newFileReader();
- final List<SAMReadGroupRecord> records = new ArrayList<SAMReadGroupRecord>();
- final SAMReadGroupRecord record = new SAMReadGroupRecord(groupId);
- records.add(record);
- samReader.getFileHeader().setReadGroups(records);
- readers.add(samReader);
- }
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- for (final SamReader reader : readers) {
- headers.add(reader.getFileHeader());
- }
- CloserUtil.close(readers);
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, false);
- return fileHeaderMerger.getMergedHeader().getReadGroups();
- }
-
- void setAttribute(AbstractSAMHeaderRecord group, String value) {
- ((SAMReadGroupRecord) group).setPlatformUnit(value);
- }
-
- AbstractSAMHeaderRecord newGroup(String id) {
- SAMReadGroupRecord group = new SAMReadGroupRecord(id);
- group.setAttribute(SAMTag.SM.name(), id);
- return group;
- }
-
- void setBuilderGroup(SAMRecordSetBuilder builder, AbstractSAMHeaderRecord group) {
- builder.setReadGroup((SAMReadGroupRecord) group);
- }
-
- boolean equivalent(AbstractSAMHeaderRecord group1, AbstractSAMHeaderRecord group2) {
- return ((SAMReadGroupRecord) group1).equivalent((SAMReadGroupRecord) group2);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java b/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java
deleted file mode 100644
index 885321b..0000000
--- a/src/test/java/htsjdk/samtools/MergingSamRecordIteratorTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Tests for MultiIterator
- *
- * @author Dave Tefft
- */
-public class MergingSamRecordIteratorTest {
-
- @Test
- public void testVanillaCoordinateMultiIterator() throws Exception {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
- builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
- builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
- final SamReader samReader = builder1.getSamReader();
- samReader.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
- builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
- builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
- builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
- final SamReader samReader2 = builder2.getSamReader();
- samReader2.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
-
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader);
- readerList.add(samReader2);
-
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader.getFileHeader());
- headerList.add(samReader2.getFileHeader());
-
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
- int i = 0;
-
- // This is the correct order for start bases. The first two are on chr20, the next three on chr22
- final int[] startBasesInOrder = {28833, 30000, 28834, 28835, 28835};
-
- while (iterator.hasNext()) {
- final SAMRecord rec = iterator.next();
- System.out.println(rec.getSAMString());
- Assert.assertEquals(rec.getAlignmentStart(), startBasesInOrder[i]);
- i++;
- }
- samReader.close();
- samReader2.close();
- }
-
- @Test
- public void testVanillaReadOrderMultiIterator() throws Exception {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- builder1.addFrag("a", 20, 28833, false); // ok
- builder1.addFrag("e", 19, 28834, false); // ok
-
- final SamReader samReader = builder1.getSamReader();
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.queryname);
- builder2.addFrag("b", 20, 30000, false); // ok
- builder2.addFrag("c", 22, 28835, false); // ok
- builder2.addFrag("d", 20, 28835, false); // ok
-
- final SamReader samReader2 = builder2.getSamReader();
-
-
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader);
- readerList.add(samReader2);
-
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader.getFileHeader());
- headerList.add(samReader2.getFileHeader());
-
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.queryname, headerList, false);
-
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
- int i = 0;
-
- // This is the correct order for start bases. The first two are on chr20, the next three on chr22
- final String[] orderedReadNames = {"a", "b", "c", "d", "e"};
-
- while (iterator.hasNext()) {
- final SAMRecord rec = iterator.next();
- System.out.println(rec.getReadName());
- Assert.assertEquals(rec.getReadName(), orderedReadNames[i]);
- i++;
- }
- samReader.close();
- samReader2.close();
- }
-
- @Test
- public void testVanillaUnsortedMultiIterator() throws Exception {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- builder1.addFrag("b", 20, 28833, false); // ok
- builder1.addFrag("a", 19, 28834, false); // ok
-
- final SamReader samReader = builder1.getSamReader();
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- builder2.addFrag("d", 20, 30000, false); // ok
- builder2.addFrag("e", 22, 28835, false); // ok
- builder2.addFrag("c", 20, 28835, false); // ok
-
- final SamReader samReader2 = builder2.getSamReader();
-
-
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader);
- readerList.add(samReader2);
-
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader.getFileHeader());
- headerList.add(samReader2.getFileHeader());
-
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headerList, false);
-
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
-
-
- int i = 0;
-
- // With unsorted option there is no garantee that order of the names to come back from the iterator
- final String[] readNames = {"b", "a", "d", "e", "c"};
-
- while (iterator.hasNext()) {
- final SAMRecord rec = iterator.next();
- System.out.println(rec.getReadName());
- i++;
- }
- Assert.assertEquals(i, readNames.length);
- samReader.close();
- samReader2.close();
- }
-
- @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
- public void testConflictingHeaders() throws Exception {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
- builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
- builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
- final SamReader samReader = builder1.getSamReader();
- samReader.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
- builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
- builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
- builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
- final SamReader samReader2 = builder2.getSamReader();
- samReader2.getFileHeader().setSortOrder(SAMFileHeader.SortOrder.coordinate);
-
- //Change one of the header so they are no longer compatible
- final SAMSequenceRecord sRec = new SAMSequenceRecord("BADSEQ", 0);
- samReader2.getFileHeader().addSequence(sRec);
-
-
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader);
- readerList.add(samReader2);
-
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader.getFileHeader());
- headerList.add(samReader2.getFileHeader());
-
- final SamFileHeaderMerger samFileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
- new MergingSamRecordIterator(samFileHeaderMerger, readerList, false);
- Assert.fail("This method should throw exception before getting to this point");
- }
-
-
- @Test(expectedExceptions = SAMException.class)
- public void filesNotSortedCorrectly() throws Exception {
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
- builder1.addFrag("read_28833_29006_6945", 20, 28833, false); // ok
- builder1.addFrag("read_28701_28881_323b", 22, 28834, false); // ok
-
- final SamReader samReader = builder1.getSamReader();
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
-
- final SamReader samReader2 = builder2.getSamReader();
-
- builder2.addFrag("read_28701_28881_323b", 22, 28835, false); // ok
- builder2.addFrag("read_28833_29006_6945", 20, 30000, false); // ok
- builder2.addFrag("read_28701_28881_323c", 22, 28835, false); // ok
-
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader);
- readerList.add(samReader2);
-
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader.getFileHeader());
- headerList.add(samReader2.getFileHeader());
-
- final SamFileHeaderMerger fileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, false);
-
- new MergingSamRecordIterator(fileHeaderMerger, readerList, false);
- Assert.fail("This method should throw exception before getting to this point");
- }
-
- @Test
- public void testHeaderCommentMerge() throws Exception {
- final String[] comments1 = {"@CO\tHi, Mom!", "@CO\tHi, Dad!"};
- final String[] comments2 = {"@CO\tHello, World!", "@CO\tGoodbye, Cruel World!"};
- final Set<String> bothComments = new HashSet<String>();
- bothComments.addAll(Arrays.asList(comments1));
- bothComments.addAll(Arrays.asList(comments2));
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
- SAMFileHeader header = builder1.getHeader();
- for (final String comment : comments1) {
- header.addComment(comment);
- }
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.coordinate);
- header = builder2.getHeader();
- for (final String comment : comments2) {
- header.addComment(comment);
- }
- final SamFileHeaderMerger merger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate,
- Arrays.asList(builder1.getSamReader().getFileHeader(), builder2.getSamReader().getFileHeader()), false);
- final List<String> mergedComments = merger.getMergedHeader().getComments();
- Assert.assertEquals(mergedComments.size(), bothComments.size());
- for (final String comment : mergedComments) {
- Assert.assertTrue(bothComments.contains(comment));
- }
- builder1.getSamReader().close();
- builder2.getSamReader().close();
- }
-
- @Test
- public void testReferenceIndexMapping() throws Exception {
- // Create two SamReaders with sequence dictionaries such that a merging iterator with merged
- // headers will require remapping a record's reference index to the merged dictionary
- final SAMRecordSetBuilder builder1 = new SAMRecordSetBuilder();
- SAMSequenceRecord fakeSequenceRec = new SAMSequenceRecord("FAKE_CONTIG_A", 0);
- builder1.getHeader().addSequence(fakeSequenceRec);
-
- final SAMRecordSetBuilder builder2 = new SAMRecordSetBuilder();
- fakeSequenceRec = new SAMSequenceRecord("FAKE_CONTIG_B", 0);
- builder2.getHeader().addSequence(fakeSequenceRec);
-
- // create a record with a reference index that will need to be remapped after merging
- SAMRecord recRequiresMapping = new SAMRecord(builder2.getHeader());
- recRequiresMapping.setReadName("fakeread");
- recRequiresMapping.setReferenceName("FAKE_CONTIG_B");
- builder2.addRecord(recRequiresMapping);
- // cache the original reference index
- int originalRefIndex = recRequiresMapping.getReferenceIndex();
- Assert.assertTrue(25 == originalRefIndex);
-
- // get a merging iterator with a merged header
- final SamReader samReader1 = builder1.getSamReader();
- final SamReader samReader2 = builder2.getSamReader();
- final List<SamReader> readerList = new ArrayList<SamReader>();
- readerList.add(samReader1);
- readerList.add(samReader2);
- final List<SAMFileHeader> headerList = new ArrayList<SAMFileHeader>();
- headerList.add(samReader1.getFileHeader());
- headerList.add(samReader2.getFileHeader());
- final SamFileHeaderMerger samFileHeaderMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headerList, true);
- final MergingSamRecordIterator iterator = new MergingSamRecordIterator(samFileHeaderMerger, readerList, false);
-
- Assert.assertTrue(iterator.hasNext());
- final SAMRecord rec = iterator.next();
- Assert.assertTrue(26 == rec.getReferenceIndex());
-
- samReader1.close();
- samReader2.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java b/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java
deleted file mode 100644
index cd470c4..0000000
--- a/src/test/java/htsjdk/samtools/ProgramRecordChainingTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Test for SequenceUtil.chainProgramRecord
- */
-public class ProgramRecordChainingTest {
-
- @Test
- public void testChainProgramRecord() {
- SAMFileHeader header = new SAMFileHeader();
- SAMProgramRecord first = header.createProgramRecord();
- SAMUtils.chainSAMProgramRecord(header, first);
- Assert.assertEquals(header.getProgramRecords().size(), 1);
- Assert.assertNull(first.getPreviousProgramGroupId());
-
- SAMProgramRecord second = header.createProgramRecord();
- SAMUtils.chainSAMProgramRecord(header, second);
- Assert.assertEquals(header.getProgramRecords().size(), 2);
- Assert.assertNull(first.getPreviousProgramGroupId());
- Assert.assertEquals(second.getPreviousProgramGroupId(), first.getProgramGroupId());
-
- SAMProgramRecord third = new SAMProgramRecord("3");
- SAMUtils.chainSAMProgramRecord(header, third);
- header.addProgramRecord(third);
- Assert.assertEquals(header.getProgramRecords().size(), 3);
- Assert.assertNull(first.getPreviousProgramGroupId());
- Assert.assertEquals(second.getPreviousProgramGroupId(), first.getProgramGroupId());
- Assert.assertEquals(third.getPreviousProgramGroupId(), second.getProgramGroupId());
-
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java b/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java
deleted file mode 100644
index f5f7a5c..0000000
--- a/src/test/java/htsjdk/samtools/SAMBinaryTagAndValueUnitTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SAMBinaryTagAndValueUnitTest {
-
- @DataProvider(name="allowedAttributeTypes")
- public Object[][] allowedTypes() {
- return new Object[][] {
- {new String("a string")},
- {new Byte((byte) 7)},
- {new Short((short) 8)},
- {new Integer(0)},
- {new Character('C')},
- {new Float(0.1F)},
- // unsigned longs
- {new Long(0)},
- {new Long(BinaryCodec.MAX_UINT)},
- // signed longs
- {new Long(-1L)},
- {new Long(Integer.MAX_VALUE)},
- {new Long(Integer.MIN_VALUE)},
- // array values
- {new byte[]{0, 1, 2}},
- {new short[]{3, 4, 5}},
- {new int[]{6, 7, 8}},
- {new float[]{0.1F, 0.2F}},
- };
- }
-
- @Test(dataProvider="allowedAttributeTypes")
- public void test_isAllowedAttribute(final Object value) {
- Assert.assertTrue(SAMBinaryTagAndValue.isAllowedAttributeValue(value));
- }
-
- @Test(dataProvider="allowedAttributeTypes")
- public void test_isAllowedConstructor(final Object value) {
- Assert.assertNotNull(new SAMBinaryTagAndValue(SAMTagUtil.getSingleton().makeBinaryTag("UI"), value));
- }
-
- @DataProvider(name="notAllowedAttributeTypes")
- public Object[][] notAllowedTypes() {
- return new Object[][] {
- {new Long(BinaryCodec.MAX_UINT + 1L)},
- {new Long(Integer.MIN_VALUE - 1L)},
- {new Double(0.3F)},
- {new Object()},
- {new Object[]{}},
- {new Integer[]{}}
- };
- }
-
- @Test(dataProvider="notAllowedAttributeTypes")
- public void test_isNotAllowedAttribute(final Object value) {
- Assert.assertFalse(SAMBinaryTagAndValue.isAllowedAttributeValue(value));
- }
-
- @Test(dataProvider="notAllowedAttributeTypes", expectedExceptions=IllegalArgumentException.class)
- public void test_isNotAllowedConstructor(final Object value) {
- new SAMBinaryTagAndValue(SAMTagUtil.getSingleton().makeBinaryTag("ZZ"), value);
- }
-
- @DataProvider(name="allowedUnsignedArrayTypes")
- public Object[][] allowedUnsignedArrayTypes() {
- return new Object[][] {
- {new byte[]{0, 1, 2}},
- {new short[]{3, 4, 5}},
- {new int[]{6, 7, 8}},
- };
- }
-
- @Test(dataProvider="allowedUnsignedArrayTypes")
- public void test_isAllowedUnsignedArrayAttribute(final Object value) {
- final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
- Assert.assertNotNull(new SAMBinaryTagAndUnsignedArrayValue(binaryTag, value));
- }
-
- @DataProvider(name="notAllowedUnsignedArrayTypes")
- public Object[][] notAllowedUnsignedArrayTypes() {
- return new Object[][] {
- {new float[]{0.1F, 0.2F}},
- {new Object[]{}}
- };
- }
-
- @Test(dataProvider="notAllowedUnsignedArrayTypes", expectedExceptions=IllegalArgumentException.class)
- public void test_isNotAllowedUnsignedArrayAttribute(final Object value) {
- final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
- new SAMBinaryTagAndUnsignedArrayValue(binaryTag, value);
- }
-
- @DataProvider(name="hashCopyEquals")
- public Object[][] hashCopyEquals() {
- final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
- return new Object[][] {
- {new SAMBinaryTagAndValue(tag, new String("a string")), new SAMBinaryTagAndValue(tag, new String("a string")), true, true},
- {new SAMBinaryTagAndValue(tag, new String("a string")), new SAMBinaryTagAndValue(tag, new String("different string")), false, false},
-
- {new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), true, true},
- {new SAMBinaryTagAndValue(tag, new Byte((byte) 0)), new SAMBinaryTagAndValue(tag, new Byte((byte) 1)), false, false},
-
- {new SAMBinaryTagAndValue(tag, new Short((short) 0)), new SAMBinaryTagAndValue(tag, new Short((short) 0)), true, true},
- {new SAMBinaryTagAndValue(tag, new Short((short) 0)), new SAMBinaryTagAndValue(tag, new Short((short) 1)), false, false},
-
- {new SAMBinaryTagAndValue(tag, new Integer(0)), new SAMBinaryTagAndValue(tag, new Integer(0)), true, true},
- {new SAMBinaryTagAndValue(tag, new Integer(0)), new SAMBinaryTagAndValue(tag, new Integer(0)), true, true},
-
- {new SAMBinaryTagAndValue(tag, new Character('C')), new SAMBinaryTagAndValue(tag, new Character('C')), true, true},
- {new SAMBinaryTagAndValue(tag, new Character('C')), new SAMBinaryTagAndValue(tag, new Character('D')), false, false},
-
- {new SAMBinaryTagAndValue(tag,new Float(0.1F)), new SAMBinaryTagAndValue(tag, new Float(0.1F)), true, true},
- {new SAMBinaryTagAndValue(tag, new Float(0.1F)), new SAMBinaryTagAndValue(tag, new Float(0.2F)), false, false},
-
- {new SAMBinaryTagAndValue(tag,new Long(37L)), new SAMBinaryTagAndValue(tag, new Long(37L)), true, true},
- {new SAMBinaryTagAndValue(tag, new Long(37L)), new SAMBinaryTagAndValue(tag, new Long(38L)), false, false},
-
- {new SAMBinaryTagAndValue(tag,new Long(BinaryCodec.MAX_UINT)), new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT)), true, true},
- {new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT)), new SAMBinaryTagAndValue(tag, new Long(BinaryCodec.MAX_UINT-1)), false, false},
-
- // arrays
-
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), true, true},
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new byte[]{3, 4, 5}), false, false},
-
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), true, true},
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{3, 4, 5}), false, false},
-
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), true, true},
- {new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new int[]{3, 4, 5}), false, false},
-
- // mix signed array and unsigned array; hashCodes are equal but objects are not
- {new SAMBinaryTagAndValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{0, 1, 2}), true, false},
-
- // mix signed array and unsigned array; hashCodes and objects are not equal
- {new SAMBinaryTagAndValue(tag, new short[]{0, 1, 2}), new SAMBinaryTagAndUnsignedArrayValue(tag, new short[]{1, 1, 3}), false, false},
- };
- }
-
- @Test(dataProvider="hashCopyEquals")
- public void testHashAndEquals(
- final SAMBinaryTagAndValue v1,
- final SAMBinaryTagAndValue v2,
- final boolean hashEquals,
- final boolean isEquals)
- {
- Assert.assertEquals(hashEquals, v1.hashCode() == v2.hashCode());
-
- Assert.assertEquals(isEquals, v1.equals(v2));
- Assert.assertEquals(isEquals, v2.equals(v1));
- }
-
- @Test(dataProvider="hashCopyEquals")
- public void testCopy(
- final SAMBinaryTagAndValue v1,
- final SAMBinaryTagAndValue v2,
- final boolean unused_hashEquals,
- final boolean isEquals)
- {
- Assert.assertTrue(v1.equals(v1.copy()));
- Assert.assertTrue(v2.equals(v2.copy()));
-
- Assert.assertEquals(isEquals, v1.equals(v2.copy()));
- Assert.assertEquals(isEquals, v2.equals(v1.copy()));
- }
-
- @Test(dataProvider="hashCopyEquals")
- public void testDeepCopy(
- final SAMBinaryTagAndValue v1,
- final SAMBinaryTagAndValue v2,
- final boolean unused_hashEquals,
- final boolean isEquals)
- {
- Assert.assertTrue(v1.equals(v1.deepCopy()));
- Assert.assertTrue(v2.equals(v2.deepCopy()));
-
- Assert.assertEquals(isEquals, v1.equals(v2.deepCopy()));
- Assert.assertEquals(isEquals, v2.equals(v1.deepCopy()));
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SAMCloneTest.java b/src/test/java/htsjdk/samtools/SAMCloneTest.java
deleted file mode 100644
index 8fdfb3b..0000000
--- a/src/test/java/htsjdk/samtools/SAMCloneTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SAMCloneTest {
- private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
- final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
- ret.addPair("readB", 20, 200, 300);
- ret.addPair("readA", 20, 100, 150);
- ret.addFrag("readC", 20, 140, true);
- ret.addFrag("readD", 20, 140, false);
- return ret;
- }
-
- @Test
- public void testBasic() throws Exception {
- final SAMRecordSetBuilder recordSetBuilder = getSAMReader(true, SAMFileHeader.SortOrder.coordinate);
- SamReader inputSAM = recordSetBuilder.getSamReader();
- for (final SAMRecord samRecord : inputSAM) {
- SAMRecord newRecord = (SAMRecord) samRecord.clone();
- Assert.assertEquals(newRecord, samRecord);
- }
- inputSAM.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java b/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java
deleted file mode 100644
index dc7a6f3..0000000
--- a/src/test/java/htsjdk/samtools/SAMFileWriterFactoryTest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-
-public class SAMFileWriterFactoryTest {
-
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- /** PIC-442Confirm that writing to a special file does not cause exception when writing additional files. */
- @Test(groups={"unix"})
- public void specialFileWriterTest() {
- createSmallBam(new File("/dev/null"));
- }
-
- @Test()
- public void ordinaryFileWriterTest() throws Exception {
- final File outputFile = File.createTempFile("tmp.", BamFileIoUtils.BAM_FILE_EXTENSION);
- outputFile.delete();
- outputFile.deleteOnExit();
- createSmallBam(outputFile);
- final File indexFile = SamFiles.findIndex(outputFile);
- indexFile.deleteOnExit();
- final File md5File = new File(outputFile.getParent(), outputFile.getName() + ".md5");
- md5File.deleteOnExit();
- Assert.assertTrue(outputFile.length() > 0);
- Assert.assertTrue(indexFile.length() > 0);
- Assert.assertTrue(md5File.length() > 0);
- }
-
- @Test(description="create a BAM in memory, should start with GZipInputStream.GZIP_MAGIC")
- public void inMemoryBam() throws Exception {
- ByteArrayOutputStream os=new ByteArrayOutputStream();
- createSmallBamToOutputStream(os,true);
- os.flush();
- os.close();
- byte blob[]=os.toByteArray();
- Assert.assertTrue(blob.length > 2);
- int head = ((int) blob[0] & 0xff) | ((blob[1] << 8 ) & 0xff00 );
- Assert.assertTrue(java.util.zip.GZIPInputStream.GZIP_MAGIC == head);
- }
-
- @Test(description="create a SAM in memory, should start with '@HD'")
- public void inMemorySam() throws Exception {
- ByteArrayOutputStream os=new ByteArrayOutputStream();
- createSmallBamToOutputStream(os,false);
- os.flush();
- os.close();
- String sam=new String(os.toByteArray());
- Assert.assertFalse(sam.isEmpty());
- Assert.assertTrue(sam.startsWith("@HD\t"),"SAM: bad prefix");
- }
-
- @Test(description="Read and then write SAM to verify header attribute ordering does not change depending on JVM version")
- public void samRoundTrip() throws Exception {
- final File input = new File(TEST_DATA_DIR, "roundtrip.sam");
-
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- final File outputFile = File.createTempFile("roundtrip-out", ".sam");
- outputFile.delete();
- outputFile.deleteOnExit();
- FileOutputStream os = new FileOutputStream(outputFile);
- final SAMFileWriterFactory factory = new SAMFileWriterFactory();
- final SAMFileWriter writer = factory.makeSAMWriter(reader.getFileHeader(), false, os);
- for (SAMRecord rec : reader) {
- writer.addAlignment(rec);
- }
- writer.close();
- os.close();
-
- InputStream is = new FileInputStream(input);
- String originalsam = IOUtil.readFully(is);
- is.close();
-
- is = new FileInputStream(outputFile);
- String writtensam = IOUtil.readFully(is);
- is.close();
-
- Assert.assertEquals(writtensam, originalsam);
- }
-
- @Test(description="Write SAM records with null SAMFileHeader")
- public void samNullHeaderRoundTrip() throws Exception {
- final File input = new File(TEST_DATA_DIR, "roundtrip.sam");
-
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- final File outputFile = File.createTempFile("nullheader-out", ".sam");
- outputFile.delete();
- outputFile.deleteOnExit();
- FileOutputStream os = new FileOutputStream(outputFile);
- final SAMFileWriterFactory factory = new SAMFileWriterFactory();
- final SAMFileWriter writer = factory.makeSAMWriter(reader.getFileHeader(), false, os);
- for (SAMRecord rec : reader) {
- rec.setHeader(null);
- writer.addAlignment(rec);
- }
- writer.close();
- os.close();
-
- InputStream is = new FileInputStream(input);
- String originalsam = IOUtil.readFully(is);
- is.close();
-
- is = new FileInputStream(outputFile);
- String writtensam = IOUtil.readFully(is);
- is.close();
-
- Assert.assertEquals(writtensam, originalsam);
- }
-
- private void createSmallBam(final File outputFile) {
- final SAMFileWriterFactory factory = new SAMFileWriterFactory();
- factory.setCreateIndex(true);
- factory.setCreateMd5File(true);
- final SAMFileHeader header = new SAMFileHeader();
- // index only created if coordinate sorted
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- header.addSequence(new SAMSequenceRecord("chr1", 123));
- final SAMFileWriter writer = factory.makeBAMWriter(header, false, outputFile);
- fillSmallBam(writer);
- writer.close();
- }
-
-
- private void createSmallBamToOutputStream(final OutputStream outputStream,boolean binary) {
- final SAMFileWriterFactory factory = new SAMFileWriterFactory();
- factory.setCreateIndex(false);
- factory.setCreateMd5File(false);
- final SAMFileHeader header = new SAMFileHeader();
- // index only created if coordinate sorted
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- header.addSequence(new SAMSequenceRecord("chr1", 123));
- final SAMFileWriter writer = (binary?
- factory.makeBAMWriter(header, false, outputStream):
- factory.makeSAMWriter(header, false, outputStream)
- );
- fillSmallBam(writer);
- writer.close();
- }
-
- private int fillSmallBam(SAMFileWriter writer) {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- builder.addUnmappedFragment("HiMom!");
- int numRecs = builder.getRecords().size();
- for (final SAMRecord rec: builder.getRecords()) {
- writer.addAlignment(rec);
- }
- return numRecs;
- }
-
- private File prepareOutputFile(String extension) throws IOException {
- final File outputFile = File.createTempFile("tmp.", extension);
- outputFile.delete();
- outputFile.deleteOnExit();
- return outputFile;
- }
-
- // Create a writer factory that creates and index and md5 file and set the header to coord sorted
- private SAMFileWriterFactory createWriterFactoryWithOptions(SAMFileHeader header) {
- final SAMFileWriterFactory factory = new SAMFileWriterFactory();
- factory.setCreateIndex(true);
- factory.setCreateMd5File(true);
- // index only created if coordinate sorted
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- header.addSequence(new SAMSequenceRecord("chr1", 123));
- header.addReadGroup(new SAMReadGroupRecord("1"));
- return factory;
- }
-
- private void verifyWriterOutput(File outputFile, ReferenceSource refSource, int nRecs, boolean verifySupplementalFiles) {
- if (verifySupplementalFiles) {
- final File indexFile = SamFiles.findIndex(outputFile);
- indexFile.deleteOnExit();
- final File md5File = new File(outputFile.getParent(), outputFile.getName() + ".md5");
- md5File.deleteOnExit();
- Assert.assertTrue(indexFile.length() > 0);
- Assert.assertTrue(md5File.length() > 0);
- }
-
- SamReaderFactory factory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.LENIENT);
- if (refSource != null) {
- factory.referenceSource(refSource);
- }
- SamReader reader = factory.open(outputFile);
- SAMRecordIterator it = reader.iterator();
- int count = 0;
- for (; it.hasNext(); it.next()) {
- count++;
- }
-
- Assert.assertTrue(count == nRecs);
- }
-
- @DataProvider(name="bamOrCramWriter")
- public Object[][] bamOrCramWriter() {
- return new Object[][] {
- { BamFileIoUtils.BAM_FILE_EXTENSION, },
- { CramIO.CRAM_FILE_EXTENSION }
- };
- }
-
- @Test(dataProvider="bamOrCramWriter")
- public void testMakeWriter(String extension) throws Exception {
- final File outputFile = prepareOutputFile(extension);
- final SAMFileHeader header = new SAMFileHeader();
- final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
- final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
- final SAMFileWriter samWriter = factory.makeWriter(header, false, outputFile, referenceFile);
- int nRecs = fillSmallBam(samWriter);
- samWriter.close();
-
- verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
- }
-
- @Test
- public void testMakeCRAMWriterWithOptions() throws Exception {
- final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
- final SAMFileHeader header = new SAMFileHeader();
- final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
- final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
- final SAMFileWriter samWriter = factory.makeCRAMWriter(header, false, outputFile, referenceFile);
- int nRecs = fillSmallBam(samWriter);
- samWriter.close();
-
- verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
- }
-
- @Test
- public void testMakeCRAMWriterIgnoresOptions() throws Exception {
- final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
- final SAMFileHeader header = new SAMFileHeader();
- final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
- final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
- // Note: does not honor factory settings for CREATE_MD5 or CREATE_INDEX.
- final SAMFileWriter samWriter = factory.makeCRAMWriter(header, new FileOutputStream(outputFile), referenceFile);
- int nRecs = fillSmallBam(samWriter);
- samWriter.close();
-
- verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, false);
- }
-
- @Test
- public void testMakeCRAMWriterPresortedDefault() throws Exception {
- final File outputFile = prepareOutputFile(CramIO.CRAM_FILE_EXTENSION);
- final SAMFileHeader header = new SAMFileHeader();
- final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
- final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
- // Defaults to preSorted==true
- final SAMFileWriter samWriter = factory.makeCRAMWriter(header, outputFile, referenceFile);
- int nRecs = fillSmallBam(samWriter);
- samWriter.close();
-
- verifyWriterOutput(outputFile, new ReferenceSource(referenceFile), nRecs, true);
- }
-
- @Test
- public void testAsync() throws IOException {
- final SAMFileWriterFactory builder = new SAMFileWriterFactory();
-
- final File outputFile = prepareOutputFile(BamFileIoUtils.BAM_FILE_EXTENSION);
- final SAMFileHeader header = new SAMFileHeader();
- final SAMFileWriterFactory factory = createWriterFactoryWithOptions(header);
- final File referenceFile = new File(TEST_DATA_DIR, "hg19mini.fasta");
-
- SAMFileWriter writer = builder.makeWriter(header, false, outputFile, referenceFile);
- Assert.assertEquals(writer instanceof AsyncSAMFileWriter, Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS, "testAsync default");
-
- writer = builder.setUseAsyncIo(true).makeWriter(header, false, outputFile, referenceFile);
- Assert.assertTrue(writer instanceof AsyncSAMFileWriter, "testAsync option=set");
-
- writer = builder.setUseAsyncIo(false).makeWriter(header, false, outputFile, referenceFile);
- Assert.assertFalse(writer instanceof AsyncSAMFileWriter, "testAsync option=unset");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMFlagTest.java b/src/test/java/htsjdk/samtools/SAMFlagTest.java
deleted file mode 100644
index 7b5a553..0000000
--- a/src/test/java/htsjdk/samtools/SAMFlagTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * The MIT License
- *
- * Author: Pierre Lindenbaum PhD @yokofakun
- * Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class SAMFlagTest {
- @Test
- public void testFlags() {
- Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.READ_PAIRED));
- Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.PROPER_PAIR));
- Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.READ_REVERSE_STRAND));
- Assert.assertTrue(SAMFlag.getFlags(83).contains(SAMFlag.FIRST_OF_PAIR));
- Assert.assertFalse(SAMFlag.getFlags(83).contains(SAMFlag.READ_UNMAPPED));
- Assert.assertFalse(SAMFlag.getFlags(83).contains(SAMFlag.MATE_UNMAPPED));
- Assert.assertTrue(SAMFlag.getFlags(0).isEmpty());
- Assert.assertEquals(SAMFlag.getFlags(4095).size(),12);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java b/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java
deleted file mode 100644
index 133062a..0000000
--- a/src/test/java/htsjdk/samtools/SAMIntegerTagTest.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Confirm that integer tag types are stored and retrieved properly.
- *
- * @author alecw at broadinstitute.org
- */
-public class SAMIntegerTagTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/SAMIntegerTagTest");
-
- private static final String BYTE_TAG = "BY";
- private static final String SHORT_TAG = "SH";
- private static final String INTEGER_TAG = "IN";
- private static final String UNSIGNED_INTEGER_TAG = "UI";
- private static final String STRING_TAG = "ST";
-
- private static final long TOO_LARGE_UNSIGNED_INT_VALUE = BinaryCodec.MAX_UINT + 1L;
-
- enum FORMAT {SAM, BAM, CRAM}
-
- @Test
- public void testBAM() throws Exception {
- final SAMRecord rec = writeAndReadSamRecord("bam");
- Assert.assertTrue(rec.getAttribute(BYTE_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(BYTE_TAG)).intValue(), 1);
- Assert.assertTrue(rec.getAttribute(SHORT_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(SHORT_TAG)).intValue(), 1);
- Assert.assertTrue(rec.getAttribute(INTEGER_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(INTEGER_TAG)).intValue(), 1);
- }
-
- @Test
- public void testSAM() throws Exception {
- final SAMRecord rec = writeAndReadSamRecord("sam");
- Assert.assertTrue(rec.getAttribute(BYTE_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(BYTE_TAG)).intValue(), 1);
- Assert.assertTrue(rec.getAttribute(SHORT_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(SHORT_TAG)).intValue(), 1);
- Assert.assertTrue(rec.getAttribute(INTEGER_TAG) instanceof Integer);
- Assert.assertEquals(((Number) rec.getAttribute(INTEGER_TAG)).intValue(), 1);
- }
-
- @Test
- public void testUnsignedIntegerSAM() throws Exception {
- final SAMRecord rec = createSamRecord();
- final long val = 1l + Integer.MAX_VALUE;
- rec.setAttribute(UNSIGNED_INTEGER_TAG, val);
- final Object roundTripValue = rec.getAttribute(UNSIGNED_INTEGER_TAG);
- Assert.assertTrue(roundTripValue instanceof Long);
- Assert.assertEquals(((Long)roundTripValue).longValue(), val);
- }
-
- @Test
- public void testGetTypedAttributeMethods() throws Exception {
- final SAMRecord rec = writeAndReadSamRecord("bam");
- Assert.assertEquals(rec.getByteAttribute(INTEGER_TAG).intValue(), 1);
- Assert.assertEquals(rec.getShortAttribute(INTEGER_TAG).intValue(), 1);
- Assert.assertEquals(rec.getIntegerAttribute(INTEGER_TAG).intValue(), 1);
- }
-
-
- @DataProvider
- public Object[][] formatsAndValues(){
- return new Object[][]{
- new Object[]{"sam","Hello World!"},
- new Object[]{"bam","Hello World!"},
- new Object[]{"cram","Hello World!"},
- new Object[]{"cram",""},
- new Object[]{"bam",""},
- new Object[]{"sam",""},
- };
- }
- /**
- * Should be able to write empty and non-empty strings
- */
- @Test(dataProvider = "formatsAndValues")
- public void testWriteAndReadStrings(final String format,final String value) throws Exception {
- final SAMRecord rec = createSamRecord();
- rec.setAttribute(STRING_TAG, value);
- writeAndReadSamRecord(format, rec);
- Assert.assertEquals(rec.getStringAttribute(STRING_TAG),value);
- }
-
-
- @DataProvider
- public Object[][] formatsAndValues2(){
- return new Object[][]{
- new Object[]{"sam",'a'},
- new Object[]{"bam",'a'},
- new Object[]{"cram",'a'},
- new Object[]{"cram",null},
- new Object[]{"bam",null},
- new Object[]{"sam",null},
- };
- }
- /**
- * Should be able to write empty and non-empty strings
- */
- @Test(dataProvider = "formatsAndValues2")
- public void testWriteAndReadCharacters(final String format,final Character value) throws Exception {
- final SAMRecord rec = createSamRecord();
- rec.setAttribute(STRING_TAG, value);
- writeAndReadSamRecord(format, rec);
- Assert.assertEquals(rec.getCharacterAttribute(STRING_TAG),value);
- }
-
- /**
- * Should be an exception if a typed attribute call is made for the wrong type.
- */
- @Test(expectedExceptions = RuntimeException.class)
- public void testGetTypedAttributeForWrongType() throws Exception {
- final SAMRecord rec = createSamRecord();
- rec.setAttribute(STRING_TAG, "Hello, World!");
- writeAndReadSamRecord("bam", rec);
- rec.getIntegerAttribute(STRING_TAG);
- Assert.fail("Exception should have been thrown.");
- }
-
- /**
- * Should be an exception if a typed attribute call is made for a value that cannot
- * be coerced into the correct type.
- * This test is a little lame because a RuntimeException could be thrown for some other reason.
- */
- @Test(expectedExceptions = RuntimeException.class)
- public void testGetTypedAttributeOverflow() throws Exception {
- final SAMRecord rec = createSamRecord();
- rec.setAttribute(INTEGER_TAG, Integer.MAX_VALUE);
- writeAndReadSamRecord("bam", rec);
- rec.getShortAttribute(INTEGER_TAG);
- Assert.fail("Exception should have been thrown.");
- }
-
- /**
- * Should be an exception if a typed attribute call is made for a value that cannot
- * be coerced into the correct type.
- * This test is a little lame because a RuntimeException could be thrown for some other reason.
- */
- @Test(expectedExceptions = RuntimeException.class)
- public void testGetTypedAttributeUnerflow() throws Exception {
- final SAMRecord rec = createSamRecord();
- rec.setAttribute(INTEGER_TAG, Integer.MIN_VALUE);
- writeAndReadSamRecord("bam", rec);
- rec.getShortAttribute(INTEGER_TAG);
- Assert.fail("Exception should have been thrown.");
- }
-
- /**
- * Create a SAMRecord with integer tags of various sizes, write to a file, and read it back.
- *
- * @param format "sam" or "bam".
- * @return The record after having being read from file.
- */
- private SAMRecord writeAndReadSamRecord(final String format) throws IOException {
- SAMRecord rec = createSamRecord();
- rec.setAttribute(BYTE_TAG, (byte) 1);
- rec.setAttribute(SHORT_TAG, (short) 1);
- rec.setAttribute(INTEGER_TAG, 1);
- rec = writeAndReadSamRecord(format, rec);
- return rec;
- }
-
- /**
- * Write a SAMRecord to a SAM file in the given format, and read it back.
- *
- * @param format "sam" or "bam".
- * @param rec The record to write.
- * @return The same record, after having being written and read back.
- */
- private SAMRecord writeAndReadSamRecord(final String format, SAMRecord rec) throws IOException {
- final File bamFile = File.createTempFile("htsjdk-writeAndReadSamRecord.", "." + format);
- final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(rec.getHeader(), false, bamFile);
- bamWriter.addAlignment(rec);
- bamWriter.close();
- final SamReader reader = SamReaderFactory.makeDefault().open(bamFile);
- rec = reader.iterator().next();
- reader.close();
- bamFile.delete();
- return rec;
- }
-
- private SAMRecord createSamRecord() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- builder.addFrag("readA", 20, 140, false);
- return builder.iterator().next();
- }
-
- private static SamInputResource createSamForIntAttr(long value) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- PrintStream ps = new PrintStream(baos);
- ps.println("@HD\tVN:1.0");
- ps.print("1\t4\t*\t0\t0\t*\t*\t0\t0\tA\t<\tUI:i:");
- ps.println(value);
- ps.close();
-
- return new SamInputResource(new InputStreamInputResource(new ByteArrayInputStream(baos.toByteArray())));
- }
-
- @Test
- public void testGoodSamStrict() throws IOException {
- final SamReaderFactory factory = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.STRICT);
-
- Assert.assertEquals(0, ((Number) factory.open(createSamForIntAttr(0)).iterator().next().getAttribute("UI")).intValue());
- Assert.assertEquals(-1, ((Number) factory.open(createSamForIntAttr(-1)).iterator().next().getAttribute("UI")).intValue());
- Assert.assertEquals(Integer.MIN_VALUE, ((Number) factory.open(createSamForIntAttr(Integer.MIN_VALUE)).iterator().next().getAttribute("UI")).intValue());
- Assert.assertEquals(Integer.MAX_VALUE, ((Number) factory.open(createSamForIntAttr(Integer.MAX_VALUE)).iterator().next().getAttribute("UI")).intValue());
- Assert.assertEquals(1L + (long) Integer.MAX_VALUE, ((Number) factory.open(createSamForIntAttr(1L + (long) Integer.MAX_VALUE)).iterator().next().getAttribute("UI")).longValue());
- Assert.assertEquals(BinaryCodec.MAX_UINT, ((Number) factory.open(createSamForIntAttr(BinaryCodec.MAX_UINT)).iterator().next().getAttribute("UI")).longValue());
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testBadSamStrict() throws IOException {
- final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.STRICT).open(createSamForIntAttr(BinaryCodec.MAX_UINT + 1L));
- reader.iterator().next();
- }
-
- @Test
- public void testBadSamSilent() throws IOException {
- final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(createSamForIntAttr(BinaryCodec.MAX_UINT + 1L));
- reader.iterator().next();
- }
-
- @DataProvider(name = "legalIntegerAttributesFiles")
- public Object[][] getLegalIntegerAttributesFiles() {
- return new Object[][] {
- { new File(TEST_DATA_DIR, "variousAttributes.sam") },
- { new File(TEST_DATA_DIR, "variousAttributes.bam") }
- };
- }
-
- @Test(dataProvider = "legalIntegerAttributesFiles")
- public void testLegalIntegerAttributesFilesStrict( final File inputFile ) {
- final SamReader reader = SamReaderFactory.makeDefault()
- .enable(SamReaderFactory.Option.EAGERLY_DECODE)
- .validationStringency(ValidationStringency.STRICT)
- .open(inputFile);
-
- final SAMRecord rec = reader.iterator().next();
- final Map<String, Number> expectedTags = new HashMap<String, Number>();
- expectedTags.put("SB", -128);
- expectedTags.put("UB", 129);
- expectedTags.put("SS", 32767);
- expectedTags.put("US", 65535);
- expectedTags.put("SI", 2147483647);
- expectedTags.put("I2", -2147483647);
- expectedTags.put("UI", 4294967295L);
- for (final Map.Entry<String, Number> entry : expectedTags.entrySet()) {
- final Object value = rec.getAttribute(entry.getKey());
- Assert.assertTrue(((Number) value).longValue() == entry.getValue().longValue());
- }
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "valid_set")
- public static Object[][] valid_set() {
- List<Object[]> params = new ArrayList<Object[]>();
- for (FORMAT format:FORMAT.values()) {
- for (ValidationStringency stringency:ValidationStringency.values()) {
- params.add(new Object[]{0, format, stringency});
- params.add(new Object[]{1, format, stringency});
- params.add(new Object[]{-1, format, stringency});
- params.add(new Object[]{Integer.MIN_VALUE, format, stringency});
- params.add(new Object[]{Integer.MAX_VALUE, format, stringency});
-
- params.add(new Object[]{1L, format, stringency});
- params.add(new Object[]{-1L, format, stringency});
- params.add(new Object[]{(long)Integer.MAX_VALUE+1L, format, stringency});
- params.add(new Object[]{BinaryCodec.MAX_UINT, format, stringency});
- }
- }
-
- return params.toArray(new Object[3][params.size()]);
- }
-
- @DataProvider(name = "invalid_set")
- public static Object[][] invalid_set() {
- List<Object[]> params = new ArrayList<Object[]>();
- for (FORMAT format:FORMAT.values()) {
- for (ValidationStringency stringency:ValidationStringency.values()) {
- params.add(new Object[]{(long)Integer.MIN_VALUE -1L, format, stringency});
- params.add(new Object[]{TOO_LARGE_UNSIGNED_INT_VALUE, format, stringency});
- }
- }
-
- return params.toArray(new Object[3][params.size()]);
- }
-
- @Test(dataProvider = "valid_set")
- public void testValidIntegerAttributeRoundtrip(final long value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
- testRoundtripIntegerAttribute(value, format, validationStringency);
- }
-
- @Test(dataProvider = "invalid_set", expectedExceptions = RuntimeException.class)
- public void testInvalidIntegerAttributeRoundtrip(final long value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
- testRoundtripIntegerAttribute(value, format, validationStringency);
- }
-
- private void testRoundtripIntegerAttribute(final Number value, final FORMAT format, ValidationStringency validationStringency) throws IOException {
- final SAMFileHeader header = new SAMFileHeader();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- final SAMFileWriter w;
- switch (format) {
- case SAM:
- w = new SAMFileWriterFactory().makeSAMWriter(header, false, baos);
- break;
- case BAM:
- w = new SAMFileWriterFactory().makeBAMWriter(header, false, baos);
- break;
- case CRAM:
- w = new SAMFileWriterFactory().makeCRAMWriter(header, baos, null);
- break;
- default:
- throw new RuntimeException("Unknown format: " + format);
- }
-
- final SAMRecord record = new SAMRecord(header);
- record.setAttribute("UI", value);
- record.setReadName("1");
- record.setReadUnmappedFlag(true);
- record.setReadBases("A".getBytes());
- record.setBaseQualityString("!");
- Assert.assertEquals(value, record.getAttribute("UI"));
-
- w.addAlignment(record);
- w.close();
-
- final SamReader reader = SamReaderFactory.make().validationStringency(validationStringency).referenceSource(new ReferenceSource((File)null)).
- open(SamInputResource.of(new ByteArrayInputStream(baos.toByteArray())));
- final SAMRecordIterator iterator = reader.iterator();
- Assert.assertTrue(iterator.hasNext());
- final SAMRecord record2 = iterator.next();
- final Number returnedValue = (Number) record2.getAttribute("UI");
- Assert.assertEquals(value.longValue(), returnedValue.longValue());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java b/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java
deleted file mode 100644
index cb50925..0000000
--- a/src/test/java/htsjdk/samtools/SAMRecordDuplicateComparatorTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * The tests listed here are not exhaustive, and duplicate some of the work found in Picard's MarkDuplicates test classes.
- *
- * @author nhomer
- */
-public class SAMRecordDuplicateComparatorTest {
-
- private final static SAMRecordDuplicateComparator comparator = new SAMRecordDuplicateComparator();
-
- protected final static int DEFAULT_BASE_QUALITY = 10;
-
- private SAMRecordSetBuilder getSAMRecordSetBuilder() {
- return new SAMRecordSetBuilder(false, SAMFileHeader.SortOrder.unsorted);
- }
-
- private boolean matchesExpected(final int expected, final int actual) {
- if (expected < 0) return (actual < 0);
- else if (0 == expected) return (0 == actual);
- else return (0 < actual);
- }
-
- private void assertEquals(List<Integer> expectedValues, final SAMRecordSetBuilder records, boolean fullCompare) {
- SAMRecord previous = null, current;
-
- Assert.assertEquals(expectedValues.size() + 1, records.size());
-
- Iterator<SAMRecord> iterator = records.getRecords().iterator();
- Iterator<Integer> integerIterator = expectedValues.iterator();
- while (iterator.hasNext()) {
- current = iterator.next();
-
- if (null != previous) {
- if (fullCompare) {
- Assert.assertTrue(matchesExpected(integerIterator.next(), comparator.compare(previous, current)));
- }
- else {
- Assert.assertTrue(matchesExpected(integerIterator.next(), comparator.duplicateSetCompare(previous, current)));
- }
- }
-
- previous = current;
- }
- }
-
- private void assertEquals(int expected, final SAMRecordSetBuilder records, boolean fullCompare) {
- assertEquals(Collections.singletonList(expected), records, fullCompare);
- }
-
- /***
- * Tests for comparing duplicate sets only, fragment reads.
- */
- @Test
- public void testFragmentsSamePositive() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false);
- records.addFrag("READ1", 1, 1, false);
-
- assertEquals(0, records, false);
- }
-
- @Test
- public void testFragmentsSameNegative() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, true);
- records.addFrag("READ1", 1, 1, true);
-
- assertEquals(0, records, false);
- }
-
- @Test
- public void testFragmentsDifferentStrand() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false);
- records.addFrag("READ1", 1, 1, true);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsDifferentContig() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false);
- records.addFrag("READ1", 2, 1, false);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsDifferentStart() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false);
- records.addFrag("READ1", 1, 2, false);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsDifferentCigar() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ1", 1, 1, false, false, "51M", null, DEFAULT_BASE_QUALITY);
-
- assertEquals(0, records, false);
- }
-
- @Test
- public void testFragmentsOneUnmapped() {
-
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 1, false, false, "50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ1", 1, 1, false, true, null, null, DEFAULT_BASE_QUALITY);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsOppositeStrandsLessThan() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ1", 1, 100, false, false, "50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ0", 1, 51, true, false, "50M", null, DEFAULT_BASE_QUALITY);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsOppositeStrandsGreaterThan() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 50, true, false, "50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ1", 1, 101, false, false, "50M", null, DEFAULT_BASE_QUALITY);
-
- assertEquals(-1, records, false);
- }
-
- @Test
- public void testFragmentsWithSoftClipping() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 55, false, false, "5S50M", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ1", 1, 60, false, false, "10S50M", null, DEFAULT_BASE_QUALITY);
-
- assertEquals(0, records, false);
- }
-
- @Test
- public void testFragmentsReverseStrandWithSoftClipping() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addFrag("READ0", 1, 55, true, false, "50M10S", null, DEFAULT_BASE_QUALITY);
- records.addFrag("READ1", 1, 60, true, false, "50M5S", null, DEFAULT_BASE_QUALITY);
-
- assertEquals(0, records, false);
- }
-
- /*
- @Test
- public void testPairedSamePositions() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addPair("READ0", 1, 55, 55);
- records.addPair("READ1", 1, 55, 55);
-
- assertEquals(0, records, false);
- }
- */
-
- @Test
- public void testPairedFirstEndDifferent() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addPair("READ0", 1, 55, 55);
- records.addPair("READ1", 2, 55, 55);
-
- assertEquals(Arrays.asList(-1,-1,-1), records, false);
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testNullHeaders() {
- final SAMRecordSetBuilder records = getSAMRecordSetBuilder();
-
- records.addPair("READ0", 1, 55, 55);
- records.addPair("READ1", 2, 55, 55);
- Collection<SAMRecord> recs = records.getRecords();
- for (SAMRecord rec : recs) {
- rec.setHeader(null);
- }
-
- assertEquals(Arrays.asList(-1, -1, -1), records, false);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java b/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java
deleted file mode 100644
index 951ecee..0000000
--- a/src/test/java/htsjdk/samtools/SAMRecordUnitTest.java
+++ /dev/null
@@ -1,1041 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.BinaryCodec;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.util.Arrays;
-import java.util.List;
-
-public class SAMRecordUnitTest {
-
- @DataProvider(name = "serializationTestData")
- public Object[][] getSerializationTestData() {
- return new Object[][] {
- { new File("src/test/resources/htsjdk/samtools/serialization_test.sam") },
- { new File("src/test/resources/htsjdk/samtools/serialization_test.bam") }
- };
- }
-
- @Test(dataProvider = "serializationTestData")
- public void testSAMRecordSerialization( final File inputFile ) throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
- final SAMRecord initialSAMRecord = reader.iterator().next();
- reader.close();
-
- final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
-
- Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
- }
-
- @DataProvider
- public Object [][] offsetAtReferenceData() {
- return new Object[][]{
- {"3S9M", 7, 10, false},
- {"3S9M", 0, 0, false},
- {"3S9M", -1, 0, false},
- {"3S9M", 13, 0, false},
- {"4M1D6M", 4, 4, false},
- {"4M1D6M", 4, 4, true},
- {"4M1D6M", 5, 0, false},
- {"4M1D6M", 5, 4, true},
- {"4M1I6M", 5, 6, false},
- {"4M1I6M", 11, 0, false},
- };
- }
-
- @Test(dataProvider = "offsetAtReferenceData")
- public void testOffsetAtReference(String cigar, int posInReference, int expectedPosInRead, boolean returnLastBaseIfDeleted) {
-
- SAMRecord sam = new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, cigar, null, 2);
- Assert.assertEquals(SAMRecord.getReadPositionAtReferencePosition(sam, posInReference, returnLastBaseIfDeleted), expectedPosInRead);
- }
-
- @DataProvider
- public Object [][] referenceAtReadData() {
- return new Object[][]{
- {"3S9M", 7, 10},
- {"3S9M", 0, 0},
- {"3S9M", 0, 13},
- {"4M1D6M", 4, 4},
- {"4M1D6M", 6, 5},
- {"4M1I6M", 0, 5},
- {"4M1I6M", 5, 6},
- };
- }
-
- @Test(dataProvider = "referenceAtReadData")
- public void testOffsetAtRead(String cigar, int expectedReferencePos, int posInRead) {
-
- SAMRecord sam = new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, cigar, null, 2);
- Assert.assertEquals(sam.getReferencePositionAtReadPosition(posInRead), expectedReferencePos);
- }
-
- @DataProvider(name = "deepCopyTestData")
- public Object [][] deepCopyTestData() {
- return new Object[][]{
- { new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "3S9M", null, 2) },
- { new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "4M1I6M", null, 2) }
- };
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepCopyBasic(final SAMRecord sam) {
- testDeepCopy(sam);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepCopyCigar(SAMRecord sam) {
- sam.setCigar(sam.getCigar());
- final SAMRecord deepCopy = sam.deepCopy();
- Assert.assertTrue(sam.equals(deepCopy));
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepCopyGetCigarString(SAMRecord sam) {
- sam.setCigarString(sam.getCigarString());
- final SAMRecord deepCopy = sam.deepCopy();
- Assert.assertTrue(sam.equals(deepCopy));
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepCopyGetCigar(final SAMRecord sam)
- {
- testDeepCopy(sam);
- sam.setCigarString(sam.getCigarString());
- sam.getCigar(); // force cigar elements to be resolved for equals
- testDeepCopy(sam);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepCopyMutate(final SAMRecord sam) {
- final byte[] initialBaseQualityCopy = Arrays.copyOf(sam.getBaseQualities(), sam.getBaseQualities().length);
- final int initialStart = sam.getAlignmentStart();
-
- final SAMRecord deepCopy = testDeepCopy(sam);
- Assert.assertTrue(Arrays.equals(sam.getBaseQualities(), deepCopy.getBaseQualities()));
- Assert.assertTrue(sam.getAlignmentStart() == deepCopy.getAlignmentStart());
-
- // mutate copy and make sure original remains unchanged
- final byte[] copyBaseQuals = deepCopy.getBaseQualities();
- for (int i = 0; i < copyBaseQuals.length; i++) {
- copyBaseQuals[i]++;
- }
- deepCopy.setBaseQualities(copyBaseQuals);
- deepCopy.setAlignmentStart(initialStart + 1);
- Assert.assertTrue(Arrays.equals(sam.getBaseQualities(), initialBaseQualityCopy));
- Assert.assertTrue(sam.getAlignmentStart() == initialStart);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepByteAttributes( final SAMRecord sam ) throws Exception {
- SAMRecord deepCopy = testDeepCopy(sam);
-
- final byte bytes[] = { -2, -1, 0, 1, 2 };
- sam.setAttribute("BY", bytes);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- // validate reference inequality and content equality
- final byte samBytes[] = sam.getByteArrayAttribute("BY");
- final byte copyBytes[] = deepCopy.getByteArrayAttribute("BY");
- Assert.assertFalse(copyBytes == samBytes);
- Assert.assertTrue(Arrays.equals(copyBytes, samBytes));
-
- // validate mutation independence
- final byte testByte = -1;
- Assert.assertTrue(samBytes[2] != testByte); // ensure initial test condition
- Assert.assertTrue(copyBytes[2] != testByte); // ensure initial test condition
- samBytes[2] = testByte; // mutate original
- Assert.assertTrue(samBytes[2] == testByte);
- Assert.assertTrue(copyBytes[2] != testByte);
- sam.setAttribute("BY", samBytes);
- Assert.assertTrue(sam.getByteArrayAttribute("BY")[2] != deepCopy.getByteArrayAttribute("BY")[2]);
-
- // now unsigned...
- sam.setUnsignedArrayAttribute("BY", bytes);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
- final byte samUBytes[] = sam.getUnsignedByteArrayAttribute("BY");
- final byte copyUBytes[] = deepCopy.getUnsignedByteArrayAttribute("BY");
- Assert.assertFalse(copyUBytes == bytes);
- Assert.assertTrue(Arrays.equals(copyUBytes, samUBytes));
-
- // validate mutation independence
- final byte uByte = 1;
- Assert.assertTrue(samUBytes[2] != uByte); // ensure initial test condition
- Assert.assertTrue(samUBytes[2] != uByte); // ensure initial test condition
- samUBytes[2] = uByte; // mutate original
- Assert.assertTrue(samUBytes[2] == uByte);
- Assert.assertTrue(copyUBytes[2] != uByte);
- sam.setUnsignedArrayAttribute("BY", samBytes);
- Assert.assertTrue(sam.getUnsignedByteArrayAttribute("BY")[2] != deepCopy.getUnsignedByteArrayAttribute("BY")[2]);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepShortAttributes( final SAMRecord sam ) throws Exception {
- SAMRecord deepCopy = testDeepCopy(sam);
-
- final short shorts[] = { -20, -10, 0, 10, 20 };
- sam.setAttribute("SH", shorts);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- // validate reference inequality, content equality
- final short samShorts[] = sam.getSignedShortArrayAttribute("SH");
- final short copyShorts[] = deepCopy.getSignedShortArrayAttribute("SH");
- Assert.assertFalse(copyShorts == samShorts);
- Assert.assertTrue(Arrays.equals(copyShorts, samShorts));
-
- // validate mutation independence
- final short testShort = -1;
- Assert.assertTrue(samShorts[2] != testShort); // ensure initial test condition
- Assert.assertTrue(samShorts[2] != testShort); // ensure initial test condition
- samShorts[2] = testShort; // mutate original
- Assert.assertTrue(samShorts[2] == testShort);
- Assert.assertTrue(copyShorts[2] != testShort);
- sam.setAttribute("SH", samShorts);
- Assert.assertTrue(sam.getSignedShortArrayAttribute("SH")[2] != deepCopy.getSignedShortArrayAttribute("SH")[2]);
-
- // now unsigned...
- sam.setUnsignedArrayAttribute("SH", shorts);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- final short samUShorts[] = sam.getUnsignedShortArrayAttribute("SH");
- final short copyUShorts[] = deepCopy.getUnsignedShortArrayAttribute("SH");
- Assert.assertFalse(copyUShorts == shorts);
- Assert.assertTrue(Arrays.equals(copyUShorts, samUShorts));
-
- // validate mutation independence
- final byte uShort = 1;
- Assert.assertTrue(samUShorts[2] != uShort); // ensure initial test condition
- Assert.assertTrue(samUShorts[2] != uShort); // ensure initial test condition
- samUShorts[2] = uShort; // mutate original
- Assert.assertTrue(samUShorts[2] == uShort);
- Assert.assertTrue(copyUShorts[2] != uShort);
- sam.setUnsignedArrayAttribute("SH", samShorts);
- Assert.assertTrue(sam.getUnsignedShortArrayAttribute("SH")[2] != deepCopy.getUnsignedShortArrayAttribute("SH")[2]);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepIntAttributes( final SAMRecord sam ) throws Exception {
- SAMRecord deepCopy = testDeepCopy(sam);
-
- final int ints[] = { -200, -100, 0, 100, 200 };
- sam.setAttribute("IN", ints);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- // validate reference inequality and content equality
- final int samInts[] = sam.getSignedIntArrayAttribute("IN");
- final int copyInts[] = deepCopy.getSignedIntArrayAttribute("IN");
- Assert.assertFalse(copyInts == ints);
- Assert.assertTrue(Arrays.equals(copyInts, samInts));
-
- // validate mutation independence
- final short testInt = -1;
- Assert.assertTrue(samInts[2] != testInt); // ensure initial test condition
- Assert.assertTrue(samInts[2] != testInt); // ensure initial test condition
- samInts[2] = testInt; // mutate original
- Assert.assertTrue(samInts[2] == testInt);
- Assert.assertTrue(copyInts[2] != testInt);
- sam.setAttribute("IN", samInts);
- Assert.assertTrue(sam.getSignedIntArrayAttribute("IN")[2] != deepCopy.getSignedIntArrayAttribute("IN")[2]);
-
- // now unsigned...
- sam.setUnsignedArrayAttribute("IN", ints);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- final int samUInts[] = sam.getUnsignedIntArrayAttribute("IN");
- final int copyUInts[] = deepCopy.getUnsignedIntArrayAttribute("IN");
- Assert.assertFalse(copyUInts == ints);
- Assert.assertTrue(Arrays.equals(copyUInts, samUInts));
-
- // validate mutation independence
- byte uInt = 1;
- Assert.assertTrue(samUInts[2] != uInt); // ensure initial test condition
- Assert.assertTrue(samUInts[2] != uInt); // ensure initial test condition
- samInts[2] = uInt; // mutate original
- Assert.assertTrue(samUInts[2] == uInt);
- Assert.assertTrue(copyUInts[2] != uInt);
- sam.setUnsignedArrayAttribute("IN", samInts);
- Assert.assertTrue(sam.getUnsignedIntArrayAttribute("IN")[2] != deepCopy.getUnsignedIntArrayAttribute("IN")[2]);
- }
-
- @Test(dataProvider = "deepCopyTestData")
- public void testDeepFloatAttributes( final SAMRecord sam ) throws Exception {
- SAMRecord deepCopy = testDeepCopy(sam);
-
- final float floats[] = { -2.4f, -1.2f, 0, 2.3f, 4.6f };
- sam.setAttribute("FL", floats);
- deepCopy = sam.deepCopy();
- Assert.assertEquals(sam, deepCopy);
-
- // validate reference inequality and content equality
- final float samFloats[] = sam.getFloatArrayAttribute("FL");
- final float copyFloats[] = deepCopy.getFloatArrayAttribute("FL");
- Assert.assertFalse(copyFloats == floats);
- Assert.assertFalse(copyFloats == samFloats);
- Assert.assertTrue(Arrays.equals(copyFloats, samFloats));
-
- // validate mutation independence
- final float testFloat = -1.0f;
- Assert.assertTrue(samFloats[2] != testFloat); // ensure initial test condition
- Assert.assertTrue(samFloats[2] != testFloat); // ensure initial test condition
- samFloats[2] = testFloat; // mutate original
- Assert.assertTrue(samFloats[2] == testFloat);
- Assert.assertTrue(copyFloats[2] != testFloat);
- sam.setAttribute("FL", samFloats);
- Assert.assertTrue(sam.getFloatArrayAttribute("FL")[2] != deepCopy.getFloatArrayAttribute("FL")[2]);
- }
-
- private SAMRecord testDeepCopy(SAMRecord sam) {
- final SAMRecord deepCopy = sam.deepCopy();
- Assert.assertTrue(sam.equals(deepCopy));
- return deepCopy;
- }
-
- @Test
- public void test_getUnsignedIntegerAttribute_valid() {
- final String stringTag = "UI";
- final short binaryTag = SAMTagUtil.getSingleton().makeBinaryTag(stringTag);
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = new SAMRecord(header);
- Assert.assertNull(record.getUnsignedIntegerAttribute(stringTag));
- Assert.assertNull(record.getUnsignedIntegerAttribute(binaryTag));
-
- record.setAttribute("UI", (long) 0L);
- Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(stringTag));
- Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(binaryTag));
-
- record.setAttribute("UI", BinaryCodec.MAX_UINT);
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(stringTag));
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(binaryTag));
-
- final SAMBinaryTagAndValue tv_zero = new SAMBinaryTagAndValue(binaryTag, 0L);
- record = new SAMRecord(header){
- {
- setAttributes(tv_zero);
- }
- };
- Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(stringTag));
- Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(binaryTag));
-
- final SAMBinaryTagAndValue tv_max = new SAMBinaryTagAndValue(binaryTag, BinaryCodec.MAX_UINT);
- record = new SAMRecord(header){
- {
- setAttributes(tv_max);
- }
- };
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(stringTag));
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(binaryTag));
- }
-
- /**
- * This is an alternative to test_getUnsignedIntegerAttribute_valid().
- * This is required for testing invalid (out of range) unsigned integer value.
- */
- @Test
- public void test_getUnsignedIntegerAttribute_valid_alternative() {
- final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record;
-
- record = new SAMRecord(header);
- record.setAttribute("UI", 0L);
- Assert.assertEquals(new Long(0L), record.getUnsignedIntegerAttribute(tag));
-
- record = new SAMRecord(header);
- record.setAttribute("UI", BinaryCodec.MAX_UINT);
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute("UI"));
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void test_getUnsignedIntegerAttribute_negative() {
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = new SAMRecord(header);
- record.setAttribute("UI", -1L);
- record.getUnsignedIntegerAttribute("UI");
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void test_setUnsignedIntegerAttributeTooLarge() {
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = new SAMRecord(header);
- record.setAttribute("UI", BinaryCodec.MAX_UINT + 1);
- }
-
- // NOTE: SAMRecord.asAllowedAttribute is deprecated, as it has been moved into
- // SAMBinaryTagAndValue, but we'll leave this test here until the code is removed.
- @Test
- public void test_isAllowedAttributeDataType() {
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Byte((byte) 0)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Short((short) 0)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Integer(0)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue("a string"));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Character('C')));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Float(0.1F)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new byte[]{0}));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new short[]{0}));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new int[]{0}));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new float[]{0.1F}));
-
- // unsigned integers:
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(0)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(BinaryCodec.MAX_UINT)));
- Assert.assertTrue(SAMRecord.isAllowedAttributeValue(new Long(-1L)));
- Assert.assertFalse(SAMRecord.isAllowedAttributeValue(new Long(BinaryCodec.MAX_UINT + 1L)));
- Assert.assertFalse(SAMRecord.isAllowedAttributeValue(new Long(Integer.MIN_VALUE - 1L)));
- }
-
- @Test()
- public void test_setAttribute_empty_string() {
- final SAMFileHeader header = new SAMFileHeader();
- final SAMRecord record = new SAMRecord(header);
- Assert.assertNull(record.getStringAttribute(SAMTag.MD.name()));
- record.setAttribute(SAMTag.MD.name(), "");
- Assert.assertNotNull(record.getStringAttribute(SAMTag.MD.name()));
- Assert.assertEquals(record.getStringAttribute(SAMTag.MD.name()),"");
- record.setAttribute(SAMTag.MD.name(), null);
- Assert.assertNull(record.getStringAttribute(SAMTag.MD.name()));
- }
-
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void test_setAttribute_unsigned_int_negative() {
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = null;
- record = new SAMRecord(header);
- Assert.assertNull(record.getUnsignedIntegerAttribute("UI"));
- record.setAttribute("UI", (long) Integer.MIN_VALUE - 1L);
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void test_setAttribute_unsigned_int_tooLarge() {
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = new SAMRecord(header);
- Assert.assertNull(record.getUnsignedIntegerAttribute("UI"));
- record.setAttribute("UI", (long) BinaryCodec.MAX_UINT + 1L);
- }
-
- @Test
- public void test_setAttribute_null_removes_tag() {
- final short tag = SAMTagUtil.getSingleton().makeBinaryTag("UI");
- SAMFileHeader header = new SAMFileHeader();
- SAMRecord record = new SAMRecord(header);
- Assert.assertNull(record.getUnsignedIntegerAttribute(tag));
-
- record.setAttribute(tag, BinaryCodec.MAX_UINT);
- Assert.assertEquals(new Long(BinaryCodec.MAX_UINT), record.getUnsignedIntegerAttribute(tag));
-
- record.setAttribute(tag, null);
- Assert.assertNull(record.getUnsignedIntegerAttribute(tag));
- }
-
- private SAMRecord createTestRecordHelper() {
- return new SAMRecordSetBuilder().addFrag("test", 0, 1, false, false, "3S9M", null, 2);
- }
-
- @Test
- public void testReferenceName() {
- SAMRecord sam = createTestRecordHelper();
-
- // NO_ALIGNMENT_NAME
- sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
- Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
- Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
- // valid reference name
- sam = createTestRecordHelper();
- sam.setReferenceName("chr4");
- Assert.assertTrue(sam.getReferenceName().equals("chr4"));
- Assert.assertTrue(sam.getReferenceIndex().equals(3));
-
- // invalid reference name sets name but leaves ref index invalid
- sam = createTestRecordHelper();
- sam.setReferenceName("unresolvableName");
- Assert.assertTrue(sam.getReferenceName().equals("unresolvableName"));
- Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- }
-
- @Test
- public void testReferenceIndex() {
- // NO_ALIGNMENT_REFERENCE
- SAMRecord sam = createTestRecordHelper();
- sam.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
- // valid reference
- sam = createTestRecordHelper();
- sam.setReferenceIndex(3);
- Assert.assertTrue(sam.getReferenceIndex().equals(3));
- Assert.assertTrue(sam.getReferenceName().equals("chr4"));
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testInvalidReferenceIndex() {
- // unresolvable reference
- final SAMRecord sam = createTestRecordHelper();
- sam.setReferenceIndex(9999);
- }
-
- @Test
- public void testMateReferenceName() {
- // NO_ALIGNMENT_NAME
- SAMRecord sam = createTestRecordHelper();
- sam.setMateReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
- Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
- Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
- // valid reference
- sam = createTestRecordHelper();
- sam.setMateReferenceName("chr4");
- Assert.assertTrue(sam.getMateReferenceName().equals("chr4"));
- Assert.assertTrue(sam.getMateReferenceIndex().equals(3));
-
- // unresolvable reference
- sam = createTestRecordHelper();
- sam.setMateReferenceName("unresolvableName");
- Assert.assertTrue(sam.getMateReferenceName().equals("unresolvableName"));
- Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- }
-
- @Test
- public void testMateReferenceIndex() {
- // NO_ALIGNMENT_REFERENCE
- SAMRecord sam = createTestRecordHelper();
- sam.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
- // valid reference
- sam = createTestRecordHelper();
- sam.setMateReferenceIndex(3);
- Assert.assertTrue(sam.getMateReferenceIndex().equals(3));
- Assert.assertTrue(sam.getMateReferenceName().equals("chr4"));
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testInvalidMateReferenceIndex() {
- // unresolvable reference
- final SAMRecord sam = createTestRecordHelper();
- sam.setMateReferenceIndex(9999);
- }
-
- @Test
- public void testRecordValidation() {
- final SAMRecord sam = createTestRecordHelper();
- List<SAMValidationError> validationErrors = sam.isValid(false);
- Assert.assertTrue(validationErrors == null);
- }
-
- @Test
- public void testInvalidAlignmentStartValidation() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setAlignmentStart(0);
- List<SAMValidationError> validationErrors = sam.isValid(false);
- Assert.assertTrue(validationErrors != null && validationErrors.size() == 1);
- }
-
- // ----------------- NULL header tests ---------------------
-
- @Test
- public void testNullHeaderReferenceName() {
- final SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- Assert.assertTrue(null != samHeader);
- final String originalRefName = sam.getReferenceName();
-
- // setting header to null retains the previously assigned ref name
- sam.setHeader(null);
- Assert.assertTrue(originalRefName.equals(sam.getReferenceName()));
-
- // null header allows reference name to be set to NO_ALIGNMENT_REFERENCE_NAME
- sam.setReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
- Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
- Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
- // null header allows reference name to be reset to a valid namw
- sam.setReferenceName(originalRefName);
- Assert.assertTrue(sam.getReferenceName().equals(originalRefName));
- }
-
- @Test
- public void testNullHeaderReferenceIndex() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- int originalRefIndex = sam.getReferenceIndex();
- Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
- // setting header to null resets the reference index to null
- sam.setHeader(null);
- Assert.assertTrue(null == sam.mReferenceIndex);
- // restoring the header to restores the reference index back to the original
- sam.setHeader(samHeader);
- Assert.assertTrue(sam.getReferenceIndex().equals(originalRefIndex));
-
- // setting the header to null allows setting the reference index to NO_ALIGNMENT_REFERENCE_INDEX
- sam.setHeader(null);
- sam.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- Assert.assertTrue(sam.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- Assert.assertTrue(sam.getReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
- // force the internal SAMRecord reference index value to (null) initial state
- sam = new SAMRecord(null);
- Assert.assertTrue(null == sam.mReferenceIndex);
- Assert.assertTrue(sam.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
- // an unresolvable reference name doesn't throw
- final String unresolvableRefName = "unresolvable";
- sam.setReferenceName(unresolvableRefName);
- // now force the SAMRecord to try to resolve the unresolvable name
- sam.setHeader(samHeader);
- Assert.assertTrue(null == sam.mReferenceIndex);
- Assert.assertTrue(sam.getReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderSetReferenceIndex() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setHeader(null);
- // setReferenceIndex with null header throws
- sam.setReferenceIndex(3);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderGetReferenceIndex() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setHeader(null);
- // getReferenceIndex with null header throws
- sam.getReferenceIndex();
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderForceIndexResolutionFailure() {
- // force the internal SAMRecord reference index value to null initial state
- final SAMRecord sam = new SAMRecord(null);
- sam.setReferenceName("unresolvable");
- sam.getReferenceIndex();
- }
-
- @Test
- public void testNullHeaderMateReferenceName() {
- final SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- Assert.assertTrue(null != samHeader);
- final String originalMateRefName = sam.getMateReferenceName();
-
- // setting header to null retains the previously assigned mate ref name
- sam.setHeader(null);
- Assert.assertTrue(originalMateRefName.equals(sam.getMateReferenceName()));
-
- // null header allows mate reference name to be set to NO_ALIGNMENT_REFERENCE_NAME
- sam.setMateReferenceName(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
- Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
- Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
- // null header allows reference name to be reset to a valid namw
- sam.setMateReferenceName(originalMateRefName);
- Assert.assertTrue(sam.getMateReferenceName().equals(originalMateRefName));
- }
-
- @Test
- public void testNullHeaderMateReferenceIndex() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- sam.setMateReferenceName("chr1");
- int originalMateRefIndex = sam.getMateReferenceIndex();
- Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalMateRefIndex);
-
- // setting header to null resets the mate reference index to null
- sam.setHeader(null);
- Assert.assertTrue(null == sam.mMateReferenceIndex);
- // restoring the header to restores the reference index back to the original
- sam.setHeader(samHeader);
- Assert.assertTrue(sam.getMateReferenceIndex().equals(originalMateRefIndex));
-
- // setting the header to null allows setting the mate reference index to NO_ALIGNMENT_REFERENCE_INDEX
- sam.setHeader(null);
- sam.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- Assert.assertTrue(sam.getMateReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- Assert.assertTrue(sam.getMateReferenceName().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_NAME));
-
- // force the internal SAMRecord mate reference index value to (null) initial state
- sam = new SAMRecord(null);
- Assert.assertTrue(null == sam.mMateReferenceIndex);
- Assert.assertTrue(sam.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
- // an unresolvable mate reference name doesn't throw
- final String unresolvableRefName = "unresolvable";
- sam.setMateReferenceName(unresolvableRefName);
- // now force the SAMRecord to try to resolve the unresolvable mate reference name
- sam.setHeader(samHeader);
- Assert.assertTrue(null == sam.mMateReferenceIndex);
- Assert.assertTrue(sam.getMateReferenceIndex() == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderSetMateReferenceIndex() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setHeader(null);
- sam.setMateReferenceIndex(3);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderGetMateReferenceIndex() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setMateReferenceName("chr1");
- sam.setHeader(null);
- // getMateReferenceIndex with null header throws
- sam.getMateReferenceIndex();
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testNullHeaderForceMateIndexResolutionFailure() {
- // force the internal SAMRecord reference index value to null initial state
- final SAMRecord sam = new SAMRecord(null);
- sam.setMateReferenceName("unresolvable");
- sam.getMateReferenceIndex();
- }
-
- @Test
- public void testNullHeaderGetReadGroup() {
- final SAMRecord sam = createTestRecordHelper();
- Assert.assertTrue(null != sam.getHeader());
-
- Assert.assertTrue(null != sam.getReadGroup() && sam.getReadGroup().getId().equals("1"));
- sam.setHeader(null);
- Assert.assertNull(sam.getReadGroup());
- }
-
- @Test(dataProvider = "serializationTestData")
- public void testNullHeaderSerialization(final File inputFile) throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(inputFile);
- final SAMRecord initialSAMRecord = reader.iterator().next();
- reader.close();
-
- initialSAMRecord.setHeader(null);
- final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
- Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
- }
-
-
- @Test
- public void testValidateNonsenseCigar(){
- // Create nonsense record
- SAMRecord rec = createTestRecordHelper();
- rec.setCigarString("nonsense");
-
- //The default validationStringency of a sam record is SILENT.
- rec.setValidationStringency(ValidationStringency.STRICT);
- // Validate record
- List<SAMValidationError> err = rec.validateCigar(-1);
-
- Assert.assertNotNull(err);
- Assert.assertEquals(err.size(), 1);
- Assert.assertEquals(err.get(0).getType(), SAMValidationError.Type.INVALID_CIGAR);
- }
-
- @Test
- public void testNullHeaderRecordValidation() {
- final SAMRecord sam = createTestRecordHelper();
- sam.setHeader(null);
- List<SAMValidationError> validationErrors = sam.isValid(false);
- Assert.assertTrue(validationErrors == null);
- }
-
- @Test
- private void testNullHeaderDeepCopy() {
- SAMRecord sam = createTestRecordHelper();
- sam.setHeader(null);
- final SAMRecord deepCopy = sam.deepCopy();
-
- Assert.assertTrue(sam.equals(deepCopy));
- }
-
- private void testNullHeaderCigar(SAMRecord rec) {
- Cigar origCigar = rec.getCigar();
- Assert.assertNotNull(origCigar);
- String originalCigarString = rec.getCigarString();
-
- // set the cigar to null and then reset the cigar string in order to force getCigar to decode it
- rec.setCigar(null);
- Assert.assertNull(rec.getCigar());
- rec.setCigarString(originalCigarString);
- rec.setValidationStringency(ValidationStringency.STRICT);
- rec.setHeader(null);
- Assert.assertTrue(rec.getValidationStringency() == ValidationStringency.STRICT);
-
- // force getCigar to decode the cigar string, validate that SAMRecord doesn't try to validate the cigar
- Cigar cig = rec.getCigar();
- Assert.assertNotNull(cig);
- String cigString = TextCigarCodec.encode(cig);
- Assert.assertEquals(cigString, originalCigarString);
- }
-
- @Test
- private void testNullHeadGetCigarSAM() {
- SAMRecord sam = createTestRecordHelper();
- testNullHeaderCigar(sam);
- }
-
- @Test
- private void testNullHeadGetCigarBAM() {
- SAMRecord sam = createTestRecordHelper();
- SAMRecordFactory factory = new DefaultSAMRecordFactory();
- BAMRecord bamRec = factory.createBAMRecord(
- sam.getHeader(),
- sam.getReferenceIndex(),
- sam.getAlignmentStart(),
- (short) sam.getReadNameLength(),
- (short) sam.getMappingQuality(),
- 0,
- sam.getCigarLength(),
- sam.getFlags(),
- sam.getReadLength(),
- sam.getMateReferenceIndex(),
- sam.getMateAlignmentStart(),
- 0, null);
-
- bamRec.setCigarString(sam.getCigarString());
-
- testNullHeaderCigar(bamRec);
- }
-
- @Test
- public void testSetHeaderStrictValid() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- Integer originalRefIndex = sam.getReferenceIndex();
- Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
- // force re-resolution of the reference name
- sam.setHeaderStrict(samHeader);
- Assert.assertEquals(sam.getReferenceIndex(), originalRefIndex);
- }
-
- @Test
- public void testSetHeaderStrictValidHeaderless() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- Integer originalRefIndex = sam.getReferenceIndex();
- Assert.assertTrue(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX != originalRefIndex);
-
- sam.setHeader(null);
- // force re-resolution of the reference name
- sam.setHeaderStrict(samHeader);
- Assert.assertEquals(sam.getReferenceIndex(), originalRefIndex);
- }
-
- @Test
- public void testSetHeaderStrictValidNewHeader() {
- final SAMRecord sam = createTestRecordHelper();
- final String origSequenceName = sam.getContig();
-
- final SAMFileHeader origSamHeader = sam.getHeader();
- final int origSequenceLength = origSamHeader.getSequence(origSequenceName).getSequenceLength();
- final SAMFileHeader newHeader = new SAMFileHeader();
- newHeader.addSequence(new SAMSequenceRecord(origSequenceName, origSequenceLength));
-
- // force re-resolution of the reference name against the new header
- sam.setHeaderStrict(newHeader);
- Assert.assertEquals(sam.getReferenceIndex(), new Integer(0));
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testSetHeaderStrictInvalidReference() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
-
- sam.setReferenceName("unresolvable");
- Assert.assertEquals(new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX), sam.getReferenceIndex());
-
- // throw on force re-resolution of the unresolvable reference name
- sam.setHeaderStrict(samHeader);
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testSetHeaderStrictInvalidMateReference() {
- SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
-
- sam.setMateReferenceName("unresolvable");
- Assert.assertEquals(new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX), sam.getMateReferenceIndex());
-
- // throw on force re-resolution of the unresolvable mate reference name
- sam.setHeaderStrict(samHeader);
- }
-
- @Test
- public void testSetHeaderStrictNull() {
- SAMRecord sam = createTestRecordHelper();
- Assert.assertNotNull(sam.getHeader());
- sam.setHeaderStrict(null);
- Assert.assertNull(sam.getHeader());
- Assert.assertNull(sam.mReferenceIndex);
- }
-
- // resolveIndexFromName
-
- @Test
- public void testResolveIndexResolvable() {
- final SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- final String contigName = sam.getContig();
- Assert.assertEquals(SAMRecord.resolveIndexFromName(contigName, samHeader, true), new Integer(samHeader.getSequenceIndex(contigName)));
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testResolveIndexUnresolvableNullHeader() {
- SAMRecord.resolveIndexFromName("unresolvable", null, false);
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testResolveIndexUnresolvableStrict() {
- final SAMFileHeader samHeader = new SAMFileHeader();
- SAMRecord.resolveIndexFromName("unresolvable", samHeader, true);
- }
-
- @Test
- public void testResolveIndexUnresolvableNotStrict() {
- final SAMFileHeader samHeader = new SAMFileHeader();
- Assert.assertEquals(SAMRecord.resolveIndexFromName("unresolvable", samHeader, false), null);
- }
-
- @Test
- public void testResolveIndexNoAlignment() {
- final SAMFileHeader samHeader = new SAMFileHeader();
- Assert.assertEquals(SAMRecord.resolveIndexFromName(
- SAMRecord.NO_ALIGNMENT_REFERENCE_NAME, samHeader, true), new Integer(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testResolveIndexNullHeader() {
- SAMRecord.resolveIndexFromName("unresolvable", null, true);
- }
-
- // resolveNameFromIndex
-
- @Test
- public void testResolveNameResolvable() {
- final SAMRecord sam = createTestRecordHelper();
- final SAMFileHeader samHeader = sam.getHeader();
- final String contigName = sam.getContig();
- final Integer contigIndex = samHeader.getSequenceIndex(contigName);
- Assert.assertEquals(SAMRecord.resolveNameFromIndex(contigIndex, samHeader), contigName);
- }
-
- @Test(expectedExceptions=IllegalArgumentException.class)
- public void testResolveNameUnresolvable() {
- final SAMFileHeader samHeader = new SAMFileHeader();
- SAMRecord.resolveNameFromIndex(99, samHeader);
- }
-
- @Test
- public void testResolveNameNoAlignment() {
- final SAMFileHeader samHeader = new SAMFileHeader();
- Assert.assertEquals(SAMRecord.resolveNameFromIndex(
- SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, samHeader), SAMRecord.NO_ALIGNMENT_REFERENCE_NAME);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void testResolveNameNullHeader() {
- SAMRecord.resolveNameFromIndex(1, null);
- }
-
- @Test
- public void testReverseComplement() {
- final SAMRecord rec = createTestSamRec();
-
- rec.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), false);
- Assert.assertEquals(rec.getReadString(), "GTGTGTGTGT");
- Assert.assertEquals(rec.getBaseQualityString(), "IIIIIHHHHH");
- Assert.assertEquals(rec.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1});
- Assert.assertEquals(rec.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1});
- Assert.assertEquals(rec.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1});
- Assert.assertEquals(rec.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f});
- Assert.assertEquals(rec.getStringAttribute("Y1"), "GTTTTCTTTT");
- }
-
- /**
- * Note that since strings are immutable the Y1 attribute, which is a String, is not reversed in the original even
- * if an in-place reverse complement occurred. The bases and qualities are byte[] so they are reversed if in-place
- * is true.
- */
- @DataProvider
- public Object [][] reverseComplementData() {
- return new Object[][]{
- {false, "ACACACACAC", "HHHHHIIIII", "AAAAGAAAAC", new byte[] {1,2,3,4,5}, new short[] {1,2,3,4,5}, new int[] {1,2,3,4,5}, new float[] {1,2,3,4,5}},
- {true, "GTGTGTGTGT", "IIIIIHHHHH", "AAAAGAAAAC", new byte[] {5,4,3,2,1}, new short[] {5,4,3,2,1}, new int[] {5,4,3,2,1}, new float[] {5,4,3,2,1}},
- };
- }
-
- @Test(dataProvider = "reverseComplementData")
- public void testSafeReverseComplement(boolean inplace, String bases, String quals, String y1, byte[] x1, short[] x2, int[] x3, float[] x4) throws CloneNotSupportedException {
- final SAMRecord original = createTestSamRec();
- final SAMRecord cloneOfOriginal = (SAMRecord) original.clone();
- //Runs a copy (rather than in-place) reverseComplement
- cloneOfOriginal.reverseComplement(Arrays.asList("Y1"), Arrays.asList("X1", "X2", "X3", "X4", "X5"), inplace);
-
- Assert.assertEquals(original.getReadString(), bases);
- Assert.assertEquals(original.getBaseQualityString(), quals);
- Assert.assertEquals(original.getByteArrayAttribute("X1"), x1);
- Assert.assertEquals(original.getSignedShortArrayAttribute("X2"), x2);
- Assert.assertEquals(original.getSignedIntArrayAttribute("X3"), x3);
- Assert.assertEquals(original.getFloatArrayAttribute("X4"), x4);
- Assert.assertEquals(original.getStringAttribute("Y1"), y1);
-
- Assert.assertEquals(cloneOfOriginal.getReadString(), "GTGTGTGTGT");
- Assert.assertEquals(cloneOfOriginal.getBaseQualityString(), "IIIIIHHHHH");
- Assert.assertEquals(cloneOfOriginal.getByteArrayAttribute("X1"), new byte[] {5,4,3,2,1});
- Assert.assertEquals(cloneOfOriginal.getSignedShortArrayAttribute("X2"), new short[] {5,4,3,2,1});
- Assert.assertEquals(cloneOfOriginal.getSignedIntArrayAttribute("X3"), new int[] {5,4,3,2,1});
- Assert.assertEquals(cloneOfOriginal.getFloatArrayAttribute("X4"), new float[] {5.0f,4.0f,3.0f,2.0f,1.0f});
- Assert.assertEquals(cloneOfOriginal.getStringAttribute("Y1"), "GTTTTCTTTT");
-
- }
-
- public SAMRecord createTestSamRec() {
- final SAMFileHeader header = new SAMFileHeader();
- final SAMRecord rec = new SAMRecord(header);
- rec.setReadString("ACACACACAC");
- rec.setBaseQualityString("HHHHHIIIII");
- rec.setAttribute("X1", new byte[] {1,2,3,4,5});
- rec.setAttribute("X2", new short[] {1,2,3,4,5});
- rec.setAttribute("X3", new int[] {1,2,3,4,5});
- rec.setAttribute("X4", new float[] {1.0f,2.0f,3.0f,4.0f,5.0f});
- rec.setAttribute("Y1", "AAAAGAAAAC");
-
- return(rec);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java
deleted file mode 100644
index 32de1cd..0000000
--- a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryCodecTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 20016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.LineReader;
-import htsjdk.samtools.util.StringLineReader;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import javax.sound.sampled.Line;
-import java.io.BufferedWriter;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Random;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Pavel_Silin at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SAMSequenceDictionaryCodecTest {
-
- private static final Random random = new Random();
- private SAMSequenceDictionary dictionary;
- private StringWriter writer;
- private SAMSequenceDictionaryCodec codec;
- private BufferedWriter bufferedWriter;
-
- @BeforeMethod
- public void setUp() throws Exception {
- String[] seqs = new String[]{"chr1", "chr2", "chr12", "chr16", "chrX"};
- dictionary = new SAMSequenceDictionary();
- for (String seq : seqs) {
- dictionary.addSequence(new SAMSequenceRecord(seq, random.nextInt(10_000_000)));
- }
- writer = new StringWriter();
- bufferedWriter = new BufferedWriter(writer);
- codec = new SAMSequenceDictionaryCodec(bufferedWriter);
- }
-
- @Test
- public void testEncodeDecodeDictionary() throws Exception {
- LineReader readerOne = null;
- LineReader readerTwo = null;
- try {
- codec.encode(dictionary);
- bufferedWriter.close();
- readerOne = new StringLineReader(writer.toString());
- SAMSequenceDictionary actual = codec.decode(readerOne, null);
- assertEquals(actual, dictionary);
-
- readerTwo = new StringLineReader(writer.toString());
-
- String line = readerTwo.readLine();
- assertTrue(line.startsWith("@HD"));
-
- line = readerTwo.readLine();
- while (line != null) {
- assertTrue(line.startsWith("@SQ"));
- line = readerTwo.readLine();
- }
- } finally {
- assert readerOne != null;
- assert readerTwo != null;
- readerOne.close();
- readerTwo.close();
- }
- }
-
- @Test
- public void testEncodeDecodeListOfSeqs() throws Exception {
- LineReader readerOne = null;
- LineReader readerTwo = null;
-
- try {
- List<SAMSequenceRecord> sequences = dictionary.getSequences();
- codec.encodeHeaderLine(false);
- sequences.forEach(codec::encodeSequenceRecord);
- bufferedWriter.close();
- readerOne = new StringLineReader(writer.toString());
- SAMSequenceDictionary actual = codec.decode(readerOne, null);
- assertEquals(actual, dictionary);
- readerTwo = new StringLineReader(writer.toString());
-
- String line = readerTwo.readLine();
- assertTrue(line.startsWith("@HD"));
-
- line = readerTwo.readLine();
- while (line != null) {
- assertTrue(line.startsWith("@SQ"));
- line = readerTwo.readLine();
- }
- } finally {
- assert readerOne != null;
- assert readerTwo != null;
- readerOne.close();
- readerTwo.close();
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java b/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java
deleted file mode 100644
index 0b1a507..0000000
--- a/src/test/java/htsjdk/samtools/SAMSequenceDictionaryTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * The MIT License
- *
- * Date: 2015
- * Author: Pierre Lindenbaum @yokofakun
- * Institut du Thorax , Nantes, France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-public class SAMSequenceDictionaryTest {
- @Test
- public void testAliases() {
- final SAMSequenceRecord ssr1 = new SAMSequenceRecord("1", 1);
- final SAMSequenceRecord ssr2 = new SAMSequenceRecord("2", 1);
-
- final SAMSequenceDictionary dict = new SAMSequenceDictionary(
- Arrays.asList(ssr1, ssr2));
- Assert.assertEquals(dict.size(), 2);
- dict.addSequenceAlias("1", "chr1");
- dict.addSequenceAlias("1", "01");
- dict.addSequenceAlias("1", "1");
- dict.addSequenceAlias("01", "chr01");
- Assert.assertEquals(dict.size(), 2);
- Assert.assertNotNull(dict.getSequence("chr1"));
- Assert.assertNull(dict.getSequence("chr2"));
- }
-
- /**
- * should be saved as XML
- *
- * <pre>
- * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><References><Reference assembly="as" md5="68b329da9893e34099c7d8ad5cb9c940" index="0" length="1" species="sp">1</Reference><Reference index="1" length="1">2</Reference></References>
- * </pre>
- *
- * @throws JAXBException
- */
- @Test
- public void testXmlSeralization() throws JAXBException {
- // create dict
- final SAMSequenceRecord ssr1 = new SAMSequenceRecord("1", 1);
- ssr1.setMd5("68b329da9893e34099c7d8ad5cb9c940");
- ssr1.setAssembly("as");
- ssr1.setSpecies("sp");
- final SAMSequenceRecord ssr2 = new SAMSequenceRecord("2", 1);
- final StringWriter xmlWriter = new StringWriter();
- final SAMSequenceDictionary dict1 = new SAMSequenceDictionary(
- Arrays.asList(ssr1, ssr2));
- // create jaxb context
- JAXBContext jaxbContext = JAXBContext
- .newInstance(SAMSequenceDictionary.class);
- // save to XML
- Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
- jaxbMarshaller.marshal(dict1, xmlWriter);
- // reload XML
- Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
- final SAMSequenceDictionary dict2 = (SAMSequenceDictionary) jaxbUnmarshaller
- .unmarshal(new StringReader(xmlWriter.toString()));
- Assert.assertEquals(dict1, dict2);
- }
-
- @DataProvider(name="testMergeDictionariesData")
- public Object[][] testMergeDictionariesData(){
-
- final SAMSequenceRecord rec1, rec2, rec3, rec4, rec5;
- rec1 = new SAMSequenceRecord("chr1", 100);
- rec2 = new SAMSequenceRecord("chr1", 101);
- rec2.setMd5("dummy");
- rec3 = new SAMSequenceRecord("chr1", SAMSequenceRecord.UNKNOWN_SEQUENCE_LENGTH);
- rec3.setMd5("dummy2");
-
- rec4 = new SAMSequenceRecord("chr1", 100);
- rec4.setAttribute(SAMSequenceRecord.URI_TAG,"file://some/file/name.ok");
-
- rec5 = new SAMSequenceRecord("chr2", 200);
- rec4.setAttribute(SAMSequenceRecord.URI_TAG,"file://some/file/name.ok");
-
- return new Object[][]{
- new Object[]{rec1, rec1, true},
- new Object[]{rec2, rec2, true},
- new Object[]{rec3, rec3, true},
- new Object[]{rec4, rec4, true},
- new Object[]{rec1, rec2, false},//since 100 != 101 in Length
- new Object[]{rec1, rec3, true},
- new Object[]{rec1, rec4, true},
- new Object[]{rec2, rec3, false}, // since MD5 is not equal
- new Object[]{rec2, rec4, false}, //length differs
- new Object[]{rec3, rec4, true},
- new Object[]{rec4, rec5, false}, // different name
- };
- }
-
- @Test(dataProvider = "testMergeDictionariesData", expectedExceptions = IllegalArgumentException.class)
- public void testMergeDictionaries(final SAMSequenceRecord rec1, final SAMSequenceRecord rec2, boolean canMerge) throws Exception {
- final SAMSequenceDictionary dict1 = new SAMSequenceDictionary(Collections.singletonList(rec1));
- final SAMSequenceDictionary dict2 = new SAMSequenceDictionary(Collections.singletonList(rec2));
-
- try {
- SAMSequenceDictionary.mergeDictionaries(dict1, dict2, SAMSequenceDictionary.DEFAULT_DICTIONARY_EQUAL_TAG);
- } catch (final IllegalArgumentException e) {
- if (canMerge) {
- throw new Exception("Expected to be able to merge dictionaries, but wasn't:" , e);
- } else {
- throw e;
- }
- }
- if (canMerge){
- throw new IllegalArgumentException("Expected to be able to merge dictionaries, and was indeed able to do so.");
- } else {
- throw new Exception("Expected to not be able to merge dictionaries, but was able");
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java b/src/test/java/htsjdk/samtools/SAMTextReaderTest.java
deleted file mode 100644
index c80924b..0000000
--- a/src/test/java/htsjdk/samtools/SAMTextReaderTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
-public class SAMTextReaderTest {
- // Simple input, spot check that parsed correctly, and make sure nothing blows up.
- @Test
- public void testBasic() throws Exception {
- final String seq1 = "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG";
- final String seq2 = "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA";
- final String qual1 = "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<";
- final String qual2 = "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<";
- final String fileFormatVersion = "1.0";
- final String sequence = "chr20";
- final int sequenceLength = 62435964;
- final String charTag = "XC";
- final char charValue = 'q';
- final String intTag = "XI";
- final int intValue = 12345;
- final String floatTag = "XF";
- final float floatValue = 1.2345f;
- final String stringTag = "XS";
- final String stringValue = "Hi,Mom!";
- final String samExample = "@HD\tVN:" + fileFormatVersion + "\t" + charTag + ":" + charValue + "\n" +
- "@SQ\tSN:" + sequence + "\tAS:HG18\tLN:" + sequenceLength + "\t" + intTag + ":" + intValue + "\n" +
- "@RG\tID:L1\tPU:SC_1_10\tLB:SC_1\tSM:NA12891" + "\t" + floatTag + ":" + floatValue + "\n" +
- "@RG\tID:L2\tPU:SC_2_12\tLB:SC_2\tSM:NA12891\n" +
- "@PG\tID:0\tVN:1.0\tCL:yo baby\t" + stringTag + ":" + stringValue + "\n" +
- "@PG\tID:2\tVN:1.1\tCL:whassup? ? ? ?\n" +
- "read_28833_29006_6945\t99\tchr20\t28833\t20\t10M1D25M\t=\t28993\t195\t" +
- seq1.toLowerCase() + "\t" + qual1 + "\t" +
- "MF:i:130\tNm:i:1\tH0:i:0\tH1:i:0\tRG:Z:L1\n" +
- "read_28701_28881_323b\t147\tchr20\t28834\t30\t35M\t=\t28701\t-168\t" +
- seq2 + "\t" + qual2 + "\t" +
- "MF:i:18\tNm:i:0\tH0:i:1\tH1:i:0\tRG:Z:L2\n";
-
- final String[] samResults =
- {"read_28833_29006_6945\t99\tchr20\t28833\t20\t10M1D25M\t=\t28993\t195\t" + seq1 + "\t" + qual1 +
- "\tH0:i:0\tH1:i:0\tMF:i:130\tRG:Z:L1\tNm:i:1\n",
- "read_28701_28881_323b\t147\tchr20\t28834\t30\t35M\t=\t28701\t-168\t" + seq2 + "\t" + qual2 +
- "\tH0:i:1\tH1:i:0\tMF:i:18\tRG:Z:L2\tNm:i:0\n"
- };
-
- final SamReader samReader = createSamFileReader(samExample);
- final SAMFileHeader fileHeader = samReader.getFileHeader();
-
- Assert.assertEquals(fileHeader.getVersion(), fileFormatVersion);
- Assert.assertEquals(fileHeader.getAttribute(charTag), Character.toString(charValue));
- final SAMSequenceRecord sequenceRecord = fileHeader.getSequence(sequence);
- Assert.assertNotNull(sequenceRecord);
- Assert.assertEquals(sequenceRecord.getSequenceLength(), sequenceLength);
- Assert.assertEquals(sequenceRecord.getAttribute(intTag), Integer.toString(intValue));
- Assert.assertEquals(fileHeader.getReadGroup("L1").getAttribute(floatTag), Float.toString(floatValue));
- Assert.assertEquals(fileHeader.getProgramRecord("0").getAttribute(stringTag), stringValue);
-
- final CloseableIterator<SAMRecord> iterator = samReader.iterator();
- int i = 0;
- while (iterator.hasNext()) {
- final SAMRecord rec = iterator.next();
- Assert.assertEquals(rec.getSAMString(), samResults[i++]);
- }
- iterator.close();
- iterator.close();
- samReader.close();
- }
-
- private SamReader createSamFileReader(final String samExample) {
- final ByteArrayInputStream inputStream = new ByteArrayInputStream(samExample.getBytes());
- return SamReaderFactory.makeDefault().open(SamInputResource.of(inputStream));
- }
-
- @Test
- public void testUnmapped() {
- final String alignmentFromKris =
- "0\t4\t*\t0\t0\t*\t*\t0\t0\tGCCTCGTAGTGCGCCATCAGTCTATCGATGTCGTTG\t44\"44===;;;;;;;;;::::88844\"4\"\"\"\"\"\"\"\"\n";
- final SamReader samReader = createSamFileReader(alignmentFromKris);
- final CloseableIterator<SAMRecord> iterator = samReader.iterator();
- while (iterator.hasNext()) {
- iterator.next();
- }
- iterator.close();
- CloserUtil.close(samReader);
- }
-
- /**
- * Colon separates fields of a text tag, but colon is also valid in a tag value, so assert that works properly.
- */
- @Test
- public void testTagWithColon() {
- // Create a SAMRecord with a String tag containing a colon
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
- samBuilder.addUnmappedFragment("Hi,Mom!");
- final SAMRecord rec = samBuilder.iterator().next();
- final String valueWithColons = "A:B::C:::";
- rec.setAttribute(SAMTag.CQ.name(), valueWithColons);
- // Write the record as SAM Text
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
- final SAMFileWriter textWriter = new SAMFileWriterFactory().makeSAMWriter(samBuilder.getHeader(),
- true, os);
- textWriter.addAlignment(rec);
- textWriter.close();
-
- final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(os.toByteArray())));
- final SAMRecord recFromText = reader.iterator().next();
- Assert.assertEquals(recFromText.getAttribute(SAMTag.CQ.name()), valueWithColons);
- CloserUtil.close(reader);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java b/src/test/java/htsjdk/samtools/SAMTextWriterTest.java
deleted file mode 100644
index 123ab6b..0000000
--- a/src/test/java/htsjdk/samtools/SAMTextWriterTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class SAMTextWriterTest {
-
- private SAMRecordSetBuilder getSAMReader(final boolean sortForMe, final SAMFileHeader.SortOrder sortOrder) {
- final SAMRecordSetBuilder ret = new SAMRecordSetBuilder(sortForMe, sortOrder);
- ret.addPair("readB", 20, 200, 300);
- ret.addPair("readA", 20, 100, 150);
- ret.addFrag("readC", 20, 140, true);
- ret.addFrag("readD", 20, 140, false);
- return ret;
- }
-
- @Test
- public void testNullHeader() throws Exception {
- final SAMRecordSetBuilder recordSetBuilder = getSAMReader(true, SAMFileHeader.SortOrder.coordinate);
- for (final SAMRecord rec : recordSetBuilder.getRecords()) {
- rec.setHeader(null);
- }
- doTest(recordSetBuilder);
- }
-
- @Test
- public void testBasic() throws Exception {
- doTest(SamFlagField.DECIMAL);
- }
-
- @Test
- public void testBasicHexFlag() throws Exception {
- doTest(SamFlagField.HEXADECIMAL);
- }
-
- @Test
- public void testBasicOctalFlag() throws Exception {
- doTest(SamFlagField.OCTAL);
- }
-
- @Test
- public void testBasicStringFlag() throws Exception {
- doTest(SamFlagField.STRING);
- }
-
- private void doTest(final SAMRecordSetBuilder recordSetBuilder) throws Exception {
- doTest(recordSetBuilder, SamFlagField.DECIMAL);
- }
-
- private void doTest(final SamFlagField samFlagField) throws Exception {
- doTest(getSAMReader(true, SAMFileHeader.SortOrder.coordinate), samFlagField);
- }
-
- private void doTest(final SAMRecordSetBuilder recordSetBuilder, final SamFlagField samFlagField) throws Exception {
- SamReader inputSAM = recordSetBuilder.getSamReader();
- final File samFile = File.createTempFile("tmp.", ".sam");
- samFile.deleteOnExit();
- final Map<String, Object> tagMap = new HashMap<String, Object>();
- tagMap.put("XC", new Character('q'));
- tagMap.put("XI", 12345);
- tagMap.put("XF", 1.2345f);
- tagMap.put("XS", "Hi,Mom!");
- for (final Map.Entry<String, Object> entry : tagMap.entrySet()) {
- inputSAM.getFileHeader().setAttribute(entry.getKey(), entry.getValue().toString());
- }
- final SAMFileWriter samWriter = new SAMFileWriterFactory().setSamFlagFieldOutput(samFlagField).makeSAMWriter(inputSAM.getFileHeader(), false, samFile);
- for (final SAMRecord samRecord : inputSAM) {
- samWriter.addAlignment(samRecord);
- }
- samWriter.close();
-
- // Read it back in and confirm that it matches the input
- inputSAM = recordSetBuilder.getSamReader();
- // Stuff in the attributes again since this has been created again.
- for (final Map.Entry<String, Object> entry : tagMap.entrySet()) {
- inputSAM.getFileHeader().setAttribute(entry.getKey(), entry.getValue().toString());
- }
-
- final SamReader newSAM = SamReaderFactory.makeDefault().open(samFile);
- Assert.assertEquals(newSAM.getFileHeader(), inputSAM.getFileHeader());
- final Iterator<SAMRecord> inputIt = inputSAM.iterator();
- final Iterator<SAMRecord> newSAMIt = newSAM.iterator();
- while (inputIt.hasNext()) {
- Assert.assertTrue(newSAMIt.hasNext());
- final SAMRecord inputSAMRecord = inputIt.next();
- final SAMRecord newSAMRecord = newSAMIt.next();
-
- // Force reference index attributes to be populated
- inputSAMRecord.getReferenceIndex();
- newSAMRecord.getReferenceIndex();
- inputSAMRecord.getMateReferenceIndex();
- newSAMRecord.getMateReferenceIndex();
-
- // Force these to be equal
- newSAMRecord.setIndexingBin(inputSAMRecord.getIndexingBin());
-
- Assert.assertEquals(newSAMRecord, inputSAMRecord);
- }
- Assert.assertFalse(newSAMIt.hasNext());
- inputSAM.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SAMUtilsTest.java b/src/test/java/htsjdk/samtools/SAMUtilsTest.java
deleted file mode 100644
index 3be7e39..0000000
--- a/src/test/java/htsjdk/samtools/SAMUtilsTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-public class SAMUtilsTest {
- @Test
- public void testCompareMapqs() {
- Assert.assertEquals(SAMUtils.compareMapqs(0, 0), 0);
- Assert.assertEquals(SAMUtils.compareMapqs(255, 255), 0);
- Assert.assertEquals(SAMUtils.compareMapqs(1, 1), 0);
- Assert.assertTrue(SAMUtils.compareMapqs(0, 255) < 0);
- Assert.assertTrue(SAMUtils.compareMapqs(0, 1) < 0);
- Assert.assertTrue(SAMUtils.compareMapqs(255, 1) < 0);
- Assert.assertTrue(SAMUtils.compareMapqs(1, 2) < 0);
-
- Assert.assertTrue(SAMUtils.compareMapqs(255, 0) > 0);
- Assert.assertTrue(SAMUtils.compareMapqs(1, 0) > 0);
- Assert.assertTrue(SAMUtils.compareMapqs(1, 255) > 0);
- Assert.assertTrue(SAMUtils.compareMapqs(2, 1) > 0);
- }
-
- @Test
- public void testSimpleClippingOfRecord() {
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setCigar(TextCigarCodec.decode("10M"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(6); // should overlap 5M
- record.setReadBases("AAAAAAAAAA".getBytes());
-
- final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
- Assert.assertEquals(numToClip, 5);
-
- SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
- Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("5M5S")));
- }
-
- @Test
- public void testClippingOfRecordWithSoftClipBasesAtTheEnd() {
- /**
- * Tests that if we need to clip a read with soft-clipping at the end, it does the right thing.
- */
-
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setCigar(TextCigarCodec.decode("5M5S"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(5); // should overlap 1M5S
- record.setReadBases("AAAAAAAAAA".getBytes());
-
- final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
- Assert.assertEquals(numToClip, 1);
-
- SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
- Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S")));
- }
-
- @Test
- public void testClippingOfRecordWithInsertion() {
- /**
- * Tests that if we need to clip a read with an insertion that overlaps
- */
-
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setCigar(TextCigarCodec.decode("5M1I5M"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(5); // should overlap the 1M1I5M
- record.setReadBases("AAAAAAAAAAA".getBytes());
-
-
- final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
- Assert.assertEquals(numToClip, 7);
-
- SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
-
- Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M7S")));
-
- }
-
- @Test
- public void testClippingOfRecordWithDeletion() {
- /**
- * Tests that if we need to clip a read with an deletion that overlaps
- */
-
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setCigar(TextCigarCodec.decode("5M1D5M"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(5); // should overlap the 1M1D5M
- record.setReadBases("AAAAAAAAAA".getBytes());
-
- final int numToClip = SAMUtils.getNumOverlappingAlignedBasesToClip(record);
- Assert.assertEquals(numToClip, 6);
-
- SAMUtils.clipOverlappingAlignedBases(record, numToClip, false); // Side-effects are OK
- Assert.assertTrue(record.getCigar().equals(TextCigarCodec.decode("4M6S")));
-
- }
-
- @Test
- public void testClippingOfRecordWithMateAtSamePosition() {
- /**
- * Tests that we clip the first end of a pair if we have perfect overlap of a pair
- */
-
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setFirstOfPairFlag(true);
- record.setCigar(TextCigarCodec.decode("10M"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(1);
- record.setReadBases("AAAAAAAAAA".getBytes());
-
- Assert.assertEquals(SAMUtils.getNumOverlappingAlignedBasesToClip(record), 0);
-
- // now make it the second end
- record.setFirstOfPairFlag(false);
- record.setSecondOfPairFlag(true);
- Assert.assertEquals(SAMUtils.getNumOverlappingAlignedBasesToClip(record), 10);
- }
-
- @Test
- public void testOtherCanonicalAlignments() {
- // setup the record
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 1000));
- header.addSequence(new SAMSequenceRecord("2", 1000));
- final SAMRecord record = new SAMRecord(header);
- record.setReadPairedFlag(true);
- record.setFirstOfPairFlag(true);
- record.setCigar(TextCigarCodec.decode("10M"));
- record.setReferenceIndex(0);
- record.setAlignmentStart(1);
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(1);
- record.setReadPairedFlag(true);
- record.setSupplementaryAlignmentFlag(true);//spec says first 'SA' record will be the primary record
-
- record.setMateReferenceIndex(0);
- record.setMateAlignmentStart(100);
- record.setInferredInsertSize(99);
-
- record.setReadBases("AAAAAAAAAA".getBytes());
- record.setBaseQualities("##########".getBytes());
- // check no alignments if no SA tag */
- Assert.assertEquals(SAMUtils.getOtherCanonicalAlignments(record).size(),0);
-
-
- record.setAttribute(SAMTagUtil.getSingleton().SA,
- "2,500,+,3S2=1X2=2S,60,1;" +
- "1,191,-,8M2S,60,*;");
-
- // extract suppl alignments
- final List<SAMRecord> suppl = SAMUtils.getOtherCanonicalAlignments(record);
- Assert.assertNotNull(suppl);
- Assert.assertEquals(suppl.size(), 2);
-
- for(final SAMRecord other: suppl) {
- Assert.assertFalse(other.getReadUnmappedFlag());
- Assert.assertTrue(other.getReadPairedFlag());
- Assert.assertFalse(other.getMateUnmappedFlag());
- Assert.assertEquals(other.getMateAlignmentStart(),record.getMateAlignmentStart());
- Assert.assertEquals(other.getMateReferenceName(),record.getMateReferenceName());
-
- Assert.assertEquals(other.getReadName(),record.getReadName());
- if( other.getReadNegativeStrandFlag()==record.getReadNegativeStrandFlag()) {
- Assert.assertEquals(other.getReadString(),record.getReadString());
- Assert.assertEquals(other.getBaseQualityString(),record.getBaseQualityString());
- }
- }
-
- SAMRecord other = suppl.get(0);
- Assert.assertFalse(other.getSupplementaryAlignmentFlag());//1st of suppl and 'record' is supplementary
- Assert.assertEquals(other.getReferenceName(),"2");
- Assert.assertEquals(other.getAlignmentStart(),500);
- Assert.assertFalse(other.getReadNegativeStrandFlag());
- Assert.assertEquals(other.getMappingQuality(), 60);
- Assert.assertEquals(other.getAttribute(SAMTagUtil.getSingleton().NM),1);
- Assert.assertEquals(other.getCigarString(),"3S2=1X2=2S");
- Assert.assertEquals(other.getInferredInsertSize(),0);
-
-
- other = suppl.get(1);
- Assert.assertTrue(other.getSupplementaryAlignmentFlag());
- Assert.assertEquals(other.getReferenceName(),"1");
- Assert.assertEquals(other.getAlignmentStart(),191);
- Assert.assertTrue(other.getReadNegativeStrandFlag());
- Assert.assertEquals(other.getMappingQuality(), 60);
- Assert.assertEquals(other.getAttribute(SAMTagUtil.getSingleton().NM),null);
- Assert.assertEquals(other.getCigarString(),"8M2S");
- Assert.assertEquals(other.getInferredInsertSize(),-91);//100(mate) - 191(other)
-
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java b/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java
deleted file mode 100644
index 6e4fd75..0000000
--- a/src/test/java/htsjdk/samtools/SamFileHeaderMergerTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- **/
-
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.samtools.util.SequenceUtil;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-
-
-/**
- * @author aaron
- * @version 1.0
- * @date May 20, 2009
- * <p/>
- * Class SamFileHeaderMergerTest
- * <p/>
- * Tests the ability of the SamFileHeaderMerger class to merge sequence dictionaries.
- */
-public class SamFileHeaderMergerTest {
-
- private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- /** tests that if we've set the merging to false, we get a SAMException for bam's with different dictionaries. */
- @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
- public void testMergedException() {
- File INPUT[] = {new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome1to10.bam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome5to9.bam")};
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- for (final File inFile : INPUT) {
- IOUtil.assertFileIsReadable(inFile);
- headers.add(SamReaderFactory.makeDefault().getFileHeader(inFile));
- }
- new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headers, false);
- }
-
- /** Tests that we can successfully merge two files with */
- @Test
- public void testMerging() {
- File INPUT[] = {new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome1to10.bam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/Chromosome5to9.bam")};
- final List<SamReader> readers = new ArrayList<SamReader>();
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- for (final File inFile : INPUT) {
- IOUtil.assertFileIsReadable(inFile);
- // We are now checking for zero-length reads, so suppress complaint about that.
- final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inFile);
-
- readers.add(in);
- headers.add(in.getFileHeader());
- }
- final MergingSamRecordIterator iterator;
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.unsorted, headers, true);
- iterator = new MergingSamRecordIterator(headerMerger, readers, false);
- headerMerger.getMergedHeader();
-
- // count the total reads, and record read counts for each sequence
- Map<Integer, Integer> seqCounts = new HashMap<Integer, Integer>();
- int totalCount = 0;
-
- while (iterator.hasNext()) {
- SAMRecord r = iterator.next();
- if (seqCounts.containsKey(r.getReferenceIndex())) {
- seqCounts.put(r.getReferenceIndex(), seqCounts.get(r.getReferenceIndex()) + 1);
- } else {
- seqCounts.put(r.getReferenceIndex(), 1);
- }
- ++totalCount;
- }
- assertEquals(totalCount, 1500);
- for (Integer i : seqCounts.keySet()) {
- if (i < 4 || i > 8) {
- // seqeunce 5 - 9 should have 200 reads (indices 4 - 8)
- assertEquals(seqCounts.get(i).intValue(), 100);
- } else {
- // the others should have 100
- assertEquals(seqCounts.get(i).intValue(), 200);
- }
- }
- CloserUtil.close(readers);
- }
-
- private static final String sq1 = "@SQ\tSN:chr1\tLN:1000\n";
- private static final String sq2 = "@SQ\tSN:chr2\tLN:1000\n";
- private static final String sq3 = "@SQ\tSN:chr3\tLN:1000\n";
- private static final String sq4 = "@SQ\tSN:chr4\tLN:1000\n";
- private static final String sq5 = "@SQ\tSN:chr5\tLN:1000\n";
-
- @Test
- public void testSequenceDictionaryMerge() {
- final String sd1 = sq1 + sq2 + sq5;
- final String sd2 = sq2 + sq3 + sq4;
- SamReader reader1 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd1))));
- SamReader reader2 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd2))));
- final List<SAMFileHeader> inputHeaders = Arrays.asList(reader1.getFileHeader(), reader2.getFileHeader());
- SamFileHeaderMerger merger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, inputHeaders, true);
- final SAMFileHeader mergedHeader = merger.getMergedHeader();
- for (final SAMFileHeader inputHeader : inputHeaders) {
- int prevTargetIndex = -1;
- for (final SAMSequenceRecord sequenceRecord : inputHeader.getSequenceDictionary().getSequences()) {
- final int targetIndex = mergedHeader.getSequenceIndex(sequenceRecord.getSequenceName());
- Assert.assertNotSame(targetIndex, -1);
- Assert.assertTrue(prevTargetIndex < targetIndex);
- prevTargetIndex = targetIndex;
- }
- }
- CloserUtil.close(reader1);
- CloserUtil.close(reader2);
- }
-
- @Test(dataProvider = "data")
- public void testProgramGroupAndReadGroupMerge(File inputFiles[], File expectedOutputFile) throws IOException {
-
- BufferedReader reader = new BufferedReader(new FileReader(expectedOutputFile));
-
- String line;
- String expected_output = "";
- while ((line = reader.readLine()) != null) {
- expected_output += line + "\n";
- }
-
- final List<SamReader> readers = new ArrayList<SamReader>();
- final List<SAMFileHeader> headers = new ArrayList<SAMFileHeader>();
- for (final File inFile : inputFiles) {
- IOUtil.assertFileIsReadable(inFile);
-
- // We are now checking for zero-length reads, so suppress complaint about that.
- final SamReader in = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(inFile);
- readers.add(in);
- headers.add(in.getFileHeader());
- }
- final MergingSamRecordIterator iterator;
-
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, headers, true);
- iterator = new MergingSamRecordIterator(headerMerger, readers, false);
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SAMFileWriter writer = new SAMFileWriterFactory().makeSAMWriter(headerMerger.getMergedHeader(), true, baos);
- while (iterator.hasNext()) {
- writer.addAlignment(iterator.next());
- }
- writer.close();
-
- String actual_output = StringUtil.bytesToString(baos.toByteArray());
-
- List<String> actual = Arrays.asList(actual_output.split("\\n"));
- List<String> expected = Arrays.asList(expected_output.split("\\n"));
- for (int i = 0; i < expected.size(); i++) {
- if (expected.get(i).startsWith("@")) {
- Assert.assertTrue(headersEquivalent(actual.get(i), expected.get(i)));
- } else {
- List<String> expectedSamParts = Arrays.asList(expected.get(i).split("\\s*"));
- List<String> actualSamParts = Arrays.asList(actual.get(i).split("\\s*"));
- for (String exp : expectedSamParts) {
- Assert.assertTrue(actualSamParts.contains(exp));
- }
- for (String act : actualSamParts) {
- Assert.assertTrue(expectedSamParts.contains(act));
- }
- }
- }
- CloserUtil.close(readers);
- }
-
- private static final boolean headersEquivalent(String a, String b) {
- if (a.length() != b.length()) return false;
- List<String> remaining = new LinkedList<String>(Arrays.asList(a.split("\\t")));
- for (final String item : b.split("\\t")) {
- if (!remaining.remove(item)) return false;
- }
- return remaining.isEmpty();
- }
-
- @DataProvider(name = "data")
- private Object[][] getProgramGroupAndReadGroupMergeData() {
-
- return new Object[][]{
- {
-
- new File[]{
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/chr11sub_file1.sam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/chr11sub_file2.sam")},
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case1/expected_output.sam")
- }, {
- new File[]{
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file1.sam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file2.sam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file3.sam"),
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/chr11sub_file4.sam")},
- new File(TEST_DATA_DIR, "SamFileHeaderMergerTest/case2/expected_output.sam")
- }
- };
- }
-
- @Test(expectedExceptions = {SAMException.class})
- public void testUnmergeableSequenceDictionary() {
- final String sd1 = sq1 + sq2 + sq5;
- final String sd2 = sq2 + sq3 + sq4 + sq1;
- final SamReader reader1 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd1))));
- final SamReader reader2 = SamReaderFactory.makeDefault().open(SamInputResource.of(new ByteArrayInputStream(StringUtil.stringToBytes(sd2))));
- final List<SAMFileHeader> inputHeaders = Arrays.asList(reader1.getFileHeader(), reader2.getFileHeader());
- new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, inputHeaders, true);
- CloserUtil.close(reader1);
- CloserUtil.close(reader2);
- }
-
- @DataProvider(name = "fourDigitBase36StrPositiveData")
- public Object[][] positiveFourDigitBase36StrData() {
- return new Object[][]{
- {0, "0"},
- {15, "F"},
- {36, "10"},
- {1200000, "PPXC"},
- {36 * 36 * 36 * 36 - 2, "ZZZY"},
- {36 * 36 * 36 * 36 - 1, "ZZZZ"},
- };
- }
-
- @Test(dataProvider = "fourDigitBase36StrPositiveData")
- public void fourDigitBase36StrPositiveTest(final int toConvert, final String expectedValue) {
- final SamFileHeaderMerger headerMerger = new SamFileHeaderMerger(SAMFileHeader.SortOrder.coordinate, new ArrayList<SAMFileHeader>(), true);
- Assert.assertEquals(expectedValue, headerMerger.positiveFourDigitBase36Str(toConvert));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamFilesTest.java b/src/test/java/htsjdk/samtools/SamFilesTest.java
deleted file mode 100644
index 443a4d1..0000000
--- a/src/test/java/htsjdk/samtools/SamFilesTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package htsjdk.samtools;
-
-import java.nio.file.Path;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Test valid combinations of bam/cram vs bai/crai files.
- * Created by vadim on 10/08/2015.
- */
-public class SamFilesTest {
- private static final String TEST_DATA = "src/test/resources/htsjdk/samtools/BAMFileIndexTest/";
- private static final File BAM_FILE = new File(TEST_DATA + "index_test.bam");
-
- @DataProvider(name = "FindIndexParams")
- public static Object[][] paramsFindIndexForSuffixes() {
- return new Object[][]{
- // no index available sanity checks:
- {".tmp", null, null},
- {".bam", null, null},
- {".cram", null, null},
-
- // legit cases for BAM files:
- {".bam", ".bai", ".bai"},
- {".bam", ".bam.bai", ".bam.bai"},
-
- // legit cases for CRAM files:
- {".cram", ".cram.bai", ".cram.bai"},
- {".cram", ".cram.crai", ".cram.crai"},
-
- // special prohibited cases:
- {".bam", ".crai", null},
- {".tmp", ".crai", null},
- };
- }
-
- @Test(dataProvider = "FindIndexParams")
- public void testFindIndexForSuffixes(final String dataFileSuffix, final String indexFileSuffix, final String expectIndexSuffix) throws IOException {
- final File dataFile = File.createTempFile("test", dataFileSuffix);
- dataFile.deleteOnExit();
- Assert.assertNull(SamFiles.findIndex(dataFile));
- Assert.assertNull(SamFiles.findIndex(dataFile.toPath()));
-
- File indexFile = null;
- if (indexFileSuffix != null) {
- indexFile = new File(dataFile.getAbsolutePath().replaceFirst("\\.\\S+$", indexFileSuffix));
- indexFile.createNewFile();
- indexFile.deleteOnExit();
- }
-
- final File foundIndexFile = SamFiles.findIndex(dataFile);
- if (expectIndexSuffix == null) {
- Assert.assertNull(foundIndexFile);
- } else {
- Assert.assertNotNull(foundIndexFile);
- Assert.assertTrue(foundIndexFile.getName().endsWith(expectIndexSuffix));
- }
-
- final Path foundIndexPath = SamFiles.findIndex(dataFile.toPath());
- if (expectIndexSuffix == null) {
- Assert.assertNull(foundIndexPath);
- } else {
- Assert.assertNotNull(foundIndexPath);
- Assert.assertTrue(foundIndexPath.getFileName().toString().endsWith(expectIndexSuffix));
- }
- }
-
- @DataProvider(name = "filesAndIndicies")
- public Object[][] getFilesAndIndicies() throws IOException {
-
- final File REAL_INDEX_FILE = new File(BAM_FILE + ".bai"); //test regular file
- final File SYMLINKED_BAM_WITH_SYMLINKED_INDEX = new File(TEST_DATA, "symlink_with_index.bam");
-
- return new Object[][]{
- {BAM_FILE, REAL_INDEX_FILE},
- {SYMLINKED_BAM_WITH_SYMLINKED_INDEX, new File(SYMLINKED_BAM_WITH_SYMLINKED_INDEX + ".bai")},
- {new File(TEST_DATA, "symlink_without_linked_index.bam"), REAL_INDEX_FILE.getCanonicalFile()},
- {new File(TEST_DATA, "FileThatDoesntExist"), null}
- };
- }
-
- @Test(dataProvider ="filesAndIndicies")
- public void testIndexSymlinking(File bam, File expected_index) {
- Assert.assertEquals(SamFiles.findIndex(bam), expected_index);
- Assert.assertEquals(SamFiles.findIndex(bam.toPath()), expected_index == null ? null : expected_index.toPath());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamFlagFieldTest.java b/src/test/java/htsjdk/samtools/SamFlagFieldTest.java
deleted file mode 100644
index f09e636..0000000
--- a/src/test/java/htsjdk/samtools/SamFlagFieldTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package htsjdk.samtools;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author nhomer
- */
-public class SamFlagFieldTest {
-
- @Test
- public void testAllFlags() {
- int flagAsInteger = 0;
- for (final SAMFlag samFlag : SAMFlag.values()) {
- flagAsInteger |= samFlag.flag;
- }
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "urURpP12sSxd");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testAllFlagsReverseOrder() {
- int flagAsInteger = 0;
- for (final SAMFlag samFlag : SAMFlag.values()) {
- flagAsInteger |= samFlag.flag;
- }
- final String flagAsString = new StringBuilder("urURpP12sSxd").reverse().toString();
-
- Assert.assertEquals(flagAsInteger, SamFlagField.STRING.parse(flagAsString));
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testForwardStrandFlags() {
- final int flagAsInteger = SamFlagField.STRING.parse("f");
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mf");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testPairedForwardStrandFlags() {
- final int flagAsInteger = SamFlagField.STRING.parse("mfMFp");
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mfMFp");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testMappedFlags() {
- final int flagAsInteger = SamFlagField.STRING.parse("m");
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mf");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testPairedMappedFlags() {
- final int flagAsInteger = SamFlagField.STRING.parse("pmM");
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mfMFp");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testMateMappedNotOnFragmentFlags() {
- final int flagAsInteger = SAMFlag.MATE_UNMAPPED.flag;
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mfU");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testMateMappedOnlyOnPairsFlags() {
- final int flagAsInteger = SAMFlag.MATE_UNMAPPED.flag | SAMFlag.READ_PAIRED.flag;
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mfUFp");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testMateForwardStrandNotOnFragmentFlags() {
- final int flagAsInteger = 0;
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mf");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testMateForwardStrandOnlyOnPairsFlags() {
- final int flagAsInteger = SAMFlag.READ_PAIRED.flag;
- final String flagAsString = SamFlagField.STRING.format(flagAsInteger);
-
- Assert.assertEquals(flagAsString, "mfMFp");
- Assert.assertEquals(SamFlagField.STRING.parse(flagAsString), flagAsInteger);
- }
-
- @Test
- public void testFlagTypesParsing() {
- Assert.assertEquals(SamFlagField.of("0"), SamFlagField.DECIMAL);
- Assert.assertEquals(SamFlagField.of("1234"), SamFlagField.DECIMAL);
- Assert.assertEquals(SamFlagField.of("0xDOESNOTMATTER"), SamFlagField.HEXADECIMAL);
- Assert.assertEquals(SamFlagField.of("0x"), SamFlagField.HEXADECIMAL);
- Assert.assertEquals(SamFlagField.of("0[^x]DOESNOTMATTER"), SamFlagField.OCTAL);
- Assert.assertEquals(SamFlagField.of("0a"), SamFlagField.OCTAL);
- Assert.assertEquals(SamFlagField.of("DOESNOTMATTER"), SamFlagField.STRING);
- }
-
- @Test
- public void testFlagTypesFormatting() {
-
- Assert.assertEquals(SamFlagField.DECIMAL.format(1), "1");
- Assert.assertEquals(SamFlagField.DECIMAL.format(124), "124");
-
- Assert.assertEquals(SamFlagField.HEXADECIMAL.format(1), "0x1");
- Assert.assertEquals(SamFlagField.HEXADECIMAL.format(9), "0x9");
- Assert.assertEquals(SamFlagField.HEXADECIMAL.format(10), "0xa");
- Assert.assertEquals(SamFlagField.HEXADECIMAL.format(16), "0x10");
-
- Assert.assertEquals(SamFlagField.OCTAL.format(1), "01");
- Assert.assertEquals(SamFlagField.OCTAL.format(124), "0174");
-
- Assert.assertEquals(SamFlagField.STRING.format(337), "mrMFp1s");
- }
-
- @Test(expectedExceptions = SAMFormatException.class)
- public void testIllegalStringFlagCharacter(){
- SamFlagField.STRING.parse("HELLO WORLD");
- }
-
- @Test(expectedExceptions = SAMFormatException.class)
- public void testIllegalHexadecimalFlagCharacter(){
- SamFlagField.HEXADECIMAL.parse("HELLO WORLD");
- }
-
- @Test(expectedExceptions = SAMFormatException.class)
- public void testIllegalStringFlagCharacterExclamation(){
- SamFlagField.STRING.parse("pmMr!F1s");
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java b/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java
deleted file mode 100644
index c11be38..0000000
--- a/src/test/java/htsjdk/samtools/SamHeaderRecordComparatorTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package htsjdk.samtools;
-
-/**
- * The MIT License
- * <p/>
- * Copyright (c) 2014 The Broad Institute
- * <p/>
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- * <p/>
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * <p/>
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SamHeaderRecordComparatorTest {
-
- @DataProvider(name="UsualSuspects")
- public Object[][] createData() {
- final SAMReadGroupRecord left = new SAMReadGroupRecord("left");
- left.setPlatformUnit("left.1");
- left.setLibrary("library");
-
- final SAMReadGroupRecord right = new SAMReadGroupRecord("right");
- right.setPlatformUnit("right.1");
- right.setLibrary("library");
- right.setDescription("description");
-
- return new Object[][] {{ left, right }};
- }
-
- @Test(dataProvider="UsualSuspects")
- public void testEqualRecords(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
- final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.PLATFORM_UNIT_TAG);
- Assert.assertEquals(0, comparator.compare(left, left)); // see what I did there?
- }
-
- @Test(dataProvider="UsualSuspects")
- public void testUnequalRecords(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
- final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.PLATFORM_UNIT_TAG);
- Assert.assertTrue(comparator.compare(left, right) < 0);
- Assert.assertTrue(comparator.compare(right, left) > 0);
- }
-
- @Test(dataProvider="UsualSuspects")
- public void testNullAttributes(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
- final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.FLOW_ORDER_TAG);
- Assert.assertEquals(0, comparator.compare(left, right)); // neither record has this attribute
- }
-
- @Test(dataProvider="UsualSuspects")
- public void testOneNullAttribute(final SAMReadGroupRecord left, final SAMReadGroupRecord right) {
- final SAMHeaderRecordComparator<SAMReadGroupRecord> comparator = new SAMHeaderRecordComparator<SAMReadGroupRecord>(SAMReadGroupRecord.DESCRIPTION_TAG);
- Assert.assertTrue(comparator.compare(left, right) < 0);
- Assert.assertTrue(comparator.compare(right, left) > 0);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamIndexesTest.java b/src/test/java/htsjdk/samtools/SamIndexesTest.java
deleted file mode 100644
index d13001f..0000000
--- a/src/test/java/htsjdk/samtools/SamIndexesTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAIEntry;
-import htsjdk.samtools.cram.CRAIIndex;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.util.IOUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.zip.GZIPOutputStream;
-
-public class SamIndexesTest {
-
- @Test
- public void testEmptyBai() throws IOException {
- final File baiFile = File.createTempFile("test", ".bai");
- baiFile.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(baiFile);
- fos.write(SamIndexes.BAI.magic);
- fos.close();
-
-
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- baos.write(SamIndexes.BAI.magic);
- baos.close();
-
- final InputStream inputStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), null);
- for (final byte b : SamIndexes.BAI.magic) {
- Assert.assertEquals(inputStream.read(), 0xFF & b);
- }
- }
-
- @Test(expectedExceptions = NullPointerException.class)
- public void testCraiRequiresDictionary() throws IOException {
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final GZIPOutputStream gos = new GZIPOutputStream(baos);
- gos.close();
-
- SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), null);
- }
-
- @Test
- public void testEmptyCraiReadAsBai() throws IOException {
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final GZIPOutputStream gos = new GZIPOutputStream(baos);
- gos.close();
-
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
- final InputStream inputStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), dictionary);
- for (final byte b : SamIndexes.BAI.magic) {
- Assert.assertEquals(inputStream.read(), 0xFF & b);
- }
- }
-
- @Test
- public void testCraiInMemory() throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(baos, header);
- final CRAIEntry entry = new CRAIEntry();
- entry.sequenceId = 0;
- entry.alignmentStart = 1;
- entry.alignmentSpan = 2;
- entry.sliceOffset = 3;
- entry.sliceSize = 4;
- entry.containerStartOffset = 5;
- indexer.addEntry(entry);
- indexer.finish();
- baos.close();
-
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
- final InputStream baiStream = SamIndexes.asBaiStreamOrNull(new ByteArrayInputStream(baos.toByteArray()), dictionary);
- Assert.assertNotNull(baiStream);
-
- baos = new ByteArrayOutputStream();
- IOUtil.copyStream(baiStream, baos);
- final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(new SeekableMemoryStream(baos.toByteArray(), null), dictionary);
- final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
- Assert.assertNotNull(span);
- final long[] coordinateArray = span.toCoordinateArray();
- Assert.assertEquals(coordinateArray.length, 2);
- Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
- Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
- }
-
- @Test
- public void testCraiFromFile() throws IOException {
- final File file = File.createTempFile("test", ".crai");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
-
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, header);
- final CRAIEntry entry = new CRAIEntry();
- entry.sequenceId = 0;
- entry.alignmentStart = 1;
- entry.alignmentSpan = 2;
- entry.sliceOffset = 3;
- entry.sliceSize = 4;
- entry.containerStartOffset = 5;
- indexer.addEntry(entry);
- indexer.finish();
- fos.close();
-
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
- final SeekableStream baiStream = SamIndexes.asBaiSeekableStreamOrNull(new SeekableFileStream(file), dictionary);
- Assert.assertNotNull(baiStream);
-
- final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(baiStream, dictionary);
- final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
- Assert.assertNotNull(span);
- final long[] coordinateArray = span.toCoordinateArray();
- Assert.assertEquals(coordinateArray.length, 2);
- Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
- Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
- }
-
- @Test(expectedExceptions = NullPointerException.class)
- public void testOpenIndexFileAsBaiOrNull_NPE() throws IOException {
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
- Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(null, dictionary));
- }
-
- @Test
- public void testOpenIndexFileAsBaiOrNull_ReturnsNull() throws IOException {
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
- File file = File.createTempFile("test", ".notbai");
- file.deleteOnExit();
- Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(file, dictionary));
- file.delete();
-
- file = File.createTempFile("test", ".notcrai");
- file.deleteOnExit();
- Assert.assertNull(SamIndexes.openIndexFileAsBaiOrNull(file, dictionary));
- file.delete();
- }
-
- @Test
- public void testOpenIndexUrlAsBaiOrNull() throws IOException {
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
- final File file = File.createTempFile("test", ".crai");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
- SAMFileHeader header = new SAMFileHeader();
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, header);
- final CRAIEntry entry = new CRAIEntry();
- entry.sequenceId = 0;
- entry.alignmentStart = 1;
- entry.alignmentSpan = 2;
- entry.sliceOffset = 3;
- entry.sliceSize = 4;
- entry.containerStartOffset = 5;
- indexer.addEntry(entry);
- indexer.finish();
- fos.close();
-
- final InputStream baiStream = SamIndexes.openIndexUrlAsBaiOrNull(file.toURI().toURL(), dictionary);
- Assert.assertNotNull(baiStream);
-
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- IOUtil.copyStream(baiStream, baos);
- final CachingBAMFileIndex bamIndex = new CachingBAMFileIndex(new SeekableMemoryStream(baos.toByteArray(), null), dictionary);
- final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
- Assert.assertNotNull(span);
- final long[] coordinateArray = span.toCoordinateArray();
- Assert.assertEquals(coordinateArray.length, 2);
- Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
- Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamPairUtilTest.java b/src/test/java/htsjdk/samtools/SamPairUtilTest.java
deleted file mode 100644
index 80841c9..0000000
--- a/src/test/java/htsjdk/samtools/SamPairUtilTest.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.SamPairUtil.SetMateInfoIterator;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class SamPairUtilTest {
-
- @Test(dataProvider = "testGetPairOrientation")
- public void testGetPairOrientation(final String testName,
- final int read1Start, final int read1Length, final boolean read1Reverse,
- final int read2Start, final int read2Length, final boolean read2Reverse,
- final SamPairUtil.PairOrientation expectedOrientation) {
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("chr1", 100000000));
- final SAMRecord rec1 = makeSamRecord(header, read1Start, read1Length, read1Reverse, true);
- final SAMRecord rec2 = makeSamRecord(header, read2Start, read2Length, read2Reverse, false);
- SamPairUtil.setMateInfo(rec1, rec2, true);
- Assert.assertEquals(SamPairUtil.getPairOrientation(rec1), expectedOrientation, testName + " first end");
- Assert.assertEquals(SamPairUtil.getPairOrientation(rec2), expectedOrientation, testName + " second end");
- }
-
- @Test(dataProvider = "testSetMateInfoMateCigar")
- public void testSetMateInfoMateCigar(final String testName,
- final int read1Start, final boolean read1Reverse, final String read1Cigar,
- final int read2Start, final boolean read2Reverse, final String read2Cigar) {
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("chr1", 100000000));
- final SAMRecord rec1 = makeSamRecord2(header, read1Start, read1Reverse, read1Cigar, true);
- final SAMRecord rec2 = makeSamRecord2(header, read2Start, read2Reverse, read2Cigar, false);
- SamPairUtil.setMateInfo(rec1, rec2, true);
- Assert.assertEquals(SAMUtils.getMateCigarString(rec1), rec2.getCigarString(), testName + " first end");
- Assert.assertEquals(SAMUtils.getMateCigarString(rec2), rec1.getCigarString(), testName + " second end");
- }
-
- private void testSetMateInfoMateCigarOnSupplementalsAddRecord(final List<SAMRecord> records, final List<String> mateCigarList, final SAMRecord record, final String mateCigar) {
- records.add(record);
- mateCigarList.add(mateCigar);
- }
-
- @Test(dataProvider = "testSetMateInfoMateCigarOnSupplementals")
- public void testSetMateInfoMateCigarOnSupplementals(final String testName,
- final int read1Start, final boolean read1Reverse, final String read1Cigar,
- final int read1SupplementalStart, final boolean read1SupplementalReverse, final String read1SupplementalCigar,
- final int read2Start, final boolean read2Reverse, final String read2Cigar,
- final int read2SupplementalStart, final boolean read2SupplementalReverse, final String read2SupplementalCigar
- ) {
- final SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("chr1", 100000000));
-
- final List<SAMRecord> records = new ArrayList<SAMRecord>();
- final List<String> mateCigarList = new ArrayList<String>();
- final SAMRecord rec;
-
-
- int numIterations = 10;
- boolean isPaired = (0 < read1Start && 0 < read2Start);
- for (int i = 0; i < numIterations; i++) {
- final String readName = "READ" + i;
- testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read1Start, read1Reverse, read1Cigar, true, readName, isPaired, false), read2Cigar);
- if (0 < read1SupplementalStart) {
- testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read1SupplementalStart, read1SupplementalReverse, read1SupplementalCigar, true, readName, isPaired, true), read2Cigar);
- }
- if (0 < read2Start) {
- testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read2Start, read2Reverse, read2Cigar, false, readName, isPaired, false), read1Cigar);
- }
- if (0 < read2SupplementalStart) {
- testSetMateInfoMateCigarOnSupplementalsAddRecord(records, mateCigarList, makeSamRecord3(header, read2SupplementalStart, read2SupplementalReverse, read2SupplementalCigar, false, readName, isPaired, true), read1Cigar);
- }
- }
-
- // Count the number of mate cigars we expect to add
- int expectedNumberOfMateCigarsAdded = 0;
- for (final String mateCigar : mateCigarList) {
- if (null != mateCigar) expectedNumberOfMateCigarsAdded++;
- }
-
- int i = 0;
- SetMateInfoIterator iterator = new SetMateInfoIterator(records.iterator(), true);
- while (iterator.hasNext()) {
- final SAMRecord record = iterator.next();
- final Cigar mateCigar = SAMUtils.getMateCigar(record);
- final String mateCigarString = (null == mateCigar) ? null : mateCigar.toString();
- Assert.assertEquals(mateCigarString, mateCigarList.get(i), testName);
- i++;
- }
-
- Assert.assertEquals(expectedNumberOfMateCigarsAdded, iterator.getNumMateCigarsAdded(), testName);
-
- iterator.close();
- }
-
- private SAMRecord makeSamRecord(final SAMFileHeader header, final int alignmentStart, final int readLength,
- final boolean reverse, final boolean firstOfPair) {
- final SAMRecord rec = new SAMRecord(header);
- rec.setReferenceIndex(0);
- final StringBuilder sb = new StringBuilder();
- final byte[] quals = new byte[readLength];
- for (int i = 0; i < readLength; ++i) {
- sb.append("A");
- quals[i] = 20;
- }
- rec.setReadString(sb.toString());
- rec.setBaseQualities(quals);
- rec.setAlignmentStart(alignmentStart);
- rec.setCigarString(readLength + "M");
- rec.setReadPairedFlag(true);
- rec.setReadNegativeStrandFlag(reverse);
- if (firstOfPair) rec.setFirstOfPairFlag(true);
- else rec.setSecondOfPairFlag(true);
- return rec;
- }
-
- private SAMRecord makeSamRecord2(final SAMFileHeader header, final int alignmentStart, boolean reverse,
- String cigarString, final boolean firstOfPair) {
- return makeSamRecord3(header, alignmentStart, reverse, cigarString, firstOfPair, null, true, false);
- }
-
- private SAMRecord makeSamRecord3(final SAMFileHeader header, final int alignmentStart, boolean reverse,
- String cigarString, final boolean firstOfPair, final String name, final boolean isPaired, final boolean isSupplemental) {
- final SAMRecord rec = new SAMRecord(header);
- final StringBuilder sb = new StringBuilder();
- final Cigar cigar = TextCigarCodec.decode(cigarString);
- final int readLength = cigar.getReadLength();
- rec.setReferenceIndex(0);
- final byte[] quals = new byte[readLength];
- for (int i = 0; i < readLength; ++i) {
- sb.append("A");
- quals[i] = 20;
- }
- rec.setReadString(sb.toString());
- rec.setBaseQualities(quals);
- rec.setAlignmentStart(alignmentStart);
- rec.setCigar(cigar);
- rec.setReadNegativeStrandFlag(reverse);
- if (isPaired) {
- rec.setReadPairedFlag(true);
- if (firstOfPair) rec.setFirstOfPairFlag(true);
- else rec.setSecondOfPairFlag(true);
- }
- if (null != name) rec.setReadName(name);
- rec.setSupplementaryAlignmentFlag(isSupplemental);
- return rec;
- }
-
- @DataProvider(name = "testGetPairOrientation")
- public Object[][] testGetPairOrientationDataProvider() {
- /**
- * @param testName
- * @param read1Start
- * @param read1Length
- * @param read1Reverse
- * @param read2Start
- * @param read2Length
- * @param read2Reverse
- * @param expectedOrientation
- */
- return new Object[][]{
- {"normal innie", 1, 100, false, 500, 100, true, SamPairUtil.PairOrientation.FR},
- {"overlapping innie", 1, 100, false, 50, 100, true, SamPairUtil.PairOrientation.FR},
- {"second end enclosed innie", 1, 100, false, 50, 50, true, SamPairUtil.PairOrientation.FR},
- {"first end enclosed innie", 1, 50, false, 1, 100, true, SamPairUtil.PairOrientation.FR},
- {"completely overlapping innie", 1, 100, false, 1, 100, true, SamPairUtil.PairOrientation.FR},
- {"normal outie", 1, 100, true, 500, 100, false, SamPairUtil.PairOrientation.RF},
- {"nojump outie", 1, 100, true, 101, 100, false, SamPairUtil.PairOrientation.RF},
- {"forward tandem", 1, 100, true, 500, 100, true, SamPairUtil.PairOrientation.TANDEM},
- {"reverse tandem", 1, 100, false, 500, 100, false, SamPairUtil.PairOrientation.TANDEM},
- {"overlapping forward tandem", 1, 100, true, 50, 100, true, SamPairUtil.PairOrientation.TANDEM},
- {"overlapping reverse tandem", 1, 100, false, 50, 100, false, SamPairUtil.PairOrientation.TANDEM},
- {"second end enclosed forward tandem", 1, 100, true, 50, 50, true, SamPairUtil.PairOrientation.TANDEM},
- {"second end enclosed reverse tandem", 1, 100, false, 50, 50, false, SamPairUtil.PairOrientation.TANDEM},
- {"first end enclosed forward tandem", 1, 50, true, 1, 100, true, SamPairUtil.PairOrientation.TANDEM},
- {"first end enclosed reverse tandem", 1, 50, false, 1, 100, false, SamPairUtil.PairOrientation.TANDEM},
- };
- }
-
- @DataProvider(name = "testSetMateInfoMateCigar")
- public Object[][] testSetMateInfoMateCigarDataProvider() {
- /**
- * @param testName
- * @param read1Start
- * @param read1Reverse
- * @param read1Cigar
- * @param read2Start
- * @param read2Reverse
- * @param read2Cigar
- */
- return new Object[][]{
- {"50M/50M", 1, false, "50M", 500, true, "50M"},
- {"50M/25M5I20M", 1, false, "50M", 500, true, "25M5I20M"},
- {"25M5I20M/50M", 1, false, "25M5I20M", 500, true, "50M"},
- {"50M/25M5D20M", 1, false, "50M", 500, true, "25M5D20M"},
- {"25M5D20M/50M", 1, false, "25M5D20M", 500, true, "50M"},
- };
- }
-
- @DataProvider(name = "testSetMateInfoMateCigarOnSupplementals")
- public Object[][] testSetMateInfoMateCigarOnSupplementalsDataProvider() {
- /**
- * @param testName
- * @param read1Start
- * @param read1Reverse
- * @param read1Cigar
- * @param read1SupplementalStart
- * @param read1SupplementalReverse
- * @param read1SupplementalCigar
- * @param read2Start
- * @param read2Reverse
- * @param read2Cigar
- * @param read2SupplementalStart
- * @param read2SupplementalReverse
- * @param read2SupplementalCigar
- * */
- return new Object[][]{
- {"fragment", 1, false, "50M", -1, false, null, -1, false, null, -1, false, null},
- {"fragment with supplemental", 1, false, "50M", 10, false, "50M", -1, false, null, -1, false, null},
- {"pair", 1, false, "50M", -1, false, null, 1, false, "20M", -1, false, null},
- {"pair first supplemental", 1, false, "50M", 10, false, "50M", 1, false, "20M", -1, false, null},
- {"pair second supplemental", 1, false, "50M", -1, false, null, 1, false, "20M", 10, false, "50M"},
- {"pair both supplemental", 1, false, "50M", 10, false, "50M", 1, false, "20M", 10, false, "50M"}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java b/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java
deleted file mode 100644
index 31ad5c2..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderFactoryTest.java
+++ /dev/null
@@ -1,468 +0,0 @@
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.seekablestream.ISeekableStreamFactory;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableHTTPStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import htsjdk.samtools.util.*;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-public class SamReaderFactoryTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- private static final Log LOG = Log.getInstance(SamReaderFactoryTest.class);
-
- @Test(dataProvider = "variousFormatReaderTestCases")
- public void variousFormatReaderTest(final String inputFile) throws IOException {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- for (final SAMRecord ignored : reader) {
- }
- reader.close();
- }
-
- private int countRecordsInQueryInterval(final SamReader reader, final QueryInterval query) {
- final SAMRecordIterator iter = reader.queryOverlapping(new QueryInterval[] { query });
- int count = 0;
- while (iter.hasNext()) {
- iter.next();
- count++;
- }
- iter.close();
- return count;
- }
-
- private int countRecords(final SamReader reader) {
- int count = 0;
- try (final SAMRecordIterator iter = reader.iterator()) {
- while (iter.hasNext()) {
- iter.next();
- count++;
- }
- }
- return count;
- }
-
- // See https://github.com/samtools/htsjdk/issues/76
- @Test(dataProvider = "queryIntervalIssue76TestCases")
- public void queryIntervalIssue76(final String sequenceName, final int start, final int end, final int expectedCount) throws IOException {
- final File input = new File(TEST_DATA_DIR, "issue76.bam");
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- final QueryInterval interval = new QueryInterval(reader.getFileHeader().getSequence(sequenceName).getSequenceIndex(), start, end);
- Assert.assertEquals(countRecordsInQueryInterval(reader, interval), expectedCount);
- reader.close();
- }
-
- @DataProvider(name = "queryIntervalIssue76TestCases")
- public Object[][] queryIntervalIssue76TestCases() {
- return new Object[][]{
- {"1", 11966, 11966, 2},
- {"1", 11966, 11967, 2},
- {"1", 11967, 11967, 1}
- };
- }
-
- @DataProvider(name = "variousFormatReaderTestCases")
- public Object[][] variousFormatReaderTestCases() {
- return new Object[][]{
- {"block_compressed.sam.gz"},
- {"uncompressed.sam"},
- {"compressed.sam.gz"},
- {"compressed.bam"},
- {"unsorted.sam"}
- };
- }
-
- // Tests for the SAMRecordFactory usage
- class SAMRecordFactoryTester extends DefaultSAMRecordFactory {
- int samRecordsCreated;
- int bamRecordsCreated;
-
- public SAMRecord createSAMRecord(final SAMFileHeader header) {
- ++samRecordsCreated;
- return super.createSAMRecord(header);
- }
-
- public BAMRecord createBAMRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, final short readNameLength, final short mappingQuality, final int indexingBin, final int cigarLen, final int flags, final int readLen, final int mateReferenceSequenceIndex, final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) {
- ++bamRecordsCreated;
- return super.createBAMRecord(header, referenceSequenceIndex, alignmentStart, readNameLength, mappingQuality, indexingBin, cigarLen, flags, readLen, mateReferenceSequenceIndex, mateAlignmentStart, insertSize, variableLengthBlock);
- }
- }
-
- @Test(dataProvider = "variousFormatReaderTestCases")
- public void samRecordFactoryTest(final String inputFile) throws IOException {
- final File input = new File(TEST_DATA_DIR, inputFile);
-
- final SAMRecordFactoryTester recordFactory = new SAMRecordFactoryTester();
- final SamReaderFactory readerFactory = SamReaderFactory.makeDefault().samRecordFactory(recordFactory);
- final SamReader reader = readerFactory.open(input);
-
- int i = 0;
- for (final SAMRecord ignored : reader) {
- ++i;
- }
- reader.close();
-
- Assert.assertTrue(i > 0);
- if (inputFile.endsWith(".sam") || inputFile.endsWith(".sam.gz")) Assert.assertEquals(recordFactory.samRecordsCreated, i);
- else if (inputFile.endsWith(".bam")) Assert.assertEquals(recordFactory.bamRecordsCreated, i);
- }
-
- @Test(expectedExceptions=IllegalStateException.class)
- public void samRecordFactoryNullHeaderBAMTest() {
- final SAMRecordFactory recordFactory = new DefaultSAMRecordFactory();
- recordFactory.createBAMRecord(
- null, // null header
- 0,
- 0,
- (short) 0,
- (short) 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- null);
- }
-
-
- /**
- * Unit tests for asserting all permutations of data and index sources read the same records and header.
- */
- final File localBam = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
- final File localBamIndex = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
-
- final URL bamUrl, bamIndexUrl;
-
- {
- try {
- bamUrl = new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam");
- bamIndexUrl = new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai");
- } catch (final MalformedURLException e) {
- throw new RuntimeException(e);
- }
- }
-
- @DataProvider
- public Object[][] composeAllPermutationsOfSamInputResource() {
- final List<SamInputResource> sources = new ArrayList<SamInputResource>();
- for (final InputResource.Type dataType : InputResource.Type.values()) {
- if (dataType.equals(InputResource.Type.SRA_ACCESSION))
- continue;
-
- sources.add(new SamInputResource(composeInputResourceForType(dataType, false)));
- for (final InputResource.Type indexType : InputResource.Type.values()) {
- if (indexType.equals(InputResource.Type.SRA_ACCESSION))
- continue;
-
- sources.add(new SamInputResource(
- composeInputResourceForType(dataType, false),
- composeInputResourceForType(indexType, true)
- ));
- }
- }
- final Object[][] data = new Object[sources.size()][];
- for (final SamInputResource source : sources) {
- data[sources.indexOf(source)] = new Object[]{source};
- }
-
- return data;
- }
-
- private InputResource composeInputResourceForType(final InputResource.Type type, final boolean forIndex) {
- final File f = forIndex ? localBamIndex : localBam;
- final URL url = forIndex ? bamIndexUrl : bamUrl;
- switch (type) {
- case FILE:
- return new FileInputResource(f);
- case PATH:
- return new PathInputResource(f.toPath());
- case URL:
- return new UrlInputResource(url);
- case SEEKABLE_STREAM:
- return new SeekableStreamInputResource(new SeekableHTTPStream(url));
- case INPUT_STREAM:
- try {
- return new InputStreamInputResource(new FileInputStream(f));
- } catch (final FileNotFoundException e) {
- throw new RuntimeIOException(e);
- }
- default:
- throw new IllegalStateException();
- }
- }
-
- final Set<SAMFileHeader> observedHeaders = new HashSet<SAMFileHeader>();
- final Set<List<SAMRecord>> observedRecordOrdering = new HashSet<List<SAMRecord>>();
-
- @Test(dataProvider = "composeAllPermutationsOfSamInputResource")
- public void exhaustInputResourcePermutation(final SamInputResource resource) throws IOException {
- final SamReader reader = SamReaderFactory.makeDefault().open(resource);
- LOG.info(String.format("Reading from %s ...", resource));
- final List<SAMRecord> slurped = Iterables.slurp(reader);
- final SAMFileHeader fileHeader = reader.getFileHeader();
- reader.hasIndex();
- reader.indexing().hasBrowseableIndex();
- reader.close();
-
- /* Ensure all tests have read the same records in the same order or, if this is the first test, set it as the template. */
- observedHeaders.add(fileHeader);
- observedRecordOrdering.add(slurped);
- Assert.assertEquals(observedHeaders.size(), 1, "read different headers than other testcases");
- Assert.assertEquals(observedRecordOrdering.size(), 1, "read different records than other testcases");
- }
-
- @Test
- public void openPath() throws IOException {
- final Path path = localBam.toPath();
- final List<SAMRecord> records;
- final SAMFileHeader fileHeader;
- try (final SamReader reader = SamReaderFactory.makeDefault().open(path)) {
- LOG.info(String.format("Reading from %s ...", path));
- records = Iterables.slurp(reader);
- fileHeader = reader.getFileHeader();
- reader.close();
- }
-
- try (final SamReader fileReader = SamReaderFactory.makeDefault().open(localBam)) {
- final List<SAMRecord> expectedRecords = Iterables.slurp(fileReader);
- final SAMFileHeader expectedFileHeader = fileReader.getFileHeader();
- Assert.assertEquals(records, expectedRecords);
- Assert.assertEquals(fileHeader, expectedFileHeader);
- }
- }
-
-
- final Set<List<SAMRecord>> observedRecordOrdering1 = new HashSet<List<SAMRecord>>();
- final Set<List<SAMRecord>> observedRecordOrdering3 = new HashSet<List<SAMRecord>>();
- final Set<List<SAMRecord>> observedRecordOrdering20 = new HashSet<List<SAMRecord>>();
-
- @Test(dataProvider = "composeAllPermutationsOfSamInputResource")
- public void queryInputResourcePermutation(final SamInputResource resource) throws IOException {
- final SamReader reader = SamReaderFactory.makeDefault().open(resource);
- LOG.info(String.format("Query from %s ...", resource));
- if (reader.hasIndex()) {
- final StopWatch stopWatch = new StopWatch();
- stopWatch.start();
- final SAMRecordIterator q1 = reader.query("chr1", 500000, 100000000, true);
- observedRecordOrdering1.add(Iterables.slurp(q1));
- q1.close();
- final SAMRecordIterator q20 = reader.query("chr20", 1, 1000000, true);
- observedRecordOrdering20.add(Iterables.slurp(q20));
- q20.close();
- final SAMRecordIterator q3 = reader.query("chr3", 1, 10000000, true);
- observedRecordOrdering3.add(Iterables.slurp(q3));
- q3.close();
- stopWatch.stop();
- LOG.info(String.format("Finished queries in %sms", stopWatch.getElapsedTime()));
-
- Assert.assertEquals(observedRecordOrdering1.size(), 1, "read different records for chromosome 1");
- Assert.assertEquals(observedRecordOrdering20.size(), 1, "read different records for chromosome 20");
- Assert.assertEquals(observedRecordOrdering3.size(), 1, "read different records for chromosome 3");
- } else if (resource.indexMaybe() != null) {
- LOG.warn("Resource has an index source, but is not indexed: " + resource);
- } else {
- LOG.info("Skipping query operation: no index.");
- }
- reader.close();
- }
-
-
- /**
- * A path that pretends it's not based upon a file. This helps in cases where we want to test branches
- * that apply to non-file based paths without actually having to use non-file based resources (like cloud urls)
- */
- private static class NeverFilePathInputResource extends PathInputResource {
- public NeverFilePathInputResource(Path pathResource) {
- super(pathResource);
- }
-
- @Override
- public File asFile() {
- return null;
- }
- }
-
- @Test
- public void checkHasIndexForStreamingPathBamWithFileIndex() throws IOException {
- InputResource bam = new NeverFilePathInputResource(localBam.toPath());
- InputResource index = new FileInputResource(localBamIndex);
-
- // ensure that the index is being used, not checked in queryInputResourcePermutation
- try (final SamReader reader = SamReaderFactory.makeDefault().open(new SamInputResource(bam, index))) {
- Assert.assertTrue(reader.hasIndex());
- }
- }
-
- @Test
- public void queryStreamingPathBamWithFileIndex() throws IOException {
- InputResource bam = new NeverFilePathInputResource(localBam.toPath());
- InputResource index = new FileInputResource(localBamIndex);
-
- final SamInputResource resource = new SamInputResource(bam, index);
- queryInputResourcePermutation(new SamInputResource(bam, index));
- }
-
- @Test
- public void customReaderFactoryTest() throws IOException {
- try {
- CustomReaderFactory.setInstance(new CustomReaderFactory(
- "https://www.googleapis.com/genomics/v1beta/reads/," +
- "htsjdk.samtools.SamReaderFactoryTest$TestReaderFactory"));
- final SamReader reader = SamReaderFactory.makeDefault().open(
- SamInputResource.of(
- "https://www.googleapis.com/genomics/v1beta/reads/?uncompressed.sam"));
- int i = 0;
- for (@SuppressWarnings("unused") final SAMRecord ignored : reader) {
- ++i;
- }
- reader.close();
-
- Assert.assertTrue(i > 0);
- } finally {
- CustomReaderFactory.resetToDefaultInstance();
- }
- }
-
- public static class TestReaderFactory implements CustomReaderFactory.ICustomReaderFactory {
- @Override
- public SamReader open(URL url) {
- final File file = new File(TEST_DATA_DIR, url.getQuery());
- LOG.info("Opening customr reader for " + file.toString());
- return SamReaderFactory.makeDefault().open(file);
- }
- }
-
- @Test
- public void inputResourceFromStringTest() throws IOException {
- Assert.assertEquals(SamInputResource.of("http://test.url").data().type(),
- InputResource.Type.URL);
- Assert.assertEquals(SamInputResource.of("https://test.url").data().type(),
- InputResource.Type.URL);
- Assert.assertEquals(SamInputResource.of("ftp://test.url").data().type(),
- InputResource.Type.URL);
- Assert.assertEquals(SamInputResource.of("/a/b/c").data().type(),
- InputResource.Type.FILE);
- }
-
- @Test
- public void testCRAMReaderFromURL() throws IOException {
- // get a CRAM reader with an index from a URL-backed resource
- getCRAMReaderFromInputResource(
- (cramURL, indexURL) -> { return SamInputResource.of(cramURL).index(indexURL);},
- true,
- 3);
- }
-
- @Test
- public void testCRAMReaderFromURLStream() throws IOException {
- // get a CRAM reader with an index from a stream-backed resource created from a URL
- getCRAMReaderFromInputResource(
- (cramURL, indexURL) -> {
- try {
- ISeekableStreamFactory streamFactory = SeekableStreamFactory.getInstance();
- return SamInputResource
- .of(streamFactory.getStreamFor(cramURL))
- .index(streamFactory.getStreamFor(indexURL));
- }
- catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- },
- true,
- 3);
- }
-
- @Test
- public void testCRAMReaderFromURLNoIndexFile() throws IOException {
- // get just a CRAM reader (no index) from an URL-backed resource
- getCRAMReaderFromInputResource(
- (cramURL, indexURL) -> { return SamInputResource.of(cramURL); },
- false,
- 11);
- }
-
- @Test(expectedExceptions=RuntimeIOException.class)
- public void testCRAMReaderFromURLBadIndexFile() throws IOException {
- // deliberately specify a bad index file to ensure we get an IOException
- getCRAMReaderFromInputResource(
- (cramURL, indexURL) -> { return SamInputResource.of(cramURL).index(new File("nonexistent.bai")); },
- true,
- 3);
- }
-
- private void getCRAMReaderFromInputResource(
- final BiFunction<URL, URL, SamInputResource> getInputResource,
- final boolean hasIndex,
- final int expectedCount) throws IOException {
- final String cramFilePath = new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath();
- final String cramIndexPath = new File(TEST_DATA_DIR, "cram_with_bai_index.cram.bai").getAbsolutePath();
- final URL cramURL = new URL("file://" + cramFilePath);
- final URL indexURL = new URL("file://" + cramIndexPath);
-
- final SamReaderFactory factory = SamReaderFactory.makeDefault()
- .referenceSource(new ReferenceSource(new File(TEST_DATA_DIR, "hg19mini.fasta")))
- .validationStringency(ValidationStringency.SILENT);
- final SamReader reader = factory.open(getInputResource.apply(cramURL, indexURL));
-
- int count = hasIndex ?
- countRecordsInQueryInterval(reader, new QueryInterval(1, 10, 1000)) :
- countRecords(reader);
- Assert.assertEquals(count, expectedCount);
- }
-
- @Test
- public void testSamReaderFromSeekableStream() throws IOException {
- // even though a SAM isn't indexable, make sure we can open one
- // using a seekable stream
- final File samFile = new File(TEST_DATA_DIR, "unsorted.sam");
- final SamReaderFactory factory = SamReaderFactory.makeDefault()
- .validationStringency(ValidationStringency.SILENT);
- final SamReader reader = factory.open(
- SamInputResource.of(new SeekableFileStream(samFile)));
- Assert.assertEquals(countRecords(reader), 10);
- }
-
-
- @Test
- public void testSamReaderFromURL() throws IOException {
- final String samFilePath = new File(TEST_DATA_DIR, "unsorted.sam").getAbsolutePath();
- final URL samURL = new URL("file://" + samFilePath);
- final SamReaderFactory factory = SamReaderFactory.makeDefault()
- .validationStringency(ValidationStringency.SILENT);
- final SamReader reader = factory.open(SamInputResource.of(samURL));
- Assert.assertEquals(countRecords(reader), 10);
- }
-
- @Test(expectedExceptions=SAMFormatException.class)
- public void testSamReaderFromMalformedSeekableStream() throws IOException {
- // use a bogus (.bai file) to force SamReaderFactory to fall through to the
- // fallback code that assumes a SAM File when it can't determine the
- // format of the input, to ensure that it results in a SAMFormatException
- final File samFile = new File(TEST_DATA_DIR, "cram_with_bai_index.cram.bai");
- final SamReaderFactory factory = SamReaderFactory.makeDefault()
- .validationStringency(ValidationStringency.SILENT);
- final SamReader reader = factory.open(
- SamInputResource.of(new SeekableFileStream(samFile)));
- countRecords(reader);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderSortTest.java b/src/test/java/htsjdk/samtools/SamReaderSortTest.java
deleted file mode 100755
index 584410f..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderSortTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package htsjdk.samtools;
-
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Tests for the implementation of {@link SAMRecordIterator} in {@link SamReader}
- *
- * @author ktibbett at broadinstitute.org
- */
-public class SamReaderSortTest {
-
- public static final String COORDINATE_SORTED_FILE = "src/test/resources/htsjdk/samtools/coordinate_sorted.sam";
- public static final String QUERYNAME_SORTED_FILE = "src/test/resources/htsjdk/samtools/queryname_sorted.sam";
- public static final String QUERYNAME_SORTED_NO_HEADER_SORT = "src/test/resources/htsjdk/samtools/unsorted.sam";
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testSortsDisagree() throws Exception {
- SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(COORDINATE_SORTED_FILE)).iterator();
- try {
- it.assertSorted(SAMFileHeader.SortOrder.queryname);
- while (it.hasNext()) {
- it.next();
- }
- Assert.fail("Queryname assertion should have failed on coordinate sorted file but didn't");
- } finally {
- it.close();
- }
- }
-
- @Test(dataProvider = "validSorts")
- public void testSortAssertionValid(String file, SAMFileHeader.SortOrder order) {
- SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(file)).iterator();
- try {
- it.assertSorted(order);
- while (it.hasNext()) {
- it.next();
- }
- } finally {
- it.close();
- }
- }
-
- @DataProvider(name = "validSorts")
- public Object[][] getValidSorts() {
- return new Object[][]{
- {COORDINATE_SORTED_FILE, SAMFileHeader.SortOrder.coordinate},
- {QUERYNAME_SORTED_FILE, SAMFileHeader.SortOrder.queryname},
- {QUERYNAME_SORTED_NO_HEADER_SORT, SAMFileHeader.SortOrder.queryname},
- {COORDINATE_SORTED_FILE, SAMFileHeader.SortOrder.unsorted}
- };
- }
-
-
- @Test(dataProvider = "invalidSorts", expectedExceptions = IllegalStateException.class)
- public void testSortAssertionFails(String file, SAMFileHeader.SortOrder order) throws Exception {
- SAMRecordIterator it = SamReaderFactory.makeDefault().open(new File(file)).iterator();
- try {
- it.assertSorted(order);
- while (it.hasNext()) {
- it.next();
- }
- Assert.fail("Iterated successfully over " + file + " with invalid sort assertion: " + order.name());
- } finally {
- it.close();
- }
- }
-
- @DataProvider(name = "invalidSorts")
- public Object[][] getInvalidSorts() {
- return new Object[][]{
- {QUERYNAME_SORTED_NO_HEADER_SORT, SAMFileHeader.SortOrder.coordinate}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/SamReaderTest.java b/src/test/java/htsjdk/samtools/SamReaderTest.java
deleted file mode 100644
index 093dffb..0000000
--- a/src/test/java/htsjdk/samtools/SamReaderTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-public class SamReaderTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test(dataProvider = "variousFormatReaderTestCases")
- public void variousFormatReaderTest(final String inputFile) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- for (final SAMRecord rec : reader) {
- }
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "variousFormatReaderTestCases")
- public Object[][] variousFormatReaderTestCases() {
- final Object[][] scenarios = new Object[][]{
- {"block_compressed.sam.gz"},
- {"uncompressed.sam"},
- {"compressed.sam.gz"},
- {"compressed.bam"},
- };
- return scenarios;
- }
-
- // tests for CRAM indexing
-
- @Test(dataProvider = "SmallCRAMTest")
- public void CRAMIndexTest(final String inputFile, final String referenceFile, QueryInterval queryInterval, String expectedReadName) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final File reference = new File(TEST_DATA_DIR, referenceFile);
- final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
- Assert.assertTrue(reader.hasIndex());
-
- final CloseableIterator<SAMRecord> iterator = reader.query(new QueryInterval[]{queryInterval}, false);
- Assert.assertTrue(iterator.hasNext());
- SAMRecord r1 = iterator.next();
- Assert.assertEquals(r1.getReadName(), expectedReadName);
-
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "SmallCRAMTest")
- public Object[][] CRAMIndexTestData() {
- final Object[][] testFiles = new Object[][]{
- {"cram/test.cram", "cram/auxf.fa", new QueryInterval(0, 12, 13), "Jim"},
- {"cram_with_bai_index.cram", "hg19mini.fasta", new QueryInterval(3, 700, 0), "k"},
- {"cram_with_crai_index.cram", "hg19mini.fasta", new QueryInterval(2, 350, 0), "i"},
- };
- return testFiles;
- }
-
- @Test(dataProvider = "NoIndexCRAMTest")
- public void CRAMNoIndexTest(final String inputFile, final String referenceFile) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final File reference = new File(TEST_DATA_DIR, referenceFile);
- final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
- Assert.assertFalse(reader.hasIndex());
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "NoIndexCRAMTest")
- public Object[][] CRAMNoIndexTestData() {
- final Object[][] testFiles = new Object[][]{
- {"cram/test2.cram", "cram/auxf.fa"},
- };
- return testFiles;
- }
-
- // Tests for the SAMRecordFactory usage
- class SAMRecordFactoryTester extends DefaultSAMRecordFactory {
- int samRecordsCreated;
- int bamRecordsCreated;
-
- public SAMRecord createSAMRecord(final SAMFileHeader header) {
- ++samRecordsCreated;
- return super.createSAMRecord(header);
- }
-
- public BAMRecord createBAMRecord(final SAMFileHeader header, final int referenceSequenceIndex, final int alignmentStart, final short readNameLength, final short mappingQuality, final int indexingBin, final int cigarLen, final int flags, final int readLen, final int mateReferenceSequenceIndex, final int mateAlignmentStart, final int insertSize, final byte[] variableLengthBlock) {
- ++bamRecordsCreated;
- return super.createBAMRecord(header, referenceSequenceIndex, alignmentStart, readNameLength, mappingQuality, indexingBin, cigarLen, flags, readLen, mateReferenceSequenceIndex, mateAlignmentStart, insertSize, variableLengthBlock);
- }
- }
-
- @Test(dataProvider = "variousFormatReaderTestCases")
- public void samRecordFactoryTest(final String inputFile) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final SAMRecordFactoryTester factory = new SAMRecordFactoryTester();
- final SamReader reader = SamReaderFactory.makeDefault().samRecordFactory(factory).open(input);
-
- int i = 0;
- for (final SAMRecord rec : reader) {
- ++i;
- }
- CloserUtil.close(reader);
-
- Assert.assertTrue(i > 0);
- if (inputFile.endsWith(".sam") || inputFile.endsWith(".sam.gz")) Assert.assertEquals(factory.samRecordsCreated, i);
- else if (inputFile.endsWith(".bam")) Assert.assertEquals(factory.bamRecordsCreated, i);
- }
-
- @Test(dataProvider = "cramTestCases", expectedExceptions=IllegalStateException.class)
- public void testReferenceRequiredForCRAM(final String inputFile, final String ignoredReferenceFile) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- for (final SAMRecord rec : reader) {
- }
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "cramTestCases")
- public Object[][] cramTestPositiveCases() {
- final Object[][] scenarios = new Object[][]{
- {"cram_with_bai_index.cram", "hg19mini.fasta"},
- {"cram_with_crai_index.cram", "hg19mini.fasta"},
- };
- return scenarios;
- }
-
- @Test(dataProvider = "cramTestCases")
- public void testIterateCRAMWithIndex(final String inputFile, final String referenceFile) {
- final File input = new File(TEST_DATA_DIR, inputFile);
- final File reference = new File(TEST_DATA_DIR, referenceFile);
- final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(reference).open(input);
- for (final SAMRecord rec : reader) {
- }
- CloserUtil.close(reader);
- }
-
- @Test
- public void samRecordFactoryNullHeaderTest() {
- final SAMRecordFactory factory = new DefaultSAMRecordFactory();
- final SAMRecord samRec = factory.createSAMRecord(null);
- Assert.assertTrue(samRec.getHeader() == null);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamSpecIntTest.java b/src/test/java/htsjdk/samtools/SamSpecIntTest.java
deleted file mode 100644
index 8305065..0000000
--- a/src/test/java/htsjdk/samtools/SamSpecIntTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class SamSpecIntTest {
- private static final File SAM_INPUT = new File("src/test/resources/htsjdk/samtools/inttest.sam");
- private static final File BAM_INPUT = new File("src/test/resources/htsjdk/samtools/inttest.bam");
-
- @Test
- public void testSamIntegers() throws IOException {
- final List<String> errorMessages = new ArrayList<String>();
- final SamReader samReader = SamReaderFactory.makeDefault().open(SAM_INPUT);
- final File bamOutput = File.createTempFile("test", ".bam");
- final File samOutput = File.createTempFile("test", ".sam");
- final SAMFileWriter samWriter = new SAMFileWriterFactory().makeWriter(samReader.getFileHeader(), true, samOutput, null);
- final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeWriter(samReader.getFileHeader(), true, bamOutput, null);
-
- final SAMRecordIterator iterator = samReader.iterator();
- while (iterator.hasNext()) {
- try {
- final SAMRecord rec = iterator.next();
- samWriter.addAlignment(rec);
- bamWriter.addAlignment(rec);
- } catch (final Throwable e) {
- System.out.println(e.getMessage());
- errorMessages.add(e.getMessage());
- }
- }
-
- CloserUtil.close(samReader);
- samWriter.close();
- bamWriter.close();
- Assert.assertEquals(errorMessages.size(), 0);
- bamOutput.deleteOnExit();
- samOutput.deleteOnExit();
- }
-
- @Test
- public void testBamIntegers() throws IOException {
- final List<String> errorMessages = new ArrayList<String>();
- final SamReader bamReader = SamReaderFactory.makeDefault().open(BAM_INPUT);
- final File bamOutput = File.createTempFile("test", ".bam");
- final File samOutput = File.createTempFile("test", ".sam");
- final SAMFileWriter samWriter = new SAMFileWriterFactory().makeWriter(bamReader.getFileHeader(), true, samOutput, null);
- final SAMFileWriter bamWriter = new SAMFileWriterFactory().makeWriter(bamReader.getFileHeader(), true, bamOutput, null);
- final SAMRecordIterator iterator = bamReader.iterator();
- while (iterator.hasNext()) {
- try {
- final SAMRecord rec = iterator.next();
- samWriter.addAlignment(rec);
- bamWriter.addAlignment(rec);
- } catch (final Throwable e) {
- System.out.println(e.getMessage());
- errorMessages.add(e.getMessage());
- }
- }
-
- CloserUtil.close(bamReader);
- samWriter.close();
- bamWriter.close();
- Assert.assertEquals(errorMessages.size(), 0);
- bamOutput.deleteOnExit();
- samOutput.deleteOnExit();
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/SamStreamsTest.java b/src/test/java/htsjdk/samtools/SamStreamsTest.java
deleted file mode 100644
index c92d6db..0000000
--- a/src/test/java/htsjdk/samtools/SamStreamsTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import htsjdk.samtools.seekablestream.SeekableStreamFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.net.URL;
-
-public class SamStreamsTest {
-
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test(dataProvider = "makeData")
- public void testDataFormat(final String inputFile, final boolean isGzippedSAMFile, final boolean isBAMFile, final boolean isCRAMFile) throws Exception {
- final File input = new File(TEST_DATA_DIR, inputFile);
- try(final InputStream fis = new BufferedInputStream(new FileInputStream(input))) { //must be buffered or the isGzippedSAMFile will blow up
- Assert.assertEquals(SamStreams.isGzippedSAMFile(fis), isGzippedSAMFile, "isGzippedSAMFile:" + inputFile);
- Assert.assertEquals(SamStreams.isBAMFile(fis), isBAMFile, "isBAMFile:" + inputFile);
- Assert.assertEquals(SamStreams.isCRAMFile(fis), isCRAMFile, "isCRAMFile:" + inputFile);
- }
- }
-
- @DataProvider(name = "makeData")
- public Object[][] makeData() {
- final Object[][] scenarios = new Object[][]{
- //isGzippedSAMFile isBAMFile isCRAMFile
- {"block_compressed.sam.gz", true, false, false},
- {"uncompressed.sam", false, false, false},
- {"compressed.sam.gz", true, false, false},
- {"compressed.bam", true, true, false}, //this is slightly weird (responding true to isGzippedSAMFile)
- {"cram_query_sorted.cram", false, false, true},
- };
- return scenarios;
- }
-
- @DataProvider(name = "sourceLikeCram")
- public Object[][] sourceLikeCramData() {
- return new Object[][] {
- {"cram_with_bai_index.cram", true, true },
- {"compressed.bam", true, false },
- {"unsorted.sam", true, false },
- // fails due to https://github.com/samtools/htsjdk/issues/618
- //{"ftp://ftp.broadinstitute.org/dummy.cram", false, true}
- {"http://www.broadinstitute.org/dummy.cram", false, true},
- {"https://www.broadinstitute.org/dummy.cram", false, true},
- {"http://www.broadinstitute.org/dummy.cram?alt=media", false, true},
- {"http://www.broadinstitute.org/test?file=my.cram", false, true},
- {"http://www.broadinstitute.org/test?foo=bar,file=my.cram", false, true},
- {"http://www.broadinstitute.org/test?file=my.bam", false, false}
- };
- }
-
- @Test(dataProvider = "sourceLikeCram")
- public void sourceLikeCram(
- final String resourceName,
- final boolean isFile,
- final boolean expected) throws IOException
- {
- SeekableStream strm = isFile ?
- new SeekableFileStream(new File(TEST_DATA_DIR, resourceName)) :
- SeekableStreamFactory.getInstance().getStreamFor(new URL(resourceName));
- Assert.assertEquals(SamStreams.sourceLikeCram(strm), expected);
- }
-
-
- @DataProvider(name = "sourceLikeBam")
- public Object[][] sourceLikeBamData() {
- return new Object[][] {
- {"cram_with_bai_index.cram", true, false },
- {"compressed.bam", true, true },
- {"unsorted.sam", true, false },
- // fails due to a combination of https://github.com/samtools/htsjdk/issues/619 and
- // https://github.com/samtools/htsjdk/issues/618
- //{"ftp://ftp.broadinstitute.org/dummy.cram", false, false},
- {"ftp://ftp.broadinstitute.org/dummy.bam", false, true},
- {"http://www.broadinstitute.org/dummy.bam", false, true},
- {"https://www.broadinstitute.org/dummy.bam", false, true},
- {"http://www.broadinstitute.org/dummy.bam?alt=media", false, true},
- {"http://www.broadinstitute.org/test?file=my.bam", false, true},
- {"http://www.broadinstitute.org/test?foo=bar,file=my.bam", false, true},
- {"http://www.broadinstitute.org/test?file=my.cram", false, false}
- };
- }
-
- @Test(dataProvider = "sourceLikeBam")
- public void sourceLikeBam(
- final String resourceName,
- final boolean isFile,
- final boolean expected) throws IOException
- {
- SeekableStream strm = isFile ?
- new SeekableFileStream(new File(TEST_DATA_DIR, resourceName)) :
- SeekableStreamFactory.getInstance().getStreamFor(new URL(resourceName));
- Assert.assertEquals(SamStreams.sourceLikeBam(strm), expected);
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java b/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java
deleted file mode 100644
index 2c3a95c..0000000
--- a/src/test/java/htsjdk/samtools/SequenceNameTruncationAndValidationTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools;
-
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Test new functionality that truncates sequence names at first whitespace in order to deal
- * with older BAMs that had spaces in sequence names.
- *
- * @author alecw at broadinstitute.org
- */
-public class SequenceNameTruncationAndValidationTest {
- private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test(expectedExceptions = {SAMException.class}, dataProvider = "badSequenceNames")
- public void testSequenceRecordThrowsWhenInvalid(final String sequenceName) {
- new SAMSequenceRecord(sequenceName, 123);
- Assert.fail("Should not reach here.");
- }
-
- @DataProvider(name = "badSequenceNames")
- public Object[][] badSequenceNames() {
- return new Object[][]{
- {" "},
- {"\t"},
- {"\n"},
- {"="},
- {"Hi, Mom!"}
- };
- }
-
- @Test(dataProvider = "goodSequenceNames")
- public void testSequenceRecordPositiveTest(final String sequenceName) {
- new SAMSequenceRecord(sequenceName, 123);
- }
-
- @DataProvider(name = "goodSequenceNames")
- public Object[][] goodSequenceNames() {
- return new Object[][]{
- {"Hi, at Mom!"}
- };
- }
-
- @Test(dataProvider = "samFilesWithSpaceInSequenceName")
- public void testSamSequenceTruncation(final String filename) {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, filename));
- for (final SAMSequenceRecord sequence : reader.getFileHeader().getSequenceDictionary().getSequences()) {
- Assert.assertFalse(sequence.getSequenceName().contains(" "), sequence.getSequenceName());
- }
- for (final SAMRecord rec : reader) {
- Assert.assertFalse(rec.getReferenceName().contains(" "));
- }
- CloserUtil.close(reader);
- }
-
- @DataProvider(name = "samFilesWithSpaceInSequenceName")
- public Object[][] samFilesWithSpaceInSequenceName() {
- return new Object[][]{
- {"sequenceWithSpace.sam"},
- {"sequenceWithSpace.bam"}
- };
- }
-
- @Test(expectedExceptions = {SAMFormatException.class})
- public void testBadRname() {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, "readWithBadRname.sam"));
- for (final SAMRecord rec : reader) {
- }
- Assert.fail("Should not reach here.");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java b/src/test/java/htsjdk/samtools/ValidateSamFileTest.java
deleted file mode 100644
index 4ce0b7a..0000000
--- a/src/test/java/htsjdk/samtools/ValidateSamFileTest.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009-2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools;
-
-import htsjdk.samtools.BamIndexValidator.IndexValidationStringency;
-import htsjdk.samtools.metrics.MetricBase;
-import htsjdk.samtools.metrics.MetricsFile;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.nio.channels.FileChannel;
-import java.nio.file.StandardOpenOption;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.LineNumberReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-/**
- * Tests almost all error conditions detected by the sam file validator. The
- * conditions not tested are proactively prevented by sam generation code.
- *
- * @author Doug Voet
- */
-public class ValidateSamFileTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/ValidateSamFileTest");
- private static final int TERMINATION_GZIP_BLOCK_SIZE = 28;
- private static final int RANDOM_NUMBER_TRUNC_BYTE = 128;
-
- @Test
- public void testValidSamFile() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "valid.sam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertTrue(results.isEmpty());
- }
-
- @Test
- public void testSamFileVersion1pt5() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "test_samfile_version_1pt5.bam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertTrue(results.isEmpty());
- }
-
- @Test
- public void testSortOrder() throws IOException {
- Histogram<String> results = executeValidation(SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open(new File(TEST_DATA_DIR, "invalid_coord_sort_order.sam")), null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.RECORD_OUT_OF_ORDER.getHistogramString()).getValue(), 1.0);
- results = executeValidation(SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open(new File(TEST_DATA_DIR, "invalid_queryname_sort_order.sam")), null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.RECORD_OUT_OF_ORDER.getHistogramString()).getValue(), 5.0);
- }
-
- @Test
- public void testVerbose() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 20; i++) {
- samBuilder.addFrag(String.valueOf(i), 1, i, false);
- }
- for (final SAMRecord record : samBuilder) {
- record.setProperPairFlag(true);
- }
-
- final StringWriter results = new StringWriter();
- final SamFileValidator validator = new SamFileValidator(new PrintWriter(results), 8000);
- validator.setVerbose(true, 10);
- validator.validateSamFileVerbose(samBuilder.getSamReader(), null);
-
- final int lineCount = results.toString().split("\n").length;
- Assert.assertEquals(lineCount, 11);
- }
-
- @Test
- public void testUnpairedRecords() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 6; i++) {
- samBuilder.addFrag(String.valueOf(i), i, i, false);
- }
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next().setProperPairFlag(true);
- records.next().setMateUnmappedFlag(true);
- records.next().setMateNegativeStrandFlag(true);
- records.next().setFirstOfPairFlag(true);
- records.next().setSecondOfPairFlag(true);
- records.next().setMateReferenceIndex(1);
-
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_PROPER_PAIR.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_NEG_STRAND.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_FIRST_OF_PAIR.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_SECOND_OF_PAIR.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_MATE_REF_INDEX.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testPairedRecords() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 5; i++) {
- samBuilder.addPair(String.valueOf(i), i, i, i + 100);
- }
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next().setMateReferenceName("*");
- records.next().setMateAlignmentStart(Integer.MAX_VALUE);
- records.next().setMateAlignmentStart(records.next().getAlignmentStart() + 1);
- records.next().setMateNegativeStrandFlag(!records.next().getReadNegativeStrandFlag());
- records.next().setMateReferenceIndex(records.next().getReferenceIndex() + 1);
- records.next().setMateUnmappedFlag(!records.next().getReadUnmappedFlag());
-
-
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_ALIGNMENT_START.getHistogramString()).getValue(), 3.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_FLAG_MATE_NEG_STRAND.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_FLAG_MATE_UNMAPPED.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_MATE_ALIGNMENT_START.getHistogramString()).getValue(), 2.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISMATCH_MATE_REF_INDEX.getHistogramString()).getValue(), 2.0);
- }
-
- @Test(dataProvider = "missingMateTestCases")
- public void testMissingMate(final SAMFileHeader.SortOrder sortOrder) throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder(true, sortOrder);
-
- samBuilder.addPair(String.valueOf(1), 1, 1, 101);
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next();
- records.remove();
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.MATE_NOT_FOUND.getHistogramString()).getValue(), 1.0);
- }
-
- @DataProvider(name = "missingMateTestCases")
- public Object[][] missingMateTestCases() {
- return new Object[][]{
- {SAMFileHeader.SortOrder.coordinate},
- {SAMFileHeader.SortOrder.queryname},
- {SAMFileHeader.SortOrder.unsorted},
- };
- }
-
- @Test
- public void testUnmappedRecords() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 4; i++) {
- samBuilder.addUnmappedFragment(String.valueOf(i));
- }
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next().setReadNegativeStrandFlag(true);
- records.next().setNotPrimaryAlignmentFlag(true);
- records.next().setMappingQuality(10);
- records.next().setCigarString("36M");
-
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_NOT_PRIM_ALIGNMENT.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_MAPPING_QUALITY.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testMappedRecords() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 2; i++) {
- samBuilder.addFrag(String.valueOf(i), i, i, false);
- }
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next().setCigarString("25M3S25M");
- records.next().setReferenceName("*");
-
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_CIGAR.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_FLAG_READ_UNMAPPED.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_TAG_NM.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testNmFlagValidation() throws IOException {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
-
- for (int i = 0; i < 3; i++) {
- samBuilder.addFrag(String.valueOf(i), i, i + 1, false);
- }
- final Iterator<SAMRecord> records = samBuilder.iterator();
- records.next().setAttribute(ReservedTagConstants.NM, 4);
-
- // PIC-215: Confirm correct NM value when there is an insertion and a deletion.
- final SAMRecord recordWithInsert = records.next();
- final byte[] sequence = recordWithInsert.getReadBases();
- Arrays.fill(sequence, (byte) 'A');
- recordWithInsert.setReadBases(sequence);
- recordWithInsert.setCigarString("1D" + Integer.toString(sequence.length - 1) + "M1I");
- recordWithInsert.setAttribute(ReservedTagConstants.NM, 2);
-
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), new ReferenceSequenceFile() {
- private int index = 0;
-
- public SAMSequenceDictionary getSequenceDictionary() {
- return null;
- }
-
- public ReferenceSequence nextSequence() {
- final byte[] bases = new byte[10000];
- Arrays.fill(bases, (byte) 'A');
- return new ReferenceSequence("foo", index++, bases);
- }
-
- public void reset() {
- this.index = 0;
- }
-
- public boolean isIndexed() { return false; }
-
- public ReferenceSequence getSequence(final String contig) {
- throw new UnsupportedOperationException();
- }
-
- public ReferenceSequence getSubsequenceAt(final String contig, final long start, final long stop) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void close() throws IOException {
- //no-op
- }
- }, IndexValidationStringency.EXHAUSTIVE);
-
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_TAG_NM.getHistogramString()).getValue(), 1.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_TAG_NM.getHistogramString()).getValue(), 1.0);
- }
-
- @Test(dataProvider = "testMateCigarScenarios")
- public void testMateCigarScenarios(final String scenario, final String inputFile, final SAMValidationError.Type expectedError)
- throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, inputFile));
- final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertNotNull(results.get(expectedError.getHistogramString()));
- Assert.assertEquals(results.get(expectedError.getHistogramString()).getValue(), 1.0);
- }
-
-
- @DataProvider(name = "testMateCigarScenarios")
- public Object[][] testMateCigarScenarios() {
- return new Object[][]{
- {"invalid mate cigar", "invalid_mate_cigar_string.sam", SAMValidationError.Type.MISMATCH_MATE_CIGAR_STRING},
- {"inappropriate mate cigar", "inappropriate_mate_cigar_string.sam", SAMValidationError.Type.MATE_CIGAR_STRING_INVALID_PRESENCE}
- };
- }
-
- @Test(dataProvider = "testTruncatedScenarios")
- public void testTruncated(final String scenario, final String inputFile, final SAMValidationError.Type expectedError)
- throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, inputFile));
- final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertNotNull(results.get(expectedError.getHistogramString()));
- Assert.assertEquals(results.get(expectedError.getHistogramString()).getValue(), 1.0);
- }
-
- @DataProvider(name = "testTruncatedScenarios")
- public Object[][] testTruncatedScenarios() {
- return new Object[][]{
- {"truncated bam", "truncated.bam", SAMValidationError.Type.TRUNCATED_FILE},
- {"truncated quals", "truncated_quals.sam", SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_QUALS_LENGTH},
- // TODO: Because validation is turned off when parsing, this error is not detectable currently by validator.
- //{"truncated tag", "truncated_tag.sam", SAMValidationError.Type.TRUNCATED_FILE},
- // TODO: Currently, this is not considered an error. Should it be?
- //{"hanging tab", "hanging_tab.sam", SAMValidationError.Type.TRUNCATED_FILE},
- };
- }
-
- @Test(expectedExceptions = SAMException.class, dataProvider = "testFatalParsingErrors")
- public void testFatalParsingErrors(final String scenario, final String inputFile) throws Exception {
- final SamReader reader = SamReaderFactory.makeDefault().open(new File(TEST_DATA_DIR, inputFile));
- executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.fail("Exception should have been thrown.");
- }
-
- @DataProvider(name = "testFatalParsingErrors")
- public Object[][] testFatalParsingErrorScenarios() {
- return new Object[][]{
- {"missing fields", "missing_fields.sam"},
- {"zero length read", "zero_length_read.sam"}
- };
- }
-
- @Test
- public void testHeaderVersionValidation() throws Exception {
- final String header = "@HD VN:Hi,Mom! SO:queryname";
- final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
- final SamReader samReader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()).getValue(), 1.0);
- }
-
- @Test(enabled = false, description = "File is actually valid for Standard quality scores so this test fails with an NPE.")
- public void testQualityFormatValidation() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().open(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- final Histogram.Bin<String> bin = results.get(SAMValidationError.Type.INVALID_QUALITY_FORMAT.getHistogramString());
- final double value = bin.getValue();
- Assert.assertEquals(value, 1.0);
- }
-
- @Test
- public void testCigarOffEndOfReferenceValidation() throws Exception {
- final SAMRecordSetBuilder samBuilder = new SAMRecordSetBuilder();
- samBuilder.addFrag(String.valueOf(0), 0, 1, false);
- final int contigLength = samBuilder.getHeader().getSequence(0).getSequenceLength();
- // Should hang off the end.
- samBuilder.addFrag(String.valueOf(1), 0, contigLength - 1, false);
- final Histogram<String> results = executeValidation(samBuilder.getSamReader(), null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertNotNull(results.get(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE.getHistogramString()));
- Assert.assertEquals(results.get(SAMValidationError.Type.CIGAR_MAPS_OFF_REFERENCE.getHistogramString()).getValue(), 1.0);
- }
-
- @Test(expectedExceptions = SAMFormatException.class)
- public void testConflictingTags() throws Exception {
- final String header = "@HD VN:1.0 SO:queryname SO:coordinate";
- final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
- final SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
- Assert.fail("Exception should have been thrown.");
- }
-
- @Test
- public void testRedundantTags() throws Exception {
- final String header = "@HD VN:1.0 SO:coordinate SO:coordinate";
- final InputStream strm = new ByteArrayInputStream(StringUtil.stringToBytes(header));
- final SamReader samReader = SamReaderFactory.makeDefault().open(SamInputResource.of(strm));
- Assert.assertEquals(SAMFileHeader.SortOrder.coordinate, samReader.getFileHeader().getSortOrder());
- CloserUtil.close(samReader);
- }
-
- @Test
- public void testHeaderValidation() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open(new File(TEST_DATA_DIR, "buggyHeader.sam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.UNRECOGNIZED_HEADER_TYPE.getHistogramString()).getValue(), 3.0);
- Assert.assertEquals(results.get(SAMValidationError.Type.HEADER_TAG_MULTIPLY_DEFINED.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testPlatformMissing() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open((new File(TEST_DATA_DIR, "missing_platform_unit.sam")));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.MISSING_PLATFORM_VALUE.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testPlatformInvalid() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open((new File(TEST_DATA_DIR, "invalid_platform_unit.sam")));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_PLATFORM_VALUE.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testDuplicateRGIDs() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .open((new File(TEST_DATA_DIR, "duplicate_rg.sam")));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.DUPLICATE_READ_GROUP_ID.getHistogramString()).getValue(), 1.0);
- }
-
- @Test
- public void testIndexFileValidation() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT)
- .enable(SamReaderFactory.Option.CACHE_FILE_BASED_INDEXES).open((new File(TEST_DATA_DIR, "bad_index.bam")));
-
- Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_INDEX_FILE_POINTER.getHistogramString()).getValue(), 1.0);
-
- results = executeValidation(samReader, null, IndexValidationStringency.LESS_EXHAUSTIVE);
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_INDEX_FILE_POINTER.getHistogramString()).getValue(), 1.0);
-
- }
-
- private void testHeaderVersion(final String version, final boolean expectValid) throws Exception {
- final File samFile = File.createTempFile("validateHeader.", ".sam");
- samFile.deleteOnExit();
- final PrintWriter pw = new PrintWriter(samFile);
- pw.println("@HD\tVN:" + version);
- pw.close();
- final SamReader reader = SamReaderFactory.makeDefault().open(samFile);
- final Histogram<String> results = executeValidation(reader, null, IndexValidationStringency.EXHAUSTIVE);
- if (expectValid) Assert.assertNull(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()));
- else {
- Assert.assertNotNull(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()));
- Assert.assertEquals(results.get(SAMValidationError.Type.INVALID_VERSION_NUMBER.getHistogramString()).getValue(), 1.0);
- }
- }
-
- @Test
- public void testHeaderVersions() throws Exception {
- // Test the acceptable versions
- for (final String version : SAMFileHeader.ACCEPTABLE_VERSIONS) {
- testHeaderVersion(version, true);
- }
-
- // Test an unacceptable version
- testHeaderVersion("1.6", false);
- }
-
- @Test(enabled = false)
- public void duplicateReads() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "duplicated_reads.sam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertFalse(results.isEmpty());
- Assert.assertEquals(results.get(SAMValidationError.Type.MATES_ARE_SAME_END.getHistogramString()).getValue(), 2.0);
- }
-
- @Test
- public void duplicateReadsOutOfOrder() throws Exception {
- final SamReader samReader = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT).open(new File(TEST_DATA_DIR, "duplicated_reads_out_of_order.sam"));
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertFalse(results.isEmpty());
- Assert.assertEquals(results.get(SAMValidationError.Type.MATES_ARE_SAME_END.getHistogramString()).getValue(), 2.0);
- }
-
-
- @DataProvider(name = "TagCorrectlyProcessData")
- public Object[][] tagCorrectlyProcessData() throws IOException {
- final String E2TagCorrectlyProcessTestData =
- "@HD\tVN:1.0\tSO:unsorted\n" +
- "@SQ\tSN:chr1\tLN:101\n" +
- "@RG\tID:0\tSM:Hi,Mom!\n" +
- "E\t147\tchr1\t15\t255\t10M\t=\t2\t-30\tCAACAGAAGC\t)'.*.+2,))\tE2:Z:CAA";
-
- final String U2TagCorrectlyProcessTestData =
- "@HD\tVN:1.0\tSO:unsorted\n" +
- "@SQ\tSN:chr1\tLN:101\n" +
- "@RG\tID:0\tSM:Hi,Mom!\n" +
- "E\t147\tchr1\t15\t255\t10M\t=\t2\t-30\tCAACAGAAGC\t)'.*.+2,))\tU2:Z:CAA";
-
- return new Object[][]{
- {E2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.E2_BASE_EQUALS_PRIMARY_BASE},
- {E2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_E2_LENGTH},
- {U2TagCorrectlyProcessTestData.getBytes(), SAMValidationError.Type.MISMATCH_READ_LENGTH_AND_U2_LENGTH}
- };
- }
-
- @Test(dataProvider = "TagCorrectlyProcessData")
- public void tagCorrectlyProcessTest(byte[] bytesFromFile,
- SAMValidationError.Type errorType) throws Exception {
- final SamReader samReader = SamReaderFactory
- .makeDefault()
- .validationStringency(ValidationStringency.SILENT)
- .open(
- SamInputResource.of(
- new ByteArrayInputStream(bytesFromFile)
- )
- );
- final Histogram<String> results = executeValidation(samReader, null, IndexValidationStringency.EXHAUSTIVE);
- Assert.assertEquals(results.get(errorType.getHistogramString()).getValue(), 1.0);
- }
-
- @DataProvider(name = "validateBamFileTerminationData")
- public Object[][] validateBamFileTerminationData() throws IOException {
- return new Object[][]{
- {getBrokenFile(TERMINATION_GZIP_BLOCK_SIZE), SAMValidationError.Type.BAM_FILE_MISSING_TERMINATOR_BLOCK},
- {getBrokenFile(RANDOM_NUMBER_TRUNC_BYTE), SAMValidationError.Type.TRUNCATED_FILE}
- };
- }
-
- @Test(dataProvider = "validateBamFileTerminationData")
- public void validateBamFileTerminationTest(File file, SAMValidationError.Type errorType) throws IOException {
- final SamFileValidator samFileValidator = new SamFileValidator(new PrintWriter(System.out), 8000);
- samFileValidator.validateBamFileTermination(file);
- Assert.assertEquals(samFileValidator.getErrorsByType().get(errorType).getValue(), 1.0);
- }
-
- private Histogram<String> executeValidation(final SamReader samReader, final ReferenceSequenceFile reference,
- final IndexValidationStringency stringency) throws IOException {
- return executeValidationWithErrorIgnoring(samReader, reference, stringency, Collections.EMPTY_LIST);
- }
-
- private Histogram<String> executeValidationWithErrorIgnoring(final SamReader samReader, final ReferenceSequenceFile reference,
- final IndexValidationStringency stringency, Collection<SAMValidationError.Type> ignoringError) throws IOException {
- final File outFile = File.createTempFile("validation", ".txt");
- outFile.deleteOnExit();
-
- final PrintWriter out = new PrintWriter(outFile);
- final SamFileValidator samFileValidator = new SamFileValidator(out, 8000);
- samFileValidator.setIndexValidationStringency(stringency).setErrorsToIgnore(ignoringError);
- samFileValidator.validateSamFileSummary(samReader, reference);
-
- final LineNumberReader reader = new LineNumberReader(new FileReader(outFile));
- if (reader.readLine().equals("No errors found")) {
- return new Histogram<>();
- }
- final MetricsFile<MetricBase, String> outputFile = new MetricsFile<>();
- outputFile.read(new FileReader(outFile));
- Assert.assertNotNull(outputFile.getHistogram());
- return outputFile.getHistogram();
- }
-
- private File getBrokenFile(int truncByte) throws IOException {
- final FileChannel stream = FileChannel.open(new File(TEST_DATA_DIR + "/test_samfile_version_1pt5.bam").toPath());
- final File breakingFile = File.createTempFile("trunc", ".bam");
- breakingFile.deleteOnExit();
- FileChannel.open(breakingFile.toPath(), StandardOpenOption.WRITE).transferFrom(stream, 0, stream.size() - truncByte);
- return breakingFile;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java b/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java
deleted file mode 100644
index 6cf4934..0000000
--- a/src/test/java/htsjdk/samtools/cram/CRAIEntryTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.Slice;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CRAIEntryTest {
-
- @Test
- public void testFromContainer() {
- final Container container = new Container();
- final Slice slice = new Slice();
- slice.sequenceId = 1;
- slice.alignmentStart = 2;
- slice.alignmentSpan = 3;
- slice.containerOffset = 4;
- container.landmarks = new int[]{5};
- container.slices = new Slice[]{slice};
-
- final List<CRAIEntry> entries = CRAIEntry.fromContainer(container);
- Assert.assertNotNull(entries);
- Assert.assertEquals(entries.size(), 1);
- final CRAIEntry entry = entries.get(0);
-
- Assert.assertEquals(entry.sequenceId, slice.sequenceId);
- Assert.assertEquals(entry.alignmentStart, slice.alignmentStart);
- Assert.assertEquals(entry.alignmentSpan, slice.alignmentSpan);
- Assert.assertEquals(entry.containerStartOffset, slice.containerOffset);
- }
-
- @Test
- public void testFromCraiLine() {
- int counter = 1;
- final int sequenceId = counter++;
- final int alignmentStart = counter++;
- final int alignmentSpan = counter++;
- final int containerOffset = Integer.MAX_VALUE + counter++;
- final int sliceOffset = counter++;
- final int sliceSise = counter++;
-
- final String line = String.format("%d\t%d\t%d\t%d\t%d\t%d", sequenceId, alignmentStart, alignmentSpan, containerOffset, sliceOffset, sliceSise);
- final CRAIEntry entry = new CRAIEntry(line);
- Assert.assertNotNull(entry);
- Assert.assertEquals(entry.sequenceId, sequenceId);
- Assert.assertEquals(entry.alignmentStart, alignmentStart);
- Assert.assertEquals(entry.alignmentSpan, alignmentSpan);
- Assert.assertEquals(entry.containerStartOffset, containerOffset);
- }
-
- @Test
- public void testIntersetcsZeroSpan() {
- Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 0)));
- }
-
- @Test
- public void testIntersetcsSame() {
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 1)));
- }
-
- @Test
- public void testIntersetcsIncluded() {
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(1, 1)));
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(2, 1)));
-
- // is symmetrical?
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 1), newEntry(1, 2)));
- Assert.assertTrue(CRAIEntry.intersect(newEntry(2, 1), newEntry(1, 2)));
- }
-
- @Test
- public void testIntersetcsOvertlaping() {
- Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 2), newEntry(0, 1)));
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(0, 2)));
- Assert.assertTrue(CRAIEntry.intersect(newEntry(1, 2), newEntry(2, 1)));
- Assert.assertFalse(CRAIEntry.intersect(newEntry(1, 2), newEntry(3, 1)));
- }
-
- @Test
- public void testIntersetcsAnotherSequence() {
- Assert.assertTrue(CRAIEntry.intersect(newEntry(10, 1, 2), newEntry(10, 2, 1)));
- Assert.assertFalse(CRAIEntry.intersect(newEntry(10, 1, 2), newEntry(11, 2, 1)));
- }
-
- @Test
- public void testCompareTo () {
- final List<CRAIEntry> list = new ArrayList<CRAIEntry>(2);
- CRAIEntry e1;
- CRAIEntry e2;
-
- e1 = new CRAIEntry();
- e1.sequenceId = 100;
- e2 = new CRAIEntry();
- e2.sequenceId = 200;
- list.add(e2);
- list.add(e1);
- Assert.assertTrue(list.get(1).sequenceId < list.get(0).sequenceId);
- Collections.sort(list);
- Assert.assertTrue(list.get(0).sequenceId < list.get(1).sequenceId);
-
- list.clear();
- e1 = new CRAIEntry();
- e1.alignmentStart = 100;
- e2 = new CRAIEntry();
- e2.alignmentStart = 200;
- list.add(e2);
- list.add(e1);
- Assert.assertTrue(list.get(1).alignmentStart < list.get(0).alignmentStart);
- Collections.sort(list);
- Assert.assertTrue(list.get(0).alignmentStart < list.get(1).alignmentStart);
-
- list.clear();
- e1 = new CRAIEntry();
- e1.containerStartOffset = 100;
- e2 = new CRAIEntry();
- e2.containerStartOffset = 200;
- list.add(e2);
- list.add(e1);
- Assert.assertTrue(list.get(1).containerStartOffset < list.get(0).containerStartOffset);
- Collections.sort(list);
- Assert.assertTrue(list.get(0).containerStartOffset < list.get(1).containerStartOffset);
- }
-
- private static CRAIEntry newEntry(final int start, final int span) {
- return newEntry(1, start, span);
- }
-
- private static CRAIEntry newEntry(final int seqId, final int start, final int span) {
- final CRAIEntry e1 = new CRAIEntry();
- e1.sequenceId = seqId;
- e1.alignmentStart = start;
- e1.alignmentSpan = span;
- return e1;
- }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java b/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java
deleted file mode 100644
index 7ebdb75..0000000
--- a/src/test/java/htsjdk/samtools/cram/CRAIIndexTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.CRAMCRAIIndexer;
-import htsjdk.samtools.DiskBasedBAMFileIndex;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.seekablestream.SeekableBufferedStream;
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.BiFunction;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CRAIIndexTest {
-
- @Test
- public void testFind() throws IOException, CloneNotSupportedException {
- final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
-
- final int sequenceId = 1;
- CRAIEntry e = new CRAIEntry();
- e.sequenceId = sequenceId;
- e.alignmentStart = 1;
- e.alignmentSpan = 1;
- e.containerStartOffset = 1;
- e.sliceOffset = 1;
- e.sliceSize = 0;
- index.add(e);
-
- e = e.clone();
- e.alignmentStart = 2;
- e.containerStartOffset = 2;
- index.add(e);
-
- e = e.clone();
- e.alignmentStart = 3;
- e.containerStartOffset = 3;
- index.add(e);
-
- Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 0));
-
- Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 1));
- Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 2));
- Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 2, 1));
- Assert.assertTrue(allFoundEntriesIntersectQueryInFind(index, sequenceId, 1, 3));
-
- final int nonExistentSequenceId = 2;
- Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, nonExistentSequenceId, 2, 1));
- // a query starting beyond all entries:
- Assert.assertFalse(allFoundEntriesIntersectQueryInFind(index, sequenceId, 4, 1));
- }
-
- private boolean allFoundEntriesIntersectQueryInFind(final List<CRAIEntry> index, final int sequenceId, final int start, final int span) {
- int foundCount = 0;
- for (final CRAIEntry found : CRAIIndex.find(index, sequenceId, start, span)) {
- foundCount++;
- Assert.assertEquals(found.sequenceId, sequenceId);
- boolean intersects = false;
- for (int pos = Math.min(found.alignmentStart, start); pos <= Math.max(found.alignmentStart + found.alignmentSpan, start + span); pos++) {
- if (pos >= found.alignmentStart && pos >= start &&
- pos <= found.alignmentStart + found.alignmentSpan && pos <= start + span) {
- intersects = true;
- break;
- }
- }
- if (!intersects) {
- return false;
- }
- }
- return foundCount > 0;
- }
-
- @Test(expectedExceptions = NullPointerException.class)
- public void testCraiRequiresDictionary() throws IOException {
- try (final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final GZIPOutputStream gos = new GZIPOutputStream(baos);
- final BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
- CRAIIndex.openCraiFileAsBaiStream(bis, null);
- }
- }
-
- @Test
- public void testCraiInMemory() throws IOException {
- doCRAITest(this::getBaiStreamFromMemory);
- }
-
- @Test
- public void testCraiFromFile() throws IOException {
- doCRAITest(this::getBaiStreamFromFile);
- }
-
- private void doCRAITest(BiFunction<SAMSequenceDictionary, List<CRAIEntry>, SeekableStream> getBaiStreamForIndex) throws IOException {
- final ArrayList<CRAIEntry> index = new ArrayList<CRAIEntry>();
- final CRAIEntry entry = new CRAIEntry();
- entry.sequenceId = 0;
- entry.alignmentStart = 1;
- entry.alignmentSpan = 2;
- entry.sliceOffset = 3;
- entry.sliceSize = 4;
- entry.containerStartOffset = 5;
- index.add(entry);
-
- final SAMSequenceDictionary dictionary = new SAMSequenceDictionary();
- dictionary.addSequence(new SAMSequenceRecord("1", 100));
-
- final SeekableStream baiStream = getBaiStreamForIndex.apply(dictionary, index);
-
- final DiskBasedBAMFileIndex bamIndex = new DiskBasedBAMFileIndex(baiStream, dictionary);
- final BAMFileSpan span = bamIndex.getSpanOverlapping(entry.sequenceId, entry.alignmentStart, entry.alignmentStart);
- Assert.assertNotNull(span);
- final long[] coordinateArray = span.toCoordinateArray();
- Assert.assertEquals(coordinateArray.length, 2);
- Assert.assertEquals(coordinateArray[0] >> 16, entry.containerStartOffset);
- Assert.assertEquals(coordinateArray[1] & 0xFFFF, 1);
- }
-
- public SeekableStream getBaiStreamFromMemory(SAMSequenceDictionary dictionary, final List<CRAIEntry> index) {
- try {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SAMFileHeader samHeader = new SAMFileHeader();
- samHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(baos, samHeader);
- for (CRAIEntry entry: index) {
- indexer.addEntry(entry);
- }
- indexer.finish();
- final SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(new ByteArrayInputStream(baos.toByteArray()), dictionary);
- Assert.assertNotNull(baiStream);
- return baiStream;
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private SeekableStream getBaiStreamFromFile(SAMSequenceDictionary dictionary, final List<CRAIEntry> index) {
- try {
- final File file = File.createTempFile("test", ".crai");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
- SAMFileHeader samHeader = new SAMFileHeader();
- samHeader.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- CRAMCRAIIndexer indexer = new CRAMCRAIIndexer(fos, samHeader);
- for (CRAIEntry entry: index) {
- indexer.addEntry(entry);
- }
- indexer.finish();
- final SeekableStream baiStream = CRAIIndex.openCraiFileAsBaiStream(new SeekableBufferedStream(new SeekableFileStream(file)), dictionary);
- Assert.assertNotNull(baiStream);
- return baiStream;
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Test
- public void testGetLeftmost() throws CloneNotSupportedException {
- final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
- Assert.assertNull(CRAIIndex.getLeftmost(index));
-
- final CRAIEntry e1 = new CRAIEntry();
- e1.sequenceId = 1;
- e1.alignmentStart = 2;
- e1.alignmentSpan = 3;
- e1.containerStartOffset = 4;
- e1.sliceOffset = 5;
- e1.sliceSize = 6;
- index.add(e1);
- // trivial case of single entry in index:
- Assert.assertEquals(e1, CRAIIndex.getLeftmost(index));
-
- final CRAIEntry e2 = e1.clone();
- e2.alignmentStart = e1.alignmentStart + 1;
- index.add(e2);
- Assert.assertEquals(e1, CRAIIndex.getLeftmost(index));
- }
-
- @Test
- public void testFindLastAlignedEntry() {
- final List<CRAIEntry> index = new ArrayList<CRAIEntry>();
- Assert.assertEquals(-1, CRAIIndex.findLastAlignedEntry(index));
-
- // Scan all allowed combinations of 10 mapped/unmapped entries and assert the found last aligned entry:
- final int indexSize = 10;
- for (int lastAligned = 0; lastAligned < indexSize; lastAligned++) {
- index.clear();
- for (int i = 0; i < indexSize; i++) {
- final CRAIEntry e = new CRAIEntry();
-
- e.sequenceId = (i <= lastAligned ? 0 : -1);
- e.alignmentStart = i;
- index.add(e);
- }
- // check expectations are correct before calling findLastAlignedEntry method:
- Assert.assertTrue(index.get(lastAligned).sequenceId != -1);
- if (lastAligned < index.size() - 1) {
- Assert.assertTrue(index.get(lastAligned + 1).sequenceId == -1);
- }
- // assert the the found value matches the expectation:
- Assert.assertEquals(CRAIIndex.findLastAlignedEntry(index), lastAligned);
- }
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java b/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java
deleted file mode 100644
index 67cd483..0000000
--- a/src/test/java/htsjdk/samtools/cram/LosslessRoundTripTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.CRAMFileReader;
-import htsjdk.samtools.CRAMFileWriter;
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.CigarOperator;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Created by vadim on 19/02/2016.
- */
-public class LosslessRoundTripTest {
- @Test
- public void test_MD_NM() throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- InMemoryReferenceSequenceFile rsf = new InMemoryReferenceSequenceFile();
- rsf.add("1", "AAA".getBytes());
- ReferenceSource source = new ReferenceSource(rsf);
-
- SAMFileHeader samFileHeader = new SAMFileHeader();
- samFileHeader.addSequence(new SAMSequenceRecord("1", 3));
- samFileHeader.addReadGroup(new SAMReadGroupRecord("some read group"));
-
- CRAMFileWriter w = new CRAMFileWriter(baos, source, samFileHeader, null);
- SAMRecord record = new SAMRecord(samFileHeader);
- record.setReadName("name");
- record.setAlignmentStart(1);
- record.setReferenceIndex(0);
- record.setCigarString("3M");
- record.setReadUnmappedFlag(false);
- record.setReadBases("AAC".getBytes());
- record.setBaseQualities("!!!".getBytes());
-
- record.setAttribute("RG", "some read group");
- // setting some bizzar values to provoke test failure if the values are auto-restored while reading CRAM:
- record.setAttribute("MD", "nonsense");
- record.setAttribute("NM", 123);
- w.addAlignment(record);
- w.close();
-
- byte[] cramBytes = baos.toByteArray();
- InputStream cramInputStream = new ByteArrayInputStream(cramBytes);
- CRAMFileReader reader = new CRAMFileReader(cramInputStream, (File) null, source, ValidationStringency.STRICT);
- final SAMRecordIterator iterator = reader.getIterator();
- Assert.assertTrue(iterator.hasNext());
- SAMRecord record2 = iterator.next();
- Assert.assertNotNull(record2);
-
- Assert.assertEquals(record2, record);
- reader.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/VersionTest.java b/src/test/java/htsjdk/samtools/cram/VersionTest.java
deleted file mode 100644
index 0602eb3..0000000
--- a/src/test/java/htsjdk/samtools/cram/VersionTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package htsjdk.samtools.cram;
-
-import htsjdk.samtools.CRAMFileWriter;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.build.CramIO;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.io.CramInt;
-import htsjdk.samtools.cram.io.InputStreamUtils;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Block;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramHeader;
-import htsjdk.samtools.seekablestream.SeekableMemoryStream;
-import htsjdk.samtools.seekablestream.SeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.zip.CRC32;
-
-/**
- * Created by vadim on 18/02/2016.
- */
-public class VersionTest {
- /**
- * The test purpose is to ensure that a CRAM written by {@link CRAMFileWriter} adheres to CRAM3 specs expectations:
- * 1. version 3.+, via both actual byte comparison and CramIO API
- * 2. EOF container
- * 3. trailing 4 bytes of a container bytes are a valid crc32 of previous bytes in the container
- * 3. trailing 4 bytes of a block bytes are a valid crc32 of previous bytes in the block
- * @throws IOException
- */
- @Test
- public void test_V3() throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ReferenceSource source = new ReferenceSource((File) null);
- SAMFileHeader samFileHeader = new SAMFileHeader();
- Version version = CramVersions.CRAM_v3;
- CRAMFileWriter w = new CRAMFileWriter(baos, source, samFileHeader, null);
- SAMRecord record = new SAMRecord(samFileHeader);
- record.setReadName("name");
- record.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START);
- record.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
- record.setReadUnmappedFlag(true);
- record.setReadBases("AAA".getBytes());
- record.setBaseQualities("!!!".getBytes());
- w.addAlignment(record);
- w.close();
-
- byte[] cramBytes = baos.toByteArray();
-
- SeekableStream cramSeekableStream = new SeekableMemoryStream(cramBytes, null);
- CramHeader cramHeader = CramIO.readCramHeader(cramSeekableStream);
- Assert.assertEquals(version, cramHeader.getVersion());
-
- // read whole container:
- long containerStart = cramSeekableStream.position();
- Container container = ContainerIO.readContainer(version, cramSeekableStream);
- Assert.assertNotNull(container);
-
- // ensure EOF follows:
- Container eof = ContainerIO.readContainer(version, cramSeekableStream);
- Assert.assertNotNull(eof);
- Assert.assertTrue(eof.isEOF());
-
- // TODO: ensure there is nothing left in the stream.
-
- // position stream at the start of the 1st container:
- cramSeekableStream.seek(containerStart);
- // read only container header:
- ContainerIO.readContainerHeader(version.major, cramSeekableStream);
-
- // read the following 4 bytes of CRC32:
- int crcByteSize = 4;
- cramSeekableStream.seek(cramSeekableStream.position() - crcByteSize);
- byte[] crcBytes = InputStreamUtils.readFully(cramSeekableStream, crcByteSize);
- long firstBlockStart = cramSeekableStream.position();
-
- // rewind to 1st container start:
- cramSeekableStream.seek(containerStart);
- // read container header bytes:
- byte[] containerHeaderBytes = InputStreamUtils.readFully(cramSeekableStream, (int) (firstBlockStart - containerStart) - crcByteSize);
-
- // test that checksum matches:
- CRC32 digester = new CRC32();
- digester.update(containerHeaderBytes);
- Assert.assertEquals(container.checksum, (int) digester.getValue());
- Assert.assertEquals(CramInt.int32(crcBytes), container.checksum);
-
- // test block's crc:
- cramSeekableStream.seek(firstBlockStart);
- Block.readFromInputStream(version.major, cramSeekableStream);
- long blockByteSyze = cramSeekableStream.position() - firstBlockStart - crcByteSize;
- cramSeekableStream.seek(firstBlockStart);
- final byte[] blockBytes = InputStreamUtils.readFully(cramSeekableStream, (int) blockByteSyze);
- crcBytes = InputStreamUtils.readFully(cramSeekableStream, crcByteSize);
- digester = new CRC32();
- digester.update(blockBytes);
- Assert.assertEquals(CramInt.int32(crcBytes), (int) digester.getValue());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java b/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java
deleted file mode 100644
index a3d91cd..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/CompressionHeaderFactoryTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.encoding.readfeatures.Substitution;
-import htsjdk.samtools.cram.structure.CompressionHeader;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.EncodingID;
-import htsjdk.samtools.cram.structure.EncodingKey;
-import htsjdk.samtools.cram.structure.ReadTag;
-import htsjdk.samtools.cram.structure.SubstitutionMatrix;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 07/01/2016.
- */
-public class CompressionHeaderFactoryTest {
- @Test
- public void testAllEncodingsPresent() {
- final CompressionHeader header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), true);
- for (final EncodingKey key : EncodingKey.values()) {
- switch (key) {
- // skip test marks and unused series:
- case TV_TestMark:
- case TM_TestMark:
- case BB_bases:
- case QQ_scores:
- Assert.assertFalse(header.encodingMap.containsKey(key), "Unexpected encoding key found: " + key.name());
- continue;
- }
- Assert.assertTrue(header.encodingMap.containsKey(key), "Encoding key not found: " + key.name());
- Assert.assertNotNull(header.encodingMap.get(key));
- Assert.assertFalse(header.encodingMap.get(key).id == EncodingID.NULL);
- }
- }
-
- @Test
- public void testAP_delta() {
- boolean sorted = true;
- CompressionHeader header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), sorted);
- Assert.assertEquals(header.APDelta, sorted);
-
- sorted = false;
- header = new CompressionHeaderFactory().build(new ArrayList<>(), new SubstitutionMatrix(new long[256][256]), sorted);
- Assert.assertEquals(header.APDelta, sorted);
- }
-
- @Test
- public void testGetDataForTag() {
- final CompressionHeaderFactory factory = new CompressionHeaderFactory();
- final List<CramCompressionRecord> records = new ArrayList<>();
- final CramCompressionRecord record = new CramCompressionRecord();
- final int tagID = ReadTag.name3BytesToInt("ACi".getBytes());
- final byte[] data = new byte[]{1, 2, 3, 4};
- final ReadTag tag = new ReadTag(tagID, data, ValidationStringency.STRICT);
- record.tags = new ReadTag[]{tag};
- records.add(record);
-
- final byte[] dataForTag = factory.getDataForTag(records, tagID);
- Assert.assertEquals(dataForTag, data);
- }
-
- @Test
- public void test_buildFrequencies() {
- final CramCompressionRecord record = new CramCompressionRecord();
- final Substitution s = new Substitution();
- s.setPosition(1);
- final byte refBase = 'A';
- final byte readBase = 'C';
-
- s.setBase(readBase);
- s.setReferenceBase(refBase);
- s.setCode((byte) 1);
- record.readFeatures = new ArrayList<>();
- record.readFeatures.add(s);
- record.readLength = 2;
-
- final List<CramCompressionRecord> records = new ArrayList<>();
- records.add(record);
-
- final long[][] frequencies = CompressionHeaderFactory.buildFrequencies(records);
- for (int i = 0; i < frequencies.length; i++) {
- for (int j = 0; j < frequencies[i].length; j++) {
- if (i != refBase && j != readBase) {
- Assert.assertEquals(frequencies[i][j], 0);
- }
- }
-
- }
- Assert.assertEquals(frequencies[refBase][readBase], 1);
- }
-
- @Test
- public void test_getBestExternalCompressor() {
- try {
- Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor(null));
- Assert.fail("NPE expected for null data");
- } catch (final NullPointerException e) {
-
- }
- Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor("".getBytes()));
- Assert.assertNotNull(CompressionHeaderFactory.getBestExternalCompressor("qwe".getBytes()));
- }
-
- @Test
- public void test_geByteSizeRangeOfTagValues() {
- final List<CramCompressionRecord> records = new ArrayList<>();
- final int tagID = ReadTag.name3BytesToInt("ACi".getBytes());
- // test empty list:
- CompressionHeaderFactory.ByteSizeRange range = CompressionHeaderFactory.geByteSizeRangeOfTagValues(records, tagID);
- Assert.assertNotNull(range);
- Assert.assertEquals(range.min, Integer.MAX_VALUE);
- Assert.assertEquals(range.max, Integer.MIN_VALUE);
-
- // test single record with a single tag:
- final CramCompressionRecord record = new CramCompressionRecord();
- final byte[] data = new byte[]{1, 2, 3, 4};
- final ReadTag tag = new ReadTag(tagID, data, ValidationStringency.STRICT);
- record.tags = new ReadTag[]{tag};
- records.add(record);
-
- range = CompressionHeaderFactory.geByteSizeRangeOfTagValues(records, tagID);
- Assert.assertNotNull(range);
- Assert.assertEquals(range.min, 4);
- Assert.assertEquals(range.max, 4);
- }
-
- @Test
- public void test_getTagType() {
- Assert.assertEquals(CompressionHeaderFactory.getTagType(ReadTag.name3BytesToInt("ACi".getBytes())), 'i');
- }
-
- @Test
- public void test_getUnusedByte() {
- final byte[] data = new byte[256];
- for (int i = 0; i < data.length; i++) {
- data[i] = (byte) i;
- }
-
- int unusedByte = CompressionHeaderFactory.getUnusedByte(data);
- Assert.assertEquals(unusedByte, -1);
-
- data[5] = 0;
- unusedByte = CompressionHeaderFactory.getUnusedByte(data);
- Assert.assertEquals(unusedByte, 5);
- data[5] = 5;
-
- data[150] = 0;
- unusedByte = CompressionHeaderFactory.getUnusedByte(data);
- Assert.assertEquals(unusedByte, 150);
- }
-
- @Test
- public void test_updateSubstitutionCodes() {
- final CramCompressionRecord record = new CramCompressionRecord();
- final Substitution s = new Substitution();
- s.setPosition(1);
- final byte refBase = 'A';
- final byte readBase = 'C';
-
- s.setBase(readBase);
- s.setReferenceBase(refBase);
- record.readFeatures = new ArrayList<>();
- record.readFeatures.add(s);
- record.readLength = 2;
-
- final List<CramCompressionRecord> records = new ArrayList<>();
- records.add(record);
-
- final long[][] frequencies = new long[256][256];
- frequencies[refBase][readBase] = 1;
- SubstitutionMatrix matrix = new SubstitutionMatrix(frequencies);
-
- Assert.assertTrue(s.getCode() == -1);
- CompressionHeaderFactory.updateSubstitutionCodes(records, matrix);
- Assert.assertFalse(s.getCode() == -1);
- Assert.assertEquals(s.getCode(), matrix.code(refBase, readBase));
- }
-
- @Test
- public void test_getTagValueByteSize() {
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'i', 1), 4);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'I', 1), 4);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'c', (byte) 1), 1);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'C', -(byte) 1), 1);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 's', (short) 1), 2);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'S', -(short) 1), 2);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'A', 1), 1);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'f', 1f), 4);
-
- // string values are null-terminated:
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'Z', "blah-blah"), "blah-blah".length() + 1);
-
- // byte length of an array tag value is: element type (1 byte) + nof bytes (4 bytes) + nof elements * byte size of element
- int elementTypeLength = 1;
- int arraySizeByteLength = 4;
- int arraySize = 3;
- int byteElementSize = 1;
- int int_float_long_elementSize = 4;
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new byte[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * byteElementSize);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new int[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new float[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
- Assert.assertEquals(CompressionHeaderFactory.getTagValueByteSize((byte) 'B', new long[]{0, 1, 2}), elementTypeLength + arraySizeByteLength + arraySize * int_float_long_elementSize);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java b/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java
deleted file mode 100644
index cb004a7..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/ContainerFactoryTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import htsjdk.samtools.reference.InMemoryReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by vadim on 15/12/2015.
- */
-public class ContainerFactoryTest {
-
- @Test
- public void testUnmapped() throws IOException, IllegalAccessException {
- SAMFileHeader header = new SAMFileHeader();
-
- int recordsPerContainer = 10;
- ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i = 0; i < recordsPerContainer; i++) {
- final CramCompressionRecord record = new CramCompressionRecord();
- record.setSegmentUnmapped(true);
- record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- record.alignmentStart = SAMRecord.NO_ALIGNMENT_START;
- record.readBases = record.qualityScores = "ACGTN".getBytes();
- record.readName = Integer.toString(i);
-
- records.add(record);
- }
-
- final Container container = factory.buildContainer(records);
- Assert.assertNotNull(container);
- Assert.assertEquals(container.nofRecords, records.size());
-
- assertContainerAlignmentBoundaries(container, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX, Slice.NO_ALIGNMENT_START, Slice.NO_ALIGNMENT_SPAN);
- }
-
- @Test
- public void testMapped() throws IOException, IllegalAccessException {
- InMemoryReferenceSequenceFile refFile = new InMemoryReferenceSequenceFile();
- String refName = "1";
- String refString = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
- refFile.add(refName, refString.getBytes());
- ReferenceSource source = new ReferenceSource(refFile);
- SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord(refName, refString.length()));
- int sequenceId = header.getSequenceIndex(refName);
-
- int recordsPerContainer = 10;
- byte[] bases = "AAAAA".getBytes();
- int readLength = bases.length;
- int alignmentStartOffset = 3;
- ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
- List<CramCompressionRecord> records = new ArrayList<>();
- int span = 0;
- for (int i = 0; i < recordsPerContainer; i++) {
- final CramCompressionRecord record = new CramCompressionRecord();
- record.setSegmentUnmapped(false);
- record.sequenceId = sequenceId;
- record.alignmentStart = alignmentStartOffset + i;
- record.readBases = record.qualityScores = bases;
- record.readName = Integer.toString(i);
- record.readLength = readLength;
- record.readFeatures = Collections.emptyList();
-
- records.add(record);
- span = record.alignmentStart + readLength - alignmentStartOffset;
- }
-
- final Container container = factory.buildContainer(records);
- Assert.assertNotNull(container);
- Assert.assertEquals(container.nofRecords, records.size());
-
- assertContainerAlignmentBoundaries(container, sequenceId, alignmentStartOffset, span);
- }
-
- @Test
- public void testMultiref() throws IOException, IllegalAccessException {
- SAMFileHeader header = new SAMFileHeader();
- header.addSequence(new SAMSequenceRecord("1", 100));
- header.addSequence(new SAMSequenceRecord("2", 200));
-
- int recordsPerContainer = 10;
- byte[] bases = "AAAAA".getBytes();
- int readLength = bases.length;
- int alignmentStartOffset = 3;
- ContainerFactory factory = new ContainerFactory(header, recordsPerContainer);
-
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i = 0; i < recordsPerContainer; i++) {
- final CramCompressionRecord record = new CramCompressionRecord();
- record.setSegmentUnmapped(false);
- record.sequenceId = i % 2;
- record.alignmentStart = alignmentStartOffset + i;
- record.readBases = record.qualityScores = bases;
- record.readName = Integer.toString(i);
- record.readLength = readLength;
- record.readFeatures = Collections.emptyList();
-
- records.add(record);
- }
-
- final Container container = factory.buildContainer(records);
- Assert.assertNotNull(container);
- Assert.assertEquals(container.nofRecords, records.size());
-
- assertContainerAlignmentBoundaries(container, Slice.MULTI_REFERENCE, Slice.NO_ALIGNMENT_START, Slice.NO_ALIGNMENT_SPAN);
- }
-
-
- private void assertContainerAlignmentBoundaries(Container container, int sequenceId, int alignmentStart, int alignmentSpan) {
- Assert.assertEquals(container.sequenceId, sequenceId);
- Assert.assertEquals(container.alignmentStart, alignmentStart);
- Assert.assertEquals(container.alignmentSpan, alignmentSpan);
-
- if (sequenceId == SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX || sequenceId == Slice.MULTI_REFERENCE) {
- Assert.assertEquals(container.alignmentStart, Slice.NO_ALIGNMENT_START);
- Assert.assertEquals(container.alignmentSpan, Slice.NO_ALIGNMENT_SPAN);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java b/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java
deleted file mode 100644
index fe25ce6..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/ContainerParserTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.common.Version;
-import htsjdk.samtools.cram.structure.AlignmentSpan;
-import htsjdk.samtools.cram.structure.Container;
-import htsjdk.samtools.cram.structure.ContainerIO;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.cram.structure.Slice;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by vadim on 11/01/2016.
- */
-public class ContainerParserTest {
-
- @Test
- public void testEOF() throws IOException, IllegalAccessException {
- ContainerParser parser = new ContainerParser(new SAMFileHeader());
- ByteArrayOutputStream v2_baos = new ByteArrayOutputStream();
- Version version = CramVersions.CRAM_v2_1;
- CramIO.issueEOF(version, v2_baos);
- Container container = ContainerIO.readContainer(version, new ByteArrayInputStream(v2_baos.toByteArray()));
- Assert.assertTrue(container.isEOF());
- Assert.assertTrue(parser.getRecords(container, null, ValidationStringency.STRICT).isEmpty());
-
- ByteArrayOutputStream v3_baos = new ByteArrayOutputStream();
- version = CramVersions.CRAM_v3;
- CramIO.issueEOF(version, v3_baos);
- container = ContainerIO.readContainer(version, new ByteArrayInputStream(v3_baos.toByteArray()));
- Assert.assertTrue(container.isEOF());
- Assert.assertTrue(parser.getRecords(container, null, ValidationStringency.STRICT).isEmpty());
- }
-
- @Test
- public void testSingleRefContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i=0; i<10; i++) {
- CramCompressionRecord record = new CramCompressionRecord();
- record.readBases="AAA".getBytes();
- record.qualityScores="!!!".getBytes();
- record.setSegmentUnmapped(false);
- record.readName=""+i;
- record.sequenceId=0;
- record.setLastSegment(true);
- record.readFeatures = Collections.emptyList();
-
- records.add(record);
- }
-
- Container container = factory.buildContainer(records);
- Assert.assertEquals(container.nofRecords, 10);
- Assert.assertEquals(container.sequenceId, 0);
-
- ContainerParser parser = new ContainerParser(samFileHeader);
- final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
- Assert.assertNotNull(referenceSet);
- Assert.assertEquals(referenceSet.size(), 1);
- Assert.assertTrue(referenceSet.containsKey(0));
- }
-
- @Test
- public void testUnmappedContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i=0; i<10; i++) {
- CramCompressionRecord record = new CramCompressionRecord();
- record.readBases="AAA".getBytes();
- record.qualityScores="!!!".getBytes();
- record.setSegmentUnmapped(true);
- record.readName=""+i;
- record.sequenceId= SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- record.setLastSegment(true);
-
- records.add(record);
- }
-
- Container container = factory.buildContainer(records);
- Assert.assertEquals(container.nofRecords, 10);
- Assert.assertEquals(container.sequenceId, SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX);
-
- ContainerParser parser = new ContainerParser(samFileHeader);
- final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
- Assert.assertNotNull(referenceSet);
- Assert.assertEquals(referenceSet.size(), 1);
- Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
-
- }
-
- @Test
- public void testMappedAndUnmappedContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i=0; i<10; i++) {
- CramCompressionRecord record = new CramCompressionRecord();
- record.readBases="AAA".getBytes();
- record.qualityScores="!!!".getBytes();
- record.readName=""+i;
- record.alignmentStart=i+1;
-
- record.setMultiFragment(false);
- if (i%2==0) {
- record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- record.setSegmentUnmapped(true);
- } else {
- record.sequenceId=0;
- record.readFeatures = Collections.emptyList();
- record.setSegmentUnmapped(false);
- }
- records.add(record);
- }
-
-
-
- Container container = factory.buildContainer(records);
- Assert.assertEquals(container.nofRecords, 10);
- Assert.assertEquals(container.sequenceId, Slice.MULTI_REFERENCE);
-
- ContainerParser parser = new ContainerParser(samFileHeader);
- final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
- Assert.assertNotNull(referenceSet);
- Assert.assertEquals(referenceSet.size(), 2);
- Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- Assert.assertTrue(referenceSet.containsKey(0));
- }
-
- @Test
- public void testMultirefContainer() throws IOException, IllegalAccessException {
- SAMFileHeader samFileHeader = new SAMFileHeader();
- ContainerFactory factory = new ContainerFactory(samFileHeader, 10);
- List<CramCompressionRecord> records = new ArrayList<>();
- for (int i=0; i<10; i++) {
- CramCompressionRecord record = new CramCompressionRecord();
- record.readBases="AAA".getBytes();
- record.qualityScores="!!!".getBytes();
- record.readName=""+i;
- record.alignmentStart=i+1;
- record.readLength = 3;
-
- record.setMultiFragment(false);
- if (i < 9) {
- record.sequenceId=i;
- record.readFeatures = Collections.emptyList();
- record.setSegmentUnmapped(false);
- } else {
- record.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
- record.setSegmentUnmapped(true);
- }
- records.add(record);
- }
-
- Container container = factory.buildContainer(records);
- Assert.assertEquals(container.nofRecords, 10);
- Assert.assertEquals(container.sequenceId, Slice.MULTI_REFERENCE);
-
- ContainerParser parser = new ContainerParser(samFileHeader);
- final Map<Integer, AlignmentSpan> referenceSet = parser.getReferences(container, ValidationStringency.STRICT);
- Assert.assertNotNull(referenceSet);
- Assert.assertEquals(referenceSet.size(), 10);
- Assert.assertTrue(referenceSet.containsKey(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX));
- for (int i=0; i<9; i++) {
- Assert.assertTrue(referenceSet.containsKey(i));
- AlignmentSpan span = referenceSet.get(i);
- Assert.assertEquals(span.getCount(), 1);
- Assert.assertEquals(span.getStart(), i+1);
- Assert.assertEquals(span.getSpan(), 3);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java b/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java
deleted file mode 100644
index 1035f24..0000000
--- a/src/test/java/htsjdk/samtools/cram/build/CramIOTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package htsjdk.samtools.cram.build;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.structure.CramHeader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * Created by vadim on 25/08/2015.
- */
-public class CramIOTest {
- @Test
- public void testCheckHeaderAndEOF_v2() throws IOException {
- final String id = "testid";
-
- final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v2_1, id, new SAMFileHeader());
- final File file = File.createTempFile("test", ".cram");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
- CramIO.writeCramHeader(cramHeader, fos);
- CramIO.issueEOF(cramHeader.getVersion(), fos);
- fos.close();
-
- Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
- file.delete();
- }
-
- @Test
- public void testCheckHeaderAndEOF_v3() throws IOException {
- final String id = "testid";
-
- final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v3, id, new SAMFileHeader());
- final File file = File.createTempFile("test", ".cram");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
- CramIO.writeCramHeader(cramHeader, fos);
- CramIO.issueEOF(cramHeader.getVersion(), fos);
- fos.close();
-
- Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
- file.delete();
- }
-
- @Test
- public void testReplaceCramHeader() throws IOException {
- final String id = "testid";
-
- final CramHeader cramHeader = new CramHeader(CramVersions.CRAM_v3, id, new SAMFileHeader());
- Assert.assertTrue(cramHeader.getSamFileHeader().getSequenceDictionary().isEmpty());
- final File file = File.createTempFile("test", ".cram");
- file.deleteOnExit();
- final FileOutputStream fos = new FileOutputStream(file);
- CramIO.writeCramHeader(cramHeader, fos);
- CramIO.issueEOF(cramHeader.getVersion(), fos);
- fos.close();
- final long length = file.length();
-
- final SAMFileHeader samFileHeader = new SAMFileHeader();
- final SAMSequenceRecord sequenceRecord = new SAMSequenceRecord("1", 123);
- samFileHeader.addSequence(sequenceRecord);
- final String id2 = "testid2";
- final CramHeader cramHeader2 = new CramHeader(CramVersions.CRAM_v3, id2, samFileHeader);
- final boolean replaced = CramIO.replaceCramHeader(file, cramHeader2);
- Assert.assertTrue(replaced);
- Assert.assertEquals(file.length(), length);
- Assert.assertTrue(CramIO.checkHeaderAndEOF(file));
-
- final CramHeader cramHeader3 = CramIO.readCramHeader(new FileInputStream(file));
- Assert.assertEquals(cramHeader3.getVersion(), CramVersions.CRAM_v3);
- Assert.assertFalse(cramHeader3.getSamFileHeader().getSequenceDictionary().isEmpty());
- Assert.assertNotNull(cramHeader3.getSamFileHeader().getSequenceDictionary().getSequence(0));
- Assert.assertEquals(cramHeader3.getSamFileHeader().getSequence(sequenceRecord.getSequenceName()).getSequenceLength(), sequenceRecord.getSequenceLength());
- file.delete();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java b/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java
deleted file mode 100644
index f2ca2f2..0000000
--- a/src/test/java/htsjdk/samtools/cram/encoding/huffman/codec/HuffmanTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package htsjdk.samtools.cram.encoding.huffman.codec;
-
-import htsjdk.samtools.cram.io.DefaultBitInputStream;
-import htsjdk.samtools.cram.io.DefaultBitOutputStream;
-import htsjdk.samtools.cram.structure.ReadTag;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-/**
- * Created by vadim on 22/04/2015.
- */
-public class HuffmanTest {
- @Test
- public void testHuffmanIntHelper() throws IOException {
- int size = 1000000;
-
- HuffmanParamsCalculator cal = new HuffmanParamsCalculator();
- cal.add(ReadTag.nameType3BytesToInt("OQ", 'Z'), size);
- cal.add(ReadTag.nameType3BytesToInt("X0", 'C'), size);
- cal.add(ReadTag.nameType3BytesToInt("X0", 'c'), size);
- cal.add(ReadTag.nameType3BytesToInt("X0", 's'), size);
- cal.add(ReadTag.nameType3BytesToInt("X1", 'C'), size);
- cal.add(ReadTag.nameType3BytesToInt("X1", 'c'), size);
- cal.add(ReadTag.nameType3BytesToInt("X1", 's'), size);
- cal.add(ReadTag.nameType3BytesToInt("XA", 'Z'), size);
- cal.add(ReadTag.nameType3BytesToInt("XC", 'c'), size);
- cal.add(ReadTag.nameType3BytesToInt("XT", 'A'), size);
- cal.add(ReadTag.nameType3BytesToInt("OP", 'i'), size);
- cal.add(ReadTag.nameType3BytesToInt("OC", 'Z'), size);
- cal.add(ReadTag.nameType3BytesToInt("BQ", 'Z'), size);
- cal.add(ReadTag.nameType3BytesToInt("AM", 'c'), size);
-
- cal.calculate();
-
- HuffmanIntHelper helper = new HuffmanIntHelper(cal.values(), cal.bitLens());
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DefaultBitOutputStream bos = new DefaultBitOutputStream(baos);
-
- for (int i = 0; i < size; i++) {
- for (int b : cal.values()) {
- helper.write(bos, b);
- }
- }
-
- bos.close();
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- DefaultBitInputStream bis = new DefaultBitInputStream(bais);
-
- int counter = 0;
- for (int i = 0; i < size; i++) {
- for (int b : cal.values()) {
- int v = helper.read(bis);
- if (v != b) {
- Assert.fail("Mismatch: " + v + " vs " + b + " at " + counter);
- }
-
- counter++;
- }
- }
- }
-
- @Test
- public void testHuffmanByteHelper() throws IOException {
- int size = 1000000;
-
- long time5 = System.nanoTime();
- HuffmanParamsCalculator cal = new HuffmanParamsCalculator();
- for (byte i = 33; i < 33 + 15; i++) {
- cal.add(i);
- }
- cal.calculate();
-
- HuffmanByteHelper helper = new HuffmanByteHelper(cal.valuesAsBytes(), cal.bitLens());
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DefaultBitOutputStream bos = new DefaultBitOutputStream(baos);
-
- for (int i = 0; i < size; i++) {
- for (byte b : cal.valuesAsBytes()) {
- helper.write(bos, b);
- }
- }
-
- bos.close();
-
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- DefaultBitInputStream bis = new DefaultBitInputStream(bais);
-
- int counter = 0;
- for (int i = 0; i < size; i++) {
- for (int b : cal.values()) {
- int v = helper.read(bis);
- if (v != b) {
- Assert.fail("Mismatch: " + v + " vs " + b + " at " + counter);
- }
-
- counter++;
- }
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java b/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java
deleted file mode 100644
index ca84686..0000000
--- a/src/test/java/htsjdk/samtools/cram/encoding/rans/RansTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package htsjdk.samtools.cram.encoding.rans;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Created by vadim on 22/04/2015.
- */
-public class RansTest {
- @Test
- public void testEmpty() {
- roundTrip(new byte[0]);
- }
-
- @Test
- public void testOneByte() {
- roundTrip(new byte[] { 0 });
- }
-
- @Test
- public void testTwoByte() {
- roundTrip(new byte[] { 0, 1 });
- }
-
- @Test
- public void testThreeByte() {
- roundTrip(new byte[] { 0, 1, 2 });
- }
-
- @Test
- public void testFourBytes() {
- roundTrip(new byte[] { 0, 1, 2, 3 });
- }
-
- @Test
- public void testByteRange() {
- byte[] data = new byte[256];
- for (int i = 0; i < data.length; i++)
- data[i] = (byte) i;
- roundTrip(data);
- }
-
- @Test
- public void testZeroBytes() {
- roundTrip(new byte[1000]);
- }
-
- @Test
- public void testUniBytes() {
- byte[] data = new byte[1000];
- Arrays.fill(data, (byte) 1);
- roundTrip(data);
- }
-
- @Test
- public void testZeroOneStretches() {
- byte[] data = new byte[1000];
- Arrays.fill(data, data.length / 2, data.length, (byte) 1);
- roundTrip(data);
- }
-
- @Test
- public void testByteMin() {
- byte[] data = new byte[1000];
- Arrays.fill(data, Byte.MIN_VALUE);
- roundTrip(data);
- }
-
- @Test
- public void testByteMax() {
- byte[] data = new byte[1000];
- Arrays.fill(data, Byte.MAX_VALUE);
- roundTrip(data);
- }
-
- @Test
- public void test1000_0dot1() {
- roundTrip(randomBytes_GD(1000, 0.1));
- }
-
- @Test
- public void test1000_0dot01() {
- roundTrip(randomBytes_GD(1000, 0.01));
- }
-
- @Test
- public void testSizeRange_tiny() {
- for (int i = 0; i < 20; i++) {
- byte[] data = randomBytes_GD(100, 0.1);
- ByteBuffer in = ByteBuffer.wrap(data);
- for (int size = 1; size < data.length; size++) {
- in.position(0);
- in.limit(size);
- try {
- roundTrip(in);
- } catch (AssertionError e) {
- System.err.printf("Failed at size %d and data %s\n", size,
- Arrays.toString(data));
- throw e;
- }
- }
- }
- }
-
- @Test
- public void testSizeRange_small() {
- byte[] data = randomBytes_GD(1000, 0.01);
- ByteBuffer in = ByteBuffer.wrap(data);
- for (int size = 4; size < data.length; size++) {
- in.position(0);
- in.limit(size);
- roundTrip(in);
- }
- }
-
- @Test
- public void testLargeSize() {
- int size = 100 * 1000 + 3;
- byte[] data = randomBytes_GD(size, 0.01);
- ByteBuffer in = ByteBuffer.wrap(data);
- for (int limit = size - 4; limit < size; limit++) {
- in.position(0);
- in.limit(limit);
- roundTrip(in);
- }
- }
-
- @Test
- public void testXLSize() {
- int size = 10 * 1000 * 1000 + 1;
- roundTrip(randomBytes_GD(size, 0.01));
- }
-
- @Test
- public void testBuffersMeetBoundaryExpectations() {
- int size = 1001;
- ByteBuffer raw = ByteBuffer.wrap(randomBytes_GD(size, 0.01));
- for (RANS.ORDER order : RANS.ORDER.values()) {
- ByteBuffer compressed = RANS.compress(raw, order, null);
- Assert.assertFalse(raw.hasRemaining());
- Assert.assertEquals(raw.limit(), size);
-
- Assert.assertEquals(compressed.position(), 0);
- Assert.assertTrue(compressed.limit() > 10);
- Assert.assertEquals(compressed.get(), (byte) order.ordinal());
- Assert.assertEquals(compressed.getInt(), compressed.limit() - 1 - 4 - 4);
- Assert.assertEquals(compressed.getInt(), size);
- compressed.rewind();
-
- ByteBuffer uncompressed = RANS.uncompress(compressed, null);
- Assert.assertFalse(compressed.hasRemaining());
- Assert.assertEquals(uncompressed.limit(), size);
- Assert.assertEquals(uncompressed.position(), 0);
-
- raw.rewind();
- }
- }
-
- @Test
- public void testRansHeader() {
- byte[] data = randomBytes_GD(1000, 0.01);
- ByteBuffer compressed = RANS.compress(ByteBuffer.wrap(data),
- RANS.ORDER.ZERO, null);
- Assert.assertEquals(compressed.get(), (byte) 0);
- Assert.assertEquals(compressed.getInt(), compressed.limit() - 9);
- Assert.assertEquals(compressed.getInt(), data.length);
- }
-
- private static void roundTrip(ByteBuffer data) {
- for (RANS.ORDER order : RANS.ORDER.values()) {
- roundTrip(data, order);
- data.rewind();
- }
- }
-
- private static void roundTrip(byte[] data) {
- for (RANS.ORDER order : RANS.ORDER.values())
- roundTrip(data, order);
- }
-
- private static void roundTrip(ByteBuffer data, RANS.ORDER order) {
- ByteBuffer compressed = RANS.compress(data, order, null);
- ByteBuffer uncompressed = RANS.uncompress(compressed, null);
- data.rewind();
- while (data.hasRemaining()) {
- if (!uncompressed.hasRemaining())
- Assert.fail("Premature end of uncompressed data.");
- Assert.assertEquals(uncompressed.get(), data.get());
- }
- Assert.assertFalse(uncompressed.hasRemaining());
- }
-
- private static void roundTrip(byte[] data, RANS.ORDER order) {
- roundTrip(ByteBuffer.wrap(data), order);
- }
-
- private Random random = new Random();
-
- private byte[] randomBytes_GD(int size, double p) {
- byte[] data = new byte[size];
- randomBytes_GD(data, p);
- return data;
- }
-
- private void randomBytes_GD(byte[] data, double p) {
- for (int i = 0; i < data.length; i++)
- data[i] = randomByteGeometricDistribution(p);
- }
-
- /**
- * A crude implementation of RNG for sampling geometric distribution. The
- * value returned is offset by -1 to include zero. For testing purposes
- * only, no refunds!
- *
- * @param p
- * the probability of success
- * @return an almost random byte value.
- */
- private byte randomByteGeometricDistribution(double p) {
- double rand = random.nextDouble();
- double g = Math.ceil(Math.log(1 - rand) / Math.log(1 - p)) - 1;
- return (byte) g;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java b/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java
deleted file mode 100644
index 5d95d2c..0000000
--- a/src/test/java/htsjdk/samtools/cram/io/ITF8Test.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import htsjdk.samtools.util.Tuple;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Created by vadim on 03/02/2015.
- */
-public class ITF8Test {
-
- private ExposedByteArrayOutputStream testBAOS;
- private ByteArrayInputStream testBAIS;
-
- @BeforeClass
- public void initialize() {
- testBAOS = new ExposedByteArrayOutputStream();
- testBAIS = new ByteArrayInputStream(testBAOS.getBuffer());
- }
-
- @BeforeMethod
- public void reset() {
- testBAOS.reset();
- testBAIS.reset();
- }
-
-
- @DataProvider(name = "testITF8")
- public static Object[][] testValues() {
- List<Integer> list = new ArrayList<Integer>() ;
-
- // basics:
- list.add(0);
- list.add(1);
- list.add(127);
- list.add(128);
- list.add(255);
- list.add(256);
- list.add(-1);
-
- // scan with bits:
- for (int i = 0; i <= 32; i++) {
- list.add((1 << i) - 2);
- list.add((1 << i) - 1);
- list.add(1 << i);
- list.add((1 << i) + 1);
- list.add((1 << i) + 1);
- }
-
- // special cases:
- list.add(Integer.MAX_VALUE) ;
- list.add(Integer.MIN_VALUE);
- list.add(268435456);
-
- Object[][] params = new Object[list.size()][] ;
- for (int i=0; i<params.length; i++)
- params[i] = new Object[]{list.get(i)} ;
- return params;
- }
-
- @Test(dataProvider = "testITF8")
- public void testITF8(int value) throws IOException {
- int len = ITF8.writeUnsignedITF8(value, testBAOS);
- Assert.assertTrue(len <= (8 * 9));
-
- long result = ITF8.readUnsignedITF8(testBAIS);
- Assert.assertEquals(value, result);
- }
-
- @DataProvider(name = "predefined")
- public static Object[][] predefinedProvider() {
- List<Tuple<Integer, byte[]>> list = new ArrayList<Tuple<Integer, byte[]>>() ;
- list.add(new Tuple<Integer, byte[]>(4542278, new byte[]{(byte) (0xFF & 224), 69, 79, 70})) ;
- list.add(new Tuple<Integer, byte[]>(16384, new byte[]{-64, 64, 0})) ;
- list.add(new Tuple<Integer, byte[]>(192, new byte[]{-128, -64})) ;
- list.add(new Tuple<Integer, byte[]>(-4757, new byte[]{-1, -1, -2, -42, 107})) ;
-
- Object[][] params = new Object[list.size()][] ;
- for (int i=0; i<params.length; i++)
- params[i] = new Object[]{list.get(i).a, list.get(i).b} ;
- return params;
- }
-
- @Test(dataProvider = "predefined")
- public void testPredefined (int value, byte[] itf8) {
- final byte[] bytes = ITF8.writeUnsignedITF8(value);
- Assert.assertEquals(itf8, bytes);
-
- int n = ITF8.readUnsignedITF8(itf8);
- Assert.assertEquals(value, n);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java b/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java
deleted file mode 100644
index 5103797..0000000
--- a/src/test/java/htsjdk/samtools/cram/io/LTF8Test.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package htsjdk.samtools.cram.io;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vadim on 03/02/2015.
- */
-public class LTF8Test {
-
- private ExposedByteArrayOutputStream ltf8TestBAOS;
- private ByteArrayInputStream ltf8TestBAIS;
-
- @BeforeClass
- public void initialize() {
- ltf8TestBAOS = new ExposedByteArrayOutputStream();
- ltf8TestBAIS = new ByteArrayInputStream(ltf8TestBAOS.getBuffer());
- }
-
- @BeforeMethod
- public void reset() {
- ltf8TestBAOS.reset();
- ltf8TestBAIS.reset();
- }
-
-
- @DataProvider(name = "testLTF8")
- public static Object[][] testValues() {
- List<Long> list = new ArrayList<Long>() ;
-
- // basics:
- list.add(0L);
- list.add(0L);
- list.add(1L);
- list.add(127L);
- list.add(128L);
- list.add(255L);
- list.add(256L);
-
- // scan with bits:
- for (int i = 0; i <= 64; i++) {
- list.add((1L << i) - 2);
- list.add((1L << i) - 1);
- list.add(1L << i);
- list.add((1L << i) + 1);
- list.add((1L << i) + 1);
- }
-
- // special cases:
- list.add(1125899906842622L) ;
- list.add(1125899906842622L);
- list.add(562949953421312L);
- list.add(4294967296L);
- list.add(268435456L);
- list.add(2147483648L);
- list.add(-1L);
-
- Object[][] params = new Object[list.size()][] ;
- for (int i=0; i<params.length; i++)
- params[i] = new Object[]{list.get(i)} ;
- return params;
- }
-
- @Test(dataProvider = "testLTF8")
- public void testLTF8(long value) throws IOException {
- int len = LTF8.writeUnsignedLTF8(value, ltf8TestBAOS);
- Assert.assertTrue(len <= (8 * 9));
-
- long result = LTF8.readUnsignedLTF8(ltf8TestBAIS);
- Assert.assertEquals(value, result);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java b/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java
deleted file mode 100644
index 34b4676..0000000
--- a/src/test/java/htsjdk/samtools/cram/lossy/QualityScorePreservationTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package htsjdk.samtools.cram.lossy;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.cram.build.CramNormalizer;
-import htsjdk.samtools.cram.build.Sam2CramRecordFactory;
-import htsjdk.samtools.cram.common.CramVersions;
-import htsjdk.samtools.cram.ref.ReferenceTracks;
-import htsjdk.samtools.cram.structure.CramCompressionRecord;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-public class QualityScorePreservationTest {
-
- @Test
- public void test1() {
- QualityScorePreservation p = new QualityScorePreservation("m999_8");
- List<PreservationPolicy> policies = p.getPreservationPolicies();
-
- assertNotNull(p);
- assertEquals(policies.size(), 1);
-
- PreservationPolicy policy0 = policies.get(0);
- assertEquals(policy0.readCategory.type,
- ReadCategoryType.LOWER_MAPPING_SCORE);
-
- assertEquals(policy0.readCategory.param, 999);
-
- if (policy0.baseCategories != null)
- assertEquals(policy0.baseCategories.isEmpty(), true);
-
- QualityScoreTreatment treatment = policy0.treatment;
- assertNotNull(treatment);
-
- assertEquals(treatment.type, QualityScoreTreatmentType.BIN);
- assertEquals(treatment.param, 8);
- }
-
- @Test
- public void test2() {
- QualityScorePreservation p = new QualityScorePreservation("R8-N40");
- List<PreservationPolicy> policies = p.getPreservationPolicies();
-
- assertNotNull(p);
- assertEquals(policies.size(), 2);
-
- {
- PreservationPolicy policy0 = policies.get(0);
- assertNull(policy0.readCategory);
-
- List<BaseCategory> baseCategories = policy0.baseCategories;
- assertNotNull(baseCategories);
- assertEquals(baseCategories.size(), 1);
-
- BaseCategory c0 = baseCategories.get(0);
- assertEquals(c0.type, BaseCategoryType.MATCH);
- assertEquals(c0.param, -1);
-
- QualityScoreTreatment treatment = policy0.treatment;
- assertNotNull(treatment);
-
- assertEquals(treatment.type, QualityScoreTreatmentType.BIN);
- assertEquals(treatment.param, 8);
- }
-
- {
- PreservationPolicy policy1 = policies.get(1);
- assertNull(policy1.readCategory);
-
- List<BaseCategory> baseCategories = policy1.baseCategories;
- assertNotNull(baseCategories);
- assertEquals(baseCategories.size(), 1);
-
- BaseCategory c0 = baseCategories.get(0);
- assertEquals(c0.type, BaseCategoryType.MISMATCH);
- assertEquals(c0.param, -1);
-
- QualityScoreTreatment treatment = policy1.treatment;
- assertNotNull(treatment);
-
- assertEquals(treatment.type, QualityScoreTreatmentType.PRESERVE);
- assertEquals(treatment.param, 40);
- }
- }
-
- private SAMFileHeader samFileHeader = new SAMFileHeader();
-
- private SAMRecord buildSAMRecord(String seqName, String line) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- baos.write("@HD\tVN:1.0\tGO:none SO:coordinate\n".getBytes());
- baos.write(("@SQ\tSN:" + seqName + "\tLN:247249719\n").getBytes());
- baos.write(line.replaceAll("\\s+", "\t").getBytes());
- baos.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
- SamReader reader = SamReaderFactory.makeDefault().open(SamInputResource.of(bais));
- try {
- return reader.iterator().next();
- } finally {
- CloserUtil.close(reader);
- }
- }
-
- @Test
- public void test3() {
- String line1 = "98573 0 20 1 10 40M * 0 0 AAAAAAAAAA !!!!!!!!!!";
- String seqName = "20";
-
- byte[] ref = new byte[40];
- Arrays.fill(ref, (byte) 'A');
- SAMRecord record = buildSAMRecord(seqName, line1);
- byte[] b1 = new byte[40];
- Arrays.fill(b1, (byte) 'A');
- byte[] s1 = new byte[40];
- for (int i = 0; i < s1.length; i++)
- s1[i] = 0;
-
- record.setReadBases(b1);
- record.setBaseQualities(s1);
-
- QualityScorePreservation p = new QualityScorePreservation("R8-*40");
- byte[] scores = compressScores(record, ref, p);
- assertEquals(record.getBaseQualities(), scores);
-
- Arrays.fill(record.getReadBases(), (byte)'C') ;
- scores = compressScores(record, ref, p);
- assertEquals(record.getBaseQualities(), scores);
- for (int i=0; i<scores.length; i++) {
- Assert.assertEquals(scores[i], Binning.ILLUMINA_BINNING_MATRIX[record.getBaseQualities()[i]]);
- }
- }
-
- private byte[] compressScores (SAMRecord record, byte[] ref, QualityScorePreservation p) {
- ReferenceTracks tracks = new ReferenceTracks(0, record.getReferenceName(), ref);
-
- Sam2CramRecordFactory f = new Sam2CramRecordFactory(ref, record.getHeader(), CramVersions.CRAM_v3);
- CramCompressionRecord cramRecord = f.createCramRecord(record);
-
- p.addQualityScores(record, cramRecord, tracks);
- if (!cramRecord.isForcePreserveQualityScores()) {
- CramNormalizer.restoreQualityScores((byte) 30, Collections.singletonList(cramRecord));
- }
- return cramRecord.qualityScores;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java b/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java
deleted file mode 100644
index 852a513..0000000
--- a/src/test/java/htsjdk/samtools/cram/ref/EnaRefServiceTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package htsjdk.samtools.cram.ref;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class EnaRefServiceTest {
-
- @Test
- public void test() throws IOException, EnaRefService.GaveUpException {
- Assert.assertNotNull(new EnaRefService().getSequence("57151e6196306db5d9f33133572a5482"));
- Assert.assertNotNull(new EnaRefService().getSequence("0000088cbcebe818eb431d58c908c698"));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java b/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java
deleted file mode 100644
index 03360bd..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/CramCompressionRecordTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.cram.encoding.readfeatures.Deletion;
-import htsjdk.samtools.cram.encoding.readfeatures.InsertBase;
-import htsjdk.samtools.cram.encoding.readfeatures.Insertion;
-import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature;
-import htsjdk.samtools.cram.encoding.readfeatures.SoftClip;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-
-/**
- * Created by vadim on 28/09/2015.
- */
-public class CramCompressionRecordTest {
- @Test
- public void test_getAlignmentEnd() {
- CramCompressionRecord r = new CramCompressionRecord();
- r.alignmentStart = 1;
- r.setSegmentUnmapped(true);
- Assert.assertEquals(r.getAlignmentEnd(), SAMRecord.NO_ALIGNMENT_START);
-
- r = new CramCompressionRecord();
- int readLength = 100;
- r.alignmentStart = 1;
- r.readLength = readLength;
- r.setSegmentUnmapped(false);
- Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1);
-
- r = new CramCompressionRecord();
- r.alignmentStart = 1;
- r.readLength = readLength;
- r.setSegmentUnmapped(false);
- r.readFeatures = new ArrayList<ReadFeature>();
- String softClip = "AAA";
- r.readFeatures.add(new SoftClip(1, softClip.getBytes()));
- Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - softClip.length());
-
- r = new CramCompressionRecord();
- r.alignmentStart = 1;
- r.readLength = readLength;
- r.setSegmentUnmapped(false);
- r.readFeatures = new ArrayList<ReadFeature>();
- int deletionLength = 5;
- r.readFeatures.add(new Deletion(1, deletionLength));
- Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 + deletionLength);
-
- r = new CramCompressionRecord();
- r.alignmentStart = 1;
- r.readLength = readLength;
- r.setSegmentUnmapped(false);
- r.readFeatures = new ArrayList<ReadFeature>();
- String insertion = "CCCCCCCCCC";
- r.readFeatures.add(new Insertion(1, insertion.getBytes()));
- Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - insertion.length());
-
-
- r = new CramCompressionRecord();
- r.alignmentStart = 1;
- r.readLength = readLength;
- r.setSegmentUnmapped(false);
- r.readFeatures = new ArrayList<ReadFeature>();
- r.readFeatures.add(new InsertBase(1, (byte) 'A'));
- Assert.assertEquals(r.getAlignmentEnd(), r.readLength + r.alignmentStart - 1 - 1);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java b/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java
deleted file mode 100644
index 3ed0b40..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/ReadTagTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ReadTagTest {
-
- @Test
- public void test () {
- SAMFileHeader h = new SAMFileHeader();
- SAMRecord r = new SAMRecord(h);
- r.setAttribute("OQ", "A:SOME:RANDOM:NONSENSE".getBytes());
- r.setAttribute("XA", 1333123);
- r.setAttribute("XB", (byte) 31);
- r.setAttribute("XB", 'Q');
- r.setAttribute("XC", "A STRING");
-
- int intValue = 1123123123;
- byte[] data = ReadTag.writeSingleValue((byte) 'i', intValue, false);
- ByteBuffer byteBuffer = ByteBuffer.wrap(data);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- Object value = ReadTag.readSingleValue((byte) 'i', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
- Assert.assertEquals (((Integer) value).intValue(), intValue);
-
- String sValue = "value";
- data = ReadTag.writeSingleValue((byte) 'Z', sValue, false);
- byteBuffer = ByteBuffer.wrap(data);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- value = ReadTag.readSingleValue((byte) 'Z', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
- Assert.assertEquals(sValue, value);
-
- byte[] baValue = "value".getBytes();
- data = ReadTag.writeSingleValue((byte) 'B', baValue, false);
- byteBuffer = ByteBuffer.wrap(data);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- value = ReadTag.readSingleValue((byte) 'B', byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
- Assert.assertEquals((byte[]) value, baValue);
- }
-
- @Test
- public void testUnsignedInt() {
- long intValue = Integer.MAX_VALUE+1L;
- byte[] data = ReadTag.writeSingleValue((byte) 'I', intValue, false);
- ByteBuffer byteBuffer = ByteBuffer.wrap(data);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- Object value = ReadTag.readSingleValue((byte) 'I', byteBuffer, ValidationStringency.SILENT);
- Assert.assertTrue(value instanceof Long);
- long lValue = (Long)value;
- Assert.assertEquals (lValue & 0xFFFFFFFF, intValue);
- }
-
- @Test
- public void testParallelReadTag() throws Exception {
- // NOTE: testng 5.5 (circa 2007) doesn't support parallel data providers, but modern versions do.
- // For now, roll our own.
- final Object[][] allArgs = getParallelReadTagData();
- final long timeout = 1000L * 5; // just in case
- final List<Thread> threads = new ArrayList<Thread>(allArgs.length);
- final Map<Object[], Exception> results = Collections.synchronizedMap(new HashMap<Object[], Exception>());
- for (final Object[] argLine: allArgs) {
- threads.add(new Thread() {
- @Override
- public void run() {
- try {
- testParallelReadTag((Byte)argLine[0], argLine[1]);
- } catch (final Exception e) {
- Assert.assertNull(results.put(argLine, e));
- }
- }
- });
- }
- for (final Thread thread: threads) {
- thread.start();
- }
- for (final Thread thread: threads) {
- thread.join(timeout);
- }
- for (final Map.Entry<Object[], Exception> result: results.entrySet()) {
- // Will fail only on the first, for now, but a debugger will be able to see all the results.
- Assert.fail("failed: " + Arrays.toString(result.getKey()), result.getValue());
- }
- }
-
- //@Test(dataProvider = "parallelReadTagData")
- public void testParallelReadTag(final byte tagType, final Object originalValue) {
- // refactored from ReadTag.main()
- final byte[] data = ReadTag.writeSingleValue(tagType, originalValue, false);
- final ByteBuffer byteBuffer = ByteBuffer.wrap(data);
- byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
- final Object readValue = ReadTag.readSingleValue(tagType, byteBuffer, ValidationStringency.DEFAULT_STRINGENCY);
- Assert.assertEquals(readValue, originalValue);
- }
-
- //@DataProvider(name = "parallelReadTagData", parallel = true)
- public Object[][] getParallelReadTagData() {
- final int testCount = 10;
- final Object[][] testData = new Object[testCount][];
- for (int i = 0; i < testCount; i++) {
- testData[i] = new Object[]{(byte)'Z', "test" + i};
- }
- return testData;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java b/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java
deleted file mode 100644
index c52dccb..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/SliceTests.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import htsjdk.samtools.CRAMFileReader;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.ValidationStringency;
-import htsjdk.samtools.cram.CRAMException;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Created by vadim on 07/12/2015.
- */
-public class SliceTests {
- @Test
- public void testUnmappedValidateRef() {
- Slice slice = new Slice();
- slice.alignmentStart= SAMRecord.NO_ALIGNMENT_START;
- slice.sequenceId = SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX;
-
- Assert.assertTrue(slice.validateRefMD5(null));
- Assert.assertTrue(slice.validateRefMD5(new byte[0]));
- Assert.assertTrue(slice.validateRefMD5(new byte[1024]));
- }
-
- @Test
- public void test_validateRef() {
- byte[] ref = "AAAAA".getBytes();
- final byte[] md5 = SequenceUtil.calculateMD5(ref, 0, Math.min(5, ref.length));
- Slice slice = new Slice();
- slice.sequenceId=0;
- slice.alignmentSpan=5;
- slice.alignmentStart=1;
- slice.setRefMD5(ref);
-
- Assert.assertEquals(slice.refMD5, md5);
- Assert.assertTrue(slice.validateRefMD5(ref));
- }
-
- @Test(expectedExceptions= CRAMException.class)
- public void testFailsMD5Check() throws IOException {
- // auxf.alteredForMD5test.fa has been altered slightly from the original reference
- // to cause the CRAM md5 check to fail
- final File CRAMFile = new File("src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram");
- final File refFile = new File("src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa");
- ReferenceSource refSource = new ReferenceSource(refFile);
- CRAMFileReader reader = null;
- try {
- reader = new CRAMFileReader(
- CRAMFile,
- null,
- refSource,
- ValidationStringency.STRICT);
- Iterator<SAMRecord> it = reader.getIterator();
- while (it.hasNext()) {
- it.next();
- }
- } finally {
- if (reader != null) {
- reader.close();
- }
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java b/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java
deleted file mode 100644
index 31e7708..0000000
--- a/src/test/java/htsjdk/samtools/cram/structure/SubstitutionMatrixTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package htsjdk.samtools.cram.structure;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeGroups;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Parameters;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-/**
- * Created by Vadim on 12/03/2015.
- */
-public class SubstitutionMatrixTest {
-
- SubstitutionMatrix m;
- long[][] freqs;
-
- @BeforeGroups(groups = "matrix2code")
- public void m() {
- m = new SubstitutionMatrix(new byte[]{27, (byte) 228, 27, 27, 27});
- }
-
- @BeforeGroups(groups = "freqs2matrix")
- public void b() {
- freqs = new long[255][255];
- for (int r = 0; r < SubstitutionMatrix.BASES.length; r++) {
- for (int b = 0; b < SubstitutionMatrix.BASES.length; b++) {
- if (r == b)
- continue;
- freqs[SubstitutionMatrix.BASES[r]][SubstitutionMatrix.BASES[b]] = b;
- }
- }
- m = new SubstitutionMatrix(freqs);
- }
-
-
- @Test(dataProvider = "matrix2code", groups = "matrix2code")
- public void testMatrix2code(char refBase, char base, int code) {
- if (refBase == base)
- return;
- Assert.assertEquals(m.code((byte) refBase, (byte) base), code);
- Assert.assertEquals(m.base((byte) refBase, (byte) code), base);
- }
-
- @Test(dataProvider = "freqs2matrix", groups = "freqs2matrix")
- public void testFreqs2matrix(char refBase, char base, int code) {
- if (refBase == base)
- return;
- Assert.assertEquals(m.code((byte) refBase, (byte) base), code);
- Assert.assertEquals(m.base((byte) refBase, (byte) code), base);
- }
-
- @DataProvider(name = "matrix2code")
- public Object[][] provider1() {
- return new Object[][]{
- {'A', 'C', 0},
- {'A', 'G', 1},
- {'A', 'T', 2},
- {'A', 'N', 3},
- {'C', 'A', 3},
- {'C', 'G', 2},
- {'C', 'T', 1},
- {'C', 'N', 0},
- {'G', 'A', 0},
- {'G', 'C', 1},
- {'G', 'T', 2},
- {'G', 'N', 3},
- {'T', 'A', 0},
- {'T', 'C', 1},
- {'T', 'G', 2},
- {'T', 'N', 3},
- {'N', 'A', 0},
- {'N', 'C', 1},
- {'N', 'G', 2},
- {'N', 'T', 3},
- };
- }
-
- @DataProvider(name = "freqs2matrix")
- public Object[][] provider2() {
- return new Object[][]{
- {'A', 'C', 3},
- {'A', 'G', 2},
- {'A', 'T', 1},
- {'A', 'N', 0},
- {'C', 'A', 3},
- {'C', 'G', 2},
- {'C', 'T', 1},
- {'C', 'N', 0},
- {'G', 'A', 3},
- {'G', 'C', 2},
- {'G', 'T', 1},
- {'G', 'N', 0},
- {'T', 'A', 3},
- {'T', 'C', 2},
- {'T', 'G', 1},
- {'T', 'N', 0},
- {'N', 'A', 3},
- {'N', 'C', 2},
- {'N', 'G', 1},
- {'N', 'T', 0},
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java b/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java
deleted file mode 100644
index f6f238e..0000000
--- a/src/test/java/htsjdk/samtools/fastq/FastqRecordTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package htsjdk.samtools.fastq;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public final class FastqRecordTest {
-
- @Test
- public void testBasic() {
- final String seqHeaderPrefix = "FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)";
- final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
- final String qualHeaderPrefix = "";
- final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
- final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
-
- Assert.assertNull(fastqRecord.getBaseQualityHeader());
-
- Assert.assertEquals(fastqRecord.getReadHeader(), seqHeaderPrefix);
- Assert.assertEquals(fastqRecord.getBaseQualityString(), qualLine);
- Assert.assertEquals(fastqRecord.getReadString(), seqLine);
- Assert.assertNotNull(fastqRecord.toString());//just check not nullness
- Assert.assertNotEquals(fastqRecord, null);
- Assert.assertFalse(fastqRecord.equals(null));
- Assert.assertNotEquals(null, fastqRecord);
- Assert.assertEquals(fastqRecord, fastqRecord);
- Assert.assertNotEquals(fastqRecord, "fred");
- Assert.assertNotEquals("fred", fastqRecord);
- Assert.assertEquals(fastqRecord.length(), seqLine.length());
- Assert.assertEquals(fastqRecord.getBaseQualityString().length(), fastqRecord.getReadString().length());
- Assert.assertEquals(fastqRecord.getReadString().length(), fastqRecord.length());
- }
-
- @Test
- public void testBasicEmptyHeaderPrefix() {
- final String seqHeaderPrefix = "";
- final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
- final String qualHeaderPrefix = "";
- final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
- final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
- Assert.assertNull(fastqRecord.getReadHeader());
- Assert.assertNull(fastqRecord.getBaseQualityHeader());
- }
-
- @Test
- public void testCopy() {
- final String seqHeaderPrefix = "FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)";
- final String seqLine = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT";
- final String qualHeaderPrefix = "";
- final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
- final FastqRecord fastqRecord = new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
- final FastqRecord fastqRecordCopy = new FastqRecord(fastqRecord);
-
- Assert.assertEquals(fastqRecord, fastqRecordCopy);
- Assert.assertNotSame(fastqRecord, fastqRecordCopy);
- Assert.assertSame(fastqRecord.getReadString(), fastqRecordCopy.getReadString());
- Assert.assertSame(fastqRecord.getBaseQualityString(), fastqRecordCopy.getBaseQualityString());
- Assert.assertSame(fastqRecord.getBaseQualityHeader(), fastqRecordCopy.getBaseQualityHeader());
- }
-
- @Test
- public void testNullSeq() {
- final String seqHeaderPrefix = "header";
- final String seqLine = null;
- final String qualHeaderPrefix = "";
- final String qualLine = ";<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
- new FastqRecord(seqHeaderPrefix, seqLine, qualHeaderPrefix, qualLine);
- //Note: this does not blow up now but it will once we enforce non null seqLine
- }
-
- @Test
- public void testEqualsWithNullHeader() {
- final String seqLine = "GATTACA";
- final String qualHeaderPrefix = "";
- final String qualLine = "ABCDEFG";
- final FastqRecord fastqRecord1 = new FastqRecord("", seqLine, qualHeaderPrefix, qualLine);
- final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
- Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
- Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
- Assert.assertEquals(fastqRecord1.hashCode(), fastqRecord1.hashCode());
- Assert.assertEquals(fastqRecord2.hashCode(), fastqRecord2.hashCode());
- }
-
- @Test
- public void testEqualsWithNullSeqLine() {
- final String seqLine = "GATTACA";
- final String qualHeaderPrefix = "";
- final String qualLine = "ABCDEFG";
- final FastqRecord fastqRecord1 = new FastqRecord("", null, qualHeaderPrefix, qualLine);
- final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
- }
-
- @Test
- public void testEqualsWithNullQualLine() {
- final String seqLine = "GATTACA";
- final String qualHeaderPrefix = "";
- final String qualLine = "ABCDEFG";
- final FastqRecord fastqRecord1 = new FastqRecord("", seqLine, qualHeaderPrefix, null);
- final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine, qualHeaderPrefix, qualLine);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
- }
-
- @Test
- public void testEqualsWithNullBaseQualityHeader() {
- final String seqHeaderPrefix = "header";
- final String seqLine = "GATTACA";
- final String qualLine = "ABCDEFG";
- final FastqRecord fastqRecord1 = new FastqRecord(seqHeaderPrefix, seqLine, null, qualLine);
- final FastqRecord fastqRecord2 = new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", qualLine);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
- Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
- Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
- Assert.assertEquals(fastqRecord1.hashCode(), fastqRecord1.hashCode());
- Assert.assertEquals(fastqRecord2.hashCode(), fastqRecord2.hashCode());
- }
-
- @Test
- public void testNullQual() {
- final String seqHeaderPrefix = "header";
- final String seqLine = "GATTACA";
- new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", null);
- //Note: this does not blow up now but it will once we enforce non null quals
- }
-
- @Test
- public void testNullString() {
- final String seqHeaderPrefix = "header";
- final String qualLine = "GATTACA";
- new FastqRecord(seqHeaderPrefix, null, "qualHeaderPrefix", qualLine);
- //Note: this does not blow up now but it will once we enforce non null seqLine
- }
-
- @Test
- public void testEmptyQual() {
- final String seqHeaderPrefix = "header";
- final String seqLine = "GATTACA";
- new FastqRecord(seqHeaderPrefix, seqLine, "qualHeaderPrefix", "");
- //Note: this does not blow up now but it will once we enforce non empty quals
- }
-
- @Test
- public void testEmptyString() {
- final String seqHeaderPrefix = "header";
- final String qualLine = "GATTACA";
- new FastqRecord(seqHeaderPrefix, "", "qualHeaderPrefix", qualLine);
- //Note: this does not blow up now but it will once we enforce non empty seqLine
- }
-
- @Test
- public void testNotEqualQuals() {
- final String seqLine1 = "GATTACA";
- final String qualLine1 = "ABCDEFG";
-
- final String seqLine2 = seqLine1;
- final String qualLine2 = seqLine2.replace('A', 'X');
-
- final FastqRecord fastqRecord1 = new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
- final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine2, "qualHeaderPrefix", qualLine2);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
- Assert.assertEquals(fastqRecord1.getReadString(), fastqRecord2.getReadString());
- Assert.assertNotEquals(fastqRecord1.getBaseQualityString(), fastqRecord2.getBaseQualityString());
-
- Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
- Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
- }
-
- @Test
- public void testNotEqualStrings() {
- final String seqLine1 = "GATTACA";
- final String qualLine1 = "ABCDEFG";
-
- final String seqLine2 = seqLine1.replace('A', 'X');
- final String qualLine2 = qualLine1;
-
- final FastqRecord fastqRecord1 = new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
- final FastqRecord fastqRecord2 = new FastqRecord("header", seqLine2, "qualHeaderPrefix", qualLine2);
- Assert.assertNotEquals(fastqRecord1, fastqRecord2);
- Assert.assertNotEquals(fastqRecord2, fastqRecord1);
-
- Assert.assertNotEquals(fastqRecord1.getReadString(), fastqRecord2.getReadString());
- Assert.assertEquals(fastqRecord1.getBaseQualityString(), fastqRecord2.getBaseQualityString());
-
- Assert.assertNotEquals(fastqRecord1.hashCode(), fastqRecord2.hashCode());
- Assert.assertNotEquals(fastqRecord2.hashCode(), fastqRecord1.hashCode());
- }
-
- @Test
- public void testNotEqualLengths() {
- final String seqLine1 = "GATTACA";
- final String qualLine1 = seqLine1 + "X";
-
- new FastqRecord("header", seqLine1, "qualHeaderPrefix", qualLine1);
- //Note: this does not blow up now but it will once we enforce that seqLine and qualLine be the same length
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java b/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java
deleted file mode 100644
index eba5c5b..0000000
--- a/src/test/java/htsjdk/samtools/fastq/FastqWriterTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * The MIT License
- *
- * Pierre Lindenbaum PhD
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.fastq;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import htsjdk.samtools.util.TestUtil;
-
-import java.io.File;
-import java.util.ArrayList;
-
-/**
- * test fastq
- */
-public class FastqWriterTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest");
-
- @DataProvider(name = "fastqsource")
- public Object[][] createTestData() {
- return new Object[][]{
- {"solexa_full_range_as_solexa.fastq"},
- {"5k-30BB2AAXX.3.aligned.sam.fastq"}
- };
- }
-
- @Test(dataProvider = "fastqsource")
- public void testReadReadWriteFastq(final String basename) throws Exception {
- final File tmpFile = File.createTempFile("test.", ".fastq");
- tmpFile.deleteOnExit();
- final FastqReader fastqReader = new FastqReader(new File(TEST_DATA_DIR,basename));
- final FastqWriterFactory writerFactory = new FastqWriterFactory();
- final FastqWriter fastqWriter = writerFactory.newWriter(tmpFile);
- for(final FastqRecord rec: fastqReader) fastqWriter.write(rec);
- fastqWriter.close();
- fastqReader.close();
- }
-
- @Test(dataProvider = "fastqsource")
- public void testFastqSerialize(final String basename) throws Exception {
- //write
- final ArrayList<FastqRecord> records = new ArrayList<>();
- final FastqReader fastqReader = new FastqReader(new File(TEST_DATA_DIR,basename));
- for(final FastqRecord rec: fastqReader) {
- records.add(rec);
- if(records.size()>100) break;
- }
- fastqReader.close();
- Assert.assertEquals(TestUtil.serializeAndDeserialize(records),records);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java b/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java
deleted file mode 100644
index cb2cb05..0000000
--- a/src/test/java/htsjdk/samtools/filter/FailsVendorReadQualityFilterTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class FailsVendorReadQualityFilterTest {
-
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- private final FailsVendorReadQualityFilter filter = new FailsVendorReadQualityFilter();
-
- /**
- * Basic positive and negative tests for the FailsReadQualityFilter
- *
- * @param readQualityFlag The read quality flag to be tested
- * @param expectedResult The expected result (true is the sequence should match the filter, otherwise false)
- */
- @Test(dataProvider="data")
- public void testFailsReadQualityFilter(final String testName, final boolean readQualityFlag,
- final boolean expectedResult) {
- builder.addUnmappedFragment("testfrag");
- final SAMRecord record = builder.iterator().next();
- record.setReadFailsVendorQualityCheckFlag(readQualityFlag);
- Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
- }
-
-
- /**
- * Data for various sequences which may or may not match the filter.
- */
- @DataProvider(name = "data")
- private Object[][] getFailsReadQualityTestData()
- {
- return new Object[][]{
- {"Failed read, should be filtered out", true, true},
- {"Passing read, should not be filtered out", false, false},
- };
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java b/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java
deleted file mode 100644
index fc4937d..0000000
--- a/src/test/java/htsjdk/samtools/filter/InsertSizeFilterTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class InsertSizeFilterTest {
- private static final int READ_LENGTH = 20;
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
- @BeforeTest
- public void setUp() {
- builder.setReadLength(READ_LENGTH);
- builder.addFrag("mapped_unpaired", 1, 1, false);
- builder.addUnmappedPair("unmapped_paired"); // insert size = 0
- builder.addPair("mapped_paired_short", 1, 1, 31); // insert size = 50
- builder.addPair("mapped_paired_long", 1, 1, 81); // insert size = 100
- builder.addPair("mapped_paired_long_flipped", 1, 81, 1); // insert size = 100
- }
-
- @Test(dataProvider = "data")
- public void testInsertSizeFilter(final int minInsertSize, final int maxInsertSize, final int expectedPassingRecords) {
- final InsertSizeFilter filter = new InsertSizeFilter(minInsertSize, maxInsertSize);
- int actualPassingRecords = 0;
- for (final SAMRecord rec : builder) {
- if (!filter.filterOut(rec)) actualPassingRecords++;
- }
- Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
- }
-
- @DataProvider(name = "data")
- private Object[][] testData() {
- return new Object[][]{
- {0, 0, 2},
- {50, 50, 2},
- {50, 100, 6},
- {0, Integer.MAX_VALUE, 8}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java b/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java
deleted file mode 100644
index 3d30255..0000000
--- a/src/test/java/htsjdk/samtools/filter/IntervalKeepPairFilterTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.util.CollectionUtil;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import htsjdk.samtools.util.Interval;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.stream.StreamSupport;
-
-public class IntervalKeepPairFilterTest {
- private static final int READ_LENGTH = 151;
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
- @BeforeTest
- public void setUp() {
- builder.setReadLength(READ_LENGTH);
- // Will be kept when an interval overlaps chromosome 1 in the first 151
- // bases.
- builder.addPair("mapped_pair_chr1", 0, 1, 151);
- // Will be kept when an interval overlaps chromsome 2 in the first 151
- // bases.
- builder.addPair("mapped_pair_chr2", 1, 1, 151);
- // The first read should pass and second should not, but both will
- // be kept in first test.
- builder.addPair("one_of_pair", 0, 1, 1000);
- // The second read is unmapped, but both should be kept in an
- // interval test where the interval includes chromosome four, where
- // read one will overlap.
- builder.addPair("second_mate_unmapped", 3, -1, 1, 1000, false, true,
- "151M", null, false, false, false, false, -1);
- // The first read is unmapped but both should be kept in an
- // interval test where the interval includes chromosome four, where
- // read two will overlap.
- builder.addPair("first_mate_unmapped", -1, 3, 1000, 1, true, false,
- null, "151M", false, false, false, false, -1);
- // This pair will overlap any interval that includes chromosome 1:1000
- builder.addPair("prove_one_of_pair", 0, 1000, 1000);
- // These reads are unmapped and will not map to any intervals, so they
- // are never kept. This is tested below.
- builder.addPair("both_unmapped", -1, -1, 1, 1, true, true, null, null,
- false, false, false, false, -1);
- // Secondary alignments are never kept by the interval filter.
- builder.addFrag("mapped_pair_chr1", 0, 1, false, false, "151M", null, -1, true, false);
- // Supplementary alignment are never kept by the interval filter.
- builder.addFrag("mapped_pair_chr1", 0, 1, false, false, "151M", null, -1, false, true);
- }
-
- @Test(dataProvider = "testData")
- public void testIntervalPairFilter(final List<Interval> intervals, final long expectedPassingRecords) {
- final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervals);
-
- long actualPassingRecords = StreamSupport.stream(builder.spliterator(), false)
- .filter(rec -> !filter.filterOut(rec))
- .count();
-
- Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
- }
-
- @Test
- public void testUnmappedPair() {
- final List<Interval> intervalList = new ArrayList<>();
-
- final Interval interval1 = new Interval("chr1", 1, 999);
- final Interval interval2 = new Interval("chr3", 1, 2);
- final Interval interval3 = new Interval("chr2", 1, 2);
- final Interval interval4 = new Interval("chr4", 1, 2);
-
- intervalList.addAll(CollectionUtil.makeList(interval1, interval2, interval3, interval4));
-
- final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList);
-
- boolean unmappedPassed = StreamSupport.stream(builder.spliterator(), false)
- .filter(rec -> !filter.filterOut(rec))
- .anyMatch(rec -> rec.getReadName().equals("both_unmapped"));
-
- Assert.assertFalse(unmappedPassed);
- }
-
- @Test
- public void testNotPrimaryReads() {
- final List<Interval> intervalList = new ArrayList<>();
- final Interval interval1 = new Interval("chr1", 1, 999);
- intervalList.add(interval1);
-
- final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList);
-
- boolean notPrimary = StreamSupport.stream(builder.spliterator(), false)
- .filter(rec -> !filter.filterOut(rec))
- .anyMatch(rec -> rec.getNotPrimaryAlignmentFlag() || rec.getSupplementaryAlignmentFlag());
-
- Assert.assertFalse(notPrimary);
- }
-
- @DataProvider(name = "testData")
- private Object[][] testData() {
- Interval interval = new Interval("chr1", 1, 999);
- final List<Interval> intervalList_twoPair = new ArrayList<>();
- intervalList_twoPair.add(interval);
-
- interval = new Interval("chr3", 1, 2);
- final List<Interval> intervalList_noMatch = new ArrayList<>();
- intervalList_noMatch.add(interval);
-
- interval = new Interval("chr2", 1, 2);
- final List<Interval> intervalList_onePair = new ArrayList<>();
- intervalList_onePair.add(interval);
-
- interval = new Interval("chr4", 1, 2);
- final List<Interval> intervalList_unmapped = new ArrayList<>();
- intervalList_unmapped.add(interval);
-
- return new Object[][]{
- {intervalList_twoPair, 4},
- {intervalList_noMatch, 0},
- {intervalList_onePair, 2},
- {intervalList_unmapped, 4}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java b/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java
deleted file mode 100644
index 7835576..0000000
--- a/src/test/java/htsjdk/samtools/filter/JavascriptSamRecordFilterTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.util.CloserUtil;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-
-public class JavascriptSamRecordFilterTest {
- final File testDir = new File("./src/test/resources/htsjdk/samtools");
-
- @DataProvider
- public Object[][] jsData() {
- return new Object[][] { { "unsorted.sam", "samFilter01.js", 8 }, { "unsorted.sam", "samFilter02.js", 10 }, };
- }
-
- @Test(dataProvider = "jsData")
- public void testJavascriptFilters(final String samFile, final String javascriptFile, final int expectCount) {
- final SamReaderFactory srf = SamReaderFactory.makeDefault();
- final SamReader samReader = srf.open(new File(testDir, samFile));
- final JavascriptSamRecordFilter filter;
- try {
- filter = new JavascriptSamRecordFilter(new File(testDir, javascriptFile),
- samReader.getFileHeader());
- } catch (IOException err) {
- Assert.fail("Cannot read script",err);
- return;
- }
- final SAMRecordIterator iter = samReader.iterator();
- int count = 0;
- while (iter.hasNext()) {
- if (filter.filterOut(iter.next())) {
- continue;
- }
- ++count;
- }
- iter.close();
- CloserUtil.close(samReader);
- Assert.assertEquals(count, expectCount, "Expected number of reads " + expectCount + " but got " + count);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java b/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java
deleted file mode 100644
index 2bffcd6..0000000
--- a/src/test/java/htsjdk/samtools/filter/MappingQualityFilterTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class MappingQualityFilterTest {
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
- @BeforeTest
- public void setUp() {
- // note the side effects...
- builder.addFrag("zeroMQ", 1, 1, false).setMappingQuality(0);
- builder.addFrag("lowMQ", 1, 1, false).setMappingQuality(10);
- builder.addFrag("highMQ", 1, 1, false).setMappingQuality(30);
- }
-
- @Test(dataProvider = "data")
- public void testMappingQualityFilter(final int minMappingQuality, final int expectedPassingRecords) {
- final MappingQualityFilter filter = new MappingQualityFilter(minMappingQuality);
- int actualPassingRecords = 0;
- for (final SAMRecord rec : builder) {
- if (!filter.filterOut(rec)) actualPassingRecords++;
- }
- Assert.assertEquals(actualPassingRecords, expectedPassingRecords);
- }
-
- @DataProvider(name = "data")
- private Object[][] testData() {
- return new Object[][]{
- {0, 3},
- {10, 2},
- {30, 1}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java b/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java
deleted file mode 100644
index bff8491..0000000
--- a/src/test/java/htsjdk/samtools/filter/OverclippedReadFilterTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class OverclippedReadFilterTest {
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- private final int unclippedBasesThreshold = 30;
-
- private SAMRecord buildFrag(final String name, final String cigarString) {
- // for this test, all we care about is the CIGAR
- return builder.addFrag(name, 0, 1, false, false, cigarString, null, 30);
- }
-
- @Test(dataProvider = "data")
- public void testOverclippedReadFilter(final String name, final String cigar, final boolean filterSingleEndClips, final boolean shouldFail) {
- final OverclippedReadFilter filter = new OverclippedReadFilter(unclippedBasesThreshold, filterSingleEndClips);
- final SAMRecord rec = buildFrag(name, cigar);
- Assert.assertEquals(filter.filterOut(rec), shouldFail);
- }
-
- @DataProvider(name = "data")
- private Object[][] testData() {
- return new Object[][]{
- {"foo", "1S10M1S", false, true},
- {"foo", "1S10X1S", false, true},
- {"foo", "1H1S10M1S1H", false, true},
- {"foo", "1S40M1S", false, false},
- {"foo", "1S40X1S", false, false},
- {"foo", "1H10M1S", false, false},
- {"foo", "1S10M1H", false, false},
- {"foo", "10M1S", false, false},
- {"foo", "1S10M", false, false},
- {"foo", "10M1S", true, true},
- {"foo", "1S10M", true, true},
- {"foo", "1S10M10D10M1S", false, true},
- {"foo", "1S1M40I1S", false, false},
- {"foo", "1S10I1S", false, true},
- {"foo", "1S40I1S", false, false},
- {"foo", "1S40I1S", true, false},
- {"foo", "25S40I25M", true, false},
- {"foo", "25S25M", true, true},
- {"foo", "25S25X", true, true},
- {"foo", "25S25H", true, true},
- {"foo", "25S25H", false, false},
- {"foo", "25S25M25S", false, true},
- {"foo", "25M25S", true, true},
- {"foo", "25S25M", true, true},
- {"foo", "25S35S", true, true},
- {"foo", "25S35M25S", true, false},
- {"foo", "35M25S", true, false},
- {"foo", "25S35M", true, false}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java b/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java
deleted file mode 100644
index 96fa324..0000000
--- a/src/test/java/htsjdk/samtools/filter/SolexaNoiseFilterTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Basic test for the SolexaNoiseFilter
- */
-public class SolexaNoiseFilterTest {
-
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- private final SolexaNoiseFilter filter = new SolexaNoiseFilter();
-
- /**
- * Basic positive and negative tests for the PolyANoiseFilter
- *
- * @param sequence The sequence to be tested
- * @param expectedResult The expected result (true is the sequence should match the filter, otherwise false)
- */
- @Test(dataProvider="data")
- public void testSolexaNoiseFilter(final String testName, final String sequence, final boolean expectedResult) {
- builder.addUnmappedFragment("testfrag");
- final SAMRecord record = builder.iterator().next();
- record.setReadString(sequence);
- Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
- }
-
-
- /**
- * Data for various sequences which may or may not match the filter.
- */
- @DataProvider(name = "data")
- private Object[][] getSolexaNoiseTestData()
- {
- return new Object[][]{
- {"36-base read all a's filter out", "AAAAAaaaaaAAAAAAAAAAAAAAAAAAAAaaaaaa", true},
- {"36-base read with n, filter out", "AAAAAaaaaaAAAAAAAAAAAAAAAAAAAAaaaaan", true},
- {"51-base read, final base mismatch", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT", false},
- {"51-base read, middle base mismatch", "aaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaaaaaaaaaaaaaaa", false},
- {"76-base read, a's and n's, filter out",
- "aaaaaaaaaaaaaaaaaNNaaaaaaaaaaaaaaaaaaaaaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", true},
- {"76-base doesn't match",
- "NNNATAAAnnnnnnnnnnTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT", false},
- };
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/filter/TagFilterTest.java b/src/test/java/htsjdk/samtools/filter/TagFilterTest.java
deleted file mode 100644
index 6e0c702..0000000
--- a/src/test/java/htsjdk/samtools/filter/TagFilterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.filter;
-
-import htsjdk.samtools.ReservedTagConstants;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for the TagFilter class
- */
-public class TagFilterTest {
- private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
-
-
- /**
- * Basic positive and negative tests for the TagFilter
- *
- * @param tag The tag to be tested
- * @param validValues The values the filter should test for
- * @param testValue The value to test for in the record
- * @param expectedResult The expected result (true is the sequence should match the filter, otherwise false)
- */
- @Test(dataProvider="data")
- public void testTagFilter(final String testName, final String tag, final List<Object> validValues,
- final Object testValue, final boolean expectedResult) {
- final TagFilter filter = new TagFilter(tag, validValues);
- builder.addUnmappedFragment("testfrag");
- final SAMRecord record = builder.iterator().next();
- if (testValue != null) {
- record.setAttribute(tag, testValue);
- }
- Assert.assertEquals(filter.filterOut(record), expectedResult, testName);
- }
-
-
- /**
- * Data for various sequences which may or may not match the filter.
- */
- @DataProvider(name = "data")
- private Object[][] getTagFilterTestData()
- {
- return new Object[][]{
- {"Basic positive test", ReservedTagConstants.XN, Arrays.asList(1), 1, true},
- {"Multi-value positive test", ReservedTagConstants.XN, Arrays.asList(1,2,3), 1, true},
- {"Incorrect value negative test", ReservedTagConstants.XN, Arrays.asList(1), 2, false},
- {"Null value negative test", ReservedTagConstants.XN, Arrays.asList(1), null, false}
- };
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java b/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java
deleted file mode 100644
index 8e9f92e..0000000
--- a/src/test/java/htsjdk/samtools/liftover/LiftOverTest.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.liftover;
-
-import htsjdk.samtools.util.Interval;
-import htsjdk.samtools.util.OverlapDetector;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class LiftOverTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/liftover");
- private static final File CHAIN_FILE = new File(TEST_DATA_DIR, "hg18ToHg19.over.chain");
-
- private LiftOver liftOver;
- Map<String, Set<String>> contigMap;
-
- @BeforeClass
- public void initLiftOver() {
- liftOver = new LiftOver(CHAIN_FILE);
- contigMap = liftOver.getContigMap();
- }
-
- @Test(dataProvider = "testIntervals")
- public void testBasic(final Interval in, final Interval expected) {
- final Interval out = liftOver.liftOver(in);
- Assert.assertEquals(out, expected);
-
- }
-
- @DataProvider(name = "testIntervals")
- public Object[][] makeTestIntervals() {
- return new Object[][] {
- {new Interval("chr3", 50911035, 50911051), null},
- {new Interval("chr1", 16776377, 16776452), new Interval("chr1", 16903790, 16903865)},
- {new Interval("chr2", 30575990, 30576065), new Interval("chr2", 30722486, 30722561)},
- {new Interval("chr3", 12157217, 12157292), new Interval("chr3", 12182217, 12182292)},
- {new Interval("chr4", 12503121, 12503196), new Interval("chr4", 12894023, 12894098)},
- {new Interval("chr5", 13970930, 13971005), new Interval("chr5", 13917930, 13918005)},
- {new Interval("chr6", 13838774, 13838849), new Interval("chr6", 13730795, 13730870)},
- {new Interval("chr7", 23978336, 23978411), new Interval("chr7", 24011811, 24011886)},
- {new Interval("chr8", 13337368, 13337443), new Interval("chr8", 13292997, 13293072)},
- {new Interval("chr9", 35059282, 35059357), new Interval("chr9", 35069282, 35069357)},
- {new Interval("chr10", 7893794, 7893869), new Interval("chr10", 7853788, 7853863)},
- {new Interval("chr11", 17365784, 17365859), new Interval("chr11", 17409208, 17409283)},
- {new Interval("chr12", 4530193, 4530268), new Interval("chr12", 4659932, 4660007)},
- {new Interval("chr13", 29398707, 29398782), new Interval("chr13", 30500707, 30500782)},
- {new Interval("chr14", 22955252, 22955327), new Interval("chr14", 23885412, 23885487)},
- {new Interval("chr15", 27477379, 27477454), new Interval("chr15", 29690087, 29690162)},
- {new Interval("chr16", 13016380, 13016455), new Interval("chr16", 13108879, 13108954)},
- {new Interval("chr17", 28318218, 28318293), new Interval("chr17", 31294105, 31294180)},
- {new Interval("chr18", 42778225, 42778300), new Interval("chr18", 44524227, 44524302)},
- {new Interval("chr19", 8340119, 8340194), new Interval("chr19", 8434119, 8434194)},
- {new Interval("chr20", 39749226, 39749301), new Interval("chr20", 40315812, 40315887)},
- {new Interval("chr21", 20945136, 20945211), new Interval("chr21", 22023265, 22023340)},
- {new Interval("chr22", 32307031, 32307106), new Interval("chr22", 33977031, 33977106)},
- {new Interval("chrX", 34252958, 34253033) , new Interval("chrX", 34343037, 34343112)},
- // Sampling from /seq/references/HybSelOligos/whole_exome_refseq_coding/whole_exome_refseq_coding.targets.interval_list
- {new Interval("chr1", 58952, 59873), new Interval("chr1", 69089, 70010)},
- {new Interval("chr1", 7733844, 7734041), new Interval("chr1", 7811257, 7811454)},
- {new Interval("chr1", 16261179, 16261276), new Interval("chr1", 16388592, 16388689)},
- {new Interval("chr1", 23634929, 23635110), new Interval("chr1", 23762342, 23762523)},
- {new Interval("chr1", 31910910, 31911030), new Interval("chr1", 32138323, 32138443)},
- {new Interval("chr1", 39686851, 39687024), new Interval("chr1", 39914264, 39914437)},
- {new Interval("chr1", 46434068, 46434185), new Interval("chr1", 46661481, 46661598)},
- {new Interval("chr1", 60102890, 60102928), new Interval("chr1", 60330302, 60330340)},
- {new Interval("chr1", 84734151, 84734336), new Interval("chr1", 84961563, 84961748)},
- {new Interval("chr1", 100529545, 100529650), new Interval("chr1", 100756957, 100757062)},
- {new Interval("chr1", 114771320, 114771441), new Interval("chr1", 114969797, 114969918)},
- {new Interval("chr1", 148564831, 148564965), new Interval("chr1", 150298207, 150298341)},
- {new Interval("chr1", 153293008, 153293090), new Interval("chr1", 155026384, 155026466)},
- {new Interval("chr1", 158167550, 158167677), new Interval("chr1", 159900926, 159901053)},
- {new Interval("chr1", 169444555, 169444718), new Interval("chr1", 171177931, 171178094)},
- {new Interval("chr1", 183535970, 183536100), new Interval("chr1", 185269347, 185269477)},
- {new Interval("chr1", 201411300, 201411508), new Interval("chr1", 203144677, 203144885)},
- {new Interval("chr1", 212862043, 212862249), new Interval("chr1", 214795420, 214795626)},
- {new Interval("chr1", 228992499, 228992560), new Interval("chr1", 230925876, 230925937)},
- {new Interval("chr1", 246268191, 246269133), new Interval("chr1", 248201568, 248202510)},
- {new Interval("chr2", 25027765, 25027929), new Interval("chr2", 25174261, 25174425)},
- {new Interval("chr2", 32572109, 32572240), new Interval("chr2", 32718605, 32718736)},
- {new Interval("chr2", 53988959, 53989061), new Interval("chr2", 54135455, 54135557)},
- {new Interval("chr2", 71749748, 71749847), new Interval("chr2", 71896240, 71896339)},
- {new Interval("chr2", 96059879, 96060011), new Interval("chr2", 96696152, 96696284)},
- {new Interval("chr2", 109923614, 109923763), new Interval("chr2", 110566325, 110566474)},
- {new Interval("chr2", 130655571, 130655646), new Interval("chr2", 130939101, 130939176)},
- {new Interval("chr2", 159228028, 159228205), new Interval("chr2", 159519782, 159519959)},
- {new Interval("chr2", 172639236, 172639282), new Interval("chr2", 172930990, 172931036)},
- {new Interval("chr2", 189558634, 189558751), new Interval("chr2", 189850389, 189850506)},
- {new Interval("chr2", 203547300, 203547466), new Interval("chr2", 203839055, 203839221)},
- {new Interval("chr2", 219578985, 219579191), new Interval("chr2", 219870741, 219870947)},
- {new Interval("chr2", 232982284, 232982404), new Interval("chr2", 233274040, 233274160)},
- {new Interval("chr3", 3114819, 3114976), new Interval("chr3", 3139819, 3139976)},
- {new Interval("chr3", 16333337, 16333745), new Interval("chr3", 16358333, 16358741)},
- {new Interval("chr3", 40183652, 40183736), new Interval("chr3", 40208648, 40208732)},
- {new Interval("chr3", 48601077, 48601227), new Interval("chr3", 48626073, 48626223)},
- {new Interval("chr3", 52287255, 52287419), new Interval("chr3", 52312215, 52312379)},
- {new Interval("chr3", 63979313, 63979425), new Interval("chr3", 64004273, 64004385)},
- {new Interval("chr3", 110234255, 110234364), new Interval("chr3", 108751565, 108751674)},
- {new Interval("chr3", 126088466, 126088539), new Interval("chr3", 124605776, 124605849)},
- {new Interval("chr3", 137600279, 137600363), new Interval("chr3", 136117589, 136117673)},
- {new Interval("chr3", 159845116, 159845200), new Interval("chr3", 158362422, 158362506)},
- {new Interval("chr3", 185387877, 185387927), new Interval("chr3", 183905183, 183905233)},
- {new Interval("chr3", 199065658, 199065715), new Interval("chr3", 197581261, 197581318)},
- {new Interval("chr4", 10152742, 10152765), new Interval("chr4", 10543644, 10543667)},
- {new Interval("chr4", 47243396, 47243638), new Interval("chr4", 47548639, 47548881)},
- {new Interval("chr4", 72632227, 72632303), new Interval("chr4", 72413363, 72413439)},
- {new Interval("chr4", 88942682, 88942736), new Interval("chr4", 88723658, 88723712)},
- {new Interval("chr4", 114381088, 114381190), new Interval("chr4", 114161639, 114161741)},
- {new Interval("chr4", 151338602, 151338707), new Interval("chr4", 151119152, 151119257)},
- {new Interval("chr4", 184429225, 184429390), new Interval("chr4", 184192231, 184192396)},
- {new Interval("chr5", 14804176, 14804350), new Interval("chr5", 14751176, 14751350)},
- {new Interval("chr5", 43687596, 43687745), new Interval("chr5", 43651839, 43651988)},
- {new Interval("chr5", 71651730, 71651806), new Interval("chr5", 71615974, 71616050)},
- {new Interval("chr5", 95017504, 95017771), new Interval("chr5", 94991748, 94992015)},
- {new Interval("chr5", 128984208, 128984352), new Interval("chr5", 128956309, 128956453)},
- {new Interval("chr5", 140033038, 140033159), new Interval("chr5", 140052854, 140052975)},
- {new Interval("chr5", 153045976, 153046084), new Interval("chr5", 153065783, 153065891)},
- {new Interval("chr5", 176255669, 176255768), new Interval("chr5", 176323063, 176323162)},
- {new Interval("chr6", 10810586, 10810710), new Interval("chr6", 10702600, 10702724)},
- {new Interval("chr6", 30666289, 30666459), new Interval("chr6", 30558310, 30558480)},
- {new Interval("chr6", 33082591, 33082598), new Interval("chr6", 32974613, 32974620)},
- {new Interval("chr6", 39940185, 39940263), new Interval("chr6", 39832207, 39832285)},
- {new Interval("chr6", 50789726, 50789768), new Interval("chr6", 50681767, 50681809)},
- {new Interval("chr6", 79721666, 79721720), new Interval("chr6", 79664947, 79665001)},
- {new Interval("chr6", 108336822, 108336934), new Interval("chr6", 108230129, 108230241)},
- {new Interval("chr6", 131240935, 131241085), new Interval("chr6", 131199242, 131199392)},
- {new Interval("chr6", 151799272, 151799384), new Interval("chr6", 151757579, 151757691)},
- {new Interval("chr6", 169897302, 169897445), new Interval("chr6", 170155377, 170155520)},
- {new Interval("chr7", 17341792, 17341937), new Interval("chr7", 17375267, 17375412)},
- {new Interval("chr7", 38875269, 38875380), new Interval("chr7", 38908744, 38908855)},
- {new Interval("chr7", 72563000, 72563120), new Interval("chr7", 72925064, 72925184)},
- {new Interval("chr7", 89839403, 89839480), new Interval("chr7", 90001467, 90001544)},
- {new Interval("chr7", 100063781, 100063867), new Interval("chr7", 100225845, 100225931)},
- {new Interval("chr7", 111889559, 111889671), new Interval("chr7", 112102323, 112102435)},
- {new Interval("chr7", 133900771, 133900840), new Interval("chr7", 134250231, 134250300)},
- {new Interval("chr7", 149124615, 149124769), new Interval("chr7", 149493682, 149493836)},
- {new Interval("chr8", 9647462, 9647548), new Interval("chr8", 9610052, 9610138)},
- {new Interval("chr8", 27203588, 27203614), new Interval("chr8", 27147671, 27147697)},
- {new Interval("chr8", 43171970, 43172044), new Interval("chr8", 43052813, 43052887)},
- {new Interval("chr8", 76088775, 76088894), new Interval("chr8", 75926220, 75926339)},
- {new Interval("chr8", 103641854, 103642290), new Interval("chr8", 103572678, 103573114)},
- {new Interval("chr8", 133913660, 133913828), new Interval("chr8", 133844478, 133844646)},
- {new Interval("chr8", 145697031, 145697164), new Interval("chr8", 145726223, 145726356)},
- {new Interval("chr9", 26985517, 26985849), new Interval("chr9", 26995517, 26995849)},
- {new Interval("chr9", 68496721, 68496793), new Interval("chr9", 69206901, 69206973)},
- {new Interval("chr9", 94051959, 94052046), new Interval("chr9", 95012138, 95012225)},
- {new Interval("chr9", 110750285, 110750337), new Interval("chr9", 111710464, 111710516)},
- {new Interval("chr9", 124416836, 124417782), new Interval("chr9", 125377015, 125377961)},
- {new Interval("chr9", 130939690, 130939794), new Interval("chr9", 131899869, 131899973)},
- {new Interval("chr9", 138395593, 138395667), new Interval("chr9", 139275772, 139275846)},
- {new Interval("chr10", 6048112, 6048310), new Interval("chr10", 6008106, 6008304)},
- {new Interval("chr10", 26599573, 26599693), new Interval("chr10", 26559567, 26559687)},
- {new Interval("chr10", 51507890, 51507920), new Interval("chr10", 51837884, 51837914)},
- {new Interval("chr10", 74343070, 74343234), new Interval("chr10", 74673064, 74673228)},
- {new Interval("chr10", 93604764, 93604865), new Interval("chr10", 93614784, 93614885)},
- {new Interval("chr10", 101985412, 101985513), new Interval("chr10", 101995422, 101995523)},
- {new Interval("chr10", 115325644, 115325755), new Interval("chr10", 115335654, 115335765)},
- {new Interval("chr10", 129062310, 129062470), new Interval("chr10", 129172320, 129172480)},
- {new Interval("chr11", 1904274, 1904289), new Interval("chr11", 1947698, 1947713)},
- {new Interval("chr11", 11928485, 11928607), new Interval("chr11", 11971909, 11972031)},
- {new Interval("chr11", 33326642, 33326942), new Interval("chr11", 33370066, 33370366)},
- {new Interval("chr11", 55554469, 55555445), new Interval("chr11", 55797893, 55798869)},
- {new Interval("chr11", 62505888, 62506060), new Interval("chr11", 62749312, 62749484)},
- {new Interval("chr11", 65488560, 65488619), new Interval("chr11", 65731984, 65732043)},
- {new Interval("chr11", 71618353, 71618446), new Interval("chr11", 71940705, 71940798)},
- {new Interval("chr11", 89174516, 89174750), new Interval("chr11", 89534868, 89535102)},
- {new Interval("chr11", 111349955, 111350190), new Interval("chr11", 111844745, 111844980)},
- {new Interval("chr11", 120195672, 120195841), new Interval("chr11", 120690462, 120690631)},
- {new Interval("chr12", 1089617, 1089776), new Interval("chr12", 1219356, 1219515)},
- {new Interval("chr12", 8894021, 8894139), new Interval("chr12", 9002754, 9002872)},
- {new Interval("chr12", 26455518, 26455614), new Interval("chr12", 26564251, 26564347)},
- {new Interval("chr12", 46663731, 46663788), new Interval("chr12", 48377464, 48377521)},
- {new Interval("chr12", 51502394, 51502432), new Interval("chr12", 53216127, 53216165)},
- {new Interval("chr12", 55603883, 55604103), new Interval("chr12", 57317616, 57317836)},
- {new Interval("chr12", 69218200, 69218280), new Interval("chr12", 70931933, 70932013)},
- {new Interval("chr12", 97543837, 97544677), new Interval("chr12", 99019706, 99020546)},
- {new Interval("chr12", 108438951, 108439074), new Interval("chr12", 109954568, 109954691)},
- {new Interval("chr12", 119021215, 119021343), new Interval("chr12", 120536832, 120536960)},
- {new Interval("chr12", 127849755, 127849917), new Interval("chr12", 129283802, 129283964)},
- {new Interval("chr13", 28900978, 28901035), new Interval("chr13", 30002978, 30003035)},
- {new Interval("chr13", 48646570, 48646698), new Interval("chr13", 49748569, 49748697)},
- {new Interval("chr13", 98989699, 98989814), new Interval("chr13", 100191698, 100191813)},
- {new Interval("chr14", 20929460, 20929643), new Interval("chr14", 21859620, 21859803)},
- {new Interval("chr14", 33338689, 33340068), new Interval("chr14", 34268938, 34270317)},
- {new Interval("chr14", 55217155, 55217163), new Interval("chr14", 56147402, 56147410)},
- {new Interval("chr14", 71260115, 71260358), new Interval("chr14", 72190362, 72190605)},
- {new Interval("chr14", 89806293, 89806451), new Interval("chr14", 90736540, 90736698)},
- {new Interval("chr14", 102548185, 102548280), new Interval("chr14", 103478432, 103478527)},
- {new Interval("chr15", 31917122, 31918453), new Interval("chr15", 34129830, 34131161)},
- {new Interval("chr15", 40481129, 40481302), new Interval("chr15", 42693837, 42694010)},
- {new Interval("chr15", 48649374, 48649484), new Interval("chr15", 50862082, 50862192)},
- {new Interval("chr15", 61768839, 61768953), new Interval("chr15", 63981786, 63981900)},
- {new Interval("chr15", 72115399, 72115456), new Interval("chr15", 74328346, 74328403)},
- {new Interval("chr15", 83031858, 83032011), new Interval("chr15", 85230854, 85231007)},
- {new Interval("chr16", 79709, 79902), new Interval("chr16", 139709, 139902)},
- {new Interval("chr16", 2285590, 2285744), new Interval("chr16", 2345589, 2345743)},
- {new Interval("chr16", 14872977, 14873044), new Interval("chr16", 14965476, 14965543)},
- {new Interval("chr16", 23611004, 23611155), new Interval("chr16", 23703503, 23703654)},
- {new Interval("chr16", 31004784, 31005007), new Interval("chr16", 31097283, 31097506)},
- {new Interval("chr16", 55745701, 55745922), new Interval("chr16", 57188200, 57188421)},
- {new Interval("chr16", 66647766, 66647830), new Interval("chr16", 68090265, 68090329)},
- {new Interval("chr16", 79224415, 79224636), new Interval("chr16", 80666914, 80667135)},
- {new Interval("chr17", 1320663, 1320735), new Interval("chr17", 1373913, 1373985)},
- {new Interval("chr17", 5304981, 5305155), new Interval("chr17", 5364257, 5364431)},
- {new Interval("chr17", 8588568, 8588654), new Interval("chr17", 8647843, 8647929)},
- {new Interval("chr17", 18192362, 18192481), new Interval("chr17", 18251637, 18251756)},
- {new Interval("chr17", 26514328, 26514522), new Interval("chr17", 29490202, 29490396)},
- {new Interval("chr17", 35069238, 35069334), new Interval("chr17", 37815712, 37815808)},
- {new Interval("chr17", 38377148, 38377241), new Interval("chr17", 41123622, 41123715)},
- {new Interval("chr17", 44472316, 44472454), new Interval("chr17", 47117317, 47117455)},
- {new Interval("chr17", 55482984, 55483122), new Interval("chr17", 58128202, 58128340)},
- {new Interval("chr17", 64595087, 64595211), new Interval("chr17", 67083492, 67083616)},
- {new Interval("chr17", 72814816, 72814876), new Interval("chr17", 75303221, 75303281)},
- {new Interval("chr17", 78167687, 78167812), new Interval("chr17", 80574398, 80574523)},
- {new Interval("chr18", 19653801, 19653961), new Interval("chr18", 21399803, 21399963)},
- {new Interval("chr18", 46766985, 46767455), new Interval("chr18", 48512987, 48513457)},
- {new Interval("chr19", 822924, 823120), new Interval("chr19", 871924, 872120)},
- {new Interval("chr19", 4200223, 4200327), new Interval("chr19", 4249223, 4249327)},
- {new Interval("chr19", 8094666, 8094894), new Interval("chr19", 8188666, 8188894)},
- {new Interval("chr19", 11657040, 11657607), new Interval("chr19", 11796040, 11796607)},
- {new Interval("chr19", 16298665, 16298844), new Interval("chr19", 16437665, 16437844)},
- {new Interval("chr19", 19650533, 19650597), new Interval("chr19", 19789533, 19789597)},
- {new Interval("chr19", 42008351, 42008363), new Interval("chr19", 37316511, 37316523)},
- {new Interval("chr19", 46446486, 46446567), new Interval("chr19", 41754646, 41754727)},
- {new Interval("chr19", 51212087, 51212169), new Interval("chr19", 46520247, 46520329)},
- {new Interval("chr19", 55052042, 55052201), new Interval("chr19", 50360230, 50360389)},
- {new Interval("chr19", 60200495, 60200669), new Interval("chr19", 55508683, 55508857)},
- {new Interval("chr20", 3244380, 3244434), new Interval("chr20", 3296380, 3296434)},
- {new Interval("chr20", 25145282, 25145374), new Interval("chr20", 25197282, 25197374)},
- {new Interval("chr20", 35182714, 35182855), new Interval("chr20", 35749300, 35749441)},
- {new Interval("chr20", 46797751, 46797826), new Interval("chr20", 47364344, 47364419)},
- {new Interval("chr20", 61546454, 61546633), new Interval("chr20", 62076010, 62076189)},
- {new Interval("chr21", 36666540, 36666701), new Interval("chr21", 37744670, 37744831)},
- {new Interval("chr21", 46450176, 46450285), new Interval("chr21", 47625748, 47625857)},
- {new Interval("chr22", 22890366, 22890533), new Interval("chr22", 24560366, 24560533)},
- {new Interval("chr22", 32487356, 32487465), new Interval("chr22", 34157356, 34157465)},
- {new Interval("chr22", 40469028, 40469146), new Interval("chr22", 42139082, 42139200)},
- {new Interval("chr22", 49365651, 49365713), new Interval("chr22", 51018785, 51018847)},
- {new Interval("chrX", 24135748, 24135895), new Interval("chrX", 24225827, 24225974)},
- {new Interval("chrX", 48708293, 48708459), new Interval("chrX", 48823349, 48823515)},
- {new Interval("chrX", 69406673, 69406721), new Interval("chrX", 69489948, 69489996)},
- {new Interval("chrX", 101459444, 101459531), new Interval("chrX", 101572788, 101572875)},
- {new Interval("chrX", 128442357, 128442474), new Interval("chrX", 128614676, 128614793)},
- {new Interval("chrX", 152701873, 152701902), new Interval("chrX", 153048679, 153048708)},
- {new Interval("chrY", 2715028, 2715646), new Interval("chrY", 2655028, 2655646)},
- {new Interval("chrY", 26179988, 26180064), new Interval("chrY", 27770600, 27770676)},
- // Some intervals that are flipped in the new genome
- {new Interval("chr1", 2479704, 2479833, false, "target_549"), new Interval("chr1", 2494585, 2494714, true, "target_549")},
- {new Interval("chr1", 2480081, 2480116, false, "target_550"), new Interval("chr1", 2494302, 2494337, true, "target_550")},
- {new Interval("chr1", 2481162, 2481308, false, "target_551"), new Interval("chr1", 2493110, 2493256, true, "target_551")},
- {new Interval("chr1", 2482263, 2482357, false, "target_552"), new Interval("chr1", 2492061, 2492155, true, "target_552")},
- {new Interval("chr1", 2482999, 2483158, false, "target_553"), new Interval("chr1", 2491260, 2491419, true, "target_553")},
- {new Interval("chr1", 2484509, 2484638, false, "target_554"), new Interval("chr1", 2489780, 2489909, true, "target_554")},
- {new Interval("chr1", 2485143, 2485255, false, "target_555"), new Interval("chr1", 2489163, 2489275, true, "target_555")},
- {new Interval("chr1", 2486244, 2486316, false, "target_556"), new Interval("chr1", 2488102, 2488174, true, "target_556")},
- {new Interval("chr2", 110735471, 110735558, false, "target_101982"), new Interval("chr2", 110585640, 110585727, true, "target_101982")},
- {new Interval("chr2", 110735648, 110735831, false, "target_101983"), new Interval("chr2", 110585367, 110585550, true, "target_101983")},
- {new Interval("chr2", 110736772, 110736922, false, "target_101984"), new Interval("chr2", 110584276, 110584426, true, "target_101984")},
- {new Interval("chr2", 110737181, 110737322, false, "target_101985"), new Interval("chr2", 110583876, 110584017, true, "target_101985")},
- {new Interval("chr2", 110737585, 110737747, false, "target_101986"), new Interval("chr2", 110583451, 110583613, true, "target_101986")},
- {new Interval("chr2", 110738666, 110738793, false, "target_101987"), new Interval("chr2", 110582405, 110582532, true, "target_101987")},
- {new Interval("chr2", 110738957, 110739136, false, "target_101988"), new Interval("chr2", 110582062, 110582241, true, "target_101988")},
- {new Interval("chr2", 110739216, 110739401, false, "target_101989"), new Interval("chr2", 110581797, 110581982, true, "target_101989")},
- {new Interval("chr2", 110741555, 110741768, false, "target_101990"), new Interval("chr2", 110579480, 110579693, true, "target_101990")},
- {new Interval("chr2", 110743887, 110743978, false, "target_101991"), new Interval("chr2", 110577271, 110577362, true, "target_101991")},
- {new Interval("chr2", 110750021, 110750220, false, "target_101992"), new Interval("chr2", 110571035, 110571234, true, "target_101992")},
- {new Interval("chr2", 110754786, 110754935, false, "target_101993"), new Interval("chr2", 110566325, 110566474, true, "target_101993")},
- {new Interval("chr2", 110755277, 110755511, false, "target_101994"), new Interval("chr2", 110565749, 110565983, true, "target_101994")},
- {new Interval("chr2", 110759547, 110759703, false, "target_101995"), new Interval("chr2", 110561554, 110561710, true, "target_101995")},
- {new Interval("chr2", 110760135, 110760250, false, "target_101996"), new Interval("chr2", 110561007, 110561122, true, "target_101996")},
- {new Interval("chr2", 110761828, 110761899, false, "target_101997"), new Interval("chr2", 110559358, 110559429, true, "target_101997")},
- {new Interval("chr2", 110769521, 110769596, false, "target_101998"), new Interval("chr2", 110552041, 110552116, true, "target_101998")},
- {new Interval("chr2", 111012182, 111012298, false, "target_101999"), new Interval("chr2", 108484181, 108484297, true, "target_101999")},
- {new Interval("chr13", 113547048, 113547139, false, "target_51005"), new Interval("chr13", 114566804, 114566895, true, "target_51005")},
- {new Interval("chr13", 113547227, 113547397, false, "target_51006"), new Interval("chr13", 114566546, 114566716, true, "target_51006")},
- {new Interval("chr13", 113562918, 113562946, false, "target_51007"), new Interval("chr13", 114550997, 114551025, true, "target_51007")},
- {new Interval("chr13", 113564379, 113564445, false, "target_51008"), new Interval("chr13", 114549498, 114549564, true, "target_51008")},
- {new Interval("chr13", 113571118, 113571244, false, "target_51009"), new Interval("chr13", 114542699, 114542825, true, "target_51009")},
- {new Interval("chr13", 113572777, 113572903, false, "target_51010"), new Interval("chr13", 114541040, 114541166, true, "target_51010")},
- {new Interval("chr13", 113575333, 113575459, false, "target_51011"), new Interval("chr13", 114538484, 114538610, true, "target_51011")},
- {new Interval("chr13", 113576296, 113576421, false, "target_51012"), new Interval("chr13", 114537522, 114537647, true, "target_51012")},
- {new Interval("chr13", 113578216, 113578338, false, "target_51013"), new Interval("chr13", 114535605, 114535727, true, "target_51013")},
- {new Interval("chr13", 113578480, 113578673, false, "target_51014"), new Interval("chr13", 114535270, 114535463, true, "target_51014")},
- {new Interval("chr13", 113582257, 113582425, false, "target_51015"), new Interval("chr13", 114531518, 114531686, true, "target_51015")},
- {new Interval("chr13", 113583804, 113583976, false, "target_51016"), new Interval("chr13", 114529967, 114530139, true, "target_51016")},
- {new Interval("chr13", 113587418, 113587597, false, "target_51017"), new Interval("chr13", 114526346, 114526525, true, "target_51017")},
- {new Interval("chr13", 113588782, 113589014, false, "target_51018"), new Interval("chr13", 114524929, 114525161, true, "target_51018")},
- {new Interval("chr13", 113589950, 113590108, false, "target_51019"), new Interval("chr13", 114523835, 114523993, true, "target_51019")},
- {new Interval("chr13", 113599065, 113599236, false, "target_51020"), new Interval("chr13", 114514707, 114514878, true, "target_51020")},
- {new Interval("chr13", 113605940, 113606087, false, "target_51021"), new Interval("chr13", 114507856, 114508003, true, "target_51021")},
- {new Interval("chr13", 113609156, 113609319, false, "target_51022"), new Interval("chr13", 114504624, 114504787, true, "target_51022")},
- {new Interval("chr13", 113610056, 113610145, false, "target_51023"), new Interval("chr13", 114503798, 114503887, true, "target_51023")},
- {new Interval("chr13", 113611549, 113611633, false, "target_51024"), new Interval("chr13", 114502310, 114502394, true, "target_51024")},
- {new Interval("chr13", 113615731, 113615824, false, "target_51025"), new Interval("chr13", 114498119, 114498212, true, "target_51025")},
- {new Interval("chr13", 113641808, 113641874, false, "target_51026"), new Interval("chr13", 114472069, 114472135, true, "target_51026")},
- {new Interval("chr13", 113644711, 113644857, false, "target_51027"), new Interval("chr13", 114469086, 114469232, true, "target_51027")},
- {new Interval("chr13", 113651799, 113651848, false, "target_51028"), new Interval("chr13", 114462241, 114462290, true, "target_51028")},
- {new Interval("chr17", 33541604, 33542176, false, "target_76102"), new Interval("chr17", 36294030, 36294602, true, "target_76102")},
- {new Interval("chr17", 33543154, 33543310, false, "target_76103"), new Interval("chr17", 36292896, 36293052, true, "target_76103")},
- {new Interval("chr17", 33543677, 33543780, false, "target_76104"), new Interval("chr17", 36292426, 36292529, true, "target_76104")},
- {new Interval("chr17", 33544240, 33544309, false, "target_76105"), new Interval("chr17", 36291897, 36291966, true, "target_76105")},
- {new Interval("chr17", 33544690, 33544788, false, "target_76106"), new Interval("chr17", 36291418, 36291516, true, "target_76106")},
- {new Interval("chr17", 33545498, 33545622, false, "target_76107"), new Interval("chr17", 36290584, 36290708, true, "target_76107")},
- {new Interval("chr17", 33547465, 33547578, false, "target_76109"), new Interval("chr17", 36288629, 36288742, true, "target_76109")},
- {new Interval("chr17", 33547904, 33548015, false, "target_76110"), new Interval("chr17", 36288192, 36288303, true, "target_76110")},
- {new Interval("chr17", 33548455, 33548539, false, "target_76111"), new Interval("chr17", 36287668, 36287752, true, "target_76111")},
- {new Interval("chr17", 33549018, 33549061, false, "target_76112"), new Interval("chr17", 36287146, 36287189, true, "target_76112")},
- {new Interval("chr17", 33550341, 33550430, false, "target_76113"), new Interval("chr17", 36285777, 36285866, true, "target_76113")},
- {new Interval("chr17", 33550589, 33550664, false, "target_76114"), new Interval("chr17", 36285543, 36285618, true, "target_76114")},
- {new Interval("chrX", 148575967, 148576994, false, "target_184692"), new Interval("chrX", 148797411, 148798438, true, "target_184692")},
- {new Interval("chrX", 148577066, 148577143, false, "target_184693"), new Interval("chrX", 148797262, 148797339, true, "target_184693")},
- {new Interval("chrX", 148578167, 148578266, false, "target_184694"), new Interval("chrX", 148796139, 148796238, true, "target_184694")},
- {new Interval("chrX", 148579488, 148579587, false, "target_184695"), new Interval("chrX", 148794818, 148794917, true, "target_184695")},
- {new Interval("chrX", 148603758, 148603770, false, "target_184696"), new Interval("chrX", 148770634, 148770646, true, "target_184696")},
- // Some that don't map in hg19
- {new Interval("chr2", 111013693, 111013832), null},
- {new Interval("chr3", 14174511, 14175398), null},
- {new Interval("chr3", 50911035, 50911051), null},
- {new Interval("chr6", 32071709, 32071869), null},
- {new Interval("chr6", 32072183, 32072358), null},
- {new Interval("chr6", 32104446, 32104606), null},
- {new Interval("chr6", 32104920, 32105095), null},
- {new Interval("chr7", 101995561, 101995739), null},
- {new Interval("chr7", 142178782, 142178825), null},
- {new Interval("chr7", 142179850, 142180013), null},
- {new Interval("chr7", 142181067, 142181324), null},
- {new Interval("chr7", 142181720, 142181860), null},
- {new Interval("chr7", 142182157, 142182313), null},
- {new Interval("chr15", 19335778, 19336302), null},
- {new Interval("chr17", 33364376, 33364428), null},
- {new Interval("chr17", 33546162, 33546214), null},
- {new Interval("chr17", 33706667, 33706736), null},
- {new Interval("chr17", 59772721, 59772781), null},
- {new Interval("chr17", 59779355, 59779421), null},
- {new Interval("chr17", 59781483, 59781540), null},
- {new Interval("chr17", 59783488, 59783565), null},
- {new Interval("chr17", 59784584, 59784615), null},
- {new Interval("chr17", 59786025, 59786136), null},
- {new Interval("chr17", 59787203, 59787494), null},
- {new Interval("chr17", 59791235, 59791514), null},
- {new Interval("chr17", 59794247, 59794502), null},
- {new Interval("chr17", 59801884, 59802193), null},
- {new Interval("chr17", 59804685, 59804982), null},
- {new Interval("chr17", 59817352, 59817382), null},
- {new Interval("chr17", 59817465, 59817532), null},
- {new Interval("chr17", 59875754, 59875812), null},
- {new Interval("chr17", 59875899, 59875944), null},
- {new Interval("chr17", 59879183, 59879456), null},
- {new Interval("chr17", 59883988, 59884276), null},
- {new Interval("chr17", 59887398, 59887512), null},
- {new Interval("chrX", 48774611, 48775058), null},
-
- };
- }
-
- @Test(dataProvider = "failingIntervals")
- public void testDiagnosticLiftover(final Interval fromInterval) {
- final List<LiftOver.PartialLiftover> partials = liftOver.diagnosticLiftover(fromInterval);
- System.out.println("Diagnosing " + fromInterval + " (len " + fromInterval.length() + ")");
- for (final LiftOver.PartialLiftover partial : partials) {
- System.out.println(partial);
- }
- }
-
- @DataProvider(name = "failingIntervals")
- public Object[][] makeFailingIntervals() {
- return new Object[][] {
- {new Interval("chr3", 50911035, 50911051)},
- {new Interval("chr2", 111013693, 111013832)},
- {new Interval("chr3", 14174511, 14175398)},
- {new Interval("chr3", 50911035, 50911051)},
- {new Interval("chr6", 32071709, 32071869)},
- {new Interval("chr6", 32072183, 32072358)},
- {new Interval("chr6", 32104446, 32104606)},
- {new Interval("chr6", 32104920, 32105095)},
- {new Interval("chr7", 101995561, 101995739)},
- {new Interval("chr7", 142178782, 142178825)},
- {new Interval("chr7", 142179850, 142180013)},
- {new Interval("chr7", 142181067, 142181324)},
- {new Interval("chr7", 142181720, 142181860)},
- {new Interval("chr7", 142182157, 142182313)},
- {new Interval("chr15", 19335778, 19336302)},
- {new Interval("chr17", 33364376, 33364428)},
- {new Interval("chr17", 33546162, 33546214)},
- {new Interval("chr17", 33706667, 33706736)},
- {new Interval("chr17", 59772721, 59772781)},
- {new Interval("chr17", 59779355, 59779421)},
- {new Interval("chr17", 59781483, 59781540)},
- {new Interval("chr17", 59783488, 59783565)},
- {new Interval("chr17", 59784584, 59784615)},
- {new Interval("chr17", 59786025, 59786136)},
- {new Interval("chr17", 59787203, 59787494)},
- {new Interval("chr17", 59791235, 59791514)},
- {new Interval("chr17", 59794247, 59794502)},
- {new Interval("chr17", 59801884, 59802193)},
- {new Interval("chr17", 59804685, 59804982)},
- {new Interval("chr17", 59817352, 59817382)},
- {new Interval("chr17", 59817465, 59817532)},
- {new Interval("chr17", 59875754, 59875812)},
- {new Interval("chr17", 59875899, 59875944)},
- {new Interval("chr17", 59879183, 59879456)},
- {new Interval("chr17", 59883988, 59884276)},
- {new Interval("chr17", 59887398, 59887512)},
- {new Interval("chrX", 48774611, 48775058)},
-
- };
- }
-
- @Test
- public void testWriteChain() throws Exception {
- final OverlapDetector<Chain> chains = Chain.loadChains(CHAIN_FILE);
- File outFile = File.createTempFile("test.", ".chain");
- outFile.deleteOnExit();
- PrintWriter pw = new PrintWriter(outFile);
- final Map<Integer, Chain> originalChainMap = new TreeMap<Integer, Chain>();
- for (final Chain chain : chains.getAll()) {
- chain.write(pw);
- originalChainMap.put(chain.id, chain);
- }
- pw.close();
-
- final OverlapDetector<Chain> newChains = Chain.loadChains(outFile);
- final Map<Integer, Chain> newChainMap = new TreeMap<Integer, Chain>();
- for (final Chain chain : newChains.getAll()) {
- newChainMap.put(chain.id, chain);
- }
- Assert.assertEquals(newChainMap, originalChainMap);
- }
-
- @Test(dataProvider = "testIntervals")
- public void testGetContigMap(final Interval in, final Interval expected) {
- if (expected != null) {
- Assert.assertTrue(contigMap.get(in.getContig()).contains(expected.getContig()));
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java b/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java
deleted file mode 100644
index cbbbbc3..0000000
--- a/src/test/java/htsjdk/samtools/metrics/MetricBaseTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package htsjdk.samtools.metrics;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class MetricBaseTest {
-
- private static class TestMetric extends MetricBase{
- public Object anyObject;
-
- public TestMetric(final Object anyObject) {
- this.anyObject = anyObject;
- }
- }
-
- @Test
- public void testHashCodeWithNull(){
- TestMetric metric = new TestMetric(null);
- metric.hashCode(); //test that it can get a hashcode without crashing
- }
-
- @DataProvider(name = "equalityTest")
- public Object[][] equalityTestProvider(){
- return new Object[][]{
- {null,null, true},
- {null, 1, false},
- {1, null, false},
- {1, 1, true},
- {"Hi", "Hi", true},
- {"Hi", "There", false},
- {"1","1.0000000000000000001d", false},
- {"1", 1.0000000000000000001d, true}, /* Object fields are saved using instance of which performs rounding, but loaded as a string*/
- {1.00000000000000001d, 1.0000000002918d, true}, /* precision limit is set by {@link FormatUtil#DECIMAL_DIGITS_TO_PRINT}, if that changes this test may fail */
- {1.0000, 1.0001, false},
- {1.0, 1.0, true},
- {1, 2, false}
- };
- }
-
- @Test(dataProvider = "equalityTest")
- public void testEqualsNull(Object a, Object b, boolean shouldBeEqual){
- TestMetric metricA = new TestMetric(a);
- TestMetric metricB = new TestMetric(b);
- Assert.assertEquals(metricA.equals(metricB), shouldBeEqual);
-
- //check that hashcodes are the same if they're equal
- if(shouldBeEqual) {
- Assert.assertEquals(metricA.hashCode(), metricB.hashCode());
- }
- }
-
-
- public class A extends MetricBase {
- public int a = 1;
- }
- public class B extends A{
- public int b = 1;
- }
-
- @Test
- public void testSubclassEquality(){
- final A a = new A();
- final B b = new B();
- Assert.assertFalse(a.equals(b));
- Assert.assertFalse(b.equals(a));
- }
-
- @Test void testSelfEquality(){
- final A a = new A();
- final B b = new B();
- Assert.assertTrue(a.equals(a));
- Assert.assertTrue(b.equals(b));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java b/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java
deleted file mode 100644
index 228d87d..0000000
--- a/src/test/java/htsjdk/samtools/metrics/MetricsFileTest.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.FormatUtil;
-import htsjdk.samtools.util.Histogram;
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * Tests for the various classes in the metrics package. Constructs a MetricsFile,
- * populates it with various items and then ensure that it can be written to disk
- * and read back without altering any values.
- *
- * @author Tim Fennell
- */
-public class MetricsFileTest {
- public enum TestEnum {One, Two, Three}
-
- public static class TestMetric extends MetricBase implements Cloneable, Serializable {
- private static final long serialVersionUID = 1l;
-
- public String STRING_PROP;
- public Date DATE_PROP;
- public Short SHORT_PROP;
- public Integer INTEGER_PROP;
- public Long LONG_PROP;
- public Float FLOAT_PROP;
- public Double DOUBLE_PROP;
- public TestEnum ENUM_PROP;
- public Boolean BOOLEAN_PROP;
- public Character CHARACTER_PROP;
- public short SHORT_PRIMITIVE;
- public int INT_PRIMITIVE;
- public long LONG_PRIMITIVE;
- public float FLOAT_PRIMITIVE;
- public double DOUBLE_PRIMITIVE;
- public boolean BOOLEAN_PRIMITIVE;
- public char CHAR_PRIMITIVE;
-
- @Override
- public TestMetric clone() {
- try { return (TestMetric) super.clone(); }
- catch (CloneNotSupportedException cnse) { throw new SAMException("That's Unpossible!"); }
- }
- }
-
- public static class FloatingPointMetric extends MetricBase{
- public double DOUBLE_PRIMITIVE;
- public Double DOUBLE_PROP;
- public float FLOAT_PRIMITIVE;
- public Float FLOAT_PROP;
- }
-
- @Test
- public void testFloatingPointEquality() throws IOException {
- MetricsFile<FloatingPointMetric,Integer> file = new MetricsFile<FloatingPointMetric,Integer>();
-
- FloatingPointMetric metric = new FloatingPointMetric();
- metric.DOUBLE_PRIMITIVE = .0000000000000000001d;
- metric.DOUBLE_PROP = .0000000000000000001d;
- metric.FLOAT_PRIMITIVE = .0000000000000000001f;
- metric.FLOAT_PROP = .0000000000000000001f;
- file.addMetric(metric);
-
- MetricsFile<FloatingPointMetric,Integer> file2 = writeThenReadBack(file);
- Assert.assertEquals(file, file2);
-
-
-
- }
-
- @Test
- public void testWriteMetricsFile() throws IOException, ClassNotFoundException {
- MetricsFile<TestMetric,Integer> file = new MetricsFile<TestMetric,Integer>();
- TestMetric metric = new TestMetric();
- metric.STRING_PROP = "Hello World";
- metric.DATE_PROP = new FormatUtil().parseDate("2008-12-31");
- metric.SHORT_PROP = 123;
- metric.INTEGER_PROP = null;
- metric.LONG_PROP = Long.MAX_VALUE;
- metric.FLOAT_PROP = 456.789f;
- metric.DOUBLE_PROP = 0.713487;
- metric.ENUM_PROP = TestEnum.Two;
- metric.BOOLEAN_PROP = false;
- metric.CHARACTER_PROP = 'A';
- metric.SHORT_PRIMITIVE = 123;
- metric.INT_PRIMITIVE = 919834781;
- metric.LONG_PRIMITIVE = Long.MAX_VALUE - Integer.MAX_VALUE;
- metric.FLOAT_PRIMITIVE = 0.55694f;
- metric.DOUBLE_PRIMITIVE = 0.229233;
- metric.BOOLEAN_PRIMITIVE = true;
- metric.CHAR_PRIMITIVE = 'B';
- file.addMetric(metric);
-
- MetricsFile<TestMetric,Integer> file2 = writeThenReadBack(file);
- Assert.assertEquals(file, file2);
-
- // Now add some headers and run the test again
- StringHeader stringHeader = new StringHeader();
- stringHeader.setValue("Hello, I'm a String Header!");
- file.addHeader(stringHeader);
-
- VersionHeader version = new VersionHeader();
- version.setVersionedItem("MetricsFileTest");
- version.setVersionString("1.0");
- file.addHeader(version);
-
- version = new VersionHeader();
- version.setVersionedItem("Nada");
- version.setVersionString("0.0alpha1");
- file.addHeader(version);
-
- file2 = writeThenReadBack(file);
- Assert.assertEquals(file, file2);
-
- // Now add a Histogram and make sure it still works
- Histogram<Integer> histo = new Histogram<Integer>();
- histo.setBinLabel("small_number");
- histo.setValueLabel("big_number");
- histo.increment(1, 101);
- histo.increment(2, 202);
- histo.increment(3, 4000);
- histo.increment(5, 123981);
- histo.increment(1000, 10981982);
- file.setHistogram(histo);
-
- file2 = writeThenReadBack(file);
- Assert.assertEquals(file, file2);
-
- // And lastly add some more metrics rows to the file
- TestMetric metric2 = metric.clone();
- metric2.ENUM_PROP = TestEnum.One;
- metric2.FLOAT_PROP = 0.998f;
- metric2.STRING_PROP = "Wheeeee!";
- file.addMetric(metric2);
-
- metric2 = metric.clone();
- metric2.ENUM_PROP = TestEnum.Three;
- metric2.DOUBLE_PRIMITIVE = 1.299d;
- file.addMetric(metric2);
-
- file2 = writeThenReadBack(file);
- Assert.assertEquals(file, file2);
-
- //Test that we can serialize and deserialize this whole thing
- MetricsFile<TestMetric, Integer> file3 = TestUtil.serializeAndDeserialize(file);
-
- Assert.assertEquals(file, file3);
- }
-
- @Test
- public void areMetricsFilesEqualTest(){
- final File TEST_DIR = new File("src/test/resources/htsjdk/samtools/metrics/");
- final File file1 = new File(TEST_DIR,"metricsOne.metrics");
- final File file2 = new File(TEST_DIR,"metricsOneCopy.metrics");
- final File fileModifiedHist = new File(TEST_DIR,"metricsOneModifiedHistogram.metrics");
- final File fileModifiedMet = new File(TEST_DIR,"metricsOneModifiedMetrics.metrics");
-
- Assert.assertTrue(MetricsFile.areMetricsEqual(file1, file2));
- Assert.assertTrue(MetricsFile.areMetricsEqual(file1, fileModifiedHist));
-
- Assert.assertFalse(MetricsFile.areMetricsAndHistogramsEqual(file1, fileModifiedHist));
- Assert.assertFalse(MetricsFile.areMetricsEqual(file1, fileModifiedMet));
- Assert.assertFalse(MetricsFile.areMetricsAndHistogramsEqual(file1, fileModifiedMet));
- }
-
- /** Helper method to persist metrics to file and read them back again. */
- private <METRIC extends MetricBase> MetricsFile<METRIC, Integer> writeThenReadBack(MetricsFile<METRIC,Integer> in) throws IOException {
- File f = File.createTempFile("test", ".metrics");
- f.deleteOnExit();
- FileWriter out = new FileWriter(f);
- in.write(out);
-
- MetricsFile<METRIC,Integer> retval = new MetricsFile<METRIC,Integer>();
- retval.read(new FileReader(f));
- return retval;
- }
-
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java b/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java
deleted file mode 100644
index 32f1322..0000000
--- a/src/test/java/htsjdk/samtools/metrics/StringHeaderTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package htsjdk.samtools.metrics;
-
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-public class StringHeaderTest {
-
- @Test
- public void testStringHeaderSerialization() throws IOException, ClassNotFoundException {
- final Header header = new StringHeader("some value");
- final Header deserializedHeader = TestUtil.serializeAndDeserialize(header);
- Assert.assertEquals(deserializedHeader, header);
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java b/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java
deleted file mode 100644
index 576f8d1..0000000
--- a/src/test/java/htsjdk/samtools/metrics/VersionHeaderTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package htsjdk.samtools.metrics;
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-
-public class VersionHeaderTest {
-
- @Test
- public void testSerializeVersionHeader() throws IOException, ClassNotFoundException {
- final VersionHeader versionHeader = new VersionHeader();
- versionHeader.setVersionedItem("SomeThing");
- versionHeader.setVersionString("1.0.1");
- final VersionHeader deserialized = TestUtil.serializeAndDeserialize(versionHeader);
- Assert.assertEquals(deserialized, versionHeader);
-
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java b/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java
deleted file mode 100644
index a42a555..0000000
--- a/src/test/java/htsjdk/samtools/reference/FakeReferenceSequenceFile.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.cram.ref.ReferenceSource;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by vadim on 17/03/2015.
- */
-public class FakeReferenceSequenceFile implements
- ReferenceSequenceFile {
- Map<String, SAMSequenceRecord> map = new HashMap<String, SAMSequenceRecord>();
- List<String> index= new ArrayList<String>() ;
- int current = 0;
-
- public FakeReferenceSequenceFile(List<SAMSequenceRecord> sequences) {
- for (SAMSequenceRecord s:sequences) {
- map.put(s.getSequenceName(), s) ;
- index.add(s.getSequenceName()) ;
- }
- }
-
- private static ReferenceSequence buildReferenceSequence (SAMSequenceRecord samSequenceRecord) {
- byte[] bases = new byte[samSequenceRecord.getSequenceLength()] ;
- Arrays.fill(bases, (byte)'N');
- return new ReferenceSequence(samSequenceRecord.getSequenceName(), samSequenceRecord.getSequenceIndex(), bases) ;
- }
-
- @Override
- public void reset() {
- current = 0;
- }
-
- @Override
- public ReferenceSequence nextSequence() {
- if (current >= index.size()) return null;
- return buildReferenceSequence(map.get(index.get(current++)));
- }
-
- @Override
- public boolean isIndexed() {
- return true;
- }
-
- @Override
- public ReferenceSequence getSubsequenceAt(final String contig, final long start,
- final long stop) {
- byte[] bases = new byte[(int) (stop-start+1)] ;
- Arrays.fill(bases, (byte)'N');
- return new ReferenceSequence(contig, bases.length, bases) ;
- }
-
- @Override
- public SAMSequenceDictionary getSequenceDictionary() {
- return null;
- }
-
- @Override
- public ReferenceSequence getSequence(final String contig) {
- return buildReferenceSequence(map.get(contig));
- }
-
- @Override
- public void close() throws IOException {
- map.clear();
- index.clear();
- current = 0;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java
deleted file mode 100644
index 87927f6..0000000
--- a/src/test/java/htsjdk/samtools/reference/FastaSequenceFileTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.PrintWriter;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class FastaSequenceFileTest {
- @Test
- public void testTrailingWhitespace() throws Exception {
- final File fasta = File.createTempFile("test", ".fasta");
- fasta.deleteOnExit();
- final PrintWriter writer = new PrintWriter(fasta);
- final String chr1 = "chr1";
- writer.println(">" + chr1);
- final String sequence = "ACGTACGT";
- writer.println(sequence);
- writer.println(sequence + " \t");
- writer.close();
- final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
- final ReferenceSequence referenceSequence = fastaReader.nextSequence();
- Assert.assertEquals(referenceSequence.getName(), chr1);
- Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), sequence + sequence);
- }
-
- @Test
- public void testIntermediateWhitespace() throws Exception {
- final File fasta = File.createTempFile("test", ".fasta");
- fasta.deleteOnExit();
- final PrintWriter writer = new PrintWriter(fasta);
- final String chr1 = "chr1";
- writer.println(">" + chr1 + " extra stuff after sequence name");
- final String sequence = "ACGTACGT";
- writer.println(sequence + " ");
- writer.println(sequence + " \t");
- writer.println(sequence);
- writer.close();
- final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
- final ReferenceSequence referenceSequence = fastaReader.nextSequence();
- Assert.assertEquals(referenceSequence.getName(), chr1);
- Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), sequence + sequence + sequence);
- }
-
- // There was a bug when reading a fasta with trailing whitespace, only when a sequence dictionary exists.
- @Test
- public void testTrailingWhitespaceWithPreexistingSequenceDictionary() throws Exception {
- final File fasta = new File("src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta");
- final FastaSequenceFile fastaReader = new FastaSequenceFile(fasta, true);
- ReferenceSequence referenceSequence = fastaReader.nextSequence();
- Assert.assertEquals(referenceSequence.getName(), "chr1");
- Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), "ACGTACGT");
- referenceSequence = fastaReader.nextSequence();
- Assert.assertEquals(referenceSequence.getName(), "chr2");
- Assert.assertEquals(StringUtil.bytesToString(referenceSequence.getBases()), "TCGATCGA");
-
- }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java b/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java
deleted file mode 100644
index bfef121..0000000
--- a/src/test/java/htsjdk/samtools/reference/FastaSequenceIndexTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Iterator;
-
-/**
- * Test the fasta sequence index reader.
- */
-public class FastaSequenceIndexTest {
- private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/reference");
-
- @DataProvider(name="homosapiens")
- public Object[][] provideHomoSapiens() throws FileNotFoundException {
- final File sequenceIndexFile = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.fasta.fai");
- return new Object[][] { new Object[]
- { new FastaSequenceIndex(sequenceIndexFile) },
- { new FastaSequenceIndex(sequenceIndexFile.toPath()) } };
- }
-
- @DataProvider(name="specialcharacters")
- public Object[][] provideSpecialCharacters() throws FileNotFoundException {
- final File sequenceIndexFile = new File(TEST_DATA_DIR,"testing.fai");
- return new Object[][] { new Object[]
- { new FastaSequenceIndex(sequenceIndexFile) },
- { new FastaSequenceIndex(sequenceIndexFile.toPath()) } };
- }
-
- @Test(dataProvider="homosapiens")
- public void testInitialContig(FastaSequenceIndex sequenceIndex) {
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrM"),"Contig chrM is not present");
- FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chrM");
- Assert.assertEquals(entry.getContig(),"chrM","Contig chrM name is incorrect");
- Assert.assertEquals(entry.getLocation(),6L,"Contig chrM location is incorrect");
- Assert.assertEquals(entry.getSize(),16571L,"Contig chrM size is incorrect");
- Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chrM bases per line is incorrect");
- Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chrM bytes per line is incorrect");
-
- }
-
- @Test(dataProvider="homosapiens")
- public void testMiddleContig(FastaSequenceIndex sequenceIndex) {
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8"),"Contig chr8 is not present");
- FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chr8");
- Assert.assertEquals(entry.getContig(),"chr8","Contig chr8 name is incorrect");
- Assert.assertEquals(entry.getLocation(),1419403101L,"Contig chr8 location is incorrect");
- Assert.assertEquals(entry.getSize(),146274826L,"Contig chr8 size is incorrect");
- Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chr8 bases per line is incorrect");
- Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chr8 bytes per line is incorrect");
- }
-
- @Test(dataProvider="homosapiens")
- public void testLastContig(FastaSequenceIndex sequenceIndex) {
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX_random"),"Contig chrX_random is not present");
- FastaSequenceIndexEntry entry = sequenceIndex.getIndexEntry("chrX_random");
- Assert.assertEquals(entry.getContig(),"chrX_random","Contig chrX_random name is incorrect");
- Assert.assertEquals(entry.getLocation(),3156698441L,"Contig chrX_random location is incorrect");
- Assert.assertEquals(entry.getSize(),1719168L,"Contig chrX_random size is incorrect");
- Assert.assertEquals(entry.getBasesPerLine(),50,"Contig chrX_random bases per line is incorrect");
- Assert.assertEquals(entry.getBytesPerLine(),51,"Contig chrX_random bytes per line is incorrect");
- }
-
- @Test(dataProvider="homosapiens")
- public void testAllContigsPresent(FastaSequenceIndex sequenceIndex) {
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrM"),"Contig chrM is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr1"),"Contig chr1 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr2"),"Contig chr2 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr3"),"Contig chr3 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr4"),"Contig chr4 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr5"),"Contig chr5 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr6"),"Contig chr6 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr7"),"Contig chr7 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8"),"Contig chr8 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr9"),"Contig chr9 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr10"),"Contig chr10 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr11"),"Contig chr11 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr12"),"Contig chr12 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr13"),"Contig chr13 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr14"),"Contig chr14 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr15"),"Contig chr15 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr16"),"Contig chr16 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr17"),"Contig chr17 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr18"),"Contig chr18 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr19"),"Contig chr19 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr20"),"Contig chr20 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr21"),"Contig chr21 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr22"),"Contig chr22 is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX"),"Contig chrX is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrY"),"Contig chrY is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr1_random"),"Contig chr1_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr2_random"),"Contig chr2_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr3_random"),"Contig chr3_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr4_random"),"Contig chr4_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr5_random"),"Contig chr5_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr6_random"),"Contig chr6_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr7_random"),"Contig chr7_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr8_random"),"Contig chr8_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr9_random"),"Contig chr9_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr10_random"),"Contig chr10_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr11_random"),"Contig chr11_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr13_random"),"Contig chr13_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr15_random"),"Contig chr15_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr16_random"),"Contig chr16_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr17_random"),"Contig chr17_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr18_random"),"Contig chr18_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr19_random"),"Contig chr19_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr21_random"),"Contig chr21_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chr22_random"),"Contig chr22_random is not present");
- Assert.assertTrue(sequenceIndex.hasIndexEntry("chrX_random"),"Contig chrX_random is not present");
- }
-
- @Test(dataProvider="homosapiens")
- public void testHasInvalidEntry(FastaSequenceIndex sequenceIndex) {
- Assert.assertFalse(sequenceIndex.hasIndexEntry("invalid"),"Found an invalid entry");
- }
-
- @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
- public void testGetInvalidEntry(FastaSequenceIndex sequenceIndex) {
- sequenceIndex.getIndexEntry("invalid");
- }
-
- @Test(dataProvider="homosapiens")
- public void testIteration(FastaSequenceIndex sequenceIndex) {
- Iterator<FastaSequenceIndexEntry> sequenceIndexEntries = sequenceIndex.iterator();
-
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrM","Contig chrM is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr1","Contig chr1 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr2","Contig chr2 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr3","Contig chr3 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr4","Contig chr4 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr5","Contig chr5 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr6","Contig chr6 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr7","Contig chr7 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr8","Contig chr8 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr9","Contig chr9 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr10","Contig chr10 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr11","Contig chr11 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr12","Contig chr12 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr13","Contig chr13 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr14","Contig chr14 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr15","Contig chr15 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr16","Contig chr16 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr17","Contig chr17 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr18","Contig chr18 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr19","Contig chr19 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr20","Contig chr20 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr21","Contig chr21 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr22","Contig chr22 is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrX","Contig chrX is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrY","Contig chrY is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr1_random","Contig chr1_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr2_random","Contig chr2_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr3_random","Contig chr3_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr4_random","Contig chr4_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr5_random","Contig chr5_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr6_random","Contig chr6_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr7_random","Contig chr7_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr8_random","Contig chr8_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr9_random","Contig chr9_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr10_random","Contig chr10_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr11_random","Contig chr11_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr13_random","Contig chr13_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr15_random","Contig chr15_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr16_random","Contig chr16_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr17_random","Contig chr17_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr18_random","Contig chr18_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr19_random","Contig chr19_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr21_random","Contig chr21_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chr22_random","Contig chr22_random is not present");
- Assert.assertEquals(sequenceIndexEntries.next().getContig(),"chrX_random","Contig chrX_random is not present");
- Assert.assertFalse(sequenceIndexEntries.hasNext(),"Iterator still has more entries");
- }
-
- @Test(dataProvider="specialcharacters")
- public void testSpecialCharacters(FastaSequenceIndex specialCharactersIndex) {
- /* file contents:
- chrM 16571 6 50 51
- chr1;boat 247249719 16915 50 51
- chr2:money 242951149 252211635 50 51
- chr3::; 199501827 500021813 50 51
- ;;;;;; 1234 1234 1234 1234
- file:gi|17981852|ref|NC_001807.4| 16571 2911876801 70 71
- */
- Iterator<FastaSequenceIndexEntry> sequenceIndexEntries = specialCharactersIndex.iterator();
- FastaSequenceIndexEntry ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),"chrM","Contig chrM is not present");
- Assert.assertEquals(ent.getSize(),16571,"Contig chrM size is not correct");
- Assert.assertEquals(ent.getLocation(),6,"Contig chrM location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chrM bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chrM bytes per line is not correct");
-
- ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),"chr1;boat","Contig chr1;boat is not present");
- Assert.assertEquals(ent.getSize(),247249719,"Contig chr1;boat size is not correct");
- Assert.assertEquals(ent.getLocation(),16915,"Contig chr1;boat location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr1;boat bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr1;boat bytes per line is not correct");
-
- ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),"chr2:money","Contig chr2:money is not present");
- Assert.assertEquals(ent.getSize(),242951149,"Contig chr2:money size is not correct");
- Assert.assertEquals(ent.getLocation(),252211635,"Contig chr2:money location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr2:money bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr2:money bytes per line is not correct");
-
- ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),"chr3::;","Contig chr3::; is not present");
- Assert.assertEquals(ent.getSize(),199501827,"Contig chr3::; size is not correct");
- Assert.assertEquals(ent.getLocation(),500021813,"Contig chrM location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),50,"Contig chr3::; bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),51,"Contig chr3::; bytes per line is not correct");
-
- ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),";;;;;;;;","Contig ;;;;;;;; is not present");
- Assert.assertEquals(ent.getSize(),123,"Contig ;;;;;;;; size is not correct");
- Assert.assertEquals(ent.getLocation(),234,"Contig ;;;;;;;; location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),456,"Contig ;;;;;;;; bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),789,"Contig ;;;;;;;; bytes per line is not correct");
-
- ent = sequenceIndexEntries.next();
- Assert.assertEquals(ent.getContig(),"file:gi|17981852|ref|NC_001807.4|","Contig file:gi|17981852|ref|NC_001807.4| is not present");
- Assert.assertEquals(ent.getSize(),16571,"Contig file:gi|17981852|ref|NC_001807.4| size is not correct");
- Assert.assertEquals(ent.getLocation(),2911876801L,"Contig file:gi|17981852|ref|NC_001807.4| location is not correct");
- Assert.assertEquals(ent.getBasesPerLine(),70,"Contig file:gi|17981852|ref|NC_001807.4| bases per line is not correct");
- Assert.assertEquals(ent.getBytesPerLine(),71,"Contig file:gi|17981852|ref|NC_001807.4| bytes per line is not correct");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java b/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java
deleted file mode 100644
index ce15f59..0000000
--- a/src/test/java/htsjdk/samtools/reference/InMemoryReferenceSequenceFile.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class InMemoryReferenceSequenceFile implements
- ReferenceSequenceFile {
- Map<String, ReferenceSequence> map = new HashMap<String, ReferenceSequence>();
- List<String> index;
- int current = 0;
-
- public void add(final String name, final byte[] bases) {
- final ReferenceSequence sequence = new ReferenceSequence(name,
- map.size(), bases);
- map.put(sequence.getName(), sequence);
- }
-
- @Override
- public void reset() {
- current = 0;
- }
-
- @Override
- public ReferenceSequence nextSequence() {
- if (current >= index.size()) return null;
- return map.get(index.get(current++));
- }
-
- @Override
- public boolean isIndexed() {
- return true;
- }
-
- @Override
- public ReferenceSequence getSubsequenceAt(final String contig, final long start,
- final long stop) {
- final ReferenceSequence sequence = getSequence(contig);
- if (sequence == null) return null;
- final byte[] bases = new byte[(int) (stop - start) + 1];
- System.arraycopy(sequence.getBases(), (int) start - 1, bases, 0,
- bases.length);
- return new ReferenceSequence(contig, sequence.getContigIndex(),
- bases);
- }
-
- @Override
- public SAMSequenceDictionary getSequenceDictionary() {
- return null;
- }
-
- @Override
- public ReferenceSequence getSequence(final String contig) {
- return map.get(contig);
- }
-
- @Override
- public void close() throws IOException {
- map.clear();
- index.clear();
- current = 0;
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java b/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java
deleted file mode 100644
index 086b3be..0000000
--- a/src/test/java/htsjdk/samtools/reference/IndexedFastaSequenceFileTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.StringUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-
-/**
- * Test the indexed fasta sequence file reader.
- */
-public class IndexedFastaSequenceFileTest{
- private static File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/reference");
- private static File SEQUENCE_FILE = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.fasta");
- private static File SEQUENCE_FILE_NODICT = new File(TEST_DATA_DIR,"Homo_sapiens_assembly18.trimmed.nodict.fasta");
-
- private final String firstBasesOfChrM = "GATCACAGGTCTATCACCCT";
- private final String extendedBasesOfChrM = "GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT" +
- "TTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTG" +
- "GAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATT";
- private final String lastBasesOfChr20 = "ttgtctgatgctcatattgt";
- private final int CHR20_LENGTH = 1000000;
-
- @DataProvider(name="homosapiens")
- public Object[][] provideSequenceFile() throws FileNotFoundException {
- return new Object[][] { new Object[]
- { new IndexedFastaSequenceFile(SEQUENCE_FILE) },
- { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT) },
- { new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },
- { new IndexedFastaSequenceFile(SEQUENCE_FILE_NODICT.toPath()) }};
- }
-
- @DataProvider(name="comparative")
- public Object[][] provideOriginalAndNewReaders() throws FileNotFoundException {
- return new Object[][] {
- new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE),
- new IndexedFastaSequenceFile(SEQUENCE_FILE) },
- new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE, true),
- new IndexedFastaSequenceFile(SEQUENCE_FILE) },
- new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.toPath()),
- new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },
- new Object[] { ReferenceSequenceFileFactory.getReferenceSequenceFile(SEQUENCE_FILE.toPath(), true),
- new IndexedFastaSequenceFile(SEQUENCE_FILE.toPath()) },};
- }
-
- @Test(dataProvider="homosapiens")
- public void testOpenFile(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- Assert.assertNotNull(sequenceFile);
- long endTime = System.currentTimeMillis();
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testOpenFile runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="homosapiens")
- public void testFirstSequence(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,firstBasesOfChrM.length());
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),firstBasesOfChrM,"First n bases of chrM are incorrect");
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testFirstSequence runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="homosapiens")
- public void testFirstSequenceExtended(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",1,extendedBasesOfChrM.length());
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),extendedBasesOfChrM,"First n bases of chrM are incorrect");
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testFirstSequenceExtended runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="homosapiens")
- public void testReadStartingInCenterOfFirstLine(IndexedFastaSequenceFile sequenceFile) {
- final int bytesToChopOff = 5;
- String truncated = extendedBasesOfChrM.substring(bytesToChopOff);
-
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",
- bytesToChopOff + 1,
- bytesToChopOff + truncated.length());
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),truncated,"First n bases of chrM are incorrect");
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testReadStartingInCenterOfFirstLine runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="homosapiens")
- public void testReadStartingInCenterOfMiddleLine(IndexedFastaSequenceFile sequenceFile) {
- final int bytesToChopOff = 120;
- String truncated = extendedBasesOfChrM.substring(bytesToChopOff);
-
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chrM",
- bytesToChopOff + 1,
- bytesToChopOff + truncated.length());
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),truncated,"First n bases of chrM are incorrect");
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testReadStartingInCenterOfMiddleLine runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="comparative")
- public void testFirstCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
- ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSequence("chrM");
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
- CloserUtil.close(originalSequenceFile);
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testFirstCompleteContigRead runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
- public void testReadThroughEndOfContig(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- try {
- sequenceFile.getSubsequenceAt("chrM",16500,16600);
- }
- finally {
- long endTime = System.currentTimeMillis();
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testReadThroughEndOfContig runtime: %dms%n", (endTime - startTime)) ;
- }
- }
-
- @Test(dataProvider="homosapiens",expectedExceptions=SAMException.class)
- public void testReadPastEndOfContig(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- try {
- sequenceFile.getSubsequenceAt("chrM",16800,16900);
- }
- finally {
- long endTime = System.currentTimeMillis();
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testReadPastEndOfContig runtime: %dms%n", (endTime - startTime)) ;
- }
- }
-
- @Test(dataProvider="comparative")
- public void testLastCompleteContigRead(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
- ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
- while( !expectedSequence.getName().equals("chr20") )
- expectedSequence = originalSequenceFile.nextSequence();
-
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSequence("chr20");
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrX_random is incorrect");
-
- CloserUtil.close(originalSequenceFile);
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testLastCompleteContigRead runtime: %dms%n", (endTime - startTime)) ;
- }
-
-
- @Test(dataProvider="homosapiens")
- public void testLastOfChr20(IndexedFastaSequenceFile sequenceFile) {
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.getSubsequenceAt("chr20",
- CHR20_LENGTH - lastBasesOfChr20.length()+1,
- CHR20_LENGTH);
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),lastBasesOfChr20,"First n bases of chr1 are incorrect");
-
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testFirstOfChr1 runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="comparative")
- public void testFirstElementOfIterator(ReferenceSequenceFile originalSequenceFile,IndexedFastaSequenceFile sequenceFile) {
- ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
- long startTime = System.currentTimeMillis();
- ReferenceSequence sequence = sequenceFile.nextSequence();
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(), "chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(), 0,"Sequence contig index is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
- CloserUtil.close(originalSequenceFile);
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testFirstElementOfIterator runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="comparative")
- public void testNextElementOfIterator(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
- // Skip past the first one and load the second one.
- originalSequenceFile.nextSequence();
- ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
- long startTime = System.currentTimeMillis();
- sequenceFile.nextSequence();
- ReferenceSequence sequence = sequenceFile.nextSequence();
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chr20","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),1,"Sequence contig index is not correct");
- Assert.assertEquals(sequence.length(),expectedSequence.length(),"Sequence size is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chr1 is incorrect");
-
- CloserUtil.close(originalSequenceFile);
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testNextElementOfIterator runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(dataProvider="comparative")
- public void testReset(ReferenceSequenceFile originalSequenceFile, IndexedFastaSequenceFile sequenceFile) {
- // Skip past the first one and load the second one.
- ReferenceSequence expectedSequence = originalSequenceFile.nextSequence();
-
- long startTime = System.currentTimeMillis();
- sequenceFile.nextSequence();
- sequenceFile.nextSequence();
- sequenceFile.reset();
- ReferenceSequence sequence = sequenceFile.nextSequence();
- long endTime = System.currentTimeMillis();
-
- Assert.assertEquals(sequence.getName(),"chrM","Sequence contig is not correct");
- Assert.assertEquals(sequence.getContigIndex(),0,"Sequence contig index is not correct");
- Assert.assertEquals(sequence.length(),expectedSequence.length(), "Sequence size is not correct");
- Assert.assertEquals(StringUtil.bytesToString(sequence.getBases()),StringUtil.bytesToString(expectedSequence.getBases()),"chrM is incorrect");
-
- CloserUtil.close(originalSequenceFile);
- CloserUtil.close(sequenceFile);
-
- System.err.printf("testReset runtime: %dms%n", (endTime - startTime)) ;
- }
-
- @Test(expectedExceptions = FileNotFoundException.class)
- public void testMissingFile() throws Exception {
- new IndexedFastaSequenceFile(new File(TEST_DATA_DIR, "non-existent.fasta"));
- Assert.fail("FileNotFoundException should have been thrown");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java
deleted file mode 100644
index 6eeae7b..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileFactoryTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.samtools.reference;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Simple tests for the reference sequence file factory
- */
-public class ReferenceSequenceFileFactoryTests {
- public static final File hg18 = new File("src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta");
-
- @Test public void testPositivePath() {
- final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18);
- Assert.assertTrue(f instanceof AbstractFastaSequenceFile);
- }
-
- @Test public void testGetIndexedReader() {
- final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true, true);
- Assert.assertTrue(f instanceof IndexedFastaSequenceFile, "Got non-indexed reader when expecting indexed reader.");
- }
-
- @Test public void testGetNonIndexedReader1() {
- final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, false, true);
- Assert.assertTrue(f instanceof FastaSequenceFile, "Got indexed reader when truncating at whitespace! FAI must truncate.");
- }
-
- @Test public void testGetNonIndexedReader2() {
- final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true, false);
- Assert.assertTrue(f instanceof FastaSequenceFile, "Got indexed reader when requesting non-indexed reader.");
- }
-
- @Test public void testDefaultToIndexed() {
- final ReferenceSequenceFile f = ReferenceSequenceFileFactory.getReferenceSequenceFile(hg18, true);
- Assert.assertTrue(f instanceof IndexedFastaSequenceFile, "Got non-indexed reader by default.");
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java
deleted file mode 100644
index fa746d6..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceFileWalkerTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.reference;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.util.CloserUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Created by farjoun on 2/14/14.
- */
-public class ReferenceSequenceFileWalkerTest {
-
-
- @DataProvider(name = "TestReference")
- public Object[][] TestReference() {
- return new Object[][]{
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 0, 1},
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, 1},
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 0, 0},
- };
- }
-
-
- @Test(dataProvider = "TestReference")
- public void testGet(final String fileName, final int index1, final int index2) throws SAMException {
- final File refFile = new File(fileName);
- final ReferenceSequenceFileWalker refWalker = new ReferenceSequenceFileWalker(refFile);
-
- ReferenceSequence sequence = refWalker.get(index1);
- Assert.assertEquals(sequence.getContigIndex(), index1);
-
- sequence = refWalker.get(index2);
- Assert.assertEquals(sequence.getContigIndex(), index2);
- CloserUtil.close(refWalker);
- }
-
-
- @DataProvider(name = "TestFailReference")
- public Object[][] TestFailReference() {
- return new Object[][]{
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 1,3}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 2,3}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", 1,0}, //fail because not allowed to look back
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta", -1,0}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", -1, 0}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, -1}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 2,3}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1,3}, //fail because out of bounds
- new Object[]{"src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta", 1, 0} // fasta is indexed, but not allowed to look back
- };
- }
-
-
- @Test(expectedExceptions = {SAMException.class}, dataProvider = "TestFailReference")
- public void testFailGet(final String fileName, final int index1, final int index2) throws SAMException {
- final File refFile = new File(fileName);
- final ReferenceSequenceFileWalker refWalker = new ReferenceSequenceFileWalker(refFile);
-
- try {
- refWalker.get(index1);
-
- refWalker.get(index2);
- }
- finally {
- CloserUtil.close(refWalker);
- }
- }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java b/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java
deleted file mode 100644
index 797b0b3..0000000
--- a/src/test/java/htsjdk/samtools/reference/ReferenceSequenceTests.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.reference;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.util.Random;
-
-/**
- * Tests for the reading of reference sequences in various formats.
- *
- * @author Tim Fennell
- */
-public class ReferenceSequenceTests {
- private static final byte[] BASES = "acgtACGTN".getBytes();
- private final Random random = new Random();
-
- @Test(dataProvider="fastaTestParameters")
- public void testSingleShortSequence(int chroms, int basesPerChrom) throws Exception {
- File f = makeRandomReference(chroms, basesPerChrom);
- ReferenceSequenceFile ref = ReferenceSequenceFileFactory.getReferenceSequenceFile(f);
-
- for (int i=1; i<=chroms; ++i) {
- ReferenceSequence seq = ref.nextSequence();
- Assert.assertNotNull(seq);
- Assert.assertEquals(seq.length(), basesPerChrom);
- Assert.assertEquals(seq.getName(), "chr" + i);
- Assert.assertEquals(seq.getContigIndex(), i-1);
- }
-
- Assert.assertNull(ref.nextSequence());
- }
-
- @DataProvider
- Object[][] fastaTestParameters() {
- return new Object[][] {
- new Object[] { 1, 60},
- new Object[] { 2, 60},
- new Object[] {10, 60},
- new Object[] { 1, 1000},
- new Object[] { 2, 1000},
- new Object[] {10, 1000},
- new Object[] { 1, 250000},
- new Object[] { 2, 250000},
- new Object[] {10, 250000}
- };
- }
-
-
- /** Utility method to write a random reference sequence of specified length. */
- private File makeRandomReference(int chroms, int basesPerChrom) throws Exception {
- File file = File.createTempFile("reference.", ".fasta");
- file.deleteOnExit();
- BufferedWriter out = new BufferedWriter(new FileWriter(file));
-
- for (int i=1; i<=chroms; ++i) {
- out.write("> chr" + i);
- out.newLine();
-
- for (int j=1; j<=basesPerChrom; ++j) {
- out.write(BASES[random.nextInt(BASES.length)]);
-
- if (j % 80 == 0 || j == basesPerChrom) out.newLine();
- }
- }
-
- out.flush();
- out.close();
- return file;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java
deleted file mode 100644
index 9720218..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableBufferedStreamTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-import static org.testng.Assert.assertEquals;
-
-public class SeekableBufferedStreamTest {
-
-// private final File BAM_INDEX_FILE = new File("testdata/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai");
- private final File BAM_FILE = new File("src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam");
- private final String BAM_URL_STRING = "http://broadinstitute.github.io/picard/testdata/index_test.bam";
- private static File TestFile = new File("src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat");
-
- /**
- * Test reading across a buffer boundary (buffer size is 512000). The test first reads a range of
- * bytes using an unbuffered stream file stream, then compares this to results from a buffered http stream.
- *
- * @throws IOException
- */
- @Test
- public void testRandomRead() throws IOException {
-
- int startPosition = 500000;
- int length = 50000;
-
- byte[] buffer1 = new byte[length];
- SeekableStream unBufferedStream = new SeekableFileStream(BAM_FILE);
- unBufferedStream.seek(startPosition);
- int bytesRead = unBufferedStream.read(buffer1, 0, length);
- assertEquals(length, bytesRead);
-
- byte[] buffer2 = new byte[length];
- SeekableStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)));
- bufferedStream.seek(startPosition);
- bytesRead = bufferedStream.read(buffer2, 0, length);
- assertEquals(length, bytesRead);
-
- assertEquals(buffer1, buffer2);
- }
-
- /**
- * Test an attempt to read past the end of the file. The test file is 594,149 bytes in length. The test
- * attempts to read a 1000 byte block starting at position 594000. A correct result would return 149 bytes.
- *
- * @throws IOException
- */
- @Test
- public void testEOF() throws IOException {
-
- int remainder = 149;
- long fileLength = BAM_FILE.length();
- long startPosition = fileLength - remainder;
- int length = 1000;
-
-
- byte[] buffer = new byte[length];
- SeekableStream bufferedStream = new SeekableBufferedStream(new SeekableHTTPStream(new URL(BAM_URL_STRING)));
- bufferedStream.seek(startPosition);
- int bytesRead = bufferedStream.read(buffer, 0, length);
- assertEquals(remainder, bytesRead);
-
- // Subsequent reads should return -1
- bytesRead = bufferedStream.read(buffer, 0, length);
- assertEquals(-1, bytesRead);
- }
-
- @Test
- public void testSkip() throws IOException {
- final int[] BUFFER_SIZES = new int[]{8, 96, 1024, 8*1024, 16*1024, 96*1024, 48*1024};
-
- for (final int bufferSize : BUFFER_SIZES) {
- final SeekableBufferedStream in1 = new SeekableBufferedStream(new SeekableFileStream(BAM_FILE), bufferSize);
- final SeekableBufferedStream in2 = new SeekableBufferedStream(new SeekableFileStream(BAM_FILE), bufferSize);
-
- final int SIZE = 10000;
- final byte[] bytes1 = new byte[SIZE];
- final byte[] bytes2 = new byte[SIZE];
-
- reallyRead(bytes1, in1);
- reallyRead(bytes1, in1);
- in1.skip(bytes1.length);
- reallyRead(bytes1, in1);
-
- reallyRead(bytes2, in2);
- reallyRead(bytes2, in2);
- in2.seek(bytes2.length * 3);
- reallyRead(bytes2, in2);
-
- in1.close();
- in2.close();
-
- Assert.assertEquals(bytes1, bytes2, "Error at buffer size " + bufferSize);
- }
- }
-
- private int reallyRead(final byte[] bytes, final SeekableBufferedStream in) throws IOException {
- int read = 0, total = 0;
- do {
- read = in.read(bytes, total, bytes.length-total);
- total += read;
- } while (total != bytes.length && read > 0);
-
- return total;
- }
-
-
- @Test
- public void testDivisableReads()throws IOException{
-
- testReadsLength(1);
- testReadsLength(2);
- testReadsLength(4);
- testReadsLength(5);
- testReadsLength(10);
- testReadsLength(20);
- testReadsLength(50);
- testReadsLength(100);
-
- }
-
- private void testReadsLength(final int length) throws IOException {
-
- final int BUFFERED_STREAM_BUFFER_SIZE = 100;
- final byte buffer[]=new byte[BUFFERED_STREAM_BUFFER_SIZE*10];
- final SeekableFileStream fileStream = new SeekableFileStream(TestFile);
- final SeekableBufferedStream bufferedStream = new SeekableBufferedStream(fileStream,BUFFERED_STREAM_BUFFER_SIZE);
-
- for( int i=0; i<10*BUFFERED_STREAM_BUFFER_SIZE/length ; ++i ){
- assertEquals(bufferedStream.read(buffer, 0, length), length);
- }
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java
deleted file mode 100644
index 966c18e..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableFTPStreamTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * @author Jim Robinson
- * @since 10/3/11
- */
-public class SeekableFTPStreamTest {
-
-
- static String urlString = "ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt";
- static long fileSize = 27;
- static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes();
- SeekableFTPStream stream;
-
- @BeforeMethod
- public void setUp() throws IOException {
- stream = new SeekableFTPStream(new URL(urlString));
-
- }
-
- @AfterMethod
- public void tearDown() throws IOException {
- stream.close();
- }
-
- @Test
- public void testLength() throws Exception {
- long length = stream.length();
- Assert.assertEquals(fileSize, length);
- }
-
-
- /**
- * Test a buffered read. The buffer is much large than the file size, assert that the desired # of bytes are read
- *
- * @throws Exception
- */
- @Test
- public void testBufferedRead() throws Exception {
-
- byte[] buffer = new byte[64000];
- int nRead = stream.read(buffer);
- Assert.assertEquals(fileSize, nRead);
-
- }
-
- /**
- * Test requesting a range that extends beyond the end of the file
- */
-
- @Test
- public void testRange() throws Exception {
- stream.seek(20);
- byte[] buffer = new byte[64000];
- int nRead = stream.read(buffer);
- Assert.assertEquals(fileSize - 20, nRead);
-
- }
-
- /**
- * Test requesting a range that begins beyond the end of the file
- */
-
- @Test
- public void testBadRange() throws Exception {
- stream.seek(30);
- byte[] buffer = new byte[64000];
- int nRead = stream.read(buffer);
- Assert.assertEquals(-1, nRead);
- }
-
-
-}
-
-
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java
deleted file mode 100644
index 35e1545..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableFileStreamTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.BufferedLineReader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Created by IntelliJ IDEA.
- * User: jrobinso
- * Date: Dec 20, 2009
- * Time: 11:13:19 AM
- * To change this template use File | Settings | File Templates.
- */
-public class SeekableFileStreamTest {
-
- @Test
- public void testSeek() throws Exception {
- String expectedLine = "ccccccccc";
- File testFile = new File("src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt");
- SeekableFileStream is = new SeekableFileStream(testFile);
- is.seek(20);
- BufferedLineReader reader = new BufferedLineReader(is);
- String nextLine = reader.readLine();
- Assert.assertEquals(expectedLine, nextLine);
- reader.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java
deleted file mode 100644
index 09ad92d..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableMemoryStreamTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.seekablestream;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.EOFException;
-import java.io.IOException;
-
-public class SeekableMemoryStreamTest {
-
- @Test
- public void test_getSource() {
- String source = "source";
- SeekableMemoryStream stream = new SeekableMemoryStream("qwe".getBytes(), source);
- Assert.assertEquals(stream.getSource(), source);
- }
-
- @Test
- public void test_EOF() throws IOException {
- SeekableMemoryStream stream = new SeekableMemoryStream(new byte[]{}, null);
- Assert.assertTrue(stream.eof());
- Assert.assertEquals(stream.read(), -1);
- Assert.assertTrue(stream.eof());
- }
-
- @Test
- public void test_read_byte() throws IOException {
- byte[] data = new byte[1024];
- for (int i = 0; i < data.length; i++) {
- data[i] = (byte) i;
- }
- SeekableMemoryStream stream = new SeekableMemoryStream(data, null);
-
- for (int i = 0; i < data.length; i++) {
- byte expectedByteValue = (byte) i;
- Assert.assertEquals((byte) stream.read(), expectedByteValue);
- }
- }
-
- @Test
- public void test_read_into_array() throws IOException {
- byte[] data = new byte[1024];
- for (int i = 0; i < data.length; i++) {
- data[i] = (byte) i;
- }
- SeekableMemoryStream stream = new SeekableMemoryStream(data, null);
-
- byte[] copy = new byte[data.length];
-
- int length = data.length;
- int numberOfBytesReadSoFar = 0, maxBytesPerRead = 11;
- while (numberOfBytesReadSoFar < length) {
- final int count = stream.read(copy, numberOfBytesReadSoFar, Math.min(maxBytesPerRead, length - numberOfBytesReadSoFar));
- if (count < 0) {
- throw new EOFException();
- }
- numberOfBytesReadSoFar += count;
- }
-
- Assert.assertEquals(copy, data);
- }
-
- @Test(expectedExceptions = IOException.class)
- public void test_reset() throws IOException {
- SeekableMemoryStream stream = new SeekableMemoryStream("qwe".getBytes(), null);
- stream.mark(3);
- stream.reset();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java
deleted file mode 100644
index 067f5be..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekablePathStreamTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.seekablestream;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class SeekablePathStreamTest {
-
- @Test
- public void testRead() throws Exception {
- Path testPath = new File("src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt").toPath();
- SeekablePathStream is = new SeekablePathStream(testPath);
- Assert.assertEquals(is.position(), 0);
- Assert.assertEquals(is.read(), (int) 'a');
- Assert.assertEquals(is.position(), 1);
- is.seek(20);
- Assert.assertEquals(is.position(), 20);
- byte[] buf = new byte[2];
- Assert.assertEquals(is.read(buf, 0, buf.length), 2);
- Assert.assertEquals(buf, new byte[] { (byte) 'c', (byte) 'c' });
- Assert.assertEquals(is.skip(8), 8);
- Assert.assertEquals(is.position(), 30);
- Assert.assertEquals(is.length(), Files.size(testPath));
- is.close();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java b/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java
deleted file mode 100644
index 5eb0af6..0000000
--- a/src/test/java/htsjdk/samtools/seekablestream/SeekableStreamFactoryTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package htsjdk.samtools.seekablestream;
-
-import htsjdk.samtools.util.TestUtil;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-public class SeekableStreamFactoryTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools");
-
- @Test
- public void testIsFilePath() throws Exception {
- Assert.assertEquals(SeekableStreamFactory.isFilePath("x"), true);
- Assert.assertEquals(SeekableStreamFactory.isFilePath(""), true);
- Assert.assertEquals(SeekableStreamFactory.isFilePath("http://broadinstitute.org"), false);
- Assert.assertEquals(SeekableStreamFactory.isFilePath("https://broadinstitute.org"), false);
- Assert.assertEquals(SeekableStreamFactory.isFilePath("ftp://broadinstitute.org"), false);
- }
-
- @DataProvider(name="getStreamForData")
- public Object[][] getStreamForData() throws Exception {
- return new Object[][] {
- { new File(TEST_DATA_DIR, "BAMFileIndexTest/index_test.bam").getAbsolutePath(),
- new File(TEST_DATA_DIR, "BAMFileIndexTest/index_test.bam").getAbsolutePath() },
- { new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath(),
- new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath() },
- { new URL("file://" + new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath()).toExternalForm(),
- new File(TEST_DATA_DIR, "cram_with_bai_index.cram").getAbsolutePath() },
- { new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam").toExternalForm(),
- new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam").toExternalForm() },
- { new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai").toExternalForm(),
- new URL(TestUtil.BASE_URL_FOR_HTTP_TESTS + "index_test.bam.bai").toExternalForm() }
- };
- }
-
- @Test(dataProvider = "getStreamForData")
- public void testGetStreamFor(final String path, final String expectedPath) throws IOException {
- Assert.assertEquals(SeekableStreamFactory.getInstance().getStreamFor(path).getSource(), expectedPath);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java b/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java
deleted file mode 100644
index 297b892..0000000
--- a/src/test/java/htsjdk/samtools/sra/AbstractSRATest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import org.testng.Assert;
-import org.testng.SkipException;
-import org.testng.annotations.BeforeGroups;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.lang.reflect.Method;
-import java.util.NoSuchElementException;
-
- at Test(groups = "sra")
-public abstract class AbstractSRATest {
- private static boolean canResolveNetworkAccession = false;
- private static String checkAccession = "SRR000123";
-
- @BeforeGroups(groups = "sra")
- public final void checkIfCanResolve() {
- if (SRAAccession.checkIfInitialized() != null) {
- return;
- }
- canResolveNetworkAccession = SRAAccession.isValid(checkAccession);
- }
-
- @BeforeMethod
- public final void assertSRAIsSupported() {
- if(SRAAccession.checkIfInitialized() != null){
- throw new SkipException("Skipping SRA Test because SRA native code is unavailable.");
- }
- }
-
- @BeforeMethod
- public final void skipIfCantResolve(Method method, Object[] params) {
- String accession = null;
-
- if (params.length > 0) {
- Object firstParam = params[0];
- if (firstParam instanceof String) {
- accession = (String)firstParam;
- } else if (firstParam instanceof SRAAccession) {
- accession = firstParam.toString();
- }
- }
-
- if (accession != null &&
- accession.matches(SRAAccession.REMOTE_ACCESSION_PATTERN) && !canResolveNetworkAccession) {
- throw new SkipException("Skipping network SRA Test because cannot resolve remote SRA accession '" +
- checkAccession + "'.");
- }
- }
-
- /**
- * Exhaust the iterator and check that it produce the expected number of mapped and unmapped reads.
- * Also checks that the hasNext() agrees with the actual results of next() for the given iterator.
- * @param expectedNumMapped expected number of mapped reads, specify -1 to skip this check
- * @param expectedNumUnmapped expected number of unmapped reads, specify -1 to skip this check
- */
- static void assertCorrectCountsOfMappedAndUnmappedRecords(SAMRecordIterator samRecordIterator,
- int expectedNumMapped, int expectedNumUnmapped) {
- int numMapped = 0, numUnmapped = 0;
- while (true) {
- boolean hasRecord = samRecordIterator.hasNext();
- SAMRecord record;
- try {
- record = samRecordIterator.next();
- Assert.assertNotNull(record);
- Assert.assertTrue(hasRecord); // exception is not thrown if we came to this point
- } catch (final NoSuchElementException e) {
- Assert.assertFalse(hasRecord);
- break;
- }
-
- if (record.getReadUnmappedFlag()) {
- numUnmapped++;
- } else {
- numMapped++;
- }
- }
-
- if (expectedNumMapped != -1) {
- Assert.assertEquals(numMapped, expectedNumMapped);
- }
- if (expectedNumUnmapped != -1) {
- Assert.assertEquals(numUnmapped, expectedNumUnmapped);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java b/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java
deleted file mode 100644
index 4b89b7e..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAAccessionTest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package htsjdk.samtools.sra;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for SRAAccession logic
- */
-public class SRAAccessionTest extends AbstractSRATest {
-
- @DataProvider(name = "isValidAccData")
- private Object[][] getIsValidAccData() {
- return new Object[][] {
- { "SRR000123", true },
- { "DRR010511", true },
- { "src/test/resources/htsjdk/samtools/sra/test_archive.sra", true },
- { "src/test/resources/htsjdk/samtools/compressed.bam", false },
- { "src/test/resources/htsjdk/samtools/uncompressed.sam", false },
- };
- }
-
- @Test(dataProvider = "isValidAccData")
- public void testIsValidAcc(String accession, boolean isValid) {
- Assert.assertEquals(isValid, SRAAccession.isValid(accession));
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java b/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java
deleted file mode 100644
index 0cdfc69..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAIndexTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.Bin;
-import htsjdk.samtools.GenomicIndexUtil;
-import htsjdk.samtools.SRAFileReader;
-import htsjdk.samtools.SRAIndex;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Unit tests for SRAIndex
- *
- * Created by andrii.nikitiuk on 10/28/15.
- */
-public class SRAIndexTest extends AbstractSRATest {
- private static final SRAAccession DEFAULT_ACCESSION = new SRAAccession("SRR2096940");
- private static final int LAST_BIN_LEVEL = GenomicIndexUtil.LEVEL_STARTS.length - 1;
- private static final int SRA_BIN_OFFSET = GenomicIndexUtil.LEVEL_STARTS[LAST_BIN_LEVEL];
-
- @Test
- public void testLevelSize() {
- final SRAIndex index = getIndex(DEFAULT_ACCESSION);
- Assert.assertEquals(index.getLevelSize(0), GenomicIndexUtil.LEVEL_STARTS[1] - GenomicIndexUtil.LEVEL_STARTS[0]);
-
- Assert.assertEquals(index.getLevelSize(LAST_BIN_LEVEL), GenomicIndexUtil.MAX_BINS - GenomicIndexUtil.LEVEL_STARTS[LAST_BIN_LEVEL] - 1);
- }
-
- @Test
- public void testLevelForBin() {
- final SRAIndex index = getIndex(DEFAULT_ACCESSION);
- final Bin bin = new Bin(0, SRA_BIN_OFFSET);
- Assert.assertEquals(index.getLevelForBin(bin), LAST_BIN_LEVEL);
- }
-
- @DataProvider(name = "testBinLocuses")
- private Object[][] createDataForBinLocuses() {
- return new Object[][] {
- {DEFAULT_ACCESSION, 0, 0, 1, SRAIndex.SRA_BIN_SIZE},
- {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 2}
- };
- }
-
- @Test(dataProvider = "testBinLocuses")
- public void testBinLocuses(SRAAccession acc, int reference, int binIndex, int firstLocus, int lastLocus) {
- final SRAIndex index = getIndex(acc);
- final Bin bin = new Bin(reference, SRA_BIN_OFFSET + binIndex);
-
- Assert.assertEquals(index.getFirstLocusInBin(bin), firstLocus);
- Assert.assertEquals(index.getLastLocusInBin(bin), lastLocus);
- }
-
- @DataProvider(name = "testBinOverlappings")
- private Object[][] createDataForBinOverlappings() {
- return new Object[][] {
- {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE, new HashSet<>(Arrays.asList(0))},
- {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 2, new HashSet<>(Arrays.asList(1))},
- {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE + 1, SRAIndex.SRA_BIN_SIZE * 3, new HashSet<>(Arrays.asList(1, 2))},
- {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE * 2, SRAIndex.SRA_BIN_SIZE * 2 + 1, new HashSet<>(Arrays.asList(1, 2))}
- };
- }
-
-
- @Test(dataProvider = "testBinOverlappings")
- public void testBinOverlappings(SRAAccession acc, int reference, int firstLocus, int lastLocus, Set<Integer> binNumbers) {
- final SRAIndex index = getIndex(acc);
- final Iterator<Bin> binIterator = index.getBinsOverlapping(reference, firstLocus, lastLocus).iterator();
- final Set<Integer> binNumbersFromIndex = new HashSet<>();
- while (binIterator.hasNext()) {
- final Bin bin = binIterator.next();
- binNumbersFromIndex.add(bin.getBinNumber() - SRA_BIN_OFFSET);
- }
-
- Assert.assertEquals(binNumbers, binNumbersFromIndex);
- }
-
- @DataProvider(name = "testSpanOverlappings")
- private Object[][] createDataForSpanOverlappings() {
- return new Object[][] {
- {DEFAULT_ACCESSION, 0, 1, SRAIndex.SRA_BIN_SIZE, new long[] {0, SRAIndex.SRA_CHUNK_SIZE} },
- {DEFAULT_ACCESSION, 0, SRAIndex.SRA_BIN_SIZE * 2, SRAIndex.SRA_BIN_SIZE * 2 + 1, new long[]{0, SRAIndex.SRA_CHUNK_SIZE} },
- {DEFAULT_ACCESSION, 0, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE + 1, new long[]{0, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE, SRAIndex.SRA_CHUNK_SIZE * 2} },
- };
- }
-
- @Test(dataProvider = "testSpanOverlappings")
- public void testSpanOverlappings(SRAAccession acc, int reference, int firstLocus, int lastLocus, long[] spanCoordinates) {
- final SRAIndex index = getIndex(acc);
- final BAMFileSpan span = index.getSpanOverlapping(reference, firstLocus, lastLocus);
-
- long[] coordinatesFromIndex = span.toCoordinateArray();
-
- Assert.assertTrue(Arrays.equals(coordinatesFromIndex, spanCoordinates),
- "Coordinates mismatch. Expected: " + Arrays.toString(spanCoordinates) +
- " but was : " + Arrays.toString(coordinatesFromIndex));
- }
-
- private SRAIndex getIndex(SRAAccession acc) {
- final SRAFileReader reader = new SRAFileReader(acc);
- return (SRAIndex) reader.getIndex();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java b/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java
deleted file mode 100644
index 36ef346..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRALazyRecordTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SRAFileReader;
-import htsjdk.samtools.util.TestUtil;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Tests for SRA extension of SAMRecord objects which load fields on demand
- */
-public class SRALazyRecordTest extends AbstractSRATest {
- private static final SRAAccession DEFAULT_ACCESSION = new SRAAccession("SRR2096940");
-
- @DataProvider(name = "serializationTestData")
- private Object[][] getSerializationTestData() {
- return new Object[][] {
- { DEFAULT_ACCESSION }
- };
- }
-
- @Test(dataProvider = "serializationTestData")
- public void testSerialization(final SRAAccession accession) throws Exception {
- final SRAFileReader reader = new SRAFileReader(accession);
- final SAMRecord initialSAMRecord = reader.getIterator().next();
- reader.close();
-
- final SAMRecord deserializedSAMRecord = TestUtil.serializeAndDeserialize(initialSAMRecord);
-
- Assert.assertEquals(deserializedSAMRecord, initialSAMRecord, "Deserialized SAMRecord not equal to original SAMRecord");
- }
-
- @Test
- public void testCloneAndEquals() throws Exception {
- final SRAFileReader reader = new SRAFileReader(DEFAULT_ACCESSION);
- final SAMRecord record = reader.getIterator().next();
- reader.close();
-
- final SAMRecord newRecord = (SAMRecord)record.clone();
- Assert.assertFalse(record == newRecord);
- Assert.assertNotSame(record, newRecord);
- Assert.assertEquals(record, newRecord);
- Assert.assertEquals(newRecord, record);
-
- newRecord.setAlignmentStart(record.getAlignmentStart() + 100);
- Assert.assertFalse(record.equals(newRecord));
- Assert.assertFalse(newRecord.equals(record));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java b/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java
deleted file mode 100644
index 575b3dd..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAQueryTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-public class SRAQueryTest extends AbstractSRATest {
-
- @DataProvider(name = "testUnmappedCounts")
- private Object[][] createDataForUnmappedCounts() {
- return new Object[][] {
- {"SRR2096940", 498}
- };
- }
-
- @Test(dataProvider = "testUnmappedCounts")
- public void testUnmappedCounts(String acc, int expectedNumUnmapped) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.queryUnmapped();
-
- assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, 0, expectedNumUnmapped);
- }
-
- @DataProvider(name = "testReferenceAlignedCounts")
- private Object[][] createDataForReferenceAlignedCounts() {
- return new Object[][] {
- {"SRR2096940", "CM000681.1", 0, 10591},
- {"SRR2096940", "CM000681.1", 55627015, 10591},
- {"SRR2096940", "CM000681.1", 55627016, 0},
- };
- }
-
- @Test(dataProvider = "testReferenceAlignedCounts")
- public void testReferenceAlignedCounts(String acc, String reference, int referenceStart, int expectedNumMapped) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.queryAlignmentStart(reference, referenceStart);
-
- assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, 0);
- }
-
- @DataProvider(name = "testQueryCounts")
- private Object[][] createDataForQueryCounts() {
- return new Object[][] {
- {"SRR2096940", "CM000681.1", 0, 59128983, true, 10591, 0},
- {"SRR2096940", "CM000681.1", 55627015, 59128983, true, 10591, 0},
- {"SRR2096940", "CM000681.1", 55627016, 59128983, true, 0, 0},
- {"SRR2096940", "CM000681.1", 55627016, 59128983, false, 10591, -1},
- };
- }
-
- @Test(dataProvider = "testQueryCounts")
- public void testQueryCounts(String acc, String reference, int referenceStart, int referenceEnd, boolean contained, int expectedNumMapped, int expectedNumUnmapped) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.query(reference, referenceStart, referenceEnd, contained);
-
- assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
- }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java b/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java
deleted file mode 100644
index dd2b374..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRAReferenceTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class SRAReferenceTest extends AbstractSRATest {
- @DataProvider(name = "testReference")
- private Object[][] createDataForReference() {
- return new Object[][] {
- {"SRR2096940", "CM000681.1", 95001, 95050, "AGATGATTCAGTCTCACCAAGAACACTGAAAGTCACATGGCTACCAGCAT"},
- };
- }
-
- @Test(dataProvider = "testReference")
- public void testReference(String acc, String refContig, int refStart, int refStop, String refBases) {
- final ReferenceSequenceFile refSeqFile = new SRAIndexedSequenceFile(new SRAAccession(acc));
- final ReferenceSequence refSeq = refSeqFile.getSubsequenceAt(refContig, refStart, refStop);
- Assert.assertEquals(new String(refSeq.getBases()), refBases);
- }
-
- class TestReferenceMtData {
- String refContig;
- int refStart;
- int refStop;
- String refBases;
-
- TestReferenceMtData(String refContig, int refStart, int refStop, String refBases) {
- this.refContig = refContig;
- this.refStart = refStart;
- this.refStop = refStop;
- this.refBases = refBases;
- }
-
- @Override
- public String toString() {
- return refContig + ":" + refStart + "-" + refStop + " = " + refBases;
- }
- }
-
- @DataProvider(name = "testReferenceMt")
- private Object[][] createDataForReferenceMt() {
- return new Object[][] {
- {
- "SRR353866", Arrays.asList(
- new TestReferenceMtData("AAAB01001871.1", 1, 50, "TGACGCGCATGAATGGATTAACGAGATTCCCTCTGTCCCTATCTACTATC"),
- new TestReferenceMtData("AAAB01001871.1", 901, 950, "ACCAAGCGTACGATTGTTCACCCTTTCAAGGGAACGTGAGCTGGGTTTAG"),
- new TestReferenceMtData("AAAB01008987.1", 1, 50, "TTTTGGACGATGTTTTTGGTGAACAGAAAACGAGCTCAATCATCCAGAGC"),
- new TestReferenceMtData("AAAB01008859.1", 1, 50, "CAAAACGATGCCACAGATCAGAAGTTAATTAACGCACATTCTCCACCCAC")
- )
- },
- };
- }
-
- @Test(dataProvider = "testReferenceMt")
- public void testReferenceMt(String acc, List<TestReferenceMtData> parallelTests) throws Exception {
- final ReferenceSequenceFile refSeqFile = new SRAIndexedSequenceFile(new SRAAccession(acc));
- final long timeout = 1000L * 5; // just in case
- final List<Thread> threads = new ArrayList<Thread>(parallelTests.size());
- final Map<TestReferenceMtData, Exception> runErrors = Collections.synchronizedMap(new HashMap<TestReferenceMtData, Exception>());
- for (final TestReferenceMtData testData: parallelTests) {
- threads.add(new Thread() {
- @Override
- public void run() {
- try {
- final ReferenceSequence refSeq = refSeqFile.getSubsequenceAt(testData.refContig,
- testData.refStart, testData.refStop);
- Assert.assertEquals(new String(refSeq.getBases()), testData.refBases);
- } catch (final Exception e) {
- Assert.assertNull(runErrors.put(testData, e));
- }
- }
- });
- }
- for (final Thread thread: threads) {
- thread.start();
- }
- for (final Thread thread: threads) {
- thread.join(timeout);
- }
- for (final Map.Entry<TestReferenceMtData, Exception> result: runErrors.entrySet()) {
- // Will fail only on the first, but a debugger will be able to see all the results.
- Assert.fail("failed: " + result.getKey(), result.getValue());
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/sra/SRATest.java b/src/test/java/htsjdk/samtools/sra/SRATest.java
deleted file mode 100644
index c106bfc..0000000
--- a/src/test/java/htsjdk/samtools/sra/SRATest.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*===========================================================================
-*
-* PUBLIC DOMAIN NOTICE
-* National Center for Biotechnology Information
-*
-* This software/database is a "United States Government Work" under the
-* terms of the United States Copyright Act. It was written as part of
-* the author's official duties as a United States Government employee and
-* thus cannot be copyrighted. This software/database is freely available
-* to the public for use. The National Library of Medicine and the U.S.
-* Government have not placed any restriction on its use or reproduction.
-*
-* Although all reasonable efforts have been taken to ensure the accuracy
-* and reliability of the software and data, the NLM and the U.S.
-* Government do not and cannot warrant the performance or results that
-* may be obtained by using this software or data. The NLM and the U.S.
-* Government disclaim all warranties, express or implied, including
-* warranties of performance, merchantability or fitness for any particular
-* purpose.
-*
-* Please cite the author in any work or product based on this material.
-*
-* ===========================================================================
-*
-*/
-
-package htsjdk.samtools.sra;
-
-import htsjdk.samtools.BAMFileSpan;
-import htsjdk.samtools.BrowseableBAMIndex;
-import htsjdk.samtools.Chunk;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMReadGroupRecord;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.SAMUtils;
-import htsjdk.samtools.SAMValidationError;
-import htsjdk.samtools.SamInputResource;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.ValidationStringency;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Integration tests for SRA functionality
- *
- * Created by andrii.nikitiuk on 8/24/15.
- */
-public class SRATest extends AbstractSRATest {
-
- @DataProvider(name = "testCounts")
- private Object[][] createDataForCounts() {
- return new Object[][] {
- {"SRR2096940", 10591, 498},
- {"SRR000123", 0, 4583}
- };
- }
-
- @Test(dataProvider = "testCounts")
- public void testCounts(String acc, int expectedNumMapped, int expectedNumUnmapped) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.iterator();
-
- assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
- }
-
- @DataProvider(name = "testCountsBySpan")
- private Object[][] createDataForCountsBySpan() {
- return new Object[][] {
- {"SRR2096940", Arrays.asList(new Chunk(0, 59128983), new Chunk(59128983, 59141089)), 10591, 498},
- {"SRR2096940", Arrays.asList(new Chunk(0, 29128983), new Chunk(29128983, 59141089)), 10591, 498},
- {"SRR2096940", Arrays.asList(new Chunk(0, 59134983), new Chunk(59134983, 59141089)), 10591, 498},
- {"SRR2096940", Arrays.asList(new Chunk(0, 59130000)), 10591, 0},
- {"SRR2096940", Arrays.asList(new Chunk(0, 59140889)), 10591, 298}
- };
- }
-
- @Test(dataProvider = "testCountsBySpan")
- public void testCountsBySpan(String acc, List<Chunk> chunks, int expectedNumMapped, int expectedNumUnmapped) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(new BAMFileSpan(chunks));
-
- assertCorrectCountsOfMappedAndUnmappedRecords(samRecordIterator, expectedNumMapped, expectedNumUnmapped);
- }
-
- @DataProvider(name = "testGroups")
- private Object[][] createDataForGroups() {
- return new Object[][] {
- {"SRR1035115", new TreeSet<>(Arrays.asList("15656144_B09YG", "15656144_B09MR"))},
- {"SRR2096940", new TreeSet<>(Arrays.asList("SRR2096940"))}
- };
- }
-
- @Test(dataProvider = "testGroups")
- public void testGroups(String acc, Set<String> groups) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.iterator();
-
- SAMFileHeader header = reader.getFileHeader();
- Set<String> headerGroups = new TreeSet<>();
- for (SAMReadGroupRecord group : header.getReadGroups()) {
- Assert.assertEquals(group.getReadGroupId(), group.getId());
- headerGroups.add(group.getReadGroupId());
- }
-
- Assert.assertEquals(groups, headerGroups);
-
- Set<String> foundGroups = new TreeSet<>();
-
- for (int i = 0; i < 10000; i++) {
- if (!samRecordIterator.hasNext()) {
- break;
- }
- SAMRecord record = samRecordIterator.next();
- String groupName = (String)record.getAttribute("RG");
-
- foundGroups.add(groupName);
- }
-
- // please note that some groups may be introduced after 10k records, which is not an error
- Assert.assertEquals(groups, foundGroups);
- }
-
- @DataProvider(name = "testReferences")
- private Object[][] createDataForReferences() {
- return new Object[][] {
- // primary alignment only
- {"SRR353866", 9,
- Arrays.asList(
- "AAAB01001871.1", "AAAB01002233.1", "AAAB01004056.1", "AAAB01006027.1",
- "AAAB01008846.1", "AAAB01008859.1", "AAAB01008960.1", "AAAB01008982.1",
- "AAAB01008987.1"
- ),
- Arrays.asList(
- 1115, 1034, 1301, 1007,
- 11308833, 12516315, 23099915, 1015562,
- 16222597
- )},
- };
- }
-
- @Test(dataProvider = "testReferences")
- public void testReferences(String acc, int numberFirstReferenceFound, List<String> references, List<Integer> refLengths) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.iterator();
-
- SAMFileHeader header = reader.getFileHeader();
- Set<String> headerRefNames = new TreeSet<>();
-
- for (SAMSequenceRecord ref : header.getSequenceDictionary().getSequences()) {
- String refName = ref.getSequenceName();
-
- int refIndex = references.indexOf(refName);
- Assert.assertTrue(refIndex != -1, "Unexpected reference: " + refName);
-
- Assert.assertEquals(refLengths.get(refIndex), (Integer) ref.getSequenceLength(), "Reference length is incorrect");
-
- headerRefNames.add(refName);
- }
-
- Assert.assertEquals(new TreeSet<>(references), headerRefNames);
-
- Set<String> foundRefNames = new TreeSet<>();
- for (int i = 0; i < 10000; i++) {
- if (!samRecordIterator.hasNext()) {
- break;
- }
- SAMRecord record = samRecordIterator.next();
-
- if (record.getReferenceIndex().equals(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)) {
- continue;
- }
-
- String refName = record.getReferenceName();
- Assert.assertNotNull(refName);
-
- foundRefNames.add(refName);
- }
-
- Assert.assertEquals(new TreeSet<>(references.subList(0, numberFirstReferenceFound)), foundRefNames);
- }
-
- @DataProvider(name = "testRows")
- private Object[][] createDataForRowsTest() {
- return new Object[][] {
- // primary alignment only
- {"SRR2127895", 1, 83, "SRR2127895.R.1",
- "CGTGCGCGTGACCCATCAGATGCTGTTCAATCAGTGGCAAATGCGGAACGGTTTCTGCGGGTTGCCGATATTCTGGAGAGTAATGCCAGGCAGGGGCAGGT",
- "DDBDDDDDBCABC at CCDDDC?99CCA:CDCDDDDDDDECDDDFFFHHHEGIJIIGIJIHIGJIJJJJJJJIIJIIHIGJIJJJIJJIHFFBHHFFFDFBBB",
- 366, "29S72M", "gi|152968582|ref|NC_009648.1|", 147, true, false, false},
-
- // small SRA archive
- {"SRR2096940", 1, 16, "SRR2096940.R.3",
- "GTGTGTCACCAGATAAGGAATCTGCCTAACAGGAGGTGTGGGTTAGACCCAATATCAGGAGACCAGGAAGGAGGAGGCCTAAGGATGGGGCTTTTCTGTCACCAATCCTGTCCCTAGTGGCCCCACTGTGGGGTGGAGGGGACAGATAAAAGTACCCAGAACCAGAG",
- "AAAABFFFFFFFGGGGGGGGIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIGGGGGFGFFDFFFFFC",
- 55627016, "167M", "CM000681.1", 42, false, false, false},
-
- {"SRR2096940", 10591, 4, "SRR2096940.R.10592",
- "CTCTGGTTCTGGGTACTTTTATCTGTCCCCTCCACCCCACAGTGGCGAGCCAGATTCCTTATCTGGTGACACAC",
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII",
- -1, null, null, -1, false, false, false},
-
- // primary and secondary alignments
- {"SRR833251", 81, 393, "SRR833251.R.51",
- "ATGCAAATCCGAATGGGCTATTTGTGGGTACTTGGGCAGGTAAGTAGCTGGCAATCTTGGTCGGTAAACCAATACCCAAGTTCACATAGGCACCATCGGGA",
- "CCCFFFFFHHHHHIJJJIJJJJJIIJJJGIJIJIIJIJJJDGIGIIJIJIHIJJJJJJGIGHIHEDFFFFDDEEEDDDDDCDEEDDDDDDDDDDDDDBBDB",
- 1787186, "38M63S", "gi|169794206|ref|NC_010410.1|", 11, true, true, true},
-
- // local SRA file
- {"src/test/resources/htsjdk/samtools/sra/test_archive.sra", 1, 99, "test_archive.R.2",
- "TGTCGATGCTGAAAGTGTCTGCGGTGAACCACTTCATGCACAGCGCACACTGCAGCTCCACTTCACCCAGCTGACGGCCGTTCTCATCGTCTCCAGAGCCCGTCTGAGCGTCCGCTGCTTCAGAACTGTCCCCGGCTGTATCCTGAAGAC",
- "BBAABBBFAFFFGGGGGGGGGGGGEEFHHHHGHHHHHFHHGHFDGGGGGHHGHHHHHHHHHHHHFHHHGHHHHHHGGGGGGGHGGHHHHHHHHHGHHHHHGGGGHGHHHGGGGGGGGGHHHHEHHHHHHHHHHGCGGGHHHHHHGBFFGF",
- 2811570, "150M", "NC_007121.5", 60, true, false, false}
- };
- }
-
- @Test(dataProvider = "testRows")
- public void testRows(String acc, int recordIndex, int flags, String readName, String bases, String quals, int refStart, String cigar,
- String refName, int mapQ, boolean hasMate, boolean isSecondOfPair, boolean isSecondaryAlignment) {
- SAMRecord record = getRecordByIndex(acc, recordIndex, false);
-
- checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
- }
-
- @Test(dataProvider = "testRows")
- public void testRowsAfterIteratorDetach(String acc, int recordIndex, int flags, String readName, String bases, String quals,
- int refStart, String cigar, String refName, int mapQ, boolean hasMate,
- boolean isSecondOfPair, boolean isSecondaryAlignment) {
- SAMRecord record = getRecordByIndex(acc, recordIndex, true);
-
- checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
- }
-
- @Test(dataProvider = "testRows")
- public void testRowsOverrideValues(String acc, int recordIndex, int flags, String readName, String bases, String quals,
- int refStart, String cigar, String refName, int mapQ, boolean hasMate,
- boolean isSecondOfPair, boolean isSecondaryAlignment) {
- SAMRecord record = getRecordByIndex(acc, recordIndex, true);
- SAMFileHeader header = record.getHeader();
-
- record.setFlags(0);
- record.setReadUnmappedFlag(refStart == -1);
- record.setReadBases("C".getBytes());
- record.setBaseQualities(SAMUtils.fastqToPhred("A"));
- if (refStart == -1) {
- checkSAMRecord(record, 4, readName, "C", "A", refStart, "1M", refName, mapQ, false, false, false);
- } else {
- int sequenceIndex = header.getSequenceIndex(refName);
- Assert.assertFalse(sequenceIndex == -1);
-
- if (sequenceIndex == 0) {
- if (header.getSequenceDictionary().getSequences().size() > 1) {
- sequenceIndex++;
- }
- } else {
- sequenceIndex--;
- }
-
- refName = header.getSequence(sequenceIndex).getSequenceName();
-
- record.setAlignmentStart(refStart - 100);
- record.setCigarString("1M");
- record.setMappingQuality(mapQ - 1);
- record.setReferenceIndex(sequenceIndex);
-
- checkSAMRecord(record, 0, readName, "C", "A", refStart - 100, "1M", refName, mapQ - 1, false, false, false);
- }
- }
-
- @Test(dataProvider = "testRows")
- public void testRowsBySpan(String acc, int recordIndex, int flags, String readName, String bases, String quals,
- int refStart, String cigar, String refName, int mapQ, boolean hasMate,
- boolean isSecondOfPair, boolean isSecondaryAlignment) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- SAMFileHeader header = reader.getFileHeader();
-
- Chunk chunk;
- if (refStart != -1) {
- long refOffset = 0;
- int refIndex = header.getSequenceDictionary().getSequence(refName).getSequenceIndex();
- for (SAMSequenceRecord sequenceRecord : header.getSequenceDictionary().getSequences()) {
- if (sequenceRecord.getSequenceIndex() < refIndex) {
- refOffset += sequenceRecord.getSequenceLength();
- }
- }
-
- chunk = new Chunk(refOffset + refStart - 1, refOffset + refStart);
- } else {
- long totalRefLength = header.getSequenceDictionary().getReferenceLength();
- long totalRecordRange = ((BAMFileSpan)reader.indexing().getFilePointerSpanningReads()).toCoordinateArray()[1];
- chunk = new Chunk(totalRefLength, totalRecordRange);
- }
-
- final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(new BAMFileSpan(chunk));
-
- SAMRecord record = null;
- while (samRecordIterator.hasNext()) {
- SAMRecord currentRecord = samRecordIterator.next();
- if (currentRecord.getReadName().equals(readName)) {
- record = currentRecord;
- break;
- }
- }
-
- checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
- }
-
- @Test(dataProvider = "testRows")
- public void testRowsByIndex(String acc, int recordIndex, int flags, String readName, String bases, String quals,
- int refStart, String cigar, String refName, int mapQ, boolean hasMate,
- boolean isSecondOfPair, boolean isSecondaryAlignment) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- Assert.assertTrue(reader.hasIndex());
- Assert.assertTrue(reader.indexing().hasBrowseableIndex());
-
- SAMFileHeader header = reader.getFileHeader();
- BrowseableBAMIndex index = reader.indexing().getBrowseableIndex();
-
- BAMFileSpan span;
- if (refStart != -1) {
- int refIndex = header.getSequenceDictionary().getSequence(refName).getSequenceIndex();
- span = index.getSpanOverlapping(refIndex, refStart, refStart + 1);
- } else {
- long chunkStart = index.getStartOfLastLinearBin();
- long totalRecordRange = ((BAMFileSpan) reader.indexing().getFilePointerSpanningReads()).toCoordinateArray()[1];
- span = new BAMFileSpan(new Chunk(chunkStart, totalRecordRange));
- }
-
- final SAMRecordIterator samRecordIterator = ((SamReader.Indexing) reader).iterator(span);
-
- SAMRecord record = null;
- while (samRecordIterator.hasNext()) {
- SAMRecord currentRecord = samRecordIterator.next();
- if (refStart != -1 && currentRecord.getAlignmentStart() + currentRecord.getReadLength() < refStart) {
- continue;
- }
-
- if (currentRecord.getReadName().equals(readName)
- && currentRecord.getNotPrimaryAlignmentFlag() == isSecondaryAlignment
- && (!hasMate || currentRecord.getSecondOfPairFlag() == isSecondOfPair)) {
- record = currentRecord;
- break;
- }
- }
-
- checkSAMRecord(record, flags, readName, bases, quals, refStart, cigar, refName, mapQ, hasMate, isSecondOfPair, isSecondaryAlignment);
- }
-
- private SAMRecord getRecordByIndex(String acc, int recordIndex, boolean detach) {
- SamReader reader = SamReaderFactory.make().validationStringency(ValidationStringency.SILENT).open(
- SamInputResource.of(new SRAAccession(acc))
- );
-
- final SAMRecordIterator samRecordIterator = reader.iterator();
-
- while (recordIndex != 0) {
- Assert.assertTrue(samRecordIterator.hasNext(), "Record set is too small");
-
- samRecordIterator.next();
- recordIndex--;
- }
- Assert.assertTrue(samRecordIterator.hasNext(), "Record set is too small");
-
- SAMRecord record = samRecordIterator.next();
-
- if (detach) {
- samRecordIterator.next();
- }
-
- return record;
- }
-
- private void checkSAMRecord(SAMRecord record, int flags, String readName, String bases, String quals,
- int refStart, String cigar, String refName, int mapQ, boolean hasMate,
- boolean isSecondOfPair, boolean isSecondaryAlignment) {
-
- Assert.assertNotNull(record, "Record with read id: " + readName + " was not found by span created from index");
-
- List<SAMValidationError> validationErrors = record.isValid();
- Assert.assertNull(validationErrors, "SRA Lazy record is invalid. List of errors: " +
- (validationErrors != null ? validationErrors.toString() : ""));
-
- Assert.assertEquals(record.getReadName(), readName);
- Assert.assertEquals(new String(record.getReadBases()), bases);
- Assert.assertEquals(record.getBaseQualityString(), quals);
- Assert.assertEquals(record.getReadPairedFlag(), hasMate);
- Assert.assertEquals(record.getFlags(), flags);
- Assert.assertEquals(record.getNotPrimaryAlignmentFlag(), isSecondaryAlignment);
- if (hasMate) {
- Assert.assertEquals(record.getSecondOfPairFlag(), isSecondOfPair);
- }
- if (refStart == -1) {
- Assert.assertEquals(record.getReadUnmappedFlag(), true);
- Assert.assertEquals(record.getAlignmentStart(), 0);
- Assert.assertEquals(record.getCigarString(), "*");
- Assert.assertEquals(record.getReferenceName(), "*");
- Assert.assertEquals(record.getMappingQuality(), 0);
- } else {
- Assert.assertEquals(record.getReadUnmappedFlag(), false);
- Assert.assertEquals(record.getAlignmentStart(), refStart);
- Assert.assertEquals(record.getCigarString(), cigar);
- Assert.assertEquals(record.getReferenceName(), refName);
- Assert.assertEquals(record.getMappingQuality(), mapQ);
- }
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java b/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java
deleted file mode 100644
index a21c743..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractLocusInfoTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMSequenceRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-
-public class AbstractLocusInfoTest {
- private final byte[] qualities = {30, 50, 50, 60, 60, 70, 70, 70, 80, 90, 30, 50, 50, 60, 60, 70, 70, 70, 80, 90};
- private byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C', 'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
- private EdgingRecordAndOffset typedRecordAndOffset;
- private EdgingRecordAndOffset typedRecordAndOffsetEnd;
- private SAMSequenceRecord sequence = new SAMSequenceRecord("chrM", 100);
-
- @BeforeTest
- public void setUp() {
- SAMRecord record = new SAMRecord(new SAMFileHeader());
- record.setReadName("testRecord");
- record.setReadBases(bases);
- record.setBaseQualities(qualities);
- typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 10, 10, 10);
- typedRecordAndOffsetEnd = EdgingRecordAndOffset.createEndRecord(typedRecordAndOffset);
- }
-
- @Test
- public void testConstructor() {
- AbstractLocusInfo<EdgingRecordAndOffset> info = new AbstractLocusInfo<>(sequence, 1);
- assertEquals("chrM", info.getSequenceName());
- assertEquals(0, info.getRecordAndOffsets().size());
- assertEquals(100, info.getSequenceLength());
- assertEquals(1, info.getPosition());
- }
-
- @Test
- public void testAdd() {
- AbstractLocusInfo<EdgingRecordAndOffset> info = new AbstractLocusInfo<>(sequence, 10);
- info.add(typedRecordAndOffset);
- info.add(typedRecordAndOffsetEnd);
- assertEquals(2, info.getRecordAndOffsets().size());
- assertEquals(typedRecordAndOffset, info.getRecordAndOffsets().get(0));
- assertEquals(typedRecordAndOffsetEnd, info.getRecordAndOffsets().get(1));
- assertEquals(10, info.getPosition());
- assertEquals('A', info.getRecordAndOffsets().get(0).getReadBase());
- assertEquals('A', info.getRecordAndOffsets().get(1).getReadBase());
- assertEquals(30, info.getRecordAndOffsets().get(0).getBaseQuality());
- assertEquals(30, info.getRecordAndOffsets().get(1).getBaseQuality());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java b/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java
deleted file mode 100644
index 0c08436..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractLocusIteratorTestTemplate.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-
-/**
- * Common template for testing classes, that extend AbstractLocusIterator.
- *
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-public abstract class AbstractLocusIteratorTestTemplate {
-
- /** Coverage for tests with the same reads */
- final static int coverage = 2;
-
- /** the read length for the tests */
- final static int readLength = 36;
-
- final static SAMFileHeader header = new SAMFileHeader();
-
- static {
- header.setSortOrder(SAMFileHeader.SortOrder.coordinate);
- SAMSequenceDictionary dict = new SAMSequenceDictionary();
- dict.addSequence(new SAMSequenceRecord("chrM", 100000));
- header.setSequenceDictionary(dict);
- }
-
- /** Get the record builder for the tests with the default parameters that are needed */
- static SAMRecordSetBuilder getRecordBuilder() {
- final SAMRecordSetBuilder builder = new SAMRecordSetBuilder();
- builder.setHeader(header);
- builder.setReadLength(readLength);
- return builder;
- }
-
- public abstract void testBasicIterator();
- public abstract void testEmitUncoveredLoci();
- public abstract void testSimpleGappedAlignment();
- public abstract void testOverlappingGappedAlignmentsWithoutIndels();
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java b/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java
deleted file mode 100644
index 568c84c..0000000
--- a/src/test/java/htsjdk/samtools/util/AbstractRecordAndOffsetTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-/**
- *
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-
-public class AbstractRecordAndOffsetTest {
-
- private final byte[] qualities = {30, 40, 50, 60, 70, 80 ,90, 70, 80, 90};
- private byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
- SAMRecord record;
-
- @BeforeTest
- public void setUp(){
- record = new SAMRecord(new SAMFileHeader());
- record.setReadName("testRecord");
- record.setReadBases(bases);
- record.setBaseQualities(qualities);
- }
-
- @Test
- public void testConstructor(){
- AbstractRecordAndOffset abstractRecordAndOffset = new AbstractRecordAndOffset(record, 0, 10, 3);
- assertArrayEquals(qualities, abstractRecordAndOffset.getBaseQualities());
- assertArrayEquals(bases, abstractRecordAndOffset.getRecord().getReadBases());
- assertEquals('A', abstractRecordAndOffset.getReadBase());
- assertEquals(30, abstractRecordAndOffset.getBaseQuality());
- assertEquals(0, abstractRecordAndOffset.getOffset());
- assertEquals(-1, abstractRecordAndOffset.getRefPos());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java b/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java
deleted file mode 100644
index 817c60e..0000000
--- a/src/test/java/htsjdk/samtools/util/AsyncBufferedIteratorTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Daniel Cameron
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class AsyncBufferedIteratorTest {
- private static class TestCloseableIterator implements CloseableIterator<Integer> {
- private int[] results;
- private volatile int offset = 0;
- public volatile boolean isClosed = false;
- public TestCloseableIterator(int[] results) {
- this.results = results;
- }
- @Override
- public void close() {
- isClosed = true;
- }
- @Override
- public boolean hasNext() {
- return offset < results.length;
- }
- @Override
- public Integer next() {
- return results[offset++];
- }
- public int consumed() {
- return offset;
- }
- }
- @Test
- public void testWrapUnderlying() {
- AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(new TestCloseableIterator(new int[] { 0, 1, 2, 3}), 1, 1);
- for (int i = 0; i < 4; i++) {
- Assert.assertEquals(i, (int)abi.next());
- }
- abi.close();
- }
- @Test
- public void testClose() {
- TestCloseableIterator tci = new TestCloseableIterator(new int[] { 0, 1, 2, 3});
- AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(tci, 1, 1);
- abi.close();
- Assert.assertTrue(tci.isClosed);
- }
- /**
- * Background thread should block when buffers are full
- */
- @Test
- public void testBackgroundBlocks() throws InterruptedException {
- TestCloseableIterator it = new TestCloseableIterator(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
- AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(it, 3, 2, "testBackgroundBlocks");
- Assert.assertNotNull(getThreadWithName("testBackgroundBlocks"));
- Thread.sleep(10); // how do we write this test and not be subject to race conditions?
- // should have read 9 records: 2*3 in the buffers, and another 3 read but
- // blocking waiting to be added
- Assert.assertEquals(it.consumed(), 9);
- abi.close();
- }
- @Test
- public void testBackgroundThreadCompletes() throws InterruptedException {
- TestCloseableIterator it = new TestCloseableIterator(new int[] { 0, 1, 2, 3, 4, 5 });
- AsyncBufferedIterator<Integer> abi = new AsyncBufferedIterator<Integer>(it, 3, 2, "testBackgroundThreadCompletes");
- Assert.assertNotNull(getThreadWithName("testBackgroundThreadCompletes"));
- // both buffers should be full
- // clear out one buffer so the background thread can write the end of stream indicator
- // and complete
- abi.next();
-
- // how do we write this test and not be subject to a race condition
- // since we're waiting for a background thread we have no access?
- Thread t;
- for (int i = 0; i < 64; i++) {
- Thread.sleep(1);
- t = getThreadWithName("testBackgroundThreadCompletes");
- if (t == null || !t.isAlive()) break;
- }
- t = getThreadWithName("testBackgroundThreadCompletes");
- Assert.assertTrue(t == null || !t.isAlive());
- abi.close();
- }
- private static Thread getThreadWithName(String name) {
- Thread[] allthreads = new Thread[Thread.activeCount() + 16];
- int threadCount = Thread.enumerate(allthreads);
- for (int i = 0; i < threadCount; i++) {
- String threadName = allthreads[i].getName();
- if (name.equals(threadName)) {
- return allthreads[i];
- }
- }
- return null;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java b/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java
deleted file mode 100644
index c807cef..0000000
--- a/src/test/java/htsjdk/samtools/util/AsyncWriterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Len Trigg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class AsyncWriterTest {
- private static class MyException extends RuntimeException {
- final Integer item;
- public MyException(Integer item) {
- this.item = item;
- }
- }
- private static class TestAsyncWriter extends AbstractAsyncWriter<Integer> {
- protected TestAsyncWriter() {
- super(1); // Queue size of 1 to give us more control over the order of events
- }
-
- @Override
- protected String getThreadNamePrefix() {
- return "TestAsyncWriter";
- }
-
- @Override
- protected void synchronouslyWrite(Integer item) {
- throw new MyException(item);
- }
-
- @Override
- protected void synchronouslyClose() {
- // Nothing
- }
- }
- @Test
- public void testNoSelfSuppression() {
- try (TestAsyncWriter t = new TestAsyncWriter()) {
- try {
- t.write(1); // Will trigger exception in writing thread
- t.write(2); // Will block if the above write has not been executed, but may not trigger checkAndRethrow()
- t.write(3); // Will trigger checkAndRethrow() if not already done by the above write
- Assert.fail("Expected exception");
- } catch (MyException e) {
- // Pre-bug fix, this was a "Self-suppression not permitted" exception from Java, rather than MyException
- Assert.assertEquals(1, e.item.intValue());
- }
- // Verify that attempts to write after exception will fail
- try {
- t.write(4);
- Assert.fail("Expected exception");
- } catch (RuntimeIOException e) {
- // Expected
- }
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java b/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java
deleted file mode 100644
index 91e1147..0000000
--- a/src/test/java/htsjdk/samtools/util/BinaryCodecTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-
-/*
- * The Broad Institute
- * SOFTWARE COPYRIGHT NOTICE AGREEMENT
- * This software and its documentation are copyright Jan 9, 2009 by the
- * Broad Institute/Massachusetts Institute of Technology. All rights are reserved.
- *
- * This software is supplied without any warranty or guaranteed support whatsoever. Neither
- * the Broad Institute nor MIT can be responsible for its use, misuse, or functionality.
- */
-
-public class BinaryCodecTest {
- public final static String TEST_BASENAME = "htsjdk-BinaryCodecTest";
-
- @Test
- public void testReadAndWrite() throws IOException {
- final byte[] value = new byte[2];
- value[0] = 1;
- value[1] = 2;
- //Writing to file
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeBytes(value);
- codec.close();
-
- //Reading from file
- final byte[] valuesTwo = new byte[2];
- valuesTwo[0] = 1;
- valuesTwo[1] = 2;
-
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- final byte[] bytesFromBinaryFile = new byte[2];
- readCodec.readBytes(bytesFromBinaryFile);
- Assert.assertEquals(valuesTwo, bytesFromBinaryFile);
- readCodec.close();
- outputFile.delete();
- }
-
- @Test
- public void testReadAndWriteString() throws IOException {
- final String value = "Test String to Write";
-
- //Writing to file
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeString(value, true, false);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- final int stringLength = readCodec.readInt();
- Assert.assertEquals(value.length(), stringLength);
- final String s = readCodec.readString(stringLength);
- Assert.assertEquals(value, s);
- readCodec.close();
- }
-
- @Test
- public void testReadAndWriteInt() throws IOException {
- final int value = 42;
-
- //Writing to file
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeInt(value);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(value, readCodec.readInt());
- readCodec.close();
- }
-
- @Test
- public void testReadAndWriteDouble() throws IOException {
- final double value = 54.4;
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeDouble(value);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(value, readCodec.readDouble());
- readCodec.close();
- }
-
- @Test
- public void testReadAndWriteLong() throws IOException {
- final long value = 42;
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeLong(value);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(value, readCodec.readLong());
- readCodec.close();
-
- }
-
- @Test
- public void testReadAndWriteFloat() throws IOException{
- final float value = 42.5F;
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeFloat(value);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(value, readCodec.readFloat());
- readCodec.close();
- }
-
- @Test
- public void testReadAndWriteBoolean() throws IOException{
-
- boolean values[] = {true, false};
-
- for (boolean value : values) {
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeBoolean(value);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(value, readCodec.readBoolean());
- readCodec.close();
- }
- }
-
- @Test
- public void testReadAndWriteMutlitpleData() throws IOException{
- final float fValue = 42.5F;
- final String sValue = "TestString";
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- codec.writeFloat(fValue);
- codec.writeString(sValue, true, false);
- codec.close();
-
- //Reading from file
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
- Assert.assertEquals(fValue, readCodec.readFloat());
- final int stringLength = readCodec.readInt();
- Assert.assertEquals(sValue, readCodec.readString(stringLength));
- readCodec.close();
- }
-
- @Test
- public void readPastEndOfFile() throws IOException{
- final long startTime = System.currentTimeMillis();
- int i = 0;
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- while (i<100){
- codec.writeInt(i);
- i++;
- }
- codec.close();
-
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
-
- System.out.println((System.currentTimeMillis() - startTime) + "ms to write");
- int z = 0;
- boolean reachedStatement = false;
- while (z<1000) {
- try {
- Assert.assertEquals(z, readCodec.readInt());
- } catch (Exception e) {
- Assert.assertEquals(RuntimeEOFException.class, e.getClass());
- reachedStatement = true;
- }
- z++;
- }
-
- Assert.assertTrue(reachedStatement);
- readCodec.close();
- }
-
- @Test
- public void timeTest() throws IOException{
- final long startTime = System.currentTimeMillis();
- int i = 0;
-
- final File outputFile = File.createTempFile(TEST_BASENAME, ".bin");
- outputFile.deleteOnExit();
- final DataOutputStream stream = new DataOutputStream(new FileOutputStream(outputFile));
- final BinaryCodec codec = new BinaryCodec(stream);
- while (i<100){
- codec.writeInt(i);
- i++;
- }
- codec.close();
-
- final DataInputStream instream = new DataInputStream(new FileInputStream(outputFile));
- final BinaryCodec readCodec = new BinaryCodec(instream);
-
- System.out.println((System.currentTimeMillis() - startTime) + "ms to write");
- int z = 0;
- boolean reachedStatement = false;
- while (z<1000) {
- try {
- Assert.assertEquals(z, readCodec.readInt());
- } catch (Exception e) {
- Assert.assertEquals(RuntimeEOFException.class, e.getClass());
- reachedStatement = true;
- }
- z++;
- }
-
- Assert.assertTrue(reachedStatement);
- readCodec.close();
- }
-
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java
deleted file mode 100644
index 850b4bf..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedFilePointerUtilTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class BlockCompressedFilePointerUtilTest
-{
- @Test
- public void basicTest()
- {
- List<Long> pointers = new ArrayList<Long>();
- pointers.add(makeFilePointer(0, 0));
- pointers.add(makeFilePointer(0, BlockCompressedFilePointerUtil.MAX_OFFSET));
- final long BIG_BLOCK_ADDRESS = 1L << 46;
- pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS-1, 0));
- pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS-1, BlockCompressedFilePointerUtil.MAX_OFFSET));
- pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS, 0));
- pointers.add(makeFilePointer(BIG_BLOCK_ADDRESS, BlockCompressedFilePointerUtil.MAX_OFFSET));
- pointers.add(makeFilePointer(BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS, 0));
- pointers.add(makeFilePointer(BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS, BlockCompressedFilePointerUtil.MAX_OFFSET));
- for (int i = 0; i < pointers.size() - 1; ++i) {
- for (int j = i+1; j < pointers.size(); ++j) {
- Assert.assertTrue(BlockCompressedFilePointerUtil.compare(pointers.get(i), pointers.get(j)) < 0,
- BlockCompressedFilePointerUtil.asString(pointers.get(i)) + " should be < " +
- BlockCompressedFilePointerUtil.asString(pointers.get(j)));
- Assert.assertTrue(BlockCompressedFilePointerUtil.compare(pointers.get(j), pointers.get(i)) > 0,
- BlockCompressedFilePointerUtil.asString(pointers.get(j)) + " should be > " +
- BlockCompressedFilePointerUtil.asString(pointers.get(i)));
- }
- }
-
- }
-
- /**
- * Create the virtual file pointer, and also assert that is can be converted back into the input parameters.
- * @param blockAddress
- * @param blockOffset
- * @return block compressed file pointer
- */
- private long makeFilePointer(long blockAddress, int blockOffset)
- {
- final long ret = BlockCompressedFilePointerUtil.makeFilePointer(blockAddress, blockOffset);
- Assert.assertEquals(BlockCompressedFilePointerUtil.getBlockAddress(ret), blockAddress);
- Assert.assertEquals(BlockCompressedFilePointerUtil.getBlockOffset(ret), blockOffset);
- Assert.assertEquals(BlockCompressedFilePointerUtil.compare(ret, ret), 0);
- return ret;
- }
-
- @Test(dataProvider = "badInputs", expectedExceptions = IllegalArgumentException.class)
- public void negativeTests(long blockAddress, int blockOffset) {
- BlockCompressedFilePointerUtil.makeFilePointer(blockAddress, blockOffset);
- Assert.assertFalse(true, "Should not get here.");
- }
-
- @DataProvider(name="badInputs")
- public Object[][] badInputs() {
- return new Object[][]{
- {-1L, 0},
- {0L, -1},
- {BlockCompressedFilePointerUtil.MAX_BLOCK_ADDRESS+1, 0},
- {0L, BlockCompressedFilePointerUtil.MAX_OFFSET+1}
- };
- }
-}
-
-/******************************************************************/
-/**************************[END OF BlockCompressedFilePointerUtilTest.java]*************************/
-/******************************************************************/
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java
deleted file mode 100644
index 8a0d97f..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedOutputStreamTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.FileTruncatedException;
-import htsjdk.samtools.util.zip.DeflaterFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.zip.Deflater;
-
-public class BlockCompressedOutputStreamTest {
-
- private static final String HTSJDK_TRIBBLE_RESOURCES = "src/test/resources/htsjdk/tribble/";
-
- @Test
- public void testBasic() throws Exception {
- final File f = File.createTempFile("BCOST.", ".gz");
- f.deleteOnExit();
- final List<String> linesWritten = new ArrayList<>();
- System.out.println("Creating file " + f);
- final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f);
- String s = "Hi, Mom!\n";
- bcos.write(s.getBytes());
- linesWritten.add(s);
- s = "Hi, Dad!\n";
- bcos.write(s.getBytes());
- linesWritten.add(s);
- bcos.flush();
- final StringBuilder sb = new StringBuilder(BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE * 2);
- s = "1234567890123456789012345678901234567890123456789012345678901234567890\n";
- while (sb.length() <= BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE) {
- sb.append(s);
- linesWritten.add(s);
- }
- bcos.write(sb.toString().getBytes());
- bcos.close();
- final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
- final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
- String line;
- for(int i = 0; (line = reader.readLine()) != null; ++i) {
- Assert.assertEquals(line + "\n", linesWritten.get(i));
- }
- bcis.close();
- final BlockCompressedInputStream bcis2 = new BlockCompressedInputStream(f);
- int available = bcis2.available();
- Assert.assertFalse(bcis2.endOfBlock(), "Should not be at end of block");
- Assert.assertTrue(available > 0);
- byte[] buffer = new byte[available];
- Assert.assertEquals(bcis2.read(buffer), available, "Should read to end of block");
- Assert.assertTrue(bcis2.endOfBlock(), "Should be at end of block");
- bcis2.close();
- }
-
- @DataProvider(name = "seekReadExceptionsData")
- private Object[][] seekReadExceptionsData()
- {
- return new Object[][]{
- {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.gz", FileTruncatedException.class,
- BlockCompressedInputStream.PREMATURE_END_MSG + System.getProperty("user.dir") + "/" +
- HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.gz", true, false, 0},
- {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.hdr.gz", IOException.class,
- BlockCompressedInputStream.INCORRECT_HEADER_SIZE_MSG + System.getProperty("user.dir") + "/" +
- HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.truncated.hdr.gz", true, false, 0},
- {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", IOException.class,
- BlockCompressedInputStream.CANNOT_SEEK_STREAM_MSG, false, true, 0},
- {HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", IOException.class,
- BlockCompressedInputStream.INVALID_FILE_PTR_MSG + 1000 + " for " + System.getProperty("user.dir") + "/" +
- HTSJDK_TRIBBLE_RESOURCES + "vcfexample.vcf.gz", true, true, 1000 }
- };
- }
-
- @Test(dataProvider = "seekReadExceptionsData")
- public void testSeekReadExceptions(final String filePath, final Class c, final String msg, final boolean isFile, final boolean isSeek, final int pos) throws Exception {
-
- final BlockCompressedInputStream bcis = isFile ?
- new BlockCompressedInputStream(new File(filePath)) :
- new BlockCompressedInputStream(new FileInputStream(filePath));
- boolean haveException = false;
- try {
- if ( isSeek ) {
- bcis.seek(pos);
- } else {
- final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
- reader.readLine();
- }
- } catch (final Exception e) {
- if ( e.getClass().equals(c) ) {
- haveException = true;
- Assert.assertEquals(e.getMessage(), msg);
- }
- }
-
- if ( !haveException ) {
- Assert.fail("Expected " + c.getSimpleName());
- }
- }
-
- @Test public void testOverflow() throws Exception {
- final File f = File.createTempFile("BCOST.", ".gz");
- f.deleteOnExit();
- final List<String> linesWritten = new ArrayList<>();
- System.out.println("Creating file " + f);
- final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f);
- Random r = new Random(15555);
- final int INPUT_SIZE = 64 * 1024;
- byte[] input = new byte[INPUT_SIZE];
- r.nextBytes(input);
- bcos.write(input);
- bcos.close();
-
- final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
- byte[] output = new byte[INPUT_SIZE];
- int len;
- int i = 0;
- while ((len = bcis.read(output, 0, output.length)) != -1) {
- for (int j = 0; j < len; j++) {
- Assert.assertEquals(output[j], input[i++]);
- }
- }
- Assert.assertEquals(i, INPUT_SIZE);
- bcis.close();
- }
-
- // PIC-393 exception closing BGZF stream opened to /dev/null
- // I don't think this will work on Windows, because /dev/null doesn't work
- @Test(groups = "broken")
- public void testDevNull() throws Exception {
- final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream("/dev/null");
- bcos.write("Hi, Mom!".getBytes());
- bcos.close();
- }
-
- @Test
- public void testCustomDeflater() throws Exception {
- final File f = File.createTempFile("testCustomDeflater.", ".gz");
- f.deleteOnExit();
- System.out.println("Creating file " + f);
-
- final int[] deflateCalls = {0}; //Note: using and array is a HACK to fool the compiler
-
- class MyDeflater extends Deflater{
- MyDeflater(int level, boolean nowrap){
- super(level, nowrap);
- }
- @Override
- public int deflate(byte[] b, int off, int len) {
- deflateCalls[0]++;
- return super.deflate(b, off, len);
- }
-
- }
- final DeflaterFactory myDeflaterFactory= new DeflaterFactory(){
- public Deflater makeDeflater(final int compressionLevel, final boolean nowrap) {
- return new MyDeflater(compressionLevel, nowrap);
- }
- };
- final List<String> linesWritten = new ArrayList<>();
- final BlockCompressedOutputStream bcos = new BlockCompressedOutputStream(f, 5, myDeflaterFactory);
- String s = "Hi, Mom!\n";
- bcos.write(s.getBytes()); //Call 1
- linesWritten.add(s);
- s = "Hi, Dad!\n";
- bcos.write(s.getBytes()); //Call 2
- linesWritten.add(s);
- bcos.flush();
- final StringBuilder sb = new StringBuilder(BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE * 2);
- s = "1234567890123456789012345678901234567890123456789012345678901234567890\n";
- while (sb.length() <= BlockCompressedStreamConstants.DEFAULT_UNCOMPRESSED_BLOCK_SIZE) {
- sb.append(s);
- linesWritten.add(s);
- }
- bcos.write(sb.toString().getBytes()); //Call 3
- bcos.close();
- final BlockCompressedInputStream bcis = new BlockCompressedInputStream(f);
- final BufferedReader reader = new BufferedReader(new InputStreamReader(bcis));
- String line;
- for(int i = 0; (line = reader.readLine()) != null; ++i) {
- Assert.assertEquals(line + "\n", linesWritten.get(i));
- }
- bcis.close();
- Assert.assertEquals(deflateCalls[0], 3, "deflate calls");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java b/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java
deleted file mode 100644
index 5b58372..0000000
--- a/src/test/java/htsjdk/samtools/util/BlockCompressedTerminatorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class BlockCompressedTerminatorTest {
- private static final File TEST_DATA_DIR = new File("src/test/resources/htsjdk/samtools/util");
-
- @Test
- public void testFileWithTerminator() throws Exception {
- final File tmpCompressedFile = File.createTempFile("test.", ".bgzf");
- tmpCompressedFile.deleteOnExit();
- final BlockCompressedOutputStream os = new BlockCompressedOutputStream(tmpCompressedFile);
- os.write("Hi, Mom!\n".getBytes());
- os.close();
- Assert.assertEquals(BlockCompressedInputStream.checkTermination(tmpCompressedFile),
- BlockCompressedInputStream.FileTermination.HAS_TERMINATOR_BLOCK);
- }
-
- @Test
- public void testValidFileWithoutTerminator() throws Exception {
- Assert.assertEquals(BlockCompressedInputStream.checkTermination(new File(TEST_DATA_DIR, "no_bgzf_terminator.bam")),
- BlockCompressedInputStream.FileTermination.HAS_HEALTHY_LAST_BLOCK);
- }
-
- @Test
- public void testDefectiveFile() throws Exception {
- Assert.assertEquals(BlockCompressedInputStream.checkTermination(new File(TEST_DATA_DIR, "defective_bgzf.bam")),
- BlockCompressedInputStream.FileTermination.DEFECTIVE);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CigarUtilTest.java b/src/test/java/htsjdk/samtools/util/CigarUtilTest.java
deleted file mode 100644
index 0aca395..0000000
--- a/src/test/java/htsjdk/samtools/util/CigarUtilTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.Cigar;
-import htsjdk.samtools.CigarElement;
-import htsjdk.samtools.TextCigarCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Basic positive tests for testing cigar string clipping
- *
- * @author Martha Borkan mborkan at broadinstitute.org
- */
-public class CigarUtilTest {
-
- @Test(dataProvider="clipData")
- public void basicTest(final String testName, final int start, final String inputCigar, final boolean negativeStrand,
- final int clipPosition,
- final String expectedCigar, final int expectedAdjustedStart) throws IOException {
- List<CigarElement> cigar = TextCigarCodec.decode(inputCigar).getCigarElements();
- if (negativeStrand){
- List<CigarElement> copiedList = new ArrayList<CigarElement>(cigar);
- Collections.reverse(copiedList);
- cigar = copiedList;
- }
- List<CigarElement> result = CigarUtil.softClipEndOfRead(clipPosition, cigar);
- Cigar newCigar = new Cigar(result);
- Cigar oldCigar = new Cigar(cigar);
- if (negativeStrand){
- Collections.reverse(result);
- newCigar = new Cigar(result);
- int oldLength = oldCigar.getReferenceLength();
- int newLength = newCigar.getReferenceLength();
- int sizeChange = oldLength - newLength;
- //Assert.assertEquals(sizeChange, numClippedBases + adjustment, testName + " sizeChange == numClippedBases");
- Assert.assertEquals(start + sizeChange, expectedAdjustedStart, sizeChange + " " + testName);
- Assert.assertTrue(sizeChange >= 0, "sizeChange >= 0. " + sizeChange);
- }
- Assert.assertEquals (TextCigarCodec.encode(newCigar), expectedCigar, testName);
- Assert.assertEquals(newCigar.getReadLength(), oldCigar.getReadLength());
- Assert.assertNull(newCigar.isValid(testName, -1));
- }
-
- @DataProvider(name = "clipData")
- private Object[][] getCigarClippingTestData() {
- // numClippedBases = (readLength - clipPosition) +1
- return new Object[][]{
- {"Test 1:simple + strand", 100, "50M", false, 43, "42M8S", 100},
- {"Test 1s:+ strand already clipped", 100, "42M8S", false, 43, "42M8S", 100},
- {"Test 2:simple - strand", 100, "50M", true, 41, "10S40M", 110},
- {"Test 3:boundary + strand", 100, "42M3D8M", false, 43, "42M8S", 100},
- {"Test 3s:boundary + strand", 100, "42M3D8S", false, 43, "42M8S", 100},
- {"Test 3x:stutter + strand", 100, "42M2D1D8M", false, 43, "42M8S", 100},
- {"Test 3y:stutter + strand", 100, "42M1D2D8M", false, 43, "42M8S", 100},
- {"Test 3a:boundary + strand", 100, "42M1D8M", false, 43, "42M8S", 100},
- {"Test 4:boundary - strand", 98, "10M2D40M", true, 41, "10S40M", 110},
- {"Test 5:deletion + strand", 100, "44M1D6M", false, 43, "42M8S", 110},
- {"Test 6:deletion - strand", 98, "6M2D44M", true, 41, "10S40M", 110},
-
- {"Test 7:insertion + strand", 100, "42M3I5M", false, 43, "42M8S", 100},
- {"Test 8:insertion - strand", 102, "8M2I40M", true, 41, "10S40M", 110},
- {"Test 9:insertion within + strand", 100, "44M2I4M", false, 43, "42M8S", 100},
- {"Test 9x:insertion stutter within + strand", 100, "44M2I2I2M", false, 43, "42M8S", 100},
- {"Test 10:insertion within - strand", 100, "3M3I44M", true, 41, "10S40M", 107},
- {"Test 11:insertion straddling + strand", 100, "40M4I6M", false, 43, "40M10S", 100},
- {"Test 11s:insertion straddling + strand", 100, "40M4I6S", false, 43, "40M10S", 100},
- {"Test 11a:insertion straddling + strand", 100, "40M2I8M", false, 43, "40M10S", 100},
- {"Test 12:insertion straddling - strand", 104, "4M4I42M", true, 41, "10S40M", 110},
- {"Test 12a:insertion straddling - strand", 102, "8M2I40M", true, 41, "10S40M", 110},
-
- {"Test 13:deletion before clip + strand", 100, "10M5D35M", false, 38, "10M5D27M8S", 100},
- {"Test 14:deletion before clip - strand", 100, "35M5D10M", true, 36, "10S25M5D10M", 110},
- {"Test 15:insertion before clip + strand", 100, "10M5I35M", false, 43, "10M5I27M8S", 100},
- {"Test 16:insertion before clip - strand", 100, "16M5I29M", true, 41, "10S6M5I29M", 110},
-
- {"Test 17:second, earlier clip", 100, "48M2S", false, 43, "42M8S", 100},
- {"Test 17s:second, earlier clip", 100, "2S48M", true, 43, "8S42M", 106},
- {"Test 18:second, later clip", 100, "42M8S", false, 48, "42M8S", 100},
- {"Test 18s:second, later clip", 100, "8S42M", true, 48, "8S42M", 100},
- };
- }
-
- @Test(dataProvider="addData")
- public void addingSoftClippedBasesTest(final String testName, final String cigar, final boolean negativeStrand,
- final int threePrimeEnd, final int fivePrimeEnd, final String expectedCigar) throws IOException {
-
- Assert.assertEquals(CigarUtil.addSoftClippedBasesToEndsOfCigar(TextCigarCodec.decode(cigar), negativeStrand,
- threePrimeEnd, fivePrimeEnd).toString(), expectedCigar, testName);
- }
-
- @DataProvider(name = "addData")
- private Object[][] getCigarAddingTestData() {
- // numClippedBases = (readLength - clipPosition) +1
- return new Object[][]{
- {"Add to 5' end only, +", "36M", false, 0, 5, "5S36M"},
- {"Add to 5' end only, -", "30M1I5M", true, 0, 5, "30M1I5M5S"},
- {"Add to 3' end only, +", "26M", false, 3, 0, "26M3S"},
- {"Add to 3' end only, -", "19M3D7M", true, 3, 0, "3S19M3D7M"},
- {"Add to 5' end already soft-clipped, +", "6S20M", false, 0, 5, "11S20M"},
- {"Add to 5' end already soft-clipped, -", "28M4S", true, 0, 5, "28M9S"},
- {"Add to 3' end already soft-clipped, +", "15M5I10M2S", false, 7, 0, "15M5I10M9S"},
- {"Add to 3' end already soft-clipped, -", "2S34M", true, 6, 0, "8S34M"},
- {"Add to 5' and 3' ends, no merging, +", "36M", false, 15, 30, "30S36M15S"},
- {"Add to 5' and 3' ends, no merging, -", "36M", true, 15, 30, "15S36M30S"},
- {"Add to 5' and 3' ends, merging 5' end, +", "5S31M", false, 15, 30, "35S31M15S"},
- {"Add to 5' and 3' ends, merging 5' end, -", "31M5S", true, 15, 30, "15S31M35S"},
- {"Add to 5' and 3' ends, merging 3' end, +", "20M6S", false, 10, 12, "12S20M16S"},
- {"Add to 5' and 3' ends, merging 3' end, -", "6S25M", true, 10, 12, "16S25M12S"},
- {"Add to 5' and 3' ends, merging both ends, +", "3S31M2S", false, 10, 15, "18S31M12S"},
- {"Add to 5' and 3' ends, merging both ends, -", "2S26M8S", true, 10, 12, "12S26M20S"}
- };
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java b/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java
deleted file mode 100644
index b96d1f6..0000000
--- a/src/test/java/htsjdk/samtools/util/CloseableIteratorTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class CloseableIteratorTest {
- @Test
- public void testToList() {
- final List<Integer> expected = Arrays.asList(1,2,3,4,5);
- final PeekableIterator<Integer> peeky = new PeekableIterator<>(expected.iterator());
- final List<Integer> actual = peeky.toList();
-
- Assert.assertEquals(actual, expected);
- Assert.assertEquals(peeky.toList(), new ArrayList<>()); // Should be empty the second time
- }
-
- @Test
- public void testToStream() {
- final List<Integer> inputs = Arrays.asList(1,2,3,4,5);
- final PeekableIterator<Integer> peeky = new PeekableIterator<>(inputs.iterator());
- final List<Integer> expected = inputs.stream().map(i -> i*2).collect(Collectors.toList());
- final List<Integer> actual = peeky.stream().map(i -> i*2).collect(Collectors.toList());
-
- Assert.assertEquals(actual, expected);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CodeUtilTest.java b/src/test/java/htsjdk/samtools/util/CodeUtilTest.java
deleted file mode 100644
index e8b9957..0000000
--- a/src/test/java/htsjdk/samtools/util/CodeUtilTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class CodeUtilTest {
-
- @Test
- public void getOrElseTest() {
- final String notNull = "Not null!";
- Assert.assertEquals(CodeUtil.getOrElse(notNull, null), notNull);
- Assert.assertEquals(CodeUtil.getOrElse(null, notNull), notNull);
- Assert.assertEquals((Object) CodeUtil.getOrElse(null, null), (Object) null);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java b/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java
deleted file mode 100644
index 7e8b082..0000000
--- a/src/test/java/htsjdk/samtools/util/ComparableTupleTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.variant.variantcontext.Allele;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 1/28/16.
- */
-public class ComparableTupleTest {
-
- private enum Tenum {
- Hi,
- Bye,
- Ciao
- }
-
- private Allele A = Allele.create("A", false);
- private Allele Aref = Allele.create("A", true);
- private Allele G = Allele.create("G", false);
-
- @DataProvider(name = "testComparableTupleData")
- public Object[][] testComparableTupleData() {
- return new Object[][]{
- new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(1, 1), 2 - 1},
- new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(2, 2), 1 - 2},
- new Object[]{new ComparableTuple<>(1, 2), new ComparableTuple<>(1, 2), 0},
-
- new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(1, "bye"), "hi".compareTo("bye")},
- new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(2, "bye"), 1 - 2},
- new Object[]{new ComparableTuple<>(1, "hi"), new ComparableTuple<>(1, "hi"), 0},
-
- new Object[]{new ComparableTuple<>(A, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Bye), A.compareTo(Aref)},
- new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Bye), Tenum.Hi.compareTo(Tenum.Bye)},
- new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(Aref, Tenum.Hi), 0},
- new Object[]{new ComparableTuple<>(Aref, Tenum.Hi), new ComparableTuple<>(G, Tenum.Ciao), Aref.compareTo(G)},
- new Object[]{new ComparableTuple<>(A, Tenum.Ciao), new ComparableTuple<>(G, Tenum.Hi), A.compareTo(G)}
- };
- }
-
- @Test(dataProvider = "testComparableTupleData")
- public <T extends Comparable<T>, R extends Comparable<R>> void testComparableTuple(final ComparableTuple<T,R> lhs, final ComparableTuple<T,R> rhs, final int result) {
- Assert.assertEquals(lhs.compareTo(rhs), result);
- }
-
-
- @DataProvider(name = "testComparableTupleNullData")
- public Object[][] testComparableTupleNullData() {
- return new Object[][]{
- new Object[]{null, 2},
- new Object[]{null, null},
- new Object[]{"string", null}
- };
- }
-
- @Test(dataProvider = "testComparableTupleNullData", expectedExceptions = IllegalArgumentException.class)
- public void testComparableTupleNullData(String left, Integer right) {
- new ComparableTuple<>(left, right);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java b/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java
deleted file mode 100644
index 1b90882..0000000
--- a/src/test/java/htsjdk/samtools/util/CoordSpanInputSteamTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.seekablestream.ByteArraySeekableStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Created by vadim on 25/03/2015.
- */
-public class CoordSpanInputSteamTest {
-
- @Test
- public void test_first_3_bytes() throws IOException {
- byte[] data = new byte[1024 * 1024];
- new Random().nextBytes(data);
-
- long[] coords = new long[]{0, 1, 1, 2, 2, 3};
-
- CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
- Assert.assertEquals(csis.read(), 0xFF & data[0]);
- Assert.assertEquals(csis.read(), 0xFF & data[1]);
- Assert.assertEquals(csis.read(), 0xFF & data[2]);
-
- Assert.assertEquals(csis.read(), -1);
- }
-
- @Test
- public void test_3_ranges_byte_single_read() throws IOException {
- byte[] data = new byte[1024 * 1024];
- new Random().nextBytes(data);
-
- long[] coords = new long[]{0, 100, 10, 20, 100, 200, data.length - 1, Long.MAX_VALUE};
-
- CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
- for (int i = 0; i < coords.length; i += 2) {
- for (int c = (int) coords[i]; c < coords[i + 1]; c++) {
- int read = csis.read();
- if (c >= data.length) {
- Assert.assertEquals(read, -1);
- break;
- } else
- Assert.assertEquals(read, 0xFF & data[c], String.format("At %d: read=%d, data=%d\n", c, read, data[c]));
- }
- }
- }
-
- @Test
- public void test_range_read() throws IOException {
- byte[] data = new byte[1024 * 1024];
- new Random().nextBytes(data);
-
- long[] coords = new long[]{0, 100, 10, 20, 100, 200, data.length - 1, Long.MAX_VALUE};
-
- CoordSpanInputSteam csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- for (int i = 0; i < coords.length; i += 2) {
- for (int c = (int) coords[i]; c < coords[i + 1]; c++) {
- int read = csis.read();
- if (read == -1) break;
- baos.write(data[c]);
- }
- }
- byte[] contiguous = baos.toByteArray();
- ByteArrayInputStream bais = new ByteArrayInputStream(contiguous);
- csis = new CoordSpanInputSteam(new ByteArraySeekableStream(data), coords);
-
- byte[] buf1 = new byte[100];
- byte[] buf2 = new byte[100];
- DataInputStream dis1 = new DataInputStream(csis);
- DataInputStream dis2 = new DataInputStream(bais);
-
- Arrays.fill(buf1, (byte) 0);
- Arrays.fill(buf2, (byte) 0);
- dis1.readFully(buf1, 0, 10);
- dis2.readFully(buf2, 0, 10);
- Assert.assertEquals(buf1, buf2);
-
- int len = 11;
- while (true) {
- try {
- dis1.readFully(buf1, 0, len);
- } catch (EOFException e) {
- break;
- }
- dis2.readFully(buf2, 0, len);
- Assert.assertEquals(buf1, buf2);
- }
- try {
- dis2.readFully(buf2, 0, len);
- } catch (EOFException e) {
-
- }
- Assert.assertEquals(dis1.read(), -1);
- Assert.assertEquals(dis2.read(), -1);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java b/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java
deleted file mode 100644
index 88b05e2..0000000
--- a/src/test/java/htsjdk/samtools/util/DiskBackedQueueTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Collections;
-
-public class DiskBackedQueueTest extends SortingCollectionTest {
- @DataProvider(name = "diskBackedQueueProvider")
- public Object[][] createDBQTestData() {
- return new Object[][] {
- {"empty", 0, 100},
- {"singleton", 1, 100},
- {"no ram records", 10, 0},
- {"less than threshold", 100, 200},
- {"threshold minus 1", 99, 100},
- {"greater than threshold", 550, 100},
- {"threshold multiple", 600, 100},
- {"threshold multiple plus one", 101, 100},
- {"exactly threshold", 100, 100},
- };
- }
-
- @BeforeMethod void setup() { resetTmpDir(); }
- @AfterMethod void tearDown() { resetTmpDir(); }
-
- /**
- * Generate some strings, put into SortingCollection, confirm that the right number of
- * Strings come out, and in the right order.
- * @param numStringsToGenerate
- * @param maxRecordsInRam
- */
- @Test(dataProvider = "diskBackedQueueProvider")
- public void testPositive(final String testName, final int numStringsToGenerate, final int maxRecordsInRam) {
- final String[] strings = new String[numStringsToGenerate];
- int numStringsGenerated = 0;
- final DiskBackedQueue<String> diskBackedQueue = makeDiskBackedQueue(maxRecordsInRam);
- for (final String s : new RandomStringGenerator(numStringsToGenerate)) {
- diskBackedQueue.add(s);
- strings[numStringsGenerated++] = s;
- }
- Assert.assertEquals(tmpDirIsEmpty(), numStringsToGenerate <= maxRecordsInRam);
- assertQueueEqualsList(strings, diskBackedQueue);
- Assert.assertEquals(diskBackedQueue.canAdd(), numStringsToGenerate <= maxRecordsInRam);
- Assert.assertEquals(diskBackedQueue.size(), 0);
- Assert.assertTrue(diskBackedQueue.isEmpty());
- Assert.assertEquals(diskBackedQueue.poll(), null);
- diskBackedQueue.clear();
- Assert.assertTrue(diskBackedQueue.canAdd());
- }
-
- private void assertQueueEqualsList(final String[] strings, final DiskBackedQueue<String> diskBackedQueue) {
- int i = 0;
- while (!diskBackedQueue.isEmpty()) {
- final String s = diskBackedQueue.poll();
- Assert.assertEquals(s, strings[i]);
- i++;
- }
- Assert.assertEquals(i, strings.length);
- }
-
- private DiskBackedQueue<String> makeDiskBackedQueue(final int maxRecordsInRam) {
- return DiskBackedQueue.newInstance(new StringCodec(), maxRecordsInRam, Collections.singletonList(tmpDir()));
- }
-
- @Test
- public void testReadOnlyQueueJustBeforeReadingFromDisk() {
- final DiskBackedQueue<String> queue = makeDiskBackedQueue(2);
- queue.add("foo");
- queue.add("bar");
- queue.add("baz");
- Assert.assertEquals("foo", queue.poll());
- Assert.assertEquals("bar", queue.poll());
-
- // Spilled-to-disk records have not been read yet, but one has been loaded into headRecord, so the queue is
- // closed for enqueue-ing.
- Assert.assertFalse(queue.canAdd());
- Assert.assertEquals("baz", queue.poll());
-
- Assert.assertEquals(queue.size(), 0);
- Assert.assertTrue(queue.isEmpty());
- Assert.assertEquals(queue.poll(), null);
- queue.clear();
- Assert.assertTrue(queue.canAdd());
- }
-
- /** See: https://github.com/broadinstitute/picard/issues/327 */
- @Test(expectedExceptions = IllegalStateException.class)
- public void testPathologyIssue327() {
-
- final DiskBackedQueue<String> queue = makeDiskBackedQueue(2);
-
- // testing a particular order of adding to the queue, setting the result state, and emitting.
- queue.add("0");
- queue.add("1");
- queue.add("2"); // spills to disk
- Assert.assertEquals(queue.poll(), "0"); // gets from ram, so now there is space in ram, but a record on disk
- queue.add("3"); // adds, but we assumed we added all records before removing them
- Assert.assertEquals(queue.poll(), "1");
- Assert.assertEquals(queue.poll(), "2");
- Assert.assertEquals(queue.poll(), "3");
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java b/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java
deleted file mode 100644
index a5459c6..0000000
--- a/src/test/java/htsjdk/samtools/util/EdgeReadIteratorTest.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SamReader;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests check that for each alignment block of processed reads, iterator returns a <code>EdgingRecordAndOffset</code>
- * with type <code>BEGIN</code> for the reference position of read start and a <code>EdgingRecordAndOffset</code> with
- * type <code>END</code> for the reference position + 1 of read end.
- */
-public class EdgeReadIteratorTest extends AbstractLocusIteratorTestTemplate {
-
- @Override
- @Test
- public void testBasicIterator() {
- final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
- int pos = 1;
- for (final AbstractLocusInfo<EdgingRecordAndOffset> li : sli) {
- if (pos == 1 || pos == 37) {
- assertEquals(pos++, li.getPosition());
- assertEquals(2, li.getRecordAndOffsets().size());
- } else {
- assertEquals(pos++, li.getPosition());
- assertEquals(0, li.getRecordAndOffsets().size());
- }
- }
-
- }
-
- /**
- * Since EdgeReadIterator does not support emitting uncovered loci, this test just check that
- * iterator return correctly aligned objects for start and end of a read.
- */
- @Override
- @Test
- public void testEmitUncoveredLoci() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
- }
- final int coveredEnd = CoordMath.getEnd(startPosition, readLength) +1;
- final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
-
- int pos = 1;
- final int coveredStart = 165;
- for (final AbstractLocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos++);
- final int expectedReads;
- if (li.getPosition() == coveredStart || li.getPosition() == coveredEnd) {
- expectedReads = 2;
- } else {
- expectedReads = 0;
- }
- Assert.assertEquals(li.getRecordAndOffsets().size(), expectedReads);
- }
- Assert.assertEquals(pos, 100001);
- }
-
- /**
- * Try all CIGAR operands (except H and P) and confirm that loci produced by SamLocusIterator are as expected.
- */
- @Override
- @Test
- public void testSimpleGappedAlignment() {final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "3S3M3N3M3D3M3I1N18M3S", null, 10);
- }
- final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
- while (sli.hasNext()) {
- AbstractLocusInfo<EdgingRecordAndOffset> info = sli.next();
- int pos = info.getPosition();
- if (pos == startPosition || pos == startPosition + 6 || pos == startPosition + 12 || pos == startPosition + 16) {
- assertEquals(EdgingRecordAndOffset.Type.BEGIN, info.getRecordAndOffsets().get(0).getType());
- assertEquals(EdgingRecordAndOffset.Type.BEGIN, info.getRecordAndOffsets().get(1).getType());
- } else if (pos == startPosition + 3 || pos == startPosition + 9 || pos == startPosition + 15 || pos == startPosition + 34) {
- assertEquals(EdgingRecordAndOffset.Type.END, info.getRecordAndOffsets().get(0).getType());
- assertEquals(EdgingRecordAndOffset.Type.END, info.getRecordAndOffsets().get(1).getType());
- }
- }
- }
-
- /**
- * Test two reads that overlap because one has a deletion in the middle of it.
- */
- @Override
- @Test
- public void testOverlappingGappedAlignmentsWithoutIndels() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 1;
- // Were it not for the gap, these two reads would not overlap
-
- builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
- builder.addFrag("record2", 0, 41, true, false, "36M", null, 10);
-
- final EdgeReadIterator sli = new EdgeReadIterator(builder.getSamReader());
- // 5 base overlap btw the two reads
- final int numBasesCovered = 81;
- final int[] expectedReferencePositions = new int[numBasesCovered];
- final int[] expectedDepths = new int[numBasesCovered];
- final int[][] expectedReadOffsets = new int[numBasesCovered][];
- List<Integer> start = Arrays.asList(0, 28, 40);
- List<Integer> end = Arrays.asList(19, 47, 77);
-
- int i;
- // First 18 bases are from the first read
- expectedDepths[0] = 1;
- expectedReferencePositions[0] = 1;
- expectedReadOffsets[0] = new int[]{0};
-
- for (i = 1; i < 18; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
- expectedDepths[i] = 1;
- expectedReferencePositions[i] = 19;
- expectedReadOffsets[i++] = new int[]{0};
-
- for (; i < 28; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
-
- // Gap of 10, then 13 bases from the first read
- expectedDepths[i] = 1;
- expectedReferencePositions[i] = 29;
- expectedReadOffsets[i++] = new int[]{18};
-
- for (; i < 40; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
-
- expectedDepths[i] = 1;
- expectedReferencePositions[i] = 41;
- expectedReadOffsets[i++] = new int[]{0};
-
- for (; i < 46; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
-
- expectedDepths[i] = 1;
- expectedReferencePositions[i] = 47;
- expectedReadOffsets[i++] = new int[]{18};
-
- // Last 5 bases of first read overlap first 5 bases of second read
- for (; i < 76; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
-
- expectedDepths[i] = 1;
- expectedReferencePositions[i] = 77;
- expectedReadOffsets[i++] = new int[]{0};
-
- // Last 31 bases of 2nd read
-
- for (; i <= 80; ++i) {
- fillEmptyLocus(expectedReferencePositions, expectedDepths, expectedReadOffsets, i);
- }
-
- i = 0;
- for (final AbstractLocusInfo<EdgingRecordAndOffset> li : sli) {
- Assert.assertEquals(li.getRecordAndOffsets().size(), expectedDepths[i]);
- Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
- Assert.assertEquals(li.getRecordAndOffsets().size(), expectedReadOffsets[i].length);
- for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
- Assert.assertEquals(li.getRecordAndOffsets().get(j).getOffset(), expectedReadOffsets[i][j]);
- if (start.contains(li.getPosition() - 1)) {
- Assert.assertEquals(li.getRecordAndOffsets().get(j).getType(), EdgingRecordAndOffset.Type.BEGIN);
- }
- if (end.contains(li.getPosition() - 1)) {
- Assert.assertEquals(li.getRecordAndOffsets().get(j).getType(), EdgingRecordAndOffset.Type.END);
- }
- }
- ++i;
- if (i == 80) {
- break;
- }
- }
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testSetQualityCutOff() {
- final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
- sli.setQualityScoreCutoff(10);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testSetMaxReadsToAccumulatePerLocus() {
- final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
- sli.setMaxReadsToAccumulatePerLocus(100);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testSetEmitUncoveredLoci() {
- final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
- sli.setEmitUncoveredLoci(false);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testSetIncludeIndels() {
- final EdgeReadIterator sli = new EdgeReadIterator(createSamFileReader());
-
- sli.setIncludeIndels(true);
- }
-
- /**
- * Tests that reads, that don't intersect given interval list, are excluded from iterator
- */
- @Test
- public void testNotIntersectingInterval() {
- SamReader samReader = createSamFileReader();
-
- IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
- "@SQ\tSN:chrM\tLN:100\n" +
- "chrM\t50\t60\t+\ttest");
- EdgeReadIterator iterator = new EdgeReadIterator(samReader, intervals);
- int locusPosition = 50;
- while (iterator.hasNext()) {
- AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
- assertEquals(locusPosition++, next.getPosition());
- assertEquals(0, next.getRecordAndOffsets().size());
- }
- assertEquals(61, locusPosition);
- }
-
- /**
- * Tests that for reads, that intersect given interval list read start is shifted to the start of the interval and
- * length is adjusted to the end of the interval.
- */
- @Test
- public void testIntersectingInterval() {
- SamReader samReader = createSamFileReader();
- IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
- "@SQ\tSN:chrM\tLN:100\n" +
- "chrM\t5\t15\t+\ttest");
- EdgeReadIterator iterator = new EdgeReadIterator(samReader, intervals);
- int locusPosition = 5;
- while (iterator.hasNext()) {
- AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
- int position = next.getPosition();
- assertEquals(locusPosition++, position);
- if (position == 5) {
- assertEquals(2, next.getRecordAndOffsets().size());
- for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
- assertEquals(11, record.getLength());
- }
- } else {
- assertEquals(0, next.getRecordAndOffsets().size());
- }
- }
- assertEquals(16, locusPosition);
- }
-
- /**
- * Test for mixed reads: intersecting and not the interval
- */
- @Test
- public void testIntersectingAndNotInterval() {
-
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 40;
- // Were it not for the gap, these two reads would not overlap
- builder.addFrag("record2", 0, startPosition, true, false, "36M", null, 10);
-
- IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
- "@SQ\tSN:chrM\tLN:100\n" +
- "chrM\t40\t80\t+\ttest");
-
- EdgeReadIterator iterator = new EdgeReadIterator(builder.getSamReader(), intervals);
- int locusPosition = 40;
- while (iterator.hasNext()) {
- AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
- int position = next.getPosition();
- assertEquals(locusPosition++, position);
- if (position == 40) {
- assertEquals(1, next.getRecordAndOffsets().size());
- for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
- assertEquals(36, record.getLength());
- assertEquals(EdgingRecordAndOffset.Type.BEGIN, record.getType());
- }
- } else if (position == 76) {
- assertEquals(1, next.getRecordAndOffsets().size());
- for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
- assertEquals(36, record.getLength());
- assertEquals(EdgingRecordAndOffset.Type.END, record.getType());
- }
- } else {
- assertEquals(0, next.getRecordAndOffsets().size());
- }
- }
- assertEquals(81, locusPosition);
- }
-
-
- /**
- * Test for intersecting interval for read with a deletion in the middle
- */
- @Test
- public void testIntersectingIntervalWithComplicatedCigar() {
-
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 1;
- // Were it not for the gap, these two reads would not overlap
- builder.addFrag("record", 0, startPosition, true, false, "10M3D26M", null, 10);
-
- IntervalList intervals = createIntervalList("@HD\tSO:coordinate\tVN:1.0\n" +
- "@SQ\tSN:chrM\tLN:100\n" +
- "chrM\t5\t20\t+\ttest");
-
- EdgeReadIterator iterator = new EdgeReadIterator(builder.getSamReader(), intervals);
- int locusPosition = 5;
- int[] expectedLength = new int[]{6, 7};
- int i = 0;
- while (iterator.hasNext()) {
- AbstractLocusInfo<EdgingRecordAndOffset> next = iterator.next();
- int position = next.getPosition();
- assertEquals(locusPosition++, position);
- if (position == 5 || position == 14) {
- assertEquals(1, next.getRecordAndOffsets().size());
- for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
- assertEquals(expectedLength[i], record.getLength());
- assertEquals(EdgingRecordAndOffset.Type.BEGIN, record.getType());
- }
- } else if (position == 11) {
- assertEquals(1, next.getRecordAndOffsets().size());
- for (EdgingRecordAndOffset record : next.getRecordAndOffsets()) {
- assertEquals(expectedLength[i], record.getLength());
- assertEquals(EdgingRecordAndOffset.Type.END, record.getType());
- }
- i++;
- } else {
- assertEquals(0, next.getRecordAndOffsets().size());
- }
- }
- assertEquals(21, locusPosition);
- }
-
-
- private void fillEmptyLocus(int[] expectedReferencePositions, int[] expectedDepths, int[][] expectedReadOffsets, int i) {
- expectedReferencePositions[i] = i + 1;
- expectedDepths[i] = 0;
- expectedReadOffsets[i] = new int[]{};
- }
-
- private SamReader createSamFileReader() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 1;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
- }
- return builder.getSamReader();
- }
-
-
- private IntervalList createIntervalList(String s) {
- return IntervalList.fromReader(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes()))));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java b/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java
deleted file mode 100644
index a4f6478..0000000
--- a/src/test/java/htsjdk/samtools/util/EdgingRecordAndOffsetTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMRecord;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
-/**
- *
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- *
- */
-
-public class EdgingRecordAndOffsetTest {
- private final byte[] qualities = {30, 50, 50, 60, 60, 70 ,70, 70, 80, 90};
- private final byte[] bases = {'A', 'C', 'G', 'T', 'A', 'C', 'G', 'T', 'T', 'C'};
- private SAMRecord record;
-
- @BeforeTest
- public void setUp(){
- record = new SAMRecord(new SAMFileHeader());
- record.setReadName("testRecord");
- record.setReadBases(bases);
- record.setBaseQualities(qualities);
- }
-
- @Test
- public void testConstructor(){
- EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
- assertArrayEquals(qualities, typedRecordAndOffset.getBaseQualities());
- assertArrayEquals(bases, typedRecordAndOffset.getRecord().getReadBases());
- assertEquals('A', typedRecordAndOffset.getReadBase());
- assertEquals(0, typedRecordAndOffset.getOffset());
- assertEquals(3, typedRecordAndOffset.getRefPos());
- assertEquals(EdgingRecordAndOffset.Type.BEGIN, typedRecordAndOffset.getType());
- }
-
- @Test
- public void testGetSetStart(){
- EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
- EdgingRecordAndOffset typedRecordAndOffsetEnd = EdgingRecordAndOffset.createEndRecord(typedRecordAndOffset);
- assertEquals(typedRecordAndOffset, typedRecordAndOffsetEnd.getStart());
- assertEquals(EdgingRecordAndOffset.Type.END, typedRecordAndOffsetEnd.getType());
- }
-
- @Test
- public void testNotEqualsTypedRecords(){
- EdgingRecordAndOffset typedRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 3);
- EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 5, 10, 3);
- assertNotSame(typedRecordAndOffset.getBaseQuality(), secondEdgingRecordAndOffset.getBaseQuality());
- assertArrayEquals(typedRecordAndOffset.getBaseQualities(), secondEdgingRecordAndOffset.getBaseQualities());
- }
-
- @Test
- public void testGetOffset(){
- EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 5, 10, 3);
- assertEquals(70, secondEdgingRecordAndOffset.getBaseQuality());
- assertEquals('C', secondEdgingRecordAndOffset.getReadBase());
- }
-
- @Test
- public void testGetQualityAtPosition(){
- EdgingRecordAndOffset secondEdgingRecordAndOffset = EdgingRecordAndOffset.createBeginRecord(record, 0, 10, 1);
- assertEquals(50, secondEdgingRecordAndOffset.getBaseQuality(2));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/HistogramTest.java b/src/test/java/htsjdk/samtools/util/HistogramTest.java
deleted file mode 100644
index 62b1441..0000000
--- a/src/test/java/htsjdk/samtools/util/HistogramTest.java
+++ /dev/null
@@ -1,366 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-
-import static java.lang.Math.abs;
-import static java.lang.StrictMath.pow;
-
-public class HistogramTest {
-
- @Test(dataProvider = "histogramData")
- public void testHistogramFunctions(final int[] values, final double mean, final double stdev, final Integer trimByWidth) {
- final Histogram<Integer> histo = new Histogram<>();
- for (int value : values) {
- histo.increment(value);
- }
-
- if (trimByWidth != null) histo.trimByWidth(trimByWidth);
- final double m = histo.getMean();
- final double sd = histo.getStandardDeviation();
-
- Assert.assertEquals(round(mean), round(m), "Means are not equal");
- Assert.assertEquals(round(stdev), round(sd), "Stdevs are not equal");
- }
-
- @DataProvider(name = "histogramData")
- public Object[][] histogramData() {
- return new Object[][] {
- new Object[] {new int[] {1,2,3,4,5,6,7,8,9,10} , 5.5d, 3.027650d, null },
- new Object[] {new int[] {1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9}, 6.333333d, 2.236068d, null },
- new Object[] {new int[] {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 5d, 6.204837d, null },
- new Object[] {new int[] {1,2,3,4,5,6,7,8,9,10, 11, 11, 12, 100, 1000} , 5.5d, 3.027650d, 10 },
- new Object[] {new int[] {1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9, 20, 20, 21, 25, 25}, 6.333333d, 2.236068d, 11 },
- new Object[] {new int[] {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 101, 102, 103, 200, 2000}, 5d, 6.204837d, 20 }
- };
- }
-
- @Test
- public void testGeometricMean() {
- final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertTrue(abs(histo.getGeometricMean() - 6.216797) < 0.00001);
- }
-
- @Test
- public void testGetSum() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getSum(), (double)(2*4+3*5), 0.000001);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testGetSumBlowup() {
- final String[] is = {"foo", "foo", "bar"};
- final Histogram<String> histo = new Histogram<>();
- for (final String i : is) histo.increment(i);
- histo.getSum();//blow up
- }
-
- @Test
- public void testGetSumOfValues() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getSumOfValues(), (double)(2+3), 0.000001);
- }
-
- @Test
- public void testGetMeanBinSize() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getMeanBinSize(), (2+3)/2.0, 0.000001);
- }
-
- @Test
- public void testGetStandardDeviationBinSize() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- final double std = Math.sqrt((pow(2.0-2.5, 2)+pow(3.0-2.5, 2.0))); //sample variance so dividing by 1
- Assert.assertEquals(histo.getStandardDeviationBinSize(histo.getMeanBinSize()), std, 0.000001);
- }
-
- @Test
- public void testGetKeySet() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
-
- Assert.assertEquals(histo.keySet(), new HashSet<>(Arrays.asList(4,5)));
- }
-
- @Test
- public void testLabelsAndComparator() {
- final String[] is = {"a", "B", "a"};
- final Histogram<String> histo = new Histogram<>("FOO", "BAR", String.CASE_INSENSITIVE_ORDER);
- for (final String i : is) histo.increment(i);
- Assert.assertEquals(histo.get("a").getValue(), 2.0);
- Assert.assertEquals(histo.get("B").getValue(), 1.0);
- Assert.assertEquals(histo.get("a").getId(), "a");
- Assert.assertEquals(histo.get("B").getId(), "B");
- }
-
-
- @Test
- public void testPrefillBins() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- Assert.assertEquals(histo.get(4), null);
- Assert.assertEquals(histo.get(5), null);
- histo.prefillBins(4);
- Assert.assertEquals(histo.get(4).getValue(),0.0);
- Assert.assertEquals(histo.get(5), null);
-
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.get(4).getValue(),2.0);
- Assert.assertEquals(histo.get(5).getValue(),3.0);
- }
-
- @Test
- public void testLabels() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>("FOO", "BAR");
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getBinLabel(),"FOO");
- Assert.assertEquals(histo.getValueLabel(),"BAR");
- }
-
- @Test
- public void testCopyCtor() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo1 = new Histogram<>();
- for (final int i : is) histo1.increment(i);
-
- final Histogram<Integer> histo2 = new Histogram<>(histo1);
- Assert.assertEquals(histo1, histo2);
- Assert.assertEquals(histo2, histo1);
- }
-
- @Test
- public void testGet() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
-
- Assert.assertEquals(histo.get(4).getValue(), 2.0);
- Assert.assertEquals(histo.get(5).getValue(), 3.0);
- Assert.assertEquals(histo.get(6), null);
- }
-
- @Test
- public void testAddHistogram() {
- final int[] is1 = {4,4,5,5,5};
- final Histogram<Integer> histo1 = new Histogram<>();
- Assert.assertTrue(histo1.isEmpty());
- for (final int i : is1) histo1.increment(i);
-
- Assert.assertFalse(histo1.isEmpty());
-
- final int[] is2 = {5,5, 6,6,6,6};
- final Histogram<Integer> histo2 = new Histogram<>();
- for (final int i : is2) histo2.increment(i);
-
- Assert.assertEquals(histo1.get(4).getValue(), 2.0);
- Assert.assertEquals(histo1.get(5).getValue(), 3.0);
- Assert.assertEquals(histo1.get(6), null);
-
- histo1.addHistogram(histo2);
-
- Assert.assertEquals(histo1.get(4).getValue(), 2.0);
- Assert.assertEquals(histo1.get(5).getValue(), 5.0);
- Assert.assertEquals(histo1.get(6).getValue(), 4.0);
- }
-
- @Test
- public void testGetCumulativeProbability() {
- final int[] is = {4,4,5,5,5,6,6,6,6};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getCumulativeProbability(2.0), 0.0);
- Assert.assertEquals(histo.getCumulativeProbability(4.0), 2.0/9);
- Assert.assertEquals(histo.getCumulativeProbability(5.0), 5.0/9);
- Assert.assertEquals(histo.getCumulativeProbability(6.0), 9.0/9);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testGetCumulativeProbabilityBlowup() {
- final String[] is = {"foo"};
- final Histogram<String> histo = new Histogram<>();
- for (final String i : is) histo.increment(i);
- histo.getCumulativeProbability(2.0);
- }
-
- @Test
- public void testPercentile() {
- final int[] is = {4,4,5,5,5,6,6,6,6};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getPercentile(0.01), 4.0);
- Assert.assertEquals(histo.getPercentile(2.0/9), 4.0);
- Assert.assertEquals(histo.getPercentile(5.0/9), 5.0);
- Assert.assertEquals(histo.getPercentile(0.99999), 6.0);
- }
-
- @Test
- public void testGetMinMax() {
- final int[] is = {4,4,5,5,5,6,6,6,6};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getMin(), 4.0);
- Assert.assertEquals(histo.getMax(), 6.0);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testGetMinBlowup() {
- final String[] is = {"foo", "bar", "bar"};
- final Histogram<String> histo = new Histogram<>();
- for (final String i : is) histo.increment(i);
- histo.getMin();//blow up
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testGetMaxBlowup() {
- final String[] is = {"foo", "bar", "bar"};
- final Histogram<String> histo = new Histogram<>();
- for (final String i : is) histo.increment(i);
- histo.getMax();//blow up
- }
-
- @Test
- public void testGetMedianBinSize() {
- final int[] is = {4,4,5,5,5,6,6,6,6};
- final Histogram<Integer> histo = new Histogram<>();
- Assert.assertEquals(histo.getMedianBinSize(), 0, 0.000001); //empty
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getMedianBinSize(), 3, 0.000001); //three fives
- }
-
- @Test
- public void testGetMedianBinSize_Even() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- Assert.assertEquals(histo.getMedianBinSize(), 0, 0.000001); //empty
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getMedianBinSize(), (2+3)/2.0, 0.000001); //even split
- }
-
- @Test
- public void testSize() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.size(), 2); //2 unique values
- }
-
-
- @Test
- public void testMode() {
- final int[] is = {4,4,5,5,5,6};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
- Assert.assertEquals(histo.getMode(), 5.0);
- }
-
- @Test(expectedExceptions = UnsupportedOperationException.class)
- public void testModeBlowup() {
- final String[] is = {"foo"};
- final Histogram<String> histo = new Histogram<>();
- for (final String i : is) histo.increment(i);
- histo.getMode();//blowup
- }
-
- @Test
- public void testComparator() {
- final int[] is = {4,4,5,5,5};
- final Histogram<Integer> histo1 = new Histogram<>();
- for (final int i : is) histo1.increment(i);
- Assert.assertNull(histo1.comparator());
-
- final Histogram<Integer> histo2 = new Histogram<>(Comparator.comparingInt(Integer::intValue));
- Comparator<Integer> comp = (Comparator<Integer>) histo2.comparator();
- Assert.assertNotNull(comp);
- Assert.assertEquals(comp.compare(4,5), -1);
- }
-
- @Test
- public void testEquals() {
- final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
- final Histogram<Integer> histo1 = new Histogram<>();
- final Histogram<Integer> histo2 = new Histogram<>();
- for (final int i : is) histo1.increment(i);
- for (final int i : is) histo2.increment(i);
- Assert.assertEquals(histo1, histo1);
- Assert.assertEquals(histo2, histo1);
- Assert.assertEquals(histo1, histo2);
-
- Assert.assertEquals(histo1.hashCode(), histo2.hashCode());
-
- Assert.assertNotEquals(null, histo1);
- Assert.assertNotEquals(histo1, null);
-
- histo2.increment(4);//make them not equal
- Assert.assertEquals(histo1, histo1);
- Assert.assertNotEquals(histo2, histo1);
- Assert.assertNotEquals(histo1, histo2);
- Assert.assertNotEquals(histo1.hashCode(), histo2.hashCode());
-
-
- }
-
- @Test(dataProvider = "medianTestData")
- public void testMedian(final int [] values, final double median) {
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : values) histo.increment(i);
- Assert.assertEquals(histo.getMedian(), median);
- }
-
- @DataProvider(name = "medianTestData")
- public Object[][] medianTestData() {
- return new Object[][] {
- new Object[] {new int[] {} , 0d},
- new Object[] {new int[] {999} , 999d},
- new Object[] {new int[] {1,2,3,4,5,6} , 3.5d},
- new Object[] {new int[] {5,5,5,5,5,6,6} , 5d},
- new Object[] {new int[] {5,5,5,5,5,6,6,6,6,6} , 5.5d},
- };
- }
-
- @Test
- public void testMad() {
- final int[] is = {4,4,4,4,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8};
- final Histogram<Integer> histo = new Histogram<>();
- for (final int i : is) histo.increment(i);
-
- Assert.assertEquals(7d, histo.getMedian());
- Assert.assertEquals(1d, histo.getMedianAbsoluteDeviation());
- Assert.assertTrue(abs(histo.estimateSdViaMad() - 1.4826) < 0.0001);
- }
-
-
- @Test(dataProvider = "histogramData") //this data provider has several extra variables that we don't make use of here
- public void testSerializeHistogram(final int[] values, final double mean, final double stdev, final Integer trimByWidth) throws IOException, ClassNotFoundException {
- final Histogram<Integer> histo = new Histogram<>();
- for (int value : values) {
- histo.increment(value);
- }
-
- Histogram<Integer> deserializedHistogram = TestUtil.serializeAndDeserialize(histo);
- Assert.assertEquals(deserializedHistogram, histo);
- }
-
- private double round(final double in) {
- long l = (long) (in * 10000);
- return l / 10000d;
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalListTest.java b/src/test/java/htsjdk/samtools/util/IntervalListTest.java
deleted file mode 100644
index 6c5fcd4..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalListTest.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Tests the IntervalList class
- */
-public class IntervalListTest {
-
- final SAMFileHeader fileHeader;
- final IntervalList list1, list2, list3;
-
- public IntervalListTest() {
- fileHeader = IntervalList.fromFile(new File("src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list")).getHeader();
- fileHeader.setSortOrder(SAMFileHeader.SortOrder.unsorted);
-
- list1 = new IntervalList(fileHeader);
- list2 = new IntervalList(fileHeader);
- list3 = new IntervalList(fileHeader);
-
- list1.add(new Interval("1", 1, 100)); //de-facto: 1:1-200 1:202-300 2:100-150 2:200-300
- list1.add(new Interval("1", 101, 200));
- list1.add(new Interval("1", 202, 300));
- list1.add(new Interval("2", 200, 300));
- list1.add(new Interval("2", 100, 150));
-
- list2.add(new Interval("1", 50, 150)); //de-facto 1:50-150 1:301-500 2:1-150 2:250-270 2:290-400
- list2.add(new Interval("1", 301, 500));
- list2.add(new Interval("2", 1, 150));
- list2.add(new Interval("2", 250, 270));
- list2.add(new Interval("2", 290, 400));
-
- list3.add(new Interval("1", 25, 400)); //de-facto 1:25-400 2:200-600 3:50-470
- list3.add(new Interval("2", 200, 600));
- list3.add(new Interval("3", 50, 470));
- }
-
- @DataProvider(name = "intersectData")
- public Object[][] intersectData() {
- final IntervalList intersect123 = new IntervalList(fileHeader);
- final IntervalList intersect12 = new IntervalList(fileHeader);
- final IntervalList intersect13 = new IntervalList(fileHeader);
- final IntervalList intersect23 = new IntervalList(fileHeader);
-
- intersect123.add(new Interval("1", 50, 150));
- intersect123.add(new Interval("2", 250, 270));
- intersect123.add(new Interval("2", 290, 300));
-
- intersect12.add(new Interval("1", 50, 150));
- intersect12.add(new Interval("2", 100, 150));
- intersect12.add(new Interval("2", 250, 270));
- intersect12.add(new Interval("2", 290, 300));
-
- intersect13.add(new Interval("1", 25, 200));
- intersect13.add(new Interval("1", 202, 300));
- intersect13.add(new Interval("2", 200, 300));
-
- intersect23.add(new Interval("1", 50, 150));
- intersect23.add(new Interval("1", 301, 400));
- intersect23.add(new Interval("2", 250, 270));
- intersect23.add(new Interval("2", 290, 400));
-
- return new Object[][]{
- new Object[]{Arrays.asList(list1, list2, list3), intersect123},
- new Object[]{Arrays.asList(list1, list2), intersect12},
- new Object[]{Arrays.asList(list2, list1), intersect12},
- new Object[]{Arrays.asList(list2, list3), intersect23},
- new Object[]{Arrays.asList(list3, list2), intersect23},
- new Object[]{Arrays.asList(list1, list3), intersect13},
- new Object[]{Arrays.asList(list3, list1), intersect13}
- };
- }
-
- @Test(dataProvider = "intersectData")
- public void testIntersectIntervalLists(final List<IntervalList> lists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.intersection(lists).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @DataProvider(name = "mergeData")
- public Object[][] mergeData() {
- final IntervalList merge123 = new IntervalList(fileHeader);
- final IntervalList merge12 = new IntervalList(fileHeader);
- final IntervalList merge23 = new IntervalList(fileHeader);
- final IntervalList merge13 = new IntervalList(fileHeader);
-
- merge123.add(new Interval("1", 1, 100)); //de-facto: 1:1-200 1:202-300 2:100-150 2:200-300
- merge123.add(new Interval("1", 101, 200));
- merge123.add(new Interval("1", 202, 300));
- merge123.add(new Interval("2", 200, 300));
- merge123.add(new Interval("2", 100, 150));
-
- merge123.add(new Interval("1", 50, 150)); //de-facto 1:50-150 1:301-500 2:1-150 2:250-270 2:290-400
- merge123.add(new Interval("1", 301, 500));
- merge123.add(new Interval("2", 1, 150));
- merge123.add(new Interval("2", 250, 270));
- merge123.add(new Interval("2", 290, 400));
-
- merge123.add(new Interval("1", 25, 400)); //de-facto 1:25-400 2:200-600 3:50-470
- merge123.add(new Interval("2", 200, 600));
- merge123.add(new Interval("3", 50, 470));
-
- merge12.add(new Interval("1", 1, 100)); //de-facto: 1:1-200 1:202-300 2:100-150 2:200-300
- merge12.add(new Interval("1", 101, 200));
- merge12.add(new Interval("1", 202, 300));
- merge12.add(new Interval("2", 200, 300));
- merge12.add(new Interval("2", 100, 150));
-
- merge12.add(new Interval("1", 50, 150)); //de-facto 1:50-150 1:301-500 2:1-150 2:250-270 2:290-400
- merge12.add(new Interval("1", 301, 500));
- merge12.add(new Interval("2", 1, 150));
- merge12.add(new Interval("2", 250, 270));
- merge12.add(new Interval("2", 290, 400));
-
- merge23.add(new Interval("1", 50, 150)); //de-facto 1:50-150 1:301-500 2:1-150 2:250-270 2:290-400
- merge23.add(new Interval("1", 301, 500));
- merge23.add(new Interval("2", 1, 150));
- merge23.add(new Interval("2", 250, 270));
- merge23.add(new Interval("2", 290, 400));
-
- merge23.add(new Interval("1", 25, 400)); //de-facto 1:25-400 2:200-600 3:50-470
- merge23.add(new Interval("2", 200, 600));
- merge23.add(new Interval("3", 50, 470));
-
- merge13.add(new Interval("1", 1, 100)); //de-facto: 1:1-200 1:202-300 2:100-150 2:200-300
- merge13.add(new Interval("1", 101, 200));
- merge13.add(new Interval("1", 202, 300));
- merge13.add(new Interval("2", 200, 300));
- merge13.add(new Interval("2", 100, 150));
-
- merge13.add(new Interval("1", 25, 400)); //de-facto 1:25-400 2:200-600 3:50-470
- merge13.add(new Interval("2", 200, 600));
- merge13.add(new Interval("3", 50, 470));
-
- return new Object[][]{
- new Object[]{Arrays.asList(list1, list2, list3), merge123},
- new Object[]{Arrays.asList(list1, list2), merge12},
- new Object[]{Arrays.asList(list2, list3), merge23},
- new Object[]{Arrays.asList(list1, list3), merge13}
- };
- }
-
- @Test(dataProvider = "mergeData")
- public void testMergeIntervalLists(final List<IntervalList> lists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.concatenate(lists).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @DataProvider(name = "unionData")
- public Object[][] unionData() {
- final IntervalList union123 = new IntervalList(fileHeader);
- final IntervalList union12 = new IntervalList(fileHeader);
- final IntervalList union13 = new IntervalList(fileHeader);
- final IntervalList union23 = new IntervalList(fileHeader);
-
- union123.add(new Interval("1", 1, 500));
- union123.add(new Interval("2", 1, 150));
- union123.add(new Interval("2", 200, 600));
- union123.add(new Interval("3", 50, 470));
-
- union12.add(new Interval("1", 1, 200));
- union12.add(new Interval("1", 202, 500));
- union12.add(new Interval("2", 1, 150));
- union12.add(new Interval("2", 200, 400));
-
- union23.add(new Interval("1", 25, 500));
- union23.add(new Interval("2", 1, 150));
- union23.add(new Interval("2", 200, 600));
- union23.add(new Interval("3", 50, 470));
-
- union13.add(new Interval("1", 1, 400));
- union13.add(new Interval("2", 100, 150));
- union13.add(new Interval("2", 200, 600));
- union13.add(new Interval("3", 50, 470));
-
- return new Object[][]{
- new Object[]{Arrays.asList(list1, list2, list3), union123},
- new Object[]{Arrays.asList(list1, list2), union12},
- new Object[]{Arrays.asList(list1, list2), union12},
- new Object[]{Arrays.asList(list2, list3), union23},
- new Object[]{Arrays.asList(list2, list3), union23},
- new Object[]{Arrays.asList(list1, list3), union13},
- new Object[]{Arrays.asList(list1, list3), union13}
- };
- }
-
- @Test(dataProvider = "unionData", enabled = true)
- public void testUnionIntervalLists(final List<IntervalList> lists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.union(lists).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @DataProvider(name = "invertData")
- public Object[][] invertData() {
- final IntervalList invert1 = new IntervalList(fileHeader);
- final IntervalList invert2 = new IntervalList(fileHeader);
- final IntervalList invert3 = new IntervalList(fileHeader);
-
- final IntervalList full = new IntervalList(fileHeader);
- final IntervalList fullChopped = new IntervalList(fileHeader);
- final IntervalList empty = new IntervalList(fileHeader);
-
- invert1.add(new Interval("1", 201, 201));
- invert1.add(new Interval("1", 301, fileHeader.getSequence("1").getSequenceLength()));
- invert1.add(new Interval("2", 1, 99));
- invert1.add(new Interval("2", 151, 199));
- invert1.add(new Interval("2", 301, fileHeader.getSequence("2").getSequenceLength()));
- invert1.add(new Interval("3", 1, fileHeader.getSequence("3").getSequenceLength()));
-
- invert2.add(new Interval("1", 1, 49));
- invert2.add(new Interval("1", 151, 300));
- invert2.add(new Interval("1", 501, fileHeader.getSequence("1").getSequenceLength()));
- invert2.add(new Interval("2", 151, 249));
- invert2.add(new Interval("2", 271, 289));
- invert2.add(new Interval("2", 401, fileHeader.getSequence("2").getSequenceLength()));
- invert2.add(new Interval("3", 1, fileHeader.getSequence("3").getSequenceLength()));
-
- invert3.add(new Interval("1", 1, 24));
- invert3.add(new Interval("1", 401, fileHeader.getSequence("1").getSequenceLength()));
- invert3.add(new Interval("2", 1, 199));
- invert3.add(new Interval("2", 601, fileHeader.getSequence("2").getSequenceLength()));
- invert3.add(new Interval("3", 1, 49));
- invert3.add(new Interval("3", 471, fileHeader.getSequence("3").getSequenceLength()));
-
- for (final SAMSequenceRecord samSequenceRecord : fileHeader.getSequenceDictionary().getSequences()) {
- full.add(new Interval(samSequenceRecord.getSequenceName(), 1, samSequenceRecord.getSequenceLength()));
-
- fullChopped.add(new Interval(samSequenceRecord.getSequenceName(), 1, samSequenceRecord.getSequenceLength() / 2));
- fullChopped.add(new Interval(samSequenceRecord.getSequenceName(), samSequenceRecord.getSequenceLength() / 2 + 1, samSequenceRecord.getSequenceLength()));
- }
-
- return new Object[][]{
- new Object[]{list1, invert1},
- new Object[]{list2, invert2},
- new Object[]{list3, invert3},
- new Object[]{full, empty},
- new Object[]{empty, full},
- new Object[]{fullChopped, empty}
- };
- }
-
- @Test(dataProvider = "invertData")
- public void testInvertSquared(final IntervalList list, @SuppressWarnings("UnusedParameters") final IntervalList ignored) throws Exception {
- final IntervalList inverseSquared = IntervalList.invert(IntervalList.invert(list));
- final IntervalList originalClone = new IntervalList(list.getHeader());
-
- for (final Interval interval : list) {
- originalClone.add(interval);
- }
-
- Assert.assertEquals(
- CollectionUtil.makeCollection(inverseSquared.iterator()),
- CollectionUtil.makeCollection(originalClone.uniqued().iterator()));
- }
-
- @Test(dataProvider = "invertData")
- public void testInvert(final IntervalList list, final IntervalList inverse) throws Exception {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.invert(list).iterator()),
- CollectionUtil.makeCollection(inverse.iterator()));
- }
-
- @DataProvider(name = "subtractSingletonData")
- public Object[][] subtractSingletonData() {
- final IntervalList subtract1_from_2 = new IntervalList(fileHeader);
- final IntervalList subtract2_from_3 = new IntervalList(fileHeader);
- final IntervalList subtract1_from_3 = new IntervalList(fileHeader);
- final IntervalList subtract3_from_1 = new IntervalList(fileHeader);
-
- subtract1_from_2.add(new Interval("1", 301, 500));
- subtract1_from_2.add(new Interval("2", 1, 99));
- subtract1_from_2.add(new Interval("2", 301, 400));
-
- subtract2_from_3.add(new Interval("1", 25, 49));
- subtract2_from_3.add(new Interval("1", 151, 300));
- subtract2_from_3.add(new Interval("2", 200, 249));
- subtract2_from_3.add(new Interval("2", 271, 289));
- subtract2_from_3.add(new Interval("2", 401, 600));
- subtract2_from_3.add(new Interval("3", 50, 470));
-
- subtract1_from_3.add(new Interval("1", 201, 201));
- subtract1_from_3.add(new Interval("1", 301, 400));
- subtract1_from_3.add(new Interval("2", 301, 600));
- subtract1_from_3.add(new Interval("3", 50, 470));
-
- subtract3_from_1.add(new Interval("1", 1, 49)); //de-facto 1:25-400 2:200-600 3:50-470
- subtract3_from_1.add(new Interval("2", 100, 150));
-
- return new Object[][]{
- new Object[]{list2, list1, subtract1_from_2},
- new Object[]{list3, list2, subtract2_from_3},
- new Object[]{list3, list1, subtract1_from_3},
- };
- }
-
- @DataProvider(name = "subtractData")
- public Object[][] subtractData() {
- final IntervalList subtract12_from_3 = new IntervalList(fileHeader);
-
- subtract12_from_3.add(new Interval("1", 201, 201));
- subtract12_from_3.add(new Interval("2", 401, 600));
- subtract12_from_3.add(new Interval("3", 50, 470));
-
- return new Object[][]{
- new Object[]{CollectionUtil.makeList(list3), CollectionUtil.makeList(list1, list2), subtract12_from_3},
- };
- }
-
- @Test(dataProvider = "subtractData")
- public void testSubtractIntervalLists(final List<IntervalList> fromLists, final List<IntervalList> whatLists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.subtract(fromLists, whatLists).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @Test(dataProvider = "subtractSingletonData")
- public void testSubtractSingletonIntervalLists(final IntervalList fromLists, final IntervalList whatLists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.subtract(fromLists, whatLists).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @Test(dataProvider = "subtractSingletonData")
- public void testSubtractSingletonasListIntervalList(final IntervalList fromLists, final IntervalList whatLists, final IntervalList list) {
- Assert.assertEquals(
- CollectionUtil.makeCollection(IntervalList.subtract(Collections.singletonList(fromLists), Collections.singletonList(whatLists)).iterator()),
- CollectionUtil.makeCollection(list.iterator()));
- }
-
- @DataProvider(name = "VCFCompData")
- public Object[][] VCFCompData() {
- return new Object[][]{
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", false},
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list", true},
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list", false},
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf", "src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list", true}
- };
- }
-
- @Test(dataProvider = "VCFCompData")
- public void testFromVCF(final String vcf, final String compInterval, final boolean invertVCF) {
-
- final File vcfFile = new File(vcf);
- final File compIntervalFile = new File(compInterval);
-
- final IntervalList compList = IntervalList.fromFile(compIntervalFile);
- final IntervalList list = invertVCF ? IntervalList.invert(VCFFileReader.fromVcf(vcfFile)) : VCFFileReader.fromVcf(vcfFile);
-
- compList.getHeader().getSequenceDictionary().assertSameDictionary(list.getHeader().getSequenceDictionary());
-
- final Collection<Interval> intervals = CollectionUtil.makeCollection(list.iterator());
- final Collection<Interval> compIntervals = CollectionUtil.makeCollection(compList.iterator());
-
- //assert that the intervals correspond
- Assert.assertEquals(intervals, compIntervals);
-
- final List<String> intervalNames = new LinkedList<String>();
- final List<String> compIntervalNames = new LinkedList<String>();
-
- for (final Interval interval : intervals) {
- intervalNames.add(interval.getName());
- }
- for (final Interval interval : compIntervals) {
- compIntervalNames.add(interval.getName());
- }
- //assert that the names match
- Assert.assertEquals(intervalNames, compIntervalNames);
- }
-
- @DataProvider
- public Object[][] testFromSequenceData() {
- return new Object[][]{
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "1", 249250621},
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "2", 243199373},
- new Object[]{"src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list", "3", 198022430},
- };
- }
-
- @Test(dataProvider = "testFromSequenceData")
- public void testFromSequenceName(final String intervalList, final String referenceName, final Integer length) {
-
- final IntervalList intervals = IntervalList.fromFile(new File(intervalList));
- final IntervalList test = IntervalList.fromName(intervals.getHeader(), referenceName);
- Assert.assertEquals(test.getIntervals(), CollectionUtil.makeList(new Interval(referenceName, 1, length)));
- }
-
- @Test
- public void testMerges() {
- final SortedSet<Interval> intervals = new TreeSet<Interval>() {{
- add(new Interval("1", 500, 600, false, "foo"));
- add(new Interval("1", 550, 650, false, "bar"));
- add(new Interval("1", 625, 699, false, "splat"));
- }};
-
- Interval out = IntervalList.merge(intervals, false);
- Assert.assertEquals(out.getStart(), 500);
- Assert.assertEquals(out.getEnd(), 699);
-
- intervals.add(new Interval("1", 626, 629, false, "whee"));
- out = IntervalList.merge(intervals, false);
- Assert.assertEquals(out.getStart(), 500);
- Assert.assertEquals(out.getEnd(), 699);
- }
-
- @Test
- public void testBreakAtBands() {
- final List<Interval> intervals = new ArrayList<Interval>() {{
- add(new Interval("A", 1, 99, false, "foo"));
- add(new Interval("A", 98, 99, true, "psyduck"));
- add(new Interval("1", 500, 600, false, "foo")); // -> 2
- add(new Interval("1", 550, 650, false, "bar")); // -> 2
- add(new Interval("1", 625, 699, false, "splat"));
- add(new Interval("2", 99, 201, false, "geodude")); // -> 3
- add(new Interval("3", 100, 99, false, "charizard")); // Empty Interval
- add(new Interval("3", 101, 100, false, "golduck")); // Empty Interval
- }};
-
- final List<Interval> brokenIntervals = IntervalList.breakIntervalsAtBandMultiples(intervals, 100);
-
- Assert.assertEquals(brokenIntervals.size(), 12);
- Assert.assertEquals(brokenIntervals.get(0), new Interval("A", 1, 99, false, "foo"));
-
- Assert.assertEquals(brokenIntervals.get(1), new Interval("A", 98, 99, true, "psyduck"));
-
- Assert.assertEquals(brokenIntervals.get(2), new Interval("1", 500, 599, false, "foo.1"));
- Assert.assertEquals(brokenIntervals.get(3), new Interval("1", 600, 600, false, "foo.2"));
-
- Assert.assertEquals(brokenIntervals.get(4), new Interval("1", 550, 599, false, "bar.1"));
- Assert.assertEquals(brokenIntervals.get(5), new Interval("1", 600, 650, false, "bar.2"));
-
- Assert.assertEquals(brokenIntervals.get(6), new Interval("1", 625, 699, false, "splat"));
-
- Assert.assertEquals(brokenIntervals.get(7), new Interval("2", 99, 99, false, "geodude.1"));
- Assert.assertEquals(brokenIntervals.get(8), new Interval("2", 100, 199, false, "geodude.2"));
- Assert.assertEquals(brokenIntervals.get(9), new Interval("2", 200, 201, false, "geodude.3"));
-
- Assert.assertEquals(brokenIntervals.get(10), new Interval("3", 100, 99, false, "charizard"));
- Assert.assertEquals(brokenIntervals.get(11), new Interval("3", 101, 100, false, "golduck"));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void TestFailAdd() {
- IntervalList test = new IntervalList(this.fileHeader);
- test.add(new Interval("blarg", 1, 1));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void TestFailAddAll() {
- IntervalList test = new IntervalList(this.fileHeader);
- test.addall(CollectionUtil.makeList(new Interval("blarg", 1, 1), new Interval("bloorg", 1, 1)));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void changeHeader() {
- SAMFileHeader clonedHeader = fileHeader.clone();
- clonedHeader.addSequence(new SAMSequenceRecord("4", 1000));
- IntervalList usingClone1 = new IntervalList(clonedHeader);
- usingClone1.add(new Interval("4", 1, 100));
- IntervalList usingClone2 = new IntervalList(clonedHeader);
- usingClone2.add(new Interval("4", 10, 20));
-
-
- IntervalList expected = new IntervalList(clonedHeader);
- expected.add(new Interval("4", 1, 9));
- expected.add(new Interval("4", 21, 100));
-
- //pull rug from underneath (one call will change all the headers, since there's actually only one)
- usingClone1.getHeader().setSequenceDictionary(fileHeader.getSequenceDictionary());
-
- //now interval lists are in "illegal state" since they contain contigs that are not in the header.
- //this next step should fail
- IntervalList.subtract(usingClone1, usingClone2);
-
- Assert.assertTrue(false);
-
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java b/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java
deleted file mode 100644
index 2e725ff..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalTreeMapTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Iterator;
-
-public class IntervalTreeMapTest {
- @Test
- public void testBasic() {
- IntervalTreeMap<Interval> m=new IntervalTreeMap<Interval>();
-
- Interval chr1Interval = new Interval("chr1", 10,100);
- m.put(chr1Interval, chr1Interval);
- Interval chr2Interval = new Interval("chr2", 1,200);
- m.put(chr2Interval, chr2Interval);
-
-
- Assert.assertTrue(m.containsContained(new Interval("chr1", 9,101)));
- Assert.assertTrue(m.containsOverlapping(new Interval("chr1", 50,150)));
- Assert.assertFalse(m.containsOverlapping(new Interval("chr3", 1,100)));
- Assert.assertFalse(m.containsOverlapping(new Interval("chr1", 101,150)));
- Assert.assertFalse(m.containsContained(new Interval("chr1", 11,101)));
- Assert.assertFalse(m.isEmpty());
- Assert.assertTrue(m.size()==2);
-
- final Iterator<Interval> iterator = m.keySet().iterator();
- Assert.assertEquals(iterator.next(), chr1Interval);
- Assert.assertEquals(iterator.next(), chr2Interval);
- Assert.assertFalse(iterator.hasNext());
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java b/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java
deleted file mode 100644
index 50d84c0..0000000
--- a/src/test/java/htsjdk/samtools/util/IntervalTreeTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Iterator;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class IntervalTreeTest {
- @Test
- public void testNoMatches()
- {
- // Test empty tree
- final IntervalTree<String> intervalTree = new IntervalTree<String>();
- Iterator<IntervalTree.Node<String>> results = intervalTree.overlappers(1, 500);
- Assert.assertEquals(countElements(results), 0, "Testing with no left-hand set failed.");
-
- // Test no matches at all
- intervalTree.put(1, 400, "foo");
- intervalTree.put(600, 800, "foo2");
- results = intervalTree.overlappers(450, 599);
- Assert.assertEquals(countElements(results), 0, "Testing with no overlaps at all.");
-
- }
-
- private int countElements(final Iterator<IntervalTree.Node<String>> it) {
- int ret = 0;
- while (it.hasNext()) {
- ++ret;
- it.next();
- }
- return ret;
- }
-
- @Test
- public void testMatches()
- {
- final IntervalTree<String> intervalTree = new IntervalTree<String>();
- intervalTree.put(1, 10, "foo1");
- intervalTree.put(2, 9, "foo2");
- intervalTree.put(3, 8, "foo3");
- intervalTree.put(4, 7, "foo4");
- intervalTree.put(5, 6, "foo5");
- intervalTree.put(1, 9, "foo6");
-
- // Single match
- Assert.assertEquals(countElements(intervalTree.overlappers(10, 10)), 1, "Test single overlap");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(10, 10), "foo1"), "Test single overlap for correct overlapee");
-
- // Multiple matches
- Assert.assertEquals(countElements(intervalTree.overlappers(7, 8)), 5, "Test multiple overlap");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo1"), "Test multiple overlap for correct overlapees");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo2"), "Test multiple overlap for correct overlapees");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo3"), "Test multiple overlap for correct overlapees");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo4"), "Test multiple overlap for correct overlapees");
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(7, 8), "foo6"), "Test multiple overlap for correct overlapees");
- Assert.assertTrue(!iteratorContains(intervalTree.overlappers(7, 8), "foo5"), "Test multiple overlap for correct overlapees");
- }
-
- private boolean iteratorContains(final Iterator<IntervalTree.Node<String>> nodeIterator, final String s) {
- while (nodeIterator.hasNext()) {
- if (nodeIterator.next().getValue().equals(s)) {
- return true;
- }
- }
- return false;
- }
-
- @Test
- public void testNearEnds()
- {
- final IntervalTree<String> intervalTree = new IntervalTree<String>();
- intervalTree.put(10, 20, "foo");
- Assert.assertEquals(countElements(intervalTree.overlappers(10, 10)), 1, "Test overlap (no buffers) at near end exactly");
- Assert.assertEquals(countElements(intervalTree.overlappers(9, 10)), 1, "Test overlap (no buffers) at near end exactly");
- Assert.assertEquals(countElements(intervalTree.overlappers(9, 9)), 0, "Test just before overlap (no buffers)");
- Assert.assertEquals(countElements(intervalTree.overlappers(20, 20)), 1, "Test overlap (no buffers) at far end exactly");
- Assert.assertEquals(countElements(intervalTree.overlappers(20, 21)), 1, "Test overlap (no buffers) at far end exactly");
- Assert.assertEquals(countElements(intervalTree.overlappers(21, 21)), 0, "Test just beyond overlap (no buffers)");
- }
-
- @Test
- public void performanceTest()
- {
- final IntervalTree<String> intervalTree = new IntervalTree<String>();
- final long start = System.currentTimeMillis();
- for (int i = 1; i <= 50000; i++) intervalTree.put(i, i, "frob");
- System.out.println("Time to construct a tree with 50000 nodes: " + (System.currentTimeMillis() - start) + " milliseconds" );
-
- final long end = System.currentTimeMillis() + 10000;
- int count = 0;
- while (System.currentTimeMillis() < end) {
- intervalTree.overlappers(17000, 17099);
- ++count;
- }
- System.out.println("Queried for the same 100-length mapping " + count + " times in 10 seconds.");
- }
-
- @Test
- public void testHandlingOfDuplicateMappings()
- {
- final IntervalTree<String> intervalTree = new IntervalTree<String>();
- intervalTree.put(1, 10, "foo1");
- // This call replaces foo1 with foo2
- Assert.assertEquals(intervalTree.put(1, 10, "foo2"), "foo1");
- intervalTree.put(2, 8, "foo3");
-
- Assert.assertEquals(countElements(intervalTree.overlappers(3, 5)), 2);
- Assert.assertFalse(iteratorContains(intervalTree.overlappers(3, 5), "foo1"));
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(3, 5), "foo2"));
- Assert.assertTrue(iteratorContains(intervalTree.overlappers(3, 5), "foo3"));
- }
-
- /**
- * Test of PIC-123
- */
- @Test
- public void testRemove() {
- int[][] adds = {
- {46129744, 46129978},
- {46393843, 46394077},
- {46260491, 46260725},
- {46402360, 46402594},
- {46369255, 46369464},
- {46293772, 46293981},
- {46357687, 46357896},
- {46431752, 46431961},
- {46429997, 46430206},
- {46404026, 46404192},
- {46390511, 46390677},
- {46090593, 46090759},
- {46045352, 46045518},
- {46297633, 46297799},
- {46124297, 46124463},
- {46395291, 46395504},
- {46439072, 46439240},
- {46400792, 46400959},
- {46178616, 46178851},
- {46129747, 46129982},
- {46396546, 46396781},
- {46112353, 46112588},
- {46432996, 46433231},
- {46399109, 46399344},
- {46372058, 46372292},
- {46386826, 46387060},
- {46381795, 46382029},
- {46179789, 46180023},
- {46394409, 46394643},
- {46376176, 46376429},
- {46389943, 46390177},
- {46433654, 46433888},
- {46379440, 46379674},
- {46391117, 46391351},
- };
- IntervalTree<String> intervalTree = new IntervalTree<String>();
- for (int[] add : adds) {
- intervalTree.put(add[0], add[1], "frob");
- }
- Assert.assertEquals(intervalTree.remove(46402360, 46402594), "frob");
- intervalTree.checkMaxEnds();
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IoUtilTest.java b/src/test/java/htsjdk/samtools/util/IoUtilTest.java
deleted file mode 100644
index 0e4cd7a..0000000
--- a/src/test/java/htsjdk/samtools/util/IoUtilTest.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.List;
-
-public class IoUtilTest {
-
- private static final File SLURP_TEST_FILE = new File("src/test/resources/htsjdk/samtools/io/slurptest.txt");
- private static final File EMPTY_FILE = new File("src/test/resources/htsjdk/samtools/io/empty.txt");
- private static final File FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE = new File("src/test/resources/htsjdk/samtools/io/5newline5.txt");
- private static final List<String> SLURP_TEST_LINES = Arrays.asList("bacon and rice ", "for breakfast ", "wont you join me");
- private static final String SLURP_TEST_LINE_SEPARATOR = "\n";
- private static final String TEST_FILE_PREFIX = "htsjdk-IOUtilTest";
- private static final String TEST_FILE_EXTENSIONS[] = {".txt", ".txt.gz"};
- private static final String TEST_STRING = "bar!";
- private File existingTempFile;
- private String systemTempDir;
-
- @BeforeClass
- public void setUp() throws IOException {
- existingTempFile = File.createTempFile("FiletypeTest.", ".tmp");
- existingTempFile.deleteOnExit();
- systemTempDir = System.getProperty("java.io.tmpdir");
- final File tmpDir = new File(systemTempDir);
- if (!tmpDir.isDirectory()) tmpDir.mkdir();
- if (!tmpDir.isDirectory())
- throw new RuntimeException("java.io.tmpdir (" + systemTempDir + ") is not a directory");
- }
-
- @Test
- public void testFileReadingAndWriting() throws IOException {
- String randomizedTestString = TEST_STRING + System.currentTimeMillis();
- for (String ext : TEST_FILE_EXTENSIONS) {
- File f = File.createTempFile(TEST_FILE_PREFIX, ext);
- f.deleteOnExit();
-
- OutputStream os = IOUtil.openFileForWriting(f);
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
- writer.write(randomizedTestString);
- writer.close();
-
- InputStream is = IOUtil.openFileForReading(f);
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- String line = reader.readLine();
- Assert.assertEquals(randomizedTestString, line);
- }
- }
-
- @Test(groups = {"unix"})
- public void testGetCanonicalPath() throws IOException {
- String tmpPath = System.getProperty("java.io.tmpdir");
- String userName = System.getProperty("user.name");
-
- if (tmpPath.endsWith(userName)) {
- tmpPath = tmpPath.substring(0, tmpPath.length() - userName.length());
- }
-
- File tmpDir = new File(tmpPath, userName);
- tmpDir.mkdir();
- File actual = new File(tmpDir, "actual.txt");
- ProcessExecutor.execute(new String[]{"touch", actual.getAbsolutePath()});
- File symlink = new File(tmpDir, "symlink.txt");
- ProcessExecutor.execute(new String[]{"ln", "-s", actual.getAbsolutePath(), symlink.getAbsolutePath()});
- File lnDir = new File(tmpDir, "symLinkDir");
- ProcessExecutor.execute(new String[]{"ln", "-s", tmpDir.getAbsolutePath(), lnDir.getAbsolutePath()});
- File lnToActual = new File(lnDir, "actual.txt");
- File lnToSymlink = new File(lnDir, "symlink.txt");
-
-
- File files[] = {actual, symlink, lnToActual, lnToSymlink};
- for (File f : files) {
- Assert.assertEquals(IOUtil.getFullCanonicalPath(f), actual.getCanonicalPath());
- }
-
- actual.delete();
- symlink.delete();
- lnToActual.delete();
- lnToSymlink.delete();
- lnDir.delete();
- tmpDir.delete();
- }
-
- @Test
- public void testUtfWriting() throws IOException {
- final String utf8 = new StringWriter().append((char) 168).append((char) 197).toString();
- for (String ext : TEST_FILE_EXTENSIONS) {
- final File f = File.createTempFile(TEST_FILE_PREFIX, ext);
- f.deleteOnExit();
-
- final BufferedWriter writer = IOUtil.openFileForBufferedUtf8Writing(f);
- writer.write(utf8);
- CloserUtil.close(writer);
-
- final BufferedReader reader = IOUtil.openFileForBufferedUtf8Reading(f);
- final String line = reader.readLine();
- Assert.assertEquals(utf8, line, f.getAbsolutePath());
-
- CloserUtil.close(reader);
-
- }
- }
-
- @Test
- public void slurpLinesTest() throws FileNotFoundException {
- Assert.assertEquals(IOUtil.slurpLines(SLURP_TEST_FILE), SLURP_TEST_LINES);
- }
-
- @Test
- public void slurpWhitespaceOnlyFileTest() throws FileNotFoundException {
- Assert.assertEquals(IOUtil.slurp(FIVE_SPACES_THEN_A_NEWLINE_THEN_FIVE_SPACES_FILE), " \n ");
- }
-
- @Test
- public void slurpEmptyFileTest() throws FileNotFoundException {
- Assert.assertEquals(IOUtil.slurp(EMPTY_FILE), "");
- }
-
- @Test
- public void slurpTest() throws FileNotFoundException {
- Assert.assertEquals(IOUtil.slurp(SLURP_TEST_FILE), CollectionUtil.join(SLURP_TEST_LINES, SLURP_TEST_LINE_SEPARATOR));
- }
-
- @Test(dataProvider = "fileTypeTestCases")
- public void testFileType(final String path, boolean expectedIsRegularFile) {
- final File file = new File(path);
- Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile);
- }
-
- @Test(dataProvider = "unixFileTypeTestCases", groups = {"unix"})
- public void testFileTypeUnix(final String path, boolean expectedIsRegularFile) {
- final File file = new File(path);
- Assert.assertEquals(IOUtil.isRegularPath(file), expectedIsRegularFile);
- }
-
- @DataProvider(name = "fileTypeTestCases")
- private Object[][] fileTypeTestCases() {
- return new Object[][]{
- {existingTempFile.getAbsolutePath(), Boolean.TRUE},
- {systemTempDir, Boolean.FALSE}
-
- };
- }
-
- @DataProvider(name = "unixFileTypeTestCases")
- private Object[][] unixFileTypeTestCases() {
- return new Object[][]{
- {"/dev/null", Boolean.FALSE},
- {"/dev/stdout", Boolean.FALSE},
- {"/non/existent/file", Boolean.TRUE},
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java b/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java
deleted file mode 100644
index ce0ae08..0000000
--- a/src/test/java/htsjdk/samtools/util/Iso8601DateTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class Iso8601DateTest {
- @Test
- public void testBasic() {
- final String dateStr = "2008-12-15";
- Iso8601Date first = new Iso8601Date(dateStr);
- String firstFormatted = first.toString();
- Iso8601Date second = new Iso8601Date(firstFormatted);
- Assert.assertEquals(first, second);
- String secondFormatted = second.toString();
- Assert.assertEquals(firstFormatted, secondFormatted);
- }
-
- @Test
- public void testMillisecondTruncation() {
- // Create a Date with milliseconds
- final Date now = new Date();
- if (now.getTime() % 1000 == 0) {
- now.setTime(now.getTime() + 3);
- }
- Iso8601Date isoDate = new Iso8601Date(now);
- Assert.assertEquals(isoDate.getTime() % 1000, 0);
- Assert.assertEquals(isoDate.getTime() / 1000, now.getTime() / 1000);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/IupacTest.java b/src/test/java/htsjdk/samtools/util/IupacTest.java
deleted file mode 100644
index 64b78c0..0000000
--- a/src/test/java/htsjdk/samtools/util/IupacTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2011 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.BamFileIoUtils;
-import htsjdk.samtools.SAMFileHeader;
-import htsjdk.samtools.SAMFileWriter;
-import htsjdk.samtools.SAMFileWriterFactory;
-import htsjdk.samtools.SAMRecord;
-import htsjdk.samtools.SAMRecordIterator;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-
-public class IupacTest {
- @Test(dataProvider = "basicDataProvider")
- public void basic(final String tempFileExtension) throws Exception {
- final File outputFile = File.createTempFile("iupacTest.", tempFileExtension);
- outputFile.deleteOnExit();
- final SAMFileWriter writer = new SAMFileWriterFactory().makeSAMOrBAMWriter(new SAMFileHeader(), false, outputFile);
- final String bases1 = "=ACMGRSVTWYHKDBNA";
- final String bases2 = "A=ACMGRSVTWYHKDBN"; // Test both high-order and low-order base encoding.
- final byte[] quals = new byte[bases1.length()];
- Arrays.fill(quals, (byte) 20);
- final String[] reads = {bases1, bases1.toLowerCase(), bases2, bases2.toLowerCase()};
- for (int i = 0; i < reads.length; ++i) {
- final SAMRecord rec = new SAMRecord(writer.getFileHeader());
- rec.setReadName("read" + i);
- rec.setReadUnmappedFlag(true);
- rec.setReadString(reads[i]);
- rec.setBaseQualities(quals);
- writer.addAlignment(rec);
- }
- writer.close();
- final SamReader reader = SamReaderFactory.makeDefault().open(outputFile);
- final SAMRecordIterator it = reader.iterator();
- for (int i = 0; i < reads.length; ++i) {
- final SAMRecord rec = it.next();
- Assert.assertEquals(rec.getReadString(), reads[i].toUpperCase());
- }
- reader.close();
- }
-
- @DataProvider(name = "basicDataProvider")
- public Object[][] basicDataProvider() {
- return new Object[][]{
- {BamFileIoUtils.BAM_FILE_EXTENSION},
- {".sam"}
- };
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java b/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java
deleted file mode 100644
index d36bb6d..0000000
--- a/src/test/java/htsjdk/samtools/util/MergingIteratorTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2012 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Queue;
-
-public class MergingIteratorTest {
-
- private static class QueueBackedIterator<T> implements CloseableIterator<T> {
-
- private final Iterator<T> backing;
- QueueBackedIterator(final Queue<T> queue) {
- this.backing = queue.iterator();
- }
-
- @Override
- public void close() {
- // no-op
- }
-
- @Override
- public boolean hasNext() {
- return backing.hasNext();
- }
-
- @Override
- public T next() {
- return backing.next();
- }
-
- @Override
- public void remove() {
- backing.remove();
- }
- }
-
- private static final Comparator<Integer> INTEGER_COMPARATOR = new Comparator<Integer>() {
- @Override
- public int compare(Integer integer, Integer integer2) {
- return integer - integer2;
- }
- };
-
- @Test
- public void testOrderingAndCompleteness() {
- final Queue<Integer> queueOne = new LinkedList<Integer>();
- queueOne.add(1);
- queueOne.add(3);
- queueOne.add(5);
-
- final Queue<Integer> queueTwo = new LinkedList<Integer>();
- queueTwo.add(2);
- queueTwo.add(4);
- queueTwo.add(6);
-
- final Queue<Integer> queueThree = new LinkedList<Integer>();
- queueThree.add(0);
- queueThree.add(1);
-
- final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
- Collections.addAll(
- iterators,
- new QueueBackedIterator<Integer>(queueOne),
- new QueueBackedIterator<Integer>(queueTwo),
- new QueueBackedIterator<Integer>(queueThree));
-
- final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
- INTEGER_COMPARATOR,
- iterators);
-
- int count = 0;
- int last = -1;
- while (mergingIterator.hasNext()) {
- final Integer integer = mergingIterator.next();
- count++;
- if (integer == 1) Assert.assertTrue(integer >= last);
- else Assert.assertTrue(integer > last);
- last = integer;
- }
-
- Assert.assertEquals(queueOne.size() + queueTwo.size() + queueThree.size(), count);
- }
-
- @Test
- public void testIteratorsOfUnevenLength() {
- final Queue<Integer> queueOne = new LinkedList<Integer>();
- queueOne.add(1);
- queueOne.add(3);
- queueOne.add(5);
- queueOne.add(7);
- queueOne.add(9);
- queueOne.add(11);
- queueOne.add(13);
-
- final Queue<Integer> queueTwo = new LinkedList<Integer>();
- queueTwo.add(2);
-
- final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
- Collections.addAll(
- iterators,
- new QueueBackedIterator<Integer>(queueOne),
- new QueueBackedIterator<Integer>(queueTwo));
-
- final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
- INTEGER_COMPARATOR,
- iterators);
-
- int count = 0;
- int last = -1;
- while (mergingIterator.hasNext()) {
- final Integer integer = mergingIterator.next();
- count++;
- Assert.assertTrue(integer > last);
- last = integer;
- }
-
- Assert.assertEquals(queueOne.size() + queueTwo.size(), count);
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testOutOfOrderIterators() {
- final Queue<Integer> queueOne = new LinkedList<Integer>();
- queueOne.add(1);
- queueOne.add(3);
-
- final Queue<Integer> queueTwo = new LinkedList<Integer>();
- queueTwo.add(4);
- queueTwo.add(2);
-
- final Collection<CloseableIterator<Integer>> iterators = new ArrayList<CloseableIterator<Integer>>(3);
- Collections.addAll(
- iterators,
- new QueueBackedIterator<Integer>(queueOne),
- new QueueBackedIterator<Integer>(queueTwo));
-
- final MergingIterator<Integer> mergingIterator = new MergingIterator<Integer>(
- INTEGER_COMPARATOR,
- iterators);
-
- Assert.assertEquals(mergingIterator.next().intValue(), 1);
- Assert.assertEquals(mergingIterator.next().intValue(), 3);
- Assert.assertEquals(mergingIterator.next().intValue(), 4);
- mergingIterator.next(); // fails, because the next element would be "2"
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java b/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java
deleted file mode 100644
index ecde965..0000000
--- a/src/test/java/htsjdk/samtools/util/OverlapDetectorTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.*;
-
-public class OverlapDetectorTest {
-
- @DataProvider(name="intervalsMultipleContigs")
- public Object[][] intervalsMultipleContigs(){
- final List<Locatable> input = Arrays.asList(
- new Interval("1", 10, 100),
- new Interval("2", 200, 300)
- );
- final List<Locatable> empty = new ArrayList<>();
- final List<Locatable> contig1 = Arrays.asList(
- new Interval("1", 10, 100)
- );
- final List<Locatable> contig2 = Arrays.asList(
- new Interval("2", 200, 300)
- );
-
- // returns input, query range, expected SimpleIntervals
- return new Object[][] {
- // we already test elsewhere that it works within a contig, so here we just have to make sure that
- // it picks the correct contig and can deal with not-yet-mentioned contigs.
- new Object[] {input, new Interval("1", 100, 200), contig1},
- new Object[] {input, new Interval("1", 1, 5), empty},
- new Object[] {input, new Interval("2", 100, 200), contig2},
- new Object[] {input, new Interval("3", 100, 200), empty},
- };
- }
-
- @Test(dataProvider = "intervalsMultipleContigs")
- public void testOverlap(final List<Locatable> input, final Locatable query, final Collection<Locatable> expected) throws Exception {
- final OverlapDetector<Locatable> targetDetector = new OverlapDetector<>(0, 0);
- targetDetector.addAll(input, input);
-
- final Collection<Locatable> actual = targetDetector.getOverlaps(query);
- Assert.assertEquals(actual, expected);
- }
-
- @DataProvider(name="intervalsSameContig")
- public Object[][] intervalsSameContig(){
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final List<Locatable> empty = new ArrayList<>();
- final List<Locatable> manyOverlapping = Arrays.asList(
- new Interval("1",10,100),
- // special case: multiple intervals starting at the same place
- new Interval("1",20,50),
- new Interval("1",20,51),
- new Interval("1",20,52)
- );
- final List<Locatable> mixInput = Arrays.asList(
- // ends before query interval
- new Interval("1",10,20),
- // ends in query interval
- new Interval("1",10,60),
- // equal to query interval
- new Interval("1",30,50),
- // covered by query interval
- new Interval("1",40,42),
- // ends after query interval
- new Interval("1",45,60),
- // starts after query interval
- new Interval("1",60,100)
- );
- final List<Locatable> mixExpected = Arrays.asList(
- // ends in query interval
- new Interval("1",10,60),
- // equal to query interval
- new Interval("1",30,50),
- // covered by query interval
- new Interval("1",40,42),
- // ends after query interval
- new Interval("1",45,60)
- );
- // returns input single SimpleInterval, query range, expected SimpleInterval
- return new Object[][] {
- // single-point boundary cases
- new Object[] {input, new Interval("1", 10, 10), input},
- new Object[] {input, new Interval("1", 100, 100), input},
- new Object[] {input, new Interval("1", 9, 9), empty},
- new Object[] {input, new Interval("1", 11, 11), input},
- new Object[] {input, new Interval("1", 99, 99), input},
- new Object[] {input, new Interval("1", 101, 101), empty},
- // different contig
- new Object[] {input, new Interval("2", 10, 100), empty},
- // empty list boundary case
- new Object[] {empty, new Interval("1", 101, 101), empty},
- // input exactly matches the query interval
- new Object[] {input, new Interval("1", 10, 100), input},
- // multiple intervals in the same place (potential edge case for indexing)
- new Object[] {manyOverlapping, new Interval("1", 20, 20), manyOverlapping},
- // input with multiple intervals
- new Object[] {mixInput, new Interval("1",30,50), mixExpected},
- // input with multiple intervals , non overlapping query
- new Object[] {mixInput, new Interval("1",300,500), empty},
- };
- }
-
- @Test(dataProvider = "intervalsSameContig")
- public void testOverlap(final List<Locatable> input, final Interval query, final List<Locatable> expected) throws Exception {
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-
- final Set<Locatable> actual = targetDetector.getOverlaps(query);
- Assert.assertEquals(actual, new HashSet<>(expected));
-
- Assert.assertEquals(targetDetector.overlapsAny(query), !expected.isEmpty());
-
- Assert.assertEquals(new HashSet<>(targetDetector.getAll()), new HashSet<>(input));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testOverlapsNullArg() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.overlapsAny(null);
- }
-
- @Test
- public void testNoOverlapsAny() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,110)
- );
- final OverlapDetector<Locatable> trimmedTargetDetector = new OverlapDetector(20,20);
- trimmedTargetDetector.addAll(input, input);
- Assert.assertFalse(trimmedTargetDetector.overlapsAny( new Interval("1",50,85)));//no overlap because of trim
- Assert.assertTrue(trimmedTargetDetector.getOverlaps( new Interval("1",50,85)).isEmpty());//no overlap because of trim
-
- final OverlapDetector<Locatable> untrimmedTargetDetector = new OverlapDetector(0,0);
- untrimmedTargetDetector.addAll(input, input);
- Assert.assertTrue(untrimmedTargetDetector.overlapsAny( new Interval("1",50,85)));//overlaps - no trim
- }
-
- @Test
- public void testLotsOfTinyIntervals() throws Exception {
- final List<Locatable> input = new ArrayList<>();
- final int n = 1000000;
- for (int i = 0; i < n; i++) {
- input.add(new Interval("1", 3*i+1, 3*i+2)); //1:1-2, 1:4-5, 1:7-8
- }
- final OverlapDetector<Locatable> detector = OverlapDetector.create(input);
- final Set<Locatable> overlapping = detector.getOverlaps(new Interval("1", 1, 3 * n + 2));
- Assert.assertEquals(new HashSet<>(input), overlapping);
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testAddAllDifferentSizes() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
-
- final List<Locatable> input1Interval = Arrays.asList(
- new Interval("1",11,101)
- );
-
- final List<Locatable> input2Intervals = Arrays.asList(
- new Interval("1",20,200),
- new Interval("1",20,200)
- );
- targetDetector.addAll(input1Interval, input2Intervals);
-
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullObjectAddLHS() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.addLhs(null, new Interval("2",10,100));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullIntervalAddLHS() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.addLhs(new Interval("2",10,100), null);
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullObjectsAddAll() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.addAll(null, Arrays.asList(new Interval("2",10,100)));
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullIntervalsAddAll() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.addAll(Arrays.asList(new Interval("2",10,100)), null);
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testDifferentSizesAddAll() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- final List<Locatable> l1 = Arrays.asList(new Interval("2", 10, 100));
- final List<Locatable> l2 = Arrays.asList(new Interval("2", 10, 100), new Interval("3", 10, 100));
- targetDetector.addAll(l1, l2);
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testNullArgGetOverlaps() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> targetDetector = OverlapDetector.create(input);
- targetDetector.getOverlaps(null);
- }
-
- @Test
- public void testAddTwice() throws Exception {
- final List<Locatable> input = Arrays.asList(
- new Interval("1",10,100),
- new Interval("1",10,100)
- );
- final OverlapDetector<Locatable> detector = OverlapDetector.create(input);
- final Set<Locatable> overlaps = detector.getOverlaps(new Interval("1", 50, 200));
- Assert.assertEquals(overlaps.size(), 1);
- Assert.assertEquals(overlaps, Collections.singleton(new Interval("1",10,100)));
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java b/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java
deleted file mode 100644
index 49de11d..0000000
--- a/src/test/java/htsjdk/samtools/util/PositionalOutputStreamTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 Daniel Gómez-Sánchez
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * @author Daniel Gomez-Sanchez (magicDGS)
- */
-public class PositionalOutputStreamTest {
-
- @Test
- public void basicPositionTest() throws Exception {
- // wrapped null output stream to check
- final PositionalOutputStream wrapped = new PositionalOutputStream(new OutputStream() {
- @Override
- public void write(int b) throws IOException {}
- });
- int position = 0;
- // check that we start at position 0
- Assert.assertEquals(wrapped.getPosition(), position);
- // check that write one int just add one
- wrapped.write(100);
- Assert.assertEquals(wrapped.getPosition(), ++position);
- // check that write a byte array adds its length
- final byte[] bytes = new byte[]{1, 3, 5, 7};
- wrapped.write(bytes);
- position += bytes.length;
- Assert.assertEquals(wrapped.getPosition(), position);
- // check that write just some bytes from an array adds its length
- wrapped.write(bytes, 2, 2);
- position += 2;
- Assert.assertEquals(wrapped.getPosition(), position);
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java b/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java
deleted file mode 100644
index 9e014d7..0000000
--- a/src/test/java/htsjdk/samtools/util/QualityEncodingDetectorTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMException;
-import htsjdk.samtools.SAMRecordSetBuilder;
-import htsjdk.samtools.SamReader;
-import htsjdk.samtools.SamReaderFactory;
-import htsjdk.samtools.fastq.FastqReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-
-public class QualityEncodingDetectorTest {
-
- private static class Testcase {
- private final File f;
- private final FastqQualityFormat q;
-
- Testcase(final File file, final FastqQualityFormat qualityFormat) {
- this.f = file;
- this.q = qualityFormat;
- }
- }
-
- final static List<Testcase> FASTQ_TESTCASES = Arrays.asList(
- // Need to use full-range quality here, as Solexa and Illumina are near indistinguishable
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq"), FastqQualityFormat.Solexa),
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt"), FastqQualityFormat.Illumina),
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq"), FastqQualityFormat.Standard)
- );
- final static List<Testcase> BAM_TESTCASES = Arrays.asList(
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam"), FastqQualityFormat.Standard),
- new Testcase(new File("./src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam"), FastqQualityFormat.Standard),
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam"), FastqQualityFormat.Solexa),
- new Testcase(new File("./src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam"), FastqQualityFormat.Illumina)
-
- );
-
- Object[][] renderObjectArrayArray(final List<Testcase> testcaseList) {
- final Object[][] data = new Object[testcaseList.size()][];
- for (int i = 0; i < data.length; i++) {
- final Testcase testcase = testcaseList.get(i);
- data[i] = new Object[]{testcase.f, testcase.q};
- }
- return data;
- }
-
- @DataProvider(name = "BAM_TESTCASES")
- Object[][] bamTestcases() {
- return renderObjectArrayArray(BAM_TESTCASES);
- }
-
- @DataProvider(name = "FASTQ_TESTCASES")
- Object[][] fastqTestcases() {
- return renderObjectArrayArray(FASTQ_TESTCASES);
- }
-
- @Test(dataProvider = "FASTQ_TESTCASES", groups = {"unix"})
- public void testFastqQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) {
- final FastqReader reader = new FastqReader(input);
- Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat);
- reader.close();
- }
-
- @Test(dataProvider = "BAM_TESTCASES", groups = {"unix"})
- public void testBamQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) {
- final SamReader reader = SamReaderFactory.makeDefault().open(input);
- Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat);
- }
-
- @Test
- public void testSmallBamForDetectorFailure() {
- final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
- Assert.assertNotSame(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
- null), FastqQualityFormat.Standard);
- }
-
- @Test
- public void testSmallBamWithExpectedQuality() {
- final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
- Assert.assertEquals(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
- FastqQualityFormat.Standard), FastqQualityFormat.Standard);
- }
-
- @Test(expectedExceptions = SAMException.class)
- public void testQualitySanity() {
- final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam();
- QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(),
- FastqQualityFormat.Illumina);
- }
-
- private SAMRecordSetBuilder createSmallUnmappedSam() {
- final SAMRecordSetBuilder samRecordSetBuilder = new SAMRecordSetBuilder();
- samRecordSetBuilder.setReadLength(25);
- samRecordSetBuilder.addFrag("READ0", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1);
- samRecordSetBuilder.addFrag("READ1", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1);
- samRecordSetBuilder.addFrag("READ2", -1, -1, false, true, null, "@CCFDFEDHHHFFHIIII at GH<FFH", -1);
- samRecordSetBuilder.addFrag("READ3", -1, -1, false, true, null, "@@?DFFDFHFFHDHIIHIIEIIJGG", -1);
- samRecordSetBuilder.addFrag("READ4", -1, -1, false, true, null, "@CCFFDDFHHHHHIIJJHFJJJJJH", -1);
- samRecordSetBuilder.addFrag("READ5", -1, -1, false, true, null, "BCCFFFFFHHHHHJJJJJIJJJJJJ", -1);
- samRecordSetBuilder.addFrag("READ6", -1, -1, false, true, null, "@@CDFFFFHHHFHHIJJJJJJJIJJ", -1);
- samRecordSetBuilder.addFrag("READ7", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJIJJJJHII", -1);
- samRecordSetBuilder.addFrag("READ8", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJJJJJJJJJ", -1);
- return samRecordSetBuilder;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java b/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java
deleted file mode 100644
index e4e9ef9..0000000
--- a/src/test/java/htsjdk/samtools/util/RelativeIso8601DateTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-/** @author mccowan */
-
-public class RelativeIso8601DateTest {
-
- // 1 second resolution is ISO date
- private final static double DELTA_FOR_TIME = 1000;
-
- @Test
- public void testLazyInstance() {
- final RelativeIso8601Date lazy = RelativeIso8601Date.generateLazyNowInstance();
- Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
- Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
- Assert.assertEquals(lazy.toString(), RelativeIso8601Date.LAZY_NOW_LABEL);
- Assert.assertEquals(lazy.getTime(), new Iso8601Date(new Date(System.currentTimeMillis())).getTime(), DELTA_FOR_TIME);
- // Assert no exception thrown; this should be valid, because toString should now return an iso-looking date.
- new Iso8601Date(lazy.toString());
- }
-
- @Test
- public void testNonLazyInstance() {
- final long time = new Iso8601Date(new Date(System.currentTimeMillis())).getTime(); // ISO strips off milliseconds
-
- // Test both constructor methods
- final List<RelativeIso8601Date> testDates = Arrays.<RelativeIso8601Date>asList(
- new RelativeIso8601Date(new Date(time)),
- new RelativeIso8601Date(new Iso8601Date(new Date(time)).toString())
- );
-
- for (final RelativeIso8601Date nonLazy : testDates) {
- Assert.assertFalse(nonLazy.toString().equals(RelativeIso8601Date.LAZY_NOW_LABEL));
- Assert.assertEquals((double) nonLazy.getTime(), (double) time, DELTA_FOR_TIME);
- // Assert no exception thrown; this should be valid, because toString return an iso-looking date.
- new RelativeIso8601Date(nonLazy.toString());
- }
- }
-
- @Test
- public void equalityTest() {
- final String s = new Iso8601Date(new Date(12345)).toString();
- final Iso8601Date iso8601Date = new Iso8601Date(s);
- final RelativeIso8601Date relativeIso8601Date = new RelativeIso8601Date(s);
- Assert.assertEquals(relativeIso8601Date.getTime(), iso8601Date.getTime(), DELTA_FOR_TIME);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java b/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java
deleted file mode 100644
index 262b7c9..0000000
--- a/src/test/java/htsjdk/samtools/util/SamLocusIteratorTest.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2010 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.SAMRecordSetBuilder;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- * @author Mariia_Zueva at epam.com, EPAM Systems, Inc. <www.epam.com>
- */
-public class SamLocusIteratorTest extends AbstractLocusIteratorTestTemplate {
-
- /** Create the SamLocusIterator with the builder*/
- private SamLocusIterator createSamLocusIterator(final SAMRecordSetBuilder builder) {
- final SamLocusIterator ret = new SamLocusIterator(builder.getSamReader());
- ret.setEmitUncoveredLoci(false);
- return ret;
- }
-
- /**
- * Test a simple with only matches, with both including or not indels
- */
- @Override
- @Test
- public void testBasicIterator() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
- }
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos++);
- Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
- Assert.assertEquals(li.size(), coverage);
- // make sure that we are not accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- }
- }
-
- @Test
- public void testMissingQualityString() {
-
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
-
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", "*", 0);
- }
- final SamLocusIterator sli = createSamLocusIterator(builder);
-
- // make sure we accumulated depth of 2 for each position
- int pos = 165;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos++);
- Assert.assertEquals(li.getRecordAndPositions().size(), 2);
- Assert.assertEquals(li.size(), 2);
- }
- }
-
- /**
- * Test the emit uncovered loci, with both including or not indels
- */
- @Override
- @Test
- public void testEmitUncoveredLoci() {
-
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", null, 10);
- }
-
- final int coveredEnd = CoordMath.getEnd(startPosition, readLength);
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setEmitUncoveredLoci(true);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth of 2 for each position
- int pos = 1;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos++);
- final int expectedReads;
- if (li.getPosition() >= startPosition && li.getPosition() <= coveredEnd) {
- expectedReads = coverage;
- } else {
- expectedReads = 0;
- }
- Assert.assertEquals(li.getRecordAndPositions().size(), expectedReads);
- Assert.assertEquals(li.size(), expectedReads);
- // make sure that we are not accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- Assert.assertEquals(pos, header.getSequence(0).getSequenceLength() + 1);
- }
- }
-
- /**
- * Test the quality filter, with both including or not indels
- */
- @Test
- public void testQualityFilter() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- final String qualityString;
- // half of the reads have a different quality
- if (i % 2 == 0) {
- qualityString = null;
- } else {
- qualityString = "+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*";
- }
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "36M", qualityString, 10);
- }
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setQualityScoreCutoff(10);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth coverage for even positions, coverage/2 for odd positions
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getRecordAndPositions().size(), (pos % 2 == 0) ? coverage / 2 : coverage);
- Assert.assertEquals(li.size(), (pos % 2 == 0) ? coverage / 2 : coverage);
- Assert.assertEquals(li.getPosition(), pos++);
- // make sure that we are not accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- }
- }
-
- /**
- * Test a simple deletion, with both including or not indels
- */
- @Test
- public void testSimpleDeletion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "18M10D18M", null, 10);
- }
- final int deletionStart = 183;
- final int deletionEnd = 192;
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- boolean isDeletedPosition = (pos >= deletionStart && pos <= deletionEnd);
- if (!incIndels && isDeletedPosition) {
- pos = deletionEnd + 1;
- isDeletedPosition = false;
- }
- Assert.assertEquals(li.getPosition(), pos++);
- if (isDeletedPosition) {
- // make sure there are no reads without indels
- Assert.assertEquals(li.getRecordAndPositions().size(), 0);
- Assert.assertEquals(li.size(), coverage); // should include deletions
-
- // make sure that we are accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), coverage);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- } else {
- // make sure we are accumulating normal coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
- Assert.assertEquals(li.size(), coverage);
-
- // make sure that we are not accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- }
- }
- }
-
- /**
- * Test a simple insertion, with both including or not indels
- */
- @Test
- public void testSimpleInsertion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "30M3I3M", null, 10);
- }
- final int insStart = 194;
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos++);
- // make sure we are accumulating normal coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
- Assert.assertEquals(li.size(), coverage);
-
- // make sure that we are not accumulating deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- if (incIndels && li.getPosition() == insStart) {
- Assert.assertEquals(li.getInsertedInRecord().size(), coverage);
- } else {
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- }
- }
- }
-
- /**
- * Test an insertion at the start of the read, with both including or not indels
- */
- @Test
- public void testStartWithInsertion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "3I33M", null, 10);
- }
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = (incIndels) ? startPosition - 1 : startPosition;
- boolean indelPosition = incIndels;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos);
- // accumulation of coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), (indelPosition) ? 0 : coverage);
- Assert.assertEquals(li.size(), (indelPosition) ? 0 : coverage);
-
- // no accumulation of deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- // accumulation of insertion
- Assert.assertEquals(li.getInsertedInRecord().size(), (indelPosition) ? coverage : 0);
- // check offsets of the insertion
- if (indelPosition) {
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 0);
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 0);
- indelPosition = false;
- }
- pos++;
- }
- }
- }
-
- /**
- * Test an insertion at the start of a soft-clipped read, with both including or not indels
- */
- @Test
- public void testStartWithSoftClipAndInsertion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "1S3I32M", null, 10);
- }
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = (incIndels) ? startPosition - 1 : startPosition;
- boolean indelPosition = incIndels;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getPosition(), pos);
- // accumulation of coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), (indelPosition) ? 0 : coverage);
- Assert.assertEquals(li.size(), (indelPosition) ? 0 : coverage);
- // no accumulation of deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- // accumulation of insertion
- Assert.assertEquals(li.getInsertedInRecord().size(), (indelPosition) ? coverage : 0);
- // check offsets of the insertion
- if (indelPosition) {
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 1);
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 1);
- indelPosition = false;
- }
- pos++;
- }
- }
- }
-
- /**
- * Test an insertion after N in CIGAR
- */
- @Test
- public void testNBeforeInsertion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "2M4N3I27M", null, 10);
- }
- final int startN = 167;
- final int endN = 170;
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- // skipping Ns
- if (pos >= startN && pos <= endN) {
- pos = (incIndels) ? endN : endN + 1;
- }
- Assert.assertEquals(li.getPosition(), pos);
- // accumulation of coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), (pos == endN) ? 0 : coverage);
- Assert.assertEquals(li.size(), (pos == endN) ? 0 : coverage);
- // no accumulation of deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- // accumulation of insertion
- Assert.assertEquals(li.getInsertedInRecord().size(), (pos == endN) ? coverage : 0);
- // check offsets of the insertion
- if (pos == endN) {
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
- }
- pos++;
- }
- }
- }
-
- /**
- * Test a deletion after N in CIGAR
- */
- @Test
- public void testNBeforeDeletion() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "2M4N4D5M", null, 10);
- }
- final int startN = 167;
- final int endN = 170;
- final int startDel = 171;
- final int endDel = 174;
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
- // make sure we accumulated depth for each position
- int pos = startPosition;
- for (final SamLocusIterator.LocusInfo li : sli) {
- if (pos >= startN && pos <= endN) {
- if (incIndels) {
- // skipping Ns
- pos = endN + 1;
- } else {
- // skip deletions
- pos = endDel + 1;
- }
- }
- final boolean insideDeletion = incIndels && (pos >= startDel && pos <= endDel);
- Assert.assertEquals(li.getPosition(), pos);
- // accumulation of coverage
- Assert.assertEquals(li.getRecordAndPositions().size(), (insideDeletion) ? 0 : coverage);
- Assert.assertEquals(li.size(), coverage); // either will be all deletions, or all non-deletions, but always of size `coverage`.
- // accumulation of deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), (insideDeletion) ? coverage : 0);
- // no accumulation of insertion
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- // check offsets of the insertion
- if (pos == endN) {
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), 2);
- }
- pos++;
- }
- }
- }
-
- /**
- * Try all CIGAR operands (except H and P) and confirm that loci produced by SamLocusIterator are as expected,
- * with both including or not indels
- */
- @Override
- @Test
- public void testSimpleGappedAlignment() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- for (int i = 0; i < coverage; i++) {
- // add a negative-strand fragment mapped on chrM with base quality of 10
- builder.addFrag("record" + i, 0, startPosition, true, false, "3S3M3N3M3D3M3I18M3S", null, 10);
- }
-
- // make sure we accumulated depth of 2 for each position
- final int[] expectedPositions = new int[]{
- // 3S
- 165, 166, 167, // 3M
- // 3N
- 171, 172, 173, // 3M
- 174, 175, 176, // 3D
- 177, 178, 179, // 3M
- // 3I
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197}; // 18M
-
- final int[] expectedReadOffsets = new int[]{
- // 3S
- 3, 4, 5, // 3M
- // 3N
- 6, 7, 8, // 3M
- 8, 8, 8, // 3D previous 0-based offset
- 9, 10, 11, // 3M
- // 3I
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 // 3M
- };
-
- // to check the range of the insertion
- final int firstDelBase = 174;
- final int lastDelBase = 176;
-
- final int expectedInsertionPosition = 179; // previous reference base
- final int expectedInsertionOffset = 12; // first read base in the insertion
-
- // test both for include indels and do not include indels
- for (final boolean incIndels : new boolean[] {false, true}) {
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(incIndels);
-
- int i = 0;
- for (final SamLocusIterator.LocusInfo li : sli) {
- // check if it is in the deletion range
- boolean inDelRange = (expectedPositions[i] >= firstDelBase && expectedPositions[i] <= lastDelBase);
- // if we are not including indels, the expected position index change if it is in an deletion range
- if (!incIndels && inDelRange) {
- i += 3;
- inDelRange = false; // set to false to do not check the range of deletions
- }
- // check if the LocusInfo is the expected
- Assert.assertEquals(li.getPosition(), expectedPositions[i]);
- // check the insertions
- if (incIndels && li.getPosition() == expectedInsertionPosition) {
- // check the accumulated coverage
- Assert.assertEquals(li.getInsertedInRecord().size(), coverage);
- // check the record offset
- Assert.assertEquals(li.getInsertedInRecord().get(0).getOffset(), expectedInsertionOffset);
- Assert.assertEquals(li.getInsertedInRecord().get(1).getOffset(), expectedInsertionOffset);
- } else {
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- }
- // check the range of deletions
- if (inDelRange) {
- // check the coverage for insertion and normal records
- Assert.assertEquals(li.getDeletedInRecord().size(), coverage);
- Assert.assertEquals(li.getRecordAndPositions().size(), 0);
- Assert.assertEquals(li.size(), coverage); // includes deletions
- // check the offset for the deletion
- Assert.assertEquals(li.getDeletedInRecord().get(0).getOffset(), expectedReadOffsets[i]);
- Assert.assertEquals(li.getDeletedInRecord().get(1).getOffset(), expectedReadOffsets[i]);
- } else {
- // if it is not a deletion, perform the same test as before
- Assert.assertEquals(li.getRecordAndPositions().size(), coverage);
- Assert.assertEquals(li.size(), coverage);
- // Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getRecordAndPositions().get(0).getOffset(), expectedReadOffsets[i]);
- Assert.assertEquals(li.getRecordAndPositions().get(1).getOffset(), expectedReadOffsets[i]);
- }
- ++i;
- }
- }
-
-
- }
-
- /**
- * Test two reads that overlap because one has a deletion in the middle of it, without tracking indels
- */
- @Override
- @Test
- public void testOverlappingGappedAlignmentsWithoutIndels() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- // Were it not for the gap, these two reads would not overlap
- builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
- builder.addFrag("record2", 0, 206, true, false, "36M", null, 10);
-
- final SamLocusIterator sli = createSamLocusIterator(builder);
-
- // 5 base overlap btw the two reads
- final int numBasesCovered = 36 + 36 - 5;
- final int[] expectedReferencePositions = new int[numBasesCovered];
- final int[] expectedDepths = new int[numBasesCovered];
- final int[][] expectedReadOffsets = new int[numBasesCovered][];
-
- int i;
- // First 18 bases are from the first read
- for (i = 0; i < 18; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 1;
- expectedReadOffsets[i] = new int[]{i};
- }
- // Gap of 10, then 13 bases from the first read
- for (; i < 36 - 5; ++i) {
- expectedReferencePositions[i] = startPosition + 10 + i;
- expectedDepths[i] = 1;
- expectedReadOffsets[i] = new int[]{i};
- }
- // Last 5 bases of first read overlap first 5 bases of second read
- for (; i < 36; ++i) {
- expectedReferencePositions[i] = startPosition + 10 + i;
- expectedDepths[i] = 2;
- expectedReadOffsets[i] = new int[]{i, i - 31};
-
- }
- // Last 31 bases of 2nd read
- for (; i < 36 + 36 - 5; ++i) {
- expectedReferencePositions[i] = startPosition + 10 + i;
- expectedDepths[i] = 1;
- expectedReadOffsets[i] = new int[]{i - 31};
- }
-
- i = 0;
- for (final SamLocusIterator.LocusInfo li : sli) {
- Assert.assertEquals(li.getRecordAndPositions().size(), expectedDepths[i]);
- Assert.assertEquals(li.size(), expectedDepths[i]);
- Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
- Assert.assertEquals(li.getRecordAndPositions().size(), expectedReadOffsets[i].length);
- for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
- Assert.assertEquals(li.getRecordAndPositions().get(j).getOffset(), expectedReadOffsets[i][j]);
- }
- // make sure that we are not accumulating indels
- Assert.assertEquals(li.getDeletedInRecord().size(), 0);
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- ++i;
- }
- }
-
- /**
- * Test two reads that overlap because one has a deletion in the middle of it, tracking indels
- */
- @Test
- public void testOverlappingGappedAlignmentsWithIndels() {
- final SAMRecordSetBuilder builder = getRecordBuilder();
- // add records up to coverage for the test in that position
- final int startPosition = 165;
- // Were it not for the gap, these two reads would not overlap
- builder.addFrag("record1", 0, startPosition, true, false, "18M10D18M", null, 10);
- builder.addFrag("record2", 0, 206, true, false, "36M", null, 10);
-
- final SamLocusIterator sli = createSamLocusIterator(builder);
- sli.setIncludeIndels(true);
-
- // 46 for the gapped alignment, and 5 base overlap btw the two reads
- final int numBasesCovered = 46 + 36 - 5;
- final int[] expectedReferencePositions = new int[numBasesCovered];
- final int[] expectedDepths = new int[numBasesCovered];
- final int[] expectedDelDepths = new int[numBasesCovered];
- final int[][] expectedReadOffsets = new int[numBasesCovered][];
- final int expectedDelOffset = 17; // previous 0-based offset
-
- int i;
- // First 18 bases are from the first read
- for (i = 0; i < 18; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 1;
- expectedDelDepths[i] = 0;
- expectedReadOffsets[i] = new int[]{i};
- }
- // Gap of 10
- for (; i < 18 + 10; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 0;
- expectedDelDepths[i] = 1;
- expectedReadOffsets[i] = new int[0];
- }
- // the next bases for the first read (without the 5 overlapping)
- for (; i < 46 - 5; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 1;
- expectedDelDepths[i] = 0;
- expectedReadOffsets[i] = new int[]{i - 10};
- }
- // last 5 bases of the first read overlap first 5 bases of second read
- for (; i < 46; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 2;
- expectedDelDepths[i] = 0;
- expectedReadOffsets[i] = new int[]{i - 10, i + 10 - 46 - 5};
- }
- // Last 31 bases of 2nd read
- for (; i < numBasesCovered; ++i) {
- expectedReferencePositions[i] = startPosition + i;
- expectedDepths[i] = 1;
- expectedDelDepths[i] = 0;
- expectedReadOffsets[i] = new int[]{i + 10 - 46 - 5};
- }
- i = 0;
- for (final SamLocusIterator.LocusInfo li : sli) {
- // checking the same as without indels
- Assert.assertEquals(li.getRecordAndPositions().size(), expectedDepths[i]);
- Assert.assertEquals(li.size(), expectedDepths[i] + expectedDelDepths[i]); // include deletions
- Assert.assertEquals(li.getPosition(), expectedReferencePositions[i]);
- Assert.assertEquals(li.getRecordAndPositions().size(), expectedReadOffsets[i].length);
- for (int j = 0; j < expectedReadOffsets[i].length; ++j) {
- Assert.assertEquals(li.getRecordAndPositions().get(j).getOffset(), expectedReadOffsets[i][j]);
- }
- // check the deletions
- Assert.assertEquals(li.getDeletedInRecord().size(), expectedDelDepths[i]);
- if (expectedDelDepths[i] != 0) {
- Assert.assertEquals(li.getDeletedInRecord().get(0).getOffset(), expectedDelOffset);
- }
- // checking that insertions are not accumulating
- Assert.assertEquals(li.getInsertedInRecord().size(), 0);
- ++i;
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java b/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java
deleted file mode 100644
index 008cca5..0000000
--- a/src/test/java/htsjdk/samtools/util/SequenceUtilTest.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import htsjdk.samtools.*;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SequenceUtilTest {
- private static final String HEADER = "@HD\tVN:1.0\tSO:unsorted\n";
- private static final String SEQUENCE_NAME=
- "@SQ\tSN:phix174.seq\tLN:5386\tUR:/seq/references/PhiX174/v0/PhiX174.fasta\tAS:PhiX174\tM5:3332ed720ac7eaa9b3655c06f6b9e196";
-
- @Test
- public void testExactMatch() {
- final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
- }
-
- @DataProvider
- public Object[][] compatibleNonEqualLists(){
- final String s = HEADER +
- String.format("@SQ\tSN:phix174.seq\tLN:%d\tUR:%s\tAS:PhiX174\tM5:%s\n", 5386, "/seq/references/PhiX174/v0/PhiX174.fasta", "3332ed720ac7eaa9b3655c06f6b9e196")+
- String.format("@SQ\tSN:phix175.seq\tLN:%d\tUR:%s\tAS:HiMom\tM5:%s\n", 5385, "/seq/references/PhiX174/v0/HiMom.fasta", "deadbeed");
-
- return new Object[][]{ {makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196"),
- new SAMTextHeaderCodec().decode(new StringLineReader(s), null).getSequenceDictionary()}};
- }
-
- @Test(dataProvider = "compatibleNonEqualLists")
- public void testCompatible(SAMSequenceDictionary sd1, SAMSequenceDictionary sd2) {
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2, true);
- }
-
- @Test(dataProvider = "compatibleNonEqualLists",expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
- public void testinCompatible(SAMSequenceDictionary sd1, SAMSequenceDictionary sd2) {
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2, false);
- }
-
- @Test(expectedExceptions = SequenceUtil.SequenceListsDifferException.class)
- public void testMismatch() {
- final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "deadbeef");
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
- Assert.fail();
- }
-
- @Test
- public void testFileColonDifference() {
- final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "file:/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
- }
-
- @Test
- public void testURDifferent() {
- final SAMSequenceDictionary sd1 = makeSequenceDictionary(5386, "/seq/references/PhiX174/v0/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- final SAMSequenceDictionary sd2 = makeSequenceDictionary(5386, "file:/seq/references/PhiX174/v1/PhiX174.fasta",
- "3332ed720ac7eaa9b3655c06f6b9e196");
- SequenceUtil.assertSequenceDictionariesEqual(sd1, sd2);
- }
-
- private SAMSequenceDictionary makeSequenceDictionary(final int length, final String ur, final String m5) {
- final String s = HEADER +
- String.format("@SQ\tSN:phix174.seq\tLN:%d\tUR:%s\tAS:PhiX174\tM5:%s\n", length, ur, m5);
- return new SAMTextHeaderCodec().decode(new StringLineReader(s), null).getSequenceDictionary();
- }
-
- @Test(dataProvider = "makeReferenceFromAlignment")
- public void testMakeReferenceFromAlignment(final String seq, final String cigar, final String md,
- boolean includeReferenceBasesForDeletions,
- final String expectedReference) {
- final SAMRecord rec = new SAMRecord(null);
- rec.setReadName("test");
- rec.setReadString(seq);
- rec.setCigarString(cigar);
- rec.setAttribute(SAMTag.MD.name(), md);
- final byte[] refBases = SequenceUtil.makeReferenceFromAlignment(rec, includeReferenceBasesForDeletions);
- Assert.assertEquals(StringUtil.bytesToString(refBases), expectedReference);
- }
-
- @DataProvider(name = "makeReferenceFromAlignment")
- public Object[][] testMakeReferenceFromAlignmentDataProvider() {
- return new Object[][] {
- {"ACGTACGTACGT", "12M2H", "4GAAA4", true, "ACGTGAAAACGT"},
- {"ACGTACGTACGT", "2H12M", "12", false, "ACGTACGTACGT"},
- {"ACGTACGTACGT", "4M4I4M2H", "8", false, "ACGT----ACGT"},
- {"ACGTACGTACGT", "2S4M2I4M2S", "8", false, "00GTAC--ACGT00"},
- {"ACGTACGTACGT", "6M2D6M2H", "4GA^TT0TG4", true, "ACGTGATTTGACGT"},
- {"ACGTACGTACGT", "6M2D6M2H", "4GA^TT0TG4", false, "ACGTGATGACGT"},
- // When CIGAR has N, MD will not have skipped bases.
- {"ACGTACGTACGT", "6M2N6M2H", "4GA0TG4", true, "ACGTGANNTGACGT"},
- {"ACGTACGTACGT", "6M2N6M2H", "4GA0TG4", false, "ACGTGATGACGT"},
- {"ACGTACGTACGT", "6M2N6M2H", "4GATG4", true, "ACGTGANNTGACGT"},
- {"ACGTACGTACGT", "6M2N6M2H", "4GATG4", false, "ACGTGATGACGT"},
- };
- }
-
- @Test(dataProvider = "mismatchCountsDataProvider")
- public void testCountMismatches(final String readString, final String cigar, final String reference,
- final int expectedMismatchesExact, final int expectedMismatchesAmbiguous) {
- final SAMRecord rec = new SAMRecord(null);
- rec.setReadName("test");
- rec.setReadString(readString);
- rec.setCigarString(cigar);
-
- final byte[] refBases = StringUtil.stringToBytes(reference);
-
- final int nExact = SequenceUtil.countMismatches(rec, refBases, -1, false, false);
- Assert.assertEquals(nExact, expectedMismatchesExact);
-
- final int nAmbiguous = SequenceUtil.countMismatches(rec, refBases, -1, false, true);
- Assert.assertEquals(nAmbiguous, expectedMismatchesAmbiguous);
- }
-
- @DataProvider(name="mismatchCountsDataProvider")
- public Object[][] testMakeMismatchCountsDataProvider() {
- // note: R=A|G
- return new Object[][] {
- {"A", "1M", "A", 0, 0},
- {"A", "1M", "R", 1, 0},
- {"G", "1M", "R", 1, 0},
- {"C", "1M", "R", 1, 1},
- {"T", "1M", "R", 1, 1},
- {"N", "1M", "R", 1, 1},
- {"R", "1M", "A", 1, 1},
- {"R", "1M", "C", 1, 1},
- {"R", "1M", "G", 1, 1},
- {"R", "1M", "T", 1, 1},
- {"R", "1M", "N", 1, 0},
- {"R", "1M", "R", 0, 0},
- {"N", "1M", "N", 0, 0}
- };
- }
-
- @Test(dataProvider = "countInsertedAndDeletedBasesTestCases")
- public void testCountInsertedAndDeletedBases(final String cigarString, final int insertedBases, final int deletedBases) {
- final Cigar cigar = TextCigarCodec.decode(cigarString);
- Assert.assertEquals(SequenceUtil.countInsertedBases(cigar), insertedBases);
- Assert.assertEquals(SequenceUtil.countDeletedBases(cigar), deletedBases);
- }
-
- @DataProvider(name = "countInsertedAndDeletedBasesTestCases")
- public Object[][] countInsertedAndDeletedBasesTestCases() {
- return new Object[][] {
- {"2H2S32M", 0, 0},
- {"2H2S32M12I2M2I3M", 14, 0},
- {"32M2D10M", 0, 2},
- {"32M2D10M3D1M", 0, 5},
- {"2H2S32M12I2M3D1M2I3M2D1M", 14, 5}
- };
- }
-
- @DataProvider(name = "testKmerGenerationTestCases")
- public Object[][] testKmerGenerationTestCases() {
- return new Object[][] {
- {0, new String[]{""}},
- {1, new String[]{"A","C","G","T"}},
- {2, new String[]{"AA","AC","AG","AT","CA","CC","CG","CT","GA","GC","GG","GT","TA","TC","TG","TT"}}
- };
- }
-
- @Test(dataProvider = "testKmerGenerationTestCases")
- public void testKmerGeneration(final int length, final String[] expectedKmers) {
- final Set<String> actualSet = new HashSet<String>();
- for (final byte[] kmer : SequenceUtil.generateAllKmers(length)) {
- actualSet.add(StringUtil.bytesToString(kmer));
- }
- final Set<String> expectedSet = new HashSet<String>(Arrays.asList(expectedKmers));
- Assert.assertTrue(actualSet.equals(expectedSet));
- }
-
- @DataProvider(name = "testBisulfiteConversionDataProvider")
- public Object[][] testBisulfiteConversionDataProvider() {
- // C ref -> T read on the positive strand, and G ref -> A read on the negative strand
- return new Object[][] {
- {'C', 'T', false, false},
- {'C', 'A', false, false},
- {'C', 'C', false, false},
- {'T', 'C', true, false},
- {'G', 'T', false, false},
- {'G', 'A', false, false},
- {'G', 'G', false, false},
- {'A', 'G', false, true}
- };
- }
-
- @Test(dataProvider = "testBisulfiteConversionDataProvider")
- public void testBisulfiteConversion(final char readBase, final char refBase, final boolean posStrandExpected, final boolean negStrandExpected) {
- final boolean posStrand = SequenceUtil.isBisulfiteConverted((byte) readBase, (byte) refBase, false);
- Assert.assertEquals(posStrand, posStrandExpected);
- final boolean negStrand = SequenceUtil.isBisulfiteConverted((byte) readBase, (byte) refBase, true);
- Assert.assertEquals(negStrand, negStrandExpected);
- }
-
- @Test(dataProvider = "basesEqualDataProvider")
- public void testBasesEqual(final char base1, final char base2,
- final boolean expectedB1EqualsB2,
- final boolean expectedB1ReadMatchesB2Ref,
- final boolean expectedB2ReadMatchesB1Ref) {
-
- final char[] base1UcLc = new char[] { toUpperCase(base1), toLowerCase(base1) };
- final char[] base2UcLc = new char[] { toUpperCase(base2), toLowerCase(base2) };
- // Test over all permutations - uc vs uc, uc vs lc, lc vs uc, lc vs lc
- for (char theBase1 : base1UcLc) {
- for (char theBase2 : base2UcLc) {
- // for equality, order should not matter
- final boolean b1EqualsB2 = SequenceUtil.basesEqual((byte) theBase1, (byte) theBase2);
- Assert.assertEquals(b1EqualsB2, expectedB1EqualsB2, "basesEqual test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
- final boolean b2EqualsB1 = SequenceUtil.basesEqual((byte) theBase2, (byte) theBase1);
- Assert.assertEquals(b2EqualsB1, expectedB1EqualsB2, "basesEqual test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
-
- // for ambiguous read/ref matching, the order does matter
- final boolean b1ReadMatchesB2Ref = SequenceUtil.readBaseMatchesRefBaseWithAmbiguity((byte) theBase1, (byte) theBase2);
- Assert.assertEquals(b1ReadMatchesB2Ref, expectedB1ReadMatchesB2Ref, "readBaseMatchesRefBaseWithAmbiguity test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
- final boolean b2ReadMatchesB1Ref = SequenceUtil.readBaseMatchesRefBaseWithAmbiguity((byte) theBase2, (byte) theBase1);
- Assert.assertEquals(b2ReadMatchesB1Ref, expectedB2ReadMatchesB1Ref, "readBaseMatchesRefBaseWithAmbiguity test failed for '" + theBase1 + "' vs. '" + theBase2 + "'");
- }
- }
- }
-
- /*
- * For reference:
- * M = A|C
- * R = A|G
- * W = A|T
- * S = C|G
- * Y = C|T
- * K = G|T
- * V = A|C|G
- * H = A|C|T
- * D = A|G|T
- * B = C|G|T
- * N = A|C|G|T
- */
- @DataProvider(name="basesEqualDataProvider")
- public Object[][] testBasesEqualDataProvider() {
- return new Object[][] {
- {'A', 'A', true, true, true},
- {'A', 'C', false, false, false},
- {'A', 'G', false, false, false},
- {'A', 'T', false, false, false},
- {'A', 'M', false, true, false},
- {'A', 'R', false, true, false},
- {'A', 'W', false, true, false},
- {'A', 'S', false, false, false},
- {'A', 'Y', false, false, false},
- {'A', 'K', false, false, false},
- {'A', 'V', false, true, false},
- {'A', 'H', false, true, false},
- {'A', 'D', false, true, false},
- {'A', 'B', false, false, false},
- {'A', 'N', false, true, false},
- {'C', 'C', true, true, true},
- {'C', 'G', false, false, false},
- {'C', 'T', false, false, false},
- {'C', 'M', false, true, false},
- {'C', 'R', false, false, false},
- {'C', 'W', false, false, false},
- {'C', 'S', false, true, false},
- {'C', 'Y', false, true, false},
- {'C', 'K', false, false, false},
- {'C', 'V', false, true, false},
- {'C', 'H', false, true, false},
- {'C', 'D', false, false, false},
- {'C', 'N', false, true, false},
- {'G', 'G', true, true, true},
- {'G', 'T', false, false, false},
- {'G', 'M', false, false, false},
- {'G', 'R', false, true, false},
- {'G', 'W', false, false, false},
- {'G', 'S', false, true, false},
- {'G', 'Y', false, false, false},
- {'G', 'K', false, true, false},
- {'G', 'V', false, true, false},
- {'G', 'H', false, false, false},
- {'G', 'N', false, true, false},
- {'T', 'T', true, true, true},
- {'T', 'W', false, true, false},
- {'T', 'Y', false, true, false},
- {'T', 'V', false, false, false},
- {'M', 'T', false, false, false},
- {'M', 'M', true, true, true},
- {'M', 'R', false, false, false},
- {'M', 'W', false, false, false},
- {'M', 'S', false, false, false},
- {'M', 'Y', false, false, false},
- {'M', 'V', false, true, false},
- {'M', 'N', false, true, false},
- {'R', 'T', false, false, false},
- {'R', 'R', true, true, true},
- {'R', 'W', false, false, false},
- {'R', 'S', false, false, false},
- {'R', 'Y', false, false, false},
- {'R', 'V', false, true, false},
- {'W', 'W', true, true, true},
- {'W', 'Y', false, false, false},
- {'S', 'T', false, false, false},
- {'S', 'W', false, false, false},
- {'S', 'S', true, true, true},
- {'S', 'Y', false, false, false},
- {'S', 'V', false, true, false},
- {'Y', 'Y', true, true, true},
- {'K', 'T', false, false, true},
- {'K', 'M', false, false, false},
- {'K', 'R', false, false, false},
- {'K', 'W', false, false, false},
- {'K', 'S', false, false, false},
- {'K', 'Y', false, false, false},
- {'K', 'K', true, true, true},
- {'K', 'V', false, false, false},
- {'K', 'N', false, true, false},
- {'V', 'W', false, false, false},
- {'V', 'Y', false, false, false},
- {'V', 'V', true, true, true},
- {'H', 'T', false, false, true},
- {'H', 'M', false, false, true},
- {'H', 'R', false, false, false},
- {'H', 'W', false, false, true},
- {'H', 'S', false, false, false},
- {'H', 'Y', false, false, true},
- {'H', 'K', false, false, false},
- {'H', 'V', false, false, false},
- {'H', 'H', true, true, true},
- {'H', 'N', false, true, false},
- {'D', 'G', false, false, true},
- {'D', 'T', false, false, true},
- {'D', 'M', false, false, false},
- {'D', 'R', false, false, true},
- {'D', 'W', false, false, true},
- {'D', 'S', false, false, false},
- {'D', 'Y', false, false, false},
- {'D', 'K', false, false, true},
- {'D', 'V', false, false, false},
- {'D', 'H', false, false, false},
- {'D', 'D', true, true, true},
- {'D', 'N', false, true, false},
- {'B', 'C', false, false, true},
- {'B', 'G', false, false, true},
- {'B', 'T', false, false, true},
- {'B', 'M', false, false, false},
- {'B', 'R', false, false, false},
- {'B', 'W', false, false, false},
- {'B', 'S', false, false, true},
- {'B', 'Y', false, false, true},
- {'B', 'K', false, false, true},
- {'B', 'V', false, false, false},
- {'B', 'H', false, false, false},
- {'B', 'D', false, false, false},
- {'B', 'B', true, true, true},
- {'B', 'N', false, true, false},
- {'N', 'T', false, false, true},
- {'N', 'R', false, false, true},
- {'N', 'W', false, false, true},
- {'N', 'S', false, false, true},
- {'N', 'Y', false, false, true},
- {'N', 'V', false, false, true},
- {'N', 'N', true, true, true}
- };
- }
-
- private char toUpperCase(final char base) {
- return base > 90 ? (char) (base - 32) : base;
- }
-
- private char toLowerCase(final char base) {
- return (char) (toUpperCase(base) + 32);
- }
-
- @Test(dataProvider = "testGetSamReadNameFromFastqHeader")
- public void testGetSamReadNameFromFastqHeader(final String fastqHeader,
- final String expectedSamReadName) {
- Assert.assertEquals(SequenceUtil.getSamReadNameFromFastqHeader(fastqHeader), expectedSamReadName);
- }
-
- @DataProvider(name = "testGetSamReadNameFromFastqHeader")
- public Object[][] testGetSamReadNameFromFastqHeaderTestCases() {
- return new Object[][] {
- {"Simple:Name", "Simple:Name"},
- {"Simple:Name", "Simple:Name"},
- {"Name/1", "Name"},
- {"Name/2", "Name"},
- {"Name/3", "Name/3"},
- {"Simple:Name Blank", "Simple:Name"},
- {"Simple:Name Blank /1", "Simple:Name"},
- {"Name/1/2", "Name"}
- };
- }
-
- @Test
- public void testCalculateNmTag() {
- final File TEST_DIR = new File("src/test/resources/htsjdk/samtools/SequenceUtil");
- final File referenceFile = new File(TEST_DIR, "reference_with_lower_and_uppercase.fasta");
- final File samFile = new File(TEST_DIR, "upper_and_lowercase_read.sam");
-
- SamReader reader = SamReaderFactory.makeDefault().open(samFile);
- ReferenceSequenceFile ref = ReferenceSequenceFileFactory.getReferenceSequenceFile(referenceFile);
-
- reader.iterator().stream().forEach(r -> {
- Integer nm = SequenceUtil.calculateSamNmTag(r, ref.getSequence(r.getContig()).getBases());
- String md = r.getStringAttribute(SAMTag.MD.name());
- Assert.assertEquals(r.getIntegerAttribute(SAMTag.NM.name()), nm, "problem with NM in read \'" + r.getReadName() + "\':");
- SequenceUtil.calculateMdAndNmTags(r, ref.getSequence(r.getContig()).getBases(), true, true);
-
- Assert.assertEquals(r.getIntegerAttribute(SAMTag.NM.name()), nm, "problem with NM in read \'" + r.getReadName() + "\':");
- if (md != null) {
- Assert.assertEquals(r.getStringAttribute(SAMTag.MD.name()), md, "problem with MD in read \'" + r.getReadName() + "\':");
- }
- });
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java b/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java
deleted file mode 100644
index 09cc829..0000000
--- a/src/test/java/htsjdk/samtools/util/SolexaQualityConverterTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class SolexaQualityConverterTest {
- //declared as a staic variable because we reuse it in IlluminaUtilTest
- public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE = new Object[][] {
- new Object[]{new byte[]{}, new byte[]{}},
- new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
- new Object[]{iToB(new int[]{64, 65, 120, 121}), iToB(new int[]{3, 4, 56, 57})},
- new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{0, 0, 0})}
- };
-
- public static Object[][] SOLEXA_QUALS_TO_PHRED_SCORE_1_3 = new Object[][] {
- new Object[]{new byte[]{}, new byte[]{}},
- new Object[]{iToB(new int[]{120}), iToB(new int[]{56})},
- new Object[]{iToB(new int[]{64, 65, 120, 121, 156, 157}), iToB(new int[]{0, 1, 56, 57, 92, 93})},
- new Object[]{iToB(new int[]{0, 1, 63}), iToB(new int[]{-64, -63, -1})}
- };
-
- public static Object[][] INVALID_SOLEXA_QUALS = new Object[][] {
- new Object[]{iToB(new int[]{-1}), iToB(new int[]{-65})},
- new Object[]{iToB(new int[]{-1, -2}), iToB(new int[]{-65, -66})}
- };
-
- private static final byte [] iToB(int [] intVals) {
- byte [] byteVals = new byte[intVals.length];
- for(int i = 0; i < byteVals.length; i++) {
- byteVals[i] = (byte) intVals[i];
- }
- return byteVals;
- }
-
- @DataProvider(name="solexaQualsToPhredScore")
- public Object[][] solexaQualsToPhredScore() {return SOLEXA_QUALS_TO_PHRED_SCORE;}
-
- @DataProvider(name="solexaQualsToPhredScore_1_3")
- public Object[][] solexaQualsToPhredScore_1_3() {return SOLEXA_QUALS_TO_PHRED_SCORE_1_3;}
-
- @DataProvider(name="invalidSolexaQuals")
- public Object[][] invalidSolexaQuals() {return INVALID_SOLEXA_QUALS;}
-
- @Test(dataProvider="solexaQualsToPhredScore")
- public void solexaQualsToPhredScoreTestArray(byte [] solexaQuals, byte [] phredScores) {
- byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
- SolexaQualityConverter.getSingleton().convertSolexaQualityCharsToPhredBinary(qualsToPhred);
- Assert.assertEquals(phredScores, qualsToPhred);
- }
-
- @Test(dataProvider="solexaQualsToPhredScore_1_3")
- public void solexaQualsToPhredScoreTestArray_1_3(byte [] solexaQuals, byte [] phredScores) {
- byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
- SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
- Assert.assertEquals(phredScores, qualsToPhred);
- }
-
- @Test(dataProvider="invalidSolexaQuals")
- public void invalidSolexaQualsTestArray(byte [] solexaQuals, byte [] phredScores) {
- byte [] qualsToPhred = Arrays.copyOf(solexaQuals, solexaQuals.length);
-
- SolexaQualityConverter.getSingleton().convertSolexa_1_3_QualityCharsToPhredBinary(qualsToPhred);
- Assert.assertEquals(phredScores, qualsToPhred);
- }
-
- @Test(dataProvider="solexaQualsToPhredScore")
- public void solexaCharToPhredBinaryTest(final byte [] solexaQuals, byte [] phredScores) {
- final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
- for(int i = 0; i < solexaQuals.length; i++) {
- Assert.assertEquals(phredScores[i], solexaConverter.solexaCharToPhredBinary(solexaQuals[i]));
- }
- }
-
- @Test(dataProvider="invalidSolexaQuals", expectedExceptions = IndexOutOfBoundsException.class)
- public void invalidSolexaCharToPhredBinaryTest(final byte [] solexaQuals, byte [] phredScores) {
- final SolexaQualityConverter solexaConverter = SolexaQualityConverter.getSingleton();
- for(int i = 0; i < solexaQuals.length; i++) {
- solexaConverter.solexaCharToPhredBinary(solexaQuals[i]);
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java b/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java
deleted file mode 100644
index 1ec928d..0000000
--- a/src/test/java/htsjdk/samtools/util/SortingCollectionTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Random;
-
-public class SortingCollectionTest {
- // Create a separate directory for files so it is possible to confirm that the directory is emptied
- protected File tmpDir() {
- return new File(System.getProperty("java.io.tmpdir") + "/" + System.getProperty("user.name"), getClass().getSimpleName());
- }
-
- @BeforeMethod void setup() { resetTmpDir(); }
- @AfterMethod void tearDown() { resetTmpDir(); }
-
- /** Deletes and re-creates the temporary directory. */
- void resetTmpDir() {
- System.err.println("Resetting tmpdir");
- IOUtil.deleteDirectoryTree(tmpDir());
- if (!tmpDir().mkdirs()) throw new IllegalStateException("Could not create tmpdir: " + tmpDir().getAbsolutePath());
-
- }
-
- protected boolean tmpDirIsEmpty() {
- return tmpDir().listFiles().length == 0;
- }
-
- @DataProvider(name = "test1")
- public Object[][] createTestData() {
- return new Object[][] {
- {"empty", 0, 100},
- {"singleton", 1, 100},
- {"less than threshold", 100, 200},
- {"threshold minus 1", 99, 100},
- {"greater than threshold", 550, 100},
- {"threshold multiple", 600, 100},
- {"threshold multiple plus one", 101, 100},
- {"exactly threshold", 100, 100},
- };
- }
-
- /**
- * Generate some strings, put into SortingCollection, confirm that the right number of
- * Strings come out, and in the right order.
- * @param numStringsToGenerate
- * @param maxRecordsInRam
- */
- @Test(dataProvider = "test1")
- public void testPositive(final String testName, final int numStringsToGenerate, final int maxRecordsInRam) {
- final String[] strings = new String[numStringsToGenerate];
- int numStringsGenerated = 0;
- final SortingCollection<String> sortingCollection = makeSortingCollection(maxRecordsInRam);
- for (final String s : new RandomStringGenerator(numStringsToGenerate)) {
- sortingCollection.add(s);
- strings[numStringsGenerated++] = s;
- }
- Arrays.sort(strings, new StringComparator());
-
- Assert.assertEquals(tmpDirIsEmpty(), numStringsToGenerate <= maxRecordsInRam);
- sortingCollection.setDestructiveIteration(false);
- assertIteratorEqualsList(strings, sortingCollection.iterator());
- assertIteratorEqualsList(strings, sortingCollection.iterator());
-
- sortingCollection.cleanup();
- Assert.assertEquals(tmpDir().list().length, 0);
- }
-
- private void assertIteratorEqualsList(final String[] strings, final Iterator<String> sortingCollection) {
- int i = 0;
- while (sortingCollection.hasNext()) {
- final String s = sortingCollection.next();
- Assert.assertEquals(s, strings[i++]);
- }
- Assert.assertEquals(i, strings.length);
- }
-
- private SortingCollection<String> makeSortingCollection(final int maxRecordsInRam) {
- return SortingCollection.newInstance(String.class, new StringCodec(), new StringComparator(), maxRecordsInRam, tmpDir());
- }
-
- /**
- * Generate pseudo-random Strings for testing
- */
- static class RandomStringGenerator implements Iterable<String>, Iterator<String> {
- Random random = new Random(0);
- int numElementsToGenerate;
- int numElementsGenerated = 0;
-
- /**
- * @param numElementsToGenerate Iteration ends after this many have been generated.
- */
- RandomStringGenerator(final int numElementsToGenerate) {
- this.numElementsToGenerate = numElementsToGenerate;
- }
-
- public Iterator<String> iterator() {
- return this;
- }
-
- public boolean hasNext() {
- return numElementsGenerated < numElementsToGenerate;
- }
-
- public String next() {
- ++numElementsGenerated;
- return Integer.toString(random.nextInt());
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
-
- static class StringComparator implements Comparator<String> {
-
- public int compare(final String s, final String s1) {
- return s.compareTo(s1);
- }
- }
-
- static class StringCodec implements SortingCollection.Codec<String> {
- ByteBuffer byteBuffer = ByteBuffer.allocate(4);
- OutputStream os;
- InputStream is;
-
- public SortingCollection.Codec<String> clone() {
- return new StringCodec();
- }
-
- /**
- * Where to write encoded output
- *
- * @param os
- */
- public void setOutputStream(final OutputStream os) {
- this.os = os;
- }
-
- /**
- * Where to read encoded input from
- *
- * @param is
- */
- public void setInputStream(final InputStream is) {
- this.is = is;
- }
-
- /**
- * Write object to file
- *
- * @param val what to write
- */
- public void encode(final String val) {
- try {
- byteBuffer.clear();
- byteBuffer.putInt(val.length());
- os.write(byteBuffer.array());
- os.write(val.getBytes());
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
-
- /**
- * Read the next record from the input stream and convert into a java object.
- *
- * @return null if no more records. Should throw exception if EOF is encountered in the middle of
- * a record.
- */
- public String decode() {
- try {
- byteBuffer.clear();
- int bytesRead = is.read(byteBuffer.array());
- if (bytesRead == -1) {
- return null;
- }
- if (bytesRead != 4) {
- throw new RuntimeException("Unexpected EOF in middle of record");
- }
- byteBuffer.limit(4);
- final int length = byteBuffer.getInt();
- final byte[] buf = new byte[length];
- bytesRead = is.read(buf);
- if (bytesRead != length) {
- throw new RuntimeException("Unexpected EOF in middle of record");
- }
- return new String(buf);
- } catch (IOException e) {
- throw new RuntimeIOException(e);
- }
- }
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java b/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java
deleted file mode 100644
index 4817ef5..0000000
--- a/src/test/java/htsjdk/samtools/util/SortingLongCollectionTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class SortingLongCollectionTest {
- // Create a separate directory for files so it is possible to confirm that the directory is emptied
- private final File tmpDir = new File(System.getProperty("java.io.tmpdir") + "/" + System.getProperty("user.name"),
- "SortingCollectionTest");
-
- @BeforeTest
- void setup() {
- // Clear out any existing files if the directory exists
- if (tmpDir.exists()) {
- for (final File f : tmpDir.listFiles()) {
- f.delete();
- }
- }
- tmpDir.mkdir();
- }
-
- @AfterTest
- void tearDown() {
- if (!tmpDir.exists()) {
- // I don't know why it wouldn't exist, but sometimes it doesn't, and it causes the unit test
- // to fail. AW 20-May-2009
- return;
- }
- for (final File f : tmpDir.listFiles()) {
- f.delete();
- }
- tmpDir.delete();
- }
-
- private boolean tmpDirIsEmpty() {
- return tmpDir.listFiles().length == 0;
- }
-
- @DataProvider(name = "test1")
- public Object[][] createTestData() {
- return new Object[][]{
- {"empty", 0, 100},
- {"less than threshold", 100, 200},
- {"greater than threshold", 550, 100},
- {"threshold multiple", 600, 100},
- {"threshold multiple plus one", 101, 100},
- {"exactly threshold", 100, 100},
- };
- }
-
- /**
- * Generate some values, put into SortingLongCollection, confirm that the right number of
- * values come out, and in the right order.
- *
- * @param numValuesToGenerate
- * @param maxValuesInRam
- */
- @Test(dataProvider = "test1")
- public void testPositive(final String testName, final int numValuesToGenerate, final int maxValuesInRam) {
- final long[] values = new long[numValuesToGenerate];
- int numStringsGenerated = 0;
- final SortingLongCollection sortingCollection = new SortingLongCollection(maxValuesInRam, tmpDir);
- final Random valueGenerator = new Random(123);
- for (int i = 0; i < numValuesToGenerate; ++i) {
- final long value = valueGenerator.nextLong();
- sortingCollection.add(value);
- values[numStringsGenerated++] = value;
- }
- Arrays.sort(values);
-
- Assert.assertEquals(tmpDirIsEmpty(), numValuesToGenerate <= maxValuesInRam);
- assertIteratorEqualsList(values, sortingCollection);
-
- sortingCollection.cleanup();
- Assert.assertTrue(tmpDirIsEmpty());
- }
-
- private void assertIteratorEqualsList(final long[] values, final SortingLongCollection sortingCollection) {
- int i = 0;
- sortingCollection.doneAddingStartIteration();
- while (sortingCollection.hasNext()) {
- Assert.assertEquals(sortingCollection.next(), values[i++], "values failed. i: " + (i - 1) + "; values[i]" + values[i - 1]);
- }
- Assert.assertEquals(i, values.length);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java b/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java
deleted file mode 100644
index 9919f89..0000000
--- a/src/test/java/htsjdk/samtools/util/StringLineReaderTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class StringLineReaderTest {
-
- private static final String[] TERMINATORS = {"\r", "\n", "\r\n"};
- private static final boolean[] LAST_LINE_TERMINATED = {false, true};
-
- enum EmptyLineState {
- FIRST_LINE, LAST_LINE, MIDDLE_LINE, COMPLETELY_EMPTY
- }
-
- /**
- * Test a bunch of combinations instead of writing a method for each.
- */
- @Test
- public void testBasic() {
- for (final String terminator : TERMINATORS) {
- for (final boolean lastLineTerminated : LAST_LINE_TERMINATED) {
- for (final EmptyLineState emptyLineState : EmptyLineState.values()) {
- if (emptyLineState == EmptyLineState.COMPLETELY_EMPTY) {
- emptyTestHelper(terminator, lastLineTerminated);
- } else {
- testHelper(terminator, lastLineTerminated, emptyLineState);
- }
- }
- }
- }
- }
-
- /**
- * various test cases where there is no input, except perhaps a line terminator
- * @param terminator what the terminator should be in the input
- * @param lastLineTerminated does the input have a terminator
- */
- private void emptyTestHelper(final String terminator, final boolean lastLineTerminated) {
- final String input;
- if (lastLineTerminated) {
- input = terminator;
- } else {
- input = "";
- }
- final StringLineReader slr = new StringLineReader(input);
- final String output = slr.readLine();
- if (lastLineTerminated) {
- Assert.assertEquals(output, "");
- }
- Assert.assertNull(slr.readLine());
- }
-
- /**
- * Test a variety of test cases in which there is more than one line.
- * @param terminator to use in the input
- * @param lastLineTerminated should the input end with a terminator
- * @param emptyLineState where in the input should an empty line be.
- */
- private void testHelper(final String terminator, final boolean lastLineTerminated, final EmptyLineState emptyLineState) {
- final String[] lines = new String[3];
- if (emptyLineState == EmptyLineState.FIRST_LINE) {
- lines[0] = "";
- lines[1] = "Hi, Mom!";
- lines[2] = "Hi, Dad?";
- } else if (emptyLineState == EmptyLineState.LAST_LINE) {
- lines[0] = "Hi, Dad?";
- lines[1] = "Hi, Mom!";
- lines[2] = "";
- } else if (emptyLineState == EmptyLineState.MIDDLE_LINE) {
- lines[0] = "Hi, Dad?";
- lines[1] = "";
- lines[2] = "Hi, Mom!";
- }
- String input = StringUtil.join(terminator, lines);
- if (lastLineTerminated) {
- input = input.concat(terminator);
- }
- final StringLineReader slr = new StringLineReader(input);
- for (int i = 0; i < lines.length - 1; ++i) {
- final String s = slr.readLine();
- String expected = lines[i];
- Assert.assertEquals(s, expected);
- }
-
- // Last line may need to be handled specially
- String s = slr.readLine();
- if (!lastLineTerminated && emptyLineState == EmptyLineState.LAST_LINE) {
- Assert.assertNull(s);
- } else {
- String expected = lines[lines.length - 1];
- Assert.assertEquals(s, expected);
- }
- s = slr.readLine();
- Assert.assertNull(s);
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/StringUtilTest.java b/src/test/java/htsjdk/samtools/util/StringUtilTest.java
deleted file mode 100644
index dbb2a07..0000000
--- a/src/test/java/htsjdk/samtools/util/StringUtilTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2009 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author alecw at broadinstitute.org
- */
-public class StringUtilTest {
- @Test(dataProvider = "provider")
- public void testSplit(final String input, final String[] expectedResult, final boolean concatenateExcess) {
- String[] ret = new String[expectedResult.length];
- int tokensExpected;
- for (tokensExpected = 0; tokensExpected < expectedResult.length && expectedResult[tokensExpected] != null;
- ++tokensExpected) {
- }
- final int tokensFound;
- if (concatenateExcess) {
- tokensFound = StringUtil.splitConcatenateExcessTokens(input, ret, ':');
- } else {
- tokensFound = StringUtil.split(input, ret, ':');
- }
- Assert.assertEquals(tokensFound, tokensExpected);
- Assert.assertEquals(ret, expectedResult);
- }
-
- @DataProvider(name="provider")
- public Object[][] splitScenarios() {
- return new Object[][] {
- {"A:BB:C", new String[]{"A", "BB", "C"}, false},
- {"A:BB:C", new String[]{"A", "BB", "C"}, true},
- {"A:BB", new String[]{"A", "BB", null}, false},
- {"A:BB", new String[]{"A", "BB", null}, true},
- {"A:BB:", new String[]{"A", "BB", null}, false},
- {"A:BB:", new String[]{"A", "BB", null}, true},
- {"A:BB:C:DDD", new String[]{"A", "BB", "C"}, false},
- {"A:BB:C:DDD", new String[]{"A", "BB", "C:DDD"}, true},
- {"A:", new String[]{"A", null, null}, false},
- {"A:", new String[]{"A", null, null}, true},
- {"A", new String[]{"A", null, null}, false},
- {"A", new String[]{"A", null, null}, true},
- {"A:BB:C", new String[]{"A", "BB", "C"}, false},
- {"A:BB:C:", new String[]{"A", "BB", "C:"}, true},
- };
- }
-
- @DataProvider(name="withinHammingDistanceProvider")
- public Object[][] isWithinHammingDistanceProvider() {
- return new Object[][] {
- {"ATAC", "GCAT", 3, true},
- {"ATAC", "GCAT", 2, false},
- {"ATAC", "GCAT", 1, false},
- {"ATAC", "GCAT", 0, false}
- };
- }
-
- @Test(dataProvider = "withinHammingDistanceProvider")
- public void testIsWithinHammingDistance(final String s1, final String s2, final int maxHammingDistance, final boolean expectedResult) {
- Assert.assertEquals(StringUtil.isWithinHammingDistance(s1, s2, maxHammingDistance), expectedResult);
- }
-
- @DataProvider(name="withinHammingDistanceExceptionProvider")
- public Object[][] isWithinHammingDistanceException() {
- return new Object[][] {
- {"ATAC", "GCT" , 3},
- {"ATAC", "AT" , 2},
- {"ATAC", "T" , 1},
- {"" , "GCAT", 0}
- };
- }
-
- @Test(dataProvider = "withinHammingDistanceExceptionProvider", expectedExceptions = IllegalArgumentException.class)
- public void testIsWithinHammingDistanceExceptions(final String s1, final String s2, final int maxHammingDistance) {
- StringUtil.isWithinHammingDistance(s1, s2, maxHammingDistance);
- }
-
- @Test(dataProvider = "withinHammingDistanceExceptionProvider", expectedExceptions = IllegalArgumentException.class)
- public void testHammingDistanceExceptions(final String s1, final String s2, final int maxHammingDistance) {
- StringUtil.hammingDistance(s1, s2);
- }
-
- @DataProvider(name="hammingDistanceProvider")
- public Object[][] hammingDistance() {
- return new Object[][] {
- {"ATAC" , "GCAT" , 3},
- {"ATAGC", "ATAGC", 0},
- {"ATAC" , "atac" , 4}, // Hamming distance is case sensitive.
- {"" , "" , 0}, // Two empty strings should have Hamming distance of 0.
- {"nAGTN", "nAGTN", 0} // Ensure that matching Ns are not counted as mismatches.
- };
- }
-
- @Test(dataProvider = "hammingDistanceProvider")
- public void testHammingDistance(final String s1, final String s2, final int expectedResult) {
- Assert.assertEquals(StringUtil.hammingDistance(s1, s2), expectedResult);
- }
-
-}
diff --git a/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java b/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java
deleted file mode 100644
index 12cffc6..0000000
--- a/src/test/java/htsjdk/samtools/util/TrimmingUtilTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2016 Tim Fennell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests for a simple phred-style quality trimming algorithm.
- */
-public class TrimmingUtilTest {
- @Test
- public void testEasyCases() {
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30,30,30, 2, 2, 2, 2, 2), 15), 5);
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30,30,30,30,30,30,30,30), 15), 10);
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 15), 0);
- }
-
- @Test
- public void testBoundaryCasesForTrimQual() {
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 11), 10);
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 12), 10);
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(12,12,12,12,12,12,12,12,12,12), 13), 0);
- }
-
- @Test
- public void testLowQualityWithOccasionalHighQuality() {
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30,30,30, 2, 5, 2, 3,20, 2, 6), 15), 3);
- }
-
- @Test
- public void testAlternatingHighAndLowQuality() {
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(30, 2,30, 2,30, 2,30, 2,30, 2), 15), 9);
- }
- @Test
- public void testEmptyQuals() {
- Assert.assertEquals(TrimmingUtil.findQualityTrimPoint(byteArray(), 15), 0);
- }
-
- /** Makes a byte[] from a variable length argument list of ints. */
- byte[] byteArray(final int... ints) {
- final byte[] bytes = new byte[ints.length];
- for (int i=0; i<bytes.length; ++i) {
- bytes[i] = (byte) ints[i];
- }
-
- return bytes;
- }
-}
diff --git a/src/test/java/htsjdk/samtools/util/TupleTest.java b/src/test/java/htsjdk/samtools/util/TupleTest.java
deleted file mode 100644
index bed4550..0000000
--- a/src/test/java/htsjdk/samtools/util/TupleTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.samtools.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 1/29/16.
- */
-public class TupleTest {
-
- @Test
- public void testEquals() throws Exception {
- Assert.assertEquals(new Tuple<>(1, "hi"), new Tuple<>(1, "hi"));
-
- Assert.assertEquals(new Tuple<>(1, null), new Tuple<>(1, null));
- Assert.assertEquals(new Tuple<>(null, "hi"), new Tuple<>(null, "hi"));
- Assert.assertEquals(new Tuple<>(null, null), new Tuple<>(null, null));
-
-
- Assert.assertNotSame(new Tuple<Integer, Integer>(1, null), new Tuple<Integer, String>(1, null));
- Assert.assertNotSame(new Tuple<Integer, String>(null, "hi"), new Tuple<String, String>(null, "hi"));
- Assert.assertNotSame(new Tuple<Integer, Integer>(null, null), new Tuple<Integer, String>(null, null));
-
-
- Assert.assertNotSame(new Tuple<>(1, "hi"), new Tuple<>(1, "bye"));
- Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(1, "hi"));
- Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(1, null));
- Assert.assertNotSame(new Tuple<>(2, "hi"), new Tuple<>(null, "hi"));
-
- }
-
- @Test
- public void testHashCode() throws Exception {
- Assert.assertEquals(new Tuple<>(1, "hi").hashCode(), new Tuple<>(1, "hi").hashCode());
-
- Assert.assertEquals(new Tuple<>(1, null).hashCode(), new Tuple<>(1, null).hashCode());
- Assert.assertEquals(new Tuple<>(null, "hi").hashCode(), new Tuple<>(null, "hi").hashCode());
- Assert.assertEquals(new Tuple<>(null, null).hashCode(), new Tuple<>(null, null).hashCode());
-
- //even though these are of different types, the value is null and so I have to make these equal...
- Assert.assertEquals(new Tuple<Integer, Integer>(1, null).hashCode(), new Tuple<Integer, String>(1, null).hashCode());
- Assert.assertEquals(new Tuple<Integer, String>(null, "hi").hashCode(), new Tuple<String, String>(null, "hi").hashCode());
- Assert.assertEquals(new Tuple<Integer, Integer>(null, null).hashCode(), new Tuple<Integer, String>(null, null).hashCode());
-
- Assert.assertNotSame(new Tuple<>(1, "hi").hashCode(), new Tuple<>(1, "bye").hashCode());
- Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(1, "hi").hashCode());
- Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(1, null).hashCode());
- Assert.assertNotSame(new Tuple<>(2, "hi").hashCode(), new Tuple<>(null, "hi").hashCode());
-
- }
-
- @Test
- public void testToString() throws Exception {
- Assert.assertEquals(new Tuple<>(1, 2).toString(), "[1, 2]");
- Assert.assertEquals(new Tuple<>(1, "hi!").toString(), "[1, hi!]");
- Assert.assertEquals(new Tuple<>(1, new Tuple<>(2, 3)).toString(), "[1, [2, 3]]");
-
- Assert.assertEquals(new Tuple<>(1, null).toString(), "[1, null]");
- Assert.assertEquals(new Tuple<>(null, null).toString(), "[null, null]");
-
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java b/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java
deleted file mode 100644
index 6d65e9d..0000000
--- a/src/test/java/htsjdk/tribble/AbstractFeatureReaderTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import static org.testng.Assert.*;
-
-/**
- * @author jacob
- * @date 2013-Apr-10
- */
-public class AbstractFeatureReaderTest {
-
- final static String HTTP_INDEXED_VCF_PATH = TestUtil.BASE_URL_FOR_HTTP_TESTS + "ex2.vcf";
- final static String LOCAL_MIRROR_HTTP_INDEXED_VCF_PATH = VariantBaseTest.variantTestDataRoot + "ex2.vcf";
-
- /**
- * Asserts readability and correctness of VCF over HTTP. The VCF is indexed and requires and index.
- */
- @Test
- public void testVcfOverHTTP() throws IOException {
- final VCFCodec codec = new VCFCodec();
- final AbstractFeatureReader<VariantContext, LineIterator> featureReaderHttp =
- AbstractFeatureReader.getFeatureReader(HTTP_INDEXED_VCF_PATH, codec, true); // Require an index to
- final AbstractFeatureReader<VariantContext, LineIterator> featureReaderLocal =
- AbstractFeatureReader.getFeatureReader(LOCAL_MIRROR_HTTP_INDEXED_VCF_PATH, codec, false);
- final CloseableTribbleIterator<VariantContext> localIterator = featureReaderLocal.iterator();
- for (final Feature feat : featureReaderHttp.iterator()) {
- assertEquals(feat.toString(), localIterator.next().toString());
- }
- assertFalse(localIterator.hasNext());
- }
-
- @Test
- public void testLoadBEDFTP() throws Exception {
- final String path = "ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands with spaces.hg18.bed";
- final BEDCodec codec = new BEDCodec();
- final AbstractFeatureReader<BEDFeature, LineIterator> bfs = AbstractFeatureReader.getFeatureReader(path, codec, false);
- for (final Feature feat : bfs.iterator()) {
- assertNotNull(feat);
- }
- }
-
- @DataProvider(name = "blockCompressedExtensionExtensionStrings")
- public Object[][] createBlockCompressedExtensionStrings() {
- return new Object[][] {
- { "testzip.gz", true },
- { "test.gzip", true },
- { "test.bgz", true },
- { "test.bgzf", true },
- { "test.bzip2", false }
- };
- }
-
- @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionStrings")
- public void testBlockCompressionExtensionString(final String testString, final boolean expected) {
- Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(testString), expected);
- }
-
- @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionStrings")
- public void testBlockCompressionExtensionFile(final String testString, final boolean expected) {
- Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(new File(testString)), expected);
- }
-
- @DataProvider(name = "blockCompressedExtensionExtensionURIStrings")
- public Object[][] createBlockCompressedExtensionURIs() {
- return new Object[][]{
- {"testzip.gz", true},
- {"test.gzip", true},
- {"test.bgz", true},
- {"test.bgzf", true},
- {"test", false},
- {"test.bzip2", false},
-
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877", false},
-
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2?alt=media", false},
-
- {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.gz", true},
- {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.bed", false}
- };
- }
-
- @Test(enabled = true, dataProvider = "blockCompressedExtensionExtensionURIStrings")
- public void testBlockCompressionExtension(final String testURIString, final boolean expected) throws URISyntaxException {
- URI testURI = URI.create(testURIString);
- Assert.assertEquals(AbstractFeatureReader.hasBlockCompressedExtension(testURI), expected);
- }
-
-}
diff --git a/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java b/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java
deleted file mode 100644
index eff8939..0000000
--- a/src/test/java/htsjdk/tribble/BinaryFeaturesTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.example.ExampleBinaryCodec;
-import htsjdk.tribble.readers.LineIterator;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class BinaryFeaturesTest {
- @DataProvider(name = "BinaryFeatureSources")
- public Object[][] createData1() {
- return new Object[][] {
- { new File(TestUtils.DATA_DIR + "test.bed"), new BEDCodec() },
- { new File(TestUtils.DATA_DIR + "bed/Unigene.sample.bed"), new BEDCodec() },
- { new File(TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed"), new BEDCodec() },
- };
- }
-
- @Test(enabled = true, dataProvider = "BinaryFeatureSources")
- public void testBinaryCodec(final File source, final FeatureCodec<Feature, LineIterator> codec) throws IOException {
- final File tmpFile = File.createTempFile("testBinaryCodec", ".binary.bed");
- ExampleBinaryCodec.convertToBinaryTest(source, tmpFile, codec);
- tmpFile.deleteOnExit();
-
- final FeatureReader<Feature> originalReader = AbstractFeatureReader.getFeatureReader(source.getAbsolutePath(), codec, false);
- final FeatureReader<Feature> binaryReader = AbstractFeatureReader.getFeatureReader(tmpFile.getAbsolutePath(), new ExampleBinaryCodec(), false);
-
- // make sure the header is what we expect
- final List<String> header = (List<String>) binaryReader.getHeader();
- Assert.assertEquals(header.size(), 1, "We expect exactly one header line");
- Assert.assertEquals(header.get(0), ExampleBinaryCodec.HEADER_LINE, "Failed to read binary header line");
-
- final Iterator<Feature> oit = originalReader.iterator();
- final Iterator<Feature> bit = binaryReader.iterator();
- while ( oit.hasNext() ) {
- final Feature of = oit.next();
-
- Assert.assertTrue(bit.hasNext(), "Original iterator has items, but there's no items left in binary iterator");
- final Feature bf = bit.next();
-
- Assert.assertEquals(bf.getContig(), of.getContig(), "Chr not equal between original and binary encoding");
- Assert.assertEquals(bf.getStart(), of.getStart(), "Start not equal between original and binary encoding");
- Assert.assertEquals(bf.getEnd(), of.getEnd(), "End not equal between original and binary encoding");
- }
- Assert.assertTrue(! bit.hasNext(), "Original iterator is done, but there's still some data in binary iterator");
-
- originalReader.close();
- binaryReader.close();
- }
-
- @Test(expectedExceptions = TribbleException.class)
- public void testGetTabixFormatThrowsException() {
- new ExampleBinaryCodec().getTabixFormat();
- }
-}
diff --git a/src/test/java/htsjdk/tribble/FeatureReaderTest.java b/src/test/java/htsjdk/tribble/FeatureReaderTest.java
deleted file mode 100644
index d62693c..0000000
--- a/src/test/java/htsjdk/tribble/FeatureReaderTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.samtools.seekablestream.SeekableFileStream;
-import htsjdk.samtools.util.CloserUtil;
-import htsjdk.samtools.util.LocationAware;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.example.ExampleBinaryCodec;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.util.ParsingUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class FeatureReaderTest {
- private final static File asciiBedFile = new File(TestUtils.DATA_DIR + "test.bed");
- private File binaryBedFile;
- private final static File tabixBedFile = new File(TestUtils.DATA_DIR + "test.tabix.bed.gz");
-
- @BeforeClass
- public void setup() throws IOException {
- binaryBedFile = File.createTempFile("htsjdk-test.featurereader", ".bed");
- binaryBedFile.deleteOnExit();
- ExampleBinaryCodec.convertToBinaryTest(asciiBedFile, binaryBedFile, new BEDCodec());
- }
-
- @AfterClass
- public void tearDown() throws Exception {
- binaryBedFile.delete();
- }
-
- @DataProvider(name = "indexProvider")
- public Object[][] createData1() {
- return new Object[][]{
- {asciiBedFile, IndexFactory.IndexType.LINEAR, new BEDCodec()},
- {asciiBedFile, IndexFactory.IndexType.INTERVAL_TREE, new BEDCodec()},
- {tabixBedFile, IndexFactory.IndexType.TABIX, new BEDCodec()},
- {binaryBedFile, IndexFactory.IndexType.LINEAR, new ExampleBinaryCodec()},
- {binaryBedFile, IndexFactory.IndexType.INTERVAL_TREE, new ExampleBinaryCodec()},
- };
- }
-
- @Test(dataProvider = "indexProvider")
- public void testBedQuery(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
- final AbstractFeatureReader<Feature, ?> reader = getReader(featureFile, indexType, codec);
-
- // Query
- testQuery(reader, "chr1", 1, 500, 3);
- testQuery(reader, "chr1", 1, 200, 1);
- testQuery(reader, "chr1", 1, 201, 2);
- testQuery(reader, "chr1", 500, 600, 0);
- testQuery(reader, "chr1", 100000, 100010, 1);
- testQuery(reader, "chr1", 100000, 100000, 0);
- testQuery(reader, "chr1", 100001, 100001, 1);
- testQuery(reader, "chr1", 100005, 100006, 1);
- testQuery(reader, "chr1", 100009, 100011, 1);
- testQuery(reader, "chr1", 100010, 100010, 1);
- testQuery(reader, "chr1", 100011, 100011, 0);
- testQuery(reader, "chr2", 1, 100, 2);
- testQuery(reader, "chr2", 1, 10, 1);
- testQuery(reader, "chr2", 15, 16, 0);
- testQuery(reader, "chr3", 1, 201, 0);
-
- // Close reader
- reader.close();
- }
-
- @Test(dataProvider = "indexProvider")
- public void testLargeNumberOfQueries(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
- final AbstractFeatureReader<Feature, LocationAware> reader = getReader(featureFile, indexType, codec);
- for (int i = 0; i < 2000; i++) {
- for (final int start : Arrays.asList(500, 200, 201, 600, 100000)) {
- for (final String chr : Arrays.asList("chr1", "chr2", "chr3")) {
- CloseableTribbleIterator<Feature> iter = null;
- try {
- iter = reader.query(chr, start, start + 1);
- Assert.assertNotNull(iter, "Failed to create non-null iterator");
- } finally {
- CloserUtil.close(iter);
- }
- }
- }
- }
-
- // Close reader
- reader.close();
- }
-
- private void testQuery(final AbstractFeatureReader<Feature, ?> reader, final String chr, final int start, final int stop, final int expectedNumRecords) throws IOException {
- final Iterator<Feature> iter = reader.query(chr, start, stop);
- int count = 0;
- while (iter.hasNext()) {
- final Feature f = iter.next();
- Assert.assertTrue(f.getEnd() >= start && f.getStart() <= stop);
- count++;
- }
- Assert.assertEquals(count, expectedNumRecords);
- }
-
- @Test(dataProvider = "indexProvider")
- public void testBedNames(final File featureFile, final IndexFactory.IndexType indexType, final FeatureCodec<Feature, LocationAware> codec) throws IOException {
- final AbstractFeatureReader<Feature, ?> reader = getReader(featureFile, indexType, codec);
- final String[] expectedSequences = {"chr1", "chr2"};
-
- final List<String> seqNames = reader.getSequenceNames();
- Assert.assertEquals(seqNames.size(), expectedSequences.length,
- "Expected sequences " + ParsingUtils.join(",", expectedSequences) + " but saw " + ParsingUtils.join(",", seqNames));
-
- for (final String s : expectedSequences) {
- Assert.assertTrue(seqNames.contains(s));
- }
- }
-
- private static <FEATURE extends Feature, SOURCE extends LocationAware> AbstractFeatureReader<FEATURE, SOURCE> getReader(final File featureFile,
- final IndexFactory.IndexType indexType,
- final FeatureCodec<FEATURE, SOURCE> codec)
- throws IOException {
- if (indexType.canCreate()) {
- // for types we can create make a new index each time
- final File idxFile = Tribble.indexFile(featureFile);
-
- // delete an already existing index
- if (idxFile.exists()) {
- idxFile.delete();
- }
- final Index idx = IndexFactory.createIndex(featureFile, codec, indexType);
- idx.write(idxFile);
-
- idxFile.deleteOnExit();
- } // else let's just hope the index exists, and if so use it
-
- return AbstractFeatureReader.getFeatureReader(featureFile.getAbsolutePath(), codec);
- }
-
- @Test
- public void testReadingBeyondIntSizedBlock() throws IOException {
- final Block block = new Block(0, ((long) Integer.MAX_VALUE) * 2);
- final SeekableFileStream stream = new SeekableFileStream(new File("/dev/zero"));
- final TribbleIndexedFeatureReader.BlockStreamWrapper blockStreamWrapper = new TribbleIndexedFeatureReader.BlockStreamWrapper(stream, block);
- final int chunkSize = 100000; // 10 Mb
- final int chunksToRead = (int) Math.ceil(block.getSize() / (chunkSize * 1.0));
-
- final byte[] bytes = new byte[chunkSize];
- long totalRead = 0;
- for (int chunk = 0; chunk < chunksToRead; chunk++) {
- //System.out.println("Reading chunk " + chunk + " of " + chunkSize + " total read " + totalRead);
- final int nRead = blockStreamWrapper.read(bytes);
- Assert.assertTrue(nRead != -1, "Prematurely got EOF after " + totalRead + " bytes");
- totalRead += nRead;
- }
-
- // /dev/zero doesn't advance file stream on Linux, so reading never terminates
- // Therefore, we only require a minimum number of bytes
- Assert.assertTrue(totalRead >= block.getSize(), "Failed to read all bytes from a block with size > 2B = " + block.getSize());
-
- }
-}
-
diff --git a/src/test/java/htsjdk/tribble/TestUtils.java b/src/test/java/htsjdk/tribble/TestUtils.java
deleted file mode 100644
index f686d25..0000000
--- a/src/test/java/htsjdk/tribble/TestUtils.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/** This software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.tribble;
-
-
-/**
- * User: jacob
- * Date: 2012-Dec-13
- */
-public class TestUtils {
- public static String DATA_DIR = "src/test/resources/htsjdk/tribble/";
-}
diff --git a/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java b/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java
deleted file mode 100644
index afdd827..0000000
--- a/src/test/java/htsjdk/tribble/TribbleIndexFeatureReaderTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.readers.LineIterator;
-import htsjdk.tribble.TestUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import static org.testng.Assert.assertEquals;
-
-
-public class TribbleIndexFeatureReaderTest {
-
- @DataProvider(name = "extensionURIStrings")
- public Object[][] createBlockCompressedExtensionURIs() {
- return new Object[][]{
- {"testzip.gz", true},
- {"testzip.GZ", true},
- {"testzip.gZ", true},
- {"testzip.Gz", true},
-
- {"test", false},
- {"test.gzip", false},
- {"test.bgz", false},
- {"test.bgzf", false},
- {"test.bzip2", false},
-
- {"file://testzip.gz", true},
- {"file://apath/testzip.gz", true},
-
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.GZ", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877", false},
-
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.GZ?alt=media", true},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gzip?alt=media", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgz?alt=media", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bgzf?alt=media", false},
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.bzip2?alt=media", false},
-
- {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.gz", true},
- {"ftp://ftp.broadinstitute.org/distribution/igv/TEST/cpgIslands.hg18.bed", false},
-
- {"https://www.googleapis.com/download/storage/v1/b/deflaux-public-test/o/NA12877.vcf.gz", true},
- };
- }
-
- @Test(enabled = true, dataProvider = "extensionURIStrings")
- public void testGZExtension(final String testString, final boolean expected) throws URISyntaxException {
- Assert.assertEquals(TribbleIndexedFeatureReader.isGZIPPath(testString), expected);
- }
-
- @DataProvider(name = "featureFileStrings")
- public Object[][] createFeatureFileStrings() {
- return new Object[][]{
- {TestUtils.DATA_DIR + "test.vcf", 5},
- {TestUtils.DATA_DIR + "test.vcf.gz", 5},
- {TestUtils.DATA_DIR + "test.vcf.bgz", 5},
- {TestUtils.DATA_DIR + "test with spaces.vcf", 5}
- };
- }
-
- @Test(dataProvider = "featureFileStrings")
- public void testIndexedGZIPVCF(final String testPath, final int expectedCount) throws IOException {
- final VCFCodec codec = new VCFCodec();
- try (final TribbleIndexedFeatureReader<VariantContext, LineIterator> featureReader =
- new TribbleIndexedFeatureReader(testPath, codec, false)) {
- final CloseableTribbleIterator<VariantContext> localIterator = featureReader.iterator();
- int count = 0;
- for (final Feature feat : featureReader.iterator()) {
- localIterator.next();
- count++;
- }
- Assert.assertEquals(count, expectedCount);
- }
- }
-
-}
diff --git a/src/test/java/htsjdk/tribble/TribbleTest.java b/src/test/java/htsjdk/tribble/TribbleTest.java
deleted file mode 100644
index e8366c4..0000000
--- a/src/test/java/htsjdk/tribble/TribbleTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.tribble;
-
-import htsjdk.tribble.util.TabixUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-
-public class TribbleTest {
-
- @Test
- public void testStandardIndex() {
-
- final String vcf = "foo.vcf";
- final String expectedIndex = vcf + Tribble.STANDARD_INDEX_EXTENSION;
-
- Assert.assertEquals(Tribble.indexFile(vcf), expectedIndex);
- Assert.assertEquals(Tribble.indexFile(new File(vcf).getAbsolutePath()), new File(expectedIndex).getAbsolutePath());
- }
-
- @Test
- public void testTabixIndex() {
-
- final String vcf = "foo.vcf.gz";
- final String expectedIndex = vcf + TabixUtils.STANDARD_INDEX_EXTENSION;
-
- Assert.assertEquals(Tribble.tabixIndexFile(vcf), expectedIndex);
- Assert.assertEquals(Tribble.tabixIndexFile(new File(vcf).getAbsolutePath()), new File(expectedIndex).getAbsolutePath());
- }
-}
diff --git a/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java b/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java
deleted file mode 100644
index dbf23a0..0000000
--- a/src/test/java/htsjdk/tribble/bed/BEDCodecTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (c) 2010, The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package htsjdk.tribble.bed;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Feature;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.annotation.Strand;
-import htsjdk.tribble.bed.FullBEDFeature.Exon;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.awt.*;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.List;
-
-public class BEDCodecTest {
-
- @Test
- public void testSimpleDecode() {
- BEDCodec codec = new BEDCodec();
-
- BEDFeature feature;
-
- feature = codec.decode("chr1 1");
- Assert.assertEquals(feature.getContig(), "chr1");
- Assert.assertEquals(feature.getStart(), 2);
- Assert.assertEquals(feature.getEnd(), 2);
-
- feature = codec.decode("chr1 1 2");
- Assert.assertEquals(feature.getContig(), "chr1");
- Assert.assertEquals(feature.getStart(), 2);
- Assert.assertEquals(feature.getEnd(), 2);
-
- feature = codec.decode("chr1 1 3");
- Assert.assertEquals(feature.getContig(), "chr1");
- Assert.assertEquals(feature.getStart(), 2);
- Assert.assertEquals(feature.getEnd(), 3);
- }
-
- @Test
- public void testFullDecode() {
- BEDCodec codec = new BEDCodec();
-
- FullBEDFeature feature;
- List<Exon> exons;
-
- // Borrowed samples from Example: on http://genome.ucsc.edu/FAQ/FAQformat#format1
-
- feature = (FullBEDFeature) codec.decode("chr22 1000 5000 cloneA 960 + 1000 5000 0 2 567,488, 0,3512");
- Assert.assertEquals(feature.getContig(), "chr22");
- Assert.assertEquals(feature.getStart(), 1001);
- Assert.assertEquals(feature.getEnd(), 5000);
- Assert.assertEquals(feature.getName(), "cloneA");
- Assert.assertEquals(feature.getScore(), 960f);
- Assert.assertEquals(feature.getStrand(), Strand.POSITIVE);
- Assert.assertEquals(feature.getColor(), new Color(0));
-
- exons = feature.getExons();
- Assert.assertEquals(exons.size(), 2);
-
- Assert.assertEquals(exons.get(0).getNumber(), 1);
- Assert.assertEquals(exons.get(0).start, 1001);
- Assert.assertEquals(exons.get(0).end, 1567);
- Assert.assertEquals(exons.get(0).getCdStart(), 1001);
- Assert.assertEquals(exons.get(0).getCdEnd(), 1567);
- Assert.assertEquals(exons.get(0).getCodingLength(), 567);
-
- Assert.assertEquals(exons.get(1).getNumber(), 2);
- Assert.assertEquals(exons.get(1).start, 4513);
- Assert.assertEquals(exons.get(1).end, 5000);
- Assert.assertEquals(exons.get(1).getCdStart(), 4513);
- Assert.assertEquals(exons.get(1).getCdEnd(), 5000);
- Assert.assertEquals(exons.get(1).getCodingLength(), 488);
-
- feature = (FullBEDFeature) codec.decode("chr22 2000 6000 cloneB 900 - 2000 6000 0 2 433,399, 0,3601");
- Assert.assertEquals(feature.getContig(), "chr22");
- Assert.assertEquals(feature.getStart(), 2001);
- Assert.assertEquals(feature.getEnd(), 6000);
- Assert.assertEquals(feature.getName(), "cloneB");
- Assert.assertEquals(feature.getScore(), 900f);
- Assert.assertEquals(feature.getStrand(), Strand.NEGATIVE);
- Assert.assertEquals(feature.getColor(), new Color(0));
-
- exons = feature.getExons();
- Assert.assertEquals(exons.size(), 2);
-
- Assert.assertEquals(exons.get(0).getNumber(), 2);
- Assert.assertEquals(exons.get(0).start, 2001);
- Assert.assertEquals(exons.get(0).end, 2433);
- Assert.assertEquals(exons.get(0).getCdStart(), 2001);
- Assert.assertEquals(exons.get(0).getCdEnd(), 2433);
- Assert.assertEquals(exons.get(0).getCodingLength(), 433);
-
- Assert.assertEquals(exons.get(1).getNumber(), 1);
- Assert.assertEquals(exons.get(1).start, 5602);
- Assert.assertEquals(exons.get(1).end, 6000);
- Assert.assertEquals(exons.get(1).getCdStart(), 5602);
- Assert.assertEquals(exons.get(1).getCdEnd(), 6000);
- Assert.assertEquals(exons.get(1).getCodingLength(), 399);
- }
-
- @Test
- public void testDecodeBEDFile_good() throws Exception {
- String filepath = TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed";
- int expected_lines = 34;
- /*
- Line 0:
- 1 25592413 25657872
- Line 3:
- 1 152555536 152587611
- Line 28:
- 14 73996607 74025282
- Remember tribble increments numbers by 1
- */
-
- BEDCodec codec = new BEDCodec();
-
- AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(filepath, codec, false);
-
- Iterable<Feature> iter = reader.iterator();
- int count = 0;
- for (Feature feat : iter) {
- Assert.assertTrue(feat.getContig().length() > 0);
- Assert.assertTrue(feat.getEnd() >= feat.getStart());
-
- if (count == 0) {
- Assert.assertEquals("1", feat.getContig());
- Assert.assertEquals(25592413 + 1, feat.getStart());
- Assert.assertEquals(25657872, feat.getEnd());
- }
-
- if (count == 3) {
- Assert.assertEquals("1", feat.getContig());
- Assert.assertEquals(152555536 + 1, feat.getStart());
- Assert.assertEquals(152587611, feat.getEnd());
- }
-
- if (count == 28) {
- Assert.assertEquals("14", feat.getContig());
- Assert.assertEquals(73996607 + 1, feat.getStart());
- Assert.assertEquals(74025282, feat.getEnd());
- }
-
- count += 1;
- }
-
- Assert.assertEquals(expected_lines, count);
-
- reader.close();
-
- }
-
- /**
- * Test reading a BED file which is malformed.
- *
- * @throws Exception
- */
- @Test(expectedExceptions = RuntimeException.class)
- public void testDecodeBEDFile_bad() throws Exception {
- //This file has an extra tab in the second to last line
- String filepath = TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed";
- //The iterator implementation next() actually performs a get / read_next. The bad line is number 32,
- //so we actually will only get 31 lines before reading that line.
- int expected_count = 31;
- BEDCodec codec = new BEDCodec();
-
- AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(filepath, codec, false);
-
- Iterable<Feature> iter = reader.iterator();
- int count = 0;
- for (Feature feat : iter) {
- count += 1;
- }
- reader.close();
- }
-
- private void createIndex(File testFile, File idxFile) throws IOException {
- // Create an index if missing
- if (idxFile.exists()) {
- idxFile.delete();
- }
- LinearIndex idx = (LinearIndex) IndexFactory.createLinearIndex(testFile, new BEDCodec());
-
- LittleEndianOutputStream stream = null;
- try {
- stream = new LittleEndianOutputStream(new BufferedOutputStream(new FileOutputStream(idxFile)));
- idx.write(stream);
- } finally {
- if (stream != null) {
- stream.close();
- }
- }
- }
-
- @Test
- public void testGetTabixFormat() {
- Assert.assertEquals(new BEDCodec().getTabixFormat(), TabixFormat.BED);
- }
-
- @Test
- public void testCanDecode() {
- final BEDCodec codec = new BEDCodec();
- final String pattern = "filename.%s%s";
- for(final String bcExt: AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
- Assert.assertTrue(codec.canDecode(String.format(pattern, "bed", bcExt)));
- Assert.assertFalse(codec.canDecode(String.format(pattern, "vcf", bcExt)));
- Assert.assertFalse(codec.canDecode(String.format(pattern, "bed.gzip", bcExt)));
- }
- }
-}
diff --git a/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java b/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java
deleted file mode 100644
index c670bf1..0000000
--- a/src/test/java/htsjdk/tribble/gelitext/GeliTextTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package htsjdk.tribble.gelitext;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-
-/**
- * @author aaron
- * <p/>
- * Class GeliTextTest
- * <p/>
- * test out the geli text source codec and feature
- */
- at Deprecated
-public class GeliTextTest {
- public static final File testFile = new File(TestUtils.DATA_DIR + "testGeliText.txt");
- public static Index index;
- private FeatureReader<GeliTextFeature> source;
-
- // setup a new source before each class
-
- @BeforeSuite
- public void beforeTest() {
- index = IndexFactory.createLinearIndex(testFile, new GeliTextCodec());
- source = AbstractFeatureReader.getFeatureReader(testFile.getAbsolutePath(), new GeliTextCodec(), index);
- }
-
- @Test
- public void testReadAllLines() {
- // Query
- try {
- Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14592250);
- int count = 0;
- while (iter.hasNext()) {
- GeliTextFeature feat = iter.next();
- count++;
- }
- Assert.assertEquals(count, 50);
- } catch (IOException e) {
- Assert.fail("failed to generate iterator from feature source");
- }
- }
-
- @Test
- public void testGetSubRegion() {
- // Query
- try {
- Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14539060); // should be the first 41 records
- int count = 0;
- while (iter.hasNext()) {
- GeliTextFeature feat = iter.next();
- count++;
- }
- Assert.assertEquals(count, 41);
- } catch (IOException e) {
- Assert.fail("failed to generate iterator from feature source");
- }
- }
-
- @Test
- public void testFirstRecord() {
- // Query
- try {
- Iterator<GeliTextFeature> iter = source.query("22", 14438070, 14592250);
- int count = 0;
-
- GeliTextFeature feat = iter.next();
- // check the first records contents
- // 22 14438070 A 0 0 GG 33.2618 33.2618 0 0 0 0 0 0 0 33.2618 0 0
- Assert.assertTrue("22".equals(feat.getContig()));
- Assert.assertEquals(feat.getStart(), 14438070);
- Assert.assertEquals('A', feat.getRefBase());
- Assert.assertEquals(feat.getDepthOfCoverage(), 0.0, 0.0001);
- Assert.assertEquals(feat.getMaximumMappingQual(), 0.0, 0.0001);
- Assert.assertTrue(DiploidGenotype.GG.equals(feat.getGenotype()));
- Assert.assertEquals(feat.getDepthOfCoverage(), 0.0, 0.0001);
- Assert.assertEquals(feat.getLODBestToReference(), 33.2618, 0.0001);
- Assert.assertEquals(feat.getLODBestToNext(), 33.2618, 0.0001);
- for (int x = 0; x < feat.getLikelihoods().length; x++) {
- if (x == DiploidGenotype.GG.ordinal())
- Assert.assertEquals(feat.getLikelihoods()[x], 33.2618, 0.0001);
- else
- Assert.assertEquals(feat.getLikelihoods()[x], 0, 0.0001);
- }
-
- } catch (IOException e) {
- Assert.fail("failed to generate iterator from feature source");
- }
- }
-}
diff --git a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java b/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java
deleted file mode 100644
index 016049f..0000000
--- a/src/test/java/htsjdk/tribble/index/IndexFactoryTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2013 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-
-/**
- * User: jacob
- * Date: 2012-Aug-23
- */
-public class IndexFactoryTest {
-
- final File sortedBedFile = new File(TestUtils.DATA_DIR + "bed/Unigene.sample.bed");
- final File unsortedBedFile = new File(TestUtils.DATA_DIR + "bed/unsorted.bed");
- final File discontinuousFile = new File(TestUtils.DATA_DIR + "bed/disconcontigs.bed");
- final BEDCodec bedCodec = new BEDCodec();
-
- @Test
- public void testCreateLinearIndex() throws Exception {
- Index index = IndexFactory.createLinearIndex(sortedBedFile, bedCodec);
- String chr = "chr2";
-
- Assert.assertTrue(index.getSequenceNames().contains(chr));
- Assert.assertTrue(index.containsChromosome(chr));
- Assert.assertEquals(1, index.getSequenceNames().size());
- List<Block> blocks = index.getBlocks(chr, 1, 50);
- Assert.assertEquals(1, blocks.size());
-
- Block block = blocks.get(0);
- Assert.assertEquals(78, block.getSize());
- }
-
- @Test(expectedExceptions = TribbleException.MalformedFeatureFile.class, dataProvider = "indexFactoryProvider")
- public void testCreateIndexUnsorted(IndexFactory.IndexType type) throws Exception{
- Index index = IndexFactory.createIndex(unsortedBedFile, bedCodec, type);
- }
-
- @Test(expectedExceptions = TribbleException.MalformedFeatureFile.class, dataProvider = "indexFactoryProvider")
- public void testCreateIndexDiscontinuousContigs(IndexFactory.IndexType type) throws Exception{
- Index index = IndexFactory.createIndex(discontinuousFile, bedCodec, type);
- }
-
- @DataProvider(name = "indexFactoryProvider")
- public Object[][] getIndexFactoryTypes(){
- return new Object[][] {
- new Object[] { IndexFactory.IndexType.LINEAR },
- new Object[] { IndexFactory.IndexType.INTERVAL_TREE }
- };
- }
-
- @Test
- public void testCreateTabixIndexOnBlockCompressed() {
- // index a VCF
- final File inputFileVcf = new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf");
- final VCFFileReader readerVcf = new VCFFileReader(inputFileVcf, false);
- final SAMSequenceDictionary vcfDict = readerVcf.getFileHeader().getSequenceDictionary();
- final TabixIndex tabixIndexVcf =
- IndexFactory.createTabixIndex(inputFileVcf, new VCFCodec(), TabixFormat.VCF,
- vcfDict);
-
- // index the same bgzipped VCF
- final File inputFileVcfGz = new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz");
- final VCFFileReader readerVcfGz = new VCFFileReader(inputFileVcfGz, false);
- final TabixIndex tabixIndexVcfGz =
- IndexFactory.createTabixIndex(inputFileVcfGz, new VCFCodec(), TabixFormat.VCF,
- readerVcfGz.getFileHeader().getSequenceDictionary());
-
- // assert that each sequence in the header that represents some VCF row ended up in the index
- // for both the VCF and bgzipped VCF
- for (SAMSequenceRecord samSequenceRecord : vcfDict.getSequences()) {
- Assert.assertTrue(
- tabixIndexVcf.containsChromosome(samSequenceRecord.getSequenceName()),
- "Tabix indexed VCF does not contain sequence: " + samSequenceRecord.getSequenceName());
-
- Assert.assertTrue(
- tabixIndexVcfGz.containsChromosome(samSequenceRecord.getSequenceName()),
- "Tabix indexed (bgzipped) VCF does not contain sequence: " + samSequenceRecord.getSequenceName());
- }
- }
-}
diff --git a/src/test/java/htsjdk/tribble/index/IndexTest.java b/src/test/java/htsjdk/tribble/index/IndexTest.java
deleted file mode 100644
index aa179a9..0000000
--- a/src/test/java/htsjdk/tribble/index/IndexTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package htsjdk.tribble.index;
-
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.index.linear.LinearIndex;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.vcf.VCFCodec;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class IndexTest {
- private final static String CHR = "1";
- private final static File MassiveIndexFile = new File(TestUtils.DATA_DIR + "Tb.vcf.idx");
-
- @DataProvider(name = "StartProvider")
- public Object[][] makeStartProvider() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
-// for ( int mid = 0; mid <= end; mid += 1000000 ) {
-// tests.add(new Object[]{0, mid, mid+1000000, end});
-// }
-
- tests.add(new Object[]{1226943, 1226943, 1226943, 2000000});
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "StartProvider")
- public void testMassiveQuery(final int start, final int mid, final int mid2, final int end) throws IOException {
- LinearIndex index = (LinearIndex)IndexFactory.loadIndex(MassiveIndexFile.getAbsolutePath());
-
- final List<Block> leftBlocks = index.getBlocks(CHR, start, mid);
- final List<Block> rightBlocks = index.getBlocks(CHR, mid2, end); // gap must be big to avoid overlaps
- final List<Block> allBlocks = index.getBlocks(CHR, start, end);
-
- final long leftSize = leftBlocks.isEmpty() ? 0 : leftBlocks.get(0).getSize();
- final long rightSize = rightBlocks.isEmpty() ? 0 : rightBlocks.get(0).getSize();
- final long allSize = allBlocks.isEmpty() ? 0 : allBlocks.get(0).getSize();
-
- Assert.assertTrue(leftSize >= 0, "Expected leftSize to be positive " + leftSize);
- Assert.assertTrue(rightSize >= 0, "Expected rightSize to be positive " + rightSize);
- Assert.assertTrue(allSize >= 0, "Expected allSize to be positive " + allSize);
-
- Assert.assertTrue(allSize >= Math.max(leftSize,rightSize), "Expected size of joint query " + allSize + " to be at least >= max of left " + leftSize + " and right queries " + rightSize);
- }
-
-
- @DataProvider(name = "writeIndexData")
- public Object[][] writeIndexData() {
- return new Object[][]{
- {new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf"), IndexFactory.IndexType.LINEAR, new VCFCodec()},
- {new File("src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz"), IndexFactory.IndexType.TABIX, new VCFCodec()},
- {new File("src/test/resources/htsjdk/tribble/test.bed"), IndexFactory.IndexType.LINEAR, new BEDCodec()}
- };
- }
-
- private final static OutputStream nullOutputStrem = new OutputStream() {
- @Override
- public void write(int b) throws IOException { }
- };
-
- @Test(dataProvider = "writeIndexData")
- public void testWriteIndex(final File inputFile, final IndexFactory.IndexType type, final FeatureCodec codec) throws Exception {
- // temp index file for this test
- final File tempIndex = File.createTempFile("index", (type == IndexFactory.IndexType.TABIX) ? TabixUtils.STANDARD_INDEX_EXTENSION : Tribble.STANDARD_INDEX_EXTENSION);
- tempIndex.delete();
- tempIndex.deleteOnExit();
- // create the index
- final Index index = IndexFactory.createIndex(inputFile, codec, type);
- Assert.assertFalse(tempIndex.exists());
- // write the index to a file
- index.write(tempIndex);
- Assert.assertTrue(tempIndex.exists());
- // load the generated index
- final Index loadedIndex = IndexFactory.loadIndex(tempIndex.getAbsolutePath());
- // tess that the sequences and properties are the same
- Assert.assertEquals(loadedIndex.getSequenceNames(), index.getSequenceNames());
- Assert.assertEquals(loadedIndex.getProperties(), index.getProperties());
- // test that write to a stream does not blows ip
- index.write(new LittleEndianOutputStream(nullOutputStrem));
- }
-
-}
diff --git a/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java b/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java
deleted file mode 100644
index ca47089..0000000
--- a/src/test/java/htsjdk/tribble/index/interval/IntervalTreeTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.interval;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * User: jrobinso
- * Date: Mar 24, 2010
- */
-public class IntervalTreeTest {
-
- static IntervalTree tree;
-
- @BeforeClass
- public static void setupTree() {
- tree = new IntervalTree();
- tree.insert(new Interval(0, 3, null));
- tree.insert(new Interval(5, 8, null));
- tree.insert(new Interval(6, 10, null));
- tree.insert(new Interval(8, 9, null));
- tree.insert(new Interval(15, 23, null));
- tree.insert(new Interval(16, 21, null));
- tree.insert(new Interval(17, 19, null));
- tree.insert(new Interval(19, 20, null));
- tree.insert(new Interval(25, 30, null));
- tree.insert(new Interval(26, 27, null));
- }
-
- @Test
- public void testSearch() {
-
- final Interval queryInterval = new Interval(1, 2);
- List<Interval> intervals = tree.findOverlapping(queryInterval);
- Assert.assertNotNull(intervals);
-
- for (Interval iv : intervals) {
- Assert.assertTrue(queryInterval.overlaps(iv));
- }
- }
-
- @Test
- public void testBed() throws Exception {
- String bedFile = TestUtils.DATA_DIR + "/index/chrY_Y4_small.bed";
- tree = new IntervalTree();
- Assert.assertTrue(tree.isValid());
-
- BufferedReader br = new BufferedReader(new FileReader(bedFile));
- String nextLine = "";
- while ((nextLine = br.readLine()) != null) {
- if (!(nextLine.startsWith("#") || nextLine.startsWith("track"))) {
- String[] tokens = nextLine.split("\t");
- if (tokens.length > 2) {
- int start = Integer.parseInt(tokens[1]);
- int end = Integer.parseInt(tokens[2]);
- tree.insert(new Interval(start, end));
- }
-
- }
- }
-
-// List iv = (List) tree.findOverlapping(new Interval(2770226, 2770300));
- Interval searchInterval = new Interval(2782632, 2782732);
- List<Interval> iv = tree.findOverlapping(searchInterval);
- for (Interval i : iv) {
- Assert.assertTrue(i.overlaps(searchInterval));
- }
-
- br.close();
-
- }
-
- @Test
- /**
- *
- * chr2 1 200000000 LONG_FEATURE
- * ...
- * chr2 179098961 179380395 Hs.134602
- * chr2 179209546 179287210 Hs.620337
- * chr2 179266309 179266748 Hs.609465
- * chr2 179296428 179300012 Hs.623987
- * chr2 179302952 179303488 Hs.594545
-
- */
- public void testOverlappingFeatures() throws Exception {
- //chr2:179,222,066-179,262,059<- CONTAINS TTN
-
- Set<String> names = new HashSet<String>(Arrays.asList("Hs.134602", "Hs.620337", "Hs.609465", "Hs.623987",
- "Hs.594545", "LONG_FEATURE"));
-
- String bedFile = TestUtils.DATA_DIR + "/bed/Unigene.sample.bed";
- String chr = "chr2";
- int start = 179266309;
- int end = 179303488 ;
- int expectedCount = 6;
-
-
- // Interval tree index
- int batchSize = 1;
- Index idx = IndexFactory.createIntervalIndex(new File(bedFile), new BEDCodec(), batchSize);
-
- FeatureReader<BEDFeature> bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
- CloseableTribbleIterator<BEDFeature>iter = bfr.query(chr, start, end);
- int countInterval = 0;
- while (iter.hasNext()) {
- BEDFeature feature = iter.next();
- Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
- Assert.assertTrue(names.contains(feature.getName()));
- countInterval++;
- }
-
- Assert.assertEquals(countInterval, expectedCount);
-
-
- }
-
-
-}
-
diff --git a/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java b/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java
deleted file mode 100644
index 09f920e..0000000
--- a/src/test/java/htsjdk/tribble/index/linear/LinearIndexTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2009-2010 by The Broad Institute, Inc.
- * All Rights Reserved.
- *
- * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which
- * is available at http://www.opensource.org/licenses/lgpl-2.1.php.
- *
- * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF
- * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT
- * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR
- * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF
- * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC
- * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL
- * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE
- * FOREGOING.
- */
-
-package htsjdk.tribble.index.linear;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.TestUtils;
-import htsjdk.tribble.bed.BEDCodec;
-import htsjdk.tribble.bed.BEDFeature;
-import htsjdk.tribble.index.Block;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class LinearIndexTest {
- private static final File RANDOM_FILE = new File("notMeaningful");
-
- private final static Block CHR1_B1 = new Block(1, 10);
- private final static Block CHR1_B2 = new Block(10, 20);
- private final static Block CHR1_B3 = new Block(20, 30);
- private final static Block CHR2_B1 = new Block(1, 100);
- private final static Block CHR2_B2 = new Block(100, 200);
-
- private LinearIndex idx;
-
- @BeforeTest
- public void setup() {
- idx = createTestIndex();
- }
-
- // chr1 (0, 10]
- // chr1 (10, 20]
- // chr1 (20, 30]
- // chr2 (0, 100]
- // chr2 (100, 200]
- private static LinearIndex createTestIndex() {
- final LinearIndex.ChrIndex chr1 = new LinearIndex.ChrIndex("chr1", 10);
- chr1.addBlock(CHR1_B1);
- chr1.addBlock(CHR1_B2);
- chr1.addBlock(CHR1_B3);
- chr1.updateLongestFeature(1);
-
- final LinearIndex.ChrIndex chr2 = new LinearIndex.ChrIndex("chr2", 100);
- chr2.addBlock(CHR2_B1);
- chr2.addBlock(CHR2_B2);
- chr2.updateLongestFeature(50);
-
- final List<LinearIndex.ChrIndex> indices = Arrays.asList(chr1, chr2);
- return new LinearIndex(indices, RANDOM_FILE);
- }
-
- @Test()
- public void testBasicFeatures() {
- Assert.assertEquals(idx.getChrIndexClass(), LinearIndex.ChrIndex.class);
- Assert.assertEquals(idx.getType(), LinearIndex.INDEX_TYPE);
- Assert.assertFalse(idx.hasFileSize());
- Assert.assertFalse(idx.hasTimestamp());
- Assert.assertFalse(idx.hasMD5());
- Assert.assertTrue(idx.isCurrentVersion());
-
- Assert.assertNotNull(idx.getSequenceNames());
- Assert.assertEquals(idx.getSequenceNames().size(), 2);
- Assert.assertTrue(idx.getSequenceNames().contains("chr1"));
- Assert.assertTrue(idx.getSequenceNames().contains("chr2"));
- Assert.assertTrue(idx.containsChromosome("chr1"));
- Assert.assertTrue(idx.containsChromosome("chr2"));
- Assert.assertFalse(idx.containsChromosome("chr3"));
-
- Assert.assertEquals(idx.getIndexedFile(), new File(RANDOM_FILE.getAbsolutePath()));
-
- Assert.assertNotNull(idx.getBlocks("chr1"));
- Assert.assertEquals(idx.getBlocks("chr1").size(), 3);
-
- Assert.assertNotNull(idx.getBlocks("chr2"));
- Assert.assertEquals(idx.getBlocks("chr2").size(), 2);
- }
-
- @Test()
- public void testEquals() {
- final LinearIndex idx2 = createTestIndex();
-
- Assert.assertEquals(idx, idx, "Identical indices are equal");
- Assert.assertTrue(idx.equalsIgnoreProperties(idx), "Identical indices are equalIgnoreTimeStamp");
- Assert.assertTrue(idx.equalsIgnoreProperties(idx2), "Indices constructed the same are equalIgnoreTimeStamp");
-
- idx2.setTS(123456789);
- Assert.assertNotSame(idx, idx2, "Indices with different timestamps are not the same");
- Assert.assertTrue(idx.equalsIgnoreProperties(idx2), "Indices with different timestamps are equalIgnoreTimeStamp");
- }
-
-
- // chr1 (0, 10]
- // chr1 (10, 20]
- // chr1 (20, 30]
- // chr2 (0, 100]
- // chr2 (100, 200]
- //@Test()
- // TODO -- this is not a useful test as written -- the linear index always returns a single block since by
- // TODO -- definition they are contiguous and can be collapsed to a single block.
- public void testBasicQuery() {
- testQuery("chr1", 1, 1, CHR1_B1);
- testQuery("chr1", 1, 2, CHR1_B1);
- testQuery("chr1", 1, 9, CHR1_B1);
- testQuery("chr1", 10, 10, CHR1_B1);
-
- testQuery("chr1", 10, 11, CHR1_B1, CHR1_B2);
- testQuery("chr1", 11, 11, CHR1_B2);
- testQuery("chr1", 11, 12, CHR1_B2);
- testQuery("chr1", 11, 19, CHR1_B2);
-
- testQuery("chr1", 10, 19, CHR1_B1, CHR1_B2);
- testQuery("chr1", 10, 21, CHR1_B1, CHR1_B2, CHR1_B3);
- testQuery("chr1", 25, 30, CHR1_B3);
- testQuery("chr1", 35, 40);
-
- testQuery("chr2", 1, 1, CHR2_B1);
- testQuery("chr2", 100, 100, CHR2_B1);
- testQuery("chr2", 125, 125, CHR2_B1, CHR2_B2); // because of the 50 bp events
- testQuery("chr2", 151, 151, CHR2_B2); // because of the 50 bp events
- testQuery("chr2", 249, 249, CHR2_B2); // because of the 50 bp events
- testQuery("chr2", 251, 251); // just escaping the 50 bp longest event
- }
-
- private final void testQuery(final String chr, final int start, final int stop, final Block... expectedBlocksArray) {
- final List<Block> qBlocks = idx.getBlocks(chr, start, stop);
- final List<Block> eBlocks = Arrays.asList(expectedBlocksArray);
-
- Assert.assertEquals(qBlocks.size(), eBlocks.size(),
- String.format("Query %s:%d-%d returned %d blocks but we only expected %d.", chr, start, stop, qBlocks.size(), eBlocks.size()));
- for (int i = 0; i < qBlocks.size(); i++)
- Assert.assertEquals(qBlocks.get(i), eBlocks.get(i));
- }
-
- File fakeBed = new File(TestUtils.DATA_DIR + "fakeBed.bed");
-
- @Test
- public void oneEntryFirstChr() {
- final BEDCodec code = new BEDCodec();
- final Index index = IndexFactory.createLinearIndex(fakeBed, code);
- final AbstractFeatureReader reader = AbstractFeatureReader.getFeatureReader(fakeBed.getAbsolutePath(), code, index);
-
- try {
- final CloseableTribbleIterator it = reader.iterator();
- int count = 0;
- while (it.hasNext()) {
- it.next();
- count++;
- }
- Assert.assertEquals(51, count);
- } catch (final IOException e) {
- Assert.fail("Unable to get iterator due to " + e.getMessage());
- }
- }
-
-
- @Test
- /**
- *
- * chr2 1 200000000 LONG_FEATURE
- * ...
- * chr2 179098961 179380395 Hs.134602
- * chr2 179209546 179287210 Hs.620337
- * chr2 179266309 179266748 Hs.609465
- * chr2 179296428 179300012 Hs.623987
- * chr2 179302952 179303488 Hs.594545
-
- */
- public void testOverlappingFeatures() throws Exception {
- //chr2:179,222,066-179,262,059<- CONTAINS TTN
-
- final Set<String> names = new HashSet<String>(Arrays.asList("Hs.134602", "Hs.620337", "Hs.609465", "Hs.623987",
- "Hs.594545", "LONG_FEATURE"));
-
- final String bedFile = TestUtils.DATA_DIR + "bed/Unigene.sample.bed";
- final String chr = "chr2";
- final int start = 179266309;
- final int end = 179303488;
- final int expectedCount = 6;
-
-
- // Linear binned index
- LinearIndex.enableAdaptiveIndexing = false;
- final int binSize = 1000;
- Index idx = IndexFactory.createLinearIndex(new File(bedFile), new BEDCodec(), binSize);
-
- FeatureReader<BEDFeature> bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
- CloseableTribbleIterator<BEDFeature> iter = bfr.query(chr, start, end);
- int countInterval = 0;
- while (iter.hasNext()) {
- final BEDFeature feature = iter.next();
- Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
- Assert.assertTrue(names.contains(feature.getName()));
- countInterval++;
- }
-
- Assert.assertEquals(countInterval, expectedCount);
-
- //Repeat with adaptive indexing
- LinearIndex.enableAdaptiveIndexing = true;
- idx = IndexFactory.createLinearIndex(new File(bedFile), new BEDCodec(), binSize);
-
- bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx);
- iter = bfr.query(chr, start, end);
- countInterval = 0;
- while (iter.hasNext()) {
- final BEDFeature feature = iter.next();
- Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end);
- Assert.assertTrue(names.contains(feature.getName()));
- countInterval++;
- }
-
- Assert.assertEquals(countInterval, expectedCount);
-
-
- }
-
-}
diff --git a/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java b/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java
deleted file mode 100644
index 6981b87..0000000
--- a/src/test/java/htsjdk/tribble/index/tabix/TabixIndexTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.tribble.index.tabix;
-
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.tribble.util.LittleEndianOutputStream;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-
-public class TabixIndexTest {
- private static final File SMALL_TABIX_FILE = new File("src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi");
- private static final File BIGGER_TABIX_FILE = new File("src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi");
-
- /**
- * Read an existing index from disk, write it to a temp file, read that in, and assert that both in-memory
- * representations are identical. Disk representations may not be identical due to arbitrary bin order and
- * compression differences.
- */
- @Test(dataProvider = "readWriteTestDataProvider")
- public void readWriteTest(final File tabixFile) throws Exception {
- final TabixIndex index = new TabixIndex(tabixFile);
- final File indexFile = File.createTempFile("TabixIndexTest.", TabixUtils.STANDARD_INDEX_EXTENSION);
- indexFile.deleteOnExit();
- final LittleEndianOutputStream los = new LittleEndianOutputStream(new BlockCompressedOutputStream(indexFile));
- index.write(los);
- los.close();
- final TabixIndex index2 = new TabixIndex(indexFile);
- Assert.assertEquals(index, index2);
- // Unfortunately, can't do byte comparison of original file and temp file, because 1) different compression
- // levels; and more importantly, arbitrary order of bins in bin list.
- }
-
- @DataProvider(name = "readWriteTestDataProvider")
- public Object[][] readWriteTestDataProvider() {
- return new Object[][]{
- {SMALL_TABIX_FILE},
- {BIGGER_TABIX_FILE}
- };
- }
-
- @Test
- public void testQueryProvidedItemsAmount() throws IOException {
- final String VCF = "src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf";
- // Note that we store only compressed files
- final File plainTextVcfInputFile = new File(VCF);
- plainTextVcfInputFile.deleteOnExit();
- final File plainTextVcfIndexFile = new File(VCF + ".tbi");
- plainTextVcfIndexFile.deleteOnExit();
- final File compressedVcfInputFile = new File(VCF + ".gz");
- final File compressedTbiIndexFile = new File(VCF + ".gz.tbi");
- final VCFFileReader compressedVcfReader = new VCFFileReader(compressedVcfInputFile, compressedTbiIndexFile);
-
- //create plain text VCF without "index on the fly" option
- final VariantContextWriter plainTextVcfWriter = new VariantContextWriterBuilder()
- .setOptions(VariantContextWriterBuilder.NO_OPTIONS)
- .setOutputFile(VCF)
- .build();
- plainTextVcfWriter.writeHeader(compressedVcfReader.getFileHeader());
- for (VariantContext vc : compressedVcfReader) {
- if (vc != null) plainTextVcfWriter.add(vc);
- }
- plainTextVcfWriter.close();
-
- IndexFactory.createTabixIndex(plainTextVcfInputFile,
- new VCFCodec(),
- TabixFormat.VCF,
- new VCFFileReader(plainTextVcfInputFile, false).getFileHeader().getSequenceDictionary()
- ) // create TabixIndex straight from plaintext VCF
- .write(plainTextVcfIndexFile); // write it
-
- final VCFFileReader plainTextVcfReader = new VCFFileReader(plainTextVcfInputFile, plainTextVcfIndexFile);
- // Now we have both plaintext and compressed VCFs with provided TabixIndex-es and could test their "queryability"
-
- // magic numbers chosen from just looking in provided VCF file
- try {
- // just somewhere in middle of chromosome
- Assert.assertEquals(42, countIteratedElements(compressedVcfReader.query("1", 868379 - 1, 1006891 + 1)));
- Assert.assertEquals(42, countIteratedElements(plainTextVcfReader.query("1", 868379 - 1, 1006891 + 1)));
- // chromosome start
- Assert.assertEquals(13, countIteratedElements(compressedVcfReader.query("1", 1, 836463 + 1)));
- Assert.assertEquals(13, countIteratedElements(plainTextVcfReader.query("1", 1, 836463 + 1)));
- // chromosome end
- Assert.assertEquals(36, countIteratedElements(compressedVcfReader.query("1", 76690833 - 1, 76837502 + 11111111)));
- Assert.assertEquals(36, countIteratedElements(plainTextVcfReader.query("1", 76690833 - 1, 76837502 + 11111111)));
- // where's no one feature in the middle of chromosome
- Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 36606472 + 1, 36623523 - 1)));
- Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 36606472 + 1, 36623523 - 1)));
- // before chromosome
- Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 1, 10)));
- Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 1, 10)));
- // after chromosome
- Assert.assertEquals(0, countIteratedElements(compressedVcfReader.query("1", 76837502 * 15, 76837502 * 16)));
- Assert.assertEquals(0, countIteratedElements(plainTextVcfReader.query("1", 76837502 * 15, 76837502 * 16)));
- } catch (NullPointerException e) {
- Assert.fail("Exception caught on querying: ", e);
- // before fix exception was thrown from 'TabixIndex.getBlocks()' on 'chunks.size()' while 'chunks == null' for plain files
- } finally {
- plainTextVcfReader.close();
- compressedVcfReader.close();
- }
- }
-
- private static int countIteratedElements(Iterator iterator) {
- int counter = 0;
- while (iterator.hasNext()) {
- iterator.next();
- counter++;
- }
- return counter;
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java b/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java
deleted file mode 100644
index 822f6cf..0000000
--- a/src/test/java/htsjdk/tribble/readers/AsciiLineReaderTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * User: jacob
- * Date: 2012/05/09
- */
-public class AsciiLineReaderTest {
- @BeforeMethod
- public void setUp() throws Exception {
-
- }
-
- @AfterMethod
- public void tearDown() throws Exception {
-
- }
-
- /**
- * Test that we read the correct number of lines
- * from a file
- * @throws Exception
- */
- @Test
- public void testReadLines() throws Exception {
- String filePath = TestUtils.DATA_DIR + "gwas/smallp.gwas";
- InputStream is = new FileInputStream(filePath);
- AsciiLineReader reader = new AsciiLineReader(is);
- int actualLines = 0;
- int expectedNumber = 20;
- String nextLine = "";
-
- while((nextLine = reader.readLine()) != null && actualLines < (expectedNumber + 5)){
- actualLines++;
- //This particular test file has no empty lines
- assertTrue(nextLine.length() > 0);
- }
-
- assertEquals(expectedNumber, actualLines);
-
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java b/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java
deleted file mode 100644
index 6c4c946..0000000
--- a/src/test/java/htsjdk/tribble/readers/LongLineBufferedReaderTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-/**
- * @author mccowan
- */
-public class LongLineBufferedReaderTest {
-
- /**
- * Test that we read the correct number of lines
- * from a file
- * @throws Exception
- */
- @Test
- public void testReadLines() throws Exception {
- String filePath = TestUtils.DATA_DIR + "large.txt";
- BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
- LongLineBufferedReader testReader = new LongLineBufferedReader(new InputStreamReader(new FileInputStream(filePath)));
- String line;
- while((line = reader.readLine()) != null){
- Assert.assertEquals(testReader.readLine(), line);
- }
- Assert.assertNull(testReader.readLine());
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java b/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java
deleted file mode 100644
index 3dd7cf3..0000000
--- a/src/test/java/htsjdk/tribble/readers/PositionalBufferedStreamTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * User: jacob
- * Date: 2012/05/09
- */
-public class PositionalBufferedStreamTest {
-
- InputStream FileIs;
- long expectedBytes;
-
-
- @BeforeMethod
- public void setUp() throws Exception {
- File fi = new File(TestUtils.DATA_DIR + "test.bed");
- FileIs = new FileInputStream(fi);
- expectedBytes = fi.length();
- }
-
- @AfterMethod
- public void tearDown() throws Exception {
- if(FileIs != null){
- FileIs.close();
- FileIs = null;
- }
- }
-
- @Test
- public void testPeek() throws Exception{
- int trials = 10;
- PositionalBufferedStream is = new PositionalBufferedStream(FileIs);
- int bb = is.peek();
- for(int ii=0; ii < trials; ii++){
- Assert.assertEquals(is.peek(), bb);
- Assert.assertEquals(is.getPosition(), 0);
- }
-
- while((bb = is.peek()) >= 0){
- Assert.assertEquals(is.read(), bb);
- }
- }
-
- @Test
- public void testIsDone() throws Exception{
- PositionalBufferedStream is = new PositionalBufferedStream(FileIs);
- while(!is.isDone()){
- is.read();
- }
- Assert.assertTrue(is.isDone());
- Assert.assertEquals(is.getPosition(), expectedBytes);
- }
-
- @Test
- public void testReadCorrectNumberBytes() throws Exception{
- int[] bufSizes= new int[]{5, 20, 60, 120, 131, 150, 200, 1000, 10000, 20000, 512000, 2 << 20};
- for(Integer bufSize: bufSizes){
- setUp();
- tstReadCorrectNumberBytes(bufSize);
- tearDown();
- }
- }
-
- public void tstReadCorrectNumberBytes(int bufferSize) throws Exception{
- InputStream is = new PositionalBufferedStream(FileIs, bufferSize);
- long count = 0;
- while(is.read() >= 0){
- count++;
- }
-
- Assert.assertEquals(count, expectedBytes);
- }
-
- @DataProvider(name = "ReadBytesTestData")
- public Object[][] createReadBytesTestData() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- for ( int byteReadSize : Arrays.asList(5, 10, 100, 255) )
- for ( int bufSize : Arrays.asList(1, 10, 100, 1000) )
- tests.add( new Object[]{ (Integer)byteReadSize, (Integer)bufSize });
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "ReadBytesTestData")
- public void testReadBytes(final int byteReadSize, final int bufsize) throws Exception {
- final byte[] bytes = new byte[255];
- for ( int i = 0; i < bytes.length; i++ ) bytes[i] = (byte)i;
- final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-
- final byte[] readBytes = new byte[byteReadSize];
- final PositionalBufferedStream pbs = new PositionalBufferedStream(bais, bufsize);
-
- int i = 0;
- while ( i < 255 ) {
- final int expectedBytesToRead = Math.min(255 - i, readBytes.length);
- final int nBytesRead = pbs.read(readBytes);
- Assert.assertEquals(nBytesRead, expectedBytesToRead, "Didn't read as many bytes as expected from PBS");
-
- for ( int j = 0; j < nBytesRead; j++ )
- Assert.assertEquals(readBytes[j], bytes[i+j], "Bytes read not those expected");
-
- i += nBytesRead;
- }
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/ReaderTest.java b/src/test/java/htsjdk/tribble/readers/ReaderTest.java
deleted file mode 100644
index d700e04..0000000
--- a/src/test/java/htsjdk/tribble/readers/ReaderTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package htsjdk.tribble.readers;
-
-
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for streams and readers
- */
-public class ReaderTest {
- @BeforeClass
- public void setup() throws IOException {
- }
-
- @AfterClass
- public void teardown() throws Exception {
-
- }
-
- @Test
- public void testMultipleLines() throws IOException {
- testStream("line 1\nline2\n");
- }
-
- @Test
- public void testSingleLine() throws IOException {
- testStream("line 1\n");
- }
-
- @Test
- public void testEmpty() throws IOException {
- testStream("");
- }
-
-
- @Test
- public void testLotsOfLines() throws IOException {
- final StringBuilder b = new StringBuilder();
- for ( int i = 0; i < 10000; i++ ) {
- b.append("line " + i + "\n");
- }
- testStream(b.toString());
- }
-
- @Test
- public void testMassiveLines() throws IOException {
- final StringBuilder b = new StringBuilder();
- for ( int i = 0; i < 10; i++ ) {
- for ( int j = 0; j < 1000000; j++) {
- b.append(i + "." + j);
- }
- b.append("\n");
- }
- testStream(b.toString());
- }
-
- @Test
- public void testSkip() throws IOException {
- for ( int skipSizeBase : Arrays.asList(0, 10, 100, 1000, 10000, 1000000)) {
- for ( int skipSizeAdd = 0; skipSizeAdd < 10; skipSizeAdd ++ ) {
- final int skipSize = skipSizeBase + skipSizeAdd;
- final byte[] bytes = new byte[skipSize+2];
- Arrays.fill(bytes, 0, skipSize, (byte)0);
- bytes[skipSize] = 1;
- bytes[skipSize+1] = 2;
-
- final InputStream is = new ByteArrayInputStream(bytes);
- final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
- pbs.skip(skipSize);
-
- // first value is 1
- Assert.assertTrue(! pbs.isDone());
- Assert.assertEquals(pbs.getPosition(), skipSize);
- Assert.assertEquals(pbs.peek(), 1);
- Assert.assertEquals(pbs.read(), 1);
-
- Assert.assertTrue(! pbs.isDone());
- Assert.assertEquals(pbs.getPosition(), skipSize + 1);
- Assert.assertEquals(pbs.peek(), 2);
- Assert.assertEquals(pbs.read(), 2);
-
- Assert.assertTrue(pbs.isDone());
- }
- }
- }
-
- private void testStream(final String s) throws IOException {
- testStream(s.getBytes());
- testLineReader(s);
- }
-
- private void testStream(final byte[] bytes) throws IOException {
- final InputStream is = new ByteArrayInputStream(bytes);
- final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
-
- int bytePos = 0;
- while ( ! pbs.isDone() ) {
- Assert.assertTrue(bytePos < bytes.length);
-
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
-
- // test peek
- final byte atPos = bytes[bytePos];
- Assert.assertEquals(toByte(pbs.peek()), atPos);
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
-
- // test read
- Assert.assertEquals(toByte(pbs.read()), atPos);
- bytePos++;
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
-
- // test repeek
- if ( bytePos < bytes.length ) {
- Assert.assertEquals(toByte(pbs.peek()), bytes[bytePos]);
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
- }
- }
-
- Assert.assertEquals(bytePos, bytes.length);
- pbs.close();
- }
-
- private void testLineReader(final String lines) throws IOException {
- // read all of the lines into the
- final BufferedReader br = new BufferedReader(new StringReader(lines));
- final List<String> eachLine = new ArrayList<String>();
- while (true) {
- final String line = br.readLine();
- if ( line == null ) break;
- eachLine.add(line);
- }
-
- final byte[] bytes = lines.getBytes();
- final InputStream is = new ByteArrayInputStream(bytes);
- final PositionalBufferedStream pbs = new PositionalBufferedStream(is);
- final LineReader alr = new AsciiLineReader(pbs); // AsciiLineReader must be used here because it does not read ahead.
-
- int bytePos = 0, linePos = 0;
- /**
- * TODO: Requires revision: we're calling readLine() here, but making assumptions about how the underlying input stream operates.
- * Specifically, these tests assume the underlying stream only advances exactly the required number of characters to find the
- * newline, which is not true for most buffered readers.
- */
- while ( ! pbs.isDone() ) {
- Assert.assertTrue(bytePos < bytes.length);
-
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
-
- // test read
- final String readLine = alr.readLine();
- Assert.assertEquals(readLine, eachLine.get(linePos));
- linePos++;
-
- bytePos += readLine.length() + 1; // 1 for the terminator
- // test position
- Assert.assertEquals(pbs.getPosition(), bytePos);
- }
-
- Assert.assertEquals(linePos, eachLine.size());
- Assert.assertEquals(bytePos, bytes.length);
- pbs.close();
- }
-
- private final byte toByte(int i) {
- return (byte)(i & 0xFF);
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java b/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java
deleted file mode 100644
index fbb5d18..0000000
--- a/src/test/java/htsjdk/tribble/readers/SynchronousLineReaderUnitTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package htsjdk.tribble.readers;
-
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-
-/**
- * @author mccowan
- */
-public class SynchronousLineReaderUnitTest {
- @Test
- public void testLineReaderIterator_streamConstructor() throws Exception {
- final File filePath = new File(TestUtils.DATA_DIR + "gwas/smallp.gwas");
- final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new PositionalBufferedStream(new FileInputStream(filePath))));
- final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-
- while (lineIterator.hasNext()) {
- Assert.assertEquals(lineIterator.next(), br.readLine());
- }
- Assert.assertNull(br.readLine());
- }
-
- @Test
- public void testLineReaderIterator_readerConstructor() throws Exception {
- final File filePath = new File(TestUtils.DATA_DIR + "gwas/smallp.gwas");
- final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new InputStreamReader(new PositionalBufferedStream(new FileInputStream(filePath)))));
- final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
-
- while (lineIterator.hasNext()) {
- Assert.assertEquals(lineIterator.next(), br.readLine());
- }
- Assert.assertNull(br.readLine());
- }
-}
diff --git a/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java b/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java
deleted file mode 100644
index d7b36df..0000000
--- a/src/test/java/htsjdk/tribble/readers/TabixReaderTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package htsjdk.tribble.readers;
-
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.AssertJUnit.assertTrue;
-
-
-/**
- * Created by IntelliJ IDEA.
- * User: jrobinso
- * Date: Jul 6, 2010
- * Time: 8:57:40 PM
- * To change this template use File | Settings | File Templates.
- */
-public class TabixReaderTest {
-
- static String tabixFile = TestUtils.DATA_DIR + "tabix/trioDup.vcf.gz";
- static TabixReader tabixReader;
- static List<String> sequenceNames;
-
- @BeforeClass
- public void setup() throws IOException {
- tabixReader = new TabixReader(tabixFile);
- sequenceNames = new ArrayList<String>(tabixReader.getChromosomes());
- }
-
- @AfterClass
- public void teardown() throws Exception {
- tabixReader.close();
- }
-
- @Test
- public void testSequenceNames() {
- String[] expectedSeqNames = new String[24];
- for (int i = 1; i < 24; i++) {
- expectedSeqNames[i - 1] = String.valueOf(i);
- }
- expectedSeqNames[22] = "X";
- expectedSeqNames[23] = "Y";
- Assert.assertEquals(expectedSeqNames.length, sequenceNames.size());
-
- for (String s : expectedSeqNames) {
- Assert.assertTrue(sequenceNames.contains(s));
- }
-
-
- }
-
- @Test
- public void testSequenceSet() {
- Set<String> chroms= tabixReader.getChromosomes();
- Assert.assertFalse(chroms.isEmpty());
- Assert.assertTrue(chroms.contains("1"));
- Assert.assertFalse(chroms.contains("MT"));
-
- }
-
-
- @Test
- public void testIterators() throws IOException {
- TabixReader.Iterator iter=tabixReader.query("1", 1, 400);
- Assert.assertNotNull(iter);
- Assert.assertNotNull(iter.next());
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query("UN", 1, 100);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query("UN:1-100");
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
-
- iter=tabixReader.query("1:10-1");
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query(999999,9,9);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query("1",Integer.MAX_VALUE-1,Integer.MAX_VALUE);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- final int pos_snp_in_vcf_chr1=327;
-
- iter=tabixReader.query("1",pos_snp_in_vcf_chr1,pos_snp_in_vcf_chr1);
- Assert.assertNotNull(iter);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query("1",pos_snp_in_vcf_chr1-1,pos_snp_in_vcf_chr1-1);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- iter=tabixReader.query("1",pos_snp_in_vcf_chr1+1,pos_snp_in_vcf_chr1+1);
- Assert.assertNotNull(iter);
- Assert.assertNull(iter.next());
-
- }
-
-
-
- /**
- * Test reading a local tabix file
- *
- * @throws java.io.IOException
- */
- @Test
- public void testLocalQuery() throws IOException {
-
- TabixIteratorLineReader lineReader = new TabixIteratorLineReader(
- tabixReader.query(tabixReader.chr2tid("4"), 320, 330));
-
- int nRecords = 0;
- String nextLine;
- while ((nextLine = lineReader.readLine()) != null) {
- assertTrue(nextLine.startsWith("4"));
- nRecords++;
- }
- assertTrue(nRecords > 0);
-
-
- }
-
- /**
- * Test reading a tabix file over http
- *
- * @throws java.io.IOException
- */
- @Test
- public void testRemoteQuery() throws IOException {
- String tabixFile = TestUtil.BASE_URL_FOR_HTTP_TESTS +"igvdata/tabix/trioDup.vcf.gz";
-
- TabixReader tabixReader = new TabixReader(tabixFile);
-
- TabixIteratorLineReader lineReader = new TabixIteratorLineReader(
- tabixReader.query(tabixReader.chr2tid("4"), 320, 330));
-
- int nRecords = 0;
- String nextLine;
- while ((nextLine = lineReader.readLine()) != null) {
- assertTrue(nextLine.startsWith("4"));
- nRecords++;
- }
- assertTrue(nRecords > 0);
-
- }
-}
diff --git a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java b/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java
deleted file mode 100644
index 1c3ad1f..0000000
--- a/src/test/java/htsjdk/tribble/util/ParsingUtilsTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package htsjdk.tribble.util;
-
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * Parsing utils tests
- */
-public class ParsingUtilsTest {
-
- static final String AVAILABLE_FTP_URL = "ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt";
- static final String UNAVAILABLE_FTP_URL = "ftp://www.example.com/file.txt";
-
- static final String AVAILABLE_HTTP_URL = "https://www.google.com";
- static final String UNAVAILABLE_HTTP_URL = "http://www.unknownhostwhichshouldntexist.com";
-
- @Test
- public void testSplit1() {
- String[] tokens = new String[10];
- String blankColumnLine = "a\tb\t\td";
- int nTokens = ParsingUtils.split(blankColumnLine, tokens, '\t');
- Assert.assertEquals(nTokens,4);
- Assert.assertEquals(tokens[0],"a");
- Assert.assertEquals(tokens[1],"b");
- Assert.assertEquals(tokens[2],"");
- Assert.assertEquals(tokens[3],"d");
- }
-
- @Test
- public void testSplit2() {
- String[] tokens = new String[10];
- String blankColumnLine = "a\tb\t\td\t";
- int nTokens = ParsingUtils.split(blankColumnLine, tokens, '\t');
- Assert.assertEquals(nTokens,5);
- Assert.assertEquals(tokens[0],"a");
- Assert.assertEquals(tokens[1],"b");
- Assert.assertEquals(tokens[2],"");
- Assert.assertEquals(tokens[3],"d");
- Assert.assertEquals(tokens[4],"");
- }
-
- @Test
- public void testSplitWhitespace1() {
- String[] tokens = new String[10];
- String blankColumnLine = "a b\t\td";
- int nTokens = ParsingUtils.splitWhitespace(blankColumnLine, tokens);
- Assert.assertEquals(nTokens,4);
- Assert.assertEquals(tokens[0],"a");
- Assert.assertEquals(tokens[1],"b");
- Assert.assertEquals(tokens[2],"");
- Assert.assertEquals(tokens[3],"d");
- }
-
- @Test
- public void testSplitWhitespace2() {
- String[] tokens = new String[10];
- String blankColumnLine = "a b\t\td\t";
- int nTokens = ParsingUtils.splitWhitespace(blankColumnLine, tokens);
- Assert.assertEquals(nTokens,5);
- Assert.assertEquals(tokens[0],"a");
- Assert.assertEquals(tokens[1],"b");
- Assert.assertEquals(tokens[2],"");
- Assert.assertEquals(tokens[3],"d");
- }
-
- /**
- * Tests that the string "joined", when split by "delim" using ParsingUtils.split(String, char),
- * <ol>
- * <li>Ends up with the expected number of items</li>
- * <li>Ends up with the expected items</li>
- * <li>Ends up with the same items as when the split is performed using String.split</li>
- * <li>When re-joined (using ParsingUtils.join(String, Collection>String<) ) results in
- * the original string</li>
- * </ol>
- *
- * @param joined
- * @param delim
- * @param expectedItems
- */
- private void testSplitJoinRoundtrip(String joined, char delim, List<String> expectedItems) {
- List<String> split = ParsingUtils.split(joined, delim);
- Assert.assertEquals(split.size(), expectedItems.size());
- Assert.assertEquals(joined.split(Character.toString(delim), -1), split.toArray());
- Assert.assertEquals(joined, ParsingUtils.join(Character.toString(delim), split));
- }
-
- @Test
- public void testSplitJoinEmptyItem() {
- testSplitJoinRoundtrip("a\tb\t\td", '\t', Arrays.asList("a", "b", "", "d"));
- }
-
- @Test
- public void testSplitJoinEmptyAtEnd() {
- testSplitJoinRoundtrip("a\tb\t\td\t", '\t', Arrays.asList("a", "b", "", "d", ""));
- }
-
- @Test
- public void testSplitJoinEmpty() {
- testSplitJoinRoundtrip("", '\t', Arrays.asList(""));
- }
-
- @Test
- public void testSplitJoinSingleItem() {
- testSplitJoinRoundtrip("a", '\t', Arrays.asList("a"));
- }
-
- @Test
- public void testSplitJoinEmptyFirst() {
- testSplitJoinRoundtrip("\ta\tb", '\t', Arrays.asList("", "a", "b"));
- }
-
- @Test
- public void testFTPDoesExist() throws IOException{
- tstExists(AVAILABLE_FTP_URL, true);
- }
-
- @Test
- public void testFTPNotExist() throws IOException{
- tstExists(UNAVAILABLE_FTP_URL, false);
- }
-
- @Test
- public void testHTTPDoesExist() throws IOException{
- tstExists(AVAILABLE_HTTP_URL, true);
- }
-
- @Test
- public void testHTTPNotExist() throws IOException{
- tstExists(UNAVAILABLE_HTTP_URL, false);
- }
-
- private void tstExists(String path, boolean expectExists) throws IOException{
- boolean exists = ParsingUtils.resourceExists(path);
- Assert.assertEquals(exists, expectExists);
- }
-
- @Test
- public void testFTPOpenInputStream() throws IOException{
- tstStream(AVAILABLE_FTP_URL);
- }
-
- @Test
- public void testHTTPOpenInputStream() throws IOException{
- tstStream(AVAILABLE_HTTP_URL);
- }
-
- private void tstStream(String path) throws IOException{
- InputStream is = ParsingUtils.openInputStream(path);
- Assert.assertNotNull(is, "InputStream is null for " + path);
- int b = is.read();
- Assert.assertNotSame(b, -1);
- }
-
-
-}
diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java
deleted file mode 100644
index 3979b08..0000000
--- a/src/test/java/htsjdk/tribble/util/ftp/FTPClientTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-package htsjdk.tribble.util.ftp;
-
-import htsjdk.samtools.util.ftp.FTPClient;
-import htsjdk.samtools.util.ftp.FTPReply;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.UnknownHostException;
-
-/**
-* @author Jim Robinson
-* @since 10/3/11
-*/
-public class FTPClientTest {
-
- static String host = "ftp.broadinstitute.org";
- static String file = "/pub/igv/TEST/test.txt";
- static int fileSize = 27;
- static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes();
- FTPClient client;
-
- @BeforeMethod
- public void setUp() throws IOException {
- client = new FTPClient();
- FTPReply reply = client.connect(host);
- Assert.assertTrue(reply.isSuccess(), "connect");
- }
-
- @AfterMethod
- public void tearDown() {
- System.out.println("Disconnecting");
- client.disconnect();
- }
-
- @Test
- public void testLogin() throws Exception {
-
- }
-
- @Test
- public void testPasv() throws Exception {
- try {
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv");
- } finally {
- client.closeDataStream();
- }
- }
-
- @Test
- public void testSize() throws Exception {
-
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess());
-
- reply = client.binary();
- Assert.assertTrue(reply.isSuccess(), "binary");
-
- reply = client.size(file);
- String val = reply.getReplyString();
- int size = Integer.parseInt(val);
- Assert.assertEquals(fileSize, size, "size");
- }
-
- @Test
- public void testDownload() throws Exception {
- try {
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.binary();
- Assert.assertTrue(reply.isSuccess(), "binary");
-
- reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv");
-
- reply = client.retr(file);
- Assert.assertEquals(reply.getCode(), 150, "retr");
-
- InputStream is = client.getDataStream();
- int idx = 0;
- int b;
- while ((b = is.read()) >= 0) {
- Assert.assertEquals(expectedBytes[idx], (byte) b,"reading from stream");
- idx++;
- }
-
- } finally {
- client.closeDataStream();
- FTPReply reply = client.retr(file);
- System.out.println(reply.getCode());
- Assert.assertTrue(reply.isSuccess(), "close");
- }
- }
-
- @Test
- public void testRest() throws Exception {
- try {
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.binary();
- Assert.assertTrue(reply.isSuccess(), "binary");
-
- reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv");
-
- final int restPosition = 5;
- client.setRestPosition(restPosition);
-
- reply = client.retr(file);
- Assert.assertEquals(reply.getCode(), 150, "retr");
-
- InputStream is = client.getDataStream();
- int idx = restPosition;
- int b;
- while ((b = is.read()) >= 0) {
- Assert.assertEquals(expectedBytes[idx], (byte) b, "reading from stream");
- idx++;
- }
-
- } finally {
- client.closeDataStream();
- FTPReply reply = client.retr(file);
- System.out.println(reply.getCode());
- Assert.assertTrue(reply.isSuccess(), "close");
- }
- }
-
- /**
- * Test accessing a non-existent file
- */
- @Test
- public void testNonExistentFile() throws Exception {
-
- String host = "ftp.broadinstitute.org";
- String file = "/pub/igv/TEST/fileDoesntExist.txt";
- FTPClient client = new FTPClient();
-
- FTPReply reply = client.connect(host);
- Assert.assertTrue(reply.isSuccess(), "connect");
-
- reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.binary();
- Assert.assertTrue(reply.isSuccess(), "binary");
-
- reply = client.executeCommand("size " + file);
- Assert.assertEquals(550, reply.getCode(), "size");
-
- client.disconnect();
- }
-
- /**
- * Test accessing a non-existent server
- */
- @Test
- public void testNonExistentServer() throws Exception {
-
- String host = "ftp.noSuchServer.org";
- String file = "/pub/igv/TEST/fileDoesntExist.txt";
- FTPClient client = new FTPClient();
-
- FTPReply reply = null;
- try {
- reply = client.connect(host);
- } catch (UnknownHostException e) {
- // This is expected
- }
-
- client.disconnect();
- }
-
- @Test
- public void testMultiplePasv() throws Exception {
-
- try {
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv 1");
- client.closeDataStream();
-
- reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv 2");
- client.closeDataStream();
- }
- finally {
-
- }
- }
-
- @Test
- public void testMultipleRest() throws Exception {
- FTPReply reply = client.login("anonymous", "igv at broadinstitute.org");
- Assert.assertTrue(reply.isSuccess(), "login");
-
- reply = client.binary();
- Assert.assertTrue(reply.isSuccess(), "binary");
-
- restRetr(5, 10);
- restRetr(2, 10);
- restRetr(15, 10);
- }
-
- private void restRetr(int restPosition, int length) throws IOException {
-
- try {
-
- if (client.getDataStream() == null) {
- FTPReply reply = client.pasv();
- Assert.assertTrue(reply.isSuccess(), "pasv");
- }
-
- client.setRestPosition(restPosition);
-
- FTPReply reply = client.retr(file);
- //assertTrue(reply.getCode() == 150);
-
- InputStream is = client.getDataStream();
-
- byte[] buffer = new byte[length];
- is.read(buffer);
-
- for (int i = 0; i < length; i++) {
- System.out.print((char) buffer[i]);
- Assert.assertEquals(expectedBytes[i + restPosition], buffer[i], "reading from stream");
- }
- System.out.println();
- }
-
- finally {
- client.closeDataStream();
- FTPReply reply = client.getReply(); // <== MUST READ THE REPLY
- System.out.println(reply.getReplyString());
- }
- }
-}
diff --git a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java b/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java
deleted file mode 100644
index a5f3b0e..0000000
--- a/src/test/java/htsjdk/tribble/util/ftp/FTPUtilsTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package htsjdk.tribble.util.ftp;
-
-import htsjdk.samtools.util.ftp.FTPUtils;
-import org.testng.annotations.Test;
-
-import java.net.URL;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
-* @author Jim Robinson
-* @since 10/4/11
-*/
-public class FTPUtilsTest {
-
- @Test
- public void testResourceAvailable() throws Exception {
-
- URL goodUrl = new URL("ftp://ftp.broadinstitute.org/pub/igv/TEST/test.txt");
- assertTrue(FTPUtils.resourceAvailable(goodUrl));
-
- URL nonExistentURL = new URL("ftp://ftp.broadinstitute.org/pub/igv/TEST/doesntExist");
- assertFalse(FTPUtils.resourceAvailable(nonExistentURL));
-
- URL nonExistentServer = new URL("ftp://noSuchServer/pub/igv/TEST/doesntExist");
- assertFalse(FTPUtils.resourceAvailable(nonExistentServer));
-
-
- }
-}
diff --git a/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java b/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java
deleted file mode 100644
index fcf1bea..0000000
--- a/src/test/java/htsjdk/tribble/util/popgen/HardyWeinbergCalculationTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package htsjdk.tribble.util.popgen;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * Created by farjoun on 7/18/14.
- */
-public class HardyWeinbergCalculationTest {
-
- @DataProvider
- public Object[][] testHwCalculateData() {
- return new Object[][] {
- new Object[] {generateHWTrio(100, 0.01), 1.0},
- new Object[] {generateHWTrio(100, 0.1), 1.0},
- new Object[] {generateHWTrio(1000, 0.1), 1.0},
- new Object[] {generateHWTrio(1000, 0.01), 1.0},
- new Object[] {generateHWTrio(1000, 0.001), 1.0},
- new Object[] {generateHWTrio(10000, 0.1), 1.0},
- new Object[] {generateHWTrio(10000, 0.01), 1.0},
- new Object[] {generateHWTrio(10000, 0.001), 1.0},
- new Object[] {generateHWTrio(100000, 0.1), 1.0},
- new Object[] {generateHWTrio(100000, 0.01), 1.0},
- new Object[] {generateHWTrio(100000, 0.001), 1.0},
-
- };
- }
-
- private int[] generateHWTrio(final int total, final double p) {
- return new int[] {
- (int) Math.round(total * p * p),
- (int) Math.round(total * 2 * p * (1 - p)),
- (int) Math.round(total * (1 - p) * (1 - p))};
- }
-
- @Test(dataProvider = "testHwCalculateData")
- public void testHwCalculate(final int[] genotypeCounts, final double expectedHWS) throws Exception {
- Assert.assertEquals(HardyWeinbergCalculation.hwCalculate(genotypeCounts[0], genotypeCounts[1], genotypeCounts[2]), expectedHWS);
- }
-}
diff --git a/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java b/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java
deleted file mode 100644
index c82f2db..0000000
--- a/src/test/java/htsjdk/variant/PrintVariantsExampleTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant;
-
-import htsjdk.samtools.util.IOUtil;
-import htsjdk.variant.example.PrintVariantsExample;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-import java.util.OptionalInt;
-import java.util.stream.IntStream;
-
-public class PrintVariantsExampleTest {
- @Test
- public void testExampleWriteFile() throws IOException {
- final File tempFile = File.createTempFile("example", ".vcf");
- tempFile.deleteOnExit();
- File f1 = new File("src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf");
- final String[] args = {
- f1.getAbsolutePath(),
- tempFile.getAbsolutePath()
- };
- Assert.assertEquals(tempFile.length(), 0);
- PrintVariantsExample.main(args);
- Assert.assertNotEquals(tempFile.length(), 0);
-
- assertFilesEqualSkipHeaders(tempFile, f1);
- }
-
- private void assertFilesEqualSkipHeaders(File tempFile, File f1) throws FileNotFoundException {
- final List<String> lines1 = IOUtil.slurpLines(f1);
- final List<String> lines2 = IOUtil.slurpLines(tempFile);
- final int firstNonComment1 = IntStream.range(0, lines1.size()).filter(i -> !lines1.get(i).startsWith("#")).findFirst().getAsInt();
- final int firstNonComment2 = IntStream.range(0, lines2.size()).filter(i -> !lines2.get(i).startsWith("#")).findFirst().getAsInt();
- Assert.assertEquals(lines1.subList(firstNonComment1, lines1.size()), lines2.subList(firstNonComment2,lines2.size()));
- }
-}
diff --git a/src/test/java/htsjdk/variant/VariantBaseTest.java b/src/test/java/htsjdk/variant/VariantBaseTest.java
deleted file mode 100644
index 87345a0..0000000
--- a/src/test/java/htsjdk/variant/VariantBaseTest.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Base class for test classes within org.broadinstitute.variant
- */
-public class VariantBaseTest {
-
- public static final String variantTestDataRoot = new File("src/test/resources/htsjdk/variant/").getAbsolutePath() + "/";
-
- /**
- * Creates a temp file that will be deleted on exit after tests are complete.
- * @param name Prefix of the file.
- * @param extension Extension to concat to the end of the file.
- * @return A file in the temporary directory starting with name, ending with extension, which will be deleted after the program exits.
- */
- public static File createTempFile(String name, String extension) {
- try {
- File file = File.createTempFile(name, extension);
- file.deleteOnExit();
- return file;
- } catch (IOException ex) {
- throw new RuntimeException("Cannot create temp file: " + ex.getMessage(), ex);
- }
- }
-
- private static final double DEFAULT_FLOAT_TOLERANCE = 1e-1;
-
- public static final void assertEqualsDoubleSmart(final Object actual, final Double expected) {
- Assert.assertTrue(actual instanceof Double, "Not a double");
- assertEqualsDoubleSmart((double)(Double)actual, (double)expected);
- }
-
- public static final void assertEqualsDoubleSmart(final Object actual, final Double expected, final double tolerance) {
- Assert.assertTrue(actual instanceof Double, "Not a double");
- assertEqualsDoubleSmart((double)(Double)actual, (double)expected, tolerance);
- }
-
- public static final void assertEqualsDoubleSmart(final double actual, final double expected) {
- assertEqualsDoubleSmart(actual, expected, DEFAULT_FLOAT_TOLERANCE);
- }
-
- public static final <T> void assertEqualsSet(final Set<T> actual, final Set<T> expected, final String info) {
- final Set<T> actualSet = new HashSet<T>(actual);
- final Set<T> expectedSet = new HashSet<T>(expected);
- Assert.assertTrue(actualSet.equals(expectedSet), info); // note this is necessary due to testng bug for set comps
- }
-
- public static void assertEqualsDoubleSmart(final double actual, final double expected, final double tolerance) {
- assertEqualsDoubleSmart(actual, expected, tolerance, null);
- }
-
- public static void assertEqualsDoubleSmart(final double actual, final double expected, final double tolerance, final String message) {
- if ( Double.isNaN(expected) ) // NaN == NaN => false unfortunately
- Assert.assertTrue(Double.isNaN(actual), "expected is nan, actual is not");
- else if ( Double.isInfinite(expected) ) // NaN == NaN => false unfortunately
- Assert.assertTrue(Double.isInfinite(actual), "expected is infinite, actual is not");
- else {
- final double delta = Math.abs(actual - expected);
- final double ratio = Math.abs(actual / expected - 1.0);
- Assert.assertTrue(delta < tolerance || ratio < tolerance, "expected = " + expected + " actual = " + actual
- + " not within tolerance " + tolerance
- + (message == null ? "" : "message: " + message));
- }
- }
-
- public static SAMSequenceDictionary createArtificialSequenceDictionary() {
- final int[] contigLengths = { 249250621, 243199373, 198022430, 191154276, 180915260, 171115067, 159138663, 146364022,
- 141213431, 135534747, 135006516, 133851895, 115169878, 107349540, 102531392, 90354753,
- 81195210, 78077248, 59128983, 63025520, 48129895, 51304566, 155270560, 59373566, 16569 };
- List<SAMSequenceRecord> contigs = new ArrayList<SAMSequenceRecord>();
-
- for ( int contig = 1; contig <= 22; contig++ ) {
- contigs.add(new SAMSequenceRecord(Integer.toString(contig), contigLengths[contig - 1]));
- }
-
- int position = 22;
- for ( String contigName : Arrays.asList("X", "Y", "MT") ) {
- contigs.add(new SAMSequenceRecord(contigName, contigLengths[position]));
- position++;
- }
-
- return new SAMSequenceDictionary(contigs);
- }
-
- /**
- * Asserts that the two provided VariantContext objects are equal.
- *
- * @param actual actual VariantContext object
- * @param expected expected VariantContext to compare against
- */
- public static void assertVariantContextsAreEqual( final VariantContext actual, final VariantContext expected ) {
- Assert.assertNotNull(actual, "VariantContext expected not null");
- Assert.assertEquals(actual.getContig(), expected.getContig(), "chr");
- Assert.assertEquals(actual.getStart(), expected.getStart(), "start");
- Assert.assertEquals(actual.getEnd(), expected.getEnd(), "end");
- Assert.assertEquals(actual.getID(), expected.getID(), "id");
- Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "alleles for " + expected + " vs " + actual);
-
- assertAttributesEquals(actual.getAttributes(), expected.getAttributes());
- Assert.assertEquals(actual.filtersWereApplied(), expected.filtersWereApplied(), "filtersWereApplied");
- Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "isFiltered");
- assertEqualsSet(actual.getFilters(), expected.getFilters(), "filters");
- assertEqualsDoubleSmart(actual.getPhredScaledQual(), expected.getPhredScaledQual());
-
- Assert.assertEquals(actual.hasGenotypes(), expected.hasGenotypes(), "hasGenotypes");
- if ( expected.hasGenotypes() ) {
- assertEqualsSet(actual.getSampleNames(), expected.getSampleNames(), "sample names set");
- Assert.assertEquals(actual.getSampleNamesOrderedByName(), expected.getSampleNamesOrderedByName(), "sample names");
- final Set<String> samples = expected.getSampleNames();
- for ( final String sample : samples ) {
- assertGenotypesAreEqual(actual.getGenotype(sample), expected.getGenotype(sample));
- }
- }
- }
-
- /**
- * Asserts that the two provided Genotype objects are equal.
- *
- * @param actual actual Genotype object
- * @param expected expected Genotype object to compare against
- */
- public static void assertGenotypesAreEqual(final Genotype actual, final Genotype expected) {
- Assert.assertEquals(actual.getSampleName(), expected.getSampleName(), "Genotype names");
- Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "Genotype alleles");
- Assert.assertEquals(actual.getGenotypeString(), expected.getGenotypeString(), "Genotype string");
- Assert.assertEquals(actual.getType(), expected.getType(), "Genotype type");
-
- // filters are the same
- Assert.assertEquals(actual.getFilters(), expected.getFilters(), "Genotype fields");
- Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "Genotype isFiltered");
-
- // inline attributes
- Assert.assertEquals(actual.getDP(), expected.getDP(), "Genotype dp");
- Assert.assertTrue(Arrays.equals(actual.getAD(), expected.getAD()));
- Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype gq");
- Assert.assertEquals(actual.hasPL(), expected.hasPL(), "Genotype hasPL");
- Assert.assertEquals(actual.hasAD(), expected.hasAD(), "Genotype hasAD");
- Assert.assertEquals(actual.hasGQ(), expected.hasGQ(), "Genotype hasGQ");
- Assert.assertEquals(actual.hasDP(), expected.hasDP(), "Genotype hasDP");
-
- Assert.assertEquals(actual.hasLikelihoods(), expected.hasLikelihoods(), "Genotype haslikelihoods");
- Assert.assertEquals(actual.getLikelihoodsString(), expected.getLikelihoodsString(), "Genotype getlikelihoodsString");
- Assert.assertEquals(actual.getLikelihoods(), expected.getLikelihoods(), "Genotype getLikelihoods");
- Assert.assertTrue(Arrays.equals(actual.getPL(), expected.getPL()));
-
- Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype phredScaledQual");
- assertAttributesEquals(actual.getExtendedAttributes(), expected.getExtendedAttributes());
- Assert.assertEquals(actual.isPhased(), expected.isPhased(), "Genotype isPhased");
- Assert.assertEquals(actual.getPloidy(), expected.getPloidy(), "Genotype getPloidy");
- }
-
- /**
- * Asserts that the two sets of attribute mappings are equal. Ignores null-valued attributes in
- * "actual" that are not present in "expected" while performing the comparison.
- *
- * @param actual actual mapping of attributes
- * @param expected expected mapping of attributes
- */
- private static void assertAttributesEquals(final Map<String, Object> actual, Map<String, Object> expected) {
- final Set<String> expectedKeys = new HashSet<String>(expected.keySet());
-
- for ( final Map.Entry<String, Object> act : actual.entrySet() ) {
- final Object actualValue = act.getValue();
- if ( expected.containsKey(act.getKey()) && expected.get(act.getKey()) != null ) {
- final Object expectedValue = expected.get(act.getKey());
- if ( expectedValue instanceof List ) {
- final List<Object> expectedList = (List<Object>)expectedValue;
- Assert.assertTrue(actualValue instanceof List, act.getKey() + " should be a list but isn't");
- final List<Object> actualList = (List<Object>)actualValue;
- Assert.assertEquals(actualList.size(), expectedList.size(), act.getKey() + " size");
- for ( int i = 0; i < expectedList.size(); i++ ) {
- assertAttributeEquals(act.getKey(), actualList.get(i), expectedList.get(i));
- }
- }
- else {
- assertAttributeEquals(act.getKey(), actualValue, expectedValue);
- }
- }
- else {
- // it's ok to have a binding in x -> null that's absent in y
- Assert.assertNull(actualValue, act.getKey() + " present in one but not in the other");
- }
- expectedKeys.remove(act.getKey());
- }
-
- // now expectedKeys contains only the keys found in expected but not in actual,
- // and they must all be null
- for ( final String missingExpected : expectedKeys ) {
- final Object value = expected.get(missingExpected);
- Assert.assertTrue(isMissingAttribute(value), "Attribute " + missingExpected + " missing in one but not in other" );
- }
- }
-
- /**
- * Asserts that the two provided attribute values are equal. If the values are Doubles, uses a
- * more lenient comparision with a tolerance of 1e-2.
- *
- * @param key key for the attribute values
- * @param actual actual attribute value
- * @param expected expected attribute value against which to compare
- */
- private static void assertAttributeEquals(final String key, final Object actual, final Object expected) {
- if ( expected instanceof Double ) {
- // must be very tolerant because doubles are being rounded to 2 sig figs
- assertEqualsDoubleSmart(actual, (Double) expected, 1e-2);
- }
- else {
- Assert.assertEquals(actual, expected, "Attribute " + key);
- }
- }
-
- /**
- * Determines whether the provided attribute value is missing according to the VCF spec.
- * An attribute value is missing if it's null, is equal to {@link VCFConstants#MISSING_VALUE_v4},
- * or if it's a List that is either empty or contains only null values.
- *
- * @param value attribute value to test
- * @return true if value is a missing VCF attribute value, otherwise false
- */
- private static boolean isMissingAttribute(final Object value) {
- if ( value == null || value.equals(VCFConstants.MISSING_VALUE_v4) ) {
- return true;
- }
- else if ( value instanceof List ) {
- // handles the case where all elements are null or the list is empty
- for ( final Object elt : (List)value) {
- if (elt != null) {
- return false;
- }
- }
- return true;
- }
-
- return false;
- }
-
-}
diff --git a/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java b/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java
deleted file mode 100644
index 5122a42..0000000
--- a/src/test/java/htsjdk/variant/bcf2/BCF2EncoderDecoderUnitTest.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-// the imports for unit testing.
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.writer.BCF2Encoder;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-
-public class BCF2EncoderDecoderUnitTest extends VariantBaseTest {
- private final double FLOAT_TOLERANCE = 1e-6;
- final List<BCF2TypedValue> primitives = new ArrayList<BCF2TypedValue>();
- final List<BCF2TypedValue> basicTypes = new ArrayList<BCF2TypedValue>();
- final List<BCF2TypedValue> forCombinations = new ArrayList<BCF2TypedValue>();
-
- @BeforeSuite
- public void before() {
- basicTypes.add(new BCF2TypedValue(1, BCF2Type.INT8));
- basicTypes.add(new BCF2TypedValue(1000, BCF2Type.INT16));
- basicTypes.add(new BCF2TypedValue(1000000, BCF2Type.INT32));
- basicTypes.add(new BCF2TypedValue(1.2345e6, BCF2Type.FLOAT));
- basicTypes.add(new BCF2TypedValue("A", BCF2Type.CHAR));
-
- // small ints
- primitives.add(new BCF2TypedValue(0, BCF2Type.INT8));
- primitives.add(new BCF2TypedValue(10, BCF2Type.INT8));
- primitives.add(new BCF2TypedValue(-1, BCF2Type.INT8));
- primitives.add(new BCF2TypedValue(100, BCF2Type.INT8));
- primitives.add(new BCF2TypedValue(-100, BCF2Type.INT8));
- primitives.add(new BCF2TypedValue(-127, BCF2Type.INT8)); // last value in range
- primitives.add(new BCF2TypedValue( 127, BCF2Type.INT8)); // last value in range
-
- // medium ints
- primitives.add(new BCF2TypedValue(-1000, BCF2Type.INT16));
- primitives.add(new BCF2TypedValue(1000, BCF2Type.INT16));
- primitives.add(new BCF2TypedValue(-128, BCF2Type.INT16)); // first value in range
- primitives.add(new BCF2TypedValue( 128, BCF2Type.INT16)); // first value in range
- primitives.add(new BCF2TypedValue(-32767, BCF2Type.INT16)); // last value in range
- primitives.add(new BCF2TypedValue( 32767, BCF2Type.INT16)); // last value in range
-
- // larger ints
- primitives.add(new BCF2TypedValue(-32768, BCF2Type.INT32)); // first value in range
- primitives.add(new BCF2TypedValue( 32768, BCF2Type.INT32)); // first value in range
- primitives.add(new BCF2TypedValue(-100000, BCF2Type.INT32));
- primitives.add(new BCF2TypedValue(100000, BCF2Type.INT32));
- primitives.add(new BCF2TypedValue(-2147483647, BCF2Type.INT32));
- primitives.add(new BCF2TypedValue(2147483647, BCF2Type.INT32));
-
- // floats
- primitives.add(new BCF2TypedValue(0.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-0.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.1, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.1, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(5.0 / 3.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-5.0 / 3.0, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.23e3, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.23e6, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.23e9, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.23e12, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(1.23e15, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.23e3, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.23e6, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.23e9, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.23e12, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(-1.23e15, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(Float.MIN_VALUE, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(Float.MAX_VALUE, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(Double.NEGATIVE_INFINITY, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(Double.POSITIVE_INFINITY, BCF2Type.FLOAT));
- primitives.add(new BCF2TypedValue(Double.NaN, BCF2Type.FLOAT));
-
- // strings
- //primitives.add(new BCF2TypedValue("", BCFType.CHAR)); <- will be null (which is right)
- primitives.add(new BCF2TypedValue("S", BCF2Type.CHAR));
- primitives.add(new BCF2TypedValue("S2", BCF2Type.CHAR));
- primitives.add(new BCF2TypedValue("12345678910", BCF2Type.CHAR));
- primitives.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
- primitives.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-
- // missing values
- for ( BCF2Type type : BCF2Type.values() ) {
- primitives.add(new BCF2TypedValue(null, type));
- }
-
- forCombinations.add(new BCF2TypedValue(10, BCF2Type.INT8));
- forCombinations.add(new BCF2TypedValue(100, BCF2Type.INT8));
- forCombinations.add(new BCF2TypedValue(-100, BCF2Type.INT8));
- forCombinations.add(new BCF2TypedValue(-128, BCF2Type.INT16)); // first value in range
- forCombinations.add(new BCF2TypedValue( 128, BCF2Type.INT16)); // first value in range
- forCombinations.add(new BCF2TypedValue(-100000, BCF2Type.INT32));
- forCombinations.add(new BCF2TypedValue(100000, BCF2Type.INT32));
- forCombinations.add(new BCF2TypedValue(0.0, BCF2Type.FLOAT));
- forCombinations.add(new BCF2TypedValue(1.23e6, BCF2Type.FLOAT));
- forCombinations.add(new BCF2TypedValue(-1.23e6, BCF2Type.FLOAT));
- forCombinations.add(new BCF2TypedValue("S", BCF2Type.CHAR));
- forCombinations.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
- forCombinations.add(new BCF2TypedValue("ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ", BCF2Type.CHAR));
-
- // missing values
- for ( BCF2Type type : BCF2Type.values() ) {
- forCombinations.add(new BCF2TypedValue(null, type));
- }
- }
-
- // --------------------------------------------------------------------------------
- //
- // merge case Provider
- //
- // --------------------------------------------------------------------------------
-
- private class BCF2TypedValue {
- final BCF2Type type;
- final Object value;
-
- private BCF2TypedValue(final int value, final BCF2Type type) {
- this(new Integer(value), type);
- }
-
- private BCF2TypedValue(final double value, final BCF2Type type) {
- this(new Double(value), type);
- }
-
- private BCF2TypedValue(final Object value, final BCF2Type type) {
- this.type = type;
- this.value = value;
- }
-
- public boolean isMissing() { return value == null; }
-
- @Override
- public String toString() {
- return String.format("%s of %s", value, type);
- }
- }
-
- // -----------------------------------------------------------------
- //
- // Test encoding of basic types
- //
- // -----------------------------------------------------------------
-
- @DataProvider(name = "BCF2EncodingTestProviderBasicTypes")
- public Object[][] BCF2EncodingTestProviderBasicTypes() {
- List<Object[]> tests = new ArrayList<Object[]>();
- for ( BCF2TypedValue tv : basicTypes )
- tests.add(new Object[]{Arrays.asList(tv)});
- return tests.toArray(new Object[][]{});
- }
-
- private interface EncodeMe {
- public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException;
- }
-
-
- @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
- public void testBCF2BasicTypesWithStaticCalls(final List<BCF2TypedValue> toEncode) throws IOException {
- testBCF2BasicTypesWithEncodeMe(toEncode,
- new EncodeMe() {
- @Override
- public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
- switch ( tv.type ) {
- case INT8:
- case INT16:
- case INT32:
- encoder.encodeTypedInt((Integer)tv.value, tv.type);
- break;
- case FLOAT:
- encoder.encodeTypedFloat((Double)tv.value);
- break;
- case CHAR:
- encoder.encodeTypedString((String)tv.value);
- break;
- }
- }
- });
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
- public void testBCF2BasicTypesWithObjectType(final List<BCF2TypedValue> toEncode) throws IOException {
- testBCF2BasicTypesWithEncodeMe(toEncode,
- new EncodeMe() {
- @Override
- public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
- encoder.encodeTyped(tv.value, tv.type);
- }
- });
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
- public void testBCF2BasicTypesWithObjectNoType(final List<BCF2TypedValue> toEncode) throws IOException {
- testBCF2BasicTypesWithEncodeMe(toEncode,
- new EncodeMe() {
- @Override
- public void encode(final BCF2Encoder encoder, final BCF2TypedValue tv) throws IOException {
- encoder.encode(tv.value);
- }
- });
- }
-
- public void testBCF2BasicTypesWithEncodeMe(final List<BCF2TypedValue> toEncode, final EncodeMe func) throws IOException {
- for ( final BCF2TypedValue tv : toEncode ) {
- BCF2Encoder encoder = new BCF2Encoder();
- func.encode(encoder, tv);
-
- BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
- final Object decoded = decoder.decodeTypedValue();
-
- Assert.assertNotNull(decoded);
- Assert.assertFalse(decoded instanceof List);
- myAssertEquals(tv, decoded);
- }
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
- public void testBCF2EncodingVectors(final List<BCF2TypedValue> toEncode) throws IOException {
- for ( final BCF2TypedValue tv : toEncode ) {
- for ( final int length : Arrays.asList(2, 5, 10, 15, 20, 25) ) {
- BCF2Encoder encoder = new BCF2Encoder();
- List<Object> expected = Collections.nCopies(length, tv.value);
- encoder.encodeTyped(expected, tv.type);
-
- BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
- final Object decoded = decoder.decodeTypedValue();
-
- Assert.assertTrue(decoded instanceof List);
- final List<Object> decodedList = (List<Object>)decoded;
- Assert.assertEquals(decodedList.size(), expected.size());
- for ( Object decodedValue : decodedList )
- myAssertEquals(tv, decodedValue);
- }
- }
- }
-
- @DataProvider(name = "BCF2EncodingTestProviderSingletons")
- public Object[][] BCF2EncodingTestProviderSingletons() {
- List<Object[]> tests = new ArrayList<Object[]>();
- for ( BCF2TypedValue tv : primitives )
- tests.add(new Object[]{Arrays.asList(tv)});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderSingletons")
- public void testBCF2EncodingSingletons(final List<BCF2TypedValue> toEncode) throws IOException {
- final byte[] record = encodeRecord(toEncode);
- decodeRecord(toEncode, record);
- }
-
- // -----------------------------------------------------------------
- //
- // Test encoding of vectors
- //
- // -----------------------------------------------------------------
-
- @DataProvider(name = "BCF2EncodingTestProviderSequences")
- public Object[][] BCF2EncodingTestProviderSequences() {
- List<Object[]> tests = new ArrayList<Object[]>();
- for ( BCF2TypedValue tv1 : forCombinations )
- for ( BCF2TypedValue tv2 : forCombinations )
- for ( BCF2TypedValue tv3 : forCombinations )
- tests.add(new Object[]{Arrays.asList(tv1, tv2, tv3)});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderBasicTypes")
- public void testBCF2EncodingVectorsWithMissing(final List<BCF2TypedValue> toEncode) throws IOException {
- for ( final BCF2TypedValue tv : toEncode ) {
- if ( tv.type != BCF2Type.CHAR ) {
- for ( final int length : Arrays.asList(2, 5, 10, 15, 20, 25) ) {
- final byte td = BCF2Utils.encodeTypeDescriptor(1, tv.type);
-
- final BCF2Encoder encoder = new BCF2Encoder();
- for ( int i = 0; i < length; i++ ) {
- encoder.encodeRawValue(i % 2 == 0 ? null : tv.value, tv.type);
- }
-
- final BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-
- for ( int i = 0; i < length; i++ ) {
- final Object decoded = decoder.decodeTypedValue(td);
- myAssertEquals(i % 2 == 0 ? new BCF2TypedValue(null, tv.type) : tv, decoded);
- }
- }
- }
- }
- }
-
- @Test(dataProvider = "BCF2EncodingTestProviderSequences", dependsOnMethods = "testBCF2EncodingSingletons")
- public void testBCF2EncodingTestProviderSequences(final List<BCF2TypedValue> toEncode) throws IOException {
- final byte[] record = encodeRecord(toEncode);
- decodeRecord(toEncode, record);
- }
-
- // -----------------------------------------------------------------
- //
- // Test strings and lists of strings
- //
- // -----------------------------------------------------------------
-
- @DataProvider(name = "ListOfStrings")
- public Object[][] listOfStringsProvider() {
- List<Object[]> tests = new ArrayList<Object[]>();
- tests.add(new Object[]{Arrays.asList("s1", "s2"), ",s1,s2"});
- tests.add(new Object[]{Arrays.asList("s1", "s2", "s3"), ",s1,s2,s3"});
- tests.add(new Object[]{Arrays.asList("s1", "s2", "s3", "s4"), ",s1,s2,s3,s4"});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "ListOfStrings")
- public void testEncodingListOfString(List<String> strings, String expected) throws IOException {
- final String collapsed = BCF2Utils.collapseStringList(strings);
- Assert.assertEquals(collapsed, expected);
- Assert.assertEquals(BCF2Utils.explodeStringList(collapsed), strings);
- }
-
- // -----------------------------------------------------------------
- //
- // Tests to determine the best type of arrays of integers
- //
- // -----------------------------------------------------------------
-
- @DataProvider(name = "BestIntTypeTests")
- public Object[][] BestIntTypeTests() {
- List<Object[]> tests = new ArrayList<Object[]>();
- tests.add(new Object[]{Arrays.asList(1), BCF2Type.INT8});
- tests.add(new Object[]{Arrays.asList(1, 10), BCF2Type.INT8});
- tests.add(new Object[]{Arrays.asList(1, 10, 100), BCF2Type.INT8});
- tests.add(new Object[]{Arrays.asList(1, -1), BCF2Type.INT8});
- tests.add(new Object[]{Arrays.asList(1, 1000), BCF2Type.INT16});
- tests.add(new Object[]{Arrays.asList(1, 1000, 10), BCF2Type.INT16});
- tests.add(new Object[]{Arrays.asList(1, 1000, 100), BCF2Type.INT16});
- tests.add(new Object[]{Arrays.asList(1000), BCF2Type.INT16});
- tests.add(new Object[]{Arrays.asList(100000), BCF2Type.INT32});
- tests.add(new Object[]{Arrays.asList(100000, 10), BCF2Type.INT32});
- tests.add(new Object[]{Arrays.asList(100000, 100), BCF2Type.INT32});
- tests.add(new Object[]{Arrays.asList(100000, 1, -10), BCF2Type.INT32});
- tests.add(new Object[]{Arrays.asList(-100000, 1, -10), BCF2Type.INT32});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "BestIntTypeTests")
- public void determineBestEncoding(final List<Integer> ints, final BCF2Type expectedType) throws IOException {
- BCF2Encoder encoder = new BCF2Encoder();
- Assert.assertEquals(BCF2Utils.determineIntegerType(ints), expectedType);
- Assert.assertEquals(BCF2Utils.determineIntegerType(toPrimitive(ints.toArray(new Integer[0]))), expectedType);
- }
-
- private static int[] toPrimitive ( final Integer[] array ) {
- if ( array == null ) {
- return null;
- }
- else if ( array.length == 0 ) {
- return new int[0];
- }
-
- final int[] result = new int[array.length];
- for (int i = 0; i < array.length; i++) {
- result[i] = array[i].intValue();
- }
- return result;
- }
-
- // -----------------------------------------------------------------
- //
- // Tests managing and skipping multiple blocks
- //
- // -----------------------------------------------------------------
-
- @Test(dataProvider = "BCF2EncodingTestProviderSequences", dependsOnMethods = "testBCF2EncodingTestProviderSequences")
- public void testReadAndSkipWithMultipleBlocks(final List<BCF2TypedValue> block) throws IOException {
- testReadAndSkipWithMultipleBlocks(block, forCombinations);
- testReadAndSkipWithMultipleBlocks(forCombinations, block);
- }
-
- public void testReadAndSkipWithMultipleBlocks(final List<BCF2TypedValue> block1, final List<BCF2TypedValue> block2) throws IOException {
- final byte[] record1 = encodeRecord(block1);
- final byte[] record2 = encodeRecord(block2);
-
- // each record is individually good
- decodeRecord(block1, record1);
- decodeRecord(block2, record2);
-
- BCF2Decoder decoder = new BCF2Decoder();
-
- // test setting
- decoder.setRecordBytes(record1);
- decodeRecord(block1, decoder);
- decoder.setRecordBytes(record2);
- decodeRecord(block2, decoder);
-
- // test combining the streams
- final byte[] combined = combineRecords(record1, record2);
- final List<BCF2TypedValue> combinedObjects = new ArrayList<BCF2TypedValue>(block1);
- combinedObjects.addAll(block2);
-
- // the combined bytes is the same as the combined objects
- InputStream stream = new ByteArrayInputStream(combined);
- decoder.readNextBlock(record1.length, stream);
- decodeRecord(block1, decoder);
- decoder.readNextBlock(record2.length, stream);
- decodeRecord(block2, decoder);
-
- // skipping the first block allows us to read the second block directly
- stream = new ByteArrayInputStream(combined);
- decoder.skipNextBlock(record1.length, stream);
- decoder.readNextBlock(record2.length, stream);
- decodeRecord(block2, decoder);
- }
-
- // -----------------------------------------------------------------
- //
- // Test encoding / decoding arrays of ints
- //
- // This checks that we can encode and decode correctly with the
- // low-level decodeIntArray function arrays of values. This
- // has to be pretty comprehensive as decodeIntArray is a highly optimized
- // piece of code with lots of edge cases. The values we are encoding
- // don't really matter -- just that the values come back as expected.
- //
- // -----------------------------------------------------------------
-
- @DataProvider(name = "IntArrays")
- public Object[][] makeIntArrays() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- for ( int nValues : Arrays.asList(0, 1, 2, 5, 10, 100) ) {
- for ( int nPad : Arrays.asList(0, 1, 2, 5, 10, 100) ) {
- int nElements = nValues + nPad;
-
- List<Integer> values = new ArrayList<Integer>(nElements);
-
- // add nValues from 0 to nValues - 1
- for ( int i = 0; i < nValues; i++ )
- values.add(i);
-
- // add nPad nulls
- for ( int i = 0; i < nPad; i++ )
- values.add(null);
-
- tests.add(new Object[]{values});
- }
- }
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "IntArrays")
- public void testIntArrays(final List<Integer> ints) throws IOException {
- final BCF2Encoder encoder = new BCF2Encoder();
- encoder.encodeTyped(ints, BCF2Type.INT16);
-
- final BCF2Decoder decoder = new BCF2Decoder(encoder.getRecordBytes());
-
- final byte typeDescriptor = decoder.readTypeDescriptor();
-
- // read the int[] with the low-level version
- final int size = decoder.decodeNumberOfElements(typeDescriptor);
- final int[] decoded = decoder.decodeIntArray(typeDescriptor, size);
-
- if ( isMissing(ints) ) {
- // we expect that the result is null in this case
- Assert.assertNull(decoded, "Encoded all missing values -- expected null");
- } else {
- // we expect at least some values to come back
- Assert.assertTrue(decoded.length > 0, "Must have at least 1 element for non-null encoded data");
-
- // check corresponding values
- for ( int i = 0; i < ints.size(); i++ ) {
- final Integer expected = ints.get(i);
-
- if ( expected == null ) {
- Assert.assertTrue(decoded.length <= i, "we expect decoded to be truncated for missing values");
- } else {
- Assert.assertTrue(decoded.length > i, "we expected at least " + i + " values in decoded array");
- Assert.assertEquals(decoded[i], (int)expected);
- }
- }
- }
- }
-
- // -----------------------------------------------------------------
- //
- // Helper routines
- //
- // -----------------------------------------------------------------
-
- private final byte[] combineRecords(final byte[] record1, final byte[] record2) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- baos.write(record1);
- baos.write(record2);
- return baos.toByteArray();
- }
-
- private final byte[] encodeRecord(final List<BCF2TypedValue> toEncode) throws IOException {
- BCF2Encoder encoder = new BCF2Encoder();
-
- for ( final BCF2TypedValue tv : toEncode ) {
- if ( tv.isMissing() )
- encoder.encodeTypedMissing(tv.type);
- else {
- final BCF2Type encodedType = encoder.encode(tv.value);
- if ( tv.type != null ) // only if we have an expectation
- Assert.assertEquals(encodedType, tv.type);
- }
- }
-
- // check output
- final byte[] record = encoder.getRecordBytes();
- Assert.assertNotNull(record);
- Assert.assertTrue(record.length > 0);
- return record;
- }
-
- private final void decodeRecord(final List<BCF2TypedValue> toEncode, final byte[] record) throws IOException {
- decodeRecord(toEncode, new BCF2Decoder(record));
- }
-
- private final void decodeRecord(final List<BCF2TypedValue> toEncode, final BCF2Decoder decoder) throws IOException {
- for ( final BCF2TypedValue tv : toEncode ) {
- Assert.assertFalse(decoder.blockIsFullyDecoded());
- final Object decoded = decoder.decodeTypedValue();
-
- myAssertEquals(tv, decoded);
- }
-
- Assert.assertTrue(decoder.blockIsFullyDecoded());
- }
-
- private final void myAssertEquals(final BCF2TypedValue tv, final Object decoded) {
- if ( tv.value == null ) { // special needs for instanceof double
- Assert.assertEquals(decoded, tv.value);
- } else if ( tv.type == BCF2Type.FLOAT ) { // need tolerance for floats, and they aren't null
- Assert.assertTrue(decoded instanceof Double);
-
- final double valueFloat = (Double)tv.value;
- final double decodedFloat = (Double)decoded;
-
- VariantBaseTest.assertEqualsDoubleSmart(decodedFloat, valueFloat, FLOAT_TOLERANCE);
- } else
- Assert.assertEquals(decoded, tv.value);
- }
-
- private final boolean isMissing(final List<Integer> values) {
- if ( values != null )
- for ( Integer value : values )
- if ( value != null )
- return false;
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java b/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java
deleted file mode 100644
index 91804c4..0000000
--- a/src/test/java/htsjdk/variant/bcf2/BCF2UtilsUnitTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.bcf2;
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFFilterHeaderLine;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFIDHeaderLine;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-import htsjdk.variant.vcf.VCFSimpleHeaderLine;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-/**
- * Tests for BCF2Utils
- */
-public final class BCF2UtilsUnitTest extends VariantBaseTest {
- @DataProvider(name = "CollapseExpandTest")
- public Object[][] makeCollapseExpandTest() {
- List<Object[]> tests = new ArrayList<Object[]>();
- tests.add(new Object[]{Arrays.asList("A"), "A", false});
- tests.add(new Object[]{Arrays.asList("A", "B"), ",A,B", true});
- tests.add(new Object[]{Arrays.asList("AB"), "AB", false});
- tests.add(new Object[]{Arrays.asList("AB", "C"), ",AB,C", true});
- tests.add(new Object[]{Arrays.asList(), "", false});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "CollapseExpandTest")
- public void testCollapseExpandTest(final List<String> in, final String expectedCollapsed, final boolean isCollapsed) {
- final String actualCollapsed = BCF2Utils.collapseStringList(in);
- Assert.assertEquals(actualCollapsed, expectedCollapsed);
- Assert.assertEquals(BCF2Utils.isCollapsedString(actualCollapsed), isCollapsed);
- if ( isCollapsed )
- Assert.assertEquals(BCF2Utils.explodeStringList(actualCollapsed), in);
- }
-
- @Test
- public void testCreateDictionary() {
- final List<VCFHeaderLine> inputLines = new ArrayList<VCFHeaderLine>();
- int counter = 0;
- inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
- inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
- inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
- inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
- inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFHeaderLine("x", "misc"));
- inputLines.add(new VCFHeaderLine("y", "misc"));
- inputLines.add(new VCFSimpleHeaderLine("GATKCommandLine","z","misc"));
- inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- final int inputLineCounter = counter;
- final VCFHeader inputHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(inputLines));
- final ArrayList<String> dict = BCF2Utils.makeDictionary(inputHeader);
- final int dict_size = dict.size();
- Assert.assertEquals(7,dict_size);
- }
-
- /**
- * Wrapper class for HeaderOrderTestProvider test cases to prevent TestNG from calling toString()
- * on the VCFHeaders and spamming the log output.
- */
- private static class HeaderOrderTestCase {
- public final VCFHeader inputHeader;
- public final VCFHeader testHeader;
- public final boolean expectedConsistent;
-
- public HeaderOrderTestCase( final VCFHeader inputHeader, final VCFHeader testHeader, final boolean expectedConsistent ) {
- this.inputHeader = inputHeader;
- this.testHeader = testHeader;
- this.expectedConsistent = expectedConsistent;
- }
- }
-
- @DataProvider(name = "HeaderOrderTestProvider")
- public Object[][] makeHeaderOrderTestProvider() {
- final List<VCFHeaderLine> inputLines = new ArrayList<VCFHeaderLine>();
- final List<VCFHeaderLine> extraLines = new ArrayList<VCFHeaderLine>();
-
- int counter = 0;
- inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
- inputLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
- inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
- inputLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
- inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- inputLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- final int inputLineCounter = counter;
- final VCFHeader inputHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(inputLines));
-
- extraLines.add(new VCFFilterHeaderLine(String.valueOf(counter++)));
- extraLines.add(new VCFContigHeaderLine(Collections.singletonMap("ID", String.valueOf(counter++)), counter));
- extraLines.add(new VCFInfoHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- extraLines.add(new VCFFormatHeaderLine(String.valueOf(counter++), VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"));
- extraLines.add(new VCFHeaderLine("x", "misc"));
- extraLines.add(new VCFHeaderLine("y", "misc"));
-
- List<Object[]> tests = new ArrayList<Object[]>();
- for ( final int extrasToTake : Arrays.asList(0, 1, 2, 3) ) {
- final List<VCFHeaderLine> empty = Collections.emptyList();
- final List<List<VCFHeaderLine>> permutations = extrasToTake == 0
- ? Collections.singletonList(empty)
- : GeneralUtils.makePermutations(extraLines, extrasToTake, false);
- for ( final List<VCFHeaderLine> permutation : permutations ) {
- for ( int i = -1; i < inputLines.size(); i++ ) {
- final List<VCFHeaderLine> allLines = new ArrayList<VCFHeaderLine>(inputLines);
- if ( i >= 0 )
- allLines.remove(i);
- allLines.addAll(permutation);
- final VCFHeader testHeader = new VCFHeader(new LinkedHashSet<VCFHeaderLine>(allLines));
- final boolean expectedConsistent = expectedConsistent(testHeader, inputLineCounter);
- tests.add(new Object[]{new HeaderOrderTestCase(inputHeader, testHeader, expectedConsistent)});
- }
- }
- }
-
- // sample name tests
- final List<List<String>> sampleNameTests = Arrays.asList(
- new ArrayList<String>(),
- Arrays.asList("A"),
- Arrays.asList("A", "B"),
- Arrays.asList("A", "B", "C"));
- for ( final List<String> inSamples : sampleNameTests ) {
- for ( final List<String> testSamples : sampleNameTests ) {
- final VCFHeader inputHeaderWithSamples = new VCFHeader(inputHeader.getMetaDataInInputOrder(), inSamples);
-
- final List<List<String>> permutations = testSamples.isEmpty()
- ? Collections.singletonList(testSamples)
- : GeneralUtils.makePermutations(testSamples, testSamples.size(), false);
- for ( final List<String> testSamplesPermutation : permutations ) {
- final VCFHeader testHeaderWithSamples = new VCFHeader(inputHeader.getMetaDataInInputOrder(), testSamplesPermutation);
- final boolean expectedConsistent = testSamples.equals(inSamples);
- tests.add(new Object[]{new HeaderOrderTestCase(inputHeaderWithSamples, testHeaderWithSamples, expectedConsistent)});
- }
- }
- }
-
- return tests.toArray(new Object[][]{});
- }
-
- private static boolean expectedConsistent(final VCFHeader combinationHeader, final int minCounterForInputLines) {
- final List<Integer> ids = new ArrayList<Integer>();
- for ( final VCFHeaderLine line : combinationHeader.getMetaDataInInputOrder() ) {
- if ( line instanceof VCFIDHeaderLine) {
- ids.add(Integer.valueOf(((VCFIDHeaderLine) line).getID()));
- }
- }
-
- // as long as the start contains all of the ids up to minCounterForInputLines in order
- for ( int i = 0; i < minCounterForInputLines; i++ )
- if ( i >= ids.size() || ids.get(i) != i )
- return false;
-
- return true;
- }
-
- //
- // Test to make sure that we detect correctly the case where we can preserve the genotypes data in a BCF2
- // even when the header file is slightly different
- //
- @Test(dataProvider = "HeaderOrderTestProvider")
- public void testHeaderOrder( final HeaderOrderTestCase testCase ) {
- final boolean actualOrderConsistency = BCF2Utils.headerLinesAreOrderedConsistently(testCase.testHeader, testCase.inputHeader);
- Assert.assertEquals(actualOrderConsistency, testCase.expectedConsistent);
- }
-
-
- private void assertListsAreEquivalent(final List<?> a, final List<?> b) {
- Assert.assertEquals(a.size(), b.size());
- for (int i=0; i<a.size(); i++)
- Assert.assertEquals(a.get(i), b.get(i));
- }
-
- @DataProvider(name = "toListTestProvider")
- public Object[][] makeToListTest() {
- final List<Object[]> tests = new ArrayList<Object[]>();
- tests.add(new Object[]{Object.class, null, Collections.emptyList()});
- tests.add(new Object[]{Integer.class, 1, Arrays.asList(1)});
- tests.add(new Object[]{Integer.class, new int[]{1, 2, 3}, Arrays.asList(1, 2, 3)});
- tests.add(new Object[]{String.class, Arrays.asList("X", "Y"), Arrays.asList("X", "Y")});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "toListTestProvider")
- public void testToList(final Class<?> cls, final Object input, final List<Object> expectedOutput) {
- assertListsAreEquivalent(BCF2Utils.toList(cls, input), expectedOutput);
- }
-
-
-}
diff --git a/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java b/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java
deleted file mode 100644
index 9fb13e8..0000000
--- a/src/test/java/htsjdk/variant/utils/SAMSequenceDictionaryExtractorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.utils;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.SequenceUtil;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import org.testng.Assert;
-
-import java.io.File;
-
-/**
- * @author farjoun on 4/9/14.
- */
-public class SAMSequenceDictionaryExtractorTest {
- String path = "src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/";
-
- @DataProvider(name = "testExtractDictionaries")
- public Object[][] dictionaries() {
- return new Object[][]{
- new Object[]{"test1_comp.interval_list", "test1.dict"},
- new Object[]{"test1.vcf", "test1.dict"},
- new Object[]{"test1.dict", "test1.dict"},
- new Object[]{"empty.interval_list", "test1.dict"},
- new Object[]{"Homo_sapiens_assembly18.trimmed.fasta", "Homo_sapiens_assembly18.trimmed.dict"},
- new Object[]{"test2_comp.interval_list", "Homo_sapiens_assembly18.trimmed.dict"},
- new Object[]{"ScreenSamReads.100.input.sam", "test3_comp.interval_list"},
- new Object[]{"ScreenSamReads.100.input.sam", "test4_comp.interval_list"},
- };
- }
-
- @Test(dataProvider = "testExtractDictionaries")
- public void testExtractDictionary(final String dictSource, final String dictExpected) throws Exception {
- final File dictSourceFile = new File(path, dictSource);
- final File dictExpectedFile = new File(path, dictExpected);
- final SAMSequenceDictionary dict1 = SAMSequenceDictionaryExtractor.extractDictionary(dictSourceFile);
- final SAMSequenceDictionary dict2 = SAMSequenceDictionaryExtractor.extractDictionary(dictExpectedFile);
-
- Assert.assertTrue(SequenceUtil.areSequenceDictionariesEqual(dict1,
- dict2));
- Assert.assertTrue(dict1.md5().equals(dict2.md5()));
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java
deleted file mode 100644
index c2aa79f..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/AlleleUnitTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-// public Allele(byte[] bases, boolean isRef) {
-// public Allele(boolean isRef) {
-// public Allele(String bases, boolean isRef) {
-// public boolean isReference() { return isRef; }
-// public boolean isNonReference() { return ! isReference(); }
-// public byte[] getBases() { return bases; }
-// public boolean equals(Allele other) {
-// public int length() {
-
-/**
- * Basic unit test for RecalData
- */
-public class AlleleUnitTest extends VariantBaseTest {
- Allele ARef, A, T, ATIns, ATCIns, NoCall, SpandDel;
-
- @BeforeSuite
- public void before() {
- A = Allele.create("A");
- ARef = Allele.create("A", true);
- T = Allele.create("T");
-
- ATIns = Allele.create("AT");
- ATCIns = Allele.create("ATC");
-
- NoCall = Allele.create(Allele.NO_CALL_STRING);
-
- SpandDel = Allele.create(Allele.SPAN_DEL_STRING);
- }
-
- @Test
- public void testCreatingSNPAlleles() {
- Assert.assertTrue(A.isNonReference());
- Assert.assertFalse(A.isReference());
- Assert.assertTrue(A.basesMatch("A"));
- Assert.assertEquals(A.length(), 1);
-
- Assert.assertTrue(ARef.isReference());
- Assert.assertFalse(ARef.isNonReference());
- Assert.assertTrue(ARef.basesMatch("A"));
- Assert.assertFalse(ARef.basesMatch("T"));
-
- Assert.assertTrue(T.isNonReference());
- Assert.assertFalse(T.isReference());
- Assert.assertTrue(T.basesMatch("T"));
- Assert.assertFalse(T.basesMatch("A"));
- }
-
- @Test
- public void testCreatingNoCallAlleles() {
- Assert.assertTrue(NoCall.isNonReference());
- Assert.assertFalse(NoCall.isReference());
- Assert.assertFalse(NoCall.basesMatch(Allele.NO_CALL_STRING));
- Assert.assertEquals(NoCall.length(), 0);
- Assert.assertTrue(NoCall.isNoCall());
- Assert.assertFalse(NoCall.isCalled());
- }
-
- @Test
- public void testCreatingSpanningDeletionAlleles() {
- Assert.assertTrue(SpandDel.isNonReference());
- Assert.assertFalse(SpandDel.isReference());
- Assert.assertTrue(SpandDel.basesMatch(Allele.SPAN_DEL_STRING));
- Assert.assertEquals(SpandDel.length(), 1);
- }
-
- @Test
- public void testCreatingIndelAlleles() {
- Assert.assertEquals(ATIns.length(), 2);
- Assert.assertEquals(ATCIns.length(), 3);
- Assert.assertEquals(ATIns.getBases(), "AT".getBytes());
- Assert.assertEquals(ATCIns.getBases(), "ATC".getBytes());
- }
-
-
- @Test
- public void testConstructors1() {
- Allele a1 = Allele.create("A");
- Allele a2 = Allele.create("A".getBytes());
- Allele a3 = Allele.create("A");
- Allele a4 = Allele.create("A", true);
-
- Assert.assertTrue(a1.equals(a2));
- Assert.assertTrue(a1.equals(a3));
- Assert.assertFalse(a1.equals(a4));
- }
-
- @Test
- public void testInsConstructors() {
- Allele a1 = Allele.create("AC");
- Allele a2 = Allele.create("AC".getBytes());
- Allele a3 = Allele.create("AC");
- Allele a4 = Allele.create("AC", true);
-
- Assert.assertTrue(a1.equals(a2));
- Assert.assertTrue(a1.equals(a3));
- Assert.assertFalse(a1.equals(a4));
- }
-
- @Test
- public void testVCF42Breakend() {
- Allele a;
-
- a = Allele.create("A.");
- Assert.assertTrue(a.isSymbolic());
- Assert.assertEquals("A.", a.getDisplayString());
-
- a = Allele.create(".A");
- Assert.assertTrue(a.isSymbolic());
- Assert.assertEquals(".A", a.getDisplayString());
-
- Assert.assertTrue(Allele.create("AA.").isSymbolic());
- Assert.assertTrue(Allele.create(".AA").isSymbolic());
- }
-
- @Test
- public void testBreakpoint() {
- Allele a = Allele.create("A[chr1:1[");
-
- Assert.assertTrue(a.isSymbolic());
- Assert.assertEquals("A[chr1:1[", a.getDisplayString());
-
- Assert.assertTrue(Allele.create("]chr1:1]A").isSymbolic());
- Assert.assertTrue(Allele.create("[chr1:1[A").isSymbolic());
- Assert.assertTrue(Allele.create("A]chr1:1]").isSymbolic());
- }
-
- @Test
- public void testBreakpointSymbolicBreakend() {
- Assert.assertTrue(Allele.create("A[<contig>:1[").isSymbolic());
- Assert.assertTrue(Allele.create("A]<contig>:1]").isSymbolic());
- Assert.assertTrue(Allele.create("]<contig>:1]A").isSymbolic());
- Assert.assertTrue(Allele.create("[<contig>:1[A").isSymbolic());
- }
-
- @Test
- public void testInsSymbolicShorthand() {
- Assert.assertTrue(Allele.create("A<ctg1>").isSymbolic());
- Assert.assertTrue(Allele.create("<ctg1>A").isSymbolic());
- }
-
- @Test
- public void testTelomericBreakend() {
- Assert.assertTrue(Allele.create(".[1:10]").isSymbolic());
- Assert.assertTrue(Allele.create("[1:10].").isSymbolic());
- }
-
- @Test
- public void testSymbolic() {
- Allele a = Allele.create("<SYMBOLIC>");
-
- Assert.assertTrue(a.isSymbolic());
- Assert.assertEquals("<SYMBOLIC>", a.getDisplayString());
- }
-
- @Test
- public void testEquals() {
- Assert.assertTrue(ARef.basesMatch(A));
- Assert.assertFalse(ARef.equals(A));
- Assert.assertFalse(ARef.equals(ATIns));
- Assert.assertFalse(ARef.equals(ATCIns));
-
- Assert.assertTrue(T.basesMatch(T));
- Assert.assertFalse(T.basesMatch(A));
- Assert.assertFalse(T.equals(A));
-
- Assert.assertTrue(ATIns.equals(ATIns));
- Assert.assertFalse(ATIns.equals(ATCIns));
- Assert.assertTrue(ATIns.basesMatch("AT"));
- Assert.assertFalse(ATIns.basesMatch("A"));
- Assert.assertFalse(ATIns.basesMatch("ATC"));
-
- Assert.assertTrue(ATIns.basesMatch("AT"));
- Assert.assertFalse(ATIns.basesMatch("ATC"));
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs1() {
- byte[] foo = null;
- Allele.create(foo);
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs2() {
- Allele.create("x");
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs3() {
- Allele.create("--");
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs4() {
- Allele.create("-A");
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs5() {
- Allele.create("A A");
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadConstructorArgs6() {
- Allele.create("<symbolic>", true); // symbolic cannot be ref allele
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadNoCallAllelel() {
- Allele.create(Allele.NO_CALL_STRING, true); // no call cannot be ref allele
- }
-
- @Test (expectedExceptions = IllegalArgumentException.class)
- public void testBadSpanningDeletionAllelel() {
- Allele.create(Allele.SPAN_DEL_STRING, true); // spanning deletion cannot be ref allele
- }
-
- @Test
- public void testExtend() {
- Assert.assertEquals("AT", Allele.extend(Allele.create("A"), "T".getBytes()).toString());
- Assert.assertEquals("ATA", Allele.extend(Allele.create("A"), "TA".getBytes()).toString());
- Assert.assertEquals("A", Allele.extend(Allele.NO_CALL, "A".getBytes()).toString());
- Assert.assertEquals("ATCGA", Allele.extend(Allele.create("AT"), "CGA".getBytes()).toString());
- Assert.assertEquals("ATCGA", Allele.extend(Allele.create("ATC"), "GA".getBytes()).toString());
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java
deleted file mode 100644
index 5e3f0b9..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeBuilderTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-* Copyright (c) 2016 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class GenotypeBuilderTest extends VariantBaseTest {
-
- @Test
- public void testMakeWithShallowCopy() {
- final GenotypeBuilder gb = new GenotypeBuilder("test");
- final List<Allele> alleles = new ArrayList<>(
- Arrays.asList(Allele.create("A", true), Allele.create("T")));
- final int[] ad = new int[]{1,5};
- final int[] pl = new int[]{1,6};
- final int[] first = new int[]{1, 2};
- final int[] second = new int[]{3, 4};
- final Genotype firstG = gb.alleles(alleles).attribute("first", first).makeWithShallowCopy();
- final Genotype secondG = gb.AD(ad).PL(pl).attribute("second", second).makeWithShallowCopy();
- // both genotypes have the first field
- Assert.assertEquals(first, firstG.getExtendedAttribute("first"));
- Assert.assertEquals(first, secondG.getExtendedAttribute("first"));
- // both genotypes have the the alleles
- Assert.assertEquals(alleles, firstG.getAlleles());
- Assert.assertEquals(alleles, secondG.getAlleles());
- // only the second genotype should have the AD field
- Assert.assertNull(firstG.getAD());
- Assert.assertEquals(ad, secondG.getAD());
- // only the second genotype should have the PL field
- Assert.assertNull(firstG.getPL());
- Assert.assertEquals(pl, secondG.getPL());
- // only the second genotype should have the second field
- Assert.assertNull(firstG.getExtendedAttribute("second"));
- Assert.assertEquals(second, secondG.getExtendedAttribute("second"));
- // modification of alleles does not change the genotypes
- alleles.add(Allele.create("C"));
- Assert.assertNotEquals(alleles, firstG.getAlleles());
- Assert.assertNotEquals(alleles, secondG.getAlleles());
- // modification of ad or pl does not change the genotypes
- ad[0] = 0;
- pl[0] = 10;
- Assert.assertNotEquals(ad, secondG.getAD());
- Assert.assertNotEquals(pl, secondG.getPL());
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java
deleted file mode 100644
index a7c2bb6..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeLikelihoodsUnitTest.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * Basic unit test for Genotype likelihoods objects
- */
-public class GenotypeLikelihoodsUnitTest extends VariantBaseTest {
- double [] v = new double[]{-10.5, -1.25, -5.11};
- final static String vGLString = "-10.50,-1.25,-5.11";
- final static String vPLString = "93,0,39";
- double[] triAllelic = new double[]{-4.2,-2.0,-3.0,-1.6,0.0,-4.0}; //AA,AB,AC,BB,BC,CC
-
- @BeforeMethod
- public void initializeAnyploidPLIndexToAlleleIndices() {
- GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.clear();
- GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(1, 1);
- GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(2, 2);
- GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(2, 3);
- }
-
- @Test
- public void testFromVector2() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(v);
- assertDoubleArraysAreEqual(gl.getAsVector(), v);
- Assert.assertEquals(gl.getAsString(), vPLString);
- }
-
- @Test
- public void testFromString1() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField(vPLString);
- assertDoubleArraysAreEqual(gl.getAsVector(), new double[]{-9.3, 0, -3.9});
- Assert.assertEquals(gl.getAsString(), vPLString);
- }
-
- @Test
- public void testFromString2() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromGLField(vGLString);
- assertDoubleArraysAreEqual(gl.getAsVector(), v);
- Assert.assertEquals(gl.getAsString(), vPLString);
- }
-
- @Test (expectedExceptions = TribbleException.class)
- public void testErrorBadFormat() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField("adf,b,c");
- gl.getAsVector();
- }
-
- @Test
- public void testGetAsMap(){
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(v);
- //Log scale
- EnumMap<GenotypeType,Double> glMap = gl.getAsMap(false);
- Assert.assertEquals(v[GenotypeType.HOM_REF.ordinal()-1],glMap.get(GenotypeType.HOM_REF));
- Assert.assertEquals(v[GenotypeType.HET.ordinal()-1],glMap.get(GenotypeType.HET));
- Assert.assertEquals(v[GenotypeType.HOM_VAR.ordinal()-1],glMap.get(GenotypeType.HOM_VAR));
-
- //Linear scale
- glMap = gl.getAsMap(true);
- double [] vl = GeneralUtils.normalizeFromLog10(v);
- Assert.assertEquals(vl[GenotypeType.HOM_REF.ordinal()-1],glMap.get(GenotypeType.HOM_REF));
- Assert.assertEquals(vl[GenotypeType.HET.ordinal()-1],glMap.get(GenotypeType.HET));
- Assert.assertEquals(vl[GenotypeType.HOM_VAR.ordinal()-1],glMap.get(GenotypeType.HOM_VAR));
-
- //Test missing likelihoods
- gl = GenotypeLikelihoods.fromPLField(".");
- glMap = gl.getAsMap(false);
- Assert.assertNull(glMap);
-
- }
-
- @Test
- public void testCalculateNumLikelihoods() {
-
- for (int nAlleles=2; nAlleles<=5; nAlleles++)
- // simplest case: diploid
- Assert.assertEquals(GenotypeLikelihoods.numLikelihoods(nAlleles, 2), nAlleles*(nAlleles+1)/2);
-
- // some special cases: ploidy = 20, #alleles = 4
- Assert.assertEquals(GenotypeLikelihoods.numLikelihoods(4, 20), 1771);
- }
-
- @Test
- public void testGetLog10GQ(){
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromPLField(vPLString);
-
- //GQ for the best guess genotype
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HET),-3.9);
-
- double[] test = GeneralUtils.normalizeFromLog10(gl.getAsVector());
-
- //GQ for the other genotypes
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_REF), Math.log10(1.0 - test[GenotypeType.HOM_REF.ordinal()-1]));
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_VAR), Math.log10(1.0 - test[GenotypeType.HOM_VAR.ordinal()-1]));
-
- //Test missing likelihoods
- gl = GenotypeLikelihoods.fromPLField(".");
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_REF),Double.NEGATIVE_INFINITY);
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HET),Double.NEGATIVE_INFINITY);
- Assert.assertEquals(gl.getLog10GQ(GenotypeType.HOM_VAR),Double.NEGATIVE_INFINITY);
-
- }
-
- @Test
- public void testgetQualFromLikelihoods() {
- double[] likelihoods = new double[]{-1, 0, -2};
- // qual values we expect for each possible "best" genotype
- double[] expectedQuals = new double[]{-0.04100161, -1, -0.003930294};
-
- for ( int i = 0; i < likelihoods.length; i++ ) {
- Assert.assertEquals(GenotypeLikelihoods.getGQLog10FromLikelihoods(i, likelihoods), expectedQuals[i], 1e-6,
- "GQ value for genotype " + i + " was not calculated correctly");
- }
- }
-
- // this test is completely broken, the method is wrong.
- public void testGetQualFromLikelihoodsMultiAllelicBroken() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(triAllelic);
- double actualGQ = gl.getLog10GQ(GenotypeType.HET);
- double expectedGQ = 1.6;
- Assert.assertEquals(actualGQ,expectedGQ);
- }
-
- public void testGetQualFromLikelihoodsMultiAllelic() {
- GenotypeLikelihoods gl = GenotypeLikelihoods.fromLog10Likelihoods(triAllelic);
- Allele ref = Allele.create((byte)'A',true);
- Allele alt1 = Allele.create((byte)'C');
- Allele alt2 = Allele.create((byte)'T');
- List<Allele> allAlleles = Arrays.asList(ref,alt1,alt2);
- List<Allele> gtAlleles = Arrays.asList(alt1,alt2);
- GenotypeBuilder gtBuilder = new GenotypeBuilder();
- gtBuilder.alleles(gtAlleles);
- double actualGQ = gl.getLog10GQ(gtBuilder.make(),allAlleles);
- double expectedGQ = 1.6;
- Assert.assertEquals(actualGQ,expectedGQ);
- }
-
- private void assertDoubleArraysAreEqual(double[] v1, double[] v2) {
- Assert.assertEquals(v1.length, v2.length);
- for ( int i = 0; i < v1.length; i++ ) {
- Assert.assertEquals(v1[i], v2[i], 1e-6);
- }
- }
-
- @Test
- public void testCalculatePLindex(){
- int counter = 0;
- for ( int i = 0; i <= 3; i++ ) {
- for ( int j = i; j <= 3; j++ ) {
- Assert.assertEquals(GenotypeLikelihoods.calculatePLindex(i, j), GenotypeLikelihoods.PLindexConversion[counter++], "PL index of alleles " + i + "," + j + " was not calculated correctly");
- }
- }
- }
-
- @DataProvider
- public Object[][] testGetAllelePairData() {
- return new Object[][]{
- {0, 0, 0},
- {1, 0, 1},
- {2, 1, 1},
- {3, 0, 2},
- {4, 1, 2},
- {5, 2, 2},
- {6, 0, 3},
- {7, 1, 3},
- {8, 2, 3},
- {9, 3, 3}
- };
- }
-
- @Test(dataProvider = "testGetAllelePairData")
- public void testGetAllelePair(final int PLindex, final int allele1, final int allele2) {
- Assert.assertEquals(GenotypeLikelihoods.getAllelePair(PLindex).alleleIndex1, allele1, "allele index " + allele1 + " from PL index " + PLindex + " was not calculated correctly");
- Assert.assertEquals(GenotypeLikelihoods.getAllelePair(PLindex).alleleIndex2, allele2, "allele index " + allele2 + " from PL index " + PLindex + " was not calculated correctly");
- }
-
- @DataProvider
- public Object[][] testCalculateAnyploidPLcacheData() {
- return new Object[][]{
- {
- 1, 1,
- Arrays.asList(Arrays.asList(0),
- Arrays.asList(1)
- )
- },
- {
- 2, 2,
- Arrays.asList(Arrays.asList(0, 0),
- Arrays.asList(0, 1),
- Arrays.asList(1, 1),
- Arrays.asList(0, 2),
- Arrays.asList(1, 2),
- Arrays.asList(2, 2)
- )
- },
- {
- 2, 3,
- Arrays.asList(Arrays.asList(0, 0, 0),
- Arrays.asList(0, 0, 1),
- Arrays.asList(0, 1, 1),
- Arrays.asList(1, 1, 1),
- Arrays.asList(0, 0, 2),
- Arrays.asList(0, 1, 2),
- Arrays.asList(1, 1, 2),
- Arrays.asList(0, 2, 2),
- Arrays.asList(1, 2, 2),
- Arrays.asList(2, 2, 2)
- )
- },
- {
- 2, -1,
- Arrays.asList(Arrays.asList())
- },
- {
- -1, 2,
- Arrays.asList(Arrays.asList())
- }
- };
- }
-
- @Test(dataProvider = "testCalculateAnyploidPLcacheData")
- public void testCalculateAnyploidPLcache(final int altAlleles, final int ploidy, final List<List<Integer>> expected) {
- List<List<Integer>> anyploidPLIndexToAlleleIndices = GenotypeLikelihoods.calculateAnyploidPLcache(altAlleles, ploidy);
- for ( int i=0; i < anyploidPLIndexToAlleleIndices.size(); i++ )
- Assert.assertEquals(anyploidPLIndexToAlleleIndices.get(i), expected.get(i));
- }
-
- @Test(dataProvider = "testCalculateAnyploidPLcacheData")
- public void testInitializeAnyploidPLIndexToAlleleIndices(final int altAlleles, final int ploidy, final List<List<Integer>> expected) {
- if ( altAlleles >= 1 && ploidy >= 1 ) { // Bypass test with bad data
- Map<Integer, List<List<Integer>>> expectedMap = new HashMap<Integer, List<List<Integer>>>();
- expectedMap.put(ploidy, expected);
- for (Map.Entry<Integer, List<List<Integer>>> entry : GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.entrySet()) {
- if (expectedMap.containsKey(entry.getKey()))
- Assert.assertEquals(entry.getValue(), expectedMap.get(entry.getKey()));
- }
- }
- }
-
- @DataProvider
- public Object[][] testInitializeAnyploidPLIndexToAlleleIndiceseBadData() {
- return new Object[][]{
- { 2, -1 },
- { -1, 2 }
- };
- }
-
- @Test(dataProvider = "testInitializeAnyploidPLIndexToAlleleIndiceseBadData", expectedExceptions = IllegalArgumentException.class)
- public void testInitializeAnyploidPLIndexToAlleleIndicesBadData(final int altAlleles, final int ploidy) {
- GenotypeLikelihoods.initializeAnyploidPLIndexToAlleleIndices(altAlleles, ploidy);
- }
-
- @DataProvider
- public Object[][] testGetAllelesData() {
- return new Object[][]{
- {0, 2, 3, Arrays.asList(0,0,0)},
- {1, 2, 3, Arrays.asList(0,0,1)},
- {2, 2, 3, Arrays.asList(0,1,1)},
- {3, 2, 3, Arrays.asList(1,1,1)},
- {4, 2, 3, Arrays.asList(0,0,2)},
- {5, 2, 3, Arrays.asList(0,1,2)},
- {6, 2, 3, Arrays.asList(1,1,2)},
- {7, 2, 3, Arrays.asList(0,2,2)},
- {8, 2, 3, Arrays.asList(1,2,2)},
- {9, 2, 3, Arrays.asList(2,2,2)},
- {1, 2, 1, Arrays.asList(1)}
- };
- }
-
- @Test(dataProvider = "testGetAllelesData")
- public void testGetAlleles(final int PLindex, final int altAlleles, final int ploidy, final List<Integer> expected ) {
- Assert.assertEquals(GenotypeLikelihoods.getAlleles(PLindex, ploidy), expected);
- }
-
- @DataProvider
- public Object[][] testGetAllelesIndexOutOfBoundsData() {
- return new Object[][]{
- {-1, 3}, // PL index too small, non-diploid
- {10, 3}, // PL index too large, non-diploid
- {-1, 2}, // PL index too small, diploid
- {GenotypeLikelihoods.numLikelihoods(GenotypeLikelihoods.MAX_DIPLOID_ALT_ALLELES_THAT_CAN_BE_GENOTYPED+1,2), 2} // PL index too large, diploid
- };
- }
-
- @Test(dataProvider = "testGetAllelesIndexOutOfBoundsData", expectedExceptions = IllegalStateException.class)
- public void testGetAllelesOutOfBounds(final int PLindex, final int ploidy) {
- final List<Integer> alleles = GenotypeLikelihoods.getAlleles(PLindex, ploidy);
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testGetAllelesUnitialized() {
- GenotypeLikelihoods.anyploidPloidyToPLIndexToAlleleIndices.clear();
- final List<Integer> alleles = GenotypeLikelihoods.getAlleles(0, 3);
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java
deleted file mode 100644
index a447a0b..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypeUnitTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-
-public class GenotypeUnitTest extends VariantBaseTest {
- Allele A, Aref, T;
-
- @BeforeSuite
- public void before() {
- A = Allele.create("A");
- Aref = Allele.create("A", true);
- T = Allele.create("T");
- }
-
- private static final GenotypeBuilder makeGB() {
- return new GenotypeBuilder("misc");
- }
-
- @Test
- public void testFilters() {
- Assert.assertFalse(makeGB().make().isFiltered(), "by default Genotypes must be PASS");
- Assert.assertNull(makeGB().make().getFilters(), "by default Genotypes must be PASS => getFilters() == null");
- Assert.assertFalse(makeGB().filter(null).make().isFiltered(), "setting filter == null => Genotypes must be PASS");
- Assert.assertNull(makeGB().filter(null).make().getFilters(), "Genotypes PASS => getFilters == null");
- Assert.assertFalse(makeGB().filter("PASS").make().isFiltered(), "setting filter == PASS => Genotypes must be PASS");
- Assert.assertNull(makeGB().filter("PASS").make().getFilters(), "Genotypes PASS => getFilters == null");
- Assert.assertTrue(makeGB().filter("x").make().isFiltered(), "setting filter != null => Genotypes must be PASS");
- Assert.assertEquals(makeGB().filter("x").make().getFilters(), "x", "Should get back the expected filter string");
- Assert.assertEquals(makeGB().filters("x", "y").make().getFilters(), "x;y", "Multiple filter field values should be joined with ;");
- Assert.assertEquals(makeGB().filters("x", "y", "z").make().getFilters(), "x;y;z", "Multiple filter field values should be joined with ;");
- Assert.assertTrue(makeGB().filters("x", "y", "z").make().isFiltered(), "Multiple filter values should be filtered");
- Assert.assertEquals(makeGB().filter("x;y;z").make().getFilters(), "x;y;z", "Multiple filter field values should be joined with ;");
- Assert.assertEquals(makeGB().filter("x;y;z").make().getAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "x;y;z", "getAnyAttribute(GENOTYPE_FILTER_KEY) should return the filter");
- Assert.assertTrue(makeGB().filter("x;y;z").make().hasAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "hasAnyAttribute(GENOTYPE_FILTER_KEY) should return true");
- Assert.assertTrue(makeGB().make().hasAnyAttribute(VCFConstants.GENOTYPE_FILTER_KEY), "hasAnyAttribute(GENOTYPE_FILTER_KEY) should return true");
- Assert.assertFalse(makeGB().filter("").make().isFiltered(), "empty filters should count as unfiltered");
- Assert.assertEquals(makeGB().filter("").make().getFilters(), null, "empty filter string should result in null filters");
- }
-
-// public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, Set<String> filters, Map<String, ?> attributes, boolean isPhased) {
-// public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, Set<String> filters, Map<String, ?> attributes, boolean isPhased, double[] log10Likelihoods) {
-// public Genotype(String sampleName, List<Allele> alleles, double negLog10PError, double[] log10Likelihoods)
-// public Genotype(String sampleName, List<Allele> alleles, double negLog10PError)
-// public Genotype(String sampleName, List<Allele> alleles)
-// public List<Allele> getAlleles()
-// public List<Allele> getAlleles(Allele allele)
-// public Allele getAllele(int i)
-// public boolean isPhased()
-// public int getPloidy()
-// public Type getType()
-// public boolean isHom()
-// public boolean isHomRef()
-// public boolean isHomVar()
-// public boolean isHet()
-// public boolean isNoCall()
-// public boolean isCalled()
-// public boolean isAvailable()
-// public boolean hasLikelihoods()
-// public GenotypeLikelihoods getLikelihoods()
-// public boolean sameGenotype(Genotype other)
-// public boolean sameGenotype(Genotype other, boolean ignorePhase)
-// public String getSampleName()
-// public boolean hasLog10PError()
-// public double getLog10PError()
-// public double getPhredScaledQual()
-// public boolean hasExtendedAttribute(String key)
-// public Object getExtendedAttribute(String key)
-// public Object getExtendedAttribute(String key, Object defaultValue)
-// public String getAttributeAsString(String key, String defaultValue)
-// public int getAttributeAsInt(String key, int defaultValue)
-// public double getAttributeAsDouble(String key, double defaultValue)
-// public boolean getAttributeAsBoolean(String key, boolean defaultValue)
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java
deleted file mode 100644
index 0f30753..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/GenotypesContextUnitTest.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.utils.GeneralUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-
-public class GenotypesContextUnitTest extends VariantBaseTest {
- Allele Aref, C, T;
- Genotype AA, AT, TT, AC, CT, CC, MISSING;
- List<Genotype> allGenotypes;
-
- @BeforeSuite
- public void before() {
- C = Allele.create("C");
- Aref = Allele.create("A", true);
- T = Allele.create("T");
- AA = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- AT = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- TT = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- AC = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
- CT = GenotypeBuilder.create("CT", Arrays.asList(C, T));
- CC = GenotypeBuilder.create("CC", Arrays.asList(C, C));
- MISSING = GenotypeBuilder.create("MISSING", Arrays.asList(C, C));
-
- allGenotypes = Arrays.asList(AA, AT, TT, AC, CT, CC);
- }
-
- // --------------------------------------------------------------------------------
- //
- // Provider
- //
- // --------------------------------------------------------------------------------
-
- private interface ContextMaker {
- public GenotypesContext make(List<Genotype> initialSamples);
- }
-
- private ContextMaker baseMaker = new ContextMaker() {
- @Override
- public GenotypesContext make(final List<Genotype> initialSamples) {
- return GenotypesContext.copy(initialSamples);
- }
-
- @Override
- public String toString() {
- return "GenotypesContext";
- }
- };
-
- private final class lazyMaker implements LazyGenotypesContext.LazyParser, ContextMaker {
- @Override
- public LazyGenotypesContext.LazyData parse(final Object data) {
- GenotypesContext gc = GenotypesContext.copy((List<Genotype>)data);
- gc.ensureSampleNameMap();
- gc.ensureSampleOrdering();
- return new LazyGenotypesContext.LazyData(gc.notToBeDirectlyAccessedGenotypes, gc.sampleNamesInOrder, gc.sampleNameToOffset);
- }
-
- @Override
- public GenotypesContext make(final List<Genotype> initialSamples) {
- return new LazyGenotypesContext(this, initialSamples, initialSamples.size());
- }
-
- @Override
- public String toString() {
- return "LazyGenotypesContext";
- }
- }
-
- private Collection<ContextMaker> allMakers = Arrays.asList(baseMaker, new lazyMaker());
-
- private class GenotypesContextProvider {
- String name;
- ContextMaker maker;
- final List<Genotype> initialSamples;
-
- private GenotypesContextProvider(ContextMaker maker, List<Genotype> initialSamples) {
- this.name = String.format("%s with %d samples", maker.toString(), initialSamples.size());
- this.maker = maker;
- this.initialSamples = initialSamples;
- }
-
- public GenotypesContext makeContext() {
- return maker.make(initialSamples);
- }
- }
-
- @DataProvider(name = "GenotypesContextProvider")
- public Object[][] MakeSampleNamesTest() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- for ( ContextMaker maker : allMakers ) {
- for ( int i = 0; i < allGenotypes.size(); i++ ) {
- List<Genotype> samples = allGenotypes.subList(0, i);
- // sorted
- tests.add(new Object[]{new GenotypesContextProvider(maker, samples)});
- // unsorted
- tests.add(new Object[]{new GenotypesContextProvider(maker, GeneralUtils.reverse(samples))});
- }
- }
-
- return tests.toArray(new Object[][]{});
- }
-
- private final static void testIterable(Iterable<Genotype> genotypeIterable, Set<String> expectedNames) {
- int count = 0;
- for ( final Genotype g : genotypeIterable ) {
- Assert.assertTrue(expectedNames.contains(g.getSampleName()));
- count++;
- }
- Assert.assertEquals(count, expectedNames.size(), "Iterable returned unexpected number of genotypes");
- }
-
- @Test(dataProvider = "GenotypesContextProvider")
- public void testInitialSamplesAreAsExpected(GenotypesContextProvider cfg) {
- testGenotypesContextContainsExpectedSamples(cfg.makeContext(), cfg.initialSamples);
- }
-
- private final void testGenotypesContextContainsExpectedSamples(GenotypesContext gc, List<Genotype> expectedSamples) {
- Assert.assertEquals(gc.isEmpty(), expectedSamples.isEmpty());
- Assert.assertEquals(gc.size(), expectedSamples.size());
-
- // get(index) is doing the right thing
- for ( int i = 0; i < expectedSamples.size(); i++ ) {
- Assert.assertEquals(gc.get(i), expectedSamples.get(i));
- }
- Assert.assertFalse(gc.containsSample(MISSING.getSampleName()));
-
- // we can fetch samples by name
- final Set<String> genotypeNames = VariantContextUtils.genotypeNames(expectedSamples);
- for ( final String name : genotypeNames ) {
- Assert.assertTrue(gc.containsSample(name));
- }
- Assert.assertFalse(gc.containsSample(MISSING.getSampleName()));
-
- // all of the iterators are working
- testIterable(gc.iterateInSampleNameOrder(), genotypeNames);
- testIterable(gc, genotypeNames);
- testIterable(gc.iterateInSampleNameOrder(genotypeNames), genotypeNames);
- if ( ! genotypeNames.isEmpty() ) {
- Set<String> first = Collections.singleton(genotypeNames.iterator().next());
- testIterable(gc.iterateInSampleNameOrder(first), first);
- }
-
- // misc. utils are working as expected
- assertEqualsSet(gc.getSampleNames(), genotypeNames, "gc sample names vs. expected sample names");
- Assert.assertTrue(ParsingUtils.isSorted(gc.getSampleNamesOrderedByName()));
- Assert.assertTrue(ParsingUtils.isSorted(gc.iterateInSampleNameOrder()));
- Assert.assertTrue(gc.containsSamples(genotypeNames));
-
- final Set<String> withMissing = new HashSet<String>(Arrays.asList(MISSING.getSampleName()));
- withMissing.addAll(genotypeNames);
- Assert.assertFalse(gc.containsSamples(withMissing));
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testImmutable(GenotypesContextProvider cfg) {
- GenotypesContext gc = cfg.makeContext();
- Assert.assertEquals(gc.isMutable(), true);
- gc.immutable();
- Assert.assertEquals(gc.isMutable(), false);
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider", expectedExceptions = Throwable.class )
- public void testImmutableCall1(GenotypesContextProvider cfg) {
- GenotypesContext gc = cfg.makeContext();
- gc.immutable();
- gc.add(MISSING);
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testClear(GenotypesContextProvider cfg) {
- GenotypesContext gc = cfg.makeContext();
- gc.clear();
- testGenotypesContextContainsExpectedSamples(gc, Collections.<Genotype>emptyList());
- }
-
- private static final List<Genotype> with(List<Genotype> genotypes, Genotype ... add) {
- List<Genotype> l = new ArrayList<Genotype>(genotypes);
- l.addAll(Arrays.asList(add));
- return l;
- }
-
- private static final List<Genotype> without(List<Genotype> genotypes, Genotype ... remove) {
- List<Genotype> l = new ArrayList<Genotype>(genotypes);
- l.removeAll(Arrays.asList(remove));
- return l;
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testAdds(GenotypesContextProvider cfg) {
- Genotype add1 = GenotypeBuilder.create("add1", Arrays.asList(Aref, Aref));
- Genotype add2 = GenotypeBuilder.create("add2", Arrays.asList(Aref, Aref));
-
- GenotypesContext gc = cfg.makeContext();
- gc.add(add1);
- testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1));
-
- gc = cfg.makeContext();
- gc.add(add1);
- gc.add(add2);
- testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1, add2));
-
- gc = cfg.makeContext();
- gc.addAll(Arrays.asList(add1, add2));
- testGenotypesContextContainsExpectedSamples(gc, with(cfg.initialSamples, add1, add2));
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testRemoves(GenotypesContextProvider cfg) {
- Genotype rm1 = AA;
- Genotype rm2 = AC;
-
- GenotypesContext gc = cfg.makeContext();
- if (gc.size() > 1) {
- Genotype rm = gc.get(0);
- gc.remove(rm);
- testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm));
- }
-
- gc = cfg.makeContext();
- gc.remove(rm1);
- testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1));
-
- gc = cfg.makeContext();
- gc.remove(rm1);
- gc.remove(rm2);
- testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1, rm2));
-
- gc = cfg.makeContext();
- gc.removeAll(Arrays.asList(rm1, rm2));
- testGenotypesContextContainsExpectedSamples(gc, without(cfg.initialSamples, rm1, rm2));
-
- gc = cfg.makeContext();
- HashSet<Genotype> expected = new HashSet<Genotype>();
- if ( gc.contains(rm1) ) expected.add(rm1);
- if ( gc.contains(rm2) ) expected.add(rm2);
- gc.retainAll(Arrays.asList(rm1, rm2));
-
- // ensure that the two lists are the same
- assertEqualsSet(new HashSet<Genotype>(gc.getGenotypes()), expected, "gc genotypes vs. expected");
- // because the list order can change, we use the gc's list itself
- testGenotypesContextContainsExpectedSamples(gc, gc.getGenotypes());
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testSet(GenotypesContextProvider cfg) {
- Genotype set = GenotypeBuilder.create("replace", Arrays.asList(Aref, Aref));
- int n = cfg.makeContext().size();
- for ( int i = 0; i < n; i++ ) {
- GenotypesContext gc = cfg.makeContext();
- Genotype setted = gc.set(i, set);
- Assert.assertNotNull(setted);
- ArrayList<Genotype> l = new ArrayList<Genotype>(cfg.initialSamples);
- l.set(i, set);
- testGenotypesContextContainsExpectedSamples(gc, l);
- }
- }
-
- @Test(enabled = true, dataProvider = "GenotypesContextProvider")
- public void testReplace(GenotypesContextProvider cfg) {
- int n = cfg.makeContext().size();
- for ( int i = 0; i < n; i++ ) {
- GenotypesContext gc = cfg.makeContext();
- Genotype toReplace = gc.get(i);
- Genotype replacement = GenotypeBuilder.create(toReplace.getSampleName(), Arrays.asList(Aref, Aref));
- gc.replace(replacement);
- ArrayList<Genotype> l = new ArrayList<Genotype>(cfg.initialSamples);
- l.set(i, replacement);
- Assert.assertEquals(replacement, gc.get(i));
- testGenotypesContextContainsExpectedSamples(gc, l);
- }
- }
-
- // subset to samples tested in VariantContextUnitTest
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java
deleted file mode 100644
index f400028..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextBuilderTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package htsjdk.variant.variantcontext;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-public class VariantContextBuilderTest extends VariantBaseTest {
- Allele Aref, C;
-
- String snpLoc = "chr1";
- String snpSource = "test";
- long snpLocStart = 10;
- long snpLocStop = 10;
-
- @BeforeTest
- public void before() {
-
- C = Allele.create("C");
- Aref = Allele.create("A", true);
- }
-
- @DataProvider(name = "trueFalse")
- public Object[][] testAttributesWorksTest() {
- return new Object[][]{{true}, {false}};
- }
-
- @Test(dataProvider = "trueFalse")
- public void testAttributeResettingWorks(final boolean leaveModifyableAsIs) {
- final VariantContextBuilder root1 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
- final VariantContextBuilder root2 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-
- final VariantContext result1 = root1.attribute("AC", 1).make(leaveModifyableAsIs);
-
- //this is a red-herring and should not change anything, however, if leaveModifyableAsIs is true, it does change result1.
- final VariantContext ignored = root1.attribute("AC", 2).make(leaveModifyableAsIs);
-
- final VariantContext result2 = root2.attribute("AC", 1).make(leaveModifyableAsIs);
-
- if (leaveModifyableAsIs) {
- Assert.assertNotSame(result1.getAttribute("AC"), result2.getAttribute("AC"));
- } else {
- Assert.assertEquals(result1.getAttribute("AC"), result2.getAttribute("AC"));
- }
- }
-
- @Test()
- public void testAttributeResettingWorks() {
- final VariantContextBuilder root1 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
- final VariantContextBuilder root2 = new VariantContextBuilder(snpSource, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C));
-
- final VariantContext result1 = root1.attribute("AC", 1).make();
-
- //this is a red-herring and should not change anything.
- final VariantContext ignored = root1.attribute("AC", 2).make();
-
- final VariantContext result2 = root2.attribute("AC", 1).make();
-
- Assert.assertEquals(result1.getAttribute("AC"), result2.getAttribute("AC"));
-
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java
deleted file mode 100644
index 613dec5..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextTestProvider.java
+++ /dev/null
@@ -1,1014 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.tribble.FeatureCodecHeader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.utils.GeneralUtils;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFContigHeaderLine;
-import htsjdk.variant.vcf.VCFFilterHeaderLine;
-import htsjdk.variant.vcf.VCFFormatHeaderLine;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderLineCount;
-import htsjdk.variant.vcf.VCFHeaderLineType;
-import htsjdk.variant.vcf.VCFInfoHeaderLine;
-
-import org.testng.Assert;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Routines for generating all sorts of VCs for testing
- *
- * @author Your Name
- * @since Date created
- */
-public class VariantContextTestProvider {
- final private static boolean ENABLE_GENOTYPE_TESTS = true;
- final private static boolean ENABLE_A_AND_G_TESTS = true;
- final private static boolean ENABLE_VARARRAY_TESTS = true;
- final private static boolean ENABLE_PLOIDY_TESTS = true;
- final private static boolean ENABLE_PL_TESTS = true;
- final private static boolean ENABLE_SYMBOLIC_ALLELE_TESTS = true;
- final private static boolean ENABLE_SOURCE_VCF_TESTS = true;
- final private static boolean ENABLE_VARIABLE_LENGTH_GENOTYPE_STRING_TESTS = true;
- final private static List<Integer> TWENTY_INTS = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
-
- private static VCFHeader syntheticHeader;
- final static List<VariantContextTestData> TEST_DATAs = new ArrayList<VariantContextTestData>();
- private static VariantContext ROOT;
-
- private final static List<File> testSourceVCFs = new ArrayList<File>();
- static {
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf"));
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "ex2.vcf"));
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "dbsnp_135.b37.1000.vcf"));
- if ( ENABLE_SYMBOLIC_ALLELE_TESTS ) {
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "diagnosis_targets_testfile.vcf"));
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "VQSR.mixedTest.recal"));
- testSourceVCFs.add(new File(VariantBaseTest.variantTestDataRoot + "breakpoint.vcf"));
- }
- }
-
- public static class VariantContextContainer {
- private VCFHeader header;
- private Iterable<VariantContext> vcs;
-
- public VariantContextContainer( VCFHeader header, Iterable<VariantContext> vcs ) {
- this.header = header;
- this.vcs = vcs;
- }
-
- public VCFHeader getHeader() {
- return header;
- }
-
- public Iterable<VariantContext> getVCs() {
- return vcs;
- }
- }
-
- public abstract static class VariantContextIOTest<CODECTYPE> {
- public String toString() {
- return "VariantContextIOTest:" + getExtension();
- }
- public abstract String getExtension();
- public abstract CODECTYPE makeCodec();
- public abstract VariantContextWriter makeWriter(final File outputFile, final EnumSet<Options> baseOptions);
-
- public abstract VariantContextContainer readAllVCs(final File input) throws IOException;
-
- public List<VariantContext> preprocess(final VCFHeader header, List<VariantContext> vcsBeforeIO) {
- return vcsBeforeIO;
- }
-
- public List<VariantContext> postprocess(final VCFHeader header, List<VariantContext> vcsAfterIO) {
- return vcsAfterIO;
- }
- }
-
- public static class VariantContextTestData {
- public final VCFHeader header;
- public List<VariantContext> vcs;
-
- public VariantContextTestData(final VCFHeader header, final VariantContextBuilder builder) {
- this(header, Collections.singletonList(builder.fullyDecoded(true).make()));
- }
-
- public VariantContextTestData(final VCFHeader header, final List<VariantContext> vcs) {
- final Set<String> samples = new HashSet<String>();
- for ( final VariantContext vc : vcs )
- if ( vc.hasGenotypes() )
- samples.addAll(vc.getSampleNames());
- this.header = samples.isEmpty() ? header : new VCFHeader(header.getMetaDataInSortedOrder(), samples);
- this.vcs = vcs;
- }
-
- public boolean hasGenotypes() {
- return vcs.get(0).hasGenotypes();
- }
-
- public String toString() {
- StringBuilder b = new StringBuilder();
- b.append("VariantContextTestData: [");
- final VariantContext vc = vcs.get(0);
- final VariantContextBuilder builder = new VariantContextBuilder(vc);
- builder.noGenotypes();
- b.append(builder.make().toString());
- if ( vc.getNSamples() < 5 ) {
- for ( final Genotype g : vc.getGenotypes() )
- b.append(g.toString());
- } else {
- b.append(" nGenotypes = ").append(vc.getNSamples());
- }
-
- if ( vcs.size() > 1 ) b.append(" ----- with another ").append(vcs.size() - 1).append(" VariantContext records");
- b.append("]");
- return b.toString();
- }
- }
-
- private final static VariantContextBuilder builder() {
- return new VariantContextBuilder(ROOT);
- }
-
- private final static void add(VariantContextBuilder builder) {
- TEST_DATAs.add(new VariantContextTestData(syntheticHeader, builder));
- }
-
- public static void initializeTests() throws IOException {
- createSyntheticHeader();
- makeSyntheticTests();
- makeEmpiricalTests();
- }
-
- private static void makeEmpiricalTests() throws IOException {
- if ( ENABLE_SOURCE_VCF_TESTS ) {
- for ( final File file : testSourceVCFs ) {
- VCFCodec codec = new VCFCodec();
- VariantContextContainer x = readAllVCs( file, codec );
- List<VariantContext> fullyDecoded = new ArrayList<VariantContext>();
-
- for ( final VariantContext raw : x.getVCs() ) {
- if ( raw != null )
- fullyDecoded.add(raw.fullyDecode(x.getHeader(), false));
- }
-
- TEST_DATAs.add(new VariantContextTestData(x.getHeader(), fullyDecoded));
- }
- }
- }
-
- private final static void addHeaderLine(final Set<VCFHeaderLine> metaData, final String id, final int count, final VCFHeaderLineType type) {
- metaData.add(new VCFInfoHeaderLine(id, count, type, "x"));
- if ( type != VCFHeaderLineType.Flag )
- metaData.add(new VCFFormatHeaderLine(id, count, type, "x"));
- }
-
- private final static void addHeaderLine(final Set<VCFHeaderLine> metaData, final String id, final VCFHeaderLineCount count, final VCFHeaderLineType type) {
- metaData.add(new VCFInfoHeaderLine(id, count, type, "x"));
- if ( type != VCFHeaderLineType.Flag )
- metaData.add(new VCFFormatHeaderLine(id, count, type, "x"));
- }
-
- private static void createSyntheticHeader() {
- Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>();
-
- addHeaderLine(metaData, "STRING1", 1, VCFHeaderLineType.String);
- addHeaderLine(metaData, "END", 1, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "STRING3", 3, VCFHeaderLineType.String);
- addHeaderLine(metaData, "STRING20", 20, VCFHeaderLineType.String);
- addHeaderLine(metaData, "VAR.INFO.STRING", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String);
-
- addHeaderLine(metaData, "GT", 1, VCFHeaderLineType.String);
- addHeaderLine(metaData, "GQ", 1, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "ADA", VCFHeaderLineCount.A, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "PL", VCFHeaderLineCount.G, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "GS", 2, VCFHeaderLineType.String);
- addHeaderLine(metaData, "GV", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String);
- addHeaderLine(metaData, "FT", 1, VCFHeaderLineType.String);
-
- // prep the header
- metaData.add(new VCFContigHeaderLine(Collections.singletonMap("ID", "1"), 0));
-
- metaData.add(new VCFFilterHeaderLine("FILTER1"));
- metaData.add(new VCFFilterHeaderLine("FILTER2"));
-
- addHeaderLine(metaData, "INT1", 1, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "INT3", 3, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "INT20", 20, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "INT.VAR", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer);
- addHeaderLine(metaData, "FLOAT1", 1, VCFHeaderLineType.Float);
- addHeaderLine(metaData, "FLOAT3", 3, VCFHeaderLineType.Float);
- addHeaderLine(metaData, "FLAG", 0, VCFHeaderLineType.Flag);
-
- syntheticHeader = new VCFHeader(metaData);
- }
-
-
- private static void makeSyntheticTests() {
- VariantContextBuilder rootBuilder = new VariantContextBuilder();
- rootBuilder.source("test");
- rootBuilder.loc("1", 10, 10);
- rootBuilder.alleles("A", "C");
- rootBuilder.unfiltered();
- ROOT = rootBuilder.make();
-
- add(builder());
- add(builder().alleles("A"));
- add(builder().alleles("A", "C", "T"));
- add(builder().alleles("A", "AC"));
- add(builder().alleles("A", "ACAGT"));
- add(builder().loc("1", 10, 11).alleles("AC", "A"));
- add(builder().loc("1", 10, 13).alleles("ACGT", "A"));
-
- // make sure filters work
- add(builder().unfiltered());
- add(builder().passFilters());
- add(builder().filters("FILTER1"));
- add(builder().filters("FILTER1", "FILTER2"));
-
- add(builder().log10PError(VariantContext.NO_LOG10_PERROR));
- add(builder().log10PError(-1));
- add(builder().log10PError(-1.234e6));
-
- add(builder().noID());
- add(builder().id("rsID12345"));
-
-
- add(builder().attribute("INT1", 1));
- add(builder().attribute("INT1", 100));
- add(builder().attribute("INT1", 1000));
- add(builder().attribute("INT1", 100000));
- add(builder().attribute("INT1", null));
- add(builder().attribute("INT3", Arrays.asList(1, 2, 3)));
- add(builder().attribute("INT3", Arrays.asList(1000, 2000, 3000)));
- add(builder().attribute("INT3", Arrays.asList(100000, 200000, 300000)));
- add(builder().attribute("INT3", null));
- add(builder().attribute("INT20", TWENTY_INTS));
-
- add(builder().attribute("FLOAT1", 1.0));
- add(builder().attribute("FLOAT1", 100.0));
- add(builder().attribute("FLOAT1", 1000.0));
- add(builder().attribute("FLOAT1", 100000.0));
- add(builder().attribute("FLOAT1", null));
- add(builder().attribute("FLOAT3", Arrays.asList(1.0, 2.0, 3.0)));
- add(builder().attribute("FLOAT3", Arrays.asList(1000.0, 2000.0, 3000.0)));
- add(builder().attribute("FLOAT3", Arrays.asList(100000.0, 200000.0, 300000.0)));
- add(builder().attribute("FLOAT3", null));
-
- add(builder().attribute("FLAG", true));
- //add(builder().attribute("FLAG", false)); // NOTE -- VCF doesn't allow false flags
-
- add(builder().attribute("STRING1", "s1"));
- add(builder().attribute("STRING1", null));
- add(builder().attribute("STRING3", Arrays.asList("s1", "s2", "s3")));
- add(builder().attribute("STRING3", null));
- add(builder().attribute("STRING20", Arrays.asList("s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20")));
-
- add(builder().attribute("VAR.INFO.STRING", "s1"));
- add(builder().attribute("VAR.INFO.STRING", Arrays.asList("s1", "s2")));
- add(builder().attribute("VAR.INFO.STRING", Arrays.asList("s1", "s2", "s3")));
- add(builder().attribute("VAR.INFO.STRING", null));
-
- if ( ENABLE_GENOTYPE_TESTS ) {
- addGenotypesToTestData();
- addComplexGenotypesTest();
- }
-
- if ( ENABLE_A_AND_G_TESTS )
- addGenotypesAndGTests();
-
- if ( ENABLE_SYMBOLIC_ALLELE_TESTS )
- addSymbolicAlleleTests();
- }
-
- private static void addSymbolicAlleleTests() {
- // two tests to ensure that the end is computed correctly when there's (and not) an END field present
- add(builder().alleles("N", "<VQSR>").start(10).stop(11).attribute("END", 11));
- add(builder().alleles("N", "<VQSR>").start(10).stop(10));
- }
-
- private static void addGenotypesToTestData() {
- final ArrayList<VariantContext> sites = new ArrayList<VariantContext>();
-
- sites.add(builder().alleles("A").make());
- sites.add(builder().alleles("A", "C", "T").make());
- sites.add(builder().alleles("A", "AC").make());
- sites.add(builder().alleles("A", "ACAGT").make());
-
- for ( VariantContext site : sites ) {
- addGenotypes(site);
- }
- }
-
- private static void addGenotypeTests( final VariantContext site, Genotype ... genotypes ) {
- // for each sites VC, we are going to add create two root genotypes.
- // The first is the primary, and will be added to each new test
- // The second is variable. In some tests it's absent (testing 1 genotype), in others it is duplicated
- // 1 once, 10, 100, or 1000 times to test scaling
-
- final VariantContextBuilder builder = new VariantContextBuilder(site);
-
- // add a single context
- builder.genotypes(genotypes[0]);
- add(builder);
-
- if ( genotypes.length > 1 ) {
- // add all
- add(builder.genotypes(Arrays.asList(genotypes)));
-
- // add all with the last replicated 10x and 100x times
- for ( int nCopiesOfLast : Arrays.asList(10, 100, 1000) ) {
- final GenotypesContext gc = new GenotypesContext();
- final Genotype last = genotypes[genotypes.length-1];
- for ( int i = 0; i < genotypes.length - 1; i++ )
- gc.add(genotypes[i]);
- for ( int i = 0; i < nCopiesOfLast; i++ )
- gc.add(new GenotypeBuilder(last).name("copy" + i).make());
- add(builder.genotypes(gc));
- }
- }
- }
-
- private static void addGenotypes( final VariantContext site) {
- // test ref/ref
- final Allele ref = site.getReference();
- final Allele alt1 = site.getNAlleles() > 1 ? site.getAlternateAllele(0) : null;
- final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(ref, ref));
- addGenotypeTests(site, homRef);
-
- if ( alt1 != null ) {
- final Genotype het = GenotypeBuilder.create("het", Arrays.asList(ref, alt1));
- final Genotype homVar = GenotypeBuilder.create("homVar", Arrays.asList(alt1, alt1));
- addGenotypeTests(site, homRef, het);
- addGenotypeTests(site, homRef, het, homVar);
-
- // test no GT at all
- addGenotypeTests(site, new GenotypeBuilder("noGT", new ArrayList<Allele>(0)).attribute("INT1", 10).make());
-
- final List<Allele> noCall = Arrays.asList(Allele.NO_CALL, Allele.NO_CALL);
-
- // ploidy
- if ( ENABLE_PLOIDY_TESTS ) {
- addGenotypeTests(site,
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("noCall", noCall),
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("noCall", noCall),
- GenotypeBuilder.create("noCall2", noCall),
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("hap", Arrays.asList(ref)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("noCall", noCall),
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("noCall", noCall),
- GenotypeBuilder.create("noCall2", noCall),
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("nocall", noCall),
- GenotypeBuilder.create("dip", Arrays.asList(ref, alt1)),
- GenotypeBuilder.create("tet", Arrays.asList(ref, alt1, alt1)));
- }
-
-
- //
- //
- // TESTING PHASE
- //
- //
- final Genotype gUnphased = new GenotypeBuilder("gUnphased", Arrays.asList(ref, alt1)).make();
- final Genotype gPhased = new GenotypeBuilder("gPhased", Arrays.asList(ref, alt1)).phased(true).make();
- final Genotype gPhased2 = new GenotypeBuilder("gPhased2", Arrays.asList(alt1, alt1)).phased(true).make();
- final Genotype gPhased3 = new GenotypeBuilder("gPhased3", Arrays.asList(ref, ref)).phased(true).make();
- final Genotype haploidNoPhase = new GenotypeBuilder("haploidNoPhase", Arrays.asList(ref)).make();
- addGenotypeTests(site, gUnphased, gPhased);
- addGenotypeTests(site, gUnphased, gPhased2);
- addGenotypeTests(site, gUnphased, gPhased3);
- addGenotypeTests(site, gPhased, gPhased2);
- addGenotypeTests(site, gPhased, gPhased3);
- addGenotypeTests(site, gPhased2, gPhased3);
- addGenotypeTests(site, haploidNoPhase, gPhased);
- addGenotypeTests(site, haploidNoPhase, gPhased2);
- addGenotypeTests(site, haploidNoPhase, gPhased3);
- addGenotypeTests(site, haploidNoPhase, gPhased, gPhased2);
- addGenotypeTests(site, haploidNoPhase, gPhased, gPhased3);
- addGenotypeTests(site, haploidNoPhase, gPhased2, gPhased3);
- addGenotypeTests(site, haploidNoPhase, gPhased, gPhased2, gPhased3);
-
- final Genotype gUnphasedTet = new GenotypeBuilder("gUnphasedTet", Arrays.asList(ref, alt1, ref, alt1)).make();
- final Genotype gPhasedTet = new GenotypeBuilder("gPhasedTet", Arrays.asList(ref, alt1, alt1, alt1)).phased(true).make();
- addGenotypeTests(site, gUnphasedTet, gPhasedTet);
- }
-
- if ( ENABLE_PL_TESTS ) {
- if ( site.getNAlleles() == 2 ) {
- // testing PLs
- addGenotypeTests(site,
- GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{0, -1, -2}),
- GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3}));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
- GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3}));
-
- addGenotypeTests(site,
- GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
- GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2000, -1000}));
-
- addGenotypeTests(site, // missing PLs
- GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{-1, 0, -2}),
- GenotypeBuilder.create("g2", Arrays.asList(ref, ref)));
- }
- else if ( site.getNAlleles() == 3 ) {
- // testing PLs
- addGenotypeTests(site,
- GenotypeBuilder.create("g1", Arrays.asList(ref, ref), new double[]{0, -1, -2, -3, -4, -5}),
- GenotypeBuilder.create("g2", Arrays.asList(ref, ref), new double[]{0, -2, -3, -4, -5, -6}));
- }
- }
-
- // test attributes
- addGenotypeTests(site,
- attr("g1", ref, "INT1", 1),
- attr("g2", ref, "INT1", 2));
- addGenotypeTests(site,
- attr("g1", ref, "INT1", 1),
- attr("g2", ref, "INT1"));
- addGenotypeTests(site,
- attr("g1", ref, "INT3", 1, 2, 3),
- attr("g2", ref, "INT3", 4, 5, 6));
- addGenotypeTests(site,
- attr("g1", ref, "INT3", 1, 2, 3),
- attr("g2", ref, "INT3"));
-
- addGenotypeTests(site,
- attr("g1", ref, "INT20", TWENTY_INTS),
- attr("g2", ref, "INT20", TWENTY_INTS));
-
-
- if (ENABLE_VARARRAY_TESTS) {
- addGenotypeTests(site,
- attr("g1", ref, "INT.VAR", 1, 2, 3),
- attr("g2", ref, "INT.VAR", 4, 5),
- attr("g3", ref, "INT.VAR", 6));
- addGenotypeTests(site,
- attr("g1", ref, "INT.VAR", 1, 2, 3),
- attr("g2", ref, "INT.VAR"),
- attr("g3", ref, "INT.VAR", 5));
- }
-
- addGenotypeTests(site,
- attr("g1", ref, "FLOAT1", 1.0),
- attr("g2", ref, "FLOAT1", 2.0));
- addGenotypeTests(site,
- attr("g1", ref, "FLOAT1", 1.0),
- attr("g2", ref, "FLOAT1"));
- addGenotypeTests(site,
- attr("g1", ref, "FLOAT3", 1.0, 2.0, 3.0),
- attr("g2", ref, "FLOAT3", 4.0, 5.0, 6.0));
- addGenotypeTests(site,
- attr("g1", ref, "FLOAT3", 1.0, 2.0, 3.0),
- attr("g2", ref, "FLOAT3"));
-
- if (ENABLE_VARIABLE_LENGTH_GENOTYPE_STRING_TESTS) {
- //
- //
- // TESTING MULTIPLE SIZED LISTS IN THE GENOTYPE FIELD
- //
- //
- addGenotypeTests(site,
- attr("g1", ref, "GS", Arrays.asList("S1", "S2")),
- attr("g2", ref, "GS", Arrays.asList("S3", "S4")));
-
- addGenotypeTests(site, // g1 is missing the string, and g2 is missing FLOAT1
- attr("g1", ref, "FLOAT1", 1.0),
- attr("g2", ref, "GS", Arrays.asList("S3", "S4")));
-
- // variable sized lists
- addGenotypeTests(site,
- attr("g1", ref, "GV", "S1"),
- attr("g2", ref, "GV", Arrays.asList("S3", "S4")));
-
- addGenotypeTests(site,
- attr("g1", ref, "GV", Arrays.asList("S1", "S2")),
- attr("g2", ref, "GV", Arrays.asList("S3", "S4", "S5")));
-
- addGenotypeTests(site, // missing value in varlist of string
- attr("g1", ref, "FLOAT1", 1.0),
- attr("g2", ref, "GV", Arrays.asList("S3", "S4", "S5")));
- }
-
- //
- //
- // TESTING GENOTYPE FILTERS
- //
- //
- addGenotypeTests(site,
- new GenotypeBuilder("g1-x", Arrays.asList(ref, ref)).filters("X").make(),
- new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make());
- addGenotypeTests(site,
- new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
- new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make());
- addGenotypeTests(site,
- new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
- new GenotypeBuilder("g2-xy", Arrays.asList(ref, ref)).filters("X", "Y").make());
- addGenotypeTests(site,
- new GenotypeBuilder("g1-unft", Arrays.asList(ref, ref)).unfiltered().make(),
- new GenotypeBuilder("g2-x", Arrays.asList(ref, ref)).filters("X").make(),
- new GenotypeBuilder("g3-xy", Arrays.asList(ref, ref)).filters("X", "Y").make());
- }
-
- private static void addGenotypesAndGTests() {
-// for ( final int ploidy : Arrays.asList(2)) {
- for ( final int ploidy : Arrays.asList(1, 2, 3, 4, 5)) {
- final List<List<String>> alleleCombinations =
- Arrays.asList(
- Arrays.asList("A"),
- Arrays.asList("A", "C"),
- Arrays.asList("A", "C", "G"),
- Arrays.asList("A", "C", "G", "T"));
-
- for ( final List<String> alleles : alleleCombinations ) {
- final VariantContextBuilder vcb = builder().alleles(alleles);
- final VariantContext site = vcb.make();
- final int nAlleles = site.getNAlleles();
- final Allele ref = site.getReference();
-
- // base genotype is ref/.../ref up to ploidy
- final List<Allele> baseGenotype = new ArrayList<Allele>(ploidy);
- for ( int i = 0; i < ploidy; i++) baseGenotype.add(ref);
- final int nPLs = GenotypeLikelihoods.numLikelihoods(nAlleles, ploidy);
-
- // ada is 0, 1, ..., nAlleles - 1
- final List<Integer> ada = new ArrayList<Integer>(nAlleles);
- for ( int i = 0; i < nAlleles - 1; i++ ) ada.add(i);
-
- // pl is 0, 1, ..., up to nPLs (complex calc of nAlleles and ploidy)
- final int[] pl = new int[nPLs];
- for ( int i = 0; i < pl.length; i++ ) pl[i] = i;
-
- final GenotypeBuilder gb = new GenotypeBuilder("ADA_PL_SAMPLE");
- gb.alleles(baseGenotype);
- gb.PL(pl);
- gb.attribute("ADA", nAlleles == 2 ? ada.get(0) : ada);
- vcb.genotypes(gb.make());
-
- add(vcb);
- }
- }
- }
-
- private static Genotype attr(final String name, final Allele ref, final String key, final Object ... value) {
- if ( value.length == 0 )
- return GenotypeBuilder.create(name, Arrays.asList(ref, ref));
- else {
- final Object toAdd = value.length == 1 ? value[0] : Arrays.asList(value);
- return new GenotypeBuilder(name, Arrays.asList(ref, ref)).attribute(key, toAdd).make();
- }
- }
-
- public static List<VariantContextTestData> generateSiteTests() {
- return TEST_DATAs;
- }
-
- public static void testReaderWriterWithMissingGenotypes(final VariantContextIOTest tester, final VariantContextTestData data) throws IOException {
- final int nSamples = data.header.getNGenotypeSamples();
- if ( nSamples > 2 ) {
- for ( final VariantContext vc : data.vcs )
- if ( vc.isSymbolic() )
- // cannot handle symbolic alleles because they may be weird non-call VCFs
- return;
-
- final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
- tmpFile.deleteOnExit();
- Tribble.indexFile(tmpFile).deleteOnExit();
-
- // write expected to disk
- final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
- final VariantContextWriter writer = tester.makeWriter(tmpFile, options);
-
- final Set<String> samplesInVCF = new HashSet<String>(data.header.getGenotypeSamples());
- final List<String> missingSamples = Arrays.asList("MISSING1", "MISSING2");
- final List<String> allSamples = new ArrayList<String>(missingSamples);
- allSamples.addAll(samplesInVCF);
-
- final VCFHeader header = new VCFHeader(data.header.getMetaDataInInputOrder(), allSamples);
- writeVCsToFile(writer, header, data.vcs);
-
- // ensure writing of expected == actual
- final VariantContextContainer p = tester.readAllVCs(tmpFile);
- final Iterable<VariantContext> actual = p.getVCs();
-
- int i = 0;
- for ( final VariantContext readVC : actual ) {
- if ( readVC == null ) continue; // sometimes we read null records...
- final VariantContext expected = data.vcs.get(i++);
- for ( final Genotype g : readVC.getGenotypes() ) {
- Assert.assertTrue(allSamples.contains(g.getSampleName()));
- if ( samplesInVCF.contains(g.getSampleName()) ) {
- assertEquals(g, expected.getGenotype(g.getSampleName()));
- } else {
- // missing
- Assert.assertTrue(g.isNoCall());
- }
- }
- }
-
- }
- }
-
- public static void testReaderWriter(final VariantContextIOTest tester, final VariantContextTestData data) throws IOException {
- testReaderWriter(tester, data.header, data.vcs, data.vcs, true);
- }
-
- public static void testReaderWriter(final VariantContextIOTest tester,
- final VCFHeader header,
- final List<VariantContext> expected,
- final Iterable<VariantContext> vcs,
- final boolean recurse) throws IOException {
- final File tmpFile = File.createTempFile("testReaderWriter", tester.getExtension());
- tmpFile.deleteOnExit();
- Tribble.indexFile(tmpFile).deleteOnExit();
-
- // write expected to disk
- final EnumSet<Options> options = EnumSet.of(Options.INDEX_ON_THE_FLY);
- final VariantContextWriter writer = tester.makeWriter(tmpFile, options);
- writeVCsToFile(writer, header, vcs);
-
- // ensure writing of expected == actual
- final VariantContextContainer p = tester.readAllVCs(tmpFile);
- final Iterable<VariantContext> actual = p.getVCs();
- assertEquals(actual, expected);
-
- if ( recurse ) {
- // if we are doing a recursive test, grab a fresh iterator over the written values
- final Iterable<VariantContext> read = tester.readAllVCs(tmpFile).getVCs();
- testReaderWriter(tester, p.getHeader(), expected, read, false);
- }
- }
-
- private static void writeVCsToFile(final VariantContextWriter writer, final VCFHeader header, final Iterable<VariantContext> vcs) {
- // write
- writer.writeHeader(header);
- for ( VariantContext vc : vcs )
- if (vc != null)
- writer.add(vc);
- writer.close();
- }
-
- public static abstract class VCIterable<SOURCE> implements Iterable<VariantContext>, Iterator<VariantContext> {
- final FeatureCodec<VariantContext, SOURCE> codec;
- final VCFHeader header;
-
- public VCIterable(final FeatureCodec<VariantContext, SOURCE> codec, final VCFHeader header) {
- this.codec = codec;
- this.header = header;
- }
-
- @Override
- public Iterator<VariantContext> iterator() {
- return this;
- }
-
- @Override
- public abstract boolean hasNext();
-
- public abstract SOURCE nextSource();
-
- @Override
- public VariantContext next() {
- try {
- final VariantContext vc = codec.decode(nextSource());
- return vc == null ? null : vc.fullyDecode(header, false);
- } catch ( IOException e ) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void remove() { }
- }
-
- public static VariantContextContainer readAllVCs(final File input, final BCF2Codec codec) throws IOException {
- PositionalBufferedStream headerPbs = new PositionalBufferedStream(new FileInputStream(input));
- FeatureCodecHeader header = codec.readHeader(headerPbs);
- headerPbs.close();
-
- final PositionalBufferedStream pbs = new PositionalBufferedStream(new FileInputStream(input));
- pbs.skip(header.getHeaderEnd());
-
- final VCFHeader vcfHeader = (VCFHeader)header.getHeaderValue();
- return new VariantContextTestProvider.VariantContextContainer(vcfHeader, new VariantContextTestProvider.VCIterable(codec, vcfHeader) {
- @Override
- public boolean hasNext() {
- try {
- return !pbs.isDone();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public Object nextSource() {
- return pbs;
- }
- });
- }
-
- public static VariantContextContainer readAllVCs(final File input, final VCFCodec codec) throws FileNotFoundException {
- final LineIterator lineIterator = new LineIteratorImpl(new SynchronousLineReader(new BufferedInputStream(new FileInputStream(input))));
- final VCFHeader vcfHeader = (VCFHeader) codec.readActualHeader(lineIterator);
- return new VariantContextTestProvider.VariantContextContainer(vcfHeader, new VariantContextTestProvider.VCIterable<LineIterator>(codec, vcfHeader) {
- @Override
- public boolean hasNext() {
- return lineIterator.hasNext();
- }
-
- @Override
- public LineIterator nextSource() {
- return lineIterator;
- }
- });
- }
-
- public static void assertVCFandBCFFilesAreTheSame(final File vcfFile, final File bcfFile) throws IOException {
- final VariantContextContainer vcfData = readAllVCs(vcfFile, new VCFCodec());
- final VariantContextContainer bcfData = readAllVCs(bcfFile, new BCF2Codec());
- assertEquals(bcfData.getHeader(), vcfData.getHeader());
- assertEquals(bcfData.getVCs(), vcfData.getVCs());
- }
-
- public static void assertEquals(final Iterable<VariantContext> actual, final Iterable<VariantContext> expected) {
- final Iterator<VariantContext> actualIT = actual.iterator();
- final Iterator<VariantContext> expectedIT = expected.iterator();
-
- while ( expectedIT.hasNext() ) {
- final VariantContext expectedVC = expectedIT.next();
- if ( expectedVC == null )
- continue;
-
- VariantContext actualVC;
- do {
- Assert.assertTrue(actualIT.hasNext(), "Too few records found in actual");
- actualVC = actualIT.next();
- } while ( actualIT.hasNext() && actualVC == null );
-
- if ( actualVC == null )
- Assert.fail("Too few records in actual");
-
- assertEquals(actualVC, expectedVC);
- }
- Assert.assertTrue(! actualIT.hasNext(), "Too many records found in actual");
- }
-
- /**
- * Assert that two variant contexts are actually equal
- * @param actual
- * @param expected
- */
- public static void assertEquals( final VariantContext actual, final VariantContext expected ) {
- Assert.assertNotNull(actual, "VariantContext expected not null");
- Assert.assertEquals(actual.getContig(), expected.getContig(), "chr");
- Assert.assertEquals(actual.getStart(), expected.getStart(), "start");
- Assert.assertEquals(actual.getEnd(), expected.getEnd(), "end");
- Assert.assertEquals(actual.getID(), expected.getID(), "id");
- Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "alleles for " + expected + " vs " + actual);
-
- assertAttributesEquals(actual.getAttributes(), expected.getAttributes());
- Assert.assertEquals(actual.filtersWereApplied(), expected.filtersWereApplied(), "filtersWereApplied");
- Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "isFiltered");
- VariantBaseTest.assertEqualsSet(actual.getFilters(), expected.getFilters(), "filters");
- VariantBaseTest.assertEqualsDoubleSmart(actual.getPhredScaledQual(), expected.getPhredScaledQual());
-
- Assert.assertEquals(actual.hasGenotypes(), expected.hasGenotypes(), "hasGenotypes");
- if ( expected.hasGenotypes() ) {
- VariantBaseTest.assertEqualsSet(actual.getSampleNames(), expected.getSampleNames(), "sample names set");
- Assert.assertEquals(actual.getSampleNamesOrderedByName(), expected.getSampleNamesOrderedByName(), "sample names");
- final Set<String> samples = expected.getSampleNames();
- for ( final String sample : samples ) {
- assertEquals(actual.getGenotype(sample), expected.getGenotype(sample));
- }
- }
- }
-
- public static void assertEquals(final Genotype actual, final Genotype expected) {
- Assert.assertEquals(actual.getSampleName(), expected.getSampleName(), "Genotype names");
- Assert.assertEquals(actual.getAlleles(), expected.getAlleles(), "Genotype alleles");
- Assert.assertEquals(actual.getGenotypeString(), expected.getGenotypeString(), "Genotype string");
- Assert.assertEquals(actual.getType(), expected.getType(), "Genotype type");
-
- // filters are the same
- Assert.assertEquals(actual.getFilters(), expected.getFilters(), "Genotype fields");
- Assert.assertEquals(actual.isFiltered(), expected.isFiltered(), "Genotype isFiltered");
-
- // inline attributes
- Assert.assertEquals(actual.getDP(), expected.getDP(), "Genotype dp");
- Assert.assertTrue(Arrays.equals(actual.getAD(), expected.getAD()));
- Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype gq");
- Assert.assertEquals(actual.hasPL(), expected.hasPL(), "Genotype hasPL");
- Assert.assertEquals(actual.hasAD(), expected.hasAD(), "Genotype hasAD");
- Assert.assertEquals(actual.hasGQ(), expected.hasGQ(), "Genotype hasGQ");
- Assert.assertEquals(actual.hasDP(), expected.hasDP(), "Genotype hasDP");
-
- Assert.assertEquals(actual.hasLikelihoods(), expected.hasLikelihoods(), "Genotype haslikelihoods");
- Assert.assertEquals(actual.getLikelihoodsString(), expected.getLikelihoodsString(), "Genotype getlikelihoodsString");
- Assert.assertEquals(actual.getLikelihoods(), expected.getLikelihoods(), "Genotype getLikelihoods");
- Assert.assertTrue(Arrays.equals(actual.getPL(), expected.getPL()));
-
- Assert.assertEquals(actual.getGQ(), expected.getGQ(), "Genotype phredScaledQual");
- assertAttributesEquals(actual.getExtendedAttributes(), expected.getExtendedAttributes());
- Assert.assertEquals(actual.isPhased(), expected.isPhased(), "Genotype isPhased");
- Assert.assertEquals(actual.getPloidy(), expected.getPloidy(), "Genotype getPloidy");
- }
-
- private static void assertAttributesEquals(final Map<String, Object> actual, Map<String, Object> expected) {
- final Set<String> expectedKeys = new HashSet<String>(expected.keySet());
-
- for ( final Map.Entry<String, Object> act : actual.entrySet() ) {
- final Object actualValue = act.getValue();
- if ( expected.containsKey(act.getKey()) && expected.get(act.getKey()) != null ) {
- final Object expectedValue = expected.get(act.getKey());
- if ( expectedValue instanceof List ) {
- final List<Object> expectedList = (List<Object>)expectedValue;
- Assert.assertTrue(actualValue instanceof List, act.getKey() + " should be a list but isn't");
- final List<Object> actualList = (List<Object>)actualValue;
- Assert.assertEquals(actualList.size(), expectedList.size(), act.getKey() + " size");
- for ( int i = 0; i < expectedList.size(); i++ )
- assertAttributeEquals(act.getKey(), actualList.get(i), expectedList.get(i));
- } else
- assertAttributeEquals(act.getKey(), actualValue, expectedValue);
- } else {
- // it's ok to have a binding in x -> null that's absent in y
- Assert.assertNull(actualValue, act.getKey() + " present in one but not in the other");
- }
- expectedKeys.remove(act.getKey());
- }
-
- // now expectedKeys contains only the keys found in expected but not in actual,
- // and they must all be null
- for ( final String missingExpected : expectedKeys ) {
- final Object value = expected.get(missingExpected);
- Assert.assertTrue(isMissing(value), "Attribute " + missingExpected + " missing in one but not in other" );
- }
- }
-
- private static final boolean isMissing(final Object value) {
- if ( value == null ) return true;
- else if ( value.equals(VCFConstants.MISSING_VALUE_v4) ) return true;
- else if ( value instanceof List ) {
- // handles the case where all elements are null or the list is empty
- for ( final Object elt : (List)value)
- if ( elt != null )
- return false;
- return true;
- } else
- return false;
- }
-
- private static void assertAttributeEquals(final String key, final Object actual, final Object expected) {
- if ( expected instanceof Double ) {
- // must be very tolerant because doubles are being rounded to 2 sig figs
- VariantBaseTest.assertEqualsDoubleSmart(actual, (Double)expected, 1e-2);
- } else
- Assert.assertEquals(actual, expected, "Attribute " + key);
- }
-
- public static void addComplexGenotypesTest() {
- final List<Allele> allAlleles = Arrays.asList(
- Allele.create("A", true),
- Allele.create("C", false),
- Allele.create("G", false));
-
- for ( int nAlleles : Arrays.asList(2, 3) ) {
- for ( int highestPloidy : Arrays.asList(1, 2, 3) ) {
- // site alleles
- final List<Allele> siteAlleles = allAlleles.subList(0, nAlleles);
-
- // possible alleles for genotypes
- final List<Allele> possibleGenotypeAlleles = new ArrayList<Allele>(siteAlleles);
- possibleGenotypeAlleles.add(Allele.NO_CALL);
-
- // there are n^ploidy possible genotypes
- final List<List<Allele>> possibleGenotypes = makeAllGenotypes(possibleGenotypeAlleles, highestPloidy);
- final int nPossibleGenotypes = possibleGenotypes.size();
-
- VariantContextBuilder vb = new VariantContextBuilder("unittest", "1", 1, 1, siteAlleles);
-
- // first test -- create n copies of each genotype
- for ( int i = 0; i < nPossibleGenotypes; i++ ) {
- final List<Genotype> samples = new ArrayList<Genotype>(3);
- samples.add(GenotypeBuilder.create("sample" + i, possibleGenotypes.get(i)));
- add(vb.genotypes(samples));
- }
-
- // second test -- create one sample with each genotype
- {
- final List<Genotype> samples = new ArrayList<Genotype>(nPossibleGenotypes);
- for ( int i = 0; i < nPossibleGenotypes; i++ ) {
- samples.add(GenotypeBuilder.create("sample" + i, possibleGenotypes.get(i)));
- }
- add(vb.genotypes(samples));
- }
-
- // test mixed ploidy
- for ( int i = 0; i < nPossibleGenotypes; i++ ) {
- for ( int ploidy = 1; ploidy < highestPloidy; ploidy++ ) {
- final List<Genotype> samples = new ArrayList<Genotype>(highestPloidy);
- final List<Allele> genotype = possibleGenotypes.get(i).subList(0, ploidy);
- samples.add(GenotypeBuilder.create("sample" + i, genotype));
- add(vb.genotypes(samples));
- }
- }
- }
- }
- }
-
- private static List<List<Allele>> makeAllGenotypes(final List<Allele> alleles, final int highestPloidy) {
- return GeneralUtils.makePermutations(alleles, highestPloidy, true);
- }
-
- public static void assertEquals(final VCFHeader actual, final VCFHeader expected) {
- Assert.assertEquals(actual.getMetaDataInSortedOrder().size(), expected.getMetaDataInSortedOrder().size(), "No VCF header lines");
-
- // for some reason set.equals() is returning false but all paired elements are .equals(). Perhaps compare to is busted?
- //Assert.assertEquals(actual.getMetaDataInInputOrder(), expected.getMetaDataInInputOrder());
- final List<VCFHeaderLine> actualLines = new ArrayList<VCFHeaderLine>(actual.getMetaDataInSortedOrder());
- final List<VCFHeaderLine> expectedLines = new ArrayList<VCFHeaderLine>(expected.getMetaDataInSortedOrder());
- for ( int i = 0; i < actualLines.size(); i++ ) {
- Assert.assertEquals(actualLines.get(i), expectedLines.get(i), "VCF header lines");
- }
- }
-
- public static void main( String argv[] ) {
- final File variants1 = new File(argv[0]);
- final File variants2 = new File(argv[1]);
- try {
- VariantContextTestProvider.assertVCFandBCFFilesAreTheSame(variants1, variants2);
- } catch ( IOException e ) {
- throw new RuntimeException(e);
- }
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java
deleted file mode 100644
index 14056f8..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantContextUnitTest.java
+++ /dev/null
@@ -1,1621 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.CloserUtil;
-
-// the imports for unit testing.
-
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureCodec;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.vcf.VCFConstants;
-import htsjdk.variant.vcf.VCFFileReader;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import java.io.File;
-import java.util.*;
-
-
-public class VariantContextUnitTest extends VariantBaseTest {
- Allele A, Aref, C, T, Tref;
- Allele del, delRef, ATC, ATCref;
-
- // A [ref] / T at 10
- String snpLoc = "chr1";
- int snpLocStart = 10;
- int snpLocStop = 10;
-
- // - / ATC [ref] from 20-22
- String delLoc = "chr1";
- int delLocStart = 20;
- int delLocStop = 22;
-
- // - [ref] / ATC from 20-20
- String insLoc = "chr1";
- int insLocStart = 20;
- int insLocStop = 20;
-
- VariantContextBuilder basicBuilder, snpBuilder, insBuilder;
-
- @BeforeSuite
- public void before() {
- del = Allele.create("A");
- delRef = Allele.create("A", true);
-
- A = Allele.create("A");
- C = Allele.create("C");
- Aref = Allele.create("A", true);
- T = Allele.create("T");
- Tref = Allele.create("T", true);
-
- ATC = Allele.create("ATC");
- ATCref = Allele.create("ATC", true);
- }
-
- @BeforeMethod
- public void beforeTest() {
- basicBuilder = new VariantContextBuilder("test", snpLoc,snpLocStart, snpLocStop, Arrays.asList(Aref, T));
- snpBuilder = new VariantContextBuilder("test", snpLoc,snpLocStart, snpLocStop, Arrays.asList(Aref, T));
- insBuilder = new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATC));
- }
-
- @Test
- public void testDetermineTypes() {
- Allele ACref = Allele.create("AC", true);
- Allele AC = Allele.create("AC");
- Allele AT = Allele.create("AT");
- Allele C = Allele.create("C");
- Allele CAT = Allele.create("CAT");
- Allele TAref = Allele.create("TA", true);
- Allele TA = Allele.create("TA");
- Allele TC = Allele.create("TC");
- Allele symbolic = Allele.create("<FOO>");
-
- // test REF
- List<Allele> alleles = Arrays.asList(Tref);
- VariantContext vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.NO_VARIATION);
-
- // test SNPs
- alleles = Arrays.asList(Tref, A);
- vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
-
- alleles = Arrays.asList(Tref, A, C);
- vc = snpBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
-
- // test MNPs
- alleles = Arrays.asList(ACref, TA);
- vc = snpBuilder.alleles(alleles).stop(snpLocStop+1).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MNP);
-
- alleles = Arrays.asList(ATCref, CAT, Allele.create("GGG"));
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MNP);
-
- // test INDELs
- alleles = Arrays.asList(Aref, ATC);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
- alleles = Arrays.asList(ATCref, A);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
- alleles = Arrays.asList(Tref, TA, TC);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
- alleles = Arrays.asList(ATCref, A, AC);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
- alleles = Arrays.asList(ATCref, A, Allele.create("ATCTC"));
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+2).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
-
- // test MIXED
- alleles = Arrays.asList(TAref, T, TC);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
- alleles = Arrays.asList(TAref, T, AC);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
- alleles = Arrays.asList(ACref, ATC, AT);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop+1).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
- alleles = Arrays.asList(Aref, T, symbolic);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.MIXED);
-
- // test SYMBOLIC
- alleles = Arrays.asList(Tref, symbolic);
- vc = basicBuilder.alleles(alleles).stop(snpLocStop).make();
- Assert.assertEquals(vc.getType(), VariantContext.Type.SYMBOLIC);
- }
-
- @Test
- public void testMultipleSNPAlleleOrdering() {
- final List<Allele> allelesNaturalOrder = Arrays.asList(Aref, C, T);
- final List<Allele> allelesUnnaturalOrder = Arrays.asList(Aref, T, C);
- VariantContext naturalVC = snpBuilder.alleles(allelesNaturalOrder).make();
- VariantContext unnaturalVC = snpBuilder.alleles(allelesUnnaturalOrder).make();
- Assert.assertEquals(new ArrayList<Allele>(naturalVC.getAlleles()), allelesNaturalOrder);
- Assert.assertEquals(new ArrayList<Allele>(unnaturalVC.getAlleles()), allelesUnnaturalOrder);
- }
-
- @Test
- public void testCreatingSNPVariantContext() {
-
- List<Allele> alleles = Arrays.asList(Aref, T);
- VariantContext vc = snpBuilder.alleles(alleles).make();
-
- Assert.assertEquals(vc.getContig(), snpLoc);
- Assert.assertEquals(vc.getStart(), snpLocStart);
- Assert.assertEquals(vc.getEnd(), snpLocStop);
- Assert.assertEquals(vc.getType(), VariantContext.Type.SNP);
- Assert.assertTrue(vc.isSNP());
- Assert.assertFalse(vc.isIndel());
- Assert.assertFalse(vc.isSimpleInsertion());
- Assert.assertFalse(vc.isSimpleDeletion());
- Assert.assertFalse(vc.isSimpleIndel());
- Assert.assertFalse(vc.isMixed());
- Assert.assertTrue(vc.isBiallelic());
- Assert.assertEquals(vc.getNAlleles(), 2);
-
- Assert.assertEquals(vc.getReference(), Aref);
- Assert.assertEquals(vc.getAlleles().size(), 2);
- Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
- Assert.assertEquals(vc.getAlternateAllele(0), T);
-
- Assert.assertFalse(vc.hasGenotypes());
-
- Assert.assertEquals(vc.getSampleNames().size(), 0);
- }
-
- @Test
- public void testCreatingRefVariantContext() {
- List<Allele> alleles = Arrays.asList(Aref);
- VariantContext vc = snpBuilder.alleles(alleles).make();
-
- Assert.assertEquals(vc.getContig(), snpLoc);
- Assert.assertEquals(vc.getStart(), snpLocStart);
- Assert.assertEquals(vc.getEnd(), snpLocStop);
- Assert.assertEquals(VariantContext.Type.NO_VARIATION, vc.getType());
- Assert.assertFalse(vc.isSNP());
- Assert.assertFalse(vc.isIndel());
- Assert.assertFalse(vc.isSimpleInsertion());
- Assert.assertFalse(vc.isSimpleDeletion());
- Assert.assertFalse(vc.isSimpleIndel());
- Assert.assertFalse(vc.isMixed());
- Assert.assertFalse(vc.isBiallelic());
- Assert.assertEquals(vc.getNAlleles(), 1);
-
- Assert.assertEquals(vc.getReference(), Aref);
- Assert.assertEquals(vc.getAlleles().size(), 1);
- Assert.assertEquals(vc.getAlternateAlleles().size(), 0);
- //Assert.assertEquals(vc.getAlternateAllele(0), T);
-
- Assert.assertFalse(vc.hasGenotypes());
- Assert.assertEquals(vc.getSampleNames().size(), 0);
- }
-
- @Test
- public void testCreatingDeletionVariantContext() {
- List<Allele> alleles = Arrays.asList(ATCref, del);
- VariantContext vc = new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
-
- Assert.assertEquals(vc.getContig(), delLoc);
- Assert.assertEquals(vc.getStart(), delLocStart);
- Assert.assertEquals(vc.getEnd(), delLocStop);
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
- Assert.assertFalse(vc.isSNP());
- Assert.assertTrue(vc.isIndel());
- Assert.assertFalse(vc.isSimpleInsertion());
- Assert.assertTrue(vc.isSimpleDeletion());
- Assert.assertTrue(vc.isSimpleIndel());
- Assert.assertFalse(vc.isMixed());
- Assert.assertTrue(vc.isBiallelic());
- Assert.assertEquals(vc.getNAlleles(), 2);
-
- Assert.assertEquals(vc.getReference(), ATCref);
- Assert.assertEquals(vc.getAlleles().size(), 2);
- Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
- Assert.assertEquals(vc.getAlternateAllele(0), del);
-
- Assert.assertFalse(vc.hasGenotypes());
-
- Assert.assertEquals(vc.getSampleNames().size(), 0);
- }
-
- @Test
- public void testCreatingComplexSubstitutionVariantContext() {
- List<Allele> alleles = Arrays.asList(Tref, ATC);
- VariantContext vc = new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, alleles).make();
-
- Assert.assertEquals(vc.getContig(), insLoc);
- Assert.assertEquals(vc.getStart(), insLocStart);
- Assert.assertEquals(vc.getEnd(), insLocStop);
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
- Assert.assertFalse(vc.isSNP());
- Assert.assertTrue(vc.isIndel());
- Assert.assertFalse(vc.isSimpleInsertion());
- Assert.assertFalse(vc.isSimpleDeletion());
- Assert.assertFalse(vc.isSimpleIndel());
- Assert.assertFalse(vc.isMixed());
- Assert.assertTrue(vc.isBiallelic());
- Assert.assertEquals(vc.getNAlleles(), 2);
-
- Assert.assertEquals(vc.getReference(), Tref);
- Assert.assertEquals(vc.getAlleles().size(), 2);
- Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
- Assert.assertEquals(vc.getAlternateAllele(0), ATC);
-
- Assert.assertFalse(vc.hasGenotypes());
-
- Assert.assertEquals(vc.getSampleNames().size(), 0);
- }
-
- @Test
- public void testMatchingAlleles() {
- List<Allele> alleles = Arrays.asList(ATCref, del);
- VariantContext vc = new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
- VariantContext vc2 = new VariantContextBuilder("test2", delLoc, delLocStart+12, delLocStop+12, alleles).make();
-
- Assert.assertTrue(vc.hasSameAllelesAs(vc2));
- Assert.assertTrue(vc.hasSameAlternateAllelesAs(vc2));
- }
-
- @Test
- public void testCreatingInsertionVariantContext() {
- List<Allele> alleles = Arrays.asList(delRef, ATC);
- VariantContext vc = insBuilder.alleles(alleles).make();
-
- Assert.assertEquals(vc.getContig(), insLoc);
- Assert.assertEquals(vc.getStart(), insLocStart);
- Assert.assertEquals(vc.getEnd(), insLocStop);
- Assert.assertEquals(vc.getType(), VariantContext.Type.INDEL);
- Assert.assertFalse(vc.isSNP());
- Assert.assertTrue(vc.isIndel());
- Assert.assertTrue(vc.isSimpleInsertion());
- Assert.assertFalse(vc.isSimpleDeletion());
- Assert.assertTrue(vc.isSimpleIndel());
- Assert.assertFalse(vc.isMixed());
- Assert.assertTrue(vc.isBiallelic());
- Assert.assertEquals(vc.getNAlleles(), 2);
-
- Assert.assertEquals(vc.getReference(), delRef);
- Assert.assertEquals(vc.getAlleles().size(), 2);
- Assert.assertEquals(vc.getAlternateAlleles().size(), 1);
- Assert.assertEquals(vc.getAlternateAllele(0), ATC);
- Assert.assertFalse(vc.hasGenotypes());
-
- Assert.assertEquals(vc.getSampleNames().size(), 0);
- }
-
- @Test
- public void testCreatingPartiallyCalledGenotype() {
- List<Allele> alleles = Arrays.asList(Aref, C);
- Genotype g = GenotypeBuilder.create("foo", Arrays.asList(C, Allele.NO_CALL));
- VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g).make();
-
- Assert.assertTrue(vc.isSNP());
- Assert.assertEquals(vc.getNAlleles(), 2);
- Assert.assertTrue(vc.hasGenotypes());
- Assert.assertFalse(vc.isMonomorphicInSamples());
- Assert.assertTrue(vc.isPolymorphicInSamples());
- Assert.assertEquals(vc.getGenotype("foo"), g);
- Assert.assertEquals(vc.getCalledChrCount(), 1); // we only have 1 called chromosomes, we exclude the NO_CALL one isn't called
- Assert.assertEquals(vc.getCalledChrCount(Aref), 0);
- Assert.assertEquals(vc.getCalledChrCount(C), 1);
- Assert.assertFalse(vc.getGenotype("foo").isHet());
- Assert.assertFalse(vc.getGenotype("foo").isHom());
- Assert.assertFalse(vc.getGenotype("foo").isNoCall());
- Assert.assertFalse(vc.getGenotype("foo").isHom());
- Assert.assertTrue(vc.getGenotype("foo").isMixed());
- Assert.assertEquals(vc.getGenotype("foo").getType(), GenotypeType.MIXED);
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadConstructorArgs1() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATCref)).make();
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadConstructorArgs2() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, del)).make();
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadConstructorArgs3() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(del)).make();
- }
-
- @Test (expectedExceptions = Throwable.class)
- public void testBadConstructorArgs4() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Collections.<Allele>emptyList()).make();
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadConstructorArgsDuplicateAlleles1() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(Aref, T, T)).make();
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadConstructorArgsDuplicateAlleles2() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(Aref, A)).make();
- }
-
- @Test (expectedExceptions = Throwable.class)
- public void testBadLoc1() {
- List<Allele> alleles = Arrays.asList(Aref, T, del);
- new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, alleles).make();
- }
-
- @Test (expectedExceptions = Throwable.class)
- public void testBadID1() {
- new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, Arrays.asList(Aref, T)).id(null).make();
- }
-
- @Test (expectedExceptions = Exception.class)
- public void testBadID2() {
- new VariantContextBuilder("test", delLoc, delLocStart, delLocStop, Arrays.asList(Aref, T)).id("").make();
- }
-
- @Test (expectedExceptions = Throwable.class)
- public void testBadPError() {
- new VariantContextBuilder("test", insLoc, insLocStart, insLocStop, Arrays.asList(delRef, ATCref)).log10PError(0.5).make();
- }
-
- @Test
- public void testAccessingSimpleSNPGenotypes() {
- List<Allele> alleles = Arrays.asList(Aref, T);
-
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-
- VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
- .genotypes(g1, g2, g3).make();
-
- Assert.assertTrue(vc.hasGenotypes());
- Assert.assertFalse(vc.isMonomorphicInSamples());
- Assert.assertTrue(vc.isPolymorphicInSamples());
- Assert.assertEquals(vc.getSampleNames().size(), 3);
-
- Assert.assertEquals(vc.getGenotypes().size(), 3);
- Assert.assertEquals(vc.getGenotypes().get("AA"), g1);
- Assert.assertEquals(vc.getGenotype("AA"), g1);
- Assert.assertEquals(vc.getGenotypes().get("AT"), g2);
- Assert.assertEquals(vc.getGenotype("AT"), g2);
- Assert.assertEquals(vc.getGenotypes().get("TT"), g3);
- Assert.assertEquals(vc.getGenotype("TT"), g3);
-
- Assert.assertTrue(vc.hasGenotype("AA"));
- Assert.assertTrue(vc.hasGenotype("AT"));
- Assert.assertTrue(vc.hasGenotype("TT"));
- Assert.assertFalse(vc.hasGenotype("foo"));
- Assert.assertFalse(vc.hasGenotype("TTT"));
- Assert.assertFalse(vc.hasGenotype("at"));
- Assert.assertFalse(vc.hasGenotype("tt"));
-
- Assert.assertEquals(vc.getCalledChrCount(), 6);
- Assert.assertEquals(vc.getCalledChrCount(Aref), 3);
- Assert.assertEquals(vc.getCalledChrCount(T), 3);
- }
-
- @Test
- public void testAccessingCompleteGenotypes() {
- List<Allele> alleles = Arrays.asList(Aref, T, ATC);
-
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- Genotype g4 = GenotypeBuilder.create("Td", Arrays.asList(T, ATC));
- Genotype g5 = GenotypeBuilder.create("dd", Arrays.asList(ATC, ATC));
- Genotype g6 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-
- VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
- .genotypes(g1, g2, g3, g4, g5, g6).make();
-
- Assert.assertTrue(vc.hasGenotypes());
- Assert.assertFalse(vc.isMonomorphicInSamples());
- Assert.assertTrue(vc.isPolymorphicInSamples());
- Assert.assertEquals(vc.getGenotypes().size(), 6);
-
- Assert.assertEquals(3, vc.getGenotypes(Arrays.asList("AA", "Td", "dd")).size());
-
- Assert.assertEquals(10, vc.getCalledChrCount());
- Assert.assertEquals(3, vc.getCalledChrCount(Aref));
- Assert.assertEquals(4, vc.getCalledChrCount(T));
- Assert.assertEquals(3, vc.getCalledChrCount(ATC));
- Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
-
- Assert.assertEquals(T, vc.getAltAlleleWithHighestAlleleCount());
- }
-
- @Test
- public void testAccessingRefGenotypes() {
- List<Allele> alleles1 = Arrays.asList(Aref, T);
- List<Allele> alleles2 = Arrays.asList(Aref);
- List<Allele> alleles3 = Arrays.asList(Aref, T);
- for ( List<Allele> alleles : Arrays.asList(alleles1, alleles2, alleles3)) {
- Genotype g1 = GenotypeBuilder.create("AA1", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AA2", Arrays.asList(Aref, Aref));
- Genotype g3 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
- VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles)
- .genotypes(g1, g2, g3).make();
-
- Assert.assertTrue(vc.hasGenotypes());
- Assert.assertTrue(vc.isMonomorphicInSamples());
- Assert.assertFalse(vc.isPolymorphicInSamples());
- Assert.assertEquals(vc.getGenotypes().size(), 3);
-
- Assert.assertEquals(4, vc.getCalledChrCount());
- Assert.assertEquals(4, vc.getCalledChrCount(Aref));
- Assert.assertEquals(0, vc.getCalledChrCount(T));
- Assert.assertEquals(2, vc.getCalledChrCount(Allele.NO_CALL));
-
- //bi allelic, only one alt allele
- Allele expected;
- if (alleles.size()>1) {
- expected = alleles.get(1);
- } else {
- expected = null;
- }
-
- Assert.assertEquals( vc.getAltAlleleWithHighestAlleleCount(), expected);
- }
- }
-
- @Test
- public void testFilters() {
- List<Allele> alleles = Arrays.asList(Aref, T);
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
-
- VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1, g2).make();
-
- Assert.assertTrue(vc.isNotFiltered());
- Assert.assertFalse(vc.isFiltered());
- Assert.assertEquals(0, vc.getFilters().size());
- Assert.assertFalse(vc.filtersWereApplied());
- Assert.assertNull(vc.getFiltersMaybeNull());
-
- vc = new VariantContextBuilder(vc).filters("BAD_SNP_BAD!").make();
-
- Assert.assertFalse(vc.isNotFiltered());
- Assert.assertTrue(vc.isFiltered());
- Assert.assertEquals(1, vc.getFilters().size());
- Assert.assertTrue(vc.filtersWereApplied());
- Assert.assertNotNull(vc.getFiltersMaybeNull());
-
- Set<String> filters = new HashSet<String>(Arrays.asList("BAD_SNP_BAD!", "REALLY_BAD_SNP", "CHRIST_THIS_IS_TERRIBLE"));
- vc = new VariantContextBuilder(vc).filters(filters).make();
-
- Assert.assertFalse(vc.isNotFiltered());
- Assert.assertTrue(vc.isFiltered());
- Assert.assertEquals(3, vc.getFilters().size());
- Assert.assertTrue(vc.filtersWereApplied());
- Assert.assertNotNull(vc.getFiltersMaybeNull());
- }
-
- @Test
- public void testGetGenotypeCounts() {
- List<Allele> alleles = Arrays.asList(Aref, T);
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- Genotype g4 = GenotypeBuilder.create("A.", Arrays.asList(Aref, Allele.NO_CALL));
- Genotype g5 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
-
- // we need to create a new VariantContext each time
- VariantContext vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
- Assert.assertEquals(1, vc.getHetCount());
- vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
- Assert.assertEquals(1, vc.getHomRefCount());
- vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
- Assert.assertEquals(1, vc.getHomVarCount());
- vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
- Assert.assertEquals(1, vc.getMixedCount());
- vc = new VariantContextBuilder("foo", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
- Assert.assertEquals(1, vc.getNoCallCount());
- }
-
- @Test
- public void testVCFfromGenotypes() {
- List<Allele> alleles = Arrays.asList(Aref, C, T);
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- Genotype g4 = GenotypeBuilder.create("..", Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
- Genotype g5 = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, alleles).genotypes(g1,g2,g3,g4,g5).make();
-
- VariantContext vc12 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g2.getSampleName())), true);
- VariantContext vc1 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName())), true);
- VariantContext vc23 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g2.getSampleName(), g3.getSampleName())), true);
- VariantContext vc4 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g4.getSampleName())), true);
- VariantContext vc14 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g4.getSampleName())), true);
- VariantContext vc125 = vc.subContextFromSamples(new HashSet<String>(Arrays.asList(g1.getSampleName(), g2.getSampleName(), g5.getSampleName())), true);
-
- Assert.assertTrue(vc12.isPolymorphicInSamples());
- Assert.assertTrue(vc23.isPolymorphicInSamples());
- Assert.assertTrue(vc1.isMonomorphicInSamples());
- Assert.assertTrue(vc4.isMonomorphicInSamples());
- Assert.assertTrue(vc14.isMonomorphicInSamples());
- Assert.assertTrue(vc125.isPolymorphicInSamples());
-
- Assert.assertTrue(vc12.isSNP());
- Assert.assertTrue(vc12.isVariant());
- Assert.assertTrue(vc12.isBiallelic());
-
- Assert.assertFalse(vc1.isSNP());
- Assert.assertFalse(vc1.isVariant());
- Assert.assertFalse(vc1.isBiallelic());
-
- Assert.assertTrue(vc23.isSNP());
- Assert.assertTrue(vc23.isVariant());
- Assert.assertTrue(vc23.isBiallelic());
-
- Assert.assertFalse(vc4.isSNP());
- Assert.assertFalse(vc4.isVariant());
- Assert.assertFalse(vc4.isBiallelic());
-
- Assert.assertFalse(vc14.isSNP());
- Assert.assertFalse(vc14.isVariant());
- Assert.assertFalse(vc14.isBiallelic());
-
- Assert.assertTrue(vc125.isSNP());
- Assert.assertTrue(vc125.isVariant());
- Assert.assertFalse(vc125.isBiallelic());
-
- Assert.assertEquals(3, vc12.getCalledChrCount(Aref));
- Assert.assertEquals(1, vc23.getCalledChrCount(Aref));
- Assert.assertEquals(2, vc1.getCalledChrCount(Aref));
- Assert.assertEquals(0, vc4.getCalledChrCount(Aref));
- Assert.assertEquals(2, vc14.getCalledChrCount(Aref));
- Assert.assertEquals(4, vc125.getCalledChrCount(Aref));
- }
-
- @Test
- public void testMonomorphicVariant() {
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("BB", Arrays.asList(Aref, Allele.NO_CALL));
- Genotype g3 = GenotypeBuilder.create("CC", Arrays.asList(Allele.NO_CALL,Allele.NO_CALL));
- GenotypesContext gc = GenotypesContext.create(g1, g2, g3);
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Collections.singletonList(Aref)).genotypes(gc).make();
-
- Assert.assertEquals(vc.getType(), VariantContext.Type.NO_VARIATION);
- Assert.assertNull(vc.getAltAlleleWithHighestAlleleCount());
- Assert.assertEquals(vc.getCalledChrCount(Aref), 3);
-
- }
-
-
- public void testGetGenotypeMethods() {
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- GenotypesContext gc = GenotypesContext.create(g1, g2, g3);
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
-
- Assert.assertEquals(vc.getGenotype("AA"), g1);
- Assert.assertEquals(vc.getGenotype("AT"), g2);
- Assert.assertEquals(vc.getGenotype("TT"), g3);
- Assert.assertEquals(vc.getGenotype("CC"), null);
-
- Assert.assertEquals(vc.getGenotypes(), gc);
- Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT")), Arrays.asList(g1, g2));
- Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "TT")), Arrays.asList(g1, g3));
- Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT", "TT")), Arrays.asList(g1, g2, g3));
- Assert.assertEquals(vc.getGenotypes(Arrays.asList("AA", "AT", "CC")), Arrays.asList(g1, g2));
-
- Assert.assertEquals(vc.getGenotype(0), g1);
- Assert.assertEquals(vc.getGenotype(1), g2);
- Assert.assertEquals(vc.getGenotype(2), g3);
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test allele merging
- //
- // --------------------------------------------------------------------------------
-
- private class GetAllelesTest {
- List<Allele> alleles;
- String name;
-
- private GetAllelesTest(String name, Allele... arg) {
- this.name = name;
- this.alleles = Arrays.asList(arg);
- }
-
- public String toString() {
- return String.format("%s input=%s", name, alleles);
- }
- }
-
- @DataProvider(name = "getAlleles")
- public Object[][] mergeAllelesData() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- tests.add(new Object[]{new GetAllelesTest("A*", Aref)});
- tests.add(new Object[]{new GetAllelesTest("A*/C", Aref, C)});
- tests.add(new Object[]{new GetAllelesTest("A*/C/T", Aref, C, T)});
- tests.add(new Object[]{new GetAllelesTest("A*/T/C", Aref, T, C)});
- tests.add(new Object[]{new GetAllelesTest("A*/C/T/ATC", Aref, C, T, ATC)});
- tests.add(new Object[]{new GetAllelesTest("A*/T/C/ATC", Aref, T, C, ATC)});
- tests.add(new Object[]{new GetAllelesTest("A*/ATC/T/C", Aref, ATC, T, C)});
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "getAlleles")
- public void testMergeAlleles(GetAllelesTest cfg) {
- final List<Allele> altAlleles = cfg.alleles.subList(1, cfg.alleles.size());
- final VariantContext vc = new VariantContextBuilder("test", snpLoc, snpLocStart, snpLocStop, cfg.alleles).make();
-
- Assert.assertEquals(vc.getAlleles(), cfg.alleles, "VC alleles not the same as input alleles");
- Assert.assertEquals(vc.getNAlleles(), cfg.alleles.size(), "VC getNAlleles not the same as input alleles size");
- Assert.assertEquals(vc.getAlternateAlleles(), altAlleles, "VC alt alleles not the same as input alt alleles");
-
-
- for ( int i = 0; i < cfg.alleles.size(); i++ ) {
- final Allele inputAllele = cfg.alleles.get(i);
-
- Assert.assertTrue(vc.hasAllele(inputAllele));
- if ( inputAllele.isReference() ) {
- final Allele nonRefVersion = Allele.create(inputAllele.getBases(), false);
- Assert.assertTrue(vc.hasAllele(nonRefVersion, true));
- Assert.assertFalse(vc.hasAllele(nonRefVersion, false));
- }
-
- Assert.assertEquals(inputAllele, vc.getAllele(inputAllele.getBaseString()));
- Assert.assertEquals(inputAllele, vc.getAllele(inputAllele.getBases()));
-
- if ( i > 0 ) { // it's an alt allele
- Assert.assertEquals(inputAllele, vc.getAlternateAllele(i-1));
- }
- }
-
- final Allele missingAllele = Allele.create("AACCGGTT"); // does not exist
- Assert.assertNull(vc.getAllele(missingAllele.getBases()));
- Assert.assertFalse(vc.hasAllele(missingAllele));
- Assert.assertFalse(vc.hasAllele(missingAllele, true));
- }
-
- private class SitesAndGenotypesVC {
- VariantContext vc, copy;
- String name;
-
- private SitesAndGenotypesVC(String name, VariantContext original) {
- this.name = name;
- this.vc = original;
- this.copy = new VariantContextBuilder(original).make();
- }
-
- public String toString() {
- return String.format("%s input=%s", name, vc);
- }
- }
-
- @DataProvider(name = "SitesAndGenotypesVC")
- public Object[][] MakeSitesAndGenotypesVCs() {
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
-
- VariantContext sites = new VariantContextBuilder("sites", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).make();
- VariantContext genotypes = new VariantContextBuilder(sites).source("genotypes").genotypes(g1, g2, g3).make();
-
- List<Object[]> tests = new ArrayList<Object[]>();
-
- tests.add(new Object[]{new SitesAndGenotypesVC("sites", sites)});
- tests.add(new Object[]{new SitesAndGenotypesVC("genotypes", genotypes)});
-
- return tests.toArray(new Object[][]{});
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test modifying routines
- //
- // --------------------------------------------------------------------------------
- @Test(dataProvider = "SitesAndGenotypesVC")
- public void runModifyVCTests(SitesAndGenotypesVC cfg) {
- VariantContext modified = new VariantContextBuilder(cfg.vc).loc("chr2", 123, 123).make();
- Assert.assertEquals(modified.getContig(), "chr2");
- Assert.assertEquals(modified.getStart(), 123);
- Assert.assertEquals(modified.getEnd(), 123);
-
- modified = new VariantContextBuilder(cfg.vc).id("newID").make();
- Assert.assertEquals(modified.getID(), "newID");
-
- Set<String> newFilters = Collections.singleton("newFilter");
- modified = new VariantContextBuilder(cfg.vc).filters(newFilters).make();
- Assert.assertEquals(modified.getFilters(), newFilters);
-
- // test the behavior when the builder's attribute object is null
- modified = new VariantContextBuilder(modified).attributes(null).make();
- Assert.assertTrue(modified.getAttributes().isEmpty());
- modified = new VariantContextBuilder(modified).attributes(null).rmAttribute("AC").make();
- Assert.assertTrue(modified.getAttributes().isEmpty());
- modified = new VariantContextBuilder(modified).attributes(null).attribute("AC", 1).make();
- Assert.assertEquals(modified.getAttribute("AC"), 1);
-
- // test the behavior when the builder's attribute object is not initialized
- modified = new VariantContextBuilder(modified.getSource(), modified.getContig(), modified.getStart(), modified.getEnd(), modified.getAlleles()).attribute("AC", 1).make();
-
- // test normal attribute modification
- modified = new VariantContextBuilder(cfg.vc).attribute("AC", 1).make();
- Assert.assertEquals(modified.getAttribute("AC"), 1);
- modified = new VariantContextBuilder(modified).attribute("AC", 2).make();
- Assert.assertEquals(modified.getAttribute("AC"), 2);
-
- Genotype g1 = GenotypeBuilder.create("AA2", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT2", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT2", Arrays.asList(T, T));
- GenotypesContext gc = GenotypesContext.create(g1,g2,g3);
- modified = new VariantContextBuilder(cfg.vc).genotypes(gc).make();
- Assert.assertEquals(modified.getGenotypes(), gc);
- modified = new VariantContextBuilder(cfg.vc).noGenotypes().make();
- Assert.assertTrue(modified.getGenotypes().isEmpty());
-
- // test that original hasn't changed
- Assert.assertEquals(cfg.vc.getContig(), cfg.copy.getContig());
- Assert.assertEquals(cfg.vc.getStart(), cfg.copy.getStart());
- Assert.assertEquals(cfg.vc.getEnd(), cfg.copy.getEnd());
- Assert.assertEquals(cfg.vc.getAlleles(), cfg.copy.getAlleles());
- Assert.assertEquals(cfg.vc.getAttributes(), cfg.copy.getAttributes());
- Assert.assertEquals(cfg.vc.getID(), cfg.copy.getID());
- Assert.assertEquals(cfg.vc.getGenotypes(), cfg.copy.getGenotypes());
- Assert.assertEquals(cfg.vc.getLog10PError(), cfg.copy.getLog10PError());
- Assert.assertEquals(cfg.vc.getFilters(), cfg.copy.getFilters());
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test subcontext
- //
- // --------------------------------------------------------------------------------
- private class SubContextTest {
- Set<String> samples;
- boolean updateAlleles;
-
- private SubContextTest(Collection<String> samples, boolean updateAlleles) {
- this.samples = new HashSet<String>(samples);
- this.updateAlleles = updateAlleles;
- }
-
- public String toString() {
- return String.format("%s samples=%s updateAlleles=%b", "SubContextTest", samples, updateAlleles);
- }
- }
-
- @DataProvider(name = "SubContextTest")
- public Object[][] MakeSubContextTest() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- for ( boolean updateAlleles : Arrays.asList(true, false)) {
- tests.add(new Object[]{new SubContextTest(Collections.<String>emptySet(), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Collections.singleton("MISSING"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Collections.singleton("AA"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Collections.singleton("AT"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Collections.singleton("TT"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "TT"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "MISSING"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "TT", "MISSING"), updateAlleles)});
- tests.add(new Object[]{new SubContextTest(Arrays.asList("AA", "AT", "AC"), updateAlleles)});
- }
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "SubContextTest")
- public void runSubContextTest(SubContextTest cfg) {
- Genotype g1 = GenotypeBuilder.create("AA", Arrays.asList(Aref, Aref));
- Genotype g2 = GenotypeBuilder.create("AT", Arrays.asList(Aref, T));
- Genotype g3 = GenotypeBuilder.create("TT", Arrays.asList(T, T));
- Genotype g4 = GenotypeBuilder.create("AC", Arrays.asList(Aref, C));
-
- GenotypesContext gc = GenotypesContext.create(g1, g2, g3, g4);
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, C, T)).genotypes(gc).make();
- VariantContext sub = vc.subContextFromSamples(cfg.samples, cfg.updateAlleles);
-
- // unchanged attributes should be the same
- Assert.assertEquals(sub.getContig(), vc.getContig());
- Assert.assertEquals(sub.getStart(), vc.getStart());
- Assert.assertEquals(sub.getEnd(), vc.getEnd());
- Assert.assertEquals(sub.getLog10PError(), vc.getLog10PError());
- Assert.assertEquals(sub.getFilters(), vc.getFilters());
- Assert.assertEquals(sub.getID(), vc.getID());
- Assert.assertEquals(sub.getAttributes(), vc.getAttributes());
-
- Set<Genotype> expectedGenotypes = new HashSet<Genotype>();
- if ( cfg.samples.contains(g1.getSampleName()) ) expectedGenotypes.add(g1);
- if ( cfg.samples.contains(g2.getSampleName()) ) expectedGenotypes.add(g2);
- if ( cfg.samples.contains(g3.getSampleName()) ) expectedGenotypes.add(g3);
- if ( cfg.samples.contains(g4.getSampleName()) ) expectedGenotypes.add(g4);
- GenotypesContext expectedGC = GenotypesContext.copy(expectedGenotypes);
-
- // these values depend on the results of sub
- if ( cfg.updateAlleles ) {
- // do the work to see what alleles should be here, and which not
- List<Allele> expectedAlleles = new ArrayList<Allele>();
- expectedAlleles.add(Aref);
-
- Set<Allele> genotypeAlleles = new HashSet<Allele>();
- for ( final Genotype g : expectedGC )
- genotypeAlleles.addAll(g.getAlleles());
- genotypeAlleles.remove(Aref);
-
- // ensure original allele order
- for (Allele allele: vc.getAlleles())
- if (genotypeAlleles.contains(allele))
- expectedAlleles.add(allele);
-
- Assert.assertEquals(sub.getAlleles(), expectedAlleles);
- } else {
- // not updating alleles -- should be the same
- Assert.assertEquals(sub.getAlleles(), vc.getAlleles());
- }
-
- // same sample names => success
- Assert.assertTrue(sub.getGenotypes().getSampleNames().equals(expectedGC.getSampleNames()));
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test sample name functions
- //
- // --------------------------------------------------------------------------------
- private class SampleNamesTest {
- List<String> sampleNames;
- List<String> sampleNamesInOrder;
-
- private SampleNamesTest(List<String> sampleNames, List<String> sampleNamesInOrder) {
- this.sampleNamesInOrder = sampleNamesInOrder;
- this.sampleNames = sampleNames;
- }
-
- public String toString() {
- return String.format("%s samples=%s order=%s", "SampleNamesTest", sampleNames, sampleNamesInOrder);
- }
- }
-
- @DataProvider(name = "SampleNamesTest")
- public Object[][] MakeSampleNamesTest() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1"), Arrays.asList("1"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "1"), Arrays.asList("1", "2"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1", "2"), Arrays.asList("1", "2"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("1", "2", "3"), Arrays.asList("1", "2", "3"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "1", "3"), Arrays.asList("1", "2", "3"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("2", "3", "1"), Arrays.asList("1", "2", "3"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("3", "1", "2"), Arrays.asList("1", "2", "3"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("3", "2", "1"), Arrays.asList("1", "2", "3"))});
- tests.add(new Object[]{new SampleNamesTest(Arrays.asList("NA2", "NA1"), Arrays.asList("NA1", "NA2"))});
-
- return tests.toArray(new Object[][]{});
- }
-
- private final static void assertGenotypesAreInOrder(Iterable<Genotype> gIt, List<String> names) {
- int i = 0;
- for ( final Genotype g : gIt ) {
- Assert.assertEquals(g.getSampleName(), names.get(i), "Unexpected genotype ordering");
- i++;
- }
- }
-
-
- @Test(dataProvider = "SampleNamesTest")
- public void runSampleNamesTest(SampleNamesTest cfg) {
- GenotypesContext gc = GenotypesContext.create(cfg.sampleNames.size());
- for ( final String name : cfg.sampleNames ) {
- gc.add(GenotypeBuilder.create(name, Arrays.asList(Aref, T)));
- }
-
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
-
- // same sample names => success
- Assert.assertTrue(vc.getSampleNames().equals(new HashSet<String>(cfg.sampleNames)), "vc.getSampleNames() = " + vc.getSampleNames());
- Assert.assertEquals(vc.getSampleNamesOrderedByName(), cfg.sampleNamesInOrder, "vc.getSampleNamesOrderedByName() = " + vc.getSampleNamesOrderedByName());
-
- assertGenotypesAreInOrder(vc.getGenotypesOrderedByName(), cfg.sampleNamesInOrder);
- assertGenotypesAreInOrder(vc.getGenotypesOrderedBy(cfg.sampleNames), cfg.sampleNames);
- }
-
- @Test
- public void testGenotypeCounting() {
- Genotype noCall = GenotypeBuilder.create("nocall", Arrays.asList(Allele.NO_CALL));
- Genotype mixed = GenotypeBuilder.create("mixed", Arrays.asList(Aref, Allele.NO_CALL));
- Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
- Genotype het = GenotypeBuilder.create("het", Arrays.asList(Aref, T));
- Genotype homVar = GenotypeBuilder.create("homVar", Arrays.asList(T, T));
-
- List<Genotype> allGenotypes = Arrays.asList(noCall, mixed, homRef, het, homVar);
- final int nCycles = allGenotypes.size() * 10;
-
- for ( int i = 0; i < nCycles; i++ ) {
- int nNoCall = 0, nNoCallAlleles = 0, nA = 0, nT = 0, nMixed = 0, nHomRef = 0, nHet = 0, nHomVar = 0;
- int nSamples = 0;
- GenotypesContext gc = GenotypesContext.create();
- for ( int j = 0; j < i; j++ ) {
- nSamples++;
- Genotype g = allGenotypes.get(j % allGenotypes.size());
- final String name = String.format("%s_%d%d", g.getSampleName(), i, j);
- gc.add(GenotypeBuilder.create(name, g.getAlleles()));
- switch ( g.getType() ) {
- case NO_CALL: nNoCall++; nNoCallAlleles++; break;
- case HOM_REF: nA += 2; nHomRef++; break;
- case HET: nA++; nT++; nHet++; break;
- case HOM_VAR: nT += 2; nHomVar++; break;
- case MIXED: nA++; nNoCallAlleles++; nMixed++; break;
- default: throw new RuntimeException("Unexpected genotype type " + g.getType());
- }
-
- }
-
- VariantContext vc = new VariantContextBuilder("genotypes", snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T)).genotypes(gc).make();
- Assert.assertEquals(vc.getNSamples(), nSamples);
- if ( nSamples > 0 ) {
- Assert.assertEquals(vc.isPolymorphicInSamples(), nT > 0);
- Assert.assertEquals(vc.isMonomorphicInSamples(), nT == 0);
- }
- Assert.assertEquals(vc.getCalledChrCount(), nA + nT);
-
- Assert.assertEquals(vc.getCalledChrCount(Allele.NO_CALL), nNoCallAlleles);
- Assert.assertEquals(vc.getCalledChrCount(Aref), nA);
- Assert.assertEquals(vc.getCalledChrCount(T), nT);
-
- Assert.assertEquals(vc.getNoCallCount(), nNoCall);
- Assert.assertEquals(vc.getHomRefCount(), nHomRef);
- Assert.assertEquals(vc.getHetCount(), nHet);
- Assert.assertEquals(vc.getHomVarCount(), nHomVar);
- Assert.assertEquals(vc.getMixedCount(), nMixed);
- }
- }
- @Test
- public void testSetAttribute() {
- VariantContextBuilder builder = new VariantContextBuilder();
- builder.attribute("Test", "value");
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test validation methods
- //
- // --------------------------------------------------------------------------------
-
- // create a VariantContext object for various alleles and genotypes to test against
- private VariantContext createTestVariantContext(final List<Allele> alleles, final Map<String, Object> attributes, final Genotype... genotypes) {
- final EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
- final Set<String> filters = null;
- final boolean fullyDecoded = false;
-
- // no genotypes needs to use GenotypesContext.NO_GENOTYPES,
- // otherwise we build up a GenotypesContext from the passed genotypes
- final GenotypesContext gc;
- if (genotypes == null || genotypes.length == 0) {
- gc = GenotypesContext.NO_GENOTYPES;
- } else {
- gc = new GenotypesContext();
- for (final Genotype genotype : genotypes) {
- gc.add(genotype);
- }
- }
- // most of the fields are not important to the tests, we just need alleles and gc set properly
- return new VariantContext("genotypes", VCFConstants.EMPTY_ID_FIELD, snpLoc, snpLocStart, snpLocStop, alleles,
- gc, VariantContext.NO_LOG10_PERROR, filters, attributes,
- fullyDecoded, toValidate);
- }
-
- // validateReferenceBases: PASS conditions
- @DataProvider
- public Object[][] testValidateReferencesBasesDataProvider() {
- final VariantContext vc = createValidateReferencesContext(Arrays.asList(Aref, T));
- return new Object[][]{
- // null ref will pass validation
- {vc, null, A},
- // A vs A-ref will pass validation
- {vc, Aref, A}
- };
- }
- @Test(dataProvider = "testValidateReferencesBasesDataProvider")
- public void testValidateReferenceBases(final VariantContext vc, final Allele allele1, final Allele allele2) {
- // validateReferenceBases throws exceptions if it fails, so no Asserts here...
- vc.validateReferenceBases(allele1, allele2);
- }
- // validateReferenceBases: FAIL conditions
- @DataProvider
- public Object[][] testValidateReferencesBasesFailureDataProvider() {
- final VariantContext vc = createValidateReferencesContext(Arrays.asList(Aref, T));
-
- final Allele symbolicAllele = Allele.create("<A>");
-
- return new Object[][]{
- // T vs A-ref will NOT pass validation
- {vc, Aref, T},
- // symbolic alleles will NOT pass validation
- {vc, Aref, symbolicAllele}
- };
- }
- @Test(dataProvider = "testValidateReferencesBasesFailureDataProvider", expectedExceptions = TribbleException.class)
- public void testValidateReferenceBasesFailure(final VariantContext vc, final Allele allele1, final Allele allele2) {
- // validateReferenceBases throws exceptions if it fails, so no Asserts here...
- vc.validateReferenceBases(allele1, allele2);
- }
- private VariantContext createValidateReferencesContext(final List<Allele> alleles) {
- return createTestVariantContext(alleles, null);
- }
-
-
- // validateRSIDs: PASS conditions
- @DataProvider
- public Object[][] testValidateRSIDsDataProvider() {
- final VariantContext vcNoId = createTestVariantContextRsIds(VCFConstants.EMPTY_ID_FIELD);
- final VariantContext vcNonRs = createTestVariantContextRsIds("abc456");
- final VariantContext vc = createTestVariantContextRsIds("rs123");
- final VariantContext vcMultipleRs = createTestVariantContextRsIds("rs123;rs456;rs789");
-
- return new Object[][]{
- // no ID will pass validation
- {vcNoId, makeRsIDsSet("rs123")},
- // non-rs ID will pass validation
- {vcNonRs, makeRsIDsSet("rs123")},
- // matching ID will pass validation
- {vc, makeRsIDsSet("rs123")},
- // null rsIDs to check will pass validation
- {vc, null},
- // context with multiple rsIDs that are contained within the rsID list will pass
- {vcMultipleRs, makeRsIDsSet("rs123", "rs321", "rs456", "rs654", "rs789")}
- };
- }
- @Test(dataProvider = "testValidateRSIDsDataProvider")
- public void testValidateRSIDs(final VariantContext vc, final Set<String> rsIDs) {
- // validateRSIDs throws exceptions if it fails, so no Asserts here...
- vc.validateRSIDs(rsIDs);
- }
- // validateRSIDs: FAIL conditions
- @DataProvider
- public Object[][] testValidateRSIDsFailureDataProvider() {
- final VariantContext vc = createTestVariantContextRsIds("rs123");
- final VariantContext vcMultipleRs = createTestVariantContextRsIds("rs123;rs456;rs789");
-
- return new Object[][]{
- // mismatching ID will fail validation
- {vc, makeRsIDsSet("rs123456")},
- // null rsIDs to check will pass validation
- {vcMultipleRs, makeRsIDsSet("rs456")}
- };
- }
- @Test(dataProvider = "testValidateRSIDsFailureDataProvider", expectedExceptions = TribbleException.class)
- public void testValidateRSIDsFailure(final VariantContext vc, final Set<String> rsIDs) {
- // validateRSIDs throws exceptions if it fails, so no Asserts here...
- vc.validateRSIDs(rsIDs);
- }
- // create a VariantContext appropriate for testing rsIDs
- private VariantContext createTestVariantContextRsIds(final String rsId) {
- final EnumSet<VariantContext.Validation> toValidate = EnumSet.noneOf(VariantContext.Validation.class);
- final Set<String> filters = null;
- final Map<String, Object> attributes = null;
- final boolean fullyDecoded = false;
-
- return new VariantContext("genotypes", rsId, snpLoc, snpLocStart, snpLocStop, Arrays.asList(Aref, T),
- GenotypesContext.NO_GENOTYPES, VariantContext.NO_LOG10_PERROR, filters, attributes,
- fullyDecoded, toValidate);
- }
- private Set<String> makeRsIDsSet(final String... rsIds) {
- return new HashSet<String>(Arrays.asList(rsIds));
- }
-
-
- // validateAlternateAlleles: PASS conditions
- @DataProvider
- public Object[][] testValidateAlternateAllelesDataProvider() {
- final Genotype homVarT = GenotypeBuilder.create("homVarT", Arrays.asList(T, T));
-
- // no genotypes passes validateAlternateAlleles
- final VariantContext vcNoGenotypes =
- // A-ref/T with no GT
- createValidateAlternateAllelesContext(Arrays.asList(Aref, T));
-
- // genotypes that match ALTs will pass
- final VariantContext vcHasGenotypes =
- // A-ref/T vs T/T
- createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homVarT);
-
- return new Object[][]{
- {vcNoGenotypes},
- {vcHasGenotypes}
- };
- }
- @Test(dataProvider = "testValidateAlternateAllelesDataProvider")
- public void testValidateAlternateAlleles(final VariantContext vc) {
- // validateAlternateAlleles throws exceptions if it fails, so no Asserts here...
- vc.validateAlternateAlleles();
- }
- // validateAlternateAlleles: FAIL conditions
- @DataProvider
- public Object[][] testValidateAlternateAllelesFailureDataProvider() {
- final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
- final Genotype homVarA = GenotypeBuilder.create("homVarA", Arrays.asList(A, A));
-
- // alts not observed in the genotypes will fail validation
- // this is the throw in VariantContext from: if ( reportedAlleles.size() != observedAlleles.size() )
- final VariantContext vcHasAltNotObservedInGT =
- // A-ref/T vs A-ref/A-ref
- createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homRef);
-
- // alts not observed in the genotypes will fail validation
- // but this time it is the second throw in VariantContext after: observedAlleles.retainAll(reportedAlleles);
- final VariantContext vcHasAltNotObservedInGTIntersection =
- // A-ref/T vs A/A
- createValidateAlternateAllelesContext(Arrays.asList(Aref, T), homVarA);
-
- return new Object[][]{
- {vcHasAltNotObservedInGT},
- {vcHasAltNotObservedInGTIntersection}
- };
- }
- @Test(dataProvider = "testValidateAlternateAllelesFailureDataProvider", expectedExceptions = TribbleException.class)
- public void testValidateAlternateAllelesFailure(final VariantContext vc) {
- // validateAlternateAlleles throws exceptions if it fails, so no Asserts here...
- vc.validateAlternateAlleles();
- }
- private VariantContext createValidateAlternateAllelesContext(final List<Allele> alleles, final Genotype... genotypes) {
- return createTestVariantContext(alleles, null, genotypes);
- }
-
-
-
- // validateChromosomeCounts: PASS conditions
- @DataProvider
- public Object[][] testValidateChromosomeCountsDataProvider() {
- final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
- final Genotype homVarT = GenotypeBuilder.create("homVarT", Arrays.asList(T, T));
- final Genotype hetVarTC = GenotypeBuilder.create("hetVarTC", Arrays.asList(T, C));
- final Genotype homRefNoCall = GenotypeBuilder.create("homRefNoCall", Arrays.asList(Aref, Allele.NO_CALL));
-
-
- // no genotypes passes validateChromosomeCounts
- final VariantContext vcNoGenotypes =
- // A-ref/T with no GT
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T), null);
-
- /** AN : total number of alleles in called genotypes **/
- // with AN set and hom-ref, we expect AN to be 2 for Aref/Aref
- final Map<String, Object> attributesAN = new HashMap<String, Object>();
- attributesAN.put(VCFConstants.ALLELE_NUMBER_KEY, "2");
- final VariantContext vcANSet =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesAN, homRef);
-
- // with AN set, one no-call (no-calls get ignored by getCalledChrCount() in VariantContext)
- // we expect AN to be 1 for Aref/no-call
- final Map<String, Object> attributesANNoCall = new HashMap<String, Object>();
- attributesANNoCall.put(VCFConstants.ALLELE_NUMBER_KEY, "1");
- final VariantContext vcANSetNoCall =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesANNoCall, homRefNoCall);
-
-
- /** AC : allele count in genotypes, for each ALT allele, in the same order as listed **/
- // with AC set, and T/T, we expect AC to be 2 (for 2 counts of ALT T)
- final Map<String, Object> attributesAC = new HashMap<String, Object>();
- attributesAC.put(VCFConstants.ALLELE_COUNT_KEY, "2");
- final VariantContext vcACSet =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T), attributesAC, homVarT);
-
- // with AC set and no ALT (GT is 0/0), we expect AC count to be 0
- final Map<String, Object> attributesACNoAlts = new HashMap<String, Object>();
- attributesACNoAlts.put(VCFConstants.ALLELE_COUNT_KEY, "0");
- final VariantContext vcACSetNoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesACNoAlts, homRef);
-
- // with AC set, and two different ALTs (T and C), with GT of 1/2, we expect a count of 1 for each.
- // With two ALTs, a list is expected, so we set the attribute as a list of 1,1
- final Map<String, Object> attributesACTwoAlts = new HashMap<String, Object>();
- attributesACTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "1"));
- final VariantContext vcACSetTwoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAlts, hetVarTC);
-
- // with AC set, and two different ALTs (T and C), with no GT, we expect a 2 count values.
- final Map<String, Object> attributesACNoGtTwoAlts = new HashMap<String, Object>();
- attributesACNoGtTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "1"));
- final VariantContext vcACNoGtSetTwoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACNoGtTwoAlts, null);
-
- // with AF set, and two different ALTs (T and C), with GT of 1/2, we expect two frequncy values.
- // With two ALTs, a list is expected, so we set the attribute as a list of 0.5,0.5
- final Map<String, Object> attributesAFTwoAlts = new HashMap<String, Object>();
- attributesAFTwoAlts.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5", "0.5"));
- final VariantContext vcAFSetTwoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFTwoAlts, hetVarTC);
-
- // with AF set, and two different ALTs (T and C), with no GT, we expect two frequency values.
- final Map<String, Object> attributesAFNoGtTwoAlts = new HashMap<String, Object>();
- attributesAFNoGtTwoAlts.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5", "0.5"));
- final VariantContext vcAFNoGtSetTwoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFNoGtTwoAlts, null);
-
- return new Object[][]{
- {vcNoGenotypes},
- {vcANSet},
- {vcANSetNoCall},
- {vcACSet},
- {vcACSetNoAlts},
- {vcACNoGtSetTwoAlts},
- {vcAFSetTwoAlts},
- {vcAFNoGtSetTwoAlts}
- };
- }
- @Test(dataProvider = "testValidateChromosomeCountsDataProvider")
- public void testValidateChromosomeCounts(final VariantContext vc) {
- // validateChromosomeCounts throws exceptions if it fails, so no Asserts here...
- vc.validateChromosomeCounts();
- }
- // validateChromosomeCounts: FAIL conditions
- @DataProvider
- public Object[][] testValidateChromosomeCountsFailureDataProvider() {
- final Genotype homRef = GenotypeBuilder.create("homRef", Arrays.asList(Aref, Aref));
- final Genotype hetVarTC = GenotypeBuilder.create("hetVarTC", Arrays.asList(T, C));
- final Genotype homRefNoCall = GenotypeBuilder.create("homRefNoCall", Arrays.asList(Aref, Allele.NO_CALL));
-
- /** AN : total number of alleles in called genotypes **/
- // with AN set and hom-ref, we expect AN to be 2 for Aref/Aref, so 3 will fail
- final Map<String, Object> attributesAN = new HashMap<String, Object>();
- attributesAN.put(VCFConstants.ALLELE_NUMBER_KEY, "3");
- final VariantContext vcANSet =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesAN, homRef);
-
- // with AN set, one no-call (no-calls get ignored by getCalledChrCount() in VariantContext)
- // we expect AN to be 1 for Aref/no-call, so 2 will fail
- final Map<String, Object> attributesANNoCall = new HashMap<String, Object>();
- attributesANNoCall.put(VCFConstants.ALLELE_NUMBER_KEY, "2");
- final VariantContext vcANSetNoCall =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesANNoCall, homRefNoCall);
-
- /** AC : allele count in genotypes, for each ALT allele, in the same order as listed **/
- // with AC set but no ALTs, we expect a count of 0, so the wrong count will fail here
- final Map<String, Object> attributesACWrongCount = new HashMap<String, Object>();
- attributesACWrongCount.put(VCFConstants.ALLELE_COUNT_KEY, "2");
- final VariantContext vcACWrongCount =
- createValidateChromosomeCountsContext(Arrays.asList(Aref), attributesACWrongCount, homRef);
-
- // with AC set, two ALTs, but AC is not a list with count for each ALT
- final Map<String, Object> attributesACTwoAlts = new HashMap<String, Object>();
- attributesACTwoAlts.put(VCFConstants.ALLELE_COUNT_KEY, "1");
- final VariantContext vcACSetTwoAlts =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAlts, hetVarTC);
-
- // with AC set, two ALTs, and a list is correctly used, but wrong counts (we expect counts to be 1,1)
- final Map<String, Object> attributesACTwoAltsWrongCount = new HashMap<String, Object>();
- attributesACTwoAltsWrongCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1", "2"));
- final VariantContext vcACSetTwoAltsWrongCount =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAltsWrongCount, hetVarTC);
-
- // with AC set, two ALTs, but only count for one ALT (we expect two items in the list: 1,1)
- final Map<String, Object> attributesACTwoAltsOneAltCount = new HashMap<String, Object>();
- attributesACTwoAltsOneAltCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1"));
- final VariantContext vcACSetTwoAltsOneAltCount =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACTwoAltsOneAltCount, hetVarTC);
-
- // with AC set, no GT, two ALTs, but only count for one ALT (we expect two items in the list: 1,1)
- final Map<String, Object> attributesACNoGtTwoAltsOneAltCount = new HashMap<String, Object>();
- attributesACNoGtTwoAltsOneAltCount.put(VCFConstants.ALLELE_COUNT_KEY, Arrays.asList("1"));
- final VariantContext vcACNoGtSetTwoAltsOneAltCount =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesACNoGtTwoAltsOneAltCount, null);
-
- // with AF set, two ALTs, but only frequency for one ALT (we expect two items in the list
- final Map<String, Object> attributesAFTwoAltsWrongFreq = new HashMap<String, Object>();
- attributesAFTwoAltsWrongFreq.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5"));
- final VariantContext vcAFSetTwoAltsWrongFreq =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFTwoAltsWrongFreq, hetVarTC);
-
- // with AF set, no GT, two ALTs, but only frequency for one ALT (we expect two items in the list
- final Map<String, Object> attributesAFNoGtTwoAltsWrongCount = new HashMap<String, Object>();
- attributesAFNoGtTwoAltsWrongCount.put(VCFConstants.ALLELE_FREQUENCY_KEY, Arrays.asList("0.5"));
- final VariantContext vcAFNoGtSetTwoAltsWrongFreq =
- createValidateChromosomeCountsContext(Arrays.asList(Aref, T, C), attributesAFNoGtTwoAltsWrongCount, null);
-
- return new Object[][]{
- {vcANSet},
- {vcANSetNoCall},
- {vcACWrongCount},
- {vcACSetTwoAlts},
- {vcACSetTwoAltsWrongCount},
- {vcACSetTwoAltsOneAltCount},
- {vcACNoGtSetTwoAltsOneAltCount},
- {vcAFSetTwoAltsWrongFreq},
- {vcAFNoGtSetTwoAltsWrongFreq}
- };
- }
- @Test(dataProvider = "testValidateChromosomeCountsFailureDataProvider", expectedExceptions = TribbleException.class)
- public void testValidateChromosomeCountsFailure(final VariantContext vc) {
- // validateChromosomeCounts throws exceptions if it fails, so no Asserts here...
- vc.validateChromosomeCounts();
- }
- private VariantContext createValidateChromosomeCountsContext(final List<Allele> alleles, final Map<String, Object> attributes, final Genotype... genotypes) {
- return createTestVariantContext(alleles, attributes, genotypes);
- }
-
-
- // the extraStrictValidation method calls the other validation methods
- @DataProvider
- public Object[][] testExtraStrictValidationDataProvider() {
- // get the data providers for each of the passing tests of the individual methods
- final Object[][] passingValidateReferenceBasesData = testValidateReferencesBasesDataProvider();
- final Object[][] passingValidateRSIDsData = testValidateRSIDsDataProvider();
- final Object[][] passingValidateAlternateAllelesData = testValidateAlternateAllelesDataProvider();
- final Object[][] passingValidateChromosomeCountsData = testValidateChromosomeCountsDataProvider();
-
- // the total number of tests we will run here is the sum of each of the test cases
- final int numDataPoints =
- passingValidateReferenceBasesData.length +
- passingValidateRSIDsData.length +
- passingValidateAlternateAllelesData.length +
- passingValidateChromosomeCountsData.length;
-
- // create the data provider structure for this extra strict test
- final Object[][] extraStrictData = new Object[numDataPoints][];
-
- int testNum = 0;
- for (final Object[] testRefBases : passingValidateReferenceBasesData) {
- final VariantContext vc = (VariantContext) testRefBases[0];
- final Allele refAllele = (Allele) testRefBases[1];
- final Allele allele = (Allele) testRefBases[2];
-
- // for this test, rsIds does not matter, so we hold it constant
- extraStrictData[testNum++] = new Object[]{vc, refAllele, allele, null};
- }
-
- for (final Object[] testRsIDs : passingValidateRSIDsData) {
- final VariantContext vc = (VariantContext) testRsIDs[0];
- final Set<String> rsIDs = (Set<String>) testRsIDs[1];
-
- // for this test, reportedReference and observedReference does not matter,
- // so we hold it constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, rsIDs};
- }
-
- for (final Object[] testAlternateAlleles : passingValidateAlternateAllelesData) {
- final VariantContext vc = (VariantContext) testAlternateAlleles[0];
-
- // for this test, only VariantContext is used, so we hold
- // reportedReference, observedReference and rsIds constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
- }
-
- for (final Object[] testChromomeCounts : passingValidateChromosomeCountsData) {
- final VariantContext vc = (VariantContext) testChromomeCounts[0];
-
- // for this test, only VariantContext is used, so we hold
- // reportedReference, observedReference and rsIds constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
- }
-
- return extraStrictData;
- }
-
- @DataProvider(name = "serializationTestData")
- public Object[][] getSerializationTestData() {
- return new Object[][] {
- { new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf"), new VCFCodec() },
- { new File("src/test/resources/htsjdk/variant/serialization_test.bcf"), new BCF2Codec() }
- };
- }
-
- @Test(dataProvider = "serializationTestData")
- public void testSerialization( final File testFile, final FeatureCodec<VariantContext, ?> codec ) throws Exception {
- final AbstractFeatureReader<VariantContext, ?> featureReader = AbstractFeatureReader.getFeatureReader(testFile.getAbsolutePath(), codec, false);
- final VariantContext initialVC = featureReader.iterator().next();
-
- final VariantContext vcDeserialized = TestUtil.serializeAndDeserialize(initialVC);
-
- assertVariantContextsAreEqual(vcDeserialized, initialVC);
- }
-
- @Test(dataProvider = "testExtraStrictValidationDataProvider")
- public void testExtraStrictValidation(final VariantContext vc, final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
- // extraStrictValidation throws exceptions if it fails, so no Asserts here...
- vc.extraStrictValidation(reportedReference, observedReference, rsIDs);
- }
- @DataProvider
- public Object[][] testExtraStrictValidationFailureDataProvider() {
- // get the data providers for each of the failure tests of the individual methods
- final Object[][] failingValidateReferenceBasesData = testValidateReferencesBasesFailureDataProvider();
- final Object[][] failingValidateRSIDsData = testValidateRSIDsFailureDataProvider();
- final Object[][] failingValidateAlternateAllelesData = testValidateAlternateAllelesFailureDataProvider();
- final Object[][] failingValidateChromosomeCountsData = testValidateChromosomeCountsFailureDataProvider();
-
- // the total number of tests we will run here is the sum of each of the test cases
- final int numDataPoints =
- failingValidateReferenceBasesData.length +
- failingValidateRSIDsData.length +
- failingValidateAlternateAllelesData.length +
- failingValidateChromosomeCountsData.length;
-
- // create the data provider structure for this extra strict test
- final Object[][] extraStrictData = new Object[numDataPoints][];
-
- int testNum = 0;
- for (final Object[] testRefBases : failingValidateReferenceBasesData) {
- final VariantContext vc = (VariantContext) testRefBases[0];
- final Allele refAllele = (Allele) testRefBases[1];
- final Allele allele = (Allele) testRefBases[2];
-
- // for this test, rsIds does not matter, so we hold it constant
- extraStrictData[testNum++] = new Object[]{vc, refAllele, allele, null};
- }
-
- for (final Object[] testRsIDs : failingValidateRSIDsData) {
- final VariantContext vc = (VariantContext) testRsIDs[0];
- final Set<String> rsIDs = (Set<String>) testRsIDs[1];
-
- // for this test, reportedReference and observedReference does not matter,
- // so we hold it constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, rsIDs};
- }
-
- for (final Object[] testAlternateAlleles : failingValidateAlternateAllelesData) {
- final VariantContext vc = (VariantContext) testAlternateAlleles[0];
-
- // for this test, only VariantContext is used, so we hold
- // reportedReference, observedReference and rsIds constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
- }
-
- for (final Object[] testChromomeCounts : failingValidateChromosomeCountsData) {
- final VariantContext vc = (VariantContext) testChromomeCounts[0];
-
- // for this test, only VariantContext is used, so we hold
- // reportedReference, observedReference and rsIds constant
- extraStrictData[testNum++] = new Object[]{vc, Tref, T, null};
- }
-
- return extraStrictData;
- }
- @Test(dataProvider = "testExtraStrictValidationFailureDataProvider", expectedExceptions = TribbleException.class)
- public void testExtraStrictValidationFailure(final VariantContext vc, final Allele reportedReference, final Allele observedReference, final Set<String> rsIDs) {
- // extraStrictValidation throws exceptions if it fails, so no Asserts here...
- vc.extraStrictValidation(reportedReference, observedReference, rsIDs);
- }
-
-
- @DataProvider(name = "structuralVariationsTestData")
- public Object[][] getStructuralVariationsTestData() {
- return new Object[][] {
- {new File("src/test/resources/htsjdk/variant/structuralvariants.vcf")}
- };
- }
-
- @Test(dataProvider = "structuralVariationsTestData")
- public void testExtractStructuralVariationsData(final File vcfFile) {
- VCFFileReader reader = null;
- CloseableIterator<VariantContext> iter = null;
- try {
- reader = new VCFFileReader(vcfFile , false );
- iter = reader.iterator();
- while(iter.hasNext()) {
- final VariantContext ctx = iter.next();
- final StructuralVariantType st = ctx.getStructuralVariantType();
- Assert.assertNotNull(st);
- }
- } finally {
- CloserUtil.close(iter);
- CloserUtil.close(reader);
- }
- }
-
- @Test
- public void testGetAttributeAsIntList() {
- final VariantContext context = basicBuilder
- .attribute("Empty", new int[0])
- .attribute("DefaultIntegerList", new int[5])
- .attribute("ListWithMissing", new Object[]{1, null, null})
- .attribute("IntegerList", new int[]{0, 1, 2, 3})
- .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
- .attribute("StringList", new String[]{"1", "2"})
- .attribute("NotNumeric", new String[]{"A", "B"})
- .make();
- // test an empty value
- Assert.assertTrue(context.getAttributeAsIntList("Empty", 5).isEmpty());
- // test as integer
- Assert.assertEquals(context.getAttributeAsIntList("DefaultIntegerList", 5), Arrays.asList(0, 0, 0, 0, 0));
- Assert.assertEquals(context.getAttributeAsIntList("ListWithMissing", 5), Arrays.asList(1, 5, 5));
- Assert.assertEquals(context.getAttributeAsIntList("IntegerList", 5), Arrays.asList(0, 1, 2, 3));
- Assert.assertEquals(context.getAttributeAsIntList("DoubleList", 5), Arrays.asList(1, 1, 2));
- Assert.assertEquals(context.getAttributeAsIntList("StringList", 5), Arrays.asList(1, 2));
- Assert.assertThrows(() -> context.getAttributeAsIntList("NotNumeric", 5));
- // test the case of a missing key
- Assert.assertTrue(context.getAttributeAsIntList("MissingList", 5).isEmpty());
- }
-
- @Test
- public void testGetAttributeAsDoubleList() {
- final VariantContext context = basicBuilder
- .attribute("Empty", new int[0])
- .attribute("DefaultIntegerList", new int[5])
- .attribute("ListWithMissing", new Object[]{1, null, null})
- .attribute("IntegerList", new int[]{0, 1, 2, 3})
- .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
- .attribute("StringList", new String[]{"1", "2"})
- .attribute("NotNumeric", new String[]{"A", "B"})
- .make();
- // test an empty value
- Assert.assertTrue(context.getAttributeAsDoubleList("Empty", 5).isEmpty());
- // test as double
- Assert.assertEquals(context.getAttributeAsDoubleList("DefaultIntegerList", 5), Arrays.asList(0d, 0d, 0d, 0d, 0d));
- Assert.assertEquals(context.getAttributeAsDoubleList("ListWithMissing", 5), Arrays.asList(1d, 5d, 5d));
- Assert.assertEquals(context.getAttributeAsDoubleList("IntegerList", 5), Arrays.asList(0d, 1d, 2d, 3d));
- Assert.assertEquals(context.getAttributeAsDoubleList("DoubleList", 5), Arrays.asList(1.8, 1.6, 2.1));
- Assert.assertEquals(context.getAttributeAsDoubleList("StringList", 5), Arrays.asList(1d, 2d));
- Assert.assertThrows(() -> context.getAttributeAsDoubleList("NotNumeric", 5));
- // test the case of a missing key
- Assert.assertTrue(context.getAttributeAsDoubleList("MissingList", 5).isEmpty());
- }
-
- @Test
- public void testGetAttributeAsStringList() {
- final VariantContext context = basicBuilder
- .attribute("Empty", new int[0])
- .attribute("DefaultIntegerList", new int[5])
- .attribute("ListWithMissing", new Object[]{1, null, null})
- .attribute("IntegerList", new int[]{0, 1, 2, 3})
- .attribute("DoubleList", new double[]{1.8, 1.6, 2.1})
- .attribute("StringList", new String[]{"1", "2"})
- .attribute("NotNumeric", new String[]{"A", "B"})
- .make();
- // test an empty value
- Assert.assertTrue(context.getAttributeAsStringList("Empty", "empty").isEmpty());
- // test as string
- Assert.assertEquals(context.getAttributeAsStringList("DefaultIntegerList", "empty"), Arrays.asList("0", "0", "0", "0", "0"));
- Assert.assertEquals(context.getAttributeAsStringList("ListWithMissing", "empty"), Arrays.asList("1", "empty", "empty"));
- Assert.assertEquals(context.getAttributeAsStringList("IntegerList", "empty"), Arrays.asList("0", "1", "2", "3"));
- Assert.assertEquals(context.getAttributeAsStringList("DoubleList", "empty"), Arrays.asList("1.8", "1.6", "2.1"));
- Assert.assertEquals(context.getAttributeAsStringList("StringList", "empty"), Arrays.asList("1", "2"));
- Assert.assertEquals(context.getAttributeAsStringList("NotNumeric", "empty"), Arrays.asList("A", "B"));
- // test the case of a missing key
- Assert.assertTrue(context.getAttributeAsStringList("MissingList", "empty").isEmpty());
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java
deleted file mode 100644
index 78bf565..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/VariantJEXLContextUnitTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext;
-
-import htsjdk.tribble.SimpleFeature;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContextUtils.JexlVCMatchExp;
-
-import htsjdk.variant.vcf.VCFConstants;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.*;
-
-
-/**
- *
- * @author aaron
- * @author bimber
- * @author hyq
- *
- *
- * Test out parts of the VariantJEXLContext and GenotypeJEXLContext
- */
-public class VariantJEXLContextUnitTest extends VariantBaseTest {
-
- private static final VariantContextUtils.JexlVCMatchExp exp
- = new VariantContextUtils.JexlVCMatchExp("name", VariantContextUtils.engine.get().createExpression("QUAL > 500.0"));
-
- private static final JexlVCMatchExp missingValueExpression = new VariantContextUtils.JexlVCMatchExp(
- "Zis10", VariantContextUtils.engine.get().createExpression("Z==10"));
-
-
- // SNP alleles: A[ref]/T[alt] at chr1:10. One (crappy) sample, one (bare minimum) VC.
- private static final SimpleFeature eventLoc = new SimpleFeature("chr1", 10, 10);
- private static final Allele Aref = Allele.create("A", true);
- private static final Allele Talt = Allele.create("T");
- private static final Genotype gt = new GenotypeBuilder("DummySample", Arrays.asList(Aref, Talt))
- .phased(false)
- .DP(2)
- .noGQ()
- .noAD()
- .noPL()
- .filter("lowDP")
- .attribute("WA", "whatEver")
- .make();
- private static final VariantContext vc = new VariantContextBuilder("test", eventLoc.getContig(), eventLoc.getStart(), eventLoc.getEnd(), Arrays.asList(Aref, Talt))
- .genotypes(gt)
- .noID()
- .filter("q10")
- .attribute("attr", "notEmpty")
- .make();
-
- //////////////////////// testing JEXLMap ////////////////////////
- @Test
- public void testGetValue() {
- final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 1);
-
- // eval our known expression
- Assert.assertTrue(!jexlMap.get(exp));
- }
-
- @Test(dataProvider = "getMissingValueTestData")
- public void testMissingBehaviorThroughMatch(VariantContext vc, JexlMissingValueTreatment missingValueTreatment, boolean expected, Class<? extends Exception> expectedException){
- if(expectedException == null) {
- Assert.assertEquals(VariantContextUtils.match(vc, null, missingValueExpression, missingValueTreatment), expected);
- } else {
- Assert.assertThrows(expectedException, () -> VariantContextUtils.match(vc, null, missingValueExpression, missingValueTreatment));
- }
- }
-
- @Test(dataProvider = "getMissingValueTestData")
- public void testMissingBehavior(VariantContext vc, JexlMissingValueTreatment missingValueTreatment, boolean expected, Class<? extends Exception> expectedException){
- final JEXLMap jexlMap = new JEXLMap(Collections.singletonList(missingValueExpression), vc, null, missingValueTreatment);
- if(expectedException == null) {
- Assert.assertEquals((boolean) jexlMap.get(missingValueExpression), expected);
- } else {
- Assert.assertThrows(expectedException, () -> jexlMap.get(missingValueExpression));
- }
- }
-
- @DataProvider
- public Object[][] getMissingValueTestData(){
- final List<Allele> alleles = Arrays.asList(Aref, Talt);
- VariantContextBuilder vcb = new VariantContextBuilder("test", "chr1", 10, 10, alleles);
- VariantContext noZ = vcb.make();
- VariantContext hasZ = vcb.attribute("Z", 0).make();
-
- return new Object[][]{
- {noZ, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT, false, null},
- {hasZ, JEXLMap.DEFAULT_MISSING_VALUE_TREATMENT, false, null}, //the value isn't missing but the expression is false
- {noZ, JexlMissingValueTreatment.TREAT_AS_MATCH, true, null},
- {hasZ, JexlMissingValueTreatment.TREAT_AS_MATCH, false, null}, //the value isn't missing but the expression is false
- {noZ, JexlMissingValueTreatment.TREAT_AS_MISMATCH, false, null},
- {hasZ, JexlMissingValueTreatment.TREAT_AS_MISMATCH, false, null},
- {noZ, JexlMissingValueTreatment.THROW, false, IllegalArgumentException.class},
- {hasZ, JexlMissingValueTreatment.THROW, false, null}
- };
- }
-
- // Testing the new 'FT' and 'isPassFT' expressions in the JEXL map
- @Test
- public void testJEXLGenotypeFilters() {
-
- final JexlVCMatchExp passFlag = new VariantContextUtils.JexlVCMatchExp(
- "passFlag", VariantContextUtils.engine.get().createExpression("isPassFT==1"));
- final JexlVCMatchExp passFT = new VariantContextUtils.JexlVCMatchExp(
- "FTPASS", VariantContextUtils.engine.get().createExpression("FT==\"PASS\""));
- final JexlVCMatchExp failFT = new VariantContextUtils.JexlVCMatchExp(
- "FTBadCall", VariantContextUtils.engine.get().createExpression("FT==\"BadCall\""));
- final JexlVCMatchExp AD1 = new VariantContextUtils.JexlVCMatchExp(
- "AD1", VariantContextUtils.engine.get().createExpression("g.hasAD() && g.getAD().0==1"));
- final JexlVCMatchExp AD2 = new VariantContextUtils.JexlVCMatchExp(
- "AD2", VariantContextUtils.engine.get().createExpression("g.hasAD() && g.getAD().1==2"));
-
- final List<JexlVCMatchExp> jexlTests = Arrays.asList(passFlag, passFT, failFT, AD1, AD2);
-
- final List<Allele> alleles = Arrays.asList(Aref, Talt);
- final VariantContextBuilder vcb = new VariantContextBuilder("test", "chr1", 10, 10, alleles);
- final VariantContext vcPass = vcb.filters("PASS").make();
- final VariantContext vcFail = vcb.filters("BadVariant").make();
- final GenotypeBuilder gb = new GenotypeBuilder("SAMPLE", alleles);
-
- final Genotype genoNull = gb.make();
- final Genotype genoPass = gb.filters("PASS").AD(new int[]{1,2}).DP(3).make();
- final Genotype genoFail = gb.filters("BadCall").AD(null).DP(0).make();
-
- Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap;
-
- // Create the JEXL Maps using the combinations above of vc* and geno*
- jexlMap = new JEXLMap(jexlTests, vcPass, genoPass);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertTrue(jexlMap.get(passFlag));
- Assert.assertTrue(jexlMap.get(passFT));
- Assert.assertFalse(jexlMap.get(failFT));
- Assert.assertTrue(jexlMap.get(AD1));
- Assert.assertTrue(jexlMap.get(AD2));
-
- jexlMap = new JEXLMap(jexlTests, vcPass, genoFail);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertFalse(jexlMap.get(passFlag));
- Assert.assertFalse(jexlMap.get(passFT));
- Assert.assertTrue(jexlMap.get(failFT));
- Assert.assertFalse(jexlMap.get(AD1));
- Assert.assertFalse(jexlMap.get(AD2));
-
- // Null genotype filter is equivalent to explicit "FT==PASS"
- jexlMap = new JEXLMap(jexlTests, vcPass, genoNull);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertTrue(jexlMap.get(passFlag));
- Assert.assertTrue(jexlMap.get(passFT));
- Assert.assertFalse(jexlMap.get(failFT));
- Assert.assertFalse(jexlMap.get(AD1));
- Assert.assertFalse(jexlMap.get(AD2));
-
- // Variant-level filters should have no effect here
- jexlMap = new JEXLMap(jexlTests, vcFail, genoPass);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertTrue(jexlMap.get(passFlag));
- Assert.assertTrue(jexlMap.get(passFT));
- Assert.assertFalse(jexlMap.get(failFT));
-
- jexlMap = new JEXLMap(jexlTests, vcFail, genoFail);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertFalse(jexlMap.get(passFlag));
- Assert.assertFalse(jexlMap.get(passFT));
- Assert.assertTrue(jexlMap.get(failFT));
-
- jexlMap = new JEXLMap(jexlTests, vcFail, genoNull);
- // make sure the context has a value
- Assert.assertTrue(!jexlMap.isEmpty());
- Assert.assertEquals(jexlMap.size(), 5);
- Assert.assertTrue(jexlMap.get(passFlag));
- Assert.assertTrue(jexlMap.get(passFT));
- Assert.assertFalse(jexlMap.get(failFT));
- }
-
- @Test(expectedExceptions=UnsupportedOperationException.class)
- public void testContainsValue() {
- final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
- jexlMap.containsValue(exp);
- }
-
- @Test(expectedExceptions=UnsupportedOperationException.class)
- public void testRemove() {
- final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
- jexlMap.remove(exp);
- }
-
- @Test(expectedExceptions=UnsupportedOperationException.class)
- public void testEntrySet() {
- final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
- jexlMap.entrySet();
- }
-
- @Test(expectedExceptions=UnsupportedOperationException.class)
- public void testClear() {
- final Map<VariantContextUtils.JexlVCMatchExp, Boolean> jexlMap = getJEXLMap();
-
- jexlMap.clear();
- }
-
- /**
- * @return a JEXLMap for use by actual tests
- */
- private JEXLMap getJEXLMap() {
- return new JEXLMap(Collections.singletonList(exp), vc);
- }
-
- //////////////////////// testing GenotypeJEXLContext and its base VariantJEXLContext ////////////////////////
-
- /**
- * Test the various if-else cases in {@link GenotypeJEXLContext#get(String)} and {@link VariantJEXLContext#get(String)}
- * {@link GenotypeJEXLContext#has(String)} is not tested because it simply checks if get() will return null.
- */
- @Test
- public void testVariantJEXLContextGetMethod() {
-
- final VariantJEXLContext jEXLContext = getJEXLContext();
-
- // This is not tested because there's no simple test for equality for VariantContext,
- // except exhaustive attributes testing, which is what happening below.
-// Assert.assertEquals(jEXLContext.get("vc"), new VariantContextBuilder("test", "chr1", 10, 10, Arrays.asList(Aref, Talt)).make());
-
- // GenotypeJEXLContext
- Assert.assertTrue( ((Genotype) jEXLContext.get("g")).sameGenotype(gt, false));
- Assert.assertEquals(jEXLContext.get("isHom"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get("isHomRef"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get("isHomVar"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get("isHet"), VariantJEXLContext.true_string);
- Assert.assertEquals(jEXLContext.get("isCalled"), VariantJEXLContext.true_string);
- Assert.assertEquals(jEXLContext.get("isNoCall"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get("isMixed"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get("isAvailable"), VariantJEXLContext.true_string);
- Assert.assertEquals(jEXLContext.get("isPassFT"), VariantJEXLContext.false_string);
- Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_KEY), gt.getGenotypeString());
- Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_FILTER_KEY),"lowDP");
- Assert.assertEquals(jEXLContext.get(VCFConstants.GENOTYPE_QUALITY_KEY),Integer.valueOf(VCFConstants.MISSING_GENOTYPE_QUALITY_v3));
- Assert.assertEquals(jEXLContext.get("WA"),"whatEver"); // hasAnyAttribute->getAnyAttribute
- Assert.assertEquals(jEXLContext.get("lowDP"),VariantJEXLContext.true_string); // getFilters()!=null
-
- // VariantJEXLContext
- Assert.assertEquals(jEXLContext.get("CHROM"), eventLoc.getContig());
- Assert.assertEquals(jEXLContext.get("POS"), eventLoc.getStart());
- Assert.assertEquals(jEXLContext.get("TYPE"), VariantContext.Type.SNP.name());
- Assert.assertEquals(jEXLContext.get("QUAL"), -10.0); // because of noGQ() when building the genotype
- Assert.assertEquals(jEXLContext.get("ALLELES"), vc.getAlleles());
- Assert.assertEquals(jEXLContext.get("N_ALLELES"), vc.getNAlleles());
- Assert.assertEquals(jEXLContext.get("FILTER"), VariantJEXLContext.true_string);
- Assert.assertEquals(jEXLContext.get("homRefCount"), 0);
- Assert.assertEquals(jEXLContext.get("homVarCount"), 0);
- Assert.assertEquals(jEXLContext.get("hetCount"), 1);
- Assert.assertEquals(jEXLContext.get("attr"), "notEmpty"); // hasAnyAttribute->getAnyAttribute
- Assert.assertEquals(jEXLContext.get("q10"), VariantJEXLContext.true_string); // getFilters()!=null
-
- // all if-else fall through
- Assert.assertNull(jEXLContext.get("mustBeNull"));
- }
-
- @Test(expectedExceptions=UnsupportedOperationException.class)
- public void testVariantJEXLContextSetMethodException(){
- getJEXLContext().set("noMatterWhat", "willBlowup");
- }
-
- /**
- * @return a GenotypeJEXLContext for use by actual tests
- */
- private VariantJEXLContext getJEXLContext(){
- return new GenotypeJEXLContext(vc, gt);
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java b/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java
deleted file mode 100644
index d62e146..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/AllFailFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A trivial filter (always false) that can be used in testing
- *
- * @author Yossi Farjoun
- */
-public class AllFailFilter implements VariantContextFilter {
-
- /* @return false so that all VCs are filtered out. */
- @Override
- public boolean test(final VariantContext record) {
-
- return false;
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java b/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java
deleted file mode 100644
index b29aa51..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/AllPassFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-
-/**
- * A trivial filter (always true) that can be used in testing
- *
- * @author Yossi Farjoun
- */
-public class AllPassFilter implements VariantContextFilter {
-
- /* @return true so that all VCs are kept. */
- @Override
- public boolean test(final VariantContext record) {
-
- return true;
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java
deleted file mode 100644
index 0a49853..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/CompoundFilterTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/9/15.
- */
-public class CompoundFilterTest {
-
- static AllPassFilter pass = new AllPassFilter();
- static AllFailFilter fail = new AllFailFilter();
-
- static Allele refA = Allele.create("A", true);
- static Allele G = Allele.create("G", false);
-
- static VariantContext vc = new VariantContextBuilder("dummy", "chr1", 1, 1, Arrays.asList(refA, G)).make();
-
- @DataProvider
- Iterator<Object[]> testCompoundFilterProvider() {
- final List<Object[]> filters = new ArrayList<Object[]>(10);
-
- // requireAll = TRUE
- { // all pass
- final CompoundFilter compoundFilter = new CompoundFilter(true);
- compoundFilter.add(pass);
- compoundFilter.add(pass);
- compoundFilter.add(pass);
- filters.add(new Object[]{compoundFilter, true});
- }
- { // one fail
- final CompoundFilter compoundFilter = new CompoundFilter(true);
- compoundFilter.add(pass);
- compoundFilter.add(fail);
- compoundFilter.add(pass);
- filters.add(new Object[]{compoundFilter, false});
- }
- { // empty
- final CompoundFilter compoundFilter = new CompoundFilter(true);
- filters.add(new Object[]{compoundFilter, true});
- }
-
- //requireAll = FALSE
- { // all fail
- final CompoundFilter compoundFilter = new CompoundFilter(false);
- compoundFilter.add(fail);
- compoundFilter.add(fail);
- compoundFilter.add(fail);
- filters.add(new Object[]{compoundFilter, false});
- }
- { // one fail
- final CompoundFilter compoundFilter = new CompoundFilter(false);
- compoundFilter.add(pass);
- compoundFilter.add(fail);
- compoundFilter.add(pass);
- filters.add(new Object[]{compoundFilter, true});
- }
- { // empty
- final CompoundFilter compoundFilter = new CompoundFilter(false);
- filters.add(new Object[]{compoundFilter, true});
- }
- return filters.iterator();
- }
-
- @Test(dataProvider = "testCompoundFilterProvider")
- public void testCompoundFilter(final VariantContextFilter filter, final boolean shouldPass) {
- Assert.assertEquals(filter.test(vc), shouldPass, filter.toString());
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java
deleted file mode 100644
index d8decfd..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/FilteringVariantContextIteratorTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCFFileReader;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-/**
- * Tests for testing the (VariantContext)FilteringVariantContextIterator, and the HeterozygosityFilter
- */
-
-public class FilteringVariantContextIteratorTest {
- final File testDir = new File("src/test/resources/htsjdk/variant");
-
- @DataProvider
- public Object [][] filteringIteratorData() {
- return new Object[][] {
- {new HeterozygosityFilter(true, "NA00001"), 2},
- {new HeterozygosityFilter(false, "NA00001"), 3},
- {new HeterozygosityFilter(true, null), 2},
- {new HeterozygosityFilter(false, null), 3},
- {new AllPassFilter(), 5},
- {new HeterozygosityFilter(true, "NA00002"), 4},
- {new HeterozygosityFilter(false, "NA00002"), 1},
- };
- }
-
- @Test(dataProvider = "filteringIteratorData")
- public void testFilteringIterator(final VariantContextFilter filter, final int expectedCount) {
-
- final File vcf = new File(testDir,"ex2.vcf");
- final VCFFileReader vcfReader = new VCFFileReader(vcf, false);
- final FilteringVariantContextIterator filteringIterator = new FilteringVariantContextIterator(vcfReader.iterator(), filter);
- int count = 0;
-
- for(final VariantContext vc : filteringIterator) {
- count++;
- }
-
- Assert.assertEquals(count, expectedCount);
- }
-
- @DataProvider
- public Object [][] badSampleData() {
- return new Object[][] {
- {"ex2.vcf", "DOES_NOT_EXIST"},
- {"breakpoint.vcf", null},
- };
- }
-
- @Test(dataProvider = "badSampleData", expectedExceptions = IllegalArgumentException.class)
- public void testMissingSample(final String file, final String sample) {
-
- final File vcf = new File(testDir, file);
- final VCFFileReader vcfReader = new VCFFileReader(vcf, false);
- final HeterozygosityFilter heterozygosityFilter = new HeterozygosityFilter(true, sample);
-
- new FilteringVariantContextIterator(vcfReader.iterator(), heterozygosityFilter).next();
- }
-}
-
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java
deleted file mode 100644
index 809133f..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/GenotypeQualityFilterTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-public class GenotypeQualityFilterTest {
-
- Allele refA = Allele.create("A", true);
- Allele G = Allele.create("G", false);
-
- @DataProvider
- public Iterator<Object[]> genotypeProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
- final GenotypeBuilder gt_builder = new GenotypeBuilder("test").alleles(Arrays.asList(refA, G));
- final List<Object[]> variants = new ArrayList<Object[]>(10);
-
- //without gq
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.make()).make(), null, false});
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.make()).make(), "test", false});
-
- //without sample
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ( 1).make()).make(), null, false});
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(10).make()).make(), null, true});
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(20).make()).make(), null, true});
-
- //with sample
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ( 1).make()).make(), "test", false});
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(10).make()).make(), "test", true});
- variants.add(new Object[]{vc_builder.genotypes(gt_builder.GQ(20).make()).make(), "test", true});
-
- return variants.iterator();
- }
-
- @Test(dataProvider = "genotypeProvider")
- public void testHetFilter(final VariantContext vc, final String sample, final boolean shouldPass) {
- final GenotypeQualityFilter gqFilter = getFilter(sample);
-
- Assert.assertEquals(gqFilter.test(vc), shouldPass, vc.toString());
- }
-
- @DataProvider(name = "badSamplesProvider")
- public Iterator<Object[]> badSamplesProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
- final GenotypeBuilder gt_builder = new GenotypeBuilder();
- final List<Object[]> hets = new ArrayList<Object[]>(10);
-
- hets.add(new Object[]{vc_builder.make(), null});
- hets.add(new Object[]{vc_builder.genotypes(Arrays.asList(gt_builder.name("test1").make(), gt_builder.name("test2").make())).make(), "notNull"});
- hets.add(new Object[]{vc_builder.genotypes(Collections.singleton(gt_builder.name("This").make())).make(), "That"});
-
- return hets.iterator();
- }
-
- @Test(dataProvider = "badSamplesProvider", expectedExceptions = IllegalArgumentException.class)
- public void testbadSample(final VariantContext vc, final String sample) {
- final GenotypeQualityFilter gqFilter = getFilter(sample);
-
- //should fail
- gqFilter.test(vc);
- }
-
- private GenotypeQualityFilter getFilter(String sample){
- if (sample == null) {
- return new GenotypeQualityFilter(10);
- } else {
- return new GenotypeQualityFilter(10, sample);
- }
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java
deleted file mode 100644
index b4cd3a8..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/HeterozygosityFilterTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-public class HeterozygosityFilterTest {
-
- Allele refA = Allele.create("A", true);
- Allele G = Allele.create("G", false);
-
- @DataProvider(name = "Hets")
- public Iterator<Object[]> hetsProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
- final GenotypeBuilder gt_builder = new GenotypeBuilder("test");
- final List<Object[]> hets = new ArrayList<Object[]>(10);
-
- hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make(), null, true});
- hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make(), "test", true});
-
- //non-variant
- hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make(), "test", false});
- hets.add(new Object[]{vc_builder.genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make(), null, false});
-
- return hets.iterator();
- }
-
- @Test(dataProvider = "Hets")
- public void testHetFilter(final VariantContext vc, final String sample, final boolean shouldPass) {
- final HeterozygosityFilter hf = getFilter(shouldPass, sample);
-
- Assert.assertTrue(hf.test(vc));
- }
-
- @DataProvider(name = "badSamplesProvider")
- public Iterator<Object[]> badSamplesProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
- final GenotypeBuilder gt_builder = new GenotypeBuilder();
- final List<Object[]> hets = new ArrayList<Object[]>(10);
-
- hets.add(new Object[]{vc_builder.make(), null});
- hets.add(new Object[]{vc_builder.genotypes(Arrays.asList(gt_builder.name("test1").make(), gt_builder.name("test2").make())).make(), "notNull"});
- hets.add(new Object[]{vc_builder.genotypes(Collections.singleton(gt_builder.name("This").make())).make(), "That"});
-
- return hets.iterator();
- }
-
- @Test(dataProvider = "badSamplesProvider", expectedExceptions = IllegalArgumentException.class)
- public void testbadSample(final VariantContext vc, final String sample) {
- final HeterozygosityFilter hf = getFilter(true, sample);
-
- //should fail
- hf.test(vc);
- }
-
- @DataProvider(name = "variantsProvider")
- public Object[][] variantsProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Arrays.asList(refA, G));
- final GenotypeBuilder gt_builder = new GenotypeBuilder("test");
- final List<VariantContext> vcs = new ArrayList<VariantContext>(10);
-
- //hets:
- vcs.add(vc_builder.genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make());
- vcs.add(vc_builder.loc("chr1", 10, 10).genotypes(gt_builder.alleles(Arrays.asList(refA, G)).make()).make());
-
- //non-variant:
- vcs.add(vc_builder.loc("chr1", 20, 20).genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make());
- vcs.add(vc_builder.loc("chr1", 30, 30).genotypes(gt_builder.alleles(Collections.singletonList(refA)).make()).make());
-
- return new Object[][]{new Object[]{vcs.iterator(), new int[]{1, 10}}};
- }
-
- @Test(dataProvider = "variantsProvider")
- public void testFilteringIterator(final Iterator<VariantContext> vcs, final int[] passingPositions) {
- final Iterator<VariantContext> filteringIterator = new FilteringVariantContextIterator(vcs, new HeterozygosityFilter(true, "test"));
-
- int i = 0;
- while (filteringIterator.hasNext()) {
- final VariantContext vc = filteringIterator.next();
- Assert.assertTrue(i < passingPositions.length);
- Assert.assertEquals(vc.getStart(), passingPositions[i++]);
- }
- }
-
- private HeterozygosityFilter getFilter(final boolean shouldPass, String sample) {
- if (sample == null) {
- return new HeterozygosityFilter(shouldPass);
- } else {
- return new HeterozygosityFilter(shouldPass, sample);
- }
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java
deleted file mode 100644
index 3993b79..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/JavascriptVariantFilterTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2015 Pierre Lindenbaum @yokofakun Institut du Thorax - Nantes - France
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.vcf.VCFFileReader;
-
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Pierre Lindenbaum PhD Institut du Thorax - INSERM - Nantes - France
- */
-
-public class JavascriptVariantFilterTest {
- final File testDir = new File("src/test/resources/htsjdk/variant");
-
- @DataProvider
- public Object[][] jsData() {
- return new Object[][] {
- { "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf", "variantFilter01.js",61 },
- { "ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf", "variantFilter02.js",38 }, };
- }
-
- @Test(dataProvider = "jsData")
- public void testJavascriptFilters(final String vcfFile, final String javascriptFile, final int expectCount) {
- final File vcfInput = new File(testDir, vcfFile);
- final File jsInput = new File(testDir, javascriptFile);
- final VCFFileReader vcfReader = new VCFFileReader(vcfInput, false);
- final JavascriptVariantFilter filter;
- try {
- filter = new JavascriptVariantFilter(jsInput, vcfReader.getFileHeader());
- } catch (IOException err) {
- Assert.fail("cannot read script "+jsInput, err);
- vcfReader.close();
- return;
- }
- final FilteringVariantContextIterator iter = new FilteringVariantContextIterator(vcfReader.iterator(), filter);
- int count = 0;
- while (iter.hasNext()) {
- iter.next();
- ++count;
- }
- iter.close();
- vcfReader.close();
- Assert.assertEquals(count, expectCount, "Expected number of variants " + expectCount + " but got " + count);
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java
deleted file mode 100644
index 3cbb60c..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/PassingVariantFilterTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/10/15.
- */
-public class PassingVariantFilterTest {
- Allele refA = Allele.create("A", true);
- Allele G = Allele.create("G", false);
-
- @DataProvider()
- public Iterator<Object[]> variantProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("test", "chr1", 1, 1, Arrays.asList(refA, G));
- final List<Object[]> variants = new ArrayList<Object[]>(10);
-
- // unfiltered
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).make(), true});
- // passing
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).passFilters().make(), true});
-
- // failing
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)).filters(Collections.singleton("FILTER")).make(), false});
-
- return variants.iterator();
- }
-
- @Test(dataProvider = "variantProvider")
- public void testPassingVariantFilter(final VariantContext vc, final boolean shouldPass) {
- final PassingVariantFilter passingVariantFilter = new PassingVariantFilter();
-
- Assert.assertEquals(passingVariantFilter.test(vc), shouldPass, vc.toString());
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java b/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java
deleted file mode 100644
index 74f1bb5..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/filter/SnpFilterTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package htsjdk.variant.variantcontext.filter;
-
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by farjoun on 9/9/15.
- */
-public class SnpFilterTest {
- Allele refA = Allele.create("A", true);
- Allele refAG = Allele.create("AG", true);
-
- Allele G = Allele.create("G", false);
- Allele T = Allele.create("T", false);
- Allele AG = Allele.create("AG", false);
- Allele AT = Allele.create("AT", false);
- Allele star = Allele.create("<*>", false);
-
-
- @DataProvider()
- public Iterator<Object[]> variantProvider() {
-
- final VariantContextBuilder vc_builder = new VariantContextBuilder("testCode", "chr1", 1, 1, Collections.<Allele>emptyList());
- final List<Object[]> variants = new ArrayList<Object[]>(10);
-
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G)) .make(), true}); // SNP
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G, T)) .make(), true}); // SNP
-
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, AG)) .make(), false}); // INDEL
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, G, AG)) .make(), false}); // MIXED
- variants.add(new Object[]{vc_builder.alleles(Arrays.asList(refA, star)) .make(), false}); // SYMBOLIC
- variants.add(new Object[]{vc_builder.stop(2).alleles(Arrays.asList(refAG, T)) .make(), false}); // INDEL
- variants.add(new Object[]{vc_builder.stop(2).alleles(Arrays.asList(refAG, AT)).make(), false}); // MNP
-
- return variants.iterator();
- }
-
- @Test(dataProvider = "variantProvider")
- public void testSnpFilter(final VariantContext vc, final boolean shouldPass) {
- final SnpFilter snpFilter = new SnpFilter();
-
- Assert.assertEquals(snpFilter.test(vc), shouldPass, vc.toString());
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java
deleted file mode 100644
index 2fd1520..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/TabixOnTheFlyIndexCreationTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * The MIT License
- *
- * Copyright (c) 2014 The Broad Institute
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.index.tabix.TabixIndex;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.vcf.VCF3Codec;
-import htsjdk.variant.vcf.VCFHeader;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.EnumSet;
-
-public class TabixOnTheFlyIndexCreationTest {
- private static final File SMALL_VCF = new File("src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz");
- @Test
- public void simpleTest() throws Exception {
- final VCF3Codec codec = new VCF3Codec();
- final FeatureReader<VariantContext> reader = AbstractFeatureReader.getFeatureReader(SMALL_VCF.getAbsolutePath(), codec, false);
- final VCFHeader headerFromFile = (VCFHeader)reader.getHeader();
- final File vcf = File.createTempFile("TabixOnTheFlyIndexCreationTest.", ".vcf.gz");
- final File tabix = new File(vcf.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION);
- vcf.deleteOnExit();
- tabix.deleteOnExit();
- final VariantContextWriter vcfWriter = new VariantContextWriterBuilder()
- .setOutputFile(vcf)
- .setReferenceDictionary(headerFromFile.getSequenceDictionary())
- .setOptions(EnumSet.of(Options.INDEX_ON_THE_FLY, Options.ALLOW_MISSING_FIELDS_IN_HEADER))
- .build();
- vcfWriter.writeHeader(headerFromFile);
- final CloseableTribbleIterator<VariantContext> it = reader.iterator();
- while (it.hasNext()) {
- vcfWriter.add(it.next());
- }
- it.close();
- vcfWriter.close();
-
- // Hard to validate, so just confirm that index can be read.
- new TabixIndex(tabix);
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java
deleted file mode 100644
index eaf2f95..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VCFWriterUnitTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.FeatureReader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.Genotype;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.GenotypesContext;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFFileReader;
-import htsjdk.variant.vcf.VCFHeader;
-import htsjdk.variant.vcf.VCFHeaderLine;
-import htsjdk.variant.vcf.VCFHeaderVersion;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/**
- * @author aaron
- * <p/>
- * Class VCFWriterUnitTest
- * <p/>
- * This class tests out the ability of the VCF writer to correctly write VCF files
- */
-public class VCFWriterUnitTest extends VariantBaseTest {
- private Set<VCFHeaderLine> metaData;
- private Set<String> additionalColumns;
- private File tempDir;
-
- @BeforeClass
- private void createTemporaryDirectory() {
- tempDir = TestUtil.getTempDirectory("VCFWriter", "StaleIndex");
- }
-
- @AfterClass
- private void deleteTemporaryDirectory() {
- for (File f : tempDir.listFiles()) {
- f.delete();
- }
- tempDir.delete();
- }
-
- /** test, using the writer and reader, that we can output and input a VCF file without problems */
- @Test(dataProvider = "vcfExtensionsDataProvider")
- public void testBasicWriteAndRead(final String extension) throws IOException {
- final File fakeVCFFile = File.createTempFile("testBasicWriteAndRead.", extension);
- fakeVCFFile.deleteOnExit();
- if (".vcf.gz".equals(extension)) {
- new File(fakeVCFFile.getAbsolutePath() + ".tbi").deleteOnExit();
- } else {
- Tribble.indexFile(fakeVCFFile).deleteOnExit();
- }
- metaData = new HashSet<VCFHeaderLine>();
- additionalColumns = new HashSet<String>();
- final SAMSequenceDictionary sequenceDict = createArtificialSequenceDictionary();
- final VCFHeader header = createFakeHeader(metaData, additionalColumns, sequenceDict);
- final VariantContextWriter writer = new VariantContextWriterBuilder()
- .setOutputFile(fakeVCFFile)
- .setReferenceDictionary(sequenceDict)
- .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
- .build();
- writer.writeHeader(header);
- writer.add(createVC(header));
- writer.add(createVC(header));
- writer.close();
- final VCFCodec codec = new VCFCodec();
- final FeatureReader<VariantContext> reader = AbstractFeatureReader.getFeatureReader(fakeVCFFile.getAbsolutePath(), codec, false);
- final VCFHeader headerFromFile = (VCFHeader)reader.getHeader();
-
- int counter = 0;
-
- // validate what we're reading in
- validateHeader(headerFromFile, sequenceDict);
-
- try {
- final Iterator<VariantContext> it = reader.iterator();
- while(it.hasNext()) {
- it.next();
- counter++;
- }
- Assert.assertEquals(counter, 2);
- }
- catch (final IOException e ) {
- throw new RuntimeException(e.getMessage());
- }
-
- }
-
- /**
- * create a fake header of known quantity
- * @param metaData the header lines
- * @param additionalColumns the additional column names
- * @return a fake VCF header
- */
- public static VCFHeader createFakeHeader(final Set<VCFHeaderLine> metaData, final Set<String> additionalColumns,
- final SAMSequenceDictionary sequenceDict) {
- metaData.add(new VCFHeaderLine(VCFHeaderVersion.VCF4_0.getFormatString(), VCFHeaderVersion.VCF4_0.getVersionString()));
- metaData.add(new VCFHeaderLine("two", "2"));
- additionalColumns.add("extra1");
- additionalColumns.add("extra2");
- final VCFHeader ret = new VCFHeader(metaData, additionalColumns);
- ret.setSequenceDictionary(sequenceDict);
- return ret;
- }
-
- /**
- * create a fake VCF record
- * @param header the VCF header
- * @return a VCFRecord
- */
- private VariantContext createVC(final VCFHeader header) {
-
- return createVCGeneral(header,"1",1);
- }
-
- private VariantContext createVCGeneral(final VCFHeader header, final String chrom, final int position) {
- final List<Allele> alleles = new ArrayList<Allele>();
- final Map<String, Object> attributes = new HashMap<String,Object>();
- final GenotypesContext genotypes = GenotypesContext.create(header.getGenotypeSamples().size());
-
- alleles.add(Allele.create("A",true));
- alleles.add(Allele.create("ACC",false));
-
- attributes.put("DP","50");
- for (final String name : header.getGenotypeSamples()) {
- final Genotype gt = new GenotypeBuilder(name,alleles.subList(1,2)).GQ(0).attribute("BB", "1").phased(true).make();
- genotypes.add(gt);
- }
- return new VariantContextBuilder("RANDOM", chrom, position, position, alleles)
- .genotypes(genotypes).attributes(attributes).make();
- }
-
-
- /**
- * validate a VCF header
- * @param header the header to validate
- */
- public void validateHeader(final VCFHeader header, final SAMSequenceDictionary sequenceDictionary) {
- // check the fields
- int index = 0;
- for (final VCFHeader.HEADER_FIELDS field : header.getHeaderFields()) {
- Assert.assertEquals(VCFHeader.HEADER_FIELDS.values()[index], field);
- index++;
- }
- Assert.assertEquals(header.getMetaDataInSortedOrder().size(), metaData.size() + sequenceDictionary.size());
- index = 0;
- for (final String key : header.getGenotypeSamples()) {
- Assert.assertTrue(additionalColumns.contains(key));
- index++;
- }
- Assert.assertEquals(index, additionalColumns.size());
- }
-
- @Test(dataProvider = "vcfExtensionsDataProvider")
- public void TestWritingLargeVCF(final String extension) throws FileNotFoundException, InterruptedException {
-
- final Set<VCFHeaderLine> metaData = new HashSet<VCFHeaderLine>();
- final Set<String> Columns = new HashSet<String>();
- for (int i = 0; i < 123; i++) {
-
- Columns.add(String.format("SAMPLE_%d", i));
- }
-
- final SAMSequenceDictionary dict = createArtificialSequenceDictionary();
- final VCFHeader header = createFakeHeader(metaData,Columns, dict);
-
- final File vcf = new File(tempDir, "test" + extension);
- final String indexExtension;
- if (extension.equals(".vcf.gz")) {
- indexExtension = TabixUtils.STANDARD_INDEX_EXTENSION;
- } else {
- indexExtension = Tribble.STANDARD_INDEX_EXTENSION;
- }
- final File vcfIndex = new File(vcf.getAbsolutePath() + indexExtension);
- vcfIndex.deleteOnExit();
-
- for(int count=1;count<2; count++){
- final VariantContextWriter writer = new VariantContextWriterBuilder()
- .setOutputFile(vcf)
- .setReferenceDictionary(dict)
- .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
- .build();
- writer.writeHeader(header);
-
- for (int i = 1; i < 17 ; i++) { // write 17 chromosomes
- for (int j = 1; j < 10; j++) { //10 records each
- writer.add(createVCGeneral(header, String.format("%d", i), j * 100));
- }
- }
- writer.close();
-
- Assert.assertTrue(vcf.lastModified() <= vcfIndex.lastModified());
- }
- }
-
- @DataProvider(name = "vcfExtensionsDataProvider")
- public Object[][]vcfExtensionsDataProvider() {
- return new Object[][] {
- // TODO: BCF doesn't work because header is not properly constructed.
- // {".bcf"},
- {".vcf"},
- {".vcf.gz"}
- };
- }
-
-
- /**
- * A test to ensure that if we add a line to a VCFHeader it will persist through
- * a round-trip write/read cycle via VariantContextWriter/VCFFileReader
- */
- @Test
- public void testModifyHeader() {
- final File originalVCF = new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf");
- final VCFFileReader reader = new VCFFileReader(originalVCF, false);
- final VCFHeader header = reader.getFileHeader();
- reader.close();
-
- header.addMetaDataLine(new VCFHeaderLine("FOOBAR", "foovalue"));
-
- final File outputVCF = createTempFile("testModifyHeader", ".vcf");
- final VariantContextWriter writer = new VariantContextWriterBuilder().setOutputFile(outputVCF).setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER)).build();
- writer.writeHeader(header);
- writer.close();
-
- final VCFFileReader roundtripReader = new VCFFileReader(outputVCF, false);
- final VCFHeader roundtripHeader = roundtripReader.getFileHeader();
- roundtripReader.close();
-
- Assert.assertNotNull(roundtripHeader.getOtherHeaderLine("FOOBAR"), "Could not find FOOBAR header line after a write/read cycle");
- Assert.assertEquals(roundtripHeader.getOtherHeaderLine("FOOBAR").getValue(), "foovalue", "Wrong value for FOOBAR header line after a write/read cycle");
- }
-}
-
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java
deleted file mode 100644
index 179c4cb..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWriterBuilderUnitTest.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
-* Copyright (c) 2014 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-import htsjdk.samtools.Defaults;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.util.BlockCompressedOutputStream;
-import htsjdk.samtools.util.RuntimeIOException;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.util.TabixUtils;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder.OutputType;
-import org.testng.Assert;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-
-public class VariantContextWriterBuilderUnitTest extends VariantBaseTest {
- private static final String TEST_BASENAME = "htsjdk-test.VariantContextWriterBuilderUnitTest";
- private SAMSequenceDictionary dictionary;
-
- private File vcf;
- private File vcfIdx;
- private File vcfMD5;
- private File bcf;
- private File bcfIdx;
- private File unknown;
-
- private List<File> blockCompressedVCFs;
- private List<File> blockCompressedIndices;
-
- @BeforeSuite
- public void before() throws IOException {
- dictionary = createArtificialSequenceDictionary();
- vcf = File.createTempFile(TEST_BASENAME, ".vcf");
- vcf.deleteOnExit();
- vcfIdx = Tribble.indexFile(vcf);
- vcfIdx.deleteOnExit();
- vcfMD5 = new File(vcf.getAbsolutePath() + ".md5");
- vcfMD5.deleteOnExit();
- bcf = File.createTempFile(TEST_BASENAME, ".bcf");
- bcf.deleteOnExit();
- bcfIdx = Tribble.indexFile(bcf);
- bcfIdx.deleteOnExit();
- unknown = File.createTempFile(TEST_BASENAME, ".unknown");
- unknown.deleteOnExit();
-
- blockCompressedVCFs = new ArrayList<File>();
- blockCompressedIndices = new ArrayList<File>();
- for (final String extension : AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
- final File blockCompressed = File.createTempFile(TEST_BASENAME, ".vcf" + extension);
- blockCompressed.deleteOnExit();
- blockCompressedVCFs.add(blockCompressed);
-
- final File index = new File(blockCompressed.getAbsolutePath() + TabixUtils.STANDARD_INDEX_EXTENSION);
- index.deleteOnExit();
- blockCompressedIndices.add(index);
- }
- }
-
- @Test
- public void testSetOutputFile() throws IOException {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary);
-
- VariantContextWriter writer = builder.setOutputFile(vcf.getAbsolutePath()).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile VCF String");
- Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile VCF String was compressed");
-
- writer = builder.setOutputFile(vcf).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile VCF File");
- Assert.assertFalse(((VCFWriter)writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile VCF File was compressed");
-
- for (final String extension : AbstractFeatureReader.BLOCK_COMPRESSED_EXTENSIONS) {
- final File file = File.createTempFile(TEST_BASENAME + ".setoutput", extension);
- file.deleteOnExit();
- final String filename = file.getAbsolutePath();
-
- writer = builder.setOutputFile(filename).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile " + extension + " String");
- Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile " + extension + " String was not compressed");
-
- writer = builder.setOutputFile(file).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile " + extension + " File");
- Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFile " + extension + " File was not compressed");
- }
-
- writer = builder.setOutputFile(bcf).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF String");
-
- writer = builder.setOutputFile(bcf.getAbsolutePath()).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFile BCF File");
- }
-
- @Test
- public void testDetermineOutputType() {
- Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.vcf));
- Assert.assertEquals(OutputType.BCF, VariantContextWriterBuilder.determineOutputTypeFromFile(this.bcf));
- Assert.assertEquals(OutputType.VCF_STREAM, VariantContextWriterBuilder.determineOutputTypeFromFile(new File("/dev/stdout")));
- for (final File f: this.blockCompressedVCFs) {
- Assert.assertEquals(OutputType.BLOCK_COMPRESSED_VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(f));
- }
-
- // Test symlinking
- try {
- final Path link = Files.createTempFile("foo.", ".tmp");
- Files.deleteIfExists(link);
- Files.createSymbolicLink(link, this.vcf.toPath());
- link.toFile().deleteOnExit();
- Assert.assertEquals(OutputType.VCF, VariantContextWriterBuilder.determineOutputTypeFromFile(link.toFile()));
- link.toFile().delete();
- }
- catch (final IOException ioe) {
- throw new RuntimeIOException(ioe);
- }
- }
-
- @Test
- public void testSetOutputFileType() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile(unknown);
-
- VariantContextWriter writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFileType VCF");
- Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType VCF was compressed");
-
- writer = builder.setOption(Options.FORCE_BCF).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType FORCE_BCF set -> expected BCF, was VCF");
-
- // test that FORCE_BCF remains in effect, overriding the explicit setting of VCF
- writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.VCF).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType FORCE_BCF set 2 -> expected BCF, was VCF");
-
- writer = builder.unsetOption(Options.FORCE_BCF).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFileType FORCE_BCF unset -> expected VCF, was BCF");
- Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType FORCE_BCF unset was compressed");
-
- writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.BLOCK_COMPRESSED_VCF).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputFile BLOCK_COMPRESSED_VCF");
- Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BlockCompressedOutputStream, "testSetOutputFileType BLOCK_COMPRESSED_VCF was not compressed");
-
- writer = builder.setOutputFileType(VariantContextWriterBuilder.OutputType.BCF).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputFileType BCF");
- }
-
- @Test
- public void testSetOutputStream() {
- final OutputStream stream = new ByteArrayOutputStream();
-
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .unsetOption(Options.INDEX_ON_THE_FLY)
- .setOutputStream(stream);
-
- VariantContextWriter writer = builder.build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream default");
-
- writer = builder.setOption(Options.FORCE_BCF).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream FORCE_BCF set -> expected BCF stream, was VCF stream");
-
- // test that FORCE_BCF remains in effect, overriding the explicit setting of VCF
- writer = builder.setOutputVCFStream(stream).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream FORCE_BCF set 2 -> expected BCF stream, was VCF stream");
-
- writer = builder.unsetOption(Options.FORCE_BCF).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream FORCE_BCF unset -> expected VCF stream, was BCF stream");
-
- writer = builder.setOutputBCFStream(stream).build();
- Assert.assertTrue(writer instanceof BCF2Writer, "testSetOutputStream BCF");
-
- writer = builder.setOutputVCFStream(stream).build();
- Assert.assertTrue(writer instanceof VCFWriter, "testSetOutputStream VCF");
- }
-
- @Test
- public void testAsync() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile(vcf);
-
- VariantContextWriter writer = builder.build();
- Assert.assertEquals(writer instanceof AsyncVariantContextWriter, Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE, "testAsync default");
-
- writer = builder.setOption(Options.USE_ASYNC_IO).build();
- Assert.assertTrue(writer instanceof AsyncVariantContextWriter, "testAsync option=set");
-
- writer = builder.unsetOption(Options.USE_ASYNC_IO).build();
- Assert.assertFalse(writer instanceof AsyncVariantContextWriter, "testAsync option=unset");
- }
-
- @Test
- public void testBuffering() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile(vcf)
- .unsetOption(Options.INDEX_ON_THE_FLY); // so the potential BufferedOutputStream is not wrapped in a PositionalOutputStream
-
- VariantContextWriter writer = builder.build();
- Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was not buffered by default");
-
- writer = builder.unsetBuffering().build();
- Assert.assertFalse(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was buffered when unset");
-
- writer = builder.setBuffer(8192).build();
- Assert.assertTrue(((VCFWriter) writer).getOutputStream() instanceof BufferedOutputStream, "testBuffering was not buffered when set");
- }
-
- @Test
- public void testMD5() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile(vcf);
-
- VariantContextWriter writer = builder.build();
- writer.close();
- Assert.assertEquals(vcfMD5.exists(), Defaults.CREATE_MD5, "MD5 default setting not respected");
-
- if (vcfMD5.exists())
- vcfMD5.delete();
-
- writer = builder.setCreateMD5().build();
- writer.close();
- Assert.assertTrue(vcfMD5.exists(), "MD5 not created when requested");
- vcfMD5.delete();
-
- writer = builder.unsetCreateMD5().build();
- writer.close();
- Assert.assertFalse(vcfMD5.exists(), "MD5 created when not requested");
-
- writer = builder.setCreateMD5(false).build();
- writer.close();
- Assert.assertFalse(vcfMD5.exists(), "MD5 created when not requested via boolean parameter");
-
- writer = builder.setCreateMD5(true).build();
- writer.close();
- Assert.assertTrue(vcfMD5.exists(), "MD5 not created when requested via boolean parameter");
- vcfMD5.delete();
-
- for (final File blockCompressed : blockCompressedVCFs) {
- final File md5 = new File(blockCompressed + ".md5");
- if (md5.exists())
- md5.delete();
- md5.deleteOnExit();
- writer = builder.setOutputFile(blockCompressed).build();
- writer.close();
- Assert.assertTrue(md5.exists(), "MD5 digest not created for " + blockCompressed);
- }
- }
-
- @Test
- public void testIndexingOnTheFly() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOption(Options.INDEX_ON_THE_FLY);
-
- if (vcfIdx.exists())
- vcfIdx.delete();
- VariantContextWriter writer = builder.setOutputFile(vcf).build();
- writer.close();
- Assert.assertTrue(vcfIdx.exists(), String.format("VCF index not created for %s / %s", vcf, vcfIdx));
-
- if (bcfIdx.exists())
- bcfIdx.delete();
- writer = builder.setOutputFile(bcf).build();
- writer.close();
- Assert.assertTrue(bcfIdx.exists(), String.format("BCF index not created for %s / %s", bcf, bcfIdx));
-
- for (int i = 0; i < blockCompressedVCFs.size(); i++) {
- final File blockCompressed = blockCompressedVCFs.get(i);
- final File index = blockCompressedIndices.get(i);
- if (index.exists())
- index.delete();
- writer = builder.setOutputFile(blockCompressed).setReferenceDictionary(dictionary).build();
- writer.close();
- Assert.assertTrue(index.exists(), String.format("Block-compressed index not created for %s / %s", blockCompressed, index));
-
- // Tabix does not require a reference dictionary.
- // Tribble does: see tests testRefDictRequiredForVCFIndexOnTheFly / testRefDictRequiredForBCFIndexOnTheFly
-
- index.delete();
- writer = builder.setReferenceDictionary(null).build();
- writer.close();
- Assert.assertTrue(index.exists(), String.format("Block-compressed index not created for %s / %s", blockCompressed, index));
- }
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testInvalidImplicitFileType() {
- new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile("test.bam")
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testSetInvalidFileType() {
- new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputFile("test.bam")
- .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF_STREAM)
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testInvalidSetFileTypeForStream() {
- new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputStream(new ByteArrayOutputStream())
- .setOutputFileType(VariantContextWriterBuilder.OutputType.VCF)
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testUnsupportedIndexOnTheFlyForStreaming() {
- new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputStream(new ByteArrayOutputStream())
- .setOption(Options.INDEX_ON_THE_FLY)
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testUnsupportedDefaultIndexOnTheFlyForStreaming() {
- new VariantContextWriterBuilder()
- .setReferenceDictionary(dictionary)
- .setOutputStream(new ByteArrayOutputStream())
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testRefDictRequiredForVCFIndexOnTheFly() {
- new VariantContextWriterBuilder()
- .setOutputFile(vcf)
- .setOption(Options.INDEX_ON_THE_FLY)
- .build();
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testRefDictRequiredForBCFIndexOnTheFly() {
- new VariantContextWriterBuilder()
- .setOutputFile(bcf)
- .setOption(Options.INDEX_ON_THE_FLY)
- .build();
- }
-
- @Test
- public void testClearOptions() {
- // Verify that clearOptions doesn't have a side effect of carrying previously set options
- // forward to subsequent builders
- VariantContextWriterBuilder vcwb = new VariantContextWriterBuilder();
- vcwb.clearOptions().setOption(Options.INDEX_ON_THE_FLY);
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder().clearOptions();
- Assert.assertTrue(builder.options.isEmpty());
- }
-
- @Test
- public void testModifyOption() {
- final VariantContextWriterBuilder builder = new VariantContextWriterBuilder().clearOptions();
- for (final Options option : Options.values()) {
- Assert.assertFalse(builder.isOptionSet(option)); // shouldn't be set
- builder.modifyOption(option, false);
- Assert.assertFalse(builder.isOptionSet(option)); // still shouldn't be set
- builder.modifyOption(option, true);
- Assert.assertTrue(builder.isOptionSet(option)); // now is set
- builder.modifyOption(option, false);
- Assert.assertFalse(builder.isOptionSet(option)); // has been unset
- }
- }
-}
diff --git a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java b/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java
deleted file mode 100644
index 3782965..0000000
--- a/src/test/java/htsjdk/variant/variantcontext/writer/VariantContextWritersUnitTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.variantcontext.writer;
-
-
-// the imports for unit testing.
-
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.bcf2.BCF2Codec;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextTestProvider;
-import htsjdk.variant.vcf.VCFCodec;
-import htsjdk.variant.vcf.VCFHeader;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-
-
-public class VariantContextWritersUnitTest extends VariantBaseTest {
- private SAMSequenceDictionary dictionary;
-
- @BeforeSuite
- public void before() throws IOException {
- dictionary = createArtificialSequenceDictionary();
- VariantContextTestProvider.initializeTests();
- }
-
- @DataProvider(name = "VariantContextTest_SingleContexts")
- public Object[][] SiteVCsTest() {
- List<Object[]> tests = new ArrayList<Object[]>();
- for ( VariantContextTestProvider.VariantContextTestData testData : VariantContextTestProvider.generateSiteTests() )
- tests.add(new Object[]{testData});
- return tests.toArray(new Object[][]{});
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test BCF2 reader / writer
- //
- // --------------------------------------------------------------------------------
-
- @Test(dataProvider = "VariantContextTest_SingleContexts")
- public void testBCF2WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
- VariantContextTestProvider.testReaderWriter(new BCFIOTester(), testData);
- }
-
- @Test(dataProvider = "VariantContextTest_SingleContexts")
- public void testBCF2WriterReaderMissingGenotypes(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
- VariantContextTestProvider.testReaderWriterWithMissingGenotypes(new BCFIOTester(), testData);
- }
-
- private class BCFIOTester extends VariantContextTestProvider.VariantContextIOTest<BCF2Codec> {
- @Override
- public String getExtension() {
- return ".bcf";
- }
-
- @Override
- public BCF2Codec makeCodec() {
- return new BCF2Codec();
- }
-
- @Override
- public VariantContextWriter makeWriter(final File file, final EnumSet<Options> baseOptions) {
- return new VariantContextWriterBuilder()
- .setOutputFile(file)
- .setReferenceDictionary(dictionary)
- .setOptions(baseOptions)
- .build();
- }
-
- @Override
- public VariantContextTestProvider.VariantContextContainer readAllVCs(File input) throws IOException {
- final BCF2Codec codec = this.makeCodec();
- return VariantContextTestProvider.readAllVCs(input, codec);
- }
- }
-
- // --------------------------------------------------------------------------------
- //
- // Test VCF reader / writer
- //
- // --------------------------------------------------------------------------------
-
- @Test(enabled = true, dataProvider = "VariantContextTest_SingleContexts")
- public void testVCF4WriterReader(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
- VariantContextTestProvider.testReaderWriter(new VCFIOTester(), testData);
- }
-
- @Test(enabled = true, dataProvider = "VariantContextTest_SingleContexts")
- public void testVCF4WriterReaderMissingGenotypes(final VariantContextTestProvider.VariantContextTestData testData) throws IOException {
- VariantContextTestProvider.testReaderWriterWithMissingGenotypes(new VCFIOTester(), testData);
- }
-
- private class VCFIOTester extends VariantContextTestProvider.VariantContextIOTest<VCFCodec> {
- @Override
- public String getExtension() {
- return ".vcf";
- }
-
- @Override
- public List<VariantContext> postprocess(final VCFHeader header, final List<VariantContext> vcsAfterIO) {
- final List<VariantContext> fullyDecoded = new ArrayList<VariantContext>(vcsAfterIO.size());
-
- for ( final VariantContext withStrings : vcsAfterIO )
- fullyDecoded.add(withStrings.fullyDecode(header, false));
-
- return fullyDecoded;
- }
-
- @Override
- public VCFCodec makeCodec() {
- return new VCFCodec();
- }
-
- @Override
- public VariantContextWriter makeWriter(final File file, final EnumSet<Options> baseOptions) {
- return new VariantContextWriterBuilder()
- .setOutputFile(file)
- .setReferenceDictionary(dictionary)
- .setOptions(baseOptions)
- .build();
- }
-
- @Override
- public VariantContextTestProvider.VariantContextContainer readAllVCs(File input) throws FileNotFoundException {
- final VCFCodec codec = this.makeCodec();
- return VariantContextTestProvider.readAllVCs(input, codec);
- }
- }
-}
\ No newline at end of file
diff --git a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java b/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java
deleted file mode 100644
index 9f81547..0000000
--- a/src/test/java/htsjdk/variant/vcf/AbstractVCFCodecTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.index.tabix.TabixFormat;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.VariantContext;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.List;
-
-
-
-public class AbstractVCFCodecTest extends VariantBaseTest {
-
- @Test
- public void shouldPreserveSymbolicAlleleCase() {
- VCFFileReader reader = new VCFFileReader(new File(VariantBaseTest.variantTestDataRoot + "breakpoint.vcf"), false);
- VariantContext variant = reader.iterator().next();
- reader.close();
-
- // VCF v4.1 s1.4.5
- // Tools processing VCF files are not required to preserve case in the allele String, except for IDs, which are case sensitive.
- Assert.assertTrue(variant.getAlternateAllele(0).getDisplayString().contains("chr12"));
- }
-
- @Test
- public void TestSpanDelParseAlleles(){
- List<Allele> list = VCF3Codec.parseAlleles("A", Allele.SPAN_DEL_STRING, 0);
- }
-
- @Test(expectedExceptions = TribbleException.class)
- public void TestSpanDelParseAllelesException(){
- List<Allele> list1 = VCF3Codec.parseAlleles(Allele.SPAN_DEL_STRING, "A", 0);
- }
-
- @DataProvider(name="thingsToTryToDecode")
- public Object[][] getThingsToTryToDecode(){
- return new Object[][] {
- {"src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf", true},
- {"src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz", true},
- {"src/test/resources/htsjdk/tribble/nonexistant.garbage", false},
- {"src/test/resources/htsjdk/tribble/testIntervalList.list", false}
- };
- }
-
- @Test(dataProvider = "thingsToTryToDecode")
- public void testCanDecodeFile(String potentialInput, boolean canDecode) {
- Assert.assertEquals(AbstractVCFCodec.canDecodeFile(potentialInput, VCFCodec.VCF4_MAGIC_HEADER), canDecode);
- }
-
- @Test
- public void testGetTabixFormat() {
- Assert.assertEquals(new VCFCodec().getTabixFormat(), TabixFormat.VCF);
- Assert.assertEquals(new VCF3Codec().getTabixFormat(), TabixFormat.VCF);
- }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java b/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java
deleted file mode 100644
index 9d084f3..0000000
--- a/src/test/java/htsjdk/variant/vcf/IndexFactoryUnitTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.tribble.AbstractFeatureReader;
-import htsjdk.tribble.CloseableTribbleIterator;
-import htsjdk.tribble.Tribble;
-import htsjdk.tribble.index.Index;
-import htsjdk.tribble.index.IndexFactory;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.EnumSet;
-
-/**
- * tests out the various functions in the index factory class
- */
-public class IndexFactoryUnitTest extends VariantBaseTest {
-
- File inputFile = new File(variantTestDataRoot + "HiSeq.10000.vcf");
- File outputFile = createTempFile("onTheFlyOutputTest", ".vcf");
- File outputFileIndex = Tribble.indexFile(outputFile);
-
- private SAMSequenceDictionary dict;
-
- @BeforeTest
- public void setup() {
- dict = createArtificialSequenceDictionary();
- }
-
- //
- // test out scoring the indexes
- //
- @Test
- public void testOnTheFlyIndexing1() throws IOException {
- final Index indexFromInputFile = IndexFactory.createDynamicIndex(inputFile, new VCFCodec());
- if ( outputFileIndex.exists() ) {
- System.err.println("Deleting " + outputFileIndex);
- outputFileIndex.delete();
- }
-
- for ( int maxRecords : Arrays.asList(0, 1, 10, 100, 1000, -1)) {
- final AbstractFeatureReader source = AbstractFeatureReader.getFeatureReader(inputFile.getAbsolutePath(), new VCFCodec(), indexFromInputFile);
-
- int counter = 0;
- VariantContextWriter writer = new VariantContextWriterBuilder()
- .setOutputFile(outputFile)
- .setReferenceDictionary(dict)
- .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER))
- .build();
- writer.writeHeader((VCFHeader)source.getHeader());
- CloseableTribbleIterator<VariantContext> it = source.iterator();
- while (it.hasNext() && (counter++ < maxRecords || maxRecords == -1) ) {
- VariantContext vc = it.next();
- writer.add(vc);
- }
- writer.close();
-
- // test that the input index is the same as the one created from the identical input file
- // test that the dynamic index is the same as the output index, which is equal to the input index
- //WalkerTest.assertOnDiskIndexEqualToNewlyCreatedIndex(outputFileIndex, "unittest", outputFile);
- }
- }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java
deleted file mode 100644
index fe19fc5..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFCompoundHeaderLineUnitTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-
-/**
- * User: ebanks
- * Date: Apr 2, 2014
- */
-public class VCFCompoundHeaderLineUnitTest extends VariantBaseTest {
-
- @Test
- public void supportsVersionFields() {
- final String line = "<ID=FOO,Number=1,Type=Float,Description=\"foo\",Version=3>";
- final VCFCompoundHeaderLine headerline = new VCFInfoHeaderLine(line, VCFHeaderVersion.VCF4_2);
- // if we don't support version fields then we should fail before we ever get here
- Assert.assertTrue(true);
- }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java b/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java
deleted file mode 100644
index 2c4ff0f..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFEncoderTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.util.ParsingUtils;
-import htsjdk.variant.variantcontext.Allele;
-import htsjdk.variant.variantcontext.GenotypeBuilder;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.VariantContextBuilder;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class VCFEncoderTest {
-
- @DataProvider(name = "VCFWriterDoubleFormatTestData")
- public Object[][] makeVCFWriterDoubleFormatTestData() {
- final List<Object[]> tests = new ArrayList<Object[]>();
- tests.add(new Object[]{1.0, "1.00"});
- tests.add(new Object[]{10.1, "10.10"});
- tests.add(new Object[]{10.01, "10.01"});
- tests.add(new Object[]{10.012, "10.01"});
- tests.add(new Object[]{10.015, "10.02"});
- tests.add(new Object[]{0.0, "0.00"});
- tests.add(new Object[]{0.5, "0.500"});
- tests.add(new Object[]{0.55, "0.550"});
- tests.add(new Object[]{0.555, "0.555"});
- tests.add(new Object[]{0.5555, "0.556"});
- tests.add(new Object[]{0.1, "0.100"});
- tests.add(new Object[]{0.050, "0.050"});
- tests.add(new Object[]{0.010, "0.010"});
- tests.add(new Object[]{0.012, "0.012"});
- tests.add(new Object[]{0.0012, "1.200e-03"});
- tests.add(new Object[]{1.2e-4, "1.200e-04"});
- tests.add(new Object[]{1.21e-4, "1.210e-04"});
- tests.add(new Object[]{1.212e-5, "1.212e-05"});
- tests.add(new Object[]{1.2123e-6, "1.212e-06"});
- tests.add(new Object[]{Double.POSITIVE_INFINITY, "Infinity"});
- tests.add(new Object[]{Double.NEGATIVE_INFINITY, "-Infinity"});
- tests.add(new Object[]{Double.NaN, "NaN"});
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "VCFWriterDoubleFormatTestData")
- public void testVCFWriterDoubleFormatTestData(final double d, final String expected) {
- Assert.assertEquals(VCFEncoder.formatVCFDouble(d), expected, "Failed to pretty print double in VCFWriter");
- }
-
- @DataProvider(name = "MissingFormatTestData")
- public Object[][] makeMissingFormatTestData() {
- final VCFHeader header = createSyntheticHeader(Arrays.asList("Sample1"));
-
- final VCFEncoder dropMissing = new VCFEncoder(header, false, false);
- final VCFEncoder keepMissing = new VCFEncoder(header, false, true);
- final VariantContextBuilder baseVC = new VariantContextBuilder().chr("1").start(1).stop(1).noID().passFilters().log10PError(1).alleles("A", "C");
- final GenotypeBuilder baseGT = new GenotypeBuilder("Sample1").alleles(Arrays.asList(Allele.NO_CALL, Allele.NO_CALL));
- final Map<Allele, String> alleleMap = new HashMap<Allele, String>(3);
- final List<String> formatKeys = Arrays.asList("GT", "AA", "BB");
- alleleMap.put(Allele.NO_CALL, VCFConstants.EMPTY_ALLELE);
- alleleMap.put(Allele.create("A", true), "0");
- alleleMap.put(Allele.create("C", false), "1");
-
- final List<Object[]> tests = new ArrayList<Object[]>();
-
- VariantContext vc = baseVC.genotypes(baseGT.attribute("AA", "a").make()).make();
- tests.add(new Object[]{dropMissing, vc, "./.:a", alleleMap, formatKeys});
- tests.add(new Object[]{keepMissing, vc, "./.:a:.", alleleMap, formatKeys});
- baseGT.noAttributes();
-
- vc = baseVC.genotypes(baseGT.attribute("AA", "a").attribute("BB", 2).make()).make();
- tests.add(new Object[]{dropMissing, vc, "./.:a:2", alleleMap, formatKeys});
- tests.add(new Object[]{keepMissing, vc, "./.:a:2", alleleMap, formatKeys});
- baseGT.noAttributes();
-
- vc = baseVC.genotypes(baseGT.make()).make();
- tests.add(new Object[]{dropMissing, vc, "./.", alleleMap, formatKeys});
- tests.add(new Object[]{keepMissing, vc, "./.:.:.", alleleMap, formatKeys});
- baseGT.noAttributes();
-
- vc = baseVC.genotypes(baseGT.attribute("BB", 2).make()).make();
- tests.add(new Object[]{dropMissing, vc, "./.:.:2", alleleMap, formatKeys});
- tests.add(new Object[]{keepMissing, vc, "./.:.:2", alleleMap, formatKeys});
- baseGT.noAttributes();
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "MissingFormatTestData")
- public void testMissingFormatFields(final VCFEncoder encoder, final VariantContext vc, final String expectedLastColumn, final Map<Allele, String> alleleMap, final List<String> genotypeFormatKeys) {
- final StringBuilder sb = new StringBuilder();
- final String[] columns = new String[5];
-
- encoder.addGenotypeData(vc, alleleMap, genotypeFormatKeys, sb);
- final int nCol = ParsingUtils.split(sb.toString(), columns, VCFConstants.FIELD_SEPARATOR_CHAR);
- Assert.assertEquals(columns[nCol-1], expectedLastColumn, "Format fields don't handle missing data in the expected way");
- }
-
- private Set<VCFHeaderLine> createSyntheticMetadata() {
- final Set<VCFHeaderLine> metaData = new TreeSet<VCFHeaderLine>();
-
- metaData.add(new VCFContigHeaderLine(Collections.singletonMap("ID", "1"), 0));
-
- metaData.add(new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.String, "x"));
- metaData.add(new VCFFormatHeaderLine("AA", 1, VCFHeaderLineType.String, "aa"));
- metaData.add(new VCFFormatHeaderLine("BB", 1, VCFHeaderLineType.Integer, "bb"));
- return metaData;
- }
-
- private VCFHeader createSyntheticHeader() {
- return new VCFHeader(createSyntheticMetadata());
- }
-
- private VCFHeader createSyntheticHeader(final List<String> samples) {
- return new VCFHeader(createSyntheticMetadata(), samples);
- }
-
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java
deleted file mode 100644
index 88a8cce..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineTranslatorUnitTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.tribble.TribbleException;
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-public class VCFHeaderLineTranslatorUnitTest extends VariantBaseTest {
-
- @Test
- public void testParseVCF4HeaderLine() {
- // the following tests exercise the escaping of quotes and backslashes in VCF header lines
-
- // test a case with no escapes
- final Map<String,String> values = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=SnpCluster,Description=\"SNPs found in clusters\">", null);
- Assert.assertEquals(values.size(), 2);
- Assert.assertEquals(values.get("ID"), "SnpCluster");
- Assert.assertEquals(values.get("Description"), "SNPs found in clusters");
-
- // test escaped quotes
- final Map<String,String> values2 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION != \\\"NA\\\" || ANNOTATION <= 0.01\">", null);
- Assert.assertEquals(values2.size(), 2);
- Assert.assertEquals(values2.get("ID"), "ANNOTATION");
- Assert.assertEquals(values2.get("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
-
- // test escaped quotes and an escaped backslash
- final Map<String,String> values3 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\\\= \\\"NA\\\" || ANNOTATION <= 0.01\">", null);
- Assert.assertEquals(values3.size(), 2);
- Assert.assertEquals(values3.get("ID"), "ANNOTATION");
- Assert.assertEquals(values3.get("Description"), "ANNOTATION \\= \"NA\" || ANNOTATION <= 0.01");
-
- // test a header line with two value tags, one with an escaped backslash and two escaped quotes, one with an escaped quote
- final Map<String,String> values4 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\\\= \\\"NA\\\" || ANNOTATION <= 0.01\", Description2=\"foo\\\"bar\">", null);
- Assert.assertEquals(values4.size(), 3);
- Assert.assertEquals(values4.get("ID"), "ANNOTATION");
- Assert.assertEquals(values4.get("Description"), "ANNOTATION \\= \"NA\" || ANNOTATION <= 0.01");
- Assert.assertEquals(values4.get("Description2"), "foo\"bar");
-
- // test a line with a backslash that appears before something other than a quote or backslash
- final Map<String,String> values5 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it\">", null);
- Assert.assertEquals(values5.size(), 2);
- Assert.assertEquals(values5.get("ID"), "ANNOTATION");
- Assert.assertEquals(values5.get("Description"), "ANNOTATION \\n with a newline in it");
-
- // test with an unclosed quote
- try {
- final Map<String, String> values6 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it>", null);
- Assert.fail("Should have thrown a TribbleException for having an unclosed quote in the description line");
- } catch (TribbleException.InvalidHeader e) {
- }
-
- // test with an escaped quote at the end
- try {
- final Map<String, String> values7 = VCFHeaderLineTranslator.parseLine(VCFHeaderVersion.VCF4_2, "<ID=ANNOTATION,Description=\"ANNOTATION \\n with a newline in it\\\">", null);
- Assert.fail("Should have thrown a TribbleException for having an unclosed quote in the description line");
- } catch (TribbleException.InvalidHeader e) {
- }
-
- }
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java
deleted file mode 100644
index 02cde53..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderLineUnitTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.annotations.Test;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-public class VCFHeaderLineUnitTest extends VariantBaseTest {
-
- @Test
- public void testEncodeVCFHeaderLineWithUnescapedQuotes() {
-
- final Map<String, String> attributes = new LinkedHashMap<>();
- attributes.put("ID", "VariantFiltration");
- attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \"NA\" || ANNOTATION <= 2.0]");
-
- final String encodedAttributes = VCFHeaderLine.toStringEncoding(attributes);
- assertNotNull(encodedAttributes);
-
- final String expectedEncoding = "<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">";
- assertEquals(encodedAttributes, expectedEncoding);
- }
-
-
- @Test
- public void testEncodeVCFHeaderLineWithEscapedQuotes() {
-
- final Map<String, String> attributes = new LinkedHashMap<>();
- attributes.put("ID", "VariantFiltration");
- attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]");
-
- final String encodedAttributes = VCFHeaderLine.toStringEncoding(attributes);
- assertNotNull(encodedAttributes);
-
- final String expectedEncoding = "<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">";
- assertEquals(encodedAttributes, expectedEncoding);
- }
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java
deleted file mode 100644
index e9135cc..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFHeaderUnitTest.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.samtools.util.CloseableIterator;
-import htsjdk.samtools.util.TestUtil;
-import htsjdk.tribble.TribbleException;
-import htsjdk.tribble.readers.*;
-import htsjdk.variant.VariantBaseTest;
-import htsjdk.variant.variantcontext.VariantContext;
-import htsjdk.variant.variantcontext.writer.Options;
-import htsjdk.variant.variantcontext.writer.VariantContextWriter;
-import htsjdk.variant.variantcontext.writer.VariantContextWriterBuilder;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by IntelliJ IDEA.
- * User: aaron
- * Date: Jun 30, 2010
- * Time: 3:32:08 PM
- * To change this template use File | Settings | File Templates.
- */
-public class VCFHeaderUnitTest extends VariantBaseTest {
-
- private File tempDir;
-
- private VCFHeader createHeader(String headerStr) {
- VCFCodec codec = new VCFCodec();
- VCFHeader header = (VCFHeader) codec.readActualHeader(new LineIteratorImpl(new SynchronousLineReader(
- new StringReader(headerStr))));
- Assert.assertEquals(header.getMetaDataInInputOrder().size(), VCF4headerStringCount);
- return header;
- }
-
- @BeforeClass
- private void createTemporaryDirectory() {
- tempDir = TestUtil.getTempDirectory("VCFHeader", "VCFHeaderTest");
- }
-
- @AfterClass
- private void deleteTemporaryDirectory() {
- for (File f : tempDir.listFiles()) {
- f.delete();
- }
- tempDir.delete();
- }
-
- @Test
- public void testVCF4ToVCF4() {
- VCFHeader header = createHeader(VCF4headerStrings);
- checkMD5ofHeaderFile(header, "91c33dadb92e01ea349bd4bcdd02d6be");
- }
-
- @Test
- public void testVCF4ToVCF4_alternate() {
- VCFHeader header = createHeader(VCF4headerStrings_with_negativeOne);
- checkMD5ofHeaderFile(header, "39318d9713897d55be5ee32a2119853f");
- }
-
- @Test
- public void testVCFHeaderSampleRenamingSingleSampleVCF() throws Exception {
- final VCFCodec codec = new VCFCodec();
- codec.setRemappedSampleName("FOOSAMPLE");
- final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "HiSeq.10000.vcf")));
- final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
-
- Assert.assertEquals(header.getNGenotypeSamples(), 1, "Wrong number of samples in remapped header");
- Assert.assertEquals(header.getGenotypeSamples().get(0), "FOOSAMPLE", "Sample name in remapped header has incorrect value");
-
- int recordCount = 0;
- while (vcfIterator.hasNext() && recordCount < 10) {
- recordCount++;
- final VariantContext vcfRecord = codec.decode(vcfIterator.next());
-
- Assert.assertEquals(vcfRecord.getSampleNames().size(), 1, "Wrong number of samples in vcf record after remapping");
- Assert.assertEquals(vcfRecord.getSampleNames().iterator().next(), "FOOSAMPLE", "Wrong sample in vcf record after remapping");
- }
- }
-
- @Test
- public void testVCFHeaderDictionaryMerging() {
- VCFHeader headerOne = new VCFFileReader(new File(variantTestDataRoot + "dbsnp_135.b37.1000.vcf"), false).getFileHeader();
- VCFHeader headerTwo = new VCFHeader(headerOne); // deep copy
- final List<String> sampleList = new ArrayList<String>();
- sampleList.addAll(headerOne.getSampleNamesInOrder());
-
- // Check that the two dictionaries start out the same
- headerOne.getSequenceDictionary().assertSameDictionary(headerTwo.getSequenceDictionary());
-
- // Run the merge command
- final VCFHeader mergedHeader = new VCFHeader(VCFUtils.smartMergeHeaders(Arrays.asList(headerOne, headerTwo), false), sampleList);
-
- // Check that the mergedHeader's sequence dictionary matches the first two
- mergedHeader.getSequenceDictionary().assertSameDictionary(headerOne.getSequenceDictionary());
- }
-
- @Test(expectedExceptions = TribbleException.class)
- public void testVCFHeaderSampleRenamingMultiSampleVCF() throws Exception {
- final VCFCodec codec = new VCFCodec();
- codec.setRemappedSampleName("FOOSAMPLE");
- final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "ex2.vcf")));
- final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
- }
-
- @Test(expectedExceptions = TribbleException.class)
- public void testVCFHeaderSampleRenamingSitesOnlyVCF() throws Exception {
- final VCFCodec codec = new VCFCodec();
- codec.setRemappedSampleName("FOOSAMPLE");
- final AsciiLineReaderIterator vcfIterator = new AsciiLineReaderIterator(new AsciiLineReader(new FileInputStream(variantTestDataRoot + "dbsnp_135.b37.1000.vcf")));
- final VCFHeader header = (VCFHeader) codec.readHeader(vcfIterator).getHeaderValue();
- }
-
- private VCFHeader getHiSeqVCFHeader() {
- final File vcf = new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf");
- final VCFFileReader reader = new VCFFileReader(vcf, false);
- final VCFHeader header = reader.getFileHeader();
- reader.close();
- return header;
- }
-
- @Test
- public void testVCFHeaderAddInfoLine() {
- final VCFHeader header = getHiSeqVCFHeader();
- final VCFInfoHeaderLine infoLine = new VCFInfoHeaderLine("TestInfoLine", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test info line");
- header.addMetaDataLine(infoLine);
-
- Assert.assertTrue(header.getInfoHeaderLines().contains(infoLine), "TestInfoLine not found in info header lines");
- Assert.assertTrue(header.getMetaDataInInputOrder().contains(infoLine), "TestInfoLine not found in set of all header lines");
- Assert.assertNotNull(header.getInfoHeaderLine("TestInfoLine"), "Lookup for TestInfoLine by key failed");
-
- Assert.assertFalse(header.getFormatHeaderLines().contains(infoLine), "TestInfoLine present in format header lines");
- Assert.assertFalse(header.getFilterLines().contains(infoLine), "TestInfoLine present in filter header lines");
- Assert.assertFalse(header.getContigLines().contains(infoLine), "TestInfoLine present in contig header lines");
- Assert.assertFalse(header.getOtherHeaderLines().contains(infoLine), "TestInfoLine present in other header lines");
- }
-
- @Test
- public void testVCFHeaderAddFormatLine() {
- final VCFHeader header = getHiSeqVCFHeader();
- final VCFFormatHeaderLine formatLine = new VCFFormatHeaderLine("TestFormatLine", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test format line");
- header.addMetaDataLine(formatLine);
-
- Assert.assertTrue(header.getFormatHeaderLines().contains(formatLine), "TestFormatLine not found in format header lines");
- Assert.assertTrue(header.getMetaDataInInputOrder().contains(formatLine), "TestFormatLine not found in set of all header lines");
- Assert.assertNotNull(header.getFormatHeaderLine("TestFormatLine"), "Lookup for TestFormatLine by key failed");
-
- Assert.assertFalse(header.getInfoHeaderLines().contains(formatLine), "TestFormatLine present in info header lines");
- Assert.assertFalse(header.getFilterLines().contains(formatLine), "TestFormatLine present in filter header lines");
- Assert.assertFalse(header.getContigLines().contains(formatLine), "TestFormatLine present in contig header lines");
- Assert.assertFalse(header.getOtherHeaderLines().contains(formatLine), "TestFormatLine present in other header lines");
- }
-
- @Test
- public void testVCFHeaderAddFilterLine() {
- final VCFHeader header = getHiSeqVCFHeader();
- final String filterDesc = "TestFilterLine Description";
- final VCFFilterHeaderLine filterLine = new VCFFilterHeaderLine("TestFilterLine",filterDesc);
- Assert.assertEquals(filterDesc,filterLine.getDescription());
- header.addMetaDataLine(filterLine);
-
- Assert.assertTrue(header.getFilterLines().contains(filterLine), "TestFilterLine not found in filter header lines");
- Assert.assertTrue(header.getMetaDataInInputOrder().contains(filterLine), "TestFilterLine not found in set of all header lines");
- Assert.assertNotNull(header.getFilterHeaderLine("TestFilterLine"), "Lookup for TestFilterLine by key failed");
-
- Assert.assertFalse(header.getInfoHeaderLines().contains(filterLine), "TestFilterLine present in info header lines");
- Assert.assertFalse(header.getFormatHeaderLines().contains(filterLine), "TestFilterLine present in format header lines");
- Assert.assertFalse(header.getContigLines().contains(filterLine), "TestFilterLine present in contig header lines");
- Assert.assertFalse(header.getOtherHeaderLines().contains(filterLine), "TestFilterLine present in other header lines");
- }
-
- @Test
- public void testVCFHeaderAddContigLine() {
- final VCFHeader header = getHiSeqVCFHeader();
- final VCFContigHeaderLine contigLine = new VCFContigHeaderLine("<ID=chr1,length=1234567890,assembly=FAKE,md5=f126cdf8a6e0c7f379d618ff66beb2da,species=\"Homo sapiens\">", VCFHeaderVersion.VCF4_0, "chr1", 0);
- header.addMetaDataLine(contigLine);
-
- Assert.assertTrue(header.getContigLines().contains(contigLine), "Test contig line not found in contig header lines");
- Assert.assertTrue(header.getMetaDataInInputOrder().contains(contigLine), "Test contig line not found in set of all header lines");
-
- Assert.assertFalse(header.getInfoHeaderLines().contains(contigLine), "Test contig line present in info header lines");
- Assert.assertFalse(header.getFormatHeaderLines().contains(contigLine), "Test contig line present in format header lines");
- Assert.assertFalse(header.getFilterLines().contains(contigLine), "Test contig line present in filter header lines");
- Assert.assertFalse(header.getOtherHeaderLines().contains(contigLine), "Test contig line present in other header lines");
- }
-
- @Test
- public void testVCFHeaderAddOtherLine() {
- final VCFHeader header = getHiSeqVCFHeader();
- final VCFHeaderLine otherLine = new VCFHeaderLine("TestOtherLine", "val");
- header.addMetaDataLine(otherLine);
-
- Assert.assertTrue(header.getOtherHeaderLines().contains(otherLine), "TestOtherLine not found in other header lines");
- Assert.assertTrue(header.getMetaDataInInputOrder().contains(otherLine), "TestOtherLine not found in set of all header lines");
- Assert.assertNotNull(header.getOtherHeaderLine("TestOtherLine"), "Lookup for TestOtherLine by key failed");
-
- Assert.assertFalse(header.getInfoHeaderLines().contains(otherLine), "TestOtherLine present in info header lines");
- Assert.assertFalse(header.getFormatHeaderLines().contains(otherLine), "TestOtherLine present in format header lines");
- Assert.assertFalse(header.getContigLines().contains(otherLine), "TestOtherLine present in contig header lines");
- Assert.assertFalse(header.getFilterLines().contains(otherLine), "TestOtherLine present in filter header lines");
- }
-
- @Test
- public void testVCFHeaderAddMetaDataLineDoesNotDuplicateContigs() {
- File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
- VCFFileReader reader = new VCFFileReader(input, false);
- VCFHeader header = reader.getFileHeader();
-
- final int numContigLinesBefore = header.getContigLines().size();
-
- VCFInfoHeaderLine newInfoField = new VCFInfoHeaderLine("test", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.String, "test info field");
- header.addMetaDataLine(newInfoField);
-
- // getting the sequence dictionary was failing due to duplicating contigs in issue #214,
- // we expect this to not throw an exception
- header.getSequenceDictionary();
-
- final int numContigLinesAfter = header.getContigLines().size();
- // assert that we have the same number of contig lines before and after
- Assert.assertEquals(numContigLinesBefore, numContigLinesAfter);
- }
-
- @Test
- public void testVCFHeaderAddDuplicateContigLine() {
- File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
- VCFFileReader reader = new VCFFileReader(input, false);
- VCFHeader header = reader.getFileHeader();
-
-
- final int numContigLinesBefore = header.getContigLines().size();
- // try to readd the first contig line
- header.addMetaDataLine(header.getContigLines().get(0));
- final int numContigLinesAfter = header.getContigLines().size();
-
- // assert that we have the same number of contig lines before and after
- Assert.assertEquals(numContigLinesBefore, numContigLinesAfter);
- }
-
- @Test
- public void testVCFHeaderAddDuplicateHeaderLine() {
- File input = new File("src/test/resources/htsjdk/variant/ex2.vcf");
-
- VCFFileReader reader = new VCFFileReader(input, false);
- VCFHeader header = reader.getFileHeader();
-
- VCFHeaderLine newHeaderLine = new VCFHeaderLine("key", "value");
- // add this new header line
- header.addMetaDataLine(newHeaderLine);
-
- final int numHeaderLinesBefore = header.getOtherHeaderLines().size();
- // readd the same header line
- header.addMetaDataLine(newHeaderLine);
- final int numHeaderLinesAfter = header.getOtherHeaderLines().size();
-
- // assert that we have the same number of other header lines before and after
- Assert.assertEquals(numHeaderLinesBefore, numHeaderLinesAfter);
- }
-
- @Test
- public void testVCFHeaderSerialization() throws Exception {
- final VCFFileReader reader = new VCFFileReader(new File("src/test/resources/htsjdk/variant/HiSeq.10000.vcf"), false);
- final VCFHeader originalHeader = reader.getFileHeader();
- reader.close();
-
- final VCFHeader deserializedHeader = TestUtil.serializeAndDeserialize(originalHeader);
-
- Assert.assertEquals(deserializedHeader.getMetaDataInInputOrder(), originalHeader.getMetaDataInInputOrder(), "Header metadata does not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getContigLines(), originalHeader.getContigLines(), "Contig header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getFilterLines(), originalHeader.getFilterLines(), "Filter header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getFormatHeaderLines(), originalHeader.getFormatHeaderLines(), "Format header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getIDHeaderLines(), originalHeader.getIDHeaderLines(), "ID header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getInfoHeaderLines(), originalHeader.getInfoHeaderLines(), "Info header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getOtherHeaderLines(), originalHeader.getOtherHeaderLines(), "Other header lines do not match before/after serialization");
- Assert.assertEquals(deserializedHeader.getGenotypeSamples(), originalHeader.getGenotypeSamples(), "Genotype samples not the same before/after serialization");
- Assert.assertEquals(deserializedHeader.samplesWereAlreadySorted(), originalHeader.samplesWereAlreadySorted(), "Sortedness of samples not the same before/after serialization");
- Assert.assertEquals(deserializedHeader.getSampleNamesInOrder(), originalHeader.getSampleNamesInOrder(), "Sorted list of sample names in header not the same before/after serialization");
- Assert.assertEquals(deserializedHeader.getSampleNameToOffset(), originalHeader.getSampleNameToOffset(), "Sample name to offset map not the same before/after serialization");
- Assert.assertEquals(deserializedHeader.toString(), originalHeader.toString(), "String representation of header not the same before/after serialization");
- }
-
- @Test
- public void testVCFHeaderQuoteEscaping() throws Exception {
- // this test ensures that the end-to-end process of quote escaping is stable when headers are
- // read and re-written; ie that quotes that are already escaped won't be re-escaped. It does
- // this by reading a test file, adding a header line with an unescaped quote, writing out a copy
- // of the file, reading it back in and writing a second copy, and finally reading back the second
- // copy and comparing it to the first.
-
- // read an existing VCF
- final VCFFileReader originalFileReader = new VCFFileReader(new File("src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf"), false);
- final VCFHeader originalHeader = originalFileReader.getFileHeader();
-
- // add a header line with quotes to the header
- final Map<String, String> attributes = new LinkedHashMap<>();
- attributes.put("ID", "VariantFiltration");
- attributes.put("CommandLineOptions", "filterName=[ANNOTATION] filterExpression=[ANNOTATION == \"NA\" || ANNOTATION <= 2.0]");
- final VCFSimpleHeaderLine addedHeaderLine = new VCFSimpleHeaderLine("GATKCommandLine.Test", attributes);
- originalHeader.addMetaDataLine(addedHeaderLine);
-
- final VCFFilterHeaderLine originalCopyAnnotationLine1 = originalHeader.getFilterHeaderLine("ANNOTATION");
- Assert.assertNotNull(originalCopyAnnotationLine1);
- Assert.assertEquals(originalCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01", originalCopyAnnotationLine1.toString());
-
- final VCFFilterHeaderLine originalCopyAnnotationLine2 = originalHeader.getFilterHeaderLine("ANNOTATION2");
- Assert.assertNotNull(originalCopyAnnotationLine2);
- Assert.assertEquals(originalCopyAnnotationLine2.getGenericFieldValue("Description"), "ANNOTATION with quote \" that is unmatched but escaped");
-
- final VCFInfoHeaderLine originalEscapingQuoteInfoLine = originalHeader.getInfoHeaderLine("EscapingQuote");
- Assert.assertNotNull(originalEscapingQuoteInfoLine);
- Assert.assertEquals(originalEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
- final VCFInfoHeaderLine originalEscapingBackslashInfoLine = originalHeader.getInfoHeaderLine("EscapingBackslash");
- Assert.assertNotNull(originalEscapingBackslashInfoLine);
- Assert.assertEquals(originalEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
- final VCFInfoHeaderLine originalEscapingNonQuoteOrBackslashInfoLine = originalHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
- Assert.assertNotNull(originalEscapingNonQuoteOrBackslashInfoLine);
- Assert.assertEquals(originalEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
- // write the file out into a new copy
- final File firstCopyVCFFile = File.createTempFile("testEscapeHeaderQuotes1.", ".vcf");
- firstCopyVCFFile.deleteOnExit();
-
- final VariantContextWriter firstCopyWriter = new VariantContextWriterBuilder()
- .setOutputFile(firstCopyVCFFile)
- .setReferenceDictionary(createArtificialSequenceDictionary())
- .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
- .build();
- firstCopyWriter.writeHeader(originalHeader);
- final CloseableIterator<VariantContext> firstCopyVariantIterator = originalFileReader.iterator();
- while (firstCopyVariantIterator.hasNext()) {
- VariantContext variantContext = firstCopyVariantIterator.next();
- firstCopyWriter.add(variantContext);
- }
- originalFileReader.close();
- firstCopyWriter.close();
-
- // read the copied file back in
- final VCFFileReader firstCopyReader = new VCFFileReader(firstCopyVCFFile, false);
- final VCFHeader firstCopyHeader = firstCopyReader.getFileHeader();
- final VCFHeaderLine firstCopyNewHeaderLine = firstCopyHeader.getOtherHeaderLine("GATKCommandLine.Test");
- Assert.assertNotNull(firstCopyNewHeaderLine);
-
- final VCFFilterHeaderLine firstCopyAnnotationLine1 = firstCopyHeader.getFilterHeaderLine("ANNOTATION");
- Assert.assertNotNull(firstCopyAnnotationLine1);
- Assert.assertEquals(firstCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
-
- final VCFFilterHeaderLine firstCopyAnnotationLine2 = firstCopyHeader.getFilterHeaderLine("ANNOTATION2");
- Assert.assertNotNull(firstCopyAnnotationLine2);
-
- final VCFInfoHeaderLine firstCopyEscapingQuoteInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingQuote");
- Assert.assertNotNull(firstCopyEscapingQuoteInfoLine);
- Assert.assertEquals(firstCopyEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
- final VCFInfoHeaderLine firstCopyEscapingBackslashInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingBackslash");
- Assert.assertNotNull(firstCopyEscapingBackslashInfoLine);
- Assert.assertEquals(firstCopyEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
- final VCFInfoHeaderLine firstCopyEscapingNonQuoteOrBackslashInfoLine = firstCopyHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
- Assert.assertNotNull(firstCopyEscapingNonQuoteOrBackslashInfoLine);
- Assert.assertEquals(firstCopyEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
-
- // write one more copy to make sure things don't get double escaped
- final File secondCopyVCFFile = File.createTempFile("testEscapeHeaderQuotes2.", ".vcf");
- secondCopyVCFFile.deleteOnExit();
- final VariantContextWriter secondCopyWriter = new VariantContextWriterBuilder()
- .setOutputFile(secondCopyVCFFile)
- .setReferenceDictionary(createArtificialSequenceDictionary())
- .setOptions(EnumSet.of(Options.ALLOW_MISSING_FIELDS_IN_HEADER, Options.INDEX_ON_THE_FLY))
- .build();
- secondCopyWriter.writeHeader(firstCopyHeader);
- final CloseableIterator<VariantContext> secondCopyVariantIterator = firstCopyReader.iterator();
- while (secondCopyVariantIterator.hasNext()) {
- VariantContext variantContext = secondCopyVariantIterator.next();
- secondCopyWriter.add(variantContext);
- }
- secondCopyWriter.close();
-
- // read the second copy back in and verify that the two files have the same header line
- final VCFFileReader secondCopyReader = new VCFFileReader(secondCopyVCFFile, false);
- final VCFHeader secondCopyHeader = secondCopyReader.getFileHeader();
-
- final VCFHeaderLine secondCopyNewHeaderLine = secondCopyHeader.getOtherHeaderLine("GATKCommandLine.Test");
- Assert.assertNotNull(secondCopyNewHeaderLine);
-
- final VCFFilterHeaderLine secondCopyAnnotationLine1 = secondCopyHeader.getFilterHeaderLine("ANNOTATION");
- Assert.assertNotNull(secondCopyAnnotationLine1);
-
- final VCFFilterHeaderLine secondCopyAnnotationLine2 = secondCopyHeader.getFilterHeaderLine("ANNOTATION2");
- Assert.assertNotNull(secondCopyAnnotationLine2);
-
- Assert.assertEquals(firstCopyNewHeaderLine, secondCopyNewHeaderLine);
- Assert.assertEquals(firstCopyNewHeaderLine.toStringEncoding(), "GATKCommandLine.Test=<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">");
- Assert.assertEquals(secondCopyNewHeaderLine.toStringEncoding(), "GATKCommandLine.Test=<ID=VariantFiltration,CommandLineOptions=\"filterName=[ANNOTATION] filterExpression=[ANNOTATION == \\\"NA\\\" || ANNOTATION <= 2.0]\">");
-
- Assert.assertEquals(firstCopyAnnotationLine1, secondCopyAnnotationLine1);
- Assert.assertEquals(secondCopyAnnotationLine1.getGenericFieldValue("Description"), "ANNOTATION != \"NA\" || ANNOTATION <= 0.01");
- Assert.assertEquals(firstCopyAnnotationLine2, secondCopyAnnotationLine2);
- Assert.assertEquals(secondCopyAnnotationLine2.getGenericFieldValue("Description"), "ANNOTATION with quote \" that is unmatched but escaped");
-
- final VCFInfoHeaderLine secondCopyEscapingQuoteInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingQuote");
- Assert.assertNotNull(secondCopyEscapingQuoteInfoLine);
- Assert.assertEquals(secondCopyEscapingQuoteInfoLine.getDescription(), "This description has an escaped \" quote in it");
-
- final VCFInfoHeaderLine secondCopyEscapingBackslashInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingBackslash");
- Assert.assertNotNull(secondCopyEscapingBackslashInfoLine);
- Assert.assertEquals(secondCopyEscapingBackslashInfoLine.getDescription(), "This description has an escaped \\ backslash in it");
-
- final VCFInfoHeaderLine secondCopyEscapingNonQuoteOrBackslashInfoLine = secondCopyHeader.getInfoHeaderLine("EscapingNonQuoteOrBackslash");
- Assert.assertNotNull(secondCopyEscapingNonQuoteOrBackslashInfoLine);
- Assert.assertEquals(secondCopyEscapingNonQuoteOrBackslashInfoLine.getDescription(), "This other value has a \\n newline in it");
-
- firstCopyReader.close();
- secondCopyReader.close();
-
- }
-
- /**
- * a little utility function for all tests to md5sum a file
- * Shameless taken from:
- * <p/>
- * http://www.javalobby.org/java/forums/t84420.html
- *
- * @param file the file
- * @return a string
- */
- private static String md5SumFile(File file) {
- MessageDigest digest;
- try {
- digest = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("Unable to find MD5 digest");
- }
- InputStream is;
- try {
- is = new FileInputStream(file);
- } catch (FileNotFoundException e) {
- throw new RuntimeException("Unable to open file " + file);
- }
- byte[] buffer = new byte[8192];
- int read;
- try {
- while ((read = is.read(buffer)) > 0) {
- digest.update(buffer, 0, read);
- }
- byte[] md5sum = digest.digest();
- BigInteger bigInt = new BigInteger(1, md5sum);
- return bigInt.toString(16);
-
- } catch (IOException e) {
- throw new RuntimeException("Unable to process file for MD5", e);
- } finally {
- try {
- is.close();
- } catch (IOException e) {
- throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
- }
- }
- }
-
- private void checkMD5ofHeaderFile(VCFHeader header, String md5sum) {
- File myTempFile = null;
- PrintWriter pw = null;
- try {
- myTempFile = File.createTempFile("VCFHeader", "vcf");
- myTempFile.deleteOnExit();
- pw = new PrintWriter(myTempFile);
- } catch (IOException e) {
- Assert.fail("Unable to make a temp file!");
- }
- for (VCFHeaderLine line : header.getMetaDataInSortedOrder())
- pw.println(line);
- pw.close();
- Assert.assertEquals(md5SumFile(myTempFile), md5sum);
- }
-
- public static int VCF4headerStringCount = 16;
-
- public static String VCF4headerStrings =
- "##fileformat=VCFv4.2\n" +
- "##filedate=2010-06-21\n" +
- "##reference=NCBI36\n" +
- "##INFO=<ID=GC, Number=0, Type=Flag, Description=\"Overlap with Gencode CCDS coding sequence\">\n" +
- "##INFO=<ID=DP, Number=1, Type=Integer, Description=\"Total number of reads in haplotype window\">\n" +
- "##INFO=<ID=AF, Number=A, Type=Float, Description=\"Dindel estimated population allele frequency\">\n" +
- "##INFO=<ID=CA, Number=1, Type=String, Description=\"Pilot 1 callability mask\">\n" +
- "##INFO=<ID=HP, Number=1, Type=Integer, Description=\"Reference homopolymer tract length\">\n" +
- "##INFO=<ID=NS, Number=1, Type=Integer, Description=\"Number of samples with data\">\n" +
- "##INFO=<ID=DB, Number=0, Type=Flag, Description=\"dbSNP membership build 129 - type match and indel sequence length match within 25 bp\">\n" +
- "##INFO=<ID=NR, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on reverse strand\">\n" +
- "##INFO=<ID=NF, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on forward strand\">\n" +
- "##FILTER=<ID=NoQCALL, Description=\"Variant called by Dindel but not confirmed by QCALL\">\n" +
- "##FORMAT=<ID=GT, Number=1, Type=String, Description=\"Genotype\">\n" +
- "##FORMAT=<ID=HQ, Number=2, Type=Integer, Description=\"Haplotype quality\">\n" +
- "##FORMAT=<ID=GQ, Number=1, Type=Integer, Description=\"Genotype quality\">\n" +
- "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n";
-
-
- public static String VCF4headerStrings_with_negativeOne =
- "##fileformat=VCFv4.2\n" +
- "##filedate=2010-06-21\n" +
- "##reference=NCBI36\n" +
- "##INFO=<ID=GC, Number=0, Type=Flag, Description=\"Overlap with Gencode CCDS coding sequence\">\n" +
- "##INFO=<ID=YY, Number=., Type=Integer, Description=\"Some weird value that has lots of parameters\">\n" +
- "##INFO=<ID=AF, Number=A, Type=Float, Description=\"Dindel estimated population allele frequency\">\n" +
- "##INFO=<ID=CA, Number=1, Type=String, Description=\"Pilot 1 callability mask\">\n" +
- "##INFO=<ID=HP, Number=1, Type=Integer, Description=\"Reference homopolymer tract length\">\n" +
- "##INFO=<ID=NS, Number=1, Type=Integer, Description=\"Number of samples with data\">\n" +
- "##INFO=<ID=DB, Number=0, Type=Flag, Description=\"dbSNP membership build 129 - type match and indel sequence length match within 25 bp\">\n" +
- "##INFO=<ID=NR, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on reverse strand\">\n" +
- "##INFO=<ID=NF, Number=1, Type=Integer, Description=\"Number of reads covering non-ref variant on forward strand\">\n" +
- "##FILTER=<ID=NoQCALL, Description=\"Variant called by Dindel but not confirmed by QCALL\">\n" +
- "##FORMAT=<ID=GT, Number=1, Type=String, Description=\"Genotype\">\n" +
- "##FORMAT=<ID=HQ, Number=2, Type=Integer, Description=\"Haplotype quality\">\n" +
- "##FORMAT=<ID=TT, Number=., Type=Integer, Description=\"Lots of TTs\">\n" +
- "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n";
-
-}
diff --git a/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java b/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java
deleted file mode 100644
index f72cd87..0000000
--- a/src/test/java/htsjdk/variant/vcf/VCFStandardHeaderLinesUnitTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
-* Copyright (c) 2012 The Broad Institute
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-package htsjdk.variant.vcf;
-
-import htsjdk.variant.VariantBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Created by IntelliJ IDEA.
- * User: aaron
- * Date: Jun 30, 2010
- * Time: 3:32:08 PM
- * To change this template use File | Settings | File Templates.
- */
-public class VCFStandardHeaderLinesUnitTest extends VariantBaseTest {
- @DataProvider(name = "getStandardLines")
- public Object[][] makeGetStandardLines() {
- List<Object[]> tests = new ArrayList<Object[]>();
-
- // info
- tests.add(new Object[]{"AC", "info", true});
- tests.add(new Object[]{"AN", "info", true});
- tests.add(new Object[]{"AF", "info", true});
- tests.add(new Object[]{"DP", "info", true});
- tests.add(new Object[]{"DB", "info", true});
- tests.add(new Object[]{"END", "info", true});
- tests.add(new Object[]{"SB", "info", true});
- tests.add(new Object[]{"MQ", "info", true});
- tests.add(new Object[]{"MQ0", "info", true});
- tests.add(new Object[]{"SOMATIC", "info", true});
-
- // format
- tests.add(new Object[]{"GT", "format", true});
- tests.add(new Object[]{"GQ", "format", true});
- tests.add(new Object[]{"DP", "format", true});
- tests.add(new Object[]{"AD", "format", true});
- tests.add(new Object[]{"PL", "format", true});
- tests.add(new Object[]{"FT", "format", true});
- tests.add(new Object[]{"PQ", "format", true});
-
- tests.add(new Object[]{"NOT_STANDARD", "info", false});
- tests.add(new Object[]{"NOT_STANDARD", "format", false});
-
- return tests.toArray(new Object[][]{});
- }
-
-
- @Test(dataProvider = "getStandardLines")
- public void getStandardLines(final String key, final String type, final boolean expectedToBeStandard) {
- VCFCompoundHeaderLine line = null;
- if ( type.equals("info") )
- line = VCFStandardHeaderLines.getInfoLine(key, false);
- else if ( type.equals("format") )
- line = VCFStandardHeaderLines.getFormatLine(key, false);
- else
- throw new IllegalArgumentException("Unexpected type in getStandardLines " + type);
-
- if ( expectedToBeStandard ) {
- Assert.assertNotNull(line);
- Assert.assertEquals(line.getID(), key);
- Assert.assertTrue(deeperTest(line));
- } else {
- Assert.assertNull(line);
- }
- }
-
- private boolean deeperTest(final VCFCompoundHeaderLine line){
-
- final String id = line.getID();
- if(id.equals(VCFConstants.GENOTYPE_KEY))
- return line.getType().equals(VCFHeaderLineType.String) && line.getCount()==1 ;
- else if(id.equals(VCFConstants.GENOTYPE_QUALITY_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.DEPTH_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.GENOTYPE_PL_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.G);
- else if(id.equals(VCFConstants.GENOTYPE_ALLELE_DEPTHS))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.R);
- else if(id.equals(VCFConstants.GENOTYPE_FILTER_KEY))
- return line.getType().equals(VCFHeaderLineType.String) && line.getCountType().equals(VCFHeaderLineCount.UNBOUNDED);
- else if(id.equals(VCFConstants.PHASE_QUALITY_KEY))
- return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
- else if(id.equals(VCFConstants.END_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.DBSNP_KEY))
- return line.getType().equals(VCFHeaderLineType.Flag) && line.getCount()==0;
- else if(id.equals(VCFConstants.DEPTH_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.STRAND_BIAS_KEY))
- return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
- else if(id.equals(VCFConstants.ALLELE_FREQUENCY_KEY))
- return line.getType().equals(VCFHeaderLineType.Float) && line.getCountType().equals(VCFHeaderLineCount.A);
- else if(id.equals(VCFConstants.ALLELE_COUNT_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCountType().equals(VCFHeaderLineCount.A);
- else if(id.equals(VCFConstants.ALLELE_NUMBER_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.MAPPING_QUALITY_ZERO_KEY))
- return line.getType().equals(VCFHeaderLineType.Integer) && line.getCount()==1;
- else if(id.equals(VCFConstants.RMS_MAPPING_QUALITY_KEY))
- return line.getType().equals(VCFHeaderLineType.Float) && line.getCount()==1;
- else if(id.equals(VCFConstants.SOMATIC_KEY))
- return line.getType().equals(VCFHeaderLineType.Flag) && line.getCount()==0;
- else
- throw new IllegalArgumentException("Unexpected id : " + id);
- }
-
- private class RepairHeaderTest {
- final VCFCompoundHeaderLine original, expectedResult;
-
- private RepairHeaderTest(final VCFCompoundHeaderLine original) {
- this(original, original);
- }
-
- private RepairHeaderTest(final VCFCompoundHeaderLine original, final VCFCompoundHeaderLine expectedResult) {
- this.original = original;
- this.expectedResult = expectedResult;
- }
-
- public String toString() {
- return "RepairHeaderTest: Original: " + original.toStringEncoding() + " Expected: " + expectedResult.toStringEncoding();
- }
- }
-
- @DataProvider(name = "RepairHeaderTest")
- public Object[][] makeRepairHeaderTest() {
- final VCFInfoHeaderLine standardAC = VCFStandardHeaderLines.getInfoLine("AC");
- final VCFInfoHeaderLine goodAC = new VCFInfoHeaderLine("AC", VCFHeaderLineCount.A, VCFHeaderLineType.Integer, "x");
-
- final VCFFormatHeaderLine standardGT = VCFStandardHeaderLines.getFormatLine("GT");
- final VCFFormatHeaderLine goodGT = new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.String, "x");
-
- List<Object[]> tests = new ArrayList<Object[]>();
-
- tests.add(new Object[]{new RepairHeaderTest( standardGT, standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( goodGT, goodGT )});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 2, VCFHeaderLineType.String, "x"), standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.Integer, "x"), standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", 1, VCFHeaderLineType.Float, "x"), standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Float, "x"), standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.G, VCFHeaderLineType.String, "x"), standardGT)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("GT", VCFHeaderLineCount.A, VCFHeaderLineType.String, "x"), standardGT)});
-
- tests.add(new Object[]{new RepairHeaderTest( standardAC, standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( goodAC, goodAC )});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.Integer, "x"), standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", VCFHeaderLineCount.G, VCFHeaderLineType.Integer, "x"), standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", VCFHeaderLineCount.UNBOUNDED, VCFHeaderLineType.Integer, "x"), standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.Float, "x"), standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 1, VCFHeaderLineType.String, "x"), standardAC)});
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("AC", 0, VCFHeaderLineType.Flag, "x"), standardAC)});
-
- tests.add(new Object[]{new RepairHeaderTest( new VCFInfoHeaderLine("NON_STANDARD_INFO", 1, VCFHeaderLineType.String, "x"))});
- tests.add(new Object[]{new RepairHeaderTest( new VCFFormatHeaderLine("NON_STANDARD_FORMAT", 1, VCFHeaderLineType.String, "x"))});
-
- return tests.toArray(new Object[][]{});
- }
-
- @Test(dataProvider = "RepairHeaderTest")
- public void testRepairHeaderTest(final RepairHeaderTest cfg) {
- final VCFHeader toRepair = new VCFHeader(Collections.singleton((VCFHeaderLine)cfg.original));
- final VCFHeader repaired = VCFStandardHeaderLines.repairStandardHeaderLines(toRepair);
-
- VCFCompoundHeaderLine repairedLine = (VCFCompoundHeaderLine)repaired.getFormatHeaderLine(cfg.original.getID());
- if ( repairedLine == null ) repairedLine = (VCFCompoundHeaderLine)repaired.getInfoHeaderLine(cfg.original.getID());
-
- Assert.assertNotNull(repairedLine, "Repaired header didn't contain the expected line");
- Assert.assertEquals(repairedLine.getID(), cfg.expectedResult.getID());
- Assert.assertEquals(repairedLine.getType(), cfg.expectedResult.getType());
- Assert.assertEquals(repairedLine.getCountType(), cfg.expectedResult.getCountType());
- if ( repairedLine.getCountType() == VCFHeaderLineCount.INTEGER ) {
- Assert.assertEquals(repairedLine.getCount(), cfg.expectedResult.getCount());
- }
- }
-}
diff --git a/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam b/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam
deleted file mode 100755
index 5a926af..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMCigarOverflowTest/CigarOverflowTest.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam
deleted file mode 100644
index 8aa4751..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai
deleted file mode 100644
index 49b423e..0000000
Binary files a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/index_test.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam
deleted file mode 120000
index 53313ae..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai
deleted file mode 120000
index 0f95610..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_with_index.bam.bai
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam.bai
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam b/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam
deleted file mode 120000
index 53313ae..0000000
--- a/src/test/resources/htsjdk/samtools/BAMFileIndexTest/symlink_without_linked_index.bam
+++ /dev/null
@@ -1 +0,0 @@
-index_test.bam
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam b/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam
deleted file mode 100755
index ab0e1a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam b/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam
deleted file mode 100644
index a1349e9..0000000
--- a/src/test/resources/htsjdk/samtools/SAMIntegerTagTest/variousAttributes.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD VN:1.0
- at SQ SN:chr20 AS:HG18 LN:62435964
-read_28833_29006_6945 99 chr20 28833 20 10M1D25M = 28993 195 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< MF:i:130 Nm:i:1 H0:i:0 H1:i:0 SB:i:-128 UB:i:129 SS:i:32767 US:i:65535 SI:i:2147483647 I2:i:-2147483647 UI:i:4294967295
-
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam
deleted file mode 100755
index 671814e..0000000
Binary files a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome1to10.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam
deleted file mode 100755
index d32ab86..0000000
Binary files a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/Chromosome5to9.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam
deleted file mode 100644
index a6963c2..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file1.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:something
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam
deleted file mode 100644
index 17a41ab..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/chr11sub_file2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:A
- at PG ID:1.1 PN:B
- at PG ID:2 PN:C PP:1
- at PG ID:2.1 PN:D PP:1.1
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam
deleted file mode 100644
index c43a2e9..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case1/expected_output.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD VN:1.5 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 PL:ILLUMINA SM:sample1
- at PG ID:1 PN:something
- at PG ID:1.1 PN:A
- at PG ID:1.1.2 PN:B
- at PG ID:2 PN:C PP:1.1
- at PG ID:2.1 PN:D PP:1.1.2
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam
deleted file mode 100644
index a2575f0..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file1.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:A
- at PG ID:2 PN:B PP:1
- at PG ID:3 PN:C PP:1
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI 73 chrM 50921 0 101M = 50921 0 CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN 97:>?A>>BB>@B@?@CA5@?5=C@############################################################################ RG:Z:1 E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################ [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam
deleted file mode 100644
index 5e6e7ea..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file2.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:A
- at PG ID:2 PN:B PP:1
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam
deleted file mode 100644
index 6bda955..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file3.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample2 PL:ILLUMINA
- at PG ID:1 PN:X
- at PG ID:2 PN:B PP:1
- at PG ID:3 PN:Y PP:2
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI 73 chrM 50921 0 101M = 50921 0 CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN 97:>?A>>BB>@B@?@CA5@?5=C@############################################################################ RG:Z:1 E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################ [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam
deleted file mode 100644
index d0c43d7..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/chr11sub_file4.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD VN:1.0 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1.1 SM:sample3 PL:ILLUMINA
- at PG ID:2 PN:B
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1.1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@ [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam
deleted file mode 100644
index 6755f30..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/case2/expected_output.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD VN:1.5 GO:none SO:coordinate
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 PL:ILLUMINA SM:sample1
- at RG ID:1.1 PL:ILLUMINA SM:sample2
- at RG ID:1.1.2 PL:ILLUMINA SM:sample3
- at PG ID:1 PN:A
- at PG ID:1.1 PN:X
- at PG ID:2 PN:B
- at PG ID:2.3 PN:B PP:1
- at PG ID:2.4 PN:B PP:1.1
- at PG ID:3 PN:C PP:1
- at PG ID:3.6 PN:Y PP:2.4
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1.1.1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACC [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C [...]
-6194MAAXX100108:2:55:3087:12679:BI 99 chrM 50418 0 101M = 50678 360 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1.1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@ [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1.1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCC [...]
-6194MAAXX100108:2:55:3087:12679:BI 147 chrM 50678 0 101M = 50418 -360 TATATATATAGAAAGAGAGAGAGGCAGAGATGTAAAGTAATTTATGGAGTTTGATGTTATGTCAGGGTAATTACATGATTATATAATTAACAGGTTTCTTT :99:=>?@>BABAAAC at CACAC@@BCACAAC;=BBC at AB@BB@@B@@CABBB@@B at C@@B@@AC@@@@A at B@>A at B@@B@@@@@A?A?@<?@=<>>;<=<9 RG:Z:1 E2:Z:ATATATATATTGGGAGTGTTTGTTACTCTTCTGTTCTGTTAGATGTTCTAGCTTCTGACCTCTCTTTGCCGCCACCTCCCCCCCCCCCCCACTTCCGACCC OQ:Z:CDCCCADCACCD at AC@CCCCCDCCCCCCCCCC;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBCCCC [...]
-6194MAAXX100108:2:55:19789:20399:BI 73 chrM 50921 0 101M = 50921 0 CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN 97:>?A>>BB>@B@?@CA5@?5=C@############################################################################ RG:Z:1.1 E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??########################################################################### [...]
-6194MAAXX100108:2:55:19789:20399:BI 73 chrM 50921 0 101M = 50921 0 CAACCAGAAACCAGGCTGGGCGCTANAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAGCTTACTGTCTAGAGGGCGAGGTACAAANNNNNN 97:>?A>>BB>@B@?@CA5@?5=C@############################################################################ RG:Z:1 E2:Z:ACCAAGTGGGAAGTTAGTTAAAAGGTCATTTTTTTTTTTTTTTTTTTGTTGTTTTGTTTTTTTCCCCAAAATACCATATTTTTTAAGATATTTTTTTTTGT OQ:Z:C>CCCC@@C@@CC@?CCC2@?8<??############################################################################ [...]
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam
deleted file mode 100644
index f4f16f8..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/1.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.0 GO:none SO:unsorted
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:A
- at PG ID:1.1 PN:B
- at PG ID:2 PN:C PP:1
- at PG ID:2.1 PN:D PP:1.1
-A 0 chrM 100 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:1 NM:i:0 UQ:i:0
-F 0 chrM 600 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:1.1 NM:i:0 UQ:i:0
-E 0 chrM 500 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:2 NM:i:0 UQ:i:0
-D 0 chrM 400 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:2.1 NM:i:0 UQ:i:0
diff --git a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam b/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam
deleted file mode 100644
index 70991a7..0000000
--- a/src/test/resources/htsjdk/samtools/SamFileHeaderMergerTest/unsorted_input/2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.0 GO:none SO:unsorted
- at SQ SN:chrM LN:16571 AS:HG18 UR:/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb SP:Homo sapiens
- at RG ID:1 SM:sample1 PL:ILLUMINA
- at PG ID:1 PN:A
- at PG ID:1.1 PN:B
- at PG ID:2 PN:C PP:1
- at PG ID:2.1 PN:D PP:1.1
-H 0 chrM 800 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:1 NM:i:0 UQ:i:0
-B 0 chrM 200 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:1.1 NM:i:0 UQ:i:0
-C 0 chrM 300 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:2 NM:i:0 UQ:i:0
-G 0 chrM 700 0 101M * 0 0 TCAAACATAGTCAAAGAGAGGGAGATTTCTGGATAATCACTTAAGCCCATGGTTAAACATAAATGCAAATATGTTAATGTTTACTGAATAACTTATCTGTG 9<9 at A?A@?A=@BCCA at B@BAA at B@ABBACAA at A@C at ABACB@CBAA at BABA>BACCABAACDABABCCAA at B?BACAB>CCAABBACAAD?CB>?>?<9< RG:Z:1 E2:Z:CAGGGAGGGCGAGGGTGAGATTGTGGGGAGATGGGTGAGACGTTAAGACATTGATCCACATTTATACCCATAAGATTATGAATAATTTATTAGATATCTGT OQ:Z:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCCCCCCCCCCCCCCCCCCBCCCCCBCCCCCC at CCDCCDDCDACCC@@C PG:Z:2.1 NM:i:0 UQ:i:0
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict
deleted file mode 100644
index db5b251..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.5 SO:unsorted
- at SQ SN:chr1 LN:16 M5:56b74a652b3ed2f610263b8bb423167c UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at SQ SN:chr2 LN:16 M5:b835d2c026aa66c52a05838dcc0b59d4 UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
deleted file mode 100644
index 0b446ca..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
+++ /dev/null
@@ -1,4 +0,0 @@
->chr1
-ACGTACGTacgtacgt
->chr2
-TCGATCGAtcgatcga
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai b/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai
deleted file mode 100644
index 9314c8f..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chr1 16 6 16 17
-chr2 16 29 16 16
diff --git a/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam b/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam
deleted file mode 100644
index 82efe85..0000000
--- a/src/test/resources/htsjdk/samtools/SequenceUtil/upper_and_lowercase_read.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:16 M5:56b74a652b3ed2f610263b8bb423167c UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at SQ SN:chr2 LN:16 M5:b835d2c026aa66c52a05838dcc0b59d4 UR:file:src/test/resources/htsjdk/samtools/SequenceUtil/reference_with_lower_and_uppercase.fasta
- at CO chr1 value is ACGTACGTacgtacgt
- at CO chr2 value is TCGATCGAtcgatcga
-read1 0 chr1 1 0 16M * 0 0 AcGtAcGTaCGtAcGt AAAAAAAAAAAAAAAA NM:i:0
-read2 0 chr1 1 0 16M * 0 0 AcGtAcGTaCGtAcGt AAAAAAAAAAAAAAAA NM:i:0
-read3 0 chr2 1 0 16M * 0 0 AcGtAcGTaCGtAcGt AAAAAAAAAAAAAAAA NM:i:8 MD:Z:0T2A0T2A0t2a0t2a0
-read4 0 chr2 1 0 8M * 0 0 TCGATCGA AAAAAAAA NM:i:0
-read5 0 chr2 1 0 4M1D2M1S * 0 0 TCGACGAA AAAAAAAA NM:i:1 MD:Z:4^T2
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai
deleted file mode 100644
index bf4bc62..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam
deleted file mode 100644
index 8aa4751..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/bad_index.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam
deleted file mode 100755
index 5d2b1b4..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/buggyHeader.sam
+++ /dev/null
@@ -1,30 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 SN:chr123 LN:247249719 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:9ebc6df9496613f373e73396d5b3b6b6 SP:Homo sapiens
- at SQ SN:chr2 LN:242951149 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:b12c7373e3882120332983be99aeb18d SP:Homo sapiens
- at SQ SN:chr3 LN:199501827 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:4e390df72c70f259b074be639d8f9578 SP:Homo sapiens
- at SQ SN:chr4 LN:191273063 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:cf37020337904229dca8401907b626c2 SP:Homo sapiens
- at SQ SN:chr5 LN:180857866 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:031c851664e31b2c17337fd6f9004858 SP:Homo sapiens
- at SQ SN:chr6 LN:170899992 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:bfe8005c536131276d448ead33f1b583 SP:Homo sapiens
- at SQ SN:chr7 LN:158821424 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:74239c5ceee3b28f0038123d958114cb SP:Homo sapiens
- at SQ SN:chr8 LN:146274826 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:1eb00fe1ce26ce6701d2cd75c35b5ccb SP:Homo sapiens
- at SQ SN:chr9 LN:140273252 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:ea244473e525dde0393d353ef94f974b SP:Homo sapiens
- at SQ SN:chr10 LN:135374737 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:4ca41bf2d7d33578d2cd7ee9411e1533 SP:Homo sapiens
- at SQ SN:chr11 LN:134452384 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:425ba5eb6c95b60bafbf2874493a56c3 SP:Homo sapiens
- at SQ SN:chr12 LN:132349534 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:d17d70060c56b4578fa570117bf19716 SP:Homo sapiens
- at SQ SN:chr13 LN:114142980 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:c4f3084a20380a373bbbdb9ae30da587 SP:Homo sapiens
- at SQ SN:chr14 LN:106368585 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:c1ff5d44683831e9c7c1db23f93fbb45 SP:Homo sapiens
- at SQ SN:chr15 LN:100338915 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:5cd9622c459fe0a276b27f6ac06116d8 SP:Homo sapiens
- at SQ SN:chr16 LN:88827254 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:3e81884229e8dc6b7f258169ec8da246 SP:Homo sapiens
- at SQ SN:chr17 LN:78774742 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:2a5c95ed99c5298bb107f313c7044588 SP:Homo sapiens
- at SQ SN:chr18 LN:76117153 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:3d11df432bcdc1407835d5ef2ce62634 SP:Homo sapiens
- at SQ SN:chr19 LN:63811651 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:2f1a59077cfad51df907ac25723bff28 SP:Homo sapiens
- at SQ SN:chr20 LN:62435964 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:f126cdf8a6e0c7f379d618ff66beb2da SP:Homo sapiens
- at SQ SN:chr21 LN:46944323 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:f1b74b7f9f4cdbaeb6832ee86cb426c6 SP:Homo sapiens
- at SQ SN:chr22 LN:49691432 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:2041e6a0c914b48dd537922cca63acb8 SP:Homo sapiens
- at SQ SN:chrX LN:154913754 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:d7e626c80ad172a4d7c95aadb94d9040 SP:Homo sapiens
- at SQ SN:chrY LN:57772954 UR:file:/stornext/snfs1/next-gen/solid/reference/full_hsap36.fasta M5:62f69d0e82a12af74bad85e2e4a8bd91 SP:Homo sapiens
- at RG ID:A PL:solid PU:083_20090618_2_SL_notag LB:ANG_TCGA-OVA.09.T_000sA DT:2009-06-18T19:00:00-0500 SM:TCGA-09-0364-01A-02W-0370-010 CN:Baylor
- at RG ID:B PL:solid PU:083_20090618_2_SL_detag LB:ANG_TCGA-OVA.09.T_000sA DT:2009-06-18T19:00:00-0500 SM:TCGA-09-0364-01A-02W-0370-010 CN:Baylor
- at PG ID:0 VN:4.0r2.0 CL:/data/bucket2/corona_lite_v4.0r2.0 -t 50 or 30 -z 10 -e 6:50 or 3:30
- at CO Hi, Mom!
-1003_834_22 0 chr1 7330 255 50M * 0 0 CCCAGGCCTCCCGAGCCGAGCCATCCGTCACCCCCTGGCTCCTGGCCGCT @@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>9@@@?9<@@(((! RG:Z:0 CS:Z:T20012030220032230322301320312110000210322021030332 CQ:Z:499;=,4988 MD:Z:23C23TA1
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam
deleted file mode 100644
index 1ec8faa..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicate_rg.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:101 UR:merger.fasta M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ SN:chr2 LN:101 UR:merger.fasta M5:31c33e2155b3de5e2554b693c475b310
- at SQ SN:chr3 LN:101 UR:merger.fasta M5:631593c6dd2048ae88dcce2bd505d295
- at SQ SN:chr4 LN:101 UR:merger.fasta M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ SN:chr5 LN:101 UR:merger.fasta M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ SN:chr6 LN:101 UR:merger.fasta M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ SN:chr7 LN:404 UR:merger.fasta M5:da488fc432cdaf2c20c96da473a7b630
- at SQ SN:chr8 LN:202 UR:merger.fasta M5:d339678efce576d5546e88b49a487b63
- at RG ID:H7U2W.1 PU:H7U2WADXX140408.1.AAGTAGAG LB:Solexa-1 PI:0 DT:2014-04-08T00:00:00-0400 SM:K-562 CN:BI
- at RG ID:H7U2W.1 PU:H7U2WADXX140408.1.AAGTAGAG LB:Solexa-2 PI:0 DT:2014-04-08T00:00:00-0400 SM:K-562 CN:BI
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam
deleted file mode 100644
index e9e003c..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads.sam
+++ /dev/null
@@ -1,17 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:404
- at SQ SN:chr8 LN:202
- at RG ID:0 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:1 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:2 SM:Hi,Mom! LB:my-library PL:Illumina
- at PG ID:1 PN:Hey! VN:2.0
-duplicate_read 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 141 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 141 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam
deleted file mode 100644
index 23094dc..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/duplicated_reads_out_of_order.sam
+++ /dev/null
@@ -1,17 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:404
- at SQ SN:chr8 LN:202
- at RG ID:0 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:1 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:2 SM:Hi,Mom! LB:my-library PL:Illumina
- at PG ID:1 PN:Hey! VN:2.0
-duplicate_read 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 141 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-duplicate_read 141 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam
deleted file mode 100644
index a4a4331..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/hanging_tab.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 PL:illumina PU:300TDAAXX090429.8 LB:Solexa-3536 DT:Wed Apr 29 00:00:00 EDT 2009 SM:CLONED Phi-X Control CN:broad
-300TDAAXX090429:8:100:0:1001#0 589 * 0 0 * * 0 0 NNNNNNNNNNNNNNNNNNNNNNNNN ######################### XN:i:1 RG:Z:0
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam
deleted file mode 100644
index 167ed36..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/inappropriate_mate_cigar_string.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:101 UR:merger.fasta M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ SN:chr2 LN:101 UR:merger.fasta M5:31c33e2155b3de5e2554b693c475b310
- at SQ SN:chr3 LN:101 UR:merger.fasta M5:631593c6dd2048ae88dcce2bd505d295
- at SQ SN:chr4 LN:101 UR:merger.fasta M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ SN:chr5 LN:101 UR:merger.fasta M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ SN:chr6 LN:101 UR:merger.fasta M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ SN:chr7 LN:404 UR:merger.fasta M5:da488fc432cdaf2c20c96da473a7b630
- at SQ SN:chr8 LN:202 UR:merger.fasta M5:d339678efce576d5546e88b49a487b63
- at RG ID:0 SM:Hi,Mom!
- at PG ID:0 PN:myAligner VN:1.0 CL:align!
-pair_read 73 chr7 3 9 6M = 3 0 CAACAG )'.*.+ MC:Z:* PG:Z:0 RG:Z:0 NM:i:4 UQ:i:33
-pair_read 133 chr7 3 0 * = 3 0 NCGCGG &/1544 MC:Z:6M PG:Z:0 RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam
deleted file mode 100644
index 7f22b9a..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_coord_sort_order.sam
+++ /dev/null
@@ -1,27 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:202
- at SQ SN:chr8 LN:202
-SL-XAV:1:1:0:764#0/1 89 chr1 1 255 101M * 0 0 TTCATGCTGANGCNCTCTTACGATCGTACAGATGCAAATATTAACANNCNTTNAAGNNCANNNNNNNNNCAATACAATANTAGAGTACGTNAACACTCCAN &/,&-.1/6/&&)&).)/,&0768)&/.,/874,&.4137572)&/&&,&1-&.0/&&*,&&&&&&&&&&18775799,&16:8775-56256/69::;0& RG:Z:0 XN:i:1
-SL-XAV:1:1:0:1668#0/2 153 chr2 1 255 101M * 0 0 CATCTCTACANGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATACTTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTNGACACCTTTN (/,'-/'0////(1'&&1&&&&'2''-6/,/3-33653.6:1'.86/-++32.-4864653/5/583/346423203+28888644446688456/4880& RG:Z:0 XN:i:1
-SL-XAV:1:1:0:1914#0/2 153 chr3 1 255 101M * 0 0 CGTATGCGCTNTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAATAAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGNAATGTGCAAN (0,7&&*/*0*,)10/).-*&.&*/6669.&-337599;3,&,6/.,5::999987893+387020775777547999::668997448:::9;999::0& RG:Z:0
-SL-XAV:1:1:0:1639#0/2 153 chr1 1 255 101M * 0 0 CGTGATACCANCTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATATTTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGNTTTGCAGCCN '.&.&&'.0+01'2(1'(''-)','+0041/.+032;:867115/5267-.0/)-5.&-26200224,,0+0/0275/5605688::646875568882*& RG:Z:0
-SL-XAV:1:1:0:68#0/2 137 chr5 1 255 101M * 0 0 NTCTCATTTANAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTTCATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCANGACGTTATCT &1<<999;;;;<<<87579:556972789977444.'.023.&,7621/54.49.)/53055-22--''+(.'-))6-168/(3&&0(<).))*&&&&&'0 RG:Z:0
-SL-XAV:1:1:0:700#0/2 137 chr6 1 255 101M * 0 0 NAATTGTTCTNAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACAATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACNAGTGTCGATC &0::887::::6/646::838388811/679:87640&./2+/-4/28:3,536/4''&&.78/(/554/./02*)*',-(57()&.6(6:(0601'/(,* RG:Z:0
-SL-XAV:1:1:0:1721#0/1 83 chr7 1 255 101M = 102 40 CAACAGAAGGNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCGAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-SL-XAV:1:1:0:1721#0/2 163 chr7 102 255 101M = 1 -40 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-SL-XAV:1:1:0:105#0/2 147 chr8 1 255 101M = 102 79 CACATCGTGANTCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGAGAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCNTAAGATGACN /))3--/&*()&)&&+'++.'-&,(.))'4,)&'&&,')8,&&*'.&*0'225/&)3-8//)*,5-*).7851453583.3568526:863688:::85.& RG:Z:0
-SL-XAV:1:1:0:105#0/1 99 chr8 102 255 101M = 1 -79 NCAGGTTCAANTGTGCAGCCCNTTTTGAGAGATNNNNNNNNTGNNCTGNAANANNGACACAGCTATTCCTAAGATGACAAGATCAGANAANAAGTCAAGCA &06665578::41.*/7577/&/77403-324.&&&&&&&&/.&&..&&.0&&&&',:9:/-/(55002020+3'12+2/&.2-&//&),&*&&&&&&&51 RG:Z:0
-SL-XAV:1:1:0:1300#0/1 77 * 0 0 * * 0 0 NAAACACAAGNNANAGTCTTANCNGCTATTCCNNNNNNNNNCTNNNCTNAGNANNACATACAACAGTATCCACACAAGTGTACTCGTNCANACATGTGAAC &*5535)*-,,&.&.*-1)*,&'&)&1&&.,)&&&&&&&&&)0&&&0'&&&&.&&*2'/4''0/**&)&,'-&*,&,&&&.0.&)&&&**&,.&&&')&&) RG:Z:0
-SL-XAV:1:1:0:1300#0/2 141 * 0 0 * * 0 0 NGATCATGGANGACTCTCCCCATCCCCCGCTCCAGCGCTCAGTTATATGCCTAGCCTCGGACACGTCACCAACATCTCACGCACTCTGCANAGTCTCTCAC &&'+''3*&-/)/1'26/*-2-/542-*&-&/'/*/&-'&)-')&.'-/&&2+122*'&+,(/-&)((,/-,,.'2(2'+)/&/&-66-&&/16&)&*&'3 RG:Z:0
-SL-XAV:1:1:0:1639#0/1 101 * 0 0 * chr1 1 0 NCCCTCTCAGNNTNTCTGCCANANCCTTAAGCNNNNNNNNNTANNNCTNAANCNNAAACTTTTGCCTCAGGCATCCGCAGAATGTTTNTCNGCCTATATCG &1::::::64/&/&0:3.280&/&087881,/&&&&&&&&&..&&&..&,,&-&&,265341-)/5680&-.5552-25/322/42/&)&&).421&-&-/ RG:Z:0
-SL-XAV:1:1:0:1668#0/1 101 * 0 0 * chr2 1 0 NATAGCATACNNTNCATTGGANTNCAGCACAANNNNNNNNNTGNNNCANTNNANNCCTTTGAGATCGGAAGAGCGGTTCAGCAGGAANNCNCAGACCGATC &1988998890&0&.8863//&.&.0-2875.&&&&&&&&&.)&&&..&.&&.&&.5782-2+262)&-0-0510*.332-2.-,0*&&*&'.&-2-)0., RG:Z:0
-SL-XAV:1:1:0:1914#0/1 101 * 0 0 * chr3 1 0 NTTTTTCTCCNNCNGTGCCTANTNTAGCCCCTNNNNNNNNNAANNNATNANNANNTTTACTTAAAAAACTGAAACTAGTAATGTGCANNANATCGNAAGAG &0::::<<;90&/&.244760&,&.414798/&&&&&&&&&00&&&0.&/&&-&&.4475687363504.&.557/.*)65.&/*./&&.&.+*)&..).& RG:Z:0
-SL-XAV:1:1:0:68#0/1 581 * 0 0 * chr4 1 0 NAATATTCATNNGNTCAGCCTNTNCATTAATTNNNNNNNNNTTNNNATNATNANNTTTTTTATAACCATTTATAAATGAGAGAGATCNTANCACAATATCA &0<<:::::</&&&.73'290&.&0;:::90&&&&&&&&&&..&&&0)&0-&0&&&.743799995253348597921.,.'050.*&.0&)*)&&&&*). RG:Z:0
-SL-XAV:1:1:0:700#0/1 581 * 0 0 * chr5 1 0 NGAAGCCCATNNTNGTGTTACNCNCCTGGAAGNNNNNNNNNACNNNGANACNTNNAACAATTCAGATCGGAAGAGCGGTTCAGCAGANNTNCCGAGACCGA &.88888:88/&0&,03189.&/&.8/))12/&&&&&&&&&./&&&&.&1.&)&&/35962/6432-3&),0&/2+0,),61&-6,&&&'&/,.0&...)0 RG:Z:0
-SL-XAV:1:1:0:764#0/2 165 * 0 0 * chr6 1 0 NACAGATGCANATATTAACAGGCTTTAAAGGACAGATGGACTGCAATACAATAATAGAGTACGTCAACACTCCACAGATCGCTAGAGCATNACATCGGTGT &/:5358::9999::99998255::7275,,/5567-'+387537857:54-4.51'31059547320;73/720+22.4(6.;((.;(;8()(''&&2&& RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam
deleted file mode 100644
index a7e33b7..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_mate_cigar_string.sam
+++ /dev/null
@@ -1,19 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:101 UR:merger.fasta M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ SN:chr2 LN:101 UR:merger.fasta M5:31c33e2155b3de5e2554b693c475b310
- at SQ SN:chr3 LN:101 UR:merger.fasta M5:631593c6dd2048ae88dcce2bd505d295
- at SQ SN:chr4 LN:101 UR:merger.fasta M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ SN:chr5 LN:101 UR:merger.fasta M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ SN:chr6 LN:101 UR:merger.fasta M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ SN:chr7 LN:404 UR:merger.fasta M5:da488fc432cdaf2c20c96da473a7b630
- at SQ SN:chr8 LN:202 UR:merger.fasta M5:d339678efce576d5546e88b49a487b63
- at RG ID:0 SM:Hi,Mom!
- at PG ID:0 PN:myAligner VN:1.0 CL:align!
-pair_both_hit 65 chr7 1 100 101M = 120 120 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& MC:Z:99M PG:Z:0 RG:Z:0 NM:i:21 MQ:i:100 UQ:i:144
-pair_both_multihit 321 chr7 1 100 101M = 120 120 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& MC:Z:101M PG:Z:0 RG:Z:0 HI:i:0 NM:i:21 MQ:i:100 UQ:i:144
-pair_both_multihit 321 chr7 10 100 101M = 130 121 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& MC:Z:101M PG:Z:0 RG:Z:0 HI:i:1 NM:i:83 MQ:i:100 UQ:i:865
-pair_both_hit 129 chr7 120 100 101M = 1 -120 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 MC:Z:101M PG:Z:0 RG:Z:0 NM:i:73 MQ:i:100 UQ:i:944
-pair_both_multihit 385 chr7 120 100 101M = 1 -120 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 MC:Z:101M PG:Z:0 RG:Z:0 HI:i:0 NM:i:73 MQ:i:100 UQ:i:944
-pair_both_multihit 385 chr7 130 100 101M = 10 -121 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 MC:Z:101M PG:Z:0 RG:Z:0 HI:i:1 NM:i:84 MQ:i:100 UQ:i:1072
-pair_both_multihit 65 chr8 1 100 101M = 101 101 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& MC:Z:101M PG:Z:0 RG:Z:0 HI:i:2 NM:i:86 MQ:i:100 UQ:i:940
-pair_both_multihit 129 chr8 101 100 101M = 1 -101 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 MC:Z:101M PG:Z:0 RG:Z:0 HI:i:2 NM:i:81 MQ:i:100 UQ:i:1042
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam
deleted file mode 100644
index c594c8f..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_platform_unit.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:404
- at SQ SN:chr8 LN:202
- at RG ID:0 SM:Hi,Mom! LB:my-library PL:TRICORDER
- at RG ID:1 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:2 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at PG ID:1 PN:Hey! VN:2.0
-both_reads_align_clip_marked 1107 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns 89 chr7 1 255 101M * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps 83 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:2 PG:Z:1 NM:i:8 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter 147 chr7 16 255 101M = 21 -96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:1 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter 99 chr7 21 255 101M = 16 96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:1 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_marked 163 chr7 302 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0 PG:Z:1 NM:i:5 MQ:i:255 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps 163 chr7 302 255 10M1D10M5I76M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:2 PG:Z:1 NM:i:6 MQ:i:255 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns 165 * 0 0 * chr7 1 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:1 PG:Z:1
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam
deleted file mode 100644
index 553ec81..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/invalid_queryname_sort_order.sam
+++ /dev/null
@@ -1,27 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:202
- at SQ SN:chr8 LN:202
-SL-XAV:1:1:0:764#0/1 89 chr1 1 255 101M * 0 0 TTCATGCTGANGCNCTCTTACGATCGTACAGATGCAAATATTAACANNCNTTNAAGNNCANNNNNNNNNCAATACAATANTAGAGTACGTNAACACTCCAN &/,&-.1/6/&&)&).)/,&0768)&/.,/874,&.4137572)&/&&,&1-&.0/&&*,&&&&&&&&&&18775799,&16:8775-56256/69::;0& RG:Z:0 XN:i:1
-SL-XAV:1:1:0:1668#0/2 153 chr2 1 255 101M * 0 0 CATCTCTACANGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATACTTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTNGACACCTTTN (/,'-/'0////(1'&&1&&&&'2''-6/,/3-33653.6:1'.86/-++32.-4864653/5/583/346423203+28888644446688456/4880& RG:Z:0 XN:i:1
-SL-XAV:1:1:0:1914#0/2 153 chr3 1 255 101M * 0 0 CGTATGCGCTNTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAATAAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGNAATGTGCAAN (0,7&&*/*0*,)10/).-*&.&*/6669.&-337599;3,&,6/.,5::999987893+387020775777547999::668997448:::9;999::0& RG:Z:0
-SL-XAV:1:1:0:1639#0/2 153 chr4 1 255 101M * 0 0 CGTGATACCANCTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATATTTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGNTTTGCAGCCN '.&.&&'.0+01'2(1'(''-)','+0041/.+032;:867115/5267-.0/)-5.&-26200224,,0+0/0275/5605688::646875568882*& RG:Z:0
-SL-XAV:1:1:0:68#0/2 137 chr5 1 255 101M * 0 0 NTCTCATTTANAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTTCATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCANGACGTTATCT &1<<999;;;;<<<87579:556972789977444.'.023.&,7621/54.49.)/53055-22--''+(.'-))6-168/(3&&0(<).))*&&&&&'0 RG:Z:0
-SL-XAV:1:1:0:700#0/2 137 chr6 1 255 101M * 0 0 NAATTGTTCTNAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACAATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACNAGTGTCGATC &0::887::::6/646::838388811/679:87640&./2+/-4/28:3,536/4''&&.78/(/554/./02*)*',-(57()&.6(6:(0601'/(,* RG:Z:0
-SL-XAV:1:1:0:1721#0/1 83 chr7 1 255 101M = 102 40 CAACAGAAGGNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCGAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-SL-XAV:1:1:0:1721#0/2 163 chr7 102 255 101M = 1 -40 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-SL-XAV:1:1:0:105#0/2 147 chr8 1 255 101M = 102 79 CACATCGTGANTCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGAGAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCNTAAGATGACN /))3--/&*()&)&&+'++.'-&,(.))'4,)&'&&,')8,&&*'.&*0'225/&)3-8//)*,5-*).7851453583.3568526:863688:::85.& RG:Z:0
-SL-XAV:1:1:0:105#0/1 99 chr8 102 255 101M = 1 -79 NCAGGTTCAANTGTGCAGCCCNTTTTGAGAGATNNNNNNNNTGNNCTGNAANANNGACACAGCTATTCCTAAGATGACAAGATCAGANAANAAGTCAAGCA &06665578::41.*/7577/&/77403-324.&&&&&&&&/.&&..&&.0&&&&',:9:/-/(55002020+3'12+2/&.2-&//&),&*&&&&&&&51 RG:Z:0
-SL-XAV:1:1:0:1300#0/1 77 * 0 0 * * 0 0 NAAACACAAGNNANAGTCTTANCNGCTATTCCNNNNNNNNNCTNNNCTNAGNANNACATACAACAGTATCCACACAAGTGTACTCGTNCANACATGTGAAC &*5535)*-,,&.&.*-1)*,&'&)&1&&.,)&&&&&&&&&)0&&&0'&&&&.&&*2'/4''0/**&)&,'-&*,&,&&&.0.&)&&&**&,.&&&')&&) RG:Z:0
-SL-XAV:1:1:0:1300#0/2 141 * 0 0 * * 0 0 NGATCATGGANGACTCTCCCCATCCCCCGCTCCAGCGCTCAGTTATATGCCTAGCCTCGGACACGTCACCAACATCTCACGCACTCTGCANAGTCTCTCAC &&'+''3*&-/)/1'26/*-2-/542-*&-&/'/*/&-'&)-')&.'-/&&2+122*'&+,(/-&)((,/-,,.'2(2'+)/&/&-66-&&/16&)&*&'3 RG:Z:0
-SL-XAV:1:1:0:1639#0/1 101 * 0 0 * chr1 1 0 NCCCTCTCAGNNTNTCTGCCANANCCTTAAGCNNNNNNNNNTANNNCTNAANCNNAAACTTTTGCCTCAGGCATCCGCAGAATGTTTNTCNGCCTATATCG &1::::::64/&/&0:3.280&/&087881,/&&&&&&&&&..&&&..&,,&-&&,265341-)/5680&-.5552-25/322/42/&)&&).421&-&-/ RG:Z:0
-SL-XAV:1:1:0:1668#0/1 101 * 0 0 * chr2 1 0 NATAGCATACNNTNCATTGGANTNCAGCACAANNNNNNNNNTGNNNCANTNNANNCCTTTGAGATCGGAAGAGCGGTTCAGCAGGAANNCNCAGACCGATC &1988998890&0&.8863//&.&.0-2875.&&&&&&&&&.)&&&..&.&&.&&.5782-2+262)&-0-0510*.332-2.-,0*&&*&'.&-2-)0., RG:Z:0
-SL-XAV:1:1:0:1914#0/1 101 * 0 0 * chr3 1 0 NTTTTTCTCCNNCNGTGCCTANTNTAGCCCCTNNNNNNNNNAANNNATNANNANNTTTACTTAAAAAACTGAAACTAGTAATGTGCANNANATCGNAAGAG &0::::<<;90&/&.244760&,&.414798/&&&&&&&&&00&&&0.&/&&-&&.4475687363504.&.557/.*)65.&/*./&&.&.+*)&..).& RG:Z:0
-SL-XAV:1:1:0:68#0/1 581 * 0 0 * chr4 1 0 NAATATTCATNNGNTCAGCCTNTNCATTAATTNNNNNNNNNTTNNNATNATNANNTTTTTTATAACCATTTATAAATGAGAGAGATCNTANCACAATATCA &0<<:::::</&&&.73'290&.&0;:::90&&&&&&&&&&..&&&0)&0-&0&&&.743799995253348597921.,.'050.*&.0&)*)&&&&*). RG:Z:0
-SL-XAV:1:1:0:700#0/1 581 * 0 0 * chr5 1 0 NGAAGCCCATNNTNGTGTTACNCNCCTGGAAGNNNNNNNNNACNNNGANACNTNNAACAATTCAGATCGGAAGAGCGGTTCAGCAGANNTNCCGAGACCGA &.88888:88/&0&,03189.&/&.8/))12/&&&&&&&&&./&&&&.&1.&)&&/35962/6432-3&),0&/2+0,),61&-6,&&&'&/,.0&...)0 RG:Z:0
-SL-XAV:1:1:0:764#0/2 165 * 0 0 * chr6 1 0 NACAGATGCANATATTAACAGGCTTTAAAGGACAGATGGACTGCAATACAATAATAGAGTACGTCAACACTCCACAGATCGCTAGAGCATNACATCGGTGT &/:5358::9999::99998255::7275,,/5567-'+387537857:54-4.51'31059547320;73/720+22.4(6.;((.;(;8()(''&&2&& RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam
deleted file mode 100755
index efe2be2..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_no_oqs.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:REF LN:1000
-A 99 REF 100 50 10M = 200 100 CAACAGAAGC )'.*.+2,)) MC:Z:5M1I4M
-A 147 REF 200 50 5M1I4M = 100 -100 CAACAGAAGC )'.*.+2,)) MC:Z:10M
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam
deleted file mode 100755
index 3782ad7..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/mate_cigar_and_oqs.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:REF LN:1000
-A 99 REF 100 50 10M = 200 100 CAACAGAAGC )'.*.+2,)) MC:Z:5M1I4M OQ:Z:IIIIIIIIII
-A 147 REF 200 50 5M1I4M = 100 -100 CAACAGAAGC )'.*.+2,)) MC:Z:10M OQ:Z:IIIIIIIIII
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam
deleted file mode 100644
index a9c0bbf..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_fields.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 PL:illumina PU:300TDAAXX090429.8 LB:Solexa-3536 DT:Wed Apr 29 00:00:00 EDT 2009 SM:CLONED Phi-X Control CN:broad
-300TDAAXX090429:8:100:0:1001#0 589 * 0 0 * * 0
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam
deleted file mode 100644
index c0fabd8..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/missing_platform_unit.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:101 UR:merger.fasta M5:bd01f7e11515bb6beda8f7257902aa67
- at SQ SN:chr2 LN:101 UR:merger.fasta M5:31c33e2155b3de5e2554b693c475b310
- at SQ SN:chr3 LN:101 UR:merger.fasta M5:631593c6dd2048ae88dcce2bd505d295
- at SQ SN:chr4 LN:101 UR:merger.fasta M5:c60cb92f1ee5b78053c92bdbfa19abf1
- at SQ SN:chr5 LN:101 UR:merger.fasta M5:07ebc213c7611db0eacbb1590c3e9bda
- at SQ SN:chr6 LN:101 UR:merger.fasta M5:7be2f5e7ee39e60a6c3b5b6a41178c6d
- at SQ SN:chr7 LN:404 UR:merger.fasta M5:da488fc432cdaf2c20c96da473a7b630
- at SQ SN:chr8 LN:202 UR:merger.fasta M5:d339678efce576d5546e88b49a487b63
- at RG ID:H7U2W.1 PU:H7U2WADXX140408.1.AAGTAGAG LB:Solexa-219641 PI:0 DT:2014-04-08T00:00:00-0400 SM:K-562 CN:BI
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam
deleted file mode 100644
index e8d2a70..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/test_samfile_version_1pt5.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam
deleted file mode 100644
index bcef65a..0000000
Binary files a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam
deleted file mode 100644
index 34bd776..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_quals.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 PL:illumina PU:300TDAAXX090429.8 LB:Solexa-3536 DT:Wed Apr 29 00:00:00 EDT 2009 SM:CLONED Phi-X Control CN:broad
-300TDAAXX090429:8:100:0:1001#0 589 * 0 0 * * 0 0 NNNNNNNNNNNNNNNNNNNNNNNNN ######################### XN:i:1 RG:Z:0 SQ:H:07CCCBC186CA85D087CFC5D1D4CACCD6D3D1D0CDD30CD0D2D5
-300TDAAXX090429:8:100:0:1001#0 653 * 0 0 * * 0 0 NNNNNNNNNNNNNNNNNNNNNNNNN ######################
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam
deleted file mode 100644
index ef4def1..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/truncated_tag.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 PL:illumina PU:300TDAAXX090429.8 LB:Solexa-3536 DT:Wed Apr 29 00:00:00 EDT 2009 SM:CLONED Phi-X Control CN:broad
-300TDAAXX090429:8:100:0:1001#0 589 * 0 0 * * 0 0 NNNNNNNNNNNNNNNNNNNNNNNNN ######################### XN:i:1 RG:Z:0 SQ:H:07CCCBC186CA85D087CFC5D1D4CACCD6D3D1D0CDD30CD0D2D5
-300TDAAXX090429:8:100:0:1001#0 653 * 0 0 * * 0 0 NNNNNNNNNNNNNNNNNNNNNNNNN ######################### XN:i:
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam
deleted file mode 100644
index 15ffe09..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/valid.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:404
- at SQ SN:chr8 LN:202
- at RG ID:0 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:1 SM:Hi,Mom! LB:my-library PL:ILLUMINA
- at RG ID:2 SM:Hi,Mom! LB:my-library PL:Illumina
- at PG ID:1 PN:Hey! VN:2.0
-both_reads_align_clip_marked 1107 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 PG:Z:1 NM:i:0 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns 89 chr7 1 255 101M * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:3 MQ:i:255 XT:Z:foo OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps 83 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:2 PG:Z:1 NM:i:8 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter 147 chr7 16 255 101M = 21 -96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:1 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_adapter 99 chr7 21 255 101M = 16 96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:1 PG:Z:1 NM:i:1 MQ:i:255 XT:Z:foo2 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_align_clip_marked 163 chr7 302 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0 PG:Z:1 NM:i:5 MQ:i:255 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-read_2_too_many_gaps 163 chr7 302 255 10M1D10M5I76M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:2 PG:Z:1 NM:i:6 MQ:i:255 OQ:Z:11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
-both_reads_present_only_first_aligns 165 * 0 0 * chr7 1 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:1 PG:Z:1
diff --git a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam b/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam
deleted file mode 100644
index 50d2fe4..0000000
--- a/src/test/resources/htsjdk/samtools/ValidateSamFileTest/zero_length_read.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 PL:illumina PU:300TDAAXX090429.8 LB:Solexa-3536 DT:Wed Apr 29 00:00:00 EDT 2009 SM:CLONED Phi-X Control CN:broad
-300TDAAXX090429:8:100:0:1001#0 589 * 0 0 * * 0 0
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/block_compressed.sam.gz b/src/test/resources/htsjdk/samtools/block_compressed.sam.gz
deleted file mode 100644
index d948382..0000000
Binary files a/src/test/resources/htsjdk/samtools/block_compressed.sam.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/compressed.bam b/src/test/resources/htsjdk/samtools/compressed.bam
deleted file mode 100644
index 9d20ade..0000000
Binary files a/src/test/resources/htsjdk/samtools/compressed.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/compressed.sam.gz b/src/test/resources/htsjdk/samtools/compressed.sam.gz
deleted file mode 100644
index bf84cd8..0000000
Binary files a/src/test/resources/htsjdk/samtools/compressed.sam.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/coordinate_sorted.sam b/src/test/resources/htsjdk/samtools/coordinate_sorted.sam
deleted file mode 100755
index 00942a9..0000000
--- a/src/test/resources/htsjdk/samtools/coordinate_sorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at RG ID:0 SM:Hi,Mom!
-B 99 chr1 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 99 chr1 2 255 10M = 15 30 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 147 chr1 15 255 10M = 2 -30 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 147 chr1 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-A 73 chr2 1 255 10M * 0 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 99 chr2 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 147 chr2 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 99 chr3 1 255 10M = 25 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 147 chr3 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-A 133 * 0 0 * chr2 1 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai
deleted file mode 100644
index fcb31fc..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict
deleted file mode 100644
index 7f41717..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD VN:1.4 SO:unsorted
- at SQ SN:Shelly LN:20 M5:7ddd8a4b4f2c1dec43476a738b1a9b72 UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa
deleted file mode 100644
index 63e0c92..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Shelly
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai
deleted file mode 100644
index 3deea7f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Shelly 20 8 20 21
diff --git a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta b/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/CRAMException/testContigNotInRef.fasta
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram
deleted file mode 100644
index 96ca860..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai
deleted file mode 100644
index 1ca5df2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.0-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram
deleted file mode 100644
index 4c74ab9..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai
deleted file mode 100644
index 3fee0e2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.1-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram
deleted file mode 100644
index fbfbbf7..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai b/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai
deleted file mode 100644
index b50f3ce..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/NA12878.20.21.1-100.100-SeqsPerSlice.500-unMapped.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram b/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram
deleted file mode 100644
index bf81b01..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/auxf#values.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram b/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram
deleted file mode 100644
index f4d35b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/auxf#values.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf#values.sam b/src/test/resources/htsjdk/samtools/cram/auxf#values.sam
deleted file mode 100644
index 4e0902f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf#values.sam
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD VN:1.4 SO:unsorted
- at SQ SN:Sheila LN:20
- at RG ID:ID SM:foo
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** RG:Z:ID A!:A:! Ac:A:c AC:A:C I0:i:0 I1:i:1 I2:i:127 I3:i:128 I4:i:255 I5:i:256 I6:i:32767 I7:i:32768 I8:i:65535 I9:i:65536 IA:i:2147483647 i1:i:-1 i2:i:-127 i3:i:-128 i4:i:-255 i5:i:-256 i6:i:-32767 i7:i:-32768 i8:i:-65535 i9:i:-65536 iA:i:-2147483647 iB:i:-2147483648 F0:f:-1 F1:f:0 F2:f:1 F3:f:9.9e-19 F4:f:-9.9e-19 F5:f:9.9e+19 F6:f:-9.9e+19 H0:H:AA H1:H:dead00beef Z0:Z:space space
-Jim 16 Sheila 11 11 10M * 0 0 AAAAAAAAAA * BC:B:C,0,127,128,255 Bc:B:c,-128,-127,0,127 BS:B:S,0,32767,32768,65535 Bs:B:s,-32768,-32767,0,32767 BI:B:I,0,2147483647,2147483648,4294967295 Bi:B:i,-2147483648,-2147483647,0,2147483647
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa b/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa
deleted file mode 100644
index 1089240..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-CTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai b/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai
deleted file mode 100644
index 5709288..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.alteredForMD5test.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila 19 8 19 20
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.fa b/src/test/resources/htsjdk/samtools/cram/auxf.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai b/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/auxf.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila 20 8 20 21
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram
deleted file mode 100644
index ee44c86..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#bounds.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram
deleted file mode 100644
index cc96487..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#bounds.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam b/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam
deleted file mode 100644
index 181dbe0..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#bounds.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ SN:c1 LN:10
-s0 0 c1 1 0 10M * 0 0 AACCGCGGTT **********
-s1 0 c1 2 0 10M * 0 0 ACCGCGGTTC **********
-s2 0 c1 3 0 10M * 0 0 CCGCGGTTCG **********
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram
deleted file mode 100644
index 66d010c..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#clip.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram
deleted file mode 100644
index 0a4bc16..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#clip.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#clip.sam b/src/test/resources/htsjdk/samtools/cram/c1#clip.sam
deleted file mode 100644
index fd073f0..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#clip.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ SN:c1 LN:10
-s0a 0 c1 1 0 10M * 0 0 AACCGCGGTT **********
-s0A 0 c1 1 0 3M4N3M * 0 0 AACGTT ******
-s0b 0 c1 2 0 1S8M1S * 0 0 AACCGCGGTT **********
-s0B 0 c1 2 0 1H8M1H * 0 0 ACCGCGGT ********
-s0c 0 c1 3 0 2S6M2S * 0 0 AACCGCGGTT **********
-s0c 0 c1 3 0 2S3M2I3M2S * 0 0 AACCGNNCGGTT ************
-s0C 0 c1 3 0 2H6M2H * 0 0 CCGCGG ******
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram
deleted file mode 100644
index 6e8aefb..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#noseq.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram
deleted file mode 100644
index 7db8639..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#noseq.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam b/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam
deleted file mode 100644
index fda58c2..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#noseq.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ SN:c1 LN:10
-sq1 0 c1 1 0 10M * 0 0 AACCGCGGTT ********** MD:Z:10 NM:i:0
-sQ1 0 c1 1 0 10M * 0 0 AACCGCGGTT * MD:Z:10 NM:i:0
-SQ1 0 c1 1 0 10M * 0 0 * * MD:Z:10 NM:i:0
-sq2 0 c1 1 0 4M1D5M * 0 0 AACCCGGTT ********* MD:Z:4^G5 NM:i:1
-sQ2 0 c1 1 0 4M1D5M * 0 0 AACCCGGTT * MD:Z:4^G5 NM:i:1
-SQ2 0 c1 1 0 4M1D5M * 0 0 * * MD:Z:4^G5 NM:i:1
-sq3 4 c1 1 0 * * 0 0 AACCCGGTT *********
-sQ3 4 c1 1 0 * * 0 0 AACCCGGTT *
-SQ3 4 c1 1 0 * * 0 0 * *
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram
deleted file mode 100644
index 4fe23b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram
deleted file mode 100644
index cfcf220..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam
deleted file mode 100644
index 54f7a11..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad1.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ SN:c1 LN:10
-s0a 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s0b 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s0c 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s1 0 c1 1 0 5M6I5M * 0 0 AACCGGTTAACCGGTT *
-s2 0 c1 1 0 5M1P4I1P5M * 0 0 AACCGTTAACGGTT *
-s3 0 c1 1 0 5M3I3P5M * 0 0 AACCGGTTCGGTT *
-s4 0 c1 1 0 5M3P3I5M * 0 0 AACCGAACCGGTT *
-s5 0 c1 1 0 4M1D2P2I2P1D4M * 0 0 AACCTAGGTT *
-s6 0 c1 1 0 2M3D6I3D2M * 0 0 AAGTTAACTT *
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram
deleted file mode 100644
index 5b8a3a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram
deleted file mode 100644
index 3fbc8f3..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam
deleted file mode 100644
index 66da374..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad2.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at SQ SN:c1 LN:10
-s0a 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s0b 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s0c 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s0d 0 c1 1 0 10M * 0 0 AACCGCGGTT *
-s1 0 c1 1 0 5M6I5M * 0 0 AACCGGTTAACCGGTT *
-s2 0 c1 1 0 5M1P4I1P5M * 0 0 AACCGTTAACGGTT *
-s3 0 c1 1 0 5M3I3P5M * 0 0 AACCGGTTCGGTT *
-s4 0 c1 1 0 5M3P3I5M * 0 0 AACCGAACCGGTT *
-s5 0 c1 1 0 4M1D2P2I2P1D4M * 0 0 AACCTAGGTT *
-s6 0 c1 1 0 2M3D6I3D2M * 0 0 AAGTTAACTT *
-s7 0 c1 1 0 4M2D4M * 0 0 AACCGGTT *
-s8 0 c1 1 0 5D2P2I2P5D * 0 0 TA *
-s9 0 c1 5 0 1M2P2I2P * 0 0 GTA *
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram
deleted file mode 100644
index 6690038..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad3.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram
deleted file mode 100644
index c48ac8b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#pad3.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam b/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam
deleted file mode 100644
index c77da85..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#pad3.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at SQ SN:c1 LN:10
- at RG ID:p.sam SM:unknown LB:p.sam
-s0a 0 c1 6 0 5I6P5M * 0 0 AACCGCGGTT * RG:Z:p.sam
-s0b 0 c1 6 0 5I6P5M * 0 0 AACCGCGGTT * RG:Z:p.sam
-s0c 0 c1 6 0 5I6P5M * 0 0 AACCGCGGTT * RG:Z:p.sam
-s0d 0 c1 6 0 5I6P5M * 0 0 AACCGCGGTT * RG:Z:p.sam
-s1 0 c1 6 0 11I5M * 0 0 AACCGGTTAACCGGTT * RG:Z:p.sam
-s2 0 c1 6 0 5I1P4I1P5M * 0 0 AACCGTTAACGGTT * RG:Z:p.sam
-s3 0 c1 6 0 8I3P5M * 0 0 AACCGGTTCGGTT * RG:Z:p.sam
-s4 0 c1 6 0 5I3P3I5M * 0 0 AACCGAACCGGTT * RG:Z:p.sam
-s5 0 c1 6 0 4I3P2I2P1D4M * 0 0 AACCTAGGTT * RG:Z:p.sam
-s6 0 c1 6 0 2I3P6I3D2M * 0 0 AAGTTAACTT * RG:Z:p.sam
-s7 0 c1 6 0 4I7P1D4M * 0 0 AACCGGTT * RG:Z:p.sam
-s8 0 c1 6 0 7P2I2P * 0 0 TA !! RG:Z:p.sam
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram
deleted file mode 100644
index c6fdcca..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#unknown.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram
deleted file mode 100644
index a90e703..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c1#unknown.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam b/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam
deleted file mode 100644
index 1f1616a..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1#unknown.sam
+++ /dev/null
@@ -1,9 +0,0 @@
- at SQ SN:c1 LN:10
- at CO Tests permuations of seq / qual being present or "*" in mapped
- at CO and unmapped forms. Also tests MD/NM tag generation.
-_sqm 0 c1 1 0 2M1I4M1D3M * 0 0 AACCCTCGTT IIIIIIIIII MD:Z:4G1^G3 NM:i:3
-_sm 0 c1 1 0 2M1I4M1D3M * 0 0 AACCCTCGTT * MD:Z:4G1^G3 NM:i:3
-_m 0 c1 1 0 2M1I4M1D3M * 0 0 * * MD:Z:4G1^G3 NM:i:3
-_squ 4 c1 1 0 * * 0 0 AACCCTCGTT IIIIIIIIII
-_su 4 c1 1 0 * * 0 0 AACCCTCGTT *
-_u 4 c1 1 0 * * 0 0 * *
diff --git a/src/test/resources/htsjdk/samtools/cram/c1.fa b/src/test/resources/htsjdk/samtools/cram/c1.fa
deleted file mode 100644
index 12c54c9..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->c1
-AACCGCGGTT
diff --git a/src/test/resources/htsjdk/samtools/cram/c1.fa.fai b/src/test/resources/htsjdk/samtools/cram/c1.fa.fai
deleted file mode 100644
index fc35bec..0000000
--- a/src/test/resources/htsjdk/samtools/cram/c1.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-c1 10 4 10 11
diff --git a/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram b/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram
deleted file mode 100644
index 12ce718..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c2#pad.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram b/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram
deleted file mode 100644
index e069a6b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/c2#pad.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram
deleted file mode 100644
index 6931cdd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram
deleted file mode 100644
index 4b55413..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#1.sam b/src/test/resources/htsjdk/samtools/cram/ce#1.sam
deleted file mode 100644
index 4376deb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#1.sam
+++ /dev/null
@@ -1,2 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
-SRR065390.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 AS:i:-18 XS:i:-18 YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram
deleted file mode 100644
index 6c74ef5..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram
deleted file mode 100644
index 21ff68e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#2.sam b/src/test/resources/htsjdk/samtools/cram/ce#2.sam
deleted file mode 100644
index 8a4eead..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#2.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
-SRR065390.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-SRR065390.921023 16 CHROMOSOME_I 3 12 100M * 0 0 CTAAGCCTAAATCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################################???88:;98768700000<>:BBA?BBAB?BBBBBBBB>B>BB::;?:00000 XG:i:0 XM:i:3 XN:i:0 XO:i:0 AS:i:-6 XS:i:-13 YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram
deleted file mode 100644
index bb075f7..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram
deleted file mode 100644
index 2a2f292..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5.sam b/src/test/resources/htsjdk/samtools/cram/ce#5.sam
deleted file mode 100644
index 0535065..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#5.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
- at SQ SN:CHROMOSOME_II LN:5000
- at SQ SN:CHROMOSOME_III LN:5000
- at SQ SN:CHROMOSOME_IV LN:5000
- at SQ SN:CHROMOSOME_V LN:5000
-I 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-II.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-III 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-IV 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-V 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-VI 2048 CHROMOSOME_I 2 1 27M100000D73M * 0 0 ACTAAGCCTAAGCCTAAGCCTAAGCCAATTATCGATTTCTGAAAAAATTATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTTA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram
deleted file mode 100644
index 313f76d..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5b.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram
deleted file mode 100644
index cda2aff..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#5b.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#5b.sam b/src/test/resources/htsjdk/samtools/cram/ce#5b.sam
deleted file mode 100644
index f778394..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#5b.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
- at SQ SN:CHROMOSOME_II LN:5000
- at SQ SN:CHROMOSOME_III LN:5000
- at SQ SN:CHROMOSOME_IV LN:5000
- at SQ SN:CHROMOSOME_V LN:5000
-I 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-II.14978392 16 CHROMOSOME_II 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-III 16 CHROMOSOME_III 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-IV 16 CHROMOSOME_IV 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-V 16 CHROMOSOME_V 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 XS:i:-18 AS:i:-18 YT:Z:UU
-VI 0 CHROMOSOME_V 10 1 7S20M1D23M10I30M10S * 0 0 AGCCTAAGCCTAAGCCTAAGCCTAAGCTAAGCCTAAGCCTAAGCCTAAGCTTTTTTTTTTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA *
-VI 256 CHROMOSOME_V 10 1 7S20M1D23M10I30M10S * 0 0 * *
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram
deleted file mode 100644
index 0041c19..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram
deleted file mode 100644
index 472234e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam b/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam
deleted file mode 100644
index 7df381d..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#large_seq.sam
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
-S1 0 CHROMOSOME_I 1 255 36M4I33M2D18M4I13M3I5M2I7M1I8M4I30M1D20M5D25M4D63M1D31M2I13M4I83M3I36M4D77M2D8M2D5M2D14M2I5M4D1M1D27M5I3M4D47M2D5M4D7M1I70M3D42M4I59M5I2M2I13M4D3M5D6M4I5M4I58M1I10M3I57M1I15M5D57M4I10M1I19M4D9M3I27M4D11M3I9M4I21M4I62M4I51M1I8M3D23M1I5M4I24M2D1M5I4M4D14M3D63M5I1M2I20M4D10M5D7M2D22M4I22M2I9M3I46M5I1M4D12M5D8M3D17M5D149M1D20M1D61M1I14M2I38M4D9M4I62M1I8M1I55M3D62M4I8M4I50M5D19M3D11M2I53M4D7M2D32M2D57M3I48M2D11M4D15M1I23M2D16M5I7M1I3M1D27M5D4M1I18M1D79M5D1M5D8M5D20M1D2 [...]
-V 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram
deleted file mode 100644
index 1215d49..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#supp.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram
deleted file mode 100644
index 5f8aae5..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#supp.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#supp.sam b/src/test/resources/htsjdk/samtools/cram/ce#supp.sam
deleted file mode 100644
index 666e774..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#supp.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at SQ SN:CHROMOSOME_I LN:1009800
- at CO Test supplementary reads, for CRAM
-supp 99 CHROMOSOME_I 100 1 50M50S * 0 0 TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTACCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC *
-supp 2147 CHROMOSOME_I 200 1 50H50M * 0 0 CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC *
-supp 2195 CHROMOSOME_I 500 1 50M50H * 0 0 TTTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCC *
-supp 147 CHROMOSOME_I 600 1 50S50M * 0 0 TTTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCCAGCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAATACTAAGCCTAAG *
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram
deleted file mode 100644
index b340b0e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram
deleted file mode 100644
index cffd9b6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam b/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam
deleted file mode 100644
index 2026dd7..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#tag_depadded.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.4 SO:coordinate
- at RG ID:UNKNOWN SM:unknown LB:UNKNOWN
- at SQ SN:CHROMOSOME_I LN:1009800
-I 16 CHROMOSOME_I 2 1 100M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:27;28;+;STOP;Note=tag1
-II.14978392 16 CHROMOSOME_I 2 1 100M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:27;27;+;PRIM;Note=tag2|28;28;+;OLIG;Note=tag3
-III 0 CHROMOSOME_I 2 1 27M1I73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########################"##@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:1;1;+;COMM|101;101;+;COMM
-IV 16 CHROMOSOME_I 2 1 100M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V 0 CHROMOSOME_I 2 1 100M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-* 768 CHROMOSOME_I 2 255 1M * 0 0 * * CT:Z:+;STOP
-* 768 CHROMOSOME_I 28 255 2M * 0 0 * * CT:Z:+;COMM;Note=consensus%0Amulti%09line%0Atag%0A!"#$%25^&*()_+<>?:@~{}%7C%0A1234567890-=[]'%3B#,./\
-* 768 CHROMOSOME_I 101 255 1M * 0 0 * * CT:Z:+;STOP
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram
deleted file mode 100644
index e49f4d1..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram
deleted file mode 100644
index e036ddd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam b/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam
deleted file mode 100644
index 47a57c2..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#tag_padded.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at HD VN:1.4 SO:coordinate
- at RG ID:UNKNOWN SM:unknown LB:UNKNOWN
- at SQ SN:CHROMOSOME_I LN:1009800
-I 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:27;29;+;STOP;Note=tag1
-II.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:27;27;+;PRIM;Note=tag2|29;29;+;OLIG;Note=tag3
-III 0 CHROMOSOME_I 2 1 101M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########################"##@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PT:Z:1;1;+;COMM|101;101;+;COMM
-IV 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V 0 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-* 768 CHROMOSOME_I 2 255 1M * 0 0 * * CT:Z:+;STOP
-* 768 CHROMOSOME_I 28 255 3M * 0 0 * * CT:Z:+;COMM;Note=consensus%0Amulti%09line%0Atag%0A!"#$%25^&*()_+<>?:@~{}%7C%0A1234567890-=[]'%3B#,./\
-* 768 CHROMOSOME_I 102 255 1M * 0 0 * * CT:Z:+;STOP
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram
deleted file mode 100644
index e08f9a2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram
deleted file mode 100644
index 5ddcbf1..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam
deleted file mode 100644
index fec218c..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap.sam
+++ /dev/null
@@ -1,6 +0,0 @@
-I 4 * 0 1 * * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-II 4 * 0 1 * * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-III 4 * 0 1 * * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-IV 4 * 0 1 * * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-V 4 * 0 1 * * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-VI 4 * 0 1 * * 0 0 ACTAAGCCTAAGCCTAAGCCTAAGCCAATTATCGATTTCTGAAAAAATTATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTTA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram
deleted file mode 100644
index 30f4aac..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram
deleted file mode 100644
index cab813b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam
deleted file mode 100644
index e1e464e..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap1.sam
+++ /dev/null
@@ -1,20 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:CHROMOSOME_I LN:1009800
- at SQ SN:CHROMOSOME_II LN:5000
- at SQ SN:CHROMOSOME_III LN:5000
- at SQ SN:CHROMOSOME_IV LN:5000
- at SQ SN:CHROMOSOME_V LN:5000
- at SQ SN:CHROMOSOME_X LN:5000
- at SQ SN:CHROMOSOME_MtDNA LN:5000
- at RG ID:UNKNOWN SM:UNKNOWN
- at PG ID:bowtie2 PN:bowtie2 VN:2.0.0-beta5
-SRR065390.33808391 4 * 0 0 * * 0 0 GATCGCACTGAAAATCTGGATATAGAACGTGTGCAAATGATTGTCTCTACCGTTCCGTAAAAATTATTGCTAATTAGCAATGATTTTAAGCTAATTAGTT CCCCCCCCCCCCCCCCCCCACCCCCACCCCCCCCCCCCB;CCCAACCCCCCCCCCCCCD=B9BCABCBCB>BBBC at B<<@BA;BCC?B>A<<@(?:4==4 YT:Z:UU
-SRR065390.33808433 4 * 0 0 * * 0 0 NCATCTTCTGCAGGCGCGGTCGGCACCGTGTATTCGTTACGTTCCACGCCGATGATATTAGACACCAGCACGGTGTGATGCGCAGTCACCGCACGACCCG !################################################################################################### YT:Z:UU
-SRR065390.33808462 4 * 0 0 * * 0 0 NGTTTGAGCGCAATGACTTGACGATGACCGGTGATTACAGTAACCAGCATATTGTGCCGATGAAGCAGGCTGTCGCTCCGCAATTTGAAGAGGGACACGA !################################################################################################### YT:Z:UU
-SRR065390.33808468 4 * 0 0 * * 0 0 NGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTTTATTTTACTCTCTGTGGCTTTATCGATTATTTTTTTCTCCTTGGCTTTCCTCTTTATTTTT !))))))''&585555AAAAA6AA############################################################################ YT:Z:UU
-SRR065390.33808471 4 * 0 0 * * 0 0 NCGTCTTCTGCGGTTTCTATGATAGAGCAATTCTGTGGCGGATATTAAGATAACGGGTATCTGTTCTTTAATGATGCCGCAAAAAATGGAAAGTTAAGAA !################################################################################################### YT:Z:UU
-SRR065390.33808489 4 * 0 0 * * 0 0 NGGAAATTCTGCGGTATCGAGAGATATTTGCCTTTAATTACCCCATAGCCGATTAACATCCCGGCACTATTAATCATTTCAATATTATCAATCACAAAGT !################################################################################################### YT:Z:UU
-SRR065390.33808504 4 * 0 0 * * 0 0 NTGGAACACCATGCCCACTTTCGCACGCAGCAGGGCGATATCCTGAGAGTTGGTCAGGATGTTGTCGCCATCAAGCAGAATTTCACCTTCCGCACGCTGC !################################################################################################### YT:Z:UU
-SRR065390.33808511 4 * 0 0 * * 0 0 NCAGAAATATATTGAACTTTTGAAACATGTCCCAACTTTTTTTTTTTTTAGAACACGTTGGCTGGTTTTTCAAGTTTTGAATACTTTTTAGGTTTTTTTG !***()(+++AAAAAAAAAA:78:8318::AAAAAAAAAAAA########################################################## YT:Z:UU
-SRR065390.33808521 4 * 0 0 * * 0 0 NTGTCAATACATTGTAAGGATTTCCCATTATGTCAATACATAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCGATTTCGTATGTCGTGTTTCTTT !################################################################################################### YT:Z:UU
-SRR065390.33808523 4 * 0 0 * * 0 0 NTACTTCTTACAAGATTTTTATCGCTACTTGAAAAAAATTCATCAACATAATCGCCATGACTATCTGCACCGTGAGTATGATAAGCAGCAACTCTATCTG !***+--,')AAAA778577A72AA50888AAAAAAA72A88858AAAA77AAAAAA7AAAAAAAAA8AA############################## YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram
deleted file mode 100644
index bc5bf5b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram
deleted file mode 100644
index 03c638a..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam b/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam
deleted file mode 100644
index d002a34..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce#unmap2.sam
+++ /dev/null
@@ -1,29 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:CHROMOSOME_I LN:1009800
- at SQ SN:CHROMOSOME_II LN:5000
- at SQ SN:CHROMOSOME_III LN:5000
- at SQ SN:CHROMOSOME_IV LN:5000
- at SQ SN:CHROMOSOME_V LN:5000
- at SQ SN:CHROMOSOME_X LN:5000
- at SQ SN:CHROMOSOME_MtDNA LN:5000
- at RG ID:UNKNOWN SM:UNKNOWN
- at PG ID:bowtie2 PN:bowtie2 VN:2.0.0-beta5
-SRR065390.14978392 16 CHROMOSOME_I 2 1 27M1D73M * 0 0 CCTAGCCCTAACCCTAACCCTAACCCTAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #############################@B?8B?BA@@DDBCDDCBC at CDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:1 XM:i:5 XN:i:0 XO:i:1 AS:i:-18 XS:i:-18 YT:Z:UU
-SRR065390.921023 16 CHROMOSOME_I 3 12 100M * 0 0 CTAAGCCTAAATCTAAGCCTAACCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################################???88:;98768700000<>:BBA?BBAB?BBBBBBBB>B>BB::;?:00000 XG:i:0 XM:i:3 XN:i:0 XO:i:0 AS:i:-6 XS:i:-13 YT:Z:UU
-SRR065390.1871511 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA <?@<@A8>0:BB@>B<=B@???@=8 at B>BB at CA@DACDCBBCCCA at CCCCACCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.3743423 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ##################?6@:7<=@3=@ABAAB>BDBBABADABDDDBDDBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.4251890 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###########@BB=BCBBC?B>B;>B@@ADBBB at DBBBBDCCBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.5238868 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA @,=@@D8D;?BBB>;?BBB==BB at D;>D>BBB>BBDDB<DABADCACDCCBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.6023338 0 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAGCTAC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC at CCDDDBCCABB=DABBA?################ XG:i:0 XM:i:3 XN:i:0 XO:i:0 AS:i:-6 XS:i:-6 YT:Z:UU
-SRR065390.6815812 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############?@.@?B;B0B=;<DADB@@BDDBBDDBCBCBD at CCDCCCCCCCDCCCCCCCCACCCCCCCCCCBCCCCCCDCCCCCCCCCCCBCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.6905811 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA #######################BB@>A<BC>@@BCCB@=BACBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.8289592 16 CHROMOSOME_I 3 1 100M * 0 0 CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA ###############################A?@C9@@BC=AABDD at A@DC at CB=@BA?6 at CCAAC@+CCCCCCCCCCCCCCC at CCCCCCCCCCCCCCCC XG:i:0 XM:i:0 XN:i:0 XO:i:0 AS:i:0 XS:i:0 YT:Z:UU
-SRR065390.33808391 4 * 0 0 * * 0 0 GATCGCACTGAAAATCTGGATATAGAACGTGTGCAAATGATTGTCTCTACCGTTCCGTAAAAATTATTGCTAATTAGCAATGATTTTAAGCTAATTAGTT CCCCCCCCCCCCCCCCCCCACCCCCACCCCCCCCCCCCB;CCCAACCCCCCCCCCCCCD=B9BCABCBCB>BBBC at B<<@BA;BCC?B>A<<@(?:4==4 YT:Z:UU
-SRR065390.33808433 4 * 0 0 * * 0 0 NCATCTTCTGCAGGCGCGGTCGGCACCGTGTATTCGTTACGTTCCACGCCGATGATATTAGACACCAGCACGGTGTGATGCGCAGTCACCGCACGACCCG !################################################################################################### YT:Z:UU
-SRR065390.33808462 4 * 0 0 * * 0 0 NGTTTGAGCGCAATGACTTGACGATGACCGGTGATTACAGTAACCAGCATATTGTGCCGATGAAGCAGGCTGTCGCTCCGCAATTTGAAGAGGGACACGA !################################################################################################### YT:Z:UU
-SRR065390.33808468 4 * 0 0 * * 0 0 NGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTTTATTTTACTCTCTGTGGCTTTATCGATTATTTTTTTCTCCTTGGCTTTCCTCTTTATTTTT !))))))''&585555AAAAA6AA############################################################################ YT:Z:UU
-SRR065390.33808471 4 * 0 0 * * 0 0 NCGTCTTCTGCGGTTTCTATGATAGAGCAATTCTGTGGCGGATATTAAGATAACGGGTATCTGTTCTTTAATGATGCCGCAAAAAATGGAAAGTTAAGAA !################################################################################################### YT:Z:UU
-SRR065390.33808489 4 * 0 0 * * 0 0 NGGAAATTCTGCGGTATCGAGAGATATTTGCCTTTAATTACCCCATAGCCGATTAACATCCCGGCACTATTAATCATTTCAATATTATCAATCACAAAGT !################################################################################################### YT:Z:UU
-SRR065390.33808504 4 * 0 0 * * 0 0 NTGGAACACCATGCCCACTTTCGCACGCAGCAGGGCGATATCCTGAGAGTTGGTCAGGATGTTGTCGCCATCAAGCAGAATTTCACCTTCCGCACGCTGC !################################################################################################### YT:Z:UU
-SRR065390.33808511 4 * 0 0 * * 0 0 NCAGAAATATATTGAACTTTTGAAACATGTCCCAACTTTTTTTTTTTTTAGAACACGTTGGCTGGTTTTTCAAGTTTTGAATACTTTTTAGGTTTTTTTG !***()(+++AAAAAAAAAA:78:8318::AAAAAAAAAAAA########################################################## YT:Z:UU
-SRR065390.33808521 4 * 0 0 * * 0 0 NTGTCAATACATTGTAAGGATTTCCCATTATGTCAATACATAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCGATTTCGTATGTCGTGTTTCTTT !################################################################################################### YT:Z:UU
diff --git a/src/test/resources/htsjdk/samtools/cram/ce.fa b/src/test/resources/htsjdk/samtools/cram/ce.fa
deleted file mode 100644
index ac19897..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce.fa
+++ /dev/null
@@ -1,20803 +0,0 @@
->CHROMOSOME_I
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAAAATTGAGATAAGAAAA
-CATTTTACTTTTTCAAAATTGTTTTCATGCTAAATTCAAAACGTTTTTTT
-TTTAGTGAAGCTTCTAGATATTTGGCGGGTACCTCTAATTTTGCCTGCCT
-GCCAACCTATATGCTCCTGTGTTTAGGCCTAATACTAAGCCTAAGCCTAA
-GCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAATACTAAGCCTAAGC
-CTAAGACTAAGCCTAAGACTAAGCCTAAGACTAAGCCTAATACTAAGCCT
-AAGCCTAAGACTAAGCCTAAGCCTAATACTAAGCCTAAGCCTAAGACTAA
-GCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAAGACTAAGCCTAAGA
-CTAAGCCTAATACTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTAAAAGA
-ATATGGTAGCTACAGAAACGGTAGTACACTCTTCTGAAAATACAAAAAAT
-TTGCAATTTTTATAGCTAGGGCACTTTTTGTCTGCCCAAATATAGGCAAC
-CAAAAATAATTGCCAAGTTTTTAATGATTTGTTGCATATTGAAAAAAACA
-TTTTTCGGGTTTTTTGAAATGAATATCGTAGCTACAGAAACGGTTGTGCA
-CTCATCTGAAAGTTTGTTTTTCTTGTTTTCTTGCACTTTGTGCAGAATTC
-TTGATTCTTGATTCTTGCAGAAATTTGCAAGAAAATTCGCAAGAAATTTG
-TATTAAAAACTGTTCAAAATTTTTGGAAATTAGTTTAAAAATCTCACATT
-TTTTTTAGAAAAATTATTTTTAAGAATTTTTCATTTTAGGAATATTGTTA
-TTTCAGAAAATAGCTAAATGTGATTTCTGTAATTTTGCCTGCCAAATTCG
-TGAAATGCAATAAAAATCTAATATCCCTCATCAGTGCGATTTCCGAATCA
-GTATATTTTTACGTAATAGCTTCTTTGACATCAATAAGTATTTGCCTATA
-TGACTTTAGACTTGAAATTGGCTATTAATGCCAATTTCATGATATCTAGC
-CACTTTAGTATAATTGTTTTTAGTTTTTGGCAAAACTATTGTCTAAACAG
-ATATTCGTGTTTTCAAGAAATTTTTCATGGTTTTTCTTGGTCTTTTCTTG
-GTATTTTTTTGACAAAAATTTTTGTTTCTTGATTCTTGCAAAAATTTTTC
-CGTTTGACGGCCTTGATGTGCACTACCTTCGCTTAAATACTACATTTTCT
-GAAAATGTTATAATAGTGTTCATTGTTTCATACAAATACTTATTTAATAG
-TATTTCTGGTTATATAATTTGTATAAAAAGTGGTTGACATAACAAGGCTG
-ACGAAACTTTGTGATGGCTGAAAATATTTTCCTAGCTTTATTGATTTTTA
-TTTATACGTGTTTGAATAACTTGGCCAAATCGCCGAGAAGGAATAGAATA
-CTGGACGACATTGTACATATTTTCCAAAAAATCAGAAAGTAGATGACGGG
-ACCAATTCTTTCTGTCAGGTTTTACAACCGCCCAGTGCGTCTACGTCACA
-TGTTGTATAAATGGTTGTAAACAATATGCGGAAACAATCAAATGCATTCC
-CATAAGGCATAATATAGAGGCTACAGGCAATGAGTATCGCTCTTTGCTTT
-GTTTAAAGGGGGAGTAGAGTTTGTGGGGAAATATATGTTTCTGACTCTAA
-TTTTGCCCCTGATACCGAATATCGATGTGAAAAAATTTAAAAAAATTTCC
-CTGATTTTATATTAATTTTTAAAATCCGAAAATCCATTGGATGCCTATAT
-GTGAGTTTTTAAACGCAAAATTTTCCCGGCAGAGACGCCCCGCCCACGAA
-ACCGTGCCGCACGTGTGGGTTTACGAGCTGAATATTTTCCTTCTATTTTT
-ATTTGATTTTATACCGATTTTCGTCGATTTTTCTCATTTTTTCTCTTTTT
-TTTGGTGTTTTTTATTGAAAATTTTGTGATTTTCGTAAATTTATTCCTAT
-TTATTAATAAAAACAAAAACAATTCCATTAAATATCCCATTTTCAGCGCA
-AAATCGACTGGAGACTAGGAAAATCGTCTGGAGATAGAACGGATCAACAA
-GATTATTATTATATCATTAATAATATTTATCAATTTTCTTCTGAGAGTCT
-CATTGAGACTCTTATTTACGCCAAGAAATAAATTTAACATTAAAATTGTT
-CATTTTTGAAAAAAAAATAATTAAAAAAACACATTTTTTGGAAAAAAAAA
-TAAATAAAAAAAATTGTCCTCGAGGATCCTCCGGAGCGCGTCGAATCAAT
-GTTTCCGGAACTCTGAAAATTAAATGTTTGTATGATTGTAGAACCCTTTC
-GCTATTGAGATTTGATAACTTTTAAGTAATAAAATTTTCGCAGTAAGACA
-TTAAAACATTTCACAATTAAGCTGGTTCTGAACTGTGTGAAGTATATTGA
-AAAAAACTAACTGATACAAAAATATAATTTTATGATAGTTTTCTGGATGT
-CCCAATATAAACGATGTCAATTCTGCGACATGCTACAGTCATCCACGAAA
-GTAACCCGAATACCGACAAAAGAAGAGGAACGCCAACTTTGGATAGACGC
-TCTAGGGGCTGATTTTGGTCGGAAAATAGTCGGGAAAAAATAGAGGACAT
-TACAGATGAGGATGAGGATGAAGATAGAAATTTGCCGACAACTTCGTCAT
-GCCGCTGATTTTTTTGATGTTCTACGCTTAAATTTTCAGCGAACGAACTA
-TTTTTTATATTTTGATTGTTTTTAAATAATATTTGCCATAAGAAATTCTC
-ACTTTTCCAGGAAACGTCGTTTCGCCGCGATTTTCCTCGTCTCCAGTCGA
-TTTTGCGCTGAAAATGGGATATTTAATGGAATTGTTTTTGTTTTTATTAA
-TAAATAGGAATAAATTTACGAAAATCACAAAATTTTCAATAAAAAACACC
-AAAAAAAAAGAGAAAAAATGAGAAAAATCGACGAAAATCGGTATAAAATC
-AAATAAAAATAGAAGGAAAATATTCAGCTCGTAAACCCGCAAGTGCGGCA
-CGGTTTCGTGGGCGGGGCGTCTCTGGCGGGAAAATTTTGCGTTTGAAAAC
-TCACATATAGGCATCCAATGGATTTTCGGATTTTCAAAATTAATATAAAA
-TCAGGGAAATTTTTTTAAATTTTGTCACATCGATATTCGGTATCAGGGGC
-AAAATTAGAGTCAGAAACATATATTTCCCCACAAACTCTACTCCCCCTTT
-AACAACCACCCGAGGATATATTCGACAAACGATCTATCTACTAGGAATAA
-CTCGATTATTGACATATTATAGACTTCTTTTAGTATTTGTAAAATAGAGG
-ATCAGACCCAAAATTCAGCCCGCGAAGGCATGACGTCAGCGCGAGGCAGT
-AGTTTCCAGAAGAACTCTGTCGTCTACCTTAATGCCTCAAATGCGAACCC
-GCTTCGGCCATCCTTCTCGCTCAGAGAATGGATTAGAGTTCTCATCAACT
-CCTCTGTCTAATTTTCAACTGCGGCGGTTGGCGACCGGTATTACCGCGGC
-GACCGACACCTCCCGGGTTCCGTCGATCGCTGTCTGTTGTGTGCGCCGCG
-ACTCCGCCCACCGGTGGTAACTTTTTGTGGGGGAATCTTTGTTTTTGGTC
-ATTTTTCAGCGCTTTTCAGCGATTATTGACCAATTTTGAATAAAATTTTC
-AACAGAATATCATCTAAAATATTGCTTAACATTTATTTAACAGAAATAAC
-GTGAGCACGCATGTAAAACATGAAATTTTCGGGAAAATTGCAATTAAACG
-AATAAAAATCGATATTTAAATCAATTATTGGTGAATCCGGTGTGTTGAGG
-CTTCAATGCATACATTTTTACTGGATAAATCTCCTTTGGGAATCCGGTTT
-GCAGTGCTTTCGAGACCATGTCCAGTTGAGAATCGGCGAACGCTTTAAGA
-AGCTCGGGCTGAATAATGAATTGTTTTAAAAAATGTTTAGTAAAAAATTG
-TTTTCGTGCAAATTGTCTTCGATATTATCCAAACGTGACGTTTTGCGATT
-TTCGCGCTAAAATTACAGTAAGTGGGGTCTCGACACGACAATTTTTGTGA
-AATACAAACGGGCGTGTGTCTTTAAGAAGTACTGTAGTTTAAAAACTTCA
-TTTCTGTGGAATTTTCATATATTTTTCATAGTTTTTCTCTTTAAATAAAT
-CACTTTTCAACAAAAAACTATGAGACAATAGTTTGAAATTACAGTATTCT
-TTAAAGGTGCACGCCTGCTCGAATTTCGCAAAAACGTGTCGTGTCGAGAC
-CCCAATTACAGTATTTTTGACCCGAATATCGCGAAATTTCGAGTCTGGGT
-GAAAACATTGAAATTTTTGGCAAAATAAAAGAAATATGTCCTTTTTCAGA
-ATATATTTTCTAAATTTCGAGACGAAACAACAATTTTAAATGAATTTTAA
-TTTTAAATATTAAATATTTCGGAATTTGGCGTTTTTTATGCATGTCGATT
-CACTAACGATTTTGTACTACACGTGGGCAAGTTTATACAGTTTTTGGCTA
-AAATTTGTGAATTTGAACCGTTTTTCGGCGAATATTTGAAAAATTGGCAA
-AACTGGTTCAAAAACAAAAATTTTTTAAACTGTACAAACTGTCCAAAAAT
-TCGTCGTAAATCGACACACCCTTCTCATTTTTTCAAAATTTTAATTGTTT
-TCGAATGTTTTTTTTGCAGAATAATTTGTAAAATGAGCCTTTTGTGAATT
-TTTTTTAATTTCAAAGTTTTTATTATTTTTTCTCAAACCAGCACCTCTGT
-TCTCGTCCAACTATGATCATCATCGTCGAATAACCGTTTCTCGTGATTTG
-TCACATTATCCTTGAGCACAATACATCCACCAGGTTTCAGTCCTTTCTGA
-AAATGAAAATTAATTTTAAAAAAATTGAATTATTTTAAATGAAACAGTTT
-TCAGAGATTTCTCAACTTTTGAGTCCACCACCAGGCCTGCACGTTTTTCG
-GGTTTTATCTTTTAAAAAACTGAAAAATCGAAAAATTTCAATTTCTGTTT
-TGTGGTCAAAATTGTAATTACAGGTAAGCAAATAGTTTAATTTTAAAATT
-GAAAATTAGGGAAATGACCGGACATAAGTTTAAAAACCCGATTTTTTCAA
-TAAAAAGGAAAATTGAAAATTTAATAAAACAGGTTGTAAATCAAGGAGAT
-CGTATTGATTGAAAAAAAATCCGAATGTTCCGGATTTTTCAGTGGTTTTT
-TTTGAAAGAAAATCGAAAAAGTAAATGTTTTTAATTTTTAAATTTAAATT
-TTTAATCGGAAAAAATGTACGAAATTGACTTTTTAATGTGAAAAATTGTT
-GTTTTAAAAAAAAATTTTAACCGATACAGATTTTCTAGACTCAGTTTTTT
-CGGTTGAATATTGTTTTTTACTATTTTTTCATTACAGAAAGAATCCAATT
-TTATTTCGCTTAAAAAATAACCGGAGCATCGAAAATATTTTTTTTTCTGT
-TTTACTCAAAGCATTTCAATTACCTAGAATTTTGTTTAAAAACTACATGC
-TTTATTTATGAACGTAATAAATAAGACCCCCTCTTATTTATAAACTTTCA
-ACATATTTTCAGTTTTCAGTGCTATCTAGTGCTTACCGCACATCTTTTAA
-AGAAATCAACCAAATCCTCATCAACCAAATGCCCTGAAACCCATTGAATC
-CATATCAAATCATAACGTCGTTCGGGCGGTGCAAACGTCTGCAGTCCTTC
-GACGAATTTATCTCCAATTCGTGGATGTTTTCCAATATATTGATCACTTT
-TCGTGATCAACTCCTCGACGACGTCTTCCATATCAACTTTCGAGAAGAAT
-GGCATTAAGAGATGCTTTGTAACACGTCCGATACCCGCTCCGCAGTCCAG
-TGCATAGTCAAAGTAGCCGAATAGATTCTGGAAAATATTTATAAAATTCA
-AAGTTGGCCCAGGGGTGACCGGCAATTTCAAGCAAATCGGCAAATTGTCA
-ATTTTCTGAATTTGCCGAAAATTTGACAAAAACGACAATTTGCCGGTTCG
-CCGAATTTACCTTTTTTAAATTTAATTTTCAATTCAGGCAAACTGACGAT
-TTTCCGTTTGCCGGATATCAATTTGCAGGAATTTCTCAAAGGAATTTTTA
-TTAAGACGGAAACACAGTGCTTTTTTGAATTTTTTTTCCCGTTTTCTTCA
-GATATTTTTATAGAATTTACTGACTTTTCAGAATAGATGTAGGACAATTT
-TGTTGTTTTAAAAATTGAAATTCTGAAATTTCCAACAAAAAAACATGTGC
-AAACCCACAAGTTGGCAAAAATATTTTGCATTTGCCGTTTTTCCCGTTTG
-CCGAAAAGTCTAATTTCGGTAATTGGGCCATTTTTCGAAATTTTGAGCCA
-CATAAAAAACTTTGAACCATTTTTGAGAAGTATTATTACGACATTCGTTT
-ATTTGAGCACAATTTGGGCCTATACTTTCAAAATCGGGGTTTGAAAACCC
-CTATATGTTCGACCGAATGTTAATCTCATAAAAATTTGATGAAAATAAAA
-TTTTCTACGGCTCATAAACGTATAGCCCCCGTCAGTCTCAAAATTTATAC
-GATAGACACTTTTTGGCGTTTATCGCCTATATTCCGTCAAAAACCATTAT
-TCATCATTCTTTCAATGTTGTTTTTTTTAAGGCTAAAAAACTTTCATGCA
-AATTTGTTAGCCGTGTCGTGGTTTATACGAAAATTTCAGAATTTATAAAA
-TAAAGGAAAACGAAAATGTTTCTATATACCCTATTTATGTTCTCTGATTC
-CGAATACCAATGTGAAAAATTCAAAAAAAATTCCCTGATTTTATATAAAT
-TTTTGTAAGCGACAAAAATTGTCGTTTGAATTTCACACTTGGTTACAAAA
-ATTTATGAAAATGAGGAAAATTTGTTTTAATTTTTTCACATTGATATTCG
-GAATCAGGAAAATAAATAGGGTCTATAGAAAAATTCCGAACCTTCACTCC
-TTCTCTGAGTATAATAAATTTAAAATAAATACAGAAAATTTCAGTTCAGA
-CCTCATTAAATTTGGGTATATTTCTAGGATCCGAGTTTTTACACCAGATT
-TACAAACTTTTAGCCTTTCACCGCCTTTTTATGCGCATTTCCCATCAGTC
-AACTCCAAAAAAATCGCAACTTTTGCCTCATATTTCAAGAATATTCCCCT
-TTCTCTCCCCATTGAAAGTCATTTTCGAAACAAGCGGAAGATTCGTCATA
-TGTGGTAATGTGTGGCGTGCGTTGGCAAACAACAAGAAAGAATCATTCTC
-TGAAAACAAAAAGCGTTTTGGGTGCCAAAGTAATATTGAAAATCTGCCGT
-GTTTTCTCATTTTCCATCAAAAGAAAATGAGAAAAAAGTTTCGGCGTTTT
-ATTTGATTTCCGGGAAAGAAGACTCGGAAAAAGATTTAATTGAATTTTTC
-ATAGCAAACCTATATTGCAACAACTTTCTAAAAGGTCAGAAATTGCCGCG
-TAGCCTAGAAAATTGGAAAACTCTTCCAGCTGGTATTATTTCAGACATGG
-TGCATCGAAAATTCGAAAATTACAGAAATTAACATTTTGGAGCATCTGCC
-AGAAAATTGAGATTACAGTACCCCACTTCTGCCGAGAAATTCGAGGTGGA
-AGAGGTCTTACAAAATTTTCGGTCACGTGAAAATGGGAAGCGTTCAGGCT
-CCACACGACGGAATTCACCTAGTTTTCAGGTGAGAAGATATCGTACGAGG
-AGAATTGACCTCCAAATCCTGATCGTGACTACAGGTCGTCGTTCGGAGCT
-GTGGAAGAGTTTTGAAAATCTTCGACCATGAGAGAAATAGACAGGACGAC
-CAAACATTTTCAGTGGAAGAGCTTTTCCTAGGCCATCAGGATGCTATTTC
-GACAGAGCTGAGTTATCCTCAAGTCGTTACGAGGTGTGGAAAAGTTTTCC
-AAAATCCCCGACCAGGTAGAAAATGAGCACACCGATTAAGTTTCTCCAGT
-GGTAGAGTTTTTTCTAGGCCATCATTATGCTATCTAGAAAAAAGCTTCGG
-CCATGGGGTTTTTAGGCCGTCTATTTATTTCTCATAACTTTCTCAGAAAT
-TCGTCTATTTCTCAGAACCCCCCAATGATAAGTTTTTTGCAAAAAAAGTT
-CTGCTTTGCTCATCAGCCGTAATCAGGTGACCTCATTAGGCCTACCCAAA
-CACAGATTTGTCATTATTTTTCAGACAAAAAACACGAAAAAAATCTTCAC
-GCATGGGGTGATAACCTGATTTTAAATCTTACTGTGCCGGCTGGCGCGGC
-GAGCTTCGATCACTGAGCCGAAAGATTATGAAAACTATGGGAATGACGGC
-GTAGCCTAGAAATCGTCCAGGCAGAGATTCTGTCTAATTTTCGAGCATAT
-ATCTCCCAGTTTTGTTATTAATTTAAGTAAACTCAAACCTAGAAACAAGT
-AAAACGGGAGGGGGGGGGGGAATATCAGAAAATTAAATCTTGCGACACTT
-TTCCATTGATACTTTCAAGGTAATGCCCAGAGGTGTGCGGCAAATTTTGA
-AACTTGCGCATGCCGCCTTTTTTTTTTTCTAGAAAACAGTCAGAATTTTT
-TGTCGAATTTGTTGAAAATTCGCTAATATACTGTGAGTTTAGAAAAAATA
-ACGAAAAAACTCGGAAAAGGAGGAAGAGATCTGAAATATGTAGATTTTTT
-TAGAAAAGACCAGAAATTACTGAAAAATTGGCATTTTTCGTCGAAACCCC
-AATATACTAAATTATTCGGATTTTTAGAAAATTTTCAAATTCACCATACA
-GTGCATTTTTTCCTACTTCTACGACTTTAAAGGGGGGAGCATTTATGCGG
-AAGGGTCTTGCCGCGCATTTAGTCATCATTTTTAGCAGTTTCTGTGTAAA
-ATTCGCGTAGATCACATGAAGATCACAAAATATTTATCCCATATTTCGTA
-TTTCTGTTGCTTTTTCACAAATTAATTGTGATCTACGCGTGATCTCCGCG
-AATTTTGAGCAGACTTTGTTAAAAATGATGACTATGTGCACGGCAAGACC
-CTTCCGCATAAATGCGCCCCCCTTTAAAGTCGTAGAAGTGGAAAAAAAAT
-GCACTGTAGCAAAAAATCGAACATTTCTGTTCGATTTTTGAATTTCTCGA
-AATTTTTTAAAATAATTTTTAAAATAACATTTTTATTTTATTTCGAAAAC
-TACCGATTTTAGAAAAATTCTAAAATTTCGATTTTTTTTGTTGATTTTTC
-GATTTTTAAAATAAAATTTCATAATTTTTTAAACCGATCTTTCTTGCTTT
-TCCTGAAAAATCGATGATTTCTATACCTTTTTCTTCAGTCCTTCAATAAA
-TCGTTTCGACGCCGATATGTCGGGCGCGTGAAGCGCTTCGAATCCGCCGA
-GCATTCCGTTGACGTCCTGGCTCGCGCGGCTCCAGTATTCCTCCGCCTGA
-AAGAGAATAGTTGAAAACATTGTTTTGAGACTTAAAAATTTTTTTTTTAG
-TTTTTTTCAAAAATTCTTACATGTTATAGAGTTTTTTTTTCAAATTTTCA
-GCTTTTTTCAGAAAAACTTAGTATTTTCGATAATTTTAAATAAAAAAGTT
-TTTTTTCAAAAAATGTTTCGGTTTTTTTTTTAATTTTTGGTCTAAAATTC
-TCCGCAAAAGATTTGCGTGCTGGCCGAACTTTTTGATTTTGTACCTTTTC
-ATAAACATCTTCACCATTGTGAATTCTAGAAGATGATGAAGAGCTCATTT
-TTGATGTTGTGACAGCTGCTCCGAGCAATCTGGAGACTTTTGTGACGAAA
-AGACGAGAGGTCACGGATATGATGATGATACTGGAAATGAGATATTTATA
-TTTACTAGTTCATCGGGAAAATTATTACGAGAAAGATAAACAGACATGTG
-CGTTTTTTTAATGGAAGAGAAACACAAGAAAAATCTGGAAAACTAGGCCA
-CGGCTATCAGTGTCGATTTACGGCATACGGTCTCGACACGACTATTTTTG
-TTAAATGTGAAGGTATGCACCTTTAAAGAGTACTGTAGTTTGTAACTCTC
-ATTGCTGCAACATATTTGACGCTCAGCGAAAACTACAGCAATTCTTCAAA
-AGACTACTGTAGCCTTTGTGTTGACTTACGGGCTCGATTCTCGAAACGAA
-TTTCTGCTCGAATTGTGACAGCCATATTCAATTTGGTATAGTCTTTTCGT
-ATTTTTTGCCATTTTTCTGTTTTCTTCTAATATTTAATCTATTATTAAAT
-TATGTCCGTAACTCCCTCCAAAATTAGAACTGCGACCGAACAGAGATTCG
-TTCCGCCCCATATTCCGGCCAATCAGATCGAGTAGGCGGAGTTCGAAGTC
-GCTGATTGGTTTGAAAAGTCGCGGAAATTTGCAAGTTTTAAGGTAGCGAA
-AACTGATGACTATTGTAGCGCGCTTGTGTCGATTTACGGAATCTCGATTT
-TCAGGAATGAATTTTTAATTACATTTTTTCGCTCAATTAATATTCTAAAT
-AAATAAATAAATGATTTGAATTAATTTAATTTCATTCGAGCCCGTAGATC
-GACACATGTGCTACAGTAATCATTAGTTTTCGCTACGAGATATTTTGCGC
-GTAAAATATTTTCCCGTAATAACTCTACTCCGACAAACATTACGACCTCC
-ATGGAGGCCTCCAGGTATAGGTGAGACTCTTGTATTTCCAATTCAGAGAC
-AATGCGTCACTGGAAGAGAAAACGAAGCGGAAAAAAAAACACGGAAACCC
-AAAAATAGTGTTTGCCCCGCTCTATTCTTCTCCAATAATTTCTGTGTCTA
-ATTTTGAAAGACTCCACCTGTGTATGCCTTCTCGACATAAACCCCCCCCC
-CCCCCCCTATCTTACATGGTACTGATAACACTTTCAGTCTTTCACACTTT
-TGGCGCGCAACGCCGCTCTTTTTTCGCGGCGAGCTGATGACGTCATCAAT
-TTTTCATCGCTTTTGATTATCTTCAATGTTCTAGAAGGGCACATAGGTCA
-TCCTTATTTTTTCCTTCTCTTTCTCGTGACGGCCCTTGTTGCGCATGCCC
-GCCCCCTAGAGCAGGGCGTGGCCTGAACGGCGGCTCCGAGAGCTACTCAT
-TCTTGCCGCGTCACCCTCCAGCGCCACCCAAACTTCTTCGGTTCTAGAGA
-TCGAGAAGAACGTATGATTTTTTAAAATTATAATTGTTTCTTTCGAAAAA
-AAAAATTTCATTTACAGTAAGCCAAACATACACAATCAACATGAAACTCG
-TAATTCTGCTATCTTTTGTTGCGACAGTTGCGGTTTTTGGTGAGTTTATG
-CTTTAGATAATACTTTTCCGCCAAAAATACAGTTGCCGGTCTCGGTATGG
-CAATATTTTTGTTAAATTCGAAAAGCAGTGAGTAATGTAGTTTCGAATTT
-TCGTTTCTGCTTAATTTTCATCAATTCATCGTTTTTCTCACGACTTCTTC
-TTTATGAAAAATCAATGAAAATTCTGACTAGGTCAGCTTAGGGGTGAGGT
-ACCTAGAGACGCCACATATGCCAAACGGAAGCTGAGATCATTGGCTACAA
-GAATATGCTTTCAAATTCTGCAACGGACCTCTGGGAGTCTGGAAATTCTT
-GTCTGAAATTATGCTTTTGAATGCTCGAAAGTGGTAAGAATTTAGAATTT
-ATTACAGAAAAACGTTTAATTAATAAAATTAGTTTTATACTTGAAACAAG
-TACTGTATGCACTGTATCAAAACACATTTTCATCTTTTCTAGGTATTCAA
-CTTCACGTTTTTCTGTAATAAATTCTAAATTCTTACCACTTTCGAGCATT
-CAAAAGCATAATTTCAGACAAGAATTTCCAGACTCCCAGAGGTCCGTTGC
-AGAATTTGAAAGCATATTCTTGTAGCCAATGATCTCAGCTTCCGTTTGGC
-ATATGTGGCGTCTCTAGGTACCTCACCCCTAAGCTGACCATTCCCTAGTG
-AGCAAACAAAATTTTGAAATTACAGTACTATTTAAAGGCACATTGATTTT
-TTGGGTCAAGCAAAAATTTGTCGTGTCGAGACCGGCTACGGTATTTTCGC
-GAAAAATCGCAAAATCTTGCGGCTGGGATATACTTGTGCGAAATACTTTT
-TGCATTAATTTTGAGCAAAATTATTTTTTTTAGACTTTTTGAAATCCAAA
-TTTTTTGGATTGCGAAAAAAACCTGTGTCCGGTTGTTTCATTAGGCCAAC
-AAAGTTCCTGGAACACTGATGAAAACCATGATAGAGGCGGAGCATAATAT
-CGATTTTTCGTACTTTCCTGTATTTCTTCTTCTATATGGCCGAGTAGAAC
-AGGATTAGGGGTAAAGTCAAAATTTTTCTCATATGGATATCATATGGATA
-TCAAAATTTTTCTCATATGGATATGGAGAAAATTTTTCTCATATGGACTT
-TGAAAGTTGAATCACTTGACATCTGGGAAATTAGTATTCCAGGCGTAAGT
-CGGATCTGTTAGAAACGGAATACTTATAGGCTTCGTGAATTAGGTAGACT
-TTCAATTAATCTGATCCATGGGAGTCAGACGCGGTTTCCAGGCCTGACGC
-CTGCCTCCAACTTGCCCGCCTCACGCCGGTCTCTCGCCTCATTTCTGCAC
-TGTGACGAGACAGACGAAGGTCGCCTTCTGGCGCCCGCATGGAAATCCTA
-CGAATATGTCAGCTTCTGATGGGACTCCGTAAATCGACACACAGGGGTAC
-CTCAGACATTTCCCTCCCCCTTACAAATTGTTAGGACAAGGAGGGGGAAT
-TCATCTCCACTCGAGACACACATATGTTGTCGTCAGTGAAGTGTAAAGAT
-CTAAACGATTGCGTGTATGAAAAAGCACTCTATGATCACCTTTTTCATCT
-TCCTACACCCTTTTTAGGTGTGGTGCCCATCGAGCACTCACGCCAGGCAG
-GGAGAGCACCGGTCCCTGACTAATGGGATTCGAATGTTTTAGACCGGAAA
-TAGGAGCGATGAAAGAGCATAGAAATGATCATTTGGAAATCACGTTTAAT
-TAGGTTACGGCGAAAATTTGCAAAAAAGAGCAGGAAACTTGGCTCAAATC
-CTTCGAAATATAACAACTAGGACTTCCATGTAGGCGTTAAAGCGCCCTGT
-CTCTCACCCCAATCCGTACCTTAAGCTGAAACAAACGTGAACTTTTTTCA
-TTTCTTAAAGGAGTATCGTCAATGGGAAAATTGTTTTAAAATGTAGTATT
-TGTACTTCAACTTCCAATTATTGCAAAAGAAAAACGGAAAAAATCCGTTA
-ACATTCAGCATTTTAAGTCGAAGAAATCTTTAAAATTTAACTAGAGAAAT
-CCTAGGCCACGACGCTCATTCGAATTTTAATTTGTTTTGATATTGTATTT
-TGAAAAAAAAACTTAATACAATTCCTTCTTCCCAGTTTTCTATAACTTTT
-TGAGAAAAAAACGAATTAAATTCCGAAAAAACTACATTTAAATCAATATT
-TTGTTTACGAATATGGCCTAGAAATCGCGTGGTGGCCTAGGATTCATTTG
-CGCGCGAAATTCAAATTCCGTCACTTTCGTCGATTTCAACGGCTAAATGC
-TGAATGTCAACGGATTTTTCCCGTTTTTCTTTTGCAATAATTAGAAGTTT
-GAGTACAAATACTACATTTTAAAACAATTTTATTTTTGGTATTTTGACGA
-AAAATTGATTTATTGGTTTTTTTGGTTGTTTGGGACCAAAAAATCCAAAA
-AAAATGTTTGGCGTGTCTAGTTTCGACTCGAGACTATTCTGTATTAAAAA
-TACATTAAAACATGTATTTTAACACAGTTGTGACGTCATAAATGTATTTT
-GATACATTTTGCAACATTACTTAAATAACCCCATTAAAAATTAACCTAAG
-CATCAAAAATTTTTTGGTTTTTTTGGTTTTTCGAAAATTTCAATTTTTTT
-TGTTTTTTGGTTTTTTTTGGTTTTTCAAAAACTTCAATTTTTTGTTTTTT
-GGTCCAACATTTTTTTTTGGTCTCAGCTCTGCTGCCTACCCTAGAAGAAC
-TAATAGCGCTTCAAAAACTGATGAAAACGTTCAAATTTGTCGAAATATTA
-CGAAAATTTGAAAAGTTGGCTCAAATCTAGATTGAATCGGCCGATTTTCC
-ACAAGTTTCCAAGTTTCCACAAGTCGCCACATATCCCGAGAAAAATCGAT
-TCAAATTGTTTGAAAATTGGAATACTGCGAATTTTGAACCAAATTTCCCT
-GGCTTCTCTGTTGAAATACTTGAAAATACCGCGAAGCAAACAAAAAATCT
-AATTATTACGTGAACACAAAATTCTGAAAATGCGTATATATTGCGCAACA
-TATTTGACGCGCAAAATATCTCGTAGCGAAAACTACATTAATTCTTTAAA
-TGACACGCTGTATGTGGTGATTTACGGGCTCAAAAAATTATTTTCGAAAA
-TCAAGCCCGTAAATCCACACGTAGTAATTATATAAAGAATTACTGTAGTT
-TTCGCTACGAGATATTTTGCGCGCCAAGTATGTTGCGCAATACGCAACCC
-CATATGTTGATATATACTGATGTGAGGATAAAAAACAACACAACTTTCAG
-CGGCTCCATCGGCTCCGGCAGGTCTCGAGGAGAAGCTGCGTGCTCTTCAG
-GAGCAACTGTACAGTCTGGAGAAAGAGAACGGAGTTGATGTGAAGCAAAA
-GGAGCAACCAGCAGCAGCCGACACATTCCTTGGATTTGTTCCACAGAAGA
-GAATGGTCGCGTGGCAGCCGATGAAGCGGTCGATGATCAATGAGGATTCT
-AGAGCTCCATGTAAGTTAGTGGTGGTGGCCGGAAAAGAGAAAACTCGGCC
-AAGCTGCTCGGAGTTTTTGAATTTTTGATAATCCGAAATAAAAATTGATT
-GCTCGAAAAGGAACAATCTTTTGGAAAAAAACGAATTTTGTCATTTTTTT
-CAGCAAAAATTGATTTTCGAATTTTTCCAATAAAAAATCGATAATTTCTC
-CCCGTGCAGTGGAAAACAAACAATATTTTTTTGTTGATCGTTCTCTTCCA
-AACCCGGAATAGGTACACACATTCCTGCGTCATCCCATTCTCTTATCACA
-CTTTTTTTTCGAAAATAAAAGTGTAGAGACGGAAAAGTGAGAAAGGAGTC
-AATTTTATGCGAAATTTTGCATGATAATACACTCAAATTAAAAAAACTGC
-GTGGCGTGCACTGCAGAAAACCTCATATTTAGGCCCCGCCTTTTTCTCGT
-CCACTCACGGAGAAAAGGCAAAAATTTGGGGACCAACCAATATCAGGCCG
-CCGACATCCTACGGGTTCCGCGCGCCGCTATGTTTAACTCGCTGTGGGTG
-TGGCGAGCTGTCTCCGCCCGCTGCGAGTTAAACATAGCGGCGCGCGGAAC
-CCGTAGGAAGTCGGCGGCCTGATATTGTTGGTCCCCAAATTTTTTCCTTT
-TCTCCGTGAGTGGACGAGAAAAAGGCGGGGCCTAATTATGAGGTTTTCTG
-CAGTACACGCCACGCAGTTTTTTTATTTTGAGTGTATAGGTCTCGATTCT
-CGAAAGTATGACAGTTATTTAAATGATGAACTCGTGATGACTGTTAAATT
-TTTGGAAATTTCGGGGGAATTATATCGATTTTTCGATAAATTTACAGGAA
-AAAAGTCCAAAATCTAGGTATTCCATGGTAGGCAGGCGCGATTTCTTGAC
-GCCTGCCTGGAATCTGTCCGCCTCACACCAAAAAATGTCAATCATTTTGC
-TGAAAACCAAATTAAGAAATGAAAAAGTGCACTTAGAGATGATGACGGAG
-GTCGCCTTAAGGTCAGACAGGTTAAAAAACCGATTTTAGTTGAGTTTTCC
-CGAAATTTTCTGAACAACCGAATTAGAAATATGCTGCTTGTCATTTTTGA
-GTAAAAATTAACGAAAACTTCGACCAAAACCACGAAAAAAATGAAGAAAA
-TAAAGATTTTTCGAGAAAATAACAACAAAATCCAGCAAATAGTGAAAAAT
-AGTTTTATCCGAGAAAAAGTAGTTTAGACGCTATGAACTCTCGAAAATCA
-GATTTTTTCAATCTAAAAGCCATAAAATTATCGATTTTTTAAAAATTCTC
-ACTGAAAACCGGCGAATTTCAGTGCTCCACGCAATCGAAGCCCGCTTGGC
-CGAAGTGTTGAGAGCCGGAGAACGCCTCGGAGTCAACCCGGAGGAAGTTT
-TGGCGGATCTTCGTGCTCGTAATCAATTCCAATAAATATTCTTTGCCCTA
-AATACTTTAAATTATCCATCTGACAACTAAAATTTCGGTTCTTCTTGGCT
-TCTTCTATTTGTGAAATGGTTTATTTTCCCCCGAACTCTCAAAAGGTTTA
-AATATTGTTCGATTACCCCTTTTTATCAATTATTTTCTTCAATTTCTTAT
-TTATCATTATTTTTCTAAACGAAGACGGATGTGATTTTAAATTATGTTAA
-TGGACTATTTTACAAACTGAATAAATTCAGCATGTTGGCAGGTTTTTTCA
-GTAGTTTTTGAGTGAAAATAGAGGTAAAAAGACAGAAAATCAATAAAAAA
-TGAAAACAAAACTATGAAAAATGGTTGAAAATCGAGCAAAAATCGTTCAA
-AAAAAAATAAATTCAAAAAATAATTGCGTCGAGAAACGCGTCAGTAGCCG
-CTCTCTGCGTCTCTCACCCTTCAGCACGCGGAGAGAGCCACGAGAAATGC
-GCAAAGGCTAAATTCGGCGCGGAAAATCATTTTTCAAAATAAATTCGACG
-AGAAAATCAATACTTAAGTAATTATCGATTTTCAGCTCGTTCAAAAAATT
-TTCAGAAACGTTTTAGTCGTTTAAAGGTTTTTTTAAAATTAAAATCGTCG
-GAAGTAAAAAAATAGCGCGGATGGAAATCTACGGAGTGCGGAGCGAACAA
-ACGCGCGGTAATTCAAATGGGTAGAATAGTCAAAATTGAAAATTAGCCAG
-CATCGACCGATTTTTTTAAAACTTAATGGATTTTTTCGTTTTTCTTTTGT
-GGTATTTCGGCATTTAGGATTAGATAGCACATTTTAAAGTAAAATTCCCA
-TCCAAGCTACTCCACCTTCTCCAGACTGTACAGTTAAACCAATTTGAAAA
-GTGTATTGTATCCCGTTTTTTTTTCTGAACAATTTTGAAAATTTTTCGTT
-TATCCAGGATACGATAATCATGATTCAAATTCGTTAACAAAAAATGAATA
-TATGAGAGCGATTAAAGCATTTGTGTCGGAAAATATGGGTTAAATGGGGA
-GAAGGGGGCGGACATTTGGATGGGGTACAAAAAAATATGCAAAAAATGGG
-CTAAAAACAATATTTTCAAATTATGCCCGACAAAGGTTCAAAAGTCAATA
-TATAGAAATGAGAACATGAGTATTATGCCACGTGGCGGGAAAAATATGTG
-GAATGTAATACGATGAGATCCTTGTGAATACAAAGCTTGTGACGACGTGG
-CCGAGAAGAACTTTTTAAGCCAACGAGAAAAAAGGGGTTCAAGGCCGAAA
-TTTTTTTTGGGCCACCTATTAAGTTAAATTGAAAATTTAAAAAAAACACA
-GCGGATCCAATTATTTGCCGAGTTTTGACTTGAGCTCGGCGCGATACGTG
-TCGATTGACTGAAAATATTGTTTTTTTTTATTTCCGAATAAAAAATGGTG
-AGTACCTCCAAAATTAGCTTTTCATTGTCCATATAGAACTTTTTGATTTG
-TTCCACAGTTTTTGTGGCCATCAACTCGGCGATCAACTCGAAATTGTCCT
-TGTACCAGTGGAAACCTGAAGGAATTTCGGATGTTTTTGCTTAATCATAA
-TCATAATAATCTTAATCATAAGACTTGGAAAATGCGAAATTTTTCGAGAA
-TATTCAATTTATCTTCAGATTTTATTGCAACAAATCGATTTTCAACATAA
-AATTAATTTTTCCAACTTTTTTTCCCAATTTATGAGAGTTTAAAGATTGT
-TTTAAAGCAAACCGCCAACTTTACATAAAAAATTAAAATATTGTGAAAAA
-AATGATGAAATTTAGCAGATTTTCTGATAAAAAATTGAATTTTTTTGGAT
-TCGCGCTTCAATTTCACATTGTTCTTTTAGAAAAGTCGAAATTTTATATT
-TCCAATTTTCAGATTTAAAAAAATTTAAAAAGGAATGAACTTTTCCAAAG
-AAAAACTGAATATAACCAGAAATTGTGATTTTTCAGCATTTTTTTTTAGG
-TTTGAATTTTTTTTTCATGATTAATCACGTGAAAAGTCAATTTTACCGCA
-AAACATTTAAAAAATCAAGATTTTTCAATTTTCTCTGAATTCCTGCAGAT
-TTTTCGATGAAAAATTGAATTTTCCTTGGAATTTATATTTTTCGGGTATT
-TAAAGTTTCGGATATTAAAAAAAATTTTCAATTTTCTCTGAAGTTATCGA
-TAAAAATTATTTTCTGCAAAAAATCTACTTTTTTTCGTTGAATATTCCGG
-AAAAAAAATCAGAATTTCAAGGCACATTTCCTTTTCTAATCTAATTCGAA
-TAATTCAATATTCTTTTAAAAATTCGGGGTAGAAAAGGAATTGTACCAAT
-TTTTATTTTTAAAAGTTAATTTTTCTAATTTTCAAAATTTTCTTGAATTT
-TCGAATTACAGATTTTCAAAAAAATTTTTTTTGTTTTTTTTTCTCGAAAA
-TTTGAAATCCATACATCTAATAGCATTCTTCTTTTCCTCAGGACTCCAAC
-CATAATTTATCCTGACTTTTCCAGATCGATTGCCATTTGTTGCAGTAGTA
-TCTAGTTCAGGAGTAAATCTCTCGAATCTTCCCTTCAACGCCATCATATC
-TTTCTTCCAATTTGCAATTTCTCCTTTTGGTACACGGCTGTATGTCATTG
-TTGCACGGAACATTTGTTGACGGGCTTCTTCATTCAGAATTCTGGAAAAA
-TTGATGTTGTGCGATTTTTTTTGGTTAAAAAAAACAATTTTCGTAAGTTT
-AATTAACTAATATTTTAAAAAATCTCTCATTTTCTGAGGCACCACGGATT
-CAAGATCTGGTGGGATTCCGGATCTGGCACCGTGCCAACGCATTAAATGC
-AATTTTTCTGAAAAAAGGGCAACGAAGATCCGATTTAAAAAAATTTTTCA
-ATTATTTTTCAAAATTTTCACTAACTATAAGAAATTAGAGATTTTTCACA
-AAAATTCCAGTTTTCTGTTAGAATTTGAAAAAAAAATTGAATTTTTCCTA
-AAAAATTTGTAATTTTCCGATATTTCAAGCTGTCAAAACCTAAAATCTGA
-AAACTGAATTTTTAAAGGAAAAATTTTGAGCATTCTTATCAAAAAATTGT
-TTCAACTTTTTCTCAAAATGTTTCAACCTTTTTCTTTCTAAATTCTGAAA
-AGCATATCTCAGCTTTTGCTAAACTATTTTTTTCCTCAATTTTTGAGAAA
-ATTAAAATATAATATATAATATAGTAAATATTGCTTATTTTCTAATAATT
-TTTGGTATTTCTATTCTTTCGTTTTTTTTTTCAAAAATTCCAAATAGTTT
-TAAATGTTCATATTATTTTTTTTGACGAAAATAAATTTTAATTTTAAACC
-GGAAAATTGTTTCGTAACTTTTTTTTTCAAAAAATTTGAATTTTCGACAT
-GAAAGATGTAAAGTGTAATTTAAAAATAATAGTGCAGGTATTTTCAGTTT
-ACAGCAAAAGTCAGTTTAAAAAATTTCGACTGGTTTTCAAAATGAGTTTC
-CTTATTTTTTACACGTAGAACTTTTTTTATTTTCCGATTTTTTTTGTTGC
-GCAGAAATTTTTTTTCCGCAAAATCAGGAAAAATTCAGAAAAAGACAGTC
-AAAAAATTGTAGATACAATTTTTTGACTGTCTTTTTCTGAATTTTTCCTG
-ATTTTGCGGAAAAAAAAATTTATTTTTTCATGAATAAAAATCGAATACCC
-ATCCAATTCCACAAACTTACTCGTTCTCCTCCATACATTTCGTTTGTTTA
-ACTCTCCAAACAAGTGGAACACACATATGATGTTTTCTCTTGATATTATC
-AATTAATGCCAGTGCAGCCGGTGTATCGAAGCACCGTGTCATTCTGCACG
-TATTCTCATCGATTGGATCAGCTTCAATCGATTGCTCCACAATGTAGGGG
-CCTGATGGTTTACGGAGAAGGCAGTCGTCTGGAGAAAAATAGAATAGAAT
-AATGATTTTTAGGTTATTTTACGTTTAAAAATCTAATTTTTAAGACGCGT
-AAACGTTGAGCTCATTTATAAAAATTCGGCAAACCGGCAATTTGCCGAAA
-AATTTCGGAAAATTGTCGGTTTGCACATTTTTTCTTGAAATTTCAGAACT
-TCGATTTCAAACGGCAAAATTGTATACATCCTATCAAAACATCAATCTTG
-AAAAGCCAGTAAACTCTATGAAAATGTCTAAAGAAAAGAAAACGGTAAAA
-AAATACAGTTTTAAATGTTTCCGTCTTATTAATAACAAAATTCGACAATT
-TGCCGGAATTGAAATTTTTTTTTCTCCAATTTCCGAAAAAAACCCACCGA
-CCACCATAATATCATCGTCTTCTTCTTTTTCTTTTCCAATTCCAAGCCGT
-TTGATCGCTTTTCCGTTGGCTGGCTCCATGAGCTCAAGATATCCGTATAC
-ATAAATTTTCATGTCTGAAAGAAAATTCAAATTTCTTCTGGAATCAGTTA
-TTCGAAACTAACATTCTGGACATAAAACTCGTTGCCGTCGTTTTGTCAGT
-GCACGGAGGCTTGCCGGACGTGGAACACGCATCAAACGGAAATAAAGGAT
-ACACGGTTTACATTCGTGACGCGACATTACACGATTTAGCTTAAAATTGT
-GAAATTAATTTTTTTTAATAGCTCTTTATTTTTTTGAAAATTTCTCCCAT
-GCTTTTTCCATTTTTTCAACGAGTTTCCTTATTTTTTGTCCATTTACTGT
-AAGTTTTTTTTGAGAATTTTTTTTTGTTAATTTAACATTTTATTAGCTCA
-AAACATTTATTAGCAAAAATTTTATTAGCAAAAAAATTTTTTAATTTTTT
-TAAATTAGCTCAAAATTCTCGAAATTTTAAATTTTTAGGGTAAACAATAT
-AAAACTTAGGGAGTTTTGAGCTATAAAATGATAAATTGATTTTAAAAAGG
-ATGAAAAACTTATTTTAAAAAACCGACAAAAATCGACAAAAATGAAGGGA
-ACAGGCAGCAGCTTAGCCCCATGCTTAGCCAGCAGCCCCGTAGCAACCCA
-GTATCAATAATATCCCGTGCCAATTTTCATAAAACTGAATATAAATTGGG
-TTGATGTTGCTAAAGGGCTGCGAAAAACTGACCTGGGATGAAGCTGGGCT
-GCAAGGGGCTGCGAAGTGCTGCGAGGGCAAAGCGCTACAGTGCTAAAAGG
-GGGCTGAGCCCAGACCCTCAGGAAAAAACTCATACTCGCAGCCCTTCGCA
-GCCCACATTTGCGCTCTGATCGCGTGCTATCCGCGCGCACAGAATTTCGA
-AAGTATTTTCCAAATTCGGAATGCGCGCGGAGCAGACGCAATTAGAGCGC
-GGATCTGGCACGTAAGGAAGAAGTGTGACTGGAGCACGAACCAGTAATCT
-AGTCGCGCCCCGTCCGCGCTCCAGGAGGAGCGATTTGCCGAGCAGTTCAG
-CCCTTCGCAGCCCTTTAGCAACAACCAAATTTATACAGTTTTATGAAAAT
-TGGAACGGGATATTATTGATACGCCTAAGCAGCCCTATTAAATAGTGATG
-AGGGCGTAAATGAAATTCGCCATTTCCAGCTAAAATATAAATTTTTTGAA
-TTTTTTAACATTGATATTCGGAATGGATTCAGCAGAAAATTTGAAGTCAT
-TTGAAAATATTTTCCAGATTTCGGTACTCCACTTTTAAAATTGAATAAAA
-CTGTAGTCTTTATTCAATGTTTCTTCAAAATTTAAAAAGTAGAATATAAC
-TGTGAGAAAATTTCCAAAATTGTCAAAATTTCAAATAGCTGAAATATTTC
-ACGGCCCGGCGGGGGGTACATGGATGAGAATTCTCTACCGTATTCCAATT
-TGGCTGACTGCGTGCTCAACGTTGAATACTCAGTGTAAACTTTCGTACAC
-CGTTGCGTACTGCACAGCGCGCATTTTAATTGACGACATTTAGCAAAAAT
-TGAACATAAGATTTTTCGGAATTATGAAGCTCAATTTTCACAAAAATAAT
-GAGTTTTTTGTAGAATTTATGAAAAAACGTGAATATATAGATTTTTTGTT
-CATGATATTCAAGAAAAAGCGATTTTTAGTTCTTCACAGAGGAATCCTCT
-CGCATTTCACTTGCTCATGATGTTTTTTGCTCCACTTTAGGACGATAAAA
-ATGCGAATTGTTGATAAAATGAATGAATAATATAAAAAGTGCAAATATGA
-CTTCAGCAAGTGTTAAATCCCAAATTTTTCCTGCGATTTTCTGCTAGATT
-CCTGGTTTTGAGTAAACAGTCTGATATATTCATGATTATAATGATAACAA
-TAACGAACATAATAATAAAAATGGAGAGCACAGAGAAACAACAAATTGCA
-AAAACAGCAACTGATATCAGAATTAACGACGACCACGGAAACCGCCTCGG
-TCTCCACCTCGCCCACCACGGAAGCCACCACCTCTGTCGCGTCCTCTGAA
-TCCTCCTCGATCTCCACCGAATCCACCTCTAAATCCTCCATCGCGGTCTT
-CTGATCTACCACGGAAGCCTCCACCTCCACCAGGATCTGTTGAAAGTCCT
-CTGAAGCCTCCTCGATCGCCACCTCCACGGAAGCCACCACGATCCGCGGA
-TTTTCCTCTATAGCCTTCGAGGCTTCAGTTGTACCCCATTCTTCGTTGGC
-ACGCTTCAGATCTCTACAAAAAAAACAAATTAGAAGCATTCAATTATCGA
-AATGTGTACCTATCCCGATTTATCGCAATCTGTCTATTCTTCTCCTTCTG
-ATTCTCAACTTCTTTAACTTGTCCAGTAGCGGCAGCTTGCTTACGAGCAG
-CATTTTCCCGAATCGCCTTCACCTCTGCCTCCTCAGCATCCTGTTGCTCC
-TTGACAATCGTAAGTCTTCGAATGACACGTTGCTCACTCTCCTGCTCACG
-ACGCTTTTTCATCTGCTTCTTCTTGTTTATAGTCACCGCATTATGCTTGT
-GATAGAGAACCTCTCCCTCATCGATTTCTTCTTCAATTTTGACGAGTTCC
-AGGGTCAGTCGGGTCCGATCTCACGAAGACGGACGTTGCTATTCTGGCCA
-ATTCCGCAGTCACGTCCTTCATAAATGTCTTGTGGAAGTTCTTCTTGCTG
-AGGGGGCTGCTGAAACCAATGTCGGCATGATGAGAGTTCCGGTCTTCTGA
-ATCCATTTCCTGCGTGGGCTGTGGCGACGAGCTGCACGTCTGAAAATCAA
-GTTTTTGTAATTTTTGGGCGCATGATATGGAGCTGAATCATTCGATTTTA
-GAATCAGCATGCTTTTATTCATATTTTAGGATCTTTTTAAAAAATCTGGA
-CCAACAGTTTTCGAAAAAATTTAATTTTTGTTCAGAAATGTGAATATTCA
-CTAAATCGAAAAAAATAATTGCAAAATCCGTCAGCTGAACATTCAAAACT
-TATCAATTTGAAATCAGCATATTTCAGTGTATAATTAAAAAAGTTTCAAA
-AATTCTGAGACCAATTTTTATTGAGAAAAATAATTTTTCGCTCGAATTAT
-TGAATTTTCACTAAATGCAAAAAACAGTAAACTTGGGCCCATGCTACAAG
-CCTGAATCTTTCAAATTAAGAACCAGCATGATTTTTTCAATATTCTAGGA
-CGTTTAAAAAAAATCTGGACCAACAGTTTTTGAGGAACGTAATTTTTTAT
-ACAAAAATGTTCTGATTTTTCACTAAACTCAAAAAAATAGTCAAGTTGGG
-CCCATGCTGTACACCTAAATCATTAAAATTCAGAACCGCCATGTATTTTT
-TCTTACCAAAGGCTCTTTAAAAAAAATCTGGACCAACAGTTTTTGAGATA
-TTTAGAAAAACAACTCACTTTTCGACGTTTTTCGCCTTTTCGTGGCTCAC
-CCGGTTGATTTTTGCGGCGATTTGTGGTCTTTCGCTGAAAATATTATTTT
-TATTTCAATTATTAACGAAGAAAACAAGAAAAAACGACGAGAAAACATCA
-AAAAAACGCGAAAAAACATCGAAAAACCACCGCAACCTCATGAACAAAAA
-AAAAGCATTGCAGCCGCGGGACTAGTTTTCGCAACTTTCTAGGCCATGTC
-CCGTTCGCCGTGCCGTGTATTTGTTTAATTCCCTTTTTGGAAAAAGTCAA
-CATATTTTTCTAACAAATCGTTTTTCTATTAATTTTTTTCTAAAACTCAC
-AATCAACAGATCACTTTTTGCATTGCAATTCTCACAATATCCCGACGGAA
-CCCTCTCCAAATGATTGACCTCTTTGAATAGTTCATCATAAGTGTCGGTT
-TCATTCAAATGCACATTAATCATTGTTTTATAGTTTTGCACTTTTTTCGT
-GTTGTAATAGTATTGGATAATGGAAGAAAGCGAGCGTTGGGGCATCTGCA
-AAAAATAATGAAATTTATTTTCTTTTTATGATTAAATTAAATTTTCAAAA
-ATTCCCTTTTTTTGACATATGCACTTACAGCCGCATGAATCTTCTTGAAC
-CGTTTTCCGAAATGAAAGAAGCAAGTGGAGAAAAGACTAATTTCTTCTGC
-CGTCCAATCATCATGAATTTCTTTTCTTCTCATCGCTTGAACCATCGCAG
-CGTCGAAATCATTTGACTGTTTGTTCAGAATGAACAGAGCCTGTAAAAGC
-AGTTAGTTTTTTTTTCAAATTCAAAGTACATTTCCGAAAAATAAAAAAAA
-GGCTTGATTTTTTAAAATCTCGAATTTTTATTATGGTCAATTGTTATTTT
-TTCCAGAGAAAAACTCATTTTCTCCCAATTTTCAGACGTTTCTCTCTAAA
-TTTGGTGTTTTTCCAATCGTACCCTATCTATAGGTAATTGATATCGTCCA
-GTAGCTTCTGAAATGTATTCTGTAAGCCGATTCTCGTTCATTTCGTCTGG
-AAACGCCCAAATTTGTTGATCTCTGCACGGTTCTTTTTCCAATTGCTCTG
-CAGTTGGCTGTATAATCGCCTGATATTCGGTTCCCACGTGGATTAGATTG
-TCGACGTTGGAAAGTGGATTTGCTGGAAGAAATTGGGAATTTTTCAAGGT
-TTTAAGTGGATTTTCAAGCTATTTATAAAAGCATGAAAAAGCTCAGAAAT
-GACTATAAAACCTTTTTTTACGTCGTATTTTTTTCAATGAAATTACCTAC
-TTTTAATTAATTGTTCGGCTTAAAACCAGAAAATTGTTTCATATCGATTT
-TCCCGGTGAAAATCGAAGGAATCGTCGCATTCTCAAAGTTTTTTCACCGA
-TTTGTTTCAATTTTAGCACAACTAAATGGAAAAATCACAAAAATTCCATT
-ACAGCCGATTTTCGTGAATTTTCCTACATTTCGAACTAAAAATTGTCCTT
-TCTTCTGTTTAAACCGGAAATTCTCTTTTGAAAAACCAATGAAAATTTGA
-ATTTTCTGGGCTTTTCTTCGGAAAATTATTCTCGAAATTTATCAATCGAT
-CCTTGGGCTTTTTTTGTTCCGCAGAGGCTGGCGGAGTTTACAAGCGTACG
-AAGTGGTTCAACTTTTATATAAAGCTTTATAAATGGGACATAGATGAATA
-TTTCGAATGCTAAATGCAAAAAGAATCAGTAAAAAAGCGCGCAGCCCCGT
-CCTTCTCTGACGAAAAACGCCGTTTAAGGATCGATTGCTAAATTTTGGCA
-GTAGTTAGAAGTGTCAAAATTTCTGCCGGAGAGTCGTCAAATTTCACTGA
-AACGTAACCCGGTAATTTCCACAATTAATGGTCGATTTTTCGCAAAAAGT
-GGTATGTTTGTCAGGATTTATTAGAAATTGTGGCTGTCCAGATTTTAAAG
-AGTATTTTTGGGCAAAAATGTCGAATTTTCTCTGAAAAAGTTCGATTTTT
-ATCGAAAATTCAGATTTTTTAGATAGTTTTCATCGATTTTCCCAGTTTTC
-AGCCTGAGAACTTTACTAACAGAAAGATGTGTCATGAGCACCACTTTCAT
-GATGCTCACGAGCTTCAGCTTCTTCATCTTCGTCCTCTTCATCCTCCAAA
-TCTTCATCCTCATCGCCCATTGATTCCCCAGACGTTGTTTCGCGTTTTCT
-CATGGATCTTATAGGACGAGCCATCTGAAGTTTCAATTTTAGCTTTTAAA
-TTCAATTTTACCGCTTAAAAATCGATAATTCTCCCGTACTCTGCTGGTTT
-CTTCTTCTTGTTCCGCCTGCTCCTCTGGATCATCTTCCTCCATTGGCTCC
-GGCGATGCATTCAACATATTCAAGCCTTCGTCTGAAATATCTGGCCAATT
-TATAGAAAAACCGACAAAATAATAAGCCTCACTTTCTTTTCGAGAGGCGT
-CTTCGTCAGATGACGTGTACGAATCCATTTTCTGGAATTTGAGGATTTTT
-GAATGTTTTTAAACAAACTTTATAGAGAAAACATTCGAAACACTAGAAGT
-TATGTTGAAACACGAGAAAATTTTTTAAAAATCCATGAGAAAAACAGTTT
-TGAAAAATCTGTTTTTGGAGGCTCTCCGGATTTTGAGGAATCGTCACCCC
-GGAGACGCAGATTCTCCGGTAATTTTTCATTCATATTTGAGTTTAAGAAC
-AAAACAGTTTAAAAAAATGTTTTTAGTATTTGAATGAAACTTATAATGTA
-TTTTTTCTTCCATTAAAACTTAAAAAAAACTACAAAATTATTATGAATCA
-AATTTGAAACCGTGAATCAATCTCCGCGGAAGGGCGAGTCTATACTGCTG
-CAAGCGCACTCTATCGCAAATGTACAATTGGCGGTTTTTCAAACAGGAAT
-TAATCGGATTCTCGTAGTTTATTTTGGATTTCTTTTTTCGGGAACATATT
-GGTGTTTTTGCGTTCAATATTCAAATTTAGAGGAAAACTGCTTCAAATAT
-TTAGGTAAACTCTTGAAACCGCTGAAAATAGGCAAAAATAATTATTTTTG
-TATTTTTTAGGCTACTTTCTATACTTTTGCGTAAATACTATAGTTTTTCT
-ATAAAACACCCATTAAAATTATTTTTATAAAATGATTTTTCCAATAAAAA
-TAAAATGCGCAAAATGATTCTTTTCCAGAATCCTATATGCGCCTTTAAAA
-TCTCTCGGATTACTGTAGTTTCAAAGAAATTATCCTTTATATTTTTAATT
-TTAAATTTTTTCCTGAATGTCAAATATTAGGGGAAAAATTATAATAATAT
-GTGCTTTATTCATATGAGTGTAGAATTAGTGAAAAAGAAAAAAAACATGT
-ATGGACTGTAAAATTGGAATTTTAGCGAGAAAATAAAAATAATATGCAGA
-AAAAATTAAAATTTTCAGGAAAAAAGTCAGTAAAGCCATCAAAAACTACT
-CGATTTTGAAGGAAATCAGCAAGAAAAATTAGAAAAAAGTATTTTTAAGT
-TGGAAAACCCCTGCTTGAATTTGTACACTAAATTGGGCATAAAAGCGTAC
-AAATTCGCAAAAACCGGTAAAAATCTGGGGATCGTGATGGATGGAGTGTT
-TTGTGAAAAAATGCAGCGAAAAATTGAGTAGACAATTTCAAAAATGTCGA
-TTTTTGAAATTTGTGACGAAAAAATTGAACAAAAACTGTTTTTTTTTGGA
-ATTTTCAACAAGAAGTTTTATAAATTTTTTTGTTTAAAATTTTGAATATT
-ATATGAGTTTGGTTTCACTTAACAGAACAATTCGAACAAAAGTATTCTAG
-AAAGGAAATGTGCGCTCCAGCACACTATTTGCCCGTGGAGCGCACTTGTG
-TGCACGAACGCTAGCGAGAATGTGTGGTAGAAAGGGAGGGAATAGGAAAT
-ATTAACAAAATTGGGCAAAATATGTAAGATTCGGAGAAAGAATTGGAGAA
-AAATATGTATTTCGAGCTCCGCGAGCTGATCAATCCAAAGGCTTTCTCCA
-TCCTTTTTTCGAGAGGCACATTGCATTATAGTTACACACAGCACGTGTAT
-AATGGAACATTGAAGCCTGGAAACGAGCCATCGCTACCATCATTACCACG
-TGGATCTGAAAAAATTAAAGTTTGATGATTCGAAAATTTTCTGGAAAAGT
-TATGATTGTGAGATAAATTGAATTCTTTGAAAAATCAAAATTCAAAAGCT
-TGTAGAAAATTTTATATATTTTTTTAAGCGTATTTTTTCCGTATACATTT
-CCAAATTTTTTTGTTACCCAATTTTAAAGATTTTCTTGAATTTTAAAATT
-TCTTTCAGTAAAAACTTTTTTTCAACTTTTTGATTTTTTTTCCGCATTTT
-TTAAAATTTTATTCAGAATTATTAGATTCTTTTGAATTTAACGAATTTTT
-TTCGCTAAAAAATTGTTCGATTTTTCCCGAATTAAGAAAAATATTATTTG
-GTTTTTGAATTATTTTCCTGATTTTTTTCGATTAATAAATTTGTAAAAAC
-AATTTTTTTTCTAATTTTTGGTTTTGATGATTGTGTTTTTTTTCTGAACT
-TTACAGTTTTCAAAGTTTACACCGAACTTCCACATTAAAAAATTCTGATA
-CAAAAAAGTATTCACATGATTTTTAAAATTTAAATATTTTTCAAAAAAAA
-TAATATTTAAACTGTGTTTTTTTCGGAATTTTTTTTCGATTTTTTCCGAG
-TTTTTTTTGGAATTTTTTCCTTTCTGCTCCAAAAATATTCAAATTCAATG
-TTGTGTAGAAATTTTATTCAAAAAAAGTGTTCAACTTCTGAGTCTAAACC
-TTTTCCGAATCCTTAAATCCTGGCAGAGCTCTCGTGAATTCAGTTGTCAA
-TTTATGTGGATAGCAAGCTGCCAGTTTAATGAAAGTTTTAGTTCCTTTGT
-CAAGTACTCGATTAATTTTCGAATAATCATAATCATCGACTCGAACACCA
-TATAATCCTTGAGTATAGTTCCAAATTGCTTCACGGAATGCAGCAGTGTC
-AATTTCATTCTGATTCACGGCGGCTGGTGGTTCTCCGTCTCCAGATGCAT
-GGGATGAGCCGGATGGCCTGAAAAATTAATTTTTTGGAATTATTATATTT
-TTCTGTTTTTGAAATTTCATGCATCTCGAATATTTTAACAAAATTACCAA
-ATTCAACTAGATTTCTTACAACTTTCACTGTGTCGATTTACGGGTTCGTT
-ATACGAATTGAATTTGTTTATCGATAGAATATTAAAATTTAGCTAAAATT
-GAGAAGAATATAAGAAGAAATTAATTTTTTTAATTTCAAAAATCGAGCCA
-GTAAATCGACACGAGCGATCGACACAGTAGTCATTTAAAGACCAGTTTCC
-GCCACGAAATATTTCGCGCTTCAAACATGTTGCGTAGTACGTATTCTCAA
-AATTGTGCGTTCACGTATAATATTTATGCGAATTTTTGGTCTACTTTGTT
-AGAGAAATCATCACTAACATATTGCCAGTAAGAGTCCGAATATGATCGAA
-CATTCGATCAAGCCGTGACGTCAGTGTATCCGTATACTCATTCATCGTAT
-TATAAACATGATCCCATCCAAATTCTTCAACTCGGAATGGCGGAATATCC
-TTTTCAGGTCGCTTTCTAAAATCAATATATCCAAATGTTCGATGATGCGA
-GTAAATTGGATAATTACACGGCGGCTCTTTTTCCATAATATCTTCTCCAT
-TTTCATCGATATTTGCAAGAAGAAGTACAGGCGAGTAGTTTTTCCGATTG
-GAACTATATGTTGCTGCAGGAGCACTAATTAATGATTCAATAGTTTCAGT
-AGTCATTGCACACATCTTCGCTGGTGGCCTAGTTTGTCCTTTTTCCGTCT
-TTTTCAGCTCACTGATCAAATATTCGACTTCAGTTGGCCGACGATCTGGG
-ACTTTTCGGAAATAGGCCGACATTCTCGCCTCCCAATAGTCGAGATCATC
-GATATTAAGGAAATCAATCTCATCTTGTGTCAAATCAACACGACGTTCCA
-ATCCAATACAGCATATAACTGTGCACATTGCGTGAGTCATTGACATTATT
-CCGACGGCGTGGTGGAGAGAGCAAACCGAGAAAAACGCAGGACCACCGTC
-TGGCGTGCGGCGAGCGAAGAGCACCTGGAAATTTTCAAATTCTTGAGAAA
-AACCTAACATCGTTGTTATACGTTCGTTCTCTTGGCATTGGAGTTGGCAG
-AATTTGTTTTGAAAAAACGTTGTTTTTTTTTTGAAAGAACATTTTTTTAT
-TACGGGACCATGAGATCATGAGAATTCCTATTTACTGGCGCGAAAATATT
-GGCAGGCCACGGCAACGAGAGAGCATATGGCAAAGAGAGACGCATCTTAT
-TTTGTCTTGTAATTTTTTTTTAAAATAATTTACAATCCCTTTTCAACTAT
-CGTGATTGTAAAATATTACAAATTTCAGAATTTCGCTACCAAATTATTAC
-TGGAAAACTAAACTCTGAGAATGCGCATTGAGCAACATATTTGACGCGCA
-AAGCATCTCGTAGCGAAAACTACAGTTATTCTTTAAATGACTACTGTAGC
-GCTTGTGTCGATTTACGGGTTCGGTTTTTGAAATAATTTTCTTTTCGAGA
-AGTGACAGTGATATTCCATTTTCCTTCTTTTCTTCCTATTATTTTATCAT
-TATTTGCTTAATTTTAATATTCAATTCATAACTAAATTACTTTAATTCAT
-TTCGAGTAGACATTCAAAGAATTCCGGTAGTTTTCGCTTCGAGATATTTT
-GCGCGTGAAATATGTTGTGAAATACGCATTCTTAGAATATGGTGTTCCCG
-TAATATTCAGAAAAGAAAAGATTTCCAAGAACTTTCTGAAGATTTCAATA
-TTTGCAAAATCAGAAACCAGTTCTGAATATTCTTTATTTTTAGAAATTTT
-TCAAGGTTTTCTAAATAACTTTTCTAAATAACCTACCGTATTTCTTCTAT
-TAATATGGCTGCAATACTATTTTTCGATGGTCTTCCCGCTTGCAATACTA
-TTAGGGAGTGCAAGTCTAATAGGGAGTGCCATACTATTCTTCAGAAAATT
-TTTCTGTGTTGGGGCTTACTAGATTCTACTTGAAAAAACTCCAATTTTAT
-TTGGAAGTATAGAAAATTTGATTGAAATTGCAACAAAAAGGTACAATAAC
-TTCAATCTCTAAAAATTTTGTTATAAACTGTTGCAAAATAGGCAAAAAAT
-GTTATTAAAATTTTAAAATTAGTAAGGAGTGTTTGCAACAAAAAAAAGTA
-GGTGCAAGACTATTAGGGAGTGCAACACTAATAGGGAGTGCAATACTAAT
-TTTCGGAAGGTCTCCGAGGGGCAATACTAATAGGGAGTGCAAATCTAATA
-GGGAGGCCATATTAATAGAAGATATACGGTATATATAGCTTTGAAAAATC
-GGAAAATGCCTAATTTTTACTTTTTGAGGTTTGAAAATCTCTAAAAATTC
-AATAAAATTTCAAATTACCGCTAGATTTTTCCAATGAATCATCCATGGTC
-TATGACAGAGCATTCGATTCAAATAATCCAATTTTCGAAATTTCATGTAT
-GACCAATCAATGCCCAACAACCACATTTGTTGTCCACCCTTTTCCAGAAA
-TTTGCGACGATGATGATCCATAAGTGATAGGCATCTGTGACGTGATGCAG
-CCATTAGTGCAAGATAATGACGAGCCGAAGCTGGTAGATCACTTATATCA
-ACGAACATATGGCCATAACTTCCTGTCATATGAACATGTAGAGTTGGGTG
-TTTACATGTGAAACGGAATAATCTGGAAACGTGAGGGAAATTAGTTCGAG
-ACGGGGAGGGGCAGGTTGGCGGTGCCAACCGACAGCCGAACATTGGGGTT
-TCTCAGCTGGTAGCGCCAGCCGACAGTCTACTGCAGTACTGCAGATAAAT
-TTTCGTCGGCTGTCGGCTGGTGAAAATTTTCATGAAAATCAATAATTTTA
-AAGAAATTGTTGCAAATTTTTCCCAAACTTGACCAAATTTGTTGGCTGGC
-TGTACCAGCCGACACCCGAAATTTAGAACATTGATTAGAGGCTGCTTGGC
-AGAAATAATTTTAAATTCAGAAATTCAATTCGTTTTCAAAAAATATTTTT
-TAAAACTTTACCGATCAACTTCTGGAATCGGATCAAAATTGAGCCAATCC
-ATGGCTTTTCGTCTTTTAGTTGTAGTGTGCATTGTGTAGATCTTTTTATA
-TTGCTGCGAGGTGAGTAAATGAAGAATTTTCGCGACCCGTTTCTGAAAAA
-ACTCAGTTTTCTAAGGAAATTTTGAAAATAAATTCGAGAAAAAGAAACTG
-AGTCAGCAAAAGAAAATTGGAAATGTCTGTCTGGAAATATTCGAATATTA
-TATTCAAAAGTTTTCAAAAAAACAACGAAATTACAAGCAATTGTGATCAG
-AAACCGCGGAAGGAACTGGACGAAAAAAATTATCTTTGAGACGAATCTCT
-TTGCATCTTTGTGATCTAAAAGATTAATAAAGGTTGTCATCACATTTTTC
-GAGATTTGGGAATGTGATAAGGGTGAAAAATGGAGATTAATTGTGGTAAA
-ATGAGGAAAAACCTAATTTTTGGTGAGAAAATTGTGGAAAAACTATAAAA
-GAATCTTTATGGAGTTTAAAACTCAAGTTTTTCACGCTTTTCCGCACTGT
-GCGGAACGTTTTTTGAGAGAATTTGGCCGAATTCGGTGATTAAAAAAATA
-ATTTCAAAACTTTGCGCCTCAATTGTGATGTATTACCGTACTCTGTTGCC
-ATTCCACCAAAATTTCCTTCATTGTTTTGCCATTTTTCTGCATAATAACT
-GTTCTGGGTTTTTTTGCTTCATGTGCCCAAATGTACGAATTTCCCTAAAA
-ATTATACCTATTTTTTCAAAATTTTTAATCGCTAGAATTTTTTTTTCTGC
-ATTTTCTTTAAAAAAAGAGATTTCTCGCAAGTAGAAGGAGAAAAAATGTG
-TGGCTATACTTCTTCTTAAAGAATGCACGACTAGCCATAGCTCAAGCCCC
-CTCTGGAACGTTCCATCTTCCTCCCATTTTCCCACGTTCAAGAATCATCA
-GCTTCTTCTCCCTCAGCTTCTCTTCTTCTAAAACCACAACTAGACAAATG
-TTCTTGTTTTCCACCCTATTTTTCACATAAAACCGCCGAGAAACCCGCTA
-TCACAGACTCAATGCGCACCGGAGGGGCTCTTTGTGTGTGTGTACTGATC
-TCTGCGTTATATTCGAACACCGGCGCACACTCGGATTGAACCAGAGGGGG
-GGGGGGAGGGGGGGGGGGGGGTGAAAAAAGAGAAATACTCTGAAATTCCA
-TAAAATCTAGAAGAAGAAAGAAAACAAAGGAAAAATTGGACATTCCGAAG
-TCAGGCTAAAAAATCTCATAAAACAAAATCTATTCGATTTGTGACCATTT
-TCATCTATCTCTCTCAAAACCCGAATAAACAAAGCCTCCCGTCCCCAAAG
-TGTGCTCTCATGCTCTTCTGGAGCCTTCTAGACTGTCTGTAGAGCCTAGA
-GACAGCGGAATTGCACTGAAGTGATGGAGAGACGTAGAGAAAACGCCTGA
-AGAAAAAAACGAACACTTTGGTGGAGGAGGAGATGGCTTCCCTCCAAATA
-AACAACAATTTCTATCGTTTCTCTGTGATTGTGTTCTCTTCTATGTATAC
-TGTTACGATATTGAACAGGAAATTAAATTGAGCACTCTGAATACATAATA
-CACAATAAATAAATACAAAAACTATAGTTTCAGCACAAAAAATTCGAAAA
-AAAAACGATTTTTTTTGTCCGAGAGGAGTATATGGCCTAGAAAAAGAAAA
-CTCGGCCACTCTGATGCAATAAATTTAAAAAATTATGGCCGAATTTTAGA
-TTTCTCAGGCCAATTTGATACGTTTCTCGAAAAGCCATAAATTAGTCGGT
-TTTTCACGGGCTTCTTGCCTTCCTCATTGCATTTTTCGCGCTCCATTGGC
-AATCTCCTGCTGGACAACGCGTGGGAAATCGTGTGCCCCACACGGGCAAA
-TACATTTTGTTTTACAAAGAAAACCGTGCCGCGACGCGACACGCAACGAG
-CCGTAAATCTACCCCAGATATGGCCGAGCTCAAATGGCCTAACCTGTCAA
-AATCTTCCACTTCAAAATATGAGGGAAGCCAGAAGCGCGTGTTGTTTCTG
-AAAAAAAAACCCGCCTAAAGTTGATTTAAATTATCGTTTTTTTGGAAATA
-ATAAAATCGATGAATTTGTAGATTTTGATAAATTTCCGATAAAAAAAAAA
-TTTTAAAAGAGGAAAAAAAATGTTTCTTCGCCCTTTAGTACCAAAAATAC
-GCCCAACTAACCAAATCGTTCTTTCAATCTTTTTTAAATGTTTGTGCGTC
-TATAATTGTCGCTTCAGAAAACTACACAAAACACACACACACACAAGGAG
-AAGAAAAGAAAAAACGTGTTCCATGACCTGCCACTGGGATCGATCTGTAA
-AAGAATTGGGGAAAATTGAGGTAAACTGGTTTTTTATCGGGAAGATTTTT
-TCGGAAGGATTGAGATGAAAGTTCGAAAGGTAATTGGCAAAGTTGAAAAT
-TGAAAAATTCGAAAAAAATCTCAATTCTCTGCTGTAACCCCCAATTTTGC
-GTCATGGCCTAGAGTATGCAGCGTGGCCTAGAAATTCCTAACGTGGCCTA
-AAAGATCACGGCGGTACCTATGATTTTCTAGCGTGACCTAGAATATACCA
-GACCTAGAATTTGATAGCGTAGAATTTCCCAGTATATCCTAGCAGTCTTA
-AGTGACAGTTTCTCAGTACGTCCAAGAATTCGTCAGCATGACCTAGGATG
-TTAAAGCGTGGCCTACAAATTTTCAGAGTCTTCTAGGATATTCCAGTCTA
-AAAATTTTCAGTGAGGCCTGAAATCATCGCGTGTCCTAGAATGTCTAATA
-ATTGCAAAAAAAAGATTTGAAAACTAGTATTTACCCTAAAATTGCATTTT
-GAGCATTATTTTTAATCTAGTTTTAAGGAAAAAATCAGAAAAAATAAACA
-TTTTTTGATTAAATCTTCCGATCTACAGATAGAAAGTGTGCAAGAAAGAA
-TGCAACATTGTGCTCGGTGGAGCAAGAAGATAAAAGAAAGAGAAAGAAGG
-TCCCCCACCCCTCCAGTGGTCGAAACAATGATAAATTGGACAAACGGAGG
-ACCAAGGGGCCGGGCAGACACAAGAGAGAGAGTACGTGAACTGAGGAGGG
-TGTGCAGGGAAAAATGGGATGGGGGCAAATCTAGTTCAAAGATGAGACAC
-TTTTCAGGATCTTTGATTCTGAGAAAAATTTTGAACAAAAAGAATACTTC
-AATAATTTAATGGCACATAGAAATATTTTCAGATTGTTCTTCAAAAGAAA
-AATATTTTTATGCCCGGAAAATTTATTTATTGCATTTCTTCCAAAACAGT
-GGCCGGTCTCGACACGACAAATTTTTGTTAAATGCGAAGAGGTGTGCGCC
-TTTAAAGAGTACTGTAATTTCAAACTTTCGTTTTAATATTTACTTGTGGG
-AAAACATTAATGCTTAACGAAAAATTACAGTACTCTTTAAAAGCGCACAT
-CTTTTCGCATGTGACAAACATTTTCGCGTCTCGGTGACAACTTTTAAGTT
-AAAGGCACATAGAACTTTTCTGAAGAATTTTATTTATTTTTCTGAAAGTT
-AATTGCTACAGTATCCTTTTTCAAGTCGCACCGAGAGCCAAACTGTAGCA
-AATCATCAAAAAAAAGTCGACAAAACGTGCCGAAATCAGTAAACTTGAGA
-GCTTTAAAACTCTATTATCAGTTCTTCGCCAACAAAAAAAAAGAGTACCG
-TATCAAAAACGAACTTCGACTTTTTTGGCTCTCCTGCATACGGACATGAT
-TCTGATTGACAGTTTTCATGTTTTTTTTTGGGAGTTTTATTTATTGTGCA
-TTTAAAAAATCGTATAGTTTGATGCGTGGCCTAGAATTTGCCAGTGTGAG
-CATTAACTCTCCACGGTAGCCAAGAAATTTTCTACGGTGGCCTAAAAACT
-GCCAGTGTAGCCTAAAATATTTTATTGTGGCCTAAATTTTCCAATGGTCT
-GTTTTTTTTATAGTTGCCTAGAATTTCTTTTCGTGACCTAGAAGCGTACA
-GAGTGGTGGCCTAGAAAACGATTCATGGCAGAGTTTTGAAAAAAAAACGA
-AATTTCGAGAAACAAGCGAACAAAAATCGTCTGTCGAAAGAGTATTTCGA
-ATGCTGGGGATGCAAATCAGCAAATCATTCAAAAAAAACTTTTGTGATAA
-GAAATCAAACTGATAAGCCAGTGTCAAAGTCTCGAGGATTAAAAATAGCA
-TTTCAGGTCGGGGTACGGTAGGGTTTTTGTAGAAATTAATGCAAAATTTC
-AGTGGGAAACGAGTTCGTGGCCTAGAAAAATCATGTCTGAAAAATTGCAA
-ATGCGCTCCCCCGAAATGGTTAAAAATTTTCAATTGATAGCCTATTTGAA
-GTGGCGGCCTAGAATATCAAATAATGGCCTAGAACTCAAATTGGCGGCCT
-AGAAATCAAACTAATGACCTAGATTAGGGCATCTTGTAGGCAGCTTAGAT
-CACCTATTATAGGCAGGTGTAGGTAAAATTGTAGACAAATGTAAGTTTCT
-TTGAAGATAGGCGTAGGTTCCTTTGCAGGCATACATAGATCATTTATTAG
-GCAGATGTAGGCCTGATTGTAGGTACAGTGCCGGCCAAAAATATATCCTA
-TTTTTGACTTTTGATAAATTTACAAATTTTCCAAACGAGCACAACTTTAA
-AACTAGAAATGTTATCGAAAAAAGTTCAACTCATGTATGTATTGCCCATA
-ATTACGTCTACTCGTATTCAATTGTTTGTTGTTTACTAGTGTCACGACAA
-CAAATACAGCGGCCGACATCTCGTAAGCCCGTTTTTGACAACGTTTACTG
-ATTCGGCCGTATCTCGAAAACTAATTTTTTTCTGAAAATGTTGTTAAAGT
-GAAATAGTTTTCATGTTATTTGTTATCATTTGTGTTTATTCACTTTGTTC
-TGAAAAATCCAGTAAAAAAGTTATGGGAGTGCAAACTTGTCGCTCACTGC
-CACTCACCCGCTACAATCAAAAATCAGGTTACTTATAGTTAGTTCTAATT
-TTTTTTTTGTAGAGCATTTTTTAGAAATAACACATGTAAAATCACAATGA
-AGCTATATTCAAACACGATATCAAGATTCAGGAAAAAATTCATTGTTTGC
-GAGAAATGTTCAAGGCGTGGCCAAACACTATTCAAGTTTAATCTCTCATA
-ACTCTTTTTCTGGATTTTTCAGAACAAAGTGAATAGACATAAATGATGAC
-AAGTAGTATGAAAACTATTTCACTTTAACAACACCTCGAAAAAAAAATCG
-CTCTCGAGATACGGCCGAATCAGTAAACGTTGTCAAAAACGGGCTCACGA
-GATGTCGGCCGCTGTATTTTTTGTCGTGGCACTGGTAAAAAACTTAAAAA
-ATTGAATACAAGTAGACGCAATTATGGGCAATACTTCATCAGTTAAACTT
-TTTTCGATAACATTTCTAGTTTTAAAGTTTTGCTCGTTTGGAAAAGTTGT
-AAAGTTATCAAAAATCGAAAATGGCATATGTTTTTGGCCGGCCCTGTAGG
-TTAAATATTTTCGTTATCAGGTGTAGGCATGAATCGCCATGTAGGCGGGC
-GTAGGTATCTTCTAGGTAGGCGTAGGTTACCTGAGTCAAATTATAGGCAG
-ACGTAAGTAATCATAAAAATTGACACTTTGTGGGCAGGCGTAGGTCACCT
-TTTAGACAATCATAGTTAGCTTTCTAAGTAGGGTTAGGACACCTATTATA
-GGCAGGTTTAATTCCTCTTATATGTGTGCGTAGAACACGTTATAGTCAGG
-TGTAGGTCACTTTGTAGGCAAGTCTAGGTTCTTCTTTCGGCAGGCGAAGG
-TCATCTTCTGAGCAAGTTAAGGTTCGCCTTGTAGGTCGGTGTAGGTTGCC
-TCGTAGGCAGACTAAGTTACCTTCTGGGCATGCCTAGATTGACTAGTAGG
-CAGGTGTTGGCACCAAGGGTGTCAGTGTCCCGTAAAAATTACAAAAACGG
-GACAACGGGATGTCCCGTTCCCGTGAAAATTTTAAAAACGGGACAACGGG
-ACGTCCCGTTCCCACGAAAACACCCAAAAAACGGGACAACGGGACATCCC
-GTTCCCGTGAAAACGCTCAAAAACGGGACAAAAGACGTCCCGTTCCCGTA
-AAAATGACAAAAACGGGACACCGGGACGTCCCGTTCCCGTGATAATTTTG
-AAAACGGGACAACGGGACGTCCCGTTCCCGTGAAAACACCCAAAAAACAC
-CCAAAAAAACGGGACAACGGGACAAACGGGACACGGGACTTGACACCCTT
-GGTTGGCACCACTGAAGAATGCTGAAACCGACTTTTTTTTCAAAAATGTC
-CTGCTCAACGAGCCGAATGCATTTTGGTCGGATTATATTGGCACACCTTT
-TTGCCCCCGAGAGAATCATTGAACAAAATCTCATGCACTTTCAATTTCAT
-TTTTCATTTCATCAAATAAAAAGATTCGGGAGGATTTGATATATATTGGA
-AAAATAAATGAATGGGGGATTTGTATGGTGGGGGAAAAGTGCACACCCGG
-AAATGAGCAGTAGGATTTTGAGCAGGAAATTGAAGGAGCTGGAGCAGGAG
-AGCAGCTACAGTAACCACCCCTTCACAGCAAAACACATGGCTCATAAAAT
-TGAATATTTGAAGTGAACTACTAGTGATAAGCGGTGAAACGGGGTATGTG
-GCACTAATTTTTTTTTCTTCAAAAAACCCATTTCTTATCACTTGTGTGCA
-GAAGCATTATGGAGACAGGCAGGAGGCAAGTGGTGGTCTAAAAATTAGAA
-AAGTTCGGCCACAGCTTGCCCGATAGGAGCACACGGGCATACTGTTTCAA
-CAAAAATTCGAAAAAATTGGAAAATCCCGGAATTTTGATTCCGCGGAATC
-CGACGATTAAAGAAATTCTCGCGTTTCTGATTTCACGGAAATCGGTATTC
-TCGAAATTTGGTTTCTGCGGTGTCTATTGTTTTGGAAATGTTGTGTTCAT
-GTTTTATGAAGAACAATATAATATTATGTATAATAGATATTATATATTAT
-ATATAATAGAATAATTTTAGTAAAAACCCCACAAAACTTCGAAAATAGAA
-GAAATTCTCGCGTGTCTCCAAAATTACAAAAAAATCAGTTTTTTTCCTTT
-ATTTTATATTACACAGGATATTTATATCAATTCAGCAAAAAAACGGGCGG
-GACAGAAAATTAAGAAATTTGCGAATATTCGTTCCCACGGAAGTAAATTT
-CCCCGAATTAGAAAAAATTCGAATTTTTACTGGATTTGTCTCAAGCTTTT
-GAATCTAGAAACATTTTCTAGTAAAATCTCTTTAAAAAATTTTTTACACC
-AAAAAACTTTTTAGGCCCTGAATTCTGCGAATTAAAAAATTCCGCAAGAG
-ACCACACAAAATCGAGAGACTTAGTTAGACAAGTAGAGGGAAAAATAAGA
-GGCAACAAATCATCGAAAGTTTTTTTCTGCAGAGAGAATGGGGGAGAAGT
-TGCGGCGCTGAAAGAGAGAGAAAGAGAGAGAGAGACAGAGAGGGTGAGAG
-ATATAACAGAAAACCAGGATAGTGCGGAGGAAGAGAAGAAAAAAGTGTTA
-GAAATATTTGTCCGTCGACGCCTTCTTCGTCTTCTTCGTCGCCTTCATAA
-ATGAAACTATGCATTTTCCTCAGATATTGCCTTACTATTAAATGGGGCCC
-GGGCTAAAGGGTGTGGCCGGCCGATCCAAAACGGTGGCCTAGAAAAATAT
-CGGCGGTGGCCGATATCAAATAAAAAAAACATCGATAGTTATGAGACCAT
-AATTTTTAGTTTTTCAGATTTTGAGTCACTTTTCTGATTTTTATCCCAAA
-AATAGAGCTCTTTGCTGTTTTTCTGCAGAATCAGCAGGTGGCAACTTGGT
-TTTCGGAATTTGTGCTATTCTTAGAAATTCCCGACACAGCATCGAGTTTT
-ACTGGAGAACACGTAGCGAGCACAGAAAAAGGAAGGAAAGACAAGAATTG
-GCTCGGCGAGCAACCAGAAAAGCAGCAAGAAAAAACTGACCGAGCAAAGA
-ACAGCGCGATGGGGCTCATATATATCTAAAAATGGATGGATGGAGAGATG
-AGAGACAGCAGCAGTATTCGGTCAAATGAAGACAAGCCAATTTCGAAGCT
-TATTTGGTATTCATGCGTGTCTTTTTTTTTCTTGCAAGAAAAACTGATCA
-TTAGCAGAAAATTCAAAAAATATTGGTTGTCCGAGAGGAGTACAGAAATT
-AAAAAAAATCGTCCGAAAGGAGTACAAAATTCAAAATGTCTATTATCCAA
-GAGAAGTACAAAATTCAAAAGTGTATATTGTCCGAGAGGAGTACAAGATC
-CAAAATATGAATTGTCCGAGAGGAGTAAAAATTCAAACCACAAAAATCCG
-AATTTGCCAAGAAAGGGGCGGAGCCTGATTCGAGTGGAGTGTCGTTGCAA
-AACGCAAAACTTCAAAAACATACGGTTTTCAAAATCTACCTCGCCGACCT
-ACCGTAACCCTCTAAAATTTCTAGGATCAAATATCATCGCAAGAAAAGTG
-TTCGTTCGAAACGAAAAATATTTCTGACGCCTCATCAATCATCATATCAG
-TAACAAAAACCTGAGAGAGACGGAAACAAAGAAATATATTTTGAACCGAA
-CAGGGATCCTGCAACAAATCACGTAATGGACAAAATGCGCCCTATTGCTA
-AATATGCAGCAAGACGCAATTGCATTCTTCTGCCAGAATATCGATTTTTA
-TACGTACTTATAGTGATAAAAAAAATGCTGAATTATCGATTTTTAATTCC
-CCGGAAAAATGTGCGACAGAGCGTGTTTGCATTTTTTTTTTCGAATTTTC
-GTGCAGAAAAACCCGTAAGCATCGATTTTTCTCAGTAAAAATTTCTCGCG
-CCAAAATTGTTTCTATTTTTTTCGGGAAAAATCGAAAATCTCCAAAACTT
-CGGTGGAGCGCACTTTCTGGACCACAATTTTTGAAGGGAAACATCACTTT
-CTGCGGTTTTCAATAAACGAACAAACATCAACAAGAAACGAGAGAGAGTT
-TTTGTTGACTTTCAAGAAAAAAATGGATATCGAATTTCTGTGCTCCATTT
-CCCTCTCCGGGAAATGGCGCGGGGAACGTGCAAACAATGCGAGTATGTCT
-AATGGCTCTCACGTAGATCGAGAAAGTGGAAAATTTGCTAGTATAGACAG
-TTTAAGGAGGCTCTTTTATTCTATTGGGGAACCGATTTGTTTATGTCTTG
-CCGTGGAGCGTAGTTACTGTAATTTTTTTGCAAACGTGCTCCATCGAACA
-GTAAAAAAATCAGTATGCATACTAGTATGTACCTTTAAATAGCTGTAACA
-CGAATTGCCTGTGAAAATAAAAATCTCGGCAAGTTCTCTCCATCGGATCA
-ATGTAGGGAATTTTGCTGTTTATAATGCAAACTCGCTCTAATAAACTACA
-ATTTTCGATCGGTATTTCATGCATTTCGACTGATTTTCGTTATTTTTTAT
-GTACGCTCTCTATTGAAACACGGGGCCCGAGAAAATATCCAAAATCTAGA
-GAGGTTGTATTGCTTAGGCTTAGCCGAAAACCTGTAAAGATTTTTTAAAA
-ATTGTTCAGCCTGCGATGGACGACTTTTTGTAAAACTTGGCCACCAACTT
-TTTTACGGTGCGGCTACATCGCATTTGGGTGACCTTTAATGTGTTCAGGG
-TGTCTAAACATGCACCCAAAAGAGAGTGTCATTTTTAACGCGAAACAGCA
-TCAATCCAAACGGGGCGACAAAAAATGAGAGAGAGAGAGAGAGCGGGCGC
-AATCTAATGTTTTATCAAGTGTCTCTTCTTCTCCTCCGACCTCGTTTGCA
-TCCCCCTAATTCATCATTCGTCGGTTTGTAATACAGAGAGAGGGACATAG
-TGAGTGAGAGGGAAAATTGAGGAGATTCAGAGAGTTAGAAAGAGAGAGTG
-AGAGGGAACTTCAACTTTTTTTTTCAAAAGTTTTGGTCGATGATTTTGAC
-ATTTGATAAAACTGAATGAGAGATGATGCTTAGATAAATGAAAATTGATG
-AGATGATATTTATAAATGCACTTGCGATGTTGTTTTACGTGCAAATTGCT
-GATTAGTCGAGAAGTTGTGATTTTCGTGTCGGGAATATTTCACTAGGAAC
-GCCCTTGCGCCTTTAAAATGTAAAGTAGCATAATTTATTTTCAGAAAATT
-TAAGCGTTGGAAAAATAAGTAGTGCGCAACATATTTGACTCCCAAAATGT
-TTTGTAGCGAAAACTACAGTAACTCTTTAAACGAATACTGTGGTTCTGGT
-GTCGAGTTACGGGCTGCCAAAATTCGAAAGTAAATTCATTTATAATCGAA
-CCCGTAAATCGACACAAGCGCTGCAGAAGTCATTCGAAGAATTACTGTTG
-TTTTCGCTACTAGATATTTTGCGCGTCAAACATGTTGCGCAGTACACATT
-CTCAGAATTTTGTGTTCCCGTGATATAACAATTCATTTTTCTGTCTATAA
-CCTCTTTCAATTATAAGAAACCATTTGCAGCGAAACACAAAAAATTTAGC
-CGATTTCTATTTCACCTATAAAATTCGCGTCAAATGGCCCGCGCTGTCAA
-GACAGTCATAAAACCAAATGTTATGCAAATGGCGTAAAATTCAACAGTGC
-CCGCCCGCATGGTCATTGATCGTTTAAGAAGAATGGAGGAGGGTGCGGGG
-AGCATCATTTCCTGAAATGAGCCCAGAAGCGAGAGATTAGAGAATTAGAG
-AAATGAGAGATCAATGAGGAGAGGGTGAAAGGTATGAACAATGAATAAGA
-AAGGGATGGAAATGATCACAGATGGAAATAGATGGAATAATGAAGTGCAT
-CGATGCACCATTTCAGATTTTTCGGGCTTTTCGCAGATAATTGAGGAATT
-ACATTTTTCGGGCTCCATCGATAATACCCTGCCGGACAACGCGTTGGAAA
-GTGTGTGTACTCCACACGGGCAAATACCTTTAGTTTTACAATGAAACCCG
-AGCCGCGACCCGACACGCAACGCGCCGTAAATCGACCCCAGCCGTGGCCG
-AACCAAAATGGCCTAATTCGTCAAACTTTTACATTCCAAAATATCAGGGA
-AACCAGAAGTGCGCGTTTCCTGTTGTCCGAAAAAAGATTACAACAAAAAA
-GAAGAAATGGAGCATTTGCGCTCCATCACACTCTCAGACAATTTCATTTT
-CCACATCCTATATATATTTTGGTTTTTCTGTCGTATTTTGTTTTAATTTA
-TTGGTATTTCGTTCAAAAATAATTATTTTGACTGTATTTTTGGTTGCATA
-CATGTAGAACTGCTGTTTTTTAAGATATTCTGCCCATTCAAGTTTTTCAG
-TGTAAAATTGATATATTTCATTCCAACTGAAAATGAGATCGAAACGATGG
-AAAACCTCGGATATTACTGATTATGGAAAGAAGAGAAAAGAATCGGAAAG
-TTGTGGATCAAGTTCACCGATTCTCGAAACACAGTCATCTGGCGGTGCGG
-AACTTGACGAAGTTACTGAGGATGAATATTCTAGTAATTCGAGCAGTAAT
-GAAACTAGCGACGAAGAGGAAAACTCAGAAGTACCAAATGTCTTATCTAT
-AACAGAAAGAGGTAAGAATTGCGTCTTCTAGTGATCATACTTTTCGCCAG
-ATTCCCTAATGTAATATATTTTGTTGTAGAGAAAAGTTGGCAAAAGTTAA
-CGGAAAACGATTTGGGACGAATTCGTTTCATCTTGAAGTACACTAGCAAT
-ACTAAAAAATGCGTGAACGAGTATTTTCAATATAATCATGGGCAAAACAA
-TGAAATTATGAAAAGTCTATTATTGGATACCGATGGAACTATGACTGCAA
-AGGCTTGTTCGGAATGTGCCTACGATTTGAATCAGTAAGTTACTCTCTCG
-ATTTATTCCCAAAATTAATATGTGCTTCAGGTGCCACTGCAAAAAACCGC
-TTCGCTTCATCAATGCTCCGTGTGGTTGGTTTGCTATTCAAAACTATAAA
-TAGTTCACTGTTTCCGTTCAGAGGTCATCAACCAAGTTCTTCATGTTGAA
-AATGCGGAGCCCACCAGGATCAACCATGTAATCGCAACACTCTTCCGGAA
-TCACATTGGCGAGATTTTGTTGGTCCACTCTATTTCTGTGCGAGAACTGT
-GATAAAACTAGTATTTTCAGCACAAAGGCTCGAACTGCGGAAGCTCGCGC
-ATCTGAAGAAGCTCAAATCAGGATTCAAATCCAAGACAACTCGAACGCAT
-TCCAAAGATCGTATCATAACGATCCACAACCTTCATCAGCCGAAGAACAT
-GAGGAAGATATCGTGGTGGATGGCTGAGTACGGAGCTCAAATGCCTTAAG
-GCGAAACAATTGGTTTTTTAATTTGCTGGTTATCATGTTAGATTTTGAAC
-GTGTTAGGTCTTTCAATTGTTTTTTTTTTTCGAAATGTTGTTGTTCTAAT
-AAATTTGTTTTATTTAATCAAACGTTTTTTAGTCTACTACGGGCGTGAAG
-CCAGATATCAGTGGTATCTTCTTATCAGAAGCTGAATCATTTCCGGTTGA
-CAATGTTTGAAGGACATAAGAAAGGCTGTGTTACTGATTTCGACCATTGA
-TTTGTTTATATATGGATATGTTCCACTGCCTTTTGGAAAGGCAGTATTCC
-CGGTATATATGGGCCTAATACGGAATCTAAAATAACCTGACACAAACCTG
-ACGTTGACCTGTTGCCGGCCCGCGGCGGCTTAGTGTCAACTTGACAGCGG
-GTCGCGATTTCACCTGCCAGTTGTTCTCCATTCAGCAGCCAGCGACCTGC
-TGGCAGGTTGCCACTAACCTGACGCGGTTTACCTGTGTTATCGGCGCGTG
-CATAGCTTAGTGGTTTCAGGAAATGATGCTAGTAATCAGAAGATCGGGGT
-TCGGGAAACGGCAGGGGCTTGAAGGTTAGGTTCTATGAAGCAGGGCGAAG
-GGTTGACAAGGAGAGGCAATAAGCAAGTAGTAGGGGTTCTCTAGAAAACA
-TTTTTGTCTTTAATATGCGTTTCCTACTGATTTATTATTGATATTTGGAT
-CCCCTTTTCTAGAAAAAAAAATCAGAATCAGCAGAAAAATTTGAGAAAAA
-GTCATAGCAAATCAGAGTTGGTCAGAGTAAATCAGAGCTAGTCATAGTAA
-ATCATAGCTAGTCAGAGAATATCAGAGTTAATCAGGGTAATAAGTAGACC
-TAGTCATAGTAAATCAGAGCTAGGCATAGTAAAGCGTGGTTACTCCGAGT
-AAAACCACACTTGCACCGAACTGCGGTTAGTGTGCTTTACCATTATGTAA
-CTCCGCTTTTTACTCTGAGTTAGTATGATATGGTTTGTCTGAGCTGTGGT
-TGGGCTTCGCGGGAAACTTGAATAATTCGAGACAAAATCTAATTTTAGCG
-AATTTTCTTTAATTTCTTTGAGGTTTCTACGACAGAACTCGAAAAATTTC
-GGGTTTTAATGTTTACACATTTTATTTAAAATTGAATAATCAACTGCGGG
-ACTCCTCGAAAATCACATGCTCATTTAAATTTTGAAGTTCAAACCTCAAA
-AAACGCGCAAAAACCAAATTCAGCTAGGATATCAAATTTATGATTGAAAT
-CTATATTTTGATGCGGTGTTTCTGAAGTTTTCGCGATAAAATCCGAATAA
-TAATTCCACGTACCGTATATTCTCTATCTAATTTCCAGGTCATTTTTTAA
-TGCAGCACTATTAGAGACTGTCGTACTACTGGAGACTGCAGCATTAATTT
-TCGAACGGCTACTGTCAATTATAGATCACTAGTATTTAGTCACAAAAGCT
-AATTTTTTAAGCAGAAATTCATAAAAATGTTTTCAATATTGCGAACTTTT
-GTAACAAAAAGACCCAGTAATTCAATTACTTTCGTAAATTATCAAAAAAT
-CATCAAAAATATACAAAAAAATACCAAAAAATATTGAAACTTTCAAGTGA
-CTCTTTCAATAGAAAATGGGGTGCAGCACTAATAGAGACTGCTGCACTAT
-TTTTCGGACCCTTTTTGAATGCAGCACTATTAGAGACTGCAGTATTTACT
-ACTGGAGATGCAGCACTAATAGAGAATATACGGTATATACGTAATATATT
-CTTGCAGAAAAAAGTACGATTATCAATGAAAAATAGCTGATAAGAGGCTT
-TTGTTTGAACTAACAGACGGAACGACTCCGGTTTAGTTCAAAAAATTCTA
-AAAACACGTTGTGTCAGGCTGTCTCATTGCGGTTTGATCTACGAAAAATG
-CGGGAATATTTTTCCAGAAAAATTGTGACGTCAGCACGCTCTTAACCATG
-CGAAACGAGATGAGATGTCTGCGTCTCTTTTCCCGCATTTTTCGAAGATC
-AAAACGAATGGGACTTTCTGACTCCACGTGTAAAAAGGGGTTACGACGGA
-CCCTGGCCTAGAAATTAGGCGTGAAAATTCTCGGGCACTGGATGTAGTGA
-ACGCCCGCGATGAAAAATTGGGGGAAAATTAGGCTTTCTTTGCGAGAAAG
-ATTAATTAAAAATGTTTTCCTTTGTCGAAAATAATTTTTAAAAAACACAC
-CACGTGTATTCAGCTCGACCAACGCCTCGAAAATTTTCAAAAAAGGCGGG
-AAAAATTAGTTGAATTCGCCAAGAGGAATTTCACCGCAGCGCGTGCAAAA
-ATTTCAGCATTTGCGCGTGACGGTGTTTGCACAAATTACACCGAATGGTC
-GAGCTGAAAACACGTGCACACTTTTAAATAAAACTAGAAAATAAATCCCA
-GGCCTGCAAATATTGCACACAAAACCGTAATCCCCTTCGCGCTAAACAAC
-ACGCGCAACGATGCTCCGCTTGGGGACAAGGAAAAATTAATTTAACTCGG
-GATTTTCATTAAAAAATTAGGTTTTTAGTTAATTTTTCGATGTTTTCACT
-GCGAAAAAGTGTTAAAATAACGATTTTTCAACCTATTTTCAATTAATCCG
-TGCAAAAAATCGTGTATTTCTCGAGTTTTGAAAGAAATTTATGAAAATCG
-GCATTTTTAATAATGGTTTTTCAAATAAAAATATAATTTTTCGGTGCAGA
-AAAGTCGTTGCTCGTACAGTTTTTTTAAAGCATTTTCACATCAAAATCCT
-CCATTTTTCCAGTAAATCGATATGGAGTGCGACGAGACAAAGCTGAGCGA
-CGGCGCAAGCGGCTGGGTGCCGAGTATCCCGACAGATATCGATTCAAAAG
-ACACACCGTTGCTCGATATATCTTCTCAGGCGATTTGGGCGCTTTCCAGT
-TGTAAAAGCGGTAAATTTTCCGACTTTCAAGGGAGAAAAGTGTAGAAAAA
-TCGAAATTACTTCTTAAAAATCTCGTAAAAATCGAATTCTTTCAGGATTC
-GGCATCGACGAGCTCCTATCCGACAGTGTTGAGAAATATTGGCAAAGCGA
-TGGCCCGCAGCCGCACACGATTCTTCTAGAATTCCAGAAAAAGACCGACG
-TGGCTATGATGATGTTCTATTTGGATTTTAAAAACGACGAGTCTTATACA
-CCGTCAAAGTTAGCATTTTTGGCTTTTTCAAACGAAAAAATACAATGAAA
-CACTGAATATCTAGTTTTTTTCTCAATTTTTGCCTAAAAAACGGCGATTT
-TTCACTAGCTTTTCAATTAAAATTTGAACAAAAAGTTTTTTAAAGGAAAA
-ACATGAATTTCTAGCTTTTTCAGAGGTTTTCTATTAAAAAATAGAGATTT
-TTGTGATATCTGACTGAAAAATTACCAAACTGTCGATTTTTTTAAACTAT
-TTTTCACTTAAAATCTGCAATTTTTTTTTTCGAGGAAACATGTGAATTTC
-AAGCTTTTTCAGAGATTTTCTATGAAAAAGGTTCGTGCCGAGACCCATGT
-GCTTTTAAACTTCAGAATTTTCCCAATTTTGAAATTAAAAAGAGAATGAA
-AATTGATTTTCATGGAAAAATGCGTTTTTGGCCCAAAACCTCCAAAAAGT
-ACAAATATAGGTCGACTTTCAACTGTTTTAGATCAATTTTTTTGCAGAAT
-TCAAGTAAAAATGGGTTCATCTCACCAGGATATATTTTTCCGTCAAACAC
-AAACATTCAACGAGCCCCAGGGATGGACATTTATCGATTTACGCGACAAA
-AATGGGAAACCGAATCGCGTTTTTTGGCTTCAAGTACAAGTTATTCAGAA
-TCATCAAAATGGGAGAGATACTCATATAAGGTAGAGGAATTGAGAATTTC
-AGAACGAAAATTGCCGAAAAAATGAAATTTTAGCGAATTTGAGTCGGAAA
-TTTCGAAATTTGATTGATTTTAAGCAAATTTCCAACTAAAATCTTGAAAA
-TTTGATCTTTTTAGATAAATTTTTTTTTAATTTTGTGCTTTTCAAAAAAC
-CTCAAAAAACAATTAAAAATTGAAGTAAAATTAATTTTTCAACAATTTTT
-GAAAGGCCGAATTTTTGATTGAAAATTTTCACAATTTGTCCATTTTGTGG
-TGGGGCTTATTCCGAAAAATCGTTGTTTTTTTTTTCAAAAAAGTTATAAA
-AACTTTAAAATTGCCATGTAAAATATGTTTATTCTCAGACCTCGTAGGCA
-CGAAGCAGGCGTAGGTCGCCTCGCAATAAATTTGAAAATCTCAAGAAAAA
-TCAATAAATTTGTGATTAATCAAAAAAATTTAATTTCCTGGTCCCAGCAC
-GAATGCTATTTTTCGAAAAAAAAAAAGAGGCGAGCCTAATATAGACCACG
-CCCACAAAATGGGCAAAAGTTTGATTTTTCAAAAAATCGAAACAAAAATT
-TTTCCAATTTTGTGAGATTTTAAAATTTCCGGTTTTTGGAAAATCGAAAA
-AAAATTTCTCGTTTTTTAATTTTCAAAAAAAATTGTGCCTAAAATTCAAA
-AAAAAAATCAATACTTTCTCAAAATTTCCAGAAAACAGTCCATTTTCCAG
-GCACGTTCGAGTCCTTGGACCCCAGCGATCTCGTGTCTCCACAACGAATC
-GAATATTCACCGGAGAACCACACGGACCGATTCCCGATAAAAATATCACT
-AATTTCGACGACGAGGATTTTGCCAATTTTATCGATCACTCACTTGTTCA
-CTTATCACTTCGTTAAATTTACCTCCAGTGATTCCAGATAATGAGCCAGT
-TTTGCATTGAAATTTAGTGCCAAAATATAGAAAATCGCATGATTTAACAT
-AAAATAGCGTTTCGAATTGAAACAATGGAAAAAAAGTGCTATGATGATTT
-TTTAACACTTTTAATTGTTCCAATTTGAAGTAAAATCTATTTTCAGATAA
-ATCAACTGATTTTCTATATTCTGCCACTAAAGCTTAAAAACTTGCCCTGC
-TGTCCTAACCTTCAAATTGTTCCCTGCAAATTTTATTATTCTTGTTTCAT
-ATTTTTGCGATTGCTTCGCGAGACCCAAACTCACACATTTACCTGTAAAA
-TATAATCGAATAATTATTTATATATTTTCTGTAAATTTCCTTAGTATACT
-ATAAATTTTCTGATCTCTCTTCAAAAATCGCTAGAAAAAATAAACAAATG
-TCGGTTTAAAAATTCCTGGTAATTTACCTTCTATAGAAAATTTTTCGAAA
-AAAAAACCGAAGAAATTCAGATGGAAATTCCCGATCCCGAACTGCCGGGA
-ATACCGATTGATCCGCAAGATTTGGAGATTCTAGACACGCCCACACGGTT
-TTACGAGAAGCTTTTAGTGCGTTTTTCGTGTCGGGACCCGGAAATTTGAC
-ATTTTTGGCGCGCGGCTTGTTAGACTCCAAACCTTTTCAAAGATTTTTTT
-TTCGAATTAAATAACATTCGTGCTTGGGCCCGGAAATTGAATTTTTGATT
-TGAAAACAATTTTTTTTGAGTCCAAAATTTTCAAAGTTTGTCCATTTTTG
-GCGCGTGGCCTAGTAGGATCCGCCCCTTCTAAATTTTTTTTGAGCAAGTT
-TTCTGAAGCATTGATTTCAAAAATTTTTTTTGGAAATTTCTGGTTTATTT
-TTCCGGTTTTTTTCCGAGTTGCTGTTTAAGTTTGGAGAAATTCCAGAATT
-TGTCAATTTTTGGGGCGTGGCTTTTTCAGTAAGCACAGTTTTTTTTTTTT
-GAAAAATTGAAATTTTCGCGGTGCGGTTCAAGAAAAACCACAAAAACTCA
-ATGATTTTTTAACGAAAATTTCAAATTTCTTGCAAGACCTACTGCAATTT
-CGATTTTTAGAAACTTTTTGAAAAAAATCCGAATTTTCTGATTTAGCCCC
-GCCCCAAAAATGGAAAGATTTCCGAAAATTCGAACCAAAAGTTCGCAAAA
-ACTTGAATTTCTCTCACACAGATTGACGCGCTAATTTGAATTTTTCCAAA
-AATAAGCCCCGCCCCAAAAATGGACAAATTTTAAAAATTTTGAACCAAAT
-AAATTCAATTTTTTTTCGCTTTTTTCCGTTTTCGAACAAAAAATTCTAAA
-AATATATGGTTCTAGGCGGGGCTCAGGCACCCATCTACCTACTTAAAAAT
-GCGTTAAATTTCAGGAATTAACTGCATCAACCGAACGGCGTCTCGCATTG
-TGTAGTCTGTATTTGGGCGAAGGAGATCTCGAAAAAAATCTGATCGCTGC
-GATCCGAGAAAGATCCGAAAAATCCGAGATTGAAGTGACGATTCTGTTGG
-ATTTTTTGCGCGGAACACGGACCAATTCAAGCGGCGAAAGTAGTGTAACA
-GTGCTGAAACCTATTTCGGAAAAGTCAAAAGTTGGTTTTTTTTGCAAAAA
-AAAATCGATAAATCGATAAAAACCGACAATTTTGAGAATTTTCATTTCAA
-ATTTGAGTCCCACATGCGCCTTTAAATATGGTGTACTGTAGTTTTAGCTC
-GAATGTTGAATTTCAAAAATTGAGAATAAAGAAATGTCGTGACGAGACCC
-ACAAATGTTTTGAAAAAAATTTTCAATTTCAAAAAAATGTAAAAAATTGG
-GAATTTCCCTCCAAAAGTTAAATTGGTTTAGTCACAAACTTTGAAATTTT
-GAAATAAAATTTTTTTCGGCTAAAAATAAGTATTTTTTAAAAACTATTTT
-GAAGAAAAAAAGTTAGGTCTCGCCACGATGTATCTTGTATATGTGTATCT
-AAATTGCCATGTCGTGACGAGACCCTCTCATATTTTACACTGCAACTTTT
-TCCTCACGAGGGACGAGGAAAAGTGGTTTCTAGGCCATGGCCGAGGGGCC
-GACAAGTTTCATCGGCCATTTATCTTGCTTTGTTTTCCGCCTGTTTTCTT
-TCGTTTTTCACAGCTTTTTCCCATTTTTTCTTATTAAAACTGATAAATAA
-ATATTTTTGCAGATGCCAAAACGATTTTCAAGTAAAAAAATCATGTATTC
-AGTGGGCAAGCAGCGGTGAAAGTGGGCATTGTAATATGATGGATTACGGG
-AATACAAAACCTAAACTTTTTCTGAAACATGATACATATGATGCTTAAAT
-GCTGAGACTACCTGATTTTCATAACGAGACCGCTGAAAAAGTTTTGAGGT
-TTTCAAAATTCAACTTTTTGTGCGAAAATCTCGACTTTTTCACCGAAAAA
-GTTGAATTTTGGAAACCTCAAAACTTTTTCAGCGGTCTTGATATGAAAAT
-CAGGTAGCTTCAGCATCTAAGCAGCATATGTATCATGTTAAAGAAAAAGT
-TTAGGTTTTGTATTCCTGTAATCCATCATATTACATTGCCCACTTTCACC
-GCTGCTTGCCCACTGAATACATAATTTTTTCACTTGGAAATTGTTTTAGC
-ATCTGCAAAAAATATTTATTTATCAGTTTTATTAAGAAAAAACGAAAAAA
-ATCAGTGAAAAACGAAAGAAGACAGGCGGAAAACAATACAAGATAAATGG
-CCGCTGAAACTTATCGGCCCCTCGGCCATGGCCTAGAAATCACTTTTCCT
-CGTCCCTCGTGAGGAAAAAGTTGCAGTGATTTTGCTCAAATAAAAAAATC
-CCCCAAAAACCGATAATTTCACCATTTATCAGATATATCTCTTCCACACA
-CCGGAGCTTAGTGGCTTAGTAAAACGAGTTCTTCCACAGCGAGCCGACGA
-GATTATCGGTCTCCAGCACATGAAATTATACATTTTTGATGACAATGTAT
-TGATTAGTGGGTTAGTTTTTTGTTTGCATGGGTCAGACTACAAACTACAA
-AAAGCCTAATTTCAGAGCAAATTTGTCGGATTCTTATTTTACTAATCGAA
-CGGATCGATATTTTCTATTCAGAAATTGCAAACCATTGGCAGATTTCTTC
-CACGAAATTATCAATGTTGTTGGTGAGTTGGCGATTGCGCTCCACCGCAC
-ACACTGTTCAATGGGGCTCGCTTGAACTGATAATTTTTTCTAAAAAATTA
-CAAAAATTGTTTTAATTTGCCTTCAAAAAACCATCAGTTAATTAAAATTT
-TCTAAGCAAAAAATTATATACTTTCTAAAAAAATTGAATTTCCCGCGAAA
-ATAATTTTTTCTGAGAAAATTTGAATTTTTCACCAAAATATTTTTTTCAA
-CATTTTTTACCACAAAATGAGGCGGGGCCTCGGTATACACGCTCAAAAAA
-TCAAAAAATACTTGTAAATTTGACTACCAGCTATTTTTTTTTCGAAAAAA
-AAATCGAAAAGTAGGCCAGTTTTCGAAAAATTCTCGACAAAAATTCCGAA
-AAATGGGGCGGAGACCTGTGCGGTATTCGGCATTCGGCATATGCCGATGC
-CGGTTTTTGGAGCCCGTCATATGCCGTTATGCCGATTTGAAAATTCACGG
-CATATGCCGAAAATGCCGTTATGCCGAAAAATCCCGAATGCCGCACAAGT
-CTGGGCGGGACTTCAAAAACCACGCCCACAACAGAGAACAAAAATTTGGA
-GTGATGGTTTGCAATTCCCTCGCGCACTTTTTCTTGTTTTTTTTCAAAAA
-GATGAAAAAGCGCTCTACTGTACACGTTTTTTTTCGAATATTTTCATTAA
-AAATCCAATTTTCAGCCGACTCGAGCTTCATTGTCGAAAATGAGCAACTG
-GTGCCGAGCCCAAAATGTGATGTGCACCCATATTTAGGTAATCTGAAAGG
-ATGGGTAACCTGAAATTTTTCCAAAAAAATTTTTTTTAAGGCTCCGCTCA
-TCTCTACCGAGAAATGCTCAAAACACGTGTGAATCGAGTTATCGAAAAAT
-ACAAAGAATCGCGAAAAACGTCGTCGAATTGCATGTCTGCTGACACGTGG
-ATTTACCCCGTTTTACAAATGGGGCTTTTGGGAATTCATCAGGAGTTTGA
-ATTTTTGCAAAAACTTTTCTCACTGAAAAATCCGGAGCTCAAAATGACGA
-TGGCTTCGGGATATTTCAATTTTATTCGAGATTATGAGGAATCGATTCTG
-AAAGAAGGAGATTATCATTTGGATATTCTTACAGCTTCTCCTTTTGTAAG
-ATTTTTTTTGAGGGAAAAATATCTGAAATAAGTTCAAAAATTTCAAAATT
-GAATTTTTTCGAAATTTTTGTAGGAAATTTTGGTTAAAAAAAGTTTTCTC
-GAGAAATTTGAATTTCCCGCCAAATTTTTTCTGTGAAAATTTGATTTTCC
-CCTCAAACATGTTTTCTCATAAAATTTGAATTTCCCGTCAAAATGTTTCT
-GAGGAAGTTTGATTTTCTCATCAAAATTTTTCAAAATTTCCAGGCGAACG
-GATTCTTCGAATCAAATGGCTTCTCGAAATATATTCCACCACTATATTCC
-AACATTTCTGATCAATTTCTTCGAAAACGAGAAATCAACGGCCGATTGAA
-TGTAAAAATGTTCGAATATCGAAGAGAAGAATGGACATTTCATGCAAAAG
-GTCTTTGGGCAGAACATAATAATCAATTAATGACATTAATTGGCTCATCA
-AATTACGGTTATCGATCGGTTCATCGAGATCTTGAAGCTCAAGTGATGGT
-TGTTACAAGAAATCCGACACTTATCGATCGATTGAAAGATGAGAAAAATC
-TATTATTCGAATATTCATCGATACTTGACATGGCTGCACTTCAACAACCG
-GAACATCATATTCCACCATTAGTTCGAGTTATTTCACGTCTTATTCGGAG
-TTTTTTGTAGACGTTTTCCAATTTTTTATAGCGGAATAATAAGGTTTTTG
-ACTTTAATAAATCTTTGTAGATTTCAGTTTTTTTGAAATGCAACATTTTG
-CCGAATTAGGCCATTTGACAATTTTTGGTCGTGTCACGGCGCGGTTTGCA
-GTAGAAAACTAAATGTATTTTGATTTGTTTTTTCGAAATATCCGAAAAAC
-AACAAAAAAATCTGTTTTTTGTTGAAAAAAATGTTGCGAATTTCAGAAAA
-CGGCACTTTTCCGATTTCTGCCCCCTAGGGCTGTTATGAGGGACGTCCCC
-TATTGGGGGGCGGGGACGATCATTTGTCCCCCCATGGGGGACGGGGGCTC
-GTCCCCGTCCCCACGTCGGGGGACGGGGAGCGCCCCTTGTCCCCGATGGA
-ACGAAAAGTCGTCCCCTTTTAATTTTTGATTTATTTTAGATTTTCACTTC
-ATTTATTACCGGTACAGAGAGTGTAGATAGTTAGAGAGTGCCAGACATCC
-GGGACCCAATGGAGCGGGGCGCGCGGAAGAGACGATTAGTGTCGATTTAC
-GAAATTTTCCTCGTTGTCATCATTTCGTAAATCGACACAAATCGTCTCTT
-CCGCTTGGGTCCCGGATGTCTGGCACTCTAACTATCTACACTCTCTGTAC
-CGATAATAAAATATTTTTACGTGAATCTCGTTTCCACTAAGATGTGCGGG
-TGGATACCGTGGATATTCCACACAAAAAACGTGTCGCTTTAATAATTATG
-AAGCAAAATACAAACGCACATTCTTCACATTGGGTAAAGGGGGCGCGCTC
-CCCCTTTACCCGGGCGCCCCTTTTCGGGGGGGGGGGGGGGGCGTATTACG
-GGAGGTTTTTTGAAAAATAATTTTTGAAATTTGTCAACTGTCGACAGCTG
-TCGTTCAATTAATGTTTTTTTTTCAAATCTCCATACAAAAATGTTCATAG
-TAAATTCTTTATCAATATTGGGGTCCCTCACAAAGTTCAAGTTTTCTTCT
-CACTCTTCACGGCCGCCTTCGATTTTTTCTTAAGACCTTCATTTGCATCA
-AAATACATTCGACAAATTTGAGTCACATAAGCATCATCATGTGCGTTTGC
-CTGCAAATGTTAACAAAGTACCAGGCGGATGCCAAGCTTTCACGTCTTCA
-TGTCTACGTAGAAAATGCAGTCATGAAGTAGGCACGCAGACAGACAGGCA
-AGTACATAATCAGGCAATAAATGGGCAAGTAGGCAAAGCAGGCATGAAAT
-AGGCGCTTAGGCACGTGGGTAGGCAGGTATGAGACATAGGCAAACATGCA
-GGCAGGTATGAAAAGCGAGAAAAGGCAGGTGAGCATGATGAAGGCACATA
-GGCAGGTAGGCAAGGAAGCTCCTAGACAGGTACAAAATAGATGTGCGCAA
-AGTAGGCATGTGCAAAGAAACTAAGCTCGTCGCCAGGCATGAGGTAAGCG
-CATAGGCTTGCAAGTAGGCGAGTAAACACGCGGGCATCGAATAGGCAATT
-AGGCAGGTATTTTTGTGCTCCATTTGGAAACACACTTACTGGATAGAAAA
-GAGTGAGAGTCGTGTAAAATGCAAATGCCAAATAAATTGGATCCGGTGCA
-GCACATTTTCTCTTTGATCTCGTTTGTTCAATCAGACTCCGATAATTGAT
-TTCTCCAGTTTCACTTGTATTGATCGCTTGGAAGAGGCTCTCGATGACTG
-AAAAATGCTCAGAAATTTCGGATATGTTCTCGATTTTCAGTGAATTTTTC
-CTGAGAAAAAGCTAAAAACTCACGAACAAACGCTGCCGATCGTCCACCAC
-CAGTATTGCATACGACAAAAACCGGTCTCTCGCTGTCTGTCACTAGTTTC
-AACAAATACCTAATCTCCTCGGCATCTTTCGGTCCCATATGCTCCGGCCA
-TCCGGTATACTGGTAATGAGTCACCTCTTGAGTACGCTTCTTTCTGGAAA
-AAAGTTTGTTGCAGGCTACCTTTTATGCCTGCATGGAAAAAAATAGTAGG
-CGGACAGGCGTGAGGAAGGTTAGAATATTGATGAGAAAAATTGAAAACAA
-TCATTTCAAAAAGCAAAGAATTGACCGGTTATTATTAAAAAATAAAAATT
-TTTATCCGGACAATCCGATGCAGATGTGAGTGCCTGCCTACCGGCGTGCC
-ACCGCGCCTATTTCATGCCTGCGTGCCTATACTTACCCAAATGTTAGCAA
-CAATTGTCTAGTCTTCAACAAAGGCTTCGAGATACTCTTCGTGCAAGTGA
-TTGTTAAGTCCGCCAAAATTAGTTTTTCGTCGAGTTCAGTGGGAAAGTAC
-CTATCACAGTTCACCTTATTAGCTCCAATAAAGTGATCTGAAAAATAAAT
-GGATTAAAAACGGAGGGTGGCTTGATAGACAGGCAGGCAGGACTACTGCC
-CTGTGTAGGCCGTCTTGTAGACAAGCAGACAGGAGTGGGTCACCATGTAG
-GCAGACGGGAGGGTGTAGGTTGTCTAGTGGGCAGGCAGGCGTAGGCTGCT
-GCCAAGCAGATATAGGCTCACCTATTTCCGCGAAATCGCACAACATCACA
-ATTGTGCTTGGTTTATTCAGCTTCACTGACTCCCAAAATGCGGCAATCGC
-CAAAATATCGGAGCTTTTCTTATCAACAGGCAACTGCGGAGCAGGCATCA
-ACACAAACTTCAAGCCGTTATCCAATTCAACAACATGTGATGATTCTCCC
-TGGCTGAAAATGAAGATTTTTTGGTAGGTACCCATAATTTTGCCTACCTG
-TCTACCTATGTGCGCTTGAGTTAAAGGTTAAACCTAAGCCTATGCCTAAA
-CCTGAGCCTAAGCTGAAGCCTAAGCTTAAGGTTAAGTGTAAGCGTAAGCG
-TAAACCTAAGCAATATGTAGAGGCGAAAGGTAGGCAGGCAGGCGTAACAG
-TCTTACCCATTCTTTTTCGAAGACTCATATGACACCGGATCACATTGACA
-GTGATTACCTCCCTGTAAGCCGCAAAACTGGGCAAAATCGTCTCCCGTAA
-TTTCTAGGTTATTTGGAACATTCTCAAATACTGAAGTACAATTTCTTTTT
-CTAGTAACGAAATCCGAAATTTGCGTGTTGAATGTCTTGAGGAAGTTTGA
-AAAACGTGTCTCATTCACATCCACACGACTGATCATCTGATTTGGCGGGT
-ACAGTTTCTCTTTTTCTTCCGAGTCGAGTATTTTGTAGCCGTTCGGGGTT
-AAGCAAAAGTAAGCAATTATTGCACAAATTATGACAATGACGATCAGAGC
-CAAAATTACATATTGTCCGTGTGTTCTGGGATTTTGGAAATTTTTAGTGA
-AGCTTCTAGGCTTTAGCTTATGCTTAGGCATAGGCTTAGGCTTCGGCTTA
-GGATTAGGCCTAAACACAGGAGCATATAGGTTGGCAGGCAGGCAAAATTA
-GAGGTACCCGCCAAATATCTAGAAGCTTCACTAAAAAAAAAACGTTTTGA
-ATTTAGCATGAAAACAATTTTGAAAAAGTAAAATGTTTTCTTATCTCAAT
-TTTTTCCTTGATTTTATATTGTAATTAAAAATAATAATTTGAATTTTCAG
-CTCGATTTAGATAGAGTTGTGCTAGATTTCAAGAAGAAATTGAGAATTTT
-CGTAAAAAATATTTTTAACGCGAAAAAATTTTTAAAGCTTTAATCCAAAT
-TGTTCAAAAAAGTTTGGAGTAAAAAATTTGGAATTTTTTTGATTTTCACC
-CGAAAACCTTTCTTTAGAATGTCTGCCTCTTGCCTCCATCCGCGCCTTAT
-GCTCAATCCGCGCCTTATGATTTTTCTCCGGGAACTTGAGACGATTTGGT
-TGTTGGGAGAAGAAGTGCGGAATGTGGAGCGTTTGTTGAGAAAAGATAAA
-ATTTGGAATTTTTTTGATTTTCACCCGAAAACCTTTCTTTAGAATGTCTG
-CCTCTTGCCTCAATCCGCCTTATGATTTTTCTCCGGGAACTTGAGACGAT
-TTGGTTGTTGGGAGAAGAAGTGCGGAATGTGGAGCGTTTGTTGAGAAAAG
-ATAGATTTTCTACTATTTCTCAATTATTCAATACTATCGAACGACTTGAT
-GTCCAGTCTTTGAATGTTCTTGTCGAGGAGGCGAAGGTTATTGGTAAGTG
-TATGCGTGGCTTTCCGATGAATTACCAACGGCACGGAAAGCCTGAGTGTA
-CCCTTTCGATTTCATCTTCGGAAAGTGTGCTAAGCGTAGGCGCGTTAAGC
-TAATTTTTCCTGGTAAATCCGCAATTCTTGAAGATCGAACCAATAGGGAA
-CACTGTGGCACCACGTGCAACTTCAGGGGTAGGCGGCAAACACAACGGAA
-ATTTATCGATTTGCCCAATTTGCCAGAAATTTCGGTTTCCGAAATTTTGT
-CGATGCATTAAGGGTTTGATAATAAAATCGAGTTTGGGAATTAGCGTTTT
-TCAAAAATTGTCGAATACCTTCAGAATTTTGGTTTCCGAAAGTTTGTCTA
-AAAATGCAGGGGTAGGCGGCAACTGCCGTTTGGCATATTTATTTTTGGCG
-AATTCACCAAATTCCCGTGAAACATGCGTGAACTTTCTTCTCGTTTCTTA
-ATTAGTTTTTCATCAAATTGATAAAAATGAGAAAATTATAAATTTGTAAA
-TTCACTTCAAAATGCAGGCGGGCAGGTTTCAGTCAAGCCCTGAAACCGCG
-CCTGTCTACCATGGAAGCCCTACTTTCAAATAAGATCAACTCACTGTGGT
-GGTGGACCATTCTTTTCAGAATTTCCAAGATCTGGCGGTGGGAGAATTGC
-AGTCGGCAGAGGCTTGAATAAATTTGAAAAAAACAAGTCAAGAGCAGCAA
-GAGCCTTTTTCGGTTCATCAAGTCTGTTTTGAAAACTTGAAAACTCCAGT
-CCACCATCATCCAAGCTCTTCAGAGCATCCTGAACTTCACCGAGCGACTT
-CTTATTGCCAACATCCTTCACAAGTTCTACCAGTTTTTCCAACGATTTTT
-CCAAGCCCATAAGACCACCAAGATTAGCCCAATCAACCTTCTTAGCTTCC
-GTGAAAACATAACCATAGTCTACAAATTTTGTGGAATCAGACTTTTTAAT
-TCCACTCTTCCATGCATCTAGCTGAACAAACATCACATCCAAAGATGCTC
-CAAGCGCCACCAGCTTCTCCAGATTATCCTTATCGTCCTGTGCCAAAGTG
-GCTCCACTCGCTGCCAACTCTCGTTGCACAATTTGTGCATGGTTCTTGAT
-AATATCCACATTTGCTCTTTCTCGGAGCACGTCCTCCAGTCGAGCAATTT
-CTTGTGCCGCTGGGCCAATGGAATTAGTGTGTTCAGCGGCGTTTGGAAAC
-TGGGATGTTTTATCCGAAGCAAATTTGCGGCGCTTGCTAAAGTACAGCGC
-CAGAGATTTCAGACCACTATTGAGGCTTGAAACTGAGATCAGAGCATCTT
-CGACGGCAGTGACTATCGGCGGGAATTTTTGATCTGCTCGGAACGAATTC
-AAATCTGACAGGTTCTTTTGAATTTTGTCCAATTCTTTGTTGGATTGAAG
-ACAGCTCAGTACGTCGAGAAATTGAGCAATATCAGATCGAGAGTCATTGA
-TTTTTTCAATAGCACGTTTTTCTAGTGTTTTCAAAAGATTCGGATTCAAG
-AAAGTAGCGTTTGCCGTCATTCTACTCATGGTCAGCGACAAGCCGGTCAT
-TTTTTTCACTCCATTAAAGCATGGCTCAGCGGTTGTCCAATTGCTATTGT
-TCATATCCTTGCAAACAGTGAGCACTTCTGCGTGTCCTGATTTGCTTTCA
-ACAAGTTGATTCATCACACTTTTCAATATCGATTTCGATTGTTCCAATTC
-GGTGTCAATGTTCGATGCAATTTTAGATAGTTCCTCCAGATTCGTGAAGT
-CGGGGGCGGTAGTTAGAGTAGATTTGGCGCATTGGGCTGAAAGTTTATTT
-TTATTTTCGTTTTTTTGAGTTTGAACTTTTGTGGACAACCGACAGATTGG
-CTCAAACTAAAAGGACTCTAAAATATACAAATTTTGGAACTCAAATCAAT
-TTCGCAAATATTACTTTTTTCTACGGAGCTTTGATCAGGGTGGGGTGGCA
-AACGATTTTTTTCCAGCAAACGGTAAATCGGCAAACCGGCATTTTGCCGA
-TTTTCCAAAATGGCCGAAAATTTTTGAATCCCTCCCTCTAAACACTTCCG
-GCAAATTGTTATCCAGCAAACTACAATTCGGCAAATTGCCTGAATTAAAA
-ATTTCCGCCCAATCGGCAAATTGCAGTAACTGCAAATTTCCGATAAATTT
-GGAGAAACCGGCAAATCGCCGAAAATTTTTGGTAACTGGAAAAAATTTCA
-AAAGGCACTGTACCCGTGCTTCCGTTTTTTAAAAAATGCTTCTAAACAGT
-TCCGGCATATTGATATCCGGCAAACGGCAAATCAGCAGTTTGGCTAAAAT
-AAAAATATCCGGCGAATCAGCAAATTGCTGGAATTAAAAAGTTCCTCCAA
-ATCGGCAAAACCGGGAATTTGGTGAATTCGCCAAAAATAAATATGCCAAA
-CGGCAGTTGCCGCCTACCCCTGCATTTTTAGACAAACTTTCGGAAACCAA
-AATTCTGAAGGTATTCGACAATTTTTGAAAAACGCTAATTCCCAAACTCG
-ATTTTATTATCAAACACTTAATGCATCGACAAAATTTCGGAAACCGAAAT
-TTCTGGCAAATTGGGCAAATCGATAAATTTCCGTTGTGTTTGCCGCCTAC
-CCCTGAAGTTGCACGTGGTGCCACAGTGTTCCCTATTGGTTCGATCTTCA
-AGAATTGCGGATTTACCAGGAAAAATTAGCTTAACGCGCCTACGCTTAGC
-ACACTTTCCGAAGATGAAATCGAAAGGGTACACTCAGGCTTTCCGTGCCG
-TTGGTAATTCATCGGAAAGCCACGCATACACTTACCAATAACCTTCGCCT
-CATCGACAAGAACATTCAAAGACTGGATATCAAGTCGTTCGATAGTATTG
-AATAATTGAGAAATAGTAGAAAATCTATCTTTTCTCAACAAACGCTCCAC
-ATTCCGCACTTCTTCTCCCAACAACCAAATCGTCTCAAGTTCCCGGAGAA
-AAATCATGTGATCAGTAGTTTCTCGGGCCCAAGCGTCGGTTGCCAATTGA
-GAGTTTAGTGCTCCAATATCAATTGCTCCATTCGGTAGACCAACTGTGTA
-CTTCTTGGTTCGCAGGGACTGCCCGATGGATTCGATGGTTTGAAGATGGA
-TCTTCGATTCTTGATTTGGAAATGCATTCCGGATAGATGCCATGTGTTCT
-TCTAGCTTTCTTAGTCCCCGATTGATGTCTACAATCTTGAAGGATGAAAT
-AAAGTTCATCACATCACGAACTTTTGGCCATAATACAAAGAAAGAAGCAG
-CAGAATTATTGTTTTTGAAGCCATGCAACGTAATCTTCGGATTCTCCACT
-ATGTTCAAAAAATCTTGGGATTTTTTCAACAAATCGTTTAACGCAGAATG
-GGATTTGGGAATATCGGTGAAACTAGTGAACGCTTCAATCTCTGTGTACG
-AGTTGCTCCATACTGATAGCTTTTCGGAAAGGGTTGTAACTGATGAAAAA
-CTGTCTGTAATGTCTTTCATGTCTGCCTTGAAATTAGTCTCGTCTGGCCA
-CTTCTTGAGATCTCCAATATCATGAGCCACGTGGACAACACTTTTGACAG
-TTGTGAAGAATTGATCTGCCTCAACATCGTCGCCGATATTCGATTGTAGT
-TCTATAAAGGTATAGTTTTTGGGGGCAAAAAACGAAAGTGGTTCAAAATT
-TTGGAACAAAATGCCTATTTTTAGATAGCTAAAATCTAAAATTTTGCAAT
-GCTGACAAGTTGTGAAAATTTGAAATTTTAACAGAAAATAGGCTTTTTCC
-TAAACTTTGAATCACCTTACTTTTTTTTTGAAATTTTCGAAACTTTTCGG
-TTATTTCCAAAAAAAAGCCGCAAATACTCTATCAGGGGTAGGCGGGAATT
-GCAGTTCGGCAAATGTATTTTCTGCAAATTCGGCAAATCGGGATGTGTAC
-AATTTTGTCGTCTCTGGCAGTTTACCGACTTGCCCATTTACCGAAAATTT
-TAATTCCGGCAAATTGTCCATACTCTATTACTACCATAGGCCCTTATATA
-ATCTTTTTCCGCCCACCCCTGTACTCTATTACCACCTAATCTGTTACTAC
-AGTGGATTTTTTGAAACCAAAATTTCAGCTTTTGAATTTTATATTCGTAG
-TGAAAAGATATTCGTAGTGAAAAGTTGAAACCTGGAAAACATAGTTGCAT
-AATTGCATCGTAATATGTAAAAATAGGTCTTCCATGGTAGATAGGCGCGG
-TTTCAGGGCCTGCCTGGAACCTGCCTGCCCTATGTGAACGAGTAGACTGT
-AGTTTTAAAAAACAAAAAAAGGTATTTGCCTAACAAAAAACATACTCAAA
-TATTTGAATGTTTGCAACCAAACCTTTAAGCGCTATCAGTTTAGATTCCA
-GCGAACTGTAGTCAATTGCATTCAGTTGATCCATTGAGAAATCGTATTTG
-AACAAATCCAAAGTTAAATTCATTGATGGAATGGTTCCTTTTGTCAATTC
-TTGTTGTAGGTACATTGCATTGATCAATCGTGAGGCGAATTGTAATCGCT
-CAACGGCAGTTATCAAGTTGTCATCTGCAACTTTTATGAATGATTTTTTT
-AAAAAGTTATTTGTTGTCATTTTTCTTTTATTAATTATTACGTATATTAT
-ACGTATCATGCGAGTTTAGCTTTCCAACCCCCCGCGAACTCTTTTTACTT
-TTTTTTTTTTTAACTTTTGTCTTTTTTGTCCTTTCTTGGCTATTTTTTTT
-ATGAGAATTGACCCGAATTTGACTTTTTTCGGATTTTTAGGAATTTCTAG
-GAATTTTTCTTTTTTGTCAAAGCGAGCTAACGCTCGCCACTGACGCCAAG
-CCTAACATAAGACTTAACCTAAGTCTTAGCCTAAGCCTTACAAGGAAAGT
-CTTTGAAGGGGCCTGTAGATTTGGGTTTCTCATGTTGATATTCCGATAGA
-AGAGTGTTAGTTTTGATCTCTCCAAAAAATTTAGCTGCCCAAGCCAAGTT
-TCAGCAAAGTAATGACATTTTGAAATTTCAGTTAAAAACACCATTGAAAT
-ACACTGTCTTACAGTGCTATCCACACAAATATCAGCTTGCGTGAACACCG
-AAAATGTGACGCCCACCACAATAGGCTGAAGACAGTGGATTTCAATGGTG
-TTTTTAACTGAAATTTCAAAATGTCATAACTTTGCTGAAACTTGACTTGG
-GCAGCTAAATTGTTTGGAGAGATCAAAACTAACACTCTTCTATCGGAATA
-TCAACATGAGAACCCCAAATCTACGGGCCGCTTTAAAGACTTCCCTTGTT
-AGCCTAAGCCTATGCAAGACACGCAAAATATACATTAACATATATATACA
-ACAAATACAACGTAAAAATTGTTTTTCTGTAATTCGACTGACAAACCTTT
-AGCTTCACGTTTGGAACGTGGATCTAATGACATCACATTAAAGAAACTGG
-ATTCTTCTGGAACAAAATATATTGAAATTAAAGCTCTGAAACAGTCAAGA
-AACCTTCGAAAGTATCCGAATTGACAACACGATTAACCGTTATAATTATC
-AAAACGATTATTATTTTGATTCCTGGAAGACAGAAGAAATTCGGAACGAA
-AATAAAAATCAACCTACTCATTGCAAAGTATTATGAAACTTCCCTTTGAT
-CGACGGTTTTTGAATCAATTAATGATTGGAAGTGTGAATTCTGAGAGAAG
-GAGTGTTGGAATTTTTATTTATTTTATAACGAAAAGGTCACGGTTTCTGT
-AATTTTAATTTCTATGAAAGTTTTAGGGACTCACAGAATGTCAAACACTA
-GATGGCCGAAGAAAATTTGACATAAGCAGCGAAATTTGACCTTTCAAAAA
-AAAATTAATATTACGTGAAATCTTTTTTTTTCCAATGGAATTGAATTTTT
-GGCTGATACATGAGGGAATGTGTTTCAAGCTGTAATTTCAGTAAAACTGT
-ACAAGAAAAAACGTTCAATATTTTTACCTTTGCTTATAACTCCTCTACAA
-AATTTTTTCGGACAAAAAAATAAAACAAGCATGGAGATTACAGGTGAATT
-TCGAATCCTCATCTTCATTTTTCAGACTGAAAATCCAAGAAAAGTAGCCC
-GAACTTTTTTCTGAAAAAGTTCCTATATACTCATCAAACATTCATAAACA
-GTATTTAAACAAAAAATCCCGAGATAACACTTTTGTCTTCAAGATATTCA
-GGTTGAAAACTAATGTCCTGAAACTTGGATTTTGGGTCCTTAAGAAGATA
-AAACAGATAATTAGCTTTTACGTTAATACCCGCAATCATTTGCAAATTAG
-AGCAAAATTAAATTGAAACTTTTTTTTGGATTTAAACATTTTTTGGAGCC
-GAAATACAAGTTTCAGGACACTAGTTTTCAACCTGAATATCTTGAAGACA
-AAAGTGTTATCTTGGGATTTTTTGTTTAAATACTGTTTATGAATGTTTGA
-TGAGTATTTAGGAACTTTTTCAGAAAAAAGTTCGGGCTACTTTTCTCGGA
-ATTTCAGTCTGAAAATGTATGATTTTTTAATTCAAAATTTGAGGGAATGT
-CGTTCATTGTGGCTCGAGGTCAATGGATAAATGGCTAAGACTAAAACATC
-ATTGATCGAAGAATGATTTTTTATTCATAAAAACTATATATTTGACCTGA
-AATCATTGTTTTTTGTCACTATAACCCATTGGAATGAGCTGTAGAAATTA
-ATTAAATTTAGAAATGATTTTACCGATACGTGGCAATGTTTAATACATTA
-GTTTTCTGGCCGAAGATTTGTATGTTTTCCCGAGAAAGTGAAGCGACAGC
-TTAAAAGCGCATCGCCTTTAGTGAGAGGCAGGTCTCGACGCGACGACATC
-TTTCCTCGCGCGCAGCGGCGAGATTTCGTCATTCTACGTGTTGGTAAAGA
-AAAAGGACGTGATTTTATCGATTTGCATCGATTTTTTTTGGATTTTTCTT
-TGTTTTTATTGTATTTTTATCGAATTTTTAGTAGTTTTAAGGTTTTTTAT
-CGATTTTCCTTGATTCCGTTGCGTTTTTAAGCGTTTTTCTCGTTCGTAAT
-GATAAAAAGGGGGTTATTTCTCCGTTTTCCAAGAGTTATCTGCGCGTATG
-CCAGATTTTGCAGGAGGAATCATCAAAATTCTCAGTTTTTGGCATGTAAT
-CCTTACGAAGAGTACTTTCTGAGGCTCAATGGCTTTTTCCCCCGCTGTTA
-GGTGCTTCAGTAAGTGTTCTACTCCTTTCAGGGGTTCCTTCTCTCGTCTA
-GGAGATTAAATATGTTCGCATTTGTTTCTTCCCTCTCTCTTACGCGCTCT
-TTCCAGCATTGTTAGTTTATCCACGCTCTTTTCCTCTGTAATTTTTCGTT
-TATCACTTTCTCTAATTTTTCGGTTTCCGGTTCGTGCACTCGCGCACCCT
-CTCCCTATTTTACTCTATCTCTCACTATCTCTCACATCTATCTCTATCTC
-TCACAAGCTATTTTGGTATTTTGCGCGTTAAGAAGTCATGTTTTGATGGA
-CCGTGTCCAAAGGAAGAATATTTTCGTCGAGTGAAAGGTATGTAACTTCG
-TGTGAAGTCGACTCCATGAGTCTTGTGAATATTCCGATAACGTTTTATCG
-AGATGTATTATCGGGCGGCCCGAATTTTATGTATGTTTTTCATTGTGGTT
-ACCATGTAACGGGAGTTCACATCGCAGAAAGAGCAATTCTTTATCGCGAA
-AGTACGATTTCAGGCCCCGGAAGGCTTTCTTATCAGTTTAATGCGACATC
-TTTCGTCGGGTGAGATATATTGTCTTGCGTTTCTATCGCATTTCATTGGA
-CCGGTCGAGCCAGGTCTGAGTGTTTATGAGTACGAGTCGACTCCGTGAGT
-CTCAATGATTTTCCGTTTTCAGGCGGTTTTCAAGGTTTCCCGTTCTTGGT
-TTCTGCTTCATCTTCTACTACCGTTTTAAGTAGGATTGGCTCAAGTCTAC
-GGAAGAGTAGAGCAAGCCTACGAAGAAGGTCTTCGAAAGAGTAGCGCAAG
-TTTACGGAGGATTCACGCAGGTCTACGGAAGAGTGGAGCAGGTATACGTT
-AGAGTGGCACTAGACCATACTGGGAGTCCGATTTCCAATTGGATTCTCGA
-AAAACCTTGTACCTGCACAAATAACCAGACGAGCCGATATATCTACCTTA
-CCGAGCTCCGGGTTAATCGTCGTCAAGTATTTCAGGATGAAGCGTATAAG
-GCGATGATTTTCTTTAGCTATGCCGCGCGTTTTGCAATTGCATAGCTGTG
-TATTCCGTGTAGACTTTATCGCTCACTTGTTCGATTTTCAGGACATCCGG
-TTCGACCTTTTTTCTTTCTCCCGCTATCGACGACGCAGATCACGTATGAG
-TTGCTTTTATATACGGCGATCGATTGGTCCGGTATACGTAAAATTAGCTC
-TATATTTTATCGCTTTCGTTGCTCACGCGATTCCCAGGTATTTTAATGTC
-GAATCATATTCCGTCACCTACCACTACGTAGGAGATATGCAGGGCTATGT
-GAGAATAACTCAGGTTTCGTAAGAGTTTCTCAAGACTAGGGAGGATATTC
-GCAGGTTGTTGAGTAATTTGTTTTTCCAATTAGCTATTCTCCTTGTCAGG
-ACTTATTCAGGTGTGAGTCGAAGTAGCCCGAGACGTTTGGCCCTAGTATG
-GATACTTCACGACAGTTTCAGACAGATTGTGGTCCGCCTTTAATGGGAAT
-TATTTCTACTGCACAGGTTCATAGCTGACTTAGCCGAATGAGCCCCTTCG
-ACGTCGCAATTTGGCGGTTAGCACACTTCCAGGAAGACATAGACGAATCA
-CAGTTTCAGAATTCCTATACACTTCAGTAACTACGGAGTAAGGCGATCAG
-TTCCTTGCCGCATTTATATGTTCATCTTAACTTTATTTTATATTAGCTCA
-CGGCTTTCATTGGAAACTACAGATAACTGAGCCAAATGCTTCGCCTTTTT
-GTCACTTTTTCCCAGTTCACTCAAGCCCAGAGTAGATGTAGTTTGAGGTT
-ATCTACTTCTCGTTTCCATGTGCGGATACTAGCAGAGTTTCTCCTGTTAT
-AACTGAGAGTCATTTCACACACAATACGGTTTATCTGTCGGCAGTTTCTT
-CTCACAAGGTTTTCGCTATAGATGAATATCTGGTATAGGGGTGAAGAATC
-TGTAATTATTAAACGCCTCAAGCTTATAGCCGTGACTGACAGTTATAGCC
-CCCGGCTTTGCTGGTTCTACCCTATACCACACAAAACCCAAACCAATAAA
-CCCATAATACTATATAATTCGTGTTGTCTTATTAGAGCGTAACTTGATCA
-GGGAAAACGAATTCTCGGGGAGCGAAGCGATCCGAGAATTGTATGTTTTC
-CCGAGAAAGTGAAGCGACAGCTTAAAGGCGCATCGCCTTTAGTGAGAGGC
-AGGTCTCGACGCGACGACATCTTTCCTCGCGCGCAGCGGCGAGATTTCGT
-CATTCTACGTGTTGGTTTCCCCCCTCCCGCCCCACACACATATTATTCCA
-AAGTGCGAGACACATATGCTATGATTTCCCTTCCGGAGAAAAATCGAATT
-ATTATGAAAATATTAAGTTTAAACCGTAAGTCGTTTATTTTCAGGAGGTG
-AGTTTTATTTTTCCTTCATTGTCGCCTGAGTGGGCAGTCGGTGTCTATCT
-GCAACATTCGCAGCTCGACCCTTGTGCTTGTTTTGGCGGTAGCAGGAAAC
-TTATGGGTTTTTTCACAGTTTCGGGAGAGATATTTACAGGCTCTGGTTCA
-GGGAACCAGATTCAGAGTTTAATAATGATATATCTTTACAGGAAAATTGT
-GGTTAGAGTTTCATGGCAGCTTCAGATCCCCTGATGATCAACAGTTCAAT
-CCACGGAAACACGGACGAAATGAGTGGTCCACCGAGCAACAATGTGGAAC
-GAGACGATTCCAGGTTTTCCATGCCCCCTAACATCGATGATGGTCTTATG
-GTAAAGTTCTTCCAATCAAGCGGTGTTCGTGTTTTGGATAAACTTCTTCG
-ATAAGTAATACTTGACTAAAAAATATCGAGAATTAAAGTCACAATTAAAA
-TTTACAAAATATTTTGTTCCAGATTATGAATTTTCGAAGATTAGACTATT
-CACGGCCACGTAGCGTTTGACATGTTGTGGGACTGAATTTCTACAAAAAC
-GTGAACTCACGTAGACTGTCTCTTGAATAATTTGAATGAAACAGATGTGA
-GCTCCGGAATAGGCTTAGGCTTAGGCTTAGGCGGGGCTGGGAGGAGAAAA
-AAATTGCGGAATTTGCCGTTTGAAGAGCTCGGCGAGTTTGCCGAGTTTGG
-CAAATTTTAAATTTTGCCGTACACACTACAAATTGGACAAAAAATCGAAA
-TATCAAAAATAACAAATTGTTCTGAGTTTGATCAGTTCGGTAAGAAAATT
-TTGAAAAAAGTGATTTGCAGAATTTGCCAAGCTCGCCTTTGTCTTTGGTC
-AATTTAGCACCATATGAGTGATTATTATCAATTTTCCCACTGTCGCTACT
-TCACATTTAAAAAGTAGTCATCAATTGCCGAAACAACTTCCTTCCAGCTT
-AAACTTTTTTCTTAGCCTCATCGGGACCCTTTCCTAATCCCTTCTTAACC
-TCATTCTTCCCATCTTCCAAAATTTCCATCCTTCTTCTTCTTCTTCTTCC
-CACTACGACCATCTTTGTCGTATAGCACCTTTCTCGCGAGAGTGTGTGGA
-AACAATTTGCGAAAAACGGCTCCCGATCCCCCCATTCGTTTTGGCGAAAT
-CAATAGACACAAAAATGTTCAAACAAATCTCCCCTTCTCGTTTATCCCCC
-TGTTGCACAATATCCTTTTCTCACAAAAAAACCTTTGCTCTTCAATTTTC
-GGAATCATCTTTTTGCGCTTTGTCGTGTTACTGTGAAAGGCGGAGTACTG
-AAATATGGAAAATATTTTTAAATGACTCCCTGATTCCGAATATCTATGTG
-AGAAAGTTCAAAAAATTTTCCCTCATTTTATATTTCAGCTTGAAATCGTG
-ACTTTCATTGTGCACTAATGAGATTTCGATTTCGAAGTTTTTTTGAAATG
-TGTTTTCAAGGTCAATTTTCAAGGTCAATTTATTATTTTACTATCGAAAA
-ACTAAAAAAATTTCAATGAGTAAAGTAAGTAAGTAAGCATTTCGTAAATA
-TACAAAAATCTCGTAAATCGACACATAGCGTCTCTGGCGCGAAAATTCGA
-AATCTCATGGGTGCACAAATGAAATGCGAGATTTCAAACTCAAATGTAAA
-ATAAGGGAAATTTTTTTGAATTTTGTCACATAGATATTCGGAATCAGGGG
-CAAATTTGAAGTCAATTAAAAATATTTTTCAGATTTCGTGGTACTCTAGT
-CTAAAACTAAAACTAAAACTAAACTAAAGTTAAATTAATATTAAATTACC
-ATGAATCTAATTTTTGTTTTTTAAAGTTTCCTGCAAAAATTCCAAGATCT
-CAGTTTGCCGAAGTCTAAATAACGACAACTCTGAACTTTTGTCCCGAAAG
-AAATCGAACACCGGTGTATACTAATAAGATCCCTCGAAGCTCGGTATACA
-AAAGGATCATGAAAAAGGGGTGTCTCACCTTGCGCATAATACCTTCTGTC
-TTTCCCCCTTCACCAGAAAGATTTCCTTCTTATATTTGTTCGTTTCGTTC
-CTGCACACTCTCCATCTCTTCTAACCCCCTCCTCATTCAGAATACTCTCT
-CATCTCACAACGCTTCTGTCTACCTGCCTGCGTCTCCTCGGTACCATATA
-CTATCTTGTAGCTGCCACTTACCAACAGACTTGCCTCTTGGAGGTCTCTC
-TCTCTTTTCCACCAAATCACCTTGTTCTTCCGACTTGTTCTCTCTTATCG
-AACTGACTTTTCGTGTCTGCGGGCCTTTCACATTATTTTCCAATTTTATT
-CGAATTTTATGTGCCCACTGCTTGCTAGGTTTATTGAGTGCCGCATTAAT
-TTTATTGATTAAAAAAAAAGCCACTTGTAACAATTTTTATGAAATTTGTT
-TGCATATTTATTTAACAGTAGCGAAATTGTTTTAAAATTCGTACTGTGTG
-AGAAATTTGCACTTTCGAAGTGTTTAAAACATTCTATTACGGGATCACAA
-GATTATGAGAATGCTTATTGCGCAACATTTTTGACGCGCAAAATATCTAG
-TAGCGAAAACTACAGTAATTCTTCAAATGACTACTGTAGCGCTTGTGTCG
-ATACTGGCTCGATTTTTTAAATGATTTTTTTTCGAATAGTGACGTCGATA
-TTCCATTTTGCTTTCTTTTTCGTATTATAATTTTATTCATTTCGAGAATC
-GAGCCCATAAATCGACACAAACACTACAGTAGTCATTTAAAGAATTACTG
-TTATTTTCGCTACGAGATATTTAGCGCGTCAAGATTTTTCCTTACGGAAA
-TACAAACTTCTTGGCGAAAATTTCACGAAAATTCAAATTTCCCGCTTAGA
-ATTTCCCGAATTTTTCGAATTTCCTGCCAAATAAAAACTAGTTTAAATAT
-TTAAAAAAAAGCTTAGAATTCTTAGAATGCGTATTGCGCAGCATATTTGA
-CGCCCAAAGTATCTCATAGCGAAAACACAGTAATTCTTGAAATGACTACT
-GTAGCGCTTTTGTCGATTTACGGGCTCGATTTTTGAAATAAATTTTTTAA
-AATCTTTTCGAATCAAGCCCGTGAATCGACACAAGCTCTACAGTAGTTAT
-TCAAAAAGTAGTTTTGGCTTCGATCGAGATATTTTGTGTGTCAAATATAT
-TCCCGTAAAACAAAATACCGTCTAAAGATATAAAATTTAACGCCTATTAC
-ACCCCAAAACCCGCCGGAAAATCCAGAAAAATTATATAAATTCGCAGTCA
-CTTCTCAAAAATAACCTGAATAGTTGACCGCGTAATTCGACCCGTTTCCC
-TACGACTGACCACACCCCGATTCTCTCGAATTACCCGCGACAAGCTTAAG
-CATCTTTCTTCATTCCCACACTTTTCGTAAACTTCTGAGAGACAAAACAA
-TAATATTTCTTTCTCAAATCAATAATGCCTATATTCTCCGCATCCCGTAG
-CCGATCCCATCACCGTAATTCTAGAAATCCCACGAAATTTTCCAATTTCT
-CTATTGAAAAGGTCTCTCTTTTATATTACCCAGGCGCAAAATTTCGTGCA
-AAAATACAATCGACGGTCTCGACGCGATAATTTTTGCTAAATTCCAAAAA
-TGTGTGCGCCTTTAAAGATTATTGTAAATAGCTTCAAACTTTCACCGATA
-TTTTTAAAAATTGATTTTTCTATGTTTTCCGTTTAATATATATTTATTTA
-TTTAAAAATTAAGTTGAAATTGAGAAATCGATGAAAATCGAAAATTACAT
-TACTCTTTAAAGGCGTACATGTCGTTTCGAGACCGGGTACAGTATTTTCG
-ACTGCGATTTTGGTTTTTAAAAAAACCTAACCAATAGAATTTCCAGCGCT
-CACACTCATTGGGTGGAAGCAGCAGCAGTCCGACGAGCTCTTTTTCGTCA
-AACGACGAATTCGACGATCGTCAGAACAAAAAGTGAGTCATCAGTTTTGT
-TTGAACAGCAGGTGTGAAATTTATTGTGAAATTTAAAATGGGAAATCCGA
-AAAAACACACCTTGTGTGATCTAAGATCCAAAAAAAATAGAACAATCGAT
-AATTTTCGGGTAATTTTAAAGTTATTTTTAGCGAAATAAACAATGCATTT
-TTGAGGGATTGGTTTTCAGTCATTTTCGATTAAAAAATTCAATGTTGAGC
-TGAAAATATCGATTTTTACCAGAAAATTGATAATTTTCGAGCTCAATACC
-ACAATTTTAATGTTTAAATCGCTTTGAAACCTCATAAAATCTCCCGCACC
-TCCAGTTTTTGTAGTTTTCCGCCTAAAATGTCGGAAATTCAACAGAATAC
-TCATTTTCCTAGCGAAATCTATTAGTTTATAATAAATTTGATCGTTTTCT
-GCTTAAAATTCCCTGAAACTTCTGAAAAAAAACCGATTAATCAGCTGAAA
-TTCGCTTAAAACTAATTTCGTGCCGGGACCACGGCCTTTTAAATCGGTAT
-GCGCTTTTAGTTTTGTACCGTATCTATTTTAGTTTTTAAAGTAAAAAATG
-AAATTTTCAGCAAGTTTTGGCGTCAAAGAAATGTATCGAACGCAGAAATT
-GAACGAATAATCGAGGATTTCATAGCGAATGGTATTTTAAGTGAGTTTTA
-TTCGATAAAATCGACGAAAAACCAGAAATAAACAGTTAATTTCCAGAAAT
-GAGCAACGGGAACAGCTACAATCACCATCACCAATTCCCGATGAGCATTC
-CAATATCGTGCTCGTCACACTCAATTCAATCACAATCACGAATGAACACT
-CTGAACGCGAATAGGGATCTCCTGTCTCCCGGCAACGACGTAATTGTCAC
-CAGAACCGTGTCACCGTCGTTTTATTCGCATGGAATGCCGGCCCGGGATA
-ATGTTTTTCGAAAAGACGATCATGTCAGGATATTGGGGAATACAACGGTA
-TGAAAATCTGCTTTTCATCGAAAAAAATTGGAATTTTCAGGACCCAGCGT
-GGTATCGAGCCCGTAATGCGAATCAGGAGGAGGGTCTGGTTCATGCAGAT
-TGTGTAGTGAGAATAAAGTTGGTTTTTCTGATCAATTTCTGTGAATAACC
-CCGATTCCCATGAAAATAGGATTTTCAGCAGAAACTCCAGGCAAATTGAG
-TTTTTGATGCGAATAATGGATTAAAAAAGATAAAAATCCATGAAAATTTA
-ATTTTTTACATCAAAAATCCATAAAAATCGGATTTTTGAGCGGATTAGAT
-TACTTTGCCGAAAATTCATTTAGAAAAAAACAATTCTTGCGCGCAATTGC
-GCAAAAAATTCAGAAAAATGAAACATAAAAGTTAAAAAAATTATTTTTAA
-ATATTTTTGAGCTGAAAATAAAAGAAAATTCGGATTTTGTGGCCAAAAAT
-TCAAGAATATTCCATGAAAATTAGTTTTTGTTTGCAAAAATCCGAACAAA
-AATTAATTCTTTTTTTCGCTAAAAATTGAGAAAATGGTTTTAACACAAAA
-ATCCACAAAAAATTGATTTTTAGGCCACAAAATCTATGAAAATTCTGATT
-TTCTGGAAAAAAATTAAGAAAATTCAAATTTTTTGTTCAAAAACTTTTTT
-CAAAAGCATTTCAAGAAAATTTGATTTTTCATCAAAAAAATTAATAAATT
-TTAGCGGGCAAGCCTACGACAATGGAATTGTAAGAATGAGAGCTAGCGGA
-TGTGACGTGGCTCCGGGAGCAGCTTCAACAACCTCCAGCACATCATCACA
-TCATTCAACTGCAGCAAACCATCAGCCATGGTTTCATTCAATGATTAGCA
-GAGAAAATACTGAAAAGTAATATTGAAAATGTTGGAAAAATCTGGAAAAA
-TGCGTCATTATCTCGGTTTTCAGTCGGTTTCCAGTTTTATGAAAAAAACG
-TCACTAAAAACGACATATTTCTTTAAAAACGTAAACATCGGAAATTGTTT
-GCATGAAAAATGTCGCGATTTTCTAGAAAATTTTAAAATTTAAAGAAAAA
-TGTTGAAAATAGATTTTTTCTGAATTTTTTGAATTTTATTAGAAAATAGA
-GAAAACATCATGTTTTTCAACGTTTTTCGCCTGAAACGCTGGAAAATGCA
-GAAAATGGTTTTTTTAGTGGAAAATAAAAATATTTTTTAAAAAAACGAGA
-ATTTTTTTTTCGTCGAAAGTTCCAACAAAAATTACATGTTTTACAAAACA
-TGTAATTTTTGTTGGAACGTCTTTTTTTTCTGAATTTTTCTTTGATTTTG
-TTAACTTTCTGAATTTCAATTCAAATCGGCAAAATTGTACGCGTCTTTTG
-AATGTTCCCACATCTATTTTGTAACGAATACGGGAAAAAATATTTCAAAA
-AGGCACATTTTTCAAGTGTTTCCGCCTTATAAAAAATTGCCACTTCCGGC
-AAATTGATATCCGACATACGGCAAATCGGCGAACTGACAAATTGCCGGAA
-TCGAAAGATTCCGGCAAACCGACAACCCTCCGATTTGCCGGTGTCAGAAA
-ATTGAAAAGTGTAGAAAAATGACGTCACAACTAAATTATAATACATGTCA
-TTTCTTAATGTATTTTAATACAGTTTTGACGTCATTTTTCTCCACTTTTC
-ATTTTTCCGGCACTACTTGAATAACCCTGTATACCACTTTTAAAAATCAT
-GTTTTACAAATTTGTAAACTCCAGATTACTCCGCGGCAAACCGGACGGAA
-CCTTCCTAGTACGTGAATCCACAAATTTCCCCGGCGACTTCACACTATGT
-ATGTCGTTTCACGGAAAAGTCGAACACTATCGCATCGAACAGACGTCCGG
-CGGACAGCTGACCTGTGACAAGGAAGAATACTTTTCCAATTTGACACAGT
-TGGTCTCGGTGAGTCATTTCGGGGCTGTAGAGACAGGAAAAGGGGGAGGA
-ATGGGTAATGAACCGGTATTCGTTAGAATGAGACAGGTGAAGATAACAGT
-TATGATTTTATATTGTGAAGAGTTGTATTATAAAAAAGGTTGGTAGAGAT
-TTGAATATTTGGGAGAAAGAGAAAATGAGGGGAAAATTGTTAAAATTCGG
-ATTTAAGTTTGAAAAGTCACAAAAATGTTATATAAATATTTATATTTATT
-GGATATAACTAATTAAGATTTTATATAGCAATACTTTAAATAATATGAAT
-ATTGTTAAATATTGATATAATATCATATCAATCTTCATTTAATGGCTAAT
-TGTAATTTCCAATTTTCCAGCACTACAAACGTGACGCGGACGGTCTCTGC
-CATCGCCTGGTAACTCCGATTATTTGTGAAACAGCGACATTTTCATCAAA
-CGGATCATCGTCATTTGGTTCATCGTCGACAGTTGATTTGGAAGATCGAA
-CATCAGTATTTCGACACGCGGGTCTAGTTATTTCATCGAACGATATTGAT
-GTTGGTGATACAATTGGACACGGAGAATTTGGAGATGTTCGATTGGGAAC
-TTATAAGAATCGAAAAGTCGCGTTAAAAGTGTCGAAAAGGCATGGAAATG
-GAATGTTGGACTCATTGCTGGATGAAGCCAAGTTTATGGTGTAAGTTATC
-AAATTATTGAGAAGAAAATAATTTTGGCAAAGCCCAAAACAATGCGTGTT
-GAACAAAGTCATATTAAAAATATATTTATGTTTCAAAAATGTTATAATTC
-AATTTATTTTTAATTTCGAAAATCTATAATAACAACTTTTCCAAGTTTTT
-AGTTATGAGTACCCCGAAATCTGAAAAATATTTTCAATTGACTCCAAATT
-TGCCCCTGATTCCGAAAATCTAAGTGAAAAATTCGAAACCTGATGGGCGC
-ACAAATTATTTGTACAATTTAAACACTTTTTAATTAAGATTAAAAATTTC
-CCCAATTTTTTTGAAAATATTCATTAATTTCTATTTTATGTTAATAATTG
-TTTCAGTTTATAACGCTTAGTTTCAAAATTTTCAATTTTCCTGATTGATG
-ACTGATAACTAATGGCAGCAAATAAATCTGAAAAATTCCGAATTTTGCAG
-AGGTCTCTCGCATCCAAATCTAGTGACACTTGTCGGTGTTGTACTGGATG
-ATGTGAATGTCTACATGATAACTGAATATATGGCAAATGGTAATTTAATC
-GATTTACTCCGATCTCGAGGAAGGCATGCGTTGGAGAGGAGGCAGTTGAT
-GATGTTTGCGATGTAAGAAAAAGTTGACAAATAAAAAAATTGGAATTTAA
-CATTCAAATTAGATTGTTCAAAAATTGTTGACATTTCTGCATTTTTATAA
-CCGAAAAATCGAAATTTCATTTTTTCCGCCTGAGTAATAGTAACTCACCA
-CGAAAAGGGTTACTGTAGCAGTGCTTTTAGCTGTCTCTGGTTTAGAAATT
-TACGATTTGCCGGTCTGTCTGAAACCCGATTTTTTCTAGATTTTAAACAA
-TTTTCTAGTATCCTGTTGAATTAATTCCAAAAACATTTTTTGCTAAATTT
-TTGTTCTCCGTTTGTCAAAAAGCCGACTTTTTAAAAACACTGCAAAATTT
-CTCTCTAAGTTTTTTAAAAAATGTTTGCCCTTGAAATCAATGCAGTTTTT
-TTTTTAAATTTTATTTTGGAGTTTTTTCGAACAAAAATTTATTTCTTCGT
-CTATTCGTACCGAAACACCAAAAAATCCACTTTTTTTCGAAATTTTTTTT
-TTCAAACAACAACCCTGATTTCAAGGGTAAACATTTTTTAAAAAATTTGA
-AAAAAATATTGTAAAATCGGTTTTAGTTTTTAAAAAAAGTCGTTTAAATT
-TGTTGCACAATTAAAAAAAAATTTAGAGAAAAATCTTGCAATGCTTCAGG
-CACACAGCTGAAAATGCTAATACAGTACTGCTTTTCGTGGTTGGACCCAG
-CCGTGGTTACTGTACCTCCGGCAAAGTGGAAAATTCGATTTTTTTTTGTT
-AGAAAATTTGAAAATGTCAAAGATCTGATTTGAATGTTTCAATTTTTTGT
-GACAGCTGTTCTTGAAATCCAAATTTTCAACTTTTTTTCCATTTTCAGGG
-ATATTTGCCAAGGAATGTGTTATCTGGAATCAAAACAGATTGTTCATCGA
-GACTTGGCCGCTCGAAATGTCCTACTCGACGATGATTTAGTAGCGAAAGT
-TTCGGATTTTGGATTAGCGAAAAAAGCAAACAGCCAGTCACATGATTCGG
-CTTCTGGCAAATTTCCGATTAAATGGACGGCACCTGAAGCGCTTAGACAT
-AGTGTAAGTTTGGTTGAAAAATTGAAAAAAATTGAGAAATTTTTACAGAA
-TTTATTCTTTCAAAATTAATTTCATAAAAAGAAACAAAATCATTTCAATT
-TAAATTGGAATTTCGTATTCTTAAATTTTTAATTTAAAAAAATCGATATT
-TTTTAAATTTAACAAAATTTGAAAAAAGAAATCCGAAAATCCGCCGGAAA
-ATGCCTCAAAAATCTGCACTTTTTTTGAATTTTTGCCCAAATTTCTAGAA
-TTTTCCCTTACTTCATTTTCTTTCATAGCTTGAATATCAAAAATGGGAAA
-ATCTTGAAAAAAAATCCCAAAAAAATAAAAAACGAAAAAATCGATTTTCA
-AAAGTTTATTTTTTAAAAATTTTTGTGATTTTTTTCTGATAAAAATAGTT
-TGAAACTAGAATTTTTAGAAAATATCCAAATTTTCTAATAGTTCGCTGAA
-AAATGACTCAAAAATCACCAAAAAATATTGAATTTTCGCATAAATTTTTC
-AAAAATGGAATTTTTTTCATTAAAAATTAAGAATTTTTGCAATTTTCCCA
-AATTTTTTTTAGCAATTCACCACAAAATCCGATGTTTGGTCATTCGGCAT
-TCTTCTTTGGGAAATTTTTTCATTCGGACGAGTACCGTACCCAAGAATTG
-TGAGTTTTCAGACAACATTTTTTTAATTAAAAAAATTTCTCGTGTTTTTT
-CATATTATTCCTCGCTAGCTGTTGTTTTTATTTCTTGGTTGGGATCATTT
-CTTTTAAGGCTCCACGGAAAGGGAATCTGCGCGAGAATGAGATCTACGAA
-AATGAGCGACGATGCTAGGATGAAACGCGCGTTGTTTAGCATGTTTTTGA
-GACTTTTCAAAAATAGAGTTTTTAACCTTTTTCGTAGATCCTCTTCTCGT
-AGATTCCTTTTTCGTGGGTCCTCTTCCTATATTTTCGGCTTGGCCGAGTT
-TTCTCCCGGCCACGATCATCACTATTTTATTGATTTTTGTCATGATTTTC
-AGGGAGCCGATGGTCGTTCGGTATGTGTATATTGCATTTTTTCGTTAGGT
-TCTATTTTTTTCAAATTCTATCCACTTCTATTATACAATACATCTCACTA
-TCTTTTCCCCTGCCTGAAATTTTTGAAAAAAAATGAAGAAATTTTAATTT
-TAAACTTTTTCCAAAATTTTCCAAAAAAAAAAGTTTTTTATCAATTTTTT
-CAATAGCTCGAATTCTGAAAATGAAAAATGATGATAGAAATTGTTTTAAA
-AAAATGATTTTTTTTGTTGCAAAATTTAATTTTTAAATCGAAATACAACG
-TTTTTTTCAAAAAAAAAACACCTTATTCGAGACAAAAATAAGTTTCTTTT
-TTTTTCAAAATTGAACATTTGGATTTTCTGGAAAATTGAATAATTAAAAA
-AGATTAAATGTTCGAAAAAAAGAGAAATATATATTTATTGGCTTATTTGG
-AAAAATCAAAAAATAGTAAGAAAAAAATCAAAATTGTTCGATTTTTTATT
-TTTGTTTTGTTTCCGAAGATGTCCTTGTGGTATATAGTATTTTGGGTCCC
-ACCACGAAAATCGCCGTGCGCCTTTAAATTCGGCCGACCACGTCTCGCCT
-AAGTCCAGTCCCCCACTAATGTCAAAAAAAATTTTTTTTCGCAAAACCTG
-AATTTTGAAATCTTTTTTCCAAAAAAAAAAACGTTTTTTATTTAATTTTA
-AAAGAAAAAATTGGAAAAAAGTATTATTTTTTCTAATTTTGAACTTTTTA
-AAAAAATTATTACACATTATCTGGATTTTCAAAATTTTCCATATTCGATG
-TTAAAAATTATAAACATTTTTCAGAAAGGAACACCGAAATTTTTTTTAGA
-AAAAAGTCAAATTTGGAGCGAAAATTATGTTTTTCAACAATTTTTCAACA
-ATAATTTTGTTCAATTTTTTTTTTGGATCCAAAAAAATCTGTGTGTTTTT
-GTGTGATTTCCGGCACCCAACTCCCCAGAATTTCCCTCAAAAACTCTATT
-TTTTTCTCTGCTACCTCTTCTCAATCTTCTAATTAATTCTATGTTTTTTC
-ACTATTTTTTATTATTTTTTCACCCCTTTCAGAGCTCATTTAGAGCCCAA
-AAATAACCATCAGAAACACAAAAAAAACAACTTTTTTTTTCTTTTTGAAT
-TAATTTTTTCAGCCTATCCAAGACGTTGTGAGATATATTGAGAAGGGATA
-TCGAATGGAAGCACCTGAAGGATGTCCACCGGAAATTTTCAAGGTTATGA
-ATGAAACATGGGCTCTATCGGCACAAGATCGACCGTCTTTTGGACAGGTA
-GATTTTTTAAGGGAAATTTTTTAGAATTTTAAGACGAAAATCTGAAAAAA
-AAACCTACAATTATGGCAATTTTTGTGATGAAAATCTACAAAATTGAATT
-TTTTTTCGAAAACCTGATAGAAAAAAGAATAAAAATTAATTTGAAAAATG
-CCGTAAATTGACCAAAAATATGGAATTTTTACCAAAATTTCAGGGGTTTT
-TCAGATTTTACCAGAGTTTCTGCCTTATAAATTAAAAATTTCAAAGAGAA
-ATATCTTTTTAAAATCAGCATTTTTAGCAATTTTTGTGATGAAAATTGTT
-TAAAAATTGCCAAAAATGGGAATGTTTGAAGAAAATTCAGAAAAATCTAA
-ATTTTGGGCAATTTTTGCAATAAAATTGAAAGATTCGGAAAATAATAAAT
-TTTTCGAAATCCTGAAAAAATTTCACAATTTTTGCGAAAAGAATTGTAGA
-AAATTCGAAATTTTATTATTAAAAATATTGAAAAAAACAAAAAATTTCAA
-AAATCCGCCGAAAATGGCTTAAAAATCTAAAAGAAAAGATTTTTTGCATT
-AAATTTTATTGCATTAGTATTTGCGAAAAACAAACCCGAAAATTCACTCT
-AAAATTACAAAAATTTCAATTTTCTGAAGCTGCGTCCACAAAATGGCTTT
-AAAAATCATTTTCATGTACAATGTCAAAATTTTAAAAAAAGTGAAATTTT
-GTTCAGAAGTTACTATAATAAAGGTTTTTTGCTTTCCGGTCATTTTTTTG
-AATTTTGGAACATTAACCGAAAAAAAAATTCCGCATTTTTACCCTGAAAA
-ATGCGAAAATGTTTGAATTTTTTGAAAATTCCACTTAAATTTTTTATATT
-TTCAGGTCTTGCAACGATTGACAACCATCCGAAATACAGTATGACATCGG
-CGCACATCTCGAAACTTCCAGAAATCCATCGAATTTTCTAGTCCATATGA
-TGTTTCTGTTTTTTTTTCGCTGTTTTTTACACAAATTTTGTCATATTTTA
-TTGTAATTTCCCCCACACATTTTTAGGCATCGTTATTATATATTTTCTAA
-TCCGCTGCCGCGCATTTCGGGAGATCCTGGAATTTAAAGGCACAGCGGTG
-TTTTTGGATGGGTCCCACCGCGAAAATTATTATGCGCCTTTGAAATTTTT
-TTTTCGATATTCCTAAAAATCACAAAAAACATTTTTTTTTCTAAATTAGA
-GAAGTTTTAGCCTTTCTTTCGAAAAGTCGATTTTTTTGGTTTAAATTTTT
-CTCGATTTGAAAAAAATTTCAATTTTTAGTGAAATCAAAGAAAAAACATC
-AAGAAACTTCTATTCGAAAGAATTTTTTAAAATTGTATTTTCCGAAATAA
-TTTTCTCTGTTGGGTCTCACCACGAAAATCGTCATGCACCTTTAAATTTC
-CTTGCCCACACCTCTCCGAACGGCCGATACCCAATCTACGGTTTCTTCAA
-TTTTCCTCTGCATTTTTCATCGATTTTTAAAAATTTTTATCGAATATTTT
-CACGTTTAAAATTATTAATTTGCAACGAATTTCCCTCAACAAAAAATGCT
-CAAAACTCCGCCCCTTTATTGGCATAATTTTTGCCGCCACGGAAAATGCA
-ATAAATTTTATATTACTTTTCACCGATTTTTTAAGATTATTTTTAGAACT
-TTTAGTTTTTGTATGTGTGTGTGCTCGTAGTTTATCGGCAAGAAATTATT
-GTTTTTTTTTCTTAATTTTTAATAAGGGAACATTTTTTAAAGAGATTTTC
-AGAAAATCGGTAAAGATTTAAGATGCTCTGAATATGTCCAACTTCACAAG
-CTTCGTAGATTACGCGGAAAAGGTGATTTTGAATGTTGAATGTGCAAGTG
-CGCCCTATGGATAAATGGAGCAGCGTGGCAATTCGAAAAAATTTAAATAA
-AAACGTATTACTCGAAAGTTCACAGAGTTTTTCACCAAAAAATTGAAAAT
-TCGCTGAAAAAGTCGCGGGACATTCCATTTTTATTTTTCGGGAAGAAATT
-CGAGAATTGACTGAAAAAAGCGCGTCTTTATTCCAGAAATTTTAGCGGAA
-AATTCCAGATTTTTTTATTTAAAAAGACTCAAAACATGAAAAAAATATTC
-TGGAGAAATCAAAAATTGATTGAAAAGTTTCAGTTTTAGGCTAAAATTTT
-TTTGCGAAAAATTCATTTAGTTTTTGTTGGTAAAGTTCCGATTTTTCTGC
-AAAATTTGAATTTCTTTCTGAAAAAGTGCGTTTTTTTTTTCAAAAAATTC
-TTAAAATCGGAAATTTTTCGCCCCGAAACTGAACCGAAAAATTCGAAAAA
-TGAAGCGCGGTCAATTTTTGAATTTTGGCATTGAAAATATTCTGAAAAAT
-TCAAAAATTGACGGAAAAGCTCAAAGTTTTTCACAATATAATCGATATTT
-TCTCATTTTTCAATGTAAAAATCGATAGTTTCAGCCGCACGTCGCAGCAA
-CAAGCCAGACACCAATACCGCCGTCACCGTTGAACGAAAAACGGCCAATT
-CCACTGTTTCCAAGTGAATTTATCGATTTTTCTGTAGAAAAATCTGAAAA
-TTTCTGAATTTTCAGACGAAATCAGCAGCTCTTCGTGCGATGACGTCTCG
-TTTTCCATGCAATTCGGAGAATCTGAGCAGGGACATGTTATATGTACAAA
-AGTTCGACTTCGATTCTATCCTGCCGTGGTGAAAGAGGTTCGAAATTCAA
-AAAAAAAAGAAAACAATATTACTATACATTCGTAAAAATTAAATTTCAGT
-TTAAAGGCGCATCTCACATTTAAATATGCATTATTATTCATTAGTGTCGA
-CCCAGATTGAAAGCGCATGCAAATTTTGAACTTTAAAACTGGAAAAAAAA
-TTTTATTACACATTCGTGTAACATGAATATTCAGTTTAAAGGCGCGTGCT
-AGTTTTAAACTTCAAAAATTAAAAAAATATATATATATTCGTGAAAAAAT
-GTTCTTTTTAAAAGCTCTTTAAAAGTTTAAAAATGATTATTATACGTTTC
-TCAAAATTTTCAAAAATCAGGTCAAATGCACTTAGAATATTGGAAAATAT
-GAAGAAAAATCTTTATACATTCCTGAAAAAATACGCATGGTCCAAAAGTC
-GACAAATCGTGGCCCAATATTTTCTATTTTTTCAGAGAAATCTTCCGCAA
-AGGTCGAAATTTTTCGACGATTTCTACGATGTTCCGCTCACTGCGATCGC
-CAGAATTGAGGTGGCCATTGTGAAAGGTGAAAAATATTTTTACTTCAAAA
-AATTATTATATTAAATTTACACATACACATTCGTGAAAAAATTTTGCCGG
-TAAAAATAATGAAAAATATATACAGAAAAATACGGAAAATTTGGATGAAA
-AATATTTTTTGGTGACAATTAGAATATTACCCGCAAACAAAATTCAAATG
-AATTTTTTCAGTTTTTGAAAATCTAAACAAATTTCAAAATGTTATTATAG
-ATTCGTGAAAAATTAAAACTCAGTTTAAAGGCGCATTTCATATTCAAATG
-AGAATTATTAAACATCTTAAAGACATAAACAAAAAAAATGAAATCTGAAG
-AAGAAAAATTATACATTCGTGAAAGTTGGGAACAAAATTTTGTAATTTGA
-GTGCTTGACATCAGTTTAATAAAAAATTTTGAAACCAAGAATTTTCGAAA
-AAAAATCACGTATACCTAAAAACTTGTAGTTTTTTAAAGTTAGTAAACTA
-TTTTCTCTCAAAAATTCAAAAATATTCCAGGTAACAGTAAAGGAAAAGCG
-GACAAATTTCAACGCCTCGAGACAAGCCTATCAACAATGGAAACAGTATC
-AATAATTCGTCTAATATTAAAAGATGTCAGAGTTGTTACAATTGACTTGA
-GAAGATCTCAAAATGCAAATATATTGGCTAATCAAATACTCTACTTCTCG
-AAAAGTGGACCAATCGAAAAAATGACTCAAGTTGGAGCTGCTATGGAGGA
-GCGCGGTGTGAAGGCGAAAAGTAGGCATTGGATAATTAGTATTGGGGGTT
-GGGAGGGGAGGGAGGAAAGTTCGAGAAAATCGGAATATCTTATAAATATT
-AGGCCGTTTGATTAATAAATCGACACATCAAGTAAATAAATTTTGAAACA
-AATTAAAAATTTTAAACGTTTCGATTGATATATGTGTATCAATTTTTTAA
-AAGATGTATATTAGTAACAAACAAGAAATTTTTTATTCAATAAAAATATA
-CTACGGGAGCACTAAATTTTTAGAATGCGTATTGCACAACATATTGGACC
-AGATATCTCGTAGCGAAAACTACAGTAATTCTTTAAATGACTGGTGTCGA
-TTTACGGGCTCTTTTTTCATTTCTCCGTATTATTTTCTCTTTTTTGCTTA
-ATTTTAATATTCTATCTATAACTAAAAAATTAATTCATTTCGAAAATCTA
-GCCCGTAAATCGACACAAGCGCTACAGTAGTCATTTAAAGGATTACTGTA
-ATTTCGCTACGCGATACTTTGTGCGTCAAATATATTGTGCATTACGCATT
-TTCAGAATTTTGTATTCTCGTAAAATTTTCGAAAAAGTAAATCTTTTAAA
-AAACTTTTTATTAAATGAATAAAAACGCATTTTTTGGAGAATCGGATAAA
-AATAATTTATTTAAGTTTTGAAATTTTAATATTTTGAAAAAAAAACATTT
-TAATTGGAAAAAAATATGAAACTTTCTTTTGTAAATATGGTTTTTACAAA
-ATTCCCGAATGTCCAATATACAAACTTATCATTTTCCAGCAGCATTCAAT
-AGCTACGAAGCATGGCGTTCGGAACTCCAAAGGTGCCAGCAGAAGACGGA
-TTCAACGTCTGTCTGGAAAATTGTAGCACTTAACAAAGAAGGCTTCAACT
-ATGCGGCTCAGGGGTGCGATTTTTGGAAAAAAAAACTGGATTTCCGATTA
-AAAATATGTATAGTGTATGTATTTTTCAAATTTCCAGCTACCCTGTGTAC
-GTAGTAGTGAGCAACTTCTTGGATCGTGTGGACATTGAACGACAACTACA
-ACACTACAAACAAGGACGATTTCCGATTTGGGTGTGGTCTCGGGCGAACG
-GACACTCGGCGTTATTCGTTTCGGCGGATCACGAGAACAATATCGCGATG
-CCGGCGATTTTGGCGAAGTTAGTACATTATATTTTAAATTTGTAAAATGT
-TATTTTCTTCCAGAATGCAAGAAAGTATCACCCGTTGCCATCCGAATAAC
-GAGAAGCCGCATGTTATAAAATTGGACGTCGATTTTGTGTCGAATGTTGG
-AAAAGCTTTTGATAATCTTCTATCGCTTTGTGCAATTGGTGAGGGAGAGC
-ATTTCATATTTAAAAAAAAAATTATTCGCCGTATTTTCAGCTGTTTTATT
-TTCCATTATTTTCCATATAATATGCATTTTCCCAGACTCCTACGAGCAAT
-ACGTTACACTGCAAAACGGTTGGAATACGAAACTCTCGAGAACCGGATGG
-CTTCATCTCGTCAAGCTGTGCCTTCAGACTACCTATCAGACGATTCAATG
-GATTGTTGATAGAGATCGATCGGTTATTTTACAGGGTACTATCAATTTAG
-GTTTTATTCAGAGAGAGAGAGATAGCAATTTTCAAAATATTTACAAACGA
-GTTAGTCATTTACATCCACAATCGACTGATCAGAATCTGATTCGTGGCCG
-TTTTCCTCCGCCAGAACTTTAGGAACTTGCACCGAACTACTTGCTGCTTG
-ATCCTCCCCCTCCAGAGGATCTTCTCCAGATGGGATACAACTTTTGATGA
-AGCTGATCATCGGATCCTCCTCTCCATCATCCGAACTAGTTTGTCTGAGA
-AGAATATCAACCAGTGTCTGCATTAAATCACCGGGTTCCGTTCTTGCTCG
-TCGAGTACTCAAATTGTGTCGGCACATGAATTTGTCCAACCATCCGCGGG
-ATGCCTGAATGATAAAGGTGGAGTAGCGTCGAATAGTTATTTTTTATGTT
-TTTCATATACTCGTTTGCATTAAAGTAACGGCTCTCCTACCTTGAAATCC
-GAGTTCTGACTGATTTTCTTTGCCGTTTCACCGATGATTCTTCTGGTGAC
-TCGTTGTTTCTCCTTACGCTGATCGTGAACCCATTTAATCAATTCCTTAT
-CAACGTCGTCATACTTTAAAGGTCTTCCACCTCCCGAAAGTCGCTTTGTT
-GCAGTTGAGCCGTTGTCTTCTCTGAAAGTGTTATTTGCCAAAAGGCAGCA
-AGTCGAAAATTTTTCAAAAAGAAAATTTGAAATCGAACAGAGAATTTATG
-TTATGCCCGTATTTCAAAATATAGGAATAGTTGAAATGACTTCTTTTGAT
-AGGATTAATTATAAGCCTAGAAAAAATCATAGTATTTGGAATAAAAGGTC
-CATAAAAGGTTCTCAATTGATAGGGCTTGCATGTAGGCGTTAAACCCTGC
-CTTTAAGGCGACCTCCGCTTGCCTCTCGGTTACGCCTTACGTTGTGCTAA
-AACATAATCAATCTTTTTTTTTTTAATTTCTATTTTGATTTTCATCAAAT
-TGAGAGAAATGAGAAAATTAGAAATTTGTAAATTCACATAGGCGGGTTTC
-AAGCAGGACCCTGACACCGCGCATGCCTAACATGAAAGTCCTAGCCCTGG
-ACTATTTTTTTGAACACAAAAATATGTCCGAAGTGGCAAAACTTACAACT
-GCTTCTCGATTTCAGCTTTCTGGGCGATCCACTGTTGAATGTTTTGCCTA
-TTCACATTCAAATCCTTTGCTGCTTTCGATATATTCTTATGTTCAAGGGC
-ATAATTTATGGCATGCAGTTTGAACTTCAAGTCATACGTTCTTTTTCGAG
-TTTTTACAGGCACTTCTGTAGGGATTTCGCTCATTGGTTTTCTCTGAAAA
-ATAAGTATATAACAAGCAAAGTCTTAACTAGTCAGCAAGTTATTGGAAAT
-AAAACATGTGAGAAAAGCGAACGAAGGGGCAAGACTAATGGAGACAGCAA
-ATTGGCACACACGCAGAGAGACATGGCTAATAGAGTGTGCAAGACTATTA
-GAGGGTAGAGGCAGTGAGACGAATTTCCGACTGGTCAGAATGTAAAGGGG
-GTGCAAGGCTAATAGGAGGAGACAAGACAAATAGAAAAACTACATTATTA
-TATGAAAAGAGAGTAAGACTGAATACGTGTATGGGCACCCCACATATTTG
-TATGTAAGTAGTTATGTAAATGACTTTTTGGAATTGAAAAGAAAATACCA
-AGAAATGGAAAAAACCTCCGGTCAATCGTAAAAAAATTATGAAAGAAGTT
-CGATCTACTCGGCTACGATTTACAGTTTCCCTTACTGATTTCTACTAAAA
-TGCATTAATCTTGAGTTTATCTCTAACAAATTGATGGTACTTTTGAATGG
-TTATAACACCGGATATTTTGCAGAAGACGAAGGATCAGATATGTCGATTA
-TTGTGGCCAGCCTCACGCAAATGTGCTGTGATCCATTTTACAGAACAACT
-ACGGGTGAGTTTATTAAATGTTTTTTCTGTACTAAAAATGGGGTTTAAAA
-AACTAATTTTAATTTAGTTCTCTCCTTGTATTAATTTCCAAAATTTTCCG
-AAATTTTTTTTTCAATTTAAAAATCAATTTCAGGTCTTCAACAACTCATC
-GAAAAAATGTGGATTGCCCTTGGCCACCCATTTGGTGAACGGCTACTCGG
-AAGAACCGACGATGATCCATCGAGACGTGGAAAACCACAGAATAAAATGA
-GAACTGACGTCATGCCGACGTGGTTGCTCTTCTTGGATTGTGTTTCACAG
-CTACATCGAATATATACATTTGAGTAGGTTTGGTAAAAAAAATGTTTTCC
-CCCGCAAAAAAATGTTTTCCTCAAAAAATTTGAATTTCCCACCCAAAATT
-TTTCTCAAAAATTTTTTTAAAAATTAATTTTAAAATTGTTTTCTCAAAAA
-ATTTGAATCTCCCGGATTTAAAAATTCCAAAAATTCGTCTATCAATAAAT
-TTTATATTGTTTTCGAATTTCGAATCATAAAAATTAGTTTCAAGTTAACA
-CACCTTTTTTTTCAAATAATTTTTTTAAAAAATAATTTTAAAAACAATTA
-ATTTTTTTCCTATTTCCAGATTCACATTCTCTCCACACGTTCTCATTGCA
-CTATGGGATCTTTCATTAACTGGAATGGTTCCATCAATGGCTTGTAATAA
-TCTGGAAGAGCAATTACTCGCAAAAGTCGGCGGTGGACCATTCCCATTGG
-ATCGATATTTTGAGAAAAGCTACTCGAAATTATTTGGAAATATTTGGCAC
-GACGCAGTGCTTTTTATGGAATCTATTAAGAAAAGTTGGTGCTTTTTAAG
-AAAAAAATTTTATATCGATTGTTCTTTTCTTTTTGATTTCAGCTACTTTT
-TCACCTCGGTCAGCAACATTTTTTTGCAACATTTTGGACGTGGCCGCGAA
-AAAAAAATTGGTGGCCGAGTTTTCTTTTTTTTCACTGCCATTAATTTCCG
-AGAGGAAAATCTAGGAATTAAAATTTTTTCGAAAGTATACAATGTTGACC
-GAGAAAAAATCGGTGGCCGAATTTTCTCTTTCTTCTCTGCCACGTTATTT
-TAGTAAAAAATTAGAAAAAAAAACACAAAATGTTGTTCAAATTTTGGAAA
-AAGTCTGTAAAAACAACAAAAAATTGATGGCCGAGTTTTTTTTCCATTTT
-CGCGGCCACGTGACAAGCAGTGATTTCTCAAATGTTTTCAGGAAAAAAAA
-ACAGGCGGAATTCAGATAATTCTACGAAAACTATTTTTGTTTCTGGAAAA
-AAGTCAAAACTTGAAAATCGGTGGTCGAGTGTTCTCTTTTTTTGCGGCCT
-TATCTCGATTTTTCCAGATCAACCAGTGTGTGCTCACTCGAAATTCCTTC
-AATGTGAATTTATTCGGCCACCGACGTCGTTTTGCGATATTCAACTGTGG
-TCCGAGTGCTATCTTCGATGGATTCCTCCGGCAAACGGGAAAAATTCGGG
-AAAACTCGGCGAAGAACTCTCGCTGGACGAGAAAATGATCGAAATGGCCA
-AAAAATGGAACAGTTCCGAGTGGAAAATGCATTTGGACCTACCGGAAGAG
-GTGACCAAACTTTTCGGATTTATAGGCTCTAAACATATTTTTACTTTCAA
-TTCTTAAATTTTTAGTATTCATCTGCATATCCTTACTCGATTCCGGAGAT
-TTCCCGCCCAATAATGGATTTAAATGATTTTGATATGATCCGGCCGGATG
-ATTTCGACGCAATGTCCATGAATTCATCCATCAACTCATATTCGTTCGTT
-AATACGGTAGGGATACTTATTAGCTCGGAAAATAAATTACGACATATTTT
-GTCTCGAATTTTTTATAGGTGACTTATAATAGACATTTAGTGTCTAGGCA
-CACATAAAAGTTAGATCTTTTTCAGCTATCGTTTCGATACTTTCACACAA
-AAGTAGGTTTTTTTTCGCAACTTTGTAAATTGAAAAATCAATAGGTCGGC
-AAATAATTGTTGGCGTATTTTGTCAATTCACGATATTTATCAAAAATTTT
-ATATGTGACTTCTGGTAGAAATTTATTATGGTTGGCAATAAGTACTGAGT
-CAAAATTCATATAACTTGTTTTGTTGCTTATCGATTTTTTTTAATTGCCG
-GAGTTCATGTTATTAACTATGGGCTTTCATCTGAAAGTAGTCACAAAACA
-TTTTAAAAACTCGAAGTGATCCAAGTCGAAACAACTTTTTCAAGGTTTAC
-GCCCTCTTATTTTTTCTCTTATTTTCAGCATTGATATGAGTTTATGTACG
-GATCAAGAGTGTCGGTTTTTCGATTTTTGTATAAAATCGAAATTTTTTTT
-TTGATTTTTCGATTTTCCCTGAAAAACACACAATTGAAAAATGTCACTCT
-TGGTACGGATATTGCTAAATCTATTATACAATGTGAGAATCCAATAAAAG
-TTTTATATTTTATTTTTGCAGCCAGTTCGTAACAACACGACAACAGAATC
-AATATTCGATCATTCGACACTTGAGAAACGAAATCGTCGAGCAGCTGCCA
-CAATTGGCTCCGAATCGCCAGTTATTCAAATGAGACCAAAAGAGCAAATT
-GTCGGATATTCGAAATATGCATTTGATGATTCATTATCACCAAGACCACA
-TTCCCGAACTGTTGAGACGCCTATTTTAAAGAATGTACGGGATTTTTGGA
-AAATTTAAAATTTGGAAAATGAAAAATTCAAACAAAACAATTTTTTCGCT
-TTCAAATTTCATAAAAATTTATGTTAAAAATAGTTTTTAATTGAATTTTT
-AAAAAATTCTTACTGAAAACTTTCGAAATAATTAAAAAAAAAAACCAAAC
-TATATTTGTTTTTTTATTATTGAAAAAGTTAAAAAAAATGTTTTTTTTTG
-ATAATTTTACACTGCTCGCCTTCAAAATTTGATGAAAATCTTAATACTAG
-ATTTTTTTAATTTTTCATTTAAGACTTTTCGAAAAATTCGAAAGTTCAAA
-AAAAAAAATCCAAAAAAAATTTCACTCAAATCAATCGCCTTCAAAATTTG
-ATAAAAACTCGATGAAAATTTTGTGGAATTAAAATGTTTAATTTATCATT
-CTGAGGCACCACGTTTTCAAGATCTGGTGGGATTCCGGATCTACATTCTT
-CATTTCAGCGCAAAATCCCTAAATCCGGAATTCCACCGAATCTTGAAACC
-GTGGTGCCTCATCATTCTACCTTTAAAAACTCGAAATTATAAAAAATTCT
-GCAAAACTCTAAAAAAATTTGATTTTCGATTTTCGAAAATTTATCTTTTT
-TTGTATTTAACATTCAATAAAATATTGATGAAAAAATTTCTAGAATCATA
-TTTTTAAATTTTGCTTTACAAAATTTTTTAAAAATCTACAATCGTTCACT
-TTCTTGCCTTCAAAATTTGAATGAAGAAAAAATTTCAAAAACTTTAAGAA
-TTAAATTTAAAATGTGCTCAAAAAATTCTTTAAAAATATGCGTTTCCCTA
-ATAATTTCCATGTTTCAGTCCCCATCGCCCTCCTACACCCCATTTCACCC
-GACGCCCGTTCACCGGAGCAACACCGTCCGTGCCGACAATCGCCCAATTC
-CCCCGCCCCGGCCGCAGGGCCTAGGAACACTGACCCCATCACGCCCCGAG
-ATAAGAGCTCATCGAGATGATATAGAGAGCCCTACTATTCGGGTCACAAG
-ATTTTGAAGAAAAAGTTATACTTTTATTTTAATTTCCGCTCAAAATCGGA
-ATTTTCTATAAATATGCCCCTTTAAATTGAGCTACAGTAGTCACGTCGAA
-AAATTTTCAATTTTTTTGAATTTTTTGAATTTTTTCATCCAGTTATAAAA
-AAAAGCTTGCCCCTCAGCTCTACCCCATTTTTCTTTCATTTGTCACCTAC
-TTCCTTCATATATGCCCGGTTAATTATGTATTTTTTGATGCTTTTTTAGT
-CCCGCCACGGTTTTTTTCATTTCGAAAAGTCGATCGATTATCGATTTTTT
-CGAAAATTTGGAAAATTTGGAGAAAATCTAAATATTATCGATTTTAAGCT
-AAAATTTTAAGATTTTATTTTTTCAAATAAAATTTTGGAAATGTTTTTTT
-GAAAAAAAAAGTGCAAAAAACACTCAAGGGAAAATTTTTAAAAAATTGGA
-AAAAATCTTGAAAGTTTGTCGATTTTTCAGTGTGCATTTTGGAGTTATCG
-GTTTTCTTTCCGAATTTTCATCAAATTTATTTTTGATCTACCAAAAAATC
-TCTAAAACCCCGTGGCGGGAACCTACTTCACTTTTATTCTGCATAATTAG
-ACAAAAATGTGATTATTTTCTCATTTCAAAACTTGTTACATATTTTGTGT
-TGTGATACATATGTCTAAATTTTTACGGACTGAAAAAATACTTTTTTCTT
-AATGTTTTTGAAATTTTCATTATTGGTGGCGTCATCCATGTCTATTTGAT
-TTTCCAGACCCCCCCCCCCCCCTCTAAAATGAAAAGAACAAGACGATTGA
-CAGCTAGCATGTGCGACGATCAAAGTACCGATTTGATTCAGTTGAAGGGA
-CACGAGAACGCGAAAAAGTCGGAAGCCCATCTGAAAGTGCTGGAATACAT
-TGGCAAACGCTATGAAATTCGAATGACCGACGGGCGGTACATACGTGGCA
-CGATGATCGCCACTGACAAGGACGCTAATATGGTTTTCAACAAGGTAAAA
-ATTTGATGAAAATTTGGTCCAAAAGCTCATAGTTTCAAATATTTTTCCTT
-AAAATTATGCGCCGCAGGCAAAACAACATTCCGCCTTTTTCTATTGCTGG
-CTTAGTTTTCGCAATTTTCTCGGCTACCAGGCTACTGCAAAAATGATCGA
-TCCGTGAATTGTGCAAACATCTGAGTTACACAGAGAGTGGGGCGGAGCGG
-AACATCGCAACACTGCCGCATGGTTTTTCCACAACTTTTTTTTTCAAGAA
-AGTTTCGATTGTACTTGTTTTTTCTCTTTTTTGTATAAAAATGGTATTCA
-TTCTAAATAATTCACATATGCTAAATTGCATATAAAAACATGGAATATCC
-TCTCAAATTAAGAGTCTTAATCTTATTAGAATTAAATTGGATATCATTTT
-CATTCGAAAAGAAAGAGAAAGAAACAAGTAAAATCGAAACTTTTTTGAAA
-AAAATGCTTGATTTTATTTCATTTTCGTTGTTTTTTTTTCAGTATTTAAC
-TTTTGAACGATCGATTATTTATAAGGTTTGCGGTTAAAAACGATGAATTT
-CGTGTTTTTCTTTTCTGGATTCAAATGACAAGTTTTAACCAATTCGAATG
-TCAAACACGGAAAAATAAGCGAAAATAACAAAAAATCGTGTATTGTAACC
-AAAAAGTTCTCCACGAGTAGTACACTAGAGCCGACGCGCCGCAGGTTTGC
-AAAACAACGCCCACCCCGTTTTCTGCGCGGCACTACACAATTTTCTATCT
-CACGAATAAATATTTCAGAAAAGGCAGGATTTTGTCTGAAAATCATGAAA
-AATCAAGTTTTTTTCAGGTTTCCAACGCTGAAATGGTTGGAATTAGGGTT
-TGTTACCAAAAATCGTATAATATTAAAATCCCAGTGCTTCTCTGTCTTTC
-AGCAATTTCTTTTAATTTCCAGGCAGACGAGCGATGGGACAAAGATCCAC
-AATTGAAAGGAGTCCGATTTCTAGGGCAAGCGATGATCTCGAAAAAGCAC
-GTGGAATCGATGCACGCGTTGCCGGACCCTAAAGAAACTGAAATTTGATC
-CAGTTTTCTTATTTTCTCTAATTTATCCCATCCTTTTCTTGTCAAGATTA
-ATATAAATTAATTTTTATCGAAGCGATTTTTGTTCATCTCATCCAAATAT
-GAAAAAACATTCGAAAAAAAATCGCAGGCTTCACTTGGAACCGCGCGCCA
-TCAGTTGAAAATGCTGAATATGTACAAAGACTGGAAAATATTAAATTTTT
-ATGTTTAAAATTTCACGTTTTTCGTGTTTTCCACAAAAAAGCAATGCATT
-GTCGTTTTTCAAAAAACACTCATGGTAAACGAAGTCCCCGTGGAGTACAC
-GACAATGTCGCATCGAGACCCAAACTGGGAAACGCCTGCGCCTTTAATTT
-TAGGAGTTTAATTTTCGAATTTCGAGTTATTTTTTTCTCAAGTCTTTTTG
-CGACTTTTTTTTGAATATTTTATTACTTGTAGCGCTGAAATATGACAGTT
-ATTATAGCGTCACACTGGGGACCTCAATCAAAACAGGTATTTTTCAAAAT
-TTCGCCGTAAAATCTAATAACCAATTTTGAGATGTTGCCACCCGAGCCCC
-CACGGATAATTCTGAGAGAAGTTCCGGTCCAGAATAACCAGAAAGAGCAT
-CCACCGGTTCAGGAGATCAAAACCGTGTCCAGCAAGTCGAAGGAACATCG
-CGTCAGTTCGAGCCGGAAAATTCCGGATCACTTCGACGTGGGCCCACGGT
-TCTACATGAATGTCCCCGCAGATGGCTCAGAAGTGTTCGAGGACGACGAA
-AAAGACGTCGAGAACGAGTGTTGGGCGGTGATCGAAAGAATAGGAAGCGA
-GGATGACAAGTTCGAGGCCTCTGAGCTTGTCGAGTACCGCGATCACGATT
-GGTACATCGCTTTGGCGATTAATAAGGAGAAAACGCCGGATAAGGCGAAT
-TATCAAGTAGGAATTACGAAAAAAATTTTGATTTTCAATCTCATTTTTTA
-AATTTCAGCACCTACTCTACAGCTATCGAGGCGGAATCCAACGCATAATT
-CTCACGCCTCAACAGACGGATTCGATCGACAAAACGCCGCTAGTGAAGTA
-CAAAATCATCGGAGACGGTCTGTACGAAGTGCTTCCGATTCACTCGTCCC
-TTCCTCAAACTGGTCTAATCAGTCCCAAATATCGTTACAACAAAGGCGTC
-GAGCTTCGGATTTTCGGGATAGTGAATTGGATTGATTTTGTGTTGGACGA
-CGATCATCAGACGCACAGGACGATGGTTTGGACAGATGCGGTCGGACCGA
-TCTATCTGAGTGCCGCGGATCGAGCCAATATTCGACGGAAGCTGCTGCTG
-ACCGAGATGCAGATTTTCGCGCCGTTGCGAATGTGCCATATTACTGTCAA
-GGCGGAATTTAACTTGTTAGTTAAAAAAAACGCGTAAAAAGAATAATAGT
-TCCAAATTTTCAGCTCGATTCCCGATGGTTCCCCGATTCAATGGACCATA
-TCATCGTTCCAGCCACTCATCGAAGAATCAGAGAAGGATCCGAATATTGG
-GCGCAATTTATGGCCAGCGAGAGTGCTCAGATTCGATGATTTAGTCGTTA
-CAAAGAAGGTGCTTAATCATTTTAATATTAAATTTTAACAGCATTTATAA
-TTATTTATCTATTTCCAGACACCGAACGGCTACTGGCTGAAGTCTCAAAG
-ATTGGAGGGTCACGTTAATGTGTTCGCCGGTGCAAATCAAATCGGAATCA
-TTGAGTCGGCGGGTGAAAAATACGCGACGAAGGGAAGCATGATGGCGTTC
-GTGGTTCCGTGCTATCAGAACAGCACGTTTGCATATTTCGAAGCACTTAT
-CGCCGGACCCCCGCGAGTCGTGATGATTATTACCGAAGGACGCTTTCTGA
-ATTATTGCCCGAAGACGTGGCCACCGTCTGTTCGGAAAATGCGTGATCAG
-TATCAGAAAGAGCACGTTGTAAGCACAATTTTCCAGAGAAAAAGGCTTTC
-GATAAATTTTCTTATTTTCAGCTGAAATCCGAAGTCCGAAGTTCACCAAT
-CTGCATGAAACAGCCGGATTATTGCCTCAAATCACTACGAGGATTCAGCG
-AGTGCCCATTTTGATCACTCAAAGTTTTATATATTTCTGTATTTCTTCTG
-CCTTATTTTAAAAAGTATTTTCCCGTTTTTTTTCTTTTGTTCAATTTTCC
-CTTTTTCTTTACTTGTTATGTCCTATGTTTCATGCTAAATTAACGTATAT
-TTTTAATTAGCAATTAAAAAACTTTCTGATTAACTGCCAGTTTTTGAGAA
-GAACCAGAAGATGGAACGCAGGCGAGTTTCTGAAACGGAAAGGGTTTGAA
-ATTTTTATCAATCAAACAAACTCGCAATTTTATCAAAAACCATGCCGTCG
-TTGCAAGTTTGAAAAAACCACATATATTTGCAACATTGATAGAATATCAT
-TGGATCGTATGGATCCGCCATGGCCAGACCATCATATTGACATGTACCGT
-TTAATGGGTTCGGTACCGCTGAAAAGTTGTTGGTCTCGCAGCGAAGTACT
-ACAGTAATCGGGAAAAAGCGCTGTTTATTATCGATTTTTCAATTAAAAAT
-CAATAAACTCGCCGCGAGATCCAAACCTCAACTTACGATAGCTTTTTGTA
-GGAGTCGATTGTCCATCGACAAGGAAGCCAGCAACTAGGAAAATTTTGAT
-AGGGAGAAGCATTGAAATTTAATTGTTTTTGGGGGTTTCGTTTGGTTTTT
-ATAGGAATTTTTGAGCTGTAAGAAAACAAAGCAACATTTATTTCAATTAA
-AACCGGAAAATATGAGTCATTATGGGGGGTTTTCAACCGTACGGAATTTG
-ACAAATTTGAAACTACCATAAAATGGTTAGTTTTGTAGTTAGAGAACTCA
-AAATTGATTTTCTAAGACAAAAAAATTGCCCTTTTTCAGAATATAGTAGG
-TTTGTATAATTTCCAAAAAATTATTTTTCTTGCCCAAAAAAAAAAGGACA
-GTCATTAGATGGCTGAAAAAAAAGTGGGCAAAAATAAAAAGTGTCTAATT
-TTGTTGAAAACGGGTAATTAATATATGCAGAATTCAGAAAATCTAGGTTT
-AACCCATCAAAAACCATTAAAAAGTGGCAAAATTTGGCAATTTTTGCAAA
-AACTCACAATTTTGAAACTCCTCTAAATTGGTTCAATTTGTAGCTAGAGA
-ACTTAAAATTGGTCTCCAAGCCCTAAAAAATTGTCCTTTTTCAAAATATA
-ATAGTTTTAAACGTTTTTAGAAAATTTATTTTTCTTGCCCAAAAAAAAGG
-ACAGTCATTAGATGGCTGAAAAAAATTGGGCAAAAATAAAAACTTGTCTA
-ATTTTGTTGAAAACGGGTAATTCATATATGCAGAATTCAGAAAATCTAGG
-TTTAACCCATCAAAAACCATTAAAAATCTAAAATGATTAATTTTCTAGTT
-AAAGGATTCAAAATTGATCTTCGAACACTAAAAAGTTGTCAAGTATCCAA
-AAAAAGTGGTTCAATTTAAAAAAAATTGGTCAGGGAAAATTATCGATTTT
-TTCGCCGCTTCGCAACTTGGACGAATTTTTCTTTCGCTGCACAAAAATCA
-ATAATTATTGATTTTTTTTCTAAAACAGAAAAATAGATATTTGCACTTTT
-CTGAAAAATCGATATTAAACGGAAATTCGCAAAAATCGATGGTCACTAAT
-TTTTTTGCAAAACCCCAGTAAAAAATCGCTTTTTTCGCCGCATTTCCTAA
-CTTTTTCTATGCCACCACTATTGATTTTTTTTCCAGAAATCTTGGAGCTT
-CCCAAACCCGCTCATCAGCCCGCGTGCTTCATCAATCATTCCGTTGAGAA
-CTATGAATTTTTCGAATGAAAATTAAAAAGAGGGGGATTTATTAGACTGA
-AAAAGTGTTTTTGTGCCACGTGGCGGCGGCCGAATTCTCCTGGACGGGAA
-TTTCTAGGCCATGCTTGGGGGAGATGAGGAGATGGGGGTCAACTTCAAAT
-GTGTGTAACAAAATAGAAAAAAAACTATAAAAGGTAAGAGGAGATCAAAG
-GTCACGCCACTAGGGCTTGAAAAATGAATGCCTGCCTACAAATAGACATG
-TAGGAATGTAGGCAGGCAGACAAAAAGTGGGTGAACAACGAGAAAAGGCA
-CGTAAAAAGGGGTAAAGGTTAGAGAAAAAGAAAAAAAAAGCTCACAGAGC
-ACATTAAAAATGGAAAAAAACGAGATCATTGGATATTCTGCTGCCGTTGA
-TCATCGTCATCATGAATGATCAGCTGATTGGGGTCGACTATCACATCATC
-TGGGTTCACGAGAGCATCTTCTTCGAGCAGCTCATGCGGAGGATGATCGT
-CGTGATGATTTGGCTCTTCCACAACCACTTGTTCGAGGACATCTGGAATT
-TATAGAATTAAAAAATACATTTTTTAGACAAGAAATCGACAAATTTCTGT
-GTTTATTTCTATTTTTCAGATAATTCCACACAATTAGATAGTTATTGAGT
-TTTCTTTCTATAAATTTCAAAAAAAAAAACGATAATTATTGATTTTTTTT
-TAAATCAAAAACTTCACAAAACTCAATAATTATATATTTTTCGTCCTCAT
-TCTCTTTCGGTTTTGTGTGTGTGTGAGTTTTTTTGAAAAACGCAAAATTT
-TCTGTGATATTTCTATTTTTTAACCTGACATGGGCAGTTTTTGAAAAAAT
-TTTGCAATATTTTCGGTGTTCTTTCTCAGAAAAACTCGAAAAATTGCAAA
-ATAAATGTAAAATTTATCAAAAATTACACATTTTCGGTCAACCTTTTGCT
-CAGAGAAACTAGAAAAAAAATTTCAATTTTTTTGGAAACCTGCCAAAAAA
-TGAAGTTTCAGTGAAACATTTTTTTTATCTTTTTTCGAAAATTTAATACA
-TTTTTTTGCAATTTTTTAATATCAATCCGTTCTCACATTTTTTGGTAAAA
-ATATGAGGAAAATGAATACATTTTGGATTTTTTCAGAAAATCTGTTTACC
-ATTAATCTGCTTCTCCCCAGTATAAACTTTAGGCTCATTCTCGTGCACTT
-CTTCTTCCAAATTAACATCATCACCAACTGTCCCAATAACTTCTTCCTCG
-ACAATTTCCTCAACAATTGCTCCATCAGGAGCCATATGCAAATGCATTTC
-TCCATTATCCATTTCTTCTCCAGCCATTATTTCGACTCCAAACGTGTGAT
-TCACTATTTGCAAGAGACGATGTTCGCTTTTTTCGAAGAGCATTTTGAAG
-AGCAAATCGAATGTCTCGTTGTCGGTTGCTGAGCCAAATGAGTTCTTGGC
-AATACGGAAGAGAGCCTCGTTTCGACTTGTTCCACGCGCCATTCCAGATT
-GTGATAGAGGCTGGAAATATTACTATTTCAGATTTTTAGATTAAATGTGG
-AGCTGGGAAATTCGAGTTTTCGACGAAAAAATAGCCTTTCAAAAGATTAT
-TTTCAGATATGTTTAAAAAAATTCCGTTGAAAACGACGAAATTAGATAAA
-AATTGGATTTTCAGCACATACACGGGCGTTTGATTACGTGGCCGTGAAAA
-CGGAGAAACTCGGCCACGTAGAAACAAAACCGAAAATTGCAGAAAATCCA
-GGAATTTTTTTTAATGACTCCGAAATTTCCCCGATTCCGAATAATATATA
-TGAATGAATATATACTTCTGAAAAATTTCAAAACCTTTGCTCACCAAGCC
-ACTACTCTGCTGCCCAAAATTTTTAGGCTCCTGATATTTCGCCTTTCTAT
-ACGGCAGCTGAATCTGTTGCTGGGATGATGATGGTTGCTGAATCTCTTCG
-GTATGTGAAACCTGAAGCTCTCGCTCGTCGAGCATCTCCTCAAGATGCAC
-ATTTTTCTTTCTGGATCCTCCTTCTGAAGCTTCTGCTGAAGCTCCAGCCG
-TGTCAGTCGTCCAATCATCCACAAAATCACCCGCCGCCGCCGAAACAATC
-ATCTCATTCTTCAACTCGTACGGATCATGATCATCTTCAGCATCCCGAAT
-ACCATCAGTCGCCGCCATAATCTCACGACGTCGTACATAATAGAGCATCT
-TCGTGTTCACCTGAATCCCATACTTCTCCAAAATCACTTTAGCCACCTCG
-GCAGGTGTCATTCTCGCGAGCAGCCGGAGCACATCCTCCCGAATGTGTGG
-TGGAAGACGTTGAAGTGAGTATTCTTGAGCGGAGCTCATCGTGCTCACGT
-TAACCGGAGCCGGCATCTCGCCGGGCTCAGTGTACCAGTAAATGATCATT
-GCGTTGCCGATTTGATGGCCATTCTTCAACACGTACGTCACCTTCTTGCG
-AAGACGTGGACAACGTGGAAGGGTGGCTGTGTAGACGTGAAGCTGGAATT
-CGATGAGATCCGAACGATGGGATGATGGTGTCTTCCAGATGCGTAGTTGA
-CCTTCTCGATTCAGTGCGAGCGCTTGTTTCGCAGATTTTGGACGTTTTGT
-GATGCCGTCTGAAAAACAGAAAAAAAATTAAGTTTGGAGCATCTTGAATT
-TGCCTTTTTTACTTTCGGAACGTCCCACTTTTGCTGATTTTTCGTGTTTT
-TTTTTCTGGAATTTTGGAATTACAGGGAATATCTCTCCAAACCAATTACA
-GGGAATATCTCTCCAAACTGGCCGTCGCAGGAAGACTTCACTTTTAAATT
-GTTTTACCTGTAGGCACAAAAGCAAAAGAGGAGAGCCTACATCTTTGTAT
-CTTCGATAAATTCGTTAAAAGTTCTTTTGTCTTTATTCATTTTTCAAATT
-ATTTTCCAATGTTTTAAAAACATTTTTTCTAAACTTTACAGTAATTTGGG
-CTATTTTCACTATTTTTCAACTTTTTGACGCGTTTTTAATTCTTCATTTC
-AACCTCATTTTGTCCAAACTTTCTCAAATTTCCACATAATATGGCCGATT
-TTCATGAAATTTTCATAATTTACACCAATATATTCAATTTTTAACCTCAT
-TTTTTTCACAGAAATTCCCAACATTTTCACATATTTTTCATGACAAATTT
-GAATTATTTCAATGTTTTCCAAACTTACGAGGATTGGTGCTAGTATTCTC
-TGACCACGGAACCAGTCCATCACACGTCAAATTTCTTGCATCAACCTCGA
-GCCCATCAATAAAGAAAACGAATGCGGCTTTGCCAGTTGTGGCTGGCGGA
-AGGGCCGGTACTCGATTGTTGAGGCATCCGAGGGACTCACTGCAAAAAAA
-TCATCGTTTTTTCTAGAAATGGATCGATGTTTGTGTAACTTTATCGATTT
-GCTAGAATATTATCGATTATTCCGAAAAAAAATTTTAAAACAACAACTGT
-ATTTCTATTTTTATTTTTTTAAAGATAGACTTCCAGATCATATTTTTTTT
-GAAAATTTATTTAAAAAATTATCGATTTCTCTAGGAAAAATATCGGCTAT
-TCTCGAAACTTGTGGATTTCCCTAGAGATTTATCGATTTCTGAAAAAATT
-ATCGAATTTTCTAGAAATTTTGCAAATTTTTTCATAAAATTATCGATTTT
-TCTGAAATATATCGACTTTTCGCCCAAAAAGTACGTACATCAATGAAGGC
-TTATTGACAAGAAAGTGTAATTGTCGATTCCTATCATTCCAGAACTCCAT
-ATCCAACAGCTGAAGATACAAACTACCATCATCGGCGGCTTGTGCTGGCA
-CAGCAAACGGGCATTCTTTCTCGCATTCCGACATATCCGACACATCATTA
-TCGATATCATGTATCTGCGTTGGCTGGAAAAATGGATCCTACACGCGTTG
-AGCACACACTTTGTGAGCTCTGCGAGAGCTCAATGAGAACCTACCGGTCG
-TTTTGTGGCTCGTTTCGCGAATCGTTTCAAATATCCGCCATGCATTCGTG
-GTAGCTCGCCTTCCTGATTATAGTCGTACATGATGAGCGCATGGCTCACC
-ACGAGCCGTGATTCGGTTTCCATCATGTAATAGATTTTTTTGCGTAGTCG
-TGGCTCGCGTGGATTGATGGAATACAGGAATACCAAGTGGAATGGGCACG
-TTTTGTAGTCCATGTTGTCTTTGGTCTGTGAGGGGTTTTGGATATTATTA
-CGGGAGGCATAAAATTCTGAGAATGCGTATTGCACAGCATATAGACCAGA
-TCCGTAAATCAACACAAGCCCTACAGTAGTTATTTAATAAATTACTGTAG
-TTTTTGCTGCGAGATATTTTGCGCGTCAAATGTGTTGCGAAATACGAATT
-CTCAGAATTTTTTGTTCCTAAGAACAGCTCGTCAATTTTTTTTTCAGTTT
-TTCAGGGTTATTCAAAAAAAACCTGTTTTTAAAGCTTCTAGGTCTCATAT
-TTAAAAAGTTTTGAGAATTTAATACATTTTTTTTAATAGAAATTTGGCAA
-TTTTTTCATCACCTCATCGTCGATTATTCTTTTTGAAAAATTTTCGATTT
-TTATGGGAATATATTTATTTTCCAAGAAGATTAACTTTTTTTCAAGAAAT
-CTGAAAATTTATCAATTTTTCAAAAGAAATTAATGAATTTTATCAAAAAA
-AGAATAACTTTTCCAGAAAATATTTTTTTTTCTTAAAAATTAAAAAAAAA
-TTGTTAAATCGCTTTTTGTGTCAATTTTTCAAAAAAAAAAAAGAGGCATC
-GAGAATATCCCATTTTTTTCGAAAAAAATTTTTTGGTTATTTTTCTTTTT
-TTAGATAAAATGTATATACTTTTTTAAAAATGTTTTTTCACCAACAAATT
-TTGATATTAAAAAGTTGGAATTTTATGACTAAATTATGGAAAACTTTTTC
-GATTTTTAGAAAATCGGAAAATTTTGAAAGTGGGCGTCGTCAAAAAATTT
-AATTTTTTAAGAAATTATAGAAAATATGCTGATTTTGGTATTTTTGGAGA
-GCGTCGATTTCCATCGGATTTTTTTGGTTGTTTTCCCTGGGATCCATGTA
-ACACCTGAAACTGTGATCCCAGCTCATCACAAATCACTCCGACTTTGCGA
-ACTTTCGTCCGATAGCACGTCGGATTCTGTGCATTTCCATTATGAGACCA
-TGGCGAGAAGTCGTCACGATTGATGTCGTGTGGAAAGATGGCTGTCCCGG
-CGACGAAGAATGCGTACGCACGAGAATTACGAACAATTGGTGGGTGTCCC
-GGCTTCGCGTAGTTCAGCAGACCACGTTCTTCGCTGGAAAAATGATGATT
-ATATCGAAACATTCGAGGAAAATGGATAGAAAAAACGAAAAATTCAATTT
-TTATCAAAGTTCGTTTATGTTGATGAAAACATTATTACGGGAACACAAAA
-TTCTGAGAATGCGTATTGTGCAAAGTATCTCGTAGCGAAAACTACAGTTA
-TTCTTCAAATGACTACTGTACCTATTGTGTCGATTTACGGAAATAATTTA
-TAAATCGATAAAACAGTAGTTATTTTTAGAATTACTGTAGTCCTCGCCAC
-GAGATATTTTGCGCGTCAAATATGATGCACAATACGCATTCTCCAAATTT
-TGTGTTCCGTAATAAAAAATAAAGTTGTTAGATGAATATTCAGGGTCTCA
-ACAAAATTTAATCTGTGTTTTCAGTTTTCATGTTTTTAGAGTGGAAAACG
-TTTTTTTTTCAGAAAACAGTCAGAAATGTAGATTTTGTTCCATATTTCAA
-AAAATCATTTAAAAAATATAGAACATTTTTTTGAAAAATCAAATTTCTCC
-AGAGTGTAGTACGCCATTAAAGGTCTCGTCACGATTTTGTTTGTTTTCAA
-TTTTTAAGTTTTTGAAGTAGAAAATTATTTTTTTTAGGAAAATTTTTCGT
-CGATTTCGTTGAAAATTCGCTAATAAACGGGGATTAAAAAAAACGAAATT
-TTCCAATTTTTCGAAAAAAAAAATCGAAAAATTCCTCCCAAACTTACACA
-ACATTGGTATTAGCAATCCACTCCAACACGGCCTCAAACGTGCTGGCGAC
-CCTCTTATGTCGAACAGTCAAGTAGATATGTCCCGTTTCCAATTGCCGGG
-GATTCTCAAAATAGGGCGCCGGGTTCTCCTGCTGAGTAAGCGGATCATCG
-TCAAACTCCAAATCGTAGCCATTGTTGAGCACATCCTCTTGAGACATATC
-CAACAAATCATCGTCTAGCAGATGTCCCTGAGCGTCTTGAGCAATCGAAA
-CATCTTGCATTAGCTGATGTTGCTGCTGCTGGTGCTGATCGTGTTGAAGC
-TGGATCTGATCTAGGGAATCATTGTGATGTCCGATGACTTCTTCTTCCAC
-AACTTCCAAATCTTCTACATCTATAAATTGTTCTTCATCATTCGGTGCAG
-CAGATGATGTAGATGGATCTTGTGATGTATCAATCTTCTTCTGATCGTCG
-ATCCATTTCGATCCTCCAACACCTCGTCCAGGTGTTCCAGGTGGTTTAAC
-ATACGGACACGGAACCGGACCATCTCTCACATATTCATAGATATAACACA
-CATTTCCGATCGTAATCGTATTGTTGCGTTGAATATAAATGAGACGCTTC
-CGAAGACGGGGACATCTCGCCAGGACGGACATTGTTTCGACGAGACACAA
-CTGTGACGAGTGCCAGCCGCCAGCCGTGTCTTTTGCCATTTGGAACTGGC
-CGTTGTCGTCTTGGACGATGGCTCGGCGAGTTGAGCGGACGCGGGGTGAC
-GGACCTTCCGAGGCAGCTGAAATTAATGAAACTACGGCACTCTGTACATC
-TCCGGAGGCACCACGTTTTCAAGATCTACCAAAACAAGATCTACTATTTG
-GAGATCTACGAAAACAAAATCTACGTTTTCAAGAAATGGTACCATGCTAA
-TTGCAGTTTTCGCAGTTTTCTCGAAGAACAACAAATCAACAATGTTGACC
-GCCCAGTGTGCTCCGATGTCGCGTGTTGTTTAGCGTTTAGAAAAATCTTT
-TTTGAAAGAAAAACTTCAGGAGAACGATAAACAACGCACGATGAGTAATA
-TGGAAGAATTTTTGTTTCGTTTTTCTTTGAGAAAACTGCGAAAAAGTGCT
-AGATCCTGAAAACGTATATCTTGTTTTGGTAGATCTTATTTTCGTAGATC
-TTGTTTTTGAACAGATCTCGAAAACGTGATGCCTCAATCTTCTGCAGTTG
-CCGAATTTTCACATTTTTAAACCTTAAAACATATTTTTTCTAAAACTTTT
-CCAAAAATCGATTTCTTCGTTTTCACGATTTTTTTCAGAGAAAATATAGA
-AAATCGAAAATTTGTAAATTTTCGATTGAAAAAATGGAAAAATTACAGGA
-AATTATTGAAGATTTAAACTTGTTTCTAAACAATCGAAAATTATCGTTTT
-TTTTCTTTTGGAAATTTTTTTTTGGATTTTTCCCAAAATGGTGGTTTTTG
-AAATCAAAAAGCGTTAAAAACAAATTTCTTTTAAAATTACCGGAAATTAT
-TTTAGAAAATTTCCGAAAAGTCAATAAATTAAAAAATCGAACAAGAGAAA
-GAGTTATTAAATTAAACAAAAACAATTTCACAAAAGTCGATAACTATTGA
-TTTTTCATCAGAATTTCCTAAAAGTCGATATTTTTAAACCTTCTGATAAA
-TTCTTTTTTTGTTAAAAAAAACTTTCGATTGATTAGAAACACGTTTAAAT
-CTTTAATAACTTCCTGTAATTTTTCCTTTTTTTAATCGAAAATTTACAAT
-TTTAATTTATTCTTTTAAAAAAATCAAAAAACGAAGAAATTGTTCGTTTT
-TTCTGGAAAAATTAATTCTTCGGCTCGAAATTTCGATGATTTCTTTTTAG
-AAAAAAATATATGTAAAAAATTATACAATTTCAAATAAAACACTGTTTTT
-TTTCTTTTGATATTGAAAATAGTAGAAATTTTTCAATAAAAATTCCAATT
-GTTCACTCAAAATTTCAAATTTTCGACAAAAAAACTTACGATTAACAGTC
-CACGGTGACAGTCCATCGCCAGTATGATTAATCTGATTTGCAACAAAATT
-CGCCGGCACAAAGTACACAAAAACGCCGGTTGTCGGAATAAGTGGCGGTA
-GGTACGGTGTTCGGCGATTCAAACAATTCGATTGGCTCAGCAGCTCGGGC
-TCATTCACCAAATATCGGAGGAGAAGCTTCTTGTTGTGTGCCCAACCGAG
-TTTTGCAAGTTTTACGCGAAGAAACATTCCACCACGTGGTCCTTCCACTA
-TCTCGTCTTCGAACTGGGAATTTTTTTTTGATGAATTTGAGAAAAATAGT
-TTAAATCTTTATATTTCAGTTTGAAATCGCCGAATTTCAGTTGTGCACCT
-TCGTGTATATTTACGATATGTTTAATCTTTTTCGGATGCTGATTTCCGAT
-CTTTAACGGTTTTCCTTCATTTTCGTCGGTTTTTTTTGGATATGTGTTTT
-TGAGGTCAATTAATGAACCATTTTATTATCAGAAAACTAGCAAAATGTTC
-AATACTCGACAGAAAATCCATATGCTATATGCTTTTCTCGACTGAAAACC
-GGAAATGTTGCTAGTTTTTGATAATAAAATGTTAAATTAACACATTTTCA
-AAAAAAAAACACTTCTACAAAAACCGACGAAAATTAAAGAAAATCGTTGA
-AAAAACGAAAATCAACACCCGATAAAGATTAAGCATTTCGTAAATATACA
-CGAATTTGGTAAATCGACACATGGCATCTCTAGCGCGAAAATTCGAAATT
-CGTAATTTCCAGCTGAAATATTAAATCAGGGAATTTTTCTGAATATTTCA
-CTTAGATATTCGGAATCAGGGAAAAATTTGGAGTTCTTATAAAAAAATTT
-ACTAAGCAAAGTTTTAGCAATTTAGGTTCTAATAGGCTTTACAAATATCA
-AAAAGTCCCGATTTTTCAAGGATCTATATATATTTTTAGAACCACAGATT
-TTTTGCTGTTTTTCAGCATTCTCGGAAGACCATACCGGTGTGGATCCGGG
-ATCATCCAGATCTAACGAGACGTGCGGATCAGTTGGATCGACCATCGCAT
-GTCTTAAATAGTCGTTTCCGTGCGGAAGATTTACGATTGGTGGAATTTCA
-CCGGGACACGTGTAGTCGTAGAGAATGAGCACGTTTCCATAGATTTGGCC
-ATCGCGGGAGAGGTAGAAAATCTGGAAAAAATTTTTTGAATAGATTTTTT
-CGCCTTTTCTGAAGGATTTTTTTTGAAATTTGAAGGAAGACGGGTTTTTG
-CTTGCATAGACTCAAAATAAACCCTTTAGAAAATTTTTACGTTGGCTCAA
-AATATCGAGAATAAAAACCAATTTTTTTCTAAAATTTCGAAAAAATGGGC
-ATAACGGCGGAAAATGTATTTTTATTTGATTATTGTACCTTTTTCAGTTC
-ATTTTGGAGCATTTTTGGCCCATAGGCTTAAAATTAACCTTAAACATTTA
-AAAAACGTGAAATAAGATATCAAAAAGCCATTATGGCCACTATGACCTAA
-AAAAAATATTTAAAAAAAAACAACTTTTTTTTGAATATTCAAATTTTCTG
-AAACTGATAATAAACCTTTTTTCTCAATCTTAACAGTCTCGGCAGCCACG
-CGCTGTACTCGGTGAGATGAAGTTCGGCGATACGTGGATCTCCTTTGACC
-GATTGGAGCCGTCCGTTGAGACGAGCAACCGGATGACGTCGGACATTCGG
-TTTGATGACTGGATCGTTGAAGTGTTGCTCGCCGCCAGTAGAGCTCCATG
-GCTTCAGATCGTCATTCGAGACGTCTTTTATCGACATGATTTTGGAGCCG
-TCCACGTAGAATGCGAAACAGGCTTTGTGTGGAACAAGTGGTGGGAGACG
-GGGTGGTTTGTCGAGAAGCCAACCTCCTTCGCGACTAAAAATGGGGACCG
-TTGATTTTTGTTTTTTTTTTCTGACCGATTTTTCGGACAATAGCTTGAAA
-TTTTGACAATTTTCTTTATTTTTAGAAGATATTTTTTTCTTATATTTTTT
-TTTCTCTAAAAACTATAGTAAAAAATAGTTCAATTTTTTGTGGTTCTGGC
-GAAAAATGTATTTTTTCGAAAAAAATTTTTTTTTTTCAAAACAAGATATT
-TAGATTTATCACTGAAAATTGCTAATTTCCAGTGCGAAAAATGACTTTTT
-CTGGCTATTTCTGCCTGATTTTTGATATAAATTCCAATTTTCACAATAAA
-ATTGCTGAAATTTTCTCCTTTTTTCACTGTCTCCGTACATCATTGCAATT
-TCGGTCTCGTTGGTGAGCAGCTCAATTATTCGTTCCTTTCTGAGAAGGTA
-GGCCAGGCAGCCTGATATCACTGTGGCGTAGCAATCACCGTTTTCCGTCA
-TTTCAACTTCATCTTCGAACTGCAAAAATTATAGAATTGAAAAAAAAAAA
-CGATAAAATCCGACTTTCTCGATGATTTTTATGATTTTTAACTGAAAAAT
-TGATTTTTCGGCATTTTCTGAAGGATTTTGATTAAAATTTGAAGGTTTTT
-TTTTCTCCCGTAGGCTCAAAAAACGCCCTTTTTATGGCGGCTCAAAGGCA
-AATTTTAAGTAATAATCGAATAAAAAATCATAAATTTACGACCCCTACGG
-CACGGGAAATTGGAGACTTCAGCTAAAACTAACCGTTGATTTTGAATATT
-TTGAGCCAAATTTGGCCAAATAGGCATTAAATGCACTCCAGATGACTAAA
-AACACGTGAAAAAAGCTATTAAAATTAGGTAAATAAGACAAAAACAGAAA
-AAAAAGAACTTGAAGCGAAACTGGAGCCCATTTTTGGAGACAATTCTCAT
-TACAAAATTGGTTTTTTGGGCACATTTTTTAGTCTTTCTAGTTATTTCGA
-ACATTTTCCGAAGAATTCCCATAAAACTTTGAAGCTTTTCCATGTAAGCC
-CCTACCAATTTCACGTGGTACTGCCTTTCAGCAAGAGCTTTACTGATAAC
-TCGTTCTCCTTGAACTCGGAACATTTTCGACGGTGTCGCCGCCGCCGGAT
-TTATAATTTTCATCGCCTTCTTCTCCTTATCCCCATCGTCGATAGACCCA
-TCGGTATCCATTGGCTTGCGTGTTCGGACACGTCGCTGTTTGCTGGGCCT
-GGAAAATTTCGATTTTAAAGATTTTTTAAATAAAAAATCCCCCACAAATT
-CATTTCCAAATCCGGTGGTTGCCCATCCATAAACCCGTCGTCCTCCTCCT
-CATCATCACCGAACGGGTCCATTTGTATGCGATCCTCGTCTCGATATCGG
-GAAAGGTTCAGAATTGGCGGCTCATCCTCTACGATGACCTCCGTCTCTGC
-GTGGAGCATCGAGTCGTCGCCGGCGAAGATGGGCTCTCCGAGCTCTCCGG
-CGGTGAGCTCCTCCAAATGTGGCGCTGGCTTTCTCTTTTTCGCGTTTCGA
-ACCGTACTTTCCTCCGTCCTGGAGCGTTTTGGAGCTGCGATCGAGCTTGT
-TGATGCAGAGGCGAGCGCTTCTTCCTTTGGGATGCCCAACTCGTAGTCTT
-CATTGTTGTAGAGCACGGATTTCCGAGCATTTCGACGTGGACGAGATTTT
-GTGGCTGGATCCTGGGGCTCTGCGGCAGGCTCTGGATTTTGCTGGGGCTC
-TTCGGCCGGCTCTGGATTTTGCTGGGGCTCTGTTGGATTTTGCACAAGCT
-CTTGATCAACTTCTTCCTGATTTTCTGCCAATTCTCCCGAATTTTCAGGA
-TTCTCGGACATTTTTCTGCAATTTAATAATTGAAAATAAGAATAATTAAC
-GGGGTGGAAAATTAAAAATTAAACAAGCATTAAAATAAATTTGAAAAAGT
-CCTGATTTGTAGTCCGCAACGCACGCACGCAAGCATACACCAGAACAACT
-AAGAGAGACGGGAGGAGAGATGGAGAATTTGAAAGAGACGGCGAGGCGAC
-GAGAGAGCCGGAGGATTGAGGAAGGACAAACACACAGATGTGGGGTCTTG
-CAGCGCTTTCTCTGCGTCTCTTTTTTCGACATTTTTCAATGGGAAATTTT
-TTTTTGGAGTTTTTCTTTTTTTTTATCGGAAAACTTCAAAAAATTCAAAT
-GGAAACGCTGTACGGACAATGCATAGAATAACACGCAAAAATGCACATTT
-TTAGGCCTTAGGTTACTGTAGTGGTCTCGGCGCGAAAATGCGGATTTTCA
-TTTTGAATTCAAAATAAAAAAACTGGACGTGATTTGGTACAAGCGTTTAG
-TGAAAATGTTTCACAAAATAGGAGATCAATTAGATATATTTATTTATTCA
-TGGAAAATGACTATTTGGAAAAAAATTGCGAAATAAATAAAACTCGATTA
-AAAACAATGTGCATATGTCTTCGTTGCTTTCTTGGCGAGGGTTTCTCGGT
-ATCGAGTTCTACAAGAGACACACATTACGAATAACCAAAATAGTTTAGGT
-AATATACACATTGGGTGGGGGTGGGCCAGAATAATATTGAATAAGGGTGA
-AGAAAAAATATTCAAAATACGTCGCTGAAGTTGGCATACAATCTTGAGTC
-GGATAAATGGTAAGAAAGCAGCACCACTCAACTCAGATCACAATCTTCTG
-AAGAAAAAGGGACGAATGTATAGGTTCGGAGGGGGGGGAGGGGGAAGGGG
-TGGGGATGGAGGCAATTACAAATAAATCTGAAAGAAAGTTACAAATACTA
-CACACCAAAACGGTGAAGACTTGCAAACGCAGTGCTTGCAAGAATTCGAT
-AAAACTCGCGGATGTTAAGAGCGAATCATTTGGATTTCGGGGGCAGTAAA
-TTAAATGGACAAGGCATTTCGAAAAATACACACGTTAGACTGAAAAAAAA
-AAACACGATGTGATTTATGGGATGCAACACTGCTTCTTTGGTGGGTCGGA
-CGCTGGCGAAGGAATGATTGTACCACTGCCACCGCCATATCCTTGTCTGT
-CAGTTCCTACATGCTTGTTGGATACTGATTTGTAGATTTCCGTCAGGATA
-TTAGTGAAAGCTGCTTCAACGTTGGTGCTGTCGAGGGCAGATGTTTCTGA
-AAAAAAAAAATATATAAACGCAATAGATTAGTTTAACTTACCAATAAACG
-ACAATTGATTTCTTTCGGCGTAGATCTTGGCCTCGTCTGTTGGAACTGCA
-CGCAAATGGCGCAAGTCGCTCTTGTTTCCGACCAACATAATCACAATGTT
-CTGATCGGCGTGATCACGAAGCTCCTTCAACCATCGCTCAACATTCTCGT
-ACGTCACATGCTTAGCGATGTCGTAGACTAGGAGAGCTCCGACAGCCCCA
-CGATAGTAAGCGGATGTGATGGCACGGTAACGTTCCTGTCCAGCAGTATC
-CCAAATTTGAGCCTTCACTGTCTTGCCTTCTACCTACAAAAATAATAATT
-TGAATCATAAGTGTATTCTAATGAAGTTCCTCACCGAGATGCTTCTCGTG
-GCAAACTCGACTCCGATTGTTGATTTTGATTCCAAGTTGAACTCATTTCT
-TGTGAAACGAGACAGGAGATTCGACTTTCCGACGCCTGAGTCTCCAATCA
-GAACAACTGAAACAATTTTTCGTTTGGGAATTGAAAAATGAAAAACAAAA
-TTACCCTTGAACAAGTAGTCGTATTCATCGTCACGAGAGCCCATCTTTAC
-TGCTGAGCTGTAAAATGATAAAGCTTGTTTGAAAGTTGTGTATATATTGG
-GACGATTGTAAAAAAGAAAAAGGGCATTGGTCACATGATTCATCAGCCGG
-GCGCAATGTTTTGTTGTAAAATCGATATTAAAAGAACGAGACACTGTTTT
-ATCGGCGGAGAATATTTTTATGTTCTGTTCCCGACACAAACGCGGAGTCA
-GGAACCGGTTGTCTATCTCGACGGGGATTGAAAAAATATAAGTGAACTTG
-ATTTAAGAATGATTCAAAGTATATGGAGTTGGGAGTTTTATATTGAATTT
-TATCAATATATGAGGGTGGTTAGTCAGAAGAAAAATGTGAAAATGTATAT
-AGAAGTGTGTTATGAAAGAGTATTTGAGGCTTATCATACCCGAAAAAGGG
-AAGGTGAGCGGCCGAACTTTGTTTGTCGACACGATTTCGAAATAGTTGAA
-CAGGATATTTTTAACAAGGGAAAGCTTTCTCTGGGTGTTCTTTTTTGATA
-ATTTCAGCTAAAAATTGAAAAAAATAATTAGTTTTATGGCTGTGAACATC
-CAGAATAAGCTTTTCCGAACGCGAAATGCGTGTGAAACCCATAAAATCGA
-ACGTAAAACAGGTCAGGCGCACCGGCGCAGCCACGTCGGTCTGAGGGTAC
-GCGACGCTAGCCGCAGCGCAAGCCTCCTCGGGTCTCGGCACGACAACTAC
-CGTACCCCTTTCGCAGCGGCGCAACGGAATCTCAATTTTACATTTTTTTC
-TTTTTGGCCTAACGAATTTTTCCGTTTTTTCAGAGCATTTTTCATTGATT
-TTCTTAAATTTTCATCAGAATAAATTTTAGAACTAATTTCCCGTAATTCT
-GATACGCGTTTTTTATAGTTTTCGTGAAGAAAATGCTGAACATTCGAAAA
-ATACTGAAATAATTTAGTTTTGAAAACTTGCTCCTCTGTTTCAATATCTT
-ATAATTTTCTTTTCTGATTAATATTTTGATTTTCCAGGTAATCAATCGCC
-TATAATGGCTCCAACGTAAGTTTTCTTTATAAATTTATATTAGATTGAAA
-TTTACTTTTAGGCCTGACTTTCAAATACTTCAATTTTGATATTAATTCTT
-GGTTTTTCAGAAAGAAAGTGCCACAGGTTCCAGAAACTGTGCTCAAGCGC
-AGAAAGCAGAGAGCCGATGCCCGCACCAAGGCTGCTCAACACAAGGTGAC
-CGTCGCCGCTGTAAGTTTATTTAACTGTCAGAAAACAGAAAATGCTCTTC
-AAAAGCACTGGTTTTAGGATCCACTATTATCCAAGCCAGCCGTCAAAACT
-GAGCTATAAGAATTATCTTGTTTTTGGGTGAGGTGTATTCAATTCAGAAT
-GCGTCTCAATAACACGATGACAATTCGAAATTTTAAAGTTTAAATTTTCT
-TTTAGGTGTTTGAAAATTAATTTGAACTAATCCTGCATTAAAAATAAAAT
-TTTTTACAGAAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGCTGA
-GAAATACGTCCAGGAGTACAGAAACGCCCAAAAGGAAGGACTCAGACTCA
-AGCGCGAGGCTGAGGCCAAGGGAGACTTCTACGTTCCAGCTGAGCACAAG
-GTCGCCTTCGTCGTCAGAATTCGCGGTATCAACCAGCTTCATCCAAAGCC
-AAGAAAGGTGAAATTGTGTTAATGAGTTTTTTAATAACCATTCTTTGTTT
-TCAGGCTCTCCAGATCCTCCGTCTTCGTCAGATCAACAACGGAGTGTTCG
-TCAAGCTGAACAAGGCTACTCTTCCACTTCTCCGTATCATCGAGCCATAC
-GTAGCTTGGGGTTATCCAAACAACAAGACCATCCACGATCTCCTCTACAA
-GCGCGGATACGCCAAGGTTGACGGAAACCGTGTCCCAATCACCGACAACA
-CCATCGTCGAGCAGAGCCTCGGTAATTTGAAAACTTATGCTTTTTAATTC
-TTATTTAATTGTTTTCAGGAAAGTTCAACATCATCTGTCTTGAGGATTTG
-GCCCACGAGATCGCCACCGTCGGACCACACTTCAAGGAGGCCACCAACTT
-CTTGTGGCCCTTCAAGCTCAACAACCCAACTGGAGGATGGACCAAGAAGA
-CCAACCACTTCGTTGAAGGAGGAGACTTCGGAAACAGAGAAGATCAAATC
-AACAACCTTCTCCGAAAAATGGTCTAACTTGTTTGTTGTTCATACCTTCC
-TTCCGGATAAATCGTTATTGTTTGACGTTGTTTAATTATGTGCATAAATA
-ATCATGAAACGTGATCGTCTTGGCTCGACTCATCTCGCATTTCATGAAGC
-GTCTCATCATTCAGATGAATCGTAAAACCGCTTTGCTGACTACTCTCCCG
-AGAACAGTCACTGTTCCCTACTATGCTCCATCCTGTTTATTTCTAGAAAC
-TTTTCTTCGGAGCAAGCTAATTCCCTATGAAGTGAGAGCATTTAGGTTAA
-TAAACATAGTCCAGATTTAAATCCAGACAACGCAATGTTCTCTCTACAAT
-GTACTCCCTCGTGAGCACCTATACCCATTGATTGATGTCGATGGGTATTT
-CTTCAAAAATTTGATGGAAGGACTTGATTATCTGCTCGCCAAATATGGAA
-AAGTTGGCTTAAAACTAGAATTTTAGAAAAAGCTTAAATATTCTTCCAGT
-CTCTGGACTCGGGCCTGACTCCAAAAGAGCGAGCACAGGCTCTCGCATTG
-AGCGCTTTGCTCGACGAGCTTACTTGGATGCTCGCCTACTCGCGAGGCCA
-AGATTTCACGTGGCTCCGCGATGATCGTAAGATTATCGAAGACTTCGGGC
-TTGTTCAGCTCTATTTTTGGAGGAATTGGATTGTACCGCAGATGCAGAAA
-CGGGTAGATTATTGATATTTTATGGAAAAATCGATAAAATATTGATTTTT
-TACTGAAAAAATTGATCAAAAATCGATTTTTTTTTCCTCGGAAAATCTGT
-AAATTAGTAGTTTTTTGTTGAAACAATCGATAAAATTCTGGTTTTTCAGA
-AGCAAAATCGATATATTAGGCCAAAATCACCAAAAATTATCAATTTTCCT
-ATAAAATTTACCATTTTTGGCTAGATTATCGATTTTTAAGGCAAGAAAGT
-CGATATTTCACAATTTTTTATTGATTTTTTTGGCTTTCCAGCGCGCAAAC
-TGTGCCAAGATCTAAATTTTCCGAAATTTTCATTTCAGACACGCCGCCGA
-GTGCGAGGCTACGGAATATCCGGAAAATCGGCGAGAAAGGAGGTCGCCTG
-CCGAACTGAAGCAATGTTGGAGGCATTGGCCTCACTTTTGGCCTCGAATA
-AATACTTTTTCGATGTCAATGAACCGTCTTGGGTAGGTGGCAGCCAAAAA
-ACTCGGCCAAAACTCGGCCTTTCAGCTCGACTGCAAGGCGTTCGCCGTGC
-TGGCTCAATTCAAATATACACCACTGCAGAACGAGGCCCGCGTAAAACAA
-TTCATGAAGGACCGAACTCCAAATTTGGTGGGTGGCCTTGAGTTTTCTAG
-GCCACGAGATTTGAAAAATTCTATAATTAGGGCATGTGGTTTCAGATGAC
-ATTTGTGACGCGCATGAAAGAGGAATTCTGGTCGGATTGGTGCACCACGT
-CGGAGGATTGAATTTCGTGGAAAATGCTAATTTGTTTAATGTAATATGAT
-TTTGCTTCGTAGATTTTAACCTATGCTCGAATAAAATTTATATTCTAATT
-TTAAAAAAATTTCAAAACAAAAAATTTCTTACGTGACAATTAAAGGGTAT
-TACAATATGGGCATAAAAAATGTATTCCCTAATTTTCGAACTTGTTCAGT
-CTTGGTTGCCCAGGTAATTTTTTTGCAGTTCTTGTTTGGGACTCGGAGCG
-ATTTTGCGCAGATGCATCATATTTGACGCGCAGAGTTTTAATTGAGGTTT
-GAGCTTGAATTGAGTTTGAATTGAATTTTAATTAAATAAAGCGAATTCTA
-GAATAAAATGATGTGTTTATTGCGAAATAGATCGTGAACCTACAAAACAA
-CAGACTTTACGCGCAAATTTCCGAAATTTTCCAGAAAAACCAGTCAGAAT
-TTCAAATGATACTTGTTCCTCTTCTATTTCTTCTCCCAATTTTGTTGTGC
-GGTGGGAAAAAGAAAAAAGCGAACAAAAATGTGAAAGAGGCGTCGAAAGT
-GAACTCACTGGTTCCACCGTCGACCTCTACGGACCCGCTGAAGACTAAAG
-AGAAGGAGATGAAAAAAGAAGAAGCTCCGGGAGCACCAGACGCCCCGACT
-AAGCCGAAAAGTCCTCCGAAACCAGTGGTCCAGGACACGAAACTTGCTGA
-AGTGCTGCCTGAAAGTGAGAAGGAAGACGAAATGAAGAATGGTATTCAGT
-TGCCGAATCCGCCGAAAAATTTGGTGGGTCTCACGGCGATTTGAGTGTTT
-TATCGATTTTCTATGAAATAATTGATTTTTTCTAAAATTATTGAGATCTA
-GATTTGCGAGTTTTCTGAATTTTCTAATATATCGATTTTTCAGAAATGCG
-AAAGTGAAATTGCTCCAAAGGAAAAGCCGGCGGCTGACGAAAAGAAGGAC
-GAGAAAAAAGATGAAAGCAAGAAGGATAAGAAGGAAGAGAAAAAGGAGGA
-GAAAAAAAAGGAAAATGACGAAATTATGTGAAAAATTCGATAAATTGGTT
-CTTGAAGATTATTGATTTTTCATTGTCGATTTTTCAGAATTCCTCGAAAT
-TTATTTGCGCGTCATATATGGTGCATTGAGTCCATAGAGACTTCAAAGTT
-CACGCGCAAATGCAGACATTTTTGCACGCGCTGCGGTGAAATTCCTCTTG
-GCGAATTCAAATATTTTTTCCCGCCTTTTTTGAAAATTTTCGAGGCGTTG
-GTCGAGCTGAATACACGTGAAGTTTAGACTGAATGTCAAATCACAAATAC
-ATCACATTTGACGCGCAAAAAATTCGTTTTGAAAATTTGCGCGTCAAATA
-GGGTGCATTGAGTACGCGGAGCCAATACATCACACTTGCTTTTCGTGGAA
-AATGGAGCGAAATTTGATTTTTTGATTTAAATATTACGGGAACAGAAAAT
-TCTGAGAATGCGTATTGTGCAACATAATTGACGCGCAAAATATCTCGTAG
-CGAAAACTACAGTAATTCTTTAAATGACTACAGTAGCGCTTGTGTCGATT
-TACGGGCTTGATTTTTTTTCCATTTTCTTCAGTTTTTCTGACATTATTGT
-GTTTTATTTTAATATTTTTACCGATTAATAAATGATTTCCGTAAATCGAC
-ACAAACGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCGCTGCGAG
-ATATTTTGCGCGTCAAATATGTTGTGCAATACGCATTCTCAGAATTTTGT
-GGCCACGTAATATTTGCGTTAAATAAAAATCAAAAAATTAAAAAAAAAAA
-AACATTTCAGAAATTTTCAAAAATTTTTTGAAAAATTGACGCACAAAGTC
-TCCTGTTTCCCTTTTCCCCAAAGTTTTAAACTAATAAAACTTTTTTAATT
-GTCGAATCCGACCAGTTATTTAATACGAGACAAAACGGAAACAAAGATTC
-CAATTTCCGATTACGGTCAGCTCAACACTTTCGCTCAAGGAATTCTCTAC
-GCTTAGATTTTGATCTTAATGGAAAACTGGTAGAACTTGGTATAAAACTA
-TCCAAAAAACTGGCAGAAAGAGTAGTCTTTCCGAAGAAATGAAGTCCCTA
-ATCGAGGAAGATGACTTGGAAGTCGGCAGATTCCGCCGCAACGCGTTTTC
-CGCCGTCGCCCTCTCCACCTCCTGTATTCTGGCGATTGTGGTGTTAACAC
-CAATTGCCTATCAGGCAATTCAGAGAATTCACTCAAATTTGCTTAACGAT
-GCCCATTTTTGTCAGGTAATTTTTTTAAAAAATTTAGAAATTTTGATTTG
-GAAATATTCAAATAAAAAAAAAGTTTTTCGAAATTTATTTTCAATCGTTT
-GAGATTTTGACATACATTCCAAAAATTCCTACTCTTCGCAATTTTTTAGT
-CAACTCAAACTCAAAACCTTAAAAAAAAACCGCAAACCTGTCATGGCGCA
-TCGATGTTATCCCTACGCTAAATGTTCTGTTTTCGAAGGTTACTTTTTTC
-CAATTTTTATCACCAAGGAAAATGTATACACAAAAATATATAGAATTTGA
-CGTGCAAATTGGCAAAAAACTAAACTTGCGCGTAAAATCACTGCATTGCC
-TCTGCGGACTCAACACACCAGATTTGAAATTTCAGGAACTTATCGATTTT
-TGTAAAATTTTGCAGCATGGCGCATCGATTAAATATTAAAAAAAAATTGA
-AAATTATCGATTTTTTTGAACACGAACAATTTGTGGAAAATATGAAATAA
-AAAAAAACATGGTGCATCGAAAAACTTACAGGCTCGAAACCGTGACCTCT
-GGACAGAAACAATGAAGATGGCTCGGAGCCGCGGCCGGGACGAGGAGCTC
-GTGGCCCGAACCAAGCGAGCGGTTAAAGGCACATGGCTCTTCGGACAGTA
-TATTCCAGACCGATCAAGCAGAAATCGACGACAGCAATACGCCGAGGCCG
-CTGGCGGAGGCGGTGGAGCACCACATGCCGAGTGTAGACGGGGTCCACCG
-GGACCACCGGGTGATGGTAGGTTTTTAGATTTGCGAGGCAATTGTGGTGT
-ATTGGTTTAATTTTACAGACGGGGTCGACGGAACGGACGGAAAAGACGGT
-GCACCTGGAACCGATGGAAAAGACGGTCAGGTACCACAAGGACCAGCCGA
-CGGAGGTTATCAAGAGGGACCATCTGATGCAGTTGAAGCATGCACACGTG
-AATGCCCACCAGGACCGCCTGGACCAACTGGAGCGCCCGGAGACAAAGGA
-TCTCGAGGCTACCCTGGAGAATCTGGAGAGCCAGGCACCCCGGGAAGCGC
-CGGACCGAAAGGAAATGCTGGACCGTAAGTGGAACTAAAGAATCGATAGT
-TTTCGGTAAAAAATCAATCATTTTAGGAAAAAAATCGATAATTTTCATTT
-TCATTTTTCTCCATTAAATTATGTTAACTTTCTAGAGCTGGACCACCAGG
-ACCACCCGGATATCCAGGACGTCCTGGAGAAACCGGAGATCACGGAAAGA
-CGATCGCCGGAGAGGCGCCACCTGGACCACCAGGACGACAAGGAGAAATG
-GGTCCACAAGGACCACCGGGACCACCAGGGCCACGTGGAAAGGACGGAGC
-CGGTGGAGAGAAGGGTGCTCCGGGAGATCAAGGTAATCCGGGACCATATG
-GAAAACCTGGGCAACCGGGAGCTCCAGGACCCGATGGCTCTGCTGGTGAG
-AAGGGAGGATGCGATCATTGCCCACCGCCAAGAACTCCACCTGGTTATTA
-AAGATTCTTCGATTGATATTTTATTTTATTTTCATGACGTTATTCATTTT
-GTCATTCGGTTTTCTTTTGTTGCAATATGATAATAAATCAGATTCTCTTG
-CCAGTAGTTCCAAGTGCCCCAACATATTTTTGAGTCCTTTATGTAGATCC
-CTCTCCTCGAAAGCTGGATGATTTAATAAATCTTTCAGAAAAATCGAAAA
-TTTTAGAAAAAAAAACATCAAAATTTTTGACAAACTGCATAATCAGTCAA
-TATTCTAAAAAAAAATACGATCGCACAAAAATAAACAACGACGCAACGAC
-ACTCCGCGGTTACTAAGCTCCGCCCACGATTTCATTTGCACTGCGTTGAG
-TCGGCCGTATTGTTATTCAAACATGAATGAATATACTGGTGAAGTTTAAA
-AAATTGGGTGTTTAGTTTTGAAGAAAATAATTTTTTTGGAATTTTGAATA
-AAGCACAATTGGCAGCTGAAACTGGACTTTCAGACAAATTTTGAACGGTG
-GTTGTTGATGCTTTGAGTTTATATTGTTATTCAAACATGTATGAACTTGT
-AAAGTGCTTGTAAAACTTGTAAGTTGCTTGTTCGCTCATTCTGAAATAAA
-ATTTAAATTAAATAAAAGTTCACGTGATACAAAAAAGCCAACTTATTGAT
-TGAAATCGATAAAATCGATAAGAAATTCATTCATTTAATAGTTTTTAACA
-AACAACAAATGCGATCAAAAAGTTCGGAAGGTGATTTACAACCAGAGGAC
-ACCCAATCCAGAGAAGATAAAGAGACGACTGCTACGTATAGTGAGGATAC
-AAAGCCAGGTAAATACAGTAGTCCTACCTTAAAATTACAGTAACCCAGCT
-GACTAAATATCATAATAAAACTTGCAAAAAAATGATGTAAAATCTTAGTT
-TTTAGTCTTTTGAACTGGTAGAAACTGTGTTAGCGCCACTTTTTGACTCT
-AAATAGAAAAATTTCCCATTTTAAAAGAGTTGTATTATGATACACTGCGT
-GGCGTGTAAAATACCAAAAAATAAGCGCGGTTTTTTTTTTCGTAAAATCA
-CAGGGAAAAATCCGAAATCGGAACTCCAATCAGCCGCCAACATCCCACGG
-GCCCAATAACTTCTGGGTTTTGTTTCAACAATCTCATTTACTCCAATTCC
-AGAAACCCAAAAGGAGAGAAACGCGGCACTGGACAATCTTGCCAAGACCC
-CAATCCAGTTAGTCGTCCAACCAACTCCTCTCACACCAGCCATCACGCCA
-TGCGAAGCACCACCACCACCACCTCCACCAAAACCCTCTAGCGATAATAA
-CAACTCGAAACGATTGAAAGTGAAAGATCAACTGATTGAAGTGCCCAGCG
-ATGAAGTAGGCCGAGTTGAGAATAATATAGACAATTTCCCGTTCTATCAT
-GGATTCATGGGAAGGAACGAGTGTGAGGCGATGTTGAGCAATCATGGAGA
-CTTTTTGATTCGAATGACGGAAATTGGGAAGAGGGTCGCCTATGTGATTA
-GTATCAAGTGGAAGTATCAAAATATTCATGTTCTAGTGAAACGGACCAAG
-ACGGTGAGAGTTGTTTGGTATTATCATTTAGTTTCGTTTCAAATCAGACC
-GAGATACATACAAATATTGAAGTTCAAATTTAGAACATGTTGCATCGCAA
-TGTGTTCATTGTGCTCCCTGAAGCATTATGCGGACATCACGAATTACATA
-AATTATTTTAACCAATGGTGGGCGGCAAATTGACAAATTGCCGATTTGCC
-GAATTTGCCAAAAATTTTCGGAAAATTGTATTTTTGCACATTTTTTTTAA
-ATTTCAAAATTTCAAATTTTATCGGCAAAATTGTATGCATCCTATGAATA
-TTTCTACATCTGTTTCGAAAAGTAAGCAAATTATATGAAAATATCTAAAG
-AAAAGGGGAAAAAATTCGAAAAGGCACAGTTTTCAGTGTTTCCGTCTTAC
-AAAAAAAACCTCGAAAAACTTTCGGCAAATAAGCAAACCGGCAAATTGCC
-GGAAATTATAGTTTCAGGCAAATCGGCAAACCGGCTATTTGCCGAATTTG
-CCGAACGGCAGTAGCCTCTCACCCCTGATTTGAACATGGTGCATTGCATC
-ACCGCTCCTCGACTTGGAAAGTTTATATCGGTAGATATTTGCAGCAGATG
-TAATTTACTGATATTTTCAGAAAAAGCTCTACTGGACCAAAAAGTACGCC
-TTCAAATCCATCTGTGAGCTTATTGCCTATCACAAGCGAAATCACAAGCC
-GATTTATGAGGGCATGACGTTGATCTGTGGCCTGGCACGACATGGATGGC
-AGCTGAACAACGAGCAGGTCACATTGAATAAGAAGTTGGGAGAGGGACAG
-TTTGGAGAAGTGCACAAAGGATCGCTGAAGACATCTGTATTTGCAGCCCC
-GGTCACTGTTGCCGTGAAGACCTTGCACCAGAACCATCTATCCGCCAATG
-AGAAGATCTTGTTCCTAAGAGAGGCCAATGTGATGCTCACCCTGTCTCAT
-GTAAGCTACCTGTTTCAAGTTGAACTAAACTAAAATTAATTTCAGCCAAA
-TGTGATAAAATTCTACGGAGTATGCACCATGAAGGAGCCCATCATGATTG
-TCATGGAGTTTTGCGACGGGAAATCCCTGGAGGACGCTCTACTCTCCAAG
-GAAGAAAAAGTGTCAGCTGAGGACAAGATTCTCTACCTTTTCCACGCCGC
-CTGCGGTATTGATTATTTGCACGGAAAGCAGGTTATTCACAGGGATATTG
-CGGCGAGAAATTGTTTGTTGAATTCCAAAAAGATCGTGAGTTTGTTTTTC
-AAAAATTTCTGAATCTATGTGAATGAAAAAATAAATTTCAGCTGAAAATC
-TCCGACTTTGGATTGTCGGTCAAAGGAGTTGCTATAAAGGAGCGAAAGGG
-AGGATGTCTGCCGGTCAAGTACATGGCTCCGGAGACATTGAAGAAGGGGT
-TGTACAGTACTGCCTCTGATATTTATAGGTGAGCCTACGAGCATACATAG
-ACATTGGTAGTGGCGTCAGCGGTGGCCTAGAAACCTTATCCGCGTCTGAA
-GGTTAATCAACCTCACACAAGTCTCTATGATTTCCAGCTACGGCGCTCTA
-ATGTACGAAGTCTACACGGACGGAAAGACGCCATTCGAAACGTGCGGGCT
-ACGTGGAAATGAGCTCCGAAAAGCGATCATCGGGAAGAGAATCAGCTTGG
-CCGTTGAGGTAGAGCTACCAGTGTTCATTGCCAACATTTTCGAGCAAAGC
-AGGCAGTACGAGACCGAAGATCGCATAAGCTCCAAGCAAATTATTCAGAT
-TTTTAAGGAGGTTTGTGAAGCATTTTATCGGTTTTTTGTTCAAAAAATTA
-GTAATTTTCCAGGAAGTCGGATTCCATGAAATTGAGACAAGTGGGATACT
-GCATAAGCTTGTCAATTCTCTTCCGAGAATTCACAATAAGGAAAGAAAAC
-CCGCGGCGGTGGCAGTGTAATAAATATCTGAAAATCCCCCCACCCCTGAA
-AATATTTGACTGTATTTTTTAAATCAAACACACAACGCACACAAACAGAC
-AGACAGAAAGCCTAAGTACACAGAGAAAATGTTTGAGGTGAGGTGCGAAA
-GGGAGGAGGCTAGAACACCTACTTTACGCCAACAAGTTATGACTTTTTGG
-AATTCAAAATGTCGTTTTTTGCTAGTTCACTGCTTACCTACAAACCTTCC
-TACCTTGTCTGCCTACCTTCCTTCCTATTCTCTTATTGCAAGATCTTTTG
-AATTTTTCTGAAACGTCTGTCTACTTCTGCGTCATTTGCAAACAGGCTGT
-TCTCAGTTTTAGGGGGTGGCAGCACCCACAAAAAAACATTGGAACAGAAA
-TCAGTCGGAGTGATCTACTAGATTAGATAAACATTAGATATCAGTTTGGA
-AAAGTTAAACATTATTAACTCACAATGGATTTTCTTATTGTGTTTCTTGA
-TATAAAGCGTTGAGCGGTATTGATACCATTACAATGCACTAAGCTAAAGG
-CTGTCAGAGCCGAATGAAAAACATGATACATCGAGCATGCGGCAATTGGC
-GTTCGGAAAATCGGCAAATTAAGATTTGCCGGAAATGTTTTGAGGGATTT
-TTTATAAGATTTAAATGTGCCTTTTTGAAATTGTGTCCCGTTTTCTTTAG
-ATATTTTTATAGGATTCGCTCACTTTTCAAAATAGACGTAGGAGAATTCA
-TAGGATGCATACACTTTTGCCGATTGAAATTTAAATTCTGAAATTTCCAA
-TAAAAGTGCATCACCACAATTTGCCGACTTTTGGCAATTGCCGTTTCTCC
-GGCAAATTCGACAAACCGGCAATTTGCCGATTTGTCGATTTGCCAGAAAT
-TTTCAATTCCGGCAATTTTTCGATTTGCCAATTTGCCGAGAATTTCAATT
-CCGTCAATTTGCCATATTGCCGGAAAAAATCGTTTGCCGCCCATCCCTGG
-TTCGAACTCCTAGAATGGTAGAATATGAGTATACTAAAAATAATTTGAAC
-AGAACTGGAACTGGAAGAAAAATTTTTTACCGACGTCTTCTGAGAAAATT
-TCGTGAAAATTGAGTTTTTATCACTTTCTGACTCACAATAAAAAAAATTT
-CCAAAATTTTTTGAATAGTTCTCGATCGTTTCCAAACTGGTCTTCCGACA
-TTCAGGTGCGTGATTGGTAAATATGAGGGAACTGCCATAATCAAATGAAA
-AACACGGTGTATCGTCTGAGAAAACCTTAAACTGTTCCGTTTTAGTAATT
-GGACAAGGATCTGCTGAATCTCGCTACTATAGCAACCGACATCTTGCGGG
-TCCAAAAAAGATTGATCTTGAAAATTTGATCCAAGTTTATTTAATCGCCG
-CCACACACACACTCACAAAAAAATCAATCAAATCACCCATATCAGTTGCG
-CGATTTCTAGTTTCTAGGCGCGAAAATCAAAAGGAGGAGAAGAAGCATTT
-CCGCATTACTCGTGTGTGTGCCGTTTCCGTTTATTTGTCCCTCAGGCTCC
-CCTCTCTGTTTTTTTTGTTTGCGAAAACTGTCTCTCTCTCTCTCTCTCCA
-TCACTTTTCTGTTGCGGAATAGAGGGAGAGAGAGAGAATTTCGGAGGGAA
-AAATACCTGAAATGTGATCCTCTCTCTGTATGTCATTGACTGTTGCGCGA
-GAGCCTTTTCCCGCGCGCGCGAGCCTCCCACCTACCCGTCGACGAGCCTA
-TTTTCTTGTCGGCGGTGCCATTCGGCAATACACGTCCCTCTCTCTTCTTG
-CTCTAGAAACATTCGGATTTTGATTTTTTGATTTTTCATGGTGGATCTGT
-AGGCTTTTTTAGGCCATCTTGGACTTTGTGGTGGCCTAATATATGGTGTA
-TTTTCCAATTTATCATATTTGCTTTAGTATTGTCCGACTTGTAGGCAAAT
-TGCACCATTTTAAGCCAAGTAATAAAGCTTTGAAGTTTGGCTGCCTAGGT
-TTTTCTAGCCACCAAACAATTTTTTTGTTTTCACAGCACACTTTTTTAAA
-GACTGTCATAAGTTTTCAAAATTCTTTGAAAAATTTTACACCGAATTTTG
-AGATCTTTAAGTTTGGTGGCCTAAATTTTTCAAAATTTTCTATGCCACCA
-GACTGAAACGTCCTAACTCTATTTGAATTATCTTTGAAACTATGAAAACT
-ACAAGTTCGACTAAATATGGCTTATCCAATTAAACTCGATTGGTGGCCTA
-GAAAACCAATTTCGATTTATTTCATTTTCTAGGCCACCAATAATCTTGTT
-CGAAAATTACTTTTATTTAATTACAGTGGAGTTTGGAATACTTACTGCCA
-TGGGCTGTAAGATGTTGCTCGCCTAACTTTTTCTATGCCAGCAACCAAAA
-AGTGGTGTTGGTGGCCGACAAACCCAAACTTGGACAATTGCATTTTCTAG
-GCCATCATTTTTTTTAAACTAATCGTTGTTGGTTTAGTCTACTGTAAAAA
-ATCAAATCGATAAGAACATTGGGAGCCAAGCTTTGGAGTTGGTGGCCTAG
-ATTTTTCTAGGTCACTAACTTGAAATGTCTGTAACTCTAAAAAATAATTT
-AGAGATATATAACAGAATTAGTAGGCTAATTTTAGGATGAGAAACTATTT
-AAACAATTGGTGGACTAGAAACTGAATTTTGAAATTTCTAGGCCACCAAT
-TCCAAATAAGCCTATTTCACTCCTGAATTGAGATAAAACGCTGAAATTTT
-GGACATATTAGAATACGCTATATTTGAAAAAATGGAATTGGTGACCTAGA
-AAATATTTTTTTGAAATTTCTGCTCCACCAATTTCAATTATAGCATAACT
-CATTTCATAGTTGTAGGACGGTGATTGAAATTTAGGATAGACAGATTTTA
-AACCAAAACAGATTGATGGCCCTTGAAATTTCTAGGCCACCTCTCCAGAA
-AAAAATCTGAAAATTGTTTTTATTTCTAATTCATTTTCTTCGTCCGTTTT
-TCATCTCTCGAGGATCTTATCCCCTTGTCTTACGTCTCCCACCCGCTGCT
-ATTTGGGCGACCTTCATAACTGTGAAAATTCTCACCATTCTCCCTCTCTC
-GTTTTTGCCCCCCCCCCCCGGTCTCCTATCATTGTTCAAGTACACCTGTT
-GTCCCATAACATCTGCCAACCAATTTTTTCCAATTTTGCCACAATTTTTA
-TTCAAAAAAGTGCATTGCAGCGGCAGGCATGCCTCACTCGTACACACACT
-TGAGCATACAGGAAAAGCGAAAAAATCAGTGATTGTTTGGATTCCTGGCT
-CTTTCTAGGAAAAAAACTCTTCCATTTTTGTAGTGCACATCAAAATGATC
-AAGCTGGTTAATTTTCAAGTGACTCCCAAAAAAATAACTGAGAAAGTTGC
-GTTTTAAAGTTTCTAGGCCATTGTGGGATTTCTAGGTAGGTTTTTGAAAA
-TAGAAGACAGTCTTGCACTAAAGTTTTGATTAGGCTGTTAAATGATTTTT
-GTCAGTACGTTTTTTGGAACTTCGATTTTTGCCAAAAATTCCTTTTTTAG
-TTTTTGTTTCAGTTTTTTGCAAATTTTTATTTCTTCCATATCTTACAACA
-TTTAGAAGGTCTCAAAGTCTCTGATAGCCAAGAATTGACTCTAATGACGT
-TATGAGCTCCGAGACTATTTTAACCTTTTTCCCTTTTAAGCATAAAATAT
-ATAAATATCAAAAATTTAATACAAAAACTTCTCGTTTCGAAACGTTTCGA
-AATCCTCCAGTTAAAAAAAAATTAGATTACGGCATCGGAAAAATTGCGAA
-ACTTTTGAATCTGAGGGATTTTCAATAGAGGGTCCCGCCAGGAATTTGAG
-TTTTTAACAGTACCCTTTCCATCGTCCTTCCCGAAGCCCATTACATCATC
-ATTAATTTTGCGACCTTTCTAAAAGCGGTCATGGGGGGGGGGACATGTGT
-TTGTTGCATATACAGGGACCCCCCGCCACAACCACCGCAACTAGAGATAA
-AGATCTGCTGCACACAGACAGCTGGCACATGGATGGACAGAATGTCTCCT
-TAATTTTACCGCCTATTTCATAATAATAAAAGTAGAACGGGGGGCAGAAA
-AGAGAATGATTGCGAAACCACCTGCTTGGCTGTCAGCGCATAAACTTTTC
-GGAAATTTTGGGTCCCACCACGCTTTTTTCGGTAACAAATTTTGAGATTT
-CTCGATACACCATGATGTCTTTTGGTGGAATTTTGGGTTATCATGGCTAA
-TACAAAGCTTTAACGTGCCTTGAACTTTCGCAATTTGAACTTTTGGCCTT
-TACTTAAAAATTTCGATGGGGCTCTATAAGCCATGTGGTTTCGAACTTTT
-CCTGAAAATTTAGATTTTTGTTCATGCACCATGTTGTTTTTTTTTTGGAA
-TAATTGAGGAATTCCTTACTTTTAAAGTAAAAAGTTTGGTGAGATCCATG
-TGTTTTCATATTATTCAGTTGGTAAATTATACAGATTATTGACTGAAGGT
-TAATTTTTTGTTGGGAAAATAAAAATCGCCAAAATCAATAAAATCGTATT
-TAGAAGTAGGGTTTCCATATAGGCGGTAAAAGGCTTGTCTGCCTGACAAT
-AAGACGACCGCCGCTCGCCTCAATCCGCGGCGGAGGCAGGCAGGGTTCAG
-GTAGGCACTGAAACCGCGCCTGCTTACCATGATGTTCCGTTCTTGTCGAT
-GCACCATGATAATTTTGGGTTACATTTTGAGCCTTTTCGAAAAATTAATG
-GTGGAAAATTTCAAGCTGAATTTTAATATTTATTTTTTTAACCGTATTGT
-GGGACATGCAAATGTCTTTCATTTTGTGTCCCTTCACTCTAACGTCTTCA
-GAATTTTCGAACTTCTCGATGCACCATAATGCTGTTTGGCGATAACTTTA
-GAGTAAGAATGGTAGCGATTTTTGCGATGCACCATGACGTTTTTATCGAT
-TTTCAGAAAAAAAATCACTCCGAGACCCAAATAGTTTCATTCTCGACGCA
-CTATAACGTTTTCGAAGTAAATTTCAAAATTGCTTCTCGGAAAAGTTTTT
-TGAGACCTACATGCACCTTTAATCTTCTTTGGAAACTTTGGAATTTCCGC
-CGAATACTCTCATTTCAGTTGTTCTCGATGCACCATGATGGTATTTTTTT
-CAAATTACTTTTTTTTGATTTTTCCATGAGAGGACCAATATCTGTCTTTA
-TAACGGCGCATTCTGTAACCAAATTTTGAAATTCCACGACATTCTGCTCT
-CATCGATTCAACATGATAATTTTAAAATGAAATTTAGCGATTTTTCGGGA
-AAAAAACAGTTTCGAGATTTTCTAGTTATTGGACACTCTGCACCTTGCTT
-ATTTGGAAATTACATTTTAAACCGACAACCCTTCAAAAACTGCTTTTCGT
-CGATGCACTATGAGTGCATAATTTTGTGTAAATCGTGGTGGGCCTCTAAA
-AAAACCGAAAAAAAAAACGTATAAAACGCAAACAAATTGTTTTTGTTGTA
-ATGTTGACACCAACAGATTCGGCGTGGAATATACGGAAGATCGGATTTCC
-AAAAAAACAACCGCTCTCCTGTTTTCGACGTTCCGCCGCTTTTTATGGGA
-GAAGTAGTATGTACCTTTAAGGGTACTGTAGCCCCTTGAATATTGGCCTA
-AAAGTGAAACTAGTGTTGCCAAAAAAAAACGAGATGACCAGTTTCAATAT
-GTCATTTACATCTACACATTTCTAAAATCTCATTTTAAATTCCATTGTTT
-TCTCGTTTCTTCTGTCCCAAAGTACCGTATCCTCATCCTTCTACCACCTT
-AATTTGCATTTCTTCTTCCTTATTCACTCTTCTTCCCCTGGACGAAAAAT
-GTTGCACGACAACAACAAAAGAGACCCGCCCCCCACCATCGGTTTCTCTG
-AACCTCTAACTGTCCCCGCCCCCTTTTGGGAGCCCACTGTCTTTTCTTTT
-TTTCTTTGGTCGCTGATTATGACGGATCGTTTTTGTCGTTTTTGTATTAC
-AGGAATACAAATTTCCCAAAACGCGTATTGCACAACATATTTGACGTGCA
-AAATATCTAGTAGCGAAAACTATAGTAACTCTTTAAATGACTTTTGTAGC
-ACTGATGCCGATTTAATTAAATTATTTATTAACAGATAAAATATTAAAAG
-AAAACACGACAATTCAAAAAAATTCATTTCGTAAATCGAGCCCGTAAATC
-GACACAAGCGCTACAGTAGTCATTTAAAGAATTACTGTTTTTTCGCTACG
-AGATATTTTGTGCGTCAAATATGTTGCGCAATACGCATTCTTATAATTTT
-GTGTACCCGTAGTATATTTTTGTCTCTCTGATTTCCATTGCAATTTTTTA
-ATTCCATATTTTTTTGGTGACAAATTTCTCCGCTTATCAATTTTTTTTTC
-AACCACATAATTATTAACCCCAAAACATCGCAGATTTTCAGGTAAAATGC
-CAGTCGTGAGCGTTAGACCTTTTTCTATGAGAAATGGTGAGCAATTTTTT
-TGAAGTTTTTTTTTGAAATTTTTAATTTTTCCAGAAGGCTTCTCAAACGG
-GCATAACACGTGGAACGACGCCGAATTTTGGAAACCGTGAGTTTTCGGCA
-AATAAGCTAACAGTCTAAGAAACACGAAAAAAAATCCAATTTTCTTTTCA
-AAATTCGTGATTTTCGGATGATTTTTGAACTTTTTGATTAATGTTCCCAC
-TGAAAATCCTCCAAATCTCTAAAAATCCGCTTCTAAAAAAGCCTCAAATG
-GCCTTGCGAGAATAGACGGAATGTTCAAGGATGACTGGTATAAAATCGGC
-AAACGTGTTGCCATTCAAACAGAATATCTCGAAATTTCGCCTTCCTTTTT
-TTTAAGTGGGTCGGATATTTAACATACAGAAGAGAATAGGGAGAGAAAAG
-AGGGAAAAGAGGGGAAAAGTCTTCTTGGAAACAACCTCGAACCGCAATTA
-AGTTTTTGCCTCACCCTTCAATTTTCGTGAGAAAGTTAAAAATCCAAATT
-TTTTTCTCCTTTTTTAAAAAAAGATTTCCTCCTCAAAAATTCAAAGGATC
-GAATTTTTTGTTACACGCCTGCCTCCTTTTTATTACCCTTGTTCTTGATC
-GCAACCTCTTTTCTAGATTACTTGAAAAAATGCGCTATTTTTTTTCCTTT
-TTCAACAGAGTCAATTTCAAAGGTGCTGTGGAAAAAGTTTCGGTTTTTTT
-TTGCAAAAATAATCGAAATTTGTTCGTTTATACTGCTTAAAAAATGACCA
-AAATTTCAAGTAATTCATTCGAAAAATCGATTTTTTTGAAATATACAAAA
-ATTTTCAATTTTTCATATCTGAAAACACAATTTTTTCGATTTTTCATTTT
-TCTTGGAAAAAACACAAAAAAAAACTGTATTTAATTTCCCACTTAATACT
-ACGATATCCAAGCCCCGCCTCCGCGTATTGTACGTGAACACGGCGGCCCA
-AAATTACACACTATCTCACACACGTTAAATGAGTGATACCGTACTCTCTC
-TGTTTTTTCTTTCATTTTTTCGGCGCCGAAAATTTTCAATTTTTGGTGGT
-TCTTTTGGCGGGATTTTTCGGATTTTTGTCGCGTTCACACACACACACCA
-GTTGGTGTTGCCTGTCGTCACCCACCCGCCCCACTCTTTGTCCGTGTACT
-GCTTTGCCATTTGTGCGCGCGTACCGCTGCCCGTCTGTCTTTCTCATCAT
-ATGCGCCTCGTTTTGTCGCTTTTTCTCCATTTGCCCTTCCTACATGGGTA
-CCTGCGGTTTTCATCGAAAATATCCTTAAAAATTCCGAAAAACCTCTATT
-TTTCGATTTTTGAATCGATTTTCGCCCAAACATAACCATTTTTCAGAATG
-AAGGAAGAACAAATCGCCTATAAATTGCCAGGGGCTTGGTATTACGAGGA
-GGACACTGCCTCGTGCTCTCCAGTCAGCGATCCGGAGGATATTGCGCAGT
-TTCTCAACTACAGAACGTCGATAGGCGTGCAAAATGTCACAGAGTCCGTG
-GAAGTTCCGACGTCGGAGCATGTCGCCGAGATTGTTGGTCGTCAAGGTAA
-AAATTGCCTTTTTAGTCAAATCTACAGTTTCCACAAATTTTCAGGCTGCA
-AAATTAAGGCACTGCGCGCCAAGACCAACACCTACATCAAGACACCGGTT
-CGCGGAGAAGATCCAATTTTCGTGGTCACCGGACGCCTGGAGGACGTGAA
-CGAGGCGAAACGAGAGATCGACTGCGCCGCCGAGCACTTCACACAGATCC
-GTGCGTCGAGAAGACATACACAAGGTAGGTGACCGTAGGCAGCCGGTTCC
-TGAGCGCCTTGTTCAGTTGTTCCAGGAGCCCATGCACCTGGACAGATCAC
-GAGCTATGTCAGAGTTCCGTTAAGAGTTGTCGGACTCGTCGTCGGACCGA
-AAGGAGCGACTATCAAGCGAATTCAACAGGACACCCACACGTACATCATT
-ACGCCGAGCCGAGAAAGGGAGCCCGTTTTTGAGGTAATTTTGTTGGAGAG
-CATAGAGTTTTGGAGCAAAATTCTCAGCAATTTCATGCTTTTTAACAAAA
-ACAGAGAAGTTTCTAGTTTCGGCTTAGAAAATACTGAAAATCGGCTTTTC
-CATGGCATATATCGTGCTGAAAATCTACTTTTGACTGAAAAATTCAAGTT
-TATGACTAAGAAAAGTTAGATAATTAGACCATGCTATTATTTCATAATAT
-TGGTCCAATTTTTGTTGCTTTGCTGAAAATTAACAAAATTTAAAAATCGG
-CGGGGTTTCTGAAATATTTCTGTATAAAAACCGATTTCAACTCCAATTTT
-CCTCGATTTTTACATATAAGTAATCTAGAAAAATTGTAAAATGGGGAGAA
-TTCATAAGAAAATCGGCTGTTTTGTAGCAAAGTTTGTAAATATATCATTC
-TGAAAGTCTCAGCGATAACCGTGATTCTAGAAAACCTCATCAGGATTTGA
-TTTCTGCGACACACTTCTCTCGAGTTTTACATAGAAGTTGTTCATTACAA
-ATTTCTATTTTTAAGGTCCCCATTACCATTGTCAATCTTTCATTCCGATT
-ATTTGTTTTTCCTCGTCACTGCAAGAAGGGGAGCCTAATGCCTAGACAGA
-GACAGAAAACACATGTGTGTTTGTAAGTGTCTGGTGTGATATACCCAATT
-CTTTTCGGCCGTCTCTTGTTTTCTTCCTGACACCGAGTTTCGAGCGATTT
-TCGAGGTCGTACAGTTGTGAATTGGCTGCCACTGCTGTGGCAAACAAACA
-AAAACAATCAAACTTGTGCGGAATTGATATTCTAAAGAGAATAAAGAGCA
-ACCATGGGCGCCGAAACGAGCAGCGGAAGGGCTTGTGACCTCTTGGTGTG
-AATTTTAAACGGTTTCCTTCCATCCGAAATGCTAAAAATTCCTCGGGAGC
-CGTTTAGGGTCTTCACTGAGAGATGATGATTAGAATCTTTTAATTTGGTA
-GAATTCCCCCCGCGGGACCGATTAATGTTGCATGTCGTCTTCTTCTTCTT
-GGCAGCAAAATATCATTGTTGATGAGATATCTCAGTTTGATGCTCAATGA
-CGCCTTGAGAAACATCCAGCACACAGTAGATTAGTCGAATTACCGATGGA
-TGGGGCCGCCCGGGTTTTTGGAGCCAAGAGTCACGCGATGGGGAGTCCAC
-ATACACACGCACCAACTCTTTCATTCCATCTAACAGGGTAGTAGGGTGAA
-GAAAAGGGGGGGGATCGCGATGACAAAGAGACTCAATTAATTAAATGACC
-GGGGCGGGCGCCAAATTGCACATATGCTTGGTTTTATTGCACCGTTGGCT
-CAGGGAGAGCAACATTTTGTGGCAGCACCAGGGGTACTTCAAAATGACGA
-ACAAAGGTCGTTGTTGTTTCTATAGGAAGGCTTCCGAACTTTTGAACAGT
-AATCAGATCATATTAGGGTTATGTAATTGACGGTTTTGACCGTATGTGTC
-TATAGATGCGTGTGTGTGTGTGTGTGTGGCGACATAAATTACCGTATCCG
-CATGGCCTTTTTCCTCCTTCCTCACAATGGTAATTATCATCCCCCACTAC
-TCTGGGTCGCCGGACGAACTGTGAATGTGTTGACAGTGCGGGCCCACTAG
-TACATGACATCTTGCCCCGGTGCGGTGCGCTCATCGTTATTCCTCCCAAT
-TTAGTTGTCCGTTTGACACAAATGCCTCCGGTACCCTGGACGAGACAAGG
-AGGTGATGGATTTGCCAGGCGGGGAAGGAATTACATGATGTTTGGGAGAA
-TATGAGGGAAAGGTACAGAAGCTTCACCTCGGATATTATATGCGTTCTAA
-AAAGACCAATTGTCGTTTTTGTTCGTGGCTCAAATGAATAATTGGTATGG
-AAATATAGAAAAATGTCCGACTAGTTTGGTAATAGAATTGTTTCGTTTTG
-AACATTTCAAAAATACCTCAAATAGTGCACTTGAGATCTTTGTTGAATTT
-TCAAAGGTTTTATTTTCAGATAAATTGAGCATTTTCCATACTTATAAAAT
-CAATTTTTGGTTCAAAAACTTCTAATTTTCTCACCGAAAAAGTTCTCACA
-AGACAGTGACAGAGGTCGCGTGTCGTTTTGATATCCATCTCGATAATCAG
-AGATTGTGATCTATGCCTCAATGACACAGTTCCGCGAAGGAGTCCGAGAA
-AAACGTACAAAATTGGGGAAAAATATTGGAAATAACATTTATTGAAAAAT
-TAAAAAAAAAACATAAACTATTTAAATTCACAAAAATTCGGAAGCATATT
-TCCTATAATGAAAACAAAAAATTCTGAAAATGTGTACTGCACAACATATT
-TGACGCGCATAATCTCTTGTAGCAAAAACTACAGTAATTCATAAAATTGA
-CTACTGTAGCGCTTGTTTTGAGTTACGTGCTCTACGAAATGAATTTAAAT
-AATTTATCGATGGAAAAATAATTTTAAGCAGAAAATGAGAAAATAATATG
-AAGAAACAAAAAGAAATTCGAGTTACGTGCTCTAAGAAATGAATTTAAAA
-AATTTATCGATGGAAAAATATTTTTAAGAAGAAAATGAGAAAATAATATG
-AAGAAACGAAAAGAAATTCATTCGAAAATCGAGCGCGTAAATCCAGAGCT
-ACAGTAATCAGTGAAAGAATTACTGTAGTTTTCGCTACTAGATATTTAGT
-GCGTCAAATATGTTGCGCAATACACATTTCTGGAATTTTGTGTTTCCGTA
-ATAAAATAAGTTTTTTGCGAGAACTACAAAAATATAACTATTTCTATTCC
-AGGTGACCGGCCTCCCACATAACGTCGAGGCTGCCCGCAAGGAGATCGAG
-ACGCACATCTTCCAGCGAACCGGAAATCTTCCAGAAACCGACAATGACTT
-TGCCGGACAGTTGGCCGGTGTCTCGTTGATGGTGCAGAAGCAGCAACAGG
-CTCAACAACAAATGCAGGAGGCTCAGCAACAATCGATGTTCTATCGAAGA
-GCATTCGGCAACAGTAATCCGTTCAATCAGAAGGAGATGTCGTCGTCGCC
-ATTCGGAATGGAGAGCTCGTTGGGATTGGACGCGTTGCTCCGCAGTTTCC
-CATCGATGCGTAGTTCGTTGACTCCGGAATCTCTTTCCGGTACTGGACTG
-TCTTCTCGTCCATCGTTGGGAGGAGGACAATCGGCGAAACAAGATCTGCC
-AACCTACGACTACTGGGGAACCAACAACTCGCTTAATGATATTATGGAGA
-ACGGTAAGCTTTTTTTGCGAATTTTAATAAGAATTTTAAATGACAAATAA
-GGATTTTTCAGAAATTCTCAGCCGCAAGTACGATGCCCTGTCCGCATGGT
-CGTCGATGGGATTGGAGAAACGCGAGGAATCCCCAACCAATGGGTATATA
-TTTTTGAAGGAATTTTATAAATTTTTGAAATAAAACTAAAAATTGCAATT
-TTCCTTCAAAGTTCTAAATTTTTGAAAGAAAATTTGATTTTCCGCTAAAA
-AATTTAAAAAAAAAACAAGTTTTCGTGTTTTCCACTCGGAACCTGACGGC
-TTCTTATCAATTTTTTAAATAAAAAATAACGTTTCTAAAACTCAGAATGT
-TTAAAAAATTTCACATTAAAAAATTATTTTTCCGAAATCTTGAACCTATC
-CGTTTTTGAAAATAAAAAAGAGTAAAATCGTAGTTTTCTCTATAAAAATT
-ATAATTTTCATTTGAAATTCAAAAATTTTTAAATAAAATTGGATTTTGTC
-CGTCAGAAATCTATAAAAAGAAAATTTTTTTTGAACAATAAAAGAAAAAT
-TGTAATTTTCTTTTGAACTTCAAAAAAATATGTTTTTTTTCACATGCAAA
-AAATTGATTTTTTCAAAACCTCGTTTTTGAGAGAAAAAGGTGAAATTCCA
-ATTTTAAGAGGTAAAGTTAAATTTATTTATTTTATGAGAAAAACTTGAAA
-TTTAAAGGAAAATTACTGAAATTTACAATTTATCATACATATTTTTTAAT
-TTCGACATATCTCGAAATATCAAGTCGTAAATTTTTTCCACAAAAGTGTG
-ATATTCTCTTTAAAAACTAGAAAATTTCAATTGTAAATTTATGAAAAATC
-AAATTTTTTGCAGGCTCATGTCCTCCCTCAAAGGAACATCCGCCGGCTTC
-GGTCTTCTCAGCACAATCTGGTCTGGCGGAAACATGAATCTGAGCCCAGG
-ATCGTTGGCTTCAGCATCTGCCTCGCCGACTTCATCGACCTGCGATCACA
-ACGATCATACTCTCGTGCCGATCAATGGATAAGCTGTGGATCCATTCATC
-ATTCCATTACTATCGTGTAGACTCTCATCTAGCAAAAACCCATCCTCAAC
-GAGTTCCAAATTCATCTTTCCATTCTTTAAAAGACTCTTTTTCCCATTTT
-CTACTTTGTTCATCGGTGTACGAGTCCCTCCATTCCCATTTTCTCACCTC
-TTTACTACATTACTAGAACACACAAAAATCACCATCATTCTCACCCCAAA
-ATCCTAGACAAAAAAAACGAAAAAAATCACATATATTTATATATAACTAT
-TATTATTTGTTATTCATATTTTTGAAATATCTATATTATATATATTTATA
-TATGTAACCCATGCAGTCCCCCAATATATATTCCTACAGTAGGTTTTTTT
-GGAAAATCTGTAACTTTCTCTATTATTCTTTTTTGCATTATGATAGGACG
-ACCAACTCATGTTTTAAACAAAAATTATATATATTATAAGGATTTCCTCT
-TTTCTCTCTATCTCTCACCTAGTGTTTAACTCCCAATTTTCCCCCTCTCT
-ACTACGCACAACTAACGGAGAATTGAGAGGCCTTTTATATTTATAGCACC
-TCTTTATAATTAAAAACTCGAGTGATCCCCACCTCACCCATCAAATTTAT
-CGTATTTTGTAAAAGTTCTGATATATTCCACAGATTTTGGTGTATGTGAA
-TGAAGCGATTCGTGTCGTCTCTCCATATTCTGGTATCCATAGCAACTCCC
-CGAGCTTTTGGCTCACTCGCGCACGCCCTATACTATACCTTTACTATTAT
-TAAATGCACTCAACAAATCCTATCCTGCGTCAATTGGCCGATCAATTGTC
-CGAATTGCCACAATATGCACCATTGCGGGTAATAATAGCACAATAGTTGA
-ATATATTAATAATTCAAAAATATTTATTATATTTTGAGGTGTCCCATTGT
-TTCAGACATATATCCGCGCGACGATAAGTGCCACGTTGGGGGAAACGCCA
-AAGAAAACGAGTAGGGATTTGACGTATAGAGGTGAAATTTTTAGAAAATT
-TGAAATTTTCTGAAAAAAAAAGGATTTTTCTTTTATGAAAAATGCTCTTT
-TCGCCAAAAAAATCACAATTTTCGACTTAAAAACTTCAAAATTTTTTCAG
-GAACACACAATTCAAAATACAAAATATCTCGTAGCAAAAACTACAGTAAT
-TCTTTAAATGACTACTGTAGAGCTTGTGTCGATTTACGGGCTCAATTTTA
-AAATTAGATAAAAATGAGAAAATAAAGACACGAAGAAACGAATGAAAGTG
-TAATATCGAAAATATTCGAAAATAAATAAATTTCAAAAATCGAGTCCGTA
-AATCGACACAAGAGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCG
-TTACAAGATATTTTGCGCGTCAAATATATTGTGCAATATGCATTTTCAGA
-ATTTTGTGTTTCCGTAATAGGTAAAATGTCAGAAAATCAAGGATTCAGTG
-CAACCCCGCGTTCTACGGGTATTTTGGCCACGGCCACTTTTTGCAAAACT
-GCAAAATAGGCGTTGTTATTTCATTTTCTGAAAAAAACATTGAAAATTAT
-TATCGAGAAAGTACGATCTGACAAATTTCTCATAATTTATTTTTGATCTA
-CCTGTTGAACTTTACTCCGCCCCCAATCTTGTTGCCGTTGTTATTTTGTT
-GTAGCTGTCTTGTCGAAGGACGGGGAGGAGCCTAGTCAACAAGGTAGATA
-AAAAATATATTATGAGAAATTTGTGCGATCGTATTTTTTCGATTATATAT
-ATATATATATCTTCATGTAATTCTCATGAAATCTTGAAAAAAAACGCGAC
-ACATGGTATTACCACGCCCACTTTTTATAATTTGAGCGCGTGCAATTTTT
-TGTCGATAACATAGTTTCTATTTAAACAAAAAACATCGTGCGCCCACATT
-GAAGAAAATCCTATAATTGGGCGTGGCCTTAACTCTGAAAATTTACAGAA
-CGTGTCACCCATAGCATGATTGCCGATTGGCTCGAGCAGAATGGATATCC
-AATATCATCTCAAGTCTTGAAAACAGAAATGTCTGGAAACTACATGGAGA
-GTGCAGAAAAACACGTGGAAAATGGGGAAAAAATCGATAATCTATTGCGA
-AGTCAGCTGAAAATCGATATTCGCGATGGCACCGGTGACGATTTTGAACG
-AAAATCGATAAAATCGATTGGCGCCGGCCGCCCGTTTGCAAAAATTAATA
-TGGTCGATAAACAGCGAGCACCGTTGAAAATTACACCGCTTAGTGATGAG
-GAATTTCGAAAAACGATGCGGAAACGGATGGAAATGGAGAGGGAACGAGT
-GAGTTGCGTTAAATAATTTTTTTTTGAAATATTTAACAAAAGTCGACAAG
-GCGATTTTTTAAAATCGATGTTTCGCGACTTTTATTCAAAAGAAAAATTT
-CAATGCCCTAAATCACTCAAATGATGATTAAAAAAGTATTTGCGCGCGCG
-CGTAAAATTTAGTGCCAGCGTATGACACTATGTGGTGCAAACTTCACTCC
-GGGTCCGACACTTTTTGGATTTTGCGCATCGCTATAAAGATTTCAGATCG
-CGGCGTGAGAGCGGCGTTTGCGGCGCCGACATGAGAGTCCTACTTTCCTA
-CTTTTCTTGGCAAAAAAATCGATCGATTTTTCAGCTCGCACGTCTATCCA
-ACCAGGCAGAAGACGATTCCGACGATTCATCGTCCTCCTCCGACTCTTCC
-ACGTCATCCGCGTCGTCATCTTCCGAGGAGAAGTTGACTTTTTCGGATAT
-CTTGGGGAAACCCACAGCAGCTGGCGCGGAGAAAATGATCGAACTAAGCC
-AAATTCCCAACGCATGGGGTCCGTCAAAATCCGCGTTAGTCACTGATGAC
-GTGGCAAGCACTTCTGACCCACTTCCGGCGATTTTCAACGCACATCTTCC
-GCCGCTCTCCATGGGACGACCACCGCTGACAAAAAGCGCGAAAAGTCGGG
-AAATCGACGCCATTTTCGGCTCGGATAACGTGGATTATGATTTAGAGGAT
-TTCGAGCAGGATGGCGTGGCGAAGAAAAAGTCTATACTGCCTATGGAGAA
-AAAGAAGGAGGAAGCGAAACCAAAGGAACAGGAGCTAGTGGAGCCGTTGG
-TCTTGTCAGAAGGTAACTTTGAACTTGCACCATGCAAAAATTTCGAAAAA
-TTATGCACGTGGTCACTGGCTGTCCTTTTGCATAAGCTTGAAGCAAACGC
-GCCTCATTGAGAATTCACGTTTGCGCCAACTCTCGCTATCCATTGGGCGT
-GAGAGACGCAGATACTACTTTTTTCTCTGAACGTGAAAAACGCAAAGAAT
-AACCGTTTTGCCGTCTGCATCTCTTCTTTCACACGCTATTTTGGCTGTGG
-ACGAGGAATTCTCCTCTTCCAGGATTTTCTAGGCCATTTTCTCATATTTC
-TCAAGTTTTCTCGTCCGCGAGAAAACGTGAATTTTGAGACAGCCAGCGAG
-CACGTGATTATGCAACTCTCCTAAAAATCGATCATTGTTCCTGTAGCTTA
-TAATTTTAAAGGCGCATATTCCGCTTGCGGAGCAAAAGTAAAAAAAAAAC
-ATGCCTCTACATACAAATCGATGAATTTCCTGAAAAATCAATAATAAAAA
-ATTTTCAGGAGAATCAATCGACGAGCTTGAAGATTTCGACACCGGTCTAC
-TATCTTCCGGAGGATCCGATTATTCTTTTTAAAATTTTCTTCTTTTAAAA
-AATTTCTTTTGAAATAAATAAATTCTCACCTAGGAATTTCAACAATTCAA
-CTTGAAAAAAGTTCGCGCAAACTACGAACAAATGTGTGTCGAGCGGGCGG
-AGCCACTGAGAAAGAGGAGCAAAATGTACACAAAACCATATTTGAGTGTA
-ATTTTTCAAAGTTTGGCGCCGATTTTCTGTGAGAGATGAGTTTTCTCAAT
-TTATATTTGGTTATTTTTATTTTAGTTCTTACTGGTAAATTTCTGGGTAA
-GTCCTGATGACTTTGAAAACGAAAAAAACTCTTTCATTGATGCTAGTGCG
-ATTGCTAGGAAAGCAACTTTTCAGTTACCAAGAAAAAGTCCAAGGCCATA
-GGGATTAGCTGCGTGGCATAACAACTCATCCATCCTCGCAGATGCAAATC
-CGCTCTATTGGCAAATAACATGGAAGAGTATAAACATTTTCTCTTCCACA
-CGGAAACCTAGTCCCCTTGGGGAGCGGTAGTGCCCACAACCCCGCATGTT
-TACCAAACTACACAGACAGCGCTATTGTCTGCAAGTGGCAAAAAATGGCC
-GCCGAAAATTTTTACAATGTAAATAATTTTCAAAGTGTTACTATTTGCAC
-CTTTTTGGCAAAAATTCCATAAGTAAGAAATTTGATGGAAGAGATGCGAG
-GTGCGGGGAGTCTGAAAATGGCTGCATGGCCTGTATGTGACCTGTGTATG
-TGGCCTAAAGGTCTAGTTACCCCTAGAAATCAAAGTTCAGTTCAGCAAAG
-AGACTTTATTTTCAGCACTCCAACAAGAGGCAGAAACTCAACGGTACGAC
-GGATGGTACAACAACCTGGCGAACAGTGAATGGGGTTCTGCTGGTAGGTT
-TTTTTGGAAGAGAAATGACGTCACACTGACCTACTCCTTCAGGAAGTCGG
-CTGCATAGAGATGCACGTTCCTACTACTCAGACGGTGTATATTCAGTGAA
-TAACTCACTTCCGTCCGCCCGTGAACTCTCCGATATACTATTTAAAGGAG
-AGTCCGGTATTCCTAATACAAGAGGATGCACCACTTTATTGGCATTTTTC
-AGTTTGTATTTTTTTAATACTTATAGTAGCCAATGTTTGTAGGTCAAGTA
-GTTGCTTATGAAATAATGCAATCAAATGGAGTATCCTGTCCACTAGAGAC
-ACTTAAAATTCAAGTACCCCTATGTGATAATGTATTTGATAACGAATGCG
-AGGGGAAAACTACAATCCCATTTTACCGTGCAAAATACGACAAAGCAACT
-GGAAATGGTCTTAACTCGCCTCGAGAACAAATCAATGAACGGACTTCATG
-GATTGATGGATCATTCATCTATGGTACCACCCAGCCATGGGTGTCCGCAT
-TAAGATCTTTTAAACAAGGACGGTTAGCTGAAGGTGTACCTGGATATCCA
-CCACTTAACAACCCACATATTCCATTGAATAACCCCGCTCCGCCACAAGT
-ACATCGATTGATGAGTCCAGATAGATTATTTAGTGAGTTCATTGTTCTAT
-AGAAAAGTATAAATATTTAAAATTGAAGTGTTGGGAGACTCGCGTGTGAA
-TGAGAATCCTGGTCTTCTTTCATTTGGTCTGATCCTCTTCCGTTGGCATA
-ACTACAATGCAAATCAAATCTATCGAGAACATCCTGACTGGACAGACGAG
-CAAATCTTCCAGGCAGCACGTCGTTTGGTGATTGCATCTATGCAGAAGAT
-TATTGCATATGACTTTGTTCCAGGACTTCTAGGTTACTCAACTATCATTT
-AATAGCTTAAACTCAGTGTTTCTTTTAAGGTGAAGACGTTCGTTTGTCAA
-ACTACACCAAATACATGCCACATGTTCCACCTGGAATCTCGCATGCTTTT
-GGAGCAGCCGCCTTCAGGTTCCCTCACTCAATTGTGCCACCAGCAATGCT
-TCTGAGAAAACGAGGAAATAAATGTGAATTCCGGACGGAAGTTGGTGGAT
-ATCCTGCATTGAGATTGTGCCAGAATTGGTGGAATGCACAGGATATTGTG
-AAGGAGTACAGTGTGGATGAGATTATTCTTGGTTAGTTCATACTTGAGTG
-GTTATATAATAAAGATTGTAATTTCAGGAATGGCAAGCCAGATAGCTGAA
-CGAGATGATAACATAGTAGTCGAAGATCTTCGTGATTACATCTTCGGACC
-AATGCATTTCTCTCGTTTGGATGTTGTTGCTTCATCAATAATGAGAGGAA
-GGGACAATGGAGTACCACCGTATAATGAATTGAGAAGAACATTCGGACTT
-GCACCAAAGACATGGGAGACAATGAATGAAGATTTCTACAAGAAGCATAC
-TGCAAAAGTGGAAAAGTTGAAAGAGTTGTATGGAGGCAATATTTTATATC
-TGGATGCTTATGTTGGAGGGTAAGCGTTTTTTATAAATTAAGTTAGAGAT
-CCTCCAATATACCCTCATAACATATTGTATCAGTTTACTTCATCAATAAT
-TCAGCTTGAACCATTTAGAATGCTGGAAGGAGGTGAAAATGGGCCTGGAG
-AGATGTTCAAAGAAATCATAAAGGATCAGTTCACCCGTATTCGAGATGGA
-GATCGATTCTGGTTTGAGAATAAACTAAATAGATTATTCACTGATGAAGA
-AGTTCAAATGATTCATAGTATTACACTTCGTGATATTATCAAAGCAACAA
-CCGATATCGATGAGACGATGCTTCAGAAGGATGTGAGTTTATTGTAAACA
-CCCGTTGGTGATGATCGAGTAAGTTAATAGCATGTTTCATTCCAGTCATT
-GATTGATATTTTGTCATGAATTGTTATATAACAATATATGTATGTATTAT
-ATTACTCATGTCTCAATATTGCATTTAATTTCCAGGTATTTTTCTTCAAA
-GAAGGTGATCCATGCCCCCAGCCGTTCCAAGTGAATACCATTGGACTTGA
-GCCTTGTGCTCCACTTATTCAATCCACCTACTGGGATGATAACGATACTA
-CTTATATCTACACTCTAATTGGTTTGGCGTGTATTCCTTTAAGTCAGTCT
-TTATTTCAATCTAAATGACTACCGATAGAGACTCAGCGATTATAGAGTTG
-ATCAAGCTAAGAACTTTCAGTTTGCTATAGTATCGGTCATTATATGGTTG
-AACGACGTATCCGAATAGGTCATAACAGTGCTTGTGACAGCTTGACTACT
-GACTTTTCAACAGAAAGTCCCAAAGTTAATGTCTACAAAGTGAATGGTTC
-GTTATTTTTTCATACTTGATTTTTATTTAAATTATACGGTGAATCTGTTA
-CAGCTTTGGAATGGCTTCAAGAAGAGTACATACGGCAAGTTCGGATAGAA
-ATAGAGAATACCACGTTGACAGTGAAGAAGCCACGTGGTGGAATCCTTCG
-AAAAATTCGTTTTGAAACTGGACAGAAGATTGAGGTATTCCACTCTATAC
-CGAATCCATCAGCAATGCACGGACCATTTGTACTTTTGTCTCAAAAGAAT
-AATCATCATTTGGTGATAAGATTGTCGTCTGATAGAGATTTATCTAAATT
-TTTGGATCAAATTAGACAGGCGGCTAGTGGAATCAATGCAGAGGTTATCA
-TAAAGGATGAGGAGAATTCTGTGAGTTTACTTCAAGAAATACGTCGAATC
-TGGAAATTATTTCAGATTCTCTTGTCCCAAGCAATCACAAAAGAACGCCG
-TCAAGACCGACTGGACCTGTTCTTCCGTGAAGCCTACGCAAAAGCATTCA
-ATGATAGTGAACTTCAAGATTCGGAAACTTCATTTGACTCATCGAATGAT
-GATATATTAAATGAGACAATATCTCGTGAGGAATTGGCAAGTGCAATGGG
-AATGAAAGCTAATAATGAGTTTGTGAAGAGAATGTTCGCGATGACTGCAA
-AACATAATGAGGATTCGCTCAGTTTCAATGAGTTTTTGACAGTATTGAGG
-GAGTTTGTTAATGGTGAGTATGATTTACTAAAGTTCTGATCACAAAAACT
-ACACGTGAATGAATGTTCCAGTCCGTTTTACACTAGGTTCGGTAAATATG
-TATAATGTTATAGTGACTGTTACATGTTGAAGCAGTAGTCTTCTTTTCTT
-TGAATGGCAACAAAAAGGCTCCCTCATTATTTAAGCTGTATTTCACTGCG
-AATAACGGCTTAATGTGCTATTTAAACATTCGGGTCTATTAGTCTTTTAG
-TATATTGTCGCGCATACTAAGGCTCGCTTTAATAATCAGTTTGAAACGCG
-AATTTGATGGTGTTAAATACGATTTTAATTTGGGAATTGTTCACAATTAG
-ATGCTATCTTGACTAATAATAATTAAATACAGAAACAAAAAACTTTTAAT
-GGACAAAAATCACTCCGAAACTACCCAAATCGGCATTAGGTTAATGTCTT
-TGATTACTCACCTTCTTTCCTAATTTCCAGCTCCTCAAAAGCAAAAACTG
-CAAACTCTATTCAAAATGTGTGATTTGGAGGGAAAGAACAAGGTACTCCG
-AAAGGATCTCGCAGAACTCGTCAAGTCCCTCAATCAAACCGCCGGAGTTC
-ACATTACCGAAAGTGTGCAGCTTCGATTATTCAATGACGTGCTGCACAAG
-TCTGGTATACATCCCTGTTTAGTATGCCAAGTATTATAAGAAGTTTCAGG
-AGTAAGTGACGATGCGGAGTACTTGACTTGTAATAATTTCGACGCATTGT
-TCTCGGAGATCTCTGACGTCCAGCCGATCGGTCTGCCATTTAATAGGAAG
-AATTATAACTCACATATCAAGGAGTATGTTGTTGAATTCAAATCCGCAAG
-TAAATACAAACTTCAGGCCATCATGCCACACCTCATTCCCAATAGTGGAC
-CACTCTACTCCTGCTCCACTTTCTCTGATTCAGAGAATTTGTGCATTCCT
-GGAAACCTATCGCCAACACGTCTTCATCATCTTCTGCTTTGTCGCCATTA
-ACATTGTCCTTTTTTTCGAACTTTTCTGGCGTAAGTTTACTGTTTAGTTC
-GGTTTTCAAAAGCAATATTCAATTAAGATTCCCGCTACCTAAACGAAGAT
-CGAGACCTCCGTCGGGTGATGGGTGCCGGGATCGCTATCACTCTCTCTTC
-TGCGGGAGCCTTGTCATTTTGCATGGCGTTGATATTGCTCACAGTTTGTA
-GAAATATTATAACACTGCTTCGAGAGACAGTTATTGCGCAGTATATTCCA
-TTTGACTCGGCTATCGCGTTCCATAAGGTAAGAGCCTCTCTCTTGGCCTA
-GCGCTGTAAATAAAACTGCCAAATTTTTAAACTCCATCAATTTCAGATCG
-TCGCATTATTCACCCTATTCTGGTCTACCCTTCACACCATCGGCCATTGT
-GTTAACTTTTATCACGTTGGAACTCAAAGCGACCGTGGACTTGCTTGTCT
-CTTCCAGGAAACATTTTTCGGGTAAGCCCCACCTACTCGGTAGATCTCTC
-AGTAGATTGAACGTTGGCTTGCTTTCAGATCTGACGTCGTGCCTACCCTA
-AGCTATTGGTTCTATGGAACAATTACTGGGTTGACGGGAATTGGATTAGT
-TATTGTTATGAGTATCATTTATGTGTTCGCATTGCCAAAGTTCACTAGAA
-GAGCATATCACGCGTTCCGGCTGACTCATCTTTTGAATATTGGGTTTTAT
-GCACTCACTATTCTTCACGGACTTCCTTCACTTTTTGGGGTAAGGCTTAA
-TTTAATTTGATTCATTTACGCTCTTTTTACGCTCTTGACGTCAATATTTG
-TTACAGTCTCCCAAATTTGGCTACTACGTTGTTGGACCCATTGTCCTTTT
-TGTAATCGATCGTATAATTGGGTTGATGCAATATTACAAGTCGTTGGATA
-TTGCCCATGCAGAAATCCTTCCATCAGATATTATATACATCGAGTACCGT
-CGTCCAAGAGAATTTGAATATAAATCAGGACAATGGATTACTGTATCATC
-ACCATCTATATCATGTACCTTTAATGAATCTCACGCATTCTCGATTGCCT
-CAAGTCCACAGGATGAGAATATGAAGTTGTATATAAAAGCAGTTGGACCA
-TGGACATGGAAGTTGAGAAGTGAATTGATAAGATCATTGAATACAGGGTC
-ACCATTCCCATTAATTCATATGAAAGGACCATATGGTGATGGTAATCAGG
-AATGGATGAATTATGAAGTTGCAATAATGGTTGGAGCAGGAATCGGAGTG
-ACTCCATATGCATCCACGCTTGTTGATCTTGTACAAAAAACATCAAGTGA
-CTCGTTTCATAGAGTTCGATGTCGTAAAGTATATTTCCTATGGGTGTGTT
-CGAGTCACAAGAACTTTGAATGGTTTGTGGATATGCTGAAAAATGTTGAA
-AATCAAGCAAAGCCGGGAATCCTGGAGACACACATATTCGTCACTCAGAT
-GTTCCATAAGTTTGATTTAAGAACTACTATGCTTGTGAGTTTTTTATGCG
-TTTTTGGTTTTTTAGTGGTATAACTCTAAAACTAAATGTTTGGAGAAAAA
-GGCTTAACTAATAAAATGTTGCTCATAACTTTTTCTATGCAATAAAATAT
-GTTTCAAAATTTCATCCGAGATCTCACAAGTCCAAATTTGATTATTTTTC
-TTAAAACGAGTATATTTCAAGACCGAAAAGTTTTCTTGAAAAAATGGTAT
-ATTTTTTGCACATAATCATTTTTTCATAAAGTGCTCTGCAAATCAGAAAT
-TAAAGTTCGAACAGTCTTATAGTTAGTACCGTGACATTTATTGTAACTTA
-AAAAAAAAAATTACGCGACATAGAAACGCTCGATTATCTGAAAAACCAAA
-TTGGATTTTGATTCTAGTTAATTTATTTTCAAAAATAAACATATTTTGTG
-ATAATTGTAAACTAAAAACTATACCTGAATATTTTTATAAATTTTATGTG
-GTTTTTGGTTTCAGGATTAAAACAATGGTAAAATACTACCCTAACGGCTT
-ACCCAAGGCTCAGAAAATTGTAGTTAGTCTCAACAAATTAATACATATCA
-TTTCTTATTTGCAGTACATTTGCGAGAAGCACTTCCGTGCCACCAACTCA
-GGCATATCAATGTTCACTGGCCTACACGCTAAGAATCATTTCGGACGGCC
-CAACTTCAAAGCTTTCTTCCAATTTATTCAGAGTGAACATAAGGAGGTTA
-GTTTCATGGTTTTAACCTCTAAATAAAGCAAATTTGCAGCAATCCGAAAT
-TGGAGTGTTCAGTTGTGGACCTGTAAACTTAAATGAAAGTATAGCTGAAG
-GATGTGCAGATGCCAATCGACAACGAGATGCTCCGTCATTTGCACACCGC
-TTTGAAACTTTCTAATCTTTCTACTGTTACTTACTATGAAAATCATAAAA
-ATTAAGACGCTTCATGAATAAAACATTGAGAAAAAAAACCTGAAATAAAG
-AATTTTCACATTTGTCCAGGTAGTATATATCCCCAATACAAACATTTTGA
-GACGCGAACCTTCCCAAATAATCATCAGACATTGTTCTGTAATTAGGCAA
-AAAACCAGCCCCCTAGCCTCCTCCCTCACCACAAATAAAACCAATTCCCC
-CATTTCCCCCCAGTTCATTCACCAACAATGAGTTTGTTCAAAGTATACAC
-CTCGTTTTCTTTGTTTTTCTCCGTTCTATTCCTTCTCGTCGCTTTTATTG
-TGATCTATGACATTTTCGATGAAATTCGCGAATTTCAAGAAGTAATCGAA
-AAAGATGCCAGGAAGTTTGAGGTAAGGCAATATGTGGTGCAGCAATAATT
-TCCGCATTTTTCGTAGATCATACCGTTATGGGACAGTCTGACACCACGTG
-ATAAAATAGTATACTAAGTATTACAAGCAAGGTTGAAACGAAAATGAAAT
-TTCGTTTTCGAAAACGAAAACGAGAATTTTCGTTTTAAACGCGAAAAACG
-AAAACGAAAACGAAAATATCAGTTTTGTCCAATTTAATTGGTAAAATATA
-GATTTCATGAAATATTAGGTCCATTTTCGAATCAATAATAAACAAACAAT
-AGTTTTATTACAAAAAAAACAATAAAAATTAAATAAAGCAAAAGAACAAT
-AACAATAACACTTGCTGAACAACTATTCCATTAATCTAAACCAATTTTAA
-AGCCTAAAACTTTTTGATTTTGCTGTAAGAACACAGACTTGCTCAACGAC
-TTTGTAGACATCTTTCTTCTCAGCTTTGTAGAAACGCGGCCAGCTCCTGA
-AAAAACTCGTTCCGATTCAGCAGATGAAGCTGGAGTTGTCAGATATCTGT
-TCGCTATTTGAGAAAGCAATGGAAACTTAGATCGATTGAGCGGATTTTGC
-CAAAAAACAGCGGGGTCTGATTTTCTATTGTTATCGGTATCGTAGAAAAC
-TTCAACTTCTGCACTAGCACAGAGCATGGAATCTACAGGCGCTTTGTCTT
-TTCTTTTTCTGATCTTGGAATGCTTTTTCTCGTAAGCTTCAAACAGGTCG
-TCTATTCCCTCAAGAGTTTCATTTTCTGGCTCATCGACTGCTTCTTCCTC
-TTCTTTTGATAATCCTTGAGCTAAGCTCAAAACAAGCTCTTTTCCGTCAC
-AATATTTTCTTTTGTATCGTGGGTCAATGTTTGATGCAACAATCAGTTTG
-AATGTCACCAGTCGGTGCCCGCGCCGTAGGTGCGGTCAACGGCTGGTATG
-TATATAAAATATATTAGATTGAAAATATAACATTGAAAAAAAAAAACAAA
-CATTGAAACACAATAAAAATCAAAATATAGACGCTCTTTATTCTTGAATA
-AAAATAAGAATTACGAATTGTTCACTGGGAGTCAGCTTATTTCTTGTACA
-AAATAATGATTTTGACCAGTGTCAGCTCAAAAAAAATACGTTGACAGAGA
-GAGGTGGCATTTTCGTTTTTTCGAAAATTTTCGAAAACGAAAACGAAAAA
-ATCATTTTCGCCAAAAACCCGAAAATAACGAAAAAACGAAAATTCGAAAA
-CGAAAAAGTGACAAGCCTGATTACAAGGTCGGTATTTCATAATATGAATA
-TTGTAGAGAAAGGTTACTAGCGATGATTCCAAAAAAATTTAGATTCATCA
-GAGATGTACACCCAAATACCCAAGGCATAGGCCCTAATTATTGATTAGTC
-ACAACTTCTTACTTCCAACAAGCTTTTCCTATTTTTCCAGTTCTACTCCA
-CCGCCGCCTCACGTTCAATTGCCGGTCTCGACAAGCGGAGCCTATTCGGA
-GGAGCTGTTTCTTTTTAGTTGTATATACATCTATTCAAAATTAAAAGTCA
-TTGTTGTTGTTACCCATAAAACAGTGAATGAAAAAAAATGAAGTCTAGAC
-AGAAAATGTAAAGCTGGCACAGAATACTCAAAGAAGCATAAAATATGTAT
-AATAATGATGATATAGGGAAGGTTAGAACGTTTCAAAGCGATGTGCAAAT
-GAAGGAGCATCTCGTTGTCGGTTGGCATCTGCACATCCTTCAGCTATACT
-TTCATTCAAGTTTACAGGTCCACAACTGAACACTCCGATTTTGGATTGCT
-GCAAATTTGCTTTATTTAGAGGTTAAAAAGCATTTAACTAACCTCCTTAT
-GTTCACTCTGAATAAATTGGAAGAAAGCTTTGAAGTTGGGCCGTCCGAAA
-TGGTTCTTAGCGTGGAGACCAGTAAACATTGAAATTCCTGAGTTGGTGGC
-ACGGAAGTGCTTCTCGCAAATGTACTGCAAATAAGATGTTAAAGTTTAAA
-AGCTTCAGACCTTAAGATGCCACTGCGTTTAAATGCGTCCGCTTTAATCA
-GTTTATAACCAAACCTGACGTTTGATTTTGAAAATTATCTTCAATAAACT
-CACAAGCATAGTAGTTCTCAAATCAAACTTGTGGAACGTCTGAGTGACAA
-AGATATGTGTCTCCAAAATTCCCGACCTTGCTTGGTCTTCCACGTTCTTG
-AGCACATCCACAAACCATTCATAGTTCTTGTGAGTTGAGCACACCCATAG
-GAAATATACTTTACGGCAACGAACTCTGTGAAATGAGTCACTTGATGTTC
-GTTGTACAAGATCAACAAGTGTCGATGCATATGGAGTCACTCCGATTCCT
-GCTCCAACCATTATTGCAACTTCATAATCCATCCATTCTTGGTTACCATC
-ACCATATGGTCCTTTCATATGGATTAATGGAAATGGCGATCCTGTATTCA
-ATGATCTTATCAATTCGCTTCTCAACTTCCATGTCCATGGTCCAACTGCT
-TTTATATACAACTTCATATTCTCATCCTGTGGACTTGAGGCAATCGAGAA
-TGCGTGAGATTCATTAAAGGTACATGATATTGATGGTGATGATACAGTAA
-CCCATTGTCCTGATTTATATTTAAACTCTCTTGGACGACGGTACTCGATG
-TATATAATATCTGATGGAAGGATTTCTGCGTTTACAATTTCTAATTTTTT
-GTAATATTGCATCAAACCAATTATGCGATCAATTACAAATAACACGATGG
-GACCAACAACGTAGTAGCCAAATTTGGGAGACTGTAACAAATATTGAAGA
-AACTTCTTGAACCGAACAGTGGCAAAAACTCACATCCAACAACTTTGGAA
-GCCCATGAAGAAGAGTAAGTGCGTAAAAGGCAATATTGAGAAGATGTGTG
-AGCCGGAATGCGTGATAAGCTCTCTTAATGAAACATGGTAACGCGAAAAC
-ATAAATGATGCACATGACAGCGACCAATGCAATTCCTGTCAGACCTGTAA
-TTGTGCTGAAGAACCAGTAACTGATTGAAGGAAGGAAGTTGGATCTGAAA
-GTTATTTGATGAAAGTTGTTGACAGTCTTGAGGGAGTTTGTTAATGGTGC
-GTATTCTAGTAAGATTGAATGCAAAAATGAATTCAAGTAAAGTATTACCC
-AAAGAATGCTTCCTGAAAGAGACAAGCAAGACCTTCTTGACTTTGAGTTC
-CAACGTGATAGAAATTGACACAATGTCCAACGGTGTGAAGAGTGGCCCAG
-AAAGCCGCAAAGAGCGCAACGATCTAGAAATGTTCAGTTATTATAGAGTT
-TTTGATACTGGCGGTCATAATAAACAATACTTTGTCCGAAATATTAGTTT
-TCCCATTGTTTATCATAGTTTATTTTTTTATTCAAAAATCTGCCCTCTCT
-ACAGAACACTTATATGTAAAGTAGACTTAAAAACATCTGAGTTTTTTGAG
-CAACAAGAGACCCACACTCGTTCTAAAAAGAAATATATCTGGAGCACAGG
-AAAATCTAAACTTAGGAGACACTTTTTTGTCAACAGAACACTACACACAA
-TGAAGCAACACTGATCTAATGTTACCTTATCCTCACTTCTATTCATCATT
-TATTCTTGCCTTTTATACATCGATATTTGTGTTTTTTGCTTCTTCTCCAA
-TGTAGCCATTATTTTTTTTCTCATCTCTTTTTATTTTTGTTCCATTTTTA
-TTTATGTAACCACTTGTGATGGTTTGTATCTATTAATGTGTGTTTTTTTT
-CTACCTCACGATATCTTACTATCGTAATAAATTTAAAAAAATTAAACACT
-TACAAGTTTAGGATAACATCGCTATATCATAAGTTCACATCTGGCTGAGA
-AACACCATGTTCGATGCAAAGATCTTTCCTTTCATGCTTGTATTCTATTT
-TAAAAAATCTTTTCAAAACATTGGGTATGCACAGTACAGTTATCCTACTT
-GCATTAAACCTCCGCATTACTGTACAGATAATAAAATAACAAGTTTTCCC
-TTATATCTGAACATGCTAAATATTTTTAAAAACAACTGATTTGACAAAAT
-TTACTAATGCAATAATAATATTTAAAAAATGTGTTACACGCTGCCCTAAC
-GTTTCTCACCTTGTGGAACGCAATAGCCGAGTCAAATGGAATATACTGCG
-CAATGACTGTCTCTCGAAGAAGTGTGATTATGTTTCTACAAACTGTCAGC
-AATATCAACGCCATGCAAAATGACAAGGCTCCCGCGGCACCACGAGTAAT
-AGCGATTCCAGCTCCCATTACTCGTCGGAGATCCCTGTTTTCCGCCATGT
-AACGATAATCTGAAAACTAAATTAACATGAGCTCCCAATTATATGAACTT
-ACGCCAAAACCGTTCGAAGAAAAGAACAAGATTGATGGCAACAAAGCAGA
-AGACAATGAAAACGTGTTGGCGATAGGTCTCCAAGAACGCTGAAACTTTG
-TGGATCAAAGTTAGCGGTGCTGAACTGTTGATGGATCGATCCACGACGGC
-AAATGAGTTCAGAGAAGATGTTCTAAAAGTTATAATTGTTATACAGTCAG
-AGTCCTCCTGAATACTCACTCTCCAATACTTGGCTGATAGTTCTTTCGAT
-TGAACGGCAGTCCAACTGGTTGCTTGTCAGGTATATCCGAGAACAGAGCA
-TTGAAATCGTCGTAAGTCAGGTACTTGGCATCATTGCTCACTCCTGCATA
-GTGCAACACTTCATTGAATAATCGAAGCTGCACACTTTCAGTAATGTGAA
-CTCCAGCGGTTTGATTGAGGGACTTGACGAGTTCCGCGAGATCCTTTCGG
-AGTACCTTGTTCTTTCCCTCCAAATCACACATTTTGAATAGAGTTTGCAG
-TTTTTGCTTTTGAGGAGCTGGAAATTAAAGTAGGTGGTGCATAACATTTT
-TTAAAGGCAGTGTTGGTTTTTCTACTGTTCAGTAAAAGAAAATCTACAAT
-TGACTAAATTCTCAATACTTTGATGCCATATTAGTTGTGACCTCCCTGTC
-ACACGAGAACTTTCTACAGTGCTCGCAAATTCTATAGGACTCCCCCGAAT
-AAATTCAGATTCAGAATAAATAACCTTTAGAACTTTTACTATCTCGAAAT
-ATTGCCGACCATAGGACACCGAGTTTCACCTCACGGCTAATGAACCTACA
-AAATGTTAATCGGTCGCTAATCCCGGCCTAGTTTAAATTCAGATCAGAAG
-AAATAAATTTCTTTTCGCAGGAGACTTCGGCTCTCTTGAACCAAAACCTT
-TTATATGTAGTTTTGTACGTACAAAATCAAAGACAGTTCAAAACAACTTT
-ACCGCTACTGCTGTTACACGTAATTAAGCTGCATTAAGAAATTATATTTA
-TTCAATTAGAACTTATGTTAATGGGAAACACGCCGGAACATTCTAGAACG
-TAGTCTTTGTATCACAACAAATTTATGCTGAAATACTCACCATTAACAAA
-CTCTCTCAAGACTGTCAAAAACTCATTGAAACTGAGCGAATCCTCATTAT
-GTTTTGCAGTCATCGCGAACATTCTCTTCACAAACTCATTATTCGCTTTC
-ATTCCCATTGCACTTGCCAGTTCCTCACGAGATATTGTCTCATTTAATAT
-ATCATCATTTGATGAGTCAAATGAAGTTTCCGAATCTTGAAGTTCACTAT
-CATTGAATGCTTTTGCGTAGGCTTCACGGAAGAACAGGTCCAGTCGGTCT
-TGACGGCGTTCTTTTGTGATTGCTTGGGATAAGAGAATCTGAAATAATTT
-CCAGATTCAACGTATTTCTTGAAGTAAACTCACAGAATTCTCCTCATCCT
-TTATGATAACCTCTGCATTGATTCCACTAGCCGCCTGTCTAATTTGATCC
-AAAAATTTAGATAAATCTCTATCAGACGACAATCTTATCACCAAATGATG
-ATTATTCTTTTGAGACAGAAGTACAAATGGTCCGTGCATTGCTGATGGAT
-TCGGCATAGAGTGGAATAACTCAATCTTCTGTCCAGTTTCAAAACGAATT
-TTTCGAAGGATTCCACCGCGTGGCTTCTTTACTGCCAACGTGGTGTTTTC
-TATTTCTATCCTGACCTGTCGTATGTACTCTTCTTGAAGCCATTCCAAAG
-CATTTACACCATAAATATCTCCCTTCGCGCCACAATCATCATTTGCAAAG
-TCAGTAGTTAGGCTGTCACAAGCACTGTTGTGGCCAATAGCAATGCGACG
-ATTAACCAAGTATCGGCCAATTCCATAGCAAACTGAAAGCATTTTGGTTT
-GTATGGAACTAGATGCAATAGCTCACTTAATGGCACACATGCTAATCCAA
-TTAGGGTGAAAACATAAGTGGTGTCATTATCAGTCCAATAAGTTGATTGC
-ATAAATGGAACACATGGTTCAAGTCCAGTTGTGTTCACTTGGAATGGTTG
-CGGGCACGGGTCACCTTCCTTGAAGAAGAATACCTGGAGTGATAAATACA
-TTGCAATGCGGAATTCAAAAGAACATAATAATAAACCATTAAATTTGGAA
-AGTAACTTACATCCTTCTGAAGCATTGTCTCATCGATATCGGTGGTTGCT
-TTGATAATATCTCGAAGTGTAATACTATGAATCATTTGAACTTCTTCATC
-AGTGAATAATCCATTCAATTTATTCTCAAACCAGAATCTATCTCCATCAC
-GAATACGGGTGAATTGATCCTTTATGATTTCTTTGAACAACTCTCCAGGC
-CCATTTTCACCTCCTTCCAGCATTCTAAAATAATAACGTTTGATTAACGT
-AATCCAATATATGTGCACTGAGAAAGAAACAAGTATGCGTAATTTATTCT
-GCCTAGATTTGCAAAAAAAACTACCTTGCATGGGTAACGTTTGAAATACC
-GAAGGAATTGCACTATAAAACTGAGGTGACATACAACTTCCAGAGTTTAT
-GCCTGCTACAAATTTTAGAGTTTGACCAAAAGAAGCCGTTAGAAGTTTAC
-TCGTGAGAACTTTTTAACCCTTGAGAAGATTTAGTGAATATTCAAAATTC
-CACACTTCTTAAACCAATCAGTTATGTTAAAACGAATTGATTTTCATTGT
-TTTTGCTTGAAACTCTTCGAATTCACCGCATTTTAAGTTAAGCATTCCAC
-TTTAAACCCAAAACTAACCCTCCTACATAAGCATCCAAATATAAAATATT
-GCCTCCATACAACTCTTTCAACTTCTCCACCTTTGCAGTATGCTTCTTGT
-AAAAGTCTTCATTCATTGTCTCCCATGTCTTTGGCGCAAGTCCGAATGTT
-CTTCTCAATTCATTATACGGTGGTACTCCATTGTCCCTTCCTCTCATTAT
-TGATGAAGCAACAACATCCAAACGAGAGAAATGCATTGGTCCGAAGATGT
-AATCACGAAGATCTTCAACTACTATGTTATCATCTCGTTCAGCTATCTGG
-CTTGCCATTCCTGAAATTACAACCTTTATTATATAACCACTCAAGCATGA
-ACTAACCAAGAATAATCTCATCCACACTGTACTCCTTTACAATATCCTGC
-GCATTCCACCAATTCTGGCACAATCTCAATGCAGGATATCCACCAACTTC
-CGTCCGGAATTCACATTTATTTCCTCGTTTTCTCAGAAGCATTGCTGGTG
-GCACAATTGAGTGAGGGAACCTGAAGGCGGCTGCTCCAAAAGCATGCGAG
-ATTCCAGGTGGAACATGTGGCATGTATTTGGTGTAGTTTGACAAACGAAC
-GTCTTCACCTTAAAAGAAACACTGAGTTTAAGGTATTATAATATAGTTGA
-TTAACCTAACAGCCCTGGAACAAAGTCATATGCAATAATCTTCTGCATAG
-ATGCAATCACCAAACGACGTGCTGCCTGGAAGATTTGTTCGTCTGTCCAG
-TCAGGATGTTCTCGATGGATTTGATTTGCATTGTAGTTATGCCAACGGAA
-GAGGATCAGACCAAATGAGAGAAGACCTGGATTCTCATTCACACGCGAGT
-CTCCCAACACTTCAAGTTTAAATATTTATACTTTTCTATAAAACTATGAA
-CTCACTAAATAATCTATCTGGACTCATCAATCGATGTACTTGTGGCGGAG
-CGGGGTTATTCAATGGAATATGTGGGTTGTTAAGTGGTGGATATCCAGGT
-ACACCTTCAGCCAACCGCCCTTGTTTGAAAGATCTTAATGAGGACACCCA
-TGGCTGGGTGGTACCATAGATGAATGATCCATCAATCCATGAAGTCCGTT
-CATTGATTTGTTCTCGAGGTGAGTTGAGCCCATTTCCAGTTGCTTTATCG
-TATTTGGCACGTGTAAATGGGATTTCTGTCTTTCCCTCACATTCTTTATC
-AAATACATTATCACATAGGGGTACTTGAATTTTAAGTGTCTCTAGTGGAC
-AGGATACTCCATTTGATTGCATTATTTCATAAGCAACTACTTGACCTATA
-ATTATTATTACTAATTTTTGAGGTAGAGGGCAATAAAAACGAACTGAAAA
-ATGCCAATAAAGTCGTGCATCCTCTTGTATTAGGTATACCGGACTCTCCT
-TTGAATAGTATATCGGAGAGTTCACGGGCGGACGGAAGTGAGTTATTCAC
-TGAATATACACCGTCTGAGTAGTAGGAACGTGCATCTCTATGCAGCCGAC
-TTCCTGAAGGAGTAGGTCAATGTAACGTCATTTCTCTTCCGAAAAAACCT
-ACCAGCAGAACCCCATTCACTATTCGCCAGATTGTTGTACCATCCGTCGT
-ATCTTTGAAATTCCTCATTTTGTTGGATTCCTGAAAAGATAAATGTTACG
-AGTTTTTGATTTCCAGGCCACCAAAATCTATATGATGGCCTAGGTTCCTT
-ATTGAAATTTCTAGGTCACACATGCTCCCTTCACTACATTTTCACACCGA
-TTCGTGCATTTTCTCACTGAACGCGCAAATTTCCGGTCAGTAGCGGAGCA
-GAGCAAACATTTGCCCCGCCACCCGAAACAATTATTTTCGTATCATTTTC
-GCACCTATATTTATTCTGTTTGTTTGCCTATTTTTTGTACATTTTATCCT
-TTTTCTTGTATTGGGCGACGATGGCAAGGTCAGTAAAACAGGAAATTGTT
-CCTGATAACTCGGGAATTTCAGGAATTTTTCCAAAATTGGTTGGGAAACC
-ACCACTTTGTTGAAATTCGAAAGATACACATTTTGTTATTTAGGTGTAAA
-CATGAACACTTTCTTAGGTAAACTATGTGATTTTTATGAAAAAGAACACA
-GACACCGGGTGGCACACAGAGCTTATCAGTAAACAGCTATCAGTGATTTT
-GAAATTTTGGAGGGGCAGAAATGTTGCGGACAAGGAAAATTTTTGTTTGG
-AATTTGAAGTTTTGAAATACGCAATTTGAGAATTTTTGAACATTTTTTTG
-TAATTTTTATCCCATTCATTTTTAACCTAACATTTTGAAAATCTAGCACA
-GAAAATAGTACAGACACGTTCAATTGAGCTATTCCAAAAATTATCAATAT
-AGCGCACTTGGTGTCCATCTTCCTTAACTGTTTGCAATTAGTCTCTCTTT
-ACAAGAAATCAGCTACTATTTGAACAGATCTTGAACACATTTTCAAAGAT
-CGGCTCAAGATCAAAAGCCTCTTAAACATTTAAGATAGCAGGTCCGCTCT
-GTTGACAAATTTTCCACCCGGTCCTCCGAAAGGAATTTTTTTGGTCATCC
-AACAACCTAGACCATGACGGCACCGATCATGCAATTTGCCTGCTTATAAA
-AAACGATATTTCTAGGCCACCCATTTTTAAATATTTTTTTGCCTAGTCTT
-AGCTATGTGGAATAAATTCTAGGTCAGGAGGTTTTCTAGGCCACGTAATT
-CCACTCACCTTTCCCTCCAAAAATTGAACTGAACAGTATAGCTATGTACA
-GCACATGTTTTGAGCGCATTGCTCGTGCGCCTTAGAGTTTTAGTTGACCT
-GAAAATATTTGAATATTTAGAAATTGAAATTTTGAAACGCAATGATTAAA
-ACGGTCAAAAAAGATGTTATTTATACATACGCAACATTTCAAAATTGATA
-ACAAATATTTACAGGAACACTTTTTTCCAATAATACGGTGACTAAGGGGG
-AGTTTACTGATAGTAACAAATTGGAACGGTACAGGAAGAAAATTTAAAAC
-CGGCTCTACCCATTTTAGTGCTACCAGCCGACAACCAAAAAAATCAATCA
-GCCGCACACCCTGCTTGGAATGTGACAATCACAGAGTTTTGGAATTTTCC
-TAATTTCTAAAATTTAATTTTCTAAAAACTGGGGATTTTTTCTGTAATTT
-TTTTTTAATTTTAAATTATTTTTTAGGAACATTTTTTTGAAAATAACTTT
-TGTTTGAAAAATTGTTCGCTAAAAGAGTATAAATAAGATCAGGCTTCCGA
-AAATGTTTCAAAAAATATTTTTTCACGATTCTTGCAACAAAAAAAAACAA
-ATACTGAAAAAAAAATTGTAAGAAATTTATTTTGTTGAACTTTTCAAATC
-TACATTTACAACAAAAACAGTTCTTTATAATATTTTAAAATCCAAATAGA
-TTCCCAGTAGATTTTGTTTAAATATTCGGAAAACGACCAAACTTTCATTT
-TTTGAGTTCTTAAATTAAAAAAAAAATTTTAAATTAAAATTTTTGATTTT
-CAGTCTAAAAATTTCAAAAAAGAGCTTTTAGTTCTGTAACTTTTGGAATA
-AAAATTCAAAAAAAAATTGGGGGAGCCAAAAACTAACGCCTGCTTGAAAC
-CTGCCCGCGAGAACTTGCAAATATTCAATTTTCTCATTTTTATTAATTTG
-ATGAGAAAAATTTAGAAATAAAAAAAAATTTGCATAAGGCATCGATTGAG
-GCGAAAGGCAGGCGGAGGTAATTTTAAGGCCAGGCTGGCGTTTTAACTTA
-GGCTTCCATAGACCTAATATTTTCATACTTGTTGAAATTTCAGAGGTTTG
-AAAATTGAACAATTTAGGCCCAAAACCTTTGTTCCTACAGTACTACAAAA
-ATTCTTTGAAAAATTCCGGTAATAATAATTGGAGGAGGAGGAAAAATATA
-AAATGATTCTTCGTCAGACAGAAATAAATTGGTGAAGAGAAAAAAATGAA
-TTGAGAGAAAAAGAGAAAGAAAGACGGAGAGCGTCTTCGAAAGAAGGAAT
-CCTCCTGCGCGGGATCGAAAAAATAAGCAGCAGCCGGGAGTGAGAGAGTA
-CACTGCACTAGAAAAGATGCAGAGAGATTCACAGAAAATCGGGAGAGACC
-CCCCGTATGTCGGTCGAGACTGAACACCTAAGACCTACTTCATATTTCGA
-ACCGGTTCATTTTCATTGGCATTCGTATTATTATTAGTTTTGACAGGGGC
-AGTCGTCGTAGATGCTATTGTTGTCAGTTTGACGTGATGGCCGTGTCATG
-GGAAAAATTCGGCCATCAAAAATCGGGGGGTTCCTGCCACCCTTTGTCTT
-CTATGGTCGGAGAGGCGTTTTCTAGGCTACTTATTTTGGTAGAGTAGCTG
-TTAATTAAAAATTTCATCAATTTGGTAATAATGTGGCTGCAAATCATATT
-TAAATTTTCTATACAGTCAGTGCCACCCAATTAAAAATTTTCTGGCAGTG
-CCACCCAGAAAAAAAAAATATCCTAGGCCACCAATTTTTAAGATCATTAA
-TTTTTTGGCTATCAAATTAAGTAGACCACTAAAATGTTTCGTCATTAAAA
-TTTTCTAGGCCACCAATTTTGCTTGACTACTAACCTTCTTGGCCATCACA
-ATTTCTAGGCCACTAATTTTTTTTCTAGGCCACTAATTTTCTAGGCCACT
-AACAAACTGTTCAGGCCATAAAGTTTTCTAGGTCCCTATTTTTAGGTCTT
-CAATTTTTTCAGGCCACCAAAATTCTATTCCAACATTTCTCCGTCACCAA
-AGTTTCTAAGGCCTTTAATTTTATAGACGACTTCTTAATTGTAAGTCAAA
-TTGTTTCAAAACGATTATTTTCAATACATATCAAAAACCCAAAATTTTTC
-AAAAACTTAGTAAACTAAACTAAATTTCCAATACGTGCTTCATTTTTATA
-TGTAGGCGTTTAGACACCCCAGTGGGCAGCAGTAATTGTTAATTCTTATG
-ATTATCTCATTGGTACACTTTTCTTGTTCAACTTTAATTATTTATTTTTG
-AAAAGGATTATCATTGGCATTGGCAAATAAATAAAATTGTTAGTGACGTG
-GTGATATTGGACATTTTTTGATTTTAGTTTGCTTTTTGAAATTTCAATTT
-TCGGCACTTTGAAATGTTCAAAATGTTCATTTGTATAGCAAATTATTTTA
-TTAAAATTTTTTTCAAATTTATTACATTTTCAGTGAAAATTGCACAATTT
-TTTAAAACTTTCTAAAAACTGCAAAAAAATAATTAGGTTTAAATAATCAA
-ATCAATAATTTTTTAAAGGATTAAAATAAAATTATAGTTATTACAAATTA
-TTTAAAAGATGTATACTTAAAAACTACTATTTATGTTTTGATTTTTACTC
-GAAAATCCAGAAATTTTAAGTTTTCGAGAAAACTTTTTAAATTTGTTTTT
-AAAAGAGGTTTATATAAATATAATGAACCCAAACTTGAAAGTGCGAAAAT
-GTACTTAAAAGAGTCCAAAATAAGCAAATATCATCACGAAAAGCTCCGAA
-CGTTTTTAAGTTTTTCGAAATGTTCAGTTATAGTTTTGGTAAACTGCCAA
-CTTTACGAAAAATTCGGGTTTAATTTTCAATGTTTTTATACAAATATTTA
-AAACAGAGTAATAGTATAAAATTTGTAAAAAAAAATTTTTTGGTCGGTAT
-TTAAAAATGGTGATAGGTGATAGGGCCATTTTTGACAGTAAAAAAAACTT
-TTATAATTGTTTTACATTTTACCAACATAGGAGCTGCCTTAAAAAATATC
-TAAAGGCTTGGGGTTTTGCCCTACAGTCCCAAACTACCAAATATAAATGT
-AAAATTTTTATAAAAATGTTCAAAATTTTTAATGATTAAAAAAATTTGCG
-AAACTTAATCAAAATGCCGAATAATTGTTTCATTCCCGCGATTTTTTAAT
-AATAATTTTTTTGTATAATTTTTGCATTTAGTGGCGTCATTTGTTTACAT
-GTTGTGTTTTTCGGCAATATTAATAGAGGTTTTCAGAGATTTTCTAGTTT
-TTGAAGCACATTTTGCCTTGTTCCCGTAAAGAAAACTTGATAATTGGAAA
-GAAATTTGGCAAAACGGCGAAATTGACCAAATTGACCAAAAAAGTTAACA
-AACTGTATTTAAAAATAAATTATTAAGCAAAGTAAAAACAAAGAAAACCC
-ACATAAATGTCAAAAATGACGTCACTCATTTGAGCTGAAATTCAAAAAAG
-AATTCGGTCCTTCTTTTTTTTTTTCAAAACAAATTTTTCTTAAATCATAA
-AAAACATATTATAATTTTATGACTTTTCTGACAGTTATATTTGGAATAGT
-GGGACATTTACAAGGGAAGTCGAAAAACTGAACTCCGGACTTTGACATGC
-TATAGTTATTTTTCGATAAAAGAGTGAAAATAATGATCCCTCCAAAAAAT
-TTTGCTGCCGCGGACCAGGTTCAGCAAAGTTATGACGTTTTGAAAGTGCC
-GAAAAAAATTCCTTGACCAACCCAAGCAAAAAAAAACTTTCAAATTTTCA
-AAAAAAAAATTCTGAAAGTTGATAAAAACTATTGTAACTTATTCAAAAAT
-GTGAAAAACGTATATCATGCACGTTTTTTCTCCCCACGGACAAAAAACCA
-CATTGCTTGATCAAAATATCTTGAGCAAAATTCTAAAAATTACTTTTTCT
-TGTAGATTCATTTATTGGTTTTCTTCAGAGTTATGAGCTAAAACTTGCAT
-GGCATATGTTTTTCACTGTTTTGAATAATTTACAAATATTTTTTCCTCTT
-TTCAGAATTTTTTTTTTGAAATTTTTGAAATTTTTTAAAAGGGTGTTTCA
-GCCACTTTCAAAACGTCATAACTTTGCTGAAGCTGGCCCGCGGCAGCTAA
-ATTTTTTTGGAGAGATCGTTATTTTCACTCTTTTATTGAAAAATTACTAT
-GACATGTCAAAGTCCGGAGTTCAGTTTTTCGACTTCCCTTGTTAGGGCAA
-AAAATACCCACAGACGGTACTCCGCCTAAAATCAAAAAAGTTCCAGCAAC
-TCGAGATCACTTTTTTACCATCTCAAATCGTTCGGTTTGTTGGGGGGGGG
-GGGGGGGGGGCTTAAAGAAAAACGAAAAAATGAGACACTTGTTAATTTGA
-TGGTAACAAGTGAAATGGAGAGAGAAAGAGAGTGTAAATACAAGAAGGGA
-ACAAACACTTGAAAATCAAAATTGTCGGAAGGAACTAGGGGGAGGATAAA
-ATATTGGAAATTAGGTTTAATAGGATATGTATCTAATCCCGAAGAATATT
-ATTAAAATAATCGGTTCAAAGAATCTGAAAAAATCGATAAATGCGTTGTG
-TTGTCCTACTTCCGTCCTCTACACAACGTCGTCTTCTTCTTCAGGGCGCA
-TTCTTTTGTGTAACAGTGCCCCTTTTCTCTCTTGATGCCACAAAACACTT
-TGGCAGTTACGCAATCGAAAGGCGAGGAAAGCAAAACGGGTATCAGATGA
-TGATTAAGTGAAACTGGAACTGATAAGTGAGATGGATTGAAATACAGATA
-GCCGTAAACTTTTAATAACCTAGAATTTTAGTTATTAAAGGTGTTATGTA
-TGTTTCGAAATTTGAAAAGATTTTCTCAATTTTTGAATGAATTATGTTTG
-AAGTAATTTAAAATGCCGAATGAAGGGTTTCAATTTTTGTTTTTTTAAAA
-AGATTTTTCGTCCGGCCGATTTTTCGCAAAATGTTTTTTAAAATTTGGGT
-TTATGTTCTTCTCTTTTTTCATGCCTAAGCCTAAGCTAGGCTTAGGTTTA
-GGCTTACTAATCCTAATCCGAAGCATAAGCTTAATCCTAAGCCTAAACCT
-CTCCTACTCTTTTAAGCTTAATGAATGCCCTAGCTTCATTTTTTTCATTT
-TTCGCAGGTTTTTTTCTCAAAAACTCAAAAGCGATGCTACGAACACCAAA
-AATTGGTGGTTCAAAATGTGTGTTTCTATTTTTTTCAAAATTTATTTGAC
-TATACAAACCAGCTGACAATTTTCTTCAAAATTCCGTTTTTCTTATCAAA
-AATAGTCAATTTTTCATCTAGAAACTTCAAAAAACCGTTACCGTTTCCCT
-AAGTTTTGCTATCAGTTCCGTAAATCTTGTACCTTATGTCACATGGCATT
-AGAAATATTTCAATTGAACCAATCTTGTTCGCGTGGAGTACAAGTTAAAC
-ATTTATGATATGTGGATGGGTGCAATTGCGCTCTATTGAACAAACTATGT
-ATCAACAGAACGCGTTAACATTATTTGTACAGGTGGGGAAAAACAGGAAA
-AACGACTAGGCAAAACAAAAAGTATATAAGTTTTCTTCTACACGTCTCAT
-AAAGGAAATTCAAATTTTTTAGAAAAAGAGCGGGGGGGCGCGATTGCAAA
-GGTTTAGACGGCGTTAAGATCTTTGTCGACGAGTGGTTCAGCCGCTGAGA
-ATGTGATTGCCGCCGGAATATTGTCCTTCTCGTTGATTGAGTCTTTCGAG
-AAGAGCGCCAGAATGACGGGCAGAATGAAGAGACCGTGGAGGAGACCTGG
-GAGAATTTTAAAATTTTTGAGTTTCTAGGCCACGAGTGACGTCACTATTA
-TGTCCAAGAAGATATTCTAAGGACAAATTTGATGATTGTTCACTACTTTT
-TCACTAAAAATCAGCTTGAATCGTAGAAAACAAAGAACTTTCAGAAAATT
-TCAGCGCTCACCAATAGCAACGACCAAAAAAACGGTCTTAGCAAAGCACA
-CGATTGCATAAGTTGGCACAAAAATCAACGGAAGCATGCATAGGAATGTC
-GACAGTCCGGCTTCACACATTGGCATTGCCATTTCTGCCAGACTACTGTA
-GACACGTTCTTGTGGAGTGCCACGTGCACGAAAAAAGTTGTAGGCCACGT
-GAGCGGTGTAGTCGACCGAGAATCCCGTGGCGAGAAGGACGTCCACTTGG
-ATTACCGGGTCCAGGTCGGCACCCCAAAGGGAGAGACCACCGACGAGAAC
-TGTAAAAACGATTTTAAAAAAAAGTAACTTTTTCAGATTAAATCCAAGAA
-AAAAACATAATTAAAATTTGTTTCAATGGTTTTTTAAAGTGACAATTACT
-CATTTTCAGGTTTTAAAAACTTTAACTTGAAAAAAAAAAACATTTTGAGC
-TACTTTTGAAAAAGGTTCTATTTTGAATTTCCCATCCAAACTTTTTGAAA
-AAATACAAATGATAAAAATAATTGCTTTCTTAAAAAAAAATTGTTAGCAA
-CCCTACCGTTCGCTAAAGATCGTTGTCGTTTTTTCTCAGAAAATTTAAAT
-ATCCCGCCATATATATTTTCGGAGAATTTCAATTTCTCGAAAAATTGTTT
-TCTCTGAAAATTTGAATTTTCCGCCAATAATTTTTCTCAGAAAATTTGAA
-AAAAAGGATTAAAAACATGAATTTTCCGCAAAAAATGTTTTCTCAGAGAA
-TATGAATGTCCCGCCAAATATATTTTCAGATAATTTTAAAGTCTCGCCAA
-AACGTTTTCTTCGAACATTTTAGGATTATGTGTTGAATTTGTAGAATTTT
-GATCTTGATTTAAATTTTTTCAGTTTTCAATTGAAAAAAAACTAACCATA
-ACAGATACTTGCAATAACAGATGTAATCACAGCAACTGCATTAAAATTTG
-CAATAAACACAAAACAAACGATTGCCATACAGACTACCGTAACCGCAATC
-GATCCAATTAAGTCAGTGCCAACAGTCAGGATGATACTGAGAATTGCAGA
-GTCACAGTCAAAGAGTGTAGCGTTGAATTGACTTTCTTCATGAAGAATTG
-TTCGGATATGTTGCATTGCACGTGCTCTTTCTGCCCATTCAGACATTCCT
-TTACCGAGAAGTGTCAGACGGAACGCTGTGACAATTGTTCTGAAAATTTG
-GAAATTATTCGGATTGAAATTGAAAAGTGTATAGGAATTAAGTTTGAACT
-ATTTGAGAAGTTTGTATTTTAAATTTTGCGCTAAGTTGCCTGAAAAAAAA
-CTAATTTCGAACTATATACCTACAAATATTTTTCAAAGAGCTCAATATTT
-GAATTTCGCGCCTAAAATATTTCGAAAACTTAAAATTTGCGACAAAACTA
-TTTAAACTATTTGAGAAATTTGAACTTTTAATTAACATTTGAACTTTGCG
-CCAATTTTTTTTTGGAAAATATTAAACTTTTGAAATTCTAGTTGAAAGGA
-AATTCAGAAAAATTGAGGATGTAATTTTTTTATATGAAAAACTTTTAGAT
-TCGATTTCGCGTCGAAAATTTTTGAATTGTCAAAATTTAAATTTTGACTT
-TTGCAAAAAAATGGCGGGAAAGTGAAGTTTCATTAGGAAATTCAAATTTG
-ATAGGCGTTTGACTAACTTATTATCATCTCCCATGTGATATTTTACAAGT
-GGAGGGTTCCCGATCGCATCCATCCACGTCGGAAGATTATCATAAGATGG
-GCGGTATTTTTCTCCAACCAGAGTGGATAAAATATTCATCGTCTTATCAA
-AATTCACATATTGCGGAAGAAAAATCAGACTTCGATTGTCTCCACGAATA
-CCTGGCACGTGCTCGAGCCGATCCATCATATTGTTGAAAGAGTCGTACTG
-AAAATTGAATGGCCTAGTAAGTAAAAATTAGATCATGAACTTACCTCTGC
-TTTGATCTCGATATTTGGAGGGTTGTTCACTATTACTGTAATAGGAAAGT
-AACGGTTGAAGACTGGCCTGAAAAATGATAAATGCTCAAAAAATACAACT
-TTTTTCTTTTAATAACGTAAAAAGTTTTTTAAATCGATAAAATCAATAAA
-TCGGCATTTCAACTGTAAACCAAAAATAACAATTATTGATTTTTCTTACA
-AAGACCTTAAAAATAAAAAAAAATCAATAAAAATAGCGATTATCTTTCCA
-AAAATCTGAAAATCAATTCAAATAATTTTCTTGATCTTTTATGTTAACCT
-ATAAATACCAATTATTGATTGTCTGGAAAATCAGTAAAGATTATTGATTT
-TTTTGAGAACCTAAAAATCAATAAAACCCAATAAAAAAGTAATGTTTTTT
-CAAACGCTTTTTCAAACAAATTCTTGATTTTACTTTCAAAAAACCAACTT
-AATATTCGACAACGAATCCACCAGCTTCGAATTTGATGGGAATGCCTTTG
-CAGGTTCAAAGGTCGTTTTCATGGTGACTACTCCATAAGTTGTCAACGCA
-TACATCCCAAGGAGCACCATAATGCACGCTACACGCCCCTTCACGGAGCA
-CACGAAGCTCGAGTACTTGGAGAGCCACGTGTCGGCTCGGGAAATTTTTG
-GCTCCGTCTCATTGGCGATGGATTTGTAATCTGGGTCGTTGCAGAGGAAT
-ACAATTGGAGCTAGGATCGTATAGGTGAAGATGTAGTCGAGGAGCAAGGC
-GAGCGAGGCAGTTAGGCAGAACAAGGACATCTGGAAGAAGAGTTTTATTC
-AAGCTAGCCCACGTTTTCAAAAACTGGGCTACGTGCCAAAAAAGGTTACC
-TGAGGCGTTGGCGTCAAGAATCCGATTCCAAAAGCAATAATATTGGTAAG
-TGAGGTGATTGTAATCGATGGTCCAACATCGACAATCACTTGTTCCAAAC
-GGCGAGGTCTGAAAATTGCAATTTCACGATGCTTTTACAATACCCCTACA
-GTACTTTTGCAGTTTCTCTACAGCACCCCTGTACAACTACGGTACTTTTA
-TTTATTTATATATTTGTTCATCAGGCAACAATCATAATGATACAATTACA
-ACAAGGCAGTGAACTTTTACAATACAATGCCCCACCCTCTTTTTCCGTGA
-AAACTTACGTGTCAGTAATTGCAATATGATGTTTCCATCTGTGAAGTAGA
-ATAAAAGCATCATCAACTCCAATTCCAAGTACCAAAAACGGCGTAACACA
-TTGAATAGAGAACGACGGGAAGCCCATCCAACAAATTGCTCCAAACGAGG
-CGACAGTTGCAGCCATCGGAGTGAGCAATGATGTGGCAACCAGATAGAAT
-GCCATTTTGACAGATGACAGGCGGACAATGACAATGATGACCTGAGTCAG
-AAGTAGGAAGAATCCGATTGTCATTAGAGTGGTAGCTTCAATGGCTCCTC
-GAATCATTTCACGATTTGCTACTTGGTCACTGAAGATGGTGAACTGAACG
-TGCTCGAAGGCAGAGGAGTTTTTGGAAAGTTGGAAGAGCTCGTCGATTGC
-GTCCTGGGAAAAGTATAATTAGGAAATGCCGAGTGCTTGCCAGTTTTTTT
-TATTATGTAAATTTGCTTCCCAGAATCGCGAAAATTTGATTTCCCGCAGA
-AAAGACTGAAATTTAAATTTCTACTAAAAATTGTTCAGATGTTTGTTTTT
-AGAAATTTTCTTTAAAGACAAAGATTTGAATTTCCTATTGAAAATAGGTG
-AAAATTCAAATTTACTACAAAAAAATTGAGTTTTGTTAAAAACACACTGA
-AAAATTGAACTTCCTGATTAAAATTGATTGAAAAATTAGAGGCTCCTAAA
-AAATATTGAAAACTCGAAATGTAAATTCAAATTTCCCGTCCAAAAATTGA
-CAAAAATATTTGAACTTTCTGCCAGAAACAAGTTAAAAAATCAAAGGTTC
-CTCTAATAGTAAAACTGACTCAAAATTAATTGAAAATTGATCAAAAAGCC
-GTATGAGTCTTCTAGGCTATTCTCACCTTAAACGCCAATTTTCCTTCTGG
-AGTATCAGACCTCGAAAAATACCACAGCACCAAGGATTTGGAGCTGATCC
-TCTCGGTCGGTGGTTCTGAAAGTTTCAATATTTTTTCACATTTTTCCAGA
-ACTTTTTATAGTTAAAAAAATGAAATTTTAACTGGAAAGTGGCTAAATCA
-TAAAAACTATTTTTCAACTTTTCATTTAACATTTCAAAAAAAATCTTACC
-AAAATCCGCATTACTCAAGTGAAGTCCCAGGAAAATATCCAGTCCGCTAT
-ATGGCATATCCGGATAGGTGAATACACTTGTGGTACCATTGTTTCTCCGC
-GTCAAATTCTGAAAATTGCCATGTGGTCGTTGAAGAGTTTTCTAGTCCAC
-CACCACCACCACCAAGGGTTTCGGTTTTTCGACTTTTTAGAAAATCGAAA
-AATCGAACAATTTTTGAGAAAAACTTACAAAAAGCTGATAATGTTTTTAT
-TTTAACTTTTTTCTCCATCATTCATTTTAAGAATATAGATAAATGGGATA
-AGACCGTCCAGGTTTCTGTTCAGTTTTCCCTGTTGTTAAATTCATTAAGA
-TGTTTGGTCCCCAAAAAACAATGTTTCTTTCATTTTTCGATTTTCAATTT
-TTAGATTTTTCGATTTTCACTAAAAACATCGAATAATTGAAAAAATCGAA
-AAATGACACCCTAGACCACCACCTACCGCTAACAAGTGAAAGGGGCTGTT
-CAAGTCGCAGAGTGGATCGCAATTTTTTCGTCCATCCCCATCTTGGTAGC
-CAACTGCCGCCGATAGTCGATTGTCCACAGTATAAATCTGAAATTTTTTA
-AATTCCCGCCAGAAAAGTGGGCGTGACGGAGAATCAACTTACGTCTGCCA
-GTGCGCCTTCCTGGAGAATACTGGAATTTTCGCGCTTGGCGGTAAAAATA
-CAGAATGCTCGTTCCGGATAGATGTCGAGTCCGTAGTATTCCAGCCAGAC
-ACGGGTTTCACTGAAAAATGTAAAAAAATTTATAGAAATTTCCGCAAAAA
-GCATATATTTAAAATAGGAGTTTTAAAAAAATTAACAAAATAGTTACGAA
-CGAAATTTTCATTTGCTTTAAAGTTTTCTTTTTTTTCTTATTTATTTTTG
-ATCAAATATTTATTTTGGGTTTTTTAACTTCAAGTGGAATTCCAAAAAAA
-TTCAATTTTCTTCCCAGTCAACCAAACATTGACCAAATCACAATAAGAAA
-GGGAGAAAGGGAAATCGAATTAGAAAAAGAAAAACATTGCGAAAAAACGT
-GTTATTTCTGACTGGTGGAGGAAGGAGGCTTCAAGGTCAGTAGTCACTTA
-CTATCCAGCATCTGAATCATCCGGTGAAAAGGCTTTGCGAATATCTGGCT
-CTAAACGAATGTGCACAAGTCCTGAACTGAGAACTAGGATGGATAAGATG
-CTCACTGAAAATTGTCCAACTTGAAAAATTTCGATTTTTTATGTTTATTA
-AATTTTTTCTGGTGTAAAATAGCAGAAAATGCCAAAAAAAAATGTATCAG
-ACACAACTTTTTTTCAATTTTTCAAACTTTTCGTTGCAAGACCAAACATA
-CAATAACAATTGTCGTTCGAGCGCGTTTTGCCCATGCACCCTTAACGGAG
-ATTTTCATCGACTACTCTATAGAGCGCGTTGGTGATTTTGAAAATGAATT
-TTTCTTGGAAATTTAAAACTTTTAGAAAGGGATTTTTCTATTTTTTCCAA
-AAAATTATATTGAAAAATCAATAAATTAATTATTGATTTTTCAAAACTAT
-AGTGATTCTGATTTGAAAAATGAAAAACATTGCTTTTAAAATTATCTGAA
-CTCAGTTTTCACGAAAAATCAATAAATCGGTAATCGAAAAACATTCATTT
-TTCTATTTTTCTCAATTTTTCGATGTATTTTCCAAGAAAATCGATTAATT
-TATCGATTTTTTTTCCAGAATATCTGATCGATTTTTTTATTCATCGGAAA
-AGTTCAATTATTTTATTTTTAGGAAATTGTTTTCCAAACTTATATTGGTG
-GCCAAGTTTTCCCATTTCGACGACCATAAAGTTACAAAAAACTCACAAAG
-TATCGAATAAACCGGATAGGCGGCTAACAGCCGTGCCACGACGGCACTAA
-TCACATCCCATCCCATGTGCTGAAAAACTTCGAAATTTTTTTAATATTTC
-AGAATTTAAAGCAGCATGCAAACGCGCTCCAACAAAGAAAAATGTTTTTA
-AAAAATTGAAATTCAAAACACAAGCACGTGAAGCAGAGAATGCAGAAAAC
-AAGACCACTGTCACAAAATTGTAGAAGTGAGGGAGGGAGGGCTATTGCAG
-AGGTGACCAACGGGTTTCGGTTTCCAATTTTTCGGACACGGCGCAGAGGA
-TTTGAGTCATTATTATTGTGTTTAGAGAGTGTAAGAGAATTAGAGAATTA
-GGGATAGATGGGAAACTGTACGTACTTCTGCGAAATGGTGCACTTTTAGG
-ATCGGCGGCCTAGAAATTTACATGGTGCTCTAGAAGTCTAATAGATAGCC
-TAGATCTTTTTAAGTCCAGAAAATTACTTGGTGGTCTAGAAGTTTTTTTT
-GTGACCTAGAAATGCAGTTGGTGGACTATAAATTCACTTGGTGGCCTAGA
-AATTCATTTGGTAGCCTAGAAATGTACTTGGTGGCCTAGAAATTAACCTT
-GAAGCTTAGAAGTTTGTTTGAAAGCCCAGAAATTCACTTGATTGCCTATG
-AATTCACTTGGTGGTCGAGAAATGTTCGTGAAAGCCCAGATATTTACTTG
-GTGGTCTAAAACATTTTTCAGTTCAGAAATACATTGGAAAAAATTTCGAT
-TGAGAATTATGGCGTGGGATTTCAAGTGGTGACCTAGAAATTTGTCAAGG
-GACTGAGGAATTCATTTGGCGTCTGGAAATTTTTTTGGTGACCTAGAAAT
-TTATTTGGTGACCTGAAAATTCATTTCATGACCAGTGAATTTACTTGGTG
-GTCTAAAAAGTCTCATGGTGCCGGTCTTAAAGTCTCATGTGTTGCAAAAA
-TTATACTACAATATTTAACTTTGAAATAAAAATTCAGCGGGTCTAGATTT
-GCAAGAAAAATCTGTATTTTCTCAATTTTTTTCAGGTTTTTGATTAGTTA
-AAAAAAATCGAAATGATTGTTTAGAACTGCAGAGAAAAAACAATTTTGTA
-TCTCCGGAATGCGCTATTCTGGGGAGTCAGATTTACTGGATTTTACTTTT
-TTTCCTGCAATTCCAATGCAAAATAAGGTAAAAAAATGAGAAAACTGGCG
-GAACACGGCGGTACACACAGGGGCAACTTGAATGTAAGGCAGGTGTTTAG
-TAAGTGGACCGAGGGGACGGCAAAAGCTGGTATTTTTCCTGTGTCGATGG
-GGGACAGTAGTAGCACACAAGAAACAAGTATTTTGATGATAATACGAATA
-AGAAAAAGAAAAAGGCAGCAAAAAAGTGTGTGGCAGACCACCACCGTCCA
-TCGGATTAGGGAGCGGAGGCAAACTCGCTCTACCGAACAGAGGGGTGTCC
-GTTTCCCCCAAAATCCTCTGAATGTGACGTCATTGTTGGGGCGGCGGGGC
-GGCGTCCAAAAATTAGTGATTTTTTTTTTGGTATTTTGGAAAAAAAGGAA
-AAAATCGAGAAACATTTTTTTGTGTTTTTGGGGAGTTTGTCATGTGAAAT
-TTGAAAATGTTGGGTACAATCAAAAAATTGTTTTGGTTTTTATAATTTTA
-ATAGGAATTTTTAAAAATCTGAATCGTTTTTCTTTGAAAAATCAAAAAAC
-AACAAAACATCCGCTTTTTTTAAAAATTGTTTGTTAAAAAAATAGAAATC
-GGAAAACAAAATTTTCCGATCTTCTCGAAATTCACAAACTCATAAAAAAA
-TCGAAATCCCCTTGTACCCCACCCTAGTTCACTGAAGCGCGTTTGCTTTC
-TGGCCAAAGGCATGGAGGGAGGCGGGCACCTCCCTTTTGCAAAATTGACC
-TAAATAAAGGTGATATGCCAGTGATAAGGAACGGTTTAATGATCCGAAAC
-CGCCAAAAGTGCATAGTTTCTGCGTTAAAAAAAGTGACAACTGACATCAC
-ACGGAGGCTACAAAAGGGGACTCACAAGTTTGCCGGAGAGGAATGAAAAT
-TGGAAATTTGTACGGGTAAGGGGATCAATGTTCAGTGGTGGTCGCGAGGG
-AGGACGGAGGGAAAAAGTGGAATTAGAATTGAATGGGAAATTGGTGGCAA
-AACGGTAAACACTTCTTATTATCCAAATGCATGAGGGATGGAGAAAACTG
-GAAACCTTTGCAGAATTTTGGAGGGGGTGATGAAAAGTATTGGCAACACC
-TTGGTGGCCGAGAATTTTAAATTGATGATCTGGACTAAAAATTCAGATGA
-TGGCCGAGTTTTTCATATTCGCACCAATACAAATGATGGCCTAGAAAGTT
-TGGAGCGACCTAATTTTTCAAATTTACAAATAGATCTTTAATGTTTCATC
-GACAAGGGATGTGAACTAGAAATTAAGATGGTGGCCTAGAATTATATTTA
-TGGTTCGTCAAGAGGTGGCCTAACTCTTCAAATTCACGAAATATTCTAAA
-GTTTAAATTTCCTTTAATTAGTATTGTGGACTAAAAGTCGAGATAATGAC
-CGAACTTTTCATAAGCTCTCCACATCAATTGGTGGCCTTGAAATTCCGAC
-ATGGCCGAATTTTCGTAAGTCGACCCCAGTGGTGGCCGAGCCAAAAAACA
-TAATTCCGCAAACTCTTACATTTTAATATATGAGGGAAGCCAGAAGTGCG
-TGCCACATTATTTTTACATTTTTGACTATCGTGCCAAAATTCCAAAATCC
-TCAAAAATTTGAATTTCGCGGCACAATTTCGGGTTTTGAATATCTTTTTT
-TTAGTGTGATGTAGGGCGTACTTTCCAATTTGCATAAAATAAAAAATCAA
-CAAAAAGCCATACATAATGTCAAATGGTCAGTTGCAAAGAAAACAAACCT
-GCGGTCAGGATGGCCGAACCAGAAAAATCAATTCAAGCTTTCGATTTCGC
-CCGAAAAAAATGAGGATCAGAATAAGAAGGTGTCGCCTATTAGAGATTGG
-AGGATGTTGAGAAAAAGAGAATAGTGGAGGAAAATGATGAGGTAGAACGG
-AATTGAACATGCAAATAAAATGAATGTATTGGGTAGGAGAGGGAAGGTAA
-CACTGTGTGTTCTGTGTTTGGAAAAGGATTGAAGTGGTGGACAAAAGGAC
-TCTTGGTTTAATACTACTTGCCTGTTCTGATCAGGTTCAGAGGTATTTCA
-GCAATAGCTTTTGTATTTTGCATTTTGTCTTTTTAAGTACTATTATTTAT
-CAAATCCTTTTTTGTAACTTTGAATCTGATGTCAAACTTGTGGAAAGTTT
-GAACTCGAAGAAATTGCTCAAAAAGTAAAATTTGCGCCCAATTTTTCGAA
-TTTTTTTCGTTGTTTCTTTTTAATTTCAAAACACAAATCTTCGCCAAAAC
-ATTGTTACAAAATTAACATTTTAATTTTTAAACAGCTGCTAAAGCACTAC
-AAATGTGAAATTGATGCCTAAAATTGGAGAAAAATGGAGTTTTTCAAAAA
-AAATTGAAATAAGAAAGTTTGGAAACTAAATGTCTATATATGGGGAAAAT
-GCTATTTCGAATCTCGCGTTTTTTTAAGTTGGGCATCTCCAAAATATGAA
-AAAAATACAAAAAAAAACTCCAAAAGATAATGTTGAATTTTTTCAAAACC
-CTCACCAAGAAGTATGTTTTAATAAACAAAAATTTGAATTTCTTTTCGAA
-TTTTTTTCAAAATTCGTAATATAAGATACCTGTCACACTTATTTTCAAGC
-TAACAGGAAAAAATAAATGTTGAACTTTATTTAATGATAAAAATAGTTTG
-TAGAAAATTCGTAAATTTAAAAAAATTCAAATTCTACCAAAATATATTAG
-TTTTTCACCTGGAACTAAAAACATTTGAAGAATTTTTTTTAGCTTATATA
-ACACTACAACCGCAACACATTTTTGTGAGAACATGTCTAGCCTCTGTCAA
-ACAGTTTTCCGGTATCTTCGTGTGTGTGTTTGCTAGTGTTCAATAGATCT
-TCCTGTAAAAAATCGAAAATTTCCGATTATATGCTTTTTATGTGTTTGAT
-TCTATAAGCGTTTAGATTGTTATCAGATGATTTGACATTATTCGCAACAA
-TTTTTTTAAATCCGAATGTTTTTCGAATTTCTATTTTTTATAATTTTCCA
-GACAGTTTAAGAGCAAAGTTGAAGTTATTTTTTCCTATCAAAAAATGCAG
-GAATAAATACTACCTCAATTTTTGCAAGAAAAAAAATTTACAGTAGTTTT
-TTTGCTGGAAACTAAATTCCGCAGAATTTGAAAAATACTGAAAGGGTTTT
-TTTCCTTTTTTAATTTGTACTCCCTACAGTACCCCTTATTTTTGAATTAC
-AATTTGATGTTCGTACCTAAAATTGACACTTTTTCTCTAGTATATTTCCG
-AATTCAATTCATAATTATCAGTTGAAACTAGACCCCACCAAAATCACAAA
-TTGATAAGAAAACGTAGAAAGGGGAAAGCACGTGTAGCCTACAACAATAT
-TAACTGTTTTCAATTTATTATTTTTATTTTCCAAGGGTTTTATTCTTAAT
-TCTATTCACAATTTTTCGAAAAATATTCAGCAAAAAAGTATGCTTTCTGA
-CTATATTATCAGTATAAAGTGAGTTTTTTGTGAGCATTAAAAAAATCAAT
-TTTTTGTGGCCTAGCTTTGCATTTAGTGGCCTAAAAAATTAAATGCATTT
-CTTCCACGTTTTCCGTAAAAAAGACAGTGGAAGAGTTTTTATCCGTACTT
-GGGCAGGCTTAATATTTTGTGGCCAAATTTTTCGCGTGGTGCCTAGAAAC
-TTTTTTTACGTTTTTTCTCGGAAACTTATTTTTTTCCATGGCCGTGAACG
-AGTTTTGTTTAAATTTCAGGTCGCTTTCAATATTTTGATGACTAGTTTTT
-TAAAAAATATTTTCCTGCTTTTAGTAATGCTTGGCCAAACGTCTTCACGT
-GGTCGAGCTTTTCATTTGATGCCCTAGGATTTTTAACCTGTCGTTCTCTA
-GACAATAACTACCGTGGACTCGAAAGTTCTACGCCACGTTTTAAATATTT
-GTAGCCTAGAAATCAAAGTCACTTCCCGAGTGGCCTACGTTTCCCTGAGC
-ATAACTAGTCCTCGAGAAGTCCAGTCGACCGTTACTGTCTACAAGATTAT
-CGGCAAGATAATCCGTTTCGATTTCGATGTCCACTCATTCACTAGTCGTT
-TTGTCGTCGTTGCAACAATGTGGAAATTACTAAATTTTGGCATTTTTAAA
-GATTTTTAAACACATTTTTTCTGTCGGAAACTGAGAACCGCAGTTTGTAG
-AGAAAAAAATTGCATTTACTTTCCTGATTGAAAAATCTTTGTTAGCGTTC
-TTCCCCGCTGATTTATGTACCGTTTAAGTTTCAGCTGAGAGACAGCGTGG
-GATTGGGGGAGACGCAGACAGCGAGTGAGTTTGCGTCTCCCTCTCCCTCC
-CACTCTCTCATTTGCAAGTTTTGAGTTTTCATAACTCGGAGAGTGGAGCT
-ATCGAAAAATTCAAAAAAAAAAACAAAAAATTAAAATAAAAAAATTCTAC
-AAATTTTTAGTTGCTAATTTTTTGATAGCGCTGCTAGGTTTTGAGATAAT
-GACGTTTTTAACTCTACCTCGACTTTTTGTGTGTTACCAAGTTAGTATTC
-CTCTGACAAACCGCATGACCTCACCTCATTGTAGCCTCTTTCGAAATCTG
-TAAACTTTACAACTCATGTTTCCTAGTGATATCCGCCTCCATCTCAGCTG
-TTCTCTTTCCATCTTCTCCTAACTGTTTTCGTCTATTTTAAAAATGAGAT
-TATTCGGATTTCTTACTAGTTCCGCTCAAAAACCAATAAATTTATTTTGT
-AGAGCGAAAAATTCTACACATTTTTGTAGTCAACAAGTTTTTCAATGCAC
-CTCTCCTCGCTGAGTTTTTAAGATCTATAATTTGATAGTAAAAATATTTT
-TGACAGTAGCTTTTGTTTTAGAGATAATCAGGATTTCGCAAGCCACGGAC
-TTCAGTCTAGCCTCATTTCGAAAGTTGTGAACTCTGCAAGTCATGTTGAC
-TAATAGTATCCCTCTCCAGCTGTTCTTTCTCCTCCTTCACTCAAGTGGTG
-ATCGTTTTCTCACTTCTCTCGCTTTTTCGCCCCTCTCTGTAGTGTCCAGA
-GAGTATCAGTTATGTCTCCAGGACGCCGTGTGACGTCATCGCTGACAAGC
-CGTAGCCTACAGCGCCCGGCAGAAGACCTGTTTTGACATGCCATTCGTGA
-AAAATTTAGATTAGCCCTCTCACACTCTACATGTCTCCATGTTTTTTCAC
-ACAAACTATTTTTTTGAAGAAATATCTTTAAAACTTTGCTTTGTCTATAA
-TTGATAGCATAAAAGGTCCAATTTTTTCCGTAGCTCAGCAAATGGCGTAA
-CTAAATGGTGTGAAATGTTTGATAGGGGACCGGTTTTTGGCTGAAATCTC
-AGAAAAAATGGAGCCCTGCCTGCATAGAGACCCCTTTCGACTGATGACGT
-CACAGAGTAAGGTGTCACATCACACCATTCTTATTTCTCTATTTGAGGTC
-CAATTAGACTAGGGGGTCAGCGTGCTCTCGATTCCTAGCCGATGACGTCA
-CATATTTGCCATTCACAACTTTCTAAACTTCAAACATTTTTTAATTTTTC
-CCAAATTTCAGCCGATTCCTAATGGGAGGATTCCTCTCCAAACATCACCA
-CCTCACTGCAGTCCACGATGCCACGTGTGGCCCAATAAAAGGTGTCGGAT
-ATGAGCAAGTAGGTCATAAATTGAGCTCTCACTAAGTTAAGATGAAAGAA
-AATTATTTAGGAAGACGGTTCAGTGGTGGAGGGGTTCCTTGGAATCCCGT
-ACGCCGAGCCACCAATTGGAGCCTTGCGCTTTAAGAAGCCAGTTGCTCAT
-CGGAAATGGACGGAGCCGCTGGATTGTGTTAGGTTCGGGCCAAGGAGTCC
-GCAAAATGATGAGCTACTAGGGCAGGTGAGGCGCCTAAATCAGAGCAAAA
-CTCTGTCATTTTTATAATGTTCAGTTTGTGAACACAGTCGGGAAAAGTGA
-GGAGCACTGTCTCAGCCTGAACGTATTCACTCCAAAGTGGGAGTCAAATG
-AATGGCCCGACGGCTTCCCAGTGATGGTCTTCATCCATGGCGGAGGCTTC
-GCTGTTCACTCATCCAGCAACTACGGCTGCGCTTCCATCGCACGAAACCT
-TTGCACCAAGGACGTCGTCGTCGTGACCATTAACTACCGCCTCGGCGTCC
-TTGGATTCTTCACCACCGGCGACGAAGTGTGCCGTGGAAACCTTGGACTT
-TGGGATCAGACTGCCGCACTCGAGTGGGTTCAGGAGAACATTCAAAGCTT
-CCGAGGCGACCCTGATAATGTTACAATCTTTGGCCAAAGTGCAGGTGGAG
-CATCTGTGGATCTGCTTTGCCTATCGCCGCACTCGAGGGGATTGTTCAAT
-CGGGCGATTCCGATGGCAGGGAATGGAGAATGTGATTTTGCGATGCGGAC
-TAGTGAGCAGCAGGCTCAGTTGTCGAGGGAGTTTGCGAGATACCTTGGAT
-GGGAAGGAGATGGTAAGTGATTGAAATGTCGCTTAGTCGTAAGATGTTAG
-AAATTGCATTGTCATCAGAGTTGGATTGAGTTTGTTTAAGCGTAATTTTT
-ACTAAAGCCCATCGAAGCAGTTCCGTTGGCTACTTGGCCTACCACACTCA
-GCCTGGGAGCCCGTCATAGCAAGGCTCAAGACATTTCCTATGTAGTTATT
-TCTATTGCAAATTTAATACGGTGAATTTTCCAAAAATCTTGACGTATCCG
-AATGAAAAACCAGTGCAAACTTGTTGAGTAATATCCCTAATTACTTCATT
-CCAGACAACGACAGTGAAGACCTTCTCCAATTCATCGACCAGCAACCCCT
-TTACAAGATCGAGATGGGCATAAACCCGAAAAGAGGATTCAAGCATTCCC
-AGGCTGGAAGCTTGTATTTTGTGCCAAACTTTGACGGCGACTTCTTCCCG
-AAACCACTTAACCAGCTTAGAAAAGAAGCTCCAAAGATGCAAATAATGAC
-AGGAACCACCAAGTACGAGGGTCTATTTTTCAGTGAGTTTAAACTTCTGA
-AAATTTTCTGAAAATTTTCTATTATAGTCGCCCTCGGTGCCTTATCGAAA
-AATCCGGAAGGAATTAAAAAGTTCATGGGAAGAATCTTTAAAGAATGCGA
-CTATGGAGAGCGTGCTGACGATGTGCTGCAGATGGTCTACGACTTTTATT
-TCAAGGGGGTACATCCCAAGGATCATGAGAAGAATATGCATCAGATTGTG
-AAGGTAGGTGGCATAGAGCCTACAGGGCCATCAGCCAGTGTTTCAGTTCA
-TTGGAGACTATTCTATCAACTATGGTACATACCGTCTGGCTAACATTATG
-ACGGATCTTCAACACGATGTATACTTCTATCAGTTTGACTATCATAACTC
-TGCAGGATTCGGAGTGTTCCGGTGGCTTCTTCCGTTTTTGGGTGAGTTTA
-GGCAGGATGGGTCAGATTTTCTAAGCTCTGGGCCACATGCTTTTTGGTAG
-ATCAGTTTTAGAAATTCTAAGCTAGAAATGTATGAGTATGGTAAAACTTT
-TAAATCAGATTGAAAAGAAATTTTCCAAATTATAGGACTTTGTAAAAACT
-CCGATTGCTTAGGCTACTTCATCCGTACGACCGTAACCTGTCACTAACGA
-TTCTAATAGTGTACCTTATCTGAACAGTATTGCCGAACTAATTGAAATTA
-ATCCTGAGACTCCGAGATTACCTAGCGGTCCCTATCGCTGTGGCCCAGTG
-CCCATTTGGCTCAATATCCAATTTTCAGGCTCCACACATTGCACGGAAAT
-GAGATATGTGCTCGGCAAAGGAATAATCTCGAAATTCCGACCAAATGATA
-ATGATAAGAAGATGCTTCACGTTATGACAACTTATTTTACAAATTTTGCA
-AAATATGGGTACTTTTTTTGTGAACACTTTCGAAAAAAATTAAGCTGCTT
-TCAGAAACCCTAATGGAGAAAACCAGGAGACTGGAGAATGGCAAAAGCAC
-GACTCGGCACACCCGTTCCGCCATTTCAAGATTGATCTGGACGATTCTGA
-AATGGTTGAGGACTATCAGGAACGGAGAGCCGAGCTATGGGATAAACTGA
-GAGCATTAAATGTTAGCAGGGCTCAGATGTGAAATTGCTGTTATTTTTAC
-TTGATTGATTTTACGGGTTTATAAATATTTTTGATTTGTTATATATTTAT
-TTTTTCTGAGTTACATACATACATCAAGAAACATTTCAATATCTTGCAAT
-CTAACTGAATTTTATTTTATAATCAGTTATTTTTATTAATCCTGTACTAT
-GCCAAAAAATCTAACTTGTTTGAATCAATAACTCAACTACCAATCCTTAA
-CACAAAAACCAACACGGTTCTACCCAAACGATGTATAAGCTGGCACCATT
-ATAAATTATCCGCATACTTTTTCAAACAAAGGAAAAAGTCGGAAGCTTTC
-CATACATTCAACTCTATTATACTTTCCCCTTTCCATGGATGTGCTTTTTG
-TGTGAAACCAAAACTTAACCGCCAGAAAGCTTTTTACATAATCTATAACA
-GAGGTGGGCGGCAATTGCCGTTCGGCGAACATTCTGATTTTTTGGAAATT
-TTCATTTTTGGCAAATTGCCGATCTGCCGTTTGCCGGATATCAATTTGCC
-GGAAGTGTTTAGAGGGTTCTTTTTACGACGGAAACACTTAAAACTGTGCC
-TTTTTGAAAATATTTAATTTTTATTCTTTTTTTCGGCAAATTTGCCGGTT
-TGCCCAATTTGGCAATTCGCCGGAAATTTCAATTTCGGCAGTCTGCCAAT
-TTGCCAATTTTCAGAAAAAAAATTTCGACGCCCATCCCTGATGCATACCG
-TTTTTGACTCAATTTAAATAGTACACAACCTTCCACATTAATGTAGTAAC
-GGTAAGGTTGCCTAATTTGTTTGAACTTTGAAAGCCGCGCACAGCACCTA
-CAGTAATCAATCTCCTTAAAGAGTGTTTTCGCAATACCAAACATAGGAGT
-TTGTAGAAACATGAAACCGAAGGACAACACATTTTGAAACAGGTGTCACA
-TTTATGTATCTGCACTTGATAGCTATGCAGTCAATGAAGCATAACGAGAG
-ACATGTGTTCATTCCCGAATGGAGTCAATGAGTCATAAGGTTCTTCGTTC
-TCATTTTATTATTACAGGCTTGGGTCCCACATTGATTCATATTATACTTA
-CTTTTCAATTCATTGTTTTTTTGTGATTTTTTTTCATTAGAATAGTATTA
-TAATAATATTCTTCTAATAATGACAATCGAAATAGTTGCAAGTAGAATAA
-CGATTTGTACAGTGATGCCCATAATTGTGCATGTTTATAATGTTCTAATA
-TTTCAACGCAATCATGACACAAGCTCTATAGCATCTCGTGAGTTCATTTT
-TGGTGAGGTTTCAAAAAAAAAATCCTCTTGCTCAAGAGCCATACGTTTTC
-AGTTAAAAATTTCTTTAATAAAATATAATGCTCATTTCTCGAACGTTACC
-TGTTAATGTTAACTGCGCCTACCATGTCCGTTCAATCCCACTAGTCAGTT
-ATTCTTTGCAATTAAATGATAAACTTTAATGTCTAAATCTCTTCATGGAT
-ATCTCCATCTCAACCATCCATCGTTTTTTATCAACCATCATCATTCTCGT
-GTTCTCGTTCTCGGGGTCGCCTCCGCTTCTTCATCATCATCACCACGACC
-ATTCAAATCGTTCATCTTCCTAATCGACATATTCCCGCATTAAATTTCTC
-TGTTGGGTATCAATGACTACCCAAAAACGGTCGCATTTTCTGAAAAAATG
-GGAAAATTGATTCCTAATTTATTGGTTTTGACCGGTTGTAACTAACCCCC
-ACACACTGTTTTTTGATACTACCTACGTCTATTTTCGGCTAATTTTAAGA
-AGTCAATGATTCCTAATTGTCTTTTTTGTTATTTTCTGTGAAGTGAAGTA
-TCAAGATAAAATCAGTTTGCGTCTCGCTTCGATTTTCTCATTTTTCGAAT
-GCTATTCCCCCGTAGCAATATGGTTTTGTTATTACACATTTGCACTTTTT
-TGCTACCCTCCCAATTCTGACTCACACTTGCATTCCGGAGACTGCCTGAG
-AGTTAAAACTAAACATAATTGTTATATAATAAATGTCAAAGTTTTTCGCA
-AGCTGAAAATTTTTGCCAGCTGAATTATTCCTCCTTCAAAGGAGCATAAG
-TCTAAAAATGCTAGAGTTATTGGAAAGTTGCTAATTACAAGTTATAGAGT
-TTAAAATTTTGAGTAGTTTCTCGATTTACAATTTTTGAAGCTTTATTCCT
-TGCTCAAACTCGAGCAATGAGAGGCAGTGGGGACTCCCCCACTGGGGAGG
-GGAGAACCTTGTCAACCCACTAGGGAGGGGAGAACCTTGTCAACTTTAAA
-GCCACGTCCCTCTGCAGGGAAAAGATCTATCAAAAGGTTATCAACTAACA
-AAATGTGCAAAATTATACGCTCTACATTTTTGTAGTTAACCGTTTTCTGT
-TATCACAGTTAGTTTTTGTGAAACCATCAAATCTGTAGTTTCTCCATTAT
-TATTATCACCTAACAGTATTATTATCAGCTGATAAGTATCCTTTCTTTTT
-GGATAATCCCCTTGTAAAGGAATATACCATTGTCTTCATCTCCTTTTTCT
-GTGTCTACCCTTATCTTTGGGTCGCCATCTGCCTCTCCTCCCCGCATATC
-CCCTCTTATATCTTCAGAAATTCAGGTTCCAAGGAATATTCCGAAAAATT
-TTGTTTGGAAGGTGACATGTCCGATCAATCGCTGGTCCAGAAGGTTCCAC
-TACTTGGCTCGTGTTCTCAGGTGAGTATGCGCCTTTAAACATTGAGGGTA
-CTGTATGCACCATAACGCAAAATTGCAGATTTTATAGTGGGGCAGGTTTG
-TTCTACAGATAACCGTAAAATTTTTATGTCCCTTTAAAAGAAACTCGTCC
-GAAAAATTGATAATTTACGAGGAAAACAACTTTTAAAAATGTTTTTTTAC
-TTCAAACGATGCTCTATTGTGCCGAATCGCTTGTTGTTTAGCGGCGTTTC
-TAAATATTTATTTACTTATCGAAAATCTTTTTTTTCATATTTATAACTGT
-TTAAACAAAATCGATAATATTTATTTTTTCTGAAACTATTCTGAAAATTT
-TGAATTTCCCGCCAAAAAAATTTCGGAAAATTTTGATTTTTTTTGGCATA
-TTATTTTCTGATAGAATTTGAATTTTTGGCCAAAGAAATTCTGAAAGTTT
-TGAATTTCCCGCAAAAATTGTATTTCTGAGAGAATTTGAATTTCTTGCAA
-TTTTTCTGTGAAAAAACAATTGAAAATAAACGTGGTCGCCAATACGAGAA
-AACTCGGCCACCGATTTTTTTTTCGCAAATTTTGCATTCGTTGCTGCATG
-ACTGCCAAAAATTGGCGGCCGAGTTTTTTTATTCTACAGGGTTAAATTTC
-ACAGATGGCCGAGTTTTCTCAGTTTCACGGTCACAGGCTTCTAGTTTATT
-ATATTCATCTCCGCGGCGCGCGCACCGTACTTTCTCCTTCTCTACTCTCT
-CGTTGTTCAATCCCTCTCTCGGATCCAACCAACGCCCTCTGCGATTGTGT
-CATCATCGATTTGTTATCTCAAATTCCGTTTGGCTTTTCAATAACCGTGC
-CTTATTGTCTCAGGAATTTCAAATTTCCGGTCAACAATTCGGATTATTAA
-CCATTTCGAAAAAAATCCTTTAAATTATTTTTATTATAATGAAAAACGTG
-CGATTTTTTCTCGCTGGTGGGTCCTGGCACGACTGAAACTTTTCAGCTAC
-TGTACCCAGCATTGCTTTAGAATTTAAATTTTTGCCGGCAAATTAGAACT
-GCAAGATTTTTTTGTTAGTTTTTAATTATAATTGTTTGGGAAAAATTACA
-AACTTTAAAAAAACCTACCGTACTCCCAAGTACTGCAGCCAAGAAATAAT
-TTGTTTCGTGCCAAGACCCATTTTTCCTTTAAGAACTAGAAACCTCCCTT
-GTTTACAACTGTACTTAAAATCGAATTAGTTTGTTCGCTAAACATGTTTT
-TCGCGCGAAATTTCGCTTTACTTTCGAAAAATGTTTTTCTTCATTTTCGT
-CGGCATGCGCCTTTAAACTACTGTTTTTGAAACTTTCGAATGATAGAAAA
-AATTAGAAAATATTTTTAATTTTCGCTTTCGCCGGAATATTCGAAAATTC
-GAAAAAAAAACTAAATTTCATGGATTCTCAGTTAAAATTCACGGAAATTA
-AAACTTGCGTAGCGAGACCTCAACGATCACATTACCTATGCGCCTTTAAA
-GCTACCGTAACCCTATTTTTAATTAAAAAAAAAAGAATTTCCTTTTAAAA
-TCGCCGGATTTTCTCCGTCTCTTTTCCCATCTTTTTTCATCTTCGGTACC
-AATCATATGTAGGTGAGAATATCTCTGCACCCTCCAACGAACCCAACACT
-ATATCGCTGCGCACCGTCCTTCAACGATGTCATCTTCCTCCTACTTCGAC
-CCCCTCAATTTATTTCCGATTTCCTCTGATTTATTGATCTTTTTTCCTCT
-TTTTCATCATTTCTACGTTCTATAAAGCGAGGTTTATAGCCAAATGGACT
-CATTCAAACGATTACAATCCAAAGTTTTCACGTCAGTGAGCTCACTGCGA
-AAATCTGAAGAGAATGTGAGTAAAAAGCGGCGGAAGACGTAAAACATCTG
-AAATATTTTTAAAAAAATTTGTTAAAAGCCCCACATTTTCGAGATAAATC
-TAAATTTTCAAGTTTGTAGCAGCAAATTAAGCAAAGATATATATTTCAGG
-CCGACGAGCAGACATACAACACAAAACGATGCTTCATCCACGTCAATCAC
-TTATCGATCGCGATCGCCGTCGTCGAGCTCTCGATTTTAATTTATCAGGT
-AATTTGTTTGCCTGCAACTCAGACCAACGCTTAGTCGTCTAATTAGATTT
-CAACCATATTTGATTAGAAACTGAGCAAATATAATGGGGACATAATTAAT
-AGGCTTATGGATTTTATTTGATTTGACAATATGGATTTTCTAACCAAATA
-TGGTTAAAATCTAATCCAATATGGAGCAAATCTAATCAAATATGGCTGAG
-ATCGTGCCATATTGGATTAGATTTCGACCATATTGGATTAGATTTGTTTT
-CTAATGAAATATGGAGAAAATCTAATCTAACATGGATTTCTAATCTAATA
-TGGAGCAAATATAATGCAATATGGATTTTCTAAAAAATATGGTTGAAATC
-TCGTTGAATATGGTTGAAATCTAATTAGACGACTAAGCGTTTATCTGAGA
-AACTGGAAAAACCTAAAAAAAATCTGAAAATTTTCAGTTTTGTGTGGAAA
-AAATCAATGAAAAACTCAATCCTACAGTAATTTAAAAATTCTTTTTCACT
-AAAAAAATCAGTTCCCATTGAAAAAACAAACTGAAAATCAATTATTTCAG
-CTCTCAAATGGCAGTTGGGGCAATTCGGAGCACTCGACCGTCTTCACAAT
-CGCCGCCTTGCTCTTTCTGCTCGTCATTTTTCTGCTTTTCGTCGCGATTT
-TCTACCAAATCGGAAATCTTCTCATCCCGCACATCGTCATGCAGATTCTG
-CTCGTTTTGTGCTTCCTGGGACTCACATGTGCGACGCTTTATGCGCTTTT
-CCACGGTGCCACGTTTCAGTTGCTCGTCGTGGTTACAAATCCGCAAATCG
-CCGCTGATTCCATGGTAAGTGTGGTAAAAAATGAAATTTGTTTCCTTGGG
-AAATTCCTTCTTTTTCCTCAATTTTTCCTCATTTTTTTGCTTCCAAAAAA
-AAGACCCATTTTGCGAAAAAAATTTTTTTTTTTCATTAATATATGTATTT
-TAAATTTTCCAGACAATTCTCCCGGCGCCAATGATCACAACAAACGTGGT
-TTCCGGATTCCTAGTGGGCCTTCTCGTCATTTTCGCAGTCTCCTACTTGC
-TCATCGCTGTGCTGAATGTGAGCTTTTCCCATGGCGAGACCCATGTAACT
-TTAATTTTTGCAGACCTGGTGCATGTACGTCGTCATCGATAGTTACCAGC
-TTTTGAAGAGCCAGAAACTTCAATCTCGTACTCCGTCGGTCGAGGAGTAT
-TGTGCGCCGAAGACGATTCAACTCTCACTATACCCCAATCAAATCGTTCA
-GGCCACCGATTTTTAGTCTATATTTTAGACCATTTGTTGAATTTTTCTCG
-AAAAAATCCGGTAAATTTTTGTGTATATATGTCCCGAAATTCTTCACTTT
-TATCACATGTGTCAGGCTTTAATTTTTTCATACTTTATTTTCGAATTCTG
-TACAAAAATCTTTGATATATTCTATTTATTCTTCTCAATTAATAATCACA
-CGATCCATCTTTCCACCCGTCTCGCCACCTTTGCATCACATCTCGACACT
-CGAACTTTGGTTTTCCGGTTTTTTCGTTGACTTTATTGTGTAGCTGGCAC
-ATCCATAGCGCAAACGCCTCGCGGCTTTCCACTTTTGGCGGCGATTCTTT
-CAGATCTTTTCGGAGATCTTTGGCGCAGAAATCGCAGGGATATGTCTGAA
-AAATTTAGGCGTTTTTGTGGGAATCTTGAGCTTATTAGCTAACTTTTCCT
-AGAATAGACATGAAACTTCTGGCTCGATCCTTATCCTCGTCGGTAGGCTT
-TTCCGGGTAGTAAACCGACATTGTGTGTAGCAAATTCCACGTGGATCTGC
-CTGAAATTTGAAATTTTTGGTGGAAATTTGAATTAAAAGCGAACCGAGCT
-CATCCTTGTCTACTGGACATCCGTGCAACTTCGCTCCTGTGCTCGTGCTC
-GGCGTCGTCTCGGATTCTGCAAAGAACTAAAATAATTGAGATTTTTTGCT
-CTGGAAATCTAGGGAAATCACCTTTTTTCTTTATTTTTTCAGCCATTTCT
-CTGCCTTTTTTCATCATATCCTCTACACTGACGCATGCACGACACGGCTT
-TCCATCTGGACCGATTTCCATTCTGAAATTAATTTTTAAACTTGGTTTTC
-GTTTCGTCAGTTTTAGAAGCCGTTTTAGGGCGTAAACTTATGAAACTATA
-CATAGTCTACGACAAATCTATAGAAATGCATTAAAAATAGGTCAAAAATG
-TGAGAAATTGCGCAAAAAATGATGCAAAAACGAAAAAAAATTAACTAAAA
-ACAAGAAATGCAAGTGCGCTCCACTGACACGCGTTAGAGAGCGTAGACGC
-AGAGAAATCTCGAGATGAGGGAAATCGTGGCGCGCGGGAATCAAGCTTTT
-TTGAATTGTCTTGATTTTTAAAGCCCAAAAAATAGATTTTTGGCGGATTT
-TTGGTGGATTTTCTTGCTTTGCAATGTAAAAATTAATTATTTGTTGCATC
-TAATCACTTTTAACAGAGATTTACAATTTTTTTAGTGGTCTGAACCTGGG
-AAAATCCTTCAAAAATCAATTTTCCCTACAAAAATTCGTTATTTACCGCA
-TTTTCCGCCCAGCTGATCAAAAATTCTTCTATTTTCTCAATTTATTGATA
-ACACTCGCCCACCTCAAGCATTTTATCACCTGAAACTCGTCACACTTTAC
-AATTTGTTTGCAGAAATATGCGAAAATGAGCGTTACTCAGCTAAAAAATC
-TGAAACACGCGATAGCTCAGCTTCTGGAGTGGGATGGAACGAAAACGGCG
-AGAAAGGCAAGTTTTTGGTGGAATTTATCGAAAAAACCTGATTTGTTTTT
-TTGCAGAAAATCGTCGACGAGGTGGTTCTTCTCTATCACGCTCTGGGAGC
-GGAGGCATTAAGTGAGGATAACCAGGAGATATATGATTTGTATGATTTAT
-CTGCACGTATATTCAACTTAGCTAAGAAAGTTAGTTTTTTTTTTGTTAAA
-AAGTCGTAAACAACAAGTAAATTTAAAAATAAGCATTAAAAAATATTGAG
-GCTTATGAGAGCAAAAAATTCCAGGAAATCGAAGAAGCCAACCAACAATT
-CGAAAAAGAACGAAAAAAGGGCACAAGACGAAGCGAAAAACCAGTCCCAA
-CTCCACTTTTCGAGCTATCAATACAACATTTAAAACGTTGCTGTCAGCAG
-GGAATCGATCACAATCAGGTGCCATGGATAGCATATTGTCTGAAACTACT
-GGAATTTCCAATCACAATCACCGAAAAATCGATCGAAAACGAGATTTCCA
-ACGTGCTCCTATTGAGCTCCAACGCCTCACAGCTCCATTGGGCCGAGCAT
-GCTCATTTGAGCAGCTTATGGAAATGGATTTGGAGCCGTGTCGAGACCGC
-CGATATTGGGGCACTCGCCATGAGAAATTATATGGAATTGGCGGCGAACT
-TGCTGGAAAACGTGGATTACGTGGTTTTCGAGAAGTCGCCTATTGACCTG
-ATGGCGAAAGTGATGGGAACACTGAAGAAAAGTGTGGAAATGGGAAATCC
-CAAAGAATAGTGCGTGGAAAACGAGTTCTTGAAATAATGTTCAAAAAATT
-CAAATTGGCTTGGACTTAGGCTTAAGCTTAAGCTTAGATTTAGGCTTAGG
-CATAGGCTTACAAGGGAAGTATTTCAACTTATTCCCGGACTTCAGAATGA
-AACCTATGTCATTTCGAAGAAGACTCTTTAAGTAGGTCCCTACAAAAAAT
-TTAGCGGCAGAGGAGCACTTTGACCTGGAAAAAAGTCGCTCTGAAAACTT
-TTCAGTGCATTTTTTCACGGCTTTCAAGGCCCGTAAAATGGCTCCAAATG
-CGAATTTTTGTAGATTTTTGAAGATTTCTAGGATGCTCAGGGGCCGGAGA
-GCACTCGGAATTTTTTTTGGAATTTTTTAAAATTTTCGAAAAAATCTGAA
-ATTTTTTGAATAAGTCCATGGCAAAATTTTTCAGTGAATATATATATATA
-TTTTTTTTAAATTTCAGAAAAGTTGTCAGTTATTTAAGATCAAAATTGGG
-TGTTTTTACACAATGAAAATTTTTTTGAGATTTTTCGGAACTGCAAAAAC
-CAATTTTGGAAAAAAATCGGCACCCGGAGTCGAACCCCAGTCTTAAAAAA
-TATTAATCAAACTCGCTAACCACTCGGTCATTCAACGACAATTTTTCTTG
-TAAATGAAATGGATGACAAAAAAACGTGACTCTTTGATATCTACTTAAAT
-ATATAGGGACGTGAGAAATAGCTTTGGAAAAGGAGAGGACGCAGAGAAAA
-ATTTTCAGAGCGACTTTTTTCCAGTTCAAAGTGCTCCTCTGCCGCTAAAT
-TTTTTTGTAGGGGCCTACTTAAAGGGTCTTCTTCGAAATGACATAGGTTT
-CATTCAGAAATCCGGGATTAAGTTGAAATACTTCCCTTGTTAGGCTCACT
-AGGGAATGACCAGAATAAATGGAGCGATATTCAAAAAAAATATATTGTAT
-CGGAAAGCTGGCATTCTCTACTATAAGAATATGACTGAAATTTTTGCCCG
-TTCGGGCTGGAAATCTGAAATTTTTACGTCTGAAATTCTACACTGAAATC
-AGTGCATTTCCTATGGTTAACAGTGGATTTTTGTCTCTGGCGCCAACAGA
-AGTCTCACCACAATGGTGGAAGGGCGAAAACATCGGTTCGGTGGTCGAGT
-GGTGAACGCGTTCGCCTCTTGAGCAGAAGTTTGTGGGTTCGGTTCCCATA
-CATGGTTTAACTTTTGGCCTTTTTTATACAAAATTTTCAGAACGGGAAAC
-AAGTATTTAGAACATTTTTTTGAGGGTTTTACATAATTTTTTTGCTTTTT
-AATTGAACCATAATTACCCTGGAAACTTTTCAGAAATTTTAATTTTTTTC
-GAAAATTGTCACTTTTTTCTCCACCAAACCCATGAGAAAATTTGATCGAA
-AAATTTTTTTTTGAAATTTTTTTAAAAATGCATGAAATATTTTAGAGTGT
-CACAAATAACCTATTTTTCATTATTTTCAATGACCGAATCATTGATTCTG
-ATGCCTTATCAAGACGTTTTACCAAATCGATATTGGCAAAACATCTTGTT
-TTTGAGGCTCCATATCTCTGCAGGAAAAAATCGCACTAAAAAGTGATCAA
-CTAGAAACTTGTTAAACACAATGTGATCTAAAACATTTCAGTTGAACACT
-TTTTTGTAAAAAATTTCGTTGCCGAGTTGGAACCAATTGATTTGAGCTTC
-ATTATTTTTGAATATTCTAAATAGTTAAAGATCTATATCTTGGCAACGAA
-ATTTTTTACAAAAAAGTGTTCAACTGAAAAGTTTCAGATTACATTGTGTT
-TAACAAGTTTTCAGTTAATCACTTTTTAGTGCGATTTTTTCCTGCAGAGA
-TATGGAGCCTCAAAAACAAGATGTTTTGCCAATATCGATTTGGTAAAACT
-TTATTTTAATTTTTTTTTTTCATATTATTGTTTTTATATTGGGTCAAAAC
-GTATTTGCTCTGCTAAATAGTTAGCTGGCGCTAATTTTTAATTTTATTAT
-TTTCGTATTTTGATAAATTTCACTGAAATTGTCACTTTAATAGTTTACAT
-TCTATTGGTTTTCTTTTATTCAATGTCTTTTGATATCGGAAACGTGATGT
-TTGCCTTGCATCGTCATTTTCCCAATCCCCTCCCATCAAATCCCTCGATT
-TCGAGACATGAGCAGAAGGTGGCAGATCATTTGGCAAGCATTATAAAGGA
-ATCTTATTATGGAGATACCAGTGTGGAAGAATCCGAATATTTGGTTCAAG
-AAGAATATGGCGATTGGGAGCCAGAAGTTTTTGAGGTATGTTGGTTTCGA
-CACTATTAATTGTCATTTAAAAAACCTTTCAGCCGTATGACTGTGTGTTG
-CCGGATCAAGATGATGTATTGTTCGGTGAGAAAGCTGTATCAAGGGAAGA
-GTTGGATAAAGCGATCACCTTCTACCGTAGCGGAAAAATTGGAAGTAGGC
-CGATAACGACTATGCACCATAGTTATCGCTGGATACGAACCGATGCTCAT
-ATGAACAAACTGCGCAAGTACGAGAAAGATAAAAAAGCGTTCCAAGAAAG
-CGTGCGGGTTCGTTTGGCACAGCTTACACAACGGCTTTATGAGGAGGTCA
-AGGAGAAACTTGATAATGGTAACGAACATTAATATAACAAGTTTTAATAT
-AAATATTTCAGGAGTCAATTTGCATGATTCTGATTTGATGGCTATGGCAC
-TGGAAATCAACACCCGCGAAATGAAGTTGCAAAAACAAAACGAAATGAAG
-TTGCAAAAAGCGTCACAATCCTGGATAACCCGATGGAAGCAAAGCCACAG
-GTATGTAATAAATTGCGGAGTATGTTAGATATATATATATATATATATAT
-AATTTCAGAATCGTGAGTCGGAGAGTCACCAAGTTTGTCACACGGAAGTG
-CCTGATCAATAAAGACGCTATCAAAAAAAACGCGGATGATTTTGTCAAGA
-ATGCCAGAACAGAGATCTCCAACTATCACCCGTCGATGGTCTTCAATTGT
-GACCAAACCGGAATTCAAAAGGAGCTGTATCCAGCCCGGTCTTTAGCCTT
-TATGGGCGAAAAAACAGTCGAGAGGTTGGCGCAATCGAAATCGTCGCTGA
-CCCACTCGTTTACGTTTCTCCCGATGATTTTCCTCGATGGCTCAATGGGA
-CCCAAGGCGTTTATGGTAATCGCTGAACCAAAAGGCCAGTTTCCTCCGTC
-TCGTCCAATTCCAAACTGCCCAAATTTGGAAGTGCGGGCTGGATACAAGA
-CACACATCATGACGAAGCAATTGATGTGCGATTTTTTCGAAAGTTGTGTC
-TTCATTCCGTCTGTACCGAAAAAACTGTACATCATGCTGGACAGTTGGCC
-AGCGTTCAAGGACCATACAACGATCAAGAACTTGGTTCCCAATGGTCATG
-ATGTCGTCATTCGCAACATTCCAGAGCACACAACTGGAATGATCCAACCG
-TTGGATGTCTATTGGAATGCGCCATGGAAGGTATGAATTTAAATCTTTAT
-AACTTTTTGATAGTATTTTCCAGAGCTTGATCAAGAAGTTCACAGCATAT
-GCCCTTCGAACCCAGACGGATTACGTCATCGCACAGAGGAACAACGCAAT
-TTGCATGGTATCTGTGTTGTATCACCAGATCTCGGCAGAGCACTTCCGAC
-CGTTTTTACAGCATTGTTGGAAGAAAGCTGGATACGTGGGTGCTGCGAAT
-ACTTCATCAACACCATTTTTGACTCCAGCTCAATATTGCATTGATCATGG
-TGACACAGTGATTTGCTATCACACTGGATGTAACCATCTCGGATTCATCC
-GATGCGCAAGATGCAAGATGTTTGTTTGTTTTAATCATTTTGTTGTGTCA
-AAACAACATCTTTGTTCATCTCCTTGAATAATTAATAAATTCATGATTGC
-ATTACATTCAAGTTTCGCTATGAATAAAATTGTTTATATGAGGGGATCCA
-TGGTTGTAGTGGTCCATGGTTAAGTTTAAATTTTAGGGGAAAAGATGTTG
-AATGAATCATTATGGTGTTGGTCGACACATTGATCATGCTGATATCGATC
-AGAAAAATTAAAATTTGGGCTTTTATATAGTTTCGAAAAAACACGTTTAA
-ATTTTTGAAAAACTTTACGTTAGGGTGGAATTGAACCCCAGAGTCCCACC
-ATGCTTGTCATCCACTCTATCCACTCGGCCATCTCGCTGTTGCAGGCAGT
-ACTAATTGGGGATGGTGATAAGTAAAGCACGTCAAAACGAATAATTTCAG
-ACGTAAAAATTTCAGATTTCCAGCCCGAACGGGCAAAAATTTCAGTCATA
-TTCTTATAGTAGAGAATGTCAGCTTTCCGATACAATATTTTTTTTTTGAA
-TATCGCTCCATTTATTCTGGTCATTCCCTAGTCAGGATCAGCCTCAGGCC
-TAGGCTAAGCTTAGGATTAAGGGTAGGCTTTGGCTTAGGCTTATGCTCAC
-GCTTAGGCTTCGGCTTGAGCTCAATCATACATCTTGCTTAAGCACGCAGC
-TTAACAGCAAAGCTTAAGCACACAGATTGGGCTTAGGCTCAGGCTCAGGC
-TTAGAAAAAGTCGAAAAGTTAACTAAGTCAAAAAATTTTATTGTTAAAAA
-ATTGTTTAAAAAGTATTATGATTTTAATAGAAAATTGGAAAAAAACCGAA
-AAAAAATGAACATAAATCAAAAAAAAAATTTTTTTTTAAAGAAAACTTCT
-TTTTTTTGAAAAAAATGCAATTTTAAGGTTTTTCTGAAAAAAACTGGAAA
-ATACTTTGATTTTACTGTAAAGAGAATTTTTTCTGTTTTTTTCCAAGATT
-TCAACTTATTTCTGCGAGTTTTTTTTTTCAAATTTCCTCTTATTACAGTT
-GGTGTCATTACCGAAAATTCTCGGTCGTCCACATTCTCTCATATATCGTA
-CATCGTTGGGGTCTCGAAGCGAGAGATTTCATTCTTCGTGAGATTTTCGA
-GCTCACTGGTAGTTTGTCCAACTTGATATCAGTGGCTCATAAGGATGGAG
-AACAGTCCAAGGTTTGAGTTTTTTTTTCTGAGTTTGCAAACGCGCCCTAA
-TTATAAAAATTTGGAAAATTCCACGTGGAAAATAGTTTGGCGAAAGTTTT
-TATACAAATTTTTCGTGGAAATTAATTTTTTTTCGAAATTCTCTTTTAAA
-AAATTTAAAAATGTTTTATTGGCGTATTATTTTTCTAAATTTCAGTTTTT
-CGCAGATTTCACCAATAAAATATTTTTTTGAAAAATATCGCTTCGAGACC
-CAAAAAAATAATTATGATTTCAATGAAAAATTGAAAAAAGCCAATGAAAT
-CGAGAAATTATCGAAAATAATTCGAAAATTGGAACTTTTTAAAAATTTTA
-AATTTTTTTCAAAACAAAAATAGTTTCTCAACTTTTTGCTAAACAAGAAA
-TATATTTCGTGGCGAGACCCATTTCTACTAATTTTCTTTTTCAGAAATGC
-ATAATGCGTTTGATTGATGATCTCGTGAAGCTCGCCATGATCGAAACCGT
-ACACGGCCACCGTACCATGAACGAAGTGACACGTGGAAATATTCAAAAAC
-TCGTGAAAACCGGAATCCAAGAGTCTCTGAAATCGGCGCACCGAAATTTC
-TCAAGGAGTTCGACATTTTCGATTTCCGAAGAATGCGTGAGATATCTGAC
-GAGATGGTTGTTGGCCGAACGAAGACTTGAACAGCCGTCTGCGGCTATGA
-ATGAATCGTTTGAATTGACCGGTGATAGCAGTAGTAAGAAGAAGGACGAT
-GCCACGTTTGATAGTGCGTAAATGGAATTCTACCAAAAGGAGATCTACAA
-AAAGAAAATCTACGAAAATAGGATTTGGCACGGTGCCAGATCGATCTTTT
-TTCGGCTCAAAATTGGAAAAACCTGCAATTTTTATACATTTTTGGCTTCG
-AAAATCAGGGAACTCTGCAATTTTTGGCATTTTTCGCTAAAAAATTGGAA
-AAATCTGCAATTTTTATACATTTTTGGCTCACAAACTGGAAAAACTTCCA
-ATTTTCATCTCAAAAAATCGGGAATATCCGCAATTTTCCTCACATTTTTA
-GCTTAAATAATTGAAAAAATCTGCAATATTTTACATTTTTGGCTCAAAAA
-ATCGGGGAATTTTGCAATTTTTTACATTTTAAGTTTAAAAGTGGAAAATT
-GCAAAAATCGGCATAATTTTGAACGTTTTCTTTTTTCCGGTTTTCCGTTT
-TGTTACGATTTTCGTTTTGCATGGAAAATGCTTCGATTGATACCCTTCTT
-TCGGAAACGAGTTTCTCCTGAAATAGGCGTAGTCTCAAACCATTTTATGG
-GCGTGGTCTTTCTCTTATCTTGTTTTTATAAATGTTGTTCATTAAAACAT
-TTTCAGGCCTTATCGATCTCTCCTTTGGCTCGACGATTTCCGGAAAACAT
-AAATTGAACGCGTGGAATGGTGTAATGCAAATCCTGAATGAGCTCCTAAA
-AAGTCGACGACTCGAACTTCAAGTCACTGAAAAAATCGTGACAATCCTCT
-GGGAAAAGCGAAAATCCTACACAACGGAGCCACTCCGTACTGTGTTCTGC
-TCCATTCTCTCCACAGTCGTCTGCCAGGCCGATGTTCGATTCGGTCATCG
-GAAAGTGCCGACAATCGACTCGATTCTCAAATATTCGCTGTCTCTAATGC
-CAAATGTCGCATCTCTTCCCAGTGCCGCTGCGTTGACCGAAACGATTGTC
-AGATTCAGGACAGTATCACGAGAGGGTCTCCGTAACACGTGGGATACCGT
-ATCCCGAACTAGCTCCGGCTCATTTGAAGTTGTTCGGCTGATTTCGGCGT
-TGATCTCCGTTACGGAATTTGATGAGAATTCGAGATTCGCCAACGATGAG
-AGAGTTCGGAGTTGGAGGTAAGTCACTATGCCACGTGGATGGATTTCCTT
-TAAAAAGAGTTTTTGGAAAACAAATCAGATTTTGTATATCACTTCACCTT
-TAAAGCGAAATTCTTGTTTTTTTGCAGTTTTCGAAAAGACATAATCGAAT
-GGGTATTGCTGGATCCGAATGCACATAGTCACAAATTACTCTATCAGTTG
-TGCCAGTATCATCCAACGTATTGTTATGAATCAGAAGCTTCTTCTAGTGG
-TTAGTTTATTCCGTAGGGCTTCCATGGTAGGCAGGCGCGATTTCAGGGCC
-TGACGCCTGCCTGAAACCTGCTGACCTTTCGCCTCTTTTCTCTCATTGCT
-ATCAATTTGTTGAAAATCAAATTAAGAAATTAAAAAAAAAGTTCACGTAT
-GTTTTGTCGTGGATTGAGGCGAGGGGCAGGTGGTGGTGGTCTTAAGGTCA
-GGTAGGCAGGTGTTTTCACGCCTACATTGAAGCCATAGTACCCCATATGC
-CGAAAACGCTGAAGTTTTCTCATTTTTCCAGACGACTCCCTGCTTCAAAC
-TCTGAAACTATGTAAATTAGCTTGCTCTCCAGCTCCCCCATCGGCTCCAA
-AAGCCCTCCGACCACTCGAAGCTTCAATTGAAGAGATTGTGAGATATGTG
-CATGATAAGCTCAAGAGCATTCTCGGTGAGCATCGGCTGTCGTTTTTTTG
-ATTTTTGAATTTTTAAAAACATTTTCAGCGACTGAAATCACTCTGCCTGC
-ATTTGTGCTCTGCCACGAATTTGCTCTGAAGTATCCGGATAGATCTTATG
-AGTTTAATGTTGGTTTTTTTTTCTAATTTTCGAAAAATTTAAGAAATTTT
-AGGATATAAATAGAAATTGAAGAGAATTTGAATTTTTAAAAAATTTCGAA
-TTTATGGAAATTCAGTAAAGTTTGTCGGAGTTTTTAAACGAATTTTCAGA
-ATTTGTAATAAAAACTAAATTTTCTAATTTTTTTTCCACAATTTACAACA
-TCTAAAAAACTTTTTAGAAATGAATTGTTAGAAGTTAGAATTCCTGGAAA
-TTAAAAAAAAATTTGGATTTTTTTAGAATTCTTAAAAGTTTGATATTTTC
-AAATGATATGAAGTTAACACATTTTTTAAAATATTCAAAATAAGAACATT
-TTAATTTTTTTGAAGAAATGTTCAAAAAATTAACATTTTTTGGGACTTTC
-AGAAGTTTCTTCTTTTTTTTTGCGTCTTTCAAGATTTTTTGCAATTTGCG
-TAATTTTTATTAAGGGGACAGAAAATTCTGAGAATGCGGATTGCACAACA
-TATTTGACGCGCAAAATATCTCGGAGCGAAAACTACAGTAATTCTTTAAA
-TGACTACTGCTAAAATTGAGCATAAAAATAAAAATATATCGATGTATCTT
-GGATCCCGTAAATCGACACTAGCGCGCTACAGTAGTCTTTTGAAGAATTA
-CTGTAGTTTTCGCTACGAGATATTTTGCTCGTAAAGTGTGCACGAATTCT
-TATAATATTTTGTTCTCACAAAAGTTGGTCAATTTATGGGATTCTCAAAT
-TTTCGATGTTTTTTTTTTTGAAATTTAAGATTTTTAAAACATTTTTCAAA
-AAACTGATTTTTCTCTTAAATTGAAAAGGTTTTTTTTTCAGAAAATGTAC
-AAAAAGCTCTACCAAATCATGGAAGATCAAGAAGAAGACGAGTTTCTCCA
-ATCAGCTCGCCATTTCTCAAAATGGCCTCAAAATCTGACACTACCAATAC
-AAAAACAGACAATAAATTGCATGGCTGTCTTTTTCGAAGCGAATCTTGAC
-AATCAGCTCGTCGATCTCTGTCAGTGGAGTGACCGACGAAAAGTGCTTGT
-CGAGATGCTCGCCGAGCTGGCCGCCACAAGATCTGAAATTCGAGATAAAC
-TTCAAAAATCGATGCCGTTCAACAAATTCGTCAAGGAGTGTATAATGGAG
-AATCGCGGTGATTTGTATGAAATGACAAAGAGATTTGAGAAATATTCGTT
-TTTGCTCTCGATTCGGAATTTAATTGTTACTAGGATGATTATAACGTGAG
-TGTTTGTTTTGGGGATTGCCACGAAAAACTGGAAAAACGTTTCGAAAATT
-CAAAAAATATTTCTTCAACATTAGAAAGAATTTCCATTTTTTATATAATT
-TTGGAAAGTTTTTAGATTATTTTAGATAAAAAATCATTTCGAATTTACAA
-AAAAAAATTATGAAATTTTAAAAACAAGTTTGAAAATGTATTTTTAAAAA
-ATTTAAATATTAATAAAAAATCTTGTTTGAATTATTTAAATGTTTGCTAT
-TGTGTTTTAAAAAAGCTTAAATTAAAAATTTTTTTCAACAAATGACTAAA
-TTAACAATATATAACAAAAATTCAAAAAAAATTGTTTTCGAGAAAATTTT
-TTGCTTTTTTTAAAAATAAAATTATAAAAAGAAACAGAATAAAAATCGAA
-AAAAAAACAATTATTTTGAAATTTTCAAAAAAACTAGAAAAATGTAAAAA
-TTTTGAGGAAAAAAATTCAAACATCCCAATTTTTGCAGAAACGAAGCCGC
-CCGACTCCTAGGAGATGGTGAAACAATCAGTGAAACCGATATCTTCATAA
-TCGAAAAGCGTACTCTTTCCACGTGTATTCGTAATGTGTCCGAAGGAAAA
-GAGTTGAGCGGCTACACACTGGACCCCTATACGGTAGCTGCCAACGTGCA
-CAATGTGCATTTCGATCACATAAACGTCGAAATCTATCTGGAATTGCTGA
-AAAAGTCGCCATTTTTCGCTCAGAACATTGTACGCCACTTGTTACGGCAG
-AATGGAAAAGAAGCAGAAGAAGAGACGTGGCACTTGCATGCCACTGTGCT
-GAAAATTGTGATGAAAGATGAAAAGTTGCTGGCGGTAAGGAATTTTTTTG
-GAAAAACTTGAAAAAAAAGAATTTCATCGTATTTTTAAATAATTTTTTGA
-ATGAAAAATTCGGTACTTTTCCTTTTCTACCCCGCATTAAAAAAATATTC
-AAACTATTGACTTATTCGAATTTAATTCTCACGTGAATGTTTGTATTAAT
-ACTATTTTCATTTTTAGGCTTAGAAAACAACAGTACTAAGCCTTGAAATA
-CAGAAAAAGAAAAAGAGTTCACGTTTTTATCAATGAAAATATTCCTGAAA
-AAATGCGGGGTAAAAAAGGAAAAGTACCAAAAATCAAACTTTCAAAGTTA
-ACAATACGCAAGTTTTCAAGTTAATTTTAATAATGGATTGTTTAAATCCG
-GAATTAAAAAAGTGGTTCAAATTTTATTTTATTTGACTCTATTGTGGCGA
-TTTTCATGACAATTGAAACGATTTTTGAAACTTGTATTTATTGAAAAAAA
-AGTTGAAGCAGGTCGTAATTTTAATTTGAATATTTAAAAAAAACTTATAT
-GGGTGCTTCAATTTTGCAAAACATTGCAATTAAAAAAAAAATTTTCAAAA
-TGTGGTCGGCAAATCAGAGTGTTTGAAAAAAATCCTTCTAATTGTGTTTC
-CGGAATTTTTGGGATTTTTTCTTCGAAAATAGGAATGGTTTAAATTGAGT
-TAGAAATTTTTGCAAATAAAAATCGGTTTTTTAAAATCAATTTCTTGCAA
-TCAAAAAATTGAAATTTTCAGCAAAATAATAAAGTTTTCTCTAATTTTTC
-AATTTTCAGGTATGCGTGGCCACAATTCCAAATATGGTTCGATATCTCAA
-AGTCTATCAGATTCATTTCAGTCCGAAATCCAACGCGGCGAAGTTCTTGT
-AGGTTTTGTAACTGCGAATTTCAAAATTTTGCTCGTCTAATTTGACGCCT
-GCTCTGTTTTTTTTTACGCGCAAATCTTAGAAATCGGTGACTTTTTCGTT
-TAAAAACACCATTTTTCAGTAAAATCTGAGCAATTTTCGGTTTTTGCGCG
-TCAAATATGACTAATTGAGTCAAACTTGACGCGCAAAATTTTCAAAAAAA
-AAATTCAATATTTTTCCAGACACCTCGACATGGAATCGATTTCCCACTGC
-CAATCATATTTGCGAAAACCAACAAAATCATCCAATCTGATCACGGCCGC
-CAACTTTTTGACACTTTTCGGATGTGAAAAGCGCACGTGGAAGCGCCCGA
-TTCTCAGATTTTGGAGCATTTTCAAGCAGCAACCGGCTATGTGTTGCGAG
-AAATTGCTCATTTTTGTAAGCAATGATTTTTTGATAAGAAATTTCCCAAA
-AATTTTGAATTTTTGAATTATTTTTGTTAACTTCTTATTTTTAACTCAGT
-ATTTTTGCAAACTGAAAATTTCCAATTTTTGGGCTTAAAAAATCTCCATT
-TTTCAGGCTGAAGAATGTGTCGAACTTGGCCTGAACCACCGAATCGCTTG
-TCTTTTACGCGCACTGACAACCAGTGAATTCTGCCGAAAAGCTCTATGTG
-ATGAATATCTGAAAATCGCGTTTCAGCTGACTTATCGATCGATTTTTCTG
-ATTTTAAGCAAAAATGAGTGCAGGTTGGTGGAGAAGGATATGTGGAAAAA
-CAATATTTGAAAAATAAAAAAAAAACTAATTGATTTGAATTTTCAAAAAT
-TCCAAAAAAATAAAGAATTGTATTCCAATTTTCATGAAAATGGCAACAAA
-AAACTCAAAGTTTCATTGGAAAATTTTTGAAATTACAAAAAAATTAATTT
-TTGAGTTTCAATAAAGTTTCAAAAGTTTAGTTTGAGTAGTGTTGTCAACA
-AAAATTGAATGCCTATTAGAAATAGTTGAAAAAATTGGAATTTACAAAAA
-AAAACAATTTTTAAACTAATTTCTCGAATTTCAAAAAAAAAATCTTCTAA
-TTTTTGAAATTGAACAATTTGGAAATTTTTTGAATTTTCAAGAAAAATTT
-TCAATTTTTCGAATATTCAACAGTTCCAAAAAAAAATTTGTTGGATTTTT
-TTCCAATTTTAAACAAAAAATTTTCAAATTTCCACAGATTTTTTTTTAAT
-TTTTTAAATTTCAGAAAAAAATTAATTTTCATAAAAAATTGAAAATTTCC
-ATTCTTCAAAAATAAGTTTTCACATTTTTCAGACCAGAAATTGTGGAGCT
-CTGCGATGACATGAATCTTCGGTACGATCTTCTCCAGCACCAGATCAAAC
-ATGTCGCGGCTCACCATTTGGAGCACTTTGAGCGTTTCGAAACGAAAATC
-GCATTTTCTGTTGAGAAATTTCTGAAATCTGGAATTGATGGAATCGATTT
-TGAAGATTTAGGATTAGTCGAGTTTTATAAGCAGTTGAACGAAAATTTGA
-CAGAAGACGCGATCAGGAGCAATGAGGCGAGAAGTAAGGCCGTGGAATAT
-AAATTGGTGGCCGAGTTTTTTGTAAACTATGCCACCAAACTTGGTTTCTC
-CGTTCGTGGCCACAAAAATTTTGAATTTTTTGAGCTTCTCTTATAATGTT
-TAAAAGTGATTTCCTGGCAAAAATTCATTTCTTTAATTAGAAAATTCCAA
-AAAATTTGAAAAAAAAATGTAAACTCAATAAAAAGTCTAATTGTTTCAGA
-TTTATTCTGGTTTTTATTGAATTTTCAGATTTTTTCTTCAATTTTCAGTT
-TTTTTCGACTTTTCTAATTAAAAAAAACCAATTTTTGCCAGAACAAAAAC
-CATTAAAAATCGACAGTAGTCATCCCATTGGAGTACAAAAATTTTAATGT
-CCAAATTTTCATGACGAACGAAGAAACCTAGTTTGGTGGCCTAGTTTCCG
-AAAAAACTCTGTCACCAATTTCTTTCAAAATTCAACAAAATTTTAGTAAA
-TTCCAAAAAAACGAACATATTCGGCGAAAATTATTTCAAAAGCTTCCGAA
-CAAAATCTAAAAACGTTCAGAAAGTTCTGGGTAATTTTTTAAATATTAAA
-AAAATTCAACAAAAAAAGGGGGGCAGATAGCTCAGTCGGTAGTGGTGGCC
-GCTAGCAGTCTGGAGGTCACGAGTTCAAGTCCGGCCTCACCCCCTAGGTT
-CACCCAGCCTCTATTGGGAAGTGGAGCAATCCACGACTGGATTATCGGCC
-ACAGTCCCCGGCTAGGACGTGGCTTAAATTACAGCCCAGAGGGATCACCA
-CCAGGCAGTGTACCTGAATCCCAGATCCGCAGTGCATAGCACTTGAAGAA
-CGGATCGTCCTTTAATTCTTTCAAAACTAATTTTTTACTAAAAAAAATTT
-CCAGACATCTACATCGTCGACATTCTCTCAACAATTTGGCTCCAGCTCCC
-CTCAATTCGTCCTCAAATTCTACCGATTCTCGCCCGCTTCAAGCACATTT
-CCCCAGCGTGGACTAATTTCCCACAGCCGCCTCATATTTCGACAAACGAG
-AAATCATTTCTTCAACATCTACGATTTCATCTTTATCTAAAAATGATGAA
-TATCTCGAAATCCATGACGCAAGGCGAGTATGCCACGTGTATTATGATGC
-TCCTGACGAGCTACGACTCGAGCCATTTCGTTGCGGATTTGATAGAGAAA
-AAGCAGCTGGGAAAGCTGAAATTGCAGCAGAGAAGGAATGTTTTGTGCAT
-TTTGAGCCGACTTTTGAAAGATCAAGCTGTGATGGGTGATGAAGATGAGA
-CGATTATCGATCCGATTCTTTTTAAGGCAATCACCAAAGCTTCCGCCGTT
-TTTGTACGTTTTTATACGACGGAAATCACTGAATTTCATGTTTCTATGCC
-GAAAAATTATGAGCAATTAAATATACATCACAAGAAAGAAAATAGTTGCC
-GGTTTTTGAATTTTTCTGTCATATCGGCAATTTTGGCAACTGCCACTTTT
-TGAAGTTTTTAAAAATTTGGTAAATTTGGCAATTGCCAAAATTATCTCTG
-TTTCGATTTTTTTCATCAGAATCATAATATTTTAAATTTCGCGCTAATTT
-TTTTAGCAAATGATCTTCGAAAATTTAATGTCTCGCAGTTAAAAATACAT
-CTTTGCAGGAAGACACCGCCGCGTGCATCGTACCATTTTTGTTCAAAATT
-TGTGTGGATTTCAAGGGAAAATACGATAAATGTGTGATAAATTTGCTGGG
-ATGTCTTAAGGGAGTTAATGCAGGTATGATTTTTCGTCAGAAATGACTGG
-AACGAGTTTTTCGCATCAATTCAAATTTAATGTAATGGCATTTGGCATAT
-GACATCGAATGTCGAATGCTGGGAATGCCGAATAATATATTTTGGTCGAG
-TAGGAGAATAAACTAGACAAAGTTCAAATATATTCCCAACAGGGATGGCT
-TCACCCGTGACCCGTTTCACCCGTTCACCCATTTTTACAAGGGAAGGTTC
-TGAACTCGTTATCGGACTTCGTTACGCCACTATATACATTCGATAGAGAA
-TGGTTACAGATGATCACTCCAAAAAATTTAGCTGCTTCAGAGCAGGTTCG
-ACCAAGTTACGACACTTTGAAGATGCCGAAAAAAAAAATCATTGATGCAC
-CCCCTTTGAAAAAAATTGAAAATTTTCACTGAAAATTTTTTTTTTCTGAA
-AGTTGATAAAAATAGTTGTAATCGATTTAAATAGTAAAAAACATATATTA
-TACAAGTTTTAGCCCATCACTCTCAAAAAAACCCTTAAATTAATGTACAT
-ATCTTGAGAAAAATTCCAAAAAGTAGATGTTCATGTAGATCAATTTAAGG
-GAGAATTATGAACTGAAACTTGTATGGTATGATTTTTCCATCATTTGCAA
-CTATTTGAAAACATTTTATATCAACTTTTAGAAAAAAAATTTTTTTTTGA
-ATTTTTTGGAATTTTTAAAAAGGGGTATTTTGGCACTTTCAAAATGTCGT
-AACTTGGTCGAACCTGCTCTGAAGCAGCTAAATTTTTTGGAGTGATCATC
-TGTAACTAATCTCTAACGAATGTATATAGTGGCGTAACGAAGTCCGATAA
-CGAGTTCAGGGCCTTCCCTTGTTAGGCGTTTTTACGGGTGACGGGTGACC
-CGCTCGCCCGTTTTTTTTTTCGTTTTAGTTGTTTTCACGGGTGACGGGTG
-GCTCGCTCACCTGTTTTTCACCCGTTTTTGGAAGTTTTCACGGGTTATGG
-GTGATCCTTGGTTCCCAAGAGGCAGCCAGTTTAGGTCAATAGGTCGTAAA
-TATCGTTTTGGGCCACGTTTACAACTGGGCTGTGTGCAACTAGAGGTGCA
-CTTGGGTCGAAAAGGGTCGACCCGCTCCAACTTTAGGTAGCATTTGTAGC
-GACCCCGATAAATAAAATGTCGACCCCGAATGAAAATTTTAGCAAGGAGG
-CCATGCTCGTTTAATTTCCATTTTCAAAATTATGATCGGACTATTGGTTG
-AGCTACTGTGAAATAAGCGGGTCGACCCTGCTCGACCCATGAGCACCCCT
-AGTGGCAACCATGATTTTCGGCAACTGGCAATTGCCAGAGTTGCCGAACC
-CAATAAGTTTCGGCAACCGGCAATTGCCGAAGTTGCCGAACTCTAAAAAG
-TGCAACCGGCAACTTTTGCGCAGCCCTGGTTTACAACTACCTAACGACTT
-TTGGTAGACTAGAAATAACACATGTATTCGAATTCGACATATGCCGAATG
-CCGAAAAAAGTATTGAACGACATTAGGCACAGGGATGGGCGGATACCTTT
-TCGGATAACTTCACTAAATCAATTTATCAATAAGTATTGATTTAGTTATT
-CTGGAGATACTATACTAGAATAAAGAGTACCTATTGAGCAACATTTTCAT
-ATGACAAAAACTTTTAAAATTGTACGCATTTTCCTCGACAAGACCCTGAA
-ACTCGTTATCCGATCAAAATCGGCTAACAGATAACGGACTTGCATACTTT
-TTATACGGGAAACGTGTAGAATTTTAAAAAGTTTTGTGCCATGAAAATGT
-TGCTCACCAGTTTCAATTTTGTTCTGATGCACTTTTTCCAGAATTACTAC
-ATCAGCACGTATTGATAACTTGATTTAATGAAGTTACCCGAAAAAGTATC
-CACACCCCATAATCAGCATATTTCATATGTCAAATATCAAATTTCCTGAA
-TTCCGCACACCTCTGCTCTCCATACTCCAACTAATTTTAATTGCAGAAGA
-CGAAATAGTAGTCCGCTGCCTTGCCGAATGCGTCGACTCCATTGGACTCA
-ACGTGATTGCTCGTTACGAACGCCTGAACATTGAGACTCATTCGGAATTC
-GGTGTGAAATGGTTCTTCAAATTATCCCGTCTCTTTCTGAAACATGGATT
-TACTACGCATTCCTTCGCGATTGCGAATATATTATTTGACCGACTTTCGG
-CGAGAAAACGAAATACAATGATGATAGATCGTACGAGTTTAGACCGAATT
-GACAGATCACAGGAACTTATCAATCTTTTGGTGGAGATCTATGTGGCCGA
-GGGTAACTCGGTAGCGTTGTCCTCTCTGCCACCTGCGGTACAAAATAGAC
-CGGATGTTCGGCAGGTTATGAATAAGAGTTCAAAGGAATGGTTGAAATTG
-CTGTCTTCGAATCAAATGGACTCGTGGGAGTTGACTATTGTGCAGTGGAT
-GTGGTAATTGTTTATTTTGAAATTTTTCATTAGAATAGAAAGCAGTTTTC
-TGGAAATTTTCAGGAAAACGCATTAATTTTTTACCTATTCTGCATTTCTA
-GGTTCTTCAATTTTTTGAGAAAATATATATTCCTTCGAAAAAATCACTAA
-CTTCTTTTCGGAAATTTAAAAAAGTTACAGTCGACGACTTTAAAAAATTC
-AGTTAATAAAATTAGATTTCAAAAACAAATCGAATTTTTTAATTTGTACC
-GAAATCTGGAAAATATTTTTAAATGACTCCAAATTTTTCCCTGATTCCAA
-ATATCTATGAGATAAAATTCAAAAAATAATCCCTTTTTGATCTTGAAATC
-GCCGAATTTCATTTGTGCACTCATGAGATTTCGAAGTTTCGCGCCAGAGA
-CCCCATGTGTTGATTTACGAGATTTGTGTATATTTACGAACCCCTTAACC
-TTTATCGGTTGCTGATTTCCGTTTTTCAACGAGTTTTCTTCAGTTTCGTC
-GGTTTTTGTTAAAGTTTTTGTTTAAAACATTTTCAAAAAAACTTTGACAA
-AAATGAAGGGAACTCGTTGAAAAACGGCAATCAGCATCCGATAAAGGTTA
-AGGGGTTCGTAAATATACACAAATCTCGTAAATCGACACATGGAGTCTCT
-GGCGCCAAAATTCGAAATCTCATGAGTGCACAAATGAAATTCGCGATTTT
-AAGCTGAAATAAAGAACCAGGGAAAAACATTTTTTCACATAGATGTTCGG
-AATCAGGGTCAAATTTAGAGTGAAAAACTTTTAAATTTTTAAATTTTTTC
-AGTGGCATCCAATTCAATGCAATCACCGGCGATAAATACCTGAATTCAAT
-TCTTCGTTGCAATTTCAACGAGTACACCAAAAAAATCGATTCCCCATTAA
-AATTCGTCTATTTTCAACTATTCCATCTTTCGACGAGCACTCTGGAAATC
-GAAGAAGCCATTTCTAGCATGCCGTTGGCTCCAACAATCGATCAAATGCG
-GCTTATGATTATAGCCAACGCGACGGCAAGCTTCGAGCCACAATCCGTTG
-AAGAGCACGTTGTTCGAGCTGTTCGAGAGCTCCGAGAGACGTCAAATCGG
-CGAAAATCCGGTGGAAATGTGAAGGGAATTAATGAAAAAACAACGAGAAT
-GGTGAAACTGGCCGAGATGCTCACCGAGAATAAAGCATACGATGTACGGA
-GCAAAAAATAATGGAAAATTTGAATTTATTCAATTGTCAAAAAAAAGGAA
-ATTTCCTTAATTTTTCGGTTTTTTTTTTCGGAAAAATCTGAATTTTTTCT
-ATTTTGAGCAAAAAATTTAATTGAAAATCCGGAGAAAATCGTATACTTTT
-TCTGCGAACCATTTTGTGGGCGGAGCCTAACTAGTAACACTTTTCAATTT
-CCAAACAGAAAAGTGAGAAAAAATTCCTCTTTTTCTCAAAAATCTAAAAG
-AAAAAAAAATCGGAAATTTTTGAATTTTTCGGTTTTTTCTGAATTTTTCA
-ATTTTCATTCAAAGAAGGTCGAAAACTTTTCGATTTTCCGGTTTCCTTTT
-TGAAAAAAAATATTTTAAAAATGTGTAGTTTGTAGTTTGTAGTTTTTGTA
-GTTAATGTCTTCCACATTTTTAGGCGGCAATAAACCTGCTCGACACGTGG
-GAGCACGAGTGTCTCCAATGGACATCTGTCGCTGCCGAATCAATCGATAT
-CGATTTAATTCGAATCTGCAAACAACACGTGACGTGTCGGTCGGGAGATC
-CAAGAATGGCGGACATAAATCTACGAACAATGCATCCACGTGTCCCGGTG
-ATGAGTGACCTGGCGATTGCCGAATGGTCACTCGCGTTGAGCAAGATTAC
-AATTGAATATCGGAATGATATGGAAGAGGGTATTCGGATTTTGGAATTTG
-GATGCAAACATTTACAGAATAAGGATTCTGTAGAGACGAGGTTAAAGGTA
-CATGCGGTCGGGTCTTGCAGCGAAATAATGCATTTTTAAAAATTCGAGAA
-AAAAATTGTGAATTTTGCGCGTAAAACGTGATTCAATCTCGAATTGTTCT
-ATAGATTTTTCCGACAATTCGGAAAAATGCCGGAATTGAAAATTTCCGGC
-AAATCAGCAATTTGCCGTAATTCAAAATTTCCGGTAAATCGGCACATAGC
-CAAAAATTAAAAATTTCGGCAAGTCGGCAAATTGCCGGAATTCAAAATTT
-CCGGCAAATCGCCAAATTGTCGAAATTCAAAATTTCCCGAAAATCGGCTA
-ATTGCCGGAAGTGAAAGTTTTATTGATAGAGATAAATTTAGAACTATCAC
-TAGAATTTAAATGTAAAACAACTAGGAGTTATCATGTAAAACTTGTCATT
-TGAATTTAACACTAGGAGTCCAATAGATTTTCAGATTTTAAAAAATTAAT
-ATAAATTCAGGAAATTTTTTTTGAATTTATCCACATTAATATTCGGTATC
-AGGAGCATAAATAGGATCTATTGAGATATTTTAACAAATTTCCGAACAAA
-GTTTCAAATATTTTTTTCCAATTGATAGAATGTTCCATGAAACATTACAA
-AAAAATTATTCATCAGGTTCTCCTAAAACTCCATTCCGTCTGTATTGGCC
-AACTGTCGAAACTCGAAGAATATCGCGAAACGCGTACCTACCGTATGAAG
-CAGCAGGCGGTCACCGCATTCGAACAACAAATTCAAAATTCGTGTCGAAC
-CAGTCTGGCACGTGGCAATTCGGGTGACGAATGGACGAAAAAAACGGTGC
-AACGGGTGAGAAAAGAGCATCAGTTTGAGAAGAATGATTTGGAAAAAGTG
-GATAATTCGTTGAATTCGGCGGCCCGGAAAGCTGTATCGTCGGGTTTTGA
-TGCACTTTGTGAGCAATTTTTGAAGTTTTTATTGAAAATTCAAAACTTGC
-ACAAAAGGATTTTAAATTCGATTTTTCGCGATGTTTTAGCAATAAAATTT
-TGAAAAATGACAAATTTTTGAAATAATTTCAGAAAGAGTGTAAAGTTTCA
-GAAAAAAAAATTAAAATTAAAATTTATTTTAAAACTTAAAAAAACCGACT
-TTTAGCGAATTTTTTTACGAAAAACAAAGTATTTAATTTCATAAATTAAT
-TCAAAAAAAATATCTAAAATTTTTGTGAAAAACTGTTTTATACAGTTTCA
-GAAAAATTTAAGAAAAAATTTTTTTTCAGAAAAAACCGGATTTTCTGTTA
-ATTTGAAATTATGGAAAAAAAAACCCCAAAGGGTATTACGGAACTACAAA
-ATTCTGAGAATGCGTACCGCGCAAAATTTCTCGTGGCGAAAACTACAGTA
-ATTCTTTAAATGACTACTGTAGTGTTGGTGTCGATTTACGGGCTCGATTT
-TAAAATTGAGCAAAAAATTATCACATAATACGAAGAAACGAAGGAAAATG
-AAACTAAGTTATAAAAAAATTCGAAAATCGAGATCCCGTAAATCGACACG
-AGCGCTACAGTAGTCAAAAATTAAATTAAAATTAAAGGATTACTGTAGTT
-TTCGCTACGAAATATTTTGCGCGTCAAATGTGTTGCGCAATACGCAGAGA
-TCTCAAAATTCTATGCTCCCGTAATAGATTTAGAAAAATTTTCCGAAAAT
-TTACGTCTCGAAAAAGAAAAAAAAACTGGTGTAAAAAATTACACCAGTTT
-TAATATTTACTGAAAAAAATTGGTAAAATCTAAAAATTAATCAGCTGAAA
-TTGATATGTTTTGGGATAAAAAATTTTGGCGGGAAACTCAAGTTAAAAAA
-AAAAATTTCAGTATGCATCAGCCAACTGGAAGACGACGACGAAGCGATCC
-GCGCTTCATCTCTCATAATATTTCCATTAATCGATGTGATCTACAAATAC
-GAAACGGACGTCGGAGTGATCGCCTTGCTCAAAGAGCACACCAAATCGAA
-GCTCCCGTCGAAGCTGTGGATAAGTGCCACCTCACACATTGCCTCTAAGT
-GCTTCTCCATCGAAAAATCGCAAATCACGAGACACTTATCACAGATTCTG
-TGTCATCTCATCTATGACTACCCGTATCACGTTTTGCACACAATTTTGAT
-GTATGATGACGAGAAGAACGCTTCCAAGGTGAAAGGCTTCTTGAAAACGA
-TATTTGACGCGCGAGCTGACCAACGGGATTCGTCGAAGCTTAAGGAGATT
-GTGATTACTATTCGTGAGGCTCACCAGGCTTATAGGTACATACGGCGGCT
-AAATTTTTTTTGAAATTTCGAAAAAGACGAGAAATTCGATTTCTTATCAA
-GTTTACAAAAATCTTCGCTTTTTTCTGACAATTTTAGTGTCGTGGTATCC
-AATCAACGAAAAAAATTAGGTTCTTCTGGTTATTTTTGAGCATATTCAAT
-AATTTAAGCAAATACTCTTTTACTTCTAAACTTTCATCGGCGATACGTGA
-ACAATTTCCAAAATTATATATTATCTAACGCTACAGCATATAATTTTTAC
-CAATTTTCATTCATTTTGATGGAAAAAAGCATCTAGAACATGTAATATGT
-TCAATTGTTCGATTTCAATAAAAACCGACGGCATCCTTGGTTTGAATCGA
-AAGTTTAGAACAGTTTTTTTCAGAGAAATTGCAATGCTTGACGTGAGAGG
-AAACGTTCGGATACAACGTGTTGAAATAAACGGAAAAACGATGTACCGAT
-GGCCACATGATTTGAAGATTTTCAAGTGCAAATTGCGTCAATTGCCGATT
-CCCACCATTTCGCAAAAGGTTTGTTTTTATTTTATTAAAATAATTTAATG
-AATATGTATTTGATCATACAAAAAAAAAATGTTTTCTTCTAAATTCCAGA
-TTGGTTGCCCGGGTGACTACTCGACGACTGACCTAATCACGTGGAAACGA
-TGGAAAGATGTATTCACAATTGCCGACGGAATTTCCACTCCAAAAATCTG
-GGAAATTGAGGGTAGCGATGGAAAATGGTATAAAACTGTGTGGAAGAAGG
-ACGACGTACGACAGGATGTGCTTGTTGAGCAAATGTTTGATGTTACGAAT
-AATATGTTGGAGAAGGCGATGCTTCGGACGTATAATGTTGTCCCGTTAGA
-CACTGAATGTGGAGTTATAGAGTTTTGTGGTGGAACTGTTAGCTTAAGTT
-CGTTTTTTTTTCGTTTTTGAAAAAAACCAAAATAGTATTACGATAACACA
-ATATGCTGAGAATGCGTATTGTACAACATATTTGACGAGCAAAATATCTC
-ATAGCGAAAACTACAGTAATTTTTTAAATTACTACCGTAGCGCTTGTGTC
-GATTTACGGGCTCGATTGTCGAATATTACGGGGCCATGAGATCATGAGTA
-TGCCTATTTACTGGCGCGAAAATATTGGCAGGCCGCGGCAGCGAGAGAGC
-GTGTGGCGAAGAGAGACGCAGGTCCCTTCGCTACGAGATATTTCCCGCCA
-GAAAAGTAGCATTCTCATGATCTCATGGTCCCGTAATAGTGACAGCGATA
-TTCCATTTATTTCACTTCAAAAATCGAGATGCCGTAAATCAACACAAGCG
-CTACTGTCATTTAAAGAATTACTTTAGTTTTCGCTACGAGATATTTTTCC
-CGTCAAATATGTTGTGCAATACGCATTCTCAGAAGAAAAAAGAGGGGGGC
-AGATAGCTCAGTCGGTAGTGGTGGCCGCTAGCAGTCTGGAGGTCACGAGT
-TCAAGTCCGGCCTCACCCCCTAGGTTCACCCAGCCTCTATTGGGAAGTGG
-AGCAATCCACGACTGGATTATCGGCCACAGTCCCCGGCTAGGACGTGGCT
-TAAATTACAGCCCAGAGGGATCACCACCAGGCAGTGTACCTGAATCCCAG
-ATCCGCAGTGCATAGCACTTGAAGAACGGATCGTCCTTTAATCCTTTAAT
-CCTTTAAAAATGTAAAAAAATTTCATTGCAAAAATATCAAACTATGAGAT
-TTTTTCTATTATTTTTCAGAAGAAGTTATGTGTGGTGTGACACGAGAAGG
-CGGTCTCCACCGGGAGTTCAATTCAGAAGAAGTTTCGGCGAGTAAAGTGT
-CGTCAATGATGAGACAAGTACAGACAGAGTCCACAGAGACACGACGACAA
-GTTTTTGTGGAGATTTGTCAGCAGTATTCTCCAGTTTTTAGGTAATTTTT
-CTGAAAGTTGTCGAAGTTTTTTTTTTTGAAATTCAAAAAAATTCCCAAAC
-AATTGGCCTTTTTTCAAATTTTTCCAAAAAATAAAATTACAGACACTTCT
-TCTACACCAACTTTTCGACGGCGCAGATTTGGCGGCAAAAAATCATAAAT
-TACAGGCAGAGCTTGGCCACGTGGAGTATTGGTAGGTTTCGAACTAAAAA
-TGCTAAAAAATTTTCGAAGAATTCGAACATCTCAGATTTTTTCCGAAAAA
-TAATAAAAACGTTATTTTCCAATTTTCTGAAAATAAGAATTTATTAGTTT
-CTTGCGAAATGAAGAGTCTCAAAAAATCATATTTTTTTTAAAAATCAGAT
-TTTTAAATTCTTTTTTTAAAAGTTTTATCGTGAAATTGAACGTTTATGAA
-AAATGGCGAGAAAAACTTTTTTTTCGCTTTTTCAAATAATTCTCAAAATA
-AAAATTCCAGTGTGCTACATCGTTGGCCTCGGCGATCGACACGCGTCGAA
-TATTCTATTCGATCAGAAATTGTGCACATTTGTGCATATCGATTTGGGAA
-TGATTTTGGAGTATAGTAAACGAACGTTGCCAGTTCCCGAACAAGTTCCA
-TTCCGTATAACTCGAGATGTGCTCGACCCGATTCTGATTGAAGGAATCGA
-GAATGGACAGTTGGCTGAGGAATGTACGCAGATTATGGAGAAATTGAAGG
-AAAATGGAAAGGTACGGCGGTCTGGGGAAATTTATACGAAAAGAAAATTT
-TGGACTGACAAAATTTTGGACTTGTAAAGCTATTTAAAAAATTCAAATTT
-CCCGCCAAAAATATTTTTTCAAAGAATTTGAATTTTAGCTAAATTTTTAA
-ACAAAATCTGAAGTTACCGCCAAAAGTTTTCCAAAAAAAATCGAATTTCC
-CGCCTAAAATGTTTTTCAATAAATTCAAATTCCCGCCAATTTTTTTTACA
-CAAAATTTGAATTTCGCGTCAAAAATTTTCCAAAAAATATTCAAAATTCC
-CTGAATAGTTCAATTTCCCACCAAATATCAATTTTTCTGAATAAAATTTT
-AGAATTTCTCGCCAAATTTCTTTTTCAATTTTTTCAATTTCCAAAATTTC
-CAGGTAATCCTCGGTGTCGCCTCTGCTCTACTCCGCGAAACGATGACAAA
-TTTCCGAGAAGCCGAACAGGCTGCCGGCCGCCCGTCCTACATTTCTGAAA
-TGGCCATCGGACGGCTTCGAGAAAAGCTACGGGGCACCGATGACGGTGTG
-ACGGCCCAATCGTCGAATCTTCAAATTCGGCGACTTTTACGAGAAGCTAC
-GAGTGCTGACAATTTATCGCGAATGTTCTGCGGATGGATGCCGTTTTTGT
-AGAGAAATCAGAGAAAATTTTTCTCGAAAATTAAAATTTTTACTGTATTA
-TTGTTTTCTCGTATCAATTTTTCAGAATTTGCTTTGTTATTTTATTTTAC
-GCGCAAAATAATCTTTCTAATTTAGAAATTTTAAAATTATGGAAACTTTC
-TGAAATTTCTGCAAAATTCTAGAAAATCAAAAAATTTAGTTTTCCATCCT
-AATTTTTTTTTTCGTTGATTTTCCCCAGAAAATTCAAACTTTTACTGTAT
-TATTATTTTTTCATATCATGTAATGTTTTTTGTTCAACATTTACATGTTT
-TTCCTACCTCTTCTATGATTTCCCCTTCCCCCAGGTCTCATTTTTCTTCA
-CAATTTTTAAAATTGATTCACTGTTGAATGTGTTGTCTTTTTTCTATGCG
-AATTTTATTAATTTTATGAAAAAAATTTGTAATATTTTTGTGTAAATTTT
-GAGTCTTCTTACACTACAAAGTTAACCATTTCAGAGGAGTTTCAAAATAA
-ATAGTGAATTTTTACAAAAATTAGATTTTCTGATTTCAGCGTACATGAAT
-TGCCCGTTTTCAACAAAATAAGACAACTTTTTATTTTTGCCCAATTTTTT
-TTCAGCCATCTAATGACTGTCCTTTTTTTTTGGGCAAAAATAATAAATTT
-TCTAAAAGCGTTTAAAACTATTATATTTTGAAAAAAGACCATTTTTTAGG
-GCTTGGCAATTTTAAGTTCTCTAGCTACAAATTGAACCAATTTAGAGGTT
-TCAAAATTGTGAGTTTTTGCAAAAATTGCCAAATTTTGCCACTTTTTAAT
-GGTTTTTGATGGGTTAAACCTAGATTTTCTGAATTCTGCATATATGAATT
-ACCCGTTTTTAACAAAATTAGACAACTTTTTATTTTTGCCCAATTTTTTT
-TCAATGACTGTCCTTTTTTTTTGGGCAAGAAAAATAATTTTTTGGAATTT
-TTTTCTGAAAATGTTCGAAATTTTTGAAGTTTCTCTTGAAGCACTCCGAA
-AAACCAAACGACCAGCACTACTTGCAAAGTCCGAAAATTTAAGTTTAGAA
-AAATTTTGAAGTTTTAAAAGCTCCCAAACCAGAAACTCACGATATAGAAA
-TTATTTCCAAACATTTCCGAAAATTCCAAAAAATGAAAAATCAGAACAAT
-TTCGAAATTTTTTTCAAAACACTTCTGAAAAAAACCGAAACTGCAAAAAT
-TTGAAAATGTGCTAAACTCCAAACTGTACGATTTTCCACATTTCAGAAAT
-TCCAAAATTCGTAAATCTGCCAAATCCCTTCGGCGCAATAATCCCCCGGG
-GTACCCCCCCCCCCCGCCCTAAAACCTTTTGCCTCTATTGTCTCTGGCGC
-AGAAAATTGAAATTAAAAAATGAATCGATATTTTAAACTGTTATTCGTAG
-CCATCTTCTCCGGATGTATAATCGCCTACACGAATCTATTCAATCGATCG
-TTTTTCAACGGGTACTGTAGTAATAATGCTACGTGGCAACAGTCACAAGG
-CGAAAGCGACAGTCACGTGGCAAATTCGTTGGATTTGTGTCGTGGCGATG
-GTGTGAAGCAGTGTATTCCGCCGTTGATGAGGTTCAAACAGTTGTATCGG
-GTGAGAAAGATTATCGATTTTTAACACCCGTCTCGCCAATTTTTTTCTCA
-GAAATTGGAATTCCCGTCACAAAACTTTTACAGAATGTGAATTTTCGAAG
-AAATTGGAATGACACCCAAAAATTTTCTCAGAAATCTAAATTCTCGGCAA
-AAGTTTTCTCAGAAATTTGAATTCTCGTCAAAAATTTTCTCAGAAATTTG
-AATTCCCGCCAAAATTTAAATCAGAAATTTGAGTTACCACCCTTCTCTTC
-AAGTAACAGTATTCAACAATATACAATTAAATAGCTTTTCAAATTCCTAA
-AAAGTTTGCTGGAGTTATCAATTTTTGATTCAAAACTCGCTAAACCACTT
-GCCCATGTAGAATACATAATCAATTCTGAATAGAACGCTATTTTATCCTA
-TTTTCAGACATCAAAACCGAATAGCCTAATCGCATGTGTCATTGAAAAAT
-CATTTTCGACATTTCTTACTGCTATTATGTGCTTTTTACACGATCCACAA
-ACATTTAAAGACAGCAATCGAACACTGGATTCTGATATTTTTGGAGACAG
-GTTTGCGGCAAACGAACTCCGCTGCCGACTCTCGAATTATCAATTTTGCA
-GGCTTTGTAAGGATAAAAACGAATTTACCGAGTTGAAGAAGATCGGAAGC
-TGGCAGAAAATGTCGATTTTCACTGTGGTTCGGAATCCGATCGATCGGTT
-TGTATCAGGCTTCACGGATAAATGTTTAAGAGAAAATGTCTGGAAAAAGT
-TCAAAAATCGATGCGCCGGATGTAAGACTGTGCGTTTTATTTGCTAAAAT
-CTTTTACTTAAACAATTTTTTTGGAATCTTTTATTTTCGGGAGTTTCGAA
-AGTATATTGGAGTTTTTTAGAGAAAAAAATATCAATTGAAAAAGGTTTTT
-TGAAAGGGGGTAACATTTTTCTAGGCCACTAGGCTTTGTAAGGTGGCCTA
-GAAAATAATGTAAAAATCTAGGCCATAAGGGTTTATTGCGTGATGGCCTA
-TGAAAAAGCTAGGTCGCCATAACTTTTATCAGGGTTTAGGAAAGTTAAAA
-CTTCGGGCAGCAAGTTTCGCATAATGACCTAAAACTTTCTGGAGAACTAG
-GCTATAAAAATGTTCATGATGGTTTCAAAAAGCGGAACATTCGGTGACCA
-TAATCTTCTAGAATTTTTAGGAAAACTAGGCCATTAAGGTTTCTTCCGTG
-GTCTAGAAATTCTGGAATACTAGGCTGCCAGGGTTTCTAGGCCACATAAG
-AAAGGCCTAGATACAAAAATTTCAGAACGGTCTAGAAAAGTGGATAACTA
-GGCCACCAATTTTCTCTTCGGAGTTTCAAAAATATATGATTCATGATTTA
-CTTTTTTAAGAGTTTTTTTTTTCAAAAATTCTAAACTTTTGACACTAAAA
-TGCTTCTGAATTTTTGAAAACTTTGAAAATTAAATGTTTAAAAATAATTT
-TTTGAAAATCTCTCAATTTTTTTTCTTCGAAAAGCTCAAAAAAACGATAA
-ATTTCCACATTTTGGCCAGAATTTAACATGTTTCGTCGATAAAATGTACG
-ATCGGATGCATAGATTCGCGCGGAATCCGTATAAAGGAATCGATTTCGAC
-GACAGTCACTTTTTCCCACAATCTTGGTATCGGTAAACGCGCTCTATAGA
-TAAAGTCTCAATGGAGCGCATTTGCATTTTGAAATTTGATATATTTGTCG
-TTTCAGGAGATGCGAGTTCTCGTCTCATCTTGTCAAATACCAAATTTTTC
-AATTAGACGGTGCAAATTTCACAAATCAACTTCTTGGACTGCTGTCCGAG
-CGGGGAGTTGATGAGAATGGAATTAACTTTATTAGTGAGTCTTAATCAAG
-TTTGGGTCTCACCGCGAAAACCGTAATTGATTGGGGACAATGGGACCCAA
-GAGAGCCCAATGGAGCGGAATTGCAACTCCTATGAATTTTCCAGACGGAA
-GTCTCCATCACCGGACCCCACACAGCACAATGGATTCCGTGGAACGGGCG
-GCCGTCGAGGAAACTGTTCTGAGCAGTCCGTATTTGTTGCGAAAAATAAT
-TCAAATGTATTATTTTGACTTTTTGCTATTCGGGTATAAGCTTCCTGATA
-TTCCAGTTGGAAATTAGGAAAGTTCTTTATATGTATTTAATTGTTGTTAA
-ATAGTAAAAATCGATAAATTGCTTGAATTTTGATAAATTACGGCCACGTC
-AATTTTTAGATAATTAACGGGCAAAAAAAATCTAAAATTCTTACAAATTG
-AAAAAAAAAATTTCACAAAAAATAATAACATTTAGTCTAAATGTGTTATA
-GCTTAGGCTGAGGTTTAGGCTTGGGCAGGTTATTTTTTAATTTTCAAGGT
-TTCTCATTACATACTTTATTTCCGAAATACAAAAAAGAAGTCTCACAACG
-AGTCATCAGTGCGTGTTGGTGGGTGGGGTGGGAGATTCTGGTGGCGACCT
-ACAACTCACAAACAAAGATGACAACAGGGAAAATGTACACGTGGCAATAT
-GGTGAAGCTATATGTATATATAATGAATAATGATATGTAAATTTGCATAA
-TACAGGAACAGTACGTGATTGCTGGGGCGAGTAGAAATGTGGGTTATTAT
-CTATCGATTACCATTACACATGAATTACGCTGGATTACGGTTAGAATTTT
-GTGAAAAAAAATGAGTAAAACGCTGGGGCTATAAATCTATAATTGTCGAA
-GATGCTCAACGAGCCAGGAACGAGGGGAACATTGCGTCAAACTGGGCGGT
-CAATTCCATTAATGATGGTGCAGCTTGTGCATTGATTGCTGCAGCAGTAG
-GGACTCCATGCCTCATCACCGAATCGATAATCTTCTTTCCAGATGAGAAA
-CGCTCGAGACGGGAGGCGTGTTGGAGCACACGCTGCTTCATTTTCTCGTA
-CCATCCAGAGTAGAGAAGCAGAATAGCTGGTGGAAGTTGACGTTCTCTGG
-AAAAAAACAAGATTTTCTCTAGTTGCCTTAACACTTGGATTTACAGAATT
-AGTGAATATTTAAATCAGGGTGGGCGGCAATTTTTTTTCCGGCAAATTCA
-GCAAATTGCCGATTTGCCGGAAGTTTTTAAAAGGATTTTTAAAAGACGGA
-AACACTTAAAACTGTGCCTTTTTGAAATTTTCTCCCGATTTCTTTACATA
-TTTTCATAGATTTTACTGACTTTTCAAAATAAATGTAGGAACATTTATAG
-GATGCGTACAATTTTGCCGATTAAAATTGAAACTGTGAAATTTTCAGAAA
-AAATGTGCCGAATCACAATTTGCCGAAAATTTTAGTTCCGACAATTTGCC
-GTTTGCCGGAAAAAACCGTTTTCCAAGCCACGTGGATCATTTTTTGAAGA
-AAAAAATACGGCAAATTTACAGAAACTTTAGTACCATGTGGATTTTTTAA
-GAACTATTGCCAAAGTACGTGGAATGTTCAGAAATTTTTTTGCCTTTGTG
-AAATTTTGGATTTTTCTGGATTTTCGGAAAAAAATTCAAATTTTTCTATG
-AAGACGAATTTCTGATTTTTTTAAAAATTTTTCACGAACTCAAATAATAC
-TCAGACGCGAAATTTTACGTTTTCCGATCAAAACACGGTACCCGGGGTCT
-CGAATCGACATGCAGTATTTTTCTCGCTTTGTCATAGTTTCTCGATAAAA
-ATGGATTTTTTTGAATTCAAAATCCTTAAGTTTCTACCCAGGGGAGAAAA
-AGAAGACTATAAAAATTTGAAGTTAAAGTACTCTTTAAAGGCGCCCTTTT
-TTCGAACTTAACCAAAAATTGTCGTGTCGAGGCCTGGTACCGTATTGTGG
-TGCGAAAATCATTTAAAAAATTGCGTCGATTTTTGGTTTTTTGTTATTTT
-AAAAAATGTTCAATTTTTCAAAAATAGCTTTTAGATAAAAATAATAGGTT
-TTTCCTTCTTTTTTTCCGGCTAAATAATTTTAAGAATCCATTTGCCACGT
-TTCATCACAGAAAAAAAACTAACTCTGTGCCAATCAAAGCGGCGGTGCAA
-ATCGAAATCATTTGCTGAACGACATAGTTGCCATACTGGTGGAACAGAAG
-AATATCCAACGCATCACGATTCGACTCGACATCCTTCACATATCCACTGA
-AAATCTCCTCCATCATCTCGTGAAGCAACGCGGGCGGTGCAAACAAGAAC
-GCTCCCTCGATGACGTGCGACGCATACTTGTCCTGTGACATTGAGAGCAA
-GTTACGGAGCAGGCATTTATCGATGATAGTGTCTCTGTACATTTCCATGA
-TACCCGACGATTTGATGACGTATTGGATGACGTAGTTGGCGAACTCGTTG
-GAAGACAGCCGGTAGCAATTACGGACGATACACGTCATCAGAGAATGCAA
-CAATTGAATACGGAATTTGAAACACGGGAGCTTGGGATTCTCGGCGAGTC
-TATCGATGACCTGTTGCACGAGACGACATCCATACTTGTCCTGGCACACG
-GCCATCAGTGAATCTCCTGACGAGAGGAAATGCACGAAAAAGGTCCACAT
-GTCGACTGGAAGTTGCTTGACGACACGTTGAATCACGTGGATCGAGATTT
-GATCATCCAAGAGCTCAGCACATTGCCGCCAGGTCGAATGTGCTGAGCTC
-TTGGATGAGCTGGAAGACGTTGGAATGGTCGAATTTCTGAAATTAACAAA
-TTATTGATTTATTACACCTGGAAAGGCCTAAAAAGACCAAAAATAGCCCT
-AAAAATTTCGAAGAAATGGATTAATTTTTAGCTAAAACGTAATTTTTTGC
-CAACTTTTCTGTGTCGCGATTTTTTTAAACCAAAATCGAAAAATTTCGTT
-TTTCGATATTTTGAACAAATTTCAATTTTTTCGGGAGAATATCTTAAAAC
-TTAATTATTTTCCTCTAGGAGCCATTTTGTATGTTTTTTTCATCGACAAA
-AAATTTTCGTTAATGTGTGCACCTTTAAGTAGTACTGTAACTTTAAACTT
-TCATTGCTGCGGAATTTTTTAAAATTGATTTTCAATGTTTTTCTACAGTT
-GTCGTCCAATTTCATGCAATTTAGAAAAAAACAGAAGGAAAAAGTGAAAC
-ATCGATTTTAAAAAAATTCCGGAGCAATGAAAGTTCGGAGTTACAGTACT
-CTTTGAAGGCGCACACCTTTTTTGTTTTAACAAAAATTTGTCGTGATGAG
-ACTGGGGACAGTTTTTCGGCGGAAAAATCGCAAAATTTCGGCTAATATCG
-AAGAAAAATCAATTTCCGACCGCTGCGACACTTTAGCAAAAAATTGTGAT
-TTTAGCCAAAATTCAGTTATTTTTCGGAATTCCCGTGGCGAGACGTATTT
-CTCCCACCTGCAGAGCCAACTGCACAACTCGACATGCGAATTTATCCTTG
-CACATGGCCAAAAGCCCTCCGTCGATCATTTGACGAAGCAATTCCCGCTG
-CTCGGCCGGTGTTGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCAC
-TTCGACTGTGGCAGAGCCCCACGAAGAGCGTCGTGGATTCGGTGAGCTTC
-TCGAAGACGGCTTTACGAATCTGATCTTCGGAATCCAGTGGGTAGTTGGC
-CTCCAAGAACTTTACGCCCGATGGATCGATTGCGAAATCGATGAGCTGCC
-CGTTGAACAGCACATCTTCGAGCGAAATGAAAATCGGAGCAACTGGTGGT
-GGGGTCTCATCGTCGGAAGATCCCGATCCACTGTTGAAGATGTAGCTGTC
-CGAGTCGGAGGAGGTGGTGTTGCTTCCGTGGCGGTAGGGAAGAAGCTTGA
-CCGGCGGCTTTGGATTCTGGAAATTCGAATTTTAAATTTTTATTATATTT
-TCTATTTAAATTAGAAGTTTTTATGCAATATTCTACCTTGTTCTTGTGAG
-TTTTGTTCGACAAAAGCGAGAAATCCGGGTCGAAATCGAACGACGCGCCG
-AGCATGTTGTACGAGTCTGTGCTTCTACGATTCGGGGTCATTTAGACAGA
-AATGAATGAATACAGGTTAGTAGACGCTGAAAAATTTTGGGAATTAGGAT
-TTTCAACGGAAAAAAGAGTGAAAATGAGAGGAAAACATGTAAATTTCAAC
-GAAAATCGCGAAATTACCGCGCATCAAAATTCAAAATTGAATTTTTCGCG
-GTGGCCCGGGTTACGGTGATTTTTAAAGGCGCATGGTTGTTTTGAGTAAG
-GTCTTGACGCGAAATTTAAAATTATTGAACATTTTTATTTTATTTTTACA
-TTTTTAAAGAAAAAAATGATTAAAATTCGATTTTTTAGGAGAAATTAAAC
-ATTTTCACAAAAATTGCAAGAAATCGCTCGCCAAAATTCGAAAATGAAGA
-GTTTGGCGGTGCTCATGGATTACGGTGGATTTAAAGGCACATGGCTTTTT
-TGTATTAGGTTTCACCACGAAACTTGGAGTTTTGATAGTTTGCTTCCCAT
-TTTGGGATTTATTTTTTTAATTTTCGCTCGATTTTCACACATTTTCACTC
-ATTTGCACTCAATTTTTTTGCAGAAAAATGTCAATGGATATTGTTATGAA
-GTCAGATGAGCAGCCGTTCATCTCTGCGCCTGTATGCTTTAAGTAAGCTC
-CAATTTTTGTTATTCTGGCCTAAAATTATTTTTTTGATTTCCAGAACGTT
-CGCATTTTTCGCCAAAGCATCCGCAGAGGAATGCAAACTTCTCTTCGGGC
-TCCAACGCTCGAGAAAGTTTCCAGCAGGCCACGGGGCTCTCGGAGAAGAT
-CACGGAAGACATTTACCGCCAAATTGAGTAGGTTTTTCGATTTTTTTACC
-CTTAAAAACTACTATTTTTCTATTTTCCAGCGTCTCCCACATTTCGTCGA
-TGGTCTTCAACAGAGAAATGGACGGTGGCATCGAGAGAAATCGGCTCGGC
-TCGCAAGCGATTCTGCTCGACGAGAACTCCAGGCGCCGCAATCCACAGTT
-CAAATCGATCGCGCTCCGCTCTCCGCTACGATCACATCGATCATAGAGCG
-TTGGCAAGGAAATCGCCTCATCTGATGCCTCCGACTTTTATCAAAGAGGA
-AATTATGGATGATGAGCTCGACGAGGTGAAGGAAGAAGTGGTTTCCGTTG
-GAGAAGCCGCCTTGCCCACGCCAAAAGTCGAACTGAACATGGACCATCCG
-GAAAAGGACCTGATCATCAGCATTTCCGTGTATCTCGGCTACACCCGTAC
-CCTTCAATACCACGAGATTCGCCTCGGACGTTTGATGAAGATCACGGATC
-GGCTCGAGCTCACCGGAGATCACACGCTTCGCGATCTGAAAAACGCGTTC
-TCGTGCCCCATCGATTTCTCGTTTTCCGACGATTTTAGCGAGAAAAAGCC
-GTCGTTCAAGGATATGGCGAAAAATAAGTGGCCGTCGACGATGTTCTTCA
-TTCATGACACGTTTTATATATAACTGGAAATAATTTAATATTTTTCGAAC
-AAATTTGAAAACTATAAAACCATCTTATTTTGATAAAACTCCGCCGCTGC
-TCTCTGAAGCAATGAACTGCAATCAGACATCGAAGGGATCAGCCGATCAC
-GGAACCAACCTGCCATTGAGCTTCTGAAAATTAATATATTTGATTCAATT
-TATTGTACGAAATCGTTTTTACCCATATCTGTGAGCTAGCAAGCTAGCTA
-ATCGTGATTAATTGTTGGGTATTCCTTCGCGTTCTTCAGCTTCTCCACAA
-GCAAAATTCTTGTCTGCTCATCACAAATGATGTCATCAGCATCGCTCTGA
-TCTTGAAAATCCTGAAATTATAACATTCTAGAGGGTTTCTGATGAGAATA
-GTTACCTTACAACCAACACCAAATACGTTCTTCATTATGGCATCCGGCAG
-CTTTCCATAATCGCAGAAGAAGTGCTCGGCATCACGATCGGATGCTCTAT
-TTGGGAAACGACCGATGTAGACACGAACCATGTTGAGTGGCCGAGAGAGG
-GATCATCTGAAACATTTAAATGTTAACTAAACAGGAGTTTAGAAACTTTA
-AAACAACCTAACCTCCGTGATAACGTAGTTAGCTTCTCGAGTGAGCTTCT
-TCTTCAAAATAAAACAGAATGAAACAAGAATCAAGTGGGTAAAATTGTAA
-AATGAAGTATTTCAGACATTTTCGCTAATTTTGGCAGTAAAAACCTATAA
-TTTTGGTAAAAATCGCTTGTATTCTGAAAAAAGAACTCAATATTTAATTT
-TTTATAACTGATTTTAAAGAGAAACAAACGAAATATATGAAAAAATCGAA
-AAAATCCCTGAAAAAGGCCTCCGCAATATTGATTGTTAAAGGGACACCGA
-CTGTTCATCGAATGGGTCCCGCCGCGATTGTCCATTTCGAGCGCTTTTCG
-CGATTTTTTACTACTGTAAAAAAGTGTAGGAAAATGTCGAAAAATGTCGA
-AAAATGACGTCACAAATGTATTTAAATACATGTTTTTATTGTTACTTGAA
-TAAGGCAAAATATGTATTTAAATACACTTTAATTTTCCGACATTACTTGA
-ATAACCCCATAAAAAACCCCGAAAAAATTTTTTTTTTGTGAAAATAACCA
-GAAAAATACATGTTAAAACAATTTTGTGAACAAAAAACTAAAAAATATTT
-TTTTTGCAGAGATGAATCCCACGTGAACGTCGAATTTCCACGCCGCCTCG
-TCGAACGGAATTTCAGAAGAATCGCATGTGACACGTGCAAGGAGGCGTCG
-GCTCAGTGAGTACAGAAAAATCCATGGGGATTTTTTAGAAATTCGGAATT
-GATTCGATTCAATAAAATCGATTTTTATATTAAAAAAAAGGATTTTATTG
-GTTTTTAAAAAATTTAAGAAAAAATTACAAAAAATCTATAAAATCGATTT
-TTTATTTAAAAAATTGAAACTCAATAAAAGTTCTTTCTAATTTTAGAAAA
-ATCGATTAAAAAATAATGTTTTAAAAATCAGTAAGAATCGATTAAAAATT
-CAATTTCATCGATTTTATTTATTTTAAAAAAACTTAATTTTTATGAAAAT
-CGATCATATCGGAGTCCAAAAAATAATTGGGAAAAAACTAAATTTTCAAG
-AAAATAATCGAAAAATTTTAATTTTGTTCAAATAATTGATAAAAACTCAT
-TTTTTAGGTTTTTTTTCAAAAAAAATTTGAACAAAAAACACATATTTCTC
-GAGCTTTTTTTCACAAATTGACCCGATTTAAATTAAAAATTCATAAGCTA
-AAAACCTTCTTTTTTTAACCAAAAAAAAAACGAAATTCCCAAAAATCATC
-AATTAAATCCAATTTTTTCAGCTGGATGATCGTCGACCACGACAATCTGC
-TTCCCAACTCGCCAGGCTATCTGTGCTCTTCGTGCTACAAGGAATTCTGT
-TTCGACGTGAACGGCAACAAAGTGTGCCAGTTTAAGGCCGTACCGTATTG
-CGATCGAAAGGACATTGGCGACGGACGCCAATTCTTCACCGAGCTCGATC
-TTTAGAGAGCGAAATTTAAAATTCTGTATCATTTTTTGTTGTTTTTTTTT
-ATGTTTTTCGATTTGATTGTTTAATTATCAATTTTTGGCCTGTAACTGTG
-TATTTGTTGAAATTCCAAATTTCGTTTTTTTTTTAAATAAAATTTCTGTG
-TGCAAAAAAATTTATCCAATAAATAAACGGAATATATCGATGATATGGCA
-AGTAGGGGGAAACGGACGGGAAAATGATTATTTACAGAAAGGGCGCGCAC
-CAGAGGTTTCTCGGGGGAGCCCCGAGGCGGGTGGCGGAGCTTGGCTCAAA
-ATCTGTCGGAAAAATGGGTGAAATGAGAGAAGAGGTAACCTAGAAAATGA
-GATGAGAAATTCGGAAGTTTTGGGAAAAAAAAATCAACTTTTGAACAATT
-CAATTGAAAAATCGATAATATTGATTTTTTTAAAATTCTCTAAGATCGAT
-AAATCTGGTTTGGAAAAATCAATAAAATCGAATCTTAAATATCTTTTTAA
-AAAACTATTTTCAAAAATCAATAATATCGATTTTTGAACAATTTGAAAAA
-TCGATAATGTTGATTTTTAAAATTAAATTTTATTGATTTTTTGAAAATCG
-ATTATATTGTTGATTATTGATTTAAAAATCACCAGAATCGATAAATCTGA
-TTTGGAAAAACCAATAAAATTGATTTTTACAAAAATCAGCCAATAAAATA
-GATTTTTTATAATCAAAAAAATCTATTTTTAAAACCGAAAAAATCGATAT
-TTCAAAAATTGAAAAAAATCGATAAATCAATAAATCAATACATAGGTGAG
-CTCGTCTCGTCGATTTGTGTTTTTGTGATTGGTCCCGGCTGCTTTTGAGA
-TGGCCTAGGCGTTGTTCCGTATGACATTCTGGAATTTTTTTTTGTTGGGA
-ATTTGGCACGCCCACAAAATGGACGGTGGCGGAAATTTAATTATTTTAAA
-TACCTTTCTGGATAAAAAAAATCGATTTTTCCACTTTTTCGAGTGAATCG
-AAAATTAAAAAAAACATTCAAAATTGTTTAGGGTCTCGCCACGAAAAACT
-CACAAATGCACGTTATGCGGAGTGTCGTCGGATTCCGGTGTGTTGCTACG
-GATCGTGTCGTCCATGCTCAGCTTCATCGTCGATTGACGTCGCCGTTTTG
-TGGTGATCTGAGCGAGATTTATTGATTTTTAAAGGCGCATGGCCTAGAAA
-ACACAACACTTCGGCCACGGACTTTGGCGGCCGAGTTTTCTAGGCCATGC
-TGCGGCATTTAAAGGCACATACCATGATAATGAAGATCGCCAATCCGAAA
-ATGATGACCAATGCGAAAGTGATAATTACAATCATCGATGATAAGGAATA
-TGATGAAGTTTGCGTGGAAATCGAATCGATGTACGCTTGTGACGTCATTC
-CTGGAAATTATTGATTTTTTTTTGGAAAAAAATTAATAATTACTTACCGT
-CAACAGTAACACTCAACGAGTCAATTTTGTAATCCGAAATCATAGAGTTA
-TTGCGTGAAAATGCGGCTTCCAACCTGAATGTTAAAAAAAAATCTATAAT
-ATCGATTTTTTGAAAGTTTTTCGAAAAATTGATAAAATTGACGATTGATT
-GTTTGCCCATAGAAACAGATAAAAATCGATATAACTTAATATCGATTTTT
-TTTTGTGCACCTTTAAAGAGTACTGTAACTTCAAACTTTCATTGCTGCGG
-AATTTTTTTATCGGTTTTTACAATTTTTTGTACAGTTTCCGTCCAATTTT
-ACAGAATTGAACAACAACAGAAGGAAAAGTGAAAAATCGTAAAAAATGTC
-CGCAGCAATGAAAGTTTGAAGTTACAGTACTCTTTAAAGGCGCACACCTT
-TTTTGTTTTAACAAAAATTTGTCGTGGTAAGACTGGGGACCGTTTTTTCG
-GCGGAGAAGTCGCAAAATTTCGGCTAATATCGAAGAAAAATCAATTTCCA
-ACAGCAGCGACACATAAAAATTAGCAAAAAATTGTGATTTTAGCCAAAAT
-TCAGTTATTTTTCGGAATTCCCGTGGCGAGACCCATTTCTCCCACCTGTA
-GAGCCAACTGCACAACTCGACATGCGAGTTTATCCTTGCAGATGGCCAAA
-AGCCCTCCGTCGATCATTTGACGAAGCAATTCCCGCTGCTCGGCCGGTGT
-TGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCATTTCGACTGTGGC
-AGAGCCCACGAAGAGCGTCGTGGATTCGGTGAGCTTCTCGAAGACGGCTT
-TACGAATCTGATCTTCGGAATCCAGTGGGTAGTTGGCCTCCAAGAACTTT
-ACGCCCGATGGATCGATTGCGAAATCGATGAGCTGCCCGTTGAGCAGCAC
-ATCTTGGAGCGAGATGGTGATCGGAGCCACTGGTGGTGCAGTCTCATCGT
-CGGAAGATCCAGATCCGAAGGTGTAGCTGTCAGAGTCGGAGGAGGTGGTG
-TTGCTCCCGTGGCGGTAGGGAAGAAGCTTGACCGGCGGCTTTGGGTTCTG
-GAAATTCTATATTTGAATTTGAAAATCAACAAAATTCAATATTTTACCCT
-GCTCTTGTGAGTTTTGTTCGACAAAAGCGAAAAATCCGGGTCGAAATCGA
-ATGAAACGCCGAACATGGGGGCCATTTGGACAGAAATGAATGAATACAGG
-TTAGTAGACGCTGAAAAATTGGGAATTTCAATTAATTTAGGATTTTTTAA
-CGGAAAAATAAGTGAAAATGAGAGGCAAACATGCAAATTAAAATCGCGAA
-ATTACCGCGCTTTGAAAGGGACTCCACCGATCGGAGAGACGAGGGAAGTG
-GAGAGACGCAAATCGAAGAGACGCCTTTTCAGACATTTTTTCGTGATAAT
-TTTGCATGAATTGGCAAGTAGAGCTTACACGTGATGCGAATCATTGATAA
-AAACATCAATTGTTGTTTTTAGTGTACTGAAATTCCGGCACAATAGCTCT
-CGTAAATCGACACAAAAGTCACTCCGTGGAAAAGTGGAATTTGGATAATT
-TTGTTCTTTTTTTTAAATATGATTAACGTTTTTGAAGGCTTTTGTCTCAT
-AATTCATCAAATTCAAAACCGGAATTATCCAAATTCCACTTTTCCACGGA
-GTGACTTTTGTGTCGATTTACGAGAGCTATTGTGCTGGAATTTCAGTACA
-GTAGAAACAGAAAATGTTGTTTTTATCAACGATTCGCATCATGTGTAAGC
-TCTACTTGCCAATTCATGCAAAATTATCACGAAAAATGTCTGAAAAGGCG
-TCTCTCCGATTCGCGTCTCTCCACTTCCCTCGTCTCTCCGATCGGTGGAG
-TCTCTTTTGAAATTCGAAAATAAAAAGTTTCGCAGTGCGCCCGGGTTACG
-GTGAATTTTAAAAGCGCATCACGGTTTTGAGTGAGGTCTCGACGCGAAAT
-TAGCCGTTTTTGAAGATTTGTCGTTTATTTTGGCATTTTTGAAGGAAACA
-TAAGTGAAAATAAACAATTTTAATCTTAATTGAGAGAAACTTGAACATTT
-TTACAAAAATTGCAAGAAATTGCGCGTTAAAATTCAAAAATTAGAAGTAT
-CGCGGCGCTCAAGCCGTTGATAACAAGCCGTTATAAACTTATATAACTAT
-ATAATGTAACTCGATGATTTGTTGATGTGATCTTTAAAAAGGTTGAAACT
-GCCCCAGTCGATGTCCGCGCCAGAGGCGCTGTCAGCGGCTGGTTACTTAT
-ATATAAAAAATATCGGGAAAAACGCACTTCCGTTCCATTTGTTTCTTTGT
-TTTTGTGACGTCACTGAGAATTATGGGCGGGCCCGTCTGCCTTCGTGGTA
-AGACCCATCGTGGCGAGACATATCGTGGTGATATCCTTCGTGGCGAGACC
-CATCGTGGTGAGACCCATCGTGGCGAGACCCATCGTGGTGAGACCCATCG
-TGGTAAGACCCATCGTGGCGAGACCTTTCGAAAATTTGGTGGGAATTCAA
-ATTTTCTTAGAAACATTTTTTGGTGGGAATTCAAAATTTTCAAAGAAAAA
-CTTTGGCGGGAATTCAATTTTTCAATAAATAATTTTGGCGGGAATTCAAA
-TTTTCTAAGAATAATTTTGACGGGAAATTCAAATTTGTTGAGAAACTCGA
-GTAAATGCTGGAATGTTCTAGAACCTTCCTGGAGATTGGGGAAAATTTTA
-GTATGTTCTAGAACCATCGGCGAACTTAAGAAAATTCTGGAAAGTTCTAA
-AACCTTCTAGAAAATTCGTGAAAATTCTGGATTGTTCTAGAAATTTCTAG
-AAAATTCGAGAAAACTCTGGAACGTTCTATAGAACCTTCTAGAAAATTCG
-GGAAAATTCTGGAATGTTCTAGAAAATCTTGTTTGCCAAAAGCTCTCGGA
-AGGAACCGGAAAAGTTTCTTATGATTTGAAGAACGTCTAGAAACGTTCAA
-GAAATTTAGAAGTAGTTCCAGGAAACCTGGTATTTTTAAGTTGTAACTCT
-TGAAAACTTAGTTATATAATATTCATGTTGCGTTAAAAACTTCTGGAAAA
-CTGAGAAAAACGTTCCAAGGCTTAGAAATTTTAGAATTTCATCTTAATTT
-CGAGTACGCCAGTCGGAGCACGCGCATTGTGCGAACGGCTGGTATACAAA
-CAATAGTCAGTCAATCCCATGGATCAAATTTTGAATTTTTCTAAGACTGA
-ACTGTTCCTTTGATATGCAAAATTTTATAAAATTGTCTGTTATTGAAAGA
-CATGAAACAAACTTGAATTACAGTAATTCTGTAAATTCTGAACTTACTAT
-TAGAATCCTTAGTGAGCACACTTGAAAACGAATGAAATAAGGTATGTGAG
-AATACCGTATCAATCAGATACGTCTGACACTTCCCCAAAAAAAACTATCA
-GAATATGAGTACGATATGTTATTACTAGTGTGCATCTTTCCGCGCGACCA
-TCATGGCTCAGCAGGTAAGACTTCGGCGACGCCTCGAGACGACGAGGTAG
-TTGACGACTTTTTTCATTTTTTAGGCAGCGCCCAACTCTTGTCCGAGGTC
-TACAGGCTACATGGTTTGGACGGACAGAGTATTTGCTTTATTAGTAGTAA
-CAGAAATACACATAAAATCAATTAATAAGATCCATGAAATGCAATAAAAA
-TCCAGTTTTCACCCATCTACTATGTCTCTCATTGAAGAACTTTTTCAGAT
-AGCTTTTGGTATAGAATATATTAAAATTCATTCTTCGATTTTCTGTGGAA
-TTTCTTATTTGAAAGCTTTTTCCATACCAGACAGTCACTTCTCCAAATCC
-ATCCTTGAAATTTTCTTTGGGGATATTTAAAATATCATCGAGATACCAAC
-AATCTACTGGTTTTTCACCTACAAGACGTGCTCTTGAATTGAAAATGTCT
-GGGATATCCTCTGGAATATGTTTTTCTCCTTTGTCATGCTGATAGTATAA
-GTTGAATGTGACACTTCCATTTCTCTGGCTGTTTTGTTCAGTCAATCGGA
-TTAGCTTTGCTGTGACTCTGTCCATATTGTCCGGAGTAATGAGGAGATAC
-GTTTTAGGAAGTAGAACAGTCATACTCTTGGCTGGGAAGTTTCGTTGAAC
-ATTTGCAATCACATTGTCCATTGGTGAATAATAGTCGTTTTCCAGTTGTT
-CGTTCATTTCGAGTAACATATCCTCAGAGTATTGTAAATCGATCTCCACT
-TTTTCCAGAAGAACCCTCGAAACGGGTTGGGTGTTGAATGGTACATTGAA
-TACGGCATTTGAAAAGTCTTTAGACGTTTCCAAAATGAAATCCATATTTG
-AACTAAACATAGTATTAAAATGACCACTGTAAGCTTCGAACCGGAACTCC
-AGTCTGAAATCCTTAACATTCCACTTTGAAATAAGCTGGTATAAAAAGTC
-TCTTGGGATTGAAAGGAACTCTTTTCCCAGTATTAAAACGGTGAATGTGT
-GGCATGTTACCAATGAATTGAGGAAATAATTTGCTCGAGCACCAACTACG
-TACCGCCCTAGTTGCTTTTCGTATATGGTCCGATAAAACAACCTGTAAAA
-TGTAATCTTTATAATGTTCCTGAGCATATCATGTCAAGAGTGTCTGAGTT
-TTTCATCAACAAAAACAAAATTTGATTTTTTTGTTAATTTTCTAAACAAT
-CCGATTTTTGGTTTTCCGGAAAATTGAAACATCGAAATTTTCCGTTTTTC
-AATATCCAATTATTCGATTTTCCGATTTCCTCTCAGAAGAACGAAAAAAA
-CGAGAATAAAGTTTCCATGACATTGATCGCAGTGGGCTGTTTGTTTTTGG
-GATAACTTTAAGTGAAGGAATGGAGAGACTATCTAAGTATGAAAAACACG
-AGAATTCACTCTTTTGAGAACCTGTTACAATACGTGTACTGTTATAATAG
-AAAAACTAAAGCAGTGATTCAAACATCTGTTCGACGGTGTTCATTACAAA
-TGTATCAATTTACACTCACCAGTCTTTCATTTCCAGCGCTTTGTAATGAC
-GTGGAGATATCCTGATTTGATTTATGATTTCTATTATTTTTAATTCTCCA
-AATAGCTCTTCTCCCAATATTCGCAACTCATCAATTCCAAAATTGCTCAA
-TCGAAGATATGCGAATTTCCCGAATAGTTCGTTTAATCTGTCCATAAATC
-GATCATGCTCATCAACTCCAAAATTTTCCAACATCAAATTCAAAAACTGC
-TGCGGTATCGAATTTCCACCAAAATATTGAAGTTGAATACTATGAACTAT
-ACAGTTTTTATTTCTATGAATGTCTCGACATATTTGACAACCACAGCAAA
-AATCATTTTTATATTCTTCAACGAGTCCATCTAAAAATCATGAATGTCAA
-ATCAGTAGTTCAAAAGCCATATATTTTACTCAGAATTCTGAAAAACAGGC
-GCTCATGTCAAAAATTGACTTACAATCTACTCCAATCAAGCAATCGTGTA
-TGAGATCATTGAGTATAATTCGAGCATCCACTCCGCACGAAATTTCGTTT
-TTCTTAATCGGTTCGACATAAAGCTTGTAGACTTTCACATTTACCGTATT
-TTTTAAAAATCTGAAAATAATGTTACAGCTGAGTACAAAACATTAAAAAT
-TGGTTTAATTGATTGAAATTTTCACCACTTCTCATATTGTTTCCACGATC
-ACAAAAAAGCATAAAAAACTTCAACAGACTCAGAAAACACTTTTTAAAGG
-CAAGTTTTGAACCACCTATTTTGATGAAAAATTGTCTGAAACACTTCTCA
-GATCGACTTTTCCCTAGCTCAAAGTGATCCTCTGCCGCTAGCTCTTTTTT
-AGAGTGGTCATTCGAAAGTCCGGGTTTAAGTTGAAATATTTCCCTTACCG
-GTCAAAATTCTATCAACATCAAAATAAAATTGAATTTTTTGGTAGTTAAC
-AGAGGAAGCGGCGAGCAAAAAAACCAGGTTTTGAACAATTGATTTCAACT
-TACACGAATAAGTGTTTCACCTTGTTTTTGTTTATCTCCAGTGCATTTAT
-AAGAAACGAGCAAGTGCATCGACGAAGCTGTTTTAGCGGAAGTTCAGGAT
-CTACTTGATTGTTAATGAATATTGATCTTTTTCTTCAATTTTTACAAGTT
-TTGAAACTGTGAATTTGTATTTTTCGATGCTCATTTCGAATTTTGTGCAA
-AACTTCTTCGCTGAACAATTTATTTATCAGCTGAAAAAAGAGCGAATTAA
-AGTAAAATTGAACACAATTTTGATACCTGTCTATAATTAGGGATATCAGT
-CCGCTGTATTGATTTTTTTGTTTGAAAAACTGAGTTTTTGTTTATTTGCA
-GCGGCAAATTTTTATTAATTTTTTTTGATAAAAGTTCATCAATGCCATCA
-GTGTTGTGGCACCACGGAGTGGCGGAAGACCGAACCCTTTAAGCCTCAAG
-AGGAACCGAGCAACGAAGACTATGTCAGAGGTGCAGCATGGCATCGTCTA
-TTTGTATATGTATTGGAAAGAACAGAACACAGTTTCAATAAATATGTTTA
-TTACTCCAAAGGGGAGATAATCAACAGAGGGGGAGTGGGTCGTACACAAG
-AGAGAGGGAATTGTCTGGTGTGAGAATATCACGTCCTGCCACGCGGGTCT
-TTAGTCTGAAAAGGTCGAGTGTATGAATAGTCGGGGTCTTTGCAGACTCG
-TAGAATAATGTCTTTGGTCAACTACACTTTCCAAATAAAGGGAGGGAAAG
-GTAGGAAACGTCGGCAATTAGTCTGACTGGGAGCTGTCAATAACGGGGGG
-GGGGGGGAAGAGACCAGCAAAACCGAACCAAGAGTGGGGAGGAGAGTTCC
-TTTCCTGGTGCCACCGACGCTGCAGCTCGCTCCGTATCGTCGCTCATTGA
-GTCGCCGCGCAGCCAATCGTTGCTACGGGGCGCGAGTGTAACTCTCGTTA
-GAGAGCGTGTGGGAGCAAGAGACGCAGAAATACAGTAAACTTCTGCGACT
-CCTAACTGTATGGTAAGCTTAAGAGCTGGTCTTAAAAGGTCGAATTGAAT
-GTACCCCTCGCTCGGAGAACTGCTGAAGCAGTCGAGAGCGAGACATTGTG
-AAATGGGCGATACAGCAGAGCCCAGTTCACAACTCTCCGGGGGGCGGGAC
-TTGTAGGCTGGTTCACGTAGTGAACTTAAGGTTTGAAGCCTTCCTTTGCC
-TTTCTTGGAAGAGATTGGCGGAGTGGAAGGTCGTCTGAGCTCCTGGCTTC
-TTTTCGTGAGCGTTCAGCTTCTTTTGAAGATCTAGTATTAGGTGAGCTCG
-GAGCTTCTTTTCTAAATCTTGCTTCGTCTGAGCTTAAAGCTTCTTTCCTG
-GATTTAATAAATTTTAAAGATGGAAGCATAGGTAGTGAGGGTTCAGGAAA
-GTCGGAGTCCGTCTCTTCGTCTTTTTGTGGAATTTTGTCTTTATTGTCTA
-TGTCTTCCGCTGTAACCTCAAGAGGATACAGTTGATTTAGTGATCGTTCC
-AACGTGGAGTTATTGAAACGAACTCGTGCCGATTCAATGTTTCCTTCTTT
-ACTCGGAATGAGCTCCACAATTTTGCCCAGAGGCCATGTGTGTCTTGGCA
-ACATTTCTTGTCCGACGAGAACAATGTCTCCTTGTTTAGGATCTCGAGGA
-GCATCCCTTGTATTAGTCTTTTGTCTTTCTCTCAGAAACAGGAGATATGA
-TGTCGACCAGATTTGCCACAACTTTGCAACTGTTGTTTCAACTCTGGCTA
-AGTGTCTTCTCGTGATTTGCTCTGTTGATCGAGCTGTCTTTGGAGAATAT
-TCCATCGGTTCGTCTAGATCAACTTCATTCGGTGCATCTAGCTGAACTTT
-TGGTAGTAGAAAGTCGATTGGGCGGAGAGCCGTCAGATCATTGGGATCTG
-TGTTGTCTGGTGTAAGTGGACGGTTGTTAATCATCCCTTGCACCTGTCTT
-AACGTGCTGGACAGCTCGAAGAAGGTTAACTTTTTTTTGCCAATAGTCTT
-GCGAAGTTGGTGCTTCGCAATTCCAACAATCCTCTCGTACACTCCACCTT
-GCCAAGGGGCGAATGGAGTGATGTTGTGTACCTGAATTTCGTATTTGGCT
-AAAAAGCAAATCATTGAGTTGCTTGGTGCGTAAAGTCTGATGTCTTGGTT
-GACCATTTGGTGGCCGAGTGTAAATGTTGGTGCATTGTCACAGTAGATAT
-GGGGCGGAACACCACATGCACTGGAGATTGCTCTGAGTGCGAGCAAGTAG
-TTGGCTGTAGTAGCGTCTGGAATGAGTTCTAGAATGGTAGCTCTAGTCTT
-CAGACAAGTGTAGATAAGAGCATAGGCTTTACCTAGCTTGTCATCGTCTG
-TCTTGTATTGTATTGGACCCAAATAGTCGAGTCCTACATGGTCGAATGGT
-GCAGAAGGTACAGTTCTGCAGTTTGGTAGTCGTGTGTCGTAATTGTATTT
-AAAGGGTCGTGCTTTCACCTTTTTACAGTTCACGCACTGAGCAATTGTAG
-TTCTTGCAATTTTGCGATCATTTCTGATCCAAAAGTGCAGTCTTACCGTA
-GTTGCCAAATAGTGTAATGGTAAGTGGGTATTTCGTCTGTGGACATCTTC
-CACAATTAGACACAATCAGATGTGGAACCGGATTGGGTCCCACTATCCAA
-TGATGTTTGTTTCCGTCCTCGTCTACTGGGTTACGCAATGTGTCTTGCAA
-AGTGATTAAGTAACCGTCTGTAACAACTGGAGAAGTTGTGTCAAAAAATG
-TCTGAATCAGTATGATTTTGTCTCTGTCTTTGAATTCGAGAATTCGTATT
-GTCTTGCATTGACTGAGCATAAGAACAGTTTCCTGTTATATGACTCGGTG
-ACGAGCAAATCGTGCATCTACCATTGTTGATGCAGAAGCGTTTGACTTCA
-ATCGCACCCATTGTGCACGTTTGAAGTGGATGGTCTTTTTTGCAGGGAGG
-GCACGGATCTCCATCGAGAAATTCTTGCCAATTCTCCACGAGTCTGGAGG
-TAGTATTACCCGTCTTTTGTTGAATATGCAGGTTCAGGAGGTTTTCCTTT
-AGTTTTCTGTCCCGTTGGACATCAACCAAAGTACGTCGCCAATCTTCCGC
-GCAGTTGTCTTCAAGATGTTTTTTGAGGCTTACGATTGGATCGTCAGCCC
-GTCTGGGTCGTATAAAGTTACGCGGAGTCAGCTCGGTATAGTCAGCTTGA
-TAGTCTTGCATATAGTCTTTGAGATCTTTAATTATCATGTCTTTGGATTT
-AATCGTTGAAGGTTTCTGTTTAACAGTTTCCAACAAGTCTTTAATCGTCG
-ATAGTCTATGTCTCAAGTCACCAGAAATAACAATCATTTTCTGTCTGGCC
-AGATTAGTCGTGGATCGTATGATATCTGTTAAATTCAAAATTGGCGTACC
-TGTATCCTTTGCCTTCTCGGCGACGTCCTTGAACATCTCCTCGATGATAT
-CCGGCAATGAATTGGCTTCGACCAAGTATTGAGTCAGGTCTTTGTACCAT
-TTGTGAAGATCCTTGATGTAGTCCATATGCTGCTGCTTGTCACAATCGAT
-ATTGGCGTTAAGCCAGTCGGATGAAGACTTATCTTTGTGCTTCAAGTCTT
-CAGTCTTAAGTGCGATACGCGTCAGCAACAATGCTATGGATGATGAAGTG
-GAGAATGGGGTCCTGGATTCCCTTCCCAAGCTGCCACCACCGGAGTCGGG
-ATCAAGACTTCCACCTCCAAGATGAAAAGTCATTCTTCTTTGAAAACCGA
-GAAACTTGTTATCTAAAATCAATAATTGGTTAAGAAGAAAGACAAAATGT
-TTTGAGATTAAGTAAAAGACTTAATAAGAGATTAGGAAAGAAAGATGGGG
-ATGAAGACTCAATTTGAGTGATAAGAAAAAAAGGTATTTTAATATAAGAT
-TCTACAATAGGGATTGGGAAAGGTGTGCCGTGGCCTAATATAGGTTTGGT
-GGTACAATAAATAGGGGAAGTAATGACCCAATATGGGTGGGGGGATTATT
-AAATGTTACCTAATATGGGTGAATTATTAATTATTCCTTTGGCAGAGGAA
-TGTCGGTGAGGGCTAAGAGTTCCCTGTATTGTAGGTTGATTAGTCATGTA
-GGGGACTGGTGTAGAGTAATTTGGTGTAGAGTAATTTGGTGTAGAGTAGG
-TATTTGGTGTAGAGTAGGTTTTGGTGTAGAGTAGGTTTTGGTGTAGAGTA
-ATTTGGTGTAGAGTAATTGGTGTAGAGTAGGGATGGAGGGAATTCAACAC
-CGACTGGTCGTGAATCAGATCGGCCCTGAATTGGGGTAGGGGACAATAGA
-AAGAAACTACCGTGTGGCCAACTGCCCCCAGCAGGGACCTAGTTGGGATT
-GTTTTCACTTGAACACGAAAACAATGGGGGTTGGGAAAGTTAATAGGGAC
-AAAGGAGCAAAACGAAACGTCCATTCCCGCATCGAATTGCCTCATAGGCA
-CCGCACCCAAACTCTCCTGCCGCTGCAGCAGTCAGGGAATCCGACGCTCC
-ACGCTCTCCATCGCGACTGGAGACCAAGTTCTTCTTTCTTCTTATAGTCT
-TTTTTTTCTAGTGGCGCCGGTTAATTACTCCATTGCCAACTAGCTGTCGG
-GAAGTCAGAAGTCAAATGTCCTTGCGGACGTGGAATATAACATGTTTGAA
-ATTAGGGTGGTTTAAGTTTTTTGTGAGATCCCTATGGATAAATTTTGGTT
-AATTTTTAAATTTGAAAGGTTTTAAAAGATGTACAAATAATTTTTAATGA
-TGTATAATTTTTGGAGAAGGTACTAGTTGAAAGATATAAAGAATTTTTAA
-ATTGAAAGTTAAATTAAAATTTTGAGGGGAATTGGTGTAGAAAATTAGTT
-AAAATATATTTTTGGAATTTTTGAAATTTTATAATTTTTAAGGATTTTTT
-AAATTTTTTAGGAAGTTATAAAAGGGGGTAAATAAACTAACTGTTCGATC
-GCCGCGTCCTCCAACGAGCAAATCCTCCATCCATCCAGAGTTCTTGTCTA
-CCCGTCTTGTCGTCTATTCCTCCTTTTCTTCTTGTCTCTAGCACACAGGA
-GACTGTGCACTATTGTCTTTCCGTTGCAGTCAGCGAGCTGCCAGCAACTA
-GTCGCATCGTTAATGGCACCTTTGCCACTGTATTGAATGCTGTGAGCTGT
-TTTAAGTGCTATTACACTATAGTCTGTAGAAAACAAGAAATTTTGTAATC
-GTCTTTCGTCTTTCGTCTTGAACCATATTAACAGCCGAGATTTATTAAAT
-CAAGGAACAAATAACAGCTTCAACAATGTGGTATCAGATACCGGTGAGGA
-GTGGTGAGGGGGGAATTTCAAAAAATTTAAAAGATAAAAATTTAGTGATC
-GAATATCGAGATATTCGATGGGGATTGTCCTCGTGCCAATTTCTTGGCGA
-TCCTTGGTTGGTATCGGCGTCTGACCGGCTGGTGTTGTTGCTGCTGTTGC
-TGGAGTTGTGGTGGCGGTGGTCCAAATAGTTGTGGAGCAGGAACGCGAAG
-TGGTGGTGGGAACTCCTGTGCGGCTGGTACGAGTTGTGGTGGAGGTTGCT
-CTTCGGATGGTGGTGGCGTGTGAGCATTGAATCCTCCAGAGACTTCCATC
-GCGAGGGAGATCCTGTTGATCGCTGCGTGCACCACATCTATCTTGTCGTA
-CAGAACGACGTGATCCGCGGATTGGATCCACACTTCCTGGGAGCCAGAGC
-CTTGTGGAGCCGTCGCAGTCGTCGGGCCATTTGGGTCGCGGCCGGTCTGG
-GGGGCTGGGCCCGTACTTCCTGGGAAGTTGAGAAACCAGTCTTCGAAGAA
-CTCGGATGGAGATGTGTCGTCGGTGAGCGTCGGGTCGAACGGTCTGAGAA
-GATTTTAGAAAATTAATAATAGTATATGGAAAAATTGGATAAATTTTTAG
-AATTTTGAAAGAATTGATTGAAAATGTGTATAAATTGAATTTTTTAGAGA
-AAAATGATAAAATTTTTTAGAGAAAATAATAATTTTTAGATAATTTTTAA
-ATAAAATCGAAACTTCCTTTAGTCTGGCGCTTCGTGGATGGGTAGGCTCC
-ACTCAGCTGTCAACTTACGTACTACCAATGAAGAATTGCAGGATAATGTG
-CATATTAGATGCAAAACGACGAGAAATAGCGAATAATAAGTCGGGGAAAG
-TCGAAATTGTGCTCTGGGAGCATGAGTTTGCCAAACTCACGTCCCTCGGC
-GTCTGTGGGCTCGCGAGCCGCCCTTGTGTACGATTTTAGGGGTTTTTTAA
-TTTTGAATTTTTAGAATTTTAATTATTTTTAAAGAAAGTTTGGTAGAATA
-AAGGGACGGGGGATGTTTAAATAGATGTGTACCTGTCGTCTATCAAGTCT
-TCGACTATCGAAAACGTCGAGTCGTCGAAGTTCATATTGAATCGTCTCTT
-CACGGCCCGGCGGGGGGTACATGGACGAGAATTCTCTACCGTATTCCAAT
-TTGGCTGACTGCGTGCTCAACGTTGAATACTCAGTTTAAAGTTTCGTACA
-CCGTTGCGTACTGCACAGCGCGCATTTTAATTGACGAAATTTCGCGAAAA
-TTAACAGAAGATTTTTTTCGGAATTATAGAGCTGAAATTGAAAAAAAAAC
-TATCAAATTTTCATCGAATTTGTGAAAAATCGTAAGTATGAAGATCTTTT
-CTTCACTATATTCAAGGAAAATCGATATTTCGCTTTTCACAGACGAATGA
-TGTCTCATTTTACTCGATGAAAGTTTCTGATGAGCTGTTTTTATCGATTT
-TTGAGCGATAAAAATGCGATTTGTTGATAAAATGGATCAATTATATAAAG
-AAACAACATATATTGCTCTGAGATTACTTTTTGAGAATCAATTCTTTATT
-TTTCGGTCATTTTAAATTAAGCATTAAAATAAAAATATTAGAAATCATAA
-TAAAAAAAACAGAAAATCGATATATTACTTTTTCTTCGGAATTTCACGAC
-TTTTTTGGACGAATTTTATTCTGTAAACTTTCTTCTTCGAATTTGTGTCC
-ACGTGGCTTTCAGTCGAAGAAGATTCTGCAGCACTCCTTCTTGCTTGCCC
-ACAACTTACTCGAATTTTCTAAAATTTTTAACTTATTGAAATTGTCATTT
-CACCTTTACACTCACTTCAGCTAAACTATTACTGCATTTCGGAAGTTGAT
-AGGATACTGGTGGAGCAACAAGTGGATGGCTTCTAGTGATTGGCTGGCTT
-GTCGAGCAAGTTTGTGTGATTGCCTGAAATAATTTTTGATTTCAATTTTG
-AGTTGATTTAAAGCAGTGAACCTACCACCGGGTTCGGACGAGAAAGAGCA
-TTACTCGGTAGACCACGGAATCCAATTTTCGTTGAATTGCCTCCAAATGC
-AATAGAAGTTTGTACGTTTTGTGAGAAGTCGGGCTGAAAATTTTCAAAAT
-TTGAAACTTTTCGAGAAAAATAAAAATCTCACCACAGCATTTCGAGATTT
-TGTCGATTGTGGAAGCCTTTTCCTGGAGCGAAAATTGATTTTTTTTTTCG
-CTAAATTTTTTCTTTTTTGGGCAGCCGTGACGTCCCGAATAACTGCTTTT
-GGGTCCCGAAGATCATTTTGCGAAGAAATTGGCAGAACTGTTGCATCTTT
-TGGTACGATGGAAAGACCGGGAATGGACGTGTTCTGAAATAGTTGTGTTT
-TTAAGAATGCAGAAATGTTTTTCTGTACCAAAATTACCATAGTCATGTCA
-TTCATGATGTTACGACACATGAGCTCTCTCAGAACATGGATGTAACGCCT
-TTTCTTGTCCCGGTAATTGCAAAATCTCCTCTCAAGTGCATTGAAAATCG
-CGTGGACAGATTCAACTCCTTGTTCTGTGATCCTTCCAATGTTTCTCACA
-TCTTTTGCCATTTGTGGTGCATGGTAGACCAACAAGTGCAGCTTTAAAAT
-AATTGTTTCTTCGGGAACCGCTACTTTCAAATCCTCCACAAATCCGCGAA
-TCGAATTTTGAAGTATTAAGACGTCGGAATCATTTAAAAACTTGTTTCCC
-GAAAGTGACATAATAGTTGAAAGCTTTCCCATTGCTGATTTCAATCCGAG
-CAACATTGGGCATAAATTTGGGCCAAAAATGTTGAAAGTCTCCTCTACAA
-CAGCCGGCGTTAGCAGCAATTTCAAATGGTTTCCGCAAAATGATTGGAAC
-CAAGCCTGCTTGTCCGCTCCAAACTTAGCCCAACACTGTCCCATTTTTTC
-AAGTGTTCCTTCGGGAGTACCATTCACAATTGTATCGAGCAACAATTTTT
-CCGATTGAAGTGCTTTCAGTTCAGCATGCGACTCCAATTTCATCTTTCCG
-GTGGCTCCTTGATACTTTTCTTCCGCACTTTTAATTAGGTTAACAGCGTT
-TTTTAGAGTTGCTTTTCGTGTTTTCAGGATAGGAAAAGAAGTAGTGTTAT
-CCAAAGTATCAGAATATTTCCAGAGGGGATTGAAGATATATTTGTCAAAA
-ATACCCATGATAATGTGCAGAAGAGGAATCAAATAGAACATGATCGCAAC
-GTGTGGCAGAAGTGGAGTACATCCTTTGCGAACACCCAAGTCGCCATTTT
-CACAACAAGCTTTGTAAAGATCGATTGTTCGTGGGTGGAATGTTTCATCA
-ACATTCATATCCTTGATTTTCATCCTCTCTTCAGCTCCCCGTGGATTCTG
-TGCAAAACATTTGAAGCAGAAATTGTGGGATGAATGTCCTTGGTGTCCAA
-GAATATCAGATTGAAACTTGCAATCTCCAGTTGCAATTTGCACAATTTTT
-GCGGTTTTTTGAACTCCTTTGTCCAAATATCAAATTTTCGTTAGCTTGCC
-AAGCTGCTCAAGAACGTCCGGAATGAATTTTTTCAGAGACGAATAATTGT
-CGGATCCGTCATATACTGCAATTACCATAACGTGTCTCGAAGAATTCGGT
-CGAGATACGTTTCCGATTACCAATGCCAACTTTGTGCTTCCACCTCCAGC
-GTCACCAACGACTCCAATCTTGATTACTCCTTTCGTGTATCCGTCGTCCA
-CAAATTGATTTGAATTGCATAGAAGCTCTATTCGATAGGCTAAAACTTCT
-GCAATTTTCATGCACTGCACAATGGTAATCACTTTTCCTTTATTGTCGAA
-CGAAGTGGAAACTTTGAAACTGGAGATCATTGATAACTGGATTGACAAAT
-CTCTTGTGTTCTTTACCGATGGAAGCAAATCATAGCCAATGGCATTAGTC
-AAATAGTTTTTGATTTTTTCCATCTGACTTAGAGATAATCCGCATTTTGA
-TAAAAAGTCAACGGCCTCAAAGTTTGAAAGCTTGTTTTTGTAGCTTTGAT
-TCTCTTCTGAATTCAGGAATTTTGTGAATTTTCGAATAAATTGTCCGACG
-TCATCCTCGAGGCAGATTTCGTGTTGAAGCAAGTGAAGAGCTTTGCGAAA
-TCGATTTTTGATACAACTTTTGCTTCTTAGATTCGAAATATTAACTTTAA
-AAGCTGATTTTTTAAGGTTTTCAACTTCTTCGGCGTGTCTTTGTAGACTC
-AGAACCATAGCTTTGCCACTTTTCTTCACATCTGCACAGCTTCTCACCAA
-TCGACCTTCTATACCACTGACGATCGTTCGTATATTGCATACTTCCATTT
-GCAGCGAAGAATTAGATGCTCTTATAGTGATATTTTCATGGCGGACTATT
-TGCATTTCTTCCGAAAACACCGCAAACTCATCAATCCGCTTTTGTATTTC
-TTCTGATATTTCATTTTTTTCATTTTTCAGTCGTTCGATCGTTAGTCGGA
-GCATTTTGATCTGCGGAATTTGCTCAACATTGGAGATTATTCGAACCCTC
-GGTGTACTGAACGAGTTTCGTAAAGGTGTCGGTGGAAATACGGGATTGGA
-GAATCTCAGCAAAATCATATAATATTAGTTTTGAAATATTGAAAAAAATT
-ACATTGTGAGAAAAAGTCGGAATTTCGTCACTAAAATCCATTTCCACGTC
-TCTCGTCAGAATTCCTTCATCCATATTGAAACAATTTGACGACCTGCATG
-TAGTTGCGGAGCTACTGGAAGCAATGTCGGGATGGTGGGAGTTTCGATCT
-TCTGAACTGATTTCCTGATTAGCCTGTGGCGACGAGCTGCACGTCTGAAA
-ATCACGTTTTTGAAGTTAGAACAAACTACTCCAACTTAATTAAAGTTGAC
-AAAATTGAGCTGAACGAACCTCCACTTTCGAATTGTTCAGTTCTTCCTCT
-TCAGTTTGATCTTTTGAAACTCCATTAGCACTGTTCCTTGCTCTCTGGGC
-ATTTGCTAAAAGAAGGCCTGCACAAGATTTTTCTTTTCTTTTTTGTTTGA
-AGTATACTTTTGTCATCTGGAAATATTGCATGAATATTATAAGGGAAACA
-ATTTTTAAATATCGATTTTCACGAAATTTGAAAAAATCAATAATTTGGGC
-GCATGATATTGAGCTGAATGTTTCGAATTTAGAATCAGCATGCTTTTATT
-CATATTTTAGGATCTTTTTAAAAAATCTGGACCAACAGTTTTTGAAAAAA
-AAATACTTTTCGTTCAGAAATGTACTGATTTTCCACTGATTTTCACGAAA
-TTTGAAAAAATCAATAATTTAGGCGCATGATATTGAGCTGAATGTTTTGA
-ATTTAGAATCAGCATGCTTTTATTCATATTTTAGGATCTTTTTAAAAAAT
-CTGGACCAACAGTTTTCGAAAAAATTCAATTTTTGTTCAGAAATGTGAAT
-ATTCACTAAATCGAAAAAAATAATTGCAAAATCCGTCGGCTGAACATTCA
-AAACTTATCAATTTGAAATCAGCATATTTCAGTGTATAATTAAAAAAGGT
-TTCAAAAATTCTGAGACCAATTTTTGTTGAGAAAAATAATTTTTCGTTCG
-AATTATCGATTTTTCACGAAATGCCAAAAACAGTAAACTTGGGCCCATGC
-TAAAAGCCTGAATCTTTCAAATTAAAAACCAGCATGATTTTTTCTATATT
-CTAAGACGTTTAAAAAAAATCTGGACCAACAGTTCTTGAGGAAAGTAATT
-TTTTATACAAAAATGTGCTGATTTTTCACTAAATTCAAAAAAATAATCAA
-GTTGGGCCCATGCTATACACCTAAATCATTAAAATTCAGAACCGCCATGT
-ATGTATTTTTTCATACCATAGGCTCTTTAAAAAAAATCTGGACCAACAGT
-TTTTGAGATATGTCAAAAAAAACAACTCACTTTTTGACGTTTTTCGCCTT
-TTCGCGGATGATGCGGTCGATTTTTGCGGCGATTTGTGGTCTTTCGCTGA
-AAATATTATTTTTATTTCAATTTTTAACGAAGAAAACAAGAAAAAACGAC
-GAGAAAACATCAAAAAACACGAAAAAAACGTCGAAAAACTCCCGCAACCT
-CATGAAAAAAAATAAAGCACTGCAGCCGCGGGACTAGTTTTCGCAACTTT
-CTAGGCCATGTCCCGTTCGCCGTGCCGTGTCTTGTCGTGGTGGTGTGAAG
-TGTGTTGGTGTGAAGCGTGTGAGTACGGTAGGCTGCTGCAGATGTGGTGT
-GAGCTGTAAAAAATCGAAATAATTCAAGAATTACGACGATTTTCGTATTT
-TGAGAAGAAGAAAATTTTAAATCACGAAAATTCGAGAGAAAAAATGATCA
-AATTCAGTCTCAGAAGCGAAAAATGAACTTCTTTGTCTGGAAAACAGCGG
-TTGCTCGTGAGAAAAAATGTTTAAAATTGAAGAAGATCAACAAAAACAAA
-AAAAGACACGTAAATGCAACTTGTTTTTAAAGGTCGTGGCCGCGTCGCGG
-TCGCGCCGCGTGCGCACTTTTGTAGAAGACTCCGCCCCCTTTTTTCTTGG
-CGCCGTGCCAATTTTTAGAAGGAAGAGCGTTTTTGGTTGAAATAATCGAT
-TTTCGACGAGAAAATAGACTAAATCAAGTATGGTGAATCTGATTAAAGGC
-ATATTAACTTTGTAAACTGCACAATTAACTAGAAATCGTACTATAACCGA
-ATATAGTCAAAGGGTCGCTCAGTTCCCCCGGTCTAGAGTCCCAGGTTCAT
-CTTTCGAGCTGTTTCCTGAGAAATTGTACAGGATTTGTCTGAGTCGTGAA
-CTGAACACGCTTTTCAGGTAAACGTCGTCTGGATGTCCTGGAAATCAAAT
-GTTAGTCTTTGTATCGATGGAAAACATGGTTTTCTCAAGGAAATAGTCGG
-AAAGTCGGTCGATGCACCATGTTGTGGCACCACGGAGTGGCGGAAGACCG
-AACCCTTTAAGCCTCAAGAGGAACCGAGCAACGAAGACTATGTCAGAGGT
-GCAGCATGGCATCGTCTATTTGTATATGTATTGGAAAGAACAGAACACAG
-TTTTAATAAATATGTTTATTACTCCAAAGGGGAGATAATCAACAGAGGGG
-AGTGGGTCGTACACAAGAGAGAGGGAATTGTCTGGTGTGAGAATATCACG
-TCCTGCCACGCGGGTCTTTAGTCTGAAAAGGTCGAGTGTATGAATAGTCG
-GGGTCTTTGCAGACTCGTAGAATAATGTCTTTGGTCAACTACACTTTCCA
-AATAAAGGGAGGGAAAGGTAGGAAACGTCGGCAATTAGTCTGACTGGGAG
-CTGTCAATAACGGGGGGGGGGGGGGGGGGGGAAGAGACCAGCAAAACCGA
-ACCAAGAGTGGGGAGGAGAGTTCCTTTCCTGGTGCCACCGACGCTGCAGC
-TCGCTCCGTATCGTCGCTCATTGAGTCGCCGCGCAGCCAATCGTTGCTAC
-GGGGCGCGAGTGTAACTCTCGTTAGAGAGCGTGTGGGAGCAAGAGACGCA
-GAAATACAGTAAACTTCTCCTAACTGTATGGTAAGCTTAAGAGCTGGTCT
-TAAAAGGTCGAATTGAATGTACCCCTCGCTCGGAGAACTGCTGAAGCAGT
-CGAGAGCGAGACATTGTGAAATGGGCGATACAGCAGAGCCCAGTTCACAA
-CAATCAGACTAACTGGCACTTACGTATAAATAATATTATGGGTTTCGTCG
-CTCCCCCTCCAAATGTTTTAAAAACGATTTAAAACATAATTTATACTGTT
-TTTTTTTACTACTGACCAATGAAAGTTCATGGTTGATAACATAAATCCCC
-ACATTTTCAGAAAAATGGATAAGCAGAAAAAAAGTTATTAATGAACTCAT
-AATTTTCATCGAAATTAGCCAGCTTTAGTTTCGGTGTATTACCAGAAAAC
-AAATTTAAGTGATCTTACTCTCAACTCCAACAGAGTATCTAATTGATTAG
-ACACATTTTTTACAATCTTGCTGACAATTGTGCGATTTTTGAAGATTTTG
-TCAATAAGCACGTGATCCTGAAAATAAAAAAGTGAGTAATTTTACGCTCG
-CGAAATTGTGAGCCAGTGGCTGCCTAGATTTTCAATTTGTTACATTATTT
-TGCAGCCATACGTGGACCATAATTCTGGCGACCACTTTACGGCATTATAA
-TTTTTTGAACTGCAAACAAAACATGTAAATATACATATATGTATACTAGG
-AATTCGCACTAAAGTAAATTATTGAAATTCGTCAACTTTTATTTTCATTT
-CTTATATTTTGTCTAATTTTCAACGAATTATTGAAAATGAAAATTTTTAA
-TTCACGTCAAAATTAGTGAACGCGGTGAACGGCGACGGCGAAGGCGGGCC
-GGCGTGAGGCCGGCGTGAGGCCCGCGTTTCGCGCCTCACTTAGCTGGAAA
-CCCTAAGTTTCTCCAATTAAATTACAGGTGATATACATTTTTCCTCTTTA
-GGATAAGAAAAGATCATTTCCTAAGCCTGACAATACAAAAATGTGGTTCA
-CGTTTTTATTTTTCATAACTTAAAAAAATACTATTAAAATGAGGGCATGT
-AATACACAAATACCGGCAAACGGTGTTTCAAATCAAATATTGAAGAAAAA
-ACAAACAAAATATGATGAATTCTCTTTGTTCTTACCAAAATCGAAACCAT
-CATTTAAAATTTAGCAATTTTTTACAGTTATATTTGGTAATTACGGCCCA
-TTTTCTATAATATAAAGAAACAATTGAAACTGATCCACCCTGTCCGCCGA
-CTATTGGGCATCGACAGATGGTGTTCTCAAAATACCAAAAATGGGTGGAA
-CTCTCTCACGAGCGCTCTGCAGGTGTCGTTTTCCTTTGCAAAGGACTGCC
-CTTCCATTCATTTGTGTCTCTATACAACATCTCATCTGTCATGCAAACCG
-ACATTCCCAACATACTCGAAATCCCAATTGATGTAAGTTCTTGTTTCTTA
-AACTAAAATTAGCCAACTATTTTCTAGAAATATCAATCTAGACCGAAATA
-CCTTTTACTCTTGAATGATATCAAAAGTTTAAAAATGTTTTATCTGGTAA
-ATATATTATTCAGTCAATAATAACAGAGCAATAATTTCCTATTTGTAAGA
-CGGTTTGCCAGCCCTACTGATGTAAGCTAAAGGTCCTACAAAAAATCCCT
-GAATTTTGGGTCTCCTTTGCTAACTACAAATGGTAGGCAAAAGAACATAT
-TTGTGTACAAAAAAGTATGCAAGCAAAAGAGACAGCGTAGGCAGGCAAAA
-GATTCATAAAAGAGAGATAGCCCCCGCGGTCAAATCATTCTACTAGTGGC
-TTGAAGCCTCTGTTGATGTGATAAAAGTAACATTTTATATAGCATTGTGT
-TCGATTTTTCTAACAAATAAAATGCATATCATTACTTATACAGTGCGTGC
-ATGTTCTTTATGCCACCCCCAAAGTTTTTAATCATGGCAGTTTCTGTGTA
-ATTTGGTGAGCAAAAAGTATTGAAAACCTATTCACAATGAAAAACCTAAA
-CTCAAGAAATGTTGTGATTATATCTCGAAAATTGTGAAAAATAAGACAAT
-AAATCAAAAATTGGCCGTGCAACTTCTATATGCCACCTCGGATTTTTTTA
-TGATTTCTTATGATTTTAGACTATTAACTTATTATTCAAATAAAATTCGA
-TTCAATTCGTATACATTTCAGTGCTAAATAACTATTCCTGTAACTTCTCC
-CAAAGACGATACGATGATCAAAATATGGGGATATGTTCTAGATACTAATT
-AAACATAGTATGTGAATATTGGTTCACATTGGTGGATTTTTAGCGTCGCC
-AGAGGGACATATTTGGTGTCCCCAGCCGTTTTTGGTGAAAACACTATTTC
-TCTTTTTTTTCTCGGTGCCAATCAAGTTGAGAAATTTCAGGCATGCTCTC
-GAACCTTCAGGAAAGATCGAATACTGCAGAAAACCTGTAGACTAGGAAAA
-CAACTTGGAAGTTTCTTAAAAGTTTGGAATTTTACTAGAATTTTCTGAAA
-AATTTCAGAAAAAAAGAGACTTTCAAGAAACTTCTGAAAACTTCGAGAAA
-GTTCTGGAATGTTCCAGATTTTTCTAAAAAGTAACAAATTCCGTTCAGAA
-CAATGTTTTGAATATATGCCAGAATCTTACTCAAGTAAAATAATTTTTTT
-TAAATTCTGATACTCCAAAAATATTATGAAATTTCAAAAAAAATTAAATT
-TAATAGACGTTTGCAATACTATTGAAGACCTGAAAAAATGTTAGAAATTT
-AGAAATTGTTCATTTTGAAGTATTCGAAATACTGTTCGATTATTCATGAG
-ACTGATAATGTTATCAGTTTTTTTTATTTGAAAGCTTTCTAAGAATTTCA
-TATGATTAGAACATCGAAATAGTTTTACTTTAAAGAAAAAATTGCTCCTG
-GAAAATTTTAACTGCTGAAAACTTGGTTACAGAAATTTTATGATGCTCAA
-ACACTTCCTGGAAACTGAAAAAAAAAAACGTTTCATCTGCAAAGAAAAAC
-TTAGAACAAATTTCAATAATTTACTTTAGTGCAAATTCCTAGTATACATA
-TATGTATATTTACATGTTTTGTTTGCAGTTCAAAAAATTATAATGCCGTA
-AAATGGTCGCCAGAATTATGGTCCACGTATGGCTGCAAAATAATGTAAAA
-AATTGAAAATCTAGGCAGCCACTGGCTCACAATTTCGCGAGCGTAAAATT
-ACTCACTTTTTTATTTTCAGGATCACGTGCTTATTGACAAAATCTTCAAA
-AATCGCACAATTGTCAGCAAGATTGTAAAAAATGTGTCTAATCAATTAAA
-TACTCTGTTGGAGTTGAGAGTAAGATCACTTAAATTTGTTTTCTGGTAAT
-ACACCGAAACTAAAGCTGGCTAATTTCGATGAAAATTATGAGTTCATTAA
-TAACTTTTTTTCTGCTTATCCATTTTTCTGAAAATGTGGGGATTTATGTT
-ATCAACCATGAACTTTCATTGGTCAGTAGTAAAAAAAACAGTATAAATTA
-TGTTTTAAATCGTTTTTAAAACATTTGGAGGGGGAGCGACGAAACCCATA
-ATATTATTTATACGTAAGTGCCAGTTAGTCTGATGGCATTGATGAACTTT
-TATCAAAAAAAATTAATAAAAATTTGCCGCTGCAAATAAACAAAAACTTA
-GTTTTTCAAACAAAAAAAATCAATACAGCGGACTGATATCCCTAATTATA
-GACAGGTATCAAAATTGTGTTCAATTTTACTTTAATTCGCTCTTTTTTCA
-GCTGATAAATAAATTGTTCAGCGAAGAAGTTTTGCACAAAATTCGAAATG
-AGCATCGAAAAATACAAATTCACAGTTTCAAGACTTGTAAAAATTGAAGA
-AAAAGATCAATATTCATTAACAATCAAGTAGATCCTGAACTTCCGCTAAA
-ACAGCCTCGTCGATGCACTTGCTCGTTTCTTATAAATGCACTGGAGATAA
-ACAAGAACAAGGTGAAACACTTATTCGTGTAAGTTGAAATCAATTGTTCA
-AAACCTGGTTTTTTTGCTCGCCGCTTCCTCTGTTAACTACCAAAAAATTC
-AATTTTATTTTGATGTTGATAGAATTTTGACCGGTAAGGGAAATATTTCA
-ACTTAAACCCGGACTTTCGAATGACCACTCTAAAAAAGAGCTAGCGGCAG
-AGGATCAATTTGAGCTAGGGAAAAGTCGATCTGAGAAGTGTTTCAGACAA
-TTTTTCATCAAAATAGGTGGTTCAGAACTTGCCTTTAAAAAGTGTTTTCT
-GAGTCTGTTGAAGTTTTTTATGCTTTTTTGTGATCGTGGAAACAATATGA
-GAAGTGGTGAAAATTTCAATCAATTAAACCAATTTTTAATGTTTTGTACT
-CAGCTGTAACATTATTTTCAGATTTTTAAAAAATACGGTAAATGTGAAAG
-TCTACAAGCTTTATGTCGAACCGATTAAGAAAAACGAAATTTCGTGCGGA
-GTGGATGCTCGAATTATACTCAATGATCTCATACACGATTGCTTGATTGG
-AGTAGATTGTAAGTCAATTTTTGACATGAGCGCCTGTTTTTCAGAATTCT
-GAGTAAAATATATGGCTTTTGAACTACTGATTTGACATTCATGATTTTTA
-GATGGACTCGTTGAAGAATATAAAAATGATTTTTGCTGTGGTTGTCAAAT
-ATGTCGAGACATTCATAGAAATAAAAACTGTATAGTTCATAGTATTCAAC
-TTCAATATTTTGGTGGAAATTCGATACCGCAGCAGTTTTTGAATTTGATG
-TTGGAAAATTTTGGAGTTGATGAGCATGATCGATTTATGGACAGATTAAA
-CGAACTATTCGGGAAATTCGCATATCTTCGATTGAGCAATTTTGGAATTG
-ATGAGTTGCGAATATCGGGAGAAGAGCTATTTGGAGAATTAAAAATAATA
-GAAATCATAAATCAAATCAGGATATCTCCACATCATTACAAAGCGCTGGA
-AATGAAAGACTGGTGAGTGTAAATTGATACATTTGTAATGAACACCGTCG
-AACAGATGTTTGAATCACTGCTTTAGTTTTTCTATTATAACAGTACACGT
-ATTGTAACAGGTTCTCAAAAGAGTGAATTCTCGTGTTTTTCATACTTAGA
-TAGTCTCTCCATTCCTTCACTTAAAGTTATCCCAAAAACAAACAGCCCAC
-TGCGATCAATGTCATGGAAACTTTATTCTCGTTTTTTTCGTTCTTCTGAG
-AGGAAATCGGAAAATCGAATAATTGGATATTGAAAAACGGAAAATTTCGG
-TGTTTCAATTTTCCGGAAAACCAAAAATCGGATTGTTTAGAAAATTAACA
-AAAAAATCAAATTTTGTTTTTGTTGATGAAAAACTCAGACACTCTTGACA
-TGATATGCTCAGGAACATTATAAAGATTACATTTTACAGGTTGTTTTATC
-GGACCATATACGAAAAGCAACTAGGGCGGTACGTAGTTGGTGCTCGAGCA
-AATTATTTCCTCAATTCATTGGTAACATGCCACACATTCACCGTTTTAAT
-ACTGGGAAAAGAGTTCCTTTCAATCCCAAGAGACTTTTTATACCAGCTTA
-TTTCAAAGTGGAATGTTAAGGATTTCAGACTGGAGTTCCGGTTCGAAGCT
-TACAGTGGTCATTTTAATACTATGTTTAGTTCAAATATGGATTTCATTTT
-GGAAACGTCTAAAGACTTTTCAAATGCCGTATTCAATGTACCATTCAACA
-CCCAACCCGTTTCGAGGGTTCTTCTGGAAAAAGTGGAGATCGATTTACAA
-TACTCTGAGGATATGTTACTCGAAATGAACGAACAACTGGAAAACGACTA
-TTATTCACCAATGGACAATGTGATTGCAAATGTTCAACGAAACTTCCCAG
-CCAAGAGTATGACTGTTCTACTTCCTAAAACGTATCTCCTCATTACTCCG
-GACAATATGGACAGAGTCACAGCAAAGCTAATCCGATTGACTGAACAAAA
-CAGCCAGAGAAATGGAAGTGTCACATTCAACTTATACTATCAGCATGACA
-AAGGAGAAAAACATATTCCAGAGGATATCCCAGACATTTTCAATTCAAGA
-GCACGTCTTGTAGGTGAAAAACCAGTAGATTGTTGGTATCTCGATGATAT
-TTTAAATATCCCCAAAGAAAATTTCAAGGATGGATTTGGAGAAGTGACTG
-TCTGGTATGGAAAAAGCTTTCAAATAAGAAATTCCACAGAAAATCGAAGA
-ATGAATTTTAATATATTCTATACCAAAAGCTATCTGAAAAAGTTCTTCAA
-TGAGAGACATAGTAGATGGGTGAAAACTGGATTTTTATTGCATTTCATGG
-ATCTTATTAATTGATTTTATGTGTATTTCTGTTACTACTAATAAAGCAAA
-TACTCTGTCCGTCCAAACCATGTAGCCTGTAGACCTCGGACAAGAGTTGG
-GCGCTGCCTAAAAAATGAAAAAAGTCGTCAACTACCTCGTCGTCTCGAGG
-CGTCGCCGAAGTCTTACCTGCTGAGCCATGATGGTCGCGCGGAAAGATGC
-ACACTAGTAATAACATATCGTACTCATATTCTGATAGTTTTTTTTGGGGA
-AGTGTCAGACGTATCTGATTGATACGGTATTCTCACATACCTTATTTCAT
-TCGTTTTCAAGTGTGCTCACTAAGGATTCTAATAGTAAGTTCAGAATTTA
-CAGAATTACTGTAATTCAAGTTTGTTTCATGTCTTTCAATAACAGACAAT
-TTTATAAAATTTTGCATTTCAAAGGAACAGTTCAGTCTTAGAAAAATTCA
-AAATTTGATCCATGGGATTGACTGACTATTGTTTGTATACCAGCCGTTCG
-CACAATGCGAGTGCTCCGACTGGCGTACTCGAAATTAAGATGAAATTCTA
-AAATTTCTAAGCCTTGGAACGTTTTTCTCAGTCTTCCAGAAGTTTTTAAA
-GCAACATGAATATTATATAACTAAGTTTTCAAAAGTTACAGATGTTTTCG
-GCCGAAATTAGACTATTTTGCAATATTTTGCGACTTTTTGCTGAAAAATG
-GTACCCATCAGAGATGTGCGGCATGTGCCGAACGGCATGTGCCGATGTGC
-CGAAAATTATTCCACTCGGCACATCGGCATGTGCCGACCTTTTTTGTCGG
-CACATTTCGGCACATTTCGGCATATTCGGCACTGTCTGGAATATGTACCA
-AAATTTATTTTTTAATTTTAAAAATGCAAAGAAACTTCAAAAAATTGATT
-AAAATTTTCGGAATTTATCATTTCAACTTATAGTTTACTAACTTCAATAT
-TAAGACAAATGCACTGCATTTTTTATGGGGTTATCCAACTGAATGTTCCC
-GCTTTTTCCTCCTGTTTCCCCCCTCTAGTCGCGATCCAACTGGGAGGAAA
-AATGCATTTTCCCCTCGTTTTCGCATTTTTTAGCTGCGAAATTTCAGAAC
-TGAGCTTAGGGTGGGCATTTATAGACTTTTTTTAATTTTTTTTGACCAGA
-AAAAGTTAAATTTTTATAGTTATTTTACCAATTGGACCTTAAATTTGAGC
-TATGATATCTTTGTGGTAAGCCAGAGTCATGGTGAGTGATCAACTACAGA
-GTTGTAGCAAATTTTCTGTTTAAAATTTTGTTAGTTGATCAATTCTTGGT
-ATCATAGATTTTCACAGACTAACATAGCTGTGAAACTGGACAATTTCTTA
-ATGTAAATTGCGTACACGAGATTTCTCTATTTTCCGCGTGGAGTACTAAT
-ACCAAAAATTGATCAACTAACAAAATTTTAAACAGAAACCTTGCTACAAC
-TCTGTAGTTGATCACTTACCATGACTGTGGCTCACCACAAAGATATCATA
-GCTCAAAGTTAAGGTCCAATTCATTTTAAAAAAAACTATAAAAATTTAAC
-TATTTCTGGTCAAAGAAAGCTGGAACCGCATTAAAAATTATGTTATTTTA
-GTATTTCAACAAATGTCTAACTGTGAAAATTAAAAGTAAGTTTGAAAAAA
-TTTCTTTAAAACATTTTTTGATAATTTTTTCATGTCCTGTGCAGATTTCA
-AATTTTGAAACAATACTTTTAATTCTCATATATCTCCGTTGAAAAATTTT
-TTATGACAAAGTGATCAATTACAAAGTTGTACTTTGGATTAAGAAAAAAA
-AACTTTGTAGTTGATCACTTTGTCATATAAATTTTTTCCACGGAGATATA
-CGCATCCGAAGTGAATGAGTTTTCACTATCAATTCTACTAAACCCTATGT
-TTTTGTCTGAAATCGTGTTCAGAACATCCAAACTGAAAAAAACAACAAAC
-ATTGCAAGTAATTTTTTGTTATTTATTTAAATTGATGAACTTTTTGTTTT
-TTTTAAGAAGCTATATAGTATCTTTGCAAATGTGCCGAATGTGCCGATTT
-TTTTAGGTTCGGCATGTACCGAGTGCCGAGAAAAAATTAATTCGGCACAT
-CGGCATGTGCCGATGTGCCGAAATTTCAACAAGTGCCGCACATCTCTGGT
-ACCCATCGTCTCGTCACGACAAATTTTTGTTAAATTCGAGTATGTGTGCG
-CCTTTAAAGAGTACTGTAATTTGAAACTTTCGTTCCTATGGAATTTTCTT
-TGACTTTTCACTTTTTCCTCTGGTTTTTATCCAATATTCATAGAAAAAAA
-GAGAAAATTTTTCTAAAAATCGAAAGTTTGAAGTTACAGTACTCCTTAAA
-GGCGCATAACGTTTCGGAATAAACAAAAATTTGTCGTGGCGAGACCTGAG
-TATTATTACAGGAACGCAAAATTCGGAGAATGCGTTTTACACAACATATT
-TGACGCGCAAAATATCTCGTAGCGAAAACTACAGTCATTTTTTAAATGAC
-TACTGTAGCACTGGTGTCGATTTACGGGCTAGATTTTTATTAATTTCTGA
-AAATTGAGCACCCGTAAATCGACACTACTGTAGTTATTTGAACAGGATTA
-CTGTAGTTTTTCGCTACGAGATAATTTGCGCGTCAGATATTTTGTGCAAT
-ACGCATTATAAGGGACAAGTTCTCCAGTGAATTCTTCCAATTACATTGAA
-ATCCTTCTATTTTGAATACAAATTACTCAAAAGACAAAGTGTCGATTTAG
-CCTAAACATTGCGCATGCGTAATTTCTGAATCTTGTTCGTTCTTTACATC
-TGCACACTTGGGTAAGAAGTTGGGCAGCCTATGTTTTAGAGGGAAGTCAA
-CAATGTTATTTTCGCACTTGTGGCAACAGAGTTGAAACTACGGTACTGTA
-TATGGGTACACCTTTTAAAATTTTAAACAAAAATTTGTCTTGTTGAGACC
-GGAGCACATAGATATTCTCAGTGTGTATTTGTCTAAAAACCTGCCAATAT
-TTGAAAATCTTTCAAAACTTCAATATTTTGCTCCAAAAATTAAATTTTTC
-AAATAATCTACAAAAAGAATCCAATTTGACTGAAAACCTGCTAATATTTA
-AAAATCTTTCAAATGTATAATTTTTTTGCTCCAAAAACTGATTTTTTTCA
-AATAATCACAATTTCAATTTTAATTTCGATAAAGATACACAAAAAAAAAG
-AATAGCATTTAAGGATTTCCTTGTTAAGCTTCAACAGCGTAAGGGAAGGC
-CTCGTTGGCAATCATCATGCGTGTAAGTTCGGCGGCGCTGAAAATAAATT
-TTTGATGTTTAGCTTGCATGGTATGTATTACTGATCCCTCAACTCCGCCA
-TGGTCCGACCCTGACGAAGTGGTATCTCTCCAGCATGGTGAACTCTGACG
-TGATTCCAGTGCACAAGCCTTGTTGCAGTATACGACAGCCCACAGATACC
-GCAGTAATACGGATAGGGAAGGGTATGCAGATGGTAGACGTGGCGAGCCC
-TGAATGTTGAAACTGACTTTTTGAAATGACTGGAAAAATAATTACAAGTC
-AACTTGCTGTCCGAAATTCATCATTACAAATGGAGCATTGGAATTGTTGA
-GCATCAGGAGATTCCGAATTCCGATGGGTATCTTGAGGCTCTTCCATTTC
-CTGAAAATTGTAATTTTAGACTTTTTAGATAATATTCACAAAATCTGTTT
-AGGAAAAATTAACTACTAAAGTTACAGTAAGAATTTTGCTCTGAATTTGC
-TCATAAAGGAAATTTTTTTAAGCTTGCACCCTGATTTGTTTAAATTCTTC
-AATCTTTGGATTCCTCGCAAAAAATTCAATTCAGTCTCCTGGGCGTCGAA
-TTGCGATGGAGCGCGCTTGCCGTGCGTTGGCGCAGCCACGGTGGTTCAGT
-TGTAAGATGGGTGCAAACGCGCTCCACAGAGTTTTCGATCCCCAGGAGAC
-TGTGTCCAAGTAAACTGAGTGGTAGCTTTTTTGTTCAAAAAATGTGCCCC
-GCCCATTGGAAAAGCATGACCTTGTAATCGAAAATCCTTCAAATACGATT
-TCTATTCAAATTTACGAAACTGAAAAAAAATTAATTTTACGAACACTTTG
-ACGTCCATTCGGTGAGATTCTTTCAGGTGTGAATCGTTTTCTCTTGTTAC
-GAGCATCATTTGGCTCCGGCACCGCCATCTGACCGGCCTAAAATAAGAAT
-GTTTAAAAAAATATGCATTTAGGAAGTTTAATATTCAAAACAGAAGAGAC
-ACATTCCATATGAAAACAACTTACATTCTGAACGTTTCCAACGTCCGCCG
-ATTCCTTTACACCGTATCGATCGATTAAAAAATCGATCAGCTGACCGTTG
-AGCAGTACATCCTGGAGCGAGATGGTGATCGGAGCCACCGGTGGTGCAGT
-CTCATCGTCTGAAGATCCAGATCCGAAGGCATAGCTGTCCGAGTGGATGG
-TGTTGGAGTGGTCGAATTTCTGAAAATTGACCAATTTTTGATTTTTTAGA
-CTTGAAAAGGCCTAAAAAGGACAAAACGAGCCCCAAAAATTTGAACAAAA
-GGGTTGAAATTTCATATTTTGTTAATTTTTCTGTGTCACAATTTTGATTT
-TCAATCTATCGATATTTTGAATAAATTTCAATTTTTTCGGGAAAATATTG
-CAAAATTTAGTCATTTTTCCTCAAAATAAACCAAAATTTGATTTTAAAAG
-TTTGGAGAATGAATTGTTGAACTTGGAAACACCAAAATTAGCTCTAAAAT
-TTCGAAAAAATGGGTAATTTCAACTTTCCGTATCTTTTCAGTTTGTCGGA
-ATTTTTAAAAAATTTTATTACAGAAAACCACCAATAATTAAAATCTTGAC
-TTTTTTTTTAACCCTAAAAGATTTTTTTCGAGAAAATATCTTAAAATTTA
-GTCATTTTTCTTCTTTTTAGGAGCTATTTTTATGTTTTTTACTTTTTGTT
-CCGTCAAAAACAATTTTAATTGTAAAGGTTTTTTTACGATTTTTCCAGAA
-AAACCGGTAAATGACACTATTACGGGAACAAAAAATTTGGAAAATGCGTA
-CTGCACAACATATCTGACGCACAAAATATCTTGTAGCGAAAACTACAGTA
-ATCCTTTTCAAATGGCTACTGTAGTGTCGAATTACGGGGCTCGATGTTCA
-GAAATTAATTTTTTAATCGAGCCCCGTAAATCGACACTACAGTAGCCATT
-TGAAAAGTATTACTGTAGTTTTCGCTACGAGACCCTATTTTGCGCGTCGA
-ATATGTTGTACAGTACGCATTTTCAGAATTTTGTGTTCCTGTAATAATAC
-TAAGATCTCGCCACGACAAAGCGAAAAATTTTTATCGATTTTTCAGCAAT
-TTTTCTCTTGTTTTCATAAAAATTGGGCAAAAACCGGAGGAAAAAAGTGA
-CGAATTAATAAAAATTCCATGGCAACGAAAGTTTGAAGCTACAGTACTCT
-TTAAAGAAGTGCACCTTTTTGGATTAACAAAATTTTGTCGTGACGAGACC
-CTGGATACCATTTTTCCGGCGGAAAAGTCGCAAAATTAGCGATTTTGGGA
-ATTTTTCGCGGCGAGACAACTGCACAACTCGACATGCGAGTTTATCCTTG
-CAGATGGCCAAAAGCCCTCCGTCGATCATTTGACGAAGCAATTCCCTGGT
-GTTGCGAGCTCGACGAGCTTCTGAACGATGAAATTGCCATTTCGACTGTG
-GCAGAGCCCCACGAAGAGCGTCGTGGATTTGGTGAGCTTCTCGAACACGG
-CTTTACGAATCTGATCTTCGGAATTTAGTGGATAGTTGGCCTCCAAGAAC
-CTTACCCCCGATGGATAGATTGCGAAATCGATGAGCTGCCCGTTGAGCAG
-CACATCTTCGAGCGAAATGAAAATCGGAGCCACTGGTGGTGGGGTCTCAT
-CGTCGGATGATCCCGATCCACTGTTGAGGATAAAGCTGTCCGAGTCGGAG
-GAGGTGGTGTTGCTTCCGTGGCGGTAGGGGAGAAGCTTGACCGGCGGCTT
-TGGATTCTGGAAATTCGAATTTTAAACTTTTATTATATTTTTATTTAAAT
-TAGAAATTTTTATGCAATATTTTACCTTGTTCTTGTGAGTTTTTTTCGAC
-AAAAGCGAGAAATCCGGGTCGAAATCGAACGACGCGCCGAGCATGTTGTA
-CGAATCCGTGCTTTTACGATTCGGAGTCATTTAGACAGAAAAATGAATGA
-ATATAGGTTAGTAGACGCTGAAAAATTGGGAATTTTGGATTTTTTAACGG
-AAAAACGAGTGAAAATGAGAGAAAAACATGTAAATTTCAACGAAAATCGC
-GAAATTACCGCGCATCGAAATTCAAAATTGAATTTTTCGCGGTGGCCCGG
-GTTACGGTGATTTTTAAAGGCGCATGGTTGTTTTGAGTGAGGTATTGACG
-CGAAATTTAAAATTATTGAATATTTTTTTCTTATTTTTACATTTTTGAAG
-AAAAAAATGATTAAAATTCGATTTTTTAGGGAAAATTAAACATTTTCACA
-AAAATTGCAGGAAATCACTCGCCAAAATTCAAAAATGAAGAGTTTCGTGG
-TGCGCCGGGTTACGGTGGATTTTAAAGGCGCATGGCTGTTTTGTATTAGG
-TCTCACCACGAAACTTGGAGTTTTTGATAGTTTACTTCCTATTAGGGATT
-TATTTTTTTAATTTTCGCTCGATTTTCACACATTTTCACTCATATTCACT
-CAATTTTTTGCAGAAAAAATGTCAATGGACATTGTTATGAAGTCAGATGA
-GCAGCCGTTCATCTCTGCGCCTGTATGCTTTAAGTAAGCTCCAATTTTTG
-TTATTCTGGCCTAAAATTATTTTTTTGATTTCCAGAACGTTCGCATTTTT
-CGCCAAAGCATCCGCAGAGGAATGCAAACTTCTAGCTTCGGGCTCCAACG
-CTCGAGAAAGTTTCCAGCAGGCCACGGGGCTATCGGAGAAGATCACGGAA
-GACATTTACCGCCAAATTGAGTAGGTTTTTCGATTTTTTTACCCTTAAAA
-ACTACTATTTTTCTATTTTCCAGCGTCTCCCACATTTCATCGATGGTCTT
-CAACAGAGAAATGGACGGTGGCATCGAGAGAAATCGGCTCGGCTCGCAAG
-CGATTCTGCTCGACGAGAACTCCAGGCGCCGCAATCCACAGTTCAAATCG
-ATCGCGCTCCGCTCTCTCCGCTACGATCACATCGATCATAGAGCGTTGGC
-AAGGAAATCGCCTCATCTGATGCCTCCGACTTATATCAAAGAGGAAATTA
-TGGATGATGAGCTCGACGAGGTGAAGGAAGAAGTGGTTTCCGTTGGAGAA
-GCCGCCTTGCCCACGCCAAAAGTTGAACTGAACATGGACCATCCGGAAAA
-GGACCTGATCATCAGCATTTCCGTGTATCTCGGCTACACCCGTACCCTTC
-AATACCACGAGATTCGTCTCGGACGTTTGATGAAGGTCACGGATCGGCTC
-GAGCTCACCGGAGATCACACGCTTCGCGATCTGAAAAACGCGTTCTCGTG
-CCCCATCGATTTCTCGTTTTCCGACGATTTTAGCGAGAAAAAGCCGTCGT
-TCAAGGATATGGCGAAAAATAAGTGGCCGTCGTCGATGTTCTTCATTCAT
-GACACGTTTTATATCGACTCGAACACTGGCGACAAGTTTGTGGATCCGTC
-GATGTGAGCAAGGGTGCCGGCTAAAAGTTTTTCAGTGTTTTTTGAGCGAA
-AAGGAACAATTTTTTTCTGAAAATTATTGATTTTTCGTTAGTCTTCAGAA
-AAAATGATTTTTTACGCCGCAAAATCGGGAAAAAACAAAAGAAAACTGAA
-AATTAAGACATTTTCGTTGATAAAAACGAATTTTTTGGTTTTTTTTTTCA
-GAAATATATTATTTTTTGCTTTATTTCAACAAAAAAAACCCAAATTTTCA
-GCACAATCCGAAGTTGGGCCAAAAAGTTCGACTACATCGGTCCGATGCAC
-GTGAAACAGATGTCGGAGACGAGGATCGGGGATCTCATTTGTCGGCTCGG
-TCAGCCATACGTCTACATTCATCAAGGCGTCTGCGAGCACCTCATCGTCT
-TCAATGACTTGTGCCTGAGGTACGGAAATTCTGGAAAAATCGAAAATTTT
-GATTTAAAAAAACTCAAATATTTATGTGTTCTTTTTTTTACTAAAAATTT
-TTTTCAAATTGTTTATGAAAAAAACACTAAAAAATAAGTTTTTATCAATT
-ATTTAAACAAAATTTATATTTTCCGATTATCAAAATTGTTTTTTTTTTTC
-AAATAAAATACCCCGAAAAATATATATTTTTTAATTTTTTTTTTCTATTT
-TTTGCAGAGATGAATCCCACACAAACGTCGAATTTCCACGCCGCCTCGTC
-GAACGGAATTTCAGAAGAATTGCATGTGACACGTGCAAGGAGGCGTCGGC
-GCAGTGAGTAGTAGCATTTAGAAATTCGGAATTTTTTGTGAAACCCCCGA
-AAAATATAGTTTTTATCGGAGTTCGAATTTTCGAAAAAAAAATCCAAAGA
-GAATCGATTAAGGCAAAAATCATCAATTGAATCCAATTTTTTCAGCTGGA
-TGATCGTCGACCACGACAATCTGCTTCCCAACTCGCCAGGCTATCTGTGC
-TCTTCGTGCTACAAGGAGTTCTGTTTCGACGTGAACGGCAAAAAAGTGTG
-CCAGTTTAAGGCCGTACCGTATTGCGATCGAAAGGACATTGGCGACGGAC
-GCCAGTTCTTCACCGAGCTCGATCTTTAGAGAACGAGATTTAAAAGTCTG
-TATCATTTTTTGTTGTTTTTTTTTAAATGTTTTTCGATTTGATTGTTTAA
-TTACCGATTTTTGGCCTGTAACTATATTTGTTGAAATTTCAAATTTCTTT
-TTTTTTAAATAAAATTTTTGTTTGCAAAAAAATTTATCCAATAAATAAAC
-GGAATATATCGATGATATGGCAAGTAGGGGGAAACGGACGGGAAAATGAT
-TATTTACAGAAAGGGCGCGCACCAGAGGTTTCTCGGGGGAGCCCCGAGGC
-GGGTGGCGGAGCTTGGCTCAAAATCTGTCGGAAAAATGGGTTAAATGAGA
-GAAGAGGTAACCTAGAAAATGAGATGAGAAATTCGGAAGAATTTTGAACA
-ATTTGAAAAATCGATAATGTTGAATTTTAAAATTAAATTTTATTGATTTT
-TTGAAAATCGATTATATTGTTGATTATTGATTAAAAATCACTAGAATCAA
-TAAATCTGATTTGGAAAAATCAAAAAAATCGATTTTTTATAATCATAAAA
-ATCAATTTTTAAAATCCAAAAAAATCGATATTTAAGAAATTGAAAAAAAA
-TCGATAAATCAATACATAGGTGAGCTCGTCTCGTCGATTTGTGTTTTTGT
-GATTGGTCCCGGCTGCTTTTGAGATGGTCTAGGCGTTGTTCCGTATGACA
-TTCTGGAAATTTTTTTGTGAGGCAATGACACGCCCACAAAATGGACGGTG
-GCAGAAATTTAATAATTTTAAATAATTTTCTGGATAAAAAAATCGATTTT
-TCCACTTTTTCGAGTGAATCGAAAATTTAAAAAAAACATTCAAAATTGTT
-CAGGGTCTCGCCACGAAAAACTCACAAATGCACGTTATGCGGAGCGTCGT
-CGGATTCCGGTGTGTTGCTACGGATCGTGTCGTCCATGCTCAGCTTCATC
-GTCGATTGACGTCGCCGTTTTGTGGTGATCTGAGCGAGATTTATTGATTT
-TTAAAGACGCATGGCCTAGAAAACACAACACTTCGGCCACGGACTTTGGC
-GGCCGAGTTTTCTAGGCCATGCTGCGGCATTTAAAGGCACATACCATGAT
-AATGAAGATCGCCAATCCGAAAATGATGACCAATGCGAAAGTGATGATTA
-CAATCATCAGCGATGATAAGGAATATGATGAAGTTTGCGTGGAAATAGAA
-TCGATGTACGCTTGTGACGTCATTCCTGGAAATTATTGATTTTTTTGGAA
-AAAATCAATAATTACTTACCGTCAACAGTAACACTCAACGAATCAATCTT
-GTAATCCGAAATCATAGAGTTATTGCGTGAAAATGCGGCTTCGAACCTGA
-AATGTTAAAAAAATCAATTATCGATTTTTTTGAAAGTTTTTGAAAGTTTT
-TGAAAAATTGATACAATTAACTTGATATTCCCCCGGAAAACCTATAAATC
-AATGAAAAAGTTAATATCTAAATTTTTTCCAAAAATTGAACTAAAGTCGA
-TTATCGATTATCGATTTTACTAATCATTTTTCAAAAATCTATCATATAGA
-CGATTCCTACGGAAACCCCGAACAAATCAAAAATCGATAAAATTGACTAT
-CGATATTTTTTTCTAAATTTTACTTTTTTCGATAAAAGTCGATAGCGTTG
-ATAATCGATTTTTTAGAGTTTTCCTCAAAAAATGGTAATAAAATATTTCT
-AATCGGTAAGAACTCACAAATTAACAGCCATTTGAGCATCACCAAGTGAT
-TTTTTGGTGAGCACGTCGGCTCCGACAACCACTGATCCTTTGGTCAGTGA
-CTTGATTTCAACATTCACAAAATTGTCGTCTCCCGAAATGGAATTGATGA
-ATTCTCCGATCTGGAAAAAAATCAATAATTGTTTAAAATTGATTTTTTTC
-AGATCATTTTTAAAATAACTAGTCTAAATCTATATTGAAGTCTAACTCAA
-AATTTTCCACAAAGGCTTACTATTAGGCTTAGGCTTAGGCTTAGGCTTAA
-GCTCAGGCTTAGGCTTAGGCCACGCGAGATGAAAACAAAAGAGAAAATTT
-AGTGAAAACAAGAAAAATTTCTTTTAAAAAAAAGAAAAAAAAAAAAAAAA
-AAGAGCAACAGCCATGCAATTCTTAAATATAACAGGTTCAACTACTATCT
-TCAAAAATCAGTTTAATATCGATTTTTCCCAAATGTCAATAATCCATTAT
-CCATTTTTGACTCACCGCTGGCACCAAATCTTTCGCTAATCTCTTCGCAG
-GGCCACTCTGAATATCGTTGAATTCCTCTACAAATTCCAGTGAAATAATA
-CGAAAAACTATTGGTGTTCGAATGGATTTAGCCGGAAGGAATACTTTCGA
-TGAGTTTTGAAGTGCCACCGGCACAGTTGAAATATCTTCAAAAGTCGTGG
-ATTCCTCTGATGAGGTGGAGGTGGTCTCTTCGGAGGAGGTAGTGACGTCA
-GTGGAGAGGGTTGATGGCTCGGTTTCGGCCATGGTTGTGTCCATTGTGGT
-TTCCATAGTTTTTGTAGTTTCCATTGTTGAAGAGGATTTCATTCTGAAAA
-TTTTGAAGTTTTGAATTTTTTCCTGCAATATATGAACACTTCCGAACCAG
-CAAAACTCACTAGGTAGTGTTTTAACTATACGGTGCGATCGAGTAAAAGT
-GTCATGCGATAGCTGGCATCTTAGGCTTTCAGAATCTGTAATTTGTTCCG
-GCGGAAGACCTCTGTGAGTCTGGAAATTTTCATCTGAAAATTTAGTACTG
-AAATCTGCATTTCCTATGGTTAACAGTGGATTTTTGTCTCTGGCGCCAAC
-AGAAGTCTCACCACAATGGTGGAAGGGCGAAAACATCGCTTCGAAGCTGT
-TAACCATAGGAAATGCACTGATTTCAGTACTAAATTTTCAGATGAAAATT
-TCCAGACTCACAGAGGTCTTCCGCCGGAACAAATTACAGATTCTGAAAGC
-CTAAGATGCCAGCTATCGCATGACACGTTTACTTTTACTCGATCGCACCG
-TATAGTTAAAACACTCCCTAGTCAGATATGTGCTCTACACTTTTAAATTT
-TGCAATCAAAATACTTGAATATAAAATTAAGAGATTTTTGAATTTACTAG
-GCCACCTCGAAAATTTCTAGGCCACGGCAGGTTGGTAGGGTGAAGCTGCA
-GACCCCATAAAGCTGTGAGAACGGTTTTTTTGCAAATTTTTTAAAACAAA
-CATTTGTGAAGAATCTGAATATTATCAGAACAAAAAATAATTTCGACAAA
-AAATAATAAATTTTTTTATCAATATTCAAAATTTTTAACTTCCGAAAAAA
-CTCAAAAAAAAACTCACCCAGTCGTAGTGCTCTCGACCATCTGCTTCGTA
-GTTTTCGGGATATTCGACAAAATCTTTGGCTCTTCCTCAGACATTTTCAG
-AATTGGGAATGCGGGGCTCTGATCTGTGCTCAATGAGCTATCAATAACAC
-TTCCATCCTGCTCAAAAAGTCCTTCCAGTGCACTTTGATCAAATGGTGTT
-TCTCCGTCATCTCCAGCTTCTGATGGGTCACTTACTGCGACGGTGGATTG
-GGTTGTGGTCACTGTAAAATTGGAAATTTGGAAGAGAAAAACCTCGGCCA
-TTGGTGACGTCATACTTTTCGCCACTTCTTCGACCAGCTATAATGCCACG
-CTTTTAGCAAGTTTTATTTTTGGTAAACCAAAGAGCAACCAATTTTAAAA
-CTGTGTCTCCAGGTTTACCGCCAACTTAAGGGCGTGTCCGTACAGGGTTT
-GCCCGTTTTATGGGCGTCGCTTAATAAATCATTTTTCAAGTTTTCAGTTT
-CGTGGAAAATTAGCATCCGGGAAATTGAGTCATAAGTATGACGTCAGCAG
-CCGCGCGGCTTCCCATGACGTCACTCCATGCGCTCCCCCGACGTCCCTCT
-AAGACGTCACCACCTCTCACCTGGTTTAGTGGGTCGTGTCATCTCCTTCT
-CTTTCAAAACTCGTCTATCAGCGACCTCGTCAACCTCAATCGGAAGGGAG
-CTGAACGTAATCACCTCCAAGGGAGTGGTTGGCATCATTTCAGTCGTATT
-TTCAGCGGCGAGAGTTGTTTTCTCAGTGGATTCATCCTGATCCTCCATAC
-TATCATCTTCGATTGTTGCCTGGGAGAAGTTGAACATACCGCCGTCAAGC
-GGAGTTATTGGGGAGAAGACGGACGTTTTCTGGATTGGGTTCACTTCTAG
-GGAGGTGTCGTTCGGCGAGAGTTCGATCATTTCTGTACTTGTCTCGAAGG
-TATCTGATCTGAAAGTTATGACATTTTTTTGGTGGTGGCCTGGGAGAAAA
-CTAGGCCTCCTGGCCTAGAAATCTCAAACCTCGGCCTCCAGCTCTCACTA
-GCTGACCTAGGTTTACTAAACATCGGCAAGACCTCTTTTCGACTACTCCC
-TTACAAATTTTTAACAGTTTTTCATCACACAATTTTCCGATTCTTACCCC
-TCATTCATCATTTCTTCTTTCGGAACAGCCATCATCGGCATATCATCATT
-ATCAGGCATTACGGGTGTCGTTGTGTCTTTTGCCAGCGGTTTGTCGAACA
-CATCTTCAGAATTTTCGTCTTGCGCGAAGGAAACTGAAAAAGTTAAATTA
-CATTTTTTCTAGGCCACCAGGTTTTGCATTTTGGCCTAGAAAATGAAATG
-AGAAGCTAGACCATGTGGGTTTATTGCGAGGAAAAGCTATCCCACGAAAA
-CTTTTATAAGCGTCTAGAAAAGTAGAAACCTCGGCCACCAAGTTTTGCAC
-TGTGACCTAAACAATTTTGGTAAAATAGGCCAGCAAAATTTCCATGATGG
-CCTCAGGAAAACTAGGCCATTAAGGTTTCTTCCGTTACCTAGAAATTTTG
-TAAACCTAGGTCACCAGGGTTTCTAGGCCACACAAGAAAAGCTAAAAACC
-AACATTTCAGATCGGTCTGGAAAAGTGCAAAATTAAGCCACCAGGATTTG
-CATGGTGGTAAAAAATTGGTAAACGTGAACTAGAAGTTTATCGGTCATCA
-ACTTACGTGTCGTTGAAAATGCAATGAATAGAATAAAACCAAATGGTATG
-CGCATCGCTGAAAAATTGCAAAAATTAATTTATGTTTTGGAAAATCAGAA
-ATCGGAGTGTTCATTTTTTATGGGACAAGATAAAAAGAGATGGAGAAAAT
-TTATATGATATATCAGGTCAAAATGACCTTCGGAAATTGGGAATGAAAAA
-TCAAAATTAATTCGCGTGGAACTGGTTAAGATGATCGAAGATTGAAAAAT
-TTGACAGAAATTGCAACAATACTAATGCAAAAAGTTGGTAAAATATTTTT
-TTCAGTTTTCAGAAAAATCGATAGCAAAAGTCTTTTTTTTTAAATAAAAA
-TTTCTGAAATATTTTCGCTGCGAGACCTAAGGTGACAAATTGGATTAAAA
-ATTTTATGTGCCCATTAAGAGTTTTTCTGGAAACTGAAGAGAAAGTCGAA
-AAATTAATATACCCTACTTAAATTTAAAGGCGCACGGATGAATTTCCAGA
-AAACTAAAAAAAAACATCACAAAATTTGATACTCCAAGTTTAAAGATGCA
-TGGGTAATCTTTGAATGAGAATTTTGTTTTAAATTTTTGAACTGCCATTT
-CAGATATTATGAGAACACAAAATTCTAATAATGCGTATTGCGCAACATAT
-TTTGCGCTCAAAATATCTCGTAGCGAAAACTACAGTAATTCTTTAAATAA
-CTACTGTAACGCTTGTGTCGATTTACGCGCATCAAAATGAATTAAGATCA
-TACATTTACCGACAAAATATTAAAATTAGGCAAAAAATAATACGAATAAT
-GCATTTCGTAAATCGAGCACGTAAATCGACACAAGCGCTACAGTAGTCAT
-CAAGAAAAATTACTGTACTTCTCGTTACGAGATATTTTGCGCATAAAATA
-TGCTGCGCATTACGCATTCTCAGAATTTTGTGCGCCCGTAATAACCATTT
-GTTAAATGCTTAAAAAATTCAGATTTTATTGAAAAAAATTTTTGAGCAAA
-ATTTTTCGAAAAATAAATTTCGGCAATAAAATATTATTTTTCCATCGAAA
-AAGTATCGTATGGTGTGCTTGACATAATCTTGGTAAAAAGTGGCATATTT
-TGAAAACAAAAGGGGTTACCCCCTTCCTTCAGCCCGCCCGCCCGGGAAGC
-CTGGGCATGCGCGCAAGTGATTGTTTTGTCTGTTGTTGCTTATGTATATG
-CTTATTATTTACACATTTGTGTGTGTGTGAGTGACTACACTGCACACCTC
-TTGAAACGGATTATCCGGCCGTGGTCGAGGAGGGCCGCCGAATTATGCAC
-ATTCCTATGCTATGTATTGTGAATACTTCATTTCAATAACTTTATATATA
-TACAGTTAGCACATACGATTTTTGAAAATTGGGGTTGTGGAAGAGTTTTC
-ACACAAGTGGCCTAAAGTTTTTGAGTTTACTTTAATACTTCTAAATCACG
-TGGTGTCAGGCGGTCTCAATACAATTTGATCTACAAAAAATGCCGGCATT
-TTTTCCCAGAAAAATTGTGACGTCCGCACGCTCTCAACCATAAAAAATCA
-GATGAGATCTGCGTCTCAACTCCCGCATTTTTTGAAGATCAAAGCGAAAT
-GGGACTTTCTGACTCCACGTGCTAAATGAAATGTACGTTAAAAAATTATC
-TCTGGAAATTTGGAATTGCTCGGTGGAGCGCGTTTGCCGCTTAGTAGCTG
-AACCGTGATAGCTGCGCCGTGAAGAGAAGGGAAAAGTAAGGAAGTTATCA
-AAACCAACGACGCACTAATGAAAAGGAACACAAGAAAAAGTGAAAGTGTT
-TTTTTTTGGGTTTTTGTGATTTAGTTCGTGTGTGATAAAAGTTCAAATGG
-TTCGGCAGGACAATAGGAAGGAAACTGGAATTTTATATTTCATCTCTTGT
-TAAATTTACTTTTGTAGGTGTATGATTAGGTAGTGTTAATAGAAATCGGG
-ACTCGTGGCCTATCATTTTTTTGTGGCCGAGTAAAAAAATCTTCCACATT
-CGTCAACCATACGTGTGAATTTAAAGGTAATCTATAGGATATGATATTGG
-TAAACTTTCACAGAAATCCTAAAGCTAGGTTTTGAACTATGGAGCTTTGA
-AGTTTCTAGGCCCCTTTGGGAAACATAGGCCACCAACCTGAGAAAGGTAA
-GGGGAGGGCAGGGTACATAAAATACAACTTTTTCTCTGAAGTTTTTTTTA
-ATTAAGCGAAAAAGCCGACATAAATGTTTCAGTCATGGCCTAACTTGACA
-TTGGTGGCCGATTTTTTCGAAAAACTCTTCCACGATTTAGAACATGAACT
-TGGCAAAACTTCAAACAAATCCTAGAGATAGTTTTTGAATTATGAAGCTT
-TGAAACTTCTAGACACGTTGAAAAAGTTAGACCTCTTCCACTGTCATAAA
-CTTATAAATTCACAATTCAAAAATTATAGATTTCTTTCATATGTAGAATT
-AGCCCAATTTTTAAATCCATTGCACGGCTAGATTTGAAATCATAGCAATT
-TGAAAATTCTAGGCCACGCAAAAGAAAATTCTAGTTCATGGGAGTTGAAA
-GAGAGTCTCGGAAGCTAATTTTAAAAGCACAAGATAGAGGAAAACCAAAA
-ATTTATAAATTCATAAAAATCCAGTTTTTTAGCAGCTATGTGAAAAGGAT
-TAGAATTTCAACACGGCCACCACCGCCGGAGATACAATCATTTTGGGAAT
-ATATGTCGTTTTCGCGTATTTCTCACCAAAAAAAGATTCAAATCTTTTAA
-TACGAAAAAAAGTTGGAAAAGAATTAGAAAAATGCTGAGAAATTTTTTTT
-ATGAAAGCTTAGGCTTACAATTAGGCTTAGGCTTAGGCTTAGTTATTTTT
-TCAGTGTTTTCCAAGTGCAGAAAGGAAGAAACCGACGCTTCCTGACTTTC
-TATCACACACTGAGGGGAATTTCACCCAACCCCCCCCCCCCCCTCACTTC
-CCGCTACTACTTTTACTGTACACTTTCACCGAAAAGTTATTGTGTCATCA
-CGTCATTCGCCAAAAACGAATCGAACAAGGAGAAAAAATTGATGAGAAAA
-CGCAAGTGTTTCTTCCTACACTACATAGTGTTCAACACCCCTTCATGATA
-TGGCCGCGTGAAAACTCTTCCACGACCATAAAAGAAATTTACGGAACAAT
-CTAGCAAATTTTCATAAAAATCGGTTGGAAACTATAAAAGTTACAGGGGT
-TTGAATTTTCTAGGTCATGCGGAAAAAAACTCGGCCACGCAGGTTTTTAG
-GGTTAGGGAGGCGGTGTCTTCAAAAAAAAAGAAACCTCGCACCTAATGAT
-CCATGAATCTTCAAACAGAAAATGAGGTATAATCTTAGGTGGCCGAACTT
-TTGTTTCTGAAGAAAACTCGGCCAAGACCACGAAAAACGTATTTTTTTGT
-ATCGTTAATTGAAAAACTGAAAACAAGAAGTTTCTAGGCCATGTTGATAA
-ACCTTCAGTAAAAATTTTTCCTAAGCCATTAAATTACTACTGAACTGAAA
-ACCTAGGCCACGGCTTCAAAACATAGGCCACCAAAAACTGAAAGGGGGTC
-GTAGGACCGGAACCTGCTATTATGAAGCAAAGTTTTGTGCAATAAAAGTT
-TCAGAATTTCCAAGTTTTTAAACTATTTTTTGTCTGGAAATTATAAACCT
-GAAATTTCGGGTGCGAGACAAGATGGTCAAAGAAAAATAACGAGAATTCG
-GAGGGCAAAAAAATGAGAAGAATTTCCAGGAAAACAAGTGAAAGTGAGTA
-TGACTTTGACCTATACGCGTATTGTCTTTTTTGTTTTCTTCTTCTCGAGA
-AAAGAGAAACTGTCACAGCAGTAGTAGTTCTTCGATCACCTAATTACCTT
-ATTGCCCCCTTCCAGGAAGTCACAGTTTTTTTTAGGAAATGTGTGAAAAA
-TACACATTCCGCTAGGAAAAATTGAAATTGCGGTTATTGAGTTCCCTTGC
-CACGACAACGTGGCCTAGGATACCGCCATGCTCTAGAAATCCCGCTTGTA
-GCCTAGAATTTCCCATTGTGGCCTGGAGAAGTTTAGCGGGGCCTAAGACT
-TTTAATTGTGATCTGAGAGTTTTTTCACATGGCCTAAAATGCTATACGTG
-GTCTAAAATTCCTCATTGTTGAAATTTTTAGCGCGGCTTAGGATTTTCTA
-TTATGGCACTGGATTCTCGCCGTGACCTAGAATTTCGTAATGTGGCCTGA
-AAAGTTTAAGCGTGAAAAGTTTAAGTATTTTCAATCATAGCCTGGAGATT
-TTTTACAAGAATTCCTCATTGTGGCCTTGAATTTTCTATTATGGCCTAGA
-ATTTCGCATCGTGGCCTAGAAGAAATTTGCAGAGTGGTTTTGAAATTCGG
-TTTGTGACCTAGGGTGCTATATTGTGGCCTAAATTCTTCCATCATAACGT
-ATGATTTCACATTTTGACCTGAAAATTCTTTGCGTGGTCTAAGATTTCTC
-ATTATATTCTCGAATTTAACTTCGACACGTGAGAACAATTTTGATGGCCT
-AGAAATTGCTCCCGTGACCTAGGAAGTTTCAAATTTTTAAAGTTCAAATA
-AATTTCACCAGAAATTCATCAAAATTTACAATTACGGAAAAAGAATCATA
-TTAACCACTGCAACTTTTTTCGAACGAAGGACGAGGCAAAAAGGTTTCTA
-GGCCATGGCCGAGTCCCCGACAAATTTCAGCGGCCATTTATTTTGCTTTG
-TTTTTTGCGTGTTTTCTTTCGTTTTTCACCGATTTTTTCCGTTTTTTCTT
-ATCAAAACTAATAAATAAATATTTTTTGCAGATGCTAAAACAATTTCCAA
-GTGAAAAAATTGTGAATTCAGTCGGCAAGTAGCGGTAAAAGTGGTCAATG
-TAATATGATGGATTACGGGAATAAAAAACCCAAACTTTTTCCCAAACATG
-ATACATATGCTGTTTAGAAACACGGGAAAAATCGGTGAAAAACACAAGAA
-AACAAAGCAAGTACAAAATGTCGTAAAATGCGGTGTATTGTGTGCAAACA
-CCGATTTTTCGCATTTTTTCTCGGCCCTCGTTCGAAAAAAGTTGCAGTGT
-TAACGGCGGTGGAAGAGCTTTACCTTTACAAAAGGTGGCCACAAAAAAAA
-TAGAAGAAAGGATCCAAAAAGAGCAGGGAAGAGTTTTCTCAATTTGACGG
-CCACGTGTTCTATAGAAAAAGATAAATACAATAAATACGTTTTTTGAACA
-ATTAAAAAAACAAAAAATTTCAAGAAAAATTTAGAATATTTTTTCAGTTT
-TTTTCCTGAAATTCAAATAGAATAAATGGAAGTTCAACAAAAAAAGGTGA
-CCTAAATACTTATTAATTCACCTTCTTGACCTCTCGATTCTTCAGAAAAA
-AGAATAGGCTTCTCCTCCTCCCACCTCCCAGACACTTATCTACACTTTAC
-ATCATTCCTCCCGGCCCCCGGTTTTTTCACATTTTTCAACCTTGAAAATG
-ACGAAATAAACAAGTGTTTTAGATAAATGTTTCTGTGTATGTTATCTGAA
-ATCTTGGAAGGGTGTTGCAACAGAGCCCCGCGTGTAGCGTGGCCTAGAAA
-TCCAAAAAGTCTTCTTTTAGATCTTCAGCTTTCTCAGCAAGTTAGGTCTT
-AAGTCAAAAGGACTCTCCATGACCAAGTTATAACGATTTGTAGTTTCTAG
-GCCATGGAGTACTCTCCGAAGGGGAGACATTGACCCCCTGACGCCGGATT
-TGTAGGAATTTTCACGTGTTTATGCTACTGTAAGCGAGCTATATACGTTC
-TTCAAAAATATCCGTCAAATTGTGACCACCGTTTCAGCACTTTAAAATTT
-CTAGGCCACGCTGTCGCCATAATGGAATATTTTTCTCACGAGGAATAGAA
-ATTAAAAAAAAAACTCTTCAACTGGTCGATATTTGGAAAACCAAACTAAA
-ATGTTTCAGAATTATTAAAAGCTTAATTAAAACAAACAGCCACAAAAGTT
-ACCTAAACTGATGAAATAAAGACATAGGCATACAGATTTATAAATCCTAT
-AAGCATGGGTGTGTCACAGGTAAAGATTATGGAAAGTGAGGGAAAGTAGG
-AAGATATTACTGGAAAGTTCTGGGGGAGAACGGCTGAAATCAAAATGGAT
-TCGGTTGAACGCGTCGAATCACGGAGACTCGTTTGTAGGGCTTCCAGGTA
-GATAAAAAATGTTCTGCCTGAATTGGGCCAAAACACATGAATCTTCAAAA
-ACAAATTGACACAAGAAAATACATACTACTCCAAATTTTCAAAAATCAAA
-AAATAGGCGATAGGTTTTTAGATACTAAAGTATATTGAGCAATTAAACAA
-TTCACCCCCTACAACTGGCGGGCCCGCAGGGCCTGCTAGTCAGGCAAAAA
-ATATATGGCCCACACTCCCAGCGACAAGAAAAATTAGGGGATATTAGAGA
-CATTTACTCAAAAGGAGCATTACACAAATTTTAAAAATCTCAAAGCGGGA
-AATTTTTTTAATGCGTACTGAATAAGAAATCGACGTTTAATGAAACTCAA
-TTGCTACAACCCCGTAAACCTCCTTCACGTCCAATCAATAGTGACATGAA
-TCCTTCCGACCAACGTCATAAAGATTGGAGATGACGAAATTTAAGATGTA
-CCAAGTATGCTGGTACATACAATTTCTACGTCACAACATCTTGACAGTTT
-TTTCCCTCAAAGAGAGGTGAGCCTGTAGAAGAGATACAAACGCTGCGTCC
-TATCGTGGGTTCAGTTGTGGGGAAAAATTGTAAAAACTGTATGTACCAAC
-TATGCTGATGTGCCAACTACCAACCAGCATAGTTGGTGCATCTTCAATTT
-TGCCATCTCCAATCTTTATGACGTTGGTCGGAAGGACTTTTGTCACTATT
-GATTGGAGGCTTACGGGGTTGAAACAATCGTTCATTAAAAGTCGTATTCT
-TATTCAGTACGCATTTCAAAATGTTTCCCACTTTTTTTCGGCTTGATCTA
-CGTAGATCTTTAAAAAATGCGGGAGAAGATATGCAGTGTTCTCAACTAAT
-TTCGCATAGTTAAGAACGTGCTGACGTCACTTTTTTTTTGAGCAAAACAT
-TCCGGCATTTTTTGTAGATCAATCCGTAATTGGACAGCCTGGCACCACGT
-GTAAGAACACGATGCCTCTATTTTTGCCCGGGAGTGTGGGCCTTGAAAAG
-TTGTGAGCTGTAGAAAAATGGACAACAAGCATGTTGTCAGTTAGCAGCAT
-TTTATAAGTCAAGGACAAGTACAACCGAGATAAGTGAAAAGTTTGAAAAA
-TGGAAAACTTTCAAAAAACAGCGAAGGTTCTTTGATCGATGCAAGGGCAG
-AAAGTGAATAATGCATGTTTTTGAACTTAAAACAAATTGGCTAGACTTTG
-ACTGAAACTACCTTTTATAAAAATGAAGAAAATGAACCATTACGAAAATG
-TTAAATACACCTGAAAATTGGTGTGTTTTTATTGTCGTTCTGTAATTAAA
-TTTTGAATGATCGCTCTTCTGCAAAGAACAACCACAAAAAATAATTCGAT
-ATACTCAAGTATCGACACTTATGATTTGAATGCAAACATATAACAAATTA
-AAATTAAAATACGGTCATTATATTTTAGGAAAATTATGGAAATTTTTTAG
-GCTTATGATGTTTCAAAAACTTTCAGAACTCTAGTAAAAAACATTTTATA
-TGTAATAAAACACTCAGCGACTTTAAACTTTGCAAGACAATTTGGGACAT
-AATTTTGGGACATTGTAAGAACAGTTAATTGGAAAATAAAATAGTTATTC
-GAATGATCGTTCTTCAAACAACCTTACAAACAACAACACACCTACTCTGC
-TATAATAAGAAAATTTAAAATACTACTCAAGTTGTCACTTCAAGACCGCA
-TAAGTTTATACCACTCGAACAAAAAACAGTCTTCGTTCTTTCTTTCTTGA
-AAAGAGACATAATTGAAAATGAACTAATCAGCCGCTGCCCGGGATGGAAA
-AAAGAAAAGAAATTCCTATCATCTTTTGACCTTGTTATTTTTGCAAATCA
-TGTCTGAATAATACACTTTTTGATACATATAAATCAGGCGTGGGCGACAA
-ACAATTTTTCCGGCAAATCGGCAAATTGCTGGAATTGAAATTTCCGGCAA
-ATCGGCAAATCAAAAATGTTTGAAAATAGGAGAGTAAAAAGGTGGAAGTC
-AAGTGATGGTAAGTACCTATTTTGTTTCAATCAAATTAAATTTTACACCA
-TCTCTCTTTTTTTTCCTTATTTAACAGTCTTTGGTCTGTGTTCTGATGTT
-GAAAGATAAGGGAACATGGACGAGTTGTTTTTGGGAAAAAACATTCTTTT
-TGGATTATTTTAGTAAAAGAAAAATTTAAATTTATAAGCATATTCACTAA
-ATATTTTTGTGGGAATTTGAAAAAAAAAGAAATTAAAGAAGAAACTGATA
-AAAACTAGAAAATGTATAACTGGGAGAAAAAAGTTTCCAATTTTCAGAAC
-TTTTGAAAAATTGTAGAAAATAGTTCATGCTTTCAAAGTTGTAGGAAAAA
-ATAATATGTGGCCAATTTCCGAAAGAAAAAACTCTGCCACGACCAAAACT
-CAGAACTAGACTGAAATTTCAGTTGTAGCTGACAAAACCATCCAAAAGAT
-ATTGTAGGTTACAATATCTAGGCCGTGAAAATTAGAAAACTCGAATCAGA
-TATCCTTGGCCGGAATGCGAAAAAACAAAAATTAGAGTTTTCTAGGCCAC
-AAAAACTCGTCCACGTGTGCATGAACTGTCAAGTGGTCAACGTAAAAGGT
-GTGAAACCCTTCAGAGAAAAACACTAGAAATGAGATAAAGTAGGTGAGAC
-CTCCTGTCTCTGAGAAGCAACGTTCGAAATTCTTTTCCAATTCCATCTAT
-TATTATTATTATTATTATTATTAGGACGGTATGGCGCCAGGAACTGGTTG
-TTTATACTGACCACTGCCTCTTCCCGATTAGGATTCTGAATTTCGGATTT
-CGGGAAATTGAGAATGGCAGATGGATGTAATTTCATTAATCATGTTCCTC
-AATAAGTTAAGAAACAAAAGAAGGAAGATATAGTGAATCAGTGAGGAACA
-AGAACATAGCATATATGGAATTGGCGGTGTAAGACTGGTTTACATGGTTA
-CACGGAGGGAAAAAGATTTGAAAGTATTCGTCATCTTATCTAGGTAGTTG
-AGACACTTGATTAGTCATAGTTGAAAGAACAAATGGAAGAAGTTCATATG
-CTGAAAGCATCGCTAATAACATAATATTGGTTTTAAAGGTGGAGTACGGT
-CTGTGGGTTTTTAACCTAAATGACAGAATACAGTCCCAATATACCGAATA
-TAACTGTTAAAGATTTATAAAATTTATCTAAATTTTTTATGATTTTTAAA
-AAAGTTTTTTTTTTTTTAATTTAAAAATTTATTCAAAATTCCAAAAAAAT
-ATTTTATTCAAAACTAAAAACCCAAATTTTCTGAAACTTTACCATTTTAC
-TTATTTATGTCTTAACAATAATATACACATATTAACGAAATACCCACCGT
-TCAAAATTTGACTTAATCTCCAGTTTTAACTGCCAATGAGAATTTGTTCA
-AAATTCCAATCTCACACCCAATGTTTTTCTTTGTTTTTCATTTTAAAACA
-GTTCTATCCAGTTTAAAAATTTACCAAATAAAAATGTGTCTATTCCTCTC
-ACCTCCAATCCCGTGCATGTGTTCATGTTTACCTATTGAAACGTGTGTAT
-TACTATATAATACAGAACAAATATAAAATGGCCACTCTTGCACCTCCAGC
-GGAAAGAAAGCTTTTGAGGTGTTACGAACACTGCAACACTTTCCTATTTT
-ACTAGTTTTGAGCAATTTTCTGGTCCTTTTATTTATTTTTGTTTTGTCTG
-GAACAGGAAGTTGTTTGTGTTCTGTTTGGAAAATTAATCAGTTCTACCGT
-GAGATTTTTAAGTTATTTTTTGAATGGAATTTCAATTATTATTTCATTTC
-ATTTGTTTTTTTTTCTCACCGAAATCCACTTTTTTTAGAAACAATTTTTT
-TTTCTACATTTTTTTCCGATTTTTGTCATTCAATTTTTCAACTTCTCCAT
-TTTTTCTACAAAACACCGAAAACTACAAAATACCTAAAAATTGCAAATTA
-AAAAAATTTTTAAACATTTTTGCCCAAAAAATTGTTTTTTTTTTCAGAAC
-ATCTAAAACTCACTAAAAAATATGCTCAAAAATTTTTTTGAGAACACTTA
-ATTTTTCGAAAATCTTATTTTTGCAATATTAAATCCAGAGAAATTAGAAA
-AAAAAAACGGTTTTCTACAGTACTCCTACCCTCCCTCTCCAGTACTCTTA
-AAATATTCCTACAGTGTTCTTACAGTACTCTTACACCACTCCTACACTGT
-TCTTACAGTGATCCGATACTACTTTTATAAGACTCCCACAGACTCCTACT
-ATACCTATACCTTATCACTACAGTATCCCTGCCGTACCCCCCCCCCCCCC
-CCAGTACCTATACTTGCCACTACAGTATCCTACAGTATTTCTACAGTGCT
-CCTACACTACCTCTACAGTACTCCTACAGTACCATTACCAAAAATTTGAA
-TAGAAAAGTGAAATTATGAACATTTTTTCCTGTATACCAATTTTTAAAGT
-TTTAGTTTTGTAGTTGTTTTTGACAACGAAATCAATTTCAAAGTATTTTT
-CTTTAAACAATCGTACTTTTTGCGTACTGTTCTTGCACTTTTTGGGATCT
-TTTGGACTAAAAGTGCCCCCCGAAAAAAGCGCGGAATTAAAAGAACAAAA
-ACCGGATAGACTGAGGAGGTGTCGAACGATGGAATGAAAAAAGAAACAGA
-AATTAGATTTGGTTCAGTGAATTCTGTTTCTTTTATTTGGATTTTGGTTT
-TTTGGAGTCTTGGAAAAATGTTTTATTTTTGTTCTTTCCAAGAGTCCAAA
-CGTTTTTTTCCACCAAAACTCCAAAATTTTTAAAATTTGGAAATTTGATT
-CACTGCCAAAACTTCCAGAGAAATTAAATGTTCAGTTTCCCGTAAATAAC
-AGGGTTTCGTATCAAAAACTGTGAATTTTCCCGCCACCTATGTTTTTTAA
-AAATGATTATACTCTAATTTCCCGTCAACATTTTTTTATTTTGCGAAAAA
-TGATTATTTGAACATCCCAGAAAATTTTAAAAACGTCATGAGTTTTTTGA
-AAATTCAATTTTTCGTGTTCCTGTAATAAAAACCATAGAAACTGTTGACC
-TATAACCTGCCAGACGTTCTTCCTGTCTGTTTATACCCCCATCTGCTCTG
-CACACCAGACACCCCTCCTCCTAACTACACTTTAAACTGTTACCCCCCCC
-CCCCCCGTTTACCCCTCATTTGTTTTTTTTTCTAGTGCATCCCTTCCGTG
-TAACCTGACACTTTTTCCAAGAAGCTCGCATTTCTTAGGAGGAGCAGCAA
-TTTTTCGTTACTTAATTTTCCACACAGTAGGAAAGACAAAAAGAAAACGT
-CATAGAAATTAAAAATTCTGCGTTTAATTTTTTGTTCAGTTTCTGAAACT
-CAATTTTGTGGAACCGTTTTTTTCGATCTTTGTAAAATTGAATTTTTTTG
-ATTTTTGGAAAATTTGGATTTTTGCTGGAAAGTCAATTTTTGTGAGAAAA
-GGTTTGGCGGGAAATTTAAATTTATTGAGAAAAATTTTAGCGGGAAATTA
-AATTTTTTGATAGTGAGAAAAATTCAATTGAATACCTTTTTTGTGCGAAT
-TTTTCATAATATCTGAAACTCAAAAAATCTGAAAATTAACTCGAAAAAAT
-TTTCAAATTTGATATTTTGGCAATTCAAAAATTGCTTAAAGAAAATAACG
-GAACCTCGTTTTTTTTCTTTAAAAAAAGGTTTTAGTAACTTTTCCGGTAA
-CCAAGGTTACTCTTTCCCCATCAATCTCCCAAAAGCATGCCAGAAAAAAA
-AGAGAGAGAGAGAGAGATGCGTGTATGATTGTGTCATTTGACAGTGCGCA
-ACAGACACACATAAAACAGCTGACATCTTCTCTTTTTATTTCAACTGATT
-TTTAATTTCCCTCCTTGTGTTCTCTGAGTCTCTCTCATTTATTCAGTTTC
-TCGATTTTCTTCCAAATTCATTAATATTTTAATCTATGCGTAAAGTGGAG
-GAAGATTTCTTCTACGTTTTGATTTGCAATTTCTCGGGTTTTTCAAATTA
-TGGATTTTGAAAAAAAAAATTTCTGAAATTTATTTTTGATTCATGTCAGA
-AAATGAGTCTCCTGAATTTTTTTTGGAAAATATAAAACAAATTCTGAATT
-TTTTTTACTTTTTGATGTGTAAAACAAAAAAATTGATTAGAAAAATCTTT
-ATCTATTTTTTGAACTTTTCAATTTTAAAATCAAAATTAACTTCTAAGAA
-ATAAGATTTTTTTCGGAATTTTGAAAAAAAATGTTGTTTTTTTGAGATTT
-TAGTACATTCAATTTTCGTAAAATTCGAATTCATTTTTTTATTGTGCAAA
-TGTTTTCTGACTGACTATGAGAAAAATTTCAACATTTTGAAGAACCCCCC
-CCCCCCCCCCCCCCATTATTTGGACGGAGCCTGAATACGAAATGTGAGTT
-CTCAGAGAAGGAGGTGAACAATTTGATTGATGTGCATATGGAGATGCTCA
-TTGTGCATATCAGTTTGGAGCATCTATCTCAGAGTGAGCATGACATTTAC
-TTTTACCCATTTGCGTAGGCTCCGCCATTTCACGATTTTTTTTTTCCAAT
-TTTTGAACTAGTATAAAAATTTCTGAAATTTCTGTAATTTCTGCCATCTC
-CTCATAAATTCCATTGTATTCTTTGCACTATTGTTCCACAAAAGTGCAAA
-ATTTTCGAATTCGTAATGTGTCTTTCATATATATATCCATGCACTTTTGT
-CCCTTTTCCTGAATACTAATTTGGTGTGCTCCAAGAGGAAATTTTTTTGT
-TTTGTTGAAATTACTGCTCCTTTTCGGAATTTTTTAATTTCTGAGAAAAA
-TTCAATTCCTAAATGTATAATACTAAAGTCAAAATACTAAAGTGTAATGG
-TTTGTTTTTTGTTACAGTCTTTAGTTTGTAGCTTTTGTTTTGTGTAGTTT
-TCCAACTTTTTTTTTGCCAAAATGAAGGCTGAGAAACCGAAAAAAAAAAT
-TCAAAACATAGATTGGGCTGAAGCGGTATTATTGGTTTACTGTAGCATTA
-CTGGGTTACTCTAGTTTGGCCCATGTTTGGTGTACGTTAGTAGTAACAAC
-ATTTCGTTCATTTGTTTTTTGATTTGGTAACTTCTGGTGATTAAACTTTT
-AATGTACCTAAATCTTCTGTTGCATTATTGATTTGTTGTTTTCTTCTTTT
-TAAGTTAAACATGCTCAAATTAAATTCAAATTGAGTTGAAAATGCAAAAT
-TATTATCAACTTGAATACCCAAAATTTTGGACGGTATTTCAAAAAAATTG
-ATTTCCAGCCGCTTCGACCTTCGACACAACAAACGAATGCTAACTTTCCC
-AGGATTACACAAAATAGGTCAAAATCCCCTTTTCTCAATTTTTTGCACAT
-ACATCCTCATCATCATCATTGTAATGATCGTGACCATCCGGTCTTCTATT
-ATTAAATGAGAGAAGGAAAGAGTATACATATGTGTCTTTTATATTAAACT
-AATTATATTTCGACACATTCTGCGCATATCACTACTGCACTAGAATTACA
-TTTTAAGAATAAAATGTAACCAAAAGACCAAAAAGTTGTTTGCATTTATT
-GTTATAAACAGAATAGAATGAATGTTAGGAAACGTTATTAAAACTTGCAA
-AGTGACACAATTCGGTATATCGATTTCTCTGAAATTACTTAACTTAGTAG
-GCAGAGTTTTGATACTGATACGGATTTTACTAAATTTAATTTTTGTAAAT
-CAGTATTGCTTTTATAACCTATTAAGATTTTTTTGTTCCAGCGTGCAATT
-ATTTTTAATTCTATTTAGGATTTTAATAAATAGAAAAATACGTTTTGAAT
-TATTTTTTACGTTATAATATTCAATAGTAAAGAAGCACACATCAATTCCC
-CTATTCAGTTTCCATACTTTGCCTGATAAACATGAATAGTAAAATAGACA
-CTTTCATTTATACAGACACCCCCCCCCCCTTGCTTCCGGATTAAATCCCA
-ATAAAGGGTGTGGCAATAAGGCATTGTTGCAGTTTCATTGAATTTATTAA
-TCATTTGACAGCATGAAATTACAAAACTGGAGAATTTCTAGTTTAAACTT
-TTATACAATGAAGAAATCTTCCATAGAATCAATATTAAATTATCAATAAA
-TGAGTATTTACGTTTTTCAGCAACGGTATTATTTTTATACTTACTAGTTA
-TTAAGTTAGTAGTTAGTTACATTTTTAAATGCGATGCAGTCGAAATTTTT
-TTATAGACTAGAAATTGTCTTAGTTTCCAGCCACTGACAAGTCGGCCAAA
-TTTCAAACTTTCAGTAATTTTGCGTCATTTGTTGAGCCGCCATAACTCTT
-TTTTTGAGACGTTTTCAAGAAGTTGAAATTTGGTATTTTCAGACATTTGT
-ATCTTATTTAAAATATGAGTATTCACTCCTTTTACCTGCCAGTCGGCTGC
-CTCCTTATCTCCTATTTTTCTCTAATGAGCACACACCACTATCATCATTA
-TTATTACCACCTGTTCTTAATAATAAACATTTCCCGCACTTTATTTCCAT
-TTCGATGCATTTTATAGAAAATGTTCCCCCTTTTCGAGCTTTCCAATTAG
-ATTCACCCTTTGATTGCTCTTTCTTGGACGGAAGTGTTCCCCAATTCCCC
-TTCATCTTATTACATTTTTATGCAGATTTTATTGCATTTTAGTGCGCTAG
-ATTTTTCATGGGATTTTGCTAAATAATGCAATCACGCTCTAAATAAAATT
-CTCAGTTTATATTTTAATGTTAAAACTGTGTGTAAAATTTACAAACATAG
-TGAATACATTTTTCGAATAAAAGTATGAACATTTTTCGAGGGATCTATAG
-AAAATTGCCGGCTGTTCCTAAATGCCCTTTCACTGGTCACCAAGTTCCTG
-TTCATGCAATTCAAAAGAAATGTTCAGCCCCCCGCTCAATAGTCGCCCGC
-ACCACAAAATTGAAAAGCGAACATTTTACTAGTCGAACTTTTGAATTGAA
-CATTTTTGGAGTATTTTAAAGAAATGTTTTCAAGTCCACCAAAACATATG
-CCAGGCCACAAAAATTTCAATTTTCCGCCAATTTTTTTCTCACAAAAGTT
-GAATTTTCTCGAATTTCCGATAATTTTCGATTTATTTGAAAGTTATTGAA
-ATTTATATTTTCTAAAACACTTCCACAATAACAAATTAATAGATATAATA
-AAATTTGAAATTCCCATGCCACACCTCAAAAAGTGGCTCCCTTAACTCCT
-GAGTGCTCGCGGAGCCCTACCAAACTTGGAACATTCTTTTCCCAACGGAG
-TCATGAACATATGAGCATTAAATGAGTAGACGACATGTGTATACATAGGA
-CCACCACAGCTGTTCCTTCCTTTTTATGAGAAGACATGTCATACACACAA
-TGTCTCTTCTCCTTTCCGATTGGAAAATTAAAATTATAGGAGGGGGGGGG
-GGGGGGGGCGATTCTTGACATTTCAATTACCCCCCCCCCCCCCCCACATC
-CGTTATGTTGCATTTTGGTAGGCTTGGGGCCGAATAAGTCTCCCATGCAG
-GCGTCAAAACGTCTGCGGACCTACGCCTGCCTCACGCCGCGCCTGCTGTA
-CAGGAACCCGAAAAGTGTCGAACGCGGCTAAAGAACCACTTTTCGCACTA
-TGCGGTGTAAACACAAGGTTTTGATTTGTAGTCATAGTGCATATATGATG
-CGGGAGGCTGACAGGTAGGAGGCAAGCGTTCAACCGCGCATGCCCACCAT
-GGAAGCCCTAGAGCCTAGTTTTAGATGAGTTTCAGCATTTTTGATCTACA
-AGATTTTGAAAGTTTTACAAAAAAACCAAGATTTTTTGTAATTTATGAAG
-TGATTTTTCTACATTTCATCTAGAAACCAGCAGAGTTATTTTTTGGGTAA
-TTTATCAATAGAGCGCGTTCGCGTCATGAAAACAAAATGGCGGCCGAACT
-TTGAAAATCGATGGCTGAATTTTTCGGAACAAAAGTCCGTAGCTATAAAG
-CACAGGCCTACGTTTTTTTTGCTTTTAAATGACATAGTTTTCTAAAAAAA
-AGTCTGTGGCCGAATTTTTAAATTTTGAATAGGGGCTTATTTCAAAAAAA
-ATTTGAGGCCAACCTACTCTTCTCAATTATAACTTGCCATGGCAGAACTT
-TTGAACAACTATTACAACGTTTTCAAAAAACAAGTTAAAGCATTTTTTCG
-AATAAAGGTTAAATTGGTAGCCTAGTTTTCTCAAAACAAAATACTAAAAA
-AAATATCGATGACCGAAGTTTATATTTGAAAAAATATGTGACCTAGAACT
-TTTAACTACTCTTCCAATGTCTTCTAGCTTCTGAGAAAAAGTTCGTGGCC
-TAAGTGTACCACGATGGTCTAGTTATCTCGGAAATAGCCATAGCCTAGTT
-TTCTCAAAAAAATCGGTGGTCGAGTTTCCTGTATGTAGGCATGTAGGTAT
-GTAATTTTTATCTTCCAGGTATCTATTTGTACTTCCCGGTAGCCAGGAGC
-AATACTTTTGAATTCCTTTGCTCTCCCTATTCAGCTTCTCCCCTCACACT
-CGTTTTTGGTATTCTATTGTTCTCCTCCTCTTCCCATTCTACCCCCATTT
-CATTTTCCTCTTGGAGACCCCTGTCTCTCTCTCTTTGTATTGGCTCTTTT
-ACGTCTTCTAGTAGGCTTTTCCTTAATGAACTTGTGTGTGTGTGCTTGAA
-TCATCATCGCGTTCTCTCGTTCCATTTCCCTTTTGCAATTTTCTTTTCTT
-GGAGAAATTTGGAAAGTTTTGCTCAAAATTCCTACGTACACATGCCTCAA
-AATCTGGTTGTATATGGCCTAACATTCAATTTCTAGTGCACACAATAAAA
-TTTTCCGGGAAATTCAAATTTTCTGATAATGAGGAAGGACTTTGGCGGAA
-AATTCAAATTTTAAAAAAGTAGGCGGGAAATTCGAATTTCGAATTTTCTA
-AACTTTTTGGCCGGAATTTCAAATGTTCTGAAAAATAATTTTGGAGCGAA
-ATTCATATTTTCTCAGAAAAATCTCAGAAAATTTGAATCTCCCACTAATA
-TTCTTCTCAAAAAACTGTTACGTGACCTATTTATATCTTATTTATTGGTC
-CATTTATTACGTGGCCTAAAACATTTTTTCTTTTCCCCCGTTTACAGCGA
-TCATTTGAGATGGCCTAGAAAACGCACGTTAGGCCATCAGGTTTACGGGG
-TATAGTACAACCTCTTGCAGGGGACTGAGGTTCAGAAAACTACAAATTTA
-GCTAATTCCCTACCTACTCTTGCAAATCCAATAACTAACCCAATTTCCCG
-GGGAAATTTTTATTCTTAGAAAACAACTTGTATATCTCCGCAACTACATA
-TCCCTCCTTCAAAATAATAATAATGGGAAGCTTCTGCTTCTCTACACCTT
-CTTTTGACCAAAAACTTGTTGCCAGTGCCCTATTATGTACGGTCCGTTGA
-GTTTTGTTGTTGTTCACAATAATATGTGTAATTCGCGCATCTGAAGAGGG
-GAGGTGTAAATGTTGTGTCTAACCGTTATGTTGCTGTCACCTCCAAGTGG
-TACAGGTGGCCTAGAAATTTGCGAAAACTCTTCCACGATTATATTTCTCA
-AAAAATTACTTTTCTCAGAAAATTTGATTTTCTCACCAAAATATTTCTCA
-GATAATTTGAATTCCCGCCAAAATTGTTTAAAAAAATAGAATATCTCGTC
-AAAATTTTTATCAGAAAATTTGAATTCCCCACTAAAATTTTGCCAAAACA
-TTTTATTTTCCCACTTAAAAAAGTTTTTTTTTTAATTTGAAAGTGGAAAA
-GTTTTCTAGGTCACTTATACATTACCGGTGACCGAGGTCGAATTATTCCT
-AGGCCACAAATCTCCCAAAGGGGTATTCCCACACCTAATTGACACCTCCC
-CGGGCACCTTTGAGCACTAAGTAAGGACACCCACCCCTCTCAGCTTAATA
-GCTTTTAAAGGAGCACACCAGCCATATGTTTTCTCTAATTCTCTCACTCT
-CTCTCTCGGCTTCTAAATTCAATTTCCCCCCGTCACGCCTCTCGTTACGT
-GAGGAGTGTTCAACATGTTCCCATTCCCTTATCCGATAAGTTTTTGGTAG
-GCAGGAGCTTGTACTAGTAGAGGACATTTGTCGCTTCTTGGTCTTTCGCC
-TCCATTTTCCGTAATTTATACGTGACTTAGAAAATTAGAAAAAAACGCAT
-TCCACGAGTTTGTTGGACAACTTTTTTTACGTGGCCTAGAAAAAAATGAA
-ACTCGGCCACCGACTTTTCTTTCACTTTTGTGAAGATATGATCTCATTCT
-ATAATTCTGTCGAACCGATTAGGAGGGTGGCTGAGTTTGCACTTTTGCGT
-GTTCTATACCATTTACAGAAGCTAGTCCCCCCGTCATTCTTTTTCCTGCA
-AAATGTTTTTTTTTGCCCCCGGTGTCTCATCATACAGTACAGCAGCCAAT
-ATTATTTGTTTTTTGTTTCGTCTTTTCGTCTTTTCGGAGAAAAAACGCTC
-TATTCTATGACAAGGTGACGTCATTGGACTCGTGGCCTAGAAAGTTTGGC
-AAACTCTTCCACCATTCGATTTTACAGGAGCCTCAAAGCCCCACATGGGG
-CCTAGAAATCTTGACATTTCTAAAAAACATCCATTTTGAAATTTTTCGAA
-ATTGGTGCAACCTAGCAACCTCTAGAACTTCACGTGACCTAGAAAAAACA
-AAACCTCAAAATTTCATGTGGACTAGAAACTTTTAAAAACTCTTCCATCG
-ATTTTGTTTTGTGGCGGGGACTTTTTCCAGTTTCTTTTTCACATAAAAAC
-CAAAAAAAAACAAGACGTCAAGCTGTGAAAATGATTAGTCACAAAAAGAA
-GAAAAACAGTAGTGTCGTTCCTGCCAATTTCAGAGATTCCTTCTTCGCTT
-CTCACGACACGAGGGGGGGAGGGTCTAATTGGCACCCCCCCCCCCCCCTA
-CTGAGGTGAGAAGCTTGAGTTGACTCACACGTCGCTCTTGTTTTATTCAT
-TTTTGGCACAAAGTGAAGTGTGCGAAAATTGTAGTAGTCTGTGTGTGTGT
-GTGTGTATGAGCATTTCGAATTTTAAAATACTTTTTTAATGTACCGCAGG
-CCACGTGGTAAGTTTTTTTTCATAAATATAGGATTTGTTTTCTTGTAGAA
-AAGTTTTTCGAATTTTGAAATGAAAAGGATAACTGGGAACGGAGAAAAAT
-TAAGTTTTAATTTCTAGGCCACGTACCAATGAGGATGAGAAGTCGGTTTT
-CTAGATCACAAGGTCATCTAAACTTTTAGGAAATTTAAAAAGTTTGGTGA
-TTACGAGAATTTCTAGGCCACGTCGCAATACACCGGCGCGTTGGCGTTTT
-TACACTTTCTAGACTACTAAGATTTTCCTAGGCCACGTCCCAATCAGGGC
-TGTTGCAAAAAAAAATTTTCGACCAAAAAACAAAAAACAAAAAATTTTTT
-GGTCTAACTATGGACCAAAAAACAAAAAACAAAAAAACAAAAAACAAAAA
-AAAATTCAATGTTTGATATTGAACGGGACAAAACGGAATTTTTTCATGAA
-ATATTCTGGTGATTTTTTATAAAATATTGAAAATTGAACGAACAGAAGGT
-TTTTTGTTAGCTTTTTTGCTGAATCAGTGCTGTAATTTATTTTTTGGTTG
-TTTTTGGTTTTTTTTTTGGTCTCAAAAAACCAAAAAAACCAAAAAATCAA
-TTTTTCCCAAAAATACCAAAAAAAACCAAAAAAAAACAGCCCTGGTCCCA
-ATGTACAGGTGTTGTGGTGCTTTTTGTGAGCTCTTAGGCCAGCTGGAGTT
-TTCTAGGCCACTTGTAAATCAATGGTTTTTTTTCGGTGTTCTAGGCCACC
-TGTCACGCCTAGACCATTGACCTAGAAGTTTAATGTTTTTGAATAATAAG
-TACACGTACTCTCACATACCCGCAAATGCACATATCTATCTTCATTTCGT
-GATTCTCTTCATCTCATCTTATTTTCCATTTCGGTTTACCCTTTTTTTCT
-CTATGAATATATTTTCATGTACTTGCTCTTCTTCCCTGAAAAAGATTCTT
-TTACACTTTTTTCATTTCCTTAGGCAGTTGTAAAGAACTTGTCATTAGAA
-CTTTCAGAATGACATCAGAGTAGATGGCCGAACTTTTTCTAGGCCACGGC
-TTGGGAGCCAAACATGGCTAAACATTCTAACTTCCTGGGTCATCTAGAAG
-TTTCTAGGTCTTATGGGTGAAAATTGTCAAATGACAGAATTTTCTTAAGT
-TATAGTTGAATTTCCCGCCAAACCGATTTTTTTTTGAAAAATTTAAATTT
-CCCGCCAAAAATTTTTTGAAACGTTTAAATTTTATGCCAAACTTTTTCTG
-AGAGAATTTGGTTTCGCTCCCAATTTTATTCTCTGAAAATTTTAAATTCG
-CACCAAATTTTTCGAGAGCTTTTTGAAGTTCCCGGCAAAATTTGTTTTCG
-AAAAATTAGATCCCCGTCAACTATGATAGAGAAGTTACGTCATCTGGCTA
-CCCTGGCCGAATTTTCAATATATTTCTAGGCCACATATTGACCGCTAAAT
-CATGTTGTGGAAGAGTAGTGACGTCACTTGGCGACCGCGACCATCGAGCA
-GCGTGAGGGGCGAAGTATCCCCCTTCCCAACCCTAAAGACGTCGTTCATC
-GCTCCTTTTTTGTTGTTGTAGGAGTTCCGTTTTTTTGTGTCTCGATTCGT
-TTCCTCCTGTTTGTTGTCATTTCTGAACTCATCTCTACACTTCTCTCGTC
-TTCTCTGCGTCTCTCCATCCTGCACACTATTTTTGTTTACCTCGATGATC
-TTTCTTTTTGCGTGTGTGTCACTGACGAACGAACGGCTGACACAGACTAT
-TGTTTTAGTTTTGTTGTTTAGAAGTAGTTGTAGTATTCCAATAGTTTTTC
-ACACTTTGCATTATTTCAGATGGCTCAGGACGGAGACCGCCATCACATTT
-TTGTCAGTGCTCCGCCGCCGCCGCCACCTTCCTCGTCGATTCCAGCTCCA
-TCGCAGGTAAATTTAAGGTTGCAAGCGCGCTCTAATGACCTTTTTTGTGC
-CTCCGGCTCCTCTTTGGGTTATTGCCAACGCGCTCCAATTCGAATTATTC
-TTACTTTCAGCCAAATAGACTGGAAAAGGAGCCGCTCATCGATGAGGAAA
-CTGACATGATTGACGAATCCCGAGCCACGTATTGGAAGGGATGTGAATTC
-TTGAAAGCCTCTGGGTTGTACTCGAGTAAATGTGAGTTGGTCTAGAAAAT
-TTGTAAAGCTCTTCCACGAAGTAATTAATAAGGGATACTATTGCCGACAC
-CCAGGAACACGTATACCACGGAATTCAAATTTTAATTTTTTGAAAATATT
-TTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATT
-TAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAAT
-TTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAAATAT
-TTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGACGGGAAT
-TTAAAATTTTAATTTTCTGAAAATATTTTGGCGGGAATTCAAATTTTAAT
-TTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAAATAT
-TTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAAT
-TTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAA
-TTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAAT
-ATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGA
-ATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTCAAATTTTA
-ATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAA
-TATTTTGGCGGGAATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGG
-AATTTAAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTT
-TAATTTTTTGAAAATATTTTGGCGGGAATTCAAATTTTAATTTTTTGAAA
-ATATTTTGGCGGGAATTTAAAATTTTAATTTTCTGAAAATATTTTGGCGG
-GAATTCAAATTTTAATTTTTTGAAAATATTTTGGCGGGAATTTAAAATTT
-TAATTTTTTGAAAATATTTTGGCTGGAATTTAAAATTTCTGAGAAAAAGA
-ACCTTCGTGTCGAGACCCATCGTGGTGAGACCCTTCGTGGTGAGACCCAT
-CGTGGTGACACCCATCGTGGTGAGACCCTTCGTAGTGAGACCCTTCGTGG
-TGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGACCCATCGTGGTGAGA
-CTCATCGTGGTGAGACCCTTCGTGGTGATACCCATCGTGGTGAGACCTTT
-CGTGGTGAGACCCACCGTGGTGAGACCCATCGTGGTGAGACTCATCGTGG
-TGAGACCCTTCGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGA
-CCTTTCGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCTTT
-CGTGGTGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGACCCTTCGTGG
-TGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCCATCGTGGTGAGA
-CCCATCGTGGTGAGACCCATCGTGGTGAGACCCATCGTGGTGAGACCCTT
-CATGGTTAGACCCATCGTGGTGAGACCCTTCGTGCTGAGACCATTCATGG
-AGAGACCCATCGTGGTGAGACCCTTCGTGGTTAGACCCATCGTGGTGAGA
-TCTTTCGTGGTGAGACCCATCGTGGTGAGACTCATCGTGGTGAGACCCTT
-CGTGGGGAGACTCTTCGTGGTGAGACCCTTCGTGGTTAGACCCATCGTGG
-TTAGACCCATCGTGGTGAGATCTTTCGTGGTGAGCCCCATCGTGGTGAGA
-CCCATCGTGGTGAGACTTTTCGTGGTGAGACCCATCGTGGTGAGACTTTT
-CGTGGTGAGACCCATCGTGGTGAGACCTTTCGTGGTGAGACCCTTCGTGG
-GGAGACTCTTCGTGTTTGATATTATATTGGCGGGAGCTAAGGAGTTGGTG
-TGGGATAATGTCAAGGTACTCTAGGGGTATTGTGGATTTGCTGTAGGGTT
-ACTGTAGTTCAGAAAAATTGACTTTGTGCTTTTGAAGAGGTATTGGCTCG
-AGAGTTAGAGAGGCGGAAGCTTCTGTGATATTTTTTACATTCCAGAATGT
-TTGAAAAAGTAAAAGTTTCCACCTGTTTTCATGTGACATTGTTAAAAGAT
-TATATGGTGTTTTATGTGTCGAACAATTTAAATTTCGCCAGTCGTTGGCC
-GCGCCGTAGGCGCGGTCAGCGGCTGGTTTTTCCAGAAAAGGAATAAGAAA
-TAAATTATTTGGAAGTTACTAGGACCCTGAATAGAATTCTAGGCCATATC
-GAAAAAGGGGATGGGTGCACGTGGGAACCTTTTTTTGGATATTTTGGAAA
-GAAGTAAGAAGTAAGAAGTAAGAAGTTGACTTAAGAAGTTGACTTTTCTA
-GAGTAAGAAGTTGACTTTTCTAGAGATCATCTCCCCTCTATTATTCTCAG
-CGTGACCTAGTTATCCGGAAAACTCTTCCACCAAAAAATGAGTGTCTCCA
-ACTGAAAAATGCGTCATAAAACACACGGAAAAGGTACTTGTGTATTACAT
-GCCCTCATTTTAATAGTAGTTTTTTAAGCCATGAAAAATAAAAACGTGAA
-CCACAATTTGTATTTTTAGGCTTAGGAAATAACATTTTCTAAGCCTAAAG
-AGGAAAATGTGTAATACACAAGTACCACGGAAAATTTTTTGAAACCTTCC
-GAATTTGAAATAATTTAACTAAAAGTTTCTAGGCCACGATGAAAATAGAA
-ACAATGATGTCCCGATTTTGCTGAAAATTTCTGTCCATAGTTATTTAGAG
-TTCTGAAAAAAAAGATTTTCGAGAAATGATTTTCTAGGCCACCAGAAAAG
-TTTCTAGGCCATTATCCCTTCTTGATCCTTTATCATTATGATTATGATAT
-TTTTTAAACGATTTTTTAGGCCACCAGAGGGAATTCTAGTCCGTGTCAAA
-AAAAAAAGAAAGGGGGTATTCTTTCCACATAAAAATCCCGTTGGCCTTTT
-CAATCAAATTTCTTCAATTTTTCGCATAAAACTTACCTCCCGCTGTGACA
-AGCCTCCTCCCGTCTCCCAGTATTCTCAATTCATTAATCATCACCCCCAA
-TGCCCTCATCAACTACAGTATCCCTGCAATCCGCGTCTGCAAATATGTGC
-CGAATATGTCATACTTCTACGTCAACGCGGTCAAATCCGCTCATCTCACC
-GTGTCGATGCTCTGGAACACTGCTCTTTGTGCATAAGGCGTGTGTTGTGG
-TGAGCTCTTTTTTTGTAAAATTCAAAATAATAATTAAAAAATTTAAAAAA
-AAACCTTTTGTGGAATTTGCAATTTTTATAAAATCGTTAAAAACCAAATT
-CAATTTATACAAATTTCCACATTTTCCAAAATAAAAAGAAATAGCCATGC
-CCACAAAATGGGCGGCGCTTTCATAGCCACGTCCATTTTGTGGGCGGAGC
-CTCGGATCAAAGTTTTTTCAAAAACTTACTATAAGTTGAACACGGATTTC
-TGGCTTCCTTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGGCCATTT
-TGGGTCGGAGAGATTTTGTGTAGATTTACGGCGTGTTGCGTGTCGCGTCG
-CGGCTCGTTTTTAGTTGTAAAACTGCTGTATTTGTCCGTGTGGAGTACAC
-GATTTTTTCCACGCGCTGTCCGGCAGGCGATTGTCAATGAGGAGCGAAAA
-TTCAATGCGAAAGGCCAGAAGCCCGTGGTTGAAGTGTGGTTTCAATATTA
-CAGAAATTTTAAAGAGGAATAAACATGCCTGCCTACAAAATGGGCGGAGC
-GTTGGAGGCGTGGTCTAAGAAGTCACGCCCTTTTTTTTAAATACTTGTTC
-TGATGTACAATAGAGCGCATTTACATCAAATTAATAATTTGTTTTTCAAT
-TTTTCCAGAGATGGCTGGAAATGTCGACTCGAAAAATGGTCCCATCACCA
-CGTTGCGAACTATGCGGCTACGATTATCGACGTGGAAATATATTTCAAAT
-GAAATCTTTACATGTTCCACACGTGGATCGATCATCTTGTCTGCTCAATG
-TGCTCTTTTTGATTACCGTATTAATTATGATATTTTGTGGATATTTTACG
-ATTCAATTCATTCAGGAGAATGCACTCTTAAAACGAAGGTGGGCGAAGTT
-TTCTGGTGATGACCTAGGAAATTAGAAAACTAGGCCACCCCGCAAATGTG
-GTGGCCTAGAATACCGAAATTTGACTAAGCTATGGCCTGCGGCCTAGAAA
-AATAAAAGTAGACTGTATAAAATTCTCATCAAGCCTTTTGGAGATGAACT
-GGAAACCCAAATTTTTTGGAAGAAAATATTGACCTCCTTTAAAACGGTGG
-CCTACTTTTTCTGATGGCCTAGGATTTTAGACAAAGAAGCCACACAGCTA
-CTATCCACATAGTTTCAGGAAAAAAAATAAGAAAAATAGGCTCCGCCCAC
-ATATTCTTTTGAATTAGAATATACACGAGCCATTTATTTTGCTAAGTTTT
-GAATGTTAGCTCCGCCCACATAATGATTTGAATTTCCCGCCCATTTTTCT
-CTCAAAAATTTGAATTCCCTGCCAAATTTTTTTTTGCGAAAAACTCAATA
-CTTTCAGGCTCTTCGCGCACAGTTCGACAAACACAGCGTACACGTGGAAA
-CGGCGTGGCTATTTCAGCGGAAACGGGAATGGAGACGGGGACGGTAGTTC
-GGATGGATATTTCTCGCGTACACCTGTCTCATCACTTTTTGACATAAAAG
-TGGTCTTGTGTGCCAGCATGTTCTTGGTCTCGTTCATTTTGGCCCTTTTT
-ACACAGTATAAGTGAGTTTTTTGACACGTGGCCTGGAAAATGAGAAAACT
-CGGCCACCGATTTTTTCAGCCGAATTTTTTTAGTTTAGCGGTCACACGGG
-CTTCTGGCCATTCTCTCTGCATTTTTCGCGCTCCATTGGCATTGGCTTGC
-CGGACAACGCGTGGGAAAGTCGTGTACTCCACACGGATAAATTTGTTCAG
-TTTTACATTGAAAACCGAGCCGTGACACGCCGTAAATCTACCCCGGCCGT
-GGCCGAGTCAAAATGGCATAGTTCGGCAAATTCTTGAATTTCAAAATATG
-ATGGAAGCCTGAAGCACGTGCGGTCATAAAAATCAATAAATTATCTTTTT
-TTTCCAGAGCCGAGTCCACGATATTCCGATGTATTTTCCGATTTTTTGTG
-ATCAATAAGAATTGGATGATCAAAAACTACGATATCAAGTGAGTGGGCGG
-AGTGTAATTTCGGCGGGAAATTCAAAATTTTTCAAATTTTTCAGAAAAAT
-TTCGCGCAAAGTTCAAAAACTCAAAACTTTCGGTAAATTTCGGCGCGAAA
-TTCAAAATGTTAAAAATTTTGGGGAAATTTTGGAGGGAAAATCAATTTTA
-AAAAACGTTTGTTTGAAATTTTTTTAATTTTCAGAAATGATCCCGAAATG
-GCTCACCGCCGCGGTCTCCAGAAGTCTTCACCTGTTCCGTTAACCTTATC
-AGCTTCTGATATGTGTATCCACGTGTCATCCTAGTCAACAATTCAACGAA
-AAAAACCATTCCAGTTACAATTTCTCATTTCTTTTCACCACTTTCGGGTT
-TTTTGCAAATTAAAAAAATTTCGATTTTTTTTTTGAAATTTTAATTTTCC
-AATTTTTATTTTTATTCCACAACTCAGGTTGCTCAACAGTGCCTAAAATA
-AATTTTATTTCTTTGATTTTTTATAAATTTACAAAAAAAATACAACAAAA
-AAATAATATTACACATTCGTGAAAAACGGAAAAAAAATTCAGCCTATTTA
-CATTAAAACACGTGGAATTTGAAATTTTAGCGATATATCGATTACCCTTT
-CTCGGAAAACTCGTAATAAATGTGAAAAAGGCGAGGAAATTGGAAGAAAT
-AAATGCGGGGGTTTCTAGAAAAAAAAATTGGGAGAAAGTTTAAAGAAAAA
-TTCAAAATAATGCTCCGGTGTCATCGTGTTCCACAGTGGTTAGATTCTGG
-TATTTTGTGCATGGTGTGCTCTGAAATTTAAAAAAAAAGTAAAAAATTGA
-AAAAAAAATTTCTTAAAAATTAAAAAAAATGAACTTTTTTTTAAAATTTA
-TATTCAAAAATAAAAATGTTTGGTATACCTAATTATTCATACTTTTATCA
-ATTTTCGAGAAACTTCAATTTTTCAACTGCTAACGTATACAACTCGCGTT
-ACTCGAAAAAGACCTGGGGACTAGTTTCCCACTTGGTGGCCTAGAAATCT
-CCAGTAAAAACATCGACGACCGAGATATGAGTTTCTAGGCCTCCATATGA
-AAAAAAAACTCGGTCGGGGACTAGGTTTCCACATGATGGCCTTGATAACT
-TCAAATTTTTTGGTGACCTAGATTTTTCAAAACTTGGATTACTAGGCCAC
-TAAAAGCTTTTCGGTGGCCTAGAAACCAAAATTGCGTGAATTTTTCATAA
-TTCTATATCAAAATTGACTAAACCGAAAAGAATGCGATGCTTTTGCAATA
-TTTCAGCAGTTGGTGTATCCCACGTGGCGACGGGATTTCGGGCGACCGTG
-CCATTGATTAGAGCCAACGGAAGATATTTTGAGCATTCGGCGGTGCTCTG
-CAAAAATTTTTTTTTTGCAAAAGTTAAAGACGCATGGTGGGTCTTGATCT
-ATGAAATTTCGTGATTATTCGAAAATTTTTTGTCCTTATTGACAATTTTT
-TTATCCACAAAAAAGGCGGATGTCCTAATTGCCAAAAATGTGGGTTTCTA
-GGCCACGAAAAATAATTTTTTGCTTCAAACATCCTGCTTTTTTTCCAAAA
-TTTAGCTTTAAAAAGTCGGTGGCCGAACTTTATTAAAAGTTCAATTTCTC
-GGCCACAGAAACTTTGTTTAAGTTTTCACATTTGGATTTCTAGCCCACCA
-ATAACGTTTTTATTTCATATTTTTATAAAAATCGAATTAAAAGTAGATGA
-TGACCTAGTTTTTTTTCAATAATTTGGGTTTCTAGGCCACCAACTTTTTT
-TAAAAATTTTCTTAATTTTCCATAACCAAAAAAAAAAAACAAAATCGATG
-GCCTAACTTTTTGGCTTCCTAGGCCACCAATAACTCTTTTATTACTAATT
-TTCCTCACTCTCTGATGTCGATAAACACTTTCTTGTCTCGAATATCGCTT
-CCCACACCCATCACACTCAAATGCTCCATTCGTCTCATGAGTGAGCAAGT
-GTTGATTGAGCCCATGCTTTTGCCGGAAAGTTTTCTCGCAGTCTCGACAT
-TTATAAGGTCCATTGTTGGGCTGGGCCTCGTGAGCCGACGACGGGGCCGC
-CCGTTTTTTCGCCCTTTTCCCCGATTTTTCCGGTGAAAAAGTGTCGAAAT
-ACGCGTTATTGTCATCTAATTTTGGTACATTCGCCAACATTGCTAGATTC
-TCCTGAGCCACCTGTTGTGACGTGTGAGGAATGTGATGGTGCTGATAGAG
-GTCTGGTGGTGGCTGAAAATGGGGAATATTCCCGGCGCCGAACATTTTCA
-GAAGTTCCAGGTCGAATCGTTGTTGAGCATCCGCGTCGACTACTTGATTG
-AGGGAGACGGTGAAGTCAGTTGAGGAGGTGGATGGCAGTTTTATAGAGAA
-ATCCTGCAAAAACTCAGGTTTTTGCTAAATTTTTCAATTTATCATTGTAA
-TTTCCGAAAAATTATAGCTTAATTTTTAGATTTTTCGCTTGATTCTCAAG
-TTTTTATGCGAAAATTTAGTTTTTTGTCAATTTTTTTTTGTTTTAAATGT
-AAAACTACGGTATTTAAAGGGAGGAGCACTAATTTATGCCGATGGGTCTC
-GCAGCGAAAACATTAAATGCCTTAATTTAGCCATGCGCCTGGAAGGTTAC
-TGTAGTTTTTATTGATTGATTTTTCATTCAATTTGTGGTTTTTGAAGGTT
-TTCAACTCATTTTGAAAGGCTTTTATAGATTTTTTTTTCTGAAAATCAAA
-TTTAAATGTTAAAATAATTTTTTTTTTTTTTCACACAAAAATAACAGAAA
-TTCCGAAAAATTGCAATTTAAACAGCTCTAAAATATGAAAATTAACGCGA
-TTTTTATCATTTTTTGCTTCAAATCGCTGACTTCTGGCAAAAAAAAGGAA
-AATTCAGCAAAAATCAATTTTTCAGAAAAATTTGATTGATTTTTGGAATT
-TTTCTTACCAATCCGTCGTCTTGCCGTAAATCCTGTAGCTTCATCTCCTT
-AGCCAGCAGATTTCTTACATCTAATTGCACGTGGCAATTGCAGTTCTGAA
-AAAAAAATGTTTTTGAGATTTTTAGAAAACTTATTTTGTAAATGTTCTAG
-GTGGGTTTTCAAATTTTTTTTTAAATTTAATTAAATCAAATTCTTCTCAC
-CGTCAGTTTCTCTTTGACAAAATCGCTCAAATTCTTCTGATTTTCCTGAA
-CTTTCTCCACTTTCACGGCCAAATCCTGCTGCTCACGCAAAAATTGTTTG
-ACAAGACACGTTAGCTGGTTCACATTTGATAGATTGTCCGGGATTTTTAT
-AATCTGAAATTTGAAATTAAGGATTTTAGCGGTTTTTTCGGCAAAACGTA
-AACTTTTAACGCTGAAAACTCACATTTTTCGAACTCCGCTCCAATAATCG
-TCTAGTGAATTCTTGAATAAATCCGGTTGCTTTCATAAAATTCTGAAATT
-CCTCATTTCCAATGAATTCGCCCATTTTCCGATGGAAGAAAAACCAATGG
-AAATACGGCAATATTTGCGCACAAAATCGATGCTGAAGTGTCGTCGGACG
-CAGTGTTTCGTGTGCAGTACACGCCTACGACAAATTGCGGACTTTTTTGT
-TATGGAGAGAGTAGAATAGAGAAGAAAAAAGAAGATAAAATGGATAAAAA
-TTGCGCGTTTTTCTCGTTTTTTCTCTGAATCTCTCAATTTTTAGGTTTTC
-GATCCATATACGTCCCGAGTGGAGATGAAGCCATAAATTTTTCTCTAAAA
-ATTGTTTCTTGCCCCTCCAAATCGCTTATTCGTTTTTAAAATTATGAAAA
-AAAAATGCTAAAAATGCTTACCAAACCGCAAATTTTTAATTGGAAAATAC
-CCAATATTTTGCAATTTATAGTTTAAATTCAAGAAGGTGCCAAAATTTCT
-GCAAAATTGCATATCTTCATATAAATTGTTACATTTTTTGTAAAAACTTG
-AAAACCCTGCTTTTCACATAATAGTACTGGAATTTTTCAATTTTCAACAA
-TTTCATAATTTTTGACCAATTTTTTATTGAAATTTTCAATAAAATATTTA
-AAAGATGTGGCTTTCCAAGCAGATTTTCCAATTTTTCCGAGTTTGAGTAA
-CTAAGTTTCAACCAAAATGATGTCACAAGTCAGAAAATTTCCCTAAATTT
-CAAAACACAGGTGAATAACTATAGGATTAGAATCTGCAAAGATTGAGTCT
-GGAGATAATTTCGGACATTTTTTCGGATAGTTTACGTTTCCTGTAGTTTC
-AAATAGGCAATTTTACTTTAAAGGTTGCTAATAAAATTAAGAAAAATCCT
-TATATAGTCTCCACCCACAGATTGGCTTTTTAGATATTTTCAAAATATCT
-TGTAACGAAAACTACAGTAATCTTTAAAATTAAAATTATTACTGTATTGC
-TTTTGTCCATTTACGGGCTCGATTTACGAAATTAAATTTAATAATCTTTA
-ATCTATAGAATATTAAAATTAAGCAAAAAATGAGAAAATAATACGAAGAA
-ATGAAGGAAAATGGAATATCGGTGTAACTATCCGAAAATAAATTCATTTA
-GAAAATCGAGCCCGTAAATCGACGTTACGAAGAATTACTGTAGTTTTCGC
-TACGAGATATTTTGCGCGTCAAATATGTTGAGCAATACGCATTTTAAGAA
-TTTACTGTTATCGTAATAGTTCAAATTTTTCGAGATAATAGTCTTCCAAA
-AAACTATTGTTTAAGGTTTTATTTTTTCCGTAATCTAAATTGATTATCAC
-TAGACACTGTTCATTAATCATTCAGAACTTGTATAATCCATCTCGGTTAA
-ATTGTTGGTGAGACAAAGTGTAATCTGTTCTAGTTGGGTCACACGATCCC
-TTTTCCACTCAATCGCTTACCCACTCAACACTATAGACTAGACACTCACA
-CAGGAAATAGTATTGTTTACCTGTTTTCTTTTGGACACTGTTTATAACTT
-TTCCCTCTCCGTTTCTCTACGTTTAAATTTGTCAAAAATTAATAATTTTC
-TTACTTCCACATTCAATACTCATTTAATGACCGGTATTTGAAAATATTTT
-AATTTTTTAATCTTTAGTTATTACAGGAACAGTAAACTCTGGGAATTCGT
-ATTGCACAACATATTTGACGCGCAAAATATCACGTTAGCTGGCATAATAT
-TAGGCATATATTGTTTCTACAATCTTGTAATGTATAACTGACTAACATCT
-TTGAAATAAGTTTGTAAAACTTGTGAGTTGGAAAACATTGTGCATGGATG
-TCGTGTTTCGCGCACGCGCTAGAGTAGTCATAAAAAGATTACTGTAGTTT
-TCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAGTATGCATTCTC
-AGAATTTTGTGTTCACGTAATAAATTAAATTGTTAAAAGATATAATAAAA
-GTTAAAAGATATAACAGATTTTTTCTCACTTCCCTAATATGTTTAATAAT
-CAATCATTTTAAATTGTGCCGAAAATTTTCCGTTTTCCAATTGTTCGGAA
-TTTTTTCGGTTTTGCTCGAAAAAACCAAAAAGCAAATTTTTATAAATTTC
-CCTGGTGTTCAAAATTTTCCCGCAATTTTTACCTATTTTATTTTCAAAAT
-ATTTATTTATTTCAGTTCCCCCAAGTCAAACCGTTCGATGTTGTAGAAAT
-GGAGATAATTCCGCTGCATTACGGAGCACAAGTTGGGATTTATGACGAGG
-ATCATGAGGTTGGTAGATTTTAATTTGTTTTTTAAATCGTGGCCTAGCAC
-ATTCTAGGCCACAGGTAGTGACGTCACTCTGAACATTTTCAATATATGTA
-AATTTTAAATTCAAACTACTTAAAACTCGGAAATCACTTTTTCCGTCAGA
-TACACAGAAATAAACTAGTTTTACCTTTTAAAAAACTAAAACCATTGAAC
-TTTTCACAAATGTTCTTTGAAACTTGAGATAATCTGCAAATCCCAAACTA
-TTAAAAACTGAAAAAGGTAGCCTAGAAAATGAAAATTTTCAATAGTTTTT
-TCAAGTTCAAAGAAAAAAAATTGAATTTTTAAATTGTTTTTTTTCGCTAC
-AAGTCAAAATTATATTATATTTATTAGTTTTTTTCAATTTAAGAACATTA
-CTAAAATTAGTGCATATTTAAAAAAAATGTTTGTTTCGGAGAAAACAACT
-ATTAGTAATTGCACTGCAATCATCAGATTAGTGAGGAATTTAGTTCTATT
-TTTTTCTTTTTTTTCTGTTTCAAAGTCGTTTTTTCATGAAAAATAGACCT
-TCGAGCTACTGGTTTTTTGAGAAATATTATTTCAATTTTCAATTTCATGA
-TGAACAACATTTTTGGTAACACATTTAATTCTAGTAGAATATTATCCACT
-TTTTCTCTAATTTTTCAAAATTTATTCCTAAGTTTTTCTGATCAATGAAG
-AACTACCTTTTTACGACAATATTGCCTTCAATTTTTTCTCTCTGAAAATT
-CGAAATTTATCTGAATCAATGGTGCCGGTTTTCTTATTTCTGAATAACGA
-AATAGATTTTTTATTTATTTTTCAACAATTCCCGGAAATTTCTCTATTGT
-TAAAAACAAATGAAGTGAAAATCGATTTTTTTACTTCGAAAGTTTAACAT
-GAAATTCGATAAATTTAATCTATGATCTTTCAAGCTCCGCGAGTTTGAGG
-CGGGATGTTGATAATTAGAGATATGCCGGGGGAGAACACTACTCTCCAAT
-TATATTTCGGTTGCTCGAGAAATATTTTTAATGATAAATACTGGATACTA
-GATTCTATAGAAAACTAATTTATTTCAATAAATTTATTATTATTCAGGAG
-AATTATATTTTCTTGCTCGAAAGAAAATAAATAATCAAAAACCGACGCAT
-TTTCCTGAATTTATAGTTATTCAGAAGAATATAGATTTTTATTTTCAAAT
-TCTGAGAATTCAGAAAACATGGCTATTTGCCGGCCTAGAAAATAGAACAA
-CTAGGCCACCGATCATTTTTGTTTTGCCGTTGTCAGGCTTCTGGCCTAAC
-TTTCTCTATCTTAAAAGATTCCCAAATTCAAACTACTGGCTTTCCAAAAC
-CTTCAAATTGTGGAATGAACTTGTGATTCCAAAGATCTGATGTCAAGAAT
-TCAGTCCATAGTTCATATACTCCAACAACACTTTTGGAATTTTAAATCTT
-CATGGTTTTCAAAAAGAATCCACCAAATTATTTAGCAACGGGGTTTTCCC
-TTCTAAACAATTGTGTGACACAAATCATAATCTCCGTCACTTTGTACAAT
-TTTTCTAGTTTTGGTGATTTCCCCTCATGAGCTCAACGCGGCGGAGTAGA
-TCTTCCATGCAGGCGTTAAAACGCCTGCCTGCCTGACTTTAAGGCGGCCT
-CCGCCTGCCTAACGCTTCAGTCCTAGTCTTGTGCTAAACCATACATGAAC
-TATTTTTCTAATTCTTAATTTGGTTCTCATAAAATTGATAAAAATTAGGA
-AAATTTGAAATCTGAAATTTCAAGTAAAAATGGGCGGCAAACTTTGTATA
-AAAAAAAAAAGAAAGCTCGGCCACCAATTTTTCAAAGTTTCTTACCGCTC
-TCTGTCTTGCCTCGGGCAAGCCCTAAAACTTTAGAAAACATCCCCGAACA
-AAAAAGTAATAAATCCTTCAAATGTGGGAGATGCCCCGTGTATATGTCAC
-CTGTCGACTCGTCGAAAACGTTTGTGCCACCCGGCTCTTTACCTCGTCTC
-CTCTTACTCATCATTTTACTGCCCCCGTTGCTTTCCGGCTAATGAGGTTC
-TTAGGGCGTAGGACGCCATTGATTTGTGCTCTTTTCAGGCAAAATTTTAG
-ATTTTATTTCTCTGATTTCACTCAATTATCAGACAATCTAAGTTTTTTGA
-CATGTTCAATGCTGGAAGCAATTTTCGATTTTTTTATCGACCATGGCCTA
-AAATTACGGGTCAATTTCCTGAAACGGACGAACATTTTTGAAAGCAAAAC
-AGTTTGTAGAGTTTCGCTAAAATTTCTGATTTTTATCGAAAAAATCGGGC
-ACACCAAACAAAAGTTCGTTTGTGTCAGGACCTTGACGGTACGCAATTTT
-CGGACAAACCACGTGTGGCTGATTCAAAAATGTCAACTAAATTGACATCT
-TGAAAACATTTTTTTCACCTGAAAACCACTAACAGTGTCAGGTTAATCCG
-ATTCAAGCGCTATTTTTATGAACTTTCCTGAAAGTTTAATTCCACACGTT
-GTGAGGGAATTTGACACATTTTTAGAAAACCTGATCTCACGGTTAATTTT
-TAAACACTTCGAGGGCCCAGAAATCCTAGTTTTTTTTCTGGTTATTCATA
-GTTTTTCTAGAATTTAATTTCACATCTACATTTCTAAACAAAACTTTTGA
-AGGTCCTTGTAATTCTTCTCTAGTTTTTTATTGTCAAATTAAGTTTTCTC
-CAAATTAGGAAGAAGCGATAATTGCGGGTTTTGTGAGGGAAGTTTGTCGT
-CGGTCCATTTGTTTTGAAATGAGAATCGGAACGATTTCCTGTCTCCCGTA
-GAAACCAATTAAACGAAAACTTTTTTTTTTCATTTCGTTCATTTTGCATG
-CTTGCTAGCCTCGTCTATTGGAATTCTTTTGTACTATGATTCTATTCTAG
-TTGTGTCTGCATTAAAAAAATCGATTTTTTTGTTGAGTATATTTATTTTT
-CAAACAAGCCGAAAAAATAGATCAAAACTGAAAATTTTATAAGAAAAATT
-TCAGTTTAAATCTAGTTTTTTTTTCAATTGGCCAACTTATAATTTATATA
-TACTCTCAAAATCAAAAAAAAATGCACATTCTATATTACCCACAAACATC
-GAAAATCCGCTATTCCCTCAATTATAAAAAATGTGAGAAAATCCTCGATT
-CTTGGTTGCTATGAGACAGATTTCAGATTTTTCACCGGATAAACAAGACG
-TTATCATTACTTTTCAGTAATGCGCGTTTATTTTTCTATTCCATTTTTCG
-AATTTTGAGATGTTGTATTATTTAGAGAGCACGAAATTCTAAGAATGCGT
-ATTGCGCAACATATTTGAGGCACAAAATATCTCACAGCGAAAACTACAGT
-AATCCTTTAAATGGCTACTGTAGCGCTTGTGTCGATTTATGTAAATCATA
-TATTCGTCGATATAATATTGAGCGAAAATTAAGAAAATAATACGAAAAGC
-GAAAAATTAATATCGAAAATCGAGATTCCGTAAATCGACACAAGCGCTAC
-AGTAGTCATGTAAAGAATTACTGTAGTTTTTGCTACGAGATATTTTGCGC
-GTCTAATATGTTGTGCAATACGCATTCTTAGAGTTTTGTGCCTCCCGTAA
-TATTATGTACAATGCGTATTTCCTCTGCATGCAAGACTAATTTCCGATTG
-GTCTGTAGAGGTGCAGTTGGCTGGCTGACTTTTAATACTTATGTTCCTTT
-AAATTTTCAAGTACGATTAGGAACCCTTTCTCTCAGAATTTCACTAGTGT
-ACCTTAATGTTTGTCTTTTGCTACCTGAGACGATCATCAAGTCTTTTCTT
-TTGTTTGTATTAGATTTCGCAGTAAAATTGTGAAAAAAATTGCAAAAAAT
-TGAGAGCAAGAGCAGAAATGTGCACTTCTCGTTGTACCACGATTTTTCGT
-TTTCCCACTAAATACCTATACGTATAGGATTATCCAAAGATGATCCCGGG
-GATCACCAGTTCTTAGTTTCCTTATCAATTTTATATTACTCGTATGCCTT
-CCTCGTTTTTTTTTCTAAAGCCATGAAAATCATAGGTATCGCCTCAGCGG
-GTCGTAGAAGGAGCACAATGTACTCGAGCTCGTCACGAAGACCGTTTCGA
-CGGCTGGTTCCGCTTAAAATGGTTAGAGAACTGGGTCTTGATGCGATCCT
-AACAAATTTTTTGAATCTCTAAATAGTCCCTATAGATCATGTAATAATAT
-AGGTTGAACGTTTTACAGAATAAAGTTTTACAATAAACTTTATAGCATGG
-GTGTGTGGCAAATTTGCCGGACTTGCCGTTTTCCGAGATCGGCAAATTTG
-CCGAGTTTGCTGCACACATGAAAAATTTTTAATTAAGATTTTGTGCAAAA
-ACTAATGTAGCCCCTGGTTTACACCTTTTTACGATATTCTGAGTACATTC
-GAAAAGGATGTTTTAAATAGATTGAATATCAAATCAAAAAAGAAAGTTGC
-ATGAGTATTATATCTAAAAACTTTTAAAGAACACATTTTCAGGCACAAGG
-CCGAACGGCAACCGACTACGCGGGTCAGGACTACGATGAATGTTATGATA
-GGTTAGTTTCTTTTTCTATTATTTCATTCAGAATATTACGAATTAATGCT
-TAAAAAATTTTCAAATTAATTTTCAAATCAACCGCCTTAGCTCCACCCAG
-CTCTCTAGATCGCAACCCGCAATAAAGCCCATAAATCAGTGGGCAGCTGC
-TGCTGCTCCGTAGTGGATCAGTCTGTCGTCTCTCCGATCAGTGCGCTCTC
-GATGATACTCTCACATTTGACCTTTCTCGCTTTTTGTAAACTATGTGCTG
-GACACGTTGAAAGTAGTATCAATTGCACTTTTCTGGGTAGTTACCGATAA
-AATTGCCCAGATGGAAGAGTTTTCCATAACAATTTCTCTTCCATTTTCAT
-CTATCAGCTCTGTGGCCCCGCTCATTAGTGTTTCTCTAGCCGATGCTGTT
-CCAGGTTCCCATGGCAATGTGTACATGTGTGCCTAAAGTGAGCCAAAATG
-CTCTTTGAATTATTCATTCATCCTATGTTTTTTATTCGTCCTCACGTGAC
-CTGCACCACACTGCGCATTAAATATTAATTGGCACTGAAGAGAGCCGCCG
-CTCGGGCAAATGTTTAAATTTTAAATTTAATTGATTTATACATATTTGAA
-AAATGAGACACTATGTTATTTTCGCCGAATTCGTTCTCTGAGCATTGCGT
-TCATATCTTTGCACCTATATGAACAATTAAAATAATTTGTGTGTCCGGTA
-ACGAAAAACCCGAAATAAGTCTTGCCTATACAGGAGTTTGTGGAAAGTTT
-TCAAAATTTTTAATGCAAACAACGAAGGAAATTGGAGACGTAATACGATC
-ACTAGCAATCTGAATTTCTACTTTCAAAACGTTTTTTTCATAAGAAACTC
-CATTATCCAAAATCCGGCCACCTTGCTAATCCTGAGTCCATAATAGGCAT
-TGCTAAGGCAAATCTAGGGCTTTTGGCCGATAAAAGACTTTTTGATAATA
-ATTTCCAAGCTTAAACCTTATTCATATTACTTTTAGTAATCCTATAAGTT
-TTGTTTGCAGTGGTTCAGAATTGCCGAACATTCCAAGTTTTTTGATAAAG
-GTTTTACATATATGTTGAGCTTAAAAAATAAACTCAAAAAAATTAACAAT
-TAGTTCATACGTTATTAATTTCAACGAGTTTTAGTGTAAATATATATGTG
-GTCCTCTATATATTTTCCGTATTATTATTATTATTGATTCGCTCCAAAGC
-TTTAATTTCAGTCTCAAGACTATACTGCTCAACTGTGTTTATAGTAGTAT
-TTTCAAACGAACAAAAAGTGACAATACAGTATACTTTAAACTAAAAAAAA
-CTTTGTCGATGAAAGTCTATCGATCAAACTAGCGAAATCCGCCCGTTTAA
-TCCGTTTTCCCGCCACCATCACTTATTGTGTTTTCATAGAGCTTTATTTG
-ACGGAATTTCCTTTCTTCTGATTTTTCATATTTAACCAAAACTTACTTGA
-AAGAATCTTAAAAGGGATTTTTACAACTCTCTGGATCAGATTTTTCGAAT
-TGTTTCATTCGCAAAAGAAGAGCGACTCACTGCTATAAATGCAACATTCA
-CCACACTATCTCCACAATTTCATCTATTAATTCATACAATGACACTACAA
-TAATCCCCACTTGCTCAGAATTTGTCTCTCCCGCGGGGGACAAATTGGAA
-TCAATCATTCTGTCGGTCGACCATTGAACCACCACCACACAATATGGTTC
-AGCGGGGGGAGGTCCAGTTTTATTGTTATTACGTATACTGCTAGGGGAAC
-CCAATTTTCGGACCCCGCGCGGAATATTCAAATTGGAAAGAGTGTGTGTG
-CAAAAACTTTGTCCATCTTGTGTCCAGCAGACCAGCCAGCAGCTTCTCAA
-TTTCCGCTTCAACTTTCTCCACTTTCCCATGGGACAAACCTTTTGTCTTT
-CTTCTGGCTTCTCCTCTTACTTCTTATTCTTCTTCGTTGCCCAAATTGTG
-CTGGAAGAACTAGAGATGCTGAAAAGAAATAGGAAAAGAGCACGAAGACA
-ATATTTATGTTTTGTTTTCCATGGTTCGCCTCGAGTATTTGATTAGGCTT
-CTCCTTGTTGTCTTCACTCGACGTCGTGTTCTCTATTTTATGTCCACTCT
-TGAATTCCTGGAGTTTTCAGTGCACGCATTTGTTGAGCTGTAAGAAAGCT
-GCAGGAGTTTCCCAGAATTTGATCGATTTACGGAGCGGAGTGTCGTACTA
-CTTATTTCCGGATTATAAAATTCTGAGAATGCGTATTGCACACCATATTT
-GACGCGCAAATTATCTCATAGCGAAAACTACAGTAATTTTTACGTTTCGA
-GAATCGAGCCCCCCTAAATCTACACAAGAGCTACAGTAGTAATTTAAAGA
-ATTACATTTCCGAACCTTTCTCATTTTTCAACAATTTTTTAACTTGCCTA
-GCGTAGCCGAAAATTAGCGGTAATCGCTTCAAGACCCAAAACAAGCCAAT
-TTCATCAAATTTCAAGTAGAATTTTGTGAAAACAACCGTCACTACCATTC
-TGATGACCCTTTACTTCGACCGCCCAGTTCGTTAAACATTTTTGAATTTT
-GTTCACCTGTCTGCCACCACATATCTTTCTTCATCAAAATTCAACGTGCT
-GCGATCATCATCTTCATCTCTGTCTCTTCATCTCGCCCAAATTCATTTCC
-GTCACTGCGTCTCGTACTGATTTTTTTTCATTTGTCTCCAATCATTTAGA
-GGCCAAAAGACCTCCTCTCAATTTTTTTCTGTCTGTCATTGACCCCTCAG
-TTGCGAACCGATTCAGAGTTTACATAAACAAGCTCGCTTTGTATATAATG
-TTGAGTGAGCGAGAGAGTGAAAGAGAGAAGACGCAGGAAGCTAAGCGTTT
-CCTTTGTTTCAAGCTCTGTCAAATTGTCAATTTTCTAGCTAGAAGATTCT
-TATGAAGTTTTGAACATTCTAGATTTAGTTTGTTACCTACAACAGGTGAA
-TTTGTCTTTCTTGTCCAGAGATAAAACTTATCGTGGCCTTTTCCGAAATA
-GTATCAGATTTCCTTTGTACAAGGGCTTTCGTGAGGCGGTAAATCGCCTG
-CCTGACTTTAAGGTGACCTCCGCCTGCCTCTCGCCTCAATACGTTATGCT
-AAAACAAACGTGAACTTTTAAAAAAATTTAATTTTCAACAAATTGATAAA
-AATTTAAAAAATTTGAAATTTACCTGCCTACCATAGAAGCCCTACCTTGT
-TCCACTATTGATGCGATTCATTCTATTACAAATCAATGTAACGAACTCCG
-AAGTTTGATAGCCCGAGGCGTTTTCCTTGTTAATTTGATATCGATTATCA
-GTTTGACCAACCAAACACCATCGATTTGGCTTGATTTTCAAGGAATTTAT
-AGAATTTCGTAGAGTTTTGGACTATGTTTTGCATTTACGTTGAATGGAGA
-GAATTATATTTGAATAATTGAATAACTTGTTAATGGTTCAAGGATTACCC
-GTTCCGAAGTCTAGAAATGCCCTGGCGATGCTCCCGTCGAGAACTGTAAC
-CGATAATCAATCAATATTGCGGGTATTAATTGGCTAATATTCATAATCCT
-GAAAAGTTATTTGAATAACGGCAAACTCCCAAGAAACATACCATTTCCGA
-GGTGTATGAGAATTTTAACAAGACCTTAGGGTACATAAGCCTATCAGTTT
-GAAAAACAATGTCGGAATTTGTGCTTCCATGGTAGACAGGCGCGGTTTCA
-GGGTCTGAAGCTTGCCTGAAGGCCAGGCAGACAGGCGTTTTAATTCCTAC
-ATGGAAGCCCTAGAATACAGCATATACGGTACCTAAGCCAATTATCAAAT
-TTTACTTTTAAAAATTCATTCCACAGGTGTTCCTGTTCTGCTGCATCATC
-GTCACACAGACACTTACACGCGCCTTTTCACTTCTCATTTCCCACTTTTT
-CTTCGTTTTTCTCGCTTTTTCTTCTTCTCGACACGAAGAAGTAGGATAGA
-TCTAGAGACGTCGAAAGCCATAATTGTTTCCGTCGGCGTCTCCACGCGCA
-CTCGTACTGTCTACAAGTGCCACACACACACTTGAAGAAAATAGAGAGAG
-GTGCAGGAGGAAAAGGAGGGGACGACTTCTGAAAGTGTCGATAACTACCT
-CCTATTTGAGTAAAGAGTGCAAGAAATATATGTGCGTGTGTGTCTAATGA
-GAGGGTCTTGGAGCGATTTTTAAGCATGTACAGGCATGAATCAGGCGGCA
-GGTTCCAGCCAGGCTCTGAAACCGCGCCTGCATACCAGGGAAACCCAACG
-ATGGTTTTTCTTTGCCCGGTTGATCCCTTTCTTGGATAGTTTTAGTCTTC
-GTCCGTTTTTCATTCATACTCTTTTTGTAACTGTTCAAAAGTCTAGTTTC
-ATATAATCAGAAATTCGAGAAAAAGGATTTTTCGAGGCTCTGAAAAAAGA
-TCCCAGAAGATTGTGTCTAATTCTAATTCTCTACAGAAAATGCCCAAATC
-GAAAATTTTTCGACAGATCCTCGTATTTCGAAATTCTGGAACATTCGGCA
-AAGCTGAAAATGTCACAACTTGCCAAAATGAACATTTTCGGCAAATCGGC
-CAATAGCTGTATTTTTCAAACTTTCGGTAAACCGGCAGTTCGCCAAAAAA
-AATTCGGCCATGGTCTAGACTCTAGAGTTGGGCGGCAGACAATTATTTCG
-GGCAAACGCAAAAATTAAAAATGGAAATTGGTGTTCGGCAAATCGACAAT
-TCGCCGGAATTGAGAGTTTCCTGCAAATTCGGCAAACCGGCAATTTGCCG
-AAGGGCAACTTCTCCGAACTGACACCCCTTCCAAAAATCCGAAATTTTTT
-TAGCTTCACCCCCTTCCCTCCCTTCTCGTTTTCTAAAAACCGGACACACC
-TCTTACAATTATTACAAACACCACTACGTACGTATTAAACGTCTCTCGTA
-ATAAGTGGGGCGCCAAAATATAATGGTTTTTGTTGTGTTTAGTTAGCCTC
-CTCCTCTCTACTTCTCCACCATCATCAAATCTACCACCACAATAACATTA
-ATTCGATCATCAACTGACTACTTTTGTCTTTCAATGTGGATTTGTAGTTG
-TTGGTTATTTGAATTCTTAACTATATATCCATCCCTATGTTGAAAATTTG
-AAATTTTTGGTAAATTTGAAAGATACCAAGTTTATGTATATTATAATATA
-TTATAAAAATTTCCGGTAAATTGATATCCTGCAAACGGCAAACCGACAAT
-TTGCCGGAATTGAAAATTTCCGGCAAACCGCAATTTGCCGATAATAAATT
-TGCCTTTATTGATTCTAGGTTTCGAAAAATTACGTGTTCCGTTTTTTTTT
-TGAATATTAAAATAGGAATATCAGAATTTTTTATTTTTTATTCTGCAACT
-TTTCAAATTATGTTCAAATTTATTATAAAACTATCGTAAGTGTGAATTTG
-CAATTAATTTTCTTATTGCTAGGTATCAGTTTTACTAGGGCTGTCATGTA
-TGTACCAAAACGCCTACCGCGCCTTCTGTCTAGTGCGGTGCGGAACCCGA
-AAAGTGTCGGAATCATCTTTCGCAGTATGTGGTGCTGAAACCAAGCCTTT
-GAGTTCTCGCCATAGTGCGGCGAGAGGCCGGCATGAGGCGGGCAGGTAGG
-AGGCAGGCTTCAGGAACTGTGTCGCGTCTGCCTCCCAATCCCAGAATACT
-TTTTTTTTCAAAAAGTTGCAATGGAAATCAGATTTTCAAACGCAACCTGT
-CTTCCTCTTGTACTCAACTTTTACTTGATGATAGTCGATAAAGGTGTGAA
-CGCGGTGAGGTGTAACCGTGTGACAATACATCATTGTATTATTCTTTTTC
-GCAAAAAAAAAACATTCTTTTGGGTATTATATTCTACCAATGTATCTTTC
-ATTTTCTCGATTGATTTTTTCTCCGGCGAAAAGAAAACAAATTGAAAAAA
-AACGTCAAAACATAAACATTTGGAAAATATAAAGGTGGATATAAAAACGG
-TTTCTTTCTTCTGGAACATTCATTTTTAACCATTTTCCTACATATTTTCA
-CGCTAAGCCGGAGCAAAACAGAGACAGTCGAGACTGTCAAAACATGTAAA
-ATATACGTTTTTTGGTATACCTATTTATTAACAGGTGCTCCCTTTTCTCT
-AAAAGTTTAAATTTGTCGCGAAAAAATGCAAGAAATGTTTTTTTTCTAAA
-AACTAAAAACTCGATCAAAAATAATAATTGGGTATTTAAATATTCCGGAA
-TCTCCATTTTCTTCCCGTTCCTGCCCTTCCATTTTTTTCTTCCTGCACTT
-ACTCGAGTATTCATCCTCTTCTACTGCTGCCATAAAAGGTCTTCCGCTTC
-ACTGAAGCCTTCTGCACAGCAGCGTATCCTCCCGCTTCATATCTCGTTGC
-TGAACTCCATATAGCTTGTTATAGCTCAGTTTTAGACGGATTTAGGTTCG
-AATTTCTGTAGGGTCTCTAGGAGTACTGTAATAAGTGATGTGTCAAAAAT
-TTGGCCTAAACTGTCATTGCTATAGATTACGGTGATAGAAATTTGAATAT
-GTATGAAATAGTGAAAAATCAGTAGACTGAGCCTTACTCAAATTCACATC
-CGTTCGAGATATTTCTGAGTTCTGAATTTCTGTTGATTGCAATTGCCGTA
-ACTTATAGCAAGGAAAGAACAATTTGAAGCCGAATTTACGGCACAAAATT
-AGTTTTGGTGCTTCTAGAGCCTATTTTATAAAATATATACTTGACACGTG
-GCTTTTCAATATCACCATCTCAAGAAATTACCACAATCGTTTCAGGTGCG
-AACAAGAGTGTGGCGAGGAGGCGTGGCGAATCGCGTGCTGCTCACGAGTC
-GGGAAGATCGCCATCCTTGTCATGTCAATCATTGTATTATATCTTATCAT
-ATCAGGTTGGTTTAAATACATATTATTCAAATTTATCTGAGTTTACACAA
-TGAATTTTCAGCATTAACGCCCTCCGAAAGCACACACAAGACGGACCTCA
-ACGAGCCGCGGCCTGGTATTAATTTAACAAGGTGAGAATGTTGGGAACAT
-ATTACTATTGTAGGAAATTGCTCGATAATTCCACACTTATTGAGTTCACA
-ATTAATTTCTACTATATTAACTGTGTTTTTGGTAAAGAAGTATCACTTTT
-TCCCCTCCCAACTCCGATAATTCGGCATTCCTAGAGTTTTAACACAATGT
-TTTACGACATACTTATGAAGAGTTGATGCAAATCGCAAAAAAAAAACAGA
-AAAATAACTATTTTATGAATAGTATCATTATCGTATGGTGTCGTCAAAAT
-GTTTTGTTGTTTTAGTTTTTTTTTACTCGAAATTTTCTGAAAACACCGAA
-TTTCATATTGAATCAAATTTCTTGATAATTTATTAGACATTTCGATTTTA
-CAGAGCCAATCAAGTACTCACCGGATTATGTGATGCCTATGAGCGAGGAG
-ACGTTTCCGGAGACTCTTGTAATCGACTTTGCTATGATCGAAACTGGCTT
-GTCACTGACTTTTACGAAGGGCACAAGACTGTGGTCATAGTGAAAGATGG
-CGGACAGATTGCTGTCTATAAAAGCACAAAACCGTTTATGGATCAATTCG
-ACGAGCCGAAAGACCATCTGACGGATGCAGAGTTCTCGGATCGAGTAGTC
-GATATGGTGAATGATGAGCTGAGACTCGGATGGCCGAAACACTATCGACG
-GCATTTAATGGAGACTGTGTGGCCGACACTGTTACGGACCAAGGGAGAAG
-CCATGTCGAAAGCGGATCGACGATCCTTGTGGGCTTTGTTAAAGCAGCCT
-GAATTCATCCTGTTCCGAGTGTTACCGTTGACACGTGTCACGCCGAAGCT
-CATTGGGACGTGTGGACATATGTATCAGACTGAGTCACTGGTGGCGTTCA
-AGATGAAAGGGTATTATACGAATTTGAAGGTGGGGATTTTTTTTTAACTT
-GATTTTAAAAAAAAAATTTTCTCAATCCAAATTTACAGGCAAAAATCTTG
-GTGCATGTCATGGGAACCCTGAAGCTCTTATACGAATTTCTCGACGAACC
-CCTTCAATGGTGTGATGTTCGATTTGATAATCTCGGGTTATCAGCAGATT
-ATCCGAAAAGGTAGGTCTGCCTGTTTTTTTATTTGATTTTTTTTTCCGAA
-AAAATCTACATTTTCAATTATTCGAAACGTAATTCGAATAAAAGTTATTA
-ATGATTTTTTAAACAAAAAAATTGATGATAATCCAACCGGAAACTCAAAT
-TTTGAAAACCCCTAAAAATCCAAATTTCTCAATTTTTCTGCAGATTCGCT
-CTAATGGACGGTGACATGGTGTACACGAAATCGAAATTGGATTCTCTCCT
-AAAAGGACGTCCGTGTGAAAGTGATAATGATTGTAAAATTGGAGACTGTG
-AGGCGAGATGCACTTCTAATATGGTGTGCTCGTCGAGGAGTAACGGGAAT
-TTGGAGGTAAGCTTGAAAGTTGAAAAAGTTTGGAAAAATTGTGAAAAATC
-AATAAAATCGGCAAAAAACGAGCTTTTTTCCAGATGGCCGAATTTTTCAT
-AGTTTGCAAAAGTTCGTCCACCTGTGAAAAATTGCTAAAAAAGCAACAGC
-ATTGATGAATATTCATAAAAAACCAATAAATTCGACAAAAACCTTTTTGA
-TTTTTCCAAAAATCGAAAATCACATTCTGATGTTCAAATTGAATTTTCAA
-AAAAAATATAGAAATTTCCTAAAAGTTTTAATTCTCAAAAAACGAACGAC
-TGACAAAAAATTTTTAAAAAAGTGAATTTTCCGAATTTTTTCTAAAGAAA
-AACTGAAAATTTGAGAATTTTCAGTCAGAAATGTGATTTTTTTTTTGATT
-GAAAGGAGTTTATTTTGTAGAATTTAACTTCCACTATCAGAAAAAAATTT
-ACCTATTTACTTTGTAATAGGAAAAAAGTTGTGAAATTGTTAGGAAAATT
-TTTTTCAACTTTACAATTTCCCGGACAGGCCTGTAGTTCCTTTTTTTCAA
-AACGTAAAAGAAAAAATTAATTAAAAAGTTCAAACTCCTAGAATTTATAC
-ATTTATTTTGCATTCTAAAAAACAAAGTTTTTCTTGATTTTTTTGTGTAA
-AAATTGAAAAAAAATCCAAATTTTGTAGGTCTTCTGCGATAAACTGGTCA
-ACAAACTGTTCGCAAATCAATGGTCCAAAAATAATAAATATTTGGTCGCA
-TGCCGGGATACAGGACGAAATATCACAACTCGACTCAACGAATTACGGTT
-AACATGGTCATGGAATCTGCCGGATGTTTAAAGGAATCTAGCTCAATTCT
-TTCTTTTTTTTTCTTCTACTCCATGTGTCAAAAAATCCCCGTGTCTTATA
-ATTTTCTGGTGCTTTTTTCCATATTTTCCTTTTTTTGTGTTCTGGCTCAT
-TTTTCCATGGCTCACAGAGCCCGAAAGCTTAGGATTTTGAAATTTTATTC
-GTTTTTTTCTCATAATTCTGTCATCATTTTTTGCTCTGCATCATCATCAT
-CATCGTCAACATCATCGCGTTTTATTATGGGTTCATGTATTATTACACTT
-TCCTCGAAAAAAAATTTTGACGAACGTGTAATATGTTTCACCTTGTCTCA
-TTTGTACCTCGTTCATTGTTACGGGTTTGAAGTTTTAAAACTCTGAATTT
-ATATGAAGAATTTTAATTTAAAAAAAAACTTTGTTTCCTTTTTTGAATTT
-TTACAGACAAATTTTTGGCTTGAAAACTGAAAAACCCTGACTAAACTTAC
-TATTTATGTGTTGGGTATCAACGTGTATTGACCCACGACGTGGCTAAGAA
-GATCGTACAACGTGAACTCTATGAACTAACTTATTTATTCCTTAGTTTAG
-TAATGTAATAAACTACTCGTCTTCTCCTCCTCGTCTCGCCTTCGAATACA
-CAACATTATGAAAAGAGTTTTTCTTAAGATAAAAAATGTTCTAAAAAATC
-GATGGCCGAGTTTCCTATTTACGCGGCCACAAGACCAGTAAAAAAGTGTT
-AACACAAGTGCGAAAACTAGAACATTTATTTTCAAATTTCACCCGATTTC
-TACAAAAAATCAACAAAAAAGTCACAAAATTTAAAATATGAACATAATAA
-TCAATATCCCGCTGGCGCTGACTCCTCCCCTTTTCGGAAATCACTGTTCG
-CATAGATTTGGCCGTCGGAAAGTCGTTCGGCGGCGGTGACAACTGTCAAA
-TTGTTCACTGCCTTCATTACGTGACCACGATCGATCAGGGATTTCACGTA
-GGCTTTCGGGAAGTTTGGCTCGTACCACGTGTAATTTGGCTAAAAAATAA
-GGAAATTGGGAAAGGTTTTGATTTTATTGATTGAAAAATATTTCATGTGA
-AAGTCGAAAATTGATTGAAAATTAAATTCAGAAGTTTTTTTTCTGAAAAT
-TATTGATTTTTATTTTTAAAAAATCAACTTTTTGACAATTATCGATTTTT
-CCAACAAAAAAAAAATCAAATTTCGCGTGTAATTCTCTACCTGTAACTGA
-TTGTGCATCCTTGGAGCATCAACAGCTTGTTTAACATCTGCTTTCAGCCA
-TAACGCATGCAGTGCAACTCCAGCAACACCCGAAATAATGGTGGATCCAC
-CGGCTCCGCCGACCGCCATAAGCTCCGCCCCTTTTGTGTTAAAGATCACT
-AATGGACTTTGACTACTCATGGGGCGTTTTCCAGGGCGAATGAAATTGGC
-GGGAGACGGTGGGAAACCGAAGAAATTCGGATGACCGGGAGTGGAAAAGT
-CGTCCATTTCGTTATTCCAGAGAATTCCCGTCGATTCGGAGGATACTAGG
-GCACCCAGGCTGGAAGAATTTGAGATGGTGGAAGAGTTTTTTTGGCGGTG
-GCCTAGAAAATGTCTTCATATCCGAAAAAGTCAAAGTGATGGCCTAGAAA
-TTTAAGTTTGTGGCCTATAAACTTGAACTGATGGCCTAAAAATTGAACGT
-CGTCCTAAAAATGTTTTTAACTGATGGCCTAGAATTGAAAGGTGATGGCC
-TCCAAATTTCAGGTGGGCGTATATAAACTTTGGTTGATGGTCTAGAAATT
-ATACACGTGGCCCAGATTATGAAATCACTTCGGTATAAAATCCAGGTGGT
-AAACAATTTACTATTAAGACTGCCTAAAATCATCCCCTGGCCTAATTAGT
-TTAAAATTTTTGGTGACGACCTCGAACTTGTTCATTTTTATCAACTGCAG
-TTGCTTGTCGACTGAGGACTAACTTCTCACTTGCTGGCCGAGTTTTCGAA
-GTTCGGCCACCAAAAATTTCCTTTAAAAAAGCCAAACTCACTATAAGTTA
-ATGGTAGACGTAACCGAAACTGCATTGCCGTCTGCATCGATAATCGATAC
-ATGAGTTGTTCCATGATCCTGCGGTGGTGCTTCAAACGATCCTCCATAGT
-AATCATCAGGATGCGTCGTGTCTGTGATCTTCGACCTAACCCAATCCGCC
-CACTCTTTTGACGTAATATTTTTGGCGATTTCCGTGGCGTTTGCCACGAA
-TTGCGGGTCGCCAAGCCAGCTTCTAGCCGCATAACTAAATTTGCTAGATT
-CCAGAAAATGATGGTATAACGTTGCGATTTCGTTGAACGACTTCATGTTA
-TATTCGAAGCCATCCATCACGTTAAGTATTGCCTGAGCCACCGCTGAGCC
-CGAGGGAGGCGGCGGGCCGCAGACTCCGCGCCCGTTTTTCAGCTTTGTGT
-AGATCACATTTTTTGAGTCGTGGACTATTGATTTGTAATTTTTAAAGTCC
-TGAAGCCGGATGATCCCACCGTTGGCTTCGAACTCTTTGGCGAGTTGCTC
-GGCGAGCCGACCTGTATAAAAGTCGGCGATGGGATCTGTGGAGTTTGCGA
-GTAGCCGGAATGTTTCTAGAAGGTTTTGGCGGGTTTTTATCTGCTCTCCT
-GGTTGGAAGACACGCTGAGTTTCGGGGTTGATGAAGTTTTTCATGGTGGG
-CTCCGCGCGGATTTGGTGCTCGTTTTGGTTGAGAGCTTTTGCAAGGGCAT
-GGGACGTTGGGTAGCCTGGAATTTTTTAGGATGGCCTAGAAACATGAACC
-GATAACATAGTTACTTATTTTGTGACCTCGAAATTTTCATGATGGCTTAG
-AAATTTTTATGATGGCCTAGAATTTTTATGGTGACCTAGAAATTTTTTGA
-TGGTCTAGAAATTTTTAGTAATGTAATAAACTACTCGTCTTCTCCTCCTG
-AAAAAATTTGGGCCCGTCTCCCTTCGTGGTGAGACCCATCGTGGCGAGAC
-CCATCGTGGCGAGACCCATCGTGACGAGACCCATCGTGACGAGGCCTATC
-GTGGTGAGACCCATCGTGGCGAGACCCTCCGTTGAGAGACCCATCGTGAT
-GAGACCCATCGTGGTGAGACACGCCGTGGTGAGACTTATTGTGATACCCA
-TCTTAACGTACACAGTAATTGGAGAAACTTTTAAACTGATTTTTACAAAA
-AGTTCAACATTTAACTTACCAAGAGCTCAATATTCCGTTGCCTCGCTTTT
-TGTTGCCCTCAGGGATTATTGTTCTGTTGCCTCCATTTCCGTTACCCCTG
-TTGTGTTGCCTTCGAGCAGCGTTGAATCCGTTGCCCCCCCCCTTTTTCGT
-TGTCCCCGGGGAATATTAAATCCGTTGCCCCCGTTATCCGTTACCCCTAG
-GGATTGTTGGCCGGTCTAAAAACGGCCACCAGAAAAGTTTTTGAGCATCA
-AAAATGTTCTACGCCGTTAGGAGTTTTTTAGGCCAACAGAAATATTCTAG
-GCTCGCAGAAAAAGTGCCCACCTTCAGCCAACAAATCAATAGTTGGTTTC
-AACAACTGTCTCCACTCGACTTTTCCACTTCCGAATCTCTCGAATTCAGT
-CCGGAGGCCGTGAAGCTCTCCGGGCACCGCAATCGCCTTCCATCCGATTC
-TCGACTGATTCCATTTGTCACGGTACATTTCCTCTGTTGCGGCGAGCGGA
-GCAATCTCCCGAGCATCGATTACCGTACACTCTTTTGTCGTTCTGGAAGA
-ATTTTAGAGGTTTCTAAGTCATTGAAAATATTTTTAGGCCACGGCAGAAG
-TTTAAAGGCCACACGCGCTTCTGGCTTTCCTCATATTTTGAAATGGAAGA
-GTTTGCCGAGTTAGCCCGTTTGGACTAGGCCACGACCGGGGTAAATTTAC
-GGAGCGTCGTGTAGACGATTGTCAATGGAGCGCGAGAAAAACGCTTTGAC
-GAAGGCCAGAAACCAGTGAGGCCACAATGTGATGTTTGCAAAAATGTTTT
-TAATGGCCTAGGAAAATCATTCTTTCTTCCAAAATTTTTCTTCTTTGTTT
-TCCTTTTCGATTATTGATTTTTAGTTGAAAAATCAATATTAATAATTATC
-TTTTTTTTTAATTATTGATGTTCCGCTCCAATTCGTGGCGAGACCAACAA
-CTCACGCATTATAAATAGTCATAAAATGTCCGCCGCCAATTCCGGCCGAA
-TGTGTATCCATTACACCGATACAGAAAAGTGCGGCGATTGCCGAATCCAC
-CGCATTTCCGCCTTTCAGCAAAATATTCCGACCGATTTCTGAGCAAATTT
-CGTTGTCGGCGGCGACGGCGGCTTTCGAATATTTTCCGAGTGGAGAAAGT
-GATGGTCCAGGCCAACGGGGTAGGCGGGCATTGTTCTGGAAACCTTGCCG
-AGTTTTATTTTTATCGGCCACGTAGCAAATCGGCCAGCCATGAACCGACT
-GCGGACTAGTTTTCACCCTCGTGGCCTAGCTTTCTAACAAACCTGCATTA
-GTAAATGAAAATACAATGAAGCGAATGCGACCGTTGAGATTAACAACGTG
-AATACGAGAACCGTTAAGCCGACCGCCGCGACTAAAGTACGGATTTTCAT
-GGGTTGCTCGGCCTCGATAAGCGGCTCAACTTCATCAAATGGTCCATATT
-CTGGCGGTAAATTATCATCGTCCGGAAACGTGTTATAGTATTGAACAGGA
-GGTGGGTTACTGCTGAAAAGTCGAGTTTTGCGCGTCAAATTTGATGTATT
-GAGTGGCATGATCACTATTATTACAAGACCGCGAAATTTTGAGAATGCGT
-ATTGCACAACATTTTTGACGCGCAGAATATCTCGTAGCGAAAACTACAGT
-AACTCTTTAAATCACTACGGTAAAGCTTGTGTCGATTTACGGGGTTTCGG
-TTTTTTCATTTTTTTTGTGTTTTTTAAAAAACAATTTATCGACTAATGAA
-TGATTTCCGTAAATCGACACAAACACTACAGTAGTCATTTAAAGAATTAT
-TGTAGTTTTTGCTACGAGATATTTTGCGCGTCGAATATGTTGCGCAATAC
-GCATTCTCAGAATTTTGTGTTGCCGTAATAATTCTGATTTAAAAATGGAA
-TTTTCAAAAATCAGAGGTTTCCCAAAAATTTGAATATTCCACAAAAAAGA
-TGAATCTGAAGAGTATTTTCAATTTTTTGAGAAAATAATCGATTTTCTGG
-ATTAAAAAATTTGAATTTATAGATTTCTAGATTCTAAAATTTGAATTTGT
-GCAATTTCAAACAAAAATGTATCGATTTTTATCGACTTTTCATAAAATTT
-AATTTAATTTTCGAAATTCCGAAAATATTGCCCGTTTTTCATATACCAAA
-AAAGTTGTATCAATTTTTTCAAAAAATTAAATTTTCATCGATAGTTGTTT
-TCAAAGCATCATGATTTTTTTGAAAGAATTTGCAAATGTGAGAACTACAG
-TACTCCCTTAAAGGCGCACGCTTGTTTTTATTTTTAAAAAATTGGTCGTT
-TCGAGACCTGGTACCGTATTTTCGCATTTGGGTAATATTTCCAGCATTAT
-AAATTTAAAAACAATGCACTTTTTAAATCTTGAATCCATATATATATTTT
-TTTCAGAAACTCATGCCGCCTCGTTTGGGTCTCGATTCGAATTTTTTTCA
-CAAACGTATAATATTTTCTCGAAAAACCCGCGAATTTTTAACATTATCGA
-TTTTTCTCTCACCTCGTCGATTGCCCTTCAGGAGTCATTATTCAGAATTG
-AGTATGAATTAAAAAATCATAGAAAAAGTCAAAGCGCTGTCAATTGGAAA
-TTTAGGACGAGAATGTCAAAATTGCAACTTTTCACGATAACGGAATTCTA
-TCGCAAAACTAGATAAGAGCTACAGTTTGCTGCGTGTAAGCGCGCTCCAA
-TGACAAACGAGAAGAGAAGAGAAGAGGGGGTAACCGCCAATAGCTCTCTT
-TATCGAGGATAGTCTTCAAGTGACAGAAGAGATATTCTGTGGTGGGAGAG
-AGTTGGGTGGAAGGGGGAACAATGAGGACTACGGAAGAATGACTTTTAGA
-TTTGGAGTATAGGAGAAAGTGGAGGTTTTGGCTGAAATTATTTTCAAAAA
-CTTTAACTGTAACAACTAACGAGTAGATTTGAAAATGAGGATAATATTCA
-ACACAACAGAAAAAAAGTCGATAGGTAACTAATAAAAATTAGAGAAAATG
-TGGCATCGGGGAGAAGTGGTGGAACAAAAGAAGAAACTGATGATGATGAT
-AGGAGGATAGCCGCGAAACAAGCGATTAACAGTGAACAAGATTCATTTCG
-GTGAAGATGGAGAAGATAACAGCAAAAAAAAAAACACAACAAAAGTCCTT
-ATTATTGCCCATTGAGAGTTTGTTGAAGGACACTGGTAAGGTGCTCGTCG
-ATTCCATCTTGCTGCGCGAATTGTGGGAACGATGCGTAGATTTGCTTCAG
-GATTGTGACAATTCTTTGCTTGGTTTGGTTGCCGCTATCGTCGTCGTTGA
-AAGCATCGTTGGCGATTGAGAGCAAGCCTGAAAAATACAAATAAAAATAA
-AATAAGTTACGGATTTTTTTAGATTAGAACTTACAAACAAGGAAGATTCT
-CGGAAGATTCTGATTTTCTGGTCCAAAAAGTGCGGCGTCTTGTTTATCAA
-ACAATTCGGCGAGACACGTGTAAATGTAGGGGCTTTCCTCGGTGTCTGAA
-TATGTTGGCAACCAGCTCAGGAACATCTCGACGACCTGGAAATAATATGG
-AACTTTTTTCTTGAAAAACTGAATTCTAAAACCAACCTTTCCGTAGGCTT
-CAGCAGGAAGTGGCACATTGCCGATGATTTTGGCAAATGCAGAAATCGCG
-TTTTCCGTGGCAACAGTGCTCTCCTCGGTGGCTCGGGCGTCCTCTCGTTG
-AATCATGGCGGCCAGTGGCTCCAAACAGCTCAAAATCTCGTTTCGGTAGT
-CGCTGATCTGGTGGTAGTTGATGGCCATAACTCCGAAACCGTAGCTCGCT
-GCTTGTCTCACTTCAGGATACTCATCTCCCAACAACTTGTACATTATTGG
-AATAAGCTTCGGGAAGCGAGTTGGCATATGTCCGACACCGAACTCGATGG
-CGTCATCGAGAAGGCACATTCCCCATTGTCTCTCGAAGTATTGTTTGGAT
-CCCTCGATGAGTTGAATGGCACAGTTGAACACGTTGATCATTCCCTCGAA
-GATAGTTCCCTTGAACTCCTTCATAAGAGAGTGAGTCAAATCAGAGATGG
-CTCCAAGGCATGAGGCCTCCAATTCCATGAAATAATCGAGCTCCTCCTTA
-GCTTCAGCATCATCGTCATCTTCATCTTCAACTGGACGATCGCTCATTCT
-CTTTCCGTAGTTTTCAAGTTGCTTGAGAAGCACCGAAATGATGAGTTGAA
-CCTCTTCCTCGGCGATTCCCTCGGTTTTCATAACCTCAATGCACGATCCG
-ATGGTCGTCATGAACGAGGCGAGAATCTCGACATCGTCCTCCTCCTCCAT
-AGAGGTCGTCAATGCCTTCAAGAACTCGCACCACAAACGACGCTTGTCAG
-CCAATCCTTGCTTCTCAACACAGGTCAACAAGCATGGCATGATTTCAGCG
-GAAGCCGTACGAACTCCGTCGTGAAGTCCGAAATCGAGATTCTTGATGGC
-GAGCTCGTAGACGTCGACGACGTATGGCATGAAAGCCTCCTTCATCTCCT
-TGGCGAACGCGACAAGCATATCGCAAGCAGTTGCCTTCTCCTCAAGACCG
-CTGGTGCGGATTCCGACAGTCTTTTCTCCTCCGATTCCGTGGTATTCAAC
-TCCTTCCTCGTTTTCGTGAACATCTTCGTCTGAAATTTATATATTTTTTT
-AACACGTAAAACTAAAAAACACTCACTGTTGAAGATATTGAAGTCTGGGC
-GGTAACGAGCGGCACGAAGAACTGGATCCATGACAACTGGGAGGAATGGT
-GCGAAATCGGCTCCAAGAATAGAGCAGAAACGAGTCCATGAGCTGATCAT
-GTAGCTGTATTGTGGATCATCGATAGCCAAATCCTTCATTCCGTCTCCGA
-GAAGGTTCAGGATCTCGATTGCAGTAGCGTGGAATTGTTCCTTTCCGACA
-GCATATCCGATGAGAGAGATGCATTCGATGGTCTTTCCTCTCAACTCCTT
-GAGCTCTCCGACGTTTTGAAGAATGTGAACGAGGTTCGGGATGAGGCGAG
-CATGATGTTCCTTGAAGAGCTCCTCGGCGGCTTCAGCGACGGAGGCGATG
-GCGGTGACGATGTTCTCAACGACAACCTGGTATCTCTTGTCTCCGAGACG
-ATTGAACACAGCGGAAAGCACATTTTCGAGTTTCTGAAGAATGAATGGAA
-GATATTGTCCAATGATGCTCTTTGGGCACTCCTCGGCAAAGTTGACAAGA
-GCCGAAGCGGCATGAGCACAGACACGTGGAACATCGGTTCTGTCAAGAGA
-CTCGAGAAGAGCTGGTATGACGGCGGCGTGGCACTTCTTCTGAAGAGTTG
-GAGCGAAGTCAGAAGACATTTGTCCGATGGCGTTGCAAGCCGCGTATTGA
-ACTCTTGGATGAGCATCATTGACGTAATTGGTGATATGAGCCATAATTTG
-CTCTATGTGTGGTTCCATAGATCTTTGGCACCCTTCACCGACGGCGGAGA
-ACGCGCGAAGAGCCGCGTGCTTCATCTTCCAGTCTTCGCTGGTCAAAAGC
-TTCTCGACAAGTGGAAGGAACACTGGGAGCATCACTTTTCCGTTGATGCA
-GCAAGCAACACGGTCGATGGCGCTTTCGGCGATGATTGGGATACTGAAAA
-ATAATTTAATTGAAGAAAAACTAAAAATTTATCCTTACTCTTCATAGTCT
-TCTTCCTCTTCGATCTCGTTGAGCCACTCATTGAGCACATCGTCATCCAT
-TTCGGTCATGCATGAAAGAAGAGTCTCGAGAATTGGTCCAAGAGCTCCTG
-GTGCGTATTTCTTGAGTCCTTTTGGTGCGGATTCCATGTACGAGCAAATA
-ACTTCGATGGCGTTCTGACGGACCATCTCGTTCTTTTCCTTGTTTCCAGC
-AATCTGAAATTTGAAAAAATGAAATTTTTAAATTGGGCCATTTAAATTAC
-TTACAGCAAGAGTGACTTGAAGAACCTGAGACATATGAGTGTTAAGGCAT
-TTTGGCAGAGAAGAGGCGAGCTCGGCGAACTCTCCGAGTGGTCCATCTGA
-ATCATCCTCGTCGCTGGTTTCATTGCAAACTTGAAGAACATTTGGAACAA
-GAGAGGTCATAAGCCTGACAACATCCTTCTCCTCATCATTATCAACAGCG
-AAAGCGATAACAGCACGGACGGCGGTGGCCTTGATTTGCAAATCCGGTGT
-AGCCATGCACTTTTCCAAGACAACTTTGAGGGTTGGAAGGAAGTGGGCCA
-GCCTGTTTCCAAAAATTATTGGGCATCCGCGAAGAATAAGCAGGGCTATG
-TAGTTTCCGGTAAGATCCTCGCTCTTCAAACAATGATCCATCAGCTCGAG
-GACTCCTCCCCATGTCATATCTCCAGAATCGTCGATGAGGTTTGAAGCGA
-TTTCAGAGATCAAATCAGCAATCTTCTTCTTAATCGAGAGTTCGGTCTCG
-TGAACTATCATCTCGAGAACTTTGGCGAGAATGCGCTGTTTGTTCTCCTC
-GTTCAGCGTTTCCCAAATCGCATCCCAGTCTCTGGCGAGAACTCGTCGCA
-GAAACACCAAAACTGTGGATCTGGCCTGAAAATCGAAAATTCATGGAATA
-TATAGGAATTTGAGTGAACTAACATCAGAATTATTCGTGTGGTGTGTGTA
-GGCCTCGAAAAGTGCAGCTACTTTGGTTGGTCCTTCAATCTTTTCATAGA
-CTTCTTCAGCTTGTTTTCGGATATCATTGTCTGCTGACTGCAGTTTTGTG
-ATGAGCTCAGTGAATTGATTGACGTCCATTGTAGGGAACCCTGAAAATCA
-GAATATGTGCTAAAAATTTCAAAATTGAGAAGGAAAAAGATGAAAGCGAG
-TCGGTTTTGCAGATAAACGCCTGGGGAATACGCGGAATCGCTGAGGAAAA
-TAGATTTTTAGTATAAAAATTGGCATTTTCAACAAAAAACCTATCGGAAA
-ATGTGAAAAATAGGCCAACAAATATTGAATTTTGGGACAAAAACGCCTCG
-AGTGCACGATTCTCAACGGAGCGCACTTGCTGCGTCACACGCACTTTAAA
-CTGTACACGGCGGGAAGTTCAAATTTTAAAAGGATTCACGTGATTTTCAC
-GACATTTACTGGTTTTTTCAGCGAGTTTTCGCAACTTTTCGGCGACAACC
-GATGATGATTTATGTTTGGAATATGATGATGGTAGCGTGTTGCGAAATAA
-AAAATCGATGGAATGAGTCAGCGAGAAACTAATATTTGCATAGAGAACTG
-TTTGCAATTTTGGCATTACATTGGCCAGTGCACTGACAAAAAAAGAAAAA
-AATAAACGGCAAAATCTCTAATACCTATTCCAGGCAACCAGTGTCTGGCG
-ACGATGGAGAGTAATTCTGAAAGAGACGCAGTTGAAAAGAGTGTGTTTTT
-CGCTTTTTTTTTCAGACAGAAGAGTAAAAAGAGTAAATACGTATCAGTAG
-TAAAAACAATGTGCGAGCTGGGAAATCAGTAATAATTAACTACTTGTGAT
-ACAAATTCCTCAAGGAATGAAGGAGAAAGTGTACTTTTTTTGAGACCCGA
-AGAACTCGGGGGATGTCCAATTGGGGGGATTACCAACTCGGGGGATTGGC
-CCCGCCCACAGAACCGTGGCTTGCAATACGCCCATTTCTGCAACTGCCGC
-ACGGTTTTAAAACTGTATTTTTCTCAATAGAGCGAGAATTAACAAGAAAA
-AATAATTTTAAAACCGTGCGGCAGTTGCAGAAATGGGCGTATTGCAAGCC
-ACGGTTCTGTGGGCGGGGCCAAACTCCCGAGTTGGTAATCCCCCCAATTG
-GACATCCCCCGAGTTCTTCGGGTCTCCTTTTTTTTAATTTTGAATTGAAA
-AATTGTCCGAAAAGTGCAAACGTAGAACATCAAAACCAGTGGAGGGGCGA
-AATTTGATAGATCGCATGTTGCAAGAATGAGCATTCTACGAGTTTCGCGC
-CATTTCTGCGTAGCGCGCACAATATTGTGCAATAAATCTCGGTATTTGCG
-TACATGCATCATATCTTACGCGCAAATCATATTGGAAATTTCCCCGAAAC
-ACGGGGAGGCAAAGCTAACGTGGCTGAAGAAATTTCTACAGTAGTCCCAT
-TTGGCTGACTGAATATTCAACGCGAATAAGTTTTGTACACTATTGCGTAC
-TTTGCGTACGCGCATTTTATTTGACGACAATTCGTCAATATCAGCTCTGG
-CTAAAAGCGCTTTTCTCATTATTTAAGCGAATAAAAGTCGAAAAAAAATG
-TTTTGTGATAGAGAATAGTAATTTAAAAAATAAAAAAGTGCATATTTTAT
-GTTTCTCATTATGTTTCCACTGATTTTCTGAGAAAAACCGAAAATTTCCT
-CTTTTTTCGATGAATTTCAGCTGAATAGTTTGTTTTTATCTAGTTTTTCT
-TCCGATTGACTGAATAACACATTTAATAACATCAATATAACGTTTAAAAC
-ATTCATTGTCTCGAAAACCAATATAAAACTCGTCAGAGAGGGATACTTAG
-TAGATATGCTGAACAAGGAAAAGAGAGAGAAGAACATTAACCGAATGGGG
-AGGGGGGAATAAGAAATCTGAACAGGAACGAAATATAAAGAACATTATTA
-GAAAGAACAAGCATGGCTTGATCTTCTTGGCAGTCGTCTCCTTATCCTAT
-CACTTCTTCTCGGCGTCCTTCTGATCATGCTACCGAGCAACGTGGCACGA
-TCGAAGAGTTTCACAACGGTTTGATACTTTCGCTCCACGAGGGGGCTCCC
-AATTCAGCGAGGGTCCTCTCACGAAGTTTAATTTTTTAAAATTAAAAAAT
-AAGTAACACCTCAAGAATTCCATCGAAGTTGTGCTCCTTTGCAATAAGAC
-GAAATTTTTTTTTACGGAATTGAACAGGATCATTGAGGTACGGCATGAAA
-ACGGCTTCCTCGTTGAACGATGTTGAAGCTCCTTCACCATTGCACCTGAA
-AATCAACTTCTAAATTTTCCAATTTAAAGAAAATCCACATACTTATCCTC
-GGAAACGAATCCAATATTCTGGTTGCTGAGTGGAATTGCTTCAAAGATTT
-TGATCAGATTTTTTTTTGAAATTTTCGATCACACATCTTGTATCCACCAA
-ATCGCCGAGTGCTTCATGAACTTCAGACTCGTGCTTTCCAACCTCTTCCA
-TGAGCTTCACTTCTTCTGCTTGGAACTTTTGATTGCCTTCGGACCGATCT
-GACTTGTAGTTTCTTCTTAAATAGTGGCTGATTGAGCAGTCGACCTTGCA
-GTCCTACCTTCTTTGGCTTCTTCTGCGGCACTTGAGCCCTTGTAAGAGCA
-CTTATTGCTGCTTAACCTTCCTTATTAATACTTCGAACAGCTTCTTCTTG
-TTCGCATCTATTTCGAATTTTGTCTTGAAATCTTCCAATGCAGCGACAAC
-GTAATATCTGGAAATTATAAAAACATTAAGAGAAAATATTTTGAAAAAAA
-ATCGAAAATTGCACTGAATTCCTAAATTTTTTATTAAAATCGAAAAAAAA
-AAATGAAATACGTGAGATTGAGTTTCGAGACTTTTTTATTCAGAATCAGC
-ATATATTTCTCCATATTTGAGTAGGTTTTCAGAAATATTGTACCATAATT
-TTTGGAAAAATGTAATTTTTAATTCGAAATTGCACTGAATTTCTCGAATT
-TTTCACTAAAATCGAGAAAATAAATATGAAATACGCGAGATTGAGGTTCA
-AGACTTTTTAATTCGGAATCAGCATATATTTTTCCATATTTGAGTAGATT
-TTCAGAAATATTGTACCATAATTTTTCGAGATATTTTGAATAATAACTTA
-CTTTTCGACGTTTTTTGCCTTTGTCCGGTTTAATCCATCGAATTTCGAAG
-CGGTTTGCGTAGATTAGCTGAAAACATTATGCTTATTCCACGTAGTAACA
-AGAAAAAACAAGAAAAAATAAGAAAAAACGAAGAAAAATAAGCATATAAG
-TCAAATTAAAAATGTTTATTCGATCAAAATTCTTAACCATAGGAGGCGGT
-GGCTAGCCGGCGCACTCTCGCGGCCACGTTAGCTTTGCCTCCCCGTGGAA
-AGGAGCCATGATATTACGGAAACACTATTTGAATTCTGAGAACGCGAAAT
-ATCTCGTAGCGAAAACTACAGTAACCCTTTAAATGACTACTGTAGCGCTG
-GTGTCGATTTACGGGTTCGATTTTTAAAATTATTTTTTTTGTTTTTTGTG
-TGCGTCATCGATTACTAAATTATAAATTATTTCCGTAAATCGACATACAA
-TCGCTACAGTATTCATTTAAAGAATTACTGTAGTTTTCGCTACGAGATAT
-TTTGCGCGTCACTCCTTCAGGCACCACATCTTACACTCAAAATCGAGGTG
-AATTTCTGTGTATTTGACAGCAAAAATGTCGTGAAAAACAATTAAATAAG
-GCAATTTGAAGAGGAAAAAACTGGGGCAGATGTGAGATAAGAAGAAGAAG
-AAGCGGGGCTTCGACAACCGTAAACTAATCAGAGATGGAAAGTGAGAAAT
-TTGAAATTTAAGACAAAAAAGTTAACAACGGGGGATTTTTTTTAGAGAGA
-AAGAGCGAGTAATCGGGCAGCAGCAGAGAAAAAAAAAGATAATAAACAAT
-TGAAAAAATATAAATATCGGGGAAATTATTGCTGAATAGACTGCAAATAG
-GTGACAATCTCGGGCGGTACAGAACGAAGTGTCTCTGGACAATTTCCGGG
-TCCACGGACAAGAACGGCCTGCGCAAAGTAGGCCTTGTGGTTGGCGATGT
-TGGCGGCGACGGGCGGTTGCTTGGGAGCGTAACTCAGACGACAGAATGGG
-TTCACAAATTCTCCCTCGGCGTTGTACATTGAAGCTTGCTCTTCTTCTGG
-TGATAGGACGGCTCGATCGGAGGCTGAAGCAGCTTCCAGCAGCATTGCCA
-CCTCGTATGACAGAATTCCGTATTGACCACTGCAAAAAAAATTTATATGA
-GAAATTGAATTTAAAATGATTTTATTTGTAATTTTGTTTTTGTTAATTGT
-CGTTAATTGTTTTTTTTTTGAGAAAAAACCGAAAAAAAAATTAAAATCTT
-CATTTTTGATTTAATTTTTTTGTTGAAAAATCGGCAGTTTTCGATTTTGT
-TTTTTTGAAAAAATAGGGAAAAGTCGGTAATTGTCGATTTTTCAAAAAAC
-TGAAAATTCCAGATTTTGTCAGGAAAAAAAACGAAGAAATCGACAAAATT
-TCAATTTTATTTTTTTAAATTTGTGTTTTTCAAATTTTTTTTTGATATGT
-GATTTTTAACTTTTCTCTGGAAAAAAACCGAAAATTTGCAATTTTTCAAT
-TTTTTCCAAAAAAATCTTTAAAAAATAGAAAATTTTCGTTTTTTTTTCTG
-AAATATTTAAAAATTGTAACTTTCTATTTTTTTTAAACCCGTATTAAAGT
-TTAAAAAAAAAATCGGAGAAAAAAAAACTGAATCGAAAATATGTGATTTT
-CAATTTCCTTTGAAAAAAATATAAAAAATCGAAAATTTTCGTTTTTCGAT
-ATTTTTTCTGGAAAAAAGCCTAAATTTTCATTACTAACACAAGCTGCTGC
-GTGACATCGGCTAGCAAATTGCCCATTCCAATGGCAATAATCCGTTTCTC
-AGGCCCCGTTGTCGTTTGTTTCAGACCTGGCAAATCAATGCATACGACCT
-TCTCGATGAGCATTCCGAACATGCCAGTCTGAATATTCTCACACGATTGA
-ACAAGATCCTGTGCACTCCGGGCGATCGTAAATCGACACAAGAACACGAT
-GAATAGCTTCATAAACTTGGGTGTCTTCGACGATTGAACTCTTCGAAACA
-TTGTATTGAGCACAAATGTCATCGCGGAACCCTCGAAGTGCTCAATCGAC
-GGAAGAATCGTCGCCGCCAACTGGAAACCGTATTGATCCAAGGTTTTCGA
-GCCCAAAAGCCGCGCCAAATGGCTCAAGATCAACCCAGAATTCTCCGAGA
-CGACTCGCTGAGCATTCACGGAAAGGATCACTTCGAGAACCGAAAGTGCC
-GCTGGAACATTCGCTGATCTCGCCCAAAGACGTTCGGATAGCAGAAACGG
-AAGGAACGGTGAGAATTGATCGATCGATGAGTTTCTAGCGATACATGAGG
-AGACGAGAACTCCCGTGATTTGGAGAGCATATGGGATGAGATCTTCCAAA
-TCCTCGCGGAAGATCACTTCGATCAGTGGAAGGAGTTGAGCATCCAGTGA
-GGCGCCGATTGTTCGGGTCTGGAACAGGAAATTCGTTAAAAAATATAAAA
-TGTTCTTAAAATTGCTATCACTTTTTTTTTGAATAAGAAAAAAAATCACA
-AAAAGGAAAACACGAAAAAGCAGACAAATGTTTCGATTTTGCAATTTTTA
-ATTTTTTTTTTTCAGAAAAAAATTATCGATTTCTTCTTTAAAAAAAGAAG
-ATTCTTTTCGATTTTTTCGGAAAAAAACATCGAAAAATTGAAAAACAAAA
-AGTTTTGATTTTTTTTTCAGTGAAAATCGTTCAATTTTTCGGGGTTTGTT
-TCGACAAAAATAATTAAAAACTAAAATTTTTCAGTTTTTAGGTTTCTTAT
-CAGAAAAATTGAATTTTTTCGATTTTCCGAAAAATTAAAAAAAGGTATAT
-TTTTTGAAAACACGAAAACGGAAAAGTGTTGGTTTTTTGTAAATTTTTGC
-GTTTTCCAGCAAAATTGCCAATTTTTCCGAAAATTTTCAGATCGAAAGTT
-AAATTATCGATGTCTATTCCAATTTCCGAGTTTCAGCGAATTTTTTTTTG
-CAGAAAAATTTCAGAAAATTTGACAAGTTATGTTCCAATTTATGAAAAAA
-AATTTGAGACCAAAGTGCGGCACGGAAAAATGGGCGGAGTTTAGAGTGGT
-ATTTTTCTCTCAAACTACTCCTTACCTTGGTGATCAACACACAAATCGTC
-TCAAACAAAAAGTGCGTGTGCACCGAATCCGCCGGATTTTTCGTCGCCGA
-CTCGACCAACTGTGCGAGCTTGACCGCAATCGCGTCCGCATGCCGAATCG
-TGTCGTCATCGAGAATCACAATGATCCTCAAAATCGCCTTGATCAGATAC
-GGCGAGTTTTGCGCTTTGGCATCCTTGTCGAACGCGGTGACAAGGTTCTG
-AAGGATCGAGGAGACTGGAAGATTTTGAGCCGAGAAGATTTTGTTGGAAT
-CAGCGAGAAGGATCTTTTCAATAGCGTAAGCTGCGTACTTGTGCAGAATC
-GGAGTATTCGAGCTGAGAAGAGCGTCCGCCGACTTGATCGCAGTCATAAG
-GTGCTCTGGAGCCAGCTGTTTCCTGAAAGTGACCGCAAACTTCAGTGCAT
-CAGCTTTAAGGATCGGAGTTTGATTGACATCGGCGTTGAGATGTGTGGCC
-ACTTGTGTGATGAAGAAGTCGTTGATGTCCACCAGCGGGTTCGTCGCCGT
-TACTCCACTCTTAGCAGTCTCCGTCTTCACCGCGATCGCCGTGATCAGCG
-AGTAGACAATGTCGATCTTGATCCAATCACCACTTCCCAGCAGGTTCTGC
-ACGATCTCCCCCAGACATGGAAGCATTTGCGCCTCGAATCTTCGGCAGAG
-ACCTCGCGCAAGATCGATGGCTCCACGGCGTCGAGTTCCTACATCGGTAC
-CCTCGATGTCTCGCTTCATATAATCCAGTGGCTCATCCTCGAACAGTTCC
-ATATCCTGTTGACGAAGCAGAAGGTTCTGAACGCACACGTTCTCGGCGAG
-AGTCTTCAGAACGCCTTCACCAGTGAAGTGTCCCTCGTAGTACTGTCGCT
-GGCTGACCATCGACAGAAATTCCAGCGCGGCGCACACCATCGTATCGTAT
-CGAGTGTCGGGGCCGGTAGACTTGAGCAGATTCCAGACGGCAAGGATGAT
-GTCGGGCACGAACTCGGAGATCTCCTCCTCGTAGCGTTGCGAGTAGAGCG
-TGAAGATCTCACAGATCTCGTGCTTAAGCTCGTCCAGAGTTGTAGGTTCT
-CCCGAGTTGGAGGTCTGCGTCGGCGCGTCGATTTGCACGAGATGCAAGAA
-GTGTGGCATCCAGTCCTTGAGATGATCCTCGAAGTATTCCGGAATCTCCT
-GTGAGCACAGAGAATGGTAGACTTTTGCAATGAGAAGTAAGACTCGGAGC
-CATTGGGCGATCTCGTCGGCTCCGAGTTGATCCTTCCGCTGTCCCACCTC
-CATCATGTTCCGTAGCAACAGAGTTAGAGGCTCTTGGGTCTGAAAAATCG
-GTTCTTTTTATTTGTAACTGAAAAATCTGGGGAGAAAACAGTTTTTCGGT
-CCAAATTCGAGACTGACATTCAGATTTCTTCAATTTTTTGGCTCAAAAAT
-TTTGAAAATTTGTCCATTTTTATAGGAAAATTATCAATTTTCGCCAAAAA
-TTCCTCATTTTTGCTTTAGTTAAAATTTTTGACTAAAAAATCATAAAATG
-TTGAATTTTTCACGATTTTTCGGAAAACAAGGCCAGCTTTAGCTAGCTTA
-AATGTCTAATTTTGGTCATTTTTTAGGGTCAAAGCGGACAAAAATTCAAC
-TTCCGACGGCTGCGACGTAAAAAAGTGGCCAAAATTGGGGATTTTAGCTG
-AAATTAGCCAAATTTTGAGCCAAAACGCAACTCACGCTCAGTAGACACTT
-CTTCAGCTCTTTCCAAAGCTCTGCTGACTTGGATTCGAATCGGAATTTGC
-GGAAAATCTGCTCCATCGACGCCAGCGAGGCCACCAGGTGATTGAGATCC
-GCTCCGTTCAGGAATTTCGACAAATATGGAACCAAATCTGGCCATTTTTC
-GGGAAAATCTCTCTGAGCGATGAGATACAGAGCATTGGACAGGATTTCCT
-GAACATTTGATTTTGTATTGAACATCGCTTCGAGAAGCATGCTTCTGAAC
-TGCTCCTCGTCTTCCTGGCCCATTTCTACCTCTGGTGCCGGGCCCTGAAA
-CAATTTAAATATAAAATTCACGCATTTATTCAAATTTTCCAACCCAATTT
-CTCTTCACAAAATTTTTCAAAGCGACAGCCGCGGCGATTCGGATCTGCGG
-AGCAATTTGTTGCTGTTCGTTGACCACCAGTTGAAGAATTTGAATGATAT
-AGCCTGGATTTGATTGCAGCGAGCGGAGCGCTTCTTCTCCACGCTTGCGA
-ATCGCAGCATCCGGCTCCAGAGTCTGCTGGAGAGCTGCTCCGATTTGCTC
-CATCTGAAAATAGGGAAAAATAGCTGTTTTGGGGGTGAAATAGGGAAGAA
-TTAGGTGAAAGGACAAAGATAGTTTAGCTTAAAACTTGAAATCTAAAATT
-TCCGGTCAAAATATTAAAGTTTTACGCAATTTTTCGCAGGCCCGCGGGGA
-ATAAACTCGCAAAAATTCGCAAAAATAAAAAAAAAATTTCAAAAGTGTGA
-AGTGTTTGCGTACAGCGCACCCGACCCGACGCGCAAATTTTTTTCATTAT
-GTTCTCTGTTTTCACTGATTTTTACTGATTTTTCCTAGTTTTCCCTTGAT
-TTTCTTCAAATTTTCCACTTTTTCAGCAAAACGTGCATAAAAAAATAAAT
-TAAAACATTTCAATTTTCAAAACTTTGCAAAATAAAGGCGTCGTTGCGTA
-CAATGCGCACGACTTGACGCGCAAACTTCCCAATTTTTATTCTTAAATTT
-TCCTGGATACCCCTGGTTTTTTCTCTGTTTCCCCCCTAATTTTTCGCATT
-TTCAGCAAACATGGGTGTTGATAAAAAGCAAAAGCAACGAAAAACCAATC
-CATTCGAGCTAAAATTCAACAAATCCAAGCATGACGTGAGTTTTTCAGAG
-TTTTGAAGAAAAAATCGATTTTCTCGCAGATTCTCGGCCGGAAAAAGGGC
-GCACAAGTTGGAGCACCGACTGCGTCACGAAAACGAGCTCACGAGCAACG
-TGAACAGACGCTAGGCGTAGAATATGACCGGAAAAATAAGATTAGCAAAA
-TTGTCGACAAACGGCTCGGCGAAAAGGACGGAAAAAGCGAGGAGGAGAAG
-GGCGCGATGAGATTCACAGAGGAAAGAGTCAAAAATTATAAAAGAGCATC
-GAAATTCAACTTGACAGATGATGGAGATGAGGAGGAAGAAGGTTTATTCC
-GAAATAAATTGAGAAAAATTTTAATAAAGTAAATTTCAGTACTTACTCAC
-AAGGGAAAAGCGCTCTCGGACATTGAAAAATACGACAAATCGATGATTTC
-CGACTCGGATGACGATGAAGAGCCGGGAAATTTGGGCTCAAATATGGTAA
-AAGTGGCTCATTTCGGTGGTGGAGAGAAGACCGCCGAGGAGCACGTCCGC
-GAAAAAATCAGCCGAGAGGATATGATTTCGAATTTGATTGCGAAAACGAA
-GCTGGCGCGTCACGAGAAGCAACAGCAGAAGGATGAGCTCGAGCTGATGA
-CAGAGTCGTTGGATTCCAAGTATCAGGCTTTGATGGGCAAAATGAAGGCT
-TCATTTAGGCCGACCGGGCGCCAGCCGCTGGAAAAAGATGATTACGACAA
-ATTGGTACGGGAAACATCCCGGTTTTCTCCAAATTTTTAAGATAAAAGAT
-AATTATAAATTTAGAGTGAAAATCGATTTTTTTCACAATTTTTTAGTGGA
-AAACCTAAAACCCAAAAAACTTGATCTGAAAATGCTAATTTTTAACCATT
-TTTGCTATGGAAATTGGAAATTTTCATTAATTTTGCTGTAAAAGTTGAAG
-AAATCCAAGTTTTAGCTTTGTAATCAGAGAAAACACTGTAAAATTATTTC
-GGAATTTGTGCAATTTGAAGTGAAAAATAAAACATTTAACTTCTTATCGC
-GAAAGAAATTGAGCTGAACTGAGAATTTTTTTGACGAAAAATCATTAAAA
-AGTCAATTTTTTTGACAAAAATTCGAGAAAAGTCGGTTTTTCTTTTGACA
-AAAATGACGAAAAAGGCAATTTTTAATTTAAAAAAATAAATTTTTCGCCG
-AAAAATAACTTTAAAAAAGTCGTTTTTTTACAAAATAAAACAATTTAAAA
-TAACTATTTTTCGACAAAAAAATTAAGAAAAAGCCAATTTTTTTGTTTAA
-AAAATGATAGAAAAAGGCTTTTTTTTTGTTTCTTCGCCTAAAAAATCAAG
-AAAAATAGGTTTTATTCCATTTTTTATCCAAAAATTATTATTTTTCCAGA
-CAATCACCTTGAAAACCGAAGCCGACGCTCGTGCCACCCCAGCAGATCGT
-AAGCTATCCGAAGAAGAAGAAGCTCTGAAAGAAAAAGAACGTCTGGAAAC
-TCTCGAGGCCGCCCGTATCTCGAAAAATAATGCATTTTTCAACGCAAAAT
-CTCATTTATCAGCCGATGCCGACGTTGATATCGATGCTGGATCGAAGGCC
-GACGCCAGAAAAGTTCAGGCGAAAAATTCGAGATTTGAGGTCAAATTTGA
-CGATGAAGGTGGCCTGATCGATGAGGATACGGTGGAAAAATCCAGGATTT
-TAAAGAAAAATCTGGATGGTTCTGATGAATCTGACGATGACGAGGATCTA
-GAAGATGAGGAAGAGGATCTGGATGATCTACTGGAAGATGAGGATGAGCT
-GGAAGAAGATTCCGATGATGAGGAAGCTCAGGAAGCCCAAAAAGTCGTCA
-AAAAAGCGAAAAAATCTGCTCCAGAACCCGCTGAAACTCTGCCATTCGTA
-TTCGAAATGCCGAAAAACTATAAAAAATTCTGTGCTCTTCTGGAAAAACA
-CTCGGAATCGATGGATTTAGTGCTGGAACGACTCGTGAAATGTCATCATC
-CGAGCCTTAAAGAAGGAAATAAGAAGCGTCTGAATAAGCTTTTCCTCTTG
-TGTTTAAGATGGTTTGATGATATGTCGAAGGAGGAATTGACAGCGGAAAG
-TGTGAAGGAAATGAATTTAGCGCAGGAAACTATGCATGCGTTGATGAAGG
-TAGCGATTGGATGGAAAAGCTGAAAAATTACCGCACTTTTTAATCTGAAA
-ATTGAAAAAATTCGAGAATTTTTGACCTAAAATTTTGAAAAATTCCCGAT
-TTTTATACCCCAAAAATTGCAAAAAAGTCCCGATTTTTTACCAAAAAATG
-TTTTAAAATCCCCGAATTTTTTACCTAAAAATTGCAAAAAAGTTTCGATA
-TTTAGACCCAAAAATTGCAAAAAAGTCCCGATATTTTTACCAAAAAATGT
-TTTATAATCCCCGAATTTTTGACCTAAAAATTGCAAAAAAGTCTCGATTT
-TTAGACCCAAAAATTGCAAAAAAGTCCCGAATTTTTTACCAAAAAATGTT
-TTAAAATCCCCGAATTTTTGACCTAAAAATTGCAAAAAAGCCGGTTTTTT
-TACAAAAAAATGTTTTAAAATCCCCGAATTTTTGACCGAAAAATTGCAAA
-AAAGTCTCGATTTTTAGACCCAAAAATTGCAAAAAAGTCCCGAATTTTTT
-ACCAAAAAATGTTTTAAAATCCCCGAATTTTTTGACCTAAAAATTGCAAT
-AAATTCCAAAAACTTTGGCCAAAAAATTAAAAAAAATACCCGAATGTTTG
-ACCCAAAAATTGCAAAAAAGCCCCGATTTTTTGAGAAAAATCATGTGAAA
-TTAAAACCTTTTTTTTTTGAAAATCAGTCTCGAAAAAAAAAAGAAAAACC
-AGGAAAATCATGAAAATTTAAGAAAAAAATCATTAAAAATAGGAAACGAT
-CATGGAAATATTTTTAAAGAAACATTATATAAAAAATCATTAAAATTTCA
-GAAAAAAAATATGGAAAATCCTGAAAATAAAGAAAATAATATTAAAAATT
-CAGATTAAAAAACGCAAAAAATTCAACAATTGAAAAAAATTTCAAATTGT
-TTTTTGCAGTTCGACATTCAATACGGAGTCCGATGTGTGCGTGCTCTAAT
-CCGTCAACACTGGAAAGGCCGCCAGGATAAACAGAAGAGTAGCCCAGTGT
-CATTTGGATTAATCTCTGCAATTCGTCTTGTTTCCGGCCTCTTCCCAGTT
-GCCGATTCCTGGCATCCTGTAGTGGTTCCGGCTCTTTTTTTGGCAACTGA
-AGCACTTTGCTCGGCGAAATGTGCCAATTTGAATGCGTTGGCTAAACAAA
-TTCAATTGGCTAATGCTATTGTTGAATATGTGTCTGAATCCAAGAGGTAA
-TACTTGGAAACGAACATTTAAATAGGCAAATTTTGAAAAAAATACTGAAA
-GCTTTGATATAAAATAGGAAAAGTAACGAAAAAAAAAGCCAAAACCACCA
-AAAATATTATTTTCAAAAGCTAACTCAAAAAATTTAAAATTCAGAATTGT
-CGCTTAAAAAAATCTATTTTTTTCGATATCGAAAAAAGATTACTATAAAA
-ATTCAAAAAAGCAATTTTTTAAAATATAACTTGATTTTTTTTTCTGAAGT
-TCATTTTTTAACAAATAATTGCATTAATTTTCCATTTTAATGTTAAAAAA
-AAGCGAATTTTTCAAAAATTGATATAAATTTTGTTTTGGCAATTTTTAGA
-TCAGAAAACATTGAAAAAATACAAAAATCCCGTTTTTTTTTAAATTAATT
-TTTTAGAAAAAATTGCAATTTTTCAAAAATCTTCCGGTCATTTCTCTATT
-TTTAAAAAATCTCTCGTCTCTTTTAAAAAAATTTAAAAAACCGAATTATC
-GAAGCGTATCAAAATTTTGAAATTAAAAAAAAAACCGAACTCCATTTTTA
-CGAAAAATCCGAAAGTTGAAAATTGTTTTCAATAAAATAAATTTCAGATA
-CGTCCCCGAGCTGGTCGCATTTGCTCGAAGTGCTCTTCTGCTTGCAGTTA
-CAGAGAAAAGTGAGAAATTCGCGACAAATGGATTCCCGATTTCCAAGCCA
-CACACGGAAATGTTATGCTTTGAGGAGAAGGTAAATTTATAAAATTTGTT
-TTTTTGAGCAAAAAATTGGTTTTTTTTTTTGGTTTTCTCTTTAAAAAAAT
-TTGCTTAAAAACGCTCAATATTTAAAAAAAAAACTGGCAAAATCGAATTT
-TATAATATAAATTAAAAATTTTGTTCAAATAAAAATGATTTTTTTTTGAA
-AATTTAGTTTTGAAAAATTTAAAATTAAATTTTAAATTTTCACAAAATTG
-CCAATGATAAAATGTTCACTTTTTCTTGTATAAAACTGCTTGAAATTTTT
-TAAAAGCAATTTTCCGAAAAATAATTTTTTAATAGATTTCTGAAAAACCG
-AAAAACCACCGATTGAAAAACGAAAATCAAGTTTTTTTCCGAATTTTCTA
-TTTTTAACAAATTAAATATCAATTTTGCACATACAAAACGGTTAAAAAAA
-AACAAAAAAAATTGCCGAGAGCCAAAAAAATTTAAGTTTCAGCGATTTTG
-AAATTTTTTTTTTAGGAAACACGGTCTCCTCGGGTGGAAACGAAGGGGGA
-GGGAGATTGCTTGCGCGTTTCACCGATGCGCCTTTCGCGTGCTGGCGCAC
-TTCTGAATATTGAATTATTTTTGCGGAAAAAATTCATTTCTTCTATGAAA
-TTTTCTTGAGAAAGCAAAGGAAAGATGATGAAATGAATTTTTAAAATAGT
-TTTCTCAGTTAAAAAGAGAATACCTTGCTGCAAAAGGTTAAATTTATTGA
-AAAATTGAGAAAATAAGAAGTTTATCTTTGTTTTCACTACATAAAGTGGG
-GAAATCTCAAAAAAATTTGAAGACAATTAAGAAATATAATTAAATATATA
-GCCTGAAAGTCAAATAAGAAATGAAGGTTTGGTCACAAACAATTTTATTT
-TTGAATTGAAGTTTTGAGAAATGATCATGTGCCAGAATCACTAAATCTGA
-GACATTCAGCCCAATTTCTTTAATTTTCTGTGATTTTATCATGGAAGTGT
-GGCTTTTTCTGTGATCTTGCCAGTTTTAACAAGTTGAAATTGGAAAATCG
-TGAAGTGGGAAACTAGCAGTGAAGCTTCCAAAAATTTCAAGCCTTACTGA
-AAGGAAAGTATTGGAAACTAAAAACGAAAGCTTAAGAAGATACCGTTTTT
-ATATATTTGAGTTTTGAAAAGCCTTAATAGGTTTTAAATACAGTTTTCTC
-AAGAATTCAAACTTGTAACGATTAAGTTGAGGCACAGAATAAGATGGTAA
-TACTAAGTTATGTTGAAAAAAGCCAAGAAAGACTGAAAACATTGCTTTCA
-ATCTGATTTTTTGTAAGTAATGTAATGTTGAAACATTATTCTTCATAGTT
-CAGCACTTTGTATGGCTTATTTGAGCCCAAACGTACAGTAGTATGTGGCA
-AGAAATAAAATATTGTGCCAACAAAATTGGAGCCGAAAAACCCATGATAA
-AATGTTTAATACGTGTATTGCTCTAATAAAATACCAAATATTAATTAGAT
-TCACTGTCTCGACTCTTTTTAATTCAGATTAATAACTTTTAGCTCCTCTT
-TTTAACGAAAAATTATAACTGGATTTCACAAAAAGAGTTCGATCTGAGTT
-CTTTCAACAGGTACATAGACGAATTATATCTTAAAATGACGAGAAAAGTT
-TGCTCTATAAACGTTATCATTGCAGGTTATGAGAAAAACAAATAAAAATT
-TAATTTTAAAAAATCCGAAAATTCAGTTGTTATTTTCAAACAGTTCGTTA
-TGCATTTCCACCGAACGGTTTCCGATAATTTTTGTTTCTCCACTTTCGGT
-TCAGTCTACTTTATAATTGTTATCATTTTGAAATAGAAAAATCGACGAAA
-AACTAATAAAAATCGAGGGAAATCACTCTTCAACGGTGAAATCTCGGTGG
-ACGCAATGAAGCTGCAGCATTTCAAAAAAATTTTAGAAGCAATTTTGGTC
-ATTTCAGCTTCAAAAAGCTTTAAAACTTAAAAAAATTAAAATTCATTTCA
-AAAAATTTGAAATTAGTCATTTAAAATATAAAAATTAGAAAAATTCTAAT
-TTTCAGCGAATTTTCAAATTTATTTTTATTTCAGAAAAATTCAAATTTTG
-GCTTTCAAAAAAGCTTACAAAATATTAATTTTTAAAAAATCTAACTTTCC
-CAATTTTTCAGTACACTGGCCCCGCACTCCAGCCAATCTCCCTGACCACA
-ATCTTCAACAATTCCCCATCCGATCCATCTCTAAAGCTTCACGTTCTTCG
-TGCTCTGCTCTCCCTCATCCAACATCTCCGTGTAATCTACTCCAACCAAA
-ATGAGACCTATTCTATCGTTTTCAAGCCATTCCTCCGGATTTTGGAATCA
-ATTCAAGCCAAAAATCTTCCAGCCGAGGTCCAGGAAGAGCTGGAGACTCT
-GTGCGCCTCAATGAAGGCTGAAATTGGAGCCAAGTGCCGTCTGGTGCACC
-TGTCGCTGGTGAAAACCGAAAAGAGCATGCTGAAAATGCTGGAACCCCGT
-TTCGAGTGGGATTTCGATCCGGAACGCCCACATCACGGACCCAAAGACGA
-GAAGAAGAAGCTGACGAAGAATCTGAGGAACGAAAGACGCGGAGCCATCA
-AGGAGCTCAGAAAGGATACGGCATTCTTGGCCAGGAAGCAATTGTCGAGT
-GTCAAGACGAAGGATCGTGCGAGAATTGCGGCCACGAAACGTGTCATGGG
-CGGTCTTATGCAGCAGCAGGGTGAATGGAATAAGGAGAAGCGTACGGCGG
-ATGTTGAGAAGAAGAAGGACAAGAAATAATTTAAATTTTCCTATTTTTTG
-TTTGTTGAAAATGACTTTATTTGGCAAAAAAAACCCCTAAATTTCAGTTT
-TTCTCGATTTGTTGAAAAATAGTCAAAAAACTGATTTCTATGTTATTTTT
-GGTCAAAATTTGCCTTTTTCAAACATTTTTTTTGCCATTTTTCCTCCATT
-TTTTGTTATTTTTTTTTTTCGTTTTGTTATGAGATATGTTTCTGTTTTGT
-TGACATTTTTTATTATTGAAAATTAAACGAGTTTTCTGAATTTTTTTGTT
-CAATTTTTTTGAAATTTTCCGTTTCACATACGTTTGTCAATATCTCGATT
-AATTTTTGAAGTTTTCCAATTGACTCGCGCATTTTCTAAAAAGTTTTTAA
-ACTTTACATTGAAAATACCCCTCTAACTCGAATATCTGATTTTATTGGAA
-TTTTGAGTTTTTTTAGGTTAAAAAATTCTTGTGCTAAAATCATCCATTAT
-AGTTCGTAAGTCAGCAAATTTTGGCTCAAACTTAGAGCGATTTCCAATTT
-ATGGAGTTTTTTGTTCAGAATTCTCGAAATTTTCTCATTTCTGGAAATTT
-TGAGTCTACGAGTCACACAGTTGTTCCGTAATTAGCTTCACTTACATCTC
-CTCAACTCTGCAAACTCTCAAACTTTCGGGAAAGGGTCTCGCCACGAAAT
-CACGGGTGGGCGGCAATTGCAGTTCGGCAAATTGCCGGTTTGCCGGAAAT
-TTTCAATCCCGGCAAAATTCCGTTTGCCGGAAGTTTTTAAACGGGATCTT
-TTATAAGACGGAAACACTTAAAACTGCCATTTTTAATTTTTTGCCCGTTT
-TCTCTAAATATTTTCATAGAATTTACTGACTTTTTAGGATAGATGTTTTC
-ATGGGATGTGCACATGTTGTTCCGGCAAATCGGTAATTGCCGAAAATTTG
-AAAAACGACAATTTGCCAAAAAAATCGTTTGCCGTTCACCCCTGTATTGT
-ACCATTTTTGGCGAAAATGCGCGTAAATTAATATGCTTGCGTGTGTAATA
-TTTCGTTCATATATTCTAAATATACGCACCTTTTGAAATATTCATAATAT
-ATGCATTTACGTACGTTCGAGAATATTTTGGGAATACACATTTATCATCA
-TTCCCACCCGTTGCCATAGTATCCTCATCCCCGCCCCGCCCCGCCCCTTT
-CTCTCATTTCCTCTTCCAAATCCTTAATGGCTCATCCGGTCATTGGAGAG
-ATATGGCAGATGTGGCGGTTTTGACGAATGTTCTGGAGAACTCGAATTTT
-ATATAACTATTAGACAATTTCGATATTAAAAACATTTATATGTAAAATTT
-TCAATTTTTTGAATTTGCTCGCCGAATTTTGACTTTCTGACAATTGTGTG
-TCGATTTACGAGGGTTATGTATATTTACGATATGTTTTTAATCATTATCG
-AATGCTGATTTCCGTTTTTCTACGAGTTGTCTTCATTTTCGTTGGTTTTT
-TTTTGTTTTTTTTTTTTGAAAGTGTATTTTTTAAGGTCAAAAAACTAGAA
-AAATATTCAGTTTTCAGTCAGGAAAACCATTTATTTGGTTTTTTCAATAT
-TAAAAAAATTATTGGGAAAAATGAATGAAACTCGTCGAAAAACGAAAATC
-ATCATTCGATAAAGATTAAATATTTCGTAAATCGACACACATGTCTCCGC
-CGCGAAAAATCGAAATTTCATAGAGGCATAAAAATTCACAATATTTTAGT
-TTTTTTATTTTTTATTTTAATCCAAATCCCTATTCATGCTTAGATTTTTA
-GGTGTTTTTCTGTAAAAAATCAAAAAATTGTATATTACTCATAAATTTTT
-CCAATTTTCTCAAACCTTGGATCTCGCCACGACATTATTAAAAAATTCCC
-GTTTTCTGCAGAAATGACGACAACGGAAGAAGCTCCCAAATCGCCGCTTT
-TCGAGGCAATCGACAAAAATGACACTGAAGCAGCGCTGGCACTGCTGAAA
-ACGAAGGAACAAGCCGCTCAACGGGATCCCAGTGGAATGAGTGTGCTGGC
-AGCTGCCGCGTATAGGTATGCACCTTTAAAGCGGCGACGGTTACTGTATC
-CTCGCAGATTGTTTAAAGGTACATACCGTAATCCGTTGAATTTCAGAGGA
-AATCTTACGTTGGTCGAGAAAGCGATTGAGCTGAAATGTGATGTGAATGA
-TAAAACCGATGGAACTCTGTACACTCCACTCATGTTTGCCGCCTTATCAG
-GTAGGGCAAAAATTTTTTAAAAAAATTTTTTGCGTCAAATTTGATGCAAA
-TTCTGGTTTTTTACCGTTGAAAAGTAAAAAAAAATTCCGAAAAAATCGAT
-TTTTATGCTAACAACAAACTTTTAAGTGAAAAATCGTGGAAAATTAGACC
-CAAATCACGTATTTTTGATCTGAAATTCAATTTAGCGAAAAGTCATCGAA
-ATTTTATGGTTTTCGCGGTGAGACCCAATATTCGCAATTTTTTTTTGCAC
-CAAATACAACACATTTGACGCGCAAATTCAAATTTTTGAAACTTTTTTCC
-GTTTTTACAATATTTTTAGGCTGAACCCCAATATTTGAAAAAAAAAAAAC
-CAATACACTATATTTTACGCGCAAATGTTAAATTTTTATTTAAAATCCTC
-GTAAAGTTCTATTTTCTTTTTTTGATCGTTTTCAAGCTCAAAAATTCAAA
-TTTCAATTCGAAATATTACCGGAACACAAAATTCTGAAAATGCGTACTGG
-TCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTAATTC
-ATTAAATGACTACGGTAACGCTTGTGTCGATTTACGGGCTCGTTATTAAA
-AATCATTAATTTCAAAAAAATCGAGCCCGTAAATCACCACAAGCGCTACC
-GTAGTCATTTAATGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCG
-TCAAATATGCTCAATACACATTCTCAGAATTTTGCGTTAACGTATTACTA
-CTTTCTTAGTTTTTCCAAAAAAAAAATTCGAATACACCATATTTGACGCG
-CAAACTTTTTTTTTCAAAGCAAAATTGTCAAACGTTTGCAGGAAAACAGG
-ACGTATGCCGCCTGCTAATGGACTCCGGAGCCCGTATGTATTTGGTGAAT
-GGAATCGGAAAAACCGCCTCTGAACTGGCGGCATTTGTGGGTCATCACGA
-GTGTGTGGCAATTATCAATAATCATATAACAATTGATGTGATCGAAGATC
-TTTTGCGGCCAAAAGTGAATGGAAAATATGAAGGAGCTGAGGAATATCCG
-GATGAGCTGGCTGTATTTATTCATTCATTGTGTGGATCACATGAGATTCA
-TCCTGTTAAGATTATTTTTCGATTCAGTAAATATCCCGATTCGTTGAAGT
-ATAAGAAAAAGGTACATAGCTGTGTAGTTTGGAAAAAAAACGAAAAATCT
-GAAAATTTGAGAAATTTCCTTAAGCTTTTTCAAGATGCGCATTTTTGTTC
-ATTCTTATTTTCAAAAAAATCCAAAAAGTTTTTTAAAAAATTTAATAAAG
-CATTCTTTTTAATTTCAAAACAAAAAAGTTATACCAAATAAAAACTTTTA
-GTAATCAAAATTTTTCACTTTTTCTCGGTTTTTCTCATCGTTTTTCAAAT
-TTGAGATCTCTTCCTGAATTTTGCCTAAAAATTGATTTTTTCAAAATATT
-TTCAGAAATGATTCTTTCTGTGAAAAAATGTTTGAAAATGCGAAAATATT
-CGAAACTAAAAAAACTTTTATTAAAATAAATTTTTGAAATTTTTCAGAAT
-TTAAAAATTGAATCGAATTAGGTATCAGTAGTTTTCAGATCGATTTTTTC
-GAATTTCTGAATTTGTTAAAAACTAGAAATTAAAAAAAAAACTTTTGATG
-TTAAATGTTTTTCGAGATTAAAATAAACCGAAAACCCAAAAAAAATGTAA
-AAATTGTGTTCTTTTTGTTATAATAAACCAGAATTTTCTCGAAATTTTCA
-GAAGGTTCTAGAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTA
-GAACATTTCAGAATTTTCTCGAAATTTTCAGAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAAATTTTCAGAAGGTTCTAGAATAGTTCAGAATTTTCTC
-GAAATTTCCAAAAGGTTCTAGAACATTACATAATTTTCTCGAAATTTCCA
-GAAGGTTCTAGAACATTCCAGAATTTTCTCGAAATTTTCAGAAGGTTCTA
-GAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTAGAACATTTCA
-GAATTTTCTCGAAATTTTCAGAAGGTTCTAGAATATTTCAGAATTTTCTC
-GAAATTTCCAAAAGGTTCTAGAACATTACAGAATTTTCTCGAAATTTCCA
-AAAGGTTCTAGAACATTACAGAATTTTCTCGAAATTTTCAGAAGGTTCTA
-GAATATTTCAGAATTTTCTCGAAATTTCCAAAAGGTTCTAGAACAATCCA
-GAATAATGTTTTCAAAAAATTCAAATTTGAATTCCCGCCAAAATGTTTTC
-AAAAAATTAAAATTCGAATTTCCCGCCAAAATATGTACAGTACTCCTACA
-GTACCTCTACAGTACTACTACAGTACCCCGACCATATCCCACTACTAACC
-CCAAACCTATATCTCTTCAAAAGACTAAAACACAATTTTTCCTAAACTAC
-AGTAATCCTACCGTACTCCTACAGTACTACTACAGTACCCCCACCATATC
-CCACTACTAACCCCAAACCTATATCTCTTCAAAAGACTAAAACACAATTT
-TTCCTAAACTACAGTAATCCTACCGTACTCCTACAGTACTCCTACAGTAC
-TACTACAGTACCCCGACCATATCCCACTACTAAGCCCAAACTAATATCCC
-TCCATCAGCCGAAAACGCCTTGCCTTTGTAAACTATGACGTCACTACTTA
-ACAAACGGACACTATTTTTTTATATTTTTTTTTCAAAGCAAAAACCACCC
-ATTTTCCAGATCCTCTACGTCATCGATCGTGTCTTCGAGAAACAGCTTCG
-ATGTAAGGAAAGCAATGAAATAATGTCGCTCAAGCTTTGGCTAATTCTAT
-TTTCAATGCGTGAAACCTCGAAATTCGTGGAGTCGAACAAGGAAAAGTCG
-CCAGAAGAAGCGTCTCTACAGTACGCAAAACTGATTTCCACGTGGCAAGA
-GGGCGATGAAACTAGGCGAGCACTTGACGTGATGCTGAGAAATGCGGTTG
-CTTCGTTCCCGTATAAACATTCATTACTTCATGATACTCTACAAAAAGCA
-CTGCAAAAAAGTCAAATTGGTGAACGACCAAGTGCCTATGAATACATTGT
-TCAGGCACTTTTCGGACAACGAATCGCTGCGGTCTGCCAGTTTTGCTCGG
-TTTGCGGACATCCTGGAGCCAAGAAACGGTGCACACAGTGCAAAGTATGG
-AGTTTTTAGGGTTAAAAATAATTATTTAATAATTTAATAAAGCTCGAATT
-TGGGAAATAATCAATTCCAAATTTTAAAAATATGGAAAAAATTTTATTCC
-GTTACATTTTATGAATTTTCCCACAAACTCGGCATTTGGCTCTAGCTTCT
-TGCCCAAGTTTAGCCCAAAAAATATTAACTTGAAGCTGTCTAAACTTGGG
-CAAAAGTTAGACAAAACTTTGGCAAAACTTGGATTCAAGCTTTACCAAGG
-TCTAACCCAAGTTTCACCCAACTCTTGCCAAACTTTGGCCCAAACTTTTC
-TTATTTCGTTTCAAATTTGGGCCAAAGTTTGGCAAGAGTTGGGTGAAACT
-TGGGTTAGACTTTGGTAAAGCTTGAATCCAAGTTTTGCCAAAGTCTTGCC
-TAACTTTTGCCCAAGTTTAGACAGCTTCTGATCCAAGTTAACATTTTTTG
-GGCTAAACTTGGGCAAGAAGCAAGAGCCAAATGCCGAGAAACTCGAATAA
-AAATTGAAAGTTTTCAAAATTTCAGTTCGTTTTTAATTTACAAAATTTGG
-CAGCTCTAACAATTCTTTAAAGATTCTTTAAATTAAAAAAAAGAATTATT
-AAAACTTTTTAAAAAAATTCATTCTGTAGAAAATTCCCGTAAAATACTCT
-TTGAAAATCCGGGAAAAAACTTCAAAAAACAAAAATAAATTCTAGACATT
-CTGTAAATATCGAAAAAAGAACATTTTGTCTGTAAATGTATTAGTCAAAA
-TTAATTTCTGATACTTTTTCCAATTTTTCAAAATTTTAAGTGTCGAGGTT
-CAATTTTTTTGAATTTCCTGTTTTTCCTTTATTAAAAAAAGTTTTCTATA
-ATATGCTGTATTTGAAAATTAAAAACTATATCTGAAAATATCGAGGCACA
-ACGTTTTCAAGATCTGGTGAAATTCCGGATCTACGTTTTCCGGATCTACC
-ATTTCCGGATCTACGTTTTCCGGATCTGGCACCGTGCCAACGCACAAAAC
-GCTTTTTTGTTCACTCGACGCACGTTGTTTTTTGAAAATTTCTTCTAGAA
-GAAACGCTTAACAACACGCGACGCGTAACAACGGAGCATCGTTATCACGT
-TTTTCTCCGAGAAAAATAGCGTTTTAAGAGTTGGCACGGTGCCAGATCCG
-GAAATGGTAGATCCGGAAAACGGAGATCCGGAATTCCGCCAGATCTTGAA
-AATGTGGTGCCTCAAAATATCGATTAAAGAATTTTTTCTGAAAAATATCC
-AATTTTTCAACAACAGAATAGCTAAAAAGTGAAAAAAAACTCAATTCTCA
-TTATAAATTGCAAACAATTTCCAAATTTTGATAAAATGGAAAAGAGTTTA
-AAAATTTCAGGCAACACATTTTTTAACTCTAGTAAACGTTTTTTAAATTC
-CAACAATTTTTACAGCTCGCCTACTGTTCCCAAGAATGCCAAAAATTCGA
-CTGGCCAATTCACAAAAAAGTGTGCTCATTTCTGAAAACGCGACAAGAAG
-TGTCGCCCACCGACGAGACCGCCATGTCGCTGGACGATATTCAGGCTCAA
-ATCGCCAAAATCGACGTGTAGAAGTGCCGATATTTCGATCTCAATATACT
-TTTTTTCTGGAATTTATTTATTTTTAATGTATATTTCGGCTTCATCTCAT
-TGCACGAACTTTTAATTTCATTTTCATAAATTCATTTTTGAAGTCATTCC
-TTGAACAAAAATTCACTAAAACATGCATTAAGAAATATGGAATCCAAAAA
-TTAATCTAAAAACCTTTTCAAAAAACCACTTCGTCAAAAACTGATGATGG
-AAAACTCGTTGAAAAACGGAAAGAGTATCCAATAAAGATTAAAAATTTCG
-ACATTTCGTAAATCGACACAAATCTCGTAAATCGACAAAAATGAAAAAAT
-CAGGAACCCAAGAAATTCAATATTCTCATTTGTAAAGACAACTGGTAAAA
-CATTTTCAAATCAAAAAATTATTTTTTTTGCCCTCAAAATTGATCTCCGA
-ATACTATAAAAAAGAAAACTATAAAAAGTGGCGAAAATTCGAAATTTTTT
-AACCCCTCTAAAATGGTTCATTTTAGTTGTCTAATGATACAACAAAGTAG
-ACATAGTTCTACAATATCTGATAAATACTTGAAAAGTCTAAAAACAAAAG
-TTTTTTCGTTTTTTTAACGGATTTTTAAAATCCAGAAGAACGAAAAAAAA
-TTTTTTTAAGAGAATAGAGTAAACTAATCATGTTCGAGCAAAAAAATCCG
-ACTTAGAATATGAACGGACCCAAGTGTATCATAATTATTTTAATTTCTGT
-GTATCAGAATTATTTTAGTTTCCTTAGTGTGATTCCCAAACTGCTTAAAT
-TCTAGGAAATATTTCTTTACTGGAACACTCTTAGCCACTGTACGCTGCCG
-AACGAATAATAAGAGAATACAGAACACCAATTATGCCCGAGAAAAAGATC
-CTACTCAGAATATAAACATAGTCAAATTTATCGGATGTATAAAGATTCCC
-GAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATCAAATTCTC
-TTACTAGAACGCTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGA
-ATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAA
-CATAGTCAAATTTATCGGATGTATAAAGATTCCCGAAGACACTTTCCAAT
-TACCCAAATTGTTCATATTCTAAATGAAATTCTTTTACTAGAACACTCTT
-GGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACCAATT
-ATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTTAAATTTATT
-GGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCAT
-ATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGC
-CGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGA
-TCCTACTCAGAATATAAACATAGTCGAATTTATCGGATGTATAAAGATTC
-CCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATGAAATTC
-TCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGT
-GAATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATA
-AACATAGTTAAATTTATTGGATGTATAAAGATTCCCGAAGACACTTTCCA
-ATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAACACTC
-TTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACCAA
-TTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTCGAATTTA
-TCGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTC
-ATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCA
-GCCGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAA
-GATCCTACTCAGAATATAAACATATTCGAATTTAACGGATGTATAAAGAT
-TCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATGAAAT
-TCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAA
-GTGAATACAGAACACCAATTATGCCCGGGAAAAAGATCCTACTCAGAATA
-TAAACATATTCGAATTTATCGGATGTATAAAGATTCCCGAAGACACTTTC
-CAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAACAC
-TCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACACC
-AATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATAGTCAAATT
-TATCGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATTGT
-TCATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTACG
-CAGCCTAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGAGAAA
-AAGATCCAACTCAGAATAAAAACATATTCGAATTTACCGGATGTATAAAG
-ATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTGAATGAA
-ATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATCAT
-AAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGATCCTACTCAGAA
-TATAAACATAGTCGAATTTATCGAATGTATAAAGATTCCCGAAGACACTT
-TCCAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGAAC
-ACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAACA
-CCAATTATGCCCGAGAAAAAGATCCTACTCAGAATATAAACATATTCGAA
-TTTAACGGATGTATAAAGATTCCCGAAGACACTTTCCAATTACCCAAATT
-GTTCATATTCTAAATGAAATTCTCTTACTAGAACACTCTTGGCCAATGTA
-CGCAGCCGAACGTATCATAAGTGAATACAGAACACCAATTATGCCCGGGA
-AAAAGATCCTACTCAGAATATAAACATATTCGAATTTATCGGATGTATAA
-AGATTCCCGAAGACACTTTCCAATTACCCAAATTGTTCATATTCTAAATG
-AAATTCTCTTACTAGAACACTCTTGGCCAATGTACGCAGCCGAACGTATC
-ATAAGTGAATACAGAACACCAATTATGCCCGAGAAAAAGATCCAACTCAG
-AATATAAACATATTCGAATTTATCGGATGTATAAAGATTCCCGAAGACAC
-TTTCCAATTACCCAAATTGTTCATATTCTAAATGAAATTCTCTTACTAGA
-ACACTCTTGGCCAATGTACGCAGCCGAACGTATCATAAGTGAATACAGAA
-CACCAATCATGATCGAGCAAAAAGATCCGATTCAGAATATAAACATATTC
-GAATTTATCGGATGTATAAAGATTCCCTATTGGGAAGTGGAGCAATCCAC
-GACTGGTTTATCGGCCACAGTCCCCGGCTAGGACATGGCTTATATTATTG
-GGCCAAGGGGAGCACCACCAGGCAGTGTACCTGACTCCCAGATCAGCAGT
-ACATAGCACTTGAAGAATGGATCGTCCTTTAATCTTTTAATCTTTTAAAA
-AGAATCGAAGGAACTCTCATCGGGTCATGTGGTTGTGGGGACAAAGAGGG
-AGGCTTACATCAATACCAAATACCTGTGGTAGATCACAATACCTGTGGTA
-GATCACACCCTATCCACAAAGAAAATCTGTGGACGTCCTCAAAGGAGGCC
-GCCCGCGCCCTTGAGCTGGCCAACAAACCCTTCGAGCTGGGTGGAGGAAT
-ACTCCAGCCGAGCGACTGAAAACGGCGGTAACGCCACGTTGTCGCACAAT
-AACAACAAAAAAGCCCGCGGGCCCCAAGAAGCTCAAGAAGCCCACGGCTT
-AATTTTCAAATCAATTACCTTACTATGAATCTCCTTTTTGCTCTACGAGT
-CGTCGTTGATGTCATCCTTCCGTCCAACCTCCGTCAAACAGTCCATCTGA
-CCATCCGTCCAACCAACATGTGGTGGAGTGTCCAACGCATCTGAAATTGA
-AAAATATTTATATCTGATTTTTTAAATGGAACCATTTACAAAAAACATAA
-ACGGAAAACGCTTAGCAAAAAAACAAACAATTAGTATTTAGAAAAACGGA
-GACAAATGCTCTCGCGATCTTATTTATATTAATTTTCCAGTCGATTGCAA
-GGCATCTGCTCCCACGGGTTTATATAAAATTGTGTAACTAATTTTAAACT
-TCTCTTGAAACCTTTCAACCAGTACTTTTCAAGAGTTTTTGGTAATTTTT
-CGATTTTTCAGAAATTTCAAAAAAACGGCGAAATTCCACTCAGAACCCTC
-ATTAATATTTCACTAGTCCAGCACACTAACCCAAAAAATTATTTTTTTTT
-TGAACTACAGTAATCCTACAAAATTGCTACAGTACTATTACGGGACCATA
-ACAAAATTTTGATAATGCGTATTGCGCAACATATATGACGCGCAGAATAT
-CTTGTAACGAAAACTACAGTAATAATTTGAATGACTACTGTAGCGTTTGT
-GTCGATTTACGGGCTCAATTTTCGTAATGTTACACGACACATTTTTTTGA
-CAAATGCAAAAAAGTGTGCGCCTTCAAATTAAAAAAAAATTTGATTTTTG
-TTGCCGGCTTTTAACACATCGAAAAAATAAAAGAAACGAAAGTTTGTAAT
-TACAGTACTCCTCTTAAACGCGAACACCTTTTCGCTTTTCAGAAAAACTT
-GCGCCGTTTCGAAACCGGGTACTATACTTTTATATTAAAATCGATTAAAA
-ATCGCGAAATTTTGCGGTGGAGCATATGTCAAATTGCAACTCGAAAAGAA
-AAAATCTGAAAATGCATGCTGTGAAAAAAAAAGCAGCAGTACTCCAAGTC
-ACCCATTGGAAAGAATGACTGAAAATTGAAAACAATTCTTCACTTTGAGC
-GAAAAAATGCCGCGTTGAATGAGAGAGGGACGAATCGAAATTTAAAAGGA
-GAAGATCAAAAAAAAATGTTTGTGGTAGGTCTGGAATCTTGCAAATTATC
-GTTTTAAAATCAATTTTTAACACTTTTATATCATAAAAATAGTTTTTCAT
-CAATCAATCGATTAAAATACCAACTCTCGAAAATTAACAGCTTTAACAGC
-GCCGTCTACTGATTTGAAATTGCAGTCGCTGCCGCTCAATTAAATGTTTT
-GCGCGTCAATTAAAATGCCTTGTACGCAGATGCGCGTCTCCTAAAAAATA
-AAAAGTTGTCCAATTTTATTGAAAACGGGTATTTAATTCATGTAAATATG
-CTGAATTTAGAAAATCTAGGTTTAACCTATCAAAAACTATAAAAAAGTGG
-CAAAAATGGGCAATTTATGGCAAAAATTCACAATTTTGAAACTCCTCTAA
-AATGGTTCATTTTATTGGTAGAAGAGGACTAAAAATTGATATCCGAACCC
-TAAAAAAATTGTCCTTTTTCAATATTCAGAAGAAAATTATGAAGTTATTT
-ACTTCCATTTTTCGATTGTACGGTAAATCAAAACTAAAGGTGGGCACGGT
-ATCTGATAAAGTTACGATCGTTCCAGGATCACGAAAATCGAATAATTACA
-CAGCCAGAGTTACATGAAACAGTGTTTGGGAAATTTAAAAATCAGTACAA
-GAAAACCTCAAAAAAAAAACAAAATTACAGGAAAAAACGGAAATTTTCAG
-TAAAAAATTATAGGGTATGTAAAATCGATAAAATATTTAAAATTCAATCG
-TATTCTCCGTTTTCGGCGTTCGGATCGTTCACTGGAAGTACGGGATGTCG
-AAGTTTGAAATTGAAGAATTCGCACCAACCGGCTGGAAGTAGATCGTGGG
-AGCTGCAAAAAATGTTCGTGGCCGCGAAAAAAATCGGTGGCCGATTTTTG
-TTTTTTCGCGGCCACGTTGTGACTAGACGGCGAAATAAAAATTTGTTTTT
-TGGTTTTTAGTGTTCAAAACTGTTGTTCTTGTTGAAAAACAATTTTTTCG
-AATTTTTTTTGTTTTTTCAACTAATTTTTTTTTCTGAAAATGCTTTTAGA
-ACAGTTCATTTTGTTTTTTTTTCAATTTTTTTCAGACACCCCTTACTCCA
-TATCATAAAGCTCGGAAAATTCGGAATCCCATCCCTGAAACTCGATGAGC
-ACCGTTCTACCGTGTACTTCTTCGACGGAGGCCGGTGATATCCAGTAGGT
-CTCGTTTTGGCCGACGGCTTCAAGGACACGACCGAACTGAAAAATATTGT
-TTTTTTTTTCAAAACCATTTTTTTTAGGAAAAAATTTTTATTGAAACGTT
-TTTTTTTTAATTTTAAAATTCCAAAAAAACGCAAAAGTGCAAAAAAACTT
-GAAAAAAATGTTCTCAATATTTTTTCCGACTCACAATCAAAGAAAATTTG
-AATCGAAAAAAATTAATTGTTTTCTTTTAAAATTTAAGGAAATTATTTTT
-CTAATTATTTCTTCCAAAAAAAAGTTTAAAAATAATAATTTTTCAAGTGT
-TTTTCAAGAGAAAATTAAAAAATTTCAAATTTCAAATTTTAATATACTTT
-TTATTTTAAAAACTTGTATAAATCTCCGAATTATATGGATTTTTTTGAAA
-AATAAAAAATTTTTTTATTGGAAAAAGAAATCTGATTTTTATAGTTTTTT
-TTTTTAATTTGAAAAATACGAATTCTATCACGGCAACTCAAAATTCTGAG
-AATGCGTACTGCCCAATATATTTGACGCGCAAAATATCTCGTAGCGAAAC
-TACAGTAATTCTTTAGATGACTACTGTAGCGCTTGTGTCGATTTACGGGT
-TCAGTTATTTAAATGACTTTATTTTTCGTATTATTTTCTTCATTTCAATT
-AATTTTAAAAATTGAGCCCATAAATCGACGGTACCGTAGTCATTTCAGGA
-ATTACTGTAGTTTTCGCTACGAGATACTTTGCGCGTCAAATATGTTGTGT
-AGTACGCATTTTCAGAATTTTGAGCTGCCGTGATAGAATTCGTATTTTTC
-AAATTAAAAAAAAACTATAAAAATCAGATTTATTTTTCCAATAAAATTCG
-TCTAATTTATAAAAAAAAATAAAAATAAAAATTGAACAACGCTGAAAAAT
-CCCAGATTTTTTTTTCTTATTTTTTGAAAAAAAAAACTTTTTTTGGAATT
-TTAAATTACATAATTTTTTTGGTTCAATCAATTTTTTGGTTAAAAAGCGT
-TTTTTTTTCCTTCAAAAAAGCACCTCAAACATGTGCCTTCTCTCCTTGCT
-CGGCAACGGCCTAAGCATCTCATCAGGAATTTTTTCCGCCTGCTTCTCCT
-TCAAATACCCTTCCCACTTGAATTTCCCGGGCTCAGTGCCTGCAAGCCGA
-TCCAGCTTGATTCCGAACTTCTCAGCATAGCCGACAGGATGCATAAAATG
-ATTATCAATATGAATTGGGAAGGATTCATCGTCCGATTCTGTCTCATCAG
-GTGAAATAATTAAAAATCCAGGCGTTTTGCATATTTTTCGAATTGTTGCG
-ACGCAAAATGACTGGCGTAGGTCGCTGAGTGGATCCAAAAGTTCAAATTT
-TTGGCCGACTTTTAATAAATTTAATTTTTCAGCTGAAATGTCAGGTTTCC
-CAGCAAAAAGTTGCTCGAAAGTGACGTCATCTTTATGATAACTTCCAGAA
-CCTTCTGCGATCCGTCTGGAATGTTCCAAATAACCTTCCGTAGCCTTAGT
-CCGTAATCCATTAATCATTGCAAATCCGACTGGAAACAGGAAGAAGCTCG
-ACTCATCCACCCAAAACTCGACGTTTTCATGCTGAACCTGCCGATCTTTG
-GCCTCTACGGAAGGAAGATCTTCGGGATAATCCTGAGCGGTGACCATGAC
-CATCAGACGGCGGCCAAGGATCCTGAGGATCCGTGCGACACGGATTTCTG
-TTGGCTCCAAGTAGTTGAGTAGCTCGACGCGTTGATTCAGCCGGAAACGA
-GATGGGCGGTGGGCAAGGTGGCGGAGTTGGTCGAAGATTTTTGGCTCAGA
-GATTCGATTTTCGTGCAGCTCGGCTTGAAATTCCTGCAGGAAAATTTTTT
-TAGGAAATGGGAAAATCAGAAGGGTTTTTTGGAGTTTTTTTTCAGTATTA
-TTTTTTTTGTTGTTTTTTTGAGGCTTTGTTAAAGTTTTTAGGTGAATTTT
-TTTTGTTGATATTTTTGGTTTGTTTAAGAATAAATCATTTTTTGAAAAAA
-ATTCGTTTTTATATTTTCGGTTTTTTGCTGGTTTAGTTAAAAGTTTTTTT
-TTCGGATTTTCAGGTTTTTTGACAAAAATTGATTTTTTTTTTGGTGTATT
-TCTTAGGTTTTCGGGTTTTTTTTTTGGTTTTTGACGAAAAATTTATTTTA
-AAAAAAACGGACTTTTTTGCAAAAAATATGGGGTTTCTTAAAAAAAAAAA
-TTTCAATTTTTTTTGTTGGATAAAATTAAAGTTTCTTTTATGGTTGATTT
-TTCGCCTTTTTTCACATTCTCCACCAGAAAAAACATGAAAAAAACCAGAA
-ATGAGTAGTTTTGAGCAATTTTCAGGCAGTTTTTCCGCTCAGAAAATAAT
-TTTGGCCGGATTTTCATGGTTTCTCACATCCAGAATCTCCTCTGTTGGCC
-GTGGTACGGGCGGTGCAGGCGTAGATCCACGTCGCCAAAATTTCGGGCAT
-TGCATCGGTTTCAGCAAGCTCAGTGGCCTGTATTGAAGCCATTTCATCGC
-TGGATCCTGCTTGAGACCGCTGAAATTTCGCGTTTTTTTTTGGAAATTTT
-GTTGAAAAATAACCTTCCAATATCGAAAATATCCTCTGAAAGCATATGAA
-ACCAGCAGGGTCTTCTATTAAGTTCCCCCACAAATTTAATTGCCACGTAG
-AAGCCGCAGACAGCAGTCACCTCGCCGAACCAGCGGATTTCTGGAGATTT
-AGTGGTTATAGAAGGATCCAGAGACGGTCGGACGACTACTTCTAGCTGAA
-AACATTAAGATTATGGCTTTAAAGTTTTTTAAAAGAAAAACCAACTCGAA
-ATCCAGGTTTTAGGTGCTGATTTAGCTTTTCCAGCGGCAAACAACCCTCC
-AGCGCCTCGACAGGTAAAAATTGAGTATTTCCATCATAATTACATCGGAG
-TTCATCTGACCATGTGAATGTTCCTTCAATTTGTGGCTTTGGAATCCGCT
-GGGCGATTTTCTCAACTGGATTTCTTCGACGATAGAATAGCCGTTCTTCG
-GTGAAATATCGGTATTCTGCTTCTTCAAGTTTGTAATTATATTGACGCTG
-AAAGTAATAAATTATGTTTTTCGATAAAAATGCTTTTAAAATTACCTTTT
-TATTCGAAAAATTCATTGATTTTAATTAAAAATCTATTTAAATTGTTTAA
-ATTAAAAAGTTCCAAGCTTCTGTAGTTATCGCGTCGAGACCCAACACACT
-AATTACCACATGCGCCTTTATATAAATTTTAAGAAAATCAACATTTTAAA
-AGATTTTTACAGTTTTTTTGTCGTTAAATTTTTCGAAAAAATGATTTAAA
-CTCACAGTAAACTTGTTTGAAACTTGAATATTAAAATTTCACAGTCAATG
-GGTTAAATTTCAAGACTTTCCCACTGATGATACGGTAGGCGCGAAGTACG
-GTAGTTTGTTTTGTTTTTTTTTATTTTGCCGCCGAGTGATTCAAATTTGA
-ATTTATATCATCCGATTTTTTGATTTTTTCCTCAATATTTCTCGATTTTT
-CAGCTTTCAGTGTGATTTTCCAAGAGCCGTAGCTCGACCAGACGACGGAG
-AGCCTGAGGCTGGTCGCCAGAAGCACTATGAAGTGTGGGTTTTTTTTAAA
-GCATAATTTGCATTAATCTTCTAATATTTTAGCCACCCCACACCGTCCAC
-GAACAAACTCCGAATCGAAGCTCGGGGCTCGCGAGCAGCTTCTCCGGGAC
-TCTATACGAGTGGGTTTAAGTTCTTAATTTCAAATTTCACTCATTTAAAA
-ATTTTATTTTTTAGCTTCAAGTAGCTTCGGAGCCGTACGTCCACATGACA
-AAGGAATCCACGTGGGACGAGGCGAAAAAACTGGCGATCAGTCTTGAAAA
-GAAGCCGGACATTGTCCGTAAAGCGATATACAATCGTCGTCGCTTCGTCA
-ATGAAAAGATAAAAAGTGCGCTGGTCAAGCGCGAAATCATCGACCCAAGA
-AGCCCGGCAATCCATGAAATAGCAGTGGCGGCGGAGGTATTTTAAAAGAA
-AATCAGACAAATTTAATATCTAATTATTCCCCATTTTCTTGCAGACAATC
-GCCATAAACGTTGTGCACTTCTTGGAGACTCATCACGCAAAAATACTCGC
-TGAAATCAAAGCGGCCGCCGCTGGAGCCGGCGCCCAGCTCCGAACTGCAT
-GAATTAATTCAAATTAATATTTTTAAACTCATTTTTCACACAAATAATCA
-TTCATGTGTCCATTTTTCACTCTCGAAACCCATATACCCTCACTCTAAAT
-ATCAATATAATGCACATTTCTCATAGTTTTAATCTGCCCTTACCAATTAA
-ATCTTACCAATTTTCCGCCATGATCCCTTTTTCCATTTTGAATAAAATTC
-GACGACGATTTTTCCATTAAAACAAGAAATATATAAATAGATTCAAAAGT
-GGCGCTTGTGTCGCTCAGCGGTCTCCTCCACTTGCACACTATCTCACCGC
-GGCCTTCCAATTACTCGTCCATTTTCCAGCTGTAAAAAGTTTATAAAAAC
-TGAAATAAATGCAATTTTCAGCAGAAAATCGCTGAAAATGCGGCAAATCG
-TCGAGCTAAAGTCACTTTTGACTTCGGAGCCAATTAAAGCCATCGAGCTC
-TTCGATAGGCTCGTTGGACAAGGTTTGAGCCGAAAATCTAAACTTTTAAG
-CTGAGATTTCTTTTAAAAATCCCTTCCAGATGCCGACACAATCACCCAAG
-AAGCCTGTGGAACCCTCGCCAACTATATCCGGCATTCCAGTGTTTTTAAG
-CGACGGCTTCTGTTCACGGAGCTCCAAAAATGCTCGTTTTTTGCGAAATT
-GTGCATTTCGTTTCAATTTCACAGCTTTGAAGACACAGTTTTTCCGCGAA
-AATTGATTTTCGAACGATTCAGCGTGTTTTGCGGTGAACTGGAAAAGGAC
-AAGCCACGTGGGTTTTCATTTATTGAAAATTGAAAAGATTTTTGCAAAAA
-ATCATAAAATTTAATGTAAAACTGAACAAAACTCGATTTTTAACCGAACC
-TTTTTGTTTTTTCCGTGAAAAAATCGGTTTTCCAAGTTTTTCGAACATTT
-TCCGAAAAAAAATTACGCAAAAAAAACGATTTTCAAGTAACAAATCCGGA
-AAAATCAAACTTAAATATTTTCGGAAAATTTCATAATTTTCTTCAAATCT
-CTGTAAAAAGTAGATTCGATTTCTGGGAAATTTGAATTTATGTCATTTCT
-TTAAAAGCGCATGCTCTTTTGTAGGGTCTCGCAACGAATTATTCAATTTA
-AACTTTGAAATTCGCGCCGAAATTTGGGTCTCGGCGCGATTTTTCGAAAA
-ATAAATGAAAAATATGTACTATTAATTTTTTCTTGAAAATTATTGATTTT
-TCAGATCACCGGCACCACGTCACCGCTGTCGGATCGAATCGTTTCTTCAA
-TTTGGGACTACTTTCCGATGGAAGCCCCGTCTCAGAACCCCGACTGGTCC
-CCGTGCCACGTGTAATTCAAATCGAGATGACAAATACACACACAATATTT
-TTGACTGCTGAAAATCAGATTTACGGCTGCGGAAAAGCTTCATCTTTTTT
-GCCGGATAAAACGGAGGAGACGGACGGTGGTTATGTGGCACTGCCCACTT
-TGGTAGAAATTCCAAAAGTTACTGGATACGTGGCAGCTGTGAAGGTGTTC
-GATGGAGGATCACAGTTTTTGATTGGCGGCAAAGTACGGTTCTAGAAAAT
-TGGTGGCCGAGTATTTTTTCGCGGCCACATGGCGATTTTCTACACGAAAA
-GTTGTGTAAAAGACAAAAAGGTGTGCGCCTTCAGGGATTACTGTAGCTGA
-AGTTTTTCATAGATTTTTTTTTTGGCTTTAAAAAAATCCTTAAAGGTGCA
-TTTTCGTGTCGAGACCTTGTTGTATTATTTTGCTAATTTTGCTTAAAAAG
-TACAGTACCAGGTCTCGACACGAATAGTTTTGATAAATGCAAAAATGTGT
-GCGCCTTTAAGGATTACTGTAGTAAAAAATAAGAATCCCTTTTGGAAAAT
-TTGATAATTTTGTGAAGAAAAATAGATAATTCTTTGAAAATGAATAATTT
-TTTGGAAAAATCTTTTTTTCTTATTTTTCTAGACGTACACCTTTATTTCA
-TTAAAAAATTGTCGCGCCGAGACCTGATACCGTATTTTTGAGCGCAAAAT
-CGTGCCGAGACCCAAATTCGTGAATTCAAATTTTCAGTGGTATTGTGTTG
-GAAAATGTTCGATTTCCGGAGAAACGCGACGAATTTCGTCGAATTGTTTT
-GTTCTGGTAGAGGAGGAAAACGAGGAGAAATTGGAGAAAATGACGAAAAA
-TATCGATTTTTACGTGGCAAATGTGCCGATTGAGGAAAGGATTGTGAAGG
-TGGATTTTTTTTTTCAAAAATTTGAAAACAAAAAAACTAAAAAAAAAAAT
-TTTAATCTTAGTTTCTAGAATTCAAGCCAGTTATAATAATTTTTAAACTA
-AAAATTGCATCTTCCGAATTTTCAAGATTTTTTTTTCTGAAAATCGTTTA
-AAAAAATATCTTGAAAAATCAAAATTTCAAAAAAAACAAAACTTGAAAAA
-AAAAACGTCTTTAGCGGTATTTTTTCTATAATTTTTCAATTTTTTTCAGC
-TTAAAAATCATAGAAAATCGTAATTTTTTGACATTTCTTCCAGGTATATC
-TAAAAATGGACCAAAACGAGATTCTGTGGGATAGAACGAGCGATTTCTCA
-GCGGAAAAGCCGATTTCCTTCATAATCAATGGATTTCCACAAATGGCAAT
-TTTCGAATCATTTCAACTTTTAAATGATGGAACTATTTATGCTGCGAGAA
-ATTCACTTTTCAAAGGAAAATTGGAGCTATGGAAGAACAAAGATGACGGG
-TTTAAAGTGAAAAGCGGGACTGTTTTGGAGCATTTTGACACGAAATATAC
-ACTTATTGCACTGATGGAAGAGGTTCCCGGTACTATTGGAACAGAGTTTT
-TCAAAGTTTCACCAGATGGGCAGAATTTGATTATGAAGGTTCATTTTGTT
-TGGAATTTGAAGGAATTCGACCTTAAAAATATAAAAAATTGCACTGATGA
-TGTTATGGATTTTTTTTTCAGAAAAAAAAAAACGAAAAATTGAATGCTAA
-ATGACAGAAAATATGCCCCTGTAACATTTTTTTTTTGAATTTTCTAAATT
-TTAAATTATTTTTTTCAGTTTTGCGCAAATCAAAGAAACGGCCGAATTAA
-ATTTGAATTCCCGCGCAAAAGAGTGACGTCATTTTTTTTTTCCCGTTTTC
-CGGATGTATTATTAGGTTTTTATTTTAAACACAGTTTGTCAATTTTTCAG
-ACATTTTTTTTTAAACTTGATAACCCGAAAAAAGTGGCCTAGAAATCGGC
-TTTACAATTTTTTTTTTAAATCGACAAACTGTGTTTCAAATTATGAAACA
-AGGAAAAAACGAAGAAAAACTTATAGCCGGAAAACGCGAAAATGTCGAAA
-ATGACGTCACTAAATTGCGCGGGAAAAAATATAGAATTTTTTTTTAATTA
-ACAGCTATATTGAATCATTAGGGCTTGTTCTCCGTCAAAAAATTTCTCGA
-AAAAATTGATTTTTCGTTTTTTTTTGGAAAATCGAAAAATTTTGTTTCTC
-AAAAAAAACAAAATTGGAATTTTTATTAAAAAATTATTTTAATCCAACAA
-AAAAAACTAAAATTTTTTGCAAAATTTAAAAATTCATAAAACATTTAAAA
-AAATTTTTTAAAAGTTATATTGGGACTGTATTCTAATACTTGGACTAAAA
-AAACCCACATTTGACAAAAAATTCAATTTAAAATGAATATTTTCAGATGG
-GCTACCAAAACGAACAGAAAACCGAGAAATTCGAATTCGAGTCTCCCAAA
-ATTCACAAAATCATCAAAAATCGTGAAGTACAATGTGATCCAGTTGATAT
-TCCGTTAGACTCGACTATTCATTTTCATCAAAATTATAATCAAGAAGTAT
-TGAAATTTCAATCGAATCGATTATTATTTCAATGGATTTATCCGAATTAT
-TTGTTTCAAAACGATGGAGATGTACATTTTTCAATTGAACAATTGGAGAC
-TGTATTTGCTGTGGATTTGGAGAATTTGGAATTGTGAGGGTTTCTTTTAT
-TAATTAAAATTTTTTTAAGTGGAAAAATTTTGGTTTTCTTTTCAGAAATT
-ATTGTAATGTTGTAACTAAATATTACGGGAACACGAAATTCTAAGAATGC
-GTATTGCACAACACATTTGACGCGCAAAATATCTCGTAGCGAAAACTACA
-GTACTTCCTTTAATGACTACTGTAGCGCTCGTGTCGTTTTACAAGCTCAA
-TTTTTTAATACTTTAAATTAAAACTTTTACTTTAAATTTTAAAAAAATTC
-GTCTTATTTTTTAATTTTTGCTTTATTCCAATATTCTGTCGATAAATAAA
-TCATTTTAATAAATTTAGAAAATTGAGCCCGTAAATCGACATGCGCTACA
-GTATCCATTTAAAGAATTACTGTAGTTTTCGCTACGAGATACTTTGCGCG
-TCAAATATGTTGCGCCGTACGCATTCTCAGAGTTTTGTGTTCCCGTAATA
-TAGAAAATTAGAAGTATGTTAAAATTTTTAAAAAGTATTTTTTTTGGACT
-TTTACCCAAAGATTTTTTTTTGCAAATTTTTAGTGAAAATTATTATTTTT
-TTCAATTCACGCTAAAATTTATTAAAAATTTAAATAATTTTAGACTGTAT
-TCTATACAATCAAAAAACAACAAACATCAATAAAATTTTCAATGAGTTTA
-AAATTTTTTTGAATTTTTTAAAACTTTTCTTCGTTGACAAAACGTTCACA
-AAACTTGAAAAAATATATTTCAAATTAATACTTAAAAATTCAAACAAAAA
-ATTTTTAAAATTTTTCAGCCCGAAATACCAACCTATATCACCAGAAGAAT
-TCGTTCCCACCGACACTTCTCCCTCCGATATCTGGTATTTAAAATCCAGT
-GAAAAATTGAAAATCCCTTGTCACAAGTACCTTCTCCTACTACATTCACG
-TCAAATTGGCGCGATGCAGAGATTTCATTCAAATTATGGGAATTTCGGCG
-ATTTTAAGGATGGTAAATCTGAAAATGAAGTGGAAATTGAAGCGAATGCT
-AGTGTTGAAACTGTGAAAAATGCGCTGAGAGGGATGATCAATATTCGAAC
-TCTTTTCAAAATTAAGACTATTGAGGTAATTGGATTTTTGGTGAAATTTG
-AAATGAAAAAATATTTATAAAAATTGAATTTTTTTTCAAATTTTTTTTTC
-AGTCACCATAAGTCAATTTTCCATTAGATAAAAATCGATACTTTTTCTAA
-ATGCGATAAAAATTGGAAATTCTATAAATTCCGGAAAAATCGATTGATTT
-CAAAAAATCGATAATTTCCGGAAAATTGATAAATTCCAGAAAATCGGTAA
-TTTCCGGAAAAATCGATAATTACCGGGAAAACCAATTAATTTCCAGAAAA
-ATCGGTAATTTCCGGAAAAATCGATTGATTAAAAAAGTCAATAATTTCCG
-GAAAATTGATAATATCTAGAAAAATCATTAAATTCAGGAAAAATCGATAA
-ATTCCAAAAAAAAATCGATAATATCCTGAAAAGTGAATAAATTCCTAAAA
-ATCGATGAATTTCATCAATTCCGGGAATATTTTTTAAATTTAAACTTTAA
-AAAATATTTTTTTAAATCTTTAATCCTTATCTATTTTATTCAAAAAAAAA
-CTGATCAAAAAAATTTTTTTTTTTCAAAAATTCAATATTTTTGCAGTTAA
-TCGAATGCATCAACTTCTACGATTATCATTTAATGGATGAAATGTTCAAT
-GATTCAATGCATATTCTAATGGAAACAATCACTGAATTCACACTTCCATT
-TCTCTACGAATTATTCTATTCGTTTGAGGAAAAAGTGTTGGAGGGACTTT
-TGCAGAGGAAATATTTGATTTCTAACTCAATTTCCAGTGTTTTACCGCCA
-AAGGAGCTTCTTGTACGGTAAGTGAGTTAAGAAATGGAAAAAAACACATT
-TTTGCTACTGTTGGAATTTTTTTTATTTCACAAATATATTTTTTTTCATT
-TTAAAGTTAAGTAGGAGTTTATCAACTTTTCTGGATTTCATCAATTTTTC
-CGAAATATTTTGATTTTCCCGGAATTTCTGTGTTTTTCAGGAAAAAAACC
-CCAGAAAACTAACAAAAAGAATTAGCAAAAATGACCTAAAAACCGTAAAA
-CTATGTATCCCAACTTGTCCACGTGTAGTACAAAAAACCGATGTGCACCA
-ACAAGAATTTTTGCAAAAGCTATTTTTCCATTCAAAACTGCGCCCCAAAC
-AGTTGAAATTTTATAGAAAATTTTCGAAATTCGCTTCTCCGAAAATAAAA
-ATCTCAGATCCGCCCATTTCTTGGCTCTTCCAGATTCGCTGAAAAACTGG
-ACACCGATTGCCGCCGACACCACACATTAAAAGTTCCGTCGAAATTCAAA
-AATCTAGAAAATCTGAGCACCTATGAGCCCGAGTACATTGTCAAATATTT
-TCTGAATCTCGACCAAGATTCGGAGGATGTGACGTGGCGATCGATACGTC
-ACGAATTCCACGACACACTTGACACGTGGCACGCGGAAGCTGTGAAGAAG
-AGAGATGAGAGACGTATGCACGGAGCAACACGGAGCAGAACGAGTAGTAT
-TCGGAAGGAGAGCTTTACGAAAATTCAAAATGTTTCGATGACGTCATCGC
-CGGTAGGAATATCGATTTTTATGTATCGAATTTACTGGAAAACTATCAAA
-AGTTTAGGAAAAATATCGATTTTCCTGAAATTTATCGATTTTCCTGAAAT
-TTATCGATTTTCCTGAAATTTATCGATTTTCCTGAAATTTATCGATTTTT
-CTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTCCTGAAATTTATC
-AATTTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGA
-ATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTT
-TTCTGGAATATATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATTTA
-TCGATTTTTCTGGAATTTATCGATTTTTCTGGAATATATCGATTTTCCTG
-AAATTTATCGATTTTTCTGGAATTTATCGATTTTCCTGAAATTTATCAAT
-TTTTCTGGAATTTATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATT
-TATCGATTTTTCTGGAATTTATCGATTTTTCTGGAATATATCGATTTTTC
-TGGAATTCATCGATTTTTCTGGAATTCATCGAGTTTTCCGAGATTTATCG
-ATTTTTCTGGAAATTTTACTCCCCAAAAATTTAACAATATATCGTGCCGA
-GACACGAAAAACTCTAAAAATTACAGATTCCAATCGGAGGCGGCCGCTCG
-AAACCCGAAAGTTTCTCAAAATCAATCAATAGTCCTGTCATTCAATCGCC
-ACTCTCTCCCTCACCAATCAAAGGAATGCCAAAGGTAATCGTGTCGAGAC
-CCACCACGCCACCTGCGCCTTTAAATTCCACGTTTTGTAGTCCCGCCACG
-ATAGTATTTCCAATTCACTGGACGATTTTCCTGAAATGAGCATTTCACCG
-TCCCCCTCGACACCGAAATCCTCTTCCGGTGGCGGTCGCTTCGCACCAAA
-AGGAACTCGATTTAAAAAGGATTTCGAAATTCTCGTGAAACCTTCCCAGT
-CACCACAGAATCCGTGGAAAATGGGCGGAGCTTCCGCGTCGATTCGCGAA
-GAAATTGATCCGCAGGAGATCCGATTCGACGAAGTTGTGAAGAAGGAACA
-GAAATTGCAGACTAATATACGTGCGTCACTTGAAATTTTGGAAAAATCGA
-TAATTTTCAAAAAAATCGACCTTTTTTTGGAAATTATCGATTATTCTTGA
-AAATTATCGATTATTTTAAAAAATTATCGAATTTTCTGAAAAGGATCGAT
-TTTTTCGGAAAAAGTTTCGATTTTCTCGAAAAATAACGACTTTTTTTTTG
-AAAATTATCGATTTTTAAAGAAATTATCTATTTTTTTGGAATTTATCGAT
-TTTTTTTAGGAAATTATCGATTTTTTTAAGGAAATTATCGATTTTTTTAA
-GGAAATTATCGATTTTTTTGGAATTTATCGATTTTTTTTAGGAAAAAGTT
-TCGATTTTTCTCGAAAAATAACGACTTTTTAAAAAAAATTATCGATTTTT
-AAAGAAATTATCTATTTTTTTGGAAATTATCGATTTTTTTTGAAAATCAT
-CGATTTTTAAGGAAATTATCGATTTTTTTGGAATTTATCGATTTTTTTAG
-GAAATTATCGATTTTTTTGAAATTTATCGATTTTTTTAGGAAATTATAGA
-TTTTTTCTGAAAAATTATCGATTTCTCAAAGGAAAAGTATCGATTTTTGG
-AAATTATCGATTTTTAAGGAAATTATCGATTTTTCAAAAGAAGAGTATGG
-ATTTTTTGAAACTATCCATTTTTCTTTTAATTATTGATTTTTTTCCTGAA
-AAATTATCGATTTCTCGATGGAAAAATATCGATTTTTCTGAAAATTATCG
-ATATTCTTTTGGAAATTATCGATTATTCTAAAAAAAATTATCGATTTTGC
-AGGAAATTCTCGATTTTTAAAATAAAAACAGCGATTTTTTTTTTGAAAAT
-CATCGATTTTTAGGGAAATTATCGATTTTTCTGAAAATTATCGATTATTT
-CTTCAAAATTATCGATTTTTCGAAGAAAAGTATGGATTTTTGGAAACAAT
-CTATTTTTCTTCAAATTATTGATTTTTTTACCTGAAAAATTATCGATTTT
-TCTGAAAAAATATATAATACCACACATTAATTTCAGGAACCGGATTCAAA
-AAAGTGCAGCTTCTACCACACGTGGAGACGGAAGAGCTCGCCGGAGCTCA
-AATTTTGGAGGTTTTTCGACGAGAACTTCACGATGAGGCGCTCATATGTG
-TAGGAATTTGTGATGGTTTTTTTCTCAAAAATTTGAAATTTTTCAGGTGG
-AACTGGTGATGAGCGACGATTTGGAGGTGGAAAACGAGCAGATCATCTGG
-GGAAACATGCCGGGACTTGTTCGGCGTTAAATTTTAAATTTTTGATTTTT
-TTTTTTCTTGTAACTTGCATTTTTTGTTTAATTTAGTGTTTTCGGTGTTT
-TTTGTTGAAATTTTCGGGTTTTTAATATTCAAAAATTAATTAAATTATTA
-TAAAATAAATGCATTTAGAAATGCGGTATAAATTGAAAATTTTCAAAAAC
-CATCTCCCCGAATCCAGTGGTTTAGGATGAAAATCGTGGAAATCGAGCCG
-AACGAGAGAATTCCGAGTTGCCACGTGGGTCTGAAAATTGAGTGTATTTA
-ATTTTGGAAAATTTTGGAGATCTCTTACATTTTCTCAAAAATCCATAGCT
-TTTTCCCATTTTTTTGTTGCTGGATCATTTTCAGCTCTTCGGTTATATCG
-CAGACTTTGAAGCAAGGGTCTTCCGGGAGAATTTCCTGAACATTTGAAGT
-TTTTGGGTGAAAAAAAAGCTTTTTTAAAAGATTTTTTGGTATTTTCAAAT
-AATATCGGAAATTTGCGTTTAAATTTTTTTTTTCAAAAAAGTGAATTTTT
-TCAAATTTTTCGAAAAATCGAAAAAAAAATTTTCGGGTTTCTGGAAATTT
-TAATTAAATGTGTTTATGATGATGAGAAAATATAGTTGACAAAATAATTT
-TTTCCGATTTGTCAATTTTTCAAAAAATTTGAAAACAATTTTTTCCATTT
-TTATTCCTGAACATAAAAAATTCGAAAAATTTTCGTTTTTAATAATATTT
-CGGAAAAATTTTGAATTTACCGTAGTTGTGTCATTTTTAAAGAAACTCAC
-AATATTTCTAATCGAAGTATGCATATTTTTTAAATGAATTTTTGGAAAAA
-TTTCAAACTTGTTTTTTGTTGAATTTTTCGATTTTCTTTCGTTTTTTTAA
-ACAGAACAAATTTTTCATCATCTTTTCTACAAACAAAACAAAAAAAACAA
-TTTTTGTTTTTAGAAAAGCGAGAAAAATTTCGAAAAATTATTTTAAAAGT
-TAGAAAAATATCAATTTTGAACGGAATTTTTTCAAAATTCGATTTTTTTG
-TTTATTTTTCTAATATGTTCAGTTTTTGGCCATTTTTTTTTTTAAAAAGT
-TTGCTTTCAAAAAATTTTAAATGAGAATTTAGATTTTTTAACGAGAAATG
-TTGAAATTGAGAAGAAAAAAAAAATCAATTTTAAATAGAAAAATTTTCTT
-TTTCTAACATTTTCAGTTTTCTCAAAATTCCAAAAACTCGTACATCCTCC
-TGACAAGTACAGTAATCCATTGGATCCAGATTCTCCTCTCCAACACTCGT
-TTCCCGAATTTTTTCGAACCAATTGTTCATTTTCATAAGAACCGAGCTCA
-TCGCAATCAATTTCCCGATATTTCCATCGTATTCCTCCGAAAATTGCTGA
-AGCCGATTCAAATTTCCAATATCATGCTGGTGGAGAGAATACGGAGTGTT
-CAATAGATCCGTAATTGATTTAACTTTAAAATTTGGTTTTTTCATTGTAA
-TAATCATGCTAATCGTCTTGACATGATCTGTTAAATTCTCTCGTTTCGGC
-GGAGAATATAATCGATATTCCAGTGGCACGAGGTTGTCGAGAAATCTATT
-GAAATTCTGATAAATATCGTTCCAATCACTTCGAAGCTCGTCAGTTTCGG
-CTCCAGCTCCGCTTTTGAAGCCAGTCGTTTTTAGATTGTGCTCCAGCGTG
-TCTATTGAGCTCTGAAAATTTGATTTCAAAAATTTTGAGTAACTCAGACA
-ACCCCATTTTTCATCTAATTCGAAATTAGCCACATCTTATAAGAAATTAA
-CCACATCTAATTAGAAAAAACTTTTCTAATTAGAAAGGATGCATATCTAA
-TTAGAAAAGCTGCACACCACATCTAATTAGAAGGGATGCTCGTCGAATTA
-GAAATGAGGCACATCGAATTAGAAAGGGGGCGCGTTGAATTAGAAGTTAT
-GCGCATCTAATTAGAAAGGAGGCACATATAATTAGAAACACATTGCGCAC
-CACATCTAATTAGAAGGGATGCTCGTCGAATAGTACTACCTTTTAATGTA
-TGTACTACCTTTTAATGTATGTACTACCTTTTAATGTATGTACTACCTTT
-TAATGTAAGTACTACCTTTTAATGTATGTACTACCTTTTAATGTATGTAC
-TACCTTTTAATGTATGTACTACCTTTTAATGTATGTACTACCTTTTAATG
-TATTACCTTTTGGCTCTTAATGTTGAAAATAAATCGAATCAAATTAGAAA
-CAATGCGCGTCGAATTAGAAAAAAAGCATGCCGAACTGGTGCGCGTTAGT
-TGACCCTATTTTTCTAATTAGATGAGAGGAATAGGGTTGTCTGAGTAAGA
-CTGCAAATTATCAAAATTTTTTGGTTCAATTTGTTTTTGGAGAAAAAAGT
-GAAATTTCCTGGCAATTTTCAGTATTACGTAGACGTCGAAATATGAGATT
-TTTCACCATTTCTTATGGGTCTCGCCACGCCGACAATCAATTATTGTAGT
-TCATGTCGATTTACGGCGCCACTGTTGCATTAATATTCCAAATGACAAAT
-TTGCCGCCGAGTTTAAAAAATTCAATAAAAGCCCGTAAATCGACATGAAC
-TACAGTAGTTGGTTGTCGGCGTGACGAGACCCAATTCTCATCTTTCGACG
-TCCACGTAATATAGAAATTTTTTTTTTGAAAAAATCAAACGATTTTGCCT
-CAAAAAATTCAAAACTGTAAATTCAAAAAATACCACAAAAAAAAAGCGAA
-AAAAATCGCGGAAGACAGTGGCGCCAGGCTGTCTCAATACAGTTTGATCT
-ACAAAAAATGCGGGAATTTTTTCACAGAAAAATTGTGACGTCAGCACGTT
-CTTAATCATACGAAATCAGATGAGATTTCTGCGTCTGCCATCCCGCATTT
-TTCCAAGATCAAAGTGGAACTGGGACTTTCTGAATAGGACTTTCTGATTC
-CACGTGGGAAGGATGACAAATCCAAAATTGCGATATTTCACTAATTTCAC
-TGCTTGAATTTCCTTGGAACCAATCAGCGTCTTCAAACTCCGCCCACTCC
-ATCTGATTGGTTGAAAAATGGGCGGAGCAAATCGCTGATTGGTCGCAGTT
-CTCATTTTTAGCCAAAGTTAAAAATCTCGATTTTTCAAGGTTTTTTGACC
-ACCTCCAATTCCAAGCTTCTTCCTTACCTTCAAATCGTAGAATATTGCCA
-ATTCTCTGATTGCATCGAGTCCTTCCTTCAAAACCACAACATCTTGCAAC
-TCGAACCCCGAAAGCTGATATTTCTCGTTTAACTTGAATTCTCCTAGAAT
-ATCCTTCGCACGTAGCAACTCTCCAACGATTCCTTCAGTTGGTAGAAACT
-CTTGTAGAGTGTACACTGCCTCCCAGATCTTCTCAAGATCCCCGTAATTC
-CAGACATCTTCCGAGCTAGCCACAAGAAATTGCATATGTTGGTGTTTTTC
-GTTTCGAGCAACACATTCCAATGAGGATACGAAGTTAGACTCGTTGATTT
-TTGTTAAAACGTTTATCATGCTGGCGTAGATTTCCTCGAATTTGGTTTTT
-CTTTCTTGAAATTTTTTGTATAGTTTTGAGGGTACCATACAAAAATTCTC
-GGGAAACTTTTCGATATCATCTATCATCATCGTCAGGTTATCGAAATCTA
-TATACTACAGTGTTTTTTGAAGAGTTTCCACGATATTTTGATCGGTTTGA
-TGTTTGAATGCTTCGAGAATACGCTCGTCTCCGCAACGTCTTAACGTAAT
-GCAAGGCTGTGCGGTGTGTACAAGTGTCTTGTTTAGCTCTTCAAAACCGG
-AGCGATACATAGAAATGGTTTCATGCGCAGCGTCCAGCTGCTCAGGGCTC
-TTGAAAGTTTTCAAACATTCCGAGAAGCTCTCAACAATGCTGTTGAGGTT
-ATCCTTTGGCAGATTTTCCCGAATTTGATTAACTTCTGATAGATATTTAT
-CGATATATTCGATATTTTTATGATATTTTTCCGTGTTGTTTAGGATTTTT
-TGCATCGCAAATTCGAATTCCACATAGTATTCCAAAAACTTATTCAATGG
-ATGCAGGAATTGAATTGATCCTTTGCCAGAAACGCTTTTTATCCAATAAT
-TGCTCTGCTCTTTTATGGACTCTCGAATACTTTCTTCTCGTTTAGGGAGA
-CCTAAAGCTCCACGATCAATTCGTTTTTTGAAAGAAATAATTCAAAAATA
-CCCAAAAGAAAATTGCCTGATGGCCTGGAAGAATGCGTATCCGAGGATTG
-AATACTACGAATAACGTCCCTGACCTTTCGCACCCAATTTGAAAGCCCCA
-GTGTCGTATTGGTGTCGCGAATCATTTCTAAATCACTCAACGCCGCTTCG
-AAATTGTTCAGTCTTCCCACTGACAAGAAGTCTCGAACACTTTTACTTTC
-ATTTTTCATTATAGTCGTAGCGAGTTTGAAGAGATAAAATGGATCTTGAT
-GGAGCAATGCGAATTCTTTCTTGGCTCGTTCCGGAAAGAAATTTCTGTAG
-TAGGCGCCAACCTCTTCGACCGTTTCATAGTTCCGTTCTGTACGATCTTA
-AAAGGTGGAGTACCGAAATCTGGGGAATATTTCTAAATAACTCCAAATTT
-GCTCCTGATTTCAATTATCCATGTGAAAAAATTCAAAAAATCCCTGATTT
-TGTATTTCGGCTTGAAATTGCCGAATTCCATTTGTGCACACATGCAAATT
-TTTCAAACGCGCGCCCAAAGAAATTATCATTGGAGCGCGTTTGCCTCATT
-TGATTCTCTCCGGAGCACGGTAGCACAGAAACTAGATGGATTGGTTCATG
-ATACTCAGTCTGGAAACCTATATTGGCTACTATCTCGAAAACCATCATAA
-AATCGATTTTGCGATGCAAATAAGAAATGACCGCAATGAAATTATCTATC
-TCCATTCGTGATGAATTTTCGATTTTGTACTTCCTGGCCAAGTTATGCAC
-GTTTGTTCGGTGGAGCGCGTTTTCACCCATCTAGCAACTGACACGGTGGT
-TCAGTAGCCAATATAGGTTTCCAGACTGAGTATCATGAACCAATCCATCT
-AGTTTCTGTGCTACCGTGCTGAACCACCGTGCTCCATCTACCGTATTTCT
-TCCATTAATATGGCTGCAATACTATTTTTCGATGGTCTTCCCGCTTGCAA
-TACTAATAGGGAGTGCAATACTAATTTTCAGAATATTTTTCTGCCTTTGA
-GCTTACTAGTTTTTTTCTGAAAAAGCTCGAATTTTATGTAAAAATTCAGA
-AAATTGGTTTTAATTGTAACCTATAAGTTTCAAAAATTCAATCTCGTAGA
-AATTTTTTTGAAAAATTGTTGCAAAATAGGCAAAAAATATTGTAGAAGTC
-CTGAAATTAGCGAGACGGGATTGCAATAAAAAAAAGTAAACGCAAGACTA
-TTAGGGAGTGCAAGACTAATAGGGAGTGCCATACTAATTTTCGGAAGGTC
-TCCGAGGGGCAATACTAATAGGGAGTGCAAATCTAATAGGGAGGCCATAC
-TAATAGAAGAAATACGGTATTTTTAGTTCCTTTATTTTTTCAACGAGAAA
-ATCAAATGAGGCAAACGCGCTGCAATGAAAATTTAAATTTATTTGTGCGC
-GCATTTGAAAAAACTCATTCGGACGCAAATAATATTCACGAATTTAAGCT
-GAAATATAATATCAGGGAAATTTTTTTGTTTTTTTTTCATACAGATATTC
-TGAATCAGAGGAATTTTTTTTAGTTATTTGAAAATATTTCCTAGATTTCG
-GAAATCAAAACAGCAGCTTTTGTACAACAGCTTTTTTTTAAATGTAAAAC
-TTGTTTAAAAGTCAAACCACGTCCATTTTAAAAATTAATTTTTTAACTTA
-TAAAATAAAAACATGTGGAATGCTTTTGCATGTACATTTATACAAGTTTT
-TTGAGAAAAATACATTTAAATTTGAAAAATGTGTTTACTAAAATTCTGAT
-CAATTTTTTTGTTATTATATATTAATAGCTGAACTTTACTTTAAGACAAA
-AATTCCTCTAATTAAAATCTACCTTCAAACCATTTTTTCAGTTTTTGCAA
-ATTCTCCTCGGAAATCGCAGTAGGACTGGGAGCTAGATCATTGAGTGGCG
-AGAGAAAATCACGGAAATTTTTCAGGCGATTTTTCAGGCCCCATGTTGCC
-TCCCATCCGTATTTTGGTTTCATGAGAGATTGGAGATCATGAAATAAATG
-CAAAAAAGCATCCAGCGAGGTGGTGATCTTTTTCAGTGATTCTCGCTGTA
-GTTGAAGATGTGGGAGCTTCTTAAGTAAATTTACAGCTTCTTCTCTATCC
-TTATAAACTTTAGTGTTCTTCCTTTTCCCGACAATCTCCTCGAAAGCTCT
-CTGCTCATCCCATCCGCCAATAGATTTTGTTTTGTAGAAACTTGAAATCC
-TATCAAAATCGATATCCCGATCTAATAGCTGATTCGTCAGATCCGTAGAA
-GCGATTTCGCCGCTGAGAAGCCCATCGACGATAAGATAGCAGTTAAGGAG
-CGGTGGTAGTGAGCTCATCCAGTGAATCCACAGGTTTATGGAGTCCTTTC
-CGTAGACTGAAATTATTTTTAATATTAAAGTAGAAAAAAATTATTATATA
-AACTAACTATACGCAGGAAAACTCGCATTAAGTTCCAGATTTCGATCGAA
-GAATTGTGGATGTCCAGCTGGAAATTTTTATTTAAATTTAGTAAATTTAG
-TGAAGAAATTTAATTTAAAAATACCTGTCAAGCGCTGACCCTTAATCTGC
-TCCAACATTTGAATACCTTGCCGCTCCCTTTCCGAAATTTCGAGATCTCC
-GCAGTGTTTACCCGGTAGAAAAACAAGAAGAAAGGGAATTATCGTTATAA
-TCATCGTTATCTGGAAAAAAATTAATTTTCATGGAATATATTTCAAATTT
-TCGACAACCAAACGCTGAAAATTCACATTTTTTTCAGGAAATTTGGTTGA
-AAAATCTGTTTTTCATAATATTTTGAGAAAAAAACAAGCGTAAAGGTATT
-CAAGGCGCATGCAATTCACTTAAGCCAGGGTCTCGAAGCGAACAGAAAAC
-ATACGGTATTTGAAAATATTCTTGTTTTCCGCGGAAAGTCGCAGAATTTA
-ATTTGATTTTTTTAACTTAAAAAAACAGAAAATTAACCGTTATACCTTTT
-GAGCAAAAAATTCTACAAGATAATAATTTAAAACAATTAAAAATTGAATA
-AACATTGAAAATTAAATGCTTAAATTTCAAGGCGCGTGCATCAAACTTTT
-GTTTGGGTCTCACACCGAATGTAACAAGTACGGTAAGAGTGCGCGCTTAT
-TTTCATTTTTCGAATTTGTGCGACCAGTTCTCATGTTTTTTAAACGATTT
-TTGCGGTAATTTTGGCCATTTTTTCTAGTTCCCACCGACAAATTGCATTA
-TTTCCGTATTTTCAACGAAAATTTTGTTAAAAAACCAACAAAAATTTAGA
-AAATTGCATCATTTTGCAGGGATGAATGGTCAAGCGGATCGCTGCGACCG
-AACCGCCTACGTTTCGGGTCTTCAGCCGACAATCTCCGACATAGAACTGT
-TCGAGGTGTTCAATCGTGTCGCTCACGTCGAGAAGGTCATCGTTCGCAAT
-GGAGCCGCCCGTCACGCGCTCATTGTTTTCAAGTTGGCATTTTTTTTCCA
-TTTTTCCTCATCTAAATCTCTAATTTTCCTATTTTCAGAACTGTTCAAGG
-CCTGTATCAGGTGCTCGTAAACTTTCAAGGAACAACTCTTCACGGCCGTC
-AGCTGCACATTCGTCCACTGCGAGAAAGTTCGCACGCGAACAGCGAGGCC
-ATCTCAACGATGTTCGAGAAGGTCAAACATCAGGGAAATTCCGGGAATTC
-TTCGTATCGTCAAGAGCACTCGTTCCCCGAGTACCGAAACCAGAACCCAC
-AGGCTTCATCATACCTTCCACCGAATCCACGTGGTCATCGAAACTCGACG
-GGCTGTTTCAATGGTGGCGGCGGGGGCTATGGACGCCGACGTTCCGCCGG
-TGGATACAATCAGTACAATCAGAACAAGTATCCGAACGAAACGTACCCGG
-GAATGACTCTGTTCGATAATCATCCAGTGCAGCAGTATTCGGGCTTCAAT
-CCCATCGATTTTCGCTTTGATGACTATGTGGAAGGAGCCAAAAGGTGCAA
-AATTCGCCAAATTTCGCTAAAAAATCTGAAATTTCGCCGACTTTTCCCGT
-AGCGCAGCAGTTTTTTCTTGATTTAGGCACATTTCAGGCAATTATTTTCG
-GCAAATCAATATTTTTCCACCATATATGTTCTAGAATGTTTTAGATGTAC
-TAGATTTTATTTTCAGACGAATCAAGTGATTTTCTATATTTTTACACTAT
-TTTTTGTTGAAATATGACCAGAATATGCAACAAAGTGTTCCAGCTGCTGC
-GAAAAGGAAAAATCGGCGAAATTTCGAATTTCAGTCTATTTTAATCTGTT
-TAAGCAAAAAGAAAACTAATTTTTAAAATTCAGATTCGACAACCTTGCCA
-ACCTGATTCGCTCGAGCACCCCCACGGATCCGTTCGCTAATTATCAAAAG
-TATTTTTGAATTATTTTGAAAATCAATAAATTGGTTTTTTTTTCAGACCT
-TGTGAATCCACAAGCACATCTCGTTCTCGTACGAATTCAGCAAAAGATCA
-AAAGCATGGCCCGCCAACGTGGAAAATGGAGCTGCAGATTAAGAAAGATG
-ACCACCACCACGCCGGCGGCGGAGCAGCAACCACAGGACAGAAGCTGTCC
-CCACAACAGTTTTTGGCTCAGATAGCTCAGAGACAACAATCGGAGCAAAA
-CGCGGATGAGGTGGCCAAGAAGAAGCGTCCGAACCTTTCGGTTATCAATC
-CATCGCTTTTCTATGAGCAATACCCGAGAACATCGTCGCCAGTTGTTTAT
-GCTTCAAAATCTAGTAATATTTTTTGGAGATTTTGGGAAAAAAACAAATT
-TTCTCGAAAATACGCCCGAAATAGTGTTTCACGCGAAAATTGGCGATATT
-TCAATTTTTCTGAAAAATTGCTATAATTTTTTCGATTTTCACGTGAAATT
-GCAAGTTTTTGGATATTTTTCTCGAAAAACGTCAATTCATCGATTTACGC
-AGCTAGTATACTCAGCAATTGACCATTTTTTTGCAGACAATTTGGTATTT
-TTTACTTAAAATTCTTGATTTTCGACTTCTCGTGTGCTAATCACTTTTTC
-AAATGCGCGCCCGAAGAATTTCTCATTGGAGCGTGCTTGCTTCGTGTAGA
-TTTACGAGAGCTTTCCATTTATTTAACTTCTTTCGTGCTTTTTCAGTTTT
-CCAGCGAGTTTCTGGCTCGACCCCTCGGTGTATTTTGTGCAAACACCGTC
-ACGCGCAAATGCATGCACTTTTTCAACGCGCTGCGTGAAAATTCCTCTTG
-CGATTTCAAATATTTTTTCCCGCCATTTTCCAAAATTTTCGAGAGGGGGG
-GGGTCGAGCCAGAACACCTTGGTTTTCCAGCGAGCTTCCTTCATTTACGT
-CGATTTTTTTTTTAATCTTCGTTAAAGTTCTAAAAAAAAACGACTTAAAT
-CATTTTAAATTTTCCAAAATTCGGTTTTCCTTCTGCAAAAAAAATCAATT
-TCCAGAACCATCCGGCCACTACGACGACAAAATCGCATCTCCACACGATC
-CGGCAGTTCTCGCTTACAGTCGCCTTCGTGTACCTCAATCGGCCTTCGAC
-AGTCTCTCACCAATCGACACCGACAATTGCTCATTCATCACAAAACACTT
-GGGACCAACAACCGGTGTGAAGCGTGATTTGACGAACGACGAGTTGTCGG
-ATATGATTGTATCAACTGGAAATCTCCGAATCAATCCAACCAACATCGAT
-CATCATGACGAACCGGCACCATGGTCTCCGCTGAAACGTCTTCGCGCCGA
-AAGTGGATCCCTATCAACTGCACAAGTCGCGTCGCCCGAGTTCTCACCGA
-TCAAACCAAAGACAATGGAGTTCCACGAGACTGAGGATGATGTTTTTGAA
-ACTGGACCACCACCAACCTACTTATCCGAAGGAAACGAAAACGCGGAGAA
-GAAATGTGTTGAGCAGCCGAAAATCAACTACGACGACATTAATAATAGTC
-GTCTTCCGTCGAATTCTCATTCGGCAGCACCGAATTCCGAGAAGAAGCAT
-TTCGTTTTTCCGGTACGGGGGCTTTTTTTTGAATTACCGAAAAAATTCCC
-AACTTTTTAAAGTTCAAAAAAGTCAAAATTTTTGTCCATTTTCTGGGCGT
-GACTGCTTATGCCCCGCCCCCCTTTTTCGAAGTTTCTGCTTCTCGGAAAA
-TGTATTCCCAAAGTGCCAGTTTTGAGGCCCCACGAAAAGGGAGCAGAACG
-AAAGAGGCACCACGGATTCAAGATCTGGTGCGATTCCGGATCTGGCACCG
-TGCCAACAACTTGAAAACGTGGTGCCTCTGAAAATTTGCTGCCAAGGTTG
-AAATATCGAATGCATTACCCGTAAATCGACACGAGCTACAGTAACCTGTT
-ATCCGCGTGGCGAGACCCATGCGCGTCAGATGTGGCGAAAATTATACTAA
-AACCTGTTTAACTTGCAGAAAAACTTAATTTTTTTTGTTGAAAAAATTGA
-GCCAAAAGACTCAAAAATTTCATAAAGCGAAACTTTAAAAAAATATATAA
-TTTGTTAAAAATTTCACGAAATATTTATGAATTAATTAATTTTTCCAGGA
-ATACCCAATGTGCCGTCACTCGTCAGTTCCATCGATTGCTCACTTGGTCG
-GTGATCTGTCGGACTTTTGCCCACACGCTACAGCCGACGAGAAGATGCTG
-CTCGACGAGGCGTCTTCAATCATCGAAAATACAACTCCAGCAGTGTCTAC
-TGCTCCGGCTGCTGCTCCAGGAGCTACAATGCTCCAAATATAGGAGAAGA
-TCACATATACAATAATATAATCTTATTGCATTTTCGCAATTCTCGTTCTC
-TCCACACACATACACACATCATCCCAAGTATTCCTGTGCTGAATCTCAGT
-TTGAATGATGTTTCATACCGTTTTTATCCCACTATTGCCTTATCGTTTCC
-TGTTTTATTATATTTTTCATTTTTTATATTGCCACCACCACCACCAACAC
-CACCCTCTCTATCTTTTTTTGTTCTTTTGCCTCCAGCAACATCATCACCT
-AGTTTTCTGTGAATTTTGAATTTTGTGTTCCCCCGAGTCCCCTCTGATAG
-GAATGATAGGAAAAACAATGAAAATGCGAGTTTTTTCAAAAAAAAAAATA
-CAAACTAGGAAACTATAGAAACAAAAAAAAAACATTTGAGGCGCAGTACC
-GAAATCTCTCCAAATTTGGCCCGAAAAATTCAAAAGAAAATATTTATTTT
-TCTAAATTATTATTTTTCCGCCACTCCAGCCTCATTCTCATTGGAGCGCG
-CAAAGTCATGTCGATTTACGAGATTAAGATTTTCAACGAGTTTCATCATT
-GTTATCGATTTTCGTGTAAAGTTAACTAATTTTTTTGAAAATTTTCGCAA
-AAAATTTTGGATAATAAAATGTTCAATTGGCACGAAAATGCAGATCTTCA
-GCAAAAAAACCGACAGAAATGTGTAAAACTGAATCTCGTAAATCCACATG
-GCATAACGCGCTCCAATGAGAATGTTTTTAGCGAAAAGTTTGAACAAAGG
-AATATCAAATCAGGGCCAAATTTGGAGCAATTTCTAAAATATTTTCTCAA
-TTCTTTCGGTATTCCACATTCAAACAATTATTCGGCCGTTCCCATGAGCC
-TCTGAATCTCGATGGGATCCCTTGGCACTGCAGCAGTCAACAGCTCAATC
-CCTCCAGCTTCACTAGTCGCCACGTCATCCTCGATACGGTATCCAATGCC
-ACGAAACTCTTTGACAGGCCAATCCATCGGAACATACACTCCCGGCTCAA
-TGGTAAATGGCACATTCGGTGGTAGATCAATGTCTCGGGATACTGTCGGA
-CAATCGTGAACATCCATTCCGAGATAATGACTGACGTGGTGGGGACACAG
-CTTCTCCGCCTGATGAATCATCTCCTTGTGATCCGTAGATCGAATCAGGC
-CGAGTTCGGTGAAACTTGCCGCGAGAAGTTCGTTCATTCGGCGGAACAGG
-GCGCTTAGGCGGACTTTTTCCATTGAGTGGGCGTAGGTGAGCAGTTCTTC
-GTGAACGTAGAGAAGCGCTTCGTAGAGGGATAGTTGGGCGTCTGACCAGC
-TGCAAAAACGAATTTTTTTTTGGGAAGGTTTTTTGAAACGATTTTTCAAA
-TTTCGTTCGAATTATATTAAACTTTATATAAAACGATTATCCACGGATTT
-CTGGCTTCCCTCATAAATTGGAATGGAAGAGTTTACCGAACTAGGCCATT
-TTGGCTCGGCCATATCTGGTGCCGCGTCGCGGCTCGATTTTAGTTGTAAA
-ACTAAATGCATTTGTACGTGTGGAGTACACGACTTTCCCACGCGTTGTCC
-GGCGGGCGATTGTCAATGGAGCGCAAAAAATTCACTGAGGAAGGGGAGAA
-CTCCGTGATTAGCACCGCCTATTTCTCTCACGAATCTATTTCTTCGAAAT
-CTTCTATTTTTTAAAAATCAATTCCTGAATTCTGAAATTCATTATAGCGT
-AATTTTTTGGGAATTTCACCCTGAATTCCATTTCTACGGAACAACATTTT
-TTTCTCGAATTTGTGGTGACTCAAATTAGAATTTTCAAAATCTCCAGAAA
-AAAAATCATTTTTCCTGAATTTTCTGGAGATTTTTAAAGGAATAAAGTGC
-AAAAAAGACTCTTTTTGAGGCACCACCGAAAGGAGAAAGGAGAACACAAA
-CCACGCCCATTTTTCCGTGCCGCGCGCAAGTTTTTCTGCAAATTTTTATT
-TTCAAACGAGACAGCGAAACTCCGAAATAACGCATATCGTGTTCTTTATC
-ATCAACGTGTTATTTCGGAGCTTCGTTGTCTCGTTTGAAAATAAAAATTT
-GCAGAAAAACTTGCGCGCGGCACGGAAAAAATGGGCGTGGTTTCTGTTCT
-CCTTTTTCACCTGTTCTCCTTTCGGTGGTGCCTCTTCTTTTTTTTTTCTA
-TGTTTAGCGTAATTTTTTAGCCATCTTGGAATAGCCCCGCCCATTTCTCC
-CACAAATCCATATCTACGAAATCTCGCATTCCAGAATGATTTGTGGTGTC
-TCAAACGGGAATATTCAAAATTTCTAGAAAAACCCCATTTTTCTTGAATT
-TTGGCCGAACTTCTGTAATTTCTGAAATTCTGAGAAAAATTTTCATTTGA
-GTCACCACAAATACTGGAATGCAAGATTTCGTAGAAATAGACTTGTGGGC
-GAAATCAGCAAAAAATGGGAAAACATTCAATTTTTTTTAATTTTTTGGGG
-TTTTATCACTAATTTTTAGCACTTACAATCCAGAAATCGGAAAGCAACGT
-GTCACATCTGACACATAACCATTCAAATCACACCCAGCATCCACGAGAAC
-ACATTCCCGGGGATTTAGGTCATTATTTGCGTCCAAATAGTGAATAGTGT
-TGGCACGAACACCACCGGCAATCACTGGTGGATATGCTTGCATTTCTGAT
-CCACGACGACGTCCTTCAAACTCCAAGAGCCCGCAAATCGCGTTCTCGTT
-GTGTAGATCACGTGATCCCGATATCATTGAGCTCATTGTCTGGGCTCCCA
-CGTTGCACACGTCACGCATTGAGCTCATTTCGGATGGAGATTTTATTACT
-CGGCGACGTTCGATCTGCAAGGAAAACTTGAAAATTGGCAAAAAAATAAT
-TTTTTTTTTGAAATTTTAAAACGATTTTTCGGGTGTTCAGAAAAATTTTT
-TTTAGGAAAAAATTGGAATTTTCCAAAAGTTTCAAAAAAATAATTTCTAG
-AACTTTTTCCTAAAAAAAAAATGAATATTGAAAGCTTCGAAAACAGTAAA
-AATTGGGAAAATTTTTTTACCGTTAAAAAATTTTTTTTTTTCGAAAAAAA
-AATTTTCAGTTTAAAATTTGGAGCGTTTTCAATTTTATTGATAATTGGTG
-AAACAAAATAAAAAGTAAATAAAAAATTTTTTTTTTGAAAAATTTGAAAA
-ATTAGATTAAAAATGTTTATTCTGGGATGAAAAAAACCTCCTAAAACCAT
-TTTCTGGAAAATTTAAACTTCCTATTTTGTTCAGACAATTCTTTTTTTTC
-AAGAAAAAATCAAATTTTCCACTAGAAAATCGAAAAAAATTGACCTCGTT
-TAAAAATTGGACAAAATTTGAATTTTTACTTTGAAATCCTCGAAAATCGG
-ATTTTTTTTTCAAAGCTTGAACAATTTTCTGCAAATTCTATATATCTCTA
-AACTCACAAAATGATTAATTTCCCGAACAGAATTAGCTTTAGCCTGTACA
-AACTTATAGAGTAAATCATCAGAAGTCGAATCAAAAAACACTGCAGTTCC
-CTTATCGCAAACTTTTTCCAAAGTCTGTAGAATCCGGCTAGTCGGCACAC
-ATTCCGTGAATTTTGCAGTCTTTTCCCATTCGGATTCAGTTGGTAGGGCG
-CCTTCCCATAGCTCATCATAGGCACTACGACGGTCAGCAAAAAGAATATT
-TGTTTCTTTTGAAGATTCGGATATTCCTGATTGCATTATGTAATAACAAT
-CTGGTGTGGTGATTCCGTTTAGGTATCTGCAAAAAAAAAAAATTTTTCAA
-ATTTTTTTCTGTTAAAAATTTAATTTATTTTTTTTATCAAACAATTTTGA
-ATTTTTCCCAAAAAAAATCCGAAAATTGTGAACAAATCTATTATTTTCGT
-TGAACAAAAAAAAAACAAATTCAATTTTTAAATAATTTAATTTTCGTTCA
-GAAAAAGAAATTTGTCGATTTTCGGCGGCAATGATTTTTTTTAACGAAAT
-TTTCCTGAAAAATTCAATATTTCAATAATTCCTGATTTTCTAGTTTTTTT
-TTTAAAGAAGAACATGTTAAATTTCTACTAATTTTATAACAAAAAATTTC
-GGGAAAATCTAGAATTAAAAAAAAATGTTTTCAGAAAAATTCTACTAATA
-TATTAATTTTAGCTTAAATTTCGATAATTTTAGGTTATTTTTCAATTTTT
-TTAGGGCGAAATTTTGATTTTCAAAACAAAAATATTTTCTGACAAAAAAA
-TTAATTTTCATTCTTTTTTAGATTTTTTGAAAAATTTTCAATTTTTTTCT
-GAAGAATTTGGTACTTGTGTATTACATGCCCTCATTTTTAAATTAAATTA
-AATGTTCATTAATTTCTCCATTTAAATTAAACGTGATATACATTTTCTCT
-TTTTAGGCTTAGAAATTGCTATTTTGCTACTTAAAAAATTACTATTAAAA
-TGAGGGCATGTAATACACAAGTACCAAGAATTTCAATCAATTCTTGTTTT
-TGAAATTTTTTTTGGGAAAAATTCCAATTTTCGATTGTTTCTTCGATTTT
-TTCAGAAAAAAAATTTTCTAAAATTTATTTATTTGTTTGAAAATTGGATC
-TAAAAAAATTTCTCTAGTTTTTATTTTTTTTCTGGAAAAAGCTTTTTTTA
-ACTTAAAAAGTTAATCTGTGGCCGAGTTTTCTCTCATCATTTTCACGGCC
-ACGGCCATCAAAACCGAACCTGAAATGGCTTTTCTGTCGGAACGCGTGTG
-GAACATCCGGTGCAATATATGATTTCCGTGCTCCTTTCATCACAACGACC
-ACTTGCTTTTCTGAAACTTTGAGAGGTCATGGCCTAACTTTTAAATGGTT
-TTCTAGGCCACCATGGTGATTTTATTACGGTACCGGGTCTCGACACGATG
-AATTTTGTAGAATAAATTTTTCTGAAAAATTTCGTTTTTTTTTTTAGAAA
-AATCAAATTTTCAAGAAAAATGGGAAAACATTTTTCAGGAAAAATTTAAT
-TTTATAGAGAAAAATAGAATTTTTCCTTTAAAAAAATCTGAAAATTCGGA
-TTTTTGAGAATTCTCTTTATTTGGATTTTAAAATCCAAATTTTCAAAAAA
-AAATTTAAAAATCGGAAAATTCCAAATTTTTGAGAGTAAACTCGCCTTAA
-TTTTTTTTTTCAATTAAAAAAATTAATTTTTTAAAAGAAAATTGGAATTT
-TTACCCAAAAATTGGCAATTATTCGAGTTTTCAACGGAAAAATCTGAAAA
-ATCCGAATTTTTGAAAAAAAAATCTTTAAAAATCCCAATATTCAATTAAA
-AACCGCGAAATTTCGGATTTTTGAGAAAATTTTAATTTAAAAAAGTCCTA
-TTTGTACTGCAAATCCTCATTTCCAAATGATGGCCTAACTTTTTCAGAAT
-TCTAGGCCACCAGGCCATTTCTCTGCCTCTTACCCCCAGTTTTGACCTCT
-TTTTTGAGTAAATTCATCAAATTCGTCCTTCTCATCGCATATTCCTCATT
-TGGAATTCGCGATGGCCACATTGGTAGGCTCCGCCCACTTCTGAGCATTT
-TTTTTTTGGATCTGATCTGTGTGGGAGGGAAATTCGAATTTTTTTAGAAA
-TGAATAAAACTGAAAAAAATAGATTTTTTGGGAAACAGGGAACCTGAATT
-TTCGAGAGAAAAAAGGAGGTAAAACAAAAAATTCGATTTTATATTGAGCA
-AAAATTAATAGAAAAAATAAACTTAACAATTATGAACAGAAAAACCTACT
-AAAAAAGTCTAAAAAATGAATGAAAAATTGCAAAAAAAATCTACAATCGA
-TACGAGACTCCTCCTCCAACAATGCAGTTCTCGCCGGTGATGTACCTGAA
-AAAAAGTGATTTTTTTTTGAATTTTTAGAAAACAAAATTATGAAAAAAAC
-CAAAAAATTTCCGAATAATCGAAATTTTTCGGAAGTTTTAGGTTAAAAAA
-ATTTTTTTTTGATGAAAAGTTTTTTTTCAACAATTCTGAAAACTAAAAGT
-ACCAAAAAATTTTAGTTTTTTCGATTGTTTCAATATGATAATTTTTTTTA
-AATGTTTAAAATTGTATTTTTTCAAAAAATATTATCAATTTTCCAATTTT
-ATGGTAATTTTGGATGTGAGATTTTTTTCTTCAAATTTTCGAAACGTTTC
-TCGATAAAAAAATTTTTCAACTGAAAAACTACAAAAAATCCTCTTATTTT
-GAAGAAAAATCGATATTTTCTCAAATTGTTCAGATTTTTTCTGTTTTTAC
-CAAAAGTGACCAAATTTTGAGACTTTTCGATCCAATGTTTAAAATTTTTT
-TCCCGTTTTTTCGATATTTGCGGTTTAAATTTTTTTTAAATTTTTTGATT
-CAATTTTAATAAGTTTGAGTGTTTTTCGATTTTTTGTCCAAATTTTTTCA
-AATTTTTTTCCAGAAAATTGGTAGAAGCCAAAAAGTGCGATTTTTTTCCT
-TAAAAAAGATAATTATTCAGTTTTTCGACTGTTTTCTTCTTGCTTCCAGA
-TTTTTTCTCGAATTTTTTTTATATTTGAATTGTATTTTTAAATATTATAC
-TCCTAATCGATAAAAATTAGTTTTTTTTTCAATTTAAATTGGAAAAGAAC
-GTTCTTTTTCGTAAATTTTAGTGATTTTTGATTCCAAATTTTTGGATTTT
-TTCAAAAAATTTCCCAGAAAATTTTACCTGGCTTTGGTAGAAGCCAGAAA
-TTCGATTAAATAAGCTTTTTTGGGTTTTTCGACAATTTGTCAAGTTAGGA
-ATTAAACTTTTAAAATTTTTTTCAAAAATTTTAAAAAACTAAAAGTATTT
-CTGAGAATTTTTCTGAAATTAATTATTCAGTTTTTCGACTGATTTCTGCT
-TGCTTCCAGATTTTTTCTCGAAGTTTTTATATTTGATTTTTTTAAAAAAT
-ACTCTTAATCGAAAAAAATTCATTTTTTGAATTTTTTCGGGACTTTTTTT
-TTCGAAATTTTCGTAAGTGTTAGTGTTTTTCGATTTTTGATTCTAAATTA
-TTGGATTTCTTCAAAAAATTTTTTCAGAAAATTCTACCTGGCTCTGGTAG
-AAGCCAGAAATTCGATTGAAGAAGCTTTTTTTTCGGTTTTTTGGACAATT
-TTCCAAGTTTTAGTTAGGAGTTAAACTTTTTCAAATTTTTTTTGAATTTT
-TTTCAAAAACTTTAAAAACTAAAAGTATTTCTGAGAATTTTTGAGAAAAG
-CATTTTTTTTCTCGAATATTTGAACTTTTTAAATTTTTAAAGCTTTTTAT
-TTTTAAATATCAATTCGAATATTTTACTCTTAATCAATGAAAAATCGATT
-TTTTTGATAATTTTTTTCAAAAAAAAATTCGAATTTGAAATTTTTTTCAT
-TCAGAAAAGGGAATTTGACTATTTGAAAACAATTTTTTGTTGAATTTTTC
-GTAAATTTGAGTGATTTTCGATTTTTGATTCCAAATTTTTGGATTTTTTT
-TTGACAATTTTCCAAGTTTTGGTTAGGAGTTAGATTTCTTGGAATTTTTT
-TTTGAATTTTTTTCAAAAATTTTAAAAACTAAAAGAATTTCTGAGATTTT
-TTCCTTAAAAAAGAGGAATTTTTTAGTTTTTCGACAGATTTCTGCTTGCT
-TCCAGATTTTTTCTCCAAGTTTTTATATTTAAATCTTTAAAATTTATATT
-TTTAAATAATATTTCAGATATTATACTCCTAATCGATAAAAATTCGTTTT
-TTTTTCAAATTTTAATTGAAAAAAATCGATTTTTTCGATAATTTTTTAAT
-TTTTTTAAAATTCGAATTTGAAACTTTTTCATTCAGAAAAGAGAATTTGA
-TTATTTGAAAACAATTTTTAATTTAATTTTTTAATCCTTTAAATTTTCGT
-AAATTTGAGTGTTTTTTGATTTTTGATTCCAAATTTTTGGATTTTTTTCC
-AAATTCTCCAAATTCTTATTTTTGCAGAAAATTCTACCTGGCTTTGGTAG
-AAGCCAAAAATTCGATTTAAGAAGCTTTTTTTTGGTTTTTTTTGACAATT
-TTCCAAGTTTTAGTTAGGAGTTAAACTTTTTTCAATTTTTTTTTTTGACT
-TTAAAAAAAAATTTAAAAACTAAAAGTATTTCTTAGTTTTTTCCTTAAAA
-AAGAGGAATTTTTTAGTTTTTCGACTGACTTCGTTTTTGAATTTTTAAAA
-ATTCAAAAATTGTATTTTTTAAAATTCTAATCGATAAAAATTCGTATTTC
-GATTTTTGATTTCAAATTTTTGGATTTTTTTCAAACATTTTTCCAGAAAT
-TTTTACCTGGCTCTGCTAGAAGCCGAAAAGTGAGATTTTTTTCCAAAAAA
-AGATAATTATTTAGTTTTTTTTCTCGAACGTTTTATTATTTGAACTTTAA
-AATTGTATTTTTAAATAATATTAAAAATTTAAATAATAATATAGAATTTT
-TTTGAAAATTCCTGAATTTTCTGATTAAAAAAACATTTTCTGATGCATTT
-TAGAAACTGAAATTTTTTGAAATCTTTTTGGAATTTTGGAAAATTTCGAA
-TTTGTTGATTATACTCTTAATCGATAAAAATTCGTTTTTTTCCAATTTTA
-TTTGAAAAAAATGATTTTTTCGATAATTTTTTTGATTTATTTTCGGGAAT
-TGACTATTTGAAAACAAAAACTTTAAAAAAAAATCAAACTTTTTTTTTGA
-AATTTTCGTATTTAAATTTGAGTGTTTTTCGATTTTTGATTCTAAATTTT
-TGGATTTTTTCCAAATTCTCCAAATTCTTATTTTCAGAAAATTCTACCTA
-GCTCTGGTAGAAGCCAAACATTCGATTTAAGAATCTTTTTTTTTTTTTGG
-ATTTTTTTTTGACAATTTTCCAAGTTTTGGTTAGGAGTTAGATTTCTTGG
-AATTTTTTTTTGAATTTTTTTCAAAAATTTTAAAAACTAAAAGAATTTCT
-GAGATTTTTTCCTTAAAAAAGAGGAATTTTTTAGTTTTTCGACAGATTTC
-TGCTTGCTTCCAGATTTTTTCTCCAAGTTTTTATATTTAAATCTTTAAAA
-TTTATATTTTTAAATAATATTTCAGATATTATACTCCTAATCGATAAAAA
-TTCGTTTTTTTTTTCAAATTTTAATTGAAAAAAATCGATTTTTTCGATAA
-TTTTTGAATTTTTTTTTTACAAATTCGAATTTGAAATTTTTTTCATTCAG
-AAAAGAGAATTTGATTATTTGAAAACAATTTTTAATTTAATTTTTTAATC
-CTTTAAATTTTCGTAAATTTGAGTGTTTTTTGATTTTTGATTCCAAATTT
-TTGGATTTTTTTCCAAATTCTCCAAATTCTTATTTTGCAGAAAATTCTAC
-CTGGCTTTGGTAGAAGCCAAAAATTCGACATAAGAAGCAACATCAGACGG
-TCTTCCAAGTCTTCCCAACGGAATCATCGATTCCAAGTGTTGTTTAATCT
-GACGAGCTTCTTCTCCAGAAGCATGATCCCATACAGCACCAGTTCCGTCT
-CCTTCAATCATTCCAGACACCACACTATTCACGCGGACTCCTTGTTTCGC
-GGCACTCTGAGCTACGGATTTTGTAAGTGATAGGACACTGCTAGATGCAA
-CTGAGTAGAGACCCATATCGATTGATGGAGTGAAGCCGAAACATGACGTT
-AGGTAGATGATACTGCCGTTTCTGGAAAAAATCGATTTTTTTTGGACGGG
-AAATTTTGCCTGCCTACGTGCCTACCTGCCGGCCTATTTTAGCCTATTTT
-TCATTTTTTTTTTGTTGTTCTATTTTTTTGCCGTTTTTTGGGAATTTCAT
-GATTTCTAGGGTAGGCACGACTTCATGCCTACGTGCCTATCTACCGGCCT
-AACATTTGATATTTTTTTAGAATTCCATGATTTCTAGGTAGGCAGGTAGG
-CACGAATACATGCCTGCCTACCGCCTGTTTTTTTGAAATTTTTTTGTGTG
-AAAAATTAAAATTCATGGGAATGCTTTTTTTTTCAAAATTCAATGATTTT
-TAATGCAGACCGCGCCTATCTGCCTACCGCCTATTTTTGGCATTTTTTGT
-GTGCAAAACAAAATCAAATTAGCTTTTTTCTTTTCGTTTTTCTACGATTT
-TTTCCAAATTTCAAGATTTTTCGGATAGGCACGACTTCCCACCTACTGTG
-CCTACCTACCTACCGCCTATTTTCGGCATTTTTTGTGAGCAAAAAGAGAT
-CAAATTAGCTTTTTCTCCTGTTTTCTACGATTTTTTTGGGTAGGCACGAC
-TCCATGCCTACCGTACCTACCTACCTACCTCCTATTTTCGGCATTTTTTC
-TCGTGCAAAAAATCATATTTATGAAAACACTATTATTTTTGTTTTCTGAA
-TTTTTTTTCCAAATTTTGTGATTTCTAGGGTAGGCACCGACTTCATGCCT
-ACGTGCCTACCTACCTACCGCCTATTCTCGGCATTTTTGTGAGCAAAAAA
-TTAACATTCTTGAAAATCCTTTTTTTGTTTTACTACAATTTTTTCAAGTT
-GCATGATCTCTAGGGTAGGCACGATTTCATGCCTACTTGCCTATCTACCT
-ATTTTTCCCTTTTTTCGTGGTTTAGGTAGGCAGGCATGAGTCAGGCACGA
-AAATCTAGAAACATAATTTTGATTCTATCGGTAAAATAGGCTTTCAAGAC
-AGTTTGAATTTTTCGAATTTCTACCAGCAAAAAATAATATCTGAAATTTT
-CGCGGCGAGACCCAAAAACTGACTGAGATTTGGCGAGCGTCGACATAGCG
-GCTTGCGAAAGACGGAACGGTGTTGTCAGATTGTTGGCGAAAAGCTGAAA
-TTGGTTTTTCGAGGTCAATTTTCCACGTGGAATTCAAATTTCAGCACTCT
-CGAACCTTATCAAAATCCTCGCCGGATGTCTCAATAATCTCGCCGAGCAC
-CTCATTCTGTGGTGGAACTATAATTAAAGTGTCCAGACCGCCGAGCTTCT
-CAGCCACTTTCGTGATCAGCTCCTTCCTGTGCTCGGCATTTGCCACGTCT
-AATGAGAAAGCTGTGACGTCACCTCCAACCTGAATTTATTCCCGAATTTC
-TCTTTGTCAAGTTCTGAAAATCTGCCTAAACCTTTATATTGTCCTCTGCA
-ACCTTTCCCACACTATTCGGACAGTCTGCGGCGGCGGCGACCTTGTAGCC
-GGTGAACGCGAGTCTTCTCACGACGGCTTTACCCAGTGTGGACGTTGCCC
-CGATTACAAGTGCACATGACATTACGCTGAAAGCCCGATGAGGAGGCATA
-TTTATAGATACACCTAGACATCAGGTACATTTATTTGGAAATCCGTAGAA
-AATAAAGAACATGTGAAAATAAAACAGATCATTTTATTATTTAGAGGGGA
-GAGGGAGGGGGAGCAAAGTCGCTGACTGAGAACTTTCGAAAACCGGTTAG
-TTACTCCAGTTGTACGGCTTATTCATGCCATATTTTCCAAGATTTCCACC
-ATTGTGTTGGTATTGAGAATGTTGATTCTGCTGAGCTGCCGGCTTCGATC
-CAGACATCTTGTCGTAACTCTTGCGCTCGTCATCCTGTCCGTAGAGTTGA
-CGACCTCCAGCGCTGCTTCCAACATTGGGCATCATGTTCATGAATGGAGT
-AAACTGGTGTGGAGCAGGTGAGTACTGCTGCATGAACAACGACGACAAGT
-TTGGCTGCTGCATGTAGTTCGTCGCCTGGAACCCTGGTGGTGGTCCAACA
-TTCGACGCCTGCTGTGGCTGCTGATCCCGAGAGCTTTGAGATCCGAACTT
-ATTGAAGTCCATAAGTCCATGAGTCTCTCGTTGTTGACCAGATTGCACTT
-GTTGCGCAGAAGCAGCCTGTGACAGAGGAGCAGTTGGAAGCAAGCTTGTA
-AGATCAACTCCCATTCCGTATTGCATAAGAGCAGCAGTATATTGCTCATC
-TCGAACTCCTGGCATTGGATTGTACATGTTCATGTAGTTGTTCATGTATG
-GTGCATATGGGAGTTGTTGAGTGAACATCATATGTGGATGCTGTTGTGGA
-TGTCCAGTCGGTTGTGATTGAGCTGGTGGAGTTTGTTGCTGCTGCTGCAC
-TGGCTGTTGTGGGGCTTGTTGCTGCTGCTGCTGTGGCTGGTGCTGCTGAG
-CAGATTGCTGTGTTGGAAGTGGTCCAGAATTGTTGAACTTGTTCGGCGCC
-ATCCTGTCCGTTGGTTGATATGAAGCGGACGAAGTGTCATAGGACAATCC
-TCTGTTAGATTGACCATATGACAATGGAGGTGAAGTCGATTTTAAGTTGT
-AATCGCCGTTAGGAATTGACGTCCTTTCTGGCTGAAAAATAATCGAGAAT
-TAGAATAAATCGTCTTTGCAACAAATTTAACTCACCTCAACTTGTTTCGG
-CATAATACGAGAAGAGTTAAATATATTTTCACTGGCATTTGAGATCGAGG
-CAGCGGAGGATTCAGTAGAAGGAAGCTGTGGGCTTGGAGCAGCCTCAACA
-AATCCAAATGAGTAGTCATGAATGTTCGTTGGTGCAGTTGTGCCAACAAA
-TTCCACTCCAGGATCAGGAATAATCTGGACTGGTGCTGCACTTGGAATTG
-GAGATAATCCTAGTCCTGGTGCTTCACTCAATCCTATTCCAAGATCCGTC
-TTCAGTTGAGTGGTCCATGCTTGATTTGGTTCTGGGGTGCTTTGTACATT
-TTCATCGTGATGAGTCGACACATTAGGCGTCTGCTCCTCAGCCAAAACTG
-ATGATTCACTGAAAATTAAATTTTTAATAATCTAAATACAGGGACAGAAC
-AACTTACTTTTGGAAGAAACCATCTTCTTTCTCCGGCTGATGCGAAGTTT
-CTGGCTCGAAAAATACTGGCGCTGCTGCTGGCTCTTCTTTAACTGGTGCA
-ACTGACGGAAGTGGAGGTTGTGGGGAGAGACTCCTCCTTGGCGGAGCTGC
-TGGTTGAGGATTCTGTGCCTGGTGCTTTCGGAGTGCTTCTTTGCGATGGG
-CAGCTGCTGCTACTGCAGCAAATGAGATCGGTGCCGGCGCAGAAGATGTG
-GGAACAGTGGCGGTGACGGATTCCTCTACTGGTGGTTGAACTTCGGTGAC
-TGTGGTATCCACTTTAGTCTGATTCTGAAAAAAAAACACGTTTCGTCATT
-TTCCTTCTTCAAAAAATTCTTACCTCATCAAGATCAGCAGTGAACGCATC
-TGGCTCAAGTGCTGATGATGGAGCAACAGCTCGAGAATATCCACCTCTGG
-CGCCACCTCTTCCACCTCGTCCAACATACGGTTTTTCAAATCCTCCTCGA
-GTCGAGCGTGGTGCTGCTCCTTCCTTATTATCACGGTTATCCCGATTATT
-ATCTCGGCTTTCTCTTGGAGCTCCATTGGATCGCCCGCGGCCTCCTCGAT
-CGACGAAACCGGTGCCTCCACCTGAAAAAAACATATCAATATTTGATCTA
-TTTCAATCAAGCACGAACCTCTGCCTCTTGCTACAAATCCTCTGTTGTTA
-TAACTGCCCTCTTCCGGCTTCTTCTTTTCCTTTTTGGCTCCTTTCTGTTC
-AGTCCACGAGTCAAGTTTATCTCCAGCATCCAGAATGTGATCGATTGCGC
-CGTAAAGATTGTTGTCAGTATCCAATAGCGCTATCTCAGCTTGTGCTTGT
-GTACATCCGGTGGTTTCGATAATCTGAAAATGAAAAAGACATGAGCAGTG
-AAAAAACCCCTCTTGGGAATGCGCGAACACTTTAATTAGCCCAAATGAGT
-AGGACATCTGGGTACTCTTACTCTCGCTGCACCATCTCAAGCGCGGACAC
-CTGCTTTTGTCCTTTTATTTGCCATCTGGCCCCGTCTTATCGATTCGAAA
-TTCCTATTGACACTGAAAGCGGACACTAGAGAAGTTCAAAACAACAAAGT
-CACGTGCGTCATCATGTCGGTGTGTGGCGAGCGTTCGCGTGATGCAAAGA
-TCACTATTTTCAGGAAAGCGTCATTTCCAGCTTGGAGACTTACCGTCTTG
-ATCATAAACTGTATGTCCTCCTCATTTCCGGAATTTCCTTCCAGTGTGAG
-TCGTGCAAGTCGCGCTTGATCGCTGGTAGCTTTTTTGTCGCCTTTAATAC
-CCATTCTGAAAACAAATTATAAATAAAAAGGGTCAGTCATGTGAACGCAA
-GAATGGAATGAGAATCACGAGAATACAACTATCAAAGGAAGGTTGAATGA
-AAGGAAGGTCAAATAGATGACAAAAGTAGGAAAAGAACGAAATATGGAAC
-CTTCCAGATCAAAAAAACATTATCAAAAGAAAAGCCTCGCACAGAAGACT
-CTAACGAACATGTTAGGATGAAGAAATATTTCAGCAATACATCACGTTGA
-ACTTTGGAGGATATTCTAGAGAAGAAAACCCCTACATTTTACAATAATTT
-TGAAATGGAATTCGAATGAACTGCTATACAATGGAGAATCCTATTTAGCG
-ATGATAAAGTGTAGGCTTGTTACTAGATTGAATAAAAATTTCGAAATGTA
-ACAATACATTGACTGAAAATTTGGGTATTTCAGAGTGTGATATCACAAAA
-ATCAATATTTCCACTAAACTCAAAAGTTCTTACGCTGAAAAATCATTAAA
-AAATTGAAAAATCACCGCAAGCTAGACTAGAATCGCGTTCAAATCTCGCA
-AATTCCCGCAGTTGAAAATGCGGGCGACCGCGACGCGAGCCGCAACGCAC
-CCCTCCAAACATGCGGCATGGGTCTCGCCACGACCGAAAGTACGGTCACT
-CTTGGCAGTATAAAAGGCGACCATTTTCCGCTATTTTCCGGTAAATTTTC
-AAATGAAACTGTGTTGCGGAGGGGGTTTTCCGCTAATTTTGCGGAAATTT
-AGCTATTTAATGTGAAAATGTGAATAAAACAAAAGAAAGTGGGGAGGAAT
-AGCAAGGAAACACACTGTTGAACCCTGGGAATTATCGATTTTGTATGAAC
-TCTTCTTTTATGGCGTCGAAATTATCGACACGAAAACTCAAAACCTTGTC
-ACATTTCTGAGAGAGAAATATCATTTTCAGCACACATGAGTCTTCCCAGA
-TTTCGACTCGTTCAGGGAAAGGCGATCGGCGAGCGATCAACGCCAGGAGT
-CAGCACACCAGAGCCGGTAATTGTTTTTTTTTATTTCAAAATTTCTACAA
-CAACAAAAAGAACTAACAATAATTTATTCCTTTGATTCCAGGCCCCTCCG
-CAAATAAAGCAGGAAGTCGACTACCAAGATGCTCATCAAATGGCTCCGGA
-ACCCGTGGAAGCACCCCGTAAATATTTAAAAATTTAAAAAAGTTAGAAAA
-AAAATTTGAATCCCAATTTTCAGAGGCTCAAAACCATCAAATGCAGCCGC
-CTCGTCAACCTATACAACAGCAGATGCAGCATTTTCAGTCACCATCGCCA
-ATGGCTCCACAAGGGCCGCCCGGGACTCCACAAAACTCTGCAGCGGCGGC
-CGCCGCTGCTTCAGATGACAAAAACGTGACAAAATGCGTCCGCTTTCTGA
-AAACTTTAATTAATCTGTCGAATAACGATGATCCAGAAATGCCGGACAAG
-GCCGCCCGTGTCAAAGAGCTAATTCGAGTGAGGAATTGAGCGAAAAACGC
-GATAAAAACCGGACAAATTCGGATATTTCAGGGCGTAATTTATCTGGAAA
-CGACGGCTGAAGAGTTTACACGAAATCTGCAACAAGTGCTCAAATCTCAG
-GCTCAACCGCATCTTTTACCATTCCTTCAGAATACTCTTCCGGCATTGAG
-GAATGCTGTTCGAAATGGTTCGGTTTTATGTGCAAAAAAATTAAAATCGA
-CAAAAAAAAAATCATCGAAAAACAGGAAAATTTGAGTTGAAAAGCAGCGA
-AAAACTTGAATTTAACATAAAAAATTGCAAAAAATCCGTTGAATTACATT
-TTTCAAGAAATTGTGTAGAAATTCCATGAAAAAAATTCAAAATTTCCAAA
-TTTTTTGGCTATTTCTAGTCAATTTCTTTAAAATTCCATTTTTGATAGCG
-AAAATTATCAAGTTTCTAACAATTTCAAGCTGTTTTTGGTGATTTTTTCA
-ATTTTTCGGCTTTGAAATTCCATTTTCCGGAGTATATTGTCATAATATAT
-CCGAGTTCCACAAAATTGAGCAAAAAAAATTAAAAATTTCCCTTTATTTA
-AAAATATTTTCAGCTGTCAGTAATATATGGATTTTCCGCAATTTTTCTCA
-CAATTTTGAGCAAATTCCTGATTTTCAGCCAATTTATAAGGATTTTCACC
-CATTTTCATAATTTAGGGCTATTTTCAGCTGAAAAATTGTAATTTAAAGT
-TTTTAAAATTTTTATAGATTTTCTCAAATTTCAGCTCAAAAATTCGATTT
-TCAAGCGCATTTCCAGGCAATTTATTAAGATTTTCACCAATTTTTTTAGC
-TTAAAATTTAAAATTTCCACATTTTTTGTCTATTTCCAGTAAATTTCTTT
-AAAATTCTATTTTTGAAAGCAAAAATTATCAAGTTTATCGCACTTTTTCA
-ATTTTTCCGGAGTATATTTTGGTAATTTATCCGAGTTCCACGAAATTGAG
-CAAAACAATTATTTAAAAACTTCCCTTTATTTAGAGCTATTTCCGCAAAT
-TTTCTCGCAATTTTCACGCAATTTTCATAATTCAGGGCTATTTTCAGCTG
-AAAAATTGCAATTTAAAGTTTTTAAAATGTTTATAGATTTTCTCAACATT
-CAGCTCAAAAATTCGATTTTGAGGCGCATTTCCAGGCAATTTATGAGGAT
-TTTTACCTATTTTCTAGATTAAAAATCTTTTTTTTTCCTCAATTTTGGAC
-TATTTTCCCTAATTTTCAAATTTCCAGGCACTGCATCAGTTGAAGGCGTA
-AATCCACCGCCTGGCTACGTTTTCAACAATGGAAGAACCCCAGGACCCCC
-TCAGCCACCTCCACCTCAACAACAATCCCAGCAGCAGCCACCACTAGAAA
-TGCGTCAAATTCCGAATCCGAATCAAATACCCCCACAAATGGTTCAAGGG
-GGTCCCCATATGGTATCTGTAGGCGCCCGGCCAATGATCAGGCCTATGGG
-CCCCGGCGGCCCAAGCCCAATGGGCCTACAAGGCCCCGTACGAGGGCCGA
-TGGGACATCAGATGGTCCAGATGCATCCTCCTCCCCCACCACAGCAGATT
-CAACAGCAGCACCCGGCTCCCCCTGTAGAAATGGAGGTGGAAGAGAATTT
-ACAGCCTACCGCGGCGGCCACGGCCACGAGGCAATATCCTGAAGGATCGC
-TGAAATCGTCGATTCTGAAGCCGGATGAGGTGCTGAATAGGATCACGAAA
-CGAATGATGTCATCGTGTTCGGTGGAAGAGGAGGCGCTTGTCGCGATTTC
-AGATGCTGTTGAGTCGCATTTAAGGGAACTTATTACACTGATGGCCGGAG
-TTGCAGAACATCGGGTGGAGAGTTTGAGGTATTGAGGAGAATTGATTTTG
-CTTCAAAATACGGCAGCGAAAAAAAAATTAAGCAAAAATAAGGAAATTAT
-TGAAGAAAAATCGTCTTAAAAACAATTTTACATTAAAAAAAAAGATTTTT
-AAATTTCAAAGGTTCCGAACTATTTATTAAAAAAACATCTAGATTTTGTT
-TTAAAATCCAAACAAAAAACATTGCTGAAACGCGGTAATTTTTTTTCAAA
-AAAATATAAAAATCTGAGAAATATTTTCAAAAATATCTCCAATTTTCCCC
-TGATTCCGAATATCTATTCGAAAAAATTCAAAAAAAAAATTTCCCTTTAT
-ATTTCAGCTTGAAATCGCTTTGTGCATGCACACCATGAGATTTTTCAAAT
-GCGCGCCCAGATAAATTCTCATTGGGGCGCACTTGCTTCGTGTCGATTTA
-CGGGAGCTCTTCATTTTTAAATTTCTTTTAAGCTTTTTTTTTCAGTTTTT
-CAACGAGTTTCCTTGATCTTCGTCGATTTTTTGTCATTTTTTTTCCTGAA
-ATTTTGTTTTGTGTCAATTTGAAAATTTTTTAGGTCAAAACTCCTGTGTT
-CGTCGAGATCTGACGTAAAAATATAAAATTCCGGGAGTTTTGAGATATAA
-AAAAAATATTTTAAAAATTTCAGAAAAAAAACTGACAAAAAAGCGACAAA
-ATAAAAGAAACGCGCAAAAAAAAAAAAAAAAAACTTAAAAAAGCACGAAT
-AAATTTTTTTAAAAAATGGAGAGCTGCCGTAAATCGACACGAAGCAAGCA
-TAAAAAAATGGCTTTTTTCCTAACAATTTTTTGTGAAAAATCCGAATTTT
-CCATCCTAAACACTACAAAAGATTCCAGAATTCCGGAGAACTACGTGGCA
-ATTGATGACGTCAAACGGCAACTTCGATTCCTTGAAGATTTGGATCGTCA
-AGAGGAAGAATTAAGGGAAAGTCGAGAAAAAGAGTCGCTAATTCGAATGA
-GCAAGAATAAGAATAGTGGAAAAGAGACGATTGAAAAAGCGAAAGAAATG
-CAACGACAAGATGCTGAAGCGAAAAGGAATCGAGATGCGAATGCGGCTGC
-AATTGCAGCACTTTCCAGTAATAAAACTGTCAAGAATAAGTTCGTTTTTA
-GCGTGAAATTTGCAGAAAAATTATTTTTAAAAAATAGATTTAAAAAAAAC
-AATTTCCTGACCAAGGGTGTCATTTTTCGATTTTTCGGTTTTCAAAAATT
-CGAAAAATGAAAGTTTCGTTTTTCGATTAAAAAACTGAAAAACCGACACC
-TTTGTTTCTGAGATTTGGATTTAGAAATAAGCAAAAAAAAATTATTCAGA
-AAAAATTGTTTTACAATGCTGCAAAATCGATGAAAAAATAAAATAAATCA
-ATAACTAATTTCTAAAAAATGGAAAAAAATTTCGTTTTTTTCGAATTTGT
-ATTTCACAAAAAAAAATTTTTAGAATAAAAATTTTCAATTAAAAAATTAC
-TATTTAAAATCACTGAAAAAAAATGAAAAAAATAGAAAATTCAGAAAAAT
-AGCGAAAAAAAAGTTTTTTTCCAGAAATTTCGTTAAAACGATCAAGATTT
-TAACCCTAAAATTTAGATAAAATCAATTTCTTGTGGTTCTTAATTTAAAA
-AAAAAAACAGTACTTTCCAGTAATAAAACTTTCAAGAATAAATTCGTTTT
-TAGTGCGAAATTCGCAAAAAAAATTACGAAAAAGTGAAAATAGAAGCTGA
-AAGGAAAAATGTTTAAAAAATAAGAATATTTTCGACATTAATTGGTTTTT
-ATATATATTTTTTTGTAGAAGTTTAAAAAAATTACTAAAATCACTGAAAA
-AATTGAAAAAAATTTTAAAATCTGGAAAAAAAGCAACAAAAAATTAATTT
-TTCCAGAAATTTCGTTGAACTATTCGGTATTTTAAGCCTAAAATCAAGAT
-ACAATCAATTTGAACAAAATTTGCTTTAAAAATACTAAAAATTCGAAAGA
-AATAGAAAAAAAAAGAAATTTTCGAAATTTGGATTTATTGTTAGAGAAAA
-GCTGAACACTTACAAAAAATTAATTTTTTACGTTTTGAGAAAAATTTTTG
-AAAAAAAAAATCGATTTTTAAATAATTTTTAGAATTTTTTAGAACTATAA
-TTTTTGAATTTCAGTGACTTATAATCACAGAAAAAAATGAACGAAAAACA
-AATGAACATCTTTTCGGCAAAAAAACGTATTTTAAAAAAAAATTTAAATT
-TCTAGTGACTTTGAAAAAAAAACCACATTTTCCAATAATTTCCAGGAATA
-AACTAAATTTCTTTGGAGAAATTTGAAATTTATTTCACATTTCGAAAAAA
-TTTATATAGAAATAAAAATTTATATGAAAATAAAAAATTTGCAGCTCCTT
-CCAGTAATGAAACTGTCATTTGTTGAAAATTAGTTTTTTTTTAATTTAGA
-AATTCTCTTTTCGAAAAAAAAGGTTTTTTTAAAACTTGATTAAAAATTAA
-TTCATTTTTTTCCAAAATTAGGGAAAAAATAATTTCTAAAAAATTAGACA
-AATACACTTTTTTGTTGAAAAAAACAACATTTTCCAATAATTTTCTTTTT
-TTTTAAATTGCTTCCACTAAATTCACTTTTTGAAGAAATTTTTTGAAATT
-TTTACTGAAAATTGTTGGAAAATTATTAAATGTGCATTTTTTTGCAATTT
-CCAGTTGATAAACTAATTTCGGTTCAATTTAAAATAAATTTCGAAAACCA
-ATTTCAAAAAATTCATTTTTTACAATTTGTTTTTGTTGATAAAACGAGCT
-AGTTTCTACCAAAATACCGCTTTTTTACATTGAAAATTTAAATTTCAGAT
-GGGAAAACACGGGCGCCGCAACGACAGCACCTCGTCCACGAACAGTACGT
-GTAACAACTCGTGATCTACATCTTTTAGTCAATCAGGATAGCCGATTCAC
-AGGGTAGCGATTTTTTTTGTTTAAAAAATTTTTTTAAAAAACACCGTATT
-AAACATTGATTTTTATTGGAAAAAACTGATTTAAAAATTTTTCAAAAAAC
-TTTCAAACGAATGGTAGTTTTTAATATTTTAATTTTAAAAAATTCCAATA
-AAAATCAATTTTTATACGATTTAAAAAAATTTTGAAAAGTTATCCAATTT
-TCTCCTAAAAAAACTCATTTTTTTTCCAGAACATTCATCCGTGAAAAGAT
-GTCATACGGTGGTCCGGCAGTCGATACAACTATCTGAACTAAAGAAATCT
-CATGGAAAAAGGAGCGAAAATTCTGCTTTTCTCGTTTTCTTTTTTTAAAT
-TTAATTTTATTTTTCCACAAATTAAAACAATCACTTTTTTCCAGTCAAAT
-AATAATTATTTCTCATTTTTAAACGAAATGCTAGACATAAAAAAAAGCTT
-CTTTTTCAGCTTTTCAGCCAAAAATTTCAGATTTTTCAGAAAAAATTCAA
-CAACAAAAAATTGGCAAAGTGCAAAAAAACCAGAATTAGATATTAAAAAT
-ACAGGAAAAATCGAGAAAAATGAGTTACAATTCAGAAAATTAGGCAATTT
-TTTTTTCAAAATTTCTCAAAAACACTGAAATTTCGGTATTTTTTTCTCTA
-CTTGAGCACAACCTCGTGTTGCACCAATCGAACATAGTCTTTGAGCGTCG
-GTGGAAGTGGAAGCTCATCGATTATTCGCTGATAGACACCGTCGGCACCG
-GCGATTTCCAGATTTCTACGTTGGCGAAGGTGGATGGCGCGCTGGAAAAA
-TTTCTAATTTCGAGCTGAAAACTCTTTTATGAAAGCAAAATTTCATAGTT
-TCAATTCAAAGTTCGAATTCCTCGCAAAATTTCAGTCGGAAAACCGAAAA
-CTAGAAGTTTCTTGCTCGAATTTGAAATTTCGAGGGGTACGGTATCCTCG
-AAAGTACGCAAACACCGAATTTTGTTTTTTTGAAGTTTTGGCGCCAAAAA
-TACAATACCCGGGGTCTCGACACGACAAATTTTTAAAATTTTTTTGAGTA
-CTGTAATTTCAAACAAAAAGTTTTTTTTCGAATAAACTCGAATAATACGA
-TAAAAAACATATTTTAATAAAAACCGTGGCAACGAAAGTTTGAAAGTACA
-GTACTCTCTTCAAAGGCGCACACCTTTTACGCATTTAACTTTCGTGGCGA
-GACCCCGGGGATACCGTAATTTTTGACTCAAAATTTAAACAATAAATCCG
-TTAAAATATTAAAAAATTTTTAGATATTTTTCAAAAAGACTGTCGAAAAA
-TTGTTTTTTTATAATTTTTAGAATATTAACAAACAGTTTAAAAATTCCAA
-CAAATTTTGTTTTTCATACCGAAAAGAAGAAAAATGGACAAAATAGTAAG
-CTATTTTTGTGTGTCAAAGTGTCTTATTTCGGCTTGATCTACGTAGATCT
-ACAAAAAATGCGGGAGAAGAGACTCAGAGTTCTCAACTGATTTCGCATGG
-TTAAGAACGTGCTGACGTCACATTATTTTAAGGCGAAAAAATCCCGCCTT
-TTTTTGTAGACCAAACCGTAATGGGACAGCTTGGCACCACGTGACACCCC
-CCGATTCTCACCTGTTCGTGATTTTGGCGAACTGCCATTTCTTTCAAATA
-ATCGTCTAGCGGGGGACTCGATGCTGAAAAAAAAGTTTGATTCGTTAGAG
-GAGCACAAAATTCTGAAAATGCGTATTGCACAACATATTTGACGCGCAAA
-ATATCTCGCAGCGAAAACTACAGTAATTCTTTTTAAATGACTACTGTAGC
-GCTTGTGTCGATTTACGGGCATCGATAGAATATTTTTAAAAAAGAAGAAA
-AAAGAGGGAATAATACGAAGAAAAAAAGGAAAAAAATAAATTCATTTCAG
-AAATCGAGTTCGTAAATCGACACAAGCGCTACTGTAGTCATTTAAAGAGA
-TACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAA
-TACGCATTTTAAGAATTTCCAGTTTTTTCAAACCTTTAAACTTACATTTT
-CGCGGTTTTTTGGCGCTCTCGGATTTCGGGGAACGTATACGTCGGCGACG
-TGACGTGGTTGAAGCAGGGTCCGTCGAACAACATGGCTCTTCGTCTTCCG
-ATACTTGGGATTCTGTTGATGTTGACGGTGATTCCTGAGGTTCCTCTAGA
-GCATCTGAAAGCTCTTGCTCATCTTCTGATAAATCTCCATTGGGACGTTC
-AACCAGGCCGGTGGTGGAAGGATCATTGATGTTCGGAATCATTACAATCT
-CCATTCTCGGAGTATTTGGAGTTTCTGGTCGAGCTATCGAGGAAAGTATG
-CGATGATGGCGGGGTCTATCATGATTAATCGTCCATTCGAGCACATATGC
-TGGTGCTGGAAGGATTGAAAATTGTAAAAACTAAGATTTTTTGGCCAAAA
-AAATAATATTTTCTCAAAAATTTTGAAATTCTCGACAAATATTTTTTACT
-ACTGCCGGTACAGAGAATGTAGATAGTTGAAGAGACACAGACATCCCGGG
-ACCCAAGGGACGGGGCGCGGGATGTCTGTGTCTCTTCAACTACCTGCACT
-CTGTGCTGGTAATATACTTTTTCCAAAAAAAAAACCTACATTTCGGAAGT
-AAAAATGGAAAATTTCGGAGTCTACACAATTGGAAATTTTAATTTTTAAA
-AAATTAAAAATTGTTTTAATTCGGAGTTTTAGACGGAAAAAATTATTAAA
-CTCTAAAATTTTTAAAAATCGAAAAAAAACAAGTCTGAGAGTGAAAAAAA
-TTAATAAATTTTGAACTGAACATTAGATATTTCGATTTTTTTTTGAAAAT
-CATAAATGTTTTCTCGCAAAATTCGGATTTTTTTTACCTGCTCGATTTTC
-AGTAGCCGGAGCTGTATTTCTGAGATTGGCACCATCCAAATGTGCTCGGG
-GCGCTGCAAATTTGATATGAAATTTCACTAAAAAATTAGGAACTTATACA
-AATTTTCTAAAAGAAATACTAATGTTAAGATAATCGAAAGTTTGGAGTGA
-CAGAAAAAATTGTTTCAGCTTCTAGAAATATTTTAATTTAGAAAAAAACT
-TCCAGAAAATTAAAATTTTTTTTTAGAACTTTTGAACATTTTTCCTGATT
-TTTCTTTTTTTTCCATTTTTTGGAATTGCTGGGAATTTCTCTTTTTTCCT
-TCATCCCACAGCTTCGCTTCAGCCTAGGCCTAAGCCTGAGCCTGAGCCTA
-TGCATAAATCTAAGCCTAAGCCTGAGCCTAACCCTATGCCTAAAACAAAG
-CCTGGACCTAGGCCCAAGTCTAAGTCTAAGCCCACGCTCAAATTTAAATC
-GACTCAAGTAACTACTTTAAAGTTGGCAGAAATATTTGAATTCAAAAAAA
-TTTTTAACCAAAAAAAAAATAATTTAAAAGAAATTGTTTTTTTTAAATAA
-AATCAACAATTCACCTGTAAAACCTTGCATTTCTCTCCAATTCAACATTT
-CTTGAAGAACGTCAGTTCTTGTTTCATTCCATCGACGAACATGATCTGCT
-ATAGTATTTCGAATATTTTGTTCATTGTTTTCTTGTTCTCTGGGATTATT
-ATTACGACCCAAATATTGATCCATGACGTCATCCAAGTGATTACGGGTTC
-TTTGATCTGCTGGGAATATTTATAAGCACTTTTTTAATTTAAAACATATT
-TTTTAGTGATTTTTTTTCGAACTTTTGAATTTTGAATTAAAAAAAAAAAA
-ATTAAAAAGTTAAATCCTGAGGGGAGCCAAGAAGTGGGCGTGTTTTAGGA
-CATACTCTTCACTTACGCTTTGGTCTACAAAAAATGCGGAAAACTTTTGC
-CCAAAAAATGTGACGTCAGCACGTTTTTAATCATGCAAAATCATTTGAGA
-GTTCTGCGTCTCTTCTCCCGCATTTCTTGTAGATCTACGTAGATCAAGCC
-TAAATGAGACACTCTGACACCACGTGGAAAATAAAAATCGAACATTTTCA
-AAAAAATTACTCAATTGATTGTCTGCTGGAGTTAGTTGGTCGATTCTGAA
-AAATATTAAAGTACTAAAAATTTTCCTTAGCAACATAGCGCGTTTGCATC
-AAGAAAGGCGGGATTTTTCTAAGCCCGCCCTTTAATGGATCATCAATTTC
-TAGGAAAAATCGATATTTTACACTAAAAGTGATCCAAGAAAATCAATAAA
-TCGGAAAATTTTCCGATTTTCCGTGCTTTTTTGCGAAGATTTATCGAAAA
-TGATTTCCATTAGAGCACGCTTGCAATTTTTTTCACCAATAGCTTTCAAA
-TTTCTTACGGTCTTGGATCAAAAAGTTGTCGACGCCGATTCAACTCTTCG
-AATTGTTCAGCTTGATGCCTTTGAACATGATCCATATACGTATTTCCACC
-TTTCATCACCATTATTGATCCGCAAATCTGACGATTGACACGTGGATTGT
-AGGCGTGTCGGCGAATGTCGCGGCGGAGTGCCTGACGCGCCAAGTAGGTC
-AACGTGCGGGGACCACTAAAAAATCCGGGTTATTGTGATTTCGTGGTGAG
-ACCCGAAAATAGTAGAATTTCCTCGTACATCCTGTGCCTAAGCAGGTTTT
-CAGTTTTTGATGGGTTGTTACCTTCATACACCTACCTGCCTTTGTGACTG
-CCTCCCTGCCTGCCTAAATGTGTGTATGCCTACCTACAGTCTGTTTATCT
-GCCTCAACGCCTTCATACCTACTTGCCTACCTTGCTTACATACCTGCCTA
-CGCGACTACCTATCGGCCTACCGGTTGGCAAGTAGGAAGGCTAACAGGTA
-GGTAAGCTGGCAGGCCTGAAATTTGCAATTTTTGCGAAAAACCGAATTAC
-CTTTCGAAAGGCGTAGGCGTTGAGATCCGTTCCTCCTTCGGAAGCCTGAT
-CATTGGAGAAAATGTCATTCTTCCAGGGACGTCATACACAGTACGATGCT
-TGGAAACTCTTCTGTATCGGCAAACCTGAAAACCTTTAAATGTGGAGGAG
-CCAAGAACTAGACGGAGCCTGTGTAAGGAATATTGTTTCCGGAAACACGG
-ATTTTCAAATTTTAGGCTCCACCCACTCACCACGCAAAATTTCATTTTTG
-GCCCAAAAAGTAAATGTGCAGAAATTGTATTTCAAATTGTAGAAAAACCA
-AGAAATGGGTGGAGCCTGCCTGCCTGCCGGGCTCCGCCCACTTCTTGCCA
-AACCATACCCCCTGTATACGTGGCATGACGAGTTGTCCTCCAACATTCAA
-CATTCCAAGCATTCGTTTCAACAACTGAGAATCATCGGCAACGAATCCGA
-CAAAAATTCGATCATATCGATTTTGATGAGCTTCAAGAAATTTGACATCG
-GTGATGTCGCACACTTTGAGCTCCGGCCGAGCCCAGCCGACAGAGCTCGC
-TTCGGGTGTAGTTATCCATTGATCAATGCATGTTTCCGAGTAGGTGACGA
-GATTCTCGTAGAGTTCGATCCCATGATTTATACCAGTTTCACCTTAAAAA
-TAGGGTTGTCAGGCCACGCCCATTTTTAAAAAATGAATTAAAATTTTCTG
-AGAAAAAATTTCAAACTTTGGTGGGGCATTAAATTTTTTCACATAAATTT
-TTTCGGCGGTAAATTCAAATTTTTTAAAAAATTTCTTTTTTTTTTGGCGG
-GAAATGTGCCGCAAATCAGAAAAACTGAAATTTCTACAAAAAAAGTTGGT
-GGCCGAGTTTTCTCATTTTGTGGTCAGAAAACTCGGCCACCGATTTCTTT
-TGCGGCCCTGTGATTACTTAAAAAAATCGGTGGCCGAGGATTTTTATTTT
-CGCGGCCACAAGTAATGAAGATTGCACAAAATTGATAATAGGGAAAACGC
-GGCCACGAAGTCTAACATGTGCCACGTGGCCGTTAAAAAAAAGCCGGTGG
-CCGAGTTTTATTATTTTTCTAGGCCACGTAACCAGAACTCACCCAATAAA
-ATGCCAGCAATCGTACTTAAATACCCTGAACCAGTTCCAATATGAAGAAA
-CGAGTGTCCTTTACGCAAATCCAAATAATCGAATAATTTCGCATAAATAT
-CAATTGCTCCAACACGAAGTGCTCCCGGATAGAATGGACCGCCCGGTTCT
-GTGGAGGTCAACGACGGAAGACGTGTAAATTTCCGTTCACTAATCGGAAG
-AAAATCGGATCGATCGACAAGTCGAAAGGCTCGTTCGATGTTTCGACGAC
-GGATTGTGTCGTTTTTTACGAGAAAATCGATAAGATCGTCGTTTTGGCTT
-TCACTATTGCCCATTTCTGGAAAATCGATTTTTTAAAATTTTAGATTTAT
-TTATTGATTTTAAATAAATAATTAGAGAGCAGTCATGTGTTTTTCCTTGT
-ATATTTACGAGAGAAATCTCAAAAAATTATTCAAATAGGAAATTTTACGC
-CAACAATAAAATGTAGAGTGGTGTGCGCCTTTAAAAAGTACTGTAATTTC
-AAACTTTTTGGCGCAAAATTTTAGAGTAGTTTTCTTTAAATTAAAAATTC
-AAAAAAAAAACAAATCAAGATAAATACAAAAGTTTGAAATTACAGTACTC
-TTTAAAGGATCACACCATTTTGCATTTAAAAAAATTTGTCATGTCGAGAC
-CGTAATTTTAACGCAAAAAACGTGAATTTTCGCGTCTGTGTAAAAGAAGT
-TAGTTAAGGAGAAAAAACAATTGAAAAATCAACAAAAATTGAACTTTCAA
-CGGAAAATCAAAAATCGTTGCGAGTCAATAATTTTTTAGCTTTGAGGAAA
-ATAACCCTTAAACTCAAAAAACAATTAATCGACTCAACATCAAAATTTCG
-TTACAAGACCCAAATTAAAATTTTTTATTTTGGGATAATTGCTCCTAAAA
-TTAATAAATTCCAGAGAAACGAGTAAATCGTGGCGAGACCCACTAGCGTG
-TACCTTTAATTTCGAAATTATTTTGGGCTGTTCATCACGAACACACGTGT
-TGCCTAGCTACCAAATTCAAAAAACGAAAAACAAAAAAAACAGGTTTCTT
-TGAAATGAAAAATCGATAATCAGCAACGTGGCAAGATGTCTCAAATTATT
-GGAAAAAAAAAACGTTGAAATTCTCAGAAAACGGACCGTTCTGTGGCAGA
-ATTGTGAACGGCGTGCAAGGCCACGACCCGTGGAGAGCGCGTGAGAGTGC
-AGAAAAAAGGAGGCGAGAGAAAACGGCTGACCCGTGGATAGACTTTGTGG
-ATTCAGGAGACGCAGAGCGACCGTGAGAGACCCAGAAATATATGCAGAAA
-GTTAAGGCGTGCAATAGTGTTGGAAATTATAATAAATGGGTACGGTAGGT
-ATGACCTTTCGGGATCTTTGTGGGTCTCGCCGCGACGAGTTTTCAAGGTG
-CATAAGGTTTTTGCGATGGGTCTCGTCACATAATTGTAGATTAAAATTGT
-TGATTCGAGATAAATGGAAATTCGAAGCGTCTAAAACAGTTAGAACTTTT
-AGTTTACATTAGGTTGAGCTCAACTGTCCAACCCCGTCAAACTTTTTCCA
-CTTTTTTTTTACTTTTGCCTTTATGTCCTTTTCGGCCGTTTTCCTGGGGG
-TTTTTACCAGACTACGAAATATCCTAACTTGGTAAGCCTCAGCCTAAGCC
-GAAGCCTAAACCTTGGCTTTCAACTATACATACACATTTCCTCCTTTTTA
-AACGATATTAATTAATTTACAAAACACCAAAAAAATATACAAAAAATGAT
-TTGAATTTATGAGTTTCCCGCTAAATACCTACCGAGACCCAACTTTTGGC
-CGTGGAGCGCGCTTGCACTTAAACTTCAATTTTTCACATCCCCATAATAA
-CTTCCTTGTTTTAAATTGTTTTTCCCTATATTATTATTATCCTTATCACG
-AGATGCCCTTGCAAAACACATTGTAAAAATAGTATTCTCAACTGATAATA
-ATATTTTGTGTACCCCACGATAGTCCTTCTGGACCATAAAAATATTGATA
-ATTACTGATAAGCTTTCTCTGTGGTTTCTGTAGTTTTGGTGATATTTTGG
-GCAACAAATTTATATTATGGAAACACGGAATTCTGAAAATGCGTATTGCG
-CAACATATTTGACGCGCAAAATATCTCGTGGCGAAAACTACAGTAATTCT
-TTAAATGACTACTGTATCGCTTGTGTCGATTTACGGGCTTGATGTTGGAA
-ATTAATTTATTTTCGAATTGTGACAGCGATATTCAGTTTTCCTTTGTTTT
-TTTTTTTCGTATTATTTTGTTATTTTTATGCTTTCTTTTAATATTTTATC
-AATTAATGAATGATTTCCGTAAATCGACACAAGCACTACAGTAGTCATTT
-AAACAATTACTGTAGTTTTCGCTTCGAGATATTTTGCGCGTCAAATATGT
-TGTGTAATACGTAAAGAAAGTTTGAAATAATTGTTTTTAAATAATTTCTT
-ATTCATTCACTGTCAATTCTCACCGAAAAAAAAAATCCAAGTTCCTCCCG
-CCAACTTGGCACGATGCCAAAAGGTTCTCAGGCCCATTCATGTCATTCAA
-TCCATTCAAATGAACGACTTTTCGTTCAGTTTAGGCTTCTTCTTTTTCCG
-GTTTAGTACTTTTTCAAACCGAAAAAAAAAATCCCAAATTGAATGCAAAT
-GTGCTCTATTTGGAATAGACTTCACCCTATTTCGGAATTTTTTCCGATTT
-TCTGAAAATCTTTAACACTTTTCTAACTGTTGCATTAATGACATTTTTCT
-AGAAATTCTACTGCAAACGCGCTCAGTTGCGAAAGTTTTTGGGTCTCACA
-ACGATTTCGGAAGAAAAACGTTTTATTCGTTGCGAGACCCGGAAGAGCCC
-GGTGGAGCGCGTTTGCAATTTTTTTGGTTTGAAAATTTTGCGCAACGATG
-CTCCAAAATAACACCTCGCGAATTTTATCGTTTTTTTAAATTATGACTTT
-TCCGGTCCCAGAACGAATTACAAAAGCAATTTTTATGAAAAATCGTTACA
-AGACCACAAAAAAAAGCGCAATAGAGCGCGTTTGCACCTTTTTTTCTTGG
-AAAAGTCTCGTTTTTTTCTCGGTAAATTCACTGTGACATTGACCTTTCTC
-GAAAAACGAAAAGTGTAATGGAAAGTGAACAAAAGTGACAATAATCTGGT
-GAATTGCGTTTTGTTGTAATATTTTTGTATCTTCTTTTCTTTTTTTAATC
-TGCGAAAAATAGAAAAGTTTTGGAGAGAAAGTGATTTTCGACGAAATTTT
-CCTGATTTTGCTAAAATTGAACAAAAATTGTCATCATTTTCTGTGGGGTT
-TCTCAAATGTTTTCTTAAAATTTATGCGCCTTTAAATTTGGGGGATTACT
-GTAATGTTTGTATTTTTCAATTTTGTTTCGGGAACACAAAATTCTGAGAA
-TGCGTACTGCACAATATATTTGACGCGTAAAATATCTCGTAGCGAAAACT
-ACAATGGATTAAAATTTAATGAAATATCGTTATCACTATTCGAAAAGAAT
-TTCATTATGAAGCCCGTAAATCGACACAAACTCTACTGTAGTCATTTAAA
-GAATTACTGTAGTTTTCGTTACGAGATATTTTGCGCGTTGTCCCCGTAAT
-AGTTTAACTTTTACCACGTGGCCGCCAGAAGAAAAACTTCTGCTACCGGA
-TTTCATTTCCTCGGCCACAAACCCTTTTGACCCCCGAAAAAGTACATAAA
-AACAATTCCGGGGACTGGGTCTCCAATCTCTCGCCCCCACTCACTAACAA
-GGGGGACACCCTCAGAAACGAATGCCGTCTAACCGTCTGCACCCTCTCTC
-TCGTCGCTCCAAATTCTTGGATCAATGCCAACTAACACGCAGTGTCCCCC
-CTCCTCCTTCATCCACCCAAATGTTTCATCACTTCCCGGCCACCGCAGGC
-TTCTCTCTCTTTCTCTAAATCTCTCATAAACTACTGTCTCTCTCTCTCTG
-CTTCTTTTGCTCAATTGTTCTTCTTCATCACTACTATTTGCTCAATTTTC
-GTAAATATTTTATTTTAAAATATCCCTTTTTCCTCCCCCCGCCTCTCTGC
-TTCTCGCTTGACGCGCCACATACACTAAAAAAACCGGTTTTTTCTATCTC
-TCTCCGCCCGATCATTGAATAGATAGTGTGTGCTGTACATCAAATTTCCA
-TGGAAAAATCGCGCCGAAATTCCAGAAAATTCCACTTTTTCTAGAATTTT
-CAGCGATTTTTTTCGGTTTTTGAATTTAATACAAAGCGAAATTCCGTGAA
-AAATTAATTTTTCCTCAATTTTTGACGAATAAAAAATATTAGTATTGTTT
-TTTTTTCAAGAAAGTGTGATTTTTTCACAATTTTCTATGGTTTTTACGGA
-GAAAATCTTGAAATTCCACAGAAAAACTTGACAAGTCTTTGAAAATTAAT
-AAAATTTCACCGTATCTGCCGATCGTTGCAAGACACACTCCACAAAAGAA
-GTCGTGCGCCTTTAAACTGTGTACGGTAACTATATTGATTTAATTTTTTT
-TTTCGATTTTGCGTCTATTTTTCCAATTTTTCTCTGATTTCGAACGATTT
-TTTGCATTTTACCTCAAAAAAATTAATTTATTTAGATGATAAAGTGGAAA
-TTGCTGATTTTTTACAAAAAAACACTTAAAAAACGAGTTTTCTCATCAAT
-TTCAGTTGTTTCTGGCATGGCTCATTGTTTATCGACACCTGCTTGTTTTT
-CTCCTCCTCTCCCATCAATTTTATGAGTTTTTCTTCGAAATTTCTCCATT
-TTTCCCGTTCAAAAACCGCCAAAATTCGCTTTTTTTTTTCCAGAATTCGC
-CTACTATAGCACTACTAGATGTGTTAATTTGGAATTATTTTTCAAAAAGA
-AATGTATCCGGACGGGCTAACTGAAAATGAGAAGCTCAAAGTGAAGGAGC
-TGTGCACTATGGTCAATATATCCGATGAGGATGCGATTAAATTGTTAAAA
-GGTGGATAATTAAGCTGAAAAGTGGAAAAAAAAATGCATTTTTTACCTAA
-AATTTACCTAAAAATTGGACCAAAACGTCATAAAAATACTGAAAAGTCAG
-AAAATTGTCTAAAAAAACTAATTTTCGCTAAATAATTCCAGAAAACGACT
-GGGACATTGCAATTTCATCGCGAAGAGTGTCGAAACAAGAGGATAAAACA
-TTGGTTCCGGGCACTTCGAGAGGTAAATTTTTGAAAATTTTCAGAATCAA
-ACTGAAAAATAGATATATTGTGTGAAAAAATCCATTTTCGCCGTAAGAAA
-AGTGAATTTTGAGCGGTTTTTCAAATTTTAAACTGAAAAAAAAAATCAAT
-TTATCTGAAATTTTGCTCTTTTCGGCGGGTTTTTTCTCAAAATTTGATGA
-AAAAGTTCTAGAAAAACGACAAAAAAGCCTTTAAATGTACTTTTTTCTGC
-GATTTTTTATCTTAAATTTAAAATTTTGCGCGTCAAATCTGGTGTTTTGA
-CTCCGCCCACTAAATTTAAACTTTTCGTGAAAAAAAAATGTTTTTCTCCG
-ATTTTTAATTGTTAATTTAGGCAAAAAAATACAAAATTTGCCCAATTCAC
-CTATTTTTTCCAAAAAATCACAAACTTTGCGCGTAAAATCGGGTGTTTAT
-GCTCCGCCCACAAAAATTTCTTAGAATTCGATTTTCGGCGGATTTTTTCT
-CAAAATTTGATGAAAAATCTGAGAAAAACTACAAAAAATCTTTGAGCTTT
-ACTTTTTCTCTGCGATTTTTATCTAAAATTTGAAGTTTTGCGCGTCAAAT
-CTGGTGCCTTGGCTCCGCCCACAAAATTTGAAGTTTTCGTTTAAAAAAAT
-GTTTTCACCACTTTTTCGCCGCTTTTTCGCCTGAAAAATCCCAATTTTTT
-TGCAGAAGAAATCGATTTGGATCGATTATCGAGTCGTCTACGTGTTCACG
-GATTAGCCTTCTATCTTCCAGATTTTGGAGGTTTTCCTAATGAATTTCGA
-ACGTTTTTGGAGAAGGATTTGATAGAGACGCAGACACAGAAGAGACTGGA
-GGCGTCCAGTAAGTTGTTTTCTGGAAAAATTGAAAAAAAAATTGAATAAA
-AAAAATGATTTTTTTAATCGAAAAAAAAAGTTTTCAAAAATAAAATTGGA
-AAAGGTGAAAAAAATTGAACAATTAAAAAAGAGCGACAAATGAATAAAAA
-AAAACTTTTTTTTTTTCGAAAAAAAAGAAAACAAATGTTTTTTAATCGAA
-AAAATAAAAAACGAAAAAAAAAGGAAATTTTTTTTACAATTAGAAAAAAA
-AAATTAAAAATGTATTAAAAATTTTTTTTTTTGACATTTTCTTTCGCTTT
-TTAATAAGTTTTGACTAGCGGGCCCTGCGGGCCCGCCAGTTGCAGGGGGT
-GTAGGGCGAGTCCCCCAGTCGGGCGTAGGTTCTCGGCTTCGCCTCGAACC
-TGTCAGAGGATTCGCGACAATTGCAGTGAGTCAATGGGAGGAGGGGAGAC
-CCACTCATATTTTATAAAATCGAACATTTCTATTTGAATCCCGAGCACTC
-ACAAAAAAACGAAAAAGTTTGTCAGTTGGGGGAATCGAGCAAAAGAGCAA
-ATTATTCACAGCCATACGCACTAACCACTCGGCCATGCGGGAGAGACCTG
-TCACAGAAATGTAGGGAAGGAAAATTTCTGGGGGGGGGGGGGGGGGGGGG
-AGTTGTCTTTCGATTCCGTTTTATTCAATAATGACAATTTGGGGAAAGAC
-GTTTGAAAACCGTTTATCACTGATAAGTCAGCAGGAAAACAATTTTTTGA
-AATTTTTTTATAGCATTGTACTCATTATTTAATTCCCGAAAGAGAGCCGA
-AAAGTTGAAGGTGTTATCTTGTAAATTGGTTTATTTGAAGAAAAAACAAG
-TTTTGGCCTGAAAATTTTGAAAAAATAATATCTCTTGGCAGAGCATTGCT
-AATGCGACGAAACTCCAGCTTCCATTAGATAAAATCAAAAACTATGAATC
-AGAAATACATTCCGCAAAACTTTAGTGGAAAAAATGTTCAGGAGACCCAG
-GAAACCACTCCCCCCAGTACTAAATTTTTGAATTATTTTTTCTTGAAAAA
-TTTTCCCACTGAACTTTTTACAAATTTTATATGTCTCGATGCGTCTTGAT
-GAGACCTACACGTCAATTTTTGGAAAACTAAGAAAACTTGAAAACTGACC
-GAGTTATGATTGAAAAAGTAGATTAGCAAAGATGGGAAAGTGTGCAAAAT
-TTGGCACTTATTCGTCTTGCTCGGCCGACTCATAGTACTTTTTCCAATTC
-TGAGTTAAAAATCGTGTTCAGCGTACTTTTGTACGTGGGATAAAGAAAAA
-AAATATCAAAAAAGATGAAGTAGAACTTGAGATAAAGACGAAAAACTACT
-TTTTCGGAAAAAATTTTTTTTTGGCAAAATGGCATTTTTTGGCCTTTTGT
-TTTATCACAACTTTTTGCCTTTTGCACTTATGAACTCAAACTTTCTTTCA
-AAAAATCCACCTCTCTGAGTAGTATCTTGCACATAAATTTGGAACAAAAC
-CGAGCAAAACCCGAATTTTAATTCAATTAAAACATGGTTTTTTGGGGGTA
-AAAAAAGCAACAAAAAATTTTTTCAAACTGGGGAAAGCCGCCCTGAGCTC
-AGTTTTGCTCCAAACTTTGTGCAGTTTTTTGCTCCCCCGTGGGGTGAAAT
-ATTTCTAGTAAGCTGTCAAATATTACAAAATTCAGTCAAACGGCTCTGGA
-GTTATTAATGAAAACGCAGTGTGACATTTTTTCGCAAGCCAAAAAAAACG
-CGAAAAAACGCGAAAAAGGGGCGGAGTCTGTACACTCGGCATTTATTAGA
-GGCTGCTTGGCAGATTTTGAAATATCGGAAAAACTTTAAAAGTTCTTTTT
-TTTCCAGGACACCTAAACTGGTGGCATCAATTCGGCCAAAAACTCTACCC
-GCTATCAACTACTGGAGACGGAAATTGCCTTCTTCACGCCGCATCGTTAG
-GTAAATGGTTTTTCAGAGCGAAAAATCGGAAAATCGCTAAAAACTTACTA
-TTTCCACTGAAAAAATTGTAGAGATCGCTCAAAATTTCACTATTTTCTGA
-ACATTTTGATAAAAAACGACAAAACTATTTCAAAACGAGCCCCGAAAATT
-GTTTTTTTACTAAATTTTTTTTGGAGAAGTGCAAAAATTTAAATTTTTGA
-ATTAAATCTTTAAATCTTCAACAAAATTTAATCGTAAATTTTCAGGTATG
-TGGGGAGTACATGATCGTCAGCTATCACTTCGTGAAACTCTCTACGAACT
-TCTTACAAATGGCGCCAGAAAAGAAGCAATCCGACGGCGATGGAAATGGG
-TTGAGAATCATATGAATCAGGTAATTGGCGAGAGAAGAATCTGTGAAAAA
-TTTCTTAAAATTCGGTGAAAAATGATCAAAAATGAGCTGAAAACCGGTCA
-CGTAGTTGAAATCCGCGGAATATGAAATTCCCAGAGGAAACAATTTTCGT
-GGATTTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACG
-GAGTTGAAATCCGCAGAATTCGAAATTCCCAGAGGAAACAATTTTCGTGG
-ATTTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACGGA
-GTTGAAATCCGCGGAATTCGAAATTCCCAGAGAAAACAATTTTCGTAGAT
-TTCAACTTCGCGAATTTTTCTCAAAAAGCTTGAGTAAAAACTCACGGAGT
-TGAAATTCGCGGAATTCGAAATTCCCAGAGAAAACAATTTTCGTAGATTT
-CAACTTTTCTAGATTTTTTGCCAATTTTTTATTACATGTTACAAAAAAAC
-GGCTGTAAATACTCACGGAGTTGAAATCCGCGGAATTCGATTTTTGTAGA
-TTTCATCTTTTCCAGAATTTTCCAACAAAAAAAACCGGAAAAAATTATCC
-GACACTCCATGGAATCTAGTTTTCGGAGATTTCAACATCGAGAACTTTTT
-TCGCACATTTTTTTGCATTTTTAAAAAATTTCACCAATTTTCCAATTAAA
-ATTTTTTAAATTTCCAGAGTAACGGTCTCGCATTGACCCTCTCGGAAAAT
-GAATGCTTGAGTAAAAACTCACGGAGTTGAAATCCGCGGAATTTGAAATT
-CCCAGAGAAAACAATTTTCGTAGATTTCAACTTCGCGGAGTTTTCTGTCA
-ATTTTTTGAGATTTTTTCTCAAAAAGCTTGAGTAAATACTCACGTAGTTG
-AAATCCGCGGAATTCGAGATTCCAGGAAATTCGATTTTCGTAAATTTCAT
-CTTTCCCAGAATTTTCCAATTAAAAAAAAACGGAAAAAATTATCCGACAC
-TCCATGGAATTTAGTTTTCGGAGATTTCAACATCGAGAACTTTTCTCGTA
-GATTTTTTTGCATTTTTTAAAAATTTCACCAATTTTTCAATTAAAATTTT
-TTTAAAAAATTTTCAGAGTAACGGTCTCGCATTGACCCTGTCGGAAAATG
-AATGGGAACTCGAATGGGATGTTGTACTCGGATTATCATCTCCATTACCC
-CGTAAACAAGAGGATAATGGCTCAAATTCCACAGATCAAATCTACGAGAG
-TCTTGAGGCAATCCACGTGTTCGCGTTGGCTCATGTGCTCAAAAGACCAG
-TTGTGGTTGTATCGGATACGGTAGGGAATTTTAAAATTTTTTAATTCTTC
-AAAAATTTATTGAAGAGAACAGTAACAAAAAATTTGGTTACTTGTGAATT
-TTACAGAAATATAGAAAATTTTAATTTAAAAAAATTTCGAGATTGGTGAG
-AATCAAGGGTGTCAAGTCCCGTGTCCCGTTTGTCCCGTTGTCCCGTTTTT
-TGAGTGTTTTTACGGGAACGGGACGTCTTTTGTCCCGTTTTTGAGCGTTT
-TCACGGGAACGGGATGTCCCGTTGTCCCGTTTTTTGGGTGTTTTCGCGGG
-AACGGGACGTCCCGTTGTCCCGTTTTTAAAATTTTCACGGGAACGGGACA
-TCCCGTTGTCCCGTTTTTGTCATTTTTACGGAACATTGACACCCTTGGTG
-AGAATAAAAAATCAATAATACACATAATTTTTGGAAGAAAAATCGATTTT
-AAAAATGAAGCTTAACATTTTTTTTCGAAAGAAAAAAAGTGTAAGAAGTT
-TATCAAAAAAAAAAACATTGAAAAAAATATCTTCAAAAATGTTCAATTTT
-GTTTTAAGGTGCAACTATTACAAGAGCACACAATTCTTAGAATACGTATT
-GCGCAACCTATTTGACGCGCGAAAACTACAGTAATACTTTAATTGTCTAC
-TGTAGTGCTTGTGTCTCGATTTACGAGCTCGATTGATAGAATATTCAAAT
-AATTTATTTATCGATTTAATATTCAAATTAGGCAAAAAATGAGAAAAAAT
-ATACATGTGAAAAAATTAATTTTAAAAATAGAGCCCGTAAATCGACACAG
-TAGTCATTTAAAGGATTACTGTAGTTTTCGCTGCGAGATATTTTGCGCGT
-CAAATTTGTTGCTTAATACGCATTCTTAGAATTTTGTGTTCACATAATAC
-GGTTTTTCAAAAATTTTAAATCTTCATAAAATTCATCAATAATAACTAAA
-ACTTAATCAAAAAAAAATTTAATTTTAGTGTAGTCATCAGAAAAAGTCCA
-TCAAAAAAAGTCCATCAAAAAACCATCAAAAAAAGAAAATTGAAAAATTT
-GAATTAAAACATTTTTTTCGAATTTTTGAAAATAAAAGTGTTTGAATATT
-AAACGTAATTAAAAAAAAAGATTTTCCTTTTTTAGAAAAATCTATTCATA
-TTAGAACAGTCGATTTTATAAAAGTATCGATTTTTTTATTAATTGGATTT
-TTTGTAAAATAATAATCGATTTTGAAAATAAATTGCTTAAAATATTGTAT
-TTTTTGACAGAAAAAATGTAAAAAATTTATCAAAAATAAATAAAATTGCA
-AATAATTTTACCTACAAATTAATTGTTTATTAAATAAAGTTTAAATAAAT
-TAGAACAGGAGTAAAACGAGTTTTCAAAATTATTCTTTAAAATCTCGGGT
-TCTTTTAATTCAAAAATTCTTTTAAAAAAAACTCAATAATTACGGATTTT
-TCAAAAATTCGAAAAATTCAGAAATTCAGAATTTGGATAACATAATTCTA
-GTTGACTTCCAAAAAAATGATATGTGACTTACTTAAGGTACAACTAACAT
-TAATTTTCCAAAATTCTTATGGCTGCTTTAAAACACGCCAATGGGGTCAT
-AATGACCGAATATTATGTTTAAAAAAATCAAAAAAAATTTTCTGATTTTA
-TATGATTTTTTGAAAATTGGAAAAATCACAGTTTTAACCTAATTATTTTT
-GAATTTCTGCCAATTGGATTTGTTCGGTGCAGCGCGCTTGCATTATTTTT
-ATTTATTTATTTTATTTATTCTCGTTATTTCACTGATTTTCTTCATTTTC
-TATGTTTTTTTTTCTCGGAAAATGAAAGAAATAAACAAGACAAATGCGAA
-ATGTTTGTTAAAAAGTAATTGAAAATGCGTAAAACTGTGATATTCTGAGT
-TCCGACGACGAAGAGCCTGAAATTAGTATATTTTTCAGTTTCACTCATTT
-TCAATTACTTTTAAACAAACATTTCGCATTTTTCTTGTTTATTTCTTCCA
-TTTTCTGAAGAAAAAACATAGAAAATGAAGAAAATCAGTGAAATAACGAG
-AAAAATATATATAATTCATTAAATAAAAATAATGCAAGCGCGCTCCACCG
-AACAAATCCAATTGGCAGAAATTCAAAAATAATTAGGTGAAAACTGTGAT
-TTTTCCAATTTTCAAAAAATCATATAAAATCTAGAAAATTTTTTTGAATT
-TTTTTATCATAATATTCGGTTATTGTGGCCCCATGGGCGTGTTTTAAAAC
-AATTTCCCCACTGAGCGTAGTCCACCTTTGAAATGTTCTCAAAAAATGAA
-AAAAAAACGAGTTATAAAAATTATTTTTTAAAAATCCAATATTTTAAATT
-AATTTTTTTTTGCAGATTCTGCGAAACGCGAAAGGCGAAGAACTGTCTCC
-AGTGGCTTTTGGTGGAATATATCTTCCATTAGAATGCCCACCATCACAAT
-GTCATCGTTCACCACTTGTTTTATGCTATGATTCTGCTCATTTCTCACCA
-CTTGTACTCATGAGAACAGAGACTAACAATAAACGTAAGCAATTTTTTTT
-TTGAGAAAAAATATTTTCAAAATCATTTTTTAACTGAATTTTCAAATTTC
-CCCCCCCCGTCCCCCCCATTTTTTTCGAAAAGTGAATTGGAATTTTCCTG
-AAATTTGCACAAATTTTTTTTTGAAAATTCAAATGTTCGTCAAATAATTA
-TTTTATTCGAAAAATCGACATTTTTCCAAATTGTAATATTTTTATTCTAA
-AAATCCAAAATTTGATTTGGTAAAATTTCTGTCAACAATCAATTAAAAAT
-CCAAAATTTTCAAAAAAATTGTGATTTTATTCGGGAAATTCGAAATTTCC
-TATTTAAAATTGGATAAATCTAAAAGTTTTCGATTTTATAATTTTTAGGA
-AAACAAGTTTTCAAATTTTTTTAATTATTAAAGTTTTTTTTTGCAATTTC
-ACTAAATGAGCCAAATTTTAAAAGTGGAGCACCGAAATTTGAGACTTTGC
-TTTTTTAGACTCAAATTGGTCCAAAACTACCGAATTTTGTAATGATACAT
-TCTGAAAATTTCTCAAAAAAAAGTTATGGCTGTTTAAAGTTCGGCAAAAT
-AAGGCCCATTTTCAGCTAAAATCAAAATTTTTTCCAACTTCTAGGTGTCG
-CAACGTCTGGACCCTAATTTTTATTTATTCATCACTTTTTAATAAATATT
-GTGGCCTTTGATTGGGCGTTTAATCGTTGTTTTAAGTACATTTATGATCT
-TTGGAGTACAAATAAACGTTACATTTTGTACCCCAAAGACCATAAATGTA
-TTTAAATCAACGATTAAACGCCCAATCAAAGACCACAATATTTATTAAAA
-AGTGTTGAATAAATAAAAATTAGGTTCCAGACGTTGCGACACCTAGAAGT
-TGGAAAAAATTTTGATTTTAGCTGAAAATGGGCCTTATTTTGCCGAACTT
-TGAACAGCCATAACTTTTTTTTGAAAAATTTTCAGAACGTTTCATTACGA
-AATTCGGTAGTTTTGGGCCAGTTGGGTCTAAAACAGCAAAGTCTCAAATT
-TCGGTACTCCACCTTTAAAGAATTCATATAATTTTCTAAAACAACATATT
-CTGATTTACAGAAATACATTTAATATCAATATGAATTATTTGAAAAATCA
-AAAAATTTATATTTATTTTCAGAAATAATTCCGATAATCGATGTGAACCG
-TAACCTGCTGCCTGTCCATTTTGCAGTTGATCCAGGAGAGTCATTCGATT
-GGTCCAAATTAGAAACAAATAGTAATACACAGACAACTACTGATATGTCA
-CAAATTGATAAGCTTGCGTTGATTAGTCAATATATGGATATTATTAGGTA
-AGAAAATGAGAAAAAGGATTTTTTCAATTTTTTTTTCTAAAAAAAATATT
-CAAAATATCGTTAAAAAGCCAAAAATGTGTACGTTTTAATTTAAAAAATA
-TTAAAATTTTTTTGTCCCAAAATTAAAATATCGAAATCAAAATGTTTCCG
-ACATTTATATAGAAATTCTGGAAATTTTTTTAAAATCGAAATCATATTTT
-GAATGAAACTACAGAAAACAGCGCCAAAAAAGAAAAAAAATCGTTTTTTT
-TTTTCGAATCTTTCATTACAAATATTTGAAAAAACGATACAATTATGTTT
-CGCGAAAATTTTTTAAAAAAACTTTAAAAAATTATTAAAATCAGCTATTT
-AATCACAAATGAGAAATATATCGGAAATCTGGAAAAAATTAAAAAAATTT
-TTTGCGTATTTGTCTGAATTTATTTTACAAATACCAAAAAAAAATCAATT
-ATTGTTGGAAAAAATTGAAATACAACGGAAATCGAATTATTTTTATTTAA
-AAAGAACGAAAAAAAATCCAGAAACCATCACAAAATTATTGGAAAACGAG
-AAAGCTGATTTTTCGCTAAAGTTCAAAAAAATTTACAAAAAAAGAAAAGT
-ATTAAAATCGGTAATTTTCCCAGCTTGAAAAACTGAAAAATTCGAGTTTT
-CTAAAAAAAATTAAAAAAAAAAATCAAAATATTCCTCAATTTTGGAAAAT
-TACGGAAAAAGTAGTTTTCTTTAGCTTTCGGCCAAAATTTTATCATAAAA
-ATTTCCGGAATGCATAGTTTTAGAGAATAATTTTAAATTGAAACACTAAA
-TTTTTTAAAAAACTTTTTTTTTTGAAAATCCCGGATTTAAAAAAAAATAA
-AATTTGAATTTCATATAAATATTTTGTTAGGAAAAATAGTTTCTAAACAA
-AAATTTGAAAAAAAAAATATTTTTTTTTTCATATTCTTTGAATAAAAAAA
-ATCTGAATTTCGAAACATTTCAGATTAGACGTTCGTCGTGGCTCAATCCG
-TAGCTCGCGGAGAGTTCGAAGTGCTCACGCGCAACTTCTCACCGAATCTC
-GTGGTGAAAATGGGCAAAATTTGCCCCAAAAATCAATTAAACCAAGAGAT
-TTAAGTGCACATTCTAGTGATGAACAACCATCAAATAATGCAAAAGGAAT
-GACATTAGCATCAAGTGGAATTGGTTCTGGAAGACATGAGAAATGGAGAT
-TAATCAATGAAATTCGGTAAGCATTTTTTTTTTGGATTTTTGGCCTGGAA
-AAAATTTTTCCAACAAAAACTTGAACAGAATTTTTGAAAAAAATGTTGGA
-AAATTAAAAAAAAATTTTTTAAAGTAATCAATTTTAATTTTAAAAATTAG
-AAACTTTTCAAATAAAACATTTTTATTTTTTCAAAAATTTTGAATTTCAT
-TTTCAGAATAATCATTAATGAAAATTCAAAAAATTCAAACTACAATACTA
-CGATAACAAAAAAAAATCAGAATGCGTACTACGCAACATATTTGACGCGC
-AAAATATCTCGTAGCGAAAACTACAGTAATCCTTTAAATGACTACTGTGT
-CGATTTACGGGCCTTGTTCTATTTTTGAAATTAATTCATTTTCGAATAGT
-GACAGCCATATTACATTTTTCTTCGCTTTTTTGTATTATTTTCTCTTTTT
-TTTTGCCTAATTTGAACATTCTATCAATCGAGCCCGTAAATCGACACAAG
-CGCTATAGTAGTCATTTAATGAATTACTGTAGTTTTCGCTACGAGATATT
-TTGCGCGTCAAGTATGTTGCGTAGTACGCATTCTCAAAATTTTGTGTTCC
-CGTAATATGGTAGTTTGAATTTTTTTAATTTTCATTAATGATTATTCTGA
-AAATGAAATTCTAAAGTTTTGAATAAATAAAAATGTTAAAAAATTTTTAT
-TTGAAAAGTTCCTCATTTTTTCAAATTAAAATGGATTACTTTTAATTTCC
-AAAATTTGTTTACAAAAAATTCGTTTAAAAAAAAATTAAACTGTTAAATG
-TTAAACTTTTCAAAAAAAAAGTTCAAAATTTTTCTGTAAATTTTTAAAAT
-GATACATGTAATTTAGATTATAATTTAAAAAAAAGACAAACATTTTTTGA
-CGAAAAATATTAAAATTTTGTTAAAAAATGAAAGTTTTTAAAGCCTAAGC
-CTTAGCCTCAGCCTAAGCCCAAGCCAAAGCCCAAGCCTAAGCCTAAGTTT
-GGTACTGCAGTATTTAAAAAAAAAGTTTTTCCCCAAATTTCTTCTGTTTT
-CTTAAAATTCAAAACTGTTATTTGCAAAAAAAAATGTTTTTGCAAAATTT
-GAAATTTATTGAACTGAAAAAAATGTGAATTTTTTAATTGCCTTTGTCGC
-AGCGGCTGGAAACAATTTTTTTTTTGAAATCAATTTTAAGAATAAAAATT
-GATTATCTTGCGTTTTAAACTTGATTAGGGTATTTAAAAATCGATGGACG
-GCGAGTTTTGGTTCAAAAAAATTAAAAATCTCGCCGTCCATCGATTTTTA
-AATACCCTAATCAAGTTTAAAACGCAAAGTAATTAACTTGTATACTCGAA
-ATTTGACGATGATTTCAAAAAAAAATTGTTTCCAGCCGCTGCGACATTGA
-TAAGTTGGTCAAATTTCCGATTTTAACTAATTTTAGGCCATTTTTTGAGC
-CGTCATAACTTTTTTCTGAAAAGTTTTCAAGAAGTTTCATTATAAAATTC
-GGTGTTTTCAGACAATTTTGAGTCTAAGAAGCCAATAAAAAATTCGACTA
-CACCACCTTTAAAGCTCAAAATAACGTCCAAAAATTCAATTTCCAGAACC
-CACGTGCTTCGAACTTTTCGTATTTCCTCATCAACACGTGGCAAAGAGAA
-ACTAATCGATACGGACGATTGTATTGCAAGAATGAATTCGACGTGCGTTC
-TCGCATCGGAATTATTGCCAACTCATCACCAATACATGGACAAAATAATC
-AATGAATACATGAAAAGTGCGAAACAACGATTCCAACAGAATCAGCGAAC
-ACAATCGGATAGTCGGAAACGGATTAGTCGAAGTTTCAGTGCAAGCTCAC
-TTATGCTCACGTGTATCGGTTGTGATTCGGTACGAGACCCACTTTTTGAT
-GGAATTTCGAGAAAAAAGTTGAAAAAACGGAGAATTTGGCACAAGTAGCC
-TCAATATTTGAAAAAAAAAACCGAAAAAATGGATGAGGGGAAGCCAAAAT
-ACCAGAATTTACACCCAATTTTCAAAGTTTTATTGATTTTTTACAAAAAT
-TTTCTCAGTTTTTCAGTAAATTTGCCAGATCTGACCATTTTTTAGGAAAA
-CTGAAAATTTTCGGTGTTTTGCCAGAATAGCAACTTCCTGAAAATTTAGA
-ACTAATTAATTTTTAATTTTTTGGGGGAATCATTTATTTCCTAACAGAAT
-TTGATTTGAATTTCGAAAAAAACCGATTCTAAGCTTAAAAATTGACAAAA
-ATAGCAATGAATGTCAAAAAAATTGCTAATACATAAAAATTGTTTGAAAA
-AATACAAAAATAACAATTTTTATTTAAACTTTAAAAATTTTTCAAATTTT
-AAAAATTGAAAAAATTAAAAAATTTTTAAATTAAAATTAAAACATTTTTT
-GTTAAAATTTGAAAAAAATTCAAAAAAAAAATTTACATTAAATTTTTTTT
-TTCAGGAATTCAAGCCGGCATCTCAAGTGACAAATATCATGTGTGATCAA
-TGTTTTGCTTGGCAAAAAATGAGTGTTCTCACGTCGAATTGCGACCAATT
-TATGGGAAATTCTGGGCCACCGTGCAAAAGTTCAACACTTCCGTCATTTG
-GTAGTAATGATAGTAATCAGAATGATAAGGAAAATATTGTGGAGGTACTT
-AATGTGGTGCCTAAAGATGGAGCCAAGACACTTACCAGGTATGGTTGAAA
-TTTTGAAAAAATTAGAATTTTCAACGAAAACAGAAATTATTTTAAAAATT
-TATTTTTAATTGAAAAATAAAAATTTCTCCCAAAAAATTTTCCCAAAAAA
-AGTGTTTATGTTATTTTTGAAAATTATAATTGAATTGATTTTAAAAATTA
-CGAGAACACAAAATTTGGAGAATGCGTATTGCGCTACATATTTGACGCGC
-AAAATATCTCGTAGCGAAAACTACAGAAATTCTTTAAATGGCTACTGTAG
-CGCGCTAGTGTCGATTTACGGGCTCTATTAACGAAATGAATTAAAATCAT
-TTAGTTATCGAATAATACAAAAATCATTTCATTTCGAAAATCAAGCTCGT
-AAATCGACACAAAAGCTACAGTAGTCCTTTAAAGGATTACTGTAGTTTTC
-GATCCGAGATATTTTGCGCGTAAAATATGTTGCGCAATACGCATTCTTTG
-AATTTTGGCTTCTCGTAATATACGAAGGTTGAAAATTTCAGATTTTTAAC
-ACAAAAACTTATGAAAATAAAATTTATGAAAAGTATAAAAAGTTGAGAAA
-ACAGAAATTTTAATTTTTGCGAAATCTAGATGTCAATTTCTTCACAAAAT
-TTTTCAAAAATCGATTTTTCTTTCGAAAATTTTTTTTTGTAATTATTTTA
-AATCAAAATTTGGCGATTTTCAAAATGTTTATTTTATATTTAATTTCTAA
-AATTAATTATTTTGATTAAAAAATATATAAATTCAATTTTCAGATTGTAA
-AATGAATTTTTTTGAGTTTGCCGTTGAAAAATAGAAAACAAATTATTTTT
-AATAACTGAAATAACTGAAAATGTTGTTTGAAAAATTACATTTTTCCAAA
-AAATCGAACATTTTTGACGCGCAAAAAAATTTGTAAAAAAAAATTTTCAA
-CAGAAAAAACTGTAAAATAGGAAAAAAATTTACCTAAAAAGCGTATGTGC
-CTTTAAAATGTACAGTAACCCCAAAAAAATCGATTTTTTGCAGTATGCGA
-GCTGTGGAGGACGAAAACGGTGTGGTTCACTATTATATGGACGATGAAGT
-AGCGGATTCGTGATTCTATTATACTCATTTCTTTTTTTGAAAATATATTT
-ACTAGAGACCAGTTTTCATTTGATTTTTATCGATTTTTTTTGGATTCCAA
-ATTTTTGTTTTTTTTTTGTTGCTTTTTGTGTGTTTTTTGCCGTCTATCCT
-TCTTTCCTGCCAACGGGATTTTCTCTTCTTTTTTTTTTTTGAAAAACTCA
-ATTTTCCCGCCTAGTATTGCTTTTTTCGAGATTTTTTCTTCCATTTTTCA
-TATCCGCGCCAGCTTTTTCTCTCCCCTCCTTTTTTCACCCATATTTTCGA
-GCTTTTTTCTGTGATTTTTTTTTCACCCCCAAAATTTTTTGTACCAAAAA
-ATTGATGCTTCTTTTTTTTCTCTTTATTTCCAACAAAATGCTTGGCCAAA
-GAAATAAACTCTTTTATAATTTATCATTCAAAAAATTTGAGACCAAATTG
-AAATCCACATCCAGCAACTGCAAAGTGTCATTTGACAATGCACAAATCGC
-ATGGCACGCCCCGTTTTCGTCGATCACCCGGGAACGCGTATTCTGGGACC
-AAATGAGGAGGCGGTGGCGATCGGAGAAAATGAAGTATGGACCACATCTG
-GAAGACACACCTGATTTTACGCGCAAAAATTTAGAAATGTATCGATTTTT
-CGGTCAAAAATCAATATTTATCGATTTTCGGAGGGCACATGGGCTTCTGG
-CCTTCCTCATTGAATATTCGCGCTCCATTTACACTCGCCTGCCGGACAAC
-GCGTGGAAAAGTGTGGTGTACTCCACACGGACAAATACATCAGTTTTACA
-ACTAAAATCGAGCCGTGACGCGACACGCAACGCGCCGTAAATCTACACAA
-AATCTCTCCGACCCAAAATGGCCTAGTTCGGCAAACTCTGCCATTTCGAT
-TTATGAGGGAAGCCAGAAATCCGTGAGGGCAAAGATTGAACAATCTGAGT
-TAAATCGTTTCCATACAAAATTTTTTGAAAATTTTATTCTGAAACTGTCT
-AAAACTCGAAAAGTTATCAATTTTCTGGTTAATTTCTGAGGAAATTCAAA
-AATTGATATTTTCGAAAAAAAAAATCGGAGCCAATACACATCATTTGACG
-CGCAAATGTTGAATTTTCAAATTTACGAGAACCCACGGGATTCTGGCTTC
-CCTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGGCCATTTTGTGTCG
-GAGAGATTTTGTGTAGATTTACGGCGCGTTGTGTGTCACGTCGCGGCTCG
-TTTTCAGTTGTAAAATTGATGTATTTGCCCGTGTGGAGTACACGGCACTT
-TTCCACGCGTTGTCCGGCATTTGTCAATGGAGCGCGAAAATTCAATGAGA
-AAGGCCAGAACCCCGTGAGAATCCTAAAATTCTGAGAATGCGTATTGTGC
-ATCATATCTGACGCGCAAAATATCTCAAAGCGAAAACTAGAGTAATTCAA
-TAAATCACTACTGTAGTGCTTGTGTCGATTTACGGGCTTTCGAAGAAGTT
-ACTTTTTTAGTTTCTTCGTATTATTTTTTTTCATTTTTTGTCTAATTTTA
-ATATTCTATCGATAAATGAATGGGTTTTTATTTATTTTTATTATCGAGCC
-CGTAAATCGACACCAGTGCTACAGTAGTTTTCACTACGAGATATTTTGCG
-CAATATATTTATAAAAGTTGACTAGCGGGCCCTGCGGGCCCGCCAGTTGT
-AGGGGTGTAAGGCGAGTCCCCTTGCCGGGCGTAGGTTCTCGACTTCGCCT
-CGAACCTGTTAGAGGGTTTGTGAAAATTTCAGTAGGTCAATGGGAGTCTT
-CTTGTTTTTTGAGTTCGGTTTGACCAAAAACAGATGCACCCGATGAATCA
-GTTAAAGCTGAGTTTTGATTGATTGAAGTTTGAGGAGGCTTTATATTAGG
-GGAGACGTACCCATATTTTGTATAAAATTGAGTATTTCTATTCGAATCCC
-GATTACTCACAAAAAAACAAAAAAAATTGACACTTGGTAGAATTGAACCA
-ACTACCAAAATTTCTGCAGTCATACGCACTAACCACACGGCCATGCGGGA
-GACACCTCAAACTGGGATGTAGGGAAGAAAATTTTCTGGAGGAAGTCGTC
-TTTCGATTCCGCTTTCTTCAATTATTACTATTTGGGGAAGACGTTCGAAA
-ACCGTTTATCACTGATAAGTCAGCGGAAAACCTAATTTTTGAAAATTTTA
-TCACAGGATTGTACTCATTATTGAATTCCCGAAAAGGAGACGTACAGTTG
-AGGGTTATATCTTGTACACAGACAGATGTATAGAATAAAACAAGTTTTGG
-CCTGAAAATTAAAAAAAATAATATCTCTTGGCAGAGCATTGCTAACGCGA
-CGAAACTTCATCTTCCATTAAATAAAATCAAAAACTATGAATTAAAAATA
-CATTCCGCGAAACTTTAGTGGAAAAAATGTTCAGGGGACCCAGGAAACCA
-CTCCCCCCAGTAAAAAATTTTTGAATTATTTTTTTCTTGAAAAATTTTCC
-CACTGAACTTTTTACAAATTTTATATGTCTCGATGCGTCTTGATGAGACC
-TACACGTCATTTTTTAGAAAACTAAGAAAACTTGAAAACTGACCGAGTTA
-TGATTGAAAAAGTAGATTAGCAAAGATGGGAAAGTGTGCAAAATTTGGCA
-CTTATTCGTCTTGCTCGGCCGACTCATAGTACTTTTTCCAATTCTGAGTT
-AAAAATCGTGTTCAGCGTACTTTTGTACGTGGGATAAAGAAAAAAAATAT
-CAAAAAAGATGAAGTAGAACTTGAGATAAAGACGAAAAACTACTTTTTCG
-GAAAAAAAAATTTTTTGGCAAAATGTCATTTTTTGGCCTTTTGTTTTATC
-ACAACTTTTTTCCATTTGCACTTATGAACTCAAACTTTTTTTCAAAAAAT
-CAGTCTCTCTGAGTAGTATCTTGCACATGAGTTTGAAACAAAACAGAGCA
-AAACCCAAATTTTAATTCAATTAAAACATGCTTTTTTGGGGGTAAAAAGA
-GCAACAAAAAATTTTTTCAAACTGGGGAAAGCCGTCCTGGGCTCAATTTT
-GCTCCGAACTTAGTGCCGTTTTCTGCTCCACTGTGGGGCAAAATATTTCT
-AGTAGGATTTCAAATATTAGAGCATGAAGTCACACGGTTCAGGAGTTGTG
-AATGAAAACGAAGTGGGACATTTTTTCGCAAGCCAAAAAAAACGCGAAAA
-AACGCGAAAAAGGGGCGGAGTCTGTACACTCGGCATTTATTAGAGGCTGC
-TTGGCAGAAAATTATCAATTATGTATATGTATAAGAATTATATTCGAATT
-TCACGCGTAAGTTCCAAATTTAGCAGCATAGCCGCCTGAAGTTCGAAATT
-TAAAATAAAAAAACCGAAAAGTACCTGACAGCCAACGTGGCAACAAATGG
-AATCTCATCGACAAGTCCTTCAGAATTGAATACTGCAGCATTTGACGTAT
-GATAAATGACTGCCACGAATTGATTTTCAAATAATATTTTATTGATTGAC
-GTGGCAGTTTGGTGGCTGAGCGGTTTGTAGTCCAATGTTGGTAGAGTTAA
-TAGGTAAAGACCACCCGTCTCGGTTGCCACACACGCTTCTTCGCCGCTTC
-TGGAAAATTTGGTTTTGAATTTCTAGGCCATTGGGTTAGGCTTCGTTTTT
-GAAATGGGTTAGAAATGTAGAAAATGGAAATTCTAGGCCATCAATTTTCC
-TTTTGCATGTGTGTAGGAAATTGGCTAACATTCTAGAAAATCGATAATTT
-TATAGAAAGTGAAATTTTCGCAAAATCAATAATTCGATAAAAATCGATAA
-ACTTTGATAGAATTTTGTTCATCAAAAACCGATAATGTCCGAAAAATTTC
-AGAAAATTAGATTTTTTTAACAGTCCGTTCATTTCGTGGCCTAGAAACTT
-ATTTCTAGGCCATGGAAGAGTTTTTCCAAGATTCACGGCCACACGTACAC
-TTGCATGCTAACAATTGCGACAGGCTTATTAGAAGTCGAAGATCTTCGAA
-TTTTTCGCGACAGATCCGACACTGTGAGCTTTGTCCCGCCGAGTTTTTCG
-AGTCCTGATGTTCCGATTTGCCATAAAATTATATTACCATCGTCGGAGCC
-TGATAAGAGCCCGTGACGACACATTTCTAGGCAAGTTACTGCTCCGTCGG
-TTATCTGGAATAGAGAACATTTGGAACTTGTCGATTTTCAGAAACATTTT
-ACTGTACTTTTTTATGGGCAAAACATTGTTTTTTTTAATTAAACAAAACT
-ACTGATAATTGTAAAAAGATCAATTTTTTAGTGTTTGAAGATCATTTTTG
-AGTTCTCTAGCTACAAAATAAACAATTTTAGAGGAGTTGCAAAATTGTGA
-ATTTTAAAAATAAATTGCACAATTTTGCCACTTTTTAATGGTTTTTGATG
-GATTAAACCTAGATTTTCTGAATTCAGCATACATGAATTACCGCTTTTTG
-ACAAAATTAGACAACTTTTTATTTTTGTCCAATTTTTTTCAGCCATCTAA
-TGACTGTCCTTTTTTTTGGGCAAAAAAATAAATTTCCTAAAAGCGTTCGA
-AACTACTATATTTTGAAATATTTTGAAATAGGACATTTTTTTAGGGCTCG
-GAGATCAATTTTAAGTTCTCTAGCTACAAAATGCGGAAAAAAATGTAAAA
-AAGTTTGGTACTTGTGTATTATACCCCCGCCATTTTAAAAATTAATAAAA
-TTTCCATCAATTTATTTATTTAAATTAAACGTGATACCATTTTTCCTTGT
-TAGGCTTAGGAATGGTTTTTTCCTAAGCCTGAAATTCCACACGTTTTTAT
-TTAATGAGTTAAAAAATTAACTTTTAAAATGGCGGGGGTGTAATACACAA
-GTACCAAAAGTTTCTAGGCCCCATTTGCTGGGCCACAATTTATAGGCTAC
-AGTTTCTAGGACACATTTTCCTGGGAACATTTTCTAGGCCACATTTTTTA
-GGCCACATTTTCTTAGCCAAAAATGTACTCACAAACTTAGCAACGTGGCA
-ACAATTTCAAAAAAAACCTCATACCTTCTTCTCGAAAATTATTTTATCTT
-TCGAACACATTGAGATATTTCCAGAAACGTCGCCGAGAATAAATTGGGTC
-GATGAGTAGAAAACTGCAGAAATTGCACAAACCGGTAGAGGAATCGAGAA
-GCTCTGAAATTATTCTTCATTAATTTTTTCATGCAATTTTAATCTCGGAC
-CAATCAGCGTTTTGCCACGTCTTTTTTTTTTCGAACCAATCAGAGGAGTG
-GGCGTGGCTAGATGCTGATTGGTCAGTTTCAAATTTTTTACAAAATATGA
-CCTACCGTAGAAGAAGAGCACAAAAGTGCTCTCGCCTGATGGGAACAGAA
-AGTTTCATGAGAGATACCGCCGAACAGAATTAACGTTTTTCGTGAAGAGC
-TTGAAATCATTAGAATGATATTTTCATTTCGGGTCTGAAATAATTCAATT
-TTAAAGGTACACGCCACCACCGTATCCTACTTCCACATGGTACTTCTGCA
-CAGTTTCCAGCGCAACTTTATCGAATTTGTGAAATTCCAAAAGCCTGTCG
-TAGTTCACCTTAGAATCGTCACGCACGAAATCGTAAAGGAGGTTCAGAAC
-CTAAAAGTTTGAAAAATATGTCCTAGGAAATCAAACTGTGAATTTCTAGG
-CCACATGATGGAAATTCGTATGAAAATTGCGACGAGCCCTAACATGTGGC
-CTATTAATTGTGGCCTAGAATCTGCTGCCTACAAGTTGTGGCCTAGAAAA
-AATGTTTCCTAGAAATTGTGACCATGGCCTAGAAATTTTGGCCTAAAACA
-TCCGACATAGAAATTGTATGGCCTAGAAAGTGTGGGGGCAAAAGTTTTTA
-ATTTTCAATTCGGTTTTTTTTTTCACAAAATGGAGAATTTTTTGATTTTT
-ATGTCTGAAATTGAATGGGAAACGTGGAAATATTGCTAATAACCAACCTC
-TTTGCTAATTGTAATATCCTTTTTCACATTCTCGCCGACACCATTATCCA
-CAGAATCCGTCTGAACTTCTTTATTTTCTTGAAAATTTGCCACGCATTCC
-ACGTCTTTTTTATTTGTCTCTATCGTCTGCGTCTCCGACGTCTTATACAC
-TATTTCTCCCTGAAGGCGGATAGGTTTTCTCCACGTGAACTGGAATAGTG
-TGACGTCTTCCATTATTAGCTGAAAATTTGAGTTAAAACTGCTCTATCAC
-ACTAAACACGACGACACTCGTGGCCGCGGAAATTAGAAAACTCGGCCACG
-TAACTTGGTTAAATTAATGAAAATATTATAAAAAACTTTCGAAAATTTGA
-AACATTTTAACTTTTTTTAAAAAAAAACACATGCAAATGTTCCTAAACTG
-GCTAAATAAACAACGCACATCCCCGGCGGAGCTCTGGTTTTCCATGGCAA
-CCGAGAATGCGTGCGGGCCAACGGGGAGAATGTGGAGTACGTAGAGACGC
-AGACAGTTGTATAAAAGGGGCGGCAACTTGAAAAAATAAATTTCTAGAGA
-TTAATCCGTGCAAAGTTGTTTTTAATTACCGATGACCGAGTATGTGATTT
-TTCTAGGCCACGGAACCAAATTACGGCGGAGTTCCGTTGAAAATATCGCT
-TAATTGTTTTGTTTTTTCTACCAAATTAACTGACTGAAAATCCAGTTTTT
-TTTTTCTGAAATTAGGTTCTTTCAAAAATCACCTGAGTGTTCCTTGATTT
-GTTTTCGTAACTTTTTTCTCTCCAACTATTACACTACGGGTGTTTTGACA
-ACACAATGGAAAACATGTCTGTTCAGTTTAAAGACTGACAAGAGTCTCGT
-AGTCTCTCGCGGACTAGCTTACGGCCCTTGTGGTCTAGAATATTGAAAAA
-CTTAGTTTCAGTATTGTGGCCGCGAAATTTGAAAACTCGGCCATCGATTT
-TTTTTCCCACACCATGGGGCAATATTCACTAGACCATTCATTGTAACAAA
-TATTTCAAAACTAAGAATTAAAAAAACTCCTACGCAATTTCCCCAGTCAC
-TTGGCGGCTCTCACGCTCCCTATTTCAGATGTTAACCTCATTTGAATAAA
-TTGCTTCTCCCATGTGTTTTTGGATGGGATACTCCATCTTTTTCAACCAA
-TTTTTTCTCCTTACTTTTGTTTTTAACGGCTTTTTTTCATATTTCTGATT
-GAGAATAGGTCAAGTGATGACGTAATAGAGCGCGTGGAAGAGGAGTGACG
-TCACACGTGGCCTAGGAATCTCTGCGACCACCACATGAAAAACGTTTTAT
-TTTCTAGGCATCCCTACCTACCCGTGTTTTGTCTCTATTTTGACAATTTT
-TTGCAAGTAAATTCCCGGCTGAAACAAGGTCACCGCAACACAAAATAGGT
-GAAGGGATGATCTCTTTTTTTCCAGAGTCAGTCAACATACATAAATTATG
-TGTGTCTCTTCCATTTTCCTGTCGTCAATTTGTTCACTATTCGCTTCACT
-AATTCCTGCTTTGCATTTTAATGTCCGTGCCCTCTCACTGGAACTGACAT
-TTCACACAATGTTTTTTTCGGTGGAAAAAAGTTTTCTAGATTTTGATATT
-TGCTGGAAATTTGGAAAATTTAGCGACTTGACCGTGCAAAAATTTTGGTG
-GCCGAGTTTTCTCTTTGCGCGGCCACGTTGTAATAGTTGCCAGGTGTCGC
-AAGTTTTTAAAATGACCGAGTTTTCTCTATTCACGACCAGATCTCTCATT
-ATAGCCGACTTCCGACTTGCGTAAAAGTGCGACGTGGCCGAGAAAAATTT
-CAGTGGCCGAGTTTTCACGCGAAATCACATTTTTTTAGTTTTTTGGTACG
-TGGCCTAGTTTTTTAAAACCATTGTTTATCTCCACCCAATCTAAAAAAAT
-TTCTGCGGATTTTTAAACCATGGCCGTAAAAAAAAGCCACTCTCATATAT
-TTTTTCGACACCTTTCGGTTTTAGAAATATATTTTTAAAAATAAAATAAA
-TGGCTTTGAAATCCAAATAGAAATAATTTTCCAAAAAAAGTGGAAAATTT
-TCTAGGCCACTTGAAATTTTTTCCGAGATCTTTTTTGGGAAAGGAATTTG
-TGGCCTAAAAAACAAAAACTCGGCCACTATTTTTTGACCATTTTTTCCAT
-GTGACGTCACTTGTGACTTACAATTCCTTTTCTCAATTTCTTATGAGAAA
-TCGCTTTTTTTAAGACTTTTTGTGATTTTGTTGCATTTTCTCCCAGTCGG
-AGATTACGCCACGTGGAAATAGTAAACTCGGCCACACTCTTATAATTTTT
-TGGCGTCTTTTGGGAAAAGTAACAAGTTCAAACAATGTAAATTACATAGC
-CTAGACTTAGCTGACCAAGGCTTGTTTGAAATATTTTTGTGGCCTAGAAA
-AATAAATATTCGGCCATTACTTTTTCTTCTCATTTTTGTCAGAAGACGTC
-ACTGAAAACCTAGAAATCTCTCTTCCAGGGCTGCAAATGAGTATATCCTC
-CATACCTTCGTCACCGTCAATATCGGGATCTTCCACGTCATCGACCGCGC
-CGAACATTTCATTTTGCTATACATGGACCACTAAGGTAAGCGGCCTAGAA
-AAATAGAAAGTTCGGCCAGCTCTTAAAAAATCGATTAATGATAATTTTCA
-GTTAAAAACGCGAAAAACTGCGGACGGCGAGGCGACGATTTTATCGATTT
-CTCCGAAATTCGCGACAGTCCACCAACTTATTTCGTTTCAATGGAATATT
-CGAATTCATGCCACTTCTGAAATGGTAAGGCTTGTTTTTTTTTGAGGTAG
-GCAGGCACGAAAGCGTCTGCTTGCTTTTCGAAAACACGTGGCCGCGGACT
-GAAAAACTCGGCCACCAAAAATCTGAAACTGTGAGTCGCCCTGACAGAAT
-TTTTTATTTTCTCGGCCAAACAGCAAAAGCCGACAAGTGAAGTTAAAAAG
-GGAGGAGCATTTTTTTAAATAAAAAACTAGACTCCTAATGACCTCAAAAA
-TATCATATTTTTAAATGTAAGAGTCGGCCACGTCCGCGGTCGATTTACAC
-AGTGTCGCGGCTCGGTTTTCATTAATTGAGCACTGAGAAGTTTCACTTCT
-CCAATTTCAATTTTCAGAACGAAGAAGACGAAGAAGTGGACTACGTGGCA
-GTTGACCTTTACCTGGTAGATGGTCCTGTAAATGAGGTGAACGTTATGGC
-CGAGGTGGGGGCTCTAGAGAAAACATCCACAGCAACGTTGGGAAGCCTTC
-CCGCAGGTCAGAAAGAAGCAAAGACTATAAAAATGCAAAAGGGCTCTGGT
-TGTGAGATAACGGATGCAGATCGAGAATGTGTGTCGAAGTATTTGAAAGA
-GAACGTGGAGAATATCATCAAAATCTCCATAATTATAAATATGGAGACAC
-GACTTTTCGAACCATCAACCTATTTGGATGCAATATCTCCAACTCCTCGA
-GCATCATTTCTAACGGCAAATTACAATGCGAGAGTTAACAGTAAGGTATG
-GAAAAGGCGATCACGGAAAAGGAATGGAAGAATCGAGCGAAGAGTGTTAA
-GTGATAAAGAGAAGACGAAGTATGAGAGTAAAGTACAAATGATATTGGAT
-GAGGAACGGGAGAAGCTGTGTGATAAACGAGAGATGTTGAAGGAGGATGA
-TGGTGGATCGAGAAGAGCTTCGTTGATTTCTCAGTTCAGGGAGAATCAAC
-ATGAATCTGTGTTGGATGATCATATGTTCAAGAGGGTAAGGTTTTTATTT
-TTAATGCCTAAAACTTTGAGATTGAGGCAGTTCAATAGGCTATATACATA
-TAAGTGTGGACCCAACAAGTTTGTTACATGAAGTATTTTTTCCAGATCCT
-CGTTAGCTGCTGTGAATCTTGCGAGCAACGTCGTCTATCGTTCATGTGTG
-ACAGTCGAACCGAGGATGATTCTGAAGGGGAAGATTGTGAAGACAATGAA
-GAAGATGATGGAGAAGGTGGCTCCGATGATGAGGAAGACGATGGAGAGGA
-GCCTCATTTTGAATGTGATAAGAGTGATAAGGAGCATGTCCACGATGTAG
-GTCTCCTTTAAAATATCGTCCATAAAAGCTTAATTTTTTAGATGCTAGCA
-AATCTATACTTCAACAAAGTAGTCCTTCCCGAAATGGAATATGTCGAGGA
-TTTTGTGGATTTCCTGATTGATGCGGAGCTCAATGACTTGCCAGTTCTCA
-AAAGAGCTTGTGAGAGGTATTTGTGCAGTGAGCTGAATTCGGTAGGCTTC
-TGTTCAAAAAAATATAAAAATCTAATCGAAATATTTTCTAGAAAAAAGAC
-ATTGGAACTTGTCTCCTGTTGGATTTGCTTTTCAACTCGATTGTATTCAA
-CTTGCCTGTTATGAAGTCGATGACCTTGACGGAGTTGGCGAATCGAACGC
-ACGAGTTTGTGGATGCTGACACACTTTTGGATCAGGAAGAGTTTAAGTGA
-GTAGGGTGTGCGGCAAATTTGCCGAATTTGCCGAGCACGGCAAATTTCAA
-AAAAGTAGATTTGCCGAATTAGCCGAGCTCGGCAAATTTCGAAAAACTTA
-TTCATAAACCAGCAGTGTGTAAAGAATTCAGTAGTTTTGGTGCTCCAAAA
-ACATTAAAAAATATCAAATTTTTTCGAGTTTGTCAAGCACGGCAAATTTG
-CCGAATTTGTCGTGTTCGGCAAATATTGGAAAAATAGATTTGCCGAATTT
-GCCGAGTTCGGCAAATTTTGAGATTTGCCGCACACCCCTGGTGTGCACCG
-TTAAAAATTCTTTTTTTCCAAAAATCTAAAACTTGAGGTTAATAATGTGA
-CCGAAAAACTGAAAAAAAAAAGAATTTGCCGCTGCAAAACCATAATCCGC
-CAAAAGTTTTCTTTGTTTTTTTTTCGAATTGCAGGGTTTCCGAATCTGTC
-AAAATTGGAAACACGACAGTTTGCCGAAAAAATTTAATTTTTGAGTGAAC
-TGTTGATGCGAAATTCATTAAATACGATTTCAAAAAGCTCGGTCACGTAT
-TTGTAATTTTAGAGTGGGATTAGCTATTTAAAAATTACATTTGTAATTTC
-CAGAAACCTGGATAAAAGAATGCGAACGCTTGCCGATCGGAATCTCGTGG
-AGCTCATCGAGCAATGTGTTACGTTTCGTGACCAAAAAGCAAGAGTTCGC
-GTTTTGCCGACCGCCGAATCATTTGATATTTCGTTCGACTTAACTAATCA
-ATAATATTATCGTGTTACTTTTTTCCTCTGTTTTCTTTCTCATTTTTAAA
-AATGAATGCTTTTTTCTTTTTTTTTACCCGATTTTCCACACGACTAACTC
-CAAAATCAGCCGCGCCTTTTTGTCTTTTATCCCTGCTTTTCCACACATTT
-ATCAAATAAAGAGTGCAACGAAGTGCAAAATGGGAAGTAGTAGTGCTGCA
-ATCTCATTTAGAGTACACTTTTGGAGCTCTTTTCTCCAGATATATTATAT
-GCTGTAGATGGAAACTTTTCCAGTTTATATATAATATTTTTCATTTTCCA
-TATTGCCCTTCACTGCTCATCATCCAATGGGGTGCATCTAATTACGGCAA
-AGCTTCGCGGATGGGGCGAGTAATGAGCAAAAGAGCACAAGGATGGGGCT
-CTTTTGTTCCTCATTTTCATTGCTTTTTGATTTCATTTCCTTTTCAACAT
-GTTTCCATTTTCGAAATTAATCGGCTTTTCTGACCCAGGACTCACGGGAG
-ATGAAAATTAATCTTTAAGAATTGTGCTTTGAAAAACAATATCATACACT
-TTTCAAACTTCATTTCTCCGTTGTTCCCAGTAAATTCCAAGCTGTCATCC
-ATCAACTCTCTGATAAAAAATAATCATTTGGTCCGTCCGTCGCGAAAATG
-AAGTGAAAAAAGTTAATCCCGGCATGTTGAAATACACATTTCGTCGCGTG
-GAGTATAGTTATGCTTCGATTTCTCAAGAGGATTCTTCTTTCCCCCTTTT
-CATATTTTTTCGGGCAAAGAAGAAATCTCTGTCACCCCCCGACTAAAAAA
-CGCTAAAAATTCAGCGTTCATTGTTCGGTTTTCCGTTTCAAAAAGAAAAA
-AGTGTGTCAAAAACTCAAAAAGTCACCGCCTAAAGTTAGTTAGCACCTTT
-TTCCATTGTGAAGATTTTCTTTCCTTCAATACAACTACTACAGTTTGTTT
-CCTGTGTGTCGTCCTATTGTTGTGGGTGTAATTGTTCGATAGAGCGCGCT
-TTACAAAATCTCTCGAATTAATTGAAAGTAGTGTGTTGTAGAGACCTTGA
-CTCCTTTGTCAACACTGTAATTAGGAAGGAGTACACCGCCGGGCGGGTGA
-GAACAGTTATTATAACGATAGTGGTTTGTTATTGTTTGTTATTAATAGGT
-TAGTTGTCTACTTTAAACGTTTTTTGTTTGAAAAATTTCTGTTAATTAAA
-AAATACATAATTTATAAAAATGATGAGTTTTTTTTTCAAATTTCTCAAAA
-ACCGAACCCATGGGGTTTTTTGAGAAAAAATAAGAAAATTTTTCTAGTTA
-TTCAAAAAATCTATACATTTTAATATCTGTAAATTGTAAATTTGGAAGAC
-AAAATTTTGACAATGCGTATTGAATTTGAGTTTATTTAACTTAAAGAAGA
-GAAATAGACAAATAAATAATTATATATATTGCGCAACATATTTGAATAAT
-ACATTTATTTTTCGTAATATTTATTTTGAAAAATGATTGAAAATAAAACT
-CGAAGAAAACTATATTTAAAAATGTCGGTGCTTTTTTTACATTTTTTAAA
-CGAAAAAAAATGCGAAAAAAACCAATTTTCCGAGTTTTTTCTTCAAAATA
-TTCGTCCCTGTTCATGAAAAATGTTCTCACTTATGTAAGTAGTTGTCACG
-CAATGCAGTTGTTGACCAAAAATTATTTTCCGAGTAAACCCTATAATTTC
-CAAATTCTCTTCTTCTGAAATTTTGAACTTTCCATCGGGAAAATGTCATT
-TCAACTCGAATTCACACTAATTATACATCTGTATAATTATTTAGATTCGT
-ACTTTTTCCTCCTTTTGAAAAAGTGCACAGACACCGCCGTTATCTTTACA
-ACCGTCTGGCAGGACCGGTGTTGTAGGCTTTAAATAAATATTTTTCCATA
-AATTTCTTAATTTTTAGCTGAAACGATTTTCCAACAAAAAAAAACGCACA
-TTTAAAATGGTTACCGTATTTCTTCTATCAATATGGCTGCAATACTATTT
-TTCGATGGTCTTCCCGCTTGCAATACTAATAGGGAGTGCAAGACTATTAG
-GGAGTGCAATACTAATTTTCAGAACATTTTTCTGACTGTGAGCTTACTAT
-TTTTTTTTCTGAAAAAACTCGAACCTTGTGTGAAAATTCAGAAAATTTGA
-TTGTAATTGCAACAAAAAGGTGTAATTACTTCAATTTCATAGAAATTTTT
-CCAAAAATTGTTGCACAGTAGGCAAAAAATGTTGTTAAAATCTCAAAATT
-AGTGAGGTGATTTTGTACCAAAAAAAAAGTAGACGCAAGACTATTAGGGA
-GTGCAACACTAATTGGGAGTGCAATACTAATTTTCGGAGGGTGTTCAAGG
-AGCAATACTAATAGGGAGTGCAAGTCTAATAGGGAGGTCATATTAATAGA
-AGAAATACGGTAAATTTTATATTTTTCGGTGCATTTTCATTTTAAAAACA
-ATTTGTTTGAAAATAATTATTTTTAAAAATCGTTTTCTTCAAATTTTTTG
-TAATTATAAGAAACCAAAAAACCTTTATTTAATTTTCAACAAGTGTATTT
-TCTAATTAAAACAATTATGAAAATTCACAATAAAAGTTCAGGACTGAATC
-CAAAAAAACTTTTATTTCAAAAACGAAACACCTTGTTTGCCAAAAACCTG
-GAAAAGCCTGGAAACCTGGAAAATCGAATAACATCAAATTTTGCAAATTT
-TAAGCGTTTTCTCGAAAAAGTTGACCTGAAAAAATAGGATTTTTCAGTTT
-ATTTTATAAAAAAGCGAAAAAAAGCAAATTTTTTGAGAAAAAAATTGCCT
-AAATTTTCGAAAAATCATTTTCAAAACTATTCACGATTAAAATTCGTTTA
-TCCATTTCTCCTTCAATTCTTCCAGATTCGAATGAAAACTTGCTCAGAAA
-AAATGCTAAATTTGCTCTTTTTCGTATCCACTACTACTGCTACTACTAGT
-AGAAGTTCTTCATTCGGTGGCCGGACTACTTTGAATCAAATCACATTTGT
-CGGGAAGAAGGAGGTCGTGCCTTTGCACTTCTGGTCACTCCAGAAATTGA
-AGAAATTGAGCAGCTCGAGTTTTGGAGTATTCCAGGCAACTCGGTCGTTT
-TTGAAAACCTATTCTATGAAAACTGCAAACTATGTGGCTTCATCTGGTCT
-GGCTGGAATTTTTTGTTTCAAATTTTGACCCAGTACCTTGAGAATCAACC
-AGTTTTCCACGTATGCTAAAATCCGAAAAAGTGACTCACACGAGAAAGTT
-TCAATTTCCGTGATGACGTTCGCCTGGCTCTTCAGCTCATTCTTTTGTCT
-CCAGAGCTCTGGGGAGCTGCAAATGAGTTGAGAGCAAGCACATTGCGTGA
-GCAAGATAGCTCCAAAAGATATGAAGAGAGCAGGCGGGAGATGAAATTGG
-ACGATGAAAAGTCGCCAGAAGCATAATTTTGGTGCGGCGACACCCGAATA
-ATGAGACATTTACGACTTTTTGGAACATCTTCTACGGCCAGAATGTTTCG
-TAACATTTTGGTAATTTGAGTTGTAGTTTTGAGGGGCTTTTTTCGATTTT
-TAAATTTGTATTGACTCTTATTCGCAAAAAAAGAGAACTGCTATAGCACG
-TGTAGTCAAAATGTCTTTTTGATCTTCAAAAAATGCGGGAGTTAAGACGC
-AGACATCTCATCTGATTCGCATGGCTAAGAGCGTGCTGACGTCACAATTT
-TCTGGAAAAATATTCCCGCATTTTTTGTAGATCAGGCTATGATGTGTGTG
-TTCAATGAGACAGCCTGACACGACGTGATGTAGTTCACATTTTTCGGCAG
-TTTTTTTCCTGAAAAATGTGGATTTTCGTTTTTTCTTAAGTTGTCAAATT
-ATCGAAAGCTACTAAGCTTGAGTAACTTAGGAAAAGTAGGATTTTAAATT
-GTTTTCACGGGCCTCGCAACGAAAGATCTCACTACTATCACCAGAAATCC
-AAAAAAACGAAAATATTTGTCGTGCCGAGCCCAGGCTCCGTATTTTTGAA
-GCGAAATTCCTAAACTCCCTAACCGCTGAAAATTTCTGAGTTGATTTTCC
-ATCACCTTCTATATACAGTCTTTCGACCCGAAAACGATTTGAATTCGGCT
-TTCTCCTCAAATCCTCTGTATTGCATCCTCTTTCTTAGTTGATTTATTTG
-TAGCGGATTCTTCCCCTTCCCATCCGTGGCGTTATTGTTCGGTTACGATA
-CGCTTCTTGTGAAGGTTATATGCAAACGACTACTTGCCATTCGATTCTTT
-CTCCAAAAACGGGTTATTCCATTTCCTTCAACTAAGGAGCTGTTTTTTTC
-TTGGTTTTTTGTAGAAAACCTACATTCAAAGTCGAAGTAGTGAAAGTCAA
-AAATTACCAAATTTCGCAATTTAATTTTTAATAAAATGTCGCCCGAATTA
-ACGATAAGTTAATAAGAACAAAATTCAGTTAGTCCGAGAGTCGTGATTTG
-CCGATTTAGAACAGCATTTAGCTGAAAAAAACGATTTTTTTCCAAAGTTT
-GAACTGCCACTACATTTTTCTCAAGTATTGAGAGTTTTGAATTTCCATCA
-TTTAGTTGTAACCACACTTTTCTTCCGATTCCCATAGCAAGCGAAAGTTG
-TCTTGTTTCCGAATATCTGACCTAACTTGGTTTTTTTACGACTGATGCCG
-AATTTTGAAAAGTTTATTAGAAACTTTCCACGCTCTCCCCTTTCCAACCT
-CGCAAACCCTTTTGTCTGTAGTTGGGATCTGTTGCTTTTTTGGGCAATTT
-TTTGCCAGCTTGATCTACATATCATTGCTTGATCTACATATCTTGAGCAA
-AATTCCAAAAAGTACGTTTTCTTGTAGATTAATTTGTGGGTTTTTTTTGA
-GAGTTTTGAGCTAAAACTTGCATGGCATATTTTTTTCACTGTTTTAAATC
-ATTTACAAATTATTTTTTCCTCTTTTTAGAAAAAAAAAATGTTTGTTAAA
-ATTTTGGAAAAATTTCAAAAAGGTGTTTTATCCACTTCCAAAACGTCATA
-ACTTTGCTGAAACTGGACCGGGGCAGCTAAATTTTTCGGAGTGATCATTA
-TTTTCACTCTTTTATCGAAAAATTACTATGGCATGCCAAGCCCGGGGACC
-CATTTTTTCACTTCCCTTGTAAGCCGAAGCCTTAGTCTAAGTCTAAGCCT
-ACGACTGAGCATAAGCCTCAGCCTAAGCCTAAGCGTAAGCCTCAGCCTAA
-GCCGAAGCCTAAGAATAACGGGAAACTTTTTTTGTTGCTTTTTTTTGTTT
-TTTTTCAAATGCCGAAAAATAATTGCGGCATTTGAATTATGACTTTGTTG
-TTCCTAGAGATTCTGGTTTTCAAAATAGGCAAAAATGCCATGAACCTTAA
-CGATGTTCTTTCTCCCCGCCCTTTGAACACTCTGAAGTTTCCCGCCATGT
-CAACCTTTTTTGATCGTTCGGCACGATAACGTTCTGAGTGCCGCGGTGCC
-CGTTAATTTCCATCGAATCGTTAGGTTTTCTCCTTCGATTCCTAACGATC
-AAGCCATAATTTATCCGCAAAATGGGATTTTCTCCCTTTTGTGATGATGA
-TGATGATGGCCTCCCTCTTCTCTGCGATGACAGTCGAGTGATGAATGTCT
-TCCTTCACACTTGTCCGTTTATCATTTATCACTCTGTGCTGAAAACCGGT
-CTCTCTCTTCCCCTGACCTCTTCGGCTTTGTGAAACAGTGAAAGAGAAAC
-GGAAAACAGGCGGTGTCAGATGGTTGACACGTTGATGTCGTAATCCATTT
-AGTATTAATGCTACTATGTACGCCATTTGCTATATATGCCCATATTTTCA
-ATGGCTTTGAGCACAAGCTTTCAGAATTGGCAATCAATTTCTAAAATTTT
-AAAATTTTGAAAACCAATATATGGGTGGAGCCTATTTCTTAACTGTTCCG
-TAGTTACCGAAAAAGTCGGAAAGCGCCGATTATCTAATACTTTCGAATTC
-GGCAAAACTGAAATTTCTTCAGATTTTTATGATTTTGAGAGAAAAAATTA
-TATTTCTTTGCCAAAAAACATGTATTACTTAAAATTTGTTTGTTTTATTA
-TTTGAGCTCAATAACTATCAAATTGACAAACAATTCATTGGCAAAAATGC
-CGAATATCGTAAATTTGAAAAAATCGGCAATTCCCGAATTGCTGCACACA
-TCTTGGTTTTTTGAGCTAATTAATTGAATTTTTAAGAACTTTTATTTTGG
-TAATCTAAATTTTAGTTACTGAATTCATTGCGAAAAAAATTTCTTCAGAA
-TAGGGCTTCCATGTAGGCGTCAAAAAGCTTGCCAAACCTTAAGACGACCT
-CCGCCTGCCTACCTCAATCTATGTGCTGAAACATATGCGAACTTTTTTTG
-CAATTCTTGATTTGGTTTTCATCAAATTGATAGAAATGAGAAAATTTAAA
-ATTGAAAATTTACGCACAAGTACAAAAAAGGATTCAGGCAGGCGTCAGGC
-CGTGAAACCCCGCCTGCTTACCATGGAAGCCCTACTGCAGAAAATGAGAA
-ATCTGATGTTCAAAAAAAAAAAGAAACCAGCCGTGTTTTTCCTTGAAATT
-CGAAAAGTTCCCCGATTTTCCCCTCATTTCCGGACCGTTTGTTCCCATGG
-TGGACCGGTATTTTCACCACTCCGTCAAAGGCGATTATCGGGTCTGTCTG
-TCGTCGACGACCCATCACACCAAATCGGTTGAATTGTCGCACCCCTTTTT
-TAATCGGCAATATATTTACTTTTTATTTGTAACTAAGTAGTAAACAGTAA
-TAGTTTTTGCAAGAATATGCATAACACCTTATTTCACTTGGTAAAGTAAT
-TGAACTGTTGTAATTGAGCTGAACATGATTCACCTACGAAAAAATGCCTG
-TGACCTAGGGCTTGCATGTATGCGTTAAAATGGCTGCCTGCCTGACCTGA
-AGGCAGCCTCCGCCTGCCTTTTGCCGGTTTATGCTAAAAACACGGTTTAT
-GCTACGTGAAATTATTTTTTCATTTTTAATTTGATTTTCAACTTTTGAAA
-TTTGAAAATTCACGTCAAAATGCAGAAAAGAAGGTGAGGCAGGCAGGTTT
-CAGGCAGGCGTCAGGCCCTGAATCGGCGCCTGCCTATCATGAAAACCCTA
-CTCTGAACTCGATTTCGCCCTCCAAACATCAATTTCCGTCATTCTCCTTC
-CGTCCTTTTTACCCACTTTTTTAATGAATTTGAAATGAGTAGTCGAGGGA
-AATTTAGTGAACCTACTAGAAGTCGCCACGGTTTTCAGCAGCAAATTTTT
-TAATTTCGTAGAAATATGTGCTTCTGTGTTAAAATTAATAATAGCTAAAC
-TATTGGATAATGTACTTTAAGACGTGCAATGTCACTCCATATTTTATAAA
-ATGTTGAAAATTTTGGAAGGGATCGAGGAAGTTTTGATACTTTTTAGAAA
-TCGAAAATTTTCAATTTCCGATTCCCTTCAACATTATATACCTCAACAGT
-TTAATAAGATACAAAAAATCTTCAGAGAGTCATCTGTTCGCACACAGTTT
-TACCCCTATCAAATTACAGATGTGTTGCCTTGCACATCTGTGAGAACTTC
-ACACTATTCTGCTACAACAGATTTTCGGAACAGAAGGTGTGATGTTTCTA
-CCTGACTATGAAGATTCACGTGGGCGGCAATCCAAATTTTTTGAAATTTG
-GAGATTTTCGAGTTATCCATAAAAGATTCCGTTAAAGAGAGATCACAATT
-TTTTTTGTAGATTGACAAGAAAATTACCCCAACAATACTCAAAACAATTG
-TAATTACAATTGAATTATTACTTTTCAATTCTTAATTTTTTAAGTGCTGA
-AACTTTTCTATTGACGTTAACCCCTGCAAAAATGCAAAATTGATCAACAT
-CTAGTAAATCTACTAACAAGGGAAGTCTTTGAGGGGGTCCGTAGATTTGG
-GGTTTTCATGCTAAAATTCCTACAGAAGAGTGTTAGTTATGATCTCTCCA
-AACATTTTTGCGCATTTTTAAAGTGATTTTATTCTTATTCGGGAACCTAG
-AATCATTGTCCGCACTTTTTGGAAATTTTTATTTTTTTCATTTTTGCTCA
-AAATTTCTTGATCAACTCCAAGCAAAAAAATCAAAGTTTTTCAACAAACA
-TTTTGTTAGTTGATCATTTTTCAAAATAATTTATCTCAACGAAGTTATGC
-AACTTCAAAGTTGGTTAAATATTTTGCACAAAGTTCGTGAGATGTAGATC
-ATTTCGACGGTTTACTTGCGAATAGAGAGTTAAAACTTGTGTAATGTACG
-TTTCATACATTTCTGAACAATAAAATAGCAATTTCATACATTTTTACAAA
-AATAAAAAATTTCCTATTTTTGCTTGGAGTTGATCAAGAAATTTTGAGAA
-AAAAATGAAAAAAATAAAAATTTCCAAAAAGTGCGGACAATGATTCTAGG
-TTCCCGAATAAGAATAAAATCACTTTAAAAATGCGCAAAAATGTTTGAAT
-GAGTTGTTTAAAACTTTATTCAACTTACAAAAATATTTCAAAAATAGAAG
-GAATCGAACCAAACCTTAAATATTATCAGACGCGCGCACTCCCAACTCGG
-CCACCGAGGACAATTTTCAACTCAATGTGGTGGGTGTCACATTTTCGGTG
-GTCACGCAAGCTGAGATTTGCGTGGACTGCATGGTAAGACAGTGGATTTC
-AATGGTGTTTTTAACTTTCAAAACGTCATAACTTTGCTGAAACTTGACCG
-GGGCAGCTAAATTTTTTGGAGAGATCATAACTAACACTCTTCTGTAGGAA
-TTTTAGCATGAGAACCCCAAATTTACGGACCCCCTCAAAGACTTCCCTTG
-TAAGTCAAACAAAAATTCTGTATTTTTCAGAGTACTATACATAGTATATA
-TTTCTGAAATTCTCTCAACAAAATCCTTTCCCCTTCCTCATTTTCCCACG
-TAAAGTAAAGTCAAAATACATTTTAATTACCATTAATACCTAAATGAACC
-AAACAGGTCGGTCTTGCCCTCAATTCTACCATTTAGTCTCACGGCTTTTG
-TACTTGTTCACCCACTTCCCCCATTCTATAATCCAACCACACAACTTTTG
-GCAACAAAGTGTTCAATCGAAATGGGACACTATTTGCTATTCCTATAATT
-GACAGGCTGGTGGAAGGAGGAAAGCAGCACACGACGAAAGGCATAAAACA
-ACTTGGCGTTGTGTTAATCCCACCCGTATTGCATTCTATATTAGGTCGAC
-AAACAGTTCATTCATGTCGATTTTCGATCATTTCTCAGAGTTTTGCTTCG
-AATTGTAGGTTCATGGAGTTAGCCATTCTGTCTATTTTTTCCGCTGAATT
-TTAAGATGTTTAATACTTATTTGCCACCTTTTCGACGGAATGACATGTAC
-CGGTCAAATCTTGGAATCGATCTAAGAGATGACAATTTTGAATGTATATA
-CTCAAAATGGGCTCAAATGAACGAATTTCGTAATGAATTTTTTAAAAACT
-TTTTTCAAAATTTTTTATGGTGGTTCAAAGTTTCGAAAAAATTGACCGGT
-ACATGTCATTCCGTAAAAAAAAACGCGCTTCTATCTGAAACAACAATTTT
-TTTGATAAAAACTTTCAACTACAAACTTGTTCTTTACAAAAAGATCAACA
-ATTTATTAGTTGAGCACTTTTCTGTACAAAAAATTATCCGCGCAGATATG
-ATCTACCAAAGTGAATTTGGAAAATTGGCCCGTCAATGCTTCGTTGCAGT
-GCTATTTTAGGATCTTTGAGAGCTCGCCGTGAGCTTGGCTCTGGAGATTC
-GCAGCTAAAAAGGAGTAACCGTTTCTTTAGGAGTAACCGTTTCAAGACAT
-GGGCTATCGAATGGCATAGGTCTCATATGCAAGTCCGATGGGCACCTTCT
-GACGGTTCCCTAGTCAGATAGAAGCCAAAATTTGGGCGAGGTATGCCCAT
-TGTCATTCTAACTGTCGAAAAAGTGGCCTCCGCCAAGACGTGATAACTAT
-TTCTCTCAATTACTCTGCACTCCCAATAAATCCTACACACCGTTTGAATT
-GAGTCATTCAAGTGTCAGTTGTTCAGTTTCTAGCAGTTGATACGTGTGTG
-TGTGTGGTGGTGGTCAACCAACTGTCGCCCTTTTGAACACACACACACAC
-ACATACTTTTCCTGCCATATTCCTCCCCAAGAAAGAGAGAAAAATAAGTT
-GCATCTTTTCTTTTCTATATCTCTATCCACTAACACACCCTGTTATTCGC
-ATGTTCTCTCCATTCTCCAAACAACGCAATCAGTGTCCGCCTAAATCTAC
-ATAATCGATTCAGGGGGAATTAACTGTGTAGTTTTGTAATACTTTTCCTT
-AAGGTTCTTGAAATTTTATATTTATAACCGACCGATTATGCCTAATTATA
-ATTATAATTTAGAGAATTTTTCAATTTAACAACTATTGCGATGTTTTGAA
-TTTTTGATAAAACCGGAGTATTTTTTCAAGAAATTCTGTTTAAATTAGCT
-GAAAAATTTTGATTTACTAGTTTTTGGTTTGCCTCAAAAAAAATCGGTAA
-AAATTTTTTGGGGCTTTTTTCTCAAAAAAAAAAAAAGAACGATTCAGGAG
-ATTTTTCATAACTTCGAAACTTAGTGCAAAATCTTTTACGGGGTGTCGAT
-TTTTTGATATTCGAAAAATCGGGTTATTGCTCTATTAAGAAAAATTATTT
-CCTGGACATATTTTCTGAAGAATTCCTCGTCTTTTCCCATTTTTCTACAA
-TTTTTCCTGATTTTTCATAAAATTGAAACTTTCGCTGTTCAGTTTTCCCT
-TCAAAATGAATTTTTTCGACGACGAATGTTCAGAAAGTTAACAAATAATT
-TTAAGATTTTGTCAAATTTTCACACACGTACTTTTCCACCAAAATTGACA
-AAAAACCCTAAAATTTAATTTCTAAAATTTTCAAAAAATCGTGATCCATT
-CTTCCTTATCATGTTATGTCTTGCAAGCGTTGCCTCAAAGTCATCAATCA
-GCTAGTTGTCATCAATTCAGCGATACTTAGAGATTGAAAGAATGAGTAAT
-TCATCCTTGTTTCTTCTTCATCTCCTCACTTCACTTCCAATTTTCCATCT
-GTTACCAATCAATTTGGCCTGGCGATTAGTCATCTATTTGTTCGTCAAAT
-TTGGTGCAAATTGGCTCGTGTCACTGATAAGTGGTTATTTTTTCTTTTTG
-GTTGATAAGGTTACCTGATAAGGTCATTTCCTTTTTGCGCCTTTTTTCCA
-GTAGTAATTCCTCTAATGTTCGTTTTGAAGTTACTAATCGAAGTTGTTAA
-AGTATTAGATTTTTTTAAAATCAATAGGAATGTTTTTTTAATACAGTGTT
-AACAAAATTTTATGTTTTAAAAAGTTAAAATAAATTTTAAAAAATCTCTG
-AGTTGAATTGTTAATTTTTAAAACTATAAACAGCATTGGCATTCATAAAA
-AACAAATTTCGACAAAAAATTCGTAAAAATTGCTGAAATCGCACTAAAAA
-TACTCAAAACACTGAATTTTTTGCTCATAAAATCTGGAAAATCAAGTCGT
-TTTACTTGATATTGCCATAGGAAATTACAAAAAAAAAGTGATTTTATTAA
-AGGCTGGTCAAAATTTCATATTTGAACAACGTTTTATAAAACCGCTGTCA
-GAGTAGAACAATATAGGTGTAAAATGTAGTTAAAAACTATTCTTCGATTT
-TCCTACATTTTTTTTTCTGTAAATTGAAGTTTTCTCGTAGAACAAGAAAA
-TTTAAATTTAAACCAAGTTTTTAAATTTTCAATTAAAAAAAACTACAATT
-TTCGATTTTTAATAAAACATTTTAAATCCCAATTTTTCTTTCAAACATAT
-TTTCCAATGCTGATTCTGAATCCATGAAGTCTTAACACTTCAATTTCAAC
-ATTCTGTTGCAACAAGTCGTCCCATCTGACCAATAACAAGGGCTCATCAA
-TCACTGACGAGGGCCCCCGGGCGCCGCCATCATTTTCCTCTCTTTCTCTC
-TCTCTCTCTCTCTCTCTCTCTCTCTTTGTTTCTAAAAAGAAGGAAAATGA
-GCTGCAATTTATCAAATCCACGGTCTTTTTCCCTCAAATTCTCTGCCTCT
-CTAGTCTTCTCCCTCATGGTCATTGTCGCCACATTTGTGACTCACAAAAT
-GGGCCGTATTATACAAAAATAATTAAAGTTCAATGCGTATGCGTGTGTGT
-ATTTGTTGCTGGGTGAGGGCAAATGCACATTAGCCACCCACAACAAACTT
-ACGTTTTTTTTTTTGTATTTTGCCTTTTTCTTCTTGAAGAATGGTGTCAC
-ATCACATTACGACCTTTTCTTTGTTACGGAGAAAAGAAGATTGGAGCGGA
-ACTGACTGAGGTGTGAATACTTTGTTGGTTTTTTTGGCTATACCTATTAG
-TTACCTTATTTTTGAGAAAAAAAAATTTGAAGCATGTTATTTTTCGAGTT
-GTTGGTAGGATGTTGATAATTACTGTTATCGTGATTTTCTTATTAGAAAT
-TAATTTTTATTTATTTAGTAGAATTGGGGATTTTTATTCAAATGATCCAA
-AATAATCTTTCGACACTGAAATCACGACCATTTTTGAGCCAATCAACGTT
-TTCAAACTCCGCCTACTCTGTCTGATTGGTAGGAAAAGTGGGCGGAGCAA
-ATTGCTGATTGGTTTCGAAGTTCTCGACTTAGAAATACCAGAGTTCATCA
-AAACTGAAATATTGCGTTTTTAAAGGATATATTATTATTATTATTATTTT
-CTCTCGATTTTTTTATTCTGTGGTTGCTCTGAATTTCAGATTATTCGAGA
-TAGTTTTCGATAAAGCGACAGATTGTTCAGTTTCTGAATTTTCCATAATT
-TATCCTCTAAAAGTGAAAGTCAAGGTTTCGTTCTTTGCAAAAAACTCATT
-TTTTTGAGAGTTTTCGGAATTTTGGCTCGCATCACGCTCCAATAAATTAA
-TTCAAAATTTCGGAAATTATTAACTTCTTCCATTTTATCAATACTGTGTT
-AATCTCACTTTTCTAATTTGAAACAAAAATTGAATTTTCATCGATTTCCA
-AAATACTTTACATGCTTGGCAATTGAAAATTAGTTTTGTTTTTCAAATTC
-TCAGTTTCCAGCCACTGAAAACATTGCGAGCCTCCATTGGGTCCGCTCCT
-TCCTTCCGAAACACATTTCCCAGTACTCTTTCCAATCTGGTCAACATTTG
-AAAGGCTGTTGGGGGGTCGAAAGGCAATAAACAACCGAAAAATAGTTTAT
-TCCAATGTCATCGAATCCTCCCTGGCTTCTCATATTGTTGCCAAAAATGA
-TGATGGAAATTGTTTTTCGTTTGTATACACACACATCATCCTGTGCCACA
-CCTTTTCCCCACTCTTTTTCCCGACGAGCTTTTTCATTCGGAAGGCGACA
-CAGATAGCAATTACCGACATATGGAACCAATCGTACTCTCTCCGCTGACT
-GCGACTACCTAATTAACCTTTTATTGAAAAAATGAGAGAGAGAGAGAGAG
-AGGATATGAACGGAAGAAGAAAAAGAGGCAAAGCAATTGTTTACTTGTTT
-TTCGAAACAATTCAAAATTTTGTTTGGGCTGTGCGCCTTTAAAGATGGAA
-AAAAAACGGAAATTTTCCAGCAATTCGTTAATTTTTTTGTCGGCAAATTT
-GGCAAATCGGCGAATTACCGGTTCGCCGATTTGCCAGAAATTTTCATTTT
-CGGCAACTTGCCGGTTCGCCGATTTGCCAGAATTTTTCATTTTCGGCAAT
-TTGCCGGTTTGCCGTTGCCGGAAGTGTTTAGAGGAATTGTTTATGAGACG
-GAAGCACTGTGCCTGTTTGCCAATTAAAATTGAAATTCTGAAATTTCCAA
-AAAAATGTGCACAAGCACCATTTGCCAAAAACTTTTTCAGTTGCCGGTTT
-GCCGATTCGCCGGAAAATTTAAAATCCGGCAATTTGCTAATTTGCCGGAA
-AAAATCGTCTACCGCCCACCCCTCCACCGAATTCGGAAATTTTGTAAAAA
-ATAACTTTATTTTTGGGCCAATACGATACTACTTTTCCTAAAAAGAAGCT
-GTTACAGTAATCAATGTATCATCTTTTCCATCTCGAATGGTACCTGTGTT
-TACCTTAACTGTCACATAACTGTGAAGAGTACTTGAGATGACAAGTAGTC
-TTATCAGAAAACCTCCCCGCTTACTGCTTCTCGGGTGTCGGGTTACCGTG
-TTTGCTGAACGGTTTTTCGTAGGGATTACTGTAGAGAATTGGATGAGTAG
-TTGGGATTAGGCGATTAGGGGGAAATTGGAAAACATGTCTGTGCACTCCA
-TATGTTTCTAATAAGAATCCTTGGAAATTTGCATATAACTCAAGAATGGT
-ACTGGTCCAGTTTCGTTTTGTTATCTTGATTCTTCGAAATGGTGCTCACT
-CAACTTGATTCCATCCCCAGGACGCTAGTTATTTTCGTAATCTCCGCGTT
-CGATCTCGAGCTCCTCCTCTATGGAAATGTTAATTTGTGAGGGCTATCGC
-GTCCACAGATTTATAGCGTCCGTCGTGCGGTTTCGCTGGGTTCTCGCAGC
-CACCCCCCCCCCCCCCCACTCATCAATCGCGTAAACTTTTTGTGAGCACG
-CAGCACACAATGTGCTCAGGAGGCTTCTGTCTCTTCGGAGATCCAACATG
-TGGCACCTCCTCAAAGTGTTCACTGGCCTCCTCGGCTCGGCAGTCAAATT
-TATTCATCTCTTTGGAGATTGGCTCACAATTTTTTTGATTTGAATTCAGT
-GACTATTTATCGATTTCTAGGGCTTCTATGTAGGTTGCCTGTGTGCCTGT
-CGTCTGACGTTAAGGCGGCCTCCGCCTGCCTCTCGCCTCAATCCGTGCCT
-TGTGCCAAAACATACGAATTAATTCGATTTTTATCAAATTGATAAAAATG
-AGAAAATTAAAAATTTGTAAATTCAGACAGGCCTGAGGCAGGCAGATTTC
-AGGCAGGCATCAGGCTCAGAAACCGCGCCTGTCTACCATGGAAGCCCTAC
-TGCTATGTAACGTTTGAGATATTCGGTTCAGATAAAATAAGTTGAAGTTA
-CGCGAAGAAATTCTGAATTTTGAATATTTTCCAATAGTTTCTAATAGTAT
-TTAGATGTTGTATTTAGATACTGTTGCTACAAAATTTTTAGAAAATTCCG
-TGGTAAAGTTCAAAAGACTACTCTTTCTCTGAATATTGGTTAATAATATG
-AATCCGTTCTGCTTTTTTTCCGTATTCCAATTCTTGACGACTTGATATGA
-AGCCAGCTCAAATAATAGGCCTCCCACGTAGTGTCAGGCTGTCCCAATAC
-GGTTTGATCGACAAAAAATGCTGGAGTGTTATGCCCTTCAAAATGTGACG
-TAAGCGCGCTCTTAACCATGCAAAATCAGTTGAGAACTCTGCGTCTCAAC
-TCCCGCATTTTTTGTAGATCTACGTAGATCAAGCCGAAAGGATACACTCT
-GTCACCACGTGGCCTCCTAAGGACTATTTTGCAAGGACCTAATTTTCTGA
-ACCTTCACAAATTGATCTGCACCGTTTGAGATCGATTGAAAAGTTCTAAA
-ATTTTCTGTCCTGTATACTTTTTTCTGTACATAAGTCCTACCGAAAGGGT
-CCCCCGCGGTAATAATTACCCGTCAAAACAATGTGTACTACTAGCCGAGA
-TATGAGTTGTTATTGTTGTCATAATACAACAAGATTTGGATCACCGCCCA
-ATTTTCTTGTCAAAAAGTTCCGCTTATCTCGTTTTCTGCTAATTAGAGAA
-TACTCTATGGGAATTGGTTGATCCACTCCATTAGTGAATGTTCCCCCAAT
-AACCATGGAGCTGTTAGAACAAAGACGAAAACCCGCCAGAAGACACACCT
-TCTTGAGAGCAGGTATTAGAAAAATGAATGAAAGGAATTGGGAGGGGAAC
-CCGCGGTGGCCGAGACTTCCCACTTGACCCGATTTGTGCACATACGCAAT
-ATCGATGAGGAGTGGTGGTCCATTCGATACAGTCTTGCACCATGTTTGTC
-GAAATGCTATTTGGTTGGCTGGCAGATGTTTTTGGTCCAATTTTCTTGTC
-AAATTTTGTCTTGATCTGACAGATTTTAGGATTCTTGGAATTCGACTCTT
-CACCGAAAAAATATAATTTTTCGGAGTTTGTTCAATTTTTCAGTATCCTG
-ATTGGAACATTTTAATGTTTTACAAAATTCGATTCTAAATTTTAAAGCAC
-ATTTTGACCTAGTAGGACTTTCGGAATTTTGTAGCCTTTATAAAAAATCG
-GTGGCCAAGTTTTCTATAATTTTTTTACGTTTTGAAATTGCCTTTTTATG
-AATTTTAAAATGTGGAACATTTTTTGAATGACTTAGTTTTTCAAATTCCA
-CGTAGTGTCAGAGTGTCCCATACCAGTTTAATCGACGTTGATCTACAAAA
-ATCGCGGGAACTCTGACGCAGAGCTCGCAACTGATTTTGCAGGGTTAAGA
-CTTGCTGACGGCACATTTTTTGGGAAAATTTTCCGCATTTTTTTGTAGAT
-CAAACAAATTTCATATTGCCTCGATTTGTTCGCTATAGTTGTCTAGTTTT
-GAAATCGTTGGAATTTCTTGAAATTCGAGTTCTTGAAACATTTAGGTTTT
-CACCTAGTTTTCTCTGCGTGTTTTTTGTGTTGAAAAAACGGTTCTCAGAA
-ATTTGACTGCTTTGAAAATTTCGAATTTCATCTCCAAAAAAAAGTGAACA
-ATTCGTATTTTTCTAGAATTTTTGGAAATCTCTTTAAAATGAGTTTTTCT
-GAAACATTTTAATCTTGAAATAGTCAGAGTTACGTCAAATTCTATTTTTT
-GAGGAATTTATTTTTTGTGAGAAGAAAACAACAAATCCGCAATTTTTTTC
-CGAATAATTAACCAATCCAAGATCCCCCCTCAAACCGGATGGCATTTATT
-CGGATCCCGGCAGGTGTTCGAATGAGATATGTATCCATTAACACATTGTG
-CATACACATAGACACATTGTCAACGTATGCCGTACACAACAAAACAACTG
-CGCTCGTTCGCACCTCAATCCTTTGATGTTCTCCGCCGGGGGCTCCTGTA
-AGGTCAGGAGTTTTCTAAAAATGTTGCCTTCTTCTCCGTCTTCTTCCTCT
-TCATCATCGAATATTCCAGAGGGGGGCCGACACGCTTCACTTGATTTTCG
-ATGGCAATTTGTTTGAAGAATTCAAGAATTCGAAGAATTTATTTGGAAAC
-TCACTACTCTCTTTTTTACGTTTACATCCAACTTTTGGCACTTAGGCGCC
-TCCAACTGCAACCATATGGTGCTCAATGAGCCGAGAGGGATCATCTGTGA
-ATTTGGTGTTTTTTTCTCAATTGGTTGCCTATTTGATTGGAGAGAGATTA
-ATTTGCATACAATTACCTCTATTTGGCTCAGGGGTGGACGGATATTGCCG
-TTCGGCATTTTTTGCCGACAAGTACGGCAAATCGGCAATTCGCCGATTTG
-CCGGATTGCCGGAAATCTTGATTTTCGGCAAACCGGCAAACATCAGCGTA
-CTATTTTACTATTCAAAATAAATGTAGGAACATTCATAGGATGCGTACAA
-TTTTGCCGATAAAATTTAAATTCTGAAGCTTCAAAAAAAATGTGCAAAAC
-CACAATTTGCCGAAAATTCTAGCCGATTTCAATTCCGGCAATTTTTTGCC
-GAAAAAAATTGCCGCCCACCCCTGATTTATATTCAGTCTGTTACCGATTC
-TAGTGAGGGGTTTCCAGCCTTTGCATGAATAGGTGTCTGCTACATTAATT
-GCGCAATCCACATTGATACAGAGCAACCTCAATTGTTGTTTTTTCTGTGG
-CCCGTTCTGCTCGTTACACCTATAAAAAGGTGGTCAAACAAGTCGTAAAA
-TTTGGGTCATGAGATGGTCCCTGGGTTAATTGGAGAAGTGCCGTCATTGA
-GAGAGAGAGAGCCAATTACGTATGAGGTCTGCTCTGCTCTCGGGAAGACT
-CTATAACCCTTCGTTTTTGGCGGGAGATATGAGATATTTTGCTGTAATTA
-TCGCACTTGTTTTGGGTATTCTCTTTTTGTATGATTTACCTAAAATTTTT
-GAGCAGTTGTGATTATCCTATTTTGTTTCGAGAACCTAGAAATGTTTCCT
-ATCATAGTAACCGTTTAACTCTGTGAGTATAGTTTTACTTTAAGTTGCTC
-CGTTTTTTATTTGACTAGCACAGCTTTTTTACATTGCTCCGGTTTTGGCC
-AAAGGTTTTCTGTTTTTTTTTTGCAGTTCTGACTTATTCTGGCCTGCTTT
-ACCCAGCTAAGCCTAGGCCCGGTTACAGTCCATAAGACAACATTTTTGAA
-CTCAATAATTGCCGAATTGCCAAAATGCCAAATTTTCGATTGCTGCCCGT
-CTGAGTAAGTCTGAAACAGTTTGTGTGAAATTGAGCCGGAAACTACTCGG
-AGTGATGTGGCCACTTCCCTATTTAGTTTCTCGGTTGATTTTCACACTTC
-CCGCCGAGAGCCCGAAGCATCTGCCAGCTGAACGGTTTCCGTCGTTTTTC
-ATGTCTATCGCTAAAATGTGCGCGTTACACACACATAAACATCACTTCTC
-TCATAAAGTGATGGATAATTCGAGTGGATTGCATCTGACACCACACTTCC
-GATAATCGCTTCGTCGTCTTGTCATCATCGTCGTTTTCTTCGTCTTGTTG
-TCGTCCGGTCCCCACACACACATCAAAACGGCTACTTCCGACGTGTCGGT
-GGTTTGTGTGTGTGTCAAACGGCACCACCACAAGTGGTTGCCCTCGCCCG
-TGTGCTAATTCGCATTTTGTCTTGTTAATCACGCAATAGTGATAACAATC
-GCTTCCGGACCATTGCTAATATAATATATTGGCTACCGCGGGCATGTCTT
-GGCAATAACCTTGATGTCAAGTTTTATCGTTAAAATGTGAAGCTGTATGA
-TTGCGAAAAATTTGAAGTTTTCCCATTCAAATTGTAGGCATATTTGAAAA
-ATTTCTGAAGATTTATATCTGTCGTAAGTGGAACGGTTTATTTGGTTTCT
-TGGGTCTCGTCGCGAAAAGCTTTCACTATGGTTTGAAGCACGACTGGGCG
-ACAATCGAAGTCGAAGTTCGGCAATTCGATAATTCGGCAATTATCGAGTT
-CAAGATTTTCGAAAGAAAAACTCAAAAAATAATTTTGAAATCTATTTATT
-AGTTCTGGACACGCGGAGTCAGAAAGTCCCATTTCGCTTTGATCTACGAA
-AAATGCGGGAGTTGAGACGCAGACATCTCAACTGATTTCGCATGGTTAAG
-AGTGTGCTGACGTCACAATTGTTCTGGAAAAAAATTCCCGCATTTTTTGT
-AGATCAAACCGTAATGGGATAGCCTGGACGTAGAACTCGCCAAATCGTAG
-ATATATGCATAATGAAAACTCTAGAGTTAACTCTGCCACCCTCATAAAGT
-GAGTTAGAAACATTTCTGCTCTGAGGAACTATAGAACCCCCTTTCAAGTC
-GATCGTCAGCAAATTCTAGAAAGATCTGACAGTGGCCGATTTTTTAATGT
-TTCTAGGCCACGTAAAAAAGCTGATGTCTTGTTACTTTTCAATTCGAAAA
-TCCCTTTTTTTAATTTTTCGGCAGCACCCGGTCCGAGCCAACATCTTCCT
-AAACACTTCAAAACCCCGCCCCCTTCTGCCCTCCCGGGTGTCTCCGTGTT
-GTTCAGGGTGTTGTCCACCCCCTAGACACCCAACTGACCATTCACCCGTC
-TCCTCCTCCCCCTCTACAACAACCACCACCACCTGATCCATTCCATTATA
-ATGATATTCCGCATACTTGTCATACAGAGAATACCCGGTTTGCTGCTGCC
-AAACGGTTTTCATTTATTCCATTTCTCACTCCTTGATTGTTGTCAATTCT
-TCGATTCGATGCGGCAAAACTAGCGCCAGTGGGGAAATTGCTTTAATAGT
-AAACAATTTTTTTTTAAATTTCCTATATTTTTTGTATAAGATTTTCTTTT
-TTAATTGCAAATCCCATGGGAAAGTCTCAAATTGCATAAAATTCCAATTT
-GAATTCCCTCCAAGATTTCAATGTTCGATGGAGCGCACTTGAATTATTAT
-AATTTTTATCAATGAATTTTTTTATCATCTCTGACTGATTTTTCACGATT
-TTTTGTGTAGTTTTAGAGGAAATTTACTGAAAAATCCAAGTTAAATGTAA
-ATTTCCGATTTTTATACAATTTTTGGACTACTTTCCCCGCCGCCACCGCT
-AAAAATCCCAATTTCCTGCAAGTTTTCACCTGCTCTGACTCATTTCCGCG
-AGCGCGCGCGCTCGTACTTTTTATCTTTTACTATTTATTTATCTCCTCCA
-AAAAAAAATCCCGTTAATTTTTTTTCCCTTACAATTTCTCATAATTTACT
-CATTTAGTTTGGCTTAAAAAATGCTAAATTAAATTTTTTTTTCATTTCCA
-GATCACATGACACAACGAAAATGAGGAGAAAAATGAAGTTATTCCTATTT
-TTATTATTAGTAATTAATATATGTCGGTCGGCCGCTGCTAACGGTGACGA
-ATGCCCGAAATTGTGAGTTTTTCGCTTAAAAATCAGATTTTTTTCGAATT
-TACTGTGAAAAAGCGGGGGTTTTGCCTGAATTTTCACTTAAAACTGCTTT
-TTTTTGCTAAAATCCCGAATTTTTCAGAGAAAAATAATTCAAACTCCATT
-TTTCAGCTGTAAATGTGCTCCGGATCCGGTGCAGCCGACGTCTAAACTCC
-TATTATGCGACTATTCTTCGAAAAACACGACAATTACACCTATTGCGTCG
-TCGAATTATGATCAGGTTGCTAATATTCGGTGAGGTTTTTTGATTTTTGA
-ATGAAAAATTTGAGAAATTTTTAAAAATGGGAAAAAATGTGATTTTTAAA
-TCAAGATATCGGAAAATACGAAAAAATTTCCAAGAAAATGGTGGTTTTTA
-TCGAAAAAATGTTAAAAATGCATAGAAAATTTGGATTTTCGAGTTCGAAA
-TTTTCTGAAAACAAAAAAAAAAGTTTTTTTTTACACTAAAACATTAAAAT
-TGGATTTTTTTTTCCGAAAAACATAATTTTTCAATTTCTAACAGTAAAAA
-GCTCACAAAATTCCTTGAAAATTGACAAATTTAGTATTTTTTACACGAAA
-AATGCATTAAAATTGAATTTTTAAAACAATTTAAACTTAAAATAAAATTT
-TCATTTATTCTACACGGTAAATGTATTAAAATAATTAAAACTTCGAAATT
-TTAAATTAGAAAAAATCAAATTTCCTCCTTATTCTCAATTTTTTTTTACA
-GCAAAATTTCAGTTGAATTTTCCCATAATTTTGAATTAAAAATGTGTTTT
-ATTCCAAAAAAAAACTATTTTACAACAAAAAACTAGATTTTTTCCCAATT
-TTCTATGAAAAATTTAATTTACCAATAACTTATTTTCTTTTTCCAGATCA
-CTATTCATATCTTGTGATAATAATAATTTCCAATTTCCGGATGCCTACTT
-CAAGTCGTTAACCGCGTTGCATCATCTGCGGATAGTGGTGAGTTTATTAT
-ATTATCAGCTGTTCTCTACAGAACATCTGCTTTTTGCGTGTAAATTTAGA
-GGTCAATTTTCGGAAAAATTGGAAAAATTGGCCTAAATCTCAATTTGAAG
-TAGATTTTCACGTGTTCAAAAATGTTCAAAAAATTCAATCAAAAATTCGA
-TTTTTGGAATACTTCAAAAAAATTTAATTTTCTTCGAGAAAACCGGTAAA
-TTACAAAAAAAATTCGTTGGCGATTTTTTTCTGTAGTTTTCCAGAAAAAC
-AAACGAAAATTTTAATTTTTAATTTTTAAATTTTCCAAAAAAAATTTTTA
-AAAATTCATAAATATGTCCATTTTAATTTTAAAAATATCGGAAAATATTC
-AAAAAATGAACTTTTCTATCGAAAATTTAACAAGAAAAAATTACGAAAAG
-TTCATTCAAAAAATTAAAATTCTTCTATATCTGAGGAAGGCTAACAGTAA
-TTTTTTCCCATTTTTTGACTCTTTGAGCAAATAACCGTATCACTAATTAC
-CTTAACCATCAAAAAAGAAAGGTGTGCCTGTCTTCTATTCATCCTCCTCT
-CGACACCAAATTCTTAAGAAGAGCCCCCCACTCGGATGTCTCTAATTAGG
-CACAAATGTTACGTCATTTTGTCATTTGTACGGCCACAGATGACCTCCGG
-TGTGCTTGGAGGACTGCGAGAGAGGAGGATTAAGGGGATTTTTATGTCCT
-ACAATTGATTTTTTTAGGTCAAAAGTAGGGATTTTAAGGCCAAAAATAGA
-GATTTTTTAGGTCAAAAGTAGGGATTTTAAAGCAAAAAAAAAAAATTTTC
-GGCCAAAACAGTGGTTTTTAAGGCCAAAAAATTTAATTTTTCCGTTTATG
-ACACCTAAAATTGGGGTGAAATTTTTTTTTCGGATAGAAATCTAAAATTG
-CAATTGTTAATTATTCCAACATTTTTTTTTGCATTAAACGTTATTGTAAA
-AACATTGAAAATCACTTGATTTATCCGAAAATTTCATTTATTTCAGATAA
-ATATTGTTTAATAAAAAATGTGTTAAAAAACATGGTGCATAGATATATAG
-ATAATTTTGTAGAATAATTGAAAATTGCAATTTTTAACTTCCTACCCGAG
-TAAACAGAATTTAAATCCAATTTTAGGTGTCATAAACGGAAAAATCCCAA
-TTTTTGGCCTTAAAAAATCCCAATTTTTCGGCCTAAAACTCCCTAATTTT
-GGCCTAAATCACCCTATTTTTAGCCTAAAAAAGTCCCCTGTTTTTCCATT
-TTCCCCAGGAACTCGTAGAAGAACATGTGTTAGGCGTGAAGAGGTTAAGC
-CGATTAGCCATGTAATATTCAATACTTGAGTATAGAAGGGCCAGAAGCAG
-CAGCAGCAGGGGGTGCTCCAAGAGCACCACCTCAACAGATGTATAAAGTG
-GTTTTCGAGTAGATTTGTGGTTTTGCACACGGTGGAAGAAATCTGAAATT
-TGAATTTTTTAAAGCCATTTTTGTGCTGAAAAATGTACAGAATAACCGAA
-ATTTCACCACCCTTTAAGGTACGGGAAATCTCCGGGAAAAAGGCTCAAAA
-ATTGCATAAAAATGGAGATTTTAAAGCTAAAAATAGCTATTTTAACAAGT
-TTTTTTGCAGGGATGCGAGACCACACATTTCTCTGTGAAATTGTTCGAAG
-ATTTGGCCGCTTTGAGAAGATTGGAACTCGATCAGGTACATTTTTCTTGG
-AAAATCTAGAAAATTTTGCTGAAATTGGCTCAGAAATGTCCTAAATAGTA
-GAATTTTTCATTAAAAAGCCTCTCAAAACGGCTTAAAATTAAGTAAAAAT
-CGACATTTTTTCACAGATCTCCACCGCCTCAACCTCTTTCGAAATGACCG
-AAGACGTCCTAATGCCGTTGGCTCGTCTCGAAAAGTTTTCCCTCACGAGA
-TCACGGAATATCGAGCTTCCACAGCGACTTTTGTGCTCTCTGCCGCATTT
-ACAGGTATATTTTTGGGTAATTGATAATTCGCCAAAAAGAACAGCAGCCG
-AAAACTCAAATTTTTCACGAAATTTGCCGAAAAACTAGATTTGTAAAATA
-AAAAGAATGCAAGAATTTTTAGCTTAAAAATCTCAATTTTGAACGATTTT
-TAAAGCAATTTCAGTATGAAAAATCCAGATATTTTTTGGGTAAAAATTTG
-GTGAAAACGCGTTAAAATCTGCATTTTTGAACGAAATTCGCCAAAAATCA
-AGACTTTTGTAGTGCATTTTACTGTAAAAATGTATACCTATTTTCTATTT
-TTATGCGTACTGCGCAATATATTTGACGCGCAAAATACCTCGCAGCGAAA
-ACTACTCTTCAAATGACTACTGTAGCGCTTGTGTCGATTTACGGGATCGA
-TTGATAGAATATCAAAATTAGAAATAAATGGGAAACTACTGCGAAAACAA
-AAATTTATTTCAAAAATTGAGTCCGTAAATCGACACTACAGTAGCCATCT
-AAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATGTGT
-TGCGCAGTATGCATTCCCATCTTGTTCTCTACATTCAATTACCACCACAT
-CTCACAGAGAAGGAATTAGTTGTTTATTAGTACGTGGGGGGGGGGGGGCT
-TTAAAGCTTACTACTTCTTCTTTCTTTCCACTTTCTGACGTTCAACCATC
-TGGTATTCCTGGCGGCGGGGCAATTGAAAATGAGAACAAAAGGACATCGA
-TGGAGGGAGGAGGATTGAGAGTTTGGAAATTGTGAAGAATGCGCGCGGAA
-GGAGGAGGTCAAATATCACAAGCGCCGGAAGTTGTTGTCAGCCAGAAGCA
-ATAAAGGCCTAATTATGATGATGATGAAGAACCTCCCTGAAAGAGAATAG
-CGAAAATGTGAAGTTTCCATCTCAAGGGAGCGATTTTTTAGTGATCATGG
-AGTCTTGAAGTGTGCACATAGTCTACGTGCCCCACAAGAGCCTATGCCTG
-CCTTATGCCTACTCACATGCTCACAGCCAAACTCTTTCGAAATCAGAATT
-CTACATTGTAGAATCTACAACACTGAAGTTTCTGCCATAACGTTGAAAAT
-AGGCACCTACGCCTGAATACGTGCCTGATCAACATGGATGCCATATAGTC
-CAGGCTGTATAGTCGTAAAACAGGGATTTTTTAGGCTCATGGGTTTTTGT
-CGGAAAAAATCGAACATTGAGAAAACCAGAAATTTTTCAAATTTTCGTAT
-ACTATTCCACGAATCGTTTCTCCCGTTTATCGAATCTCCACGTCGCACTG
-TAATTTTTCAAGTATCGTTAGTCCATTCGCCCGAGAAACTCCACAGTTAC
-AAATGCTTTGCAAGCATTTTCAAGAAACCATGGTTCCTGGCATGTTTTGG
-CGCATTCAATAATGCCGCTAATAATAATAATAATGCCTCCTATTATGATG
-TCGCGTTGTCATCGTTTGCTGCTGCTCCGTCAGATACTTTATGGGGTTGT
-TGTTTTCTCCCTCCGCATCAAACGACGTTCCTCTCTTCAAAATGATGATG
-GATATACATATATCTATGTTTATAGAAGAATTGAACCCCACACTTTACAT
-ATGAATAGATGGGGACCTTGTTACCTTGACTATCGGGAAGAGATTGAAGG
-TTCCAAAGACGGCTGGCTGTGGCTCATTAGGCTAAATGATGCGTGATATT
-ATTCGCTCTACGGCACCTCTATGATCCAGGAATAGCAGTCACTGTCAACA
-AGAGTCACCTCACGGCAACAATACTCCGCTAATTACGGTTTGCGGCAAAT
-CCCAGAATTTATTTGAAATTCTAACTGGGTGTTGCAGATGGGTCGAGGAA
-ATATGATAGCAATAATTATTGTTACGTGGCAATTGTAATCCGTCAGATAT
-CGTTTCGAGACCTGCTGACTCAAGAATGTGAAAATGGACAAATTTGGAAA
-ATAGGTAGCGGAAAATTTTCGCAAGTTTTGAAAATTTCGGTCATGATACG
-ATACGAACTCCTTGATTTTCACAGCCCGACAAGCCGTACGCGTACGCAAT
-TTGTCTACCGTATACCTGAACGTTCAGGCTCGTCTATCTCGAAAACAGTT
-GGTCCAGCCTTTTTGTGGGGCATATAAAAAAGGTCAGAACATAAATTCTA
-AAATTTTTTGGACCATAGCTTGTTTCGTTATCACGCGCCCAAACCTGATC
-TACACTCAAATTATCAGTAGAGCGCATTTGCATGGATGTACCACTTGCCG
-GGCCGTGATTTTGAATGGAATATTAAATTCCACGTCACTCTAGTGAATCT
-CCGCTTCTCAATATGCTTCATAATTCATCAAATTCAATTCATTTTCGGAT
-AAGCCAGTTGTAAACAGTTGTGTGTGTGTGAGTGAGCTCATCCTTCATAA
-AATGAATAGAGATAGAACACTGACACTCTCTCAAAGACAAGAGGAATTAA
-TAAATATGAGAGCTCATTAGCTGCTCTTCTCGTGACTACTAATTAGGAGG
-GTGGTACATGAAACAGTGTATGTGTAAAGGGATCCCCGCCGCCGCCGCCG
-CCAATGTCTTTCGGTGTATGGCAATATCCGAGTGGTGTTCTCATTTTGAA
-GAGAGTATTAGGATGTAACGTATCAACTGGAGAGAGATAGTTCAAAGATT
-GGGGATTTGAGATATTTTAGGTGTCGAAATGGATGAAATATAAGCATAGG
-GAGGAAATAAATAGAAAACGATATACTTAAATAGCAATAGTTATTTGAGT
-TCTTACTGTAGTTTTCGCTAAGAGATATCGCGCGTCAAATAAAATGCTCT
-ACGTACGCATTCTCATGATTTATTGTTCCCGTAATATAAACATAGCAAAC
-ATTTTTAATGTTTAAATATTCCTCAATGCTATTGAAATTCAAATTAGTAC
-AAAGAAAGCAATTTTTCGATTTTTTTAACGAGAAAACTAAGTTTTCATCA
-AAAAATATGTAGATTTTGATGAAAATAATATGACAATTTATTTAAACCTA
-TATATTTTTTTGTCCAAAACAACTTTACGAAAAAAATTTTTTTTTAAATA
-AAATTATTGGATTTTTCGTCAACTTTACGATAAATTCCGAAAAATTAACA
-ATAAATATAGGAGAAAAAAATCCGAAATTAACGAAATCCCCTGTTCCAGG
-TTCTGAATATCTCGTCAAATGAGCTTCCATCACTGCGAAGAGAGGAATCG
-TGTGTCGCTCAGCAGCTTCTGATCGTCGATTTGTCTAGAAATCGGCTCAC
-CAACATCGAGTAAGGGATTTTCCGGATATTTTATAATTTTGATCTTTAAA
-AATTTCAAAGTTTGTGAAAATGTGAAAATCTAAAAATGTGGAACAAATAT
-TGGTTTTATCTATTTAATACCCCAAAACTTTGAGATTTTTCCGTTGAAAA
-ATCGAAAATTCGAAAATTATCTCAAAAATTTCAGGCAATTCCTACGTGGC
-ATCCCGGCAATCCGGCAAATTTCGGTGGCTTACAACTCGATCGCCGAGCT
-CGATTTATCGCTGGCAACTCCATTTCTACAACAACTCGATGCTGAAGCCA
-ATCGAATCGTCGACTTGACGTCACTTCCAGGCACTGTTGTACACGTGAAT
-TTGGCTGGAAACGCGCTGAAAAGGGTGCCGGATGCGGTAGCCGAGTTGGC
-GAGTCTTGTGGCGTTAAATGTGTCGAGAAATGAGATTGAAGCCGGAAATT
-CGTCGGTTTTTTGTGGGTTTTCGGATTTTTTTTTGGAAATTTGAAATTCG
-GAAAAAATTCAATTTTTACATACAATTTTGCGTATTTTGATCATATTTGT
-TTTAAAAATCGAGAAATTTAAAAAAAATCAAATTTCGCTTATTTTCATTG
-GAGAATACATGAGAAAAATATTTTTGTTTCGAAAAAGAAAAATAGCCAAA
-ATTTAATGCTATTTTTTCGAAAAATTTCGATTTTAATTTTTGAAAAAGTA
-TTGAATAATTTCATCAAATTTGTTTTATTTTGATGAGAAAATACGTGAAA
-AATGGAAAAAAAATATGAAAATCTTTAAAACAAAAAAATAATCAGATAAT
-TATGCAATTTGGCCTGAATTTTCAAAAAAAAAACTTGGATTTTCGAAAAT
-TTCATCAAATTTTGTGTATTTTCATGCAAAAAAAGATAGGAATTTCCAAT
-TTTTGACCTTAATTGCAAAGAAAAATTCCTAAAAAATTGTAACGTTTCAA
-AATCTCGATTTTCTTCTGAAATTCTCAAAATCTTCATATTTTTCCAGCTT
-CCCCAGAACTCGAAATGCTCGACGCCTCTTACAACAAATTGGACAGTCTG
-CCCGTCGAATGGCTTCAAAAATGCGAAAAACGCATTGCTCACCTCCATTT
-GGAGCACAATTCGATTGAGCAGTTGACTGGTGGAGTGCTGGCGAATGCGA
-CTAATTTACAGACGGTTCGTAGACTTGTTTTTTTTTTTTTTTGAAAAAAA
-ACACGCTGAAAAAATCTAATAAAACCCAAAAATTTGCATTTTTGTTTAAA
-AAATATGAAAAATTGTTCAAATTCCTAGTTTTCAATATTTTCAACAAAAA
-AAAATTCTAGAGCTTCCATGGTAGGCAGGCGCGGTTTCAGGGCCTGACGC
-CGACCTTTCGCCTCTTTTTTGCATTTTTACGGGAATTTTCAAATTTCTAA
-TTTTCCCCATTTCTATCAAATTATTGAAAATCAAATTAAAAACGCGAATC
-GCGTATTGAGGCGAGAGGCACGCAGAGGTTGCCTTAAGGTCAGACAGGCA
-AGCTTTTTAACGCCTAACGTAATTTTAAAACCTGAAACATTAGAAACTTC
-CACACGTTTGTAATTTCACTGAATTTTACTGCACCTCTTCATAAATTCAA
-TGTATTTAGATAGTGTAATTTTTAAAGGTGGAGTGCCGAAATTAAAGACT
-TTGCTTTTTTAGACCAAAATTGGTCCTAAATAACCGAATTTCGTAATGAG
-ACTTTCTGAAAATTTCTCAAAAAAAAGTTATGGCGGTTCAAAGTTCGGGA
-AAATAAGGTCAATTTTCAGCTAAAATCAAAATTTTTAAAATTTTTTATTT
-ATCACTTTTTGATAAATATTGTGGTCTTTGATTAGGCGGGGCACCAATAA
-AAGTTACATTTTGTGCCCCACTGACCATGAATGTATTTAAATCAACGAAT
-AAACGCCTAATCAAAGTATTTATTAAAAAGTGATAAATATAAAATTTAAA
-AATTTTGATTTTAGCAGAAAATGGGCTTTTTTTTCTCAAACTTTGAACCG
-CCATAACTTTTTTTTTGAGAAATGTTCATTACGAAATTCGGTAGTTTTGG
-ACCAATTTTGGTCTAAAAAAGCAAAGTCTCAAACTTCGGTACTCCACCTT
-TAAAGAACAGTGTAATTTTTTTCTATTTTCCAATCAGTGCAACTCTAATA
-GCAACTCTAAACTTATTTCAATAAACTCTAGGCACAGTATTTTGAATAGG
-CGATCGCGTGACAGTTTTAACCAAACATAGTCATGATGACCTTTTGTCCT
-TACAGAATCTTCTCAAGTTCATGCACACACAGGTGTCATTTACTCTGTCA
-AGTATTGTATAAGTGTGATCCCGAGAGTATTATAAATGGTAGTTAGACCA
-CCCTTATGGTTAAGTTGTTCGTATAATTGTAGGGGTGGGGATCTTACCAC
-ATTTATACGGCCCCCCTCCTATTGTATTGTATTGTTGCCACCAGTCGTCT
-TGAGAATCTCTTTCAATCCGGGGTGACAGAAGGTGTCATATTGTCGGAAT
-GTGTAATAGGTGGGTCTCGAATGGATATCACTAACAGCTGTGAAGGGATC
-CGAGAAGGGTTTTCGGTCTTTCTAGGGGTTTAACTTTCCGCTGTCAATAT
-TATTAATCTTACAAGGAAAGGGTTTTAGTTTACCGTCAGACTTTAAAACG
-AGACATGTGTCATTTGAAAGTGTTCCATAAGTGTATGTCACTCCAAAATT
-TCAAGCGGCAAAGCTCCAGTCTCAAACCCTCTAGCATCGATCTGAAAACG
-TTTCAGTGCATTTTTCACTACTTTGAGGCAAGTAGAATTTCTCCAAAATG
-TTTTTTTTGCAAATCTTCAATGTTTTTCAGAACGTTTAAAAGAAGGAAAA
-CAATCTGGAAAATTTTTGGAAAATTTTAAATTTTTTGAAAAAAATCTGAA
-ATTTCTTGGACCTGGTGGCGTGAAGAAATGTTCAGATTTTTTTCAAAAAG
-CTTAAAAATTTTCCAAAAATCTCCCAGATTGTTTTCCTACTTTTAAATGT
-TCTGAAAAACATTGAAATTTTGCATGTTAGTACGATTTGATAATCGTGTT
-ATAATTACATTACACATACATAATAATCAATTGAAATATACAATTCTTAA
-TTATAACCTGAAATTGAGATTAGATACCTTAGACAATACAACAAATAAGA
-ATGTGATCGATTCAGCAGACCCCTATTTGTGAAAAATGCCTTCTAAATTT
-TATTTTACACTTCTCCTAGTAGATGAACAGCACCTGCCAATAATTTCATT
-GACAGCCGGATGGTTTTTGGCTCCTCTAAGACAGTATAATCCCGTCTCCC
-CCGGGGGGAAGTGGTGTCAAATTGCTTTGCGGAGCAGGTGCTTTTTTCTG
-AATCGAATTGGCTTATTGGTGACGGAAAAACCCCTAATAGAATTGATACA
-ATTTGGTTTTCAAGAGGATTTGGGGAAGGGTTTAGAGGGTAATTGAAACT
-GAGTAGATCTTCGTCTGTCGTGGAGATCAGAAGATTGAGGGAAGTACTGG
-GTTTAAGGGGGTCAAGGAGTACTGTAGCGCATTTCGAATACTACTTTAGA
-TAGTTTAGGTATTATATCAATAGGATAATATATTATCAAGTTGCACCAAA
-ATTGGAGATTCTAGTAGTGCATTTTCTTTATATGCTAGGTATGTATAAGT
-TTCTAATAAGTGTATATACCTACCATGTACCTAGGGGGAGTAGAGTTTGT
-GGGTATTTTGCTTAAATAGACTAAAACGTGTCCAAAACCACCGAATTTCA
-AAATGAGACTTCACAAAAAATTTCCAAAATTTTTTTTATGGAAAAAAGAG
-CAAAATTTAACTAAAATCCGAAATTTCGCACAGTTTTCTTTGTCACAGCC
-GCTGGATTTGAATTTTTCTGAAATTATCACCCTTTAATCCTTATTTTAAT
-AATTTATCTCGCGGAAATTCGTTGATTGAGACAACTTTTAGGCCGATAGG
-CATCCCATCTTGATCATTTTTGGATGCCTATCGGCCTAAAAGTTTTTTAA
-TTTCAGAAAAACTAAAATCCAGCTGCTGTGACAAAGAAAAGTGTGCGAAA
-TTCCAGATTTTAGCAAAATTTGACTCTTTTTTTTCTCGAAATTTTGACTC
-GCCATAAAAATTTTTGGAAATTTTTTGTGAAGTCTCATTATTAAATTCGG
-TGGTTTTGTACCAGTTTTAGTCTATTTAAGCAAAATACCCACAAACTATT
-ACACTTTACTTTAACAAGACACACAATAATTCACAAATGGTGTAGTATCA
-TGCCGGAATTTATATAGGATTGATTCTTGAAGAACGAAATTTTAAATAGA
-TTATTGCAGACTATGTAACACTATTTGTATAAACAATTAACATAGTGTAT
-TGAATAATGACTTTATTGAAATTAATACAGTTTTTGATATACCCATCTTC
-TATTAGTATATCATGCAATACTAATAGGTAATATGCAATATCACTTTAAT
-TGTTATTTCCCATGCGTCGTGTTTATACAAATGCTTTATATACTCGAATA
-GTCTATAATAATCCAATTAAACTCGAGAATCCCAATACAGAATATAGTGT
-TTACCAAAAACACTTGTGTTATTATTCTAATATACATGCACACACACACC
-CACACACAGGTTTGACACCAGTTCTACTAATATTTGCATAATACCATTGA
-GATACCTGAAGTACCCTATAGATATGCACGGGATTCGTTTCGGGCACTGC
-CACGGAAAATATTGAAAAAGTGTGGTAAATTTACGAAAAACAACAAAAAA
-AATGCGATTTTCCAGAGAAATACGAAAAAAAAGAAAAAAATATTTAGAAA
-ATTAACAACAAAAAAAAAAATTTTTTTTTATTAAATAATAAAATGTGTTC
-ATTCTGTTTTTCCCCTTTCAGTTAAACTAGGGCTTCCATGGTAGGCAGGC
-GCGATTTCAGGGCCTGCCTGAAACCTGCCTGCTTCACGCCGGCCTCAGGT
-CGCCTTAAGACGGCTGCTAAAAATTTGAAAAAAAAATTTCAAAATTTGAA
-TTTCCGCGCTTTTTTCGAATTCCTAGAACGCTTTTTTTTAATTAAAAAAA
-AATTTCAGTTGGACCTTTCATCGAATCAACTTCGAGTTTTTCGAGACGAA
-GTACTTCCGGAGAATTCGAAAATTGGAAATTTGAGACTTTCCAACAACTC
-TTTGGAGCTCCTCGAGCCGTCGAGCCTGAGCGGCTTGAAATTGGGTAATC
-TAAATTTATATGAATTTTGCAAATTCTAAAAATCCTAATTTTTTCTAGAA
-TCCCTTGATCTGAGTCATAATAAGCTGACAGAAGTGCCCGCCGCAATTGG
-AAAAGTCGAGCAGCTGAAAAAAGTGGATTTGAGCCATAATAGAATTGCGA
-AGGTTTATCAATATGTGCTCAATAAGATTAAGCAATTGCATACTGTTGAT
-TTGTCGAATAATCAGTTGCAAAGTGTGAGTTTTTTGTTGATAAAAATTTA
-AAATTTGAATTTTTTCTTTTTTTTTAATTATTAATTCTGAAAAATTCAAC
-GAAATTTCCGAAAATTACTTGAAATTTAAATTTTTATCCAGAATTTAGTC
-TATAAAAACGAAAAAATACGAATTTTCGATTAAAAAAATTAATTTATTTA
-AAAACACACTTTCGAAAAAAATTTTGAATTAAAAAAAATTTAAAGTTCCT
-TAAAAAACTATTTCCTCAATTTTTTTTCTGAAATTTCACTCTTTCATTTT
-TTAATTCATTTTTTAAGTCTATAAATACGAAAAAACACGAATTTTCGATA
-AAAACACATTTTTCAAGTTTTTAAAAATAATTTTAAATTGGAATTTTTCT
-TTAAAAAATTGTTTTTTATAAAAAAACACATTAATGCATTTTTTAAAAAA
-TAATTTCTTGAAATCTTCCAAAATCGGTTGTAATTTTAGCGAAAATAACT
-ATTTTTTCCAGTTTTTATTTAAAAAATCCCTCGAAATTTGAATTTATCCA
-GAATTTAGTCAATAAATGCGAAAAAATACGAATTTTCGATTAAAAAAATT
-AATTTATTTAAAAAACACTTTCGAAAAAAAAATTTTCAATAAAGAAACTA
-GTTCTTAAAATTTTTTTTCTGAAATTTCACTTTTTCATTTTTTAATTCAA
-AAAATTTGAATTTATCTACAATTTACTCTATAAATACGAAAAAAATACAA
-ATTTTCGATGAAAAAACACAATTTTCAAATTAATAAAAATATAATAAAAA
-ACATATTACTAAATTTTTAAAAAATAATTTCTTGCAATTTTCCAAAACCG
-GTTTTAATTTTAGCGAAAATAACGATTTTTCCAGTTTTTATTTTAAAAAT
-TCCCTTGAAATTTGAATTTCTCCAAATTTTTTCTTGAAGTTTTTAAAAGT
-TCCATCATTTTCTACTGGAACTTTCAAAAAATGTTCCTTAAAAAATCTCT
-AATTTCCGCTAATTTCTACGTAAAATTTCAGCAAAAAAACAACGACATTT
-CATGTTTTTTTGTTAAAAAAATAATTTTCTTGAAAATTTCTTTGGAATTC
-GATTTTTTTTGAGTTTTAACCCAATAAAATGTATAATTTAAAAATATAAA
-AATTCCAGATCGGCCCCTACATCTTCTCCGACAGTTCTGAACTTCATTCC
-CTGGACGTGTCGAATAATGAGATTTCACTGCTGTTCAAGGACGCTTTTGC
-GAGATGCCCAAAGCTGAGGAAAATTTCGATGAAAATGAATAAAATTAGTG
-AGTTGAAGCACGAAAAACTGCCCAAAAATTAAAATTTTGAAATTTTTGTG
-TTTAAAAACCTAGAAAATCGAGATAAAGTAGGCTTAAAGTTGCTCAAAAT
-CCGCAGATTTTTTGAAATCGATTTTGAAAAGTGCACATGGAGCTAAATCA
-GACTTCAAAATTCTCAAATTAATTGCATTTTCACTCGAAAACCTCTGAAA
-ACTGCCTTCTTCCTATATTAAATCAAATTTTCTTTCAGAATCCCTCGACG
-AAGGTCTCACAGAAGCTTCCGGCCTCCGACGTCTCGACGTATCTCATAAC
-GAGATCCTCGTGCTGAAATGGTCGGCTTTACCTGAAAACTTGGAGATTCT
-CAACGCTGATAACAATGATATCAATCTCCTGACCGCCGCCTCAATGTCCC
-CAAGCACCGCAAACTTGAAGTCCGTTTCGCTTTCCAACAACGGCATCACC
-ATAATGAATGCGGACCAGATTCCGAATTCGCTCGAGTCGCTGGACGTGTC
-GAATAATCGACTTGCAAAGCTCGGGAAGACAGCGTTGGCCGCGAAATCTC
-AGTTGAGAAGGCTCAACTTGAAGGGCAATCTGCTTACCGTAGTGGCCACC
-GAGTCGATGAAAGTCGTAGAGGCTGTGCATCCGTTGAAAGTGGAAATCTC
-GGAGAATCCTCTGATCTGTGATTGTCAGATGGGATGGATGATTGGTGGAG
-CGAAGCCAAAGGTTCTCATTCAGGACTCTGAAACCGCAAGCTGTTCCCAT
-GCCGTTGATGGGCATCAGATCCAGATTCAAAGTCTCAGCAAGAAGGATCT
-ACTGTGCCCATACAAAAGTGTATGTGAGCCGGAATGTATCTGCTGTCAAT
-ACGGAAATTGCGATTGCAAATCCGTATGCCCCGCCAATTGCCGATGCTTC
-AGAGATGATCAGTTTAATATCAACATTGTCAGATGCCACGGGAACTCATC
-AATGGTGCCCAAAAGAGAATTCGTGGTCTCCGAGCTCCCGGTCTCTGCGA
-CAGAGATCATTCTGAGCGGAGTCACCCTTCCACAGCTCCGAACTCACAGC
-TTCATCGGAAGACTTCGTCTCCAGAGGCTTCATATCAATGGAACCGGGCT
-CCGATCCATCCAACCGAAGGCTTTCCATACTCTTCCAGCACTGAAGACGC
-TGGATTTGTCGGATAACTCGTTGATCTCGCTGAGCGGGGAGGAATTTCTA
-AAGTGTGGAGAAGTCTCGCAGCTTTTCCTCAATGGAAATCGATTTTCCAC
-GCTATCCCGTGGAATCTTCGAGAAGCTTCCGAACTTGAAATATCTGACAC
-TTCATAACAACTCCCTCGAAGACATCCCTCAGGTTCTTCACTCGACGGCG
-CTCTCCAAGATCTCCCTGTCATCGAACCCCTTGAGATGCGACTGCTCGGG
-AGGATCCCAACAGCACCTTCACCATCGTCGTGACCCAAAAGCTCATCCAT
-TCTGGGAGCATAATGCGGCCGAGTGGTTCTCGTTGCATCGGCATCTTGTC
-GTTGATTTCCCCAAGGTTGAATGCTGGGAGAACGTGACGAAGGCCTTCCT
-GACGAACGATACGACAGTGCTGAGCGCCTATCCACCTAATATGGGAAATG
-ACGTCTTTGTGATGCCTATTGAAGGTTGGTTTAAAATTTTTAAAAAAACG
-CGCGTCAAATATTTTAAAGTCTTTTGTTCGAAAAATAACCATTTTACAAT
-ATGTAGGATATATCTATAACAGCTACTGTAAAAACTCCAGATGTTTGAAT
-TTTTTTAAAAATGCGACGTGGTAAATATTATATTGATTACATATTATTAT
-TACAGTGTATTTTTTTCCACTTCTACGACTTTAAAGGGGGGCGCATTTAC
-GCGCGATGGTCCCAGCATTGGTCTCGCCACGCACCCCAAAAATCAATGGG
-TGGCGCGTGTCGAGACCATCGCGCGTAAATGCGCCCCCCTTTAAAGTCGT
-AGAAGTGGAAAAAAATTCACTGTATAATTATTAGTCAAATGATACTTATT
-ATGATATTAGAAATTAAAAAATTAGGTTTGAACATTTTTTTTCCTCGATT
-TTTTTACGGTATTTCACCATGTATGCGTTATAAATACAAATATGATCCCT
-ACCTTTTTATAACTTTAAAATAACTTTTAAAAAGGAATATAATACATGCA
-CAAGCACCATAAAATTTCAACGTTTGCTTTTTCTGGTCCGAAGAATTTTT
-TCAATACGTTTACTTTATATATCACATATACAAACAATATACTGAGAATG
-CGTATTGCGCATTATATTTGACGCGCAAAATATCTCGGAGCAAAAACTAC
-AGTAGTCCTATAAATTCCTACTGTACTGCTTGTGTCGATAGAATATTAAA
-ATTGCAAAAAAAATTTAAAAAAACGAAAAAAAAACAAAGTATAAGGGAAT
-ATATAGCTATTCCAAAATAAATCAATTTCAAAAATCGAGCCCGTAAAAGA
-GAAGGACTTACTGTAGTTTTCCCTACGAGATATTTTGCGCGTCAAATATG
-TTGTGAAATACGCATTCTGAAGATGTAGTGTACTCGTAATATATATTTTT
-TAACAATTCAAACATTTCCAGAATTCCTGCGCGACTACAACTCAACAATC
-TGTGTTCCATTCTCATCTGGATTCTTTGGACAAGACCCTCAGAATAGTAT
-ACTCTTTGTAATAATAACTATATCGATTGCTGTTCTCCTCTGTGTCCTCG
-TTATTCTCGCAATTTCATTTATTCGAAAATCTCACGACGCAATCAATCAA
-CGAAGATACAAAGCATCATCTCTAAATTGTTCAACATCAGCCGGCTCGTC
-GCCTCTTCCGGTTCCGCTGTTGAGTTATCACGCATTTGTGAGCTATTCGA
-AGAAGGACGAGAAAATGGTGATTGATCAATTGTGTCGACCGCTGGAAGAT
-GAAGATTATCAGTTGTGCCTGTTGCATCGGGATGGGCCGACTTATTGCTC
-GAATTTGCACGCGATATCTGATGAACTCATAGCTCAGATGGACTCGTCGC
-AATGCTTGATTCTTGTGTTGACTAAACACTTTTTGGAGAACGAGTGGAAA
-ACGCTGCAGATTAAGGTAACAAATTCAAACTTTCAGTTTAAAATTGATAT
-ATTCGTAAAAATAAGATGTTCTTAAAAATTCTGAGAATGCGTGTTGCGCA
-AAATATCTCGTAGCAAAAGCTACTGTAATTATTTTATATGACTATTGTAC
-CGTTCAAAATTACTATCCAAATATTTGATTTTTTGTTTTAAAAAATTATT
-TGGAATTTACTCAAATATTGAAAACAATATTATCGAAATTCCAGAAAATT
-TGGTGGAAATTCCGAAAATTTCAATTTTTTCGCTAATTTTCGAGAAAAAA
-AAAATTAAAATTTGGATTATATGAAATAAATTTCCAAACATTAAATTAAA
-AATTTTTTTTTTTTGGATTTTCCAATCTCGAACCTTCAAAAATTGAATTT
-TTTTGAAATTTTTTTTCGGAAAAAGTAAAAAATGCTCGAAATATCGACAA
-AAAGTTGAAGTATTTTTTTTTGTAAAATTGGAGATTTTTGAGATAAAAAA
-TCTGAATTTTCATTCAAATCTTGAACATCAAAATCAGCAAAAAAAATTGC
-TATAAATTTATTTAAATAAGATTTAAAAAGAGTAATTCGCTATGATTTCA
-AATTTTCAAAAAAAAAAATTTTTTTTTCAAGTTTTAATTTTTGAACACTA
-TCAAAAAATTTATTTTTAAACCAAAAAAATTCCGAATTTTCTGTAAAATC
-TCAAAAAAAAAACATTCCTAGAAATTTAATCGAATATGATTTAATAATAC
-TATTTTTAAATCATATTCAATTACATTTCTAGGAATTATTTTTGCTAGAT
-TTCAAAAAGTGTATGAAAAATTAAAACTTTTTGAAAAAAAAACTGTTCTA
-AATATAATTTATAACACCAGAAATTCACTAATAACACTCCACATTTTTCC
-AGACCTCCCACCAACTATTCGCCAAAAACCGTGCAAAACGAGTGATCGCC
-GTGCTCGGCGACGGTGTGGACGCGAATCTGCTGGACGATGAGCTCGGACA
-GATTCTACGGAAGCACACGAGAATCGAGATGCGGAGCCATTTATTCTGGA
-CACTTTTGCACTCATCACTTCCATCACGACTTCCATTACCATCGAATAGT
-GGCGATGATTCGTCTCAACTATATTCGGATATCTATGGAATTGTGCCTTC
-CGATGTTGTTTAGCTTACAGTTTTCCCGTTTAGGTCACAGTTTTTAGTAT
-TTTTTTTCCTCTTCCAAATGTACGAGTTTCCATTATTCACGAGGTTTCTT
-TTTCACCCCCAATTCTTCTGTGCACAATTTGCCATTTTTTGAATTTTTAC
-AACAATACCGGTACTATATTTTTCGATTTTCTTTCTTTTTCTATGAATCT
-TGCCATCATTCTCTAATAATTGACCAGCGATTATATTTTTGATTTAATAA
-TTGAATATTCTCGTTTTTCAGTTCAAATTATTGCTTTTTTCTGTCACCAC
-AAATTCAAATTCTCGTCCTACCCTGTGTGATCTTCTGTAATATATATATA
-TTAATAATCGTCGTTTCTTCTTGTTGTCATTTGCGGATGCTTATGAAGCT
-TGTATTTTAATTTTTTGTTTTGTTTTTTTTCCTGTTTCAGCTGCAAAAAA
-TTCGGTAGAAATTCTTGAAAACACGCAAAAAATGAATAAAAAAAATAGTA
-TATTAGCTTGTTCGAGAGGAGTTCACAAGCGGGTGGCCTAACATCTCCGC
-GGCCGCCCAGTGGTGTACTCCTCTCGGGTGAAAGAATTCCCATTTTATCA
-TCAGTTTTTCGGCCTATTTTTTCAGTTTTTCTCAACTAAATAGTCAATTA
-TCTCTTAAATAATGTCGAAATTAATTTAATTTACACATTTTTCCAATAAA
-ATTCCAATTTTCGGTCATTAAATTACCCCTTTCGAATTTTGCTCTCAAAA
-ATTAAATTTTCATCGATTTTTAATTCTCAAAATTCTTGAATTTTCAGCGA
-AGATGGGCAAATTCAGCAATCAGAAGAAAAATCGTGTCAAGAACAAGGTG
-GCGGTGACAGTAAAAAAAGCGCAACGCATGAAGGCAGACGCTAAAAATGC
-CAAAAAAGACGGTGAAGTGGATGTTGAGATGAAGGAGGAGGTGGTGAGAG
-TCAGAGGACTCGCCGTATCGTCGCTGGTGAGAAAAAAAAGGAAAAACTCG
-GCGAAATTCTTGATTTTGATTTTTTTTTTCAGAAAAAATTGGCCTCCGGT
-GAGCTGCAAAACGTGCCAAAAGTGAACGAGAAGAAGATTATCCGCAAGAC
-AGAGCTTCCAGTTCGAGAGAAGTAGGATTTTCTCGATCTCTCCAAACAAA
-AAAATTGTTTTTTTCAATTTCAGCAAAAAGATCCTGGACGCTCCGACTGG
-AAAACGTGGCACCACTGCTCAATACATCACAAAAAAGAAGGCAAAGAAGA
-TGTACAAGAAGATGACACACGACGCACGCGACAAATATCGAAAAATTCAG
-GCGGAACTGGCCGGAGACGGTGAAGATGACGAGGAGGGTGAAGCCGAGGT
-GATGGAGCAGTGATTTTGGATTTTTCCGCGGCATTTTTAAAATTGTTTTT
-TTTTGTTGATTTTGTTACTGTTTTTCATTTTCCACATAAAATAATCGAAA
-ATTTATTTATCACAAAAACTTTTGCACAATTTGCTCAGCTGAGTGAGCCA
-ACTGTTTGCCACGTGTCACGATTCGATGCATCCATCCATTGGGCTCCTCG
-AGCTCCGCTTTCGGAGCCTGTAGCTGCTTTAGAATTATTGTCCAGAGCTC
-AGAAATGTTCATCGAGTACTGCGCGGAAACTTCGACGAAATTGCACTTGT
-GTACTTTGGCCAGGCAGGCTCCTTCTGGAAAAATCAATTTAAAAATCGAT
-AATTTGAAGTTCCACGTGGAGCCGCGACGCGGCACGCGTTGCATCGTTTT
-TTTTGGTTGAAAAACATGGTGCATCGAAGAATTTTCCTTTGACGATTTTA
-TACGCAATGCATCACATTTGACGAACAAAAATTCAAAATACTTTACTTTG
-CAAACGCGCTCCATTGATAAACTTATGAAAAATCGATAATGCTCAAATTT
-CACAAAATTTTCCTCCATTTGAAATTATATAATTGTTAAACAAAATTAAT
-AAAACCAAACATTACGCGCAGTTTCCGATAAATTTCGATTTTTTCAAAAT
-GCAAGCGCGCTCCATTGCTAAACCTTGAAAAACCCACCCATTTTCGACAC
-CACCGTATTCCGTTTCAAATCGATTTTATTGCCAATCAGTATAATATTGG
-CTCCGCGAGCAATTTTTCGATTCAAAAGCCGACTGAGCAGGTCTGTGGCA
-CACACGAATGATTCTCGATTGTCAACGTTGTACACTATTGCGTACATTGT
-CAGTGATGACGCGAATGGAGAATTCTGGAAAAAAACAAGAGTTTAAAGGC
-GCAGGTGGGTCTCGCCACGATCCATGTTTTTTTGCGGGAATAGTGGAAAT
-TTGGAGTTAGTAAAAAAATCAAATTTGTGTAATTTTTAATAAAATCGGTT
-CGCAAATGCGCTAGTACATCAGATTTCACGAGCAAATTTCATTTTGTGAG
-ATTTGCACCAAAGATATGGGCATTTGAACTGATTTTTTAATGGTAAACAC
-GCGAAAAAAAATACATATCCAAAAATTGAAAAAATTTTAGGTTTCACAGT
-CTCCTCGGCATCGAAAGCGCAGTAGTAGGGGTGGCGATAGGGCGCCCTGC
-TAAATTTTCTATTTTTATGGTCTTTCTTTTCGTTTTGTGCTAATGAACAA
-AAGTTAAGTTCGAAATCTGCGAAAAAAATCGTTTCAACGCTAAGAAACGA
-AGAATTGTATTTCTCAACGGTAAAAAGATTCACTCCTGCGCCAAGGTGAC
-AGCAAGTGCGCCCCAGCCCAATTCGACGCTGAAGAGACTGTGGGTTTAAA
-AATTTAGAGAAGTCGCAAATTTTTTGTTCAAGATATCAGCCTAAGCTACG
-GTTTAAAGGCGCACAAGCACGTGGTGTCAAAGTGTCCCGTTTCGGTGTGA
-TCTACCAAAAATGCGGGAATTTAGACGCAGACTTCTCAGCAGATTTCGTA
-TGGTTAAGAGTGTGCTGACGTCACATTTTTTTCTGCAACAAATTCCCGCA
-TTTTTTGTAGATCACACCAAAATGGGACTGTTTGACAGCACGTGCACAAG
-CAGATCACAAGTGGGTCTTCGAGTTATCCTCCCCAAATCCTGTCCAGTAG
-AGCGCACTTACCTCCAACGTGGCTTCCAGCAACATTTCCAACTCGATTTG
-CTCGTTATTCAACAGGAAATTCATCGTTTTCGATGAAGTGTCATCTCCCT
-CATTTGACTCATTATTGTATTGGGTGACGAGCCGCGTGGCAAATTGGTTA
-ATTGCTGACAGCAATGTTTTCTTCCCGCTATTCCTTGATCCATAGACACG
-TAGAACCACATGTTGCATTGGAACATTCGACGTTTCTTGGAATAGCCAGA
-CTTCTGGACACGTGGCTCGGCGATCTTCTGAAAATTTTTAAATTTTCAAA
-AATTTGGTTAAAAATTTCAAAGGAAAATCAATAACAAAGCTACTCCAAAA
-TTTTCAGCCTGATTGGTTGGAAAATGAGCAAGTTACAGCGCTTCAAGAAT
-TCTAGGCCACGGTCACCAGGGAGTGGTGGCGGTGACCCTCTATTTCATTT
-TTAGATTTTTTAAATGGGAAACTCGAATTTAAATGTGAAACATCTGGAAC
-ATTCCAAGAAAAATTCAAAAAAACTCTCTAAGGAGTCGATAACCCTCCCC
-CAATTCCTGAGATGTGACGTCATCAGGGGGAGCCCGTGACCTCATAGCTT
-CAAATTTGAATTTTTCAACGAAAAGTGTGAAATTAGATGTAAAATTACTA
-GGAAATTAGAAGAAAGATTAGAAAAGAAATTTCGGGGGTGTCGCTCACCA
-CCCCCCCCCCCCATTTTTATAGTGTGACGTCATAGAAAGTGGGTCCCCGC
-TACCTTCCATTTTCAAAGTTTTTTTATTTTTCCGATGATTGTATTACTGT
-ACTCACTGTAATTATGTGCAACAACTGGTTGTCCAGTGGAGCACGTTTGC
-TTATACCCATTGTCCGTCACAAATCCATTCTTAATTCCAAAACTTCGAAG
-ACTTCCCTCCGGTCGTTTTTCGACGTCTTCGATGTTGTTTTGGTGCATTT
-GTAGAGAGTATTGGTATCTGGAATATTAAGGGGAAAATGGTGAAAAAATT
-CAGAAATGTACAGGTAATCGAGAAAAAAAGTTAAAACTTTTTTTGAACTA
-AATTTTTTTTTCAAAATTTCAAAAAAAAAATTTTATTTGAAGAACTTTTT
-TATAATGTTAATTTTTCTGAAATTACTTAACTTTTTCTCTCAAAACTTGC
-TCACTGAGTTTTTAAATAGATTTCTGAAATTGTCCACGTGAAGTACACTC
-CCAATATATCAAAGGAGCGCATTTGCGAACTAATTTTATTAAAAATTTCA
-CAAATTTATTTTTTTTAATAACCTAAAATTTCCGCTATTTTATCGTATTT
-TCTAAAATAAATAAAAAATTGTCCAGGAGGAGTACATGGCCAATTTATCA
-ATAGAGCTCATATGCACACTTGTTAAAAAACAAAAAAAAAACTTATTCAC
-CTTGGCGGTGGGTACCGCTTTTTCACACGACGAGGCGAGTTTTCCGAGCT
-GAAAAATGATACTTTTGGCTGGGAAGTTTTAGAATTTTGGGGAAAATAAG
-CATTTCCGGTGAAAAAAATTGTTTTTTATTGGAATAGTTTTTAATATTCT
-AGGCCATGTCGTAAAGAATTGAGTCAAAATTTAAATTTTTGAGGTACGAG
-CTTCCAGTTCCCCCCACAATTCCCCCTATGGCCTAGAATTTCAGAAAACT
-CTACCATCGATTCAAACTCTGTTACTTTTGAGGATAAGGGGTTCCGGACG
-CCCCAAACTTCCGCCCGTGGCCTAGAACTCCCAACTTCTTCCACCGACCT
-GGACGTGGTGCTCGTACTGGCAAAATGCTCATCAACATCTGGCAGTAAAT
-TGTTCAACCGTCTTGGGGACACGGTACGCGGGGTCGACGGTAGACTTCGG
-CGACTGATCGGCGATGTAGGAAGACTTCTGAAAAAAAATCAATCAATAAA
-ACAACGACACTCTGCTCGTGAGGATCCGCCCATTCCGCTTGTTGTTTACC
-AATTTCTTTTAAAAAAATTCTACAATGCGCAAAATTAATAGAACTACCTT
-CTTATAATTTTTTTTTAACTCAAAATTTTCAAAAAAACAACGACACTCCG
-CTTGTAGACTCCGCCCACTTTCCAAAAAGGACAATTCGGAGTGTCGTTTG
-AAAAATATCCTAAAATTTGAAAAATTCATTTTTAGTCTCAAATTTTAATG
-AAAATTACGTGAAAATCTATAACAACTACGACACTTTTGGCTCCGCCCAA
-AAACGTCTTTTGGCTCCGCCCGAAAACGGGGCGGAGCCTGGCACTAATAT
-TACAGTTTTTATTTCCATAAGTGATTAAAAAATCAACAAAAAAATTATTT
-AGAAAGTATCTCAATTATTGAATGAAATTTTATAAAATCTACGACACTCC
-GCTTGGAACCCCCTCCCCCTGCCAAGAATGGGGCGGAGCCTAGAACAAAC
-GGAGTTTTTGCAAGAAAAATATTGCTTGAAATTTTAAAGACATTAATAAA
-AATCCGAGTTTTTAGAAAAAATTGGGCCAAATCGAATAATAAAAAATACG
-TTACTCCGCTAATAAAACCAGCTCATTACCAAGAAAGGGGCGGAGCGTAT
-ACAAACGGAGCGTCGTTTGAAAAAATATTTTTTGGAAAACTAAAATGTTC
-CAGCGGGAGGAAGCTTCTGCAAAGGCAATCTAATTTTTTTCCGGAAATTC
-AATTTCCTCAGGGTTCTCTCTGCAAATTTGTTCACGAAAAAACTCGTGGT
-GCTGTGCAAATGCGCTCTATTGATAATTTCATCTAGAGAGCGCAATTACA
-TCAAATTAGCAATGGAGCGTTGTTGCATACCTTCTCGTTGCAGCGGGAGA
-CGCTGGTGACGGAGGTGATAGCCGTGATGAAAATTGTTGGGGTATCGCCA
-GCGCAACTGGAAGGGAAACACGACGATTCGACATTTTTCTGTAAAAAAAT
-CCATGATAAAACTAAAATTTAAAGAAAAAATAATGTAAATAAAAGTGGGG
-AAGTGGCTAAGCGGGGACACAAATACGCGGGAAATCCGCTTATTTTTGCT
-GGATTTGACGTAAAAATCCGAATCAACTGGCACTCGACGCGTTTTCCAAC
-AAGAAAAAACTAAAATTTCATATATTGGTGGCCTAGAAAATTCGAAAACT
-GTTCAAGCTTACGTAAAGTGTGTATTTTCCATATTAGAGAATAAGATTGG
-AAGAAAAATAAAATATTGTAATTTCTAGGCCACCGCAAAACTTCTAAGTC
-ACCTATGAAATTTCTAGGCTACCGTGAAAATTCTAGGCCATCATAAAAAT
-AAAATTTATATATTTTTGTCCTGAAACTAAGTCCACTTCCGCCAGAAATA
-ATAAAAGCAACAAAAAAGACAACACAAAAAATTGAGAACTCTTAAGAACA
-AAAGAAATCCGACCCGAAATCGAATACCCCACGAAAATTTTCGGAATTTA
-GAAAGAAAAACTATTTTTAGACACTTTTTTTCCTTCAAAAGGAGGAACTT
-TGTTGCGCGGCCTAAAAAATAGAAAACTCGGCCACCGATTTGTTTGCGGC
-CACGGGACACTCCGCAGTTGCAAAGGCTACAGATGCAAATACTGGAAAAC
-TAGGTCACCAAGTGGAAACCTTGGTCATCGCGTGGAAAAAAACTTTGACA
-AAAAATTTTTGAAAATTTTATAAATTTATTCTAGGCCACCACCTGTAAAC
-CTAGGTCACCATGTGGAAGGCTAGATCACCAAGTGGAGCCTAGACCAGCA
-CATAGGCCTCTAGGCCACCACGTAGGAAATTAGGTCACCAACTGGAAAGC
-TAGGCCTCCACATGATAAATAATATTTTTTGGAATTTCGTTTTGACCAAA
-GAAACTTGTTTTTACCAAAATATTTGAAAATCGTTTTCAAGGCCGTCCGG
-TGAAAACTGTGTAAACCTAGGCCACCAAATAGAAAGTCAGGCTGCGACAT
-CTAAACTTAGGCCACCAAGTAGAAAGCTAGGCCATCAAGTAAAAACCTAG
-ACCACTATGCCAAAATAGATGCCTTCTAAAAGTTTCAGGGAAAAAATGTT
-TTTCAACAAAAATTTTTAAAATCGTGGCCGAGTGGACTTTAATAAAATTT
-ACTTTTTCAGCCACGTGGCAGAGGGATATCGGAGCATCGTTTGAATTTTC
-TAATTTCTGAAAGAAAACCGGAACACATTGCAAAAATACGAAAAATATAA
-CTGAAGCTGACATATGAAATGAGTTCTATGCTCCCCGCCGCCTATTCTTC
-TCATTTTTCTGCTTATTTTTGTCGTTGGGGGGATGCTGGTATCATATTCT
-TCGTCCCCTCTTCTTTCATTGCCAGTCTATTCAGTATTATAATTAGCGTG
-TATTCCCTATTGGATTCTGCTCCCCGTCGTTTTTTTTTCTATGCGAAAAA
-AATAGAAAATACGAGGTGAACGGGAATTTTTATGAAAACGAACGAAGAAT
-TTGAGTTTTCTAGGCCACCAAATTGAAACATAGGCCAGCAAACGGATCTC
-TAGTAAAAACCTAAACCACAATACGAAAAACTAGGCCACCAACGAAAAAT
-GGGAGATTCCGCTTGTGTGTTCAAGCATTTTGTAAAATTCTAGATTGTTT
-TAAAAACTTAATTTTTCCAGTACAAAAATCGATTTAAAAACAATAAATAT
-GTCAAACTCGTGACGTTTGTCAATAGAGCGCGTTTGCATGTCAAACAAAA
-CATATTCGGTGTAGATTTACGGGGACACTTTACAAAACAAAAAACCTTCA
-CAAGGCTCCAAATAAGAGCTAGAAAATGGAACAAATTTCCGTTTTTTTTT
-TGTTGGTGAGTGTCTTGTGAGGAGGGGACCGCCCGTGTCTCTTCCAAAAA
-CATTATTAAATTAGTGTGACGTCATCACATTGAAAAACAACAAATATAGT
-TCGAGTTTTGAAGAAAAATTTCGGAATTTTTCTGGTGAAAAAATTTCAAA
-AATTTCAATTTTTTTTTAAATCTTAAAAAATTTTTTTATATATTTTTAAA
-TTCAATGTTTGATCTGAAAACCAAATTTTCACACAAAAAATCTGGTTTTT
-GACGTCTAAATTTGCTTTTTTTCACCCAATTACGAGGTTCTCCGTGGGAA
-GGTGTGTCTAGACACTTGAACTTTTGCTTTTTTATTTTTTTTCTAATTGA
-AAATGATTAAGCTAGATATATTTTCTCTCTTTTCTTAATCAGAATTGTTT
-TTGAAGATTTTAAATTTTTACACTCCCGTGCAGCAAATGCGCTCCGATGA
-GAAGTATGGAAAATTACAACTGGAGATTTTCAAAATGTTCAATTAAATTT
-TGCGTTTTTCTTTTAAAGGTTCAAGAGTCTAGAAAACTACGAAAAGGTGC
-TGTGACCTTATCGATGACGTCATCACAATTCTTGAAAAACTGGGAAAATG
-AGACGATGTGGAAAGAGGGGATTATTTATGCTTAAATAAACTTTTTGCAC
-TAATTAATTCATATAGTTGTAGTGCTTCTTTATATTTTAAGAGAAATTGC
-AAATTTTGCACCCAAAAAAGTAGACGGCCGAGTTATGGGAAAACTCTTCC
-ACGGACACAAGACGTGGAAAACTAAAAGTTTCCGTTGTTTTTTATACGCC
-CGCATGGCACATCCCCGCCCCAACAAAATTTTCAGGTTTTCAGGGTGAAA
-ACATTTTTTCAGCTGCTGGGCGGCTTCTCGTGCAGCTGGAAATGTATTTC
-CAGACGGGTTGGAACCGGGATTTGTCATTCAATTGTTGCAATTACGCTCT
-ACCGCTAAACCTCGTTTGGACTCCACGTGGACAACACGGTGCCTTATTGT
-AAATTTCTCTTCCATCTCCATAATTTCAGAACAAACCGTCGCTTTTATTC
-TCCATAATATTATAATTTTATTTAAAAAAATCTGGAAACATTTATCGATT
-TTTGTGAAAATCTATGTGAGATTATTGACAGAAATACAAGAAAATCGATG
-CAAACATGCTCTATTGCTAAATAGTTCGTGTACTCTACGTCGACGACACG
-ATTTCAAGAGTTTTTCGTTTTTTGAACAAATCATCTGTTATTATTGCAAA
-ATTCGGTACATTACTCAAAAAAAAACAATAATTGATAAACATGTAGAAAC
-ATACATGCAAACACGCTCCGATGCAAATTATTGATTCTCCAACTTTTATT
-GTTAAGTTATCTTGAAAAAAAAACTGATAAAACGAGAAGTCCTTGGTGGT
-ATCGGTCGCCTAGAAACAGATGAAAGAATGGAAAAACAAGTATTACGGGC
-GGCTCCGTTTCGTATTATGGGGGGTGGGCCGCAGATGATCCTTTAGAATA
-AGAAAAATGTCTAGTATTTTGTGATACTTGTGAAATATAACCCTAAACTT
-AAAAAATAAATTAGGGCTCAAAAATGGTATTTTTCTAATGTAAGCCTACA
-AGCACAAAGGTATTCAATTTTTTTTCAATAGCTAAAAAATTAATTTTTAA
-ATTGTGATATCATAATACTTACACAAGTACCAATTTTGTTTTAAACGATA
-GAATATTCCATAACTTTTGGGTAGGATTTTCTGCACTCGAAAAAAACGGG
-ATTTTCAACAAAAATAGTGGACTTTTTAAAAACAACGAAAAAGTTTTGCT
-TGGGACCAAGTCTAGCAGATTACAAAAACTGATTCTTCCAGTCAAAGATT
-TTATATATCACTTAACAATTGTTTTGCCTACCTAGCAAATTCCGAAGTCA
-GAAAAGTTGAATTTCCCTCCAACAATTTTTTTTCATAGTCAGCCAATTTG
-CATTTCCCGCGAAAAAATTTACGGATTCACCACAATGGGTCTCCCACCAA
-TAAAATTAATTATTCATTTATCTTCTTAAAAGGTCACACGAGATGCCAGC
-GACACAGGGCAAGTGCGACCACTATCCCGAAAAAGACACCGACAGAACCT
-AACGAAGGCTTCCAAAAATAGCATAGAAATACAAGAGACACAGAATATCC
-CATGATGTTCTGTCACTTTCAACATCATTCTGCCTTTTTTGTTCCCTTGT
-GTATGGTGACTATAATTTGATTGTTCTGAATAATCTGATGTCTACTTGTG
-TTGTGGACCACTATTGATTTTTGCTGCTTTGGTTAATTTGAGGTAATACT
-TTAACAAATTTGTTTTAAATATCATAGTCATTTTACAAATTTCAACAGTT
-TTCCTATTAATCCGCTAAACCGCAACTAAAAATGAAAAATTAAAACTTTT
-CTCAAAACTGTATGGGAAAGTTCAGTGACGGTTATGATAATTACAACATC
-GTTAATGCAAATTTAACAGGTTTCGCAAAATTATATTCAAAAAATTTTTT
-AAATCGTTTATTACGGTAACAAGAAATGTTGAGAATGCGTATTACACAAC
-ATATTTGACGGGCAAAATATCTCAGAGCGAAAACTACAGTAACTCTTTGA
-ATGAATTCTGTAGCGTTTGTATCGATTTACGGGCTCGATTTTCGAAATTA
-ATTTATATTTGTAAAGTGAAAGCTATATTCAATTTTTCTTCGATTATTTG
-TTGTTTTGTTTTATTGTGTTTTTGTTTTATTTTAATATATTTGTCACTTT
-TCAAATAGAAATTAATATCGAAAATCGAGCCCGTAAATGGACACAAACGC
-TACAGTAGTCATTCAAAGAGTTACTGTAGTTTTCGCTCTGAGATATTTTG
-CCCGTCAAATATGTTGTGCAATACGCATTCTCAACATTTCTTGTTACCGT
-GATAAACGATTTAAAATTTTTTTTAAAACTATTTTTTTAAGTAGAACAAA
-ATTCAGAAAACAACTCGATAAAAATGTCCTAGTCATCCGATTAAAATAAT
-TTTTTGAAATAAATAATATGAAAATTAAATTTTAAATATTAAAAATGTTA
-TTGTTGCTTTAAAAAACGTTATTGGACTTTTCAAGGCGGCAAAAAAATGA
-AAATAAAAATCGATTATTTTTTGAATTGTTGACTTTTCGGTTTTTAAATG
-TTGTTGAAAAGAAACGAATTGTATATACGAATTTCAATTAAAAAGTTTAA
-AATGTTTTTTAAAATGTTTTATTTTTTTCAGATAGATCAACTGAACTTCA
-TAACTTTAAAAAGCCAGTCTGGGATGTATCTATACCACTCTATCAGACTA
-CTCTTAGCACTAATCACAATGTACGACCCCGTGAGAGATTGTTGTCTGTA
-CTGGATACTACACGAGTGGTAGAATATAAAGAAGTGTGGTGACAAGTTTG
-GGATCTGAGTCCAGTAGAAAAAAATCATTCTACCGAAACTCGAAACTATG
-AGCGACTGGTCAAAACTATGCATTTGACGACGTCTACCTGTTTTAAGTTA
-TTGGTGGTGAGTGTGCCTTTGAAGAAGTCGCTCGAGCCTCGACCTTCTCC
-GACTGGCTTGAACTGAAAGATCCTCGGGAATCATTTTTAGAATTTAGAGG
-TGGAGTACCGTCTGTGGATTTTTTTTTGCTCGAAACGATAGAATACAGCC
-CCAATATTCCGAACAGGGGTGCGCGGCAATTGCCGTGTGGCAATAGAATT
-TTCGGCAATTTCGGCAATTGCGGCAACTTAGGCAATTGCCAAAATTGCCG
-AAAATTCACAAAACCGGCAATTGCCGAAATTGCCGATTGCCGGAAATCCG
-AATTGGAAATATAAATTTGATTTTTTTTTGTAGTTTTAAGAGCTTGAACA
-TGCATTTTACTAAACAATTTTCTCTTTTTAAGCTCAAAATGGTTTAATCC
-TTTGAAGATTGACCGTTTTCTTTTAGAAAATTACTGACAGAATATTAAAA
-AACAATGTGACATTTTTCAATTTTCGATATACATTTAGGTTTGAAAATTG
-CCGAAAATGCCCTGCAATCGGAATTTCGGCGATTTCGGCAATTGCCGAAA
-TTGCCGATTGCCGGAAATTTTGAAAACCGGCAATTGCCGAAATTGCCGCG
-CACCCCTGATACCGAATATAACTGTAAAAAATGTATTAATTTTTTTGTTG
-ATTTTTTGAAAATTTTCATAAAAGTAAAGAAAGGGCCAAATTATGTTTGA
-ACTACTAGTAGTCTGTGACTTCATTTTTGGCATTTTTCCGTTTTTCAGCA
-ATAATGATTGGTTTTCTTTGTTCTCTAATTTTAAACATATTTCTTCACAA
-ATGTCTCAAAAATTAACAACTTCAGTTTAAAGTAATAAAACAAAAAAAAA
-AGAAAAATAAAGAAAAACCAGTCAGTTTTTTCAAAAATAATTCAAAAATA
-ATTCGGTCCTTATTTTTTTTTTTTTGCAAAAAAAAACAAAACAAACTCCC
-CTATAAAAATTTTCCAAAAAAAAATTGGAAGGTTTTTTTTATTTCAGCCT
-ATTTTTGGAAGTTGTCGAACTCGATCAAAACATTTTTTCATTGGTTTAAG
-TTTTATTATGCTTGAAATATTCAAATTCCAACATACCAGGCATTGAAAAA
-TCAGTTTTCGTCGCTTTTTGACTCGAAATAAAAAAAACCAAAAATTTTTG
-AAAAGTTTTATTATGATAGAGTCATTCAATTATATTCCCAGTACTTTTAA
-ATAATCAAACAATTTTTTAGAATGGCTAGTTTCAAAATCGGCGGCTTTGT
-CGTTACATATGAAAACATGCACAACAATATGAAAAATAGGTATGTCTTCA
-AAAATATTAAAAACAATATTTTTTTAATTTTACAGATGTTAGCAGTTCGA
-CGAAGCAATGCAGGAACTACAGTTATACAATCAAATTCACGCTTTTTATA
-TATTAATTTTTAAAATCATAAAAATTACAATTTTCATCAACGTTGATCAG
-CTAGACGAATGCATTAAGAAAAGGGAAAACATAGGGCTTCCCAAAACGTC
-TGCCTCGCCCGCCTTGTGGCGACCTGCGCCTGCCTCGTGCAGGCCGCGTC
-TCCAGTCAGTGCAGTGCAGAAATTTTTATTTCAAAATTGTACAAAAACAT
-GGAAAAATAGAGAAGGATAATTTTTTAGGCCTCGGAAATCAATTTTAAGT
-CCTCTAGCTACAAAATGAACCATTTTAGAGGAGTTTCAAAATTGTGAATT
-TTTACAAAAATTACCCAATTTTGCCACTTTTTAATGGTTTTTGATGGGTT
-AAACCTAGATCTTCTGGATAATTCCGCATATATGAATTACCGTATTTCCT
-ATATTAGTTTTGCATGCAAGACTAATTTTCAATTGGTCTGTAGGGGTGCA
-AGACTAATAGAGACTGCAAGACTATTAGAGGCTGCAAGACTAATTTTCGA
-ATGCTATAAAACTCCGAAACGTGACCAATTTTTGATTGTAAACTCAACTT
-GATATCGTTTAAACAACAAAAAATACATCCTTTTCCAATATTTAATCAAT
-TATTTGAACGCTTTTAATCAAAAACTCGAGTTCAATTTGCCCAGAAATGG
-GCCAATTTATTAACGTTGCAGCATCTATGCAAGATATTGCTGGACTGGAA
-AAAAGTCGGGTGCAAGACTTTTAGAGACTGCAATACTAATAGAGGCTGCA
-AGACTAATTTTCGATTTGCCCGTAGGGGTGCAAGGCTAATAGGGATGCAA
-GACTATTAGAGGAAATACGGTACCTGTTTTTGACAAAATTAGACAACTTT
-TTATTTTTGCTCAATTTTTTTTCAGCCATCTAATTACTGTCCTTTTTTTT
-TGGACAATAAAAATAAATTTTCTAAAAGCGTTTGAAACCACTATATTTTG
-CAAAAGGACAATTTTTTAGGGATTGGAGATCAATTTTATGTCCTCTAGCT
-ACAAAATAAACAATTTTAGAGGAGTGTCAAAATTGTGAATTTTTACAAAA
-ATTGCCCAATTTCGCCACTTTTTATTTTGGTGGGTTATACCTAGATTTTT
-TAAATTCAGCATATATGAATTACCCGTTTTCAACAAAATTAGACAACTTT
-TGATTTTTGCCCAATTTTTTTTTCAGCCATCTAATGACTGTTCTTTTTTT
-GGGCAAAAAAAATAAATTTTTCTGCAAACGTACAAAACCATTAGAAATTG
-AAAAAAGGCAATTTTTTAGGGTTCCGATATCAATTTTGAGTCCTCTAACT
-TCAAAAATGACTATTTTAGAAGAGTTTCAAAATTGTGATTTTTCTGCCAT
-AAATTGCCCATTTTTGCCACTTTTAATGGTTTTTGGTGGGGTATACCTAG
-ATTTTCTGAATTCTGCATATATGAATTACCGTTTTCGACAAATTTAGACA
-ACTTTTTATTTAAAAAATTAAAAAGGATTAAAGGACGATCCGTTCTTCAA
-GTGCTATGCACTGCGGATCTGGGATTCAGGTACACTGCCTGGTGGTGATC
-CCTCTGGGCTGTAATTTAAGCCACGTCCTAGCCGAGGACTGTGGCCGATA
-ATCCAGTCGTGGATTGCTCCACTTCCCAATAGAGGCAGGGTGAACCTAGG
-GGGTGAGGCCGGACTTTTATCTCGTGACCTCCAGACTGCTAGCGGCCACC
-ACTACCGACTGAGCTATCTGCCCCCCTTGGGGAAAAAAATAATTTTTTTT
-TTTTTTGGGCAAAAAAATAATTTTTTGGAAATTGTACAAACCAAATATTA
-TATATTAAAAAATATTATCCAAATATTCCAAATATTCCAAATATTCCAAA
-TATTCCAAATTCCAAATATTCCAAATATTCCAAATTTATTCCAAATATTA
-TGAAAAAGGCCATTTTGTTAGGGCTGGGAAGTTTGAATTTTTACAAATAT
-TGCCCAATTTTGCCGCTTTTTAATGGTTTTTGATGGGTTAAACCTAGATT
-TTCTGAATTCTGCATGTATAACTTACTTGTTTTCAACTAATTCAGACAAC
-TTTTTATTGTTTTTTTTTCAAATTTTTTCAGCCAATTAATGACTGTCCTT
-TTTTGGGCAATTTTTTTTTTGAAACAAAAAAAAATTAAATTAAATTGCCC
-AATTTTGCCACTTTTTAATAGTTTTTGATGGGTCCCGGAAACCTAGGAAA
-CCTAGTCCCGGAAAATCGAAAAATCGAAAAAAAATTTTTTGAAAATTTAC
-CAATGAAAAAAAAAAGACTCAATTTTCTTCCAAAATAAAAAAGTGGGCAA
-AATTTTAAATATTTTTCGAAAAAAAAACATAACTTTTCAAAAAATTTTTC
-GATTTTCCAACAAAAAAGTGAAATAAGAAGACATGCAGGTTACTGTAGCT
-GATAAAGCTTCAAGCGTACCAGGACCCGAAAACCGCCGCCCGCGTAAATC
-GACATATTTAATGTACCATCAATTTGATCCTCCTCTTCCTCCTTCTTTCA
-ATGACACCACACAACTTCCTGTTATGAAGGTCTCAATTCCCCTTCATAAC
-ATTCTTTGTAATTAATGCACCCTAAACAAACTGTGCAAACACACTTAGAC
-ACCCCCCTCCTACACGGTCTTTGGAGTTCCCCCGCTCAACTCTAATGGAC
-CTGGTAATCCCTTGCGCGGTGGGATTTTTCGGGTCTCGCCGCGATTTTTA
-TCCGAATTCCGGAATACCGGAAATGGCGTGGAAATCGATATTGCAACAAA
-GAAAACTGTTTTATTTTCAAAAATCCGCTCACTTTTTTTAAAAGTGATCT
-TTCAATCATTTTTAAAGTTTTTTTTTTTGAAAGCACGCGTTTCTGGCTTC
-CCACATATTTTGGAATGTAAGAGATTGCCGAGTTAGGCCATTTGGACTCG
-GCCACGGCCGGGGTCGATTCACGTAGCGGCTCGGTTTCTGTAGAAAACTA
-AATGTATTTGTCCGTATGGAGTACACAAGCTTTTCCAGGCGTTATCCGGC
-AGGCGATAGAAGCCGCGACGCAACACGCAACGCGCCGTAAGTCTACCCCG
-GCCGTGGCTGAGTTATGATGGCCTAACTCGGCAAACTCTTGCATTTGAAA
-ATATGAGCGAAGCCAGAAGCAGGTGAACATGGATTTCTGGCTTCCCTCAT
-AAATTGAAAAGGGAGAGTTTACCGAACTAGGCCATTTTGGCTCGGCCATA
-TCTGGGGCAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGTTTTTA
-GTTGTAAAACTGAATGTATTTGTCCGTGTGGAGCACACGACTTCCCCACG
-CGTTGTCCGCTAGGCAATTGTTAATGGAGCGCGAAAAATTCAATGAGGAA
-GGCCAGAACCCCGTGTGTGATTTTTGCAACTACAGCCCAAAATTTGAACG
-GGATTAATACAAATTTAATTTGAAATTTGGATTTCGCAATTCAAAATTTG
-CGAAATTAAAATTTCGAAAACCCGAATCTCATCGAAATTAAATTCCAAAG
-TTTTCATTCAAATTTCAATGAGGTCTCTATTGAGCCGAATTCCCGCGCAC
-GGGAGGTAGTGGACCCCTTTTGTATGTTTAGGGGTACAAAGACCCCCTAC
-CACCCCTTGTATATGCACAATAGAGAACACTCAAGACCCGCCCACCCTAG
-GCCCCTCATCCAAAACATATCCGAATATACCCTCTACTGTACTTTATTTA
-CTTGCTCCGTTTACCCGGGTACCAGGGTACTCCCTAAACTAACTGAATTT
-CCAAGGTGGTGGCCTAGAAAAAGCTCTTCCACTGGTTTTTTTGTGGAAAG
-AAATGATGAAGGTTCTTGTTGTTTTATTGCTTATGGTAGGTTTTTTTTGC
-CACGTGTCCGGAATTTTTAAAACTATTTTTCTATTTTTTAAAGGCCCAAA
-ACTTTGTTTTTTTTAATGTTATCGTTTTTTCGTGAAAAAAATTATTTCAG
-AAAACGGGGGTTTTAGGTTTAGGCTAAAGCGTAGGCTTAGGTTTAGGCCT
-AGGCTTAGGCTTAGGCTAAGGCTTAGGCTTAGGCGTAGGCTTAGGCATAG
-GCGTAGGCTTTAGGTTTAGGCTAAAGCGTAGGCTTAGGTTTAGGCCTAGG
-CTTAGGCTTAGGCTAAGGCTTAGGCTTAGGCGTAGGCTTAGGCGTAGGCG
-TAGGCTTAGGCCTAGGTGTAGACTTCGGCTCAAACATAAGCTCAGGGGCA
-AAAAAAGGAGAAACTCCCACAAATTCCTAAAAATCCTGAAAATTTTTTTA
-AATCTTAAAATAGTCAATTTTCAGTGGAAATCACAGTGAGCATTTTGAAA
-ATCCAATAATTTTCAGGTAAATTCGACATTTTCGTTCGGATTGGACAATG
-AAATAATCGGTGAACCAAAGTTACAATGCAATCCGGAAAGTATTACATTC
-TCCTTCAACACACGGAATCCGTTTATGTTAGTCTTGGGGTCTCGACACGA
-ATTTTTCCCGCAAAATTAGTTTTCCACGCGTGAGTACACCGCAAGTAGAG
-CGCTTATCAATAAATTATAAATTATCAATAGAGCGCACTTGCCCCCGGTG
-AATTTCAAAATTTTCAGAGGAAACGTATATATTCGTGGCTTCTACCGAAC
-ACCCGGCTGTCGTCGGCAATTCCTCGCACCGAATCAGGCTGGCGGCTCAT
-TTACGGTACGGCTCGGCGATTGCGGGATGCGGCGGTCCCGACAAATCAGT
-GGACATTCGCCACGTGGCGTCAATCAGCACATCACTTTTGTTGCGAACTT
-TCATCCGAATCTCGCGACGAAAGAGGAACGATCATTCAATATTCGATGCT
-TTTATGCGCACAGTGAATCTGTTGTCAAAGCTGATCTGGATGTCAGGTAG
-GGATGCAAATCGATAAATTCCCCGAAAATCGATACATTTTCCAAAAATCA
-ATAAATACCCAAAAAATCAAACAATTCCCAGGAAACTGGAAGAAAATTCT
-CAGAAAATCAATAAATGTATTTGTTTTGCAGCTCAATGCCGGAGGAATCG
-TTCGAACAGGGTGTGACAATCGTGCCCCAATGCACATATTCCCTTCGTGA
-AGGGACATTTGAGGGCCCAAAAGTGTCGAATACACGTGTCGGAATGACAA
-TTGTTCATCGATGGGACTGTGATACATCGGGGAACTATGGAATACTGCTA
-CGTGGATGCACCATACTCGATTCACGTGGTGTTGAATCTTTTCCATTGCT
-TGATGAGAATGGGTAAGAGTAGGGAAGTGTCGGCCGCTAGAAAAGAAAAA
-TATATCACTAGAGCACGTTTTCTAAGCATTTTTCTCAATAGAGCGCGCTT
-GCTCAATTCCCTAAAATAAATTATGGTGCATCGAAACGTGTTTACGTACT
-GATAGAGCTGTAGTACTCGAGGAAGCTGAAAAAAATAATGAAGAAAGTGA
-AAAAAATCAAAAGTGTGAACACAGCAGCCTTGTCAGATAAATTTCAAAAA
-TCTGTGCATTTGGTCGTAAGTTATGGCGCATCAAAAGTTTTTTGAAATTC
-TCAATAGAGCACATTTCAAAAAAGAGCGATTTTCGCAAAGCCCCTTTCTT
-CGTTGTTTGATTTAAAAACAATGCAATTTCGTTTATTTCGCAAATTTTTG
-AAAAATGAGTTAAATTTGCAACAGAGCGCGATTGCACACACACACACACA
-CACATCAAACGTCAGAGACCCCACTGATTTTGGAGATTAAATTACGGTAG
-ATAGAGAATCACAAGGAAAACATCACGAACTTTGTTCCGTCAATTCCCGT
-GGTGCTTGTTATCATCAGAATGCAAAATTTGAAAGTCTGAAATTAAGCCG
-TTTCCGCTAAAACGTAGCGAATCTCATTCCACCGAGTCTATTTTCGTGAG
-GTCTCCAATTTTTCAAGTCTCTGCTCGTTATGGTGCATCGAAGGGTAATT
-CAAAATTTCAAATAATTTTTAGACACTTTTCGACCAGTTTCAAATTTTTT
-TTATGGTGCATCGAAAGAATTTTGCGTAATTTTCAATAGAGCGCGATTAC
-TACTCACCTCTAAATTTCTGCAAATTCTTTTTCCAGATGCTCAGTGTCCC
-GTGACTTCCCACAAGTGGTATATCTCCCATCACTGACGTCAGCCTACATG
-GCAATCGAAGCCATCTCATTTCCTGACCAACCATCGATTTCTTTCTCGTG
-TCAAATTAAGTTGTGTGATAAGGGAAGTGATGAGTGTCGGGGTATGAGTC
-CCCCCGCGTGTACCCCATTGACACAGGTCCCCATCACGGGACAAGTACCA
-ATGCCATTTGATAATACAATTGGAAATACGTTTGGTGAGTTATTTACGGC
-CGAGAAAACCTGCAAAAATAAAAGTTCAGCCACCGAACTTTTTGACATTT
-TTGCGCAACTGTATGCCGCACAAAACTTTACGTCAGAAGTGGGCGTGTCC
-GCCTGCAGGCCCCGATGTTTTAGATGTAAAAAATTAGATGTTTTAGATGT
-AAAAAATTGAAATTTGAATACAAAAAAAAATTCGGCCACCGATTTTTTTT
-GCTTTCACGTTTTGTCAATGCATTTCCAATTTTTTTCGTGAAACGTTTTT
-GTCAGAATTGGGCGTGTCTTGTAAAGTCCCGCCCAATTTATGGGCGTGGC
-TTGTTTCGACCAAAAATACTGTTTTTTTAACTCACAAAAACAGAGCTATA
-AACTTTTTGAAAAAAACATCCCTGTCCTCTCCTTTCTCCATTCTAAAATT
-TGAATTAGATGGCCGTGAAAAACCCCGGCCGCGGTCTTCAATTACAGTGA
-AGAATTTGGCGGCAGAGCGCGTTTTCACAGTCTTTTTTTGTCGTCACTGA
-GCAAACTTCAACTGCTTCCAGCCAGAAATTTACAAGCAAATTCAAATTTT
-CAGACGGAATCCCACTGGAGCCGTGGATGAAAGAGCCCTCTCCTCCCACT
-GATGACGTGGCAAACATCACCTCAGAAGGCGAGCCAATGCCTCGGCTCAT
-CACCGAAGAGGAACAATATCAAATCGAGTCGAACCATGTTGAGGCGCGAG
-AAAAACGATTTGCTCATCGATTATTCAATATCACATCGGAAGATCTCTAT
-GTTGAGCCAACCGTCGAGCCAATGGAAGTAGAGATGCCTGGAGCACCGAG
-AGAAACTGCTCGGAGGGTGTCTGAGCCATGTGTCTCGGTTGAAACTTTCT
-ATATTTCGGCGCTTGCTGTACTTTTCGTTTTTGTCGTTTCGATTGGGATG
-GTCTGTTTCTTCGGAAGTCATATGCTTAAAAAGTTGGTTTTTTATTGATT
-TTCCTCCCACAGGGTTCTGACCTTCCTCATTGATTTTTTTGCGCTCCATT
-GACAATCGCTTGTCGGAAAACGCATGGGAAAGTCGTGTACACGGACAAAT
-ACATTTGGTTTTACAACTAAAATCGAGCCGCGCCGCAACACGCAACGCGC
-CGTAAACCTACCCCAGCTATGGCCGAGTCAAAATGGCCTAGTTCGGCAAG
-CTCTTTCATTTCAAAATATGAGGGAAGCCAGAAATCCATTTCCCCAAATT
-GCAAGATATTTGTGGCGTGGCCGAAGTTTTCTAGTTTCTCGGCCACGTTG
-TCAAAATTATTTTAAAAAATCGCTGGAAACACTAAATTTAGATATCTCCT
-GTAGATTGTGATTCGCGGAAAAATTCCATGAATCTCGTTCTCCCAGTTTT
-TTTTTTGTAAATTCAACAAATCAAATGAGCGCCAAAACCTCACAAATCTC
-ATACTCCCAAAATTTGCGTTCCTCTTTTTCTTGAGGCCTCCTCTTTTCAC
-TGTAAAATTTAAAAAACTCGTAACTTTTTCTTCAGAGCGCGATTGTACGC
-ACAGAAAGTCTTTAAAGTCTGAAAATATTTTAAAGTTCCCCAAAATCCCA
-CAAGTCTCATTCCACCGAGAGGTCATTTTCCGTGAGGTCTCTTTCTTGGG
-TCTCGACGCGAAAATACTGTAATTTTATTAATTTTTTCAGAACTCAAGAC
-TGTGAAATGCCGATTCCAGTCCCAGAAGGATATTATCTAAGCAAACACTG
-AAACTCTTGTTTAAAAGTATTCGTTTCCCATCCACGTGCCATAATTCTTG
-CATTTTCTTTTTTTTTCCCTATTTTTATTCAATTTATTTACAATTTGTTC
-AATAAATAATCAATAAATAATAATTAAAAATAACATTAAAAGTCACATTT
-TCCGAAGGAACCACGCGTGGAATGTAACGGTGCCGTTGTCGAATGGTTCC
-GGCTGAAAATTGATTAGTTATCATTGGAGCGCAATTGCATTTTTCTCGAA
-AAATCGATGTTTTCGTGTGATGCAGAATTATCGATTTTTTTTAACTTGGT
-GGCCGAGAAAATGGAAAACTCAGTCATCGACTTTTATTTACCTGGAACGA
-AAAAATTTAAAGTATGATCACGCGCTAAAGCCTCAATTATGCAAAATGCT
-TTAAAAACGGGTTTTGGAATTTTCTAGACCACTGGTGACGTCACTCCTTT
-TCCATTTATTATTCTAACTGTTTTCTAGGCCACTGATGTCGATATTTTTC
-CACTGCTGGGTTTCTAGATCGCCTGCGACGTCATTTCTCTTCCATACCCT
-GCTCTAGCGGGTTTCTAGGCCACTGGAGAAATTATTTTTCTTCCAAAAAA
-AAATCTAGGCCATTAATGACGTCATCATTTTTTCTTTTCTTTAGGATTAC
-CTCAGGTTCCTCATATTTCAGATCCATCCTCGCCAATCGTTCATTCTCAT
-GAACTTTTTCCACTTTTTCACTGCTCGTACTCTTCTCATCTACTGTATCC
-GCCACCACAACGTCCGGAGCAACAACTTGCTCATCAATATGCTGATATTC
-GGGCTCCTGGCGGTCCCAACGTGGTGTCTCTGGTGCAGTTTCATATTGAT
-TTTGCTGCTTCTCCAGGAGGTTCTGTATTGAACTGATCGCTGAGGAGGAT
-CCAACGATCGGAGGCATCGGAGGCGGCAGAGGAGCCATAGATGGAGTCTG
-AGAAGCCATCATTTGGAGTTGGGGGTAATTCCTTTGTTGGGACATCTGTG
-GGGACATTTGTGGGGACATTTGAGGGGACGGGGACATTTGGAATACCATC
-GGAGGCATTGGAGGTGGTGGGGGTGCCGGAGCCATTCGTATCATTGGAGC
-CATCACGTAAGATGGTGGAGATGGTGGGAGACTGGAATTTTTTTTTTGAA
-TTTTTTTTCATAACACGGGCTTCTGGCCTTCCTCATTGCACTTTTCGCGC
-TCCGATGATAATCGCCTGCCGGACGACGCGTGGAAAAGTGGTGTACTCCC
-CACGGACAAATACATTTAGTTTTCAACTGAAAACCGAGCCGCGACGCGAC
-ACGCTACGCTCCGTAAATGGCCTAATTTCTTTTTTTTAATCTTGAGTTAA
-AGTTTAATTTTAATTATTTCTACAGAATTGAATGGCTGGGAATGTGCCAC
-GTGGCCGAGAATTCTCCTGCGTGGCCTAGAAAATTCAAAAAAATATTTTT
-TGGTGGTTTTGATTACAAAATAAAGGATTTATACGGATAAAAACCTATTT
-TAAAAGCCGTGAAAAAAATCATATCAACCACTGCCTAAAAGATTGAAATT
-TTTATGATGGCCGAGAATTCTCAAGTGTGGCCTAGGAAAAATCAAGGCTT
-TTGAAAATTTGCTCATTTCGAAAATTAAAAAAAACAACTCAATTGATAGT
-AAATTTTAAAATTAAAAATTATTTTTCTGGTTTTTTTTTCTCAATTTTTG
-CAAAATCAAAATTATAATCAATTTTTAATCCAGAATTCGTCAAGTGGCCT
-AGAATTCTACTGCGTGGCCTAGAAAATTCCACCAAAATTTAAATTTTCCA
-AATTGTAAAAATGCTCCAAAAAGTTGAATGGTGGCCGAGGTTTTTCGTTT
-TTCACTTTTCACAGCTACGGAAAAAAACTCGGCCACCAATAGTTTTTCCT
-AGGCCATGTTTCAAATGCCCTATTTCTATGTTAATTACAGTATTTTCTAG
-ACAAGATTTTAAAAAAACTCACGAATAGCACATGGAGCTCTGACACTTGC
-TCCCACCAATACAAAATTCCGAATTTTTTACAAAAAACTGCAAAACTATA
-AGAATTTGTGGTAGAAATTGGGGCATTTACGTAATAATAATAATAGAAAA
-ATGTCCGCAAATTTTTTTTCATAAATTTCATAGGGAGGAGGTAAGCTTCA
-GCTAGAAGCCATTCAATTTTATTGGGGCGCCGAAAATCTTCGGAACACTT
-TTACAATTTATACAGTAGTGTACAACTTTTACAACTTAATAATATCTTCA
-ATACTTCCAGAATATTCTTCTTTTTCCTCCTCAATTGCCACGTCATCATC
-TTGTAATCTGGTCCATTTTGCTGGCGAGGCGTCGGCAAACAGGCAGAATA
-TAGTATTTACGAAGAGAAGTAAGCCCGCATGCGCCAGGAAACAATTACGC
-CAGTCTGTGAATCTGAAAAAAATAATCTTGTCTTTTAGGGGACCTACGCC
-TGCCTGCCTACGTCTGCCTTGCAGGGGACCTTTGCCTACCTACTTGACTA
-CCTTCAAGTGAGACCTATGCTGGTTTGCCTGCATTTTTGTCAGTGCCTTC
-TAGGCCTATGCCTACCTTACAAACTATGTAGGTCAACTGCCTGCTTTCAA
-GGTGGCCTAGGTCAGCCTACATGCTATCTACGTCTACCCCAATGTACCCT
-GTGCCTATCTACCTGCTTTTAATGCTATCTGCCTTTTCGATAGTCTTTTA
-GGGAATCTACGCCGGTCCAGCTCACATAGGTTATCTATGCCTATGCCTTC
-CTGCCTGCCTCCAAAGTGACCTACGCTTACCGTGTTTTTTTTTCTAGACC
-GTATATACCTACATGCCTGCCTTTAAGTTTACCTATGCCTGCCTGCATTC
-CTCATGCCTGCGTGCCTACATGAATACCCTAAAAACTCACGTATCATCAG
-TAACAATCATATTGACGAAAAACGGTTCGATGAATATCGTGCAAGCCCAG
-ATGTTCATGATCTGGAAGAGAAATCGTTGGCCTAAAAATTTTCTCGGCCA
-CCCCCTTACCTGCTGCATTGCGAAATAGGCGTACTGCTGGGAGTGCAACG
-TGGCACACTTGTTGAATCCCGCCGTATTGCACCCCATCACACTTTCGGCG
-CAAATCTGGAATGATGGAAGAGAATAGGAAAACTAGGCCATGGATGTATG
-TGCGCTATGTTGATAATCGGTTATTTTCAACGTGGATTATCAATTGAGCG
-CACTTGTCCCACTGGAAGAGTTTTCCTATCTAGGCCACCACCACCACCCA
-CTCACCATTATAATAATAGCCAGCAAGTGTTTTTCCTGTGGAATAAATGC
-TAGAACGATGAAAAAAACGGCGGCCACGGCCAGAGCGATTGTGTTGAAAA
-TTTTAGTTTTCAGAGTTTCTGAGATGAATCTGGAATATTGATTTTTGGTG
-GCCGTAGAGAGGAAAAACTCGGCCACTGATTTTTTTCACAATTATAAAAT
-TATTTTTCCAGGAAAAACCCCCGAAAAACTCACTTAATATAATCACTAAT
-AATTCCCGACGATAATTTCGTAAAAAATTGAAAAATAATGGGTAAGGCGG
-CCAAAAAACCGGACGAAAGTACGTCATAGTTCAAATAATTTTTCATATAT
-TGCGGATTGAATTGGGATACCAATTGAACTGTTATCAAATCTCCAAACGA
-TGCGATCCAACAAGCCCACAGGCTTAAACTTGTCAGAATATGACGGAATG
-GAAGATTTTTTGGCCGGGATACCTGCAAAACGAAAAAGTAACGGGCTTCG
-AATTTCCCCCCCCATGTTTTCAAATGGAAGAGGTGGCCGTGAATAAAGCT
-AACCTCGACCGGGGGTCGCGACTCGCGACAAACGGGAAAACTCAAAGAAA
-TTTCGTACTGTCGCTACTTTTTTTGAGTTTTCCTGTTTGTCGCAGGTCGC
-GACCCCCGGTCGAGGTTCGCTTTTTTCACGGCCACCTCTTCCATTTGAAA
-ACATGGGGGAAATTCGAAGCCCGTGAAAAGTTAGGCCATGCAATGCGATG
-TGGTGGCCGAGGTTTTGAAAACTCGGTTACTCTCATGTAAAAAATCTTGA
-AGTTGAAGCAAATTTGCGTACATGAAACCCATTTACCTTGCTAGCAGTTT
-TAGAAAAATTTGGGATTTTCTCATACTAATGAGGGAACGTCTTAATTGTC
-GACAAATTGCGTACCCCGAGGAACCCACTAATTCAGTCCTAGGTTTAGGC
-ATAGGCTAAGGCATAGGCTTAGGCGTAGGCCTAGGCTTAGGCTTAGGCTT
-ACACGTGGTGTCAGAGTGCCTCATTTCGGCTTGATCTACGTAGATCTACA
-AAAAATGCGGGGGAAGAGCCGCAGAGTTTTCTACTGATTTCGCATGGTTA
-AGAGTGTGCTGACGTCACATTTTTTGGGGCAAAAATTCCCGCATTTTTGG
-TAGATCAAACCGTAATAGCACAGCCAGGCACCACGTGCGCTTAGGCTTGG
-GCTTTCCGTAGTCCTTCGGGCGCGTTTTTCTCAAAAATGATACGTGGTAC
-AATTTCAGGTTTTTTTCCGCTCCAAAATCTAGTTATAATTTGTGTCCGGT
-AGAGCGCGTTTGCACTCACTTTCTTTCCCGATTTCCCTTCTCGAATCCTC
-TCCAATTCCTTCTCGCCAACCCAACTGTGCTCACTCGGCGAGCACTTGAA
-AAATAGGAAAAACAGCGAAAAAGTGACCAACGATACACCGGCGTGCACAT
-AGTAAACCGACGTCCATCCACCAGACGAAGAGCATAACCATCCCGAAACT
-GGCATTGTAAATATATTTGAAAGTTGTGTATTTCCGGTTAATAGGCCAAT
-GAATACTCCGTGCTCGTATGGGGTCGCCCAATTTGCTGTAATTGAGCCAG
-CGAGGGGAAATGTGGCTGAAAATGCCATTCCTTGACAAATACGGGCGGCC
-ACAAACCATCCGTAGCCAATGGTACTTGCCAACGGGATAAGGGCTGTTGA
-AACTGGAAAAATTGAGTGCAATACATCATATTTGACGCGCAATTTTAAAA
-TTTAAAAAATGGAAACGCGCTCTAATGATGCTTGGTGTACTCCTCTCGGA
-CAATAAATGTCAATAATTTTTGAAAAATCGATAATTTTTTTTTAATTTCA
-GAAAAATTCGTGAAATCTGTTTTATTTTGCGCGTAAAATATGATTCTTAA
-ATACTTAATTCAGTATTTTACGCACGTGGTATCAGAGTGTCTCATTTAGG
-CTTGATCTACGTAGATCTACAAAAAATGCGGGAGAAGAGACGCAGAGTTC
-TCAACTGATTTCGTATGGTTAAGAACGTGCTGACGTCACATATTTTCGGG
-CAAATAATTCCCGCATTTTTTGTAGATCAAACCGTGATGGGACAGCCTGA
-CACCACGTGCTTACGCGGAATTTTTCACAATTTTTTGTGCTTCATGCACC
-ATGTTTTTGTTTCGAAAAATCAGATTATTGTTTTGCGCGTCAAATTCAAC
-GCCCACTGTGCAATACACCATATTTGACGATCAATTTCAAAAATTTTGTA
-TGCTTTCGATGCATGCTTTTTGGGGTACTGTAGCTTTGAAAATACGCATG
-CACTGGATCTGACGACAAAATGCACAGTTTTTATAAAATTAGTCTATAGA
-AATTAGTCAGTTTTCTCGAAACAAATAAAAACTACAGAAAACTCGGCCAC
-CGATATTTTTTTTTTTCGCGGCCACGATTGACGTCATACCTCCCGAAATA
-ATTCCGGCGACAATGAAGACAGGTTTATGCGGCAAATGTTGAAAAGAAAT
-GGAAAATGGAATCGAGGCGGCAAGACTTCCAATAGCCACACACGATTGAA
-GAAAATTCGACTCTGATTTGGTATAGTTCACTGAAAAAATCAACTATTTT
-GGCGGCCGCCAATGGAAAAACTCGGCCACCGAATTAAAAAAAAAACCTTT
-TGAAGTTGAAGTACTATTATCATCTTGCATACAAATTTTTGTAAAATTAT
-AAGTATTCATATTTGAAAGAATCGAGGTCAAACACAGTGTGGCACATATT
-AAAATCTGCAAAAAAATCGTGAAAATTCAATTTTCCGGGGGTTTTGAGTT
-CAAAAAGTACCAGAAATCGGACAGGAACCGGCGAGTTGACCATGGTGCAT
-CAGAAACCGGAATTTTAAATAAGTAAAAAAATTTATGATGCTCGTGGTGA
-TAACGAAAAGTGCAGTGATCAATTTAAGGGAAATACTGCTGGGGGATTAA
-ACGTTGACACTGTCAACTTGATAGTGTTAATTTGATCAATGCTTTGTACT
-TGTTTTTTGCAGGAAAAATTCTTTGAAAATTGCAAGACTATAGTATAGTC
-TGAAAATTTGATGAAATCTAAAACTTTAATAAATACCGTTAATTATCATT
-ATTTTTATGAAATTTTAATATAATCTACTTAAAATTTAATTTTCTAGGCA
-TCTGTGAGCTTAAATTTTCGATTATCCCTCGCCAAATTAAAGATTTGCAG
-ACTTTTAAGCTTATAAGCTTATTTCAGTGAGAGAGAGCATTGTGAGAAGA
-GAAACGCAGACGAGGCTGGCGCGTTTCTCGTGCTCTGACGCGAGTCTCGA
-TTTGCTTGCGCATTTCTCGTGCGCGCGACGTTCATTTTATTTTTCCGATT
-TTTTTTCAGTTTTTCTGAACTTTTCTTCTTGAATTTGTGATTTTTTATTT
-ATTTTTCACGTCTTGTTGCAAAATAACTGATTTTTCACACAAAATATTCG
-AATTTTCAGGTCGGCAACATGGGATTCTTGTGGAAAACTGCAAAACTCGG
-AATTAAAGTTGGACTCGTCGCCGGCGCCGTCAAACTGTCAATCGATAACG
-ATATTTGGTCGACTAACAATGTTAAAGTATTAGTTTTCCCCCGTTTTTCC
-ACGAAAATTTTCATTTTCAGGGCAGCGAACTGTATCAAAAGCTTAAAAAG
-TACATTCTTCCCGGCACCGTCGTCTTTCCAGAGCAGGTTTTATCGATTTT
-TTCTCTGAAAATGCAATTTTTTTCTTATTTTCAGCTCCCAACAGTCGAAG
-ATGTGCAGCTGAAGGCCGGTGGAAAGTGGAACAGTGCTGTTGACTCGGTA
-GGCTGCATTTTTGAGAGGAAACACGGAAAAATTGCTGCGAAAGTTGGAAA
-AAAGTCCTGGAAAATGGAGATTTGGCGCCGAACGTTCAAGAAATTCCATA
-ATTTCAAAAATCTATCTGAAAAATTGAAAAATATAAATTTTCAGTCATTT
-TTAGTCAAATTTCAGAGCTAAACGTCGAAAAAAGTGCCTAAAACTAGGAA
-AAATATGACAAAAAGACACAAATTTTGGAGAAAATTGCTGAAAATAATGC
-AAAACACTTTTTTTCACAAAAAGCGAAATTCAAAAAAAATTCCACGTCAA
-AAATTAACCAAATGCAAGTACGCTCCATCGCACTTTTTTCCAATTTCTGA
-CTCGAAAAGTCTTAAACTTCTGGTTTTGTAGGAAAGATAATGCAAAACGC
-AATTTTTAGTCCAAAATTCAGAGAAAATTCTGAAATTGTTTTTAAAAAAA
-ATGCAAGCACACTCCATGGCACTTTTTTTTCAAAATTTCGCGTAGAAAAT
-TACAGACATTAGCAAAATTCCGACGATTTCGCTGCGAGACCAGAAATATT
-GTAGGAAATTCAAACATTATCCGAAAATAATGCAAACGCGCTCTATCGCA
-CTTTTCTCCAAGTTCCCACTCAAAAAGCATAGAAAATACCTGAAATTGCC
-GTTTTTTTTCACCGGAATTTCAAATTTACGCGATTTCGCTGCGAGACCCA
-AGCTAGTGCAGTGGAGCGCATTTCCAACAATTTCAAACTCAATTTTTTTC
-AGGTATTCACCACAATCGAGAACGTCCCATCAAGCGTGAACACAGTGGCC
-AATCGACTCATCAATAATAAATAAATTCCCCATAAAAATTATCGATTTAT
-CGATTTTCCCCCCGAATCCTCGTGTATTCCTTCGTTAGAATGTACTTTTT
-CCCTCCTCATTTTCTAGAAGTATTTGTGTGTGTGCTCTATGAAAAAATTT
-GCAATTTTTGACTTTAAACGGACGGTGCATTATATTATTTTATCAGTTCC
-CATCGTTGATCAATTTTCTCCACTGATTATCAATTCACTGATAAGCTCAC
-ACTGCCTGCCCAACTCAATTCATCGCAACTTCTTCTCCCTGCTTTTTTTT
-GCCATGAATTCGACGGTGGCTTCCCGTTTCTCATGGGGACTCATTCTGGC
-GTCGATCGATTTTTTGGCGTGCCTACTGTTCGCCTGCCTGCATGATGGAA
-CTTTCAAATTCGCGAATTTTACTTCGCAATTTGGCGATTTTTCGTTTTTT
-ACGAGGTTCGATTGATTGGTGGCCGAGTTAATTTTAGGCCACGAAAAATG
-AAAATTGAAGCCGAGTGTCATTTTCGCTGGAATTCTAATTTTCAGTGTGT
-AAAAATATAGAAAACTGCAAAAAATTTTGAATTCCCGCCAAAAACTAACG
-TTACGAGACCCAAGTACAGTGGAGCGCAGTTGCAAAAAAAAATTTTTAAT
-GATTTTTTGCAACTACGCTCCACAGTCCTTGGGTCTCACAACGTTGAAAC
-TAAAATTTTGGAATTTCTCCCATAACTTCTTATAATAACGATATTCGGTG
-GTCTCGACACGACATATTTTCATTAAATAAAACGGGTGTGCGCCTTTAAA
-GAGTACTGCAGTTTCAAACTTTAGTTGCTAAGCGTATTTTCAACAAAGCA
-ACGAAAATTTGAACTTACAGTACTCTTTAAAGGCGCACGCCCGTTTTTAT
-TAAAACAAAAACTTGTCGTGTCGAGACCGGGCACCGTAGTTTTGACGCTA
-AAAATAAGATTTATGAAAAAGCGGGTTTCCAGAAAATTTCACTTTTCAAA
-CTTTGATGAAAATTTGAAGTTTCCAGCCAAAATCGCTGCGAGACAGTGGA
-ACGAGTGCAGTAGAGCGAAATTGCTGTAAAATTTTGAAAAAAAAGTGAGA
-AATTTAAAAACACGGATTTCTGGCCTCCCCCGTAAATTGAAATGGAAGAG
-TTTGCCGAACTAGGCCACTTTGGCTCGCCCATATCTGGGGTAGATTTACG
-GCGCGTTGCGTGTCGCGACGCGATTTTAGTTGGAAAACTAAATGTTTTTG
-CCCGTGTGGAGTACACGACTTTCCCACGTGTTGTCCTCTAGGTGATTGTC
-AATGGAGCGCAAAAAATCCAATGAGGAAGGCCAGAACCCCGTGAAAAAGT
-ACGCGTTTTTGAAGCAATTCATCGAAAGAAGACAGTAAAAAAAAAGTCAA
-AAATTCAAATTTCCAATAGAAAAACCACCAAACCCAACAATTTTTCCAGC
-ACAATCGACCTATTCTTGCTGCAATTTTTCCGTTTTGCACTATGGATGGT
-GCCGGCGGCAATCCACGTGGCCAACAAGGCGGACACGTTGACAATGTGGA
-AAGAGGTCGGTGGCCGCGTGGCCTAGAAATCCCGAAAATTTCAAATTTTC
-AGCCAATTTTCTGCTCGGCACTGCTCATCTGCGCGGCGAGCCCCACAAAA
-TTGCTCCTCCTCACAGAAAAGCTGAAGCCCGATGAGTTCCTCACTTTCGG
-CGACACTGCCTTCCTTGTCTGGAATTTCATTTCCGCGATCATTTTGAACT
-CCTCGTGGACAAGATACTTCTCGCGAACTCCGTCTTCATATATAATTCTG
-GAGGATGAGGATGTAAGTGCGCTCCGCTGAGAAAATGTTTTGATCACCCC
-CACGATTTTCAGCTCGAGGTGGCTCCAAAACAAACGTTTGAGCTTATTTT
-CCGCCTGCTCCAATACTGCAAACGTGAATGGCTCTGGCATATTTCCGGAT
-TCTCGTGGCTCTTTATTTATTCGATCAGTAAGAGAATATCCATCGGGGGT
-TTTTTGTTTCGAATTTAAAAAAAAACACAAGTGGAAGAGTTTTTAAGATT
-TCTAGGCCACGCACCCACTCCAAAACCCCAATTTTCAGCCCGTATCTTCG
-TTCCCTATTACACGGGACAAGTCATCGCTACCGTGGTCGCCACAAAATCG
-TACCCAGCCCTCTCCAACGCTGTCTACATCATGACAATCATCTCGTTGGT
-GAGCGCTGTCGCCGCCGGATTCCGTGGAGGATCCTTCGAGTACGCCTACG
-CAAGGATCCAGAGGGCAATCCGCTACGATTTGTTCCACGGACTCGTGAAA
-CAGGATGTCGCTTTCTATGATGCTCACAAGACCGGAGAGGTGACTTCTCG
-TCTGGCTGCTGATTGTCAGACTATGTCGGATACAGTTGCGTTGAATGTTA
-ACGTTTTCCTCAGGTAGGTGTGGGTCCGTGACCGAAGTTCCCAGATCACA
-TGACCTAATTTTCCCAAATTCTTCCAGAAACTGCGTTATGCTCCTTGGAT
-CGATGATCTTCATGATGAAGCTTTCGTGGCGCCTCTCCCTCGTCACATTC
-ATCCTCGTCCCAATTATCTTCGTCGCCTCCAAAATCTTCGGAACATATTA
-TGATGTAAGTGCGCTCCAGCGAAAACGTTTTTCTAAAGTTTTGACCCCAA
-AATTCTGTCAAAGTGCCCCATTTTGGTTTGATCTTCGGAAAATGCGGGAG
-AAGAGGCGCAGGCTTTGCAACTGATATCACATGGTTAAGATTGTGCTGAC
-GGCACATGGAAAAATTCCCACATTTTTTTGTAGATCAAACCGCACCTGAC
-ACCACGTGAAATTTTTGACAAGTCAAGAAAAATTTCGGCAATTGTGAAAT
-AATCGAATTACCGCCGCACGTGGTGCCAGGCTGTCCCATTACGGCTTGAT
-CTACAAAAAGTGCGGGATGTTTTTGCCCAACAAATTTGACGTCAGCACGT
-TCTTAGTCATGCGAAATTAGTTGAGAACTCTGCGTCTCTTCTCCCTCATT
-TCTTGTTGTTCTACGTAGATCAAGTCGAAATGACCCACTCTGACATCACG
-TGCCGCCTCCCACCCCTGCTCCGACCAGGAATCAGCGGATCTACTTAGTC
-TCAACTTGTTTTATTTCAGCTCCTCTCCGAAAGAACACAGGACACAATTG
-CCGAGTCCAATGACGTTGCCGAGGAAGTTCTCTCCACAATGCGTACAGTC
-CGATCCTTTTCCTGCGAGAACGTCGAAGCCGATCGCTTCTACGGGAAGCT
-CACCCACACACTTGATGTCACCAGAACCAAGGCGATCGCCTATATCGGAT
-TCCTCTGGGTCTCCGAACTTTTCCAGTCGTTCATCATTGTGTCAGTCCTC
-TGGTATGGAGGCCATCTAGTGCTCACCCAGAAAATGAAGGGAGATCTTCT
-AGTGTCATTTTTGTTGTATCAAATGCAACTCGGAGATAATCTTCGTCAAA
-TGGGAGAAGTCTGGACAGGATTGATGCAATCTGTTGGAGCAAGTCGTAAA
-GTGTTCGAGTACATTGATCGAGAGCCCCAGATTCAGCACAACGGGGAGTA
-TATGCCGGAGAATGTTGTTGGAAAGATCGAGTTCAGAAATGTTCACTTCA
-GTTATCCAACTCGTTCCGATCAGCCAATCCTTAAGGATCTCTCGTTTACC
-GTTGAACCAGGAGAGACTGTCGCATTGGTTGGACCATCTGGCTCTGGAAA
-GTCTTCGTGCATTTCTTTGCTTGAGAACTTCTACGTCCCGAATGCTGGAC
-AGGTTTTGGTGGATGGAGTTCCGTTGGAAGAATTCGAGCATCATTATATT
-CATAAGAAGGTACGTTGGCGTCAATTTCGGTTCGACAAATCGTTTGCCGG
-TTTGCCGGCAATTTTAATTTTTGGCAAATTGCCGATTTGCCGGAAGTGTT
-TAGAGTGCTTTTTTATAAGACGGAAACACTTGAAACTGTGTCCGTTTTTA
-AATTTTTGTGCCGGTTGGCGATTTGCATGATATTTTCAATTCCGGCAATT
-TGCCGATTTGCCGGAAATTTTCCATTATGGCAAGTTGCCGATATGCCGGA
-AATTTTGATTTCGAAAAATTGCCGATATGCCGGAAGTTTCAATTCCGGCA
-ACTCGCCGATTTGCCGGAAATTTCAATTCCGGTAATTTGCCGATTGGCAG
-GAACAAATCGTTTGCTCGCAGTCTATTCGGATAAAAATTGCGCCAACTGT
-TCATCCGTTTGCACAGAAAAAGCATTTCCGCGCTTCGCTATTGGCCAATT
-TCAAAATAGTGGGCGTGACCAACCAATCACGGGTGTTTCTTGCTTTCCAT
-TGCTGAAACTGTGATTGGTTGGTCACGCCCAATTTTTTGAAATTGACCAA
-TTGCGAAGCGATGACTTTGGACGCAAGAAACTTCCGTTTTCTCCTTTAGC
-TGTCGATCGAGATTCTCTCCTTTAAAAACACATTGCCGATCTTTTCAAAG
-CCCCTGTTTCAAACGACACAGCTAGTAACAACAAAAAACCTCGAAAACTT
-CCAATTTTTCAGATCGCCCTTGTCGGCCAGGAGCCCGTCCTGTTCGCTCG
-TTCTGTGATGGAAAATGTCAGATACGGTGTCGAAGTGGCGGATACGGTAA
-GCACGATTAAATGCACCATGAGCCAAACAAAAAAACTTGTTCAGGAAATC
-ATTCGCTCTTGTGAAATGGCGAATGCTCACGGATTCATTATGCAAACCAC
-GTTGAAATACGAAACAAACGTCGGAGAGAAGGGAACACAAATGTCCGGTG
-GTCAGAAGCAACGTATCGCAATTGCTCGTGCTCTTGTTCGTGAGCCAGCG
-ATTCTCTTGTTGGATGAAGCCACGTCGGCGTTGGACACCGAGTCCGAACA
-TCTTGTTCAGGAAGCGATTTATAAGAATTTGGATGGAAAGAGTGTCATTT
-TGATTGCACATCGATTATCGACTGTTGAGAAGGCTGATAAGATTGTGGTT
-ATTAATAAGGTGAGTTGCAATTGCGCTCGACCGAGATTTGGTCGCAAACC
-TGACACGGGGTTCTGGCCTTCCTCATTGAAATTTCCGCGCTCTATTGACA
-ATCGCCTGCCGGACAACGCGTGGGAAAGTCGTGTACTCCACACGGACAAA
-TACATTTAGTTTTACAACTAAAATCGAACCGCGACGCGACACGCAACGCG
-CCGTAAATCTACCCCAGATATGACAGAGCCAAAATGGCCTAGTTCAGCAA
-AAACTCTTCCATTTCAATTTATGAGGGAATCCAGAAATCCGTGCGCCCGT
-GGTGTATTACTCGTGGATAACTGCTCATATTTCAGAATTGAGAATTTCGC
-TAAAAACTGTAGAATCGCGTTAAAAATGAGACCTCACCAAAACAGGATTC
-ACGAAACAAGAATTCACAGAAATAGTATTCAGTGGGCGCAGTGTGCGCAG
-TGTGCGCGGGGGTTGCGAAAGCACACTTTTCGGTCCCGCCCCCTAAATCG
-TGTTTTTCGTGAATACTGAATCTGGGAAATTTGAAAACTCGGCGAGTTTT
-TCTGTGCGGCACACCCACGTGGTGTCAGGCTGTCTCATGGCCCGACAAAG
-GGTACATCAGTGTAAATGCGCTCTACCGAACAGAACGCATAACCCACGTG
-GTGCCAGGCTGTCCCATTACGGCTTGATCTACAAAAAGTGCGGGATGTTT
-TTGCCCAACAAATTTGACGTCAGCACGTTCTTAGTCATGCGAAATCAGTT
-GAGAACTCTATGTCTCTTCTCCCGCATTTTTTGTTGATCTACGTAGATCA
-AGCCAAAATGAGACACTCTGACATCACGTGATAACCTGGTTGATACTACG
-CGTACGGCTTGCCGGGCCGTGTTTCTCATTGCGGTTTGATCTACAAAAAT
-GCGGGAATTTTTCCCCCAGGAAAGTGTGACGTCAGCACACTCAGTCTGCG
-TCTCTTCTCCCGCATTTTTCGAAGATCAAACCAAAATGAGACATTTTGAC
-ACCAACACACACACACACACACACACACACACACACACACACACACACAC
-ACACACACACACACACACACACACACACACACACACACACACATCATATT
-TGACGAGCAAAATCGGCCCCATAATTACAGGGAAGAGTCGAACAAATCGG
-AAATCACGAAACCCTACTGAAGGACACCAACGGAACCTACGCGAAGCTCG
-TTCAACGCCAAATGATGGGAGATCAGAAGCCACGTAAACGGCCGGCGGTC
-GCCAGATCGGGACCTCAGCCAGCCGCGTCAATCAACGTGGCAGGACCATC
-GCAGGGTAATGCAATGTCCCTGTTGTCGACGTCTTTCAGCCAATCTGCCA
-GTAGTGTTACTTCTCATTAATTGTTTTTTCTTCTTGTTAATTGGCAAAAT
-ATTATGATGAACTTGTTGGGTTGATTAATTTGTAAGAATAAAGTATACAA
-TTATTCATTCATTATTAAAATTTGGGCACATAGAAAAAATTGTGGAAAAA
-CTGTAAAAAATCTGCAAAAACGTGGAAATTATTCAAATCAACTCCAGGTA
-GTCGTTGTCGACATCGTCTCGCTGCCGCATCGTGTTCTGAAAATCCATTT
-TTCACTTTTTTTAAAGCAGATTCCCAGCTAACCGTCGACCGGATCGTGTT
-GTTCCATCCGCGGATTTGAGAGTAGGAGCTTACGGTGCCACGTGTCTCGT
-TGGCAGCTTGCCAATTATTCACAGACAGCCTGTACGAGTCGCTCAACAGT
-GGACCGGCGTTTAGAGTCTGAAAATATATAACGGGAACACTAAAATTTTA
-GAATGCGTATTGTGCAACACATTTGACGCGCAAAATATCCAGTAGCGAAA
-ACTACAGTAATCCTTTAAGTGACTGCTGCACGTGGTGCCCAGCAGGGCTG
-GGAATTTTTTGGTTTTTTGGTTTTTTTGGTTTTTTGGGACCAAAAATCCA
-AAAAATCAAAAAAAAAAACAAGTTACCGTGTCTAGTCTCGACTCGAGACT
-ATTCTGTATTAAAATACATCGAAACATGTATTTTAACACAGTTGTGACGT
-CATAATGTAATACATTTGGCAACATTACTTGAATAACCCCATTAAAAATC
-ACCTAAAGCATAAAACATTTTTTGGTTTTTTTTTGGTTTTTTTGGTTTTT
-CCAAAATTTCAATTTTTTTGTTTTTTGGTTTTTTTGGTTTTTCAAAAACT
-TCAAATTTTTGTTTTTTGGTTTTTTGGTCCAAAATTTTTTTTTGGTCCCA
-GCCCTGGTGCCCAGCTGTCCCATTACGGTTTGATCTACAAAAAATGCGGA
-AATTTTTTGCCCGAAAACATGTGACGTCAGCACGTTTTTAACCATGCAAA
-ATCCATGCTTCTCCCGTATTGTTTGTAGATCAACGTAGATCAAGCCGAAA
-TGAGACACACTGTGACCGCGTGCTACTGTAGTGCTCGTGTCGATTTACGG
-GATCAATTTTCGAAATGATTATACATATAATTATCGATAGAATAATAAAA
-TTAAGCAAAAAAAAATCGGAAAATAATACGAAAAAACAAAGGAAAATTGA
-AAATCGCTGTCAAAATTCGAAAAAAATTAATTTCGAAAATTGAGTTCCCG
-TAAATCGACACAAGCGCTACAGTAGTCATTTAAAAAGGATTACTGTAGTT
-TTCGCTACGAGATATTTTGCGCGTCAAATATGTTGCGCAATACGCATTCT
-CAAAATTTTGAACTCTCCGCCTCTCACAGCTGGGTCTCGTTAGGTATGGG
-GGCGGATCCTTTTCAATTGGCGGTGGAGCGCGATTGAAAAAATTTTCGAT
-TTTTTTTCGATTTTTCAGAAAAAATATCGATTTTTTCCGATTTTTCAGAA
-AAAAAATTCGATTTTTTTTTGATTTTTCACAAAAATTATCGATTTTTTAG
-ATTTTTCAGAAAAAATATCGATTTTTTTTTCAGATTTTCAGAAATTATTT
-TGATTTTTTTTTAATGTTTTGTCCCTTTTTCTGAAATTCTACCTCATAAT
-GATTGCTTCTTCCACTTCCGCCTCGCTGCCCGTAGTTCAGTGTCGAGTAA
-TTCGCATTCGATACTGTGTAAATCGACAGTGGAATAACCGGGTAGATCAT
-AATGTAGTACAATGTGGCAAAGTGGATCACTAACTGAAAATTATTGGATT
-TTTCTAATAATAAGGTGGGGAAATCCGAAATATGTGAAAAATATTTTTAA
-TAAACAAATTTTCCCCTGATTCCGAATATCTATATGAAAAAATTCAAAAA
-AAAATTTTCCAGATTTTATATTTAAGCTTGAAATCGCTTGAGCCCGCATC
-ACTATTTTCAAATGCTTGCCCAAAGAAATTTGCATTAGAGCGCGCTTGCA
-TAGTTTGATTTTCTTCATTCAAATATTGTATTTATTACCGCCAAATTCAA
-TTTTTTAACCGGTTTCATTCATTTTTGTCGAAAAAATATATTTTTCAGAA
-AAAAACCGGTGAAAAAAAACCAAAATCGACAAAAACTAATGAAGCTGGCT
-GATAAAAATTGAATTCGGCGAAAATAAATAAAATATTTAAATGAAGAAAA
-TTCTTAGGCGCAAACGAAATTCGCCATTTCAAGCTTAAATATAAAATCAG
-GGATTTTTTATTTATTTTTTTTTCACATTGATTTTCGAAATCAGGGAAAA
-ATTTGGGGTTAATTATAAATATTTCCCAGATTTCGGTAAGAAAAATATGA
-TTATTTTTTTACTAAAAAATAACCCCCACCAGTAAAGCGTAGAAAATTGA
-GATGATAAATGCGAAAATGATGAACGCGGAAGAAAAAAAGTCGGGATTCT
-TTTGGGCAGTGCTGGAGTAGTTGAAGATCGAGATGATTGTAGAATAGTAG
-GACAGGAATGAAACAATCATCTGTAATTTATTTTTTTAAAGCTTCCAGGT
-CAATACACGTGGTGTCAGAGTGTCTCATTTCGGTTTGATCTACTGTGTAG
-ATCTACAAAAAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTCGC
-ATGGTTAAGAACGTGCTGACGTCACATTTTACTGGGAGAAAAATTTCCGC
-ATTTTTTGTAGATCAAGCTGTGATGGGACAGCCTGGCACCATGTGGGTGC
-CGAGGGTATTGCTTTTTGGTATTTTTTGGAATTTCGAAAAAAACTTTCCG
-ATTTTTTTGAAAATAGCTCTTTTTATAGAAGAAAATAGTTTTTTCTCATC
-AACACAAATTTTAGAACAATTTTTTCGATTATCCGGAAAATTGAAAACTT
-TCGTTTTTCTATGTTCCATTTTCGATTTTATAAATTTGGGAAAACCTAAA
-ATTTCGATTTTTTTTGAAAAAAAAACGAGTATTCAATAATTTATATATTA
-TAGGCATTCTTTTTCTCTAATTTCTTCTGAAAAACATTAAAAAAAAATTT
-TTTTTTTTTTAAACCAATTTTCAGTAATTTTTTTCTGTAAAAAATACGAT
-TTTTTTCCAATAAATTTCTAGTTTTTTCTCTCTTTTCGTACATTTGGACT
-GTTTCTAATTTTTGCTTGCTTTTTTCTATATTTTTTCTGCGATTTCCTAT
-GAAAAGTACCAAAAAATCGGAAATTGTTTTTTTTTTTCGATTTTTTAGGA
-AAAAAAACGATATTTCCTATAAATGTTTTTTTCATAAGTAAATACTTTTC
-TCCTTTTCCTTTTGATCTACAATATTTCGAATTTATTTTGAAAAAAATTT
-TTTAAACGTTTTTTTCTGAAACAAAGACCCAAATTTTCAATAATTCAATA
-ATTTTTCTGGATTGTTCAACCGAAATATACACATTTTTCAATAAATTTAT
-AGTGTTCTCCTCTATTTTTGTTGATTTTTACTACTATAATTTTTTCAAAA
-TTTTCGAAAAAAAAAATTTTTTTTTTGGAAAATTTTAATTTCAATTCGAT
-TTAAAAAATATAAATGTTCATATTTTTTCATCGAAATATATATTTTTTGA
-TTTTTCAACCTTTAAATTGTTTCATTTTCTCTGAAAAAATCGGAAAAATC
-AACAGAAAAATCGAATTTTTTAAAAATATTTTCCGATTCCGACCGTAATT
-TTTATGAAAAAAAATCGGTTTTCTCGTTATTTTCTACAACAAAACCTCAA
-AAAACATGCTGGGCAACGTCAAAATCGCTCGATATCGAATCTTCAGCTCA
-GTCTCATGTTTCACCAAATACACCGCATACAGAAACATCGTGCAGCTGAT
-GAAGAAGAAAATGAGCAGATATGCACACTTTTCCACGAAAAATTCGCCCG
-AAATCATGAAACGTGGCAAATTGAGCACAATTCGATGGAGCCAATAGCAG
-GTCGATGAGCTGCAGCGGAAGCTTTCATTGGGATCTGTGCAGTACGTTGG
-AACCGATAAATGTTCCTGCATTGATCGGATACAGTAGACGAGCAGGCAAA
-TGTATTTTACAAGTGAGATATTCTGAAAATTTTTGAATTTTTTTTCCGAA
-TTTAAAATTTTAGTTTCTCGATTGTTTTGAAGTAAAAAAATTGATTTTTT
-AGAAAATTATATGTTTTGTTTAATTTATTTAAAAATCTTTAAAGGTGGAG
-TAGCGCTAGTGGGGAAATTGCTTTAAAACATGCCTATGATACCACAATGA
-CCGAATATCATGATAAAAAAATTCAAAAAAATTTTCTAAATTTTATAGGT
-TTTTTTTTGAAAATTGAAAAATCTCAGTTTTTGCCTAATTCCAATTTGAA
-TTACCGCTAATTGGATTTGTTCGGTGGAGCGCGCTTGCACGTTTTTAAAT
-TTTTTTATTTTATTTTATGTTATTTTCCACCGATTTTTAATGTTTTCGGT
-GTATTTTTGCTCGAATTTTAGAGAAAAAGTCAAGATAAATGCAAATTTTC
-AATTAAAAAGCACGCTTACAGGCGTAAAAATGACAAAGTACCGATTTTAA
-ACGATTTCCAACCTGAATTAATTAATTTCACTGATTTACGCCTGTAATCG
-TCTTTTTTAATTGAAAATTTGCATTTATCTTGGCTTTTTCTCTAAAATTC
-GAGCAAAAATACACCGAAAACATTAAAAATCGGTGGAAAATAACAAAAAA
-TAAAATAAATAAATTTAAAAACGTGCAAGCGCGCTCCATCGAACAAATCC
-AATTGGCGGTAATTCAAATAGTAATTAACAAAAACTGAGATTTTTTTCAA
-TTTTCAAAAAAATCGTATAAAATTTAGAAAATTTTTAAAAAATTTTTTTA
-TCATGATATTCGGTCATTGTGGTACCGTGTTTTAAAGCAATTTCCCCACT
-AGCGCTACTCCACCTTTAAAGTGCTAATGTAAACTTTTTGTACACGTGGT
-GTCAGAAAGTCCCATTTCGGTTTGATCTACAAAAAATGCGGGAGAAGAGA
-CGCAGATTTCTCAACTGATTTCGCATGGTTAAGAACGTGCTGACGTCACA
-TTTTTTTGGGAGAAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGG
-GACAGCCTGGCACCACGTGTTTGTACAATTACACATTATCCTGGAACTTT
-CCAGAAAATTTGAATTTCCCGCCAAAACTTATGGGTCTCATCACGATGAG
-TCACTAACCTCAAACCGATATATTTTCTAAAAACAAAAACTCAAATTTTC
-TCAAACTACAGTAATCCTACAGTAATCCTACAGTACCCCTACAGTACTAC
-TACAGTACCTTGGCATTGTCCCCCACCAATATACAACCCAATATACCTTC
-AAAAAACAAACACGTAATTTTTCCCAAACTACAGTAATCCTACAGTACTC
-CCACAGTACCCCTGCAGTACTACTACAGTACCTTTTTAGAACATTTTTCT
-GTTTTTCGATTTTTTCGCAAAAAAAATTCAGTTTTTTCAGCAAAAAAATT
-GATTTAAAAATATTTCAAGTTACTTTTTAAAAGCTTTTCAAAAGTTTTTC
-AATCCGTAAAAATAAAATTTTACGAATTCTTGTATTTTTTAAATTATCTG
-AAATTTTTTTTTCTCAAAAAAAAAACTTTTTTTTTCAAGTTTTCAATTAA
-TTTCGGCAAATTTCAAAAATTTTAGGTTTAAAAAAATTCAATTTTTATGC
-TTAACATTTTATCGACATAAAAATCATTAACAACTACGAACAATTTGTGG
-AAAACGTTTTTGGCAGTGGAGCGCACTTGCGCCTCGTATTCAAAAAGCCA
-CACAAAATGGTGAAATATTCCCAAAAATCAAATAATTGTTTCGCTACGAG
-ACCCAAAATACCGCAAAATAGTAATTTTTACCATAGTAATTTTCAAAAGT
-GGCACGTAGACCTGATGAAACGTGTCGTTCACCTCCTCCGAGCTTCTGCC
-ACGTGAGCTGGTGCTCCGGCATGGCTGATACATTTGTGAAGTTCGCTAAA
-ACAGAAAAATATTATAAATAAGCGGAAAATTTCGTGGTCTCGACACGACA
-AAAAATAATAAAAATTATTCGTGGTGAGACCCGAGTTGTTTTGGAGCAAA
-ATTCTCAAAATTGGGGTATCACGTGGTGTCAGAGAGTCCCATTTCGGTTT
-GATCTACAAAAAATGCGGGAGAAGAGATGCAGAGTTTGCTGACGTCACAT
-TAAAAAAAAATTCCCGCATTTTTTGTAGATCAAACCATAATAGGACAGCC
-TGGCACCACGTGCGGGGATTAAAACCCGCGCCGCACAGAAAAAAGGCGGA
-GTGTTATTTCGCAACACCGCGGCACGGTTTTTTGTTGATCTTTTTCAATA
-GTCTTGATATTACTTGCGATTTTTGCAAATTCAAAAAATCAACAATAAAC
-CGACCGTGCCGCAGGGTTGCAAACTCCGCCTCTTTTTCTGTGCGATGCTG
-ATTTTTTGCGAAATTCACGAATCAAAAAGCACACGTGGTGTCAGTGTCTC
-TCATTTCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGAGAAGAGAC
-GCAGAGGTCTCAACTGATTTCGCATGGCGCCACACATTTTTGGACAAAAA
-ATTCCCGCATTTTTTGTAGATCAAACCATAATGGGACAGCCTGGCGGGGA
-TTAGAAACCGCGCCGCACAGAAAAAAGGCGGACCGTAGTTTCGCAACACC
-GCGGAACGGTTTTTGATATTACTTGCGATTTTTGCAAATTCAAAAAATCA
-ACAAAAAACCGTGCCGCAGGGTTGCGAATTTACGCTCCGCCTCTTTTTCT
-GTGCGATGCTGCTTTTTTTGCGAAATTCACGAAAAAAAAAAAGAAAATAA
-AAGTACATTTACCGATAAAAGTGACGATAGACCGCCGATATACATGGAGA
-GAATAGAGAGAGAAATGTGAAGTTTATTAGAAAACAATTTTGTAAAATTA
-TGATGATGATGAAGATTTGCGGAATCTGGTAATCGGTTTTAATTGCCTTT
-TCTATTATATTATATTAATCACTTGATGATGTACGGCTTTGCGCTTCCTC
-GTCCACGGTCTCCAGATGACGGAATCCACGTGGCGATACTGATCGATTGT
-GTTTTGGAGTGGTGGTGCTGCTGGTGCTGGTGGAGGGAATTGAGGTGGTT
-GCAGTGGATATTACGCTGAAAAATTGAAAGGATTGGTGGAGGAAATGAGA
-GAAATTTGAGAGCATAAATTTTTAAAAATCGAAAAAAAATTTTTTTTTGC
-TATTTTTGGGCAGAAAATGGCGAAAACGGTGTTTTTTTGGGTAAAAAATA
-ATAAAAATTTACAATTTTTTTTGACAGAAAAATGCGGAAAAGCTGTTTTT
-AGGGTTGAAAAATCAAAAAAAAAATTTTTTTTTGCTATTTTTGGGCAGAA
-AATGGCGAAAAACGGTTTTTTCAAGTTTAAAACATCAAAACAATTTTTTT
-GCAATTTTTTTACAGAAAAATGAGGATAAGCGGTTTTAAAGGTTTAAAAA
-ATTTTTTAAAATTTTTTTTGCGAATGGAAATTTTCTGAAAAATCGTGCAA
-ATGCCTAATTTGTGCAAAAATCTTATCTGGTCAATGATTTTTAAGAGAAA
-ACACCGGTTTTAGAAGGGAAAAAGGCAAAAAACTGGATTTCCAGTGAATT
-TTATACTAAAAATGGAAAAAATTCAGAAATTTTTTAAGGAAAAATCAGAA
-TTTTCGCAATTTCTACACGAAATATATAGAAATTGAGGAGAACCTCGGAT
-TTTTTGCGGAGTTTAAACAATAATTTTTCGGCTAAAATTAACGATTTTCA
-GAGAAAAAACTTAAAAAAAACAGAATTTCAGTGAATTTTACACGAAAAAC
-GTAGCAAAAAGAGGTTTTTAGGGAATTTCCAAGTCAAATTTCCGAAATTC
-TTGCGATTTCAACCCTGAAAAATAGCGAAATTGAGGAAAATCTCGGATTT
-TTGCAGATAAATAATATTTTTTCCAATGATTTCCGTCTCCAAAACACAGA
-ATAATTTACCAATTCGACGATGGTGAGGAGGGAGAGCCCAGCTCGTTGGT
-GACAGCCGTGAGATCCGAGAACAAATTGACGCTGGCTGAAAAAATGGAAT
-AAACGCTAAATTGATGATTTCCGCTATTAAAGTGCATATAGAAATACGAA
-AAAGCAAAAAAAAAAATTTTTTTTAACCTTTTCCCTGGAATCGAAGAGCA
-GTTTGCTTGCGGATTGGACGTCGAAAAGGGCCTAAAATTCTCATTTTTCG
-GCCTGAAATTCCTCGAAAAACCCACTATTATTGGTAGTCGGAGATGGCTG
-ATCGCCTCGTCGCTGGTAATATAGCACGCCTAGCCAGAATCCGTAGAGAA
-AATAAATATAGACTGCCCACACTAGGATGATGGGAAGAAACGACAATCGG
-CAGGCGTCTGGAGTGAAGAAATCAAGATTTTTCAGATTAAAAATTAAAAA
-TCTTTAAAGGTGGACTACACCCTTGTTGGGAAATGGCTTTCAAACATGCC
-TATGGTACCACAATGACCAAATATCATGATTAAAAAATTCAAAAAATTTT
-TCTAGATTTTATATGATTTTTTGAAAATCGAAAAAATCTCAGTTTTTGCC
-TAATTCCTATTTGAATTACCGCCAATTGGATTTGTTCGATGGAGCGCGCT
-TGCACGTTTTTAAATTTATTTATTTTATTTATTGTTATTTTCCACCGATT
-TTCAATGTTTTCGGTGTATTTTTGCTTGAATTTTAGAGAAAAAGTTAAAA
-TAAATGCAAATTTCCGATTAAAAAATCACTGAAAATGCGTAAAACTGAAA
-AATATGCTAGTTTCAGGTTTGTTGTCGTCGGAACTCATTATTTTACAGTT
-TTACGTATTTTTCACATTTTTAAACACTTTTTAGCAAACATTCTGCATTA
-ATCTTGCTTTTTTACTTCTCTTTCCGATAAAAATACACAACTAATGAAGA
-AAATCAGTGACATAATAATAATAATAATAATAATAATAATAATAATAATT
-TATTACGCTCGCTGGGAGACGTGAAGGAATACAGAATACAAAAGTTATCA
-TTGTTCGCTTGAACTAGAATTGGTGCAGTCGGGCAATCGTTTCCATTCCA
-TTAAAATGTTGTCCTTGTCCTTGCGTTGTCCTTGCGTAGACTCCCCCATA
-GTGGGCGAGCGATTCCCGAGTGAAAATAATCACGGAATGAAAAAATAGAA
-GAAAAATAGAATAAATTAATAAAAAAAATAATGCAAGCGCGCTCCAACGA
-ACGAGTTCAATTGGCGGTAATTCAAATAGGAATTAGGCAAAAACTTTTTC
-AGATTTTTTCAATTTTCAAAAAATCATATAAAATTTATAAATTTTTTTTG
-AAGTTTTTTAACGTGATATTTGGTCATTGTGGTACCATAGGCGTGTTTTA
-AAGCAATTTCCCCACAGGGTGTAGTCCACATTTAAAAATTAAAAATTAAA
-AATTCTACCTAACAAAATCGAAAATTTCAGATTCTCCTTGATTAAAAGCT
-TTATTATTGAGTAAAGAGTCCGCAGCGTCCACACGGAGAGCGGGTACAAG
-ATGGAAATCTGAAAATATTTAGGATTTTCAAGGGAAAATATCGATTTTTT
-TTAGCAAAATACCACAGAAATTGCGGATGGAATGAGTAGAAGAGCCGGGT
-TGACTTTCCGGGGAAAGTTTCGACGTGTGATGCTCGTCTCGGAGAGCCTC
-ATTCCCAAGAATCCGGTTGCGATGCTGAAGAAAATCGATGGAAAAAGTCT
-AAAATATCCCCTGAAACCCTACCTAAAAATCAGAAAATACGAGAAAATAT
-TGATTAAATTCCGAGCCGGCACATAATTCGGGCGGATCAGCACTCCATTG
-AAGTTTCGAAACGTTTCGCCGTTCCACTGAAGTCCATCGAAGCCGGGAAC
-GGATGGCGGCTCGAAATGCTCGTCGACACTCATTTGACTGGCCCTGTAGA
-GCCCGATGATGGCAATGGCGAGCATTCCCACTTCCACATGGAATATCAGG
-CTCTGAAAATTAAAATTTAGCTTTTAGACGGAAAAAATCGATTACTTTGA
-CATGAACTTGATCGAAAAGCCAGCGATACGGGTATTTTCGGTGCAGGCGG
-CCTGATTCCGGACGTGCTCCTCGAGATATATTGGAATTTGTCGAGCGGAT
-ACTAATATCTGCCATTTTTTCGCTGAAAAATCAGAAAAAATAAGTTTTAA
-AACAGAATTTTAATGGAAAAATAAACGGAAAAATTCGAAACTTTTTTTTC
-CGCCATTGAACACCAATGTGCCTTTAAGGTACGGTAGCTCTTCGTGGTGA
-GACCACTGCGCCGCGCATCTGATTTCTCGTGGGAAATTTGTTTCGAATCC
-TACGTTTTTTACAGATTTTTCTTTTTTTTCGTTTCGCTCATCATTTTTTT
-GTTGCAAAAAATCCAATTTTCAGACAAAAATGTCAGAACGCCAATCCAAA
-TATTTTGACTATCAAGGTATCGTCATTTCCTCCACTGGACAAGATAACCA
-AGATTCGGAGACGGACCTCGTTTATCTCATTCAAGCTCATGTACGTGAAT
-TCCCTCCGTTTTCATATTTAAAATAATAAGCTCGTTTTCAGGGAAAAGCG
-GCCCCGAAGAACATCATGTACGGTGTCTCCAAGTGCGCATTTGTTCCAAC
-AAACTTGGAGAGGAATTTCGATAATATCGAAGAGGCAAAAAATCTTGAGT
-CAGTATTTATTTGATTTGAGCCCATTTTTAATCTGTTAACACTTGAATTT
-TTAGACGTCGATCCAAAATCCCGCTAAAGTTCGGTGAAGTCATCCTATGG
-AACGAATCGGACTGTGATCACGATAAGAGGATAATCCTTCATATCAAACG
-AGAAAAACCAATTTATGAAGCGTCTTCCAGCAGAAATGGACTTATTTTGA
-AAGTCGGTGGCGTCATCCAGCCCACCTCAACGACCTCGTTCTGGACGCCA
-TTATGCACCGTCACCATGCGTATGTTTCTTCTTGATTTTCGTCTCTCTAA
-CCATATATTTATTTCAGCAGAGACAGAGGCGACCCGTGCGGAGCCAGACG
-TTTGGCTATACGCCTGGATTCGATTCGAAACTACCATGAAGAGTGGTCTA
-GATCCTTTCAATATGACTGCAACATTCGAATCGTTTGACAGTTGCGATCC
-ATCCGACCAAGCACGCGTCTGTGAAGCGGTATTTGCTTTTTAAAAATTTT
-TTACGGGATTTTGAACAAATAACTTTCAGCCATGGAACGCAGGCTCTCCT
-GACTCTAAATTCGGTGTTTGGCGCCCGGATCCAAAGCCTGCTGATAGCGA
-CGACGAAATTGATATCGAGCCGAGAGAAGGCTGGCACTTGCCAGAAGACA
-AATGGGCCGAGGTTAAGGTTGCTTTGTGGATTCTCGTTGACAATTTGATT
-TTGCAGGTCATCAAGATGCAGCTTGGCCTGTATGTCGGCGAACGCCTACT
-GATTTGCAAAGAACTCTCGCAGTTCGACTTTATTATCCCACTGCAGAAGC
-CATTTTCCCGAGGAACGGACAAGACTTTGATCTACCCAGCCGTCGGAGAA
-TACTTTCATTTCAGTGCTATTTGGTCGATGCAGCACAACGGTTTTCTGAT
-CTATGAGCTTCAGCCAGTTCCACTTCTCAGACAGCATGTAACCTCTGTCA
-ACGGAAATGTAAGTTATAATATTGATTTTTTTGTCCAGAACATAATTTTT
-ATTTCAGCTCCTTACCCGCGTCGTTCCTGCCAGTATCAGAGGTCTCTTCG
-TTGACAAGGAGGGCACTCTTGGATTGATTGATGACCCACACCATCTTCTT
-TCATTCTTCGAGTTTCATCCAGCTGGTTATGAATTCTTGAAGGCTATGGT
-AATCATGAGTGGGTCTTATTTTGAAACAAACGCTTTCAATTTTCAGGCCG
-AAGTTCGTGCTGTTCGAACTTCAGAAAACAAATCTGTCCGTTACCGCATT
-GTTCGTACATCGGGAATGTCCATTTTTGAAAACTGGCTTCGTGATACTCA
-GGTCTCTAAAGTTAAATTAAACTCGTCCTTTTCACCCCTGAATTTTTCAG
-TTCGTTGTTGGTCCAGTCAAAGGAATTCGAATCAATGAAGACACTGTCAT
-TTGTGCCAAACATCCGAATGTCTACTTCAAAATCCCCAATAACTTGAAGG
-AAGGAATCCCCATTGGCGGAGGAGTTCAATTCGTTGGAAAGCGACAAGCT
-GGAGTCGACAGTGAAATTATGATCACCGAATGTTCTCCATGTCCAGCGTT
-CACTTGTAAAAATTACTCGGTCTCTGGTGATACGGTTAGTCTTCAATTAT
-TTAATAGTTTTTATTCTATGAGGAAAATATTCAGCGCTTGTTCCAAGTGT
-ACTTGAAGCCAAATTGCGATCATGAGCAGTTGGCGGAGAGTGATTCGATG
-GGATTTGTGGATTTCAGAGAGTTGGAGACTCCATGTAGAGGAAAGTGAGT
-GTGTCAGGATTTGTAAAAATAATTGTAACTGAATTTTAAGGTTCCTGGCA
-TGGGTCCGTGAATCCATTACTGTCAATGATTGTCGCCGTGCTGCTACCAT
-CATGGAAGTATGCTCGACAGCCATCTGTCCTCCGTTGATTGCAATGAGCG
-CGAATTCGAGCAGAGCAACATCGGCCAGAACTACGCCAGCTGGAAGTTCC
-ATTGGATCCAGATCATCAATTCAATCAAGAGCATCTGCAGCTACTTCAGT
-GAGCTCAAACGTAAGTTTATTTTTAAGGTTGGAAGATGATAAAAACAAGT
-TTTTCAGCGATTCGTTGGCCCTTCAAGCCGCAGAACTCCATCTGGTACTC
-CACAAAGCTCAACATCTTCCAGGGTCTAATTAAATATATACGCATCCCGT
-TTTCCCCCGTATTTGTGTTTCAAATGTTCTGCTCATTTTTAATCTACCCG
-TTATCCAACCAAACATTTATTTATTTAAACTTCAAGTTCCACCACCATCC
-CATTCCGCACAACTTGTCTCTCGTAATTTTCTCGTGCTCTAATGAAGTTG
-TGGTAGGTTATTCTAGTGAATACACCCATGTTAAGCAGCGAATACATCCA
-GAAAAGTCCCAACAAGCCGGCAGCGAGATACTCCCCCCAAAATGATGGTT
-GATCGGTACATCCAAGATAGGGTAGCATCGCGATAGACGTGAGCAAGTTC
-GTTATGCACTTGAAAAACTGAAATTTCAGAAAAGATTAGGTGTATCAGAA
-GGTTAAAAACAAACAAATGACATATAGATGAACGAAGCCAGTGATGGAAT
-CGGATTCCGAATACGAGAAGCCATTCCCGGAGATACTGTGATAAGAATCT
-GTGTGATCGAGAACACAATGAGCACACCCACCGGGAACATGAATTCCATG
-GAAACACGGAGGCAAAGGTCACAGTACTGCAAAAAATGCGAAATTTTGGC
-GATTTTTGCTCTAAAAAATGCACTGGCCGGGTCTCACCACGACAAATTTT
-TGTTGTCAGTTGAATGCCAATAGAGTGTGCGCCTTTAAGGAGTACTGTAG
-TTTCAAACTTTTGTTGCAATCGATTTTACAGTTTTCCCGAGAAACAAAAG
-TTTGAAACTACAGTACTCCTTAAAGGCGCACACACTCTTTCCGCATTCAA
-CTTAACAAAAGGTTGTCGTGTCGAGACCCGGCCACTGCATTTTTGTAGCA
-AAAAAAATTTGAAATTTTCAAGTCTGGATAATAATATATAATATTTTTAC
-CTCAACTATGGGAATTTGCATTTCCAAACTATCCAAACAATCGCTGAACC
-CGAAAGCATCACAAATAATCGATCGATATTGTCGCGGAATGTCACGTATC
-GATTGGTAGATCATGAATATGTTGCCAAGTAACGCGAAAATCTTGAAAAA
-TGGAGGATTTTGCTTTTAAAAAATCCAAAAAAAAAAACTTAAATTCGACA
-ATTTCCTGTTTGAATTCCCTCCAAAATGAGAACTGCAGGACCCATCAGCG
-ATTTGAGTGGGCGGAGTCCGAGGGCGCTGATTGGTCGTGCAGTTCTAATT
-TTGGAGGGAATTCAGCCAAATTTGAAAAATCTCGTTTTTTTTGCAATTCT
-TTTGTGGTATTTTCGACATGGGGTTCTTTCTGGCTTTCCTCATCAAGGGT
-GTCAATGTCCCGTAAAAATTTCGAAAACGGGACAACGGGACGTCCCGTTT
-TTTTGAAAACACTCAAAAAACGGGACAAACTGGGCGGTTAAAAAAAAGAG
-TGCATAGTTGGCGTAAATTTTAGTGTATTCGAGGCAAATTATAAAAAAAA
-CTGCATGTAAGTCATTAATCTGCATGAATTTAAGTCTTGAAACAAAACTC
-AAAAACAGAACTTTAAAATGTGCAACAAAATCATGAGAGAAATTGTCCCG
-TTCCCGTGATAATTTTGAAAACGGGACAGCGGGACGTCCCGTTCCCGTGA
-AAACACTCAAAAAACGGGACAACGGGACAAACGGGACACGGGACTTGACA
-CCCTTGTTCCTCATTAAAATTTTCGCGCTCCATTGATAATCGCCCTGGGA
-AAGTCGTGTACTCCACACGGACAAATCACATTTAGTTTTACAACTAAAAT
-CGAGAAAATTGGGAGAGTTTTTGCCGCGAACCTGGCCTAGTTCGCGGCAA
-AAACTCTTCCATTTCAAAATATGGGCGAAGCCAGAAATCCGTGATATTTT
-CAGCATATTTTTTTGATTCGAAGCAAATCTCAGTTTCTCACCACAACGAA
-CAACTTCACATTCGGATGCCGCCCGTCTTCGAAACGTGGAATTCCAACTG
-AATTCACCGATTCGACACTTGAACCGGGTGACATCATCATATTTTCAACC
-AGCTCATACTCGAACTCCGGAATATCCGGCACCACATCAATCGGTGCTGG
-TTCTGGCGGTGGCGGCTCAACTGACACTTTTCCTTGATCTAAAATTTGTT
-TTTTTCTGAAAATTTGTCACTGTACCAAATCAAAAAAAAAACCTTACCAG
-AACTCATAATTTTTGGATTTTAATTTGTAAATTGCAAAACAGAAAATGAA
-TTGGAATTTTTTCACTTTTTATTTATGGGAGGGGGAAATTCTTTGTTGTT
-GCAATAAAGTAAAACAATCACAGTAAATGCCAGTACAATAGTTTTTCACG
-TGTAATATATTAACCAATTACTATATTCAATAACTCTGTCGTCTAAATAC
-ATAGGGTAGGGGGGAAGGTGAGGGAAAATGGAAATAATAAAGTGAAATGT
-TTTGTGTACTTGCGATAAAACAATCAATAAATGGGAACAAGCCGATGATA
-AACTGATAAACCGAACGTGAATATCGAGAGAGGGAGGAAGAAAGCGTATA
-CCCGTTAATGAAATCAAGTTAATGGAATTATTTGGATTGAAACAAAACAA
-CGAAAATATCAATGTTTGAGCATAAGGAATGAGGGAATGGCACTGGTGGT
-GGTGGATAAATGAATCGGGGGGAACGGAATCTATGGAAGTTTCGAATACA
-TCGCATCGAGTTGCTTCGAGTAGTGAGCCTTCAGCTTCGGACGCTTGCTC
-TTCAACGTTGGCGTGAGAAGATCATTCTCGACGCTGAATTGCTCGGCGGA
-GAGACTGATATCGCGCACTTGCTCGAACGAGAAGAGCCCGGCTTTCTTGC
-CAACAGCGACCATGTCATCGAGGATCGCCTTTTTGACGGCGTCGTTGTTG
-CACAGCTCTTCGAATGTTCCCTTGATTCCTTGGTCGGCCATCGCTGGGAC
-GAGAACCTAGAAAAATTGAAAATTACATATATATATATATATATACACGC
-TCTCCTCAAAGCCGAATAATTATTAGAGCGCGCTTACTGCGCTTCGCGTT
-TCTGCATCCGCGGCATTTTGACTTTACACTGAAAAAAGCAGATATTTCAG
-ATTTATCGAATTTTTAGCTTTTAAAATTTTTTTCTGCATTTTTCGAACAA
-ACCTTTTGTTAAACAGTGAAAATTGAATTTAAAATGACTAAAATGAACTT
-TTTTCGTTCACTGGTTGTGAAATGGTTTGAATTTGAAGAAATCAAAGGGA
-TTTTTCTGAATTTTTTAATAATTTTCTATTAAAAATCGGTTTTAAACCAT
-TTTTTGACCCTAATGTTAAGTCACAAATGTATTGAAACCGGTTTTTAATA
-GAAAATATTTAGAAAATAAGAAAAATCCCGTTGATTTCTTCAAATTCAAA
-CCATTTCACAACCAGTGGACGAAAAAAGTTCATTTTAGTCATTTTAAATT
-CGATTTTCACAGTTTAACAAAACGTTTGTTCGAAAAATGCAGAAAAAAAA
-TTTTAAAAGCTAAAAAATCGATAAATCTGAAATATCTGCTTTTTTCAGTG
-GAAAGTCAAAATACCGAGGATGCAGAAATGCGAAGCGCAGCAAGCGCGCT
-CTAATAATTATTCGGCTTTGAGGAGAGCGTGATATATATATATTTTTTTT
-AATTTTGAAAATATTTAAAACCAAAAAACCAACCTCAGCATCAGGTACAA
-CAATAGCAATGAGACACGTCTTCAGTGATTCTCCATGAACAAATGATTGA
-GCGACATATTTCGAGCGGACATAGATGTTCTCAATCTTCTCCGGTGCCAC
-GTATTCTCCCTGCGAGAGCTTGAAAATGTGCTTCTTGCGATCCACAATTT
-TCAGCGTTCCCTCAGGAGTCCATCGTCCAATGTCTCCAGTGTGCAACCAT
-CCATCCTCATCGATCGTCTCCTTCGTTTGTTGCTCATTCTTATAGTATCC
-CTTGAAGATGATGTGTCCCTTGACACACACCTCGCCGGCTTGATCCTTCG
-CGTAATAGTTCAACTCGGGCACGTCGACCAACTTGATCTGACACGATGGG
-ATCACCATTCCGACGTGTCCGGCTAGCGAATCTCCTTCCATCGAGACAGT
-GCAAGCGGCGACACATTCCGTTTGACCGTAACCCTCGACGACGACACATC
-CCATAGCGGCACGAACGAAGGTGAGCACATTCGTCGAAAGTGGAGCCGAT
-CCGGTGATCATCAGACGCACACGCCCTCCGAATCCTTCGCGAATCTTTTT
-GAATACCAAATTGTCGAAGAATCCGTCATTTCTGATATTGAAGCTGGAAA
-AAAAAAGAAGATATTAAATACTATCAAATCATTCAGACCACTCACTTTGC
-CATATCTCTGGCCTTGTATGAGATAGCGAAATCAAACAACATCTTCTTCA
-AAGTCGACTTGTTCACTTCAGACATCACTTTATCGTAAAGCCGATTCAAG
-ACACGTGGCACCACTGGCACCACAGTCGGCTTCAACTCTTTGATATCCTC
-GGCCAACACACGTATGTCACCACGATAGAATCCGACTTTCGCGCCGACAC
-AGAAGCACACACTCTCGATGACTCTCTCGAGCATGTGAGCCAACGGAAGG
-AAGCTGATCATCGAATCGGTCGCCGCGATGCCACTGTGCTTGAAGAAGTC
-CATACAGACACCGTCGGCGATCACGTTCGCGTGAGTGAGCATCACACCTT
-TCGGTGTTCCAGTCGTTCCTGACGTGTAGCATATGGTCGCAAGATCCTCT
-GGTGTTGGTGGAATGTGTGCTGGACGAGTCTTGGCGTTCTTTCCAATCTT
-CTCGAGATCCTCGAACGTGAGCACCTCGACTCCGAGCGATGACGCAGTCG
-TTTTGAGCTCATCGGTGACTGGTTCCATCACAACAAGTGTGCTCAAACTT
-GGGCATTGCTCCTTGAACTTTAAGAGACCTGAAATCAAATTTCCTTTTGT
-TTTTAATAATATTCCTTATCAAACTCACCAGTGGCCTTTGAAATATCATC
-ACAGACAACAATCTTGATCTCTGCCTGATTCAAAATGAATATCGACGCTT
-CTGATCCAAGGGTCTCGTAGATCGGCACAATCACATTCGAATAGTTGTAG
-GTGGCGAATTCGGTGATGATCCATTCGGCGCGATTCTTCGAGTAGATCCC
-AATGTTCTCCGCGTTGCCAGTCGGAACGCCGAGCTCACGGAACGCGACGG
-ACACGTTGTCGGCTCGCTCGAGAATCGTATTGTACGACTCCCACACGTAC
-GGGATTGAACCATCCGACTGTTTGACTCGACGTCCGAGCATCGGCCCGTT
-GTTCGAGAGACGGGCTCCACGGCGAACACCCTGGTAGAGGGTGCGCGCGT
-CTTCGAACAGGAAAGCCTGGAGTTCGTCGTCCTTCAGGTAGGCGCTGATG
-CGGGAACCATCCTGGAAATTAACATTTTAGTCGGGGGGTTTTTTTGGAAT
-TTTTTTTTCGCTCGTTTTCTATTGTAAACCGAGCCACGACGCGACACGCC
-GTAAATCGACAAGCCCAAATGGCCTAATTCGGCAAAATCTTACATTTAAA
-AATATGAGGGAAGACAGAACTCCGTGATTGGAGAAAATTAAAGGAGGACT
-AACGGTTCGGACGATTTTGAACGTATAGACCCAAAATGAGCTCAAATGAA
-TGAATTTCGTAATGAAACTGCTCAAAAATTTTTATGGCGGTTCAAAATGT
-TGAAAAAATTACACTGATTTTGGCTAAAATCACGAATTTTCCCATTTTTC
-CGTGTCACATCTGTTCGAAGTTGGATTTTTTGGAATTATCGTTTTTTATT
-ACATATATTGGTAGTTTATCTCATTTAATTTCGTCGATTAAAGTACATTT
-AAAGCCGATAGGTAACCAATTTCGATAATTTTTGGTCACCTATCGGCTTT
-AAATGTACTTTAATCGACGAAATTAAATGAGATTAATTACCAATATATGT
-AATAAAGGACGATAATTTCAAAAAATCCAATTTCGAACAGATGTGACACG
-GAAAAATGAGAAAAATTCGTGATTTTCGCCAAAAACAGTGTAATTTTTTC
-AAAATTTTGAACCGCCATAAAAAATTTTTGAAAATTTTTTGAGCAGCTTC
-ATTACGAAATTCGTTCATTTGAGCTCATTTTTGGTCTATACGTTCAAAAT
-CGTCCGAACCGTTAGTCCTCCTTTAAGTTTAAAAAAAAAACGGCATATTT
-TGCCCAGTTTCTCTCCAAAACTCACCGGCAAAATGCGACTCTGATTCATC
-GGATCCACCAGTGGCTTGACATTTCCCGAATAGGTGACCCCACTGAACGA
-GTAGGATCCCGACGTCGATGACGAGCTCTTCGACAAGTAGTATCCGAGGC
-CCATGGTGACTGCGGCGGCGGCTCCGATTTGAACGTACGGTGGAAGGGAA
-GAGTTCGAGTTTGGTGCCGAAATGAAATCGACAATACTTCTGTAACAATT
-GAAATTATATATAGAGAGGACGGGTGATGATGATGAGTCATCCAGGTTGT
-TGTTGTCGCGCGCGCGCGCCCGCACTGTTCCCCACAAAACAAACAACTTA
-TTTGAAATTATGAAATCGAAGTTTCTTTGTTATTTTATTTTATTTCACAA
-GATGGTTTTCATGTTTTATATACCATTCGCAAAAACAATACCTAGTTTTT
-GCTCGTTTGGACTCAGAAATTTTGAGACTTTTCTGAAAAGTTTAATGGCA
-GATCAAAATTTCGGAAAAAGGTGAATTTTAGCGAAAATTCGCCGTGGTTT
-TTCGAAATTTTGATCTGCCATTAAAGGTGGTGTAGTCGAATTTTTTTATT
-GCTTTATTAGACTCAAAATTGTCTGAAAACACCGAATTTCATAATAAAAC
-TTAAATGGCCTAAAATTAGCTAAAATTTGAAATTTGACCGACTTGTCAAG
-CGGCTGGAAACGTTTTTTTTTTGAAATAACCGTCAAATTTTGAATATACA
-GTGCAATTATCTTGCGTTTTCAACTTTATTTAGGTACTTTAAAGTCGATG
-AACGGCGAGATTTGTTTTTAATTTTTCACGAAATCTCGCCGTCCATCGAC
-TGTAAAATACCTAAATGAAGTTGAAAACGCAAGATAATTGCACAGTATAC
-TCAAAATTCGACGGTGTTTTCAAAAAAAAAAAAACTGTTTCCAGCTGCGA
-CGTCGGTCAAATTTCAAATTTTAACTAATTTTAGGCCATTTTTTGAGCCG
-TCATAACTTTTTTTGAGGAGTTTTCAAGAAGTTTTATTATGAAATTCGGT
-GTTTTCAGACAATTTTGAGTCTAATAAAGCAATAAAAAAATTCGACTACA
-CCACCTGTAATGGCAGATCAAAATTTCGAAAAACCACGGCGAATTTTCGC
-TAAAATTCACTTTTTTTCCGAAATTTTGATCTGCCATTAAACTTTTCGGA
-AAAGTCTCAAACATTTTGAGTATAAACGAGCAAAAACTAGTCATTGTTTT
-TGCCAATGGTATATAAAACATGAAAACCATCCTGTGAAAAAAAAACAACA
-AAAACACTTGAAATTCGTAATTTCAAAGTTCTCCAAAAAAAACATACACA
-CACCTCGATTGAGACTGTACCCACGCAGCCGTGTCTGTGATAACCATTCT
-GTGTGTTTCTGTGTTTAAGTGGCCTATTTATAGTCTTCTGCCAAAAGACG
-AAACCGCTTCTAAAATGAGATTAAATTGAGGTGGAAACGACGACGACGAA
-GAGGTGGAAGAAGTGAGGGTGAAAATCGAAAAAACAAAGAAGAGATCAAA
-GTTATTCCATCTTTAGAACTTTCTCCACTGCCAGCAATTGATAATAATAA
-TAAGATTTTTATGTTGATAACTCTTTCGGTATCAATACAAAAAGGGGTGA
-AAACCCGCCTCGACAAGCCTTTCGATCAGGCCATATATTTCTTTATCACA
-CTCTCCGCACATTTCGGAACAACTTTGACCTCCCCGGCAAGGGGGCAAAA
-GTTTCGAGAAGTTGTGTTGCGCGCGAAGGAGATGGAGAAGATGGAGAAGA
-TAGGCAAACACGTACACCTCCTCAAACAGTAGTAGTAGTGATAATTGATT
-TGATTAGTGATTCGGGTGGGCAAAACGAGAGAGATAGAAAGAGAAAAAGC
-GAAGAGGACAACGAACACGTGTAATCAACCGTGTGCCAAAGTTCTCGCCC
-TTTGGACTAATTGCAGTTTTTTTGGAGGAAATTCAATTAACACTGAAAAC
-TAGTTCGTTTAAGTGTTTACGCTGAATGGGCCAGGTTTTGAGGGAAAACG
-ATTTTCGAAGAACTTTAAATGTGGGGTACCGAAATCTGAAAAATATTTTA
-AATTGACTCCAAATTTTCCCCTGACTCCGAATATCGATGCGAAAAAATTC
-AAAAAAAATTTTCCTGATTTTATATTTAAGCTTGAAATCGCCGAATTTCA
-TTTAGAAATTCGCATTGGAGCGCGCTTGCATCGTTCGATTTTTTTTTCGT
-TTATTTTATTTATTTTCGCCGAATTCAATGTTTTTAAAGCCAGTTTCATT
-CATTTTTGTCGAGTTCTCATCGAAAATTTTTTTGACAAAAATTAATGAAA
-CTGATTAAAAAATTAAATTCGGCGAAAATAAGTAAAATAAACGAAGAAAA
-TCAAACGATGCAAGCGCGCTCCAATGCGAATTTCTTTGGGCGCGAAGTTG
-AAAAAATGGCCCGGGGCACAAATGAAATTCGGCGATTTCAAGCTTATATA
-TAAAATCAGGGAAATTTTTTTGAATTCTTTCGCATCGATATTCGGAACCA
-GGGAAAAATTTGGAGTCAATTAAAAATATTTTTCAGGTTTCGGTACCCCG
-CCTTTAACGGATTTTTTGGCTTAAAATTGGAAACTCTTGGTATAAAACTT
-GTAGAAACACCGAGTAAACTGTACACGTTTTAGACGATAATTCAAAAGTA
-TCGAGGGAAGTATCCAGAAGTTGAAAAATTGCGAAAAACAGGTAAAATAA
-GGAATTCAACGCGTGAATTTTGCATTTTTAGACTGAAAATAGTGTGGTAT
-TTCTTCAAATATAGACGAAAATATCGACTCGCACTGGTTTTCGATCGATA
-TTTATAGGTCGAGTTCATTGCTATGCACAACATTCCGGGAAAACACGAGA
-TTTGAGGAATTTCTGAGCAACTTCTGAGTAAAGCCAACAAAACATTTTGT
-ACAATTTTCTTGTTGGTCTTGCTCAGAAAATTTTCAATCAAAAACCAATT
-GGAAATCGATATTTTCTGCTAGTTTTGAAAAAACACATGATTTTTAATCA
-AAAATTGTTAAATTCATGCAATTTTCCAAAGTTTTACACGATTTTTTCTC
-TGGAATTCACATGCTTTTTAAAGCAAACGGCCGTTTCTCGTTGTTGGCTT
-CCACGCGATTCCATAGAAACACTGGGGCACCAGAGAAACCGGGGTCGAAG
-CAAATGACCAACAAACAACAAACGGATGTGTGCTTTTTCTTCGTTTTCGT
-CTTCACGAGGAACCACCACGCAAAATGGAACTACAACTACGATTGATAAC
-GAAAAAAAAAAAGAAGAGATGATGATAGTTTTTGCAGCAATAAAAAGAGT
-GATAACAAGATACACTCTATCTCACCCACACCTTTCCGTTCAAAGATAAG
-GAAATAAGATTCGGGGGGTTCAAAGTGTTGGAGCCAAAAACGGAAAACGG
-AGGGAGCAATTGTTCGTTGAACGAACAATAAAAAACCATCATCTGCGTCT
-CAAAAATACACGTGTAAGTGAGCGAGTGAGTGAGTGAGTGCCGGGGAATA
-AAACGAGTTATATGACCAACACAACGAGCGACGTTGCTGCTGCGTTTCCT
-CACTCTCTCCTAGTGAGCGTGTGTGCGCACCACACTCACATGAGCGCATG
-CAAGGGTGTATGCGCAAGTGGTACATCGACTCGGTATGAGAAGGACAGAG
-CAGTAGTAAGGAGCACACGTTATGTTGCTCCACTACTCACTGTTGCGTAC
-CGTGTAGCCTCTGCGGGCCACCGCGGTGCAAAGTACAGTGGAAGGAGGAG
-AGTTGAAAAATTGGTGTTTATTTTACTTTTAAACTCGTTTTCCTCCGGAT
-TTTGAAGAGAATTGGTTGACTTTTTGAATTTTAGGCGAAAAGCGCGGGAA
-AAATCGAAAAAAGATGTGAAAACGAGTGAATTTTAGGGCAAAAGTGAACC
-GACAATTGTTATGAGCAATCGGGCTTCTCGGTCGGAAAACAGATCACAGA
-AAAATCGGAAAATCCAGCAAAATACTCGAAAATTATGCAATTTTCTAGAA
-TTCCAAGCGAAATTTTCTAGAATTTGAGGCAAAATGATACGGAAACCAAC
-GAGAAATCCAGAAAAAAAAACTATTTTCATCGAATTCTAGGTGAAAAGCT
-CTGAATTATTCGATTCTCCGTCGGGGTAGACTCAAAAATTATGCAATTTT
-ATAGAATTCTAGGCCAAACATCGCAGGATCGCCTACACAATTTCCGGAGA
-ACGATGAAAATCGGCAAATCTGAAGCAAATAGGAGTGAAGGAAGAGGCTT
-CGGATCAGTTTTTCTGAAGAAAATACAAAACTTTCGCTTTCGCAAAACTT
-TCGGGAAAATTCTCAGAAAAGGCGTCAAAAGCTCAAAAAATCGACGTTGC
-ACGATTTTCGACGGAAAAATAGAGTAAAATATCCGAATTTCTGCTTTAAA
-ACTCGAAAAATTGCCCAAAAATCCGTTTGTTTTCGCCAAATTTCTCCTAT
-TTGGGGGTCACAAGGCGAGCGGGAGCCGCCGACGACGAGATGAAGAGCTC
-CACAGAGCCCCTGAGCCAACAACACAACACTCACCCAAAAATATTGGAAT
-TCTCCGGAAGGAAATCGTCGTACGACGACGGCGGCGGCGACGGTGCCATT
-TTTCATGGGGAAAATTAGAACCTTGTTCGAATTTGTGATTTATTATCGAT
-TTTCTATGTGCCACGTGTGCCCTATTGCGTGACCCACCTGATTAGTTGCG
-CGAGTATTTTGTCAGTGCGGTCGACGATCACCCGAAGAATGGAGAAATTG
-TCTGAAAAATGCGAAAATTGGCTATAAAACGACGGAAAAAGAAATAAAAA
-CAAGTGAAATGAGGCCGAGAGGCAGGTGAATTGTTTATGCAATTTTAGAA
-ATGTGATATTTTGGCGGTGTAGATCGAAAAAAATGCGAAAAACACGAAAA
-CAGGTCGAGAAATTCGCAAATTTTCGACGACTAAAATTCAAATGCACAAC
-GTTCGCGCGCGCGCCGAAGTACGGTAGGTCCCGCATTTTTGCGCGCGCGA
-AATTCAAATTTTAATTTTAATATTTTTTCTTTCTTCTTTTCTTTGATTTT
-TTAAGAATATTGTGCAAAAAATTCGTTCATTTTTCGAATAAAATTGTTAA
-AAAAGACGAAAAAAAAAAGAAAAAATAAGACAATTTCTCGGTGGCATACA
-AATAAATACAAGTTATTGTTCGGGAAAAAAATCACAATTTTACATTAAAT
-CCAGGTTTGTAATAAAATCAATTATTATTTTATTTTCTTCCAAATCCGGC
-ACATGGATTTGGGCATCCGCTGGTCATGCAGCAGCCACCTCCACTCCCTC
-CGAGACACGCCAACGACTCGCCGGTTGAGATGGCGAGAAGCACGAAGCAA
-ACGACCATGACCTGGAAGAAAATGTGTGAATGTTAAGGTCTCTTAATATT
-CCAATAAAATTATTTGGTTTTTTTTTACCGGTGTTCTTGCCAGAAAAGTG
-CAAAAATTAATTAAAACTCTAATCGTGGCGAGACCCATCTTAGAAACGAG
-AGTATGCGCCTTTAAAATTGGGCTACCGTAATAATCGAATTTTTGCAATC
-TTGCAATTGTTGATTTCCGAAGAGCGTTAACAAGAAAACATTTGATAGAA
-ATGACACATGAATTAGGTAAAATTTGGTTTTTTTTTAGATTCTTATAATT
-CAGATTTCTATTTTGGACACGGAGTTCTGGCCTTCCTCATTGAATTTTTC
-GCGCTCCATTGACAATCGCCTGCCGGACAACGAGTGGGAAAGTTGTGTAC
-TCCACACGGACAAATACATTTAGTTTAACAACAAAAATCGAGACGCGACG
-CGACACGCAACGCGCCGTAAATCTACCACAGATATGGCCGAGCCATAATG
-GCCTAGTTCGGCAAACTCTTCCATTTCAATTTATCGATGTCAGAGTGTCC
-CATTTCAGCTTGATCTACCTAGATCTACAAAAAATGCGGGAATAATACGT
-AGAGTTCTCAACTGATTTCGCATGGTTAAGTACGTGCTGACGTCACATTT
-TTTGGGCTAAAAATTCCCGATTTTTTTGTAGATCAAAAAACTGTGATGGG
-ACAACCTGACACCACGTGATTTATGAGGAAAGCCAGAAATCCGTGATTTG
-GAGAGCACAACAAAAAAAGAAATTCGGCCACTGATTCGCGGCCACGAGCC
-ACTGTGCCTTCTCAAGATATTAGTTAATAATTGACGCTGTGAGACCCACA
-GTTAAAGGCGCATGCTCAGCATGACTGGCCAATCTAATAGCATCTACAAT
-GATAATTGAAAAAAAAACTCACAGTTTGGCAAAGTTTAGCGACGAGTGAC
-ATAATTCTCCGAAAGCTTCAGCTGAACAATTTCAGGGATTACTTGCTGTT
-TCCCATCGCTTCACCGTCTTATATAGTGCCATCGCCGATTGGCAGAATGG
-GATACACCTGCCCCCAACTGCGCAGTTGAATACGATCCGTGTCTCTCTGC
-GTCTAGCGGTTCTCCACGATGTTTCTTTGGCGGCGGTGAAGCCGTGTGTG
-TGTGTGTGGCTCCTCCATTCTGATTGAATGTGTAACACTGCGGGCAACCG
-ATTGGTTTTGGCGGCGGCGGGAAAACGAATCCGGATATACTACATACACA
-AACACACACTCACACACACCGAAGGAACTTTTCAGAGAAACCTGAACTGG
-CTTTTTATGATTTAAGTGCTTCTGCTGCCAGCATGATGTGGTGGTTGTGT
-GTTGTCAATAGGATTTATGCTAATTCCTGACACATTCAAGAGATGAAACA
-TCAAACCGGGTAGGAACTTAGTCCACCCAACACTGTGAGAGATTAATAGA
-ACCTTTAAAAGTGGCACTTCTAGGCAGAATTCAATAGAATGGTGGGCGCC
-TTGGAGCCTAGTCGACCTGCGATGTGAGTGGCAAGGTTGGCAGAGCTAGG
-ATAAGCTTCTGGAACTGTAGGACTGTAACAAGCAAGGATCCCGCTCTGGT
-ACTGTAGTGAACTTTGAGATCAAATTAGGTTTTTCAATATTTAACTAGCA
-CTGTTTCCGGCCCTGATCTTAGAAAGAAAAGAAAAAAAGGATGTGAACCA
-GGCGTGGGCGGCAAACGATTTTTTTCCGGCAAATCGGCAAATCACTAAGT
-TGCCGGAATTTAAAATTTCCGGGAAATCGGCAAACTGACACTTTGCCAAT
-TTGCCGAACGGCAATTGCCGCCCACACCTGATGTATACATATATATGCTT
-TCACTCATGTGGTGCCAGAATGTCTCACTGCGGTTTGATCTACGAAAAAT
-GCGGGAATATTTTTCCAGAAAAATTGCGGCGTCAGCACGCTCCTAACCAT
-GCAAAATCAGATGAGATGTATGCGTCTCTTCTCCCGCATTTTTCGAAGAT
-CACAGCAAAATAGAACTTTCTAACTCCACGTGTCTACTGAGAAAAGAGCC
-GAAAGCTTATTTTCCACGTATCAGGGATCGGAATCCCACCTAGCTAGTTC
-ATCCTATTGCATCATTGAAGCATCTTCCGGATTCTCCACTTTGTTTGCTT
-TTCGAAATCGTTTCAAACTGAAAGCCGCGCTTTCAAGGCCGTCTTCTTCC
-GATTTTCCGATCTACCTTTTGTTGATCATCACGTGCCTGGCGATCACAAC
-ACTGTTCAACCGGAATATCTGAAGATGTTCCACCAAATGGATCGTTTTTC
-TCAGGACGGAAGAATACTAATTTGCAAAAAGTCTGTTCTGTTCTAAAAGT
-TCTGAATCTTCTGAAAAAATTTCAGACTTAGATCCTGTCATTACATGGGC
-AAGCAGTGGAGTCGGAGATTTTTTATCAAAATATATGGATAGGTAATCAG
-GGAGAGACTGGCTCCTTTGTTACAATATATTAGGTTTTGTTCTTTAAAAT
-GTTCAAATGAAGCTGAAGAGTTCCGGCTAAAAGTATATGATTTTTCAATG
-ATTTTTCAAAAATTTCAAGGTATAACTCTGAAACTAAAATTTAAAAAAGA
-AACTAAATTGGATTTTAATGTTAGTTAGTTTATTAACAGAAAGAGCAGTA
-TTTTTTGATAATTGTAACCTGAAAACTCTATTTTTCTAGTTTCGTGAAGT
-AAAAATGTTTTATTATGTGACATTTATTGAAATTTAATTATAATACACTG
-TTAGAAATATTTTATTATCTAAAAAAGTAAATTGGATTATAATGTTAATT
-ATTTTACTATCAAAAAGATCAGTATTTTGTGATAGTTTTAACCTAAAAAC
-ATTTCTGAAGATCGTTTTTTGTGAGAAAAAATTATTTTAATATGTGTCAT
-TTAAAGCAACTTTTAAAAAATTGCGGTTTAGAAATGTTCAGCTATCAAAA
-AAAAGTACATTGGATTTTGGTGCCAGTCAATTTATCAACAGAAAAAGTGG
-TCCTAAAATAATTTCCAAACTTATTAATGGTGGTAGCATTAAAAAACACT
-TTTTTTTGGATTTTTTGAAATGAATAGTGTATTTACAGAGACAATGGTAG
-ATCAACCTAAAAGAACAAAAAATTTGCAATTTTTCCAGGTAGGACACTTT
-TTTGCTACTCGAATATAACTAACCTAAAATAATTTCCAAAAGTTTCAATG
-GTGGTAGCACAAAAAAAAACAATTTTTTTGATTTTTGAAATGAATAGTGT
-AGTTACAAAGACGGTGGTACATTGACCTAAAAAAACGAAAAATTTACTAC
-TTTTTCAGGTAGGACACTTTTTTGCTACTCGAATATAACTAACCTAAAAT
-AATTTCCAAACGTTTTAATGGTGGTAGAATGTAAAATAACTTGTTTTTTT
-TTGGTTTTTTGAAATGAATAGTGTAGTTACAGAGACAATGGTACATTGGC
-CTGAAAGAACAAAAAATTTGCTATTTTTCCATTTTGACCAAAACTATTGG
-TTTTGTCCCCAAAAAATTAGTAAAATGACCCACAATCCAGTTATTTTGCT
-GTTTAAGCAGACACACTACACGGAATTATTTTCAGAAACCAGATGTATGT
-TAAGATTTTAGTAGTTTCGGTGCTGCAAAAACCATCAAAAAATACCAAAT
-TTTTCGGCGTTTGTGAAGCACGGCAATTTTTGAGATTTGCCGCACACCCC
-AGGTACAGAGACAATTTTATATCGACGTGAACGAACAAAAAATTTGCTAT
-TTTCTCAGGTAGGCCACTTTTTTGCTGCTCTAATTTCACACACCTAAAAT
-AATTTTCAAATGTTCATCCTACCCTTATATGTAGTAAGAAGATTTCAAAT
-TCAAATTTTCATGCATCAACTCGTCCCCACCGTTTTTGTTTCCCTGGCTG
-ACTCATCTGACCTTGTCACCCCACGTGTGTTTGTCTTTGTGCCCCCTCTC
-GTGCTCACCTTGTTCCAAATTCTGTGAAAACTCATCTCGAAGGCCATTTT
-CTTCGTTTATGAGTTTTGAAAAAAAAACGTTCAGACAACTGCAAATGACC
-TCCCCGGCGTCGAGAATCGGTGATAACCTTGTACTTCTTAGATGAGACCA
-GATACAAAGTGCACCAAAAAATTCAAATTCGCTTGAGAAGCGCTGGCGAG
-AGATTCGAAGCGAAAACGAGTTGATTGACAATCGGAACATATACACACAC
-CAGAAGACAAAGTGGGGGAAGAAAGGAAACAAAAAAGATAGAGAGGAAGG
-AGATTTTGAAAAACGACAATCTCTCTGTGTGTGTGGGTGACAGGTGAAAA
-AGTGAGAGTGAGAAAAACGTGGTGGGTACTGTATTGATGAACGATCAGAC
-CAAGTTGCATTCAAATTTCTTTGATTGGATTGTTTCCTGATCGGTTTGGT
-AGAAGGTGAAGTTGGATTTTGTTCACTGAAGTTATTGGATTTCGAGACAT
-GAGCAAGCTAGGTTCAGGATGACTGTAGTGGCCGGCTAACTTTCCGTACA
-CCTTTGGCCGACTAGTGAGTGCAACCAGGGCTAGTAAGGAGGTACATCCT
-GGTTACCGTAAGCTTATTAAAATTCTGAAAACACCCTACAAAAACTGATA
-TTTGTAAAGTTCTCCAAAACAGGTGCTAAAACTTCTGAGGCAAGAGTAGG
-CACTTGGAGTCAGAATGTCTTATTTCGATTTGATCTACAAAAAACGCGGG
-AGTTGAGACGCAGAAATCTCATCTGATTTCGCATGTTTAAGAGCGTGCTG
-ACGTCACAATTTTTCTGGAAAAATATTCCCGCATTGTTTGTAGATCAAAC
-TGTAATGAGACAGCCTGGCACCACGTGGGTAGGTGTCGGGATGCACGTGG
-TGTCAGAGTGTCTCATTTCAGCTTGATCTACGTAGATCAACAAAAAAAAA
-TGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTTGCATAGTTAAGCTC
-GCGCTGACGTCACATTTTTTTTGCAAAAAATTCCCGCATTTTTTGTAGAT
-CAAACCGTAATGGGACACCCTGGCACCACGTGGGGATGCATTAGTATGAT
-TACTGTAGATAAACCTTGAACAATATATATACATTAATTTCGTAATGCTT
-GAAACTTGGACCCAAAAACTATCTGTAACTAGAAAATCTGCAAAAATGAG
-TTTGCGACTTAAAGCTGGAAGTATACAAGTTGCGCAAAGACCTTTCCAGT
-GGCTTCAGCTAGCAACAAAAAAATTTGTAAATTTGCCGGTCCCCACACCA
-CATCAAACGTGCAAGACGGGCAACTTGGTACATCCAGTTCACCTGCACTC
-CAACTACTTCCCAGAACGCCACATAGTTGAATTATTACCCAACTTGGTAC
-ATTATTTTGTCGACTCGACACACCATCACCCCACCATAAACCCCTGCAAA
-TAAGGAAGCCGATCGCTATCTACTCATCTTTAGGGACCTTTTTTGCCGCT
-TTTTATTGATTTGAACAAAATCTCAGCAGAGCAGTCAAAAATTGCCAATA
-TTCCAATTTTTCAGTTGCCAAAGATTTTAGAGTTTCAATACCTACTAAAT
-CCTCCCGTTCCAGCCATCCGTTCTTGATATTCTCTCCATAAATTTTCGCT
-TATCTCCTCTCTTGTAAAACTAACGTTCACTTATCCACATAATAAATACA
-ATAAATGTATTATATACATATATATTATATATATATATATATATATATAT
-ATATATATATATATATATATATATATATATGTATATATATATCTCAAAAA
-ATCAAACAGGATCTCTCTTTTCCTCCAGGAGAAAAAGAAGATGCCGTTTT
-GCAGCCAACAATACTCTCACTCTCAATACACGACGCGACGACGTGGCATC
-CCTCCCCCCATCCTGCCTTTCTTCCCCGTTTCTCCTGTGTCATCGAAATT
-TCTAGGGCAGCAGCACACCGGATTGGTTGGCATGTGAAGCCGACGTGGAT
-CGTGATGGTGATGATGTGGCGGATTGTGATAGATCGTGTTTTTTATCCGG
-CGATTACTGCGAGAATTGTCTGAAAGAGTGGCAGGGCCTGGCGCCTGTCT
-TTCGGCTCTTTTCAGCATTTTGACGTGAATTTCCAAATTTCTAATTTTCT
-CATTTCTATAAATTTGCTGAAAATCAATCAAAGAAATAAAAAAAAAGTTC
-ACTCATGTTTTAGCATACGGCGCGAGAGGCAGGCGGAAATCGCCTTAAGG
-TCAGGCAGGCAGGCAGGCGTTTAACGCCTACATGGAAGCCCTATAGCACA
-CATCTATCTGAAACTGGGAATGTTGTTCCGAAGTGCATTGGAGTGCCTGA
-AATTATACAATGTTTGTTCTAATTTATCATTTACTGTATATAAAGCGCTT
-ATTCCGTGTGTCCATAGTTGGTAGTCTATGTAGTCTGAAGTTTTGGCTTC
-TGGAAGGATAGTGAGTTGGGGTTAGTGTAGGGATATGGTCGGGGAACTGT
-AGTGGTACAATAGCGGTACGGTAGCAGTACTGTAAGATTATGGTACTTTC
-AGAAAAAAAAGTTTTCAGCCCCAGAAGTCGGGGTCCGTGCCGGAGGAGCG
-GACAACGGCTGGTTATCAATAAAGAATACCAACATTTTATCACAGATCCG
-GTTACCGCTAGACAAGAAGGTAAAAATTCGCATTCTGAGAAGGACTACTG
-TAGCAGGTGTTTAGCGTGTGTCCGAGTAGATGTGGCGACTCTTAATTTAA
-GTTGTAGTTTCCTGGTGTCCCCTAATCGCGAACTTCACGATAATTGTAAA
-TATTTTAGTGTGGCCTATGTTTACAGGTTTTACGGACAGCCTAGCCCGAG
-AAAAACTCTGGAAAAAAATCCCAAAGCTCTTATCCAAAACTACCAAAGTA
-TTCTATGCAATTCCCTTTTTGCATTTCCTCACCCCGCCTAATAAGGCATG
-TTGTTTACCGCCGACTTTCCGCAATAATCTATTCTCGCAATCATGTGATT
-TACCTGACGAATCGAAAGTATACGGTAACCTTCACATTTGGAAGAGGAGA
-AAGGAATTCGTTGGAGCCTTGACCCATTCTCCCCACAGGCATAATTCAAA
-AAAATATTCACATCAAGAATGCGGATTTGCCACAACCCAACGGGTTCTCC
-CATCCAGCATCTCTACCTTTGCCGAGGCAGAAACTGAGGACCGATCTCGA
-TCTGCCGCCGCGTTCCGACAAATGTAATAGCAGCCCCCCGCGCGATAGCT
-TTTCACTTTTTCTTCTCTTTCTGGCTACTGCTGCTGCCTCCTCCTGCGCA
-AGGATGATGCTGCTAGGATGATACCCTACGAGATTACGGAACTATCCGAT
-AAATTAGCTTGATGGAGACTAGAGAGATAGTCCCGAAGCTCTGAAGGAAC
-CTGATCTTGTTACAGTCTTGGAACCGAACAGCTGATTGCGTCGTCGTATT
-ATCGTTATTCATTTCGTAAATAGATTTTCTCTAGGATTGATTCCCGGTTG
-AGCCACGTCACTGTCCGAGAACATTCCGGAATGTTATGCATATGTTCTTG
-TAAATAACCTTTCTCCTTCCTCCGGCCGGCCAACTACTTTCATTTCTTGA
-TGCGTCGAGATACGATATCCAAGGCCATCTTTCAAAATCGCAAGTTATCC
-ATCTTTTTTCGCTGATGACTCTCTCTCTCTCTACTCCTTCGCCCATCTCG
-TCTTCAGAATCACCTACCGCAAAACAATTGAATAAGTGAGTGTGGAAGTC
-ACGTCATGAGCGCGACGAAAAGAGAGAAAGAGAGAGAGAGAGAGAGAAGT
-GCCGAAGACGTCGGAAGAGAAAAGCTGGAGGAACCAGCGGCTGGATCGTC
-GTTTGTTGATGATGCCTCCTGCCTGCCATTGTTATTCGATATTCCGATAT
-TCGATTCTTTTTTGCCGCCGCCGCCCAAGAGGAGAGGAGAATCAGAGAAG
-CTTGCGCGCTCCCTATCAAAAAAAAAAGATTATCAAATTTGAAGCAGCAG
-AAGCTGGGAAATGGAAATAATAGCGGATAAACAAAGAGAGCGAAATGTTT
-TGGGCAATAAATTTGTAGTTTGATGATAAGAGTGGCATTTTGATATGAGG
-AAGCTTGCAGAATCTAGTGGTGAACAGGAAGCTTTCGCTATGGAGCAAAA
-TGGATTCCGTCATTTTTCTTAAAGAATCGGAGTCGAGATGAAACACCCAG
-CCGGAGCTGAAAAATTATTCTGCTGAAAAATCGAGGTGCTTGAAGTACCA
-GGGCGTTATACAAAAGATCCAGGGATCCTAGTTCTGCAAAAAAAATTTCT
-GCATAATGAAATGGAGAACAGGGCGGTGCGGCAACCAAGATTTTCGGCAA
-CCGGCATTTGCCGAAGTTGCGGAACCCAAAACATTTTGGTAACCGGCAAT
-TGCCGAAGTTGCCGAATTCAAAAAATTTCGGCAACCGGCATTTGCCGAAG
-TTTCCGAATTCAAAAAATTTCGGTAACCGGTTGCCGCACAGCTCTGATGG
-AGAACCCGGTGGTCAGCTCAGAGTTTGGATCACCACAACCCAGAAATACC
-ATCTTTCAGTGCCTCATACGTAGAAACACTCTAGCTCAAAGTGCCCCTGA
-GGCCCTGGGATCTATCCTTACCTGGAAAACTGTGTAAAATTTCGAATATT
-CACAGATCCTAGGTTCGTAGTTTCACAAAATGTTCCCACTCTGCCTTCGG
-ATCCCCAGGACGCATTGCTACAATATTTTGCACTTGGTACAGTACTCAGC
-TTTCCCTTTTTGCACCAAAAAACATTATTGATCCTTACGATTAGCGTCCT
-AGATAGGCTACAAGGCCATCGAGATCTCAAATATGCAAATTCTTAGGAAA
-GAAAGTGATGTTTCATCATCTTCTTGGATTAAAAATTTCCGAGGAAAAAC
-ATGGCAAAAATCAGGTTGATCGTGAAACTCGTCGGGGGCTCCTCTCACTT
-CTTCCCCATCTTCATCTCTCCTTCTCTTTCCCGATCCGATCTTTTTTCCT
-TTCTTCCATTTTTTCTCGTTTTTCCTTTCCATTTTTTCTTCTCCTTCTTG
-TGTTTGATTATCCATCCTCCTTGCCCTTTCTCCTTGTTTCATTTTTCTTT
-ATTCATTCGGATGGAATAGAGATATGGTTCCGTAAATTCATTCCAATACT
-AGAAGAATTAGTAAGACATTCGTAGGGGGGAAAATTCCGCGCAGAAAGCG
-ACAGGAGGTTCGGGATTGGGTAATCGTCGGAAAAATGAAAAATCGCGCGC
-GCCCGCCCGCGCAGATGGGATATATACTAAATCACATGGGCAGCGACATG
-ATATACGATGGATTGCGTGATCGATAGGCTTTTCAAGGAGGTACATTAGC
-ACTGGTGGGCGTCGGGATCCTTGAAGGAACAACGATCTTTGAAGGAGATG
-ACGAGGATGTTGTGAAATTTAATTGTGATATCATTCTATTATGTAATCCC
-TGGCCTAGAATATACATCATCTTTTAGAATTCTGGTCGGCTAGATGTTTT
-CGGGAAGTGCTTCTAAAGGATCGGCGCTGCCATGTATGTAGGAAGTGCTT
-ATGCCAACCCCAATCATCTTCTCAATCTACTCCTCAGAAGTTCAGTTCTG
-CCAATCCGCACGCTCCACCTTCGTCGCCTATCCGTTTCTCATGCGAGTCT
-CGGGTCAAGGCAAGTGTGCGTGTCCTTCAGTCGTGAAGTCCTATTCATTT
-ATTTTTGCTGCCAAAGTCCGAACAGTTTTTTCTAGCCGTGTCGGCAAAAG
-GGTTCTTATTGCGAATTCACCTCCTCCCCACTCGAGAAATCGCCCCCCCG
-CCGTCCTTGGTAAAACTGACCTAGAAAAATAAAAACAACACAAAGCGCCT
-CCCGCATCATCACGCGTATATATGTATATATATAAGATGGTAGGCGGGAA
-GAGGAATCGACGCAATATCGACTGAAGGTTGCGCAATCGAGATGGCTCTT
-CCCGGCACGGATACCTCCTCCTCGCGTACCAGGCACCCGCATATAGCTAA
-AGTTCTCCGCCCATTTCGTTACTTTTTTGTGCTTCCCATATCATCGCAGC
-AGCGCTTATGCCATTGCGCCCGACCCGATCCAACTTCTTATTCTTGTTCC
-TTAGCCTTCTCCCCCTCCCATGTCCTCCCGATATCCAAAAAGTGGGAGGA
-GCATGCCATAGTGAGAGGGCGGGGCCGGGACACACACAAGGCTGGCCCCG
-AGAAAACGAACAACACTTATGCCGAGGACAGTCTCGACAGTTGGTGGTCA
-CCCCACCTGCGCCTTGATTACCCCGCCCGTCCGCGCCCGCCGGGCTAAAG
-TATTTTGTTTGCCATTCATGTTCCTCATTCGACGTTCATCATGCTTCTGT
-TATGCTTCTTGGTGTTGGTCCGGTTCCTTTCTCTCTCTCTCTCTTTCTTC
-CTTGTGGATCAGATGCCATTCCGCCTTTTTGCTAGATAAGCGCATATTCA
-TCTCACTCTTCTTTGTTTTCAATTCAGCATTCTTTATATATCCAATATCC
-TACATCCTATATCCTCGTTCTCTCCTCATTTTCATTCATATGCCGATCCA
-TTTGGTACTGGTGGTGTCGTTCTTCTTAGTTTCGCTTTCCAATTCTTTTC
-TAGACAATTCCTTCTATTTCCAGAAACTTTTTTCTACACAATGCTCCCAG
-ACAGCCCATCCCCACGCGCTGCCCTTGCTCTCTCCGATCTTCAGCCACAA
-ACCGGCGCCTCAACGTTCTCAATTGGCAGTGGATCAGGCAACTGGTAAGT
-CGAGTTCTTATGTAACTAGTAGGATGGTAGACATCGAGATTAACGATGTC
-TGGCATTCGTTACGTAACGAACGGGTTCTCCCGCCGACCATCGAAGCGCT
-TAAGCGCCGAGATTCTCGGCTTCATCGCACCCCGGTCTAGCAAGTTTTCC
-AATCCATCCCAAATTACAGGTCGACAAGAGGTGTTGGTGGAGTTAATGGT
-GATTACATGGACAAATCCGGCGGAGGAATGTTCGGAAACAGCAGAAACAA
-CGTGAGTTATAAAAATATCTGGGGGGGGGGGGGGGGGGGGAAGTGTTGTT
-CTAGGCCAGGGACATTGAGAACCGCGTGATGAAGAGTACTTTTATCCGAA
-TTAAATCATAGGCAACGAAAACAAGAATCAGGTTCTTGTGCTTTGCACAC
-CATGTCGGAATATCCGTCTCAATCAAAACGAAAAAAGCCTAAGCTGGACC
-AAGTGTTAAATGCTTAAATGCCAAAAATGAACAATCTTTCAAATCACTTT
-CATCTTCCTGTAAATCAGAGAATCCTGAAGCGCTGGCGCGCACACTTACG
-AAAAGTGAAAGCCGATATATCAAGTTTATCACCTAGCGGGACTTCCATTG
-TCTCATTGTCTCTTGGCTATCCGCCCCACTTTCCCCCCGGATCATCCGCC
-CCCTTTAATCCAAGACTCTCGAACAGTTTCGCTTCATTCCAGGACCGATT
-CGCATTCGGCAACAACAGCTCGTCGTCCTCATCAGCAGGCTGCTTTTCAT
-CGAACAATTCGTCAGGCGGACTTTTTTCCAGTAAATAAGTTAATATGTGA
-GTTTTTTTTGTGTACATTTTCTTCTTTTCAAGATCCATTAACATTTCAGA
-ATGCGATCGGCAGCCGGTATTCTTATTCTAATCTCAATAATTATTCCCAG
-TGTATATAGTGAACCGAAGTTGCCCGATTGCGAGCAAATACCAAAAGTCT
-TGTGCTGTACCCAACGTGTCTTAGATAAATGTATGTCTGGTTGTATCGAT
-TATGTCACTGAGAAATGCCCCCACAAATTGGAAAAATACGAGACGATCGA
-TGAAGAGCCATCGACGAGAGCTCCAAAGAAGCAGGTGAAGCCAGCTAAGG
-CAACTAGCAACAGAGTTGTCGGAGCAGTTGAAGTAGACCATGAAGCCAAG
-GAGCAGTTCATCGACTCCAAGGATATCAGAAGAGCACCACGAGTCGGTGA
-TGCCAAGCTTCTCAGCCAGGAGTACCCGATCACCGAGGTCACCGACGCCG
-ATCTCTCCTCCGAGTGCGGAACCGAGAAGTCTCAGCCACCATTCTCACCA
-TGCTTGTCCCGCAAGTCGGCCGACGACGTCTTCCTCTCCTGCTGTCGCCA
-ACAGGTTCCATCCAACTGTCACAGCCTCTGCACCTACGAGCATCGTGAGC
-ATGTCGCCGCTGAAACTCTGATCCAGGCGATCCAGCAAGAGCACTGCGAT
-ATGAAGGTAAGAATAGTTCAATCTTCCTATTGAGTTTTTTTTTTGAGTTT
-TTCCAAAATTCATTCTTTCAGTACTTCTCCAAACTGCTCTACTGTGCCAA
-CCAAAACCGCGACAACCGCGCGTGCTGCTCCAACCTCGGCATGTCAAACG
-CGGAACTCGGCGTCGGCGATCGTTGCCTACGTATGTGCAACATCTCCCCG
-TCGGGAGACCGTGTAAGCTCTATGGAGAAGGAGGATCTCGTCTGCCTGTC
-CAACTGGAACGTCATCATGTACTGTGCCAGAGGTGGTCTTCGTACCATCA
-ACTAGACCATCATCCCCGTTCTCTTCTCCCGTAATAAGCTGGCTCAGGTT
-GTTAATAATAATTCGCCGCTCGTCTTAATAATTTTCCATTTTCCAATCTC
-GTCCCCCCTTTTCAACACTACCACATTTCTCAGTGATATTCATCTGAACC
-GCCCGACATACATCAGTTCCTCATAGTACCTAACAGGGTTCAACAAACCC
-ATCCACACACCGTCCCCCCACGTAACACCCCCCCCCCCCCCACTTAAGGA
-CCAAGTCCTAGTTACTGAATGTGCAACATTATGGCCAGAATGCAATACTT
-GTCCCATCTGAATCCATGTTATTTGATAATCTATGACAGTATTATACAAC
-CCTTTTTTTTCAAAACACAAGCCCCCTTGAAAACGAACTCATTGTATGTC
-AAACGGTATCCCTTATTACACGATTAATTGTGGAGTTTGAAGCGAATAAA
-TCAATCAATTTCTCGTTGGGTCCCACAGCGAAATGACTATTACCGGTACA
-GAGAGTGTGGATAGTTAGAGAGTGACAGACATCCGGGACCCAATGGGGCG
-GGGCGCGCGGAAGAGACGATTTGTGTCGATTTACGAAATGATGACAACGA
-GGAAAATTTCGTAAATCGACACAAATCGTCTCTTCCGCGCGCCCCGCCCC
-ATCGGGTCCCGGATGTCTGTCGCTCTCTAACTATCTACACTCTCTGTACC
-GGTAATACTATTGCAGTAATCGCAGGTTATTTCATAGCGATTTTTCATAG
-CTTCACGGATTTCTGGATTCCCTCATAAATTGAAATGGAAGAGTTTTTGC
-TGAACTAGGCCATTTTGGCTCTGTCATATCTGGGGTAGATTTACGGCGCG
-TTGCGGTTCGATTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGT
-ACACGACTTTCTCACGCGTGGTCCGGCAGGCGATTATCAATAGAGCGCGA
-AAAATTCAATGAGGAAGGCCAGAACTCCGTGCAGCTTTACTCGCGAATTC
-AGGTGTGTGTTTTAATTGTCTTTATTCAGTTTTCTGATAATGAATATACT
-TTTTTACAGAAAAACTGGAAAACTGATAAAAAAGTCCCCAGAAACTAGAT
-ATTGAAATTACAGTACACTTTAAAGGCGCACACATTTTCACAGTAAACAA
-AAAATTTGTCGTGCCGAGATATTTCATCCAGATTATCAGTTGTTAAAATT
-TGACAACACTCATTTTGAATATTTAATGAATTCGAATGGAAAATAGAAGA
-AAGCTGCCAAAAAGTGAAATTAAATTCTCAAAAACTTGATTTCCAGACTT
-TTTTGGCGATTTTCGACCAATTTCAGCAGAATTTTTAGCAGAATTTTACA
-AATTTTTTTATTTTAAAGCTTATTTTAATAATTTTTCTCTGAAATATATG
-AATATCTTTGCTTTCGATGGATCTTCCTCAAAAGTAGACACACATTTTTA
-TTTTTCTACAAAACTGTGCAAAGTTACGTCGTGGTGTTTGCGTACCTCGG
-CGGGAATTTAAAGAGAAATGGCATTTTTCACTTTTCTCGCAGTTTTTCTG
-ATTTTTTTTTCGTTTTTTCGTAGTTTCCTAATAAAAAATCGTTCCAATTG
-TTTCCAGGTAATGGCTGGATTTGAAATTCAAAGAGTCGAGTCCAAATTCT
-TCGACTTGGACGACATAATCGCCAAGTCAGACTCCACGTCTTGCACATTT
-GAGATTGGAGATTTGAATCCAGGTCTGAAATCGCATCGAAAACCTAAAAA
-TTCTAGTGATTTTTGTTCAGATTTCTTCCAGGAAATGCTGGGAGTTTCGA
-AGCCAACTCAAAATGCAGACGGATACGGCGTTGATGCTCCATACTGGCTG
-CTGGAATCCGTTAGAAGTTCATTTTCCGTGAGAATTTAGTTAGATTTGCC
-CCGAATTTTAATTGAGAATTCCAGATTCAACTGCCAAAAGCTTATAGTGT
-GAACATGCAAAATGTGCTGAACGCTGACAGCAAGAAATTGAATCTCTCCG
-GCTTGCAGCAACACTTTTACGGCAACGGGATGCAGTTATGCCGTCTGATG
-AAGGGCGAAAATCCGGACGGCGCGCTGAGCCTCGCACGATGCCTTGTCTC
-CACACTTACACAGCGATTAGGAGGTATTAATTAATATAATAAAGCACTTA
-TAAAATACAATTTCTGGTTTTTTTTTGTTGCAGAAATTGTGTCAACTGCA
-ACCCATCTGCAAAGCAAAGGCGAGAAATTTGACAGCCTCGAGACAAAAGT
-GTTCCTGGAGGGTAAACGGTGCAAAGAAGACATTGATACTTGGCTGAGAC
-AAGACAATAAGTGCTCGAGCAAGAAGCGTAAGAGACTTTCGTTATAAACT
-TCAAATTTCTTATGCTTGAATCTAATTTTATTTTTTTTAATTCGTCTGTA
-AATATAATTCAAACCCACCATTCTGTAATAATATTTTATTTTCTATTTTT
-TCACACTCATTTTTGTGTTTTATTGGTGTAATAAACCTGGTTTCATGACT
-TTTTTGCAAGGAATTTTGTTGAAAAGGCTGCTGCAAAAACTTTGCCAGCA
-AAAAATTTTGTGCAAGCACGCTCCATCGCACAGTTTGAACGTCGCGGGTC
-GAAGTTAGATGTGCAGGTCATATAGCAAAAAGAGAAACACCCCTTTTTTT
-CTCGAGAAGTTTCACCAATTTTGCGCGATTTTTCAACTATTTTTTTGCTT
-TTTTGGCTTAATTTTGGCTCAGATTTTCCTCAAAAACATGAAAATCCAAT
-CTAGAATAAGTAGTAATGGGTATATTCTAAGATTGTGCAAAAGTTAGCTT
-GAATTTCCTCGATTAAAGCTTTCCTACCAAGAAAAATGTGTGGATATTTT
-GAATTTACAAGTTTTTCATCTTTTTTTTGTAATATTCTCTTTGAAACTCC
-TGTTTCTCTCAAATTTGTAAACTTTCATAAACGTTTTTTTCAGGGTTACC
-ACATTAAACAATGACCGGAAGCACCGAAACTCGCCAGAAGGAAGTCAAGG
-AGGTTGGTTGTTCAAAGTGACGTCTAAAATATTTAAATTTCTATATTTCA
-GCCACAAGTTGACGTTTCGGATGATTCCGACAACGAGGCCGTCGAGCAAG
-AGCTCACCGAGGAGCAAAGACGTGTGGCCGAGGCTGCTGGACTTGGAGAT
-CACATCGACAAGCAGGCCAAGCAAAGCCGCTCCGAGAAGAAGGCCCGCAA
-GCTCTTCTCCAAGCTCGGACTCAAGCAAGTGACTGGTGTCTCCCGTGTCT
-GCATTCGCAAGTCGAAGAACATCCTCTTCGTCATAAACAAGCCAGACGTG
-TTCAAGAGCCCAGGATCTGACACCTACATCATCTTCGGAGAAGCCAAGAT
-CGAGGATCTCACCCAACACGCCCAGATGTCTGCTATTGAGAACTTGAAGC
-CAACTCGTGAGGCCCCACAACTCAAGACTGTCGAAGAGGACGAGAATGAG
-GATGTTGAGGTAATTCAGTAACTTAATCGGATTTATTACATTAATTGTAC
-GGTTTAAGGAGGATTCCACCGGCATTGAGGAGAAGGACATCGAGCTTGTC
-ATTTCCCAAGCCAACACCACCCGCAACAAGGCCATCAGGGCGCTTAAGGA
-AGCTGACAATGACATCGTCAATGCCATCATGAGCCTTACCATGTAGCTTG
-TTTCCTGATGACCTTGCAGATACTCTTGTTATCGTTGTATCTCTTGCTTA
-TCCCGTTTTCCGTTCCAAGTAAACGTTTATCAGTCTTTTTTAACTTTTTT
-GTTATGTTTAAAAAACAATTGCATCTTCGAATTGACCTACCTTTTACAGA
-AAAGAACAATTAAATCACTGTTTGTGTAAAACACCCCTCTATTGATCGAG
-AACTTTCACTTCTTCCAATTCTTTACTCGTATGACTGTGATTCATTTCAC
-CTGCTATCACTTTATCATGACATTCCAGTTTATATCAACAGCAAATACCA
-ATTGTGTGTATGTGAAAAATGCTATTGAATAGCAAGCGCGCCCCAACAAA
-CACGTTTGAATGCGCGGGCGAAACGGCGTTAGATGTGCAGGTCATATGAC
-AAAACGCATCGACCAGCAGCCAATGGCAAGTTACTGCGAGCTGTTATAGA
-TTTTTTCACATGGTTTCCAGTGTTATCAGTTGGAAATCGATCGATAATAC
-TGACTAGTAGTACTTAACATCTTCATTCCCACCGTTTCGCTGTCATTTGT
-GATACGTGGATTTATTTTTCCTTTCTCGCCGACTTTTCATTTCTAAATCT
-TTTCTGGAATTGCGAAATTTTCAGCCAGTTTCATGATCGAATGGCTCGTA
-ATGAACCATCATCTCAGCAGCCGAGTAGTTCCGGGAGTAATGGAACTCCA
-GCACAACAAAACGGGTCGGCAAAACCATCAAAAGTCACAGTAAAAGGTAA
-CAATTCGTAGATTTTTTGCATCTGTTCTAATAATATTTCCCCCTCTTAAT
-CATAGTCGTCAACGCGTCGTTCACCAAGGCAGCCGACTGCTATGTCGAAA
-TCACGAGTGACACGTCATCGGCGGCGCCAAAAAAGACGACTGTAAAGAAG
-AAGACGATGGCGCCCGAGTGGAATGAACATCTCAACGTTCATGCAAATGA
-ATCTTCGACAATTTCGTTTCGTCTATTGCAAAAAGCCAAGCTATTCGATG
-ACACGTGTCTAGGGATGGCGAAGCTGAAGCTTTCGAGTCTCACAAGAAAT
-GAGAATGGAGAGTGTAAGTGGTTTTATTGAAATTTTCTCAAAAAATCTAT
-TATTTCAGTCAAAAACGACATCAACAATATATCTTTGCTGGCCAAAGACT
-CCTCGAAAATCGGAACTCTCAACATAATTTTCTCCGGATATCCAGAGCGG
-AAACGAAGAAGCGCAGGAGTACGAGCTGAAACCGCCGCGTCTGCAAGTTC
-AGAGGCATCCACGTCAAATGGCGTTGCCACGTCATCCTCGGCGCGGAGAC
-CGGCGACAGCGAAGCGTGACACTTTGGCGGCTCCAACGGTAATCGTGACG
-AGACCCATTTTGAATTATTTAATTATTCATGAAACGCTCTACTGGAGTGT
-TCATAATTATTAGAGCGCGCTCGCGCGGCACCTCACGAACTCCAGAATTC
-GCGAGGACAGCAGTTTTTGGCTATTTTGGCTTCTATGGAAATTATTTTTA
-ATTTTTTGATTTAAAATATTGTTGAGAAGCATCATCCAAATTGAAAATGT
-GTAAAATTATGAAATTTGACCGAAAACTGAAGGTTTTACAGAGAGGAGTC
-ACCACGGCTTTCTTTAAAAAGTATCAGTACCGTCAGTATTTCGATTTCAG
-AGTCGTAAAATATGTCATTTTGTAGAGAAACGTCTGTTTCACAAAAATCC
-ATGTTTGATATTTTAATTGTTTAATTTCTAATATAAAAATATTCAAAAAA
-TCAACAAGTTTACGTTAAAATCGAATTTTTCAATCGTTCAGTTTTTAATA
-AGAACAATTTCATAATTTCAAACATGGATTTTTTTGAAACAGACTTTTCT
-CTACAAAATGACATATTTTACGACTCTGAAATCGAAAAAACTGACGGTAC
-TGATACATTTTAAAGAAAGTCGTGGTGACTCCTCTCTGTAAACCTTCAGT
-TTTCGTTAAAAATAATTTCCATAGAAGCCAAAAATAGCCAAAAACTGCTG
-TCCCCGCGAAACGAAATCCCGCGAATTCTGGAGTTCGTGAGGTGCCGCGC
-GAGCGCGCTCTAATAATTATGAACACTAGAGGAGAGCGTGAATGAGCGTT
-TTTTATTCTTTTCTCTGCATTTTTAATGCTACAGAATCATACACAAAATG
-TTGTCAAATACATGCATTACTCTACTACTCTTAATGTTTACTTTTCATTT
-GCAGAGTACCGCAGCGGCGGCAGCAGCAGCAACAGCAGGCGGCACCCCGG
-CCGCCGGAGCAGAAGAACAGCTTCCCGATGGATGGGAGATGCGTTTCGAT
-CAATACGGACGCAAGTACTACGTGGATCACACCACCAAGAGCACCACGTG
-GGAACGCCCGTCTACTCAGCCATTGCCACAGGGATGGGAAATGCGAAGAG
-ATCCGAGAGGAAGAGTGAGTTTTCCGGCGGAAAAAGCAGATTTAGCACGA
-GAAAAGCGTTTCTGATTATATTTTTGATGCGAAAATCATCAAAATTAAAA
-ATATCTACCGTAGCCGCGGATACCTGGACCAAAATGCCGAAAAAAGTGAC
-CTGATAAATTATTTTAAGGCTAAAATCTTGATTTTTACATAATTAGTGTC
-TTATTTTTGTTGATTTCTTGTCAAATTTTTGTAATTGCATCGAAATAGGC
-CAAAAATAAAGTAAAAATCAACTTCCAACACAGAAAAACTGACAAAATTG
-AAGATTTTTGCTGAATTCAGGCAATTTTTCGTAATTTTGATCCTCCATAA
-TTTTTTTTTTCGAGAAAATTTTGAAATTTTTTCTTTAAATACGGCCTGAA
-AATTAGGAAATTATAACGACGGATAAAAAATTCTGATTTTCTTTATTTTA
-ACCAAGGTCTCCAATTATTTGATAATCGAAAAAAAAAAAACTTTCCAGTG
-ATTTTTACTTGAAAAATGTCTAAAAATTCACGCCAGGTGCACAATCCATT
-TTCAGGTGTATTACGTGGATCACAACACGCGCACGACCACCTGGCAACGA
-CCGACAGCCGATATGCTTGAAGCACACGAACAATGGCAATCGGGAAGAGA
-TCAGGCGATGCTTCAATGGGAACAACGTTTCCTTCTCCAGCAGAACAACT
-TTAGCGCCGACGATCCACTCGGACCATTGCCCGAAGGATGGGAGAAGCGT
-CAGGATCCGAATACGTCGAGAATGTACTTTGTGAATCATGTAAATAGAAC
-GACACAATGGGAAGATCCGAGAACACAGGGGTATGTGAAAATTTTCAATT
-TTCCAATAATATTTCTATCAAAAATCACAGTTTTAATGTTTTAAAAGTTT
-CAGAGGCTCCGACCAACCTCTTCCGGATGGTTGGGAAATGCGATTCACCG
-AGCAAGGCGTTCCATTCTTCATCGATCACCAGTCTAAAACCACCACCTAT
-AATGATCCAAGAACCGGAAAACCCGTCGGCCCGCTCGGCGTCGTCGGTGT
-TCAAATGGCCATGGAGAAGAGTTTCCGGTGGAAAATTGCACAATTCAGAT
-ATTTATGCTTGGTAAGGGAGGGCGAGAAATTCTTTGATTTTAGCTATAAA
-TTGATGTAAATTTCAGTCAAACAGTGTGCCTAATCATGTCAAAATCACAG
-TATCCCGTAATAACGTGTTCGAAGACTCATTCCAAGAAATTATGCGTAAA
-AATGCAGTCGATCTACGCCGGCGGCTGTACATTCAATTCCGAGGCGAAGA
-GGGTCTCGACTATGGAGGTGTCGCCAGAGAATGGTTCTTCCTGCTGTCGC
-ACGAAGTGTTGAATCCAATGTATTGCCTATTCATGTATGCTGGTAATAAC
-AATTATAGTCTTCAAATCAATCCAGCTTCATTTGTTAACCCGGATCATCT
-TAAGTATTTCGAGTATATTGGACGATTCATTGCCATGGTGAGTGTTTTTT
-TTTAATTGAAAATCAGTTGAAAATTGGATGAAAAATTGCGAAATCGAGAG
-AAAATCGAGTTTTCCGCTTTTTACAATTGAATTTTAAAATTTTAAACGTT
-AAATTTTGCAGAAAATTCCAAAAAAAAGCACTTGGATCTAAAATTTTTGT
-TTTTTGATGAAGGAAATCCTTAAATATCGATTTTTTTTATTTTCAGCTCA
-AAAAACCTGGAAATTTCGATGATCTCAAATTTTCAGATCAATATATTTCA
-TTTTCTCCTAAAAATGTTATTTTTATTTAAACAAATAGTTTTTCTTAGAA
-AATTCCTTTATTTTCAAATTTCCAGGCGCTATTCCACGGGAAATTCATCT
-ACAGCGGTTTCACGATGCCATTCTACAAAAAGATGCTCAACAAGAAGATT
-GTTTTAAAGGACATTGAACAAGTCGATTCGGAAATTTATAATTCATTGAT
-GTGGATCAAGGATAACAATATCGATGAATGCGATATGGAGCTCTATTTTG
-TTGCCGATTACGAGCTGCTCGGCGAGCTCAAGACTTATGAGCTTAAGGAG
-GGCGGTACAGAGATTGCTGTTACCGAGGAGAATAAGGTGAGATTTTGGAT
-TAGCTAGAGCTTATAAAAATAATTTTTAAATAAAATAATTTAATTTAAAA
-AATCCCAATTTTCCAGCTTGAATACATCGAACTGCTCGTTGAGTGGCGCT
-TCAATCGCGGTGTCGAACAACAGACAAAAGCCTTCTTCACCGGCTTCAAC
-TCGGTCTTCCCGTTGGAATGGATGCAGTATTTCGATGAAAGAGAGCTCGA
-GCTGTTGCTCTGCGGAATGCAGGACGTTGATGTGGACGATTGGCAGAGAA
-ATACTGTCTACAGACATTATGCTCCACAGAGCAAGCAGGTAGGGGAGAAC
-ATTTGATTAAAACTTCTTTTTTTTTAATTAAAAAATACATTTATAGGTAA
-CCTGGTTCTGGCAATGGGTTCGAAGTCTGGACCAAGAAAAACGTGCCCGG
-CTCCTACAATTCGTCACAGGAACGTGCCGTGTGCCAGTCGGTGGATTTTC
-CGAGCTGATGGGCTCGACGGGACCACAACTATTCTGTATCGAGCGTGTCG
-GCAAGGAGAACTGGCTCCCACGGTCGCATACGTGCTTCAATCGACTCGAC
-TTGCCGCCATACAGAAGCTACGATCAGCTCGTCGAGAAGTTGAGCATGGC
-GATCGAGATGACGGAAGGATTTGGAAACGAGTAGTCTCCCGTTGTTTTTT
-TTTGGTTTTGCTGGCCGCCTAATTATTGTATAACCCTCATATTTCTTCTC
-ACCCACACCCCATTGATTTTCCTTTTTTTTCTCTCCATCAATTAATGTTT
-CTTTTTTTCGAATTTGTGTGATAATTTTCGTGTTGTGATACCACTTGCTT
-AGGTTCTCTCTCTCTCTTTCCTTTCCTTCTGGGTATGTACCTATATTTAG
-AATATAGACAAAGCATCTAGTTTTTTTGGATTTAATTTCCAAATTTCCCG
-TTTAATTCCAACAACAAAAAAACAATTCCACCACTTTTCAAATATTTTTT
-TTGTGTCCATTGCTTCATTGCTTTTCTTCTTCTCAACCATTTCAACCACC
-ACCACCCAATCTGCGCCTTATTCTTACTTGGTCCTTGTCATTCTTAGTTC
-CAGTTTTTTTCACGGAAGCAGCTCTCGATTATTAATTCAAATGCATCCCC
-CCAACCAATCCGTCACCCCCCGATTAGAACAATTTCTACTTTTTTTTTTG
-AAAACAAAAAAAAACACAATTCCTCGATTTGGTTGTAATGAATTTAATTT
-TTTAAATTTTGAGCCTTTTTTGTTGTTTTAGGTTTTCTTAACTTTCAGAA
-TTTCCATGCGGAACACACGGAGAGCAGAAGATCAATATTTTGAACCCTGC
-AGGAGAAGGACGGGACCCTTTGGTCACTCATGTCTCGGCTGTCTGCGTCT
-CTCCTCTCTCTCTGCACCAGCGGAGAGGATGGATAGCCTCATTCGTTTTA
-TTTCGGACTTTCGATTTTTCTTATTGCTCCACGTTTTAGCTTTTATCAGA
-TTCGGGGAGCTCTTGCTTTTTTCTTGATTTTTTCGTAAAGTGTTCTTGGG
-TCCCGCAGCGAAAATTAACTTTAAAATGATTTTTTAAAAACTTTCTAAAA
-ATTCATTTTTTTTTCCATTTTACGACTAGAAATTTCGAAATTTGAAAAAA
-AAAACCGTGTTGCAAATGCGCTCCAGCGTACAAAACAAAACCGCCACCAA
-AAAATTTAAATTACTGAAAAAAACGATGAAATTTTGAATTTGTTTTGCCA
-TTTTCCGGCAATGATTTTTTAAATAAAAAAAACTGTACAACAAATGCGCT
-CCAGCGAACTAACCTTCAAATTACCGAAAAAAATTATAAAAATTTGAATA
-TTTCCGATTAACCCAAGAAAAGAAAAATTCAATGATTTTCTTGAAAAAAG
-TTATTTTTTTCTCAATTTTTCGTCAATAATACTCAAAATTTGAAGAAAAA
-TTGTGTAGCAAGCGCGCTCTAGCGAACCAAACAAAATGTCTCCATTGAAG
-CGTTTCACGAGGTTCTGGCCTACCTCATTGAATTTTTCGCGCTCCATTGA
-CAATCGCCCGCCGATAACGCGTGGGAAAGTCGTGTACTCCACACGGACAA
-ATACATTTAGTTTTACTACAAATATCGAGCCGCGACGCGACACGCAACGC
-GCCGTAAATCTACCCCAGATATGGCCGAGCCAAAATGGCCTAGTTCGGCA
-AAAACTCTTCCATTTCAATTCATGAGGGAAGCCAGAAATCCGTGATCCAA
-GTAAAAAAAATCCCAAAAATTTCAATTTGCAAGGGCGCTCCATTGAAAAC
-TGTGGCGCCGATCGCAACTCACGGTCGAATTTGAATTTTTAGTTGAAAAA
-AAAACACCAATTTGAACTGAAAATTTGAATTTTCAATTTTTTCCCTAAAA
-TAAATTGTTCAGAGTTTCGCTGTCGAATTGTTGATACCCGCTCGTCAGAA
-TTGGAAATTGAGAAATTGAGAGAGAATTAGAGAAGGAGAGGAAGAGGAAC
-TGCTCACTGGTCCCCTCACTCCATCCGAAATTAGGCACTTTTTGCTCCGG
-CGGCACTAGAAGACGAAGAAAAAACGACGAGCAGAACACAATCAATTTCG
-TCTTCTTTTTTATTTTTTTTTGGTTTTTTCTTGTTGGTACCACGGATTTC
-TGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAAATAGGCCAT
-TTTGGCTCGGCCATATCTGGGGTAGACTAACGGCGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTGTGGAGT
-ACACGACTTTCCCACGCGTTGTCCGGCGGCCGATTGTCAAAGGAGCGCGA
-AAAATTAAATGAGGAAGGCCAGAACCCCGTGGTAAAACATGGTGCATCAA
-CGCAAAAATTTTTCATTTTTTGGAAAAACTCAATTGTTTTTTTTTCGCGT
-CGGGACCACCAAACCAGAGCTCGTTTACTAAATTGAATTTCCAAAAAAAA
-AAAAATTTCGCTCTGTTCAAAATTCGAAATTCAGTTTTCTTTCCCTAAAA
-CCTAATAAAATGATCTTGGCACAATGCTCACTGTGAGCTTTGGGTCTAGA
-ACGATGGCCTAGAAATGTTGAGATTTCCTCTTCCAGCGCCCTTGCCAATA
-TGACCTAGAAATTTCAAATTAGTATAACTCGGCCATTTTCCATCCGTTTT
-CGCCAAAACTACACCATTATAACATTTAAAACTTACTTTTCAATATGATG
-ATAATACTTTTCCAGTGGAAGAGTTTTCCGCATTTCTAAGCCACCAAAAC
-CTCTCCTCCCGACGTTTTATCAAACAAATGATATCACTGTGATTTGTGTT
-GTAAGTTGCGCGCATGATTGCACTTGCGCAATTAATTAAGACAATTACTC
-AAAATTTTGATCGAATTAACCCCATGTACATATAAAATACAAGATTTTTG
-TGTATTGTTCTTCAAAGTTTTTTGTCGTATTTATATAGAAGCAGTGTACA
-CCTAAATTTGGCTTATTACGACCTTTTTTTCCAAGGAAAATACTCATTTT
-TAGGGTTATAAACCCCTTGATTGATACGTGGCCTAGAAAACTGCAAGCGC
-TTTTTCCTGGAAGTTTTAGGCCACCAGTTAGAGTCTTGCAAAGACGGACT
-AGTTCTCACATGACCCAGAAAGTCTTAGTCCATCACGTATTTCTTACGAC
-GCCTAGAAATGCAAATCTTCGGCCACCAATTTTCATAGACATTCTAGGCC
-ACCCTTTTTGACGTGGCCTAGAATCTTTAACAAAATTTGTAATGAAAATC
-CTAGGCCACCATTCAGTTAGCTCTCATTTTTGATACTTCGCCTAGATTTT
-TAACACGTGGCCTAGATTTCTATTTTAACACGGGGCTTAGATTTTTATTT
-TAACAAGTGGCCTAGGTTTTTGCTACTAGGCCTAGATTTTTTACATGTGA
-CCTAGATTTTTATTATAGCACCTGACCTAGATTGTTGGCATTTGGCCTAG
-ATTTCTGTCATGTGACCTAGATTTTTTAATGCACCAAAAATTCTCCATAC
-AAATTTAACTCCTACACTCTAATTTGTAATCAGAACCTTCGATAAGAAGA
-ACATGGAGCTACTGCGGTGCTCAAATTCCGAACAAAAAACGGCTGAAAAA
-CTGAGGTATACGTGGTTTTTTTTCGAAACTGATAAAAGTCAGCATAAATC
-ACGATAAACTGAACGTCCTTTGGCCAAGTTTAGAGAAACCTAGGCCACGG
-GTAGTGGTGGCCGAATTTTAAAAAAACTGGGCCACGAGGTTTACGTGGTG
-TCAAATTGCCCCATTTTGGTTTGATCTTCGAAAAATGCGGGAGACGAGAC
-GCAGACTTTTCAACTGATTTCGCATGGTTAAGAACGTGCTGATGTCATTT
-TTTTCCGTGGAAAAATTCCCGCATTTTTTGTATATCAAACCACAACGAGA
-CACTCTAACACCACCGTCCGGCCGTTCAAACGAAAATTTAGGCCACGGCC
-ACTAGGGTGAAGTGGAATGCCCTACCCTTCTCTACAAAATTCATTGGAGA
-AACCTAGGCCATGCTCAAAGAAACAGTGGCCGAGAAAGGAAAAACTAGGC
-CGCGTTCGCTTTGTACCTCTCTTATAAAACACTGTCTGTTAGTTCATAAA
-TCAGAGTCTGCCCCCTATCACTACTCTCTCATTTACCTGCCCCTCTTAAC
-AAACAATCAACCCCCCCCCCCCCTCTAAATCGACTACTTGTTCCCCGTTG
-TACCTGTCTGCGTCTAGCTATTTCTGTTAAATTTTTGGAACGAAAAAGTG
-GTATGTGAATGTACGAAACAAAAATAATAATCAATTGAATACAATTTTTG
-CCCCCCCCCCCCCCCCCCCTCCACCCCGCTTGCCTGTCTCTAACCGGTTT
-CCCCTTTTTCACCTCAATCAGCCCCCCCCCCCCCCCCCCCCCCCCAATTT
-CATTTGACTGTACATTTTCCTTTACCTATCTGCGTATCTACACAATTTTT
-GTATTTTTTCCTTTTATTTTTCTAATTATAAACCCTGCAATTTGCAAGAA
-AAAATCTCTAAAACGCTTGGCCCCTTACCCGGAGTGCGACCGTGGCCTAG
-AAATTTATATTTCTTATAAGACCCCCCGGCTCTTCCAATTTTTCATTTTT
-TTTCTTTGAAAGCCTAAATTTTCATTTTTTCTTAGAGATCAATATATTAT
-GGGTTAGTAAAAAATTTCAAAAACAAGCTCCCCGTGGGCGTGGAAGAGTT
-TTCCAAATTTCTAGGCCATACTTTTCGAAGGCGTTGGGGTACGCTCGCAC
-CCTAGTACTAAAAATTGTAAATTATAAAATTATCATAAAATTGGCTCAAA
-GCATTTGAAAATAATAAAAAAAATTTTAGAAAAAAAAACACGAAAAAAAC
-CCCTATTTTGAACATGGTTCATCGACCGGGACCTATATACTTTGAAAGCT
-TATATCTCGCTTCATGTTTGTTTTATCAAAAATTTTTCAACCAACAAAGT
-GTTTATTATTTCTTTTTCTATATTTTTGTAATTAAAAACTTTTTGATAGC
-TTCAAAAGTAACTGAGATACATGTTGTCAAACAGAGCAAACTTATAGCTT
-AGCCCAATTATTTATTTTTTGCTGTGTAACATTTCTTGTATAAACTTTTA
-AAGTTTACGGTTTTTTTAAATTTCTAAAAAAAATTATTGACACTTTAAAG
-GGAGGTCATGTGGAGATAGCCTGTACAAATAAAACTGATGAACTAGGACG
-AACCGAAATTCATAAACCATTATTTACACAGGTGATTCTTGCCTTTTTTG
-GAGGGTTAAAAAGGTTAAAAATTATTTAAAGCTTGGAATGAGCATTTGTG
-CGGCCGAGTTTTTATTTTCTAGGCCATAATTTTTAAAACAATGGCCTAGA
-AGCACAAATTTCTAAGTAATTTGAATTTCCCGCCAAAAATTTTTTTTTCC
-ATAAAATTTAAATTTCCCGTCGAAAATTTTTTTCGGAAAATTTGTATTTC
-CCGCCAAAAGATTTTTTGTCTCAAAAAATTTGAATTTCCCGCCAAAATGT
-TTTCTCAGAAAATTTAAATTTCCCGCCAAAATATTTTTTGTCTCAAAAAA
-TTTGAATTTCCCACCAAAAATTTTATCCCAAATTTTATCGAACATTTGGT
-GGCCGAATTTCCATTTTCTAGGCCACCCTCAGTTAAATCGTCAAATAAGT
-TGACCTAATTAAATTAAAAATTAACAATTTGTAATGTCTCCGACCAAAGT
-TTCATAATTGTATAGATCATCATGGTGGGAGGCGGGGTAGCACTTATGAG
-TGAACTTACCGGTTGACCGCCCGTCTATACATAGTAGCCAACACCCGACC
-ATTTTCTGCCAAATACCTATAATATCGCTTCGAGACCCAACTATTGCACA
-GTTGTGGTTTATTTCGGTTGAAGACCCAATATTAATTTACCTACAGCTGC
-TAAAGCGTTTTAAGACCTAAAAAATTAAGCAAGGCCCAAAAATCCAAACT
-TAATACTATAGTACTTCTCGTTTCGAGACCCAAAATCCAAAGCTAGGCCA
-TATTCTTGGTGAGACCCACCTGTAATAAATATCACTTGAGTGAAAGTGAA
-CTCTTACTTTTTTCTTTCGACAGCCAAAAAAAATTGAGTCAATTAGCAAA
-TAATTCACGTCTCCCCCTTTCAATGTTTACATACACATTACGAACGAGAA
-AAAAAAACGAGAGAAAAATTGAGTGAAATGGAATCAAAATGTGTTCATTT
-TTACTTTTTATGAAAATTTGGATAAGCACATGGCGTCAGAGTGTCCCATT
-TCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGTGAAGAGACGCAGA
-GTTTTCAACTGATTTCGCTTTTTTTTGGGCGAAAATTTCCGCATTTCTTG
-TAGATCAAACCGCAACAGTGGATAAGCGCGCTCTATCGACAAACCCGGTG
-TGTACTACTCGCGGACAACCAGTATAGTTTTTTTTTTGAATTTTTGTTCG
-AAATTGAAATTGAAATAAGATGCCAAATTTAAATTTAAAAAATAACAATT
-TTTGAAATTAAATTTTTAAAAAAATTCCCCGTAAATCTACACTTAGTCGC
-GTAAATCGACAAGGCTATTTTTTTCAATTTTTGCCCATCGCACTTTTTTT
-GCCCAATCAATCATCGTCAATTGATCCATTGATCTTCTTCTTCTTCTCTT
-TCTCTTTTCTCACCACCGAAAATTTCATTTTATTTTTTGACACTGTCTGC
-GTCTCTCTGTACCCCCTATCTCTCGCCTCTCAAGGACTATTACAACGAAA
-AATTTGGGGAGAAGCCGTGATTTTCATTTTAATTTTGATGAAAAATTTTA
-ATGAAAATGAAAAAAAAAATTGTTTTTCAAAAAACAATCCCCTCGTAAAT
-CCACACCAAATTCAATATTCACCTTATTACAAATTGATTATTTTTCCCAA
-AAAACACACGACATCGGGCGCCCATCTATTGTTTTTTATTCCAAAAAATT
-TCTGCAACTGTCTGGGTCTCCGGTTAACACTGAGAAACAACAAATTTCAT
-TTTTCGATTCATTACATTCATTTTGAAGGTTTTTGGTTACAAATTCGACA
-CGGATTTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTGCTGAACTA
-GGCCAACTTGGCTCGGCCATATTTGGCATAGATTTACGGCGCGTTGCGTG
-CCGCGTCGCGCCTCGATTTTAGTTGTAAAACTAAATGTGAAGTGTCCGTG
-TGGAGTACACGACTTTCCCACGCGTTGCCCGGTGAGAGATTATCAATGGA
-GCGCGAAAAATTCAATGAGGTAGGTCAGAACCCCTTGAAAATTGAGAAAA
-AAAAATCTCACAACGATACTCCGCAAAGTGTGCGTGTTGTTTATTAAATG
-ATAAATTCAAAAGCAAATAGCGATTTTGTTTCAAAAATATGCCGAAAAAA
-AAGAAAAAAAATTAAAACAAAAGTTCAGCCACCAATTTTATTTCTCGGCC
-ATGGTTGTGTCGTTGTTTATTTTTTTGCGATCGTATTTTTTCTATAATAA
-GACTTAAAATGAAAAAACATTAATAAAAATCAGTTTTCCATGGCCACTGT
-CAAAAGTCGCAACGACACTCCCCTTCCAGGCTCCTCCCCCCCGCGTGTAT
-TTTAGCATGTAGTGTAAATTACGCGATTTTGTGTATAAAACCCTAATTTT
-TTAGAAGATTTGAGAAAAAAAACTTTTAAAAAATGGGAAAAAATCCCCTT
-TCCCTTTTTTGAAATACTTTCCGACAAAGTTTAGCCAAAAGTCCAAAAAA
-AACCAATATGGCCTAGAAAAAATCAAAAACTCGGCCATCCAAAAAACTAG
-GCTACACGTTCTTTCGACCTCTGCTCCCCACACCTATGCTGCCCATATCA
-AATGTCTCCCGGACCCCTCATTCCGTCACACATTTCTCAAAAAAATGTCT
-CTTTTTCTCAAATTCTCTGTCGAAAATCCCATATCTCTTCAGTGTTCAGA
-ACTGACTGTTTTATTTCAATTCTCATGATCTCATGTCTCCCGTATGACTC
-ATTCCTTCGATATATTTTTCTTTTTTCAAAAATCATTTTTCCTATATATA
-GACTTTGTTCGGTGGGAATTTCTCATTTCAAAATATTTATTGAGGTCGCT
-TGTTCCCTTTTTATATGGTCGTGGCCTAGGTTTCTAAAACTCGGCTACCA
-TTTCCAAGTTGTAGCTTCGAGCTCTTTGTCTCGGAGTAGAAAAAATTCAC
-GAAATAAATAAAAGTTCACGTGGCCGTGGCCTAGATTTCCAAAACTCGGC
-CACCAATTTTTTTTCTCTTATCAGTAAACCACGTAGAACTCCTTTTTTTC
-TAGCCATTTTTTAACTGAATTTCCAACATATTCGGTGGCTCCATCAATTT
-TACTGATAGTAATTTCCAATAAAAAAAGGTATTTCTGTCGATAGGAACCC
-ATTTTCATCTACTTTTTGTTTCTACTTTATGGGTTTTGCCACTTTCCCGC
-ATGCCTACGTGCCTACCTATCTGCCGACCTAATATACCTCGTAGGCAGAC
-CTCGGCCGCCTTGTGGTGAGATGCCAGTCGCTTTGTAGGCAGGCGTAGTT
-TGTCTTGCTGGTATGAGTAGGCCTGTCAGCCGCCCAGTAGGCAAGCGTAG
-GCATGATGCAGGCGTAGCAGGCTTCTTAACTAGGCATCGGCTGCCTTGTA
-AGCCGGCGCAGGTAAGTGAAGGTTTCTTCGTGGCTGGCATCCTTGCAGTC
-AGGCACAAGTCGTCGGCTTGAAGGCAGGCAGATGCCGCCTAGTAGGCAGG
-CATATTTTACTTATAGGCAGGTATTAATGATCCTCTAGGCTTGCGTTGGT
-CGGTTTGTAAGCTGTCGTAGGCTGCCTTGTAGGCAAATTGAACTCTCAAA
-CCAAACAACACAAAAATTCCAATATTTTTTGTACCTTCTGATTTTGATCT
-CTGACTCATGATCTCTTTATCAATCTCATATCTTCCATTTTTAGAAATAA
-ACAATTTTTCCCTTCTATTCATTGACTTTAATCCCTTTCAATATTCATTC
-AATACACCTATAATACGAAAAACTCTTATCTTTTTTCATTTTATCACACA
-TGGTGCATAATATTATAGTTAGTGGCTATTGAAAAAGCACATCATTTTAT
-CACTTTTTGTCACTTTTCCACGATTCTCAACGTCTTTTTTTTAAACACAA
-AACGTTTCCCGTCATTTTCTACAGTACTCCCGCATTTTCATTTTCCAGGT
-GAGACCTGAGATGGAGGGCGACGAGTTGGTTCATCGTCCGACGGTCCTCT
-CGACGACGGCTTCTGCCACGTCACGGCCGCGACACAAGACTTTTGAGCTG
-TTGGGTCCGGTGAATAATATCTCGTTGGCTGATATGTATAAAGTGTGCGG
-GAAGATAATTGGCAGGTTCCCGATTGCATTTATTATTGCGACGGTGATCA
-TGTGCAGTGGTGGATGTTAGTTTTTTTTGACGTAAAAAATACAGTTTGAG
-AAAATCTTTTTTTAGATCAAAAAAGAAGAAAAATATGGAAAAAACAACAT
-TAAAATATTTTTTAGAAATCAAAAAATGTAAAAACTGTATGATTTTACTT
-AGGGCCTCCATGGTAGACAGGCACGGTTTTAGGGCCTGACGCCTGCCTGA
-AACCCACGTGGAGTCAGAAAGTCCCATTTCGCTTTGATCTTCAAAAAATG
-CGGGAGAAGAGACGCAGATATCTCATCTATTTCGCATGGTTAAGAGCGTG
-CTGACGTCACAATTTTTCTGGAAAAATAATCCCGCATTTTTCGTAGATCA
-AACCGCAATGAGACAGCCTGACACTATTAAGCCGCAAAGGCAAAAGTGTT
-TGCCGTCTGAATTTTGAAACAAAAGGTTTAACCGGTGAAAATTGAAAAAA
-AGTATAATAATAATAATAATAAAAGTAGAACTATTTTCAGTATACTAAGG
-CAAAATGATTGTTTTATAAAAAAACTTAATTTTAAAATTAGATCTCCTAA
-ATGTTTCAAGCAGCACAACTTTCATGTGATGTCAGGCTGTCTCATTACAG
-TTTGATCTACAGAAAACGCGGGAATTTTTCTCCCAGGAAAATGTGACGTC
-AGCACACAATGCATAATCAGATGAGATTTCAGCGCCTCAACTCCCGCATT
-TTTTGTAGATCAAACTAAAACAAGACTCTCTGACACCACGTGAATTTTCC
-AACCATCAAACTATCACAAAAAAATTGGCGCCAAAAAAACTTCTTTAAAA
-ACTTCTCATTTCCAGTAGGAACAATCGGTCTCGAACTGAAGGATAATGTG
-CGCGACGGGTACACGCCGAAAAACTCGCTATCCCGACTGGAAAATCGCCT
-TTATCGAGAGTTCCTGAGTTCCGAAGGTGATCCGGTGATGACTACAGTTC
-TCATGACTGCCAAAGACGGAGGATCCATGCATCGGATCAAGTATTTGGAA
-GAAGCACAGAGGGTGAGTGGCATAACATATCGGATACCGTATTTCCTCTA
-TTAGTAAGGCATGCAAAACTGATTTTCGGACACCTAATTTGATGCAAAAC
-TAATAGAGGGTGCAAAACTAATTTTCGAACAGGTTTTTTCTCATTAAGTT
-ATATTATAATATCATCAATTTCAATAACAACTTCTGAACCAAAATGGGCG
-AATTTTACGACTGATACGCAAAAATTGTCCGAGTTGTACTCATATTTTGC
-CAGTTTTGACTTGTTATACCAAGTCTGTAAGAGTTTTCCTAATTTTCAGA
-ACGATTTTATAATGCAAATTTTGAATTCCTAAACATAGGGAACAAATTAA
-GGGGTGCAAAACTATTAGAGGTGCAAAACTAATAGAGAGTGGAAAACTAA
-TTTTCGATTAGTGATTTTTGATGCAAAACTAATGGAGGTGCAAAACTAAT
-AGAGGTGCCTAACTAATAGAGGAAATACGGTATATTTTTTTGAATAAAAA
-ATTTCAGCAATGGCTCTACATCTCCAAAAACCTATCCGCAGACGTTGGAA
-ACGGCGAGTTCATGAAATTCGGAGATTTCTGTGGCCACTACTGCCAAGCC
-AACGACATCATAGGATACTTCCTGGACGCCTACAAAACCAAGTCAGCTGA
-CCCAAAAATGGATGGCTACCAACTCAATTACCCAATTACCACAGTAATGG
-GTTATCAGCTTCATCTCGAGCGTAACTTTTTCGGGGTTACTGTGAATCAG
-TCGGATCCGGTCACTAATATTCAGAGTATGAAGGTTCTGACGCTTCCTGT
-GTTGTCAGAGGTACGGACGTTTGAGGATACGGATAAGCTGAACAAGTGGG
-AGCTGGCGGTTTATAACTATGCTACAGGATACTCTGCACTCGAGGGTGAC
-GATCATTTGGTGGAGATTAATGTGAGTGAATAAATTGGACCATTTCAAAA
-ATATTGGGCCAGCCCTAAAAAGACAGCGGGCCGGCCCATATCGACCCACT
-TAACAGGCTCAAAAAAGTTTAGTTCAGTTGTGTGCCGCAAATTTTGAAAT
-TTGCCGAGCTCGGCAAAATCGGCAAATTTGGTAAATCGCATAATTTTCGA
-GCTCGGCAAATTCGACAAGGCTAAATGTTTGAATTTTGCCGTTTTCGGCA
-AACGGCAAATTTGGCAAATTTGCCTTACACCCCTGGTTTAGGGGTTTCGT
-GTTTAATTTTCAAAGCTTAGATAAACCTCTTTTCCAGGTGATCGGTGCTG
-AAGTCGTCGACACCGAAATGAACAAGGACGCTCAGAAAATGGTGCCCTAC
-TTCATCGTCGGAATCGTCTCGATGATCATCTTTATCTTCTGCACCGTATC
-CATCTCTGCCTCCTACTACGGATACTTCTCCTGGCGAATCGGACTCATCG
-CCCTCGCCTGCCTCTTGGTTCCGATTCTCGCAATTCTCACTGCATTCGGA
-ATCAATAATATGCTGGGAAATCGAACGAACTCTCCGATGATGATCATGCC
-GTTCTTGATCAATGGAATCGGAGTCAACGATGCGTTTTTGACACTTCAGA
-ATTGGTTGCAGCATAGCCCGGATCTTCCGTCAGGGAAGCGGTTGGGGTAT
-ATGTTGGCTGAAGCTGGTCCATCGATCACTACGACCACTTTGACAAATGT
-CATTGTTTTTTTGATCGGGTGGATGAACCCAACGGAAGGTAAGGTTCAGT
-GGTGGACGGCAAACTACTTTTTCCGGCAAATCGGTAAATCGGTAAATTGC
-CGGAATTGAAATTTCTGGCAAATCGGAAAACCGGCAATTTGTCGATTTGC
-CGAATTTGCCGGAAAAAAAATTGCCGAACGGCAACTGCGCCCTGGTAAGG
-TGCATAGCTTTGGCCTCTAACATAAAAAAATTTGTCTATTCATCCTTTAT
-TCCAAAACGACATGTATTCCAGAGATGTCAATCTTCTGCCTTGGATGTGC
-AATCTCCCTACTCCTCGCCTACGTCTACACCCTCACGTTCTTCTGTCCGG
-TGCTAGTTCTTCTGCTTAGCGAACGCGTCAATGAGCCCAGCAAGCTCGAG
-GGCACTTTCAACAAGGTTCTCGGATTCTACGCAAAAATCATATGCAGCCG
-ATGGACATTTGCACTTCTCATCATCGGAAGTCTTGTCTACTGGGGTTTCG
-GTATCTATGGAACACTGGGGATCCGTGCCGTGTTGAACACTGCAAAGATC
-CTTCCCCTGGAGACGCCGATCCGCAAACCGAACAGGATTATCGAGGAGAC
-CGTGTGGAAAGAGTTCTACCCAGTCACCGTGATTGTGAACAGCCCAGTTG
-ATATAAGCAATGCAAATGCACTTCGAGCATTTGACAACCTCGTTCACGAC
-TTTGAATCGATGGAAAAGTGCCGGGGATCCGAGTACACCATATCTCCAAT
-CAGAGACTATCAGACCTATTTTTACGGTGTAGGAGCCGAGGACTTTGATT
-ATGAGGAAGAAACCGTGAAGAACACCTCACATTCTTTAGATTTCAGTGTA
-AGTTAGCAGTCCACGCGTTCCTATTAAAATCTACATATATGCCTATAACG
-TGTTTATCCACAGAAGAGAAAAATCGCCATATCTGCCGCGCAAATGAATC
-CGCGGGAAGAGACAAAACTACTGTAGTTTTTAACCAATTTGTGTAGATTT
-ACGAGCTATTGCGTCATCGTTGTATTTAATTTTGAGCCGCAATTTTTAAT
-TTTCAGGCGTTTCACACGTTTTTATATTGAAATTTATCTATTTATTGAAT
-AAATCTTAAAAGAAAACACAAAAAAATTAGAAAAATTCCGAAAAACGCCT
-GAAAATTAAAAATTGCGGCTCAAAATTAAATTCAACGATGACGCAACAGC
-TCGTAAATCTACACAAATTGGTTAAAAACTACAGTAGTTTTGTCTCTTCC
-CGCGGTTTCATTTGCGCGGCAGATATGGCGATTTTTCTCATCTCTGGATA
-AACACGTAATACCTACATATTTTGTGTGCCTAAAAACATGCCTAGCAGTG
-AAAGTAGACAAATGTAAGCACACAAACGTGAGTAGGGCTTAAATGGTATG
-CAGGCACTGTTTTAGGGCCTGACGCCTGTCCAGGCCTGTCTTGTACGTTT
-CATCAATTCAAGCCGTATATTTCCAGAAGCTCACCGGATTCCTTGCCAAC
-CCTATCTACAAGCATCACAAGGGAGGACTAAAACTTAACTTTTCAAATCC
-GTTAGTTCCTATCTGCCACCTTACCCTAAATCGAGTACCATTTTCAGTGT
-TCCAATCCGAAAAGTGCAACTGATATTCGCTTATGAAAACGTAACCTCGT
-GGGATGAACGGATTCAGATTATGCAGGACTGGCGGACCATCGCAAGTTCC
-CACGTGGCCCTAAATGTTTCAGTGTGGAATGTGAACGCAATGTTCGTAGA
-TCAAATGCTGAGCCTGAAGGGATTGGCGATCTCGGTAAGATCTCAATGGT
-TCCAGCGCCCTATAAATACCGCTTATTCTTTCAGAATGCCCTAGTCACCT
-TGGGATGTATGGCTGCCGTCTGTGTAGTCTTCATCCGCAACCCCCTCTCA
-GTTGGCCTAGCGACCGCTTCGATTTTATCCATCTCCATTGGAGTAACTGG
-ATACCTGTGCTTCTGGGACTTGGATCTGGACCCTGTGACCCTGTGCGCAG
-TAATTGTTTCAATTGGAATGTCCGTTGACTTTGTTGCCCATGTGGCCTGT
-CACTATCAGGTCAGGTATAAAGAGTTCGAGGAGAAAGGAGTATTGAAGAG
-GATTGAGATGAAAACTCCCGAATCTCGAGTCGTCAACTCGCTGTCCAATG
-TGCTCTGGCCAATGGTCCAGTCGGCTTCTTCAACTCTTCTATGTGTACTT
-CCACTTGGTATTCTACAGGTACCTACCAATACCTATACTTTACCGATAAC
-CCTACCCCTCAAACATTCCAGAACTACCTCCCAATGGTTTTCGTGAAAAC
-CATCCTGCTCGTCGTGATCTGGGGAATGTTCCACGGTCTTGTGCTGCTCC
-CGTGCATTCTTGCACAGTTTCCCCTGTCTGTGTTCAACAAGACGTTCGCC
-GACTTGTTGTTCGGCAGAACATCCTCTTCGTCTTGCTCTTCGGAGTCCGA
-TTCGGAAACCGACACCGGTGATGCTCAGGAGATGGTTCCGCTCGCTGGAA
-CCGAGAAGGCTTAAGATCTGAAATTAGTTGTTGTTTGTTATTATGTACAG
-TTGGGATACAAAGTGTATTATGTAGTCTGTAGTGTCGCAGTGCTACAAAC
-TACAAATTCAAAGCTACAAACTATAAACTCATTGAGATCTGGCAGAGCTT
-TATAGTTTGTAGTTTTATGTAGCAGCTACAAACTACAAATTTCGATTGTT
-GTAGTTTGTAGTATGGCGCACAAACTACAATGTACATTTTGCAAGTTTTC
-TAGATTTTTTTCTCACTCACACACACACACACACACCGTTTTGCTACGTG
-GCTGCGAAAATGGAAAACTCGGCCACGTCGCAATTCACACATCGCCAGAA
-ACTTCTAGCTTTACCAGTAGCTTTTCATGATCTACTCTTCTTTTTTTTCC
-CCCCTCAATTTCTATTTGAAATTTCAGAATTCCCTCAATTAGTCTTCTGT
-CACCGTGTCCTCCTCTTTTCCGCAAGCGGGTCCCCTTTTCCCCCCACAGA
-TCGGCTTCTCAGGGTTCCTATAGCACTTTTTTCTTCGATTCTTGTCACAC
-AAAAAATTGTACTTCCATCGCTCGACGTGTCCATTTTTTCTTGTATTTTT
-TAAATGCATTTTTTGATAAATTTGATTTTTTTTATCATCCAGAAAATGGT
-CAAAAATTCAGATTTTCTTGCTGGGATTTTGCTGGAATTTTTTCAAGCAT
-CAGACATGCAAAAACTTATGCAAAACTACACAACACTATCGATGGGGACT
-GTTCGACTCTTCACCCCAGTCAAACTTTTTTTCACTATTTTTTTTAACTT
-CTGTTTTTTTGGTACTTTTCTGGCCGTTTTTATGGAATTTTTTAACCCGA
-CATTGGAGTTTACCTTTTTTTGTTCAGGATTTTAGGAATTTCTGCGACCT
-TCTCACTCATGTCCTCCAGCCCCGCCTAAGCCTATGCCTTAACTCAAGCC
-TAAGCCTAAGCCTAAGCCTAACCTAAATCGCGTCAGAGATAACGTTCGCC
-ACTGACGCCAAGCCTCAACCTAAGCCTAAGCCTAAGCCTAACACTAAGCC
-TAAGTATAAGCCTAAATCTAGGCCTCAGCCTAATACTAAGCCTAAGCCTA
-AGCCTAAACCCAAGCCATAAGAAGACACTCTAAAAATGTTCAGATTATTA
-AAAAATTACATTCAAAGTTTTCTTCAAAATTTTGCTTTCGACTTTCCAAG
-TAATCAATACCATGTAGAATTCCAAAATCTTCATACAAATCCCTCCCCTC
-TTCACATCTTTCCCGACAGCTTGTACTATTTCTCCTCCACCCACTAGGCC
-AGGTCAACGCTGCGTCTCTCGTGTTTCATATGCTATCTCCCTTTTGTGGA
-ATCCGTTCATCGTTTCGGATCGCTTACTTCTTCCGCGCGCGTCGCATTTC
-ACTTTGAAATAAACTTCAGTTTTCCTTTCCAAAATTTAATTGGTGGAAGC
-GTTTGAACATGCGAAATTTGTTAATTATCGTGTGTATTCATTTAATATTA
-CTACTTGTACATTTTACCGATGCATGTAAGTTTTGGATGTATCAAAAAAT
-TAAATAAATTTCTTAAAGGTGGAGTAGCGCTAGTGGGGAAATTGCTTTAA
-AACATGCCTATAGTACCACAATGACCGAATATCATGATAAAAAAATTCAA
-AAAATTTTTTAAAATTTTATATGATTTTTTGAAAATTGGAAAAATCTCAG
-TTTTTGCCTAATTCCAATTTGAATTACCGCTAATTGGATTTGTTCGATGG
-AGCGCGCTTGCACGTTTTTAAATTTATTTATTTTATTTTTTGTTATTTTC
-CACCGATTTTTAATGTTTTCGGTGTATTTTTGCTCTAATTTTAGAGAAAA
-AGTCAAGATGAATGCAGATTTTCGATTAAAAAGCACGCTCACAGGCGTAA
-AAATGACAAAGTAACGATTTTAAACGGTTTCGAACCTGAATTAATTAATT
-TCACTGATTTACGACTGTAAGCGTGCTTTTTAATCGAAAATTTGCATTCA
-TCTTGACTTTTTCTCTAAAATTCGAGCAAAAATACACCGAAAACATTAAA
-AATTGGTGGAAAATAACAAAAAATAAAATAAATAAATTTAAAAACGTGCA
-AGCGCGCTCCATCGAACAAATCCAATTAGCGGTAATTCAAATTGGAATTA
-GGCAAAAACTGAGATTTTTCCATTTTTCAAAAAATCATATAAAATTTAGA
-ATTTTTTAAAGAATTTTTTTATCATGATATTCGGTCATTGTGGTACTATA
-GGCATGTTTTAAAGCAATTTCCCCACTGGCGCTACTCCTCCTTTAAAGTT
-TGAAGTTTTAGTAAAAAAAGAGTGTCGGTTTTTTAGTTAATAATATTAAT
-TTCCAGTCGCCGGAACAGTTCGACCATTTTTCACCACTCTTCCAGTACCT
-GGAAGAAATGTTCCTATTATGAGATTATTCGAGAACTATGCTGCATCGTG
-CCGACCAAAAAGTAAAAAGGACTTCAATGTTGATCAGCTGGCAAATGTAG
-GTTTTTTCCCGCAAAAAGTCGTATTTCGTGCAAAACCGGCAAAAGCAAAA
-ATTTTGAATACCGGCAATTGTCGGAGTTGCCGATTGCCGGAAATCAAAAT
-TGCGGGAAATAAAATTTTGATACTTTTTTGTAGATTTAGGAGCCTAAAAA
-TGCATTTTAATGAACAATTTTTAATTTTCAAGCTCAAAATGATTTAATCC
-TTTAAGGATTGACCGTTTTCTTTAAAAAAGACTAACCGAATACTATAAAA
-AAAGGTGAAATTTTTTCAATTTCCAAAATATAATTAATTTTGGCAACTGC
-CGATTGCCGGAAATTGCCGATTGCCGGAACTTCACAATACCGGCAATTGC
-CGAAATTGCCGATTGCCGGAAATTTCCAAAACCGGTAATTGCCGGAATTG
-CCGATCGCCGGAAATTCCCGATTGCCGCGCACCCTTGTATTAAAGGATAC
-GGCAAACGATTTTTTCCGGCAAGCGGCAATATCGGCAATTGCCGAAATAA
-AATATTTTCGGCAAACGGCAAACGGCAGTCAGCAACATGCCACTTCTCCA
-ATTTTCGGCAATTTCGGCAAACGGTCAATTTGCCAGAAATCATCGGAAAA
-TTGTGATCTTGCACATTTTTTCTGGAAATTTCAGAATTTCAATTTTAAAC
-AACAACATTGTACACATCCTATGAATGACACATATCTTAAAAAGCCAGTA
-AATTCTATAAAAAATATCTAGAGAAACTGGCAAAATAATTAAAAAAGGCA
-CGGATTCATGTGATTTTGATTATTGAAAATATCTTTGAAAACTTTCGGAA
-AATTGATATCCGGCAAATCGGCAAATCGGCAACTTGCCGATTTCCCGAAT
-TTGCCGAGCAATGAACTACACTGTTCCAAATCGAATTCGTAACCGATATT
-ATACTTAGGAATGATATTTGTAACTCGTATAAATATTAAATAATATATAT
-ATATTCCAGCTTCTCCAATCTCTCCAAATGGATGAAGTAGCCACAAAAGC
-CTACAACTCCCTATTCTTCTCAATGGCTGATATGCAAATCGAAAAGTTCA
-TGGGTAAATGGTACACAGTTGTTGATTCGAAAGAAGTTCATAAAGAGGAT
-TGTTCAATTTTCTATTGTAAGTTTATTTTCATTCTGAAAATGAGATGCAA
-ATTTTCAGTCGATATGGTACTTCAAACTCCATACACCGCAACATTCACCT
-CAAAGCAGTACGGAGTGATTAATAATGATGTCGTCACCAATGAGGGGTAC
-GGTAGTATGGTTGGTCCAGAGCCCGGAGCCGTTCTTATTACAACTGGTAG
-TGAAAGGGATCAGTGTCCATGTAAGTATTTTAAATAACTTTGGTCCGGTG
-ATATTAAGATACAAGTTTAAATACTTCCCGTTTCAAAAACTTCGAATTTC
-CCGCCAAAACTTTTCTCTGAAAATTTTAATTTCTTTCCAAATTTTTTTCT
-TTGAAAATTTGAACTTCCCGCCAAAATTTTGTAGTCAAAAAATTTGAATT
-TCTCTCCAAGAATGTTTTCTCAGAAAATTTGAATTTCCCGCCAAATTGTT
-AATGTCAGAAATTTTGAATTTCTCGCCAAAATTTATTTTCTGAAAATTTG
-GATTTCCCGCCAAAATTTTTTTCTCAATAAATTTAAATTTCCCGCCAAAA
-TTTTTCTCTGAAAATTTTAATTTCTTTCCAAATTTTTTTCTTTGAAAATT
-TGAATTTCCCGCTAAAATTTTATTGTCAAAAAATTTGAATTTCTCTCCAA
-GACTGTTTTCTCAGAAAATTTGAATTTCCCGCCAAATTGTTAATGTCAGA
-AAATTTTAATTTCTCGCCAAAATTTATTTTCTGAAAATTTGGATTTCCCG
-CCAAAATTTTTTTCTCAATAAATTTAAATTTCCCGCCAAAATTTTGTTAT
-CAAAAAATTTGGATTTCTCGCCAAAATTTTATTGTCAGAAAACTTGAATT
-TCTCGCCAAAGTTTTTTCTCAAAAAATTTGAATTTCCTGTCAAAACTTTG
-TAATCAAAAAATTTGAATTTCCCGCCAATTTTTTTTCTCCGAAAATTTAA
-ATTTCCCGCCAAAACTTTGTTATCAAAAATTTGAATTTCTCGCCGAAATT
-TTATTGTCAGAAAATTTGAATTTCCCGAAATCTCTATGAATAAAACATTT
-GCAGTTTTCCCTGTACGAATCGGTGGCTTGAGTGACGAAGGAGAATATCA
-ATACATGATCTTAAGTACACCACTGAAGTATCCAACGATGGTCTTGACAA
-GGTAAGTTTGCCTTAAAATTTGTTTTCTAATTATTCCAATCTAATATTCA
-TGTGATGTTGAAAAATGCAAACATGTATTTTAATACATTTTCCCCCTATT
-GATGCGTACCGAAAAATGTAGAAAAATGGAATCATTTTTTTGCATTTTTC
-GACATTTTCGACATTTTTGACATTTTCCGACATTTTTCGACGTTATTCGA
-CATTTTCACGCATTTTTCAGAGTTTGCCGAACTAGGCCATTTTGGCTCGG
-CCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTTGA
-TTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGACTTTC
-CCAGGCAATTGTCAATGGAGCGCGAAAAATTCAATGAGGAAGGACAGAAC
-CCCGTGTCCACAGGAAGAATTTTCTCTGCGTCTCTTGTCTTTAGCATTTA
-AAGTGGGGCGACGCCGATGTAGAAAAATGCTGAAAAATTTCGAAAAATGT
-CGAAAAATGCACAAAATGATGGCATTTTTCTACATTTTTCTGCATTTTTC
-GGCACGCAAAAAACATCACATGAATAACCCCATAAAAACTCCAATTTTTC
-CAGAGACCTAACCCTATTCGAAACGAAATGGAAGCGAGAAGTGTATGATT
-TTGTTGAGAAGAATGGTTTCATGAGTCCAATGGCAGCATTGAACACTCGT
-CTCCATTTCACAGATGTCGATGTTTGCAGAAAAGTGAATAAGTTATATGA
-GAATGGAAATGTTTGAGTTGAAGATTATCTTTTTTCTGATGATACGGCAG
-AGTTTTTGACGGGTTGTGCAGTGTTTATTTTTAACCTTCATGTGTATTTA
-AAAATAAAGATTAATTTAATTGAATCTGTGTTTAATATGAACTTTTAAAA
-CACAAAATTTCAGATTTTGGTTTAAAAACTGTAGACACTTGATACTTTGT
-TGAGTGTACCTAATTTGAATTTCGCGAAAAAATGACTGTCATATGATTCT
-TGACCGTGTACACCTCTCGGGCAATACATTAATATTTTAATATTATGGAT
-TATAAGCATTTTCAGTAGACTTTCCATATTTTCTCATGATTATTACTCAT
-TTTTATGACGAAAAGCATTGTTTGGAACTCAAAATTATCAACTTTAAATG
-TTAAAAAATATTCAGGAAAACATAATATTTGCCTATTAAAAAATTTCCCA
-TTAATTTTCCACAAAAAAGTTTCTTTTTTCTTTTTTTAATTTTTTCTCAG
-AAAAATCAAATCTCCCAACAAAGTTTTTCTCAGAAATTTTGAATCCACCG
-CCAAAAATTTTTCTCAAAAAATTTGAATTTCCCACCAAAAAAATTTTTCT
-CACAACTTGAAAATTTGAATTTCCCACCAAAAATGTTGTCTCAAAAATAG
-TAAGTTTCCCGCCAAAACTTTTTTTAAAAGAAAATTTGAATTTACCGCCA
-AAAATTACTTACCAGAAAATTTCAATTTCCCGCCAAAAATGTTTTCTCAG
-AAATTTTTAATTTTTGGTCAAAATTAAAATACTACTACGGTACCTTAATC
-CTACACCTCCACCCAAAAAATCATTTTTCAAAAACTACTACAGTACTACT
-CCTACAGTACTCCTACCGTACTCCTAAAGTACTCCTACCGTACTCCTACA
-GTACTCCGACCGTACTCCTACAGTATCACTACAGTACTCAAACCATATCC
-ACCACTAACACCAATCCAATATCCCTTCAAACGACAATAACTTTTTTATT
-CAAAAATACAGTAATCTTACTGTAGACAATCTTTTAAATTATAGTCTTCA
-TCCAAAACTATAACGGACTCCATCCCATAAAAAGTAAACGACAAGTCATA
-AAAATTGGAATTCGCGTAGTTTGCTCTTCCGTGAAGGCAAACACACGTGC
-TCAGCTATATTGATAAGAGATGAAAAACGAGAGGAATCAGTCGAGGTGTC
-TGATCTACTTCCAGGATGGTGACCGCTCTTCTACTCCTATTGGCTCTTGC
-AGCCACCTCTTTGGCGGCTCTTCCAGATTTGGGATATCCCGGATGGCAGT
-GCGATGCATCGCTTTATCAGAAGTAGGTGGCTTACTTTAATTACTAAAGT
-TTGAAATTTTCCTCGCTTTCAGGAGCAAAAATACCCCGACTTCTGCCCAC
-TCCGTCCGATTCACCGACATAAAAGTTTTGGGAGCTCTCGGAGACTCCTT
-GACCGCCGCCAATGGAGCCGGAGCACCAAAGGGAGACCCTCTGGCTGTGA
-TCCTTCAGTACAGAGGACTAGCCTTCCAGTGTGGAGGTGACCACTCTCTC
-GACGAGCATGTCACTGTTGCAAGTAAGCCATTTTTCTGGGGAATTGAGAA
-AACTGAGTTGTTGTAGATGTGCTGAAAAAGTTCAGCCCTAACCTAATGGG
-ATACTCCACTGGAATCGGAAGTGCCAACGTTTGGGAGGTCTCAAAACTGA
-ACCAAGCAGTTCCAGGAGCTGAAGCAATCGATATCATCACTCAGGCCAGA
-GCTCTGGTGCAAATTATCCAAAGCCACAAGGAGGTAGCCAAGTCCAAACT
-AAACATCAATTCCGATGCATTTCCAGATTGATTACAAAACTGATTGGAAG
-CTTATCAACGTATTCATTGGAGCAAACGACATGTGCGCCTATTGCAACGA
-CCGAGAAAATGTAAGATAGTCAAAGATCATTCCACACCCGTTTTATTGCA
-TTTTTATAGGGCCCACACTCAAAAGCAATCTGGAAGCAAAATGTGATCAC
-TGCCATTCAAATTTTAAAGGATAACTTACCAAGGTAGGTAAACTATAGGG
-ACATGACATTCTAAAGTAAATAACTATAATATTATGAAATTGTCACATAC
-CTATACCTACCTATAAATACCTACATGGTCCAGAGCTGTGTGGCAAATTT
-TGAAACCAGCAAATTCGGCAAATTTTCCGGGGTCGTCATACTTGGTAAAT
-CGCAACATTTTTTGGAGCTCAAAAAGTGCCAAAATTAACAGAAAATCTAA
-GTTGTTAAACATTTGTGGCAAATTCCAAATTTGTCCAAATTTTTGAAATT
-TGCCTTGCTCGGGCAAATTCGGCAAATTTGCCGTGGTTGTCGGACTCGGT
-AAAGCGCATCATTTTTTGGTGCTCAAAAAGTACCGAGTTGATGGAAAAAC
-TAAGTTGTTAAACATTTGTGGCAAATTACAAATTATGTCCAAATTTTTGA
-AATTTGCCTTGCTCGGAAACCGGCAAATTCGGGAAATTTGGCACACCCTT
-GATCCCATAGCAGTGGCGCAAAAAAATCTTTAAAATTGTGGCCGTTTCCG
-TGCCAATTATAAATTAAAGTTAAACATATTATCGAAAAAATACGATCGCA
-AATTTTTCTCGTAACTTATTTTTGATCTACCTTGTTGACTAGGCTCCTCC
-CCTTCCTTCGACAAGACAGCCACAACAAAATAACAACGGCAACAAGATTA
-TGGGCAAACACGTGGTGCCAGGCTGTCCCATTACAGTTTGATCTACAATA
-AATGCGGGAATTTTTCGCCCAAAAAAAAAGTGACGTCGGCACGTTCTTAA
-CCATACAAAATCAGTTGAGAACTCTGCGTCTCTTCTCCCGCATTTTTTGT
-AGATCAACGTAATTCAAGCCAAAATGAGACACTCTGACACCACGTGGGCA
-GAGTCAACTTCCAAAGGTAGATCAAAAATTAATTATGAAAAAAATTTGCG
-ATCGTATTTTTCGATAATAAGAGCCAACATTTTTCGGCTTTTTATGGAAA
-TTTTTTTTTCAAAAAGAGGAGTATGGTCCATAACTATGCCATCAATACCA
-AGTCCTTCCAGAACCATCGTATCCATGACCGGAATGTTCGACATGGCCAT
-GCTTCGCCAAATCGACCACGACAAGTATTTCTGCGACGGCCTCCATGTGT
-TCGAGTGCCCATGCGAGAAGAACAAGGACTTCCCGAATACCGACATCTCG
-GCTGCCTGCCATCTTTACATGGATGCTCAGCAGGAGATTCAAGACTCGGG
-AATCTTCGACTCAACAGATGACTTTACATTTGTCGTTCAACCATTCTTCA
-ATGGAATCACAGTTCCACCACTCAAGCCCGACGGAGAAGTCAATCTGGAT
-TGGTTTGCACCGGATTGCTTCCATTTCTCAAAACTAGGCCACGCCAATGT
-TGCCAAGCACTTGTGGAACAATATCGTTCAACCAGTCGGATCCAAGAACC
-ATCAAGTCAATCTGTCAGATCCTACCATTCCACTAAACTGCCCAGACACC
-AAGTGCCCATTCTTCAGAACAACTAAGAACAGTGTTGACTGCTCGAAATA
-TATGACTGCCTAGACTGTAGGAAATTGTGTTTGTGTGTGTAATTTGACGT
-ACTTATCGGGTCTGCAATAAAATGTTTTATCGTGTAATCTTTAATTTTTA
-ACGTGTGAGACATAAAAGAAAGAGCACCCTCAATAAAAATATCCACGTGG
-AGTACACAATATAGCTATCAATAGAGCGAGTAAATATTTTTGCAATAATT
-ATTTATTAGAAGAATGGAGATCAAGGTAAAGGAAGAGATCTTGATTTTGA
-AAAAAAGATACTGGAAATACTAATTGTTCACGGGATTTCATAGAAGGGGA
-TATATCACGACTTTTTCTTTGAAAAATAAAAACAACATAAAATTATTGCG
-GCTTCACAATCTGATCATCCGGTATTTCTCCAGATCTTTCCTTTTCCGAT
-TCGATCTTCTTCCACTTGGTACGCCGGTTTTGGAACCAGATTTTCACCTG
-GAATTTGAGAAATTTCAGCTATGCGTTGAGTGCCGCGTTACGTGCTGCGT
-TGCGTGCTGCGTTGCGTGCCGCGTTGCGTGCCGCGTTGCGTGCTGCGTTG
-CGGGCTGCGTTGCGTGCCGCGTTGCGTGCCGCGCTGCGTGCCTACCTGCG
-TCTCCGTGACATCCAATCGTTTTGCAAGCTCACTTCTGTCACTACTTGAC
-AAATACTTTTTCGCCTCAAACTGCTTCTCCAGTTCGAATACTTGTTTCCC
-GGAAAATGTCGTCCGCGCCTTCTTTCTCTTTGTTTTTTGACATTTTTCTA
-TAGGAGACTCTTTGGCTTGGTCGAGGCTGGATTCTGAAAAAATATTCTTA
-ACGGCTGATTATTTTTCTACGTGTAGCATTTTTCCGAAATTCATTGAACA
-AAATTAGTAAATTTCCAAAAAATTTTTTTTCCAAAATTTCGAAAACATTT
-TAATTTTTTTCAGATTTTCTAATATTTTAAAACAAAAATTGAGAGTAAAG
-GAAATAAAAATTGTGTCTTGTAATTTTTGTAATTTTTACTCAAAAAAAGG
-CCAGTGAAATACTATTACAGAAAATACGAATCGATGCACCATGTCAAAAA
-GAATAGTATTTCACCTCAAATGCACCATGCCCAAAACTAGTCTATTTTTC
-AACTACAAAACTTCATACACCTAATCCAAAGAAATCAACTTACTGCATCT
-TCCAAATTCATCAATTTCTCCATTAACAGTTGGTAAGTCAAGTATATCCT
-TTATCAGGTGACTAGTTCTTCTCTGAGGCTTCACATCAGACGTCAACAGT
-GCAAAATAGGGTTGAAGTAGTTGGAAGAGCAAGTCAGTTTCCATTTTGCA
-CGAATGAAAAGAACTTCTGAGAGACTTCTCTATACAGTAGGTCTCGAGGT
-CCCCGCCTTCTCTTCAATCAAATAATTGAAATTCTGGACTCTCGGGGGAC
-TTTTGACGGTTGACGACGACGACAATTTGCCAAAGTGGTCGACAATGATT
-GCGCAATTGGTGTGGAAAGAAGAAGAAGATGGGTGAGTTCTGAGATGATG
-ACAAAAAGAGCATGAGCCAGCAAATTGAATAAGAGACCGGATTTCGAGAA
-GGAGGAGGGGGAGAGGAGGATTGGTGGTAAGGGATGATACTTGATGCAAT
-TGAGGGAATGAGTTTCTCATACTTGACTATTAAATACTTTTCTTGAACTT
-AAATATTTGAATTGAAATTTTGGAGTAGCGGAGGCACATGTGATATTATT
-GTGCTAATTTGTAATACTTGGACTTTCAAATATAACCTCAATTATTTGAA
-AAAAACCTTTTGAATAGACCAGCAAGGTTGATCTACAATTTTTCATGGAA
-ATCGAATTAATTTTGTAAGGATGTCTACTGAGTATAAGCTTATTGTTAGG
-CTTAGGCTTAGGTCTAGACTTAAGGCTACACTTAAATTTAGGCCTAGGCT
-TAGGCTTAGGCTTAGGCTTAGGCTGAGGCTTAGGCTGAGGCTTAGGCTTA
-TGCTCAGACTTAGGCTTAGGCTTACGCTTAGGCTTAGGCTTAGGCTTAGG
-TGTTGGCTTCAGAATAAGCTCAGGCGGGGGTGAGGGAAGGGTAGAAAAAA
-AAGAAAGAGAAATTTCCAGAAATTCACAAAATCCAGAAAAAAACATATCT
-TTCACAAGTTTATATTTTTATAGCCTAAAAAATTACTTTTAAAATGAGGA
-TATGCAACCCGCACGCAAAAAAACCTTTTTTTTTTTGAGCAATTTCACGG
-CTCTTTTTTTTTTAATTTAAAAATACAATAAAAAAACCAAAAAAATTTTC
-CGAGCCCAAATTGCTCCCAAATGCTCTAAATTTCTTTTGAAGTTTGATAT
-ATTCCTATTAGAACTTGAGGAAAATGTAAAACTAGAGAAACATAATACTA
-CGCATGTTAAATGTAAATTACTTACTTTTAAAAAGTCGTACGTTATTTTG
-GAAAGTTTGAGGTTTTTGCATTTTTTCCGTAATATCACTGAACACTTTTA
-TTTAAATATCATCAATTATCGGAAGTTTATAGGTTGCAGGAGAAAAAATA
-TATTCTAGCGGGAAAATGAAATGAGACGGGGGGACATTTTTAACCAAAAA
-AAAATCAGAAAACAGTTGGTAATAAAATTATTCCAAGAAAGTATAAATTC
-ATGACTTCCATCTTGGGAACATTCTTAAAAAATGTCAACGAATAAATCTT
-TGTGGCAAACAAACTTTTTCCATAAATGTTTCAGACCTTATATAGCGGAC
-ATGAAAGTTGATTGCTTATTTGATATGTCTTGAGTTTATTTTTTTTTATT
-TCAAGCGAGGGGAGATTTATTTGCCTAGATATATATATAATTATTACTGG
-AACGAACTGGAAAAAAACTTGGGATCAAAAAAATCAAAAATTCAAATTCA
-AAAATTCAATTTTTCGAAACTTTTTCTACAGCTTTGTCGAGAAGCAACAG
-ACAAATACTTATAGCTAAAATTTTATTAATATTCTAGTTTTAGTCATGGT
-GAATCGAGAATTTGTCAATTTCCATGTGGTATCTTAAAAATAAACCGATA
-CACGTGGTGTCAGGCTGTCTCATTGCGGTTTGATCTACGAAAAATGCGGG
-AATATTTTTCCAGAAAAATTGTGACGTCAGCACGCAAAAATTAATAAGGG
-TCTAACCAAAAAAACTTGAATCTTGGAAATATTTTTAATTCACCCTAAAT
-TTTCCCCTGATTCCGAATATCTATGTGAAAAAATTCAAAAAAAATTTCCT
-GAATTTATATTTAAGCTTGAAATCTTTCATAAAAATTTTTTTTTTTTAAA
-TTTCATTTGTACTCGCATCACTTTTTTCAAACTCGCGCCCAAATAAATTA
-GCGCGCGCGTGCATCGTTTGACTTTTTTTCGTTTAGTTTTTTTTATTTTA
-GCCGAATTCAATTTTTTTAAAACCAGTTTCATTCATTTTTGTCGGTTTTT
-TTTTTCTGAAAAAAATGTAAAAAAACGAAAAAAAATCAAACAATGCAAGC
-GCGCTCCAATGCTAATTTATTTGAGCGCGTATTTAAAAAAGAGACCGGGA
-TACAAATGAAATTCGGCGATTTCAAGCTTAAATATAAAATCTGGCAAACT
-TGTTTTGAATTTTGAATTTTTTCACATAGATACTCGGAATCAGGGGAAAA
-TTAGGATTCATTCAAAAATATTTCCCAGATTTCGGTACCCCACCTTAAAA
-ATTTTTTTTTGGGAAAACAAGGAAAATTTCTAGCTTGAACTTATTTTATC
-AATACCTAAAATGCTGAACATTAAAACACACACACCCGTATGAGTATTAT
-ATACTTCCAAGGAAACATTTGAAAAATAAAGAGTTCTCCGCTTTGATTAT
-ACACTTGTGATATTCTCACGCCTGGCACTTGGCACCAGCTCAAAGTGCTC
-ATTTTGGCTATAATTGTTTGAAGGTATATGAAAAAGTGGAAATTGGGAGG
-AAAAATGGCATGTTTTGGCTTTCTCTACCTGGCCTATGTGTTAGAAAACT
-CTTCTATGAAAATTCAGTTTAATTTTTTAATTTTTCTTAATTTTTAAAAT
-TCTAAAAATGGCTAAACTTTCAAAAATATAATTTTTAAAAAGCCAAATAC
-TATAAAATTTCTTTGTTAATTTCTTTATAACCAAAATTAACGATTTTCAA
-AAGTCAAATTTTTCAAAATTACAAAAAATTTAAAATTACTGTAAGATGCG
-CAAAAATTACAGAGTTTTCAAAATATAAAACACTCTTGTGGCCGAAAACT
-TCCAAAGTTCAGGAAATAAAAATTCCAAAAAAAAATCAAGAAAAAAATGT
-ATCTCGAAAAATTACCGCTATTAGAAAATCGCCTTCTCTAAAATTTCCCA
-AATTTTGAAATTATGGAAATTCCCAGATTTTTCAAAAGCGATCTAGTCGG
-AGTTGTCAGAAAAAAAGTTCAAGAAAACTTTCTCTAGAAACTCAAAAGTT
-GGCCTGATCAGAACTTGTTGGATTTTTTCAATTTCCCAAAAAATTTTCAA
-AGTTGCCGAAAATTACCGAAACTCCAGGGCTCACTTTTAGACCTTAAAAT
-GAAACTTTTGCCATTTGAAAGAGGCTCTTTGAAAAAGGTCTCTGCAAAAA
-ATTTAGCGGCAGACGAGCACTTTGAACTAGAAAAATGTCGCTTTGAAATT
-GCTATCATTGAAATTTTTCACTACTATAGAGGCCGGTAAAATTGCTCCAA
-ATCATAATTTAAAATATTTTTTCATGATTTTTTTTTATTTTTTCATGATT
-TTCGAGGTAGGCAAATATTCTGGGAGCTTTTTTGGATATATTTATTTTTT
-TGGAAAAAAAAATCTGAAAAATCCCACATTTCCAATAAAAAAATTCCAAA
-AAGCTTTCAGAATACTTGTCTACCTCGAAATATCCTAAAATTCATAACAA
-TTTCAAAAAAAATATAATTTGGAGCAAATTAACGGGCTATTTCAAAGTCT
-AAAAGTGAGCTATAATGCATACATTCCAGAAAATGGAATAAAAAATAAAC
-TGAAGTCAATTTAATCTAATCTCATGATACCTCCTCCTCCTTCCCCCAAC
-AAATAATGCTCAATAGCCCCCAATCAACTCGTTCCAATTTGAATAGTGTA
-TTATTTAACAAGCTTCATCATCTCTTCCTCCTATTTTTTTTTGTCATTTT
-TATCGTCCCCTCGGCCGTTTGTATTATCCTCTCTTCCTTCTTCTTCTTCT
-TCTTGAAAACGAATTGAATTTCTTCATCCAATTCACTCAAATCACATCCT
-CCACGGACACATTCAATTAATCCAAACGTCCTTTTCAATTGAACACAACA
-ACAATCACTATTTCATAAAAATTGTTTTAAATGTACATATATCAAAAATT
-GCGACGGCTGGAAAAATTAAATTTTTACACCAGAAGAAAATTTGTAACCA
-TAGTTATGGTAGCTATAACTCAAAAAAGTAGGAAAATTATGTGACATGTT
-CTCAGGACTGCAGTGATCGCAATAAAAATAAATTCTGCTGATCCAATACT
-CTTGAAATAATAAATCGTTTCTGATTGATTCCATCATTCTCAGACAAATG
-GAGCTTGGTTGAGTGCTCAATTGGTCAATGTCGCTGTCATGGCACCAGGG
-TTGTGCGGCATCCGGATTTTCTGGCAATCGGAAATTGCCTTTTGCCGAAC
-TCTAATTTTTTTTCGGCGATCGGCATTTGACGGTTGCCGAAAAACTCGTT
-TTTTCGTTTTTTCGCCATTTTTCGGCATTTTTCGGCGTGCTTAAACTCTT
-TGAGGTTTTTTTTTTATTTTTTCTTGTATTTTATAAATCTAAATAATTCA
-ATTCCAAAGTTTGATAAGGAGTGTCTTGGTTTAAATTTTCTAGCACAGAT
-CAATTTCATTTATTAACGATCAGACTGGTAGGATAGTCAACGACCCCAGA
-GGCAAGAATGATTCAAAATAATTGCACACATGGACAGCAATAGACAAAAT
-CTTTGAGAGTTTTATGGTGGGGTGGCGATGTGTCGACCAAAAGAGTATAT
-CCACTATATGGCTAATAATTCAAATATGTTGTATTTTGGAAAGTGTTAGA
-ACACAAGTGACTTGAGTGTTTTCGGATACAAGAGACACAGAGATGTCCCT
-TGATTGTTCACAGAAAGCGATTTTTAAGGGTTTGACTACAATATTTGCGG
-ATTTATGTTTCAACGAATAAATGTAAAAAACTCGAATATCATTTACTATA
-TATAAAGCGCTTATTCCGTTTTTCCATAGTTTGTAGTCTATGTAGTCTTT
-GTAGTTTGCGTAGTTTTAGCTTCTGGAGGGATAGTGAGTTGGGGTTAGTG
-TAGGGATATAGTCGGCGTACTGTAGTGGTACAATGGTGGTACGGTAGGAG
-TACTGTATGATTACGGTAGTCTCAGAAAAATTGGTTTTCAGCTCCAGAAG
-TCGGGGACCGCGCCGGAGGTGCGGTCCACGGCTGGTATATACATATGTAT
-ATGTATGTATATATGTATACATATATTCAATTAAATTTAATTTAAAAAAT
-AAAAAAAACATTTCTCACAAATGCCGAAAACACCGAAAAATGGCGAACAT
-TTTTAGGCATTCGCCGATATTTTGACCAACTATTTTTTTTTGGCGAACGG
-CATTCGCCGTTTGCCGCACAGTCCTGCATGGCACCCCGACCGGTTTCGTG
-ACAATAGTTTTGACCTGAACGCACTAGGAGTCAGGAAGTTATAGGGGTCA
-TGGGTGCTTTAATGACCCCCTGTAAAAAGCACATATATTGACAACAAAAT
-TTGCTCGCTGTTTTTTGTATTAATTTTTTGTCTCCCCTCGATGCGCATTT
-CTAGTAATGATGCACATATTTATTTTTTTTCATGTACATATCTAACAAAA
-TCATAAAACTGAAAATTGCGCTTTTGTTCAAGTTAGCAAGACAACCATTA
-TAAAGCTTTCCAAATAGCAAATTAGCAAAATAAAGTGAGAAGCTAGAAGA
-TAATGGGGAGTCCCTATAATCTTTCGGGCACACCTTCAGACTTTGTGACT
-ATAATAGCCCAAACCCACAGTTTACTGAAAACTAGGGCTTCATTTGCTAT
-ATGGTACCCCTAAACTCTTTCAGTAATCGAATCCCAAGAAACCTTCACAT
-CTGTAACCTGGACAAAAAACACACAATTTCAAAAATATAGAATTCTTTAT
-TCAAGAATCATCATCATCATTTTTTTCAATTTGTACAGACAAATGCCGAC
-CATATTTTTTGTCAGGGGAATGGCAACGGCGGGAACCCAAGAAAATCAAA
-CAAAAATATGGAGAGAAAAATGAGCCAGAGAGCCTGAGCAACCATGCATA
-AATAATGAGGAGTTGGTGAGATGAAGAAAAAACAGATAAGTTACGACGCG
-AGGAACTATTTGAAAAATAAACTGCTAAATACTATGTGCTTAATCCTCCC
-AGGTAAGCGAGTGACGGTTCTCGTATCTCAGCTGGCAGTTTCTCTTTCCG
-TACCAGTTGACGTAGGCGAACTCGGCGTCGGAGACGATGGCGTTGAAGCG
-TCCTCCGAACTTGGCCGAGGCGTCTCCCTCGATCTTTCTGGCGGCCTCGA
-GGTTGTCCTGGAAGGTATCAGTGATTGGATTTGATTTATAGTTCTTCTTT
-TTTTTCTTTAATTTCTTGCTTGTAATTCTAAAGCAACTAGAAAAAAAAGT
-TTCGGAACGCATCTATCATGCCAATTTACATAACCGGTATGGGTTTGCGC
-GCGCGGGGGGCTTGCAACATTTTCTTAAATGACATTAAGGTATGAGAGGG
-GGGGGGGGTGTTGTAAATAGGTATCCAGTTCTTGTCTGTCCCCGTTATCA
-AGTTTCTCTGGTGACGCAACGCAAGAAGGCAGAAAACAAACCTTCTCGTT
-CTTCAAAGCGGCCTCAACGATGGCGCGGAGCTCTGGATCGTCGCAGTTTC
-CCTCGTCTCCTTCCTCATCGGCGTACTCGACAGCTTCGTTGGTCTCCTGG
-AAATTTAGAAATTAGATTTTTCTCGAAATTTGGCCGAATATTAAAAAAGT
-AATACTAAGAATTTCCCCACGAAAGGCTGAAAAATTGAGGTTTCCTGGGA
-AAAGTGAAATCCCGGTCTCAAAATTTTTTTTGATTTTTGAGCTCCGTTGA
-ATACCGACAACAAAAATGGCTCTGGAATTTGAAAATTACGGGGAACTGAA
-ACGCAACTTCTACTGCTGCCAGTATGTCTCTCCCGCATTTTTCGGAGGCT
-CAATCGTAGATCAAAGTTTTCCGAATAAGTTACTATTAGGTTTTTATCGA
-GAATTGGTACTAGACTATGTTGACAAATACCAAATATCAAATATTTACCC
-AGATGCAAGTTATGGTGCTTTGAACTAGAATTCCTGGGAACTGATTGTAA
-GTGTCAAAACCTCAGCCAACCGACCTAAGCCTAAGCCTAAAAAGGTGTAT
-CGAACTTAAATTTCGACATGGCATGGCATTCAAATGGGTATACCGATGAT
-TTTGTTTCAGCAAAATTTTTAGGGTCGAATTTTTAAGGTAGAGCAAAATT
-GGGATAATTTTAAAGACTATTAATTGTCCAAAAATCCAACAAATCCAACT
-TCAAATGAGCTTAAACTTTAGATCACCTTCCCAAAAACCCACCTCAACAG
-TATCAACTTGCTCGGTGGCGGTCTCGGTGGCGGTGGATGGCTGCTCCTCA
-ACAATATCATCATAGGTGCTCTCCTCCTTGGCAGCGGCAACTGGAGCCTG
-AGTCTCCTCGACAACTGGAGCTGGAGTCTCTTCAACGACAACTGGCGCCT
-CGGTCTCCTCGATCACAACTGGAGCCTCGGTCTCAACGACGGCTGGGGCT
-TCGGTCTCTGCAACGACGACTGGTGCTTCAGTCTCAGCGACGATTTCTGG
-AACGATTTCCTCTTGGACAGTCTCGACTACGGTTGGCTCTGGTGCTTGCT
-GTGGTTCTGGTGCTTGTTCTGGTTCTGGTGCTTGCTGTGGCTCGACAACA
-GTCTCGACGACCTGCTCGACTGGTGTTGGGACTGGCCCCTGGGTGTATGT
-GGCGACTGGTGCGACTTGCTCGACAACTGAAGTGTGGGTGAGGGTGAATG
-TGTGGGTGGGAGTGGTGCGAATCTGACTAAAAACTGTAAAAACTAACCTT
-GAACAGCCTGGTGCTCTGGTGGAGCTTGGTAGTTTCCTCCCTGAGAGACT
-TGGGTCACCTGGATAGAGCTGACTGGTCCCGATTGGTATCCTCCTTGTTG
-AACTTGCTCGACTGGGGCAGATGGTCCGGCGTTGTAGCCTCCTTGTGGGG
-CGACTGGGGCTGGTTGGGAAGCTCCAGCGTATGAGGGTCCTCCTCCGATT
-GGTCCTTGGGATCTAGCGTATGAGGATGCTCCGACAGCTTGGGAAGCTCC
-AGCGTATGATGGTCCAGCTTGCGATCCAGCGTGCGAAGATGCTCCTCCTC
-CGATTGGTCCTGGACCAGCTTGGTAGGCACCTCCACCGACTTGTCCTCCG
-AATCCTTGTGGTCCCTGGGAGTACGAGGCTCCTCCGACTGGTCCAGGTCC
-TCCGAATGGAGCGGCATATCCGGCTCCTCCACCGATTGGTGCCGGTGGTG
-GTGGTGGTGGGGGTGGAAGGGCAGGCGCGGCGGCATAGCTTCCGCCTCCG
-CCTCCGGTTGCGTAACTGTAAATGAACACATTGGGAATAGTATGGAAGAG
-GTGGCTAAAGGGGGAAGCAGGTTTTAGTTTTGGCGGCCAGCAGCAGGAAA
-AAGGACATTTTGCATGAATGGGGTGGCAAGTAGAATGGACTTTGTCGCTC
-CTTAAGGAAGACATCAAAAGAACTTCAGAAAGAAAGAAATTATTTTTGGA
-ATCAGGAAAAAGCATTTGAATAGCAGTAGAAAAAATATAACAATATAGTC
-ACAAAAATACAAAAAAAAAGGCAAAATCTTACCTCGAGCTAGAGCATGGT
-GGAGCTCCTCCTCCGCACGATGGCTGGGATGGTGGGCAACATCCACCGGC
-GCTTCCGGCACCTCCGATACACGCTAACGCAGGCGACACGGCCAATAAGA
-CGGCTACCAAGACTCTCATCGTTTTTGAGAAGGCAGAAATCGCAATGGAA
-TGCTGAGTAACTGTCGTCGAATGGCAACGTAGGACGTGCCTTTTCTACCT
-GCCACCCCAAACTAACTCCGCCCATGGCCGTCTGGAGGGGGCACGCGCGC
-GCACGAAGCCTTCCGAAAGACGCCCGATCGCGTTTTATCGATGATGATGA
-TGATGATGATGAGATGAAGCCTCTCTCTCTCCGTCGGAGGGCACCTTGCG
-ACATTCACCTTGTGTGCGTGTGTGTGTTGCAGAATAGGGGGAAGAAGAAG
-CGATCGCGTACAAATGGGGTTCGTGTTCATTTCCGAATGATCCAATGATC
-AGCTGGAATATTCCTATTAATGTGACTCGTGCCACGTCATTGTTAATGAT
-CTACTATGTTTGAGTGATTGGATATGTGTTGTTTCCTTTTCTAGTTAGAT
-TCCTGAACAGTTCACCTTTACCTAATCCGTGATCGATGTTCCAATGCTTC
-TTCCTTTCACTTCCACTGCGGCACCTAATCAGGCGGAATAACATGCTTTC
-ACTCTGCCGGTAAAGTGTGAAAATCCTAAAGTTTTAGATTTCAAAGATTT
-CAAAAACGATCGTTGATCCTACCGCGCTTCCGCATCAACTGATATCAGGT
-TTTTTTTAATGATAAGATTGTGGAGGAATGAACTGGTGAACTTTTAGGCT
-GATTTAGAGCCACGTGGAAACTTCCAGCTTTTACCTAGGTGACTACAAAC
-TACGGAAGATCAAATTACATACATTTTGTAAAAACATACATCACTTTCAA
-AAATTTCGGTTTAGTTCAAAAAATCACATTTTTACTGTTTTGAGATTTTT
-TTTTTCCCAAAAATGTCGATGCAATTTTGATGTCGATGCACCACGGGCGA
-TTTAAAGGAAATTATCAGTTTTCTGAATATTTTTGTTTTGTATGTCTTGA
-TTATGGGTTTTGTAGGCTTCGATGGCAGGCAGGCGAGGTTTCGGGTCCTG
-GCGCCCGTCTGAAACCTGCCCGCTTCACGCCGGCCTTTTGCCTCTTTTTT
-GCATTTTTACGTGGTGCCAGGCTGTCCCATCGCAGTTTGATCTACAAAAA
-ATACGGGAATTTTTCGCCCAAAAATATGTGACGTCAGCACGTCTTTAACC
-ATACGAAATCAGTTGAGTCTCTTCTCCCGCATTTTTTAGTAGATCTGTGT
-AGATCAAGCCGAAATGAAACACGCTGACACCACGTGTGTTTCTCATTGGA
-AATTGGAGGCCTAGAAAATCAAAAGTTAGGCCATCAACAGATTTTTGTTT
-CAGCAAAAGGCGCGGATTGAGGCGAGGTCGCTTTAAAGTCAGGCAGGCAG
-GCGGTTAACGCCTACAGGAAAACTTTAGGTTTTAGGTTATCTGTATGTTT
-CCCTTTTGTGTGTTTTTTAGACGTCCAAAGAATCGTATCAAAATGAATAG
-GTATTTTCTCGTTTTATGCAGATAGGTAAAGGTCTGTAACCTGAAAATCC
-AGAGCCTTATAATCCACACCTACATAATCATCAATTAAAATATTCAGATA
-ACTGATAATTTCCTGAAAATAAGATATCTGTAAATTGAATCAACGCCAAT
-TTTAGACATGGTGCATCAAATGCAACATTGTATTGATATATAAACTTTGG
-CAGTCAATACATGTTTTCTTATGCATTGTTCTCAGTGCACCTTGATCAAT
-TGAGTAGACTTCATCTATTCTTGTCCACTTCCTAAACATGAAATCAATCA
-CGGCACCCCATCAAAAAGCACTAAAAAAGTACATTTAAAAGAGTACATTA
-TTATTGCCCGTTCAATCCTCGTAATGTATCTTTGCAAGTTCCTTCTTCCT
-CTGACATTTCCCGTTCCAATTCTCCGCCATACCTGATATGCTCGACTTTT
-TCGATCATAGACGCGAATTGCGCAACGCGCGAAAATATCTTGCGCAATGA
-ACAAGGAGAAGAAGAAGAAGAAGAAGTAGGAGAAGCCAAATAAAAGATAG
-GTGATAACCGAGATGTTAAGCCAAAGAGAAGGAGTGTAATAGCTGAACAA
-GGCCTATTTTTGTGTAACTCCCCCCTCTGACAGCTTCTTCACTTTCCCTC
-CAACCGTTTTTACTCTGTATGGTAATTGTTGATGGATCGCCATGGAAAAG
-CCCTAATGGTCATGAATAAGCTGTAAAGCAGCGGGGGTGAGCTTGAAGGA
-CGATCGGACAAATGAGATATGAAGCGTGAAAAACGGAAAGCATGCTTAGA
-GGGGGAGATATATGTAGATTTGGGGAAAAGCTACAAGGTCGATTTTTATC
-CGGTGTCAGGATTATAGAGGTGTTTTGAAGTAGAAGCAAGGCACTGAAAT
-TCACCACTTCCTCTATTAGAATTGCACATTTTTTAAAACTATGTACCTGT
-TTTCTTAAGAATTGCTTGAAAAGTTGAATTTGAACTAGTAGTTCTTGCAA
-AAAGGCCAATTGAACTATCTGGTTTAGTTGCGTCCTTATTAATATTGCAC
-TTTTTAATTCCGGCAAAACGCCGGTTTACCGATTTGCCGGGGATTTTCAT
-TTTTGGCAAATCGCCGATTTGCCGTTTGCCGAAAAAATTTTTAACAGACG
-GAAAAACTTAAAACTGTGTCATTTTGAATTTATTACCGTTTTCTTTAGAT
-ATTTTCATAGAATTTGCTAACTTTTGAAAATAGATGAAGGAACATTTATA
-TTATTTGAAATTGAAATTCTGAAACTTCCAAAAAAATAAGTTGCAAAACC
-ACAATTTGCCGAAATGCCGTTTTCCCGGCAAATTCGGCAAATCGGCAATT
-CGCCGATTTGCCGAAAATTTCAATTCCGGCAATTTGCCGACAAAGCAATG
-TTTCATAATACATAAAATGTTTCTAATTTTTAAGAATGATTTTTTTAATT
-TTGACAAAGTTTTTTTATAAAAGAGCCGAATTATTTTAAATTCCCGCGCA
-AATAAGTGACGCCATTTTTTACATTATTTGTATTTTCTGGCTAAATTAAT
-TGGTTTATGTATGTTTTTTCTTTAGTTTATAACTTGAGTAAAATTCACAG
-TAAAAATTAATTTTGAAAAATCGATTTTTAGTTTAATTTCAATTTCAGAG
-TTTCGGCAAATGTATTCTCAATTAACAAGTTTTCCAAACGGAAAAAAATC
-TGAAAATTGACAAACCACGGTGTAGATCAAGCCGAAATGAGACACCCTGA
-CACCACGTGTGTTTCCCCTTGGAGGCCTAGAAAATCAAAAGTTGGGCCAC
-CATCAGGTTTTTGTTCGACTCAATTGGTAAACTTTGCAGACTAGGCTGAA
-ACGTGGTATTTGCAAAAATACAATTTTACACATTTATTTTCCACAAACCG
-AATAAAATCCTTATCTCAACAGTGTTATATAATTTTTTTTTTCAGATCAC
-TATCACGACATTTTAAAATATATTACAGCACTCTCTTCTTTAGGTTTTGA
-ACGTTGATGCTTCGAGGATAAACATGAAAACCAGATCAGCTTTTCCGTGA
-CCTCACATACTCATTTTCTCAAATTCTCAAAAATGTTCTGCCTTCTCCAA
-CGGTCTCTAAAAAAGCTTGGAAAACCCACAAAAGGTGTCTTGGGACACTT
-CTGTCTCTCTCTTTATCGATGACCGGATCGCCCGGATAAACGGGTTTTGC
-GGACTGACACCAGCAGGTGGAAATGGGCACACTTGTAAAATAAAACGAAA
-AATAATAATAAAAATAACACGGAATGCGGAGAGAAGTGGCAAGATCGGAA
-GAATGGTGGGGGGGGGGGGGGGGGGGATTACATAAAGATGGCGGCATAAA
-GTGCGTTTCATTAGGGGGATATTGGGGTTTTTATAGGGGGAAACTTTGAT
-TTTTTTGAAAAAAAAATTAAGAAAGAAGCGACAACAACCAACAACAAGGT
-CATTTTTAAAAGGAAAATTTGGCATGAAATTTACATTTTGGGATGAATTA
-TGAGGATATACTCATATAACCTAATTTTGTCACAAAAAAAACGTCGAAAT
-TTTTAAAAATGACTACATTCTGCAATTTTGAAAAATTTGGTGGTCCTACC
-ACGAAAAATCCATGGTTTTTTGGTATTTTGACGAAAAACTGATTTTTTGT
-GTTTTTTTTCTGGTATTTTGAAGCCGCTGTACTTCAAACCCTTTTCATAT
-TCTAAAAATATCTTTTTGCAAAATTCGGTTTTTTCTAAAGTTCAAAATAA
-ACCACTATTTTCAATTTTTAACGGAAAATCTGCAAATAAAATTTCGGAAA
-ATTCCGGCAATTTGCCGATTTGCCATAAATTTCAAGTTCCGGCAACTTGC
-CGATTTGCCGATTTGCCGTAAATTTCAAATTCCGGCAAATTTGCGAATTG
-CCGTCCTACCATGAAAAATCCTTTTTTTTTCTGGTATTTTGAGACCGCCG
-TACTTCAAACAATTTTCATATTTTACAAATATCTTTGAGCGAGCGGTTTT
-TTTTGAATTTCAAAATAAACCAAAAGTCTACTTTTTTTGGTTTGTTTTTG
-TAATTTTTTTTTTAGAAATTTCAATTTTTATCGGCAAATTGGCAATTTGC
-CGGTTTGCCGGAAAATTTCAAATCTGGCGATTTGCTGCTTTGCCGATTTG
-CAGGAAATACCTATCCCTGATGTAAATTACCAGAATTAGAAGTTTGGTAC
-ACGATTGGCACACAATTTTTTGGTACAAAACACGCTAAAAATTAAATGTT
-TTTGAAAAAAAAAATTCTTTTGAAATTGTTTTAGTGTGAATTTCCATGTA
-TTCAATTTTTATCATTTTTAGCCTGTTGCTCCAAACTAGGTTTTCTCCCA
-CGTGGCATCTCTCATTACACATAAAAATACCTGCTAACTCAAAACATTAA
-TCAGAGATCCATATCCATGTCTTCCTCACTTTCCAACTTTTTCCCTCTTA
-GCTTATCTAGATATATGTAGGTATATCTATATCTACAAACAACTTTCTCT
-TTTCAAACATCCAGTTTATCTTCTGACCTTTGCAACATTTTTCCTTTATT
-CCAAACTTCCGCCAGATTGCATCTTATTCAATTATTACATTCAAAGAGTG
-TCTAAAGTTTTGCTTAGAAGAAACAAAAGGTAAAATGTCAGATATGTTTA
-GAGAAGGTTGTAAAATTTGGCAATTTATTGTAAAAATTCGCAATTTTGAA
-ACTCCTTTAAAATGGTTAATTTTGTAGTTAGAGGACTCAAAATTAATGCC
-CGAGAACTAAAAAGTTGTCATTTTTCATTTATCAATGATTTTACTTAATT
-TCAAAAAAAAAATTTTGCCCAAAAAAGGACAGTCATTAGAAAAAAAAACG
-GAAAAATGATATGGAGTGATTCTTTTTTATTTTATAAAATTAATCAGCAT
-AGTCAAATGTACCAGAAAAAAGCAAATAAAATGTACTAGATTGACCGGAA
-GATTATTTGAAAAATTGCAGAAAATGCACCAAAAGCTGCTTTTTTCAAAA
-ATTCAAAAGTACGGTAAAATCATACGGAGCTATTCTTTTTTATTTCATAA
-AACTCTTCAGCATAGTCAATAATACCAGAATATGTCAATCAAAGTATAAT
-AGCTTGTACGGAAGTATCTTTTTAAAAATTGATAAAAATATATAAAAGCT
-GTTTTTTTCAAAAATTCAAAAGTATGGGAAAATCATAAGGAGTCATTCTT
-TTTTATTTCATAAAACTCTTCAGCATAGTCAAAAATACCAAAATATGTCA
-ATCAAAGTATAATAGCTTGTACGGAAGTATTTTTTTAAAAATTGATAAAA
-ATATATAAAAGCTGTTTTTTTCAAAAATTCAAAAGTATGGGAAAATCATA
-TGGAGTCATTCTTTTTTATTTCATAAAACTCTTCAGCATAGTCAAAAATA
-CCAGAATATATCAATCAAAGTATAATAGCTTGTACGGAAGTATTTTTTTA
-AAAATTGATAAAAATATATAAAAGCTGATTTTTTCAAAAATTCAAAAGTA
-CGGGAAAATCATAAGGAGTCATTCTTTTTTATTTCATAAAACTCTTCAGC
-ATAGTCAAAAATACCAGAATATGTCAATCAAAGTATTATAGCTTGTACGG
-AAGTATTTTTTTAAAAATTGATAAAAACAAATAAAAGCTGATTTTTTCAA
-AAATTCAAAAATTCAAAAGTATAGGAAAATCATATGGAGTCATTCTTTTT
-CATTTTATAAAATTCTTTAGCATAGTCAAAAATACCAGAATATGCCAATC
-AAAAGATAATAGCTTGTACGGAAGTATTTTTTTTTTAATTGATAAAATAT
-ATAAAAGCTGATTTTTTCAAAAATTCAAAAGTACGGAAAACTATATGGAG
-CGATTCTTTTTTCTGTTATAAAACTGTTCATCATTGCCACGTATACCTGA
-AACTACCAGAAAAAGTATGCTAGCATGTACGGAAGATTATTTGAAAAATT
-GCAGAAAATGCACCAAAAGCTACTTTTTTCAAAAATTCAAAAGTATGGAA
-AAATCATATGGAGCGATTCTTTTTTCTTTTATAAAACTGTTCAGCATAGT
-AAAATGTACCAGAAAATACCAAAAAAAAGTATGCTAGATGTTCGAAAAAT
-TGTTTTTATAATTTTTGAGAGGAGTTTCAAAATTGTGAATATTTACAAAA
-AATGGACATTCTTGCCACTTTTTACTAATTTTTGATGGGCTAAACCTAGA
-TTTTCTAAATTTTACATTTATGAATTACCCGTTTTCGACGAATTCAGGCA
-AATTTTTATTTTTTCCTATTTTTTTCAGCCATTTAATCAGCCATAATAAT
-GAATGTCCTTTTTTTTTGGGCAAAAAAAAATTTTTTAAGGCTCGAAGACC
-AATTTTAAGTTCTCTAGCTACAAAATGAACCATTTTAGAGGAGTTTCAAA
-ATTGTGAATTTTTACAAAAATTGCCCAAATTTGCCACTTTGTAATGGTTT
-TTGGTGGGTTAAACCTAGATTTTCTGTATTCTGCATATATGAATTACCCG
-TTTTCAACAAATTTTGACAAATTTGTATTTTTTCCAAAATTTTTTTTCAG
-CCATCTATTCCTTTTTTTTGTCTGTTTTTTTTTCGGGCAAAAAAACCTTT
-CCCCACTGGTGCTATACCACCTTTAACGGTAAATTTTACTGGTCTAAAAA
-TCGGCGAAAAAATGAAACTTCAAGTAATATAATGGTAATTGAGTTTTTTT
-TTCTATTTTCTTTGTTCAAAATATCAATTATGACAAAAAACGAGAAAATT
-ATATTGACACAGTTAAGCGGATATAAATAATAAAACATCACAAGCACATT
-TAATTTTTCAAACCCCCTCAGGAGTCATGAAGAAATCCTTCTCTGCACAT
-CTACCTTTCTCCACATCCAACTCCTGATTTATTTTCTCCGCAAACTCCGT
-GTAACTTTTAATTGCAACATTCAAAAGTTTTGTATGATGCTTCAAGTGAC
-CCAAGTCGATTACACAATCCCCGCAAAGAGCTTCGCTGCGAATTTTGTCA
-ATTCCCTCTTCTAAATTCACTTGTTCTCCAAACTTCACTGATTTCCTTAG
-GATCCCAGTGCTCAGGCAACAGTTTGTGCAAATTCTCAAGGTTTTTGATT
-TCAGTTGGCAAGCGGTGCAGATAGGGCTCTGGAATTTTAAATTATTGATT
-TTTTTAAAAATTATTAACTCACCTCGTCGCTTTCATGTGCTCTTCTTGGA
-TTATGGTCATATGGAACTAAGAATCTCGAAAGTTGTATTAAATCCCACAA
-AGATCGATTCACATTTTTCCTTTCAAACGCATTTTCTCGTTTACAGTGTG
-GACATCTCTTGTTCAGTAGTTGGAGTCGGCATCTGTCGCAGATAGTGTGA
-CCGCAAGTGCCTATACAAGGGATTTGGGTATCATGATCTGGAAAATTTGG
-TGTGTAGGGCTTCCATGGTAGGCAGGCGCGGGGCCTGGCCCGCCTCACAC
-CGGTGAATTTACAAATTTTTGATTTTCTCGTTTTTGTCATTTTGATGAAA
-AACATTGAGGCAGGCGGAGGTCGCCTCAAGTTCACTCGGCGTTTGCCGCC
-AGCTTCCTACCCAAAGCTTTGCAACTTCTTACCCAAGCCTTGCCCAAAAA
-ATAAAAAGCTTAAATATCAAAATTACTCAATTTTGTGTCATTCTACTAAT
-TTTCTGAGAAAATTTGAATTCCCGCCAAAAATTTTATTGGAAAATTTGAA
-CTACTGGCCAAAATTTTTTTTGGCTGCGCCAAAGATGATCTTAGAAATTT
-GAATTCTCGCCAAAATTTTTCCCAGAAATTTGAACTTCTTGCCAAAAATT
-TTTGTTGGATAATTTGAATTTCCGGCAAAAATTATCTTATAGTGAGGACA
-CAATCAATAGTTTTGGTCAAAATTGTATTGTCAAATTTTTGATGTGTGTT
-GGCAATTTTGGCAAATTTGCCGAGCTCGGCAAATTCGGCAAATTTGCCGA
-GCTCGGCAAATTCGGCAAATCTACTTTTTGAAATTCGCCAAATTTGGCAA
-ACGGCAGAAAAAAGTACAATTGAGATTTGAGGTACACAAGACTTACATCG
-AAATTAATCTAATTAAAAGAATATCACTTACCATATTCATCATAGCATAT
-ACTGCATTCAGTAACCTTCATCGCAAAAATAGTCTAGACACTGACCAAAC
-ACTACACACTTGATGCTATTTATATACTTTCTATGCTGAGCAATACAGAA
-CATGCGATGTGAGGAATCTTAGGTAGCAGAAGTACAAAAAGATTGACATG
-TGATTAAATTCCTAATTTGTTCCTTATCACATTTCCCATATGTCAATTAA
-TTCGTAGATAGATGCTATTGATAAAAGTTTTTCGAGAATTTGTAAGATAT
-GAAAATAATATTCCTCATTTTTAATTTAATGATACAGTACTTTGAAAATT
-TCAACAATTTCAACAATTTTTAACACCTATGTTATCATTCATATACAACA
-ATTTGTTTAATACAGTAATACATTTCCACCCACGTGGTATTAATACAGTG
-TTAAGCTTGTTATTTTTTAAGGAAAAATTTAGAAAATTTTTCTTCCTCAT
-TTTGCTTACTTTTCAAAAAAGCGTGCAACTCCCTCATTTAAAAAAGAAGT
-GTCGTCGCTGAGGAAAATGTTAAAAATTTCTCTCATGGTGCTAAAATTAC
-TAACTAAAAACAGTAAGTATCGTAGCGAAACATTTCAAAAATTTTCAAAA
-TTTTTTATTTATAGTCAACAGTTTTGGAAGTCAATTAAAAACATTTTTTA
-CTATTTTTAATATTTAAAAACGTTTCAGTTGCTTGTAACTTTATAAGTTT
-GCCTACCGTACATTTACCGTAAAACAACCTTAAAAATGTAAGCTTTTCTC
-CCGATAAAAATCTTTACTCAGGAGTTCGCGACTCTTCTCTTACATTAATT
-TTTTCTCTAATATATTGAGCTCAAACCTAGCTGTAAAATTGAACATACAT
-ATAACTTTGAGTGCAATTTAAATTTCAGAAAACTTTCACAAACCCAAAAA
-TTGAGAATGCTCAGGACAGTTTGACCTTTCAAGAAAATTGCTTCGAGAAA
-ATTCCAAGCTTCACAAAATTGCTCATTGCCAAGTTATTTCCTTTAGTTTG
-TGGCCAACGCCTTAAAAAATACAAATTAAAAAAAAAACTCTGACACCACG
-TGATGATGCAATCAGACTCACGAACTCACGGGGTTCTGCCCTTCCTCATT
-GAATTTTTCGCGCTCCATTGACAATCACCCGCCGTACAACACGTGGGAAA
-GTCGTGCACTCCACAAGGACAAATACATTTAGTTTTACAACTAAAATCGA
-GCCGCGACGCAACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCAA
-GCCGAAATGGCCTAGTTCGACAAACTCTTCCATTTCAATTTATGAGGGAA
-GCCAGAAATCCGTGCGAACTGCGAGCCTAACGCTCTTTTTCAAAATATCG
-TATAACTCGGAAAACAAGCCATATTCCCAGTTCCTGTTTTATTTCGAAAA
-ACAGATAATACAAAAGAAATATCTGAAAATTAAGAATAACATGTTTTTAT
-TAAATACTTCTTTGTCTATATTCCATATAAAAAGAACCCCATGCGAATGA
-AACACTCACTATACATTCAAAATGAATTTCGCCATCTACCTTCTCGCTTT
-CATCGCCTGTCTCGCTAACTTTGGATTTTCACAGGGTAATCCAGGACTCT
-CATTTGATCCAGAAGAAGATTCAGTAAATATTGTAAGTTTTCGGATTAAT
-GGTTACAACATCTATAAGATTGTTTAGAATGGCAAAGTGCCAGTGGGAGC
-AGTGAAGACGTTGGTTAATGATCTTGTGAGCCCTACTATTGCAATTGTGG
-AGAAAACATTATCCTCATTGTCAGTTTAAGGAGCTACGGGAGGGCTCCAT
-CCATCTCAAATGTTTCAAATAACTCATATTGTTCTTTTATCTGGGAGTAA
-ATAAATTACATATTGGGAATCCTTTTCTTTTTGTTGTTAACCAAGTTGCC
-GGTTGCCAAATTTTTTTGGGTTCGGCAACTTCGGCAACTGCCGGTATCAA
-TGTCAAACATTTTGAAGCTTAGAAAAAAGCATTCAGAGAGCCTGAAAAAT
-TCTATAATTTCACTTTAAACGAAAAAAATACCATACTTTTTTACCAAAAC
-GCTCAAAAATATAATTTCAACAAAAAAACATTGAAACCTGGTTGCCGAAT
-TTTTTTGGGTTCGGCAATTGCCGGTTGCCGTTAACCTCGGTTGCCGCACA
-GCCCTGATGTGGAACTCTGCAGGCCTAGCGGCATCCATGTGAAGGAAGCG
-TATTGTATTTATTTTTAAACATAAATTAAAAAATCGATAAAACCTTCATA
-TATATAAATTGTTTAGACCGGTGAATAAAATGAGACGATGCCACGCGAGT
-TGGCGAACGCTTTTCTCCGAAGATCCAAGTCAGGACGTCGTCGATGGGCG
-GGACCCGGTGGGCGGAGCTTAGTCGGATAGCGCAGCAGACAAAATACGGG
-CGGTGCGTCGAGATCAAGTGCGTACTCCTCGACGGAAAGGGAGCTTGACG
-CGTGGATTGCGTTCTCGTCGGATGAGGAAAGATCTTCTGAGGAGGCGACC
-GGAGCCAGTGGTGGGAGCTCTTGTAAAAGGCGTTCTCTGAAACAAATAGT
-GGTGTTAAGGGGAAATGCGATGGGAAATCCGAGTAGTTGATGTCCGCGGA
-ATTAATTTTCTCGGGGTTTCATGGAAATTTAATTCCGCGGATTTCAACTT
-GCCGAGTTTTTATTCGATTTTATGAAAAAAATTACACGAGAAATTGTTTT
-TTTTAATTAAAGTATCCGAAATCCCCGGAAACAGATTTCCATAGAGAGAG
-GTCACTAGAGGTTTCATGGAAATATGTATTCAAGGTCTTAAACTACCCAA
-TTTTTTTACCTCGATTTTAACAAATTTCAAGTAAATTTGAATAATTCTAA
-CCAGTTTTGTTGTTTTACACAAAAATTCGGGTTCTTTAATCCGCGGAAGT
-AGCTTTCCAGAGGTTTCATGGAAATATGTTTCCGGAGATTTCAACTACCC
-GAGTTTTTTATCTCGATTTCACACATAATCGGCATAAGAAACTACAATTA
-TTTGTTTTCGGGGAAACTTTAAAAAACCCCAGAAAGTTGAATTTCTAGAA
-ATTAGCTTTCCCGAGGTTTCATGGAAATTTGTTTTCGCGGATTTCAACTA
-CCCGAGTGTTTTACATCAATTTCATCATAATTGACATAAGAAACTACAAT
-TATTTGTTTTGGGCGAAAGCTAAAAAATCCCCGGAAATCTGGATTTCTAG
-AAACTAGCTTTCCCGAGGTTCATGGAAATTTGTTTCCGCGGATTTCAACT
-ACCCGAAATTTTAATTCAATCTTTAAAAAACATCCAGTTTTTGTGACATG
-TTCTTCAGTTAAAAAAAATCAGAGTGTTGGAATCCTAAATTTCTAAATTT
-TCATAGTTTCCGCGGATCGAATTTCTAGAAATTACCTTTCCCGAGGTTTC
-ATGGAAATTAGTTTCCGCGGATTTCAACTTCCTGAAGTCTTCATTGGATT
-TCAATATAATTCGCACAATAAAAAAAGCCAAAACGCGAGGATCCCTGGTA
-GTTGAAATCCGCAAGAATAGTTTTCTCTAGTTTGAAAAATTTACTGAAAC
-CCTTACTTTTGCTTTCCCAAGAATTCGAGTTGTTCCTCGAACAATTGCTT
-TGCAGTCCCAATATTCGGCGAAAATTTCGATGGTTCACTATTCCGACGGT
-GCTCTTCAATTTTTCGCAAGTTTGCTGATACCTGAAAAATCGATATTTCA
-GACTATCTGTGCCAAAAACTAATTTATTAATTTACCTTCTGACTAGCATC
-CTCCAGCTCAACAATGTTATGAATGGTGGCTTTATACTGTTTCAGCTTCT
-CCTCAATTAAAGTCTGAACACAACCCGTTTGCCGTGCCACGTCATTCAAC
-TGCTCCTGAGCATGAGCACTATCTTGTCGGCGGAGCACACATGGCCCGAA
-GATCAGAGCCAAGTTGTTGCAGCCCATTTTGTTGACGGCTTCCTGGTCGG
-CGACACGTGCCAAATGATACATTAGGCGATCGAGCACGGCGCGGTTCGGT
-TTTGGGAGAAGCTCGATCATTACGGAAAGACAACGGACACGTTCACCCAT
-ATCCTCCACTTCTGTAATTTTTTTTTTTGGACGAAAAAAAACAACAAAAA
-ATATCATTTTGACAAAATGTTAACTTTCAGAAAATTTGAAAATTGATTTA
-TTTTTTTTGTTTCAATTTTTAGGTTTATGAATGAATCCGATTTTTTTTTG
-TCGAAATTTTTAATAAGAGCCCTAGTAGGCATGTGGTGTGTGTGTGTCTC
-ACTTCGGCTTGATCTACGTAGATCTACAAAAAAATGCGGGAGAAGAGACT
-CAGAGTTCTTAATGGATTTCGCATGGTTAACAATATGCTGACGTCACTTT
-TCTGGGGAAACAATTTCCGCAATTTTTTGTAGATCAAACCGTATTGAGAC
-AGCATCTCTGCCTGGCTGCGGACGCCTCGTTTTTCCCTTGGAATTTTTTT
-GGCGCGAAATTCAACTTTTCAAGTAAGTGCGAATATTTTCAAGTGAGACT
-GTTCAAAATTATTTTGCTGCCAAATTTGAGTTTGCAAATAAATTATTGAG
-CAAAATTCAAATGTTCAAATATTTTCTTTCGAAACGTAATGAAAAAACTC
-AAAGTTACAAATAATTTGGCGCGAAATTTGAGTTTTCAAATATTTCTAGT
-GCAAAATTTGAATTTTTCGAATAATTCTGGTCCAGAATTCAAAAATTAAA
-AAAAAATTAGTTTGAAGCGATGCTCAGGTTTTCATAGAGCTTCCATGTAG
-GCGTTAAAACGCCTGCCTGCCTGCCTTATGCCGCGCCTAATGCTTGAATA
-TACGTAAACTTTTTTTCATTTCTTAATTTGATTTTCAACAAGTTGATAGA
-ATTGAGAAAATTATAAATTTGTAAATTTACTTAAAAATGCAAAAAAATAG
-GCAGGGTTCAGGCAGGTGCCAGGCCCTGAAACAGCGCCTGCCTACCATGA
-AAGCCTATCGTAAAAAATCCAAATTTAATTTTTAATTTTACTAAAATTTC
-GATGGCTCGTTTTTTTTCAAACATCACAAACCTGAAACATTCAAAAAATT
-TTCATAGAGATCAAAAATGATAATTGGTTCGGCGAGTTCTCGGAAGAACG
-CCTTGACAAGTGTAGTTAGCACATGAACTCCAATATCCTCAAGATTCACA
-GAATCCGCATCTGAAACTCCGAATTTGATTTTTTTTTTTTCAATTTTTCT
-GCAGTTCAACAATTACCTGCAGTCGATTCAATCACTTTTCTGATACTTCG
-AACTTGGGGTAGAGATCCACTTTTTCTGAAATTACGGGCGCAAAAATTTC
-AATTTCAAAGACCTTCAGGTATTTCCGTACCTATAAACTCCTTCCACAAA
-CAGGGCACGTGTCTCAATTGCAAAAAAGAGTCGGTCCAAGAGTGTTGGCA
-CAGTATGATCATCATCGACAATTGATACTAAAGAGGCGCCAAAGAATCTT
-CCACCATTTGTCTGAAATTCAATATTTATAATAGCATTATAATAGCATAT
-TTGGCTGTAGTTTGTAGCAGGGGTCAGGCAAATTGCCGATGTTGCAAATT
-TCCGGCAAATCGGTAAACCGGCAAACTGCCGGTTTGCCGAATTTGCCTAA
-AAATTTTTGGCAACTTTTTTTTGGAATTTTCAGAATTTCCATTTTAATCG
-GCAAAATTTTACGCATCGTATGAATTTTCTTACATTTATTTTGAAAAGTA
-AGCAAATTCTATGAAAACATCTGAAGTAAACGAGAAAAAAAAATTCAAAA
-AGGCACAGTTTTAAGTGTTTCCGTCTTATAAAAAATCCCTCTAAACATTT
-CCGGCAAATCTGATATCCGGCAAATTGCCGGAATTGAAAATTTCCGGCAA
-ATTTTGATTCTGAATTTTTCAAAAAAACTGTTGGCAAAATACAAATTTTA
-TTTTATTTTCAAATATGTTTTTTTTTTCAGAAAAGTAAATTTTTTGCCGG
-GAATCAAATAATTCTTGAAAATGTTTCAAGATTTTTTTGCCACGAAATCA
-GACGTTTTCAGAACAGTTTTAGCGGAAAGTTAAAAAAAAATTTCAAAATT
-TTTGGCAGGAAGTAAATATTTTTCAGAACATTTATCCGAACAGTTTTGGC
-TGTAAATTCAAATGTTTAGTTTTCAACAACTCTTAGCGGAGAATCCAATA
-TTTTTCAGAATTTTGGAAATTAAAAATTTATCGAAAATTAATTGCAATTT
-CTAAGAAAGCAGTTGTAATTTTTTTTTTCAAAAAGCTACCGAAAAAATCT
-GGCAAATTTGGCAAATTTGCCGAGCTGAGCAAACCCGGAAAAACGCAATC
-ATTTTCTATACTTTTTGGATCATCAAAATTACTGAATTCCTACAATTAGT
-ACACGTCAGATTTTTCTATAAGCTCCGTTTGGTCTACTTGTATAAAGCTC
-GAAATATCTCAATGTTATGTTATTTTACTAGATTTTTTTGGAACAAAATC
-AATAATTTCGGTTAAATTATATTGTTCATTTTGTGGTGTGTGCGTGAAAT
-TTCAAAATTTGCCGAGCTCGGCAAATTCGGCAAATTGCCGCACACCCCTG
-TATTACTCACCTTCGGATCAATCGCCTTTCCAGTCATCTGACACGGATGT
-GTGACCTTCGGCTGACACTTTTTATGACACGATATCCGGCACGCAACACA
-AGTGTACAGCTTCTCATGGTGCCATATTAACTGATTACACACTTCACAAT
-AAGTCGGCACATGGACTGCTTCGGCACGGAATCGGTGACCAGCATGTACC
-TGGAATATTGGAATTGCGTGGGCAGGGGAAACTAGTTTCATTGAAAATTT
-TTTTTTAACTGCTGAAATTAGTCCAAAATGACATGTTATATGTACTTTTC
-TCAAAATGTGTGAAAATTGCACACTGAATTAATAAATAATATTATTTTTG
-TAAAAACATAAAAAGGGGAAAAGTCAGCGGTAAAAAAGTAAAAACACTCA
-GAGTTAGATCTTTTGACCTCCAAAATCCATGAAAATTTGCTTCATTTTTT
-TCATAGCTGTGACGTCGTGGGCGGCAATTTCCGTTCGGTAAATTTATTTT
-CGGCAAATACGGCAAATTGCCGATTTGCAGTTTGCCGGATATCAATTTGC
-CGGAAGTTTTAAAAGGGATTTTTTAAAAATTCCAAAACACTTAAAACTAT
-ACTTTTTTGAAATGTATTTTTACTATTTTCTCTAGATATTTTCATAGAAT
-TTACTTACTGTTCAAGCCCACAGCTTGCCGAAAATTTCCGGCAAACTGTC
-GGTTTGCCAAAATTGCCGAAAATTTAAGAAACGGCAATTTGTCGGTTTTG
-CCGTTTTCTAAAAAAATTTAAATTTCGGCAATTACTGTATTTGCCGTTTG
-CCGAAAAACTAAATTTGCCGCCCATCGTCACACAATACAAAAAAATTGCG
-CGGCTTCTGGAGATCAAATCTGACAGCTTACTGTATTTATAACTACAAAT
-TCACGCTGTGTTTTTCTCTAATTCACGTGGTGTCAGGGTGTCTCACTTCG
-GCTTGATCTACGTATATCTACAAAAAATGCGGGTGAAGAGACGCAAGAAT
-GTGCTAACGTCACTTTTTTTTTGAAAAAAAAAAAATTCCCGCATTTTTTG
-TAGATCAAACCGAACCGTAATGGGACATCCTGGCGCCACGTGCTAATAGT
-AAGTCACTACATTCTTACCGCCGCTACATCTGATTTTACACGCTTCTTTC
-CAACTTTCTGAATACCAATATTTTACACAATTTTCTCGGATTTTGATATA
-TAATACTTTCGCGGGCTTCTGGCTTCCCTCATATTTTCAAATGTAAGAGT
-TTACCGAATTAGGTCATTTGGGCTAGGCTACGGCGCGTTGCGGCTCGGTT
-TTCATTGCAAAACTAAATGTATCTGTCCGATTGTCATTGGAGCGCGAAAG
-GAAAGCTAGAAGCCCATGTATTAAAAAATCGACTTACCTTTATCATTGAT
-GACTTCTCCTTCCCGCGCTTCTTTTTCGATTGCACATGAACGTATTCGTT
-CAGGAAACCTCTGGAATTGAAAAAAATTGTTTTGTTACAAACGCGCCCTA
-ATAACAATTGATCGTGTATTCCACGTTGGAAATTATACAAAATACAATGG
-AGCACTTTTGCTCGAAGCCTAACATTTTCTAAATGTTTTCTCACCTAAAA
-GCGTTAACGCCAAGTGTTGTCGGAAAGGACACACTCTCCTCGAGACAGAC
-TTTCGTTAAAAGTCCCTCGAACATTGTGATGACGTCACGGTATTTAAGCA
-CGGATTGCTCGACCTGAAATGATATGTTGCTAATTACACTTGCGTGGCCG
-TGAACCCCAAAAACTAGGCCACCTTTTGCGCCCAATTACCGATAAAACCG
-CCTCATATCCCAACAGCTCCATATGGAAAGCTCTTAGCGACTTTTTGAAG
-ACCGCATCCACTACAGTATCCCTTTTGGCATTACTCTCGTTTAGATGACG
-TGTCTTGTTGAAAATAAAAATACTGAATTGTCGGAGATCGTCGGTGGATT
-CTACAAGCATGTTTCCAGGGTCGATCTGTAAGTATTGTTTAAGTACAAAG
-TACTACTGCTTCAGTAAGCATTGTAGTTTATAGTTTGTGGTTTGTGTTTT
-GTAGTTTGTGGAGTTTTTAGTATGTAGTGTGAAGCTTGATATTCATTTTG
-CAGTACATTGACTTGGATTGGGGTGTGCTAAGATATAATATCAAAGTACA
-AACAACGAGTGACAAATTAAACATCTCAATCCGAAAACTACAAACTAAAC
-CCTACAGACTACAAACTACAAACTATATCCTACAGACTACAAACTACAAA
-CTACAAATCACAAACTACAACCACGCAAAAGAACGTTACCTACCTGTTGC
-TTGGTTTTTGTTAAACTGAACGTGCCGGTCGATGGAATTGGTGAGGAGGA
-TTGCCGCTGCTTGTGGGGCCTGGAGTTTCAATTTTTTTTTGTTTCAATTA
-AGATTTTCCTCAAATGTTCCTTACATCAAATCCCATGGCCGTTTCGGTGA
-ATGCAGCCGAGTTGGTGATCGAACTGGTGACGTGGGATTGCACGGGATGG
-AGGAGGCGAAGACGAAGCATTCCTTGTGCAGGCACATTTTGCATCCTGGA
-AGAGTTCAAATTACGGCTTCTAGGTCATGGTGGCCGTGGCCGAGGCTTGA
-AGGGATGCTAGGTCAAGTCTGACGTCACATGTGGTTTTTCTAGGACACGT
-TACAAAGATTTCGAAGCGCCCAATTTTCGGAGAGGTTTCTAGGCCATGAA
-AATGTTCTAAATTTCAGGTTTCTAGGCCAGTAGAGAATTTTGAGGTTTCT
-AGGCCAGTAGAGAATTTTAGGCCATATCTGACGTCACACTTTTTGGGACG
-CGCCTAATAACGATGGTGGACCTCTATTCTAGGAGGAGCAACACATTTTT
-TACGAATTTCTAGAAGATGCAACTTCTGCTACTAGGCCACTCATGTGGTG
-CGAGGCTGTCCCATTACGGTTTGATCTACAAAAATGCGGGAACTTTTTGC
-CCAAAAAAATGTGACGCCGGCACGTTCTTAAACTTGCAAAATCAGTTGAA
-AACTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATACGTAGATCAAACCA
-AAATGGGACCACACACACACACAAAACCCACTCTGACACTTGTGCGCCTG
-TGAGATGAAGTTCGTCAGGTGCCGATTGCAAAGAGCACATATCTCCTGCC
-GATGAAGTCGTGACATCTTGAATTGATGGTCTTTTGCGACGAACACGTCC
-GGCGTCAGTTCACTGGCAAAACTTGGTCCCGGAGACGGTTCATCCTCGTC
-CTCGTTCCTGCCAAAAAGTGCCTTCAAATTCTTTTTTGCCTTCTGGAATC
-CCAACTTTCCAGCGCCTCCTTTCTTTTTGGAATGTGTTGGGCTTAGCTGA
-AAATTCAAAAGTTTTTAATATTATAAGTAGAACCCTTACCGTGAACGAGT
-CATCACATCTTGACATTGAGAAATTGTTGGATTCGGTACTATTAGCCCTC
-CGTAACATTTTTAATTTGGTGGTTGAAGCCGTAGGGGCCAGAGATTGCCG
-TCTATGATGGGATAGATCAGCTCCTTCAATGAGCTTCAACTTTGTGTCTT
-CCAGGATAAATGTGGCGTCCACGTCGACGGCGTCATCGCTGAAAAAAGGT
-TTGCGTGTTACGGTAAGCGAGAATTATGGCAGAGGTGGGCGGAAATTGCC
-GTTCGGGAAATTTTTTGTCGAAAAATTGCCGGTTTGCCGAAAATTTGAAT
-TCCGACACTTTGTCGGTTTGCCAGAAATTTTCAATTCCGGCAATCTGCCG
-ATTTGCCGGAAAATTTCAATTTCAGCAAGTTGTCGATTTACCGGAAATTT
-AAATTCCGACAATTTGCCAATTTGCCGGAAATTTCAATTCAGGCCATTTG
-CCGATTTGTCGGAAATTTCAATTCCGGCAATTTGCCGATTTTCCGGAAAT
-TTCATATCCGGCAATTTGCCGATTTGCTTGGAAAATATCAATTCCGGCAA
-TTTGCGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCAGATTTGCCT
-GGAAATTTTCAATTCCGGCAATTTGCCGATTTACCGAAAATTTCAATTCG
-GCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCCGATTT
-GCCTGGAAAATTTCAATTCCGGCAATTTACCGATTTACCGAAAATTTCAA
-TTCGGCAATTTGCGAATTTTCCAGAAAATTTCAATTCCGGCAATTTGCAG
-ATTTGCCTGGAAATTTTCAATTCCGGCAATTTGCCGATTTACCGAAAATT
-TCAATTCGGCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGGCAATTT
-GCCGATTTGCCTGGAAAATTTCAATTCCGGCAATTTGCCGATTTACCGGA
-AATCTCAATCCGGCAATTTGCGAATTTTCCAGAAAATTTCAATTCCGGCA
-ATTTGCCGATTTACAGGAAATTTCAATTAAGGCAATTTGCCGCTTTACCG
-GAAATTTCAATCCGGCAATTTGTGAATTTTCCAGAAAATTTCAATTCCGG
-CAATTTGCCGATTTGCCTGGAAAATTTCAATTCCGGCAATTTGCCGATTT
-GCCTGGAAAATTTAAATTCCGGCAATTTGCCGATTTGCCGAAAAATTGCA
-ATTCTGGTACATTGCCGATTTCCCAGAAAATTTCAATTCCGGCAATTTGC
-CGCTTTACCGGAAATTTAAATTCCAACAATTCTGGCACATTGCCGATTTG
-CCAGAAAATTTCAATTCTGGCAATTTGCCGCTTTACCGGAAATTTAAATT
-CCGGCCATTTGCCGATTTGCCAGAAAATTTCAATTCTGGCAATTTGCCGC
-TTTACCGGAAATTTAAATTTCGGCAATTTGCCGATTTGCCGAAAATTTAA
-ATTCCTAAGAAACAGTGGCCGAGATCAGTTTTGACGTCACTTCTCTTCCA
-GAAAATGCACTAAAGTGATGTGACGTCATGACTGAGTTTCTAGGCCACGT
-TTCGTTTGATAAAATTGGCGGAGGACCTAATTTCCAATGGAAAATAAATT
-CAATTTTTTTAAATTTCATAATTTTCTGAAAAACTCACTCCTGAAAAGCA
-TCACTCTCTTCCGAAATATCATCATCAAGCCCATCCTGCGTAGACTTATC
-ACTATCCGAATCATCATCCGAAAGAGCAAAAGCCGCCAGAGAGCTCGGAT
-CACTCAAGTCGAACTTTGTAAGATTCACAGCATGAACCTTCCGAACTCTA
-AACGGTGACTTCTTAACGTTCAAGGCTCCATTGCCCTTTGGAATCTCGCC
-GACTCGCTTGCGAACCGATGCTCCGCGATACGCAGACTGCAGAGCTATCA
-CCGATTCTCTTATCGATAAATATTTCTGTCGTTGCTTGTACTTCTTCCAA
-TTACACTGTATCGTTTGAGCTGCTAAGGCTTTTTTCCGAACTTCGGCTCT
-TGCAAATGATCCTCGAATCAATGCTTGGATCTTGATAATACCCTCTTTCA
-TTCTCAAATATCGCTTTCTAGCCAACATTGTCCTGAACCATCGTTGAAGT
-GTATCGATTGATTGCATAATTGTCCGATGCAAATGATCATCGAGTATCAA
-CTTTTCAGCGTCTCTCATAAAAATCTTATTGGTTCCATATTGAATATTAT
-CATTATCAATCGATGCATGGGAATGTATGTACTCTTTCACATCGTCCACA
-GTACTATCCCTTCCGTTTCGCAAAAGAATTCGGTATTGCTGGACAAAGCT
-TGGATACTCAATTCTCACAGAGTACCCGGCTCTCCGAATTCGAACGGTCT
-CGAGCATTCCGGTGTAGCGGAGCTGGCGGAGGATTATGTTGTCGTCGAAG
-TGGTTGGCGATCTATAAAATTTTAGGTGAGTGGTTTTTGTCAATAATTTC
-TACTTATATTCAGTCATATAAATAAAAACACATATAAGAAAAGTACCAAA
-AATTTCGATCACCTAATTTTTTTAATTTTTTCTATACTCTTACTAGTATG
-AAAGAGCAGGATACAAAAATAACTCCACAAGTGATAAACCACCTTTAATT
-GGATTAGTGTGTATCACTTTGAGTAAGCTAATATTGAAGGTTTAAATGTG
-GACTACCTAGCCTAGCAAGAGAGGTCCTGTAAGTAGACTTCAAAAATATA
-GATTATCTTATGAACATATGAACTTATAAACAAACGTTGGTCAAAAAGTA
-GGTGTTCAAAGATTCCACCAAAGTTTACAAACTCACCTTATCATTATTAC
-TCTTAATACACCTTATAAAATACGGCGTCGCGTTGGCCAGTGTGCTCATC
-AACCTCGTCAACGAGTACTCGAACTGCTTTGAAACCGACGATGGCTTCTT
-GGCAAGCCTCCGTCCTCCGATAGCCTCCTTCAGAATTTGCAGCGATTTCA
-GCAAGCTCATTTTGTCGTCAGACTTTCCCGCCGGGGTACGCCGTGCTTGA
-TTTCTAATCGTGTTGAACATGCTGGTATCACAAAAGTCTGGAACTTCACA
-GCGAAGTTCGCCACGTAGAAATGCGGAGAGAGCAGAGTCCGAGCCACGAC
-GGGGAGACGTTACGATGGAGTCCATTACTCGGAGATGGCCGGCGGATTCT
-GGAAATGTTGAATAATTATATTAAGGGCAGGATAGCTCAGTCGGTAGTGG
-TGGCCGCTAGCAATCTGGAGGTCACGAGTTCAAGTCCGCCTTCAACCCCT
-AGGTTCACCAAGCCTCTATTGGAAAATGGAGCAATCCACGACTGGATTAT
-AAGCCACAGCCTTCGGCTAGGACGTGGCTTAAATTGTAGCCCAGTGGGAG
-CACCACCAGGTAGTGTACCTGACTCCCAGATCCGCAGATACACTCAAAAT
-AAAAAAACTGCGTGGCGTGTACTGCAGAAAACCTAATATTTAGGCCCCGC
-CTTTTTCTCGTCCACTCACGGAGAAAAGGCAACAATTTTGAACCCAACCA
-ATATCAGGCCGCCGACATCTCACGGGTTCCGCGCGCCGCTGCGTTTAACT
-CGCTGTGGGCGTGGCGAGCTGTCTCCGCTTGCTGCGAGTTAAACATTGCG
-GCGCGCGGAACCCGTGAGATGTCGGCGGCCTGATATTGGTTGTGGTCAAA
-ATTTTTTGCCTTTTTTCCGTGAGTGGACGAGAAAAAGGCGGTGCCTAAAT
-ATTAGGTTTTCTGCAGTACACGCCACGCAGTTTTATTATTTTGAGTGTAC
-TTGAAGAACGGATCGTCCTTTAATCCTTTAATTATACATTGCATTTTTTT
-TCCACTTCTACGACTTCGAAGGGGCGCATTTACGCGCGATGGTCCCGCCA
-CCCACCCCAAAAATCAATGGGTGGCGCGTGCCGAGACCATCGCTCGTAAA
-TGCGCCCTCCTTTAAAGTCGTAGAAGTGGAAAAAATGCACTGTAGAAATG
-AAGAATACCATACTTTTTGTGTTAATTTTTTCTATAATATCGTAGTTGTC
-CATTTATTTAAATCTTCCCACTTATTTAACTAAGGACTTCTAACGCTTAT
-TCCAGTTATTGGTTCCGATTAAATCTACGAAAACTTGCCACTTTTCTGCA
-GTTTCCTTGTCGATTGCTTGAACGCGTTCATCGCCCGAAACACACTTCTC
-AGCACATTCCACCTGTGCACCGCCACCGGATCGATTCCCAGCAGGGTCTT
-CATCACTGAGCTCGTACTGGACTTCAGAGCGTTCAACACATCCTGTCTCA
-TTAGGTCCTTATTCTTTTCTCGGAAACCCTGAAATTTAGTTTTGACGTGA
-TGATGGAAGACGTTTTTTTTGGAAGTTGTGTGTTTACCGTAATTTGATAC
-TTGACTTTTCCAGCATAATGAGCCACGATGAATGCCGGCTCCTTCTTCTG
-TGGGGTCTCATAGTATTCGTTGTTCTGGAAATTTAATCATGGAACTAGTC
-ATGTAAAAACATTTGAAGGAGTTAAGGTATGTCCCGGAGGAGTGAACATC
-TTAAGCCTGACCTAGAAGTTGATCCAAGTGGCAAGCCGACTGGCCTGAAT
-CCTATTAACAGGCCTACATGTGAATATTAAAGGTGGATTAGCGCCAGTGG
-GAATTTTGTCTAAATACACTTATAACGATGCCAAACGATCGAATATCATA
-ATAAAACACTCCAAAAACTTTTAGATTTTTCATAATTTCCGGTCAAAGTT
-TTGGAACATTGACAAAATTTTGACAAATTTGAGCTTTTGAGGACATCAAA
-ATCAATGTAACATTTTTTTGGACCCCTACAATGTCTTTTTACGAAAAATT
-AAAACAAAATTATAGTATAACAAATAGAGAAAAAAATTTTTTTTAGTCGA
-ATTTGTGTCACTTTTTGACTGTAAATAAAAAAATTTTGAAAAATTTTTGA
-AAAGTTTTATCATGAGATTTGGTCATTTTGGGAGCATAGGAGTGGTTTTT
-AACAATTTCCACCACCGGCGCTACTCCACCTTTAATCGATAATCGATTGC
-AATTTTTTCATACCTTCAAAAACTGATTTAACTTCGCCAGCATTGAGTCA
-TCTGTTCCATTATTGATATTACTCTCCTCATCGACTAGCCTGAGAATTCC
-ATATGGTTTACTCTGAAAATTCATCGGAATTTATATATATGGATATATAT
-ATATATATATATATATATATATATATATATGTATATATATACATGTATAT
-ATATATATATATACAGTGTGGGAAAGTTCTATAGGACCCCCCCTAATTTG
-AAGGTTTGAGGAACTTCCGAAAATTTTTTTGAAAAACTGCTAATGCCATT
-CGTTTTTAAATTGAAAAAAACCTATATACATTTTTTTCCAGAAGTTTATC
-TCAAAAACTGAGGTCGCGCTGGAAAAAACGTCAAAATCCAGTGTGAAACT
-TCTATAGGACCCCCCGTTTTTTTTCACGATTTTTACTAAAATCAACAGAT
-TTTGGAATTTTTGACAAAGCTCAAATCAAGTTTGAGTTAGAAATGAGTTC
-AGATAAGCAGTTTTGACTTTAAAAAATTAATACGAAATGTTCTCGTGGGA
-TCTCCAGACTGGTTCTGATTCTTCCGAACTTTGATGTTCAAGTCTGTTTC
-AAGCTTCCTGGTGCTCTCGGTAATGCCAAAACTTGATAAACTCTCTTTAA
-CAAGTTCCTACTAAAATTCCTAGCACACACACCATAAAAATTTTTACGCC
-ATCCCCAAGAAACCAGTCAGAAACAGCGTATTAACAAGTTGCAGTTATTT
-TTGATCAACAACAGAACATTCATATACTAAAATCAAGAAAGGATCAATAG
-TTAATCGGGTTTCCTTGTGTGCGGATGATCTCAAACAGTCTGTCCTCCAT
-TGATCTGACCAAACTTTTCAGCTGGTTGTCCGGAATAGACTTCCAAGCGT
-CGAGAATTCCTTGCTTCAACGATGCAACTGTTGGGTAAGTCTTGTTCTGA
-GCATACACGATACGGACAAGAATCCCCCACAAATTTTCGATTGGATTGAG
-ATCAGGACTTCGAGCTGGCCAATCAAGAAGGTTGATCTTCTTGAGCTTGA
-AATAGTCGCGGGTTGAGTTGCTCACATGGATTGTCGCATTATCCTGCTGA
-AATCTAAAGTCTTTTCTGGAGTAGTGACGAAGATATTTGGAGAGCTCCAG
-TTCCAAGACGTTCTGATAGTCAGTGCTGTTCATCTTGCTACTGACGAACT
-GTATCTCAAGCTTCTTCTTCTCCGTGAACGCTCCCCAAACCATCACCGTT
-CCTCCTCCAAAATTACGTCTCGAAAAAACCATTGGTTCCTTGCGCAAATC
-GCGCCAATAGTAGCGGCAACCGTCAGGCCCATCGAGATTGAATTTCTTTT
-CATCGGAGAAGACAACCTAAAACAATGATCCTAATTATTCACTCTTGCTT
-TTTTAAATTCTCACTTTACTCCAATTCGTTCCCATATTGTTCTTAGCAAA
-TTCCAATCGCTTGAGTTTATGGTCTGCAGAGAGTAACGGAGCAGGGCGAA
-GTTTCTGACGAACGATTACACCAGATCGTTTGATGACATTGAGGATGGTC
-CTTTTTGAAGCAGACAATTGAAGCTCATTGCGAATATCTCTTGCCGTCTT
-ACAGGAGTTGGAGGCAGCACGAATCACATTTCGTTCGTCACGCACGGAGA
-GAGCTTTGCGACGAGGAGCTCTTTTAGATGTACCGTAGCTCACCGGATCC
-TTCAGATACTCGCGAATACAGTGTCGAGAACGGGAAATTTTCCTACTCAT
-TTCATGCAGGGACACATTGAGCAATTTCATAACATCCAGCTGAGCGCGTT
-CAGTGTCCGAAAGGGCAGATCCTCGAGGCATTGCAAGTTAGACTGCTTTC
-GAAGTAAGCTTTCCAGCCTCTATATGTGTGCCACAACACATGCCACAATT
-CCACATTTAATAATTCACGCAAAAAATAGTAAATAACATCTGTGAGGGAC
-AATTTAACTTGAAATATTGGTCCCATGGAACCTTGTAATCAAAGAAAAAC
-GATTTGATTCCTGATAAGCCTTCCATTGTTTCCTGCTGCATATTTTGCCA
-AATCAGCTTGACTACACAGTCGAAACATCTAAAGTGCGTGCTAGGAATTT
-TAGTAGGAACTTGTTAAAGAGAGTTTATCAAGTTTTGGCATTACCGAGAG
-CACCAGGAAGCTTGAAACAGACTTGAACATCAAAGATCGGAAGAATCAGA
-ACCAGTCTGGAGATCCCACGAGAACATTTCGTATTAATTTTTTAAAGTCA
-AAACTGCTTATCTGAACTCATTTCTAACTCAAACTTGATTTGAGCTTTGT
-CAAAAATTCCAAAATCTGTTGATTTTAGTAAAAATCGTGAAAAAAAACGG
-GGGGTCCTATAGAAGTTTCACACTGGATTTTGACGTTTTTTCCAGCGCGA
-CCTCAGTTTTTGAGATAAACTTCTGGAAAAAAATGTATATAGGTTTTTTT
-CAATTTAAAAACGAATGGCATTAGCAGTTTTTCAAAAAAATTTTCGGAAG
-TTCCTCAAACCTTCAAATTAGGGGGGGTCCTATAGAACTTTCCCACACTG
-TATATATATATATATATATATATATATATATATATATACATTTGAAACCC
-AAAAAGGACTTATTGGACTTACCTGAAACAGCTGCACACACTCCGTATTA
-TCAGTATACTCGATATTGGTCCAAGAAATGCCCTCCTTCAAGTACTCCTC
-TTGTTCAAATTGGAAAATATGTTGATTGAAATAGGACTGAAGTTTCTCAT
-TGGCATAGTTGATACATAACTGTTCAAAGCTGTTGCATTGAGACCCAACG
-TCTTCAAATCCGAATATATCCAAGATACCTGAAAATTACTTCAATTTTTA
-ACAATTGATAATTAATCTAACCTATATAATATCCCTTCCCAGCTGAGAAG
-TCCTTCTTCAGCAATGCCTGATTAATCCTGAGGACTATATAGTGAAACAA
-AGAGTTGTATATGCACTTTGCCATGGCATCTCGGGTGTTGGTGGCCTGAA
-ATTAATTTTTTTATCTTAAATTCTTAATTTCACTTCTGTATATATATATA
-TATTACCTCAGAGACACTATATCGCAAAACTACAGTTTCTGTCTTCATAA
-CATGTCGTTTCATAGTGAGAGCCTGCATGAGAGTGTCGGTTTTGATGTGA
-AGCAGATTTGCGACTAAATCCACGACTTCTTCATTTTCAATATACCCACT
-TTCATCGCTATGGTAGCCATGTCTCTGGAAAATTATAGGAAAAATAAAAA
-AAATTTGATGATGTTATTATATTAGGAATCCTCTAAACAAGGGTTTTCAG
-GTTTTTTGGTTTTACGATTATTCAAATTTTTATGGAAATTATTATAATTC
-AAATAATTTTCGTCACTATTATAGCCATGTTGTTGAAATAATATGCTATT
-TTTAAAGGTGGAGCACCGAAATCTGGAAACTATTTTTAAATGAGTCCAAA
-TTTTCCCCTGATTCCGAATATCTATGCGAAAAAATTTTAAAAAATTCATT
-TATCAAATTTTTCAAATTTTTCAAACGCCGAATTTTCGCGCCAGAAACGC
-CGTGTGCACGTGGTATCAGAGTGTCTCATTTTGGCTTGATCTACGCAGAT
-CTACAAAAAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGAGTTCGCAT
-GGTTAAAAATGTGCTGACATCACATTTTTTTGGCATTTTTTGTAGATCAA
-ACCGTATTGGGAGAGCCTGGCACCACGTGAGTAGGCAGGCATTTTTTGCC
-TGACTGCTTGCGGGTGCCTCGTTTTTTCCTCAGAATTTTTTGGCGCGAAA
-TTCAAATTTTCAAATAATTTTGAATATTTTCGAGTGAAGCTTTAAAAAAT
-TGTTTGTGCCAAATTTGAGTTTGCAAATAAATTATCAAAAAATGTGCTGA
-CGTCACGTTTTTGAGCAAAAAAATCCCGCATTGTTTGTAGATCAAACCGT
-AATAGGACAGCCTGGCACCACGTGCGTGTGTCGATTTACGAGATTTGTGT
-ATATTTACGAAATTTTTTATCTTTATCAGACTCTGATTTCCGTTTCTCAA
-CGAGTTTTCTTCATTTTTGTATGTGATTTTTTTAAGGTCCATTAAATATT
-TTATCATCAAAACCCTAGCAAAATTTTTGGTTTTCAGTCGGTAAAATCAT
-ATAGGTAATTGGATTTTCCGTCAAGTTGTGACCTAATAGTAAGCATTGGA
-AATTTTGCCAGTTTTAAATAATTAATTGACCCTAAAACACACATTTCAAA
-AAAAAACCGATAAAAATTAAAAATTCCGTAAATATACACAAATCTCGTAA
-ATCGACACATGGCTCTAGCGCGAAAATTCAAAAACTCTTGGGTGTACAAA
-TAGCGATTTCAAGCTCAAATATAAAATCGTGGAAATTTTTTAAAAATTTT
-TTTCACATAGGTATTCGGAGTCAGGGGAAATTTGGAGTCAATTAAAAATA
-TTTTCCGGATTTCGGTGCTCCGTAGAACTCTCTGAATAAAATTTTAAAAC
-TATGGCAATAGGCAATTATTCGGTAGTTAACTTCTGAGTTGTATTTCTTT
-TTGAATCTAAACCGTCCCAATCATTTACCTTGATATATGTGATATTGCCA
-AGAAGCAACACTGCCGAAATAATCCCGAAGATGGTCTGCTGGGTCTTTGC
-ACAAAATCCGACGGAGCTCATTGCATGCCTCAACCTATCAAACTCATTCC
-GCTCGTTCACACCTTCCAGTGCAAATGGCTCGTTCTGGAAATTTTTAATT
-TTTTTTTAATTTTTTAAAAAATCGCTTTGAGGTCAGCGAATGTATCCCAT
-ATTCGCTCCAAACTTTTCCCAGCTCACCTGATTCAAATACTTATAATCAT
-GTGGCTTCAACAAGAAATATTTCTTCCTTTCTTCCTCGTCTGCACCCTCC
-AGAAGGTAGTAGAATACGTGGTAGTTTCTGAAAAAAATATTAAAGTCCAA
-GTGAGACACCAAGGGAGTTTATGTACCGTTCTCCTTTAGTTTGAAATATG
-ATGCGTGATTTTTCCAGCAGGTAGATCTCCACGTTTGCTCTGAAAAGTAC
-AAGTATAAGGCATTTTTTGTGGTATAGACATCAGGAGAAGGCTTCAAATT
-TTACGTTCAGGTCAATTTAGGTCATAGTGCCTAGTAAGTATGGTACCTAT
-AAGCTTGATTACTGCCAAAGTAAAAATTTTCCAATTCCGGCAATTTGCCG
-ATTTGCCAGGCATTCCAATTCCGGCAATTTGCCGATTTGCCAGGCATTCC
-AATTCCGGCAATTTGCCGGTTTGCCGGATTGCCGGAAATTTAAATTCCGG
-CAATTTGCCAAATTTTTTTTCATTTTCGGCAATATACTGGATTGCCAAAA
-TGTTACGGCAACTTGCCAATTTGCAGGAACTTTTCATTTTCGGCAAATTG
-CCGGTTTGCCGATATCCCAGAAATTTTCAGGTCCGGCAAGTTGTTGATTT
-GCCGATTTTCCCCGGAAATTTCAGTTCCGGCAACTTGCCGATTTGCCGGA
-AATTTTCAAATCCGGCAATCGCGGGAAATTTCAATTCCGTCAAATTACCA
-ACATGCCGGATATTCCAATTCCGGCAATTTGCCAATTTGCCGAGCATTTA
-AATTCCGGCAATTTGCCGAATTGCTGAAAATATCAATTCTGTCAAATTGG
-CAATTCGCCGGACATTCCATATCCGACAATTTGCCGATTTGCCGATTTCC
-CAGAAGTTTTCAATTCCGTCAAATTTCTAATTTGCCGGAAATTTCAATTT
-TACTAAGTCGCCTGCTAGCCTCCTAATCTCACCCGGAAACCATTCCATTC
-TCCCGATAGTTGATTTTGATGAATTTTCCAAATCTGCTACTATTATTGTT
-CGTTAATGTGACAGCATTTCCAAAAGCCTCTAGAACAGGACCAGCTGACA
-GAAGTGTCTGCTCAGTACTGCAGCCTGTTGAACCTTTCTGTGATAGCGAT
-ATCAAATGGGACATCAGATGATTCGTGGATTCCGTTTTTCCCGAACCACT
-TTCCCCGGAGATTACCACGCATTGATTTTCCTTGATACGGAGCATGCTGA
-AAAAATTGTTTTTTTAAAAATTAGTAGTGACATTTAGTTAATCCAGCATC
-AGAATGTATATCTCTGAAATTTTTTTTTTTTGAAATCAAAAGTGCTTTGA
-GGGTCTTGAAACGAACACATAACTGCAAAAAAATTGGTGGCCGAGTTTAT
-AATCGGCCACTTGGCAAATATACAAGCCAATACACAAAGTGAGCACCTAC
-GTGGCCGAGTGAAGAGAAAACTCGGCCACCGATTTTTTTTGGTCACTTGA
-AATTTCAAAAAATAGTAACTGGGTTCCGGTAAGAACTTAGAACTCACTTG
-TGGTAACAGACATCGGCGATTGCAAAAATGTGCGGTGGTAGTGAGCCGAG
-CCGCTTACTTTGAAAGTATAGCCTAGCATATTTTGGGTTGTAGATCGGAA
-AAAAGCAAAACGGGTTCACGGCTACTAGAATTGGACCGATGTACGTGTAA
-ATGTGCCCATTCGCGAATCTTTCCCGCAAATTGTCCAAGAGGGTTTGCTC
-CGTGAGCTCTGGCAAGTTACAGAGATCGGCGTACTCGCGGTCCTGAAAAA
-TTTTAAGGTTTAAAATTTTTTTAAATATAAAAATATTTAAAGGTGGAGTA
-CAGGAAATCTTTTTTAATTACTCCAAATTTTCCACTGATTCCGAATATCT
-AAGTAAAAAATTTTGAAAAAATTTCCCTGATTTTGTATTTAAGCTTGAAA
-TTACGATTTTCATTTGTGCCCGCACCACTTTTTTCAAATACGCCCAAAGA
-AATTCGCATTGGAGCGCGTTTGCATCGTTTGATTTTCGTCGTTTATTTTA
-TTTATTTTCCACGGGGTTCTGGCCTTCTTCATTGAATTTTCGCGCTTCAT
-TGACAATCGCCTGCCGGACAACACATGGAAAAGTGTCGTGTACTCCACAC
-GGACAAATACATCAGTTTTACAACTAAAGACAAGCCGCGACGCGACACGC
-AATGCGCCGTAAGTCTACACAAAATCTCTCCGACCCAAAATGGCCTAGTT
-CGGCAAACTCTGCCATTTCGATTTATGAGGGAAGCCAGAATTTCGTGATT
-TTCGCCGAATTCAATTTTCTTGAACCAGTTTCAATCATTTTTGTCGAGTT
-TTTGCTAGTTTTTTTTTTGACAAAAAGGAATGAAACTGGTTAAAAAAACT
-GAATTTGGCAAAAAATAAATAAAATCTTTAAATGAAGGAAATCAAAGCGC
-GCTCCAATGCGAATTTATTTGGGTGCGCATTTGACAAAAACACGTGGTGT
-CAGGCAAGGGTGTCAATGTCCCGTAAAAATTTCGAAAACGGGACAACGGG
-AATTCCCGTTCCCGTGAAAATTTTAAAAACGGGAAAACGGGAATTCCCGT
-TCCCGTGAAAACTTCAAAAACGGGACAACGGGAATTCCCGTTTTTTTGAA
-AACACTCAAAAAACGGGACAAACTGGGCGGTTTAAAAAAAAGAGTGCATA
-GTTGGCGTAAATTTTAGTGTATTCGAGGCAAATTATAAAAAAAAACTGCA
-TTATAAACATTTTTATCGATTTTTTCAATATTAAACAGATATTTAAAAAG
-CCAAAAAATGAGGGAAAATGTCCCGTTCCCGTGAAAATTTTAAAAACGGG
-ACAACGGGAATTCCCGTTCCCGTGAAAACACCCCAAAAACGGGACAACGG
-GAAAAACGGGAAACGGGAATTGACACCCTTGGTGTCAGGCTGTCTTATTT
-CATTTTTATCTACAAAAACAGCGGGAATAGTTTTCCAGAAAAATTCTAAC
-GTCTCTTAACCAGGCGAAATAAAATGAGAAGTCTGCGTCTCTTCACCCGC
-ATTTTTTGAAAATCAAAAAAAGAGACCGGGCACAAATTAAAATCAGGGAA
-AATTTTTTTAATTTTTTCACATCTAAATTCGTAATCGGGGGGCAAATTTG
-GAGTGATTTAAAAATATTTCCCAGATTTCGGTACCCCACCTCAAAAAAAA
-ATAATTAAAGAATTGCCTTACCTGTGGCTGAACCAAGAATTTCGTAAGAA
-AAGCGTCAATCGATGAGGCGACCTCTGCACTTCCAAACCGAGTGCCGCCG
-GTTGCCGCCCGATAACCGCGGTGTCGAAAAACAAATCGATTTTTTGGAGT
-GGCACTGTCCACCACTACAGGCAGTCTTGACCAGATGGCCTGTACCGCGA
-CTGGGTATTCCCCGGGGTCTAGGCGGCGTTCTTTATAGGTTTGACCGTCG
-GGGGTGCCCATCATTTCGAAGAGGTCAAAGTCTTGTACCGACTGGCCTTC
-TAGTTCTGGAAATTTTGACTTTAGAAAAGAAATCATTTTTTTCCTTTTTT
-TTTTAAATTAGCCCGTGGCTTTTTTCAAAATTAAAAGAAAATTTGAAAAA
-ACATTGCATTAGAGCGCGTTTGCATTCACTCCATGCAGTCCAATTTTGCT
-GGGAGCTTGAGTGTCTCATTCGACTTGATCTACACAGATCTACTAAAAAT
-GCGGGAGAATAAAATCCACTGATATTGTATGTTTAAGAATGTGCTGACGT
-CACATATTTTTGTGCAAAAAATTCCCGCATTTTTTGTAGATCAAACCATG
-ATGGGACAGCCTGGCACCACGTGAGATTGTGTCGACAAATTTTTGTTGAA
-GATGTATGGCCAAAAACGGCACATTTAAGTAATTTATCAGTAGAGCGCGT
-TTGAAATTTTTTTAAAAATTCTTTTTAAAAAGAGTTCCCACTACCCCAAG
-TCCTCCGATTTTTCTAAAAACTAAGAGAAGGGAATCTACGACCCTGAGCC
-TTTAAAACCTTACCAGCTCTCCCGGCGAGCACTTTTTCGATGAGCTCCTC
-CGTCGTGCACCGCTTATGAACCTCCAAGTGTACCGTATCATTTTCACAGT
-CGGGATTGAAGCTGTGCATATAGACGGCTACCGTATGTGTGTGTGCATCG
-TCTGTCGCGTTGATTGTGTGAGCACGTCGGGGAAAACATCCCGTCGCTCC
-AGCTGATATTGAGTCAAATGACATTTAGTTAATCCAGCATCGGGATGTAT
-ACGTCTGTAAAAAAAAATTTTTTTTGAAAGTAAAAGTGCCTGGAGGATCA
-TGCAACGAACACAAAAATTTCACAAGACCGCGAAAAAAATTGGTGGCCGA
-GTTTTCTCTTTCGCGGTCACTTAGGAAATACTAAAATCGCACGGATTTCT
-GGCTTCTCTCATAAATTGAAATGGAAGAGTTTGCCGAACTAGGCCAGTAT
-AGCTCGGCCATATCTGGGGTATGTTTACGACTTTCCCACGCGTTGGGCGA
-TTGTCAATGGAGCGCGAAAAACTCAATGAGAAAGGCCTGAACCCCGTGAG
-ATCGAAATGAAAATTTGCTAAATGGCCGAAAATTGAAAACTCGGCCGCCA
-ATTTTTCCACACGGCCACAGGAAAAATCGTAACAAAAATTGAGAGAAATT
-TATTAGAAAAAATCTGAAAGTAATTTTTATTGCACCGTGGCCGCAAAATG
-TAAAAACACGGCCACCGATTTTTTTAATGTGGGGAAAAAGTTGGTGGCCG
-AGTTTTATATTTTGCGGCCACTTAGAAAATATTTAGATCGAAGGGAAATT
-TTGTTGAAAATACGTTTAACGAAAACCAGTCAATTTTTGTTACATGACCG
-AAAATTGAAAACTCGACCACGGATTTGTTATGCTTTATAAATTTTTGAAA
-CTATTATTTTTTGATTCAGAAATTTTTGGAATTGAAAAAAACTCGGCCAC
-ATTTTTTTTCTCACGGTCACAATTTTCTTTGTGATCGTAAAAATGGAAGC
-TCGGCCATGGTGGCCGAGTTTTTTTCGCTGCCACTGGTAACACGTGGTTG
-GGTGAAGAGAAAACTCGACCACCGGTTTTTTTTGGCCACTGAAATTTTTA
-AATTTCAAAATATTTTAAATTTTGCTGCAATCTTTCACCACAACCGCGAA
-AAAATGAAAACTCGGCCACCAATTTATTTATTTTCACTGGGAGAAAAAAT
-ATTGTTAGCCAAGTTTTCTTTTAGGCAACAGAAAATCAAAAAATGAGCGA
-TTTTTGTTACGTGGCCGTGAAAAGAGAAAACTCGGCCACCAATTATTTTT
-AATTTGAGGCACTGTTGTAAAATCTTATAAAAAAACAGGTTTAGTACATT
-GAACTCAAAAATAAGGAAGATTTTTGGAAAAACAAAAATTGCTGGCCGAC
-AGCTGGAAAAAACTCGGCCACCAACTTTTTCCGGTCACACAGCAAAATCT
-CTCGATTTTCGATGTTTGAATATTGAAATCTGGGTTGGATTTTTTAGTAT
-CATTTCATTTCCGGTGGAGAAACGAGGGAGAGAAAAAGAGAAAAAAGATT
-TGTAGTGTCCCGGGAAGCTCTCTTTCTCATGTGGGAAGAAAGTGGAAGAA
-GCTTCTGCAGCAGCAGCAGCAGTGGTTCACGAAAGAGAGAGAGAGACATG
-TTGGACATGAAAATGATGAAAAATAAGAAGATGAAGAAGAGAATTACACA
-CTACCACCACAACACAGATTATTTTTATCACGTTTTGAGGGGGCGCTTCA
-CACAATTTTCATGGCCTAGAAATTTAAATTTGGTGGCCTAGAAAATACTA
-TATTAATTATATTAATTATTCTACGAAATTTCAATAATTTAAACGGGAAA
-ATTTATTTTAAAAAAGCCTAGAAGAGGTTTTGAAATTGGTGGACTAGGAA
-ATGAAAAATTGTGTTTTTGGAATTTTCTAGGCCATTTGAACTTCCTGACG
-TCCACAATTTTCATGACTTCGAAATTTGAATTTGGTGGCCTAGAAAATCA
-TAAAAACTAAGAAATCGAGAAAAAAGCATGGATGAAATTTTGAATTTTAT
-AGGTCATTTGAAATTTGTGGCCTAAAAAATGAAAAATGATTTTTTTTTTT
-TTGAATTTTCTAGGCCACTTGAATTTCCTGACGTCCACAATTTTCATAGC
-CTAGAAATTTAAATGTGGTGGCCTAGAAAATAATTAAAACTAAGAAATCG
-AGAAGAAAAGCGTGGAAGAAGTTTTGTATTTTCTAGGCCATTTGAATTTG
-GTGGCCTAGGAAATGAAAAAAAGATTTTTTAGGAAATTTCTAGGCCACTT
-GAAGTTGGTGGCCTAGGAAATTAAAATTTGTGTTTTTGGCATTTTCTAGG
-CCATTTGGATTAGGTGGCCTAGGAATTGAAAAGTAGTTGTTTTGGAATTT
-TCTAGGCCATTTGAATTTGGTGGCCTAGGAAATGAAAAAATATTTTTTAA
-AGGAAATTTCTAGGCCATTGAAGTAGATGGCTTAGGAAATAAAAAAAGGT
-TTTTTAAAGGAAATTTCTAGGCCATTGAATTAGGTGGCCTAGGAAATGAA
-AAATGATTTTCTTAAAATTTTTTAAGCCACTTGAATTTGACGGCCTAGGA
-AATGAAAAATGGTTTTTTGGTAATTTCTAGGCCACTTGAATTTGGTGACC
-TGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCCACTTGAATTTG
-ACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACTTGA
-ATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCC
-ACTTGAATTTGACGGCCTAGGAAATGAAAAACAGTTGTTTTGGAATTTTT
-TAGGCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTA
-ATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTC
-TTGGAATTTCTAGGCCATTGAATTAGGTGGCCTAGGAAATGAAAAATGAT
-TTTCTTAAAATTTTTTAAGCCACTTGAATTTGACGGCCTAGGAAATGAAA
-AATGGTTTTTTGGTAATTTCTAGGCCACTTGAATTTGGTGACCTGGGAAA
-TGAAAAATGATTTTCTTGGAATTTTTTAAGCCACTTGAATTTGACGGCCT
-AGGAAATGAAAAATAGTTTTTTGGTAATTTCGAGGCCACTTGAATTTGGT
-GGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAGGCCACTTGAA
-TTTGACGGCCTAGGAAATGAAAAACAGTTGTTTTGGAATTTTTTAGGCCA
-CTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCGA
-GGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAAT
-TTTTTAGGCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTTTTT
-GGTAATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAATGAAAAATGAT
-TTTCTTGGAATTTTTTAGGCCACTTGAATTTGACGGCCTAGGAAATGAAA
-AATAGTTTTTTGGTAATTTCGAGGCCACTTGAATTTGGTGGCCTGGGAAA
-TGAAAAATGATTTTCTTGGAATTTTTTAGACCACTTGAATTTGACGGCCT
-AGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGACCACTTGAATTTGAC
-GGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACTTGAAT
-TTGACGGCCTAGGAAATGAAAAATAGTTTTTTGGTAATTTCTAGGCCACT
-TGAATTTGGTGGCCTGGGAAATGAAAAATGATTTTCTTGGAATTTTTTAG
-GCCACTTGAATTTGACGGCCTAGGAAATGAAAAATAGTTGTTTTGGAATT
-TTTTAGGCCACTTGAATTTGGTGGCCTAGGAAATGAAAAATGATTTTCTT
-GGAATTTTCTAGGCCACTTCAATTTGGTGGTCTGGGAAATGAAAAATGAT
-TTTCTTGGAATTTTTTAGGCCGCTTGATTTAAGTGGCCTAAGAAGTTAAA
-AATAGTTGTTACGGAATTTTCTAGGACATTTGAACTTGGTGGCCAAGGAA
-ATGAAAAACTTTTTTTTTTGGAATTTTCTAGGTTTCTGTAATATTAATTT
-ATTCATTTAAAAAATTAAAAAACATTAAATTTTTTTTAAATTTCGTGTTT
-CAAAAAAAAAATCAAATTTGCCCAAAACTTCAAAAATAAGCTAAAAAATT
-GTAAAACGATACAGAACGGCTAATAAAACTTGAAAATAATAAGCGTGATG
-AGTCGGAAAGAGCCGCCGGCTGGGACCTTCTTTTTCTCTTTTTTTCTCCT
-CTCCCATCCCGAGCAGGAGCAACACAACGAGAGAGCACAACAAGAAGAAA
-AAGCAGATAGATATATAGATATATGTTGTCTTCTCTTCATATTCTTTCTT
-TTATCTTTTCATTCGAAACAACACTTGGTTCATTTCTCCCGTTGGACGGG
-GGGGGGGGGGGGGTGACGCGGGAGACGAAAAAAAAAAGAAAAATTGGGAT
-GGGAGTTGGAGAATGTTTGGAAAAAGATTGATTGATCAATCAATTTGCCA
-GCCGAGTCTCGGCTATTTTCGGAAATCGGGGCTATGCAAATGCGCCCTAC
-TGATAAAATGGGACGTGTCATTTAAACTCCTTGGTTTTTTAAAAAGAAAC
-GCAAAATCGGCAAATTTCCAGTTTGCCGATTTGCCAGAAATTTTCAGGTA
-CAGCAATTTTCCGATTTGCCGATTTGGCGGAAATTTCAATTTCGACAAAT
-TGCCGGCTTGCCGAAATGCCAAAAATGTCCAGGTCCGGCAATTTGCCAAT
-GTTGATTTTTGGCAAGTTGCTGGTTTGCCGGAAGTTTTCATTTTCGGCAA
-ATTACCGATTTGCCAAAACGCCAGAAATGCTCAGGTTCTCTAAACCGCTG
-GTTTTCCGGAAATTTTTCATTTTCGGCAAATTGCCGGCTTGCCAAAATGC
-CGGAATTTTTCAGGTCCGGCAATTTGCTGATTTGCCGGAATTTTTCATTT
-TCGACAAATAGCCGGTTTGCCGAAACGCAAGAAATGCTCAGGACCGGCAA
-TTTGCCGATTTGCCGGATATTTTCATTTTCGGCAAATTGCCGGTTTGCCG
-ATATGCCAGAAATGTTCAGGACCGGCAATTTGCCGAATCGCCGGAATTTT
-TTATTTTTGGCAAATTGCCGATTTGCCGAAAGGCCAGAAATGTTGCGGTC
-CGGCAATTTGCCGAAATGCCATAAATGTTCAATTTCGGCAATTTGCTGAT
-ATGCCGGAGTTATAAATTTCGGCAAATTGCCGGCTGGTCGATATGCCGGA
-AATTTTCAGGTCCTGCAATTTGATGATTTGCCGAAAAATTTATTTAAAAA
-AAAAATTAATTTTCGCCAGACAGGAAGTCTCTAAAATCTCATTTAATAAG
-AAGAAACAAAAGAAACAAATAATGGCCTAACAAGTTTCGAGTTACAGAAA
-CCTAGGCCACTTTGAACACCGGCGTGGCCTAGAAACCCAGTTCCACAAAA
-ATAAGAAAAAATTAAAACTCGGCCACATAATCTAGGCCAGGAGCATACAA
-ACACTCCACGAATATTAAAGACTCTTTCTAGGTTAGTGGCCGTTAACGAT
-GGAAAACTCGGCCATCTGCCAATTTTGTTGCTTAAAATTGGAAAAATAAA
-GTTTTTTTAACTTCAAAAAAAAAAGATCAAAAAGTGAAAAGCGGGGATTT
-TTCTCACACAATTTAATAAATCTGTAGCCGAGTAGCGGAGAGCTCTCGGA
-GCTCAACGTGAATTTCTATTTGGACGGTAAACATACTCAGCCACCCCACC
-CCAGCCCACCGTTACTGTCTTTTTTTTTCTTTTTTATTATCAACCAGCAC
-TTATCACCTTTATCTTTGTGTGATCCCGCGCCGCGCAAGAACGAGAGAGA
-GAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGA
-GAGAGAGAGAGAGAGAGAGAGAGAGAGGGATATTGGTGAGACGCAGACAA
-TTAGAGTCACTCGTGGGCTCTTTCACACATGTGATATTGAACGAGAAATT
-GCGCACCTAGGCCACAAAAAAAACAGTGTATTCGATTTCATGATAGGGGA
-GAAGCTGGCACGGTGCCAAGTTTCAGAAAAAATATGGAATTTTTGCTTGA
-AGCATGGTGAATCAGACGTGCTTACGTCACAATTTTTCGGGATAAATATT
-CCCGCATTTTTTGTAGATCAAACCGCAATGAGACATCCTGATACCACGTG
-AGGTTAATTAAAAGTATTGATCGGGATTTTGAGCGTCAAATATGGTGTAT
-TTACCGGCAACCCTGATGCGCCAGATTTGACGCGCAAATCCTTCATTTTA
-ATAAAGTTGGGCGTCAAATGTGATGCCTGAATTTTCAATTTTTTGAAATG
-TTTTGATTTCGTGAAAAATAACGGCGAATTTCAGAAAATTTATAGAAAAT
-TTTCATTTGTTGCGACCAAAAAATCTTAAAAACGACCAAAATTCTCAGGA
-AATTCACATTTTTCGCCGAAAAAACCATTTTGCGCGTAAATTCTGATGTA
-TTTTGCCGTAGGCTATGTGTGAAAACACTGCCGGTAATACGTCATATTTG
-ACGCGCAAACCACAAAAATCCTCGAAATTATTCCGGGTGCACAAAATTCT
-GAGAATGCGTACAGCGCAACATATCTGACGCGCAAAATATCTCGAAGTGA
-AAAATACAGTAATCCTTTTCAAATGACTACTGTAGCGCTTGTGTCGATTT
-ACGGGATCTCGACTTTCGAAATGGATTAAAATATATTATTTATCAATAGA
-ATATTACAAAAAGAAGTTAATTTCGTAAATCGAGCCCGTAAATCGACACA
-AGTGCTATAGTAGTAATTTTAAGAATTACTGTAGTTTTCGCTACGAGATA
-TTTTGCGCGTCAAATATGTTGTGCAGTACGCATTCCCAGAATTTTTCGTT
-CCCTTTCACAAAAATCTTCAAACTTGCGCGTAAAATTTGGTGCATTGGTG
-CCTGTGAGGGGTTCACCTATACAAGTGGTGCCAGGGGCTGTCCCATTACG
-GGTTGATCTACAAAAAATGCGGGATTTTTTTGCCCAAACCATGCGAAATC
-AGTTGAGAACTCTGCGTCTCTTCTCCCGCATATTTTGTAGATCAACGTAG
-ATCAAACACTCTGACACCACGTGGGCCGATGATGTAAGTGCACCAGATTA
-CACGCGCAAAAACTGAAAATCTGAAAAAAAAAAAAGCGAAAACTGTCAAA
-TTTGAGCGAGTTTTTTATTCCACGAATCACAAGAAAAATCAATAAAAAAT
-CGATAATTAAAAAGTGAGTATCATATTATTCGACAACAGAATTTCCAGTT
-TCATCAGTGAGCATTGTAAGTATACGATGAGCCATCGACGGTCCAACACG
-TCTCCCGTTCTCTGCCACAAGTTCGCCAATCTCTTGAATAGCGAGCGAGT
-AGTCCATTTTCGAGTATTTATCGATTGCGGCAATCGGATCAGGGATTAGT
-TCGAGAATTGCACGTCGCTGAGCATCCGACAGCCGATCGATTGTTGTGAG
-CATTTTCGACCACCAATCCGTGACGATTTCCGAGCGACTTCCGATCACAA
-TTCCCTGGAAAAAAATCATCGGGGTTTCATGCTTTTGATCTATTTGATCT
-ACAAAAAATGCGGGAATTTTTTGCCCAAAAATATGTGACATCGTCAGCAC
-GTTTTTAACCATGTGAAATCAGTTGAGAACTCTGCGTCTCTTCTCCCGCA
-TTTTTTGTAGATCTACGTAGATCAAGCCGAAATGAGACATTCTGAGTCTT
-GACACGACAAATTCCCGTTAATTACATACGGATGTGAGCCTTTGTTGGAT
-GTGAGAGAGTTTCCAGGTTTTTCTCGAAAGCTTTTCTTAAAATTTCATTT
-AAAAAATAATTTTTTAACGAAAAACTACAAAAAATCATCCGAAAAACCTG
-GAAAATCGATGAAAAACTCTGTGACAAATACAGTACTGTTTAAAGGCGCA
-CGCCAGTTTGTGTTCTGAGAATGCGTATTGCACAACATATTTGACGCGCA
-AAATATCTAAACTACAGTAATTCTTCAAATGACTACTGTAGCGCGCTAGT
-GTCGATTTACGGGTTCGGCTTTCGACAAATTTCGAAAATCGAGCTCGTAA
-ATCGACACAACCGCTACAGTAGTAATTTAAAGAATTACTGTAGTTTAGAT
-ATTTTGCGCGTCAAATTTGTTGTGCAGTACGCATTCTCAGAACTTTGCGT
-TTTCGTGATTTTTTTTTTCAAATTTTAACTGCAGTAAAAAAATAAAACAA
-CATAAATTTCATTTAAAAAAAACGATTTTAGCGCTCTTTAAAGGCGCACA
-CCCGTTTGTGTTTTAAAAAAAAAAAATGTCGCGTCGAGACCAGATTTCTG
-CAGATTTCGCGCCAAGACCCAACCTTATCCCCCTGATACTGTAATTTGTG
-GCCTCCTGCCCCTCCTGCACCACCACCACCGCCCCCATCACTTCCAGCGT
-CGAGCTTCTTCTTCTCCTGTCTCGCCAAACTTCTCAAGTACTGAGCAGTG
-AATAGTGCCAGCTCGGCGATCGTTTCGATTTGCACAATTTGTGCACGATG
-TTGCTCGTAGATTTGCAGCGATAAATTGTGCAATTTCTTCTTTTTCGCAA
-TTTCTGCCCTGCCGAATGAGACGATGAGCATTGTGCAGCGGCCACCGTTT
-TGAAATCCGGATTTTTGCTGGAAAAATAAAATTTAAATGAGATTTTTTTT
-AGGTCTCGCAGCGATTTCTCTGGCTGTTTCAATTACGGTTTGATCTACAA
-AAAATGCGGGAATTATAAAAAATGTTTGCCCGGTAAAATGTGACGTCAGC
-AAAGTTTCTTAACGCTGCGAAATCAGTTGAGAACTCTGCGTCTTTTCTCC
-CGCATTTTTTGTAGATCTACGTAGATCAAGCTGAAATGAGACACACTGTG
-TGTGCAAACACTATCCACAATACATCATATTTGACGCGCAAACTCTAATT
-TTTTTTTCGCTGCGAGACCTAAAAAATCTCAAACTTTCCAGTGAAAATCC
-GGATTTTCTTCATTTTAAAAAAGTTGCGCGTCAAATGTGATGTGCCTGAA
-TTTTCGCTTTTTTGAAATTTTTTATTTCGTTAAAAATGACGACGAATTTC
-TGAACATTTATAGAAATTTTAAAAATTTTCATTTTTTGGGTTAAAAAAAT
-CTTAAAAACAACCATAATTCTCAGGAAACTCAAATTTTTCGCCGAAAAAC
-CCATTTTGCGCGTGAAATCTGGTGTATTTTACCGTGCCTAGGCTGTGTGA
-GAACACTGCCGGTCATACATTATATTTGACGCGCAAACTGCAAAAATCGT
-CGGAATTATTTCGGGAACACAAAATTCTGAAAATGCGTATCGCGCAACAT
-ATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTAATTATGTAAAT
-GACTACTGTAGCGCTTGTGTGTCGATTTAAGGGCTCAATTTTCAAAAAAT
-CGAGATCCCGTAAATCGACATAAGTGCTATAGTTGTTATTTAAAGAATTA
-CTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTGCAATG
-CGCATTTTCAGAATTTTGTGTTCCCGGAATAATTCCGACGATTTTTGCAG
-TTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCCCACATCGCCT
-AAGCACGGTAAAATACACCAGATTTTTCGCGCAAAATGGGATTTTCGGCG
-AAAAATTCGAATTTCCTGAGAATTTTGGTCGTTTTTACTATTTTTTAATC
-CAAAAAAAAATGAAAATTTTTAAATTTTCTATAAATTTTCTGAAATTCAC
-CGTCGTTTTTCACGAAATAAAAAAATTTCAAAAAATTGAAAATTCCGCCA
-CATCACATTTGACGCGCAACTTTTTTAAAATGAAGAAAATCCGGATTTTT
-CTGGGAAATTTGAGATTTATTTAGGTCTCGCAGTGAAAAAAAAATTAGAG
-TTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCCCACATCGCCT
-AAGCACGGTAAAATACACCAGATTTTTCGCGCAAAATGGGATTTTCGGCG
-AAAAATTCGAATTTCCTGAGAATTTTGGTCGTTTTTACTATTTTTTAATC
-CAAAAAAAAATGAAAATTTTTAAATTTTCTATAAATTTTCTGAAATTCAC
-CGTCGTTTTTCACGAAATAAAAAAATTGATAAAATACACGATAAAATACA
-TCAGATTTTACGCGCAAACTGGCAAAAAAATTGATTTTTTGGCTTTTTCG
-GACTAAACATTAGAAAAAAGACTATACTCCAACAATTTTTTTCAGTTTTT
-TTTTTGAAATTTTTTTTTTTTCAGTTTAAAATGTTTTCATCGCTTTGTTC
-GTTTATTTTTGTCTGTTTATTGTGATTTTGTGCGAAATTAATGTAAAAAT
-TTCCATATCCAACACTGTTGTGTGATTAATTCGGATAGATAAAAAATGTT
-CAGCATGTTGAGTTTAGTTTTCGTCGTCCAATTTAGCTTTTTTTTGATTT
-TCAGTCAAGATTTTCTTTCGCCTTCCGCTTTTTGACTTTTCTATGCAGTA
-ATGACCAGTCTTGATTTCTAGCTTTTAGTGTTTGGTTTACCATTCTGCTA
-TTACATGAGTCACACCTTATCACTAATATAAATGCAGCATAATTTCAGAG
-TGAGCAAGCCGCGAGTATTAAACCAGCGCTGTTTTAAACTGATAATGATT
-GCAGTTTCCTTCATTCTCACCGAATATCAATTTTTATTCATTCCAGAGTC
-TCTCGAACTATGGAAAAACAACTAAAAGCTATGTCCGTCTCGGACAAACC
-TGCTGCCCCAGCTGCCCAAAAGCTTGGTACCGCTCCGCTCGCTGCAAAAA
-AGACGAGAAATGAGGAGTGGGGAACCAAGGTCAATATCGATACCAACATT
-CGCAAATTGAGTAAGTTTTTATTTTACAATTACCAGTCGTTCGAGCTTAT
-ATATCAATATTTTTTAGCGATCAAACCGAATCAGCCAATTTACAAGTACG
-CTGTGCAAGTGAACTACGTCTTCCGGAAACCTGATGGAACTGAGGCGACA
-ATCGAAATGTCCAAATCAGCCAAAAAGGGAACGGAGCACGACAACGACAA
-AACACGCTGCCAGAACGTTTACAATGAGGCGATCAAGCGTTACGATGAGC
-TGAAAACCGGAGGACCGTTTTTCTACGATCGTCAAGCCTCTTTGTACACT
-CTGACCAAATTGAAGAATGAGGTGAATTCGATTTTTTGCTTAAAGTTTAA
-TATTTTGCGTTTCAGAGCATCTCTTTCGTTGTTACTGACAAGATTTGCAA
-GCGACAAAACTTCAAAGAGGCACAGTTTGTTCTCAAAAAGGTGGATCAAT
-CGTTCCAGTCAACATCGAATGACGTCATCAAGACAACCAACTCGTGCCCA
-GCCAATGCCGACAAAACTTTGCTTGAGGCAATGAACATCATTGTCTCGGG
-ACCAGCGTTCGAAAAGTATGCCGCTTTCAGAGATAATCAAGCTATTTCAT
-CTCGTTTTCAGCAAAAATGTTATCACCGTTGGAGCATGCGTTCATTACCT
-CATCGACCCAACTGGAGTCGAGTAAGAAACTTTAAGAAATTATCATATTA
-GTATTTAATTGTTTTTTCCAGCGTCGCGTACAAGGAATACCCTGAAGGAC
-AACTCTACTCAGGAGTTGGTGTTTCAAAGTCGGTGAAGACATTGGAAGGA
-ACGGACAAGAAAGTTCCATCACTCTTCATGACAACTGAAAGTTAGTTTTT
-CAGAAAATCTAGATTTTTTTCAAAATGTTATAAAATTGTTAATTTTCAGT
-GAAGACAACATTGTTCCATCCGGATTATGCCCCACTTGTGGAACTTTTGC
-AAACGTTCAGAGGTTTCAGCACAACTCTCAAAGCGAATTCTCCAGCCGCG
-CAGAGAATTGAGAAAGCCTTTGTTGGACTGGATGTTGTCTTGAATTACGG
-TGTGCACAAGGGTCTCGGAGAGGATGGTGTCGTTATGAAGATCCGTCGAT
-TCCACACGTCAGCTAAGGAGACATGTTTTGAAGTTGAGAAGTCAACTCGT
-GAATTCACGAACGTCTTTGACTACTTCAAAAAGAAGTATGGAATCACTTT
-GAAGTATCCCGATTTATTCACCATTGAAGCGAAAGGGAAACAAGGAAAAA
-TTCATTTCCCTGCGGAAGTTCTCCTTCTCTGTCCGAACCAGACGGTCACG
-AATGATCAAATGATCAACAATGAGCAGGCGGACATGATTAAGGTAATTTT
-ATATTTTAAAATCTGAATAATATCCCGAATCCTTTTTCAGATGTCAGCCG
-CACAACCACATATCAGAAAGACGACAACTGATACTATCGTGAGAAACGTC
-GGATTGGCTTCCAACAATATCTATGGCTTCATCAAAGTTGAAGACCCAGT
-CAACCTTGAAGGAATGGTTCTTCCAAAACCTAAGATTGCGTTTGCCGGTA
-ACCGACTCGCTGATTTGGCAAATCCGAAGTCTAGATTCCCCACCGACTTC
-AATCGTGCTGGACAATATTACGATGCCAAGGAATTGACGAAATGGGAACT
-GGTCTTTGTTCAAAACGAAGAAGTCCAGTAAGTTTCAGTTTGTAATTTTT
-CATTTTATTGACTCAATTTCAGAGGACTTGCTAAGCAGCTCGCCGATGAA
-ATGGTGAATAATGGTATGAAATGCAGCAACCCAACGATGAGTTTCATCAT
-TAGAGGTGATTTGGAACCAATCTTCAAGAAAGCGAAGGCTGCTGGAACGC
-AACTTCTCTTCTTCGTTGTCAAATCTCGTTACAACTATCATCAGCAAATC
-AAGGCGTTGGAGCAAAAGTATGACGTGCTCACTCAGGAGATTCGCGCTGA
-AACCGCCGAGAAAGTCTTCCGTCAACCACAAACTCGTCTTAACATTATCA
-ATAAGACGAACATGAAACTCGGAGGACTGAACTATGCTATTGGGAGTGAA
-GCGTTCAACAAGCCAAATAGATTGATCGTTGGATTTGTTACTTCTCAACG
-AGTTGGTGGAAATCCAGATGTGAGTCATGTGTTACAGCTGCATAATCATA
-TTTCATTTTTTCCAGTATCCAATATCAGTTGGATTTGCTGCAAATATGCT
-CAAGCATCATCAAAAGTTTGCTGGTGGATACGTGTATGTTCATCGCGATA
-GGGATGTTTTCGGATCCATCATCAAGGATACTCTCTTGACAATCTTCAAA
-ACATGCACTGAGCAGCGCGGAAGACCAGATGATATCCTTTTGTATTTCAA
-TGGAGTTTCCGAAGGTCAATTCTCAATGATCAACGAGGAATTCAGTGCCC
-GAGTGAAGGAGGCGTGCATGGCATTCCAAAAGGAGGGAACCCCGCCATTC
-AGACCACACATCACCATCATCGCCTCATCAAAGGCTCACAACGAGCGTCT
-GTACAAATCCGACAAGGGACGTATTGTTAATTTGGAGCCGGGTACGGTCG
-TGGACCATACCATTGTGAGCAATGTCTACACTGAGTGGTATCATGCCTCA
-GCTGTTGCTCGCCAAGGAACTGCAAAGGCTACCAAGTTCACTCTCATCTT
-CACCACTAAAGCAGGCCCACAAGCTGAGCCATTGTGGCATCTCGAGCAAT
-TGACCAATGATCTTTGCTACGATCATCAGATTGTCTTCCATCCGGTCGGA
-CTTCCCGTCCCACTGTACATTGCTGATCGTTACAGTCAACGTGGAGCAAT
-GGTTCTTGCCGCCAATCAAGGGTAAGTGACAGTAAAATGTATACGACATC
-TCATTTATTATTTTCAGTCCAATCTACAATGAAGGACAAATCGATCTCGC
-GGCTACCAACAGTGCATATGGCTACGGAGAGAAGAAGCTCTTCACCACTC
-GTTTCAATGCATAATTATCTGTACTCCTCCGTTTCTTTTACTTGGCTGTA
-TAATGTTTTATTTCCGTCAACCCAGAATACTTTCGCTATGATTGTATATT
-TTTTAGCATTTGGTCATTGTAATTTGTAATTATTGTCGGAATGGATAAAA
-TGATTTAAGAATCAAATGCATCGCTTCTTGGACAATTCCTGTTGATAATC
-TCATTCTGATATTTTCAAAAGTTGTGGTATTGATTTTAAAAATTAAAATA
-TTTGCAGCTGCCGCTGTGACTGGAGAAGTTGATGTTTTATTTCTTCCAAT
-TCAGCTGTTTGTACCTGTTTTGTAATGTTATTACTTTCTTTCGAACAAAA
-TGTCATTCTTTTTCTGGCAGAAAATTCCGCTTTTTAAAAATTATTTTTAC
-AACATTACAGATGGATCCTTCTGTTGTGTCTCGATTGGAGAATGTTGCGA
-ATCGAATGGAGAATATATTGCTGAAATATGACTCGAACAAAAAAGGCAAT
-TAAATAATTGTTCTCGAAATTATAAATTTCAAAAAAATCGCTTTTTAGAA
-ACTCCGGTCGGCGCGACGCCTCAAATCATTAATCTTTATGACGATGCGAT
-CTGTGAGAATCTCGTCTCGTTTTATGATTTATCTGCAAAAATTGGAGGAG
-ATTTGAATCGCCTTGGATGCATGGTAAGGAAATATATAATATTTAATTCA
-AATTTTATCGAAAATTATGTTTCAGACTAAGAATCTATTTTTCACGCTTT
-TTTCGATGTTTTTTGTGGATTGCGTGTGGGCGCAAAAAAGCGGACAACGA
-CGAGTTCGCGACTCTTGTGAACGATTTGACGACGGAAATTGTTGCATTTT
-CCGATTTCAAGGAGAAAAATCGAAAATCCGAATTCTATAATCATATTTGT
-GGACTTGAAGCTGCGGTTGGAGGTGAAAATTTGCCCCTGATTCCGAATAT
-CTATGTGAAAAACTCTTCATTATTTTATATATTTCAGCTTGAAATCGCTT
-GTTCATCCATTACTTTTTTCAAGCACACGCCATATTCTCATTGGAGCGCG
-CCGTGTTGTGTCGATTTACGAAATTTTCCAATTTTTTCAATTTCAGTTTT
-TAAACGAGTTTTTATTTTTGTGGGCTTTATTTTTGTGGGTTTTGCTTTTT
-GGGTTAAAAAAAATCTTAAAAACAATCATAATTCTCAGGAAACTCAAATT
-TTTCGCCGAAAAACCTATTTTGCGCGTGAAATCTGGTGTATTTTACCGTG
-CCTAGACTATGTGTGAGAACACTGCCGGTCATACATCATATTTGACGCGC
-AAACTGCAAAAATCGTCGGAATTATTTCGGGAACACAAAATTCTGAAAAT
-GCGTATCGCGCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTA
-CAGTAATTATGTAAATGACTACTGTAGCGCTTGTGTGTCGATTTAAGGGC
-TCAATTTTCAAAAAATCGAGATCCCGTAAATCGACACAAGTGCTATAGTT
-GTTATTTGAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCA
-AATATGTTGTGCAATGCGCATTTTCAGAATTTTGTGTAAAAATTTTTGTG
-TTTAGTGATTTTTGCAGTTTGCGCGTCAAATATGATGTATGACCGGCAGT
-GTTTGCCCACATCGCCTAAGCACGGTAAAATACACCAGATTTTTCGCGCA
-AAATGGGATTTTCGGCGAAAAATTCGAATTTCCTGAGAATTTTGGTCGTT
-TTTACTATTTTTTAATGCAAAAAATGAAAATTTTTAAATTTTCTGAAATT
-CACCGTCGTTTTTCACGAAATAAAAAAATTTCAAAAAATTGAAAATTCCG
-CCACATCACATTTGACGCTCAACTTTTTTTAAATGAACAAAATCCGGATT
-TTTCTGGGAAATTTGAGATTTATTTAGGTCTCGCAGCGAAAAAAAAATTA
-GAGTTTGCGCGTCAAATATGATGTATGACCGGCAGTGTTTGCACACACAT
-AGCCTAGACACGATAAAATACATCAGATTTTACGCGCAAACTGGCAAAAA
-AATTGATTTTTTGGCTTTTTCGGACTAAACATTAGAAAAAAAGACTATAC
-TCCAACAATTTTTTTCAGTTTTTTTTTGAAAAATTCCATATTTTCTGAAG
-TTCAAATAAATATATATTTTTTTAAAGTTCAAAAAATTCAAATTAGCGCG
-TTAAAAACGACGTATTCAGGCATCACATTTGACGCGCAATTTTTTTTTTA
-AAGAAGGATTTGCGCGTCAAATCTGGCGAATTAGGTTTGTCGGCGGAATA
-CACCGAATTTCACGCGCAAAATTTCAAACCTCAATGATAAAATCGGAGAG
-CGTATTCGAGGAAATTACGTCTTTCAACGTCTCCGCCGGAACCACGACAG
-CGAACAAGTTTTGTGTTGACTGAAAAAAAAATTAAATTTTTCGACAAAAA
-AAATTAAATTTTTCAACGAAAAAAAATTAAATTTTTCAACGAAAAAAATT
-AAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAAT
-TTTTCAACAAAAAAAAATTTAATTTTTCAACAAAAAAAAATTAAATTTTT
-CAACGAAAAAAAATTAAATTTTTCAACGAAAAAAATTAAATTTTTCAACA
-AAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAA
-AAAATTTAATTTTTCAACAAAAAAAAATTAAATTTTCCAACAAAAAAAAA
-TTAAATTTTTCAACAAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAA
-ATTTTTCAACAAAAAAAATTAAATTTTTCAACAAAAAAAAATTAAAATTT
-TCAACGAAAAAAAAATAAATTTTTCATCAAAAAAAAATTCAAATTTCCGC
-GGAAAGTGCAAAAAATTTACAGAATATTCAAATCGTTCACTTCTCCCGCT
-ATCATCTTCACGCAATTCGACACATTTTCGTCGCCATTCGATGCGGGTTC
-CCAGTGATGTATCGATTTTCAGTTGATTATCGATTTTTCGCTCCACGTAC
-AGTACACTGAGTTCCGCTTCGAGGCCATCTGAAATTTTTTTTTTAATTTT
-TTTAACGATTTTTTTTTCAGAAAATCAATAAATCTATTCAGCTGTTTTTT
-TTTAACTTTTACACAATTTTCCGTTTGAAAATGTCAAAAAAATGTGTTTT
-TGAGCCACATTTTATTCAAAAAATTTTGAAAAATTCCCTGCATTTTCGCT
-GTGGGACCCAAGAAGTGCGTGTGCCTTTAAGAATATTTCAATTTTTTTAA
-AACTTAAAACAAAGATTTAAAAAATTCTGCTTTCTAAAAATAAATAATTA
-TTTATTTTTTTGTGTATTTGTTTGGAAAAAATCAATATTTATCGATTTTT
-GTGAATTTTTTTGAAAAAAATCAATATTTATCGATTTTTGTGAAATTTTT
-TGGGAAAAATCAATTATTATCGATTTGTGTGAATTTTTAAGAAAAAAATC
-AATAATTATCGATTTTTTGTGATTTTTTCGCAAAAAAATCAATAATAATC
-GATTTTTGTAAATTTTTTAATCGAAATTCGGCTTTTTCCGGTAAAAACAT
-CAAAATTTCGCAAAATTAATCTGATTTTTTCTGCGAAAAATTTAAATTTC
-TCATAAAACTTTCGAAAAATCGAATATTTTAAAAATCAATAATTTCGATT
-TTTGGTTAATTTTTTTGGAAAAAATCAATAATTATCGACTTTTTGCGATT
-TTTTTTTTGAAAAAAATCAATAATTATCGTTTTTTTTTAATTTATTGGAA
-AAAATCAATAATTATCGAATTTCAGTGAAATTTTTGGAAAAATCAATAAT
-AATCGTTTTTGTGTGATTTTTTTCGGAAAAAATTAAAAATTATCGTTTTT
-TGTGAATTTTTTGAAAAAATTAATAATTATCGACTTTTTTTGAATTTTTT
-TTTGGAAAAAATCAATAATCATCGATTTTTTTGTGAATTTCTTGGAAAAA
-AATCAATAATTATCGATTTTTCCGATTTTTTCCAAAAAAATCGATAAATC
-AATAAATTTTCCTTACGCCACGTGTCAATTACAGTCTTCCCCACGTGGCA
-AAACGTGTAGAGCTCGCATTTCGAATTGGTTGCCGCCGAAATTTCGCGTT
-CGATTTTTCGAGTTTCCTTGTCTTTCTGAAATTTTTTTTTTCTAAATTTT
-CTGAAAAATGTTCTTCTGTAAAACCTCTTTTTCCTCTCTTCTCCGCGCCA
-TTTCGCTCTTTTTTTTATCCTTTTCCAGCGTTTTTCTCTCTTTTTCAGCT
-TCCCGAGCTCGTTTCGCATTTTCTCGGAGTTCCTGAATAAGTTTTAAATT
-TTTAAGGGGAAATTTGCTATTTGGAGAGTAAATATTTTCGCTGTGAGACC
-CGTGGACCTGAAAATTTTGATTTTCCGCTTAAAATCAACTGAATTTCGCT
-TAATTGTGATGTTTTAAGCTGAAAAAGCTGAATTTTGATTTTAAAAAATT
-GAAAAAAATTAATATTTTTAAAGGCGCATTTATTGATTTTTTTTCCAAAA
-AAAATTTACAAAAAAATTGATAATTATTGATTTTTTCCAAAAAAATTAAC
-AAAAATCGATAATTTTTTTTCCAAAAAATTCACTGAAAAATCGATGATTA
-TTGATTTTTCCAAAAAAAATTCACTGAAAAATCGATAATTATTGATTTTT
-CCAAAAAAAAAAATCACAAAAGTCGATAATTACTGATTTTTTCCAAGAAA
-ATTTTAAAAAAAAACGACAATTATTGATTTTTTCCGAAAAAATTACAAAA
-AAATCGACAAGTACTGATTTTTTCTGAAAAAATTACAAAAAATCGATAAT
-TATTGATATTTTACAAAAAATCGATAATTATTGATTTTTTACAAAAAATT
-CACAAAAAAATCGATAATTTTTAATTTTTTTCAAAAAAAAAATCACAAAA
-AATCGATAATTATTGATTTTTACCAAAAAAAATCACAAAAATCGATAAAT
-ATTGATTTTTTCCAAAAAAATTAACAAAAATCGATAATTATTGATTTTCC
-CAGAAAAAATTCACTGAAAAATCGATAATTATTGATTTTTTCCGAAAAAA
-TTCACAAAAAAATTGATAATTTTTTAATTTAAAAAAAAATCACAAAAAAT
-CGATAATTATTGATATTTTACAAAAAAAAATTACAAAAAATCGATAATTA
-TTGATTTTTTACAAAAAATTCACAAAAAATCGATAATTTTTAATTTTTTT
-CAAAAAAAAAATCACAAAAATCGATAATTATTGATTTTTTCCAAAAAAAA
-TCACAAAAATCGATAATTATTGATTTTTAGGCGGAAAAGCCGAATTTTTA
-TCAATTTTTCAAAAAAACAATCGATAGTTTTAAAGGCGCATGCGCTCTCC
-TGGGTCTCACAGCGAAAAGTGGATTTTTCAAATTTTTTGGATAAAATTTC
-GCTGAAAAACGTATTTTTTTGACAGTTTTAAAGGGAAAATTGTCTAAAAT
-CAAAAAAAAATTGTTTTTTCAACAATTTTTTCAGTTTTCGTAAAAATTTC
-AGTTTTTTTTTCGCGAGAAAAAAACCAATTCTCGATTGAAAAATCAGAAA
-AAATATTTTGGTATAAAAATATTTTTGGTATTACGATATTTTGGGTCCCA
-CCTCGAAAATTTAGAGGATTTTTCAAATTTTTAAGATTTTCTTCAACTTT
-TAACAATTTTTTTCGGAATAAAAATCGATTTTCGCTGCGAGACCCAAAAA
-AAATAGATTTTCTCGAATTTTGCGATGGAACTTTTGATTTTTCGGTGAAA
-TTTTCCAAAAAAATCGCAAAATGTATCAAAAAATCAATACTTTCTGCGTC
-TCCTTCTCATCGTCGGTTAGTTTCCGTTTTTCGGGTCTCGCCACGACATT
-TATGTCAGTATTCTCTTGTGAGCTTGAGCACAACGAGTATGAGCTCGTCT
-GATTCTGACGGATCATTTCGTCAAGATTGAGCATTCCCTCATCCAGCCAT
-GTTTTTGCCGCAGCTGGAATTGCATCCTTATTCACTGCGTCGACGATGGA
-AAAGCTCGCGGAGTACCTGGAAATTATCGATTTTTTATTGATTTTTTATC
-GGTTTTTATCGATTTTTTTGATGGGGAAAAATCGGAAAAATCGATAAATT
-TCGATTGGAAAATTCAAAAAACTTCGGGTCTCACAACGAAAATTGATTTT
-TTTTCTTGGATTTTCAAATTTTTAAACTTTTGTTGTAACAACAGTGGAAA
-TTTTTCGAAAAAAAATCAATAATTATCGATTTTTTGAAAAAAGGCAATAA
-TTTTCGATTTTTTGAAAAAAAAAATCAATAATTATCGATTTTTTGTGAAT
-TTTTGAAAAAAATCAATAATTTTCGATTTTTTGTGATTTTTTTTCGAAAA
-AATCAAAAATTATCGATTTTTTGTGGATTTTTTGAAAAAAATCAATAATT
-ATCGATTTTTTGTGGATTTTTTGTAAAAAATCAATAGTTTTCGATTTTTT
-TTGGAAAAAATCAATAATTATCGATTTTTTGTGGATTTTTTGAAAAAAAT
-CAATAATTATCGATTTTTTTTTGAATTTTTTGAAAAAAATCAATAATTTT
-CGATTTTTTGTGATTTTTTTTCGGAAAAATCAAAAATTATCGATTTTTTG
-TGAATTTTTTTTTGGAAAAATCAATAATTATCGATTTTTGTGATTTTTTG
-TAAAATATCAATAATTATCGATTTTTTGTGATTTTTTTCGGAAAAATCAA
-AAATTATCAATTTTTTGTGATTTTTTTTTTGGAAAAATCAATAATTATCG
-ATTTTTGTGATTTTTTTTGGAAAAAATCAATAATTATCGATTTTTGTGAA
-TTTTTTGTAAAATATCAATAATTATCGATTTTTTTGTAATTTTTTCGGAA
-AAAATCAATAATTTTCGATTTTTTGTGAATTGATTTTTTTTGGATTTTCA
-AAATTTTAAACTTTTAAAATAAATTTTTCCATAGTTTTTTGTTGAAAAAT
-TCCTGAAATTTTGAAATTCAATTAATTTTTTCTTTAAAAAAATCGTTGAA
-AAATTAGTTTTTTGGAAAAAAAATCAGCGAAAATAGATTTCGCTGTGAGA
-CCCAATTGGGCTCCTCAAAGTCCCTGCGCCTTTAAAATATCGTTTTTTTT
-TTGTTAAATTTTCCCGCGAAATTAATCAGATTTTTTCTGCGAAAAAGTGA
-AATTTCTCAAAGAAACTTTTGAAAAATCAATTTTTTTAAAAAGAAAACCC
-CTAATTTTTCCGTTTTTCCCGCTAAAAAAACATCTAAAAAATTTGAAAAA
-TCCACAGAATTATCGCTGTGGGACCCAAAGTGCATGCGCCTTTAAGATTA
-TCGATTTTTTTCAAATTTTTCAATCGAAATCAGGTTTTTTTTTTCAGCAA
-AAATCATAATTTTGCGAAATTAATCTGATTTTTTGTGCAAAAAATTCAAA
-TTTCTCTTTTTTTACGTTTTTTCGCCAAAAAAACCATCTAAAAAATTCGA
-AAAATCCAGAGCATTTTCGCTGTGAGACCCAAGTCCGTGTGGCTTTAAAA
-ATATCGATTTTTTGTTAAATTTTCCAATCGAAATTTGGCTTTTTTTCCGG
-TAAAAAATCATAATTTTGCGAAATTAGTCTGATTTTTTGTGCGAAAAAGC
-GAAATTTCTCATAAAACTTTTGAAAAATTGATTTTTTTTTTCTGGAAAAA
-CCTATTTTTGTCGTTTTTTCGCTAAAAAACATCTAAAAAATTCGAAAAAT
-CCCCAAAATTTTCGCTGTGAGACCCAAGGCTCCTGAAAGTCCCTGCGCCT
-TTAAAAATATCGATTTTTTGTTAAATTTTTAATCGAAATTCGGCTTTTTC
-CGGTAAAAACATCAAAATTTCGCAAAATTAATCTGATTTTTTCTGCGAAA
-AATTCAAATTTCTCATAAAACTTTCGAAAAATCGATTATTTTCCGCTAAA
-AAATCATCTAAAAACTCGAAAAATCCAGACAACTTTCGCTGCGAGACCCA
-AGTCCATGCGCCTTTAAAAATATCGATTTTCTGTGAAATTTCTCACAATT
-TCTCCAAATTTCCCGCCGTCACATTCGTCGTTTCCTCAATCATAATACAG
-TCCTCATCATCATCATCATCCGAGAGGACTACAATCGCCTCGTCCATCTG
-AATAGTGGGAAAATATCGATTTTTTGTAGAAAATCATATATTTAAATTGA
-TTTTTTTACAATAAAAAAAATTTTGGGGATTTTTTTGGAAATTTCGGGTA
-AATCGTGTAAATCGTGTAATTTAAATTCATTTTTGTTTCAAAAAGTCAGG
-GGGGGGGGGGGAAAGAAAAAATTTTTGACAAAGCGTGGAGCGAAAAAAGG
-AGTAAATATACAGTCGCGAAAGAACGATCGCTCCGCCAATTTTGCATGCG
-GCAAAGGGGCGTGGTTTATTGGGGGCGGGATTCCGGCGCAACCCTGCGGC
-ACGCTTTTTTCTCGCTTTTTTCGTGCGGTAATTTTCAGTTATTTTTATTC
-GTTTTCTGTTCGAAATTTCACGATTTCGCTCGATTTTGTTCGTTTTTTCG
-GATAAAAAAGTGTCCAACTATTTTTTAAATGAAAAATAACCAAGTTTTCA
-CAGATTTTACCCGAAAAATGCTTTGTTGGTCTCTCTTTCTGTAAATTACG
-ATTGTTAAGAGAGAAAATGGGGGAAAAAAAGGAAAATGTGAAGAGAAAGC
-GTTTTTTTAACGTTTTGCTTCGTATATTACAGAAAAAGAGACAAACGAAG
-CATTTTTTCAAGTAAAAACTGATAAAACTTGGTTATTTTTCATTTAAAAA
-TAGACACTTTTTTATCCGAAAAAACGAACAAAATCGAGCGAAATCGTGAA
-ATTTCGAACAGAAAACGAATAAAAATAACTGAAAATTACCGCATGAAAAA
-AGCGAGAAAAAAGCGTGCCGCAGGGTTGCGCCGGAATCCCGCCCCCAATA
-AACCACGCCCCTTTGCCGCATGCAAAATTGGCGGAGCGATCGTTCTGTCG
-CGACAGTATGTAACATGTAAGGTAACAAGGTGGGTTGGTTTTCATGAGAA
-AAGGGGGATTTTTTTCCGATTTTTCAGGTGCAGAGCCCACGCTCTCCTCA
-AAGCCGAATAATTATTAGAGCGCGCTTGCAGCGACTCGCGTTTCTGCATC
-CGCGGTATTTTGACTTTCCACTGAAGAAAGCAGATATTTCAGATTTATCG
-AATTTTTAGGTTTAAAATTTTTTTTTTCTGTATTTTTCGAACAAACCTTT
-TGTCAAACAGTAAAAATCGAAATTAAAATGACTAAAATGAACTTTTTTTG
-TCCACTGGTTGTGAAATGGTTTGAATTTGAAGAAATCAACGGGGTTTTTC
-GTATTTTCTGAATATTGTTCTATTAAAAATTGGTTTTAATACATTTTTGA
-CTTAACATTAGGGTCAAAAAATGGTTTAAAACCGATTTTTAATAGAAAAA
-TATTCAGAAAATACGAAAAATCCCGCTGATTTCTTCAAATTCGAACCATT
-TCGCAACCAGTGGACGAAAAAAGTTCATTTTAGTCATTTTAATTTCGATT
-TTTACTGTTTAACAAAAGGTTTGTTCGAAAAAAACAGAAAAAAAAATTTA
-AAAGCTAAAAATTCGATAAATCTAAAAAAGCTGCTCATTTCAGTGGAAAG
-GCAAAATACCGCGGATGCAGAAACGCGAGACGCTGCAAGCGCGCTCTAAT
-AATTATTCGGCTTTGAGGAGAGCGTGGTGCAGAGCCCCAATTTTAAACAA
-AAAATAGCGGAAAAAAATATTTAAAAAAACGAGGATTAAATAAAAATTAA
-ATAATGTCAGCAATGTTCATTGGCATCTCGTCGATTTGTGTCGAGTAGTA
-CTGCTCAATGTCGCGGAGAATTCGTACGTCGTCCTGTTTGACGAAATTGA
-TGGCGACTCCCTTGCGGCCGAAACGTCCCGAACGGCCGATACGATGGATG
-TAGAGCTCACGGTTGTTCGGCAAATCGTAGTTGATTACCTGGAAAATTTT
-TTGATGAAAAGCTGATTTTTGCGATTTTCGCCATTTTTTGACCTAAAAAA
-TTGGCGAAATTCGGAATTTTTAAACAAATTTTGACGTAAAGTAGGTTAAA
-ATTCCAAAATTTTACGGTAAATAGCCTGAAATGCTTTAAATTGATCCTTT
-TTTGCACAATTTTAACAATGAAAACCTGTATTTTTCGCTACTTTTAGTTG
-AAAAAAGCTTCCAAAACGAGTAAAATTGGCAAATTTTATCGATTTTCGCA
-AATTTTTCACCTAAAAATTGAAGAAATCGGTATTTTTAAACAAATTTTGG
-CATAAAGTAGGTTAAAATACCAAAATTTTACGGTTTTTAGCAATTTTTGA
-GTCAATTTTCAAAATGTTCCAGTATTTTTGCAACTATTTGGTTTTTATTC
-ATCTATGTTCTTTGAAAATTCTTTTTTTTAAGGTGAATTAGGTTAGAAAG
-GGGTCGATTTTGCAGAATTTTGACAGATTTCGCATGAAAATTTGAATTTT
-CAGGCGAAAATCATCAAAAATATGATTTTTTGCTACTTTTAGTTGAAAAA
-AGTGTACAAAACGAGTAAAATTGACAAATTTTTATCGATTTTCGCCATTT
-TTTCACCTAAAATTTAATTTTTTTTTTCTAGTGAAATAAGTTAAATTCAG
-TGTTAAAATGTATCTATTTTCGCTCAAAATTTGAAAATTTTCAATTTTTC
-ACTGAAATCCATGAGAAACCAGTGAAAAAATTTTTTCAATTTGAAAATTT
-GCAGTGAATTTTATTTTTTCTGCTAATTTTTCGGTGAAAAATGCACTTTT
-TCACGAGAATTAGCGGGATTTTTGTATTTTCAAAGTTTTTAGGTCAATTT
-TCAAAATGTTTCTCGCTGAAAATTGATTTTTTGTCAATTTTTCACATATT
-TTCTATGAAAAATTCCACCTTTTTGCAGAATTTTGACTAAGAAATACGAT
-TGTCGCCTAAAAGTTTGAATTTTTCAATTTTTTTTTGCTGAAAATCATCA
-AAAATACGATTTTCAACAGAAAATGATGAAATTTTCGCTATTTTTCGCGG
-AAAATCATTGATAACCTGATTTTTTCGCTACTTTTAGTTGAAAATAGTTT
-ACAAAACGAGTGAAATTGGCAAATTTTATCGATTTTCGCAAGTTTTTAAC
-CTAAAATTTAGTTTTTTTCTAGTAAAGTAGGGAAATTCAGTGAGATTTTT
-TAATTTTTCACTGAAATCCATGAGAAATTAGTGAAAAAAAAATGTTTTTG
-GCCAACTTTTCACATATTTGATATGAAAAATGCCGTTCTGAACAAAAAAA
-GCTGTGGAAATTCAACTTATTGTCAATTTTCCGCTGAAAAATTCATTTTT
-TTTTCTCAAGAATTCGCATTAAAACTGCGGAATTTCTTGTATTTTCAGCA
-GAAAATGATGAAATTTTCGCTATTCTTCGCGGAAAATCATTGAAAACCTG
-ATTTTTTCGCTACTTATAGTTTAAAATAGTTTACAAAACGAGTGAAATTG
-GCAAATTTTATCGATTTTCGCAAGTTTTTAACCTAAAATTTAGTTTTTTT
-TTCTAGTAAAGTAGGGAAATTCAGTGTCAAAATTTACTTATTGGGTAAAT
-GGAAATTGTGAATTTCCATTGTAAAAATTTCTGCTGGGAAATTCATTTTT
-CCCAAATTTTTCATATAATTAGGCTGAAAAATGCAATTTTTCACAAGAAT
-TCGCATTAAAACAGCGGGATTTTTTTTGTATTTTCAACGGAAAATGCTAT
-TTTTTGCGGAAAATCACTGCAACTTTTTCCTCACGAGGGCCAAGGAAAAG
-TGGTTTCTAGGCCATGGCCGAGGGGCCGACAAGTTTCAGCGGCCATTTAT
-CTTGCTTTGTTTTTCGCCTGTTTTCTTTCGTTTTTCACAGCTTTTTCCCG
-TTTTTTCTTATTAAAACTGATAAATAAATATTTTTTGCAGATGCTAAAAC
-AATTTCCAAGTAAAAAAAATTATGTATTCAGTCGGCAAGCAGCGGTGAAA
-GTGGGCAATGTAAAATGATGGATTACGGGAATACAAAACCTGAAATTTTT
-CTGAAACATGATACATATGCTGCTTAGATGCTGATACTACCTGATTTTCA
-TAACGAGACCGCTGAAAAGTTTTGAGGTTTCCACAATTCAACTTTTTTGG
-TGAAAAAATCGAGATTTTCGCACAAAAAGTTGAATTTTGAAAACCTCAAA
-ACTTTTTCAGCGGTCTTGATATGAAAATCAGGTAATTTCAGCATCGAAGC
-ATCATATGTATCATGTTTCAGAAAAAGTTTAGGTTTTGTATTCCCGTAAT
-CCATCATATTGCATTGACCACTTTCACCGCTGCTTGCCGACTGAATACAT
-AATTTTTTTACTTGGAAATTGTTTTAGCATCTGCAAAAAATATTTATTTA
-TCAGTTTTAATGAGAAAAAACGGGAAAAAGCTGTGAAAAACGAAAGAAAA
-CAGGCGGAAAACAAAGCAAGATAAATGGCCGCTGAAACTTGTCGGCCCCT
-CGGCCATGGCCTAGAAACCACTTTTCCTCGTCCCTTGTGAGGAAAAAGTT
-GCAGTGGGAAAATGCTATTTTTCGCGGAAAATCGAAAATGTACCAAGGAC
-ACTTGCGGAACATCAAGTCCTCTCGCCCAAACATCAGTAGAAATGAGGAC
-ACGAGTGGTTCCAGCTCTAAACTCCTTCATAACCTCATCACGATCCTTCT
-GCTCCATATCTCCATGCATCGATGAGACGGTAAAGTTGGCCTCCTTCATC
-TTATCAGTCAACCAGTCCACCTTTCTACGTGTATTACAGAACAACACCGC
-CTGAGTGATGGTTAAGGTGTCGTAGAGATCGATAAGCGTGTCGAACTTCC
-ACTCCTCCCGATCAACTGCGACGAAGAACTGCTTGATGCCTTCCAGTGTC
-AACTCGTCACGCTTCACAAGGATCCGAATCGGATCCGTCATGAATTTACT
-CGTCATCTCCAGAATCTCATGAGGAAGCGTCGCGGAGAGCAGCACCACCT
-GGGCTCCGGGCGGTAGATAGCGATAGATATCGTAAAGCTGCTCCTTGAAC
-CCCTTGTTGAGCATCTCGTCGGCTTCATCGAGCACGAGAAGCTTGATGGC
-GCGGGTGCGCAGGTTTCGACGGCGAATCATGTCGAAAACGCGTCCCGGAG
-TACCGGAAACCACGTGCTGGCCGTAGTCGAGCTTTCGGATGTCCTCGCCG
-AGATTGGTGCCTCCGATACAGGCGTGGCACTGGACATTCATATAGTCGCC
-GAGCGCCAGCACGACTTTTTGAATTTGAACTGCCAGCTCTCGTGTCGGCG
-AGAGAATCAGAGCTTGGGTCTCGCGGACCTGGGTGTCTAGCGATTGGAGT
-ACGGAGATCGAGAATGTCGCCGTTTTTCCTGTTCCGGATTGAGCTTGAGC
-GATGACGTCACGAGCCTTGAGAATTGCGGGGATGGCGCGTTGCTGGATGG
-CAGATGGCTTTTCGAAGCCGTACGCGTAGATTCCACGAAGCAAGTCTTCT
-CTGGAAATCGAAAAAAATTTTGAATTTAGTTTTATATTTAAAGGTGGTGT
-AGTCGAATTATTTATTTCTTTATTAGACTCAAAATTGTCTGAAAAAAAAG
-TGTACAAAACGAGTAAAATTGGCGACTTTTATCAATTTTCGCCATTTTTC
-ATCTAAAAAAATCGACGAAATTCGGAATTTTAAACAAATTTTGACGTAAA
-GTAGGTTAAAATTCCAAAATTTTACGGTTTTTAACAATTTTTCCACCTTA
-AAGTTGGTGTAGTCGAATTATTTTTTTCTTTATTAGACTCAAAATTGTCT
-GAAAACACCGAATTTCATAATGAAACTTCTTGAAAACTGAAAACTTTTCA
-AAAAAAAGTTAAGGCCTCTTGAAAAAAGGCCTAAAATTAGTGAAAATTTG
-AAATTTGACCAACTTGTCTGTCAAGCGGCTGGAAACAATTTTCTTTGAAA
-TTGTCGTCTAATTTTGGGTATACAGGTCGATTACCTTGCGTTTTCAGCTT
-TATTTAGGTATTTAAAAGTCGATGGACGAAGAGATTTGTCAAATTTTTTT
-CACCAACTATCTTCGTCCATCGACTTTTAATACCTTAATAAAGCTGAAAA
-CGCAAGATACGACCTGTATACCCAAAATTAGACGACAATTTCAAAAAAAA
-TTGTTTCCAGCCGCTTGACAGACAAGTTGGTCAAATTTCAAATTTTCACT
-AATTATAGGCCATTTTTCGAGCCGCCATAACTTTTTTTTGAAAATTTTTC
-AAGAAGTTTCATTATGAAATTCGGTGTTTTCAGACAATTTTGAGTCTAAA
-AAAGCAATAAAAAAAATTCGACTACACCAACTTTAAGGTGGAAAATTTTT
-TAAAAACCGTAAAATTCTGGAATTTTAACCTACTTTACGTCAAAATTTGT
-TTAAAATTCCGAATTTCGTCAATATTTTAGATGAAAAAATGGCGAAAATC
-GATAAAATTTGCCAATTTTACTCGTTTTGTACACTTTTTTCAACTAAAAG
-TAGCGAAAAATCATGTTTTTGATGATTTTCAGCTGAAAATTCAAATTTCA
-GGCAAAATTCTGCAAAAAAAGGGTAATTTTTCAGAGAAAATATGGGAAGA
-ATTGAAAAAAAAAACTGTTTTCAGCAAGAAAAATGTTTGAAAATTTACCT
-TTAAATTTTTAAAAACCGTAAAATTTTGGAATTTTAACCTACTTTACGTC
-AAAATTTGTTTAAAATTCCGAATTCCGTCGATTTTTTTAGATGGAAAAAT
-GGCGAAAATCGATAAAAGTCGCCAATTTTACTCGTTTTGTACACTTTTTT
-CAACTAAAAGTAGCAAAAAAATAATGTTTTGAGGCGAAAATTTGTTTTCA
-GCGACAAAATTCTGCAGAAAAAGTTCAATTTGAAGCTTTTCTGGTTATTT
-ATAGAGAATTTTCCGTTAAAATCGATAATTCAATACCTCAAGCCCATTTT
-GTCAAAAGTTGGGATAATTGAGACCTCCTCAGACGACTCGAACTCCACAG
-TCGCCATATCGTCGTTTTTCTTTTTATTTTCCGCCATTTTTGAAGGAAGA
-ACTCTGTAAAATCGATAAAAATGAATATTTTCGAGCATTTTTGCAGAGAA
-ATTCAGCATTTTTAGGTGGAAATTATCAAAATCAATGAATTTACATCGAA
-AAAATCAAGAAAAACGTGTAAAAACGATAAAATTGATTATTTTCGGGCAT
-TTTGCAGAGAAATTCAAGATTTTTAGGAGGAAATTAACAAAATAAGTGAA
-TTTACATCGAAAAAATTAAGAAAAACCTGTAAAATCGATAAAAAACTAGT
-AAAAGAGCAAGATTTCGAATGTTTTCGAAAATACCCTGTTTTTCGAGCAT
-TTTTGCAGAGAAATTCAGCATTTTCAGGTGGAAATTTACAAAATAAACGA
-ATTTACATCGAAAAAATCAAGAAAAATGGTGATTTATCGGCTATTTTCGC
-TCATAATTCGTAGGATTCGATTCGAAACTAAAATTCGAAATTCGAAAAAC
-ATGGCCGTGGCCTAGCGTTCCCCTCCTAGTCCACGGCCGCGCACGATTTA
-CGGAGAGCACGATTATTGATCGATGACACATGGTTTCCGACTGTTTTTCC
-TGTTAAATTTACCCTTAAATCACAATTTTCCATAGAAAATGGGTGGAATT
-TTCTCGAAAAAAGAGAAATCACCAAAATCGGCGCCGGTTTCCGATCAGGA
-TAATGCGATTTTGGTTTGTTTAATGAGGTTTTTCACATGGAAATTATTAT
-TTTTTTGGTAATTCCAGGCGCTCAAAACACAACGGGACAAAATGAAGCAA
-ATGATCAAGCGAAAAGAGAATTGTTTGGAGAAGGAACGACAATTGGCAAA
-GCAGCTTATAAAGGATGGCCGGAAAGAGTAAGAAATTTCAGAAAATTCAG
-TTTTTTTTATTAAAAAAAAAAAATATATATATAAATTTTTAACTAATTTC
-AGCCGTGCTTTACTGCTTCTGAAGAAGAAACGCTACCAAGAGAAGATTAT
-CGATCAAACCTTGAACCATCTTAGCAAAATCGAGCAAATGGTATTGAAAA
-ATCAGAAAAAAATAAAAATTTTCCAGCAAAAAAATCAATAAATTTCCAGG
-TAAATGACCTAGAATTCGCAGAAGTTCAACAGCGAGTAACCGATGGCCTT
-CGACAGGGAAATGAAGCGCTGAAAAAGATGAATCAACTATTCGATATCGA
-TGAAATCGACAGGATTATGGAAGAAACCAAAGAGGCGGCGGAATATCAGG
-AAGAAATCTCGAATATGCTGTCCGGCCAGCTTTCCAACACGGATGTCTCG
-GACGTTGAGAAGGAATTGGAGGATCTGTTGGCGGCGGAATGGGGCACAGT
-TCAACTTCCAGAGGCTCCGAGCCATGAGCTGCCTGAAGCAGAGCGGGAAC
-GGCAAAAAGGTTGAGATTTGCCGAGAAAATTCCTAAATTTTCCCTAAATA
-AATAATTTTTTTTCAGAAAAAGAGAAGCCACGTCGCGAGAAGATTGCTCT
-GGAAGCCTAAATATTGCTTGTTACTGTGAATAAAATAAATTCATTATATT
-ATTATATTTTTTATACAATTTTGTCTTACTGGCGTTGTTCTGAACGAAAA
-ATTCGTTTAAATAACGCTGTAACAAAAAATCTCATTTTGCGCGTAAAATA
-AAATGCCAGTGACGCAATCACCACGACGAAAAATCGCACAGTTTTGGAAA
-ATTGCGGTTTTTCAAACTTTTTTTCGCTTTTTTCGGATGCTATTCAAGCG
-GCTATAGACTGTTCAAATAGAGATAGAACGGTCAGAAAATGAGAGACATA
-GACAAATAAAGAGACAATTTATTGACTTTTTAGGCTATTCTTTGTTGGAA
-ACCAACAAATTTTGTGTTCCCAGGCTTTTCTTTGCAAATTCTGAAGGGTT
-CTTCTTTGCAGATGCGTCGACGTGTAGCTCTGGACAATGACGAGCATGAT
-GGTAAGTTAAAAAATTGGAAAAAAAAACTTTGGTTTCTATTAAATTTTAT
-TATACTTATTCCCTTTTTATAATTAAAGGCGTCTAGCTCATTCAAGCTCA
-TTCACGACGTTAGTTGACGCATTCCTCCTTGCACGCATGGCCTAGTGGGT
-TAAGGCGCTGAACATCACTCAGAAGTCCACAAGTTCAAACCCAACGAGGC
-TCCCCCGCTTTTCTAACCCTAGCTTGAGCAATCAAATCGGAACGCGTCGG
-AGCTGTCTCGGAGCCAGAAGCCTCATCAAATATTTTGATTGCTTCCAAAC
-AATCTATCGCACGTTTGTGCTCCTCATTTCCGTAATGACGTGTGCATGCG
-TAAGCTTGATCTTTCCAGTTTTCTAGGTGACTCATTAGAGCAATCGAGTG
-AGCAACTCGTTCATTCGGTATTTCATGAGCCAATTGCTATGCGGGACGCG
-GGGCTTCTGGAAAAAAATTAAACAAATATTTTTCGTTTTTTTTTCCACAT
-GTGTGGATCTCAATTTATTTCTTCTTTTTTTGTTTACCTCATTTTATAAA
-ATTCTCCTTTTTTTCTCATTAATTTTTCTGTGGCTTTTTCAAAGATCTTT
-TTCAGATTTTCATCTATTTGTTTTAATGTGGAGCAAAATTGAAATTTGTC
-TGGTAGATACGGTAGCTTTAAAGGCGCATACTAAATTTAAAGTGACAAAA
-TAAATATTTAGTTCCATATGGAATTTCAATTTTTGCTGCCAGGCTGTCCC
-ATTACGGTTTGATCTACAAAAAATGCGGGATTTTTTTTGGCCCAAATAAT
-GTGACGTCAGTGCGTTCTTAACCATGCGAAATCAGATGAGAACTCTGCGT
-CTCAACTCCCGCATTTTTTGTAGATCTACGTAGATCAAACCAAAATGGGA
-CATTCTGACACCAGGTATTCGCCGCGGAACCAGTTTTATACCGTATTTCG
-TATGCGCCTTTAATTCTACCGTACCCGCTTCTGGAAGTTTGGAAGTTTGA
-AAAACTATTAAATAGAATTTATTAATTTTTGCATATTACTTTGTGCAGAA
-TACCTCTAAAAATATTAAAATCCAGATAAACATGGTTTTTAAAATGTTTT
-GCACAAAAAGCGATGATTTCGCTTCGAAGCCACTTTTATAAAACGCCTTG
-TGCGCCTTTAATTCCACCGTACTCGCCAAAATTAAACTGAATGAGCGAGT
-TTTGAACTAATTTTTACGAAAAAATCACGTTCTGATCGGTTCTGGTCTTC
-CTCTAAAATCGGTTCTGGTCTTCCTCTTTGAATTTTCGCGCTCCATTGAC
-AATCGCCTGCCGGACTGGGAAAGCCGTGTACTCCACACGGACAAGTACAT
-TTAGTTTTACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGCCGTA
-AATCTACACCAGATATGACCGAGCCAAAATGGCCTAGTTCGGCAAATTCT
-TCCATTTCAATTTATGAGGGAAGCCAGAAATTCGTGTATTTTTACAAAGA
-AATGTGAAAAAGAAGCTAAAATTTCAATGAAATAGAGATTTTTCCCGGAA
-TCTCACAGTTTCGCAAAATACTATGGATTAAAAAACGCTGAAACCCAAAT
-TTGCGCGTAAAATTCAATGTATAGCGAACATTCACGGATTTCTGGCTTTT
-CTCATATATTGAGATGGAAGAGTTTGCCGAACTAGGCCATATCTGGGGTA
-GATTTACGGCGCGTTGCGTGTCGCGTCACGGCTCGATTTTAGTTGTGAAA
-CTAAATGCATTTGTCCGTGTGGAGTACACGCGTTGTCCGGCGGGCGATTG
-TCAATGGAGCGCGAAAAATTCAATATGGAAGGCCAGCACCCCGTGTTAAC
-ATTTAAAAATTACAAGATTTGCCCCCTCAAACATCCCTGGAAAAACTAGA
-AAAACCTCGTGTGCTTGCCTGACAACAGCTGTTCACCGACAAAAAGATGA
-CGGGGAGGGCTTCAACAGAGCTTGTGTTTCCTCGTCAACTCTTTCGAGAA
-CTGACAGCACTTTTCATATAACTCATCACTAACTTTCGCTGCTCGTGGCG
-GTTTTTTTTAGTTCCCCAGTAATGAGTCAATTTTGTCTGTTGCTCAGAAC
-TCTCAATTACCGATGCTATTAGCGGAAGGACTTTTGGAGCGCCGGAGCCA
-GAGCAAAATTCATTTTTATTTGAAAAATGAGTGATGAGTTTTTCTCTCTG
-TTTTTCCATGTTTTTCTCGTTATTAGGCTGTAACTTTCCACATACACTTG
-GTGTCAGAGAGTCCCATCACGGTTTGATCTACAATAAAAGTGTGACGTCA
-GCACGTTCTTAACCTTGTGACAATAGTTGAAAAATCTGCGTCTCGTTTCC
-CGCATTTTTGTAGATCACACCGTGATGGGACTCTCTAACACCACGTACAC
-ATGAAAATTTCGCTGAGAACAAATTTTTGCGCGTCAAATCTGATGTATCC
-GGACTGTACCGATATCAATACATCGAATTTGACGCGCAAACTCCGTTTTC
-ATGGGGAATTGTTGAAAAAATTGTTTAACTTCCGGAAAATTAACATTTTT
-CAGAGAAAATCAAAATTTTTCTGTTTTTCCTTAAATTTCTAGGAAAATTG
-TAGCAGATTTTGTTGAAAAAATTCAAATTTCCACTGAAAAAAGTGAAAAA
-AGAAGACGATGTGTAAGCCTAAGCCTAAGCCTAAGACTAGGTCTAAGCCT
-AAGCCTGAGCCTATGCCTCAGCCTGAGAATAAGCGTGAGCCTAAGCGTGA
-GCCTAAGTCTAAACCTAAGCCTAAGCCTAAGCCTGATCCCAAGCCCACAT
-GGTGCCAGGCTGACCCATAACGGTTTGATCTACAAAAAATGCGCGAAATT
-TTTTGCCCAAAAAATTTGACGTCAGCGCTTTCTTAACCATGCGAAATCAG
-TTGAGAACTCTGCGTCTCTTCTCCCGCATTTTTTGTAGGTCTACGTAGAT
-CAAGCCTAAATGGGACACTCTGACACCACGTGAAGCCTAATCCTGAGTCT
-AAGCCTTATCCAATTTCCGAAAAATCAATAAAAATGCAAATAACATAGAT
-ATTCCCGCCTAAAGTTCAATAAATTATTTTTTTTTTGAAACTTTTTTCAA
-AACTTGCGAATGCATAGTACCAAAAAACGCCATATTTGACACGCAATTTT
-TGGATTGACTTTTTTTTGAATTGATATGTCATGAGCATCACTCAAGTGGT
-TCCAAAAAGGCGTCAAGTACTTGAGCCCTCCCTGAGCCACCACCGTCTCC
-AGAGAGCAGCCGAAACCAAAAACAAATAGGGGGAAAATGAACAGTTCTCT
-CTGTTTCAAAATCTATATATTCCTGTTCTTTGTATTATCTTCCGTGCGGC
-TTCAGCCCTCTACTGCTGCTCCAATTCTTTTCCATGTTATTTACCGTACC
-GATTAGACGAATGAACAGGACCCCCTTTTACCGTTCAACCGATGAGCCAA
-TGTGCTCTTTGTTGGCTAATTTGGGTGTTTTGCTCATTTGGAGGAACACT
-AACTTCCCTCTCTAACTACACACTACGTGGAAGAGTTTTTTCAGATTTCT
-AGGCCTCGCAACTTTCCTTGGTGGCCCAGAAAAACGCTTAAAACTTCAAG
-GTCAAAACGTTCATTTTTGTTGAAAAAAATCGGTTTTTACTTGAATTTTT
-GTAAGTGGAAGAGTTTCCTAAATTTCTAGGCCATGTGCTTTTTCCTGCTT
-ATCTGAAAATTTTGTTCAAATTTTCTTTTTTCACTTAAATATTCCCCGAA
-AATCTTGTCCACAAAAAGAAATTTTTGAACATTCAGATCATTTTTTTAGA
-ATGGAAGAGTTTTCCAGATTTCTAGGCCACATGGCTTTTCCTGGTGGCCT
-AGAAAATTTTCTGTTGGAAGAATCAGGTTTTTACTTGAATTTTCGTAAGT
-GGAAGAGTTTTTTACATTTCTAGGCCACGTGATTTTTTCCTGATGGTCTA
-GGAAACTTGTTTTCTCTAATTTTCCCCGATTTTGGATAATATTTGTTTAG
-TGGAAGAGTTTTCAGAAATTCTAGGCCACGTGGTTTTTTTTGGAAAAGAA
-ATATTTAGATCACATTAACATGTACTTTTATCAGATTTTTTGCCAAAATA
-CCAATTTTACAAGCTATTTTTTTGTTATATGTAAATTTTGTGGAAGAGTT
-TTTAAAATTTCTAGGCCACCTCTAGATGCACGTGGTGTCAGAGTGTCTCA
-TTTCGGTTTGATCTACGTGGATCTACAAAAAATGCGGGAGACGAGACGCA
-GAGTTCTCACCTGATTTTACATGGTTAAAAACGTGATGACGTCACATTTT
-TTGGGCAAAAAATGCCCGCATTTTTTGTAGATCAAACCGTAATGGGACAG
-CCTGACACTACGTGTACGTGCAGATGGCCTAGAAATGCTAAAATCTGTTT
-TTTAAATGTAACTTTGAAAGTGAAAGAAACAATTAGAAACAAGTTGGCTG
-TCGCCCCCAAAAAGTCTGTTCTGGCTATGTGGTCGCGAAAAGAGAAAACT
-CGGCCACCAATTTTTTTCCACGGCCAGATCTATGACGCTATGACGTCACA
-TTATCAGCTTGTTTCCGATTTACACACACATACACGTACACTTTCTCCGT
-ATCACTTTCACTGATAGCTTGAAACGAGATTAATCATCATTCCAGCTATT
-CTTTTTTATTTATTAGGTTAATGCCACTACTACTATTATTTTTTCATATT
-AAAAATACAATGAACTATGTAGACATAAATTCAAATGAGATGCCAAAAAG
-TGAGTTCGAACTTGTGGAAAATGTGTGTTTTTTAATAAATTTTTCAAAAA
-TATAGTAAATTTCTGAGAAATTTTGATTTGAATTCCCGCCAAGCATTTTT
-TTGAAAATTTTGAATTTCCGCCAACCATTTTTCCTTTTTTTTCAGAAAAT
-GTGAAAAAATTTTCTAAGCAAATTTGAATTCCCGCCAAGATTTTTTTTGA
-AAAAATTTCGAACTCGCGCTAAAGTATTTTCTAATAGCAGGATTATTGGA
-ATCCCCGCCAAAACATATTCTCAGAAAATTTGAATTTCCGCCAAAACTTT
-TTCTGATAAAATTTAAATTCCCGCCAACCATTTTTTCCTGAGAAAATTGG
-AAGAACATATTTTCAGTGAGAAAATTTGAAAATATTTTTTTCAGAAAGTT
-TGAATTCCTGCCAAAACATTTTCTAAGAAAATTTGAATTCCCGGCAAAAC
-TTTTTCTGATAATTTTTTGAAATTCCCCGCAAAAATTATAGTAAATGAAG
-ATGATTTGAGCAAAGTTATGACGTGGCCGCGGAAAAAATTGATGGCCTAG
-TTTTCTCTTTTCGCGGCCACGTAGCCAGAACAGACTTTTGGGACCGTACA
-ACCAACAAATATTTCTTCCCCTTTCAAAAATACATAAAAACCAGATTTTG
-ACATTTCTAGGCCATCTAGAGGTGCCTCGTGGCCTAGAAATTTGAAAAAC
-TCTTCCAGAAAATTTGTTCTGTATTTCTTGAAAGTGCTCCAACAAATCTG
-TGCAAATTTTAAAAACGTTTCAAAATATTTATTGAATAAATTCTTTTGTT
-GCACAAAGAGGTATCAAATCAGACCACCAGATTCGACCGTTGATCATTGT
-TTCAGTTGATAGGTAGGCAGGCGTGGTTGCCTGAAACCTGCCGGCCTCAC
-GCTGGGCAAGAGGCAGGCCGCCTTAATGTCAGGCAGGCAATGCCTACATG
-CAAGCCCTACTTCTACGATTATCTCGAAATTTAGCGAGTTTTTATTTGTC
-CAAAAAAAATCGCAACTGAACAACATGAAAAAGCCGCCAAAAACTTTCAT
-AAAATTCTGTCCGTAGTTTGCCGTTTCTTGCGTCTCATGCTTAATCCCTA
-CTGTAATTATGCTGAGATTTTCGATCTTTTTCACTTTTTGAAAATTTTTG
-GCAATTCTTTTTAAGTTTGTTGAGATTGTAACTTATGACAAACAGTAACT
-AAAAAGCGTGGCCGCCAAATTTTCTAGGCCATCAATATCAGTTGCGTCAT
-TTCTTCACCATACTGGACCGAGAAATATTCTAGGACATGTGTTTGCGTCA
-TTCCTCTTCCATTCCTAGTCCCAAAAATTCCAAGACCACTGGTAAGTTTG
-GCCGAGAAATATTCTAGGCCATCGATGTTAATGACGCCATTTCATACCCG
-AATTGGCCACTAAAATTCTTAGGTCATCAGTGACGTCACACCTCTTCCAA
-GCCTTGGAATGAGCATTTCTAGGCCCTCTAATCTAGGCTTGGCCGTCAAA
-TTTCCTAGGCCAGGTGACGCCATCCCTCTTCCATGCTCGACCACTAGGTC
-AAATGACGTCACTTCTCTTCCACCTACCGCACTTTGATTTCCTAGGCCAC
-CATGTGACGTCACTTCTCTTCCATCTAGGTTTCCCATGCCCTTCTCCTCT
-CACGTGGTATCAGAGTGTCTCATTTTGGCTTGAATACGTTGATCTACAAA
-AAATGCGGGAGAAGAGACGCAGAGTTCTCAACTGATTTCGCTTGGTTACG
-CACGTGCTGCCGTCACATGTTTTTGGGCAAAAAATTCCCGCATATTTTGT
-AGATCATACCGTAATGGGGTGTCCTCTTGTTAAATATCGAAATTTCACTC
-AAAAATTTTGAACGTTGAGCTTTTTGTCTCTGGTCAATTGGTCAGCCGCG
-CAGTGTTCCGGTGTTTGTGCTCATGTTTTCGTGTGCACATTTGTGCTGCT
-GCTAAGGCGTATTTTGTTCCGGGCGGGGACAGGGGGGAGAAGCAAAAATG
-TGTCAAATTTTGTTTGTTTTGCCATTGATATTGTCCTTCTGCTCAGAGGA
-TTTCCTCATTTTACGCCGTATGTGCAAAAGCATAATCACCACAATAATTT
-TGAATATAAGTTTGCAAACGCGCCCTATTGATAATCCTCGCCCGTGTAGT
-CTGCGTGCACGTGGTGTCAAAGTGTCCCATTTTGGTTTGATCTCCGAGAA
-ATGCGGGAGAAGAGGTGCAGACTTTTCAACTGATTTTGCATGGTTAAGAG
-TGTGCTGGCGTCACGTTTTTCTGGGGGCAAAAATTCCCGCATTTTTTGTA
-GATCAAATTGCAAAGCGCCCTATTGATAATCTTAGCCCGTGTAGTCTCTT
-GTTTAATTTTCAATTTTTCTGGTTCGGCACCTAAACTGTAACTACGACAC
-TCGGCAAAGTTAGACTGTTAAACTCCGCCCACTTAATGGCACCTTTTTTG
-CAGAAATGTACCCAACCGACAAAGAGCAGACACGGACCACATTTGAGACG
-AGAAGTCGGCGGAAACGGCTGGCGCAGGTCGCCGCCACAATTGCTAGCGT
-GATATTACTCTTGTTGGCAGGTAAGTAAAAAACTACGACACTCCGAGACC
-AAGAAAAAAATCGATAATCGAAATATTGAAAATTGCAAAATTTATTTCGC
-CGGATCATTTTCCATATCGATTTTCTGAATGGTATGGTGATAGCAATCCT
-CATCGTAGGCACATCCCTGGTGAACCACGTACTCTTGACCTGAAAAATAG
-GTTTCGTTCGGTGGAGCACATTTGCATACACTGACCTTTAATCGGGTGGC
-GACACGCTTTACACTTGAAACATGCCATATGCCAGTGGACATTGAACGCC
-GACACGCATCTCTCAAAAGTCGGCAATTTGCACGCGTGGCATTTTGGTGA
-CTTGGCCGCCCGGTGACAGTCCGCGCAACGGAGCGCGTTACCGTACGGCG
-CGGGCATTGGATAACACGGAGTCATGCCAATGACTGTCTGGAATTTTGGA
-GAAATTTATTGATTTTTTGACGGAATTTAATGAAATAAGGAAAAATCAAT
-AATCGACATATTTATTTCGCAAAAAAAAAAAAACATTATTGATTTTCACG
-GATTTCTGTCTTCCTCATAAATTGAAATGGAAGAGTTTGCCAAACTAGGC
-CATTTTGGCTCGGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCG
-CGTCGCGGCTCGGTTTTTGTAGTAAAACTAAATGTATTTGTCCGTGCATG
-GAATTCTGGCTTCCCTCATAAATCGAAATGGCAGAGTTTGCCGAACTAGG
-CCATTTTGGGTCGGAGAGATTTTGTGTAGATTTACGGCGCGTTGCGTGTC
-GCGTCGCGGCTCGTTTTCAATTGTAAAACTGCTGTATTTGTCCGTGTGGC
-GTACACAACACTTTTCCACGCGCTGTCCGGCAGGCAATTGTCAGTGGAGC
-GCAAAAATTTAATTAGGAAGGCCAGAACCCCGTGTCCGTGTGGAGTGCAC
-GACTTTCCCGCGCGTTGTCCGGCGGGCGATTGTCAATGGAGCGCGAAAAA
-TTCAATGAGGAATGCTTTTTGCAAAAACAAATTACATAGGCTTCTGGCCT
-TCCTTATTGCATTTTTCGCGCTCCATTGACAATCGCCTTAAAGCAGGGGA
-GTGTGTGTGTGTGTACTCCACACGGACAACTTAAAATGAAAACCGAGCCG
-CGACGCGACACGCAACGCGCCGTAAATCTACTCCGGCCGTGGCCGAGTCA
-AAATGGCTTAATTCGGCAAATTCTTACATTTCAAAATATGAGGGAAGCCA
-GAAACGTGTGTCACATGTTATAAAATTAATTTTGAAAAAAAATTATTAAA
-TTTCGCAAAAATAAATTATCGCTTTTTGTAAGAATTTATCGAATGAATTG
-ATTAAAAATTTATCGAATTTTAGCGAATCAGAAAATATCGATTTTCACTA
-AGAATTTATCGAATTTTTCGATTTTCGCTAAAATTATCGATTATTGCAAT
-GTTTTACCTGACAAACCGAGCATTTCAGGCATGAAATATGATACATCTCG
-TCTTGAATTTTGATCACTTTTCCCTGCAAAAATCGATATTTTCAATTGAA
-TATATTTCCAAAAATGTGCTCACAGTTTGAGCTTCTTGACGAGTCAGCGT
-TGTTGTGCAGCCTTTGCAATGGATATTATATGGAAGAACAATCTTTTGGA
-GACGTTTATTGTTCGACGAGAACAACATTTTTCGAATTTTTGAAATGATT
-AATTTAAAAATTTAAAAAGGAGAAAATTGAAGAGAAACGTGGGAAAACGT
-ATTGATTTTTCAAAATTTTATTGATTTTATAATCACGGGGTTCTGGTCTT
-CCTCATTGAACTTTTCGCGCTCCATTGACAATCGCCTTCCGGACAACACG
-TGGGAAAGTCGTGCACTCCACACGGATAAATACATTTAGTTTTACAACTA
-AAATCGAGCCGCGACGCGACACGCAACGCGCCGTAAATTTACCCCAGATA
-TGGCCGAGCCAAAATGGCCTAGTTCGGCAAACTCTTCCATATGAGGGAAG
-CCATAAATCCGTGTATAATCAAACGCGCAATTTAAAAAAATCGGTAGTTG
-AAATTTATCGATTTTCCCTCGATCTTATCGATTTTTTAAAAGACTTATCG
-ATTTTTATCCAAATTTATTATTTGAAAAATCAACGTTTATTGATTTTTGT
-CATGATTTATCGATTTTCTCAAGAGATTATCGATTTTTGCTGTCGATGCA
-CCATGTGCAAACTTCGCCACGTTTTTTCGCGGCGAGACCCAAATTTTTTG
-AATTTTCAGTTCTCGGTCTGGTATACGGTAGCTTCTACCTCTACCGTCGA
-TATGTGACAGATGCAAATGATAAACGGGATAATGATGAATATTTGCGAAA
-ACTCGTTCGTCAAGTCAATGACTCGCCGGAGACCACGTGGAAAGCCAAAT
-TCAATAAGTTTGGTGTCAAAAATCGATCTTACGGATTCAAATATACGAGA
-AATCAGACGGCGGTCGAGGAATACGTGGAACAAATTCGAAAATTTTTCGA
-GTCTGATGCGATGAAGCGGCATTTGGAGTGAGTTAACTCAAATTTGAGCG
-GGAAACAACGATGCTCCGCGCTCTCGCCGCATGTAGTTTAGCGCGTAAGC
-TGTGATGCATACGATAGTCCTGCAATGCATCATATTTTACACGCAAATGC
-AGAAATTACCAAATTTCGAGAAAAATCTATATTTTCCTTTTAAAAATTAT
-CGATTTTTTAAACAAAACTTCTGAATAATTGGATTTTTCCAGAAGTTTTA
-AAAAGTTTTGGGTACAATTTTAAAAAGACAGCAAAATGTTCGTAAAACAC
-CAGGAAAGAATTTTGCGCTTAATATCTGATGCTTCGTAAACTCCACGGGC
-TTCCGGCCTTAAAGCCGAGCTACGCGCCGTAAATCTACCCCGGCCGCAAC
-GCGCCGTAAATCTACCCCGGCCGTGGCCGAGCTCAAGTGGCCTAGTTCGG
-CAAAATCTTCCATTTCAAAATATGAGTGAAGCCAGAGGCGCGTGAATGAT
-GACTTCCACACGGTTCGGTAGAGCGCATTTACACTTATGTACCCTTTGCC
-GGGCTGCGTTCAAAACCTAAAAATTTGAAATTTTGCGCGTAAGATCTGGT
-GCATTGGGTTCTGAATTATTTCGACAAAACATGGTGCATCATCCCAAAAA
-TTGCAATTTTGCAGTGAACTTGAGAACTTTAACAGCTCCGATGTTCCGAA
-AAACTTCGACGCTCGTCAGAAATGGCCGAATTGCCCGTCAATCTCGAATG
-TTCCAAATCAGGGAGGATGCGGGAGTTGCTTCGCGGTCGCCGCCGCCGGT
-GTCGCCTCCGACCGTGCCTGTATTCACTCGAATGGAACTTTTAAGTCACT
-TTTGTCCGAGGAGGATATTATTGGATGCTGCTCGGTGTGCGGAAATTGTT
-ACGGCGGAGATCCACTGAAGGCCTTGACCTATTGGGTTAATCAGGGACTT
-GTTACAGGTAAGCGGTGACGTCATAGGTGGCCTAGGAACCTTTGATCTAC
-AATGTGATTGAATTTTATATCACGCAATTTGTAATAATTTCTAAAAAAAA
-TTATCGATTTTTCTGAAAATTAACTTGTTCCAAATTTTGAACGAATTTTC
-TAGAAGATTTTTGCAATTTATCGATTTTTGCAAGCTATCGATTTTTCCCG
-CAAACTATCGATTTTTCTAGAAAATTATCGATTTTTCTAGAAAATTATTG
-ATTTTTCTAGAAAATTAACGATTTTTCTAGAAAATTTTCGATTTTTCTAA
-AAAAAATTATCGACTTTTTTCTCAAAAGTATCGATTTTTGCAATTTATCG
-ATTTTTTGAAATTTATCGATTTTCCCTGCAAATTATCGACTTTTTTGAAA
-ATAAGCTTTCCCCAAAAATTTGAACGAATTTTCTAGAAATTATCAACTTT
-TGCAATTTATCGATTTTTTTTTTGCAATTTATCGATTTTTTGCAAATTAT
-CGATTTTTTGCAAATTATCGATTTTTCCAAACAATAACGATTCTTCTAAG
-CCCGTGGAAGAGTTTTTCGAAAACCTAGGCCATCTCTATTTCCAGGTGGC
-CGTGACGGTTGCCGTCCCTACTCGTTTGACCTGTCGTGTGGAGTCCCGTG
-CTCGCCGGCCACGTTCTTTGAGGCCGAGGAGAAGCGAACATGTATGAAGA
-GGTGTCAGAATATCTATTACCAGCAGAAATATGAGGAGGATAAACATTTT
-GGTTAGAGATATTTTTTTTTAGAAAAATAGAGAAAAATTTCTGGGATCTA
-TTCAAAAATGGCAAACTTTTTGGAAATTATCGATTTTTTCCGGTAAATAA
-TTATCAATTTTTTTCTCGGAAAATATCGATTTTTTCGGAAATTGACAATT
-TTTTCGAAAATTATCGATTTTTTCCGTTAATGATCGATTTATTCGGAAAT
-TATTGATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATTTTTT
-CCGATAATTATCGATTTTCCGGTAATTATCGATTTTTTCCGATAATTATC
-GATTTTTCGGATAATTATCGATTTTTTCCGATAATTATCGATTTTCCCGA
-TAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTATCGAT
-TTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGATAAT
-TATCGATTTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATTTT
-CCCGATAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTA
-TCGATTTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCG
-ATAATTATCGATTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGA
-TTTTTTTCCGGAAATCATGAATTTTTCCAATAATTATCAATTTTTTCCGA
-TAATTATCAATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATT
-TTTTCCGATAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGTAAT
-TATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACTTTT
-CCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTTCGATAATTA
-TCGACTTTTCGGGTAATTATCGATTTTCCCGATAATTATCGATTTTTCCG
-GTAATTATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGA
-CTTTTCCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTCGATA
-ATTATCGACTTTTCGGGTAATTATCGATTTTTTCCGATAATTATCGATTT
-TTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGATAATTA
-TCGATTTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATTTTCC
-CGATAATTATCGATTTTTCCGGTAATTATCGATTTTTTCCGATAATTATC
-GATTTTTCCGATAATAATCGACTTTTCCGATAGTTATCGATTTTTCCGAT
-AATTATCGATTTTTTTCGATAATTATCGACTTTTCGGGTAATTATCGATT
-TTTTTCCGGAAATCATGAATTTTTCCAATAATTATCAATTTTTTCCGATA
-ATTATCAATTTTTCCGATAATTATCGATTTTTCGGATAATTATCGATTTT
-TTCCGATAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGTAATTA
-TCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACTTTTCC
-GATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTTCGATAATTATC
-GACTTTTCGGGTAATTATCGATTTTCCCGATAATTATCGATTTTTCCGGT
-AATTATCGATTTTTTCCGATAATTATCGATTTTTCCGATAATAATCGACT
-TTTCCGATAGTTATCGATTTTTCCGATAATTATCGATTTTTTTCGATAAT
-TATCGACTTTTCGGGTAATTATCGATTTTTTTCCGGAAATCATGAATTTT
-TCCAATAATTATCAATTTTTTCCGATAATTATCAATTTTTCCGATAATTA
-TCGTTTTTCCCGATAATTATCGATTTTTCCGATAATTATCGATTTTTCGG
-ATAATTATCGATTTTTCCGATAATTATCGATTTTTCCGATAATTATCGAT
-TTTTCCGATATTTTTTTTCGGAAATGGCTGCCCCATCGCGGTTTGATCTA
-CAAAAAATGCGGGAATTTTTAGCCCAAAAACATGTGACGTCAGCACGTTC
-TTAACCATACGAAATCAGTTGAGAACTCTGCCGCATTTTTTGTAGATCTA
-CGTAGATCAAGCCGCAATGAGACACTCTGGCACCAAGTGTCTGTAATTGA
-CTTCACGGAAGAAAATATATTTTTATTTAATGCGCAAAACTAAAATTCAA
-AATTTCGTTTCGACCAATACACCATATTTTAAGCGCAAATTTCAATTCAA
-ATTTTTGCAGCAACCTTTGCCTATTCAATGTATCCCCGCTCAATGACAGT
-ATCCCCCGATGGAAAGGAACGAGTAAAGGTGCCAACAATCATCGGTCACT
-TCAACGATAAGAAAACCGAGAAGCTGAACGTGACCGAGTACCGTGACATC
-ATCAAAAAAGAAATTCTACTTTATGGTCCCACCACGATGGCGTTCCCAGT
-TCCCGAAGAATTCCTTCATTATTCGAGCGGAGTGTTCCGCCCGTATCCAA
-CTGATGGTTTCGACGATCGAATTGTGTATTGGCACGTGGTTCGATTGATC
-GGATGGGGAGAATCAGATGATGGAACACATTATTGGTTGGCTGTTAATAG
-TTTTGGTAACCATTGGGGTGATAATGGTGAGTTTTCGTGCAAATTGCGCA
-CGGCCCGGCAAATGGTACATCCATACAAATGCGCTCCACTGATAATTTGA
-GTTTAGCCAGGTTTGGGCGCGTTTTAAGGAAAACGCCTTGGTCCAAAAAA
-TTTAGAATTTGATTTCGGACATTTTTTATATGCATCACAAAAATGTTGGA
-CGAGCCGTTTTTGAGAAAAAGCCCAGGTATACGGTAAACAAATTGCGTAC
-AGGTGCCACTTCCCGGGCCGTGATGCGCGTTAAATATAGTGCTTTTTAAG
-AATGCGTGTTGCGCAACATATTTGACGCGCAAAATATCTCGTAGCGAAAA
-CTACAGTAATTTTTCAAATGACTACTGCAGCGTTTATGTCGATTTACGGG
-CTCGAAAAAAAAGTTACAGCGATATTCCATTTTTTCTCATTTTTTGCTTA
-TTTTTATTTAGTATTCTCACGGTGTGTCATTCTGTCCCATAACGGTTTGA
-TCTACAAAAAATGCGGGAATTTTTCGCCCAGAAAAATGTGACGTCAGCAC
-GCCCCTAACCATACGAAATTTGTTGAGAAATCTGCGTATAAATTCCCGCA
-TTTTTTGTAGATCACGCCGAAGTGAGACACTTTGACACCACGTGTATTCT
-ATCTAAAAATAAATTATTTCAAAAATAGAGCCCGAAAAAAAAAATCGACA
-AAAGCGCTACAGTAGTCATTTAAAGAATTACTGTAGTTTTCGCTACGAGA
-TATATTGATATTTTGCGCGTCAAATATGTTGCGCAGTACGCATTCTTAGA
-ATTTTGTGTTGCCGTAAATAAATTTGGACGTCAAATACAGTGCATATTGC
-GGTCGATCGGCTACAATATATTTTGCGAGCAAATTTGGAAGTTTTGCGCG
-TCAAATATGATGTAGCCGATCGGTCATGTTACAAAACACCATATTTGACG
-CGCAAAACTTTAATTTTGGACAAAAAGTCAGAGAATTAGTATTGCGTAAA
-AAACTGGCAATTTTTTTCAGAACATTTCTGAAATTTTCAATATATTTTCA
-AACTTTTCGCGTCAAATATGGTGCATCAAGTCGCGAACCAAATACACTCT
-AACACGTAGTGCCAGGCTGTCCCATTATAGTTTGACCTACAAAAACGCGG
-GAATTTTTCGCCCAAAAAAATGTGACGTCAGCACGTTCTTAACCATGCAA
-AATCAGTTGAGAACTCTGCGTCTCCTCTTCTCCCGCATTTTTTGTAGATC
-AACGTGATTCAGGCCGAAATGTGACACTCTGACACCACGTGGCCCTAATT
-AACTCGTAAAAATCACCGTTTTTTTTCCAGGACTCTTCAAAATCAACACA
-GATGACATGGAAAAATATGGTCTAGAGTATGAAACAGCAGTCGTCTAATT
-ATAATTCGGCAAAAATTTTTTGTAAATAGTTAAATATTGTCCACCTATTT
-CATCCCCACCCGATTGCATCTCAACTTGTCCCATTTCCGAGAAAAATCAA
-TTATTTATTTTTATTCGGCCATCATTTATTAGCTCCCTCATTCCATAGTT
-TTTTTTTAATTAGATTTTTTTTGGATGCTAAAATTTGCCATTCTCATAGA
-CATTTTCAATATTTGTGTAAAATAAATCATTTTTCTGGTCTTCAATTGAT
-GGAAAAAAACAAAAAAACAATGCGCGTCAGGTTTGGTGTATTGTGTGCAA
-ACACCGAGCGCATATTTTGAAATTTATTTTTTTTTCGAATTTATTAAAGT
-TGCTGATTTTCTTTAATTTCAGGCTTAAAAATGTCGGATTTTGTGCCAGA
-AACCGAGGAAAATGAAGAAGAATCTCAAAAAATCGATGAAATCCATGAAA
-TCCCAGCTCAAGCAATTATCATCGACCAAAGTGAGGAAAATGCTGACTTT
-ATCAATTTTCAATTACTTTTTGCATTTTTTCTAGGTTTTTCTCGACGATT
-TCTCAACAATAAATGGTACGGAAAGTACGGCGAAGATGGGGATCTTCTGG
-AGCACATCGACGAGGACTGGGAGCCCGTAGGCCTCGACGAAGTGGAATTT
-CTGAGCCAACTGTGGTTTGAGCAGGAGGATCAGGAGAAAAAAGCTCATAG
-GCACTATGATTGGGATGAAGAAAAGAAGGAATGGGTGCCGAAGGCCAAGC
-AGGAGGAGGTCAATGAGGATTTTATCGCAGAATATCAAGCGAATTACGGG
-GTTCAGTATGATGATATTTATAAAAAAATGGACGAAGAATTGCAAGAAAA
-AGCGGCAAAAGCTCAAAAAGAAGATGAAGAGAAGAAGGAGAAGAAGCGGA
-AGAAAAAAGTTGGCTTGGGAGCCGGGGAAGACGCTAAAGAGGGCTGGCTT
-GACCTAGGAGATAAGGTTCATGCGGTTTATGTGTCAAATCTTCCGGAAGA
-TATTACAGACGAGGAATTCCAGAAATTTATGTCAAAATGTGGAGTTATTC
-AGCCGGATATTCGAACGAATAAGCCGAAATGCAAGCTTTACCGGGAGGAA
-AACGGCAAACTCAAAGGCGACGGAAGATGTTGTTATATTAAGAAGGAATC
-TGTCGAGCTTGCCTGTAACATTCTCGATGGAGCGAACTTAAACGGGCGGG
-AAGTGAAGGTTGAGGAAGCTCGATTTGAGATGAAGGGCGATTTTGATCCG
-GCGAGGAAGCGGCGGAAATTGACTGCGGCGCAGAAAAAACGATATATGGA
-GCAGCAGAATAAGTAATAAAAAATATTTGGTGAAATTTGAAATAGCTCGT
-AAATCGACATTAAGCTGAAAAAATGAAAAAAAACCAAAAAAAATCGTATT
-ACGGGAACACAAAATCCTGAGAATGCGTACTGCACAACATTTTTTTTTTT
-TTTGACGCGCAAAATATCTCGTAGCGAAAACTAAGACTACTGTAGCACTT
-GTGTCGATTTACGGGCTGCTCGATTTTCGAAATGAATTAAAAGAATTTAT
-TTATGTGATATTGAAATTGGGCAAAAAATAGGAAAATAATACAAAAAAAT
-CTAAAAAATTTATTTCAATAATCGAGCCCCCGTAAATCGACACAAGCGCT
-ACAGTAGTCATTTAAAGAGTAGTTTTCGCTACGAGATATTTTGCGCGTCA
-AATATGTTGTGCAATACGCATTCTCAGAATATTGTGTTCCCATAATATAT
-CGACGAAAAAATTGGCCCAAATCGTGGATTTTTGTCCGAATTTGATGACA
-AATGGCTTTGAAAATCACAAAATTTCAGAGAAAAATTTCGATTTTTGGTT
-TAAAAAAACAAAAATTGAAACCCAACAAAATTGTTAACTTGAAAACCTGC
-TGAAAATCTTAGAATTTTCAGATTTCACCCAAAAAATACCAGATTTAACT
-CGAAAATTGCGAATTTTAGGCCAAATTCCTTGCATTTTTCATAGAAAAGA
-TAAACTAACGACACAAAATCAAATGAAATTGACTAAAAAACTATTGAATT
-TTGTAGAAAAATCCCGATTTTTGCCTAAATTTGCAAAAAAAATATTTTAT
-TTTAGCATTTATTTTTCTTAATTTTCACACTAAAAATTACGAAAAAAGAC
-AAAAAAAATTTTTTTCATTCAACAATTTTTTGGGCTAAAATGTGTAATTT
-TTGCGGGAAGAATTCGAAAAATTATTAAAAATCGTAGAGACTAACTGAAA
-ATCAATTTTTTAGGGACCAAAAAGCCAACTTTTGCCGATTTTACTCAAAT
-TTTTCCGTGAAAAATCCGGAATTTTTAAATATTATTTAATTGCGAAATTT
-TACAATTTTTACACCTAAAATAAGGGTAATATGGTAGCTGGTCTCGACAC
-GACAATTTTTTTGTTAAATTCTAAAAAAGGTGTGCGCCTTTAAAGAGTAC
-TGTAATTTCAAACTTTATGGAATTTTTTTTTGATTTTTCAAATAAACTAC
-GAAAAATCGAAGAAAATTCCACAAAGTTTGAAATTACAGTACTATTTAAA
-GGCGCATACCTTCTAGAATTTTACAAAAAATTTGTCGTGTCGTGACCGGC
-GACCGTATTACCCTAATTTTTGGTGTAAAAATCGTAAACTGTCCGGATTT
-TTCACTACGAAATTCAAATTCGAGGAAAATCGAAAAAAATTGGTTGTTTT
-GGTTCCTAAAAAATATATTTTCAGTTATTTTCTACCATTTTTTAATAATT
-TCTCGAATTTTTCCCTCAAAAATTACAAATTTCAACCAAAAATTCTGATT
-TTTCCTTTCCAGAATCTTCGAATGGACGCCCGATAAGCCACGTAACTACC
-GTCCAAAGTCGGACTGTACGGTTATTGTCAAAAATCTGTTCACTCAGGAA
-ATGATGAACAAGAATGCGGCGTTGATGTTGGATTTGAAAGAGGAAATGAC
-ACAAAGTTGTCAGAAATATGGAATTGTTAAGAAAGTCGTCGTTTATGCGG
-TTGGTATTGAGGAAATTTGTGGAAATTTCGATTTTTGTAAAAAAAATTTA
-TTCTAAAAAAATAAATTAAAAAAAAAAGATTTAAAAAATTTAAAGCTAAT
-TTTCGAAAAATTGAAGCTAATTTTGGAAAAAAAACCGAAAATTTTTTTTT
-TTAGAAATGTCGATATTCATAAAAAAATATTCTAAAAACGGGATCAAAAA
-TTTTTGAAGCTATTTGTCGGAAAAATTTTTAAAAATGTAAAGCTAATTTT
-CGAAAAAAAACCCAAAATTATTGGATTTAACAAATTTTCAAAAAAATTGT
-TCTAAAAAAGATAACCTTTAACATTAAAAAAATTATGGCTATTTTTCGAA
-AAATTAAAAAAAAACAATTTTTAGCTAATTTTCGAAAAAAAACCGAAAAT
-TTGTGGAAATTTCGATTTTCAAAAAAAATTTATTCTAAAAAAAAATAAAT
-TTTTAACATTAAAAAATGGCTATTTTTCGAAAAAACCGAAAATTTTTGGA
-AATTTCGATTTTCGAAAAAAAAGTATTTTAAAAAAACAATGAGAAATGGT
-TATAAATTGTTCTTTCAAAAATTTTTTACAGCTTTTTTTTTCGAGAAATT
-TAAAAAAAAAACAATTTTTAGCTAATTTTAAAAAAAGTAAAGCTAATTTT
-CAAAAAGAACCCCAAAATTGATGCATTTATCGATTTTTAAAATAAATTGT
-TCAAAAAAAGATAAATTTAAAAAAAAAGTTATTGGATTTTTTAAAGTTAT
-TGGATTTTTCAATTTTCAAAAAAAAATCATCAAAATGTATAAATAAATAA
-AAACTATGGATTTCGAAAAATTAAAAAAAACAATTTTTAGCTAATTTACG
-GAATTAAAACAACAAAAAATTTCGGAAAATCGAAAATTGTTGGTTTTTTT
-TTTCGATTAAAAAAATTCAAAATCTTCTGAAAGACATTTTTAAAATTTCC
-AAAAAAAAATTATGAGTATTTTTCAAAAAACAAATCGAATTTTGATTAAC
-TTCCGATTTTTTTGACATTTTTTGAAATTTGAAAATCATTAATTCAAAAA
-TTTTTATTGAAATAATTCAAAAATTTTTATTGAAAAAAAACGAAAATTTT
-TGATTTTCGCTTGAATATTTCGGAAAAAACAATCGATTAAAAAAAAAATA
-GGCTTCTAGTTATTTTTCAAGAATGCTTTTTTTTTGACAAACTGCTGATT
-TTTTGTCAGTTTCGTCGATTTTCGTTGTAAAAAATCAAAAATTCAAAATT
-TCTTCTATTACGAGTGCACAAAATGCTGAGAATGCGTATTGCACAACATA
-TTTGACGCGCAAAATATCTCGTAGTGAAAACTACAGTAATTCTTTAAGTG
-TCTACTGTAGCGTTTTCGGAAAAATTCCACTTTTTTTATTTAAAAAAAAA
-AACGAAATATTTTGATTTTTTTTTATTAAAAAAAACGAAAAATTTTGATT
-TTTTATTAAAAAAAACGAAATATTTTGATTTTTTATTTAAAAATGAAAAA
-TTTTGATTTTCCAAAAAAAAAGGCTCCTAATTAAAAAAAAAAAATTTTTT
-TGAAAAAGTGCAGATTTTTGTCTTAAAATTTAAATCAAAAATTTTTAAAT
-AGACTTTTTCCATCAAATTTCCCCAATTTTCAGAACCACCCGGACGGCGT
-CGTATCGGTAACCTTTCCAACGACAGAAGAATCGGATATGGCTGTAAAAT
-ATCTTCACGGACGAGTAGTTGACGGTCGGAAATTGACAGCCGAGCTCTGG
-GATGGCCGGACAAAGTTTAAGGTCGAGGAGACGGAAGAGGATGAGGAGAA
-GCGTCGGAAAGAGTACGAGAAGTATATTGAGGGTGGAAGTAGTGAGACGA
-AGGAGGAGAGCGACGACGATGATGACGATGAAGCTGAAGATAATTGATTG
-ATCTAAATTTTTTCTGAAAAATTATTTTTAGTTTATACATTTTTCCGAGA
-GGAGCAACCGATCAATTTTTACCAAAACTATGTTCAAAATCGCCCAAAAA
-TATCAAATTTAGTGAATTTTCGTTTTCATGGATTTTTCGAAAATTAGCTT
-TAAAAATGTTTGCCAAATTTTTCGACGATATCGCGATATTTTAAAAATTT
-CGAACAAAAATTGCCTAATTTCAATTAAAATCCCTTTTTTCGAAATTTTC
-TAATTTTCTGGGCCAATTGGGTCGTTTAAAAAGAAAAATGGCCAAAATTT
-GAGAGTTTTAAAAAAATTCTAAAATTTCAATCCTACGATTTTCCGGGAAA
-AAAATTTTCTTGGAAAATTGCTTTTTTTTTGAAAAATTATTTTTAGTTTA
-TACATTTTTTTTCCGAAAATAGGAACAACCTATCAATTGAAATTTTCAAA
-AAAAAATTAATTAAATTTGGAAGCATTTTCCGAAAAATTGCATGTTTTCG
-GTTTTCTAGAAAAAAAAAACTAAAAGAACGAAAAATTTCACCAAAAATCA
-AATATGAAAATACTTTCCTAAAAATCTGAAAAAACCAGAAATTTTCAATT
-TTCCCTATTCAAAAAAATTCAAAAAAAAAACCAAATTTCAGTTAAAATCC
-CTTTTTTCGAAAATTTTAAAATTTTCTGCGCCATTGTGTCGTTGATTTGA
-AATTTTTTTCTAAAAATCCGTGAATTTTTGAAATTAAACAAAAAATTTGA
-AAAATCAAAAATTATCGATTTTTCAACGAAAAAAATTCAAAAATTTCAAT
-CTTACGATTTTCCTAACTAAAAAAAAATTTGAAGTAACGAAAATGTTCAA
-TTTTTTCGAAAATTTTCGAGGTCATTTAGAGTTTTTTCTGTGAAAATTGC
-ATTTTATATACTCATTTAAATTAATTTTTATATATTCCTTTCCCGAAAAC
-TTCAAAAAAAAAACCCAGTGATACAATTAAAATCGAGATAATCACAGACA
-AAGTAGGCAGTAGGCAGGCAAAAAACAGGCACATATTAAGGTAATACAAA
-ATTCTGATAATGCGTACATCGCAACACATTTGACGCGCAAAATATCTCGT
-AGCGAAAACTACAGTAATTCGTTAAATGGATACTGTAGCGCGCTAGTGTC
-GATTTACGGGAATCTTAAAGAACCTAAAGAATTGTAGGAAAAATGGAGAT
-CCCGTAAATCGACACTAGCACGCTACAGTATCCATTTAAAGAATTACTGT
-AGTTTTCGCTACGAGATATTTTGCGCGTCAAATATGTTGTTCAATACGCA
-ATTTTAAAATTTCGTGGTCTCATAATAATACACAATTAACTAGTAAATCT
-ACAAAATCTACAAAATTCTCTTCATCAACTCTTCCACAGCTCGATCGACC
-TGTGCATGAGTCTCCTCGTACGCCCACAGAGAGCACAACGCCACGTTGCT
-ATTGTCGAGACGTTCCTTATTCGAAATCTGTGACGACATGCGATCCTTGG
-CCTGATCTTCAGTCAGGTTATCCCTCGCAACGACTCGACGGACGGCTTCA
-TCTGCTGGCACGAAGACGGTCCACGTTTCGGCGAGCGTTTTGTGCCATCC
-GGCTTCGATTAGTGCGGCCGCTTCGATGACTGAATGAATTTTTTTTTCAA
-CTTTTGCAGAAAAAATTATGATTTTGCAAAATTAACGGGGAAAATTGGCT
-GTTTAAAAAATATTTATTATTTTCGCGTTTTTTTAAAATAAAAATCGATG
-AAAATTCTGCAAAGTTTGAAGCTTCAGTACCCTTCAAAGGTGCACACGTT
-TTAGAATTTAGCAAAAAATTGGCGTGTTCACGATTTTTTGGTTAAATTCA
-AGAAAGTGTGCGCCTTTAAGGAGTACTGTAATTTCAAACTTGCTGAATTT
-TCATCGATTTTTCACTTTTTTTCCACGATTAGTAAAATTTGTGTTATTGT
-AGATTTTTTAAATTTAATACCAAATTTTCCAAAAAATCGAAAAAAAAAAG
-AAAAAATGTAATTTCGTTATTTTCAAAAAAATAAATTGAAAAATTGAAAA
-AAAATCCAAATATTCGATTATATTTTTTCAGAAAATAAAAATGAAAATTG
-GAAAAAAACATATTTTTGGGTTTTTCGATTTTCCAAAAAATTTAAACATT
-TAAAAAATCTAAATTTTCGATTTTTTTCAAAAAAAAAAAATTAAAAATCG
-CACAAAAACCAAAAAAAAACATTTTTGGCCGATTTTCCAAAAAAAAAAAG
-AAAAATAAACAAAAAACAAATATTTCAAAAAAAAAAACAATTTTTTCCGA
-TTTTCCAGAAAAACAACTGAAAATCGGAACAATAATTTGTTTTTTCTATT
-TTTCAAAAAATATTGAAAAATAAAAGAAAAAACGGAAATTTTCGATTTTT
-TTCCGATTTTCCAAAAAAAAAAAATTCAAAATCTCACAAAAACCAAAAAA
-AAAATGAAAAATCAAAGAAAAACGAAAATTTCGTTATTTTCAAAAAAATA
-TCGAAAAAACTTTTTTTTCTTCCGATTTTTCTGAAAAACACTGAAAATTG
-TGGAACAATAATTTTTTTCTATTTTTTTGGTCTCCACGATTTTTCGCGAA
-AAATTTCAAAAATTAAAATTTTTTTTTAAATCCAAATTTTCACTTCCCCC
-CCCCCCCCCCCCTCACCAACAACTTTCGCCGTCGACTTCTTCACAATCTC
-CATAGCTTTCTCTTTCACCTCCGGCCAAACAAGCTCACTCAGCTCGCGGA
-GCTTCACCTTATCCGAAAACACAATCGTTCCAAGCTTCCGGCGGTCTACA
-ACTCCATCGACAACGACATCCCCTCCAAAATGTTCGCCGATTTTTCGATT
-CAACGAGCTTCCCCGTTCATAGCACGTGTGTGCGAGCTTATCACAATCGA
-TAACATCGAAATTATGCGTTTCACGGAGATATTTCCCGATATGACTTTTT
-CCCGACGCAATTCCTCCGGCGAGCCCAATGATGTACGGGGCGCCCGTTTC
-TCTTGGAACCGCCCGAGCTGGACGGAGCAAGTGACCCAGATCCTCTCGTC
-GTCTGGAGCTTGAGCTGATCTTTGTCTCTTTCAGGATCTCATCGGATCCT
-TCCACCAGCTCGACAATTATCACATCCAGCTGCGACATTCCTTGCTCATT
-TCTCTTTTTGTTCACCGCATCGGCACCTTTAATGGTCTCCCGGGACACTA
-CTATCGCTTCGAGGTCTTTTATTCGTGTTGAAGGACCGAATGGGTCGATT
-ATTGGCTCCGCGAGACATTTTGCCTGGAAAATTATGGGGGTTCTATTGAG
-CAAAAATGACCATTTTTGGAAAATTAGAAAATCGGAAAAAAAAATTTCCC
-GAAATTTTTTATTTAGAAAAGTTTTTAAAAAACAGAAATTATATATTTTT
-TGAGTTTTCCAAAACAAAAAATCGAAAAAAAATATTTCGATTTTTCGGAT
-TTTCCAAAAGAAAAAATTTAAAATATCGAAGTTTTTAGATTTGCAATAGA
-AAAATTGAAAAAAAAAACGGAAATTGTATTACGGGAACAGAAAATTCTGA
-GAATGCGTATTGTACAGCATATTTGACGCGCAAAATATCTCGTAGCGAAA
-ACTACAGTAATTCTTTAAATGACTACTGTATCGATCAAGCCCGTAAAGCG
-CTACAGTAGTAATTTAAAGAATAACTGTAGTTTTCGCTACGAGATATTTT
-GCGCGTCAAATATGTTGTGCAATACGCATTCTCAGAATTTTGTGTTGCCT
-TAATGCAATTTCCGTTTTTTTTTCAATTTTTTCTTTTGAAAATCTGAAAA
-TTTCGATTTTTTCCAATATTTTCTTTTGGAAAATCCGAAAAATCGAAACA
-AAAATTTTTTTCTATTTTTTAAATTTTTTTTTTTGGAAAATCGGAAAAAA
-ACCAAAATTTTAGTTTTTTAAAATATTTTATGGACCAAAAATATCGATTT
-TTCCTAAAGTTTTATAGAAAACTGAAAAATTTAAATATTTATTGTTTTTA
-ATTTTTAAATTTTTATGGAAAAATTTCGATTTTTTTTTTTGAAAAAAAAG
-CTTTTTTTAAATTTTTCTTTATTTTTGGAAAATCGAACATTTGCTATTTT
-TTTCGATTTATTAATTTTTTTGTTGGAATTTCTAAAAATCGATGTTTTTT
-TTTCAAAAATCAGCGGTTTTTCCGAAAAATGGCAAAAATTTTTTTAAAAA
-ACATTTATTTCTTTTCCTATTTTTCGAAAAATAAATAATTTTTTCTGGCA
-ATTTTTAATGAATTTTTGATCGGTAAACTCTTACAGTCCCGGAAATATCC
-TCTACAAAATCGACAACTTTCTTAATCCGAAACTCCACAGGCTCAATCAT
-CTCGAATAATGATTTTTCTGGAAAAAAACCAATTTGTTAAAAGTTTTATT
-TCCAAGCTATAATCTAACTAATAATCATATCCTTATCGGTGACCCCCACG
-ACAATAACATCAGAAGCGAGCTCGGCAGCCTTGTTGAGCAACACTTTGTG
-CCCATTGTGAAGCCGATCGAATGTGCCGCCCAACACGACTTTTTTGTACT
-TTTTCGCCGCCGCCAATTTTTCCGCGTTCTCCAGCAGCTTTTCCTCGCCG
-ATTAGCACATAATTCTCGGGATTTCCGCGGATTTCCGACACAACTAGACG
-GACGTCGAGCTTCGGGCATGAGCTCGCCGATGTTAGGTAGATTTTCGAGA
-CTAGCTCGTCGGTTCGCGGCTCGTCCGGGTTTAATCTGCAAGGAATCCTT
-GTTAACCTTGATTTTCGAGCCGGGAAAAAGCCCAAAGCACTTTACCTCAC
-ATAAAGCTTCGAGCTTAACGCGGCGGCCGCAGACGTGAGCAATTGCTTCA
-GTTTTTGCACATTTTTGCTATTTAACACGAGAAGTCCGTATTTCGAGCTC
-ATTGAGAATGATGAGAAATATCAGGGAATATTCCTCAAATTTTAAATAGA
-AAAATTCGCTGCCACGTTCGCTGCTCTTATCGGCTGCGCGTCTCTATTTC
-ACACACTGTCTCATCTCTCGTCTCGCGTCTCTCGTCTCTAACGCGTGACG
-GTGGAGCGCACTTCCCTCCTTTTTGCTGTAAAATCTTTCAGACATGCCGG
-AAACAAGAAAAACAAGAAATTATTGAACTGAAAATAATGTAAACGTACTC
-ATCGTATTTTTAGCTTCAAAATAAGATATCTTAGAGCATATAATATTGCT
-TCTAAACGAAAACCAAAACATCGCTGAAAATGTTGTGAATTTTATGAAAA
-TCTAGGATCATTTTTCCCATTTTTATGAAAAACAACAATAAAATGAGAAA
-AATTACATGGGAAAACCGAAGAAACTTAAATTTCGCGGTCAAAATTCGAA
-TAGAATTACTGTATTTTTCGCTCAGAGATATTTTGCGCGTCAAATATGCT
-GCGCGTGCGCATTTTCAGCGTTTTTTATTTAATAAAACAGTAATAAAATG
-ATTAAATGCATTTTGTGTGATTTTCAGCCCAAAATGTTTGAAATAAATTG
-TTGTTGTTCAAGCCAGCATTTTTAAAAACTTAAATATATGGGAAAACCAT
-AAAAATAACACAAAAGTTTGGCAAAATTTTGGAACTACAGTACTCTTTAA
-AGGCGCAAGCCCTTTAAGACAAATTTGTCGTGTCGAGACCGGACAAATAT
-TCTAAATTTCTTTTATACATACGCAGATTTAAAGTACAGAAGAGCGCATT
-TGCACATTGCGCAATTTCTAAATTTTTTCTAACAATAAAAATTAAAACCA
-AAATACTTTATTCAATACCACAAATACCACAAGTTCATTTATCTTATTCA
-ACCTCTTCCGCCGACGTCGTCTTGTTGTTGCTCTTCCCCTTCTTCTTAGA
-CTTCTGAAATTTTCTCATATATGCAAACGCGCTCCGATCTAACAAAAAAC
-CTTCTTCTTCTTTTTCTTCTTGTCTACATCTTCCTTCTTTGGCTGCTCTC
-CAGATTCTCCCCCGGCTCCCGGATCGCTCTTCCCAAAGTCCATCTCCGGC
-TTCAGCCCAACCTCAGGCGGCGCGATCATCAGTACCTGCTGGTATCCAGG
-ACCCTTGTAATCCGTCATACAATCCCAATCTGGTGGCTCCTGGGTATTTG
-ACTTAGACTTCTCAAACAGCTTCTGGATCCCATCAGCGATACGATCGTAC
-TCCACAAACTCAGCGACATCCTTGGGCTCACGGATGATGGTCAGAAGATC
-AAAGAACCCAGCAGTGGTCTCCGGAGTGGTTCTCCAAACCGACGCGACCA
-TCGGTGCAGTGATGCGACGTTTCAAGTGGAGCACGTCCTGTTCGCTTTCC
-TTGTTGAGCAGTGCCCATGGGAGAGCTCCGAGGAAGAACTCGAGCACCAT
-GTACCACCAGGACTCCATGTCGTCCTTGTAGCCGAGATTTTTCTGGGAAG
-AAAAAAGTTGTTTTAAAGAAATTGTGAACGGTAAGGTTACCCCCTGGTGA
-GCATGAACGCTCGCGTACTTGACGACTCCTCTGTAGTGAATCGCATTCTT
-TCTCATCTGCTCCTCAGCTTCGTCGTTCTTCTTGACGAATCTTAATTTTA
-AAAAAAGTTTTCGGGGTAGATTTACGACGCGTTGCGTGTCGCGTCGCGGT
-TCGATTTTAGTTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACGCGAC
-TTTCCCACTCAAAATAGGATGGAATTGAATTCGGAGGTGTCACTGTTGCA
-AATTCGGATTGTCTGAATAAATATAAAGTGAGATTTTGAATTTTGCTCCA
-TTGATAATGGTGTTTTTTTTTGAAATTCTGCAAACATTAATTTCTAGAAA
-ATTTGAGTTTCCTCCAAAATTTTTCACAGAAAATTTGAATTCCCGCCAAA
-ATTTTTTCTCTGAAAATTTGAATTCCCGCCAAAATTTTTTCTCTGAAAAT
-TTGAATTCCCGCCAAAATTTTTTTCAGAAAATTTTGAACCCCGCTTAAAT
-TTTTCTGAACTAGGCTATTTTGTCTCGGCCATATCTGGGGTTGTGGTTTA
-CGGCGCGTTGCGTGTCGCGTCGCGGTTCGATTTTAGTTGTAAAACTAAAT
-GTATTTGTCCGTGTGGAGTACGCGACTTTCCCACGCGTTGTTCGTCAGGC
-AATTGTCAATGGAGCGCAAAAACTGCCGACCGCTCCAAATAACTACTTTT
-TGCACTTCATTGCATACACACAGCAGCTCGCGGCGTCGGCATGAGGCCCG
-CATTTCGCGCCTCACTGGAAGCCCCAGATGCCAAAAAATCTACCTCGGTC
-TCTTGCACAACCCGAAATCCAACAGGTAAACCTGATGGTGCTGTCCGTCA
-ATCTCTCTTCCAATACAGAAATGCGATGGCTTGATGTCGCGATGAATGAA
-TCCATTCCGGTGGAGGTCACGAATCGCGGCCAGCGTCTGCTCGGCCAAGT
-GAAGACCCGTCGCCATGCTGAACTTGCGATCCTTGTTCGTGTTCATCATC
-AGCTCGTATAGGTTCTCGCCATACTGAAATATGGAATTTGGCTGAAGTTA
-GGCAACGAAAAATGGTACCAATGGCATCACAATGAAGAGGAAGCGATTTG
-GAACCGTGCCACGTTCCTCGATATTCGTGAAGAATGGAGATGGGTGGTGG
-ATCGACGCGAGGACAACTGACATTTGACGAAGAAGCTGGAATTTTTTTTG
-CTCTCTAGAAACGGTTTTCACGGCGGCCGACAATTTCCGAGTTTGGAAAC
-TCACTGCACTTAGTCATGTAATTTTATAATGAGTGGCTAAACTCGGAAAT
-TGTCGGCCGCCGTTAAACCACAAGACAGTTGGTTCCTTCGCCGCGACCGA
-CACTTTCCGGGTTCCGCGCCGCACTATACAGAAGGCTGGCTGCGCGAGGC
-AGGCTAGACCGCGGCAGGTGTTTTGGCGCCTACATGGACTTGCTAGCTTG
-TCAACAAGGCAGCCTAAGCGTGCCTGCAAAAGGTAGGCAGGCACGCTTCT
-AAAACCGTGCCAACACACCATAAATAACTCACCGAGCTCTTCATGTTCAA
-CGCCTCGCATTTGACCGCAAAAAACTTCCCATCACTCTCGCGTTTTACCT
-TGTAAATCGAGCCGAACGTGCCCGTCGCCAGCGGTTTCGTGACTTCATAG
-GTGCCGTTTTGTGCTCGAATGAGCTCCTTTTGCGGTTGTCCAGGTCCGAC
-TGACGTCATTGATTTAACACCGAAATGTCACGATTATTCGGAAGTGAATC
-GATAATCGAAAATCGGAGACTCGAAACTTTTCGAAATAGATTTTATTATC
-TTTGTAGGGTTTTTGGAGTTTATGATGATAATGAGGAGGGGGGATTTTAT
-GTGGATTAAGAGGCTACGAGGAAAATATTTATTTTTTAAATATTTTATTG
-TCATTCTTTTCTTTTCTAGATTTTCACGTTTCTTATTATTAAAAAAAAGT
-TTTTCAGAATTTATTTCAAAATCCCGAACATAATCTGAAATTCAGAAATA
-CTACAAAAGAAAAACGAAAAAAAAACTGAGAAAAATGGTCCAGATTCTCC
-AGTATTGTTAGGCGTACCCCCCCCCCCCCCCTACCTACCTACCTTCCTTC
-CTCGCCTACATGCATACCTGCCTACCTACACGCCTGAGTGCCTGCCTACC
-TTCCTGCCTACGTTTATGTCTACATTTTTTGCCAGCCTTTTGCCAGTATA
-CTTTACGTGTGTTCTTAATTACGTGCCTATCTACTTACCTTTCTTCCTCG
-CCTACATGTATACCTGCCTACCTACACGCCTGCGTGCCCGCCTCCTGCCT
-ACCGACTCACCTACCTGTTTGCATACATGCCTGCCTACCTTCTTGACCAT
-GCCGAGGCGCCTATCTTACTACTTGCCTACCTACACGCCTGTCTATTGCC
-TACCTGTTTGGTTACATGTGCCTGTGCCGTACCTGTGCCTCAAAAACATC
-TTTATTTTGTAATAAATAATTTTAATAAAACTTTATAAAACAAAAAAAAT
-ACAAAATTGAAAATAACCTAACAAAAAGTCTTTTCAAACCCCTTCGAACT
-GCTCAACTGATAAAAATTCGTGTTATACTTCAACAATTTGAACTGCAAAT
-CCGATTTGACACAGCTAAACTTGTATTTTGTCGCTTTATTCCTGCACAAA
-TGTGCTCCTGGGCAATTGAGACTATTCGAATCGGTGTAGTAGGTGGTGAA
-GCTCTTTGAGCATCTTATTGTAGAGTGATCTTCTCGAAGACGGCCCAGAA
-TTGCGGTGATTGAGGGATTTGTGATGGTTCTGGGGATTTGATGTAATAAA
-TTTAAATTGTGTGGTTTAGATGCAGAAAAAAAAACTAAGAATTCAGACTA
-AGACTTGAAAAAGAGCCAAGAAAAGGGCGGAGCCTATTATCGATTTTTCC
-ACTTGCCGTTTATGAAGTTTATCTACACTTATATAGTCTATTATCAATAC
-TAAGTTAAACAGTATATGGTATAATAAATACTATGACTGCAAGAAAAATC
-AATAATAGGCTCCGCCTCTATATTTGTTTTTTCTCGTTTTAAATCCAAAC
-TTATTCTACGCCGAACCTATATTCTTTTATATTTTTTGAAATTATATATC
-CTTCTATTTATAAGATTTTTCCAGCCAAATTTTTTTTTCTCAGAAAAATT
-GAGTTTCCCGCCAAAATGGGTTTCTCAAAAAATTTGAATTTCCCGCCAAA
-ATTTTTTTTCTCAGAAATTTAAAATTTTCCGCAAAATTTTTCTCAGAAAA
-TTTGTATTCCCCGCCAAAAATGTTTTCTCATAAAACATGAATTTCCGTCA
-AAACTTTCTCATAAAATTTGAATTTCCCGCCAAAATTTTACGAGAAAATT
-TGAATTTCCAGCCAATCTTTTAATGAGAAAGTTTGAATTCCCACCAAAAT
-GTTTTTTTTTCTCAGAAAATTTGAATATTCCGCAAAAATGTTCTGAGGAA
-AATTGAATCTCTAGCCAATTTTTTCTCATAAAATTTGAATTTCCGGTCAG
-CTTTTTTCTGAAAAAGTTTGAATTTCGCGCAAATTTTTTTTCTCAGAAAT
-TTTAAACCTCTGGCTTTATTTTTCTCAAAAAAATTAAAATGTCCTGCCAT
-TTTTTTAAAAAAAAAATTCACAGAAAATTTGAATTTTTAATTTTAAAATT
-CACAGAAACTGACTTCCTTATCGACATGCCAATTGTCACACGATCCGCTG
-ATTTCAGAGCTTCACCGCCCGTAAAATTGCCACGTATCATTGAATCCACG
-TCAGCAGAGTCGGGAATTTCAAAAATTTTACTATCATCCATTTGTTTGCT
-GGAAGCGTTAATTATCGATTTTTATTTTTTTATTCGTTATATTAATTTTA
-TTCATATTTTTTGAAAAATAAAATCAATTTCACTCTCGGATTTCTGGCTT
-CCCTCATAAAATGAAATGAAAGAGTTTGCCGAACTAGGCCATTTTGGCTC
-GGACATATCTGGGGCAGATTTACGGCGCGTTGCGTCGCGGCTCGTTAAAA
-ATAGATTTATTTGTCCGTGTGGAGTACACGACCTTCTCACGCGTTGTCCG
-GCAGGCAATTGTCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAAT
-CCCGTGTTCACTGATTTTTTGAATTTACAATTTTTAAAGTATCGAATAAA
-AATTTTAATTGAAAAAATCGATTTTCAAAAAGTTTTAAAATTTTTTTAAA
-ATTTGAATTTAAAAATCGATTTTAAAAATTATTGATTTTCGAGCAAACCT
-TTTCAATTTGTACGGATGTTCCACGGGCTCATTGAGCCAAACACTATCGA
-TTAAAGATGGGCGTGTCACCACTTTTGCCACGCCCCTTTCATTCCGATAT
-TCCAATAACCCGACGAATATCTCTGATTCGTAATAGTTGGCGAACTCGGA
-AAAATAGGAATCGAACGATTTCGGCACGAGAAGATCAGACCACTCGAGAA
-ATGTGATGAAGCTCCCCGAGCTCTGAAAGTTTGGATAAATAGAGTTGTGA
-GCCTAGTGCAAGTTGAAAAAATCGATAAATTATCGATTTTCTGATTGTAC
-GAATTTAGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTC
-AAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAAA
-TTTTGGCGGGAATTCAAATATTCTGAAAAAAAATTTGCCGGGAATTCAAA
-ATTTCTGAAAATAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAATTT
-TGGCGGGAATTCAAATTTTCTGAAAAAAATTTAGGCGAGAATTCAAATTT
-TCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAAATTTTGG
-CGGGAATTCAAATTTTCTAAGAAAAATTTTGGCGGGAATTCACATTTTCT
-GAGTAAAACTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAG
-AATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGAA
-AAAAAATTTGCCGGGAATTCAAAATTTCTGAAAATAAATTTAGGCGAGAA
-TTCAAATTTTCAGAGAAAAATTTTGGCGGGAATTCAAATTTTCTAAGAAA
-AATTTTGGCGGGAATTCAAATTTTCTGAGTAAAACTCTCTGGCGGGAATT
-CAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTCAGAGAAAAA
-TTTTGGCGGGAATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAA
-ATTTTCTGAAAAAAAATTTCGGCGGGAATTCAAATTTTCAGAAAAAAAAT
-TTTGGCGGGAATCCAAATTTTCTGAAAAAAAATTGGCCGGGAATTCAAAA
-TTTTTGAAAAACATTTTCGGCGAGACTTCAGGGGTTCTCATAAGAATTCA
-AATTTTCTGCAAAAAATTTTGGCGGGAATTCAAAATTTCTGAAAAAAAAT
-TTGCCGGGAATTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAAT
-TTTCTGCAAAAAATTTTGGCGGGAATTCAAATTTTCTGCAAAAAATTTTG
-GCGGGAATTCAAATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTC
-TGAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGA
-GAATTCAAATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGA
-AAAAAAATTTAGGCGAGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGA
-ATTCAAATTTTCAGAGAAAAATTTTTGGCGGGAATTCAAATATTCTGAAA
-AAAAATTTTGGCGAGAATTCAAATTTTCAGAGAAAAATTCTGGCGGGAAT
-TCAAATTTTCTAAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGTAAA
-ACTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAA
-ATTTTCAGAGAAAAAATTTTGGCGGGAATTCAAATATTCTGAAAAAAAAT
-TTGCCGGGAATTCAAAATTTCTGAAAATAAATTTAGGCGAGAATTCAAAT
-TTTCAGAGAAAAATTTTGGCGGGAATTCAAATTTTCTAAGAAAAATTTTG
-GCGGGAATTCACATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTC
-TGAGAAAAATTTAGGCGAGAATTCAAATTTTCTGAGAAAAATTTTGGCGG
-GAATTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAATTTTCTGC
-AAAAAATTTTGGCGGGAATTCAAAATTTCTGAAAAAAAATTTGCCGGGAA
-TTCAAAATTTCTGAAAATAAATTTTGGCGGGAATTCAAATTTTCTGCAAA
-AAATTTTGGCGGGAATTCAAATTTTCTGCAAAAAATTTTGGCGGGAATTC
-AAATTTTCTGAGAAAAATTTTGGCGGGAATTCAAATTTTCTGAGAAAAAT
-TTTGGCGGGAATTCTAATTTTCTGAGAACATTTTTGGCGGAAATTCAAAT
-TTTCTGAGAACATTTTTGGCGGGAATTCAAATTTTCTGAGAAAAATTGTG
-GCGGGAATTCAAATTTTCTGAGAAAAATTTAGGCGAGAATTCAAATTTTC
-AGAGAAAAAATTTTGGCGGGAATTCAAATTTTCTAGAAATCAATTTTTTC
-AGAATTTCAGAAAACACCACCCCGGCTATCAATGGAGCGCATTTTCAAAG
-TCTCACTTTATATTTATTCAGGCAATCCGAATTTGCAACAGTGACACCTC
-CGAATTCAATTCCATCCAATTTTGATTTCCCATAAAAATCTGGAAACGAG
-TCAACTGATATTCCTTTGAGACGCTTCAACTCTTCTAGAAATTCGAAAAA
-CGGGCGACTTGTAGTTGCCACGTATGTTTGGAGATGGCCGCCGAAACTGG
-AAAAAAAATTTAAAATAAACTGACAAGTCTATATATTTTTTCTTTAAATT
-TTTTTAATCGAAAAGCACCCCTATTATATAAATTCTTTTTTAACCTACCA
-TTTTTAATAATTGATGGCCGAGTTTTCTTTTTTAGGCCATGTTCAAAAAG
-CCGGTCGGTACCGGTTTTTGGTGACCGAATTTTCAAATTTTCTAGGCCAC
-GTAGAAAAACCAGGTCTTCTTTTCACACATTGATTGTTTAATTTTCTCAA
-AGAACCCCCTCTCCTATAAAATCACGGTTAATAATGGGCGATAAGTCGAT
-GGCCGAGTTTTTTTTATATATTTCTAGGCCATGTAGCAAAAACTGACCCT
-TTTTAACCCCAGAATGTTCTCAAAAATCGTATTTTTTAATTGTGGAAAAG
-CCCAGAAAATTATGTATGCTGCAAAATCACAAGTCGGCGGCCGAGTTTTC
-TCTCTTCCTAGGCCACGCTGCAAAAACTAACCTTCCGTTTACATATTGAC
-TTTTTCAAATAATTTCAAATAAAAATTATTCACTTATAAAATCATTTACT
-TCATGATTGAAAGCTTTTGCAATTGGTTAAAACCGGAAATAAGTCGATGG
-CCGAGTTTTCTCTTTTCTAGGCCACGTACCAAAAGTGTCCCTTTTTTACC
-CCAGAATGTTGTCAAAAATCGTACTTTTTATTTGTGGAAAAGCTCGGAAA
-ATTATGTTGTAAAAAATGAGTCAAGTCGGTGGCCGAGTTTTCTCGTTTTC
-TAGGCCACGCTGCTTAAACTGACCTTCCATTTACATTTTGGCTTTTAAAT
-TCAAATAAAAATTATTCCCTCATAAAATCGTTTACTGTCATTGTGAGAGC
-GGTTAAAAACAGGAAAAAAAATGGTGGCCGAGTTTTTTTTTCTAGGCCAC
-ATAGCAAAAAACTCACCTAGTATACACATGAGCAGCTAACAACACATTCT
-GCCATCTAACATTATTATAAATAGGCGGAGTACATACAACCAAATCCTTC
-GGCTTATTATCCGCCGGCAAATATCGAATTTTCGCGGTATGCCCATTCAC
-AAGAAGCTCCAGCTCCGTGAGCTCTTCCTCAAGCACTATAGTACCCACAA
-GTGTCACGTATTTGCATAAATTATGCGGAGTTGCTCTGTGAATTTGAAGT
-GGTTCGAGTACGGTTTTTGTGTCGTCACTTCGGATTGCGATAATCTTACG
-ACGTTCCCAATGTGCATCCCGAGGCGCGATAAAGGTTAGTGTTACTTGGT
-TTTTGTAGAGACTGAAAAATTTCAAAAAACTTAAAAACTAACGTAGTTTA
-AAACATTATTCTTCTTTTTTTATTCTGAGATATTTTGATTTTGAAAAAAA
-AAAATTTTTTTTACGAAAAAAAAATTGGCAAAATACCTCAAAAACTGTGA
-GTTTGTTGAAATTTAGTTTTTACAACCACGGGAATTAATTTTTTAAATTA
-AAAATATTTTACGTGTAGTCCTCTCGAATAATTTTGAAAAATATATGAAG
-TGTTGAATTCTGCCGAGTTTTTTTGTCCGAGTGGACTACAAAAGTGCAAA
-GAATTTGGAATTTTTCAAACTTTATATTTAACAGCAATCATCAACAACTT
-AAAAAAATTTAGATTAAAAAATTTTTTTTGGAAGTTTTCGAAAAAAATTT
-TGGAAAAATTTTTAATTTTCAGAAAAAAAAACCAGTTTGATTTTTTTCTT
-AAATTCTTTTTTGAAAATTTGTTGAAACTTTTTTTTAAATGCTAGACTTT
-TTTTTTGAATTTTCACGCGGTTCTGGTTTCCCTCATATTTTGAGATAGAA
-GAGTTTGCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTT
-ACGGCGCGTTGCTTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAA
-TGTATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTAGGCGATTAT
-CAATGGAGCGCGAAAAATGCAATGAGGAAGGCCAGAACCCCGTGAAAAAT
-ACATTTTAAAAAATACTTGAAAAATGTTTAAATTTTCTTTTTAATTTTAA
-ATTTGAAATTTTGTAACTTTACAAAAAAATAATTTTTCGAAATTTTTTTC
-AAATATTTTTTTTCGAATTCTTTTTGTTGAAATTTCAATTCTCTGTTCTA
-AAAATCAATATTCCTTACCTGTATCCCACTCCATAATAGTACGCAGAAAC
-AAAAAATAGGTCTTTCTCGTCGTTATCCAATTCTTTAATCTTATTAGTGT
-ATGAATTTCGAACACGTCTTAATGCAGGCAAGGGATGTATTGAAATATGT
-ACAAATGCTAATAATATTACAAATAGATATAGGGTCCTGCAACGAATTAT
-CAACTGCTCGTAGAGTACGGAATAGGGTTTGAATTGAAAATTGTTCAGTT
-TCGTGTCGGAATTCATTTTTATTATGGGGAGGAAAACAATCTAGTGTGGT
-GGTAGTGGTAATGACAATCGCTATTTGAAATCATGTTGAATAGCTGCGAT
-AAGTATCGGGCGCCAGCGTGGCCTAGGATTTGGGAAAACTCTTCCACCAG
-AAGCTAGTCGTGGCCCAGGCTTTGAAATTTGATTATTTGATCAAGAAATT
-TACAACTAAATTTAAAATCAACAGTTAAGACATTTTTCATAGACTTTTCG
-AAAAATTTCTGATTTTTCCATATCAAATAACCTCGGTACGCATCTAACCG
-TCAGTTGCCTCGTGGCCTAGAACTTTTGAAAACTCTTCCACGAGAAGATC
-ACCGTAGCCTAGAAAGTTTTGAAACTTGTGTAGTTCGCTTGGAATTTTTT
-TTTGGTTTTTTTGTCAACTAACTAGGTTCAATAGCTATTAAAAAGTTGCA
-AAATTGGGCAATTTTTGTAAAAATTCACAATTTTGAAACTTCTCTAAAAT
-TATTAATTTTGTAGTAAGAGGACTCAAAATTGATCTTCAAACACTAAAAA
-ATAGCCCCTTTTTAGAATATAGTGGTTTCGAATATTTTTTGAAAAATTAT
-TTTTTTTTACCCAAAAAAAAGGACAGTCATGGCTGAAAAAAAATTTGGAA
-AAAATAAAAAAATTGTCTAAATTTGTTGAAAACGGGTAATTCATGCATTC
-TGAATTCAGAAAATCTAGGTTTAACCCATCAAAAACCATTAAAAGCGGCA
-AAAATGGGTATTTCATTGTAAAAATAATGCATATACAATAAACAATGTAG
-AGGAATGTTCAAAATCTGTAGTTTTTTTGAAATTTTTTTTTTATTTTTTG
-GTTATTTTTTTTGCAAATTTTCTCGTATATTTAATTAGTTAGTTTGCATG
-TTACATGCTAATGAAAAGGTTTTTTTTGCATCCTGATACATATAAAAACC
-GAGAAATTCACAATTTCACAATCAGTAAGGTATTTAATTTTTGTTAACTT
-TAGTCTTCTGCTCCTCTAAAGCTTCTGGAAGAGGACACTTTCTAAATTTT
-CAAAATATTTTTTGCGCCACTTTCCTGTCAAATTTCTGGCATTATTACAT
-CCAAAACCCAATAAAAATCGGAATTCCATAGCTACGACAACGTCAGCAAA
-AGCGGAAAGAAATTTTGTTTGCCTGTCTAACGAGTCACAAAGCATACACT
-GACGTTTCTATCAGAAAAGACAGGATTTCGTATCAAAACAAAAATTGGGT
-GCGATTGCTCGATGCACCATGTGATATTTTGCTTTTTTTAAAAATTATTT
-TGCTCGTAATGTATGGTGCACTTATTCCGTGGCTGCAGAATTTGCACGCG
-GTGTCATAATGCCCATTTCGACTTGATCTACGTAGATCTACAAAAAAATG
-CGGGAGTTGAGACGCAGAGGTAGGGCTCAACTGATTTCGTTTGGTTAAGA
-GCGTGCTGACGTCACATTTTTATGGGCAAAAAATTCCCGCATTTTTTATA
-GATCAAACCGTAATGGGACAGCCTGACACCATGTGAATGCAAACTTTACG
-CGAAAATTTTTAGATTTTTAATAATCTTAGAATTAGCTATGGTTTTATAG
-AATAATATCAAAATTATCCAAAAAAAAAAACACATTTTTTCAAAATTTTA
-GATTTCCAGTTTCTATTTGAACTTTAAAAGACTAATCCAAATTTTGTTTT
-GTTTCAACGATTTTTCATTGATCTCTCCAAAGAATTCATTGAAACACATC
-ATTCACAAAACTAAAAACTCCCCGACTTGGCTTTCATTCCGAGATGACAA
-ACTTTTTGGTGGCAAAGGTTCTTTGGGGGCATAGTATCCAAGGAGACAAA
-GTATCCAGTAGACAAACTGGGGTGTATCTTGGGGGGCATATCTTTGGTGA
-CAACCTTTTTTTCGACTAGATTTTTATATGTATTTTTCAACTAATTTTTG
-TTCACATTTTTCTGGAATAAGTTTTTTAATGCAATTTTCAATCGATTATC
-GGTTATAATTCCCTCACAATTGAATGTATGAACGATGGTCTTTTGGGAAA
-AGCTGTAAAACGTCCAACTAACTTGGAATATCGTGAGGCTCTTCCTGATG
-GTCTGATCCTTCAGCTCCGAAGGATCACATGGGTACCTTCTGATGTTCTG
-ATCCTTCAGATAAGAAGGATCGTAAGGGTACCTCCTGATGGTCTGATCCT
-TCAGATCCAAAGGATCACGAGGCTCTTCCTGATGTTCTGATCCTTCAGCT
-CCGAAGGATCACATGGGCACCTTCTGATGATCTGATCCTTCAGATAAGAA
-GGATCGTAAGGGTACCACTTGATGGTCTGATCCTTCAGCTCCAAAGGATC
-ACGAGGCTCTTCCTGATGTTCTGATCCTTCAGCTTCGACAGATCATATGG
-ATTTTTGACAAAATTTGAAAAAAAAAATTTTGAAAAAAAACTCGAAATTT
-TTTTTTGTTATTCTTCATTCTTTAAAGAATAGTTCAAATTTATCATGATA
-GGACCGAAAACTTTCAAGAAACAGTATAACTATACATGATAATCAGCTTC
-TACCAAATAATGATAAATTCTCCGCGATGACAAACTTTTCGGTGACAAAG
-TATCTTGGTGGACAAACAAAAATTACCGAAAACTGATGTAAGGAATAGTG
-AAATAGAGTCCTATGGACTATTAAACATGTTCAGTAGGTGTATTCAGGAC
-TGTCCGTCAAAATAAAAAAAAGTTTGTCAGACGAAGTTCGAACCTGGGAC
-CTGTAGGATGCAAAGTGCGCTCACTACCACTACACCAGCTATGCGAAAGT
-CGGCGAGCCTCATCGAAGGCTATTATAAAACTTAGTTCGCACGAGTATGA
-TCGACATTCAACAAACAGTAATATCTCTCAACAAGAATTTCTTCATGGAA
-TTGAGGTCATTTGACTATTTTTATCGGTTTTTCAAGTTGAGCATAGGGTC
-TTTTAATTTTTTGAGCATAGAAAATCATGAAAGCTGCCTGTTCCTTGTAT
-CCTGGATCGAAATAGACGTATCTGGCCTAAAATATTTCCTGAACAGTGAT
-CATTTCATGTCCATTGTGTGTTTCTCTGTATTTTGAACCAGAAAGTTGAA
-CAAAAATGATAATATTATATCGAAAAATGGAACAAATACAAATAATTTTT
-AGGCCTAATCAAATTTCCTCCGGATATTGTTTTTTTTGTCATGATTATAT
-GTGTCTAAATTTTTTATAATGTGTTTTATAACAAAATTCGTCATTATTTC
-CTTCATTTCAAGCAAAATTTAACAGTTCGAGCTTAAAAATAGATGTTGCA
-AAAAATTTAATTCGTTTCGATGAATACGGTATACGGTCGGTGTTTGCGTA
-CTTTGGCGTTTGCGTATGAAGCATCCTATTTGACGCACGAAACTTTCAAT
-GAAATTTAATGCAAATTCTGCATCGAAAAGGACATTACGATGGAAATAAT
-GACGAATTTAATTATAAAACACATTATAAAAAATTTAAAAACATATAATC
-ATGACAAAAAAAACAATGTCCGGAAAAAATTTGATTAGGCCTAAAATTTA
-TTTTTTATTTTTTTCCATTTATCGATTCAATATCAACATTTTTGTTCGAC
-TTTCTAGCTCAAAATTCATAGAAACTCACGATGGACATGAAATGATCACT
-TTTCAGGAAATATTTTAGGCCAGATACGTCTATTTCGATCCAGGATACAA
-GGAACAGGCAGCTTTCATGATTTTCTATGATCAAAAAATTAAAAGACCCT
-ATGCTCAACTTGAAAAACCGATAAAAATAGTCAAATGACCTCAATTCCAT
-GAAGAAATTCTTGTTGAGAGATATTACTGTTTGTTGAATGTCGATCATAC
-TCGTGCGAACTAAGTTTTATAATAGCCTTCGATGAGGCTCGCCGACTTTC
-GCATAGCTGGTGTAGTGGTAGTGAGCACACTTTGCATCCTACAGGTCCCA
-GGTTCGAACTTCGTCTGACAAACTTTTTTTTATTTTGACGGACAGTCCTG
-AATACACCTACTGAACATGTTTAATAGTCCATAGGACTCTATTTCACTAT
-TCCTTACATCAGTTTTCGGTAATTTTTGTTTGTCCACCAAGATACTTTGT
-CACCGAAAAGTTTGTCATCGCGGAGAATTTATCATTATTTGGTAGAAGCT
-GATTATCATGTATAGTTATACTGTTTCTTGAAAGTTTTCGGTCCTATCAT
-GATAAATTTGAACTATTCTTTAAAGAATGAAGAATAACAAAAAAAAATTT
-CGAGTTTTTTTTCAAAATTTTTTTTTTCAAATTTTGTCAAAAATCCATAT
-GATCCGTCGAAGCTGAAGGATCAGAACATCAGGAGGTACCCATGTGATCA
-TTCGGCTCTGAAAGATCAGATCATCAGGCAGAGCCTCATGTTCTTTTGGA
-GCTGAAGGATCAGAACATCAGGAAGAGCCTCATGATCCTTTGGATCTGAA
-GGATCAGACCATCAGGAGGTACCCTTACGATCCTTCTTATCTGAAAGATC
-AGATCATCAGAAGGTACCATGTGATCCTTCGGATCGGAAGGATCAGATCA
-TCAGGCAGAGCCTCATGTTCTTTTGGAGCTGAAGGATCAGAACATCAGGA
-AGAGCCTCGTGATCCTTTGGAGCTAAAGGATCAGACCATCAGGAGGTACC
-CTTACGATCCTTCTTATCTGAAGGATCAGAACATCAGAAGGTACCCATGT
-GATCCTTCGGAGCTGAAGGATCAGACCATCAGGAAGAGCCTCACGATATT
-CCAAGTTAGTTGGACGTTTTACAGCTTTTCCCAAAAGACCATCGTTCATA
-CATTCAATTGTGAGGGAATTATAACCGAAAATCGATTGAAAATTGCATTA
-AAAAACTTATTCCAGAAAAATGTGAACAAAAATTAGTTGAAAAATACATA
-TAAAAATCTAGTTGAAAAAAAGGTTGTCACCAAAGATATGCCCCCCAAGA
-TACACCCCAGTTTGTCTACTGGATACTTTGTCTCCTTGGATACTATGCCC
-CCAAAGAACCTTTGCCACCAAAAAGTTTGTCATCTCGGAAAGAAGGCCCC
-CCGACTTTGCGCGTAAGATATGGTGAGACCCTAATACATCATATTTGACG
-CGCAAAATATCTCGTAGCGAAAACTACAGTAATTTTTTAACCGTCTACTG
-TAGCGCTTTTGTAGATTTACGGGATCTCGATTTTTTTAATGATTAAAATT
-AAACAAAAAATGAGAAAAGAACACGAAGAAACGAAGAAAAATGAAATATC
-GATGTCACTTTTCGGAAAAAAAATTAATTTCAAAAATTGAGCCCGTAAAT
-TTACACATGCGCTACGGTAGGCATTTAAAGAATTACTGTAGTTTTCGCTA
-CGAGAAATTTTGCGCGTCAAATATATCGCACAATACGCATTCTCAGAATT
-TTGTGTTCCCGGAATAATTTATTTATTGGTTTTTTTGGTTGTATTGGTCC
-CAAAAATCAACAAAAAAAAATTTTTATGAAAAATTTCTGTTTTCTTCCGT
-TTAAAATCAAAAGTTGGTTTTTTTTGTTGCTTTTTTTGATAAATTTTTGC
-AACCACCCTGATTTATATTCCCATAAATATTTAATGTCCCGCTTATGATA
-TCTACTGCTTCTTTGCAAAATTCCTACCTGCGGACCAAATACACCATACT
-TGACGCGCACTTTTTTTTTGATTTTCAGCTGGACAAACACATTTTCAGCA
-TGATTCTGACTTATTTATTTAACTCTTATCACTCTTATCGTTAAAAAACG
-CCCTTATAATCATCAACCTATTTTCATTGTCATTCAAAAAAAAAAACTAT
-TTCGTACTCGTCGATCGTACTAATTTGTCATCGTTCCGTTCCGTCGAGCA
-AAAATCAATGTAGTTTTACGTTTTCCGTTGAAAAAAAATCCAAAAAAAAA
-TCCAAAAAAAATCCAAAAAAAAATTCCTTGTTAATTAAAACCGTGAATAA
-AAAATTCAAATAAAAAGTTCAAACGTTTCGTTATAAAAATGTACACCGGT
-AAGCTCAAAAATATACATTTCAGATTCTAACAATGTGCGACGATACGCTC
-GCATTTTGTAGTCCAGCTCCATTCAGTGATGATGTAGAGGTTATTAAACA
-ACGTGAGGCGATCGATTATTCCACACAAATCACTCTGGAAGATGCGATTT
-CTGGGAACGGTAAGTGCGCTCCGTTGTACTCATAGTTCGCTGAATGAAGG
-CATGTATAAGTTCTCAAATTTTCAAATGAAAATTGCCAAAAAAGGTTTTT
-AGTTAAAATTTAAAAAATTATCGATTTTTAAATTTATGAAAATTTTTTCG
-AAAAATTTGTGTTTTTTGTTTTTGTTTTATTGATTTATTGATTTTTTGGC
-GAAAATGTGAAAAATCGAAAAATTATGGATTTTTTCTTGGAATTAAAAAA
-AAAAAACTTTATCGGCTAAGCGAAACTTGCTTTTTCGGTTTATTGATTTA
-TTGATTTACTTGAAAAAGTACTTGAAAAAATCAATACTTTTATCACGGGG
-ATCTGGTCTTCCACATTAAACTTTTCGCGCTCCATTGAGAATCGCCCGCC
-GGACAACGCATGGGAAAGCCGTGTACTCCACACGGACAAATACAATTAGT
-TTTACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGCCGTAAATCT
-ACCCCAGATATGGTCTGGTCTAGTTCGGCAAAAACTCTTCCATTTCAATT
-TATGAGGGAAGCCAGAAATCTTTGTTTTTATTTTATTTTGAAATCTCTAA
-ATTATCGATTTTTTGGAAAAAAAGTTGTTTGAAAATTCGATAATTTTTTA
-ATGATTTTTTGGAAAAATTAAAATTTTCGCTTTTCAAAAAAATCAAAAAT
-TATTGATTTTTGAAAAAAAAAACACGGCATGCAATTCCTAGACCACCAAT
-CAAAAACCTCTTCCAGTGACTCGTCCGGTCCGTGTCTACGCTGACGGTGT
-CTACGATATGTTCCACTACGGCCACGCGAATCAATTCCTGCAGATCAAAC
-AAACTCTTCCGAATGTCTACCTTATTGTTGGCGGTGAGTTCGGCCCGCGA
-AATTCAAAATTTTTAATTTAAAAAAAAAACGATTTTTTCCAGTATGTTCC
-GACGAAGAGACTATGAAGAATAAGGGGAGAACTGTGCAGGGCGAAGAAGA
-GCGGTACGAGGCGATTCGGCATTGCCGGTACGTCGACGAGGTGTATAAGG
-CGTCGCCGTGGACATGTCCGATACCGTTTTTGAAGGAGTTGAAGGTAAAT
-TGCGCGTGAGATTCGGTGTTTGCACAGTTTTATCTCCAAAAACGAAGGAA
-ATTTTATACCTAAATTTCGGAAAAAAATCAATAAATTATTGCCTTTTTTA
-AACGTCACAAAATCGATAATAATTTGAAAATCACAATTTTTTTTTTATTT
-TCAAAATTTCGTTGTTCTATCACGGGAACGCAAATTTCTGAGAATGCGTA
-CTACACAACACATTTGACGCGCAAAATATCTCGTAGCGAAAACTACAGTA
-ATTTGTTAAATGACTACTGTAGCGCGCTAGTGTCGATTTACGGGCTCTAT
-TTTAAGCTCAATTTTAATTTCTATCGATAAATATATGATACAAAATATTG
-ATCCCGTAAACCGACACTAGCGCGCTACAGTAGTCATTTAATGAGTCACT
-GTAGTTTTCGCTACAAGATATTTTGCGCGTCAGATATGTTGCGCAATACG
-CATTCTCAGAATTTTGTGTACCCCGTAATAAAAATTCGAGTTTTTCTAAA
-CAAAAAGTTTAATTTAAAAAACCTCTAATATTCGAGATATTCGATTGGCG
-ATTTATTGATCTATTGATTTTTCGATAAATATTGATTTTTCAATTTTTAC
-AATATTCGAAACAATTATCGAAATTTCAAAAAACTAACAAAAAATATTTG
-CGGAGGAAAATCGATAACTTTTCAATGTATATTTTCTGAAATTCCATAAA
-ATTGATTTTTCTAAATTTAATTTGTTCGATTTTCGGGTTCTCGGTTTTCC
-TAATTTCTGTAATTTTGAGTCGATAATTTTTTGTTTTTTTTTTTCAATTG
-AAACTTTTATTGATCAAGGATTTCTGGCTTCCCTCATAAATTGAAATAAG
-AAGAGTTTGCCGAACTAGGCCATTCTGGCTCGGCCATATCTGGGGTAGAA
-TTACGGCGCGTTTCGTGTCGCGTCGCGCCTCGATTTTAGTTGTAAAACTA
-AATGTATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCA
-GGTGATTGTCAATGGAGCGCGAAAAATGCAATGAGGAAAGCCAGAACCCC
-GTGATTGATTATTGAGTTTTGGAAAACTATTTTAAAAAACCTGATTTGAA
-AGAAAATATCGGTAATTTTTCGGATTTTTAACAAGAAAAAGGTTTTTATT
-TCCGGAAACTTTCATTTAATAATTATTTATTTATTGATTTCTCGGAAAAA
-TTTGCCGAAATCTATCGAACTATAGTCGAACAATTGGACGAAAAGTCGAA
-AAAAAAATTCTAGGCCACGAATTTCCTCTTCCAGGTTGACTTTATGTCAC
-ACGACGCTCTGCCATACCAAGGTCCCGCCGGAGAAGACATCTACGAGAAG
-CACCGCACTGCTGGCATGTTCCTGGAGACGCAGAGAACCGAAGGAATATC
-GACGAGCGATTCGATTTGTCGAATTATCCGCGACTACGACACGTATGTCA
-GAAGAAATTTGCAGAGAGGATATTCGGCCACCGATTTGAACGTTGGCTTT
-TTTACAGTGAGCCTGGCCTAGAAAGGGGTGGCCTAGAAAGAGGTGGCCTA
-GAAAAACAAAACTCTTCCATTTTTTTCAGACCAGCAAATATCGTCTGCAA
-GACACCGTAGTGGGAATAAAAGAAATGGGCCGTGGCCTGCTGCAAACGTG
-GAAAACGAATGCGGATTACTTGATTGAAGGATTCTTGACGACATTTGCCA
-TCAGTGATCCGAAACCGTTGCCGAACAACAAAAGTGCCGATGAAAATGTG
-GAAAATAGGGAGAATATTGAGAATTTTTAGAAAAAATTCGTGTAAATTAT
-GGGAATAAAAATTTGAATACTCGTGAATGTTTACTGAATTTATGCAATTT
-ATTTTTTGAAATTTTCAATTTTTTTGGAAAATTTTTTTTTCTTAGGCTTA
-GGCTTAGTCTTTGGCTTTGTTTTAGGATTAGGCTCAGGCTTAGGCTTAGG
-CTTAGACAAAAACTTAAGCTTAGGCTTAGGCTTTTGATTAGGCTTAGGAT
-TAGTCTGTCTTTCACTTAGGTTTGGCGTCATTGGCGAGCGTTAGCTCGCT
-ATTTAGGCTTGGGTTAATTAGGCTTAGGCTTAGGCCTAGCTTTAAACTTA
-GGCTTAGGCTTAGGCTTAGAATCAGGCGGGCTAGGGAAAAAAAGAGAAAT
-TCCAAAAATTCCAGAAAAAAGGAAAAAAGGTACATCCCGAAGTCGGGTCA
-AAAAATAAAGTGAAGAAATGAAATTTTCACGAAAATGAATGAATATTTTT
-GAGTCTCGCGGATTTATTTTCATAATCATATTCTGAACGTATTATTGACT
-CGTCGTGTGGGACATTTCAATGGATTTTCCGTAAAAATCTCTGTAGAATT
-CCGCATCGGTCAACGATTCTTCACAAGAGCCAAACTCGGCGAGTCGGTCA
-AACAAATGTTTGAGCTCCTGAAGAGTAGTTCAAAATTATATATGAATTGA
-TTTATCTTGCAAACCTTTCTCCGTTTGTCGGTAAAAAGTCCTTCGGGGCA
-GATTTCCGTATCAATCAGACGATTTGCAATGTATACAATCCACATGAGAT
-TTGTTCGCCTTGAGAATTTCTCCCAGTTGCCCCTGGAACGTTAATTTTTC
-TGAATTTCTAGAAAGGATATAGAAATAGCAACAAAAAAAAAAATTTATCC
-AAATAATGAGCTATTTAATGTAGTTTATATTACTACAAATACTTTTCTCA
-TAAGAACGTCTTGTTCTTGATAAATGTGTGCTTTAAGAAAAAAAAAAGTC
-AAAAATAGAGTCCTGAGATGTCGGGCGTTGTACCTATTAGGGGTGTCAAT
-AAGTTCCGGGTCAAAATTCATAACTTTTTTCGTAGCAAATCGATTTTCTT
-GAAAATGTGGGAATTTATGTTATCAAACATGGTCTTTCATTTGACGGCAC
-TTTCAAAAAGTTTTGACCACTCCATGTACCCTAGCTCGGATCCACTTTTT
-TCAGGCGTATGCCCGATCTCGCTTCTTTGTAACTTTCAATTGAGACTTAT
-GTGCGGATTTTGATTTATTAAGTATACAATGTAAGAATACAATAAAAATT
-TGAGAAAAAATTCGTTCAAAAAAACAATTTTTTTGATCGGCAAAAAACCC
-TCGAAAAAAATTTTGTCGAAAACTCTTGATTTTTTGTACAGGAATGATGC
-AACCAATTCTGAACAATTTTTTAACACATAAAAGTTTTGAATTTAAGGCG
-TCACACACAAGCGGCAATGGAAAAAATGATTTTTTAGTGAATTTTTTGAA
-ATTTTTGAGAAATTCTCGAAATCTAAATATTAAATTCAAATGTTTTGTGT
-GTTGAAAAATTGTTCAGAATTGGTTGCATCACTCCTGTACAAAAAATCCA
-GAATTTCCGACAAAAATTTTTCCGAGGATTTTTTTGACGAACCAAAAAAA
-TTTGTTTTTTTGAAGGAATTTTTTCTCAAATTTTTATTGTATTCTTACAT
-TGTATACTTAATAATTCAAAATCCGCACATAAGTATCAATTTAAAGTTTC
-AAAGAAGCAAGATCGGGCATACGCCTGAAAAAAGTAGATCCGAGCTAGGG
-TACATGGAGTGGTCAAAACTTTTTGAAAGTGCCGTCAAATGAAAGACCAT
-GTTTGATAACATAAATTCCCACACTTTTAGAAAAATCGATCAGCCACGAA
-AAAAGTTATGAATTTTGACCGGTAACTTATTGTGCTACATGCTTGTTGCG
-AAATATACCTATTTACCTATACCTATACCTATACCTGCAATTTTCTCTCA
-TCTCTCGATATACTTCAAATTGTGGAGCATCTGGTCCTTCAAAAATCGTC
-GTATCCTCTTCCAAATCCCAGTAGATAGTTGTCGAATCTAAAATTATATA
-TTTTTAATTATAAATTGTATATTTTTTTAATTTAAAAAATAACAAACCTT
-TCGAAATGCGGCTAAGTGTGAAATCAATAATATTGACCTTAATTCCATGG
-GTCCTCAGTGGAATTTTCTGCCCATGCACAGTGTAGGAGAGCTCTTCCAC
-TCCGTTCCGATCGATCAGCACATTACTAAGATTTAAGTCCCTGTGCTCGA
-ATTCAAGAGCTGCTTCAGCTGCAACCATTGAGAGAACGAGCTGGTGAATG
-ATGGAAAATAGTTCATCTTCACTTTCAAGGACAAAATCTGCCAGCGAGAT
-TCCACCATTTGCCGAGACGAAAAGGATAAAGTTTTGATGTTCTGAAGAAT
-AAACATCTGGCCTCAAATGTTCGGATTCATTGAGCTTATCGTAGGCATCC
-CAAGCTCTCAGTAATCCCTTAGGATATTCCCCCATGACTATTTGGGCTGA
-AATCATTTCGATAAAATTCGGCGTAGAATTCCAAGAATTTGGGTCTCTCA
-ACGCCGACAGTTCCTTCATCACAATCACCTCTGACAAAACGGCGTGGGTT
-GTTGGAATTTCCACGGATTGATTTCCATAGAAACATCCGTTGTTTTCGAA
-TGGCAAAACTTTGATAGCAACCGGTCTACCATTCCAGACAGTTGAGAAGA
-CTTCACCGTACGCTCCTTCGCCGAGCTTCTTCACTTTTCGAGCATCTAGC
-GCCGACGTTGGTAGGCTACCCCATGGTTTTGCTTCTTTTTGGCCAACAAC
-ACGGAGAAGTTGTGCCATGGACGGATCTTTATTGTGAAATGTGATACTGC
-CAATGGGGATATTTCTAGAATCAGGATGAGCTGACCGAGCACTTGGAGCT
-CTTTTGTTCAGTTCAGCAAGCATGCACAGTTCGAAAGCATGCACAGTGCG
-AAAATGACTTTTCTGAAATTGTCATCAAAAGTTCATTTTGAAAATTCGTT
-TCGGCAAAAAATGCAAATGCATTTCTGAAACTCACCAGTTGTCTCTGAAA
-TCGTCGTTCGTTGGTCATGTCGAGTGCAAGAACGGTGGTGGTGACCACTG
-CCGTCTTCGTGAACCGCATCCAAGACATGTTTCGGGAGATAACTATAGAA
-ATGAAGTTTTGAAAAAAAAACTCAAGACCACAATTATTGAAACACGTTAT
-TAGGCCAATAACTTCACACGTGAATTAATACATTATTCATGTATTTTTCT
-TTGACTGTTATCACGGGTTTCTGGCTCACGGTAGTTCAGCCACGGTAGCA
-CAGAAAATAGATGACCACGTTCATGATAATCAGTCTGAAACCTATATTGG
-CTGCTATCTCGAAAACTCTCTAAAAACGCGTTTTGAGAAATTATTGATTT
-TTTGGAGAAAATCAGAAATTATTGATTTTTTGGAGAAAATGGGAAATTTT
-TCATTTTTATTGGGGAAAATCAGAAATTATTGATTTTTGGAGAAAATCAA
-AAATTATTGGTAATTTGAAGCAGGGGTGGGCAGCAATTGCCGTTCGGCAA
-ATACGCAAATTACCGGTGTGCCGATTTTCCGGGAATTTTCATTTTCGGCA
-GTTTGCCGGTTTGCCGATTTGCCCGACATTTTTCAATTTCGGCAATTTGC
-CGGTTTGGCGATTTGCCCGAAATTTTTCAATTTCGGCAATTTGCCGGTTT
-GCCGATTTGCCCGACATTTTTCATTTTCGGCAATTTGCCGGTTTGCCGAT
-TTGCCCGAAATTTTTCAATTTCGGCAATTTGCCGGTGTGCCGATTTGCCA
-AAAATTTTCATTTTCGGCAATTTGCCGGTTTGCCGATTTGCCGGAAATTT
-TCATTTTCGGCAATTCGCCGGTTTGCCGATTTGCCCGAAATTTTTCAATT
-TCGGCAATTTGCCGGTTTGCCGATTTGCCGGAATATTTCATTTTCGGCAA
-TTTGCCGGTTTGCCGATTTGCCCGAAGTTTTTCAATTTCGGCAATTTGCC
-GGTTTGCCGATTTGTCGAAATTTTTCATTTTCGGCAGTTTGCCGGTTTGC
-CGATTTGCCCGAAATTTTTCAATTTCGGCAGTTTGCCGGTTTGCCGATTA
-GCCCGAAATTTTTAAATTTCGGCAATTTGCCGGTTTGCTGATTTGCCAGA
-AATTTTTCAATTTCAGCAATTTGTCGATTTGCCATTTGCCGGAAGTGTTC
-AGAAGGATTTTTTTATAATAAGGAACCACTTAAAACTGTGCCGTTTTGAA
-ACTTTTCCCCGTTTTTTTAAGATGATTTCATAGAATTTGCTTACTTGGTT
-TGCCGAATTGCCAGAAGTTTTTCAATTCCTACAAGTTGCCAATTTGCCGG
-AAACTTTTTAATTATGGCAATTTGCCGGTTTGCCGATTTGCCAGAAATTT
-TTCAAATTCGGCAATTTGCCGGTTTTCCGATTTGCCGGAAATTTTTCAAT
-TTCGGCAATTTGTCGATTTGCCGGAAAATTTTTATTTATGGCAATTTGCC
-GATTTGCCGGAAAAAAAATCGTTTCCCGCCCACCCATCAGTTGATGAGTT
-CATCTTTTTTTTGTGTCTCTCCCATCAATCTTAAACTCGACCCGGACTGG
-CAAACGCATATCTACAGTTTTCTCTTCTTAAAATGGTGGTCTTAAGTTTC
-GAAGACTATGCGTAATTTCTAGCGAAGTGGCGAATTTATGATGATTTTGC
-AATTTATCAATGAAAAAAACAAAAAAAGCATTTCCGCGTGGCAAATTATC
-ACTGTTGTGCCGCGAATAGTACTGATATAATTTTTTTTTAAATTGAATCA
-GTTTGGAATTTCGAATTTTTGAAACAACCGCCGGCAAAATGAATAATATA
-CTGTGAGTTTTCAAAGATTGTTCCCCGGTTTTCTTGTAGATTTTTGTGCA
-ATTTCAAAATTTCGACTTTCAGCGGAAACAAAAATACAAAAAGGTCGAAG
-AAGAAGGACGGAAAGTTTACGAGCAACACTGCTACTGATCTTGTTGAGGC
-CCCAAAACCAGGTGGAGCAAAAGGATCCAAAAAACCAAAACCATCGAAAG
-GAAATGACGACAGGGGACGCGGCGAACCGGAAATGACTGCACAATCCAAA
-AAAACCAAGAAAGCAAAAAAAGTGAGACAGAAGAGAGATACAAAGGCACC
-GGTGAGTTCAATTTTATAGTTTTATAGATATAATTGTATCAGGGGTGGGC
-GGCAATTGCCGTTCGGCAAATTGATTTGCCGCCAAATTCGGCAAATCGGC
-AAATTGCCGGTTTGTCGATTTGCCGGAAATTTTCAATTCCGGCAATTTGC
-CGGTTTGCCGATTTGCCGGAAATTTTCATTTTCGGCAAATCAGTTTTGCC
-GGAAATTATAAGACGGAAACACTGTCTTTTTGAATTGTTCCCGTTTTTTC
-TACATATTTTCATAGAAATTCATAGAGACAATTTGCCGAAATTTTTCGGC
-AAATTGCCGTTTTTCCGGCAATTTACCGATTTGCCGGAAATTTCCATTCC
-GACAATTTGCCGATATGCCAATTTGCCGGAAAAAATCGTTTGCCGCCCAC
-CCCTGAATTGTATCCCTTTTTAGTCTCCTGCAATGTCACCTCGATCACGT
-GAAATGCTGTCAGACAACAAAAAGACGACCGTTGAGGATGATCCAGCAGT
-TCCAATAACAACAAGTGTCGCTGGAGCAGTCACTTCTACGATTCCTGCTC
-TCATGTCCACTGAAAACGCGTTTCAGCCACCCAAAGACCTTATCTCGGGA
-AGAAAGCCAAAAGGTGCTCCGAACTTGTCTGGCAGCGTTCCACTTTCACA
-CAAGAGCTCACTGACTGGAGGTGCAGATAAGTGGGTTGGAGAAGCCGTGG
-CAAAGAATTGGATGGATTCGATCGGTTAGCATCCTTTTTTTTTTGATTGG
-AGGCCCCGGCGGCGTAAAAATCGTGCCAGAGTTGCAAGAGTGGGCGTTTT
-TTTTTGTTTTTCTGTTGTTGGTGGGGCCTTATTATTATTTGGTCGATGGT
-GATTTTACTTTACTGGTGGAAATCCGCTAATAAAACTAAAAACATCGGGA
-TATAAATAAAAACCCAACTTTAAAAAGCGAACCAATCAGCAGTTTGCTCC
-GCCCACTATTCAACCAATCCAATGATTGGTTCGAAATTGGGTACTCATTT
-TAGAGGGAATTCAAACGGAAGATTAGCAAGTTCGGTTATTGTTTCATTAG
-AATATCATTGCTTATATATATATTTAAAAAATAGTGTACGTCATCAATGG
-GCGGAGCCTCTCCCATCGTGGTGAGACCCATCGTGGTGAGACACATCGTG
-GTGAGACCCATCGTGGTGAGACCCTTCGTGGTGAGACCCTTCGTGGTGAG
-ACCCATAGTGGTGAGACCCATCGAGGTGAGACCCTTCGTGGTGAGACCCA
-TCGTGGTGAGACCCATCGAGGTGAGACCCTTCGTGGTGAGACCCATCGTG
-GTGAGACCCCCATTAATTTTGGCGTGAAATTCAAATTTTCTAAGAACAAT
-TTTTTGGCTTTTTTTTTAAAGAAAAATCTGGAAAATTCTAGCATTTTTTT
-AGAATAATCTGGAAATTTCTTGAACTTTCTAGCTAAATCTGGAAACTTCT
-AGAATTTCCTAAAATAATCTGGAGACTTCTAAAAAAGATCAGGAAATTTC
-TAGAACTTTTTTAGAATCTTCTGAAAACATCTTTCTAGAGTATACTAAAA
-ACTTCTAGAATTTTCATAAAATTCCGCGAAGCTCGAGGAAGAGATTTGTT
-CAAACAATTTAATGTGGAGCCAGTCGGAGCACGCGCTTTGCGCGTGCGAA
-CGGCTGGTTTTAGATATTTTGTAGTATTTTTCAAATCTTAAATTTTCAGA
-CACAGCAGAGGTGAAAAAGGAATACGATAAACTGCAATCACAGAAAATCG
-ATGTGGAGAAGGACTGTAAAACCTGGAAATCCAACCCAAAATTTAACCAA
-TCGGAAGACTTTCCTGCCTTGGACTCCAATCTCGTGAAACTTGGCAAAGA
-CTATGTGAACATCAGTCTTGTAGATGTTCCATTGGGAAGAAATGTTCATC
-TCGGTCAAGCTCCGGTCACGAATACGGAAGAAACATTCTGGAAAGCTGTG
-TTCGACAAGCGAATCACTCACATTGATCTACTCGTCGGCGATGAAACCAT
-CGAATTCTTCCCTAAAAAGGCAGAAGATTATACAAATTATGGTCAGATGT
-GGATCAATAACCGCCGTGTCGAGTATGTCAATGACGATGTGTACCGATTT
-GCAATTGAAGTAGTGCCCCACGGATGCTCCAACTCGATCATCTGCAATGT
-GACTGTTATCAGCAATTGGAAAGTGGACACTGTGCCTTTGAAACAAGCAA
-TCGCCATCAAAGAGGCACTTGGTCTAAACTACTTCTTGCTGAAAGCACCC
-GCTGACGAGCATGCGATGATCGTCTCACCACGTGGAGCTGGACGAGCTGG
-CTACTTTTTGGCACTTGCGGTTGCAGTCAACACAATTGATACAAAGCTTG
-CCGAACCATGTATTGCGGATATTGTCAAATCGATTCGCTCCCAGAGACCA
-AGAGCCGTGGATTCATTTTGTCAGTACTGCTCCCTGTACATTTCGTTGCT
-CTACTTCATCAAGGTATTGGTTTTTGAATTCTTGTAAAATGAGAGAATAA
-TTCTCAAATTTACAGAAGAAAGTGACAAAACCAGCAGAAGGGGATAAAAA
-GCCAACACTGAGCAACAAATACATCTACAAGAAGTCGGTTGAGTTGACCA
-AGCAATTCACCGTTCTCCTTCTCGAAGCGAGTCAGCAAAGTGTGATGGGA
-CCTGGATAGTTCTTCTCCATTTTGAATATGGAAAAGCATTTGAAGTGATC
-TGGGTTTGAAAATGAAGAATTTTATAAACCCTGGATTATTTCCGAAATCT
-TGCTTCCTGCCTGCTGTCTCATTGCGGCTTGATCTGCAAAAAAAGCGGTA
-ATATCTCCCCCAGGAAAATGTGACGTCAGCACACTCTTAACCATGCGAAC
-TTAGTTGAAACGTCTGCGTCTCTTCTCCCGCATTTTTCGAAGATCACACC
-AAAATGGGATACTTTGACAACACGTGCCTGCCATCGCTTCCTGACCGGGG
-ATTTTGTTAGAAAATTCGTGGAAAATAGGAAGAAACATTTCGAGAAAATG
-GAATTATTGATTTTCTGATTTTCTCAAACAAAAAAAAATTAAAATCGATT
-GATTTCTGGCTTACCTTACCTAAATTGAAATGGAAGAGTTTGCCGAACTA
-GGCCATTTTGGCTCGGCTATATCTGGGGTATATTTACGGCGCGTTGCGTG
-TCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTG
-TGGAGTACACGACTTTCACATGCGTTGTGCGGCGGGCGATTGTCAATGGA
-GCGCGAAAAATACAATGAGGAAGGCCAAAACCCCGTGTATTGATTTTTCG
-AAAATTTCGGAAAAATCTCTTTGTTTTATTCATTATATTTCTCCTAATTT
-CTTTGAAATGTTCAAAAAATCTGATTTTCTTTTTTTTCCCGAATTTTTGA
-AAAATCGATATTTGCTATCCATATTTCTCGAAAAGAAAATCGATTTATTA
-ATTTTTTTCCGGTTTCCTGGAAGCTAATCAATTCAGAAAAAAGAATTAAG
-CTATGAATATATACTTATAAAAGTCGTAAAAGGTATGGAAATATAAATTA
-TTTTAAAACAGCGATTTCTGACTGAAGCATCTCAACTACCAGGGCCTCAA
-GTTCTTCTTATCCGACAAATGAGACGAGTCGGAGCTATAATTGTGCCGAT
-ATTTTCCGGGCGCCGTCTCTTCGAACTCGGATACGGTAGCCTGCCCGACG
-TATTTGAAATCGCCCATTAGCACTTCGTGGCAAGCGCCGATTGATGCTCC
-GTGGCCGACGAGTAGGAGGTTTCCTGAAAGAAAATCGATAATTTGCGGCG
-TGTTTTTATTGATTTTTATGTGAAAATTGGCAAATTATTGATTTTTCGGC
-TGAAATCATAAATTACTGATTTTCTGTTAAAATCAGTAATTTATTGATTT
-CTTCGGCTAAAATCAGAAATTATCGATTTTTCTGTGAAAATCTGAAATTA
-TTGATTTTTCTGCGAAAATCAGAAATTTACGTAGTTTCGCAAAAATTACC
-TTCATATTTCTCGAAAATCGCCCGCAGGGTCTTTCCGACACGTGGCACAC
-ACGCGTCATCTCCACATCCTTCGCGGGGTAGTGTGTACTGAAAAAAAAGT
-TCGGTAATTTTTCTAGGTCTCGCAGCGATTGCCGCCACCGGTATATTTTC
-ATTTTTCCAACTATAGCGCCAGCACCGGCGCCGGCATCTTTTTATTTTTC
-CACGTAGCACGTCGGCGCCGGCAGCCGCGCAAACTATTTTCGCCGCCGCC
-GGCATCTTTTTATTTTCCACATAGCGTGCCAGCGGCGCCGCCGGCATATT
-TTTATTTTTCCACGTAGCACGTCGGCGCCGGCAGCCGCGCAAACTATTTT
-CGCCGCCGCCGGCATTTTTTACTTTTCCACGTAGCGCGCCAGCGGCGCCG
-CCGGCATGTTTTTATTTTTCCACGTAGCGCGCTAGCGCCGCCCCCGGCAT
-CTTTTCATTTTTCCACGTAGCGCGCCAGCGCCGGCAGCCGCGCAAACTAT
-TTTTCGCCGCCGCCGGCATCTTTTTATTTTCCACATAGCGTGCCAGCGGC
-GCCGCCGGCATATTTTTATTTTTCCACGTAGCGCGCTAGCGCCGCCGCCG
-GAATTCATTCATTTTTCCACATAGCGTGCCAGCGGCGCCGCCGGCATCTT
-TTTATTTTTCCACGTAGGGCTCTAGCGCCGGCGGCATTTTTCATCTTTTC
-ATGCAGTGCGCCAGCGCCGCCGCCGGCATCTTCTCATTTTCCACGTAGCG
-CGCTAGCGCCGGCGGCAGCGCAAACCATTTTTCGCCGCCGCCGGCGCCTT
-TTCATTTTTTAATTAGTGCGCCAGCGCCGCCGCCGGCATCTTTTGATTTT
-TCCACGCAGTGCGCCAGCGCCGGCAACGGCGCAATTCTAATCTCGGTCTT
-TTTTGAGCGATACCTTCGAGAAAACAGGAATATAGTCCAAATCAACAAGC
-GGAAATTTCTCAGCTAGTTTGTCGGTTTCCCAGAATCCAGGAGGCTTATC
-ACAAAGATAAAGTGCCTCACAAAGGCCACCGTCCGCCTTCACTTTCATTC
-CTTTATCCTCAATAATCGTCGAAGCTGTCTCAATTGTCCGATCGAACGGC
-GAGGCAAACGTATGCGAGATTTGTGCATTTTCGAACCGATTTTTGCACTC
-TTTCGCCTGTTGCCGACCGCGCACGCTGAGCATCGAATTGTCCGACGTGA
-GACCGTCGGCTCCGTCGAGTTTACGCCAATTTCGATTGATATTGTCCTCG
-CTGCAATGCAAAAAATCAATAATTTCTGATTTTCACCGTAAAATCAATAA
-TTTCTGATTTTTGTTGAAAAATCATTACTACCGATTTTAACTGAAAAATC
-AATAAATTCAGATTTTCATTTTTTTTTTCGAAAAGTCGATAATTTCCAGA
-TTTTCATCGAAAAATCAATAATTTGTGATTTTCACAAAAAATCAATAATT
-TCAGATTTTTACCGAAAAATTGATAATTTCAGATTTTCACCGAAAAATCA
-GAAATTATTGACTTTGGATAAAAATCAATAATTTACTGATTTTCATCGAA
-AAATCAATAATTTCAACCTTTCGCAGAAAAATCGATAATTTTTAATTTTC
-ACCGTAAAATCAATAATTTCTGATTTTCACCAAAAATTAATAATTTTAAT
-TTTTTTTTCGAAAAATCAATATTTTCTAATTTTTATCGGAAAATCAATAA
-TTTCCGATTTTCACCAAAAAATCAATAATTTCAGATTTTTATCGAAAAGT
-CAATAATTTACGAATTTGACAAGAAAAAATCAATAATTTGCTGATTTTAA
-CAGAAAATCAATAATTTTTGTTTTTCATTGTTTTTTTTTTCGAAAAATCA
-GTACTTTTTTAATTTCCCCAAAAAATCAATAATTTTTGATTTTATTTTTC
-GAAAAATCAATAATTTCAGATTTTAACCGAAAAAATCAATAAATTCAAAA
-AATTTCATTTTTTTTTTGAATTCTTAAAAGTACCGTTCCGCGTGTCGAAC
-AATCCAAATTTTCCGTGGATAAGTGATCGGCATCCTATCGAGATCGGTTT
-TAGCTGAAAAAAAACCTTAAAAAATTGGAAAATTGTGTACTCCTCTCGGA
-CACGTGGTGTCAGGCTCTCCCATTACGGCTTGATCTACAAAAAATGCGGG
-ATTTTTCGTTCTTAACCATACGAAATAAGTTGAGAACTCTGCGTCTCTTT
-TCCCGCATTTTTTGTAGATCAACGTAGATCAGACCAAAATGAGGCACACT
-GAATGAAGACACCAGGATTTTTCGAAAAACTCTAAAGAAATTCTGCAAAA
-AGTGACGTCATGAGGTATATAGGTATGAAATCGAATACTTGGTATCAAAT
-GACGGAAAAATAAACGAAAGTTGCAAAATTTTTTGATGGAATTTATTAGA
-CTTTGGCGGGAAAACAGATCAAATTTACATTAAAAAATACGGGAAAAATA
-CGGGGAAAAAAACCAAATTATTGCCTAAAAAATTCAGGATTAAATTGCGA
-GTTGTACTTTTTCTTCTTTCCACGCTTCTCCTCCGAATCCTCGGCGGCTT
-TTCGTTTCTGCAGCAGCTCAATTTCCTCGGGATGTAGCAAAGCATGGGCT
-CTCGCTTTCTCGACTCGTTCCCGTTTCAGACGCTCGTCTCGCATGCTCGC
-CAGCTTCTGCCGTCGTTCTCGATCGTATTCCTCTTCGAGTTGACGTTCTT
-CAGAGCTATCACGGTGGCGGTGCTTTTCTGGAAGAAAAATTGGGGGGTTT
-TTTTGTAGTTTGTAGTGGTGAGCACCCTATATTGGAGGCGCGAAAAAAGA
-GATTTTTCGAATTTTTTTGTAGATCAACGTATGGTTAAGAACGTACTGAC
-GTCATATAATTTTGGGCGAAAAATTCCCGCATTTTTGGTAGATCAAACCG
-TAGTTGGACAAAAAGCAGATTTTTCGAAAAAAAATTACGAATTTCTGGCT
-TTCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGG
-CTCGGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGG
-CTCGATTTTAGTTGTAAAACTAAATGTGATTTGTCCGTGTGGAGTACACG
-ACTTTCCCACGCGTTGTCCGGCAGGCGATTGTCAATGGAGCGCGAAAAAT
-TCAATGAGGAAGGCCAGAACCCCGTGGTGGTTCGATGCACAAAACTGATT
-TTTTTTTTGAATTTTTGGGATTGCGCAAGAAATTTCGCCGAAAAAGTCGA
-TAACTCAAAAAATTCTAAAAAATTTGGATAATCTGGAGAAAAAACCCAAA
-ATTTGCTGAAAATTTCGAAAAATTTAGCTTTAAATTTTTGCGCATGGCCG
-CCGGAAAAGAAAAAAACTCGGCCACCAATTTTTTGGCGGCCATGATGCAA
-GACACCATATTTGACGCGCAAAAAAAGGTGTTTTTGGATGTTTTTTTCTT
-TTTCCGCCAGAATTTTTAATAAATTTCCAGGGACAAAAAATCATAACCTG
-TTGCAAAAATGTTTTTTTTTTCGAAAAATTCAATTTTGCGCGTCAAATGT
-GATGCTTTAAGCTCTGTGGCCGCCGAAAAAGAGAAAACTCGGCCACCAAT
-TTTTCACTCTCCATTGACAATAGCCTGCTGGACAACGCGTGGAAAAGTGT
-CGTGTACTCCACACGGACAAATACATTTAGTTTTACAACTAAAATCGAGC
-CGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCTGGC
-CTAGTTCGGCAGAAACTCTTCCATTTCAATTTATGAGGGAAGCCAGAAAT
-CCGTGGCCGAAAAAGAGAAAACTCGTCCACCGATTTTTTTTTCTGACGGC
-CATGACAAGTTTGCGCGTCTATAATACATCATATTTGACGGGCAAAAAAT
-TTTTTAAAGTTTTTTCGAATTTTTGTGATTTTCGAGCAGAAAAAAAAATT
-GTCTGAAAATTTATGTGGCCGCGGTAAACTTCGGCCACCGATTTTCGACG
-ATTTTGCCCGTGTTTTTGACGGAAAAAGCACCATATTTGACGCGCAAATT
-TTCAAAAAAAAAAAAGCCCAAAAATCGCACTTTTCTTCTTCTTCTTGTCT
-TTTTTATGCCGTTTCTTCGCCTTTTCTTCACTATCACTATCCTCTCGTTT
-CCGCTTCCTCTCCTCTTCCAGCTCTTTCCGCTTCAAACACGGCAGAGCAT
-CGCGCGCTTTTCGTCGATCAAGTGGCTCGGCGGCTCTTCGCAGCGGCAGC
-TCCTCGTACCACTCTTTTTTCTTGTTTAAATCGTTCGTATTATCCGCGAA
-ATACACCTGAATTCCCATTTTCGACTCCCATTCCTTCTTCTCGGCAGCTT
-TTTCCGCTTCGTAGTCGCGGTTTCCGGATCCATAGTTTTTTCGTTCTTCA
-CGTTCGAGATCCTGCAAAATATCGATTTTTTTTGGAGAAAAATATAGTTT
-TTTTTTGGAGAAAATTATCGATTTTTTGGAAAAAATTATCGATTTTTCGG
-GGAAAATTAACGATTATTTTAATAGAAAATTATCGATTTTATTTGGGAAA
-AAAATCACTGATTTTTTGGAAAAAATTATCGATTTTTTTCGGAGAAAAAA
-TATTAAATTTTTTGCAGAAAATTATCGTTTTTTTTTTTGAAAAAAATTAC
-CGATTTTTCAGAGAAAAATATCGATTTTTTAGAATAAAATTATGGATTTT
-TAAATATAAAATTATCGATTTTTAGGGAGAAAATTATCGATTTTTTTTGG
-AGAAAAATATTGTTTTTTTTTGGAGAAAAATATAGATTTTTTTGAAGACA
-TTTATCGATTTTTTGTTGATAAAATTATCGATTCTTCGGGGAAAAATATA
-GCTTTTTTTGGATGAAATTATCGATTTTTTGGGAGAAAAAATACCGATTT
-TTTTGGATAAAATTATCGATTTTTTTGAAGAAAAAGTATCAAATTTTTTG
-AAGAAAATTGTCAATTTTTTTGGAAATAAATATAGTTGTTTTGGATAAAA
-TTATCGATTTTTCAGCTAAAAATATAGATTTTTTTAGATAAAATTATTGA
-ATTTTAAAAAGAAAATTATCGATTTTATGGGTAAAAAATAACGATTTTTT
-TGGAGAAAATTATTGATTTCTTCGGGGATAAATATTGATTTTTTCGGGGA
-AAATTATCGATTTTTGGATAAAATTATCGATTTTTTGGAAAAAATTATGG
-ATTTTTTTTGAAGAAAAATATTGATTTTATTGGAGAATAATATCGAATTT
-TTTCGGGAAAATATCGATTTTTTGGAGAAAATTATCGATTTTTTTTGAGA
-AAATTATCGATCTTTTGGGTAAAATTATCGATTTTTTGAAGCAATTCTGA
-GCCAAATTTTGAATTTTCGAGCGGCAATTTTTGCACAAAGCATCATATTT
-GACGCACAAAATTCGAATTTTTCAGAATTAGTTTCACAAAAAATCCATCT
-ATCACCTGAAACAAGTTCACATGTCCCGTTTCATCTGAAATGCTGACATC
-TTTTGCTGCTCCAGCTGAGCTCGAACCAGCTCCTCCACTAAACATCGTCT
-CCATTCGTTGATCGGCTCGGGCTCTCAACTGCATCAGGCGCCGCTCGTTT
-TCCGCCTGAATTTGCCTGTCGAGCACACGCTGCTCATCTTCGGCGGCTTT
-TCGCTCGTCTCGGCGAACCCGTTCCATGTTGGATTTTGTCCGAACGTGCC
-ATGATTTGTGATGGAGAATGTTCATCTGGAAGCGGAAATTATAGAGAAAA
-AATTGATAATTGTGCTCGAAATTTGGCTCTGGAAGAAGCGCAAAAAATCA
-ATAATTTCGTCCAAAAATCTATTTTTTTCAGAAAAACCAAAAAGCGTTTT
-TTTTTCCAAAAATAAAGATAATTTTCGTCCAAAAATCGATAATTTACTTC
-TAAAAGTCTCAATTTTTCCAACAAAAAAAACAATTTTCGTCGAAAAACCG
-ATGTTTTCAGAAAAATCAAAAATCAAAAAAAAAATTAAAAAATTAAAAAA
-AAATCAATAATTTTTTCTAAAATCTTGCAATTTTTTTCTAAAAATCGTTT
-AATTTTCTTCTAAAATCGATATTTTTCCGGATTTTTTCGTGAAAAAAATC
-GTCAATTTTATTGAAAATTTTGCTAAATTTCGAAAAAAAATCTTGAAATT
-TCGATGCACCATGATTTTGAAAATTCTGCTCCGGATCAATTTTTCGAGAA
-AAATTATCGATTTTTGGAAACTATCATACAAAAATCGATAATTGTGCTCG
-AAATTTGGCTCTGGAAGGAGGAAAAATCAATAATTTTCTTCTAAAAATCG
-ATTTTTTTTCCAAAAAATCAATAATTTCGTCGAAAAACCGATGTTTTCAG
-AATAATCAAAAAAAAAATTAAAAAATTAAAAAAAAATCAATAATTTTTTC
-TAAAATTTTGCAATTTTTTTCTAAAAATCGTTTAATTTTCTTCTAAAATC
-GATATTTTTCCGGATTTTTTCGTGAAAAAAATCGTCAATTTTATTGAAAA
-TTTTGCTAAATTTCGAAAAAAAATCTTGAAATTTCGATGCACCATGATTT
-TGAAAATTCTGCTCCGGATCAATTTTTCGAGAAAAATTATCGATTTTTGG
-AAACTATCATACAAAAATCGATAATTGTGCTCGAAATTTGGCTCTGGAAG
-GAGGAAAAATCAATAATTTTTTTCTAAAAATCGATTTTTTTTCCAAAAAA
-TCAATAATTTCGTCGAAAAACCGATGTTTTCAGAATAATCAAAACAAATT
-TCAAAAATAATAAAAAAATCAATAATTTTTTCTAAAATTTTGCAATTTTT
-TTCTAAAAATCGTTTAATTTTCTTCTAAAATCGATATTTTTCCGGATTTT
-TTCGTGAAAAAAATCGTCAATTTTATTGAAAATTTTGCTAAATTTCGAAA
-AAAAATCTTGAAATTTCGATGCACCATGATTTTGAAAATTCTGCTCCGGA
-TCAATTTTTCGAGAAAAATTATCGATTTTTGGAAACTATCATACAAAAAT
-CGATAATTGTGCTCGAAATTTGGCTCTGGAAGGAGGAAAAATCAATAATT
-TTTTTCTAAAAATCGATTTTTTTTCCAAAAAATCAATAATTTCGTCGAAA
-AACCGATGTTTTCAGAATAATCAAAACAAATTTCAAAAATAATAAAAAAA
-TCAATAATTTTTTCTAAAATTTTGCAATTCTTTTTTCTAAAAATCGATAT
-TTTTCCGGATTTTTTTCGTGAAAAAAATCATCAATTTTATTGAAAATTTT
-GCTAAATTTCGATAAAAAAACGATTATTTTGAAATTTCGATGCACCATGA
-TTTCGAAAATTCTGCTCCGGATCAATTTTTCTAAGAAAATTATCGATTTT
-TGGAAATCATCACACAAAAACCGATAATTTTGTGAAAAAATTCGATTTCG
-ACGCACCATGATTTCGAAAATTCTCAGAATTTTAGAAAATTTATCGATTT
-TGTGTAGAAAAAATTCGAATTCCAGTGGAAAAATTTTCTTTTCTCAAAAA
-ATGTTTGATTTAAAAAAAATCGATTTTTTCAGAAATTCAGGCATTTTTTT
-GCAAAGTAAATTGGCAAAAATCGATGATTTCACTGTGAGAATGGGAATTT
-TTGTCAAGAAAAATATAAAAAATTGCCTTAAACAATTAAAGTGGTTGTCA
-AAAAATTGAAATTTTGGAAAAAAAAATATATTTACAGATGAATTTATTAG
-AAAAATTCCACAAAAAAAGAGGTTCCATCTAATATTATTATGTCGCATTG
-GGGGTTATATCACATAATTTTTTTTTGTTTCGGTTGCCGTGGAGAAGGGG
-GAAAATATCACATTTTTCAGAGGAAAATCACAATAAATATAAGGAAAATT
-TACAAAAAAAGGCGCGGGGGGAAATTTCTTCACAAAATTATCGATTTTTG
-GGTGATAATTTCCAAAAATCGATAATTTTTATAGCAAAATTGATCCGGAG
-CAGACTTGGGATAAAGCAATTTTTGGAGGGGGAAAATGAACAAATTAATA
-AAATATAATATATTCGGGGCAAAAAATGGGAAATAATTAAATTGTCGGAA
-CATATAAATGATTAATTGATTGAGCCAATGGCATTGGTTTCATGTGAGCC
-AACGCTTCATTACAGAACACTTCCTCCCGATGACGTAGCGGACGAGAATG
-CTCGACACGAGCAAGACGGTAGGCTCTAGAGGCGTTTATCTGGAAATTTT
-TAGTGAAAAAATGAAGAAAAAAAGCTTTTTTCGCTGAAAATTCCAAGATT
-TTCGGTTTTTTTTTTGCTAATTTTTTTTAAATTTGCCTTGAAATAAATTT
-CCAGATGTTCAGTAGTTTTTTTTTCCTTCAAAAATCGATTTTTCAATTAA
-TCAAACATTTTTCAGAGTATTAATAATTATTTTTCCACCAGAATTTGAAT
-ATTTTATCCAAATTCTGAGAACCGGCTCACAGAGCGGCTTTTACTACGTG
-GCCTAGAAAAATCAAAAACTCGGCCAATGATTTATCTGGGATTTTTGACG
-TGGGATGTTTCTGAAACTTGACGAGAATGTTCTCGAATGGGGGTTCTATA
-GTTCCACCGTGGCGATTTTTGAGAAAATGTTCCGTATCCATGTTATGAAG
-GTGGCCGAGTTTTCTTATTTTACGGCCACGTAATAAAAACCGCTCTGTGG
-GCTCCTGAGCAGAATTTTCGAAATCATGGTGCATCGAAATTTCAAAATTA
-TCGATTTTTTTTTTGAAATTTAGCAAAATTTTCAATAAAATAAGAAATCA
-TGGTGCATCGACAAACCAATTTTTTCCATTTTTTCGGAATTTAAAATAAA
-ATTTAAAAAAAAGTAAAATTCTGGAATTTTACTTTTTAAAAATATTTTTT
-TCAAATTCTGGCAGTTTTAAAATAATAAAAAAACGTTTTTTTTCCATTTT
-TTTCAAAAATTTTTTTCTGAAATTTAGTACTACAAATGTAAAATTTACAG
-GGTTTTCACAGGAATTTTCAATTTTTTTGATTCGCTTTTCTTCAAAAATT
-CTAAATTTTCAGGTTTTTTTTTCCAATAATTTTTAATTTTTGTGAAAAAA
-AAATGTTTTTAATTTTTTCAGACTTAAAAAATTGTGACAACTTTTTTCAA
-TTTTTTCCGCAAAAATAAATTTTCGGAAATTTCAAATTTCCTACAAAAAA
-CCCCTTACCACAGTAAGCCTAACCAACTGTGAGAGCTCGCTCATCGTGAC
-TAGGGCTCCGTCGAAAAGCGGCCCAAACTCCAGAGCCGACGCCGTATCGA
-CGCGCACTCGAACCATCTGAAAAACCAAATAATGGAAGAGTTTTTTTTCG
-GCCAAGCCAGGCTGCCCCATTTGATCTACGTAGATCTACAAAAATTGCGG
-GAGAAGAAAAAAGAGACGCAGAGTTCTCAACTGATTTCGCATGATTAGGA
-GTGTGTTGACGTCACATTCGCAAAAAATTCCCGCATTTTTTGTAGATCAA
-ACTGTAATGGGACAGCCTGGGACCACGTGCAGTGTTAGGCTGTACCATTA
-CGGTTTGATCTACAAAAAATGCGGGAATTTTTTGCAAATGTGACGTCAAC
-ACACTCCTAATCATGCGAAATCAGTTGAGAACTCTGCGTCTCTTTTTCTT
-CTCCTGCATTTTTGTAGATCAACGTAGATCAAGCCTCTCTCTCTCTCTCA
-CCTTATCACCGACTTGCTCCAACACAATCAGAACATCACAAAACTTGGTG
-GCAATCGTTTCGCGGGTGTACACTTTCCGTGTGTTCTCAGTCCACACCAC
-ATGCACCTCATCGTTTCCGATATGCTTCCACTTCTGCTGCACATCGCCGT
-TGAGCATCGTGCTCACATGGAATATCACCTCAGCCTCGGCGTCTGCAAAG
-TACGGAGCCCGTGTCTCTACGGGCAGGCCACCGGTGTAACCATCGTGTCC
-TCGACCCACTTTGACCTCCCATCCGAGCTCCGACGTGAAGCTGTCAAATT
-GCGCGGAGGCGGAGGCGGTGGTGTTGGACAGGATCGATGCTCGATCTTCC
-TGCGATTCTCCTACATAGATCACAGCGACTTTGTGGACTTCACGAGAAGA
-AGTCTGATCTAAATGCTTCAAGTCACGCGGGAAATTCGCGTGAACCTGAG
-ACACAAGTGGGACGAATCCCAGGGAAGCCGACAGCGATCTCCATTCGAGA
-AGCTTCGCGTTCGGAGTGAACGCTGGCAAATGATCGTGAGCCGCCGACGA
-TGTGCCAAGTGGCTGTGGCTGCCGTCTAGACGTCTCAATCATCGATGTAA
-ACTGTGCGGCACCATCGACAGGCGACGGGCTCCCACGTGACGGGGGGTAG
-TCCGGTAGATCATCGAACGGATCATCCATCGCTCCGAGGATCCCCTGGCT
-TTCCCGACCGGGACGTTTTCCCTTGAGAGCCTCTTTGCGTAGCCAATTGG
-TCACGTTGGTGGCAGGCTTGCGGACATCCTCATGGGTATCTAGATCCCAG
-ATATGCCGGCCAACTACCGTTCGGGAAGTGATTTCGCAGGGGGATTTGGC
-GTGGAAATCCTTTCGGGACACCGAGATAATCGCCGATTGCCGATTAATAT
-ACACGGTTTTATCCTCTCCTTGTAGTGGCGGTGCTCCTGCAGAGCTCCAT
-CTCTGAACCTCAAAACCTCGCACCGGATACTGACCACCGAGCGTGACAAG
-CTCTCCATGGAGCACCATATGCCTATCGGCCAAGATACCGCGAATGACGA
-GTGGCATTTGAGGTTGTGGCCATTGCATACAAAGCTTCACCATCTGCCAC
-TCGATCTCGGTTCTCGTACGCTCATCGCGTAGGAGCGAGGCGGCACGGAG
-CAGCGCCTGGAGCAGTGTGGTGCTCGAGAACTGGGCGAGCGAGGCGATCG
-ACGAGCAGAAGAGCGGAATGAGCCGCATCGCGAACTGATGGGTTTCGATG
-GTTTTCAACGCGGTGAGCACCAAGTCGATTTGGGCTTTTTGCACGATGAG
-GATGGCTAGCGAGTTCACGATTACTACGGCGTTCTCCGATACGTCTGTAT
-TGACAAGCTGATCGAGAAGGATTTGCTCGGCTCCAGGATACGATGAAGCT
-AGCATTGAGAACAACTTCAACGAGTTCGAGGACACCTTCGTGTCCTTCGA
-GCTCTTCGCCGCCTGCAACATTTTCGGCAAATGCTCCAGAGCTCGCGGAG
-CAACAATTGATAGTTCGTGTGCAGAGAGCCCACAAATCGCCGGAACCACT
-AGTTGCTCCTTGGATTGCATAAGACGGATGAAGCAGAGAAGAATGTTGGC
-CGAGAGCAGTGGCGGTGGCCGACGGATCGTTGATTCGTTGAGAATTGCAC
-TTAGAGCCGGAACACAGCGGGGCAGCAGGATTGGGGGTACGGTAACGAGG
-CGGCACGCGAGCCAGTGGGCCAGTGGGTGCAGGTTTACCTGGAAAGCAAA
-ATTTTTTTTGGCTTTTTTTCAACTCGAATTTTTTTTCTAAATTTTTTTGT
-AAATTTTCTAAAAAATAATTGTTCGATTTCAGAGTGCCTCATTTCGTGCG
-TGATCTACGTTGATCAACAAAAAATGCGGGACTGATTCTGCATGGTTAAG
-AACGTGCCGACGTCCTATTTTTTGGGCAAAAAATTCCCGCATTTTTTGTA
-GATCAAACCGTAATGAGACAGCCTCACGTCGTGCCAGAAAGTCCCATTTC
-GTGCTTGATCTACGCTGATCTACAAAAAATGAGGGGCTGATTGTGCATGA
-TTAAGAACGTGCTGACGTCACATTTCGTTTGGCAAAAATTCCCCCATTTT
-TTGTAGATCAAACCGTAATGGGACAGCCTGACACCACGTGATCTTCAAAT
-TCCCGCCAGCCTGAAACCCACCAAAAGCAAGTTCTCAATCGTCAATGACA
-TGCAATCGATTGCCACGTGGGCACTCGAGTTGGTATACGGATCCACGAGT
-GAGATGACACGACGCCACGTTTGAAGCCACGCCAATTTGTCGCCAGACCA
-AGACTGAAAAAGGGAAAAAGTGTGATATGCGCCTTTAAGAAAGGGTTACT
-ATAGTTGTCAACAACAGAAAAAAATGCTGAAAAGGCATTTTTCAGGGTCT
-ATTTTCACAATGAGTTTGGGTATAAATTGGAGAGTTTTCCATAGATAATG
-CGTACTGCGCAACTAATTTGACGCGCAAAATATCTCGTAGCGAAAACTAC
-AGTAATTTTTTAAATTACTACTGTAGCGCGCTGGTGTCGATTTACGGAAA
-TTAATTAAAATAATTGATAAACAAAACAGAAACTATGTTCAAAAATCGAG
-ATCCCGTAAATCGACACAATCGCTACAGTAGTAATTTAAAAATTACTGTA
-GTTTTCGCTACGAGATATTTTGCGCGTCAAGTATGCTAAAAAATATGTAG
-TTGTGGGAGCCTTGTGAATTTTTAGAAGGTTTTTTGAAAAATAACTCGCC
-ACTATTAAAAAAAATATATATTTTGAGGCATTTTCAAAGGGTTAAAGTAA
-TTTTTTACTTTTAAAATCGTTTTTTTTTATAAAATAAATTTTAAGCGTTT
-TTAGTACAATTTTCGTAAGTTTTTCGTTTTTTTTTTGGTCATATTTTGTA
-GTTTTTTACACTATTTTCCAGAAATCGTCAGAAAAAGCACTTAGAAACGG
-GCTAGAAAAACGGGGTTTCGGCTTGCTGCGAAACTTTTTTTTTTGAAATT
-ACCGCGCAAAAATAAATTGTCATTCAAGTAATGTTGCAAAATGTATTAAA
-ATATAGGTTTTTAAAAATGTATTTTAATACAGTTGTGACGTAATTTTTCT
-ATTTCAATTTTTGCAAAATAAGAAAAAAAATGAATGTAAAAAAGTTAGAA
-AGTTTTTAAAACACATTTTATACAGGTCATTACGCTCTATTTTCTGCCAT
-TTAAAGCGAGAATGTTTTTTGACACTACATATATAATATTAGGTCTCCAA
-ATAAGATCCGGGTCAAAAATCATAACTTTGTTCGCTGTGTATCGATTTTT
-ATGAAATTGTGGGAATTTGTGTTATCAACCATGATCTTTCATTTGACAAT
-AGTCACAAAATTTTTTGGCCGTCCGAAGTGCCCGTACTCGGAGCCAATTT
-TTTCAGACATTTTTCAGATCTCGCTTCTTTTCAGGTTTCAACTGAGGTTT
-GTGTGCGGATATTGCTTAGTTTAGTACACAATGTAAGAAAACAAAAAAGT
-TTGGAAAAAAATCCGTCCAAAAAAAATTTTTTTGTCGCTCGTCAAAAAAT
-CTACAAAAAAAATTTTGTCGAAAATTCTTGAATTTTTATACAAAAATGAT
-GTAACCGTGTGCAAACTAATTTTAAACATACAAAACATTTGAGTATGAAA
-TTTGGATCTCGAGAAATACTCCAAAAACTCGAAAATAGTTCGAAAAAGCT
-GTGTTTTTTGTTATTTTTTTTAGTGTGACGCACCAAATTGAAATTTTTTG
-TATGTGTAAAAATAGTTTGCACATGGTTACATCATTTTTGTATAAAAAAT
-CGAGAATTTTCGAAAAAAAATTTTTTTGAAGATTTTTTGACAACCGACAA
-AAAAAATTTTGTTTGGACGGATTTTTTTCCAAACTTTTTTGTTTTCTTAC
-ATTGTGTACTAAACTAAGCACAATCCGCACACAAAGCTCAATTGAAAACT
-GAAAAGAAGCGAGATCTGAAAAATGACTGAAAAAACTGGCTCCGAGTTAG
-GGCACTTCGGACGGCCAAAAAATTTTGTGACTATTGTCAAATGAAAGATC
-ATGGTTGATAACATAAATTCCCAAAGTTTCATAAAAATCGATACACAGCG
-AACAAAGTTATGATTTTTGACCCGGATCCTATTTGGAGACCTAATATATA
-TATATATATAAAGATACCTACCGTAACCGCATTTGTAATATCATCAGTGT
-CATGAAAAACGTTATCCTCTGCAATTGTGTTCGACGATGACATACTATCT
-CCAGTCTCTGACGAATCATTTCTCGGGTCTTCCATCATTGCCGATTCGAT
-TGCCTGTCGTCGACTGTTCTGTGAGACTTCTGTCGCTTTTCGGAGAGCTT
-CTTCACGGGAGAATATGTCGATATGGGCGAGATGGAGGATTAATGCTCGC
-GTTACACTGTTCACAATCTGAAGATTTCGTTTTATTTTTTTGATTTTGGC
-TGGAATTTCATAAAGCTATGCTTTTGTTGAAATTTTAGTTTAAAAAAATA
-AGGTTTTTGAACTGAAAATTGGGATAAGAATTAGAAAAAAATTTGTTTTT
-TCTCTAAAACTGCTGCATTTTATTCAATTTTGTAAGATTTTCTGTACAAA
-ACATAATAATTTTTGAATTTTTTTTCCAAATTTTTTGAAATTTCAGCAAG
-AACTGGACAAAAAGCACTACTTTTACTAAAATTGGCAGCATTTAGGAATT
-TCTGAAAAAAACAATTAATTTTCATTATTATTGTCATATTACAGGAACAC
-ACTATTCTGAGAATGCGTATTACACAACATATTTGACGCGCAAAATATCT
-CGTAGCGAAAATTACAGTAATTCTTTAAAAATGACTACTGTAGCGATTGT
-GTCGATTTGCGGGCACGATTTTTTGAAATGAATTTTAATCATATTTTGAG
-CAAAAAATGGGTCAAAAATCAAGCCCGTAAATCGACACAATCGCTACAGT
-AGTAATTTAAAGAATTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTC
-AAATATGTTGTGTAATACGCATTCTCAGAATTTTGTGACTTTTCAAAAAA
-AAAAATCGTGATCAAAAAAAATTTTTAATTGTTTTTTAAGATGAAATTAC
-GATTTTTTTCGTTCTCTATAAATTTTGATCAAATTTATTTCAAAAAAAAA
-AAAAATTCTTTCTATATTTTTTTTTTCGAGTTTTTTTTTCTATCTTCTGT
-ACAAAACACAGCAATTTAAAAAAAAGGCAAAATTTTAAGATTTTTCTAAA
-TCTAGATTTCTAATTTTCCTCGGGGTTCTGGCCATCATCCTCATAAACAG
-AAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGAAACTCTTCCATTTC
-AATTTATGAGGAAGGCCAGAGCCTCGTGGAAAATTAGAAATTAGATTTCG
-AAAAATCTTAAAAGTTTGCCAATTTCTTATTAGATTGATGTGTTTTGTAC
-AGGAAATTGAGAAAAAAATCGGCAATTTTATACAATTTAATTTTAAAAAA
-TATAGTTAAAAATAGAAAAATTCAATGAAACTGGAAAAAAATGTTTACTT
-TGAAAAGTTAAAAAAAATGAAAAAAAAACTCAAAAATTGAATAAAATGCG
-GCAATTTTTGAAAAAAAAGCTTTTTTCCATAGTTTCTGTCAATTTTCGGC
-TAAGATTAATTTTTTTTCATCAAAATTTCGATTTTCATACTCTCTTACCG
-AAGCCCATTGCTCAGCCATCGGTATCCAAACACCCTTCTTCATGACGTCA
-TGCACCTCATCCCACACCTCATCGTCAATTTCGATGCGTCTGACAGCCTT
-AATCACGACGACATTCGAGATGAGTGTCGACGTAAAAGCAGCCGACACAT
-TCTGGGAAAACGCGTCCGATTGGCGACAGATTTTCGAGGCGCATGTGCAG
-AGTCCCGCCATTAATTCTGACCAGAATTTTTGGGGAAGCGGTTTTGGGAG
-TTGAATTCGATGGGAAACCAGCTGCTTGCACGATGTTAGAATCGCAAATG
-CTATGGAGATTGCCGAGGAGTGACTGGAAAAATATTTTTTTTTAATTTTT
-AAAGGGATTTTGGGAAATCGAAAAATTTAAAAACTCGGATTTATGAAGTT
-TTTGGCAAACCGGCAACTTCTGGTTTTTGGAATTTCGCCACTTTTTAACA
-ACCGGCAATTTGGCGATTTGCAAATTTTTGGAAAACCGGCAATTTATGGT
-TTTTTTTTCGGAATTTTGCTAATATTTTTAAAACCGGCAATTTGCCGATT
-TGCAAATTTTTGGAAAACCGGCAATTTGTGGTTTTTGGAACTTGGCCACT
-TTTTATAAACCTACAATTTGCCGATTTGCAAATTTTTGGAAAACCGGCAA
-TTTCTGGTTTTTTTTTGGAATTTTTCTAAAATTTTAATAAACCGGCAATT
-TGCCGATTTGCAAATTTTTGGCAAACCGGCAATTTGTGGTTTTTTTGGAA
-TTTTTCTAAAATTTTAATAAACCGGCAATTTGGCGATTTGCAAATTTTTG
-GAAAACCGGCAATTTTTGATTTTTGGAATTTTGCTAAAATTTTTAAAAAC
-CGGCAATTTGCAAATTTTTGGAAAACCGGCAATTTGTGGTTTTTGGAATT
-TTGCCACTTTTTATAAACCGACAATTTGCCGATTTTCAAATTTTTCGGCA
-AATTGCAGGTTAATAAAAAGTGGCAAAATTCCAAAAAAAAACCAGAAATT
-GCCGGTTTTCCAAAAATTTGAATATCGGCAAATTGTAGGTTTATAAAAAG
-TGGCAAAATTCCAAAAAACCACAAAATGCCGGTTTTCCAACTCTTTCAAC
-GAGAGTATCCAATTTTTTAAATAGAAAAATTGCCGTATTCCCTACCGTTC
-TCCACACATTTGCCGATTTTCAAATTTTTGGAAAACCGGCAATTTTTGAT
-TTTTGGAAGTTTGTAAAAATTTTTTAAAGCGGCAATTAGTGGTTTTTGGA
-TTTCTGTCACTTTTTATAAACTTACAACTTGCCGATTTCAAATTTTTGGA
-AAACCGGCAATTTGTGGTTTTCAAGTTTTCTGCTAATTGGCAAACTGGCA
-AAATGCCTTATTTTGGAAGTTTAGGTAAATTCTCAGAACACCGGAATTTT
-GACATTTTTCAAAATTCCAAAAACCACAAATTGCCGGTTCGCCAAAAATT
-TGCAAATCGGCAAATTGCCGGTTTTTAAAAATTTTTGCAAAATTCCAAAA
-AACCACAAATTGGCGGTTTGCCAAATTTGCGAAATTCCTAAAACTGGAAA
-TTGACGGTTTTCAAAAAAAAAAAAAGAAGGGAAATCGGCAAATTACAGAC
-TTACAAAAAGTGGCAAAGTTGCAAAAGCCAGAAATTGCCGGTGTGCCAAA
-TTTGCGAACATTTGAAAATACCACAAATCAAATTGCCGGTTTGCCGAAAA
-TGTGCAAATCGGCAAATTGCCGGTTTTTGAAAATTTTTGCAAAACTCCCA
-AATTTACAGAAAAAATTCCAAAAATCAAAAATCCGAATTATTCCAGAATT
-TTTTCTTCGGAAAAATTAAAAATTGTTCAATTTTCCAACATTTTCAACAA
-GCGTATTATCGAAAAAATACAATCGCACAAATTTCTCGTAATTTATTTTT
-GATCTACCTTGTTGACTAGGCTCCGCCCCTAATCTTGTTGCTGTTGTTAT
-TGTTGTTGTGGCTGTCTAGTTGAAGGAAGGGGCGGAGCCTATTCAACGAG
-GTAGATCAAAAATAAATTATGAGAAATTTGTGCGATTGTATTTTTTTTCG
-ATAAAATCCAATTTTTTAATGGAAAATTGCCAATTCCCTACCGTTCTCCA
-CATTGAGCCAAATACGGACTGTGAAAGAAGCCCAACAAGATATTCGAGAG
-CAACAGCGAGCATCGTTCAATCGATACTTCTCCAGACGCTACGAATGGTG
-GAATTTCGTACTGCAAAAGCCATGCGGAGAGCACATTTACCACTTTATGA
-GTGACATTTGAGCATGCCAATGGGAGTTTCATTGCTTCACGCATTAGTGT
-TAATGCTACGTTTGTTGCCTGGAAAAGGACAAAAAAAACTATTTTTTTAA
-ATGTAAGTAATTAATTTATTTTTTGAAATCTCTTTAAATGTGGTGTAGTC
-GAATATTTTTTCAATTGCTTAATTACCCTCAAAATTGTCTGAAAACACCG
-AATTTCATAATGAACTTCTTGAAAACTTCTCAGAAAAAAGTTATGACGCC
-TCAAAAAATGGCCTAAAATTGGTTAAAATTTGAAATTTGACCTACTTGCC
-AAGCGGCTGGAAACTAGCTTTTTTTTGAAATCACTGTCAAATTTTGAGTA
-TTCAATTTAATTATCTTGCGTTTTCAACTCGATTCAGGTATTTTAAAATC
-GATAAACGAAGAGATTTTTAAAAATTATTTACCAAATCTCTTCTTCCATC
-GATTTAAAAATACATAAATTTAGTTGAAAACGCAAAATAATTAAATTGAA
-TACCCAAAACTTGACTGTGATTTCAAAAAAAAGTTAGTTTCCAGCCGCTT
-GACAAGTCGGTCAAATTTCAAATTTTAACTAATTTTAGGCCATTTTTTAA
-GCCGTCATAACTTTTTTTTTTTGAGAAGTTTTTCAGGAAGTTTCATTATG
-AAATTCGGGTGTTTTCAGATAATTTTTAGTATAATAAAGCAATAAAAAAA
-ATTCGACTACACCAACTTCAAAAATGTAAGCAATTTTATTTTGAAGGCGG
-TTTTCTTTTACTTTTCTAAAAAAAAAATTTATTCAATTTTACGATTTTTT
-GCGTAAAAAAACACGGTCAAATTTTTGTTAAATTCGAAAAGGCGTGTCCA
-TTACGGTTTGATCTACAAAGAATGCGTGAATTTTTAGCCCAAAAAGTGTG
-ACGTCAGCACGAAAATTCTGCGTCTCTTCTCCCGCATTTTTTGTAGACCT
-ACGTAGATCAAGCCGAAATGGGAGAGCCTGACACCACGCGCGTGTGCGCC
-TTTAAAGTGAGTACTGTAATTTCAAAAATTCCACAACATCGAGAGTTTGA
-AACTACAGTACTACTATTTAAAGGCGCACACACTTTTTCGAATTTAACAA
-TAAATTGTCGTGTTGAGACCGTATTTAGGGCTCAAAAAAAAAATAATTAT
-CTCGTTAGAATATTCGGGAAAGTTGCAGTTTCACTGAAAATTTGAATTTC
-CCGCCAAAACGAATTTTCTCCGAAAAATTTGAATTTCCGCCAAAAAATTT
-TTTTAAATCAGAAATTTGAATTTCCCGCCAAAATCGTATTTCTCAGAAAA
-TTTGAATTTTCGCCAAAAATAAAAAAAAAAATTTTGGCGCGAAATTCAAA
-TTTTCTGAAAAAAAAATATTTCGGCGGGAAATTCAAATTTTCTGAGAAAA
-TATTTTTTGGCGCAATTTTTCATAGAAATTTAGTTCTTTTGATGTGTAAA
-TTTCCAAAAATTTCAACAAAAAATCGCATTTTTCTTATTTTTTCCCCAAA
-ATTTTCAAATTTTCTCCTCCAAAACCACGGAACTTTATGCGACGAAAAAA
-GCGCATTTCGATACAAAATCAACGATGCATGTGTAGTTTGTAGTGTTGGT
-TGTCCTCCAGCCGTTGTGTGAGTTGTTGCCGATGCAATATTATTAATCCA
-TCGAATTAGCCAATATCTTGCAATTACCACCGGATCAGCTGTATCCAATG
-GTTCACCATTCTCATCGGCTCCTTCCCAGCCACCGAATACATCGACTCCG
-TTCGTTTCCAGATCGGTGAAGCATTCGCCCATGTATAGCTTTATTACTCT
-GAAAATTGAAGAGTTTTGTACTCCTCTCGGACAATTGGAGGTGATTTTTT
-TTTTCGAATTCTTTAAAACAAAAATTTCCCGAAATTGAGCTTTTAAAATT
-TTAAAATTTCAAAATTTCAAAATCAAAAAAAAAAAAAAAAACTTTTGTAC
-AAAATTTAAAGTGGAGAATTTTTGTATTTTAGACAAATTTTTTAAACATT
-TCTAGCAGAGTTGAAAATTTCAGGCAAATCGGCAATTCGCCGAAATTGAA
-AATTTCTCATAAATCGGAAATTGCCGAAAATGAAAAATTCCGGCAAGTCG
-GCATATTGCCGGAATTGAAAATTCCTTACAAATCGGCAATTTGCCGGAAT
-TGAAAATATCCGGCAAATCGGCAATTTGCCGGAGTTGAAAATTTCCGCCA
-AATCGGGAATTTGCCGAAATTGAAAATTTCGTATAAATCGCCGATTTGCC
-GGAGTTGAAAAATTCTGGCAAATTTGAAAATCGGCAATTTGCCAAAGTTG
-AAAAATTCCCGGCAAATCGCCAATTTGCAGATTTTTCGACCGAAATTTGC
-CTACCGGCAATTCCTGCCGACCCCTTTTTTCCGAGAAGAATTAACTTTCC
-ATTTCTAAAAAATCTGTAATTTGCCGGAGTTGAAAATTTCCGGCAAATGG
-GCATTATGCCGAAAATGAAACATTCCGGTAAATCGGCAAATTGCCGAAAA
-TGAAAAATTCCGGCAAATCGGCAATTTGCCGAAGTTGATAATTTCCGCCA
-AATCGGGAATTTGCCGAAATTGAAAATTTCGTATAAATCGCCGATTTGCC
-GGAGTTGAAAAATTCTGGCAAATTTGCAAATCGGCAATTTGCCAAAGTTG
-AAAAATTCCCGGCAAATCGCCAATTTTTTGCCTGTTGTGCATATTATTTT
-CACGACTAAAAATCGTAATAAATTAAATTAAATTAAATTTGCCGATTTTT
-CGACCGAAATTTGCCTACCGGCAATTCCTGCCGACTCCTTTTTGCCGAGA
-AGAATTAAAATTTCCATTTCTAAAAAATCTGTAATTTGCCGGAGTTGAAA
-ATTTCTGGCAAATTTGCAAATCGGTACTTTGCCGGAGTTGAAAAATTCTG
-GAAACCGGCAACCCGGCAAACCGCCAATTTGCCGATTTTTCGACCGAAAT
-TTTTTTTTCCTGTCGACCCCTTTTTCCGAGAACAGTTAAATTTCCAAAAT
-TCTCTAAAAACCACAAACTTCTCAATAATAAAATTCGCACACTCCTGTCG
-CTTCCCCTCATCATTCCACTCAATCCGCACAGTTTCTCGAGTACAGTACT
-CCAAAAACTTGTCCAAATAAACTTGGAGCATTTGAGCCCGTTCTTTCGAA
-GTCTGCGACGCCGACGCTGTCGACTTAATCGGCCCATTCCTCAGTCGTTC
-ACACCAATCACCGGCTCCCGACGATTGACAGTACTCGTTGAGCACATCTT
-CCGCATTTTCACCACTGGTAAGCGGGAAGAATGGTAGAAGACACTGAAAG
-ACACGATCCAGGTCTGGTGTCGCTTTTCCGTACACTCCGAGACATTGATA
-GAACACTAGGAACAAGCGAATCGCAATTTTTCGCACTGCCATCAAATTTT
-TCGGGTAGACTGCTTTTTTGAGAAGCGATTCGATTGCATGACGTTGCCAG
-CCTGAGAGAAATTGGGAAAATTTTTAATTTTTATTTAAAGGTGGGGTAGC
-GCTAGTGGGGAAATTGCTTTAAAACATGCCTATGGTACCACAATGACCGA
-ATATCATGATATAACAATTCAAAAAAATTTTCTAAATTTTATATGATTTT
-TTGAAAATTGAAAAAATCTCAGTTTTTGTCTAATTCCAATTTGAATTACC
-GCCAATTGAATTTGTTCTATGGAGCGCGCTTGCACGTTTTTAAATTTATC
-TATTTTATTTTTTGTTATTTTTTGTTATTTTTCCACCAATTTTTAATGTT
-TTCGGTGTATTTTTGCTCGAATTTTAGAGAAAAAGTCAAAATAAATGCAA
-ATTTTCGATTAAAAAGCACGCTTACAGTCGTAAATCAGTGAAATTAATTA
-ATTCAGGTTTGAAATCGTTTAAAATCGTTACTTTGTCATTTTTACGCCTG
-TAAGCGTGCTTTTTAATTGAAAATTTGCATTTATCTTGACTTTTTCTCTA
-AAATTCGAGCAAAAATACACCGAAAACATTAAAACTCGGTGGAAAAAACA
-ACAAAAAATAAAATAAAATAAATTAAAAAACGTGCAAGCGCGCTCCATCG
-AACAAATTCAGTTGGCGGTAATTCCAATAGAAATTAGGGGGGAAAACTGA
-GATTTTTTCAATTTTCAAAAAATCATATAAAATCAGGAAAATTTTTTTGG
-ATTTTTTATCATGATATTGGGTCATTGTGGTACCATAGGCGTGTTTTAAA
-GCAATTTCCCCACTGGCGCTACTCCACCTTTAATTTCTGACGGTTTTTTT
-TCGGTTTTCCTTGAAAAATCCTCTAAAAATCGATAATTTGTAAAAATTGC
-GTTGTTTTTCCGGGATTTTTTTCGGTTTTCCCACGGGGTTCTGGCCTTCC
-TCACTGAATTTTTCGCGCTCCATTGACAATCGCCCGTGTACTCCACACGG
-ACAAATCACATTTAGTTTTACAACTAAAATCGAGCCGAGACGCGGCAGCC
-AACGCGCCGTAAATCTACCCCAGATATGGCCTGGCCTAGTTCGGCGAAAA
-CTCTTCCATTTCAATGTATGAGGGAAGCCAGAAATCCGTGTTTTCCTCAA
-AAAAATCCTCTAAAAATCGATAGTTTGTAAAAATTGCGTTGTTTCTTCGG
-TTTTTTTTGCAATTTGAGGGTTTTTTGTCGATTTAACACGGATTTTTGGC
-TTCCCTCATATATTGAAATGGAAGAGTTTCTGCCGAACTAGGCCAGGCCA
-TAACTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTT
-TAGTTGTAAAACTAAATGGACTTTGTCCGTGTGGAGTACACGGGCGATTG
-TCAATGGAGCGCGAAAAATGCAATGAGGAAGGCCAGAAGCCCGTGCGGAA
-AGACGGGGAATCTCCGAAAAACGGGGAAAATCTACAAAAAAATGAGTTTA
-AAAAAGACTTCCTCAAAAAAATTCAAAAATTGTGGTTTTTTTTTTAATTT
-TTTGTATTTTGATAAATTTTTTGCGACATCAAAAAATGGAAGAACTTTTT
-TTTTTCGATTTTTGAATTTTTTGTTGGTGAAAAAGAAGAAAATTTCGAAA
-ATTCGTTAGGGAATGGATAAATTTTAATCAAAAATCGATTTTTTAAAATT
-ATTTTTTGCAGTTTTGCATAAAAAATCCAGATTTTTTCGCATTTCGCGCG
-TAATTTTCATTTTTGTCGTTTTTTTTTTCTGAATTTTCCGAAATTTCTGG
-AAATTTTTTCTTTTCTTGTTCTGAAGCTTATGCCTAAGCCTAAGCCTAAG
-CCTGAGCCTAAACTCCAAAAACGCACCACTTCCAACAAGCTCCGGAGCCA
-AACAGAGCACCTGCTCCAGTGTCCAAAGCCCGGATTCAGCCTCAATTGCA
-CTATCGATTTGACTGCTGACATCGTTGACGAGCAGAAGCTCGTCAACGAG
-ATGAAACGTCTCGAAACTGTGCTCATCGAGCAGTTGACGCTTTTCCTGAA
-GAAATGTTGTGGTCGAATTAATGCGAAATATGGGAAAATTCGGGTTAAAA
-TCGATGAAAAATCGTGGAAAAACGAACATTTGTGGTTAATGTGTCGAGCA
-GAATCTTCAAATGTTTCACACGGCTCACACAATCCCTGTTCAAGTCGGTG
-AATCTTGAAATGCTCGCCTGCACATCTGACGATTTGCCCTTTCGGGCAAA
-CATTTTCCTGTGATTTTAGGCGATTTTCTGCAAATTTTCGCTGTTCAAAC
-GTTTAAAATCGACGGAAAATGCGTATATTTTACTAAATATGCGAGAAATA
-GTGATTTAATTCGAAAAAATCAATATAAAAATGGAAAAAAACTACAGTAG
-TAATTTAAAGGCGCATACCTCGAAAGTTAAAATCGTGCCAGGACCCGCCG
-CAATTTAGAATCGATTTTTAGATGAAAACTTTTTTTTTCTTACTAAAAAT
-TAAAATTTTTCACTGAAAATTTCGGTTAAACTCTGACTTTTAACACGAAT
-CTTATCAAAACTATGACAATTTCTAGTGAAAATCGCCAATTTTGTGTGTA
-AAATCAATTTTTTCAGTGAAAAATGTTTTTTTTTGAGTTAAAACTAAATT
-TCGAGCTTGAAACTAGAAAATGTCAAGTAAAAAATTCATTTTTAAGCGAA
-AAATTAACGTTTTTTTCCAAATTTTCGCCTATAATTCACACAAAAAATAC
-TGAGTCAGCAAACAATGTGGGAGCATCCCGAAAATGGTGCAGAATGGTAG
-AGCAAAAACGAAAAATCGATGAATTATTGTGGAGAGAGAGGAAATTTTAT
-TCAATTTTTGAGGAATGGAGGTTAAAAAAAAGAGTAGAAACATTGAAAAG
-TGGCAAAGAAATCCAGCTTGAAACCGGAAAAACTCCCAGAAAACGAAGCA
-AATAAGAAAATCCCACAAAAAATCCGAATTTAATTGCAGTTTTCGACCGA
-AATTCAGCCAACCAGTGAGTGGTTCAATTATTAAAAAGCACATATATACA
-TATAACTTTATTCAAAGGACATAATCCATATAAAGTCTGTCAAAACGGAA
-AAGGTTCTTTCCAAACACACAATTGGCCCCCTCTGTCCAAAAGAGAGAGC
-ATGGGAATCGGAGAGGGCGGTGAGAGAGACGCAGACATCGAGATGACACT
-TTTTGACAGCAACACTGTGTGTGTGTGTGTGTGTGTGTGAGTCTCTGTGA
-TTGAGTGAAAGCACTTTTGGGAATATATACTGGTAGAAATTTAATTTAAA
-ATGATAAAAAATTTCTTGGGATTTTTTTTTTTGAGTACTGTAGCCACAAA
-AGTACGTAATTTTCTTGAAAATGCGCCCATGGGGTCCCAATGACGTAATA
-TCATGATAAAAAATTTTTGAAAATTGGAAAAATCTCAGTTTCCCCTCCCC
-CCCCCCCCTAATTCCAATTTGAATTTCCGCCAATTGAATTCGTTCGGCGG
-AGCGCGCTTGCATTATTTTTATTAATTTATTTAATTTTCTCTGTTGTTAT
-TTCACTGATTTTCTTCATTTTTTGGGGATTTTTAATTGGGAAAAGAGAGA
-AAAATGCAAGATAAATGCAAATTGTTCATTAAAAAATCACTGAAAATGGG
-TAAAACTGTGAAATATGCTAATTTCAGGCTTGGTGTCGTCGGAACTCATA
-ATTTCGCAGTTTTACCCATTGTCTATGATTTTTTAATGAACATTCTGCAT
-TTATCTTTTTTTTTTAAATTCAATTTCTATTAAAAATCCCCAAAAAATGA
-AGAAAATCAGTGAAATAATTAGAAAAAATAAAATAAATTTATAAAAATAA
-TGCAAGTGCGCTCCACCGAACGAATCCAATTGGCGGGAGTTCAAATAGGA
-ATTAGAGGGAAAACTGAGATTTTTTTCAATTTTCAAAACAAAAAATCATA
-AAAAATAAGCATTTTAGCTTAAAAACTCGAAAAATCATACAAAAATTAAT
-TTCAAGTTGTCCACGAGTAGTACGCGACGCCTGGTTGCAAAAATGGCGTA
-GATTTCGATTATTAAAAGCTTAAAAATCATTTTTTTTTACCAATTTCCAA
-TTAAATATCCTAATTTTAATCTCAATTTTCTTGAAAGACGTGCAAATATA
-GATACATCTAACATAAAAATTCTTCGCTGCGAGACCCAGGACCCCATAAA
-TCGCCTGCGCCTTTAAATTTATATTTATTTTCTCTCTCAAACAGCGATGA
-AAATCACGTTTTTGAACCAAATTTTCCAAAAAATAAGACAAATTTCTATT
-TTAAAAACCACTTTATTCGGTCATTGGTCGCTAAATAGCAAATTTTGAGG
-CAAAAAAAAAACGAACAGACAACGGAAAATCGAGTGAAAACAAGTGAGAA
-CACAGCAAAACTAGTCCTAATTAATTAAAGGCGCATCACGTGGAAAAGAA
-AACTGTTGTGGAAGAATAAAAAATGGAACATGAGGGGAAATATTACAAAA
-ATAGTAAAAGATGCATCAAGATTAAGATTATTTTTCGAAAATCGAGTCCT
-CCGCCCAGGAATTCATCATAATTTTCGACTTTTTTTCGGAGATTGCTGCA
-CATTGTCGGCTGCTCCGGTGGTTTTTGGAAGGTTTTGAGAGCTGAAAGAT
-TTGAATTTTTTGGAATTTCGAGAAATTTCTTTTTTTTTACCCGAAGCGCT
-TTGAATCTGGCGAGCTGCATTTCCAGCTTGCATTGTGCGTTCAGTGACTT
-TGATTCCTTGAAGTTTTCTGAAAAAAAAACACGAGTTTTGACTTGAATTT
-TCTGAATTTTTAACACGGATTTCTGGTTTCCCTCAAAGAATTGAAATGGA
-AGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGATTTACGGCG
-CGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATGTGAT
-TTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATT
-GTCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAACTCCGTGATTT
-TTCTTTTACTCGGCGTAGATTTCGCAGTTTCAGACTGTTTTTCAGGTCTA
-ATCAGCGGAATTTTCGTTGATCCCGCCAATCTCGGTGATTTTCTGAGCCT
-TTTTCGCTCAGGTTCTGGGATTTCAGCTTTTAGAGCAATCTTTGAAATTT
-CGACAAGTTTCTTGAAGTCCAACGCAATTTTTTCAGTAGAATTCGCAGTT
-TCCGGCAATTTTTCTGAGCAAATCTTCGAAATTTCGACAAGTTTTCTGAT
-TTTCGGCGTAGATTTCGCAAATTCTGACGGTTTTTCTGCAAATCCCGGTG
-ATTTTCGGCTCGGGGAGCTCCCAGCTGCTCTATTGTTCAGCATTGTCTGC
-TCAGTAGCGGGGGCGTCTTGATTTTCAGTAGAATTCGCAGTTTTCGGCAA
-TTTTTCTGAGCAAATCTTCGAAATTTTGACAAGTTTTCTGATTTTCGGCG
-TAGATTTCGCAATTTCTGACGGTTTTTCTGCAAATCTCGGTGATTTTGGG
-CTCGGGGAGCTTCCAGCTGCTCTATTGTTCAGAATTGTCTGCTCAGTAGC
-GGGGGCGTCTTGATTTTCAGTAGAATTCGCAGTTTCCGGCAATTTTTCTG
-AGCTAATCTTTGGAATTTCGACAGGTTTTCTGACTTTTGGCGTAGATTTT
-GCAGTTTCTGGTGATTTTCGGCACGATGAGCTCCCAGCTTCTTCATTATT
-CAGCCTTTTCAGCTGGGCTTCTTGAGAGCCTGTAATCACGTCGCCGTCGT
-CATCCTCTGAATCATCATCCGACCAAATTTCGATTATTTCCTGAAAAAAT
-CGATTTTTTTTGCTTTTTTTTGCTCTTTTCTCATTGTCAGCTTTTCCCAC
-TTTCCAGCAATTTCTCCACGGCGTCGGAACGTATCCTGGTCGCCGATCGA
-ACTGGATAACTGGCCGGCTGGCGATAAATCGGCGAAGATCTGCTACTATC
-TCGTCTGAAAACGTTTTTCTGCTAAAACCTGCTAAAAATCTGGCTAAAAT
-CACCTGATAACATTACAATATCATCATTTCCGGGCATTTTTGACGAAAAA
-AAAGCGGAAAATATTTAGAATTTCGAAAATGAAGAGAAGCGTTACGGTAC
-TAAAGGCACATGGCGTAAAATATTCCGCAGGACTCGCCGCGATTTATGAT
-TTTCACTATTTTTTTTGGGCAAAAGTTGACATTTTTCAGAATAAAATTCA
-AAATTGTGTTGATAAATTGTTTATTTGATTTTTTTTTCAAATTTAAATAA
-ACTGTAAATTTTAAATTTTCCCCCAAATATTCGCAAATTCCCTTCAAACC
-AAGTTTTAATAGCACAGTAATCCCCGAGCAATCGCGCTCCACCGGACTAA
-CCTACACACCGCGAATTTTGAATTACATCCCTCATAATTAATTGTTTTTG
-CCATTTTTTCGCTATTTCCAGTGGATTTTAATGAGTAAAAGCCTACAAAC
-CGACGAAAATGGCGGTGTCAGTGAAAGTCCATCAAATTGCACATATTGCT
-ACACGCTGGAATGCTCTCTACGCATCGAATCCACCTCATCAATCAAGAAA
-AAGACTCCAATCTCCTCGAAAAGCGCTATAATGACTGTCGGCAGAAATGC
-GCAGAGGTTTTAGTCGAATAAATGCCTGTTTTAAGAGCAAGAAATTCCAG
-AAAAATTCACCTTCAAATCGAGCTAAAGACCACCGCTACCGGACAGCCCG
-CTGTAGTGTGCTATGACGTCACAGATGCAGTTGTACACTTGCAAAGCGTT
-GCAAATGGGAAGTGTACTGTAGAAATTCCTTCGCTGTAAGACCTAAAAGA
-CCAGAAAAATGGAAAATATCTGAAAACCCCAATTTCAGCTCGTTAATGTT
-CCAAATGTTCAATTGCGCGCCGCGAAAGCTCAACGTCTTCATGAAATCTC
-TCCAAGCAAAGTTGGATATTATGAAAATGGAGAAAAGCCCAATTTCAGCA
-GTGTAAAATCGATAAATTATCGAAAAATCAATAAAAATCCCTTCAGACCC
-CGGCAATTCTCACGTCCGCCGGCAGTTTTCAGCGTTCTGAGCCCGCTGAC
-GATCAGCGAAATGCGAAAAGTGAAGAAGCTACGCGAACCGTCGGCGCTGG
-CGAGACCTTCGAAAGAGGCGACCACACCGAAGCGGCGGTAATTTGAAATT
-TTCACATTAAAAAAAAATCGCGAATTTCAGCACTTCCTCAATGAATTTGC
-TCGCCGGCGGCTTGGAAAATCGAATTATGAATCGATCGATTGGGCTGAAA
-AGGACGACCAGTTTTGCTAGAGATGATCGTGAAAAAGCCGAGGTTCTGCA
-GCTAAAAATCCGTCAAAAATCGATAAAATTTCGTTTTTTTTCCGTGAAAT
-TCCAGGTTTTTTAGTCCAAAAGCACGGATTTCTGGCTTCCCTCATAAATT
-GTAATGGAAGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGAT
-TTACCGCGCGTTGCGGCTCGATTTTAGTTGTAAAACTAAATGTATTTGTC
-CGTGTGAAGTACACCACTTTCCCATTGCCCGGCGGGTGATTGTCAATGGA
-GCGCGAAAAATGCAATTAGGAAGCCCAGAAACCCGTGAAAAAGTGTCACG
-CGGTTTTCAAAGTAGAGGTGCAAGCGCGCTCCACCGCTCCACGGTGCTTG
-GCGGCAAAACCAGAATTTTCGCTGATTTCAAGCATTTTCCGTCGTTTTTC
-ATGATTTTTCATGTCGAAATAGTGTTTAAAAATGTCTTTAATGCTGAAAA
-GTGAATATTTCAAAAATTTTGACATGAAAAACTGAAAAAATTATCGGAAA
-AGTGTATTTTTTGAGTTTTTACTTATTTTTCGGTTTTTAAAAAAATTATT
-TCTACATAAAAATTGATGAAAACAGCATATGAAGTGCAAAAAATAAAGAA
-GACTTACATAAATTTTGACAAAAAATCACGAAAAACAATAAAAAAAGTCG
-AAAAATGATTGGAAACGGAGAAATTTTCCCTTTTTATGTAGAAATTTTGA
-ATTTTTTCAAAATTTTCTCAATTTTGAAACACAAAACATGAAAAATGATT
-GAAAATATTTGAATTTTTAGTTTTCGCGCCAATACCTAACGAGACCCATC
-GGTGTGACCATGGAGCGCGCTTGCATCTCGATTTTAAAATTCGTATGAAT
-TTTTCGCGCTCCATTGACAATCGCCTGCCGGACAACGCGTGGGAAAGTGT
-CGTGTACTCCACCCGGACAAATCACATTTAGTTTTACAACTAAAATCGAG
-CCGCGACGCGACACGCAACGCGCCGTAAGTCTACTGAGCCAAAATGGCCT
-AGTTCGGCAAAAACTCTTCCATTTCAATTCATGAGGGAAGCCAGAAATCC
-GTGTTTTAACCTAGAAAATCAAGAATTTTTTTGGGAAAAAATGCCAAAAA
-TCCCAGATTTTCCCTAATTTTCAGCTAATTTTTCCCCGAAACAGACAATT
-TTCAGACCCTTGTCTCCCTGAAATCATTCAAAGATGCTCCTGCAATTTCC
-GAACGGATTCAGCTGTCAGATGAGCAAAAATCGGTTGTCCGATGTGTGAT
-AAATGTAATTTTTCGTTCGAAAAAAAAAATTATCGAAAATTTGCAGTCTC
-GAACGAGTGTCTTCTTCACGGGATCCGCTGGAACCGGAAAATCTGTGATT
-CTTCGGAGAATCATTGAAATGTTGCCCGCCGGGAACACCTATATCACCGC
-AGCGACAGGTAGAGGATCACTTTGAAATATTTGCAAAAAATCGTGTCAAG
-ACCTCCCCCAAAAAATTTTCATGTACCTTTAAAAAATAGAACCGACTTTT
-TTTAATTAAAAAATCATTAAAAATTAGAGGAAAATTTGGGAAAAAAAATC
-ATTAAAAATTCTTTAAATAATAATTGTTTATTTGTCACAAGAAATAGCTA
-CACCGGAAGATAAAGAAAAAAAGTAAATAAAAAAGATGTGTGGACAAATA
-AGTAAAATGACCAATTGGACCAGCTATAGCCCGGGAGGTTAAGTTGGGGG
-GAAGAGGGTGTCAAATGGGATAGAGTCTAGGCGCGACGCAAATGCATTTG
-GAGTTAACAGTTTAGGGAAACGTTTTGCTATTCGATTCCACAACGACAAG
-TTAACATGTAGAAAACATTTAGACGGAACACCACAGACAACAAGTAGATA
-GGGGTGACGAGTAGAGCGTGAAGCTCGAACGAACGATGATAAGGACGGGA
-AGTGATACTCGCTTGAAATAATTTTATGGAAGGTTCGGAGGATTTGAAGA
-ACCCGTCTATGGTGGGTAGACAATAAATTAAATTGGGAAAGCCTACTACT
-GTATGACGAGTAAGATAAATTGCACCTTTGAAAGACACACTTTGAGAAAA
-ACCGGAGGGGAGATTCTAGTTTTTTGGCAAGTTCGGTGGAGTTGGGCGGG
-AAGAGCTCGCAGCCATATTCGAGTACGGGGCGGATGTAAACATTGAACAG
-TTTAAAATAGAATTCGGGACTTTTAGAGCGGAATGAACGAAGGATTTGGC
-GACACTTAAGGAGGGCACTATTAGAAGTCTGATTAATATGATTAACAAAT
-GATAATTTGGTATCGACAATGATTCCAAGATCTCTGATAGAATCACGCGG
-TTTAATTTCAACACTATTTACAAAGTATTTATGACGGGGGTTCTTTTTTC
-CAAAATGTAATACGGCAGTTTTGTGCTCAGCAAGATTTAGACGCCATTTT
-TTACACCAATCAGCGACAATATTGATGCTTGTTTGGATAGAGGTGGGGTC
-CGATCCGAGTAATTTTAGATCGTCGGCAAAGGCTGTAACATGGACATCAG
-GGGGGAACAAATCTAATAAGCCATTAATATACAAAAGAAAGAGGAATGGT
-AAAATTGTGGAAAAAACCGTAAAAAATCAACAAATTTCGAAAAAAAATCG
-TAAAAAATTGAGACATTTGAAAAAAAAAATCTAGCAAAATTTGAAAAAAA
-AATCGTTTAAAATTCAGCAAATTTATTTTAAAAAATCATTAAAAATTCAG
-CAAATTTGGAAAAAAAAACAAATAAATCTGTAAAATTAAAAAAAAAACCA
-GTAGAATTTGAAAAAAAATTGTTTAAAAAATTCAGCAAATTTCTAAAAAA
-AAATCATAATTAATTGATAAAAATTTTTTAAAAACGTAAAAAAATATTTA
-AAATTCTGCAAAATTTGAAAAAAATCGTTTAAAATTCAGCCAAATTTCGA
-AAAAAAAAGCATTAAAAAAGAGAAAAATTGGAAAAATTCTGCACAATTTT
-TTAAAAATTATTATTCTGAAAAAATTTAAAAATTCATGGAAAAATCTGCA
-AAATTATTTTTTAAAAATCGTTAAAAATTCAGCAAAAATTGGAAAAAAAT
-CGTTTAAAAATCAGCAAATTTCGAAAAAATAAAACATTAAAAATTCAACA
-AAATTAAAATTAGAAAATCATTAAAAAATACAGCCAAACCGTAAAAAATC
-AGCAAATTTCGAAAAAAATTCGTTAAAACTTCAGCAAACTTCTAAAAAAA
-ATCATTTAAAAATGCAGGAAATACGAAAAAGAAACATCAAAAATTGAGAC
-AATTGGAAAAAAAATTCGTTAAAAATTAACCCAAATAAATTTGCTGAATT
-TTTTAGATTTTTTTTTTTATAAATTTGCTGAATTTTTGAAAAAAATTCAG
-CAAATTTATTTTAAAAAAATCTAAAAAATTCAGCAAATTTCTTTTTTAAA
-AATCGTTAAAAATTCGGGAAAACTTGGAAAAATTGTGCAAAATTCAGAAC
-AAAAAAATTTCAAAATTTTCCCAATTTTTAAGTTTTTATTTAGTTTTCAG
-AATTGTTTAATAGTGAAAAAATCATAAAAAATTCAACAAAATTTAAAATT
-CAAAATTTTCCAGAATTTTCATGGGTCCCGCCACGATCCACTCCAACCTT
-CAAAAAATCATGTAATTTCCAGGCGTTGCGGCTTCCCAAATCGGCGGAAT
-CACACTTCACGCGTTTTGCGGTTTTCGCTACGAAAATTCGACGCCTGAAC
-AGTGCCTAAAACAGGTTTTACGCCAAAATCACATGGTCCGACAGTGGAAA
-CAATGCTCACACTTGATAATTGACGAGATTTCCATGATTGATCGCGACTT
-TTTTGAAGCTCTCGAATATGTGAGCTCATTGCGTTTTGATCTACAAAAAA
-TGCGGGAGTTTTCCCAGCATTGCTCATTTGATCTACAAAAAATGCGGGAA
-TTTTCCCAGCATTGCTCATTTGATCTACAAAAAATGCGGGAATTTTCCCA
-GCATTGCTCATTTGATCTACAAAAAATGCGGGAATTCTCCCAGCATTGCT
-CATTTGATCTACAAAAAATGCGGGAATTTTTCAAGTGTGACGTCAGCACA
-CTCATGCGAAATCTGCTGAAAAGTCTGCGTCTCTTCTCCCGCATTTTTCG
-GAGATCAAACCAAAATGGGACCCGAAAATTCCAAAAAAAAATCGATAATT
-TCCCGTCCCAGGTCGCCCGTACCGTCCGTAATAACGATAAGCCGTTCGGT
-GGAATTCAGCTCATTATCACTGGAGATTTCTTTCAATTACCGCCCGTCTC
-GAAGGATGAACCAGTTTTTTGTTTTGAGGTGTGCGGAATTTCGGAGCATC
-GTTTGGACCGTCTAACTCTTAAAAAAATTTTTTTGCAGAGCGAAGCCTGG
-AGCCGATGTATCCAAAAAACGATTGTCCTGAAAAATGTGAAACGACAAAA
-TGACAATGTTTTTGTGAAAATTTTGAATAACGTTAGAGTTGGAAAGTACG
-TAAACTACTGGAAAAATTTAAAAATTTCGAATTTTTCAGGGTTTTTTACT
-AGAAATTTTGATTTTTTTCAGTGAAATTCCAATAAAAGCTGGAAATTTTC
-AGAAAAAAGGAAAAAATATGAAAATTTGTAATTAATTTCGAAAAATGCTG
-AAAATCTCCAAAACCTTCCAGAAAAGCTGGAAATTTCATAAAAATTTGGG
-AAAATCTGAAATTTTCAGAAAATTCAAAAAAAGCAAAAAATCTCGAAAAC
-CTTCCAGAGAAGCTGGAAAATTTCAGAAATTTCCAAAAAAATAAATTCTG
-AAAATTTCATAAAAATCACTGATTTCTGTCTTCCCTCATAAGTTGAAATG
-GAAGAGTTTTTGCCGAACTAGGCCATTTTGGTTCGGCCAGATCTTGGGTA
-GATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAA
-TTAAATGTATTAGTCCGTGTGGAGTACACGACACTTTCCCACGTGTTGTC
-CGGCAGGTGATTGTCAATGGAGCGCGAAAAATTCAACGAGGAAGGCCAGA
-ACCCCGTGATAGACCGGCCAACACGGGGTTCTGGCCTTCCTCATTTCATT
-TTTCGCGCTCCATTGACAATCACCTGCCGGACAACACGTGGGAAAGTGTC
-GTGTACTCCACACGGACAAATACATTTAGTTTTACAACTACTAATTGAGC
-CGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGAAATGGCCGAGC
-CAAAATGGCCTAGTTCGGCAAAAACTCTTCCATTTCAATTTATGAGGGAA
-GCCAGAAATCCGTGTGAAATTTCCAAAAAGAAGCTCCAAAAAAAAATTCC
-AAAAAAATCTCGATAGCCTTCCAGAAACGCTGGAAATTTCAGAAAATCTC
-CTGAAATTGATAAAAATTCGAAAAAAATCTCAAAATTGTTAGAAAATCAG
-TGAAAATTTGGAAAATTCAGAAATTAAAAAAAAAATTTTTTTTTGGAATT
-TAGAATTTAGAATTCTTCAAATTGTCGAAAAATGCTCCAGAAAACTTGTA
-AAAATTTAATTTTTTTTTTTTTGAAATTTCCAAAAAATTTATTTATTTTT
-CAGATGCGACTTCAAATCAGCGGATATTCTAAAGGAATCCTCGAAAAATC
-AATTCCCATCCAGCGTAATTCCAACCAAACTGTGCACACATTCAGATGAC
-GCCGATCGAATTAACAGCTCAAGCATCGAGACAACACAAGGCGACGCGAA
-AACCTTCCACGCCTACGATGACGAGAGTTTTGACACGCACGCCAAGGCCC
-GAACGTTGGCACAGAAGAAGCTTGTGCTGAAAGTTGGAGCTCAGGTGATG
-CTCATCAAGAATATCGATGTGATCAAGGGACTTTGTAATGGGTCACGTGG
-ATTTGTGGAGAAATTCTCTGAAAACGGGAATCCTATGATTCGATTTGTAT
-CGCAAGCCGATGCTTCCATTGAGGCACGTTTTACAGAAATGACCATTTTA
-TGGGCGTGGCTTTTTTTTTGGAAAATTTTTTTTTTCCAAAATTTCTGGAT
-TTTTCTCTAAAATGGAAAAAACCCACGAAAATTGTAAAAAATTTGAAATT
-TTTTAAATCGGAAAAAAATAAAATTTTCTTTCTTAAAATTAGGCTTAGGC
-TTAAGCTTAGGCCTGGGCTTAGTCTTAGGTTTATGCTTAAATTTGAAAAA
-AAAAATTTCTAATTTTTTCCAGATTTTTCCGTTTTTTTTTTCAGAGAAAA
-TCTAAAATTTTCGATTTCTACCTGTTTTTCAAAAAAAGTTAAAAAAAACA
-TTTTCGCAAATTTTGTAGAAATTTTTCTTTTTTTTTTCTTAAAATTAGGC
-TTAGGCTTAGGCTTATGCTTAGGCTTAGGCTTAGGCTTATTCGTAGGACT
-ATGCTTTGGCTTAGACTTAGACTTAAGCCTAAGCCTAAGCCTAACCCTCT
-TAAAAAGTTACAAGAAGGTTTTTCCTTGCGCTTGGAGCGCAAAAGAAAAG
-AAAAAGAGCTATTCAGACTTAGGGTGCCCAACTGGAATAAAACATTGGAA
-ATCCTTATGACACACTTAAGCCTAAAGGCCCGAAAAACATACTAGGATGC
-CCAACTGGAATAAAATATTGGAAATCCTTATGACACACCGGCGGTATGGC
-GCGGCTTAAGCCTAAATAGCCACTTTTATCAAAATACATTTGAGCTCGTC
-TTGCGTTTTACTTTGACTTCTCAGGCAACTCAAAAGTAATCTGTGGATAT
-TTTTCAGTAATCTAAATGAAGACTATAGATTACTAAGAAACTTGGAGATT
-TCATAATATTTGGGGGGATGCGAGCATCCATTGGAGATTTGCCATTTGAT
-AGAACTTTTAGCGGCAAAAGTCCAAAACAAAGCTCACAGTGGGCTCTCAA
-AGATCATAAAATAGCACTGTAACGAAGAACTTTAACGATCTAACGAAGCA
-ATTTTACAAATTCACTTTGGTAGCTCATATCTCCGTGGATAAAATTTTTA
-CAGAAAAGTCATCAACTGATAAGTTGTTGATATTGTTGTAAAGAACAAGT
-TTGTAGTTGAAAGTTTTTTTTACCAAAAAATTTTTGTTTGAGAGAAAAGC
-ATTAGAAACGGAATAGCATCATAAAAATAACAACAGCAGTTGCCGCACTT
-CACGCGGTTCTATCTCAAACAAAAGCGGAGATATGAGCTACCAAAGTGAA
-ATTGGAAAATTGGCCCTCCAATGCTTCGTTAAAGTGCTATTTTCAGGATC
-TTTGAGAGCCCGCCGTGAGCTTGGTTCTGGAGTTATATTGATCAAATTGA
-CCCTCCAGTAAAGGAGGACCTTTGATGAATATAATCACTCTGATGGTATT
-TAATTCCGATGAGTAATCCATTTTTCTTTTTCTCACATTTGTGAACCAAA
-AATAAGTTTTAAATTAAGGCGGGATATTCTAAGGTGTGATAACATATGTT
-ATTTATTTTTAAATTTAAATAAAGTTTTTTTTTAATTTTTGCTAAAAAAC
-GAATAGTTTACAACCGCCTCGCTCAAATGTATTTTGATAAAAGTGGCTAT
-TTAGGCTTAAGCCGCGCCATACCGCCGGTGTGTCATAAGGATTTCCAATA
-TTTTATTCCAGTTGGGCATCCTAGTATGTTTTTCGGGCCTTTAGGCTTAA
-GTGTGTCATAAGGATTTCCAATATTTTATTCCAGTTGGGCATCCTAGTTT
-TTTTTTTTCGGGCCCTTAGGCTTAAGTGTGTCATAAGGATTTCCAATGTT
-TTATTCCAGTTGGGCACCCTAAGTCTAAATAGCTCTTTTTCTTTTCTTTT
-GCGCTCCAAGCGCAAGGAAAAACCTTCATGTAACTTTTTAAGAGGGTTTC
-ATATATTTTATTAAAATCGGGGCGAAGCCCTGATTTTAAATCCATATTGT
-TTTTGTTTTTGTCTTCCACTATCCCTGCAAATAGGAAAGAGAATGTGTTC
-TTTCTGATGAAGTAAAAATCATCATAAAATCTTGAAAACTGAGAGCAGGA
-GGTAATATTTGAATATATTGGGTTGTAAATGTGTGTCTCCCTGTGGGTGG
-GGTGGCGATGTGTTGGCAGCCAATCCTTCAACGAACTGTATCTCCCGCCT
-GTATCTCCCTTCAAAGTGAGAATTGGGTTACAAAAATTTGAGGGAATATG
-AAAAAAGGTGTGAGGATTTCAAAAATATTATTGTTGAAACACCAGACCAA
-ACCACTTTTTCTGGGCAAGAGACAGAAAATTAATTTTTTGAAAAATTTCA
-AACTGGCACAAAATTTTTTCAAAAACAAATTTTCACAAATTGTTAAAAGA
-TGCCATTTTTAATCAATATTGTTCATTGAACACAGAAAAGAAAACGAAGA
-TTCATCAAAAAATGAGTGAAAAATCGCAAAAATTCGAAAAAATCCGTGCT
-GAAAAACTCGAGTTTTTGGCGGTGCTGAAAAAAATTTTCACTAAAATTTT
-TTTGAAACTTAGTTTTTCGGATTTAGCGTCAAATTTTGAATCTATATAAA
-AAAAAAAATTAAAATTGATCTCAGATTGAGTGAATAATAAACGCTCAAAG
-TTGAAAAATGAACAACGCAAAAACGGCAGTAACTTGCTTCAAGGTCGGTT
-GTCTCAGTGAGTTTTCACTCAATTTTCGAAATTTTTTTGCTCTATCGCTT
-TAGAAATATTTGTAATTTCATTTTTTTTCCTCAAAATCAAAATATCTCAA
-ACGACCGCCATCCTACGAGAAGGGAAAAAAAAAGTTTTTGGAAAAAAAAT
-CAAAAATTTTTTTTCTGCCTCGATTTTCAAAATGAAAAAATCACTTTTTC
-GGAATAAACTTTTTCACAAATGTATTTTGATAAAAGTGGCTATTTAGGCT
-TAAGCCGCGCCATACCGCCGGTGTGTCATAAGGATTTCCAATATTTTATT
-CCAGTTGGGCATCCTAGTATGTTTTTCGGGCCTTTAGGCTTAAGTGTGTC
-ATAAGGATTTCCAATATTTTATTCCAGTTGGGCATCCTAGTTTTTTTTTC
-GGGCCCTTAGGCTTAAGTGTGTCATAAGGATTTCCAATGTTTTATTCCAG
-TTGGGCACCCTAAGTCTGAATAGCTCTTTTTCTTTTCTTTTGCGCTCCAA
-GCGCAAGGAAAAACCTTCTTGTAACTTTTTAAGAGGGTTAGGCTTATGCT
-TAAGCTTAGGGTTAGGGTTAGGGTTAGGCGTAGGCGTAGGCTTAGGTTTA
-GGCTTCGGCTTCAGGAATATTTAAAAAAAAAATCGAAAAATAGATTTTGC
-GAAAAAAAATCGTGATAAAGCCTGCTAAAATTTTCAAAAAAATTAAATTT
-TTCAAATTTTTCAAATTCCCAAGATTTTGGTCTCGCAGCGAAAACATCCA
-ACTACAGTAACCCTCGCCCTCTCCAATTTTCAGATCCGCCGCTCCAAGTT
-CTCAGTCCGCATTCCCGGGAGTGATGCTCCGTTGATTCGCCGTCAACTCC
-CACTCCAACTCGCCTGGGCCATCTCCATTCACAAATCGCAGGGAATGACG
-CTCGACTGTGCGGAAATTTCGTTGGAGCGCGTTTTCGCCGACGGACAGGC
-GTATGTGGCGTTGTCGCGCGCACGATCACTGGCGGCAATTCGAATTATCG
-GCTTCGACGCGTCGTGTGTCCGAGCGAATTCAAAGGTGAACAGGGGATTT
-TCGAGATGGAAATCTATGAAAAATGGATGGATGGTGTTAGATATCTCCTT
-TTCGTGGGTTCTCTCACGTGGTGTCAGAGTGCCTCATTTCGGCTTGATCT
-ACTGTGTAGATCTACAAAAAATGCGGGAGATGAGGAGACTCAGACTTCTC
-AACTGGTTTCGCATGGTTTAGAACGTGCTGACGTCACTTTTCTCTGGGCA
-TAAAATTCCCGCATTTTTTGTAGATCAACCGGTAAGGGATCTCTCAGCTA
-CGTGGAAAATTATCGATTTTTTATCGAATTTTTTGCAGGTTATCGATTTT
-TACAAATCCATCGAGGCAGAATGCGACGACGAACAGGACTGGGAAGCCCC
-TGCTGCTGGACCAAGGCTCAAGCGAGTTCGATCGATTTAATTTTTTTTTT
-TAAATTTTTTTGTGATCTCCAAATGTTCTGTCTTTCTGTCTTCCCCCCCC
-CCCCGCCAAAATTCATTAACTGTTTTATTTCACAACACTCTGTATCATCA
-TAATTTTCACATAAAATTGGCTATTTCAATGTTGACGTCGAATTTTTAGT
-CCTATCAGCGTCATCGGATCTGAAAAAATGGAAAACTTGAACAAAAAAGC
-AGGGGGTGGCCTAGAAAGCACAAAAAAAACTCGGACACAGTTCAACGGAG
-GCAGTTTTTGGAAAAAAAAAAACGTCATTTTCGTATAGCCACACTGAAAT
-TGAAAGAATTCTGGCCGAGTTTTCCAAATTCTAGGCCACCATGCAAACCG
-ACATTTTGGGCGGAAAAGTGCCGGTGGCCGTGGAAGAAGGAAAAACTCGG
-CCACTCTTCTATGTACTCCTCTCGGAGAATTGTGTTTTCCATGGCCGAGT
-TTTTGTGTTTTCTAGGTCATGTCGGCATTTTTCTTAGTCAGTTTCAAAGG
-AAATACGATACCTGGTCTCGACGCGAAAATTTTTTAATTAAATCCAAAAA
-GACGTGCGCCTTTAAAAAGTACTGTAATTCCAAACTTTCGTTGTTGGGAA
-ATTTTTATCGATTTTTCGTAGTTTTCAAAAAAAATAATCAAATGTACACA
-GGGTTCTGTTCTTCCTTATTGATTTTTTCGCGCTCCATTGACAATCGCCC
-GCAGGATAACGCGTGGGAAAGTCGTGTACTCCACACGGACATCGAGACGC
-GACGCGACACGCAACGCGCCGTGAATCTACCCCAAATATGGCCGAGCCAA
-AATGGCCTAGTTCGGCAAACTCTTCCATTTCGATTTATGAGGGAAACCAG
-AAATCCGTGAGTAGTGAGAAAAACAACGAAAAAATCGATAAAATTTCCCA
-ACAACGAAAGTTTGAGATTACAGTAGTCTTTAAAGGCGCACACTTTTTCG
-CATTTAACATAAATTTGTCGTGGAGAGAGTATTTTTGGCGCAAAACTTCG
-CATTCGGGTAATGATAATAGAAGAATTGAAACTCACAAATTCTCCGCCGT
-CTCCTCAAGCAGCAGCGGCACAATAAACATGAAATACACGGCCAACACGA
-AATGAATCGGCACCATCGACACAATGAACAACGACATTCGGAGCATGTGC
-TCCAAAACTGTCGGCCGCAACTTTTTCGACGGATTCTCAAAGACGAGATA
-CACTTGCATCGGGCTGTGCACATCTTGAACCGACTTCTTCTTCATTACAG
-CGCTCCCTTCTCTGGGCAGCAGGTAGCGTGTCCACGTGGTGTAGGGTGAC
-TCAGTGGTTGTGTGATTTATCGGCGTGAGCTGGAGCATTTTTGCAGAGTC
-GCAGGCCAAGGTAGCGGAGGTGTTGGCTCTGAAAGTAGATTTCATACAGG
-ATGGTAATTTCGGGGAGTACTGTAGTGGTGTTATAGTGGTACTGTAGGAG
-TACACTGTAGGGGAACTGTAGGGGTGCTGTAGCAGTACTGAGGGGGGTAC
-TGTAGGAGTACTGTAAGGGTGCTGTGGGGGTACTGTAGGAGTAATGTGGG
-GGTACTGTAGGAGTACTGTAGGAGCACTGTAGGGGAACTGTAAGGATACT
-GTAGGAGTAATGTAGATGTACTGTAAGGGTACTGTAGGGGTGCGCTAGTG
-ATACTGTAGGGATCATGTAGGAGTACTGTAGAAGTCCTGTAAGGGTACTG
-TAAGGGTACTGTAGAGGTGCGCTAGTTGTACTGTAAGGGTACTGTAGGGG
-TACTGTAGGTGTACTGTAGGAGTAAAGTAGATTAACTGTAAGGGTACTAT
-AGGGGTACGCTAGTGGTACTGTAGGAGCACTGTAGGCGTACTGTAAGGGT
-ACTGTAGATGTACTGAAGTAGTTCTGTAAAAGGTACTGTAGGGGTACTGT
-AAGAGCACTCTAGGGGCATTGTAGGGGTACTGTAGGTGTACTGTAAGGCT
-ACTGTAGATGTACTGTAAGGGTACTGTAGTTGTTCTGTAAAGGGTACTGT
-TGGGGTACTGTAGGTTTACTGTAAGGGTACTGCAGGGGTGCTGTAGGGAT
-ACTGTAGGAGTACTGTAGTGGTTCTATAGGAAGACAAACTTTTTTTTGAA
-TTTACTCATCGGAGAATCTAATATTTTTCACCAAATCGATACACCATAAA
-AATTTTAGGACCCAAAGCTAAAAAAAAAAACCAACTTCTCCAATATCATC
-TCCATCAATTCCAGTTGTTCTGTGCAGTTCGCCATCCCTTCCTTCTTCAA
-TTCCTTCGCCCGATTCTCCAAATCGTCCACCATCTTCACACCCCGCCGAC
-ACGCCGTCTCCACATACCGTTCCGTACCAGCTTCCGCAATTTTCATAAGC
-TTCTCGACAGACTCGTTAAACTTGCGTGTTGGCTTGAACAAATGGGAACC
-TCGAATCGCCTCGGGAACCGGATTTCCACCTCCTTCCACCAGGAGGCTGA
-ACAGTGTCGTTTTCTGCCTGACGGCCTTAGCCAGGACGTGCCCATAGTTG
-ATCATGTAGATTTGCCCGTTTTCAGATATGTTGAATGTTTCAGCAGATGA
-GAACATTTGAAAATTATTTGATTGTGCGTGTTCATGCACCACAGTAATGA
-ATGCGAGGCGGCAAATTAAAACTCTGAAAGTTTAGATAATTGTACTTTAG
-TTGAAATCTACTTTGGTTGACAGGTGCATCGACTAGACTAAAAAAAAAAG
-CAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTA
-GGTAGGTAGGTAAGTAGGTAAAGCGAGACACGGTGCATCGATCTGACTTT
-AAAAATCTCAATCTCGTATCTTAAGCGTCTTTGGTTCTGTCAGGGAAGCA
-GGTAGGGGGGAGGTAGGTGTGATCAGGCAGAGCACCGGAGTTAATATCTG
-GTGGATTGTGGGCTGCTAATAGGTAGGTAGGCAGGTAAGCAAGCAAGCAA
-GCAGGCAGGTAGGTAGGTAGGTAGGTAGGCAGGCAGGTATCAGTTGACAA
-CTTTTTGATGAAACTAAACGGAGCCGAGTTATAAGGTGCCAAAGTTGCAC
-TAGACATGGTGCATCGACCTAACTTGAACAACTCGTATCTCAAGTGTCTT
-TGGTTCTATTTGGGAGGCAGGTAGGTAGGCAGGTAGGTAGGTATATCTTA
-GGTTGTTTCAAAACTATTATACATTAAAAATCAATAAAAATATTTTGCAC
-GAATTTTATCAGTTGACAACTTTTTGATAAAACTAAAAAGAGCCGAGATA
-TTGTAAGTTGCAAAAGTTGAACGAGACATGGTGCATGGAAGGTAGGTAGG
-TAGGTAGGTATTTAAGTAGGTAGGTAGGTAGGTAAGCATTCCGTATTTCT
-CTCTACTTTGACAGCTTATATCCTGGTTGTTTTGTGTTGTATCAAAAAAT
-GTTTAACAAAGATAACATAGAAAAATATTTAGCACGTAGCAAATTTAAAA
-AACTAGGTTGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGAAAG
-GCAGGCATGTAAGTAGTAGGTAGGTAAAAGTACTCACGTGGAGAACATCA
-AGCAGAAGATCGCTGAGCAAATTGAAAGTGGTACTGGAAGTTGAGCAAGT
-ATTTTGGAGTATTTTTCTGGAAAAAAATAAGTATTCAAAGTAACTAAAAT
-AAAATACCAACTCCGAAACTCAAACTTCATAATAAACAAAATCGTCAGAA
-TCCCACTGGAGAGGACTGCAAAAGTCACTGTCGTGTTGGCAGACGTCTGA
-TAAAAATCGAGGGTGTGTCCGGATGGTAGGAGAAGCACATTATCGTGATA
-CTTTGACACAAATTCCTCAATAGACGCCAACGCTTTTCCGAAAACTGGAA
-TCGAAATGTTCAAAGCATTGAGAATTATTTTCTGGTACTCTTCCACCAGG
-ATGTTGTACTCCGAGTTTAGATCCGCTGAAAAATTTAAATTTGTATTAAA
-TTGGGCAATACTCGTACTTGCCTACCTGCCTACTGGTAGGTAAGCAGCCT
-ACTTATTTTCAACTTACAAAACTCCATATACTTTGTAACGTTTTCCAATT
-TCGCAAAAATCGATTTCTCGAAATATTTGCACTTCCCCTCGACAAATGAT
-TTCTTGGCGGGAATCTTCAGGAACAGCTGAAAATTTTTTTTTCCGGTGGC
-CGAGTTTTTTCACGGCCACGACGTACCTTATTAAACATGGTGAAGTTGGC
-GTAGTCATGCAAGAACCAATTTATTCGGCGGCGTTCGTTTTCGGTGACGG
-CGAAGTCTCGTTTGAACAAGCACGGTATGTAGGACAGCTTACGGTGGAGA
-CGCTCTTTGATGGCTGGAAGTTATGACGTCATGAATAATAAGGGATGAGA
-TTTCTAGGCCACGTGTGACGTCACAGCAATCCCCGAAACCTTTTTGGATG
-GCCGAGTTTTACCGATTTCTAGGTCATCGAGCGAAACTTTTGTGATACTT
-TGGCAATGGTCATCAGGTAGACAAACAACGTGATAATTTCTAGGCCACGC
-TTGACGTCACGTGGCCGAGATTTCGCGCCAGGACCTAGAACTAGACATGG
-TGCATCGACCTAACTTAAACAACTCGTATCTCAGGTGCCAGGTAGGTAGG
-TAGGCAGTCAAGCAGATAGGTAGGTAGGCAGGTATTTTAATTTCATTTCT
-GCGGCTACAACACAATTTCTCTTCCAATCAAGGACGTAAATTTCTAGGCC
-ACACATGCAGAGTGCGGACTAATAATTAAAGTGTTTTACGACATGGCCGA
-GAAAAGAGAAACCTAGGCCATGGTAGTTAGGTGTGACGTAACGCCACTAT
-AAAACTATAAAACTCACGCATAAAACTGTGATCATTGGCGGTTTCGAGCA
-TCGTCCTTCCATAGACCGCATCCTGAGTACACTCTCGTAAATTGGCGGCC
-AAAATTGTTAGACCAAGGATACAAAATATGGGGATAATGGTGAATCCGGA
-GCGATTATCATCCAACCAATACACGATTACTTCGATAACCTCGAAGAGCA
-GCAATTTCCAGACGACGAGGAATATCAGCAGAGCTGTGATCAGGCAGAGC
-ACCGAGATTATTATCTGGCGGATTGTGGGCTGAAAATAGGTAGGTAGGTA
-GGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAGGTAAG
-TAGGTGGTAGGTAGGGAGGCAGGTATCAGCTGCCAACTTTTCGATAAATA
-TTAAACGGAGCCGAAATATAAGTTGCCAAAGTTGTACTAGACATGGTGCA
-TCGACCTTACTTAAACAACTAGGTAGGTAGGTAGGTAGGCAGGCAGCTAG
-GCAAGTAGGTAAACTCACCAAATGCCTGAAAACAATTGCAAGAACATCGG
-AATAACCCGAGCTCCTCCCGTTCAACGTCGCGACCACAAGCGCGTGCACA
-CTTTTCCGCAGCTTCTCATCATCGCGATCAGCGCAAAAATCCTCGATTAT
-CTCGAATCGATGGCTCTTTTTTGTGTGCGCCGGGTCTAATTTATAGCTGA
-TCGGCTCGGGAAACCAATCGTCACACTGCAGCTTCGCATCCTCCAAGCTG
-AAGCCGTGAGAAAACTGTGCACTGCATAGGAATAGAAGTAATTTCAGTTT
-CATTTTGTTCTGGAAGAAGGCATTTTTATGGATGGAGTTTGAAAATAATA
-ATTAAAAAAAAAACTTACAGCTGGAACTTTGTGAAATCGATAATGAAACA
-ATAAATCTAAAAAAAGCTCAAAAAATTTTTGACAAAATTTAAAACTGTAA
-CGTGTATGAAGGTCACGTGAAAACTGAAAACTCACCAAAAATGTCGAAAA
-ATAGCAAGAAACTAGGCACACGTAGACTTATGGTAGGCAGGAAGGCGTAG
-GCGTTGATCCAGGCAGGGTCACGTCTTGAAGGCAGACTGTTAGGTATAGG
-TAGGCATAGGTAGCCATGTAGGCGTAAAGGCAGGAAGGCATCTCTAGATC
-CTTTTTGTGGCAGATTGGCCGCTTTGCAGGCAGGCAGGTGTGGGTGGCCT
-AGTAGACCGAAAAACAAGCAGGTAAAGTTCCTATAGTAGTAGGTAGGCGA
-GCCAAACCTTTTTTGTAGATGATGAAGTAGGTGTAGGCCGTCTTTTGAAG
-GCAGTGAGGCAGACAAGGTTAGGTCGTCGCAAAGGTTGGCTGGAAGGTAG
-GCACGTGGGTCAGCAGATAAGCGTAGGCAGGCATAGGCAGGAAGGCATAG
-GCAGGTAGACGTAGGCAAGTAGACGTAGACAGGATAAGATTCAAATATGA
-AAATCGTGAAAAGGGGAAAATTTCTTATTCTTCGAGTGCGCGACAGTATG
-CGTAGGCAGGTAGGCGTTGGCAGGTAGGCGTAGATAGGTAGGCGTATGCA
-GGTAGGCGTAGGCAGGTAGGCGTAGTCAGGTAGATAAGCAGGTAGTCGTA
-GACCGGGTAGGCGTAGGCAGGTAGGCGCATGCAGATAGTCCTAGGCAGGT
-AGGCGTAGGTACGTATGCGTTGGCAGGTAGGTGTTGGCAGGTAGGCGCAG
-GCAGGTAGACGTAAGCAGGTAGGCGTAGGCAGGTAGGCGTAGGTAGCTAG
-GCGAAGGCACGTAGGCGTAGGTAGGCAGGCATAGGCAGGTAGGAGTAGGC
-GTAGACATGCGCACATGAAAACCTTATAAATGTTTCAACCCCATCATCAT
-CATCCCATTTTTCTCTCGATCAAAACGAAAAAATGTGCGCAAACACAAAT
-TGCATCCATTTCTCTCTCTTTTTTACTCACTTATATATCTCTCATCACTT
-TATCCCCCGTTTTTCAATCCCTTCCAAACACTTCCAAAACTCTCCAGAAC
-TCCTAGAGAGTAACACGAGAGAAAATATTTGAACTTTTGTCTCGACCAAG
-TTTTTTTTTTTGGGATTTTTTCTTTGGATTTCTACAAATTTGATGTATTT
-TTTCCATTTTTCGTGCAAAATATGGTAATGGACTAGGTTTTTGCTACGTG
-GCCTAGAAAAATCTCGGCCACCGATTCTGAGCTGTTGCAGCGGCCGCGGC
-CGAGGGTTTTTCTCTTCAATCGATACCAATCCCTCTTTTACGCAAGGAAT
-CACGTGGAGTCAGAGTGTCTCATTTCGTCTTGATCTACGTAGATCTACAA
-AAAATGCGGGAACTGATTTCGTATCGTTAAGAACATGCTGACGTCACATT
-TTTTTATCATAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGAC
-AGCCTGGCACCACGTGCTCTTCCAACCTTTATATTTTTTTTGACAAAATC
-TTGAGAATTTCTAGAATTTCAACGAAAATCCAATTTTATACCTAAACTTA
-AAAAAAAATTGCTAAATTGTGTTCGACTAGCAAAAAATGCACCCAGTTTT
-ACAAAAAATCTTTTTTTCTGAAAAAAAATTCAGTGGAAAATGTCTATAAT
-TTTCAGTAATTCATACTAAAAAAAATCCAATTTTTACAACAAGTTTTTGT
-GGCCGCGGCCGAGGTTTTTCCTCTTCCACGTGGTGTCAGAGTGTCTCATT
-TCGGCTTGATCTACTTAGATCTACAAAAAACGCGGAAACTGATTTCTCAT
-GGTTAAGAACGCGCTGACGTCACATTTTTTTGATCGTAAAATTCCCGCAT
-TTTTTGTAGATCAAACCGTGATGGGACAGCCTGGCATTACGTGAAAACAA
-ACAATGCAAGCGCGCTCTAATGCGAATTTATTTGCTCTACCACCAGATAA
-ATTCCACTTCTTCACAATAAACCTAAATATTTTTTGTGTCAAAATCTTGA
-GAATTCTTAGAATTCCAGAATTTCAGCGAAAACCTAATTTCCGATTTTGT
-TATTGTTCAGGGGAACAAGTGAGCCACACAGCTTCCGCTTCTGCTCCGAA
-TTCGATTCCCCTGAGGCATTTTTGTTCGAAAAAAGCCTCATTTGTCATAC
-TTGTCGGCAACTTTCTTCGAAGTTTTTGTTCTTGTTTCAAATAATTTTTC
-TTCAATACTTGTTCCTTCCGTCCCAGCAGATGTTCTTTTGCGGGGGGGGG
-GGGGGAGGGGAGAAAAAAAATAAGAGAAGAAGCAGAAACTCGACACTTTT
-GTGTCCGCATTTCTCGTAAAGTTTTCAGATTTTTGAGCTTTTCAAGCTAT
-AGCTGAACCACCTAGCAAATTTCGCCGCAGAGTTGATTTCTCCGGGAGTG
-GGCTTTCTACTGGAGACCTCACTTTTTTTGCCTTTTACTAGAGCTTTTTA
-ATTTTTTAATAATTTATTGCAGCTCTATGGATTTTCCAAAAAAAACCACC
-GAAAAGCCCGAAAAATCAAAATTTTCGTTTTTAAAACCCTAAATTCCATA
-CTCCGTCCAAAGAACACTCACATAAAAATGAAGAGATTTCGCAAAAAAAG
-TGAAATCCAATTCAATTTATTTCAATTTTGAAGAGTGCGTTCGTCAGCTT
-TTTTTTCGACAAAAAAAAAAGAAAATGTGTAGTGTAGTTTTCAACAGATT
-TATTGTTTTATTAATATAATAGAAATCAAACCTTCTTTCTGCCTACCTAC
-ATGGCTACCTACATGCCTACTTGCAAGTAGACCTGTCTATCTAGGTACTT
-ATCTCACACCTCTTTACCTACATACCTACCTTCCTACTCACCTGCCTACT
-CATGTAGACATAAGTGATCGTCAAAAAAGAAGCTGATGGATCAAAAGTTT
-TTGGAAATTTATTTCGATTTTCAGGTTTTAAAAATTGCGGAAGATGTTTA
-ATTTTTGACGATTAGTTTAGAATTTTTTTTAATTAAGAAAAAAAAATTAT
-TATTTTATTTTTAAATTACTCCAAATTTTCTTCTGATTCCGAATATCTAT
-GTGAAACTTTTTTTAATTCCTTGGTTTTATATCTAAGCTTAAAATCGCTA
-ATTTCATTTGTGCACCCAAGAGATTTCGAATTTTCACGGGGTTCTGGCCT
-TCCTCCTTGAATTTTTCGCGCTCCATATAATATTGACAACCGGGCAACGC
-GTGGGAAAGTCGTGTACTCCACACGGACAAATACATTTAGTTTTACAACT
-AAAATCGAGCCGCAACGCGACACGCAACGCGCCGTAAATCTACCCCAGAT
-ATGGCCGAGCCAAAATGGCCTAGTTCGGCCAAAACTCTTCCATTTCAATT
-TATGAGGGAAGCCAGAAATCCCGTGTAATTTTCGCGCCAGAGACGCCATG
-TGTCGATTTACGAGATTGGTGTATATTTACAAAATGCGTAATATTTATAG
-AATGCTGATTTCCGTTTTTTTTTTTTGAAAAATGTCATGTGTGCACAAAT
-TAAATTCGGCGATTTTAAGCTTAAATATAAAATCAGGGAAATTTTTTAAA
-TTTTTTTCACGTAGATATCCGGAATCAGGGGAAAATTTGGAGGCAATTAA
-AAATGTCTCCCTGATCATTTAAATTCTTTAAAAGTACTCTTCAGAATCCT
-TTTTTCCTAACCAAATAAAATAATTTCTGACGCCTTTTTTTTCTCTTTTC
-AATAAGAAGCAAAAAACAGACGAACCTATTCCAATTTCCCACCACACCAA
-TTCGTTCTTTCCGCATTCTTTTTCTTCCATTATTTATCTCCCTTTTCCTC
-CATTCTCTGTGCTCTTATATATATCCATCATCCCATTTTCTTTCTTGTTG
-TGTGGTATGCTCTTTTTCATCCATTATTCGAAAATTCTCATTTTCCAAAG
-TTTTTTGTCAAATACATTTTAAAAATTTTTTAAACCAAATCTCGCCGTCC
-ATCGATTTTAAAATACCTTTTTTGAGAAGTTTTCAAGAAATTTCATTATG
-AAATTCGGTGTTTTCAGACAATTTTGAGTCTAATAAAACAATTTAAAATT
-TTGACTACATCACCTTTAACTTGTAGAATGCCGTTTAAACACACTTATCA
-CTTTTTCAGAATCCCATATGCAATGGTATCACTTGCTCCTGCTAATTCTC
-ATGATCCTGGTCCTAATCCCATGTTTCTGGCAAGCTTGGCTACGATTTTC
-CCGTCGATTCTCCGATTCCTATGATCTATCAAGAAATGCGCAAAAGCGTG
-ATGAGATTTCAAAGGAGTTTTATGTATAGCTTACTGACAGGATTTCAAAA
-AACAGTTACGGTAAGATTTTTCGAAAAATTTCACGGATTTCTGGCTTCTT
-GCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTTACGGCG
-CGTCGCGTGTCGCGTCGCGGCTCGATTTTATTTGTAAAACTAAAGGTATT
-TGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATTG
-TCAATGGAGCGCGAAAAATTCAATGAGGAAGGCCAGAACCCCGTGCCTGT
-ATAGGATATTTTGAATCTCAAAAGAATTTGAAGATTTGAGTTTTTTGAGT
-TTGAGGTGGAAAAAATCGTAAAAAATTCCTTTCCGATAAATTTTCGGATG
-CAAAAATGTGATCCATGCTGTAAAAAATCCAAGAAAGCCAAGAAATGTGC
-GGAGCCTATTTTCCGATTTTATATTACTTTTTATTTCAAAACTTGATTCA
-AAAATATCAAATTCGGAAAAAAAACCGCAACTTGGTAAAATTTCCTCGAA
-AAATATTCTCCGCTTAGGCTCCGCCCCTCTCTTGGCATTTCGAATTTTTT
-CGTTAAATTTTTGGAAACTGAAATTAAGTCCAAAAAGAACCAAGAAACGG
-GCGGAGCCTATTATGGGATTGAAAAGACATGGTGCATCGATATGGAAACG
-GCTTTTAATTTGGTTTTTTTTAAATAAGAAACTAGTAAAATTCAAGTGGC
-CTAGCTTTCAACTCTTCCATAATTCCAGGGTACATTCCAACTGGTCATTG
-CTCATTGCTCTCTCTTTATGCTTCTCATCACCAACGAATCCACTCAATTT
-TCACTCAAGCTGTCATCTCCAGCAGTGTCTCTCAATTTAATTATGCTTGA
-AATTGTTTTATAAAATGAAACAACACATACTCTGTAAAAGCAATTTATTA
-TTAAAAAGTATATATATACACGTATTCCTGGGTGGGTATTGAGACTAACG
-GAAGCGACATGGAGGAGAATTTGAATTTCATTAAAAAAAAAAAACAAAGA
-GGTAGGTTACTGTAGCATCCAATCTGGAGGCTGCACAAAGAAGACTCCAC
-CGTCAGTGGCGCAATATGTTGGACACACCTGGAACGTTGAAACATTATTT
-ATTTCTTTAAAATTTTCTTTGTCTAAGCCTGAGCCTAAGCCTGAGCCTAA
-GCCTAAGTCTAAGCCTAAGCCTAAGACTAAGCCTAAGCCTGAACCTAACC
-CTAGGCCTAAGCCTAAGAAAAAGCCTAAGCTTGAGCCTAAGCCTAAGCCT
-AAGCTAAAGCCAAAACCTAAGCCTAAGCCTAAGCCTAAACCTAAACCTAA
-ACCTAAGCCCGAGCTTAAACCTGAGCCGATACCTAAGCCTAAGCCTAAGC
-CTATTCCTAAGCTTAAATATAAACCTAAACCTAAGCCTAAGCCTAAGCCA
-AGCGCTGAGCGTAACTTAGAGCCTAAGCTGAGCCTGAGCCTAAAACTAAG
-CCTAAGCCTAAGCTTGATCTTAAGCTTAAACCTAAGCCCTGAAAATTTTT
-TTTTGAACTCCACAACAAAATTTGTAGAATGTTTTTAAAAATTGGGATTC
-TGAAATTCCCCGCCAAAAAGTTTAAAAACTTCACATTTTAATTTATCTGT
-AAAATTTATATAAATCCCTCTTAGATTTTGAATTTCGCGGCAAAACTTGT
-AGAACATTTCAAAAATTTACTTTCGCGCCAAAGATTGTCGCGCGAAATTT
-ACAATTTTTCTATAAAAAATGTATTTCATAGAATTTCAAAAAATCGAAAA
-TCGCGCCAAAAATTTTTAAAAATTTTTTTCAGTATTGTGACGTCATAGAC
-TACAAACTAACCCCTCTATTGCCTTCCTCCCCGTGCTCTCCAATGAGTCC
-TTCGGCTCCAGCGGCTCCATCATTCCCTGGGAACCCGGGCTTTCCTTTTT
-TTCCTCGTGGGCCTTGTGCACCAATCGGGCCGTCGATACCAGGCATACCA
-GACGGTCCTGGCGGCCCGAATTCTCCTTCCTCTCCGATCGGACCTGCTGG
-TCCCGGGATGAACGGTTTCGGGGTGGCGTCCGCACCCGGGTCGCCCATTT
-CTCCATCCAGTCCTGGGATTCCCTGAGGGCCTTGTAGGCCTTTTGGTCCC
-ATTTTTCCATTTTCCGCGCGAAGTCCATTCTTTCCGGGTAGTCCTGGCTT
-ACCAGTGTCTCCTTTCACTCCCTGAAAATTTAGTTTAGTGGTATAGGCCT
-ATCAAATAGGCTTACCGTAATCCCAGTGGTTCCTTGTACTCCTCTCGGAC
-ACGGATCCGCACACAAAGACTTATAATTCACAGGAGGCTCACATGGTAGG
-CGCGCTGGAAGTCCAGGCGCACCTTCCGATCCTTTCGTTCCAGGAAGACC
-GTCTCTTCCAGGGATCCCCGGGGGTCCTTGTGGATGACGGCACTCACATA
-CTCGGGATCTTGCGGTTTGGCCGGTTTCGTGTAGGAAATCGTCGATTTCA
-TCTCTTTTCTGGCGGGTTATGTTTTGGAAATCGTTGGCGACATCGGATAG
-CATGCTTTTCATCTCGAGGGCGCTTTCCTGGAAATTTAAATTTGCTTGAA
-ATTTTCAAACTTGTTATATTATAATTTACAAAATACTGACTGCCTTTGTA
-AGTTTTTTATTACAGGAACACAAAATTCTAAGAATGCGTACTGCACACTA
-TATTTGACGTGCAAGATATCTCGTAGCAAAATCTACAGTAACTCTTAAAA
-TGACTACTGTAGCGCTTGTGTCGATTTACGGGCTCGATTTTCGCAACTTT
-TTTTCTTTCGGATTTCCTTCGTTTCCTCGTATTGTTTTCTAACTTTTTAT
-TTCAAAATTTCAATATTCTATCGATAAATAAATCATTTTAATTTATTTCG
-AAAATCGAGCCCGTAAATCGACACAAGCGCTACACGAGTCATTTAAAGGA
-TTACTGTAGTTTTCGCTACGAGATATTTTGCGCGTCAAACATGTTGTGCA
-ATACGCATTCTCAGAATTTTGTGTTTCTCTAATACTGTGTTTTTAGGATT
-TTGAATGAAAGGAAAAGCCCGAAACTTTTAAACAAATTTTTCGGTGCATT
-CTGTATCAAAAAAGCTGAATAAAATTGTACAAAAAAATGCCACATTTTAT
-TGAAAAATTGATAATAAAATAATTTGTTTTCAAATAATTTTTGAATTTCT
-CAATTTTTTGGAATTTTTGGATTTTTTCGGGCCAGAAAGTAGGCATTCTC
-ATGAACTGATGTTTTCTTCATAATAATATATTCAAAAAAACGGTCTCCCA
-CAAAAAAAGGTCCGAGAGGCGAACAAGGTTGTAAAACGTTGCTATTGTTT
-ATTTACAACCGCCATTATACCCCTATAGGGGTTGTAACACCACATAACAA
-TTTGATAAGATGCACACAGTAGGGAGAGGGACCTAATTTAAAAATATAAG
-AATTTTCTCATTAAATACAATTTTTCTCTATTTCTTTCAGGAATATCGAG
-AGGAAAATCAGCGAAATTTTTGGAAATTTTTGGTTTTTTTCTAACGAAAC
-AAAAAAAATTTGAAAAATTTCAAGAAATTCTGTGTATTTATCGATAAAAT
-TTCAGAAATCAAGGGGGTCGTATAGAAGTTAGACGGTCGGTTTTTCGACT
-TTCAGCTAACTTTATGAAATTTCATTTGTTCAGGTTTTCTGACATTTAAA
-ATCAAATGGCATTAGCAGTTTTTCATGAAAAGTTTCAGAAAGTCTCAAAA
-CTCCAAATTTTAGGAGGGTCGTATAGAAGTTGGACGCACTAAAAAAAAAG
-GAAAAATGTGGTTCTAATTATTACGGAAACACTAAATTCTGAGAATGCGT
-ATTGCACAAAATATTTGATGCGCAAAACATCTCGTAGCGAAGACTACAGT
-AATTCTTTAAATGTCTACTATTGTAGCGATTGTGTCGACACGTGGTGCCA
-GATTGTCTCATTTCGGCTTGATCTACGTAGATCTACAAAAAATGCGGGAG
-AAGAGACGCAGACTTCTCAACTGATTTCTCATGGTTAGGAACGTGCTGAC
-GTCACATGTTTTCGGGCCGAAATTTCCCGCATTTTTTGTAGATCAAACCG
-TGATGGGACAGCCTGGCACTATGTGTGTCGATTTACGGGTTTGATTTTTG
-AAATTGATTAAAATAATTTAGTTATCGATATTATATTGGAATTAAACAAA
-AAGTGAGAAAATAAATCGAGCCCGTAAATCGACACTACAATAGTCATTTA
-AAGAATTACTGTAGTTTTCGCCACGAAATATGTTTGCGCGTCAAATATAT
-TGCGCAGTACGCATTCTCAGAATCCGTAATCCTCAAACTTCTCACCTGAC
-AGTACTCGGCATCGTTGACAGTATTCTGAATAGCCGGTCGAAGTATTGAG
-GCAAGGGGTCCTACAGAAACAATAAACGACGACATCGTGGATAGCGAGAT
-AAATAGTGAAACTATGATTAACGTGGCGTATGCCGTTTCTCGAGCATTCT
-CGTTCATTTTCCAGGAGAAGCCTCCAAGAGAAGCCTATGGAGGATCCAAC
-GAAAAGTGAGTAAAGAAATGATGCGCTGGCGCGGAAAAACGAGAGCGATT
-ATGTATGGGAGTGACCCAAAAACACGGAAAAGTAACGGATAACAAGAAGA
-AGAAGGGGGCAACTTTCTCTTTCTTATCATCATCACCATCATCATTATCT
-CCTTTCTCGGGATTCCGTCATGAGAATGAATCCATTTACTCGTTTTTTTT
-GTGTCCATTTAAGTTTGTCTATAAATATGGCTAATTTCAACTTTAAAATC
-AAATAATGAAACTAGTAATTCTACTCATCTCTCACGCAATTCCTTTCTTT
-TATGTGATATATAACTTTTATTCCATATTTAAAGAAATTTCAAGTTTAGA
-GTCTAACTTGAAAATTGCCAGTGATGAATATAAAATTAGAATGAAGAATA
-TTTCCAGAGAAGTTGGAAGTGTAGTCTTGGAGGAGAAGAGAGGAAAGAGG
-TGAGGAAAAATTACGTTTTTTTGAAGTTTTTTCTTTAATTTTCGAAGGAT
-TAGGCTTAGGCTTGGGCTTAAGTTTAGGCTTAGGCTTAGGTATAGGCTTA
-GGCTTAGGTTCAGGCTTAGGCTTAGGCTTAGGCTTAGGCTCAGGCTTTTG
-TTCAGGCTTAGGTTTAGGCTTAGGCTTAGGCTTAAGCTTATGCTTAGGTC
-AAAGTATAGGCTAAGAGGCCTAGGCTTAGACTTAGGCATAGGCTTAGGCT
-TAGGCTTAGGCTTAATCTTAGGCTTAGGATTAGGCTTAGGCTTAGGCTCA
-GGCTGAGGCGTAGGCTTAGACCAAGGCGTAGGCTTAGGCTTAATCTAAGG
-CTTAGGTGTCGGCTTAGGCTTTAGCTTAGGCTTAGTCTTAGGCTTAGGTT
-AATCTTAGGCTTAGGATTAGGCTCAGGCTTAGGCTGCGGCCTGGGTTTCG
-GCTTAGGTATAGGCTTAGACTGAAGCTTAGACTTAGGTTTGGGCCTAGAA
-TTAGGCTTAGGCTTAGGCTTAGGCTTGGGCGGGGCTGGGCGGATGAGAAA
-AAGAGAAAAATTCCAGGAAAATCCAAATAAAATCCAGAAAAAATAATAAA
-AAAAAGGAAAAAACGGGAAAAATGGGGCATTCCGCGTCTGCCGCGTCAAA
-AACTTTTCCTTAAAAAACGGACAGAGAAGGACCAAAAAAGACAAAAGTTT
-AACAAAAAATAGTTAAACATTTTTTTTGACGGGGTTGAGCTCACCCAGCT
-GAGCTCACTCCATAATTGCACACAAAATTCTCAAAAAATTAATTTTAGAG
-ACTACACAGAGGCTAGCAAATGCACATGCTCTTCAACGATTTCTCAGAAA
-TGCCCGCCAGGCTCCAAAGGTGCTCCAGGAGCCGATGGTCTGGACGGGAT
-CCCCGGCTCCAGAGGTCTGAATGGTATGGATGGAGAGGCTGGGCACAGTA
-ATATGGATGTTTGTGAGTTGCCCAAGATCTTTTATTTTTTGTAAATTCAT
-ATTCCAGTCATGTCACCAACAGGATGCATCCGTTGCCCAGCGGGTCCTCC
-AGGTTCTCCTGGTGATCATGGTTCTCCTGGTGAACCAGGGTACCCGGGAC
-CTTCAGGACCTCCAGGGGAACCCGGTTACGCAACAATTGGGCTTATCGGG
-CCACCTGGACTCGCAGGCCAAGATGGTCTAGATGGAGCTCCTGGCGAGCC
-GGGAGTAGGTGGAATGGATGCAGTGAAGATTGTTTCAGTTGATGGAAAAA
-TTGGAAGAAGAGGAGAAGCGGGGAACAAAGGAAGCAAAGGATCTCGAGGA
-GGAGTTGGAAAAGCTGGAGGGCCTGGGGTGGCTGGAGAAATGGGAGAAAA
-AGGAGCAAGAGGTGAAGATGGAAAGCCTGGAGAGTCTGGAAAGGTGAATT
-CTCAGAAGTTGATCGATGCACCAGGGCGACAAATTAAGCGAATCGGCAAA
-TTGCCGATTTGCCGATTTGCCGGAAACTTTCAATTCCGGCAATTTGCCGG
-TTTGCCGATTTGTCGGATATCAAATTTGCCGGAAATGTTTAGAGGGATTT
-TTTAAAAGACGAAAACACTTAAAACTGTGTCTTTTTGAATTTTTTCCCGT
-TTTCCTAACTAGGGAATATTGTTAATAGGGGAATTGCTAGGAAGAAAAAA
-CAAACTTTAAATGACAGATGAGGTCTTTGGCTACAAAAATCATTTTTTTC
-ATTATTTTCATTTTCATAGAATTTGCTCACTTTTCAAAATAGACGTAGGA
-ACATTCATAGGATGCGTTTAATTTTGCCATTTGAAATTTAAATTCTGAAA
-TTTCCAAAAAAAATCGGCAATTTGCCGGTTTGCAGATTTGCCGGAAATTT
-TCCATTCTGGCAATTTGCCGATTTGCCGATTTGCCGATTTGCCGGAAACT
-TTCAATTCCTGCAATTTGCCGGTTTGCCGATTTTCCGGAAATTTTAATTC
-CGGCAATTTGCGGATTGGCCGATTTGCCGGAAATTTCAATTCTGGCAATT
-TGCCGGTTTGCCGATTTGCCGGAAATTTCAATTCCGGCAATTTGCCGGTT
-TGCCGATTTGCCAAAAATTTTAATTCCGGCAATTTGCCGGTTTGCCGATT
-TGCCAAAAATTTTAATTCCGGCAATTTGTCGATTTGCCGATTTGCCGGAA
-ATTTCAATTCCGGAAATTTGCCGATTTGCCGGAAATTTAAAATCCGGCAA
-TTTTCCAAAACTGTATAATTTTTCAGCCCGGCGCACCTGGAATCCCTGGA
-AAAGATGGTACATACTGCCGATGTCCCGATCGAAATCGTTACGATATTTA
-TCCATATAAATCGAAAATCTGATAATAGTAATAAAGATAATAATACAATA
-AATACAGACAGGAAACGAAAAGCGAGCACTGACGATTGTATGATACCCGA
-AACATTAAGGAGGAGCACAAAAAACACAATGAAAAGACACAGAAAAATTG
-AAATTTGAAAAACTGGTAACGAGACTAGAATCGTCATGATGATCTTGTTG
-AAAAAATTGGAAAAAAATTAAGAATCTAGAAATTGATTAGGCGCAGACTT
-GACACGATCTTGGGCACCGAATCCGCATTTCAGGCCAATTTTCGCATGCT
-CCGCCTTGAGCCCATGACGGGCAGAGGGAGTCATGATCGATGCATCTGAA
-ATGGGGAATATTATTTTTTATTTTAAGCTTCAGGTTTAGGCCTATCGACT
-TTGGATCTCAGGCTCAGGTCCTTAAATTGTGTATCTCAAGCTTAGGCTCT
-CTCGCTCAAGCCTTTAGATTTCAAATCTTAGCCTTAAGCTCTCCGACTGA
-TTTAGGATATCAGACTAAGGGCCTAGGACTTTGGGCCTGAGGCTTAGGCT
-AGTATTCAATCTCAAGCTTAGGATCTCACGCTTAAGCTCTCTGACTCAGG
-CCCTTAGATTGCAAAAACCTTTGCCTTAGGCTCCCCGACTGATTTAGGAT
-ATCAGACTTAGGGCCTAGGACTTCGGGCCTGAAGCTTAGGCTCTCAGATT
-CAGGCCCTCAGACTTTGAGTCTAAGGCCGTTAGACTACGATTTTCAAGCT
-TACAATTAGGCTTTTAGGCTTAAAATCAAAATCCAATTTAGTTTTTTAAA
-AATAATCAAACATTTCTAAACCGCAATTTTTTAAAAATTACCCTAAATAT
-TTCAAATTTTAGGCTTAGACTGTCAGACTTAAACCTTTAAACTTTTGGTC
-TCAAATTTAGCCTACAAGTCTGTGGACCTAAGACTTTGGACCTCGAACTG
-CGGCCCTTAGATCTCATGCTTGGGCTCTAATATCCTGGCCCTCTAGTCCT
-AAATCTTTTGATCGTAGTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCT
-TTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCA
-GGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGG
-CTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAAGCTTTCAGGGT
-TTCAGGGTTTCAGGCTTTTAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCA
-GGCTTTCAGGCTTTCAAACTTTCAGGCTTTCAGGCTTTCAGACTTTCAGG
-CTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGGCT
-TTCAGGCTTTCAGGCTTTCAAGCTTTCAGGCTTTCAGGCTTTCAGGCTTT
-CAGGCTTTCAGGCTTTCAGGCTTTCAAACTTTCAGGCTTTCAAACTTTCA
-GGCTTTCAGGCTTTCAGACTTTCAGGCTTTCAGGCTTTCAGGCTTTCAGG
-CTTTCAGACCACAACTAGACCGGCAACACACGTGTTGTCTAATTACTCAC
-CTCTTTGCCGGCGCTCTATGCATATTTGATGGTAACTCGATTGTCTTTGA
-AGCTATCACTTTCACAGCTTCCCAAGTTTCCCGAGCTGTTGGAATGATCT
-GAAACATCAAAAATCATCATCAAAAATCGTGGTGAGACCCAAAATTACCT
-GATTCTCAGCCAGCAAGAATCCATCCCAAACTTGCTCTTCGGGTCTCAAC
-TCGAACAGGAATGAGTACTTGACGTGGGCTTTTCCCTTTGCCCAATCTTC
-TGAGCCACCGGATGCGGGGTCTGGAAATATTTTGAAATTTTATACATAGG
-AGCCTTAAGAAATAAGAGCTTACAAAGTGTATCTGCACCGGTTCCAACTT
-TGTACTGCGTGTTGTAGACACTATTCAAAGCCTGAGCTGCTGAGAGGGCA
-GTGGATCTCTGAAATGTTTAGAAAATATGACCATGACTTGGGCAAACAAT
-TCCCGCATTTTTGTAGATCACACCGTAATGGGATAGCAAAACACGTGGTG
-CCAGAGTGTCGCATTTCGTTTTGATCTACGTAGATCTACAAAAAATGCGG
-GAACTGATTTCTCATGGTTAAGAACGTGCTGACGACAAATTTTTTTGAGC
-GAAAAATTCCCGCATTTTTTTGTAGATCAAACCGTAATGGGACAGCCAGG
-TACCAAGTAAAAAATTTACTCACCAAATCATTCAAATCATTTGAATAAGT
-TCTGACTTGATGGCCGAACGGATACATCAAAATTTGAGAGTACGAGTGGA
-AGGTGAGGAATGTCGAAATACGGTGTCGCTGCACGAAATCTCTAACCGCC
-GCAGTCTCGGGCTCCGAGAAGGCGTAGGCTCCCTGATAGATTTCCGAGCA
-AGGATCAGTTGATGAGCCGACTTGTCCGAAGAACCAGTCAAAGTTTCGAT
-TGAGGTCGACACCTTGACAGCAGGTTGTTGTGGGAGGTTGGAAGAGTCCT
-GAAAGGTTTTTATTTTTGAGATTTTTAACTTTCACGGAGAATTGCCAAAA
-TCTTAGTTTTCATAGCCTGTGTGACATTATTTGGGCGTAACTAAAGTCCA
-GAAAGCTTATGCCTTGTGCTGATGAATTTTTGCAAAAATTGTGCCCAGTT
-TTGCCACTTTTTAGTGGTTTTTGATGGGTTAAACCTAAATTTTCTGAATT
-CAAGTTTTTATTTTTTCCAAATGTTTTTTCAGCCATCGAATGGCTGTCCT
-TTTTTTCGGGCAAAAAAATAATTTTTCTGAAACTATTTGAAACAATTATA
-TTCTAAAAAAAAGGCAATTTTTTAAATTTTTTCTAGTAAATTTTGAGTCC
-TCTAGCTACAAAATAAACCATTTTAGATGAGTTTCAAAAATGTGCATTTC
-TACAAAAATTGCCCAATTTTTGCCACTTTTTGGTGGTTTTTGATGGGTTA
-AACCTAGATTTTCTGAATTCTGCGTATATAAATTACACGTTTTCAACAAA
-TTTAGACATTTTTTTTATTTTTGCCCAATTTTTTTCCAGCCATCTAATGA
-ATATCCTTGTTTTTAAGCAAAAAAAAATTTCTGAAACACAATTATTATGA
-TCCAAAACAGGGGTGTGCGGCAAATCTCAAAATTTGCCGAGCACGGCGAA
-TTTGGCAAACGGCAAATTTGGCAAATTCAGCAAATTTGCTGAGCTTTACA
-AACTCCGCAAAAATTTGATACTTTTTGAAGCACCTAAACTACTAATTTCT
-GAACAAAAGTTCAAAATAACTTGATTTTGTGCCATTTTTCTAAATTTTTG
-GAAATCAATAATTTTGTCAATAATTTTGGTTAAAATTGTATTGTCAAATT
-TTTGACGCGGGCGGCAAATTTCAAAAATTTCTGAGCTCGGCAAACGGCAA
-ATTCGGCAAATTTGTCAAATTTGCCGCACATTTTTTTTTGGTTCAAAACA
-TAATAAAACACTCCAAAACATTTTAGATTTTTCATAATTTCCGGTCGAAG
-TTTTTGCAAATTGCTAAAATTTTGAAAAATATGAGTATTTGAGGAAATCC
-AAAGCAATGCCGCATGTTCCGACCCCTACAATGTTTTAATACAAATGATT
-AAAACAAAATTACAGTAGACAAAATGTAGAAAAAAAATTATTTTTGGTCG
-ACTTCCAAAATTATGAGTGGCAAAAACTTTGTAATTGTCACTTTTTGACA
-GTAAATAAAAAATTTTAAGAATTTTTTTGAAAAGTTTTATTATGATATTC
-GGTCATTTTGGGACCAAATGAGTGGTTTTTAACAATTCCGGCACTGGCGC
-TAGTCCAGCAATTGCCGTAATCTTAGTTTTCATAGCCGACATTATGCGGG
-CCTAACTGAAGCCCAGAAAGCTTGTTTACAAAAATGAGCAAGCAGAAAAA
-GATCAATCTCCCCAACAAACCTGTTGCCTGTTGAATACACTTTGGTGGTG
-ATCGATTCTTTCTCCACAGTCTGATCTCCGGATCATTGCTACTTCTACTG
-TACTCATAACCATCCGGATTCAGCAGTGGAACAATATACCATTCGAGTTG
-ATCTACGAATTGCTTGATTTGAACATCTTTGTCGTACTGGGTGACCAGTT
-GGTGAATGAAATAGAGTACTGTCGATGGTGACACCCATTCACGAGCATGG
-ATTCCTCCGTCCACCCAGATGCCACGTTTCGTACCTCCGTTACGCTTGTT
-GGTGATCTGGAATTGAGGAAAATTGGGGTGAGATGGGATCACTAAATTCT
-GAATCTAGTTTCTGTGCTACTGTGTGTTACGTTTTTTGCGCTCCATTGGC
-AATCGCCTGCCCATCAAAAACCGTCAAAAAGTGGCAAAACTGGGCAATTT
-TTGTAAAAATTCACAATTTTGAAACTCCTCTAAAATGGTTTAGTTCGTAG
-CTAGAGGACTTAAAACTGATTTTTGAACCCTAAAAATTGTCTAAATTTGT
-TGAAAACGGGTAATTCTTGTATGCTGAATTCAGAAAATCTAGGTTTAACC
-CATCAAAAACCATCAAAAAGTGGCAAAAGTGGGCAATTTTTGTAAAAATT
-CACAATTTTGAAACTCCTCTAAAATGGGCAATTTTGTAGCTAGAGGACTC
-AAAATTAACTTCCAAACTCTAAAGAATTGTCCTTTTTCAGAATATAGTGG
-TTTCAATAATTTTCGAACAGAATTTTTTTTGCCCAAAAAAGGATGGCTGA
-AAAAAATTTTGGCCGAAAAAAAAACAGTTTTACACTGAAAGCCAAACCGC
-GACGCGACACGCAAAGCTCGGTAAATCGACCCCAGCCGTGGCCGAGTTCA
-AATAGCCAAATTCGGCAAACTCTCACATTTCAAGCTATGTATTTCAAGCC
-AGAAGCGCGTGCGATTTCTCAAAAACCGGCAGCTCAGTTGCAGGAGGACT
-TTACGAAAATTTTGAAAATTCCAAGGTATAATTGGTAGGTTTTTCGGCAT
-GTTGCATGGTACTTAAAATGTTTTTTTAACTTTCAAAAGTGGCTTTTATT
-TTGGTTCTTATTGCAAGCCTAATAATAAAAATACTATCCACGTTTTAAAT
-GCTTCCATGGTAGGCAGGCGCGGTTTCAGGGCCGACATGGAAGCCCTACA
-TGTCACGGATTTCTGGCTTTCCTCAGAAATTGAAATGGACTAGTTTTTGC
-CGAACTAGGCCAGGCCATATCTGGGGTAGATTTACGGCGCGTTGCATGTC
-GCGTCGCGGCTCGATTTTAGTTGAACAACTAAATGCATTTGTCCGAGTGG
-AGTACACGACTTTCCCACGCGGGCGATTGCCAATGGAGCGCGAAAAATTC
-AATGAGGAGGGCCAGAATCCCGTGATCGTCCGAAGCAAAGTTAAAACAAC
-AAACCTTAATCAACGGGATCTGCCGTCCTTCGTGAGTCGTTCCGATTGGC
-TGCACAGACACAAGCTCCGGATAAGTGATGGCTAATGAGTTCAGGTAGTT
-GATAACATCAGCAAACGAGTGATATTGTGCAAGGTTAAATTGAACCTGCA
-ATAAGTTATCATTGAACTATGTATCATTGAACGTGGTGTCAGAGTGCCTC
-ATTTTGGATTGATCTACGCTGATCTACAAAAAATGCGGGAGAAGAGACTG
-ATTTCGAATGGTTAAAAACGTGCTGACGTCACATTCTTTTGGGCTAAAAA
-TTCCCGCATTTTTTGTAGATCAAACCCTAATGTGACAGCCTGACACCACA
-TGTATTCACTCACTTTCTGCTCCCTCCAATCATGCAGTCGAACTTGTTTC
-CGAAGCTTATCCCGCTTCTCCTTCTGCTCGACAATCACTCTGAAATCGAT
-GAAAAGATTGTAAGTTGGGCTTAATAGTGTCCCCCCACGACACCCATCAC
-GCGTAACGAGCCGTGACGCGTTTGAATAAAGAGGGTATTTGGACTTGTGA
-TCCCCGCGAAAACCTGTATCGCACGTGATGCCAGGGTGTCTCATCACGGG
-TTGATCTACAAAAAATGCGGGAATTTTTTGCCCAAAAATGTGACGTCAGC
-ACGTTCTTAACCATGCCGAATCAGTTCCCGCATTTTTTGTAGATCTACGT
-AGATCAAGCCGAAATGACACACTCTAACACCACGTGGTATCGCCGAAAAA
-CTCACTTCTGAACGTCATCAATCATAACGGAATGCTTAATCGAATGATCA
-TCGAGCTCTTTCATAAACTGCTGAGTTTTCTCATCGGATATCATCACATG
-AACCTCCTTGCCAGCTTCCGACGGGGATTTCCAAAAATCTAGCTGAAAAT
-TTTAGTGTGTCTGAAGCACCCTTATCAGTTCATATTATATTTCAAAATTT
-TTCTCTAACCCCTCAAAACCGTACTCTACATCGCCGTTCTGGCCGAGTGG
-TCTAAGGCGCTGCGTTCAGGTCGCAGTCCTCTCCGGAGGGCGCAGGTTCG
-AATCCTGCGGACGGCAGATTTCTTTTTTGAATACTACTCTTCAAACAATG
-CATGATGAAGAAGAAGAAGAAAAAGAGAAGAACGTATTGGCTTTTCCTTT
-TACACTTTTGAAATCCCTAGGAACAGGTTATAAACAGCGATGTAACATGA
-AAAGCAGCAGTGAGAGTGATCGAAAACGAGCTGATTATGATTTGTTCAAT
-TATATGACACCGCTATTGTAATGGTTGGTTTGTTGCGTGGAACATCATAC
-CTTTACATCGTTTAAATACAAATTATGAAGAATGTCTACTTGATCTTGGG
-TCGTCGGCTGCACCCTCCATACTGTGAATTTTCTGAAAAATCGAGAGTTT
-ACCGGCTTTTGGGGGAGATTTTACCATTGACTTTTGACTTTTTGGAGAGA
-TCTAAATCTAGTAGATCATGCGGCGGTTAGGTCTATTTGAAATAAAAAAT
-AATTGATCTAGATATGAAACATGGAGATCTAAGGGTTTTGGTAAAGTTGA
-GTAGAATTTTTAATTATTTTTTTGAAAATTTGTTTGCAACATTTTACAAA
-AAAAGACGAATAAATATTGACCAAAAAAATTTTTTTCAATAAAAAATGTT
-TAAAAATTAACCACCTTTTAGCTTTTAAAGGTGGAGTAGCGCCAGTGTGG
-ATTTTGTCTAAATACACTTATTATGAACCAAAATGGTCAAATATCATAAT
-AAAACACTTCAAAAAATTTCTTTATTTCAGATTTTTCATAATTTCTGGCC
-AAACTTTTTGCAAATTTCCAAAATTTTGAATGTCGCAGTTTCCGACCCCT
-ACAATGTTTTAATACAAATAATTGAAACAAAATTACAGAATAAAAAATGT
-AGAAAAAAAATTTTTTTTTTGGTCGACTTCCAAAATTATGAGTGGCAAAA
-ACTTTGTAATTGTCACTTTTTGACAGTAAATAAAAAATTTTAAGAATTTT
-TTTGAAAAGTTTTATTATGATATTCGGTCATTTTGGGACCAAATGAGTGG
-TTTTTAACAATTTTCCCACTGGCGCTACTCCCCGTTTAAAGTTCTATGCT
-TTTTAAAACTCACGTTTTTTTTTATGAAGTCTATTTTAAAAAATCTGGAC
-TCTCAGTGGACAGTTCAGCATTTTTCGAAATTTCAGAAATTTAAAACATA
-AGTCGGAAGTGGTCCTAAAACTTCAAAAAAATTCTCACAATATGTTTTTT
-TGATGAAAACAAACTTATATAGTGCCAAAATGACCAAAATTTTTTTAAAA
-ATAATATTGAAAAATCTTTAAAAAATCTCTTCTGGTTTTTATTTATTTTT
-AAAAAATTCATATTGAAATATTATAGTGCTTTAGATTGCTCGGAAAAAAT
-TCCACAAATTTTTTAATTTTTCATAAGTTTTATAATGATATTTGGTCATT
-TTAGCTCTCTCGGGTAATATTGCAAACCCACGTGGTGCCAGGATTTCCCA
-TTAAGGTTTGATCTACAAAAAATGCGGGACTTTTGCTTAAAAAGATGTGA
-CGTCAGCTCATTTTTAACCATGCGAAATCAGTTGAAAACTCTGCCGCATT
-TTTTGTAGATCTACGTAGATCAAACCGAAATGAGACATTCTGACACCGTG
-TCCACCTTCAAAGTTAGTAATTGCATGAACAAAAAATTCTGAGAATGCGT
-ATTGCACAACATATTTGACGCGCAAAATATCTCGTTGCGAAAACTACAGT
-AATTCTTTAAATTACTACTGTAGGTCGATTTGCAGGCTGGATTTTTTGAA
-AAAAAAATGAATTAAAATTTAATGGAATATTTCTATCTCTATGTATTAGA
-AAATAAGGCCCGTAATGAGACGAGCGGGCCTGCCTACCTGCCTGACTATA
-GAAGGCCGCCTTAAAATCAGGCAGGTAGGTTTTAACGCCTAGCCTACAAT
-AAACATAAAGAGAAATGCCTAAAATAACAATAACTTTCCATTATCCTTTC
-TTATCGTCCTCCCCGGCGATCGCCTAAGATCATAGATAACAACTAGCCGC
-TTTCGGTCATGCAATTATTATATTATAATTGATGGATGGATGGGGGATAA
-TCCAGAGAAAGGGGAAAAAGAAACTTAGAATCCTAGAAAACAGGTTCCCC
-TGACTCAAACAAAAAAACCTACTTTTGATGTGCCAACACGGATGGCACGA
-CGAGACCGATGAGGACGATGATGTTCATCATCATCATCTTCATCGTAGTA
-AAACTTGGGGGGTGATGAGGGGCAAAAGGATGCCCTCCGCGCGTCAAGTG
-TTCGTTGAACAATCCGACGCAGACGGTTAAACAAAGCAACACAGTGGTGT
-CTCCGCCCAACTTCCGCGCGTCCGCCGCCGCCCTGTGTACTGTCTTGTCC
-TATCCTATCTCTCTTTTCTCCACCCCGGCTTGTGTGTGAGATTCTTCTCA
-TTACTAGAAGAAGGTCTCTAGTAGAAGAAGAAGAAGAAGAAGAAGACGAC
-GATGGAGAAGAAGCTGAAGGCACGACGCACTGTTTGCGCAACGATGTTTG
-TTTTTGCGCGCGCGAGCGCCGCATTTAAAACGTGTAAATCGGTTTCAAAA
-GCGCGCGCGCGCGGTCTTCTTTCTCCGCTTGCGCGCACGCATTGACAAAA
-AACCGAAAGGTGCAAAAGTGAAGAGGCCAACTACTTTCGTCCTCTTTGAG
-CACCTAATTGTGGAAAGCTTTTGCTCTGATGTGAAATGAAGTTGGGTAAG
-CTATTCCTGTCTGGGTGATGTTTTCAACTTCCGGGGGCATTGTTGGGAAA
-GTGAGGACCAAAATAGGCCATAAAAAATGAAGATATACATGCTTAGGCTT
-AGGCTTAGGCTAGGCTTAGGCTCAGATTCAGGCTTAGGCTTAGGCTTAGG
-CTTAGGCTTGGAATTAGGCTTGGCGTCAGTGGCGAGCGTGAGCTCGCCAC
-TGACGCTATTTAAGCTTGGGTTTATAGCGTTTTTTTAATTTTTCAAAGGG
-TTCCCGTCTGCCGATCAAAGCGAAATTTAACAGAGAGTCGTATAGGCCGC
-CAAGAAGCTGAAGTTTCAAATTGATTTCATTAAAACTCGCTTAGGCTTAG
-GCTTAGGCTTAGGCTTAGGCTTACGTTTTAGCCATATGCTAGCTGATCCG
-GAACATATTTTTAAAAATTGCAATATTTGACCAAAAGCTGTATTTTTCAA
-AAATTCAAAAGTACGGTGAAATCATATGAAGTGCTTCTTTTTCTTTCATT
-AAACTGTTCAGAATTGTCATTTTTACTAGAAAATACCAAAAAAATATGCT
-AGCTTGACCGGAACATATTTTAAAAAATTAGAATTTTTGACCAAAAGCTG
-TTTTTTCAAAAATTGAAAAGTACTGGAAAATCATATGAAGTGCTTCTTTT
-TTCTTTCGTAAAACTGTTCAGAATTGTCATTTATACCAGAATATATTAAA
-CAAAGTATGCTACCTAATCCGGAACATTTGTTTCCAAAATATTTTAAAAA
-AAAGATTTAGCGGCTCTGACTAAATTGTTTGTTCGTTTTTTCTGGACCCT
-TTTTTCCCCTTTTTTTGGGTGAAAAATTTTGTAAAAAATTTGACCGAGGT
-GTAGAGTTGAATTCATCAATTTTTGACATTTTTTGAGTACGGGCACATGA
-AAACGAAATTTCCAAAAACGCTTATTTCTCGGGATATAGTTCAATTCTAC
-CAAATTTTTCTTTGCAAATCTGCTAATTCTACAAATCTACTAACCGAGGT
-GTAGAGTTGAACTCATTTCCAAAAAGAAGTAGCAGTCCTGAAAATGTTTT
-AGTGAGTCTTCTCATTACTCTAGAGCCCGAGCCAGTAAAATTGCTCCAGA
-AGTAGTAATTTATAAATTTTTGATGATTTTATGCTGTCCAATGATAGAGA
-AATTGTTAAAATTTTCAGATCAAATTGGAATTTTCACAGCCAAATATTTT
-GGAAAATTTTCCACAAAAAATTGGGCGGAAAATTGGAATATTAATTCGAT
-TTAATTCGATTTGGAGCAGTGTATAAATTCAAAGTTTCCTCCCTTAACAG
-CCATTCAAATGCACTTTTTTCTTCGTTTAGTTTTTCTTATATATGGCCTC
-CAGGCTCTCACCAAGTTCCGTTTTACCGGAGAGTTTAAGTGCAAACATAA
-ATTCCTGAGATCCCATGTTGTAGTTTATGAAGACGATGAGGTGTTGTGAG
-TAGAAATGAAAAATGAGAAATGTTGTATTTAATATTATAAATTGTTTCAG
-CGACAACGTTATCAGTAAACACCATTACGTGTTCCATACAAATGCACCAC
-ATATGTATCTCGTTGAGGCTGAAGATACCAATGACGGATTGCCAAAGTTT
-TTGGATGTATTACTTTTTAATTTCCCGCTTTTTCTCTAGTATTTCTCAGA
-AAATTTGAATTTCCCGCCAAAATTTTTTATCAGAAAATTTGAATTTCCCA
-CCAAAATTTTTTATCAGAAGATTTGAATTTCCCACCAAAATTTTTTCTCA
-GAAAATTTGAATTTCCCACCAAAATTTTTTCTCAGAAAACTTGAAATTCC
-CGCCAAAAACTTTTTCTCAGAATTTTGAAATTCCCGCTAAAAAATGTTTC
-TCAGAAAATTTGAAATTCCCGCTAAAAAATTTTTCTCAGAAAATTAAAAA
-TCCCCGCCAAAACTTTTTCTCAGAGAATTTGAATTTGCCGCCAAAAAATT
-GTTTTCTCATAAAATCTGAATTTCCCACCAAAATTTTTTCTCAGAAAATT
-TGAAATTCCCGCTAAAAAATTTTTCTCAGAAAATTTGAATTTCCCGCCAA
-AAAATTGTTTTCTCATAAAATCTGAATTTCCCACCAAAATTTTTTCTCAG
-AAAATTTGAAATTCCCGCCAAAAAGTGAACATTCTAGGAGTTTGGCAGTT
-TACCAAAACCTTGACTGACCATTTTGGAAAATCGAATAACCTCTTAAATA
-AAAACTCTAACTTGTAAAAATTTAAAAATTTAAATATATAGCTTTGCAGT
-CCTATTTCGAGTTATACATGATCATCGTCCACGATTGCACGGATAATGGG
-AAATACAAGTTGTTGACAGTTGACTTGGGATCTTATTATATCAAGGATGG
-GTAGGTACTTTCTACAGGGCAGGCTAGGGCTTCCATGGGAAGCAGGAGCG
-GTTTGCCGGCTTCTCGCCTGATTCCTGCACTTTGGCAAAAAGTCAAAGCC
-TCGATGCTCACACATAGGGCTGGCATATTGGACGTCCGGTTTTTTGAAAT
-TTTAAATTTTTCCGAGAGGTAGTTTTTTTTGTACGGCGGCCGACAATTTC
-CGAGTTTGGCCACTCATGATAAAATTATATGATTAAGTATAGTGAGTGGC
-CAAACTCGGAAGTTGTCGGCCGCCGTAAAAAAAACTACCTCTCGGAAAAT
-TTTAACATTTCAAAAAACCGGACGACCGGACGCCCAATATGTCAGCCCTA
-CTCACACCAAATAGTACTATAAGCGGTTTTTTTTGCCGCAGCCGACACTT
-TACGGTTTCCACGCCGCACTGTACAGAAGGCGCGGCCCGAGGCAGTTGTC
-AGGCGTTTTGGCGCCTATATGCAAGCTCTAGGGCAGGCATTTCTGTTTTC
-AAAAAAATGAATATTTTCAGGCAGTACGATGAAACACGCAACATTGATCT
-GAACAATGCCGGTGAATGGACAAACGAAGTAATCGGAACAAAGGCGATGG
-TGATGTCCAAGATATTTATTTTCAATGTTTGATAAAATTGTTCATCAATA
-TTCGAGCCTACCTGCCTACCTGCCTACAAGGTAGCCTACATATATTATTT
-TTCCTAATTAACAAAAATATAATTAAAACATGATTAAGATTTTCTGAAAA
-TGAGCAAAAAGTGTTTTTAACTTCCACTTTTTGCCCAACAGGTTTAAGAT
-AGGCATGTGACAAAGCCTACATTCAAGGCAACCTACGCCTGCCTCGGTAC
-ATGGTGCATCGACCAATATTTACCTCTTAGCTTCGAGAGCTTATATCTCG
-GTTACATTTTGCTCTATCAAAAAATGGCCAACTGAAAAACTGTTCTCCAA
-TGCTTTTTCTACAATTTTGTGGTTAAAATTTTTTTAATATCTTGAAAACT
-AGCGAAAATATAAGCCACCAAGTCGCGCGCCGCCCCCCGAGAAAGCAATT
-CCAACCCAAGTTTATTGCAATAAAAACCAGTAGAAACGAAAGAAATGAGG
-TTGATTTTGGAGACTTTTCAGGTGACACGGGGAGCTTTTACATTGTTGGC
-ATTATTCAGATTCGATTGAGAAGGAGAAGTCGTGGGGAGGCTGAAAAATG
-TTCTAAAGTTGTTGAAAAAAAAAACAAATCTGCATTTTTTAAAAACCTGA
-TTCTTAGACTTCCATCCATTGCCATAAGTGCACAGAACAGTCTGTTGCTC
-TTGCTCTTTGTGCTCCGTGTCCTCGGAGCCATCATCAACCTTGTCTGGAA
-CTGTCGGTGTTGGCTCAGTTGACGGAGCAAATGAGGAGGATGGTGTCGCA
-GATTCTTCAGTTGGTTTGGGAGATGATGGCGGAGCTGGCTGAGGTGGAAT
-TGGAGATGCTCTTTTTTTTGGGGTTACTGCAGACTGTTTGCTCTTCAAAC
-TCTTGCTCCGCGATTTTGTGCTCTTTTTTGTTTTCTTCTTTGGCTGCTTT
-TGTTGCTTCTTGCTTTTTATCTGAAAATTAGAGTTTCTAGGCAATCAAGC
-GATTTTCTAGGCCACCAGACATATATTTAGCCATGTCGGAATTTTCTAGG
-CCATCACAGACAGTTCTAGGCCATATAGAAATTTTCCTAGGCCACCTAAA
-ACTTTTCTAGGCCACCAACAGTTTTCTATGACCGCGATTTTTGCTAGGCC
-ACCAACAAAAGCAAATAACACATTTTCTAGGCCACCAACAGAATTTCAAA
-TTTTTCTAGGCCTTTAACTCACATATTTCACAATGGAAGCGGCGGCGAAC
-ACGATGAAGGCTACAATGAGAATGCCAATAATTATGAATATCACTACTTT
-GGTCCATGGCGTCGATGATGCTGCAAAAATGGAGGTACAAATATGCAAAC
-GCGCTCTACCGCACTACCAGTGCGGTAGAGCGCGTTTCAAACTAACAGCC
-AGAAGTTGGCGCCGGTGGTCGCTGAGTGGAGGTGGACATTATCAGGAAAT
-GAATGAGAAAATGGAGAAATTTGGGAAAATTGATTAGAGACGTGGGATTT
-TTTTTTAATTTTTATAATATTTTTGAGTAGGGGGAAGGGGTGAGGGTCAC
-GGAAAATACCAAAAATTTGTGATTTTTCCATTAAATTGGAGCAAAATTGA
-CACCATACCTCGTGGCCTAGAAAACTGCAGAATTTCTAGGCCACACACGT
-TACGTCATAATTTACCTGTTAAACCAGGTAACCAACAATCAAATCAAGAG
-TAATTAATCATCTCCTATCTTCTTTTATTTCTCCGTTCCTACTCCCAATG
-TTTTTTTTTTGTAATTTGTGATCACAAATTGTTGCATTTTGTAGTACGCC
-ATGTACGTCTGTGTACTACTTTTTTCTGAAAAGAATACAAAAATGTTCGC
-TTTCAGGAAAAAATAGTGAGAGGTAGAAGAAAATTACGGGGACTAGAAAT
-ATGTAAAAGTTCGACAACGTAGGCAGGTAGGCAGGTAGGCAAGTAGGCAG
-TTAGGCAGGTAGGCAGGTAGGTAGGCAGGATAGTAGGCTGCCAGGCATAA
-TAAAGATGCAGGCACGTAGGCGGATGTTGCAGGCATGAGAAGTCACGGGG
-GTAGGCAGGCATGTGGGTATGTAAGCAGATGTAGGTATGTTGCAGTCATG
-ATGAAGGCACGTGGGTAGGTAGGTAACTAGTTAGGCTGGTAGGGAGGTAG
-ACAGGTAGGCAGGCAGGCAGACGCGTAGGAAGAGTTAGCCAGGATGCAGG
-CACGTAGGCAGATGTAGGTATGTTGCAGGCATGCTGAAGTCACGTGGGTA
-GGCAGATTGGTAGATGTGTACGCAGAGTAGGTATGTTGCGGGTATTATGA
-AGGCACGTGAGTAGGTAAGCAGGCAGGTAGGTAGGCAGGCAGGTAGGTAG
-ACATGTAAATATGCAGGCATATACGTAGGGAGAACAAGCCATAATTCAGG
-CACGTAGGCAGATTTAGGTATGTTGTAGGCATGATGACGTAACGTGGGTA
-GGCAGATAGGCAGGTAGGCAGGCTCGTAAGCTGGCAGGCATAATAAAGAC
-ACATAAGCAGGCATGTAAATCTGCAGGCAGATACGTAGGAAGAGCAAGCC
-AGGATGCAGGCACGTAGGCAGATGTAGGTATGTTACAGGCATGATGAAGG
-CACGTGGGTAGGCAGGTAGGTAGGCAGCCAGGCAGGATCGGAGGTTGGTA
-AGCATAAAAAAGACAGGTAGGCGGGTAGGCAAGCATGTAAATGTGCAGGC
-AGATACGTAGAAAGAGCAAGCCAGGATGCAGGCACGTAGGCAGATGTAGG
-CATGTTGCAGGCATGATGAAGGCACGTGAGTAGGTATGCAGGGAGGTAGG
-TAGGCAGGCATGCAGGCACATAGGCAGATGTAGGTATGATTCAGGTAGGC
-AGGCAGGTAGGAAGACTGAATGCAGGCGTGTTGCTAGGCAATAGCGCCCT
-TTCCTTGTTATGACAATCTCGATAATCTAATAATAAGCTATTCAATCATA
-TCACTGCGCCGATACACAAACTACCTGTTTTTTTGAGTATGCGTCTCGTC
-CCGTCTGCCCAAAAGCTTCTACAGAGTGATTAGACGGTATAAGGGGGAGA
-GATAGGATAGATTTCAATCATTCTCACTTTTTTCGTCCCTTTCTCTGTCT
-TCCTTCTCCCTTTTTTTACAGGGCGCTTTTCCCTTTTTCGTGTGTGTGAA
-GAGAGAGAGTGCATACAGGTGTAGAGGACGCCCAGACATCGAGACGGAAC
-AGGATTCTTCATCGTCTTCAGCTATTTGGAAGAAGGAGTAGAAGGTGACG
-GTGTGTGTTTGGAGACGTGTAATCATCATGTCTTATAACACTTCCTTGCT
-CATTTTTCTCTGCTTCTCTGCCGTCTCTCTATCCACACAGTCTTTCGCCG
-TTTATCGATTATTACCCAAATCACAGACGGATTTTCAAGCTATACAGAGG
-TTATACAAAAATGCGACGGATCATGATGTGAGTTTTGTTTTCGCATTTTT
-GAGCAGATACAATTTCTAGGCCACGAAAAATTTTTCTAGGCCGTTGAAAA
-AATCACTAAGTTTTCTAGGTCACAATTTTGAGCAAGTTCTAGGTTATTAG
-ATTATTACGCCATGGTGCATTTTTCTAGGCCATCAGGAAATTTTGCAGGC
-CACCATGAGTTTTTGATGCAGTTGAACTAAGTTAGTGGCCTAGAAAAACC
-TTTGTTAGCCTAGAAATATTTTCGCCGGCCTAAACACATTTTTGGTGGCC
-TAGAAACACTAACTTTTGGTAGCCTAAAAATTTTCTGTGACCTGGAAACA
-TTGTTGGTGGCCTGAAAACATTTTTGGAGGCTTAGAAATATTCTTGGCAA
-TTTGAAAACATTTTTGGTGGCCTAGAAATATTTCTGATGGCCTAGAATGT
-TTTTGTGGTCTATAAATAATTTTGGCGGCCTAAAAAAATTTGGAATGGCT
-TAGCAAAATTTTTTTGGTGGTCTACAGCCATTTTTAACGACCAAGAAACA
-TTTTTGGTGGCCTGAAAACATTTTTGGTGGCCTAGAAACATTCTTGGTGG
-CCTGAAAAAACATTTTCGGTGGCCTAGAACCATTTTTGGAGACCTGGAAA
-TGTTTTGGTGGCCTAGAATATTTTTGGTGGCCTAGAATATTTTTGTTGGT
-CTAGAAATATTTCTGATGGTCTAGAATGTTTTTGTGGTCTATAAATAATT
-TTGGTGGCCTAGAAATATTCTTGGAGACCTGATAACATTTTTGGTGACCT
-ATAAATATTTTTGACAGCCTAAAAATTTTCGGTGGCCTAGAAATATTTCT
-GATGGCCTATAATGTTTTTGTGGTCTATAAATATTTTTAATGACCTAGAA
-ACATTTTTGGTGGCCTTGAAACATTCTTGGTGGCCTAGAAATGTTTTTGG
-TTTCCTAGAAACATTCTTGGAGACCTGAAAACATTTTTGGTGGCCTAGAG
-ACATTTTTAATGGCCTAGACACATTTTTGGTGGCCTAGAAATGTTGCTGA
-TGGCCTATAATGTTTTTGTGGTCTATAAGTATTTTCGGTGGCCTAAAATA
-TTTTTGGTGACCTAAAACATTTTTGGAGACCTGGAAATGTTTTGATGGCC
-TAGAAATATTTGTGCTGTGCTGAAACATTGTCGGTGGCCTAGAAATATTC
-TTGGAGACCTGAAAACATTTTTGGTGGCCTAGAAAAATTTTTAGTGACCT
-AAAAACTTTGGGAATTACCTGGAACCAATTTTGGCGACCTAGAAAAATTT
-TCCGTGGCCTAAAAATTCCCAATAATTAACAAATTTTTAGTTAAACTTCT
-GGAAAACGGGCAAGGACAAGCACGGGTTTTGGGATGTGATGGTGGATATG
-AAGAATTCGAAATATTTTTTGGACTTTCTACAAGTAAATGATATTTCTTA
-CATAAAGACGATTGATGACGTGGAGGGGTGAGCTTTTTCTGAAATTTTGA
-AAATTACATAAAGAATATGTGCTCTATTGATAAACTGTTAGGATCACCGT
-AAATCGACAAGAATCTCCGTAAATCCACAACGGCCCCATCTCAAAAATTC
-CTAGGCCACACGTGTGACGTCATTTTTCTTCCAGATTAATAACAAAGCAC
-GAGAACAACAAGACCCTCTCGAACATGTTCCCCCGTCTGTGGGATGACTC
-CTCGTCTGCTCACTATGACTTCCACACCTATGGATCCTATCAGCGAATGA
-CTGATTGGATGAAGCAGCTGGTGGTGAAGTATCCAAAGATGGTTCAGTAT
-ATATCGATTGGAAAAACTACGGAGGGCAGGAATATCGATGGAGTTGAGGT
-AGGTCTAGAAGGCTGCCTTAGGTCTAGGTCTAAGTCTAGGTTTAGGTCTA
-GGTCTAAGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGG
-TCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTC
-TAGGTCTAGGTCTAGGTCTAGGTTTAGGTCTAGGTCTAGGTCTAGGTCTA
-GGTCTAGGTCTAGGTCTAGGTCTAGGTCTATGTCTAGGTCTAGGTCTAGG
-TCTAGGTCTAGGTCTAGGTCTAGGTCTAGATCTAGGTCTAGGTCTAGGTC
-TAGGTCTAGGTCTAGGTCTATGTCTAGGTCTAGGTCTAGGTCTAGGTCTA
-GGTCTAGGCCGATTTCGATTTCTATGTGTATGGCCTATAGTGATTTTCAG
-ATCGGCGGAGACTCCCGCACCAAAAAGATTTTCTGGATCGATGGAGGTAT
-TCATGCTCGAGAATGGGCGGCCCCGCACACGGCTCTCTTTTTCATCCATC
-AGGTATGTGATCCCGCCCCGTCAGAAAAAAGTGTGTTCCGATTAGTTCCG
-CTTGGATTACACAAATGTTGGCAGAGACAGAAAAAGGGAAAACTTGATAA
-CAAATGGGTTGGAAAAAACGTAATCGGATGATGCAATCGCGCTCTATTGC
-ACTACCTCAACAAAACATTTTTTTGCAGCTTACCTCCCGCGCAAACGAGC
-CCGGAATCAAGAAATTGCTGAACGAGATCACATTTGTAGTGGTTCCCTGC
-TTGAATCCAGATGGCTATGAGTTCACGAGATCCTCCACAAATCCACATGT
-AGGTTGGGGTAAGGTTACTGTACCCCCCCCCCCCCCCCTCCCCAACTCAA
-AGGCGCAAGCACTCCCAAATTTTTTGCAGGTTCGTCTGTGGCGTAAGAAT
-CGCTCGAAAATGCAATGCCGTAAGGACATTTGGGGACGCAATCGCTGCTG
-TCGCGGTGTCGATTTGAATCGTAATTTCGATTTCCACTTCAGAGGTGAGA
-GAGAGAGGGTGAAGTGGTTTTTCTCAAAGTGGACTTGAAAATTAAGGGTC
-AAAGTTTTAAAAGAAAACTTTGAAAAAAACTTGGGAATTTGTTCACGAAT
-ATACGAAGTTGCTGAAAATTTGTAAAACGTTTTGGAACATTCTAAAACTA
-TTTGAATTTAAATAATTTTTTAAACATACCAAAAAATCATGGATGTTCTC
-AAAATTCACGAAAGTTTCGAAAATTCCCTACAGTACTCCTGAACTAGCCC
-TACAGTATCCTTAAAGTACCCTACAGTACCTATACAGAACTCCTGTAGTA
-CCCTTACAGTATCCCTAAAGTATCCCTACAGTACCCCTACAGTTTCCCTA
-TAGTACCCCTACAGTACTCTCGCAGTATCCATACAGTAGCCCTACAGTAT
-CCCTACAGTACCCCTACAGTATTCCTACAGTACCCCTACAGTAGCCCTAC
-AGTACCCCAGTAGCACCCTTACAGCATCCCTAAATTATCCCTAAATTATC
-CCTACAGTACCCCTACAGTACCCCTACAGTACCCCTACAGCATCTCCATA
-GTACCCCTATAGTAGCCCTACAGTATCCCTACAGTTCCCACACAGCCCTT
-ATAGTGCCTATACAGAACCCCTATAATACCCCATACAATACACCTACAGT
-ACCCCTACAGTATCCGTAAATTACCCCTATAGTACCCCTACAGTACCCTG
-ACGGTACTCCTACAGCACCCCTACAGGACCCCTATAACATCCCTACAGTA
-CCCCTGCAGTACCCATACGGTTTCCTTACAGTATCCCGTGAGTATCCCAA
-CAATACTCTCACAGTACTGCTACAGTACCCCAAAAGTACCCCTACAAAAC
-CCCTACAGTACCCCTACAGAACCCTCACGGTACCCTACCGTATCCCTACA
-GTACCTGAAGCTCCAAAAATTTCCCCCACTTCCAGAAAGCGGTACAAGCG
-ACGACCCGTGCTCCGAGATCTACCAGGGACCCTCTCCATTCAGTGAGCCC
-GAGGCAAAAGCCGTACGGGACGCGTTGTTGTCGCAGAGATATAAGGGAAG
-AACCGACGCCTATATCACACTACACACTTATTCACAGGTACTGTTAAGCA
-GTTGAAAACTTTTTCTCGGCCACCGATATTTTCTCGGCCATCGATATTTT
-CTCGGCCATCGTTATTTTCTCGGCCACCGAAATTTTTCGCGGTCATCGAT
-ATACTCTCGTTCACGGATATTTTTCCCAGCAACAGATTTTTTTCTCGGTC
-ACCGATATTCTCTCGGCCACCAAAATTTTGTTTTTCGTGGCCATCTATAT
-TTTCATCGGCCATCTATATTTTCTAGGCCACCAATTTTTTCTCGGTCTCC
-GATACTTTCTCGGCTACCAACTTTTTCTCGGCCACCAACTTTTTCTCGGC
-CACAGATTTTTTTCTCGGCCATTAATTTTTGACGGCCACCGAAATTTTTT
-CGGTCACCGATATTTTTCACGGCCATCGATATTTTTTGAAAATTTGATTT
-GAGCAAAATATTTTCAGATTTGGATTCATCCATATGGTCACAAGAAGGAT
-GCATATCCAGGAGATATTAAGGATTTGGTGAGTGATGACGTCATTCTTCT
-TGAAACGTTGAAACTCAAATTTCCAGTACGAAGTTGGCAAAAAAGCTGCT
-CAGGCTCTGAAACGGGTTTACGGCACAAAATACGTAGTCGGAAGCGGTGC
-GGACACGCTCTACCCGGCGTCTGGAGGATCTGAAGATTGGGCAAAGCACG
-AGGCGAAGGTCAAATTTGTGTACCTTCTAGAATTGAGGCCCGACGAGAAA
-AGTAAAAAAAAAACGTTCAAAGTTGCTGAAAAAAGTTGGGCGATAATTTC
-AGACTGGGATGGGTTCATACTGGACGAGAAGGAGCTGATCCCGACGGCTC
-GGGAAACTTGGGAAGGTGTCCGAGTTGTGGCGGAAGCTGTGCTCGATCGG
-ATAGTTGCCGGCAAGTCGACGGCTCCAAGAGGTAGGCAAACTTTGATGTG
-CCTGCCTGCCTTGTGCCTACAGTTTTATTACGAGTAGGCACGGAGGTAGG
-CAAGTAGGCAGGCAGAAATGTGGACCGATAGGCGTAAGGTTAAGGGCTTG
-CGAAGCTTTTGCGTAGGATTGCGAAGAAAAAGAAAAATTTTTAAATTACA
-GTGCGCACGGCCTAAAGGAGATGGCTTCTGAGGTAGTCACTACGATGCTC
-CGCTTGCTCTGACCACGCCCCTTTCCTGGTTTCTCGATTTTTGTTTTAGA
-AATTACACTTGTTTATTTTATGATTGTTGATAAATGTTTTTTTAAACATA
-ATTTTTCTTGAAAAAACAACTTACAATTAGAGAAAATAGCAGCGAGCGGT
-CGTGGCCGCGAAATGAAAAACTCGGCCACCAGCTATAAAATTAAAACGTA
-TAATAATTTGGTGGTTCAGTTTTGCAGAAAAAAAATGGCTGGCCGAGTTT
-TCACGTTTCTAGGCCATCTAGCAAAGTTGCTCTGAAGCGCTTTCGCGAAT
-TCGTTTCCGAAAAAACTGTAGGTGAAAACTCGACCACGCTTTCTTAAAGC
-CACGAAATTTTGAAATAATTTCTCGGTCACCAATTTTTTCTCGGCCACCG
-ATATTTTCTCGGCCACCGATATTTTCTCGGCCATCAAAATTTTTCTAGGC
-CACCAACTTTTTCTCGGCCATCTATATTTTCCCGGCCTCCGACATTTTTT
-CTCGGCCACCGATATTTTTCGCAGCCGTCTATATTTTCTTGGCTACCAAT
-TTTTTCTCGGTCTCCGATACTTTCTCGGCTACCAACTTTTTCTCGGTCAT
-AGATATTTTTCGCAGTCATCTATATTTTCTCGGTCAGCGATATTTTCTTG
-ACAACCCATGTTTTTCTCGGCCACCGATATTTTTCTCGACCATCTATATT
-TTCTCGGCCACCAAAATTCATTCTCGGCCACTTATATTTTTCTCGGCCAC
-CAATATTTTTCTCGGCCACCTATATTTTCTCGGCCACAGATTTTTTTCTC
-GGCCATTAATTTTTGACGGCCACCGACATTTTTTTCGGTCACCGATTTTT
-TCTCCGCCATCTATATTATCTCGGTCACCAATTTTTTTCGGTCATTGATA
-TTTTCTCGGCCACCAATATTCTTCTCAGCCATCAATATTTTATCGTCCAC
-CGATATTTTATCGGCCACCGAAATTTTTCGCGGTCATCGATATACTCTCG
-TTCACGGATATTTTTCCCAGCAACAGATTTTTTTCTCGGTCACCGATATT
-CTCTCGGCCACCAAAATTTTTCTCGGCCACCGATTTTTTTTCCTGGCCAC
-AGATATTTTTCTCGGCCTCCGATATTTTTCTCGGCCACCGATATTTTTTC
-TCGGCCACCAATTTTTTTCTCGGCCTCCGAAGTTTTTCGTGGCCATCTAT
-ATTTTCATCGGCCATCTATATTTTCTAGGCCACCAATTTTTTCTCGGTCT
-CCGATACTTTCTCGGCTACCAACTTTTTCTCGGCCACCAACTTTTTCTCG
-GCCACAGATTTTTTTCTCGGCCATTAATTTTTGACGGCCACCGAAATTTT
-TTCGGTCACCGATATTTTTCACGGCCATTGATATTTTTTTCGGTCACCGA
-TACTTTCTCGGCCACAAATATTTTCTCGGCCACCGAAATTTTTCGCGGTC
-ATCTATATTTTCTCGGCCTCAGCCATCGATATTTTTCTGGACCGTCTAGT
-TTTTTTTTGGCGGCCGTGACCTCCAAATAGAATTACAAAAATAAACGATA
-CATCTCATATTTCTGTGCAAATCCTCAAGTACCCCCCCCCCCCCCCCTAT
-ATTTATTGTTCCAGAAGCCCCAAAAGCTCGCGGATTCCGATTCGGCGACG
-GCACCGAAGGATCATGTTTCGATGTCCGACACGCGTGCAAACGATGGGTT
-CAGGAACGGGAGGAGCTGTGCAGGACGGTGCCAATTTTCATGCGCGAGAA
-CTGTGCCTACTCTTGCAATTTCTGTTGATTTTTTTGGTGTGCCACTTCTT
-TTTTTCTGTACATATATCCATTTTGTCTTCTACATACATATATATATGTA
-TATGAAATGTTTAAAAACCTAAAACCTAAAAAAAAACCAACCTAATACAG
-TGTTCACGAGCGCCCCCCGCCGCCGGCGGCTCCTTATTTGCCTTGTGCTC
-ACCGTGAGGTGGCTCCGCGCGGGAGCCCCAGTGATGAGCATCTCTTTTGT
-CCACACGAATAATACAATAACACGGGCTCCTCTTCAAATATGACAAAATG
-TCAAATTTTGGCGTCTCTCCTGACTTGGAGCTTCTGGGTCTTCAGACACG
-TTCTTGTGTGTGAGGCGAGATGCGATTACCCTCTATATTATTGATTTTTG
-GAGCATTTTTTGGTTTTCTAGGGGCTATTCATAATACAGATGATAATGCC
-GGCTATCATAAGTAAGTCCCCAAAATACCCATATGGCCTAGAAATTCGGA
-AAACTCTTCCATTTCACTTTTGGTAGGGACATTTGGTTTCTGTGCTAGCT
-TTTATGCTGAACATGGTAATTTAAATTTCCTAGGCCAGTGTATATGTTTT
-TCTAGGCTACGACATACAATTTTTTAGGCCACAAAATATTTTTTTTTAAT
-TGCGGCTTATAAAAATGTTCCATAAATTATCTATTTTTGAATTACAGTCT
-GAAAATTTCCATTTTTCAAGGGCACCTTTCTAGGTCACAAAAACGGATTT
-TTTCAACATAGGCATTTTTCAACTTTTTCTAGGCCACGACAGATGGAAGA
-GCTTTTCGTAAAAAAAGCTCGGCCACCACCCCACCTAACCAAAAAACTTC
-CAGCTTCAAACTAATCCGAATCAATCCGGAAACTGAAGGAAGTGTGAAAT
-ATCTTCGAAGTCTGTACGAGGATCCCTCTCCGTACGAGCTGGATTTCTGG
-CAGCCTCCTACGAATATCGGTTAGTGTGACTTACCCACGTGATGTTAGCG
-TGCTCCATTTTAGTTTGATCTACGTAGATCTACCAAAAATGCGGGAGAAG
-AGACGCAAAGTTCTCAACTGATTCTGCATGGTTAAGAACGCACTGACGTC
-ACATTTTTTGGGAAAAAAATTTCCGCATTTTTTGTAGATCAAACCGTGAT
-GGGACAGTTTGCCACCACGTGCTTACCCAGGAAAATCTGAAATTTTTCGA
-ATTTTCAGGAGCTATCGTAGACTTGACAGTTGCTCCGGCGGATGCTCCAA
-GATTTGTGAAGGATTTGGAATCGAAGAAGATCAGCTACATCGTGGCGGTT
-AATGATTTGTCAAAGTTCGTTTTTTTTTCTAGGCCACGGCCATCTGTGAC
-GTCACTAAACTAGTTTCCAGAGCAATCGAAAACGAGCGCGGAAGCGACAA
-ATTCTACAACCCGGTCGCTGGTTTTGCATACGACAAGTACAACAGTTTGG
-AGGAGATTCAAACAGAAATGAAGCGGCTTAAGAAGGAATACCCGACCATG
-ATCACGCTTATCGATATCGGACAAAGTCACGAGAATCGTACGCTTTTGGT
-GATGAAGGTAAGAGCGAACGCGCTCTATTGAGTGGGCGTGGTCACGTCCA
-CGTTTTGCAAAGTGGGCGCACGGTTCCTTTACAGCGGTCCCAGCTTTTGA
-AGTTTTGAGTAATTTTTATATGGGAATTGCTAAAATTCATTTAAAAAAAA
-CCCAAAAATACTTTTAAAGTCGTAACGAAAAAAAACAACCGTGCGCACGT
-CTTGCAAAAAGTGGGCGTCCCAAAATTTAAAAACGACGGAATTTCATTAT
-TTCAAACGCTCCAAACTCATTTTCACTACAAAGACATCACGCGCCTCCTG
-GGAAAGCCCTTACTCATTTGCTGGATATATGACGTCACTAAATTAGTAGA
-TGTGTGAAACCGCGCTCCATTGTACTACGCAACACCGATCCCACGTGGTG
-TCAAAGTGTCCCATTTCGGTGTGATCTACCATAAATGCGGAAATATTGAC
-GCGGATTTCTAAACAGATTTCGCATGGTTAAGAGCGTGCTGACGTCACAA
-ACTTTTCTCTGCAAGAAATTCCCACATTTTTTGTAGATCACACTAAAATG
-GGACCGTTTGACGCCACCTGCGCTCTCACTTTCAACACTCCCATTAAGCA
-TTTCATGTACGCGCCAAAACGCACGGATTTCTGGCTCCCCTCATAAATTG
-AAATGGAGTTTGAAAAAGAGTTTGCCGAACTAGGTCATTTTGGCTCGGCC
-ATATTTGGGGTAGATTTTCGCCGCGTTGCGTGTCGCGTCGCGGCTCAATT
-TAAGTTGTAAATCTAAATGTGTTTGTCCGTGTGGAGTACCCGACTTTTCC
-ACGCGTTGCCCGGAATGCTATTGTCGATGGAGCGCGAAAAATTCAATAAG
-GAAGGCCAGAACCCCGTGAAAACGCCTGCCGCGCCCCCGCCTGCCTTGCA
-GCGCGGAACCCAAAAAGTGTCGGCCGCGGCGAAAGGCCCTCGCACTATGT
-GGTGTTAATACCTAGCTATTGACTTATCGCCATAGTGTAAAAAAACCCAA
-ACTCCCAAATTTTCAGATAACCGGAAAACGAAACCCCCTCGGCTCGAAAA
-TCTCCATGTGGATTGACGCTGGAATTCATGCTCGAGAATGGATTGCTCCG
-GCGACCGCAATGTACATTGCTCATGAGCTTCTCCTCGGGTATGAAAACGA
-CGCGACGGTGGCTAAGCTGATGGACCATATCGATTTTTATATTCTACCTG
-TGATGAATCCAGATGGATATGAGTATTCCAGAGAAAAGGTTGGTTTTTGA
-ACCTTAAAAAAGCCTTAAAACTAGTGCTCTATTTCAGAACCGCATGTGGA
-GGAAAAACCGGAGCCCCGCAAAATGCGCCCGGCAAACTTTCAGTACGGTC
-TGCTGCTCTGGAGTCGACCTCAACAGGAACTTCGATTGGTTCTGGGCCTG
-TAAGTCACGTGGTGTGAGAAAGTCTCATTGAAGTTTGATCTACAAAAAAT
-GCGGGAATTTTTTGTAGATCAAAGCGAACTGGGACTTTCTGACTCTACGT
-AGTTAGCTCAATATTAGACCTTAAAAAATAACTTAATCTTAAAAATTTCC
-AGCCACCGGTTCGTCTTCGGATCCGTGCCACGACACGTATCACGGCTCGG
-CGGCCTTCTCGGAGCCTGAATCACAAGCTGTCAGGGATTTCCTGGAGCAA
-AACACACCCGAGGCGTTCATCTCGCTGCATTCCTACTCCCAAATGTGGTT
-GATACCATATGGACACAGAAAACAGAGTTATCCACAGGACTACCATACTG
-GACTGCGGCCATTGGCTCTGCGAGCAACTAAGGCGTTGTATGAGTTGTAT
-GGGACGAAATATCAAGTCGGGACCGGCGCTGATTTGATGTGTAAGTTAAT
-ATCCTTTTTTTCGAATTTTTAAATTTCTAAGGATTTCAAGAAATTTTAAA
-ATTTTGAAAATTAAAAAAACAATTTTTTTCGGAATGTTTAAAAATTAAAA
-AAAAAATTTTTTTAATAGATTTTTTAAAGCTTTTTTTTGGAAAATTTTGG
-ATTTCTGAATAATTTTTTTTTCAGAACTGGAATTTTTGAGTTTATTAAAG
-ATTTTTTTAGGACTTTTTAATTTAGACATTTCCTGAAAAATTTTTAAATT
-ATTAAAATTTCGAACTTTTTCGATATTTTCGGATTTTTTTGCAACCTGAA
-TTTTATTTTTTTTTTGGATTTATTGGAATCAGGGGTGGGCAGCAAGATTT
-TTTCCGGCAAATCGGCAAATCGGCAATTTGCCGGAATTGAAAATTTCCGC
-CAAATCGACAATTGCCGGAATTGAAAATTTCTGGCAAAACGGCAAATCGG
-CAAACTGCCGGAATTGAAAATTTCTGGCAAACCGGCAAACAGGCTAATTG
-CCGATTTGCCGAATTTATCGATAAATCAGTTTGCCAAACGGCAATTTCCC
-CCACCCCTGATTGGGATCTTTGAAATAAAACAGGAAGAAATTTTAAATTG
-TTGGAAATTTTGTAATTTTCCGGAATTTTAATAAAAAAATGCTGAAAATT
-CTAAAAGTTTTGGAACTATGTAAAATTATTTGTGATTTAAAAAAAAACAT
-TTTTTGGACTTTTCTGAAATTTCACGGATTTCTGGCTTCTCTCATAAATT
-GAAATGGAAGAGTTTTTGCCGAACTTGGCCATTTTGGCTCTGCCATATCT
-GGGATGGATTTACGGCGCGCTTCATGTCGCGTCGCGGCTCGTAAAACTAA
-ATGCACTTGTCCGTGTGGAGTGAGGAGAAAATTCAATGAGGAAGGCCAGA
-ACCCCGGATTTTTGAAATTTTGAAGTTCTGAGAAACCTGTGACTTCTACA
-CTAACCCTGAAGAATTTCAGACGAAGCTTCTGGAGGATCACATGATTGGG
-CTAAGGGGCAGCTTAAGGTCCCCTATGCCTACCTGATTGAGCTCCGACCA
-AAGAACACCATGATGGGGTAAGCAGGACGATGGATCCTATCAAAATTAAA
-ATTTCATTCCAGCCACGGCTTCCTTCTCCCCGAACGAGAAATTGTGCCCA
-CTGGACTGGAAACCTTCGAATCCATCAAAGTGGTTGCCGACGAGCTTGTG
-GCGCAATTTGTGGAACCTGTGATTCGAGCCAAGCTGACCACAACCACAAA
-GCCCGCAATCCCACCGTATCGGCGTGGGTACTCTATAATCGACACCACAA
-CTATGGAGCCGGTCGATGAGATTACACAGAAGCCTACAGAAGCTCCAACC
-ACAGAGGAGCCCACCACCACTACTACGGAGGAACCTACAACTACCACAAC
-GACCGAGGAGCCTACCGAAGCCCCAACAGAACCCAGTCCGACTACTGTCG
-AGGCCACCGAGGCTTCTACAACACCAGAAGCTTCCACATCCTCTGAGACA
-AGTACCACAGAGAATTCTGAACCCAACCAGAAGACATCCACACCAGTGGC
-ACCTGAAGCAAGCACCGTTGAGGAGGTTGGTTTTTGGCTTAGTCTCAGGC
-TTAGGCCTAGGCTTAGGCTTAAACTTAGCCTTAGTCTTAGACTGAGGTTT
-AGGCTTAAGCTTAGGCTTCAGCTTAGGCTTAAACTTAGTTTTATCTTAGG
-CTGTGGCTTAGTCTTAGACTTAGTTTTAGGCTTAAGCTTAGGCTCAGACT
-TCGGCTTAGGCTTAGGCTTAGAATTAGGCTTAGTTTTAGGCTTAGACTTA
-GTCTTGGGCTTAAGCTTCGGCTTAGGCTTAGTCTTAAGCTTAGGCTTAGG
-CTTGCACTTGGGCTTGGCGTCAGTGGCGAGCGTGAGCTATTTAGGGTTTT
-ATGCTTAGCTTTAGACTTAGGCTGAGGTTTAGGCTTAGGCTTCGGCTTAA
-GCTTAGGCTTATGCTTAAGCTTAGGCTTGGACTTAGGCTCATACTTAGGC
-TTAGGCTTAGGCTTGCACTTGGGCTTAGGCTTAGGCTTATGCTTAGTTTT
-AGGCTTAGATTTAGGTTCAGGCTTAGGCTTATACCTAAGCAAATACATTT
-TTGGAACTATTTGGATATTTGCCAGCGACCTATTTTATCAACTTCGAATT
-TCCCAAACCATTCCAGGAAACAATCACACCGATCAAATGCGTCGACTACG
-GTGACTACTGTCGTCTTTGGGGAGTCTTACAGCTCTGCTATCGGGATCAG
-GTCTCCAAGTTGTGCCCCAAGACTTGCGACTCGAGGTGCTCTTTTTCGGT
-GTGAGGCGCACGCTGGAAACTATCGTATGACAAATTGTCAGCTTATGTAT
-GTATAAATGATTTCAAACTTTTGTAATTGTGGACTAAAAACTACATTTTT
-CATGCCTGACTGACTGCCTGGCAGCGTGTCAGCGCCCGACATTTTCTGAG
-TTCCACGACGGGATCCTGGCAGGCGTAGGCGTGCAATTTTTAACTCATCA
-AATTGCTTGGAATAATTAAGCACTGCTACAAATGATGTCACTAGCTACAA
-ACTACAAACTAGGAATTTCACACTACAAACTACAAACTACAATCTTAGCT
-CTTCAAGCTATGAAATACAAACTAAGAAATTTTTATTTTTCAATATTTTT
-TAAACGAGGTGTAATTATGGGCGTATATAGTAAAAACTGGAACGACAAAA
-TGCAAATCACAAACTACAAACTAGAAACTAAAAACTAGAAACTGCAAACC
-ACAAACTACAAACCACAAACTACAAACTACAAACTACAAACTACAAATTA
-CAAACTACAAGCTACAAACTACTGAACTCTGAATAAATTTGAACGTGTAA
-ATTTTGCGTTTTTGTGCAATGATTGGACGTATGAATTGCGAAACCATAAG
-TGTTTAATCACATACTACAAACTACAAACTACAAACTACAAACTACAACC
-TAGAAACTACAAACTACAAACTACAAAATATAAATTACAACCTTCAAGAA
-ATTTGTATTTTTCAATATTTGTCGAACAAGTTTTAATTATTCGACGAATA
-AAGTCAAAGCTGAAATCATAAAATGCTAACCACAAACTACAAACTACAAA
-CTACAAACGGCAAACTACAAGCTACAAATTACTGAACTCTAATAAAATTT
-GAAAGTGTACTCATGGTTTTGTGCAATTACTGGACGTATGAATTACGAAA
-CCATAAGTTTTTAGTCACACACTACAAACTATAAATTACAAACTACAAAC
-TACAAATGAAAACTACAAACTACAAACTGGAAACTACAACAGCAAACTAC
-AAACTACAAACTACAAGCTACAAACGCTTATATAATTCGATTTTAGTTAT
-TTTCTGTTTTTTATTTTTCCAAATTCTCAAACCTGAAATAAAATTACCTA
-CACACAAATGTTTCTCATTATGCATCGAATGACTAATATTTTCCAATAAA
-CGTTTTGAAAAAGTATGGAAGAAACAAAAAATGGAAAACAAAGGCGGAAA
-TATGCATTTTTCTTCTCATTTTCTTGAAATTCGTGTGATTGTACTTATTG
-ATTTTTTGTTGTTGTTAAAAACGTGGTAGGCAGGCATTCATGCCTACGTG
-CCTGCCTACCAGTCGAATTCGAACCCGCAAGATGTCGGCCGCTCCCTTCG
-ATTTTGGAAGTTTTTACTTATTTTCCTCTTCTGCTAACACATTAGACAAT
-TATTATTCAACCCGTGTACACAATAGGGCGGCTAATAATTAGGTTGGCAG
-GTAGAGGTGTACAGGAAACGTTTATAAGCTCTTTATTTACTACTGAGCTA
-CCACTTATTTGGAGCCAATGCATTTTGTTTCTCAACAAGTTGGAGATTCC
-AGAACAACCAAGATTTGGGCGGGGCTTATTTTGAGGCAATTTTTCAACTG
-TACAGTAGATTCATATAATTTAAGTTTTGAAAACATTTAGGCGGGAATTC
-AAACATTTATTTTTAAAACCATCTTGGCGGGAATTCAAATTCTAGTTTTT
-CGAAAACACTTTGGCGGGAATTCAAAATGTTATTTCTTAACAACTTCCTG
-AAATGCTCTAGAACCTTCTGGAATATTTGAGAAAACTCTAGAATGTTCTA
-GAACCTTCTGAAAAATTCGAAAAAAGTCTAGAATGTTCTAGAGCCTTTTG
-GAAAATTCGAAAAAAATCTGGAATATTCTAGAACCTTTTGGAAATTTTGA
-GAAAATTCTGGAATGTTTTGGAACCTTCTGGAAAATTCGAGAAAATTCTG
-GAATGTTCTAGAACCTTCTGAAAAATTTGAGAAAATTCTGGAATGTTCTA
-GACCCTTCTGGAAATCCGAGAAAATTCTGGAATGTTCTGGAACCTTCTGG
-GAAATTTTTAGAAAAATCCTGGAATTCTCTAGGACCTTCTGGAAAATTTG
-AGAAAATTCTTGTCGCCAAAGTTTTGTGAAAAAATTTAGCTGGAAACTAA
-ATAATTTTGTGAGAATTCAAACTTTAATTTTTCCAATTTTTTCGGATTTT
-TTTTTTAGCTTTTAAGCTTTTTACATTTTCTATAAATTTTAGATTTCAAA
-AAAAAATTGGCGAAAAATTTTGACCAAATTTTTTGGCTTTATAGCATAAT
-TTCAAAAAGTTTAAAAAGTCCAAACTTTGCTCCAGTCCCCAAAAAAAAAT
-TTGGTGGAAAATTCAAATCATGTTTTTTTTTCAAAAAATTTCATGGCCTA
-GAAATTTCAGCAAAGCAGTAAGGCCGCCTACCTCCCTTCAATCCGAAAAA
-TACCTAAAAATCAATCCCAAGCAATTAGTCTCATCAAGAAAGAAAAGAGC
-TCTGCTTGTGCCCACTCCTCATCTCTTCTCATGTATTTGCTTTCAATTAA
-ACATCTTACTCAGACAGCATAACGAAGGAAACAAAAAACGAAAGAATAAC
-GAAATGAGCATATTTCCTTTATTTATTCCTTATTTATGTATTCAGGTAGA
-ACAAAAAACCGGCTCGGCGGGTTTATTTGTCTGTAAATCTTATGCCTACA
-CGCCTACCTACAGCGGCCCTGACTGCCTATTTGCCTAGTGTTTTTTGTCC
-TTTTCGGTTGGTTTTTTTGAAAATTTTTCCTGATTTTTTTTGTCGTTTTT
-TTTCCATTTTTCTGAATTTTTAGGAATTTATGGAAGTTTCTCTTTTTTCT
-CCCCCCCTCGAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCTTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAGGCCTAAGCCTAAGTCTAAGCCTAAGCCTGAGCTTAAGCTTAAG
-CCAAAGCCTAAGCCTAAGCCTACTCCTATGCCTGAGCCTAAGCCTAAGCT
-TAAGCCTAGGCCTAGGCTAAAATAAGCTCGGCCCCTTTCTGGGCCAAAAT
-TTCATGTACCTCCTAAAATTGTTTCATCCTAAATAGCCAAAAAACTTGGA
-AAAATCTATTTTTCAAATTTTGTAAAAATGTCAAAGAAAAATTCTCAGAA
-GTGCGGGAAAGTTTGACCCAGAAAGGGGCGGAGCCTATTTTTGGATAGGC
-TCCACCTCTTTCTAGGTTTTTTAAAATCAAATTTAGGTGTTTCCTGGTAA
-GTTTTAGTGGTTTCATTTTTTGTATTCATCACATTTCTTTTTCATTTTTT
-ACATTTTTCTCATAATTAATTTTTGATCTACCTGTTGAACTTGACCCCGC
-CCCCCAATCTTGGTGCCTCAAAGGAATCGGAGGAGTCTAGTCAACAAGGT
-AGATCAAAAATAGAATATGAGAAAAATTTGCCATCGTGTTTTTCGATAAT
-ACTACAGTTTCATACAATAATCCCACAACTTAAAATTCAGCAAATAACCA
-GGAAATGGGCGTGGCTTAGATTTTCAAGGTTTCGTTGTTTTTTCCAGGTT
-GTACTTCTGATCTGAACGGGCTCCGACAAAAAATGCACAAAATTCGTAGT
-AGTGATGTGTGACGTCTGTTCTGATGACTCGAATTCATATTATAAAAGTC
-GAAAAATTCCTTCCGAACGAACCCCCCATCATCCTAACATCATCCAGATT
-TCTGCACCCGCCCGCTCATATAATCTGCTTTTCTTCACCCATAATCTTTT
-TGCTTATTTCTCAATCTCCGTCTTTCTTGCGTTTTTAATTAATTCAAGAA
-ATCAAGCAGTTGTGGTTAATGGCGTTCTACGAATTGCTTTTTTCTTGTAT
-TATGATATTTTAATTAATTTTATTTATTTAGTATCTAGGCATGTACATGT
-GCAAGTTGAGTTGAATAACCTGAAAATTTTGTGCCAAGTTATGGGCGGGG
-TCTTTCATACATTTTTTAAATTGTTTTTTGGCTAAATTTGTATGTATTTG
-CTTTGAAAGTTGTGTTTTTTTTCAATTTTCTTTAAAAAAAAACCAAAAAA
-AAAAATTGGTATGTAGTAACGTAGGTAGGCAAGAAGTAGGTGTGTAGGTA
-GGGACTTGAAAATAGCAGCTATGAATAGGTGCGGTATTTGAAGTTTAGGC
-AGGTTCGTAGGCAGATAGGTGAGTAGAAAAATCATTCAGAAGACATTCAG
-GTAGGCTCACTGGTAAACAGGCATAATGTAGGTACGTAGGTTAACACTTA
-CGTACGAGGCAGTAGGCATCAGGGCTTTGTGGCAACCGGCAACCGGCAAC
-CAAAAACCAGGTTGCCGGTTACCGAAAAATTGCCGAAATTTCAGCAACCA
-AAAGTCGCCAGAATTTTCTCGAATTTTCCAAAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAATTTTCCAAAAAGTTCTAGAACATTCCAAACTTTTCTC
-AAAGTTTCCAAAAGACTCTAGAACATTCCAGAATATTCTCGAATTTTTCA
-GAAGGTTCTAGAACATTCCTGAATTTTCTCGAATTTTCCAAAAGGTTCTA
-GAACATTTCAGAATTTTCTCAAATTTTCCAAAAGGTTCTAGAACATTCCA
-GAATTTTCTCGAATTTCCCAAAAGATTCTAGAACATTCCAGAATATTCTC
-GAATTTTTCAGAAGGCTCTAGAACATTCCAGAATTTTCTCGAATTTTCCA
-AAAAGTTCTAGAACAAGTTGCAGAAATTTTCAGCGTACGGCAACTTCAGC
-AATTGCGGGTTGGCATGTAGGCAGGCAGGCATGTTAGTAGGCAGTTTTGA
-CAGTTTTGAAGTTAACAATCCTACCTGATGCACAAGAAAATGCGCGGCAA
-TTGCGGACCGGCAATTCTACAAAATGAGACGGTTGGGCATGTTCTTCCGA
-TATTTTTTATAAAAATTTAATGATAAAGTATAGAAAAATATTTGTTTTAT
-TTGAAAATAAGTTTTATTTGGCTAGGAACAACCGAAAAAGTGCTCAAAAA
-TTGTCGGAATCTTGAAAATTGCCGTGAAAATTTCCAACATTTCGACTATT
-TCTGGAGATTTTTACAATTTTGTCTATTAAAAAAAAACAGTTACTTTCAA
-ATAAAGCAAATATTTTTCTATATTGTGTCATAAAATTTTAATGAAAAATA
-TCGGGGGAACATGCCCAACCGTCTCATTTTGTAGAATTGCCGCGCACCTT
-GTTAGTTTATCCCCGTAAACCTCCAATCAATAATTGGCAGGAGTCCTTCC
-GTCCGTCCAAAACGTCATAAAAACTGGAGATGGCAAAATTGGAGATGTGC
-CAAGTTTGCTGGAGAGGTGGGGGGAAGGAGACAATCATGTTGTCTGCGTA
-TCTCCAGACTCGTCTGCTATCTCTCTTACCCGGCAAATGGGACCTCCCCA
-GAACGGTGATTTTGTCCTTTCAACACCTTTTTTGTGTTTTTGTTTGTTTG
-ACACCTTTTTTTCACTACTTTGCGGGAATTTAGACTGATTTCTCATGGTT
-AGAAACGTGCTGACGTCACATTTTTCGCGGGAAAAAAAACCCGCATTTTT
-TGTAGATCAAACCGTAATGGGATAGCCATTCTAACAATTCACTGTTTTTT
-TTCTGAACAAGTCTGAAGTTTTGAGTTCAGCACCCGCAATTCTGTCTCTG
-ATAAGTTTGAAAGTTTCAAATTGAAACCTCTCAATTGTCGGACCAGCGCG
-CTACTTCATCATACCCCGCAAATTGAACTGCTCGCGGCAAAATTTAAAAA
-TTGATGCTTCTCCAGAAACATCCCACCAGAAACTACCTAAGACTGAACTT
-CATTAACTTCTTTTAAACTTAAACAACGATCATAATACCTTAAAAAAAAC
-GTTTGTACGTGGTGTCAGAGTGTCTCATTTCATTTTGATCTACATAGATC
-TACAAAAAATGCGGGAGAAGAGACGCAGAGTTTTCAACTAATTTCGCATG
-GTTAAGAACGTGCTGACGTCACATTTTTTAAGACAAAAAATTCCCGCATT
-TTTTGTAGATCAAACCAGCCTGGCACCACGTGCGTTTGTAATCGTTCAGT
-AGGTAGGTAGACACAGGTCAGTAGGCATAGGCAGGCGGTAGGTCTGAGGT
-AGGTGTTGTTGACCACCACGTAGCAAAACATGCTTGACGACTAGCCTCAA
-ACGGATAATCACAAAGTTCTACGTAGTTATGATTTCAAGCCGCCCAATGA
-GCACATTACGCTGACTAAGCCACAGCTATAAGACCCTCCTCCGAGTATAT
-TCATCACCAAACATCCAGTTTCCAGTTTTGCAGTCTTTTTTTCTGTTGGA
-AAATAAAGAGAGTACATCTCATTAGACATTAATGAACAATTTCAAGTTCA
-AAACTATAAATATAAATAAAGCTAGTAATTGAGCCAGTCCAACCAAATTT
-CCCACAAGTTCATTATAAACCTTCCAATTTCCCAATCCCATGTACTCCTA
-CTAATCAGTTTCTTTCCTTCCGCCCTACTTTCCAAATTCATTTATCCGCT
-TTGCATACTTTTCGGTAATCTTGACGATTTTCAGAGGTTTCTAGAATTTT
-TTATTTTTTCAAATTATGCAAAAATAAATTTTTTTTTGTATTCTCAAAAA
-ATTGCTAAAATTGTCCAACTTCCCATTTCTCGGAAATTGACGTAATTGCA
-GTTTTTTGAATTTTTTTGAAATTACTGATTATCAAATTTTGTTGGAAAGT
-TTCCTTTCACCTACACACCTACCATATGCCTATCTGCCTAGGTGCTTACC
-TACACGCCTGCTTCGTGCCTACCCGCCTACCTGCCTGGTTTATTTTCAAA
-AAGTGCAAAGAGCCAAAAGTTTCGAATTGTCAAAATTGCTCGGAAATTTT
-TTGAAATTTTGGAAAATGCCAAAGTTATCAAATTCCGCATAATTCCAAAA
-TTGGCAGCCCGACATCATGCCTGCCTACATTCCTGTCTGCATATAGGCCT
-GACAAAATGTCCATCAATGTATGTACCTATTTCATACCTATCTACCTGTA
-TAAACATAGTTCATCTCTACCTCAAACAGCATGTTACAGGCTTTCTTCTT
-ACCTACCTACTTCATTAACTGCTGTTTATTGACCTGTCTACGTGCCTACC
-TCATGCCTGGCATGCCTACATACCTACCTCATTTATCAGATCCTCATGAA
-GCCTATTTACAAGCCTACTTCCAGCCTACCTATTGTGTTGATTACGATCA
-CCGTCTCTAGGTTGCCTAACCTGCCTAATTGTGTCTACCTACTTAGCTAT
-CTCATGCCTGCCTACTAACCTGCTCAAGTACCTACTTCATGCCTACCGGC
-CTACGTTCCTACCAACGTGCCTACCTGCCTGCTCACTAGCCTAAGTGTCT
-GCCTACATAAATTGTCCGTTAGCACATCAAACTTTTCATATATACAAAAA
-ATTGCATAAAAAGAAGATAATCATTAATAACAAGTGGGTAACTCAAAAAG
-GAAATTGGTTTATCTCCCGGCTCCGAGAGCACCAGCACTTTGCTTTTCCG
-TCACTACAACCTCTAATTTTGTTTTGTTCGAAGGACTTTTTCCGATACAT
-ACTAATTTTTTCGGATCCGGTTGGCTCTGGATTTCAAGTTTTATAATAAC
-TTGGGCTCCCAGTGACGTCACCAAAGGTGCAATTAGCCTTTAGTAACTAA
-ACAGCTTGCTCCTAGTTTACTGCTCCGTCTTCTCAAATGAAACAGAGAGA
-GAGAGACCCCTCATCGAAAATTCAATTAAACGCTAAAACGTAGGTAGGAA
-AGAGAGAGAGAGGGAGACTCCTCCCAAAAAAAAAAGACAGGGGGGCTCTC
-TCTCTCTCTCTCTCTCTTCGAGCGGCAAATCGGCTTCCGAATTCATTCAA
-AAACAAATTATGTGCTCAACCACCACCACTACCACCGGCTCCAGGCGGGT
-AATTACACTTGAAAACCAAGTACTAGGTTTCGTGGCCGGGCAAACTTTTT
-CTTATTAGACCCCGGTGGAATTTTGTAGGTCTATTTAAAATTGCAATTGC
-GCTATTTTGTACTGTTTTTTTTTTGACAAACTTTGAAGCTTGATGTCAAG
-CTGGAAAAGCGCTCTAATGACAATTTTGACTGCAAACTCGCTCTGTTGAT
-AAATGGTCCGTGTACTCCACGGGGGCAATTAAACTGGATTTTTTTCGATT
-AAATAATATCTTGATTTTTTGCAGTTTTGGCTTAGGCTTAGGCGTAGGCT
-TAGGTTTAGTCTCGGGCTTAGGCTTATGGTCAGGGTCAGGCTTAGGCATA
-GGCTTGGGCTTAGGCTTCGGCTTAGACTTAGGCTTAGGCTTAGGCTTATG
-CTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCT
-TAGCCTAAGGCTTAGGTTTAGGTTTAGACTTGGGTTTAAACAGGCTCAGG
-CTTAGGCTTAGGCTTAGGCTCATGCTCAGGCTTAGGCTCAGACTTAGGCT
-TAGACTTAGGCTTAGGTTTTGGCTTAGTCTTAGGTTTGGACTTAGTCTTA
-GGCTTAGTCTCGGACTTAGGCTTAGGCTTAGGCTTAAGTTCAGGCTTAGG
-TTTAGGCTTAGTCTGAATATTTGGCTTAGCCTTGGGCTTAGGTTTAGGGC
-TTAGGCTTAGGATTAGGCTTTGGCTTGCCGGCCACCTGGGATATTGTGGT
-TTGACAGGGGTAGGCTATCCAAATTTTAAAAAAATCGGCTACAAAATTAA
-TATTTAGATGGGCCTATAAACCATTTCTCTAGGCCATCCTGCAAAATTTC
-CAAGACAAAAAATTTCAGCCGTGAATAAAGTTTCCGTTTTCCTAGGCCAC
-CTCCAAATTTTCCACGTCATATGTAAGGTATCGGAGGGTACTGTAGAAAA
-TTATCAAAAATCAGCAAAGAATAATAAGCATTAAGAAAGTTTTTTGTGTG
-TGTGTGTTTTTTGTGGGAGAAAACATTTCCCCTCTCCTTTTTTCCTGCCT
-GCTCATTTGGATACCACCGCTAACCCAACTTGACTTTGATTACCCATTTC
-CGTCCCCCTTCTTCGTCTTCTTCTACTCCGGGATAGAGAGAGAGCTCTAT
-ATAATTACTTTCGTCTTCTTGATCCGTTACCGCCCATTGGCAATTGGTTT
-GAGCTGCCGCCGGAGAATATATACATGCATGTCTAATTTTTTACTGGAAA
-ATCTAGGAATTTTTACGTTGAAAATTTGGTTAAAAGCGTACAGATCGGCC
-CATGCTGGTGATTGTACGAAATTTTAATTTCAAAGTATCTGCAGAGGAAG
-CTAGGCCACAAGCCCCTACGTGGCCGTCAAAATTGAAAACTAGGCCACCG
-ATTTTTTCTCGGACTTTTTATCTACTTTTGCTATTAGGCCCTGTCTTCTT
-TTTTGCAACGTTTTTCTACTAGGTCACCAAATTTTTCCTAGGCCAAGCTG
-CCTAAAACTCGGCCACCGATTTTTATTTGCGTCGGTCTGTAACATTCAGG
-CTCCGACCAGCTCGACTTTTGCTACGTGGTCGCCAATTTTTCCTAAGCCA
-CATCGAAAATGACTCGCTGTGACATTTGTACTTTTTTTCACACGGCCTAG
-AAATTTTGAAAAAAACTCGGCCACTGATTTTATCGGCCTTGGAATCCTAT
-GTAACTTTGTGGCATGATTTTTTATTTATTGTCCATCCAGTTTTTCGTCT
-GAAAATTACAAAATGTTTTAGTGACCGTTGGAGAAAACTCGGCCACCAAT
-TTTTTTCTCGGCCAAGTTACCAAATTACGGGATACCGTGTTCTCTATCAT
-ATTTCTGGCTCAAAACATACTCTACTTCCGTGCTGCCTACGTGGCCGCTC
-AATTAGAAAACTCGGCCATCATTTATTTTCTAGGCCATGTCGAAAATAGG
-TAATGTAAATAGGCAAAGAAATGCGGTGGTTCAAGTAATTTTGGGAAATG
-GATTTTAAAAAGTTGAAAAAATAAATCAAATGAATAAGTCTGAAACACGC
-AAACCTTAAAGCTAGGCCATCAATTTTTTTCTCGGCCAGGTTGCCAATCT
-ACGGGAAACCGTCATGTTTCTTGCTCAAAATTACACCCTATTCTCGAAAA
-ATTTTTTTTACGTTGAGTATGCTCTCCTGCCTAGGTGGCCGCCCAATTAG
-AAAACTCGGCCACCCATTTTTTCTAGGTCATGTCGAAAATAGGCGATGTA
-ATGGGGTAGTTCAAGGAATTTTGCGTAATGAATAACCCCAAAAATGTTTT
-CAATATATGGCCGCCAAAAAAGAGAAAACTCGGCCACCAATTTTTTCTCG
-GCCAGGTAGGCTACCAATCTACGGGATACCGTGCGCTCCATCCTATCTCA
-GGCTCAAAATTACGCCTTTTTTCTCGAAAAATTTTTGCATACTCTCCTCC
-CGTGCGGTTCTTAATTAATGAAAGACGTTTTTTTTTCTCCTTGTCTAACG
-AGTGTATATGCAGAATTCAGGATATGCGTCTTCTTTTCCGAGTTCTTGTC
-TTCAAAGCGAAAAAAAAAGTGTGTGTGTGTGTGGACATAGGAAGACTCGT
-CTTCGAAGAAGACGCTCATTAGCTCATTTCATCCACTCGCTAATTTCATT
-AATTTTGTGCTTCTTCGCCTGCCTTCCGACGTGTTTACCCACACCACCAC
-CACCACCACTCAGTACCTCCTCACTCACCGTGGAGAAAGATGTTCTGGAT
-TTTTTTAAGCTTTTGAGTTTTGTGTCCTACCTCACTTTTTAGGCTCCACC
-CACTTCTTGGCCTGTTATTTCGGTTTATTAGAATTTGTGTGGTGTACTAC
-AAATTTCGATCCGAAAAATGGCAAAAAAAATTCAGCTGACTGAATTTTTT
-TGAACTTTCAAAGGTTCAGTTTTTGCAACCTAAACCTCTCTTAACTTTAA
-CTTTTCAAACCCCGCCCATATCTTGGCTTTTCCAGAAATCCGAGTAATTT
-TTTGGGAAATTTATGGTACAACTAGCTATCAGAACAATTTTTACGGAAGT
-TTTTTTAATTTTATTTTAATTTAAGTCTACTGAAATTGACCTAAAATATA
-TTTTGAAAAATGCTTTGATCCCGAAATTGGCCAAAAAACGTTGATCGAAT
-TTTTTTGAACTTTCAAAGGTTCCGTTTTTGCAACCTTTAAGCCCCGCCCA
-TTTCTTGGCTGTATTGTATTCAAAGTTAAAAGTTGTTCATGTTGTACTAA
-AATATGCAAGTATCATAAAAAATTAACTTTTTAAGCTCCACCCATTTCTT
-GGTTTTTCTGGAAATCCGAGTAATTTTCTGGGACTGTTATGGTACAATTA
-GGTATCAGAAAAAAAATCAAGGAAATTTTTTACTTGGATTTATGTCCACT
-GAAATTGACCTGAAAATGTTTTGAGATTTTAAAAAACTTAAATATTTTGA
-TAAAGGTAGAATTTGAATTCCCCGCCCATTTCTTGGCTGCAGTTCCCAAC
-TGTCCAACTTTTTGAATATTTTCTCAAACTTCATGGCCTAAAATTCCAAT
-TCTAGGCGATCTACCTTGATAAGAACTTACTCCTGAGTTATGTTTGAAAA
-ACATAGTCCATCCGTGGCCTAGAAATCCAAAACTAGGCCATCAGATTTTA
-GGTTCCTAGGCCCAATCACAAAGCCAGCAGTTTTAAGTTGTCAAATTTCA
-GTGGCATAACCTCATAATTTAGACCTATTCTATTAGGTCAGCCTATTACA
-GTTTCTGGCCTAGAAATTTTCCTTGAGTTTGAGCCCACTACCCCCACACC
-CACATGGCCTAGAAACCCAAGCCTAGGCCATGTGTCCCCGCATTCTCACT
-CACTTTTAATTTCTTAATCCACTTACACAATTCTCTCCCCCTTTTCCAAT
-TTCACATCGAACCCGGGAAAGCTCATTAGCTCATTTGTTGTGTGTGTGTG
-AGTTGAAGAAGCGGGGGGAAGGGGAGCCCCCCTTTTGAGTGGACGGGGAG
-CTAGAATGGAAAAAGAGAGAAGGAGGAGAGCCATTTTGAATGGGTATGCA
-ATTAGCAATCGATGCAAATTAATTAAACAAACAACGAAATGAAAGGGGGG
-GGGAGGGCAATCGCCTGCCTTCACTCACATGTCCCCTGCTGGAAATGTGG
-AAATGTAAATTAAAATTAGAAAACTAGCAAAAAAGTGCGTTTTTTATTCC
-TACTTGTTAATTAGTTTAAATTTCTATATATGTATGGCTTTGACATGCCA
-ATTTTGGCGTCTAAGGGTAGGTATAGGTGGGCGATGCACCATGTTAAATG
-GTCGATGCATCATGCCAAATAGTAAATGCACCATTACACATTGAAAATTT
-AGCATTATACACTCCATATAACTGAAATTCGGGGCCCAATCAATATCATG
-CCGCCGACATCTCACGGACTCCGCGCGCCGCTATGTTTAACTCGCAGCGG
-GCGGAGACAGCTGGCCGCGCCCACAACGAGTTAAACACAGCGGCGCGCGG
-AACTCGTCAGATGTCGGCGGCCTGATATTGGTTGGGTCCCGAATTTCAGT
-TTTATTATTTGGAGTGTATAATGCTAAATTTTCAGTGCACCGTGTTAAAT
-GGTCGATGCACCATGATAATGCTAAATAGTCCATGCACCTTGTCTAGAAA
-ACTCGTTGAGTACTGTACTTATGAAACAGTTTAGCAAAAAAAAATGTCAG
-CCTGTTTGGCTCCGCCCCGAAAGTGGGCGGAGTCTAATTTCTTGAATTTT
-TTTTTTTCAAAAATTGTTTTAAAAATAGCTCTGTGAATTCCACCTCAAGC
-AACTATTTTTAGTGGAAAGCAAATTTTTTCAAAATTTTGCGCAAATGGTT
-CTGAGGCTCCGCCTTGAAATTGGATGCTCTTAATTAAGAAAGAAGTGTTA
-GTCCCGCCCCTTTATTGGAGGAACTCAAAACTGGGAGGAGCTTAAGAAGG
-TTATAAAATTTTGCTAATTAAAACACCCAGCTCCGCCCACTTATATATTA
-GTTGACTCCGCCCCACCCATTAAAAGTGGGCGGAGCTTAAAAATATTGAC
-CACGCCCCTTTCTTGGGTAGTTTTAGCGTTTTTCATAGAGTCAATTTTCA
-CGGCGGACCCCGGATCGATGCACCATGATTTGACGCGCAACCCAGGTAGT
-ATGACGTCACTCGTGGCCGAACTCGCGGGGGAAATTTGTACTTACAGCAA
-TAAATTTCGGTGTCTCACGGAGCACCTGCACACGTACCGATCATGAGTGA
-TGCTTCCCACCACAAGACATACACATACACACACAAACCTACTAATTAAG
-ACAAATTATAGAACAAGTGGGGGGAGAAGGGTAGAAATAAAAGTGAGCAG
-TGCGAGAGAACGCGTTAGACGGAGAAGCTGCTCTGGGAGACGTGTGAGAG
-GCATATAAGTTGGATTAGTTTACTGCTCTTTTCATGGGAAAATCAAGTGA
-GCTCCAAATATTTAATCTGACTTTGATTTGGTTTGATTCTGAAATTTTTT
-TGGGATTTGCAGAAAAAATACGTTTTTTTTTTGTATTTTGGAATCGCACC
-AATACGCTGCGTTGCCCTCCTACAGTGCAACTGAGCCACATTTCTCTTCC
-ATAACTTTTTTCTTAATCTCAAAGATTAAAACTCTGCAAAAGCTCAATAT
-TTTATAAATGATAAGGATTAGCAAAGTGTGGGTGATCTTCCAGAGGGGGG
-ATTACCATAATTCATTACTCATTTTTCAAGTTTCATCTGTGTTTTGTTTG
-ATAACCTAGGTGACCTACTAGTTTACCTACAGGGCTGGGACCAAAAAAAA
-AATTTGGACCAAAAAACAAAAAAACAAAAAATTGAAGTTTTTGAAAAACC
-AAAAAAACCAAAAAAAAACAAAAAAAAACAAAAAAAACCAAAAAATTTCT
-TATGCTTAAGTTGATTTTTAATGGGGTTATTCAAGTAATGTTGCAAAATG
-TATTAAAATACATTATGACGTCACAACTGTGTTAAAATACATGTTTTAAT
-GTATTTTAATACATAATAGTCTCGAGTCGAGACTAGACATGGTAAACACT
-TTTTTGGATTTTTTTGGATTTTTTGGTCCCAAAAAACCAAAAAAAACCAA
-AAAATCGATTTTTCGTCAAAATACCAAAAAAAACCAAAAAACAAAAAAAC
-CAAAAAATTCTCAGCCCTGGTTACCTGTCAGCAAATAATTTTCCCCTATA
-TACCACCACTTCAGGAGTAATCAACACCCCAAAACGGCAATTATTTATTA
-TTCTCCTCACCTTCTCAACACTCCATAGCGCCAGCCAGCCTAATTTGATT
-GTTTAATTCGATTCAGGGCACCCCACCACACACAAATTTATTAATTTTTG
-TCTTTCTCGCCATTTTCCAATAATTTTCCCGGCTTGTGTTAGCTTTATTA
-TAGAACTTTTTAAAGCGATTTCTTAGGAATTTATGTGTGACGTCATATGT
-GGCCTAGAAATTTGACGATCTCGGCCGTCGGGGTCGATGAACCATGTTGT
-GATGTATAGGTGGCCTAGAAAATTTTAGGCCACCATGATAGTCGTGGCCT
-AGAAATTTGGGCGCCTTCAGGTGGCCTAGAATGTGAAAAGTGACGTGTGA
-CCTAGTTCTTTTGACGGTCAGGCCAATTTTCCAATTCGATGCTTTTTTTT
-TAATTAAGGTCCATATTCTGCAATTTTAGGCTCCGCCCATATCTTGGTTA
-AACATTTTTTTTTTGCTTTTTTCTGCAATATTCATTCAATCCATCATTGT
-TCTCAAAATTTGATGCACCATGATATGGCAGTGGCCTAGAAAGTGCGACG
-TCACTTATGGCCTAGAAAATTCGAGGATCTTGAAATGGGAGAAAGTAAAA
-AAGTAATCAATGCCCCCTGACGGTCGTGGCCTAGAAAGTTAGAAGATCTA
-GAGGAGGGGAGTAGGAGATCGATGCACCATGTACAGCTACAGTGACGACT
-CACGTGGCCTAGCTTTTTCGCAGGCCACGGCCATAAAAAAATGTATGAGA
-TCGATGCACCATGTTTGTCGCGGACTAGAAATCGAGAATGTGGCGCACGT
-CACGCATGGCCTAGTGACTTTTACGGTCAGGCCGAAACACAGGACGTGGC
-CTAGAAGTCATTCTGTTAGTCTAAGACTCTGCAAAAACTCTCAAAAAAGG
-TGAGCCTATGTGCCTGCCTACTTGCCTACATTCTTGCCTACCTGTTACTG
-CTTTCTAATCTGTACCATGTTGCACCTACAGTACCCCCTTCCGCCCCCGT
-AAAGACTTTTTCAAGCTCAAAAGTGCAGAAAACACAAAAAAACCAAGCCC
-AATCTACAAAAGCTCATCTATTCGTGCTTGGATTAAAATGCCATTAAAAT
-GATTAATTAAGAGATCGAGACTGGTTGAAAACTGATCGGATTAAAAAGCG
-ACTGAGGTCCGCGAATGAGCTTTTCATGCAACTGATGAGCACATTTCCTG
-TGTATGTACACTGATGATAAATCTCCTTATCTTTTCCGAGACATAACAAT
-CTCAATGTTCTTCATTAGTTTCTTCATTTCCTTCTGAAATTTGTTGCTTT
-GATTTATTAAAATCTGTCATTATGTAAGATCCATAATTCGTGATTCGAAA
-TTTTTTACAGTTTTTTTTAAATATAGAAATTTGAATAACTTTCCTACCAG
-GCTGCCCCAATACAGTTTGATCTACAAAAAATGCAGGAATTTTTTGCCCA
-AAAATATGTGACGTCGGCACGTTCTTAACCATACAAAATCAGTTGAGAAC
-TCTGCGTCTCTTCTCCCGCATTTTTTGTAGATCACCGTAATACAATGCAA
-AAATGAGAGAAAAAAATTTGAAAAAAAACCTATCCAAAAATTTGGCATTT
-TCAGATTTTTTTTTTCGAGCAGACCTAAAAATGTTTCGATAAATTCTAGA
-TTTTTTGAAAAACTGTCTGAATTTTTTTTTTTGAGAACAATGATTATATT
-TTAAAGATCAGTGTTGACTTGAATCATGTAGCGTAAAAAAGGTTAAAAAA
-AAACCAAGATATGGGCGGAGCCTAAAATTACAGAAATTGGACCGTAAATT
-TTTCAAAAAATTTTTTTTTTTTCAAAAACCGAAATTTTATTTTAATTTCA
-AAATTTCCGCTTCGGGGTTTCTTGATTTTTTCAATTTCAATTTCAATTTT
-TTAGATTTTTTCCCGTAAAAAACCCAAAATAAATTTACTGAAGCTTCACT
-ATTGGATTAAAAATTTATAAGGTTCTTTGCGGGAAAATTAGTAAAAAATC
-GAAAATATATTTTAAAAGAAAAATCAAAATTAATACAAAAAATTAAGGCT
-TCCATGTAGGTTCGCGTGGTGCCAGGCTATCCCATTATTTTTTCTTTTTT
-TTTTTTTTTCCCCAGGAAAGTGTGACGTCAGCACGTTCTTAACCATGCTA
-AATCAGTTGAAAAGTCTGCCTCTCTTCTCCCGCATTTTTCGAAGATCATA
-CCAAAATGGGGCACTTTGACGCCACGTGTAGACTGTAGGCCATAAACCGC
-CTGCCTGCCTGATTTTCAGGCTACCTACGCCTGCCTGTCGCCCCAATCCA
-CGCCTTATGCTAAAACACATTCATTTCTTAATTTGATTTTCACCAAAGTG
-ATAAAAAAGATAAATTAAAAATTAGTACATTCTCGTCAAAATGCAAAAAG
-AGTCGTAAGGCAGGCAGGTTTCAGGCAGGCCCTGGCTCACGCCTGCCTAC
-GATGCCGGTTACTAAATTTCCAAAATACCTTATTTACTCTACAAATCCTC
-TACCCCGACATTACATCTCAAAACTCATCCTATTAATTTCTGCCTTAGGC
-GATAGCACTACTAATTGATAGGAAAAGACGACTTGTGTGTGTGTGTGTTG
-AATTATTATACTAATTTGATTTTAGGCAGCCTCTTTCGTCAAAAAAAAAT
-AACTTGTGTCACCACACCACACCTCCCACGTTTTCGGTGAGTGAAGCTTC
-TGCTCGCTGTTAAGCAGATATTCATAGGGAAATCATCCGTAAATCCATTC
-AAGTCCTCTTTATTTTCTTCTTCTTCGACCAAATTAGTATACAGATGTCA
-TCAACTTTTTTGTTTCTTTTTGAGGGCCCAGGCTGTTCATTACAGTTTGA
-TCTACAAAAAATGCGGGAAATTTTTTTTTGCTTTTTGCCCAAAAGAATGT
-GATGTCAGCACGTTCTTAACCATGCAAAATCAGTTGAGAACTCTGCGTCT
-CTTCTCCCGCGTTTTTTGTAGATCTACGTAGATCAAAACGAAGTGGGAAA
-CTCTGACACCACGTGCTTTGAGAAAAAATTTGAAAAAAACCTTTTTAAAA
-ATTTGGCATTTTCAGTTTTTTTTCTTTACAAAATTTTTTTGAACGAATCT
-AAAAATGTTTCGATAAATTCTAGATTTTTTGAAAAACTGTCTGAAATTTT
-TTTTGAGAACAATGATGACTTGAATATTGTAGAAAATCGTAAAAATAAGT
-TTTAAAAAACCAAAAAAAAATGGGCGAAGCCTAAAATTACAGAAATTGGA
-CCATAAAAGTTTCCAATTTTTTCTTCACAACTTTTTTCAAAATTGCTGAA
-ATAAAAAAAAACTATTATTTAAATTTAAATTTCAGAAATCCTAATTTTGA
-CGCCGATTTTTAAAATTATAAGGATTTGTTTTTCCTGCAAATTCTTTTTT
-AGAAACTTACAGTTTGTCGGTTTGTCGATAGAGCGTGCTTATTCACCAGG
-CTGTCCATTACAGTTTGATCTACAACAGTGCGGGAACTTTTTTTTTGCTT
-TTTGTCCAAAAGACTGTGATATCAGCACGTTCTTAACCATGCAAAATCAG
-TTCCGCATTTTTTGTAGATCAACGTAGATCAAACCGAAATGGGGCACTCA
-GACACCATTTGGGGGGCCTAGAAACCGGTCCCTTTCTCATTCAAAGTGCT
-CTCTGTTATCAAGTCTCCCACGCTTTATGCATTCAACTTTGTACAGTTCA
-CACGAGCACCCACGACTTGATTATTCAACATTATACAGAACTAACTATTC
-GAATCTCAACATGTCTTCTTGCCGAATTTAATCAACTTTGACTTCTTCTT
-CTTCTTCGACTTCTTTATACAACTACTCATCTTCTAGTTGCCCCTCTAGT
-TGCCTCACACAAGCAAAATTTCTTTTGAAATGAAATTTAAACGAATTGAC
-TAGTCAAAATTTCATCAATTTTCTACTAGAGAGAAGCGACGAGATTGACT
-TTTGGCAAATATAGAAGAGAGAGGCACCGAAAATGAATTAGATTTAACAC
-AACAACGAGTAGATGAGTTGTGTGTGTCAACGATGATGATGATGATGAAA
-AGAGCAGAGGAGCAAGCATGAGTGATTTCTGCGGCGGAGGTCGCGGCGGA
-TGAGGAGCATGAAGAAGGCTAACGAGCTGTATGGCGATGCGGCTAAAAAT
-TGATGATTACTGTAGATTTGGAGCTTTACACCGTTTAACTGGCTACGATT
-ACATACAGACTTGTTTTAGAATATTCTGTATTTGAACCTAATAATACAAA
-TTGCCGGTGTGCCGATTTGTCGGAAATTTTCAATTCCGGCAACTTGCCGG
-TTTGCCGATTTGCCGTAAATTTTCAATTCCGGCAACTTACCCGTTTGCCG
-ATTTGTCGGAAATTTTCAATTTTGGCAAACTGCCGGTTTGCCGATTTGCC
-GGAAATTTTCAGTTCCGGCATTGTGCCGGTTTTCCGATTTGCCGGAAATT
-TTCAATTCCGGCAATTTTCCGGTTTGCCGGTTTTCCGTTTGCCGGATAAC
-AAAGTGTTTAGAGGGATTTTTTTATAAGAAGGAAACTCTTAAAACTGTGA
-CTTTTTGAAATTGTTTCCCGTTTTCTTTCGATATTTTCATAGATTTTGCA
-AGAATGCGTGCAGTTTTGCCAGTTTAGACGTAATTGAATTTCTGAAATTT
-CAAAAAAAAAAGAGCAAAATCATAAATTTTTGACATTTGTCATTTTTTCC
-GGTAATTTGGCGATTTGCCGGAAAAAAATCATTTACCGCCAACTCATGGT
-ACGTCTAACCGCAAAAATTTTTTGGGAGCCTTTTCTGGCTTTCTTTCAAG
-CTATCGTAATGTGACCACACACCTTTCTATAATTTTCAGTATTTACGCCA
-ACCGAGAAGATCACAGTAGTTTAAGGTTATGGTGCAGTTTCTGGTCAATG
-GATCAGGTCTCTTACCGCGAAAATTTTAATACCGTGAATGTGAAGCTTTG
-AAAATTTTCTGCCGTAAATTGTCAATTTTCTGCCGCACTTTGTCAATTAT
-CTCATAAAGGTCACTTAAGTTAGCCAAACCGTGAGCCAAAACTGCCCCTT
-ATTCCTCATGCCGTCTTGGAGGAAATCTAGAGCAAACCCTGGTCCATATT
-CGGACAAGGTCCCCTTTCTTCCCCCAAGCGTCTATCTAACTTTTCCTAAC
-TACATATAACGGAATTAATAATCCTATCCCCAATTTAACGTGTCCTTAGT
-TCTCTCCCTCCTCACCGTCTTCTAGTTTCATCCATGTCTCGCCTCATTTC
-ACCCGATTGACGATCATCTCGGCTCCACACTTTGACACCATAGCGCGAAT
-GAAAAAAAAGAGTGAGAAAAGGGGAAAAAAGTTGCTGCCCTATTATTAGG
-AGTCAAATAGACACACACACACACACACTCAATTTTAATGGATTACGCAC
-GATTTGACACCATCGACACCAATTTGGAAATGGGGGCACATAGATACATA
-CACAAAAGGAGTTGTACTACTAGTTTTGGAACTAACATCATTCTAACATC
-TTTTCATTTATGATTTGATTTATGCAAATGTCCTTGATTCGTGACTTCTT
-GTATAGTAGTTGGGATAAGTATAATCATGGTAGTTGCTCAAGACTAAGCT
-CTTTAGCAGTTTTAAGGTATGCCCCAGTTCGGGATTCCGGCTTGCTTTAA
-GATTGTGTCAGGTCCGGCCCAGGTTGTCTAAAAAATACAGGTCTGCTCCA
-GGACGGTATACCATCACTATATATAAAGCACGTGTCGTTCCGTCACTTTG
-TAGTTTGATCTTTGATCTTTGGTCTTTGAACTCTGTAGTTTGTAGTCTCA
-TCACACAAGAGAGGTCACATAGGCCCGGCCCCTTTTGTGACGTCATCACA
-AATTGGCGGGAAATTCAAATTTTCTGAGAAAATATTTTGGCGGGAATTTA
-AAATTTAATTTTTTGAAAACATTTTGGCGGGAATTCAAAATTTAATTTTT
-CAAAAACATTTTGGCGGGAATTCAAAATTTAATTAGACTGTTCTCGGTTC
-GGCCCAGATATATCCAAAGTCTTTCTCAAGACCACTCTAGATCTGTTCTA
-CTGTTACCCAAGACTGCCGCTCCACACCCTGTATAAGTTGGCCCTAAGGC
-TCCACTGAGTTTGATCTAAATCTTGCCAAGCCTGTATCATACCTACCTAG
-GCCCACCACAGGTGCATCTCTCACAGATCTTCCACAGGTGTTTCTAAGTC
-TGCATCAGATCTGCACCAGGTCTGTTTTTAGTTTTGCCTGGGTGCAGCCC
-AGTAGTCTACCTCACTATCAAGCAGGTCCTGACACCAGTTCCTAGGTCTC
-ACATTCAGGCTTCTAGGCGGATAGTCTACCTAGCTAAAGCTTCAACCTCC
-ACTGTTTTAAAGGCTTCCCCTTTCTCAAACTTCAACTAACATTAATACAT
-ACATATGTTATTAATTCGCGACTCGGCGACTAATAACAATAATTCAAAAC
-CTCTTTCCTGGCAATGCTTCCGGTACTCAACACGGAGAGAGAGGTGGCAG
-GTATCCGGTAATTTATTAACTCGAGCCGCGCACCCTGGCTCCCAGAGCAC
-ACAGCCCCGATGATCGCTCATGCACGAGTACTCACGAGGTGGTGGTGAGA
-GGTAGGTTGGAGAAAGCGGTTCTACCTTCACAAATTTCAATTTCAATTTC
-CTCTCTCTCCGTTTTACTCGGGCCCCCCCCCCCCCCTTCTTTCAATTTTT
-CGCCCCAAATTTGTGCTCCTTTAATGGAAAGTTTTTGAGTGTGTGAAAAA
-GAGAGAGAGAGAGACACCTTCGTGTCACGCCAATTGCACTAATATGTGCT
-CTCCCCACCTAGAGCTACCAAAATGTTCAATTCACAATTTCCGAACTAAT
-TCGTGTCAAGTTTTTAGTTGGTCCTAACTCTTTGGCCTAGAAATTTAGAT
-TTCTAGGTCATCCATCTAGATGCGGTGGCCTAGAATCCTAAGCTTTAGAT
-GCCCAGGCCATCAGGCCTAGATTCTGAAATGTTGTGATTTTTCTAGGCCA
-TCAACTTTGACCCAAAAGCCCTCTAATTTTTAGGCCATGAATCTAGGAAC
-CTATCTAGAGGCCTGATCCTTTGCTTTCTTGCCAAAAACTAGAGATCAAT
-GCCCTAGAAGCTCACAAAACTTTGGCCTAATAATTTCTAGGCCACCAATT
-TTTTAAAGATAGCCTAAGTCATCAACCTAAAATTCACGGCTTAGAAATCA
-TGAAATTCGCTTTTAAGGCCTCTGACTTCATAGCAGTGGCCTAGAACTCC
-AACTGTCAGTAGTCTGTAAAAATGAGCTTTTTGGGCCTCGAACATAACAT
-GGGACATGGAAGCCTAACATTTTTAGGCCACTGACTTTAAAGCAATGGCC
-TAGAACCCCGTTTTTCTGTAGCCTAGACTATCATCTAGAAATCAATGGCC
-TAGAATCCTAAAAATAATATTTTTCGGCCACCAAAATTTTAGGAATGGCC
-TAGAAATCTATTTTGTTGTATTCTAGGCCACCATCGACAAAGGAATGGCC
-TAGAATCCCTAAGAATGTGATTTTTAAGCTACCATCTATGTACCCTAGAC
-CAATATTTAAAATTCAATGGCCTAGAAACTAGAATATTTGATTTCTAGGC
-TACTAACTGTTGTGTGCTGTATCCTAGACTATCATCTAGACCCCAATGGC
-CTAGATTCCTGAAAATGTGTTTTTTCGGCCTGAAATAGGCCTAACATTTT
-CCAGTCCACCAACTCTTTTAAGATGACCTATAAGTTTAATCCTAGCTTGC
-CAACTATAAATAATTGGCCTAGAAGCTCCTAGGCCACCATCTAAAAATCG
-ATGGCCTAGAAACCTCCCATTTTTTGTATCCTAGGTCACCAACAACCACT
-GATGCCCAAGACCCCGGCTTCTTATTTCATAATGAGCAGCAAAATGAGCT
-ACCGTACCCCTTCTACACACTTCCTCCCTCTCCACACCCATTTCCCCTCA
-TTTTCGTCTATTTTAGCGGCGGCGGCGCGGGATAAATTTGTGAGAGGTGA
-GCTGCTCACAATAATGGGCTTGTTGTAATAGGCGGCAGTGGTAGTGGTGT
-ATGGATAATTGTGAGTTCCCAAACACACAAAACTTTTTCGCCGCAATTGT
-TATGCAACCAACATAATAATAATAATAATAATAAGTGAATGTGCATAAAT
-GTGCTCTTTTTCGCGTCTCCACACCCGTCCTGATGGGGACGACGCTTCGT
-TGAATAGTTGGAATAATAATAATAAATTGGAAAAATTTGGGCGCCCCCCT
-CCTAACACCCTAACACACACGAAATTTCATTTCGCGCGCGCTTCGAAAAC
-AAATTGAAGACAAGTTTTTCGCGAGACAAGTTATGATAATTTGTGGGATG
-TGGTCCCCGCCGGCAGCTTCCATCAATTTGGAGCAAATTTGTGCTCTCGC
-AAACCTTCTTAAAGAAGGGTTACACTAACAAAGTTTGTCGGAATCGATAT
-TTTTGTAAGTGGGCCTGAACCCCCGGTCTTTAAATTGATAGGCATTCTAG
-GGCTTCCATGGGAGACAGGCGCGGTTTTAGGGCCTGACGTCTGCCTCTCG
-CCTCATTTCTGCACTATGGCGAGAAGCCAAAGACTTGGTGTTCACACTTT
-GTGCCAGAGTGTCTCATTTCGGCTTGATCTACGTAGATCTACAAAAAATG
-CGGGAGAAGAGAAGCAGAGTTCTCAACTGATTTTACATGGTAACCAGAGC
-GTGCTGACGTCAAATTTTTTTTGGACGAAAAACTCCCGCATTTTTTGTAG
-ATCAAAAACCGTAATGGGACAGCAGGGCTTTCCACCAGAATAATTCCACT
-TCTTCACAATAAACCTATATATTTTTTGTCAAAATCTTGAGAATTTCCAG
-AATTTCAACGAAAACCACTGCTAAAAGTGGTTCTTTCGCCGCGGCCGACA
-CTTCTCGGGTTCCGCGCCGCACTATAAAGGAGGCGCGGCGCGGCAGGCGG
-CGCGAGGCAGGCGTTTTGGCGCCTGCACGGATGCCCTACACCAAACTGCA
-AACATTTCTAGTTCCGTTTTTCGGACTCTACGCCTTATTTCGGTCTTTTT
-GTCACAACTTCGCTACACTGTGTTTTTCTCCACTTCTACGACTTTAAAGG
-AGGGCGCATTTATGCGACTCACGTGATGTCAGGCAGTCTCATTGCGGTTT
-GATCTACAAAAAATGCGGGAAACTTTCCACCAGGAAATTGTGACGTCAGC
-ACACTCTTGCGAGATCAGTTGAAAAGTCTGCGTCTCTTCCCCCGCATTTT
-TCGAAGATCAAACCAAAATGGGACATTCTGACACCACGTGGTGACTTAGG
-ATCAATGTAGATCGTTTTATAGGCCATCCATTGATTTTTAGAGCTCGTGG
-CGGGACCATTTTAAATGAATTTCCAAAATTTCCAAAAACCTAATTTTTTT
-GTCAATTCACAAGTCCCCCGGACCCCCTCCATTGTCCCCCCGTTCACAAC
-TTCCTCCCTCGTTAACCACCCATTTAGCGGGACAAAATTAGCGAATCATT
-GACTCATAATCAAGTAAATCGGTGAATGCTCGACGAGCAAGAGGGGGGGG
-GGGGGGTCTAATCGAATTACGGGGGAAGGGACCCCTCCGCGCGACACCTC
-GCTGCCAATTAACAAGTCAACTACTTGGGGGGGGGGGGGGGCCTCCTCAC
-AACAATGTTTGTATTATATTTCTTGTTATTATGATTATTATTATTATTAT
-TATTAGAAATTAGTTAGTATGAATATATAATATCAACTAAAAACAAAATG
-ACAGTTAATAATAATTGAAGTCATCCAATAGGTGCCAATTAGTCAAAGAG
-AGGGGTCTGTGAAAACAGAAATAGAAGAGAGAAGGCGGGGGAGAGGGGCG
-CTCTCAAATAATTAATCTGGGCTCCGTGGGCTCGTAAAATTCCGATAAAA
-TGGCTTGTTTGTAATTAGCTAATTCACGGAATCTTTTTTTTTTGTTGGGG
-TTTTACTATGTTTTTGAACAACTTCCTGTTATAACATGTTTCAAAAAAAC
-TATTGACCTCAATGGGGACTTGAACCCTGGTGTTGAGATTGGTAGTCTGT
-TAACCAGTACACCAAAAATTGCAATTTTTGATTTTTGTTTTGTCTATTTT
-TTTGAATACAACGATAAGTAAGGATCATTTAGATTTAGAAAAAAAAAATC
-AAATTTTGTAAAAATTTTCTAAAAAGTTATGAACATTCCACTTTCACAGA
-TTTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGGCGAACAAGG
-CCAGATGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAATGCATT
-TGTCCGTGTGGAGTCCACGACTTCCCCCGTTGTCCGCCAGACGATTGTAA
-ATGGAGCGCGAAAAATTCAATGAGAAAGGCCAGAACCCCGTGCACTTTTT
-TGTTTCTAAAACTGAAAATTTTGAATTTTGAAATTTTCCTTGGTTTTACA
-GTATACAAAATCTTAGTTAGAGTTCGCAAAAATTATTGACACTGGTGGGG
-GCTCGAACCCCTGAGGTGGCATCCCTGTTAGCCACTGCGCCAAAATTGCT
-AAAACTTCAAAAAAAAAATTTTAGACCGTTTTTAAGGTTTTTAGACTTCC
-GACTCTTCAAAAATTCCTATACAAAGTCTTCGTAAAACTAATGACTGGGG
-GGCTCGAACCCCGGTCATCATATCAGTAGTCATCCCTGTTAGCCACTACA
-CCACTTGCCCAGACGTGTTTCTGGTCTGTTTTACGGTGCAGCGTGGCCTA
-AAAAAAACTAGTCAGCCACCAATTCGAAAAGTCCATAGACCAAGTTAATA
-TAGAAATTCTTCAAATTCGAGCCAACCAACTAATATATTCACTAACCTAT
-TTTCGCCGTGTTCTTCCTGTGTGTGTGTGTGCCCCTAGTTAGGCCTAGCC
-CCCCCCCTTATTTTACTTGCTTCACAATTCAATTGGCCCCCACACAGTTA
-CAGTAGTCATAATCATTTTGTGTCGGGTTTTCGACACATCGTTTAAACGT
-GTTACCTCTCTCGGGGCCCCCTCTTCTCCTACTTCTTATTTGCTCAAAAT
-TTGCGCGTCGAAATTTCTTCGTCGTGCGCTGCCCCTTCCGAATAATCAGA
-TTCACCAATGTATAAAATAGGCCACGCCTCACTTTTTCCACACCCATCAT
-CTTCCCTCAACTTTCCTCTTCTCAAATGCCTAATCAGCCAGTTATAACGA
-GGGTGCTCTTCGTGTGGCGCCCCGCCCATTTTATTGCTCCTCTCACGCTT
-CATTCTCACTTTTTCTGGGGATCCTTTTTTTTGCAGACCTAAAAATTTGA
-GCTCAGCCATATTTTTTTTGTAAATATAATCAAAAAAAAATAGACATTAG
-TCAAAAAAGTTGTTTTAAGCCTAAAAAAATTTTTCAGATAAAAAACGTTT
-TTCTTTAACTTTTTTGAACAGTTTTTCAGTGAAATATTTTTAAATTTTTA
-TTTTAAAAAAATGTTTGTTTATCTAAGCCTAAGCCTGAGCCTAAGCCTAA
-TAACCCTAAATAGCGTCAGTGTGGGAGCTCACGCTCCCCCACTGACGCCA
-AGCCTAAGCCTACGCCTAAGCCAAAGCCTAGGCCTAAGCCTGGGCCGAAG
-CTGAGACCTAAGCTTAAGCCTAAGCCTAAGACTAAGACTGAGTTCAAGCC
-TAAGCCTAAGACTAAGCCTGAGTCTCAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCATTTTTAAAAAGCTTAAAAATTTTTGCAATTACTATTTTTTCTGAA
-AATCTGTAAAAATATCGAATTTTTAGAGTTGCTATAAAATTTAAAATAAT
-ATTCAAAAAATAATCCGAAAAAATTAAATTTTTTTTCTCAAAACGTAGAT
-CATACAGAATCAGCTTTAAAAAATTCAAACCATTTTTCGTTTCAAAAATG
-TTCAGAAAATTTGTAAAACTTGAGTTTTGAAGAAAGTTTTCATAAACTAG
-CTCTTGAATAGGGTTTTTAAGTAGGCGTTAAAACGCTTGCCTGCCTGACC
-TTCAGGCGACTTTCGCCTGCCTGCTTGACTTTCAGACGTTCTCTGCCTGC
-CTGCCTGACTTTAAGGCGACCTCCGCCTGCCTCTCGCCTCAATCCGAGCC
-TTATCTCTTAAAATGTTTTTCATCAAATTGATAAAAATACGGAAATTACA
-AAATTTTGTAAGTTCATGCCAAAATGCAGGCATCAGGCCCTGAGGCCACG
-CCTGCCTAGGCCTCCGACTTTCGTTCTACAATTGTCGTTGCCGTTTCCTT
-TATCCCATTTTCATACCCCAAAGTTATGATTTTTCTTACACCCCTTGCGC
-TGCTGCTGCTTCCGCTCCCGTGATCTTATGAATCAGTAGTCAGAACTGCA
-GGTGTGAATCTCCACAATGATCACCCAATAAACGCGAAACACCATTAGAA
-ACAAAGTGTCCCCCGTTTTTTTTTTCTGAGAGTGTCGGCACCCCCCTAAC
-ATATGCGGGGAACATTGTCTCAAGTTTTGTGTGCTCCTCCAGCTCCTCCA
-TATGGTTACCGTAGTCCCCTGTCAGTGTTGTGTAATTGTTGTTGTAACTA
-TCCCCCGAATACCTCTCCTCACATTCATTCACAACACAGGTGTCAACTCA
-ACTCTCAGTGCTCATTTGAAGTTTATGAAGTTTAGCTTCCGGGGATGGCT
-CTCCTGGGCTCCCCGCTCCCTCGAAAATTTAATTAATTGCAAGCACATGT
-GGTGGTGGTGGGGCGAGCTCCGCGCTTCCCCCCCCGCCCCGATTCTCTCT
-CTCTCATTTGCGACTCATTAGATTTTAAATCACTCTCAAACTTTCCACTT
-TTCCAACTTTCGCGTTTTTTAAATTTTTTTTTCACTTTTTCCTCACAAAT
-TCATCCAAAAAAATTTCCAGAGTTGCCCCGCCCATATATTGGCTAAATGG
-TAGAATGGACGTGGCACTTTTGACAATGGATGACAACAACAAACCGCCGA
-CAAGTTCAGAGTCTACGGAGAGTAGGGGTGAGTTTGGCCGGGGGACCGAT
-AATTTTTAGGCCAAGACTTCTTTTTTTTTAAATCATTTTCAAAGGTACGT
-TACCTTCACGTGGTGCCAGGTTGTCCCATTGCTTTTTGATCTACAGAAAA
-TGCGGGATTTTTTCCCCAAAAAATGTGACATAAGCAAGTTTTTAAATCTT
-TTCTCCCGCATTTTTTTGTAGATCTACGTAGATCATACTCTGACACCACG
-TGTACCTTGAACCTCCTGGCTTTCTGAAACTAGAGTTCGTCGCTAGAGCG
-CATTTGCATTGTCGTGGTATTTAATTTACAGTACCGCCAGAATCATGTCG
-CGCCGCTTGTAGTCTAGTGGTTAACACGCTTCAGCTCTAAACAATAGGTC
-CGGGGTTCGATTCCTTGCAAGATGAAATTTCTTTCTCAAGATGGAGGTAC
-ATATGTGCTTTAAATGTGCACTAGAGATAGCGAAACTGATACCATGGTCC
-GACATGTACAGGGTTCCGCGCGCGCCTAGGGCCTCCAAAACGCCTGCTGC
-TCCAGTTTTGCGGCGACCTCCGCCTAACTCGCGGCGCGCCTTCTGTATAG
-TCACGGCCTTCTGTCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCG
-AACTAGGCCATCTTGGCTCGGTCACATCTGGGCTCGATTTTAGTTGTAAA
-ACTAAATGTATTTGTCCGTGTGGAGTGCACGACTTGCCCACGCGTTGACC
-GGCGGGCGATTGCCAATGGAGCGCGAAAAATTCAATAAGGAAGGCCAGAA
-CCCCGTGTATAGTGCCGCGCGTGGAGCCCGAAAAGTGTCAGCCGCGGCGG
-AAGAACCACATTCCATAGGACTAAAAAACTAAAGTTCTCTCTTTCAGAAA
-CATCACCACCAATGATGCCAGATTCTGCGGAGATAATGCGACTTCTTACG
-GATCCTTCGACGGCTCAGATGTTTGGTAGGTCATAGATCAAATTTTTTCC
-GCAATTTCCCGAAAAATTTCAGCCAACGAAAACACAAAATGTCAGCTGGG
-ACGGATTCTCGCCGCGTCAGGCTTCGACGAGGCGAGCCTCTCCTCCTCGT
-TTCCGTTCGATCCGACGCTCGGCGCGTTCGCCGACATTTCCCAATTCTCA
-TCACTCCGAAATTCGTCGAAAACGCTGAAATGTCCAAAGTGTAATTGGCA
-CTACAAGTACCAGGAGACCCTTGAAATTCATATGAAGGAGAAGCACAACG
-ATGTGGATGTCAAGTGCATGTTTTGTGCCGAGAACCGTCCCCACCCGAAG
-CTGGCTCGCGGTGAGACGTACTCGTGCGGTTATAAGCCATATCGATGCGA
-TTTGTGTCGGTACAGTACGACGACAAAGGGCAATTTGAGTATTCATATGC
-AAAGTGATAAGCATCTTCATGCAGTGCAAGAGCTCCCGAATAGTATAGGT
-AGGTGGGGGGGGGAGGCGAAGGGTACTGTAGTTTTCGTGGTGGGACCCAA
-GAATTTGAATTTCACAAGAATTTAACTGTTGAACTCGAACTTTTCGATTC
-TAGGGTCTCGCCACGCAAAAACACTTACGCCAACTTTTTTGAACCCTAAA
-AAATGATACTCAAATTAGAGTTCTCAGTGAGCTAAATTCGATTTTACAGT
-ATTTTTTTAATTTGACGTTCTGTGGGTCTTACACTCAAAGGGTACTGTAG
-TTTTCGTGGTGGGACCCACTTGTCCAAAAATGGACGTGATTATATTTGGA
-TTAAAGCCCCTAACTTTTCTGATTTTTTTAATAAATTGGTTTTATTTTGA
-AAAGACTGAGAAAATTGAGTTTAGATCGAAATCAATAAAAATCGCGTCGA
-GACCCAAATTTCCCGGGTCTCGGCACGAAAATGGGGGAGAGGGTACTGTA
-GTTTTCTGGCTTCTCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTA
-GGCCGGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGGCTCA
-ATTTTTGTTTTAAAACATGAGGAAGACCAGAATCCCGTGTTTTCGTGGTG
-GGACCCAAATGGGTCATGATTATACTTATTTGAAAGGCCTTAAGCTGAAT
-TCAGATTTAAGATTTTTATTATTTTAATTCAAAAATATCCTGAATTTTCC
-AGAATTCGCAGCCAACTTCGCGTGTGGTGCTCCAGTTAGCCGAAGTAGTC
-CAATCGAAGAGTCCGACGGATCCCTGGTCTGCTTGATCTGCGGTATCTTC
-GCCACCGAATCTATCGCCGAAATGATGGAACACGTGGAACAAGACCGTTC
-CAGGACGTTCCAAGGAGACGTTACCGTCCTAAACGGGAGCTTCCGGTGCC
-ACTTGTGCCCGTATAATACCACATTGAAAGCCAATTTTCAACTACACACA
-AGGACGGATAAGCATCTGCAAAAGGTTCAAATTGTGAGTTTTGTATTCCC
-CTCTCATCATCTTCTTATTTTTATTGTGTCGCCCTTTTCCCATTTTTGTG
-TGTCTGTGTGTGTATGCGCACCGATTTGCATATACACATAAATTCATGAT
-TTAATAGCGTAATGAGTAATATTTGCTTTGCCAAGGCTAACAGTTTTCGT
-ATTTTAAAGCCTTTTTTCTACAATTTTTGAAAAAAAAATTCAAAAATTTG
-AACATTTCAATATATCCCTAGAAAGCTCAAAATTGTAGTGAAAATTTTGA
-ATTCAGTACGCTGAGACCTTTAAAATAAGTATAATCATTACTAGGTTTTG
-GTTCTGACGCGAAAGTGTTCGTGGCGGAGCCCAAGCAAGGCGTAATTGAT
-TATAGGGTCTTTGCACGCAAAAAATTTAAGGTCCGGTAGGCGTGGCGGGG
-AGTTTTTCTTGAATTATTTTAGTTTTTCATAAATTTTCAATTTTTTGGAA
-TTTATTTTTCTCTCCCTTCCCCCGCGTAGTCTGAGCCTAAACCTAAGCCT
-GAGTCTAGGCCTAAGCCGAAGCCTAGGCCTAAGCCTGAACTTAAGTTTAA
-GCCAAAGCCTGAGCCTAAGCCTAAGCCTAACCCTAAGCCTCAGCCTCAGC
-CTAAGCCTAAGCCTAAGCATAAGGCTAAGCCTAAGCCTAAGCCTGAGCCT
-AAGCTTTAGTCTAAGCGTAAGCCTAGGCCTAACCCTAACCCTAAGCTTAA
-GCCTAAGCCTAACCCTAAGCCTAACCCTAAGCCTGAGCCTAAGCCTAAGC
-CTAAGCCTAAAGTCTTCGTGTCGAGACCCAATTATACTCAATTGAAAGCT
-CACAATGAGCTGAATTCAAATTTCTCAATGAAAATGTGAAATACTTTGAT
-TTTACGGTCGGTGGCTTTACTCCCCCCGAACTTTGGAAAAAACTCTGAAA
-TTTTTTTTTCATTGAATTCCAACCGGTTTCTACTCTCTCCGGCTATTAGT
-GTATGTGTCTTTCACTTCTTTGTTCTCGTCGGGTTGTTCCCAATTTCCAA
-CCCTCGTTTTACTCATTCCCCCTCTCATTTTCCCAATCCAATTAGTTATA
-CCTATGGGGGGAGGTGACGGTGATGATTCTCGCCATTAAGACCCCCCCCC
-TCTCCTGGGCCGATTGAGATGGAAACAAAACAAAACTGTCAATTTGAATA
-AATTCGCAATTTGACGCGGGCGGCGCAGCGGGTTGCCGAGAAGGATATAA
-ACTGGGGAACTCTACTTAGCCCGTAAGGTGTCGGCTGCTACTATTTTATC
-ACATCTCAATTTTTACGGAATCCCGTAAGGCGTCGGCTGCTTCTCTGTTT
-TTGCATGTTTTTACAATTTCGGCCCGTCCGATGTCGGCTCCTTCCAATTG
-TTTTGCAAAACAATTTAAAATTTGAGCCAGCAAGGTGTCTGCTGCTCCGG
-CTAGATTTCCAATATTTAAATTTTGCACAATCCTGTAAGATGTCGGGTGC
-TTCTCAGTTTTTACAAAGTTTTTTCTCAAATACGGCCCGCGCAGTGTCGG
-CTGCCACCTCGTATGTTTCATCAAACTTGAACGATTCGAGCCCGTTAGCT
-GCCCGCTGCGTCTTTTTTTTTCTCAAAATTCCAGCCCGTAACTTTTCGGT
-TGCTGAAATAAACAAAATTTTTACGAAATTTTAACCCTTGAAGTGTCGGC
-TGCAAATTAAGATACCTACTCATTCAGATTCCCGTCTCTCCCTCTCCCTC
-TCTCTTCATTGGGGAGTCCTTCTCCCGAGAGAAAATGAATAAAACTGTCA
-ATTTGAATAAATGCACACAGCGGGAGATGTTTTTCTGTGAAGACTCCACC
-GTCTTCTTCGTCTTCTGCCTATTAAGCGATGATCCTTTCACTTAACTGTC
-GTTCCCTCCCCCTCTCCACATACCAATAAACCTTGCCAAAAGGTCGAGTA
-TGCTTTGCCCGCCATCGTGCCGGAGGTCTTTTTTCTAGACTATGATGTTT
-TTTTTTGGAAAAACATTTTTCTATGGATCGATGCACCATGATGCCGAGTT
-GCCGAGTTTTCAATTTAATCAATTTTGAGATTTCAATTTTAGTCCCTTGT
-ACATATTAATTTTTTTGGAATTAACATTAAAATTTGATAAACTGTAGCTA
-CAACTATTTATTTTTGTGCCAAATTATACTATCCAATTTGACTTGTCTCT
-TGATGCACCATGACTAACTTTCTAAGATCTCATATTTTGGCCTAAAATTA
-TTCTCAAATATTTAAATTTAAACTTTAATCCTATTTTTTTTAATTCCTCG
-GAAAAAACCCCGTTAACAGAATTCCCAATTTGGCCTCCAGGAGCTTTTGT
-CGATGCACCATGTTCAACATTTTTTCAAAATTTTGCTCATTTTGACCTGA
-AATTTTGTCATTTTTTTATGTTGCAGGGTTTTTTATTTTGTGATTTTTGC
-GATGAAAACCACATTATGTGGATGAAAAAAGTTTGGAATCTAGTTTTCCC
-GTTAGGCTGCCATATTGCTATGTAGTTGATGCACCATGTCCAGCTTTCTG
-AAATTTTACTTTTTACATTTTTTGCTCAGTTTGACTTTAAAATTTTGTTA
-GTTTGACCTTAAAATTTTGTCAGTTTGACATTAAAAATTTGTCAGTTTGA
-CCTTAAAATTTTGTCAGACATATAATTTTTTTGTGTTTTTTGGTTAAAAA
-ATTGAAGGTTTTTCGCGATATTTAACACATTACATGGAAAAATTCTTTTG
-ATCGAGTTTTCTAATTTGTTCGTGTAGCAAGTCGATGCACCATGTCCAAT
-TTTTTAAAATTTTACTTTTTTTAAATTATTTGCCCAGTTTGACCTTAAAA
-TTTTGTCAATTTTACCTTAAAATTTTGTCAGTTTTACCTTAAAATTTTGT
-CAGTTTGACCTTAAAATTTTGTCGGTTTTACCTTAAAATTTAATCAGACA
-TATAAACTTTTCTGTTTTTTGGGTTTAAAAATTGATTTTTTTTGCGTTAT
-TTAACACATTAAATGGCAAAAAATCATGCACCATGTCTAACTTTTTCCAA
-AAACACTTGATTTTTCCCTAAAAGTTTGTCAGAATTATACATTCCTTAAG
-TTCAAAACCGTACGGAAAAATTAGAACCCATGTCGATGCACCATAAGCTT
-TGGCTCGCTGAGCTTCGTTGCTGCTCCTGCATATCTCTTACCCCCTCTCG
-CCGCTCTCAGAACATTGACCAATTACTTGGGCGGAGCGCCGTTTTGAAGT
-CGATTGGCTGATGAGTGTCCCGCCCCGCCCCCCGTCCCGCAAATTTTCGG
-AGGAACTTTGCACTGCACACACACACACACAAATACACAAATACACGCCA
-ATTATTGTCGATTTTTCTTGAAAATTTCTTCATTATTGTATATTGACTTT
-TTTTGTCGTCCTCTAGTCTTCCGCCATCCTCGGCGTCTTCATTCGTTTCA
-TTATTTCATACACCTGTTACCACTTAATTCGCCTATTATCCTCCTCATTA
-CCTTCATTTTTCGGTCGGCGTTGACGTCGACATTGGCGCCCGAAATGAGA
-GGAATAGGGGGGGGGGGGGGGGGGTATAGACGACGGCGACTACGACAACC
-ATGATGACGATCATTTTCGTTCTATTCATCTAATCCTGCTAACCGTCGAT
-TTGTCCCCCTCCGTTTTTCAACTTACCAAAACTTTTCGGTTACCTTGGGA
-ATTGGTCCCCTTTTATAGGCGCGTAAATTGACAACATATTTTGCTCACTT
-TTTCGAAGTTTCACAATTTTTAGTTAGTCCGTTTTTTCAATCTGGCCGAG
-TTTTCAATTTTCCCCGGCCAGGGAATTCTAGTAGTATTCACATAATTTTT
-CTTATTTTTGGTTTTCTAGGCTACGATAAAACTCCCTATGCCCGGCAAAA
-CTTCTAGGTCCCCCATTTTACACCTGACTTCCTACCTATCTGAAATGCCT
-ACTTGCCTTTCCACCTGACTAAGATGCCTACCTACCTAAAACCTACCTAC
-CGAACTATAAGATGACTCCTTACCTACATAAGACTTGCCGATCTGAAATA
-CCTACCTACTAAGACATGCTACCTAGCCTACCTATCTAAGATACCTACTT
-ACATATAATGTACCGACACAAGACTTGCCTACCTACGCAAGGCATGATTT
-TTTAGACCTACCTACCTGTACTTAAGATTTAAGACCTAGATCTTATTACA
-TAAGAATTTTCATCTTAGATACCTACTCAAGATCCTACCAAAGATGCATG
-CCTACCTATGACCTACTTACTTAAGATACCTGCCTACCCAAACCATACTA
-CCTAGCGCTAGCGCCCACCTACCTAAGATACCTACTTACCTATAATTTAC
-CTACACAAGACTTGCCTACCTACGCAAGGCATGATTTCTTATTGTTAGAC
-CTACCTACCTAACTATAAGTACTTAAGATTTAAGACCTAGACGTTATTGC
-ATAAGACTTTTTGTCTTAGATACCTACTCAAGATCCTCTTACCCAAGATA
-TACCTAGATGAACTTCCGACCTAAGATGCCTACCTACCTAAGCCCTGTCT
-ACCTAAGACCTACCTATAAGAACTTCCTACCTAAAAACACCTACCTAAAA
-TAAGCCTTCAAGCTCAAAAATTTTTAGAGCATCTGCATGAGATAAGGCTG
-AAAAATATTAACGAATAAGTGGAGAGCGATTAAGTTCCTGCCCTCTTAAA
-GTTCGGAAGTAGGCGCCGCAAAACCCCATTACTATTGCTCATCGAGCCAT
-TTCCGGTACTCAGTACTTTTTCATCCCCCACTCACTTTTTTCTCTCTTCT
-CGATTTGATTTGCATTCTTTTTCCCCTCGAATTTCGAGCTGAGCCCGGTT
-GATTTCCCGCACTTTCTCAATTCTTTCCTTAAGCCACCCCACTTGACCAG
-GAGCAGTTCATTCAAACTCGCACTTAATCATATTATGACCCCCCCCCCCC
-ACCCCTCTTAATTTCCTAATCCCCCTCCCCCTCCTCCTCATAATGACCAA
-AAGACAATTGCAGGCGAACCATCTTCGTGAGGGAACCCGTCCGCACACGG
-CAATCTACCGTCTGTCGAGCACAAAGACGAGCGTTCAAGTGTTGTGTCGA
-CAGTGTCAGGAGGTGATTTCCAGTGGCGAATCGCTCCGCGAGCATCGACA
-CTTTCACGCCCTGCTTGCCGCCAAGCAACGCTTGTGGCGATGCAAGTTGT
-GTAGGCTGGAGTTCGACTCGGTTCTTCTTGCAGCTGGTGAGTCTTGATAG
-TTTTTTTTAGGAAGAAATTATATCTGTAAGTCCCCCAAATATAAGGCCCC
-CATGTCCATCTTAATGAAGCTTCTGACTTAATTTTTACTATAGATTTTGA
-ATTTTGTCTATCGGAAGAAAAATTAGGTTCACCATGATTTTTCGATTTTT
-TCGATGCACCATGATTTGTTGCTAGAATAGAAAACAATTCGTGGCCAAGT
-TTTTTAATTATTTCTTTTTGTCGGCCAAGTTGCAAAAGTCACCTTTTGTG
-TATGGATGCACCATGACCCTTTTCAGTGGATTTTGGCCCAAAAATCGTCA
-AAATTTTGAATTTTTAAAAATCAAACTCTAAATTACCTTTTTTTTTCAAA
-TTTTCTTAACAAATTGGAGCATTTTAGAAAGTTCCGATGCACCATGATTT
-TTGCTAGAATTGAAAAAAAAATTGTCGGGCAAGTTGCAAAACTCACATTT
-TATGTATCGATGCACCATGACCATTTTCGAAATTTTGCGGTATCTATTCA
-AATAGTGCACATAGCCGTAAAACATTGGTGGTGGCCTCGTTTTCTCATGC
-TTCGGCCACGAAAAAAAAAATTCTACAGTTTTTTGGATCGATGCACCATG
-ATTATTTTTCAGTGAAAGCCTGTTTTTGCTTAGCTCAAAGGCCGGCTTAA
-TGTTCCCACAAAACGTAATCCAAAAATTTAAATTTTACCGTCAAACTTTT
-AGCCTGGCGTACACTAAAAATTGTAAAGTTTCAATATATCAAAAATATTT
-CTGGCCTATAAAATTAAACCTGAAAGCTTAGAAATCCAAGATATTTTTTA
-AAAATTGATGTCCAATACATGGGTGTGCAGCAAATCTTAAAGTTTGCCGT
-GCTTAACAAACTCCGAAAAAGTGTGATATTTTTTTATGCTTTTTGGAGCA
-CCAAAACTACTGAATTCGAGCTTAGCAAACGGCAAATTCGGCATATTTGC
-CGCACACCCCTGGTCCACTAGTTAAGCAAAACCCACCGCTGAAAACTAAT
-CAATTGGTGTTTGAAACGGTGTGTGCTACTACTAGAATTTCGCTGTTCAA
-AATCTCTTTATTAAACACTTCTTTGTGTCTATTCTGCCCTTTCCTCCTCC
-CCGCGCAAAATCCACTTGTACCTCTAATTACGGTCAACAAGTTTGCGGGT
-TTAGTTTAGTGAATGAATTGTGAAATGAATGAATGAATGAATGGATAGGT
-AGGTGTGTATGTATGTGGAAAAGTGCGACACACACAACCAGCCGTCCACC
-ACCGCCACTACCACCAGCAGTAGCAACAGCCATCAAATATAATCCTTGCA
-TTTCATTATTTCATAGTGTCATAGATAGTAGCAGGCCCGAGGTCCGAAAG
-GCCTTGACAGCGGTTTATATTCATTTCATTTGACACCCCCCCCCCCCCCC
-CCCCCTCCTACTATTCTTCTTCTCTACCACATACATTCACATAGTCAGGC
-CATTCATGTTTTTCACACAATTTTGTTAATAAAGCCGCTCTGGCGCCACC
-TCTCAGTAGTCCTTCTTCTTCATCATCATCACTCCCTCTCCCTTACCAAT
-AACCAAAAACAGTCATTGATGCGTATCGGAATTATAATCGCGCATTTATT
-GTAGGACACATGACTTGCCACGAGCCGTCCACTTGGCCCAACGAATCACT
-TGGTGAGTCTCTTTACAGTGAATCTTGAAATTTGTGTTGTTTTGTTGTGA
-AATATTGTTAATCGTTTTTTTATTAGTATCTCCAATTAGGCCAAAACTAT
-AATCGTGAAAGAATAGTTTCTGCACATGGTGCATCGACCTGATATATCTC
-ACTTTTTTTGGGCTTCATCAAAAACTTGTTAGCTAATTATAGTTAAGCAT
-CACATCTATTGATATGTTCAATTTGAACAGAATATGGTGCATTGCATTGT
-ATTGCAACTGAAACAATTTTATTGGCGCATAACATTCAACTATGTAGTTT
-ATGTACATCGATCTTAATTACCGTATTTCCTCTATTAGTATTGCACCCGA
-CTAATTAACTTTGAAACGTTATATCTCGGTTCATATTGAAGATATCAATA
-TATAATTAACTATGAAATAATAGCAAAAGAACTAACAAATATTTTGTTAG
-TTGACCATTTTTGAATAGGACAAACGATTACGGAGATATAAGCTGTCAAA
-AGTGGACAATGGGGTGCAATACTAATTGTGTAAATACCTTATATCTCGGT
-TAGCTTTGGTTTTAACAAAAATTTTAAACTGACAAAATATAAGTCATCTA
-AATGTCTATAGTTTTGTAGTTAACAATTTTTTGATATCTTTAAAATGAAC
-TAGCGATTTTCGACATGGTGCATCAACCTCAGTTACCTAGTCTAACTTTG
-CTGGCTTATTTCTTAGTTTTAGTATTAACCGTTCATTTTAATATACTTTT
-ATAGATAGTTAACAATTTTTTGATACCTTCAAACTGAACCGGAGCGATTT
-TAGACATGGAGCTTTGATCCTATCTTGCCTTAATTTTCAAGCTTATCTTT
-TTGTTGTAAAAAAAATTTAGACATGGTGCATTGACCTGAACTACCTGATA
-TATCCTACTTGATATATCTTCAATTTTAGCAAGTTTTGGAAAAAAAAAAT
-TTTAATGAAATCGATTTTTTTTTTCAATTTTCAACCTTCCGGCCAAAATT
-TTCAATTGAGTTTTGACCTTTTTTTTTAACCCGGCAAAAATCTAAAAACT
-CCCAAGAACAATCTCCCACAAAAAACTAAAAACTTGTGAATCTAGATTAG
-TCAAAAATTTGCACCTTCTTCCCATGGGATGGCTCAATCGAACCCAGTTG
-ATGAATCGGCCTGTGGGCCGCGAGCAGTCGCCGCTCTAATTTGGAGCATT
-TGTATATATATAGCGAAGAATTTCACGTGACCAATGAAACCAATAGAAAT
-CCAATCATATTTTTGTTTTGTCTCTAAATCATCTCTTCCCTCTCTCTCTC
-TTGCCCCTCCTTAACCAATCAGAGACGCACACACCGCACCGCCCGTCCGT
-CATCGTCATCGAGTTCCGCAATTAGTCGTCTATTCTCTCCGTTTTTGATT
-GGAGATGGAGCGAAAATGAAAGAGAAAGAACGAGAGAGAGAGAGAGAGAT
-TAGCTCTTAGATTCATTCAACTAATCTTGAAATAACACACACACACACAT
-ACACAAATGAATTATCTTCATTTCAAATCATGGAAATCAGCAAATTCGCT
-AGAAATTTCATGGAAGGGGAAGCTTGAATTAGGAGCACTACTTGATACCG
-AGTTGGAATTGTAGTCTTTTAATATTTGAAGAAATATCACAATTTTTCAT
-TTTAAACTTCTAAAAATATGCAAGTTACTTGATGCATCATGCCTCTTTAG
-ATAACGTTTTTTTTAGGCTTAGGCTTAGGTTTAGGCTTAGACTTAAGCTT
-AGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAGACTTAGGCTTAAGCTTAT
-TCTTGAGCTTAGGCTTAAGCTTAGGCTTAAGCTTAGGCTTCGGCTTGGGC
-TTAGGCTTAGGCTTAGGCTTAGGCTTAAGCTTAGGATTAGGCTTAGGCTT
-AGGCTTAGACTTCTAGATACTTTCTCAAACCACCAAATTACTGTATATTC
-TCTATCATAGATACTACTTCCATTTGGCAGCTTATAACTCAAGTCTTTTG
-TTAGAGATATCACTAGCTTTAATTACAACATTATAGGTTAATAAATACAC
-CATATTTTGTTAGTTTAAATTTTTTGATTAACCTAACGAGAACCGAAATA
-TGAGTAGTCAAAGATTATCGATGCACCATGGTACTACACTTTACTTTGCC
-GGCTCATAACTCGGTTTATTTTCAGGATATCAAAAAGGTTTTTACTACAA
-ACCTATAGAGAAACATATAATAAAAATATTACTATTTTGCAAAATTTTGG
-TAAAACTAATAAGAATTGAGATATAGGCCGTTGAAGTTGCATGATGCAGT
-TCAAAGCCTACGGTTTTAGACTTATAGCTTTAAAAGGAGGTACCGTATTT
-CCTCTATTAGTATTGCACCCATTGTTCAACTGTGACATCTTATATCTCAG
-TTACTGTTTGTTCTAATCAGAAATTGTCAACTAACAAAATATTTCTTAGT
-TCTTTTTCTATCATTTCTTAGTTGACCATATATTGATACCTTTAAAATAA
-ACCGAGATAAAACGTTTCAAAGTTAAGTAGTCGGGTACAATACTGATGGA
-CGAAATACGGTATTGAATATTTTGATCTACGTAACTATTTGATCTAAAAT
-CTCGATATCATTTTAATTTCTGATCCATAGCTTTGCGTTCAATTATCCTG
-CCTAAAAAATCTCTAAAAATAACGTCTACGAGAGCGGGTGAAACAATAGG
-TGGTTAGATGTAAGTTGATACCCCTGAAGGGCATCCGGGATCCCCGCGCA
-AAAACAGTACAAACATGAGATGTACAATCCCCCATTTTTTTGTGGTCGCT
-CTAAGTTGAAATCGATGCAAAGACATTGTCAATATAGCCGTGACGCGACG
-GGCGGGTGGGCTGGCGCGCTCGATGAATCAAGATCGTTTTGGGAAGAGAG
-GGACTGAAAATATTAAAACAACATTTGCATTTTGTAATTGTTTGAATCAT
-CATCATCATCATCATCATCAATCATATCATAGAGGTGGCGAAACTTTTCC
-TGCTGGGAATGTGTCTCCTTTTTAGTACAGTCAATAAATGTGTCACTTTT
-GAACGGGGGAAAAGCTTTTCTGCTTTTCTTCGCTCTCCACCTCCTTCCCT
-CCTCGCTCATAAATTTCCATTTTTCTCTTTACAAACATTGATTGATTTCC
-TTATTCTATTGACTTTCTGATATTAAATTGATCATCTACTAAAAGGTATA
-TATATATATAAGGTATATCAACTCTTGGAGCCCATATCTTTAATGCTCAT
-CAAACTCCCAGTTAGGACTGGGAGTGAAGTACTGGGTGGTGGGATAAGAA
-AGTTAGGATGTGACGGGTTTCATGCTCATCTCGAGCTGCCAATCTTGCAC
-ATTAAGCAATTGGCTCATTGGCATGCTCTTGTCCTCTGGGCCTGCCGCGG
-AGCCATCTCCCGTTTGATATCTGCTCCCGGGGGACGTTCCCAACTTGGCC
-GGAGAGAGGCGCCGCGAGCAGCACAAGCTCAACCAAAACTTTTCTAATGT
-AATGGGCCGGAATTAGGGGAAGAACAAACGAAGGAGAGGGTGGGGTGGAT
-GAGGAAGAGAAAAGAGCACCACCACCAACTGATTTGATGGTTGGAGAGGA
-GCTCGTTTTGTTTTCTTGTCGTCGTAAGAAGAAGAAGAGAAGCGCGCTAG
-TTAGTGGTTAAACGAATCAAGACCCGAATGTGATAGATGTGCCGCCAATT
-TAGCCAGTAGGATTTTTGCTGATTTTGCACACATTCATTTTTCGCTTGCC
-TAGACATTACATCCCATCTTATTCCGCTTCATTCATTGTCGTGATTTTAA
-GATTTGGGGGACCTAGGAGCCTCTACAGTATTATTTAAATTTCACTTTTG
-TTTGGATTTTGAAAAGAGATGCGTCATACATATTCATTTTAAGGCACCTA
-TGTATACAGTTCAAAATTTTGGAACATTCCTGGAATAGCGATCTTAAAGC
-GGGAAATATAATGACATTATCTGACAATTTTTTCGAACACCTAAAAAACT
-TGAATAAAGCCAATTGAATCGTATCCCTAATGGTTTGCAAAGTTGGGCCA
-TGCTCTGAATAGCTTAGAGTTCCATCCTGACCTGGAGCTCGCCAGAAGCT
-GAACGCACTGAACTTCCAGTCAAGCCTCTTTTGAATAAGTCTAGTTGCAG
-ACTAGAAGCCTTAACTACCTGATGAGATTTTCACCCTTCTCTCATTAGTC
-TATTTCATTAAGCATGAACTTACACGAGAATTCCAATTACATTACCATGT
-AACATTACTTAAGATCCCATTTCCACTTAATTTGTGAAAATCGATACGGT
-TTTATAAGAAGTGTTTTGTCCTTTTGCCTATAGCCTAGAGCAAAAATACC
-CAAATTATTTGGCAGATCATGTCTCCGACAATATTCTGATCGATTAAGAA
-ACTTTTGCAAATCTGCTCGGTTTTTTAGTCTACATTCGCCCCCAGATAAC
-TGTTCTCGGCAAGTTGCCGATTTGCCGATTTGCCGGAAATTTTTCTTTTC
-GCCAACTTACTGATTTGCCGGAAATGTTTAAGGGATTTTTTTGAAGACGG
-AAAATTTTTTCATTAGATATGTTCATAGAATTAGCTTGCATTACAAAATA
-GGTGTATGAACATATTCAAAGGATGCGTACAATTTTGCCGATTGAAATTG
-AAATTCTGAAATTTCCAAAAATAAATGTGCAAAACCACAATTTGCCGTTT
-TCCGGCCAATTCGGCAAATCGGCAATTTTCTGGGTTGCAAATTTGCCGGA
-AATTTTCAATTCCCTTTATTTGCCGGGTTGCAAATTTGCCAGAAATTTTC
-AATTCCGCAAATTTGCCGTTTTTCCGGCCAATTCGGAAAATCGGCAATTT
-TCCGGGTTGCAAATTTGCCGGAAATTTTCAATTCCCTTTATTTGCCGGGT
-TGCAAATTTGCCAGAAATTTTCAATTCCGGCAATTTGTCAGTTTGCCATA
-AATTTTCAATTCCGGCAATTTGTCGATTTACCGGAAAAAATCGTTTGCAC
-CCACCCTTGATGTGAACGCTAGCACTACCTCCTAGTATTAAGGCTCCAGC
-TAATTTCTATATCATGGCTCCCAACTATACGTTCCTCCCTCCTCCCCCTT
-CCCAATTTCGAATGGGCGCCAATTATTGCTCAATTCCCATCAGATTGGGG
-GGGGGGGGGGGGGGGGCATTCGTACAGTGTCAACACGAATAATAATTATG
-AGCCCTCTTCTATGCCCAAAGCGCGGCGTCTTCTTCTTCACCCCTCTAGG
-AAGTTCTCATAATTAGCATTTTGTAAGACTCGGTGTCCCCCTTTCAAGTA
-TCTCTGGATGATTCCCCCCTCTCGCACACACTCTTCCCATTTTTTTTTCA
-CAATAATCATAATCATCAAGTTGGACACCAAAAAAGCCATAAATTCGATT
-CCGGTCGAATCGAGAGAATTGGAAGAGAGAGAGAGAGAGAGAGAGAAAGA
-GGAAATGAGACAGAGGGGTGAGAGATGGAAAACGAACAAGTGTGATGGTC
-GTCCCCCCCCCCCCCCCCCACGGGGCCGCTCCTCATTCCTATATTTATTT
-ACAGCTCTCTCTCTCTTTTTCTCTTCAATTTCCATCTCTCTCTCCTCATC
-TACAGTAATCGGGGAGGGGCTAGTGATAAGCCTCTCCCCGCCCCCCCCCC
-CCCGGCGGTTAGGTGTCAGAAATTAATCATAGAGGCCACGCCTCTAATGT
-TTTCGGAGCATCATCCTTAATTCTTTAATTCATTAACCTTAATTCATTAG
-TCTTACACTGAATTTCATAACTAAACTTGTTGAAAAAACTTCTCAAAAAA
-AAAAGTTTTGGCGGCTTAAGAAATGGCCTAAAATTAGTTCGACTTTTCAA
-GCGGCTGGAAACTAACTTTTTTTGAAATCCCCCCTAATTATGGGTCTACA
-ACGTAAATAAAAAAATTTGGTGACCAAATTTATTTAGGCCAAATCTGGTG
-TTCAAATTTTTTAGGCCAAATCTGGTGACTAAATTTTTTAGGGCCCAATA
-TGGTGAAAAAATTTTTTAAGGCCAAATCTGGTAACCACAATTTTTTAAGG
-CCAAACTTTTTAAAGACCAAATTTTTAGAGCCAAATCTGGTGACCAAATG
-TTTTTAGGGCCGAATCTAATGACCAAATTTTTTTAAGGCCAGACCTTTTA
-AAGCCCTAATTTTTTAGGGCCAAATCTGGTGACCAAATTTTTTAGGCCAA
-GTCTTGTGATCAATTTTTTAGGCCAAATCTGATGACCAAATTTTTTAGGC
-CAAATCTAATGACCAAATTTATTTAGGGGCCAAATCTGGTGACCAAATGT
-TTTTAGGGCCAAATCTGGTGACCAAAATTTTTTAAGGCCAAATCTAGTTA
-CCAAATTTTTTAAGGCCAAATCTGGACACCGAATTTTTTAGGCCAAGTCT
-TGTGATCAAATTTTTTTAAAAATTTTTTTCAAATCTGGTGACCAATGTTT
-TTTTAGGGCCAAATTTGGTGGCAAAATTTTTAAGGCCAAACTTTTAGGAC
-AAATCTGGTGACCAAATTTTTAAGGCCAGAATCCACAACTTTTTTTTGAG
-AAATTTTGAAGAAGTTTCTAATTCACCTAATTCATTACTCTTTTTGAATT
-TAATCTTCGATATTCCAGATTTCAAAACGATGGAGGATGCGGCGTACGCG
-TGTGCTGGCTGCGAATTCACCACAAGTGAGTTTTTTTTGTTGTTTCCTTA
-TCAGCATCAGCTCTATGCCTTCTCCCCACCCCACCCCGCTCCTCCTGTAA
-CCTTCAATTGCCATTCATTTCACACAGTAATAGTACCACACAACACCCTT
-CCATGCCTTCAATTTGACTCATTAATAGCCCTTTTCACCATGTCTTTTTT
-CCCCCTCTTTCTCTCTAATACTCAACCTTTACCTACCTACCCGCAATTTA
-ATTGGCAACTAATTCGGATACATTCGGACGGCTCAAACGATGCGCGTCCG
-TCGTCGGGTGCCCGAGACTGGGACCGGTTTTCAGAATGTCAGTGTATGTG
-TGTGTGTGTCTACCGGCTGGCAGGCAGCCACACCACTGCGATTCGTTAAT
-TTATTGTGAGATGATGACTGTACATTATTTTGAGTGCTGCTGGTGCTGGT
-GGTGTGCATCATATAATTATAGCCTAGTTGATAGAGATATATCGACACAC
-ACACACATACACATTTACTTTCAATTGCTTCTACCCAATCTTTTTTCTTC
-CATTCTCCAATTCCTCTCCTTGCTCCCATTTCGCCCTTTGATATTCACCG
-CGTTTCGCGTTTCGCACTAATTTCGCGCCCGGACCGGTGTGCTCGGCGCG
-GCACGTCTTTCATCTTTTTGCCTCAATTTCATTATGATAATAATAATCAT
-AATAATTATGCGAGACACGGCAAAGACGCGCTCAAGAAACTGATAAGTGT
-GTATAGGTCGGGTCCTTTTGAGAGAGAGAGAGAGCGAGGTGTGATAAGCG
-CGTCTAATGAGCATGGGCAATCATAACATTCCTATCAGCATATCAGCATT
-AAAACATTTTTTTCAGAAGACGTGTCGGACTTTGAAGAGCACGCAAAAGG
-ACACGAAGAGGAGGCGGGAGCCTCTTCACAGAAGGCGTGTGCGCTGTGCC
-TTGAGCCCACCGACGACCTCGAAAAGCACCTTGTCGAGCAGCATCGCATC
-GCCGAGAGCGCCATCGAAAAGTTCCTGCTTACTGAGAGAACAGCCAAGTG
-AGTGTTTTTTTTTGTCTTCAACTCAAATATCTAGTAGTAAGTCTTATACT
-TGGCTTATATTTCAGCGGTTTCAAAATATTTTTGATAGCTTTAAAAACCA
-TAGAATAACAATTAATTTGACAACAATTTTGTCGTTTGAATTTTTTGACA
-AAAATTTTGTCGTTTGAATTTTTAAAATATGATCAAAGACAACCGAGATA
-TAAACGGTCAAAGTCCAGTGAGAGGGGCCATACTAATAGGGATTATACGG
-TAGGTAACGAAATTTTGATAAGACTTATAAGGACAAAGATAATGGAGCTA
-GAAAGTTTAAACTAGTCCAATTTGAACAATAAAAATATATATAACGTACT
-TTTTAGTATAAATATTTTAAAAGTAGAGTAATCTGAGATACAGTAAATTT
-TTAACAATTTCTAGTCGATGCACCATGTGCAAAAACTAGTCCAGTCCTAA
-AATTAAATAGCACGTACTTTTTAGTATAGATATTTCAAAAGTTAAGCCAT
-CTGATATACAGTGAATTTTACCAATTCCTAGTCGATGCACCATGTGCCCA
-CTTAACTTTCACGGCTCACTTCCCGGCTAATTTCAAACATTTCAAAATAT
-TTTCAACTATTCAACTATAGAGGGGTTTTTAATAAACATTTTCTCAGTTG
-ACGACTTTTTTATAGAATCAAAGACTACCTAGATATAGCTAGTTAAAGTC
-GAGATGCAAGATTTTTCGGAAAAATCACGTGGTGTTTTCGGTTTGATCTA
-CGTAGATCAACGAAAAATGCGGGAGAAGAGACGCAGAGTTATCAACTGAT
-TTCGTATGGTTAAGAACGTGCTGACGATGTCACATATTTTTGAACAAAAA
-ATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGGCAGCCTCGCACCAC
-GTGAAAAATTAGTTTTTGAGGCTTTTCTAGTCTAGAACTAAAGTTTTTTT
-TTTGATTGGCCTTGTTTTTTCTAGTCTTAAACACCAGGTAGATCAAAACA
-AATTTTTTTTCAGAGTTTCGATTTTTATGAATTTAAAACTTTCAAATTGT
-CGCACTTCCTGTCCCTTTCAACCCCAAAAACGTTACGATTTTGTGCTATC
-ATAATCATTAAACCATGCTTGCTTGTGTCAAGTTGCACAGGGTGCGCCGG
-GGGGGGAATTGGCATTACTGTAAATTTCCTGCGTCTCCATCCTTGCCCCC
-AGTGTCCCCATCGGCAATTAGAGAGTACGATCCGATTTTGCATATTTTAT
-TCACGTCGCCTCTTGTTTACTCGCTCTAAATTTCAATCCGTCGCCAACCC
-CCCCCCCCTGCCTGCCTCTTCCATTCATCATGAGTATTAGTGTATTGATT
-AATTTTCGAATTCACGAATGAATTCATTGCTGGCGCCCTGCTACTAGTAA
-TCAGTGAGGTCATAGCGTTGTCCTTTCGATAGGGCTAATTAAATGTTTCT
-CTAGGAGCGGGAGGATAGATTTGAAATCAGGTGGGCGTCGGTTTGATCTA
-CGTAGATCTACGAAAATCGCGGGAATTTAGACGCAGACTTCTCAACTGAT
-TTTGCATGGTTAAAAACGTGCTGACGTCATATTTTTAGGGGAAAATATCC
-CGCACTTTTTGTAGATCAAACCGTAATGGGACAGCCTGACACCATGTGCT
-CAGTTACAATTGGAGGGTTTTGTCGGAAAAAAATCAATTTTTTAAACTGA
-CAACACATTTTGCTCATTCTCCAAAACTGAGCCAAATGTGTTGTCAAACT
-TTTCTTGAAATTTTTTTGAATCGAAATTATGTTGAGGTGAATTTTCAAAT
-TTCAAAAAATGCCCCATTTCTATCAATTTGTCTTCACCTATGTTTTCGAA
-TAAGGGCGAGGCGAGAGGCAGGCGGAGGTCGCCTTAAGATCATAAGATAG
-CCTTATGTGATGACGAAAAATGCCAAAAAATGTATTTTTATATAGTTTCC
-CCGTGTGTAGAAAAATGTAAAAAGAGCATGCATTTTGTGCATTTTTTGAC
-ATTTTTCTGCATTTTTTTTTGACATTTTTTTTTCATTTTTCCACACAGAT
-GAATAGCGGAAAAACGGAAAAAAATACATTTTTGCATTTTTCATGATCAC
-ATGATCAACCCCATAAGGTTTTTTAAGGCATAATATTGATATTTTTTATT
-AGTCTACTTTGCATAATGCCTACTATTGAAGGCAAATCAAATCGACATCA
-CTTTTTGCTCATTTTCAAAACTGAGAGGCACGGCTTCTATGTTGACTACT
-AAACCAGTAATAACACTTATAAAATGTTTGGAAAACACTCATACACATTG
-CCACGTCATTTGGATGGAAGGGACCCCATTTGTTGAATCATAATTGATTG
-TTAAACTATCATCACTCTCCCCCCGCCCTCCTCATTGGACCCCACGGCTC
-CAAACTGTCTCCAATTTGCTCCCCGTCCTCTTCTTATCACCTTGACGCGT
-AATTGAATTTTTGCGGATTTCTTCCTCCCCACCGCTTCCTTTGCTCCTTG
-GGGGAAAAGTATGGAGAGTGTTTATGTGTGTGATTGAATTGAAGAAGGTG
-GCTGACTCATTCTTTCATTTTCCTCGCTTTCTTTGAAAGAACAACTTGAC
-AGTTTCCCCCCCCCCCCCCCATCTTATAATAATAATTACTTGCAGAGAAG
-CGTCGTGTTCATCGTCGTCGGAGCCGAGCTCAGAATTCGCGCATCGCTGC
-TCGAGGTGCTCGATGGCGTTCCGAAGCGAGTCGCAGCTGCAGACGCATTC
-CCTTCAGCACGTGTTCAACACGTTCCACAAGTGCCCCACGTGTGGCGATT
-CGTTTGATGAGAATACTATTGTGGTGAGTGAATTCACAACACTTTTGGCT
-CACAGTCACGCTTGATCTACGTGTTTTTAGACAATTTTGAGTCTACACGT
-GGTGTCAAAGTGTCTCATTTCGGCTTGATCTGCGTTGATCTACAGAAAAA
-TGCGGGAGAAGAGTTTTGGGCAAAAAATTCCCGCATTTTTTGTAGATCAA
-ACCGTAATGGGACAGCCTGGCACCACGTGCTCAGTTAAAGTAAGAGGGTT
-TTGTCACTAGATTTATTTTTTGTAAACTGACAACACATTTTGCTCATTCT
-CCAAAACTGAGCTAAAAGGGTTGTCAAACTTTTTTTGAAATTTTTTTAAA
-CGAAATTAGTTTTGCTAGTTTTCCTAAAAGGAGCAAAAAGTGTTGTCCAA
-TTTTTATAAGAAGGTTTTTGTCGCCTAATCGATTTTTGTAAACTGACAAC
-CCTTTTCGCTCTTTTTTCAAAATTAATTTTTTTCTTTTGGCATTAATCCC
-ATTTTTTGTAAATTAACAAAAAAATTTCAAAAAATCTTCAAGTATTTCTA
-CAGGGTGGCCTAGATTCTCTATAGGGTGGCCTACATTTTTACACTGGTTG
-TCTAGATTCTTAAACAGGGTGGCCTCGATTCTGTACAGGGTGGCCTAGAT
-TTTCTACACGGTGGTCTAGATTTTCACTGGTGGCCTAGATTCTCACACTA
-GGTGGCCTAGATTTTTCCACTAATAGCCTAGATTCTTTACAGGGTGTCCT
-AGATTTTCACACTGGTGTCCTAGATTCTACACAGGGTGACCTAGATTTTT
-TACACTGGTGGCCTAGATTCTCTACAGGGTGGCCTAAATTCCTTATAGGA
-TGACCTAGATTCTTAAACAGGATGACCTAGATCTTGACACTAGTGGCCTT
-GATTTTTTACAGGGTGGCCTAGATTTTCTACAATGGTCTAGATTTTTTGC
-AGGGTGGCTTGGATTCTTAAACAAGGTGGCCTAGATTTTTCACAGGGTGG
-CCTAGATTTTATACAGGGTGGTCTAGATTTTTACACTGGTGGCCTAGATT
-CTTTACAGGTTGGCCTAGATTTTCTATAGGATGGCCTAGATTCTTAAACA
-GGGTGGCCTAGATTCTTTACAGGGTAGCCTAGATTCTTCACAGGGTAGCC
-TAGATTTTTACACTGGTGGCCTAGATTTTCTAAAGGGTGGTCTAGATTTT
-TGCACTGGTGGCCTAGATTCTTAAACAGGCTGGCCTAAATTCCTTAGGGG
-ATGCCCTAAATTCTTAAACAGGATGACCTAGATTTTATACAGGATGGCCT
-AGAACTACTTTTTGTAAATCGACAGCACTTTTTGCTCGTTTTCCAAATCG
-TTTTTTTTTCAGACCCATATGTTGGAGCACACCAAAGAAGAATGCGAAAT
-GTGCTCTGAAACATTTGCCACAAAAGAGGCATTCCTCTCCCACCTGAACT
-CAGCCCGACACCTACAACAGGCAAAGAAGCAGCTGGAAAACTCACTGGTC
-GACTTAAACTCTCAGGTGAGCCGCCGCCGTGCCTCCTGCCGCCTGGCTAC
-CGTAATCACCGTACCCATTATTTAATTGATTTGCTTTTAGCCACGCCGCT
-GCTGCTCGGAGCGCAGAGGTGACAGAAAAAGCCGACAAAAAACAACATTA
-AAATTATTACACTTTTTTATGATTGAATGCGAGAGAGATGTATGTGTGTG
-GAGAGATGGAGAGGCGCATGAAATGGTGTTCGGGTTCCATAGCAAGCTCA
-TTGAGCACAATGATTTTTTTTTAAATATATTTTATTGGAAATGACAGAAG
-CTGAAGCTTGAAAGGAACGTCCAGTTTTAAATTAAAGTATTGATTTAGCA
-CGTAGTTTCAGCATGTCCCATCACGGTTTGATCTACAAAAAATGCGGGAA
-TTTTCTTCCCAAAAAATTTGACGTCAGAACGTTCTTAACCATGCGAAATA
-AATTGAGAACTCTGCGTCTCAACTCCCGCATTTTTTGTAGATCTACGTAG
-ATCAAACCGAAATGGGACACTTTGACACCATGTGATATTTAAAGGGTCTA
-GAAAGAACTTAAAATAGCCTAGCCAAGAAATGGGCGGAGCTTTGGTAGGA
-ATTTTCATAAGTCGAGGACTCCGCCCATTTCTTGGCCAATTTGGGTTTTT
-GGCCTTCAATTTTTAGTGTTCACTAATTTCCAATAAGTTTAGGATTGAAA
-AAGTTTTTGAGGTGAAAATTGATCCTAGCATAGGCTCCGCCCATTTCTTG
-GTTTTTTTTTTGTTTTTTTTTCTTTTAAACTAAAATTCCACTGAACTTGT
-CTAATTTCAGTTTCCAAAAATTTAACGAAAAAATTCGAAATGCCAAGAAA
-GGGGCGGAGCCTAAGCGAAGCCTATTTTTCGATGAAATTTGGCCAAGTTG
-CGATGTTTTTGAATTTCATATTTTTGAATCAAGTTTTGAAATAAAAAGTA
-ATATAAAATTGGAAAATAGGCTCCGCCCATTTATTGGCTTTGTTGGATTT
-TTTACTGCATAGATCACATTTTTGCATCCGAAAATTTATCGGAAAGGAAT
-TTTTTTTCCCAATTTTTTTCCGTAAACTGTATCATCAAATTCTTTTGAGA
-TTCAAAATATCCAACATAAGCACGGGGTTCTGGCCTTCCTCATTGAATTT
-TTCGCGCTCCATTGACAATCGCCTGCCGGACAACGCGTGGGAAAGTCGTG
-TACTCCACGCGGACAAATACATTCAGTTTTACGCGCCGTAAATCTACCCC
-AGATATGGCCGAGCCAAAATGGCCTAGTTCGGCAAACTCTTTCATTTCAA
-TTTATGAGGGAAGCCAGAACTCCGTACATAGGCGCAATAAAAGGTGAAAT
-AGGCTCCGCCCATATCTTGGATCGGTTCCAATAATGTATCCAAATTGACA
-TGTGTTAGTTACACTTGTTCCTAATCCAAAATTCTATCCGAATTTCAATT
-TCCCAAAGTCAAAAAGTCAACAAGTTCTGTTCTTATATGTGTAAGGCGCG
-CGCGAGCGCGATCGTTTGTCTCTAGTATTTGCTCATCTCTCTCTCTCTCA
-ATTACCGTACCCATTATCATTCCGCCCATGGATGATGATGATGATGAAAA
-TGAGCGGTGGGCCCCCTCTTCCCCTGCCTCTTTTCGCGCATTCATCATGT
-TTGTACAAAAGGCGGCGGTTTGAGAAAAGAAGACAGTGAGAGGGAGGGAG
-AGAGAGAGGTGATGAAGGTAGTAAACGTGTGTCGACAAACACATATAGAG
-AACGATTCGTGTGAAATAGATGAGGGCAAATAGGACGAATTTATTTAAGA
-GAAGAATAAGATGCTTTGGCCCAGATGAGGGGGGGGGGGGGGTATCATGA
-AGGTGTGATGACGAACCATATTCCTTCAATGTTTGTTGCTCGCTTAACCG
-CCGTCGCCGCAATTTAAATTGTTTCGACTGGGTGATCAGACAAATAAGAA
-GACGTAGACGGTTTTTCTTGGGGGGGACGTTCAGCTTTGATTCCTTTCAA
-ATAATCGATGCGGCCTAGCTTTCTGATCTCCAGAAACCGCGGGCCTTCTT
-TGCTAAATTTTAAGCGATTTTACTTCCTCCCCCCCCCACTTTGATCTACT
-TTAACAGCTTATATCTCGGTTGTCTTTAGCTTCATCAAAAAGTTATCAAC
-TAACAAAGTGCGTGCCAAATATACTTCTACAATTCGGTAGTTAGTATTTT
-TTGGATAAAAGTTAAGACAACCGAGATATAAGCTGTTGAAGTAAATTTCT
-AGTTTGACTTACTCCCCCAATTTTGATCTACTTTTACAGCTTATATCTCG
-GTTGTTTTTGGTAACAGCAAAAAGTTGCCAACTAACATATTACGTGCCAA
-ATATTTTTCTAAAATTTGGTAGTTGAAAATTTTTGAATAAAAGTTAAGAC
-AACCGAGATATAAGCTGTTGAAGTAGATTTCTAGTTTGACTTACTCCCCA
-AATTTCGATCTACTTTGACAGCTTATATCTCGGTTATTTTTGGCAATATT
-AAAAATTTGTCAACTAACAAATTACGACCCAAATATTTATCTACAATTTG
-GTAGTTGAACATTTATGTTAAAAGTTAATACAGCCGAGATATAAGCTGTT
-GAAGTAAAGCAGTGGTGGTGCTTAGCTCGACCTATATTTTTGAATTGCAT
-AACAGTTATAACTAACTTATTTTATGTGAAACCCTATTCTAGCTAGTTGA
-CTTACAAAATCTCCAGAAACTTTTGCCTGCCTACCACCTTTAGCAGCATA
-AGCGCCTATAGGCACACCTACTGCCTACACCTATGCCACCTACTGTACAC
-CTACTGCCCATACGCCTACTGCCTTTTGCCTACTTTCTACATAACTTTGA
-ACTGCCCGTTTCTAACCAATAATCTTTTACAGGACGTCGAAAAGCAGCGT
-ATTTATGTGTGCAACGTCTGCAAACAATCCTATCCACAAGCGGCTAATCT
-CGACGTGCACATGAGGTCAATGACACATCAGAGCCGGATGAGCCGGCTGT
-CCGAACTTGTGGCAACCGGGGAGCTTAATGGGGAGAAGGCCGTGTTTGAG
-CAACCAGGAATACCGGCACCGACGATAAACAGCTTCATTGAGACGGTAGG
-TGAGGGGTTTGAGCAGGCATAATCCTGAAAATCATCTGTTTGGTTTCTGT
-GAAAAACTTTTGTGCGGAAAATAGTTTATTTATAGTTCAATTTGAAAAAA
-ACTGGTTTCCGATTTTCAATTTTCAATTTTCAATGTTCGATTCTCGATTA
-ATAAAATTTCCAATTTCCAATTTCCAGACAACCAACCAATCCTCACTGAA
-CGACCTGATGTCACTGCTCACACGAAGCGAGTCGGATGAGATTCGAGAAG
-AAGTAAACGGCCTTCAAGTCATGACACAGATCAAAGTCTACGGTGAATCC
-AAGATCACTAGCCTAGTCCCAGAGTTGGCCGGGAAAATCGATAACATCGC
-GCTCTTCGATGACTCCCGTGCGGCAGAGGTGTCGAAGATCGATTGCTCGG
-CTTGTGGGCAGCAGATCTCAGGGATCCTTGCTTTGAACCTCCATTATGAA
-GAGTCCCACTCATCGAAGATCCCGAGTGACGTGTTAAGAAAGTTCGGAGA
-GCGGTTACTTGCCGCATTAGAGGACGGGTTGAGCAGAGAGAATTCCGTGA
-AGAACGGATCGCAAAGCCCTCTGAGCAATGACGATGAGCCCATGGAGAAG
-AAGATGCGGCTGGAGAATATGCTTCCTGAAATGGACAAGAACGCGGCAGC
-GTCGCAATTCGCAATGTTCCAACAAATGATGAACTGCTTCCCGTTCATGG
-CACCACCAGGCACGTCTAGTGGCAACTTTGGCTTCTCGCCAGAAATGATC
-AATCAGCTCATGAATCCTGCGGCGGCGGCGGCGGCGGCGACTGCAGCAGC
-AGCAGCCCACGCTGCCAACAACTCGCCGGCGAAGAGAGCAAGAACACGGA
-TCACTGATGATCAGCTCAAAGTTTTACGGTAAGTCGTCTTGTGTGTGATT
-ACTGTAAGCTACGGCGAACAGGAGAGACCCGAGGGGGGCGGTGGAAAATG
-AATTGCAAACAATAGGTGGGAAATGGTCGGCGCCGTGATCAAAATGAATG
-AGAAATGAGAATGAAGAACAAACATTGTGTGTGAGTGTGTGTGTGTGAGA
-CGAGACGAAAATCAATCAATTTCTGGAAAAAACAACACATATATTTTCCC
-GGCGAACTTTCTGTTTGAGGGACCGTACGGAACAGGACCCCCCTGAAAAA
-AAAAATCCGGAAAATCCTAAGCCTAAATAGCGAACGCTCGCCACTGACGC
-CAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCCAGCCCAAGCCTAA
-ACAGGAACCCCCTGAAAAATCAAAAAATCCGGAAAATCCTAAGCCTAAAT
-AGCGAACGCTCGCCACTGACGCCAAGCCTAAGTCTAAGCCTAAGCCTAAG
-CCTAAGCCCAGCCCAAGCCTAAACAGGAACCCCCTGAAAAATCAAAAAAT
-CCGGAAAATCCTAAGCCTAAATAGCGAACGCTCGCCACTGACGCCAAGCC
-TAAGCCTAAGCCTAAGCCTTGGCCTAAGCCCAGCCCAAACCTAAGCCCAA
-GCCTAAGCCTTTCACCTTCCTAATTTTCAGGCAGGCCCTAAAAACCGCGC
-CTGCCTACCATGGAAGCCCTAATCTGTGCGCTTTAGATTCTGAACCCTTA
-AATATGTTGCACGGCCGGGCAAAGGGCACATCAGTGTAAACGCGCTCTAC
-TGATAATTCGAGTTTAGCCAGGTTTGGGCGCGTTTCAAGGAAAAAAACTT
-TGGCTCAAAAAATTGTGAATTTATTTTCGAACATTTTTATATGCATCACA
-AAAATGTTAGACCACCCGTTTTTGAGAAAAACGCGCCCAAACGTCCAGGT
-ATACGGTAGACAAATTGCGTACAGGTACCACTGGGGGGTCGTGTTTGGGC
-TTTAGTTTAGCTAAGGGAATCTGTAGCGGCCCAACGGCCTAACTGCAAGC
-CTCAGCTTATTCGCCATAGGCTTGTCTGCCGTATTTCAAGCCGATTCCAA
-CAAAAAACTTCCAGCCAATACTTCAACATCAACAACTCGCCGTCAGAAGC
-GCAAATCAAGGAGATGTCACAAAAAGCGAGCCTTCCGGAGAAAGTCATCA
-AACACTGGTTCCGCAACACACTTTTCAAGGTTTGTTTATTTATTTTACAA
-AACTATTCATATTGTTATTAGGCTCGGAAATGAGCGAGGTGAGAACATGA
-GTGTGGTAATTAGTCATCGGATGAATACCCACACAAGAGGGAGAGCAAAC
-AAGAGAGCAATTGAGACGAGGGAGGGAGAGAGGGAGAAAATAAGAAAATG
-TTAATGTCAGTTGGGTGCCAGGCGCTCGGCCAGGACCACAGGCCGGGAAC
-CATTTAGTTTTGATTACGATTTCCGTCGTGACTCATGATGGGAATTGATA
-TTTGTGCCTGTGGTGATAGAATAGTTAGAGCAACTATCAGGAAGGGGACA
-AGTCGCAGTGCGAGACTATTAGAACCTGCAAGGTTTATTCTGATAGATTT
-GGGACTAATAAGGACTAATTTGGTAGAGACTAATTGGCTCTCTTGATATA
-TACCAGCTTAATAATTTCTACAAAAAAAACTGTAAGAACGCTTCGAGATT
-CGAGCTTCGGGAAAGCTTAAAGGATGGGTACCGAAAAATTTTTTTTCCCT
-GATTCCGAATATCGATGTGGAAAAATTCAAAAAAAATTCCCTGATTTTAT
-ATTTGAGCTTGAAATCACGATTTTCATTTGTGCCCACCTGGTGTCAGAAT
-GTCTCATTTTGGATTGATCTACGTTGATCTACAAAAAATGCGGGAGAAGA
-GACGCAGAGTTCTCAACTGATTTTGCATGGTTAAGAACGTGCTGACGTCA
-CACTTTTTTGGGCAAAAGCAAAAAATTCCCGCATTTTTTGTAGATCAGAC
-TGTAATGAGACAGCCAGGCACCATGTGTGTGCCCCGGTTCAATTTTCAAT
-TTTTTAAACCAGTTTCTTTTTTTTTAGTCGATAGGTTTTTTTCTGAAAAA
-TATTTTTTTTGCCAAAAATGAATGTAACTGGCTAAAATAAACTAAAAATA
-AAACGATGCAAGCGCGCTCAAATGCGAATTTATTTGGGCGCGAATTTGAA
-AAAAGTGATGCGGGCACAAATGAAAATCGGCGATTTTAAGCCTAAATATA
-AAATCAGGGAAATTTTTTTGAATTTTTTCACATTGATATTCGTAATCAGG
-GGAGAATTTAAAGCCAATTAAAAATATTTTCCAGATTTCGGTGCCCCACC
-CTTAATGAGATAAAAGAGCAAAAAAGGTGTTTTGTAACTTTTTAAGTTTT
-TTCTTTTTCAGGAACGCCAACGCGACAAGGATTCCCCGTACAACTTCAGC
-ATCCCTCCCCAAATGGGAATCGACTTGGACATCTACGAAAAGACCGGCGA
-GACAAAAGTACTGTCGCTTAGCAATGAAGCACCAAAGTCTGAGTTGAGCT
-CTGCGCGCGCCACACCGACAATTCCGACTCCGATACCGCTCATCGTTGAA
-GAGAAGAAACCGGAGCCAAAGAGCCAGACACCATCGTCTTCTTCCTCTCA
-GCTCAACCTGCAGGCTATGTTATCTCAGATGCAGGGAAGTTTTTTCGACG
-CGTCAAACTTCATGTCAGCATCAGTGAATCCGATGACACCGAGCACTCCT
-TCCTGCAACACGTCGTCCAGTGGACGACGAGCCAATCGCACGAGATTCAC
-AGATTTCCAGCTGAGAACTCTACAGCAATTTTTCGACAAGCAAGCCTACC
-CGAAGGATGATGATCTTGAAGCGCTGAGCAAGAAGCTTCAGCTGAGTCCA
-CGTGTGATTGTCGTCTGGTTCCAGAATGCACGGCAGAAGGCCAGAAAGAT
-CTATGAGAATCAGCCGAATCACGAGAGTTCCGATCGATTTGTGAGAACGC
-CGGGATCGAACTTTCAGTGCAAAAGGTTGGTTTTAGTGTTGGAAATTAAC
-ATTTAAATTTAAATTTTCCTAAATTCCAGGTGCAGCCAAGTATTCCAACG
-CTACTATGAACTCATCCAACATCAACAGAAAAAGTGCTACAAAGACGATG
-TAGCAGCCCTGGCAAGTGACAACAAGAGTGTCGAAGAATCACTGACGGAA
-GAAGAGAAATCCCAGCTTCTGGCTCAACAACAGGTCGCCCAACTAGCCAG
-CACTCTGGAGCTCCCAAAGTTCCAGCCGGCAGAGCTTTTGAAAATGATCG
-GAGCTAATTCGGTGACTCCATCCTCGTCGGCTGCAAGTCAGAAGTCTAGC
-AACGACGTTCTGCTGAAGATGTGTGAATCGATTGTTGGTGGGAGCACACC
-TAGTACATCATCGTTCCACAAACTTTGTATATTCTGCGCTCAAGACTTCA
-AGGATCGGAGTGCGATGAGTGAGCACATGGCTCAGAAGCATCCCCAGCAT
-ATGCTTCTTCCAAACTTCGATCTCGACATGATGCCAGACGCTGGTGGTGC
-AGAGCTTCTCATGGATCTTAAGGACTCTGCGTTGGATCTTTCGGGCTCTT
-CAGTCGACTACCGGGATTCTATCTCAACATCTCCATCTCGATCCGAAGAT
-GATGTTCTCACAGAGGCTCTGGATGATTCTGCATTTGCCGCGTTCGGACT
-ACAGCTTGCAAATTCCACAAGCGGCTCGGAATGCAGATCTCCGGCGAGCA
-ACAAGAGATTCCGAACTCATCTCACACCGATGCAAGTGCAAATGATGAAG
-AGCGTGTTCAACGAGTACAAGACCCCATCCATGGCAGAATGTGAGCTTCT
-CGGCAAGGAAGTCGGCCTTCACAAGCGTGTCGTTCAAGTCTGGTTTCAAA
-ATGCGCGAGCCAAAGAGCGAAAGACGCGCGGTGCAGTTGACGAGGACTCT
-CGATCCGGAGAACTTCACTGTGAAATTTGTGATAAGACGTTCGCGACGAG
-GCTTTCGCTGCAAGACCATCTGTTTGCCGAGCAGCACATTGAATTTTTAA
-GGAATAATCTGAAACGGGAAGGGGTCTCCGAGTTGACGACCGCTTCGGTG
-ACCGAGTGCTCTCCAGAGAAAAAGTAAGAAATTTAATTTTTAATTTAATT
-TTACATATATCATTACCCTATATAACCTTAAAAATTTTCCAGAGCAAAGC
-TTCCGAACCCGCTGGATCTTGCCAGTTTCCCGTTCCTCAACACGTTCGAC
-ATTCAAATTTACGGAACACCCATCGCCTTTCTGCAGGTGCCTGATGAGAT
-CAAAAAGCAGATCACTGATGATATCACGGCTGGAAAATCGCGAACCACGT
-TCTCCCAGGACGGTTTTCCGCTCGACAAGTTGAAAGAGTCGCTGCCCGAG
-GATGAGAAATCAAATTTGACAGTAACCCAGAAAGATGTGAGCTTTTTTTT
-TTTGGGAAAAATTTTGAACAATTTGGCAATTTCAGGTCGGATGGGCGTGC
-CCGGCATGTACATTTGTCTTCCAAGAAGAAAAGAAGCTCCGTGAGCATCA
-AAAAGCCATGTGCCAAAGTGATAAGGTGGGCAAGAAATTAGGAAACGGGC
-TTGAAGTTTAGCTTATAGTTAGGCAAGTGGTGTCAGACTGTCTTTGATCT
-ACAAAACATGCGGGAATTGGAATTTTTCCCAGAAAAATTGTGAAGTCAGC
-ACGTTTTTAACCATGCAAAATCAGTTGAGATGTCTGCGTCATTTCTCCCG
-CATTTTTTGTAGATCTACGTAGATCAAACCGAAATGAGGCACTTTCTGAA
-TCCACGAGCTAGGCTTAAGCTTAGGCTTAAGCTTAGGCCTTTTCTCAGGC
-TTAGGCTTAGGCTTATGCTCAGGCTTAGGCCTTTTCTTAGGCTTATGCTT
-GGGCTTAGGCTTAGGCGTAGGCTTAGGCTTAGGCTTAGGCTTATGCTTAG
-ACTTAGTCTCACTATCAGTCTTAGGCTTAGGCTTAGACTTAGGCTTAAGC
-TTAGGCTTAAGCTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTT
-AGGTTTGGGCTTAGGCTTAGGCTTAACCTCAGGCTTAGGCTTAGGTTTAG
-GCTCAGGCTTAAACTTAGGCTTAGGCCCAGGCTTAGGCTTAGGCTCACAC
-GTTCTCACGTTCTTAACCATACAAAATCAGCTAAGAACTCTGCGTCTTTT
-CTCCCGCATTTTTTGTAGATCTACGTAGATCAAACCGAAATGAGGCACTT
-TCTGAATCCACGAGCTAGGCTTAAGCTTAGGCTTAAGCTTAGGCCTTTTC
-TCAGGCTTAGGCTTAGGCTTATGCCCAGGCTTAGGCCTTTTCTTAGGCTT
-ATGCTTGGGCTTAGGCTTAGGCGTAGGCTTAGGCTTAGGCTTAGGCTTAT
-GCTTAGACTTAGTCTCACTATCAGTCTTAGGCTTAGGCTTAGACTTAGGC
-TTAAGCTTAGGCTTAAGCTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTT
-AGGCTTAGGTTTGGGCTTAGGCTTAGGCTTAACCTCAGGCTTAGGCTTAG
-GTTTAGGCTCAGGCTTAAACTTAGGCTTAGGCCCAGGCTTAGGCTTAGGC
-TCACACGTTCTCACGTTCTTAACCATACAAAATCAGCTAAGAACTCTGCG
-TCTTTTCTCTCGCATTTTTTGTAGATCAACGAAGATCGAGCCGAAATGAG
-GCACTCTGACATCACGTGGGCTAAGACTTAGGCTTAGGCTTAGGCTTAGG
-CTTAGGCTTAGGCTTAGACGTAGGCTTAGGCTAGTTATTTGTAACTTTTT
-TAAATCTCCCCCGAGTCAAAAAAAAAAACAATTCAATTCCAGACGCTAAC
-CCTGGTGCAAACCCACTACTCGTGCAAAAGCTGTCAAAGTGATTTCTGTC
-TTCAATCCGAGTATCAATTCCATCTCTCAATGCCTCCTCATACTACTACT
-ACTACCACGACGACGCCATAACAAAACCCCCCAAATAGTCACCTCATGTC
-ATTTCATTTGCCGTCTTCACTCAAGGACCTATTTCCGTCTCTCTCTCTCT
-CTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTTCTCCTCTCG
-CCTTAAAAAAACCACAACTCCTTATCCCGATCTGAGCTCACTTCCTATCC
-CCCAAAGTAATTTCTTTGTAATATCTATATCCACTTTTTTTTCGACACAC
-TACACCACATCCCGCCGCCTATCCCCTCCCCCCCCACCGCTTTATGACAC
-AAAAACTGGTTTCGCTTTTGTCTTCAATTTCACCCCAACCGCCTGCAGCT
-TCTCATAATAATTAATAATTTTTCTTACCATGCACAATGATTTTGATAAA
-TATATATATATATAGTCATCAGGATTGCCCCCTTTCTAGGATATGTTTTT
-TTTTGTCTTCACACAATTTTCCCATTTTCTATGATAAGAATTATTTCTTT
-GTCCGGTTGACACATGTAGATGTTCCCCTTCCAATTTTTAATAGATTTCT
-ATTCTAGTTTTTTGCAGGCCTCACTATTCTATTGCAATAATCACTTGGAT
-TTCATGTATGGAACGCAATAATAATTCAATAAAATATTGGTACTTCTTTT
-TTGAAACACACTAATTCAAACTCACGCGGTTCCAGGCTGTCCCATTACGG
-TTTGATCTACTAAAAATGCGGGAATGTTTACTCCCAACAAAATGTGACAT
-CATCAGCACGTTTTTAACCATGCGATATCGGTTGAGTACTCTGCGTCTCT
-TCTCCCGCATTTTTTGTAGATCAAGCCAAAATGAGACACTATGACACCAC
-GTGTAGACTTAAAATTGACTGAAACCACCGAATTTCATATTGAAACTTCT
-TGAAATCTATTCAAAAAAAAAGTTATGAAGGCTCAAAAAATGGCCTAAAA
-TTTGTTAATTTAAACAAAAGACACTTAAAACGGTGTCTTTTTGAATTTTT
-CCGTTTTTTTAAACATATTTTCATAAAATTTACTTATTTTTCAAAATAGA
-TGTTGGAACATTTATAGGATGCGTTCAATTTTGCCATTTGAAATTGAAAT
-TCGGAAATTTCAAAAAAAAAAAAAAAAAGTGCGAAACCAAAATTTTCCGA
-AAATTTTCGGCAATTTGCCGGTTTGCCGGAAATTTCAATTCCAGCGATTT
-GCCAATTTGCCGAATGGCCGGAAATTTCAATTCCAGCAATTTGGCGATTT
-GCCGATTTGCCGGAACCTGCTAACCTACCTACTAACTTGCTAATCTTCAA
-GGTTTTTAATGAGTTTTCAATAGAAAATTCGGTGTTTTCAGGCAATTTCG
-AGAAAGCAATACAAACGTTTAACAAAAAAAAGACGCTTTTTCCTCTTATC
-CGATTCTCAATTCTCAATTTTGCCTTATCAATTTATCCTCTCCTCACAAG
-GTGACACACACACACACACACACACACACACTCGTTTCTCGACAAAAAGC
-TATGAGCTAACAAGCGCCTTCTCGCGTAAGAATACATCCACTGATAAGAC
-ATCTGATAAGAGTGGAACCCGTCCGCCATTGTCTCGAGAAATACACGCCT
-CCGCCCGGGAGGACAGGTTATCCCACCTCGTCGCTTCACTTCATTGTTTC
-AAACGATTCCATCGGCTTGCGCTTGGATTTTCTCTTATGCAACTTGCCAT
-TCTTCTTTTATTGCTTAACATCATGGTTATTTATTAGGGAAATTGTTCTA
-CCCTGACTTGAAATGACTGAAGACGGCCTATTTTACTTTAATTTGAAGAC
-TCAGAAGACTACTATAAGCGGTCATTCTTGTTGCGAAAATTTCTGCATTT
-AAAGGTGGAGTAGCGCCAGTGGGAAAATTGCTTTAAAACACGCCTATGAT
-ACCACAATGACCGAATATCATGATAAAAAAATTCAAAAAAATTTTCTAAA
-TTTTATATGATTTTTTGAAAATTGAAAAAATCTAAGGTTTTCACTTAATT
-CATATTTGAATTACCGCCAATTGGATTTGCTCGATGGAGCGCACTTGCAC
-GTTTTTAAATTTATTTATTTTATTTTTTGTTATTTTCCACCGATTTTTAA
-TGTTTTCGGTGTATTTTTGCTTGAATTTTAGAGAAAAAGTCAAAATAAAT
-GCAAATTTTCGATTAAAAAGCAAGCGTACAGGTAAATCAGTGAAATTAAT
-CAATTCAGGTTCATTTTTACGCCTGTAAGCGTGCTTTTTAATCGAAAATT
-TGCATAAAAAACATTTAAAATGGGTGGAAAATAACAAAACATAAAATAAA
-TAAACTTAAAAACGTGCAAGCGCGCTCCATCGAACAAATCCAATTGGCGG
-TAATTCAAATAGGAATTAGGCAAAAACTGAGATTCTTTCAATTTTCAAAA
-AATCATATAAAATTTAGAAAATTTTTTTGAATTTTTTATGGTGCGTCCAT
-AGAAAAACCGGAGTTCCTCGCTTTTTTTTCCTCGAAATTCAAAAAAGTAG
-GCGTGGCCAACCAATCAGCTGTTGTTTCTTGTTTTCTCATTGCTCAGCTT
-AAAATTTTACAGCCTCTAATTGGTTGAACACGCCCACTATTTTGAAATTG
-ACCAATAACAAAGCGAGAAACTTCTTGTTTTTTCCGCAGACTATGGACGC
-TTCCGCACGCGGGAAATTCCCGTTTTCCGCAGACTATGGACGCACCATTA
-TCATGATATTGGGTCATTGTGGTACCATAGGCATGTTTTAAAGCAATTTC
-CCCACTGGCGCTACTCCACCTTTAATGCATTCTGCGTCTATTTTATACAG
-TTCTGACCATAAAAGCACACAAATTTTTGTCTCAAAGTTTAGGAATATAT
-AGATTTAAGGAAGAAAGTTTTAGTAAGAAAAAATATAGTCTTCTTCATGT
-TTTCTTTTTTTTTACAATATCCATTTGCCATCCGTTTTTTTTTCTGCAAC
-CTTCGATAAATGTTTGCTTGGATAACTATGTAAGGTGCTTTGAACACTCG
-GCATTTGGGCTTCTTGCCCAAGTTTAGCCCAAAAATATTAACTTGGATCA
-GAAGTTGGGCAATACTTTGGCAAAACTTGGATTCAGGCAATATCAAAGTT
-TAACCCAAGTTTCACCCAACAAACTTTGGCCTAAACTTTTTTTGTTTCGA
-ACTTGCGTAGAAGTTTTTGCCCAATTTTCGCCCAACTTTTGCCCAACTTT
-TGCCCAAGTTTAGCCAACTTCTGTTCCAAGTTAATATTTTTGGGCCAAAC
-TTGGGCATGAAGCTAGAGCCGAATGCCGAGCTAATTTTATTTGACTCTAT
-CCGAATTCTGCTAATTCTCAAAAATCCCCCAATTGCCAACCATTTCAGAA
-TGCATTGGAGTAGTTGGGCGATAGCGCTCAACGTGCTCGTGCTGGCTTTG
-GCCGACAGTGCTCCTGAAAGATTCCCAGAGGATCATGTGGACCTGGTACT
-TCCTATGAAAAGTATCCACCATTTCACCTAAACGTTTCCTAATCATCTTG
-ATTACAGTGAAATACGACAGTCATCTTCGACAAGCTGATCTTCCACCGCA
-CTTCATTGGTGCCAATGAGACGAACTTGGTTCCGCTCACCTTGAGATTGG
-AGACTAGGAGGAAGAGATGCTCGTGTGGATGTTCGGGATGTGATCTTTTC
-CCGAATAGATCTTGTTGTTCGAGCTGTAAGTTTGCGATTCTATAAGACTT
-GTCAACGTGGTGTCAGGCTGACCCATTACGGTTTGATCTATAAAAAATGC
-GGGAAGTTTATGACCAGAAAAAAATGACGTCATCACATTCTTAACCATAC
-GAAATCAGTTGAGAAATCTGCGTCTCCCATTTCTTCTCCCGCATTTTTTG
-TAGATCTACGTAGATCAAGCCGAAATGAGACAATTGAAATTCCAGCTTGC
-TGCTCCTCTCAAAAACCAATCCCACTTGCCTGCTGTCCGCCACCTCCCCC
-ACCAAAACCGTGTTGCCAGCCAGCCTTCGGCCCTTGCTGCCCGGCAACCC
-CAAACTGTTGCCCGAAACCCTGCTGCCGAGGTCGTCGCCCCGAATACGAA
-GAGTACGAGGACGAGGAAGGCAACCCTGGAGGCGTCCCAGCACCACCAAA
-CCCACCAAGAACTTGCTGTCCTCCACCAACACCTGCTGCTCCACCACCGC
-CACCACCTCCACCACCACCGGCTCCGGAAGCTCCAACGCAATGCTGTGGA
-TCACAGCCTTATGGAAGAACACCGTGCAGGTCCGGATGTCCGAATGGAGA
-TTGTGGATGCGGAAGACCTTGCTGTTACTATCAGAACCCCACATGTTGTA
-ATCAAGGGCAAAAGGCTTGCTGCCCACCTGAACAGCCTTGCTGTCCTGAG
-TTGAAGCTGGATAACTGCCTCGCTTCGGTCCCACCTTGCCTTCGCGCCTG
-TCCATCGTGCCCTTGCAGAAAACGTCTGATGCTTGGGAAGAGAACTAAGA
-GAGACGCACCGGGGCTTCATTGCCAGCCAAGTAAGCTATAAGTTTAGATT
-TTCACGTAGTGTCAGGCTGTCTCATAGTGGTTTGATCTACAAAAAATGCG
-GGAATTTCTCGCCCAGGAAAATGTAACGTCAGCATCAGGGCTGGGACCAA
-AAAAAAAATTTTTGGACCAAAGAAGTTTTTGAAAAACCAAAAAAACCAAA
-AAAAAAACAAAAAAAAAACCAAAAAATTTTTGATATGCTTAAGTTGATTT
-TTAATGGGGTTATTCAAGTAATGTTGCAAAATGTATTAAAATACATTTAT
-GACGTCACAACTGTGTTAAAATACATGTTTTAATGTATTTTAATACAGAA
-TAGTCTCGAGTCGACACTAGACACGGTAAACTTTTTTTTTAGATTTTTCG
-TCAAAATACCAAAAAAACCAAAAAATTCCCAACAGCATGTTCTTAACCAT
-GCGAAATCAGTTGAAAAGTCTGCGTCTTTTCTCCCGCATTTTTCGAAGAT
-CAAACCAAAATGAGACACTTTGACACCACGTGGATTTTCAAAACGCTGAA
-AATAAGTAAAATAAATAAAAAATTTTCAGTCGGACTCCTTGGTCAACAAT
-CCCCACCGACTCTGATTTCAAAGCCGGTAAAGACCATAATAAAATCAAAA
-TCCCGCGTTGCTGGAACCAAGACATCTCAAGTGTCCGTCACCAAAAAGCT
-CATCGAACAATCCTCTGACCACGTGGAATCGCCTCCAACAGCCGGAAGAC
-TCTACGACTTCCGAAGAGCCCACGTTCGAGTCAAGAGAAACATGAACTTT
-GGAAATGGAGCATGCCAGCTGTGTCTGAACGGAACTCCGCTCAAGAGAAC
-CAAGCGGTCTCTCGATTGTGTTCCGTGTACCTACCTACAACCACAATACT
-CTGATTGGAACCCGTTCCTCGGAGATCAAACGCCACGCGGATCGCAGTCG
-CCAGTTGGAACTCCACTCGCCGGGCACAGAACTAAGAGAGCTGGCGTGAG
-TTTGACTCATAGAAATTAACGAAGCTAAATTTATTTTTGCAGTGCCTTCC
-TCATCCACAATGTACCCTGCATGTCCGTCGCTATAAGAGAAACCTGATCG
-GATCCCAATATTGTGAGCCATGCAATGGACACTACGGTAGAAAGAAGCGG
-GAAGCCGAGAGAGATCAGTGCTTGAAAAGAGAGAAAAGATATGCAGATGA
-ACAGTGTGATAACGATGAGTTCAGTATCAATGAGCGAAGCAAACGACAAG
-CCTACAATCCAAAAGGAATTTTGGATATCGTGAAGCTCCTATCCAAGGCC
-TCCTCAGGTGGCAACAATCCAGGAGGATGCATGAAGTTCCCAGCCTGTGT
-TCTGGCTCAGAAGAAGAGAAGAAAGAGAAATGCAGATCGGCTCGACACGT
-ACTACAAAGCTGTGGAGGAGCACAAGAAGCTGGTGGAAGAGTACGAGATG
-GCGATGGAGGAGCACAAGAGAGTCAAGCGGCAGTTCTTCGCTCCGGATAA
-TGCTGCATCCTGTGTTCCGTGTCCGGCATGGGTGACACTTGCCTTGGCTA
-GCAGAAAGAAGAGAGAAGTCGAGAAGGTGGAGAAGCATATGACGATGAGC
-GAAGCTATCGCGGATATCAGAGCAAAGAAGGGGTATAAGGAAGGATTTGA
-TGATGATGATGAGGTGAGGACTAGACCTGAAATTTTAGATCCTGTAAGAA
-CTTTTTGAAAATTCCAAAAAAAAAACCCCCTAATTGAATCACGCGCGCAC
-GCGCCACTGAGAAGGATACTGTATTCGCGGCGAGACCACCTGCACATCTA
-ACTCCCAAAAGTGACGAATTTGGCCTAAAATGGACTTTCTTCATGGGATT
-TCCACAGTTTTCACCATTTTTTTGACACAGTTCATGACTTTTTACACTCA
-AAAAATTATTGGCGTGGTCATTTCACAATGATTTCAACAATTTACTGGAT
-TTTACGCGTGTACTTCATCGTGGCACACCAAAAATTGATCTGGTTCATGT
-GGTGTCAGAGTGTCCCATTTTGGTTTGATCTACGTAGATCTACAAAAAAT
-GCGGGAGTTGAGAGACGCAGAGATCTCAACTGGCGTCACATCAATGCGGA
-TTTTAAAATTTTCATTTCAGGACGACGAATCCTCTGAGGAAACCATCGAG
-ACCCGCAGAAAGCAACGCCGCTCCTGCCAACAAAGTGACGATTGCCTGAA
-CAACGTCGAGTACGCAGTCTTCCAAAAAGTCTATGCAGACAAGAGAACCA
-AACGAGAAGCCGTGTTCCGTCGTAAGAAGTGCTCGAGGTGTGGAGTCTCT
-GGGCTCACGCCACATCGTGTCAAGAGAAACTTCGGGCAGCCGAATATCAA
-CGTCTCGGAGCAGAATTGCATGGCATTCCCACAGTGTCGGCATAGAGTGA
-AGAGAAACTTTTTGGGAGAAGACTGTAACATCTGTACACAGGATACTGGT
-CTGAAGCGGAGGAAGAGAGACTTCGGAACAGCGGTAGGTGTTGGTTTAAT
-GAGCTTCCTTATCTTAAAGTTTTCAGCAATGCTACCCATGCCCAGGAACA
-CGTTCATAACTTGAAGCGACTCCCTCCGATTCTCACATATCACATAAATA
-CCACCTCGTAATAATAATTCAACATGACTAATAAAACAAATAAGTACATA
-CATACATTTATATTAGCTTTTAGCACCCGTAGCAATTTGGAGCAAGAAAA
-TATGTGTAAAGAAATTGGAGATGTAGTAGATTTGGTCGTTATAGTGATCG
-CAGATCTTTCAGCTCTTTGAGCCGGAATATTGACTGGCTTGGAGCCAGGA
-GATGAACCTCGCGGGGGAATGAGGCAAAGTAGGGGTGAAGCATTGCACTG
-GCTGCGGAGACACGGCTTTCCGGGCGGAGCTGTAATTTTGAGGGTTACAA
-GATAGGTGTAGCTCGATGTCGATTCATTTAGACTAGCATTGCAGCCAGGG
-CTTAAGCTTTCGGCTTGAGCTTGCACTCAAAGATTGCTGCTCAATATAGC
-TCGCGAAGACTGATTTGTCAAAGATTAGACTAGTAGGCCTGGACTGACTT
-AAAGGTGGAGTAGCGCCAGTGAAAATTTTGTCAAAATACATACATAATGA
-TCCGAAAAAAAAACCAAATTTCATAATAAAACAATCCAAAAAATTAGATT
-TTTCACAATTTCAGGTCAAATTTTTGGCAAACTGCTAAAATTTTGAAAAA
-TGAGCAATTGAGGAAATCTAGAGCAATGTCGCATGTTCCGACCCCTACAA
-TATTTTAATACAAATAATTAAAACACAATTACAGTATAAAAATGTAGGAA
-AAAAAATTTTTTTTTTGTTGGTCGACTTCCAAAATTATGAGTGGTAAAAT
-TACAGTAAATAAAAAATTTTCAAAATTTTTTTGAAACGTTTTATTATGAT
-ATTCGGTCTTTTCGGGACTAAAGGAGTGGTTTTTACAAGTCTACTTACCT
-GAAGAAGCATCCCCAGAAGTTCCTGACCAGTCTTCAGAATCTTCGTGAAC
-ATCGGGTTCACCGCGATGAACGACAACTCCCGATACCTGGGGAACAGTTC
-AGGGGTGTAGCCTGGTAATGTCTTTACCTGAAACAAACATCTTTATCTCT
-AGATTTTAGATTCCCTCACCTCCGGCCACTTTTTCTCGTCTGGAGTACCC
-CGAATGCTGAAGATCATATCCAACTGGTCCTTGGTGCCGGGGTAGTGAGA
-GTCCTTGGATCCCGGGAACAAAGCGGCGCCCGTGCAAATTTCAGCGAATA
-TGCAACCGACTCCCCTGCAAAGTTAGTAGATATAGTTGGTACCTTTTATA
-AAATAATATCCTCCTACCACATATCCAGGGAAGTTGAATAGTCGGTACTT
-CCCATGAGAACATCAGGCGGGCGGTACCATAAAGTGACCACCTCGTGAGA
-ATATGTCCTACTCGGCACAGATTTCGCCCTGGCTAGACCAAAGTCTGCGA
-GTTTTAAAACACCGTCTTCGTCGAGAAGCAAGTTTTGTGGTTTTAAATCT
-CTGAAAATCAGTTTTTATCAAGAGTTATGGCCGCAACGGCGCCTCCGCCG
-ACCCCAGCGGTCGCCGCGCCGGCCTCCGCGGAACCCCGAAAATGTCCGCC
-GCTCCAAACAACCACTTTTTTGCACTACGTTGCGCACACACCAGGCTACT
-CATTTCACGCCAAGCTGCGGAACACCGAACGTGTCCGCCGCTCCAAATAA
-CTCCCTTTCGCAATACGTTGAGCACACACCAAGCTGCGGAACTCCCAACG
-TGTCGGCCGCTCCGAACAACCACTTCTACGCACTTCATTGCGCACACACC
-AGGTTACTCATTTCACGCCAAGCTGCGGAACCCTGAACGTGTCCGCCGCT
-CCAAACAACTCCCTTTCGCAATACGTTGAGCACACACCAAGCTGCGGAAC
-CCCCAACGTGTCGGCCGCTCCGAACAACCACTTCTACGCACTTCATTGCG
-CACACACCAGGCTACTCATTTCACGCCAAGCTGCGGAACCCCGAACGTGT
-CGGCCGCTCCAAATGACCACCTTTCGCGCTTCAACGGCGTCGGCGTGAGG
-CCCGAATTTCGCGCCTCACTCTGCTGGGAGCCCTATCAACACTAGGGAGC
-AGTTTGAAAACTAACCTATGAAGAATCTTCTTCCTATGACAAAAATCGAG
-TCCGCGGAGAAGTTGAAAGAGGAGAAGCTTGATGTCAATGCTATCCAACC
-CATAGACGTTCTGCTCCAGGTACTTGCTCAAATCCATTTTCATGTACTCG
-AACACAAAAGTTAGCTGGTGGTGTTGATAGAAGATGTCGTGCAAAGAGAC
-GATATTCGCATGACGGAGGTTTCTGAGAAGCGAGGCTTCACGGATAGCGG
-TGAATGGGAGACCTTCTTGAAATTGAAGTTTGATCTCTTTCAAGGCGACT
-ATGGATCCGTCAAGTCTGAAAATATAATTTAGTTTGGTAATATCAGCTGT
-TAAAATATCTAACTTCGATTCGCACTTATACACCGTTGCATAAGATCCTT
-CCCCCAGCTTGTCAATTCGTTTGTACAGATCATTCACATCCTGCGGTGTC
-ACTTCCTCCTTCGCAGGAAGCGTTATCGTATTTGGATCGTAGTGTGCTGA
-TCGTGGTCGACGTCTTCGAAGATGTGTGAAGTCGGCCACAGTGTTGCTAG
-ATGGTGGTGGTGGCATTGATGGAGAGTTCTTGTTTAGGGGCACGGTTGAC
-ATGGTTTCAGATGGATTGTTGGAGCGGGAACGTGATTGGCGGCTGAAATG
-GTATTACTAGGGTTTGATTCGGAAAATTTTCTTAGAAAAACAGTTTGGCG
-GGAAGTTTAAATTTTCTGATTAAAAATGTTGGCGTAAGTGGTGTCGAAGT
-GCCCCATTTTGGTTTGATCTACAAAAAATGCGGGAGTTGAGACAAAGACT
-TTTCAACTGATTTTGCAGGATTAAGCTGACGTCACATTTTCCTGGGGGAA
-AAATCCCCGCATTTTTTGTAGATCAAGCCGCAATGAGACAGCCTGACACC
-ACGTGTTGACGGGATATTTAAATTTTCTGAGAAAAACATTTTGGCGGGAA
-GTTCAAATTTTCTGAGAAAAACATTTTGGCGGGAAATTGAAATTTTCTGA
-CAAAAAAATTTTGGCGGGAAATTGAAATTTTCTGACAAAAAAATTTTGGC
-GGGAAATTGAAATTTTCTGACCAAAAAATTTTGGCGGGAATTCAAATTTT
-CTGGGAATTAACTTTGGGGAGAAGTTCAAATTTTCTGTAAAAATTTTGGC
-GGGAAATTGAAATTTTCTGACAAAAATATTTTGGCGGGAAAATCAAATTT
-TCTGAGAAAAAAAAATTTTGGCGGGAAATTGAAATTATCTGACAAAAATA
-TTTTGGCGGGAAAATCAAATTTTCTGAGAAAAAAAAATTTTGGCGGGAAA
-TTCAAATTTTTTTTTTTTGAAAAGAAAATTCTACGGACCGGAAACGGCCC
-AACTACGGCTCAAGAGCCGTCTCGGTCGGTAAATGTGTTTTTTGCTCTAA
-ATAATGCATTTAACGACGTAAAAATGCTTAAATTAGCCAACTGGTATCAT
-AGGTATTAAAAAAATTCGTTTTCTTAAAATCCATTTTTTCCTCTTAATGG
-CCATTTTTTTACATTCCCCGTAGTTTGCCCGTAATTGGTCCGTCCCGCTT
-TTCATATCCGTAGTTCACCCGTTAATGGTCCGTTCCCGGTCCAAGATCCG
-TAAACGGACCGTACCGGCTTTGCCTGTGGTCAGATATAACTAGTAAGTCA
-AGTGGTGTCAGGCTGCCCCATTATGGTTTGATCTACTAAAAATGCGGGAA
-TTTTTCCCCCAGAAAAACGTGACGTCAGCACACTCTTAACCATGCGATAC
-CAGTTGAAAAGTCTGCGTCTCTTCTCCCGCATTTCTCGGAGATCAAACCA
-AAATGAGGCACTTTGACACCACGTGGTAAGTTATAACAAACATAACAAGG
-TGTCGAAACTACTGTAATTATAGTCTTACTTCAATATACAACCTAATAAG
-AATCTCCACCACTTACCTCAAAAAGCTGAAAATATTCTTATTATGATGTT
-CTGGTGTGCTTCCACTTCCGGACCCCGATGATGCCCCATTCACATGATTG
-GAGTGCCATGATTGTGTCATTTCATTTGTTCCGTTTTTCGAGATCGGAGA
-TTTGGTGGAGCCTCCTGAAAAAACAGAAATAAATGTGGAATTATATGGGG
-GCTCATATGTTTTCGGAACTAACCTTTTTGGGAGAAGACTCTGGAGAGCA
-TTTTTGTGTAAACTGACTAACTTGTGCCACCCCCCGCACCCCATAGAATA
-AATTGGCTAAAATTTCGAAAAAAAAAACTCGCCACCGCCGTTATTCTTGT
-ATTTCTTCTCCTTATTCCGACTCCGACGCAAAGTGAAAATTGACGAGGAC
-GGCTGGAATAATGTTTTGTGTTTGTGTCTTGTGGAAGAGATGCAGAATCG
-CCGGAAGTTTAGAGGGGGTGGCGTGACTTACTGACCTTCCGGGTGCTCGG
-CGAGCCGTCCACGTCCTGAATTCGTTGCGGCGACATTGTGGTGATCTGGA
-ATATGTGGAGCGTAATCGAAATATTTAGGCTTAGGCTTAGGCTTAGACTT
-AGGCTTAGGCTTAGTCTTCGGCTTAGGCTTAGGCTTAGGCTTAGGCTTAG
-GCTTAGGCTTAGGTTTAGGCTTAGGCTTAGGCTTAGGCTTGGGACTGGGC
-TTAGGCTTGAGCTTTGGCCTAAGCTTAGGCTTAGGCTTACGCTCAGGCGT
-AGGATTAGGCTCTGGCTTTGGCTTTGGCTTAGGCTTAGACTTAGGCCTAG
-GTTCACGCTTAGGCCTAGGCTTACAAGAAATATCCTCATTTACCGACCGA
-CTGTGGCCTAGGATTTCAAAAAATGACCCTTTTTGAAAAATCGAAAAATC
-GAAATATCGACGAATTTTCGTTTTTGAGGCGTTTTTTTAATTTCAATTTT
-TATAATTTTTTTCGGTTTTTCGATTTTTCTTGAAAATACCAAACTCACCC
-TATGCAAGTTCTCCGACGACTTCGAACTCCTAACAGCGGTGAGCTGTGGA
-TGATGTATCATAGACAGTGAGCACGATGCTCTCATAGGCCTCTCGGCCTC
-CTCCAGCCCAAACCATACTCCAATATGCGAGGTTATTTTTCCCCACATTT
-GATTGAAAGATGGTATCTGCAAGTGAAATTTTTGGGTGGGGAAAAAGAAC
-GTGAACGAATAATTTGGAGCAGCGGGGGGGGGGGTGGAAAAATGAAGAGC
-TGCTCGGAGGAGGGAGCCGTACTACGAAATGAGAAGAGGAGAAGCCGGTG
-TGACGGCGGGGCGTTAATGGGTTACTAAAGCCTCCACATTCCCATTTTCA
-GCCGTTTCGAAACAAAGAAAATAGAAGAAAAAAAAGACAGATGAAAAATG
-ACTTGGGTGGGTTCGGTGAAAAACAGGAAGCAGGAAGAGTGAGGAAATTG
-GATGGTGGAAGAGTTTTGGCATTTCTAGGTTACCGGGAATCTTTAGAGAC
-ACCTGGGCTGTCCCATTACAGTTTGATCTACAAAAAATGCGGGAATTTTT
-CGCCCAAAAAATTTTCAACAAATTTAGATATTTTTTACATTTTTTCCCCA
-ATTTTTTCAGCCATATTTCAGCCATGACTGTCCTTTTTTTCGGGCAAAAA
-AAAATTTTCTCTGAAAATGTTCGAAACTACTAAATTATGCAAGAAGACAA
-TTTTTAAGGTTCGGAGATCAATTTTGAGTCCTCTAGCTTCAAAATTATCC
-ATTTTAGAAGAGTTTTAAAATTGTAATTTTTTACAAAAATTGCTCAATTT
-TGCCACTTTTTAATAGTTTTCTAAACCTAGATTTTCTGAATTCTGCATAT
-ATGAATTACCCGTTTTCAACAAATTTAGACAATTTTTTTCATTGTTTCCA
-AAATTTTTTTCAGCCATTTTTCAGCCATTACTGTCCTTTTTTTGGGCAAA
-AAAAATAATTTTTTGAAATTACATTACACACCTTCCATGTTTTCTTCGTA
-GATTTAAGGTCCATGTCCACTGCTTGGTGGAAGAGTTTTCCGAGTTTTTA
-GGTCACCGGAGAATTTGAGTTGGAAGAGTTTTCGCATTACTCCCCAACTG
-TGATAGAACTTCAAAAATGAATATGCAGGGACATCACTCAAATTTGACAT
-GTCAGTTTAAAGGAACACGCTGATTTTCCGAGTGGGTCTCGCCACGATCC
-AGGTGCTAAATTTTCACAGTTTTTAGTATGTACCTAGTGGCTTATTTCTA
-AACAACACGCGCATAACATCGGAGTGTCGTTGCATAGGCCACTCTAAAAC
-ATAAACAAATGTGTGAAGAAAAATTAAACACAACTAGCACGGATTTCTGA
-CGTCCCTCAGAAGTTGAAATGGAAGAGTTTTTGCCGAACTAGGCCAGGCC
-ATATTCGGGGTAGATTTACGGCGCGTCGCGGCTCGATTTTAGTTGTAAAA
-CTAAATGTATTTGTCCGTGTGGAGTACACGACTTTCCCAAGCGTTGTCCG
-GCAGGCGATTGTCAATGGAGCGCGAAAATTCAATGAGGAAGGCCAGAACC
-CCGTGGGATTTTGAAATTTTTTTCAGATATGACAAAAAATGACAATGCCA
-AATTTAAAATGCATTAATAGCGGACAGAGGAGAGAATAAGTAGGGAAAAA
-AGAAGAAAAAAAAAGACGGGCGGCGCTTCTCTCATAAAATAGTAATTGGT
-CATTCTAAGTGTGCCTATTGTTCCTTATTTTTCGCTTTTTCTTGGCTCAT
-TTTAGCTCAAAAACCAAATGTCGAAGAGTTTCTAGAGAACTAGGCCACGA
-GAGGGAAAAACTAGGTCACTGGAATTTCTACGCTAAAAATTTGGCCCAGC
-ATATTTACCTACGTGGCCGTAAAAGAGAAAGTTCGGCCACTAACTTTTTC
-GGGCTATCAAAAAAGGTTTACCAAAACTTTATAAAAAAGAAACCACTTGT
-GGAAAATGGCCGTGCATACTAAAGTTCGGCCACAAACTTTTTTAAAACTT
-TTTTGCTCAAATTGAAGTACAGGACCACTTCGATGGGCGGTTTTCACTAC
-TTGGCCGTGTAAGAGAAAATTCGGCCACCAACTTTTATTCAAGGCCACAC
-CTCCAAATCCTTCAAAGCTTCAAAAATTTTCTACGTGGCCGTGTACGAAA
-AAATTCGGCCATCATCTTTTTTTTGGGTCACGTCGCTAAATTCTTCAGAG
-CTTCAGAGATTTTCTACGTGGCCGCGGGAGAGAAAATTCGGCCACCAAAT
-TATTTTTTAAGGCCAAACCTCCAAATCCTTCAGAGCTCATATTTTCTACG
-TGGCCGTGTACGAGAAAACTCGGCCACCAAATTAATTTTGAAGGCCCCAC
-CTCCAATTTCTTCAGAGATCATATTTTCTACGTGGCGTGGCCGTGTACGA
-GAAAATTCGGCCACCAAATTCTTTTTTAAGGCCAAACCTCCAAATCCTTC
-AGAGCTCCTATTCCCTTCGTGGCCGTAGGAGAGAAAGTTCGGCCACCAAA
-TTAATTTTTTAAGGCCACGTCGCCAAATCCGTCATATTATGAGGAAAAAA
-GTAAAAAATAATACTAATAACAATTGAAGAAAAATTGAAAAATATAAAAA
-TATAAGAGACTAGTAAATGAAGAGGAATGAAGAGCGAATAGGAGGCCAGA
-GAGAGAGAGGGGAGGAAATTGTGCTGTTGAAGACCTTGAAGAGAGAGGCA
-CAGCAATAGATAAATTGAATTACAATGGGGTGAGGAGCCGGGTCTGTCCC
-CCCCCCCCCCCCCCCCCAAAAAGTGCGAACAAATGTGATGAAGCGCAGAG
-AAAATCGGGAGGGGGGGGGGGGGGGGGGGCTGTGCTCCAGGTTGATTGAG
-CCAAGTGTTTCGACTTTTTGCCGAACACGTTGAGCTCTCCGATGAGCCGG
-GCTCACCGGAGAGCCCATGGAGCCCCATGAAGCAGAGGGTCACAAGGTTT
-GAGACTTCCGGGAGATAGACTGCACAACGTACAAAGACTAAAACTTTTTT
-TTTTTGCAGGTGAGGCATGAAATTTAGAGCTTTTTTGCAACAAAATCCAA
-CATTTTTTTTGTAAAATAAGGTCAAATGACGAGTTTTTTCTATAATCTGG
-CCGAGAAAACCTGAAAATTGATCTACCTTGATAAACAGGGCGCGCGGGTG
-TAAAGCGGAGCGTCGTTGTGAAGCTGAAATATTGTTGAACGAATTCTGGA
-ATTCTGGCTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCAAACTAGG
-CCAGGCCATATCTGGGGTAGATTTACGGCGCGCTTTTTTTTGGGCATAAA
-ATTCCCGCATTTTTGTAGATCAAACCGTACAGCCTGACATCACGTGTTTT
-TGGCCCCGCTAAACAGGGCGCGGGTGTAAACATTCAAATATTATGTGAAA
-AAAACGCATGAATTTGAACAATTTTGCGTAGAATTTTTGAACAAAAAAAT
-ATATGAATAACTAATGCAAAACGAACAGAACTAAATTTTCTGAAATTGAA
-GAGAGGGGAAAAAAATTGGGAAATTTTGGACATTTTTCCCAACGACGCAT
-TGAGCCACCGGACCCAGATGAGCAAATAAACCGGGGGAGCAGGAGGAAAA
-TGGAAATGACAAAAAAGGCGGAGGAGGAGAAGCTCACGTATTTAGTATCC
-CATAGAAAGAGTCAATTTTCATAAACTGCGACAATTGACTACCAGGGAGC
-AGTTGCGCTCTACCGACAAAATCAAGCAAGGTCCACGTAGTGCCAGTCTG
-TCCCATTACGGTTTGGTCTACAAAAAAATGCGGGAAAATTTGGCTCAAAA
-AAATGTGACGTCAGCACACTCTTAACCATGCGAAATCAGTTCCCGCATTT
-TTTGTAGATCTACGTAGATCAAGCCGAAATGAGACACTGTGGCACCACGT
-AAAGGTCCTTCTTACAGAGTGCGCTAGAGCGCGATTGCCAGTTTTCTAAA
-AAAAAAATCTAACATGAAAAAATGTGCGTAAAAGCGGAGTTTCGTTGCGA
-TGTAAAATTTGGAGAAAAATTGAAAACTGAGGAGGAAGAAAAAGTTAAAT
-GCCTCTTCGCAAGACCGGGATTAAATAGTATTTTACTTCTTTTTTTTCCT
-TCAACTTTTTGAAATTTTTGGCGGAATGGGGAAAAGGAAAAAAAAACGAA
-ATCATCGATAAAAACAACACTAGGCCACCCAGAAGTAAACCTAGGCCACC
-TTATAGAAATTCTAGGCCACCCTGTAAGAATTTTAGGTCATCGCGTAGAA
-AAGCTAGGCCACCCTGTTGAACTGCTAGGCCACGCTGTTGTACACTTAGG
-CCACTCTGAAAAAAATCTAGACCTCCCTGTAAAAAATCTAGGCCACCTTG
-AAAGAATTTTAGGTCATCGTGTAGAAATTCTAGGCTACGTTTTCGAAATT
-CTAAACCACTCTGTAGAAAACTTGGGTCATCTACCGAAATTCTAGGCCAC
-CCTGCAGAAAACTTAGGCCATCTACCAAAATCCTAGGCCACCCTGTAGAA
-AACTTAGGTAATCTACCAAAATTCTATGCCACTCTGTAGAAAACTTAGGC
-TACCTCGTTAAAGTTCTAGGCCACCGTGTAGAAATCTTAGGCTACCTCGT
-TAAAATTCTAGGCCACCCTGTAGAAAAATTAGGTGATCTACCAAAATTCT
-ATGCCACCCAGAAGTAAACCTAGGCCACCTTGTATAAATTCTAGACCACC
-CTGTAGAAAACTTGGGCCATCTACCAAAACTCTAGGCCACCCTGTAGTAA
-ACTTAGGTCATCTACCAGAAAACCTAGGCTGTTCCGTTACGCCGCATGCT
-AAAAAATCCAGACCGCCCTGTAGAAAATCTAGGTCACTCCCTACAAAACC
-TAGGCCACCCTGTGAAAATTCTAGGCCACCTTGTGAAAATTCTAGGTCCT
-TCCCTAGAAAAACTAGGCCACCCTGTTAAACTCTTAGGCCACTCTCTAGA
-AAAACTAGACCACCCTGTAAAAAAACCTCGATGGCCTAGAAAAAAGCTTG
-GGAAATTTTGTGGAAAAAGTTAAAAAGGAAAATCTAGGCCACCCACAAAA
-AAGCTAGGCCACGTGGCAAGAAACTTCAAAAGTGACGAATGATGAGACGA
-GAGGCGTATGTTTGAGGTCAAAAAGGGTGAAAAAGAAGAAAAAAAGACGA
-GGCGGAATGTTTCTTTTTTCTTTTCAAACTGAGCATCTCCCCGTCTCTCG
-GCCACCAATACTACTACTACTACAACTATTCATGTTTTTAGAGAGCCCCC
-CCCCCCCCCCCCCCCGGCCACTTGTCAGCTTTTTTGACGGAAGATGCCAA
-CACACAATCGAAGGGGAAACCATAAAAACCCGCCAACGACACTCCGTTTT
-AAGGCCCGGATGCCCAGATGTATGAAAAAATGGAGAAACTGAAGGCTTCT
-CCCCTCCCCCCCCCCTCCCTTAAAAAATGATGAATTACTAATGGTGCCGC
-CCATGTTGTGTTTGTTGCTTTCCCCCCGTGCTCCATCATTGGGGGAACAT
-GACAGCCACCTTGAGTTACATGTATACAAAGTGACAGGAGGGAAAGATAG
-GGGTAAAAGTGCAAAAAGGGAGTCGCGGGTTCGAACCAGTGAGGGTTTGC
-AAAATTTGGGCTGTGCGCGGCGCCTTAGACTACTGCGCCACGCGTGCGAA
-CTGTAAATAGAACTGTCAGGCTAAATACGAACGTTCGGTTTTTAAACTCG
-ATTGGCAAAAATGAAATGAATGAATAGACAGGAATGACTCATATTTTTTG
-CATAAAGGGGCCTGGGTCTGGGAACTAGGAACTAAACTAAATGAAGGAAA
-ATTGAGGCATCTCCCGCCAATTGAGTAGAAAAGTGATGAGAGCGGCAAAA
-AGAGATAGGGGGGGGGGGGGGGACCCATTCATTTTACACTGGACACCACA
-CTCCCCACTCTCTCTTTGATGACGAAGGACATGAGTACGAACTCGCGAGC
-ACAGAAATACGACACGTTTTCTTCTCATTTTTTTTTTGCAAAAGGTGATG
-ATGATAATCGCTTCTAAACGAGGGGAAGTGTACTAAATAATAAAATTGCG
-AGTGGATATTGGATTTTTTCGTTATTTTCCGCTCTGAAAAACCTGAAAAT
-CAGTCGGAAATTCGAGTTTTGGCTAACTTTTTGTAAATTTTGTTTAAAAA
-ATCACTTTTCGCTGCGAAACCACCTGAAAGGATATAGTGGGCATGCGCCT
-TTGAGCGCTACAGTGGAGGGAATGCAGTATCTCTTGGAAGTCAGATTTGC
-CGATTGTTTTAACGCAAAACCTGAAGTATAGAAAAGAAAACATGAAAATT
-TATTGAAAATATAATAAATAAATTAAGCAAATTACATATCAACTGAGAAA
-ATCACCTGCTGGAGAGAAAAATTGAAAAAAAACCAGAAAATCGGCAGGAA
-AGCAATAATCGAGCAAGATCCTTGGAATTTTTAGGTGCAGATATCGGTTC
-AAAAGGAAAACACTATTTTAGCTTTTTTTTGTCTTAAGTTCAATGTTATA
-ACACAAGAAACGATATTTCTATGGCATAATTTTTGGGTCCTAGAAAGCAG
-ATTTTCACGTAGATTGGTCTGAAAATAATATTGGAGTAATTTTTATTATT
-TTTCCTTGCATTATAAAATTATTTCTCTTTTATTTCTCAATTCTAAAACT
-ATTTTCCCGTTCTTTTTCCCTATATCTCGCGCTTCTCCGGGATGTTGCAT
-CCCATTCGACGTGAGGAGTCTCGGAGTCTCTCCGCTGCAAACGCGCTCCA
-CTGGACACAGAAAATAAAAAAAATAAATTGTTCGAATTCATGCAATTTTC
-TTCTAATTTTCTCCGTTTTTCGTCAATTTTTCTGCAAAAAAGACAAAATT
-TACAGGTAGCAATGTATGGGGGATATCAAGGAGCATATGGGTAAGGCTAA
-AAACTAGGAAAAACTAGGAAAAACCCATGGAAAACTAAAAAACTCTGAAA
-TTTCAAATTTCAGAGCCTACGGGAACCAGCAGGCGGCTTCACAACCATAT
-CAACAGCAAGGACAACAGAATTATTACCCGTAACTCGAAAAAAATTCAAA
-AAATTCGAAAAAAATCAATTAAAAAGATCAAAATTTTCAATTTTTTCAGC
-GGAGTGAACCCGTACGCGGCGAATTATGGGTACGCGGCAGCACAGCTTCC
-ACCACCACCTCCACCACCGCCAGTATGCCTTAAAATTGAAGAAAATTTGA
-TTAAAAAATTGAAAAAATGCAAATTTTCAGGTAGCCGATCCATACGCCGG
-CCAATTTCAGACATTTCCCTCTCAAGCCACCAAAATAGCGCCGAATCCCT
-ACTTTAAAAAGCCACAAAATCAGCAGCAACAGGGTATTTTCGCCGTGTTT
-TCTGGCTGCAAAAAAATTAAATTATCGATTTTTTTAAGGCTACGACGCGG
-CGGTCTACAATTACGCTCAGCAGAATACTCCGAAAAATTGGAAACACGGC
-GGCGGCGGCCGGCAGGGGAGACAGGGATCTGGCGATAATAAACAGTACTA
-TTGTGAGGTAAAAAACGTGGAAAAAATCGAGTAAAACACAGTTTTTTATT
-CAAAAATCTGAGAATTTCCGTAAAAAATCCTGTTTTTTGACGTTTTTAAG
-CAAAAAAATCGGGTTTACAGCACTTTTAGAGATAAAAAAGTGGAAAAAAT
-CGAATTTTGGACCTGATTTTGGGCTTGAAAGCATGATTTTTATCAGAAAA
-CACAGTTTTTTTTGTCAAAAATCTGAGAATTTCTATGAAAAGTCTTGTTT
-TTGGATGTTTTTAAGCAAAAAAATCGGGTTTACTTCATTTTTAAGGGTAC
-AAAAGTGGCGAAAAGTTAATTTCTTGTAAATTTTCACATGCAAAATATTG
-AATTTATTAGGTTTTTTCCAGAAAAAGTAGTTTTTTTGCTACATTTACAG
-GCTTTTAAAACTGAAAACATGTTAAATTTCGAGGAAAATCGACAAAAAAA
-CCCATCTTTTGGCCAAATTTAAATTTTTGAGCAAAAAAATCGGGTTTGCA
-GCACTTTTAAAGATAAAGAACTGAAAAAATTCAATTTCTTGGAGAAAAAA
-GCAATTTCAACACCAAAAATAGCAAAAAATTCGGGAAAATTGTCAATTTT
-TTTGAAAAAAAACTTGAAAAACCGGATTTCCAGTTGTTTTTTCATGATTT
-TTTCTCAAAAATCTCATAAAAATTGGAAAAAATTCCGAATTTTTTACTGA
-AAATTCGAGAAAAATTGAAATTTTTTCAATTCCGATTTAAAAAACATTTT
-TCGCTAAAAAATTGAATATTTTTAGGCTTTAAAGTTCGGAAAAGATGCTG
-AAAATTCGGAATTTTCTGTTTAAAGAAATTTTTTTTGTGCTGAAAAATTG
-ATTATTTTTATGCTCCAAAAACTGGAATTTTTGAAAAATTCGGACAAAAA
-AATTTTTTTATTAGTTTTTAAATTTTTTTAATTTTTCAACCCGCTTTTTG
-CCCAAATTTAGATTTTTTATTTAAAAAATCGGGTTTACAGAACTTTTAAA
-GGTAGAAAAACTGCAAAAAGTTAATTTCTTGGATATTTTCAGGCTTTAAA
-GTCCAAATAAACATGTTGAAAATTGAAATGTCTTCAATTTCGATTAAAAA
-CATTTTTTTCGCTAAAAAATTGAATATTTTTAGGCTTTAAAGTCCAAAAA
-ACAAGCTGAAACTTGAATTTTTTTCATTTTCAATTTAAAAAAATTTTGCT
-CAATAGATTTTCAGGCTCCAAAACACTGGAATTTTGGACTTAATCGAAAA
-TTCGGACAAAAAAATATTTTTATTAGTTTTTAATTTTTTTAATTAAAAAA
-AATCCCAATTTCCAGGTGTGCAAAATCTCATGCATTTTTAGGGTTAAAAT
-TGGAAAAAATTATCAAAAATTTTCGAATAAAAATGGAATAAATCTGATTT
-TTATAAATTTTTCGAAAAAAAAATGATTTGTTGGCAAAAATTAAATATTT
-CAGGCTTTGGAAGTCCAAAAACCATGTAGAAAATTCGGAAAAAATCGAAA
-AATTGGAAGAAAAAAATTTTTAATTTCAAAAAATTTCAAAAAAATATTTA
-AAGCTGGTGTAGTCGACTTTATTTATTGCTTAAGTAGACTCTAAATTGCC
-TGGAAACACCGAATTTCATAATGAAACTTCTTGAAAACTTCTCAAAAAAA
-AAAGTTATGACGGCTCAAAAAATGGACTAAAATTAGTTAAAATTTGAAAT
-TTGACCGACTTTTCAAGCGGCTGGAAACATTTTTTCTTTGAAATCACCGT
-CAAATTTTGAGTATACTGTGCAATTATGTTGCGTTTTCAACTTCATTTAG
-GTATTTTAAAGTCAAAGGGCGGCGAGATTTTTAATTTTTTGAACCAAATC
-TCGCCGACCATCGACTTTAAAATATCTAAATCGAGTTCAAAACTCAAGAT
-AATTACATTATATAATCAAAATTTGACGGTGATTTCAAAAAAAAGGTAGT
-TTCTAGCCGCTTGAAAAGTCGGTCAAATTTCAAATTTTAACCAATTTCAG
-GCCATTTTTTTAGTCGTCATAACTTTTTTTCGAGAAGTTTTCAAGAAGTT
-TCATTATGAAATTCGTTGTTTTCAGACAATTTTGAGTCTGATAAAGCAAT
-AAATAAATTCGACTACACCGCCTTTAAATATTTTTTTGAATTTTTTTAAA
-ATTAAAATTTTTTTTTCCAATTTTTCGATTTTTTCCGAATTCTCCACGTG
-GTTTTTGAACTTCCAAAGCCTGAAATATTCAATTTTTGCCAACAAACTAT
-TTTTTTTTCGAAAAATTTATAAAAATCAGATTTATTCCATTTTTATTCGA
-AAATTTTTGATAATTTTTTCCAATTTTAACCCTAAAAATGCATGAGATTT
-TACACACCTGGAAATTTGGAATTTATTTGTAGAATTTTTGGATTTTTTAA
-TTAAAAAAAAGTTTTTTCCGATTTTTTTTCCGAATTTTCAACATGGTTTT
-TGAACTTCCAAAGCCTGAAAATGATTTTTTGAATAACTTTTTGATTTTTT
-CGGTTATTTTTGGTTTTTTTTTTTAATTTAAAAAAATTAAAAAATTAATA
-AAAATATTTTTTGTCTGATTTTTCGATTAAAGTCCTGAAAAAAAAATCTA
-TTTTATAGCAAAAAATCCTAATTTTCAGCCTGTTTTTTTGCCTTGATATT
-CAATTTTTACAAAAAAATTTTTTTTGGAGTTTTTTGCCTAAAAAATCGAA
-AAAAAAAATCATCTTTTCTCGAATTTTTGGAAGAAAAATTAAAAATTTCA
-AAAATAATTCAATTTTTTGGTGTTTTTCGGGTTTTTTACATAATTATTTT
-TTAATTTAAAAAGTTTGTAAATAACCATAAAAATTTATAATTTTTTAAAT
-TAAAAAATAATTATTAAAAAAAACTCGAAAAACACCAAAAAATTGAATTA
-TTTTTGAAATTTTTAATTTTTCTTCCGAAAATTCGAGAAAAGATGATTTT
-TTTTCGATTTTTTAGGCAAAAAACTCCAAAAAAAAATTGTTTTGTAAAAA
-TTTAATATCAAGGCAAAAAACAGGCTGAAAATTCGGATTTAAAAAAATAA
-TTTCTTGCTATAAAATAGATTTTTTTCAGGACTTTAATCGAAAAATCAGA
-CAAAAAATATTTTTATTAGTTTTTTAATTTTTTTAAATTAAAAAAAAAAT
-CAAAAATATCCGAAAAAATCGAAAAATTATTCAAAAAATCATTTTCAGGC
-TTTGGAAGTTCAAAAACCATGTTGAAAATTCGGATAAATAAAAATATTTT
-TTTGTCCGAATTTTCGATCAAAGTCCAAAAACTTCCAGTTTTTGGAGCCT
-AAAAATAATCAACTATTGAGCAAAATTTTTTTAAATTGAAAATGAAAAAA
-ATTCAAGTTTCAGCTTGTTTTTTGGACTTTAAAGCCTAAAAATATTCAAT
-TTTTTAGCGAAAAAAATGTTTTTAATCGAAATTGAAGACATTTCAATTTT
-CAACATGTTTATTTGGACTTTAAAGCCTGAAAATATCCAAGAAATTAACT
-TTTTGCAGTTTTTCTACCTTTAAAAGTTCTGTAAACCCGATTTTTTAAAT
-AAAAAATCTAAATTTGGGCAAAAAGCGGGTTGAAAAATTAAAAAAATTTA
-AAAACTAATAAAAAAATTTTTTTGTCCGAATTTTTCAAAAATTCCAGTTT
-TTGGAGCATAAAAATAATCAATTTTTCAGCACAAAAAAAAAATTTTTAAA
-CAGAAAATTCCGAATTTTCAGCATCTTTTCCGAACTTTAAAGCCTAAAAA
-TATTCAATTTTTTAGCGAAAAATGTTTTTTAAATCGGAATTGAAAAAATT
-TCAATTTTTCTCGAATTTTCAGTAAAAAATTCGGAATTTTTTTCCAATTT
-TTATGAGATTTTTGAGAAAAAATCATGAAAAACCAACTGGAAATCCGGTT
-TTTCGAGTTTTTTTTCAAAAAAATTGACAATTTTCCCGAATTTTTCGCTA
-TTTTTGGTGTTGAAATTGCTTTTTTCTCCAAGAAATTGAATTTTTTCAGT
-TCTTTATCTTTAAAAGTGCTGCAAAAAACTACTTTTTCTGGAAAAAACCT
-AATAAATTCAATATTTTGCTTTTTTTTTTCCTTTTTTTGTGAAAATTTAC
-AAGAAATTAACTTTTCGCCACTTTTGTACCCTTAAAAGTGCAGTAAACCC
-GATTTTTTTGCTTAAAAACTTCCAAAAACAGGAATTTTCGGGTTGAAAAA
-TTAAAAAATTTTAAAAACTAATAAAAATATTTTTTTGTCCGAATTTTTCC
-AAAATTTCAGTTTTTGGAGCCTAAAAATATTCAATTCTTTAGCGAAAATT
-GTTTTTTTTTCAAAAACTTCCTACGACTACACCACCTTTAAAAAACCAAA
-TTAAATTAGAGAAATTCTTCAAAAAATCCCCAAATTTCCAGGTTTGCAAA
-ATCTCGTGCGCCGGCGGAATCACATACAAAGAGCATCTGGAAGGTCAACG
-GCACAAGAAAAAAGAAGCTATGGCAAAACAGGGCATACCGAGCACTTCCC
-TCGCTAAAAATAAGCTTTCCTATCGTTGTGACCTATGTGACGTCACTTGC
-ACCGGTCAGGACACGTATTCGGCTCACGTTCGTGGCGGAAAACACTTGAA
-AACTGCACAATTGCACAAAAAATTGGGAAAACCGGTGCCTGAAGACGTTC
-CGACGATTATTGCTCCGGGAGCCGATGGGCCGACGGAGACGAAAGCCAAA
-CCGAAATGGCATCAACAAGCTCTGCCTGGCGGGAAAATGTGCGGAATTTG
-AAAAAAAAATTTTGGAAAAAAACGAGAAATTGCACATTTTTAGGCTCAAA
-AATCTGAAAATTTAGCAAAAAAATTTAGAAAAATTTGGATTTTTAGAAAA
-AAATTAGCGTTTTCTCGCCAAAAATGCTCAATTTTCGATAAAAATGTACA
-TTTTTTTTTTTGGATTTTTAAAAAAATATTTTAGGGCTCAAAAATCTGTA
-AATTCTGCAAAAAAAATTCTAAAAAATTTTGAAATTTTGAGATTAAATCT
-TTCGCCAAAAAAACGAAAAATTTGAATTTTACAACTTAAAATGCTCAATT
-TTCGAGGAAAATGTAAAATTTTTTTTCAATCTGAAATCTGTAATTTCTTT
-TAAAAAATCGATTTTTTAAAAAATTTCTACTGTAAAATTTTGAAAAAGTT
-GAACGACGTCAAAAAGAAGGTAAAAATCCGAAAAAAAGCAACAAAGAACT
-AGGAATTTTAAAATTTCCAAAAATGGTCTGAAATTTTGAGAAATCAAAAA
-AAACAAGTTTCTTTCAGTTTTTTTTAGAAAAAAAAATCGTATTTCAGAAT
-TTAAATTTAAAGCATATTTTAAACTTTTAAACGCAAAAACATTATATTTT
-TCTTTAAAAAAAAAACAATTTAAACGCATTTATTGCTTTATTAGACTCAA
-AATTGTCTGAAAACACCGAATTTCATAATGAAACTTCTTGAAAAAAAAAA
-GTTCTCAAAAAAACAAGTTATGATTGCTCAAAAAATGGCCTCAAATTAGC
-GGAAATTTGAAATTTGACCGACTTGTCAAGCGGCTGGAAACTAGCTTTCT
-TTTTTGAAATCACCGTCAAATTTTGAGTATAAAATGTAATTATCTTGCGT
-TATCAACTTGATTTAGGTATTTTAAAGTCGATGGACGGCGAGACTTTTAA
-AGGTGGAATACCGAAATTTAAGACTTTGCTTTTTTAGACCGAAATTTTGG
-CAACTTATCGGTGCGACACTGCAAAATTGCCAAAGTTTGAGATTTTAGCT
-AAAAATAGGCCGTTTTTTCCAAAAACTTTGATCGGCCATAACTTTTTTTT
-GGAAAATTTTCAGAACGTCTCATTACGAAATTCGGCAGTTTTGGGCCATT
-TTGGGTCTAAAAAAGCAAAGTCTTAAATTTCGGTACTCCACCTTTAAAAA
-TCTCTCCGTCCATCGACTTTAAAATACCTAAATCAAGTTGATAACGCAAG
-ATAATTACATTTTATACTCAAAATTTGACGGTGATTTCAAAAAAAAAAAG
-TTTCCAGCCGCTTGGCAAGTCGTTGAAATTTCAAATTTCCGCTAATTTGA
-GGCCATTTTTTGAGCAATCATAACTTGTTTTTTTGAGAACTTTTTTTTTC
-AAGAAGTTTCATTATGAAATTCGGTGTTTTCAGACAATTTTAAGCCTAAT
-AAAGCAATAAAAAATTAGAATATACCACTTGAGAAAAATTAAAGATTTTT
-TTAAGTTTAAAATAAAAAAATATGTTTCTTTCCGATTTTTTGATAGTGAG
-ATAAAAGTTTTGGCGGGAAATTCAAATTTTCTAGAAAAAAAATTGAAAAA
-ACTCATAGTGTATAACTGCACAGAACGGCTGGTTATGAGTATAGGTGTCA
-AAGTGTCTCATTTCGGTTTGATCTACAAAAAAAGCGGGAATTTTTCCCAA
-AAAAAGTTACGTCAAGATGCTCTTTTTTATTAAATTTAATTAAAAAAGAG
-AGCATGCTGACGTAACTTTTGAGGAAAAATTCCCGCTTTTTTTTGTAGAT
-CAAGCCGAAATGAGACACTTTGACACCACCACGTTCAGACAAAATCCCCC
-ACTAAATATTTGGTAAAACTAGTTCAAAACCCGACTGTAGTACATTTTTG
-GCAGAAATTTGAAAATTTCAACTTAAAACCGCTCAATTTTTCCAAAATTT
-CACAGTATGCATTTCAAAAATTATGGTTTTGTTTTTTTTTAATCGAAAAA
-TATATTTTTAACAAAAATGGACCATTTTTAGTTGTAAAATTCAATTTTTT
-GGCGCTTTCAAATTTTTAGGCAAAAAATGTGCAATTTTCTCCAAAAATTT
-TCAGATTTTTTAACCCTAAAATTAAAAAAAAATCTAAAATATTAGAATTT
-CCCGCTTTTTTTTTCAAATATTTCAATTTTTCCAATTAAAACACAAAAAT
-TGAGCATTTCTAGTTGGCACATTCAAATTTTTAGGCGAAAAATTTGATTT
-CAAAATTTCAAAATTTTTCAGAATTTTTTTTTGCTAAATGTTCAGATTTT
-TGTGCGCAAAAATATTTGAAAAATCCAAAAAAAAAACTCGAAAATTGAGC
-ATTTTCAGTTGTAAAATTCAACTTTTTAGGCGGAAAAATGTGCAATTTTT
-CCCCAAAAAATTCAAATTTTCCAACTTTTCTCTCAAATAGCACAGAAACA
-GAAAATTTGTTATACCTAATGTGGAAAAACTGAATTAAAACAGATTTTTT
-GAAAAAATGCACTTTTTTTTTTGCCAAAAAATAGTTCAAACCCCGACTTT
-TTGTTCCAGAGTTTCCAGGTCATCGGTATCATCGCATAAATAAATTTTGC
-GGGAAAAATTCCCGCTTTTTTTGTAGATCAAACCGAAATGAGACACTTTG
-ACACCCCACGTTCAGACAAAACCCCGACTTTTTTCCAGAGTCATCGGCAT
-CAACACGGTAAACTTCGTCGGCGGTACGAAGCTCAACTCCACCGGACAAC
-TCGAGGAGAAGAAGCGCGAAGTTGCTGCCGCCGTGAGCTCAGTCGGCCGG
-AAAACCGGTGGTGCTGCTGCAACGACGACGATTGAGGTGGAAGACGAGAA
-GCTCCGAGCAATGATCGCCGCCGAGGAGGTACAACCTGTCGGCGAGGAAC
-ATGTCACTGAAGAACGTGATGCTACCGGAAAACTGGTGCAATTCCATTGT
-AAACTGTGCGATTGCAAGTTCTCCGATCCGAATGCCAAGGAGATTCATAT
-CAAAGGTCGTCGACATCGTGTCAGCTATCGGCAGAAGATTGATCCGACGT
-TGGTGGTGGATGTGAAGCCATCGAACAAAAGATCACAGGAGAAGCGGAAG
-AATCAGCTTCCAGCAGTTCATGGTGTGTGGATTTTTTAACAAAAAATCAA
-CAACAACACAAAAAACATGTTCCAATAAAATTGGAAAAAAAAATTTAAAA
-AATCCCAAATTTCCAGGTGTCTAAAAATCTCATGCATTTTTAGGGTTAAA
-ATTGGAAAAAATTATCAATTTTTCGAATAAAAATGGAACAAATCTGATTT
-TTATAGAAAAAATAATAATTTGTTGGCAAAAATTGAATATTTCAGGCTTT
-GGAAGTTCAAAAACTATGTAGAAAATTCAGAAAAAATCGAAAAATTGGAA
-GAAAAAAATTTTTAATTTGAAAAAATTCAAAAAAATTTAAATTTTTTTAA
-AAATTGAATTTTTGAGTAAATAATTTTTTGCTATAAAATTCAATATTTTC
-AGGCTTTCAAGTCCAAAAACCGTGTTGAAAATTCCGAAAAAATCGAAAAA
-TTGGAAAAAAAATTTTAATTTAAAGGTGGACTACGCTCAGTGGGGGGAAA
-TTGCTTTAAAACATGCCTATGGTACCACAATGCCCGAATAGCATAATAAA
-AAAATTTTAAAAAATATTCTAGATTTTATATGATTTTTTGAAAATTGGAA
-AAATCACAGTTTTTGCCTAATTCCTATTTGAATTACCGCCAATTGGATTT
-GTTCGGTGGAGCGCGCTTGCATGTTTTTAAATTTATTTATTTTATTTATT
-GTTATTTTCCACCGATTTTTAATGTTTTCGATGTATTTTTGTTTGAATTT
-TAGAGAAAAAGTCAAAATAAATACTAATTATCGATTAAAAAGCACGCTTA
-CAGGCGTAAATCAGTGAAATTAATTAACTCAGGTTCGAAATCGTTTAAAA
-TCGTTACTTTTTCATTTTTACGCCTGTAAGCGTGCTTTTTAGTCGAAAAT
-TTGCATTTATTTTCACTTTTTCTTTAAAATTCAAGCAAAAATACACCGAA
-AACATGAAAAATCGGTGGAAAATAACAAAAAATAAAATAAATAAATTTAA
-AAACGTGCAAGCGCGCTCCATCGAACAAATCCAATTGGCGGAAATTTAAA
-TGGGAATTAGGCAAAAACTGAGATTTTTCCAATTTTCAAAAAATCATATA
-AAATCAGAAAAATTTTTGTTTTTTTTTTAATTTTTTTAAACATGACATTC
-GGTCATTGTGACCCCATAGGCATGTTTTAAAGGTGGTGTAGTCGAATTTT
-TTTTATTTCTTTATTAGACTCAAAATTGTCTGAAACCCCGAATTTCATAA
-TGAAACTTCTTGAAAAATTTTCAAAAAAAAGTTATGGCGGCTCGAAAAAT
-GGCCTAAAATTAGTGAAAATTTGAAATTTGACCAACTTATCATTGTCGCA
-TCGGCTGGAAACAATTTTTTTTTTGAAATTGTCGTTCAATTTTGGGTGTA
-CAGGTCGATTATCTTGCGTTTTCAGCTTTATTAAGGTATTTAAAAGTCGA
-TGGACAAATGGATCTGTCAAATTTTTTACCAAATCTTTTCGTCCATCGAC
-TTTTAAATACCTAAATAAAGCTGAAAACGCAAGATAATCGACCTGTATAC
-CCAAAATTGAACGACAATTTCAAAAAAAAATTGTTTCCAGCCGCCGCAAC
-AATGATAAGTTGGTCAAATTTCAAATTTTCACTAATTTTAGGCCATTTTT
-CGAGCCGCCATAACTTTTTTTTTTGGAAAAGTTTTCAAGAAGTTTCATTA
-TGAAATTCGGTGTTTTCAGACAATTTTGAGTCTAATTAAGCAATAAAAAA
-AATTCGACTACACCACCTTTAAAGCAATTTCCCCACTGGGCGCTACTCGA
-CCTTTAAAGGGGGAGTAGAGTTTGTGGGTATTTTGCTTAAATAGACTAAA
-ATTGGTCCAAAACCACCGAATTTCATAATGAGACTTCACAAAAAATCTCC
-AAAAATTTTTTATGGCCGGTCAAAATTTCGAAAAAAAAAGATGCAACTTT
-TGCTAAAATCTGAAATTTCGCACACTTTTCTTTGTCTAGCAGCCGCTGGA
-TTTTAGTTTTTCTAAAATTATCACCCTCTAATCCTTCTTTTTGGTAATTT
-ATCTCGCGAAAATCCGTTGATTGAGACAACTTTTAGGCCGATAGGCATCC
-AAAAATGATCAATCTAGGGATGCCTATCGGCCTAAAAGTTGTCTCAATCA
-ACGAATTTTCGCGAGATAAATTATTAAAATAAGGATTAAAGGGTGATAAT
-TTCAGAAAAACTAAAATCCAGCTGCTGTGACAAAGAAAACTGTGCGAAAT
-TTCAGATTTTAGCAAAAGTTGCATCTTTTTTTTCGAAATTTTTTATTTTG
-ACCGGCCATAAAAAATTTTTGGAGATTTTTTGTGAAGTCTCATTATCAAA
-AATTCGGTGGTTTTGAACCAGTTTTAGTCTATTTAAGCAAAATACCCACA
-AACTCTACTCCCCCTTTAAAGGAATGAAAATAATTATTGGAACGTTTGTT
-TTTTAAAATGATTTTTTGTTAAAAAATCCACACCGACGAAAAATCCACAG
-TTTCAGAGCCTCCGAGCTTCATGAAAACGCCGTGGTTCGCCCCACCGGCT
-CCAGAAGGCCGGGAATTCAATATAGTAGATGATAGAACTATTAACGAAAA
-GTACGCCGGGCTTAATCCGGGCGTCGAGTTCATTTCCAATGTGGATCGCC
-TTATTTCGGATATCAATGAATCGCTGAAGTATGTGTCGGATAAGATCGAG
-CGAGACGTTCGGAAGATCCCTGAAGACGTGGTGGAGCTTCCCACCACCAC
-CACCACAACGGAGCAGCCGCCGCGGACAGTGTTGGGATGCTCGAGAGTTG
-GAATTATTGCGAAGGGAACGTTCATCAAAGGGGATCGGTGTGCGGAGGTG
-GTTCTGACGTGTACGCCGGTGCCGACTTCGGGGCTTGTTGAGCAGATTAG
-GCGGTTGTTTGGAGAGTCGACGGTACGGGCCGGCCTTTTTTTTTTGCCGG
-AAATTTGGGGATTTACCGGTTTGCCGGAATGTTTTTTTTTCCGGCAAATT
-GCCGGTTTTCGCCGGAAATTTGAAAAACGGCAAACTGGCAATTTGCCGGA
-AATTTTCAGTTTCGGCAAACTGCCGCGATTTGCCGGATAACAATCGTTTA
-TTCCGGCAAATTCGGTAAGTTGCCGGTTTGCCGATTTGCCGGTTTGTTGA
-ATTTAGCGGAAATACGGCAAACGGCAAGTTGCCGGTTTCCCGACTTACCG
-GAAATTTGAAAAACGGCAATTCGCCGGTTTGCCGGAAATGTGAAAAACGG
-CAAATTTCAGAATTCGGCAAGTTGCCGGTTTTTGCCGGAAATTTTCATCT
-TAGGAAAATTGCCGGTTTTTGCCTGAAATTTTCATTTCAGGAAAATTGCC
-GGTTTGCCGGTTTGTCGAATTTTCCGGAAATGTGGAAAACGGCAAGTTGC
-CGGTTTGCTGATTTGCCGGAATTTTTAATTTTCGGCAATTTACCGATTAG
-CCGGAAATTTTTTAACGGGATTTTTGATAAGACGGATTTTTTTCCGGCAA
-ATTCGGCAAGTTGCCGGTTTGCCGGAATTTTTCATTTTTGACAAATTGCC
-GATTCGCCGAATAATAATTATGCCAGAAATTTGAAAAACGACAAGTCGCC
-GGTTTGCCGATTTGCCGGAAATTTCAAAAAACCGGCAATTTGCAGAATTT
-TGCCGGAAATTTTCATATTCGGCAAAGCTACCGATTTGTCGGATTTTTTA
-AACCGGTTTTTTCATAAGATAGATTTTTTTTCCGGCAAATTTCCGGCAAG
-TTTCCGGTTTGCCGGAAATTTCAAAACCGGCAATTTTCCGAATTCTGCCG
-ATTTCTTGTTTGACAATCTCAATAATTACACAGACATCTCTAACAATTGA
-GCCGGATCCCGAGTCCCCATCAAGCCTTATCGTCACAGCTAACTACTTTC
-CCAATATGAAATGTCGTATTCTAATCACTTCAGCTGTAGTTAGAAAAGAC
-GATGATAGTATTGTAACTGGATGTGCTGCTGATAAGGATTTGTGCATTTA
-TGCGCTCGCTTCTATTCGGAATACAAAGTGGTATGATGTGAGTTTTTTTT
-AAATTTTACACATATTTTAAATTACTTTATCATTGGAAAATCTAATAAAT
-TAGAGCCCAGTTTACAAAAAAATCTATATTTTTCCAAAAAAAAAATTGAA
-AAAAATCGATAATTTCTCAAAAAATGTTTACAAAATCGAACTTTTTCCAA
-AAAACTTTGAAAAAATCGATAATTTTAAATAACTGCTGACAATTAAAAAA
-AATCGAAAATTTCTCAAAAATTGAAAAAATTAATATTTTTCCAGAAAAAA
-TTGAAAAAAATCGATAATTTCAAATAATAGCTGAAGATTTTTTAAAAAAA
-TCGAAAATTCGAACCTTTCTCAAAAAATTTGAAAAAAATCGATTTTTTTT
-CCAAACTTTTTTTCATCAAAAATTTCTCAAAAATTTGGAAAAAATTAGAA
-AAAATCAATATTTTTCCGAAAAAATTTGAAAAAAAAATCGATAATTTCAA
-ATAATAGTTGCAATTTTTAATTTAAAAGCGAATTTTTCAAAGATTTTTCA
-AATTTTTCACGTTTTTTTCTCTGGTTTTTTTAAATTAAAAAGCGTAATTT
-TTACCGAATTTATCATTAAATTACATGAATTTTTCTGAAAGAGCGAGAAA
-ATTAAAATAATTCGGAAAAAAAACAATTTTTTTCCAAATTTTCCAAAAAA
-TCCCACAGAAACCACCAAACTTTACTTTTTTTTTTTAACAAAAAAAAGTT
-TTAAAAAATATCAATTTCCGGCTTTTTTTCTGCCAAAAACTTTGGAAAAT
-GTGGGTAATTTTGGCTTTAAAAGTTTAAAAATTGAAAAAATCAGGAAAAC
-TTTTTGAATTTTCAGAGTCACTGCCAATACTTGAACTCGTGCCAATCAGT
-TATTCGACTGCTCCGAGATTTGCGAAATAAATATCCTGAAGTTGCGTGTC
-TTGATGATTATGTAAGTTTGAGAGTTTGGAAAAATATTCGAAATTTTTTG
-TGAAAAATTTGGTAAAAGTTCAAAATAATGTATAATTCTTTAATTTTTTT
-GCGAAAAAATTAATTTTTTGAAAAAAATTCTCTATATTTTTTGCTAAAAA
-GTTTAAAAATCTAAATAGTATGAAAAAATATTTTAGCAGAATCAACAAAA
-ATTGTATAAATTCATAATTTTTTGAAAAAAATGAAATAAATTTTTTTTTG
-CGAAAAAAATATGCGAAATAGGTTTTTTTAATGCAGGAAATAGTTTTATA
-GCTGAAAAAATGAGAAAAAACGGAGAAAATTGAAAAATTACGTACATTTT
-GCAGATTTTTTGCTCACAATTTTGTAAAAATTTCGGCAAAAATATCACCT
-TATTCAAAAAAAAATTGCTAAAAAAAATTTTTATAATACAAAAAAAATAT
-GAAATCTATCTATTTTTTTCAAAAAATCTACCTAAAAATCTATTAATAAT
-TTTCAATTTTTTTGTGAAAAATTTTGAAAAAATTCAAAATAATGTATAAT
-TCTATAATATTTGGCGAAAAAAATTAATTTTTGAACTATAATTTTTTTTT
-TGAAAACTAGTTTCAAAAATCGATATTTCACCTAAAAAAAACCCTAAAAA
-TAGGCGGCAAACTATTTTTCCGGCAAATCGGTGGTAATTGCCGAAATTTT
-TGGCAAATTGTGGCTTTGCAATTTTTTTTTTGTTGGAAATTTCAGATTTT
-CAAATTTAATCGGCAAGAAAACTGAAAAATCCCGTTTAAAAAATTCCGGC
-AAATCGGCAAACCGGCAAATTGCCGAATATAATATTAGGTCTCCTAATAA
-GTTCCGGGTCAAAAATCATAACCTTGTTCGCTGTGTATCGATTTTTATGA
-AACTTTGGGAGTTTATGTTATCAACCATGATCTTTCAATTGACAATAGTC
-ACAAAATTTTTTGACCACCCCAAGTGCCCGTACTCGGAGCCAATTTTTTC
-AGGCATTTTTCTGATCTCGCTTCTTTTTATCTTTGAATTGAGGTTTGTGT
-GCGGATTTTGCTTTGTTTAGAATACATCATTAGAAAACGAGAAAAGTTTG
-GAAAAAAATCTGTCCAAAAAATTTTTTTTGGTTGATCGTCAAAAAAGCTT
-CAAAAAGATTTTTGTCGAAAATTCTAGATTTTTCATACAAAAATGATGTA
-ACCAAGTGTAAATTATTTTTATACATACAAAACATATCAATTTAGTTCGA
-TACACTAAAATGATAATAAAAAATATAATTTTTTCGGATAATTTTTGAGT
-TTTTTGAATATTTCTTAAGTTTCAAATTTCAAACTAAAAGGATTTGTGTG
-TGTAAAAATAATTTACACTTGGTTACATCATTTTTGTATCAAAAATCTAG
-AATTTTCGACAAAAATCTTTTTGAAGCTTTTTTGACGATCAACCAAAAAA
-AATTTTTTGGACGGATTTTTTTCCAAACTTTTCTCGTTTTCTAATGATGT
-ATTCTAAACAAAGCAAAATCCGCACACAAACCTCAATTCAAAGATAAAAA
-GAAGCGAGATCAGAAAAATGCCTGAAAAAATTGGCTCCGAGTACGGGCAC
-TTGGGGTGGTCAAAACATTTTGTGACTATTGTCAAATGAAAGATCATGGT
-TGATAACATAGATTCCCAAAGTTTCATAAAAATCGATTTGCAGCGAACAA
-AGTTATGATTTTTGACCCGGAACTTATTTGGAGACCTTATACAATTTTTC
-AACATTTTCCAGAAAATGGAGCTAATCGTCTCGAACATTATCGATTCATC
-TCCAATGTCACTTGGACTATCCGATGCGTTTAAGCGAATTGTCGAAGCAC
-TTGCATCTGGATATTTGTATTCTGGTAGGGGGGTTAACATTTAATTTTTT
-TAAAATATTGAAAAATGAGCATATAAAAAGTTTTAAAATAATTCAAATTT
-TTACAAAAAAAAAATTTTTTTTTTCAATTATTTTGCGTTTTTGTATGAAA
-ATTGTGTTTTGAGAACGGAAACTCTTTTTTTTTAATTAAAATTTTGAAAA
-AAAATCCTGGAAAAATGCTGAATTTTTCGGGATTTTTCGGAGCACATTTC
-CAAGCTCTAAAAATTGCTGAAAATTGAATTTTTCAGAATTTTTTTGAATT
-TTGCACAAAAATGACTATTTTAGGAACAAAAAAAACATTTTTCAATCACC
-GAAAAAATGTATTAATTTTATATTTTAATGTTAAAAATACGGTATTTAAA
-TTTTTTTTAAACGTTTTTTTTACACAAAAAGTTGAAATTAGGTTGAACCC
-GGATAAAATTTAGAAAAATTAAAATTTCAATTTTTTTTGCGTTAAAATAT
-GTTTTTTAAGGTTGAAAAAAATATGTTTATTCAAATAAACACATTTCTTG
-AAAAGTTCTTTTGATTTTTAATATTAAAAAATTTATTTTTCAAAAAAAAA
-TTTATTTATTTAATTTTAAAATTTTAAAAACTTTAAATGTGGTGTAGTCG
-ATTTTTTAAATTGTTCTATTAGACTCAAAATTGACTGAAAACACCGAATT
-TCATAATGAAACTTCTTGAAAACTTCTCAAAAAAAAGATATGACTGCTCA
-AAAATGGCCTAAAGTTAGTTAAAATTTGAAATTTGATCTACTTGTCAAGC
-GGCTGGAAACTATTCTTTTTTTTGAAATCACCGTCAAATTTTGAGTATAA
-AATGTAATTATCTTGCGTTATCAACTTGATTTAGGTATTTTAAAGTCGAT
-GGACGGAGAGATTTTTAAAGGTGGAGTACCGAAATTTAAGACTTTGCTTT
-TTTAGACCCAAAATGGCCCAAAACTACCGAATTTCGTAATGAGACGTTCT
-GAAAATTTTCCAAAAAAAAGTTATGGCCGATCAAAGTGTTTGGAAAAAAC
-GGCCTATTTTTAGCTAAAATCTCAAACTTTGGCAATTTTGCAGTGTCGCA
-CCGATAAGTTGCCAAAATTTCGGTCTAAAAAAGCAAAGTCTTAAATTTCG
-GTATTCCACCTTTAAAAGTCTCGCCGTCCATCGACTTTAAAATACCTAAA
-TCAAGTTGATAACGCAAGATAATTACATTTTATACTCAAAATTTGACGGT
-GATTTCAAAAAAGAAAGCTAGTTTCCAGCCGCTTGACAAGTCGGTCAAAT
-TTCAAATTTCCGCTAATATGAGGCCATTTTTTGAGCAATCATAACTTGTT
-TTTTTGAGAACTTTTTTTTTTCAAGAAGTTTCATTATGAAATTCGGTGTT
-TTCAGACAATTTTGAGTCTAATAAAGCAATCAAAAAAATATTCGACTACA
-CCACTTTTTGGCCTATTTTTTTGGCCTAAAATTGAAATTTTTCCAGCAAT
-CCTAAGCGATCCGTGTGAGACGTCTCGTCCGAACGTTCTCGATGCTTTAA
-CCGACGAGCAGAAGCATTCGTTGACCGCCCTGGCACAGAATTTTGTTCGG
-CAAATTGCATTCAATCAGATACATGAGGTATGCGGGGATTTTTCCTGTGC
-AGAAAAAATGTTTAGTAAATTAGGGAAAAAAACCTTGAGTTTTTAAAAAA
-ATCTGTGGAAAATTTGAAAATTTTCGCAAAAAAAAAATTATAATAAAATT
-AATTTCAAATTTGCAAAAATTTCAATTTTTCAAATAAATTTTGAATTTGC
-ATTCCAAAGTCACTAAAATGGAAAAAATTGCTAAAAATTGAATTAAAAAT
-ATTTCTTTCCTGAAAATTTTTTATTTTCCGAGAATTCTGAAATTTCTTTT
-AAAAAAAATTAAATTCGCGAAAATTTGAAATTTTTTGGAATATTGCAAAA
-AATTGCTAAAAATTGAATTTTCCTATATTTCGATTTTTTAGATTTTTTAA
-AAAAGTTTTTTTTCAGCCATTTCTGGCCGAAAATTGAGAAAAAATAGTCA
-GAAAATTCAAAAAATTGCTTTTTTTTTTCAATTTTCCGAAATTTTGAATA
-TTGATCGTCCGAAAATTTAAAAAATAATCGCTAAAAAGTTGAAAAAAAAA
-TTATTGAAAACAATTTTTTTAAAATAATTTCTAGCAGATTCCATGAAAAA
-AGGCTGAAATTTACGAAACAATTTTTTTTTCAAATTCAATTCAGAAAAAA
-TTGAATTTTCTCTGATTTTGGGCCGATATTTATAAGATTTTTCAGAATTT
-TCCAAAAATTCTTGAGAAAAATTGAAATTTTTCTGCCGTATTCCTATGAA
-AACAGCGGAAAATTGAATTTTCCAAGTTATTTTTATAGGGAAAATTATAG
-TGACTCTATAGAATTCATGAAAAATTCTGACAAAAAACCAAACATTTTGG
-CCCAAAATCAGAGAAATTTCACAAAAAAAAATGCTGAAAAATTTAATTTT
-CAGCAATTTTTTTTTCAAATTTTTTTAAAAAATAAATTTTCGTAAATTTC
-ATAATTTTCAGTTTTTTTCCATTTTTTTAAAGAAAAATTATTTTTCCAAA
-AATGTGCAGAAATTTCAGAATTTTCGGAAATTAAAAAAATTTTTAGCAAA
-AAAAAAAATTTTTTAATCCAATTTTTATGATTTTTTCACTTTTTCGGTGG
-TATTAGGACTGCAAATTCAAAGTTTCTTGGAAAAACATAAATTTTCAGAA
-AATTTAAAATTAATCTGATTATAATTCGGAGCATAAAATGTGCTTTTATC
-AACAACATTTTTTTTTTCGAAAAGTCAAATTTTTCCACATTTTTAAAAAT
-TCCTTTTTTTTGTATATATTCGGATTTAAATTTTTTTTTTAACGGGTTTA
-AGCTATTTTCTGAGCAAAAAAATTGAATTTTTCTAAAATCACCATTTTTC
-TTCCAGATTCTCGGAATCGATCGTCTTCAAGACACTATTGATCTACCAGA
-GGATGCTCCGATGCTCAAAAGACCACTGGAGAGCAATGAAAATGCTGAAA
-ACGCAGAAAATCTCGACGATTCGCCAGTTTCCAAAAAGGAGAAGCTCGAC
-GAGGAGCCCGCCGATATTTGAGCATTTTTATTTTAAATTTGGTTTAAATT
-ATTTAATTTTCCTCTAATTTTCCTCATCTCTGTGTTTTTTTCTAATGTTT
-TTGGGTCCCGTAGCGAAAAAACGAATGGCTCTCTTCGCGGTGAGACCTTG
-AAATTTTTATTTTTCTACTATTACCTCCCCCTGCAAACGCGCTCTATTGA
-CGACAATTCGCAATGGAGCGCGATTGCATATTTTGTTACTACATTTTCCA
-CACTCATGTTCGATCTTCCACTAGGGGAGGGTCTCGCAGAAGGATTTTTT
-GAAAAATTTAGATTTTTTTTTGAAAAATATTCGAAACAATTTTACGTTTT
-TCGAAAAAAGTCCTAATTTAGCCTAAAAAATCAAAAATTGATAGGATTTT
-TGAAAAAAATTCAAAAAATCAAAAAAAATTGCAAAAATTTTTATTTTTTT
-TTTTGAAGAAAATTTTTTGTAAAAATTTGATTTTTTTGAAAAAGTTTGAA
-TTTTGAATTTTTTGAAAAATTCTAAAAATTTTGAATTTTTTGAAAAAAAC
-TCAAAATTTTTGGAAAAATTTTGAATTTTTTTGAATAAATTCAGAACTTT
-TTGAAAAAATTCGAATTTTTCTGAAAAAAACTCAAAATTTTTGGAAATAA
-TTGAATTTTTTCGAAAAAATTCGAGAAAATTCCTAATTTAGTCGGAAAAA
-AATATTAAAAATTGATACGATTTTTGAAAAATTTTCCCAAAAATTCTATA
-GAACTGTCCTGAATTTCTAAAAAAAATTCAAAAAAAAAACAAAGTTTTTT
-AGAAATTTGCAAATTTCTTTAAAATTTTGGAAAAAAATCTATTTTTTGTT
-GAAAAGTCTGCAATTTCTAAAATTTTCCTATTTTTTCTGCTAAAACCTGC
-AAAAAAGGACCCTCCCCCTAACTATCTTGTTCCTCCAAAAACCGACAATT
-CTTCTGTTTTTGTGTTATAATCGTCCTTTTTCTTGTTCAACAAAACAAAA
-ATTAAAATAAATTAGAAGAAACGGTAAATTTAGATACGTTTTTGCCACGT
-GGCCGAGGTTTTTCACGGCCACGTGGCAAAGGCCGGCAAGAAATGCGCTG
-TGGTGGGAGAGGAAATTGATAGGGAAGAAGGAAGAAGAAAAAAAAAAGAA
-AAAATCAATATTTTAAAGCCAAAAAAAATTTTTCTGAAAAGACTAGCAAA
-ACAGGAATGGTTATGGGTAAAGCCGAGGTTTTGAAGGAGAATTTTTGGGA
-AAAAAATTGCAAAAAAAAACGAATCGGTAGGGACGGACCGGCAAGATTGA
-TTGAAAAATTGACGAAATTATCGATTTTTTGGCGGCGCACGGGGTTCTGG
-CCTTCCCTCATAAATGGAAGAGTTTTTGCCGAACTAGGCCACCAGGTCAT
-AACTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCAATTTT
-AGTTGTAAAACTAAATGTATTTGTCCGTGTGAAGTACACGACTTTCCCGG
-CGCGCGATTGTCAATGGAGCGCGAAAAATTAAGGGCCAGAAGTCCTCAGA
-ACCCCGTGCAAAAATCGATAATCCCGTTTAGAATCGGTGAGGGCGTGGAA
-AGAAAGAGATGATGAAACGGGAATGAGCAAAATTGCAAAAAAAAACAACA
-AGAAATTCCAGAAAATTCCATAGAAAACGGGGTCTAAAGCACCAGATTAG
-TGTTGTGCGTGGGCGTCCACTGTGACGTCATCACCTTCCACTTTTCGTAG
-TTCGACTCGAGCTGATCGGAGAGCTCGCCGAGCTTGGCGAACTCGGTGAA
-TGTGGCGAATGCTTCGCGGGCGAACATGTCTGTAAAATCAGAAATCAGGA
-GAAAATTCAATTTTGCGCGTCAACTTTGATGTTTTTTTGTGTTGGTGAAC
-TTCAGAAAATTGAATTCGCCAAATTTTACGAGCAAAATTGGGTTCTTTTG
-GTATTTTTCGTGGAAATTTAACCAAAAATCGAGTTTTCTACGGAAATTTA
-ACGTATTTTATCGATTTTTCATCAGAAATCAGTAGAAAATTCCGTTTTGC
-GCGTCAATTTTGATGTATTCGGGTCGGTGAACTGCACCAAACTGGATTCG
-CCAAATTTTACGAGCAAAATGGGGGTTTTTGCAAATTTTTCTTGGAAACT
-CAGTCAAATATTGAATTTTTCGTGGAAATTTAACCAAAAATCGGGCTTGC
-TACGGGAATTTAACAAATTTTATCGAATTTTATTTTGCGCGTCAAATTTG
-ATGTTTTTTGTGTCGGTGAACTTCAGAAAACTGTATTCGCCAAATCTTAC
-GAGCAAAATTGGATTTTTTGGGTATTTTTCGTCCGAAATTGATTTGTCCA
-GTGAAATTAAACGCGATTTATCGATTTTTTATCGGAAATCAGTAGAAAAT
-TCAATTTTGCGCGTCAAATTTGATGTTTTTTGTGTTGGTGAACCTCAAAA
-AACCGTATTCGCCAAATCTTACGAGCAAAATTGTATTTTTTGCGTCTTTT
-TCGTGGAAATTTTTACAAAAATCGTTCTTTTAAAAAAAAAATTCCACACA
-AAAGTACAATTTTCACACAAAAACTGCAATTTGCGCGTAAAATATGGCGC
-AATCGGTTGAGTGCGGCACGCCGACTCAAAAACACCATATTTTACGCGCA
-AATATTAATTGAAGCGCCTTCACGTGGTGTCAGGTTGTGTCATCACGGTT
-TGATCTACAAAAAAATGGGGGAATTTTTTGCCCAATAATATGTGACGTCA
-GCATGTTCTTAGCCATGCAGAATCCGTCTAAAATCCCGCATTTTTTGTAG
-ATCAACGTAGATCAAGCCGAAATGAGACACTCTGGGCTTCAAAACACTCA
-CCAATAAAACCGCATTGTGTGATCGGAACGTTACACGTGTTCCGATCGAA
-TACCTCCATCGTCACAGGCAGCCCTTTCTCTTTTTCTTCTCGAGTCTGGA
-AAATATTGATTTTTATTTTATTCTTGGAATTTTAAATTTCAAACAGTAAA
-AAACCAAAAATTATCAGTTTTAACTTATCCAAGTTAAAGAACTACAGTGA
-AGAGAACTACAGAAATATTAAAAAATATATCGATGCACCAAGAGCCCAAG
-AAATCTCTGAGAGCCCATATCTCGGCTCATTTCGAAGTTACAAATAAACT
-GCAAACTATAAAAATATAGAAAATTAAATTTCAATTATTTTGTTAGTTAA
-CAAAATTTGGCTAGAATTGAAATGAACTGGGATATGGGCTGGCAAAGTTC
-ACTGAATTTTTTCTTTTTTTTTCTTTTGTTTATTTTGATCTCTACACCAG
-GGGTGAGCAGCAAACGATTTTTTCCGGCAAATCGGCAAATCGTTAGCTTG
-CCGGAATAGAAAACTTCCGGCAAATCGGCAAACCGGCAAATTACCGATGT
-GCCGAGTTTGCCGGCAACCGTATGTTCCCTATGAGTATGGCCACCCATCA
-ATCGACTTTGTCGGCTTATATTTCAGCGGTTTCAGAAGTTTTTTGATATT
-TTCAAAAACCAGAGGATAACGATAGATTTGAAAAATATTTTGTCGTTTGA
-ATTTTTAAAATATGATAAAAGACAACCGAGATATAAACGGTCAAAGTCAA
-GGGGGGCCATACAAAAATTTTTTTTTGGAAATTTAGAAAAAAATGTGTTT
-CCGTCTTATTAAAAAAATCTCTCTAAGCATTTCCGGCAAACCGGCAATTG
-CCGCCCTCCCCCGACCTACGCACCTGTTCAAAGTACTCCTCAACAATCCG
-ATGCGCCCATCGCTGACACAATCCCCACTCTCTCGCCGGATTGGAGATGT
-CGGCGCACTTGACAAGCATATCACATATCGTAAGTGAATTCGTGTCACGT
-TGCTCCTCCGGCACATCTGTCACATGCATCTTGTTGAACTTGGCGAGGTA
-CTCAAAGTGTCGACTGATGTCCGTAGCCAACACCATCTCCACCATCGCAT
-GTCGCATTTGGATGAACTCCTCGCGCGACAGACTCGAGAAGATGTTCACG
-TTGGCGTTGTGCTGAAGGGTTAGCTGAAAGGCTAGTGCGATGTGATGATT
-CTCCAGGATCGAGTTATCATTGTAAAGTATTGCAAGCGACTGTCGCGTAT
-TGATCAGGTACGCGTTTCCTCTTCCAGGATGGTCTAGATCATGCACCGCC
-GCTGCGAGAAGAGCCGCCACCGCATGACTTTCATTCACGTGCACGGCGAC
-CGACGGGGAGTCCAGGAAGAATGAGGTGGCCTGTAGGACGTCGGCTGCGT
-GAGTTGCGTTGTGATACGTGTTTCCCGCATGGTAATGAGCCTCGATGGAT
-AGAATCCAACGGTGGAGGAGATCGTCGGAGCAGCCGAGCACATCGCAAAC
-CTTCCACCTCTCGAAGACTTTCATTCCGACTTGGGAAAGAGCGTGGTGAT
-CCGACACCTTTTCCAGATGAAGGATGTCGAATTTCCAGCAATTGTCGTTT
-TCCAGCGCGTTCTTCACGTCAGCAGATACCCGCCGACGTTCTCCATGGGA
-TCCTCGCTTCTCTCGATGCGCGTCGACGACGCTTCGCTTTCGCTGCCTAG
-CTGGATGATGGAGGCGAATGAGACCATCGTAATATTGAGTTGCTATCCGA
-TCGGCGTCGCGGAATCGATTGATCGACGGCGCGTACAGCTCGTGCGACGA
-CAGCACCTTCATCGCGTCCTTTATCGTTTGTGCCGGTTCTCCGTCGACCC
-GTGCCGACACGTCTCGGAGCATTGTGAGCACCTCGGAGATGGGCGCCTCG
-ATGCCGCCCGTCTGCGATTTCAGGCTTTTCAGGGAGACGTCGCGGAAGAT
-TGCGGCGGTGTCACCGGTGGTGTTTGAGCGTTTCATATACACGAATTGAC
-TACTGCAAAATTCATAGAATTTTTTGATTAATTGGTGGCCGAGTTTTTTA
-AAATGGTGGCCGAGATCTTTAAGTTGATGGCAGAGTTTTATAGGTTGATG
-GCCTAGTTTTTTAAAATGGTGACCGAGTTTCTATGCAATTTTGTGGCCGT
-GTTTTTGTATAAGTTGGTGGCCGAATTTTATAAATTGACGGCCGAGTTTT
-ATAGGTTGGTGGTCGAGTTTTATGAATTGGTGGACGAGTTTCTATACAAT
-TTTGTGGCCGAGTTTTTGTATAAGATGGTGGCCGAGTTTTTTCAAAATGA
-TGGCCGCGATCTTTAAGTTGATGGTCGAGTTTTATAAGTTGGTGGCCGAG
-TTTTATAGGTTGATGGCCGAGTTTTTATGTAATTTGGTGGCCGAGTTTTA
-CAAGTTGATGGTCGAGTTTTATGAATTGGTGGCCGAGTTGCTATACAATT
-TTGTGGCCGTGTTTTTATATAATTTGGTGGACGAGTTTTATAAATTGGTG
-GCCGAGTTCTAACGGATTAAGCAAAGGAAACTAGAACAGAATTTTATTGA
-AGAGAAAACTAGGCCATCAGCTTTTCAAGAAAAACTCGGCCACCAAATTT
-TCCAGCAAAAAACTAGGTCGCCAGTTTTTCCAGCAAAAAAACTCGGCCAC
-CAAATTTTCCAGCAAAAAAAACTGGGCCACCAAATTTTCCAGCAAAAAAA
-AAATCGGCCACCAATTTTTCCACGGAAAACTAGGTCATTTCATTGTTCGT
-TTGAGAGAAAGCTAGGTCACGTACATTTTCAATAAGAAAACTCGGCCACC
-AATTTCTTGAGCATAAAAAATTCGGTCATCAATTTTTATAGAGAAAGTTC
-GGCCATCAAGGTTGAAAAATAAGCTAGGCCACCGATTTTTTTTGTTGAAA
-AAAACTCGAACACCTAACCTATTTTCCTTTTTTTTTCAAGCCTAGAAAGC
-TCGGTTATCGAGTTTTTAGGCCACCGATGCATTTTTTTAATCGAAAATCG
-AAAAAAAAAATCGGTGGCCGACTTTTTCATTTACGGCCACCAATTAAAAA
-AAACTCACTTGTTAGCAAACGGGACCCGTATAAATTTCCAGTCGCAACTC
-CGCCGCCGCTCCTCTTCGCCACGTGCCCTCGGCAGGGACTTTCGTCGCAT
-TTCCGATTCGGGTTGTCCGATCACCTCGGATCGTATGCATCCCGTCACGT
-TCTCGTAGGCGCGGTTAACGTACTGCACTACTCGTTGCTCATCACATATT
-TCCACTGCTTGATCCGTCTGAAAATACGCAAAATTTGAAGGTTTGTAGGC
-ACACGTGGCGCCAGTCTATCCCATTACGGTTTGATCTACAAAAAATGCGG
-GAATTTTTCACCCAAAAATATATGACGTCAGCTAGTTCTTAACGATTCTC
-AACTCCCGCATTTTTTGTAGATCTACGTAGATCAAGCCGAAATAAGAGAC
-ACTCTGACACCGCGTGTAGGCAGGTAGGCGTTCAGCCAGGCGATTAGGCA
-GGCAATTAGGCAGGCGATTAGGCAGACTAGTAGGAGGTAGGCAAGTAGGC
-ATGGAGGCCAAAAGCTCACCTCATCCAAGACGGCGAAAAGGGCGGGCAGC
-GCGCGGATCCGATTCGCGAGCCGCCCGACGTAGTCGAAGAGCACCACGTC
-ACGCGTATTCCACGTCACATGCTGAAAAGAAACGAATGAATGGGAATCAG
-TGTGAATGAAATATTAATTAGAATTGAAAATGAGAAAGTGAGAAAACGGA
-TGACTTACATGAATGATGTTGGACTGCGCAAGAGCTCTCCGTCGCTTTTC
-GCTGATGTGTCTGGAATATGTGATTGTTAGATTGACAATTCTGGCAGAGT
-GGTCTAGAAAATTGGGGAAAACTCGGCCACCGATATGTTTTCTTTGGTTG
-TGGTTGGAAAATTTTGGCGACCGAGTTTTTCAACGTATCCAAATTTATGT
-GGCCGTGGCCGACTAAGGCCACATAGAAAAGAAAAATACCGAAACAATTG
-GTGGCCGAGTTTTATCAACGTAGCCTAAATTAGGTGTACTTGGCCGAACT
-TTTCTTCTGACGGCCACGCAGCAAGGAAAAAATAATGAAAAAAAAGTTGG
-TGGCCGAATTTTAAGCCTACACAAAAAGTTGGTGGCCAAATTTTAAGCCA
-ACAAAAATTGGGGGCCGAGTTTTTGTTTTTTGAAAAAATTCGTGGCCGAG
-AAAATGGGAAAACGCGGCCACCGATATTTTTTCTTTGGTTTCTGGCTGAA
-TAATTTTGGTGGCCGAGTTTTTGTTTTGGATAGGTTGGTGGCCGATTTTT
-ATCATTTTAACCTAATTTACGTGTTCTTGGCCGAACTTTTTTCTGACGGC
-CACATAGCAAGGAAAAAATAACGAAAAAAAAGTTGGTGGCCGAATTTTAA
-ATTCACAAGAAAAGTTGGTGGCCGAATTTTAAGCCTACAAAAAGTGGCGG
-CGCTTTTTCTACAAAAAATTGCTGTCATTATTTTAATTGGAAAAACTTGT
-GGCAGTGATTTTGTTTTGAAAAAAATCGTGGCCGAGTTTATCTGTAAAAT
-TGGTGGCCGAGTTTTATTCACGTAACCTAATTTACGTGGCCGTGGCCGAC
-TAAGGCCACATGGCAAAGAAAAATACCGAAACAATTGGTGGCCGAATTTT
-TAGTCTAAAAAAATGGCGGCCGAGTTTTTGTTTAAAAAACCGTATTTAGT
-ATATCTGGGACGAAAAATGGTGGCCGAGGTTTTTCAATGTATCCAAACTT
-ATGTGGCCTTGGCCTATAGCCTAGCTTTCCTAAACCATTTGTTTAAAAAG
-TTGGTGGCCTAGTTTTCCAGCATAATCCAACTCACTTCTCGGCGATCGAC
-ACAATCAACACCTCCTCTGTGCTCACCGATGAGACGTCTCTGAAAAAACG
-TTTCGTTAGTAGATCATGGCTGACGATCAACGCTGCTCCCTTACTTGGCG
-ATTTGCGATGGATGAGGTACTCGAAGATCTATGAATACAGCTAAAGGGCA
-TATTGATTCAACGTCGGATGTTGCCTGCAAGAAAGTGTACATATTCAAAA
-ATTTCCAAAATTCAATTTCCTTTTTCCCGCCCGTGTCCGAATTTCCGGAA
-CTGACCACGTTTCAGTCATGGTCTTCGTAATTCCCAATTTCCTTTCTCCC
-TTATCTTTTTACGTCAATCATGATAGCGGTGATACGTGTTTCGAGGGTAT
-ACATGCTCACACAACAATGCACTTAATCAGCTAATCTCTCCCACACCTCC
-ACAGAGAGAGTGTATGAGCAAGAGAAAGAGCACCTGCTTCTTCCAGATTA
-GTGAGCGAGCCTGTTGTCATCTGACTTCTGCTGACGGAGGGAGCTTGAAA
-AGCGGAGCAGGAAGAGGAGAAGAAAAAGAGCATTCAGAGATAATTACGCG
-CGAGTCGTAGTAGTATGTATACACTGACTTCTTCTTCTTCTTCTTCCTCT
-TTTTCCCCGTCTTCTGCTCGTTGATGTCTGCCATTATATTGATCATTAAC
-GAGGGCCTAAGAATCCTGGAAGAGTTGTGAGGTCACACTGATGGCCTAGG
-AATCTCAAAGGCAGGCCATATCATATTGCAGGCCATATCAGGCCCCATAG
-CCTGGCCATAGTAGGTCACCACAAGCTATGGACTGCCCTCAAGATTTTGG
-CTCAATTTGGATAAGCTTCTTCGGAGCCCCTGGGCTTAACAGACTGACGT
-CATAGGTGGTATATCTCGGCTAGGCGGAAACTCGGAAATGTGAATTTTTT
-GACGCAAACCAAAGATCTTATAGATCCTTGAAATCTTCCACAGGACTTAG
-CAGACCGGAGGCCTGGGAACTATGCAGTTAGAGGTAATCGCCAAGTCCAG
-GGCTCCGAAGAGAGAGGGCCCAGGGCTCCGAAAAAAGCTTAAATTTTGGG
-CCAAAATTTCCCAAATTGGGCCAAAATTTCAAAAGTATGTAGTAGGTTTC
-AACCCTCATATTTCCCGGGATCATGATTTTGTGGACTATTATTTTCAGGC
-TGTGGTGGCCTGCTATACCCAGACTATGTACTGGGCCAAGCTCTGGCCAG
-GTTATGGCCTTTAATAGCCTTGAATTTTGGAGTCAAAGTTCTTGCAGAGC
-CTAGGAGACGCTTACCACTTCGGATCAAAGGCCTGATCTAAAACTCAATG
-GATCATGACCCTAGAACCTCAATTTTCATAAGCCTAATACGCAGCTACTG
-GTCTAAGCTCTGACCAGGCTATATGGCCTGATATGGCCTGAACACTTCGG
-TGGCCTAGTCTAGGTTTTTCCAAGCCCCAGCGGGCCTCAATTTTCATAAG
-CCTAAAGACGCAGCTACTGGGCCAAGCTCTGGCCTTGAATTTTGGAGTCA
-AAGTTATTGCAGAGCCATCATGCCTAGGAGGCCTAATCTAGATTTTTTCA
-AGCATTGAGGCCCCCACGGGCCTCAATTTTCATAAGCCTAAAAACTCAGC
-TGCAGCCTTACCTGTGTTGGAAATGATACTGTACAAATCCATCCGGATGC
-CCGTAACGAGTCGAGGAGCACACTCTCGCCGGTGCCTTCCGTCACGATCA
-CAGCCTGCAAAAAACGCATTATTTATAAGATCTTACAGGGGATTTTCAGG
-ATTTTCAGGAGGATTTTGTCGTGTGCCAGACCTCAAAGCTCGTCGGGATA
-AAATGCTGATATTGATTGACATGCATATATATAGATATATATGAAGTTGG
-AAGAGCGGAAGCAGCAGCAGTGGCAGCAGAACTTGTGTGTGACGGGGATT
-TGTGGGAACAAGGCGCCAAAGAAGACGAAGCAGAAGAAGAAGAAGAAGCC
-GGGGGCAAGCAATGAATGCAATGTATGTAGGAGTATGTAGGAGTATGTGT
-GTGTGTGTGTGTGTGTGCGAAAGTCTCTCTATGTGTGTGTGTGTGTGTCA
-CAGGTTATATATTGCGTGTGCACAAAAAATGTATGAGGTCTCCTGATGTG
-TGTGTGAGTCTGTGAGTCTGTGAGTGCAGTGTACAACACCTTTTGCGGAG
-TCTTATCACATACTGATACGAAAGTGTTTGTATTTTTATATTTCTTTGCC
-ACGTCACACTTTATTCAATTTTTCGCGTGTGCCTCTCGCCCCGTCATTGG
-CACGCAGTAGAAAAAGAAGTAGAAGAAGATGCGTCTTCTTGTTGCCATAT
-CCCATCCAACTTTGTTACTTACGGAATTCGCGCGCGCGCGCGGGGAGGAG
-AAGCAGAAGACGACGACGACGAGCTCGAAAGAAGACGAGTCCGCCTGCGT
-CTCTGCAGTGATCTCGTGTCCCTCGGCAGCGGCTGCGGCGCGCGCTTCAA
-TGAAGACGAGAGCTCCCCCCCCCGGCGGCGCCGAATACGCGATTTGTCAT
-CGAGATGAGCGCTTTGCTGACAGAATAGAATGGGCAAAAACAGGAATACG
-GAATACAGTAGTCATGTTTTGTTGCAATGTTATGGGAAAGCTGGCTTGGC
-GTGGTCGTCGAATTTTTCGCGCTTCATTGACAAAGAACAAGGGAAAGTCG
-TGTTCTCCACACGGACAATCACACTAAGTTTTAGGACTAAAATCGAGCCG
-AGCCAAAATGGCCTAGTTCGGCAGAAACTCTTCCATTTCAATTTGTGAGG
-AAAGCCAGAGTTCTGTGAACCTCGGACCTGCGATCGCCGACCTGCGATCT
-CCTAGACAAATGCTCACCCCAGCGCGGGACTCGGGAAAGTTAGCGCCAGG
-AGAATAATTTTTGAATTTGAAGAAAAAAAAAGAGGAACTTACAGTTTTCA
-GCATCTTCACTTGCATCGGCCCAAACGTGTCATGTGCCGTGGAGCTGCTC
-GTTGCGGCGACAGTTAGCAGAGGTGTTGGTGGAGCACCACGCGATCCACC
-TCCACCACCACCATTCTCAGAATACGACCCACCGCAGCACCATCTCATTG
-CAAACACTGGCCTGGATGCTGCTGCTGCTGTTGCTGCTGGTGCTCTCTGT
-GCGCCTCTTCTAGCTGCGGGCGTGTGCTGCTGCCTCCTGCCAGCTTGACT
-GTGTGCGCTAGCCCCGAGCACACTCTTTTCACCCTCTTCTCCCCCCACCC
-CGCTTCTATCGCCCATTCTCTCAATTCTTCTCTGCCTCCTCCTCCTCCTC
-CTCCTCCTCCCAATTCTCATGTCATCGGGGGGCCCGTCGTGTCGTCGAGC
-GCCCTCTCGCGTCTGCAATGTCTCGGCGCCGCCGCCGTCGTCGTCGTCGT
-CGTCGTCGTCTTCGGGGGGTTGTCATCTGCTGTGTTCACACTGATGCCGC
-CGCCTTCACCGCCCATCTCATCGTCTCCTCCTCTGTGTGGACCCGCCGAC
-CGGCCGGCGCGCCTTCTCCCATCAGTTCTATCTCTCTCTCTCACTCACTT
-ACTCTCAAACCGCGTCAATTGATCTCTCTGGCACGCTCTTCGCTCGGCGA
-GCTGTATTCGGTGTCGGTTTTCAGTCTGCGTCTCCGCGCCCCGGTGCAAT
-GCATATGTTCCATCACGTTCTGCTCCTCTTGTTGCTCCGTGTGCTGCCGT
-GTTTTACGCAATTTCAGGTAAAATTGATACAATTGATACAATTGATAATT
-ATCGAAGTGTCCTCTATGTGTACTCACGCTGTTAATTTAATGGCCTAACC
-ACAGAATTATGCTTCTTTAATTTTTGAACTCGTAGCTCCGTATGTTAAAT
-CCACTATGAGATTCCTTGCCATGTTTTTGCAATATTTTTTTGTTTGTTAT
-GAGAAAGTGTATGTGTTCTTTGTTTGGTCACATGGGAACCGCTGGCCTGA
-GAATGGAAGGTTTTCTGGGACAGAGCTTTTGAATCCGATAGCCTACAATA
-GGGCCCCAGTGCAATAACGGTAGGCAGGCCCGAGGCCTAATTTAGTCCAA
-ATAGTCCTTATTCAGTCTAGATGATTCAAAGCTAAAATCAAAGGGCTGTT
-CCATTACGTTGTGATCTACAAAAAATGCGGGAATTTTTCGCCCTAAAAAT
-GTGACGTCATCACGTTCCATGCGTTATTATTTATGAAGTCTGCGTCTCAT
-TCTCCCGCATTTTTTGAAGATCTACGTAGATCAACCAAGCGCCTTACCCC
-TAGCCTCTAAGCTCCTAGGGCCCTCTAGGACCATTTAGGCTTTTTGGACT
-GTCTAAGACCAATTGGGCTTTTAGGCTCCTAGGTCCCTCAAGGACCGTTA
-GGCCTCTTGGACTATCTGAAACCATCTGGGCGTCTAGGCTCCTAGGGCCC
-TATAGGACTATTTAGGCCTCTTGGACTATCTAAGACCATCTAGACTTCTA
-GGCCTCTAGGGCTCTCTAGGACCATTTTGACTTGTTCTATAGGACCTTGT
-TCGACTAGCTAAGACCATCTGGGCTTCTAGGCTTCTAGGGCTCTCTAGGA
-CCATTTAGGCCTCTTGGACTATCTAAGACTAATTGGGCTTCGAAGCTCCT
-AGAGCCCTCTAGGACCATTTAGGCCTCTTGGACGATCTAAGATCATCTGG
-GCTTCTAGGCTTCTAGGCCCCTCTAGGACCTTCTAAGACCCCAGTCTTTA
-TTCCCTAGCCTCTAGGCTCATAGGCCTCGATTCCGCAATTCTAATGGCTT
-TGGGAGCCCAGTTCTAAGGCCCATGGACTTCCACAGTAGCTTTTCAGTCA
-ACCATTTCCAAGTTAACCAAGGACCATTTAAGCCTTTTGGGCTATCTAAG
-ACCATCTGGGCGTTTACTTTCTAGGCCTTTTCCTGCCTATTGGGCCCTCT
-TGGACCTTCTAAGACCCTGGCCTTTAATCCCTAGCCTCTAATCCTCTAGG
-CCTCGATTCCGCAAATACAATCCCAGTTCTAGACTCTCAGGGCCCTTGGG
-CTTGTAGGCTTTCAGTTAACCATTTCAAACAGGTGCCGTTCCGCTCCATC
-TCTTCTTGCTCTCTCGTGCTCCTCTCCTACACCATCTTCTCTCATTGTTC
-TGACGGATGGATGAGCTGTCATCATCATCATCAAAGCTCCAAAGACAATT
-GCCATCAATTTGTGCCGCCGCTGTGCTAAGTGGTCTTATTCCGCCGGGAC
-AAAAAAAAAGGGAAAATTCTCTGGGAATTTGGACTAACACCACCTACTAT
-TACTGTAAAAAAACATTTGGAGAAGGGGGAAACGAACTAAAAAAAAACAA
-ATTAAAATCGGCGTATCAAATTGAAATCATATGATTCGTTGCCGTCGTCT
-TCTCTGCAATGATCGTTTGTTCCGTCGTGTCAAACTAACCTACTCAATGT
-CATAAAGAACAAAGAATGAATTCAATAAAACAAGACGAAAAAATAAATAC
-ATTCAGGTACTGTACAGAGAGAATCAGGATCACATCTGGAATAGCTCGCA
-GCCTGTTCGATTCTGGGAGCTTGTTGAGTATAGGCCGACCACTACGCCGC
-CGCCGACCACTACGACAGAGTATATACCGCCACCGACGACTACGTATGTT
-CCCTGAACTTTAAAGTTGCATTTTTTTTTAAAGGATTAGGGGTTTTAATT
-GAAATTTCAGAATTTTTGGTAAATTTTTTAAAATTAGTTTTATTTTTTTA
-CGGGCTTTTGCGATTATTACTGGTAGAATGAAAGTATGTACATTTCTTGT
-AGATCAGAAAATTTAATTTTTGATATCCGATAAATGTTAAAAACTCGATC
-GAAAAAAAAATAAATTTTTCCAAAAACTAAAAAGTTGCAAAATTTATTTT
-TTTTACAATTCAAAGTTTGTAATTTTTGACAAAATACATTCAGAAATTTT
-TTTGGAATAGGGGTTTTAATTAGGCTTGGGCCTAGGTTTGGGCTTGGGCT
-TGGGCTCAGGCTTAGGCTTATGGTTAGGCTTAGGCTTAGGATTGGGCTTA
-GGCTTAGGCTTGTGCTGAAGCTTGGGCTTGGGCTTAGGCTTCAGCTTAGG
-CTCAGGCTTAGGCTTGTGCTGAGGCTTGGGCTTAGGCTTAGGCTCTCAGG
-CTTAGGCTTGGGCTTGGGCTTGGGTATGGACTTAAAATTTTTTTTCAAAA
-ATTTTATTTTTCGAAAACTTATGGTTTTACCGGTATAAAGTGCCTTTTTT
-TGTACATAAAAAATAATTTTTAAATTTTTTAACGTTCCTAAAAACTAAAC
-AAACTGTAAAGAAAATTTTGTTTAAAAAAAAAATCAATAAAACATATTTT
-CAGTAATTTCCAAAATTTGATTTCCCGGTAAAAATCAACAATTTTTTATC
-GGGGCCACAAAAAAAATTCGCTGAAAAAAATTCAATTGGATGTATTTTCT
-GCAAATTCGAGTCAATTTTCTGAAAATAGTTGTTTATTTTCCCTGATTTT
-TTGGCGTTTTTTCCTTTTTTAAAGGAATTTTAGGACTTTCTGGGATTTAG
-AAGGGTTTAGCCTAGGGAGTGATTAAGCCTAGGCTTAAGCCTGAACCTGA
-GCCTAAGCCTAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAACATCAAAA
-AAACCGGAAAATCCTAAGCCTAAATAGCGTCAGTAGCAAGCTGACGCTCG
-CCACTGACACCAAGCCTAAGCCTCAGCCTTTAACGAAAAACAATTTTGGC
-ACAAAAATTGCAAAATTTCCGCTTCTCCGCTTCTCTTAAGACATTGAATT
-TCCAAATTTAAAAATTTTTAGAAAAAAAAAAACCTCGGTCCAAAATGATC
-TGAAAATTCTTATTTAGGCTTTAAAAAATTTCACTTTTTTCTGCGACACT
-TTCCATAACACCACAAATTCGGCGAATCGACCTGTTGATGATCTTGTCTC
-GACCCGCTCTCTCTCTAAGTGATTATAACAGAGATACACCCACACACCCA
-CACACGTCATCTATTATGTTCTAGAACTTTATACTTTATGATCAAAACCG
-AATGCTACAAACTAAAAAAACATCACCACTTTTTCCAAATTTTCGTCACA
-TTTTTGCAGTCCGACCACAACTACAACCACCAAAGATCCATGTGAATCAT
-CGCATCCGTTGGATCTGACGCGTCGGCTACGGGACACTGCCGGCTACAAT
-CGTATCTATATGGCCAGCGACTTTTCGTCGGCTCGCAATGAGTTTCCTGA
-TCTCAGGGGTTTGGCTCACAAAGCTTCAACGGACTATCATTGCGGGAAGA
-GGTGCCAACGGTGAGCTCTCAATGCCTACCTGCCTACTTGTTTGCAGTAT
-CAAACATATAATGCCTACAAGCCTACGCGCCTACCTTGGTCTACGAGCCT
-GAACTTGCACATTTTCTGTGCCTAACATGCACGCTATACTTTTGTCTGCC
-GTTACGCGCCCCCCCCCCCCGCCTATCTGCCTACAAGTCTCCCTTTTGTC
-TTTATGCCTACGCGCCTATCACATGCCTACCTGCCTATTTGCTTGCGGTC
-GAGTCGATACATATCATGCCTACGAGCCTACGCGCCTACCTTGGGCTACT
-AGCCTGAATTCGCATTTTTCCAGTGCCTAGCTTGCGCGCTATACCTATGC
-CTGCATTTACGCGCCTTCTCCCCGCCTAGCTGCCTACAATCGCACTTTCT
-GCCTACCTGCATGCTTTCCTACCTATTCGCATACTTAGGCGTACCTACCA
-CAAGCTTAGCTACCTACAAAACTGCCTTCTGCCAACCTGCATGACTGCGT
-ACCTTTTCGCCTGCTTAGGTGCCTACCACAAGCCTCCCTTTTGTCGATAT
-TCCTACGCGCCTATGGCATACCTACATGCCTACTTGTTTGAGTCGATACA
-TATCATGCCTACGCGCCTACCTTGGCCTACCTTGGCCTACAATCCTGAAA
-TTGCACTTTTCCTGTGCCTAGCTTGTACACTATACTTATGCCTGCCTTTA
-CGCGCCTTCTCCGCGCTTATCTGCCTACAAGCATACCTTCTGCCTCCTTG
-CATGCCTACATACCTATTAGCCTGCTTACGCGAACCTACCACAAGCCTAG
-CTGCCTACAAACCTCCCTTCTGCCTATATGCCTACGCACCTAACTCCTGC
-CTGCCTATACGTCTACCTCATGCTGAAAACAGACCTGCCTTGTACCTACC
-TATGCGCCTACCTAAGATTTGCCTCCTACGTGCCTGGCTGCCTATTTTGC
-CTATAGGCATTACTGTCAGTGCGTCTACCCAGAGCCTACCTTTAGGTAGA
-CGTTTGCCTACCTAAAGCAACCGCCTACAAGTCTATTCGCCTGCCTCCTT
-GCCTACCTACACACCTCCCTTATCCCGGCTTTTCCACCTGCCTATGCGCC
-TATCTCATGCCTACCCAAGACCTGCAAACGTGCCTAGCCGTATGCCTACC
-TAACTTCGCGCCTACATATGCCTCCCTTTCAGATCGAGTCAACTAATTCG
-AAAAATCATAAAAACCGGCCAACCGGCAGAAGCCGAACGTGCTTGGTGGG
-ACGAGGAAGAGTGGGAGGAGGGCGAGAGACGCAGGAAACGAGCCATCGAA
-TGGAAGGATACAGATGATCGTCTGCTAATGCGAAATACCGGAACATCACG
-TCATATTTTGGGTAGGTAGGTGGGTGAACACAGCAAGTGCGCTCCATCGC
-GCGGGACACTTTTCCCGCGCTTTTTAGGAGGTCAAACACGGAATTTTTCC
-AGGAATGACTGTGGCGGTGGAATGCGATGATGAGACTGGAGAATTTAATA
-GTGGTGGATACTCGTTGTGTACTACGTGCCGTGCTGTTCGACACTTGCCA
-TCCACGTATTTTCCACGTGTCATTAATGAGCTGATTTGCTCGCAGAAAGC
-GTGTTTGCGAGGAGAAGGAAAATGCATACAACGGGTTATGCCGATGAAGG
-TATGTAATTTTTTTGTTTTTGCAATGGAGCGCGTTTGTACTCACTCCACG
-AGAATCACGTGGTGTCAGAGTGTCTCATTTCGGATTGATCTACAAAAAAT
-GCGGGAGAAGAGACACAGAGTTCTCAACTGATTTTGGATGATTAAGAACG
-TGCTGACGACACATTTTTATGGGCAAAAAATTCCCGCATTTTTTGTAGAT
-CAAATCACTTGGAGAATATTATTTTTATTTGAATATGATCCTTTAAAGAA
-AAAATAAAATTTGACTGAATTTCCCGCCAAAAAATTTTCGCAGAAAATTT
-AAATTTCCCGGCAAAATATTCACGGATATCTGGCTTCCCTCATAAATTGA
-AATGGAAGAGTTTTTGCCGAACTAGGCCAGGCCATATCTGGGGTAGATTT
-ACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAA
-TATATTTGTCCGTGTGGAGTACACGACTTTCCCACGCGTTGGTGATTGTC
-AATAGAGTGCGAAAAATTCAATGAGGAAGGCCAGAACCCCGTGAATATTT
-TCTCAAACATTTTTTTTGGAATTAATGTGCAATCGCGCTCTAACGCAGTA
-TCCAAAACTTGGGTCTTTTGGCGGGAAACCCGAAAATTCAAAGTTTTTTG
-CTTTAAAATATCGTGAAACAGACGAAACTAGTCGCAAAATTTCAAATTTA
-CGGTCTTGCCGCGCCAGTGCGGTGGATCACGATTGCACTTAAGAAAAATG
-GCGAAAATCAAAAATTTGGTTTATTTTTGGCAACTATTTTTCATTCTCTA
-TCAAATTCATACTGTACACGTGGAAAATCATTGATTTTCCCGAAAATTTG
-AATAAATGGGATGCAAGATGCGAGCGCGCCCTATTGTGATTCGTTAAAAT
-TCGTTAGAAGCGTCACTGAAATCGAAATTTTTTCTCGAAAAATTGCAGTG
-TGCCACGTTGTAAAATATCGATTTTTTGGAAAATTTAATATTTAGAAGTG
-CGGATGCATCCTATTGTGCTCCAATAAAATTACACGGGCTTCTGGCATTC
-CGCATTGAATTTTTCGCGCTCCATTGACAATCGCCCGTGTACTCCACACG
-GACAAGTGCATTTAGTTTTAAAACTAAAATCGAGCCGCGACGCGACACGC
-AACGCGCCGTAAATCTACCCCAGATATGGCCTGGCCTAGTTCGGCAAAAA
-CTCTTCCATTTCAAAATATGAGGAAGGCCAGAACCTCGTGGAAAATATCG
-ATTTTTCCATTTCCACGTGGCCAAAGGAATTGCAAGCGCGCTCCAGTGAA
-CTCGCCCAATTTCCATTTTTTTTCAGGTTCTCCGAAACGTGGGCACCCGC
-GAGTGTGCTCGCTGGCAAATGAGCCAAATCGACGTGCGAACGTGTTGTGA
-TTGTATGCTCAATCCGTCATCACCACTGGTCACCTATTTATGAGCGAAAA
-AACCGGGGAAAAAAACACACAAAACAACTCAAAACTCAACAAAAAAAAAT
-AATTTTACAAGATTCAACGAAACAACAAAAAAAAGAAACAATGGAAATTA
-AATACGGATGCTGCTGCCAAATATGCTGCCAAATTCAAATTCTCGCCTTG
-TACACACGATCTTTATTGAAAACGGTGATCAACGGGCACCCTCCACTCTG
-ACCTTTTATCTGAAAATAATTGTTTTAAAGATTTATTTGATTAAAAACCT
-CGGCCACGGCCGCGACGCAGCCGCTCCGCACGCAGCTGCGTCGCGGTCGG
-GTGGATCCTAACCTGAACTTCTCCCTCCAGCTCGTTATCGTCGTCGACCA
-CCTCGAACAGTTTGCTAGCCTCGAATAGAAATCTGAAAAAAATAAATTGG
-TTTTTTTTGAAAATATATAATGTTTTATGTTTGGGCTTCTGGCCTTCCTC
-ATTGCATTTTTCGCGCGCTCCATTGACAATCGCCCCCCTGTGTACTCCAC
-ACGGACAAATCACATTTAGTTTCACAACGAACGACACGCAACGCGCCTGG
-CCTAGTTCGGCAGAAAAACTCTTCCATTTCAATTTATGAGGGAAGCCAGA
-AATCCGCGTGTGTTTTATTGATTTTATTGATTTTTTTACTTTCGAAAATC
-GCGTTCCGGCTGGTAGAAGCACAAGGTTTTGCGCGTGTCGGCGATTCGAT
-CCCTCGACCATTCTCTGCAAAAAAAATATTTTTTTTTGTGTAAAATTCCC
-AATCTGCGAGAACGGGATCTACGAAAAATTTTTTTTTTAATATTTTAATG
-ATTTTTTCAGAGATCACATTCTTGCAGATCATCTTTTCGTGGGGCCTCCT
-AATTTTTCAGTGCTGCACATTTATTTAACATTCAAAAGTGCTTTTTTCAT
-AAAAATTTGAATTTTTTGCCCAAAAATCGAGAAAAACGCCGCTCCGCCTC
-TTTTTCCGTGCGGCACTGTGCCTTTTGCAAGCTGGGCACAGTTTTGTAGG
-CGTGAGCATGGTCTTACTTGAGCGCTTGAGTGATCTACGAAAAAAAAAAA
-GCTTTTTTTAAAATTTATGTCGGAGATCACATTCTTGCAGATCATCTTTT
-CGTGGGGCCTGCTTATTTTTCAGTGCCGCTCGGAAAAAGAGGCGGAGCGT
-CGTGAGGCACGGTTTTTTGTCACGATTTTACAGTTTTTTGACTAAAATTC
-TTGATTTTGGATCATTTTCGTTGATTTTTTTCGGAAAAAGCTGATTTTGG
-CAAAAAAAAAATTTTCGCTTTTTTTTGGACAAAGAAGAGCCAAAAAAAAA
-AATGAAAAAATCATAAATTTTTTAGTTTTTACATTTTTTTTTTTGAATTG
-AAAAATGTTTTTTTGTGTTTTTGGTGAAAAAAACTACTTTTTTTTGCGAA
-AAAAAAATAGCAAAAATGACCAAAAATCGGAAAAAAAAAACGCCGCTCCG
-CCTCTTTTTCCGTGCGGCACTTCGCCATTTGCAAGCTGGGCACGGTTTTG
-TAGGCGTTGTCATGTTGTCATTACTTGAGCGCTTTGAGGCAAAGACTTAT
-GGGAGAACGGTGAAATCCAAAATTGGTGGCGTTCGGGAAGAGACGGGGGT
-GCTTCTGAAAAAAATTGTTGAAAAATGCAAAAAATCTGAAATTTTAGAGC
-ATTTTTCTGAAAAAAATGCAAAAAATCCGAAATTTTTGAGCATTTTTCTG
-AAAAAAACGCTAAAAATCTGAAATTTTAGAGCATTTTTCTGAAAAAAACG
-CTAAAAATCTTAAATTTCTGAGCATTTTTCCCGGAAAAAAAAAGATTTTT
-ATGCACCTCTGCGAAAACTTCATCCATCATGGTAATTGAAAAATCACAAC
-TGTCCAAAAGCACCGAATTCACAGTGTCGAGCTCGAAAACGCCGACATCT
-TCGACCTAAAATGCTCAATTTTAATGGGGAAAAGCTCTAAAATCATGGGC
-TTCTCGCATTCCTCGTTGAATTGTTCGCGCTCCATTGACAATCGCCCCCG
-TGTACTCCACACGGACAAGTGCATTTAGTTTTAAAACTAAAATCGAGCCG
-CGACGCGACACGCAACGCGCCGTAAATCTACGAAAAAAAAAAGGAATTTT
-TGCTGAAAAATCGATAAAACACGTTAAATTTAACCAGAAAAATCAATTTT
-CGCACAAAAATTCGCAAAAAAAAAAAATCAAATTTTGCTCATAAAATTTG
-GCGATTTCAGTTTTCTGAGGTTCACCGACCCAAAAAACGTCAAATTTGAC
-GCGCAAAACTTGAATTTTCTATTGATTTTTGATGAAAAATCGATAAAATA
-CGGTCAATTTAACCAGAAAAATCAATTTTTAACGAGAAAAGCCAGAAATC
-CGTTGAAAAAGCTCTAAAAATCAAAATACAAACATTCGAGAGAGTCAGAT
-GACGGAGACAGACGCATTTTTTCAGAATTTTCTGCAAATTTAGGTCCAAA
-CTGACGAAATAGAAGACACGGAGCACACTGGAAATGAAAAAAAATTAATT
-AAATGCTAGATTTTTAGCATTTTTTCAGAAAAAATGCACTAAAATTTCAG
-ATTTTTAGCATTTTTTTCCGGAAAAATACACTGAAATTTCAGATTTTTAT
-TTATTTTTTTTTGAAAAAATGCTACAGACCGAATAGTTTGCCAGGCATTT
-CTGCCGCGGAGGAAATCGGCGATGAACTCTGCCACGTAGCGGCATTCGAT
-GGGCGGTGGCTGAAAATTTGCAATTTTTTGGCCTAAAATTTGGTTTTTTC
-TGGAAAATTCTCTTACCAACGGGAAGGTTTTCGTCTTCGGAATGCCTAAA
-TTAACAATACAAGCCCTCGGAGCAATTCTCGCAAGAATTGGAGCCAGCTC
-CTTGGCATAAGTGAGATCATAGATGAAGAAGACGAGCCGCTTCACCATTA
-CGATGCTCTTGCAGCGTTCACGGCGTTCTGCGTATTTTTCCAGGATACTC
-TGAAAAAAAATCCGTTAATTTTAGCCAAAAAATCCGTTAAATTTAGCCAA
-AAAATCCGTTAATTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATC
-CGTTAATTTTAGCCAAAAAATCCGTTAACTTTAGCCAAAAAATCCGTTAA
-TTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATCCGTTATTTTAAG
-TCAAAAAATCCGTTATTTTAGCCAAAAAATTCGTTAATTTTAGCCAAAAA
-TTCGCTAGTTTCAGCCAAAAAAATCCGTTAATTTTAGCCAAAAAAGAACC
-GTTATTTTTAGCCAAAAAATCCTTTAATTTTAGCCAAAAATTCGATATTT
-TTAGCAAAAAAAATCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGCC
-AAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTTAGCCAAAAAA
-ATCCGTTAATTTAAGTCAAAAAATCCGTTATTTTAGCCAAAAAATTCGTT
-AATTTTAGCCAAAAATTCGCTAGTTTCAGCCAAAAAAATCCGTTAATTTT
-AGCCAAAAAAGAACCGTTATTTTTAGCCAAAAAATCCGTTAATTTTAGCC
-AAAAATTCGATATTTTTAGCAAAAAGAATCCGTTAATTTTAGCCAAAAAT
-CCGTTAATTTTAGCCAAAAATCCGTTAATTTTAGCCAAAAATTCGATATT
-TTTAGCAAAAAAAATCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGC
-CAAAAAATCCGTTAATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAA
-AATCCGTTAATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCC
-GTTAATTTTAGCCAAAAAAGAACCGTTATTTTTAGCCAAAAAATCCGTTA
-ATTTTAGCCAAAAATTCGATATTTTTAGCCAAAAATCCGTTAATTTTAGC
-CAAAAATCCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCAAAAAAAA
-TCCGTTAATTTTAGGCAAAGAACCGTTAATTTTAGCCAAAAAATCCGTTA
-ATTTTAGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTT
-AGCCAAAAAAATCCGTTAATTTAAGTCAAAAAATCCGTTAATTTAAGTCA
-AAAAATCCGTTAATTTTAGCCAAAAAAGAACCGTTATTTTTAGCCAAAAA
-ATCCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCAAAAAGAATCCGT
-TAATTTTAGCCAAAAATCCGTTAATTTTAGCCAAAAATCCGTTAATTTTA
-GCCAAAAATTCGATATTTTTAGCAAAAAAAATCCGTTAATTTTAGGCAAA
-GAACCGTTAATTTTAGCCAAAAATTCGATATTTTTAGCCAAAAAATCCAT
-TAATTTTAGCCAAAAATTGCTAATTTTAGCAAAAAAATTCGCTATTTTTA
-GCCAAAAAATCCGTTAATTTTAGCCAAAAAATTCGCTATTTTTAGCCAAA
-AAACTGTTAATTTTAGCCAAAAATCCGTTGATTTTAGCCAAACAATTAGT
-TATTTTTAGCCAAAAAATCCGTAAATTTTAGCCAAAAAATCTGTTATTTT
-TAGTCAAAAAATTCGTGAATTTTAACCGGAAAATCCGTTATTTTTACTAC
-AAAAATAGCGAATTTTCGCCAATTTTAACCAAAATCTCTCGATTTTTTGT
-CAAAAATGCACCAAATGTGCGCTTTTTTTCGTTTTTTTTTGGCATTTTCC
-CTACTTCAATAGCGAGTTTGCAGGTCGTCGTGCAAATTTTGACTTCGATT
-TCAACAGAATCCAGCAGAATTCGATCATCAGTCATACATTCCAAACAATT
-TTCAGCATCCTTTATGGGCACTTCGATGAAATCTGAGAGAGCAAACACTT
-TAGAATTGCCAGGGTTTACAGCTCTTTTAATCACCATCCAACTGGCACGC
-GACGTCCATTTTTGGCTGCCCATTCACCCGCTCGCCGCCACCCTTGCAAA
-TGTTGTGAAATTTGATGACAAACGGTTCAGAGTACTCGAAATTCTCCAGA
-TCGCCGTGCTCGACGAGCTCGTTGTTCGATGGTGCTCTTTCCGGCGTTCT
-TTTCCATCTGAAACTGCTGTTTTTCCTTTTTTTTTTTGTCGCAAAATCTT
-TTTTTTCACCGAATTTTTCCACCAACCTGAACAGCGAATCTTCGAAAAGA
-GACGAAGAATTCGATTTTGGGCTTTCCAAATTTGAAAAATTCAAAGAAGT
-TGTCACAGAACTAGCCATTTCGAAGTTGAAATGATTAAAAATCAAAAACA
-AAAAATTTCGATAAAAATCAATGTCCGAGAGGAGTACACGCTTGGGAACC
-ATGCGCGGGTCTCGCACGGAAGAGACGAATTGAAGTACGGTAGCTCGTAA
-ATCCTGTTCCACGATTGATTTTTTTTTAATTTTTGATCAATTTTTTCGAT
-TTTATCCCAGAAGTTCTTGAAAATTATCCGTTTTTTTGCAATTTTTTCGG
-AAAAATGCTCTAAAATTTAAGATTTTTAGCATTTTTTTCCGAAAAAAATG
-TTTTAAAATTGCAGATTTTTAGCATTTTTTCACAAAAAATGCACTAAAAT
-TAAGATTCTTAGCATTTTTGCGGAAAAAATGCTAAAAATCTTGCAAAGAC
-TGAAAAAATTCGAATTTGTTGTAATATTGCATGTTTTCCGAGGTTTTACA
-TCAAATATGTGTAGTTTTCCTTGAAATTTGACGTTTTTCACTGAAAAATT
-CTACAAAAATAAGCATTTCTGAGCTCTTTTGTCGCAAAAGTTGATGAAAA
-TCGCCAATTTTTCAATAAATATTGCACAGAAACCGTCAGATTTTTAGCAT
-TTTTTCGGAAAAATGCACTAAAATTTTAGATTATTAGCAATTTTTCAGAA
-AAATGCTCTAAAATTTAAGATTTTTAGCCCTTTTTTTCAGAAAAATTCAC
-TAAAATGCAAGATTTTAATCATTTTTTTGCAAGAAAAATGCTCTAAAATC
-TAAGTTTTTTAGCATTTTTTTCGGAAAAATGTTTGAAAATCCCTTCTTTA
-ACGCCTTTTTCGCACTAAAAGATGCTCAAACTAGTTTAAACTTTCAGAGT
-TTTCCCATGCTTTTGCCCCCTCCACTTCACAAGAAACAAGAAACAAATAC
-GGCGGGAAAAAAGCGAAAATTCGCGGAAAACATCATTTTCAATGCATTTT
-TCATCGCGAAAATTGCCGAATTTCATTAAAAATGGCCAATTTTTGTGCCA
-GTTTTCCCAATTAATCATGTATTTTCGATTAACTCGAAGCCCCTGCGCAG
-AGAAAAACACAAAAATGTTGCAATTGTTTGTGTAAAGCACTTCTCTGCGC
-GTCTGCGGCATCCGATATGACGAGCAATATATATCTTTTTTCTGGGAGCC
-TTTTATTTTAAATTTATCATTTTTCATTTAGTTTTTGAGAAAAAAATTCC
-CCCAAAATTAACCTAAAAGCCTTGAAAATGTGAATTTTGAGTGAAATTTG
-ACGTTTTTCAGCGAAAAATTCTCAATTTTTAGTGCATTTTTGCCGGAAAA
-ATGCTAATAATCTTGAATTTTAGTGCTTAGCGGAAAAAAAATTCAAAATG
-AAAATGTCGAATTTGAAATAAAATGCTTTAAAATTTAAGATTTTTAGCAT
-TTTTCCCGAGAAAAGCTAAAAATCTTAATTTTTATAGCTTTTTTGTTGAA
-AAAATGCTAAAAATCTTAAATTTTAGATCATTTTATTTCAAATTCGACAT
-TTTCATTTTGTATTTAAGAAAAAATAACCTCAAAGTCTGAAAAATATCGA
-ATTTTGAGTGAAATTTGACATTTTTCAGCGAAAAATTCTCATTTTTCCGG
-AAAAAATGCTAAAAATCTTGAATTTTAGTGCATTTTTCCAGAAAAAATGC
-TAAAAATCTCAATTTTTAGTGCATTTTCCCGGAAAAATGCTAAAAATCTT
-AAATTTTAGAGCATTTTCCAGAAAAAATGCTTAAAATCTTGAATTTCAGA
-GCATTCTTAATGAAAAATGCTAAAAATCTTAAATTTTAGAGCATTTTTCT
-CGAAAAAATGCTTAAAATCTTGAATTTCAGAGCATTTTTTTCGGAAAAAT
-GCTAAAAATCTCAATTTTTAGTGCATTTTTCTGAAAAAATACTAAAAATC
-TTGAATTTTTAGAGCATTTTCGCTGAAAAATAATAAAAATTTTAAATTTT
-AGAGCATTTTTCCGAAAAAAAAAACGCTAAAAATCTTGTAATAACTGACA
-AATTTCGAATTTTGAGTAAAATGGCATGTTTTTTGAGGTTTTTCCTTGAA
-ATTTGACGTTTTTCACCTAAAAATTCGACAAAAATGAGCATTTCTGAGCT
-CTTATATTGCAAAAATTGACAAAAATCGTCAATTTTTCAATAAAAATTGC
-CCAAAAACCTTAAAATATTCTGAAAAAAGCCGAAAAAACCCCATTTTTTA
-GCCATTTTCTACAGAATTTTACATTTTTCTCAACTTTCTTCACCTAAAAT
-CGCCGATATTATTCACATAAAATTCCCTTTTTTTTCAGCGCAATGGGGTG
-TATTATGAGCCAGGAGGATGAAGCAGCGAAACGAAGATCCAAGAAGATTG
-ATCGATTGGTAAAAATTGGGGATTTTTCGTTGAAAAAACTCGATTTTTTG
-TGAAAAAATATAGAAAAATCATCAAAACTGCTTCAAAAACCGAAAAATTT
-CACTAAAAACTAGAATTTTTGCTCGAAAACCTCAAAAAATCGCAAAATTT
-GCAGTGAAAACTAGATTTTTATTTTTAAAAAATTCAAAAAGTTCATAAAA
-ATCAATAAAAAAATCGGATTTTTTTTCTTAAAAAATCTGGAAAACTGTCT
-AAAAATCTACTCAAAATCAGTTTTTTTTGTAGAAAATCTGAAAAATAGTC
-TAAAAAATTAATAAAAATCGATTTTTTGGGAGAAAATTTGAAAAATTACG
-AAAAAAATCAATAAAAAATCGGTTTTTTGGGAAAAACCCTGAAAAATTGT
-CTAAAAATCTATAAAAAATTGGATTTTTTAAATAGAAAATCTGAAAAACT
-GCCAAAAAATCAACAAAAAATCGATTTTTGTGTGAGAAAACCTGAAAAAT
-TATCAAAAAATTGGTTTTTATCTAGAAAATCTGAAAAATTACCTAAAAAG
-CAATAAAAAATCGGTTTTTTTTCTGGAAAAACTGTAAAATAGCCTAAAAA
-TCAATTTAAAAAAAGTTTTTTTTTTTGTAGAAAACCTGAAAAATTATCAA
-TAAAAACCACGAAAAACAGTTTTTCGCTTATAAAAAGTCCAAAAATCCCA
-AAATTTGCATTAAAAACTAGATTTTTATTTCAAAAAAATTCAAAAATTGC
-CTGAAAATCAATAAAATTGTTGTTTTTTTTTGGAAAAAAAAACCCTGAAA
-AATTGGCTAAAAATCCCAAATTTTTTTGCAGCTCAAAGAAGACGGCGAGA
-ACTCAATGCGAACCATCAAGCTTCTGCTCCTGGGAGCCGGCGAGTCTGGA
-AAATCGACGATTTTAAAGCAGATGCGTATCATTCACGACGTCGGATATAC
-GACTGAAGAGAGAAAAGTGTTCAGAGGCGTCGTTTATGGAAATATTATTT
-TGGTCAGTGCTCCGATGCACTGAAAAATGACAGGAAATTGGCAATTTTGA
-CCAAAATTCGTGGATTTTAACCAAAAAATCCGTTAATTTTAATCAAAAAT
-CGGCTAATTTTAGCCAAAAAATTCGCTATTTTAACCAAAAAATCCGTTGA
-TTTTAGTCAAAAAATTCGCTATTTTTAGCCAAAAAATCGCTATTTTTAGC
-CAAAAAATCCGTTAATTTTAGCCAAAAATTTCGCTATTTTTAGCCAAAAA
-ATCCGTTAATTTTAGGCAAAAAATCCGTTAATTTTAGTCAAAAAATCCGC
-TATTTTAACCAAAAAATCCGCTATTTTAACCAAAAAATCCGTTAATTTTA
-GCCAAAAAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAA
-AAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATTC
-GCTATTTTTAGCCAAAAAATCCGTTAATTTTAGCCAAAAAATTCGCTATT
-TTTAGCCAAAAAATTCGCTATTTTTAGCCAAAAAATCCGTTAATTTTAGC
-CAAAAAATTCGCTATTTTTAGCCAAAAAATTCACCAATTTTCGTTTAAGA
-TTCTCCAATTTTTGACAAAAAAATTCACCGAATTTGCTCAAAATTCTCCC
-TTTTTTGGCTAAAAAATGCATAAATTACACAATTAAACCAAAAATTACCC
-AATTTCGCCCAAAAACTCTAATTTTTACCAAAAATTCTCCTATTTTTTGT
-TGAAAATTCACCAATTTTTTTGCCAAATTTTAACAGAAAAATCTATAAAA
-TATCAGGCGAAAATAACCTAATTTTGGTCAAAAATTCACCGATTTTTGTT
-CAAAATTCTTCAATTTTACCCAATATCCACCAAATTTTAACCAAAAAAGT
-CTAAAAAATTATTCAAAAAATCCCTAATTTTGGCCCAAAATTCTCCATTT
-TTACTCAAAAATTCTCTCTTTTTAACCAAAAAATCTAGAATATTAGGTGA
-AAAATGCCTAATTTTGGCTAAAAATTCACCGATTTTTGACAAAAAAAACC
-TCCAATTTCAGCTTAAAACTCTCTGATTTTTACCAAAAAAATCTAAAATA
-TTAGGCGAAAAATCACTAATTTCGGCTAAAAAATCACCAATTTTTGACAA
-AAGAAACTCCAATTCCAACAAAAAATTCACAAAATTTACTCAAAAATTGT
-CTGTTTTTCACAAAAAAAAAACCTACAATATTAGGAGAAAATTCACAAAT
-TTTGGCCAAAAAATCCCTAATTTTGGCCGAAAAATTTGCCAATTTTGTTC
-AAAATTCTCCAATTTTCGACTAAAAAAACCTGCCATATTCAGCAAAAAGT
-TCACCAAATTTACTCAAAAATTCAAAAAAAATCTAGAATATTAGGCGAAA
-AATCCCTAATTTTGTCCAAAAATTCACCGATTTTTGACAAAAAAAACTCT
-AATTTCAGCAGAAACTTCACCAAATCATAGCCAAAAATTCACTGTTTTTT
-ACCAAAAAAATAGAATATTAAGAGAAAATCCCTAAATTTGTCCAAAAAAT
-TAAACAAATTATAGCCAAAAATGCTCTGTTTTTTACCAAAAATTCTAGAA
-TATTAGGTAAAAAATCCCTAATTTTTCCCAAAAAATTCACCGAATTTACT
-CCAAAATGCTCTGTTTTTGACAAAAAAAAACTCTAATTCCAGCACAAAAT
-TTACCAAATTATAGCCAAAAATGCTCTTTTTTTTCCAAAAAAAATCTAAA
-ATATTAGGCGAAAAATCCCTAATTTTGTCCAAAAATTCACCGATTTTTGA
-CAAAAAAAACTCTAATTTCAGCAGAAACTTCACCAAATCATAGCCAAAAA
-TTCACTGTTTTTTACCAAAAAAATAGAATATTAAGAGAAAATCCCTAAAT
-TTGTCCAAAAAATTAAACAAATTATAGCCAAAAATGCTCTGTTTTTTACC
-AAAAATTCTAGAATATTAGGTAAAAAATCCCTAATTTTTCCCAAAAAATT
-CACCGAATTTACTCCAAAATGCTCTGTTTTTGACAAAAAAAAACTCTAAT
-TCCAGCACAAAATTTACCAAATTATAGCCAAAAATGCTCTTTTTTTTCCA
-AAAAAAATCTAAAATATTAGGCGAAAAATCCCTAATTTTGGCCAAAAAAA
-TTACACCAATTTTCCCCAATTTCAGCTTAAAATGTTCAATTTCTAACCAA
-AAAACCCCCAAATTTTAACCCAAAAATTCCCTCGAATTTCACCCCAAAAC
-CGTCCAATTTTCCAGTCTCTCAACGCCATCATCCACGCTATGGAGCAGTT
-AAAAATCAGCTTCACCACACTCGATCACGAATCAGATGCCCGAAAGCTTC
-TAATGTTCAGCACAACAGGCGAAGAGGATGAGCTGCCCGAAGAGCTCGTC
-GTGCTCATGAAGAGTGTTTGGTCCGATTCGGGAATTCAGAAAGCGCTCGA
-AAGGTGGCGAAATTTCGCTGAAAATTGAGAAAATTCGAGGGATTTTCGCT
-GAAAATCGAGAAATTTCGGTGGAAATTAGCTTATTTCCATGAAAAAATCG
-TTAAAATCCCAGAAAATTGCGATTTTGGACTATTTTTGAGCATTTTTCGC
-GTTTTTTCCATGAAAAATTCAATGAAATCGATTTTTTAGGTCATATTCGC
-TGAAAATTACCGCTTTTTTCGATGAAAAATTCGTTGATATTCGTTGAAAA
-TTATCTATTAGAGCTAATTAAAATTTAAAATTCCAAAAAAAAAAATATTT
-TAAAATAATCAATCGAATTATTTTTTGCTCACACTTTCAAAAACCGCTAA
-AAATTCTAAAAAAAAAATTTTGGAGCCCCTTTTCCGCTAGAAAATAGCTT
-TTTTTCCCTCAAAATCCGGGAAAATTCAGAAATATTTAATTTTTTGGCTA
-TTTCTGACTCTTATTCCCACACAAAAATAGTTTTACCAAAAAAAAACAAT
-TTTTGTCAAAAATTCGAAAAAAAAATTTCTGGGAAATATTTTTAAATGAC
-TCTAAATTTTCCCCTGTACCCGAATATCGATGTGAAAAAATTCAGAAAAA
-TTTTCCGCGATTTTATATGATTTTTTGAAAATTGGACAAATTTCAGTTTT
-CCCCCCTAATTCCTATTTGAGTTACCGCCAATTTGATTTGTTCGATGGAC
-TTGCACATTTTTGAATTAATCTATTTTATTTTTTGTTGTTTTTTCCACCG
-ATTTTTAATGTTTTCGGTGTATTTTTGCTTGAATTTTAGGGGAAAAGTCA
-AAATAAATGCAATTTTCGATTAAAAAGCACGCTGACCGGCGTAAAAATGA
-AAAAGTAACGATTTTAAACGATTTCAAACCTGAATTAATTAATTTCACTG
-ATTTACGCCTGTACGCGTGCGTAGATCAGTGAAATTAATTAATTTAGGTT
-CGAAATCGTTTAAAAGCGTTACTTTTTCATTTTTACGCCTGTAAGCGTGC
-TTTTTAATCAGAAATTTGCAATTATTTTGACTTTTTCTCTAAAATTCAAG
-CAAAAATACACCGAAAACATCAAAAATCGGTGGAAAATAACAAAAAATAA
-AATAAATAAATTTAAAATTGTGCAAGCGCGCTCCATCGAACAAATCCAAT
-TGGCGGTAATTCAAATAGGAATTAGGCAAAAACTGAGATTTTTGAGGCAC
-CACGTTTTGAAGATCTGTTCAAAAAGAAGATCTACGTTTTCAGGATCTGG
-CACCGTGCCAACTGCGGTTTTCTCGATGAAAAACGTAACAACGATGCTCC
-GATGTTACGCGTCGCGTGTTGTTTTGCGTTCAGAAAGATATTTTTTGAAA
-TTTTCTTCTTGAAGAAACGCTTAACGACACGCAACGCGTAACATCGGAGC
-ATCGTTGTTACGTTTTTCATCGAGAAAACCGCAGTTGGCACGGTGTCAGA
-TCCTGAAAACGTAGATCTTCTTTTCGTAGATTTTCAGAATGTAGATCTTC
-TTTTGGTAAATCTTCTTTTCGTAGATCTTCTTTTCGTCGATCTTCAAAAT
-GTAGATCTTCTTTTGGTAGATCTTCTTTTCGTAGATCTTCTTTTCGTAGA
-TCTTCTTTTTCGTAGATCTTCTTTTTGAACAGATCTTCAAAACGTGGTGC
-CTCTGATTTTTCCAAATTTCAAAAAATCATATAAAATTTAGAAAATTTTT
-TTGAATTTGTTTATCAGCATATTTGGTCATTTTGGTACCATATTTTCCCC
-TGATTCCGAATATCAATGTGAAAAAATTCAAAAAAAAAATCCCTGATTTT
-ATATTTAAGCTTGAAATCGCCGAATGAGATTTTTCAAATACGCGCGCACA
-AATAAATTCTCCTTGGAGCGCGTTTGCCTCATTTGATTTTCTCCATATTT
-ATTTTTACTTTTTTTTCAGTTTTTCACAGCTATTTTCATTCATTTTTATT
-GTATTTTATAGGTTTTTTTTTTTGAAAAATAAATTTTTCCGTGTGAATTG
-AACATTTTATTTGCATAAAAATGAATGAAAATAGCTGAAAAACTGAATAA
-AGTAAAAATAAATATGGAGAAAATTAAATGAGGCAAACGTGCACCAAGGA
-TAATTTATTTGGGCGCGTATTTGAAAAATCTCATGTAGGAGGCAAATGAA
-ATTTAGGCGATTTCTAGCTTAAATATAATATCAGGGAAATTTTTTTTTTG
-ATTTTTTCACATCGATATTCGAATCAGGGGAAAATTTGGAGCCACCTGTA
-ACAAAATTTTATGAAAAAAAAAACTGTATAATTTCTAACAACTTTTTTTT
-TGTAGATCACGCGAATATCAGCTCAACGATTCGGCCGGCTACTATCTGAG
-CCAACTCGACAGAATTTGTGCTCCTAATTACATTCCCACACAGGTATTTT
-TCACTGGAAAATTCACAAATTTTTCCACTACTAAAAATTCAAATTTCCTT
-TGCAGGATGACATTCTCCGCACAAGAATCAAGACAACAGGAATCGTGGAG
-ACGCAGTTTGTCTACAAAGATCGCCTATTTTTGTAGGGGGAAAATTAATT
-TTAAAAAATTGAAAAAATCGTCGCCGAAATTCAGGGTTTTCGACGTTGGC
-GGACAGCGATCCGAACGAAAAAAGTGGATTCATTGCTTCGAAGACGTGAC
-GGCACTCATTTTCTGCGTTGCACTGTCAGAATATGATATGGTTCTTGTCG
-AAGATTGTCAGACGGTGCGATTTTCGAGTTTTTTGCTTTTTTTTCGTTTT
-TTTCCCAAGTTTAGGGTTTTTCGGTGAAAATCTCGGTTTTCTTGGTTAAA
-ATGGTTTTTTTTTTGGCAAAAAACGGCAAAAATTGAGGATTTTAGCGTAT
-TTTGGCGAAAAATTGAGTTAATTACATGGAAAATTTCAGAATTTGAGTTA
-AAATTGTAGTTTAAGGATTTTTTAGTGATTTTCTCGATTTTTGAACCGAA
-AAACGTTCGAATTTCATTTATTACGCGCGACCACAAAATGCTGAGAACGC
-GTATTGCACAACATATTTGACGCGCAAAATATCTCGTAGCGAAAACTAAA
-GTAATTCTATAAATGACTACTGTAGCGCTCTTGTGTCGATTTACGGAAAT
-CGTGTATTAATCGATAAAGTATTTTTTTTAGAAACACAAAAATGACAAAA
-AAAATACGAAAGAAAATTGAATTGTTTCGAAAATCGAGTCCTCCCGTAAA
-TCGACACAGTTGCCATTAAATTAAATAAAATTAATGTTAACTGTGTCGAT
-TTACGGGAGGACTCTCGATTTTCGAAACAATTCAATTTTCTTTCGTTTTT
-TTTTGTCATTTTTGTGTTTCTAAAAAAAATACTTTATCGATTAATACACG
-ATTTCCGTAAATCGACCCACAAGAGCTACAGTAGTCATTTTCAGAACTAC
-TGTAGTTTTCGCTACGAGATATAATTGCGCATCAAATATGTTGTGCATGA
-CGGATTCTCAGCATTTTGTGGTCGCGCGTAATGAAAAGCGAAAAAATCGA
-TATTTTCTGATTTTTGCGCCGAATTTTGTTAATTTTTCTTTTTTTTTTTT
-CTGCGAAAACCACATTTTCCTGACTAAATTCAGGTTCAGCCATTTTTTTT
-CGCAAAAATCGACGAAAATTGAGAATTTTAGCGTACTTTTAATTTTTTTA
-AATTTTTTTCGCTCTGAAAATTATGAAAAAATCAAAATTTTCTCGATTTT
-TGAACCGAAAAACGTTCAAATTTCATTTAAAAATCGAAAAAATCGGGAAA
-AAATTTTCCGATTTTTGCACCGATGATTTTCGCTAATTTTTCACCACATT
-TTTTGCGTTTCAGAATCGAATGCGAGAATCGCTAAAACTGTTCGACTCGA
-TTTGCAACAATAAATGGTTTGTCGAGACGTCGATTATTCTATTTCTCAAC
-AAAAAAGACTTATTCGAAGAGAAAATCGTTCGATCTCCACTCACACACTG
-CTTTCCGGAATATACGGGCGCCAATAATTACGAAGAAGCTTCTGCGTACA
-TTCAACAACAGTTTGAGGATATGAATAAGAGGACTACTGGAGAGAAAGTT
-GGTGGTTTTTTTGAATTCACTGCAACTTTTTCCTCACGAGGGACGAGGAA
-AAGTGGTTTCTAGGTCATGGCCGAGGGGCCGACAAGTTTCAGCGGCCATT
-TATCTTGCTTTGTTTTCCGCCTGTTTTCTTTCGTTTTTCATCGATTTTTT
-TCGTTTTTTCGTAATAAAACTGATAAATAAATATTTTTTGCAGATGCTAA
-AACAATTTCCAAGTAAAAAAATCATGTATTCAGTCGGCAAGCAGCGATGA
-AAGTGGGCATTGTAATATGATGGATTACGGGAATACAAAACCTAAACTTT
-TTCTGAAACATGAAACATATGATGCTTAGATGCTGAAATTACCTGATTTT
-CATAACGAGACCGCTGAAAAGTTTTGAGGTTTCCACAATTCAACTTTTTG
-TGCGAAAATCTCGACTTTTTCACCAAAAAAGTTGAATTTTGGAAACCTCA
-AAACTTTTCAGCGGTCTCGTTATGAAAATCAGGTAGTTTCAGCATTTAAG
-CAGCATATGTATCATGTTTCAGAAAAAGTTTAGGTTTTGTATTCCCGTAA
-TCCATCATATTGCATTGCCCTTGTTTCACCGCTGCTTGCCCACTGAATGC
-ATAATTTTTTTACTTGGAAATTGATTTAGCATCTGCAAAAAATATTTATT
-CATCAGTTTTATTAAGAAAAACGAAAAAAATCGATGAAAAACGAAAGAAA
-ACAGGCGGAAAACAAAGCAAGATAAATGGCCGCTGAAACTTGTCGGCCCC
-TCGGCCATGGCCTAGAAACCACTTTTCCTCGTCCCTCGTGAGGAAAAAGT
-TGCAGTGAGAAAACTCAATTTTTGAATTTTTTTTTCATGAAAATCGGAAA
-ATCTTCAATTTTTCCTAATCAATTCCATCTCTACAGAATCAAGAAATCTA
-CACCCAATTCACATGTGCCACCGACACTAACAACATTCGATTCGTTTTCG
-ATGCCGTCACCGACATTATCATTCGAGATAACCTCCGCACGTGCGGGCTC
-TACTAAATTTTTCCGCTAAATTTTAAATTCCGTTTTTTCCCCCCAAAATC
-CCCTCCCAGACATTTTCCGGTATTTATGTATTGACCACACACAACTCTTC
-TCTCCCGTCTCCGCTGTTCAATGCTACGGTTATTCTCTTTTTTTTTCTTT
-TTTTTTCCTGAAATTCCAAGGGTGTCGTTGAAAATCGAAAAATTCGAAAA
-ATTTGGGTTTTTTAGAGGAAAAGCCAAAAATTCAATTTTTTTTTCGATTT
-TTATTCCGGAAAATTCGAAAAATTTCGATATTTTTTAAATTTTTTACAAA
-AAATTCGAAAAATTTGGATTTTTTCAGGAAAAAGCCAAAAAATTACAATT
-TGTGTTTAAAAAAACGAAAAAAAAAACCAATTTTTCTGATTTTAATTCCG
-GAAAAATCAAAAAATCTCGATTATTTTCAGAAAAATTCGAAAAATTTGGG
-GCTTTTTCCAAAAAAGAAATCGTAAAATTTCGATTTTGTCCAGGAAAAAT
-CGAAAATTTAATGTTTTCTTTTTTGGCTTCTTCCGGAAAATCCAAAAATT
-TTGAATTTTTTGGATTTGTTTTCAGAAAAATTGGAAAAATTTGGATTTTT
-CAGGAAAAAGCCTAACAATTTCAAATTTTGCTTTAAAAAAACTTTAAAAA
-ATTGATTTTTGAGGAAAAAACGAAAAATTTCGACATTTTTTGATTTTTTT
-TTTACCGAAAAAAAAATTGATTTTTTCCAGGAAAAAGCCAAAAATTTTCA
-ATTTTTAAGGAAAAATTCGAACAATTTTGATTTATTGATTTTTTATTACG
-GAAAAATCGAAAAATTTGGGTTTTTTAGAGTGAAAAGCCAAAAGTTCAAT
-TTATTTTTCTGGAGAAATCCAATTATTTCAATTTTTGAATTTTTTCAAGA
-AAAATAAAAAAATGTCGATTTTTTCCAGAAAAATCGAAATTTTTCGTTTT
-TGAATGAAAAAAAATTTTTCCTTCAATTTTTCCTTTAAAAAAAATAAATA
-AAAATGTTCGAATTTCCATGAAAAAAAGTCAAAAAAATTCAAAATTTTCC
-ATTTTCCCTGACAAAAAAATCAAAATTTTCCGATTTTCCTAAACCAAAAT
-CCCAAAATTTTCTGATTTTCCAATTTTCTCTGAAAAATCGAATTTTTTGC
-CGCACACCCCTGGTTTCACGTGGTGGTCAGGTTGTCTCATTGCGGTTTGT
-GATCTACAAAAAATGAGGGAATCTTTCCTCCCCCGGGAAAATCTGACGTC
-AGCGCACTCGTGTAACCATGCGAAATCCTCTGCTGAAAAGTCTGCGTCTC
-TTCTCCCGCATTTTTTGTAGATCAACGTGTAGATCAATCCAAAATGACAC
-CTTGACACCACGTGCCTAAGCCCAAGCCTAAACCAATCCATTTTACCGGT
-ATATCTCTACAACCTTTCACTGTCTGAAATATCGCGTCATTTTATATTAT
-TATTATTATTGTATTCGCTTAAACGACAACAATTCCCCCATTTGATTCAA
-AAAGTAAACATTTCCGAACTTTTTAAAAATTTGAAAAATATTTTTAAAAA
-ATTTTAGCGTGAAAAACTTGTCCCCCCACCCTGCCTCTCCAAAAAAAATT
-AATTTCGGAAGAATTCAGTCCTTGTTTTTGTAAATTGAGAACGTAATGCG
-CTTTTTGGTGGTTTTTGCATATTTATCGACACTTGCGTACGCGAGGTATC
-GATTCAGATTCCGTGAGTTTTTTACAACAAAATATCGCTAAGCAATCGCG
-CTCCAGCGCGAAACTTCAAAAAAAGGCCAAAATTTTGCGTCGCTTTCTAT
-GATTTTAAGACGAAAAGCGAGGAAAAATCAATAAAAACAGCGAAAACTTT
-GAAATTTACGGGTTTGCCGCTTTTTTTGCGCTAGAGCGCGATTGCTCACT
-GAGTTCAAGCGCCCTTCTTATTTTGAAATGGAAGAGTTTGCCGAATTAGG
-CTATTTTGGTGCGGCCACGGCTGGGGTCAATTTACGGCGCGTTGCGTGCC
-GCGTCGCGGTTAGGTGGACCACGCCTTTCCCACGCGTAGACGATTGTCAA
-TAGAGCGCCGAAAATGCAAGGCCAGAAGCCCGTATGAGTGAAGTTTTTGT
-TCATTTTCACTTTTTTTTCGTCGTTTTTAACGGTTTTTATGTGAAAATCA
-ATAAAAACGGCGAAAATAATTAAAAATTTTCGATATTCCGGGTTTGGCGC
-TTGCTTTGCGCTAGAGCGCGATTGGTCACCGAGTTCAAACGGCGCACTCT
-GGCTTCCCTCTTAATTTGAAATGGAAGAGTTTGCCGAATTAGGCCATTTT
-GGGTCGGCGGGTAGATTTACGGCGCGTCGCGTGTCGCCTCGCGGCTCGAT
-TTTGATTGTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGCGACTTT
-CCCACGCGTTGTCCAGCAGGTTATTGCCAATGGAGCGCCGAAAATGCAAG
-GCCAGAAGCCCGCCGTATAAGTAGCCCATATGAGTGAAGTTTTTGTACAT
-TTTCACTTTTTGTTTCGTCGTTTTTATGGTTTTTATGTGAAAATCCACAG
-TCTCCTCGTCATCGAAAGCGCACAAAAAACTGCTTACTGGCGCGTTTCGC
-GTTTTTGCTAGCGCATTTTGTGGATTTCTCCGAAATTCAGAAATTACGCG
-GAAAATAGGCTAGAATTCCAAAATTACAGCCCCGCCTCTTTTGATAATTA
-TCTTCAGGATGAAGAAGATGATCGCGAAGGTGGGTGACTTGAAATATACA
-AGAAAAATATGATTTCTTCAGAGAAACACCATTTTTACCGTTGATTTTTT
-AATATCCCTACTCCTCCTTCAGTTTTTGACCAAATTTTCTCTTTTAATGG
-TCTTTCATTTCATTTTGTGCTAATAAACAAATGTTAAGTTCGAAATCTGC
-GAAAAAATTCGTTTCAACGCTAAAAAACGACGAAGTTTATTTTTCAACAC
-TAAAAAGATTCACTCCCTCCCCCGGCTGTGCCAATGTGCAAGTGCGCCCC
-AGCCCAATTCGACGCCGAGGAGACTGTGAAATCATTAAAAACAGTGAAAA
-TAACGGAAAATTTCTGAAATTCCGGGTTTGCCGTTTTTTTTTGCGCTGGA
-GCGCGATTGCTCACCGATTTCAAATAGCGCACGCGCTTCTGGTTTCCCCC
-ATAAATTGAAATGGAAGAGTTTTCGCCGAACTAGGTCATTTTGGCGCGGC
-CACGACCGGGGTAGATTTACGGCGCGCTACGTGTCGCGTCGCGGATCGAT
-TTTAGTTGTAAAACTAAATGTAGTTGTCCGTGTGGAGTACACGACTCTCC
-CGTCCGGCAGGCGATTGCCAATGGAGCGCGAAAATGCGAGGCCAGAAGCC
-CGTGCATTTTTTTGCGGGTCCCGCCACGACATTTACCCTTTCAGACACGT
-GTATCAAAGAGGACCAGGCGATTTTGGAGAAGGAAAATGTGAACTCGCCA
-CGCCAATTTCTTTTTATCGATGACGGACAATCGCCAAAGTGGAGGGAAAA
-TGATCTCGAAGGAAAAGGAATTCTTATGAGCTTCGGAAATCGATTGAAGA
-ATCTGACAAACGGATATGAGACTGTGAGACTTTTTTTACGGGTCTCGACG
-CGATTTCCCACGGATTTCGGGCTTCCCTCATAAATTGAAATGGAAGAGTT
-TTTGCCGAACTAGGCCCCGGCCATATCTGGGGTAGATTTACGGCGCGTTG
-CGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTGAATGTATTTGTCC
-GTGTGGAGTACACGGGCGATTGCCAATGGAGCGCGAAAAATTCAATTTGT
-GTCTCGTAACGATTTTATCGATTCTTTTTCAGGGTGCCGAACAAGCTCTG
-CGTGTCCTTGAATTCAACAATACGGAACACTTTCTTGTGATCAATTTTTG
-GATGAGAAGCTACTATTTCATGAAAAACGGTGATAAATATCAGCTGTCAT
-ACACCGGAACCACCATCAAACCCGATTTGAATCACTTTATTCGGTTAGCA
-GGCTTGGAGATGCAATATCGCTCCATCGCAACCATTTTTTCAGCGTATAC
-TTCATCTGCGCTCCAGCGAACAGTCAGAGTGCGTTGATCGTGTTTGGGGA
-TCAGTCGAAACCGCGAGTTTTAAAGTCGAAAAAATCGAAGAGGGAAGCAG
-CGCTGATTGATGAGAATTCGGGGAAGAAGCTGAAAAAGTGCCAGAAAATT
-CGGACGAAAAGAGCGGCGGCGGTGAATAACTCGACGGAGTGGACACAGAC
-GCTGAAGGATACTCGGAGACTTAAACAACGTAGCGAGTGAGTTTGTGCCA
-AACGATACTCCGATGTTCCGCTTCCGCTGAGGACACCGCGTCGTTTGATC
-TCTGAAAATTGCGAGAGTCAGCCTCGTGTAAGTTTACCGCAAATTTGGAG
-GTCAAGCAGCGAGGTCCTCATATTTTGAAATGGAAGAGCTTGCCGAATTC
-GGAGTCGATTTACGGCGCGTTGCGTTGCGTGTCGCGTCGCGGCTCGTGAT
-TTTCGCATATTTATCGACACTTGCGTACGCCAGGTATCGATTCAGATTCC
-GTGAGTTTTTGCAACAAAAAAATCGCTGAGCAATCGCGCTCCACTGGAAA
-ACACCCGAAAAGTTTTGAAATTCCGGGGTTGCCGCTTGTTTTGCGCGCTA
-GAGCGCGATTGCTCGCCGAGTTCAAACGGCGCTCTCTGGTTTCCCTCTTG
-TACGAGACGAGCGTCGCGGTTCGGTCCAGCAGGCGATTGTCAATGGAGCG
-CGAAAAACACGTGGTGTCAAAGTCTCCAATTATGGTTTGATCTTTGATAA
-ATGCGGGAGACGAGAGACACCGACTTCTCAACTGATTTCGCATGGTTAAA
-AGTGTTCTGACGTCACATTTTTCTGGAAGAAAAACTCCCGCATTTTTTGT
-AAATCAAACCGGATTAGGACAGCCGGACACCACGTGGAAAAACAAGATGA
-GGGAAGCCACAGAAGCCCGTGCAGAGTCTCGGTTTTATCAGTTTTCGAGT
-AGTTTCGCACCACAAAAAGCGTGTGACGTCACATTTTTCCGGCCGCAAAA
-TTCCCGCGTTTTTTGAAGATCAAACCGAAATGCATTGTTTCAGAATCTAC
-TCTTGGGCACGTCTCTCGTTCATTCACCTCGGTTTCGGTATGGTAGTGAT
-CGTCAACGCCATCGTTTTTTTGTTCTTTTTCAAGTATTTCAAGAAGTTCA
-ACTCGACGGTGAAGAATGGAGATCAGAAGCAGGAATCGGATGAGACTGAT
-GAGAAGACTGAGAAGACTGAGAAGCAGGCGAAATAGAACTTTTTAGTCTA
-TCTGTGTTGAAATAAAGGAATTGAAAAAAAAAAAAAAAAAAATTTTTTTG
-CATATATGCATGTGGTGTCAGAGTGGATTATTTCGGTTTGATCTACGTTG
-ATCTACAAAAAATGCGGGAACTGATTTTGCATGGTTAAGAACGTGCTGAC
-GTCACATATTTTTTGGGCGAAAATTCCGGCATTTTTTGTAGATCAAACCG
-TGATGGGACGTCTGGCATCACGTGTACATGTAGAAATGAGATACAACATG
-TTATGTACCGTTATCCTACAGTACTATAGGTGAACCCCTCAATTTTTGAC
-CTCCAAAAATTGCGGGAATCTTATAGGTCAACTTGCAGGGGGTCGTGGAC
-ATGAATAAGCCAAATTCAAATTATTCAAGCCAAAAAGATGATAGCGCAGA
-CACGTGCCCCCAATTTCGGTTTGATCTACTGTGTAGATCTACAAAAAATG
-CGGGATTTAGGACGCTGAGTTCTCCACTGATTTTGCAACAAATTCCCGCT
-TTTTTGAAGATCAAACCGGACAACCTGACACCACGTGAAGGAATAAACCA
-CGCTCTTTTGCCAAAATCTTAAGAGTTTCTACAATTTCAGTGAAAATCCA
-GTATTAGATTTGATATTTGAAAAAAAAAAGTTAAATAATGGACGCGGCCT
-AGTCTTTCCTCTTCTACTAGCAAAACGCCCTGTTTTACAAAAAAAATCTA
-TAGTTTCTGAAAAAAAAATCAGTGGCAAATGTCTACAATTTTCAATATTT
-CATACTAAAAAAATCACAAAAAATTATTTTATGGCCGCGGTCGAGTTTTT
-TACTCTTCCACGTGGTTTCAGAGTGTCCAATTTCGGTTTGATCTACCGTG
-TAGATCTACAAAAAATTCGGGAGTCGAGAACTGATTTTGCATGATTGCTG
-ACGTCACATTGTTTTGGGTAAAAAATTCCCGCATTTTTTGTAGATCAAAC
-CGGACAGCCTGGCACCGCGTGCGCAGAGAAGAAAAAGCTAATGAGCACGC
-GGTGTCAGGCACGGCTTGATCTACAAAAATTGCGGGAATTTTCAACCCAA
-AAATATGTGACGTCAGCGCGTGCTTAACCATGCAGAATCAGTTCTCAACT
-CCCGCATTTTTTGTAGATCTACGTAGATCAAACCGAAATGGGACACTCTG
-ACACCACGTGAATGAGCCAATTGAGCAAAAATCGTACTGAAAGAGATCGT
-TTTATTCGCGCAGAGGTTAGTTACACGAATTGAATAGAAAAAATAATGTT
-TTGCAAAAAAAAAGTAATGTACATACTCATGGAAATAAATTTATTATGGG
-GGAGCTTGATTATTACAAGTCGACGAAGAGCAGCACTCCTTCTTCTCCTC
-CTTTTCCTTCTCTTTTTCCTTTGGAAGCTGCGGAGAATTCGACTCGGATT
-TCGACATTAGACGGGAGCTGGAGCATCTGAAAAAAAAACGCGAAAAATGG
-TAGATCACACGTTTTCCAACCTATTACCTTCTCAAACTAAGACTGGAGAA
-GAGCGGTGTACACTTGAGCATGTCCTTCAACTGTATCGACTCGTAGTTTT
-CGATCGATTCCTGGAACTTTTCGATCCACAGCTCCTTGTCCGCCTTGTCG
-GCGGCTTGTAGGGTGTAGATGCCGACGACTTGGTAGTAGCGGGTTAGGTG
-AATTATGACGAACGCGAATTTTAGGGACACTGGAAGAGGAACACACTTAT
-AGTGACACTACAGTAGTCCTAGAAGGTATTGGTAAGGTACTGGTAAGGTA
-CTGACTGCGCTAATTTTTGTACGTTACACATTTTCCTGGAGTTTTGCAGA
-CCTTCAAGAAAATTCTAGCACTTTCCAGATTTTCTCCGAAAAATTCCTGC
-ACTTTCCAGATTTTTCCAGAGAATTCCTGCACTTTACAGATTTTTCTAGA
-AAATTTTGTTTTTCTCAGAGTTTTTCCTATAACTACAGTAATCCTACAGT
-ACCCCGACCATATCGCCCCTACCAACATACAACCCAATATTCCATCAAAA
-GACAAAAACTCAAATTTTCCCGAACTACAGTAACCCTACAGTAACTCTAC
-CGTATACCTACCGGGCCCCTACAGTACTGCTGCAGTACCTTGACATTATC
-CCCTACCAACATACAACCCAATACCTCTTCGAAAGCTGGGAACTCAAATT
-TTCTATAACTACAGTAATCCTACAGTACTTCTACAGTACCTCTACAGTAC
-TACTACAGTACACCGACCATATCCCCCACTAACCCTAAACCAATATTCCT
-TCAAAAGACAAAAACTCAAATTTTCCCAAACTACAGTAAGCCTACAGTAC
-TCCTACAGTCCCCCGACCATATCCCCCTACCAACATACAGCCCAATATTC
-CATCAAAAAACAGAAAAAACTCAAATTTTCCAAAACTACAGTAACCCTAC
-AGTACTCCTACAGTACTCCTACAGTACCTCTACAGTACTCCTACAGTACC
-TGGACATCATCCCTCACCAACTTCCAATCTAATACCTCTTCAAAAGCTGA
-AAATTCAAATTTCCTATAACTACAGTAGTTCTACAGTACTCCTACACTAC
-CTCTACAGTACCACTACAGTACCCCTACAGTACCCCGACCATATCCCCCC
-ATTGACTCTAAACCAATATCCCTTCATAAGCACACTACAAAGACTACGTG
-GACTACAAACTATGTATGGTCAGACGGATAGTTTTTTTTAATATAAGAAA
-TGATGATGAACTATATATACTACTATATATACTGACACTGATTCACCAAA
-ATTAGCGACTCTGGCAATTCACCAAAGATAGGGTACGGTACTGGTATGGT
-ACTGGTACGATACTAGACCCCAGTTCTTTAATACGATTCCCTAAAATTGC
-TCACTCGGCGTTGCCTGGTCGTTGGAGTCCGCATCACAGAACACGCAAGA
-ATCCAACGGTACCGGCTGTCGTTGGACGATGTAGTGCTCGGATTTCCCGA
-TTGGGACTCCTTTCTGCAACTCTTTCAGTAATAAAACAAGTAATAAAACT
-TCGCGGGACTCCTCACCACTTTCAGCTTCGAAGCGCACTTTTTAGTTTTA
-GTCAGCACAAACATGTCGTTGAATAGAAACGCGTACATATCAACGGTCCG
-CCCGTTTTCCACAAGCTCGAGGGGGCCTTCGTGGATAAGCTTTCGACGCG
-GATGAGCCAGAAGGTTCTCGCAGAATTGACGGGATAAGGCGACGCGGAGG
-AACTGGAATTGTAAAAAATCAAGGGAAAATGTTGCAGAGAAAACAAATGT
-TTCAACTTACATCAGGGACATAAGACTTGGGCTCCAAGTCGCTTATATTC
-GGCCAGACAACCTGTGTCTGCAACTGCTGAAGCCTCTCAAAATTATGAAG
-CCACTGCACACTATCATCAATCGATCGGAGTGATTCCGTCATTGTGTCGA
-TCACCTTCTCCACCTTTCCCTTACTCTCCTCTTCCTCCGATCTTTTGTGA
-ATCTCGCGGAGAAGGATCGGAAGCCGAGTGATTCGTTGAAGCGGTGCGAT
-CAAAAGATCCTCGAGCTGTAGACGGAAGCATCGTTCATCGGCCAGACATA
-TCCGCTCGAATTCCGTGAATCGTTCCTCTTTCTGTCGAATTGAGCCGAGA
-TATTCCATGGTTGCCTTGTAGTTGATGCAGTAGGCTTGGTAGGCCGAAAT
-TGTGGAGGGGCCTTTGGAGAACTGGAAGTTTAGAGTTATAACAAGGCATA
-GTCTCAAGCTATTTTCCAGCCTATCCAAGCTGTGGTCCTGGTGCTTAACA
-GTCTTGATTTTTTAGAGCTGGAAAACCGGACTAATCCGGACTACGGAAGC
-CTGGTTTTTGTCTAAACGACAACATTGTGCAACAAGGTACGCTTTTTCAT
-ACTACTTTTTTTTAAACTTTTGTTTTTTTTTGTTCTTTTTCGGCCAGCTT
-TTAGGAACTTTTTTGACCCAACTTCGAAATGTCCCTTTTTTTTGCAATTT
-TAGGAATTTCTAGAAATTTCCCATTTTCTCTTTTTCCAGCCCCTTCTAAA
-CCTAGGCCTAGGCCTACGCATAAACCTAAGCCTACGCCTAAACCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCTTAAGCCTGAGCCCAAG
-CCTAAGCCTAGGCCTAAGACTAAGCCTATGCCTAAGTCCCAGCCTTAACC
-CAAGCCTAGGGCTAGTTGAAAGCCTAAGCCTAACCCAAACCCTAAGCCTA
-AGCCTAAGCCTAAGTCCAAACTTAGGCCTAAGCATATGTCTAAGCCTAAG
-CCGAAAATGTCCCTTTTTTTTGCAATTTTAGGAATTTCTAGAAATTTCCC
-ATTTTCTCTTTTTCCAGCCCCTTCTAAACCTAGGCCTAGGCCTACGCATA
-AACCTAAGCCTACGCCTAAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCT
-TAAGCCTGAGCCCAAGCCTAAGCCTAGGCCTAAGACTAAGCCTATGCCTA
-AGTCCCAGCCTTAACCCAAGCCTAGGGCTAGTTGAAAGCCTAAGCCTAAC
-CCAAACCCTAAGCCTAAGCCTAAGCCTAAGTCTAAACTTAGGCCTAAGCA
-TATGTCTAAGCCTAAGTCTAAACCGTAGCCTAAGCCGAATCCCAAGCCTA
-AGCCTAAGCCTAAGCCGACGGAGCACGAGGAGAAAGTCCAAAACTTCACA
-AAAAAACAAACATTTCTCTCAATCTCGGTCAGTTTTCAAAAATATTTCGA
-GTAATTTTTCAGCACAAATAACAAAAACCCACCCTTTCAAACAAGTCCAC
-AACTAGCTGTGTGCAGTCCCAATTCTCCTTGTCTACCGTACTGAGCAACG
-AGAGGAACGATTGACAGAAGGTTCGAGATATTCTGACAAAATAAAAATGT
-GTGTGTGTGTGTGAAATGGCACGTCAGATTAAAGGCAAATAGAAAAAAAA
-AACCAATTAAAAACTGAACGAACCTGCAGAGTTGATCCAAATTTCCGAAA
-AGGAGGTCCGGCTCGACAAGCAGTAGACATCCCTCGACTTGACATCTCTT
-CAGCGGCTCCTTGTAAACATCGCGGAGCACGAAGAGCTGACGATAGAGGA
-AGACGAGCTCCGTGTGGAACAGCTCCCATACCGCTTGAAGGTATTTGTGT
-TTGGATGAGGGAATTGTCGTGGTCTCGTCTCCCATGAACATTTCCTCAAA
-GGATACTGGCTGAAAGTTGGATTTTTTTTTGGTATTGGAGCTCGTCTCTG
-GGCTCGTTTTGCAGTTTGTACCCTTAAAAAGACATTAAAAAGACATCAGC
-AACAAACTCCAAAATCCCAAGTAGTAAACAGATTTTTTCTAAAACGGCAA
-AATTGAGTGAGGAATTTTTATTCGATGCACCATGTTTCTCACTCAAATTT
-GACTACTCATAACTTAGTTAAACCTAATCCAATACTTCCTTAAAAGCTAA
-AAATTCACATATTCCCAAACTACAGTAAACTACAGTACCCTACCGTACCC
-CTACAGTACCCCGACAGTACCCCTACAGTACTTTGACAATATCCCCCATC
-AACTCCCTACAAAATCATCAAAAACAAAAAATTCACAATTTTCAAATCTA
-CAGTAACCCTAGAGTGATCCTACAGTATTCCTACAGTACCACTACATTAC
-CTTGACATATCCCCCACCAATTTCCAACCAAATACCTCTTCAAAAACTAA
-AATTCACATTTTCCAAAACTACAGTAACCCTACCGTATACCTGCAGTACC
-ACTACAGTACCATTAAAGTACCTTGACATTATCCCCCACCAACTTCCAAT
-TAAATACCCCTTCAAAAGCTAAAAATTCAAATTTTCCCGAACTACAGTAA
-CCCTACCGTATATCTACAGTACCCCTACAGTGCCACTACAGTACCTTGAC
-ATTATCCCCCACCAACTTCCAACCCAATACTCAATCAAAAGCTAAAAATT
-AACATTTTCCCAAACTACAGTAACCCTACCGTATTCCTACAGTACCCCTA
-TAGTTTCACCTACCAACAACTTTTCCAGCTCATCATCCTCAATCTCATGA
-TCCTTAGAAGTCTCCAACGCGGCCTGCACATGCTTAATAATCTCCCTCCG
-TTTTGCTCTGCCCGACCACTCGTAAAGTCTCTTCAGAATCCAGGGCGATC
-GATTTTTCTGCGGCTCGGAAGCTTCTGCATAGAAGGCTTGAGAGGCTATT
-GTGGCACGTTGAAGATCTGAAAATGAAGAATCGGTGGGGATCAGTGGTGA
-CAGCGAGGGAGAAGATCTATTTGGTGGGGTGGCACATATAGAAGTGGGTA
-GTAGCGGTTTTTTGTGTGATCTTTGTGTAAATAGACATGATATTAGGGCT
-TCCGTGGTAGGCAGGTGCGGTTTTAGGGCCTGGCGCTTGCCTGACGCCTG
-CCCGTCTCACGCCTGCCTGGCGCCTTTTATTCTGCATTTTGAAGTGAGTT
-TTCAAATTTCAAATTTTCTCATTTTTATCATTTTGTTGAAAATCAAATTA
-AGAAATGAAAAAAAGTTTAAGTAGGTTTCAGCATCAGGCGTGTATTTAGG
-CGAGAGGCAGGCGGGGGTCGCCTCAAAGTCAGGCAGGCAGGCCTTCTTAT
-GCCTACACGGAAGGTGTTCAAAAATCGGTTGCGTGTGTCCAGTAATGACA
-AGAATCATACAAAGCATTCGACTTTTACACAAAACTAGTCTGTATTCCAC
-CTGTACAAAAACCTACCGATCGATGTGATTTTATTTGAATCTGAAAAAAA
-AATTTCTCAGAAAATTTGAATTCCCGCCAAAATGTTTCTTTGAAAGTTTG
-AATTCCCGCCAAAAACATTCTCAGAAAATTCAAGTTCCCGCCAAAAATGT
-TTCTTTGAAAATTTGAATTCCCGCCAAAATTTTTCTTTGAAAATTTGAAC
-TCTCGCCAAAATGTTTTTTTTTTGAAAATTTGAATTCCGATAAAAAACTT
-TTTACAGAGAATTTGAATTTCCCCCTACAATTTTCACAGATCTACTTATA
-TATATATATATATATATATATATAAGTTGAACTTTAGTTTTCAAAAAAAA
-ACCGGTCATTTATTAAAGCACGTGGTGTCAAAAAATATTTTTTCGGCTTG
-ATCTACGCCGATCTACAAAAAATGCGGGAGAAAAGACGCAGAGTTCTCAG
-TTGATTTCTCATGGTTAAGAAAATTCCCGCATTTTTTTGTAGATCAAACC
-GTAATGGGACAGCCTGGCACCACGTGCTAAAGTTATAGTTAATTTACAAG
-TCCTGGTTGGACCTGCAGGATGTCAGGCGCTGAAACGTGTTTCAGGATAA
-AGTTGGTAAACTTTTATAACCAAGAGGAAAGTGTTATCGATATTTTGCTA
-GTTGAACATTTTTTTTTGCTAAAAAGTAAGAGTATTTGAGCCAGGCGTGC
-GCGGCGATCGGTAATTTCCGAAAATCGGCAATTTCGGCAATTGCCGGTTT
-TGTGAATTTTTGGCAATCGGCAATTTTGGCAATTGCCGAAATTGCCAAAA
-ATTCGATTCCGCACACTCCTGCTTTGAACTGTGCATTTCCAAAATCCAAT
-AGAAATTCTGCCGACACTGTAAAATCCCTACCTGCCAACAATCCTCCGCC
-GGAGCTGATTGCCCTATTGAACAGGTGACTCTCGTTAGGGGATATTTGAA
-CATGTGGGACAATGATCACATTGTCCGACGAGCAGCACCCTTGGGATGAG
-GTCTCCTGATTCTCACTTGGCTGATCAGGAATGATTGCATGGCGACGGGA
-AAGTTGCTCCTTGTTAGGGTGAATTGTTTGGGGCTCTCCTTCTTCTGGCT
-GGAAAAATACAATTTTTTGAAGTTTTTGAAAGAAAGCTTGTCATTTTTTT
-GTTGCTATTTTTTACCCTAAAAATGTGGTTTCAAAATTTTTTTACCTCTG
-AATATCTAATCAACGGGGTGAACAACTGCAGATCGACCATACTCGAGCTT
-CTAAAAGTTTGAAGGAAGCTTCTCGTGAAGCACGAAAAAAAAAGAAACAC
-GAAATAGTTACCCTTACAATTATCAGAATAGGATGGGATGTACAGAGAAG
-TAAATAGGAAGAGAAATGAGAAGAGTTGCACTAGAGAAGTATGTACAATT
-AATAATTTATGAGCATCTGAGAAAATGAGAGCGACTTGAAAATCTGAAGA
-GCAAGGAAGATAAAACTCGGTCTCTTATCAGAAAATTTGAATTCCCGCCA
-AAATGTTTATTGTTTAATTTGAACTCCCGCCAAAACTTTTCACAACGAAT
-TTGAATTTTTCGCCAAAATTTTTCTCAGAGATTTTGAATTTTCCCGCCAA
-AAGTTTTACCAGAAAATTAAAATTCCCGCCAAAACTTTTCACATCGAATT
-TGAATAACCCGGCAATTTTTTTATCAGAAAGTTTGAAATCCCGCCAAAAT
-TTTTCACATGAAATTTGAATCTTTCGCCAAAGATTAAAATCGTTGGATAA
-TTTTAATTCGCGGCTGAACGTTTCCAATTCGAATTAAGACCGGCCAAAGT
-TTTTCGGGGTTTTTTTTAAAACTTACTACAAAAAAGCATACATTTATTTT
-CCTAACTAGACGCCTTACTAGGTAAAACCCGCTTTTCACATCAAAAACTT
-CAACAATGCGTCACCGCCAAAAGAGATTCTTGCACTTCACCACGAATAAT
-AGATCAGAAGGAAAAGCGTGTAGTGAGTTGAGAATTATAACTAATTCATA
-TCCCCCGAAAAAAAAAACGCTGATGTCTATATTCTATACATGGTGAGAGC
-TCACCGAAGAATAGACGGGTAATGAGATATATATGTGATACATAAATGTG
-TGCGCCCGGGTATCCGAGAGCCGAAAACAGAAGCATGGAATGGAGCAACT
-AGGGAAAATTGTGTTATCACGAGGCACGGCGGGAGACACAATAATATGAT
-TTTTTTTCGAAAATTTTCCATTTTCACGTGGTTGTCCCATTACGATTTGA
-TCTACCAAAAACGCGGGAATTTTTCGCCTAAAAAAATGTAACGTCAGCAC
-GTTGTTTACCATGAGAAATCAGTTGAGAAATTAGCGTCTCTTCTCCCGCA
-TTTTTTGTAGATCTAACTTGATCAAGCCGAAATGAGACGCTCTGACACCA
-CGTGACGAAAAAAAGTAGATCAAAATTTGGCAAGCCCTTATAAAAGTCCC
-TTTTTCAGTTCTAGGCGGAGCTCAGTTTGACTGATGACGTAAACGCAAAT
-CTTGAAATTTCGAATTCTCTATGGAAATTAGAACTTCCCGCCGCCGCCAG
-ACTTTGTAAAGTTCAACAAAAAGATGAAATATAGAAAAAGTTCAGACTAT
-GATAAGGAACTTATGACTAACGTCTCTTGAGGTGAATGAGTATGATGTGA
-TTAGTGATGCAAGACGACTAGACCGAGAGAGAGAGAGAGAGAGGCTCAGA
-GAGGGGGGAGGGAAGGTAGGTTTGTAGGTAGGCAAGCAGGTAGGCAAATA
-GGGGGTCGTAAGTAGAAATTATGAAGGAACCTAGGTCGGCAGCCATAAGG
-TAGGCATAAAGTAGGTCAGCATCCAAGTAAGTTAGACAGGTACGCATAAG
-ATAGGAAGGTAAGTAGGCGCGGTGGCAAGGAGACTCAAGGCAAAGTAGGA
-CAGGAAGTAGGCAGTAGGTAGGCACGATGAAGGTAGGTGGGTAAGCTTGT
-AAGAAGGCAGCCATAAAGTATGAACGTCGACAGTAGGCATGCATTTAGTA
-GGTAGGTATGAAATAAGAATTAAGGTATGCATAAGGAAGTAAAGTATGAA
-TGATGAAGCCATGTAGATACAGAAATATCAGGCAAGTAGACAGGCAGGCA
-TAATATAGGAAAGTTAGCAGTAGGTAAGCATGTAGTAGGTACGTGGGTAG
-GCATGTAGGTAGGCACGTGGTAGGCTTATGGTAAGCAGAACACAAGCACA
-GAAATATGCATATTGGCAAGTATGTAGGCATGCATAAGATACAAAAGTCG
-ACCAGGCATGTAAGTAGGCACATAGGTAGGCAGGCTTGAGGCAGCAATGT
-AGGTGATCTCGTAAGTAGGTATGAGTAAGGAACCTAGGTAAGTCACAGGT
-ATTTGGCACAACCTGTGTTCTTCTCAATGGTAATCAGGCGAACGTGCCTG
-CCTGCCTACCTAGAAATTCGGTAAAAATTGTGGAAAAAAAACTAGGGGAA
-CCTCTTCCCAATGGAATGCGTAATGTGAGTGGGAGGCGGCAAAAAAAGAG
-CGGACGTAAACACTTTTTCCTAATTCTCTTTTTCTCTCGCTCGTGGAAAA
-TGAATGAATATTTGATACAATTTTGTGGGTACAGCCAGCAGGAGAAGAAG
-AAGCTGATGTCCCGACGCGCGCGCGCGAAAAAAACTTTCAATTCCCTCCC
-CTAATTATCCGCCTAACGCCTAATGTGTGTCAAATTTACCATGTATTTTT
-TTCTCCTCTCGGCTATGTTTTTTTTTCTTTTTCAGCAAAAAAAAGTACGG
-GCACATGAGGTCGGGATGGATAATTAGGGATGTGTGCCAATTTGTTGGAT
-AATAGACAAAAAAAGTACGTGAGATTTTTAGAAAATGCTGAGAAAAATAT
-CACGAGGCGTTGGGGACGTGGCCGCGAATGAGAAAACTAGGCCACCTTCA
-CAGGGCCCTGGCCTTCCTCATTGAACTTTTCGCGCTCTACTGACAAACGC
-CCGTGTACTCCACACGGACAAATGCATTTAGTTTTGCAGCTAGAATCGAT
-CAGCGACGCGACACGCAACGCGCCGTAAATCTACCCCAGATATGGCCGAG
-CCAAAATGGCCTTGTTCGGCAAACTCTTCCATTTCAAATTTTTTATTCAG
-TTTAATTTTCTAGGATACGCCTACGAGTGATCTAGGCCAGGCAGTAGGTA
-GGCAGCCAGTGTAGGTAGCCCCCTTTTGGTGTCAGGCTGTCCCATCGCGG
-TTTGATCTATCAAAAATATGGGAACTTTTCTCCCAGTAAAATGTGACGTC
-AGCACGTTCTTAATCAGGCGAAATCAGTTGAAAAGTCTGCGTCTCCTCTC
-CCGCATTTTTTGTAGATCAACGTAGATAAATACGAAATCAGACACTCACG
-TGGTGCCAGGCTGTCCCATCGCGGTTTGATCTACAAAAAATGCGGGAACT
-TGTGCCCAAAATTATGAGACGTCAGCACGTTCTTAATCAGGCGAAATCAG
-TTGAAAAGTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATCAAAGTAGAT
-CAATCCACATTAAGACCTTCTGACACCATGCCCGAGAAGAGTTCAAAATA
-AATTTCGTAGAACATAAATTTTTCCACGTGGATTTTACAGCACAATTGCT
-TATAGAGCGCGGTTGCACCCCAAATTTTACAGGAAAAATAGGAAAATTTT
-ACCAGATTTCCCGCGCAAGACACGAAACAAGGTCTTAAAAAGTGGGAGAG
-CATGAAAAATCCTAAGAAAGTAAGAAACTTCTGGTTTACCACATAACTCA
-AATTGGAGATAGTTCGACCTTAAAAATTTTGCACCAAAAAGGGCGGAGCC
-AAAAACACCAAAACTTACGTGCAAATTTGTACATGAAAAAACTAAAAAGG
-ACACCTAAAACCGGCGAAATATGAAGAAAAACGCTGAAAATGAGCAATGT
-GTATCAATTTTTCCCCCGTTGCTTAATTTAATACATGTCTTCCTCTCCCC
-CTTCCTTCCTGCTTCACACTCTTTCGGGCGGCGCCTCCTTTTGATTTGAG
-ACTTGAGACTTTTTTTTTTGTGATGTGCGTTGAGTAGTGTGGGATGCATA
-TATTATGAATCAAAAATCTGACATCAAAAATATCGCTGAAAAAATAGTTA
-AAATTTGCTTTAAAACTGCCGTTTTTGATCTACAGGGTGCTTTGGCGCGT
-TGCGGTCGCGTCGCGGCTTGGAGTTCTAGGCCACGGCCATTCAATTTGAC
-ACTACTACAATCAGAAATATTTTGTAATTCTTAGGCCATCAAAAAATTTT
-TAAGCCAGAAAACAAATCCGGAAATTTCTAGGCCATCAAGAATTTCTAGG
-CCACATCAGACTACTTTGAAAATTTCTAGGCCACAATGGGAACTAATTTC
-TGAACCTAATTTCTGAAATTTCTTGGCCACGATCTGAAATTTCGAAGCCA
-TAATTTGAAATTTCTAGGCCACGATCTGAAATTTCTAGACCATCAACAAT
-TTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTGTAGGT
-CAAGGTTTGAAATTTCTAAGCCACGATTTGAAATTTCTAGGCCACGATCT
-GAAATTTTTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTT
-TAGGCCACGATCTGAAGTTTTTAGGTCATCAAAAATTTCTAGGCCACGAT
-TTGAAATTTCTAGGCCACGATCTGAAATTTCTAGGCCACGATTTGAAATT
-TCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAAATTTCTAGGCC
-ATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAA
-TTTCTGGGCCACGATCTGAAATTTCTAGGTCATCAAAAATTTCTAGGCCA
-CGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCGCGATCTGA
-AATTTCTAAGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGC
-CGCGATCTGAAATTTCTAAGCCATCAAAAATTTCTAGGCCACGTTTTAAA
-ATTTTTAAAATGTTTAAAATTATAGGTTTTCAAAAAAATTCTAGGCCATC
-AAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATCTGAAATTT
-CTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAATTTTTAGACCA
-CGATCTGAAATTTCTAGGCCATCAAAAATTTATAGGCCACGATTTGAAAT
-TTCTAGGCCACGATTTGAAATTTCTGGGCCACGATCTGAAATTTCTAGGT
-CATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAA
-ATTTCTAGGCCGCGATCTGAAATTTCTAAGCCATCAAAAATTTCTAGGCC
-ACGTTTTAAAATTTTTAAAATGTTTAAAATTATAGGTTTTCAAAAAAATT
-CTAGGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCACGA
-TCTGAACTTTCTAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAAT
-TTTTAGGCCACGATCTGAAATTTCTAGGCCATCAAAAATTTATAGGCCAC
-GATTTGAAATTTCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAA
-ATTTCTAGGTCATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCC
-ACGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTGGGCCACGATCTG
-AAATTTCTAGGTCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGG
-CCGCGATTTGAAATTTCTAGGCCGCGATCTGAAATTTCTAAGCCATCAAA
-AATTTCTAGGCCACGTTTTAAAATTTTTAAAATGTTCAAAATTATAGGTT
-TTCAAAAAAATTCTAGGCCATCAAAAATTTCTAGGCCACGATTTGAAATT
-TCTAGGCCACGATTTGAAATTTTTAGGCCACGATCTGAAATTTCTAGGCC
-ATCAAAAATTTATAGGCCACGATTTGAAATTTCTAGGCCACGATTTGAAA
-TTTCTGGGCCACGATCTGAAATTTATAGGTCATCAAAAATTTCTAGGCCA
-CGATTTGAAATTTCTAGGCCACGATTTGAAATTTCTAGGCCGCGATCTGA
-AATTTCTAAGCCATCAAAAATTTCTAGGCCACGATTTGAAATTTCTAGGC
-CACGATTTGAAATTTCTAGGTCACGATTTGAAATTTCTAGGCCACGATTT
-GAAATTTATAGGCCGTGATCTGAAAGTTCTAGGTCATCAAAAATTTCTAG
-GCCACGATTTAAAATTTCTAGTCCATCAATAATTTCTAGGCCACCAGAAA
-ATTTGTGTTCACTTTTTTTTTTGGTTTTTGGTATGTATTTTTCAGAAATT
-ATTCAAAATTTGTGGGAGCAACAATATGCTTTTTTAGTTTCTAGGCCACA
-AAATTCTTTGGCCATTTTCACATTTTTTCCCGCCGCCAATGGTTCCACTG
-GATAATTGAATGTATAGAAAAAAGGGAAGAGTTCAGCTGGCGCAAAAGAG
-GGTAATTCGTTGGAAGGGAAAAAAATAAATGCAAATCTTCGCCAAAAACC
-AATTTTCGGTCGGAGCTCGGCGCGGGCCGACACACACAAAAATGGAGCAG
-AAGAAGACGTCAGAATCTTCTTTTTCAGAAGGCTTTCTCACTTTGAAAAT
-GGGGTGTCCAATTTCTTGTTGCTAATTGTTGGATGGGGAAAGAATGATAT
-TTTGTTTCAGGTTTCACACAACATCAGCCTAGACATTTTTTTTTTGTTTT
-CTCCAAGAGGAGTACACACACTATAAATTGTTGTAAAAATCGAAAAACAC
-GTGGAGCCAGAATTTCTTATTTCGATTTGATCTACAAAAAATGCGGGAGT
-TAAAACGCAGACATCTCACCTGATTTCGCAAGAGCGTGCTGACGTCACAA
-TTTTTTTGGAAAAATATTTCCGCATTTTTTGTAGATCAAACTGCAATAAG
-ACAGCCTGGCACCACGTGAAAAATAGTATTCCTCTTGAAAAAGATTTCCC
-GAATCAAGTTCCTTGAAAGGAGTACGCAAAATTTTGCAAAAAAAATCGGT
-GGCCGAGTTTACTCTTCTGGCGGCCACGTAACAAAATTAACAAGGAAGGA
-TAAAAAGGAAAAAAAAATTTTACTCGTAAAAAGGTACCAGGAAGCAATTT
-GAGGAAGGAAGGAAATGTGAGTGTCTACTCTAATGATCTACCAGTTTTGG
-TGGCCGCGGAACAGAGAAAGCTCGGCCCCCAAGTATTTTTTCAAATATCA
-CGGATTTCTGGTTTCCCTTATAAGTTGAAATGGAAGAGTTTTTAAAGAAC
-GAACTAGGCCATTTTAGCTCGGCTGGGGCAGATTCACGGCGCGTTGCGTG
-TCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATATATTTGTCCGTGT
-GGAGTACACGACTTTCCCACGAGTTTTCCGACAGGCGATTGTCAATGGAG
-CGCGAAAAATTCAATGAGGAAGGCCAGAAACCCGTGAGATATTTAAAAAA
-TATTCCAAAACTATTTTTATATTCAAAATTGGAAATTATACATACTATAA
-GTATTTTCAACTACATACATGGCCGCGAAAAAAAAAAACTCGGCCACCAA
-TTTTCGCGGTCACTTACCGCAGATCTCCATCGATCCTGAAGTCTTGCCGT
-ATACAATAAGGGCATTTTTCGGATCATAGTGAATGAATTATTTCAGGAAT
-ATTATTTCAAAGAACACACACCACACAAGAAATGTGAAGGGAAGGAAACG
-GGGAAAAAGAGACAGGTGGAAAAATACATTTTCTCTATTATTTCGCTCTG
-TTTCTGACTAGGAAATGAATCAGAATCAGTGATTAAGAAACTGGGAATTT
-ACGAGGTGTTTAGGGAGATGGTGACCGCGAGGATGAGGAAAAACTCGGCC
-ACCGCAAGACTTACCGGCTTAATCAATTGATTTCCTCGTATGTGATGGAA
-CAATGTGAGAGCCGGAGCTTCACTCGTCATAGCTTTGTGTCTAGGTGGCT
-CTCAAGTACTGCTGGACCTGAAAAACTGCAAATTTAATTTGAAATTTGGG
-ATGCAAAAAAGTAGCAGCCGACACCTGCCGGGTTCCCGCAAGATGTCGGA
-TGCTTCAATTGACCTAGTAGAATCGTTAGTGATCTACCGAGCAAAAACAA
-GTATGCTTGCAAGAAAAAAAGGCGTGTGGCTCAAGTTGACAAATTCGACA
-CTTTGGACACACGAAATTGGATGAGCCACACCACACCGGCTAGCTCAGAA
-GAGCCCCTCCGACGTCAAGGACCCCATGTGCGCGCGCGAGCCGAGATTCT
-GGCAACATGAGAAGCGGAGAAGGCGAAGAGAAGAGTGCTAATTTGAACTT
-GTTGCTGCAGGAAAAATATCTAGGCTTAGGCTTAAGCTTGGGCTTAGGCT
-TAGACTTATGCTCAGGCTTAGGCTTAGGATCAGGCTTAGGCTCAGGCTTA
-GGCTCAGGCTTAGGCTCAGGCTTAGGCTCAGGCTTAGGCTCAGGCTTAGA
-ATTGGGCTTCGGCTTCGGCTTTGGCTTGGCTTAAGCTTAGGCTTAGGCTC
-AGGCTTAGAATTGGGCTTAGGCTCAGGCTTAGAATTGGGCTTAGGCTCAG
-GCTTAGAATTGGGCTTAGGCTTTGGCGTAGGCTCAGGCTTAAGCTCAGCC
-TTAGGCTTTGGCGTAGGCTTAGGCGTAGGCTTAGATTTAGGTTTAGGCTT
-AGGCCTTGGCCTAGGCACAGGCCAAGGTTTCAGGTCACTATCACTTGCTC
-CTAGGTGTGGCTGGGGAAATGAAATTCTAGGCCAGTGACGTCAAGATTCT
-GGAAGAGTTCCGTTGACGCCACCAAAAGCAACAAAAACTTCAAATCTGAG
-AAGATCAGAACAAAATGTACTGAAAGTACAAAAAGCCCGCACTTTTTTCT
-CTATTAATACTACTCATTTGAAGAGTGGGGAAAAGAAAAATGTGTTGCAA
-GAAATAATTCCGTGCGAAAAAAGTTTGAGAGGAATGAATGGAGCGGAACT
-TTTTTTTTTGTTGGAAAATCGTAGGTGTGACGTCACTTCTCTTCCAACCC
-CCAGGTTTCTAGGCCACTTAAGAATTTTGCAAAAAAATCACAGAGCAAAA
-CTACAAAAAGGAAAGAAGAAATGTGCTCTTGGAAAATAATAAATATTGGT
-TACGAAATAAAAGAGAAAAGAGAACGAAAAAAATAAAAAAGAAAATGGTA
-ACCAAGGAGGAATGTGGAGAAGAGGCTCTTGTGAGCCCAGATATACCCAG
-CAATTAGGGAGCGAGTACTACTGCCGGGAGATGACGTTTCGAGGATATTT
-CTCACTGGAATGGAGGGTGGTGGAAGAGTTTTGTAAAGTTCTAGGCCACG
-GGTTTTTTTGGCCAATGAGCATGGTGCATCGATGAAAAGCTATTGGGTTT
-CTCGGCCACAATAAATTACAAAAACCTAGTACGATGGAGCACACTTGCAA
-TAGAATTGCAAAAATTTATTTGAAAATTGAGAAGAAAGAAAATCAGGGGG
-GCATAAATGCTCAACAGTGCAATCAAATTGTAGAAGAGCTTTCGCCCAAA
-AAGCTAGGCCACGGAGGAGACCGCTGGAGAAAGTGACGTGTATATGGTGG
-AAGAGTTTTCTTGTTTTTCTAGGCAATCTTGGGCGATTGCAAAAATTGAA
-TTTATGAAAAGATGGCTTGGAAGAGCTTTCGCATAGAAAATCTAGGCCAC
-GGCTAGCAATTTAATAGGGGATAGAAAACCGCGTCGGAAGATTATTTAAC
-TTTTCCATAAAAATTAGCAAATTTAAGAGAGTTCAGATACTGATCTGGAA
-GAGTTTTTGAGCAAAAAACCTTGGTCACGGCCAGCAACTAAAGTAGTAGG
-GGAGATAGGGTACCCCGCTAATTTTTTATTTATTTTTCAAAGAAAGTTTT
-AAGGTTTCGGGAAAAATTTTGATGAAATGGCTTGGAAGAGCTTTTGCCGA
-AAAAACTTAGGCCACGGCCAGCAATCTAATGAGAGGGGGAGGGTTCCCCG
-CTAAATTTTTTTTTTGATTTTTAAACAAAGTTTCATGGGTTCGGGGGAAA
-ATTTGATTAATTGACTTGGAAGAGTTTTTAAGCAAAAAAAAACCTAGGCC
-ACGGCCAGCACCCTAATGAGAGGGGGGAACATAAGGTACCCCGCTATTTT
-TTTTTGATTTTTCAAAGAAAGTTTTAAGGTTTTGGAGGAAATTTGATTAC
-ATGACTTGGAAGAGCTTTTGCAGAAAAAAACTTAGGCCACGGCCAGCAAC
-CTAAAGTAGTATGGGAGATAGGGTACCCCGCGGAAAATTTTTAAATTTTG
-GTAAACAACAATGGAAGAATTTTCCGGTTTTCTAAGCCATTGCATTTTTT
-CAGCGTCACGGATTTCTGGCTTCCCTCATAAATTGAAATGGAAGAATTTG
-CCGAACTAGGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGCAAAACTAAATGTATTTGTCCGTGTGGAGTA
-CACGACTTTCCCAGGAAGGTGATTGTCAATGAAGCGCAAAAAATTCTCAA
-AAAAAATCCAGATTCCCGTGCAGCGTCGCAGGAGATCATTTTCAAGAAAT
-CTGGCTCAAGAAGGATTCAGTAAAACAAGAAAAGAAATAAAAAAGGAATG
-AAAGGTAAGGGTGGACAAGTCGGCGGGACAACTTGTCACTTGCCATCATC
-ATCATTTTTCTTCTCCTCCTCATCAGCTTCTGCTGCTCCGCGAGCTCGCG
-ATGACTCTTCTGAAATTCTAAACTTGGCCAACACAACGTCGGCAACGAGT
-TTCGAATTTACACACACACACACATACGAAAAAAGCTCATTAATTGGAGC
-AGGAGACGGAAGAGAGGGAGGAGAGGCTGCTCAATGAGTTAGAGAAGAGA
-GAGAGAGAGAGAGACTGAAAGATGAAGTATAAGCAGAAGTCGTCGGGATG
-ACAGAAGAAGGAGGAGAAGAAAACGTGAGAAGGGGGGATGTGGAGACAGA
-AGGATATGTAAATATATTAGATTCAAGGATTACAGCAATTTTAAGGAGGC
-AAAAAAAAACAACGATGCTCCGATATTTTTGGGGTTACTGTAGTTTTTGT
-AGATACTTCCAGAAGTTATAAACAAATCCGAGTTTTTTAAAATTTGCCAG
-AAGCACGGGTTCATTGAATTTTTCACGCTCCATTGACAATCGCCTGCCGG
-ACAACGCGTGGGAAAGTCGTGTACTCCGCACGGACAAATACATTTAGTTT
-TACAACTAAAATCGAGCCGCGACGCGACACGCAACGCGTCGTAAATCTAC
-ATATATGGCCGAGCCAAAATGGCCTAGTTCGGCAAAAACTCTTCCATTTC
-AATTTATGATGGAAGCCAGAAATCCGTGCAGAAGTTTCTCGGAAAAAAAA
-CAGAAAGTTTGCGAAATGGCAACCTCTAATTCATTAACATAAATACATCA
-AATATGACGCGCAAAAATGAATTAATTTACTAGTGAAACATGGTGCATTG
-AAGTCGGTGTTTGCACAATTTGTACAGATCTGAGGTTCACTAACACCAAT
-GCACGGCCCGAGAAGTGGTACCTGTACGCAATTTGTCTACCGTATACCTG
-GACGTTTGGGCGCGTGTATCTCAAAAACGGTTGGTCCAGTTTTTTTGTGA
-TGCATATAAAAAATGTCCGAAATTAAATTCTAAATTTTTTGGACCAAAGC
-TTTTTTCGTTATCACGCGCCCAAACCTGGTCTACACTCAAATTATCAGTA
-GAGCGCATTTGCATGGATGTACCACTTGCCGGGCCGTGTTCAAAGGGGTG
-CAACGATTGCGCGTCAAATCGAATGCAACTACAGTAATCCCTAGTAGTTG
-CGCTTCAAATTTGATGCATTGCACGGCCCGGCAAGTGGTACATCCATGCA
-AATGCGCTCTACTGATAATTTGAGTGTAGACCAGGTTTGGGCGCGTGATA
-ACGAAAAAAGCTTTGGTCCAAAAAATTTAGAATTTAATTTCGGACATTTT
-TTATATGCATCACAAAAAAACTGGACCAACCGTTTTTGAGATACACGCGC
-CCAAACGTCCAGGTATACGGTAGACAAATTGCGTACAGGTACCACTTCTC
-GGGCCGTGTTGAATGTTTGAGAAATGTTAAAATTTTGAGTTATATGTGCT
-GGAAAATTGACATGAACATGGTTTTTTTCATTATTTGCGCGTGAATTATG
-GTGCATTGAAGTCGGTGTTTGCACAATTTTTTTCAGATCTGAGGTCAACT
-GACACCAAAGCAACAGAGTTGACGCGCAAATTTTAAAATGCGCTTAACAT
-TTGGCACGCTTTGCAGTCGGTGTTTGCACATTTTCGATTGTTGTGTGAGG
-TTCACCGACACACCAGATTTGACGCGCAAAATTGTACGAAAACAGTTAGT
-TAGAAAACTAATAAAAACTATTAATAAAAGTATAGTGCATCCTGAAAAAT
-TATTTCTGCAAATGTATCTATAGAATTTAAAACAAAATATACAAAAAAAA
-ATTATGAAAACCACGACGAAAAACCCGGAAATGTTTTTTGGGTAGCTTGT
-CGATTCCGGAGGGTATTGAATTTCGCGCTCGAATAATATTGTTTCCTATT
-CATTTTCCCCAGAATACCTACAGAATTTGGGGGAAAAATATGAACTGGTA
-CCTAACATTAACCTACACGTTTTTTAAATAAGTTTAGGCCACGCCCAGAA
-AGTAGCTGGGCGGGGTTGCAGATTTTTCTAGCTTTCCGAAATATAAAAAG
-TCGGAAAAAAAGTTGTAGTCTGTAGTTTGTAGTTTGTAGTTTGTATCAGG
-TTGTCCCATAAGTTTTTGTACTTTTTTTCAAATATTTTTCCAAAACTTCT
-AGAAAGTTTTAAAATTTTTTCATCGTAGGTCGTGTCAAGGTCGGGTCGTC
-CCCTTTCAGAAAAGATTCATTTCATCCATTTCTACTTTGCCACGATGACA
-ATCATCAAACTTGAACGTCGAGACGTTAGATTGCTTCTTCTTTATGAATT
-TCGTCTTGGTCATTCAGCAATGGAAGCGGAACGAAACATATGCGGTGCGA
-TGGGTGAGGGAGCACTCTCTTATAATACAGCAAAGAGTTGGTTTCAAAAG
-TTCAAGAACGGCGACTTCAGTCTCGAAGAAATAGAACGTTCTGGGCGACC
-GGTAGAGTTAAATGAAGAAGACCTAGTGAAGCTGGTGGAGGAAGAGCCTC
-GTCTTAGTCTTCGTGAAATGGAAGAGAAGCTTGAGTGTTGTCATAGCACA
-ATTGCACGTCACTTGGGTCGCCTTGGTTTTACTTCAAAACTTGGAACTTG
-GGTGCCTCATGAACTTTCGGCATCACAGAAGCTCACTCGGGTCAACGTTT
-GTACTCAACTTCTAACTTTTCGTCGAAAGTTCGATTGGCTGAACAATCTG
-GTTACTGGAGATGAGAAGTGGGTGCTCTATGTTAACCATTCCAGAAAACG
-TCAATGGCTTCCGATCGGTGAGAAAGGAATACCGACGCCAAAGCCTGATC
-TTCACCCAAAAAAGATTATGATCTGTGTCTGGTGGGGTGTTCAAGGACCC
-GTGCACTGGGAATTGTTGCCAACTAATAAAACTATCACTGCTGATTACTA
-TTGTGCCCAATTGGACCGAGTTGCAGAAAAGACCAACGGAAAATATGAAA
-AACTATATTTTCTTCACGATAATGCTAGGCCTCATGTCGCCAAGAAGACT
-TTCCAAAAGCTGCAAGATCTTGGTTGGACTGTTTTACCGCATCCACCATA
-TTCTCCAGATCTTGCACCAACCGACTACCATTTGTTCTTGTCTCTCAGTG
-ACTACATGCGCGACAAGCAATTCGACGACGAAGAGCATCTCAAAACTGAA
-CTCTCCACTTTCTTCTCATCGCGTTCGCCGGATTTCTTCTCCCGTGGCAT
-CATGATGTTACCTAGTAAATGGCAACAAGTGGTGGACACTAATGGTGAAT
-ACTTGTGTGAATAGTACTACTTGTCGCTTGAGAGAAATAAATTTTTTTCA
-AAAAAAAAATAGTACAAAAACTTATGGGACAACCTGATAGTTTTAGTTCG
-TTATTTGCAAATTGTTAACGTTAGTATTAGGAGAGCCGAAATAAATAAAT
-TTTAGAAAAGAAAACGAAATTATATACATAGTTCATTAAAATGTGGTAGT
-TTGTAGTTTGTAGTCTATGTATTATGTCTATTCAAATTGTATTCAACATC
-AAAAATTAAACAGGAAACTTATATTTAAAAAAAAAACGAATACTGAAAAA
-AGGCGGCTGCATAGGAAAAAACAATGATTCTCCTCCAAAAAATAGAATTC
-CGCATTTTTTCAGCGGCTATTTTCACGATGATGAGAGGAGACAACAAAAA
-CATTTGAGATGAGAAATGAGGGGAATATTGCACAAAAATTGGGAAATGAT
-TTTTTTTACTTTATACACAGTTAAAATGCGATGCGCGCATAGTGTTTTTG
-GCGTGGATCGCGAGTGGGAGAAAAAGGAACCGGAAATGATGCGCATTGTG
-CGTCCATCGCGAATTTGAGATGCATTGTGCGAGCATCGCGAACATAAATA
-ATGGGCACATTGTGGATTCTCCTTTCTGATAATATTTTACTCTCTATGGC
-TTCACCAATTATCTTTCTCTCTGTGGCTTCCCACTATATTTTACTCTCTG
-TGGCTTCACCAATTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTC
-TCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAATTATTTT
-ACTCTCTGTGGCTTCCCACTATATTTTACTCTCTATGGCTTCCCACTATA
-TTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCAC
-TATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTC
-ACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGG
-CTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCT
-GTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACT
-CTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTT
-TACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTAT
-ATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCA
-CTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTT
-CACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTG
-GCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTC
-TGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTAC
-TCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATT
-TTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAAC
-TATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCC
-ACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCT
-TCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGT
-GGCTTCCCACTATATTTTACTCTCTGTGGCTTCACCAACTATTTTACTCT
-CTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACTATATTTTA
-CTCTCTGTGGCTTCACCAACTATTTTACTCTCTGTGGCTTCCCACTATAT
-TTTACTCTCTGTGGCTTCCCACTATATTTTACTCTCTGTGGCTTCCCACT
-ATATTTTGCTCTCTGTGGCTTCCCTCTATATTTTACTCTCTGGCTTCACA
-GTATATTTTATTCTCTGGCATCACAATATATTTTACTCTTTGGCTTCGCA
-GAATATTTTACACTCTGGCTTCACAGAATATTTTACTCTCTGGCTTCGCA
-GAATATTTTACTCTCTGGCTTCGCAGAATATTTTACTTTTTGGCTTCACA
-GAATATTTTACTATCTATTAATCTATTTCTTCGTATAACAATCTATTTTT
-TCGTATAACAATCTATTTTTTGTATAACCAACTTCAAACTCAACTTTTCC
-AAAACTACAGTAACCCTACAGTAATTCTACAGTACTCCTAAAACTCCCCG
-CAACCTGCAGTTCAATGACACCTCGTTTTCTCACGCGTGACTCATGACTC
-ATTAGCTTACATTTCCTTCATCCATCGGTGGTGGGGCGCTGTGTAATATA
-CAAGAAGAGACACCACCACACGCTGCTATTTCTGCTGCTGGTCTGTCTTC
-GTTTACAGCCACTTATGACTCAGCACTGCCATCAATGACTACTTCCTTCT
-TTTTTATCTTTTCGGCTTCATCTCGAGTAGCAAATTTAACAAAATTCAAT
-AGGTGTGACGTCATCAAATGCCTTCGTGGCCTAGAAATCCAAGATTTCTC
-TCGAAAGGATCAATGTGATGTCATGGCCTAGAAAACTCCAGTGTGAAACC
-TAGGCTATGTTAAATAGTCTTGAAAACTCTAAACTGAAGCACATAAGGCT
-ATGATGTCATCGCCTAGAAATCCCAATTCTATGACGTCATGAAAGACCTG
-AACTGCACCGAACCTAGGAATACCCTCAAAAGGGGTGCTGTGAAGTCATG
-TCCTAGAAAACATGAGTGCGAAAACTAGGCCGTAATCTACCATGTGGTAG
-ATCATGCGGCCCTATTGATGGCCTAGAAAACTTACAGCTTGAAGCTATGA
-CGTCACGACCTAGAAACTCAATAGTTGTGACGTCATCAATGACCTAGGTG
-TATCTCGAATGACGCAGTGTCTTCTAGAATTTTCTGAATATCACACAAAA
-GTATAACATCTTCTTGAAACCAAATAATTTTGTTGTAACACCCACACAGT
-ATTGTAACAAATGATATAATAGCGATCGGAACATTCGAGAAAACTGGAAA
-TTTGAGGTCTGACCTTGTTCGGGAAACTTACCAGTGATTATGAGGTGTGT
-CGAAAAATGTGGCCTAGAAAATGGGAAAACTCTTCCTTTTTTTTTTTAAG
-TCCAGAATTACGTTTTTGAGAACGAGAAGTGCATTTCATTTTTGTTAGGT
-TGGAAATTTAAAATTTAAATATTCGTCTCCTAGTTACAGCCGTGGAAGAC
-TTTTTCAGAAACTTTAGCCACGTGTCGAAGTCTGGCGGTGCCCACGATAT
-TAGAGAATGTTGATATTTCCTATTTACTTATCTCCTCGAAATTTTAAGAT
-TAAAGTTACTACCGTTAAGTTACACTGGTGGAAGAGTTTTTAAGATTTCT
-AGGCCACGGCAAAGTTTGGGTGTGCCAGTGACCCTAACACTAAATTTTTA
-AATTTTTTTCAGCCAAATCATCATATGGTGGCCTAGAAAATTTAACACCT
-GAAAACTCTTCCATATTTTTTTAATTTCTGAAATCCAACAAAATAATTTT
-CAAACTCCTCTTCCTTTTTTCCAGAAAAATAAATTAATGTAAATCAAGTT
-CATCTCCGATGAGTTGTAACGGTGGAAGAGTTTTTCAGATTCCTAGGCCA
-CGTCAAAGTTTGAGGGCTTCCCGTGACCCTAACACTAAATTTTCCAATTT
-TTTCAGCCAACCCAAATCAGAAGCTTTCTCTTTGTGTAATAACATGACAA
-TGGGCTATTATCATATGAAATTTTTTAGGTTAAATTTCTGAGGTCATTTG
-CAAAGGTGTCATGACTAGTTTGGAGGCTTTTTTGTGACGGTAGGGGTATG
-AAACAGGTTGTTACTTCTCGAAAAGGTATTATGTGGGGGAGAGGAGAAGG
-AAAGAAGGAAGGCAGATTAGCCAACAGAGATACAGCAAATTTTGTGTGAG
-TGGTGGCAGTTTTGAGAAGAAGCCATGCGCCAAGGTCGGTTTGCCTTCTG
-TTTTCTCATTTTTCGGTTTTTTTGTGAATTTTTGTAAATTAAAAATATTT
-TTTTATAGAAATAAAAATTCAGAAAAAAATACTGGAAGTTTCGTTTGCCT
-TCAAACATTTTTTAAAAATTCACAGTTTTTCAAATAGATGTACTTACACG
-TGGTGTCAGAGTATCTCATTTCGGCTTGATCTACAAAAAATGCGGGAATC
-TTTTGCCCAAAAAAATGTGACGTCAGCACGCTCTTAACCATGCGAAATCA
-GTTGAGAACTCTGCGTCTCTCCTCCCGCATTTTCTGTAGATCAGCGTAGA
-TCAAGCCGAAACGAGACACTCTGGCACCATTTTATTTTTTTGGGCAAAAA
-ATTCCCGCATTTTTTGTAGATCAAGCCGTAATGGGGCAGCCTAGCCCCAC
-GTGCACTTATTCCTTATGCCGAACGACACTCCGATATCCCGTTTTTACAG
-TATGACTGTGGGTTACTGTACCATTTTTGGTGCTTTTGTAATATTGTTTT
-CTTTTTCAAAAACCTAGGAAAAATTTGAACAATTGTTTTTTTTTAATATT
-TGAATTTTTTAGGCTCCCACACATTTTTGCGGGATATCGGAGTATCGATG
-TAAACGTTTTTTTTTTGGTTTTTTGTATTAAAAAGGGTTTAAGTGTTGTA
-ATAAGACATTTTGAATAAAAAATAGCTAGCGCCGCCACGACTTACTGGCT
-TCCCTCCTAAATAAAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGG
-CTCGGCCGTATCTGGGGTAGATTTACGGCGCGTTGCGTGCCGCGTCGCGG
-CTCGATTTTAGTTGTAAAACCTAATGTATTTGTTGTCCGTGTGGAGTACA
-CGACTTTTCCACGCGTTGTCCGGCAGGCGATTGTCAATGGAGCGCGAAAA
-ATTCAATGAGGAAGGCCAGGACACCGATTCAAAGATATAACGGCCCACAT
-TTCAACAGCGGTATATCGGAGTGTCGTTATTTTAAGCTTGCACACGGGCT
-TCTGGCCTTTTTCATTGCTTTTTCGCGCTCCATTGACAATCGCCTGCCGG
-GCAACGCGTGGGAAAGTCGTGTACTACACACGGACAATTTTTTTTAAGTT
-TTATAATGAAAACCGCGACGCGACACGCAACGCGCCGTAAGTCTACCCGG
-GCCGAGCCGACACGTGGTGTCAGAGTGTCACATTTCGGCTTGATCTACGT
-AGATCTACAAAGAATTTTGCATGATTAAGAACGTGCTGACGTCACACTTT
-TTTGGGCAAAAAATTCCCGCATTTTTTGTAGATCAAACCGTAATGGGACA
-GTCAAAATGGCCTAATTCGGCAAACTCTTACATTTCAAAATATGAGGGTA
-GGCAAAAGCATGGGGAATTTGTGATTAAATTTTTGAAAAAGGAAACAATT
-TTTTCCAAATTTCTTCTGAAATTTTTTCAAAAATAAATGTTTTTTTTCCC
-TAAAATCTTCAAATTTCTAGTTTCAATCTCTCACTACCGTGACCAAAAAT
-TCCTATGATTTTTGACCTCCCGCCACACAGTTTTACCACCAACTTCTTCC
-CCCCCCACCCACCCACTTACTTCTCGTATCTGAAACTCCGCCCCATTTTT
-CGTGTACTTTACTACTACTTGAATGATGATGAGGTAGAACAAATCTGTGT
-TTATTGGCAGAAGCAGTGGTAGCAACAGGAGAAGAAGAAGAAGCATCACT
-GTGTGGAACCAGCCAGCTGTGTTGTTGTGGTTTTAGTCGTGGAGAGAGAG
-AGGACGACGTCGTGTGTCTTCAATAAAATGAGGATCTCATCGCTCTTATT
-CCTGACTTTCTTGGCTGGAATTGTTCAGGTAAGCTGGGTTTTAAGTATTG
-ATATTGGTGCTATTTGAAAATTATTTCAAAAATTTTTGGAAAATTTTTTT
-TTTTTGGCCCAAAAATTTTTTTTCTAGAACTTTATCATTCCTAGGCATAC
-TCTAAATATGTCTGCAAATATTATTTTTTCTGGAAAATTTTGAAAATGTA
-TATATGGATATATGCAAGTTTGGAAGTTTTTGTAGTATTATTTTGAAAAA
-TTATAAATTTTTTTAAAAAAAATTTTTTATAAATCTAGCAAGAAACGTTT
-TTAAAAACAATTTTAGTCAATTTTCTTTTTTTTTTTTTGGAAATTTCACC
-AAATATCGGCCCAAAATCTATGCAATACTATTTTTTCACAAAGAAATTTT
-CAAAATTTGACATTATACAGATCTAGGGCTTCCATGGTAGGCAGGCGCGG
-TTTCAGGGACCTGCCTGAAACCTACCTGGTTGCCGCCGGCCTTAATTTTT
-ACGGGAATTTAGAAAAATTTCTAATTTTCTCATTTCTATCAATTTGATGA
-AAACCAAAATAAATTGGCGAGAGGCAGGCAAAGGTTGCCTTAAGGTCAGG
-CAGGTAGGCGTTTTAACACCTACCAGCTTTACAAAAGCACTATACAAGTC
-TGTTTTTGAAATCTCTAGCTTTAAAAATCTTTAAAACAAGACATGGTGCA
-AGACAAGACAAAGACATCGACAAATTTTCGACAAAATTAATTTTTTTCGA
-AAAACTTTTAGTTTCTTCCAAATTCGCCAAAGTGAAAAAAAAGTTCCTAA
-ACGTGAGATTTTGTATGTCTTCTACACATACTAGCCAATATCAATTACAA
-TATCTGCCAAGAAAATCTCGAACCAAACACCAAAACGGCGTTTGGTAACC
-GGTTTTTTTTCCAAAAAAACTATACATAGTTTCTAGTAAACAAATACGAA
-TGGAAAATTCAAGGTGACAGAGAAGAAAAAAAGATTAGAAAAAAAATCGT
-TGGTGGTGGCCTAAGAATTGCATGTAACGTCACACCTCGGCCAGGGGTCA
-TGGTACATGCTACATGATTACCCATGGCAAAAGAGTGACGTCACTCTCGG
-CCATGATTTTTAGGTTTAGGCTTAGGTTTAGGCTAAGGCTTCGGCTTAGG
-CTTAGGCTTAGGCTTAGGCTTAGGCTTAGGCTCAAGCTTAAGCTTAGGCT
-TAGGCTTACCTTATGAGCCTATAAGCTTTCTGAAAAAGACAAATATTAAA
-AAAAAACCAAAAAAAAAAAAAAAAAAAGACAAACAAACAAATAAAAACAA
-ACAAACAAATAAAAACAAACAAAATATTTGAATTTTTCTAAGAAGACAAA
-TACGTCACTCTCGGTCACGATTTTTGGGCTTTAGGTTTAGGTATATGTTT
-AGGCTTAGGCTTAGGCTTAGCCTTAAGCTTAAGCTTAGGCTTAGGCTTAG
-GCTCAAGCTTAAGCTTAGGCTTAGGCTTACCTTATGAGCCTATAAGCTTT
-CTGAAAAAGACAAATATTTAAAAAAAACCAAAACAAAAAAAAAAAAAAGA
-CAAACAAACAAATAATTTTTCAGGCCCAAGACTTCCTTGCAATGTTCAAG
-CCGTTCCTCGGAGGTGGCGGTGGTGGCGGTAATCCGTTTGCAAATCCACA
-GGCGATCGGCGTAAGTTTTCCGACAGGCAAACAGACAAACAGACAGACAA
-TCGAAAGTGGTCCAGGCGCTGAATGTGTTACGCAATTGGTTTTGGGCGCC
-ACGCGCGCATATTATTTGCATATATACATACATCATTCAGATAAATGGCA
-TTGAAAACGAACAAAAAGTGAAGATTTAGTGGGTTGGCAAATGCATTTTA
-TGTTTCTTTTCCAGGGTCTCTTCCAACAATTCGCCGGTGGAAATGGTGGA
-GGATTCGGGCAGCTTCTTGCTGGAGCAATGGCACCGGTATGTGTTGCGAC
-GTTTAAAACGGAGTGTCGTTGTGAAATTTTCCGCTTTGGAAAACATTGAG
-AATATTCGAAAATTTTTGTAAAATTTTGAGATTTTCTTTTTCCAAGCTTT
-GGGCTTAGGCTTAGGCTTAGGCTTAGGCTTATGCTTAGGCCTATGCTTAG
-GCATAGGCTTAGGCTTAGGCTAAAGCTCATGACTAGACTTATTCTTAGAT
-TTAGGCTTAAGCTTAGGCATGGCCTTAGGCTTAGGCTTTTGCTTAGGCTT
-TTGCTTAGGCTTTGGCTAAGGCTTAGGCATAAAAAAAGAGAAATTCCCAA
-AGTAAAAAAAAAGACAACTTTTGACAAATTTGAAAGTGAAATGTTATATT
-TTAAGCCTATTTTTTCCCTAAAAAGAAAAAAATTACTTTTATAGTTTGAA
-AACGATTTTTTGGCAGTGTTTCAGCAGTCAAAAATATGGCTGAAAAAAAA
-AGTTGATTTCAAAATATTTTTCATCTCAATTAATTCTTTTAAATTTGCTC
-TACCAAATTTGAAAAAAATATTGAAAATTATTTTAAAAAATTTAAATTAT
-TAAATTTCAAGTAAATTCGAAAATTTTGTTTATTTATTTTATGTTCATTC
-TTACAATATAAATTATAATCCTCAAACATTCCAGAAACCAGCACCAGCCG
-CAGCTGGACCCCGCTCAGCTCCAGCTCCAACCAACGAGGACTACAACACC
-GACATCGACGTTCCAGCTCCAAAGGCAAAAGCCCGTGCAGCTCCAACTCC
-ACGAAGAGCACAAGGTGATGATGATGATAATATTGATATGTCTCTGACAC
-GTCTTGGCTAACTTGGCTTGGAAAAGCACAATTCCTTTAATACAAAAAAC
-TTTTCTCAAAGATTCTCAAAATTTTGCACTTTAATTTTTAAGTTTAATTT
-TTAAAAAGTTGTCTCACGTTTTTTAACCAATTTATATGCAAATATGATCC
-TTATTACTAACAATATTTAGTAATCTAAACATAAATTGGAATATTTGGTC
-TTTTTCCCGCCGAAAATGATCAAACATTCCGAAGTTAGCAACAGAAAATT
-GCAGTGAATTGTGTTGGTTTAATTTTACCGTCGTTTTTCATATTTTTTGC
-CCGATAGCTTTGCTGTGTTTTGTGCCATCCTTTTCTCTGTGATATACTGT
-TACTTACTTCAATAAATGATTCTTTTAAAAGTTTTCGCACAAAAAATTTA
-GAGTTGCTGGCAAAAATACACGCCGACACGTGGTGCCAGAATGTCTCATT
-TCAGCTTGATCTACGTTGATCTACAAAAAATGCGGGAGAATGGAGACGCA
-GAGTTTTCTATTGATTTTGCATGGTTAAAAACGTGCTGACGTCACATTTT
-TTTAGGCAACAAATTCCCGCACTTTTTGTAGATCAAGCCGTGGTGGGACA
-TCCTATCCCCACTTGCGCTGGGGGGACAAAACCGACATAACTTTTGAAAC
-ATATTACACATATACATTTAATATATGTTTTCTGAGAGAAAACGTTTTAG
-AAATTTTAGAGAATTTCAGCAAAAAAATTCTGATAGCTTTTTGGAAATTT
-ATATTATAAAATTTTTTTTTTTTTTTAATTCTGATTTTTTCAAAAAAGAA
-ATTTTGCAAACCGCTTCCAGAATATTTGCCTGTCTCAAAATACCCTAAAA
-AACATTAAAATGTTTCAAAAATTATCTTTTGGAACAATTTTACGGGTCAC
-GCGAAATACTTTCTTTGTAAGTTTTTTTTCTTTGAAATTTAGATTTATTC
-CCAATATACGTAAATTTTTCACTGAAAGTTAGAAAATTATACTTGTTTTT
-TTCCAGAAATTGAAATGTACATGATACAAGGCTGCTACATTCCAGCAAAA
-TCTGATAAAATTTTAGAAACAATTTTTTGTCAGAGTCTTGAATATTTGAG
-CTATAAGTTTTTTTTTTTCAAAAAATTAATCCAGTTTGGCCTAAAAACTT
-AAGGCTAAGATTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTCAGCCTAA
-GCTTAAGCCTAAGCCTAAGCCTCAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAACTTAAGTCTAATCCTAAGTCTATTCACTAAAATTTTGACGTAAAA
-CTTGGGACTAAAAATTTTGGACACAAATTTTTTACCTAATTTTTTGGTCT
-AAGCCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAA
-GTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCT
-AAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAA
-GTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCTAAGTCT
-AAGTCTAAGCCTAATAAGCCTAAATAGGGTCTAACGCTTGCCACTGACGC
-CGCTAACGCTCGCCACTGAAGCCACGCCTAAGCCTAAGCATAAATCAATT
-TGAAACTTCAGACTTAAATTTCTTGGTGGCCTATACGACTCTCTGTTAAA
-TTTCGCTTTGATCAGCAAACGGGAACCCTTTGAAAAATTAAAAAACTAAC
-GCTCGCCACTGACGCCAAGTCTAAACCTAAGGGTAATACTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCGTAAGCTTAAGCGTAAGCGTAAGCGTAAGCGT
-AAGCCTAAGCCTAAGCCTAAGTGTAAGCGTAAGCGTAAGCCTAAGCTTAA
-GCCTAAATCTTTCGACAAAAATTTTGACCTAAAACTTTGACCTAAAATTC
-GAGACTAAATATTTTGGACTCAAATTTCGGCCTGAATTTTTGGACTAATT
-CTGGGAACTATTCCAGAGTAATTTTAACAAATTGAAAACTTTTTATAGTA
-TTCGTAAAACAAAAAATAAATGCAATGTTTTCAGTAATAAATTTGAAATT
-TTTGAAAAATTAAATATTTCTTCGAAACTTCGAAACTTCCTTTTCTCTGG
-CATAACCCCAAATTCCAGCCGATGCCCCGCCAGTATACCGCCAGCCTCGC
-ACAAAAGCCGAAAAAATCGAAAGATTCCGGAATATCGCTCGGACATTCTC
-GCCGTTCGTGTACGAGGTGAACACCACACCAGCTCCTCACTTTGACAACT
-TCATCTGGCAACAAAATGCACCAGCTGTCACACCGGAGCCATTCACATTT
-GCTCCATTCTCCTTCCCAACTCTTGCCACCGTCGCACCACCAGCTCCAGG
-ACCCGGCGGCCCGACTCTTGAGCCATTTTTACCGACGACAGCTAGTCCGA
-AGCTGTTAGCTCATAACACTGCTAGGGTATCAAAAAATTTGAATACTGAA
-TACCTCCCTATAACTTTTTCAAATTCCAGATGATCCGAGAAATCGCTTCA
-TTTTCCGACGGAGGACGCTCCAGGGATCAGGATTTTGGCGCAGTTCAAAC
-GCTCATGCAAGCCTTCTTCGAGGCAGTCTCCAGTGGAAATAATGGTGGAG
-CAGGAGCTGCCGCCGGAGCCGGAACAGCTTTAGGAGTAGGTTAAGCTCAC
-TAAAGAGGTCGTGAAGTTTTACTATTTTTTAGGATGCTCCAATGCTTCAA
-GCCCATCGAGATGGTACCGAGTTGGGAGCCAATCGCGCGCTGACCAACAA
-GCTTTTCGAGTCGGATATGGTGTTGACGGTCAAGCAGATGAAGGCGTGAG
-TGTGGGGTACTGTGCAATAAGATTATTGTAGGGGTACTGTAAGATCTCTG
-TAGGGATACTGTAACCCTACCGTGATATTACTAAAGGGGTGCTGTAAGAT
-TACTGTAGGGGTACTATAGGATTACTGTAGGGGTACTGTAAGATTACTAA
-AAATATACTGTGAGATTACTGTAGGGGATGCTGTAAAATTTCTCTAGGGA
-TATTGTAGAATTACTCTAGGGATACTGTAGAATTACTGTAGGGAACTGTA
-AGAGTACTGTAGGATTACTAAAGAAGTACTGAAGGATTACTGTAGGGGTA
-CTGTAAAATTACTATAGAGTACTGTAAGATTTCTGTAGGGGTACTGTAGG
-ATTACTGTAGTATTACTAAACAAGTACTGAAAGATTATTGTAGGGGTACT
-GTAAAACTACTATAGAGTACTTTAAGAGTACTGTAGGATTACTAAAGAAG
-TACTGAAAGATTACTGTAGGGGTACTGTAGGATTACTGTAGTATTACTAA
-ACAAGTACTGAAAGATTACTGTAGGGGTACTGTAAAATTACTATAGAGTA
-CTGTAAGATTGCTGTAGGGATACTAGAAGATTATCGTAGAGATACTGTAA
-GATTATTGTAGGGGTTCTGTAAGATTTCTGTAGGGTTACTGTAGAATTAC
-TGTAGGGTACTGTAAAATTACTGTAGGGGCACTCTAAGATTACTGTAGGG
-ATACTGTAGAATTACTGTAGGGTTACTATAAGTTTACTATAATATTTCTG
-TAGGGTACTGTAAGATCACTGTAGAGGCTACTTTAAGATTCCTGTGGGGG
-CACTGTAACACTACTGTAAGATAACTAAAACGGTACTGCAGGGTACTATA
-AAGCGACCACCCTAGATTCATGGTTATTTCAGAATTGTGCTCGCCGCCCA
-AGAGGCCCGTAACCCTCACGGACGTAAAAAGCGAAAGGTGATTACGGGAT
-CCGTGTACCGATGGAAGAGTGTGATTCCGTTCCGATTCAAAGGTGGCGAC
-GCGAAATGGAAGAAGCTGATCCGTGAAGGCCTAGGCCTATGGGAGAAGGA
-GACGTGTGTGCGATGGAGCGAGAATGGCCCCGGCAAGGATTATGTGATCT
-TCTTCAGAGGATCTGGGTGAGTTGACATGCCCATGGTTTTCGGATAGTTT
-GGGTTTTTTTTCAGATGCTACTCATCAGTCGGAAGAACCGGAGGATCTCA
-ACTTATTTCGATTGGGTATGGCTGTGAAGATGTAAGTTTTAGTATTTCTA
-CTATACTATTTATTTTAAATTCAAATTTTCTAGAAAGGAATCGTTGCTCA
-CGAAGTCGGTCACTCCCTAGGCTTTTGGCACGAGCAGTCCCGTCCGGATC
-GGGATGACTACATCCATTTAAGAAAAGACTGGATTATTAAGGGAACCGAT
-GGAAACTTCGAGAAACGAAGTTGGGAAGAAATCGAGGATATGGGCGTTCC
-GTATGATGTCGGAAGTGTCATGCATTATGGGTCGAATGTAATTTTAAATT
-TTGAGTCGGTAGTTTTTAGATACTGAAAATGATTTTCAGGCTTTTACAAA
-GGACTGGGACCAAATTACTATTGAGACCAAAGATAGTAGATATCAGGGAA
-CGATTGGTCAACGCCAGAAGCTTTCGTTTATCGATGTTAAGCAGGTTAAC
-AGGCTTTATTGCAATTGTGAGTTGTTATGCAAAAATGAAAAAAATTTGAC
-CACTGAGCGGATCGAACGCCCAACCTTTCGATCTGGAGTCGAACGCGCTA
-CCATTGCGCCAAGCAGTCACATTTTGTTGCAGGAAACGGTGTATAGAGGA
-GAAAAGAAAAAAATAGACAACCCTACGTTTTATCAGTGGAGCGCGGTTGC
-AATTTAACATTCCAATTTTCAGCTGTTTGCCCGGTTGCCTTACCCTGCAT
-GCATGGAGGATACCCCGACCCCAATAACTGTGCGGTTTGTAAATGTCCAG
-ACGGGCTCGGAGGAAAGTTGTGTGGACGTGCCGCAAAGGGCACAGATCAT
-GGTAAAACTCCACTGGAATTTATGGGAAAAAACCGCCCTAAAATTTTCAG
-ACAAATGCGGCGGTGAGCTAACAGCGACCGCCGAATGGCAGGAGATGGTC
-TACAAGGGGAAGCGGACGTGCAATTGGAAGGTGAAGTCGCCGAGCGGTGG
-GCGGGTTCGGTTGGTGCTCACCGAGCTCAGGTACCAGTGTGCACCGGCGT
-GTAAGGCCTACATCGAGATCAAGCATAATACCGACTTCCAGCAGACCGGA
-TTCAGAGTTTGGTGAGAACCCTAGATTCCCAAAAAATTCTACACTTTTTT
-CAAAAAAAAATCGAAATTCGACCCATTTTGGCGGGAATTAAAATTCTTTT
-AAAAATGACAAAAAAAATATTTTTCTGCAGAAAATTTTTCGACTTTTTAG
-AAAGCAAGCTTTCACGCGGTTTTGGCTTCCCTCATATATTGAAATGGAAG
-AGTTTTTGCCGAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATT
-TACGGCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAATTTAATTGTCC
-GTGTGGAGTACACGACTTTCCCACGCGTTGTCCGGCAGGCGATTGTCAAT
-GGAGCGCGAAAAATTCAATGAGAATCGAGCCGCGAAGCGACACGCTACGC
-GCCGTAAATCTACCCCAGATATCGCCGAGCCAAAATGGCCTAGTTCGGCA
-AGCTCTTCCATTTCAATTTATGAGGGAAGCCAGAAATCCGTGTAAATTTT
-TAATTTTTTGTTGCTTAAAAAAAAAAACTAAACAACTATTTTCCAATTCA
-AATTTCTAGCTGCTTCAACAAAACATATGACGTCATCTCCGACCAATCTG
-AAGCCCTGATCCTCTCCAACGCGAACATCGTGGACTACGAGGTCTCCTAC
-AAGCTGCAATGGATTCAAGGTACCCCACCCCCCCCCCCTTTTCTATCCAT
-AGAGCGCACTTTCTTCCAGACAACGGAAAAGCTCTTCCACCACCGAAACC
-CACGTCGACCTGGGTGCCCGGAAAAGAGAATCGACCATTCCGCGGAGTGG
-AGAACTCGGGCGGCACCATCGAAAAGTTCATCCTGCAAGCGATCCCAAAG
-ATCCGAGACTCGCATCGGCCACTGGAGAGTATTACTAGTATTGTTGCGGA
-ATATGGTCTCGCAACGCTACTTGGTATATCGCATAATGGAAAGTAGTCCG
-TTTGGAACGATTTTTGCAATCGTCAGAGGAATATATATATATATTTGTAA
-ATTTTGTACCATCCCAAAAATCCAATTTTTCTTTCACAATTTTCAAAATT
-TGCTCATCTTTCACAATTACTCGGGTTAACACATTTAATGCCTTTCAATA
-AATAACAGTTCATATTTAAAGTGATTATTATATTACAGGAACACATATAT
-CTGAGAATGCGTATCGCACAACATATTTGACGCGCAAATATCTCGTAGCG
-AAAACTACTTTAAAAGACTACTGTAGCGCTTGTGTCGATTTACGGGCTCC
-TTTTTTGAAATTTACACGGTTTTCTGGCTTCCCCTCAAAAATTGATATGG
-AAGAGTTTGCCGCGAACTAGGCTATTTTGGCTCGGCCATATCGTTCAAAA
-ACTACAGTAATTCTTTAAATGACTACTGTAGCGCTTGTGTCGATTTACGG
-GCTCCATTTTTGAGATTAATTTTCTTTCGAGTTCCCTTCGTTTTTTTTGT
-AATTTTTTGCTTAATTTGAATTTTTTTTTGATAAATTAAAAAAAATGATT
-TTACACGGTCTCCTGGAGTGTTCATAATTATTGGAGCGCACTTGCTGATC
-CTTGCCGCGCTTATTTACTTTTTCACCGTTAGAAAATGAGTAAAATCAAC
-GATTTTGGTCAAGAAATTTAAAATAAAATTATTAATTGATTTCAAAACCG
-AGTCCACGTGGTGCCAGACTGCCCCATCACGGTTTGATCTACAAAAAATG
-CGGGAATTTTTAGCCCAAAAATGTGTGACGTCAGCACGTTCTTAACCATA
-CGTTGAGAGTTGAGAATTCTGCGTCTCTTCTCCCGCATTTTTTGTAGATC
-TACGTAGATCAAGCCGAAATGAGACACTTTGACACCACGTGCGAGTCCGT
-AAATTGACACCAGTGCTACAGTAGTCATTTAAAAAATTACTGCATGTCAA
-AATTAAAATTTCCTGTTCCCGTAATATCGGATTCAGCACGCCACCCTATG
-AAAATACCAAAATTGGAAAAAAATCAATAAAAATTTATTTTCACGGAAAA
-AAAATTGAGACCACCTTTTTGTTTTCTATCTATATAAACCCGTTGTTTTT
-CACAAAAAATTATTGAAAATCCTTCAAATCATATTATTAGTTCGAAACGT
-CGACGCGTAGGTGTTCGATCGTACACTGCCGGGAATTGCCGGTTGCGGGA
-GTTTCGGCACCGCCGGTTGATATCCTTCTTTGCTAACTTTTGATCTGAAA
-ACATTGACTTTTGCTACGTGGCCGTGGAAGAGAAAACTCGGCCACTATGT
-TTGTTTTTGCGACAAGGGTATATGCGCAAACCTACAAAATGATCTTCAAA
-AAATGCGCGAATTTTTTGCCCAACAAAATGTGACGTCAGCACGTTCTGAA
-CCGTGCGAAATCAGTCCCGCATTTTTGTAGATCTGCGTAGATCAAGCCGG
-ACCACAAAAATATCAAAGTTTTGAATTTTTCAAAAAAAAAGCACTTACGA
-GGATCTAGTCAGCTTGAACAGCAAGTAAATAAGACAAAACGCGCACATGA
-TGAAGCTCAAAAGTAGATCAAACGAGAACTTGGTCGCCGAGACCGCATTG
-AAACTTCTGTCAAGTGAGAGAAACGGTTGGGTGGCATCGTTCACAAATGA
-AAGCATGTAGAATAGTCCAGCAATCGGATAGACTGCCGCAATGACTCCGG
-CAAACCCATTGACATCCTGCTCATCAGAGCCCAGAAGCCGGCAGCAAGCA
-GACGAAAGAGCAATGGAGCTGATGAGGAATAGAATGAGCTCCCGGCAGAA
-GTTGAAGATCCAGTCGGTGCCCGGGCTTGCTGCTCCGATGAAGCAGAGTC
-CGGTGAGGGGATTGGCGGCGACGGCTTTTGCGAGTAGCGCGAGCATTAGT
-GGAGCCAGCGGGATTCCCAGGATGAGCATGATCACGCGGGTTCTGGAGTC
-GTCCTGGAAGATCATTTTTTAAAATTTAATTTTTGAAAATTTATCATGTC
-TGGAAAAGGTACAGGCTGACTAGACCTATTTCACGTGGTGTCAGAGTGTC
-TCATTTCGTCTTGATCTACCATGATCTACAAAAAATGCGGGAGAAGAGAC
-GCAGACTTCTCAACTCTCAACGTATGGTTAAGAACGTGCTGACGTCACAT
-TTTTAATGTACAAAAAATTCCCGCATTTTTTGTAGATCAAACTGTAATGG
-GACAGCACAAAATTCAAAGCCCTCACCAATATATGCGATGTCCTTGTCGC
-CTTATTCCACGACACACAGATCAAGAGCCACCAGAGACGTGAGCAAGTTG
-CCGTGTAGTAAATCAGTGAGGCCACTGAAGAACATGGAACATGGGAAAGC
-CCTCCGACGACGAAGAGCAGGTGATGGGTGTAGTCGGTGCACGAGATTTG
-GAACTTCAAAATTCTTTTTGAATGGCTCAAAAATATTGATTTTGAGCCAA
-GTTATGACCATTTGAAGTTGGTGGCCTAGGATTTTCCTAGGAGTATTCTA
-GGCCGCCAACTTTGGACAGCCATAACTTGGCTGAAAATCAAAATTTTTGA
-AATCTAATTTCACAGTTGAATTTAGCAGACCATGAGCTTCAATTTGACAT
-ATTTTTGTGCCTTGCCACGAAAACTCGCAGACCTACAGTAATCCGGCCAA
-AATTAATGTTAACTGAAAGCTCAGAGTCTGCTAAATTTAAATACAAAGTT
-CGATTTCCAAAATATCGATTTTCAGAAAAATTATGAAGACTCTAAGTTGA
-TGGCCTAGCATTTTCCTAAGAGTATTCTAGGCCGCCAACTTCAAACGCTC
-ATAACTTGGCTCAGAATTAATATTTTCGAGCAAAATAAAAAGAATTTAAC
-ATAAAATCTTGTGATCTACCGGAAACTAGATGAGCGCAATTTTAAATATC
-TAGGCCACCAAGTGAAAACCGTGACTCGGCTCAAAACCATTATTTCTGCT
-TCAACCAAAAACCAATTCATTTATTTTAATTGAAAGCCCGGTGTCGGCTC
-AATTCAAATACCAAGTTTATTTTCAAAATACCAATTTTCAAAAAAGCTAT
-GAGCGTTCTAAGTTGGTGGCCTAGGATTTTCATAGATTTTCTAAGCCACC
-AACTTCAAACGCTCATAACGTGGCTTAAAATCAATATTTTCGAGCAAAAT
-AAAAAGGATTTAATATAAAATCTTGTGATCTATCGGAGAATGCATTTTAA
-ACTTTCTAGGTCACTAAGTAAAATATTCGGCCACCAAGCCTCGGCCGAAA
-ATTATTATTTCTGCTGAACCAACAACCAAATTCTCCAAAAACTGCTTACC
-TGATCTTTAAACGAAATGCTCACAATATAAATAACCGATGTCGCACAAAA
-CGAGATGCACGAGAAGAACATGGCAGTTTCCGTAAGTGAGTGGAGCATCT
-CGAGACGTCTAAAGTAGATCCTGATTTGTTTTTGGAAAATTAGGCCACAC
-ATCACACAATCCAAAACTTACGATAAGCCGACTATGAAGACTGATAGAAT
-TGTTAGTATTACAGAGCTCAGCGAGAGAAACAACAAGAGTCGGGTGGCGG
-ATTCACGGTCAGTCTGGAAATGTACTCATTTGTTACTGAACTAGGTCTAC
-TTAAGCCTAAGCCTAAAGTAAGCCTACCTGCCCAACCTTCTGTGGGTTCG
-AGCACAAAGGCACACACTTTGAGGATCGATTCAGGAACACCTCATCCTGT
-GGGCATTTTCCGTTGAGGCGGTCGACCTCCCGTTGAATATCTTCTACTCG
-ATCATTACCGTCGTCCTCCTGGAAAAGAAAGATGATTGATTTGAAGCTGT
-GTATCTAATTACCCCCGTTTGATGATATAGGACCGGAGAGATTACAATCA
-GATGTTCTCTGTTTTTCTCTGTTTTTTGGTAGCTAGTATAGAAAACTATA
-GAGTACTGTAATTCCTATTTGGGAGCTTGGTATTGTGCTATTATCAAAAA
-AATACAATTGCACAAATTTCTCATTGATCTACCTGTTGAACTTGACTCCG
-CCCCCAATCTTGTTACTGTTATTATTAAGGTAGATCAAAAACACAAGGAA
-GATCAAAAATAAATTACGAGAAAATTGTGCGATTGTATTTTTTTCTATAA
-TATCAAACATTTATTGATTTTAGGACATTCTGTGATTAACTTTTATAGTT
-TCACGGATTTCTGGCTTCCCTCAAAAAATTGAAATGGAAGAGTTTTCGCT
-GAACTAGGCCATGTTGGCTCGGCCATGCGTGGCGCGTCGCGGCTCGATTT
-TAGTTGTAAAACTAAATATTTCCCACGCGTTGTCCGACAGGCGACTGTCA
-ATGGAGCGCAAAAAATTCATTGAGGGAGGTTTCTATTTGGCAATGCGCTT
-TTGGTTTTTCAGTGATCTTTCAAAAAATTTTTCATAATTTTCAAATGATC
-ATAACTCTGAAACTAAAATTTTTGGCAAAAAAAGTCGTAATATTGTAAAA
-TGTTGCTCATAATTTCTTCTATACGATAAAATTTTTTCAAAATTTTACAT
-TAAACAGGCCAATAGGTACAGCGCCCGACAACTCGCGGGTCCAAAAATTT
-TTCAAAAATCGTCAAAATTCGACTCGCGAGATGTCGAGCGCTAAATCTAT
-TGACTTTATTTTTTTGAATTTTTGAAAAATTTGTTATCCAATAGAAAAAT
-TTATGAGCAACATCTTATTAGTTAAGCGTTTCTTGCCAAACATTTTATAT
-TCAGAGCTATACTCATTTGAAATTTTTGAAAAATCACTGGAAAACCAAAA
-ACGCGGCAAACGATTTTTTCCGGCAAATCGGCAAATTGGCAAACTGCCGG
-AATTAAAAATTTCCGGCAAATCGGCAAACCGGCAAATTGTCGAATTTGCC
-GAAAATTTCGGCAAATTGTGGTTTTGCACTTTTTTTGGAAATTTCAGAAT
-TCCAATTTCAAATTGCAAAATTAAACTCATCCTATGAATGTTTCTACATC
-TATTTTGAAAAGTAAGTAAATTCTATGAAAATATATAAGGAAAACGAGAA
-AAAATTCAAAAAGACATAGTTTTAAGTGTTTCCGTCTTATTAAAAAATCC
-CTCTAAACTTTTCCGGCAAATTGATATTCGGCAAACGGGAAATTGGCGAT
-TTGCCGGAATTGAAAAACCCGATACTTACACTTTCTTTCGCTGCAAACTT
-TGCCCTCTCATCTTGAATTGCTCCTTGCTCATTTGGCCCTTTCATGCACA
-TTTTCTCTCGATTGTTCTCCAACGGGAACTTATCACAACGAATCACATCG
-GGCCACTTGAAACCGAAACTTTCCAGCACTGGAAGACACTTTTCCTGGAC
-GGAAAGACACAATGGACGGCATGGACCAATTGGGTTGGCTAGCTGAAATT
-TTTTTGAACGATGAAATGATAAAAATGTGCGATTCTTCTCTGATTGAACT
-CACTTTCTCGTTGCACATCGGGAAGTAGACGGAGCACAGGAAGAATTTGA
-GCTGCTCGGAGCAGACAACGGAGAGCAGGGGCTTGTAGGTGAGGATGGAT
-TCGGAGGCGTCTTTCCATGATTCCTCGTCGACGAGATTTGGGAAGCTGGA
-ATAAGGGCTTGTAAAGTTTGAGAAACTTGAGATTTACAGGGTCAAAAATT
-GCTCACGAGCTCTCCCGGTTGCCGAAAAGTTGCCGAAATTTGAGCAACCA
-AAAGTTGCCGATTGCCAAAAATTGTAGGGTACGGCAACTTCGGCAATCGC
-CGGTTACCGAAGATTTTAGAGTTCGGCAACTTCGGCAATTGGCGGTTGCC
-ATTGCTCTCACGAAATTTCCCGCTATTTTTGGAGATTAAACAGCAAGTGC
-ACGTGTGGGTGTCTCAAACAGGAAAGAAATCCTGGCAGGAGCCGACTTGC
-CGGAAATTTTCAATTCCGGCAAATTGTCGGTGTGCCGATTTGCCGTTTGC
-CGGTTCTCAGATTTGCCGGAAGTGTGTAGAGGGATTTTTATAAGACGGGA
-ACACTGAAAACTGTGCCTTTTTGAATTTTTTCCCGTTTTCTTTGGATATT
-TTCATAGAATTTGCTTACTTGTCAAAATAAATGTAGGAACATTCATAGGA
-TGCGTTTAATTTTGCTATTTGAAATTGAAATTCTGAAATTTCCAAAAAAA
-TGAGTACAAAACCACAATTTGCCGGAATTTTTCAATTCCAGCAATTTGCC
-GATTTGTCGTTCTGCTGGTTTGCCGGAAATTTTCAATTCCGGCATCTTGC
-CGATTTGCCGATTTGCCGGATTGCCGAAAATTTTCAATTCGTTAGCCGTC
-CACCCTGGATCCTGCCATCCAAAAAAAAACGGAAATTTTTGGCAAATTGC
-CGTTTTTCCGCCGGCAAATTCGGCAAATCGACAATGTGCTGTTTTGCCGT
-TTTGCCGGTTTGCCGGAAATTTTCAATTCCGGCAATTTGCCGATTTGCCG
-ATTTGCCGGTTTGCCGGAAATTTTCAATTCCGGCAATTTGCCGATTTGCC
-GATTTGTCGGATTGCCGAAAATTTTCAATTCCGGCAATTTGCCGATTTGC
-CGATTTGCCGGTTTGCCGGAAATTTTCAATTTCGGCAATTTGCCAATTTG
-CCGTTTTGCCAAAAATTTTAGGGTTCGGCAAATTCGGCATTTGCCGTTTT
-GCCAAAAATTTTAGGGTTCGGCAACTTCGGCAGTTGCCGGTTTCCGCACA
-TCCCTGTCCCACACGCCCCAGGTGGAAGATGGTGGAAGAGTTTCTAGCGG
-GTCCATCAAGGATGGGAATCATCAGTCAACACAATCCTTAGCCGACCTTC
-CCAAATTCATCATTCCTTCCTTCCAAAACGGTTTCCGGTCCTTCCAACCG
-ATTAATACCAGCCACCACCACACCACCAAACCCTCTCCTTCGAAATAGAG
-AACAAAGTTGCATACCCCCCTCATTTCTTTGTTTTGGAGAAAGGGGCGTT
-TTGTGGTGCTCGGAGAGCCTGAGGACGTGACAAGTGATATATAGACGGGC
-TTATACTATCTGCTCGTCCATATTTCACGCGCCTAGGCAGAGTGCACGGC
-GGGAGGTGGAGACGCAGGTTCCCGTCCAACTGCCGCAGAGCATCCCCTAT
-CTGCTCCTATCAATTGTTCGGAGAGACTTTTTTGTGAATTTTGCTTTTTG
-CAAGAGGTCTGAGATTTGGGATTTGGGCTTTAGGCTTTAGGCTTTGGGCC
-TTGCTTTGCGCCAGAGAATGGAAATTTGTCCGTATTTTCCCGGCTTATAT
-CAAAAAATGATCAACTATAAAAATATAGAAAAAGATTTTTCAAGTTTTTT
-GTCAGTTAGTATTTTTTGATAAAACAAAAGAGAGCCGAGATATAAGCTGT
-CAAAGTAGAGCAAGGGTGGTTTGATCTACAAAAAATGTGGGGATTTTTTT
-TCAAACTTGCTCTACTGATAAATTAATAAATTACTCCCACAAAATCCAAT
-AAGCCTCAAACTTAAGATCCTCCAATCTCATCCCCCTCATAAAACAATAA
-TACTAAATCACTAGATCTCCGGTAGTATATATCAGAAGAACAGTTGCTCT
-CCCTCTCGAACCGACTTACACTTGAGAAAAATAAATTGTGGAAGAGAAGT
-GACGTCATCGTAACCTACCACTTCACAAGTTTATATATATATATATATAT
-AAGTACTAGTTAGGACTAGCTAAGACCTAATTAGAACATAGGTATGGCCT
-GTAAGTTAGGACCTAATTAGAACTCACTAGGACTATATATATATATATAT
-ATATATATATATATGTAAACAAGAACCCGGGCGGGTAACCCCTTACGGTC
-AGAGGGGTGTCCTACACCAAGGGTATGTAAACTGTGTCCCCCAGATGGCG
-AAGTTGAGAGGGAAAAAGTGAAAAAGCGCGCCACATGGCCTCGCGACCGT
-ATGTTGCAATTTCAAGCAACGTTTTTGATTTATTGGAGGAGAAATTTTGA
-AAAAGTGAAAAAAAAGTGTGACCCCATATGAGATGCGTAATAAAATTCCC
-TACAAGACCTTAAGAAAACGTGGCTGGCTGGCAAAAAACAGGTGGCAATA
-ATAACGGAATGTGTATGTGTGTGTGTGTGTGTGTGTGTGCTCGAAGAGCA
-TAGGCTCGTAAATCGTTATAATTGATGCTGGAGGAGAAGGAGACGATGGG
-CCTCCAAAGTGTTACACCTGGTATTTGTTGGGAAAAATTTGGGGGAAATA
-GGCATTAAACTACCTAACCTAATTGAGTTTTTTCAAAGCTTATATTATTA
-TAACTAAGAGGTGTGATAATAAATAATTAAAGAACTTTAAAATTATCAAA
-AACGCTTTCAAATCTGTAAAGCTGATATTTTAAGGATTTAGTACTAGTTA
-AAATCTAGTTGGGACCTAGGTAAGACTATCTAGAAAGTTCGGACGTAACT
-ATTTAGGAACAGTTAAGTCTTAAGGCCTGCTTGGGTACAGGTAAAAATGT
-TTAGAAAGTTAGGAACTAAATAGGTGAAGTAAGTACTAGTTAGGACTAGT
-TAAGACCTAATTAGAACCTAGGTAAGGCCTGTAAGTCAGGACCTAAATAG
-GACTTACTAGGACTTAGGTAAGACTAGTTAATGTCTTGTTAGGACTAGTT
-AGGACTAGCTAAGACCTAATTAGAACCTAGGTACGGCCTGTTAGGGAAGA
-TCTGATTAGGACTTACTAGGATTTAGGTAGGACTAGTTAAGATATAGTTA
-GGACTAGTTAGGACTAGTTAAAATTTAATTAGAATCTAGGTATAGCCTGT
-AAGTTAGGACCTAATTAAGACATACTAGGGCTTAAGTAGGACTAGTTAAT
-ACTAGTTAAGAACTAATTAGAACATAGGCACGGTCTGTTAGTTAAGGCCT
-AATTAGGACTCACTAGGACTTAGGCAGGGCTAGTTTAGTTATTGTTAGGA
-CTAGTTAGGACTAGTTATGTACCTAATTTGGACTCACTAGGACTTAGGAG
-GACTAGTTATAATCTTGTTAGTAATATTTAGGACTAGTTAAAATCTAATT
-AGAACCTAGATATATCCTGTAAGTTAGGACCTAATTAAGACTTGATTTGC
-TAGGATTTAGACAGGACTAGTTAAGATATTGTTTGGACTAGTTGACTAGT
-TAAGACCTAATTAGATCTTAGGTACGGCCTGTAAGTTAGGGCCTAATTAG
-GACTGAATAGGACTAAATTTCTTGTTACGAATAGTTAGGACTAGTTAGGA
-CTAGTTAAAACTTAATTAGCACCTAGGTACGGTCTGTTAGGGAATACCTA
-CTTACCAGGCCTTAGGTAGGACTAGTCATGACCTAATTAGAACCTAATTA
-GAACCTGGGCACGGCCTGTTAGGGAAGACCTAATAAGGACTTACTAGGAC
-TTTGGTAGGACTAGTTAGGACAAGTTAAGACCTAATTAGAACCTTGGTAT
-GGCCTGTAACTTAGGACCTATTTAGGACTTACTAGGACTTAGGTAGGACT
-AGTTAGGACTAGTTGGAAGTTGGGACCTAACTAGTTAGACCCTTAATTTT
-GTACACATGCTTATTAATATCAATAAAAATTTTAAAAAAAAACGACTTTT
-TTAAGTTTAACTATATAAAACTATAATTTGGAAAATTTGCTACTTTGCTT
-AAAAATCGAGAAAAAACCTAGCGTTTCTATAAAAAACCATCTTGAAGTAA
-ATTTTGAAAAAACCCCGTCATCCAACAAAAAAAAATTCACTCACCTCGTT
-AAGTTATACGGCAAATCGTTGCACATCTCATGATCCACCTTTTGACACCT
-CTGCCCGTCCACACCAATCACAAAGAGCAACAGGAGCCAGGTTACTCCGA
-GGTAACCACGAAATGGTCCCATTAATGATAATGGAATTGGGGGCTCACAG
-CCTGGGTGGGGGAAAATATTGAGAGTAAAAGAAACAATGAGAAGAAAGAC
-GGAGGATAGGCGGGGGGGGGGGGGGGGGCACACCAGTGGCAGCACCACCA
-CGGCCTGTCCGTTGACAAATGACCCAAACGGACGGGGGGCGGGAAGAGTG
-TCTGTTGTGTGTGTTGGGAGATGGCTGGCGGTTATCAGATATTTGTATGA
-ATGGTATAGAGAAACAGAGACCAAGAGAGCTGAAAGATGGAGAGGCGAAA
-GAGGAAGAGAGGGGGGGGGGTGGAAGTTTTTACGAGCCCTGTAATAAATA
-TATCGAAGCAGCAAATCATTTGATGATAACGGAGGAGCGCGGGGACGGAG
-ACGGCAATCATCATCATTATTAGGACCAGGGGTGTGCGGCGAATTTTTGC
-CGAATTTGCTGTTTGCCGAGCTCGGCAATTTACCGAATTTGCCAAGCTCG
-GCATATTTCAAAAAAGTAGATTTGCCAAATTTGCCGAACTTGGCATATTT
-CAAAAAAGTAGATTTGCCGAATTTGCCGAGCTCGGCATATTTCAAAAAAG
-TAGATTTGCTGAATTTGCCGAATTTGCCGAGTTTGCCGAGTTCGGCAAAT
-TTGCCTATTTAGCCGAGCACGGCATATTTCAAAACAGTAGATTTGCCGAA
-TTTGCCGAATTTCCCGAGCTTGGCATATTTCAAAAAAGTAGATTTGCTGA
-ACTTGCCGAGCTCGGCAAATTTGCCTATTTAGCCGAGCACGGCATAGTTC
-ACAAAAGTAGATTTGCCGAATTTCCCGAGCTTGGCATATTTCAAAAAAGT
-AGATTTGCTGAACTTGCCGAGCTCGGCATTTTTCAAAAAAGTAGATTTGC
-TGAATTTGCCGAGCTCGGAATATTTCAAAAAAGTAGATTTGCTGAACTTG
-CCGAGCTCGGCATTTTTCAAAAAAGTAGATTTGCTGAATTTGCCGAGCTC
-GGAATATTTCAAAAAAAGTAGATTTGCCGAATTTGCCAATTTTGCCGTTT
-GCCGAATTTGCCGAGTTTGCCGAGCACGGCATATTTCAAAAAAGGAGATT
-TGCCGAATTTGCCGAATTTGCCGAATGTGCCGATGCCGAGCTCCTGTTGA
-TTTTTTTCCAAAAATTCAGTAAAACGACACAAATTTGTTTTAAGAATTCA
-TTAGTTTCGGTGCTCCAAACAACATCAAAAAATATCAAATTTTTCCGAAT
-TTGTTAAGCACGGCAAATTTGCCAAATTTGCCGAATTAGCCGAGCACGGC
-TAATTTTGAGATTTGTCGCACACCCCTGATTAGGACCGAGAAAAGGGCCT
-AACATGATTTCACAATTTGAAAAATGAAATTCAATTTTTCTTGGGAAAAA
-AGTATGAATCTCTTCCTCCGCCCGTTTCCGGCAGAAACAATTGAACCAAA
-CGAGCCAAAAGTGCACATTGTGTAACTTTGTTGGGGAGTGTAGATAACCA
-GAAGAAACAAGATGGAACTTTCTTGCGATGAACAAATTTTGGAACACTGG
-AGGGAAATGATTGGTGTTTTTTAAGCTTTTTAGTCAATTTTTAAAACTGT
-TCTACAATAGGCCCAAATAGGCCTAATAGGCAAATAGGCCAAGTAGATTA
-AATATGCCAAATAGGCAGTATAGGTTGAATAGGTAAACAGGCCAAATAGG
-TCAAATAAGCTAAATAGGCGAGACTGGTGCTCAAATACTTTTTGAACTGG
-TAATGTTTTTTCTTCTACACAAAAACAAAAAAGTCCCTGCTTAGTTCCGC
-AAAATTGTGATTTTTTTCAAAAGTTACCCATTTTTGCCACTTTTCAATAG
-TTTTTGATAGGTTAAATCTAGATTTTCTGAATTCAGCATATATGAATTAC
-CCGTTTTCAACAAATTTAGGCAAATTTTTATTTTTGCCCAATTTTTTTAG
-CCATCTAATGACTGATTTTGGGCAAAAAAAATTTTCCTGAAATTGTACAA
-AACCATTAGAAATTGAAAGGCTCCTCAGTTTAAAGGCACATGAGGTTTTT
-CGGAGTGGGTGGCAATTGTCGTTCGGCAAATTTTTTGGTCGACAAATTCG
-ACAAATTGCTGGTTTGCCGATTTGCCGGAAAGTATTTTCTTACTTTTCAA
-AATATATGTACGAACATTCAGAGGATGCTTACAATTTTGCCGGATAAAAT
-TTAAATTCTGAAATTTCCAAAAAAAATGTGCAAAACCATAAATTGCCAGA
-AATTTTTAATTCCGGCAATTTGCCGATTTGCCGATTTGCCGTAAATATCA
-ATTCTGGCAAATTGAAGATTTGCCTTATTTGCCGACTTGCCGCATTCCCT
-GATGTAGGCATCAAAACGACTGAACACCAAGTTTTTTTGAAATTTTTTAA
-GTTTACCTTTATAATTTTTAGTGCTCAAAAAGTTCCAAAATTAAATAAAT
-TTTGAAATTTGCCGAGCTCGGCAAACGGCAAATTTGCCGCACACTCCTGT
-TTCAAATGTTCACCGCATATTTAATTATTCCGGAAATCCCCTCAAACATC
-CATCAAAAGTGTTTTCCCTGATTTGTTGACTCTGACACCGACGGTGGTTG
-TTCCCCCCCCCCCCCACTCTCTCAATTGGCATGTAAATGAGCCCGTATGA
-ATGAAGTGCCTTTTGGCGGCAAAATGCATATCTCCAAGTACCATTGAATT
-AATCTTCCATCCCCCATTGTCTCCTTCTATATAGGGGGGAGGATGCGTGA
-TTCTTGAAATATGCTCCAAGTGACAAATTGAGCGTGTGTGATGTATCGTG
-GCAGATGGCTGGCTGACAACGGATCAGTTCCAAAAACTGTATCAAACGGG
-GGGAAGAGAGGGGAGATGAAGGATGGGGGCAGATGGAGTCATCGATGCAC
-CATGTTTTTTGGAGCTGTTCACTCAGATATTAGGGTATTTTAATCCCCTT
-TTTAAGGTCTATTTCTGATCGTAAAACTTGGTATTTTCAACTCATTTTTA
-ACTCAAAAATTTCAAAAGTTTGAAAAATTACACAAAAACCTAAATTTTGA
-TCTGGTTTCAGGCATTTTAGTCCCTGTTAAGCGTCTTCGATGCACCATGT
-TGTTGTTCAACTTGTTTAAACTTTTTAGTTCCGCATCGAGGAAAATGGAA
-AATAAAAAATTATTTATGTATTCAAAAACCATACTTTGATTCTCCGTAAC
-AACGCTTTCATGGGAGGCAGGCCCGGTTTCAGGGCCTGACGCCTGCCTCA
-AACCTGCCGGCCTCACGCCGGCCTCACGCTTCATTTCTGCATTTTGGCGA
-AAAATCAAATACTTGGACATAGTGAAAAGGTGATTTTTTCGACGCGGCCG
-ACACTTTTCGGGTTCCGCGCCGCACTATACAGGAGGCGAGGCTCGCGGCG
-CGAGGCAGGCGGAGGTCGCCGCAAGGCAGGCGCGGCAAGCATTTTTGTGC
-TTACATGGATACCCTAGTCTACACAAAGCACGAATTTCTGGCTTCCCTCA
-TAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTTGGCTCGGCC
-ATATCTGGGGTAGATTTGCCGTCGCGTTGCGTGTCGCGTCGCGGCTCGAT
-TTTAGTTGTAAAACTAAATTTATTTGTCCGTGTGGAGTACACGACTTTCC
-CATGCGTTGTCCGGCGGGCGATTGTCAATGGAGCGCAAAAAATTCAATGA
-GAAAGGCCAGAACCCAGTGAAAAAGATAATTTGACAATTACAAATAATGT
-TTTAAAATTTTTTTTTTGTTTTTGATTTTTGGTTCTCCTTGTGTTTTAAG
-AACATGATGCATCACCGCTGGAAATTGCTGGATATGTAAAAAAATTATTT
-ATGTACATATTTAAAAATCAAATCTTGATTCTCCGGGATAGAAGCATAAA
-TCAAATTTATTACTGTAAATTTTCACTTTCAGTACATTTAATTGAAATTT
-TTAAGCTTTGAAGTTCAGGGTATCATAGTTTTGCCTCCAAAATCCACTTG
-CCCAAAAAACAAGCCTGGGAATTCCCGGCGGGGGACGATGGTTCGATAGC
-ATCAATCATATCTGTGTGTGTGTGTGTGTGTGCAAGGCGGGGGATGAGCC
-GGCGCGCGAAACGAATAAATCAAGAAACGTCTCTCTTTCTGCGAGCACGG
-ATTTTGTTGTGAGCCCGCGCGCGCGCGGTCTATAGGAGGAGAGGGGTATC
-ATGCACTTCTAATACAGGGCATACTTCTTTCATTTCCATGTTTTTGTACA
-TGTAATAAAATTGTTAATTAGCCAAAAGTGGTTCACATGTTCACGTCGTA
-AACGTCGGTTTTCAGGGTGTACTGATAATGAATGTGCTCTGTGTGGAGAC
-AAAGAGGCAGCAGAGAGCAAGAATCAGTTAGGTTAGGCAGGTGACTTTTT
-TCAATTGTGACTAGGAAAAAGTATTTTGGGAATTTTTTTTTATTTTTTGG
-CTTCTGCCCAGATTTTCAGGATTTTTCAAATATTTACAGAAATTTTCGTG
-ATTCTACAATAATATTTTTGTAATTTTCTCAATTTTCAAAAAATTGCCAA
-TTAATTTTGAAGTTTCGAATGAAGCAATTGCCGAAGTTGCCGACTCCCGG
-AAATTTCGAAAACCGGCAATTGCCGAAATTGCCCTTTGCCGGAAATTTCG
-AAAACCGGCAATTGCCGAAATTGCCCATTGCCGGAAATTTCGAAAACCGG
-CAATTGCCGAAGTTGCCGACTCCCGGAAATTTTGAAAACCGGCAATTGCC
-GAAATTGCCGACTCCCGGAAATTTTGAAAACCGGCAATTGCCGAAGTTGC
-CGACTCCCGGAAATTTTGAAAACCGGCAATTGCCGAAATTGCCGATTGCC
-GGAAATTTCGAAAACCGGCAATTGCCGAAATTGCCGCTTGCCGGAAATTT
-CGAAAACCGGCAATTGCCGAAATTGCCGATTGCCGGAAATTTTGAAAACC
-GGCAATTGCCGAAATTGCCCATTGCCGGAAATTTCGAAAACCGGCAATTG
-CCGAAATTGCCGCTTGCCGGAAATTTTGAAAACCGGCAATTGCCGAAACT
-GCCCTTTGCCGGAAATTTCGAAAACCGGCAATTGCCGAAGTTGCCGACTC
-CCGGAAATTTCGAAAACCGGCAATTGCCAAAATTGCCGATTGCCGGAAAT
-TTTGAAAACCGGCCACTGCCGAAATTGCCGACTCCCGGAAATTTCGAAAA
-CCGGCCACTGCCGAAATTGCCGACTCCCGGAAATTTCGAAAACCGGCAAT
-TGCCGAAATTGTCGATTGCCGGAAATTTCCGATCCCTGAGTTTAGCCTTT
-TTCAGCAAATCAAACAGTTTATGATTATTTTTTCAAAAATTGTTCTGCAG
-TGCTCTTGCATCACTATTGTGGCCCTCCTTTAAATACAGTACTTTCTACA
-GTACCACTACATCAATGATCCTTCCAGTAATGCCAACACATTGTACCACT
-ACAGTAATCCTACAGTACCCTATACAGTACCGTCGCAATACAATTACCGT
-AACACTATGGAAATCTTACAATAGACTACAGTATACAAAAACTACAGTAA
-CCCCCTTGAAGTTAGTGTAAAACTTGCAAATGTTCAACTCTTTTTTCTGA
-TTTTTTTTTGTTAAGTTCAGAAATTGTAGAGTGTTTTTGGCTTCTGCTCA
-GATTTTCAGAAATTTTCGTGATTCTATAGTAGTCTTTTTGTAATTTTCTC
-AATTTTCAGAAGTCTGCAAATTCAATTTGAAATTTCGAATAGCTTTAAAA
-AACTCAAACAGTTGGCACAAATTTTCGTAGATTCATGTAGAATTTCAGCC
-TTTTTCAGCAAATCAAACAGTTTTTTATTTTTTTTTGTATTTTTTCAGAA
-ATTGTTCTCACCCTCCAAAGTACTATCACGTCCTAACAGTAATATTAGCC
-TACCGTATCACTACAGTAATCCTCCAGTACTTCTGTGCATGCTACAGTAC
-CCTTGCATCACCATAGTGGTGATCCTTTAAACCTACAGTACTTCTACAGT
-AGCACTACAGTACCACTTCAACAGAATCTTTCCAGTAATATCAGCGTATC
-GTACCACTACCGTAATCCTACAGTACCGCCACAATACTATTACCGTAACA
-CTATGAAAATCTTACAATACACTACAGTATACAGAAACTACAGTAACCCC
-CTTGAAGTTGGTGTAAAACTTGCAAATGTCTACCGTAATCCTACAGTACC
-CCAATACAGTACCGCCGCAATACAGTTGGCATAACACTATGAAATCTTAC
-AGTACACTACAGTATGCAAAAACTACAGTAACCCCCTTGAAGTTGGTGTA
-AAACTTGCAAATGTTCAACTTTCTACAAATTTGCCATTAACTTGTAAGTT
-GGGGGAGCGCATCGAAGTGTATACATATATGTACATGCCAACCAATTATT
-TTCTCAAACAATTTATTAATAGTCGAAGACACCTGAAGCAACGATTAGGA
-GGAAGAAGAGGAAGGAGAGATTGGCAGAAGAAGAAGAAGAAGACGAATTA
-GTTGAAGAATCTGTTGAAACGGAAGACGTTGTTTGTGATGTCTCTAGCCG
-TGCGACAGCTTCCCGTTTCAGACGGAACGATGTTCGCACGGCGATCGGTG
-GCGAGATGTCGGACACGTCGATTGTCGACGAGAAGGGATCAGAGACGGTT
-GAAGAATGCTGAGGAGGAGGATTATGTCGACGTTCCCGTCCACGACACGC
-GGCCTGGGTACACGTGACACAGACGTGAAGGTTACAGAAGATGTTCACCT
-CGTTGCTGGAATAATAGTCGTTGAGAGGTGGGTGGTGAACATGAACAAAG
-AACTTAAGAGGCTTACCTCGTTGGGAATGCCCAGGCCTTTATGTGGTTGT
-AGAAGATGGTCTTACCATTGCGTCGAGTCACTTCAAAGTCTCCCCACACC
-TGGAACAATTTTCTATGGAAGTCTCAAATAATATGCAGTTGGTCGATGCA
-CCATGATGAATTTTGTGCCAAACATGGTGCATCGACGCTAAATAATTTTC
-TTTTGAAATTTAAAGATGTTTTGCTAGACTTTCCCTAAACATCTTTTTAG
-TTTTCCAATGTTCTCTAATATCATCATGGTGCATCGAGAAAAAATGTTAT
-AGGAGGAGTAAAGAAATTTGAGACTTTACTTTTTTAGACCAAAAATGACC
-CAAAACTACCGAATTGTTTAGTAAGACGTTTTGAAAATTTTTCAAAACAA
-AGTTATGGCGGTTCAAAGTTCTGGAAAATAGCATATTTTCAGCTAAAATC
-TAATGTTTTGGGGGCTGGGGGAGGAATAAAAATGTAATTTTTTTTGTGCC
-CCACTGCCCGAAAATGCACTTTAATCGACGAATAAACGGCTTATAAAGGG
-CCACAATATTTATAAAAGAGTGATATTATAGTTATAAATAAAAATTGAGT
-TCCCGACCGAGAAAAAAATTGGCGAAAATTTTGATTTTAGCTGAAAATGG
-GACTTTTTTTCCAAAACTTTGAGCGGCCATAACTCTTTTTTGAGAATTTT
-TCAAAACGTCTCATTTAGAAATTCGGTAGTTTTGGGTCATTTTTGATCTA
-AAAAAGTAAAGTCTCAGATTTTGATACTTTCTCGATGCACCATGATGAAG
-AGAAAAAAAGAGAAAATTTAGAAAAAAAAAAAAAGAACCCTTCCGATGTT
-TTGGGAAAGTTTAGCAAAACAATAGATTTGTAAAAAATTCAATTTCATTA
-GGTTCCTATTAAATTCTCAATTTTTATCAATGCACCATACATTTTCAGCG
-TGAAATTTTGTAAAATGCACAGGAATGAAAATTGATCAGGTGTGTATAAA
-ATAAGAAATTGAAGCATTTTGTTTTTTTTTTTGTCGATACACCATGATGA
-ATTTCACGTCAAACATGGTGCATCCTGGAAAGGAGAGAGTTTTAAAAATG
-TATCATTTTTTTCTCGATGCACCATGAAGATTTATATTAGTAGAACTTAA
-ACCGCACTTAGCATAAGTGGCATAAAAATAAAGGTGGAGTAGCGCCAGTG
-GGGATTTTGTCTAAATACACTTATTATGATCCAAAACGATCGAATATCTT
-AATGAAACACTCCAAAATATTTAAGATTTTTCAAAATTTCCGGTCAAAGT
-TTTGGCAAATTGCCAAAATATTGAAAAAAAATATGAGCTTTTGAGGAAAT
-CCAAAGCAATGTCGCGTGTTTCGACCCACACAATGTTTTTATACAATGTA
-GAAAAAAATTTTTTTTTGGTCGACTTTTAAAATTATGAGTGGCAAAAACT
-GAGTAATTGCCAATTTGACAGTAAATAAAAAATTTTCAAAAACATTTTGA
-AAAGTTTTATTATGATATTCGATTATTCTGGCACCATTTGAGTGGTTTGT
-AGTAATTTCCCCACTGGCGCTACTCCACCTTTAAAATTAAAAAAAAAATC
-ATAATGGGTATTTAATATCAATGAAAATTATCGATTTTTCCAAATGTATC
-AAAATGAGTGTTCAGCGCGAAATTTTGTGCAGGACTTTTTCTTTCAATAA
-TATATCCCGAATGATGCATTAGTTATGGGCTACACGATTTTTAGAAAAGC
-ACCTGGCCATGCTTAAAGGTGGAGAACCGAAATTTGATACTCTGTCTTTT
-TAGATCCAAAACGGTCCAAGACTACCAATATTCGTATTAACCTGTTCTGA
-AAAATTTTCAAAAAAAAAAGTTATGGCCGTTCAAAGTTTTGGAAAAATGG
-TCGATTTTTAGCTAAAATCTCAAATTTTGGCAACTTTTCAATGTCACAGC
-TGGAGCTTAATTTTAGAAACAACACGTGATAAATTGCAAAAACATGCATA
-AAAATATGTTCCAACCGCTCCGACACTAAAAAGGTGCCAAAATTTGAGAT
-TTTAGCTAAAAATCGACCATTTTTCCAAAACTTTGAGAGGTCATAATAAC
-TTTTTTTTTTGAAAAATTTTCAGAACGTCTTAATACGAAATTTGGTAGTT
-TTTGGACCATTTTGGGTCTAAAAAGGCAAAGTATCAAATTTTGGTACTCC
-ACTCACTATCGAAGCAGAGCCCCAAAAGTTTGACCGACCCAATTTTGTAA
-GTTTCTTCGATGCACCATGATGATTTTGAGCAAAATGTTAGTTTTTTTTT
-TTGAAAAACTGGTGGCAGGACCCAGTTTTCGGCAGTTTTAAATGTCGATG
-CACTATGTTTTTTTTAATGAAACCGTACCTCCCCAGAAGTCTGCAAAGAG
-CATCCGTGTGAGTCCGACAGTGGTAGCTCGGATATCCCGTCATTCGCCCA
-ACACCTTCCGATTCGTCCATTCTGATCATCGCTCATTTCAACTGTGTACG
-TCTACAATTTACAAATAGTTTCTTTTGATTTATGGAGTTCCTGACTTACA
-ACTCTATCACCAACTGCTAACGGACGTTGTAGCTGCTTTGAATCCAAACT
-GTCGCCGTCTAGAACACGAACTCGGTAGTCGACTGTCTGAAACATTATAT
-GGGTCTCGCAGCGATAATTTTGAAGCCTTACCTTATTATCCGATAGGCTG
-CTTGCTGTGGTGGCATCCGAGTTGATAGTGATTCCACCAAATGATACGGT
-CACCTGAGATTCTTTAGGAACAGGGGCAGCAGGTATACAGGTCAGAAGGA
-ATCGTTTGTCGGTTTCTGCATTGAATCTTAAAAAAAAACGATGAGGAAGT
-TATTTTTTATTTTTGTCTATTTTTGTTCGTATATGGTTTTTTAGGTACCA
-TGGAATAAAAAAAATGCTCCTAAAAAAATTAGTTTCAATAACAAATATTA
-CTGGTACAGAGAGTGTAGATAGTTAGAGAGTGACTGACATCCGGGACCCA
-ATGGGGCGGGGCGCGCGGAAGAGACGATTCGTGTCGATTTACGAAATGAT
-GACAACGAGGAAAATTTCGTAAATCGACACAAATCGTCTCTTCCGCGCGC
-CCCGCCCCATTGGGTCCCGGATGTCTGTCACTCTCTAACTATCTACACTC
-TCTGTACCGGTAATACCATAATATGATCATCATTCTACATTAGAAAAAAA
-TCGATCTGAAATCACAGATTTTTGGCCTCCCTCATAAATTGAAATGGAAG
-AGGTTGCCAAACTAGGCCATTTTGGCTCGGCCATATCTGGGGTAGATTTA
-CGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAAAT
-GTAGTTGGCCGTGTGGAGTACACGACTTTCCCACGCGTTGCCCGACGGGC
-GATTGCCAATGGAGCGCGAGAATCTCAATGAGGAAGGCCATGGCGCGCCA
-GAACCCCATGATTTTTAGGGTATTTCGAGGTTGGCAAATATTCTGGAATC
-TTTTTGCAAAATGTTTTTTTTTTTTTGAAAAAAAAATTCCAAAAAATATC
-CTGATCGATGAAAATTGTTGGGTGAAAAAAGTTGCAGATTTTAGGAGAAA
-TTTGAGAAATTAGAAAAATTAGAAATTAGGAGAAATCAGAAAATTTCCAA
-ACTGCTTTCAGAATACTTGTATATATTGAAATAGCCTAAAAATCATGAAA
-TTTTTCAAAAATCTCTAAACTAGCCTCCAAATTTGGTAGTAAAAATTCAC
-TGGCAGCAACTTCAGAGCGAGATTTTTCTAGTTTAAAGTGCTCGTATGTC
-GCTGAATTTTTTGTAGGTACCTATTTGAAAGCTCTTTTTTCAAAATTCAA
-AAATTTAATTTTCAAGTTTAAATTTTGAGTAGCGCCAGTGGGGGATTTTG
-TCTAAATACACTTATTATGATCCAAAACTACCTGAGTAATTGCCACTTTT
-TGACAGTAAATAAAACATTTACAAAAAAAAAAAGTTTTATTATGATATTC
-GGTCACTTTGGGACCAAATGAATGGTTTTTCATAATTTCCCCACTGGCGC
-TACTCCACCTTTAAAACTGAGCGGAAATACTTTCCTTGTGAGCATAGCGG
-CAAAAAACCTAGTACCACATGGCAAAAAAAAACCCACTCATTGTTAGCCA
-TGACAACTTCGATCTCATTCTCCAAATTGCCTTCTCCGTTCTCCTTGGTC
-GAGCAGCCAGTCAGCGGAATCTAAGCAAATAATGCCCAAAAATTCAATAC
-ATTCAATAGGCAAACCTTCAACTGATATTTGGTGTCCGATTGAAGCGTGC
-CATTTGCATAGATACACTTTGGATGGCCCGCGCGACTTTGTATCGTGCCA
-CGGAAGTTTTCGTCAAACTTGATTTTCAATAGGAAATCTGTCTGCAATAT
-TGAAGACGTTTTTTTCCTTTTGGGTGGTGACCTTCAAGGTTTTGGCCTGG
-GTTTTTAATCTTCCATTAAATGCCCTTCAAATTCGCTTTTTCGAGAGTTT
-AAGAGAGTTTCTAGGCCGAGGAACTTCTTGCAGCCAAATTTCTAAACTAT
-TGTGTTTTTGCCAAAAACAATGAAACATTTTAGGTCATTTGTGACGTCAT
-ATTTTTTCCATGCAACTTTTTATTGGCTCCACACATCTTCCAAAAAGCCT
-AAGCCTGAGCCTAATCCAATGTCTAAGCTTAAGCCTAAGGTTCAGCCTAA
-GCGTACGCCTAAGCCCAAACCAAAGCCTAAGCCTAAGCCTAAGCTCAAGC
-CTAAGCCTAAGCCTAAAAAAAACCGGAAAATCCTAAGCCTAAATAGCGTC
-AGTAGCAAGCTAACGCTCGCCACTGACGCCAAACCTAAGTCTCGGCTTAA
-GCCAAAGCCTAAGCCTAAGCCTAAACCCATGATTAAGCCCAATCCTAAGC
-CTACGCCTAAGCTTGAACCTAAGCCTAAGCCTAAGCCTAAGCCTAAACCC
-AAGCCTAAAATTTCTAGGCCACCACTAATATTTTCAAAACTCGATTCTCA
-AATACTTCATTTTTTCAGGATATGAAAGTAGGACAGAAATGGGCAGGGTA
-TATGGTATGGAGCAAATATCACAAGATGGCAGAAACATAGATACGGGGTG
-GGAGTGTTGGACTAGGTGACTTTTCTAGGCCATCCCTACCTTATCACACG
-CAATAGAAGTGTCCACAATGGCCACCGATCGAATCAGCGGTGGCAGCACC
-ACAACCACCGACCAAATGATCCAGTGCAGAATCATAAATTTGTGGAGGGA
-AAAATCGATAACAGTAGTGAGGGTAATAGTAGTAATAATACAAATATATA
-TGGAAAAATGAATACAAAAAGATGTGTGCGCTGGTTGGGGTGGTGGCGTA
-AGAATACAGGTGGGTGGGGGGTATAATTGGAGCGTGGCCGAGGAGGAGAA
-TCGCAAAAAAAAGAAGGAAAGAAAGAGGATAGTAATGACATGTTACGGTA
-GAAGGACAACTACCTAATTATATGAAAGAGGGGGGGGGGGCGACGAGAAG
-AGGAAAAAGTCTTACGCAATTTGCTACTCGACTTTCAATTTCTGCTAGAA
-ATCGAAAAAAAAATAGGAAACAAATTCCGACTCTATTCGATATCATCACT
-TCCGGGGCACGGCACAGGTCGGATCAGATTCAACGACGTCTCGCGATCCC
-GACCCTCTGATCTTACGGCCATCCCATTGTTCACATGATAGTCGATGAGC
-TCGGAGATGTTGCTGAACGTGCGATCGCGGGTTCGGACTCTCTGGAATTT
-TGAGAGGTTTGAAGGTTTGGCGGGGGGGGGGGGGGAGGGTCTTACGTTGT
-GATTGTCCAGTAGGATGAGATGTTTGTGCTCGTTTTCAGCGGTTCGGCCA
-CTCAGCACGTACTTGCCGGGCGTGTGGTCGCTTTGTCTGCAAGGAACTGG
-ACAAGTTTGAGCGGCCGACAGCTTGCGGGTCTTTTTTTAGAGAAGGGGGA
-CTGTGAGGTGTCCGCTGCTTCAGACAATCTTAGCATCATGCAAACCTTGC
-ATCTTTTGTATTTCAGGAAAAAAAACGCAGAATTTTTTTTGAACAAAAAT
-TTCAGCCTAAAACAAAAATCTAAAAAAATTTTGGGAGGATGAACTTATTA
-TACCAAATTTTTCCCTGGTCTTTCAAGAATTATTTAAAGTCCCGTGGCTT
-CTGAACATATTATCAAACAAATTACAGATATGAAATGTGACTGAAGCTTT
-AAGTCAGAAATATATAAAAAAAGGATTTTTCATACTATTTTTTCAGTCAA
-ATTTGATTTTTTTAGACTTTCAGATTTTTCTACGAAGTCTGTTAAAATAG
-GCTTATATTAAAAAGCTATCCGATTTACTATTAGTAAAAAATTATAGCGA
-CCGACATCTCGCAGGTTGTTAAAGAAAGGTGCATTGACCGGCTCACGCAA
-CTTTGGCAGTTTATATCTCGGCTGGTTTTGGTTTTATTTAAAAAATTTCA
-ATTGACGAAATATTTATCACTTTTTCTACTAAAAGTTTGCAGTTGAACAC
-TTTTTGCTAGCAGCGATATTAACCGAGATATTAGCGGAAAAAGTTACATG
-AGAAACATGGTGCATCGACAAGAAATATCTCACAAAACTTTGGCAGGTTA
-TATCTCGGCTGGTTGTGGTTTTATTAAAAAATTGTTAATTAACAAAATGT
-TTATCCTTTTTTCTACTACAACTTTGCAGTTCAACACTTTTTGCTAGCAG
-CGATATAAACTGAGATATGATTGGAAAAAGTTACATGAGAAACATGGTGC
-ATCGACAAGAAATATCTCACAAAACTTTGGCAGGTTATATCTCGGCTGGT
-TGTGGTTTTATTGAAAAATTGTTAATTGACAAAATATTTATCCTTTTTTC
-TTCTACAACTTTGCAGATGAACACTTTTTGCTAGCAGCGATATAAACCGA
-GATATGATTGGAAAAAGTTACATGGAAGACATGATGCATTGATCAGCTAT
-CATAGCTCATATTTTACTTATCTCAGGTTTTACCAAAAAATTGCCAATTA
-TTAAAACATTAGCCTTTTTCTTCGAAAATCAAATTTTGCCCGAATTGCCG
-AAAATATAGATTTGATATTTTTTTGTAGATTTAGGAGCCTAAACATTTTT
-TAATTTTTTAAGTATTGACCGTTTGCTTTTAAAAATGACTAATCGAATAC
-TGAAAACACAGTTAACTTTTTTTTCAATTTTCGAATTATAATTAGGTTTG
-AAAATTGCCGAAAATGTCGGCATTCAGTTGGAATTTTGGCAATTGCCGAA
-AATTTCCGATTCCCACGCGCCCCTGGTGTGAACCTAGTGAGCATGAAGCC
-AAACGTTTTAGAAATTCAGCAAAATTCTAGCTTTTTTCTATAAAAAATCT
-AAAAAACCTTACCGAACCAAAAAATCGCCTTCCGTCTTCAACAAAGCCTG
-TGCATCCTCTCTGGATAAATTTCCATGATACCAAACTTTCCCCACAACAT
-CCTCAGTTACAGTAGGTGCTCGGCAATTCGACACAAATGACTGTCGATGC
-AGGGAACTTCGATGTCTCATCGGCGGCGCCGGCACCGTAAATCCATCGTT
-AGAAGTTGAAGCATTCGCCTGTGCATCAAAAGTGTTCACATTGATCGCAG
-TGGTAAGGACGTCGATGAGCTTGTGCACATCCTCGATGAACACCACGTGG
-CATCGACGATCCGTTCCATCCTTGTTTTTTGCAATGTAGCCGAACATTAG
-CTCCGTGTCCGTACCCTTTTGGCCTTGGGCTCCGAATGAGAAGAATGAGA
-AGGGATGACGTTGAATTAGACGACTTTGTTTTATGATTTTGATCATTTTC
-GAGGAAATGTTGATGTCTACGGGGAAGTTTTCTTTTTTCACTTCACCGAT
-TACCTGAAAATAAGGATGGTTTACCTGGGCTTTTTCATCGACCCGTGAAG
-TGTCGGCTGCAATAATTTTAGTCGAAATTAGTGATAATAACTTTTCTATG
-AATAGCGGCTGACATCATTTAGCGCGATTTTTGATCGACCTGTAAGATGT
-CGGTTGCTTTAGTACATTCTATAGTGGCAGGCTTTTGGCTGAATTTTACT
-GGATATATAAGCTATCAAAATTTGAGCATGTCGATGCACCATGTAATTAT
-CTCAGTTTATTTCGCTGCTATCAAAAAGTGTTAAAATGCAAAGTTGTAGT
-AGAAAAAACGATAAATATTTTGTCAATTGACACTTTTTCAAAAAAAAACC
-AAAACCAGCAGAGATATAAGTAGTCAAAGTTGAGTCAGATATTTCCAGTC
-GATGCACCATGTAACCTTTCTCTAATAACCTGTGAGATGTCGGTTGCTAT
-AATTTTTTAGTCATTAATTTGGACAGCTTGTTAATTTGAAATAATTCTTG
-ATGATATCGTAGCGCGGCCGACATTTCACGGGTCCTTTTTTTTAAACATT
-TTGCAAAGCTGGTCATGCATTTTTGGTAACACTTAATATCAAATTAATGA
-GAAAATGTTTTGTAAATTTTTACCATTAGCCATGCCCAGAAAATGGCAAG
-TTTTTTATTTTATTTTCTTTTGTTTTTTTAATTCACAAAAAAAAACTCAC
-CCTACTAACAACTGGATTGATTTCTCGAGCCGCAGTCACGCCAACAGTAG
-CTGCAACGTGTTGTATACATTCTCTGAAAATTGAACAGTTACTTTATTAC
-GTAGATTTTTTATATATTTGAGCTTGCAGATGTTACCTGCCTTCATGCCT
-GCCTACCGCCTGATTTCTAAATTTTTGAATAAGATTTTTTTTTGATTTTA
-AGCCATAAGAAAAACTAACGAAACAACTTGAACTCTCATCTCGGAAACCA
-TCACGTTAATTGACTCGACTACTGGAACACTTCCGAGGTACTGAAAGACA
-ATTTTATATTTTCGGGGAAAAAACTAATAAAAAACTCACAGTAGCCGACA
-GAGAAACCCCGCTGCTCCGCAGCTCCTCTGCAAATGAGGGCTCCACGTTG
-AGCATCGCCGCAAGTTGATTTTTCGACGGAATTTTTGATTATTTTTAGAA
-AAAATCTAACTCGAAATTCGTTACAACCGAAATTTTGCAAGATTGAGTGA
-ATGAGGAATGACCGGGAGAGAAACGGAGACGCAGGCGGTGAGCGGAGTGG
-GAGAGAGAGCGCGCGAGACGGAGAGGCGCAGGCAGTGGTAGGGAGGAGAC
-AGGGAAAGATTAGATTGGTGTTGACTGGGTGAGTCAGCATTCTAATAAGT
-TAAGTTGACTCATAACTTTGTTTTTTGATCAGAGGGGGGGGGGGGGGGCC
-GTGGCCTAGAAATATCATTGCCTACTTATTACGTCACTAATGGTCTAGGA
-AACCTTGATAGCTTTTTTGGAGAAGATATGACGTCATTGGTGGACTAGAA
-ATCTTATTTTAGTTCTGGAAGAGAAATATTTTGACCGTGGAAGACAAATT
-AATGATGTGACCGGTGGCCTAGAAGTTTCAAATTATACCTGGGGAAATAA
-ATGACGCCACTGGTGGCCTAGAAAACTTAAACTATGCCTGAAGACGTCAC
-CGGTGACCTAGAAATTTAATTCTGGCGACGTCATAGAAATTTGAATTTTG
-ATGAGAAATATAATTTTATTGGTTTTCTGAAAATTGAATTTTATTGATTT
-TTTGGCAACCGGGAAATTGGAAAATTTAATAAATTGAACAAATGCAATAA
-AATAAGCAGTTTTTCAACAGTCATTACTTTTTTCCGTGAACCGTTTTGAT
-TTTAATTTGTAAATCTAGGTCGGAAAAGTCACACACACCGAGGAGCTAGG
-CTTCCCTCATCCTCCCTGGATCAGTCGGTAACTGCTTCGACTGGGGAGTG
-GGAGTGGGAGGGGTGGGATGAGTTCAATTCTTCTGGAATTCCATAATTTT
-TATTTTTGTTTTTTTGCGCCTACATATACCTGTGAAAATTGGAACTCGAC
-ACAAAAACCTCTCTAGCGCGGCTTAAATTTACTTCAATTCTTCCGGAATT
-CCATAATTTTTATTTTTGTTTTTTTGCGCCTACATATACCTGTGAAAATT
-GGAACTCGACACAAAAACCTCTCTAGCGCGGCTTAAATTTACTTCAATTC
-TTCCGGAATTCCATAATTTTTATTTTTGTTTTTTTGCGCCTACATATACC
-TGTGAAAATTGGAACTCGACACAAAAACCTCTCTAGCGCGGCTTAAATTT
-ACTTTCCTGTCCCAAAAACTCATCTATAATATTTTTAAAAAATCTAGAAT
-CCAAATCTATCAGATTTTTTTGAATTTTTGATTTTTTTCACATCGAGATT
-CGGAATCAGCGGAAAATTTGGAGTCAATTAAAAATATTTTCCAGATTTCG
-ATACTCCACATTTAAAGGAGATCACCTGAAACGCCAGAATATGATACTTC
-ATACTCTCCATCTTCTCGCTTTTGAAAATAATCAAAAAAAATAGTCGCCG
-TATTTATTGATATAGAAAAAATACCAACAAAATTGTAACTATTGATTAGC
-CATACAGGGTCTTTAAAGTCAACATTCATAGTGGGAGCTGGAAATAAAAA
-TATATAATAACTTGTTAAAAGAATTTATTGTGGAGTTATAACACCTATAG
-ACAATTAAAATCACCTGCTGCCTAAAGAGTATTTACCAGAAGCAAAGGTT
-TTCTGAATTTAGTGGAGTTTGTCCATTTACTTTTTTGCATGTTATTGAAT
-TGAAATGATACATAGTGAAACTAGAGGTAAAATTATTTACTAGGTTTAGG
-CTTAGGCTCAGGATTAGGCTTAAGCTTAGGCTTAGTTTTAGGTTTAAGCT
-TAGGCTTAGAATTACCGATAACTGATAACTTTTGCAAATTTAGTTTCTGT
-AATATCGGCAATAGCCAAAATTGCCGGAAATTTCTGCGATTCGAATAAAT
-AAATTGAAATAAAAATTAGTTCCTAAGATACATGTTATCTTTTTGCAGGA
-AAGTAGTAAACTCATGAAATGAGAAATTGCGATGAGGAAGGAAACATTCC
-TATGGTTCCTTAGACAATTTCTCACCTTACATTAGTATATAATATATAAA
-TGATGAATTTGACTTTTTGAAATTCTCTTCAATAAATACATTTAGTTGTT
-TTTTTTTTAATGAGTAAAGTTGCAGAGTGTGGAATTTGCTATGAGGAATA
-TGGTGAATATTGTTGGAAATTTTTCTGAAAGTTTTCATTTTTTTTGGAAA
-TTTAGAGAGTTGGGTGTAATTACTGAAAATTATGTTTTAAAAAAATTATT
-TTAATGATTTTTCAAATTTTACAAAAAACTCATTTTTAAATCATTAGAGG
-TGAAGTAGCGCCAGTGGGAAGATTGTTAAGATCCACTCCTTTAATCCGAA
-AAGTACCGAATATCATAATAAAACTTTTCAAAAGTTTTTAGAAACTTTTT
-TATTTACTGTCAAAAAGTGACAACCACTCAGTTTTTGCCACTCATAATTT
-TGGAAGTCGACCAAAAAAAAAATTTGTTTTCCTACATTTTTTATACTTCA
-ATTTTGTTTTAATTATTTGTATTGAAAAATTGTAGGGGTCGAAACATGCG
-ACAATCCTGTCAGTTTTCAAAAATCTCTACTTACAAAATATAGGACACGC
-TCCAAAAATGGATGTTTTTACAGACAACGCCATCCGAATCCCTTGCATCG
-GCACATGCGGTCATACGTTATGTGACAGTTGTCGTGAGAAAATTAGAGAT
-AAAAAATGTCCTCAGTGTAATCAGAAAGGCGCATTTGTTGTGAAAAATGT
-GAATAAACAATTTTGGGATTTAATTGTTTTTTCGCAATTTTTAAAACCCC
-AGGAAGTGGAAGTTGAGGAGACTGAAGAGGTTGGTTAGAACTTTTTTTTT
-GGATTTTTCGGTATTTCCGGGAGGTTATCCTTTGGGCCTAAAACTAGGCC
-TAAGAGTAGGCCTAAGCCTAAGCCTAAAACTAAGCCTTAGCCTAAAACTA
-AGCATGAGCCTGAGCCTAAGCCTAAGTCAAGCCTAAGCCTAAGTCTGCTG
-CTATCAAAAAGTGTTAAAATGCAAAGTTGTAGTAGAAAAAACGATAAATA
-TTTTGTCAATTGACACTTTTTCAAAAAAAAACCAAAACCAGCAGAGATAT
-AAGTAGTCAAAGTTGAGTCAGATATTTCCGGTCGATGCACCATGTAACCT
-TTCTCTAACAACCTGTGAGATGTCGGTTGCTATAATTTTTTAGTCATTAA
-TTTGGACAGCTTGTTAATTTGAAATAATTCTTGAAGATATCGTAGCGCGG
-CCGACATTTCACGGGTCCTTTTTTTTTAACATTTTGCAAAGCTGGTCATG
-CATTTTTGGTAACACTTAATATCAAATTAATGAGAAAATGTTTTGTAAAT
-TTTTACCATTAGCCATGCCCAGAAAATGGCAAGTTTTTTATTTTATTTTC
-TTTTGTTTTTTTAATTCACAAAAAAAAACTCACCCTACTAACAACTGGAT
-TGATTTCTCGAGCCGCAGTCACGCCAACAGTAGCTGCAACGTGTTGTATA
-CATTCTCTGAAAATTGAACAGTTACTTTATTACGTAGATTTTTTATATAT
-TTGAGCTTGCGATTGTGTAATCAAAAATAAACATTTGAAGCATGATACGA
-AATATTTGAACGATTTTTTTTCGGAAAATCAATAAATGAAAATGGAGTTT
-TTTTTTTGGATTTTAGCAAACTTCCCAAATGACGGAAAGATCATATGAAG
-CGATTATTTTTTCTTTTATAAACCTGTTCAGGATTTGCATTATTATGAGA
-AAATCCTAGGCCAATTAGGCTAGCATGTACGGAAGTATTTTTTAAAAATT
-TATAAAAGTAATGAAAAGCTGATATTTTCAAAATTCCAGAATGACGGAAA
-AATCATATGAAATGCTTTTTTTTTCTTTTTTAAACCTATTTAGAATTGTC
-AAAACTACCAGAAAATACTAAACAAAATAGCTTAGCTTGACCGGAAATAT
-TTTTAAAAAATTGATAAAAATAATGAAAAGCTGATATTTTCAAAATTCCA
-GAATGACGGAAAAATCATATGAAGCGATTCTTTTTTCTTTTATAAACCTC
-TTTAGAATTGTCAAAACTACCAGAAAATACTAAACAAAGTAGGTTAGCTT
-AACCGGAAGTAATTTTTACAAATTGATAAAAATAATAAAAAGATGATTTT
-TTCAAAATTCCAAAATGACTGAAAAATCATATGAAGCGATTCGTTTTTCT
-TTCATAAAATAGTTTAGAATTGGAATAATGATCAGAAAATACTAAACAAA
-GTAGGTTAGCTTGACCGGAAGTATTTTTAAAAAATTGATTAAAAAAACTG
-ATTTTTAAAAAATTCCAGAATGACGGAAAAATCATATGAAGCGATTCTTT
-TTTCTTTTATAAAGTAGTTCAGAATTAGCATTATTATGAGAAAATCCTAG
-GCGAATAAGGCTAGCATGTACGAAAGTATTATTTAAAAATTTATAAAAGT
-AATGAAAAGCTGATTTTTTAAAAATTCCAGAATGACGGAAAAATCATATG
-AAGCGATTCTTTTTTCTTTTATAAACCTGTTCAGAATTGTCAAAACTATT
-AGAAAATACTGAACAAAATAGGTTAGTCCTAGGAAAGACTAGTTAGGAAA
-GAATTCTTAAAATAGGAAGTTGAACAGAAAATCTGGAAGATCTGAAATCT
-GGAAAAAGGAACTCTCAAAAATTCAAATTTTGATTTTAGGAATATATGGC
-TGTGTAGTCTTCATAGACAATCAAAATAAATTATTTTAATTTTCAACCAT
-CTTTATGCACGGGCTTCTGTCCTTCCTCATTGAATTTTTCGCGCTCCATT
-GACAATCGCCTGCCGGACAACGCGTGGGAAAGTCGTGTACTGCACACGGA
-CAAATACATTTAGTTTTACAACTGAAATCGAGCCGCGACGCGACACGCAA
-CGCGCCGTAAATCTACCCCAGATAAAGCCGAGCGAAATGACCTAGTTCGG
-CAAACTCTTCCATTTCAATTTATGAGGAAAGCCAGAAACCCGTTTTTATG
-TAAAAGTTCATACTGTGCAGTTAATTTAAACAAATCAAAATTTGGAAAAT
-GATTTTTGGCTTTGTGCAAACTGTAGCGTTTTAGGCGTTAAAAATCTGCC
-AATGAATAAAAAATTTCTTATAAAATTTTTAAAAAAACAGTTATTTGCCC
-ATTCCGTTTTTCAACATTTATCAATTACGGTTCCAGTGATCAAATGCTTA
-CACGGAAGTCACTGATGACGTTGACTCCATGTTTGGTTGCGATGTGAAAA
-AGGTCGTTTTTTGCCCAAATCGAGAAAGGTCACACACACACATAGACATA
-CACAAAACCTTATATAATTTGTAAGATATTTTGTTTGATTCGAGAAAAAA
-AAGAGAACAGGTATTCCTGCGGCGTCGTTTTTCTAAACGGCAGGAAAAAT
-TGAGAGAAAGAAAGAGAAAGAAAAAAGATGGAAAAAAACAGTTTAAATAT
-AATTATTAGGTTTAATTATTAGGGGTGCACCATATTGTCGTAGGGGCCCT
-TCTCCAAAGTTTTAAGTTTATCGATAGAGCGTGAATACATAAAGAGAGAA
-ATTTGACCTGCAAAAAAAATATATGGTTGGTTCCCATGCCATAAAAAATC
-CATGCAACAAATGAAAACAACACCTGCCAAGTGTCCTCCGCCAGTCTAAC
-CAAGTTTTTCCCTCCAAATGTTCCGTGACATTGTTGTTTAAGGCTTTGTA
-CTTTCCGCAGCCGTCTTATTCTTCCCGAAGTGTTCTCCCTAGATAATCGG
-GTTTTTTTGTTGAATCGGCTGGGGGTAATGATCGGAGAAGATATATATGA
-AATAAATGAATAAAAAAGGAACACCTTTTGGAGAGGCAATGAAAAAGCAA
-GCTATGCAAAGTATTGATCCGTTGTTATGAATGGGCTTGCTTAGGCTTAG
-GTTTTTTTTAGGTTTAGGCTTAGGCTTAGGCTTAGGCTTAAGCTTAGGCT
-TAGGCTTAGGCTTAGGCTTAGGCTCAGGTTTAGGCTTAGGCTTAGGCTTA
-GGCTAAATCTAGGCTTTGGCTTAGGCTCAGGCTTGTGCTTAGGCTTAGAC
-TTAGGCTTAAGCGTAGGCTTAGGCTTAGGTTAGGCTTAAGCTTAGACTTA
-GACTTAGACTTAGGCTTAGGCTTAGGCTTAGGCTTAGGTTTAGGCTTAAG
-CATATACCTAGGCTTAGCCTTAGGCTTAGTCTTAGGCTTAGGCATATGTT
-TAGGCTTATGCTTTGGCTTAGGCTTAGACCGTGTGTATATCCGAATGTGT
-GTTTTATTATGTTCCTGATTCTGAAATCATTTGTTAGTTTAATATCTACA
-AACATTCCAAACAGTCTGTATGTGCTGCCAGGTGGCATTTCCTTAATCAT
-CTCAAATATATTTGGTTTCATTTCCCCCCATCGCAAAATCCCTTTCTTTA
-CCTGTCATTTCGCCTTTACGTTCAACTTATTTGATTTTGTTGTTTTCAAG
-TGATAATCACGATTAAACAACGAATGAAAAAAATAGGTATGGAATTACTA
-CGGTATTCTTTTTTGCCTATCCTTCTTTCTCTCATTTTCCTTTTGTCTTC
-TAACAAGTTCTGCACTTTTGAGGTACATTTCTTCTCCGATTTGATCAGTC
-AAAGCTATTCGGTTTAAACCATCTTCTATTCAATTCTGATGATTACTGTT
-AGGAACGAGTGGTCACTTAATTCAAAAGGTCGAACTGTTGTACTAATTGA
-ATTGGAAAATTTGTAGGTTATTTGACGTTTATCAGAAATTGAAGATTTGA
-TATAAAATTTGGTAAAAATGAAAAATAAAGTTTCATTTAGAGTAGTATTC
-TGGCTTCCCTTATAAATTGAAATGGAAGAGTTGGCCATATTGGTTCGGCC
-ATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGTCGCGGCTCGATT
-TTAGTTGTAAAACTAAATGTATTTGTCCGTGCGGAGTACACGACTTTCCC
-ACGCGTGGTCCGGAAGGCGATTGTCAATGGAGCGCGAAAAATTCAATGAA
-GAAGGCCAGAACTTCGTGTAGTATTAGCAGACCAGGTTTTCACATAAATT
-TGAGCGGTGAAACTAAAATTATGACATTTTTACGCAACTTTATGGGCCAG
-AAAATTTTTTTTGGAATTTTTTTTTGAAAAAAATTCAAAAATTTTGATAA
-AAATAATTGCCAAAAAGACAAATTTTGAGTAATTTTACTGCCTCTAAGAG
-TAATGAACAAATGTTTCCAACTTTTTGCAAATTACTTTCTTAGTTCCCTT
-GCAAATCTATATAGATTGAATTTGGCCTAAAACCTAACAATTTAGCTGCA
-ATATTGTTACAAAAATTTGGGTACAATAGTGTGTTTATTGAAACATGTGT
-TCTTGAAGTTGGGTAAGAACAATTGATGAAGGTTGTACCAAATGAACAAA
-AAATGTTTTTAGAGAAAGTCTGAAACATTACCTTATTTCTGATGGTCGTT
-AATCAAATTTTACTGTAACTGTTATGAAACCTTGGGCATCGTATTTTCTC
-TATTAGTGCAGCCGACCACTTTACTTTGAGACGTTATATCTTGTTTATTT
-TAAAGATCTCAATATTTTAATAACTACAAAATCATAGAAAAAGAACCAAC
-AAAAATTTTGTTAGTTGACAATTTTTAAATAGGACAAACGATAACTGAGC
-TATGAGCTGTCAAAGTTGAACAATGGTGGTGCAATAGAAGGAACTAATAG
-AAAAAATACGGTAACCTAAATTTTTATGTTAAAATAAGAAGTAGCGGGTT
-GATTCCAGAAGTTTTTTTTATAAGGTAACCATCCGCTGACCGCGCCTCCG
-GTATCCCTTCAAAAGGCAAAAAGTAAACTTTTCTAAAACTACAGTAATCC
-TACAGTAGTCCTACAGTACACCTACAGTACCTCTACAGTATCTTGACGTG
-ATCCTCTACCTACTCCCAACCCAGTACCTCTTCAAAGGCTAAAAAGTCAA
-AATTTCACAAACTACAGTAATCTTACCGTACTCCTACAGTAACCCTACTG
-AACCATTACAGTAATTTGACATTATTCGCCACCAACTCCAAACCCAATAC
-CTCTTCAAAAGCTAAAAAGTCAAAAGTTCACAAACTACAGTAATCCTACC
-GTACTCCTACAGTACTCATACAGTACTACTACAGCACCCCGAACATATCC
-CTCCACTAACCCCAAGTCAATATCACTTTAAATGACGAAAAGTCAATTTT
-TCCAAAACTACAGTAATCCTACAGAACTCCTACAGTACCCCTACAGTACT
-ACTACAGTACCCTGACTATGTCTTCCACTAACTCCAAACCAATATCCCTT
-CAAAAGACGAAAAGTTAATTTTTTCAAAACTACAGTTATCCTACAGTACT
-CCTACAGTACCCCTACAGTACTACTACAGTACCCTGACTATGTCCTCCAC
-TAACTTCAAACCAATATCCCTTCAAAAGACGAAAAGTCAATTTTTCTTTT
-TTTTAATTGAAATTGTCCGTTATTCCCTATTATGTAATTTTCCAAAAATG
-CTGCCAACCTCAAAAACTGTTATGTTTTTGTTCATACACATTTAGCCACC
-ACCTGCATATGACCCATAAAAAACCATACTTGACACCTGACATACTTGGT
-TTCGATACAAAAATCGAGAACATTTGGCAAACCTGAGTTGTCATTCTATT
-GGCTATTCACCATGTGCTCTAATAAAGTAGAACTTGGGAATATGTGTCAA
-GGCTGTAAATGGGGGAGTAGTATTGTTAACATATGTACTGTGCAATATTC
-CAGATGCCAAGTATACAGATTATCTAATGACAATAGGTAATTTGATTTTT
-CAGGTGCTATAGTGCTATATTGTTCCAAATACATGATTTTTTTTTAGAAA
-ATTGAGGTGTGGTGTCGAATGTCCCATAATTTTGGATAATCAATGGTCTT
-TAGCGAAATCCTAATTTGAAGCCGTTTAAAGCTCGAAAGTGCAATACATT
-TACAACTGCATTAGCGTTTTATTTTGCTCTGAAAATGACAAATACACAAA
-ATTTTGGATTAAACCGCCTGGTTTTAAAACCGAGCTTAAACAATTTTAAT
-TTTACAAATTAAAAAGTAAAAATTTTCTAAATTCCCTACACTAAAATTTA
-GCGTCCACATCACTTTCTACCCCTTAATTAATTTTTTACTACATTTAACA
-AAAATATTTTGAACCGGCAATTGTCAAAATTGCCTATTCCCAAAAATTTC
-CAAAACCGGCAATTGCCAAAAATTTTCAAAGCCGGCAATTGTCAAAATGG
-CAGCAAACTTCCAAAACCGGCAATTGCAGAAATTGCCTATTGCCAAAAAT
-TTCCAAAACCGGCAGTTGCCGAAATTGCCGAAACTGCCGCAAACTCCCAA
-GACCGGCAATTGCCGAAATTGCCGGTTGCCGAAAATTTTCGAAACCGGCA
-GTTGCCAAAATTGCCGCAAACTTCCAAAACCGGCAATAGCCTAAATTGCC
-GATTGCCAAAAACTTCCAAAACCGGCAATTGCCGAAATTGCCGATTGCCA
-AAAATTTTCAAAAAAATTTCAGAAATTGATACATTTTTTAATTGTTGTGG
-GAATTTTTTTTAATAAATTTGAAACATATCACATCCTCCTGTTTTCAAGA
-AAATTAATTCCTTCAGTTTCTGACGACTCAAATCCTCCTCAAATGCCAAA
-TTTATTTTGGGAAACTATACCAATTCTCAACAGAATTTTAAAGGTGGAGT
-ATTGCCATTTTGTCTAAGTACACTTATAATAATCCAAAACAACCGAATAT
-CATAGAAAAACACTCGAAAAAAAATTTTTTTGGTCGACTTCCAAAATTAT
-GAGTGGCAAAAACTGTGTAATTGCCACTTTTTGACAGTAAATTAAAAAAT
-TTCAAAAAAATTTTGGAACGTTTTATTATGATATTCGGTTATTTTGGGAC
-CAAGTAAGTGGTTTACTCCACCTTTAAAAATTTAGCCGTTATACAAACTC
-CAAATATATCCATTATTCTTTCCCCTATACCCTACCCATAACAAAACAGA
-AAAATTTCAAATTCGCATCGTCGCAACACCACAGCATGTCCATTTGGAGT
-GATGTTCCGAGAGAAAGGTCAAATCGTCTACCTCCTTATTCTAACCATCT
-CTATGCCTATATATGAGGCTTTAATGAACGAGCGCCGCCGCCGCGCGCCT
-AGCGCCTCCGAGTGTCGCAAAGTGCAACTTGTTTGCCACTTAACCTGAAT
-TCTACTGTGTTGTATTATGTGAAGAATCGGATAGATGTAATGTGTAACAA
-TAAAAAACCACGACGACGACTGAATATGGAATCGGCTAGGTGGTGCAAAA
-GTTTCGGAAAGTTTTGGTACCATGGTACCTGTGTAAGCTCTGTGAATTTT
-TGAGCCACGATGGGTCTTGCAACGATATTTCGTCGAAACTTTATTCTCGA
-AAGTTTGTTCAATTTAAATTTTCCGCAAAAAACATTTTTTGAAAATATTT
-TTAAAAATTTGAATTTCTCAGCATTTTTTTTTTAATATGAAGTTTCCAAT
-CCCTCAAAAAAAAATTTCAGAGAACATTTGAATTTCCCGGAAACCCCAAT
-TTCTGAGAATTTTTCAATTTCCCTTTAAAATAAAATTTCGGAGAAAATTT
-GAAATTCCCGCCAAAAATTTATTTTGAAATATTTGAATTTCCCGGCAAAT
-ATTTTTTTTTTTGAAAACTTTGATTTAACGGAAAACCCATTTTCTGAGAA
-TTTTTGAATTTCCAGTTTAAAGAAATTTCCACGGGTTTCTGGCTTCCCTC
-ATAATTTGAAATGGAAGAGTTTGCCAAACTAGGAAATTTTGGTTCGGCCA
-TATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTCGTTTT
-TAGTTTTAAAACTAAATGTATTTGTCCGTGTGGAGTACACGACTTTCCCA
-CGCGTTGTCCGGCAGGCGATTATCAATGGAGCGCGAAAAATTCAATGAGA
-GGAGGCCAGAACCCCGTGAATTCCAGCAAAAAACTTTTTGAAACTATTTG
-AAATTCCCACAAAAAAACAGTTTTGCTGAGAATGTTTGAATTTCCCCCAA
-AAATTTGACGGAATACTTGAAATTCAAAAAATGTTGTGAGAATATTTGAA
-TTTCACGGAAAACCTGTTTTCTGAGAGTTTTTGAAAATCCCTCAAAAAAA
-ATTTCGGAGAAAATTTGAATTTCCCTCAAAAAATTTCGAGAAATATTTTA
-AATTACCGGCATATTTGACATTTTGAACTCCCCACAAAAAAATTTTTAAA
-AATATTCGAAATCCCGGAATAATTTTTTTCACTATAGTCAGAAAAGATCA
-ACTGACTAACTTTTCACAAACTACAGTACCCCGAGCATAACCCCCATTAG
-TTTCCGATAGCTACAGTAATCCTACAGTACTCCTACAGTCCCCCTTCATA
-ACGTTACCCTGATTACTAAAAAATGCCCTTTTAATGCGTATTATCACATC
-TCACATGATTAAGACCAAAAGGGGTGTCCTTCAGATAAATACCCGTTCAA
-TTTTTTTTACTGCAAACCAGTAGACTTATCTTTTAGGTTATGAAGAGAAG
-ACTAAGTGTAAACAAGGTCGTTGGAAGTGATATGTTAAGAAGTTAACGGC
-AAAATCGATGCCAAAACTTTCTGAGCTTTGACTTCTACTGCTCAGCTCAT
-TCCATAACCATGAGCTCATCAACTTGCCCTCCCCCCCCCCCCACTATCTT
-CCACCACACTTTCATTCCTCATTGTCGCAACAAACCCATCTCCGGATTCG
-TCCTTTATATGTGTCACAACACAGGAGTACTCCTTAGCGCGCCAACTTGT
-AATACCCCCAGCGACTTGGCCCAGAAACTTTCCTCTAATCGCATCCACAA
-TATGGTCTGCAAGTACAAGATTAGCACCCCCCATTGTATGTCAATTTGTC
-TAGTTTTTTATTCCATTGAACTATTCCACAATGTAGAAAATTGGGGTTAT
-GGTACATCGAAACATGGTGCATCACATAATGGTGCGCCCAAATCATGGTG
-CATCGTCAAAAATAAGAATCCGAGTCCTCCCAGACATCCATGTAGGTATG
-CACTTTCCCGCCTGTTCCGCATCTAACCAACGATTAACTGAATCTTTACG
-ACCCTCTCTCCTCCGAATGATGTTGAAAAATGTCGCGCCAGCACCTTTGG
-AGGGGGGGGGGGGGGGGTTAAAAAGATTCCAATCTACCACCTATCTTCTC
-CATTTATCTTCAATTTTGCCCCCCGCGCTCTTAGATTAAATGAACTTTTT
-TGGCTAAATCACAGCACTTTTTATTAAATCTAGGAACTGCATCTAAACAA
-TGCATGTGGTTACAGTTACCGAAAAATGTTGAAAATTTGGGAAAAGTGCC
-AAAATGTTGAATCAAGTCAGAGAGATTCGAAGACGCTTCTAGCAATTTTT
-TGACAGTTCCTGTCCCCTTTCGGTAGATTTGCGGCAATTCTCGGCAGATT
-TACACCCGCTTTTGGCGGTTTTTCGGCAACTTTTAGCAATTTTGGCAATA
-CTTGAAAACTTCTATTTAGCAACTTTTAGTCAATTTTCTGTAATTTCTGA
-GAACTTCCGATTTTCTTTTACATTTTTTTCCGATGCACCATGTCCCGAAC
-GCTCGCGCCACGACTTTTTTATTCATTATAGCAGGTCCTGTTTTGATGCA
-CCATTTCCCAAAGAGCCCTGCAATGCTGGCTCATGTCACGATGTACCATG
-TCCTGAAATGTCCCACCACGTTCCGCAACGAGGTTTTACTGCCAAATTTT
-ATGCAATTCCAAAATATTTTTCGACAATTTTGTTAGCTTTTCCCTTTCAA
-AAAAGTTCAAAATTCTGTTCCAAAACCACACCAAAAAGTCGAAGATCCGC
-AAAATCTGCACTTGAAACACTATTTGACAACCCCCGTCTCAGGCTATCAA
-AAATGCATGCAGTCATATATATGTGCAGCTTGTGAAACAAAAAACGAGAG
-GGATCAGGGGCTCAGTGCTCAAGGTAGATGTGCAACTCTATGAAATTGAT
-CGGTTATGCATGGCAAGTAAGAGTGACAGGGAGCGAAGTATGATGATGAT
-GATGATGATGGTGTGGAGAGAGCGCAACGTATGAGTTATTGAATTTTCGA
-GAAAGGTTATCTTTGATGGGGGGGGGGGGGGGGGGGGGCAGTTCATGGTG
-CATCGAAATATAAAAACTTTCGTGGAGATACGCTTTTTGAAGAATTTTGT
-GACACCTTCTTGGTGCATCGAGACAGTTTTCGTGGCAAGACCTGATTTGG
-TTGAAACTCTGAAGCCAAATCGCGCTCTACGATTTTGTGACCAGGCCAAG
-GTTTTGGTGGCATGGTGCATCATAGTAAAAATTCAAATCCTGGGAAAAAA
-AGCTCTATATATAATATCCAGCCATGGACCGTACCTCCGGCGTGGCCCCC
-TTCTGGAGCTAAAAACTAATTTTTCTAAAACTACCGTAACCCTACAGTAT
-TCCTACCGTACCACTATTGTACCACTACAGTACCCCGACTATATCCGTAC
-ACTAACCCCAACTCACTATTTATCCAGAAGCCAAAATTTCACAGACTACA
-AAGACTACATAGACTACAAACTATGAACACACTGAATAAGCGCTTCATAT
-ATATAGTGAATGATGGTGAGATCCATGTGACATGGTGCATTGTGACAGGC
-ATTTTGGGAAGGGGGCTTTGAGCACAAAACAAAATCTTTAGTTATTTTTC
-CGACAATTTCCAATAAAGTGAAGTTTAACAAGGTCGTGGCGTACTTGTTT
-CCAGTTTCCTCACGAGTGTTGCATATTATACCGCCAGTAATCATTGCGTT
-ATCACATAGTTGACAACGGTTTGATAATGTCACAAAGTGTGGGGGTTTTG
-GAAGTGGCATCAAACCAGCATACGATTATTAGGACGTGATGAACTTATTT
-TACCTGAACATATTATTAGGTGGTGGAGCTGGGAGCTTAGTATTTGGGTT
-TTGAAACAATGCACCATGTCCTAAAAGATGCTTTATTGCTAGGTAGGGTG
-CCGCGACTTTTGTATTCATTATAACAGGTTCAGTTCCGATGCATCTGCAT
-TTTTTTAATACTGTTCTTATTCTTAGCTCAATAATTCAGGCTGAGGGCCG
-CAGGCCCGAACACTTTTGGAAACTGTGGGCCAGCTTTAATCCTATTCCAA
-GCAAATTGTTATTCGCTCAAGCCAACTAACCAGATTTCCTCAAACTTTAA
-TCGCTCATATCTCAGCTCAAAACCATAGCAGAGACTTCGTTTTTTAATCA
-ATCGATCCCAAATTTTAAGGAAATCTCGAATATCCCTATCTCAGGTTTGA
-GGCGAAGCCGAGAACCTGCGCAAGCTACCTTTTTGGGCATCCCCATTCCC
-GAAAGGCTGGCGCGGCCCTGCCGCGCTAGTCATTTGCCAAAACGTCAAAT
-TGGGTCATGTCACGATCCATAATGCCTTGAAGGGTTCTTCTGCAACAGTC
-CTAAAAGAAACTTAGCACTCTGGTTGAGGTATAGATGCACCATGTCCCAA
-AGGGTCCTGCCATGTTGGGACATGTCACGATGCACCATGTCCTGAAAGAT
-CCACGCTCGAAAACTACATTGTTCCGAGTGTTTACCTCTATTTCAATACG
-AAATTTCAGCAAATTTTCATCCAAAATCATGTCATTCTAACAAGAGCCTA
-TCATGTTGACTATAGGGTCGTGACGACCTGCTCGAGTTCGCCTCGCTCTC
-CTGTTATCAGAATAGCTATGCGTTAAGTACGCGATGTATTGACAGTCACG
-ATTTAACGCTTCAGTTTTGTAGTTTTGCTGGAAATTTTTGAGTTTTTCGT
-TTTTTCTTGGCTCAAATCGAGTTTTGCTTTTTTGACGATTAAATAATTTA
-TTCAAACTTAGCGCATTTTTTGACTGATTGTGAGACATGATGCATCGTGA
-CAGGGCTTAATCGTGGCGAGACCCTCTAGTACAAAATTCTTTTAAATATC
-AGTAAAAGCATTATAATCCATGATTCTATACTTATTTTATGGAATTTTCA
-GCCTTAAAAAAATCTGAAATTTACGATGCTAAAATCTACTCAAATTATAG
-TTTCAATCCAAAATTTCTCAGAAAAACTAAAATTAGCATAAAAATGTTTT
-GTCTGAAATAGCCCTAGATTCAAATATCCCTAACACCCCAAAAAACACCA
-ATGTACATCTCCTCTCCGTAAATATGTAGTTTTACAACCGCCTCTCTGTT
-GACTGGGAGCCATAAATGTAGATATATTATCTTTCCAGATCGCCTGCCGG
-CCCCTCCCACCTGATTGTAAAACTGCTCTTTGCTGTGGCGTTTTATCGAC
-TTGTTTTTCTTATATATTCCATTCTACATACCTTAACACATTTTCTTGTA
-TATTTTCTATACACTTTTTTAACTATAAAAAAATGCAACTCCTTTTTCTT
-CGATTTCTTTTTATGCAAATTTTTTGGCTTAAAGGTGGAGTAGCACCAGT
-GGGGAAATTGTTAAAAACCACTCCTTTGGTCCGAAAAGTACCGAATATCA
-TAATAAAACTTTTCAATATTTTTTTGAAATTTTTTTATTCACAGTCAAAA
-AGTGACAATTACTCAGTTTTTGCCACTCATAATTTTGGAAGTCGACCAAA
-ATGTTTTTTCTAGATTTTTTATAATGTAATTTTGTTTTAATTATTTGTAT
-TAAAACATTGTAGGACAAGACAGGGCCGCAACATAAGATATTGCTTTGAA
-TTTCCTCAAAAGCTCATATTTTTCAGAATTTTGGCAATTTGCCAAAACTT
-GGTATTTAAAAATTGTTAGAGATAACTGTATTTAGACAAAACATAGAACA
-TTTGTATTTCAAAATAGTTCAAAATTCTAGTTTTTGAAATTTTGCGGCCA
-GACTGACCCCCACGATGCACCATGACAAATTGCAATTTTTTTTTCAAAAA
-TTGTTTTCCAAAGGGGCGTGTTCCAAACATCTGACCCAAGTTTTCCCGTA
-GTTCTTCTCTCCCCCAGCGGGGTAAACACTGCACTTTACGACTCCGCCCA
-GTGCTTTTTTTTTCGCAGAAACTGAGAGAGAAAGAAACATCTGCGTCTCT
-CTCCCCCAGTACGCTCGTTCCCGCCCCCCACCTCGATCTGCCAGACCACA
-CCGACCTGATTCGAGATTCCTTTTCTTATATGTATATGTTTTTGGAGAGG
-TGATCTTGTTTTTTTTGTTTCTCCTTTGGTTTTGTTCTCTATGCTCTGAA
-CTTTGGTCTCCTACTTTTCTACAGTTTTTTTTTAAATATCCAAATTTTTG
-AAATAGAGGGTTGATCTACATGACCCCCATGCTTAGTCTACTATAATGCT
-ATATCTGATGTTCCTCCGAATGGCCTGGTAGGTGAAGGCTTTTAGCCCAG
-TGAGCCGGCTTACCAAGTCTAGGACCATGGTTCTTACAACTTAAGGCCCA
-AAAAAAGCAGGCATCTGGCCTAACTTCCCCCTCACTAAATCTGTAGTAAT
-ATATAATTTCTATCATACTCCATCTTTTTTTTCTACCTCTTATCATGTTG
-TTATTGAGCAGCAACGCCCTTATATTGTTTGGTATATATATTTGATATAA
-AACCTCGTAGTAAATTTTATTTTACACAACAACATTTATTATTTACTTTT
-TTCATACTATTTTTTTTTTGCAGAACGAAAAAAAAATGCTATTCACAATT
-GAGCAACTGGAGCTCATCAAAAAGCTGCAGCACACCGGGATGTCATCCGA
-TCAGTTGCTCAAGGCTTTCGGCGAGCTGGAAGTTCCAGAGCAGCTTCAGA
-ATAACAACACAATTGCCGCAGCCCTGTACAGCCCACTCCTGGTCCAACAT
-CTCACAACACCCAAATCAGAGACTCCAGTCAAACTCACCGTGCAGACAGT
-GCCGACACCTGTGAAGTCAGAGCCACAATCTTCAAATTGCTCATCACCAT
-TTGAGCATCCGATATGCTCGAATGCTCCGCGGCCGATTAGGAGTCAGCGA
-ACGCCGATGAAGGAGATTACCACACTGGACGATCCGAATGAGCTGGAGGA
-GTTTATGAAGCAGGGCGAGGAGGCGTGCATTTTGGATATGAAGACGTTCA
-TCACACAGTACTCGTTGCGGCAGACTACGGTAGCAATGATGACAGGTTAG
-TTCCCAAAAAAGTGTAGTGGAAGAGTTTTTTTTCTAAAATCTAGGCCGTG
-ACCAGAAATAAATCAGAATACATCCCCGGCGCCTAGATTCCTAATCTCTG
-CTGTTAGCCACAGTGCAATTGAGTATTACTGTAGTTGATTCCTTCTATGA
-CGTCATATGAAATAAAGTTGGCTAAAGGGAAAAGGGGACTCTGGATCTTA
-GGCGAGCAATTCTCTGCAGCCGGCACCAGAATCGATCCCCCGGTGCCTGG
-ATATCTATCCTTCGCTGTTAGCCACTGCGATATGCCCCACCCGCGCTGAG
-ATCGAACCGAGGCGTCTGAATTCCTAGGCGAAGTTGCTACCCACTGCGCC
-ATGTCAATCTTCTAAATTTCCAGGAGTAAGCCAGCCGTACATTTCAAAAT
-TGCTCAACGGCAACCACCGTGAACTATCGCTCCGTTGCCGTAAGAACATC
-TACTGTTGGTACCTGAACTGCCGACGTCATCCCAACAAACTCGCTGCCTT
-CCTCGCCGATCCGACAACTCGCCTCGAGACGAATGGAGATGGCGAGCTGA
-TCCCACAACGTCGAGAACGCTACGTGTTTCGTCCAATTCTGATCCGAATG
-CTCGAATCGTTCTTCACACAAACGCCATTCCCAGATCTTCCACGGCGAGT
-CGAAATAGCGAATGCTTGCAATCACGTTCTGAAGATGGATAAGAAAGGTG
-TTGGGTTGATGCCAAAGGAGGTGGTCAGCCCTCAAGTCGTTTCGAATTGG
-TTTGCAAATAAGCGGAAGGAGTTGAGAAGAAGATCCGCTGAAGCTTCGGC
-CGCCTCCACCTCGTCCGCTTCGTCTTCTGCGTCATCGACTGCTAATCATG
-ATTCTGTCAGTGTGTCCAGCATGAGCCCTCGCGATGAAGAGGTGAGAGTT
-TTAATTTCTCGGCCACGCTGTACTCTGGGTGGAAGAATTTTTTCTAGGTC
-TTATAAGGAATCGCCCTCCGGTTTTCCCACAAGTTAAGTCATAAACATGT
-ACCATCTAGAGGTTAAATTTCTGGAGTTTTATTTATTTGAGAGTGATGGT
-AAACCTGTCAGTCCTTGGCAAACATGTGTCTGTTTGGTCTCAAGGTCTAG
-GTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTAGGTCTTGGT
-CTAGGTCTAGGTCTAGGTCTAGGTCTTGGTCTAGGTCTAGTTCTAGGTCT
-AGGTCTAGGTTTAGATCTAGGTCTAAGTCTAGACACAAATTTCTAGGCCA
-CGAAAATTTCTGCCGTGGCCTAGGATTTTTTAGGCCATATTCTAGGCCAT
-GATCCAAAAAAAACTTTCCCTGTCTCCTCTAACCCATTTTTTTTGCAGAC
-AAGCTCCCGTAACACAACCCCGGAGACAGCAATCTCCCCGTCACCAGCAG
-TGTCCACTTTTGAAGTGTCCCGCCCGTCTGCCATCATCTCTGCCACGTCA
-TCAACAACCTCGCCAATCTCAATTCCAGCAACAATCATTCCATCAGTATC
-GCCGTCAGCTCTCGAACTTTTCGCCATGGCCCAACAGCTTGGAGTTCAGC
-TTCCGGTTCCATTTCCAACATTGCCAACACACTTTTTCCCGTTTCAAATG
-GCTCCGTTCTACGGGAACCCGGCTTCTATTTTGAAGTCTGAGTGAAGCAT
-TTCTAATTTTCTTTTCTTCTTTTCTACACCAATATCTTTTTTCCATTTAT
-TCAACTTATTCTTCATCCCATGACACGAAAACCTCAATTCTTTCATATTA
-CAAACGATGCTCCGTTTCTTACGCCCTGCCCCACACACGCCCCGTCGTCC
-AAAAATCAATCAATAATCGATTTTTCATAATATTTAATTTGTTTTTTTTG
-TGTTTCACTGCTGTTTTAATATTTGAAAAGTACGAGTTTCTTCAAAAACA
-TTTTTTGAATAATATTTGCTTCACACTCCACGCGTTTCGTAATGTATCGC
-TTGCCCTGAAATTTTGTTGGAAATTCCATTTTTTGTGCAATTTTTGTTAT
-TTTTCAAGCGAGAATAAATATTTTCTAGTTCTAGAATTCAATGAAATACT
-TTGCAAACGCGCCCCATTGCACTTGACCGAGGGGTGAAACAAGTTCAGTG
-TTTTCAAGATATTTTTTTTTAAAAACTTGAATTTGGAACAATACAAAAAT
-CTGTAAAATGCAACAGTTTTCCAAATCTTGTCCACGTGGAGTACACAATA
-ATTTTTCATCTATACGGAAAGATTTCAAAATTGGAATGTTAAATTATTTT
-GTGGTTTCTAGGCCATGGGAAAACTAGGCCATCAAAAAAATTCCAGAGTG
-ACCTGGAAGTTCTAAAACTTTGTTGAAACTTGTCCACGCGGAGTACACTG
-GTAGTTTATCAATAGAGCGCAAGTAATAATCCCTTGGAATTTTCCTTTCA
-CCACCCCCTCTCCATTTTATATGAGAGTTTTTTCCCTCGCAATTTCCCAC
-GCTCAAGAGGGTGGCCGCCATTTTTTTTTTGAGGGGGGTCGTATCTAGAT
-TTGAAACACGTCATTTATGCTCAAAATGTGCCAATTTTTATTGTTTTTGA
-GTTTCTAGGCCATTTTGGTAAGTTAGGCCGCATACTGACTTTGCGACTTC
-CAAGGATATGGCCTAGCTTTTTTTTCTAGGCCATATAATTTTTTGAGTTG
-CAACTGTGGCCAATGTTTTTTTTGGGTTTCTATGCCACTTGTGAAAAGTT
-AGGTCATAGAATAACCTTACGGTAAACGGGTCCTCACAATCAGGAATTGT
-GGCCTAGTTATTTTCCTAGACCACGTTTGATTTTTGTCTTTCTAAGCCAG
-GTTTGGGTCTAGCTCTAGACCTAGGTCTAGTTATAGGTTTAGGTCTATGT
-CTAGGTCTAGATCTAGTTCTCTCACGTGAGAAAATTAGGCCACCTTTCCC
-CCTAAACTCTATGATCTCAAAACTAAAACTACTTTCTAGAAAACTCTTCG
-AAAATCATAAAACCAATTTTTTATCACTATTTTCATGCTAAAATCCAATC
-AGAAATTGATCAGAAACACGCATATAAATATTACGACTATAAATTCATTT
-CTTTTTTTCATTTTTCCCTCCAGAAGGCTCTTGGCGAGAAAAATCTGCAT
-ATTTTTTCTACTTATATGTGTCGAGACATGTGATATTCCGGCCGGCGGTG
-GCTCTGAATGAATATTCAATTGAACGAGAAATATATATTCTCTCCAGAAG
-GCGTTTATATTATGTGTTGCTCCTGTTTCTGCTGTATTCGGCGTGGATTT
-GGTATGCTTCTCAGTGGAGTGCAGTTGCAGCATTTTTTTTCTTCAAATTT
-TGCAATACTCTCGAACTTTTTGCACTTTCAAGCCTTTTTTTGGGTTGCCT
-AGAACACTAGAATTTCTGGACTATTTTGAGATTTCTAGGCCATTCTTGAG
-ATTTCTAGGTCATATTGTGATTTCTAGTGCATTTTTGGGTTTCAAGGCCG
-AATTGGAAGTTTTAGGCCATTTTTCGGTCACATTTTTAGGCCACTTTGAG
-GATCTTGTGCCAAACTGGGATTTCTAGGCCATCATGGGATTTTTAGGCCA
-ATTTCGAGTTTTCCAATCATAATATAATTTCTAGGCTATCTTGAAATTCC
-TAAGCCAGTTTGGAATAATTAGGCCATCTTGGGATTTCTACGCCATTCTC
-GGATTTCTAGGTTAAACTGGAAATTTTAGAATTTTGGGGTTTTAGGTCAT
-ACTGCGAATTTTAGTCCACGGTTGGATTTATAGGCTATCGTGGGATATCT
-AGGCCGATTATGGAATCCTAGGCCAACTTAAAATTTCTAGGCCATTTCGG
-GATTTCTAGGCCATCACGCCTCCTAAAAGGCACAGACAAAGTTCAAAACC
-CACCAGAAAAAAGTGTGGTGAATTAGTCAGCAACACCCCATTTTTCTTTT
-CCAAAAACTAAAAAAAAAGATACCCCTGACAGATATGGGCAGAGATGGGG
-GTGCGAATCCTGAAATTTCCGAATTCCAGTGGGAGCTTTTTGTGCCAGAA
-AAAGTAGTGGGGGCAAGTGAGAATGTGTGTCGCCTTCCACTTTTCAAACA
-CCATTTTGTCCGTTTCGCCGGCCCGAAAATAGGCTTGAAAAGCTGTGGCC
-TAGAATTTTTTCTCAAAATTTTTGACGTGGAAGAATTTTAAGATTTTCGA
-GGCCAAGAGGTGGCCTAGAATTCAACATTTATTGGCAATTCTTATCTAGA
-TCCCGAACCCCGACCAGTCAGTTTTTAATTTCCGGTGTCTGAATTTTTAA
-TTAAAAATTATTTTTGGGAGGAGCTCCTGTTTTTTTTTCGTCAAAAAATG
-AAGGTGGCCTAGCTTTCTCATTTTAAGGCCACGAATTCTAGTTAATTTTT
-TGTTGGCTCATTTTTTGTTTCAAAAAACGAAAGTTAGTCAAAAACTTTTC
-TGCATATCAAATGCTCTTTTTGAGGTTTTTTCCTGCAAAATTTTTCTAAG
-AAAATTTGAATTCCCGCCAAAATTTTTCTCAGAAAATTTGAATCGCCGCC
-AAAATTTTTCTCTGAAAATTTGAATCGCCGCCAAAATTTTTCTCAGAAAA
-TTTGAATTCCTGCCAAAGTTTTCACAATGGGTCTCACCACGAATGGTGAC
-AGACCCCGCCCACAATTCTCAGAGACATTGGGTGTGTTTTAGACCAAAAA
-AATAGTTTTTTTGACAAAAACAATTTTCCAGCAAATACTTGATCAGTTGT
-CATTTGTCTGTTGAAAGTGGAAAAAATAAAACATCTTTCCTTTTTTCTGC
-TTCTCCCCCTCCTCGTCCTTTTTGTGCTCAAAACTCAAATGGCTCATCTC
-AATTGCATGACAAATTAGCAAAAGATGAGAGCAATTTTTCCCTGTTTCTC
-TTTTTTTTCCTCCGTTTGGCTCCTCCTCATGTCTTTTTTAGTAGTTTTCA
-GAGTTTTACTATTGAATGTTCAAACTGGCTAAAAAATTTTGATTTTTTTT
-TCTTTTTAAACTCTTACGAAAATTTTGATATAGGTTAGAAGCCTAAAATC
-GACGGCCGACAGCGTTTACATTTGTGGCCTAGACTTCCAAGCCTTGGCCA
-TGGCAAAAACTTGTTTAGCCTACCTTTTCAAATAGTGGCCTAAAAACCCT
-ATACTATTTCTGAACTAACTGTTTACTCAAAAGAGAAAGTTAGTGGCCTA
-ACTTTCTGAATGGTGGCCTAGAAAACTCAATTTTGGCACTTTCATGACCG
-GTCATCAACCTGACATTGATGGCCTAAGTTTTAATGAGTGGCCTAGAAAA
-CCAAAATATGGCCATGCGCTCAGCATGATCTAACTTTCCAACTCTGCTAT
-AAATTCCTTGGGGGAAACCTCGGCCATCACGGGTGGCCTAGAAAACTGAA
-ATTCGGCCAAGACCCCGTAATTCATGGCCTAACCTTTTAAAAGGACAGCG
-TTTGGCTTTGGTGGCCTAGTTTTTTGTGGCCTAAGTTTACAGAAAAAATC
-CTCAGCCACAACCTTTACCCTATACATGAAATCACATAAAAATGTCCAAA
-TATTTTCCAATTAAATTTCCAATTCTCCACCCTTAATTCTTCATTTTCTT
-TTCTTCTTTTATTCCTTTTTCACTCTCTCATTCTGAAACTAATCTTTTCA
-ATTCTCAGCTTCTCTTTTCTGGTGTGGCTCATTTTCACTTTGCTCCCGCC
-ATTTTCAATAGGATTATCCGTGCACACACACACATGGCTCAGTGAGCAAC
-ACCAACAAAAAAGAGCATATATAGATATACAACGATATCTAACTAGTTAC
-ACAGGAGCTTCTGTTGTTCTTCTGTGCCCCTCCGAGCCGAGACAAACTTT
-TGGAAAAGAGCAACGCTTCTGGAGCCGACATATTCGAGAAATCCCGGAGA
-CAATTGAGACCACTATGAGGAAATGATGGTCGAGGAGGAAATGAGAGATG
-GCGTTGCTCAAAGTGCGCGACGAATGCACCAAGTTGGTCGGTTATCAGTG
-AGTTTTTGTTTTTTGTTGGCCGAAGTAGAGATAACTAGGCCACCTAGGTA
-GGCTGACGATCTTCAGTTTGCAAATCCTCTTCCACCGCACTTTTTTGAGC
-GATCTAGGTTTGCAAAAGGTAGGCCGCCTGGTCCACCGTACCTGTCATGA
-TGGCAGAGGTCTGGGAAAGCTAGGCCACCTGTCTGAGCTGATGGTCTAAG
-GTCTAAAGTTTACCAAAAACTCTTCCACCGAAACTTCTAGGGCGACCAAG
-GCTTGCAGAAGCTAGGCCACCAGACTTGGCTGGTGGCCTAGAATTTTCAA
-GAACTCTTCCATCGTAAATTATTAGAAAGCCGCGATAGGAAAAAGCTAGG
-CCATCAAATTACCTTAGTGGCCCAGAATCTATAAAAACTCTCCCATCGTA
-CTTGCAAGGACGGCTGAGCTTGGAGGAAGCTAGGCCACCAGAATAGGCCA
-GTGGCCTAGAATCAACAAAAACTCTTCCACCGTACCTCCTACAATGGCCG
-AGGTAGGGAAAGATGGGCGCCAGGCTAATCTAACTTTCCTAGACTGACCT
-AAATGGGAGAAAACTAGGCCACCGGGTTTACGGAGTGGCCGAAAATTTAC
-AGAGACATTGCCCTGACTATCTGACTGTTTTTTTAGCGAAAGAACTTTCA
-TATTTTCTAGGCCAGGGGCCCCCTACGCCCCAACACAATCCAATTTTTTT
-TTGCAGATTTCTAAACTCGCACATTTGTCTCTGCATATCACTCATCCAAC
-TTCTCGTCTGCTGCTGGGCCGTTGCTCAGCACGTCAACTCCTACATGACG
-CACAGTAAGGTGAGCCAGAGTTCATTGGAGCGAATTTGTAACCAGAGAAA
-ATTCAAAACTTAAAATTCAGATCTTAAAATGTGATTTTCTGGAGGGGAGC
-CTCCCGCTGGAGGCCGTGGACGCTGTAATTTTCGATATCCGACTTTTCCA
-TTACCTATGGGGCATTCGAGGATGTGTGGCAGAGTATTTGGATGGTGGTG
-GGTACTTTTAAGTTTCCCACGAATCTTTACATTTTTCAGGCTTCGGGCGA
-CTTTTGTGGTGCGTTTCCCACTGCTTAACCCTGGTTTTCTCCATTCCGGT
-CACCTTCATCTCCCATCCGAAACCCTGTCTCTTTTGGCCGCTGCTTTTTC
-AGGTGAGTTGGCTGAAAAAATTTGGAAAAAAACTTTTTTTAAATTTTTTC
-CGAAAGGCGCAGTGGGATTTTCCACGACTACCACTCACAACAGCATGGTT
-CGAGTCCGCGTGGGTGTGAATTTTTTTTCTAGTTTTTTTTTGAAGTACGG
-AAATTGTATTTAGCCTTGAAAAATTCTAAAATAAGCAAACAAAAAAATCT
-CCGATCAAAAACCAAGTAATCCGTCTCCAAAAAGCGCAGCAACGTCAAAT
-GGTCCCACGGGGGGCCTGAAACGACAAATTTCCTGACATTTGACGGGTTA
-TCCATCCGCCACCCTCTCTTTTGAAGGAACATTGACTTTTTCCGTTGAAA
-TGGATAAAAAAATTGAAAAGAATTAGATAGATTCGGGAGAATGAATATGG
-TGGCCTAACGTGGTGCTTGACCCATGGCCTAGAAAACCAAAACTCGGTCA
-TCACCCTGATTGAGTGCCCCTTAAGAGATTAGGCCACGTACGACGCAATC
-CTAGGCCACCAATAGTTTTCTCGGCCACAGCCACCCCAAACAAAAATCTG
-AACTTTCTGATCCTTTACATCTGTACCCACTGAACCGTTTGTTTATCTTT
-TTACTCGCTCCACGGGAGCAGAACTTTTTTTTTGAAATTCCACAAAAGAA
-TGGGACAGACACTAGTGTATTTTGTTTTTTATTCAGACATGAGCCAGACC
-AGAAATAGGATTGAATCTCGGATTTCAGAGCCTGGAAAAAATCGGAAAAA
-ATCGGAAAACTGTGGGAGAACTGAGTTGGGTGGTAAATTTGGCAAATTGC
-CAAAATTTGGGGAAATTAACTTTTTCGGTAATCTGTAACTACAGTTTTCC
-TAAAAATGTATGAACCTTTTAGTGATTCTGCATAGTTTTTCAGGTCTTTA
-AAATTGAACCTACAGTACCCCGTACAGTTCAGAAGATTGCAAAATTCCAA
-GTTGACCACTTTTAAAGCGTGTATCTCGGCTGATTGGGAAAGTATCGGAA
-TATTTTAAAATACAAATTTATTGTTGGAAAATTTTTTTTTTACTTAAAAT
-TAATTAAAATTCAGCTTTCAAAAATGAGCAATGTATTTATAGATCCCATG
-CAACTTTGAAATTTTGTATATCCGTTCAGTGTAATGCTATCAAAAAATTT
-TCAACTACAAAATTATAGTAAAATTTAAAACAAAGAAATTGTTAGTTGAC
-AACTTTTTAATGAAATAAAGTACAACCGAGATATGAGTTCTCAAAGTTGA
-GCTACTTTATCGGCAACCACAATATAAGTCGCCCCCGTACAATGCACCAT
-GTGGTAGAAAATTTCGGTTTGATCTACTTAGATCTACAAAAAATGCGGGA
-GAAGAGACGCAGAGTTTTCTTTGCATAGCTAAGAACGTGCTGACGTCACA
-TTTTGTTGGGCAAAAAATTCCCGCACTTTTTTGTAGATCAAACCGTCGTG
-GGACAAACTGGTACCTCTTCGTTTTGTTGGTATGAAAATTTTGAAACTCA
-CTTCGTTTTGTTGGTATGAAAATTTTAAACTAGAAAAGCCAAAGTTGAGC
-TAGGCGCTCAAATTTGGTAGCATTTACTTTTTTCAACAAAAAAATAGCTG
-GCCGAGCTTTCCATTTTTACGGCCACGTTGCAATAAAAATCCAGGAGGTC
-CATGTCATCAACAAAAGTGCAAGGATGTAAAACAATTACACCGAAACGTT
-TGTCGGGAACTGCTTTTTCAAAAAAAAAAGGATCTCTCCGAACACATGTC
-ACCCCCAGGGTTCTAGCGTCTCCCTGACCTCGCGAGCTATTTCCTTGAGA
-CATATCTCTCCGAAACCTTTTGTAATGGTTGTTTCATGTTCTTCTTCATC
-TTCTTCTTATTCTTCTTGCTGGGATAAGCAGTTGAAGAAAACGAAAAGAA
-CACATAAAACACAGGCACACACACACACACATACACACCGTAATATCATA
-TAAAAGTGCGTCTGCGTCTCCCAGAGCGCCCTGGGGGTAAGGAACGCGGG
-CGCCCGCAAGGAAAAAGTGCAAAGAAATTAGAGAAAAAAGACCGGTCTCT
-CACTCACTTCTCGATCCCTTTTCTTCTCTAACTATAAAAAATGTGTGGCC
-TAACGAACGAAAGCGAAAAAAATCATCGAGAGAAGTAGTGAGAGAGAGAG
-AGAAGAAAGAGTTTTTTTGGACGCCGCCGCAGCTGCCAAGCATCAATAAT
-GACATGCTGGAGAAAAAAATTCCAAAGTTTAAATGTATTGGGGATCAGAA
-GCCTAGACCATAAGCCCCTTGTAGAGTTTTCTCGGCCATAGCCTTTTTGG
-TACGGTACATATACATAGAGACTTCAGATTGGGAATTGCGAATCTGTTAG
-AGTAAGAATAGGCCTAAAACATTATTGGGCCTAACGGTGACGGAGACTAG
-GCCTTGTTGGGAGCTTAAACTATGACATTGCCTAGAACGTTGTTCTATCT
-TGGTTATGTGGTGTCGGGCTTTCATGATCAGCTCCTCTACTTTTGTCCAG
-AGAAGTTTTGGACTTTTTCTATGGGTGCTTTGGGCTCTATTGCACAAATA
-GGTGATCTTGCGCACAACACAACGTAGATCAAATTCTTGTCTAGGCTCTG
-CAGGCTCCTGAGAGGTGTTTTGTACAAGCCCAAAGCAAAAGGATCTCAAA
-ATGTTTACAGGACTTCAAGCAGAGGATTTTTCGATGATTGCCAAAAATTT
-TGGAACTTTTATAGGCTTAAGCTTATGGTTATGTTTAGGCGTAGGCTTAG
-GCTTAGGCGTAGGTTTAGGCTTTGGCTTAGGCCTATGCTAGGCCTAGTAC
-CATAATACTATTCTTACCGCCGCGCCTGATCAAACCAAAGAGTAGGTCAA
-CAACCAATATTGACTTGCACTTTTTGCACGGTTAACTATATTACGCATAT
-GGCCAATTTTGTTAGGGAGCATTGATTCATGGAAAAAATTTCGGAATTTA
-TGAATGTTCAATTAAACTGGACTACGACAATTATTGGGTTCAAACATTTG
-AAAATTTTTTGGCCGACGTCGGAACGTCTCACTTTTTCCTGATTTTTGTA
-GTTTTTCCTTTTTACCGAATTTTTAGGAATATCTGGGAATTTCTCGTTTT
-CTGATTTTTTTTCAATTGTTTTTAGATCCCCCAAGCCTAAGCCTAAGCCT
-AAGTTTGAGCATAAGCATAAGCCTAAGCCTATGCCTAAGCCTACGCCTCA
-GCCTAAGCCAAATGCGGAGCCTAAGCCTAAGCCTAAGTCTAAGTCTAAGT
-CTAAGTCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTGCCGGAGCCTAA
-GTATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTATGCCTAAGC
-CTAAGCCGATGCCTAAGCCTAAGCAAGTTCCGACATTTTCGACAATTATC
-TAAAAATCCTCTGCTTGAAGTCCTGAAAATCTTTAGGGATCCTCAAGTTT
-CGAGTTTGTACGGAACGGCCCAAACGCCTCTTGGGAGCCTGCAGAGCCTA
-GACAAGAATTTGATCTATGTTGTGTTGTGTACAAGGTCACCGGTTTGTTG
-TGCATCAGAGCCCAGAGCACCCACAGAAAAAAGTCCAAGAGTGTATAGCC
-TACGGTAGTCCTTGTTTAGGAGACATAGACAGTCTCTTTCTCTAACGGTT
-TTTGTTTATTCTTTTTTTTTCTCCCCCTACTTTCCGACAGACATTTTCAT
-CTTCATCTCCTTCTGCTGCGCGAATTGAATGGTCTATAAGTGTCTGCGTC
-TCGCCGATTCGTACAGTCTATCGCTTTGAAATCGTCACCCCCAGGCAAAC
-AGGACACCCGAACACACACACAACTATCCTCATTCTCAAAAAAATGGCTT
-CACTGCATAAAAGTGCAGAAATTAGAGAGTATGCGGAGATTCGGAGAATC
-CAGAGAGAACACACAAACACACTCGGAAACTCATATAGTTAGACCAGAAT
-GATGGCTTTTTTGGAAATTTGAATTGGAAAGGGGTTTTTGAAAATTGGTT
-GGAAGCATTTCAGATAGATTTACATTGAAAAAAATTAGCAGGAGCACCTT
-TTCCATTTTAAAAAAATTTGTTGGCTTTAACTTTTTTCACGGATTTCCGG
-CTTCCCTCATAAATTGAAATGGAAGAGTTTTTGCCGAACTAGGCCATTTT
-GGCTCAGCCATATCTGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGC
-GGCTCGTTTTTAGTTGTAAAACTAAATTTATTTGTCCGTGTGGAGTACAC
-AACTTTCCCACGCGTTGTCCATCTGAAGATTGTCAATGGAGCGCGAAAAA
-TTCAGTGAGGAAGGCAAGAACTCCGTTTTTTTTCAATACTGAAAAGTCTA
-ATATTGAATTAATAAATTATTCAAACATTTAAAAACAATCATTTTTAGTG
-TTTTGAATTTTTTTTTAATTTCAAATTTTTCTTTAAAACATTAAAATTTT
-AAAAACATTTCCAAATTGTTCCAAATAACATTATTGAACTCGTAAAACAA
-ATTTAAAGGTGAATTTTCATTTATTTCGTTAAAAAATTACCTTTTAAAAT
-TTATTTTTTCAAAAAAATCTGGATTTTTTTTCTGCGATAATATTCGAGCA
-GTTTTTTTCGATTTTTTTTCTGAAATTCTGTGAAATTATTAACATTATTT
-GAATTAATTATTCAAACAATTTCAAACAGAAATACAACGAGTTTTTCCAT
-TTTTTATCATTTTCCAAAGTTTCAGAAAAAAATTTCGCAAAAAAAATTTA
-GATTTTTCCAAAAAAATTAAATTTTTGAAAAATTCTCAAACGCACGGATT
-TCTGGCTTCCTTCATAAATTGAAATGGAAGAGTTTGCCGAACTAGGCCAC
-TTTGGCTCTGCCATATCTGGGGTAGATTTACGGTGCGTTGCGTGTCGCGT
-CGCGGCTCGATTTTAGTTGTAAAACTGAATGTATTTGTCCGTGTGGAGTA
-TACGACTTCCCCTCCGACAGGCGATTATCAATGAAGCGCGAAAAATTCAG
-TGAAGAAGGCCAGAACCCAAAGTTTCACCGAAAAATTCGAAATAAAAAAT
-CCTGAAAAATTTTTTAATTTTTCCATAAAAATTAAAAATTTTTAAAAAAT
-TCCCAAATTGTTCCCAAGACACATTTCAGAGCAGGTTTCAAAAAATCATA
-TAAATTATTTATAAGGGTAACAACACAAAATTTGGGTAACAAGAGCAACA
-ATTTTTAATTAAATGTTTCATTTTTCATCAAAATTACTCAATTTTCCTGT
-TTCAGCAATCGGCCTATGGTATTTGCCTCCTGGTTCTTCTTCTAGCAGCT
-CTTCCAAGAATTGTTGTAGTACTTGCGTCTCCACAAGCGGCTCCGTTGAT
-TCCTATTCTGTTTTATCTTGTTGGCACCGCGCTCAATTTTTTTCATGTGA
-GTACTTGCTCACTTTTTTATGGTCTAAAAATTGGCGGGAAATTCAAAAAG
-TTAAGAGTTTCAAAAAGATCGGCATAAAATTTAAATTGAACATTTTTGGG
-GATTTTTTTGGAAAAAAAAACAAATTCGAAATTCGACCCATTTTGGCGGG
-AATTCAAATTCTTTTAAAAATTTCGAAAAACATTTTTCTGCAAAAAAAAA
-TTTTCATTTAAAAAAAAAACATTTTAAAAAGCAAGCTTTGCCGGGAAGAA
-TTCAAAAAATGTGGCTGGGATTTTGGCGCGAAATTCAAATTATTTTAAAA
-AATTTTTGAGAATTTCTTGAAAAAAAAACTGAAAATAATTTTGCGGAAAT
-TTGAATTCTTTAAAAAATGCCAAAAAAAAAAGATGTTTGTGCAGAAAAAA
-TTTTAATTTTTAAAAAGCAATTTTTCACGGATTTCTGGCTTCCCTCATAA
-ATTGAAATGGAAGAGTCTGCCGAACTAGGCCATTTTGGCTCTGCCATATC
-TGGGGTAGATTTACGGCGCGTTGCGTGTCGCGTCGCGGCTAGATTTCAGT
-TGTAAAACTAAATATATTTGTCCGTGTGGAGTACACGACTTTCCCTCCGA
-CAGGCGATTATCAATGAAGCGCGAAAAATGCGAAGAGGAATCTGTTCTAA
-AATTAGGCGGGAAATTCAAAAAGTTCAGGGTTTCAAAAAGATCGGCGAGT
-TTCAAAAATGTCAAAAATATTTTTCTGCAGAAAAATTGTCGACTTTTTAA
-TAAACTTTGCCGGAAAGAACACGTGGTGTCAGAGTGTCCGGTTTGATCTA
-CGTAGATCTACAAAAAATGCGGGAGTTGAGAAGCAGAGTTTTCAACTGAT
-TTCGAATGGTTAAGAACGTGCTGACGTCACATTTTTTGGGCGAAAAATTC
-CCGCATTTTTCGTAGATCAAACTGTAATAGGACAGCCTGACACCAAGTGG
-AAGAATTCAAAAAATGTCGCTGGAATTTTGGCGCCAAATTCAAATTACCA
-AACGGTATTTAATACATAGAGCTTCTCACTCAACATCTGAGCTACCGGAA
-ATTAACAACCTTCACATTTTTTGGTCATTACTCACACACATGTGGTTTCT
-AAGCAAGTTTCAGATACTTTTTTTTTTGTTTTTTTTTGAATTAATACTAT
-TTTTTGCAAAAGTCGCTTCGGGACCCAAAAAAAAAATTCAAATTCTTTTC
-AGTTATACGTGTACTGGCACTGGTATTGGCACGTGAGTGCCATGTGGAAT
-TCGGTGGTCCGTGTAAAGTTCGGACAGCGGCTCGAAAACGCGAATAAGCG
-AAGTCGACGGGATAAGCCGATTGTGCCGAAGGAGGAGATCGATGATGCCG
-TTTTGCATTACGTGCCAGCGAATAAGCCAACTGAACAGCAGAATCATGTT
-CAGCACAATCATATCAGTCAAAACGGGATTCAGCAACCAAAGGTAGGTCT
-ACCTACCTGCCTATTTTCCTGCCTACTCGCCTAAGTTTGTCTAAAATCCA
-ACTGCTTGTCTGTTCTGCATACCAATATGCCTAGACATACCCACATTTCT
-GCTCATCTTCTAACATGCCTGCTCGCCTAACTTAATGCTGTATGCCTATG
-TACTAGGTTACTGCCAGCCTGCCTACTTGCCTACCTACACAAATGCCTAT
-CTGACTACATCTATATCTATGCTTCTCTATGCATAAATGCCTGCCAAAAT
-GGCTAACTGCGTGTCAAAGTTCATGCATGCCTGCCTACCTGCCTACGTGC
-GTACATGCCTATTTGCTTACCTAAATGATTACCTGCTTACCTACCTGTCT
-ACCTGCTTAAGAGCCCTACTTATTTGCCTACCCACCTGACTGCGTGTCTC
-CTCTCTTTCTGCCAATCTAGGCCTACATGTCTATCTAGGCCTATATAAAT
-TCCTACCTGCCTACCTGCCTAAATACCTACTTGCCTGGCTATGTCTTCTT
-ACCAACCGTTTTTTTATGCCTACGTACCTGCGCGCATGCCTACCTACGTG
-CCTACCAACACCTACAAATACCTGTCCGCCTTCATCACATTTTTCACTTT
-CAGGTAATCCTTCCACCACCGAACCCCTACAACACCGCGCCCACACATTA
-TCGACGCCGATCCTCCACAGAAGCCCACCGCTACCACCCACCTCGGCAAC
-CGAGAAGCTCGGCGCCAACCCACCACCGAGTACCGGCCGACTATCCGAGT
-GACGAGGAAGACGACTATGATGATACGGAAGGAGACGACGCGGATATTGA
-TGATCTACCCACACCGCCACCGCCGATTTACGCCGTCCGCCTGACCTCCG
-ATTCGTGGGAGAATCAGATGAGCCGCCCGTCGGGTAGACGGCGGTTACCG
-GCGACTCCGAATTTGCCGAAACATGGAGAATTGCCGCAGATATTTAATAT
-TCCTCATGCTAATGTTTAATCAAATTTTTGGGGTTTTATGGGTTTTGGAT
-TTTCGGAGCGGAGCTTCATTTATCGCTTTAATATTGAATCAGGGGTGGTT
-TTCAATTCTGGCAATTTGCCGGTTTGCCGATTTGCCGGAAAATTTAATTT
-TCGGCAAATTGCCGATTTGCTGTTTGCGGGATATCAGATTTTCCGAAAAT
-GTTTAGAGGGATTTTTTATAAGACGAAAACACTAAAAACTGTGTCTTTTT
-GAATTTTTTCCACTTTTTCTACATATTTTCATAGAATTTGCTTACTTTTC
-AAATTGCCGATTTGCCGGAAATTTTTAATTCCGCCAATTTGCCGATTTGC
-CGTAAAAAATCGTTTGCCGCCCACCCCTGTATTGAATTATCCGGAACACA
-GCAACACTCTGAAATTCGAGCATTAGTTAAATGTGATATTTGAAAAGTTT
-TGCAAACAAAATAATTTTCCCCAGCTTTCATCATTTTTTCTTTCAACAAA
-AAAAAACCGAGTGATATTATGATTTCCAATTTGTGCTATTTTGAGTTTTA
-TTTTATTTTATTTTGTTGTTTTCAATAAATAAACGAATATTTTTTGGTCA
-TTTTTTGGCGCTATGAAACTAAAAAATTTCAGGTAACTTAGCGGGAAGTT
-CGTTTTTTTTTCATTTTGGCAGGAAATTTCATTTTATAAAATGGCAAAAA
-CTTTTCGTTAAAAGTTTTTAAATTTTGAGAAAATTGACGAGAAATTAAAA
-ATTTCAAATTTTTTGGCTCTAAATTAGGATTATAATTTTCCGAAAAAAAA
-TTTCCGAATTAAAATTTGGCGTCTCAGTGTGTTATTCAATTAGAAAAACC
-TTCAAAATATTAAGACATTTCGGAGGCACGTGGTGTCAGAGTGTCTATGC
-TCCTTTAAATGATGCATTCAAAGGCGCTTACACACCTGCACGTAATCTCT
-TTTTTGTCTCAAAACAAAAGGAGCTTCAGACTCTCATATCTCTGCAACTC
-TGTGTGAATAACAATTGGAGCCCCAGAGCTCCCGGCTCCACACTGCCCGT
-TTCCATGGAGACACTCCGATTATTATGGGAGCCACCACTGCTCGCCGAGC
-AGCAGCAGCAGCAGCCCATTGTTAACCCGATGACCAATATCTATATTTGG
-GTCCGGACCGCCCGTTCCCTTCAGTTTTTTTATCCGACTATCGATGTGGA
-GGCCGATGGGTTCGGTTGCTTCTATGAGATTTGTTTGGAAATTGTTGGCT
-TGTTGGAGGAGTGCGATAGGATAAGGTAAGCGTGCTCTATTGATAACACG
-AATTTTTGTGATTTTCGGCAACATGGGATCGTGGTTGCCCAAAGGGAAGG
-AAACGCGCCCCATTGATAAAATCATTTCGCAATAGAGCGCATTTTCATCA
-TTTTTTTGCAGTTTTGACGAATTCGAGACCCTCTGCGAGAATAGAATATC
-GGAAGTTTATGTGGAAGCAATTTTTCAAAATGCTGTGGAACAAGGAAATG
-TGAGTTTTTTTGTGATTCTGATGCTAATTTAGCAAGTGCGCTCTATCGAC
-AATTATGACTTTGTGCACGTTCAAGTATTTTCTCAAAGTTTAACACAGGG
-TTCTGGCCTTCCTCATTGAATTTTTCGCGCTCCGTTGACAACGGACAACG
-CGTGGGAAAGTCGTGTACTCCACACGGACAAATCACATTTAGTTTTACAA
-CTAAAATCGAGCCGCGACGCGACACGCAAGGCACCGTAAATCTACCCCAG
-ATATGGCCTGGCCTAGTTCGGCAAAAACTCTTCCATTTCAATTTATGAGG
-GAAGCCAGAAATCCGTGAAGTTTAACAAATTGTGAGGTGTAGCAAACACG
-CTCAAGTGACAATTTTTACTTTATGCGTCATAAATTTTTTTCTGAAACTT
-AGAAAACGCGCTCTATTGCTACTTTGAACGGAAAACGCGCTCTAATGTCA
-ATTTTATTTCCAGATAAACGCCCGCCTAAAGCTTCTCACCTTCTCACTTC
-TCTTCGCAGGTCTCCAACAAAAAACTAAAGATCTCACAAATTCCATCAGG
-TCGGACGTGGTCTTGACACGAATTTCAAAGTATTTTGGTAAATTTGAAGA
-ATAATATTTGTTATTTTTTTGTTTTCCGAACTTTACAGGCCAAATATTCA
-AACTTTTGTTCCAATTAGACGTGGGCCGCCGGTTACAGGACAGAGAAATT
-GTGCACGCCATTGGAAATGGGCAGGTGAGAAGTTCGGCTACAAAAACGTG
-ACGCGTGGCCTAGAAAGATTTGTTTTTCCACAGCTTTTTCCACAGCTTCC
-ACAGCTAACGGGATGGCCTAAAAAACTCCACGGTCGTTTAGCGATAGAGC
-GCACTTGCACATTTTGGGAATCTTCTGGAAGAAAGTAAACGTCACAAAAG
-GCCTAGAAATCTTTATCGTGTGTGGTTTAAGAAACAATTCTCGGCTTTGA
-AATTATGGTTGCTCGGGGAAAAATGATTGTTAGAAGCCGCACGCTTGCAC
-GCTTGCACAGCTTGGGAATTTTCTGGAAAAGAAGTGACGTCACTGGTGGC
-CTGTAAATTTTCGCCATGTGTGAATTAACAAAACAATTATGGGCTTTGAA
-ATTATCGATTTTCACGGATTTTTGGCTTCCCTCATAAATTGAAATGGAAG
-AGTTTTTGCCGAACTGGGCCATTTTGGCTCGGCCATATCTGGGGTAGATT
-TACGGCGCGTTGCGTGTCGCGTCGCGGCTCGATTTTAGTTGTAAAACTAA
-ATTTATTTGTCCGTGTGGAGTACACAACTTTCCCACGCGTTGTCCGGCGG
-GCGATTGTCAATGGAGCGCAGAAAATGCAATGAGGAAGGCCAGACCACGT
-GAAAATCAATAAGTTTTTCAGCAAAAAATGAAAAATGAGGAAATTTCGTT
-AATTTTAGTTTTGTTAGCAGTAGTGCGCGCTCACATAGTTCAAGAATTTT
-TTTTTGAAGAAAAGTGACGTCACAGATGGCCTAGGAATCTCATCTATGAC
-GTCACTTCTCTTCCACTTTATCCTATTTTCAGGGCTATGAATTCCTGGAC
-ACCCTATTTGAGGGAACAGTAAAGCACAGACATGGAAACTCGAACCATCA
-CGGCGTGCGCCCCCTTTCCCATATAATCCCCCAAATTCTCGAAAAAGCGA
-GCAGTATATCCCTACCATTTTTGTGCAATGAAATCCGCCGACACCTTATC
-AAAGACCCGTATCATATTGATGAGTTCTCAACTGACAAACCTGCTCAAAT
-ATTTTCGACGGCTCGCCGAACGACACTGGCACATAATAGTCGACGGGTGG
-TACACTTGCATTATATCAATCGAATTGAAGTGCTGCGGAAGGATGAATTT
-GCGAATGTTCACCTGAGAATTTGTAATGATAAGATTAAGGCGTCGTTCGT
-TTTTGTTCCGTTGAGGTGAGATTTTTTGGCCGAACTTTTTTTTGTTGCTT
-TTTTTGAAAAATTTTTAAGAGATTTCATTTTTTTTTACAATAATAGAAAA
-ATCAGAAAAAATATTCACGAAACCAATAAGTGGGCGGAGCATCAAACTGG
-CACGCTCATTTTCCGTAGATCGTTTCTGCCAAAATCGAAAATTTCTTGAG
-CTTTCTTGAAAAATAACGCTAAATTTAATTGTGAATTTATTATTATCTCG
-AAAAAAATTATCAAACAGTCGAAAAGGGGCGGGCTTACATTTTTTAGCCC
-CGCCCACTTTTAGATTTGTTTTGTTGAAAAATGTCCAAAACTGAGTTTTT
-CTCGGAAAATTTGAATTCCCGCCAAATTTTTTTCCAGAAAATTTGAATTC
-CCGCCAAATTTTTTCCAGAAAATTTGAATTCCCTCCAAATGTTTTTATTT
-TCAGAAAATTTGAATTTCCCGTCAAAATTTTTTTCCCAGAAAATTTGAAT
-TTCCCGCCAAAATTTTCCCAGAAAATTTGAATTCCCGCCAAAATGTTTTC
-CAGAAAATTTGAATTCCCGCCAAAAAAAATTTTCTCAGAAAATTTGAGTT
-TCCCGCCAAAAAATTTTTTTTAAAAGAAAATTTAAATTCCCGCCAAAATG
-TTTTCCAGAAAATTTGAATTCCCGCCAAAATTTTTTCCAGAAAATTTGAG
-TTCCCGCCAAAAATTGTTTTACTGAGAAAATTTGAATCCCCCCCCCCCCC
-CCCCCCCCAAAAAATTGTTTTACTCAGAAAATTTGAATTCCCGCCAAAAA
-TGTTTTTTCTAAGAAAATTTTAATTCCCGCCAAATTTTTTTTTAGAGAAA
-ATTTGAATTCCAGCCAAAATGTTTTCCAGAGAATTTGAATTTCCCTCCAA
-ATTTTTTTTTCTCAGAAAATTTGAATTCCCGAATTTTATTTTTGAAAATT
-TGTGTGAAATTAAATTTTTGGGAATATTCATTGTGGCCTAAGTTGCTCCA
-AATGGAAGAGTTTTTTAAAAATTAATTTCTCGTCCACGCGTCAATTGTAT
-GCAAGAAATTCGAATATTTTCCAGATGTGAAACCGTATTCCTCGACAGAC
-TTATGTACACAAAATGGATAGTTCTTGGCGCAGTACGCGGCATTGTAATT
-GTTAAAAATTGTCAATCGACCCGAATTTCGGTGAGCTGCGACCAGCTGAT
-TGTGCTCGATTCGAAAAATATCGAAATCTACGCCATGTCGCCGAAGAAAC
-CAATAATTTTCAACAGCTCTGCGGTAACTTTTGCCCCATTTAACACGATT
-TACGAGGTGAGTTCGGTGGGGCGCGTTTGCATTTATGAATTCGAAAATTT
->CHROMOSOME_II
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-CCTAAGCCTAAGCCTAAGCCTAAAATAGTGACTCTGGCAGTTCTCTAAAA
-TAAGTGACTCTGGCAGTTCACCAAAAATTGTGACTCTGACCGTTCACCAA
-AAATAGTGACTCTGACCGTTCACCAAAAATAGTGACTCTGACCGTTCACA
-AAAAATAGTGACTCTGACCGTTCACCAAATATAGTGACTCTGACCGTTCA
-CCAAAAATTGTGACAATGACCGTTCACCAAAAATTGTGACTCTGACCGTC
-ACTATTTTTATTGAACTGCCAGAGTCACTATTTTTAGTGAACTTCCAGAG
-TCACAATTTTTAGTGAACTGCCAGAGTCACTATTTTTAGTGAACTGCCAG
-AGTCACTTATTTTGGTGCACTGGGGTGGGTCACGCCCCCAGTTCTCAGTT
-ATGGGTACTCTGATCCACTCGGGACCCACTTTATCGTGTTCCCCGTGCCT
-CATTTACCCTAGAGCTTCCTCCTTTACCTCTCCTCTCGCTATCTCTAACA
-TTCCAATGGAAACTCCTATTTGAATTACCGCCACCGATGTGCCCGACGCG
-ACTTACTGTTAGCCCTTGTTTTGCACAAATCTGTTGGCTTCCATATTTAA
-AAGTTAATTAATGACCCAATGTTCTTTTTTTCTCTAAATCTCCACAAGAT
-GTTCTGTTTTCCCTACTGGACACTATCGTTCACTGCGTCTCACCAATTCA
-CATTGTCTCTACTTTACCTTTTTTGTCATAGTACACGTTCGCCAACGGTG
-TCGACGGCCAAATGCTTTGGGCAGCGTTTGCTTTTTTTATAATTAGTTTT
-ATTTTATTAAAACAATAGCTCTAAAGTTTACAAGTCATTTGTTATAGGCT
-AAATGAGTTATGTCTAATAAGTAATTTGAACTAGATACTTCCGTGTAAGT
-GACAATGTATCGGAAAAGTCCTCAAAGTGCGATGTAGAAGTTCACATGTA
-CTTTGTTTGGCATGTTAGTAAAAGAGCCAGTATGCTGATTCATTTTATAT
-TCTATATACTCATGTAATATGCCCATGTAAGGTTTAATTCCAAAAATATG
-AGCGTGTTCTATTTTATAATATTTTACTAAAATACCTTTCAGTTAATTGC
-ACTCAAATTTGTTGTTCTTCATTCTCTCGTTATGATTTAATCTTATTGCG
-TCAAGGTCATTATTTTAGGTCCATTAGTTATCGATCTGAAACATGTTGTT
-GTATTTTTCTATTCTTGTGAGCTCAGGACACCTCATACAACTCCAGAGAA
-AATGTGTCTCATTATTCTTGTCTTTTTTCAAGATCTAATCAATTTTCTAC
-ATTAACGACGTTTTTGTCGTTCTGCTTCTTTTTTTCGTTCGTTTGTCTCG
-TCCATCAGCTGTCCACTCATTTCTCTCCCACTCACTAGGCAGTGCTTTGT
-TTGGTTCCGATTGGCAGCTGGCTGCAGGGCCTGCATCTCTTCTATGTCTC
-TCATTTACTTGCATTCTTTTCTTCGTTAATTTTTGTTATGATATTTAAAC
-GGGAAGAAGAGTTTGTGGTTCTTCTTTTTATAATCACTAAAACTTTTGGA
-TAAGTAACAATTTTCTGATAAAAATATTTTCACGGCGAAGAAAAAAGAAA
-AAGAAGAGTAGTTTTTGCACGTTTTCATATAATTATTTTCGTTGATCAAA
-TGTTCTTCTGGAGTTTTCTAATAAATTTCTTATCGACTTTTTTTCAGAAA
-TTTTTCTCAACTTGTCATGTCAATGGTAAGAAATGTATCAAATCAGAGCG
-AAAAATTGGAAGTAAGTTCTTTATAATTTCATTTATATACTATAAGTTTT
-CTCGATCACAGGAGAAACAAAAACAACAGACAACACAAAAAACAATAAAA
-CAATATTGCTCTAGTAATCAATAGTGTTGTAAAGAGGGAAGAAAATTGTT
-ATCTGTGTAGCAGTCAACGTTGATTGAGATGTTGTGTTTGACTATAGAGT
-TGAAAATAATAACTTCAAACTTGCAAGTCATGACTTATCAAACACTGCCG
-GAACTTATTCTGGATCAAAGGAAAGTTGTCCAACTGTAGAGTCATGTTTT
-TCAAAAGAAAACACAATTTTTAAGTATAAATATTTTGAAAAAGTATGTTT
-TAGAAGTATGTCAAATTAAAAAAAAAATCCTTGGTTAAAAAATGATTTTT
-TTGGATATATGTGTATTTTTAACTAAAAATATATACTTTACATATATATT
-TTGGCGCAGTTATTTGATCTATAAATCAAACTTTTTGATAGACATTTTTT
-TATATTTACAACAACTAGGGTTGTTATGAAAACGCCTATTATTCTACAAA
-CTAAATTATTTTAATCATACATTCCCCACTATCTAAAAACTAATGCAATT
-TTCAGATTTTGTCATGTAAATGGGTAGGATGTCTCAAATCAACAGAAGTG
-TTCAAAACGGTTGAAAAGTTATTAGATCATGTTACGGCTGATCATATTCC
-AGAAGTTATTGTAAACGATGACGGGTCGGAGGAAGTCGTTTGTCAGTGGG
-ATTGCTGCGAAATGGGTGCCAGTCGTGGAAATCTTCAAAAAAAGGTATTT
-TTAATTTAATGTGCATTTTATAATATAAATTCTTCAGAAAGAGTGGATGG
-AGAATCACTTCAAAACACGTCATGTTCGCAAAGCAAAAATATTCAAATGC
-TTAATTGAGGATTGCCCTGTGGTAAAGTCAAGTAGTCAGGAAATTGAAAC
-CCATCTCAGAATAAGTCATCCAATAAATCCGAAAAAAGGTATTCACAATT
-TGCATGATATTGTTATAATCTAATTTTCAGAGAGACTGAAAGAGTTTAAA
-AGTTCTACCGACCACATCGAACCTACTCAAGCTAATAGAGTATGGACAAT
-TGTGAACGGAGAGGTTCAATGGAAGACTCCACCGCGGTAAGTGTGTTTCT
-TTAAAAATTACTTCCTTTTTTCAATTGTTTGAAATTAACAAGAAACCTGT
-TGGAGCGTATTTCTGAACTTTTAAATCGAAAATATCATTTGCAAAAAAAC
-TTGAAAATTGAGAAACTTTTTTAAAAGTGGAGTAGCGTCTGCGGGTTTTT
-TTGCCCTAAATGACAGAATACATACCCAATATACCGAATATAACCGTAAT
-AAAATTATGCGATTTTTATTTTTATTTTTCATGAATGTTAGGGGCAAAAA
-ACCCACATGCGCTACTCCGCCTTAAGAAGAATCAGCTGTGAGCACTATCC
-ACTATACATTGGAAATTTACAAATAAAATAGAGATTAAGTAATATAATTT
-TTAAGGGTTAAAAAAAAGACTGTGATATACTATGATGATGGGCCGAGGTA
-TGTATTTCCAACGGGATGTGCGAGATGCAACTATGATAGTGACGAATCAG
-AACTGGAATCAGATGAGTTTTGGTCAGCCACAGAGATGTCAGATAATGAA
-GAGTACGTTGTTTTGCAAATTGATTAAAAGTGGAGTAGCGTCAGTTAAAA
-ACTCTAACATGTCTTAGGTTTTTCAAAAGTTTGGTCAAAGTTTTGGCAAA
-CTGCCAACTTCTTGAAAACTTCGTTAAAAAAATTCTTGAAATGATTTGAA
-AATTTGTATTATGTTATTCTCTTATTTCTGCACTATTCTATATGGCGCTA
-CTATACTTTTAATTGATTTCTTGAAAGCAGTTCAATAATAATTAATTTTA
-GAGTATATGTGAACTTCCGTGGAATGAACTGTATCTCAACAGGAAAGTCG
-GCCAGTATGGTCCCGAGCAAACGAAGAAATTGGCCAAAAAGAGTGAAGAA
-AAGGCTATCGACACAAAGAAACAATCAGAAAACTATTCGACCACCAGAGC
-TGAATAAAAATAATATAGAGATAAAAGATATGAAGTAAGTCGAAATTGAC
-AAACAGTGGTTTTTGTTTAAGTTTATTGCGAAATATTCAAAATTAGACAT
-GTTAAAATTTTGCGAGATAATCTAAAGATTAGGTATACAGATTTTTTCAT
-GTAAAGTTACATTCATCAAAATTTTTGTGTTCACCAAATTAGACAAAAAA
-TGTTAGTTACACAGTATATTTATTTTTTATATCAATAAAACCTTTTTCAG
-CTCAAATAACCTTGAAGAACGCAACAGAGAAGAATGCATTCAGCCTGTTT
-CTGTTGAAAAGAACATCCTGCATTTTGAAAAATTCAAATCAAATCAAATT
-TGCATTGTTCGGGAAAACAATAAATTTAGAGAAGGAACGAGAAGACGCAG
-AAAGAATTCTGGTGAATCGGAAGACTTGAAAATTCATGAAAACTTTACTG
-AAAAACGAAGACCCATTCGATCATGCAAACAAAATATAAGTTTCTATGAA
-ATGGACGGGGATATAGAAGAATTTGAAGTGTTTTTCGATACTCCCACAAA
-AAGCAAAAAAGTACTTCTGGATATCTACAGTGCGAAGAAAATGCCAAAAA
-TTGAGGTTGAAGATTCATTAGTTAATAAGTTTCATTCAAAACGTCCATCA
-AGAGCATGTCGAGTTCTTGGAAGTATGGAAGAAGTACCATTTGATGTGGA
-AATAGGATATTGATTTTATAACGTGTAATTGAGTTTTGGCCAAAAAGGTA
-TGGAAAGGTGGCTGTTTAGTTATATATTTTTCTATTATTTATTTGAAACA
-TGCAAAATTGAAGTGAACAATAAGTGATGTTCATGGAAATTTAAACTGTT
-TTATGATACTTTTTTGAGAAATTGAAAAATCTGTTCATTTTAGAAACAAT
-GTCCACATGGTTCTAAGAGCTAAAATTTTTATTTTCATCCATTTAGAGTA
-CTTTCTCTTTTAGAGTACGGCCCCAGAGCGATGTTAGAAACCTGAGATCG
-GTCAACACAGACCGTTAATTTTGGGAAGTTGAGAAATTCGCTAGTTTCTG
->CHROMOSOME_III
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAAAGCGCGAAATCCTATGAA
-ATTTCAAGGATTTATAACTTTTTGAGTCCGAAAAGAGTCGGAAATCAGAT
-AAAAATAAAATCGGGCTTTTCGACCAAAATTAGGCCTCGAAAAGTCTGAG
-AAAGCACGGAATCTATGGATTCACGGCTTTTTGATTCCGAAAAGGTTCGG
-AAAGAGAAGAAAATCGATAAGAATCGATAAATTTGCAGAAGTATTGCAAA
-TAAATTCCGATTTTCACTAGAATTGCGTCATTTGGGCGCAGAAAATCGGG
-CTTTTCGACCAAAATTAGGCCTAGAAAAGCATGAAAGGGGTCCAAATTCT
-GAGATTTCGCAACAGTTTTTGGACAAGGTTATCCCGGAAATTAGCGGGAA
-GCACTGAAGATCGAAAAACTGAAGATCTTGTCGTTGAGAATCGTTCAACA
-GCGTCAGTTACTACTGAAAAACTGATTTTTGAGCAGAAAATCTGCCGAAA
-TGTCCGAAATCGGACGAAAATCAGTGGTTTTTTCGCCAGGAACTCGTAAA
-CGAGCGGGAAAAAACACTAAAATAAAATACATAATCGACGACGGCGTCGA
-AAAATGGACTTTGGAGGCGATTTTGAGATAAAAATCGCCTCTCTGAGACC
-GCGTCACCGCAACTCGTGCCTCCATCTGACTCAGGATCCGAATCCGGCTA
-ACGAGTATACTCGAGCCGGTTCGGTCGATGCACCAATGTTGACACCCATG
-TTCTTCGGGGAGTCAGACCCGATAGGTAACAAACGTGCGGCTTACTTAAT
-GACGCGCGGAGGATACGGAGCTAGTACGAGCGGTGCGACTGATGATGCAT
-AGGGAATAACAGTACACAAGCTTGAATTAATCCAAGTTTATTATCGAATA
-AAAGGATTAATCAAAGAAAAAAGGAGGAAAGGGCGAGCTGCATTGGGAGA
-CGACCTTCCTCGACGAGAGTTGTTGAAGAATTGAATGGATCGTAGGCCAG
-AGGCCTATAATAATTATTGTGTGGATTTACGGGCAACGACACTCCGGAGT
-AACGCTAGTTAGCGAAGGAGCGCGGTTGCATCTGAATAGCGCATATTGGC
-ACGTAATTCAAATTAGAAAAATTACTAAAATGATTTAATTAATATTTTTA
-ATAGAACGAATGGAATATAATCAGCAAATGGTACAAGCGGACGTCACAAC
-ACATTGCTTAATAATAAATTTCCAACTGAAACCAATAGATTCAGCCTTGA
-CACAACTGATCAGAAACTTGTTATACATGTTAAAATACTCGAATTCATAT
-TCATCGCCACCAGAATAATTGGGTTTGAACACTCTTGCAACTTCAACTGA
-GATGGTACCGTAGATCCAGAAGATGCATTGTTGGAATGTACTTCTTCCCA
-AAAGGTTCTGAGATTTAATTGATTTTTAACCTGGGCCTAAAAGTCTCACT
-TACGTACATTTCTAATATTTAAGGCATTTAGTGCTGAGAAGTATTCGACA
-GTGGCCTCGATGTTTTCAAAGTGGAATAAATAGTGAATTGGAATAATGTT
-GAAATAATGACCAAAAACTTTACATTCTTTTGATTTTTTCCACTGATCCA
-TCCGAGTAAGCTGCTCAAAGTCATCGATTGTTTCAAGGCACCACAATTCA
-ATACTTTTCAACTCTTGAGAATCGAAATAGGGCAGCGTAGATATAATATC
-ATTGGGTGACACAAAAATAATCGATAATTCCTTCACATGAATGCATTGCT
-TAGATCTGAGGATGTTCAGAAAATATGTGGTAACGTTAAGGTCTTGTTGA
-GTTTGTACAACAAATTCGAATTTCCTGACACGTCCCAGTAATATTCTCAA
-ATCGTTGAAAGCTAGTTGCATGAAGTTATCTCTTCTGATTACTCTCTTTC
-TTCTGTGAGCCACAATCGAATTCCCGGCATTGGTGTAAATGATTTTCATT
-TTATCAATCCGCATTTCAACTCGACCATTGCATACCCAAAACGAGATAGA
-ATCAAAATTAATTCCATTTTGAACAACGGCAGCTCTCAGACTTTTACAAA
-TTTTGAGGTGAGTGAGTCTGAAGAATAATAGCTTGGTTATGATTTTTCAA
-AGTTAGGGTACCGAAATCTTGGAAATATTTTTAATTGACTCCAAATTTTC
-CCCTGATTCCGAAAATCGATGTGAAAAAAATCAAAAAAAAAATTCCTGAT
-TTTATATTTAAGCTTGAAATCACGCATTTCATTTGCGCCCCGGTCTCTTT
-TTCAAATTCGCGCCCTAATAAATTTGCATTGGAGCGCACTTGCATCGTGT
-CATTTTCTTCGTTTTTTTCATTTATTTTAGCAGAATTCAATGTTTTAAAC
-CAGTTTTATTCATTTGTGGAGAGTTTTTATCGGTTTTTTTTTGACTAAAA
-TGAAAAAAGGGTCCAAATGAAAATCGAGATGAGCTAAGTCAAGCTTAAAT
-ATAAACCAGGGAAATTTTTTGATTTTTTTTTTCACTTTGATATTCGGAAT
-CATGGGAAAGTTGGGAGTCAATTAAAAATATTTCCCAGATTTTGGTACCC
-CACCTTTAAATCAAAATAAAATCAACTAACTGATCCACTGGCTTTAGCTT
-TTCCAATACTTGACCAAGGATCTCTGTGGGCATATCGGAAAGAGTAGGGG
-AAATGTGATCCTGGCTGTAACAATCAAATTGCCATTAACCCAGTATTTCA
-ACAAAAAAAAACTCACAAATTCATATATCGCACAAAATTAATTGCCCACC
-ATTTGTCAAGTTCAGCTCCACGTTCTTCAGTCAGAGCACGTCGGGCTTCT
-CGGCTGATTGTTACCATTTTCAAAAGATATAATTTCTTTAACACAGAAGT
-TAAATAAAATATGTCCGATAGCAAAAAGTAGATGTGAATGAATTGAAGAA
-GAACTGAGAAATAGCTAAATATCTATGTCTTAATTTTCATAGAGTTTCAT
-TGTCAGATACTACAATGTTACTATTGAGAAAAATGTCAAACTGATAAGAA
-TAGCAGCCAGCTTAAAATGAAAATTTGATAAGAAATTGCTGTCTTAATAT
-TAATTATATTGTCGTCAACAAACAGAATTTTCACTTGCTAGTTGTTAGTT
-TAAATTATATTTTGATACCGAAAAGTGTTTGAAAATGGGGGGAAACTAGA
-AAATAAAGTTTTCTACATATTCCATATTTTCAGAATTGATTTCAAGATAT
-GTCGGAAACAAGCCAAGAAGCTCGACGTGCACTGACGGAAGAACGGGGAA
-AGGTGCTTGACAAATGGTGGGCAATTAATAATTTGAGATTCATGAAATTG
-TGAGTTTTTTGGAAATACTGGCTTATTGGCAATTTGATCGTTACAGTCAG
-GATCCCATCTCCCCCACGCTTTCCGATATGCCCTCAGAGATTCTTGTTCA
-AGTTTTTGAAAAATTTGATTCTATAGAACATTAAGTTGCTTTGACTTTTA
-CAACAAAAATATTCGGTATAAAAATGTTCTGACTTATTTGTCGAAAAGTT
-TGTCGAAGTCTGAAGCCCGCCGTGGAAAAAATTGAAATTCATTTTGATTC
-TATTTCGTTTGAAGTATTTAATAAAAATGTTATTATGAAATTGGATGGAT
-TAAAAATTCTCTACAATGATGTCGCAAATGGTGCTTCTATAGTGGCTTAC
-AATAACAAGGAAGCAATGATCAAAGGAGAAAACTTCCTGAAACTAGCTTT
-CAATGATTTGGGAATACTACTGGAACGTGTGAGGAAATTCAAATTTAAAA
-TCTATGGAGACGATGTACATGCCATTGCCACATTTCTTTTAAATGCTCTC
-AAAGCTGATCAGTGTGTTCACGTAAAGAAAGTAGTGCTTTTTTACGTGCC
-ACTCATTGATATTTGCTCAATTCTCTCGTATTTTGATTCTGAAATGTTGG
-AAAGAATTGACTTGCGTTGTAATGATACAAACGCTCATTTTGAACAACTT
-GCTCAAAAAAAATTCCAACGAACAAAATGTGTAGAACTTTACAAACTTTT
-TAATAAAGATTTCCAAATTTTTATACAGATTCACTAAATTTCCAGAGTTT
-TCCCACAAACCGACACACAGACCGACCTGGTAGTGGAGAGGACAACATCT
-TTATTCAATCCAGTCAGTGAAGTGGAATTAAACTGGGCTTCAAGGAAGAA
-ATGGCACAACGGAAAAGGTCGGGAGAAAAACCAAAAGTCGGAAAAATATT
-TTTTATTGAGATATAATTTTTTTTGGTAGAAACATTTTTCTTCGAATTTA
-AATTATATTTCGCGCCAAAAATAAGATTAAAAACCAAAAAAAAATCCGAG
-TGTGGAGAAGTATTTTCGAAAATATTCCTCTAATAATACCCTTTAACAAG
-GGCTATAATAATGGAATTTCGGGTGCTTGAAAATGAGTTTTTTGAGATTA
-GAAGTATGAATTTTTGTGTCTGGTGTTAAGTTATTTAAGTTATATTGAAT
-GGAAATTTTAAAAAAATTCTGAAAAAATATTTATAATTGTTATTTGAAGC
-TACTATTTCACCTGGAAACTTCTAGAATTTCCAATTTTTTTAAAAATTTT
-TTAAAAATTTTTTTATTTTCAATATTTTTCACATATGATACAATTTATTA
-TGAGATTTTCGGAATTTTTTAAGTGAAGTTTTTCCCTAAAGTTTTCAAAA
-TTGACTCGAATTTTCTGGAATTTTTTTTTTCAAAAGAAACACAGCTTTTG
-TTTAATTTCCAGTTAATTTTTAGCTTTAACATTAAAAAAAATTTCTTTCA
-TTTTTAACAAAAATTCCCCTTCTTATTTTAGAATTCAAAGCCAAAAACCT
-TCAAATTCAATTTTATCTAAAACCTCCTCAAATTCGAAAAAGTGTGAGAG
-AGATACGCGAGCTACGAAAAAGAGCAAAAATCTGAGTTTTTGAGCACTTC
->CHROMOSOME_IV
-CCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCC
-TAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTA
-AGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAG
-AAGAGACCAAACCGAAAAATCAATTTTTTAAACGAAAAATCAATGTTTTA
-AACGAAAAATCTATTTTTTAAACGAAAAATCAATTTTTTAAACGAAAAAT
-CCATAAAAAATTGTTATAAAAATTCTGGAAAAAAAACTAAAAACTTAATT
-TTTGCTTTGAACATTCATCTTTCGCGAAAAAAATTTCAGCAAATAAAACC
-GAAAAATACAATTTTGCAAATAAAAAATCTAAATCAACAGTAAAAAACAA
-AAAAGTCAAATTTCAATAGAAAAAAAAATCAAAAATCAATTTTTACTCCA
-AAAATTCAACTTTTGCCAAAAACTAACCCAGAAAAATCAATTCACAAAAA
-AAAACAAATAAAACTGCAACGATGTTTGTGAAAAAAATTTTCTTGATATT
-TTTAACGAATTTTTGTTTAAAAAAAATGCATTTTTGGCCATAAAATTTTT
-TTTTTGATTTTTTCAAACGAATTTCCCCTCAATTTTCTTGCAGATCGACG
-TGGATATTGACGACCTAGATGACGATTTTCTCTCCACAAACGGAATGGAA
-CGACACGGTTCAGAATTACAAGGAGAAGTGGTTTTCACTACGACGAGTAC
-TGCGAATAACAATGTGAAACGAGCCGTCGAATATTTCGAAGATGATAATC
-AAGATGATGCACTAACATCCACTTCATCCGGCAACAGTACACAGAAGGAA
-TCGTCTCCGTTCACAGATTTTGATGATGTTCCGCCGCCACCAGTGGCTCC
-AGAAACTCCGGCTCCAGCCCAAAACCGCCGAGAATCTGCGTCCCCCGAAC
-GTCAATTCCTTGATGAGAGTCACCTCGGCGGAATTGGATCTCCGTTATCA
-CAGAGTACAAGGCTCGATGAGACGTTTATTGAGGAATACTCTATTGAGTT
-GGACACCTCTGGGAAGTATGTGTTGGGAAAAAAAATCCGAAAATTGATTG
-AAAAATTCGAAAAAAAATCCAAAAAACCTTTTTTTAATGAGATTTTTTCT
-GTGCAAAAATTTAAATTTAGAGCTGAAGAATGTGCACTTCTAGAAAAACT
-TATTTTAAAAAATTCACATCCTTTTATCAAATTTATTAGCATATTTATAC
-AAATTGATGGATAAAAATTCCAAAAAAGTTCCAGAAACAACATTTCCTCC
-GCAGCTTCACCTGGTCCCAAGTCTCCATTTGACGATGATTTTACTGATAC
-AGCTGCCCCGGTAGCCCCGCCACCAGCACCTACAAAAGCTGCCGAGGAAT
-ATCGCCGGCAACCACATCAGAATCCGTTTGATGAGGAAGAGGAAGAAGAA
-TCACAGTTTGGAGGGGGAACTCTGTCCGGTAGAGACCCATTTGATGAAGA
-TGTACGTTTTTCGTAAAGTTCGGAATTTTTAGGGTATAAATTGAAAAACA
-AATGGAGAAAATATGAATACCTAGATTTTTTTTTTCAAAAAATCCCAACC
-CTAATATCCACAATTTTTTTTCAGTCTGGAAACTCTAACGAAAACCAGCT
-CCGCGAGAAGAAGCTCCACAAAAAAGAGCAACTAGCTCACCGGCTCTCCT
-CCTCTTCCGAAGAAATTGTGGAAGCCTCAATTCACGAGGATGAGCCAATT
-GTGATGGCTCAAATTCCAGAGGAGAAGCCCAAACCGAAGGCTATCCCGGC
-TTTTGATAACGCCTATGACGCCGACTTTGACAATTCCCCACCACTTCATC
-ATTACTCGGCGGTTCATTTGGAAACTGGGCTCTCACCGCTTGAGGAGGCT
-CAGAGAGCTCTCCGAGCCAACCGAGCAAGGCATAAGCCGTCGAATGTATC
-GTTGGCAGAGGAGGCGAAGCTTGCTGCCAGACAGAGATACTCGAATGCAT
-CGGATATTAGAAGAGAAGAGGAGGAAGAAGTGGTGGAAGAAGATCCAGCA
-GTGGTAGTTCCAGTTCTACGGAAGGATCTGGAAGTTGAGGAGGCTCCGAA
-ATCGGTACGACCGCCTAGATATCGGAAGTCAAGGGAAATTGAGGAACCGG
-TGGTTGTTGATCGGTTTGTTGAGGAAGAAGTTGATGAGAAGGAGGATATT
-GATGCGATTTTTGAGAAATATCGAAAGGTTCGTAAAGATATTTTCGAGAA
-AAACGGCGTTGAAAATTTGAAAAATTTGAACTTTTTTCGAGTTAAAAAAT
-TTAAACATATAGAAAAGATATGAATCTGACAAAATTTAGAGAAAATAAAA
-TGTTATTCACCAAATCGCCAATTTTTCTGCATTTTTTTGTCCGTTTTACT
-TTGGTAATTCTGGTAATACAAAACTAGTTTTTTTTCAAAAAAGAATTGCA
-GGAAAAATATTTTAAATGTTTTTTGAGCACTTGAGCGCATGAGATAGAAA
-AACGTTATTATTATGCATTCCCTCATATAAAAGTTTGTTCAATTTTTTTA
-ATTAAACCCCGCTCTTTGAGAAAACTCTGGACTCTACATGGAGACTACCT
-TAATACAAATTAACTCATAAATATCGGTGATTTTCAACTAGTTATTCATA
-TGATGCAATTACTGATTTAATAACTTATAATTATGTGTCAATTTCAGACG
-TCTGTATCCGCCGATCCAAAATCTCACACGCCGATTTTGATGGCCGACGA
-GTACAAAGAACCACAGAAGCAAGGTGAGTTTAGTTCGAAAAAAAATCATA
-ACACACACCAGTAGGTTTAAAAACATTGTTAGAAAATTTGAAAAAAAAAC
-CAAAAACCGTCGTAAAACTACACTTTTTCTATTGAAAATAGAACAAACAA
-ATCAAATATCCTACATGTAAAATTTAAATCGAGTGGAATTAAATTCTTCA
-AACAAAAAGAAATCTGCATTTAATATCGATTTCTCATTCAATTGTTATGA
-ATCATAAAACATGATTTTTTACGACCTCCTCTGAATTATCTACATTGTTC
-TCTTTTTCATACTTTCCATATTCTAGTATCGATAGGACTAACACAATTTT
-AATAGTGAGTTCGTTTTTCAAACAATTGGGATTAATTTTCAACTGAACTA
-GACTGTTTCTGAACGCTCAAAACCTTCAAAATCAATGCTTCTTCAAAACG
-AAAAAATTGCACACTATAAACCTCTCACTTGAAGTGGCAGCGCTCGTTTT
-ATATTGAGAAAATATATATTCAAAAAAATGCTGCTGCTTCTTCAGCTTCT
-CGCCGGGCGCCGCCGCCAATAGTGAGTTCGTTTTTCAAACAATTGGGATT
-AATTACAAAAAAACTTAACTGCGCAATTTTTAATTGGGAAACTTTCAAAT
-TTTAACCATAACTATCAATACAGCGGTATACGAAATTTTTCTTCAAAATC
-GCACCGATACTGCATTTTTCCGGAAAAGGACAAAGTCGGCTAATTGCCGT
-TTTTTATAATTTTTGCTCATTAAGCTTATTCCATTAAAAATACAATTCTT
-GTTTAAAATTGCTGAACGGCGAATTTTGTCTACCCGTGGTGGAAATTGCC
-GGTTTGTTGATTTGCCGGAAAATTTCATTTTCGGCGTGCCGATTTGCCGT
-TTGCCGGATATCAATTTGCCTGAAACGTTTAGAGGAATACAACGGAAACA
-TTTGAAACTGTGCCTTTTTGAAATTTTTTCCCTTTTTTTTACAATATTTT
-CATAGAATTAGCTTACTTTTCAAAATAGATGTAGGAAAATTCATATGCGT
-ACAATTTTGCCAATTAAAATTTGAATTCTGAAATTTACAAAAAAATGTGC
-AAAACTACTATTCGCCGAAAATTTTTGGCAAGTTGCCGATTTGCCCGAAA
-TTTTTATTTTCGGCAAATTGGCGCTTTGCAGTTTGCCGGAAAAAATTACA
-TACACCTGTTTTCAGCCTAACTTAAAATATGATTTACTTTGAAAAATAGG
-GAATTAAATTTAAATAAAATTTTCAACTGAACTAGACTGTTTCTGAACGC
-TCAAAACCTTCAAAATCAATGCTTCTTCAAAACGAAAAAATTGCACACTA
-TAAACCTCTCACTTGAAGTGGCAGCGCTCGTTTTATATTGAGAAAATATA
-TATTCAAAAAAATGCTGCTGCTTCTTCAGCTTCTCGCCGGGCGCCGCCGC
-CACATTTACCGGCCAACCCGTTCTCTGAGGTTGTCTTGTAAGGGCGTTTT
-CATGTATATTCAGATTATTATGCATGAATTTCATTAATAACGGTATCCAC
-CCACGTATATTTCTCTTCTTCTCTCTTTCTGTTGCGACGGGGGATGTCGA
-TTGATTACGCCACGGGCGCTAGCCTATTCCGAATGCATTGAGAAATTTGA
-GACCAGATTCTGGAGTTTTTGGAAGACGAATCGTCGGCAGCGGAGCTCGA
-TTTTAATTTAATTTCGAGAGCACCCGCGTGCTCTCGCCTCGACACCCTCA
-AACTTCTTCTTCTTCTTCTTTTCGTCGTCTTTCACTTTTTTCCTTTTTCC
-TGTCCTAACCACGGCGTCTTCCTCCAATTTTCAGTTACCACGACGTCATT
-AGCTATTTTTAGTCCGAGTGTGGAGCTTGAGAATTTGAGCAATTCTGATG
-TGACATTCCTGTCGTTTTTAGCGCTAATTTTCCTAAAACCTTCAAAAATT
-TAGAAATTCTCTATCGTCTTTCAAGAGCCTAAGTTTTTTTTTTCGAAATG
-AGTTTTTTAAAATTGATCGAAATGTTTTTAAATACTGAATATTTGGGATT
-CTAGATTTTTACTACAATATTTCCTTTTCAATTTTTAATTGGACAAAATT
-TCAAAATGTTAAAAAAATTCTCCGAATTGAATGCTATTTTTCTAAAAAAT
-TTTTTTAGTGCCTGCACCAGTTGTCGTTGCTCAGGAGTCGCCGATCTTAA
-AACGAAGAAACTCTCTAGTACCATCAAGGATCAGTGGAAGGCAGTCGACG
->CHROMOSOME_V
-GAATTCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCATAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCATAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAACA
-TAAGCCTAAGCCTAAGCCTAAGCCTAAAACATTTGGAAATTATTTTTGAT
-CGTTTATATTCAAGTAGCAAGAAAGTGTCCTAGCGTTAAAAATAGGAAAT
-TTTTCGCTCTTTCAGAACAGTATACTCATGTCTCTGTACCGACGATATTC
-ATTTCAAAAATCGCAAAAAAAGTTTTTTTCAAAATACCACTACCATTAAA
-ACATTTGGAAATTATTTTTGATTGTTTATATTCAAGTAGCAAGAAAGTCT
-CCTAGCCTTAAAAATAGGAAATTTTTTGCTCTTTCAGACCAGTATACTCA
-TGTCTCTGTACCGACGATATTCATTTCAAAAATCGCAAAAAAAGTTTTTT
-TCAAAATACCACTACCATTAAAACATTTGGAAATTATTTTTGATTGTTTA
-TATTCAAGTAGCAAGAAAGTCTCCTAGCCTAAAAATAGGAAATTTTTTGC
-TCTTTCAGATCAGTATACTAAACATTCACGTGTGGATTAAAATTAAAAAG
-GTAGTGTTAAATAATTAAAAATCATTTAGGGGGGAACGAAACCCATAAGT
-ACTGTCATTTTTATCTTTTACCTTTTTTTTTACGTACGACGTTTTTCGCT
-GTTTTCCCTGATACAAAATGCGTTGTTCTTGTTTATTTATGTTTTTCTTG
-AAAATGTTATCAACACTGATAATCTGAAAAATTATAATTTAAAACTTAAA
-CGAAGCTAAAATGTGGCTGTTATAATACAGCGACTCAATGAAAAACTCAA
-AAAAAAGTTGACTTTGCACGCTATGGTTAAAAATGAATGAATTCTTGGTA
-CATGGTTTTTTTTGTGATTTTTCGTTGAAAAATCCACACCGTGTCAGAGA
-GAGCTGAAAATGTTCATTGAAAGCGCTAAAAAACATTTGAAAAAATGCCA
-ATTTTTCCGTAAGATAATTCGATTTGAAAGTTTGAAAACTGAATAGTAAT
-TGTGTACTTGCAAAGAACCTTGTTTGCTTTTTAGTTTATTTGATCTACCA
-AAGATTGGGTTCACTGTCTGACCATTTGGGTCACTAATCTCATAAACCGT
-CAAAACAATCCAACGTGGTACAAAGTACATCAAGTTTTTCACAAGTCCTA
-TAGTTAGCTGCGCATCCCTAATAGGTATCCCCATTAATTTTTTTTTCAAG
-AAGAATGGCAACACAAACACCCCTCTCTGATGACTCGTGTGTCAAAAACG
-AGCTCACGGAACTCTCCTCTAGTGAAACGGTCTCGAGGATTGACGAGGCC
-CCGAAATTTCATGTCAAAGCTGTCGTCGGGCGTGTTGTGATAAAACATTT
-TGGTGGCCGGGATTGTGTTTGTGTTCAGTCAGAAAGACGCTATTAGGACC
-TCCTCCCATCTTATTAGCTGTTTATCCTTCATCACAAGACATCTCAATAT
-TGGTTCCATAGGTGTAGCTTCTTCTGCTTCTTCTTCTTCTTTTGTACCTA
-CGTCATCATACATTGGTTACTGTCCTACCGAGGTTTGTTTCAAATTTGCA
-CATTTAAAATGGTATACACCTTTAAAATAAACTTAGAAGTAAGGCCTTTG
-GTCCCACTACAAAAAATTTACAGTAGTTTGGTTCAGACTTTTCTAAATTT
-AATTAAGGTTATTTTTTATTGACAAAAAATATTTTAGTTCAAGAAATATG
-TTATGTTCAGTGGGTTTCCTGTCATATACTTCTACTTACCGTATTTCCTC
-TATTAGTCTTGCATGCAAGACTAATTTTCAATTGACCCGTAGGGGTGCAA
-GACAAATAGGGGTGCAAGACTAATAGAGGCTGCAAGACTAATAGAGGAAA
-TACGGTAGTTATACTGGCAAAAGCGATAGCATTTCGAGAGAAAAATATTC
-TTAAATGTGCTCAATATGGCTGATACAGATAGGTTTTTCATTACAGACAG
-GTTTTTCATTTCAATTTTAAAAAAATACCTGACAGTTTATCAAGAAAATC
-CAGCACATTCCAGAGTTATTAGAGTATTTAGAAGTTTGCAAGTTCCCAAT
-TTTGTCAAGGGATTTTTCAAAGTTTCTCAAACTTTCCAAAAAATGCAAAA
-AAAAACATTCCAAAAGTACCAATTTTTCCAAAAAATTCCATAAATATATT
-CAGTCCACCGAACGTTTTTAGATCTAACTGAGAGTTCTCCTGAAGTTTTT
-CAGAGTTTGAAGGAATTTATAGAAGTTTCTGATGTTTTACAGGATTTTAC
-TAAAGTTTCTCAAATTATCTATAAATGCCAAATCTTTTCAGAAAGTTTTC
-AGAAAATTTCCGGAAAACCTTCAATTTTTCAAGTTTTCCAGAAGATTCTC
-GATTTTTCCAAAATCGTTTCAGAATTTTCCTAATTATTCCCATATTTCCA
-TCGACTTCTTATAGTTAATTTGATTTTCATCAAATTGATACAAATGAGAA
-AATTTGAAATTTGATAACTCACGTTTCGATGCAAAAAGAGACGAAAGGCG
-GCGTGATGCGGGCAGGATTTAGGCAGGCGGTAGGCCCTGAAACCGCGCCT
-GCCTACCATTGAACCTCTAAGCTATTCAGTTGTATTTTTTGATATTCCAG
-ATGCGTACCGACGTGGGTTCTATTCCATTAATGTGTATTCTGTCTACACT
-AACGACTGGTGTGTTCGGATATCTTCCGACAGAAGATCTCACAAATTCGA
-TAATTTCTGGAAACGGTGGTTATCCAGTTCCTCCGGACACTATTATACCG
-GCCGATGGAGATGAGGAAGGTAAGTGGATCAGAAATTAATAATTATAAAT
-TTTTTAGAGTAGGGTTTTCTTCTGAAATCTGATATTTTGTGAATTTTGCA
-AAAAATTGGAAAAATCGACAACGAAATGCAAATTGTTTCGTTAAATGCAA
-AATGGATGCGCACCTTTAAAGAGTAAAGTCTATGAAAATGCTTTTATTTG
-GTATTACAGTTCTTTTCAAAGGCACACATATTTTTCCCATTTAACAAAAA
-ATCGTCGTGACCTTATATCGTATTTTCGGCGCAAAAATCGGAACATTTCG
-CGTCTGTATAATACCCCATTTAAAGGTTTACGACGCAATAATACAACACC
-GGGTCTCGACGTGGCAAACGATTGTTTATTGATTTTCACGGGATTCTCGC
-CTTTCTCATTGAATTTTCGCGCTCCATTGGCAATCGCCTGCCGGACAACG
-CGTGGAAAAGTGTAGTGTACTCCACACGGACAAATCCATCGGTTTTACAA
-CTAAAAACGAGCCGCGACGCGACACGCAACGCGCCGTAAACCTACACAAA
-ATCTCGCAGACTCAAAATGGCCTAGTTCGGCAAACTCTGCCATTTCGATT
-TATGAGGGAGGCCAGAATTCCGTGATTTTCCCATTTCTCACGGCCTCTCT
-AAATTTCACGTTTTTCAAAATTCATCTTTTTCTCTCTGCTCTCTCACTCT
-CTCACGTGAAATATTACTTTCTGAATAATAATTTGTGTTTAATTAAATCA
-AATTTTATTGAAATAGAATTCATGATACACGATCTTGAGAAGAGCTCTGT
-CCTCCAGGCTGCGAACTGGAGCGTAGAAAGTTTTCATATTGTTAAAAACT
-GCAAAGAAATGTTCGATTCCTTGTTCTGACGTGTGATGCTTTCTCAAATA
-TGGAATTAAATGACAGACAAGGAGATGAAGTTTCGGAGTGACTCATTATT
-TCATCAGTTTCATTAGGAAAAACACTCTTTATTTATTCAAGGAACTGTTA
-AAGCAAAACTTCAATTTTGTCAATCTCTTGGTCTAAATACGTTCTATCGT
-TAGATAAATCTAACTATCTAACTGAAACGAGTACAACTATATTGTAACGC
-AAAAAAGCTAAGCGCCATAAAACACAAGTAAAACAGGCTCCAGTAAGCCT
-AAACTGTTTTTACTATAAAAAACCATTGTCATTCACCTACCTACCAAATG
-CCAATATAATTGGTTGAAAAAAATTAGTTTAATCTCCTCGCAAGATTTTT
-TTCTCCGAAATTTAAGATTGGGCGCTTAGTGATATCATAACTCTGCAGCC
-ATCAGAAAAACTGAAATGTATTTAAACTGTAAGTTTTAATCGTTTTATGA
-GGATTATTTCTTTAGTTGACAGTTTTTTGATAGCTTCTTTAGTTATTGAG
-CTACGGGCTTCCAAACAAAACCAATCAAAAACCACTATAAACCACAATGT
-CCTAAAAGTGAAATTACTCAGTCAATTTTTAACCAAATCACGGCATTAAT
-GTCTTGATATCTTCATTGAACAATTTGTAAAAATCGTAAGGCGGTAGTTT
-TTTGATAAATGTCATCGTTTTTTAGTAAAATTGCGTTAACCATTCAAAAA
-TGGCCCATTTTTGGTGTTTTCAGGCCTAATTCTTGTTTTTGAAATTCCGG
-AGCCAGTTTTTATCGAAAATTTTTGTGCAATGTCAAAAAATGACCGGAAA
-AAAATTCTCTACAATCGTAAGGCGGTACTTTTTAAAATTTCGTTTCCATT
-CTTCCCCAGGGATCCCGTAAAAAACCAATTTTTCGACTAGGTCTCACATT
-TTGCCCTACAAGAGCATAGTTAATGTTATAAATTTGGATTTTTTGGTCGA
-ATTTGATGAGGTAATATTCAGTTGTTTGTTTATTGTTGGAAAATCTGAAG
-ATTTATCAGCGAATCGCCCGATTTCGCCAATTATGACCAAAAAACCCCTA
-GTTTAGGATTTTCACGAATGGATGAGTTCATTGATACGCTTCCACGCTGT
->CHROMOSOME_X
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGC
-CTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCT
-AAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAAGCCTAA
-GCCTAAGCCTAATCTGTGCTCCAAAGCCTTCGAACTGACGGACTTGTGTC
-CCGAAGTCGAACTCTTGAAGTTGTCACCGAGTTGGCTAATAAGAAAGACG
-CTACGTTGTCTTTTTAGTAAGTTTTCGTCGAAATTCTGGAAAAAAAATCT
-GAAAAAAATGAGAAAAATTGAAGTTTCTTGTGAAAACGTGCAGCAGCCGA
-CAACTAACGGGACTGGGAAAATTGAAATTTTTAACACAGTTAAAATGCGA
-TGTGCGCATAGTGGGTGAAAGGCCATAATGCGCGCACCGCGTGTGGCGAC
-CACCTATTATGCACCTATCGCGAACGGTTCGCGATGGGTCCATAATGTAT
-CCATGATGCTTCCACTCACGAAACAAACAATTCGAAATATATATTGTTTT
-TCCGCCTATTTTTTTAACATTTTATTGCAATTTTTATTGAATTTTTGATT
-TTCACTGGTTTTTTTTCTTGAAATTTTGTTTCGTATGTGGTATTTTGTAA
-TAATCATAATATTTTTTTCTAAATTGTGTGTCTTTTAGAGAAAACACTGC
-TCTAACCAGTTGAGGCATTTAAAAACATCATTTAAACAACATGGCAAGCA
-TTATTTCGTTCCTAATAAATGGAAGCATAGTCAGGATTACTGTAGTTTCA
-CATGTATTTAGCCATTAAAATTGTAATCTGAGTTTTCATCGGTATTTGCG
-CATACTCAGAAAATTTTGTTAAATATCTTGTCTGTTCCTGTATTTTCAAG
-AGCGAAATATCGTCAAAATCAGATTATTTCGTTGAATCTGGAAATGCCCA
-CTGTTCTTCATGCCTACTCGTGTCTATTTCTCATCAGCGTTATAACTCAC
-CTTTTAAATAATATTGTAGAAACAAATTTTTTGCAGCTTCTCTTCGAGCA
-GCAGACTTCACAAAAACTTCATCAACAAGAAAAAACGTGAAAATCTTCAA
-CATCGGAATGTCTAGGTGAAGGATGTCGGAACGGGCAAGGTTTGGAGCAC
-GGCTCAGCTTTTTTAGATTTTAGATTTTAATTTAGAAACACACCACCGAA
-GAGGAGGAGATAAAGATGGCTCGGCTCCAGAATGCATTGAAAGTTGTTGG
-ATGGTCGAATGGATTGAAAGCAATTGTAAAGAAGGAGTTACCCGGAAGCC
-CTGCCAAAAAGCAAAAACCGGCATCGGTTGCGCCGAAAATTTTGGACTCC
-TCGATCGGAAGAGTGAGTTTGCTGATTTTCAAAAAATAGGATGAAAGGCT
-GAATAATTTGAGCTCTCAATTGCTAAAAATATACGGATGGACAAAACTAC
-GATCATCATTGGTCACAAAGTTGCAGCTCCGAAAAGAGAATTCGTCTGGA
-ATTCTGGAAGTTCACAAGAATGGTGAGTACTTACCTTTCAAGTGAAAATT
-GAGGAAAAATTGAGAAAGAAATGTGTTGAAAGATGCAAAAAAATGACAAA
-AATTCAGCTTATCCTGCTAAAATTACGCGTGAAAAAGCATATTTTGTGCT
-TGAAAATCGCAAAAAAAATGCATTAGAAAAACCGATTTTATTTAGTCCTC
-CTAACAAATCGATTTTTGTAGACCTGGAGTCATCCTAGCAAACGAGGCAA
-CACTGGAAGAGGACGAAAAACGTTAAGATTCCGTATGAAGATGTCAGAAA
-ACCGAGTTAGGAGGAACTTGGAATTAAATTTTTGAGTTTTCTTTTTTCTA
-TAATTTTTTAAGCTCACTTTTTATTCTTTTTGTTGTTCTCCCACTTAGGC
-CATGTTAATAAATGTGTTTTTGTTAAGAAAACTGTCTTAAATGCTCAGGA
-TCAGGTTTTATTATTAAAAAAACAAACCCACAAAGCGCACATAATTTATG
-TTCGCGATGCTCGCAAAATGCATCTCAAGTTCGCGATGGACGCACAATGC
-GCGCGCAATGGGCATCATTTCCGGTTCCTTTTTAACACACGCGCGATCCA
-CTCCGAAAGCACTATGCGCACATCGCATTTTAACTGTGAATGAAAATTTG
-AAAAAAAAAACTAAATTTGAGAATTTTTGAGTTAAAAAATTCCAAATTGC
-AGAGAAATAAAAAATAAAATTTTTAGAGAATATATCGAAAGAAATTCAAA
-TTTTTAAGAAAAAATCCCAAAAATAAATCATTTTTCTAGAAAAAAAAAGC
-AAAAAGTTCCCATTTTGCGATAAAAATCGAAAAAATCCCGATTTTTTTAC
-AATTTTCTAAAAAAAAACTGAAAAAAATCCACATTTTTCAGAAAAAAACG
-CTAAAATTTTAATTTTTTCTAGAAAAAAACAAAATTTTCAATAAAAAATC
-CAAAAATAAAACCAAAATTAAAAAATTATAATAATTACGGGTAAAATCGT
-ATGAAATCCCGTTTTTTTTTTAATCGTAATTATTTTCAATTTTTTGGTTT
-TCTCCTCAAAAAAAATTGTTTTTTTTCCCATTTTTCTTTAAAAATTGAAA
-GTTTTCCAATTTTTCTCGAAATATTGACTCAAAATTAGCTTTTTCTTCGA
-ATTTTTAATAAAAATTTTCACTTTCGCGACCCGTTAGTTGTCGGCTGCAC
-GGTTTTCTGAAAATTGAGAAATAAAATTAGAAAAGTTGCAAAATTGAAAA
-AAAAAACCGCAAAAAACTGAAATTTTCTAGGCAAAAAAAAATAAAAGAAA
-TCCACAAATTTTTCGATAAAAATTGAAAAAATCCAAATTTTCCTGAAAAA
-AATCCCAAAAATCCAATTTTTCTACAAAAAAAACCCAAAAATCCACTCCT
-TTTCGATAAAAATTTGAAAAAATTTCGATTTTTCAAGAGAAAATTCCGAT
-TTTCTAGAAAAAAAACCCCAAAAAACTATAATTTTCCTTTAAAAAAAACC
-CCAAAAATCCAAATTTTTGTACAAAAAATACCAAAAAATCCACATTTTTC
-AATAAAAATTAGAAAAAAAAAACAATTTTTGCTGAAAAAAAACTCAAAAA
-TCCAATTTTTCTACAAAAAATACAAAAAAAATCACGATTTTCCTGAAAAA
-AACCCAAGAAACTATAATTTTCCTGAAAAAAAAATCCAAAAAAAAACCGG
-GAAAAAAACAAAAGAAATCCAAATTTTTCGATAAAAAAATTGAAAAAATT
-CCGATTTTTCAGGAATAAATTCGGGAAAAAATTCAATTTTTCTAGTAAAA
-AACCCAAAAAAAACCCAATTTTTTTGCAGTTTCCGTCACTTCTTCTACCA
-CCGTTTCCACAGTAATCTCATCGAAGGCTCAGGTCGCCTACTCGACAAAA
-TTAATGATACTACTGCTGCCCAACAACAACTACAAACTACAAACGAACTC
-GACGGCGATGGCCCAGAAATTGCAATCGCCGCGGCCAAAGCATTCCATCC
-GACTGAAAAATTCGATTTGGAAATGAATGTGGACGACGATGAAATTCTGA
-AAGTATTTGATATACAAGAACAAGAGCAAATTGTGATGAAAAAAATCCGA
-CATTTGGAGAATTCTGACTTACATTTCGAGCGAATTCATGTGAATTTGGC
-GAAAAAAGAGCGATTTTTTGACGACGTTCAGAGCTCGGAAAATGACTCAA
-GCGACGAAAAACTCGCCGAAATTTGCGATTTTTTGAGCCAAAATTGCCGG
-GAAATCTCGAATGCTGCGAAGCCTCCTCGAGCAACACTTGACGAATGGAT
-TCAGACTGGAAAATTCGAAATACAACGTCGTCGAGAGATCCGGGCGGTTT
-GCCACGTCATCAAGGCCATCGGTCAGATGGGAATTACACTTGGCGAGCTG
-TGTGGAAAATTGAAAATTGCCATAGAGCAAATTGCCGGAATTTTGGCCGA
-TTTGAGCGGAGACAAGAAATGGTGTCCGAGACCTTGGATTGCGCCGGAAG
-GTTTTCTTTTTTTTTTAAGGGATTTTTGGGGCGAAAAATTTGGATTTGGC
-TCACCACGCGCGAGCTTTGATTTAAAGGTGTTTTCGCGGTGAGACCCGGA
-AATTTTATTTTTCCTAAATCTCTCTGAACCCGGTCATGATTATACTTAAA
-TGAAAGCTCACGGCGAGCTGAATTCGAATACTAAGTGTATGGTTGTTTAG
-CTACAGTAACCTGACACTGAATTTCGCGGCGAGACCCGAAAATCCCCAAA
-AACTCTCAAAAACCGTCTTAGAATCGATCAAAATATGTCAAGATTATACT
-TAAAGGAGGACTAACGGTTCGGACGATTTTGAACGTATAGACCAAAAATA
-AGCTCAAATGAACGAAATTCGTAATGAAACTGCTCAAAAATTTTTCAAAA
-ATTTTTTATGGCGGTTCAAAATTTTGAAAAAAATTACACTGATTTTGGCT
-AAAATCACGATTTTTTCTCATTTTTCCGTGTCACATTTGTCCGAAGTTGG
-TTTTTTTAGAATTATCGTCCTTTATTACATATTTTGGTAATAAATCTCAT
-TTAATTTCGTCGATTAAAGTGCATTTAAAGCCGATAAATAACCAGTTTCG
-ATGATTTTTGGTTACCTATCGGCTTTAAATGTACCTTAATCGATGAAATT
-AAATGAGATAATCTACCAATATATGTAATAAAGGACGATACTTCCAAAAA
-AGCCAACTTCGGTCAGATGTGACACGGAAAAATGGGAAAAATTCGTGATT
-TTAGCCAAAATCAGTGTAATTTTTTTCAAAATTTTGAACCGCCATAAAAG
-ATTTTTGAAAAATTTTTGAGCAGTTTCATTACGAAATTCATTTAAGTATA
-ATCATGAGCGGGTTCAGAGAGATTTAGGAAAAATAAAATTTCCGGGTCTC
->CHROMOSOME_MtDNA
-CAGTAAATAGTTTAATAAAAATATAGCATTTGGGTTGCTAAGATATTATT
-ACTGATAGAATTTTTAGTTTAATTTAGAATGTATCACTTACAATGATGGG
-GTTTAAAATTCTATAGTAAAAGTGTTTTTTGTTTTAGCTGTTTTAAGTAG
-GATTATTAGATATATTAATATTGACCCTATAAAAAGAAGTTTTTTTCTTA
-TCTTTTCACTACTTTTTAGTATACCAGTTATTTCAATGAGAATACATATT
-TGGTTTTCTTACTTTATTTGTTTATTATTTTTAAGTGGTATTTTTGTTAT
-TTTGGTATATTTTTCTAGTTTATCTAAAATTAATGTAGTGAAAAGTTATA
-TAGCTGTGTTTTTACTTTTGTTAAGAATGTTATATTTTTCTCCCACAGTA
-TTAACTTATAGAAGATATTTAGGTTTAAGAGGTTTTTATTATAGTATTTA
-CTGGTTTATTTTTTGTTTTATTTTAGTATGTTTATTATTTTTTATAAATT
-TTAGTAGTTATTTTTTAAATTTTTCAGGTGCTTTACGTAAAGTTTAAAAT
-TATGTTTTTATTTGTTAGATTATTTATATTTATTTTTAAATGACAACGTT
-TAATTTTTATTCTAATTTCTTTAGAATTTATAATGTTGAGATTATTTTTA
-AAATTTTCTTATGTTTTAGGGGAAATAATGTTTTTTTATTTTATGTGTTT
-TTCTGTTATTTCAAGAATCCTGGGTATGGTAGTTATAGTAGGTAATATAA
-AATTTTTTGGTAGTGATAATTGTATTTTTTAGTAACAGATATAAGTTAAG
-TTTAAACTATTGATCTTCAAAATCAAAAATTTATTTCTGTAGAGATAATA
-GTATAAATAAGTATGTTTCTTTTTCGCAGAAATGGTTTTTTATCTTATAA
-AGTTTTCTTTCAGGGAATTAAAATTTGATCATGGTTTAAGATGATTTAAA
-ATGGTATTATCTAAATTTGATTTACAGAGTAGGCAATAAAAATTTACCTC
-GGCAATTTATCGCTTGTAAAATACTTGTTCCAGAATAATCGGCTAGACTT
-GTTAAAGCTTGTACTTTAATTGATGTTAATTATGAAATTATTATATTTTC
-TTTTAGATCTATGGTAGAATTTGGATTTATATTAGTGAATTTTCATAATT
-TTAAGATTTGTTGAACAAAGCAGATTAGTACCTGGTTAGACAAAAATTAA
-AAGAGCAGGAGTAAAGTTGTATTTAAACTGAAAAGATATTGGCAGACATT
-CTAAATTATCTTTGGAGGCTGAGTAGTAACTGAGAACCCTCATTAACTAC
-TTAATTTTTTGACTCGTGTATGATCGTTTATTTTATTCTTAAGGATTATA
-ATAAAAAATTTTTAATTTATTAAAATAGATATATACCCGGTTTATGATTT
-AAGAAACATTTGGCCTACAATATTTTATATTATGGATTTTAGTTTTAGTT
-AACTAAATGAAATTGTAAAAGACAGTAAAAAATTCTTAATGTATTTTTGA
-AGATTATCTAGAAGTGGTACAAATCATCCATCAATTGCCCAAAGGGGAGT
-AAGTTGTAGTAAAGTAGATTTAGGGGAACCTGAATCTAGTAATAAAACTA
-TTTTTAAATATGTTTTGAAAACATGTTTTGAGGTAACTCGTAGTTTTTAA
-GAGTTAGTTTAATATAGAATTGTTGACTGTTAATCAAAAGGTGTACCTCT
-TAATATAAGAGTTTAGTTTAAGTTAAAACGTTAGATTGTAAATCTAAAGA
-TTATTGCTCTTGATAATTTTAGTTTTACTTATAGTTATTTTAATGATGAT
-TTTTATTGTTCAAAGAATCGCTTTTATTACTCTATATGAGCGTCATTTAT
-TGGGAAGAAGACAAAATCGTCTAGGGCCCACCAAGGTTACATTTATGGGA
-TTAGCACAAGCTTTATTGGATGGGGTTAAACTTTTAAAAAAAGAACAAAT
-AACACCCTTAAATTCCTCTGAAGTATCATTTTTACTTGTACCAGGAATTT
-CTTTTGTTGTAATATATTTAGAATGATTTACGTTACCATATTTTTTTGAT
-TTTATTAGTTTTGAGTATTCAGTTTTATTTTTTTTATGTTTAATTGGATT
-TTCTGTTTATACAACTTTAATTAGCGGTATCGTAAGAAAATCAAAATATG
-GTATAATTGGGGCCATCCGTGCTAGAAGACAAAGAATTTCTTATGAAATT
-GCTTTTTCTTTATATGTTTTGTGTATTATTATTCATAATAATGTTTTTAA
-TTTTGTTTCAAAATTTAATTTGAGACTTTTAATTATTTACATCCCATTTT
-TAATTATAGTAATTGCTGAACTTAACCGGGCGCCATTTGATTTTTCTGAA
-GGTGAAAGGGAGTTAGTTAGAGGATTTAATGTGGAGTTTGCCAGAGTAGC
-TTTTGTTTTATTATTTTTAAGGGAATATGGAAGATTAATTTTTTTTAGGG
-TACTTTCTTCTGCTATATTTTTTAAATTTTCAATTTTTATAGCATTTAGT
-ATTTTTTCATTATTAATTTTTATTCGTAGTTCATACCCTCGTTATCGTTA
-TGATTTAATAATAAGTTTATTTTGATTTAAACTTTTACCAATCTCTTTAA
-TTATATTGTGTTTTTACGCAGTTATTTTTTATTATTAATCAAGTTTATTT
-TTTAGACATTTTTATATTTGTTTTTGTTTTACAATTTTTGTTTTATTTTA
-AAGAAAGTATATTAAATACTTTAGTGAAAAAATTTCTTAATAGGTTAGTA
-GGAGTATTTAGATATACAAATACTTTACCATTAAGGTCAGTAATTTCTAT
-TTTTACTTTTATTGTTCTTTTAACTTGTTGTTTTGGAGGTTATTTTACTT
-ACTCTTTTTGTCCTTGTGGAATGGTTGAATTTACTTTTGTTTATGCTGCT
-GTAGCGTGATTAAGTACTTTGTTAACTTTTATTTCAAGAGAAAAATTTTC
-AGTTTATATAAGAAAACCAGGAGACACATATTTGAAAACTCTTAGAATGC
-TATTAATTGAAATCGTTAGAGAATTTTCTCGTCCACTTGCTTTAACAGTG
-CGTTTAACAGTTAATATTACTGTTGGTCATTTAGTTAGAATAATGCTTTA
-TCAAGGATTAGAATTAAGAATAGGTGATCAGTATATTTGATTATCAATTT
-TAGCCATTATAATAGAATGTTTTGTTTTCTTCATTCAAAGTTATATTTTC
-TCTCGTTTAATTTTTTTATATCTTAATGAGTAATAAAAAAAAAAAGATGT
-TAACTTAAGTTTTAAAGTGCCAAACTTTTAATTTGGAAATGGTGGACCAC
-ATCTTAGTTGATATAGCATAAGAAGTGCATTTGTTTTAAGCGCAAAAGAT
-ATCCGTCAACTAACGAGTTCATAAAGCAAGTCTTCTAAATTTGTTCTAGG
-TTAAATCCTGCTCGTTTTTGATTGTTTTTATTTCTTTATTTACCTTGTTT
-TTAACATTATTAAGAATTTTGACTAATAACGTTATTGTTTGATGAAGAAT
-TTTTTTATTGATAACTGTAGTTTTTATTCTATTAAATAAAAGCAGCAAGA
-GATATACCAGAATTTTTAATTATTTTGTTATTCAAGAGTCTTTAGGTTTA
-TTATTTCTTCTTTGTAGAGGAGGTCTATTACAATTTTTTATTATTTTATT
-GAAAATTGGTGTAGCACCGCTCCACTTTTGAATTTTTAATGTAACAAATA
-ACATTTTTAATTATGGGCTAATGTGGTTTTTAACATTTCAAAAATTACCA
-TTTTTAACTATTTTATTACAAATTTTTTGGTTAAGATCCGTGTATATTTT
-GTTATTTGGTTTATTGATTTGTTATGTTCAAATTTTTGTCATAAAAAGTT
-ATAAAAATTTGTTAATTATTTCATCCACAGAGTCTTTTAATTGGATTGTT
-TTGGGAGTATTTTTTTCAATGTTTAATACATTTTATTTATTTATTTATTA
-CTTTGTATTAATAGTTTTATTAATTTCTAAGTTTTCTAAAACTAGGGGTT
-ATAATTTTATTAATTGAGAAACAACATTAGTATTTTTAAATATTCCATTT
-AGAGTTTCATTTTTTGTAAAAATTTTCTCATTGAGGGAAATTTTTAAATA
-TGATAGATTCTTTACTCTATTTTTGCTTTTTACAATATTTTTATCTGTAT
-TGGCATTTAGATTTTGATTAATTAACTTGAGAATGAAAAATAATGAAGAA
-ACTTCAAATAATAATAAAATAAATTATTTTATTATTTTTCCGTTAATAGT
-TATTTCTATTATTTAATTACTTTTCTAGTAAAATATATTATATTATCTTG
-ATAAGGTAAAGTTCCAGTTGGGAGAAGTAAGATGTAAAATAGATATTACT
-ATGTTTGGTTACGGTCCAAAAAGATGCACATCTTTGCGATCTAGTTTAGA
-AAAAATATTTGTTTTTGGTGCAAAAGAGTTTGATTGCATTTAGTTTACTC
-TTTTAGTTTATAATTAAAATATGGCCCTGAAGAGGCTAAGAATATTAGGA
-GTATTGAAAATTAATAATAGATTATTAAATTTTGTTAATGGGATGTTGGT
-GACATTGCCATCTAGAAAAACTTTAACATTAAGATGAAATTTTGGTAGTA
-TATTGGGTATAGTTTTAATCTTTCAGATTTTAACAGGTACATTTTTAGCA
-TTTTATTATACGCCCGATAGGTTAATAGCATTTTCAACAGTGCAGTATAT
-TATGTATGAGGTAAATTTTGGATGAGTATTTCGAATTTTTCATTTTAATG
-GGGCCAGGTTATTTTTTATTTTTTTGTATTTACATATTTTTAAAGGGTTA
-TTTTTTATAAGATATCGTTTAAAAAAAGTATGAATGTCTGGTTTAACAAT
-TTATTTATTAGTAATAATAGAAGCTTTTATAGGTTATGTTTTAGTTTGAG
-CTCAAATAAGATTTTGAGCAGCAGTAGTTATTACTAGACTTTTAAGAGTT
-ATTCCAATTTGAGGGCCAACTATTGTTACTTGAATTTGAAGAGGTTTTGG
diff --git a/src/test/resources/htsjdk/samtools/cram/ce.fa.fai b/src/test/resources/htsjdk/samtools/cram/ce.fa.fai
deleted file mode 100644
index 2ad2e7f..0000000
--- a/src/test/resources/htsjdk/samtools/cram/ce.fa.fai
+++ /dev/null
@@ -1,7 +0,0 @@
-CHROMOSOME_I 1009800 14 50 51
-CHROMOSOME_II 5000 1030025 50 51
-CHROMOSOME_III 5000 1035141 50 51
-CHROMOSOME_IV 5000 1040256 50 51
-CHROMOSOME_V 5000 1045370 50 51
-CHROMOSOME_X 5000 1050484 50 51
-CHROMOSOME_MtDNA 5000 1055602 50 51
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram
deleted file mode 100644
index 240df31..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai
deleted file mode 100644
index c168662..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTest.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram
deleted file mode 100644
index 312f642..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai
deleted file mode 100644
index bfe6239..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryTestEmpty.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram
deleted file mode 100644
index 77a5ef2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai b/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai
deleted file mode 100644
index c44b7e9..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithBAI.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram b/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram
deleted file mode 100644
index 285c0a0..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai b/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai
deleted file mode 100644
index 2b6f632..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/cramQueryWithCRAI.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/fieldarith.sam b/src/test/resources/htsjdk/samtools/cram/fieldarith.sam
deleted file mode 100644
index 180d1e8..0000000
--- a/src/test/resources/htsjdk/samtools/cram/fieldarith.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at SQ SN:one LN:1000
- at SQ SN:two LN:500
- at CO For each SAM record that has each listed aux field, performs these tests:
- at CO XQ is the expected result for bam_cigar2qlen()
- at CO XR is the expected result for bam_cigar2rlen()
- at CO XE is the expected result for bam_endpos()
- at CO (Note that these are all zero-based, while POS is one-based in SAM)
-r1 0 one 50 20 8M * 0 0 ATGCATGC qqqqqqqq XQ:i:8 XR:i:8 XE:i:57
-r2 0 one 100 20 50M * 0 0 ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCAT qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq XQ:i:50 XR:i:50 XE:i:149
-unmapped 5 two 200 0 * two 200 0 ATGCATGC qqqqqqqq XQ:i:0 XR:i:0 XE:i:200
-hascigar 5 two 200 0 6M2S two 200 0 ATGCATGC qqqqqqqq XQ:i:8 XR:i:6 XE:i:200
-s1 0 one 300 20 2M * 0 0 AT qq XQ:i:2 XR:i:2 XE:i:301
-su1 4 * 0 0 * * 0 0 AT qq XQ:i:0 XR:i:0 XE:i:0
-su2 5 two 400 0 * two 400 0 AT qq XQ:i:0 XR:i:0 XE:i:400
-su3 4 one 500 0 2M * 0 0 AT qq XQ:i:2 XR:i:2 XE:i:500
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict
deleted file mode 100644
index ca3f427..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:20 LN:200 M5:8ccb6b8284befc25d90a23637cad0bdd UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/cram/human_g1k_v37.20.21.0-100.fasta
- at SQ SN:21 LN:200 M5:8ccb6b8284befc25d90a23637cad0bdd UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/cram/human_g1k_v37.20.21.0-100.fasta
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta
deleted file mode 100644
index 53a8bbd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta
+++ /dev/null
@@ -1,11 +0,0 @@
->20 dna:chromosome chromosome:GRCh37:20:1:63025520:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNN
->21 dna:chromosome chromosome:GRCh37:21:1:48129895:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNN
-
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai
deleted file mode 100644
index 0214054..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.1-100.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-20 200 53 60 61
-21 200 310 60 61
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict
deleted file mode 100644
index 10aff59..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:20 LN:200000 M5:fcb26df26fe47f4b364854e8371e465e UR:file:///home/chris/projects/htsjdk/testdata/htsjdk/samtools/human_g1k_v37.20.21.10M-10M200.fasta
- at SQ SN:21 LN:200000 M5:f02fab23cf86525e5ce048774c66a23d UR:file:///home/chris/projects/htsjdk/testdata/htsjdk/samtools/human_g1k_v37.20.21.10M-10M200.fasta
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta
deleted file mode 100644
index f77d885..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta
+++ /dev/null
@@ -1,5002 +0,0 @@
->20
-TTGTTTACTACAGCTTTGTAGTAAATTTTGAACTCTAAAGTGTTAGTTCTCTAACTTTGTTTGTTTTTCAAGAGTGTTTT
-GACTCTTCTTACTGCATCCCTTGCATTTCCATATGGACTTTATAATCAGCCATGTCAACTTCTGCAAGAAAGACAGCTAG
-GATTTTGATAAGGATTGTGTTGAATCTGTAGTCCAATTTTGGGAATACTACCATGTTAACATCGTCTTCCCATCCATGCA
-CGTGCAATAGCTTACCATTTATTTGGTCTTCCTCAATTTCTGTCAACAATGATTTGTAGTTTTCAGTTGCAAGTCTTGCA
-CTTCTTTTGTTAAACTTTTTCCAAATATTTATTCTTCTTAATTACATAATTCTCATAATTAATAAAATTCTGAAATTTTC
-TTAATTTCATTTTTGTGGCCATGCACTTTAAAACTTGCCTTTTAACAAGACTTCCAGATGATTCTTGTGAACATTAAGTT
-TGTGAAGTGCTTCTCTATTGACAAACTGAACTCACGTGACATTCCACACAGCACTGGCAAATTCTGTCCCGTAACTCCGC
-TAGCTCTCCAACAAGAAGTGACTTGACGCAGCCCAAGGTTACTACTTAACACAATGAATTAAATGTTTTTAAATAAGAGG
-AAGCAATAAGATTCTAAAGGCTTTTCTGTTTTAATTTTCATGCAATGGAAAACTGGTATTAAATATCTATTTAATTAGGA
-GGAAACTACAATGCTGACTTTTGTCTGAATTATGTAGATAAGTGATTCATTTGAAACAATTATTTTGATAATTGTCAATT
-ATCCATTTCATTTTAATGCATTTTTTATTCTTTTTTCAAAAATAGCAACAATTACAACAGTTAAACCTTATAATGAATAT
-GTTTCCTAAACCCTGTTCTACTTTCTGGTTCCAGATCTGACACCAATTACCTTTCTGATTTTGGACAAACCACTTAATAT
-TTGTAACTTACAATTACTTCAACTGAATAATAAAAGAATTGGACTAGATTTCTCCAACATCTCTCTCTTTTGGCTTTATG
-TTAGATAATGCTAAATTTTCATCATATCCAAACATGCTATATAATTTTATGAACTGTTACAGAGTCAGACATAAGCAATA
-TAAAGTATGATTCTGAATAAAGGCTGTGAAGTCTCGTTTTTCATACATAATTACAGGAACCGATCAAATTCAATAAAGCA
-TTTATAGTCATGACAATATATTCTCTTAACTTGCAATGTGGTTTTAGGAAACAATGAAACAAATTAAACAAATGCATGAT
-TCCTTAAATTTTGTTGACTCGGGATTTAGTTACATATAAGACTCTTTTCCCCCAGCCAGATTAACCCTGCTCTGTATATG
-TAATACGCATCTTCCCCCCAAATTTCACAATAATAATTTTATGAAAATCAGTATGTAAGTTGCTGCATTGGCATGAAAGG
-CTACTAATGTGATATCTTTCAAAGATAAAGTGAACGTTTTTGTAAAAAGCCACCACACTGGAGGCATTTAACAATATTCA
-TCTTCCTATGGCATTACTACCCTAGATGTACTTTGCAATATTAATCAAGCCTTGTCTTACTTCAGGCTTCCTAGAAATAG
-AGCACAAGGCAGGGATTCTTTCTTGCTCGGTGATTTATTGAGGAAGTGCTCTCAGAAGAAATTGGTAAGATGCTAAGGAG
-AACAGCAAAGGACAGGAGAAGGGGGCTGAGCAGAGATGGGGATCTAACTGGAATCTGGCCTTTGCTGATTACCAGAGCAG
-CTCTGGGTGCGAATGGTGAAGTGCTGTTCTATTGACAAACTCCACTCAAGTGACATTCCATGCAGCACTGCCAAATTCTG
-TCCCATAACTCTGCTAGCTCTTCAACAAGAAGTAACTTGAGGCAGCACAGTTACAGAAAACAGCACAAGAACCAAGGATA
-CTAAACAGTGACTTAAATGTTTTTAGATAAGAGGAAGCAATGAGATACTATAGGGTTTTAATTTCTGTGCAATGGAAAAC
-TAGTATTAAATATTTATTAATTAGGAGGAAACGACAATGCTGACTTCTGTCTGCATTATAGACAAAATTGAGTTCTCCAA
-CCATGAGGCAAGGTGCTGGCTTTTTGTACCCCTGCACTATTCATTTGATGGGTGAGTGCACTGTAACTTCCAGACGTCTC
-TTGGTAGGTGGGCCCCACTGGCCAAGGGCATTTCCCGGGAGAGTGAACGGCTGTGAGCTACTAGCAGTAGCAGTCACAGC
-AGCTGGGAGGAAACACACTGGTCAGGTAAAGGGCCAGCATCTACCAAGGTCCAGTTCCACAATTAGTGGAGAAATATTTA
-ATAACATTATTTTTGAAAATAATTAGGCCATATGACTTTGACACTTTTTCTCTAGCAAAGTGACTAAAGAGAAGCAGGTT
-TTTAACTGGGTTTTTATTTCTGTTGTGTCTCTAGCCAAAGCCATGCTGATGTTTGATAGTTTTTTTTTTTCTTTTTTTAA
-GAGATGGGGTTTCACCATGTTGGCCATGCTGGTCGTGAACTCCTGACCTCAATGGCCTCCCAAACTGTTGGGATTACAGA
-CGTGAGCCACCACGCCCAGCCAGAATTTTTTTTCCTAAAGAATAGAACAACATTATAAAATTTTAGGCATTAAGGACAAA
-TTTTATTTTATGATTTTCATTTCGGTGAGTCACAAGATATTCAACACAAAATGAAACTTCACAAAATTTCACAAAATGAA
-AAATTCATTTCAGATTCAATATCCACCTCCATCATCCATATTCATTCTTCCAATGTCTCAGGCCAGAAATTTGGAGTATG
-TGGCTTCTCCACCTCACACAATTTGCCCTAACTTTAATATATACTCAGAAATTACTGGCTTTTCACTGTTTCTATGATTC
-CCATGTGTAATATACAATACTCACCATGCATACAATAATACAATAATTCTGTGTCACAACCACACCTAAATTGGTAAGTT
-TATAAGGTTATAAGCTGAGAGGTTTTGCTGATCTTGGCTGAGCTCAGCTGGGCAGGTCTTCCGGTCTTGGCTGGGGTTCA
-CTGACACACAAGCAGCTGACAGTTGGCTGATCTAGGATGGCCTCAGCTGGGATGACAGGCTGTTTCCTCACCTTCCAGCA
-GGCAAGCCAGTCCCAAGAAAGAGAAGGGTGAAACATGGAGGCCATTAATTGAGCCCATCGCATGAAACGCATCTGTGACA
-CCATCACCGTCTGATATCAACTCTCACCTGGATGTTTGCAATCGCCTAACTTTTCTCCTTTCATTCACTATGCTGCCTTA
-CAAACCTATTCTCCACAAATCAGCTAGAGCAAACCTTTTAAATCCTAAGTAGAATGCTACCATTCCTCTGCTCAAACTAC
-TGGAGAGGAGATGCCACAGTCTTTACTATGGTCTTCAAGACCCTATGGGAGGTAGCCCTGTCTTACAACCATAGCCTCCT
-ACCACTGCCCCAACATGCACACTGAGTTCCGGCCACAGCATCTGCTTCCTCTTTATTGATCTGCCAAGGACATGAATGAC
-TCAGAATCTCAAACTTATTCTTCCCTCAGAATCCACTGAGCCTACTCCCTCTTTTTCTCAAATGGCAACTTCTCAGAGAT
-GCCTTCTCTGGCTAACGTATATGTACTAAAACCTCCATCCAGCACTCTATGTCATCCTTACTATGGTTTATTTTTCTTCA
-TAGCACCTATCAATTGGTGAAGTATTAAATATGCATTTTTGTTTGTATGCATCTCTCTCCCCGCACCAGTATGTGAACTC
-CACCAGACTGGAGAGCGTGTTTATTTTGTTCACTGCTGTAACTCCAGTGTCTAGAACAGTGCCTGGCACACAGTAGGTGT
-TTAATAATGATTTGTTAAGCTAAGCCAATGAATAAATATTCTTTTGCCCATGAGATGATGTTAAAAATTTTTCAATTATT
-CATAACTGCCTGTAAGGAATGAATGTTAGTGAATTACTGTGATACCAATGAAAGTTAAATGATGCAATGAAGATTGGGTG
-GATCACAAGGTCAGGAGTTTGAGACCATCCTGGCCAATATGGTGAAACCCCGTCTCTACTAAAAATACCAAAATTAGCTG
-GGCATCGTGGCAGGACCCTGTAGTCCCAGCTACTCAGGAGGCTGAGGCAGGAGAATCGCTTGAACCCAGGAGGCGGAGGT
-TGCAGTGAGCCGAGATCACGCCACTGCACTCCAGCCTGGCCGACAGAGTGAGATTCTGTCTCCAAAAAAAAAAAAAAAAA
-AGATGTAAATATTATTATTGTTTGCCATCACCCTTATGTGCTGTCTTGGCTTTATGTCGTGCTTAGATCTTTTCCAGGTG
-CAATTTGAATTGATGCAACTAATGGAAACTACAACAGAAGTTCATATTGCCCTATTGTATTACACTATTTGACTCATCTT
-TCAGTATCACCAGGTGCATAAGGAAAATTTCAAAAGTAAATCAAGAGAAAGAAATATGATCGCAGCTTAACACAATGTAA
-ATTTATTATTTGTACTTTTTGTCTAAATGGTTTGCCTAAAAGACTGAAAGACATTTTATATTAGTTAGAATACTTGAGGA
-TAATAACATAAAAACTTTCCTTTCCAACTTGTTTATAAAAGGAAATCTTCACTGTTTTGAACATCAGTTATTTTAAACTT
-TTAAGTTGTTAGCACAGCAAAAGCAACAAAATTCTAAGTGCAGTAATCACTTTACTGCGTGGTCATATGAAATCAAGGCA
-ATGTTATGAGTATTACTGGAAAGCTGGACAGAGTAACGGGAAAAGTGACTAAAACTATGCAAAACTATGCAAAACTAAGC
-AGATTGTGTCTCTAGAGTATTTCCCATCTCAAGTTTAGTTATTTACTAATTTGGCAACATCTGACCTATCTTTAATTGTG
-AGAAAATAAACAAACACATAAGCCAACTCTCAGAATATGGTTATACATAGGTGTAGCCTATGACTTTGAATGTATTTGTT
-TGAATAGCGTAAAACAAAATAAAAATAAAATCTTGTTACAGTGCAAGAAACGGCAGTCATCAAACTAAGATGAGGCAAGT
-GTCATGAAGTATGAAAATATGGTACCTGAATTCTATTTATTAGAAAGTCTTCACTGAGCTGAGCATGTTTTTTTTAACAA
-ATTCAATTACTGATTTGAATATTTATTATACTTAATTATTGCAGCCATGAAAAGAGGTGCTGGCTGAGGCTGCATTTAAT
-AAAAACATTTAATCAGCTTGAGGTTAGTAAACCATTTAATTTGTTTTTTCATGAAGATTTAACTTCTAGAATAATTTCAT
-TTATGTATTTTTAGGTATAGCCCTAGATTCTGGTCTACATAGTATACAAATCATTTTAGAATGACACTAGGTTATTTCAA
-CTGCTTTTCTACAGAAGTGTTAAATAAGGGAGTAAAGTGTTGGCTTTTTCCATAATTGAAATAAATGCACAATGAGCAGT
-AACATCCTGATTTCACTGCTATTTTGTTTAATCAACATAATGATGTAGATTTACTCTGTATATATATGGAAGAGTGAAAG
-AAGGTTGGGAAGGAATAACTATCAATTAATATAGGTGATATAGTAGTTATTTTTGCAAATCAACTATAATTTCTGAATGG
-ATATTCAGACCATATTTACATTACATAGAAGAGGCACACACCAAAAGATTTAACAAATGTGCCAAATATTGGTGAATATT
-TAGTTAGGTACCAAAAGGATGTTGTATAAATTAGGATGCTTTCAACCATAAGAGACTCATCTCAAAAATGGCTTGAAAAT
-GTGGGGAATTTTTATCTCAGTGTGAAGTTAAAGGTAGGGCAAGTCCAAATCAATTCAAGTTAATTAAAGCCCCAAGTTCT
-TGGAATTTGCTCTGCTAGTCTTAGCTGGTTAGCCTTTGTCCTGAAGTTTGTAACTTCATGACCAGAAGATGATCGCAATA
-TTTTCTAAGTATAAAGCCTGAAGGTGTAAACCAGGTAGTCTCAGCAAAACCAATGATGCATGGTCACCTTTCCCTTAGTT
-GACAAATACTTGCCTTCCAGATACTTTGAATCAGAATGGGCATTTTAACTAAGATCCAGTGCAACTAAAGGAATAATCAA
-ACAAATGATAAAATAATTATTCTGAGCTGAAAACACAAGTCTGAATATTGGAAGAGGTTCCTGATTTCCAGGCAGAATAG
-ATAAGCAAAGATATCAACCTAAACACATCCTGGTTATAGTCTAAAATTTAGAGAATAAATGGGAAAAGATTATGAACTTT
-AAGGAAGAAATAACAACTTACACATAAAACAAAAAGGAAAAACTATCTGTTGACAGATTTATCACCTGCTAGATAAGAGC
-AGAATAACCATTCACTAGGAGAAAATGGGAGAAGCTAGAAGATACTGGAGTAATATTTATAGAGTACTGAAGAAAAAACA
-AAAAACAGAAATTCAATACACAGCTAAGATATCATTTACCTGTAAATGATACATGGTAAAATAAAGGGTAAAATAAGGAT
-ATTTGCAGATTCACAAGGAGAAGTTAGCCTTCACATACTCAGCTGAGGAAAATCCTAGAGACAAAACTCTAACAAAAACA
-AACTAGCCGGGTGCAGTGGTGCAGGCCTGTAGTTCCAGCTACTCAAGAGGCTGAAGTAAGAGGATCACTGGAGCCCAGGG
-GTTCTGGGCTGTACTGTGCTATGCTGATCAGGTGTCCACACTTAGCTCGCCATCAATATGATGACCTCCCAGGTGGGAAA
-TGGAGCAGGTGAAAACTCCCATGCTGATCAGTAGTGGGATCATGTCTGTGAATAATCACTGCACTCCAACTGGGAAACAT
-AGCAAGACCCCATCTCTAAAAAACAAACAAACAAACAAACAAACAAACAAAAATGTTTCAGACAAATGTCAAGATAGAGT
-AAAAGAAGAAAGTACTGAAGGCCCTTCAACATAAATTGGATCAGATAATAAAAATAATAGCAAAGTTCTTTTCATGCTGT
-ATCCTTAATTCTTCACCATAATCTTAGGAAGTGAATGTATTAATTATCTTTTGCTATATAACAAATTACTCCCAAAACTT
-GGCGGCTTAAAACAACAAATATTATTTCACAATTTCTGTGGGTCAAGAATTTGGAAGTAGTGACTCTGGCTCAGGGTCTC
-ATTTAAGGTGGTAGTTCAGGATGCCAGTCAGGGCTGCAGGCACTGAGGCTGCTTCCTCAATGGCCCACTCACATGGCTGT
-TGGCTGGAGGCCTCTCTTTCTCACCACACGGGCCTCTTCATAGGACTGCCCGAGTGTCCTTACAGCGTGGCAGCTGGCTT
-CCCCCAGAGTGAACATTCTGAGAGAGAGAGAAAGAGAGAGTTAGAAGGCATGCTGTCACTTCCACTGTATCCCATTCACC
-AGAAGTGAGAGACTAAATTCACCAAACAGAAAAGTGAAGGAGAATGAGGCTCCAGTTTTTTGGGTGAGAGTTGAAGAATG
-TATGGATATTTTGAACAACCACAATATAATTCTTCTTTTCACAGAAGCACAAAAAAATTTATTTAACTTGTCCAAGTTTA
-CACAGTTAGCAAGCAACACCTTTGAGAAAAAAATCCATGTAGTCTGATACAAGCACCCAAACTCATAACCACAATGTGAA
-TCTAACTGCTTTTCAATTAAAAAAGAAAGAAAGATTCCCTTCAAATCTGGCATATGCATTCACATGGAGCATTCATACTG
-CCAGTGACAGTACCATAGTTATATGGAATTAGAAGTTCTAACTTATCTTGGCCAAACTAAAGACTTAGGGCTGGGTAGAA
-GGTTGGAGGGATGTAAGGTCATTCTCAAGATCTCATCTAGGAGAAGAAAACAAAATGGGGAAGTAGAAGACAAAATGCTT
-TTTTAGGTTGGGAAAGGACTGGGAGAATCAAGCATCTAGAAATGGGCACAAAGAGTTACCTTATTTTATTTAAAAGAAAA
-TAAATGTTTGACTATTAATGCCTGAGAACGGAAGGTGATTATTAATGAGATGAAAAAGTTAATCAGATTCTCCAAGTTAG
-GAGGGACTTGAAGACCAAATTGATAAAAATAAAAAAAAAGATGTCATAGTAGAATAATCTAGATAATAAGCAATCAATGA
-GACTGAAAAAATAAAATCAAGTATATCATTTGTTACACTAAATATTAATATACCAGATTCTCTCATTAAAAAAACAGAGA
-AAGTCAAATTGGATTAAATAAGAACAAAAAGTTAGCTATATAGTATTTATCAGAAACATTCTTATAAACAAATTGATAAT
-GAAAGATTAAAAATAAGAGATTTGAGGCAAGGCAAGCAAAAAGAAATAAATGTTAAACAAGGAGAAATTAAAGGCTACGG
-ACATTACCTAAGGAAAAGGATGACATAGAGTTACAGTGGCAAAAGTTAGGAAGCAGATGACATAAATCTATATGCACAAA
-CAGTATGGCCACAAAATACATTAATTAAAAATTACTAGAAATATAAGATGACTTTGATTAAAATACACTGATTACAAGGG
-ATTTAACATATAAAAATTAGGCTGATGTGGTAAATTTAAATATAATCAAATATTTAGGAAAATAGAACAACACAACAAAG
-TTGATTACATATATTCATTTTCCAGATAGTATACTTTATGCCTATGAAATAGTTCTTAAAATCAATTATATATGGCCGGG
-TGCAGTGGCCCACGCCTGTAATCCCAGCACTTTGGGAGGCCAAGGCAGGTGGATCACGAGGTCAGGAGATCGAGACCATC
-CTGGCTAACACAGTGAAACCCCGTCTCTACTAAAAATACAAAAAAAAAAAAAATTAGCTGGGCGTGGTGGCTGGAACCTG
-TAGTCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATGGCGTGAACCCAGGAGGCGGAGCTTGCAGTGAGCAGAGATTGCA
-CCACTGTACTCCAGCCTGGGCGACAGAGTGAGACACCGTCTCAAAAAAAAAAAAATCAATTATATATTTAAACACACACA
-CACACACACACACACACACACACACACACACACACACCTTTTCTAAAAAATCGGGATTTAATAGACATATTATCTGATCA
-TAGGCTGTTGAAGATAAATGATTTAAAGGTGGCCTAAAGTTTAAGTACTTGCAAATTAAGAAACATCCTCTCCACATCAA
-AGAGAAAATCACAACTAATGTTACTAATTTTCTAGGAAGCAATTTAAAGAACACTAAATCCAAAACCTATGAGACACAGA
-TGAAACTGTGTTCAGGGGAGAATGTATAGCCTTAAATGCTTACATTAATAAAGTAAATGAAAGAAAAAAATAGTTTTTAT
-CCTAGGAAATTAGGAAAAAAGCAAATGAAGTGAAATATACTACTAAGAAATAAAGGCAAAATTACTGAATTTCATGAAAT
-AGAAAACAATAAAATATATTAGAAAGGATAAAAAGGATTTTAAAAATCTGCTCTTTTAAAGAATCTGTAAAACAGAAAGC
-CTTATGGTTCAGATTAAAGAAAAAAAGTTTGTGTACGTGTGTGTGTATGTATTAAGAAAGGAGATATAACTTCACAATCA
-AAGAAGTTTCAAAGAATTGCAGTTACATGGCAATAAATTTGAAAACTGAGAGGACACAGAAGATTGTGTAACAAATTACA
-AATAATGAAAATTGACCTTATTCTGAAGTAGAAAACAGGAATAGATCAAGTTTCATGCAAGAGTTTGGAAAGATGATTAA
-AAATGTACCCTCTAAAGAGCAAGCTGGGCATGGTGGCTCATGCCTGTAGCCCTAGCTACATGGGTGGCTGAGGCAGAAAG
-ATCACTTGAGCCCAGAAGTCCAGAAGTTCAAGGCTACAGTGAGCTATGATTGTGCCAGTGCCCTCCAGAAGAGAGAAAGA
-AAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAGAAGGAAGGAAGGAAGGAAGGGCAGAAAGCAGA
-CCAGACCAGATTTCATAGCTGTATTCTGTCTATCCTTAAAGAATAAATAGTTCCACTTATATTTTAAATATTCTAGACGA
-CAGAAGAAGGAGGAAAGTTCTTAGGAACCGATAAGAGAATTCAGAAGAACCAAGATTCAGTAGCCTACAAAGAATGAAAA
-TATGCTCATAGCAAGACAGCTTTTGAGATATTTATTTCAAATTCACAAAAACTCCCCCATGCAATCTTAAAGAGGCTTTA
-CTTTATTTAAGCCAAAGAAAAGTGCAGATCCTGATATGAATATATTTATCTACAAAAGGCTCATATTCTGAAGTAATACT
-ATTCAACTCTCATTCATTCAAGAGCTGTTCTGTAATTGTTCCAATATAAAGGAGTCAAAACAATTTCTTAATGGAAGTAT
-TAAGTAGTGCTCTATGTTGTCAACTAATTTATTTCCCATTTCAAACATTAGTTGACATGTTTTCATTTCTCTTTTGGAAG
-GAAACAACTAAATATGTTATCAATCCATCATTTACTTGTACAATAAATAAAGTTCTAAATCACTGCACAGTGTAAAATGG
-CAAATAGACTTCCCCATAACACAAAGCCATCCTGAAAAGTTTTGTTCATTTTAGAAGAAAAAATTTTAAAACCTGAGCAC
-CATAGGATATGAATTTTGTAAATAATTATGAAAAGAAAACAACAATAATAAAACTCTACTAATCTTAGCTCGATCTTATA
-AAAAGTTCCATAATGAGTAATCAAATTTTATTTCCAATTAAATATGTTATCACCCAGTAGTATGCCATACCAGTTTCTAA
-TTCATACTTCAATTATCTTCTAATTTAAATTAATGACTATAATTGCTGTTATAAAACAACAGCTCTATAGCCTGCTATTC
-AGACCAGTAAATAAGAGTTTAAGGGCTTGTGATAGCAAATGAAGTTTCTTATTGGATTTTAAGAAAAATTTTTATAAAAA
-TATGTGAGGTTATTCAATAGAATCACATTTAATTTGCCAAGCATTTTGCAGAATGCCTAGGACTATGTAAGAAGTATTAA
-ATTTGCAAGCCCTTTGAATAGTTGTAATTTAAAGATAAAAATTGGTTTAATACCAGACAAAGATAGAAGCACAAGTTAGG
-TTATTAGAGAATTTAGCCAGTGTATCAGTTTGTATCGTAAGTCATTGGCAAGAACAACGTGTACTTTTCTGTCACCTCCC
-AACTAGCTATGTTTTGAGCAGTAGGAATATTTAATACCCCTTCCTCCCATTTTTCCTTTGTGTTGTCCAAATTCTGACAA
-CTCTACTGCCAGATAGCTCAGGGCAAAAATGATAAAGTTCAAGTTAAGAAGGCTCTGCAGTGTTCTCAGTTCTCCTCTGG
-TGAAAGAGGAGAAAGGTTGTGTTTAATTATGAATCTGGGATTTCCAAAACTTTACCCATGCCCTGCCTGTCCCCTCATTA
-GCATGAAGCTGTTATTTAAATAGTTCAGCAATAACGACTTTAGTAGCCTCCCTAGGTTAAAAAGATTGAAATTAAATGTG
-TTTATCTATTGTTCTACTATTCAGTTACCTGATTATAAAATCAAAGATTATTTCATGAAACTCAGTACCCCTTCAGGGAA
-AAAAAAAAAAAATTCCCTAAAACAAAGTTAGGAGAGTGAATCGGACCACATGCTTATCTCCAAGGTCTCAATCAAACAGC
-AAATGCTTACCCAACTTCTATTCAAAATATTTGCGCCAGTAGTTCTGATATGACCCAAGCAGAGTTCACACATTATTAAT
-CTACTCCTTTCAGTCTTCTAGATGTGTTTCCTCCAAAATCTACCAGATTCTCAAATAATTTCAGGAACTTTCTCCAGAAC
-AGAAACAAGGTTGTTACTGATACCAACTTTGTCTCCAAACATGGGGAAGATTATCATTGGAAAGATCTATTGATGACCTA
-TAATACATAGTTGGAACTGTTTATCCACAGAAGTATTCCCCAAGAATCAACCACAGAGCCAAGATGGAGCTTATGTCATT
-GTTATGCATACTTCTTTTACGGCTTGTGAGGGCAGTTCATACTATTCTGATTTTACAACTGAGACCCAAGGAACCTGAGT
-GACTTCTAGGCTCCATTATGTCAAAAAAAACTCAAATGTGAGGCTTTGCCTACACTGAGAAACAGTAGTTCAAGAAACGG
-TGCCCTGGTTCTGTTAAAATAATCTGAGAGTTATGTGGTAAGTAGTTGAGAGTGAATAGGGTAGCTTTGAGAGGTGACAG
-CGTGCTGGCAGTCCTCACAGCCCTCGCTGGCTCCAGGCGCCTCCTCTGCCTGGGCTCCCACTTTGGCGGCACTTGAGGAG
-CCCTTCAGCCCACCACTGCACTGTGGGAGCCCCTTTCTGGGCTGGCCAAGGCCGGAGCCGGCTCCCTCAGCTTGCAGGGA
-GGTGTGGAGGGAGAGGCGCGAGCGGCAACCGGGGCTGCGCACGGCGTTTGCGGGCCAGCTGGAGTTCTGGGTGGGCGTGG
-GCTTGGCGGGCCCCGCACTCGGAGCAGCCGGCCAGCCCTTCCAGCCCCAGGCAATGAGAGGCTTAGCACCCGGGCCAGCA
-GCTGCGGAGGGTGTACTCCGTCCCCCAGCAGTGCCAGCTCACAGGCGCTGCGCTCAATTTCTCACCGGGCCTTAGCTGCC
-TTCGCGCGGGGGGTGCTCGGGACCTGCAGCCCGCCATGCCTGAGCTCCCACCCCCTCCATGGGCTCCCGTGCGCCCGAGC
-CTCCCCGATGAGCACCACCCCCTGCTCCACGGCGCCCAGTCCCATCGACCACCCAAGAGCTGAGGAGTGCGGGCGCACGG
-CGCGGGACTGGCAGGCAGCTCCACCTGCAGCTCTCGTGCGGGATTCACTGGGGGAAGCCAGCTGGGCTCCTGAGTCTGGT
-GGGGACGTGGAGAACCTTTATGTCTAGCTCAGGGATTGTAAATACACCAATCGGCACTCCGTATCTAGCTCAAGGTTTGT
-AAACACACCAATCAGCACCCTGTGTCTAGCTTAGTGTTTGTGAACGCACCAAGCCACACTCTGTATCTAGCTACTCTGGT
-GGGGCTTTGGAGAACCTTTGTGTCCACACTCTGTAGCCAGCTAATCTGGTGGGGACATGGAGAACCTTTGGGTGTAGCTC
-AGGGATTGTAAACGCACCAATCAGCGCCCTGTCAAAACAGAGGACTCGGCTCTACCAATCAGCAGGATGTGGGTGGGGCC
-AGATAAGAGCATAAAAGCAGGCTGCCTGAGCCAGCAGTGGCAACCCGCTTGGGTTCCCTTCCACACTGTGGAAGGTTTGT
-TCTTTCACTGTTTGCAATAAATCTTGCTGCTGCTCACTCTTGGGGTCCACACTGCTTTTATGAGCTGTAACACTCACTGC
-GAAGGTCTGCAGCTTCACTCCTGAAGCCAGCGAGACCACGAGCCCACCAGGAGGAACCAACAACTCCAGAAGCGCCGCCT
-TAAGAGCTGTAACACTCACCGTGAAGGTCTGCAGCTTCACTCCTGAGCCAGCGAGACCACGAACCCACCAGAAGGAAGAA
-ACTCCGAACACATCCGAACATCAGAAGGAACAAACTCCAGATGCGCCACATTAAGAGCTGTAACACTCACCGCGAGGGTC
-CCTGGCTTCATTCTTGAAGTCAGTGAGACCAAGAACCCACCAATTTTGGACACAGTTTGACAATAAATTTACACTCAAAT
-ATCTCTAAGGAATCAAACTTACAGATTAATAATTAGTAATCAGGTCACGTAAAGTAAATTATAAAAGAGCATTGATACCA
-AGATTGGCAGAAAGTTTTTTGTGTGACAAAACCAAGTTTTGGCTAAGATACACACTGCTGATGGGAGTCTAAATTGCTGT
-ATATGTCGGGAAAACAAGTTGTCTTTATCTTGATGTTATAAATAACCTATGACCCAGAAATTTAACTCCTAGACATATAC
-TCTAGTGAAACTCTTGAACGTGTGCGTCCAAAGACATTTATAAACATGATCTTAGTAGTATTGCTTTTAGTAGCAAATTC
-TGGAAACATCCCAAATGTCTATCAATAGTGGAATTGATTTGAAAGGGGTGTGGAATGGTAATATAATGGAATAGCCTACA
-GCTGTTTAGATAAAGGAACTCCAATTAAACATACCAACAAAGATACATTTCAAAAACAAGACGTTGAAAGGAAAAAAGTC
-ATCAAAACAATACACAACATTCTACCACATTTTTATAAATTCTCAAAATATGCAATATTAAACATGCATTATTTAGGGAG
-GCATTCAATGTAGCAATGCATTTTTAAGAGGCTGGGATGATAAATGTAAAATTCAGAACAGGTATTATCTCTGGGAACAG
-GAAGAGGAGGATGCAGTGTTGGGAAGAAATACATATAAGTACAGCAGTAGAGGCAGACTTTTTTTTCCTTTTCCTTTTTC
-CTTTATTTTTCCTAGCTTTCTTTTTCTTTAGCTATGGTATTTCTTTAGCTATGGTATGGTATGGTATGTACTTTCCATAT
-ATCATACAGTATATTTTGGTGTGCATGAAATAGTCCTTAATAACATTTTTATTATTTTTTATTTGACGTTTAAGTTCAGG
-GGTACATGTGCAGATTTGTTATATAGGTAAACTTGTGTCATGTGGTTTTGTTGCACAAATTATTTTCTCACCCAGGTATT
-AAGATTAGTACCCATTAGTTATTTCTCTTGATCCTCTCCCTCCTCCCACTCTCCACCTTCTACCCTCCAATAGGCCCCAG
-TGTGTGCTGTTCCCCTCTATGTGTCCATGTGTTCTCATCACTTAGCTCTCACTCATAAGTGAGAACATGCAGTATTGGGT
-TTTCTGTTTCTGCGTTAGCTTGCCAAGGATAATTGCCTCCAGCTCCATATTCCTGCAAAAGACATAATTTTGTTCCTTTA
-TATGGTTGCATAGTATTCCATGGTGTATATGTACCGCATTATCTTTAGCCAGTCTATCATTGATGAGCACTTAGGTTGAT
-TCCATGTCTTCGCTCTTAACATTTTTAAACAGTCTCTGAGTAGAATAGGGTAGGCTGGTGTAAGGAATTACTGTTTTTAA
-TTGGAAGCAATTACATACTGCATTAAAAAGCATATATATATAGACACACATATATATGTTTTACATTCACATAATCAAAC
-CAAAGCTTTCAGAATTTTCCGCCAAAAAGCATGTGTGGAGGGAGAGAGAGGGGTGTTATGGTGCATTTGTAGGCCCTGAA
-ATAAAGTGATCTCCATATTTGCTTCCATTTGTGTATAAATATTTTTTAAGCATATATGCATCCTAGAGTATGGAAAGAAA
-ATTTCTGGGAAGATTTGCAAGAATCTGTGGCAGTTGAGAGTAGGTTCACTTTCGCTTTATTGTGTAATTTATTGTATTTT
-TCATTTAATTGTACTTTGTAAACTAAATATTTATTGTATATTTTACTTCATTTTTTAATTGCCATATGCAGCTTTAATTT
-TATAACTAAATTACGTTCTGACCCAGGGCAGGAGGTGGGAGAAGAGAATGAGAGAAGGGCGGAATCCTCAAGACAGCAGC
-ATTCTGCGCTCCGCCCTGGAACACCCAGCGCAGCTACCCCATCCCGCCCAGGCCGGCCACCTGGCGTCGAAGCCAGGCGC
-GAGGGGCGGAGGCGGAGGCGGGGGCGGGGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCGGAGGCG
-GAGGCGAGCACCGCCCCACCGCGCACGCTGCGGTTGCCCCGGCAGCCGCGCCCTGCGTGGCGGAAGCTCACAATCAGCCC
-GGTCCCTCCGGCTTCCACCCCGCCCCCTGCGCTCACCTGCCCGCGCGCTCGCCTTCCGGGGACCCGGGGCCCATGGACAC
-ATACACCCAGCCCTGCTGTCCCGCGCGCCAGCTCACCAGCCCTACCCAAGGGACATCATTCACGCCTGGGCGCCTCCGCC
-GGGCTCCGGGAGCCCAAGGTCGCGGCTGGGCCAGCGCTGAGCGTCAGAGGACGAGAGCAGGGGCCTCCCCGGTCGCCCCA
-GCAGGCCCAGGCACATAGGTGCCCAGAGATCCCTGGCTTCTGATCGCCCGGAAGACTAAGAGGTGAGCATGACACATGGC
-TTTTCCTTTGACGTTACATCTCTACCCCCTCCACTCCTCTCTTCTCCAGATTTTTCTGGAGACTAAAAAGTGGAAAGCAC
-AGTAGAGAACCCCCAACATGTAAACTATCGCTTACACTTGTGGGTGAGCTGAAACCCGCAAAAGTTTGGTGTATTCATAA
-GGAGCCTATATTGAAGGACTTTGCTAAATGTTTTACAAGGATCATATCTCATTTCCTTTTCACACAGTCCCATGAAGTGG
-GCACCATTGCTATTGCCAGTTCACAGATGCAGAAACTGAGGTAAAAACTAGGTAGGTAGCATATCCATATTTATATCCAA
-CTAGTTTGTGTAAATAATGATACAGGGAAGGGAGGATCACAACGGATTTCCCCACCTCAAACCCTACATTCCACTGTACC
-AAGCTTGTCTTCCTCCATTCCTCTTTCTAATGATCCTTCCTTGTCGCACAGCCCCCCTTTGAGAGTTAAATGACCTGAAC
-ACACACAGATTCCCACAGATTTTCATGTAATTTCCGAGTATTCAGACCCCGAACATGGACCTCAAGTCAAGACATTCTGC
-TCTATTCCACTACCTTGGTAGATGGTTAGATGTGACTAAGGTGGCCCAGGGTCATGCTGGGGAAAAGTACAGGTGTGCTT
-GTATGTGGAGGATCCTATATGCTGCTCAATTTACAAGGAACCCAGGACCCAAGGGCTACACTTGTGTGATTTCCTGCAGT
-GGGGTGAGCTCTTGGTCAGTCTTAGCAGTTGATTGTGAAGGACACTATACAGGGTGCTGCCCTCTCCCCAGCACTTCAGG
-GCTTTAGCTGGGAGGGAGGCAGTCCACAGGAAACCGACCCATGGACCTACTGAATTCATCACTGTAGCTGCTAATTAATT
-CTCCGTTAGAGATGGGTGCTAACAGAGGCAACATTGAAGTCCCTGATTGGGAAATCCTTATTTTCACAAATCAAGTGGCA
-TTGATTCAGTCTAATCATTACCTATGTAGGAGCATCTTGCCCTATTCCATAGATGACACATATACATATGCAGTATGATG
-ACACCGCACCTAATCGGAATATGGCCGATAATAATAAAACAAGCCATAAATAGCAGCTAAGGTGAGTGTCACCAAGCCGT
-GCAGCAAAGTCCAAGTGGATGACTCTGAGGCAGCCTCAGTTGGTTCCCTAGTCCACCGCATGTTATAAACAGATTAAAAG
-GCAAAGGAGGCCTGGCCCGGTGGCTCACGCCTGTAGTCCCAACACTTTGGGAGGCTGAGGCGGGTGGATCACCTGAGGTC
-AAGAGTTCAAGATCAGCCTGGCCAACATGGTGAAACCCTGTCTTTACTAAAAATACAAAAATTAGCCAGGTGTGGTGGTG
-GGCACCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCAGGAGGTGGAGGTTGCAGTGAGCCG
-AGATTGTGCCACTACACTCCAGCCTGGGTGACAGAGTGAGAGTTGGGCTGAGGGTCGAGGGTCATGGGATAGGGCGAGAC
-ACCAGGGGAGTGTGTGAGGACAGAAAAGAGTCTTGAGGACCTAGCCCTGGGCACCCAACATAGGCTTCTTGAAATGGGGA
-GTCAGCAAAGGAGCCTGAGCAGGAGGGGGCATTGGTGTTGGATGGAAGCAGGCGATGGAGATGTTGTGGTGCCTAGAGAG
-ACACATTTAAAGGAGAGAGAGCTCACTGCCGTAGAGAATGTAGGTGAGGGAGCAGGCTTGCGATGGAGAAAAATGGTGCA
-TAGTTTCAACTTTTGTAGTAAGATGGAATCTTTTCATTGCAAATGTTGGAAACTTAGCTAACTAGCTTATACCAAAATAA
-GGTGACGGGGGAGAAGATGTATTTACCCACAAAGTGGTAGATGGCTTCTGGCACCATGGAATCCATGTTGCAACTAATGC
-CATCAATCTCAGTCTCTCTCCATCCTCCAAGCATGGACTCTCTCTGTGGCACCCAAGAGAGCTACCTGCGCCCCAGCCCC
-ACACCATACTGCTTAACAACTTCAGCAGAATAGTCTTCCCTCATAGTTCTGGATGATGGGCTGCTGATTGGTTGATGTCT
-TTTATGCACATATGCTTGAGCTTCAGTGTACCTGGAAAGGGATGGTTCCCTCAAATGGGCCAAGCCTAGGCCACAGACGC
-TTTCCTCTGGCAGGGGACAGAAGGGACAGCCCCATCCAAACGACCCGGATAGGATTCCCTATGTGATAATGGAGTTCTTT
-TCTCATAAGAAATGAAGAAACAACTGGTCATACCTAGCATGGCCTGCTACTCAATCCAAAAGATTTTCCGTACAAGGAGG
-TAAAATTACATACTAGAATGCCCATCACAATTTAACAGGGAGATTGTTTATGAAGATTTGCAGTTTCCTTGCAGCCATTT
-AACTACATCTTTTCCACTTAAGATGACATAGGAATCACTCATCACATCTCTGATATGTTACAGAGCCCAGTAGATTTGTT
-TATAATGAACACCTCAAAATTATATGTTTTTATAACACCTTAAAACTATTAAAACCTGCATGATCTCTCTATTTTGCTGG
-TGTGAAACCATGTAGATAGATGGTGGGAACTCAAACCCTTACCATGGCAATTTAGTTAACCTCAGCTTCTTCATGGTAAA
-ATGGTAAAGTGTGATGAGGAGGGAAGGTTAAATGGATAATAAGAAAACCACCTGGCAAACTATTTTTAATTATGATGGAA
-GATTTGTTTGAACTGTTTTAACTTTATGCCCACTCAATATTTTTGATATTTATGTATAAATCCTACTTTCTGAACATTTC
-TTAAAAAACAATCTCTGTTCTTAAGGAAGTTCCAAAATATTGTTATTTAATCAAAATGAAGATGATAAAATTAACTTTGA
-GTTATTTTTCTTTTTTGTTGCTTCAGCTTTAGTTTTGGTCCAGAAAGCATTTTCAAGGAGCTGGTCAAGCATGGCTTTAG
-CAGATAAGAGACTTGAGAACTTACAGATCTACAAAGTTCTTCAATGTGTGCGGAACAAAGACAAGAAGCAGATAGAGAAG
-CTGACCAAGCTTGGATACCCTGAACTAATCAATTATACAGAACCCATTAATGGACTTAGTGCTTTGCACTTAGCCTCAGT
-TTCCAATGATATTGATATGGTCAGCTTTCTCCTTGACCTTGGTGCTCACCCTGATGTGCAAGACCGAATGGGCTGTACTC
-CCACAATGAGGGCTGCAGAACTGGGCCATGAATTGTCAATGGAAATATTAGCAAAGGCAAAGGCTGATATGACTATAGTT
-GATAATGAAGGAAAAGGTAAAAATCCCGACATCCTCTCCAGCAGATTGCAATTCATTTTGTAGCCAGAAAGCAATAACAT
-GGACTCTTTTTGTTTTCCAACTTTAGAAGTGAATTACTTATGGTTTTAAGGGAAAGGCTAAATTCTCACTCCTATACCTA
-AACCTACTGTCTCCTCATACTTTGAAAATGAGATAGCTATATCTTAGGGAAATCATTTATGAGAGCTTGCTCATATACTT
-AGATTAATTTGTGTTTGGTGGTTTCTTTTAAATGAGGAGAATTTTGAACATTATACACACTGATTATTCATTATAAATTA
-TAAACTCTTCTTTAAAACAAAGATGAAGTAGAGCATTTCTTATTCTTTTTTACATTTTAGAATTTCAGGCAGTACTACAC
-CTAGGACTCCAAAAGGATTTTGACCCCCTCAATAGCAGTCTGATGTAGGAAGGACTTGCACTTGGAAACTTGAAAGGACT
-AAAGTCAATTCTGGCATAAACTCCAACTTTCTAGGATCATTTAAAAATGTATTTGGAAATACAACTTCAAACTTTAGACA
-TGACCTTTCAACAATGATTCAGATCAAACAACTGCACTTCCACACCGTTAATCCCATCATCTCAAGACCATGGTCTGAGG
-ACTTCTTGCCCAAATAACTTAAGGTTCAGGCAAGAATTGACACAGCCTCATAAAAATAACTGAGATAATTACCAATAAGC
-TTAATGTAAACTGATAGGTTTGAGCAGTTGTCCTGAGTTTCTGCAGATACAAGGCCATTAACATCAGCTCTGCAATCGAG
-AAATGAATCTCATTTGATAATGTGAATATTTACTGACAAGAGCAAAATCTACTTTTCTAACTCTCTCCAGACTTGGTGTT
-TGATATGATTACTTGCTTAGAACAAAAGAGGACAAAGAAAAGGGATAATTACATATTTAATTGTACCACGTAAGAAAATA
-AACTTCAGATGCATTCAGGGGCCAGATGTACTTTGAAATGCTAAATCCTGAAAAAACGGTATCCTCTCAAAGCTCTATAG
-TATACCATTTCCCAAAGTGTGTTCCATGGACCACTGAATTGCCAGGATGTTGAGAAGTACTACAGGCAAAATTGGTTCCA
-CGGTCGCATTCATTAGAGACACATTTTAGGCATTTATCTTTCACATTGTTGGCTCAAAAATGGTGACATTTTCCATATTT
-ATTTGACCACAAAATAATTTTTTTTAATGACATCTTATATGCCTGGAGTTTTGTGGACTAACCTTTGGGAAACACTATAA
-TAGAGAAACGTTTAACTTACTGAGTTTGAAACAGATACAAATCACAAAGAAAAAAGAAATTCTATAGTGTAACAATGTAA
-AAGTGTAAATTTTTTTTAAAAAATCAAGGTAAAATTGGAAACAAGGTCAAGTAAATACTTGCAGCAAATGCAACAGGCAT
-ATGGCTAAAGGAAACAAATCTCATGGGCAGAACTGAAACTATAAAAGGAAACAAATGTAAAATCTTGTTTCACACATAAG
-CTTGTTAGGATGGCTGCCTGCAGCCCTCACTCTGCATAACCCAAGGTAGTGCCCATTGTACAGAGTACATTGTCTCTTCC
-CACATCAACAAGGCTCACTCAGCTTGCACATCCCTCAGTTTGGCTGCCAGTGGCCAAAGTGCTTTGCTTATTCCACAGTA
-CCCTCTCTGTCATTGACATCCTATTTTCTGGTGACTCATGTTTGACTCACTGTACATCGTTCCTAAAGGATAAGCAAACA
-TTTAAATGGCTAAGTGGGTCTTTAGGATGTGAGACATGCCCTAGGCCTAAGCGGCACTTTCTCTTGGAACAGTTTTACAG
-AATATGGAGAAGGTAAAGCTCTAAGCCAATACATTCTTTCTTGTATGTTGTCCTAGGGAATTAATTACAATGTGGAATCA
-TTCTCCTTAAAAGTTAAGCTATAATAGTTCCTTATAGCACCCATTCCCATTCCATTGGTTTTTGCATTTACAGGCATGTG
-TACTCAGTCCTCAATGCCGTATGCCAGTTCTATGATAAGGTACAATATTTTTCAAACTGTTTTCCCTTCAATTTAGGAAT
-GCTGATTCGTGTTCTTTGTGGCTTAAGGAGTCAGCCCAGATACACTTTAACTGTGTGTTGCACATGCCATCATTATGAAA
-TATTCATTTCATAAGTGGCTCTGGGCCTTTTGTAATGAATTCAGCCTCCTCGGGTATTATGCTTAGGTTGTTTTGCTGTT
-GCTGTTGTTGTTTTGCTCTGTTCCTGCCTTCTATGTCTTGCTCTTTCTTTGACTTTCTCTTTTCAATAATAACCTTGACA
-ATCTTTTCTTTTTTTTTTTAACTGTTCTGAGTAACCCTACTTTAGGTACATCAGTTTATATAAAATATATTTAGGTTTTG
-ATTTTCATATACATTTTATTTTTTATTTTAATGGTGGAATTTATCCAATTTATAGTTATCTAGATTTCCCATAGGGTTGG
-TTTCAGAAACATCATTTATTTTATATTGTGAAGGCAAAATATATCTAATATATAAAATACATGTGAAAGTATTGTCATAT
-ATGGTCCATAGATTTGTTTTACTTTGCTGTATATGTGTGTTTTTCTTTATATGCTTGTAAGTGTATTTTCTAAAATTGAT
-GGGCTTTTTAGTTATTTTAGTTTTTTTATTTTTTTTTAGTTATTTTAATGGTTAACTTGATACTTCATATGCCCTTAAAC
-CTGTTTATTGAGTTAGCATCTTAAACAGTATTCATTGATTCTTTACTCTGTTTAGTAAGATTAGTACAATAGTATAAATT
-AGATAAGATTAGTACAATAACCCTTCCTCTTACCTCTGCTACTTCCCTTCTACCACTCAATTTTATACTCAATTATAATT
-ACTTAGTTCTTTCAATGATTCCCTTTTAAATAATAAGTACCTTGTACTTTATTTCCTTACCTGCTTTACATAATATCTCA
-GTCTTAGCCCTAAAAGATGAGAAGATCAAATACTTATACTATTTCTCCTTCCTTCCCTCAAATTTTTGATAAATTATATT
-ATTTTTACATTATTACAAATTGCAATATATTTTTCTCTATCTAAAATTGCTAAGGTGACTTAGCTTTGGTTCTGTGGCTA
-AAGAGATTCAGTATTTATGACTGTTCTTTTAGTCACATATTCTCTATTGATCTCTTGGAAAACTCACTTTTGCCATCAAG
-TAGTTTAAGTCACTTCTTTGGGCTTGTATCCCTGATTACTTATATCCTTAAGACTATACATGTCTGTTGTTTTTACATGA
-ACAAAGTCTTGATTGGGTATAAAAGTTTCCTGTTTTTTTTCCCCAAGTTATAGTGTAGAGATCCTTTGATTATACTGTAG
-CATTGAATGTTGTTGTGATAAATTTTTGAGGGCAGCTGGACTTTTCCCCTTCATGGATTAGTTGAATTTTTGCCTGGATT
-CTTATGAGACACTTTCTTTGCCTAGCTTTACCTAGGCATGCCTTGTTGACTGTTCTTAATCAACTTTTCCTAAGACCCAA
-CGTACCCTTTTAATCTTAAGATTCAGGTCTATCTTTGCACTTTCATTTTAGAACAAGTTATATTTAGTTTCTTTGCTATC
-ATGGAAATGAATTAGCCAGTAATTTTCACTGGTATATCTTTTCTAGTATGTATCCTTTTTGCGTGGCTTTCAGTATCAGT
-TTCCTTTTTCCTTGCAGTATTTTTTTTTAATAGGTTGCATAGTGGTTTCTTTTTTGGTTATTCTTTGAATGGAGTCCCTT
-TTTTGGAATGAACTCGTTACAAAGTCAGTTTGGAGTCTGATTGTTATTTACCTAGGACTTTCTTAGTAACACTCTGCCCT
-GGGTTTATAACAGTAACCCTGATGTGTAGTATGCTTTTGACATGGATTATATTGAAGGCCTGTATGTTACAGGTCCTGGG
-TGTAGGGATTTAGCATGTTCCTTTCTCCAACGGAACAAAATGATTTGCTAAAATGGCAGAGGCACTTGCCATCTAATTAG
-CCACTTGGCATCTAATTCACCTCTTTACTGCTATACCGACAGCCTGCTTCTTACAAACATGGTCAGTCTACACATTTCAT
-CACCCAGTACCATCTCTTTTGCCATTCTGCAGTTTTAGAGGGGACCGGGGGACTTACCAGTAGCCCTTTGGCACACATAG
-CTGTAGCCCTTCACATTCCAAGAAGGGACACTCAGGGTACGTATTGCAAGATGCCAAATACTCAGGGTCAACAGGGTTCA
-CCTATCAGCGCTCCAATTCTTCCATAAGCCAGGTCCTATCATATGTGGTTGTGACTGTTTTCTAACGATGTCAGGAATTA
-AGATTTTTTGTTTTTTGTTTTCTGTCTTGGTGTTTTAGTTGGTTTCAGAGAGGAAACTGAGGCAGATATGCCTTTAACTA
-GCTAAATATGGATTTTTAATAATTTTACTTTCCTTCCTGTCAAATATGTATAGATGTTAAATACTCTCTGGGGATTTTAT
-TTCTCTGCAGGTGTTTTGTTTTACTGCATTTTACCGACTAAGCGGCATTATCGCTGTGCTCTGATCGCCCTTGAACATGG
-TGCAGATGTCAACAATTCTACCTATGAAGGAAAGCCAATATTCCTTAGAGCTTGTGAAGATGCACATGATGTTAAAGATG
-TGTGCCTGACATTTTTGGAAAAAGGAGCCAATCCTAATGCAATCAACTCAGTATGGCTATTCTTGTGATTACAAATATTT
-CTTGTTTCAATTACAGCATAGTATAATCTTTTCATTTAAATATGATGACATTATCCTGTTAGCTGATAGACTGTTCATTT
-TGATTCAAAATGCTTGAAGATGGTATACGTTTATTATCTTCATATTGCTGTGATTCTACAGTCTGTTTCCTAATTATGTT
-TGGAAACTTGGTATTTATTATGCATAATGTCAAGGTACCATTATAGGAAATAGTAAAAAAAGGCATTGCTGATGCCTAAT
-AGGATTTATCTTCTTAGAAAGAAAATATATAGTTCTGCTGTTTCTTTTCTTTTTCTTTTCCTTTTTTTTTTTTTTTTTTT
-TTTTGGAGACAGCGTCTCACTCTGTTGCCCAGGTTGGAGTGCAGTGGTCCAATCTTGGCTCACTGCAACCTCTGCCTCTC
-AGGTTCAAGCAATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGATTACAGGTGCATGCCACCATGCCCCGCTAATTATTT
-TTTGTATTTTTAGTAGAGACAGGGTTTTACCATGTTGGCCAGGCTGATTTCGAATTCTTGGCCTCAAGTGATCTGCCCAC
-CTCTGCCTTCCAAAGCGCTGGGATTACAGGCATGCCCAGCCTAGTTCTGTTGTTATATCAATTTCGTTCACTCTCCTTAT
-TTTGAGTTTTCTTGTAATTGCCCTTTCTTGACACTAAACATTGATTTTCTTCTCATTATAAAACACCTATGACCTAATTT
-TATATTAGGTGTTGATATTTTATCTCTCTTTCTCCCTTTTTATTCTGCTCTATTTGCAAGAAATACATTTTTTAGCATGA
-TATTCTCACAGGGGCATGCAGTGTGACCTTGACTCTGATTTTAGAATTCTACGTTTTGGATACTGACCCATTGTACTTGC
-TTAATTTTTCCTCTTTGTTACATGAAGCTAAGAAAAATGTAGAGAACTAAACTTGTAAGTGTAAAGCTAAGGTCAAATGG
-ATTCAGACTGTATTTGTACTGATTCTGCTACTTAATATGATGGGTATAAACAGCATCTCATATTGGACTATTTCATGTCC
-AGTCCACAGGCCGCACAGCTTTAATGGAAGCGTCAAGAGAAGGGGTAGTGGAAATAGTTCGAGGCATATTGGAAAGAGGA
-GGTGAAGTGAATGCATTTGACAACGACAGGCATCACGCTGCTCATTTTGCTGCTAAAGGAGGCTTTTTCGATGTAATAAT
-CTATTCTTTGCTTTAAAATTTGTTGCTAAAACTTTTCTGTCCTTTTTCTCAAATTTTTTTATATGTCATATAGAGTACGC
-TAAGGCAGACATTTTTCTGAGTTACCTATGTTGTTTTCATCTTGATTTCCCCAAATAATTCTAAAATTATATTTTTAAAA
-ACTTCATCTCTTTATTTAGTTTTATGTGTTTGCTAATTTACTTATTTAATATTATTCATAGTATTTTTCTGTACACTCGA
-TGATAACAATTTAAAACTTCTGCCACCTGGGACTACTGTATTTTATGACTTCATTACATACTAGAGTCTTCAAAATATAA
-TATGATCTAATTATGGGAGAACAATGCCCTCATACTCTTATCTCCATGGTGTTTGTGTGTATTAGATAATGATATACCTG
-AATTTTAAACTCAAGTATTCTGATTATCTAAACATACAGCAAAGAATATCTCACTGATACAGTAACATTGCAGAAACAAA
-ATAAAAACACTATTTTTTTAAATTCTGAATTTCATCTGAAATTTCTTTACTCAATTTCTTTGAGTTTTAACATAGTTATC
-TTCATTTATATCACTATTTTCCGTGCAATAAAAGTATACACAAAGATAGAAACCACGTTTGGTAAAGAATTTTCCCCTTG
-GATGCTGTTTTCCATGCTCTGATGCTTTCTTAAATTACCTACACTAACAAAAATGGTAGTGCCCCCTCTAAGTATAGAGT
-TTTCTATACTCTAGATCGATGCTATTTAATAGAACTTTTGGTGATGATGGGCATATTCTATGTTTGTGCTATACAACACA
-GTACAACACAATGGCCATGTGGCTTTTGAGTACTTTAAATGTGGCTAGTGAAACAAACAAATGAAACTTAAATATTTTCA
-GTTTAGTTCATTTCAATTTGAATTTTCAATAGTCATACGTGGCTAATTGATATTGTACTGGATAGTGCCGGTCTAGCTGT
-CAGTCTTTATATAGTAAATGTACATTCCTATTCCTCCACAATATCCACTATTTATTTTACAGATATTGAAGCTTCTTTTT
-GCCTACAATGGAGACGTGGGGCTGATTTCGATAAATGGGAACACACCACTTCATTATGCTGCCATGGGTGGTTTTGCAGA
-CTGCTGTAAATATATAGCTCAGCGAGGTAAAATTGTCTAGCAATTTTGTGCTTCAAGTACTTATGATTTACCCATGTCAT
-AGATAAGCAGAGAATTTGGGCCTATCACTTGTCAGTGGCTTATTTTTTTCTATAGCAAAACCTCACTCATATGTAGAAAG
-AAAATTGAAAATTATTTCTTATACTACCCTCTGTTAAATCATGAATCTGCGCTTAAAAGTGATGAAAACCCATTTGTCCA
-AAAATTTTAGGTTATTGTTAAAAACCTAAAGGGGATTGTTCCTGAGCCAACTAATTATTCAAATACTTATGGTTGAGGGC
-GGGGTGTGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGGCTGAAGCAGGTGGATCACTTGAGGTCAGGAGGTCAAC
-ACCAGCCTGGCCAACAAGGCAAAACCGCGCCTCTACTAACAATGCAAAAAAAAATTAGCCAGGGGTGGTGACGGCGCCTG
-TAATCCCAGTTACTTGGGAGGCTAAGGCACAAGAATCACTTGAACCTGGGAGGCAAAGGTTGCAGTGATCCAAGATCTGT
-GTCTCAAAAAACAAACAAACAACAACAAAAAACTTACAGTTGATTAAGTTCCTTATTTTAAAAATGCCAACATCAATCTA
-AAAAAGGACACACACTGGAAACCATTTGCTTTCATTTGAATTTTTAGTTTATTTTAAAAAATGTTCCATTGTGTCAAATG
-CAAAGATAACTTTTCTGGATAATTTGCAGTTATGGGGAAAATAATTTGGGGGAAAACATGAAATGAAAATTTTCATGGAA
-AATTTGAAATGTAAGCAGAATTTTTAATTTTAGATTTTCCTGTAGCTTTTAAGTATTAATTTAGAAATATGAACTATATC
-ATATATAGCTTAATGAGTTTCTTAAAATGAAAATATTAATTATATTTAAGGATATGTATTTTTTGTTAATTACATGCTAA
-TTAAATGCACATTAAAAGCTTTTTAACTCTGTTAGAGATAGAACTGCATTTTGCAGAACTGTATATATTTTTTCTAGTTT
-ATGAGAAATAGGCAAAAACTTAAAGTTCACCAACTCTATAATAGAGCAAAGAAAGTGTTTTATTTTTCTGTCTTTCACAC
-AGACACAAAATTTTAGAAGTCACTAAAATTATAAATAAAACTAACATGCCCGCATAACTATAATAGCATAATAACATCCA
-TTTTTACTTGTATGAATGTATACTTTCCCTATGTCCCCAGTGTGATAAACCCTTTTAGCAAATGAGAAAAAAATATATCA
-AATGCAATTCTGGTTCTCTCAAACTGTCTTAATTGGTTTTGTTTTCAAATCTGTCTCTATTAGCAGTTTATTCTGACATT
-TCAGATTTAACATTATGTATTTCTAAAAACTAAAGATCCACTCAAGTTGAGACGAATTTCTTTAACTTTAATATGTTGAC
-TTATTTCTTATTGGGACAAATATCACACATACGCTATCATTTATGTATTCCTGGAATAAAGTCACAGAAAGCACATTGAG
-AAGCCAAGGACCAGAGCCTGGGTCATGCAAAAAGGCCTAACTCAGTGATGCAGAAAAGATCCATTTTCCTAGAAGAATCA
-ATCATGAGACTATTTTAAAGCAAATGTTTGAAAATGTTCTGAGTTCTGTGCATGTTCGGAAATATAAACACGTCACCAGA
-TCCTATGTGGGTGACCCAGTTTCACAGCAGAAGTGTTGTCAGTTACATTTCTACCTTTAGAATCTTACATCTAAGGCAAT
-CAGAGCAGGAAGAAACCCTTAGTGATCAAATGCTTGTTTCTGAATAAGCTCCCTGGGCTTAGTCTCTTCTGTACTTAATT
-GTAAAGCATTTGTGCTGGCTGGATTCATTTCTCACATTTCCTCATGATGGTCCTCTTTCGCCCCCTCGTCCCCCTGCTGG
-AGCAATTGGCAACTCCCTGTAAGCATGTGAGAGCCACATCCAAGGGCAGAGGAGAGGAGCTCGTGGAGTCCTCCTCCTCC
-TCTTCCTGGGCCCTCAACTCCCTGAGTTCTGCAGCACCAGCCAGCTGGAAGTTGAACAACTTTACCACAGAGGAGCATAA
-GTCTCACAAGGAATGAATAGATCTTTATTTACTAATCATAAAGGAGGAGACAGAAAGCTCCAAGTCAAAACGACAGGAAA
-ACTGCCTTTAGCTCTTTAAAGTGGGATGTTGGAGTCTTTTATACACATGGAAGTTTCTAACTAGGATTAAGCTGGAAGCT
-GCAGAGGGTAAGCTAAAACAGGATGAAAATCCTTTGGTCCTTAGTGCTGGGTGAACATAGAAGAAGAGGCTTGAGAGGTG
-GGATCAAAACCCCCCAGACACCCTGAGTAAGCAAAATAAATAGCTAAGTAAAAACAGCATATCAGAATTAGTATGGAATT
-GCACTATGGAATTACTACGCTATGGAATTACACTATAGAGTCACTGTTCTTAAAACTATCCAATATAGAAATTTTATAAC
-CTTTATTGTCCCCATAGTCTTTTTTAGTTTTTCTACTACTAGTAAAATTATCAGCCTTAGTATAAAAATGTGTGTGTGTG
-TGTGTGTGTTTGTGTAGTAAAATAGATTTATTTTTCTTTTTTTACTTTTTATTTTTTTGATAGTAAGTATATATATTTGT
-GGAGTATGTTAAATGTTTTGATATAGGAATACCATGCTTAATAATCACATCCTCTAGAATGGGGTATCCATCCCCTCAAG
-CATTTATTCTTTGTGTTACAAATAATCCAATTACGCTCTTTTAGCTATTTAAAAACATACAATTGTTATTGATTGTAGTC
-ACCCTGTTGTGCTATCAAATAGTAGGTGTTATTCATTCTTTCTATTTTTTTACCCATCGTATACAATTTTAATTTTTGGC
-AATACTAAGGAAAGTATTAATCTTGAAAAACATGGTCTGACTGCTTCTTCAAAGTCTTACTTATACATATACTTATTATA
-GACAACACAGCCTTTTTGGTAGCACTAAATGGATTCCCTAACATGTTCAAAAAAGTTTATTTCTTTGGTGAATATTTATA
-AATGATGTTGGAATCATCATTTTGTTAAATAAGGGACCAAAAAGGAAAATGAATTTTAATGTCTAACTTGCACATAAATA
-TAATGCTGAACTCCTCAGATTTAATTACAATTACTTTTTCCTCTGTGAAGGTTGTTCATATGGCCATACCACAAAACAGC
-AGATTAGTATAAATTACATTATTTAATGAAGAATACGGAAAAAATATACTTAAAATTATACACAGATTTACAGTTTAAAT
-CATTCAAAAGGAAGTGGGTATTCTGCATCTTTTCAGGTTCAGATCTGAGTTCATAAGGTCCTAGGTAAGCTGTTTGAATC
-CAGCTTCTTTCCAAATTTAAATGTATCCTTGCTCTTTTCCTGTTGGCCTGAAGTCCCCTGAGCAAGTGTACCAATATGGT
-GTGTGTTTCAAATATCTCTAGGGATAAATGTTCTAATCCTATTGTAAATTGTAAACGTATCTTCTTCAGAATTCACCAAA
-GTGATGCTCACAGAAAAAAAAAATCACAGCTCAATTTTGTAATTATAACAGCAAAATGTGCACATCTCTATATACATATA
-ATTTGGGGACACATTTTTTACTAATCACGAGAAATTAAGAAAACAGTTGGATGAGTGTCACTTATAGCCATGCAAATGCC
-TTGGCACCATTCATAATTAATGATGCTTTATGTTTTAGGATGTGACCTGAAATGGAAGAATTTAGATCATAAAACGCCCA
-GGGCTGTGGCTAAGGAAGGCGGCTTCAAAGCAGCAAGCAAAGAAATACGCCGAGCAGAGAGAATCGCTAATAAACTAGCC
-AGGCCAGGAGCCAAAAATCCAAATCCACTGTGGGCCCTTAGACTGCACGATTGGTCCGTAGAACGTGAGGCTTTCCTCCG
-GGAAGCCTTTGCGGTTTTAGACAGGGGTGATGGAAGCATCAGCAAGAACGACTTCGTGATGGTGTTGGAGGAAAGGCAGG
-ATTATGCAAGCTCAGAACAGCTGGCTGCCATCGCTCACCTTCATGAGAAAACCCGGGGAGGAGGGGTCAATATTAATGAA
-TTCTTTAAAGGAACCAGATATTTAAACAAGTCTTTTGTCTTAGGATCGTATGGACCTAAGAAAAAGGAAAAAGGGATGGG
-CAAAAAAGGAAAGAAAGGGAAATTTGTCTTACCCCTTCCAATCTGTGTCATTCCTGAGTACGCGTTTCCACGCCGGCAGG
-ATGGTGGGCCACCGTATTACATGATTGAGACCTACAAGAATGTCACTGATAGCAGCCGGTTTAATAGAGATCATCCCCCA
-GAACATCCCATTCAGGATGACTCTGTTTGGTACATTGATGATTCAGAGAAGGTATTTTCAAACATTAATATTATCACCAA
-AGCAGGGGATCTGGCTTCTCTGAAAAAGGCCTTTGAATCAGGAATACCTGTGGATATGAAGGATAATTATTACAAAACTC
-CGCTAATGACGGCGTGTGCAAGTGGAAACATAGATGTGGTCAAGTTTCTTCTTGAAAAAGGGTACGCGTCTCCGTCGGGT
-GTGGCCTAAATTTTCACGAGTCTTCACATTTCAAGGAAGTGAAAAGATGACCGAATTTTAGTAATATAGAAAAGTGCTAC
-TTTATTAAAGTCTATAATAAGGCTTTAATATATAAAAGCCTTTTATTAACAATTAACTTATAGGCTTCATTAAAGAATGT
-TATTAAAGAATGCTTTATTAAAAATGCTGATTTATTACAGGCTTTATTAAAGTCTAACAAATGCCCTATAAAAGTATGTG
-TTCATATTACTGATGGCTAGGGTTAGAAAAGGAGAATTTATGTTAGATTTATGTTATGTTAGATTCCTAGCCCCTTTATT
-AAAGCCTATAATAAATTAATTAAGCCTATAGATCTTATATGGGAAACCAGGATAATGGGAGCATAGGATTGTGTGTGCAC
-AAATATATTTTGCCAATAGCAATTATGCATGAAGTGAAGGCCAGTAAGTGTTTACTCAGGGTGAATAGAGTCTTCTGATT
-ATTACTGGCCTTCTATCAGTGGCAGCACGGCTCAGTCCTGTCTCAGAGCTTCACCTAGATGGTGTGGAGTCACTTTTTAA
-TCTGCCTCTATTTGAGGATCTCAACAACTTCAAACAAGTGGAATGGTGGCTATAATAACATGCTTTGGTCCCAAAACCTG
-CTGCCCTCCTCCAGTGTGGGGCATCCTTTTCCTTGGTCATGTAAATATTTTTAAAATATCAAATCATGAGAGTTTTATAA
-TACTTAACTTTTTAGACTACAACAATCACTCAGGTTTAATTCCTTCTTCTACCATAGTTGTATAACCTGGGTGAGTTTCT
-TAATATTTTTGTGCCTCAGTTCTGTCATGTATGTAATGAGACTGTAGTGGGACTCATGCCACAAGATTAGTTGAAGATTA
-GATGAGTTAAAATATGTAAAGCTCTTGTTAACACAGTAGTTACATACTTGAGAAATAAAGTACTAATCTTATTAGTACTT
-TAATGTTAAAGAAAGACTCAAATTTGTATATTATCAAGAGAGCAACTAATGAGAATATGAACTTCTGGACAGTGAATTTC
-TAAAAAGGACTAAAATGTTAAATAATACATGGTAATATTTATAATTTATTAATGAAGTTTCATTTAAAAATGTATTACAT
-GCAGAGAAAGTCACAAAATGAAATATGTCCTGTCAGCTTTTATCTTCATTGGATCTGATTTTATAATTTTCCTTGATTTT
-AACCTTTGCAAATCGTAATCCCTAGAATCTAAAGTGCCTTTTAATGTAGATATACACAAAGAAAGTTAAGACTGTCAAAT
-AATGCAGAACAAAGAGGTTTGAAGAAAAATTATGGCACAAAGTTTACAATTTAGCAACTTGATAGAACTCTATGAAATCT
-TACTTTGCATTTTTAGTGTCCAGTCATTGGAAAACCGTATTTTTAGTTTGTTCATCTATCTTATTTTACAGAGCTAACGT
-TAATGCAACAGATAACTTTCTGTGGACTCCACTTCATTTTGCATGCCATGCAGGCCAACAAGACATTGTTGAGCTTCTTG
-TTGAATCTGGAGCTTTAATAGATGCAGCTTCAATCAACAACTCAACTCCTTTAAATAGAGCCATTGAAAGCTGCAGACTG
-GATACAGTAAAATACCTACTTGATATTGGTGCTAAATTCCAGCTGGAAAATAGAAAAGGTATGCGTTCATATTATTGATG
-ATTAGGGTTAGAAAAGGAGAACTTATGTTAGATTCTAAGCCCCTTCTGATTCTATTCTCGTAGGCTTGCATTGTCCACTG
-GGTTCCTGGTACAAACACAAGCCTGAGTTAAATGTTATGGAAGTTTATCTTATACCAAGTGCTTCTCCACTCATTGGTGT
-TGGAGGGCCAATTCTTTATGTTTATAATCTTTCATGGACTGAAATACTTTTGTAAAATATAATAAAATTATTTATTAGAA
-AAATAAAATGAAAAAAATACAAGGCCAAAACTTTGTTTTTAATCTTTAAATTTTAATGACAGAAAATTATATTAAGTTGC
-TAAAAACATTTATAAATACTTAGTTTCTGTAGTTACTTCATTATGGATCAGTAACTATTAGTCTGTGGACTTGCACCAGT
-TTGCAGATGACACTGAGTTATTACACTGTTATGACTGTTAATTACTAATAATTGCATACCCTATAGACTTTGGGTTTCTC
-TTAAAGCTGGACAAAGCAATTCCTGAATTGAGGCTTCCCTGACTCTAGGAAGTAAACACACAACCTACCTTGTATCATAA
-ATACCATACAGGAAAAATTAAAAAATCATTTGAATATATTTGAGCTCCTTGTTTGGAAGTACCATTTTCCTACATTGGAA
-GCCATTGCTTCCTTTGACTGAGGAGCATCATACCTCTGGTTGGTTCAGGCTGCCTCTGAGTCACAGATACTACTGCACCT
-GTCCTGCCTGATGATATTATAGGTAACATATTGCCCAGCCATCTGCCTGGAGCACCTGTGGCCACTAGCTTCCCCAGACC
-TTTTGGAATTTACCTCCTTACATCAAGGAAAGGGGAAGATAATGTAAAATTATCTATCACATAGAAGGAAATTTGCACAA
-TGTGGGGAGAGAATAATCAATTTGATATTTAAGATGTAATATAATATTTCCTATCACTCTTTTAAGAAACATAGTAAAAA
-AAAAACTAAGGAAAAGTAATTTTCTGTATTTAGATGGCACTATAAATCATGGGATCTTAAAGCTGGGACCGCCATAGAGA
-AAATCTGATCTAGCTCTGTGAACTTCTGTATATATACCCCTTGCTTTAGGAATCACCCTTATTAGGGCAGGCTTAGAGCT
-GATGTGCTGAGATATTTTTCTACATGGTTTATCATTAATATGTTTATAGTCACTCTGAATTTATGTTTATGTTTCAACAG
-GGCATAGTGCCATGGACGTTGCAAAGGCATATGCTGATTATAGAATAATTGATCTGATTAAAGAAAAGCTAGATAACTTG
-CCGAAACCAGCAGAAAATCAAAAACTAAAAGGCAAGACACCTCCTATACTGAAGACTGAAGGCCCTGAAATTAAGAAAGA
-AGAGGTAAGAAAAATGGTTGACTACCCATTAGTAACTGGAACTCTTTAAAAATCTGTTTGGGGGAAGGCAGAAGCACTAT
-TTACATATTGTTATACAACATGGGTAAGATAATATGCAGTGCATACTTTCAATAGCATTATTATATAGTACTTTTAAAGA
-AATATCTAATAAAATTCTTATCACTGAAGAGCCTAAAAAGTACTCACTGCAAAGAGAATCCATACAAAAACCAAATGGGT
-TCAGCCAAATACAATTAGAATGTTGAAAAAGAAAACCAAAACTGGTGTTGGATTTGTATATATTTGGTCCTGAATTATAC
-AGATTTGATGAGATGGTCCAAATAGGGAAGGAGATTAACCCTTATGAGGAGTGAAGTAAAGCATGATTTTTCTTCATTTT
-GGTCTCATTACCACCATATCCCCTTTCATTGCCCACCACTTCCCCTTCCTCCCACCTGCCGCCTCCACCAAGGAATTTTA
-ATGAATACCACTGAATTCTGGGATACGGAGCCATTGTCTCTAGAATATCCTGCAAAATGGTTGTAGGTTTTCAACGTTTC
-TGGTAATCCGGAGTGATTTGGAACTTCTAAACTGCAGTGGAAGGTTGAAGTTGTTGCCCATGGGAGTTACTGAGACATCA
-AGACTTTATCATTAGCAGGAAACCCCTAAGTGTGTCTCTAGATTGGAAGCTTTTCTTAAGGGAGCAGAATATCTACTGGA
-GACTCTTGGCTGACACAGGACAAGAGATGAAAGTCAAGAAGGAAAAGTTTTAGTGTCATCAAATTGGAAAGCATTGGGGA
-AATGTAGGTGGTAGGGAGTAGATAGGATGAAGGGATTGTAGACAGACAGCAGACTTATAAACATGGAGGATGTTAGAATG
-GCAAAAGGTGAAGGAGGATCAGTCAACTAAAGTTCTTCCATTGTCATTTTAGTAGGCCACAGATCAAGGATGGGTATCTC
-AAAGACTTACGTGATCTTCTACCAATACTTCTAATTAAAGTTAAACAAGGCAAACTATCTCTCCCCATCCCCAAAGTTAT
-AATAATATACTATTTTATCTCAAATTATAACTTGTACAGTAGCATTTTTAGGTTTCTTTCTGGCTTCAGAGTAAGATGTG
-AAACAGCAAATAATATTAGAAAATCAGTATAGATTTTTACAATTTATAATTTTTTTGTTCTTGTTTCCAGGAACTGCTGT
-CATCAATTTATGGTGTACCAACCACATCAGAGGGAAAGAAAGTACAGAAGGGTAATGTGGTTCATCTGAATTCATTGATT
-ACCAGTGGTTATACTAAGAAAGTGGATATCACATTTATTCCACGGAGGGTAAGTGCTTCGAAAAGATCTTCATAGCATGG
-TAGAAGCTCATAATGTCATTTTTTCAAAAGCTTTTTATGTAGAATATCCAAACAAATCTGCACAGTTTGTCTTTCATAGT
-TACTACTTGTGAATGTTCTTTTGCCAGGTTCTGGTACTTTCAACTCAGTATGCCCAAGTGATAGCTCCCGGCATCTAGTT
-CTCTTTCTATTACTATTTCTGTATTGAGATTTACATTTTCCTAGAAAGGTTGAAGTCTTTCTGAATCAATGGCATGATCT
-GCAGCTGTTTAATCACTAACTCCTAAGGATACTTTTTTTTGGTACTTCTCAGACCCAACCCTTCTTTGTACTTAACTACT
-ACCAGCTCATGCAGGAGTTTCATATAAATCAAGACTGGATTTATTCAGTAGCTTCCGAAAACCTCCACAACTAAAGAGGT
-GGAGACATCTTTTGGAGAAAAGAGTTGTCTTTCCATTGGCCATCCAACCAGGCTGAACAAGCAGCTCCCCTCGCCTTCTA
-TTATAAAAATAATTTTGACTTCTACATAAGACATATAGGTAGTAAACCTAGATGATCTTCTAATTCCTTTGCTTCCCTGT
-TTTGGCATCCTAAAAAACGCACAGCAGCTGGTCTGAGCATAACTGGCCAGAGAAGTAACTGAATAATATTTCCGACATTA
-TTTGTCTAGACAGTCATCATCAAAAACAGTGATGCTCGTGCAACCACTAGTGTCATATGAGAGGGGGGGAAGAAGTTAAA
-ACACATCTAAAAGTAAATTTAATAGTTTTAAGTTAAAACTATAAACAAATTTTTAAGTTAAAACTGTGTATTGAAAATTG
-TCTGGATATTAGCATATTTACTGGCTGTCATACTCATACCTGCTGGGGTATGGCTATTTTTCTTTTTAAGATTTGGAGTC
-CTGAAGCCACAACAGCAGAGCTGATCAGGAAGAGGGAACTACGGCGAGAGAGGTTTACACATGAGGTGGACTTCGACGAT
-TTTATGATGCCTTTTCAGAAGAACATCACAGAGAAAGCTCGAGCACTGGAAGCTGCCTTGAAGACCTAAGTCATAGCAGT
-TATTTCTTGGGGTAAATGCTTTGAGGCCCAGGGACCAATCTTTGGAGAAAGTAGATATTTCCATCAAAGCCAAAGCAATC
-CATACACCAAGAACTTGTTACCAAGAATTTCTTTTTGCTTTAACAACTATAAATATTCTTAGCTGTCTAGAGAAAAGATG
-TATGTTATTTTGAAATGAATGGTATGTCATTCTGGATAAATCCCCAAGCCCCTTTATGAATGTAGTGAAATACATGGCAT
-GTGGGTTATAAACGTTGCTGTCAAAAGATTTACCAGGTCTACACCATTATGCTTATTATTTTTTTAATTATCCTTTTTAT
-TTATTAAATAGAGACAGAGTCTCACTATATTGCCCCAGCTGGTCTCGAACTCTTGAGCTCAGGCAGTCCTCCCAACTTGG
-CCGTCGAAAGTGCTGGGATTATAGGCATGAGCTACTGTGCCCAGCCTGCTTATTGAAGATACATTTCTAGTGGAAATTGA
-TGAAACAATTTAGGTTTTGGAAAAAGAAGTAATATTTAATCTTTTAAGGAAGGAGTTTATTTCTCACATGCCATTATAAA
-CTATGTGTATTAGATACCTTGGGTTGAATACACTTTTAACAGCCCTAGATCGATAGCCCTAGCCCTAGATAGATAGCCCT
-AGCCCTAGATAGATAGCTATTAGGTTGGTGCAAAAGTAATTGTGGTTTTTGCCATAACCTTTAATTGCAGCAAAAACCGC
-AATTACTTTTGCTCCAACCTGACAGCTAGGTATCTAGCTAGCTAGAAAGGCAGATAGACAGATATATAGATGATAGATAG
-ATAGATGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGATAGATAGAGATTTATTGCAAA
-TAATTGGTTTACATAATTTTGGGCCCCAGATGGTTAAGTGCTAAATTTGTAGGGTAGGCTATCAGGAAGTGCAGGCTGGA
-AACATGCAGGAGCTGTCCCTGAAGTCCACAAGTGGAATTTCTTCTTCATCATGGAAACCTCAGTTTTGTTCATACACCTA
-AATACTTCAGTATGTCTTTCCTAAAATAAAAGGCATCCATTTACCTAACCAGATTACGATTGTGAAAATTTCAACTGTTG
-TTAAAGCGACTGATGGGATCAGTTTCACCTAGATTATCTAAAGCAGTCTCCTTTACATAAAGTCAATGAATTGTAAATAT
-TGGTTGCATGTACACAATTCCTTCACCACAACACCTAAGATTAGTATTTGATTGAGTTACTGGGTGCTACAACCTAGCCA
-AGTTGAGTCATAAAACTGACCATCTCTGGAGGTGTACTCTGCAGTAAAAAGCTAGCTGAGGCATTATTCACACCAAGAAA
-TGCAGTGGGTACCGAACAGGAGCTCCAAAAATATCCAACGTCTCATTGACAGAAAGAAGCCACTTTAGAATCTGCCTTAC
-CAGAAGGCACCAATTGCAGATTACAGCTCTGTCAGTCACGTATGGATTAAACCCCTTTCCTCTAACCTCCTCCCTCTCTT
-TCCAACCTTGGAGGGACCTTCCACAGGAGCCAGTTAGGGAGGAGAAGGGAAGAGAGAGAATGAAGCAGGTAACCAGGCCC
-ACCCCTCTGGAGGAGACAGACCTGAACAGGGGTTGCTTACAAGCATTGCATTTGGATCCCAAGATTTGCTATTACAACTA
-AATTTTGTCTGTTTTGTAAGGTTTTGGTTGGTTTTTTTGTTCTCTCTTTTCTTTTTGTTTTGACATAATTTCATATTTAT
-GGAAAAGTTGCAATAATTTGACAAAGAATTCTTATATGCCCTTTACCCAGATTACCTAAATGTTAACCACTTACCACATT
-TGCTCTATCTCTTTCTCCCTCTACATATATGCATATGTATGTTTAATTTTTGTCCCCGAACTATCTGTGTGTCCGTTGAA
-GACATGATGAAGACATGATGTTCTTCACATGATGTTTTCATATTTGTGTGTCAGTTGAAGACATGATGTTTTAAATATTT
-CATTGTGTATTTCCTAAAATCACGATGTTCTTTTGCATAACAATATTACCATTGGCAAACTAAGGAAATTAACACTTAAG
-TGAACTATTTAATCTATAGACCTTATTCAGATTTTGCTATTTATCCCAATAATTTCCTTTGTACTCCCAGGTCATGAAAT
-ACATTCGCTTGCCCCATCTCTTTAGTCTCTTTTAGTTTAGAACAACCTGTATTTCTTGTTTGTTTGTTTGTTTGTTTGTT
-TATGACAGTATATAAGAAGAACACAAGCCACTTTTATCTTGTAAAATGTCTCTCAACTTTGGTTTGTCTTAAATGTCTTC
-AAGAATAGATTCAGGTGATGCTTTTGGGGCAGCAGTGCTACAGATGTCATTGCACCCTTCTCAGTACATCATATCAGGAG
-GCACATGATGTTGATACCTGATATAAACTTTAACTGCATTTGCAGTTGAGAGAAATGTAAATAAAAGTAAAGCTGCAGTA
-ATAAATCATAACTGCATAAAATTAACTGTAGTACATACTGTACAACTGTAATAATTTCATAGCCACCTCCTGTTGCTATT
-GTGTTGAGTTCAATTGTTGTCTTTTCTCAAGCTTACTTTATTGCACAAATACAGTATTTATAACATACAAAATACGTGTT
-AATTGATTATGCTATGGGTAAGGCTTTTGGTCAACAGTAAGTTATTAGTATCTAAGTTTTTTGGGAGGCAAAACTTATAC
-ATGGATTTTTTTATTGTAAGGAGAGTTGGTGCCGGTAACTCTCTAGTAGTTTTCCTTGTACTTAATGAATATCTGATAGA
-TAGATACTTTGAAACTATGGAAATTTCCTTCTACTTTCATACTTTCACCTACTAATTTTAGCATCCATGGATGATTCTCG
-CCTAAAATAATTATTACAGTGACAGTTGCCATAAAATAATTTCTACATTTTATCATTCTTTCCATTTCTTACTTGGCCTT
-CTGCTGTTGGGCAGAGCTTTCTTTTCTTCCTTATTAATTTATGTACTCAAATCAGTACAGACTCATGCATTCCCTTTTTA
-TTTAATGCGAATTATATATGTGTGGGGACCAACTCAGAACTCCAGAGTTGGTATAAAGATTATTTTAAGCCAAAGACATT
-TGAGATTTAACATACCATATGCAGGGGAAAAAAAAGTCTTCTCAGACCTTTGCTTATCTGACTACAAGCAGTAACTTCTA
-GGAAATAAGGCTGCCATAAATTCCTCTTCAGGTTTGATCTACTTCTAGAACACAAGTAATCCTACCCCAAATCCCTTCTC
-CAGAAGTGTTGTATGGCCCCGAAGGAAATTTAAGGACCATTTATACCTGTATAGATAAACATTATCACGTACTTTTTTAT
-CTCCTGTTTGTTCACCTGAAAACTCATGTATCTTTGTAAAAAGTCATTGTGTTTACATAAATGTCTTCTCCCCCTCCCCT
-TTGCTTATCAAGATGATTATAAGCCACCGATTTTAACTATCCCTTTCAGTTACTCATCACTGAGTTCTCCCAAGTGTATA
-TGCCTTGCATGCATAAACTTGTTTTCTCCTGTTAAAATGCCTTTTGTCAGTTTAATTCACAGGCTCCAGGCATTGAACCT
-AAGAGGGTAGAGGAAAAGTTAATCCTCCCCTATGTGATCCTTTACTCTCATTATTAATTTTGATGCTCAAATTGTCCCTG
-ATTTAACTAGGGGAAAACCCTTCAAGTTGGCTCCTGATAAAAAGACATTTTGTTTTCTAAAACAATCAGAGGACTCTTTA
-TTTCTTGAATGTGAGGGAAAATGCCTACCTTTGGCTTCGTTCAGGAACAAGGAAAATGAATCTGCAACAGCAGATTTTCA
-GAGGTGATCACTTTCTGTTTTCACTCTAGTGAGTACATTTTTTAAATGTCAGTTTGATAGATAGTGGTGTCCTGGGATCA
-CCTTCAGCCACTTGCAAATATAAACTGAGAGTAAGCATTAATGTTAGGTCCTATTAACTCTCTTTCCCCACATACGGAGT
-GTTTGTATTCATTTTAATGGCTCAACATGTTTAAAGGGGAATTGTGTGAGGGGAACAGTCACACAATTGACTGAGTTTAT
-TTGGAGTTTAATGCTAAACCCAAACATAGCATAGCCACAGTTCTAACAATGGCCCATAAGAACATCAGTGCTATTCAAAG
-AGTGATCCACAGGCCAGCAGCATCACAGGGAGCTTGCTCCCACTACCTGCCGCCCAAAATTATGGTACTGAAGTCTATAT
-GAGCGTAACGAAAATTTTGTAGAGGAAATCTTACTGGCATAAAAAGACTGTCAATGTTGCATGTAAAGTACCTACATTAT
-AAGTAGTATAATATCAGACTTGCAAATGCACAACATGTACATAAATAGTAATTTTTCTGGGTCTTTATGAGTTATCTGAC
-CTTTATTGTTTTATTTTGGCTTACCTGTATTTTCTGTTTTTCTTTTTCTTTTCTTTTTTTTACAATGTACACGTATTACT
-TTGGAATTAACAATTTTTTTTTAAAAAAGAAAAAACACAAGTTAACACCAAAGTCCATAATACCAAAGTGAGTTTATTAG
-TATTTGCCTCTTTTATGCCTTTTTGTGCATTGCATTAAGATTCTCTCAGAAGAACGGAGCCAAGAGTTCAGGAGCAAATG
-ATGTGTGAAGGAAGTGCTCCCAGGGGAGAGCAGTATGGGGTGAGGGGTATGAAACAGGACACGGAAATGAAAGGAGCCAA
-ACAAGGGTGCGCTTTCAGATGAAACCACAGCTTCTGAGTAGCCCGTGGGGAGCTGTAGCGCACAGGCAAGGAGCTGGGCT
-TCTGGGTTCCTGTATCAGTGAGCAGCTGCAGGATTGAGGGTGTACTGGCGAGGCTGTTCCAGTGCTCGAGGGCAAGTCTG
-CAAAGGTCATGGTGGGAACTATTGGCTAGAAAGCATGCAGAAGCTGTAACTGCGTGCATAGCACAGGAAAGGGAACACAT
-GCACTTATCTTTAAATTTACACTTCGGTGAACTGGGTAAGACTGTGGGTTTTATATTAGCAGACCTGGATTTGAATCTGC
-ATATTGTTAGTCATCTGCATTTACTGCCTGCTTGCCTATGGATCAAGTTATGAAGGGTCATGACTCCGAATTTCATCATT
-TATAAAGTAGGGATAATAATACGTCCCTCAATGAACTCTTATGAGACTCTAGTGGAATAATGTCTTTAAGGATGCTCAGT
-CTGTGCCCATGCCTGGTTGGTGGTCAACATATGGTTTGTTTTTAACCATCTTATAGTCTCTATCTGAAAAGTGAACCAAA
-AGAAGGCACAGGAAGGAATAAGGACCCAGACCTGAACAGTCAGAACAGAAAAGGCTTCCTGGAGCAGATTCACTTTCAGA
-CCATCGAAGTCATTTAAACATATGTGTGTGTGTGTGTGTGTGTGTGTGCATGTGTGTGTGCGTGTATATATATATATTTT
-TTTTTGAGACAGGGTCTCATGGAGCGCAGTAGCATGATCTCAGTTCATTGCAACCTCCACCTCCTGGGTTCAAGAGATTC
-TCCTGCCTCAGCCTACCGATTTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCC
-TGACCTCAAGTGATCCTCCTGTTTCTGCCTCCCAAAATACTGGGATTACAGGTGTGAGCCATCGCACCTGGCCCTAAACA
-TGTAGATATTTTATCTACATATTTATCTACTTTATCCAGTTTCTGATAATCAGAGAAAAATGAAAAATCCCTATTTGCCA
-TGAGATATACTTACTAATTTCAGTATAGTTCCTGTGGATAGTGGCCCAAAGGTTATCTAGGTAATTACTAGTTAGGTAGT
-TAAAATAATGTCTTAGATCAAGCTTCCTAGAAATAGAAGCTGAGATGGGGACTCTAGTGCAAGTGACTTATTAAGAAGGA
-ACATGTCAGGGAATGAGAGAAGCAGAATAAAGCAGGGAAAGATCTGAGGGAAGGTTGTGATCTCAGGAGGGCATTAGCAC
-CAGCCTAATTTCCTGGAGAGCTTTGGAGGATGAATGGAACCACAGAGGTTTGTCCTGCCCAGAGGGAAGAAGCCTGCCTG
-TTACATCCTGCATCAATCAGTCATTAACCAGCCCCTTGTCAGGAGAGAAACCTTTCAAGTGTCACCTGGCTGATTCGCAA
-GGTGGCTCTGATCAGCCAAAGGCAATCCCCAGAGAAGTGGGTAGCACTTAGCCTCCAACCACAGCAGCTGAGCACTGGGT
-GGGCCAGCTGGTTAAGGGGATCTGGGCAGCGTACCAACAGCATCTGCTACAAATGGCATGCTCTTGTGTGCAAAGTTCAG
-GTGCAAAATTTCAGATGGTGACTCCTTGAGATCACTTTGCATGACACACTTTGTTTTTAAAAAGAATATTAACTTCAACA
-AACTTCTGAACTTGCCTCATTGTTAAGAATAAAGATGAATGAGCAAGAACAGCATTGATAACTGATTTGGCAGCTAGTTG
-AAAGGGGAATCACAACTTGAGTGTTACCAACTTTAGTGTTATCAATGGTTAAAAATGATAAACATGAGAGACAGAAAGAT
-GTACTCAGCCTTATGCTCAGGATAAGGTAATGTCTAATTGGTACAAATCAATCATCCCCAGTGAAGTTAGTTTAGCAACT
-TTTATTAAAGTCACAATGTAGCCGTGAAAAGTGCCCAAAAGAACTACTGAGCCTGTACTTTTTTTCAAAACGGGTGGTGT
-AAAAAGAGAGAAATGGGAAAATTCAAATGCCTTCTCCACACTGGCATAAATTTGAAGTAAACAGTCATCTGAACTATGGT
-ATTATTAACTATTTACACAGTATGTATATTTCATTATATGGATTTGTATTTCTGTAACAATGCATCCTAGGGGAAGTTTA
-CAAATGAAGGTAGATGGGGTGTTTGTGTATATCAAATAACCATGTGCTAATATTCATAGATCCTTAGGTAATTATTACTA
-CATCATGAATTTTATCTGAGTAATAAGGAAGAACTGAATATTCTGTTGAGATTCTGGAACTTACTGGAGATTTCTTTTAT
-CCTAGATAAATAATTGAGTATTGTGTGATGTATGATGTGATACGTGTGTGTAGGTATGTGTTTATTCAGGATTAATGATG
-GTATTTTCCTTTTATCTTCAGTAAATAAGACTTTGAAGAGGAATTAATATGCAAAAAAAGATTTATTTTTCATAGGCTTA
-ATGACTTTTTGTAAGATGGTTTGAAATAGCCATATATTTTTCTAAATGTGGGAGATTGTTATGTTGTTCATTATTGAGAC
-TCGCAGGCTGCAGTTCGATGCTTTCCTCTGAAAAGCATTAGAAGTGAGAAAAATAAGTGAGAGAAATAAGTATTCCCTCA
-TAAAAATTAAATAATGAAATTAACACATAAAGAATTAAATGAGCAATGAGTATTATTGATGTCTGAATATATCTCACACT
-AAAGCAACACTTCCCAACACTTCCCAAAGCTAACAAGTCAGCCAGAAGGAGAATTGATCAGCAATAGAAAATCATGGAAT
-GAGAGTACCTAGGCAGACCTTGTGTGTTCAGACTCTGCAGACCTCTGGTCCATATAACACATGCGTCTCAGTTAGAGATT
-GAGACTTTTCATGATGTCCAAGGTTGCTACTGCCAGAATGCTGAATCTATCAGCAGCCCTTGTTCTACATACAATTTGGT
-TTTATTCATTCAGCATATATTTATTGAGCACCGATAATGAAAATCCTAGGTCTGTTCCTTGCTCTCTTCATGGTGCATGA
-CAGGAGAGCAATTCATCCAGTTTGCATGTCCCAGGTTTCTGCATTATTTGGCTTCCAGTAGGATCCAGACAACAGGAGAC
-AACAAAAGATGAGAGAGGGAGGAGAGGAAAAGCCAGGTAGTTCCCCCTTTCCATCTTTGCCTTTGTCGGCATCCCCGTCA
-ACAGCTGTGTCTGTCTCCCCCATGACTCCACTCCCCACTGTGTGGGGAGCTGTGTATCCTGCTGTGGTCCTAGCCTCCCT
-CATGTGACCCTGGCCCCTAGGCTCTGGTAGTACTACCCACTCCCTCTGTCCCTTAAGCCTCCAAGGGTGGTACCAGCTTC
-TTTTGTTGTTAGTCTCAGGGCTGCCTCACTGTGCTCTGGTTGTTTCCTCAGCCTCTTCTATTGCTTGTGCAACCAAATCC
-TCCCATTAACTTCCATTCTGTAGGAACTCAGAGTTGTTTCTGCTTTCCCATGTGGATCCTGATTAATCACGTATCAAGCA
-CAATGGCATGTCTGGATAAAATGGAATGCAAAACCAGGAATAGCCCCTGCCCTCATGGAGTTTATAGTTTCGTAGGAAAA
-GCATATTTTCATAGAATAATCCTAAAATACTTATGAGATGATTGCACAAGATTGAATAATTGAAGATTATCAAAAGACTC
-ACAAGATTTCACAGTGTGTATTTGAGTAAGGTTTTAATACAGGTGAAGGATACATTAGGACACAGAGCACAGATGATCAC
-AGAGGGGTCTAGGGCTTCCAGGCACAGCCCCCCAGGGTCCATTTTAATCACTCGGTACAGGACACATTTTATCTTCAGAT
-TATATACGATCACCGTAAGTGTGAGTCCAGGTATATAATTTATTGAGGGGTCTTTCATACCCACCAGCCATGTAGCTAAA
-CCCAGGCTGTATACCCTGTTAGACCAGGTACAAACTATCAGTCTATACAGTCCTAAACAATGTAGACAAGCTAATACAGG
-CTGCCTCCAGGGGAATTTCGAGCTTTAAATAGCACATTGCACATTATAAAGTCCTCAGTAGCACATTTCATTCTTACCTT
-GACCAGACTTCAAGCATCCCAGGAGACAAACAGAGGGCTACCCCAGGATAGCTGCAAGGTAACGCTACCTTATACAACAT
-ATGAACTTATAGTGGTGCTACAGAATAGGGGAAATTTTCACTAATGAAATGGTATTTTAGCTGAACTCTAAAGAATGAGT
-GAGGAATTAAGTTGACCCAGAGGGAAGAGAGGAATTGAGTAGAAGCAGCAGCATTTTGCAGTGCAGACCCATTCCAGCAA
-GTGAAATAAAAGCAATGTGACAAGAAATAAATAAAAAATGGTCAGGGAAAAGAGGCCAAAGCCACATCCTGGAGAGATTT
-GTAAGACAACCATATGGATTTGGAAAGTGATGGATTTCCATTTGATTCTGCTGATTCGTCCCTTGTCCTAGAAATTTTCT
-TGACTTTAGCAACACCACAGTTTCCTGGTGCTTCTCAATATCCTTTGTAGCCATGCTTTTTGCATCAGGACTCTCAACAC
-CAGCAGACAATAACAAGAGAATTATTAAGACTTAGAAAAAGAGAATTCTTAATACAGAATTTCAAGGGGTGGATTGAGCA
-AGACTGGAGGCAAAACATCTTCCCTGAAAACCATTTCTCTCTTCCTTGCTTGCTGACATTCTCACTGTCTGGCTCCCTTG
-CTCTCTCTACTTGGCTTTAGTCTGTGTGAGCTCCAACCTTAGCTAGAATGTAGCAAAGATGTCCACCAGAAGCTCCAGGG
-TTACATCCTAGAACTCCAAGTGAAATGAGGTACTCTTTCCCAGCTGGTCCTGTGAAAACCCTGATCGCACTCTCAATGGT
-CAGGCTTGAGTCAAGGGTCTTTCTCCACACCAGTCATTATACAACAGGACACAAGATTCTGATTGGCCAGATCATTTTGT
-CAGCCCATGACTCAGGGAATGAGTCACTCTACCCAAAACACCAGACTGCTACTTGTATAGGTGTGGGCTCCCAAGAAAAA
-GTAGGGATTATTCTTCCCCAAAAAAAGAGTTAGGGATGCTGGAAAGGCAGAAAGAAAAGGGAAGGGAAGAGGAAGGGGAA
-AAGGAAAGAAAAAAAAGAAAGAAAGAAAGAGAAAGAAAGAGAAAGAGAAAGAAAGAGGAAAGAGAGAAAGAGAAAGAGAA
-GGAAAGAGAAAGAAAGAGAAGGAAAGAGAGAAAGAGAAAGAGAAAGAGAGAGAAAGAAAGGAAGGAAGGAAGAAAAATGA
-AGGGAGGAAGGAAAAAGGAGACAGGAAGGAAGAAAGAAAAAGAAGAAAAAAGAGAGGGGAAGAAAAGAAAGGAATAAAGA
-AAGAAGAGAAAGATGGAGAAGAAAACAAACCAAAAAAGTGGCTACTACAACCTCCGCCTGACCATTAAATGTCGGAATTT
-CTCAAGACTCAGTTTCAAACCTTCATCTCACACTACGAGCTCTCCCTAGGCAAGCTCATTTGCACTCTCTCCTTGGAATG
-ACTCCCACATTTGTGTCTTAAGCGTAGTTATTTCATCTAAGCCTACAGAAACATATCTAATTATACTTGACATCAGTTCT
-TGAATTTACAAACGCTCCTGAAACTCAACAATTCCCAAATCAAACTTTAGACCTCTACTGCCCATCCTTAAGTCTAGTTT
-ACTTCGAGTGTTTTCTAGTTCAGTAATGGAACCACCAACATTCTGCTATGAAAGCCAAACTCCCAGATATCATCATGACT
-TGCTTCCCCAAGCACCCACCCACCCCAATTCAACTCCATTTAATCTCATAAATTCTTGTGACTCTTCCTCCTACTATCTC
-CACCCTTACCGCCGTAGTCTACCTTATCATCTTACCCAGAAAACTGTAAGAAATATTCTGATCTGTTCTTTTATCTCCTT
-CTGTCCTGCAGTCTATCTATACATTGATGCCAGACAAGTCTTTTCAAGGATGAAAAGTGATTACTTCAGTACTCTACCTA
-CCATCTAATTAAAATACTTTCAAAATTACTGATTTTCTTAATAATATAAGAAAATGTATGTGAACATGGCCTATGATCAC
-CTGAGCGGTCTGAGCATACTTACTCCTCCCCCAGATCAGGCCTTTAAACACTCTGCTGTAGACAGTCTGTTATTTTATTT
-TATGTACATGCTCCCACCTTCCATTAAGTTTTTGCATAAACTGTATCCTCCTTGTCCAGGAATTCATTCTCCCTCCTCTT
-CCCCAATACCTCATCTGCTTAATTTTCCATTCCTTTTTCATCTCAGAGAAATCATCTCTTTGTTAGGGCAGACTTCCTCA
-CCTTCCTCACGAAGTTAAATTCTCTTCCTATATACATTCATAGATCACAATGCACCTTCCTTCACGGCACTTACCGCAGT
-TGCAACTATATCTTCACCTGTGCAATTATTTGAATAATATTTAATTATTTGACACCATAACTGTCATGACTGAACATTCC
-AAAATATACCACATATTTTCTGGCCACATTGATGGGATTATAACATAATATAAACTTGAATTATTTTAAAATTTGTGCAC
-AACTGAAAATCACGTATGTACTTTCTCAGTGCCTCTTTATGTGGAGAGTTTATCTTATACTAATTCATCCCTGACTATTG
-TACTCCTGAGTTCCTGCCTCTGTTCTTTAGAATGGTTTCTATTTTTTTTCTGCTGGACTGTATTAGCCTTTCCTTTTGCC
-ACTGGGAACATAGCTGTTTGTAGCTATCCCAGGTGTATAAGTAACCTAAATGGCTGCTTATAATTTCTGCCCACTAGGAG
-AGGGACTCCTTTACTCCATTAGTCTCCTGTTTGAATCTTAACTCTGCCCCAGGCTTCAGGATACATAAACACTGCCAATC
-ATTCTTAAGAAGTGAAGGGATTGCAAATAAGCAAAGAAAAAGTAATTTTAAACATTCTTTCCAAATGACCTTGCAAGAGT
-TTTTTCCATTTTTAGAGGGAATAGTGGGAGTCAGAATTGGCAGAATAAAAGCAGCGTATTCCTAGACCATATATCAGCAG
-ATAAATGTGTTCTGCAGCATTAAAATTACCCTTGTGGTGCTCATTCCTGGATGTACCATGTGTTCTGTGATGTAAATCAG
-TACATAGCCTTATATTTTCCTCTGTGTCATGGACCCACAGAATTGCAGTAGCATGAACTGGTTGGCAACAAAATTCTTTC
-CAGTGCTTCATAAAGCCTTTGGCTTTTCTTCATTTGATATGTGTGAGTAGGAATGCACAAAAAACAAGAACAGATGATAT
-TATTTAAACCGTTTGGTAAGAAATGTCTGACAGGAAAAAAGAAAACATATGTATCGATTCAAGTGCAGTAATTCGCTTGG
-CGGTTTTCTATATTATCCTTTCTACTTGTAAAAATCATCTCCAATGCAGCAAAATGTTCTTAAATCCTTTATACTTCATT
-CTAAAAATCAATAGTCCAAAGATGTTAACTCTTTTTGGGCTTTTGGAAAACAAAACAAAAACCAGAAAAGAGAGGATAAA
-TGTTTTCATTTTTATCTAAATTTTTCTGGTTGTTTCTGGTTTTTCCGTCTCCACTTCATTATTACTAACATGGAATTATT
-GATAAAGCTTAAAAGAAGAGAAACACAAATTCAGACTTTAGGAACTCACTTGAAATCCTTACTTAAAGACTAAAAGTCAT
-TCATTTATTCATTTCATTCAATAAATACTAAGGATCTACTATTTTCCAGTTGGCCTCTTTGGCACTGGTGTATAATGCTA
-CACGCAGCACTCACTGCTCCCTTGGTTCCTGCCACCATAATAGGGAGATAGCAATTAAATAAACACAGCTATATTATTAT
-AAATTGGGATGCATGTTACCATGGAAAAGTACTGGGTGGAGTTTTAGTTTGAGAGTCAGGGAGTGCCTCTCTGAAGAAAT
-GTCTACTATGAGACCTAAAAAATGAGTAGAAGTTGTCAGATTAAGGGGAGGAAAGGTGTTTTAGCCTGTTTTCTGCTACT
-ATAACAGAATACCACAAACTGTGTAATTTATAAACAATAGACATTTATTTGGTTCATAGTTCTGGAGACTGGGAAGTCCA
-AGGTCAAGGGGCTGCATCTGGTGAGAGCCTTCTTGTTGCACCATAACATGGTGGAAGGGCAAACAAGCAAGTGAGACAGA
-GAGAAAAAGTAGGCCAAACTCCCAAGATAACTAGCCTACTGCCAAGATAACAGCATTAACCCATTCATAAGGACAGAGCC
-CTCATGACTAACCTCTTAAAAGCCCCACTGCCTGATAGAACTATATTGACAGTTAAATTTCAATATGAACTATGGAGAAC
-AGTTTGGAGGTTCCTCAAGAAACTAAAAAAATAGCTACCATATGATCTAGCAAGCCCACTGCTGGGTATATACCCAAAGT
-AAAGGAAATCAATATATTGAAGGGATATCTGCACTTCCATGTTTGTTGCAGCTCTGTTCACAATAGCCAAGATTCAGAAG
-CAACCTAAGTGTCCATCAAGAGATGAATGGATAAAGAAAATGTGGTACTTATACACAATGGAGTACTATTCAGCCATAAA
-AAAGAATGAGACCCTGTCATTTGCAGCAACATGGGTGGAACTGGAGGTCATTATATTAAGAGAAATAAGCCAGGCAAGAA
-AAGACAAACATTGCATGTTGTCACCTATTTGTACGATCTAAAAATCAAAACAATGGAACCCAAGGAGATAGAGAGTAGAA
-GGATGGTTACCAGAGGCTGGGAAGGGTAGTGGGGAAATGGGAGACAGGGTAGAAAAGGTTAATGAGTACGAACAATAATT
-AGAATGAATGAATAAGGCCTGGTATTTGATAGCACAATAGGGTGACTGTAGTCAATAGTAATTTAATTGTAAATTTAAAA
-ATAACTGTAATTGGATTGTTTATACCAGAAAAGACAGACGCTTGGGGTGATGGATAGCCCATTTTCCATGATGTGATTAC
-ACATTGCATACCTGTATCTAAACATCTCATGTACCCCATGATGCAACTACCATATATCCACAAAAATTAAATATAAAACA
-TTATATAAAAATTTCCACATAATTTTCAAAAGGGATACTCTATAGTGGCGTGGGGAGGCAATCTACACATGAGGGGGAAA
-TACCTGCCACAACTCTGAGGCCAGAAAGAGCCTGGCTTGGTGAAGAGCAGGAAGAAAACCAGAAAAGCTTGCACAAAGAT
-GGTGGTAGCAAGGGGAAGCCAGCTTAGGACAAGGTTGACGAAGAGGACGGGGCCAGATATCGAGGAACTCGCAGGGAAGA
-GTAAGGAGTGTGGATTTCTTTCCAAGTTCAATTGGTTTTCACATTGCTGATAGCATCTCCCAAGTGATTACAAGTCACAT
-TGCTCTGTATCATCCATAAATTATCCTCAAGAACTCCTAGGGCCATAACAATTTTATGAAGGACTCAGCTCTGATAATAG
-AAAGTCAATATTTTTAGTCTCTAGCTTTTCAAGTAGGCAGCTGGAAGTATAGCCAAAGGATTTCAGATTTCACAAATGTG
-AGATCAAGAGACATCTGCTAGTCTCTGTTCAATCTCTAATTTTCCTGTGTCTTTCTAAGTGACACAGAATTAGTAGGCTT
-AGAATTTGCTGTAAAAACTTGTTAAATCCATGCTTTGTTCTTTAACAGCATCTTAGCTCTTCTGCTTACTAGCTTTGTGA
-CTTGGCAAGTTGTTTGACCTCTCAGATTCTGTTTTCTCATGTATAAAATAGGGACACACTACAGTAGTGATTAGCACTAT
-TCACCAAATATTTCCTGCTCTCTCCACTTTGGACACACGGTAGGATTATACTCTCTGCCCCATTCCCTTGTAGTTAGGTG
-GTGTCAGGTGACTAGTTCTGACGAATGAGCTATGCATGGAAGTGAGGTTTGCCATTTCCAGGCTGGAGCTTTTGATTGCA
-AGTGTGAGGCTCTCTGAGCAATCCTCCCCTCTGCTGCCGGCCGCTCTGTCAGCCTAGGAAATATGGAGTAGGATGCAGAG
-TTGCCCATCAATGGACATGGTGGGTTATAAGCAACTGGGACTTTAGGTTATTGACCAGCCTCACTAACAGACTTACTTCA
-TAGGTTTGTGATTAGAACTTGTATTCATCCATTCTTACACTGCTATTAAAAATACCTGAGACTGGGTAATTTATAAACAA
-AAGAGGTTTAATTGGCTCACAGTTCTGCAGGCTATACAGGAAGCATAGCAACTTCTGGCTCAGGGGAGACTTCAGAAAGC
-TTCCAATTATGGCAGAAGGCAAAGGGGCAGCGAGGCACTTCACGGCCAGAGTAGGAAGAAGAGAGAGGGTGGGGAGGTGC
-CACACACTTTTAAACAACCAGCTCTCATGAGAATTCACTCACTATACAGTATCAAGCAGCGGACGATGCTAAACCATTCA
-CGATAACTTTGTCCCCATGATCCACTCACCTCCCACCAGGCCCCTTCTCCAACACTGGGGACATGGTGATTTGGGTGGGG
-ACATGCATGATTTGACATGAGATTTGGGTGGGGACACAGATCCATACCATATCAGAACTTAATGGGATAATAGACACTAG
-GCAATTGTTATACTATCTGGCACACTATGAAGTACTAAATATAGGTTTCTATATTTCAAGTAAGCATTACCGGATTTCTC
-TGCCCAAGCATTTGCGTAGCTTTCAGGATTTAATTTTCAAGCCCAGAATTGAATGATTCAAGTTACCGTTAGAAATATTT
-ACCCTGACATTTAATTATACATGCAAATTATTGGCCATCGTTTGTAAATCATATTTTTGGTTTATGATAATAGGTGATCT
-GCAAGAACCTCCAAGAACTGAACATTACTGTGCTCACAAAAGTAAACTCATAATGGCTGAAAACATATCTAATCTCCTTT
-TCAATAAATAATGATATGCAACTGATAGCTCTTGCCAAATGTAATTGAGATAAATCTTAACTGTTTGAAAATATTAAAGA
-AGTATTTACTTTTAATTCATTACAGATGCAAAATGTTTGGGTTTAAAGGAGAAAAATCAAAAGAAAACATTCTAAAATAA
-TATCAATTTCTTTCTCTCCTTGCCATTTTTACAAACATACTCTACCTATAAACATGCACCTGTATAAATTATGACTAAAT
-CTATTTTTACTGCTTCACAGTAAATCTTCTGCTGAATATATGGGGCCTTAATCTCCGGTGTATTATGTACTAAAGGCTAA
-TAGATTTGGCAGCAAAAATAGACAGTTATATTCCATTAAAAACCAACTCCATAATTCATGACTGGACTCGGGGTCTGCTT
-CCAGCCCAATGGCACACCTGGCTCCCAAAGCTCTAAAACAAAATTTCCAGTTTTATAATTGCCAGAGTCATAGTTTTCTC
-CATTTAAAAAAACACATCAATATTTATGTTGTTTTCCATGTGCTCTCAAAATGACAGCTTAAATGATTTGACAATAAGTA
-AGGTTTGATTAAATTCAGTAGTCCCTTGACAGGGGTGGTTTATTTGATTATTCAAATTATTAATCATCATGCCATCTATT
-TAATTTTTTAATACTTAAATGAATTTTTTCTTGTAAAAGAAAATCTTGTAAACAAAATCATATCAGAGAAAGCCCTGCAA
-ATTACAAGGAAGAAATAATCACTCATAATTCCAACCCTAGAAAAATATCACTGTTGACCACTTGAGGACTTTACCCTAGT
-CCTTTTATTCTGCAAACATTTGCCATAGAGGTGCAATAGAACACAAAATAATATATGCTGCTTTTAAATATTTGTGTATA
-ATTATAAATGCAATCTATATAGTTCCTTATAAGGAAATATGAAAATTATTAAGTCAAAAACATAACCCAGGGAAAAAACC
-ATCAGAGATAGTCATTATTCATATTTTAGTGCTTCCCCTAAAAGCAGCCATTACTTAGCTACTTTAGCATTCACTCAAAA
-GGTGTATTCTGCAGAATGGTCCTTAGCAGTGCAATTGTATTTTCCAGAGTGCCAAACATTTATTCACTTTTGAGTTCGAG
-CACCCACACACGTCATGCATTTGCAATATGAAGCAACAACAACGTGTTACACCCTGGTATTATCAATGAAATTAAACCTA
-GCCTGTCCTCTCCAAGAGCTCCAGGTCTGAGGAGGATGTAGACTAGGAAACAATTATAATACAGAGTGATTAATGCTAGG
-ATTTGAGATATGCTCAGGATGCCATGGCACTGCGATGGAACACAAACCTCGTCTGATGGAGGAGAAGGTTTCAGGAAAAC
-CAAAAGCTTCCTGGGGGCTTTGCAGTAAGGCTAGTTCTCAATGGATGCAGCCAAAGACAGAGGAATAGAGTCACAAGTGA
-GCATATGCAATCTAGGATCAAAGGCAATTCCATATGGTTGGAGGATAGAAAGATAGTGACAGGAGATGAGGTGGGAGAAG
-TTGGCCTGCAGGATTTGTATTCCATAATAAGAAGCCTGAATTTTATGCAAAATACAACAAAGCAGTTAAGCAGCAGAGTG
-ACATATTCAGGTATGCATTTAAGAAAGAGCACTCTGGCTGCAGGAGGGGACAGATAAGACATGTGGCAAGGCTGAAGCTA
-AAGAGAACAGTAAACAATGGTCATCATCCAGATTAGAAATGGAGAGAGCCTAAATGAAGGCAGCAGTAATATAATGAATA
-TTAAGAAAGTCAAGGAGGCTTAGACTATTCCTATCTACATGCAGCTTGGGGATTAACCTCAGATGTTGATCATGCTTGCC
-AAATTATTAATAAGACAATATCTCAAGACCTGCCTTGATAATCTCCTTTCAGTCTTATGATATGAGGTTAAAAACAAGGC
-AAATAATATATCTTGGATTCTATCCTAAAGGGATCAATGTAAGAAACCTGGCTAAAATTCTGACACCATAATTGAAATCC
-AGGAACAGAGGCCTATGCTACATCACATACGGAGAGCAGATGGCTCAGAGTGATCATCTCAAGAACTTCTCGTTGGGCAA
-CGTGACTTTTGCAAAAGAACTAGGAAAGTGTTCCTTTGGGCCATGATGATTTATCAAGGCTAGAAGTTGAAATAATAAAT
-CTATTCTGAACAATATACTTACTAAATCGTAGTCATTTATAGCCCTCTAATGAGACAGGTACTCAAATGGGTACACATTT
-GCTAGGTAAACAAATGTATTGCATGGGGAATTAGGGATTTACAGCTAGCAGGGGACATTGAGGCTCAATATTGATGGTTT
-GCTTTTTCCATTTCGGTTGCTAATGTGATTTATTTGCAGTTTTCTTAATCAAGGTGACTGACACAGAAACTATCTAAATT
-TTTTAGCACAGCAGTTAAAACAGTCCACAATACATAATTTGGCTCCTAAATAATTTCTCCCCCAACAATTAGAACTTTCC
-GAAACTGCTTTAAATCGCCTTATGAGGGTATCATGAGTTTGTGGTCATTGGAAGTATTAAAAGAAAAAAGCCTGGAATAT
-CAGTAATGAAATGCATCAAGCAGGAATCATACATACATTAAAATACTGGTTTATAGTTTTGAGGGCGTTTTCTTTTTTTT
-CTGTTGCAGCTATGCGAAGATATGCTTATGTATTAATTGTTTTTCTTGCTAACACTGTATAAGCAAATTCAACTAAATTG
-ATATAAGATTTTGCATACAAGATTAGAAAACCTGATACCTAGAATTATTTTAACACACATTTTTCAAGTTTGCTTATGAC
-TTCACTAGGTTAGAACTTCTTAAAAAGCAATGCTTTAAACATTTTATTCATTCAACCTTTATTGAAAGCCAACATTGTGT
-TGCTGGATATGCAAAAATAAATCATGTATAGTGAGCTATTAAAAATTTTTATCAACTTACAAACTGAGTACAGGTACCTA
-CTCTCACTGTAAAGCCTTAGCAAAAAAAACTGATTAAAATAATGCATAATAGTACATAAAAAATTAAAATCTTCCATTAG
-AGGAACAAAAATTATGAAGAATTTCTAGGAGATAGAAAATAATTATGTACAGAGAAGATAATTCAAAATACATGTTGGAG
-AAAATTACTCTTTCAAAAGTCAGACATGTCCAGAGAAACTGGAAGGGAGGAAGATAGAACTGATGGGAAACATGGCAGAG
-GGGGACACCCCCATCATGTGATGGCAAGAAATGCTGTTTCCACCTGAATGAATTCCCAAAATCTAAAAAACAGGAAAGTG
-AGATCTGAGCTGTATTCATAATTCTTTAACGTTTTCAGTATTCTCTCCAGCACTGCTTACTGAACTTGTTCAGGAGTGAA
-GCCACGTGTCCCCTGGGAGTGTGCTGCACTGGCAAGAAGAAATGGATGACTCACAATTTTGACAGTGACTCTATAGAAAG
-AAAAAAAATCTGTGACTCAGGGCCTTGGGGAGAAGTCATCTCTTCAAAAACTCATCTGATTTTTTTTCATGCCATGTAAT
-TACTCAGAGAACATTAAGAGTCTAAAAAATTTCAACACTGGTGTCTAAGAGATATGGAATTACCTTTTGCCTGAGATGCT
-GGAAGCAGTGGGGGCAAGTTTGTAACTAGAAAGATTTGAGCAAGTCCAGGCTCAGGTATCCAAATTGCCCTCTTTGCTGT
-TGGCATAGGGGATTGAGATTTTCTGGGTCTTAAATAAGGTTTTATTTTTATCTAAGGAACTATAGTTTCTATGCAAATCC
-GAGGGGGCTTAGAGAAACCTAGCGTGGAAAAAAGAAACTGTCAAAGCAGTGTTTGGGGAAATGAGATGGGGAAATTTCAC
-GAATAGTGGGCATAGAGAAACTGACTAGACAAGAGAACGTGAACATTATAATGATATCAAATGGAAAATTTGAAAGTTTA
-TTTTGAAGGAGATGGCTAAAAACAATTTTATTCTGAATGAGAATGTGATTGCCAAGAATCAGTCTTCAAGCAATCCAGGA
-TTTAAATTTCCTTGTTCTAGGCTCAGAATTTAAATAGGCAAAATGCAGGAGTTCGAGGCTGTATGAGCTATGATCATGCC
-TCTGCACTCCAGCATGGGTACAACAGCGAGACTGTATCTAAAAGAATAAAAATAAATAAAATAAAAAATAAATGGGCAAC
-AGGAAAGACTTTAAGACCACTCTCCCCTCGCTGTTCACATGGCTGGGTTCTTCCCATTATCCAGGTTTCAATTTTAAGAT
-CACATCCTTACGTATAGTTTTCACTGAATACTTAGCAATTTGATCAGCAATTTGATCTTATATAACACATTGAAATGCAA
-CACGTGTGTTTCAAAGTCAAGTGATTAGAAGACTGTGGGCCCTAACTGCTGTTTATGGAAGTATGCATCCAAAGCAGATG
-CTGTCAGAGGTCCCATGTACACCCAATTCCATTAACAGTCTCTTCTGATTCTTTTTCTCACTGACAGCCTCTCAGCAAGT
-ACTGGTGCTCTCCCTGAGGATTTTCTCTGGCTGCAGGAGCGTGTTTCAGCGTGCAGGGCAGACTGGAAGAATCTGTGAGT
-TGATGCCTCAGGAAGCAGCCCTCAACAGACATCAGACAGGAAATGCTGGATAAATATCCCAACTTCTCACCTCTTGGGTA
-GGACAACATTGAGGAATGTCCTGCAAAGTCTCCCTAGAGTCCCAAAGGGCCTGAGCCCCAGTTACCCACAGCAGCAATTC
-TGCACATTAGCACACTCCTTTAGTAATTTTCCTCCTTTCCTGTCTTATTTCCTCACTCCTGTCCATTGTTTCCTGGGATC
-ACTCCCGAAGCAAATCACTTGCACTCACATCCACATCTCTACTTCTGGGGAGTCCCAAACTCACAAGACATTTTTCTACA
-AAGGAAAATCAAATATAAAAGAAAGTAGAGTAAGAAGAGTTGGGACCAACAATGACTGATGATTAAGCAGCAAGAATAGC
-GGCAATTAAAAACTGTAGATAACACTATGGATGCACTGATGACACAGTGTCTTGGCCAAGCCCTGTGGGAATTCATACTG
-TTTGCCTGTGTGCAGCAGCGGTGCAAGTTTTGCAGTGTTGTGAAATATTTAGTGGACGCTGACTTTCACAGAATCCTGAA
-TTACTGTTCTCAATAAGCTCCAGTATTGTGCTATTTCAAATGTAGAAATACCAAAGTTTACTAATTGTGAGCTCTTAATA
-TAGTAACTTACTAGCAGGTTATATAATGAAATGATATCATATGGCATATCATTTCCCATAATAAAGAAAAAGCTCTCAGT
-GTTCTACCAGTTTGGGCCCTTAAGACTCCTGATAGGCAGGTAGATGCTGGACCACACTCTCTTCCTGCACTAAATAGAGG
-TTGCAGACACTGGGTAAAACCCCAAGAACCACAAGCAGATGCCCACTGCTTTCCTGGCAGCCTGACCCTTGCACCAAAAA
-TACTTTAAACAATAAGTTCCCAGTTCTTAAAAGAGCAAACATACCTTTAAAGGAAAAAGAAAAAATACACAAAAGTCTTA
-CCGACCTTGGGTTTAATATTTACTCTTCTCTTTCTTAGGTCAAAGCTACGGAGTATAAACTGGGCTCCTGCCAGGTTCTT
-ACCATATTCCTTCAATAGTTGTTTTTCAGGAAGCTCTGTTTTCTGGAAGAGATAAGAAAATAGTACCTGGGAGGAAATGA
-GCCATGCTTGTGTTGCTGAGTGATTCTAACATGTTTGGTGGGGGAGAGGCACATAGATGTTAAATCATTCACCCTTTGCA
-GAGAACATCCTTTGGGTAGAGTGTTTCTTATCCTCCTCCACCCAGAAGCCTTGTTTCTAGTTTCCTGTGCTTGCAAGCTT
-GTCTCTCCCAACTAGGCTGTAAATGAATTGAGGGTAAGGATCTTGTCTAATTTACCTCTACATCCCCAGGACAATAAGCA
-AGGGTGTAAATGCCTAGTTCCCTTGCCCAGGTAAAGAGAAAAGCGCACCTGAGGCAAGATTCCACTGCAGCGCCCCCTGC
-AGGCTCCACAGACGTGGTCTGAATTCACCGCCAGCTTCACTTCCTTCCATTCCCTGTCCTACTTCCCCCATTCCTTTACT
-GTCTCTGTGGAGCCTTCCTTAGTAAACCACTTGCACACAATTCTCAAGGTTTGCTTATGAAGATCAACAGCTATGACATC
-AACCCATAGGACAAAAAAACAGAGCAATAGAAAAATTAGTAGGCAATAGAAAAATTAATGACTGCCATGTCATCTTAGAG
-AAGGATCCTCGATTTCCACTCAAATTAGCTTGAGTGGAAAGTTTACAGAGGACTCTACATTGCTAGAAGTACTGGACGGG
-CTTGGGGGGATTCGCAAGTCACCTTTACTTGCTAGGGCCACATGGTGTCTCTCCTCTGTTTCTCTTAGCACTTGTACTCG
-TCTTTTTTTGCTGTAGTCCCATATTGCCTATGATGTTTTACTCTAATGTAATGTGTTTGCACATGACTGTGGCTTCCTAA
-GGCAAAGAAGCTCTTGCCCTGGCTCTATAGAGAACCAGCTTATCCAGTCCCTTAATTCTGTAGGTCCAAATGCCAGACAA
-AAACAAAATAAAATAAAAAAACAGACTCTGATGAGCCCATCCAAGGTCAAGTCCCTGCCCCATCCAAATCAGATTCAACA
-GTGGAAACAGAGTCATCTGCCATGACACAACCACTTCTTTGACGGTACTGTGGGCATGAGTGGACTTTTTCAGGAGGAAT
-TATGCACTCAGGGTAATGACTGACATCTGTAGGGCAATAACAAGCCAACACTGCTTGTTAGATTCCCAGTCCTCTTGAAC
-ATGTTCCATCAACTCCATTCTCATGGGCTTGCTCACTGTCTACCAACATACTGGGCTAAATTTGCCTCCAGGCTTCCTCT
-CATTGTCCCTCAAATTATATAGGCGTTGGCTCTTTTCTGAAAACAATATCCTTCATTTCCTACTTTCCCCATGAAGCCTT
-TCCCAGAATTCCAATTGTCCCCTAATGCCTAAATCAACATTTTATTTTGTCCATTTACCCACTGGTGCATGGTAGCACCA
-GGGTTGTCTTCCTTACTTAGAGAATAAGTTCCTCCAAATCAGGGAGGGACCATGCCTCCTATTTCTTCTGTTTCACTTAT
-ATCATTTGGCACGATTCTGAGCACGTAGCCAGCAAAACATAGCTGCTTCTCCCTAATGTACTGAATGAAGTAGATAAAGC
-TTTTCTACAGCACCTATTTCAGTGCCTTAATCATAGGCTGGATAAGAAACTTTTTGTACTACTGCCCCTTGGGCCTCACC
-ACTACAGCATGAGCTTATTCCACTTCCAACTGCCAGGATCTGTATCTCTTTGCCAGAGGGCTTTTTCCCAAGCAGCAGGA
-AGCCTTTCTGGCCTTGGGCATAGTAGACTGGATAGTCTGGAATATTAATTGCTGGCAGCACTCAATTCAGGAGCTGGTGG
-AAGTAACCCAGCTCCCTCACCCCTCCATGGGTGTCAAGACTTGGTTCCTTCCAGTGGGTTCATGGTCTCGCTGACTTCAA
-GAATGGAGCTGCGGACCTTCGCAGTGAGTGTTACAGCTCTTAAAGATGACACGGACCCAAAGAGTGAGCAGTAGCAAGGT
-TTATTGTGAAGAGCGAAAGGACAAAGCTTCCACACAGCGTGGAAGGGGACCCAAGCAGGTTGCCACTGCTGGGTGGGGTG
-GCCAGCTTTTATTCCCTTATTTGCCCCTCCTGTGTTCCATTTCTGTCCTATCAGAGTGCCCTTTCTTCAATCCTCCCCAT
-GATTGGCTACTTTTAGAATCCTGCTGATTGGTGCATTTTTACAGAGTGCAGATTGGTGCATTTTATAATCCCTTTGCTAG
-CTACAGAGCACTGACTGGTGCATTTTACAATCCTAGCTACAGAGTGCTGATTGGTGCATTTTACAATCCTCTTGTAAGAC
-AGAAAAGTTCTCCAAGTTCCCACTTGACCCGGGAAGTCCAGCTGGCTTCACTTCTCAGTAGGTTAACTCTGAGTGTTCTA
-CACTGTTTCCCAGAGTTCCCCAGTGGGCTTGAGCCCCAGCTGCCCACAGTGGTGACTTACTTGATAATGGCCTCCTGTGT
-CTGCCTTTCCTTCCTGTCTCACTTCTACACTTCCCTGTTAGTGTTTCCTGGGATCACCTCCCAAGTAAACCACTTACACT
-TGAATTCTTGTCTCCGAGTCTGCTTTTAAGGAAACCTAAACTAAGACAATGTTCAATAAATGCCAATGGAAAGGTTGAAA
-AGGTAATTTTCACCTTCCCCCTCACAGGTAGAGAAGCTAGGCCATTGACAGGGTTGGATTTCTCAAGACTGGCAGGATAG
-AGGACTCCACTCCTATGGAAGCACCTTTCAAGAAGAGACGGTATGGGAATCAGTTTAAAACACAAAGCACTGCATCCTTG
-GGGGCATCTGTTAAGTTCATTGCACCCAACCAGACCTCCTAGAGAGGGCAGGTGCTGACAACATAACTGCCAACAATTTA
-CTGGTCCAATTTGTGATAGGCAATATATAACTCGGCAGCCCAGAAGCCACATCCCCATTTGTCTTGGTTTTCATTAATTC
-AAAAAAGAGGAAGAAACCAATAATGATAATAATAATAACAATAACAACAACTATTAGACTTTCTGCTAACCTGGGTGAGC
-AGCATTTGACTTGAGCTATGAAATCAGAAAAATGTCCCTTTCTTGCATCTTAATTTTGCAACAAATTCAACCTGTTAATA
-TAGTCCTTCAGGAATTAAACAGACAAAACCATACAAATGCTTGGAGGATGATGGGAAAAACCAGTTACTTCTGACTAACT
-GGAAGGGCAGCTTGATCATTTCTGATGGTTGATTGCATAATTTCAGTCCTTGAACATTTAGTGTGCCATCCCCTTGGTTG
-CTGGAGGAATGCAATTGCTCTATGAAATGTGAAGAGACTTGACAAGAACTATTTTCATGGTTATGTGCCAAGTTCTTGCT
-TTAACTTGCTTGCTTAATCAAATGTCTACTCATGATATCTTTGGGAGTTTCTAAGTTTCATTAGCTCTTTCCTTAAAGAG
-AAATTAATCTACTTGGCAAGGAAGGTTTATTCATCATAGGTGAGCAAACATTAGCACTTTCTAATAATTAGTTCCAAGAT
-CCAGTTTCTAGATACCTACCAAGTTCAGCCCTGGTTCACAAGAAATTGACCTATTTTCAGTGGAAGCACTGTAACCAGTG
-CAATAAACTCTATCTCATAGAACAGTGTTAATCTGTCATCACAGCCAAAATGATTTGTTATAGCAAAGCAACAATCAGAG
-TAAATGATGCCTGTCCCTTCATTAAGGAAATCTAGAAGAATGCTCTGTCATGAGTTTAATCTGAGATTTGCCTGGCTATC
-CTGATGAAAACCATCTAATGAATATGTAAATTTATCATTGTCTTCTATTGTAAAAATGCACAGCAAATTTTCTGCTTGGC
-TATGCATAATCAGAAGAGAAATCCTCACTGCTGTGAATTTGAACTTGAATAAAAATTGTCTTCTCAGGAAAAGAGCATGC
-TAGATGGAGGAGGGGTTAACAAGAGCCTTCAGTTTACAGATGTAGGATGTCTTCCTGCTGTTAATTATTGTGGTAGGCAG
-TGTAATGGCCTTCTCCCCAAAGACATCCACATTCTAATCCTTGGAAACTGAATATGTTATCTCACACAGCATGGGGCCCA
-CTGGCACTGGACCCCTCCAGTTGGCAGGTCCACTGAGGCTTGGGTACATGGGTAGACATTCACCCTCATTTACCATTCTG
-CTGAAACTGTATCTCTAGGTTTCTGAATGGGAAGAAGGAGCCTACTGGAAGGAAGAGTCATGGCTCCTGGAAAGTGGGGG
-AAATGAAGCAAAATGGAGTTCTTTCCAGAGTTGCCAGATTATTTCAATAAAAATATCAGACATGTGTGAGTAAAAAACAT
-GGACAAAATAGCAACAAAAATGCAATATAGAAAGATTTCTGGAAACAATCCATAACGTCTTATATTTTGCACTGAATACA
-ATGACATTTTTTCATTTCTTTATTTTTCAGAAACTCAGGTTTTGTACACTTGAACTAGAAAAGCATCACATAGGTCAAGA
-CAAGAAAAAAAAATTTTCAAACATCAGTTAATGACATGAAAAATAATAAAAACTATTTAGTTAGATTGTTTAGACTTTTA
-TAAGGAAGACTAATATAAATTTACTGACACATTTCTTCAATGTGTTTCCAGAATAAAAGCTCAAACTCTCAATGCTTTCA
-GAATAAAAGACCACACATGATCTTCGGTGTGGTAAACACCCTCCAGAGTACTTCAAATCATGGGTTAGACAGAAACTACA
-GACCAGCAATATCCAATGGAAATATAGCATGAACCATGTTCAAAGAAGTTGAAGGAAACATATGAAATTATTTGTAAGAA
-TCTATCTTATTTAACTTGATATAGCAAAAACATCATTTCAATGTGTAAACAATATAAAAATTAACTAAATATTTTGCTTT
-TTCAAATCTATTCTTGAAATCCGATGTGTAATGTACTTAAACCATATCTCAATTTAGATAGTAAAATTTATCAGAAATAA
-TTAATCTGTAGTTACATTTCATAAAATTTATCATTGGCAAGTAAGATTCACATACTCAAGTTGTTCTAAGCATACATTAA
-AAAGTTTTCAATAACTGAATCAGTTTTTTATTTTAATTTTTAATTACAATTAAATAAAATTAGAAATTCAGTTCTTTAAT
-CACAGTAGGCAGCCGGGCACGGTGGCTCACACCTGTGATCCCAGCACTTTGGGAGGTCGAGATGGGTGGATCACGAGGTC
-AGGAGGTTGAGACCATCCTGGCCAACATGGTGAAACCTTGTCGCTGGTAAAATACACACACAAAAAAATTAGTCTGGCGT
-GGTGGAGCGCAACAGTCGTCCCATCTAGTCAGGAGGCTGAGACAGGGGAATCGCTTGAACCCAGGAGGTAGAGGTTGCAG
-TGAGCCAAGATCGTGCCACTGCACTCCAGCCTAGTGACAGAGTGAGACTCTGTCTCAAAAAAAAAAAAAAAAAAAATCGC
-AGTAGCCACCTTTTATATGCCTAGTTGACACCTGTAGCTTATGGCTACCATATTGAACATCACAACACTAGCTCATACAC
-AATGATTATAAGAATGTGTGAGATTTGTTTCACTTTCATAAATTTTTTGTGCTAATTTTCTATGTGACCCATTTTTTTCT
-CCATGTTTAATCTGAAGCCTTTAAATGAGAGGCCCTTGTGTTCTTGTCAGTGGTGTCAATAAGGAAGTGAAGAAGGTAAG
-AAGGAAAGGGGAGAAGTTTCTATGAAAGAATGGAGGATGTTGGCAGAAGCTTCAGAGAAAGGAAATCAGCCTAACTCTCC
-AAGATCTGTTGGGCAGAAAGAACAGAGGTTCCCAGGGCAGTAGGATGGGCCTGGAAATTGTTCTAGCACACTTTCAGACT
-GGGCTCTTGTTTACAAATGACAGAAACTTGATTCAAACTGGCTTTGACAATGAAAGTACTCTATCAATTCAAATAAATAA
-AACATCTACATGTTCTGTAGTGAGAAGCTCAGGCATGGCTAAATCCAGAGGATCAAATAATGTCATCACAAATTTATTTT
-TCTTAATCTCTCAGCATCAATGTCCCTGTGTTGCTTTAAATCCAATCAGGGTTTCACCATAGTAAAAAGATGGCCACCAG
-CTACCCCAACCTATGTCCTATTCTTAACAACTCTACCAAAAAGAGTACTTCTTTCTGAGAAGCCCCAGCCAATGTCCTGG
-GCTGATACTCCCTGGTCTGGGCATAGATCTTATGCTCATTCCTCAACTAATTCCCAGGCCTGGTGAATTTCCCAGCTTTG
-GAGATGGAGGGTTGGATCTGACCACTCAACCCCCATGAATTAGAAAAGGGAGAGTGATTTGTTCTTCCAAGGGAAAATCA
-GGCTGCTATAGCTAGGAGAAGAGGGAATGGATGCTGGGCAGGAAAAATTTCTTGTGTGTTAAATCAAGACTTTTGACAAT
-GAGGAGGCTAGTCAGTTCCCCCAAAATAATTTATTCAGACTTTAGGTGTTTCATGAAGAAAATTGTATCATCTGCCAAGC
-ACCTAATCTCCTTTCCCCATTAGTCAGTCACATGGGAATTCATACCTTTTTAAAGCTACCTAACCTTGAAAAAGTTGTTT
-AATCTCACCATGATTCAGATTTTCCATCTATAAAATGGAAATGATAATAGGGCCTACCTCATACATTTATAATAAAGATT
-ACATTTAATCTTATATAATAAGATAATATAATAAAGATTATATTTAATCTTTTATAAATGTATGAGGTAGGTCCTATTAT
-CATTCCTATTTTATTTGTTCTTATTTGTGAAGTGCTTGCAATAAAGTCTGGCAGATGACAAGGGTTTAAAAAAACCCCAC
-TAAATAAATACACAAAAGTGTGATATTATACATTTTTCTCAGAAAAGAAGATTCATTGACTTCTCAAATGAATTCATCTA
-GGCTTCTTCCCATCAAGGTGGCCTCCAGAGAGATGAGAAACTACTGGAAATGTTTACTAAATAAATGAGTCTCATTTTCA
-AAGGAAAGGTCATAGACACTTTTTAAGACACACAGATGTCCTTTAATGCAGCTCATCTGTATTGTAATTTCTGTGAGCTT
-GCATTAGAATGTAATTAAATTAACACCAATGCAGTCCTCCTGTCAAGGAAGCTCTGCCTAATGTAATGGCGTCAAGGAAC
-AATCTGAGCATTACACATATCATGAGGAATTGTTTCCATCCCCATTCTATTCTTATTGTCACAATATTTGGTTTAATTAA
-GTTATATAGGATAGTAATTATAGCAAATGTAGTTTGGCTGGGAAAATACTCCTTGTGATATGAAGGTCGCATCTCCAGAC
-ACCACTGCTGGGGAAGGCAGAATTCAGTCCCTACTTAGGACATAAAAACTCTCAGACACATAAGAAGACTGAGAATAGGA
-ATTGCCTGCTCCTGAAAATGCCAAATTGATATATGGTGAGAAGCCGAGTCTTAGAGTCCCTTTATTGTTGGATACATTCA
-ATAAATAAAAGGAAAGAGCCACCTATAAAAGGTAATTCAAGGGACCATATGCTCTACCTTTCCAAAAAGATAAGTCTAAA
-ATTACAGCCCTAGGGTCAGTTCTCTGATTTGGCATTGCCTCAAGTAGGCCCTTGCCTGTTACAGGGACATTTGCTACCTG
-GAGGGAAACACATTAACATTCTAGCACCACCACCACTGTCATGTAGGTAATGTACTAGATTACTCAGCCGGGTGTGGGAA
-TGTTCCCATTCCTCACTCTTCCCCATACCCATGTCCTTGCCCAAGAACTCTCCAGTTCCTTCCTCTAGAAAGTGTGCTTT
-GTCCCATGTGGCTTGCTTTGGCCAGTGACGTATGGGAAAGAGTGAGGATGTACTGTTCTGACCCTACACCCAAAGAAGTG
-CTATCCCTTTCTGCTCACTCCTCTTGGTTTCTGCCACACCATTCTTCTATTCTAGAAGAATGTGAGACATATGGAACAGA
-GGCACCCTGGCCAATCAGCAACTCTGTGAGTGTGATCATCAATGCTTATCATTAAACGCCACTGAGATTTGGGGTGGTTT
-GTTGCGCAGTATGGCTGAGGTAACAGTTGACTAATACACTGGTTATTCAGCTAAGACAGAGAGACGCTCTGAGTGTCTTA
-ACCATAGCAAGTAAAGTTTCCTGTAAGACAAGGCAGAATTTGTAGCCTTCATTGTAGCCATTCCCTGGCCCTTTTTCCTT
-GCTTTGTATAATTATAGAATCTAAGGAGTGAAATACTCAAGTTCCAGAATTTTTTACAGCTAGGGTGGCCATATGATGCA
-TTTGTAGCCAGTGATACATGTTTTTTTTTTTTTTTTTTTTTTTGCAGGGGACTCCTGGAAATACTTTTGCCGTCATGAAA
-AAAGCAGACTTTTGTTACTGCTCTTCTCCCTTCTTCCTGCCTTGAAGGCAGTCATGATTCCTGAAACTAATGCAGCCAAG
-GTGCAGCCAGGAGGGGAGCAGTGTGAGGTTGAAAAATCAACAGCTTAAGGAGGGCAGAGTAGGAAGATGGAAAAGGCATG
-AGTCTTTGATGATGTTGCTGAGTTAGCTAAACCCCAGTAACAAATGCCTCAGTCTTCTTTTTCTTAGAGCTAAAATTAGT
-GTCCATTTTGTTTAAGCCCCTATTAGATGGGTGATATCTAATGTGATATCTAAAATTAAATGAATTTCTAACTGATATGC
-CTAATTTACAGTTTGGCTTGGAACTGGCTTAGTCTGTTTGCATCAGAAAGATGGCATAGTTTCCCCCATTGGGTATTAGA
-GAAACTAAAATAGAAAGAAACTGAAAGTTTTATGGCCTACTGAGGTCAGAAGGAGGGGAGAGCAGGGAAGCAGCAGTCTC
-AACCTTTAACAGCAAATCGAAGTCCCCTAGGAATTGAGATGGGGAAGACTTGGAACACCTCTCTTCTCTGTGTCTTGTCC
-TGTTTACCTATTAAAACCCAACCCATCCATTCCTAGCCTCTTCCATGAAGCTTTCTCAAAATCCAGCCAGAGTGAACCAC
-AGCTTTCTCTGAATATCTAGAGTTGTTTATTGGTTTTGATCTATGTGTGCCCCTCAATTGACACATCACACTTGTCCCTG
-CATGAGTCCAGCTGTGTAATGTGTCTTATCTTCCCTACAAAGATAACATCTTAATCTCTGCAGAATCTCCTGCAGAACCT
-AGTAAATACGCAGCATACATCAAGTCTTTAGTAACCAGTAATAACAATTAATTACATAAAATGAATATAAACTTGCTTTA
-TAACAAGCCTATCATCACACCTCTGCTTATGGGTGTATCTGGAAACTTAATTAGGAGTTGGTAGCAAAAACAGTCAGCTA
-TTTCTCTTCTATTGCAGAGGAAATAGATTAGGAGAGAAATGAGAGAGGACAACAGAGAGGAGAAACAAAGAACAGTTCAA
-AGTCACCTCCAAAGAGACCAGAGTCTCTGTATAATTTATTCCCTCTTGGGAGCATTCCTATCAGTAGTTCTGATGAAAAG
-AGAGTTAGCAATCTGGCACCGTTTTGCATATTTACACTGTTCCTTAAAATATATGTTGAATCATTTAGACTTTTTAGCTT
-CCACTTTAGTAAAAAAAAAAAAAAAAAAAAAAAAAGAGGGAAAGTCTAAGCTGGAGAGTGCTAGAACTCATAATTAAGAA
-GGAGGGGAGTCTTACACTGGTCCCCCAGAAGCAGACACTGAAACAAGGGTTTGAGTCCAGATGGTTTATTTGTGAGGTGA
-CCCCAGGAACCATTGTAGGAAAATGTGGAAATGAGACAGTGAAGGAAAGGAAGCTAACACAGGTGCATTAATGAGTGGGT
-AATTGGAAATCAGTCCCCACGGAAAGCTCTATGTAGAACACAGCTCCAAATTGTTCCCCATGTGTGATGAGGAGCTGGGA
-TATTTATCTACTAACTCCCATTTGCACTTGGGCCCATTGGGCACTCCTAGACTGCCCCACGCATAACTGATCATGCTCCT
-GCAGCCAAAGAAAGTCCTTAAGCAGAGAATCCAAGGTGCTTGCAGTAAGAAACCATTGGCATGTGCAGGAATACTGAGTA
-TTGATGATATGTAAATAGGGCATCAATCGTGTCTGCTATATGGGGAAAAGTAAAGGGTAGCAGAGTAGGGGCTGGGGGAT
-GAGAAAGCAAGGAATGAGGAGCACTCACTTGGGGAGGACTGCCAACTGTGTAGCCAGGTCTCAATGAACAAAAGTAGGCA
-TTCTGTTGAAACTGCTGGGGAAGTCTATAATATAATACCTCTACCATTTATCTTAATTGTCTTTAGATATAGAATGCCTT
-CAAAATCATAAGGGCCAAAACTTATATTTATCAACCTTCCTGTCCCGTATTGAGGGAATAATAGAGTACATCCATATAGC
-AGAATATTCTGAATCTGTTTAAAATTATGATGCATAGTTTCAATAAAAAGAAAAGGCATTTATAATTTAAAGTTAAGTGG
-TTTTTTTAAAAGGCAAGATCTAAAATTGTATATCTGGTAGGATTTCCACACTGTAAAAAACATGTACTGAACCAATATTG
-GAAGAAAATGTTAACTTTTTAAAAGTTTTTGAGTGGTGGGATTGTAGTTACTTTCCTCTGCTTCCTTATAATTTTCTAAA
-GTTTACCTGCTTTCCACAAGGACATGTATTACTTATAACTATAAAGATTTTTTATGAAATCTCTAAATATAAATAAATGT
-GTATATATATATGTATATATATATATATATATATATATATATATAGCCACTCATTGCCACCAATGGTCCTGCAATAACTT
-GGCCCATCTGAGCCTTTGTTGTTAGATTCTGTTTAGGACTGTGCTCAAGGGCACTGGCTCCCAGGAGATTAACATCTTCA
-GCTTTGCTCTCATTTCCCAAGAAGTCGGTGTCACATTTCAGTTCAGCCAACGAACAGGTATTCACTAATTTAATAAATAT
-TGATAGATTACCCAGTGTATGCCAGGCACTAAATAAAACCAAATATAGTTTCCAGCCCTCATGGAGGGAACTGAGTAATA
-AAAGCAAATGAATAAAACTGTCCATCTTTGAGTAGTCCTATGCAGGAGAGATGCCTGGTTGTATTAGAATCTGCAGTAGG
-AGATTTGGATCTAATGGGTTGGGCTGCCCTCAGGAAGTGAGGGTCAACTTAAGATCCCAAGGATGCATGGAAGTTAACCA
-GGCAAATGTTAATTGGGCTTCTAATGTGTGCAAGGGGTCACCATGCTGGAGTCTTGGGACACAAACTTCTGTCCTCAAGG
-ATCTAGCCATCTGATTGCCAAGCCACAATCAGGATTCCTAAAATAAAAGAAAAATCCCCACCGGTATTAGATTAAGGCCC
-CGGATGTCTATAAGAAGTTCAAAGGAGGAGCAATCAATAAGGGCTAAAGTAGTCCAGAAAGACTCCAGAGAAAAAGTAGC
-TTAGGTGCACTTTTTTGTCAGCCAGAAGGACAGGCTTGCCTAGCAAGGGGAACTGCATGAGCAAAAGTCCAGAAGGGTCA
-ATGCCAATAATCTTTATATAAGAGAGTAAGATGAGAGGTTGCAACTGAAACTGTTACTGGAAAGGCATCCCGATCCTGAC
-CCCAAGAGAGGGTTCTTGCATCTCACACAAGAAAAACTTCTAGGCCAATCCATAAAGTGAAAGCAAGTTTACTTAAAAAG
-TAAGGGAATAAAGAATGGCTACTCCATAGGCAGAGCAGCCCTGAGGGCTGCTGGTTGCCCATTTTTATGGTTTTTTCTTG
-ATTATATGCTAAACAAAGGGTGGATTAATAATGAGCTTTCCAGGAAAGGACTGGGCAATTCCTGTAACTAACGGTTCCTC
-AGGCTTTTAGACCATATAGGGTAAATTCCTGACGTTGCCATGCACCTGTACATTGTCATGGTGCTGGTGGGAGTGTCTCT
-TAGCATGCTAAAGCATTATAATTGACCTATAATGAGCAATGAGGATGACCAGAGGTCACTCTCATTGCTCTCTTGGTTTT
-GGTGGGTTTTGGCCATCTTCTTTACTGTAATCTGTTTTATCAGCAAGGTCTTTATGGCCTATATCTTGTACTGACCTCCC
-ATCTCATGCTGTGACTTAGAATGCCTAACCATCTGGGAATGAGGACAAGAGGACAGCTTCAACTTTTCATGACTTCATCT
-CCAACCCAACCAATCAGCACTTTCCACTTCCTGCACCCCCTACCCATCAATTTATCCTTAAAATCCCCAGTCTCCAAATT
-TTTGGTAAGATTGACTTGAGTAGTAATAAAACTCTGGCCTCGCATTCTGCCGGCTCTGCGAGAATTAAACTCTTTATGGC
-AATTTCTCTGTCTTGATAAATCGATTCTATCTGGACAGCTGGCAAAATGAACCTGTTGAGCAGTTACAAGAGTAAAGGAT
-GAGTACTGAGTGGAAAGGATGGCCTGTCCTTGGGAGTCGGGTAAGGACACTTGAACTCATGATAGAAGCTAGGGAGCAAA
-GAGTGATCAGACAAAAGTTGTATCTATAGGAGGATGGGTGTGGATTACTGAGGCCAGTCCCTATGACCTCTCTCTTTCCA
-GGGCCAGGAACTATTACTGTTTTTTGTGACTTTGGTAAGTAAGTGAACCCAGGGCATGGTTTGCAACTGGCTGCGTTGGT
-CATTTTTATGAATCGATTTGTGCAAACCCATGGCAAGCTTTCCTAATATAAACAGGTGGAAAGAGAGAAGTCAGAGGGGC
-TGGCCTCAGTAATCCAGACAGCAAATCTTACAGGGAAGACCCTCCTTATATCCTGGGGAAATTGGTATATGAGAAGTTAA
-CTGGGTTTTTACCCTCTGAAAAGGAAATTTCTATAAGAAAGGGAAGCATCACTGCATTGCTTGATAACATCTGTTTTATC
-TTGCTTGTTTTATCTGACTTTCTCCCATGGCCAAGGAAACATGATGAAAGAACCAATTTCTTTCCTCTTTTAGAAGCTCT
-GATCATGGAGGAGACCATATCTGCAAGTCATCTAGGACTCAGCTCTTTTAGAGCTATCCATGGACTGGGAGACCCTTCTC
-CCACTTCAAGGAGCCCCTCTTTTGTACCCCCCAAACTTCCTGGCTTACAAAATTTGCTGCCAGATGTGGTGGTGTGGGAG
-TGAGGGTGGGTGGCATAGGTCATGTTGGTAAAAGGCCTCCCATAGGCGGGAAAACTGCAGAGCCAGGGGGCCTAGGGGAA
-GGCATCTCTTGCCTAGCAGATGCTGACAGAGGAAATGGCACATTCTGCCCATGCATCTGTCCTCATGATTCACATGCCAG
-CAATTCCTCAGGCTAGAACATACCTTGTAGGTCATTTTCTAGCACATGCCGTAACTAGATAGCCCCTAGGTCTCTCTAGG
-AAAGGTGACTTTCTAAACTTTTTTTGTATTCTGTCTGTAAAGTACTGCATACTTTAAGGACTTTTTAAACAATAATAGAG
-AAATCAGCTTCATCCCTGCTTCAAGACACATCACAAAGCTCCAATCACAAAAACTCTAGAGTTTCTGTAGAGGGATTAAA
-GTGTGGCAGTCTAGTGACCTAAAGGGATTTGACTTGAAGCTGTATTTGCTTAGCACACACGCTGTTTTTATCTTGATTTT
-AAGTTTATTGGTGCAGCACATGGAAATAATGGGCATCAAAGCCCACACCTCCCAAGCTGGTCCTTGATGCCATCACTGAG
-CCCTAAGTGAGAGGCCTGCTTATAATAGTCCTGCATTCTCAGCTTCCCTTAACCCCAAGAATAGAACGGTGTCTTGCATG
-CAGAAATAGGTTATTGGTGAATAAATTGCTTAATGAATTATCTAGTTTCCCTAACAGAGCTGGTTACTTCTTTCTCATGT
-GAAGGTGAGCACCTGGTGAGGTTTTCAGGAATCAGGTTCACCTTGAACACCATACTCAGGCCTTGGCGGCTCTCTGGGCC
-TGCCTGGCTCCTACAAACACCATGCAGTGTTTCTGGATCTCCTAGGCCCTCTAGTGGCTATTCTTAGGCTGAAATCCCTC
-AGAACTCAGCCTCTCAGCTCCTGCTAAAATTTCAACCAGTCCCTGAATTTAGAAATATGTATATATACTTATTTTGCTTC
-TCGTAAACTGCAAAGAAATAAATTTAATTATGTCTAGTTTCTGATCAAGATTTATCTGGTCTCATAGCCTTCCCCTGGTT
-TGTGTTTTAATGAGCTTTTTATTTTTCAGTTGAAAGATTATACCAGATGTCAAGACTTAACAGGAATCAAGACAGCATGG
-ATTGATATAAGGGTAGACATAATTATCAATGGACAGAGTACAGACTCCAGACACAGACCTACACCTATATAAGCAACTGA
-TTTTCAAAAGTATCCTGCTTGCCTGCTTGTACCCCCAAATGGGCTCTCCCTCACCCCAAATGCATCTTTAGGTTTGTTTC
-AGAGAATTTCTGATGGTCTTTCTCGCACAGAAACACACAAGGGGTCTAAATGGGTTCTTTATGCAGAAGAGCGAAGATTT
-CCAGGTCCAGTGGGCCAAAGTGCCTTCCCCTGCAAAGCCTTTGAGTGATTCCAGGCACCAGGGGCATCAAAGCCTTGGTG
-GGACCAGAAACTATTGCTGTTTTTTATGACTTTGGTAAGCACGTGAACTCAGGGCATGGTTTGAAACTGGCTGTGTTGGT
-CATTTTTATGAACTGATTTGTACAAACCCATGGGAAGCTTTCCTAAATAGAAACAGTCTGCATTATGGTGGTATCACCTT
-CATCTGACCCCTGGGAGCTCTAAAGAAAAGCCCATGATACTCACCTGGCCTTCAGCCTGACCAGGGGATTAGGCCACTGG
-CCAGGATGAGACTGAAGGAGGAAAGGAACCTATACAACTACTCTTCCCTTGGTTGAAAGGAAAGTCCAGAGAGAATAGCT
-ATTTGCAAATATCTGGGCTTCTACTGGGTGCTTACTGTTGAGTATCTTATATTGGGACACAGGTATGTTCATCTCCATTT
-TACAGATGAGGAAATCGAGGCTCAGAGTTAAATATATTTCCCAAGGTCAACTAAGTAAGTGGCAGGATTAGGATCCAAAC
-CCAATTCTAACACTCTCTAAAACCCACTCTTTAGCTAGCCCCTGCCTCTTAGCTTTGGGGTTCAGGTTCTTGACTCAGTC
-TATGCAAATGTTGCCTTCTGGAATTTGGCAGTGCACAACCTGCACATCTGTACAGTGTAGCTGAAACCAACTTCTGGGTT
-GAAACCCTTCCATATTCAAGATTCTAAGCCTGGGCTAAAATCTAGAGCCTTGTTACTCAAAGTGGTCCCTGAACCTGCAA
-CATCAGCCGTGTTTGGGAGCTTTTTAGAAATGTAAATTTCTGCTCTCCTGCTGCCACTCCCCCCAACCCCTTTCTATTGG
-ATTACACTCTCCAAGAATGGAGGCTGCACCCAGGATTTCTCAGCTGTTATGTGCATTCAAATCACTGGGAATCTTGTTAA
-ATGGAGATTCTGGCACAGGAGTTCTAAAGAGGTAGTGCTAAGCTTTTGCTTCTTCGGGCAGCTCCCAGATGATGCCGATG
-ATGTGAGCCACACTTGGAATAACACAGCTTTAGATCAGTAAGTCTCAAACTTGAACCTGTATTCAAATCACCTGAAGAGC
-TCGTTAATACACAAATTGCTGGGCCCTACTCTCACACTCTCTTACAATAGCTGTGCACCTTCACCTTTACTTTCACCCCA
-AGAATAAAACAGTTTCTTGCACACAGAAATAGGTTATCCATGAATAAGTTGGTTAATTAATTATCTACCTTTGCTAATAG
-AGCTGGTTACCTCTTTCTCATGTGAACATGAGTACCTGCTGAGAGAGTGCTTCAGAGGGTCTGGAGTGGAGCCTGAAAAT
-TTGCATTTCTAACAAGTTCTGGGCCCAGCATGGTGGCTCATGCCTGTAATCCCAGTGCTTTGGTAAGCCGAGGCAGGAGT
-ATCACTCGAGGCCAGGAGTTTGAGACCAGCCTGGGCAATATAGTGAGACCCCATCTCTACAAAAACTTTTTAAAAATTAG
-CCAGGCATTGTGGTGTGAGCCTGTTGTCCCATCTACATGGGAGGAAGATCCCTTCAGCTGAGAAGTTCGAGGCTGCAGTG
-AGCTGTGATCTAACAAGTTCCTAGGTGATGTTGCGATGCTGCAGGTTTAGGGACCCCACTTTGAGAACCAGTGTTCTAGC
-CTATCAGAACTTCCTCTAATTAGACAACTAACTCCATGCTTTCTGGCATTTCATTTTTATAAAGCCCTATTCGGTCCTTG
-AATTCTAGCATTTTAGAGCTGAAAGGGACTTCAGAGGCTACCTTGTCTCAATTAAAGAAATGCAGGTCAAGGGTCCCACT
-CAAGGCCATACAATTAGCCAAGAGGCAAAGTCAGGATTAAGCATCCTGACTCACTCTATTTCTATGCTGTTTACTCTGCA
-TCCTGCTGGCTCCAAAGCTCAATAAATTCCCTGGCATCCAGCAACTGCAGTATTTTTGGTGAGCTCTCCATCCCAGGCCA
-GCTTTGAGGTGCTAGAATCCCTGTCAGACACATATGTCATCCGCACAATCATGGAAACGCAGTGGCCTCCTACCTAACAG
-CTCTGTGAAAGAGGGCTTTGGAAAAAAACAGCAGCTGTGCTGGCCACTGTAGCAGAGAGAAAATGCAGCAGCTAGCAAGC
-AAACCCAGACAAGGTGAGTCAGCATAGAGGCCCTGGGGCTAAGGAATATACCAGGATACTGCCAACAACTGGCACCCAGA
-TTCTCCTGAGCAAATCTGAGAAGGTCAATCAACTTCTCTGTGCCTGAAAAGATGCTTTTCTTTAGAGAAAACAATACTCT
-TATTCAAGGGAATGAACACACAAGAGGATATCAAAAATGTGCTTGGGGTGGGAGTTGTATCAGTCCTGCTGCATGACAAA
-TCACCCAAAACTTAGTTGCTTTAAACGACAACCATATTCTTGCTCACAAGTCTCTGAGAAAAAGGAGAAATGCTTAAGAT
-CCCTTGAAGCCTAGACTTGGAACTGGCATATCATCACTTCCTCCATACTCTACTGGCCAAAGCAAGACCCAAGGTGAGCC
-CACTTCTTAATGAAAGGAACTGTAACTTTACAGTATAAGGATGTAGAGAGGCGGAAGGTTTGTGGCCATTTTTGCAATCT
-ACGACAGAGAGGTCTTCTTAGTTTAGGAAAGTCTGAGACAAAGATTCCAAAGCAAATGGTTTACTTGGAAAGGAAAGGAA
-ATACCGGTAGGGGAGAGAAAAATGGAGACACAGAGAAGCAGCAGCCAGTAAAGGGTGCAAAGCCAAGTCGGCTGGCGCTC
-TGGGCAGCTGGAGTATAATTCCACTGGAGAACTCTGGAAGCTGGTGCAGGACACAGGCCTCATCATCATCCTACCTAAAG
-GAGGACGCCAGGATGTTTATACATCAATCCATGATATGGTTTGGATCTGGGTCCCTGCCCAAAACTCACATTGAATTGCA
-ATCCCCGATGATGGAGATGGATCCTGGATCCTGGTGGGATGTGATGGGATCACAGTGGTGGATTCCTCATGAATGGCTTA
-GCATCCCCGTGGTGCTGCTCCCATGATAATGAGTGAGTTCTAATGAGATCTAGTTGTTTAAAAGTATATAGCACCTCCCT
-CACTCCAACTTTCTCTTGCTCCTACTCCTGCCGTGTGAGACATCTTATACCTCCTTCCTCTTCCACCGTGATTGGAAACT
-TCCTGAGGTGTCCTCAGAAGCAGAAGCCATTATGCTTGCTGTACAGCCCGCAGAACTGTGAATCCATTAAACCTCTTTTC
-TTTACAAATTACCCAGTCTCAGATATTTCTCAATGCACGAACACACTAATACAATCCGTATCAGTCATTTACTGAGGCTG
-CTCTCAGAGCACAGAAATTCCCTGTAATTTCAGCCCTCCACTCTGGGCAATGTGGCTTAAGAGGTCAGAGCAAGACCTTG
-ACAAAAAAATAAAAAAAGAAAAGCAGATGCAGCTAGCTTAGCTGGACCGTTGTGCCCTGCAGCGGTTAGACAAAGAGGAT
-AAAAGGGAAGGAGGATATGAGTAGGGCACCACCTACAACATATCCTTCACTGTGATGGTGATTAAAAAGAAAAAAAAAAA
-CTCAAGTTTCAGATTTATGTTATTTTAGTCAAAACATCTTTTTTTCTTTTTTTAAGACTGTTTACTGTATTTTGGATGAT
-GCCTCAGTTCTCTTGCTGGCAGAGGTTGGAACACTAGATGGCATTGTATTAAGTTGTCCTATAGCTCAGGAAAAAAAAAA
-ATGCAAAGGGATGTTCCTAGTTGTCTTTGGAATTTAACAATTATCAGCATGAGTTGAGAGCAAACAACTGTCCCAGCCAA
-AGTGATGATGGGTCGCTTCAGCTCTACCAAGGCCACCACTCCATCTTGATCTCACACCTTGGCAGCAACATCACAAACCA
-TGGGGGCCAAAGCACAAAGGGAGCAGGCTAAGATAGGAGGCATTTTCTAAAAACTAGGATTCGCAAAACCCATGGGAGGA
-GAAGCAGTAAGGAGAACGAAGCCTTCTGCCTCAAGAAAGGTCTTTGAGAGGCACAGAAAAATGGACTGCAAGAAAAAAGC
-AGCAAACTTATAGTAAAGATTTATTCTTACTTTAGTAATAGTAAAGATTTATTCTTTGCTGTAAGTTAGGTGTCTTGGTG
-TTGCCTGAAAAGAGATACTGCCTTTCTCCCTTGAATGTAAATGAGAGAGAACTCTTGATGTCTTTTACCAACTTAGAGAA
-AGCCCATACCCAGCCTTCACAAAATGCCATGAGAAAAAGAGGGGTCAGGTGTGGTGGCTCACGCCTGTAATCGCAGCACT
-TTGGGAGGCCAAAGCGGGCAGATCACCTGAGGAGATCAGGAGTTCAAGACCAGGCTGGCCAACATGGTGAAACCCCGTCT
-CTGCTAAAAGTATGAAAATAAAAAAAATGAAGAATTTACTCTTGGGGGCAGGAATGGAAATGAGAGTGGCAATAGGATGG
-GGTTGAAAGTGAGGGTCAAAGGCATTTAACATTTTCTTTAAAATATTTTAAACAAGTGAGATAAAATGTCAACAATGATC
-AATTCCTCATAATGGATATTAGGTGGATGTCATCTTATTATCTTTATCTTAAATTTCAAAAAAGAAGAGAAAAGAATATG
-ATGTTCTCTTGTAATTAGCAAGGGCTGATAGGGTTCAAGAGGTGACACTGATATGGATCTTGAGTAACTGTTGACAAATA
-CTTCCCTTTACTGAGCTTCCATTTTCTTGTTTATAAACTGAGGATAATGATAGTAGTGATGTCAGGGAATTGTCATAAAC
-CTCGACTAAAATAATGTACTCGGAACAGTGCCTAAAGCAAGGTGGGAACAGTGCCCAAAGCAAGGGGGTCCCTCAAAAAA
-TGCTTGCTTGCCCAGGACCCTCACCAGCCACCACCACCAATGTGAGTACAAGGATTAGTTAGGCTCATCTTTCTCACTGA
-GTCAAACCATACGATTGGCTGGTTGTCTGGATGTGATTAGAAACAGAAAAATCTTAAATAAAGCCTCATCCTGAATCCTC
-TCAATCCAGAGACAGAGTTGACCTAAGACCAAAAAAAAAAAAAAAAAATAGAAAATAGTTTTTGGAAATATGGGTGAAGA
-GACATCTCCTCTTATGGAAAAAGGGATTCTAGAATTTAACAATAAATATTCCCAACTTTCCCCAAGGCTTTAAAATCTAC
-CTTGAAGGAGCAGCTGATGTATTTCTAGAACAGACTTAGGTGTCTTGGTGTGGCCTGTAAAGAGATACTGTCTTTCTCTT
-TTGAGTGTAAGAGAGAAAGGACAGTCTACTCAATAAAGAGTGCTGGGAAAACTGAATATCCACACACAGAATAATAAAAC
-TAGATCCTATCTCTCACCATATACAAAGATCAACTCAAAACAAATTAAAGACCTAAATGTAAGACAAGAAATTATAAAAC
-TACTAGAAAAAAACACAAGGGAAATGCTTCAGGACATTGGCCTGGGCAAAGATTTTATAAATAAGACCTCAATAGCACAA
-ACCACAAAAGTAAAAATAGGCAAATAGGATTATATCAAACTAAAAAGCTTCTGCACAGCAAAGAAAACAATCAACAGAGT
-AAAGAGACAACCTGAAGAATGAGAGAAAATATTTGCAAAGTATTCATCTGACAAGGGACTAACAACCAAAATATACAAGT
-AACTCAACAGCAAACCATCGTCGTCATCATCATCATCATCATCCAATTTTTATAATGGACAAATGGTCTGAATAGACATT
-TCTCAAAAGGAGACACACAAATGGCCAACAAGTATAAGAAAGAATGCTCAACACCACTGATCATCAGGAAAATGCAAATC
-AAAACCACAGTGAGATATCATGTCATCCCAGTTACGATAGCTAATTATTTTTTTCTTTTTTCTTTTTTATTATTTCAATA
-GTTTGGGGGGAGCAGGTGGTATTTGGTTACATGAATAAGTTCTTTTGTGGTGATTTCTGATATTTTGGTGTACCCATCAC
-CTGAGCAGTGTACACTGTACTCAATGTGTAGTACCACCCCTGAGTCCCCAGAGTTCATTATATCATTCTTACACCTTTGC
-ATCCTCATAGCTTAGCTCCCATTTATAAGTGAGAACATATAAGGTTTAGTTTTCCATTCCTGAGTTACTTCACTTAGAAA
-AATGGGCTCCAACTTCATCCAGGTTGCTGTGAATGCCATTATTTCATTCCTTTTTATGGCTGAGTAGTATTCCATGGTAT
-ATATATACCACATTTTCTTTATCCACTCATTGGTCAATGGTCCTTTAGGCTGGTTCCATATTTTGCAATTGCAAATTGTG
-CTTCTATAAATATGTGTGTGCTGCTATAAAAACATGTATACTTTTCATACAATGATTTCTTTTCATCTGAGTAGATCTAG
-TAGTGGGATTGCTGGATCAAATGGCAGTTCTACTTTTAGTTCTTTAAGGAGTCTCCATACAGTTTTCCACAGTGGTTGGA
-CTAGTTTACATTCCCACCAGCAGAAGTAAGGTGGTATCACATTTTGGTTTTAATTTGCATTTCCCTGATAATTAGTGATG
-TTGAGCATTTTCTCATATGTTTATTGGCCATTTGTGTATCTTCTTTTGAGAATTGTCTATTCATGTCTTTAGCCCACTTT
-TTGATGGGATTATTTGTTTGTTCTTGCTGATTTGTTTGAGTTCCTTGTAGATTATGGATATTAGTCCTTTGTTGGATGCA
-TAGTTTGTGAATATTTTCTCCCACTTTGTGGGTTGTCTGTTAACTCTGTGGATTATTTCTTTTGCTGTGCAAGAGCTTTT
-TAGTTTAATTAAGTCCCATCTGTTTATCTTTGTTTTTGTTGCATTTGCTTTTGGGTTCTTGGTCATGAACTCTTTGCCTA
-AGCCAATGCCTAGAAGAGTTTTGGGGATGTTACCCTCTAAAATTTTTATAGTTTCAAGGCTTAGATTTAAGTCTTTGATC
-CATAAGATGGCTAATTATAAAAAAAAGATAAAAAATAGCAAATGTTGGCAAAGATGTAGAGAAAAGGGGAACTCTTGTAC
-ACTGTTGGTGGGAATATAAATTAGTACAGACATTATGAGAAACAGTAGGGAGTTTTCTCAAAAAACTAAAAATAGAACTA
-TCATATGATACAGCAATTCCACTACTGAATATATATTTCAAGGAAAGGATATCAGTATGTCAAAGAGATATGTGCACTTC
-TATGTTCATTATTTATAAATAAATAAATAAATTATTTATTTATAAATGAACTCCAATGTTCATTTATTCACAATGGCCAA
-GATACAGATCAACCTAAGTATTCATCAACAGATGAATGGAAATGAATGTTTGGTAACAAAAAAAAAAGATGAATGGATAA
-AGAAAATGTGATATATATGTATGCAATGGGATACTATTCAGCCATATAAAAAATAAAATCCTGCCATTTGTGGCAACATG
-GATGAGCCTGGAGGACATTATGTTAAGTGAAATACCACATGTTCTCACTTATGTGTGGAAGCTAAAAAAGGTGAGGTATG
-GAAGTAGAGAGTAAAACAGTGGTTACTAGAGGCTGGTAAGGGAAGGGGGAAGGAGGAAATAGGGAGAGGTTGGTTAACAG
-ATACAAAATTACAGCTAGGTAAGGTAAATAAGTTCTAGTGTTTTTCAGCACTCTAAGGTTACTATAGTTAGCAATATTTT
-ATATTTCAAAATAACTAGAAGTAAGAATTTTAAACATTCCTAACACAAAGAAATGATAAATGTTTGAGAAAATAGGTATG
-TTAATTACCTTGATTTGATCATTACACATTGTATATAGGTGTCAAAATATCATACTATACTGCATAAATATGTATAATTA
-TTGTGTCAATTAAAACATGTGTAGGACACAGCTAAAGTAGTACTGAGAGTAAAACGTATATCACTAAGTGCATACATTGC
-AAAAGGAGAAAATCCTCAAATAAAAATTCTAACCTCCCACCTCAAAGAGAAGGGAGGGCATGACAAAAATAAGAGCAAAA
-AAATCAACAAAATTGAAAACTTAAAATCAATAAAGAGCTGGTTCCTTGAAAACATCAATGATATTTACAAACATCAAAGC
-AGATAAAAAGAATAAAGGTCGGTATCAGGAATGAAACAGGGAATATCACTACAGATGTTTTCAACAAAAGGTGATGGCAC
-AATTAAACATCCATAAACTATAAAATGAACTCTAAGTTTCACATCTTATACAAAAATTAACTAAAATTTATTATCCACTT
-GTGATATGGTTTGGCTGTGTCACCACCCAAATCTCACCTTGAATTGTAGCTTCCATAATTGCCAGGTGTTGTGGGAGGGA
-CCCAGTGGGAGGTAATTGAATTATGGGGGTGGGTTTTTCCATGCTGTTCTCATGATAGTGAATAAGTCTCACAAGATCTG
-ATGGTTTTATAAAGGGCAGCTCCCCTGCACATGGTCTTTTGCCTGCCACCATGTAAGACATGCCTTTGCTCCTCCTTCGT
-CTTCCACTATGATTGTGAGGCCTCCCTAGCCATGCGGAACTGATGAGTCTATTAAACCTCTTTTTTCTTTATAAATCACC
-CAGTCTTGGGTATTTTTTCATAGCAGTATGAAAATGGGCTACTACAACTTGTAAACCTATAAAACCTTTAGAAAAAAAAA
-AACACAAGAAAAACTCTTTGGTATATAAAACTAGGCAAAGGGTTCTTAGACACCAAAAATGTGATTCATAAAAAGAAAAA
-TTGAAAAAGTGAACTCCACCAAAGTTAGAAAATTTTGCTCTGTGAAAGAACCTATTAAGGAGATAAAAAGACAAGGTACA
-AACTAGAAGAAAATATTTGCAAACCACATACATGTCAAAGGACTAGTACCTAGGATATATAAAAAGCTCTTAAATGAAAC
-AGTAAACAAACAATTCAATTAGAAAATAGGCAAAAGAAAGAGATATTTCACTGAAGATGTTATATTGATGGAAATTAAAC
-ACATAAAAAGAAGTTCAACAACATTAGCCACTTGGAAAAAGCAAATTAAAACCACATTGAGATATCATTACACATCTATC
-AGAATAGCTAAAATTAAAAAAGAATTAACAAAACCAAATATTGGAAAGGATGCAGAGATATCATATCACTCAAATATTGC
-TGCTGGGAATATAAAGTGGTGTGGCTATTCTGGAAACAGTCCCACAGTTTCTTAAAAAAGGAATAAACATGCACCTGTGA
-GGCTGGGTTCTCATGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCAGATCACAAGGTCAGGAGTTCAAGACCAG
-CCTGGCCAACATGGTGAAACCCCATCTCTACTAAAAATGCAATAAATTAACTGGACGTGGTGGTGGGTGCCTGTAATCCC
-AGCTACTCAGGAGGCTGAGGCAGGAGAATCGCTTGAACGTGGGAGGTGGAGGTTGCAGTGAGCCAAGATCATGCCACTGC
-AGTCCAGCCTGGGCAACACTGTGAGACTTGTTCTCAAAAAAAGAAAAAAAAATGCACTTGCTATATGGCCCAGCAATTGC
-TCTCCTGAGCATTTATCTCAGATAAATAAAAATTTATGTTCCCACAAAAACCTGTACATGAATACTTATAGCAGATTTAT
-TCATAATAGCACAAAACTACAAGGCACCCAGATGTTCTTCAGATGATGCATAGTTAAACAAACCATTCCATACAATGAAA
-TATTACTCAGCAAGACAATGGAAGGAGTTATTGATACATGTAATAATCTGAATGAATCTCCAGGGAATTATACTGAGTGA
-AAAGAAAAGCCAATCCCCGAAGATTTCACACGATAAGCCTTTCTTTATATAGCATTCTTAAAATGACAAACTTAAAGAAA
-TGAAAAACAGATTGCTAGTTGCCAGGGGTTAAGGACCAGGCAAGGGTGGAAGGGAAGTTGGTTTGACTATAAAAGTATAG
-CATGAATGATCCTTGTGGTGATGGAAATGTTCTGTATCCTGGCTGCATCAATATCAATATCCTTGTTGTGATATTACACT
-ACAGTGTTGTAAGATGTCACCACTGGAGGACACTGGGTAATTGGTATACAAGATTCCTTTGTATCATTTTTTATAAATTC
-ATGTGAATCTACAATTATCTCAAAAAGTTTATTTTAAAAAAATGTTAAGGCTAAAGTGAATTTCATATATGAAAGAGGTC
-AAGTGGAGAAATAATTGGAAAGAGCACTGGACGTTGGGTCAGGAGTTTTAGATTCAGGTTTTGATTCAATCAACTTAAGT
-AAATAACTCCTCTTGTCTAAAATTATTTGTATAATGCAATTGACAAGACCTGCTACAGTTATCTCCCAGAGTTGATAATA
-GGTAAAAATTATATTAATTAAGAGAAAAACTTTAAAAACATAAGAACCAAGGCTCTATATAAATATTTGGTATTTAAAAG
-CTTGCATTATATAAATGATGCCTCAAAGCCTATTTCTCCTGGTAGTTTAGAAATATAATTACCTGGATAAGACCACCAAC
-TAATTTCACTTTCACCGTCATTCAGTAAATCTCAGAAATATAAGCAAAGAACAATCTTGGACAAGAGAAAAGAAGAACCT
-GATCTCTTTTCCAGCCCTATGACTCACTGAAGAAACCAGGAATATGCCACGTGTTCTCTTTCTGCTGCAAGGGTTGCTGT
-GAAATAACCTCATTTAAGCTGTGTTGTACAGAATGGACCACCTTAATGCTGAGATTCCAACATTTTCTATTTCAGGACTG
-GTTTGGGGAGATTGCACAGAGTTCATCCTATGATCCTTCATGTGAGAAGGAAGCCATTCGGCCATTTATAGCCTAAAGAA
-GACAGAGCTAGAAGGGATAAAGCCAATCTTGGCTATTGCTGCTATGGGAACAGAGGGTAGAGATCATTTGCTCCATTGTA
-GAAATTTGGAACTACAGTTGACCCTCGAACAACATGGATTTGAACTGTTTGGGTCACATACATGTGGACTTTTTTCAATA
-AAAGCACCTGTCCCTCTTGCCTCCCTTTCCACCTCCTCCACCTCTTCTACCTCTGCCACCCCTGAGACAGCAAGACCACC
-CCCTCCTCTTCCTCCTCATCCTACTCAAAGTGAGAAGAGGATGAAGGCCTTTATGATGATTCACTTCTTAATGAATAGTA
-ATGATTTTCTTAATAACATTTCCTTTTCTCTAGGTTACTTTAGAATACAGTTACTTTAGAATACAGTGTATAATATATAT
-ATAATATATAAAATATGTGATAATTAGCTGTTTATGTTATCAGGAAGGCTTCTGGTCCAGAGTTGGCTGCTACTAGTTAG
-GTTTTGGAGGAGTCAAAAGTTAGACGTGGATTTTTGGCTGCACAGGATGTCTACACTCCTAACCCCAACCTTGTTCAAGG
-GTCAACTCTAATGGGAAGCTTTTGCAGCCATTAACTTTCAGTGATTTCAGTACACGCTAAACTGGCTTTTTAAAATGAGG
-GAATATATAAGCTCATTTAACAGGAAATTTAATAAAAGCTGGTTGATCCAGTACCCCAGTGTTATTACCTAGGACTTAGG
-TTCTCTACATTTCCTGTCTTTGCTATACACATGGTTGACTTCATTTTTAAGGCTGGTTCCCACCAGAGGACAATTGTGGA
-TTCATCCACTTTCATTCAAATCTGGGGAGAGAGCGGGAGAATAGCTTGTTCTTTAGAGCAAGGCAGAACTTTCCAAGAAG
-TCTTCCACGAACCTCCCTTCACATATCATTGGCCAGAACTGAGTCACAGGACTTTTTATAAACGAATCACAGACAAGGGG
-GTATGAGCTAACCCTTAACCCAATCAGAGTTACTCCTGAAGCTGAGGGTATTCCTTGGAGTCACATGGACTACATGAAGA
-CAGGGCACTTGAACAAAATTGAGGTTCTATTAGGAAGAAAAACTGAGGTTGTAAGTGCTATGTAAGTAGTTGGTGCTCAG
-TAATGCTGCCATCCTGTCTTAACTTAGCTAACAGGACTAAGTGACATATTTCTGAGGACTCTGATACTAAATGGTGTAAA
-TATAGGGTAGAGTTTGATTTTTTTAGTTTTGACTCTTTCTTTAAACTGACTGTGAAACTTCAGGAAGTCAAGTTATTGAG
-CCCTTGTTTTCTTACTTCTGAAAGGAAATAAAACTGTATAACTTCGGGCAAGTTACTTACCTTTACAATGTGTCAGCTTT
-CTCTTTTGTGGATTCCTTATCTAAAGTTTAATAGTACTTTACTCATAAAGTTGTATTAGTTTTCTAGGTTTTCCATAACA
-AAGTACCACAGACTTTGTGGCTTAAACAACAGAAATTTGTTTTCTCATATTTGGAAAGCTAGAAGGCCAAAATCAAGGTG
-TCGACAGGGTTGATTTATTCTGAGGACCTTTCTCCTTGGCTCGTAGATGACCATCTTTTCTCTATATCTTCGCCTGATCT
-TGCTTCTGTGTGTGTCTGTGTCCTATCTCCTCTTCTTATAAGGACACCAGTCATATTGGATTAAGGACTACTTTAATGGC
-TTCATTTCACATCTTTAAAGACCATATCTCCAAACAGGTCACATTGTGAATACTAAAGGTGAGGACTTCAACATATGAAT
-CTTGGGGTGATACAATTCCATGCTTTTGATGTAAGAATTACGTGATTTAATACATGTTAAGGATGTAAATCTATATAGTA
-GATGCATACTCAACATTAGTTATAAAATTATCTTATTTTCAGTAGTAGCAACAGATATAAAAACAATAGTATTTGAAGTA
-GTAATAGCATCACTAGCAGGGATAATAGCAGAACTGTCTGAGAGAAAAGGAGAAAGAATCCCTATGCAAGGAAGGGGGAA
-GATATACTTTATAGAGAAATGAGACACAAGAGAATAGTATTTGTTTCACACTCTTCCAGCTACTATGGCTGTGTAACATA
-GTATGTCAAAACTTACTGGCTTAAGTCAACAACACTTATTTTCTTCATGAAATCTGCAGTTTTGACAGGCCCAACAGGGA
-TAGCTCGCTCAAACTGTACTTGTCATCAGCTGGAACGTTCAGAGTCTCACTCACATGTCAATGCCAGCTGTCAGCTGGGA
-CCTCAGTTGGACACGTATGTGGGGCCTCTCCACATGGCCTGGGTTTCTGCACACATTGTTGCTGGTCTCCAAGGGTGAGC
-ATCCTGAAAGAGAAAAAGTGGAATTGTAGTGCTTTTTATGACCTAACTTCAAAAGTCACTAAAAATTCCTTTGGTTGCAT
-TCTACTCATTTGAGGCATTTATAAAGACTGTCAAAGTTCAAGAGATGGGGAAATAGACTCTTCCTTTTGATGGAGAGTGT
-CAAGGTCTGGAAGAGAATATGGGACTGCATTTACTGCTGTAGTCATGTTTGGAGAGTATAATCCTCCATTCATACCTAAC
-TTCCCACACGAAGCTTCTCTTTCTGGAGCTTACTTTCAAACACTTGGGTTTGTGATTTTGTTCCAGATCAGAATTGGATC
-CTTATGCTATGCTACCCAACTTCCAGAGATTTGAGGATAAAATGGCACATTTGGCAGAAAACTTTTGAGAAGATCTTTAT
-CAAAGAGGGAACTCTCTAAATAAAGGTTCAGTGTGCCTCATAGTTCTCTTTCAAACAGGAACATACAGAAAGGGGGTTGA
-CATTTTGATTTCCCAGATAATCTTTTGTTTTTATGATTTTGGATATAAACATGTCTCAGACCTGAACAAGGAACTCAGAT
-TTTTATCCTTAAAATTAAATCTGAAGAATAAGGAGAACCACATGCCCTTATCAGCTTTAATATTCTAAGAAAATGAGAAA
-AAAAATGATTTAAGAACATTTAAAAGTTGTGCACTGGGTTCATCAAAGATTCTCCCATTGAAGAGAAAATCTGAGCTGTT
-TCTTGCTTTATATTTGAATGCTGTGCATGGTTTTCATGATGGCAATAATAATTTACTGCAAAATGCTTTTATTGAGTTGC
-CTTTACTGAAGAGGCCCTGCATGCCTTTTCACCAGCTTGCTACAATTAAAAGCAGCAGTAAACAGAGCCTTTCTATTTAG
-ACTGAAAAGCAATGATTAAGCTTACCCAGCTATAAATAGGAGGCAGCTTCACATCTATGGCCCCAACTGCACACATTAAA
-GACTCCAGCTCCAAATGCCCCCAATTTATTTCTACAGGACAAACCAATAAATTGTCAAACTCTGACCTTAAAAGTGACAA
-TTTCTTAAAAAATGAAAGTAGGTAAATTATGCATAATTATAGATAATTACTGAGATGTCTATGAGGCCAGGAAATCAGTA
-CACATGCTGGAAATCTAAATTTGCACGCTGATAGCTTCTCCTTTTACCATTATCAAACCATGGTTTGCCTTGAGCAGCTG
-TCAGAGATGGCTTTTCTTTGCTTGGGGGCACAGAAGAAAATAAGGGACTTAAGAGAGAAGATGGAAAATACAAAGTTATT
-TTTTAAGATTCCCGTTAGTTCAAGTGATTCAGCAAGGAAACCAGAATATAGGCAGTTACTGTTAAACGTTTTTGAATAAA
-AATGTTTAAATGCAAGCCATTTATCCCACCTATAAGCTGTAGCTATCTGAGTGTTTAGAGATTTGAAGGCATTTGATTCA
-ACCTCCTCACTTTCTGCAGCAGGAAACTGGAGGCTAAGAAAGCCCTGTGAATTGTCCAAGGTCACATGGCTTGACAGCAG
-CCGTGCTGGAACTCAGTAGCTTTTCTGACTGTCACTGCAGCATCCACTGAATGGAAAAATTTGTTCCCTTTTTATTATTT
-TTAGTATAAAACCCTAGATTAATGAGATCTAAGTCATAAAAGTCCATAGGGTGCTGTATTTCTTTGAGTGCAAGACAAGC
-TTGCAAAGGTGACAGGATTTTCCCACTTGAAGAAACGTGGTCCCCTCTGCCTCAGCATCCTCCATCTGAGCCAAGAGTTG
-CCAATTTCCAAAAGCCCAAGAAAGTAAGTTTCCAAAATATGTCTTGGGTGATCGTATCTTTTTTAAACTTGTGAGTCCTC
-TTCATTTCGTGTTTGCATGTGGCCTTTGTCTCCCAGTGATTTTCCAACTGCCCATGACTCCCCTTGGGTCATGCGCTGGA
-TATTCTCTGTTGCCTTCTGTCACCTTCTCAACTCTGTGCCCAGGAGACTGGCATTTATGTATGTATCAATGTCACCCTAG
-TCCTTTGGCTATAATCAGGCTGAGCTATCAAGGATACTAACAGAAGACCGGATAGCAGGGAGATAAAGAAGCCACAGTTT
-CTATTCCCCCAGTTCACTTCCTGCAGAATAAAGCACAGTTGCCCAGCTGAGCCCAGCCCACATTACCAAACCCCAGAAAA
-ATTAGTGAGAATTAACAACTGCTGTACTAAACTACTCCATTTTTAGGAGTTTTTTTAAAATTCAGCATTATCTGACTGAT
-ACAAAATATGACACCTGCAAAGAATTTAAGACAACATAACTAACTTGAAATAGAGATCAATAGTTCTGAGACCCAGAAAT
-GGAAGTGAACTCAGACTGGGATTGAGTTTGCAGATTCACTTGACTCCACGTCCAGAAGCAAATGGAGACATCTGGGGCCC
-TGTGGGGTAGCAAAACTAAAAGTATCCCATGGGAAGTAAGAGATTCACTCTTCAAACTCATTGCTTGGAACTAGTAACAA
-GTTTGAGGTTCTCTCATGCATTAAAGGGGGCTGAAATAAGCTCTTAAAACCACCGTCTGAACTATAAAACTGGATAGCAG
-GGAAGCCGTAGAAAATAAAGTCTTTTATCCTGAACTTAGGCTTAACTGCTGACTTGGTAGCTGAATGTGCGAAAACCTCA
-ATTTCAGTGCATTTTGGGAGCCTTGAGCTACCAATATAAGACCTGGTTTTTGACTAAATGTTATTGAGAAATGGTGGAAG
-AAGAAATTAAATATAAATCTGCAAGACTGTGAGACATAAAATGGCGGAGAGAGAAAGAGACAGAGAGAGAGAGAGAGAGA
-GAAAGAGAGAGAGAGAGACCTCCATTCAATAATAAAATTCCAAAACACATAAGGAAGTAATGCTAAGAAAGACAGCAACA
-AAATAAACTAATAGAACTGAGTTCACTCCAGATGAAATGGAAATAATAAAATAGACTATTACCCACTAGTCTTCACTAAA
-ATAACTGCTGAAGAATGTATTTCAGGCAGAAGAAAACACCCTAAGAGATATAGAAGAATGGAGCGGAATGCAGAAACAAC
-AGTACAGAATTTCGTAAAATATGATGATAAATTTAATTAACTATTGACTCTTAAAAAGAATGGTATTTTTCACATCATGA
-GATAAAATTCAAATAACACCAAGAAAGACATAGATGGGAAAGATATTATGTGTGTAATAAAAGCATACTTAGTTATTGGG
-TTATTTGGGAGAACAGCAGAGATACTAAATCACTTAAATTCTGTTCAGAATTTTTTTTACTTAAAAATGTTAAAATGTTA
-AAACTATCAATCAAACAGGAAGAAAGAAAAGAGGTAAAATAAGCAAAAAAAAAGAGGATGGTAAACATAAAATATATAAT
-AACTAAGTCCAAATACAGCAGTAATCAAAATAAATGTAAAGGAACCAACTTACTTATAAGAGCAAGATTATCAGGCTAGG
-TATTTAAAAATCCAACCATATGTAGTTTATAATAAACACACTTAAAACATAATGGTCCACAAAGGTTGAAAATAAAGAAA
-TGGAAAAAAACAAGTAATTCAATCACTAACCAAAAGAAAGCTGATATGGCAATATGAATGTCAGATGGCACTGGATCTAG
-GCCAAAAAGCATAAAAAGAGACATTATGTAGTGATAAAAAGAACAGTCCTGGCCAGGCGCGGTGGCTCACGCCTGTAATC
-CTAGCACTTTGGGAGGACGAGAAGGGCAGATCACGAGGTCAGGAGATCAAGACCATCCTGGCTAACATGGTGAAACCCCG
-TCTCTACTAAAAATACAAAAAAGTAGCCTGGCGTAGTGGCGGGCACCTGTAATCCCAGCTACTCGGGAGGCTGAGACAGG
-AGAATGGCGTGAACCCGGGAGGCGGAGCCTGCAGTGAGCCGAGATAGCGCCCCTGCACTCCAGCCTGGATGACTGAACGA
-GACCGTCTCAAAAAAAAAAATAAAATAAAAACCAGTCCTGTATTTGAATGGCTAAGATTATGGCTTGAAATATAAAAGAA
-AAATGCTGACAAAATTACAAAACAAAATTGAAAAATCTACTATCTTGTCTGAGATTTTAAAACACATATCAAAAGCCAGC
-GGAGTCAGCAGAAAACACCAACTTGTATTAAAAAGCTGGAAAATAATAAACCCACTTTATAGATGTAGAAACTGGGGCCT
-AGGCAAGTTGAGTGATTCATGCAAGATCACAAAGTTTGTATGAATTCAAGCCAGGACTAAAACTCACACTTTCTAAATAG
-TAATCCTATGCCCTCTCCATTTTATAACATTAACACATGTAGAATAAACTGCGTATCTGCAGAAATGATTAGCCTTTTCT
-ATGTCCTTAAGAGAATCCTTAGTGTGGTAGCATATCTGTCAATGTTCCACTCGGTTTACCTTGAATTTCTTTTACTTTTT
-CAGTGTGCCTTTTCTTACCTCCTACATATTATGTTTCTAATTATCCATCTCTGTGATTCTCTATGGAGAACCACCCTTAG
-GCCACCGGGGTGTCTACTGTGAAACAGAAGTTCCTGGGATGTTATGCCCTCAATCACGGCCCTTATTCAATGACTGACCG
-GTGTGGGAAAATGGAAGCCCAGCTCCTTTGCCTTAGAGTTTGAACAAATCTAAGGTATAATTTTCACTCCGAAGCTCCCC
-CGTGGGATCAGGCTGAGGCTGAATCTCTGCTTGGCTTCTTCCCTTATCTTTCCTGCTTTTTACACCCAGTTCTACCTCGA
-AAATTTTCCTCAATAAATTGAGTTGCATGTGATTTCTCATCTCAAGGTCTGCTTCTGGGAACCCTTTCCTAAAATGAGGA
-CCATACAGCTCTGTACTAGGAGTAAAAAGAGAGTAGAAAGTGGTTCTACAGAAAACCAAATACAGCATGTTCTCATAAGT
-GGGAGCTAAATGATGAGAACACAGGGACACAAAGAGGGAAATAACAGACACTGGGGCCTATTGGAAGGTGGAGGGTGGGA
-GGAGGGAGAGGATCAGGAAAAATAACTAATGGGTACTAGGTTTAATACCTGGGTGATGAAGTAATCTATACAACAAACTT
-CTGTGACACAAGTTTACCTATATAACAAACCTACACAAGTAGCCCTGAACTTAAAAACAAACAAACAAACAGGATTATTC
-CATAAAAGTATGTTCTCTATTTAAAAAAATTTGAAGTAAATGAAAGTCACCCATAATCCCACTATTTGTAAGGCTATTTT
-GGTCATTTACCTAAGTATATATACTGTACAAGTAAAAGTGTGATAATGCCAAAAAAAAAAAAAAAAGTAGTTCTAGGGAA
-AGAATATTTGAGTGGTTAAGGTTTCCTGCTGCTTTTATCTTTGGGAAATTCCAGTTTGATTTGGGCACTAGGAACCTGGC
-ATAGTGAATGTAGTGTCTGCCAAGCTAGAAGAACACTGCTGCAACTTCAGACTTCAGGTCAATTACTATTGACTGGCCAA
-CTTTCTGTCCCGAGCATACCCTCTTGGGTCCAATTCCAGATTAATAATGGCCCAATTCCAAATCTGGAGGATTCCTGGCC
-TCTCTCTCTCTCTCTCTTTCAATGCAGTTGCTTACTTCCCTTAAGACTGGCTCTGAATATACAAGAAGGCAACTCCGGGA
-TTCTGGCCTTTAAGATGCAAGACCATGGGTAACCATACAAGCAACATCATGGGCTTTCCAGTTGGTTGAGCCATTATTTC
-AGCCTCTACTTTGTATCTCATAGCTTCACATTTCTTTGCTTTCCAAGTCTGGATTTAGAGGTGGGCCTTGTCTAGAAAGC
-CAGGTCTACCTTTTTTCAGGCAAAAAGTTTCATTAACCACTGTGGCTTAGAATAATATTTATGTAATAAAATATTTACTA
-GGTATTGAATGCATGCTATATGCCACTATACAGATGAAGAAATGGAAGTTTAGATCTGAAGATTAACTTGCCCAGATTTA
-TGTGGCCAGCTCTTGCCACAAACCAACCAAGGATTTAGTGAGTCAGACATGAGCCTGACTCTGCACGTATCCTACAAGTC
-ATAGCATTCCCTACCCTGGTTTTGCTGACCCCAGGCTCTAGCACTGGATTTATCCTTGGTTCTCTTACTGAGTGCTCTAG
-TACTTTCCTAGTTGAGCCCCTGACACCCATCCTCTGTCAACTCATTTTCCCCAGGAGCTGACACCTGCTCCTCAAAGTAT
-GTCTTCAACTTCTACCTGCCATTTTTCACAGAGACACATGGAGAATTTGCCCCAAATACACATCTCTAGGGACTTTCTGC
-TTCAATGCCCTGCCCTCCTCCTGCCAGACTGAACCATGGCAATGGGGCCTAAAATTCTCAATGCTATCTTAGGTTGGGTT
-CCCCAGAAGCAGAACCCAAGAAAGGGAAAATCAGGCACACATTGCTTCAGTCCTCTTGAGGAAAGACTCTCAAAAGAAGC
-ATCTAAAAGAAGAAAAGCAGACAGGACAACTAGGGTAAGAAGCCAAGCAAAGATGCGTGCTCAGGAAAAATCTAAACCTG
-GCCTGATATGAGAGAGGATCTGGAGCATAAATTACAACACTGACATGATGGTCCTCATCATTAAGACAAGGTGGTTCGCC
-TTTTGTACTCCTGTATCAGCCAGTCATTGCCATAGACTTCTCCTGATAAAACCATTTAGGGAGTGTAACTTTCTGGGCAT
-TAACTTAGGGTGATACTTGGGGAAGAGGACCTCTGTTAGCTTTTAGCAGTCAATACAGCAGCTGGAGGCTAGAGCCCCTG
-CTCATCCACCAGCATCTACTACAAGTGCCTGGGCCTTGGGCAATGAACGTGGGACTTCAGCAATCAGATCCCTTTTCTCA
-TCCCACCTTCCTGCTCCTGGCCTCCTCCTACTCCCCATCATCCTGTGTGGCTGGGGCCCCCCCATGCCATGTGCCTATCC
-ACAGGCTCCTGGATTTTAGTACCTGCTCAGAGTCCACTGCATTGGCGCCTGACACTTTATTAGTGTTCTAAAGCTTTGTT
-TACAGTTACCAGGACTCTCTAGATAGCAGCAAAAAGTCAACAAGGAAATAAAACTCCACCAGCTGGTGTATTTGTTGGGG
-ATAAACTCACCACACAGGAAACAGCTGGGTACATGCTCACAAACGTCAGTACCTTGCTGGTCCCAAAGGCTCATCTGAAG
-TTGCAAGTTTGAATCCCCCTTTCCAAGCTGGTCTGTTTATACGCACTCCTCCACACCTTCAGTTCCTTTACACCATGTGA
-GCCTCAGGAAGCTGAGGCAGTAATGAGCTTTGAAGCTGTTCTACTGCCTGTGACAGCCCACAGGCCAGTCATTTGATCCA
-ATTGCTTGATGCTACCTCCAGCAGCCTCTTGGCAAAATCTCTGCCATTATATACCATTGTTTCCTTACTCTAAAGCTCAC
-ATCTTCTCATGCTGAAGTCTATATGCTTCCTAGTGTATGAAAGTAACACTTTAATGTAGCCCTGAAGAAAACTGTCCAGC
-CCATCTGGACATCTGCCAGTCACTAGGAAGAGAATAGATTTTTCAGGCACAAATGTTAGCATACTAAGGAGTAGAAGGCT
-GAAGGCCATCTTCACTGACTTTATAGTCAGTGCGTTCTTTGTTCAGCAAAACTTAGCTCCTAGTCCTGAGCCAATTCCAA
-AATGCTGAATTTCATCCTTCCACTACTTTGAAAGCATTTAAGGTCTAATGAAAGGGATTAGGCCTGGAATTGGTGCCAGA
-AATTAAAATGAAGGCATAATTTGCATGTTTTGACAATACCTTCACACTTACACCCATGCCATGCTTTCTTAAACACTCTT
-GAAAATATGTGAGAATCAAGATTTCATAATCCACTTCTTCTGGAATGCCATGTAGAAACATTCTCATTTTGCTTTCTCCC
-TGCCTTCTGATTTTACTCACAGGCTTAATAATCACTGTAAGGATGGGGTAGCCATAAACAGCAGAGCATTGAGCTTTAGT
-GCACTCAGATGTTTGTGTATTTCCCCATTTACCTTGTATATAAAGCCATGCTAAGATTCGCAGTTAATGCTGGAGCTCAC
-CTTGAAAATAGCACCATCTTTCTCCTGAAGATGCTCAAACTCCAGGTAGTAACCTCAGGTTGTATCATAGCTCCTTCAGG
-GTACCTCACTGTTTTTAATAAGCACATGATAAAGATAATGTCTTCCTCGATTCTAGTGGTATTTCTTAACAAAAGCCTAA
-GCTGCACCAGGATGAGGTGTTGTAATATTTTCACAAGTGTTAAAAAGGATTACTGCTCTTCCTAATATTGGTCAATGTGC
-CCAGATGGAGACTATTGCTTTTGCGCATAACGTCTAAGCTTCTTTGCCAGCGCACAATTGTTTAAGAAACCACTTTTCTT
-GCTATGCCCTGATAATCTTGCCTCTTGAATAACTCATTTCCATCAAGAGCAGGACAGAATCAGAACAGCATGGACAAGGA
-TAATCTCTAAAATGTGGTTTCAAATGGAGAAGTATGATATGGTTTGTCAGAGGCCTGGAAGGTGCACATTGTTTAGTAGG
-TTGACCCAAAGCCATCCTCAAGAGGTAGGATGGGTTTTTTTGTGTGTGGTTTTTTTTTTTTTGGTTTGTTTGTTTTGTTT
-TGTTTTGTTTTGTCTTTTGAGACAGAGTCTCACTCTGTCACCAGGCTGGAGTGCAGTGGAGCAATCTCAGCTCACTGCAA
-CCTCCGCCTCCCGGGTTCAAGTGATTCTCCTGCCTTAGCCTCCCGAGTAGCTTGGACTACAGGCTCACGCCACCACATCC
-AGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGGCCAGGATGGTCTTGATCTCTTGACCTCATGATCC
-ACTCGCCTCGGCCTCCTAAAGTGCTGGGATTACAGGCATGAGCCATTGCACACGGCCTAGAAGTAGGATGGTTTTAAGAG
-CACTGCACTTTCTTTGACACTTCTACCCCTGAGAGTAGGGTCTATGTTCCCACCCCTTGAACCTGGGTGGGCTTTGTTAC
-TGCCTTGATCAATAACAAAGTGCAGCAGAAGTGACACTATAATTTCCAAGGCTGGGTCTGAAGAAAGTCATGTAGCTTTT
-TCCTTGTTCTCCTGGAACACATACTCTTTGTATCTTCAGCCTCCATGTAAGAAATTTTACTGTCCCGAGGCTGCCCTGCT
-GGACATACTAGGTGGAGAGACCACTAAGAGAGAGAGAGATGATCAACAAGCCTTAGCTATTCAGGCATCATACATGGGAG
-CGACAAAAGCTTCAAGATGGCACTAGCCCTAGCTACTGCTCAACTGTAATCACAGAGAACCCAAGGCCAGAAATGCCCAG
-AGGAGCCTAGTGGACCCCAGAACTGTGAGAGATACTAATAAATTGTTATTGATTTAAGCTACTGTGTTTTGAAGATGTTG
-GTTCCACTGCAATACATAATGGGAACAGGAGGTGCATTACACATAATATAATGTACAATTCAACCCAAAGGACTCTCCTA
-CCCACCACTGGATACATGTCTATGAGAGTTGGCACTGCTGTGGGTGCACAGAGCCAAGGCCATGCCTCACAAGACAGTAG
-AGTGGGTGGATGTCTGCATGCTATGATTTGAGAATGACTCAAAGTAATCTCCCTCAGGGGGCTGCTCAGGTCCCTGACCT
-CTTCCACAGTAATTGCCTTGAGAGGATATGCAATCTTGGAAACTTGCCAAATGTTAGAAATCCCCTTGTTCAGTGGGTTT
-CAAACTAAGAACACTCAGGTTTTGAGAAGGGATTCCAAGGAAGTACAGTGAAAGCAAGCCTTCTACAGACACAGTATTCT
-CTCTCTCTGGCCTCAGAGGGAGGATTTCTTCCCAGCCTCAGGGGTGGAACTGACCCAAGGTGCCCATCAGTGCAACACAT
-TCTTCTTGCCATTGTGATTGGTATAGGGCTGGACACGTAGTCCACATCAGGCCAATCAAAGTGAGTATCAGGACAGTCCC
-AGGGAGTTCTGGGAAAACAATGTTCTCCCTTTTTCACTAGATTGGAATTTAGAAGTATAGTACTTTGAGAGCTGCTAGCA
-ACCATAGGAAAAGTGGCAGAGAATCCTAGGAATGGAGTGGAAAGAGAGGAAGTAGATCTCAGAAGAGACAGAAAAAAAAA
-GTTGATCCTAACGGCTTTCAACCTGATATTCAGCTGTTCTTGAAGCAGATCTCCCCTGGACTATTTTGTTATGTGAGCTC
-ACAAATTTATTTTGTTTAGTGATTTAAGCAACTAGAATTTTAAAAATCAATGTGTACATATATGCTTAGCTTCTCTTGGA
-GTTTGTGTTTTAGCAGTAGAAGAAAATGATTTCTGCTGCTAAAAACATGTTTGGAAATAGCTGATCTTATCCTAGTGATC
-TAGTCCTTTTTGTTGTGCAAAAGGAAGTGCTAAAATCAGAATGAGAACCATGGTCACCTGACATAGACACAAGTGATGAT
-GATGATGATGATGATGATGATGATGATGATGATGATGATATCCATGTTCAAGTACTAATTCTGGGCAAGACACTGTTCTA
-AGTGCTATGAATATATTACCTCATTTAATCATCTCCAAAACATTATGAGATATTCTGTTACTATCACCATTTACAAATGA
-TGGGATTGAAGTACAGAGAGGATAAATAGCATCCTAAGATCACACAGCTAGTAAGTTGTGATGCTAGGATTGAACACAGC
-TGTTCTCTTAGCCATACCCTACACCCCTCTGACAAGGTAGAGTGCCTTCTCATTGGCCCCTAGGTTCTGGGCTCTCTTTC
-CACGATGCCTCTATTCTTAAAGCATGCAACCCAGAAGGTTCCTGTTAAATGTAAGTGAGAGAATTTCTATCACTGTGGAC
-CTGCTTCCATCATCTGGTTTGTGGTTTTATTCTAACCACAAAGTATATGACTTACTCATGTCTGCTTGGTTTTGACTCTT
-TACTAAGAGTAAGGGAATGCAGTGATCAAAGGGAAGGAAGATTTTTAACTTAAGTTGTCAGCTTGCTTCTGCTTCCAAAA
-AAGTTTCATGCTTAAAAATATGGCACCATGCTTTATTCTTCAAAAGAAGAAAAGTCAAATTGTAGCTGACTCCAACTCCT
-TGTTTTACTTAGGTGGAGGAAGATTCCATCTCAGTGAGTATGATTTGTTCCTGCCCACCCCTCAGCTCCCAAAATGGCCC
-AGGAAGTTGTATGCAGCATAGAATTTGATGTCACTGTTATTTGGTCAACTTGTATGATCATTGTTCAGATTTGTGTAGTC
-CCTGGAAAGAAGGTGCCTCTGACAGTTCTCTGTCATTTTGGGGTACAGGGCACCTTGTTATATGGCTGCTTCCCCGGGGC
-CTAGTGTCAAGCTTCTCTTCGTGGGTGTTATATATATATCCTATTCTAAGAAGATGCTAAGGTGTCAGATTGGAAGCCAC
-CATCCCTCTCTTTGTCTCCATTAATCTCCACCTCTCTGCCTTTGCTATTTCCGCCCATCCCTTCCTTTCAGTGAAGAACA
-CAGATCCCCTCACTGCTCTGCTCCATTCTTTATAGCTCTTTGCATATTGCATGGGTTTTGCCTAAATTAGAATGGACCTT
-AATAGAACTGTGGGGCTTTTAAACATTCAAGCATCACTTATTTTAATATCCCCCTAAATACCTTTTGAAAAATCTCTTAG
-AAGTCCAACCGATTTAAGGGTTAGTGTGCATTTTAATTGACCATTCAATTTCAAATAAATGTGGAGGAAATTACAACCCT
-CTTAACAGAGAAACGACAATTTAAGGAGAATGAGACCTTGATTGAAACAATTAGGAACTTAGAAACCAGACTCTGATGTG
-GTCAAAGAAAACAGCCCAGGAATTTATAAAGCCTGCCTTATTTTGCTTTGAAGAAAAACTTGAAAACCATAAAACAAGGT
-GAGATGTTATCCAAAATTTGGAAGCTAATTTAATAAACAGATTAATGCAGTTAGTTTTGTTTGGCATTGAGAAACATTGG
-TTAACCAAAATTTTATTACAAAAATAAAATAAAATAGTTAGTTCTCACCCAGCCTATGGACTTGAGGCTTAGAAGAAAGA
-CATTTTAATCTCCTGTCATCTATTAACATATTTTTTATCAAATCACATAATCAGATAAATTCTTTTTTTTTTCTTTTTGA
-GATGGAATTTCGCTCTGTCGCTAGGCTGGAGTGCAGTGGCATGATCTCAACTCACTGCAACCTCCCCCTCCTGGGTTCAA
-GTGATTCCCCTGCCTCAGCCTCCCAAATAGCTGGGATTACAGGCACACACTACTACGCCCAGCTAATTTTTGTATTTTAG
-TAGAGACGGGGTCTCACCATGTTGGCCAAGATGGTCTCGATCTCCTGACCTCATGACCTACCTGCCTTGGCCTCCCAAAG
-TGCTTGGATTACAGGCATGAGCCACCGCACCTGGCCTCAGACAAATTCTTGATCAGATGGGCTCCCTAAGAACACTCTTT
-TCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTCTTTTTTCACATTTTTTTCCCGTAGGTTATT
-GGGGTACAGGTGGTATTTGGTTACATGAGTAAGTTCTTTAGTGGTTATTTGTGAGCTCCTGGTGCACCCATCACCTGAGC
-AGTATACACTGAACCCTGTTTGTAGCCTTTTATCCCTCATCCCCCTCCCACCCTTCTGCTAAAGTCTCCAAAGTCCATTG
-TATCATTCTTTACTTCGATTTTTTGTTTGCTTGCTTTGAGACAGAGTCTCACTCTGTCGTCCACGCTGGAGTGCAGTGGT
-GCAATCTCAGCTCACTGCAACCTCTGCCTTCCAGGTTCAAATGATTCTCCTGCCTCAGCCTCCTGAGTAGCTGGGACTAC
-AGGCATGTGCCACCACTCCGGGCTAATTTTTGTGTTTTCAGTAGATACAGGGTTTTTACCACGTTGGCCAGGCTGGTCTT
-GAACTCCTGACCTCAGCTGATCCACCTGCCTCAGCCTCCCAAAATGCTGGGATTACAGGCATGAGCCACTGTACCTGGCC
-CATTGTATCATTCTTATGCTTTTGCATCCTCATAGTTTAGCTCCCACATCTCAGTGAGAACATAGCAATGTTTGGTTTTC
-TATTCCTGAGTTACTTCACTTAGAATAATAGTCTCCAGTCTCATCCAGGTTGCTGCAAATGCCATTAATTCATTCCTTTT
-TATGGCTGAGTGGTATTCCATTATATATATATATAAAAAACTGGGTATTTGTGTGTGTGTATATATATTATATATATAAT
-ATATATAATATATATGTAATATATATAATATATATATTAAATATATATAATATGTATAATTTATATGTAATATATATAAT
-ATATATATTAAATATATATAATATATATAATTTATATGTAATATATATAATATATAATATATATAATATATTATATATAA
-TGTGTATATATATATAATATATATAATATTATATATATTATATATAATGTTTTATATATATATAATATATATAATATATA
-TATAATATATATAATATATAATGTGTGTATATATAATATAATATATAATATATAATGTGTATATATAATATATATTATAT
-ATATAATGTGTATATATAATATATATATTATATATAATGTGTATATATAATATATATTATATATAATGTGTATATATAAT
-ATATATTATATATAATGTGTGTATATATAATATATATTATATATAATGTGTATATATATAATATATATATTATATATATA
-ATGTGTATATATATATATATTATATATATAATGTGTATATATATATATATAATATATATATATATACACTGAGATTTTTT
-GTTTTGTTTTGTTTTTTGAGATGAAGTTTCACTCTTGTTCCCCAGGCTGGAGTGCAATGGTGTGATCTCGGCTCACTGCA
-ACCTCCCCCACCGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGATTACAGGTGTCTGCCACCACACCC
-GGCTAATTTTTGTATTTTTAGTAAAGACGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCCTGATCTTCCGGTGA
-TCTGACTGCCTCGGCTTCCCAAAGTGCTGAGATTACAGGCGTGAGCCACCACACCCAGCCTGGTTTTTTTGTTTTGTTTG
-TTTGTTTGTTTTTTGTTTTTGGGGGATGAAATTTCACTCTTGTTGCCCAGGATGGAGTGCAATGGTGAGAGCTCAGCTCA
-CTGCAACCTCCGCCTCCTGGATTCAAGCAATTCTTCTTTCTCAGTCTCCCGAGTAGCTGGGATTACAGGCACCTGCCACG
-ACACCTGGCTAATTTTTTATATTTTAAGTAGAGATGGGGTTTCATCATTTTGGCCAGGCTGATCTTGAACTCCTAACCTT
-CAGGTGATCCACCCACCTCGGCCTCCCAAAGTGCTGGGATTACAGGCATGAACCATGGCACCCAGCCTATACCAGCTTTT
-TATCCGCTCGTTGATTGATGGGCATTTGGGTTGAGAACACCCTTTTCTATCCGTCCATTTCATTTATTTCCCATTTCAAA
-AATTACTCCATAAACGTGATCATCCCCATAAACACAGGATAAACACTTGACAAAATTCAGTGCCTTTTCATGATAACAAA
-TAGTAAAGAAGGAAATTTTCTTAACTAATAAAAGTCAATACACAAAATTCACAGGTAACATCATACTACACAAAATTGAA
-AAGATTCCCCACTAAACCACGAACAAGACAAGGAGGGCCACTCTTACCATTTCTATTAAACATTATACTGGAGCTCCTAG
-CTGGGGAATTAAGCAAAAAGAAGTAAGAAAAAATGGAAATAAGTAAATGACATCCAGATTGGGAAGGAAGAAATAAAATC
-ATGTCTATTTGCAGATGGCATGATCTTCTATGTAGAAAATCCTAAAAAATCCATGCATACACACAAAAAGCTATTATAAC
-TAATAAATGAATTCAGCAAGACTACAGGATAAAACATCAAAAATCAAAAATCAATTCTCCTTTTGTACACTAGCAATGAA
-CAACCCAAAAATGGAATTAAGAAAGACATTTACTTTATAATAACACCAAAAAGAATAAAATACTTAGGAAAAAATGTAAG
-CAAAGAAGTGTGTGGTCATTTATTTTTTATGTCCTCTGGACTAGGCCTTGGGCTACCCAGACATTTGTTCAAGCATTATT
-CTAGGCATGTCTAGGCATGTTTGTGAGAGTGTCTCTGGAGGAAATCAACATTTGAACCAGTAGGCAGAGTAAAGCAGATT
-GCTCTCCCTAACGTGTGTTGGTTTCAACGCATCAACTGAAGACCTCAACAGAACAAAAAAGCTGAGTAAAAGGAAATTCC
-TGCCTGACTACTTGAGCTCGTCTTTTCTGGCTTTTGGACTCAAACTGAAACATCAGCTCTCCTGGGTTCTCCAGCTTGCT
-GACTGAAAATCTTGGAACTTCTCAGCCTCCATAATTCCATGAGCGAATTCCTTATAATCGATTATTCTTTCTTACATAGG
-TACATATGGGGTGTGTATATATATAAATATATGTATATATATACACACATATATGTATACTTCTAGTTCTCTTTCTCTGG
-AGAACTCTAATGCAAGATTATAAAAAAAATTACTGAAAGAATTCTTAAAATACATACATAAATTGAAAGTCATTTTATGT
-TCATGGATTGGAAGACAATATTGTTAAGCTAGCAACACTCCCTACATTAATTTACAGATTAAACCCAAGTCTTATCAAAA
-TCTCAACTGCCTTGCTTACAGAATTTGACAAACCTATCCTCAAATTCACATGGAAATGTAGTAAACTCAGAATAGCCAAA
-ATAGTCCTGAAAAAGAGGAATAAAGTTGGAAGACTTACACTCCCTGATTTCAAAACTTACTACGTAGCTACAGGAATCAT
-CCTGAATACTTTGTACTGGCATAAGGATAGTTATATAGATCTATAGAACAAAATTGAGAGTCTAGAAATAAACCCTTACA
-TTTATAATCAATTGATTTTGGACAAAGATGTCAACAAAATTCAGTGAGGAAAGAATAGTCTGGTGCTGGGGTGACTGGAT
-ATCCTCATGCAAAAGAATAAAGTTGGACCCTACCTCATATCATATACAAAAATTAACTCAAAATGTAGGAGAGATCTGAA
-TGTAAGAACTAAAATATAAAAATCTTAGCAGAAAACCTAGGTATAAATATTCGTGATCTCATATTAAGTGATACTTTCAT
-ATGTATGACACCAAAAGCACAAATCAAAAACTTTTGTGTGTCAGAGAACATCATGAAATAAGTGAAAATAAAAAAACCAC
-AGAATGGGAGAAAATACTTGCAAGCCATATATCTGATAAAACACTTGCCGTATAAAGAACTCTTCAAAGTCAACAAGAAA
-ATGACAAACAACTCAATTAACAAATGGGGAAATGATCTGAATGAACATTTTTCCAAAGAAGATATTCAGATGGCTAATAA
-GCACATGTAAATATCTTCAACATCATTAGCCACTATGCAATTATAAATTAAAATTACAATGATATATCACTTTGTATCCC
-TTAGGATGATTAAAATAAAAGACAGACAGTAACAAACATTGGCAAGGGTAGAGAATTGGAACCCTCATATATTGCTGATG
-GTATTGTAAAATGGTGTAGCCATTTCTGAGTAACAGTCTGGCAGTTCTTTAAAAGTTAAAAATAGAGTTACTGTTTGTGT
-GTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTATTTGAGACAGGGTCTCACTCTGTTGCCCAGGCTGGAGTGCAGT
-GGCGCGATCTCAGCCCACTGCAATCTCCACCTCCCAGGTTCAAGCAATTCTCCCACCTCAGCCTTAGAATTACTGTTTGA
-CTCAGCAATTCCACATCTAGGTAATAATCACCAAAAAAGTAGAAACAACCCCAATGTCCATCAACTGATTAACAGATACA
-CAAAATGTGGTATACTCCATACGGATTATCATTTGGCCATAAAAAGGAATGAAGTACTGGCTTATACATTCTAAACATGA
-ATGAACCTTGAAAACATTTTGCTAAGTGAAAGAAGCCCATCACAAAAGACCTTATATTTTATGATTCATTTATATGCAAT
-ATCCAGAATAGGCAACATCATAGAGACAGCAAGTAGATTAGTGGTTGCCAGGCAATCGGAGGGGAGAGAAGGGAGATAGC
-AAATGACTGTTAGTGGGTACGGAGTTTCTTTTGGGGGTAATGAAAATGTTCGGGAATTAGTGGTGATGGTTGCACAACTC
-TGTGACTGTACTAAACAGTATTGAATTACACACCTTAATATATTTTATAATATATGAAGTACATCTTGATAAAGCTGTTC
-CAAACACTTTATATAATATATGCTAAATATATATTATATAACAATATAATCAATATAATATATATCTCATATTTATTATT
-GTGTATTATATATTGTATAAATGTATATATAACTATATAGTATAAAATTATAACAATTGGACATGTTATAATTGTTATGA
-GCCCTATATATATCTCCTGTTGCAGCTTAAAAGCTGGAAGTCCCTGAATTCATTTGAAACCTAAAATAATTTCCTTCTTA
-CTTAAATATGCTGCCTTAACATCCTTTAAAGGTCTGAGAATTAAAACAAAACAATACCTATCAAAAACTTCCTTGTGACT
-AGTTTATCCCTAAGTCAAGTTGTTTTCTATTTATTTGTTTTCTTTTGGTTTGGATCAGATTGGTTTGTACATTATGTGGT
-TAAGAGCGTCTGCTGGGCTTCTAGTACTGGCCATCACCACTAGTAGCTATGATACAGGGAAAGTTATGTCCCTCTCTTTG
-CCCAGGTTACCCATCTGTAAAATGGGAAAATTTTTGAGGCCATCACTAAATATCAGTAGACTAAAGGACTAAATGACCTC
-TTAAAAATTCAGGGTTCAAGACAACCTATAGAATGGGAGAAAAATTTTGCAATCTATCCACCTGACAAACACCTAATATC
-CAGAATCTACAAGGAATTTAAACAAATTTACAAGAAAAACACAAATAACTGCATTAAAAAGTGGGCAAAGGACATTAACA
-GACACTTCTTTGAAGAAGGCATTTATGTGGCCAACAAACATGAAAAAACGTTCAACATCACTTATCGTTAGAGAAATACA
-AATCAAAACCACAATGAGATACCATCTCATGCCAGTCAGAATGGCGATTATTAAAAAGTCAAGAAACAACAGATGCTGGC
-AAAGTTGCTGAGAAAAAGAAATGCTTTTACACTGTTGGTGGGAATGTAAATTAGTTCAACCATTGTAGAAGACAGTATGG
-TGATTCCTCAAAGACCTAGTACCAGAAATACCATTTGACCGAGCAATCCCATTGCTGGGTATACATCCAAAGGAATATGA
-ATCATTCTATTATAAAGATACATGCCCACGTATGTTTACTGCAGCACCATTCACAATAGCAAAGACAGGGAATCAACCCA
-AATGCCCATCAATGACAGATGGGATAAAGAAAATGTGGTACATATACACCATGGAATACTATGCAGCCACAAAAAGAAAT
-GAGATCATGTCCTTTGCAGGGACATGGATGCATTTGGAAGCCATTATCCTCAGCAAACTAACACAGGAACAGAAAACCAA
-ATATCGCATGTTCTCACTTATAAGTGGGAGCTGAACAATGAGAGCACATGAATACAGGGAGGGGAACAACACACACTGGG
-GCCTGTCAGGGGGCCGGGAGAAGGGAGATTATCAGGATAAATAGCTAATGCATGCAGGGCTTAATACAGAGGTAATAGGT
-TGATAAGCACAGCAAACCACCATGGCACACATTTACACATGTAACTGTATTAGTCTGTTTTCATGCTGTTGATAAAGACA
-TACCCAAGATGGGGCAATTTATAAAAGAAAGAGGTTTATTGGAATTATAGTTCCACATGGCTGGGGAGGTCCCACAATCA
-TAGTCGAAGGCAAGGAGGAGCAAGTCACACCTTACGTGGATGGCAACAGGGAAAAAGAGAGCTTGTGCAGGGAAACTCCT
-GTTTTTAAAACCATCAGACCTCATGAGACCCATTCACTATCACAAGAAAAGCATGGGAAAGACCCGCCCCCATAATTCAA
-TCATCTCCCACTGGGTCCCTCCCACAACATGTGGGAATTATGGGAGCTACAAGATAAGATTTGGGTTGGGACACAGAGCC
-AAACCATATCATTCTGCCCCTGGCCCCTCCCAAATCTCATGTTCTCACATTTCAAAACCAGTCATGCCTTCCCAACAGTC
-CCCCAAAGTCTTAACTCATTTCAGCATTAACTCAAAAGTTCACAGTCCAAAGTCTCATCCGAGACAAGGTAAGTCCCTTC
-TGCCTATGAGCCTGTAAAACCAAAAGCAAGCTAGTTACTTCCTAGATACAATGGGGGTACAGGCATTGGGTAAATACAGC
-CATTTCCAATGGAAGAAATTGGTCAAAACAAAGGAGCCACAGTCCCCATGCAAGTTCAAAATCCAGCAGAGCAGTCAATG
-TTAAAGCTCCAAATGATCTCCTTTGACTCCATGTCTCACATCCAGGTCATGCTGATGCAAGAAGTGGGCTTCCATGGTCT
-TGGGCAGCTCCACTCCTTTAGCTTCGCAGGATAGAGGCTCCCTCCCAGCTGCCTTCACAGGCTGGCATTGAGTGTCTGCA
-GCTTTTCCAGGTGCACAGTGCAAGCTGTCGGTGGATCTACCATTCCAGGGTCTGTAGGATGGTGGCCCTTTTCTCACAGC
-TCCACTAGGCAGAGCCCCCATAAGGACTCTATGTTGGGGATCTGACCCCACATTTCCCTTCTGCATTTCCCTAGCAGAGG
-TTCTCCATGAGGGCACTGCCCCTGCAGCAAACTTCTGCCTGGGCATCCAGGCATTTCCATACATCCTCTGAAATCCAGGC
-AGAGGTTCCCAAACCCCAATTCTTGACTTCTGTGCACTTGCAGGCTCAATACCACATGGAAGCTCCCAAGGCTTGGGGCT
-TGCACCCTCTGAAACCACAGCCCAACCTCTACATTGGCTCCTTTCAGCCATGGCTGGAGCAAACGGAATGCAGGGCACCA
-AGTCCCTAGGCTGGACACAGCATGGGGACCCTGGGCCGGGCCCACAAAACCACTTATTCCTCCTAGGCCTCTGGGCTTGT
-GATGGGAGGGGCTGCCATGAAGCCCTCTGACATGCCCTGTAGACATTTTCCCCATTGTCTTGGGGATTAACATTAGGCTC
-CTCATTACTTATGCAAATTTCTGCAGCAGGATTGAATTTCTTCTCAGAAAATGGGATTTTCTTTTCTAATGCATTGTCAG
-GCTGCAATTTTTCCAAACTTTTATGGTCTGTTTCCCTTTTAAAACTGAATTCCTTTCACAGCACCCAAGTCACCTCTCAA
-ATACTTTGCTGCTTAGAAATTTCTTCTACCAGATACCCTAAATCATCTCTCTCAACCTCAAATTTCCACAAATCTCTAGG
-GCAGGGGCAAAATGACACCAGTCTCTTTGCTAAAACATAACCAGACTCACCTTTGCTCCAGTTTCCAACAAATTCCTCAT
-TTCCATCTGAGACCACTTCAGCCTGGACTTTATTGTCCATATTGCTATTAGCATTTTGGGCAAAGCCATTCAACAAGTCT
-CTAGGAAATTCCGAACTTTCCCAGATTTTCCTGTCTTCTTCTGAGCTCTCCAAACTGTTCCAACCTCTGCCTATTACCCA
-GTTCCAAAGTTGCTTCCACATTTTCAGGTATCTTTTCAGTAGCACCCCACTCCTGGTACCAATTTATTGTATTAGTCCAT
-TTTCATGTCGCTGATAAAGATATACCTGAGACTGGGTAATTTATAAAGGAAAGAGGTTTATTGGACTTACATTTCCACAT
-GGTGGGGAGGCCTCGCAATCATGATGGAAGGCAAGTAGGAGCAAGTTACATCTTACATGGATGGCAGCAGGCAAAAAAGA
-GAGCTTGTGCAGGGAAACTCCTGTTTTTAAAACCATGAGATCTTGTAAGACCCATTCACAATTGTGAGAACAGCACAAGA
-AAGACCCACCCCCATGATTTGATCATCTCCTGTCGGGTCCCTCACACAACACATGGAAATTATGGGAGCTACAAGATGAG
-ATTTGGATTGGGACACAGAGCCAAACCATATTAGCAACAAAGCTGCATGCCCTGCACATGTATCCTGGAACTTAAAATAA
-AATATAATACAATTTTTAAAATGAAAAATGAAAAAAATTTTTTAATTCAAGATTCAGTCATTAAAACAGGGACATATGCC
-CAATAAATGTATCATCATTATTTTAATACTTAGCACTCTGTTCTGTGGATTCTTAAAAGTAGCTTATATTTTAAACCACT
-TAGGCCTTATAACTGGGGGAAGATTCCGTCTTATCCCAAATTGGGAGAATGCAGGAAGCATGAAGGACAAAGGGTCAATG
-GAGTTACAACCTGTAGACAGCCTGAAAAACCAAATTTGGGGCATCCCTTTGTGCTGCTCTACAAATAGCCTTCATTTGCT
-TTTCCTATCTGGCTTCAAGATTAATTGCTAAACTTGGAAGGAGGACCTTGAAGTTTGCTCGTAAATTTTCTGTGTTTAAA
-AAGAAGAGTTTTATCATTAATATTCTGGAGTGAGCATGAGTCAGGGAGAGTGACTCAGGCCATGTTCTCAGAGGTGGCTG
-GCTATAAATCCACTTTTGCAGAATATTAATCTCCCCTGGCTCCTTTGAAAAGTTAGCAATTATTAGTAGATGGTGTGAAA
-GAGAGTCTTTAAAAGAGGAATGGTAAGACAATGTCACCTTGAGTTTCTTCCAAACTCATTGCTATTAGAGAAGAGAAAAG
-CTGTTCCCTCAAACAAACTTTGGAGAGGAGTTGTCCTGGCAGGCACAGGCAGCAAAAGCAAGTCACAACTCCACTAGACG
-GAGCCCCCACAGGGACTCTGTGGTGGGGGTCTGACCCCACATTTTCCTTCTGCACTGCCCTAGCAGAGGTTCTCCATGAG
-GGCGCTGCCCCTGCAACAAACTTCTGCCTGGGCATTTAGATGCCTAAAACTTACCGCATATGTGTACTGGGTCCCAAAAA
-AAACCCTAGTACCTTCAAGGAAAGATAAGGTTTCATGAAGCAATTTGACTCAATAATTAATTGTTCCTACCCGGTGATGG
-AATACCTAGGTTGCCTTGAAAATATTAAGCCAATCATTTGGAGAGTTTGAATCTCTTGAATGTAATAGTTAAAGGTAGAT
-AATATTTATGTCTTTGGGCAAGTGTAAACAGGGTCACAGAATTAGGGGATTCAAGAAATGGACATTGAAGTATCACCACC
-CATTCAAAGCCCTTGCCTGAGGAAGGGATACATTGAAACCACAACATACTGGTTTTTTTTTTTTCCTTTCCTGTATATTT
-ATATTAGTTGGCTCTTAAAATGTGGTGCCCAGAAGGCAGCATGGGCATCACCAGGGAACTTGTTAAAAATGCAAATTATC
-AGGCCCCTCCCCAGACTTACTGAATCAGAATCTCTGAGGTTGGGACTCAGAAACCTGTATTTTAACAACCCATCCAGATG
-ATTCTGCTGCTTGCAGAATTACTGCTCTAACTACAGCCAGTAACAGAGCTACTTTTAAAAAGCAAGTGATTATAACAGTT
-GGGACTATTGTAGGCCGAAAAAAGAAAAAGAAAGAAAGAAACTGGACTACAGTGGTCTAACTAAATAAGGGTTTATTTTT
-TTGTCACAAGAAGAATGGAGTTCAGCTACCCTGGGCTGATTCTGCAAAACCAGAATGTCATCGTTGTCCCAGGCTCCTTC
-TACCTTGGTAAGTGGCCTTTTCCCTCAGGTTCAACACTTCAAGGCCATAAGACAGCTGCTTCACCTCTGCCATGTTCAAG
-GCAGGAAGAAGAATGAGAAGTGCAAAAGGTAAAAGGTACATGCCAGCTGGGTCTCTCCACTTCTAAAAGGCTGCCTGGAA
-GCTTCAGCAAGTGACCACCACTCATGTGGCATAACATACAAAAACATTAATCAAATATTTCATCATCAGGGCTGGAAGGG
-ACAATAGGAAAGTACAAAGAGTTTAAAAAGAGTGGTTAAGGCCAGGCATGGTGGCTCATGCCTGTAATCCCAGCTCTTTG
-GGAGGCCGAGGCAGGCAGATCACTTGAGCTCAGGAGTTCGAGACCAGCCTGGGCAATGTGACGAGACCCCATCTCTACAA
-AATACACAAAAAGTTAGCTGGGCATGGTGGTACATGCCTGTATTCCCAGCTACTCAGTGGGGCTGAGGTAGGAGGATCAC
-TTGAGCATGGGAGGTGGAGGTTGAAGTGAGCTGAGATCACGCCACTGCACTCCAGCCTAGGCAACAGAGTAAGACCCTGT
-CTCCTAAAAGTAAAAAATAAAAGTAAAAAGAGTGGTTAGCAATTGTATTGCATAAGGTCTAATTTTGGTAAAGTGTGCTT
-GATTTTATTTTGGAAATTATTCTTCTTAAGATTGAAAATGCAACATTTGCCATTGTATTTACACCTTTCTTTATTATTTC
-TTCATCACTGGATGATTTTTACTCTTGATAAAAGTTTGGAAGTTGAATTGCTAGCACCAACTGTAATATCGGTGTGTAAT
-GCTGGGCCACTGTAGTTGAGGAAGATGGCTCATGTTGTCTTTTCTTGACTGACTTCATTCCACTTAATTATGGAATTTTG
-TTCATATCTTAGTGTTACTTCCTGGCCAGAAATTTTTATTTTGCAAACAAGTCCAAACAGTAAAATCTTTATTACAGAGA
-AATACTCTTAAGTCCATTTACTTTGATATATACATCTTTCATCAGCTACGTTTTTCTTCTTGGCAGCTAAGGTTTACATT
-TAATCAAGAAAATGTCCTTCTTGCACTTAGAGTAGGCACCCTCCTACCCAGCTCTGCCTCTAGTCCCAAAAAAGCCATCT
-GATGCTCACTACTGCCTGTCAAACATCCTAATGGATTATTGCTCCTCTCCATCAACCCCCATCTGAGGACCTAGCCAGCA
-GAATGCTAAAACACCCAATCCACACAGGCAAAATAAAATGATGGGGGGAGCAAAATCTGGAAACTTGGTACTCAGAGTAG
-GGTCTTCCCTCCAGGAGCATCAGCATTTCCTGGACCCTTGTTGGCAATGCAGACTCCCAGTCATCCTAAATCTGCTAAAT
-CAGAACCCACATTTTAAAAAGACCTCCAGTGGTGGTTGTGCATCTTAGTTTGAAAAGCACTGGCCTAAAGCAGTGGTTCT
-TGAAATATTGCTCTAGACATGCAGCATAATCATCTTCTGGGAAACTGTGAGAAATGCAAAATCTCAGTCCCATCCCAGCC
-CTGTTGAATTTGACACTTTAGGGGTGGAGCCCAGTAATCTGTGTTTTATCAAGCCTTCCAGGTGATTCTGACATAAGCCA
-AAATCTGAGAACTTCCCCTATAACAATGGTAGTCAACCTTACTTATACAAAGAAATCACCTAGGGTATTTAAACATTACA
-GCTGTCTCCTATCTTAAATATTTCTGCTCACAGGAGGAGTGTTTTAGGTCAAATTTCCCAGAAGAGCACCAGGAAAGACC
-ACATCTATGTCTAGCCCCACTCTTCTTCCTCCTCTGTCACATAACACTTAACAAGAATCCACATTTCAGACTGTTCCTTA
-TGAGCTCTCCCACACTGCCACACATTTGTTTCACCAGGCAAGATGAAAACAGCCTGCTGAGCCCCAAAGGAATAAAGCAT
-GGAAGACGACTGGAGAACACATTTGACCGCTTTGTAGGGTCAGTATCAGGGGCTGCAGCCTAGGAGGCCTGGATAAATGC
-TGCTTTCTACATAGACAGGTTGTGGAGGGGAAAAGACCTGATTCTCAACACCATTGTCTTGGCGCCCCTGCCACAGGTAG
-TAGATTAATTACAGAAAAATAAATAGTCCTGATTTCCCATTCCTCCTTGTATGCACACTCTTTGCAATGTGATTTTGTGA
-TTCTTCCAATCCAGAAATAGACTCTGTTTCCCTACCAGTTGAATCTGCTCTATGACTTGAATTCGCCATAGAATGTGGTG
-GAAAGGATGGTTTGCCAGTTCCAAGCCTGGCCTCCGCAGGCTTGAACACTCTCCTCTTCCTCTCCGACCCTTAGCCAGCA
-CCAAGTGATGATACCCAGACAAACTAGCGTGAGAGACTTGTGCCCCAGTCATGCCATCCCCCCCAAAACAGCCAGCTGAC
-CACCATACATGTGGGCAAGACCATCCTGGAGCAGCACTCCTCTAGTTGACCAATGACTCCCATATGAGCCCAGCTGAGAA
-CAACAGAGAAGGGCCCAGGGCAAAAGGGTCACACACTGACCTGTAACCTTGAGAACTAATAATGGCTGCTATTTGAAGAC
-ACTGACTTTTGGGGTGCCTTGTTAGGCAGAATTATTGTGACAACAGTTCAATAATACCTCACAACTTTCAGACCTTTCCT
-GGAGAGACCCAAATATGGGACAGAAACATTAAACTACAAACTACAGACAGCTCTGCACACCTGACTCTGGGTGTGAGGAA
-ATGGACCACGGAGAAGGCAGAGGCATTGGTGGTCAGGGAACACAGCACTCGAGACAGAGCAGGCTTAGAGCTCAGAGGGG
-CTCGTGAGCTGCGAACAGCACAGCCTGCAGCCTTCTGTGAAGTCACACGGGGAGGAAGTGATGAGAAGGCAGGTTCTATT
-TCTGTTATGTGATCTAGAAAAAGTACCTGGGAAGCCAGCAGGGAGCCAATCAGGGAAGTTGACTGATGGGGCCAACATGG
-GCTTCCGTTTTTATGAAAGATGTGGAAGAGAAAGAGAGAAGGGCCCAGAAGTGTGAGATTTGGGGGTAAAATTAGAACTA
-GGTTTTTTTTGTAGCTTTAAATTTTTTCTTTATTGAGGTATAACAAAAATACAGTAAATTGGCTGGGTGCAGTGGCTCAC
-GCCTGTAATCCCAACACTTTGGAAGGCCAAGGTGAGAGGATCACTTGAGCCCAGGAGTTCAAGGCGAACCTGGGCAATGT
-AGGGAGACCCTGTCTCTACAAAAAATTTTAAAATTAGCTGGACATGCATACGCCTGTGGACCCAGCTACTCAGGAGGCTG
-AGGTGGGAGGATCCCTTGAGCCCAGGAGTTCGAGGCTGCAGTGAGCTGTGATCATGCCACTGCACTCTAACCTGGACAAC
-AGAGTGAGACCCTGTCTCAAAAAAGCAAAACTAAAAAAAGCAAAACAAATGCAAACGCAGAACAGTACATTGCACAGATC
-TTAAGAGTCAAGCCTGGTGAATTGGTGGTGTAAGCTCCCAGATCAACACGAAAGGCTTTGTAGCACCCGGAAGTCTCCCT
-TGTGCCCGTTCTTGGTCAACTCTTCTTCTTCAGAGGCAACCCCTCTTCTAACTTCTACCACTGCAAACTAGTTTTGCCTG
-TTTTTGAACTTCATATAAATGAAATCATGCAGTATGTGCCCTCAACTCTGTTTTTTTTTTCTGCTCATCATTTTGCCTAT
-AGAATTCTTACATGGAGGTGCATGTTATAGTAAGATGTTCTTTTTTATCATTCTGTAATATTCCATTTTATGAATATACT
-ACAATTTATTCTGGTCTACTGTTATTAGACATTTTGACTTTATGAATAGGGCTGTTATGAACATTCTTGTACATGTCTTT
-TGGTGCACACATGTTCTCTTTCTCTTGCTAAACCTGTGGCTTTTAATCAATCCCTCCTTTGTTCATCAACTGGTTTGAGT
-AATGACCCGACACCCTTGGTCCCCCTTTCCCAGGCTCAGTAAGAATCTGCCCCTGAATTCAAAGCCCACTCTAGGAGGGA
-GGGCAAGAGGAGGAAAAGGGAGAGAAAGAAGAAGGTAGCTCCAGTGACTACAGAAATGATATCAGTTCTTCCTAACTTCA
-CGTTTTGTCTCTAGTGGCTATCTGAAGTGCCTAAAATGACATTCATTGGAAGTAAAGACGTGAAGATTCCTTTAGAGATA
-CAAATATGCCTTTTAGAAGGGTAAATACATAAAAGAATTTAAATGTTACCTTTGCTGGTCCTTCACAATGTTCAGATTAT
-CCTTTATTTATTAGCTCCCCCACTACCCAGAGTGGCCTCCCCACTACTTGCATCCATTACCTAGGAGTTTGTAAGAAATG
-CAGAATCTCGGGCCCCACCCCAGACCTGGAATCAGGATCTGCATTTTTAAAAGATCCCCAAGTAATTCCCGGGCATGTTA
-AAGTTTGTGAAGCCGTGTATTATCCCACTGATACTTTATACAAAACTCTATAAACAGAGAGAGGAGGAATAATTGTTCTC
-ATTTTACAGATAGGGAAATATGACGCGGAAAGGTGAATTTGATGTGCCAAGGGCACCTTGCTGGTTCTCTGCCAGGGGAA
-GGTCTCTAGGTGGAGGCTCTGTTGATTTTCTGAACACAGATATTTCCATTATTTCACACTGATACCCACTGGCACTCCTA
-ACGCTTTATCAGGCCAACCAGCCTGCCTCTCTCTAGAGAGCAGTGTCCTAAGGGCATGCACTGTGTAACTTTGTTTGAAA
-GTTGGCATGAGGAGCCACCAAGGACATAAATGTTGCAGTGTGGTAAGTGGGAGTAAAAGGGGCAGGGTAGAGGAAGGGAA
-AAGGAATGAGGAACCCCAGCCACCACGTGAAATGGCCCAGAGGGGCTTGGGAAAGAGGAATGAAGGGGCTCCAGAGACGC
-ATTTCAAGTTCCTGGCCTTGCTGTCTGCTCCTCCCTTGCCTGCAGACAGGAGGTCTGTGCTGTGACGCAGTCTGTTAGAG
-CCTGTTGGCAGCCAGCCTGGAGTTGGCCTGCACCCCCACTGCAGAGCTCTCAGCTACGCAGGGAGAGTGGAGGCTGCCCA
-GTGCACCTTTGCTGGGTACTGCAGAGCATCCATGCCACCTGCACCAGAGGGAACACAGCTCTGCAGTAATGCCAGTTAGA
-CTGCAGTAACCCGAGATGGGTGTAGCTCATACTGCAGTAACCCGAGATGGGTGTAGCTCCATGCCCTTGCACACCTGCAG
-GGTCCGAGGACCCTGGGTTTTTACCATCTGTTTCTGCACCCCCCTCCAGGAAGCAGCTCCAGGTTGCAGAGTTGCTCTGC
-CTACCCTGAAGATGTCTGGAGGCTCCCCATTGACCCTGAGCCCCACGACGGTCCCACAGCCAGGAAGACGGGCTCAGCAC
-GGCTCATGGTTCAGATCAGTGAAACTAGATTCCATGGCCTCCTTTCAAATCCAGCTGGAGGAGGCTGAAAAATACCCCCA
-GGGCTCTGCCTGCCTGTGTACCGGTATGGGAAGACTCCAAGAAAATGTACAGCCTCCCCCACACCACCCCCACAGGCGCC
-AGACATCAAAGGTATAGTTAGCAGTGGCCTTCCAAAGCCAGTGTCTGATTTGTTTCCTAACCTAAAAGGATGGCTCTAAT
-GGCAGAGGTTTTGGGACAGGCAAAGGGAAGGGAGTACCACTGGCTGGTGAGGGAGCTGTTCGGGGCAGGTAAAGAAGCTT
-GTGGGGAGGTAAAGCTACAATGTGTAGTGAGCTGTCCCCATGGAGTGTGAGCCCGATCAACCCCCTCAGTCTAAAGAATA
-GGACACCTGCCTCTGCCTTGTGCAGCCTCCCCGGTGCTCCCAGCTGCCCAGTTTGCCTCCATAAATGTTACTTTTCTGCC
-GTCCATATTAAATGTTACCCTTCCCCAGTGTTCATAGAGAGAGGAGACAGATGCCTTTCTCTATGAACCGCTGCAGACTG
-TATTCAGTCAGGGCCTAGTTGTGTGGCAAGGGCACTGAATCCAACCTCCCAGCAGACAAAGCCATGCAAGAAGGAGGGTC
-AAGTTTCCAGGCCCAGGTTAAAAATCGTTGTGAGTGTCAGGTGTATGTTGGCAGGTGATCAGAGGCGGGGAAAGGAGGTG
-GAGGTCCCTGAAAAGCATCAGCCAAAACCACTGCTTAGGGATTAACAGCTTTTCAAGCAGCCTGGGATGTCCTTCTCATA
-AGGTTTGCCAGAATGGATGCTACTCACCTTCTTCCCTACTCCCTGCTGTGTATACCTGTACACAACATCCAAAGCAGGAC
-ACATCAGGGAATTCAATCCAAACCCTATCACGACAGTGGAAATTTTAAAAAATCTTCATGACAGAAAAGGTTCAGTGTTG
-GATGTCACATGGCAAGGGTATAAAAGAGTTAATTCAGATACCATCCTATCTGAAATTCCATCGTTATTTTTCCCACCTGT
-TTAACTGAAGCAGACAGGGCTTAACAATCTCGCTCAGATTTCAGTCTTCTCTCACTAGTCACCTAGATACTGACAGTTCA
-CTCATTTATTCGATTAATAATTATTGAGTACCTGTCATGCTTGAGTCACTGTGCTAGTGAGAAATCAGTACACTGTCTAC
-CATATAGGCATTCACTTATTCTACAAATATTTATTGAGCACCACCTGCTTACATAGCACTGTCCAAGGTGCTAGGGAGGG
-TACAAAGGAAGACAGCAGACAAGCCCTCAAGAAGCTTCAGATACATGTGGAGAAACGTGCAAGCCCACAACGCAGCCCAT
-TTCTACTGTCAAAGAAATGGACCCTTGCTACAGAACTGTGGATCTCCTGAGAGCTTGTTAGAGATAGAGTCTCACACCCC
-ACCTGAGACCTGCTAAATCCGAACCTGCCTTTTAAGAAAATTCCCCAGGAGGTTCCACGCACATTAAAGTTTGAAATCTA
-CTGATCTAGACAAAAGAAGCTCTAAAAATTCAGGGGAGAGAGAGATTATTGTGCACATCAGTGGTCAAAAAAAAAAAATC
-CATGAAGGAGTTTGCCTTTAAAGGATGTCTGGGCTTTGGCCAAGTATAGAGAGCTCAAGGAATAGTAATTTCCCACCTCC
-AATGAGTTAAAAAAAAATATGTCTGCAAACTGCGGAAGGCAGTGACATTTTTCAGACACATTTTCCACAACAGCAAAAGC
-TTTGACTCAGGTAAGATGAGTCTGCAAATTCTTGTTGCTGATGCTATCAGGATCCCCAAATTGCAACTCGCCCAGTTTGG
-ACAGCTTCAAGGTCAGATTACCTGCTGTCCTGAAATGGACAGGCCCAGGAAAGATTCCTGGCCTTGTCCAACCCACCTGT
-CAGTCAAGTAGATCAGCCAGTGAGAAACTGGCTCATTATTTTCCAGCAGTTACTCAGCCAATTGGCAGTCCCCAGCAAAT
-TGAATTCTGGAGTGGCATCGTGTGAACATCGGTGTGGTGGCTGCTTTATCAAGCCAGTCCAACAGAGCAGATAAATCACT
-GAGAAGTTTTGATTAGAGGCTGTTGGCACCAAGACTATTGTTTCATAGTAGATCAGACTGAGCAGGTGTCTCAGTTTTTC
-TTACACTCATCCTTCCTGCATTCCATTTAAGAATTAAGATTTTTGCTTTCAATACAAAAATTGAAATAAATGAATAAACA
-GATCTAAACATGACTCTACTGTTATCTCTTGTTTCTAACTACCACCCACAATGTCTGTTTGTCCAACAATTGAATCCAAA
-AAAGATTGTACAGAACTTCACAATTGCATAGTTATATAGAAATTCTCATTCACCATTGAATGAACTGCTTACAATTCAGG
-CCTGTAGTCTATGGTGATAAAATCTGCCCATTGCTTCAGAAGTCATGCCAGGGAGGATTTGTCAGGTAAGCTCTAAAGAC
-AACACAGCCCAACTCATTTACCATTGGGCCATTATTTTCCAGAAGCAGGGATGGGTTTGTGATGAGCCATCTATACTCTC
-TAACCTCCGTGGCCATGGCTTATGTTTATAAGGCAGCTGGCAGGGATAGGGAGGTTGGGTTGAAGCTGAGTAGCAGGACC
-TGGCTGGCTCACATGAAGTGGATCCTAGGACTTTGACTCATCAGCTCTGTCTTAGTCCTGTTAATTTGATGCTTAATTAA
-TAACAGGGCATTAACATCTGCTGTGAACATACTGCTACTCATCACCCTCCCAACCCTCCCTGCCTTCTCCTCTCATACCT
-GTCTCCAGGAAGCTGGACCCACTTATCAGCCAACTTAGTCTCTCAATTATTACCAAAAATGTGTTTTCAACTTGGTGCAC
-ACTGGGGGTGTGCCTGAGCAGGATGGCGAGAAGGGGCAGGCACACACTGAGAAGCGTAGACATACTCCCCTTTATCTAAG
-GGCTCTGCTATTTAGGAAAGGGCTTTTGTGTGAGGAGGTTCGAGCCTCAAAGGCTCATCTTGTCATTTTTCCTGTGCCTT
-TCAGAGATGGAGCATATTGTGCTGTGTTTTTGAAATGATGAAATGAAAGTGTGAGGAATCTGAAAGCCATATAGATAAGG
-AGTGGTTGAAGGAACTGATGGAGCTGAGATGAAACGTTATTTCAAACGTTGGAGGCGTCGTCGTGGGAAGAGGCAGCAGG
-TGTGTTCTTTGTGGTTCCCGCAGGTGGGATATAGGTTCGGTAGAAGGAGGCACTTTCTCACAAAGAAAAACCACCCAACA
-ATGGGAGGCCAGGCCCTGCTTCCTGAAGAAGGAGCCCCCCCATGATGACAGGTACTTAAGCTGAAGCTCCACGACTATGT
-ATAGGAGTCACCTGCATTATAAGCAAAAGTTGGAATAGAACTCAGCATTCTTTTAACTCTGAAAGCCTACAACACATGCA
-AAGCTAACCTTCACAGAGTAGCTCCTATGGTCTCACTTTACAGGTATTATCCCACTTAACGCCCACAGCAGTCCAATAAG
-CTAGGTACAGTTATTATGTTTTGTTTTGTCTCTTTTTGTCCTCACTTCGGCTTGGAATGCTCTTGCCTCAAATATCTCCC
-TCCTTTCCCATTATTCTGATCTTCTCAGGGTACTATTTCCTCCCCAGTCCTTCCCAGTCTTCCCAAAGAGGGGATAATAT
-AACCACCCCTCCCCCATCTCTCCATCCCTTACACTGTTTGATTTGTCTTTATGGCATTTAGCACTGCCTAAAATAATGCT
-GCAATTGTATCTGTTTATGACCTGTCTCCTCTGGGAGAACAGAAGGACTTGGTTGGCTTTGCTCAGTGCTCCATTTCAGC
-ACAGAGAATCAAGGCCTGGCATAGCGTAGGTGCTCAGGACGTATGCATGGAAGGAATAAATCAGTCAGTTTTACAGATGA
-GGAAACCTAGGCATTAAAGAGGTAAAGCAACATCCAAAGGCCAGACAGTAAGTAAAGAGAAGGACCAGGTTGAGAGCAAT
-TTGACTCCAGAGTTCACATATGTACAGACAACCCCCTACTTGTGATGGTCCAACTTCACGGTTTTCAACTTATGATGGTG
-AAAAAATAATAAGCATTCAGAAGAAACGATACTTCAAGTACCCACACAACCATTCTGTTTTTCACTTTTAGTACAGTATT
-CAATAAATTACATGAGATATGCAACACTTTATATAAATAGGCTTTGTGTTAGATGATTTTGCCCAAATATAGGCTGATGT
-ACGTGTTCTGAGCATATGTAAGGTAGGCTAGGCTATGCTATGATGTTTGGTAGGTTAGGTGTGTTAAATGTGTTTTATAA
-TATTTTCAACTTATGAAGGGTTTCTCGGGACATAGCCCCTTTGTAAGTTGAGGAGCATCTGTACCCCATTTGACCCTTTG
-AAAAAAACATGTATTCTCAAAGAAAAGCTGAGACATCCTTGTTAATTCAGTGGCTGGTGCTGGCTCTTGTTTTATGACTT
-CAAATGACTTGTGCCTATAAGCAGGTGGTCACTGGTTGCCACCAACATGGTGTCTTAAAAAGCCCATTGAGAGAGGTAGA
-GGGCAAAAGGCAGAGGGCACAAAGTTACCTTTTGCCTCAAAGGTCTGACTGCACAGTGATTTGCTGAATAGAGCAGGTGA
-GTCAGAAAGGTACAGAGAACAGCTTGGCAGTCACCTGGTCCTAATCTATCCCTGGGCAGATACATTGAATCTGACACAGC
-TCCCGTGCCTGGAGTCCTCAGAATCAAATTTGCAAACTCAGAGCAGATTTCTTGCGTCTCCAGGCGATTTGAAACCATAT
-GCAATGTCACCCTTTCACCAAAGGAGCTGAATTTATGTTCCTTGTTTTCTCCCTCCCGGTAAGGCTTGGATTTTTCCATG
-ACAAAAATCTTGTTCATTTGAATATAAACAAGTTATAAAATGAAATCCACATTGACTTTTGCAGTTAATTAAAAAGAATA
-TGGACTTGAAAATCAGACTAACTTGAGTTAGAATTCAGGTTACCACTTTGAATCTCCATTTTCCTACCTGAAAAATAGAA
-ACTAACCCTTCTCGCATGGTTTTTGTAAGGATTAGATAAAAAAAATTGAAGGGGGCATCTGCCATTGATTTTCTCTTCTA
-TTGTCAGAGCATTGTTTTCCGGCTAGACGCCTTCTAGTCTTTCTGTAGCTGGGTACAGGAAGAAGCATTGTCTGAAGGAG
-TTATCGGTGTGGAATCCAAAACAGCTAAATTGAATTAGCAGAAAGACAAGGGCATTCCAGTACACTGTGGCCAGGGAAGT
-GCTGTATTCACTCATTGTTTGCACTCCTGAGGTCAGGCTTTCAGGTCAGACCTTGAACCCTCTGCCTGCTTCACATCCTG
-GCTCCTTGGGAAGCCACTCCTGTGGCTTCAAAGGGGCAAAACTAAGAGAATGGTGGAGCTGGAACTTTCATGACCAGAGC
-CTGCCCTGGCCACATCCTCCCTTGGAACCTACAGTGGAAAGTGGGGACAATTTTGCTAGGTCACACCTTTTTGAGGACCT
-TGCTGGGCTTGTGGATCTGCCAGAAAATTCTTTCTTTTTTGAGGGACAAAAGCCTGCTGCTCAGCAGTTTTAGATTAAGC
-CTAATGAGTTCTCTCTTGAGATCACCATTGTTCTAAGCTTAATATCATCCTCATTGACCTAGTGGTATCAAATTCTGTTG
-GCATACCTCTTACTAACAAAACACATCAAATATGTTTTTATAAAACATGATACTAAATTATAGAATATACCAAGAAATAT
-GCTTGTACAGTGAATCTGTGTGCTTCTATTGCTACCATTAAACGTTTGCACCTACTTCTAGCTATCACCAGAATGGGTTC
-CACTAGCTTCTAATATAAAGTCCTACACAGCTGTATCTCGTAATTTATAAGGTAAGGTGGGAAAATGCATCTCAGGTCTC
-AGCTATCTCCAGTGGGAGGCAGGTTCTACCACTTTCAAGGCTCATAACACAGGAAGGGGTGTTCAAAGGTGCAGGGTAAA
-CAGAAAGATGGTGTTCACTGCTAGGCGTCTCAAAATGAATGTGAATGTTCATGCACTCTTATATACAGCATTTGAAACAA
-AACAAAACAAACATAAAATTAAACCTGACATCTTGGGAATGAGAAATTCTAAGGGTGCCCAACATATAGTAAGTGCTCCC
-TAAATAAGCTGAATGGATGAAAGAGTAAATAACTAGGTAGATCATGGAGCCTCTGATATCTGAGTAATACGGAAGTGTTC
-ATAAAAAAGGGAAGCCTCAGTGAGACATATAAATCCAATGAAATATGTTAAGTCTCAAAAAGGGAGCAGATAATTACTTT
-TGCTTTATGTTTTTCAATGGAGTAATAAATAATAGAAGAATTCTGGTCTCTTCTCTGGAAGCTGTCGTTTACTTGGTGAA
-GTTTTCCTGTTTTTTCCTAATAAATGATATCAGTTTTAATGCCGTGCTGCCCAAAGATAACATCTGATATGCCCTTAGAG
-TCAGTTATACAAAGAAATATAGGTTTAGCTCTGGGCTTCTCATCCTTGAAACTGTAGACATTTGGGACTGGATAATTCTT
-TACTGTGAGGAGTCGTGCATTGTAAGATGTTTAGCAGCATTCCCTGGCCTCTAACAACTAGATGCCAGCGGCATCCCTAC
-CCTATGTGATAACAATTAAAAATGTATCCAGACATCACCAAATATCCCTAGGAGGCAAAATTGCCTCTGGTTGAGAATCA
-CAGACTTAGGCCTCAAAAATGGGCAACTCTTAGACAAATTTGATTTCTAGGCTTTTTCAAGTTGTAAACTAACTTTTCTC
-TAAGCACAGCTCTGCCATGGTATTTGCCTTGTATTCAGTTAGGGCCTGAACAAGATAGTGATAGAGACCAGAGATCTCAA
-AATGTGTCTATAAGATAAGCTGTTACACCGAATGATATTATTTCAGTTAACTATTTACATAGTCCTATTGTTAACAAACC
-ACTCTGGAATTCAGTGATTTAAAACAATAATTATTCTTATGTTTCTGGGTTTACTGATTGGCTGGAGCCACTCAGGGTCT
-GTAGGTTGACTGGGGCAATTTTGTTCCATGAATATTATTTTTACACCCAGGTAGAAGCTACTAGGGAGAAGCTCTTCTCA
-GGATGGAGGAAGAAGCTTCCGGAAGCACTAGCAGAAAAATGCACTGTCTCCTGAGGTCAAAGAAGGCACTCGGCACACAC
-TGTCATGTCCGTCCACTACTGCTAGCCTAAGCAAGACACAAGGTCAAGGCCAACATCAGCTGGGCAGGAAAGTACACACT
-TCCCTTGAAGACTGGGGCAAAGGAATTCATGAACGCCAAAGATGACATTTTCAATACAACCAATGAGATGGTGTCATGGG
-TCTTCGGTTCTCACTGGCTCCATTTCTTTAAGAGACAAAGATGGGGAGGTATCACTGGCGTTTGAGTCACGTTTGCAAAA
-CATATTAAGATCCCAGTGGGAAAACGCACAACACAGAGAACAAAATTTCCATAGCTACATTTAAGAAATCTGACTATTGA
-ATCAGTAGGCTGGTGGTTTTATTTGTTTTATTATGTTTTCCGGACCCTTGGTAAATATTGTCTTAATTTGGGTTAATTAC
-TTTTAAAGGGAACCTCAAGAATCAAGGCAAATTATTTGATATTTATTTCGTATTCTCCTTCCTTGTGACTAGAATACTAA
-ATAAATCACTAGCAGCTTGACAACAGCAGCAGCCTACAACAGAGGTATAGAATCGGTACTTTTGTTCTGCCTTCTTATGT
-ACTCTGCATTAGTCATGGCCATGGTAGAGAATTCTGTGGACTGTTTAAGCTTCTGTGTTTTTCTGAAGGTATATAGAGGA
-ATGGAATGGGTCCAACAGCAAAATTATTATTAGAAGGGAATAGAAATTGCCCACTAGTTGAATCTTCAATAAATATCTAC
-CGTTGATTTCATTAACTGATACATGTGAAAGCTAAAAGATAGTTCAAATATTCCTGATACATCTTCCCAGGGACCTGACT
-GAGGTCAACCCCAAAATTTTAAGGATGAGAAACACTGAATTTAAAAAAAAAATCCATACATTGTTCAAGTTTTCCTTTTA
-GCCATAACAGATCCTAAGCTAGATCAGCCCAGGCTTTTTAGCTCCTAATTCCAGAACCTTCCAGCATACCATGCTTGCTT
-AATACAATAAAGGAACTGCAGGTATTTGGCCTAAGGGAGATAATAGTCATTTGGGATTTTAAGTAAATAAGAATCTCTTC
-CATCTGGATGCAGAACGCCGGGGTCTCAAATTGGGCAGGCAAAAGGCTTATTTTGAGGACAATGGAACACTCCCCTGTGG
-TCCCATTCATGGAGATGTGGGATGAGAATGAAAGTGAGGATCTTCAGCCTTCCTGACAGAATGTCCATCCTGTCACCTGA
-ACCTCTGTCTGCCAAGTACAGTGGGGACTTTTCATTCCTGTGCTGATTTATAGCTTTCTGACATCTGACACTGTTGGCTT
-CCTCTTCTTAGAAAAATTCCCTGGGAATTTTTCTGATCCCACTTCTCTGATGGCTGCTTGTTCATTATTTTTGCAGTTTC
-TTTTCTTCTGGACTTGTCCTAATTAATGGTGTTCCCTTTGGTCCTCCCCTTTCCTCACTCCACGTGCTGCCCTTAGGGTC
-TAGAATTGTGGCTCTCAAATCTTCATCCCCAGCCCAAGTTGTCTTTTAAGCCCCAGAGCCACATTCTCAACCTTCTGGTG
-CACATCTCTTGGCTCATGGGAACCTGACTCCACATTCATGTCTCCCTGTGCCTGCCCTTCAAACACCATCTCCTTCTCTG
-GCATCTCCCCACTCAGGGAGCAGCAGCATCTACTCAGATACCTAATCCAGAAACTAGGGACTTAATGGAGATTCCACTGT
-TCCCACCTTGCCTCACATCTAAGCAGCCACAAGCTCTGTAATTCTACAGCCTCAGTATTTCCTAATTATCCCCTTCCCTT
-CATTCGCAGACATTGTCTGAGTTCATTCACATCTTGTCATTTCTTACCTGGAACTGTGCACTGACTTCCTAACCATTCCC
-TAAACCCAACCTCAGCCCTTCGGCCCTCCATCCCTAAACCATTCTCCATGTGCCCACAAGCCATCTTGCAGTATAGAGCA
-CACATTTTTTTCTCCTTTTTTGTTTTTTAAGGGATAGGTTCTTACTATGTTGTCTAGGCTAGTCTCAAACTCCTGGCCTC
-AAGCCATCTTCCCGCCTCATCCTCCTGAGTAGCTGGAACTGCAGGTACATGCCACCATGCCCGGCCCACAAATTCTTCAG
-AGAGTTTCTCTAATAATGAATAAATTCAAGTTTTAGACAGTAATCTGATTTATATCAGCATTTGTACTCTGAGCATGGGA
-CATTTGTTTATTTATTCCACATTATTTATTAAGTGCCTATTCTGAGCCTGACCTTGGCAATAGAATAGCAGTGAATATTT
-TCTTTAAACTCATTCTCATGGAGCTTAAAACTTAGTAGGGGGAGGCACACAATACAAAATTAAATAGATATCTATAATGA
-ATAATATATTAGTTTGGTGCAAAAGTAATGGCAGTTTTTTGCCATTGAAAGTAATGGCAGAACCTACAATTACTTTTGCA
-CCAATCTAATAAATCAATACAATATATATTACGTGAGAAAGTGAAAAGTGCTTTTGAGAAAAGCAAATCAGAAAAGGGGA
-GTTGGGAGCGTTGTGGGGGAGGGTTGAAATGCTAGGCAGGGTCTGAAGAAGACGACATTTAAAGACCACAAGTGGGAAAG
-GAGTGAGCTATGCGGATAACCTGGAGGAGGGGGATTCTGGGTGGGGAACAGCAAGTACAAAGGCCCTGAGTCAGGAGTGC
-ACTTGTCAAGTAGAGGAAGTAGCAAAAGAGACCGATGTGGCTGTAAAGTGAGAAAAGTGACAGTAGCCAGCTTGCATAGC
-ATCCCATTGCCAATGGTTGCAGCAGTACCTAGAAAGAAGGCCAGCACTGAAATCTAGTGTTTTTGGCTTTCTCTGGTATC
-TCTGAGAAAGTGTCAGTCTGGCATACCCATTGTCAGAACAATCCACTTAAATAATATGTGTCCTAGTCAGTTTTTGCTGC
-GCAGCAAACAACTTTAAGTCTCAGTTACTTACAACTACAAGCATTTGCTTTTCTCACTTATGGATCTGTGGGTTGGGTGA
-TCTTGGCTGGGCTCAAGATCTTGGGTGATCTTGGCTTGACTGCAGGCTGTAGGTTGGGCTCATGTCTGCCCACCTTGCCT
-CTGAGTTTTTCCTGAACCGAAAGACACATTCTATGGTGATCACAGAAGAAGAGGCCCAGCCAAACGATGAAGCACTTTAA
-AACCCCTGCTCATTCACATGTCATTGGTCAAAGCAAGTCACATGACCAAGACCAACATCAAATAGATGGAGAATTATATT
-CTACATGCCCTAGGGGGAGGCACTGCAAACCCACAGCAAAGGATGTGGAAGTATAATTCTGCAATAGTAAATGAGTGAAG
-AAACAAGACCAATCATCCAGTATTTCATTATACTGTAGTCCTGCCTTGAATCTCTACACACTTTTGCAGGTTAGAATGCA
-CTTACACACGCCTTTCTGTGATACCTATTTAAAAGCCTTGTAGATAGTAGGCACTCATAAAACTGCTTCCTTAATAATGA
-AATCTATGGATAAATGCCTTATTTCATATGACCCATGCAACAATTAGTGAATTAAATACAAATATCTTCATTTTACAGAT
-GAGAAAGAATCTAAATGACTTTTCATTCAGGGTTGGCAGACTCAAGGCTCAAGCCCAATTCTTTGCTCTCTAAAGCAAAA
-GACAAAAATTCCAACATTACCTCAAAATTAAGTTTACAGCAACATGAGGCCTATATTTGATTACAGTTGTCTGGAGTTCG
-AAGCACATTTTGTTGTAAATAGTTTTGGTTAATCTGACATTTTGTGAAACACAGTAAGGGCCACAGTGAGTTTCTGCTGG
-GTTTAGGCTTCTTTCTGAGATTGGCCTGGCTGAGCTAGGCAGGCTGACTGCTCATTCACCCATTTATTTTTCATTCAATC
-AACATGAACTGAGTGTTTATAAGAAGCAGTGTTTTTAAAGCTAGGGCTTCCACTGTAAAGAAAACAGACAATCATGGAGC
-TCTTTGAAAGGCAGACGGTAGTATATACGAAGTTGGAAGTGGTAACTACTCTGAAAACAAATAAAACAGAGTTGGGGATA
-GGAGGTTAAGGGGCATGATGACCAAGGTGAAGTAAACGAAAGAGGAGAAAGCTATAGTCCCCATGGCAGAGAAGGATTTG
-TATAGCTGGTAACAAGAAGGATCAACTCAAAGCACCAGGAAAGGAATTGGATTAAATAGACAACTCTTGTCCAGGGTTGG
-TGGCTTAACCTGCACGAGTGTCCCCAGGAATGCAGCCCCCACCCCAAAGGCAACAAAGACCCTGCTTTTAAACTGACTGT
-TGGGGTTTCTTCACTTCCTGAAACTATTTGAAAGAGTCATCATTCTTGATTTTCTTTCTTAGTTAAAATTTGAAATTCAG
-GTTGAATTTTTAAAAACTGAGTTCTGTCCTAGAACTTCAGACAGAGGAGGTCAAAGTATCTATAAGATGCTTACATGCTA
-ATAAAAGATTTCACACCAGTAAAGTGCATTGAAGGGCACTGTTGGTGGGAGTGAGGTTCTGAGTGGTCTTCTCATCTCCC
-CACCAGGAAAATAAAAGAATCTTGAATATGATTTGCATAGAATTCTGCCATAATTCAAGATATGACCTGTAATTTTATTG
-CAAATATTGTTGTTTGGCTCCCACCAAGTGGATAGATGGGAGTAGCACAGAGGAAGGGTGCAGAAAGGAGAGAACCCTCA
-GTAACAAGGAGAGGTTAGGAGAAGAGCCTTTTTATAATCACTCTGTTCTCTCTGGAAGGAAGAACATCTTTGGGAAACTT
-GAGGCAAACAATTTCCTTGCATTTACTTTGACAAGTACCATCTGTTAATGGCAAATGATCCTGGATTTTCATTTACAGTA
-TAAATACAAAGTTTCCTTTTAAAATAACTTTAATTTGTAAAGTTAGTACAGGTGGTATATTCTTGGATTAGTTTTTTCAA
-CCTCCCCTTTTCTTTCCAAGAGGTTGGATGTCTTAGAATTATACTTTCCAGACATCCTTGTGGTTAAGGCTCTGGATGAA
-TTCTGTTGTGCCAATTAAATGCAGTTGCATGAGTTTTGTAAGGCAGAAAGAAAGTGAAGCGAGCCTTGCTGCAGTAATGG
-CAGCTGATTAGTAAGCTTTGTGAGATTTGAGCACATGCAGGAGTCAGACTCATGCTTCTACTCTAGTCGACGGAGGCAGT
-TATTATGGCAGCAAGAGTGGAAAACGTGAAAACTGTGGTTTCTTCCTGTTGACATGGATAGCAAGTTCCACTGGTGCCTC
-TGACTTCCATACTCTTCTCACCATTTTATAAGCATCTATTTCCCTGTATTAAATCACCTTCTACTTGAAATACCTAGAGT
-GGTTTCTCATTATTTTATTAATTTAACACATGTGGCAAAATTGTGATGTGGTAAGCACTGGTCTCATGGTGACATGACTA
-GAAACACACATTCTCAGAATTTATACAAAGGATACCTGAATGGATTTCGAAATATTACAATTTGGAGGCAAAGCAAAGCT
-GGAAATGCCAAGGGAAACTCATTAATTGATGTCCTATTGCCTTAAAAAATCTATTCAATTCCTTTTATGAAATGTGTTTT
-CAATTAATCTAATTGTCTTGGAGTCCTTCAGCTGACTGATTTTTCAACTGGTTTGGAGGAGGTTTTTTGGACATTTTGGT
-GGAATATAAGGAAACAGAGTTTGTCTCTTTGACTACCTTCATCACAGAGTAAAAGCTACATACTTACCTGAAGCCACAAC
-TCCACGTGACTTACTATTTCAGTTGACCTAGCCCTTGAGCTTCTGAGGAAAGCAGATGTTGGGCTCAGTGGGTGGCTCCT
-TCAATAAACATGAAGAATGGCTTCAAAAAAAGCTACGGATAAACTATGAGTGGTTGGGGCTCTATACCAATGGCTGGGGA
-GGGTGTGAGGAGAAGAGAAACATAGCAGTGACTGCTAGCCCTGTGAGATCTTTTGCACCCAAGAAGTCCACTTAATTTAT
-CAGGGAGGTCTTAGGAAAATTTAGCTGCCTCAGAAAGCCTGAAAGAAGACAGGTAGAGCACTTGAAAAAAAAAAAAAAAA
-AAAACAAGAAAATGTCTAGAAGTATCTGCATCATCAGTAATGTGAGCAAAGGAACATTTTGAATACTGAGTTAGCAAGTC
-TTGCTCTAGCGCTGAGGAGCCTTAGGTTTTAGGGGATTGCATAAGCAGAAATTGCCTCTTAAACTACAAGATTCTCTTTT
-CCTTTTTTTGCTTTGGTAGAAGATCTTTGTTGTTTTGCTTGCCACTGTCCACTCTACCAACTTTTGTTAATCATACTCCA
-CTCTTCCTTTAGGAAATACTCCCTTTCCAGCTCTCAGCCCATGTGAAGATGGGCTGACTGGCCTGGCGTGGGCTGACTGA
-GTACATGACCCAGGCCTGGCAAACTAGATCATTCCATCATCTAGACCACTCTGATTGGTTCAGACATGGTCACATGATGT
-AAACCTAGACAACCCCAGACAATGAGCATGAGTCTGAAGACTTTTGATGGCACCATTTGAGAAAAGGATGCTCTTTTTGT
-TGGTGTAAATAAACTGGTGGATGTAGCCTTATAACTGTAGGGAGACCTCCCTGTGAGAAAAGCTTTACCTGAGAATGAAG
-CTAACATGAAGGAAAGATGAACAAATAAATGAAAAAAGAGAGATGAAAACAGAGACAGAGATAGTCCTTTAAATGCCATA
-TGAGCCCTGGATCCAGCCATACCTGAAGTCAGAACTACTCCCTGGACTTAGTTACATGAACCAATGGATGTTCATTAAGG
-CTTAGATCAGTTTGAACTGACTTTCTGTCACTCACAATCCAAGGCACCATGACGAATGCTTTAATTGTTCTTTTTCCACA
-TTAACACAGTGCTAATTAGAGAGCATAGATCTTTATTTTCTTCCTTTTTCTACAACCCCCACCTCCACCACCCAGAAGTC
-TTCTGATGCCTGGTTTTATCCTGTATTCATTCAGCAGACATTTATAGAGCACGCACCATATGCCAAGCATTGTCCACAAC
-AACAGTTTTAGAAAACTAATATGGCATAGACCTTGCCATTAAAAAATTCAGTCAATACTGCTTTCCTAAAATGCATAAAA
-GATCACAAGTTGGTCATTTTGTTTTCTCCAAATTTTCAGCTTTCAAAAAAAAATTTAACTCTCAATTTCAAAATGTTTGT
-AACTGTTACCCATAAATTTACTTTATTGCATATGAATAGTTTAATTTTATAATAGCATCAATTTTCACCAAATTTCTTCA
-TGTTTTTAATGTTGTTATCACATCTTCACCTTAGGAAACTTATTTAAGCTCTCTGAGCCTTGGTTTTCTCATCTGTAAAA
-TAAACGGGTAGAGGGTACTGATATGCCTGGTATCTTCTCAACCTGAAATTCTGACAGTTTGCTCACCTATGTTGACTCCT
-TTCTTCCTTTGAAACAATTTTTTCCTCTGCCCTATAGCAACTTCTATAACACATATCCCCCCCGCCCCCCAAACCCCAGG
-GAATTAAATGCATTTCTCAGAATTCAGGAAGACTGCCCTGCTTTCATTCCTAATGCCTGTAACCTGTTCTCTATGAAGCA
-GCCAAACCGATCATTCCCAACTATATATGAAACCAAACTCCACATTTTCCACTCCTATTTAACATCCAGTGGCATCCTAT
-CACCCTTGCAATAAAATCCAAACTCCTTATCTGATCCCTGTTGATATAGTTTGAATGTGTGTCCCTGCCCAAATCTCATT
-TTGAAATGTCATCCCCAGTGCTGGAGGTGGGGCCTGGTGGGAGGTGATGGGCTCAAGGGGGAGGATTTCTCATGAATAGT
-TTGACACCATCCCCTTGGTGCTGTCCTTGCAGTAGTGAGTGAGTTCCCATGAGATCTGTTCATTTACAAGTGTGTGGCAC
-CTTTCCCCTCTCTCTCTTGCTCTTGCTTTTGCCATGTGACATGCAAGCGCCTGCTTGGCCTTCTGTCATGATTGCAAGTT
-TCCAGAGGCCTCCCCAGAAGCAGATGCCAGTGTTATGCTTCCGCAAGCCAATGAAGCCTCTTTTTTAATAAATTACCCAG
-TCTCGGGTATTTCTTTATAGCAACACAAGAACAGACTAATACACCTGCCTTTCTCTTCCTCTCTCATCTTACTTCCTCTT
-CTCCCTCTTGCTCAATATATTCCAGCCACTCTGCCTTGAATTTGCCAATCTTGTTTCCCTTTCAGAGACTTTGGTCTTGC
-TGCTCCCTCTTTCCAGAATACTTTCTTCCCAGATCTTGACAAGGTTTTCTTCCACACTTCACTCAGGTTGCCCATTCAAA
-GATATTTCCTGACTCTACCCGCCATCTAAAATAACATCTTACTCCCACTCTTTTCCATACTTTGTTTTATTTTCTTCTCA
-GCTCTTATCACTTATTGAAATTATAATGTATCATGTTATAATGATTCTATCTTATATAATTAACATTTAATTTAATATAA
-TTTAATGTAAATTACATTAGCATAGAGAGTAGCAAATAGTAGAGGCTCAGCTGGCTTTGTGGAATGAATAATTTTACTCT
-AATTCTAATAATAGCCATCTGTTTAGCTTTGAGGTATTTATGACAAAAACCCACCTTAATCACAAGCCCTGCTTTTAACA
-TCTTTTGTTCGAATATATGGACAGTTTTTTTATCCAAGTGGATTTTAAGAAACTTGAAGATCCTACAAACAGACATCCCT
-TCTTTTGTGAGTTCTCACAGACTGCCATTAGCTAGTAGAATTGTAATTATATTTTCAGAAGGAACTGTATACTCTACAGA
-TTGAGAAAGGTTTTTCTTGCATTCTTAAAAGATTCAGTTAGGAAATGGCAGAATTGGTTTCTAAGACAACCTGTAATGGG
-TAGCATCTAAAACTTGGTTCACCAGGTGGAATCACAGGCAAGTGCTCAGAAATCGTGACATTAGACCCAGAGTTTAAACC
-AGAATGATGTGTTCTACTGATGAGGTCTTTCTGCTTTTTATCAAACTCATCCTATTTGGCCATTTGATTCTAGAAATATG
-GTCCAGGCAAAGGTCACAGTAAGCCGTACAAAGTGTTCCCAGTTCATTCAGAAAGAAGCTCATGGAAACTATCTCAGAGT
-CTTTAAGTGCCTATGCCCCAGGTTAGGAGATCAAGGACAAGAAATCTGGGTGTAACTCCTGGTGAACAGAATAAGGCTCA
-GAAGAGGAAAGGTCAAGAATCTCCCTCATATACATGTTTACTCAATGGTAACAAGAATGCACCAGATTTTTCACAACAGT
-ACTATTTGTAATAGCCAAAAATGGTGAGAATCCCCATGTTCATCAACAGTAGAATGGATAAATTATGTTGGAATTCATGC
-ATAGATTAGTGTACAAAAAATGAGAATGGATGGTTTACAACTGCATTGAATGATACAGATACATATTGTTGAGAGAAAGA
-AGACAGTCAACCAAACACAAAAGAGTACATACTAAATAATTCAGTCTAATGTTCAAAAAAACAAACAGACTTAATTCATG
-GTGTGAAAAATCAGGATTGTGGTTACCCTTAGGGAGTTAGTGACTAGAAAAGAACATGAAAGAGGCATCTGGGGTACTGG
-TAATGATCTAGTTCTATATTCGGGTCCTGGTTACACAGATGTGTTAACTACCAAAATTCATTCAGTTGTGCACTTATAAT
-ATGTGCATTTTTCTGTATTTATTTCATATTTCAATAAAAAGTTTACTAAAAAAATTTCCTCATGTGTTTTAGAAATTTTA
-AGCCAAGAAAATTAAGAGAGCCCTCTTTTGCAAGCACTCACAGATTGATATACCAACTTTCAAACTCATAAGAAGCATGT
-GTTGAAAAGTCGTTGACTCTTTAGCTGAACCTCACAAAAAGAACTCATTTGATTCTGAAGATGTCACACACCCTGAGTTT
-GTGAAAAGAGAAGGTTTGGCTTTCAGGATCCCAGAGCATATATTTTCCAAAATCTCACACTTTCCCTCTTGGTCATGATC
-ATTCACCAAAACACACACACACACACACACACACACACACGCACACACACACGTGTGTGTGTATGTATGTGTGTGTGTGC
-ATAACATACATATACATACATATATGTATATATATATAATTATACAATATATAATTTAAGCAATTACTGTCTTGTGTGCT
-GTATTCCAAGCTTTTCCTACATTATTAATAAAAAATTGTCCTCCATCTTCTAGAAATTTTCAGTCTACCTGAATGTTTAT
-CATATGTATAATTGAACATTTCCCTAAAGCATAAAGACTCAATCAATGGGCTTCTACTGCTCACTGAGATAATCACCTTT
-AAAAAGACAAATGTTTTTTCTGCTAGATCTCTTTATCTTCACTGTGGGTTCCTCTTATTTTATTTCTACATCAATGTTCA
-TATTTAACTTATTATTTTATCTTATTTTTAAATTTCTTTTATGTTGAGCCTTGATGAAAGCCATAGGTTCTCTCATATAA
-TTGTATGTGTATGTATGTATATGTACATAATATATACATATATGTATATGTATGTGTATGTACATAATATATACGTATAT
-GTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTACATAA
-TATATACGTATATGTATGTGTATGTACATAATATATACGTATATGTATGTGTATGTGTATTACATAATATATACATATAT
-GTATATATTATGTATATGTACATAATATATACATATATGTATATGCATGTATATGTATGTTATACACACACTAATTCCCC
-TACATCTCACCTGTATAAGCCATTTTTTTAGTTGCTATAAAGGAATATCTGAGGATGGATAATTTACTTTTTTAAAAAAA
-GAGGTTTAATTGGCTCACAGTTCTGCAGGCTCTGCAGGAGGCATGGTGCTGGCACCTGTTTGGCTTCTGGCGGCAGTTTC
-AGGAAGCTTAAAATCATGGTGGTGGGAAAAAAGTCCTGGTGGAAGGTGAAGGGGGGCTGATGTATCCTGTGGTGAGAATG
-GGTACAAGAGAGTAGGAGAAGGGAGAGATCCCGGACTTCTAAGGAAACACATCTTGTGTGAACTGAGCAAGAACTCACTT
-ATCACCAAGGGGATGGTGCTATACCATGAGGGATCCGCCCCCACGATCCAATCACCTCCCGCCAGTCCCCACTTCCAACA
-TTGAGTATTACATTTCAACGTGAGATTTGGAGGGGACAAACATCCAAACTATATCATGACCCTTCCATCTACCACCTTTT
-CTACCATCACCACCACCAGAACCCTGAACCCACATGCTATAACTCTGAATTTTTTCCCCACCACCACTATACTTTTTGGC
-AATTTTAATTTGATTTGATTGATAGGAAAAGATTCAGAGATGACAAACTCGGAAGGAAATGGCTATAGGCTTCATTCTAC
-CTACAGATAAATTTTGTTTGGTCTTCACAAGGTATTTGTTAAATTTCTGAATGTGAATGTCTTTAGACTGGGCAAATGGT
-CTCCAGTTAACTGTGGTTCCCCAGCACTTTTTGCTATTTAACTCCCAACATACTACACTTAGGTTTCCCAAAATCTCATA
-CCTTCCCTTTCTTATATTTTCTGCCAAGAATATAAGACATTTTGAGTTTTCCATCTTTGTTGTTGTTGTTTTTACTTTTT
-TATTTCAATAGGTTTTTGGGAAACAGGTGGTGTTTGGTTACATGAATAAGTTCTTCAGTGTTGATTTCTGAGATTTTGGT
-GCACCCATTACCCAAGCAGTGTATGCTGCAACCGATGTGTAGTCTTTTATCCCTCACCCCCCGCTCAACCTTCCCCCTCC
-CCAAGTCCCCAAAGTCTATTGTATCATTCTTATGCCTTCACATCCTCATAGCTTAGTTCTCACTTATGAGTGAGAACATA
-CAATGTTTGGTTTTCCATTCCTAAATTAGTTCCCTTGAAGTAATGGTTTGCAATTCCATTCAGGTTGCTACAAATGTCAT
-TATTTCTTTCCTTTTTATGGCTGAGTAGTAGTAGTCCATGGTATATATACATACATACATAGACACACACACACACACAC
-ACACACACAAACACACACATATATATACACATTTTCTTTATCCACTCGATGATTGATGAGCATGTGGGCTGGTTCTATAT
-TTTTGCAATTGTGAATTGTGCTGCCATAAACATGCATGTGCAAGTATCTTTCTTGTATAATGGCTTCTTTTCCTCTGGGT
-AGATACCCAGGAGTTTTCCACCTTTGAATTAATCCTTAGGAATCAAAAAACATTGCCCTTCCCCACTTGCCTACTGAAGG
-TCAAACAAGCCTCTTCTGGGGAGCAAAAGTCAAATGGAGAATATACATGTTTGTGTGACTGTTGTCCCCATGGTTTAGTG
-CTTCCAAGGTACCAGAGTTGATTGGTTCATTGAGGGGTATGTATGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT
-GACAGAGAGAGAGAGAGAGAGAGAGAGAGAGAAAGCTAGATCTCAACCCTACTAGGGAAAGGATCAGATATGCTTACAAT
-GCTCCACCCCTGTAACTAAAATTGTCTTTGCATAAAAAGTCACAATTTAGAACTCCAAACTACTCATACCACAACATACA
-GAAGATTTACTCACCAAAAATCTCATGATACTTAAGAAAATATTATCTCTAAACATGAGCCAAGTTGGTGATGAAAAAGA
-AAAAAAAAACACAAAAAAACACAAAAAAACAAAAAACTCCCTGCTAAAAATCCAAACACTTTTGAGATTAGCAAGCGCCT
-TTAGAGTAGACCACCAGCATTGCCTTTATGGAAAACTCCTGGAAATGAAAACAACAGTCCCTTCATGAGATAATTAGGTC
-CTCCTTCCTCAACTCAATCTGAAAATATTCATTTAGAGACCAGACAGCCTGGTATCAGAAATTAAACCCCTGATTTCTGT
-GGCGTCTGATGGTTCAGAGTTCATGATTCTTGGTTAGCTGCATCAGTAACTGCTGTATGGACCTGTATAAAACCACTTGC
-CTACTCTAAGCCTTGGTCTTTTCATCTGTAAAAGGTTTGCAAACCAACTGATTCTATTTCTAAAAGTTACTTTTGGTTCT
-AAAATCCCATATTACAAAATGTGATATTCTATTTCTTAACCTGGGTAGTGATTGCACAAGTATTTGCTTTATAATTATTC
-TTTAAACATATATGTTTTATACAGCCTTCTAAATAAGTAATGTTTGACAATGTGTTGAAAGGGAAAAGCATTCTATCAGA
-AGAAGCCAGTCTAGTACCATTCTTGAATTCATAAAAGTAGGTGTGAAAATTAAATGTCAGAGGCAAAAAGCCAAGAGCAG
-ATTGAAGCTTGTAAAACTCCTGAGGCTTCAAACCATTTCAGTGATAAGCTAGAACCAAAGAAAGTAGAATGAATGGGAAC
-TTGCAGGGCAAGAAGGACTATTATAGGCTCATACAAATCCCCACAATGGTCCTAGGAGGAAATTGAAATCTAAAGGCTGT
-TACTTAATGGCCAAATTCTTAGCGAAATGTGACCATGGACATAGGAGACACTTTCTTCTGGTTTACAATAAGGAGCATCT
-TAACATTCTCAAAATGACTTGATTGTAAAACTTTTTCCTTCATTGCATTTATTTCTTTTGCCAAGCACCGTGCTAGGCCA
-CAGCAATATAGAGAAAACTAAAGTATGACTGCTTTCAAGGAACTTGCAGACTTAGAAGCCTCTATGTCATTTAGAAAAAA
-TTTCAAGCTTATTGCTTCTCCTGAGACCTCTGATCTCTTCTAAAAACATCCTACTCCCCCACTGCTGGACTGGCTCTCTG
-ATGTGCTTCAGAAAGCTCCCGCCTCAGGCCAGGCATGGTGGCTAACACCTGTAATCCCAGCACTTTGGGAGGCCAAGGGG
-GGCAGATCACGAAGTCAGGAGACTGAGACCATCCTGGCCAACACGGTGAAACCCCATGTCTACCAAAAATACAAAAAATT
-AGCTGAGCATGGTGGCATGTGCCTGTAATCCCATACTCAGGAGGCTGAGGCAGGAGAATTGCTTGAACCAGGGAGTTGGA
-GGTTGCAGCCGAGATCACGCCACTGCACTCCAGCCTGGCAACTGAACAAGACTCTATTTCAAAAAGAAAGAAAGAAGGAA
-AGAAAGGAAGAAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGA
-AAGCTCCCACCTTAGGGCCCTTGTACTTGCTATATCCTCTGCCACACAGTCTCTTCTCCCACCTTTACTTCTTTACTTGG
-CCCACTCCTTCTCACCATTCAGACCTCAACTTAAATGTCAGAGATGATTTTCTTGACTTCCCAGTTAAAAAAAATTTCCT
-CCTCCCCCACCTCAGTCATTCTCTACTTCATTTCTCAAAGTAATATTCTTCCAAATACTCCATATTTGAAAGTATCTTTT
-GCCGTAGATGTTTTTTAAAATGTATTTCTAGTCTTTTTTCTCTCAATATGAAGAACTTCTAGAAGACCAAAGGCAATGCT
-TTGTCCACTGCTACATCCCAGGGCTCATATCAGTGCCTGGCTCATAGTAGTTGCACACTAAATATTTTTAAATTTTATTA
-TTATTTATAAGTGAGTGAATAATATGAGGCAAACTCAAAAAAAGTTTTCCAAATGACTTTTAAGGTTCTAGTTAGTCTTC
-AGATTTATGTGGTCCTAAGTAGTGTCAAAAGATAAAAGTTTCAGGGAGCTGGGAGGTAAGAAAGAAGAGATGAATCCTGA
-TAGCATTCGTGCCTTCTTTGATGGTTGGGATCATAGAGGGATTCACAGAAGGTGTCATTAGTGGGAGTAGGAAAGATGCA
-TATAGTTATTCAATATACAGAAAGAGAGGAAGGCATTCCAGGTCAAGTGAACAACATAAGCAAAGGCACAAAGAGATAAG
-AATGCACAAAAAGTTGGTAGAACAGAAGACAAATGGAAGGGTAGCGTAATTTATGCAATGGTCATGAAAAGCTTTGGACT
-TTATTCTAAAGAAGACAAAGATTCGAAAAGTAAACCAGCCTCACTCATCTCATAGAACAATTAGACTGACAGCAGTGTGA
-GGAATGGGTGTGTCCATGAACACTTTGAAATTTTGGCCAAAATTGTACATGTATTTGTGAGCGTGTGATATTTGGGCATT
-TTACTGGGGAGAGAGAACCTATGGCTTTCATCAATGCTCAACATAAAAGAAATTTAAAAATAAGATAAAATAATAAGTTA
-AATATGAACATTGATGTAGAAATAAAATAAGAGGAACCCACAGTGAAGATAAAGAGATCTAGCAGAAAAACATTTGTCTT
-TTTAAAGGTGATTATCTCAGTGAGCAGTAGAAGCCCATTGATTGAGTCTTTATGCTTTAGGGAAATGTTCAATTATACAT
-ATGATAAACATTCAGGTAGACTGAAAATTTCTAGAAGATGGACAATTTTTTATTAATAATGTGGGAAAAGCTTGGAATAC
-AGCACACAAGACAGTAATTGCTTAAAGACAGGAAAGATAGGCAAATTCAGGTCCTAATGAGCTAAGAACGGATAGAAAAA
-GAGAAAAGTAGAAACCATACTTAGGTATGTTCTATGTGATTCCCACCTCTGCCTCAATAATCCATTCTTTCGTGGTGGGT
-TTCTCTTTCCTGCTAAGCAGTTCCTCCCACACCCCTATAGATGAACAGTCAATTCTTTGGTCATACTTGAGCCAGATCTC
-TGGTGATATAATTGCCAAAATGGCTTGACATTTAAAATATCAGAGATGACCCAGCTGCCCTAAGTGATAATAATGCTATT
-ATAGTGGGGGTAGAAACAGCCCCAAAGGAGAGAAGAGTGGGATACTAATGATAAAGTTCAGAAAAATAAGAATTAAGATG
-AGATAATGAACAACAGGGAGACTCGATCCAAGTCAAGTCAATGGTCATCTCACCATGGGGACCGATTGGAGAAAAACTGA
-AGTTAAATAAGGACGCTGGCAAGAGAAGACAACAGGCAGTGGAGTCAGATGGCCTCATCCTTGTAGAAGCTATGCACACC
-CATTTGAAGAGGAGGTAGTTGGATTAAAGGAATTGGCTCTAATTCAGTAGGAAAAAGTTGCAGGAGCCAGGAGGCTGAAA
-GACGCCTGCCATCTGGAGAAACTGGGGAAGGAGAATTGGAAGTCAGGCAGATCAGGGGTGGGGAAACGGTAAGGAAGAAA
-GGCTATTTGGCAGGAATACTTTGGGCGGGGTCAGCTTCTCCCACGATGCTCTTAATTCAGGGATGTAACTTGCACACTCT
-TCAGTAGAAGCATCAGCAATAAAAGAAAATAATTTTATTTCCAAATCCTAATAAATCTATATTTTGAACTGATATTTAGG
-AAAACTGTCTTTTAATATGTAAATGTGTTTCACATGCAATCCGTTTGGAAAAACACCAAATCTCCAAAATCTTTAACAGC
-AATTCTACAAAGTATAATATATTTATAATTTTTTGGTTGGGGTAAAATAAATTATACCAGATTTTTCAAGATATAGAATT
-TCTTATAGGAGAAGCAGAATGCACTAGAAGTCATTGAAACACTGGCAGGACTAAGTAGAAAAAGTTAAGGTTAGTAATGG
-TTACAGGTACAAGCTCTTAAATGAGAACACCCAAGATCACATCCTGGCTCCACTAGTTTACTAATTGTGTGATCTCTGGC
-AAGTTCATAAACTCTATAAACTTCAATTTCCTCCACCATACAATGGGATTAGTGCCCATGCAAGGAGTTATTTTTTTTTT
-AACTTTTATTTTAGATTCAGGGAGAACATGGGCAGGTTTGTTACAAAGGTATATTGCGTGACATTGAGGTTTGGAGTAAA
-ATTGAACCAGTCACCCAGGTAGTGAGCATAGTAACTGATAGGTAGTTTTTCAACCCCTGCCCCCTCCCTACATTTCCCCT
-CTTATATTCTCCAGTGTCTGTTGTTCCCATCTTTATACCCACGTGTACCCAAAGTTTAGCTCACACTTACAAGTGAGAAC
-ATGTGGGATTTGGTTTTCCATTTCTGCATTAATTCACTTAGGGCAATGGTCTCCAGCTGCGTCCATGTCACCTCAAAGGC
-CATGATTTTATTCTTTTTTGTGGCAGCATAGTATTCCATCATATATATGTACCACAGTTTCTTTATCCAATCTATCATTG
-ATGGACACCTAGATTGATTCTGTCTTTGCTACTGTGAATAGTGCTGCAATAAACATACAGGTGCACGTTTTTGGTAGAAT
-GATTTATTTTCTTTGGGGCATATACCCAGTAATGGGATTGCTTGGTTAAGTGGTAGTTAAACTGTTAGTTCTTTGAGAGC
-TCTCAAAGAGTTATTATAAGGATTAAAATTAAAAATAATAATGCTTGTAAATTATTTAACACAGTGCCTCATATATTTTG
-GGAGCTAAATAATTATTATCTGTCATTTCCATCATCATTATTATCAGTTAATTTGAGAGCCTTCCAGAATTATTTGCGGA
-CAGTACTGATCAAGATTGTGGTTTTTCATCTGCTCCTGACTTGCTATATAAACTTCACCAAATGATTCAGCTACAAAAGA
-GGAACAGGGTCTATGTCCATGTTGAATCTCAAGAATTTAGATCATAGACATTATTGTTATTATTAACACTCTACTTGCAA
-ATAGGAGCGTTGGTCTCTTGTGTCAACTCTACAACAAACTCACCACAGGGCTAGACAAGCCACACATCTGTTCTAGGTCT
-CTGTTTCTTCATCAGCCAAGATGGATAAATTACACAATCTTCAACGTTCATCTGAGTTCTAACATTCTATGATTCTGCAA
-CTGCTGTTTCAAATGTGGCACTTGTGAGTTATAAACAACATAACTTCCCTTCACCTGCATTGGACTACACCTATGGGGAC
-TGAAAGTGCAGTATGTGGTGGGTATGTGACCTTCCACAGGTAAGAGATGAGTTGCCCTTCTCTGCCTGCATCCTCACAAG
-AGCCATTTTGTTCTGCTCCTGTCTGACTGGCTCTCCAGTAATTTTCTGCAGCAAGCTCTATCCTTATCCCAGCCAGTGAG
-AGGAAAATGAATTCACCCAGCAGTCCTATGCATCCCTTCAGATGTTGCAGGGAGAAAGCACGCCAGGCATTTCACTGTTA
-ATTATCAGCAGCCTGGCTGCTATGGCACCTTGCTGTGCCAATTTGAGAGATGAGATTCTTTACACTGCTTATTAGGCTCA
-GCTAAATAAATATTACCCAGCATTAATGTTGTCAGAGATACAGTCTGAATTCAGCTCCCTTGAGTGGCTGTTGGTACCCA
-AGCTTTTCACCATCAATTTTTCTTCCTGTACCTCCTTCCCTTACCAATCCACCACTAATCTCTTTCTCTCCTCCCTGGAT
-GTTCAGCTGGATTCTGACATCAGAGGACTGAAATAATATCACCGATTTAGCTCCTTTGCTTAAGGTTATCAAATACTTGT
-GCTGCTACTAGATTTAAGGGCCCCATTATTAGTTACTTTGTAGTCTTGTCGTAACAGATTTCAAATTTCTGAAGCATGTA
-TTTTGAGTTAGAGCCCGCCCTCTCCCCCAGCAAAGTGAGTTTTGAAAGACTGAAGCCCTCTGGCTACAGCAATTGGTTTA
-AAGGTGAACCCTAATAAGGCCAATCATGCCCCCAAAAGAATGAATTTCAGGATTTATTTTAGCTATTTAAAAAACAGAAG
-TTTTCTTCTTGGCTGGATGTTGAATCTAGAAAATATAGCCCCAAGGAACCACTGTTAGCTATTTTGCAACCATGAAGGTA
-AATGCTACCCATAATGGAGACGACATATAGTAAGTGGTGGAAAGAATTAGAGAAAAGAAACCCACACCTGTTAAGAGCCT
-AGATCAAGCTTTACCTAAAGCCAAATCAATCTTTGGACATTTCAGTTTGAATCCTTATGGCTCTCATATTATTTAATTCT
-GAGTTGGAAATTCTAATACTTTCAGCTACATAGATGTGTTTGTTACAAGGTCTCCTGGATGTGTCTATTTGGAGCAAGTG
-TAGGTGAAGCCCTGCCCACATCACTTCAGATCTTACCACTATAATGCTCTCCTACCTGAATTCCCACTCCCGAGGGCTAA
-CTGTAGTGATTTTGCTTCAGCACAAGATAGTACAGAAGTGGTGGGTAATAAAACACCACACCGAGGCAGCCCTTAATAAA
-TGATTGGCAGCAGTTGGTGAGTAAATATGCCAGCTTCTTTGCTCATTTTGTGTAATGCTGAGACACATGTTCTATACAAG
-CTCTCAGAGTTCCTCAGGGGGATTGACCCTAGTTTGTTTGATAACAACCCTTCATTGGCTGCCTTCTTTTCTCTGTCCCA
-TTTCTCTATTGGTTTGTTGGTATCACCTTCTGAGTCACTTGTACTTGGGTCCACAATGAATTTATACAAAGTAACATCTG
-CTTATACCTTTTAAAATGCACCCTACAGGGAGTCACTTCCAAGATGGTTGAATAGGAAGAGCTCCAGTCTGCAGCTCCCA
-GCGAGATCGACACAGAAGATGGGTGATTTCTGCATTTCCAACTGAGGTACTTGGTTCATCTCAATGGGACTGGTTGGACA
-GTGGATGCAGCCCACAGAGGGTGCGCTGAGCAGGGTGGGGCATCGCCTCACCTGGGAAGCACAAGGGCCAGGAGATTTTC
-CCTTTCCTAGCTAAGGGAAGCCATGACAGGCTGTAGTTGGAGAAATGGTACACTCCTGACCAAATACTGTGCTTTTTCCA
-CAGTCTTAGCAACTGGCAGACCAGGAGATACCCTCCCGTGCCTGGCTCGGCAGGTCCCATGCCAACAGAGCCTTGCTCAC
-TGCTCATGCCGAAGTCCAAGATTGACCTGCAATGCTGCAGCTTGATGGGGGGAGTGGCATCTGCCATTGCAGAGGCTTGA
-GTAGCTCACAGTGTAAACAAAGAGCCCAGGAAGCATGAACTGAGCAGAGCCCACCAAAGCTCAGCAAGGCCTACTGCCTC
-TACAGATTCCATCTCTGGGGGCAGGACATAGTAGAACAAAAAGCAGCAGACAGCTTCTGCAGACTTAAACATCCCTGTCT
-GACAGCTCTGAAGAGAAGAGTGGTTCTCTCAACATGGCGTTCGAGCTCCAAGAACAGACAGACTGCCTCCTCAAGTGTGT
-CCCTGACCCCCGTGTAGCCTGACTGGGAACACCTCCCAGTAGGGGCCAACAGACACCTCAAAAAGGCAGGTACCCCTCTG
-AGATGAAGCTTTCAGACGAAGGATCAGGCAGTACTATTTGCTGTTCTGCAGCCTCCGCTGGTGATACTCAGGCAAACAGG
-GTCTGGAGTGGACCTCCAGCAAACTCCAACAGACCTGCAGCTGAGGGGTCTGACTGTCAGAAGGAAAACTAACAAACAGA
-AAGGAATAGCATCAACATCAACAAAAAGGACATCCACACCAAAACTCCATCTGTAGGTCACCAACATCAAAGACCAAAGG
-TAGATAAAATCACAAAGATGGGGAGACACCAGAACAGAAAAGCTGAAAATTCCAAAACACAGAGTGCCTCTTCTCCAAAG
-GATCGCAGCTCCTCGCCATCAAGGGAACAAAACTGGATGGAGAATGAGTTTGACATGTTGATGGAAGCAGGCTTCAGAAG
-GTCGGTAATAACAAACTTCTCCAAGCTAAAGGAGCATGTTCTAACCCACCACAAAGAAGCTAAAAACTTTGAAAAAAGTT
-AGACAAATGGCTAACTGAAATAAACAGTGTAGAGAAGACCTTAAATGACCTGATGGAGCTGAAAACCATGGCACAAGAAC
-TTTGTAATGCATGCACAAGCTTCAATAGCCAATTCAATCAAATAGAAGAAAGGATATCATAATTGAAGATCAAATTAATG
-AAATAAAGCAAGTAGACAACATTAGAGAAAAAAGAGTGAAAAGAAACAAAAAAAGCCTCCAAGAAATATGGGACTATGTG
-AAAAGACCAAATATACGTTTGACTGGTGTACCGGAAAGTGATGGGGAGAATGAAACCAAGCTAGAAAACCCTCTTCAGGA
-TATTATCCAGGAGAACTTCCCCCTAACCTAGCAAGGCAGGCCAACATTCACATTCAGGAAATACAGAGAACACCACAAAG
-ATACTCCTAGAGAAGAGCAACCTCAAGACACATAATTGTCAGATTCTCCAAGGTTGAAATAAAGGAAAAAATGTTAAGGG
-TGGCCAGAGAGAAAGGTCAGGTTACCCACAAAGGGAAGCCCATCAGACTAACAGCGGATCTCTCGGCAGAAACCCTACAA
-GCCAGAATAGAGTACGGGCCAATATTCAACATTCTTAAAGAAAATAATTTTCAACCCAGAATCCCATATCCAGCCAAACT
-AAGCTTCATAAGTGAAAGAGAAATAAAATCCTTCACAGGCAAGCAAATGTTGAGAGATTTTGTCACACCAGGCCTGCCTT
-AAAAGAGCTCCTAAAGGAAGCACTAAACATGGAATGGAACAACAGGTACCAGCCACTGCAAAAACACGCCAAATGGTAAA
-GACCATTGATGCTAGGAAGAAACTGCATCAATTAACTAGCAAAATAACCAGCTAATGTAACATTATAATGACAGGATCAA
-ATTCAAACATAACAATATTAACCTTAAATGTAAATGGGCTAAATGCCCCATTTAAAAGACACAGACTGGTAAACTGGATA
-AAGAGTCAAGACATCAGTGTGCTGTATTCAGGAGACCCATCTCACGTGCAAAGACACATATAGTCTCAAAATAAAGGGAT
-GGAGGAAGATCTACCAAGCAAAAGCAAAGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGTAGGGGTTGCTCTGATACA
-ACAGACTTTAAACCAACAAAGATCAAAAGAGACAAAGAAGGCCACTACATAATGGTAAAGGAATCAATTCACAAAGAAGA
-GTTAACTATCCTAAATATATATGCACCCAATACAGGAGCACCCAGATTCATAAAGCAAGTCCTTAGAGACCTACAAAGAG
-ACTTAGACTCCCACACAATAATAATGGGAGACTTTAACACCCCACTGTCAATATTAGACAGATCAATGAGACAGAAGGTT
-AATAAGGATATCCAGGACTTGAACTCAGCTCTGGACCAAGCAGACCTAATAGACATCTACAGAACTCTCCACCCCAAATC
-AACAGAATATACATTCTTCTCAGCACCACATCGCACTCATTCTAAAACTGACCACATAGTTGGCAGTAAAACACTCCTCA
-GCAAATGTAAAAGAACAGAAATCACAACAAACTGTCTCTCAGACCACAGTGCAATCAAATTAGAACTCAGGATTAATAAA
-CTCACTCAAAACCACACAACTACACGGAAACTGAACAACCTACTCCTGAATGACTACTGGGTAAATAACGAAATGAAGGC
-AGAAATAAAGATGTTCTTTGAAACCAATGAGAACAAAGACGCAACATAGCAGAATCTCTGGGACACGTTTAAATCAGTGT
-GTACGGGGAAATTTATATCACTAAATGCCCATAAGAGGAAGCAGGGAAGATCTAAAATTGACACCCTAACATCACAATTA
-AAAGAACTAGAGAAGCAAGAGCAAACAAATTCAAAAGCTAGCAGAAGGCAAGAAATGACTAAGATCAGAGCAGAACTGAA
-GGAGATAGAGACACAAAAAACCCTTCAAAAAAATCAATGAATCCAGGAGCTGGTTTTTTGAAAACAAAATAGATAGAGCA
-CTGGCCAGACTAATAAAGAAGAAAAGAGAGAAGAATCAAATAGACACAATAAAAAATGATAAAGGGGATATCATCACCGA
-TCCCACAGAAATACAAACTACCATCAGAGAATGCTATAAACACCTCTATGCAAATAAACTAGAAAATCTAGAAGAAATGG
-ATAAATTCCTGGACACATACACCCGCCCAAGACTGAACCAGGAAGAAGTTGAATCTCTGAAAAGACCAATAGCAGGTTCT
-GAAATTGAGGCAATAATTAATAGCCTACCAACCAAAAAAAGGCCAGGACCAGACGGATTCACAGCCGAATTCTACCAGAG
-GTACAAAGAGGAGCTGGTACCATTCCTTCTGAAACTATTTCAATCAGTAGAAAAAGAGAGAATCCTCCCTAACTCATTTT
-ATGAGGTTAGCATCATCCTGATACCAAAGCCTGGTAGAGACACCACAAAAAAAGAGAATTTTAGGCCAATATCCCTGATG
-AACATTGATGCAAAAATCCTCAATACAATACTGGCAAACAGAATCCAGCACATCAAAAAGTTTATCCACCATGATCAAAT
-CAGCTTCATCCCTGAGATGCAAGGCTGGTTCAACATACACAAATCAATAAACGTAACCCATCACATAAACAGAACCAACA
-ACAAAAACCACATGATTATCTCAATAGATGCAGAAAAGGCCCTTGACAAAATTCAACAGCGCTTCATGGTAAAAACTCTC
-AATAAACTAGATATTGATGGAATATATCTCAAAATAATAAGAGCTATTTATGACAAACCCACAGCCAATATCATACTGAA
-TGGGCAAAAACTGGAAGCATTCCCTTTGAAAACCAGCACAAGACAAGGATGCCCTCTCTCACTACTCCTATTCAACATAG
-TATTGGAAGTTCTCACTAGGGCAATCAGGCAAGAGAAAGAAATAAAGGGTATTCAATTAGGAAAACAGGAAGTCAAATTG
-TTTCTGTTTGCAGATGACATGATTGTATATTTAGAAAACCCTGGCTGGGCACGGTGGCTCATGCCTGTAATCCCAGAACT
-TTGGGAGGCCAAGGCAGGTGGATCACGAGGTCAGGAGATTGAGACCATCCTGGCTAACACGGTGAAACCCCGTCTCTACT
-AAAAATACAAAAAAAATTAGCCAGGCATGGTGGCAGGTGCCTGTAGTCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATG
-GCGTGAACCCGGGAGGCGGAGCTTGCAGTGAGCGGAGATCGCACCACTGCATTCCAGCCTGGGTGACAGAGCGAGACTCC
-TTCTCAAAAAAAAAAAAAAAAAAAAAAGGGAAAAGAAAAGAAAACAAAACTCCATCGTCTCAGCCCAAAATCTCCTTAAG
-CTGATAAGCAACTTCAGTAAAGTCTCAGGATACAAAATCAATGTGCAAAAATCACAAGCATTCCTATACACCAATAACAG
-ACAAACAGAGAGCCAAATCATGAGTGAACTCCCGTTCACAATTACTACAAAGAGAATAAAATACCTAGGAATCCAACTTA
-CAAGGGATGTGAAGGACTTCTTCAAGAAGAACTACAAACCACTGCTCAACGAAATAAAAGAGGACACAAGCAAATGGAAG
-AACACTCCATGCTCATGGATGGGAAGAATCAGTATCGTGAAAATGGCCATACTGCCCAAGGTAATTTATAGATTCAATGC
-TATCCTCATCAAGCTACCACTGACTTTCTCCACAGAAATGGAAAAAAACTACTTTAAGGTTCATATGGAGCCAAAAAAGA
-GCCCACATAGCCAAGACAATCCTAAGCAAAAAGAACAAAGCTGGAGGCATCATGCTACCTGACTTCAAACAATACTACAA
-GGCTACAGTAACCAAAACAGCGTGGTACTGGTACCAAAACAAATATATAGACCAATGGAATAGAACAGAGGCCTCAGAAA
-TAACACCACACATCTAAAACCATCTGATCTTTGACAAATCTGACAAAAACAAGCAATGGGGAAATGATTCCCTATTTAGT
-AAATGGTGCTGGGAAAGCTGGCTAGCCGTACATAGAAAGCTGAAACTGGATCCCTTCCTTACACCATATACAAAAATTAA
-CTCAAGATGGAGTAAAGACTTAAATGTAAGACCTAACACCATAAAAACCCTAGAAGAAAACCTAGGTAATACCATTTAGG
-ACATAGGCATGGGCAAAGACTTCATGACTAAAACACCAAAAGCAATGGCAACAAAAGTCAAAATAGACAAATGGGATCTA
-ATTAAACTAAATAACTTCTGCACAGCAAAAGAAACTATCATCAGGGTGAACAGGCAACCTACAGAATGGGAGAAAATCTT
-TGCAATCTACCCATCTGACAAAGGGCTAATATCCACAATCTACAAAGAACTTAAACAAATTTACCAGAAAAAAATAAACA
-ACCTCATCAAAAAGTGGGCAAAGGATATGAACAGACACTTCTCAAAAGAAGACATCTATGCAGCCAACAGACAGGAAAAA
-ATGCTCATCATCACTGGTCATCAGAGAAATGCAAATCAAAACCATAATGAGATACATCTCATGCCAGTTAGAATGGCGAT
-CATTAAAAAGTCAGGAAACAACAGATGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGAGTGTA
-AATTAGTTCTACCATTGTGGAAGACAGTGTGGCGATTCCTCAAGGATCTAGAACTAGAAATGCCATTTGACCCAGCCATC
-CCATTACTGGGTATATACCCAAAAGATTATAAATCATGCTACTATAAAGACATATGCACACCTATGTTTATTGAGGCACT
-ATTCTCAATAGCAAAGACTTGGAACCAACCCAAATGTCCATCAATGATAGATTGGATTAAGAAAATGTGGCACATATCCA
-CCATGGCATACTATGGAACCATAAAAATGGATGAGTTCGTGTCCTTTGGAGGGACATGGATGAAGATGGAAACCATCATT
-CTCAGCAAACTATCACAAGGACAGAAAACCAAACACCGCATGTTCTCACTCATAGGTGGGAGTTGAACAACGAGAACACA
-TAGACACAGGGCGGGGAACATCACAAACTGGAGCCTGTCGGGGGGTGGGGGGCTGGGGGAGAGATAGCATTAGGAGAAAT
-ACCTAATGTAAATGACGAGTTGATGGGTGCAGCAAACCAACATGGCACATGTATACCTATGTAACAAACGTGCATGTTGT
-GCACATGTACCCTAGAACTTAAAGTATAATAAAAAATAAATTAATTTTAAAAAATGCACCCTACAAGTTGTGGCTTACAT
-GATTTCCACCGTTCCACCCCCAAATAGACTGATGCATACCCAAACCATTTGACATAAACTCAGCCTAGAAAAAAGCTATG
-AATTCAAATCCAAGTAAGCCAAAGTGTTCTTTCCTGTCAGTGCCAGCCAAGCAGAGGGTTATGGACTAGACGGAAGATTT
-TAGGAGAGAAAGGGAAGCAAAAGCATGAACAAGCCAAGGTATGGAGGATGCTCATTCATCCTCAGGCTCCAGAAGTGGCA
-GCGAGCTGTCTGGATACTCCACTGAAAGTCACAGTCAATGAGGTTATTAATCTGGTGGTCCTAAAAGATGAGCAGCACAG
-ACACCTTGAATCTCTGGATACACTTCCCCCTCTGCATAGCCTCTCTCTCAGTTCCTAAACCCTCCATGCTAAGAAAAACA
-TCACCAGGCATGGGGCTTTGCCAGAAACGTTCACTCGAAACAGTACCTGGCAAATGAAAAATGCACTTTTAAATTATGTA
-CTTTCCGACTAGTCTTCCTAATGGTATGTTGACTATTATTTACATGAAAAATGTCAAAATGTGGATTCCTTTGTTTTATT
-TTTATTTGGGGCATTTTAAACAAAACATTCACTTTAATACTCATGGAGAAAGGTCTACTTCTCTTTCATCTTCCTCTCTG
-TCTTCCAACCAAAACTCCTTGCCAAAGAACACGGATGGCCAACAGGACTTGCACTGACCACATCGCACTCCTACTAGAAA
-ATTACGGATGGAGGAACCAGCAATTTCTAGATGAAATGGCCCTATTTCCTCATTTTACCACTAAGGATAAAGAAGGATCA
-TGCCTGTAATCCCAGCACTTTGGGAGGCTGAGGCAGGCGGATCACCTGAGGTTGGGTGTTTGAGACCAGCCTGACCAACA
-TGGAGAAAGCCTGTCTCTACTAAAAATACAAAAAATTAGCCAGGCATGATGGCACATGCCTGTAATCCTAGCTGAGGCTG
-AGGTAGGAGAAGCACTCGATCCCGGGAGGTGGAGATTGCAGTGAGCCATGATCACACCATTGCACTCCAGCATGAACAAC
-AAGAGCGAAACTCCGTCTCAAAAAAAAAAAGAGGGCAAAAAGTCTTCGATGACAAGCCTGGACAGGACTTTAACAGTATA
-TGCTCCAATTTATCCCTGTCACAGATGAGGAAACTGAGGCACAAATCAGTGAAATGCTTTGTTCAAGACTTTACAGCTAG
-TTAGTGACAAAGTCGGGGCCAGAACTAAGGAATCTTGATTCCATGCCCTCTTCATACTATCCTCGTCAATTCTGGTTTAA
-GTTTTTCACTTGATTTGTATGTTTGCTTTATCTTAAGCTCATATTTCAACCCTATAACCTATCTTGCATATGATGTGGGT
-TGTTTATTCTTAGAAAAATCTAAGATTATTCCACTGTATTAGTGGCCTTGCCTAAATAGATGCATTGGGGAGAAATCCTC
-CCACATAATGAATTTTGTCACTGAGACATTGCAAGAAGTAGCCCATAGCCTTTTCTTATCCTTTTAGAAACAGCCTGAAA
-AGTTCGATTATCCTCCAGATTCAACCTTAGTCCATTTGGTTTCATGCTCATTCCTAATCCCAGACCAATTCCTGGCCCTG
-AGCCCAGGTACTGGTATGGCCTGGAAAATGCCAGAAGCCATATGGACTCCCCAGGCTACCTCCTGGATGAGGATGGATGG
-CACACACCGAGGAACCAACTCTTTCCAAGAGATAGAACAGATGGCATTCCAGATATGAATATGTATAATGTAGACTGCTA
-AGTTGTTAAATAAGTATGTATTTTTAGGTGGATTCATGAAAATCAAGAATTTTATAACTAAAATGAAAGCCAAGCAAATG
-AAACCACAAACACCATTGAAAGCTGTGCATTACTCCATGTTTGTTGGTATTGGCCTCCATAGCATGCTCCAACCTCTAGA
-GAAACCACTCGAGAAGAACCAGGAAGAAATAATTCAAAACTGCGGCAAAGGATGTTAACTTCAAGCTTCCATGCTCTAAG
-ACCCTAGGACGTCCATGGATGGCAGAATTAGTATTCAGAAGAGCAAGGAGTGGGCTGGATTTTTCCTTGGCTTTACCACC
-TTTCTCTATGTCCCTTTATTGAAAATTCCACTCTATCACACCCCCAACTCAAATTCCTTATGCTTTAATTTGGCTGCCCC
-AAGAACAAGCCTAAGAGGCATAAGAATAATGCAAGTCATTGAATCAGTAGAATCAGTCAAGAAGATCAGCTTCCACAAGC
-TTCCAGTACAAATAGTACCCTTCAGAAGACTTTAAGCTCTTTGCTCCGTAATAATACTACATTACAGGTATACTTATTTC
-CAGTTTACAGAAAATTTTAACAATCCCATGTGAAAAAATAGAACATGAATTGTTACCCCCATTTTTACAGAGAAGAAAAT
-GAAGTCTTGGAGAGGTTAAACAACCACTCAAGAATGCACCAATGGTAAATGTGCCACTGGGACTTGAAGCTAAGACTCTG
-ATTCTGTCCAGTAATGCATCTGATTTGGCATTCACCAATGAACCTACAGCCAAACGGGCCATCACTGGAGAAGTCCAACT
-GCTACTTGAAAAGCCTAATCCATGGATTAACAGATTCCAATGAGTTAGAACATCAAAGGGTAGAATAGGATATATTTCCA
-CAATCTGGGAACATTCCAAATAGAGAAACTGGATTCTTATTTATCCATTATTGATGCAAGTCCTTAACTCCTTCCTGTAT
-CCATGGGACCTTTTGCAATCCTTCACACTAGAGACAGAATACACTCTCCTGCTCCATTAATGATAGGCAATGGAAAGGTG
-ATCTGCTTCATCCAATGAAATGTTAGCAAGTGTGATGCAAGCAAAGACTAGAAATTGACTTACTTGGTTGTGCTTGTCCT
-CTTGTGCTCCTATTATCTGCCCACAGTAGCTCACTGAACCAAGGGAAATGAGAAACATGTGCATAGATCTAAACTTAACT
-CACTGCTTTGAGACAAGCACATCTGAGCCGAGCCTAGATCATCCAGCATGCAGCCAACTGCTGACACATGAGCAAGAAAG
-AACATATATTGTTATTTGAAGCTATTGAGTTTGGGGCTGACTTGTTTTACAGCAATAGCTGACTAATACACTTGCTATAT
-TTCTTTCATCTTCCTACTTCCACTTCAATGCAAATGGACTCTGCCCCTTGTTATTATTACTGTCTGTTTCTTTCCAGGCA
-GCAAATCACCACCTCTTTTGATGTCCTAAATTATCAGCAGTCTCAATATCAAGATCTACATAGTCATTAATTTACAAAAA
-GCTATTATTAGGAAGTGAGATGGTAGTAAAAATAAGGTAGGTGAAGTTATACCCACAAAATAGAATATCGGGGTGCCAGA
-TCAATATTTAATAAATGGTTGAAAACTTCAAACATTTAAAGATTATTTTGTGGTTAACAAGTTAGAGAAAACACATTGCC
-ATTAGACGACATTTCTTATGTGCTTCTTTACATAGTGACCTGGTGCTTGATGTGCTGTGAAGACAGGATGCTCATCGCCT
-TATAGTTTATCGATAAACACAGGCAATACAGAGGCAGGCAGCTAGTAGAAAATATAGATAGGTGTTGGATAAATTGATAA
-TAAAAGGGTAAGATTAAGTGTTTTGTTTGGTCTTATTTTACCATTTCAGATTTGCTTGATTATTAATTTCCAAAGCCCCA
-GAAAACCCAATTCTCCTGCATTCCTAGAAATCGTGGCAGGTTTCCATCTATAGAAAATTACATGCTTTTCTAGGTGTTTC
-AGAGGTTTAAGTTGCTTAGTTCTTTAAGAAACTGCTCCAAGCTGGGGTGAGGGGAGAAGAGTGTACCAGTATCAACCCAC
-TTACACAAAGAAGGACTTGACTATTCATCAGGTATCTAGGGACAATTTCCTGAAGATGATGGAAAGAAGACAGTGCCTAA
-CACTTGGATGGTAAGCACTTCAACAGTATTTACTAAATTAAAGAAGGGAGGAAAATAGGAACTAGTCCTGCCTTACCCAT
-CTTTCCATTCCTTCCGCTTTGTGTTTTCATCTCAGTTTTGTCAGATCCATTTCTCTGGCCTCTCCAACTCTCAAAGTTCC
-AGCCCTGTGATTCAGCCATCGCAACTCTCCCAAAGTGTTCATTGATCACATTTCCTCCCTAGTCATTGGCACAGTGCTTC
-TTTCATATTTGATTCTTGACACCTGCAGGTTTTCCATTTTGGCTCTCAACTTTTTTTATTATACCCCAGTGGGCTTTGTT
-TTGTACATATCCCCCACCCTGAGTGTAGCCTCAGAAAGGTGGACTTTGGTTCTCAATTATAAGAATATATATATTCTTTC
-TAATAGCATCATGCTGGGCACTGTAGTATCCAATCCTATAGTGCTTACAAGGCACTTTATTCCACACTAACTCATCTGAC
-CCTCACAATGGTGTTCTCAGTTGGATAGGATGACCCTAACTGTTCAAATGGGGACTCAGAGTACAAAGGAGGTCACAGAG
-TTGGTATATAGAGAAACCAAGACACAAACCCAGTTTTCCTGTCTCTAACTCTGGGAATTATTTCTTTGCATCATGCTATT
-TTAAAAAGTACTAGCACTGCTGAAATTCTTGGACTTTCTTTATAATACACAACCTTAGAAGAGAAAGTAAATCATTGCTA
-AGGAAAGGAACTTTTCTTAGCTCAAAAAACAGCCTCAAGAGGACTGAACCTCTTAGAATGCTCGTCTTTGCCCAGATGAT
-CACCAGCCACACTCCAACATATTGATACAGATTTTATGATTTTATAATTTTGGGTTCAGTTGGCAGGACTCACTCTTCCA
-AAAATAGCTTTGGCCTTAATGGGTAGGATGAGCTGCATTACAAAGGCCCTCAACTCCATAAAATTTGGCATCCAGCCAAG
-CCTTCAAAGGTGACTAAAGAAGAAATATCAAGAAAGACCAGAGGTTGGTACTGCCTTGTGAACCTCTCAACATCTATTGG
-AACTTATCAATTTTATAGATATTCACATTCCAAAGCAAGGAGCATTTGAGCTTTTAGAGAGATTAGAAGACCCTAAAAAG
-TGCATCTCGCTCAAAAGGTGTCCAGCTTGTCCAGTGGTCATTGTCCAATCTGATTCCATTTCAAAATCATTTCCATATAA
-CCAGCTTGATGGTGAGATTCTTGAAAAGTTCTAGACCAGGAGGAGGAAATGAGGGTTTGGTTCCTGGCTGTGCCACTAAC
-CGACTGCATGAAGTTAAGCAAATTATGGGGCCTATTCCAACCTCGTTCTTTTTACAGGTCTGACACCTACAACGTGTCAG
-ACACTGGGAATAGAACAGTCCACAAGACAAAGTCCTTGCTCTAAGGGAACTTACCTTCTAGGGAAGATATATGATAAACC
-AATACATAAATATATAATAAGGACATGAAAGCAATAGAGAACAAAAGTGCTGTGAAAAAGATGCTGTTTTGGATAGGATG
-GTCTTTTGAGCAGTGAAATAAAATAAATATCTGAGGGAATAGAGTTCCAGGTGGAGGGGACAGCAGGAAGGCCATGAAGT
-TGGGGTGCACCTGGCATCTTCAAGGAACAGGGAGAAGGCCAGTACTTCTGGAGCAGAGGGAACAGCCGGGAGAATGGAAG
-GCAAGGAGGTGAGCGATAACAGGGGCCCAATCCTGGAGGGTCTTTTAGCTTTGGTAATGACTTTGGATGGGAAGGCAGTG
-GGGGAATCTGAGCAGATGAGGGTATGAACTGACTTAGGTTCCCTGAATGTGACCTTGGCTGCTGTATGAAGGACGGGCAG
-CCATTTCCTCATCTGATAGCAAACTGGTATGGACCAGAGAAACGAGAAGCTTCCCACTGCCACTCTAAGAGCTGAGATTC
-CGAGTCATATGTTTTACTGAACAAATTACTGCCCATCTTGGTTGAAGCCCATCGGGGCCTGAGCTAAGTCTTTGATCCCA
-GAGGCCAAGGCAGCACCATTCCTCGCCATTAGCCCATGGCTAGTGACCCGGGAGGTACAAAGTCAATCCTAGCTACAGCA
-GGAACTCCTGCAGAACCTGTGACCCTCATAGCCAGGGGGTCTCAAACCAGCGGGATACATCTCAGAGTGGCTTTGCTGCG
-ACGTACCTTTGGGTAGTTTGAGACTGAAATGACTCTAGTCACTACTTTTCATTTCCATCCTTTCTTCCCTAAAGGTCAAC
-TGGAAAGGCAGCCGGCTGAGAGAACTCGATCTCTGTCCAGCAGAGATTATTTTGTGGACGCTCAAGGTTCTGAGAGCTTA
-CTTCCTTTTTCTGGGTCACCTGCTTGGTGTGAATTCATCCAAAATCATCCGTTTATTTTTAGAGCTATAAATTATATCTG
-CATTTCTACTCTCCTGCAGAAATTCAAGCTCAGAGCTTGGGCAGGGGCCCTGTGTTTGAGGCACAGAGACTGGCAAAGCG
-TCTTGCCTCCCACCTCTTCTGAAGTGAGGCCTCTGCGCTACTGTGTCCCAGCCCTTCAAAAATCCTGAGTCATTTCACTG
-TTTCTGTTTCTCCCCTTTCCCCAGCAAGCTTCCTGATGCAAAGGAACACCGGAGCGGGGCGATTGCCTCCCTAGAGCTGG
-GCCGGCCACCCCCACCCCTCGGGCTGCTAAAGCAGCGGGCCGGGCGGAAGGTCGGGGAGCCAGAGCCCAGGGAAGAGCAG
-AAGGCGCGGGGGGGCGGGGGGGGCACCCAGGAGGGAGGACGGGGCAGCGGTGAGGGTGTAGACGGGAGGGAATCTGTCCG
-GTGCCGCAGTGAGTTGGGTGGCGGTGATTTGTTCGCGGGCGCAGGCTGGGAGGCGGGGTTCCTGACTCACTGCGGCACTG
-GCAGGGCTGGTGACAGCACCACCCCCGCGCCGCCTGCAATCTGCCACCGCTGCCACCGAGCCGAGGGGCGCCAGCAAGGC
-ATCCCCTGGGTCAAGGGGCCTCCCGTGGGCTTTCCAAACAGCCTGTGCTCATTTCCGCGGGAGCCCTCGGGGCGCTGTGC
-TGTGGCTGCATTGTCACTGTTTGTTTATTTCTACATCTGCTCTGTTAGAAGATAGGCTCGCTTAGGACAGAGCCTTCTAA
-TCCACCCCCTGATGAATTCGGGCCCTCGCCTTTGGCACAATGCCTGGCGTCATCACAACGCGGGTGATCAGTAAACGGCA
-GCGAAGGAAGCGGGGTCAGGACTGGAGAGGAGAGGGGGAGGAAGACAGACGACCGGAGAGGAACAAAAATGGAAGGTAAC
-TTGAGCTTTCATAACTGCAGAAGTGCAAAACAGCTCCCTGTGTGATATAGGAAGTAAAACCGTAGAGATGGGACTTGGCT
-GGCCTGCCCTTCACACACTTTAGACATTAACCCAAAGTTCATGCTCCTGCCATGACAGTGATGGTGGACAGGAGGGAAGA
-AAATGACAAGGAGGAAAGGAGGTGTCTTTTGCTCTTAAAAATGAGAAGGGTCATAAACAATCCATCGGCTGCAAACCACG
-AGTTGCCCCCAAAGCAAAGCAGGTTAGTGGCTGCTGCCGCCTCATCATAGCTTCAGAACCCACAGAGCCTGGAGGACTGT
-CAAACATTATCTAATATCCCATTCTACAGAAGAGAAAACTGAGGTTGAGGCAGGAACGCAGACAGGAATCAAGGTTTTGG
-GGTTGGGATTTGCAATCCATTACTTTGCCTCCTGCATCCACTGCTTTTCCCTGGGCATTCTCTTCTTCCGGTTTCTTGGA
-AGTTAAAATTGCGAGAGAAGCAACACAGAGTGGTTTTCCCAGGGCCTCGACCTCGGTAAGGGAAGACGTGGAATTCCGAG
-TGTGGAGACCCAGACAGCCTCCGAAACCCCCACGCAACCCTGGGCGTTCAGCAGCTGCCAATGCCCGCCTGACAAGTTTC
-TGGGGCATCTCTGCACACGGAGAGGTGTGTCTCCTGCAGCTCCAAAAACAGATTTTGCCATCTCATCCCCATATTTGCAG
-TCTCCAGTTGGCTTCTTGTGATTGGCCAGAACTTTTCCTCACTGGAGAGATGAGGAGAATCCAGTCCTCCAACCAGCTGA
-GAGAAAACACTGCAGTAGCAGAGATAGCAATGGCTGTTCCACCCCACACTGATACGATGTCAGGGAGCCAGGGGTGGGCT
-CAACAGGCTGAATGATGCCAGGGACTCCCAAGGGTCTATACATTTAACCCTGGAGGAAGTGGCCTCTGACCAGGTACCTA
-ACCTTCTGTACTTCTCGTTCTGTAATTGGGGGCATCAGAGTGTATTCTTTGGCTTTCTGGAAAAAAAGATTTCTCAAATT
-TTAATTTCGGAAGTTTCCATCAGGACTGGCAGCTGTGTACACAGAAGGAGGTTGCTAATGTATTTCAGATTGGGGGCAAT
-TACAGCTTCCCACCTACCCACCCCAATCTATTCCCAGATCACTGCACCACACTGACTCTTGGCCTCCTCTAGAGTTGGAA
-ACTCTACCTGAGAGATGCACTCCTTTAAACTAACATAAAACCTAAACTAACAAAACCATAGCACTTCAAGGTATCCTTAG
-GGTAAGGTTTAATGACCTATTAATATCTCTAACACAGCAATTCTCTTGCTTGGCTATTCACTAGAAGCACTTGGAGAATT
-TAAAATAACACTGATGCCCAGGCCATACCTCAGACCATACCTCTAGAGGTGTTTTCTAAAAGCTCCCCCAGGTGACTATA
-ACAACAGTAAGACTGAAAACCTCTGCTCTCGTGGGAGCTGCTAGTTTGCTGGTCAGCATCTGTTCTCCCTTCCACTAATA
-GCACCTGATGTTCCTTTGGAAACCCCACTCTTTCTTGGTCCACTTGATTGAGTTACACTAACCCCATCATCACCTCCCAT
-TTACTTTTTTCAGGGAATAGCAGGCTACCAGTTTGGCCCCTTTGCATTTTTCCATTCCCCTGAAAGAAGTAATTGGTTCA
-GGCAGAAGATGTGATACAAGGGGGTCCAATGAAAATCAGTCTCAAGACTGGCTGAAACTATTGGGAAGGGAAAGATCTGT
-TTCTGCTGCAGTTATTTAGGAGAAAACATGGGAGCCTTGAGCTTCCAGCAGGCATTTTGCCACCACATGGAGAAAATCTG
-CTTGTAAATTAAGGCAACATAGAGGAAAAGAGATTATTCATAGAGTGAAAAAGACTGAAATCTAATTAATACCACTTCTG
-AAGCCAGATACTTCCAGTAACAGATATTAAATCCCCCTTTTCACCCAAGAAAACTTTGAACTGAGTTTTCTATGATATGC
-CGCATCATAGCAGAGTTAATCTGTTGCTTTAAAATGCAGAGAATAGAGTTCTAATCTAATATGACAGCAAACAAGCAAGC
-TTCAACATTCCTGGTCAAAGATTCCAGATAGCTAAAGACAAGTGGGTGCTGTCCATCTTCAAGGATAATGGCTTTCAGTG
-GAGAAGGGTGAGGAAACTGAAGACAGCAATGTTCTACTACATGTTTTTTTCAGTTAGTATCAAGAGTTATTGGTAGCTTA
-GCCTTTGCTAAATATGAAAGAGCTTAAGAAGTAAAGAGGTTCCAACCATAGGAACCTCTTTTAACCGTAACTATAAGAGC
-TTTTATAATAGCTCTTATAGGTTTTTATAGTAGCTCTTATAGGTTTTAACCATAACTGTAAGAGCTTTTATAATAGCTAA
-TATAGCAGTGATGTATAGGAAGTACACAGAAGCACACAACAGACCATCAAGACAATGCATTGGATGTTTCAGATTCCCTT
-CTTGGTCACGGGAGATTCCCTGGAAAATGTGCCCTCTGTCTGAAAGTGCAAGTGAAGCCAAAGTAATTGATTGGCTGCAT
-TTTAGATTTGAAAGTTTTTCCATGAACAATTGCCATGTAACAAGCTACCCCTAAATTTGGTAACTTAAAAAATGATGTGT
-TTGACTTGTCTTTGTATAGACTTGGATAGCTTTTCTGGGCTTACCTGGGATCTGCAATTGGCTTCTGGTCAGCTAAGTGG
-CTCTGTGTCTGAACTTGGCTGGCTCTTGGCTGGGGCAATGGGAGTGATGAGCTAATGTATCTGTCAACCCTTCAGAGCCT
-AGCCTGGGCTTATTCACATGGGGGAGGCAGGGTTCCAAGAGTGAGAGCAAAATTGCACAAGGTCTCTTGAGATTCGGACT
-CAGAACTTGCTCACTGTCATCCTGCCACATTCTATTTGTCAAAGTGTGTCACAACCCCATTTTTTTTTTTTTTTTTTGAG
-ACAGAGTCTTGCTCTGTCACCCAGGCTGGAGTGCAGTGGCTCAATGTCAGCTCACTGCAACCTCCACCTCCAAGGTTCAA
-GCGATTCTGCTGCCTCAGCCTCCTCGGTAGCTGGAACCACAGGTGTGTGCCACCACACCCGGCTAATTTTTGTATTTTTA
-GTAGTGGTGGGGTTTCACCTTGTTGGCCAGGCTGGTCTCAAACTGCTGACCTCAGGTAATCCACCCGCCTCGGCCTCCCA
-AAGTGCTGGGATTAGAGGCATGAGCCACAACGCCCGGCCACAACCCCGCTTCTTGATGGAAGGAGCTGCAAAGTCACATT
-GCAGAGCACCAGTAAGAGCTCAGAGATCATTTAGCCCAATCCTCCCCATTTAACAGATGAGAAACTACAGACACCGAGCT
-TACCCAAGTCCCCATTTGATTAAATAAATTATATAGGATTATGCTGCCTTCCACACTGATACTCTGTCCACACTGATGTT
-TTGTCCACTATATCTCCTTTTTCCAAGTTATTTCCCATACGATGTAGCTCATGTCCATTATCATAAGATCTCTGCGAAGT
-GGTTAGGCAGAAATTGCCTAAATGTGCTACCTAACAATGGAAGAAACTGATACTCTTCTTCTCAAATTCGCCCATCAAAT
-ATATAGGAATTCTTTTCCAGGAATGGGCACTGGAGTCACAACAGAAAGCAGGGCAGACATAGATCTTATCTGTACAGAAC
-ATAGAGTTTACCATTTAAGTGGTGTCACTGGGACTTCAACCAAGACTGTATGATTCCTCCTCTGGATGTACTTTTCACCC
-ACAGTGGTTGTTATGGTTCCCTGAAGGCTAGTTCGTCTATCAAAGCCAGTTGTTTGTATTTGTGACGGGGCAATCCATAT
-TAATTTACAGGGTTCTCAGCCTCCCCTCATCCCCTTCTCTTCTCCTTGTGAATGAGAATGCTCTGTTTGATCACTCAACT
-TTGTGTATTCCCCACTGTCTTTACTGGGTAAGGTCCCAGGATTTGTGGTGGTTGACTCTGAATAATGGGAAGATAAAGTT
-TAGAAGAATCAGGAAGAAAAAAGTAAGAGAATGAGACAGGAGAACCACATAAGATTGGGCAGCAAAAAAAGCTGGGGTGC
-AGAATAGAAAGGAAGGGATTTGTAGAATGAATAAAACTACAGGCCACATGAAAACTAGAGAGAAGAAAGAATGTTTTAAA
-ATACTGTACTGAGTTATGAACTGAATCTCTTATTTTTCTTCCAGATACAGAAGTGAAGTTTGATCTATTTTTTATTTTTA
-TTACTATCGGCCACTAACTTAGTTGGTTTTTAATGTAACACTTTGGCAGGCCTAAACCACATGCAAACTGGGTAGTTATC
-TGGAGCAAATTTAATTAAGAATCATTATGTCCCCTGAAAGGACAACCAGAGTTTGTGCCTTCTCTAAATACTTGGTCCAA
-ATCAAAACATCAATTGTCCTTTTCTTAATGAAAAAAAAAAAACCTCAACTCCATACTTTATTCTGGTTTCATTGATTTTT
-CCCGAATAACATTTTTTCTGTTTCAACATCCTAATTGGGATACCACATTGTATTGGTTTGTCATGTCTTCCTAACTCCTC
-TGGACTGTGGCAGTTTTTCAAACTCTCCTTTTTTGGGGTAACCACAAAAGTTTTGAGGAGAGCTAGTCAGGTGAAATGCC
-TTTCAATTGGATTTTTCTAAATTTTTCTTTTCATAGTTACACTTGAGTTATTGTCTTCCCACAGAGAAAAGACCACAGAG
-GCAAAATGGCATTTTAAACACATGATATCAAGTGTGCATATCATCAACGTGACTTATGACCAATGACGTTAACCTCGACC
-ATCTGGCTAATGTGCTGTTTGCCAACTTCTCCACTGTAAAGTTGCTTCTTTCTCCCTTTCCATCCTGTATTCTTTGGAAT
-CAAGATGCTAATTGTAGCCCACACTTAAGGAGTGGGGAGTTCTGTCTTTAACCATAGTGAAGAATTTTATTTACTGGAAT
-TTCATTTAAAGTTGGAGTGGGAAGGAGGATGATTCTCAGAAGAACAATAGTGTAAAGAACAGAAGAACAATACTGTAAAG
-CATAAGGGGTGAGGGAGTTCCCATATTATAAGCATGATGGGCAGAAATATTGCAGAGTAGGGAATGAAGAAATGGGAAGC
-CACATGCTGGTGAAAGGAAGGTTTGGAAAAAGAGAGAAAATTTAGCAGTTGTTCTCACTGAAAAATTTTGTGAAGAGATA
-CCTAGAGAGAATGTTGTGAATGTTTTCTGAGCAACTCACTGTGAGAAGCCCCTATACTACATCTTTGAGAAAACTTACAG
-TAAAGATTTACATTCATCTTCTAGGTACCAGAAACTACACTGTTATCTTGTCCAGGCAAAAACTGGTCCACAAGAGAGTC
-CTATCATATTTGGGTTGTACCAGCAAACAATAAGTTGGGCTGGGTCTAGATCTGAAATGAAAGATCTGTAATCCAAAGAC
-CAGATCAAGCATATTGTTTAATTTCTTCAACCTCAAGGAACTTATAAAATTGCTTATAGTAGCAGATTTTTGCAATGGCA
-TCCATTAGTTCCACAGCAGTTTCCCATTATTTATCTAAACATGCAAGGGGTAGAGTGGCTAATAGTGGGATCTTTGGACT
-GTCTTGAAGATTGGACTCTTTTGTTAATTTTGTATTCCTCGATTATTGCTTATACATATATTGTACTCCATTGTGACTCA
-TATTTTTTGGTCATTACTTTTTACTTACATATAACCCATAACGTTTTTTATGTATGTTTCTACTGCAGAGAGAAAGATTA
-TTCCCCCACTCAATACCTATTAACTGATTGGCTGCTTTATGGTTGCTATTTCCATTCTGCACACTTGTGTTGAAAGATAA
-AGCTTCGATAACTTACAAGGAGCAGTTTAGCAAGTTGAAAGAAACTAGATGTAGGATCCATGTGTTTCCACAAAGGATAT
-GCAGGCTTCAACTAGAAAGATGATTTAAGTGTTTAGGGAAGAAATAAGCATGTTCTAACAAGAGTTTTGCAGTCAGCAAA
-ACAAGGTATGTGGTAAATAGGTCCTATCTTGGGAATTGCCAGAGCCCAGAGCTTGTGCTGTTGGCCCATCCAAGGAAACC
-AGTTAAATTAACTGTCTGGAAGGCATCCACAGAGATCCTTGGCTGGGAGGCAGAAGCAGGACATGGAACAGGTGCCCCTT
-TCCACTATTCCTGGGCACAAAGTCTCATTTCCAGCACACGCTGTGGCAGCAGGAGATGCAGTAAATCAACCAAGCTTCAT
-TTCATCTCAGAAGTCCTCTGTGTACTAATAATGCAGGGAAACTTAGCTCATGAAGGAAAGAAAAAATAAATAAATGCTGA
-CGGTTGTTAGAGCTAGTCCCAGTGATAAGCCTGGAACAGGCAAATATTCTTAGTGATTCAGACAATTACTATTAAACAGA
-GGCCAGTTTCCAAGTGACGTTGTGGTGCCAAACACAGCTTTTATCATTTTTGATGAGATTTTTATGATGCTTGTTATCTG
-CCAATATTATTAATGTTGTTAATGACATAAAAAAATTAGCATTTGCCACCTGTGTGCCAGAAGGCAGGCCTTCTTCCTTC
-TTTGGTCTTTGTTCTCACTAGTTTCATAGGCCATCTTTGCTTTGAGAAGGAGCAAAGTTGTCAGCCTAGACCTTGTTTGA
-GTTCTTGTCTGAAATATACTGGTCACCTAAGTGCATAATTCAAAGAAGCCTCCAGCTTGGTAGCTCCTGGGCCTCAGTCC
-TTCAATTTGCCTTTTAAGACTGCTGGGAAATAATAGCATTCAGTTAGCTGTTACTCTCACATTAGAAAAGTAAAATGAAG
-TATTCCACAGAAAAAAAATAAAATATTTTGTTTCAACATCAAAATCTTAAGTGGGATTGGATATGAACCCTAGAAGAAGA
-CCATCTCTGGGAAATCCCTATTGCAAGGACAGAAGCAATAAGATTCTTAGCCAGAAAGAAGCGATCCTTGGGCCAAATGC
-AGTGCTGCCCCCAGTGGTCTGGATAGCAATGCTCTGTGAGACCAGCAGCTTTCAGTCTTGGGAAGAACTCAAATCTCCAT
-CAGATAAAAATGTCTAAACTGGCCCATACCCGTATTATCATGGGGTGGACTTGGGTGCCGTGTGGACTGTGCAGGCCACA
-TTTGGGTTGGTTAAGTGTCTTAATCTGCCCTGTACCCATAGCTAATGTATCCTTAAGTGGGAAAGGAGAGACAGATGATA
-GATAACTAAATACAACTACAGTCTGCATCATTCACTAAAGCAAGTCAAGTGACCAACCCCAGATCCAAGGAGTGTGGAAA
-TAGACTCTGCTCTAGACGCTACCTCATAGAAAGAGGAATTATGAGATCACCTGAAAAAGGATACATGAATACAGGGTTGG
-GCAAAGAATTAGGACAAATGGTGCAATCCATCACTACCAGTTTAACATCATCTCTTTCAGATTAACTCAGTCTCATTTGG
-GCAAATAATTAATCACTTTTTATTCAAATGCTCTAGAAGGATTGTTATCTCTTCCTTCTCAGTGGATCTCACAACCTGAT
-CTTTCCTTCTAATACAGTGTTTGGGAACAGGTAGAAGTTTATGTTCTTACCTACATATTGTTCTCTGCTGGCTCCCAGTG
-ACCTCAAGTTCAGATATACCCTACCAGGGAAAACTCTAATTTTGCTGCATCTATTGCTGATGGGTCTTGTGTAATTTATA
-GTCTGTCCTTGCTGAATTGTCTTTCTTTGGGGGTCTTGGTGTTGAAATTCCTCCTCTGGGACATGGCAATGATTCCCATT
-CAACCTAGAGCCTGAGTGACCCACCCTACAGGCCTCTTCTACAAAATCACCACATTCTTTACTGAGAGTCCTTTGGTGGA
-GTCATAAGTCAGTTTCCTGGGGCATGCAGGAAAGTGAATTCTCTGTAAAGCATTCTCAGGCTAAGGCAGGCGAAATAAGC
-TTTCTTGGTATTTAACACTATCATGTGTTCATTTCTTTTCTTTTTTGACATCTCCCTGTTGGCATAGGACTCATCTTAAG
-GTCTTTAAATGTTCTAGGATCTGCTGGTAAAAGTGAGGAATAATTTTCCCTGTTCTGGCATTCCTCCAAAACTGTCTGGT
-TATTTCTCCCACTGTATCATCTTGGATGCTTTTGGCTCTAAATAACAGAAACCCTGACTCAAACTGGATTAAACAAGAAA
-GAACGTCATTATAGCACAAAATGAAAAGTCTAGCATTAGGTTTGGTTAATTCAGGGGCTCAGCAATGTCAGCTGGGACAT
-GGGTTATTTCCATCTCTTCACTATGAAATCCACACTGTTGACTTCATTCCAAAGCTGACTTTTCTGCATAGCCAGAAGTT
-GGCTGTAAATAGTACAGTAATACCCCCCTATCCAAAAGGGAATTGTTCCAAGACCTCTAGTGGATGCCTAAAACTGCTGA
-TAGTACCAAATGCTATATATACTATCTTTGTTCCTATCCATATATACTATGATAAAGTTTAATTTATAAATTAGGTACCA
-TAAAGATTAACAACCGTAAGTAAAATATGGGTTAGTTGAACACAAGCACTATAATACTACAACAGTCAATCTGGTAGCCG
-AGAGGACTAAATGACTAATGTGTGGTAGCATGTACAATATGGATATGGTGCACAATTTAAAACTTGTGAATTGTTTATTT
-CTCAAAATTTCCATGGAATAGTTTCAGACTGTGGTTGACCATAGGTAACCGAGATGCAGAAATCAAAATAAAATCATGGA
-GACGGGGGGAATGACTACTGTATGGAGAGCCTGCTTCCTCCATCACCAATGGGAAAGAAAAATAGAAAACTTCTCTGTAA
-CCTTGTATTTAAAAACTTTTCCTCCATCTTCATTGGGTCATCTCAGAACAAGTAAGAATGGACAGAGGAATACCATGTGC
-TGACTGACGAACGCCTGGGTTTCTGAACCAATTGCCATCAAGGGGATTGGGATTACCATAATTTTTGCTGAGACTAAGCC
-CCACCCCAGTAACCAAAGGTGAGTTCAGTTTCTCTGGTCACTATGGACTGTGTGAGGTAAGATGGGCAGCTATCAAAATA
-GTCAGTCTATCAATAAAGAGCAGGCAAATACGAAGCTAATTGCTCAAAAATAATCATCTTAAGTGATCATCTAAAACTAT
-CTTTCTAAAGGTTTTGTCTATCTGCTAGAAGGAACCAGTTCACTCATATCTGACCTCCTGCCCCTCAGTTTCTCTTTCTC
-CCTCTCTCTTTCAGTGGTGGGAAACTTTCTACTCCTTTCTGTCTCATTGAAACTTTCCTTTTAATGTAAGCTAAGTTTTT
-CTACTCTGCTTTACAGCGAAACTCTGTGTTCAGTCTCCACACATTGCTCTTAATATGTAAAGAAAGGCTTAACTATTTTT
-AATTTTTTCTTTGCTGACAAAAGTTAGCTTTCTAAACTTTTGTTTCATTCAACTTTTAAGTTGTGATTCAGTGACACCTC
-TTATTGTCTAGGGGCCCCTGCCATCCCATGAAAATACATATGCCAGTGACTTAATAAGTAGAGAATGGCAAGGCAGTAAG
-AAAAACAGGTCAACAGGAAATTCAGAATACATGAAAAAAAAATGGGCTGGGCTAGATGGCTCATGTCTGTAATCCCAGCA
-CTTTTGGAGTCTGAGGTGGGAGGATCACTTGAGTCCAGGAGTTCAAGACCACCCTGGGCAACATAATGAGACCCTGTCAC
-TACTGAGAAACAACAACAACAACAAAAATTAGCTGGGCATGGTGGCAAGACCCTATCTCTACTAAAAAAAAAAAAAAAAT
-AGGCACGATGGTGTGTGCCTATAGTCGTAGCTACTTGGGAGGCTGGGATGGGAGGATCACTTGAGCTTAGGACTTCAAGG
-AAGGTTGCAGTGAGCCATGATTCTGCCACTGCACTCCAGCCTAGCCAATAGAGCAAGACTCCGCTTCAAAAAAAAAAAAA
-ATCTATCCCTATCACACCCCTTCCTGGTTTTTCCTCCAGGTACAGAGAATTAGAGCCTTCAAACGCAGACATTATCAATT
-TGGTCCATGTTGCTTAAGATCCAATTGGCTTCCTTCCTAGCAATTATTATAATTTGTAATTATTTGCAATTATGTCATTT
-TTTGTCTGCTATTTTATTGCCTATTTCCTGCACTAGAATGTAAGCTCTATGAGACTTCAACTATATTGTTCATTCACATC
-CCTAACATCTAGTAGAGAACCTGGCATGGAACAGGCTTCCTATAGTTATTAGTTAGATGAATGAATGAGTAAATTTTCTC
-CTCCTAAATTGAATGGTCTTACACAGTTTAGCACTTTCAGGCCCATTATGGTAGCTGACTCTCAGAATGAGGTTACTCTG
-TCTACCAGATAATAATAATAATAGTAATTATTCAACATCAGAGATGTTAAGTGATTTGCTTAAAGACACCCAGTAAGTGT
-GAAATATGAATCTTAAACTCAGGTCTTTCTTTCAAGTCCTATATTCTCTCCATTTTTACTTGTCTTAAAGTTCTCCAAGT
-TTAAGAACCATTTTAGCATTGAGAGATGGTAGAAAGCCTTCTCAAGTCAAAGTGAATAGGGTGAGCCAAATTAGGGAAGG
-CAACAGGGAGCATTCTGGGAGAAATCCAGTGGTGCATTCTGGGAGCCCTTTCATGTACTTAGCCTCATCCAATGCCCAGG
-GAGATGTGAGACTTCCCGCAGCCCACAGGGCAAGCTTTTCCCTGCCTGTGTTTGCCTGCAAAAACAACTACTACTGCCTC
-TAGCAACGTCTGGAACCATGTTCCCTGCATAATAAGAAAGTATAAATGGAGGACACAGTATTGAAGTATTGAAATCACAA
-GATAAGGAAGATTAAATTAGGCTCTGCCTTCCTGAAATGCTCCCAGAGCTAGAGCTACATGGGAGCAAGGCCAGCTACCA
-GATCTTGGGGCTTCTCCTTTAGCAAAGGGGAAAATCCCCGGCCCTGCAGGCATTTCAAGCTCAGGGATTGGTGGAGGCAG
-ATCTGTCAGGAGCCCCGGTAACACTACAAACCAGGAGGGAAGCTGACAGGAGGACAAGCAATGCTGGCATTTTCCTCCCT
-TGGAAATCCCAGGGACTCTAACACCAGAGATCTGAGGCTGATCTGATGCTCCAGCAACTATATAACCTCCACCCTGCCTG
-AACAGCCTCCTACAAATAGGAAACTATAAGATTTGCATTATCTCAGAATAACCATTTGTAGGACTAGAGTCCGTCCATCA
-GCAGTAACTGTTCTTACTCAACCTTGATAAAAGCTTTGCCAGATGAGTTGGGCTCTGTTTAAGTTTACTAGGCCTGCCAT
-AACAAGGTAATACAAATTGGGTGGCTTAAATGTAGTATCACAGTTCTGGAGACTAGTAGTCTGAGATCAAGGTGTTCACA
-GGACCATGTTTTCTGAAACTCTGGGTAGAATCCATCCTTGCCTGTTCCTCGTTCCTAATGGTGGCCATCAATTTTTGGCA
-TTCACAAGCTTGTAGCTGTGCTATGCCAATCTCTGCATCAGTCATCGCATAGCATTCTCCCTGTGGGTCTTTATCTTCAT
-GTGATGTTTTCTTCTTCTTATAACAACACCAGTCACATTAGATGAGAGCACATACTAATGACCTCATCTTAACTTGATTG
-CACCTGCAAAGGTACTATTCCCAAATAAGGTCACATTCATAACTACCAGGGGTTAGAACATCTGCATATCTTTTGGGGAA
-CATAATAACCCACAACAGGCTAATATTACTATATCCACTTTTTGGAGGTAGAAACTGAGGCTCAGAGAAACCAAGAGATT
-TATGTAACATCACTGTGGTGAATCAATGCCATAATGGCCCCAATATTTTTCCTGCCTCTCTGAATCTATCTGTTGGTAGT
-ACATTTCCCTGCTGATGCTGGGCTTGGCCATGTGACTTGCTTCAGCCAATAGGACAGAGCAAGTGTGATGCCAGCAGAGG
-CCTGGAAAGTGCTTATGCACTAGGATTTCTTCTCTTGCATACTCTGGAACACCGTGACCATTGAGTGAATAAACCTAGGC
-TAGCGTGTTAAGTGATGCGTGACCATGTGGAGAGAGACTCCAATCATTCTCATGTCACTATATGAAATCAATCAGCACCA
-GCCAAACCTCCAGCTGACCACAGATGCATGACCAAACCCCACCAAGATCAGGCAAGCTCAACCTGAATCAGCAGAACCCT
-TAGTTGATCCATAGATTCATGAACAATTATGAGTGAATGGTTGTTTTGAGCCACAAAATTTGGGAGAGGTTTGTTACACA
-GAGAAAACTGATACAGTCACATAGGTGTTAAATGGCAGAGCTGGAACGTGTAATCACTATGTGACCTGTTCATACCACAC
-AGTTCTGAATCAATGGGATGGTGATTCATAATTTTCCTGTTGGCCACAACATGAGTTTCCCATGTGTCCACCAGCATCGA
-GCCAATATACAGAGCCTGTAACTATATTAACTTAAATATTTTGCTTTCCTTCTTTTTATTCCTCCTTCTCTAAATTATGA
-ATAGAAAGTTATGAGTTTGCCCTTTAATTATGTGCTTTCTGGCTATGAAGAGATTGACTAAAATCTATGGTGTTAGTGGT
-GAAGTAAGCAAGAAAAGGAAGAGAATGAAGGCTCTGTAGGTGAAAGAACAGTCATCTTAAAAACCAGTCAGTTGGCCCAG
-TGTAATGTAGCATTTGCCTGCCTCAGTTGCGTCCCAGGGCAGACGGAGAGTTTAATCCTTGCCCCTCTCATATGAAATAG
-GCCACCACTAGGATCCTCAATATATTTCTTTTTTTAATCTCTCTCTCTCTTCTGCAGGCTTATGGGTGGAATGCAAGCTA
-TTGGAAGTATTTGAAGATGTGACCAAGGAAGCTATGAGAATTGGAAATGAGGCAGTTGTTTAGAAACGGGCTGATGTGCT
-TGTGGTAAGGTGGAAGGAGGAAGGCAGATGAGGAAAGGAATGTGCAACTGAAGCAATTAGCTGTTACTATGTAACGAACC
-ATCCCAAAACGTAGTGACATAAAACAACAACCATTTGTTATTTCTCATGCGCTTACATTTCTACTAGGAAGTTCTGCAAA
-TCTGGATTGGTCTTGGCTGATCTTGGCAGGGCTTGTTCTGGCATCCACTCTCAGCTGCTGAATTAGCTCTCAGTTCCTGG
-TTCAGGGTGGCCTTGGCTTGGATGACTTGGCTCTGCTCCATGTATCTTTCACATCCTTCCAGCAGGCCAGCTCAAGCCTG
-TTCTCTAGATTGTGGCAAGGATCCAAGGGAAAGAGAGAAAGCCAAAATGTTCATGCCCTTTTTTGAGCCACTTTTTTCAA
-TGAGTTGGCTACTGTCTCCCTAGCTAAACACATCTCAGCCAAGCCCAGAACCAGTATGGAAGGTCACTAACCAAAGCTGT
-GGGTAAATGGAGGCATGGAAATCTGTGACCTTTAATGCAATCATCTACAATAACAAGCCAATGACCATGAAGCTGGACAG
-AGAAATAGATTCCTGGGAGGAAGAATAGCAAAATGTCTGGAGTAAGAGGAAGTAGGGTATTTCAGGGAACTCAGCAAACA
-GTGTGATGACAAAATGAAAGCACAGTCATGCAATCAGCACCTGGGTAAATATTTAGGTTGGAGTCTGTGTTGACCCAGTC
-TGCAGGTAACCCTCAGCCTGGCCCAGCATTTCACTGCCCTCCTACTACTTACCCAGAAACAACTCTCCTGTATTGATTAA
-GCAGGAAAGAGGAAACTCTCCTGGAAGACACAAGGGCAGATCCAAGCAGGAGCTAAGGTTTTCCAGAATGTGGTCTTAGG
-TCTGTGAATGGCTTTTGGACAGAGGCACAGCTGAACATTCCCATGGTTTCTGTGACTTTAGAATCACTACCACCTCTTGA
-CTATGCACCTCTTGACTAATTTCTATTTCTCAAATTATAGAATAAAAAATGCTGATTCTAAGGATAAAAACACAACAAAT
-AATCCAAAAGTATATAAGATGAAAAATAATAGTGTGAGTTCTATTCCATTCTCCAGAGAGTAACAACTGCTCTCAATTTG
-GGCACTTCCTTTCTGTCTTCTTCCTGCACATGTACTTTTTGCATATGTCCTTTGCACGTTCTTAACCATACTTGGGTAAT
-GATGCCAACATCACAAGCATAACTTTCTGACAGCCCAGAAAGCCAACCTTGTCTTCTTCCTTGTTCAACCCTTGTGCCAT
-TTTGCCCTAACCAGAAAAATACTCCACTTGGTAATGATTCTCTCTCTGTGTCTGTGAAAAATAACATTGGAAAGTCTAAT
-GTGGAAATGTTGAACCAGGCTGGGCATGATGGTTCATTCCTGTAATCCCAGGACTTTGAAAGACCAAGGTGGAAGGATGG
-CTTGAGCCCAGGAGTTCAATACCAGCCTGGGTAACATAGTAAGACTCCCATCTCTACAAAAAATTAAAATTAACCAGGCA
-TGGTGGCATATGCCTGTAGTCCTAGCTACTCAGGAGGCTGAGGTGGGAGGATGGCTTGAACCAGGAGGTCGAGGCAGCAA
-TGAGCCATGATTGTGCCACTGCATTCCAGCCTGGGTGACAGAGTGACAGCCTGTCTCAAAAAAGAAAAGAAAAGATACAA
-AAGAAATATTGAATCAAAAAATATAGGTAAAAGTGAAACAAAAGGAAATTTAAAAATAAATATGTATCAATAGATAAAAA
-ATGGTAAAATGAACAAGATGTGGAAAATGTTGTAGTCTCTACATCTGGCCTAATATTTAATCTAAGAATCTAATGCAAAT
-TTCTTACATCATGAATAAATATGGATGATGGGCCTACAGATCAGATACATTTTAATAATGAGCAGACTAAGTGAGGCCTC
-ATACCTCTCATCTCCATGTGTAACCTAATTAATCGGGCCATTTCAGTTGCAGAACACTCACTTCCATAACTGTCTTCTAC
-TTCAGAAGTGTGTGTTTCAGTTAGAATTTGATTTGGGTGCAGATGCCTATGATAGACAATGCAAACAGTGACTTAAAGAA
-ATAAAAGTTTATATTCCTCTCACATAAAAAAAATTTAAATTTAAATAGTGCAGGGCAGATTTAGCACTCCACGGTGCCAA
-GAATATGAGCTTCTTTTATTTTGTTGCTCTTGGCCTTCACTTTATGGCTCAAAATGGCTGCTGAAACTCCAGACATCAAA
-CCTGCATTCCAGCCTGCACAGTAGAGGAAGGAAGTAAAGAAGGGTAAAGGCTCATTTTCTAAGGAAATTGCTCATCAGCC
-TCACACAACACTTCCTCATACACTGCATTAGCCCAATTTAGTCATATGACCACACCTATCTGCAAGGAAAGCTGAGAAAT
-GTTGTTCTTGTTCTCAGGGGAGATGTATGTGCCCAGCTAAAAATAAGGTGTTCTGCCACCAAAGAAGAAGAGAAAGGGGA
-TATTGAAGTTCAAGTGGTAATCTTAGACATATAAAGCCATCAAAATTATTTCCCCCCCAAACCCTTTTGAGAAACTGAGT
-GCGTAAAGATAGATTATGACTGGGCACGTCAAACTTGTTTTAAATATACAATTGGCCAGGCACAGTGGCTCACACCTGTA
-ATCCCAGCACTTTGGGAGGCCAAGGCGGGTGGATCACCTGAGGTCAGGAGTTTGAGACCAGTCCGGCCAACATGGCGAAA
-CCCTCTCTCTACTAAAAATACAAAAATTAGCCGGGCATGGTGGCATGCCTGTAATTCCCAGCTACTCAGGTGGGAGGCTG
-AGGCAGGAGAATCTTTTGAAACTGGGAGGCAAAGGTTACAGTGAGTTGAGATCACACCACTGCACTCCAGCCTGGGTAAC
-AGGGTGAGACTCTGTCTCAAAAAAAATAAAATTAAAAAATGAAATAAAAATACAAATAAATATACTATTTTTTTCAAAGG
-ATAGAAGGAGCATTGTCTACGTTAAATAATGCAGAAGATTTTAACTGATTGCAGCCCAATTTGTTTCCATATCCCCAGAG
-GCCATCCCAACCCAGAGGCTTTCCCATAGAACCGTGGGGAAAGATCTCAATTGTCTACACTCTGGCTCTGAGATAAGGCA
-GCGCTCTCTCAGCCCTTTAAAGGGGGAGAAGGATGTTAGTTCTATTCCTTAGGCAAGAGGGCCTCACCTGTGGCCATTCA
-ACCCCAGGTTCTGCAAGAGTGAGAAGCAGAAAGCCTACTTTGCGTTGCCTCTACCTGAGGAGAAGAAGCCAGGTGTGCTC
-TCAGATGGTCGGGGTAGTGCTTGGGAAGATGTCGGGAGGACCGCGTAGAAAGCTGAGAGTGAGCTTCCCTTTGCTCACTG
-GCTTCTCAGCCAAAAACCGCTGGAGTGGAAGAGGGACATTATGGGCCTGCAGCAAACTCTCTCTCAACCTTCAGTTTCCC
-AATGTATAAAATGAGTATGATGAAACTTGCCTCATAGATTCATTACAAGGGTTGTTTAAAAAACATTTACCAAAGTGCCC
-GCTGTATACCTCCATTTAATGCATGCAAGTTCCTTTCTCTTCTTCCTTTTGGAATAACATAACCTGATTGTAAGAACATG
-TTTCCACAAGACAACATGATGAGAAATGTTTGGCAAGATCTAGAATTGCAGTATGGTAGCCACTGACCACATGTGGCCAT
-TAAGCACTCCAAATGTGTCTATTGTAACTAGGAACTGAACTTTTAATTTTATTTCATCTTAATTCATTTAAACTTAAATT
-TAAAACCTGCTGCTTGATTAGAGTATTGAAAAATATTTAAACGTATTTGGAACAATTTGGGTATGTGAATTTCCTCTTTC
-AACTATAAATCTTACAAAATCTAAACACAGATCGAGTATTCCGAATTAAAATTTAACATTCAAATTAAAATGTGCTACAT
-GTAACAAATACATACAAGATTTCAAAAAATATACTATAAAAAAGAGAATGTAAATAAAGTCATTGATAATTTTTATGTTA
-ATAACTTTCATGTTGAAATATGTTGATATATTGGGTAAAGTAGAATACAATATAAAACTAATTTGTCCTGTTTCTTTTGA
-CTTTTCTGATGTGATGATTAGAACATTTAAAGTTACATAAGTGGTTTGCATTATATTTCCAGTGGACAGTGCTAAGCAGA
-GGATAGCAAATAATCATTTGGATTGAGTCTTCTCACCAGACTGGCTAGTGATTTTGGCCTTGCACAGACATTTCATTAAT
-TAACCGAGCACCTATCCTGAGCTAGGGATAAAGTAGCAGTTGAATCAGAAATAAGCACATAAGCAAACATTGTAAATAAG
-ACAATTTCTGATAATTATCATAAGCAGAAGGAAGGAAATAAAGTAATAAAAGAGAGAATAATTACCCAGAAATGGAGCTG
-GTTTCTTTACATGGGAGGGCAGGCAGAGAAGGCCTCTCAGAGGAAGGACATTTGAGTTGAGATTTGAAGGGTAAAGATGA
-GCTAGAAGTGCAAAAGTTTAGATGAGGGGAACATTTTACAGAAATATTAAATGGTTGTGCTCAAGGTCAGATAGCAAGCT
-GCTAAGTCAGACTAGCATTATATACCCAGACTGATCTGTGCCTAAGTCTGTGATCATATCCATTTGTGAGAGATGCTAAT
-TTCCACTCTGACAAAATTGTTGACACTAATGAACTGCCCTCCCCCTTCCCCATTATACTTCAGCAGGGTATTGGTGGGGC
-ATTTCCCAGTTATATTCCTAAGAGCAGAAATCGAAAACAACAGTTCTATACAGGTAGGCATATGTCATATCTTGGAGAAA
-AGCATCCTTTCTACTCTTTTCAGCCTCTTGACTTCCTATGACAAGAACCAATTACAAATACTGCAGAGCAAGAATCAATG
-AAATAAAGAAATAATGGGAATGATTTCTGAGGACAGGAATTAAATAAGTGTGTCTTTCCAAAGCTATGACTTAATGGGGT
-CAGGATAACAAGCTCCAGGAATAGAAATGTCCTAATGGGAAAATAACGGCAATTCTGAAAGAGGAATAGTGGGGATTTTG
-GTGTAAGGGACTAACCATCATTACAGTCCCATGGGAAGTTATTAGATCTGGAAAGGTAGGCATCCCTTCATGCTTCTATA
-GACCGAAAAAAAAAATGGATGTAATCAGCCATGTCGAGTTACAGAATTTCATAGGCAAACTAATGATGGAGCACCAATTT
-TTTCTCAGACTTAGGACCTCCAATATTTTTCTTTAACTCTGGGGGCTGCTGTGAAGTTACAAATATATGGTATGGAGCCA
-TTTAAGCTCCAGATCTTGACCTTTTTTTTTTCTGATGCTGCTGCTAAGAGTCCAGAAATCTGGTCAGCCTTTGCTTTACT
-TCATAAGAAGAGAAGAGGGCTGAAAAAAATATTCATAGACACCAAAGTGAAGATGGAGAAAGATGACACTGGTGTTACAG
-GAATAAGCCTGGAGCTGAAGTGATTGGGAAGCCCAAAAGGACATCAAAAGTTACAGGATTTAAGACCACAGCCAACGTAG
-CTGTGTCAAAAGAATAATTCAAGTTTTAAAAACTGATTTTTGTTTAATAAGAAAAATTATATGTCTACCTCAGAACTCTT
-TCTTTGGCCCTAGGTTTGTAAATCCAATTTCCCACTTGACTTCCAACCCCAAATAGAAATTAGGATATTTTATTGTCACC
-CCAAATGGAACATGGCTAAAATAGAACTTTGGGGTTCTATGCCTAGCTTTTCCTATCTGGGGAAATTGACACTACTTAGT
-TGCTCAAGGCATACCATCCCACATCCATTTTATCACCAAGTCCCGTTCATTCTGCCTCCAAAATATATTTAGAAACTTTG
-TCTTCACTTAACCTCCAGAAAAGAGGTTAGGGTTAGGGTTTGGGTTAGGGTTAGGGTTCAAGTTGTCATCATCCTATGTG
-GCAGCAACAGTCTCTTAACTGGTGCCCTGGCTTCTCTCCTTGACCTCCAACCCCCAATCCATTATTCAGATAGCAGTCAC
-AAGCCTACCCAGATCCAGGGGAGGAGATATAGACCCCCAAGCTCTCAATGAAAGGAGTATCTGAGAATCTGTGGCCATTT
-TATTCTAAACTGCTGCATTCACTCTTACAGAAATCAGTCTCCATCCTACCTGTTGTAGAGCACTTCTGGCACTCTCACTG
-CTGCTGTCACTGGCCTTGACCAATATGGAAAAAAAAAATCCACACCAACTTCATCCTTTACAACGTCAATATTTTGCATG
-GTTTACCCACAGAAACAGGGCAGGCCTCTGTTGAAACCTTAAGGTTTTAATTCAGTCCAGTTCTGTATGTCTTTATTGTT
-AGCTCTAGTGTTTCAACCATTTATTAGTCAGATGGCCTTTGGCTAATTATTTAGTCTCCCTGGGCCTCAGTTTTTTCATC
-TGAATTAAATGTCCTTGTATCTCATCATTTCTAAGTGCTTTGCAAGTCAGCCAGCTCTATGAGAGTTCAGCCATTGGCTA
-TGCTCACAGGCCATTGACACACAGTTAATAATAATTTTTTAGTTGCATTAGTTTTAAGAGGGCTTGCTTCTATTTCAACT
-TTTCACAGAACATGATGCAAACCTCCTGAGGATCTGAGCTGTCTTGCCTCCCTCCTCCCCAGCATCTTAAATTATTCTTA
-CCAACTTTTGATGCTTTGATTGTTTCCATAGCCAATTTTCTAAAAGCTGCTTTCCTTTTTGACCCAGCCAATTTGTCCCT
-ATGCCAGTTTTCCAAGCAAACCCCTATCTGATTTGGCCTTCTAAAAAATTTCTGCAAGGTCTTCTTTTCTTTCTAACTGT
-TCCAATTTTGTTCTTGAGTCTTCTTATTCAAAAGAGGCTTCTATACCTTTTATTAGCGTACATTTCTAACAAAAAGCAGT
-TTCTCTTGTTTGAATTTTATTTTGCTCTGTGTTAAATGGACAATGCATGCTAAGGCAGAAAACTAAATTCCTTTTACATA
-TTGGAGATTCATTTAAGCTGGGATAGAAGACAAAGATAATAAATATTTTTCAAAACTATTAAAAATTTTAAAAATCAATC
-ATGATTAAATTGCTTACAAAGAGAAGGAATTTGTTTTGTTTATTTTGAAGCCTCTTTTTCTAAATTTTGGCTCTGAAATA
-TATATGACTATATCACACATATATGCAAATGAAAATAATAAAAGTAAGTTCTAATGAAAAGACATTTAGCACATTTAATC
-AAACTAAACCACTTTGAGGCATCAACAATCCAGAGGAGTAAGGCTATGTGTGTGTGTTTTAAAATTTTTATTGCAGTATA
-ACAATGACATAGAAGAACACACAAGTAATAACTATGTGATCTGATGAATTTTCACAAACTTAAAACACTCATGTAACCAG
-CAAAAGGGTTATCTTATTTAAAAAGTCTCACTGATGGGCTCTTGAGAAACACCTGTATAGTTGTCCTACCTTGTTATTAA
-CTTTATGTAAGCATGAGGCTGTCTCTCCAACTCAATGATATATTCTACATGGCCGGATAGTAGGACTGTAGTTTATACCA
-CACATTTTTTCTAACATAGTGGTAGCTAAGTGCCCTGGAATGAGGACACCCTGAGTAAATGAATATGAACTATATCAGAC
-TCAGTTTATTAAACATTAATACACACAAATCTCTGCTCCACATGCTTTCGATTCCTATTTTATCTTCTATATCACTGGCC
-TTTGCTTCTAAGTCTTTTTGCTGTCACCAACCTCACTGACAAATTATTTAATCAATTATTGACAAAATGCTTAAGTTTCC
-TAGAACTCAACTATTCTTCATCTAAACCTCTCTCTGGCCGAGTTCAGTTGGTCCCATGGCTTTAAATAACACCTATAAGC
-TAAAGACTCTTGAGTTATAACCCGTACTACAGCCAATTAATTGCATTTACGGCCCCAATTAATGGCCTTTCTATATCCCT
-CTCATATCTTGACGTGAGCTGTTGCAAAGTCACATCGCAACAACTCACATCAAGAGGTGGAATCTATTTCATTACCCAGT
-GAATCTGAACTGGCTCTATAACTTTCTTTGGCCAATAGAAGGTTGGGGAATACCAACTGCATTACCAACTTTAAGCCTGT
-GCTTACTCTTGGAGCCCTCCGTCTACCATATGATCAAACCCAAGGCAGCCCACTAAAGAATGAAAAACCACATGGAACAT
-TACACTCACTGACAATCAACCAACCCCTGGAAGCAAAGCCATCTAACCAACTTGCAGCTGACTACTGATGCATGAGGTAA
-CTCAAGCAAGACTAAATGAGTCCCCCCAGCTTAACCCAGCTAAATAAACAACCTGCAACCTCATAGGGTAACAAAATAGT
-TATTGTTTTAAACTGCTGACTTTTGGTGTGGTTTGTTACACAGCAATAGCTAACTGATATACCAGCTTAGACATATGTGT
-AGACACGTATTCAACACCAATCTACACTTCCATGTAGACATCTCATAGCCATTAAAAAAATCTATACCAAATTTGATGTT
-TACCCCATCTAAAAACCTCTTCAATGTTTTCCTTTTGAAAAGTGGCCCCCTTATCTGTCCAGTTCTTCAAGCCAAAACTC
-TGGACGATACCATTTAATTCTTCCTTTCCTTCACTTTCCACATTCAATCCATCAGAAAGTCCTGCTGATTCTAATTTCTG
-AATTTTTCTTAATCCATTTAGTTCTGTCCACTCCACTCACATCATTTCTGCCAGTCTAAGCTGCTAGTGTCTTATGCCAA
-CAGCACTACAGTAGCCTCCTGTCTGATCCCTTCTGAACCTCTCCAAACCTTTTTTACACAAAAGCTATTTTTGGTTTAAA
-AATCCTAGAAGATCATGTCGGTTCCCTGCTTAAACCATTCAGAAACTTCTCATCATGCTTAGAATCAAATCCAAGCTGAG
-TATCATGGCCCATGAGACCCTCCATGACCTATTTCCTTTCCTTCTCTCCAGTCTTTCTTCCCGCCACTCTCACTCTTTGA
-CTTACTACATTCCAGCCACATTTGCCCAATTTTTTTTTTTTTTTTTTCTGAGACAGTGTCTTACCTTGTCACCCAGGTTG
-GAGTGCAGTGGTGCAATCCCAGTTCACTGCAACCTCTGCCTCACAGATTCAAGCAATTCTCCTGCCTCAGCCTCCCTCCT
-GAGTAGCTGGGACACCAGGAGCATGCCTCCATGCACAGCTAATTTTTATAATTACATGTAGAGAGGGGGTTTCACCATTT
-TGACCAGGCTGGTCTCGAACTCCTGACCTCAGGTGATCCACCCACCTCAGCCTCCTAAAGTGCTAAGATTTCAGGTATGA
-GCCACCATGCCCAGCCCATGTTTGCCCTCTTGCTTCTCCTGAAATAGCCAAGCTCTTCCTCATCTGAAGGCTTCTGCTCT
-TGCTCTTTAATCTGCTACAAAAATCTCTTTCCTTGCTTCTTGCTCTTTGCCTGGTGTCTTCCTTTACCTCTTTCTTATCC
-CAGATTAAGTCTCGCCACCTTTTGAAGGCCTTTTCTGGCCACCCTGTCTAAAGTGGTCTTCCTGTCCCACCATTTTTCTC
-CATTGTCCCATCCTATTCAGTTCATTGAAAATATTACGATTGCTGATTCTTGGTGTATTTACTTAACAATATGTGTTTTC
-TTGCCTGTCTTTTCTACTAGATTTGAAATCCCATGGGGGCAGGATACCATGTCTACTTTGTTCACTTAGCATCATAAGTG
-CTTTCCACAATTTTTGGCCCATGGTAGGCACTCAGTAAACATTAGTTTAATAAACTAATCTAAGTCTTCCAATAACACTA
-TCAAGTAGATTTTTATTATCCTAGTTTTACAAATAAGAAATTTGAGGGCAGGCATTATTTGTATTACTCATACTCAGAGT
-AGAGAGACAGTACGGTAACCAGGCCAATATGTCAGAGAAGTGGAGTGGGGACATGAACCCTATAGTTCCTATACAAAGCC
-CAATCTTTAATTGCTCAATTCCCATGACTTGAAAAACAAGCAATTGTGCTCTTGAGGGATGGAGTGTTGTAAAGGGATGT
-GAAGAACAGAATGCTCCAACCCAGACAGGTGTTTCCCCCTCCTTGAACTGATGCTGCCACTCCAAGAGTCATATCCTCAC
-CCAATTAAATCCAGATGCAGGAAGGTAGGGATAGACAATAATGGCTCTTCTTCATACTTTCCACTCAGAAAAGAGGAAAA
-TAGTTTCCTGAAGCCTTCAGTGGATATCTAGTTACATTTCATTAGCCAGAATTTGGTTCCACTCCCACTACTATCATTTG
-CAAGGGAGACCAAGATTGCCACTCCTGATTTACGTTCATCACCATTCATCATCACCTGGGCTAGGCTGGTTCCACCCAAA
-TGTATCAAGATTCTGATATCTATGATGGAAGGGAAGAATGGCTATTGATCATACCAGCAACAGCATTTGCCATAGAAATT
-GAATTACTCTAGGTTCTTTTGTCCCACTTTATTCTAGAAAATATGGATGTTATGGATTAAGTCCATGGACTAAGAAACTT
-AGAGCTCAATCTGATGATACTGAGTCTTGAAAAAGTTAGTCTACTCTTCTCAGTAATTGATGAACCCATATGTTGTATCC
-AAATAGTTCCAACCTCCCAGCAAAGCATAAATTTATATACCTGGCATAGAATAACAAAACCACACAACATAACAAGGCAT
-TGTCCTAATGATAAACCTAAAATTGTCCTGATAGATAAATCCAGCCATGTTTTAAATTCAGCACTTTATAAGCAACCTAA
-ATATGCTAATATCAAAATAAATCCCTTTTGGTAAACCTCAGTGTTACCTTGTTCTCTTCCCCATAAAGACAACTTTTATT
-TTCCATAAAATTCAATCTACATATTTCTGTTTTACCAGCAGTCATACAAGAGTTGTTGAAAATTATTTATAGATGAATAG
-AGGCAAGTTTGGCGTTGCAGAGCTGAGCTTTGGCTGCAAATTGGGAGACTGGGTTCTGGTCCTAGAACTTCCAAAAACTA
-GCTGTATGAATTTAGGCAAGTTACTTCATTTCTTCTTTGGTAAAATATGGAGATTAAAAGGATTATATCTGATAACCCAA
-TTGAAACCACTTGAACAATATATTAGTAACGGTAATTGATTCTAGCTGTTACAACAAATGGCCCCCAGATTATAGTAGTT
-TAACATAATTAAAGTTTATTTCTCACCTAACAGTCCAGTTGGATTCATGAGGCATTTTTGCTGTCTTTCCTCCAGGCAGT
-GTTTCAAGAACCCAGCTCCATTCATCCTATGATGCCACCATCCTCAGCATTTGACTTCCATGGCTCCTGTAAGAGAAGAG
-AACATGAAGAACAAAACAGGAGGTTTTTATGGGAGGCATGTCAATTTGACCAGATACTTTGCCCAGAACCTTGTCACATG
-GCCTCTGCCTAAATGACAATGAGGCTAGTGGCTGGGTGTGGTGGCTCATGCTTGTAATCTCAGCACTTTGGGAGGCTGAG
-CCAGGAGGGTCTCTTGAGCCTAGGAATTCAAGATCAGCCTGGGCAACATAGGGAGACTTCGTCGCTACAAAAAAAAATAA
-ATTAAAAATTAGCTGGGCATAGTGGCACATGCCTGTAGTCTCAGCTAGTTGGGAGGCTGAAGTGGGAAGATCACTTGAGC
-TGGGAGGTTGAGGCTGCAGTGAGCCGAGATCACGCCACTGCACTCTAGCCTGAATGACAAAGTGAGACCCTATCTCAAAG
-AAAAAACAAAAAATGAGTCTGGGTAACGTAGCCTGTGAGACCAGAAAGAAGCATCAGGATTGGCGAGTATTAATACCATC
-TCTACCATAAACATTTTTGGAAATATTTCTTTTTTTTTTTTAGAGAAAGGGTCTTGCTGTGTTGCCCAGGCTGGTCTCAA
-ACTCCTAGCCTCAAGCAATCTTCCCAACATAGCCTCCAAAAGTGCTGGGATTACAGGCATGAGCCAACAAGCCTGGCCCT
-AGAAATATTTCTTTCTCTAAATTCAAAGTAACTAGGGGGAATATTAATCTCATTCTAAATATTTTATTTTGTCACTCCCT
-ATCCTTTGTTTTCAAACACCTCACACTACTATTATGTGTTATCACGAGTCAACTGTTTACATGTCTATCTCCAGCTGTTG
-GTTGGGAGCTCACTGAAAAAGGAAACCTTTGTAATTCATTTTTGTATCCTGAGGGCTTAGCACAGAGGCTGGCACCTGTT
-AGACCTAAGAAGGATTGGCAACTCTGGACAAATCAGAGAAGGAGCGTTGTCAACCCTTTTCTCCTGGTGATGATGATGGT
-GATGGTCAATGTCCACTCCCAAATATCTATATTGGGAAGAGGTGGTTTGTAGGGTGAGCATTTGTCTTTTGAGTGTATAC
-TTGAGGGAGGGATGAAATTATGTTTGTTTTATACTCTAGAAAAATTGGCTAAAACAGCAAATGTAATTTTACAGAATGAT
-GGAGAGGGCATACTGAGGTGGGAGGCAAATAATAGAAGGAGATGTAAAACTGTCAACCTTGATCCCCACAGTGATGGGGG
-ATGATGACAGCAGGAGTAAGTTATGGGATGATTGTATGTTTGTGAACCTCAGTTCTTCTGCAGCATGAGCTGGCAGGATC
-CTCTCCTTGACCACCTCAGGTGACCTGCTGGAGCCCACTGGTCTCACCAGGAGAGGTCATCGGGCCACCAGACCAACTGA
-AGTAATAGTTCTTCTTGAGGACAGTCTCTAGCTCCCCCTCTATCCCATCCCACAGTCCAAAAATGCTACCCAGCATGGCC
-TAACCCAGAGTCTACCCCCAAATAAGTGATTCTGCAAGTTGCTAGAATTCAAAGATGCTCACACCCCAGAATTAGAAAAC
-ATCACTGTGGCAGTTTCAGGTTCTCAGCAAGCAGACCAAGAATGCACATGTGAGCTTCCTTTATTTCAAGTTAAGGATGC
-ATTTTCGGTTTTTAAAGTTCAACAATAATAAAATCAGTTGAAAGCCCAACTTCTAGAGCAGTGCTATTCAATATACTAGC
-ACTGGCCTGTGTGGCTATACAAATTTAAACTAATCAAAACTCAACAAAATTTAAAATGCAGTTCCTCAGTGGCAGTAGCC
-ACATGTTAAGAACTAAATGGCCACATGTGGCTAGTAGTCACCTTATTGGACAAGGCAGCTGTAGTACATTTCTGTCATCA
-CAGAAAGTTATGTTGGATAGCATTCCTCTAGAAGCTGCTTCCGTGAAGCTGTGTGCCAGCTTTCTAAGTCAAGTTCTGTC
-GATCCTATTTGGTAGAAAATATGATAAATGTTTTAGAAAATCACAAGAGGACTTTTATTTGGCTGAAATTTAAACATATG
-CATGCAATTTCTTAAAATATATTTTACATATTTGAAGGTTCAGTTCACCTTGGAAAGCCAAATTTCACATCTACAATATG
-AACAAAATTTCAACTTCCTGGAGCTCAGTGATAATTATGGATTATAGGTTAAAAATAAAGTTAATAACTCCTAACAAGAG
-CATGAGCAATGTAAGACTTTTTCCAGGTAACATTAGAAGCAAGAAATAACTAAAAAAGGACATTGCTTATTTTTAAGGGT
-ATTATCTCCAAGTACATATCATTTTAAAGAATAAAATTTTGTGTTATCTTTTTCAAAGCACAGATATTTCTTGTACATGT
-TAACCTTCTAAGCTGCACAATAAGATATGACATCGTTTCTTTCCAAGAAAAGAAGTTAGTTCACCTAAGAGAAAAATGAA
-TCAGCCTGGATCCTATTTTATTATTGGTCCAGGAGAAGCAAGGACCCTACCTGACTTCAGGGAGACCATCTGGGCTAGTT
-ATTAGAGCTGTTTATAAAACCCTGGCTCTCCTTCTCTAGGGGTGTGGGAGGGCTCACTTCCCCACTCCCTAAAGTAAAAA
-AAGGCCACATGACTTGGCTTAAACATGAGTAAGAGTAATGAATGTCTCTTCCAGAAGAAGCATTTAAGTAACTGTGCTTG
-ATTCATTCCCCCTTTCTCTCTACATTGACAGTCATGGAATCCCAAGTTGGAATCTCCATCAGCAGATAACCACTAGTGAG
-GACGATTAAGAAAGGCTCTTTTAATCTACATTGGACACATAGCAAGAGGAAAAATAAACTTTTCTTATATTAAGCCATTA
-TGAGCATGAGGATGTTTGTTACTGCAGTATAACATGGCCTTTGCTGACCAATACCTCATCCAAATCTAGGTCACATGGCA
-CCAAATGGCAACACGGTTCTGAGTCTTTTGTTTCTATGAATACAAAGTGAAAAAGCTATATGTGTACAAATCAAGAATCA
-GATAAAGGTGAAGAATCAAACTTGACGAAAGCAATCCTAGGGGCTGGGCATGCTGTCTCACGCCTGTAATCCCAGCACTT
-TGGGAGGCCAAGGTGGGTGGATCACATGAGGTCAGGAGTTCAACACCAGCCTGGCCAACATGGTGAAACCCAATCTCTAC
-TAAAAATACAAAAATTAGCCAGCCATGGTGGTGGGTGCCTGTAATCCCAGCTACTTGGGAGGCTGAGGCAGAAGAATCGC
-TTGAACCTGGGAAGCGGAGGTTGCAGTGAGCCAAGATCGCACCACTGCACTCCAACCTGGGTGATAGAGCAAGACTCCCT
-CTCAAAGAAAAAAAAAAAAAAAAGCAATCCTAGGTCTGATTTCCTACAGACACTAAACATAGAAAGAAGAAATGGCTCAT
-TCATGTGAGCACAAACAGTAAAGAGGTTTATTTAAACTCTGCTGTGAGCTTGGGCCTCCTTTCCTGCCTGGTTGAATTTA
-AAAATACCATATAGACTGTGTGTACCTAAGATGCTTTTCCTACAAGAGCCTTAAAATTTTCATTTCTCTCTTTCTAGATA
-TGCTGCCAAGAGAATTTTTTTCTTTAAGAACAAATAAACTAAAGAAATTAACATCCAGCTTGCTGAGTCACTTGCTTTCC
-ACTTGAATTTTAACTACAAGGATCTGAAGACAGCCTGTGTTAGGCAGAGAAAGAAAGAGACAGAGAAAGAGTCAGGGAGA
-AGAGAGGAAGAGAGATGTAGCTGGAGAGTCAGGGAGAAATTCAAAGAGATGGAGAGAGAGACTGGTTCTGGAAAGAAAAG
-ATAAGTTAAATAGAAAAAGGAAAGTAATCTTTGAAAGGTTTGTTTAAGACATGTATTTTCTTACTCTGTAGTGGGAGCGC
-TGAATAAAAATATTTAAATAAAAGCTGTAATGTGATTAAGGTTTGAGTTGGGGTTTAATCGTGGAAAGAGCAAGGTATTT
-AGAGTGAAAGATCTAACTTTTGTATTTATTTTTCATTTTTTAGTGTTTTCGCTTTTTTAATCCCAGGTCCTCTACCATTG
-ACTATCTGATGTTAACAAAATCAGTTCGCTTTTGTGTCTTGGTTTCCTCATCTATGAAAAGGGAATAGAAAAACTTACCA
-CATAAGTTGGTAGGGAAGACACAATTCTATAAAATATATTGGATGATCTGTGAAACCACCTGACACCAAAAGGGAATAAT
-AAATTCCCTTCTCTCTTCTTTTTCTACACCATCTCTTTTTAATTCTACCAGAAAGTTCCTTTCTCTATGAGGCTTCTTGA
-AGACTGGCTGTATACAGGAAAACTGTATTTCTAATTCTGCTATTTATTGGAATACTAGGTCAAGTTTTTCCTCCTTCTTA
-TTCTATTTAATCTTCACAATAACCCTACATGAGTTTATCTTCATTTTACAGAGAAAACAGAGGCTTACAGAGGTTAAAAA
-AAAATTCCCAAATCCACACAGATAGTCTTTTAGTAATCTATTGCCATAATAATACAGTATTGAAATTTCCCCCAAATTCG
-GCAGCTCACAACAACCATTTTGTGTGACTCATCAACCTGTGGGTCAACTTGGCCGTTCTGCTGGTTGAAGCTGGCCTCAG
-CAGGACACACTCCTGCAACTATAGTCATCTGGGCTTTGGCAAATCCCTTTAGTCTATAGCCAAAGAGCAATAAGTGAGCA
-GCAAGAAACTGAATTATCTCTGACCCTTTTATTAAATAAAATGCTGATCTTGGGCCAGCTAACTAACCTTCCAGAACCCC
-ATGCCAAGGCTTTCCTTTGGTCCAGTGCCTTAAACCCATGCAGTCCTGGGGTAGAGAAATGAGGAAGCCCATAATTCTGG
-CAGAAAGGCTGCCTCTCATTCCCAAATACCCCTGAGAGAGATGAATGATAGCAGGATGGAGCCTGCCAAGGGCACACAGA
-CAGGGCATACAGAATCGTCCAACCTCTCACCAATTCAAGGGCAGGGCAATTAAGAGGCCAGAACTCACCACAGCTAGAAA
-TTATTTACGTTAATGCTTTAGCACAATGTGGTCCACTAACCAGCAACATCAGCATCACATGGGAGTTTGTTAGCAATGTT
-GACTTTTGAACTCCATTCCAGACCCACTAAATCAGAATCTGAGAAGCACAGGTTCAGCAAGAATCGCACCAGGAGTATAC
-CACTGGAAAAGCATGTGTAGCCAGATTTACTGTATTAGATGAATTAACGCTTCAAGGCCCAGCACCTTACTGAGTTTCTG
-ACCTCCCACCCAAGCACTCAATACTTTCCCCTGTCAATTGGCCCTGCTCTCTGGGATGAGTGCCTGGTATTTTTGCTTGC
-TCCGTATGCATTTCCTTCTTGTTTGCCTCATTCTGATTTTTCCTTGAAAGGAGTTTCCTTCCCCACTCCTAGTCGATGTG
-TGTCAGGTTGACTTATCATGGCTTCTGGGAATGAATATATGACCCAGGTCTGACCAATTAAAAAAAGTAGGGATTTTGCT
-GGAACGATTGGAAAAGTGGCATGTTCTTTTCTGCTGTTGATGATAATTGGCTGAGTCTATCTGAGAATGAAATCAACACA
-GAGATGATGAGAGATAAGTTCCTGATGACATTGTTTGAGCACCTAAATCCAGCCTTGCTTGAAACTATAGATCTGATTCC
-AGATTTTTTAACTGCATACGCCAATACATTTCCTTTTATGCCTAAGTTATTGTGGTCTGGTTTCTATAATTTGCAAGCAA
-AATGGTCCTGGTCTGCAAAGCCACCCTATGTTGTAAGCTTGATGCCCCCCTCACAAGTTTTTGCCTCAACTTCCTGTCTC
-TCTTCTGTTTCCAATCACCTGTGACAGTCATTTTCCAATTTCCAAATTACGAAATTTTTACATATTATATTTGCTGTCAT
-AACACAAGTGGGAATTGACCCCAGAGACTTGGGATAGACACAATTCTTCAATAACATAGAATAGGCCTGAAGTGCTCAGT
-TCTGTCTAGAAGCTCACTACTCAAATATATACTGTGGGGGAAAGTAACCGCCTGATGGTTAAAAGGCTGGCCCCGTATTT
-CCTCCTCTTCCTCAGTTTCCTCATTCATGAAATCAGCAGACATTTTGGAGATTTACTTCAGCCCAGACTTTCTAAGACAC
-TCATAGTTAGGGGTTCCTGGTTTAAATAGATTGCGACAACTTAACATGCAGCTTAACATGAAACACAGATGGCAGAAAAA
-TAAAAAGGTGCCTCTATCAGTTACAAAGAAATTGGTTGGGCGCAGTGGCCCACGCCTGTAATCCCAGCACTTTGGGAGGC
-CGAGGCGGGTGGATCACCTGAGGTCAGGAGTTGGAGACGAGCCTGGCCAACATGGTGAAACCCCATCTCTACTAAAAGTA
-CAAAAATTTGCCCGGTGTGGTGGTGGGCGCCTGTAATTCCAGCTACTCAGGAGGCTGAGGCAGGAGAATCACTTGAATCC
-AGGAAGTGGAGGTTGCAGTGAGCCAAGATCATAGCACTGGACTCCAGCATGGGCGACAAGTGGGAGACTCCATCTCAAAA
-AAAAAAAAAAAGAAAGAAAGAAAAAGATTGGCTAGACCCTGTGTGTGGCATGACATCCTATTCCAACTAAACACAATGTT
-CTATTTTACAAATAAGAAAACAAGCTAAGAGAAGTTAATTGGTTTTCAAAAAGTCACACAGTACAGACATAGCAGAGGAA
-GAATGAGAACCTACAGCAGAGTTGAGAAGGTTCAACAGAATAACGGGTCATGTTTGGGCACTTGTATTCTGGAGCTGGCA
-CCTGGGTCCTGGCACTTATTAGCTGAATGTCCTTGGGTAAGATATTTAACTGCCCTGTGTCTCAGTTTACTCATTTGTTC
-AATGGGCATTATAATAGTATAAACATCAGAAAGTTGTAGGGGGTTAAATCTCTAAAGTGTTTAGAATGCTTGCAACTTAT
-AACATTTTATATGTGTGTTTATTAAATAAATAAAAATAAATCTGACTTCATGTCCAAAGTATATTTTTCATACCCTGCAG
-CTGTCCTGTACCAGAAATATCTCTTCCCACAAGATCTCTTTAACGACCTGGCAATGTGTGTAAAACCTCACCTTACTCAA
-TTCTTAAAATTACTCTGATTTTCTAGCTTGGTGAGAAGTCTCTAAATGCTTACTATGAATTAGTTACCTGATAATCTATC
-CTTAGTAGAAGCTATCTGCCGCAGCAGATTAGGTCACTAGGGCTTCTTGAAGGGAGAAAGGAATTAGAAAAAAAGCATCG
-AGTGGATGGAAAGAACCAGAAAGAAACAAACAAGGCAACACCTATTAGTTTATTCATGGTTGACCCAAGGAATAGATTGA
-AATACCAGATGCACCTGAAAAATAATTTTTTCTCACTCTGGCACCCAAGCTGGAGTGCAGTGGGCTGGGTGGAGGGGGGA
-GGTCATGGTTCACTCCAGCGTCAACCTCCCCAGCTCAAGCGGTCCTCCCACTCAGCTTCCCAGGTAGCAGGGACCACAGG
-CATGTGCCACCACACTTGGCTACTTTTTTAAAAAAATTTTTGGTAGAGACAGGATCTGACTGTGTTCCCTAGGCTAGTTT
-CAAACTCCTAGACTCAAGCAATCCTCCCGTTCGGCCTTCCAAATTGTTGGAATTACAGGTGTTAATCACTGCACCTGGCC
-TGATTTTTTAATTATCAAATCATGTTCAGAACTCACTTCAATCCAATTAACTGAGGATTTCTGGAAAGGTTACCCAGGCA
-TCAGTATTTTTTCACTGTGATAAAATACATATAAAATGTACTATAATAATTTACTTTAATAATTGTCTTGACAATTTTTA
-AGTGTAGAGTTCTATGGAATTGAGTACATTCACATGGCTGTGCAACCATCACCACCATCCATCTCTAGAACTCTTTTCAT
-CTTGCAAAACTTAAATGCTGTGCCCGTTGAACAATAACTTTCTCTTTTCTCCATCTTCACCCTGACAACCACTATTTTAC
-TTTCTGTCCCTATGAATTTCACTACTCTAGGTACTTCACGTAAGTGAAATCAAACAATATTTGTACTTATGTGACTTGCT
-TATTTCACTTAGCATAGTATCCTCAAGGTTCATCCACGTTGTAGTATGTGTCCAAGTTTTCTTCCTTTTTAAGGTGGAAA
-ATATTGCATTTTATGTATATGAATTTTACATATCCATGCCTCCATCGATGGACACTTGGGTTGTTTCCCTCTTTGGCTAT
-TGTGAATAATACTGCTATGAACACGGTGGGCAACTCCCTCTTCTAAACCTTGCTTTCAATTCTTTTGGATATATACCCAG
-AAGTGGAACTGCTGGATTATATGGCAAATTATTTTTAATTTTTCAAGGATACATCTTACTGTTTTCTATAGTAACTACCA
-TTTTACACTGCCACCAGCAATGCACAGGAGTTCCAATATCACTACATTTCTTTCAATACTTGTTATTTTCAGGTTTTTTT
-CTTAGTATCTATTCTAAGGGGTGTGAGGTGGCTTCTCATTGTGGTTTTGATTTGCATTTCTCCAATGATTAGTGATATTG
-GACATCTTTTCATGTGCATATTGGCCATTTGTATATCTTTTAGGAAAAATATCAGTTCCAATACTTTGCCCATTTTTGAG
-ATGGGTTGTGTGGTTGTTGTTGAATTATAGCTTTTTATGAATTCTGTATATTAATTCTTTATCAGATATGCTATTTGCAA
-ATATTTTCTTCCATTTTGTGGGTTGTCTTTTCACTCTATTAATTATTTCCTTTGATGCCTAGAGATTTTTATTTTTGATG
-TAGTCCAACTTACTTTTTTTTCTTTTGTTGCCTGTGCCTTTGGTATTTCCACTTTTTTTGGCTATTGGACATAATGCTGC
-TATGAACATTTATGTACAGGATTTTTTTGATGGATATGTGTTTTCAGTTCTCTTGGGTTTATGCCTAGAAGTAGAACTGC
-TGCATCATATGGTAGCTCTGTGTTTAAGTTTCTGAGGAACTGCAAAAATGTTTCCAAAGTGGCTACACCATCTTATACCT
-TACCAACAATAGATAAGTGTTATATATTCTCCACATCTTTACCAACACTTGCTATTTTTCATCTTTTAGATTAGAGATAT
-CTTGGGGATGTGAAGCAGTATCTCCTTGTGGTTTTGATTTGCATTTCCCTAATGACTGATCATGTCAAGCATTTTTCATG
-TGTTTATTAGCCATTTGTAATCTGCTTTAGAAAAATAATTCTTAAATTTTTTTCTCATTTTTAAGTTGTGTTGTCTTTTT
-ATTGAGTTGTAAAGGTCCTTTAAATACTCTGCATAGAAGTCCTTTATCAGATATATGATCTGCAAATATTATTTTCCTTT
-TTGCTTTTTGCCTTTTCATTTGTAAAATTGTATCTTTAGAAACACATTTAACTTTTTTTTATTTTGAGGAAGTCAAATTT
-ATAATTTGCTGTCATTTGTATTTTGGTGTTCAATGCCTGATCCAGGGTCATAAAAATGTGCACATATGTTTTATGCTAAG
-ATTTTTATAGTTTTAGCTCTTAAGGTTTTGATCAATTTTGAGTTAATTTTTTTCTATGATATGAGGAACTGGGCCAACCT
-CATTCTTTTGCAAATGAACCTCATTCTTTTGCATATTTTGCAGTTTTCTGAGCATCATTTGTTGAAAATACTGCCCTTTC
-CCCATTGGTCTTGGAGCCTTTGTCAAAAATGATTTGACCATACTATATGCAAGCATTTATTTCTGGACCCTCTATTCTAT
-TCCATTGGTCTGACTTTATGCCAATACTACACTGCCTTGATTATGAAGCTTCATTGTAAGTTTTGAAATCAGGAAATCTG
-AAACTGCAACTTTATTCTTCTTTTTCAATATCATTTTGGTTATTTAGAATCCCTTGAGATTCTATATGAATTTTAGAGGG
-ATTTTTCTATTTCTGAAAAAAAATGTCAATGAGATTTTGATAGGAATTGCATTGAACCTATAGATCACTTCGGGTAAGTT
-AGTTTTTCTATATGGTGTGAGAAACAGATACGCCATTTTTTTGCATGTGGATATCCAATTCTTGCAGCACCATTTGTTAA
-AAATACTATTTTTTTCCACATTGAATTCTGTTGTCACCCTTGTCAAAAAATAAATTAATCATAAATGAAAGGGTTACTTC
-TGGACATTTAATCTGATCCCAGTTATTTGTTTTTATGTTGGTGTCGTAAAGTCTTTATTACTATACCTTTGTATTAAGTA
-TGGAAATGCGGAAGTGTGACTCTTCCAACTTTGTTCTTCTTTTTCAAGATTTTTTGGCTATTCTGGGTTACTTGCATTGC
-TATATAAATTTTAGAACCATACTGTTTATTTTCCCAAAAACATTTCTGGGTTTTTCAGTAAAGTTTTTGTTTTGTTTTGT
-TTTGTTTGTTTGTTTGGAGATGATGTCTCGCTATGTTGCCCAGGCTGGGCTTGAACTCCGGGACTCAAGGGATCCTCCCA
-CCTCAGCCTCTTGAGTAGCTGAGATTACAAAGGTGAGCCACTGTGCATAGCTGGGAAGTACAATTAATGTGATAAGTTTT
-TAAAATCTAGTTCAAATTAATACAAACTTGATTTTGATAGTACACCAAAACTTTGCTCTGACATAGCTCTATTCCCTCCT
-CCCTCCTTGGTGCTTTTATTTTCATACAAATTACATCTGTATACATTATAAACTCATCAACATAGTTTTACAATTATTGC
-TTTATGTAATTTCGATCAGATAGGAGAAGAAAAAAATACAAACCAAAATAACACAATAAAGCTGGCTTTTATATTTCTCT
-TTGTACCTACCTTTACCAGTACTCTTTATTGTTTTATGTGGATTTGAGTCACTGTCCAGTCTCTCCATTTCAGCTGAGGC
-ACTTCCTTTAGTACTTACAGGGAAGGTCCGTTAGCAACAAATTATTTTAGTTATTGTTGCTGTTTTCCTTCCTTTTGAAG
-GATAATTTTGTTGAATATAGACTTCTTGGTTGAATGTCTTTTTCTTTCAGTACTTTAAATATGAGCATGTCATCCCACTG
-TCTCTGTGGTTTCTAATGAGAATCTTAATCTTATTAAGGATCCCTTGGACATAATGAGCCATTTTTCTCTTTCTGCCTTC
-AGTATTTTCCCTCCATGACTTTTAGTTTTGATTGTAATGCACACAGATGTTGATCTCCTTAAGTTATCCTACTGGAGTTT
-GTTGAGCTTCTTGGGTGTTTAGATTAATGTTATTCCTCAAAATTTTGTTAGTTTTGGCCATTACATCTTCACATGTTCTA
-TTTACCCATTTCTCTCATCTCCTTTTGGTTTTCCTTTATGCTGACTTGGTATGCTTGATGATGTCTCACTGATCTCTGAG
-GCTTCATTAGCTTTTGTTCATTCTTTTTCCATTTTGCTCAGACTGAATCATCTCAATTGATTTATCTTTGAAATTGCTTG
-TTCTTTATTCTGCCACCTCCAATATGTTACGGTGCTTCTCTAATGAATTTTTTTATTTCAGTTATGATATTTTTCAACTT
-CGAAATTTTTATTTGATTATTTACAATACCTATTTATTTATTGATATGCTCTATTTTGTGAGACATCTTTCCCATATTTC
-CCTTTAGTTCATTGGACATGGGCTAGTTCATTAGTTCTTTAACACATTTATAAGAGCTGATTTTAAGTCCTTGTCCAGAA
-ATTCTAATGCCTAGGTATCCTCAGGGACAGGTTCTCTTGACTGTTTTTCTCCTGCATATGGGCCACATTTGTTTGTATGT
-CTTAATATTTAGTTAAGAACTACACATTTTAAATAATATAATGCGGCAATTCTGGAAATCAGATTTCTACCTTCATCCCA
-CAGCATTTGTTACTGTTGCTATTTGTTACTACTGTTGTTACTGTCCCTAGTAACAATTTTTGTCTTAAATTCTATTTTGC
-CTGATATCCACTTTATCCAATTCTCTTTGATTATTTGCATTGTATATATATTTCATCTTTTTTTTTTTCAATCTATTTGG
-GGGAGTTTTGTTTGATTGTTGAGTGATTTTGCTGAACTACTTTGGTAAGTCTTCTTTATTGTGTATGGCCCTGAAGTCTC
-TACTCAGCTAATTTAATGTTCAGCTCATGTTTGGACAGAGATTTCCCTAAATACCTTGCACCAATAAGGCTCACAGTCTT
-TGCTGAGAAGTTCTGTGTATGTATTTTTTGGAGTACTCTTTCAATGCTCCACCAGGCAGGTTACAAAGCTGCCTTAGTCT
-TTGCTTCCTGATGATGCAGTCTCAGGTTATGGAGAGGTGAGAGAAGAGGGCCTTCTCAGATTTGGGGCATGCACCCAGCT
-TTCTGCATGTGCATGGCTTTCTAGATTCCCAGAAATACGTGAGAACTTTTGAAAACACCCTATGAACATCTCAGTTTCCA
-GCATTTCCTGTTATGATTTTTGGTCAACTTCTTATTTGTCCCAGCTGTTACCACTGCCTCAGGCAGCTGCTATGTGAAAC
-ATTTGATGCTGATTGTTTTTGACTAATGCTTTGGGGAGATAATGTTTATACTATGTGAGTTCTAAGTTACCTCAAATAAA
-GATAAGCTTCAAGAGTGGTAGTTTTTAGGGAACTTTTTATTTTTTATTTTTACTTTTTTTCTTTCCAACTTCTATTTAAG
-ATTCAGGGGGTACCTGTGTAGGTTTGTTGCATGAGTAAATTGCATGTCATGGGGGTTTGAGGTATGGATTATTTTGTCAC
-CAAGGTAATGAGCATTGTACCCAATAGGTAGTTTTTTGATCCTCACCTTCAGGAAATTTTCAGACAAGTTAAATAGTGAC
-AATTCTCTCTGGATGGGATTCTGGGGAGCTCCAAATCAATTCTGTTACCCTCCAAATGGCATGTAGGTCCCTGGTTTTCA
-AGGTTGCTATAAAGCTGCAGAAAGGGGAATGGCAATAGGGCAAGTTAAATGCCACAAAGTTTCTTGTTCTTACCCAAAAT
-GTAGACATTTTTCTTGAATAAATGCTCCTCAGATTGTTGCAAGCCTTTGGTTAATTTCCAGATTTCTAAACAAAAAAATT
-ATTTTAACAATTTTTGCTAGTGTTCTTGTTGCTTTTATGAAGGAATAGATTTTCAGAGGTCCTTATTCAACCATCCCCAA
-AGTGGCTCTTTCATAATCATAATTTTATTATTAAAATGTTGGCTCCAACAGACCTCCTGACCAGATGTCAGCTCTCATGT
-CTCATATTTCCATTTTAATCTCAGTATCTTTCCTTAACATTGCCTAGAAAAACACAGGGGTTAAAAATACATTTCAAGGA
-ATCTTTCTTTTCTCCACTTTAAAAATCAATACCGTTTTGTTATACTGAATAAGAAAGGTTATGGAGTTTCCAAAGCATTA
-TAGGAGAGGACATTGAAGACAGAATTTTGCAGCCCACCCAAACCAGGAGAGCTTGCATAAAAGCTTTTTGAAATAATTTT
-GTTACTGCCATTCTTTTAAAGAAGAGTAACACATTCACAGGAAAACAATAATGAAGATTGTTTAAATAAAATAAAATCTT
-TTTGCATCTTACTCATTATCCTTCCCAAAAGTAACCATCTTTAAATACTTCCTCTTCAAGTTATCTTTGGTGTTTCCAAC
-CTTAATTTTAAATAATATCTTTTTATTTCTTGATTTACCAATTTTAAATAATATATAAACATCCTTTATGAAAAAACTGA
-GAACGTTATCTTGTTGGCTCTGTCTCCCTTATTACAACCACTGAACTTTGGTACTTCTATTACTTTTTGGGTTTCTGTTG
-GCTAACTTTAAAATAATACATATAACTTTATATATGATTATACCATCAGTAAACTTTATTTTTCCTTTTATGAACTTTAT
-ACTGATTATTTTAATCCTTTACCATATAAAATGAGTAAATTGCGGTGTCTGCATTATAAAGTCTCTTTACATTGCCCCTC
-CTAAGCCCTCTCCTTTACTTCCCACATCTGACAGCTCTCTCACTACTTCTATATGTTAGGTCCCATAATATTCAGATTCT
-GTTTGGTAAATATTAAGTCATTTATTCTTGGTCTACAGTTTAATTTAAACTTCAAAGATCAAAAAAGAGCATTTACAGCT
-TATGATTATATAGATAGTATTTATTGCAGAACCAGGTAGGGTGGTAAAACTTTAAAGAAAAAATGTCTCTGTGGCACTAA
-ATTTTCACACCAAAAAAGAAAAAAAAATTGAAGATAAAGGACAAATAAAAAATATTTCCTTAAACGCCATCAAAAAATGC
-TCAAAATTGTGTCGTATAATTGACTTCAGATTTGAACCAAAAATATATGATATAGCTTTTGTTTTTCCTGTCATTATAGG
-GGCATTTTCTTGTTATTACTGATAGGAGATATTTATGCCATTGTCTGGTTAATACTATAATTAGCTTTTAAACTATACTA
-TTTGTCAAACTAATTTTACTCTGATTTATTACCGTATCTGTTTCCTAGCTTTGGTCCTAGGAAAAAAATGCTACCTTAGT
-TCTAATATTTCCTAAGTTCCTGGTCTTCCTCCTTTGCATAGATTCCTTTGTGAGTTGTATTGTTAAGGTAAAATCCTTAG
-AAAATATTTTTATTTGCAAAAAATGTTCATGGGAGGTAATTGTCCTGAGTCTGTCCACATCACATCTAGAAATGTTTTCA
-TTTTGCCCTTCGCTCTTTATTAATATTCTGGCTTAATATAGACTTATAGATGGAGATTTATTTTTCTTGCTGTATTTGAA
-GACCTGTTCCATTGACTCCTACCACCTGAATTTGTTTTGAGAAGTCCAATTTTGCTGTAATTCTTCCTCCTTTGTAGGCG
-ACCACCTCTTTCTTCTCTATGAAGCTTGTAAGAGCTTCTTTAGGGAAAGTGGGAAAATATGCAAAAAAAAAGAAGCATAC
-TCATTATGTGGTACTACTTACAGTGAACAATATTTACCTAGATATATTCATGGCAGAGTGACTATTTAACACACAGTTGT
-GTTATTGACAGGATGGGGAGAAGAAACAAGGGTGATGTAAGAGAGCCTCATTATTAGGAAGTCAACTGATGTCTATTTTA
-TAAATCAAGAATTAGCAATGTCTGCATATTATTTGGAAACAAAAAAGAAATTAACCAAAGCAAATGCAAATGCCATTGAA
-AACCATTGCCTCTGGGAAATATAATATAGATGTAGCTATAAACACATATATAATGTCAACAGGAGAAAAGTGCTATGAAG
-AAAAATAGTGCAGGGTAAAATAATTTTAAAAAATAGAGGTTAGCAACTTTAGCGAGTTTAGATTGTCAGAGAAGGCTCCT
-TTGTAAATGTGGCATTTGAGGAGATGAGACATGAGACGATCTGGGGGAGGCTATTTCAGGTAGAAACACTAACTAGTGCA
-AAGGTCTTGAGATAGGAGTGTGCTTGGTTGTTCAACGGACAGCAAGAAGGCCAACGTGATTGGAATGGAGAGGTGCTGGG
-AAATGAGTTCGGAAAGGTGGCCAGGAGCATGATCTTGTAGAGTAAAGGAAGAACTTCTAAGTGTGATGGGTGACATTGAA
-AGTTTTAGAGAAAGGAAATATGATCAGATTTGTCTTTTAAAAGTATCACTGCAGCAGCTATGTAGAGGAGATACAGGTGC
-TAGAAGACAAATTAAGAGGCTACTGTAATATCCCAAGAGAGAAATGATGGCGACTTAAACTAAGGTGGTATCCGCGGAGG
-TGCTGAGGAGTAGTTGGATTTGAAAAGTATTTTGACAATAGAGCAACAAGTGTTATTTATTATGTGTGAATATAAAAAAT
-ATCCTTGAAATAATATAAGATTTTCATCCTCAGGGACTAGGAATGTCAATGCCGTTCGCTAATATGGAGAACTAAGATGA
-AGGGAGCCTCTTGAAGTTAAAAAATCTGAAATCTGCTTTGGATATGCTAAGTTAGATGTCCATATTTGCCTTATGCTTAA
-GTACAGATATTGAGTAGAAACTTGTGCATACATGATGCAGTCCAGGAGCAAAATTAGGGCTGAATATGTAACATAAAAGC
-ATCAACACATAGACACTACCCAAGGCCTTGGAAATGGATACACTTACCAGGGAATGATTATGTAGAGAGGAGAGAAGTTC
-CAAGTCTTGAACGCTCGGAGTTGAGAAAATGAAAGCAAAGCCAGCAAAGGAGAGTGAAAATAAGATGCTTGTGAGTATAC
-TAGTTTGGAAGATGGGACATCATGAGAAAATGTTAATTAAGAATGTAAGAGGCGAAGTAGATTCTTGCAGAGTATGGAAC
-CAACTTATGCATATATATGTTCAGTTTGAGGTGCCTTTGATTCAGCCAGATAAGAGTGTTCATTAAGAAGCTAGGAATAT
-GACTTTGAAGCTCACAAGAGTGAGTGAGACTGGCAATAGGAAATTAAAAGTCAAATATATAAAAAGATGGTTAAACTCAA
-GGGTATGAAATCAGATTTTTTGAAGACAACATATGAAGGAAGATATAGAACACTGAGTCTCTTGAGGTACCATGGTCAGT
-AGAGAAGGCTGAAAGACCAATCAGAATTCTGCATTTTCTGATGTAGAATTTAGAGTAGGAAGTTTTCAGTACCTATTCTA
-ACTCCATTACCAACTGGCTGCATGGTATAAGATAATCATGTATTAATTGGGAATTAAAATAATAATTACTATTATACATA
-CCTCAGAGAGTTGTTGCAAGAATAAAATGAGATCATGTGTGTGACAGTTCTTTGCAACTTTCGTATTTCTTTAGCACAGA
-GCTATATAAAAGAGAGCTATTTAATTTTTTTCTCTTTGGCTTAGAGCACAGAAGCTTTCAGGGTGGAGAGTCAGGACAGG
-TTCTATGGACATATGGAGCTCCCAGGGGGGCTTGTGCAGGACTCAAGGAAATGTCCAGCTTAACCTGCTGGGCACAACAA
-TTTTGCTGCTTCAACCCATCTGCTATGGAAAATGAGGAGCCAACAAAAAAGGGAGAAACAGAGGTGAAGGCACCTGATAA
-TGAAAGCTTTAAGAAAGGGAAGGGGTAAGTACATGCCGTCAGGTGAACCCAGAAGTCAATAAAGATGAAAAGTCCTTTGG
-ACCATGACCAAGAGATTATTGATGCAATCTGCTGATGTCTTAGAATGTGCCTTGCCTAGGCTGGTGCCTGTGAGCTGGCA
-GAAGTGTGATGCCCTTCTCCGCTAGTATCAATAAAATCGCACGAGATATTCTTGCCCCATTCCCAGGTATATCCTGAGTC
-ATTCATTTCAACCCAGCTTAACCCCATCCTCACCCTCAGAGTTCTTCACCCTTGGAATCAATTCGTGTTGAAGACCTCAT
-ATCATCTGCCTCAAAACCACTGATCCACATTGCCATTCTGTTCTGACCTCTGGCTGACTTGCTTAGGTATATTTTGAGAG
-CATTTTCTGCCCTGATTCTTATTTAAGCTGTTTATTGGATATTGATCTCTGAATTCCCTCCTTGATTGTAATTTGAACTC
-TCTTCCTTTGAATATGTTGTTTCTGTTCACCTCAGGTTAACAGCCTAGACTTCTTTCTTGAAATTCGCCACAGCGAAACC
-TTGTGATTCAGCCAACCAAACCAGTAATTCATACTCATCCCTCTAGCAAACGAAACCCTGAAGTTGCTAATGAGAAAAGG
-CATATGCAAGCCACAGTGTGTTGAGGCAGAGAAGGTAGCTGCAGAGGGCAGAAAGGAGTCTGATGGAGCTGGAGGAGGCT
-GTACTAAAACATAGTGATTATGAGCTTGGGCCCTGGGGTTCAAACCCCAGCTATCCCATTTCTTAGCTGTGTCCTTGGCC
-TGGTTATTTAACCGCTCTAACCCTCAACTCTCTACTCAATTTTTCCTAGACCCCAGTGCTAAGCATATGGCAGGTGTTCG
-ATATTGAGTAAATGAATAAGTTCATATAGATGAAAAAAACAAGGCCCAGTATGATTGATACATATCTAATTAATAGCTAA
-TGAAAAAAATGGCAATCCTCCATATTAAAGCCAAGCTACATGTCATTTCTTAGAGAAATAAAGTTAAAGTCTCATCAAAA
-TGATAGATTTTATTTAGCCAATACTTCATAGTGCTAGACATGACACTCAGTGCTTCATAATTTCCTTGTGTATTTGCTAT
-AATTATTGTCTCCATTTTACCTATGAGATAATTGAGATACAAAGAGGTTACAGAACTAATATGATTCCTAAAAGATTTAC
-TCAAGGAATACTGTGATCCCTAACAAATAGCCTTTTTGAAGTGTACTAATTTGGACTACCATTTTCTCTGCCTCTCTGTT
-CCTAATTGTCACAGGTTCTTCCTCCCTACTGGACCACAGGCGTGTCTCAGCATTGGGAAGGGTCCTAGGATGCATTGTAA
-AAGAAAGTCTGTAATTTTGGTGCATCAAGGAACAAAAGTGTGGAAACATCCAGCCTGTGGCTGCTGGACACTCCCCTTCT
-TCCTTCTCACCATACTGTCTGTAATAAAGAATAAAGTGTTATTTAATATTCTGAGTGTACAGTCCTATTTTTTCTTAACC
-TGGCAAACCAGAAACAGCAACTAATATTCCTGGTTCTCTTTTTACCTTTCACAAGATCTATATCTACCTTAGAGGCTTCA
-GGGAACAAGAACAGCCTGGATAGTTTAAACCTAGAGTTAAACTACTCGAGGCATTTTAAGGTACCGCTACTTCACTATAT
-ATAAATGGGGTGGGGGGCTGGATTAAGGGCTAGAAGAATATATGAAGAGAAAGTGGCAAGCAAACCACTTGGAAAGCAAA
-CCAAGGAATCAAAACAGTTGCTCTATCAAACTGAATATTCTTGCGCAGAACTGAATATTCTTTGCCCTCACAGTGTTTTG
-AAACATTGTCATAGGGTGCCAGGCATGTCCCAAAGGAGGACCCTGGAGAGAGGGCTTCTGAGCTGGGCTATCTCTAAACT
-GCTTCCAAGTTGACTTTGGAAAGATCACATGGGATTTTAGAAAAGTTATTATTATTATGACTTATAAAATTGTAGTTATT
-GAGTCAACTATGAATCTTGCACCTTACCTTGGAGATACAAGCTAAATACCTTGGACCTAGAGCTACTGCAAACCAGAATA
-CTTTGGGGCATAATGTACCAAAAAAGCTTTCAGAGGCTTGAATTATCACAGTGTAAATATCCATCTAGCAGAGCAGGTAA
-TTTTCTCGTTACTCATCCTAAGCATTAGATACTCTGTGTGTTAGTTCTTTGCAGAAATAACCCATAGCAGCTGAACCATT
-TTGGAACAAATTTTCCATCACCTTCCTTCCCTGTGTGGTTCAGGCCTTTGCAAACCCTGAGTATCATGAATCTGCTGGTT
-CTCTACTGGCAAAGATGATGACGTTTTCTTGTTTGTTTTTGTTTTGCTTTAATCATGCCGTGAGAAAATCCTAAGGGAAA
-AAAATCTCATTATCCTATTCAAAATACATTTAGGGTTATCTGGTCATCCCTAGCAGATTTTTATGTACCCAATGTTTATG
-TATCTCAAATTACACTCTGTTACCTTTCCCAGAGCAAGATGAAGAACCTCTAAGAACCTCTCAAACAGCATCATTTTCAC
-AACAAGCACTAGCAATGGAAAACATTGTCACCACCACCAGCTAATCTTGTAGGGTCCATGGTATTTTCTGTAATGCCTTG
-AAACAGTCTGCCTCTCTCTTCTTGTCTGTCATTTTTATAGATGTCAGTGTGGGGCATCAGCAGTTGAAAACTCAGAATAC
-CAAGCCAGTCCTTCCCTGTGACTGCTACATAGCTTTTGCCTGCAGGATAAGCCTCCATCACTGACGTAGTTGCTTTTTAA
-CTTCTTTTTTTTTTTTAACTTGGAAAATCCCCCACCTCCTCCATTCCTTCACAAAACTTTCTGCCTGAATGATTTCTAGT
-CTGAGGGCCATACACACATTTTTTTTTCTCCCTCTGCAGGTTTTTTTTTCTCTTCAAACTTCCGCATGCTGCCTTTTTTT
-AAAGTGTCACACTTTGGAAAAAATTCTGACTACAAAGGATTTTGCAGTACATTGCATTCAAACCCCTTTCCCCCTATTCC
-AACTTGCTTTATAATGAAAGTAAGAGCCATACTCAAGAGACTTTTATTGGCAATTAAGTATCTAAGGACTTTGCAGATTT
-TCTTCTTTATTGTATGGCAATCTTAAATGTTTAATGAATATTTAAGTAAACAAATTTCAGCAACATGCCTTTTTTAGGAA
-TTTGGCTTTAATTAACATCCAAACACTGTTAATTATTATGGCAAAAACATCAATACGTCAAAAAAAAGCCTTCAGGCCAG
-GGAATCTTTAAGAAACAATTATGTCTACTAATTTCGATTAAAGGTATCCTTTATTAAATTCTTAACAACCCGTCTCTTTC
-TAAACGCAGCGCCTTCACAACTCTTCTTCCCTTCCCCCTACCCCGCTTCCCTCCCTCCGCAATGGAGCGCAATCAAAGGC
-CGTATTATTGCCTAAGCTTGGCTCTCAGGCCAGCTAGGGATGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTG
-GTGGGGCGGGGGTGGGGGGCGAGGGTGCAAGGGGAGAGGTTGTACGCCGCTTTTCCGAACCCAGCTCTAAATGGTTTCTC
-CTAAGCGAGACAAGGATTTTCCATAGCCTAAAAGAGGCCATCAAGTTTTAACATTGCGAGGCACGACTTCTAATCGCATC
-CTTCCCGGAAAAGTACAAACAGTTCCTCAGACGAGGTCCCCCACCTCCCACGCGCTCCCCAGCCCTCCCTCCCTGCGGAG
-AGCCCCGCGACAGCCTCCCCAACACCTGTGAATCATCCGGGAGGCTGCCACCGCCGAGCGATCCGCGCACCACCCCCTTC
-CCGGGCCCGGGCACGGCCAGGGAGGACAGTTAGGGTTGTTGCTTTATAATTATCACTTTTAATCTCTAATACGACCAGCA
-CAAGTAGCCTTTGTCTCCCCGCCCTGATTTGAGCATCCGAGGGCCCCCCGAGGCAGCCTGCACGGGTACCCCGGGGTTTG
-CGCACTGAGTGAACCCCCAGATTCGGCCGTGTCCCAGCCGTCCTTGCTCTGAATCCCCCACCTCCTCCCGGCCGTTTGGA
-CGGTTCCCTCGGGGCGTCTGTGCCTCCGTGGGGTACCCCTAAGACACCCAGCATGAAACCCCAGCACCGACTGCAAATTC
-CACCGAAAGCAGAGTCATCCGTTTTTGCCCTCGGCAAACAACTCAACTTCAAGCCTCGAGTCCTTGCAAACCCACGCTGG
-CTGGGCTAACTCCGCTTCCCTTCTCCTTCCCCCGACTCCTGCAACAGCTCAGAGAGCCTGGCTCTGACGTAGTTCAAAAT
-AACGTGCGCCAGCCTCGCTGCCCGGCTGACCACAGCAACGAGAGCCACAAGCCCTCGACGCTGCTTCGATAACATGAAGC
-AATCACTCATAAAAATAGCAACCCACGTAGCCTGGCCATATATGGAGCTGGCGAGGGTGGACGGGGATGCCCCTACGGAC
-CCTCTTCGGAGAAAACAAATCGCCGCTGAAATTTCCCCCACCCCTCCCATCACTACCTTTTACCCCTCCTCTGCCTTCCC
-CTCTCCTTAGATGACTCAACCACAGATTCCACTGAAAGGGGGTGGGGGTGGGGGTGGGGGGGAATATATACACATACACA
-CAAATTATACATATATTATACATGTATTATAAAATATACACACACATACATATATACATACACACACATATACACATATG
-TACACACACACGCACACACACCAAAGAACATCAGGAATGCAGTTGCGGGATGAACGCGTTTGCCCAAGACCGAGTGTTAA
-AATGGAGTCATAAGAGTCGCCCCGTGCGGGTGTTTATAGAAGGTGAAAACACGCAGGTTTGCAGGCCAGCGCACTGGGAA
-CCGAGTCAAGCGCGCCGCAGCCCGGGCCCCGCCCCCGCCCCCGCCGTGCCCCGCCCCCACTTCCTCCCGCCCCTCGCTGG
-GCGGCTATTAAAAGCTGCTGACGTCAAAACGGACGGCCATCTTTGATGAGGGCAGAGCTCACGTTGCATTGAAGACGAAA
-CCTCGGGGAGGTCAGGCGCTGTCTTTCCTTCCCTCCCTGCTCGGCGGCTCCACCACAGTTGCAACCTGCAGAGGCCCGGA
-GAACACAACCCTCCCGAGAAGCCCAGGTAAGAACCCCCCTCCCCAGGTCGTGGCTCTGGCTCGGGATGGCTGCATACCCA
-GAAGGGACAGCAGCTGGGCAGTCCGAGTGGGCTTGGGTAAATACAAGTATTGGTGCACTTAGGGTGCGGTATTCCGTGTG
-TGCACGTCTGGTGGGGGCTTTATAAAGTGTTTTCGAGGTGAGCTGCTGGGGAAAAGGGAAACGGGAGCCCTGCAAATGGA
-GCGACGGGGAGGAAGAGCGAGGGTACGTACCGAATAATAACTTACTCTTTTGAAACAGTAGTGGGACCCCCTCTTTCTTC
-CATTTTGCGATGCAGTTTTCAGAGATATTTAGGCTGTTGAGTTTTCCTCCCCTGTCGTTCTAACCCTATTATTATGACTG
->21
-GGAATGTAGGAGGGTAGGGAGTGGATATTTTCTAACCTGGAAAAAACTCATTTTACCCTATATAATTTTTTTTAGCAAAT
-TCCTTCTTTGCACTTACTCCACAATCTTTCCAAATTCTCCCAAATGCTCAAGCTTTTAAAAAACAAAAGACAGAAAGATA
-GCAGGTTATTAGGTTTTCCACCAAACCTTTTCTTTCTATTCCTTTACATCAGTGAGCTTAGAATAACTCTGCTCCTGGAA
-CTGGGAAAGGGACTTGGGAAAAGAAAGAAAAAAAAAGCTCCCAAAGTTTAGCATCACAAAACATTATAGTCACTGCTATT
-TTATTATTTATTTATTTATTTATTTACTTTTGAGATGGAGTCTTGTTCTGCCACCAGGCTGGAGTGCAGTGGTGCGATCT
-CTGCTCACTGCAACCTCCGCGTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTACTGAGTAGCTGGGACTACAGGCGTG
-TGCCACCACACCCAGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCGTGTTAGCCAGGATGATCTCGATCTCCT
-GAATCTGTGATCCGCCCGCCTTGGCCTCCCAAAGTGCTGGGATTACAGGCATGAGCCACCGTGAGTGACCCTGCTTTGTA
-AGTTTTACATCATATATCCCCTGTGTTAGACCAAGAGCTTGTAAAAGCCAGAAGACATACACCATTTATCGTTCAATTAG
-AGATGTTCACTGATAAAACTGATTCTTCCATCTGAGGGTGGTAATTGTAGTTACAGTAATGTAGATGACAATCTAAGTTA
-TGTTCTATAAACTGTGTCACTGACATCTCAATCTACAGCTAACTTTGATTTTTTAAAAGCAGAGGAGTGGGTTGTATAGG
-TTTAGAAATACATCCATCAAGCTAGTTAAGTGAGATGGATTCAAGCCTTCAACTCACTGGAATATTTACCAAATTGACTA
-TTCATTAGCTAAAGGAGCCATATAAACAAGGTACTTTTTAAAATTCAAAATTATGTAAGGTTTTATTTCCTTTTTATGTT
-GTTATGAATTGGATTGTAGAGGTTATAAGGTAAAATAAGATTACTTTTACAGTAAAACATACAACACATTGTCGCAAGAG
-GGCAGCCTTTGAACACGAATTGCTTCTCAGGCATTCCTTGAAATTTTGAGACAGTTACTTTAATTAACACAACAAAATAA
-TAAAACACTACAGAGGATCTAAGAAGATACTTTGACTTATGCATATTGTTACTTTTTTATTACTGCTAGTGGAAGATGTA
-ATCGACAAGGAAGGTAAGGGCTGAATTTGTTTTATGTAAAAAGACAAATTTCTTTGGGTTTTAGCTTTCAAACATCAAGA
-TAGTAGGTCAATGTCTAAATGAGTGTATCAAAGTTCTCACAATGGCACATGTAAATTCACCTCTTGTCTACCCAAAACTC
-TAACCAAGCAAAGGCAAGTTGGAAGAATCAGACAAATGTAAGTCCCTAGGATACATAAATGCCACGGGATTTTATGTTTT
-TAACTTTCAACCTCCTAAGTTTCACTAAGAGACATGTTATTTGGAGAGGTTGCTAAAGTGTATTTGTATGATGTCTCTGT
-TTACGGTTGGTCTGGACCTCTTTCTGTCCAGTGGTTGCCCTCAACTGATGAGAGTCACCTCTCTAAAGATCATGCTTACG
-TCCCTGGAGCAGTCCGCAGCACTATCAATGTCTGACGTCCACCTTTTTCCAATTAATATTTCTGTACTTACTGAATTGGA
-AAACATACAGGTGTTTTTTGCCTGGTCACTTGTGGTTTTACAACACTCCCCCCGCTTCCCCACCACTGCCCCAGGTGATT
-TTGATGCCAGCCAAAGTGTGAGAACTACTGGCAGCTGCTGGCCGACAGCAGCAAAGGCCCAAATCCTCTGTGTGACTTCA
-AGACCCGTATCTGGTTTTCAGCCATATTTCCTTCTCCTTCTCACAGCTGAGTCCACTCCTCCTCCCTCACCACCTGTAGG
-CTATGCTTTCCAGCCTGTGTCCAGGATTAGTCCTGATGTAAGGCACGTGGGGTTTAAGGAGCTCTCTCTTCAGTCTTATT
-TCCACACCATCTCTGACAGATATATTCCAGTTGTAATCATGGGGCTACCTCCTCTTGTTTCCAGTCCCAATCTCGTTTTC
-TCTATCACATTCTACCTTGTAATAACCTAAATCTTCTGGTGGGCAAGCTTCTTCCTCAATCAAATTTGTGTTTATGATTG
-TGTTGGGGATTGGCATAGTAATCCAGGTACTGCTACTGCCTTGAAAGCGGAGACTGCATCCTTCTGTCTGGATATCTTGA
-GTTTCTGGATTGTAAACCTTATTAGGGCCCATTTTTCCTAGAATTGGAGCCTCTACTTTGTTCTTGCTACTTTAGTTCAC
-CCAGAAAGCACGATCTCTGCCTGAATTTCAAAGTGTTGGCTAGTTTAAATATCCTTTTGTGAGACTTTTGTCTTCCTGCG
-GGGTGATTTTTTCATCTTACATATCATTGCTAATCTTTTTACCTTGAATATAATTGAAATAGTTTTAATCTGTGTTACCA
-GCAACAAGAACCCCTTTTATGAGATGAAGAGGCCAGGTCAGTCTCATAACTTGTGTACCCCTCCGTGTGTTGAATTTATG
-TCAGAGCCAGGTTCTTTCCTATTTGATGTCTCTCACCAAATTCCAGTGTTTATGTCCTAGGAGGTGCCCAATAAATTCTA
-GAGTTGATACAAGCTGTAATTTTAGAGAAATTAAATTAGCAAGTAGAATTAGATTATATACAACCTAATCAACTTTTTTT
-TTTTTCCCTGAGGATGACCAAGATTTGGGCTTCAGTGACAATAGTTATCCCCTAAATATTTATACTCAATCTAGGATCAC
-CAGTAAAATGTTGAATAGAGGTGATGAACACACACATCCTTTTCTTGTCCTAATCTATGTGGTTTAAACATTTACGCTTT
-CACAATTAAATATAATATTGTTTATATGTTTTGTTGTGGATGCTTTCCACCACTTCTAAAAAATTTCTTTTTCTAGCTTG
-CTGAGAGTTTTTTTTTTTAATCAGCAATAGATATTTCTCCAAAGAAAATATCCAAATTACCAACAGGTACATGAAAAAAA
-TGCTCAGCATCACTAATCATCAGGGAAATGCAAATCAAAACCACAAAGAGATATTGCCTCAAGCCTGTTAGAATGGTCTG
-ATTAAAAGAAAAAGATAACGAGTGTTAACAATGGGGAGAAATTGGAACACTTGTACAGTGTTTCTGGGAAAGTAAAACTG
-TGCAGCCTCTATGGAAAACAGTACAGTTGTTCCTCAAAAAAATTAAGAAAGTAGAACTACCATATGATCTAGCAATCTCA
-CTTCAGGTTATTTATCTGAAAGAATTGAGATTGGGATGATTCTCAGGCTCATTGCAGCATTATTTACACTAATCAAAATG
-TGGAAATAAGGTTAATGTTTATTGGCAGATGAATAGATAAAGAAAATGTGGTATATTCATACAACGGAATATTATTCAGC
-TTTAAAACAAGAAAATCCGGCAATATGCAACATGGATGAACCTAGAGGACATTAATGCTACGTAAAGTAAATCAGTCACA
-GAAGGACAAACTGTATGATTCCACTTGTATAAAGTATCTAAGATAGCCAAATTAATTAGAATCACAGATTAGAATGGTGA
-TAGCCCTTTAAGTTGAAATCAATTTTACATTCCTGGGTTTTGTAGTTTTGCTATCAGGATTCTGACTCATAAAACAAGTT
-TGGAATTCCCCCCTTCTTCTGAAATAATTTAAAAATTTTATTTTTTTAAAACGTTTGAAAGAATTCACCAGCAAAACTCT
-TTGGATGTGGAGTTTGCTTATTTTTTTATTTCTTTAGTTTTATGTTTTTATGTGCAGGTATTTGACAATTTAATTACTTT
-AATAAATGTCAATTACTTCATATATTCCATTTAATCTTGTGAAATTTTTTATAAGTTTCTTTTCAAGGAATTCACCCTTT
-CATCCAAGTAATGAAAATTAGTATAAAATGTTTCACAATATTCTATTATCTTGTTAATGTCTCTTGTGTCTACAACTGTA
-CAATCTCATTAATCCCTGATATTTATAATTTGCGTTTTCTTTCTTTCTCACAGAACTAACTTTTGGCCATGTTAATTTTC
-TCCTGTGTCTGTTTTCTGTCTCATTGATTTCTAATTTCTGTTTTATTTTCTTTCTTCTACTTGTTTTGGACTTAATTTGT
-TCTCTTGTTTTAGATTTTCTTTTTAAGGTAGAAAATTAGTGCACTTGTTTTGAACTTCTCTTTTTTAGAATAAGCATTTA
-TACAAAAAATTTACTCTGGGTCTGCTTAACTTATCCCACATATTTTGATATAGTATATTTTTATTTGTATTCAGTTCAAT
-GTATTTTAAGGTGTTTCTTATGATTTCTTCCTTGAGCTAAAGGGCATTTTAAGGTGTATTTAAATCTTCCAATAGTGTAG
-ACTTTCCTGGGTAGCTTGTTTTCACCCATTTCAACTCATTTTCATTATGGTCAGAAAGTATACTTTCTATGATTACAGTG
-TTTTGAAACTTCTTGACAGATATTTTGTGGTCTATAGCCTATTGATAAATGTTTCATGTGTAGCATAATAGAACATATAT
-TCTATTTTCTTGGTCAATATCGATTAGGTCAGGGTGTTGTCAAAATTATTTTACCTTAACTTTCTTTAGTTATTCTATCA
-GCAATACAGCATTATGTCTTCATAATTACTTGACATTTTATCATTATGAAATAGCTTTCTGTTGTAATATTGCTTGTTTG
-GAGGTCTACTTTTTCTTATATTAATATAGCCACATAAGATTTCTTGTGCTTGTTGTTTCCTTGGTATACTTGGAAATTAT
-TTAACTCTCAACTTATCTATACCATAATATTTGGCATGCATCTCTTATAGGTACTTTTATTATATAGTTGGACAATCTGT
-GTTTTATTTGGAGTATTTAAATTACATTTGAAATAATTATTGATAAGGTTGGAGTTAAGCCTACTATTTTTGCTTTTTTT
-TTTTTTTTTTGAGACGGAGTCTGTCCCTGTCGCCCAGGCTGGAGTGCAGTGGCGGGATCTCGCCTCACTGCAAGCTCTGC
-CTCCCGGATTCATGCCATTTTCCTGCCTCAGCATCCGGAGTAGCTGGGACTACAAGTGCCCGCCACCATGCCCGGCTAAT
-TTTTGCATTTTTAGTAGAGATGGGGTTTCACCGTGTTAGCCAGGATGGTCTCGATCTCCTGACCTCGTGATCCACTCGCC
-TCGGCCTCCCAAAGTGCTGGGATTACAGGCTGAGCCACCGCGCCCAGCCTATTTTGCTCTTATCTTCTATTTGTTCCATC
-ATTTTTTGCTCCTCTGTTCTTTCTTTCATGCCTTTTTATATTAACTGAACAATATTCAGCGTTCCATTTTAATTCCTTTA
-TTGGCATTTTAGAAGAATATCTTCATATAATGTGGTGGTTCTCTAGGGATTGTAATAAACATCCTGGGCTTATCGCAGTC
-CACTTACTGTTAATAGTCAACGTTTTCATGGAACATAAAGAAAAGTTGTGGCAAAATTGTTGCGTTTAGTCTCCTGTCAG
-AGCTATTAATTTAGAATATTTTACTCTACATACGTTATCAATAGTACTCTTAATTTTTTATTTAAACCATCAGTTGTTTG
-TTATAAAACTAAAAGAAAAAAGCCTTAGTTTTTCCTGTTTATGCACATGCCATTCCTAGAGCTTCTCCTTACTTCCTGTA
-GGTCAGAATTTCCATCTGTTGTTATCTTTCTTTAGTCTAAAAAATTTCCGTTTGCATTTCTTGTATCTAGGTCTGCTAAT
-GACAATTGTTCGAAGCTTTCTTTTATCTGAATAAATCTTTATTTTCTCAAGAATTACTTTTTCTAGTTATAGAATTTGGA
-GCTGACAGTTTTTTTTTTATTTTGAAGATGTAGTTTCATTGCTTTTTAAAGTGTCATTTCTGATGACAGGTAGATGACCT
-ATTTGTTTCCACGTATGTAAATTATTTTCTCCCTCCCTTTAGCTACTTTCAAGATTTACTCTTTTTTTGCCCAGTGTTTT
-GACTATGGTATGTCTACATTTGGTTCTGTATATTTTTATTCTGTTCTTTGAGTTTCTTAAACCTGTAAGTTGATATATGC
-TGACAATTAGGAAAACTTTTGGTCTTTACTTTTTCAAATAGCTTTTTCTGTCTCATTTTCTTCTCTACTCTTTCTAGGAG
-TCCAATTATATTAGTGCTAGACTGGTCATATTTTTATTATTTTTCTCCTTTGTATTAGCTGTATTGGGAAATTGTTCTTG
-ATCTGTTTTTAAGTGCACTGATAGTTTTTTCTGCCATCTTTAATTTACTGGTATGTGCATAAAATGACACTTTTATATAA
-GATATTCTGTCTCTCAGTTCTAAAATTTGTCCTATTATCCCTTTATCATTTTTACTTCTCTGTTGAGATTCTCCATATAT
-TCTCTCTTATGACCATCTATTCCTTAAATCCTTGAATATGCTTATAATAGCTTATTTTAAATTTCTCATCTTCTAATTCC
-AGCATGTGGGCCATTTCAATGTCTTAATCCATTGTTTACTTTTTTTGTTATGTGTCATATTTTCCTGGTTCTATGTCTAG
-GCAGGTTAAATTATATGTTAGATTATGTGTATGATATTTTGTAGAGATAGGCTCTTTTATTTTCCTTTGAAGAGTGACTC
-TTTTCTAACATTAGTCTTCTTTCTGTAGTCAAACACCAAACTTTCACTCCTGAGCTATATGCAATGGTTGAAATCTCTGC
-TCTGTACTAGCAATTTAGCTGTTGTTTTCTGCTGGATTCTATGGAGTCTCTTTTTATGAATGTGAAATGTAGCAGCCATC
-ATATATCTGAATGAAGTTTAAGTGCTGATTTTAGATTTTTACTCTGTGACATTCTCCTCTGTGACTTTCAGTTGTGTGAG
-ATTTCCTCCCATGTCATTCAAATTTCCCAATTCTTCTTTTCTGTCAGCCTGGAACTCTGTACTCTTATTCCTCAAGCTAG
-TAAAACTCACCGCTTTACTCTTAGACATCTAATTTTGCACAGACTTGGAAGTGTCATCAGGTGTGAAGTTACATTGATGC
-AAATTTAAATCATTGCAATTTTCTTTATTCAATGGTCAAATACTTCATCAGTGGTTGAATATTCTACTATTTCTGCCTGT
-TTTCTGTTTCTCATTACCATCAAATGTGTATTTAATTTTTTTTAGAGTTAATAGTTTTTTTCCCTGCATTTGAGTTAGAC
-CTGAGCTACTACCACATTTTGTAATTCAAACTTTTTGTCTAACAATGTTTTAAAAAACTCTTTATTTGGAGGGAATTCTC
-AAATTTCTAAATACTCTACAAACATTAGGATCAGGGCTCACATTCCCAGTTTCCCTTGTAGCCAGATGTGCATATCGAAC
-ATGGCCTCAGCTAATGAAGCATACCCACATATTTGAAAGTAAGAAAAGTGTTAAGAGGAACTGTAGATATCATTTTAGTT
-GATGTAAGGATGGAAAATAAATAACCAACTTTCACTGGTGAACTTTGTCTTCAATCATTGTTTTCCCGTGGGTAAGCAGC
-TAATTTTCTGGCCTAGAGGTGAAATTGGTGTGTTGGTAAGAATTGATTTAATGATAACCTGCTTTTGTCTTTTTAAAAAT
-TGTGAATCCACCATTGTTTCTGGTCCTGTTTTATACTTATGCAGTGTATAATCTCTCATGCAAAATTTAGTTCTTTGTTT
-CTCAGCTTAAACTGGATTTTGATGAGCAGTTTTCACCTTCAAATGAAAGAAATGGCTTTGGTTGATGTTAGACAAAAATA
-ACAAGAAGGAATTAAAGAAATTTGTTTGTCATCTTGTAACATTAAATAAATGAAACTGAAAATTCAACAATTCTGTTTCA
-TAAAAAAGTAGAAAGTTTCTACTGTTTTTCATTATTTTCAAAGCTATATCATTAAATGAAATTTCTGCCTCATGGAAGGT
-TTTTAGAACTATGTAATAATACCATACAGACCATTAGGAGAGAAATGAATAAAGACTGAAAGAAGTAAGCACTGTGTGGT
-AACATAGATGGTGCACAGTTGTGTGTGTGGAGCCCTAATACATTTGACCATGGAATTTATACAATAAATGTCAGTTTCCT
-GTGAACCTGCTAATTAATATGACTTTCGCAGACCTTTCCTTAACCTAAACTGTTTAGGTTTCCTGTCGACAGACTGCATG
-TATTCTCACCTTTAACCTTTCCATAATCTTCCCTAATTACAGATGTCATTGGTTCTTAATAGCAAAAGAACAGCAGTAGC
-TTATAAAGTTATATTATTTGTTTTTTACTAATATGTGAAGTGATTTTGTCTTTCATTTCACCTCTAGAGCTAATTATGTC
-TTCTAGGTTAACAAAAATTCCAGATCATACCATCATTAGTTTAAACTTTACAATGAAATCATTATTTCCATTTATTACTA
-GCCTGCATTATAGCAATGTTTAGCTAATGAATTCTCAAAATATTTCTTGAAAGGTGAAAGAGTACCTCAAGTAAATGATG
-TAATTAATTTATTTATCAGAATTTTAAATTAAGTGTTCTGTTTAATCTCAAAGGGGTACCAATGAAGTCAGGGCATAAGG
-ACTCTGGTTAATAAAACGGTAAGAATTAAAAAAGATTATTACATTTTTCCTCATACTATGATGGCTATAATTTTTAAAAC
-AGTAGAAATGTTTAATTTTTAAAGGCTACTAGTGTCTATTTCATTCAAAGATGTGAGCTCTTCAGTTCAACTTGTTGTTT
-GAAATTTGAACAGCTTTTTCTTGCTTTTGTTCAATACAGTTATTTAACAGTCCAGGCAGGCCTCCGGAGTTACATATATG
-TATGTGGCTATGTGTGTATATATACATAGAAGTACAAATAGCATATAAACAATTTACATAAGACTTTTGCTTTTGATGAA
-AATTCTTCTAAAAGTGAATATAAATTAATAGCATATGGAGCCTACAAAAATTGTCCAATAGGGAACTAGGAAAAGATAAT
-TTGTGAAGAAAAAGTTTGCTAAAACAGACTTTTTATTTTTACATGTAATAACTTTATATTGAAGGGTTTCCAGAAATATA
-AAATGTTATAGGGCACTTATCCTGAGACACATGAAGGAGACAAGGGATAGAGCTAGGATGGAAGTGAAAATAAAGGACAA
-ATAGAGATAGATACTTAAGTGGAAATGAAACACTGCATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAACACATAC
-ACACAGGAAGGGGAACATCACACACCAGGGCCTGTTGTGGGGTGGGGAGAGGGGGTAGGGATAGTATTAGGAGATATACC
-TAATGCTAAATGATAAGTTAATGGGTGCAGCACACCAACATGGCACATGTATACATATGTAATTAAATTGCACGTTGTGC
-ACATGTGCCCTAAAACTTAAAGTATAAAAAAAAAATCATCAAACAGGAGGTAATTTCAAAACATGGCTTTTCCAGGCAGC
-AAATTTTCTGAATGTATCGCAAAAGAAGATAAATTGCATGTCTATGTAGATCATGTCAATGAAATAAACAATAAAGTTAC
-TTATTGGAATATTGAAAGTGGTTGATAATAAATAAATTATTTATATTTATGGTAAAAGCAATAAACTTGATTTTTAGGGG
-GTTCAATGACTTCCTGAAAATATCCTCTCACAGATTTTCTCAGAGTGTCTAGTTGGCAAAAGCACAGCTCCAAATAGCTA
-TTTCTGTCAACGTCTACAGAACATTTACAGTTTGATTTCTAAAAGTTTCCATTTCTACTGACCTTACAAATTTGTAAAGT
-GAATGCCCACCAGGACAAAATATTAAGTGATAAAATTAATTGGATCCTACAAGTGCAAATCTAGGCAAGGAAAATCTTCT
-TCCTTCTTAATGAATGATTTTTATGTCTCTTCATTCTTGTCCTTCTAGGTAGAGCAACACTCTGGAGACCTTCTTTTGAG
-GCATTTCACCACCAGAGTAAGTGTGATGTGTGAGTAATTAGTCCACCCACAGGGAGCTGGTGAAATTAAATTGGAAGTTA
-TTTCCTAACTGGCATATCTTGGAGTAAAATTAATCTAATAACAGCTTTCATAAGAGAGCATAAGCTTAAAAGACAACATT
-TTTCATTCAACTTTACCAAACAAAGTGCAAATTTAGGTGTCCAGTTGTGAAGTTTTGTTGTGTGTGGATTGTACAGTGAA
-GGTACCAGTGGACAACAGTTGCTCATCAAGCAAGTTTATACAAAAGCTTTCGGACAAGTCCAACTCTAGATAAAATTCTA
-AAGTATTTCATGCTTGTGTTCAGAGTTTCTTTTTCTCTCTCCAAGGTAACCCACATATCAAAAGACATATGGGTTGTGGG
-TAGAACTTCCTAAAATTGCTGGTGAGAAGTGTGCCATGCATAAGCATACTTCACTAGCTTGAATTTTCTGTTAGTCTCAC
-AGGCAACAATTACAATCCTGTATGATTTTCTATCTCCACACACTCCTGAATATAGAAAGACCAAGTAACATCCCTGGTTA
-AGATGTGTACAGGTTCCAAGACATGTCTAAATATATTCACCAAGAGGTTTATTATTTTCACAGTGGCATTCACTAAATCA
-GTTGTCAGTGTAGCATTACTCAAGGAATAAGCAGGGTCTTTAATTTATCAAAGTTTGGAGTGCACCCCAAGTTGGATCAC
-TGAAGCACATAACTATAGATAAGATCACTCAAAAGCACAAATCCAGGTAATAAATATTCACTAGTAGTTTATATGCATTT
-AGCAATTTGAATGCTGGGAAGTGTAGCCCAGAAAATCAATCGACATGGAGCTATTAAAGAGGCATTCATGGCACCTGCAC
-TTTGAATCTCTTCAGACTCAGGTTAAACAGGAGACATGTTAGCTCATGTATAGTGCAAAAACCCGTCCTCTTTCCCTTTT
-TATCTATGAACCTGCCCTTTTCAATGTTATCTAGATGCCTGAAGGTATGAATACCCTTGATCTTGGTAAAAAATGGTACC
-ACCCGTCAGCAAAATCTCACTGATCAGTGTCTATGTTACCTCACTGAGTTAGCCTTTTGTGTTGTTGTGGCCCAGAATGA
-CAATGTTGACACAATCCAAACCAGTAGTTGGGAAGTTAATGTTGGATGCGTCTTTGACAATTGATGGAATGACCTGAAAT
-CAAATGTGAGGCAGTGGAGACACAAGAATGCTATTCAGGAAGTTAGTGATCTGTGGAGATACTAAATGAAATATCTGGAA
-GGAAATGTAATCTTGCAACTATGCTTTTATGTGTTTTTTGACATAAACAGTTTCTATTTATGGTGGAGCTAGAGTGTCCA
-TTTCCCATGAAGTTCCCATAGTGTTAACTAATACAGTCATGTGTCACTTAATGACAGGGGTGTGTCTGAGAAATGCATTG
-CTGGACGATATTATTATTGTGTGAACATCACAGAGTTTACTTACACAAACCTAGATGCTATAGCTGATTACATATCTAGG
-TTAGGTGGTATAGCCTATTCCTCCTAGGCTACAAACCTGTGCAGCATGTTATTGTACTGAATACTGTAGGCAATTGTAAC
-ACAACAGTTAAGTATATCTATACTTACTTATATCTATACAGTAAGTGTATCTATACATGTCTAAACATACAAGAGGTACA
-GTAAAAGTACAGCGTTATGATTTTATTGCACCACTGTCATACATGTGCACTATCCTTGACCAAAATGTTGTTATGTGATG
-CATGATTGTAACAAAAGAATTAATTAAATATAATATTGAAGTGCCTATTGAGATTTCAATGAAGAGAGGAATATTTGTAA
-ATTCTGATTACCTTAAGTGGGAATTGACTTTCTTCCTGTTTCCATGGCTGTTCTTGTGAAAGAGCATAGCTTTCCAAAGA
-CCTGAAATCTCTGACAAATCTTGCAATTCTCTATTGCCTGCATTATGAAAGTCACCTGGTATCAAATGAGGCAAAATTGT
-AGATTATAAAGACCTGTACTTGTCAGTTCCTAAACATAGCAAGCCTTGGTCTATCTTGAACATTTCTGCAGTTATAAATG
-AGCCTTGGGTCATGATTTTCTGCCTTTTTATCATAGACAAGATTTAATTTAGGAGATGTCCTTTTAATGTGTAATGTGAA
-TAGTAAGTGACACTTATGAAGCCTATTTTCTTCCAGCCATTTTAATTGTCAAATCTGTCCAGTCAAGATGCATTGTTAGA
-GGCTTCACTGACAACACCGTCTGTGTGTGTGGCTGTGTGTGTGTGTATACATACACATGGTTGAGCAGGATTTATTGTAA
-GTCAAAACAGTCTCAAATTTCTTTGGACAATACAGCTTCCTTGGCCATTCCCTTGGAGCTCTGAGTTGAGGAGCTGGTGA
-TGTGTATTTCTCTTGCATGTTCTCCACATTATCCCTATGCAGGTCTTCCATGGGCTTGGTTTTGGAACCAGTGATGAGGA
-AGATCACTAGAATTGTTGTTGTCAAAAAGATGCCTCCATTCTTCTGTATAAGCAATGGCAATTTTCCCTGACCAATATTT
-CTTCTTTTGAAATGGTAAATTTTGAATATTAACTGATTAATATAATCCCATAAAATAACAAAGTTTGAGCCCTATGATCT
-GTATTTTAGGCTAAAGTTGTGTTTTATGCTAAATCATCATTTACTCCATGTATGATCTTTTTTTTTTTTTTTTTTTGAGA
-CAGAGTCTCACACTGTCACTCAGGCTGGAGTGCAGTGGCACAATTTTGGCTTACTGCAAGCTCCGCCTCCCAGGTGCACA
-CCATCCTCCTGCTTCAGCCTCCTGAGTAGCTGGGACTACAGGTGCCCACCACCACACCCAGCTAATTGTTTTTTAAGATT
-AAGGGCGAAATAAAAGCTGCTCTCCTATATTACATTCATAAATCAGAATTATTAAAGCAAGCTATTTATTTATTACAAAC
-ACATACTCCAAATTTAGCATCTAAGACATGACAGTCTTTCAAGAGACATCAATTTACTTTTTAGGGTCTATAGCTATATT
-TGTATTCATGTTATTGGTGTCCATAATATTTCATTAGATGTTCTGGGTAAATTGATAAATGAAAATAACGTATGTGATAA
-GGAGAACAACCTAGGTCTCCTGGAGGGCCCCTTACAACTCAGCTGGTGTTAGCAGAAATGCCTGGGTGTAACAGTGAGAA
-ACAACCTTTCAAAAGTATTGAGCAATTTTTCAGGCAGAGGAATATGTATGCCAATCCAGGCAGCCAGATAAGTGGAGGTC
-AGTTAAAAGATCAGTGTGTGATTACATTTTTTTTTTAAGGTTTCTACTGAGAGGAAATATAACTCTCAGTTATTATTTTC
-TCTGCATATCTCTGGTTATTTTGTCACAACTTTTTATGTAAGCTACTACCAAACACTGGGTTATCCAAGATCTATGGGTC
-GTATTCAATATTTGCTTTTCCCTCAACTACTAACACGTTTGATTCCCTTTGTAACTTTCTCCCCTATTTCTCCTTTGAAC
-CTGTTTTCCCCAACCACACTGAGTTAATAAGCCTCCTATATACTCTCATACCCTGTTTTATCTAAAGAGATTTCCTTTTT
-CTACTATTATACCCATCTCATTCCTTAATTTTTTCTTCTTATTTCTCTCTCTATTTTTTACTCTTTTAGGCACAGCTCAT
-GTCTCATGACTTTCAAAAAGTTTTTCTTCTGATATTCCCAGCTCGAATTAGGTATATCCCAATCAGTTTCCTTAGAATTA
-CAAGTCTGCATATTATTGGCTTGCAATCTGTCTTAGGCTGGGAATTGGCTCCTTGTAGGCAGGGACTAGAATTTATTTCC
-TCTTATGTCCATAATGCCTGACACAGGAACTATTCTCACATACAAATTGTAGGGCCATAATTCCTGAGAACATATGTATA
-TTTTAGTGACTCATAAAGGCTTGAAATACATTTTTAAAATGATTAATTGGGAAGTCCATGAACTTGACATCTTGATGTAG
-AAGAAAAGCAAGGGCAGATGAAGAAGTTATACACGATACTTGAAATACCAGAAGAATATAATCAGAGAGCAATAAATTAA
-TCCTAGATTTTTAGATGTGAAGAAGTTCTGAGAAATATTTGAAGACTTGGCTCTAGGGATGAGTACATAACAGAGACCAG
-TAGCCAGACTCAGAGCTTTAAAGAGTGAAGAAATGGCATTGCAGGGGGAAGGACTGTTGTATACTAAATAGAAATTGTCA
-TTAAATGGAAGACTAAGCAAGAGGCTGATGATCTGTGGATGAGAGACCAAAATGGTGTGGAGATAGAGGTAAATGCCATA
-ATCTACAAAGAAGATATTTTTGTGCCAGAACGAAATGATAGGTCTAGAATGTAATAAAAGATAAATAGTTAACTACATTG
-TAATGTGGTCTGAGAACTCACTGAAGGCATAGCCATTGATATTAACTTCCACTTTGCTTCCAGACAAAAGATTTTAAATA
-TCTTAAAAATTACATTTGATATTGTATGATTCATCAAGACAAAGTAAAGCTGTAGTTGCCCTGGGGGGGTGGGGAATGGG
-GAGTCACTTTTAATGGGTACAGGATTTCAATTTTAAAAGACAAAAAGAATTATGGAGATGGGTGGTGGTGATGCTTGCAC
-AACATTGTGAATACATTTAATGACACCGAATTGTATAATTAACAGTGGTTAAGATGCAAATTGTTGAGTGTGTTTTGCCA
-CAATTAAAAAACAGAAAACAATAGTATTTGAAGATATAGCCCATTTCATCTGGTAGCTAGCTGTATGTGTCTGCTCAGCT
-GTGGATAGATATTTATGCTGTTTCTGAACTGGAGGTTACTGGTATTCTCTAAGGTATAGGAAAATTGATCTTATGTGGCT
-AACTGAGGTGGATATAGTTGTATCAGTCAGACAGTAATGATATAATCATGAGAGTTTACATTTAACACAACTTACATGTG
-TTATACTTTAGAAAGCACTTCATAGATATTATTACTTCATACCATTTTCCCCTTACCATATTTGTCTCTCCTTTCTCTGC
-TGACTTCACAAAATGTCTGTTCCACACTACTCAGTTCATCTCCTTATTTTGTCAAAATTTTAAGTATCAGAGTCTCCAAA
-AAAAAAATTCCAGACAAGTCTCATCAGCTTTCGGTCATTGATTAATCGATGCTCTTAGGGGGTTTCCCTTCCCCTTCTCA
-ATTTAACATAGCTTCCCAATTCACTTGCCAGTAAAACAACGTTGTTTATATGGTTTTGTATTTCTTCCTGCTGAATTATG
-AACATTTTTTCATATTGACATTGATTTCCATCTGGCCATGAAATACTCAAGGTGAAGAAAATGAAACAAAATTGTTAATA
-TTTATCAAGAGCCAGGTACTGTTTTCAGTGTCCTAGAAGCATAAACTAGTGTAATGCTCACCAGCTCATATGAGAGGCAA
-AAATGGATGAAACTATAAAACCAAGACACAGAGAGTTAAGGGAAATTTCCCAAGATCACACAGCCACTGAGGCTATGAAC
-TAGATTTTGACTTCAGGCTGTTTACCCCAGAACCTGTGCTTTCAACCGTCATTTGTACTGCTTCCCTAAATTACACTTGA
-GTACACTGTGACATCAAATTTCACCTATGACACTGATTATCTGGGGAACTTTGCAACTTATTCTGAATATGACTCAGTTT
-TATTTTCTGTACAGAGGTAAAGTCAGTATATACTCCATAGATTTGTTATAAGGATTATATGAAATGACACAAGAGAAGGC
-TTTAAAAGGACTTGGAAAGCAATAAGCTTTTTTGTTTTCAATCATTTTTCAATAGGTTATCAGTGTTGTGAATGGTTCAT
-GAAAAATGACTTTGGGCTCAGTGAGTAACTGAAATGTTGTTGTTTAATAGTGTGTTTAATATTAATATAATAGTAACAAA
-TGTTGTTATTGTTGAGTAATAGTTATTTGGCTTTTCGCTGCTTTTCTTTTCTAGTGTTTTAGTCAGAGACTTCTTAAGTC
-TCCTCAAGTGTGTACACATTTCTTAAATTTGTTGGAAAGTACCAAATTTAAGATATCTTGCATTTTTTTTCTTCCTTAGT
-AAACACTAAATTCCATCACACAGCAGAAAAAGGGCTCTGTTATTGTCGGTACAATGGTTTAATATTCACTTTTATTCCCT
-ATATCATAGTTCTGATTTAATTACTATTTAGAATAAAACTTGTTCCTTATTATATGCATTCATAATTATAAAATTTGTGT
-TTTAATGCCTTCTACAAATATACTGTGCTTTTCTTTATTTCCTTATATCTTTTACTGTTGCATGATCCTGGTATTTGAAA
-TCTCATTAAGTGTTGTTTGGGGATTTGCTGGGAATGTCATCTACATAGTAATGTCTCAAGTTTGTAGCATCTTTAAAACA
-TAATAGGAGACGGAATTCACAGCAGAGTAATAAGCCTCCCACTTTAGGCAATATATTTGTGATTGACATGACTTTGTTCC
-CAGAGGGCAGTTAGCAACACAATATTATGGCTATGTGTACAAGGAAAACAAATTTTAAAAATCTCCTTTAAAAAAAACAG
-TTCCCAATCCTAACCAGTATCATGCACAGAATCCGTTTCCACCTCTTCATATGGAAGCAGCTCTGGGTGGACATCTAGAA
-AGTTGGATAACTATTTATCACATATGATCTGCAAAGGGAGAGATTTACAAGAAAGTATTAAATTTGATCCATAGGAAAGC
-AAAATCAAAAATCAATGAATTTTCCATTTGTAGTTTTCCCTAGGGGCTCTACTCTCAAGATGGCTTAAATGCATTAGAAT
-TCAATGACTAGGCACAATTGTTTGTTAGTGACATAAAAGCAAGGTAAGCATTTCTGCTTTATGAGTCCAAGCACAGGGAC
-ACTTGGTTTTATTTGGAAGGATATCATAAAGGCAATGTTTATGAGTAATCCCTCATTGTCTTTTCTTCTGTAACATTCAA
-TGCTATGTACTAAAATTTAGAAATGAAAACTACTTAAAGACCACCTGCTAAGTTTCATGTATTTCAAATTCTCAGATCCT
-GAGTGTTTAAATATGTCTGTATTTCTTCATGAAAAAAACATAATCTTTGCCAAGTTAGAAAAAGAAAAACTCATATTCCC
-ATTTTTAACTAAAGGTAATCAGAAATTTGGACAGTTTTTAGCCTTCAATACATTATGTAATTTGGGTAACAGGCTGAATA
-AAAGTAAGGAACTTCAGTTAAATTCAGAGAGAAGCTAGTAATTATTTCTAAGACTCAAATGTATAGAACAGATCTCTGAT
-ATTAAGGATAAGACCCTCAAAGGTGACACAAAATGGGTAATTGTGGGATTATTTTAGGAGGAATCATCATATATTCTTAC
-TGCTATAAATACAGTCAAATGTCAGATAAATATACTCCACTGAAATGTTTTCTAGGAATGATGTTGGAACCAATGTTGAT
-AATTTTGAAAGTCATGGAGAGGATTTCAGATGATAGAAGTCGGGCAAATATCCCAGGTTTAATAAATAAGCAAATGGTGA
-GTTCCAAAGCTGCTGTATCAGTGAGCCTCATATTGATCCTGAGCACAATTTCAGAAAGGTCCATTAAATGGGTCTTTGGA
-GAGCACTTAGGATAAGAGGCTGGCAGCAAAGATTCACTAAGAACAATGGTGCCAAGCTTGCCTCTTTGACATTGTTATCT
-GACTGATAAAGGTAGGCTATAGCGGTACACAATACAGATATTTCCAGGGTAAAGCTGTTGAGCTGCTGTAATTTTCCTTG
-CCTCTTCACTATCTTCTCCTATAGTTGACTCCCAAGGAAAAGATAGTTGACTTTTAATCTAGAAATGTATGTTAATTGGC
-AAAAACAAAAAAATGAAACCATAAAATATCCTTTAGGCTTCTCTCTGCTCAGTTATTAGATCATATGAATGTGCCCTTAG
-GAAACACAGAAGGCCCACACTATTATAGAGACAAATTTCTTACATTTTCTGCTGTTTAATGCTCTTCAAAAGACTTACCA
-TACTTCACTAATTTGATTACCAACTACTTGAACACAGGGACCAATGTGTTTATTAAAAATTTTGCATATTATGAGGGCAT
-TAACTTTTAATTATTCAATTGTTAAGACAATGCATATTATTATAAACCATAGAAGGCACACTTATTACCTCCTTAAGAAC
-CAGTCTCTATTTCTCTGGTTCATAGATCTCCAAGTTTATAGAGGGATTGGACATTTGTGTCTTCAATTGGCCCTCTTCAG
-CCCTAGGATAAATAGTGATTAATCTAAGCCAATAGTTTTCGGCTCTGTCTGACCCAATGCCTCTACTTCATAAGAAATTC
-TTCAAAGACCCCTTCGCTATTCTAAATTATTAGTGAGAACACAATGTATGCATTCAAGTTGTTGAAAATATTAATGTTAT
-GCTGAAGCTAACAAAGGAGAAATAATTTACTGTCAATATATAATCCAAAATGTATATAATTGTGCCAGAACATTTACATA
-TCAAATACAATAGAACATAATGAAATTTTCATATCTTCGCCCATACCTTGAAACATTGTAAATAAAAAGTTACAAATATA
-GTTTCATTGAATAACCAAATGCCAAAACTGCCATTTCTATTGTTGACATGATTGAACTGCATTGGTAAATGTAATAGATA
-CTTTCTGTTTGGCCCTTGTCCCCTGTTATACTCCCCTGTTTACTGGCTTTTGTCCAAGTGGAATGGTCCATATTGAATAT
-CTCCATCGGTTCCCTTGTTCATTGCCTTCTATGCATGTTCATGAGATTAAAGGGAAGGAGGAAATGGGATTGGGGGTTAT
-TGCCTAAACTCCCTCTCTGCTAGGTCTCCTGGACCAATCTTTTTCATAAGAAAATTAGTGGGCCGGGCGCGGTGGCTCAC
-GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGTGGATCATGAGGTCAGGAGATCGAGACCATCCTGGCTAACAAGG
-TGAAACCCCGTCTCTACTAAAAATACAAAAAAAATTAGCCGGGCGCGGTGGCGGGCGCCTGTAGTCCCAGCTACTCAGGA
-GGCTGAGGCAGGAGAATGGCGTGAACCCGGGAAGCGGAGCTTGCAGTGAGCCGAGATTGCGCCACTGCAGTCCGCAGTCC
-CGCCTGGGCGACAGAACGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAGAAAATTAGTGTTTCCTTCTGTGATC
-AGGGCAGTTTACTCCCCAGAACTCTGCCTGCCACTGCTAAACCAGAGTTATTGTGGGGTGTGATTTCTGTGATTCCTTCA
-CCCTTCTCCCCTGACATTTTCGTAAGTAGTCTCTTTGGAAATAAACCCAAGTTAAATTATCTTAGTTGGTGTGTTTTCTA
-TTTTTCCTATTGAGACTCTGAAATGAGTATCTAAATGAAAAAATCTACCATCTTTTCTCATATACATAGTAGTTTCATTC
-TTGCAAAATTCATGGCATATTAAAACCATGCAAAAGTACTTGGCACTTAGGCAGTTACATTTGGGATTGTATAATTAAAC
-AAAGCAGGTTATTCACCTTCATTACATTAGAAAGTCATTCAGGACATACAGCAATCCTTAATTAGGAGCGGCTATCCCAT
-GTTACTGGACATATGGTATCCCTGTTTTCCAATCCTTAAAGTTTTTCCTTAAAGTTCCAAAATGCCGTCACTTATTATTT
-CCTGCCATTGAATTTTGTCACATGAAGTTGTAAGGCTGGGAATGCCATAGCCATCTTGAAAACATAGGTAGAAAGATAAG
-ATAATCACAAAGAAGTGGATCATGTTGAATTAACTAAGCATTGATACCATCTATTTGTTGTGCGATTTGGTCAAAGTTGC
-TCCTTGTTTTTTTCTTCAATTAGTTGACTATTCTGTTACTTGAAGCTAAAAACATTTTTTTCTTTTCTTTCTTTCTTTTT
-TATTTTTGACAGAACCTTACTCTGTTGCCCAGGCTGGAGTGCAATGGCATGATCTTGGCTCACTGCAACCTCTGCTTGCC
-TAGTTCAAGCAATTCTCACACCTCAGCCTCCCTAGTAGCTGGGATTACAGGCACATGCCACCACACTCAGATAATTTTTG
-TATTTTTAGTAGAGATGGGGTTTCACCCTGTTTGCCAGGCTGGTCTCAAACTCCTGACCTCAAGTGATCTGCCCACCTCA
-GCCTACCAAAGTGCTGGGATTACAGGTGTAAGCCACTGACCCTGCCCAAAAACATTTTAACCAATAGCAAAGCACATTAT
-TTCATTATATTTTTTCAAAAGTTGCCAGTAATTTCAATTAAAAATATTATATAACATGTTTAATGCAATACAAATGCTTT
-TCAATGTACAATGGGGTTAAGTCTTGATAAGCTGATTATAAATTGAAAATACAGTAAGTTAAAAATGTATTTAATATCTA
-ACTTACTGAATATCACAGCTTAGCCTGGCATACCTTTAATGTGCTCAGAACACTTACATCAGCTGACAATTGGGCAAAAT
-CGTTGAATACAAAACCTGCTTTATAATAAAGTATTGGATATTTTATGTAATTTGTTGAATATTGTACTGAAAGTGAAAAG
-CAGAATGGTTATATTCTATTCAAAGCTATCACTTTTGCTTCATCATAAAGTAAAAAAAATCATAAATTGAACCATTATCA
-GTTGTTGACCATCTGTGTATATGTATGTGTGTGTGTACCTATATAAACATGTATGTTTATATATATATTTGTGTGTGTAT
-ATAACCTCGGTGTGTGTGTATGTGTGTTTGAGAGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTATGAAATTGTAGGGA
-AGTAAAATTTCTTATCTTATAGATATAGCATGTTAACATGTTGGTACCTATCCTCCTGAGATGTAAAATTTTACATGGAT
-AGATATGTACATTTACAGTTGTACACAAAGAGAAACATATTCTGTAGCCTCTTTGTTTTTCTGCAGTTTCATTCAACACT
-ATCTGGTTTATATGGGTGATTACATATATAATGCTAGGATTAAGGTTCTTCTCTATAACTTTGAAACTTCCTTGATTATC
-AACCCTTGGTATATTCTTAGAATAGGATTTTATTTTAGAATTAAGATCCTTGTTTCAGGACTCTAGACTGTTAACACACA
-GAGCCAATAATTATTCAGAATGGTTGGGTTAGTTCACATTCCCACAGAGGAGACATCAAATGTCCAGGCTGCACAGCCTC
-ATTAACACTAGATTTTCTGGACATTTTATATAGTATTTCATCTGATATAAAAAGTAGAATTCTAATTTGATTATGGTTGT
-TAATTTATTTTTACATTTTTAGTCATTATGAAAATGTTTTACTATATGAAAAGCCAGGAAAGGGTTTTTTTTTTAAGGTA
-GTACTTCAGAAATATTTATGATACTTAATTTTTAAAAATTAACTCTAAAAGAATCTTGAAATGTCTGTTTAATAAAATAG
-GACATAAATACTGGTCACATTAGTGAAAAATATTTGTTTAAAATTAAAATATCTGCAGCAATCCTGTAGATATTAATAAG
-TTTTTAAAGAATGACATCTTCAAAATATAACTGTTCTAAACTAATATGTCTCCATTAATACATATAGATACATATATCTA
-AATAAATTTGAAGACTTCAAATTCCAGGTACAATATAATTTTTTTCTATCCTTTGATTTGTCATTCAGGATTTTGTAATT
-TGAACAGAAATATTTTGCCCTAACCACATGTCTGTCTTTTCTCTTACTAAAAATATTATTTTATGTAAAATTGTTTTAAA
-GGTCAGTTAGCACGTTTGAAAAGCATCTTGTACAATGTTACATAATATATTGCATATTTGGTTACATTGTTTTAACTGTG
-TAAATATGGTTTAAATCTGTGATGCTCTTTAGTGCTGATCATGATGCAAATCAAATTTATCTGTATAAAAGGCTCCTGTT
-AATTTTTTTTATTATACTTTAAGTTTTAGGGTACATGTGCACAACGTGCAGGTTTGCTACATATGTACACATGTGCCATG
-TTGGTGTGCTGCACCCATTAACTCCTCATTTAACATTAGGTATATCTCCTAATGCTATCCCTACCCCCTCCACCCACCCC
-ACAACAGTCCCCGGTGTGTGATGTTCCCCTTCCTGTATCCATGTTTCCTCATTGTTCAATTCCCACCTATGAGTGAGAAC
-ATGTGGTGTTTGATTTTTTGTCCTTGTGATAGTTTGCTGAGAATGATGGTTTCCAGCTTCATCCATGTCCCTACAAAGGA
-CATGAACTCATCATTTTTTATGGCTGCATGGTATTCCATGGTGTATATGTGTCACATTTTCTTAATCCAGTCTATCATTG
-TTGGACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATACTGCCACAATAAACATACGTGTGCATGTGTCTTTAGAG
-CAGCATGATTTATAATCCTTTGGGTATATACCCAGTAATGGGATGGCTGGGTCAAATGGTATTTCTAGTTCTAGATCCCT
-GAGGAATCACCACACTGACTTCCACAATGGTTGAACTAGTTTACAGTCCCATCAACAGTATAAAATGTTCCTATTTCTCC
-ACATCCTCTCCAGCACCTGTTGTTTCCTGACTTTTTTATGATCGCCATTCTAACTGGTGTGAGATGGTATCTCATTGTGG
-TTTTGATTTGCATTTCTCTGATGGCCAGTGATGATGAGCATTTTTTCATGTGTCTTTTGGCTGCATAAATGTCTTCTTTT
-GAGAAGTGTCTGTTCATTTCCTTTGCCCACATTTTGATGGGGTTGTTTGTTTTCTTCTTGTGAATTTGTTTGAGTTCATT
-GTAGATTCTGGATATTAGCCATTTGTCAGATGAGTAGGTTGCAAAACTTTTCTCCCATACTGTAGGATGTCTATTCACTC
-TGATGGTAGTTTCTTTTGCTGTGCAGAAGCTCCTTAGTTTAATTAGATCCCATTTGTCAATTTTGTCTTTTGTTGCCATT
-GCTTTTGGTGTTTTAGACATGGAGTCCTTGCCCATGCCTATGTCCTGAATGGTATTGCCTAGGTTTTCTTCTAGGGTTTT
-TATGGTTTTAGGTCTAACATGTAAGTCTTTAATCCATCTTGAATTAATTTTTGTATAAGGTGTAAGGAAGGGATCCAGTT
-TCAACTTTCTACATATGGCTAGCCAGTTTTCCCAGTACCATTTATTAAATAGGGAATCCTTTCCCTATTTCTTGTTTTTG
-TCAGGTTTGTCAAAGATCAGATAGTTGTAGATATGCGGCATTATTTCTGAGGGCTCTGTCCTGTTCCATTGGTCTATATC
-TCTGTTTTGGTACTAATACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAGCATGATGCCTC
-CAGCTTTGTTCTTTTGCCTTAGGATTGACTTGGCAATGCAGGCTCTTTTTTGGTTCCATATGAACTTTAAAGTAATTTTT
-TTCCAATTCTGTTAAGAAAGTCTTTGGTAGTTTGATGGAGATGGCATTGAATCTTTAAATTACCTTGGGCAGTATGGCCA
-TTTTCACGATATTGATTCTTCCTACCCATGAGCATGGAATGTTCTTCCATTTGTTTGTATCCTTTTTTATTTCATTGAGC
-AGTGATTTGCAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTGGTATTCCTAGGTATTTTATTCTCTTTGAAGC
-AATTGTTAATGGGAGTTCACTCATGATTTGGCTCTCTGTTTGTCTGTTATTGGGGTATAAGAATGCTTGTGATTTTTGCA
-CATTGATTTTGTATCCTGAGACTTTGCTGAAGTTGCTTATCAGCTTAACGAGATTTTGGGCTGAGACGATGGGGTTTTCC
-ACATTCACAATCATGTCATCTGAAAACAGGGACAATTTGACTTCCTCTTTTCCTAATTGAATGCCCTTTATTTCCTTCTC
-CTTCCTGATTGCCCTGGCCAGAACTTCCAACACTATGTTGAATAGGAGTGGTGAGAGAGGGCATCCCTGTTTTGTGCCAG
-TTTTCAAAGGGAATGCTTCCAGTTTTTGCCATTCAGTATGATATTGGCTGTGGGTTTGTCATAGATAGCTCTTATTATTT
-TGAGATACGTCCTATCAATCCCTAATTTATTGACAGTTTTTAGCATGAAGATTTGCTGAATTTTGTCAAAGGCCTTTTGT
-GCATCTATTGAGATAATCATGTGGTTTTTGTCTTTGGTCCTGTTTATATGCTGGATTACGTTTACTGATTTTCATATGTT
-GAACCAGCCTTTCATCCCAGGGATGAAACCCGCTTGATCATGGTGGATAAGCTTTTTGATGTGTTGTAGGATTCTGTTTG
-CCAGTATTTTATTGAGGATTTTTGCATCACTGTTCATCAAGGATATTGGTCTAAAATTCTCTTTTTTTTTTTGTCTCTGC
-CAGGCTTTGGTATCAGGATGATACTGGCCTCATAAAATGAGTTAGGGAGGATTCCCTCTTTTTCTATTGATTGGAAAAGT
-TTCAGAAGGAATGGTACCAGCTCCTCCTTGTGCCACTGGTAGAATTTGGCTGTGAATCCATCTGGTCCTGGACTTTTTTT
-GGTTGGTAAGCTATTAATTATTGCCTCAATTTCAGAGCCTGTTATTGGTCTATTCAGAGATTCTACTTCCTGGTTTAGTC
-TTGGGAGGATGTATGTGTCGAGGAATTTATCCATTTCTTCTAGATTTTCTAGTTTATTTGTGTAGAGGTGTTTATAGTAT
-TCTCTGATGGTAGTGTGTATTTCTGTGGGATTGGTGGTGATATCCCCTTTGTCAATTTTTATTGCATCTATTTGATTCTT
-CTCTCTTTTCTTCTTTATTAGTCTTGCTAGTGGTCTATCAATTTTGTTGATCTTTTCAAAAAACCAGCTCCTGGATTCAT
-TGATTTTTTGAAGGGTTTTTTGTGTCTCTATTTCCTTCAGTTCTGCTCTGATCTAAGTTACTTCTTGCCTTCTGTTATCT
-TTTGAATGTGTTTGTTCTTGCTTCTCTAGTTCTTTTAATTGTGATGTTAGGATGTCAATTTTAGTTCTTTCATGCTTTCT
-CTTGTGGGCATTTAGTGCTATAAATTTCCCTCCACACACTGCTTTGAATGTGTCCCAGAGATACTGGTATGTTGTGTCTT
-TGTTCTTGTTGGTTTCAAATAACATCTTTATTTCTGCCTTCATTTCCTTATGTACCCAGTAGTCATTCAGGAGCAGGTTG
-TTCAGTTTCCATGTAGTTGAGTGGTCTTGAGTGAGTTTTTAAATCCTGAGTTGTAGTTTGATTGCACTGTGTTCCGAGAG
-ACAGTTTGTTATACTTTCTGTTCTTTTACATTTGCTAAGGAGTGCTTTACTTCCAACTATGTGCTCAATTTTGGAATAGG
-TGTGGTGTGGTGCTGAAAAGAATACATATTCTGTTGATTTGGGGTACAGAGTTCTGTAGATGTCTATTAGGTCTGCTTAG
-TGCAGAGCTGAGTTCAATTCCTGTATATCCTTGTTAACTTTCTGTCTCGTTGATCTGTCTAATGTTGACAGTGGGGTGTT
-AAAGTCTCCCATTATTATTGTGTGGGAGTCTAAATCACTTTGTAGGTCACTAAGGACTTGCTTTATGAATCTGGGTGCTT
-CTGTATTGTGTGCATATATATTTAGGATAGTTAGTTCTTGTTGAATTGATCCCTTTACCATTATGTAATGGCCTTCTTTG
-TCTCTTTTGATCTTTGTTGGTTTAAAGTCTGTTTTATCCGAGACTAGGATTGCAACCCCTGCCTTTTTTTGTTTTCCATT
-TGCTTGGTAGATCTTCCTCCATCCCTTTATTTTGAGCCTATGTGTGTCTCTGCACGTGAGATGGGTTTCCTGGATACAGC
-ACACTGATGGGTCTTGACTCTTTATCCAATTTGCCAGTCTGCACCTTTTAATTGGAGCATTTAACCCATTTACATTTAAG
-GTTAGTATTGTTATGTGTGAACTTGATCCTGTCATTATGACGTTAGCTGGTTATTTTCCTCGTTAGTTTATGCAGTTTCT
-TCCTAGCCTTGATGGTCTTTACAATTTGGCATGGTTTTACAGTGGCTGGTACCAGTTGTTCCTTTCCATGTTTAGTGCTT
-CCTTCAGGAGATCTTTTAGGGCAGGCCTGGTGGTGACAAAATCTCTCAGCATTTGCTTGTCTGTGGAGCATATTATTTCT
-CCCTCACTTATGAAGGTTAGTTTGGCTGGATATGAAATTCTGGGTTGAAAATTCTTTCCTTTAAGAATGTTGAATATTGG
-CCCCTACTCTCTTCTGGCTTGTAGAGTTTCTGCAGAGAGATCAGCAGTTAGTCTGATGGGCTTCCTTTTGTGGGTAACCC
-GACCTTTCTCTCTGGCTGCCTTTAAAATCTTTTCTTTCATTTCAACTTTGGTGAATCTGACAATTATGTGTCTTGGAATT
-GCTCTTCTCGAGGAGTATCTTTGTGGCATTCTCTGTATTTCCTGAATGTGAATGTTGGCCTGCCTTGCTAGATTGGGGAA
-GTTCTCCTGGATAATATCCTGCAGAGTGTTTTCCAACTTGGTTCCATTCTCCCCGTCACATTCAGGTAAACCAAATAGAC
-GTAGATTTGTTCTATTGACATAGTCCCATATTTCTTGGAGGCTTTGTTCATTTCTTTTTATTCTTTTTTCTCTAAACTTC
-TCTTCATGCTTCATTTCATTCATTTCATCTTCCATCGCTGATACCCTTTCTTCCCGTTGATCACATCGGTTACTGAGGCT
-TATGCATTTGTCGTGTAGTTCTCGTGCCATGGTTTTCAGCTCCATCAGGTCCTTTAAGGACTTCTCCACATTGGTTATTC
-TAGTTATCCATTCGTCTAATTTTTTTTTCAAAGTTTTTAACTTCTTTGCCATTGGTTCGAACTTCCTCCTTTAGCTCGGA
-GTACTTTGATCTTCTGAAGTCTTCCTCTCTCAACTCGTCAAAGTCATTCTCCGTCCAGCTTTGTTCCATTGCTGATGAGG
-AGTTGCATTCCTTTGGAGGAGGATAGGCACTCTGATTTTTAGAGTTTCCAGTTTTTCTGCTCTTTTTTTCCCCATCTTTG
-TGGTTTTATCTACCTTTGGTCCTTGATGATGGTGACATACAGATGGGGTTTTGGTGTGGATGTCCTTTCTGTTTGTTAGT
-TTTCCTTCTAACAGTCAGGATCCTCAGCTGCAGGTCTGTTGGAGTTTACTGGAGGTCTCCTCCAGACACTATTTGCCTGG
-GGGGTATCAGCAGTGGTGGCTGCAGAACAGTGGATATTGGTGAACTGCAAATGCTGCTGCCTGATCGTTCCTCTGGAGGT
-TTTGTCTCAGAGGGGTACCCGGCCATGTGAGGTGTCAGTCTGTGCCTACTGGGGGGTGCCTCCCTGTTAGGCTACTCGGG
-GTTCAGGGACCCACTAGGTGGGGGTTGTCTGCCCGTTCTCAGATCTCAAGCTGCGTGCTGGGAGAACCACTATTCTCTTC
-AAAGCTGTCAGACAGGGACATTTAAGTCTGCAGAGGTTATTGCTGTCTTTTGTTGGTCTGTGCCCTGCCCCCCGAGGTGG
-AGCCTACAGAGGCAGGCTGTCCTCCTTGAGCTGTGGTGGGCTCCACCCAGTTCGAACTTCCTGGCTGCTTTGTTTACTTA
-CTCAAGCCCGAGCAATGGCGGGCGCCCCTCCCCCAGCCCAACTGTTACCTTGCAGTTTGATCTCAGACTGCTGTGCTAGC
-AAACAGCAAGGCTCCGGGGGTGTAGGACCCTCCAAGCCAGGTGCTGGATATAATCTCCTGGTGTGCCATTTGATAAGCCT
-GTTGGAAAAGCGCAATATTAGGGTGGGAGTGACCTGATTTTCCAGGTGCCATCTGTCACCCCTTTCTTTGACTAGGAAAG
-GGAATTCCCTGACCCATTGTGCTTCCCAGGTGAGGTGATGCCTTGCCCTGCTATGGCTCATGCATGGTGCGCTGCACCCA
-CTGTCCAGCACTCCCCAGTGAGATGAACCTGGTACCTCAGTTGGAAATGCAGAAATCACCCGTCTTCTGCATCACTCACG
-CTGGGAGCTGTAGACTGGGGCTGTTCCTATTCGGCCATCTTGGCTCCACCCTCTAATTTTTAACTTTCAAAAGATTAGAT
-ACATTTACCCTCTTCTGAATTTTAATTCCTGATGGAAAGATTGTTAAATCTCAAGAGGATAATGAATCAGCTTCTGATTA
-TATTCTGGAATTGAGATTTGATCACACATCCAAGAATGCGTATTCACTTTCCTTTACATTACACACATGCATAATACCAT
-GCTGAGTGATGCTGGAAAAAGTGAGTCTTCAGTAATGCCCTCATGAAATTACAGTCTCACTACACTGAGGTATTTTCTTT
-TTAACCCTTTCTTTCTTTTCTGTTGTGAATATGTGCCTTCTAAGAGGTGAACAACGGGAAAAACTGAAAAAGAACCTTCA
-TCTAATTCAGTAACTAGCTTTTGTATCTTCTAAGAATTTTTATCTCCAGAAAGCTCTAATTTTCATTCCTTTACAAGCTT
-TATTTCTCTCTCCTTTCCAACACCAGACTTTGCTCTGTTTGTTTTCTATATCTTTTTTAGAGATGCCTACAATAGAAAAA
-AACTATGACATATTCAATACATCTGAAAAGTTTGCATTACCATAGATAAGAATGAATTATCTGTTTATAAAGAAAAAATA
-ATAAAAATATGAACCAAGAAAGCACAGAAGGTAGTAACCACATTTAGATGTTTATCATGGAATCATCTTTATAATCCATC
-TGTTACAATTCCACACAGCAAATTACAAGTAATTGTGAAGTTTCCCCTCATTTTATAGGTTTGGTCTTATAAGGCATACA
-ACACAAATTTTAATTACTTTTCATTTTGGTATTTGGATCTTAATTTGGTCAAGTGGCCACTGGGTAGATGATGGAGACTC
-TTGAGACATGCAGTCTTCTTCTAGCTTTGTTGATGTGAATATTACTGTGTATTTTTCATTCACTTATTATTTTACAAGGC
-ATGCTTCATTAAAAATATATCAGCATCTCATTGACAAATCACAAAATTTAAAAGGCACCAGAAAAAAACAATTTATTTAA
-AACATTCCTGTGTAAAAGTAGTCACCACTCTTACTATTCTTCAAATATTTTTGTTATATTTAAACGCAAGCCTAATTTTA
-TCTCGAGTGTCTGACCTTGATGATATTGTACACTTTAAACTTAGAAAAATTGAACTCTATTGGAAATTTCCTACAGATCA
-GCTTTTCTAGATGCCAAGCGCCTTGTTTCAGCCATGGTGATGACAGCAAATTGGGTTCTCAGGGATTCTGGCCTCTGGCA
-TCATCTCAGTTGTTTATAATTGAAGTTGGGTCTGATGAGAATGCAGCTTAGATGCATGGTGGGACTGCTGGGCTTAAGGC
-TGGCCTGCCAGGAGGTTGCATTGAGGTGTAACTAGGCAAAGAAAGAAAGAGTTTATTGAGGCACTACTGACAATAGCAAA
-GACTTGGAACCAACACAAATATCCAACAATGATAGACTGGATTAAGAAAATGTGGCACATAAACACCATGGAATACTATG
-CAGCCATAAAAATGATGAGTTCATGTCCTTTGTAGGGACATGGATGAAGCTGGAAACCATCATTCTCAGCAAACTATCAC
-AAGGACAAAAAAACACCGCATGTTCTCACTCATAGGTGGGAATTAAACAATGAGAACACATGGACACAGGAAGAGGAACA
-GCACACACTGGGGCCTGTTGTGGGGTGAGGGGCTAGGGGAGGGAAAGCATTAGGATATATACCTAATGTAAATGACGAGT
-TAATGGGTGCAGCACACCAACATGTCACATGTATACATCTGAAACAAACCTGCACGTTGTGCACATGTACCCTAGAACTT
-AAAGTATAACAAAAAAAAGAAGGGGTTGGGCAAAATTACCAACAATCTTCAACTATGAATTTGTATGAGTAGGGGCTTCC
-CACACCATCAGGCACTCCAAGTTGGAGAAACAAGGGATGTTGAATTGAAAGTTTAATTTTTTAGGCTTGATAGTCAGATT
-AGGGAAGTTTTGGGTACACCTTTCCCACTCTAGAGCCCTCTCCCTAACTCAGGGCCAATTTGGGGCATGGGCTCAGTGGA
-AAAGAGTGCCAAGATCAATTAGAAATATCCATCATGAACATAGGAGGCAGGCATTCTGGCCAAGGGGGTGCGTCTTCCCA
-CTTTGTAATCCAGAGTGCGATTTCTTCTTGCTATCTGTCCCTCCATAAATAAGCGTTGGGTGAAGGACAAGCTAGTTACC
-ATTGAGGATGGAATGAAATTCTACCAGAATTGCAAAATGAACTGAGAGCCACGAAAGTGTTCCTCTGTGAACCAGCAGAG
-AGATCTGTGGAAGGCAAAGGAAGAGGAGCCAAGAGGCCAGATAACATTCCTGCTTCCCCTACATTGTGAGAATGAAATTG
-TCAGCAACCTATATCAGTAATTAACCAGAGGCTTTTTAGAGAGTAAGACTTCTGATAGATACCTCAATAGCTGAAGTTGC
-TCTTCAGTACTGCATATAACCTGTGGACAGATTTTCATCATTATTAATTCATTTATTCAACACATAGATATTAAATTCAA
-GGCATAGTTCTAAACTATGCAGTCAATTCCAAAAAAATAATAATGAAGGACATTAGCTCTGCCTCATAGGACGTTAAAAC
-TCTAGCTGCTAAATGAGACAAATAGGGTTCCCACATCAAGTGCCTGGGCTCCTGTTATAAACTGGACTCTGCTTCCATTG
-GCTTCTCTTGTTTCTGTTTTGATAAACCCATCATTTGGCTTAGTCCCTACCCTTGCCATGCTCACCCACCAGTAGGTGGA
-CCTCCTTGACCATAACTACAGACATAGATCTTTGATTGTTTCTTTTCAAATGTTTGCTTACTTTAGAGGTGCAGTCAAAT
-GTTGTTTGGACCATAAGACTCTGAGGCTGTGTGTGGTTGAAACTGTCTTGAGACTCAAAGAGCTATTGAGGAAGGGATTT
-GATAGCTGAACTCTTTTGAAGATTTTCTCTGTCTCTCACACATCTGGGGCTGAATAGCTTAACGTTTAATTTCTACATCG
-ACGATAGTTTAATAGCCATTCATGCAAATCAGTTCTGCTGTGAGTTATTATCCTACTCCAATACCAACTAACGCATTCCT
-TAAATTTAGTGTACGTATAAATTCTACATGGTAAGTGAAGCTGTCTTTATGAATGGCTGCTATAGAATATACTAGATTGT
-GTAGGTTTTAGTACAATCCAGGTAATTATCAAGCCTTTGTAATATTTTCAGGAAAGTGATCCTTTCACTTCAGTTTATGG
-AACTTGAAAATTTTTTAGTTGCCACCGACTAGTTAGATCATAAACTTAATTCTATGTATCTGAATTTATTTTTCTATTTA
-TAAATTTATCTGGGTGCTTTCTCAAAGGTTTCCCAGATTAAAAACCTATGGCTTTGTAAAATTAAAACAGAAGTAATAGG
-AATTGAGTTAAAAAACAGAATCAGGCCAAGCCTGGTGGCTTATGCCTCTAATGCCAACACTTAGGGATGCCAAGGGGGGA
-GGATCATTTGAGGTCAGGAGTTCAAGACCAGCCTGGACAACATGGCAAAACCCCACATGTATTAAAAAAATACACAAATT
-AGCTGGGCGTGGTGGTGAATGCCTTTAGTCCTAGCTACTCAGGAGGCTAAGGCAGGAGAATAGCTTGAACTTGGGAGGCT
-GAGGTTGCAGTGAGCCAAGATAGAGCCACTGAATTCCAGCCTGGGTGACAGAGTGAGATCCTGTCTTAAAAAAAAGGAAA
-AAAGAAAAAGAAAAAACAGAATCATACAATGAGAGAGATTGTATAGCCCTTTTAATTGTCCATAATGGATACATTTCTTT
-TTCTGTGTAATAGTTTATCAGCATGAAAAAAAAGAGTCACTGAACACTGATAATTTTCTTTCTCTCTCTCTCTCTCTTTT
-TTTCCTTTTTTTGGAGATGAAGTCTCGCTCTGTTGCCCAGGCTGGAGTGCAATGGCAACATCTCTGTTCACTGCAACCTT
-CACATCCTAGGTTCAGGAGATTTTCCTGCCTCAGCCTCCCAAGTAGCTGGGATTCCAGGTGCACCCCGTCATGCCTGGAT
-AAATTTTTGTATTTTCAGTAGAGACGGGGTTTCATCATGTTGGCCAGGCTGGTCTCAAACTCCTGACCTCAAATGATCTG
-CCCGCCTTAGCCTCCCAAATTACTGGTGATGATTTTCATTTAATGGTGTTCTACAAAGTGAGTTTAGGCAGTGAAAGGGC
-ACAAGTCACCTATAGTTTACCAGAAAGTAGTACCAGTCACCAGCGTTGAAGCATACTCCTAACCCTGGAAAATTTCTTCA
-GCAGCCAGAATTAATCTCAGATTTTGAGACTGGAGCAAAGACTAATTTGGTATGTGTTCATTTAGATTAGTAAATCTCTA
-TGGTGTTCGAACTGTATAATATCAAATCTAAAATAAGTCAAGAGAGTTAGACAATATCTCATCTCTGAGAAAATAAATGC
-ATTATTTTCAAGAGATTTAAGACTGAATTTAAAATCCAACTGCCTGTTCCAGTGTATGTTTCTCTAGAATATGGCCAAGC
-CCTACAAATTCTGGATAGTGTCCTCCAAGTTGTGTTTAAGTGATAATTGATAAATCTATGGTTTAGATACATATGGAATT
-CCACATAACTCTAGCTCCAGCCTTTGCGAGTAAAAATTGGCAGTGATCATGGCCTTAATGGAGGCATGTGGTTAATTGGA
-ATTTTCAGTACCAAAAGTCTTCTTCTTACTAGTTTATCAGGGTACCCTATAATAGTATCCATAACTCATTGCCCACTTGT
-CTGTTTTGATTTCTTTTTTAAAAATACAATTTTAAACTTAGAGGTTTTGTACCTCAAGTCACATATGTGGCACATTTATA
-AAATAATCATGCCTTTGCATATTTTTCCTTTGATATCTTAGCTGTATATACAAGCCACTTATGTTTTTTAATTGCCACAA
-ATATTGCACTGAAATAGAGCACTAGTTGCAAAAATGCCTGGTATAACATTTCTTCTTGTTCTTGAAAGTAATTTTAATAC
-CCCATGTTTAAGATATTCCTAGACAACTATAAGTAACTATAATTATTTCTGCTAGGTAGAAGCATCTTTGTGGTCAACAT
-TTGTGAAGTGCCTTGTAAATAAAAATATGCTTGAGTAGAAATAGTATTTTGCAAATATAGCCCTAAATAGAGCTACTGAT
-TTTACCAAGAATTAAAGACTCCAAACTCTGTCTTTGTCTTTCAAATTTGGTTTATAGGAACATCTCATTACAATGAGCAA
-AAAGCCTATCTGATCATTAAAGAGATAATTTTGACACTTTCAAATGACACAGCTAATTTGTAGTAGGTTTTTGAAGTGCA
-AATTACATGTTTCTGTTTAAATAATGACAGTAAAATATGGACAGTATCTATTCACACTCTATATACACAACTACAACTTG
-TCCCTAGAAGAAAAGTTTAATTTTTCAGGTCTCATCCACAAAACGAAGTGTTAATAAGCTGTATCTTTATTCTCACTTTT
-AAGTAATTTCTTCTTAACCATTGTATAACACTACCACAGTTTGTATGGAGATAAAATAACTCATGGTGAGAAATCCAGTT
-CTTTAAAAAATCATTTTACCTTCAATCACTTTTAGGATGTCTATGGTTTTAGAGTAAGGACGAAAATTTATAAACATTTG
-TTAAATTATGCAACTGTGTTTGAAGATGTTTCAAAATTACATTTTCCTTATTTTACAACTAGTTTTCATGTATTCACAAA
-CGAGACACATGAGAATTATTAATGCAAAAGCACAGCATATCAACAAAGTTTATAATGTAAATAGTTTAGTTAGGAAAGAA
-TGTAATGAGTGAATTATCAAAGCTATTTTATTGGTTCCTAGATTTACCATAGAAGAAAATAAAGCAGCCTTTTAAAAATT
-TCTCAGCACTGAGTCCATTTAAGGTCTGTATTGTATGCCGTAAGTTCTAAAAAATGTTATTGCCGGTAAAAATAGGATGC
-CTATCTAAAATTGTCTTTTTAAAGGTTCTCTCTTATTCTTCTTCCCTTCCTATGTGTGCACAGAATACTGTCATCGTCTT
-GATTGGAACACTATCTCTCTTTCTCAGAGGGTGTACATTTGTAGAAGGGAGAAAATATTTGTTAATTTTGCTTCCTGTAA
-GATAAGGCCTCAATGGTTAAAGGTTAGTTAACAAACTTTTTTTTTGTCTTCATACTATTATCTTGGAATTACCAACTGGC
-TTCTACTTGGATTTTGAATAATGAAAGAAAAGAACTAGCATTTGTTAGAACTTACTGTGTTCCAGAAACTTTATTGATGC
-CATTTCTTCTCATTATCACATTCATTCTTTCAATTAGTATAATTTTTTTCCATCTTAATGAGGTGGGACCAGAGGTTTTG
-TAATATCCACTAACCCACTGTGGATTTCATGGATTGCAAGAGGAAGAAAGCATGGTGGAACTCAGGTTTCTCTGATTCCA
-AATTCACATCCTTTCATGTCTCCATGAAAAATAGAAAAGATAAATTGGGCTCTATTCTAACAAGAGAAACACAATTTTCC
-GTCAGTTAAATGAATAATTCTTTTTTATTTTATTTTATTTTATTTTTATTATTATACTTTAAGTTTTAGGGTACATGTGC
-ACATTGTGCAGATTAGTTACATATGTACACATGTGCCATGCTGGTGCGCTGCACCCAGATACCTAAATGAATAATTCTTA
-AACCTCAAAAATAAAAAGTAGCAAAACCTCAATTCAAGAGTAGACATAAAGGTTGTGACATGGGTGGCAGGGACATATGT
-CTAGTGACAGATTTCCTATGCATATCTGACCAAAAATCCCCCTCATGATTTTCAAATCAGATGCTTAACTACATTTAATG
-AGTTTCCCGAATCATTAATATCAGGCTCTGAAAACAGGATCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGATCCTGTCGAAAGAAACGAATGGAATGGAATGGAGTGG
-AGTGTAGAGGTGTGGAGTGATGTGGAGTGGAATGGAGTGGAATGGAATGGGATGGATTTGAATGGAAGGAGTGTAGTGGA
-GTGGATTGGAGTGGAGTGGAGTGGAATGGAATGGAATGGAGTGGAATGGAATGGAATTGAATGGAATGGAATGGAATGGA
-ATGTTGTGGAGTGTATTGGAATGGAGTGAAATAGAGTGTAATGTAATGTAGTGGAATGGAGTGGAGTGGAGTGCAGTGGA
-GAAGGGTGTAGGGGAATGGAATGGAATAGTGAAATGAAATGTGAGCTGAGATACTCCCACTGCACTCCAGACTGTGTGAC
-AGAATGAGATCCTGTCGAATGGAATTGAATAGAGTGGAATGAAATGGAGTGCAGTGGAGTGGAGCAGAGTGGAGTGGAGT
-GGAGTGGAATGGAATGGAATGGGATGGAATCAAATGGTATGAAGTGGAGGGGAATGGAGTTGAGTGGAGGGACGAGGAGT
-GGAATGGAATGGAATTGGATGGAATGGGATGGAGTGGAGTGGAGTGGGGTGGAGAGTAGTGGAGTAGAGTGGAATGGAAT
-GGAGTGGAGTGGAGTAGAGTGGATTGGAGTGTAATGGAATAGAATGGAATGGATAGGAATGGAATGGTATAGAATGGAAT
-GATGAAATGAAATATGAGCTGAGATTGTGCCACTGCACTCCAGCCTGGGTGACAGAGTGAGATCCTGTCAAAGGAAAGGA
-ATGGAATGGAAAGGAGTGGAATGGAATGGAATGGAATGGAATGGATTGATTGGAGTGCAGTGGAGTAGAGGTGAGTGGAG
-TTCACAGTAGTGCAATGGAATGGAATGGAGTGGAGTCGAGTGCAGTGGAGTGGGTTGGAATGGAATGGAGTGGAATGGAA
-TGGGATGGAATGGAATGGAGTGGAGTGGAGTGGAGTTCACAGGAGTGCAATGAAATGGGATGGAATGGAATTGAATGGAA
-TGGAATGGAATACAATGGAGTGGAATGCAATGGAATGCAATCGAATGGAATTGTGAAATTAAATGTGAGCTGAGATAGTG
-CCACTGCACTCCAGCCTGTGTGACAGAGTGAGATCCTGTTGAAAGAAATTAGTGGAATGTAAGAGAATAAATTATACTGG
-AATGGAATGGATTGGAGTGGAGTGGAGAGGAATGGAGCTTAATGGAGTGGAAGGGAATGGGAAGGAGTGGAATGGAATGG
-AGTGGAGTGGAGTGGAGTGGAGAGAAATGAGGTAAAATGCAATGGGATGGACTGGAATGGAGTGGAGTGGAGTGGAGTGA
-ATTGGAATGGAGTGGATTTGACTGGATTGCAGTGGAATGAAGTGGAGTGGAATGGAATGGAATGGAATGGAATGGAATGG
-AGGGGAGTGGAGTGGAGTTGAGGGGAATGGAGTGGAGTGGAATGGAGTGGAATGGAATGGAATGGAATGGTGAAATAAAA
-TGTGAGCTGAGATTGTGCCACTGTGTTCCAGCCTTTTTTTGACACAGTGAGAGCCCGTCAAAGGAAAGGAATGGAATGGA
-ATATGGTGGAATGGAATGGAGTGGAGTGGATTGGAGTGGAGTGGAGTGGAGTCAAGTGGAACAGAGTGGAATGGAATAGG
-ATGGAATCGAATGGCATGTAGTGGAGTGGGATGGAGTGAATTTCAGTGGATTAGGGTGGAATGGAGTGGAATGGAATGGG
-ATGGAAGGGAATGGCATGGAGTGTAGTGGAGTGGACTGGAGTGGGTTAGAATGGAATTGAATGGAATGGTATGGAATGGA
-ATGGAATGGAATGGAATGGAATGGAATGGTGAAATTGAATGTGAGCTGAGATAGTGCCACTCCACTCCAGCCTGGGTGAC
-AGATTGAGATCCTGTCAAAAGAAAGGAATGGAATTGAATGGAGGGGAATGGAATGGGATGGAGTGGGGTGGAGTGGAGTG
-GAGTGGAGGGGACTGGATTTGAGTGGAGTCTAGTGGAACAGAGTGGAATGGAATGGGGTGGAGTGGAACGGAATGGAATG
-GAGAGGAGTGGTGTGGAGTGGAGTGGATTGGAATTCAATGGGATGGAATGGTATGGAGTGGAGTGGAATGGAGTGGAGTG
-GAATGGAATGGAATGGAATGGAATTGGAATGGAATGGAATGGAATGGAATGGAGAGGAGAGGAATGGAGTGGAATGTAGT
-GTAATTGGAAAGGATGGAATGGAATGGAATGCCATGGAATAGAATTAGGAATAGAATGGAATGATGTGGAATGGAATGGA
-GTAGAATTCAGTGGAGTGGAGTGGAGTGGAGTGGAATGTAATGTAATGGAATGGGATGGGATGGAGTGGAATGGAATGGA
-GTGGAGTGGAGTGGAGTGGAGTGGAATGGAGTGGAATGCAATGGGATGTGATGGAATGGAGTGGAGTGGAGTTGAGTGGA
-TTGAAATAGAATGGAATGGAGTGGAGAGGAGTGTAGTGGAATGGAATGGAATGGAATGGAATAGAAGGGAATAGAATGGT
-GAAATGAAATGTGAGCTGAGATTGTGCCACTGCACTCCATCCTGGGTGACAAGTGAGATTCTATCGAAAGAAAGGAATGG
-AACGGATTAGAGTGGAATGGAATGGAGTGGGGTAGAGTGGAGTGGAGTGTAGTGGAGTAGAGTGGAATAAAGAGGAATGG
-AATGGGATGTAATGGAAAGGAATGCAGTGGAGTGGAGTAAAGTGGAGTGGAGCGGAGTGGAGTGGTGTGGAGTGGAGTGG
-AGTGGAGTGGAGTGGAGTGGAGTGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGCACGGTGAAATGAAA
-TGTGGGCTGAGATTGTGCCACTTCACTACAGCCTGGGTGACGGAGTGAGTTCCTGAAGAAATAAAATAATGTAATAGAAT
-GGATTGGAATGAAATGGAATGGAGTGTAGTGGACTGGAGTAGAGTGGAATGGAGTGGAGTAGAGTGGAAGGGAATGGAAT
-GAAATGAGATGGAATGGAATGGAATGGAATAGAATGGAGTGGAGTGGAGTGCAAAAATCCTCAATAAAATACTAGCAAGC
-CGAATCCAGCAGCAAATCAAAAAGCTTATCCACCATGATCAAATGGGTTTCATCCCTGGGATGCAAGGCTGGTACAACAT
-ACGCAAATCAGTAAACGTAATCCATCATATAAACAGAACCAACGTCAAAAACCACGATTATCTCAATAGATGCAGAAAAG
-CCCTTTGACAAAATTCAACAACCTTCATGCTAAAAACTCTCAATAAATTAGATATTGATGGGACGTATCTCAAAATATTA
-AGAGCTATTTATGACAAACCCGCAGCCAATATCATACTGAATGGGCAAAACCTGAAAGCATTCCCTTTGAAAATCTCAGT
-TACCTTTCTTTTGGATATGAGTGTGAGGAAAGAGTACCTACAAACTACCCTTTTAGTTAAATGCCATATACAATAAATAT
-TAATACCTACAGTCCTCATGTTGTACATTAGAGCCCTCAATTTGTTAATTCTACATATCTGCAACTTTGCATCCTTCGAA
-TTCTCTCTCTCCATTTTCTCTTCTCACCCCCAGCCCCTGGTAACCACTGTTTTATACTCTATCTCTGCATATTTACCTTT
-TTGCTGTTTTTGTCCTGAGAAGTTTATTGGGACTTTCAGCTAGGAGATAATATGTTCTGAGTCTTGATTATCTCAAATTA
-TATCAGGTAAGAAGTTTTACTTGTCTGGAGAGCAGAGAGCAAGTGCATAATTTTATGCAGAAGAGGGAATAAAGAGAATT
-CTCTAATTAAAATTTGAATCAGAAATATGGTTCATATTTTTATGTACAACAATCTCTAAGGCTTCTTGGAAAGGAACTAG
-CTGCCTGATTTTTTTTCATTTGAATCCTCTAATACATGAAGAGGATGATTCTACCATACCAATCACAAGAATGATATCTG
-TAGAATCAAAAGTTGAAATCCTATTATCCTAGAAGTTTTTTCAGAAAACTTGAACATGTATTGAAATGTCATGCTGGTCA
-TATATGTTACAGCAATGAGGAATTTACTTATTATATACTTTAGCTTTTTAGCCCTTTCCCTGCCCACCAGAAATGTTTCT
-TTTGAATCCAATTTGGTCCTCAGAGTTTTAGAATGTTAAGGAATGTATAGGGGTATCTTTTTTCTTCTTTTTTTTTTTTG
-TCAAGCTATTGTATATTTTTACTTTACCTGTTTGGGTATGTAGTTACTATTTGTTTGGACTGTCATACTAGAAAAAAATT
-ATAGTGAATTTTACATGTATGGAGTCTTCATTAATCTGTATAAACTGACAAGTTTAGAATATCAAAGTCATCACTGTAAA
-AAATAAAGTGATATTTTATCTGGTCTATCTCCTTGCAAATAAAAGAACAATAAATTCTGTACTATTATGAAATATAAGAG
-CTTGAAAATTTTTCAAGCGTCTTGTATAGAATGGCCTTCGAATTCAAGGTATAAACTACAACAAAACACTTTCGAGATCT
-AGTTTGATTGAAGAGTGCATTCTTACTTATTTATATATTCTCTGCAATTTCTGATTCAAGATAGTCCACAATTCTAAAGG
-AAAACCAAAATAGAATAATAATTATAAAACAAAATAAAAAGTAATTGAGGAAGATAATTGAGCAACTTATTCTTGACAAC
-TAGCTTTTTAACAAACAGAAAAGTGCACTAAAAATACTGCCTAGTTGTTTAAAGTAGGCTGAGATCTGACTGTATCCCCT
-GAGTGACATAAAGAAAAAACTACCTTTGAGGAAGCACAGTGATTAAATTTAAAAGATTTATTGTTTAACCTCAGGAAGAC
-TTTCAATAACTTTTTATAAATTGTATACAGTTAATGGAAGACATGCTAGGCTTCTTGTAAGAATTTATTCCAGATCACTG
-TGTATAATTAATGGCTTGTCTACATATTTTTTCAATAAAACTGTTCATGAAGAATTTTAAGTATGCACTTTCAGTAACAG
-AATGGATATATCTTTGTGAAGATACCATTTATGTACCATAACATCCAAAGCATAATGAGGAGATTTTGATACACTGCAGA
-TTTAGAACTGAGTTGGAAAACAAAACTTCAACATACTGTCTTGTCAGCACAAAGCAAATAAATTCATCACTGTCAGTTGA
-GATTTAAATTCACAAACTTATAAGCAATAAAATCAAAGTAATTTTGTTATAAGTTTTTTGACACCAGATTATATGGGGTA
-AATAATTTACTTTCTAATCAAGCAATTGATACATATAAACCTGAAATAGAGAGTTTTGCCTTTTAATTAGATACATTGTT
-ACGCAAAGAGTGGTTGAAGCTGCAGTGGAGAATTATCTTTTTCTCTTTTTGCTGTTCTTACAAGGACAGTTTCTAGAATT
-CTTTTCAAAACAATAGAACAGAAAATTTCACTTACTTAATTTAACTTTTGTTAAAGTACTTTGCCAAAATTAGCAAACTA
-TGAAAGGAAAGTTTGCCTTTTCAATATATATGTAAGTGGCAAGTAAAAGTTGTTCTTAAATCACGTGATCTCATAGAAAT
-AACATGGGATAAAAAGAGTTCTGAAGGTGTTCAGGAAATGCCAGTCCTAAATGTATTGCTTTGGTGTACTGATTATATTG
-AACTGAAAATATTTGAAAAATAACAACTGTGGGACATGCTTTCTCTGCACTCCCTTTACGTTCCTCAAGAGAGATCCTCC
-AAAAGGAATTTTCAATACCAGAATGAATGTATCTTTGTAAAGATACCATTTATCTACCATAACATCCAAAGCATGATGAG
-GAGATTTTTATACACTGCAGATTTAGAACTGAATTGGAAAACAAAGCTTCAAGATACTGTCTTGTCAGCACAAAGACATT
-CATCTCCTTCCTAGGAGTTTCATCAGCCAGGGAAAATTGACTCCTCATATCACAGGAGACAAGACTAAGAGTCCATTCCA
-CACCAAGGCAGACTGCCACAAACTATCATCTATGCTCCTAGGGGTCTGGTCATCTTTCCCAAAAGTCATTTGCTCTCCCT
-TAAGTTTCCTACATTCTTCCTCCTGCCTTCCCTACAAGCTCCTAAATCTCCCTGGGTTTTTTTCTTGGTGGTGTTTTGTT
-TGTTTTGTTTTGTTTTGTTTTTGATTCCACGTTTCTTTCCTGTGATTCCCCCATGCGTGTAATAAATGTGTACACATTTT
-CTTCTTTTGACATGCCTGTTATCCATTTATTCAATAGACTCAGTTATCATACCTTCAGAGGGTAGAGGGAAAGGTCTCCA
-AGTCCTACAGTTCCAAAAGAAAATAGCTAGTAATGCAAATGCAAAAGTCATATAAACTTTGAGACAAAGTTAGCGTCTTA
-TATGGTACGTTCAGAAAGAAGAGGTGTGTTGCACACCAAGGGACATTTTCCTGGTCTTAGCTACTAAGTTTCTCTGAGAA
-GAAGCAGTTACTACTACAGCAGTTAAACACCTGACTCCCAAATTATAAAAGCCTAAGTGTTCAGATTAAATCATGAGTTG
-TCACCTGTGAATCATAAAGTCTGAACTCTTTAAATTGCAAACACACATAGAAAAACGATTCTTACACAGGGATCCATGAG
-TGGAACTGCAAAGTTTTGTCAAAATCTATATATATGTTTTCTTTTTAAGGGTCATAGATTTCAATATATGTTAAAAGATA
-TCTGGGGCTAGTAAAGATTAATAACCATTTTCAGTTTTGTGCTGAAATTGGCAAATCATGGCTTTTCTCCCTCCAACACA
-CCCCCTCCCGCCTCAGCACACCACTGGTTAATCTTTATTTTCAGGAGAGAAAAAGATGTTTCATATTAATAAAGGTAAAT
-TATACACTTGTTTGTTTTATACTTTTCCACCTCTTAAGCTTAATCGTGTTTTAATAATGTATAATTGAATACATTAACAT
-TTAGATGTTAGTAAATGAATAACAAATGTTCATTGTTTCTCTTGAGTAGAGGAATAAAAATTTTGCACCTGTTGTATAGA
-ATGATTTTTAAAATCTCATTCAATCCTTCAGAAGTTTAAGATTTTTTTTCAAGAATTTTTATATAAAATTTTTACTCAGA
-AGCAGATAGCTCACAAAAAGTATGGGGGTTTTTTGGATTATAAATAAACTATTCCACTCACCAAGATGCTGAGACATCCT
-ACTTTGTGGTATTTTGAAATAAAAACAAAACACAAGAATGTGACGATGAAGCAAGTGAAAATTAAAAGGGTACAGACTTT
-AGAAGTATCATAAGCTAAAAATAAAATGAAACAAACCTGTAAAGGAACCAAAAGCCCAGGTAGATATAATACAGTAAATT
-ATGAGAAGCTAAAAAAAATGAGGAGGTGATAAACAATAAAGTGAAAATCTCTGATAAAGCCAAAACTACTTGAATGGCAG
-TCAACAAAACAGAAGAAAAAAATGACACTCATAACAAGGCAGAACTATGGAAATGCATCCCTGGGGGTAAGATAATAGAG
-TTGCGAATTAGTGGAGGTGGATCACAAATACTGGCCAAATAAAGCCCGCTAACATAATTCAAAGGACAGAGAAATTCTGT
-AGCTGAAGATAAAAAGTCTGAAATACATTATGGTATAGTCAAATGAGTGTCATTTCTAATAGACACACTTATTTTTCAAG
-AGTTGATAATATGAAGTAAAAATTTAGTATGCAAAGTTCAAATTTTCCATTTGTTGAGTAATTCATTTTTATTAAATATT
-TTCCAACAATTAAACTAAAGTGGTACCAGAACAGAGTAGACATTCTGAGTTTTCACTTTACAAAAGCTACACATAAATCT
-ACGTACTTCTTAAGGGTATAAACAAAGTCAGAGCCTGTGTGATATTTCAATAAACAATTGGAGAAAATTTTTTTAAGAAT
-AGATTATATACATATTGACCTCTTTGAGAACCTTATTTTTTTCTTTTTTTTGTGTGTGTGTTTGTTTTTTTTTGTGTGTG
-TGTGTTTTCATTTCTTTTTTAAATTATTATTATTATACTTTAAGTTTTAGGTTACATGTGCACAACGTGCAGGTTCGTTA
-CATATGTATACATGTGCCATGTTGGTGTGCTGCACCCATTAACTCGTCATTTACATTAGGTGTATCTCCTAATGCTATCC
-CTCCCCCCTCCCCCCACCCCACAACAGTTCCCAGTGTGTGATGTTCCCCTTCCTGTGTCCATGTGTTCTCATTGTTCAAT
-TCCCACCTATGAGTGAGAACATGCGGTGTTTGGCTTTTCATGCTTGCGATAGTTTACTGAGAATGATGGTTTCCAGCTTC
-ATCCATGTCCCTACAAAGGACATAAACTCATCATTTTTATGGCTTCATAGTATTGCATGGTGTATATGTGCCACATTTTC
-TTAATCCAGTCTATCATCGTTGGACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATAGTGCCACAATAAACATACG
-TGTGCATGTGTCTTTAGAGCAGCATGACTTATAATCCTTTGGGTACATACCCAGTAATGGGATGGCTGGGTCAAATGGTA
-TTTCTAGTTCTAGATCCCTGAGGAATCACCACACCGACTTCCACAATGGTTGAAATAGTTCACAGTCCCATCAACAGTGT
-AAAAGTTTTCCTATTTCTCCACATCCTCTCCAGCACCTGTTGTTTCCTGACTTTTTAATGATTGCCATTCTAACTGGTGT
-GAGATGGTATCTCATTGTGGTTTTGATTTGCTTTTCTCTGATGGGCAGTGATAGCATTTTTTCATGTGTTTTTTGGCTGC
-ATAAATGTCTTCTTTTTAGAAGTGTCTGTTCATATCCTTCACCCACTTTTTGATGGGGTTGTTTTTTTCTTGTAAATTTG
-TTTGAGTTCATTGTAGATTCTGGATATTAGCCCTTTGTCAGATGAGTAGGTTGTGAAACTTTTCTCCCATTCTGTATGTT
-GCCTGTTCACTCTGATGGTGGTTTCTTTTGCTGTGCAGAAGCTCTTTAGTTTAATTAGATCCCATTTGTCAATTTTGGCT
-TTTGTTGCCATTGCTTTTGGTGTTTTAGACATGAAGTCCTTGCCCATGCCTATGCCCTGAATGGTATTGCCTAGTTTTTT
-TCTATGGTTTTTATGATTTTAGGTCTAACATGTAAGTCTTTAATCCATCTTGAATTAATTTTTGTATAAGGTGTAAGGAA
-GGGATCCAGTTTCAGCTTTCTACATATGGCTTGCCAGTTTTCCCAGAACCATTTATTAAATAGGGAATCCTTTCCCTAGT
-TCTTGTTTTTGTCAGGTTTCTCAAAGATCAGATAGTTGTAGATATGCGGCATTATTTCTGAGGGCTCTGTTCCATTCCAT
-TGGCCTCTATCTCTCTTTTGGTACAAGTACCATGCTCTTTTTGTCACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAG
-CGTCGTACCTCCAGCTTTGTTCTTTTGGCTTAGGATTGACTTGGCAATGCAGGCTCTTTTTTGGTTCCATATGAACTTTA
-AAGTAGTTTTTTCCAATTCTGTGAAGAAAGTCATTGGTAGCTTGATGGGGATGGCATTCAATCTATAAATTACCTTGGTC
-AGTATGGCCATTTTTACAATATTGATTCTTCCATGAGCATGGAAGGTTCTTACATTTGTTTGTATCTTCTTTTATTTCAT
-TGAGCAGTGGTTTGTAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTTGGATTTCTAGGTATTTTATTTTCTTT
-GAGACAATTGAGATCCTTATTGTGAGATTCAATTCAGAATCTGGGATTTTGTTTTGTTTTGAGATGTAGTCTCTCTCTGT
-CACCAGGCTGGAGTACAGTGGCACAGTCTCTGCTCACTGCAATCTCTGCCTCCCAGGTCCAAGCGATTCTCCTGCCTCAG
-CCTCCCAAGTAGCTGGAACTACAGGCACGTGCCACCATACCCAGCTAATTTTTGTATGTTTTTTTAGTAGAGATGGGGTT
-TCACCATGTTGGCCAGGATGGTCCGGATCTGTTGACCTTGTGATTTGCCTGCCTCAGCCTCCCAAAGTGCTGGGATCACA
-GACGTGAGCCACTGCGCCCAGCCCAGAATCTGGGTCTTAACCAGATTTGCCATTATAAAATGAAATGAAACCAAAACCAC
-CAGTCAATATCTGTAGCAGTGTTATTGTTGGGGAGCATGCACGTTTGTTTGAGCTTACTTATATATACAGAGCTGTTTAG
-CTTAATCTTTAAATTGAAAATTTTTAGTATTTTTAGAATGTTTTAGATACTTTGATGAATAAATTTTGTGTTAACAAACT
-ACTATTAATAAAACTTATAAATTAAATATTTCTGAACACATTGGCAGAGGTAAATGATAAAGTTATATTCACACAATTAG
-TTTTTCTTGCACAGAATTGACATTTTGTCAAAAAGTTAAAATCTTTGAAATGTGTTTTCTGTCCTCATCTTTCCCCTTTT
-GAGCATTTTTCCCCCTGGGTTGGTTATAAAATATTCCCTAACTTCAGGCATCTGGTTAAGTTTTGGGTTTTCTCCCTTCC
-TACCAACTCATATGGATTGGTAATGATCTGATAGAAGACAATTGCCAAAAATCAATCAAATATGTTTTAAATGAAACTTC
-TCCAATATAATATTCATATTAATCCTTCTTTAATTGCTGAATGAGTAATAATTGTTCACTGACCCTTAAAATCCTAAAAC
-TTAATCAGCTCACTGGAGTGGATGAATGGATGTTTGTCTAGATGAGAATGCTTAAGGTCTACTTCAAGGAGTTCATAATA
-GTAAAAATGTCCTTTTCTTCCATCAGAAACTTCATCCTGGATCTTTTCATCCTTGTTTTTCTACTAGCTCTCCTTCTCCA
-AATACACTGACTTGGAACCCCAGTTTCAGTGGTGGACTGCGTGGATTTGATTCTAAGCTATGCTATAATGAGAAAGTAGC
-TCTAACCCTATTCTCATTTTCTTCACCTGTAATATAGAAATCATCATCAGACAATATACAGATAGGGGCCAGTTATTTCA
-CAGATAATAATAGGTGAAAATGGAGAGTATGTGGGTGTAGGCATGGAAAAGTGAGTTTAAATGGTTTCAGGAGTCTGTGG
-AAATTGTCTTTGGGTGATTCAATGTTCTCAGGGAAGCACACCCAAAAAGACATTGAGGATTTCTGGGGAAGTGTTAGGGA
-TTAGAGACAGGATAAGATACAAAACTAGGAAAATTAGAGAGTGAATAGATTGGAACATATGTAGTATGATTGATTGATAG
-GCGGCACTCAGATTCTCAGTTTCAAGTGGGATATTTTTCAATTTGATCCATATAGCTAGTTGCTCAAATATATGTGGGGA
-TTTGGTGGAAATTTGGATCTAACCAGGGTTATTTTCCTGGTTAGATTCAGCAAAGTGAAAGAGAAACAAGGAAGTTGAAG
-TTTCCTGGGAATGGTTGGCCACGGAATTTAGGCAGGAGAACAGGAAATAGAGTACATCAGTAGGTAAGGGTCATTATAAA
-TATGATAAAATAATAGTTTGGAGGTCTCAGAGAGATTGAAAAATTTTATGTCAGCGTATGAAAGGGAATGATTAAAGGAG
-GAGTTCAGAGAATGGGATGAATGAAATTGTGACTACAGAGGAGTTGCTATTATAAGTAACGACGATGCTTCACTCAGTTC
-CTCTGGAAGTGTGGTCCCTGTGCTAGCAGCAACAGCATCACCTGGGAACTTACTAGAACTGCATATTCTCAGGTTACACC
-CCCAGATCTTCCAAATATGAAATTCCAATAGCAGGTCTCAGCAATCTCTTATTGTAACACAACTGTAGGCAATTTTGAGG
-CACACAGTAGTTAGCACAACTGGTCTAGTGTATGTCTTATTTGGTCTTCCTCCCCGGTTCACAGTACAGAGCTCCTAAAA
-CTTGAAATTTCCTGATAGAGATGAGAGGACCATCCTTTACTAGTCATAAGTCCCTCTTAGCCATACCTGAGTTTATGCTA
-TTGACATGACATGAGTGGTGGTTGGAGACCCGTATGGCTTCAGGGTGGGTGCTTGACACCAGAAACATGAAGGCATAACT
-AGATGGTTAAAACTGTCAGCCCTCTCCTCCATCACCTCTGAGGTGCTGGGAGGGTGATACAATGATATACTTAGAGGTCA
-TATGGCAGCTTTGTGCCCCTTTTCACCATACCTGGCCCTATGTGTCTCTTCTATTTGACAGTTCCTGATTTGTATCAGAC
-AGTAACTGTAAGCAAAGTGCTTTCTTGGGTTCTGTGAGCCATCTTAGCAAATTATAGAACCTGGGGAAGGAATCCATGGA
-AGTGCTAATTTATAGCCAGTTGGTCAGGAGTATGGCAGGCCCACAACTCCTCTCTAATGGTGGGGGGGTGGCAGTCTTGT
-GGTCCTGAACCCTGAACTTGTGGGATCTGATGCTATCTCCAGATAGATAGTCTCAGGATTGAATTGAATTGTAGGACACC
-ATTTGGTGTCCTGAGAGTTGAAAAATTGATTGGGGTGAGACTAAACCAACAAATTTCATCTCAGAAGTTTGAGTAGAAAT
-AATTCTGTTGGAAAACATTATCGTTAGATCAAAGGTGTTAATAGAACTGAGAGATCAAAATGGCAAAGAGTCATCTATGA
-TTACACATTGTTGACATAAACTAGAATTAAGACAAGAGTATGTCAAAGAGAGTTACATTGAGCCAGGGATAAAAATAGTC
-AATTGATTGATTAGAATTTAGTAAATGCTATTTTTTGAAAAATTAATATTTAGTTAATTAATGGAGATACTTAATTATCT
-CCATTTTGACTTTAAATTTAAAACTAAAAAATTGATATTTTATCTATTTTCCATAAATGGAAATTGAAAAGCAATAGCAA
-AATGCTTCGACAGAAAATCTGCCCTTCTTATTCCCAAGAGGAAGAATGGCCAACTACCTTAAGAATAAGTTAGAAAAACT
-TTCATAATTTTTTAAGTTGCCATATTTTATAGCTTTGAACAAGTTGAATTATTAACTAGACTGCCCAGGGAATGGAGCCA
-TCTAATATAATTTCCTTACTATTTAGATAAAATCTTTGTTGTTGAAAATCTTAATCATTTTTAATGATCCTGTTTTCAGA
-GCCTGATATTAATGATTCGTGAAACTCATTAAATGCAGTTATGCATCTGATTTGAAAATCATGAGGGAGATTTTTGGTCA
-GATATGCATAGCAAATCTATGTCACTAGACATAAGTCCCTTCTACCCATGCCACAACCTTTATGTCTACTCTTGAATTGA
-GGTTTTGCTACGTTTTATTTTTGAGGTTTAAGAATTATTCATTTAACTGTCGGAAAATTGTGTTTCTCTTGTTAGAATAG
-AGCCCAATTTATCCTTTCTATTTTTCATGGAGACATGAAAGTATGTGAATTTGCAATCAGAGAAACCTGAGTTCCACCAT
-GCTTTCTTCCTCTTGCAAGCCATGAAATCCACAGTGGGTTAGTGGATATTACAAACCTCTGGTCCCACCTTATTAAGATG
-GAAAAAAATAAGACTAATTGAAAGAACAAATGTGGTAATGAGAAGAAATGGTATCAATAAAATTCCTGGAACACAGTAAG
-TTCTAACAAATGCTAGTTCTTTTCTTTCATAATTCAAAATCTAAATAGAAGCCAGTTGGTAATTCCAAGATAATAGTATG
-AAGACAAAAAAAATGTTTGTTAACTGACCTTCAACCATTGAGACCTTATCTTATAGGAAGCAAAATTAACAAATATTTTC
-TCCCTTCTACAAATGTATACCCTCTGAGAAAGAGAGACAGTGTTCCAATCAAGACGATGACAGTATTCTGTGCACACATA
-GGAAAGGAAGAAGAATCAGAGAGAACCTTTAAAAAGACAATTTTAGATAGGCATCCTATTTTTACCGGCAATAACATTTT
-TTAGAACTTACGGCATACAAAATAGACCTTAAATGGACTCAGTGTTGAGAAATTTTTATAAGGCTGCTTTATTTTCTTCT
-ATGGTAAATCTAGGAACCAATAAAATAGCTTTGATAATTCACTCATTACATTCTTTCCTAACTAAACTATTTACATTATA
-AACTTTGTTGATATGCTGTGCTTTTGCATTAATAATTCTCATGTGTCTCATTTGTGAATACATGAAAACTAGTTGTAAAA
-TAAGGAAAATGTAATTTTGAAACATCTTCAAAAACAGTTGCATAATTTAACAAATGTTTATAAATTTTCGTCCTTACTCT
-AAAACCATAGATATCCTAAAATTGACTGAAGGTAAAATGATTTTTAAAGAACTGGATTTCTCACCATGAGTTATTTTATC
-TCCATACAAACTGTGGTAGTGTTATACAATGGTTAAGAAGAAATTACTTAAAAATGAGAATAAAGATACAGCTTATTAAC
-ACTTCATTTTGTGGATGAGACCTGAAAAATTAAACTTTTCTTCTAGAGACAAGTTGTAGTTGTGTATATAGAGTGTGAAT
-AGATAGTGTCCATATTTTACTGTCATTATTTAAACAGAAACATGCAATTTGCACTTCAAAAACCTACTACAAATTAACTG
-TGTCATTTGGAAGTGTCAAAATTATCTCATTAATGATCAGATAGGCTTTTGGCTCATTGTAATGAGATGTTCCTATAAAC
-CTAATTTGAAAGACAAAGACAGAGTTTGGAGTCTTTAATTCTTGGTAAAAATCAGTAGCTCTATTTAGGGCTATATTTGC
-AAAATACTATTTCAACTCAAGCATATTTTTATTTACAAGGCACTTCACAAATGTTGACCACAAAGATGTTTCTACCTAGC
-AGAAATAATTATAGTTACATATAGTTGTCTAGGAATATCTTAAACATGGGGTATTAAAATAACTTTCAAGAACAAGAAGA
-AATGTTACACCAGGCATTTTTGCAACTAGTGCTCTATTTCAGTGCAATATTTGTGGCAATTAAAAAACATAAATGGCTTG
-GATATATAGCTAAGTTATCAAAGGAAAAATATGCAAAGGCATGATTATTTTATAAATGTGCCACATATGTGACTTGAGGT
-ACAAATCCTCTAAGTTTAAAATTGTCTTTTTAAAAAAGAAATCAAAACAGACAAGTGGGCAATGAGTTATGGATACTATT
-ATAGGGTACCCTGATAAACTAGTAAGAAGACGACTTTTGGTACTGAAAATTCCAATTAACCACATGCCCCCATTAAGGCC
-ATGATCACTGCCAATTTTTACTCACAAAGGCTGGAGCTAGAGTTATATGGAATTCCATATGTATCTAAACCATAGATTTA
-TCAATTATCACTTAAATACAACTTGGAAGACACTATCCAAAATTTGTAGGGCTTGGCCTTATTCTAGAGAAACATACACT
-GGAATAGGCAGTTGGATTTTAAATTCAGTCTTAAATCTGTTGAAAATAATGCATTTTTTTCTCAGAGATGAGATATTGTT
-CAACTCTTTTGACTTATTTTAGATTTGATAATATACAGTTCAAACACCATGGAGATTTACTAATCTGAATGAACACATAC
-CAAATTTGTCTTTGCTCCAGTCTCGAAATTTGAGATTAATTCTAGCTGCTGAAGAAATTTTCCAGTGTTAGGAGTATGCT
-TCAATGCTAGTGACCGGTACTACTTTCTGGTAAACTATAGATGACATGTGTGCTTTCATTGCCTAAACTCACTTTGTAGA
-ACACCATTAAATGAAAATCATCACCAGCAATTTGGGAGGCTAAGGCGGGCAGATCATTTGAGGTCAGGAGTTTGAGACGA
-GCCTGGCCAACATGATGAAACCCCGTCTCTACTGAAAATACAAAAACTTATCCAGGCATGGCGGGATGCACCTGGAATCC
-CAGCTACTTGGGAGGCTGAGGCAGGAAAATCGCCTGAACCCAGGATGTGAAGGTTGCAGTGAACAGAGATGTTGCCATTG
-CACTCCAGCCTGGGCAACAGAGTGAGACTTCATCTCCAAAAAAAGGAAAAAATGAGAGAGAGAGAGAAAAAAAATTATCA
-GTGTTCAGTGACTCTTTGTTTTTCATGCTGATAAACTATTACGCAGAAAAAGAAAATTTTCATGCTGATAAACTATTACA
-CAGAAAAAGAAATGTATCCATTATGGACAATTAAAAGGGCTATACAATCTCTCTCATTGTATGATTCTAGTTTTCTTTAT
-TTTTCTTTTCTTTTGTTCTTTTTTTTTTTTAATACAGGATCTCACTCTCTCACCCAGGCTGGAATGCAGTGGCTCTATCT
-TGACTCACTGAAACCTCAGCCTCCTGGGTTCAAGCTATTCTCCTGCCTTAGCCTCCTGAGTAGCTAGGAATAAAGGCATT
-CACCACCACGCCAGCTAATTTGTGTATTTTTTTAATACAGGTGGCGTTTTGCCATGTTGCCCAGGCTGGTCTTGAACTCC
-TGACCTCAAATGATCCTCCCACCTCGGCCTCCCTAAGTGTTGGCATTACAGGCATAAGCCACCATGCTTGGCCTGATTCT
-GTTTTTTAACACAATTCTTATTACTTCTGTTTCAATTTTACAAAGCCATAGGTTTTTAATCTGGGAAACCTTTGAGAAAA
-CATCCAGATAAATTTATAAATAGAAAAATAAATTCAGACACATATAATTAAGTTTATGATCTAACAAGTGGGTGACAACC
-GAAAACTTTCCAAGTTCCATAAACTGAAGTGAAAGGATCACTTTCCTGAAAATATTACAAAGGCTTGATAATTACCTGGA
-TTGTACTAAAACCTACACAATCTAGTATATTCTATAGCAGCAATTCATAAAGACAGCTTCACTTACCATGTAGAATTTAT
-ACATACATTAAATTTAAGGAATGCATTACTTGCTATTGGAGTAGGATAATAAACTCCCAGCAGAACTGATTTTCATGAAT
-GCCTATTAAACTATCATTGATGTAGAAATTAAACAATATATTAAGCTATTCAGACCCAGATTGTGAGAGACAGAGAAAAA
-CTTCAAAAAAGTTCAGCTACCAAATCCCTTCCTCAATAGCTCTTTGAGTCTCAAGACAGTTTCAACCACACACATCCTCA
-GAGTCTTATGGTCCAAACAACATTTGACTGCAGCTCTAAAGTAAGCAAACATTTGAAAAGAAACTCAAAGATCTATACCT
-GTAGTTATGGTCAAGGAAGTCCACCTACTGGTGGGTGAGCATGGCAAGGATAGGGACTAAGCCAAATGATGGGTTTACCA
-AAACAGAAACAAGAGAAGTCATTGGAAGCACAGTCCAGGTTATAACAGGAGCCCAGGCACTTGATGTGGGAACCCTATTT
-GTCTCATTCAGCACCTAGAGTTTTAACGTCCTATGAGGCACAGCTAATGCCCTTCATTATTTTTTTGTAATTGACTGCAT
-AGTTTAGAACTATGCCTTGAATTTAATATCTATCTGTTGAATAAATGAATTAATAATGATGAAAATCTGTCCACAGGTTA
-TGTGCAGTACTGAAGAGCAACTTCAGCTATTGAGGTATGTATCAGAAGTCTTACTCTCCAAAAAGCCTCTGGTTAGTTAC
-TGATATACGTTGCTGATAATTTCACTCTCACAATGTAGGGGAAGCAGGAATGTTATCTGGCCTCTTGGCTCCACTTCCTT
-TGCCTTCCACAGATCTCTCTGCTGGTTCACAGAGGAACACTTTCGTGGCTCTCAGTTCATTTTGCAATTCTGCTAGAATC
-TCATTCCATCCTCAGTTGTAACTACCTTGTCCTTCACCCAACGCTTATTTACGGAGGGACAGATAGCAAGAAGAAATCGC
-ACTCTGGATTACAAAGTGGGAAGACACACCCCTTGGCCAGAATGCCTGCCTCCTATGTTCATGAAGGATATTTCTAATTG
-ATCTCGGCACTCTTTTCCATTGAGCCCATGTCCCAAATTGGCCGTGAGTTAGGGAGAGGACTCTAGAGTGGGAAAGCTGT
-ACCCAAAACTTCCCTAATCTGACTATCAAGCCTAAAAAATTAAACTTTCAATTCAACATCCCTTGTTTCTCCAACTTGGA
-GTGCCTGATGGTGTGGGAAGCCCCTACTCATAAAAATTCATAGTTGAAGATTGTTGGTAATTTTGCCCAACCTCCTTCTT
-TTCTTTTTATTCTACTTTAAGTTCTAGGGTACATGTGCACAACGTGCAGGTTCATTACATATGTATACATGTGACATGTT
-GGTGTGTTGCACCCATTAACTCGTCATTTACATTAGGTATATCCCCTAATGCTTTTCCTCCCCTAGCCCGTCACCCCACA
-ACAGGCCCCGGTGTGTGATGTTCCCCTTCCTGTGTCCGTGTGTACTCATTGTTTAATTCCCACCTATGAGTGAGAACATG
-TGGTGTTTGTTTTTTTGTCCTTGTGATAGTTTGCTGAGAATGATGGTTTCCAGCTTCATCCTTGTCCCTACAAAGGACAT
-GAACTCATCATTTTTATGGCTGCATAGTATTCCATGGTGTATATGTGCCACATTTTCTTAATCCAGTCTATCATTGTTGG
-ACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTCAGTAGTTCCTCAATAAACTCCTTCTTTCTTTGCCTAGTTACACCTC
-AATGCAACCTGCTGGCAGGCCAGCCTTAAGCCCAGCAGTCCAACCATGCATCTAAGCTGAGTTCTCATCAGAGCCAACTT
-CAATTATAAACAACTGAGATGATGCCAGAGGCCAGAATCCCTGAGAACCCAATTTGCTGTCATCACCACAGCTGAAACAA
-GGCGCTTGGCATCTAGAAAAGCTGATCTGTAGGAAATTTCCAATAGAGTTCAAGTTTTTCTAAGTTTAAAGTGTACAATA
-TCATCAAGGTGAGACACTCAAGATAAAACTAGGCTTGTGTTTAAATATAATAAAAATATTTGAAGAATAGTAAGAGTGGT
-GACTACTTTTACACAGGAATGTTTCAAATAAATTGTTTTTTTCTTGTGCCTTTTAAATTTTGTGATTTGTCAATGAGATG
-CTGACATGTTTTTAATGAAGCATGCCTTGTAAAATAATAAGTGAATGAAAACTACACAGTAATATTTACATCAACAAAGC
-TAGAAGAAGACTGTATGTCTCAAGAGGCTCCATCATCTACCCAGTGGCCACTTCACCAAATTAAGATCCAAATACCAAAA
-AGAAAAGTAATTAAAATTTGTGTTGTATGCCTTATAAGACCAAACCTATAAAATGAGGGGAAACTTCACAATTACTTGTA
-ATTTGCTCTGTGGAATTGTAACAGATGGATTATAAAGATGATTCCATGATAAACATGTAAATGTGGTTACTACCTTCTGT
-GCTTTCTTGGTTCATATTTTTATTGTTTTTTTCTTTATAAACAGATAATTCATTCTTATCTATGGCAATGCAAACTTTTC
-AGATGTATTGAATATGTCATAGTGTTTTTCTATTGTAGGCATCTCTAAAAAAGTTATAGAAAACAAACAGAGAAAAGTCT
-GGTGTTGGAAAGGAGAGAGAAATAAAGCTTGTAAAGGAATGAAGATTAGAGCTTTCTGGAGATAAAAATTCTTAGAAGAT
-ACAAAAGCTAGTTACTGAATTAGATGAAGGTTCTTTTTCAGTTTTTCCCAGTTGTTCACCTCTTAGAAGGCACATATTCA
-CAGCAGAAAAGAAAAATGTGTTAAAAAGAAAATACCTCGGTGTAGTGAGACTGTAATTTCATGAGGGCATTACTGAAGAC
-TCACTTTTTCCAGCATCACTCAGCATGGTATTATGCATGTGTGTAATGTAAAGGAAAGTGAATACGCATTCTTGGATGGG
-TGATCAAATCGTAATTCCAGAATATAATCAGAAGCTGATTCATTATCCTCTTGAGATTTCACAATCTTTTCATCAGGAAT
-TAAAATTCAGAAGAGGGTAAATGTATCTAATCAGTTGAAAGTTAAAAATTAGAGGATGGAGGCAACATGGCCGAATAGGA
-ACAGCTCCAGTCTACAGCTGCCAGCGTGAGTGATGCAGAAGACAGGTGATATCTGCATTTCCAACTGAGGTACCAGGTTC
-ATCTCACTGGGGAGTGCTGGACAGTGGGTGCAGCGCACCATGCATGAGCCAAAGCAGGGAAAGGCATCACCTCACCTGGG
-AAGCAGAATGGGTCAGAGAATTCCCTTTCCTAGTCAAAGAAAGGGGTGACAGATGGCACCTGGAAAATCAGGTCACTCCC
-ACCCTAATACTGCGCTTTTCCAACAGGCTTATCAAATGGCACACCAGGAGATTGTATCCAGCACCTGGCTTGGAGGATCC
-TACACCCACGGAGCCTCACTGTTTGCTAGCACAGCAGTCTGAGATCAAACTGCAAGGTTACAGTGGGGCTGGGGGAGGGG
-CTCCCGCCATTGCTCAGGCTTGAGTAAGTAAACAAAGCAGCCAGGAAGTTCGAACTGGGTGGAGCCTAACACAGCTCAAG
-GAGGCCAGCCTGCCTCTGTAGGCTCCACCTCTGGGGGCAGGACACAGACAAACAAAAGACAGCAATACCCTCTGCAGACT
-TAAATATCCCTGTCTGACAGCTTTGAAGAGAGTAGTGGTTCTCCCAGCATGCAGCTTGAGATCTGAGAATGGGCAGACAG
-CCTCCTCATGTGGGTTCCTGACCCCTGAGTAGCCTAACTGGGAGGCACCCCCCAGTAGAGGCAGACTGACATCTCACATG
-GCCGGGTACCCCTCTGAGTCAAAACTTCCAGAGGAACGATCAGGCAGCAGCATTTGCAGTTCACCAATATCCACTGTTCT
-GCAGCCACCGCTGCTGATACCCAGGCAAATAGTGTCTGGAGTAGACCTCCAGTAAACTCCAACAGACCTGCAGCTGAGGG
-CCCTGACTGTTAGAAGGAAAACTAACAAACAGAAAGGACATCCACACCAAAACCCCATCTGTATGTCACCATCATCAAGG
-ACCAAAGGAAGATAAAACCACAAAGATGGGAAAAAACAGAGTAGAAAACCTGGAAACTCTAAAAATCAGAGTGCCTCTCC
-TCCTGCAAAGGAATGCAGCTCCTCACCAGCAATGGAACAAAGCTGGACGGAGTATGACTTTGACGAGTTGAGAGAGAAAG
-GCTTCAGAAGATCAAAGTACTCCGAGCTAAAGGAGGAAGTTCGAACCAGTGGCAAAGAAGTTAAAAACTTTGAAAAAAAA
-TTAGACGAATGGATAACTAGAATAACAAATGCAGAGAAGTCCTTAAAGGACCTGATGGAGCTGAAAACCATGGCACAAGA
-ACTACATGACAAATGCATAAGCCTCAGTAACCGATGTGATCAACTGGAAGAAAGAGTATCAGCGATGGAAAACGAAATGA
-ATGAAATAAAGCATGAAGAGAAGTTTAGAGGAAAAGGAATAGAAGAAATGAACAAAGCCTCCAAGAAATATGGGACTATG
-TGAAAAGACCAAATGTATGTCTAATTGGTGTACCTGAAAGTGACGGGGAGAATGGAACCAAGTTGGAAAACACTCTGCAG
-GATATTATCCAGGAGAACTTCCCCAATCTAGTAAGGCAGGCCAACATACAAATTCAGGAAATACAGAGAATGCCACAAAG
-ATACTCCTCGAGAAGAACAACTCCAAGACACATAATTGTCAGATTCACCAAAGTTGAAATGAATGAAAAAATTTTAAAGG
-CTGCCAAGAGAAAGGTCAGGTTACCCACAAAAGGAAGCCCATCAGACAATCTGCTGATCTCTCCTCAGAAACTCTACAAG
-CCAGAAGAGAGTGGGGGCCAATATTCAACATTCTTAAAGAAAATAATTTTCAACCCAGAATTTCATATTCAGCTAAACTA
-GGCTTCATAAGTGAAGGAGAAATAATATACTCCACAGACAAGCAAATGCTGAGAGATTTTGTCACCACCAGGCCTGCCCT
-AAAAGAGCTCCTGAAGGAAGCACTAAACATGGAAAGGAACAACTGGTACCAGCCACTGCAAAAACATGTCAAATTGTAAA
-GACCATCAAGGCTAGGAAGAAACTGCATCAACTAACGAGGAAAATAACCAGCTAACATCATAATGACAGGATCAAATTCA
-CACATAACAATACTAAGCTTAAATGTAAATGGGTTAAATGCTCCAATTAAAAGGCACAGACTGGCAAATTGGATAAAGAG
-TCAAGACCCATCAGTGTGCTGTATTCAGGAAACCCTTCTCACCTGCAGAGACACACATAGGCTCAAAATAAAGGGATGGA
-GGAAGATCTACCAAGCAAATGGAAAACAAAAAAAGGCAGGGGTTGCAATCCTAGTCTCTGATAAAACAGACTTTAAACCA
-CCAAAGATCAAAAGAGACAAAGAAGGCCATTACATAATGGTAAAGGGATCAATTCAACAAGAACTAACTATCCTAAATAT
-ATATGCACACAATACAGAAGCACCCAGATTCATAAAGCAAGTCCTTAGTGATCTACAAAGTGACTTAGACGCCCACAAAA
-TAATAATGGGAGACTTTAACACCCCACTGTCAACATTAGACAGATCAACGAGACAGAAAATTAACAAGGATATACAGGAA
-TTGAACTCAGCTCTGCACCAAGCAGACCTAATAGACATCTACAGAACTCTCTATCCCAAATCAATGGAATATGTATTCTT
-TTCAGCACCACACCACACCTATTCCAAAATTGACCACATAGTTGGAAGTAAAGCACTCCTCAGAAAATGTAAAAGAACAG
-AAAGTATAACAAACTGTCTCTCAGACCACAGTGCAATCAAACTACAACTCAGGATTAAGAAACTCACTCGAAACCACTCA
-ACTACATGGAAACTGAACAACCTGCTCCTGAATGACTACTGGGTACATAAGGAAATGAAGGCAGAAATAAAGATGTTCTT
-TGAAACCAACAAGAACAAAGACACAACATACCGGAACCTCTGGGACACATTCAAAGCAGTGTGAAGAGGGAAATTTACAG
-CACTAAATGCCCACAAGAGAAAGCAGGAAAGAAATAAAATTGACATCTTAACATCACAATAAAAAGAACTAGAGAAGCAA
-GAGCAAACACATTCAAAAGCTAGCAGAAGGCAAGAAGTAACTAAGATCAGAGCAGAACTGAAGGAAATAGAGACACAAAA
-AACCCTTCAAAAAATCAATGAATACAGAAGCTGTTTTTTGAAAAGATCAACAAAATTGACAGACCACTAGCAAAACCAAT
-AAAGAAGAAAAGAGAGAAGAATCAAATAGATGCAATAAAAATTGACAAAGGGGATATCACCACCAACTCCACAGAAATAC
-AAACTACAATCAGAGAATACTATTAACACCTCTACACAAATAAACTAGAAAATCTAGAAGAAATGGATAAATTCCTTGAC
-ACATATACTCTCCCAAGACTAAACCAGGAAGAAGTTGAACCTCTGAATAGACAAATAACACTCTCTGAAATTGAGGCAAT
-AATTAATAGCTTACCAACCAAAAAAAGTCCAGGACCAGATGGATTCAAAGCCGAATTCTACCAGTGGTACAAGGAGGAAC
-TGGTACAATTCCTTCTGAAACTATTCCAATCAATAGAAAAAGAAGGAATCCTCCCTAACTCATTTTATGAGGCCAGCATC
-ATCCTGATACCAAAGCCTGGCAGAAACAAAACAAAAAAAGGAGAATTTTAAACCAATATCCTTGATGAACATTGATGCAA
-AAATCCTCAATAAAATACTGGCAAACCAAATCCAGCAGCACATCAAAAAGCTTATCCACCATGATCAAGCGGGTTTCATC
-CCTGGGATGCAAGGCTGGTTCAACATATGAAAATCGGTCAATGTAATCCAGCGTATAAACAGGACCAAAGACAAAAAACA
-CATGATTATCTCAATAGATGCAGAAAAGGCCTTTGACAAAATTCAGCAAACCTTCATGCTAAAAACTCTCAATAAATTAG
-GGATTGATAGGATGTATCTCAAAATAATAAGAGCTATCTATGACAAACCCACAGCCAATATCATACTGAATGGGCAAAAA
-CTGGAAGCATTCCCTTTGAAAACTGGCACAAGACAGGGATGCCCTCTCTCACCACTCCTATTCAACATAGTGTTGGAAGT
-TCTGGCCAGGGCAATCAGGAAGGAGAAGGAAATAAAGGGCATTCAATTAGGAAAAGAGGAAGTCAAATTGTCCCTGTTTG
-CAGATGACATGACTGTGTATGTGGAAAACCCCATCGTCTCAGCCCAAAATCTCCTTAAGCTAATAAGCAACTTCAGCAAT
-GTCTCAGGATACAAAATCAATGTGCAAAAATCACAAGCATTCTTATACACCAATAACAGACAAACAGGGAGCCAAATCAT
-GAGTGAACTCCCATTCACAATTGCTTCAAAGAAAATAAAATACCTAGGAATACCACTTACAAGGGAAGTGAAGGATCTCT
-TCAAGGAGAACTACAAACAACTGCTTAATGAAATAAAAAAGGATACAAACAAATGGAAGAACATGCCATGTTCATGGGTA
-GGAAGAATCAATATCGTGAAAATGGCCATACTGCCCAAGGTAATTTATAGATTCAATTCCATCTCCATCAAGCTACCAAT
-GACTTTCTTCACAGAATTGGAAAAAAACTACTTTAAAGTTCATATGGAACCAAAAAGAGCCCACATTGCCAAGTCAATCC
-TAAGCCAAAAGAACAAAGGTGGAGGCATCATGCTACCTGACTTCAAACTATACTACAAGGCTACAGTAACCAAAACAGCA
-TAGTACTAGTACCAAAACAGAGATATAGACCAATGGAACAGGACAGAGCCCTCAGAAATAATGCCACATATCTACAACTA
-TCTGATCTTTGACAAACCTGACAAAAACAAGAACTAGGGAAAGGATACCCTATTTAATAAATGGTGCTGGGAAAACTGGC
-TAGCCATATGTAGAAAGCTGAAACTGGATCCCTTCCTTACACCTTATACAAAAATTAATTCACGATGGATTAAAGACTTA
-CATGTTAGACCTAAAACCATAAAAACCCTAGAAGAAAAACCAGGCAATACCATTCAGGACATAGGCATTGGCAGAGACTT
-CATGTCTAAAACACCAAAAGCAATGGCAACAAAAGCCAAAATTGACAAATGGGATCTAATTAAACTAAGGAGGTTCTGCA
-CAGCAAAAGAAACCACCATCAGAGTGAACAGGCCACCTACAGTATGGGAGAAAAGTTTTGCGACCTCCTTATCTGACAAA
-GGGCTTATATCCAGAATCTACAATGAACTCAAACAAATTCACAAGAAAAAAACAAACAACCCCATCAAAATGTGGGCAAA
-GGAAATGAACAGACACTTCTCAAAAGAAGACATTTTGCAGCCAAAAGACACATGAAAAAATGCTCATCATCACTGGCCAT
-CAGAGAAATGCATATCAAAACCACAATGAGATACCATCTCACACCAGTTAGAATGGCCATCATTAAAAAGTCAGGAAACA
-ACAGGTGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGACTGTAAACTAGTTCAACCATTGTGG
-AACTCGGTGTGGTGATTCCTCAGGGATCTAGAACTAGAAATACCATTTGACCCAGCCATCCCATTGCTGGGTATATACCC
-AAAGGATTAAAATCATGCTGCTATAAAGACACAAGCACATGTATGTTTATTGTGGCACTATTCACAATAGCAAAGACTTG
-GAGCCAACACAAATGTCCAACAATGATACATTGGATTAAGAAAACGTGGCACATATAAAACATGGAATACCATGCAGCCA
-TAAAAAATGTTGAGTTCATGTCCCTTGTAGGGACATGGATGAAGCTAGAAACCATCATTCTCAGCAAACTATTGCAAGGA
-AAAAAACCAAACACCACATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAAAACATGGATGCAGGAAGGGGAACATC
-ACACACTGGGGACAGTTGTGGGGTGGGGGGAGGGGGGAAGGATAGCATTAGGAGATATACCTAATGTTAAATGACGAGTT
-AATGGGTACAGCACACCAACATGGCCCATGTATACATATCTAACAAACCTGCACGTTGTGCACATGTACCCTAAAACTTA
-AAATATAATAATAAAAAAAATTAACAGGAGACTTTTATACAGATAAATTTGCTTTGCATCATGATCAGCACTAAAGAGCA
-TCATAGATTTAAACCATATTTTCACAGTTAAAACAATGTAACCAAATATGCAATATATTATGTAACATTCTACAAGATGT
-TTTCAAACATGCAAACTGACCTTTAAAACAATTTTGCATAAAATAACATTTCTAGGTAAGAGAAAATACAGACATGTGGT
-TAGGGCAAAATATTTCTGTTCAAATTACAAAATACTGAATGACAAATCACAGGATAGAAAAGAATTATATTGTACCTGGA
-ATTTGAAGTCTTCAAATTTATTTAGATATACGTATCTATATGTATTAATAGAGACATATTTAACTGATTATAAGTTTAGA
-ACATTTATATTTTAAAGATGTCATTCTTTAAAAATTATTAATATCTACAGGATTGATACAGATATTTTAATTTTAAACAA
-ATATTTTTCACTAATGTGACCAGTATTTATGTCCTATTTCATTAAACAGACATTTCAAGATTTTTTAGAGTTAATTTTTA
-AAAATTAAGTATCACAAATATTTCTGAAGTACTACCTTAAAAAATAAAACTCTTTCCTAGCTTTTCATATAGTTAAACAT
-TTTCATAATGACTAAAAAGATAAAAATAAATTAGCAACCATAATTAAATTAGAATTCTACTTTTTATATCAGATGAAATA
-CTACATAAAATGTCCAGAAAATCTAGTGTTAATGAGGCTGTGCAGCCTGGACATTTGATGTCTCATCTGTGGGAATGTGA
-ACTAACCCAACCATTCTGAATAATTATTGACTCTGTGTGTTAACAGTCTAGAGTCCTGAAACAAGGATCTTAATTCTAAA
-ATAAAATCCTATTCTAAGAATATACCAAGGGTTGATAATCAAGGAAGTTTCAAAGTTATAGAGAAGAACCTTCATCCTAG
-CATTATATATGTAATCATCCATATAAACCACATAGTGTTGAATGAAATTACAGAAAAACAAAGAGCCTACAGAATATGTT
-TCTCTTTGTGTACAACAGTAAATGTACACATCTATCCATGTAAAATTTTACATCTCAGGAAGATAGGTACCAACATGTTA
-ACATGCTATATCTATAAGATAAGAAATTTTACTTTCCTACAATTTCATACACACACACACTCTCAAACATACATACCCAC
-ACACCGAGGATATATACACACACAAATATATATATAAACATACATGTTTATATAGGTACACACACACATACATATACACA
-GATGGTCAACAAATTATAATGGTTCAATTTATGATTTTTTTTACTTTATGATGAAGCAAAAGTGATAGCTTTGAATAGAA
-TATAACCATTCTGCTTTTCACTTTCAGTACAATATTCAACAAATTACATAAAATATCCAAAACTTTATTATAAAGTGGGT
-TTTGTATTCAATGATTTTGCCCAATTGTCAGCTGATGTAAGTGTTCTGAGCACATTAAAGGTATGCCAGGCTAAGCTGTG
-ATATTCAGTAAGTTAGGTATTAAATACATTTTTAACTTACTGTATTTTCAATTTATAATCAGCTTATCAAGACTTAACCC
-CATTGTACATTGAAAAGCATTTGTATTGCATTAAACATGTTATATATATTTTTAATTGAAATTACTGGCAACTTTTGAAA
-AAATGTAATGAAATAATGTGCTTTGCTATTGGTTAAAGTGTTTTTGGGCAGGGTCAGTGGCTTACACCTGTAATCCCAGC
-ACTTTGGTAGGCTGAGGTGGGCAGATCGCTTGAGGTCAGGAGTTTGAGACCAGCCTGGCAAACAGGGTGAAACCCCATCT
-CTACTAAAAATACAAAAATCATCTGAGTGTGGTGGCATGTGCCTGTATTCCCAGCTACTAGGGAGGCTGAGGTGTGAGAA
-TTGCTTGAACTAGGCAAGCAGAGGTTGCAGTGAGCCAAGATCAAGCCACTGCACTCCAGCCTGGGCAACTGAGTAAGATT
-CTGTCAAAAAAAAAAAAAAGAAGGAAAGAAAAGAAAAAAAGTTTTCAGCTTCAAGTAACAGAATAGTCAACTAATTAAAG
-AAAAAAACAAGGAGCAACTTTTACCAAATCGCACAACAAATAGATGGTATCAATGCTTACTTAATTCAACATGATCCACT
-TTGTGATTCTCTTATCTTTCTACCTATGTTTTCAAGATGGCTATGGCATTCCCAGCCTTACAACTTCATGTGACAAAATC
-CAATGGCAGGAAATAATAAGTGACGGCATTTTGGAACTTTAAGGAAAAACTTTAAGGATTGGAAAACAGGGATGCCATAT
-GTCCAGTAACATGGGATAGCCGTTCCTAATTAAGGATTGCTGTATGTCCTGAATGACTTTCTAATGTAATGAAGGTGAAT
-AACCTGCTTTGTTTAATTATACAATCCCAAATGTAACTGCCTAAGTGCCAAGTACTTTTGCATGGTTTTAATATGCCATG
-AATTTTGCAAGAATGAAACTACTATGTATATGAGAAAAGATGGTAGATTTTTTCATTTAGATACTCATTTCAGAGTCTCA
-ATAGGAAAAACAGAACACACTCAAACTAAGATAATTTAACATGGGTTTATTTCCAAAGAGACTACTTACGAAAATGTCAG
-GGGAGAAGGGTGAAGGAATCACAGAAATCACACCCCACAATAACTCTGGGTTAGTAGCAGCAGGCAGAGTTCTGGGGAGT
-AAACTTCCCTGATCACGCAAGGAAACACTAATTTTCTTATGAAAAAGATTGGTCAAGGAGACCTAGCAGAGAGGGAGTTT
-AGGCAATAACCCCCAATCCCATTTCCTCCTTCCCTTTAATCTCATGAACATGCATAGAAGGCAATGAGCAAGGGAACAGA
-TTGAGATATTCAATATGGACCATTCCACTTGGACAAAAGCCAGTAAATAGGGGAGTATAACAGGGGACAAGGGCCAAACA
-GAAAGTATCTATTACATTTACCAATGCAGATCAATCATGTCAAAAACAGCAATGGCAGTTTTGGCATTTGGTTATTCAAT
-GAAACTATATTTGTAGTTTTTTATTTACAATGTTTCAAGGTATGGGCGAAGATATGAAAATATCATTATGTTCTATTTTA
-TTTGATATGTAAATGTTCTGGCACAATTATATACATTTTGGATCATATATTGACAGTAAATTATTTCTCCTTTGTTAGCT
-TCAGCATAACATTAATATTTTCAACAACTTGAATGCATACATTGTGTTCTCACTAATAGTTTAGAATAGTGAAGGGGTCT
-TTGAAGAATTTCTTATGAAGTAGAGGCATTGGGTCAGACAGAGACGAAAACCATTGGCTTAGATTAATCACTATTTATCC
-TAGGGCTGAAGAGGGCCAATTGAAGACACAAATGTCCAATCCCTTTATGACCTTGGAGTTCTATGAACCAGAGAAATAGA
-GACTGGTTCTTAAGGAGGTAATAAGTGTGCCTTCTATGGTTTATAATAATATGCATTGTCTTAACAATCGAATACTTAAA
-AGTTAATGCCCTCATAATATGCAAAATTTTTAATAAGCACATTGGTCCCTGTGTTCAAGTAGTTGGTAATCAAATTAGCG
-AAGTATGGTAAGTCTTTTGAAGAGCATTAAACAGCAGAGAATGTAAGAAATTTGTCTCTATAATAGTGTGGGCCTTCTGT
-GTTTCCTAAGGGCACATTCATATGATCTAATAACTGAGCAGAGAGAAGCCTAAAGGATAGTTTTTGGTTTCATTTGTTTG
-TTTTTCCAATTAACATACATTTCTAGATTAAAGGTCAACTATCTTTTCCTTGGGAGTCAACTATAGGAGAAGATAGTGAA
-GAGGCAAGGAAAATTACAGCAGCTCAACAGCTTTACCCTGGAAATATCTGTATTGTGTACCGCTATAGCCTACCTTTATC
-AGTCAGATAACAATGTCAAAGAGGCAAGCTTGGCACCATTGCTCTTAGTGAATCCCTGCTGCCAGCCTTTTATCCTAAGT
-GCTCTCCAAAGACCCATTTAATGGACCTTCCTGAAATTGTGCTCAGGATCAATATGAGGCTCATTGATACAGCATTTTTG
-GAACTCACCATTTGCTTATTTATTAAACCTGGGATAGTTGCCCGACTTCTATCATCTGAAATCCTCTCCATGACTTTCAA
-AGTTACCAACATTGGTTCCAACATCATTCCTAGAAAACATTTCAGTGGAGTATATTTATCTGACATTTGACTGTATTTAT
-AGCAGTAAGAATCTATGATGATTCCTCCCAAAATAATCCCACAATTACACATTTTGGGTCACCTTGAGGGTCTTATCCTT
-AATATCAGAGATCTGTTCTATACATTTGAGTCTTAGAAATAATTACTAGCTTCTCTCTGAATTTAACTGAGGTTCCTTAC
-TTTTATTCAGCCTGTTACCTAAATTACATAATGTATTGAAGGCTATAAACTGTCCAAATTTCTGATTACATTGAGTTAAA
-AATGGGAATATGACTTTCTTTTTCTAACTTGGCAAAGATTATGTTTTTTTTCATGAAGAAATATAGGCATATTTAAACAC
-TCAGGATCTGAGAATTTGAAATACATGAAACTTAGCAAGTGGTCTTTAAGTAGTTTTCATTTCTAAATTATAGTACATAC
-CATTGAATGCTACAGAAGGAAAGACAATGAGGGATTACTCATAAACATTGCCTTTATGATATCCTTCCAAAGAAAACCAA
-GTGTCCCTGTGCTTGGACTCATAAAGCAGAAATGCTTACCTTGCTTTTATGTCACTAACAAACAATTGTGCCTAGTCATT
-TAATTCTAACGCATTTAAGCCATCTAGAGAGTGGAGCCCCTAGGGAAAACTACAAATGGAAAATTCATTGATTTTTGATT
-TTGCTTTCCTATGGATTAAATTTAACACTTTCTTGTAAATCTCTCCCTTTACAGATCATATGTGATAAATAGTTATCCAA
-CTTTCTAGATGTCCACCCAGAGCTGCTTCCATATGAAGAGGTGGAAACGGATTCTGTGCATGATACTGGTTAGGATCGGG
-AACTGTTTTTTTTTAAAGGAGATTTTTAAAATTTGTTTTCCTTGTACACATAGCCTTAATATTGTGTTGCTAACTGCCCT
-CTGGGAACAAAGTCATACCAATCACAAATACATTGCCTAAAGTGGGATGGTTATTACTCTGCTGTGAATTGCACCTCCTA
-TTATGTTTTAAAGATGCTACAAACTTGAGACATTACTATGTAGATGACATTCCCAGCAAATCCCCAAACAACACTTAATG
-AGATTTCAAATACCAGGATCATGAAACAGTAAGAGATATAAGGAAATAAAGAAAAACACAGTATATGTGTAGAAGGCATT
-AAAACACAAATTTTATAATTACGAATGCATATAATAAGGAACAAGTTTTATTCTAAATAGCAATTATATCAGAACTACGA
-TACAGGGAATAAAAGTGAATATTAAGCCATTGTACCAACAATAACAGAGCCCCTTTTCTGCTGCGTGATGGAATTTAGTG
-TTTACTAAGGAAGAAAAAAATGCAAGATATCTTAAATTTGGTACTTTCCAACAAATTTAAGAAATGTGTACACACTTGAG
-GAGACTTAAGAAGTCTCTGACTAAAACACTAGAAAAGAAAAGCAGTGAAAAACCAAATAAGTATTACTCAACAATAACAA
-CATTTGTTACTATTATATTAATATTAAACACACTATTAAGCAACAACATTTCAGTTACTCACTGAGCCCAAAGTCATTTT
-TCATGAACCATTCACAACACTGATAACCTATTGAAAAATGATTGAAAACAAAAAAGCTTATTTCTTTCCAAGTCCTTTTA
-AAGCCTTCTCTTGTGTCATTTCATATAATCCTTATAACAAATCTATGGAGTATATACTGACTTTATCTCTGTACAGAAAA
-GAAAACTGAATCACATTCAGAATAAGTTGCAAAGATCCCCAGATAATCAGTGTCATAGGTGAAATATGATGTCACAGTGT
-ACTCAAGAGTAATTTAGGGAAGCAGTACAAATGATGGTTGAAAGCACAGGTTCTGGGATAAATAGCCTGAAGTCAAAATC
-TAGTTCATATCCTCAGTGGCTGTGTGATCTTGGGAAATTTCCCTTAACTCTCTGTGTCTTGATTTTATAGTTTCATCCAT
-TTTTGCCTCTCATATGATCTGGTGAGCGTTACACTAGTTTATGCTTCTAGGACACTGAAAACAGTGCCTGGCTCTTGATA
-AATATTAACAATTTTGTTTCATTTTCTTCACCTTGAGTATTTCATGGCCAGATGGAAATCAATGTCAATATGAAAAAATG
-TTCATAATTCAGCAGGAAGAAATACAAAACCATATAAACAACTTTGTTTTATTGGCAAGTGTATTTGGAAGCTATGTTAA
-ATTGAGAAGGGGAAGGGAAAGCCTCTAAGGATATCGATTAATCAATGACTGAAAGCTGATGAGACTTGTCTGGAATTTTT
-TTTTGGAGACTCTGAGACTTAAAATTTTGACAAAATAAGGAGATGAATTGAGTAGTGTGGAAGAGACATTTTCTGAAGTC
-AGCAGAGAAAGGAGAGACAAATATGGTAAGGGGAAAATGGTATGAAGTAATAATATGAATGAAGTGCTTTCTAAAGTATA
-ACACATGTAAGTTGTGTTAAATGTAAACTATCATGATTATATCATTACTGTCTGACTGATACAACTATATCCACCTCAGT
-TAGCCACATAAGATCAATTTTCCTATATCTTAGAGAATACCAGTAACCTCCAGTTCAGAAACAGCATAAATATCTATCCA
-CAGCTGAGCAGACACATACAGCTAGCTACCAGATGAAATGGGCTATATCTTCAAATACTATTGTTTTCCATTTTTTAACT
-GTGGCAAAACACACTCAACAATTTGCATCTTAACCACTGTTAAGTATACAATTCAGTGTCATTAAATGTATTCACAATGT
-TGTGCAAGCATCACCACCACCCATCTCCATAATTCTTTTTGTCTTGTAAAATTGAAATCCTGTATCCATTAAAAAGTGAC
-TCCCCATTCCCCGCCCTCCCAGGGCAACTACAGCTTTACTTTCTGTCTTGATGAATCATACAATATCAAATGGAATTTTT
-AAGATATTTAAAATCTTTTGTCTGGAAGCGAAGTGGAAGTTAATATCAATGGCTATGCCTTCAGTGAGTTCTCAGACCAC
-ATTGCAATGTAGTTAACTATTTATCTTTTATTACGTTCTAGACCTATTATTTCTTTCTGGCACAAAAATATCTTCTTTGT
-AGATTATGGCATTTACCTCTATCTCCACACCTTTCTGCGTCTGTCATCCACAGATCATCAGCCTCTTGCTTAGTCTCCAT
-TTAATGACAATTTCTATTTAGTATACAAGAGTCCTTCCCCCCGCAATGCAATTTCTTCACTCTGAAAAGCTCTGACTCTG
-GCTACTGGTCTCTGTTATGTACTCATCCCTAGAGCCATGTCTTCAAATATTTCTCAGAACTTCTTCACATCTAAAAATCT
-AGGATTAATGTATTGCTCTCTGATTATATTCTTCTGGTATTTCAAGTATCCTGTATAACTTCTTAATCTGCCCTTGCTTT
-TCTTCTACATCAAGATGTCAAGTTCATGGACTTCCCAATTAATCATTTTAAAAATTTATTTCAAGCCTTTATGAGTCACT
-ACAATGTACATATGTTCTCAGGAATTATGACCCTACAATTTGTATATGAGAATAGTTCCTGTGTCAGGCATTATGGACAT
-AAGAGTAAATAAATTCTAGCCCCTGCCTACAAGGAGCTAATTCCCAGCCTAAGACAGATTGTAAGCCAATAATATGCAGA
-GTTGTAAGTCTAAGGAAACTGATTGGGATGTACCTAATTCGAGCTGGGAATATCAGAAGAAAAACTTTTTGAAAGTCATG
-AGACATGAGCTGTGCCTAAAAGAATAAAAATAGAGTGAGAAATAAGAATAAATAAATTAGGGAATGAGATGGGTATAATA
-GTAGAAAAAGGAAATCTCTTTAGATAAAACAGGGTATGAGAGTATATAGGAGGCTTATTAACTCAGTGTGGTTGGAGAAA
-ACAGGTTGAAAGGAGAAATAGGGGAGAAAGTTACAAACGGAATCAAATGTGTTAGTAGTTGAGGGAAAAGCAAATATTGA
-ATACGACCCATAGATCTTGGATAAACCAGTGTTTGGTAGTAGCTTACATAAAAGGTTGTGACAAAATAACCAGAGATATG
-TGGAGAAAATAATAACTGAGTGTTATATTTCCTCTCAGTAGAAACCTAAAAAAAAAAATGTAATCACATACTGATCTTTT
-AACTGACCTCCACTTATCTTGCTGCCTGGATTGGTATATATAGTCCTCTGCCTGAAAAATTGCTCAACACTTTTGAAAGG
-TTGTTTCTCACTGTTACTCCCAGGCATTTCTGCTAACACCAGCTGAGTTGTAAGGGGCCCTCCAGGAGGCCTAGGTTGTT
-CTCCTTATCACATATATTATTTTCATTTATCAATTTACCCAGAACATCTAATGAAATATTATGGACACCAATAACATGAA
-TACAAATACAGCTATAGTCCCTAAAAAGTAAATTGATGTCTCTTGAAAGACTGTCATGTCTTAGATGCTAAATTTGGAGT
-ATGTGTTTCTAATAAATAAATAGCTTGCTTTAATAATTCTGATTTATGAATGTAATATAGGGGAGCAGCTTTTATTTCAT
-CCTTAATCTTAAAAAACAATTAGCCGGGTGTGGTGGCGGGCACCTGTAGTCCCAGCTACTCAGGAGGCTGAAGCAGAAGG
-ATGGTGTGCACCTGGGAGGCGGAGCTTGCTGTAAGCCAAAATTGTGCCACTGCACTCCAGCCTGAGTGACAGTGTGAGAC
-TCTGTCTCAAAAAAAAAAAAAGATCATACAAGGAGTAAATGATGATTTAGCATAAAACACAACTTGAGCCTAAAACACAG
-ATCATAGGGCTCAAACTTTGTTATTTTATGGGATTATACTAACCAGTTAATATTCAAAATTTACCATTTCAAAAGAAGAA
-ATATTGGTCTGGGAAAATTGCCATTGCTTATACAGAAGAATGGAGGAATCTTTTTGAGAACAACAATTCTAATGATCTTC
-TTCATCACTGGTTCCAAAACCAAGCCCATGGAAGGCCTGCATAGGGATAATGTGGAGAACATGCAAAAGAAATACACATC
-ACCAGCTCCTCAACTCAGAGCTCCAAGGGAATGGCCAAGGAAGCTGTATTGTCCTAAGAAATTTGAGACTGTTTTGACTT
-ACAATAAATCCTGCTCAATCATATGTATGTATACACACACACACACACACACACACACACACACACACACACACACACAG
-AGAGAGACGGTGTTGTCAGTGAAGCCTCTAACATTGCATCTTGACTGGACAGATTTGACAATTAAAATGGCTGGAAGAAA
-ATAGGTTTCATAAGTGTCACTTACTATTCACATTACACATTAAAAGGACATCTCCTAAATTAAATCTTGTCTATGATAAA
-AAGGCAGAAAATCATGACCCAAGGCTCATTTATAACTGCAGAAATGTTCAAGATAGACCAATGCTTGCTATGTTTAGGAA
-GTGACAAGAAAGTACAGGTCTTTATAATCTACCATTTTGCCCCTTTTGATACCAGGTGACCTTCATAATGCAGGCTATAG
-AGAATTACAAGATTTGTCAGAGATTTCAGGTCTTTGGAAAGCTATGCTCTTTCACAAGAACAGCCATGGAAACAGGAAGA
-AAGTCAATTCCCACTTAAGGTAATCAGAATTTACAAATATTCCTTTCTTCATTGAAATCTCAATAGGCACTTCGATATTA
-TATTTAATTAATTCTTTTGTTACAATCATGCATCACATAACAACATTTTGGTCAAGGATAGTGCACTTGTATGACAGTGG
-TGCAATAAAATCATAACACTGTATTTGTACTGTACCTCTTGTATGTTTAGACATGTATAGATACACTTACTGTATAGATA
-TAAGTAAGTATAGATATACTTGACTGTTGTGTTACAATTGCCTACAGTATTCAGTACAGTAATATGCTGCACAGGTTTGT
-AGCCTAGGAGGAATAGGCTATACCACCTAACCTAGGTATGTAATCAGCTATAGCATCTAGGTTTGTGTAAGTAAACTCTG
-TGATGTTCATACAATAATAAAATTGTCCAGCAATGCATTTCTCAGACACACCCCTGTCATTAAGTGACACATGACTGTAT
-TAGTTAACACTATGGGAACTTCATGGGAAATGGAAACTCTAGCTCCACCATAAATAGAAACTGTTTATGTCAAAAAACAC
-ATAAAAGCATAGTTGCAAGATTACAATTCCTTCCAGATATTTCATTTAGTACCTCCACAGATCATTAACTTCCTGAATAG
-CATTCTTGTGTTTCCACTGCCTCACATTTGATTTCAGGTCATTCCATCAATTGTCAAAGATGCATCCAACATTAACTTTC
-CAACTACTGGTTTGGATTGTGTCAACATTGTCATTCTGGGCCACAACAACACAAAAGGCTAACTCAGTGAGGTAACATAG
-ACACTGATCAGTGAGATTTTGCTGATGGGTGGTACCATTTTTTACCAAGATCAAGGGTATTCATACCTTCAGGCATCTAG
-ATAACATTGAAAAGGGCAGGTTCATAGATAAAAAGGGAAAGAGGAAGGGTTTTTGCAGTATATATGAGCTACCATGTCTC
-CTGTTTAACCTGAGTCTGAAGAGATTCAAAGTGCAGGTGCCATGAATGCCTCTTTAATAGCTCCATGTCGATTGATTTTC
-TGGGCTACACTTCACAGCATTCAAATTGCTAAATGCATATAAACTAGTAGTGGATATTTATTACCTGGATTTGTGCTTCT
-GAGTGACCTTATCTATAGTTATGTGCTTCAGTGATCCAACTTGGGGTGCACTCCAAACTTTGATAAATTAAAGACCCTGC
-ATATTCCTTGAGTAATGCTACACTGACAACTGATTTAGTGAATGCCACTGTGAAAATAATAAACCTCTTGGTGAATATAT
-TTAGACATGTCTTGGAACCTGTACACATCTTAACCAGGGATGTTACTTGGTCTTTTTATGTTCAGGAGTGTCTGGAGATA
-GAAAAACATACAGGATTGTAATTGTTGCCTGTGAGACTAACAGAAAATTCAAGCTAGTGAAGTATGTTTATGCATGGCAC
-ACTTCTCACCAGCAATTTTAGGAAGTTCTACCCAAAACCCATATGTCTTTTGATATGTGGGTTACCTTGGAGAGAGAAAA
-AGAAACTCTGAACACAAGCATGAAATACTTTCGAATTTTATCTAGAGTTGGACTTGTCCAAAAGCTTTTGTATAAACTTG
-CTTGATGAGGAACTGTTGTCCACTGGTACCTTCACCGTACAATCCACACACAACCAAACTTCACAACTGGACACCTAAAT
-TTGCACTTTGTTTGGTAAAGTTGAATGAAAAATGTTGTCTTTTAAGCTTATGTTCTCTTATGAAAGCTGTTATTAGATTA
-ATTTTACTCCAAGATATGCCAGTTAGGAAATAACTTCCCATTTAATTTCACCAGCTCCCTGTGGGTGGACTAATTACTCA
-TACATCACACTTACTCTGGTGGTGAAATGCCTCAAAAGAAGGTCTCCAGAGTGTTGCTTTACCTAGAAGGACAAGAATGA
-AGAGACATAAAAATCATTCATTAAGAAGGAAGAAGATTTTCCTTGCCTAGATTTTCACTTGTAGGATCCAATTAATTTTA
-TCACTTAATATTTTGTCCTGGTGGGCATTCACTTTACAAATTTGTAAGGTCAGTAGAAATGGAAACTTTTGGAAATCAAA
-CTGTAAATGTTCTGTAGACGTTGACAGAAATAGCTATTTGGAGCTGCGCTTTTACCAACTAGACACTCTGAGAAAATCTG
-TGAGAGGATATTTTCAGGAAGTCATTGAACCCCCTAAAAATCAAGTTTATTGCTTTTACCATAAATATAAATAATTTATT
-TATTATCAACCACTTTCAATATTCGAATAAGTAACTTTATTGTTTATTTCATTGACATGATCTACATAGACATGCAATTT
-ATCTTCTTTTGCGATACATTCAGAAAATTTGCTGCCTGAAAAAGCCATGTTTTGAAATTACCACCTGTTTGATGATTGTT
-TTTTTATACTTTAAGTTTTAGGGCACATGTGCACAACGTGCAGTTTAGTTACATATGTATACATGTGCCATGTTGGTGTG
-CTGCACCCATTAACTCGTCATTTAGCATTAGGTATATCTCCTAATGCTATCCCTACCCCCTCCCCCCACCCCGCAACAGG
-CCCTGGTGTGTGATGTTCCCCTTCCTGTGTGCATGTGTTCTCATTGTTCAATTCCCACCTATGAGTGAGAACATGCAGTG
-TTTCATTTCCACTTAAGTATCTATCTCTATTTGTCCTTTATTTTCACTTCCATCCTAGCTCTATCCCTTGTCTCCTTCGT
-GTGTCTCAGGATAAGTGCCCTATAACATTTTATACTTCTGGAAACCCTTCAATATAATGTTATTACATGTAAAAATAAAA
-AGTCTGTTTTAGCGAACTCTTTCTTCACAAATTATCTTTTCCTAGTTCCCTATTAGACAATTTTTGTAGGCTCCATATGC
-TATTAATTTATATTCACTTTTAGAAGAATTTTCATCAAAAGCAAAAGTCTTATGTAAATTGTTTATATGCTATTTGTACT
-TCTGTGTATATATACACGCATAGCCACATACATATATGTAACTCCAGAGGCCTGCCTGGACTGTTAAATAACTGTATTGA
-ACAAGAGCAAGAAAAAGCTGTTCAAATTTCAAACAACAAGTTGAACTGAAGAGCTCACATCTTTGAATGAAATAGACACT
-AGTAGCCTTTAAAAATTAAACATTTCTACTGTTTTAAAAAATTATAGGCATCATAGTATGAGGAAAAAATGTAATAATCC
-TTTTTAATTCTTGCCATTTTATTAACCACGGACTCCTTATGCCCTGACTTCATTGGTACCCCTTTGAGATTAAACAGAAC
-AATTAATTTAAAATTCTGATAAATAAATAAATTGCACCATTTACTTGAGGTACTCTTTCACCTTTCAAGAAATATTTTGA
-GAATTCATTAGCTAAATATTGCTATAATGCAGGCTAGTAATAAATAGAAATAATGATTTCATTGTAAAGTTTAAACTAAT
-GATGGTATGATCTGGAATTTTTGTTAACCTAGAAGACATAATTAGCTCTACAGGTGAAATGAAAGACAAAATCACTTCAC
-ATATTAGTAAAAAACAAATAATATAACTTTATAAGCTACTGCTGTTCTTTTGCTGTTAAGAACCAATGACATCTGTAATT
-AGGGAAGATTATGGAAAGGTTAAAGGTGAGAATACATGCAGTCTATATACAGGAAACCCAAACTGTTTAGGTTAAGGAAA
-TGTCTGCAAAAGTCATATTAATTAGCAGGTTCACAGGAAACTAACATTTATTGTATAAATTCCATGGTCAAATGTATTAG
-GGCTCCACGCACACAACTGTGCGCCATCTATGTTACCACACAGTGCTTACTTCTTTCAGTCTTTATTCATTTCTCTCCTA
-ATGGTCTGTATGGTATTATTACATAGTTGTAAAAACCTTCCATGAGGCAGAAATTTCATTTAATGATACAGCTTCAAAAA
-TAATGAAAACCAGTAGAAACTTTCTATTTTTTTATGAAGCAGAATTATTGAATTTTCAGTTTCATTTATTTAATGTTACA
-AGAGGACAAACATATTTCTTTAATTTCTTCTTGTTATTTTTGTCTAACATCAACCAAAGCCATTTCTTTCATTTGAAGGT
-GAAAACTGCCCATCAAAATCCAGTTTAAGCTGAGAAACAAAGAACTAAATTTTTCATGAGACATTATACACTGCATAAAT
-ATAAAACAGGACCAGAAACAATGGTAGATTAGCAATTTTTAAAAAGACAAAAGCAGGTTATCATCAAATCAATTGTTACC
-AACACCCCAATTCCACCTCTAGGCCAGAAAATTAGCCACTTACCCACGGGAAAACAATGATTGAAGACAAAGTTCACCAG
-TGAAAGTTGGTTATTTTTTTCCATCCTTGCATCAACTAAAATGATATCTACAGTTCCTCTTAACACTTTTCTTACTTTCA
-AATATGTGGGTATGCTTCATTAGCTGAGGCCATGTTCCATATGTACATCTGGCTACAAGGGAAACTGGGAATGTGAGCCC
-TGATCCTAATGTTTGTAGAGTATTTAGAAGTTTGAGAATTCCCTCCAAATAAAGAGTTTTCTAAAACATTGTTAGACAAA
-AAGTTTGAATTACAAAATATGGTAGTAGCTCAGGTCTAAACCAAATGCAGGGAAAAAACTATTAACTCTAAAAAAATTAA
-ATACACATTTGATGGTAATGAGAAACAGAAAACAGGCAGAAATAGTAGAATACTCCACTAATGATGAAGTATTTGACCAT
-TGAATAAAGAAAATTGCAATGATTTAAATTTGCATCAAGGCAACTTCACACCTGATGACGCTTCCCAGTCTGTGCAAAAT
-TAGATGTCTACGAGTAAAGCGGTGAGTTTTACTAGCTTGAGGAATAAGAGCACAGAGTTCCAGGCTGACAGAAAAGAGGA
-ACTGGGAAATTTGAATGACATGGGAGGACATCTCACACAACTGAAAGTCACAGAGGAGAATATCACAGAGTAAAAATCTA
-AAATCAGCACTTCAACTTCATTCAAATATATGATGGCTGCTACATTTCACATTCATAAAAGGAGACTCCATAGAATCCAG
-CAGAAAACAACAGCTAAATTGCTAGTACAGAGCAGAGATTTCAACCATTGCATATAGCTCAGGAGTGAAAGTTTGGTGTT
-TGACTACGGAAAGAAGACTAATGTTAGAAAAGAGTCATTCTTCAAAGGAAAATAAACGAACCTATCTCTACAAAATATCA
-TACACATAATCTAACATATAATTTAATCTGCCTAGACATAGAACCAGGAAAATATGACACACAACAAAAAAAGTAAACAA
-TGGATTAAGACATTGAAATGGCCCACACGCTGGAATTAGAATATAAGAAATTTAAAATAAGCTATTATAAGCATATTCAA
-GGATTTAAGGAATAGATGGTCATAAGAGGGAATATATGGAGAATCTCAACAGAGAAGTAAAAATGATAAAGAGATAATAG
-GACAAATTTTAGAACTGAGAGACAGAGTATCTTATATAAAAATGTCATTTTATGTACATACCAGTAAATTAAAGATGGCA
-CAAAAAATTATCAGTGCACTTAAAAACAGATCAAGAACAATTTCCCAATACAGTTAATACAAACGAAGAAAAATAATAAA
-AATAGGGCCAGTCTAGCACTAATATAATTGGAGTCCTAGAAAGAGTAGAGAAGTAAATGAGACAGAAAAAGCTATTTGAA
-AAAGTAAAGACCAAAAGTTTTCCTAATTGTCAGCATATATCAACTTACAGGTTTAAGAAACTCAAAGAACAGAATAAAAA
-TAAAGAGAACCAAATGTAGACATACCATAGTCAAACCACTGGGCAAAAAAAAGAGTAAATCTTGAAAGTAGCTAAAGGGA
-GGGAGAAAATAATTTACATCCGTGGAAACAAATAGACAGATGACCTGTCATCAGAAATGACACTTTAAAAAGCAATGAAA
-CTACATCTTCAAAAGAAAACTGTCAACTCCAAATTCTATAACTAGATAAAGTAATTCTTGAGAAAAGAAAGATTTATTCA
-GATAAAAGAAAGCTTCAAACAATTGTCATTAGCAGACCAAGATACAAGAAATGCAAACGGAAATTTTTTAGGCTAAAGAA
-AGATAACAACAGACGGAAATTCTGACCTACAGGAAGCAAGGAGAAGCTCTAGGAATGGCATGTGCATAAACGTGAAAAAC
-TAAGGCTTATTTTTTTAGTTTTATAACAAACAACTGATGCTTTGAATAAAAAATTAAGTGTACTATTGATAATGTGTGTA
-AAATATTCTAAATTAATAGCTCTGACAGGAGACTAAACGCAACAATTTTGCCGCAACTTTTCCTTATGTTACATGAAAAC
-GCTGACTATTAACACTAAGTGGACTGCGATAAGCCCAGGATGTTTATTATAATCCCTAGAGAACCACCACATTATATGAA
-GATATTCTTCTAAAATGCCAATAAAGGAATTAAAATGGAACGCTGAATATTGTTCAGTTAATATAAAAAGGCATGAAAGA
-AAGAGGAGCAAAAAATGATGGAGCAAATAGAACATAAGAGCAAAATAGGCTGGGCGCAGTGGCTCAGCCTGTAATCCCAG
-CACTTTGGGAGGCCGAGGCGGGTGGATCACGAGGTCAGGAGATCGAGACCATCCTGGCTAACACGGTGAAACGCCGTCTC
-TACTAAAAATACAAAAATTAGCCGGGCATGGCGGCGGGCACCTGTAGTACCAGCTACTCCGGATGCTGAGGCAGGAAAAT
-GGCGTGAACCCAGGAGGCAGAGCTTGCAGTGAGCCGAGATCCCGCCACTGCACTCCAGCCTGGGTGACAGGGCCAGACTC
-CGTCTCAAAAAAAAAAAAAAAAAAAAAAATAGTAGGCTTAAATCCAACCTTTTCAGTAATTATTTCAAATGTAATTTAAA
-TACTCCAAATAAAACACAGATTGTCAAACTGGATAATAAAAGTACCTATAAGAGATGCATGCCAAATATTATGGTATAGA
-TAAGTTGAGAGTAAAATAATTTCCAAGTATACCAAGGAAACAACAAGGACAAGAAATCTTATGTGGCTATATTAATATAA
-GAAAAAGTAGACCTCCAAACGAGCAATATTACAACAGACAGCTATTTCATAATGACAAAATGTCAAGTAATTATGAAGAC
-ATAATGCTGTATTGCTGACAGAATAACTAAAGAAAATTAAGATAAAATAATTTTGACAACAGCTTGACCTAATCGATATT
-GACCAAAACAATAGAATATATGTTCTATTATGCTACACATGAAACATTTATCATTAGGCTATAGACCACAAAATATCTCT
-CAAGAAGTTTCAAAACACTGTAATCATGGAAAGTATGCTTTCTGACCATAATGAAAATGAGTTGAAATGGGTAAAAACAA
-GCTACCCAGGAAAGTCTACACTATTGGAAGATTTAAATACACCTTAAAATGCCCTTTAGCTCAATGAAGAAATCATAAGA
-AACACCTTTAAATACATTGAACTGAATACAAATAAAAATATACTATATCAAAATCTATGGGATAAAGTTAAGCAGACCCA
-GAGTAAATTTTTTGTATAAATGCTTATTCTAGAAAAGAGAAGTTCAAAACAAGTGAACTAATTTCTACCTTAAAAAGAAA
-ATCTAAAACAAGAGAGCAAATTAAGTCCAAAACAAGTAGAGGAAAGGAAATAAAACAGAAATTAGAAATCAATGAGACAG
-AAAACAGAAACAGGAGAAAATCAACATGGCCAAAAGTTAGTTCTGTGAGAAAGAAAGAAAATGCAAATTATACATATCAG
-GGATTAATGAGATTGTACAGTTGTAGACACAAGAGACATTAACAAGATAATGGAATATTGTGAAACATTATATACAAATT
-TTCATTACTTGGATGAAAGGGTGACTTCCTTGAAAAAAACTTATAAAAAATTTCACAAGATTTAATGGAACATAGGAAGT
-AATTGACATTTATTAAAGTAATTAAATTAATTGTAAAATACCTGCACATAAAAACATAAAATTAAATAAATAAAAAAATA
-AGCAAACCCCAGATCTAAAGAATTTCACTGGTGAATTCTTTCAAACGTTTAAAAAAAATAAAATTTTTAAATTATTTCAG
-AAATAAAGAAGGGGGAAATTCCAAACTTGTTTTATGAGTCAGAATCCTGATACCAAAATTACAAAACCTAGGAATGCAAA
-ATTGACTTCAACTTAAAGAGCTATCACCATTCTAATCTGTGATTCTAATGAATTTGGCTATCTTAGATACTTTATACAAG
-TGGAATCATACAGTTTGTCCTTCTGTGACTGATTTACTTTACTTAGCATTAATGTCCTCTAGGTTCATCCATGTTGCATA
-TTGACGGGCTTTCTTGTTTTAAAGCTGAATAATATTCCGTTGTATGAATATACCACATTTTCTTTATCTTTTCATCTGCC
-AATAGACATTAACCTTATTCCCACATTTTAATTAGTGTAAATAATGCTGCAATGAGCCTGAGAATCATCCCAATCTCCAT
-TCTTTAAGATAAATAACCTGAAGTGAGACTACTAGATCATATGCTAGTTCTACTTTCTTAATTTATTTGAGGAACCACCG
-TACTGTTTTCCATAGAGGATGCACAGTTTTACTTTCCCAGAAACACTGTAGAAGTGTTCCAATTTCTCCCCATTGTTAAC
-ACTCGTTATCTTTTTCTTTTAATAAGACCATTCTAAAGGGCTTGAGGCAATATCTCTTTGTGGTTTTGATTTGCATTTCC
-CTGATTAGTGATGCTGAGCATTTTTTTCATGTATCTGTTGGTCATGTGGATATTTTCTTTGGAGAAATATCTATTGCTGA
-TTTAAAAAAAAAAAAACTCTCAGCAAGCTAGATAAAGAAATTTTCTCGAAGTGATGGAAAGCATCCACAACAAAACATAT
-AAACAATACTATATTTAATGGTGAAAGCGTAAATGTTTAAACCACATAGATTAGGACAAGAAAGGGATGTGTGTGTTCAT
-CACCTCTATTCAACATTGTACTGGTGATCCTAGATTTTGAGTATAAATATTTAGGGGACAACTATTGTCACTGAAGCCCA
-AATCTTGGTCATCCTCAGAAAAAAAAAAAAGTTGATTAGGTTGTATATAATCTAATTTTACTTGCTAATTTAATTTCTCT
-AAAATTGCAGCTTGTATCAACTCTAGAATTTATTGGGCACCTCCTAGGACATAAACACTGGAATTTGGTGAGAGACGTCA
-AATAGGAAAGAACCTGGCTCTGACATAAATTCAACACACGGAGGGGGACACATATTATGAGACTGACCTGGCCTCTTCAT
-CTCATAAAAGGGGTTCTTGTTGCTTGTAACACAGATTAAAACTATTTCAATTACATTCAAGATAAAAAGATTAACAATGG
-TATGTAAGATGAAAAAATCACCCCGCAGGAAGACGAAAGTCTCACAAAAGGATATTTAAGCTAGCCAACACTTTGAAATT
-CAGGCAGAGATCGTGATTTCTGGGTGAACTAAAGTAGCAAGAACAAAGTAGAGGCTCCAATTCTAGGAAAAATGGGTCCT
-AATAAGGTTTACAATCCAGAAACTCAAGATATCCAGACAGAAGGATGCAGTCTCAGCTTTCAAGGCAGCAGCAGTACCTG
-GATTACTAAGCCAATCCCCAACACAATCATAAACACAAATTTGATTGAGGAAGAAGCTTGCCCACCAGAAGATTTAGGTT
-ATTACAAGGTAGAATGTGATAGAGAAAATGAGCATGGGACTGGAAAGAAAAGGAGGTAGCCCCATGATTACAACTGGAAT
-ATATGTGTCAGCGATGGTGCGGAAATAAGACTGAAGAGAGAGATCCTTAAACCCCACGTGCCTTACATCAGGACTAATCC
-TGGACACAGGCTGGAAAGCATAGCCTACAGGTGGTGAGGCAGGAGGAGTGGGCTCAGCTGTGAGAAGGAGAAGGAAATAT
-GGCTGAAAACTAGATAGGGGTCTTGAAATCACACCGAGGATTTGGGCCTTTGCTGCTGTCTGCCAGCAGCTGCCAGTAGT
-TCTCACACTTTGGCTGGCAACAAAATCACCTGGGGCAGTGGTGCGGAAGCGGGGGGAGTGTTGTAAAACCACAAGTGACC
-AGGCAAAAAACACCTGTATGTTTTCCAATTCAGTAAGTACAGAAATATTAATTGGAAAAAGGTGGAGGTCAGACATTGAT
-AGTGCTGTGGACTGCTCCAGGGACGTAAGCATGATCTTTAGAGAGGTGACTCTAATCAATTGAGGGCAACCACTGGACAG
-AAAGAGGTCCAGACCAACCATACACAGAGACATCATACAACTACACTTTAGCAACCTCTCCAAATAACATGTCTCTTAGT
-GAAACTTGGGAGGTTGAAAGTTAAAAACATAAAATCCAGTGGCATTTATGTATCCTAGGCACTTACATTTGTCTGATTCT
-TCCAACTTGCCTTTGCTTGGTTAGAGTTTTGGGTAGATAAGAGGTGGATTTACATGTGCTAGTGTGAGAACTTTGATACA
-CTCATTTAGACATTGACCTACTATCTTGTTTGAAAGCTAAAACCCAAAGAAATTTGTCTTTTTACATAAAACAAATTCAG
-CCCTTGCCTTCCTTGTAGATTACATCTTCCACTAGCAGTAATAAAAAAGTAACAATATGCATAAGTCAAAGTATCTTCTT
-AGATCCTCTGTAGTGTTTTATTATTTAGTTGTGTTAATTAAAGTAACTGTCTCAAAATTTCAAGGAATGCCTGAGAAGAA
-ATTCATGTTCAAAGGCTGCCCTCTTGTGACAATGTGTTGTATGCTTTACTGTAAAAGTAACCTTATTTTACCTTATAACC
-TCTACAATCCAATTCATAACAGCATAAAAAGGAAACAAAACCTTACATAATTTTGAATTTTAAAAAGTACCTTGTTTATA
-TGGCTCCTTTAGCTAATGAATAGTCAATTTGGTAAATATTCCAGTGAGTTGAAGGTTTGAATCTATCTCACTTAACTAGC
-TTGATGAATGTATTTCTAAACCTATACAACCCACTCCTCTGCTTTTAAAAAATTAAAGTTAGCTGTAGATTGAGATGTCA
-GTGACACAGTTTATAGAACATAACTTAGATTGTCATCTACATTACTGTAACTACAAATACCACCCTCAGATGGAAGAATA
-AGTTTTATCAGTGAACATCTCTAATTGAACTATAAATGGTGTATGTCTTCTGGTTTTTACAAGCTCTTGGTCTAACACAG
-GGGATATATGATGTAAAAATTACAAAGCAAGGTCACTCACGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGACCAA
-GGCGGGCGGATCACAAGGTCAGGAGATCGAGATCATCCTGGCTAATATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
-ATTAGCTGGGTGTGGTGACACACGCCTGTAGTCCCAGCTACTCAGTAGGCTGAAGCAGGAGAATCGCTTGAACCCAGGAC
-GCGGAGGTTGCAGTGAGCCGAGATCGCACCACTGCACTCCAGCCTGGTGGGAGAACGACTCCATCTAAAAATAAATAAAT
-AAATAAATAAATAAATAAATAAATAATAAAATAGCAGTGACTATAATGTTTTGTGATGTTAAACTTTGAGAGCTTTTTTT
-TTTCTTTCTTTTCCCAAGTGCCTTTCCCAGTTCCAGGAGCAGAGTTATTCTAAGCCCACTGATGTAAAGGAATAGAAAGA
-AAAGGTTTGTTGGAAAACCTAATAACCTGCTTTCTGTCTTTTGTTTTTTAAAAGCTTGAGCATTTGGGAGAATTTGGAAA
-GATTGTGGAGTAAGTGCAAAGAAGGAATTTGCTAACAAAAATCATATAAGGTAAAATGAGTTTTTTCCAGGTTAGAAAAT
-ATCCACTCCCTACCCTCCTACATTCCTTTCCCATGGTTAAGAAGAGGAAAAAACAAAGGCCTCTTGGTGAGCAGTGGTGA
-CTTAGGCAGTTTCTTAGAAATATTCTAGAAGGCATAGTCATCTTTTAAAAAAAAAATAGCTACAAGGATATGTCTAAGCA
-GAAGGGTCCATGGGCCAAATTACGTGTAGATTTTTGCATTCCAAATATGGTAAAGAAGAAGCAGGAAGCTGGGGCTCCTT
-AACAGGTCACACAGAAATGGACAAGGAAGAGGCCAGCAGCAGCTTGTGGGGACAAGATGTCAAGCCCCAAATGTTAAACC
-CACCAACCATCCTCCAAATTCTGGCTCTGTTTAACAAGGCTGTGGTCTGACACTACATGCCGCCTCAGTGACTAAAGCAT
-AATTTCCCGTCTCCTGGGAGTGTTGACAGCTGACTCCTGGCAACAATACTCACAGCACAGTAAAGTTCCTTCATCCAAGT
-TCATGTCCCTTCTCAAGGCATCCCACATCCGAGAACTGCTTGGTACAGAAATATAATGGCCTGGTTTTCTTGCTCCAATT
-CGAGGTCTTTAGGTAAACTCACCAAGATCTTGTAGAGTGGACTGCGGCCATGATAGTGATTGCATTCCAGCCGACTTCCT
-GCTCCACCCAATCCTATTGCTTTCACTCTTCCACAGGTGTTGGGAATATCATTTCAACCTCCTTGCATGCAAATCTCCAA
-CTCGGAGTCGGCTTCCTAGGACACCTGACTGGTGATATCTCTATCACTATCACAGTACTTAGAGGGGAGCATCTTAAAAT
-GATTGAAGGCTAACTGCCCTAACAGCACAGACAGATGATGGCTTAAAATAGAATTTAAGTGGATTTAAAAAAACATGAAA
-AAAGTTGACATTGCACGCTCATATGAGCTTATGGATCAAACCATGTGTATGATTTCTAAGATCCCTCGTGCAGTATATAT
-TTGCACTGTTTATAAATGACATCCCCTTGAATTGAATTCAGTGCAATTCAAAACAGTAATTTGTGGGAAAAATTAGATAT
-GCAGATAGCCTGGACTCTAGAGAAGCACACATCATTTGGAGAATAATAGTGAACCGGCTAGTCTATGAGGGAAGAAAACA
-GAGTGAATATAGACTATTAGTGAACAAGGATATTTTCCCATGTATATTCAAATTAAGGTGAACTTCTTTAGAGAATTGTG
-CCTTAGAAAGAAAAAGTATTTCCCTGTATTTGAGTCCTCACAAGTTTTCCTACGATGAGTGCTTTTGTGATTATTTTGAA
-TAACAAAGTAATATTTAAAGAAACTCTCTTGCCCTGAATGTACTTTAATTTATGTCAATTGATGTTGCATATAGAGATCA
-TCAGAGTCAAGCTACAAGAAAAAGAGGAACATAACTTAGCAAAGACTTAGAGGATTAGTCCTAATAGTGTGAAATCAAAA
-TTTCAAGTGAGGGAATAAATGCAGCTTTTAATGATTACTTAAATGAAGTTTAACTCTAGCAGGATCTACAAGAAATTGGC
-AACCTTTGGCTTCAGTAACAGAAACTCAGGATATATGCCCTTCAGTGAGTTTGCATTCTGCATCATACTGAGAGACACTC
-CTTTAAACAGCAATAAGAAACTTCCTGTGACAACATAATAAATTCAAAAAGTTCTGTAACTCAGACAGTTTAGATAGAAG
-TGATAACTTTGGCCTATAAAGCCCTGTTCACCCTAAAGATGGATTAAACAATGAAAAAGATATTGATATCAAAAGTTCAA
-TCAGTAATTTGATTAAAGCATTTCATTAAATGTGATAATTTCTTAGTATATTATCTTACATATGCAATATTCATGTGTAA
-CAAATTATATACAAGTAAACATTTGACCATATTATCTGCAGCATAATTTACATATCAATTTACATATTCAGTTTTGCTCA
-CATGAAAACTTGGATCTTCTCAATAAGAAAATTTGTGAAATCTTTAATTCCTCATCCCCAGGAATGTAAATAAATAAATA
-TAAATACTGTAAGTCAGTGATTTTTTCCTAGGAAGACAGTAAAAATACTTTACACGCCTTCTCATTGTAAACCTAAATAA
-CAAACAGAGAAAGGCTCTCTAAAGGAAAAAGACACATCTTAGGGAGGAGGGCACTGCAATGGGAATATGCATGACAAAGC
-AAACTATATAGATTCAAATGGTAAAGGAAGACAAGGACTTTAAAAGAAAAATGATCAACCTGGAAGTATGGGGGAGTAGA
-AAAAAATAAATAAGGGAAAATGAAGAGGCTTCTATAATTGTTTTGATATAGTTACCTTTGACTATAAAGATCAACAACAA
-GGTCAATATCAGTTGAAGTTTGGGCAGGCGGTTGCTGGATAGATGTCCTCACAGAAGTGTATTTTGTGTAAGGTTGCTAT
-GGCCTTTGTGCAAGGTTGTGGTTTTTGTGGTATTTTGTAATAGTTTTTATCAGGCCTAGAAGCATGAGAACCCTCTCTTC
-AAGGCCTTCTCTGAATCTATTTGTTCAGGTTTCTTCTTCTCTTTTTAAACATTAGTGACAGTTTTGATTCTGATAACTTT
-CATATCATGATCCCTAATTTCAAAAAAAATTAAACGTGTAACTTATTTATGATGTATTTGATAGGCTTGGATTTGTGAAT
-CACCTCTACTATCTATAGTGGTAGATATATCTGAGCCTGCTTACACAGGACTTCCATCAGATTCTCTCTTCAGTGGAATT
-GGAAGAGGGGGTTTTGGAGAAGGGAATGAAGGAATTGTGCTGCATCAGAGGTCCCCACCTAACAGCACAGGGTCTTTTTC
-TGTGCTCTTGCCAGGCCGTTGTATTGGCTGATGCAAAAGTAATTTTGGTTTTGTCATTGAAAGTAATGAGACCATCTGAC
-TTACAATGTCTGTGCCATAACCAGCTCCTAATAGCCTCCGAGGACAGCTTTGCCCTGACATATACTGTCCTGGGACCACG
-TCTGCTTTGTAACTCCTGAGGTAGCTGCCACCATGACCAATGCCTTCTCATCTTTACTCTACATGCAGGTAACAGTTATA
-ATTATATCTCTGTGTATTCACAGAACATTTAGTACATCTGGGACTTCTACAAAATTTCCCTAGCTGATTTTGGTGTTCTG
-GGGTACTGGCAGCTCTAGCCATGAAGGGATGATGCTTTATCAGCATTTCTGTTGAGTTTTTTGCTTTTTCTCAAAAACTG
-ATTCCACTTTTCCCACATACGTTTGACAATTCATTTGAACTCATTTATTCTAAACCCATTATTTCTGGTCTATTATTTAA
-TAGGAAGGGAGGCGAGGGATAAAAGATTACAAATAGGGTGCAGTGTACACTGCTCGGGTGATGGGTGCACCCAAATCTCA
-CAAATCTCCAGTAAAGAACTTACCCATGGAACCAAATACCACCGTACCCCAATAACCTATGGAAAAAAATAAAAAATAAA
-GTAAAAAAGAGTCAGAAAGAAAGAAAATAATCACTGTACTTCCCAAGACACTTAGAAATGGTGACTAGCATTATTTGTAA
-GTGTCACCTAATAATATTATTATTTTTTCTTTATGCTACAAACTAGCTCTGATATTACAATCACTACTATTTGAAGTGTT
-ACTAAATTAAATTAAATGTATTGTATCCTTCTGGACTCAGAAATGGGGGTAAATGCTAAGACAATTTCAGAATATGATCA
-CATATTAAAAGCATATTATATGGGGAAAATTTGATTTTTAAAAAATAGAAATTGGTAGAGAAACAATTTTTGGGTCTTTA
-ATGTACGCACATTTTGCAAGTATGGACGCTGAATTTATTGTTCCAAATGATTGTTTTCAAGCATGTTTGTATAGAAAACA
-GCCTTGGAATAGAAAACCAGTACCTCCTTCTGGAACAAAGGAAAAGTTTATTTACTGTCTAGTATAATGCAGATAATTTC
-TCCCTCTTGGGAAGCATACAGCCAAGTGAACTTCCAATAACACAAGTTGGGGTTTCTTGAGCTTGGGTTTTTCTTCCACA
-GTGTAATGTGCAGGTGCCACTTGGCTCTCTTTGTGTTATCCTGCGAAAGCTGATGGCTATAGGTGCATGTGTTTATTTTG
-GGTTTCTCTATTATGTTTCATTGGTCTTTGTGTCTGTTTTCATATCAGTACCATGTTATTTTGTCTACTGTGGCCTTAGG
-GTATAGTATGAAGTCAAGTAATGTGATGTCTCCAGCTTTGTTCTTCTTGCTTAGATTTCCTTTGGTTGTCTGGGCTCTTT
-AAAAATCCATATGAAATTTAGAATATTTTTTTTTTCTGATTCTGTGAAAAACGACATTGGTTGTTTCATAGGAATAGTGT
-TGAATGTGTAGATTGCTTTTGGCAGTATAGCCATTTTAACAATATTGATCTTTCTAATCCATGAGCATGGAATGGTTTTC
-CATTTGTTTCGAGATCTATGATTTCTTTCTGCAGTGTTTTGTAGTTCTCCTTTTAGATATCCTTTACCTCCTTGGTTAGA
-CATATTCTTCCTTTATTTTATTTTATTTTGGGGGTTGCTGTTGTAAACAGGATTGCACTCTTGATTTACCTTTCAGTTTA
-AACATTTTTGGTGAACAGAAATGCTACTTCTTTTTATATGTTGTTTTTTTTTTATCCTGAAAGTTTGCTGAAGTTTTTTT
-TATCAGTTCTAGGAGCCTTTTGGCACAGTCTTTAGGGATTTCTAGGTGTAGAATCATATCATCAGTGAAGAGAGATAATT
-TGACTTCATTTCCTATTTGGATGCTTTTTATCGCTTTCTCTTGCCTGCTTGCTCTGACTAGGACTTGTTAAACAGGAGTG
-GGGAGAACAGGCATCCCTATTTTATTCCTGTTCATAAGGGGAATGTGTTGGGAGAAAAGCTGAGTGTTGGAAGACAAGCT
-GAGGCAGGGCCATATGTTTCTCATTCACTTGATACACCATTTCCTTTCAACCCCCACATCCTCACCACCTGTTTCTTTGT
-TTGAGCACCAACAAATAGCGTGGGCTCCCAGAGCTTGGGGACTTTGCAGACTCCATACTCGTGATGGTCTCCTGGTCCCA
-CTTTCTCTCTCAAACTGTCTTTTTCTCATTCCTTTGACTCTGCCGGACTTCATCACCCCCATGACCAAGTGTTGGGTCTG
-ATCACCCCAACATTCCTGGCGCCCAACATAGGGTGACAAAGACCCGGTGAAGGAAGGCTAGAGCATATGAAAGCAGAGGA
-CACATCATCAAAAGACACCCGAGGACATACAAAGATGGGGAGTGAAAGTTAGTACTTAGAATTTGTTATTACTCTTTAGT
-ACAGTAAAGCAGTTTTGCCCATGGTTTCCAGAACAAAGGACTATGCAGTTGGATGAATGGGAGAGAATTGGAAGAGATTT
-TTAATAGGCATATAAAGATGGAGCAGAAATTCCAGTTTATATATGGTCAGTGTGGGCACTAATAAAGGCAGCCCTTGAGC
-CATTTCAAACAGATGATGAGGCAGATTCAGATGAGGAAGAGGAGGATGAGTGTAAAAAACTAACTTCAAATTCTGAGTGT
-GAGGAGCAGCTACCGGAGGAGATTAAAGAAAAGAAAGAAAAACTTTAAAAAGTATGTTTTACTAGCCCGTTGGCTCCACC
-TGCTGAATTAAGTGAATGGCCACCTCCTCTCTCTCCCCTAAATGGGTGAGAAAATAAATTAGCTGAAAAACTTACTGCTC
-CTGTAGTTACAACATTAAAACCTGGAGCAGTTGGTGGTGCTAGACAAAATTCTATTCAAAAAGCTAAAGCCAAGGGAGAC
-CTTGAAGCATGGTAATTTCCCGTTACTATAATCCAGCAAGTAGGACAGAATATAGCTAATTAGCCTGCTTTTTCTTCTAA
-GTTACTAAAGAATTTAAGCAAGCCATTAGTCAATATGGACTGAACTGTCTTTTTGTGCAATCTTTATTAAAAAATATGGC
-TCTTGATAATACATTACTACCATATAATTAGGATACTTTGACAAAACCTGTTCTCACTCCCATCTCAGTACTTGCAGTTT
-AAAACTTGGTAGGCTGATGAACTCAAACTCAGGCAAAAGAAAACACACACGTGCAGCCACCTGTGCCTGTTTTCTTTGAT
-CAGTTAATATGAGTTGGTCCTAACTGGGGTTGATTAGAGAATCAAGCAGTAATGGAAGATGTTGCCATTATTCAGCTGTG
-CTTCATGTGCTTACATGCATAGAAAAGGATAAATGTTACAGGGGAAAAGTATCCTTATTTAAGTTCTGTCTGACAAGGAC
-CTAAAGAACCATATATTAATTCTATTGCTCAGCTCCAAGAGGCTGTGTATAAAGCCGTAAATGATCAAAACAGCTCAGGA
-TGTTGTAATACAGCTTCTTGCATACAATAATGCTAATGCAGAGTGTCAAACTGCTATTAGATATCTGAGAGAGAAGGCTC
-ATTTAACTAAATATATTAAGTCTTGCGATGGCATTGGAGGTAACTTACATAAGGCTATTCTTTTAGCTCAGGCTATGGCT
-AGATTAAGAGTAAGAAAAAATATGCTTCATTTCTCAGGCTCTTGCCTTAATTGTGGGCAAATTGGACACAAGAAAGGAAT
-GTAGAAAGGAATTCAAAAGACGAAAACTACTACCATGAATCAACAGAAAAGACCCAGTGTATGTCCCTGGTGTAAGAAAG
-GCAATCACTAGGCAAGTCCGTGTCATTCTAAATTTAGCAAAGATAGACAACCTCTTTGAGGAAATAGGAAGAGGGACCCG
-CCTCAAGCCCCTCAACAAACTGAGGCATACCCAGCACAGCCACTGCCCTTACAAATGTACAGCAATTGTCCCCCGCCTCA
-GCAAGCAGTGCTGCTGTAGACCTCTACAGCACAATTCCCATCTCCTTACTTCCTGGGGAGCCACGAAAGAAGGTCCCCAC
-AGGAGTTAGGGCACCCTTACCCTGAGGAACTGTTGGGAACAAGCCCCCACAAATCCGGCCATAAACTGGCCCCAAAACTG
-GCCATAAACAAAATCTCTGCAGCACTGTGACATGTTCTTGATGGCCATAACACCCACGCTGGAAGGTTGTGGGTTTACCA
-GAATGAGGACAAGGAATACCTGGCCCGTCCAGGGTGGAAAACCACTTAAAGGCATTCTTAAGCCACAAACAATAGCATGA
-GTGATCTGTGCCTTAAGAATAAGGGATACTTTTAGTTAATCTAATATCTATAGAAACAATGCTAATGACTGGCTTGCTGT
-TAATAAATACGTGGGTAAATCTCTGTTCAGGGCTCTCAGCTCTGAAGGCTGTGAGACCCCTGATTTCCCACTTCACACCT
-CTATATTTCAGTGTGTGTGTCTTTAATTCCTCTAGTGCTGCTGGGTTAGGGTCTCCCCAACCGACCTGGTCTCAGCAAGT
-GGTGCCCATTCATGGGGGCTCGAATACAGGTCAAAGGATCGCTGGAGCAACGATTGGAGAATGTGGAACTAGCTGGAGGA
-CATCCGAGTACTCTTAAAGCAATCCCCGTGGTGAGTCAGAAGGGGAGCTCGGAAGCATCAGGGTAACAATGGGACAAGTG
-TGGGCTGTGGTTCGTTCTACCTTGGAACTTTTTCACACTGATAATGAGGAGGAAGGAGAGTATATCAAAGTAACAGTAGA
-GGCTACAGACCAGGTTTATTTGCCACCTAAAGCTAAAGCAGAAAAGGAGGGAGAGGTTCATCCCTACCCTTCTGCACCCC
-CTCATTATTATTTTGAAGAAAACGACCCTCCAGATATTTCTTTTCTGGAGGACACTGGGTGAAAAGTAGTTGCCCTGGTG
-ACTGTTCGAGCACCGCCTTGAGCGACTGCTTAGTTCTATTCAGGCAGGAATTCAGCAAGCTAGACAAAAGTGGGATTTAG
-AGGCTTGGCAGTTCCCTGTTTGAATACACCCCCCAGATCAACAGGGAAATATTATAGCTACATTTGAATCTTTTCCTTTT
-AAATTACTCAAAAAAATTAAACAAGCTATAAATCAGTATGGACCAGGTTCTCCTTTTGAAATGGGACTGTTAAAGAATGT
-TGCTGTTTCCAGTCGGATGATTCCTACTGACTGGGACACTCTTACTCTAGCTTGTCTAACTCCTGCTCAGTTCTTACAAT
-TTAAAACTTAGTGGGCAGATGAAGCTTCCATTCAGGCTGCTCGCAATGCCTGGGCCCAACCTCAAATTAATATAACTGCA
-GACCAACTTTTGGGGGTTGGTGGCTGGGCTGGTTTACATGCACAAGTAGTCAAGCAGGATGATGCCATAGAACAGCTTAG
-AGGAGTGTGCATTAGAGCTTGGAAAAAATCACTTCATATGGAGAACAATACCCTTCATTTAGTGCTATAAAACAGGGACC
-AAGAGAACCATATGTGCATTTTATAGCTTGGTTACAGGAGTCTCTTAAAAAGATGATTGCAGATTTGGCTGCTTAGGATA
-TAGTGTTGCAGTTATTAGTTTTGACAATGCTAATCCCTATTGCCAGGCTGCTCTGCGACCTATCAGAGGGAAAGCACATT
-TAGTTGATTATAACAAGGCCTGTGATGATATCAGAGATAATCTACATAAAGCTACTTTGTTGGCACAGGCGATGGCAGGA
-CTGAGAGTGGATAAAGGAAATACTCTATTTCCTGGAGCTTGTTTTAACTGTGGGAAGCATGGTCATACTAAAAAGAATGT
-AAAAAAAAAATCAGCAAGTCAGGCCACCAGATAGGTGAAAAAAGAAAACTGCTGATCCTGAAATATGTCTAAAATGTAAA
-AAAGGAAAACTTTGGGCTAATCAGTGTCACTCTAAGTTTGATAAAGAAGGGAACCCGATTTTGGGAAACTCCCTGGGGGG
-CCCATTCCAGGCCCTGTTCTAAACCAGGGCATTTCTAGCTCAGGCCATTCCCTCACACCCGTACATTATCTGTCCCCCAC
-CATAGCCCATAGTGTCGCAGTAGACTTATGCTGCACAAAAGCTGTGAGCCTTCTGCCTGGGGAACCCCCGCAAAAGGTCC
-CAACAGGAGTCTGTGGACCGTTGCCAGGAGGGACAATGGGATTACTTTTAGGAAGGTCTAGTTTAAGTTTAAAAGGGGTA
-CAAATACACACTGGAGTCATTGATTCAGATTACAATGAGGAAATTCAAATTGTGATATCTACTTCTGTTCCCTGGAAAGC
-ACAGCCAGGAGTGGGCATAGCACAGCTCCTGAGTGTGAAGTATGTGGGAATGGGAAAAAGTGAAATTAAATGAACTGGAG
-GATTTGGAAGCACAAATAAAAAAGGCAAGGCAGCTTATTGGGTAAATCAAATTACTGATAAACATCCTATCTGTGAAATA
-ACTATCCAGGGAAAGAACTTTAAAGGTTTGGTAGATACAATTTTTTTTTTTTTTTGGTAGGAGTGGACATTTCAATCATT
-TCTCTACAGCACTGGCCGTCCATGTGGCCAATTCAGCCCACTCAATTTAACACAGTGGAAACTGCTAAAGCCCCAGAAGT
-GTATCAAAGTAGCTATATTTTGCATTGTGAAGGGACCGATGGACAACCTGGGACTGTTCAACCAATTGCAACTTCTGTAC
-CTATAAATTTATGGGGGAGAGATTTATTATGACAATGGGGAGCACAAGTTCTAATTCCATAGCAATTATACAGCCCTCAA
-AGTCAACATATGATGCACGAAATGGGGCATGTCCCTGGTATAGGAGTAGAAAAAAATTGCAAGGTTTGAAAGAACTGCTT
-CAAACGGAAAGACAAAGTTCCTGCCAAAGATTAGGATACCATTTTTGATGGTGGCCACTGTTAAGCCTCCAGAACCTATA
-CCTTTAAAATGGTTAACAGATAAGCCAATTTGGATAGAATAATGGCTGCTAAGCAAAGAGAAACTGGATGCTTTAGAGAA
-ATTAGTTACTGAACAATTAGAAAATGGGCACATAGCTCCAACATTTTCCCCTTGGAATTCTCCAGTGTTCATAATTAAGA
-AAAAATCAGGTAAATGGAGAATGTTAACTGACTTAAGAGCCATCAATTCAGTTATACAACCTATGGAAACATAACAGCCA
-GGATTGCCTTCTCCTACTATAATTCCAAAAAATTGGCCTTTAATAGTCACAGATTTAAAAGACTGTTACTTTACTACCCT
-TTTAGCTGAGCAAGACTGTGAACGGTTTGCATTTACAATTCCTGCAGTAAACAACCTGCAGCCTGCTAAGCGTTTTCGTT
-GTTTCACAGATGGGTCTAGTAATGGTAAAGCTTCTTATTCTGGATCAAAAGGTAAAGTTTTCCAGACACCCTATACTTCA
-GCTCAAAAAGCGGAGCTTGTAGCTGTAATTGAGGTATTGACTGCTTTTGATATGCCTGTTAATGTGATTTCTGATTCTTC
-ATACATGGTTCATTCCACACAGTTAATTGAAAATGCTCAGTTACGATTTCATACAGATGAACAACTGATAATAAAAACAA
-AAAAAGGGGGAGAAACAGGGATTACGGGTAGCCCATACACAATTGAATCTATCATTATTAACTTTCAAATTTTTGAGCCT
-GCCCAAAGGCCAGATGTTACCAGCAGCTGAACAGCATCTACAGAAACTAGCTGCAAAGAGAGAAGCAGAACAACTGGTTT
-GGTGGAGAGATCCAATAACAAAAAGTTGGGAAATAGGTAAAATTATAACTTGGCATAGAGATTATGCTTGTGTTTCTCCA
-GGACCGAATCAACAACTGATTTAGATACCATCAAGACACCTGAAATTTTATCATGAGTCAGATGCTGAGGAAGAGATAAA
-AAGCACAATCATCATTGAAATTAGAGCTTCTGGCTGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTCTGGGAGGCCG
-AGGTGGGCAGATCACAAGGTCAGGAGATCGAGACCATCCTGGCTAACACAGTGAAACCCCGTCTCTACTAAAAATACAAA
-AAATTAGCTGGGTGAGGTGGCGGGCGCCTATAGTCCCAGCTACTCAGGAGGCTGAGGCAGGAGAATGGCATGAACCCGGG
-AGGCAAAACTTCAGGTTTTGCCAAGAATGACACTGTAAATGTAACAAAGCTTCTGTGCTTGTTAGTGAACACCAAATCAG
-CTACTCTCCTGTATTCGGAGATCAGGATGAAATGAAAAGAACAAGCAGGCCGGGCGCGGTGGCTCATGCCTGTAATGTCA
-ACACTTTGGGAGGCTTCGGTGTGCGGATCACCCGAGGTTGGGAGTTTGAGACCAGCCTGACCAACATGGAGAAACCCCGT
-CTCTACTAAAAATGCAAAATGTGCTGGGCATGGCGGCACAAGCCTGTAATCTCAGCTTTGGAGGCTGAGGCAGGATAAGT
-GCTTAAACCTGAGAGGGGGAGGTTGCTGTGAGGCAATATTGCACCATTGCACTCCAGCCTGGGCAACAAGAGTGAAACTC
-CATCTCAAAAAAATAAAAAATAAAAAAAGACCCCCAACCTTGTCTAGACTGTGGGGTTTCAGTTTCACCCCAGGGGGGTC
-CTGGTTGGGTTAGAATCCTGAATCTCGTTTGAGTTCGAACCCTAAAGAATAAAGGGAATAAAGGCTGTAGCTACTGAGCT
-ACTCAATCTGGTCTGGTTCTGGCTTTTGTGTGTCTATCTGTATTTTTGGTCTAAATATTTGGCCCAACAGAGGTTAAAGG
-CTTTGATGTTCTCAGCAAAAGCCTTGTGAGATTTCTAGTTTATCTGTGTGCTCAATTGGAACAAAGAGACTCAATAAACT
-AGAAAAACCTAAAGAAAATGGCACACGTGAAAAATTGAGAGCCAACTCCTGTTTGTTGTTCTGTCCACCTCCCTCTCTCA
-CTCCTCCTTCTGCCTTTGCTGTGGTCCCATGGTGTTTCTGTCTTTCCGGGGACCTGAGATTCAGTGTAGGAGTGAAGTCC
-ATGATTTTAAAGCCTTCATGTCTCTGCTTTTTAACTCTGCCTGCTTTGCTGAGCTCTTATAATGAGAAATAAACTATTCA
-GAACAGGTACAACAGGGCATCAGAAAACCAACTTCAGGCAGCGCTCCGGCAAGTACCTCCCTAGAGGGGAAGGGCTTACT
-AAAGGAGATTTAATCTTGAAAAGGCCAAAATGAGAAGCTCTAACCTTTAGCTTGCTAGGTTTTCTGGGACTCGAGCTGGC
-TATATATTATGGACCATTCTAGCCACACACACACACACACACACACACACACACACACACACTTTTTTGAGACAGAGTCT
-TGCTCTGTTGCCCACGCTGGAGTGCAGTGGTGCGCTCTTGGCTCACTGCAACCTCCACTTCCCAGGTTCGAGCAATTCTC
-CTGTCTCAGCCTCCTGAGTAGCTGCGATTACAGGTGTACGCCAACATACCCGGCTAATTTTTGTGGTTTTAGTAGAGATG
-AGGTTTCACTATGTTGACCAGGCTGGTCTCAAACTCCTGATCTCAAGTGATCCACCCACCTTGGCCTCCCAAACTGCTGG
-GATTACAGGCATGAGCCACTGTGCCCAGCCTATATATATATATATATATATATATTTATATTTATATTTATATATTTATA
-TTTATATTTTTTTTCTTTTTCTTTTTGACACACAGTCTTGCTCTGTTGCCCAGGATGGAGTATGGTGGTACAATCGCGGC
-TCACTGCAACCTCCACCTCCCAGGTTTGAGCGATTATCCTGCCTCAGCCTCCTGAATAGCTAGGACTACAGGTGCACACC
-ACCACACCCAGTTAATTTTTGTATTTTCAGTAGAGATGGGGTTTTGTCACGTTGGCCAGGCTGGTCTCAAACTCCTGGCC
-TCAAGTGATCCACCTGCCTCAGCCTCCCATAGTGTTGGGATTACATGAATGAGCCACTGCACCTGGTCTCTAGTGCACAC
-TTTAAACCTGACGGCCAAATTACATGAAAGAAAATTCAGAACTCAAATAGTTACTATTTTTAAAAACCCTAAAATGAAAA
-AGTCTCAGTTCTTTTGCCTATCTTTTTTTTTTTCCCTGCCTACTTTGAATCTGCTGATTTGTCTACTGGTGTTGAGATAA
-GACTTACTGTCTGTGGTGTTACCAATTCAAGGTTACTTGGCTGAAGAAAAACAAAAGAATGAAACAATTTTTTATTTTTT
-TCTCTTTTTGAGACAAGGTCTTACTCTAAGGTCTTACTCTGTTCCCCAGACTGGAGTGCAGTAGTGGGATCATAGATCAC
-TGTTATCTCAACCTCCCAGGCTCAAGCAATCCTCCTGCCTCATCCTCTCTAGTAGCTGGGACAATAGGCATGCACCACCA
-TGCCTGGCAATTTTTTATCTTATTCTTAGTAGAGATTGGATCTCACTCTGTTGCCCAGGCTGGTCTCAAACTCCTGAGCT
-CAAGTGATCCTCTTGCCTCAGCCTCTCAAAGTGCTGGGATACAGGCATGAACCACTGTGCCCAGACAAAAGAGTTCTTTT
-ATAAATGCAAATAATTTAAAAAGTACTGATAAAATAAAAATAGAAATGTCTTCAGAATTGTCAGCATACATTTTTGACTG
-TGTTTTATATTTACATTTGCTAGATATTTTAAGGTGCTAGGGTTTGGCATGAAGGTTATAAAGCTATAAACACAGGAAAA
-AAAGAATATTTGTTTATGTGATTTTTTAAATACATAAGACCAATTTAATACGGTTTGTTGAACAAAAATAATGGAATTTT
-CTGAGTTATTGGTAAAATACCCTTGTATTTAACTTTGAAATCCTCACTTATGTGAACACCTGATATTCACAGGCTATAAC
-ATGGTTAACAAGAAAATAACCTAGAAATGACTAGCTTTGTCTAATACCTCAGTTCTCACAAATACTCTAGATAAACTGTC
-AAAAATAAGTAAATGTAAATGGATAAATGTCTATACAAGACATTTTAATGTATTTTTGAAATTTTTTTGAGCCAATGTCT
-CTGCCTGTCACCCAGGCTGAAGTGCAGTGGCATGATCACAGCTCATTGCAACCTTGACCTCCTGCACTCAAGGGATCCTC
-CCACCTCAACCTCCCAAGAAGTTGTTAATTACAGGCATGCAACACCATGGTCAGCTAACTTTTATTTTTTTTGTAGAGTC
-AGCATCTCGCTATTTGCTCAGGCTGGTCTCACGATACTCCTGCCTTGGCCTCCTAAAGTGTTGGGATTACAGGTGTGAGC
-CACCATGCCCAGCCTATTTTTGAAATTTTAGTTATGTTAAATTAAATAATAGATACTCATTAAATATCTGGGTTATTTCC
-AATTTAAAACTTATGTTTTAGCCCAGGCACTATGGCTCATGCCTGTAATCCCAACACTTTGGAAGGCCAAGGCGGGTGGC
-TCACCCGAGGTCAGGAGCTCAAGACCAGCCTGATCAACATGGTGAAACCCCATCTCTACTAAAAAATACAAAAAATTAGC
-CAGGTGTGGTGGTGGGTTCCTGTAATCCCAGCTACTCGAGAGGCTGAGGCAGGAGAATTGCTTGAACCTGGGGGACGGAG
-GTTGCAGTGAGCTGAGATCACACCATTGCACTCCAGCCTGGGCAACAAGAGCGAAAATCCACCTTAAAAAATATGTTTTA
-GGAACACATAATTCTAAATTATGAAATCATTCTCATATGTAAGATACTGCTATATGACAATTCAAGATTTCTTTCTTCCT
-AAGTTTTTTATTAAAATAAGGGTTACTAAGTGTTAATATCTTGGTAGATATATGTGATTAAGACTACTAGATACAAGAGA
-AACAATTCTGTATGCAAAATCTATACGGGTTTTTGTTTCAGAGAAAGTAAATTCGCTTAGAGATTTTTAAGGATTATTTT
-AAATTGAAGGAATAAAAAAGATAGATAAAACTAAATGTGTATAAAAAGTTGGGAAAGATGGAAAAAATTATACAAGCTTA
-TTAAAAGTTTATGTAAATCTTACCTCGAGGTCAAAACTGATTGAGATCAGATAGATTGTTTATAAGGTTTATTTAAATTA
-GCTGTAATATTAAAAACATAGTGATAAAAAACAAAAAAATTTGGTTAAAACAACAAGGTTTTCTTAATGCATTTATTTGC
-TCATAATAAGAGGTAATAAATATTGACTTTTAATCCTGATATCTGTTACTATAAAATCTTTTCAGATTTGTATATCAGAA
-GTTCAACGTTTCCTGTACTTTCATGTTACACATGACTCACAGATCACATCATTGTCTTCTGTTTCTTCTTGAGAAGGAAT
-AAAAGGCTTGGGTTTCCTGCTTGGCTGGGATGATAACTCCTTCAGCTTTTTCATCAGGTCTAATTTTGTACTCTTGGCTT
-TTAAATATGTCTTAATTACTTCATGTAACCAGGATACAGCAGGAAACTTCCATGCTATCATTGTGAGCTATGGATCCCCA
-CTGCTCTATGCTCTGGTTTTCCTGTTTACATTCCTCTGTAATATTATGCTCACTCATGACCCTGGACACACTCTTTCTAT
-GTCTAATTAAATTCAAGTCTCCGTGTCATCGGTTTGACTTCCAAGTGATTTAAATTAGCTTCCCATAAGAAGACACAGTT
-ATGCCACAGGAGCTTTTACCCTTTAAATGACTGGCCTGTAATAAAGATTTTAGGTTTTATCAAGATAATCCATGTGTTGC
-CTTTATTGTTTTTTTAATTACTTGGGAAAACTGAGGGTTTTCAGTTTTCACATCCATGTAACCTTCTATGTTGCTTTTGA
-TGTCTTTTGGTTGTCATGTTAATTAAATGAATGTTATTTAAAAATGACATGTGGCTGTGTGCAGCGGCTCTTGTCTGTAA
-TTCCAGCCCTTTGGGAGGCCAAGGTGGGTGGATCACTTGAGCCCAGGAGTTCAAGTCCAGCCTGGGCAAAATGGCAAAAC
-CCCATATCTACTAAAAATACAAAAGCTAGCTAGGTGTGGTAGCAAGTGCTCATAGTCCTGGCTACTTGGGAGACTAAGGT
-GGAGGATCACCTGAGCCTGGGAGGTTGAGGCTGCAGTGAGCCATGATTTCACCACTGCACTCCAGCCTGGGCAACAGGGT
-GAGACCCTGTCTCAAAAAAATAATAAAATAAAAAACAATAAACTACCATTCCGTTTTGGTCAAATGTTTTCAATTTTTTG
-ACATCTTTGCTAAAACTTAGTTGATAACATTGTATGGGAAGCATTGCCAAAAGATAAGTAACACTAAATCTTCTTTTTTT
-TTTTCTCTGAGACAGAATCTTGCTTTGTCACCCAGGCTGGAGTGTTGTAGCATGATCTAGTTTCACTGCAAATTCTGCCC
-CAAGGTTCAAGCAATTCTTCTGCCTCAACCTCCCAAGTAGCTGGGACTACAGACAAGTGCCACCATACCCGGCTAATTTT
-GTATTTTTAGTAGAGACAAGATTTCTCCATGTTGGCCAGGCAGGTGTCGAACTCCTGACCTCTGATGATCTGTCCAACTT
-GGCCTCCCAAAGTGTTGGGATTACAGGCATGAGCCACTGTGCCCAGCTTAAATCTTCTTTTGGTTACATTTATAGGTATG
-TTATTAATATAAATATTTTAAAAGTTATATAAATTATAAAAATCTAATAGGGTTTCAGTCATAATTTTGATGATGTTAAA
-TATTTTCTAAAGTTGTATGTGTATAGATATATTATTAATATAAATATTCTAAAGATTATATAAAATTTCTGGAAGTCTGA
-TGGATCTGATGTGTTGCCATCAGTCATGATTCTGGCTGTTATCTTAAAATGCTACATATAATACAAATAACTAAATTTTC
-TCGAGATTTGAGAACTTCCACTGGATTTTAACCAACGGCTATTCTAAGTTTTTGTCATCCACGGTGATTGATTAAAGTTC
-TTCTCTAAAACCCTTTACAGGCCGGGCACGGTGCTGGAGGCCATGCAGGGCACGGTGCTGGGCATGGTGCAGGGCATGGA
-GGCTCATGCGTGTAAATATCCCAGCACTTTGCAAGGCTGAGGTGGGTGAATTGCTTAAACTAAGAAGTTTGAAAGCAGCC
-TAGGCAATATGGTAAAATCCCATCTCTACAAAAATACAAAAATTAGCCAGGCATGATGGTGCATGCCTATGGTCCCAGCT
-ACTTCGGAGGGTGAGGTAGGAGGATGGCTTGAGTTTGGGAGGGAGAGATTGCAGTGAACCAAGATCATGCCACTGCACTC
-CATCCTGAGTGATAGAGCCAGACCGTGTCTCAAAAAAAAAGCCTTTACAATCAGCTATCATCTAAATTACTTTTAATGGA
-AAGGATTCTGACAAGTTCTCTTAAATATGGTTTCAGATAACTTTGGGGATCAAACCATTGGACTAGGAAAATCTTCCAGG
-ACTCTAAAAAGCTGAATGAGAATTTCTAATTGAAATCAAGCAAAACACAAAAAACTGAATGAGAATTGCTATTTGAAATC
-AAGCAGAACAAGATTTAGTTACATGGGAGTGAACTTATAAAAGAAGGAAAAGATTTTATCCATGGCCCTCCCATTAGAAA
-CATTGTTGATCCTCTTTATGTTTTGTTTTCCAAAGTCAATAATTTTTTTTCTTTTCAGCTATTTTTAATTTACAATACAT
-TGGATAAACTACATTGTGAACAAAAATTTGAGCCATTTATCTGTCTCTCTAGCTGATTTCTCCAGAATTCAGAAGCCATT
-CGTGAGCATTCTTAAATTATGGCAATATAATTATTTGCATAATTTCAATAAGAATCTGTTTTTGGTAACAAGATTCAATT
-GGAGACACTGTTTGTTTTATCAAGGCTTTAACTCGAATGGCAGATACAACCAGACCACTTTAAGGAATTGAGGTTGACTT
-TATAGCACCAATACAAAGCCCCTTAGAATGACTGGCTTGATGTCCTGTATACAAAGGTCCTTTACAAAGTTGCTATTCTT
-GTGGTAAGAAATAAAGAATGTCACTTTCTGATGGGCCAGGAACCTCAAGATATTTGGGGACCTTGAGAAGAGAAGACTAC
-ACCCATTCATTAAAGTATTACAGGAGAGCTGGCAAGATGTCTGAATAGGAACAGCTCCGGCCTGCAGCACCCAGTGAGAT
-CAACACAGAAGTCAGGTGGTTCATGCATTTCCAACTGAGCCTCCACTGGTGATACCCAGGAAAACAGGGTCTGGAGTGGA
-CCTCCAGCAAACTCGAGCAAACCTGCAGCAGAGGGACCTGACTGTTAGAAGGAAAACTAACAAACAGAAAGGAATAGTAT
-CGACATCACCAACATCAAAGACCAAAGGTAAATAAATCCACAAAGATGGGGAGAAACCAGTGCAAAAATGCTGAAAACTC
-CAAAAGTCAGAATGCCTCTTCTCCTCCAGAAGATCACAACTCCCCGCCAGCAAGGGAACAAAACTGGACAGACAGTGAGT
-TTGATGAATTGACAGAAGTAGGCTTCAGAAGGCGGGTAATAACAAACTCCTCCGAGCTAAAGGAGCATGTTCTAACCCAA
-TGCAAGGAAGCTAAGAGCCTGAAAAATAAAGGTTAGATGAATTGTTAACTAGAATAACCAGTTTAGAGAAGAATATAAAT
-GACCTGATGGAGCTGAAAAACCCAGCACAAGAACTTCATGAAGCATACACAAGTATCAATAGCTGAATCAATCAATCAGG
-AGAAAGGATATCAGAGATTGAAGATCAACTCAATGAAATAAAGCCAGAAGACAAGATTAGAGAAAAAAGAGTGAAAAGAA
-ATGAACAAAGCCTCCAAGAAATAGAGGACTATGTTAAAAGTCTGAATCTACGTTTGATTGGTGTACCTGAAAGTGACAGA
-AAGAATGGAACCAAGTTGGAAAAAACTCTTAAGGATATTATTCAGGAGAACTTCCCTAACCTAGCAAGACAGGCCAACAT
-TCAAATTCAGGAAATACAGAGAACACCACTAAGATACTCCTCAAGAAGAGCAACCCCAAGACACAAAATCATCAGATTCA
-CCAAGGTTGAAATGAAGGAAAAAATATTAAGGGCAGCCAGAGAGAAAGGTTGAGTTACCAACAAAGGGAAGCCCATCAGA
-CTAACAGTGGATCTCTTGGCAGATAGCCTACAAGCCAGAAGAGAGTGGGGGCCAATATACGACATTCCTAAAGAAAAGAA
-TTTTCAAACCAGAATTTCATATCCAGCCAAACTAAGCTTCATAATTGAAGGAGAAATAAAATCCTTTACAAGCAAATGCT
-GAGAGATATTGTCACCACCAGGACTGCCTTACAAGAGTTCCTGAAGGAAGCACTAAACACGGAAAGGAACAACTGGTAAC
-AGCCACTGCAAAAACATACCAAATTATAAAGACCATTGACACAATGAAAAAACTGCATCAACTAATGAGCAAAATAACCA
-GCTAGTATCATAATGACAGGATCAAATTCACACATAACAATATTAACCTTAAATGTAAATGAGCTAAATGTCCCCAGTTG
-AAAGACACAGTCTGGCAAATTGGATAAAGAATCAAGACCCATCAATGTGTTGTATTCAGGAGACCCATCTCATACACATA
-GGCTCAAAATAAAGGGATGAAGAAACATTTACCAAGCAAGTGGAAAGCAACAAAAGGCAGGGGTTGCAATCCTAGTTTCT
-GATAAAACAGATCTTAAGCCAACAAAGATAAAAAGAGACAAAGAAGGGCATTACATAATGGTAAAGGGATCAATGCAACA
-AGAAGAGCTAACTATCCTAGACATATATGCACCCAATACAGGAGCACTCAGATTCATAAAGCAAGTTCTTAAAGACCTAC
-AAAGAGACTTAGGCTCCCACACAATAATAGTGGGAGACTTTAACACTCCACTGTCAATATTAGATAGATGAGACAGAAAA
-TTAACAAGAATATCCAGGACTTGAACTCAGCTCTGGACCAAGTGGACCTAAAAGATATCTACAGAACTCTCCACCCCAAA
-TCAACAGAATGTACCTTCTTCTCAGCACCGCATTGTACTTATTCTAAAATTGACCACATAATTGGAAGTAAAACACTCCT
-CAGGAAATGCAAAAGAATGGAAATCATAACAAACAGTCTCTCAGACCACAATGCATTCAAATTAGTATGCAGGATTAAGA
-AACTCACTCAAAACCTCACAACTACATGGAAACTGGGCAACCTGCTCCTGAATGACTACTGGGTAAATAACGAAATGAAG
-GCAGAAATAAAGATGTTCTTCAAAACCAATGAGAACAAAGACACAACGTACCAGAATCTCTGGGACACATTTAAAGCAGT
-GTGTAGAGGGAAATTTATAGCACTAAATGCCCACAAGAGAAAGCAGGAAAGATCTAAAATTGACACCTTAACATCAAAAT
-TAAAAGAACTAGAGAAGAAAGAACAAACAAATTCAAAAGCTAGGAGATGACAAGACATAAATAAGATCAGAGCAGAATTG
-AATGAGATAGAGACATGAAAAACCCTTCAAAACATCAATGAATCCAGGAGCTGGTTTTTTGAAAAGATCAACAAAACAGA
-CCACTAGCCAGACTAATAAAGAAGAAAAGACAGAAGAATCAAATAGATGCAATAAAAAATGATTAAGGGGATATCACCAC
-TGATCCCACAGAAATACAAATTATCATCAGAGAATACTACAAAGACTAAACCAGGAAGAAGTCAAATTCCTGAATAGACC
-AATAACAAGTTCTGAAATTGAGGCATTAATCAATAGCCTACCAACCAAAAAAAGTCCAGGACCAGACGGATTCACAGCCA
-AATTCTACCAGAGGTACAAAGAGGAGCTGGTACCATTCCTTCTGAAACTATTCCAAACAATAGAAAAAGAGAATCCTCCC
-TAACTCATTTTATGAGGCCAACACAACAAAAAAAGGAAATTTTAGGCCAATATGCCTGATGAACATCAATGCAGAAATCC
-TGAATAAAATACTGGAAAACTGAATCCAGCAGCACATCAAAAAGCTTGTCCACCATGACCAAGTTGGCTTCATCCCTGGG
-ATGCAAGGCTAGTTCAACATGCAAATCAATAAATGTAATCCCTCACATAAACGGAATCAATGACAAAAACTACATGATTA
-TCTCAATAGATGCTGAAAAGGCCTTTGACAAAATTCAACAGCCCTTCATGCTAAAAATTCTCAATAAACTGGTATTGATG
-GAACATATCTCAAAATATTAAGTGCTATTTATGGCAAACCCACAGCCAATAACATACTGAATGTGCAAAAACTGGAAGCA
-TTCCCTTTGAAAATCAGCACAAGACAAGGATGCCCTCTCTCACTACTCCTATTCCACATAGTGTTGGAAGTTCTGGCCAG
-GGTAATCAGGCAAGAGAAAGAAATACAGGGTGTTCAATTAGGAAAAGAAGAAGTCAAATTGTCTCTGTTTGCAGATGACA
-TGATTATATATTTAGAAAACCCCATCGTCTCAGCCCAAAATCTCCTTAAGCTGATAAGCAACTTCAGCAAAGTTTCAGGA
-TACAAAATTAATGTGCAAAAATCACAAGCTTTCTTATACACCAATAACAGACAAACAGAGAGCCAAACTATGAGTGAACT
-CCCATTCTCCATTGTTACAACAAGAATGAAATACCTAGGAATACAACTTACAAGGATGTGAAGGACCTCTTCAAGGAGAA
-CTATAAACCACTCCTCAAGGAAACAAGAGAGGACACAAACAAATGGAAAAACATTCCATGCTCATCAATAGGAAGAATCA
-ATATCGTGAAAATGGCCATACTACCCAAAGTAATTTATAGATTCACTGCTATCCCCATTAAACTCTATTGACTTTCTCCA
-CAGAATTGGAAAAATATATTTTAAATTCCATATGGAATCAAAAAAGAGCCCGAATAGCCAAGACAATCCTAAGCAAAAAG
-AACAAAGCTTCAAGCATCATGCTACCTGACTTCAAACTATACTACAAGGCTATGATAAACAAAAGAGCATGGTACTGGTA
-CCAAAACAGATATATAGATCAAAGGAACAGAACCGAACCCTCAGAAATAACACCACATATCTACAACCATCTGATCTTTG
-ACAAACCTGAGAAAAACAAGCACTGAGGAAAGGATTCCCTATTTAATAAATGATGTTGGGAAAACTGGCTAGCCTTAGGC
-AGAAAGCTGAAACTGGATCCCTTCCTTACACCTTATATAAAAATTAACTCAAGATGAATTAAAGACTTAAACCTAATACC
-TAAAGCCGTAAAAACCCTAGAGGAAAACCTAGGCAATACCATTCAGGACATAGGCATGGGCAAAGACTTCATGACTAAAA
-CACCAAAAACAATGGCAACAAAAACCAAAATTGACAAATGGGACCTAATTAAACTAAAGAGTTTCTGGACAGCAAAAGAA
-ACTATGAGAGTGAAAGGGCAACCTACGAAATGGGAGAAAATTTTTGCAATCTATCCATCTGACAAAGACCTAATATCCAG
-AATCTACAAAGAACTTAAACAAATTTACAAGAAAGAACAATCCCATCAAAAAGTGGGCAAAGGATGTGAACAGACACTTC
-TTAAAAGAGGACAATTATGCAACCAAGAAACATATGAAAAAAAGCTCATCATCACTAGTCATTAGAGAAATGCAAATCAA
-AACCACAATGAGATGCCATCTCATGCCAGTTAGAATGGCAATCATTAAAAAGTCAGGAAACAAAAGATACTGGAGAGGAT
-GTGGAGAAATAGGATTGCTTTTACACTGTTGGTGGGAGTGTAAATTAGTTCAACCATTGTGGAAGACAGTGTGGCTATTC
-CTCAAGGATCTAGAACTAGAAATGCCATTTGGCCCAGCAATCCCATTACTGGGTATATACCCAAAGGATTATAAATCATT
-CTACCATAAAGACACATGCACACGTATGTTTATTGCAGGACTGTTCACAATAACAAAGACTTAGAACCAACCCAAATGCC
-CATCAATTATAGACTGGATAAAGAAAATGTGGCACATATACACCATGGAATACTATGCAGCCATAAAAAAGGATGAGTTC
-ATGTCCTTTGTAGGGACATGGATGAAGCTGGAAATCTTCATTCTCAGCAAACTAACACAAGAATAGAAAACAAAACACCA
-CATGTTCTCACTCATAAGTGGGAGTTGAACAACGAGAACACAAGCACACAGGGAGGGGAACATCACACACTGGGGCATGT
-TGGGGGTTGGGGGCGGGGGGAGGGATAGCATTAGGACAAATACCTAATATAGGTGATGGGTTGATGGGTGCAGCAAACCA
-CCACAGCACATGTATACCTATGTAACAAACCTCAGCATTCTGCACGTGTACCCCACAACTTAAAGTATAATAAAAACGTA
-GGTTAAAAAAAAGTATTACAGACACAGTATGATGCAAATCTTTGACTTGGCTAGCCTCAAGGCTTTTAAAAGTCTAAGAT
-TCCTTAGTAGAAAGTTCCAACAAAGCCAATTTTAAGAAGCCTATATGGTCAATAAATATTCTTGCTGCACTTTATGCAAA
-TAATCAGACCAGGTATGATAAGACTAAAACTTATTTTGCACAGAAATTTGTCCTACTATGGTTTGTCTTTGATAAAATGA
-TGGACTAGAGAGAGAAAATTCATGTTTCAAATGAAAACTGTGACATATGCTATTAGATTCCAGCCCTGATCATTCTTTTC
-CGAGTTTTTATTATTTGCCTATAATTTGGGCTGAATCCTGAATTATTTCCTGGCTCCAAGTGTTCCCTAGTGAACCCAGA
-TAAAATATATTTTTAAAAAACTTGTTTTATCCTGTCAGTAATGAGATGTATTTTTATAGGACTACTTAAACTAGCAATTA
-CAATTCGATTATTATGATTATAGAATCTCGGGATTTATCTTCCTTCTTGTCAAGGTCTTTACCTGATGTTTGTCTCATTA
-AAAAAAAAAAGAAATCAGACTGATTGCACTCTACTCAAGACTGAAGACATGTACTTTAACCTGTCTCTGTTACCAGTAAA
-CCAAAGCCTTAAATTTCAGAATCCGTCAGGGACCCTGTGTGGTCCCTGGATCAAGCACACATGGGCTTATGAATGTGTTG
-ACCGCTGGCATATGAGAGGTAATTGTCTATTAGGTTATGTGGCTCTTCCTCTTCCTATTTATAACTCCAATGTTTCTGAA
-CGCTGAAGTAGTTCATCGAAATTATTTTCCAGGATTAGACAAACCGTACCTGCAAACCAAGGAGATGAATTTTGGCCTAT
-GTTTGGCAGAAATCTCTTGCAATGGTGGGGAGTAACCTCTCATGAACGTATAATTAGAAATCTGTCAACCACTCTAGGTA
-ACTTAGCAAATGAACTAGCTGAAGCCATAGCTACCAAATAAAGATCTTCAGACTCTTTATTCAGGATAGTCATGGATGAC
-GGAATAACTTTAGGCTACATAGTGGTGAAACAGGGAGAAACTCATATGGCAGCTAGCTAACACTTCATGTTGTGTTTAGA
-TCCATACATCTTCTGAAGTTGAAACACGTGTAAAAAAATAAGACGATATGGGAATTAATTATGACAAATCCTAGGGAAGA
-GGCTGAAAGAGCTGTAACACAAACAGGGCTGAGACATGCCCCTTGCTCGCCACATTGTGGGCAAAGAGAAGGAAAGAAGA
-GCTATGGCCCTTTGGGGAGCCCAGACCTGGGAGCTCCCTGAGCCAGAGCTGTGATTCCTTCTTTGGGGCCTTTGGTTCCT
-GATATCTCCAAGCTTCTGGGTGCCACTGTGTTCCCAGTGTGCCAGCTGTGGAAGCTTCTTGAGGTGCCCGTGGTCCAGCC
-ACAGCCTTGTGGAGAGCTGGCGCCCGTGTTGGCACCTGGAGCTACCTGCTCCACTTCAGCAGCCAGCAAATCTGACTGCA
-CAGTGACCAGACCCCATGCTCACTCACACACCCCTTGCCACTCCATGCAGTCTCCCTTGGCAGGCATGGGATCCAACGTG
-GTAGCATGAGCAGAGCACAGCCTGCCAGGCTGAGTGTGCGGGGCCCAGCAAAACTCAGGCAAAGGTGCCACCAGTCATAG
-AGGTTTCTGTCCAGAAAAGTAACACCCCAAAGATCCCATAACACCGCTACTCTTCCCAGCCTCTGGAAACTCTCAGTCTA
-CTCTCTATCTTGATGAGTTCAATTGTTTTAATTTTTAGCTCCCACAAATGAGTGAGAACATGCGAAGTCTGTCTTTCTGT
-GCCTGGCTCATTGTACTTAACATAATTGTCCTCTAGTTCCATCCATGTTGTTGCAAATGACAGAATCTTATTCTTTTTCA
-TGGCCGAAGAGTACTCCATTGTGTATATGTACTACATTTTCTTTATCCCTTCATCTGTTGATGCACACTTAGGTTGCTTC
-CAAATCTTGGCTATTATGAATAGTGCTGAAATAAATATGGGAATGCAGATATCTCTTTGATATACTAATTTTCCCTCTCT
-TGGGTATATACCCAGCAGTGGGATTGCTGGATCATATGATAGTTCTATTTTTAATTTTTTGAGGGACCTCCATATTGTTC
-TCCATAGTGAATATATTAATTTACATTCCCACCAACAGAGTAAGAGTGTTCCCTTTTCCCCAAATTCTTGAAAGCATTTG
-TTATTGCCTGTCTTTTGCATAAAAGCCATTTTAATGGGGTAAGATGATATATTTTTGTTGTTTTGATTTCAATTTCTGTC
-ATGATAAATGATATTGAGCATCTTTTCATATACCTATTTGACATTTATATATGTTCTTTTTTGTTTTTGCTCATTTTTTG
-AGACAGGGTCTCACTCTGTCACCCAGGCTGGAGTGCAGTGGTATGATCATGGCTTAATGTAGTGTTGACTGCCAGGGTTC
-AAGCAATCCTCCCACCTCAGCCTCCTGAGTAGCTGGGACCACAGTCATGCATCACCATGCCCAGGTAGTTTTTAAAATTA
-TTTGCTATGTTGTTCAGGTTGGTCTTGAACTCCTGGGCTCAAGTGGCCCACCCGTCTTGGCTCCCCAAAGTTCTGGAATT
-ACATGTGTCAGCCACTGCGCCTGACCTGTGTGCCTTCTTTTGTGAACTGTCTGTTCAGATCTTTTGCCTATTTAAATAAT
-TGGATTGTTAGTTTTTTTCTTGTAGAGTTGTTTGAGCTCCTTATATATTCTGGTTATTAATCCCTTGTCAGTTATATAGT
-TTGCAAATATTTTCTTCCATTCTGTGGATTGTCTTTTCACTTTGTCCATTGTTTTCTTTACTGTGCAGAAACTTTTGAAC
-TTGATGTGATACCACTTGTTCATTTTTGCTTTGGTTGCCTGAGCTTTTGGAGTATTACTCAAGAAATCTGTGCCAAGACC
-AATTTCCTGGAGAGTTTCCCTAATGTTTTCTTTCAGTAGTTTCGTGTCTTTGATTTAAGTCTTTAACCCATTTGGATTTG
-ATTTTTGTATATAGTGCAAGAGAGGGTTCTAGTTTAACTATTCTGCCAATGACTTTGGGAGGCCAAGGTGGGCGGATCAT
-GGGGGCAGGAGATCGAGACCATCCTGGCTAACACGGTGAAACTCCGTCACTACTAAAAGTACAAAAAAAAAATTAGCCAG
-GCGTGGTGGTGGGCACCTGTACTCCCAGCTACTTGGGAGGCTGAGGAGGAGAATGGTGTGAACCCGGGAGGTGGAGCTTG
-CAGTGAGCCCAGATCGCGCCACTGCACTCCAGCCTGAGCAACAGAGCTAGACTCCATCTCAAAAAAAAAAAAAAATCTGC
-CAATGAATATCTAGTTTTCCCAGCACAATTTGTTGAAGAGACTGTCCTCTCCCCCATGTATATTCTTGGCACCTTCATTG
-AAAATGAGTTAATTGTAAATGTATGGATTTATTTCTGGGTTCTCTATTCTGTTCCATTGGTCTATGTGTCTGTTTTATGC
-CAGTACCATGGTGTTTTGTTTATAATTGCTCTGTACTATAATTTAAAGTCAGGTGATGTGATTCTTCCAGTTTTGTTCTT
-TTTGCTCAGGATGGCTTTTGGTATTCTGGGTCTTTTATGGTTTCATGTAAATTTTAGGATTTTTTTTCTATTTCTGTGAA
-GAAAGTTATTAGTATTTCAATAGGGATTGCATTGAATCTGTAGATTGCTTTGTGAAGTATGGGTATTTTAACAATATTTA
-CTCTTCCAATAAATGAACATGGACTATCTTTCCATTTTTTTTTTGGTGTCCTCTTTAATTTTTTTGCATCTATGTTTTAT
-AGTTTTCATTGTAGAGATCTTTCACTTCTTCTGTTATGTTTATTCCCAGTTATTTTATTTTATTTGTAGCTATTGTAAAT
-GGGATTACATTCTTGATTTTCTTCTTTAGATTGTTCATTTTTGTCATTTAGAAATGCTACTGACTTTTGTAGTTTGATTT
-TGTATGCTGTGACTCTGAATTTGTTGATCAGTTCTAATAGTTTTTTGGTGGAGTCCTTAGGTTTTTCCAAATATAAGAGC
-TAATCATCTGCAAACAAGAAACAGTAATAATTTTACTTCTTTCCAATTTGGATCCCTTTTATTGTTTTTCTCTTGTCTGA
-ATTGCTCTAGCTAGGACTTCCAGTACTATGTTGAGTAACAGTGTTGGAAGTGGACATTCTTGTCTTGTTCCAGATCTTAG
-AAGAAAGGCTTTCAGCTTTTCCCTGTCCAGGATGATACTGGCTGTGGGTCTGTTGCATATGGTTTTCATTGTGTTGTGGT
-ATGTTCCTTCTATATCTAGTTTTTTTTGAGGGTTTCTTTTTATCACAGGGATGTTGAATTTTATTAAATGCTTTTCAGCA
-TCAATTGAAATTATCATATGGTTTTTGTCCTTCATTCTGTTGATATGATGTGTCACATTGATTGATTTGCATACATTGAA
-CCATGTTGGCATCCTTGGGATAAATCCCACTTAGACATGATGAATGGTCTTTTTCATAGGATGAGTTTGGAAATACTACA
-GCCTTCTCTGTTTTTTTTGAATAGTTTGAGTAGGATTGATAGTAATTCTGCCTTCAATGTTTGGTAAAATTAATCAGTGA
-AGCCAGTGAAGCCATTGAATCCAGGCTTTTCTTTGCTAGGACATGTTTTATTAAGGCTTCAATTTCATTTATCCATTTCT
-TCTAGGTTTTTTTTTTTTTTGAGATGGAATCTTGCTCTCTCACCCAGACTGCAGCGTGGTACAATCTCAGCTCACTGCAA
-CCTCTGCCTCCCAGGTTCAAGTGATTTTCCTGCCTCAGCCTCTAGAGTAGCTGGAAGTACAGGTGCATGCCACCATGCCT
-GGCTAATTTTTGTATTTTTAGTAGAGATGGGGTTTCACCATGTTGACCAGGCTGGTCTTGAACTACTGACCTCAGGTGAT
-CACCTGCCTTGGCTTCCCAAAGTGTTGGGATTACAGGCATGAGCCACGGTGCCCAGCCATTTCTTCCAGGTTTTTCAATT
-TATTGGAATATAGTTGGTCATAATAGTTTCTAATGATTCTTTGAATTTCCACAGTATCAGTTATAGTGTCTCCTTTTTAA
-TCTCTGGTTTTATGTATTTGAATCTTCTCTCTTTTTTCTTAGTCTGGTTAAGTGTTTGTTGATTTTGTTGGTCTTTTAAA
-AATATTAACTTTTCATTTCATTGATATTTTATATTTTTAAATTTCAATTTCATTTATTTCTGCTCCGATCTTTGCTATGT
-TTCCTTCTACTAATTTTGGTTTTGGCTTGCTCTTGCTTTTCTAATTATTTAAGATGCATTATTAGGTTGTTTATTTGAAG
-CTTTTCTACTTTTTTTGATGTAGGTGCTTTTATCTATAAACTTACCTCTTAGTACTGTAGTACTGTTTTTACTGTATCCC
-ATAGGTTTTTTTTTTTTTTTTTTTTTTTTTTTTGTTTTTTTTTTTTTTTTGAGATGGAGTCTCGTTCTGTTGCCCAGGCT
-GGAGTGCAGTGACGCGATCTCGGCTGACTGCAAGCTCCGCCTCCCAGGTTCACACCATTCTCCCGCCTCAGCCTCCCGAG
-TAGCTGGGACTACAGGCGCCTGCCTTCACGCCCGGCTAATTTTTGTTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCG
-AGTGCGCCCGGCCTGTACCCTAGGTTTTGGTTTGACTTTAAACTTTTTCTTTTCTCGAAAACTCAGTGTCATGGTACCGG
-CTTCTTGTGCTTTGGGCAGTGAGACCCTTTTACTTGATAACAGTGGTAGCTGGGACAAGTTGGCAATGTAAATAAATAAA
-CAACATCTAGATTGGAAAGGAAGAAGTACAGTTATCTTTATGTACAGATGACATGATCTTGCATTTAGAAAATCGTAAGA
-AATTTACTAAAAAGTATTAGGACTCATGAACAAACTTAAGAATGTAACACTATATAAGATTGGTATACAAAAATAACTGT
-ATTTCTTTACCAATAAATCAAGAATCCAAAAATGGAATTAAAAAAATAAATCTTGTTACAATAGAATTAAAGCTGGGGAA
-GCTTAAACTTGAACACTAAAAACTACAATACATGGTTAGCGTTGGAAACACCCAGATACCATCCCTGAGCCTTCTCTCCT
-TGGCTCTGAGGGCTTTACCTTCACGGGGTGAGGAAAGGGGTTGCATTCTTGGCTTTTACATTATATTAGGTGGGTTCGGG
-TTGAGGTATCTGCAATTCAAATGAGTATTACAATCTCTACTTTTATGGATAAGAGACTGAGGCCCACCAAGAGAGGGAAT
-GACAGTCCATATCCTGGAAGGCGAATTGTCAGGCACTGATTTCCGCTATTTAACCCCTGCCAATCATCATGTATTTAAAG
-GATCCCCAGATACCATACCAATAGGTGTTCAAGAGAGAGGCCTGTAATCTAGGCGTCTGAGAAAACAAGGCTAGAGATTC
-CAATATTGGAGACAACAGGGCTCTGGGAAGATTAAGGTTGAGTTTTCTGGATCTGCAGAATAGAGTCACTGAGGACCAAT
-TGCAAGATCAGAGGAGATGAAAGAACAAGTCAGGGCATGCTTAGGAAAAGAGAATACCAGGGATAGGTTTTAGGCAAGAG
-TCACACTGAGGAAGGGCAGGTTCTTGGCGTCGTTTAGGAAGAAATCCAAAAGCAAGCCTGTGGTGGAAGAAAGCAGCTCT
-ACGGAGGCATTGGCGGTGTTACAGCACTGCGTCCACTCCGGCAGGGCAGGGAGCCCTCCGTGGGTTGTGCTCCCAGAGCA
-GCAGCCTAGGGGTGGCTTGTAGTCATTTTTATAATTCACTTTTAATGGCATGCTAATTAAGGGGCGGGTTATTCAGAAAT
-AGCTAGAAATGGGCAGTAACTTCCATCTGTTTCCATGGCAAGGGGTGGGGACTTCTCGTGATGACATGGCATTGGCAAAC
-TGTCATGGCACTGGTGGGAGCGTCTTCTGGTGATCTGAGGCGTGAGGTGCTTTCGCTGCCTCTCCCAGGTTCCTGCGTGC
-CTCTTACCTGAAAGCCCATCACACCCCCATCTGCCCACCTACAAACGTCACTGCCCTTTCACCCCATCCCCGTTTCACAC
-GCACTCCCACATCAACCCTGAGCATTCAAGCCTGCGTTTCCCTGTTAGGAACCTCGGTGGTAGCCGGAGCTCTGAGAAAC
-CCCTAGGCAGAACTCCTTGCCTAGTTTGTGGCAGACATCAGGGAAGGAAAGGCAAATTTCAGGTCTTTCTCACAATAAAT
-AAATAAAGATAGGTAGATTTGATTGATGGATGGATGGATGAAACCTGGGAGTCTACGGGCAAATATTTATCAGACACTGG
-AAGTGTAAGTTGTCACAAAGATTATGGAGTGCACCTGTCTTATGACCCTGTTATTTTATCCTAGTATGTGCACTAGAGCA
-TATTTTCTAACAGTGTAAATTGAAGGCTCACAAATTAGTTTAGTGAGAGAAAAGATAACGGATTGGAAGAGAATTACCAT
-ATTCATTAGTTGTGTTTTAAAATTTTTAAAGTAAAATAGAGACATTATTTTTTTCATGCTTTCGAATGCATCTATAAAAA
-ATAGACTTGAGGGCTGGGCGCAGTGGCTCACGCTTGTAATCCCAGCACCTTGGGAGGCCGAGGAGGGCGGATAACGAGGT
-CAGGAGTTGGAGACCAGCCTGACTAACATGGTGAAAACCCGTCTCTACTAAAAATACAAAAATTAGGCGAGTGTGGTGGC
-ACGCGCCTGTAATCCCAGGTACTTAGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAAGCGGAGGTTGCAGTGAGCC
-GAGATCGCACCATTGCACTCCAGCCTGGGCGACAGAGTGAGACTCCTTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAACTTATTCATAGCATAGACCAATTGGCCTCTATTGAAATTTCTCCATTATTTTCACAATGTCCCAGGCTG
-TGAAACCAGGATTTAATAAAGAACCAGAATGCCACATCTGTGTCACCTGGGTAGGGACCAGTCCTGATACATTAACTCCG
-GGTCTCTGGGTAACTGGACTCAACTGCTGGGCAAAACAGAATGTCCGGCTTGGGTTCCTAACGGGGTACCGCAAAGCCTC
-ATGGGAATTGTAGTGTCACCTTCCAATGATGTTACCATCAAGGACCTTGGGAACCAGCTTTTCTCTCTGCGCTTGCGCCG
-CCCGGCCCACTCCGCCATTTTCCTCCGGAAGTGCGGCACCCAGAGGCCGTCCTGTAGCCGGGCCGGCTTGGGGCTTGGTT
-CTATGTCCCTGCGGGTCGGTGCAAGGGCGAAGAGGAACCCGTGGGCCTCAGGGGATCCCGGGGGGCCGGACCAGTGTTCC
-CTAGTTGTGGGAGCAGACGCGTGGGCACATTGCGGGCGGGCAGGGCCTGAAGTGCAGGTGCGGGCAGTGGACCCTGGCGG
-GGGCTGGGAGGACAGGCGTGGGGTCCCGGCAGTGAAACGGGTTCTAGAGGCGCAGGAGCAGGTAGGAGAGGCCGGTGGCC
-CTGGGCCCGGAGTCTGCAGGCCGCGCTCCTGTCCTGCCGCTGAGGGACCCGGTTACCAACCTGCATGACGCTCAGTTTGC
-CCATCTGTCCCAGTGGTAACACACAGTTCTCGGGAGACGTTCCCCATTCCCAGAGGAGTAGTGTGAAACGCGTGCGCCTC
-TAGTCTTAAACTTGGCGTTTGTATTAGTTGGGTTTCCTGGTGTCTCTTTAGCAAGTGAAGTTTCTGGTTCCCTCCTTCAC
-TGTGTGACCTGCCTAGTCCTCCTGGGTCGCATTTACAGAAGTTTATACGAGACCTAGTTTCCAGGGAAGAACTCACTGAT
-TCCGCGAGGGAGATGGCTTAATGGATGATGGTCGTCAGCCTTAAGGATACTTCAGTCTTAACTGTGTGTTACAAAGTTTG
-AAAGGGAGGGTTCCCTATGAATAAGAAGCACACTTGAAAGAACAGCCATCTGGTCTAACCTCTCACTGGTGCTTCAGAGG
-AGGAAAAAAGGTCACAGGTGAAGATCCCAGTTTTCCTTGCTCAGGAAATATTAATTCTACTCCCTAGAATGCACAAGATT
-TGCAAAGACTAGGTGATAGTAGAAGGTTTGGACGAACTTTCAGAAGGTTGAGGTGAATTCAGCTAAGAAGAACAGGCAAG
-GACTTAGGAAATATTCCTTATTTGAAGGGGCCTGAAAGTGTGGTCTGGGGTACAGCAGTGACCTGTCATACTTGAGAGGA
-TTAAAATACTCTCCAAACACAGTCCCATTCCTTCAACCTTAGCTCGTTTTTTCCAGCGTCTGAGATACATTAAACCTAGT
-CCATCCCCAAATTTAACATTAGATTGCGAAGTTCTATTGATTGTATTTGATTTGTAATTTAACATTTTCTCCCCCTACGT
-AATTTTGTTAAAAACACAGAAGTGAATTCTGTTCACTTAGGTGTAACAGTTAATACTTGCTGTTTAAGGAACTAATTAAA
-CCTTACTGGCTTATAAAAAACAACCACCATTTTATTTGTTCGAAGTTCTGTGGATCTGCACTTTGGTGTGGTGGGTTCAG
-CTGGGTAGTTAATATATTTGTGTTGCCTGGATCACAAAAAGGCCTCAGTCACCTGGTGCCTTGACTGAGCCTGGTTGGTT
-TAAGATAGTTTACTTCACAATCTGGTGGTTTGTGGTGACTCTTGGCTAGGCCCTGTGTCTCCAACAGGGTAGCTCCAGAC
-TTCTTCACAATTTCCCCCAAAAAGGAAAGAACCAATGGATATTTGCATCACATTTTCCATTTTCCATTCACTGGACAAGT
-CAGATGGAAAAGCCCAATTTATTGTCAGAGCATAATATGAGGGCTTGGATAGAAGGAAAGGTGTTATTGGGAAACATGAG
-TAGAATGGTGTACTGCAGGAAATACATATTATGTACATTTTAAAAAACGTAATTGTAGGCCAAAATTGCTGGTTTGCAAG
-ATGCACTTTCCATGATGTTCAGGTATAGAAAAGCAAGATGTACTGTCATAGGAACACTCATATGAAGTTATTTGTGGAAT
-CTACATATTAATAGGAAAATAGTTAATACAGCCCAGTATATTTCTATAACATTTATTTTAGTGAACTTATAATGTTTCTT
-TGTATTAAATTATTAGATTATATCTTTAGATAATATTGTTACTAAATTAGTAGGTAATATATATTTTTATTCAAAAATAA
-ATTGTGCATCTAATGTCTACCAATTAATGTACTTGTAGATGTATCTTATCTTAACTTGAGTCTTTGCTGCCCCTAATGAG
-GTGTGAAGGACTCTTCTCCCCTGGGGAAGTTTTTCTTTTTCAGGAGGGAGGAGGGCTTTCCCAGGTAATGTGTCTAGAGT
-GTTGGGCAGAAGAATCTGGGACCACACCACACCAGTTCTCTCCTTAATCCACGTCATTTGCCTTCTATCCCAGCTATGTT
-TCCAGTGTCCTCTGGGTGTTTCCAAGAGCAACAAGAAATGAATAAATCTCTGGTGAGTTGTTTATTTGTTCTTCACTTTG
-TTTTACACTGTATTTTCTGAGTTTATGGGTGTCTGTGAATTAAAAAGGAAAAGTAGAAATAAGTAAAACTCAGGTTGAAG
-GAAATATACATAAATAAGATAAAGCTGACCTGTAGATATAGGCAGGTTATAAGAGCTTAGAGTTGTCTAAGTTGAGTGCA
-AATTTTCCTCTGATCTTTCTGATGCCGAGACAAAAAAGGCAGTCATGTTTGTTATGTGATTGGAATGGAACCCGAGAAGA
-GAGCATGCTGTGTTCTTGTGGGACAGGAAAGCTTGCGTGCACCAAGTCTGAACCACCACCTTCATTGGTGACATAGATTA
-TGTGCTGGAACATATTTCACACCGGCCTGGCAGTAAACACTTGTAGTGTTGTGCAGTGGAAACGGTCATCTTCCGCTAAA
-GCACGGCGTGTTGTGCAGCGGAAATGGTCATCTGCTGCTAAAGCACAGCTTCCATCGTAATGTATGCTCCTTGCTCAAAG
-AGTGTGGTCCCAAACAGCCTTTGGGAGGTCCTCCTTGATTCATGGATGAAACCTGGAACATCTTGAGGACTGAGTTAACC
-ATAGGTCCTTAAATAACTCTCCACACGTTTTTCTTAGTTTATCTCTACATGCAGGGTGTGCAGCAGCCTGTTCAAAGTCA
-TATTTTCTGGGAAATATTTCCAGTGTTTATTTGCACTTTAGCCCACTCTGTGTAGCCTTATTTCTTCTAAACTCACCATT
-AACCTGAATAATAGTCAAATTTAGGGGGACTGTATTTGCCTTACTTGAGTCTTCTACCATAGTTGAAACTGTCGTACCCG
-AGTGAGTTAGAGAGAAATGCCACGCATTGAGACGAATTCAGGAGTCCTTTACTAGCCAGCGACTGAGACATGGCTAACGC
-ACGAAATTCTCTCGGCCCTGAAGAAGGGACTAGATTTTCTTTTATACTTTGGTTTAGAGAGGGGAGGGGGGATTCTAGCT
-GCAACAACTTTACAGAAGAAAAAAACAGACAAAAAACTTAGAAAAACAGATGGTTACAGGAAAACAAACTGTTCCTGGTG
-TAGGGTCTTTAAATTCACCACAAAGTGATAGGTGAGGGGGCTCTGGGCATTATCTGCCGGACAAATGTGGGGGCTTTATG
-ATACTATCTCTGAGTAAATTGCTGGGAACTGGGGACATCTCTTGTCTCAGCACTTTATCAGTTATTTGCACGCTTTGATA
-TGTTGAAAATCAGCTTGCACAAGTTAAAGTCCTTGAGGAAAGGGGGTGGGTAAGGAGTCCTTGATGTCTTGTTAATGAAG
-GAGCCAAATGGAGTTTGTCTGGTTTTCTCAGCTAAGGGAGAGTCTATTCATATTAAAAACAAGGTTAGCTGTCTAAGGAA
-GAGTCTATTCATGTTAATACAACGTTGGGTATTACAAAACGTCTGTTCATGATCTGGAAATTCTTCTGTGTTAGTTCTGT
-TAAAAGAAAAACTTTAAAGGAGTTTAATTTAGCAATAAACGATTCATGAATCGGACAGTCCCCAGAATCACAGCAGATTC
-ACAGAGACTCCAGTGCAGTCATGTGGTGGAAGAAGATTTATAGACAAAAGGGAAGTGGCATACCGAAATCGGAAGTGAGG
-TACAGAAACAACTCAGCGTTTGCCTTGTTTGAACACATTTTGAACATTTGGCAGTGCCTGAGTGGTTGAAGTTTGGCCAT
-TGGGATTGGCCAAGATGTAGCTGTTGTTCCAGGTGCATACTCTTAAGTTAGTTTTTCATTCTTGTATACCTATTAAGGTA
-GGTTGCAGTTCACCCACAAGGACTCATATATAGAATTATGGAGTCCTTCTCAGGCCATACTTAGTTCACTTTAACAATGC
-CTTCCCTTTGGTTATTTTCTCAATTTTGAGAGATTGGCCGAAACTTCAGTCACTGGTGTCACTATTACCATTGCAAATGT
-ACTTACTTGGTTTAGAAACCCACTGGGAAATAGACCAGTGAGATTTGAAAAGGTGGAACAAGGACTTGAGTAGAAGGTAT
-CTTCTTATGCTGGAACATCCTGTTTACAGGAGAAAAACAAAACCTGGTTTGTTCTAGGATTTATGTGTTTCCCTAAAGTC
-TTAGTTTGATTATGTTACATTTAGCATGAGTGACTCCATTTTGGTTTGGTTTGGTTTGGTCTGTTGGGACCTATTGCATG
-AGCTTAGTTCAAAACAATGGCCTCCCATAATTTTGCTTTAAAAATTCCTCCTTTTTGCTGGGTGTGGTGGCTCACACCTG
-TAATCCCAGCACTTTGGGAGCCTGAGGTGGGCAGATCACGAGGTCAGGAGATTGAGACCATCCTTGCTAATATGGTGAAA
-CCCCATCTCTACTAAAAATACAAAAAATTAGCCAAGTGTGGTGGCGGGTGCCTGTATTCCCAGCTACTCAGGAGGCTGAG
-GCAGGAGAATGGCCTGAACCCGGGAGGCAGAGCTTGCAGTGAGCCAAGATCATGCCACTGCACTCCACTCTGGGGGACAG
-ACCAAAACTCTGTCTTAGAAAAAAAAAATCCTCCTTTTCAGTCAAGTTCTCACTTAGTTGAGAGTGTGACCAAAATGTAG
-GGCCTTAGCATCACTCTTAGTTACCATTGTTTTGGGTTCCAGTTTTAGCATGTCATTCCCATTGTTTTGGGTTTCTGGTT
-TAGCACATCACTCCCATTGTTTTGGGTTCCGGTTTTAGCACGTCATTCCCATTGTTTTGGGTTTCTGGTTTAGCACGTCA
-CTCTCATTGTTTTGGGTTCCTGTTTTAGCACGTCACTCCCATTGTTTTGGGTTCTGGTTTAGCACGTCACTCACATTGTT
-TTGGGTTCTGGTTTTAGCACCTCACTCCCATTGTTTTGGGTTTCCAGGTTTTAGCACGTCACTCCCATTGTTTTGGGTTT
-CTGGTTTAGCACGTCACTCCCATTGTTTTGGGTGTCTGGTTTTATCACGTCACTCCCATCGTTTTGGGTTTCTGGTGTAG
-CAGGACACTCCCATTGTTTTGGGTTTCTGGTTTTAGCACTTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCAGGACCCT
-CCCATTGTTTTGGGTTTCTGGTTTTAGCATGTCACTCCCATTGTTTTGGGTTCCGGTTTTAGCACGTCACTCCCATTGTT
-TTGGGTTCCGGTTTAGCACGTCATTCCCATTGTTTTGGGTTCAGGTTTTAGCACATCACTCCCATTGTTTTGGGTATCTG
-GTTTTAGCATGTCACTCCCATTGTTTTGTGTATCTGGTTTTAGCACCTCACTCCCATTGTTTTGGGTTTCCAGGTTTTAG
-CACGTCACTCCCATTGTTTTGGGTTTCTGGTTTATCATGTCACTCTCATTGTTTTGGGTTTCTGGTTTAGCAGGACGCTC
-CCATTGTTTTGGGTTTCTGGTTTTACACGTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCAGGACACTCCCATTGTTTT
-GGGTTTCTGCTTTAGCGGGTCACTACCATTGTTTTGGGTTCCGGTTTAAGCACATCACTCCCATTGTTTTGGGTTCCGGT
-TTTAGCACATCACTCCCATTGTTTTGGATTTCTGGTTTAGCAGGTCACTCCCATTGTTTTTGGTTCTGGTTTAAGCACAT
-CACTCCCGTTGTTTAGGGTTCTGGTTTTAGCACCTCACTCCCATTGTTTGGGTTTCTGGTTTTGCAGGTCACTCCCATTG
-TTTTGGGTTCCAGTTTAAGCACATCACTCCCATTGTTTTCGTTTCCGGTTTTAGCACGTCACTCCCATTGTTTTGGGTTC
-CAGTTTTAGCAAGTCACTCCCATTGTTTTGGGTTTCTGGTTTAGCATGTCACTCCCATTGTTTTGGGTTTCCAGTTTAGC
-ATGTCACTCATAGGTTATGGTGGCCTTATGGTTGCACATTTTTTTTAATCTCTTGTCATTCCAGTTGAAGAGATACCATT
-TGACATTTTAGAGATGGCTGCATGCAAACTCTTGAAACATTTGAGTAAGTACAGTACACCAGGGAGACTCTTATGACTAT
-TGGGATAACACCAAGATGTGGTATATGCTCCTTACTCAGGGTCCCCATAAATCAAACCACCAAAAATCAAATAGATTAAA
-GAATGAATTAGATAAAGGGTTTACTTGCTTAACTAAGTGGTTTTTTTTTGTTAATTCCCTACAACCAAATCTTTATAATA
-CCCCATGTTTTCTCCACATGCTGTAAGTGTTAGCAGCTGCACAGATACTTAAGATAAGAGTCTCATGATAGTAGAGAAGT
-CTTGATCTGTGATCTTGGGAAAAGCTGTTCACATTAAGGATGCCATCTTCTTCTGGGGGGAACTGTCCGTGTTAGCTTTA
-CCTTAAGGGTTCCAATAGGCATATGGTTCTGAGTGTGGAGGGACCCTTCTGAGTTGTGAGACTATGAACCCAAAGTTTAA
-GGTTTTAAAGTTTTGTTGTCATGTGGATGGCGAGGGCAGTCCTTCTCTGATGTTCTCAGAAGATCCAGTCATCAGATTCT
-AGATTTTGAAGGGTTTGACTGTCCTCAGTGAACCATAAAAGGCTTTCTTTACCTGGTGAAAATACACTTCAGGGTAATAA
-TCTACTGTTTTAACATCAACTCTCTCGCATGGAAGAGCTTTTATACAATCAGAAAACATGCACTGAAAATGACAACTGAA
-TGAAATCCCTTTATAAAATGTTTAAATGGCCCATCAGATAACCAAATGTACCTAAAGTTTTGATTGTTTTCCTAGGAATA
-TAGGTTTCACAAACCAAACATTGGTTATAAACTATTTTAGCAGTTTAGAAATCACCACACCAATATATTTAATTTGGATC
-GTTTTCTCTTTCTGTGATGAGTTATGGAATGCAGAACTTTTAATAACAAAAGTTTTTAGGACTTAAGAAGGATAAGGTGG
-CCATCCTGGTTCTTTATAGGTCTGTGCTTAATTAACATCAGACTTACATCCTCTTGAATACCAGCTGTTTCTCCAAATTA
-GGTGCATGGCACTGGTAACTGATGAGTAGTTATAGGTAATTTGATTTAGACCATGGAGTTTATTTAAATTATATATCTAA
-ACAATTTCAATATTGGTGATTTAGCATGAAAATGTGGCATAATATTTCCTTGGTATACAATTTTTGTTTTACTTGGGTTA
-GCAGTTTTACAAACCAGTTGGTCTTTTTATTAAATTTTTGATATTTTTTTTTTTGAGACAGAGTCTCACTCTGTTACCTA
-GGTTGGAGTGCAGTGGCACAATCTTGGCTCACTGCAACCTCTGCCTCCTGGGCTCAAGCAATTCTCTTGCCACAGCCTCC
-CGAGTAGCTGGGATTACAGGCACATACCACCACACCCAGCTAATTTTTGTATTTTTAGTAGAGGTGGGGTTTCACCTTTG
-GCCAGGCTGGTCTCAAACTCCTGACCTCAAGTGATCCACCGGCCTTGGCCTCCTAAAGTGCTGGGATTGCCGACATGAGC
-CGCTGCACCCAGCCTAACTGTTGAGAATTCTTAGCCAGTCCAATTCTTGGGGTATCGGGGAACTTATGGGGAATTTTTAC
-CCATGATATTAAAGTTATTAGAAATCTGTGTTCACGAGTGTTTTTCAGGGTCATTTTCATTCTTTCATGAATCTTCTAAG
-AGACACCATACTCTAGAATTTTGCATGCTTGTGAAGTTTTTAGAAACTGCATCACTATTAAGCAATTAACTGTGAAATGA
-CTTTAGTTATAGTTAAAGACAATTGACAAGGAAATTTGGTTATTTCTGTGGTCTACAATAACTTAATAACCATAATTAGG
-GTGGATGTGGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGTGGAAGGATCATGAGGTCAGGAGATCGTGA
-CCATCCTGGCTAACACGGTGAAATCCATCTTTACTAAAAATACAAAAATTAGCCTGGCATGGTGGTGGGTGCCTGTAGTC
-CCAGCTACTCGGGAGGCTGAGGCAGGAGAATGGCATGAACCCGGGAGGCGGAAGTTGCAGTGAGCCGAGATTGCGCCACT
-GTACTCCAGCCTGGGTGACAGAGCAAGACTCCATCTCAGAAAAAAAAAAAATACAAGAATTTTAGAAATCCTACACAATT
-TTAGAATGGATTGATGACACACACTAAATATAACCTGAGGAAGGTTCCACATTATTTTTTATTTTGACAGTGCTACCCAT
-GTGACTTAACATGTTAAATAGTCCTGTTTACCTCTCTTTTGGGTGCTTCAGGGGTCTCTGTAGTATCCCAAAATTAGAGG
-TCAGAAAAGACAATTTTGAAGTTGAAATTTGATTTTGGGAAGCCTATTAAATATATTAAAGGTTTAAACACTTGATGTTA
-TGAAATAGAATTCCACGTCACCGTAAGTCATTCATTTACCAAAAATCATGACAAAAAATTTTTATTATTTTTTTATTTTT
-ATTTTTTATTATACTTTTAGTTTTAGGGTACATGTGCACATTGTGCAGGTTAGTTACATATGTATACATCTGCCATGCTG
-GTGTGCTGCACCCACTAACTCGTCATCTAGCATTAGGTATATCTCCCAATGCTATCCCTCCCCCCTCCCCCCACACCACA
-ACAGTCCCCAGAGTGTGATATTCCCCTTCCTGTGTCCATGTGATCTCATTGTTCAATTCCCACCTATGAGTGAGAATATG
-CAGTGTTTGGCTTTACGTTCTTGCAATAGTTTACTGAGAATGATGATTTCCAATTTCATCCATGTCCCTACAAAGGACAT
-GAACTCATCATTTTTTATGGCTGCATAGTATTCCATGGTGTATATGTGCCACATTTTCTTAATCCAGTCTATCATTGTTG
-GACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATAATGCCGCAATAAACCTACGTGTGCATGTGTCTTTATAGCAG
-CATGATTTATAGTCCATTGGGTATATACCCAGTAATGGGATGGCTGGGTCAAATGGCATTTCCAGTTCTAGATCCCTGAG
-GAATCGCCACACTGACTTCCACAATGATTGAACTAGTTTACAGTCCCACCAACAGTGTAAAAGTGTTCCTATTTCTCCAC
-GTCCTCTCCAGCACCTGTTGTTTTCTGACTTTTTAATGATTGCCATTCTAACTGGTGTGAGATGGTATCTCATTGTGGTT
-TTCATTTGCATTTCTCTGATGGCCAGTGATGATGAGCATTTTTTCATGTGTTTTTTGGCTGCATAAATGTCTTCTTTTGA
-GAAGTGTCTGTTCATGTCCTTCGCCCACTTTTTGATGGGATTGTTTGTTTTTTTCTTGTAAATTTGTTTGAGTTCATTGT
-AGATTCTGGATATTAGCCCTTTGTCAGATGAGTAGGTTGCGAAAATTTTCTGCCGTTTTGTAGGTTGCCTGTTCACTCTG
-ATGGTGGTTTCTTTTGCTGTGCAGAAGTTCTTTAGTTTAATAAGATCCCATTTGTCAATTTTGGCATTTGTTGCCATTGC
-TTTTGGTGTTTTAGACATGAAGTCCTTGCCCATGCCTATGTCCTGAATGGTAATGCCTAGGTTTTCTTCTAGGGTTTTTA
-TGGTTTTAGGTCTAACGTTTAAGTCTTTAATCCATCTTGAATTGATTTTTGTATAAGGTGTAAGGAAGGGATCCAGTTTC
-AGCTTTTTACATATGGCTAGCCAGTTTTCCCAGCACCATTTATTAAATAGGGAATCCTTTCCCCATTTCTTGTTTTTCTC
-AGGTTTGTCAAAGATCAGATAGTTGTAGATATGTGGCATTATTTCTGAGGGCTCTGTTCTGTTCCATTGATCTATATCTC
-TGTTTTGGTACCAGTACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAATTTGAAATCAGGTAGTGTGATGCCTCCA
-GCTTTGTTCTTTTGGCTTAGGATTGACTTGGCGATGTGGGCTCTTTTTTGGTTCCATATGAACTTTAAAGTAGTTTTTTC
-CAATTCTGTGAAGAAAGTCATTGGTAGCTTGATGGGGATGGCATTGAATCTGTAAATTACCTTGGGCAGTATGGCCATTT
-TCAAGATATTGATTCTTCCTACCCATGGGCATGGAATGTTCTTCCATTTGTTTTTATCCTTTTTTATTTCCTTGAGCAGT
-GGTTTGTAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTTGGATTCCTAGGTATTTTATTCTCTTTGAAGCAAT
-TGTGAATGGGAGTTCACTCATGATTTGGCTCTCTGTTTGTCTGTTGTTGGTGTATAAGAATGCTTGTGATTTTTGTACAT
-TGATTTTGTATCCTGAGACTTTGCTGAAGTTGCTTATCAGCTTAAGGAGATTTTGGGCTGAGACAATGAGGTTTTCTAGA
-TATACAATCATGTCGTCTGCAAACAGGGACAATTTGACTTCCTCTTTTCCTAATTGAATACCCTTTATTTCCTTCTCCTG
-CCTAATTGCCCTGGCCAGAACTTCCAACACTATGTTGAATAGGAGTGGTGAGAGAGGCCATCCCTGTCTTGTGCCAGTTT
-TCAAAGGGAATGCTTCCAGTTTTTGTCCATTCAGAATGATATTGGCTGTGGGTTTGTCATAGATAGCTCTTATTATTTTG
-AAATGCGTCCCATCAATACCTAATTTATTGAGAGTTTTTAGCATGAAGCATTGTTGAATTTTGTCAAAGGCCTTTTCTGA
-ATCTATTGAGATAATCATGTGGTTTTTGTTTTTGGCTCTGTTTATATGCTGGATTACATTTATTGATTTGTGTATATTGA
-ACCAGCCTTACATCCCAGGGATGAAGCCCACTTGATCAAGTTGCATAAGCTTTTTGATGTGTTAATGGATTCGGTTTGCC
-AGTATTTTATTGAGGATTTTTGCATCAATGTTCATCAAGGATATTGGTCTAAAATTCTCTTTTTTGGTTGTGTCTCTGCC
-TGGCTTTGGTGTCAGAATGATGCTGGCCTCATTAAATGAGTTAGGGAGGATTCCCTCTTTTTCTGTTGATTGGAATAGTT
-TCAGAAGGAATGGTACCAGTTCCTCCTTGTACCTCTGGTAGAATTCGGCTGTGAATCCATCTGGTCCTGGACTCTTTTTG
-GTTGGTAAGCTATTGATTATTGCCACAATTTTGGCTCCTGTTATTGGTCTATTCAGAGATTCAACTTCCTGGTTTAGTCT
-TCGGAGAGTGTATGTGTCGAGGAATTTATCCATTTCTTCTAGATTTTCTAGTTTATTTGCGTAGAGGTGTTTGTATTATT
-CTCTGATGGTAGTTAGTATTTTGCTGGGATTGGTGGTGATATCCGCATTATCATTTTTTATTGCGTCTATTTGATTCTTC
-TCTCTTTTTTTCTTTATTAGTCTTGCTAGAGGTCTATCAATTTTGCTGATCCTTTCAAAAAACCAGCTCCTGGATTCATT
-AATTTTTTGAAGGGATTTTGTGTCTCTATTTCCTTCAGTTCTGCTCTGATTTTAGTTATTTCTTGCCTTCTGCTAGCTTT
-TGAATGTGTTTGCTCTTGCTTTTCTAGTTCTTTCAATTGTGATGTTAGGGTGTCAATTTTGGATCTTTCCTGTTTTCCCT
-TGTGGGCATTTAGTGCTATAAATTTCCCTCTACACAGTGCTTTGAATGCGTCCCAGAGATTCTGGTATGTTGTGTCTTTG
-TTCTCATTGGTTTCAAAGAATATCTTTATTTCTGCCTTCATTTCCTTATGTACCCAGTAGTCATTCAGGAGCAGGTTGTT
-CAGTTTCCATGTAGTTGAGCAGTTTTGAGTGAGATTCTTAATCTTGAGTTCTAGTTTGATTGCACTGTCATCTGAGAGAT
-AGTTTCTTATAATTTCTGTTCTTTTACATTTGCTGAGGAGAACTTTACTTCCAAGTATGTGGTCAATTTTGGAATAGGTG
-TGGTGTGGTGCTGAAAACATGTATATTCTGTTGATTTGGGGTGGAAAGTTCTGGAGATGTCTGTTAGGTCCGCTTGGTGT
-AGAGCTGAGTTCAATTCCTGGGTATGCTTTTTGACTTCCTGTCTTGTTGATCTGTCTAATGTTGACAGTGGGGTGTTAAA
-GTCTCCCATTATTAATGTGTGGGAGTCTAAGTCTCTTTGTAGGTCACTCAGGACTTGCTTTATGAATCTGCATGCTCCTG
-TATTGGGTGCATATATATTTAGGATAGTTAGCTCTTCTTGTTGAATTGATCCCTTTACCATTATGTAATGGCCTTCTTTG
-TCTCTTTTGATCTTTCTTGGTTTAAAGTCTGTTTTATCAGAGACTAGGATTACAACCCCTGCCTTTTTTTGTTTTCCATT
-TGCTTGGTAGATCTTCCTCCATCCTTTTATTTTGAACCTATGTGTGTCTCTGCACGTGAGATGAGTTTCCTGAATACAGC
-ACACTGATGGTTCTTGACTCTTTATCCAATTTGCCAGTCTGTGTCTTTTAATTGGAGCATTTAGTCCATTTACATTTAAA
-GTTAATATTGTTATGTGTGAATTTGATCCTGTCATTATGATGTTAGCTGGTTATTTTGCTCGTTAGTTAATGCAGTTTCT
-TCCTAGTCTCGACGGTGTTTACATTTTGGCATGATTTTGCAGCGGCTGGTACCAGTTGATCCTTTCCATGTTTAGTGCTT
-CCTTCAGGAGCTCTTGTAAGGCAGGCCTGGTCGTGACAAAATCTCTCAGCATTTGCTTGTCTGTAAAGTATTTTATTTCT
-CCTTTGCTTATGAAGCTTAGCTTGGCTGGATATGAAATTCTGGGTTGAAAATTCTTTTCTTTAAGAATGTTGAATATTGG
-CCCCCACTCTCTTCTGGCTTGTAGGGTTTCTGCTGAGAGATCCGCTGTTAGTCTGATGGGCTTCCCTTTGAGGGTAGCCC
-GACCTTTCTCTCTGGCTGCCCTTAACATTTTTTCCTTCATTTCAACTTTGGTGAATCTGACAATTATGTGTCTTGGAGTT
-GCTCTTCTCGAGGAGTATCTTTGTGGCGTTCTCTGTATTTTCTGAATCTGAATGTTGGCCTGCCTTGCTAGATTGGGGAA
-GTTCTCCTGGATAATGTCCTGCAGTGTTTTCCAACTTGGTTCCATTCTCCCTATCACTTTCAGGTACACCAATCAGATGT
-AGATTTGGTCTTTTCACATAGTCCCATATTTCTTGGAGGCTTTGCTCATTTCTTTTTATTCTTTTTTCTCTAAACTTCCC
-TTCTCATTTCATTTCATTCATTTCATCTTCCATCGCTGATACCCTTTCTTCCAGTTGATCGCATCGGCTCCTGAGGCTTC
-TGCATTCTTCACGTAGTTCTCGAGCCTTCGTTTTCAGCTCCATCAGCTCCTTTAAGAAATTCTCTCTATTGGTTATTCTA
-GTTATACATTCTTCTAAATTTTTTTCAAAGTTTTCAACTTTGCCTTTGGTTTGAATGTCCTGCCATAGCTCAGAGTAATT
-TGATCATCTGAAGCCTTCTCTCAGCTCGTCAAAATCATTCTCCATCCAGCTTTGTTCCGTTGCTGGTGAGGAACTGCATT
-CCTTTGGAGGAGGAGAGGCGCTCTGCTTTTTAGAGTTTCCAGTTTTTCTGTTCTGTTTTTTCCCCATCTTTGTGGTTTTA
-TCTACTTTTGGTCTTTGATGATGGTGATGTACACATGGGTTCTTGGTGTGGATGTCCTTTCTGTTTTTTAGTTTTCCTTC
-TAACAGACAGTACCCTCAGTTTCAGGTCTGTTGGAGTTTTCTAGAGGCCCATTCCCGACCCTGTTTGCCTGGGTATCAGC
-AGTGGTGTCTGCAAAACCGTGGATTTTCATGATCCGTGAATGCTGCTGTCTGATCGTTCCTCTGGAAGTTTTGTCTCAGA
-GGAGTACCTGGTCGTGTGAGGTGTCAGTCTGCCCCTGCTAGGGGGCGCCTCCCAGTTAGGCTGCTCGGGGGTCAGGGGTC
-AGGGACCCACTTGAGGAGGCAGTCTGCCCATTCTCAGATCTCCAGCTGTGTGCTGGGAGAACCACTGCTCTCCTCAAAGC
-TGTCAGACAGGGACATTTAAGTCTGCAGAGGTTACTGCTGTCTTTTTGTTTGTCTGTGTCCTGCCCCCAGAGGTGGAGCC
-TGCAGAGGCAGGCAGGCCTCCTTGAGCTGTGGTGGGCTCCACCCAGTTCGAGCTTCCAGGCTGCTTTGTTTACCTAAGAG
-AGCCTGGGCAATGGCCGGTGCCCCTCCCCCAGCCTCGCTGCTGCCTTGCAGTTTGATCTCAGACTGCTGTGTTAGCAATC
-ATCGAGACTCCATGGGCATAGGACCTTCTGAGCCAGGTGCGGGATATAATCTCGTGGTGTGCCATTTCCTAAGCCCATCA
-GAAAAGCTCAGTATTAGGGTGGCAGTGGCCCGATTTTCCAGGTGCCATCTGTCACCCCTTTCCTTGACCAGGAAAGGGAA
-CTAACTTCCTGACCCCTTGCACTTCCCGAGTGAGGCAATGCCTTGCCCTGCTTTGGCTAGTGCACAGTGCACTTCACCCA
-CTGTCCTGCACCCACTGTCTGGCACTCCCTAGTGAGATGAACCCAGTACCTCAAATGGAAATGCAGAAATCACCCATCTT
-CTGCATCGCTCATGCTGGGAGCTGTAGACCGGAGCTGTTCCTATTCGGCCATCTTGGCTCCTCCTCCCATTATTTTTTAA
-TATTTTCTGAAAATCTTCTTTAAAGAGAGAAAGCCAAATGTCACCCACTTTTTCATAAAACCTTACAGGCAAATCTATTA
-TTCTTTTCTTTTTTGAGATGGATTTTCCCTCTTGTTGCCCAAGCTGGAGTGCAATGGTGCGATCTCGGTTTACTGCAACC
-CCCTGCCTCCCAGGTTCAAGTGATTCTCCGGCCCCAGCCTCCTGAGTAGCTGGGATTAGAGGCATGCCCCACCATGCCCA
-GCTAATTTTGTGTTTTTAGTAGAGACGGGGTTTTTCCTTGTTGGTCAGGCTGGCCTTGAACTCCTGACCTCATGTGATCC
-ACCTGCCTCGGCCTCCCCAAGTGTTGAGATTACAGCTGTGAGCCACTGCCCCGGGCCATTTTTTTTTAAAGATAGCGTCT
-TGCTCTGTCACCCTCCTCACCACATTATAGCTCTGGGGGCCAAGCTGCATCACAATGGAAATCATGGAGCCACAGGAAGA
-ATCCACTTAGCTTTGCAAGATGCTGCCCAAGGGGTTGCTTGGAGTAACCAAATTAACATTTTTCATTCTGCTCAGAGCAA
-AATATATGTGACAAAACATAGCCACGAGCCACTTTGCTTAGCACCCAGTGTCAAACTGGTAAGACTCAAACTTCCTCCCA
-GATAGGCCATGCCATCTCTAAATCTTTTTAGAAGCTTCTGCATGTTAATAGGCATCCCTAGATGAGACTAATTTGGGAGC
-CATCATTTTTAAATGCACTTCAGGGCATTATTCATTTGGAATGTTACACTATAAGTTATCTTTAGTAAGATTTTGCCATT
-TCTGTAAGACTTTGCTGCTTCCCAGGCCTAATGAATTAGCCAGAAAGAACTTAGTTTTCCAGAAATTAAGGATCCTATTT
-TTACCTAATATATTGGCTTTACTCTCAGGTTCCCTTGATTGACTTAGCCAATGATTTTTTTTCCTACCTAAGCGTGTGAG
-GAAAATGAAACAAAGGGGCAGAACACAAAAATCCCCGTGAATTTCCAAAAGCCAAATTTTACAACCCTCCAATATTATCA
-TTTACTACCACTTTCCTTCTGACCCATTCAGATGTAGGAGGCCTCTAACTGGAACTGGATTCAAGCCAGTTAATTACTGG
-ATCAAATCTGATCCTGGACCCGGTCCCGTTTCTGTCATAACTTCTAAAACATCCAGCCAGTCATGGCTGGATAGCAGTTT
-GGAACAGAAATTTGCTCAGAGAAACTCAGCTCAAAACACAAATTCATGGAGCTCTGAAATCCGAGAGAGAATTTACCACG
-ATCCCCAGATGCTCTGAGAGGTCAAAGGGCACAAGTGTTACAGAATCCTGAGGCGTCACTTTTCTGCCTGAAACCTCTGG
-CTGGTGGCGCCTTTACCTGTGTTTTGCTCGGGCCCACTGGGTTCGTTCTGTCCACTTGGCTCATGCTAGTGGTCTGGATC
-CCACACCTGCCAAGGGTGAGCTGGGTACAGAGCAGTGAAGGGTGTGTGAGCAAGCGAGCATGGGATCTGGCCACTGCACA
-CAGCCAAGCATGCCAGCTGCAGTGGGGTGGGCAGCTCCAGGCACCGCCACAGGTGCCAGCTCCCTGTGAGGCTGCAGCTG
-GACCAGGCTGACTGCAAACAGCTTCCACTGTGGGTATCAGGGAATGCAGCGGTGCCTGGAAGCTTCGAGATGCAGGAACT
-GCAGAGCCCCAAATAAGGTGTCACAGCCCTGGCTTGGGGAGCTCCTAGGTCTGGGCTCCCTGAAGGGCCACAGCTCTTCT
-CTCCTTCTCTCTTCTCTTCTTCTTGCCTGCAATTTGGCAAGCAAGGGGTGCGTTTCAGCCCTGTTTATGTTACACCTCTT
-TCAGCCCTGCTAGTTGGCAGGTCCCGAGTTCTTGTCCTGAGTCCAGGAAGAATGAGGTATGTGGGCAAGTAGAAGGTGAG
-CAAGGTGAAGAGGTGCTTTATTGAGCAACAGTACAGCTCAGAGGAGACGTGCAGTGGGTAGCTCCTTTCGGCAGGCAGGT
-CATCCCAATGTCTGTTCAGCTCTCAGCAGCTGAGAGAGATGCATGGTGGTTAGCTATGCCCACAGTGCCCAGGCTTTTCG
-AGCTGAGGAGTGCCTTCAAGCCAGTGCTGAGCCACTCTTAGCCCCACCTCAACGTCCCTCCTGTGCTCATCAGTTCCCAA
-AGTGTGGAGGGGGCCGAGGTGGCAGGGGGCTGGCATGTCAGCACTGCCCTGAGCTTGCACAAACTGGGCTGGGTTGCGAC
-TGTGCCTGGGTTCAACCTCAATTTGGATCCGAAGTTGGAGTGGGCTCTGGGAGCGGAGACATGCCAGGTGGTGGGAGCAG
-GTATGACTGGGCCTACGGGGGCAGGGGGGCTTGCTGGGCCTCTGAGAGTGCAAAGATGCCCGGGTTTGCTGTCATGGGTG
-GATGGCTGCAGCTGTGCCTGGGAGGGTGGGGCTCCTGCCTGCCAATTTAGAAGGGGTGGGTCTCTCACCTGTTCCTGGCT
-CCCACTAACTTTGAGGAGTTCACAGCCCCAGCCACTCCTCCCCACTGCAGCCAGTGTCTCCGTAGCAACTGCTCCACATG
-GGCCACTGCTGCCATCATAGAGCGGTCCTTGCAGGTGCCTTTCTTGTACCTCAGCACTCCTGGGGGTCATTAGAAGCCCT
-AGCAACACTGCTCACCACACTATAGCTCCAGAGGCCCTAGCAGTCCTGCTCCCACAGATCCCACTTCTGACACCATCTAT
-TAAAAGAAAATCTTCAGCTGAATTAAATTTAAAGGAACTTAATTGAGCAATGAATGATTCACGAATCAGGCAGCCCCCAG
-AATCACAGCAGATTCAGTGAGACTCCAGCACAGCTACATGGTGGAAGATTTATAGACAATAAAGGGAACGTGATGTACAG
-AAATCTGAAGTGAGGAGTGAGGTCCAGAAGCAACTGGGTCCGTTACAGTTCTCAGCAGTGAGGTCCAGAAACAACTGGAC
-TGGTTACAGTGCTCAGCATTTGCCTTATTTGAACACAGCTGAACACTCAGTAGTGTGTGAGTGGCAGAAGTTTGGCTGTT
-GGGATTGGCCAGGACTCAGCTATAGTTACAGGTGCATACTCCAAAGTTAGGTTATCAGTCTTTCTACCTATTAAGTTAGG
-TTGCAGTTTGTCCACAGGGACTCAAATCTAGAAGTACAGAGTCCTTCCCAGGCCATATTTAGTTCACTGTAACAGTTCCT
-ATTATGACCTCACTGACAGTTCTTTTTCTCTGAATTTTCCTTTCTTCTCAACAGCTTGTCCAAATGTTCCATTGGTCCCT
-GTTCATCCCGCCCTGCAGCTCTCCTTGACTGATTCTGCCCTTTGTGGTTTGCAGTCCTGTTTCTCTACAGCTTGGACCCC
-TTCAATCTTTCCATCATAGGTTTAACTCTCTGTTGAATTCTTATTTGTAGCTACGCAAATGTTACCTTAAGCTAAAAAAA
-TTCAAAGTGAAAGCCACATCCTCCTCTCTTCCCTTATGTGTATGGTATTACTACCATGCAGCCAGTGACCCAAAATGGGA
-TTTTTTCTGGGCTTTTCTTGCTTAGATTCAGGCTCATCTGGTGTCAAGCCTTGTTACTTTTGTTTCCTTGTTCTTTTATT
-TTTAATTTTTTTTCTTTTGAGACAGAGTTTCACTCTTGTTGCCCAGGCTAGAGTGCAGTGGTGTGATCCCGGCTCACTGC
-AGCCTCCACCTCCCGGGTTCAAGCAATTCTCCTGCCTCAGCTCCTGAGTAGCTGGTATTACAGGCATTTGCCACCACGCC
-TGGCTAATTTTGTATTTTTAGTAGAGATGGGGTTTCTCTGTTTTGATCAGGGTGGTCTCGAGCTCCCGACCTCAGGTGAT
-CTGCCCACCTCGGCCTCCCAAAGTGCTGGGATTACAGGCCTGAGCCACCGTGCCTGGCCTGCTTGTTGTTTTCATCTCAT
-CCTGATTTCTGAATACAGGAGAGGAGCTGAGTTGGTGTTCACTAACAAGCACAGAAGCTTTGTTACATTTACAGTGTCAT
-TCTTGGCAAAACCTGAATGGTATGTTTGTGGGGTGATGAGGTTCAGTCCCCTGTGACCTGTGCATCTGGCCAACACTGTG
-GTGACATCCTTAGGAATCCATGGGGAGAGACAAAGCATTCAGGAGTTAGTGGGTCACGTTTGACAAGGGCCAATAAAGAA
-ATATGCAAAGACAAAAAACAAGAAGAACATTATCATATTTTATACCTTTTGTTTATATAAATTTATGTCAATGATTCTAG
-CTTATGTTAATATACAATGTATACAATATGCTAACATATACAATATATGTTTATAGTTTAAACATTTCTGTCATGTTTTC
-AGATTCTTTAAAGATTACATTACACTTCCTATTTCAGATAGCTGTTTAAAATGAGTAAGGAAAAACGGATGTGTGCATCA
-GTTCTAACTGTTTATGGACTAAAACTAGTTGATTTCTTGGTTAAGAACAAAAAGTGACAACCTAATTAACTGAAAATTTT
-AAGTAGGCAATTATGGTTTTAGCTTTAATGTAAAATATTAACTATGCTCCATTCTTGCATTTTTAACCTAATACTCAATA
-TAAATCGCCACATGCCATGTTTCAGATCAAGGTTCTACTTGTGATCTCTCATGAGTTTTTCAAGGTTTTAATTATCTGAG
-ATGTAACAATGTACCCATAACCTTACTGGCTTAAACCAGGAATTTATTCTTTTTACATGTCACAATTTTCTGGGTCAAGA
-CACTGGACAGAGCGGTGTGGGTTGGTTGCTTCATGATGTCCCTGGTCTCATCTGGAAGGACTCTAGTGGCTGGAGATGTG
-AAGCAGGCACCCAGAAGGACTCTAGTGGCTGGGGACATGGAGCAGGCACCCAGCCCTCTCTTTGTGGCCAGCACGGACTT
-CCTTCCAGTCTGGTAGCATCAGGTAGTCAGGTTTGTCTGGCTTCTCCCAGGGTGTGTGTCCAAGAGGCCCAGGCAGAAGC
-TGTAAGGTCTCTCATGATCATCCCTCAGAAGTCCCAGAGCATCTCTCCTGCCACACTGTCCAGTTGTACTCATCACTGAG
-ACCAGCCATGATTCAAGGGGGAAAGGTGATTAGATTCCACCTCTTGATGAGAAGCATAGTAGGAACCTGCAGCAGTCTTT
-AATAAACCACAGCTTGTCCTCTGGCCACAAACTATTAACGTTTCTCCCACATGCAAATTATGCTTTGCCCCTCTCAAGAG
-CCCCAGAATGGTTTTCCTTATGGCACTGGCTAGTAGCCCAACTGAATCCTGAATCAGGTTGTGGTGGCTTGTCATCTGCA
-CCCACACACACTCAGCTGCAGTGAGGACTGAATCAGGTTGTGGTGGCCTGTCATCTGACCCCCCACACACAGCCACAGTG
-GGGACTGAATCAGGTTGTTGTGAGCTATCATCTGAGCCCACAAACTTAGCCGCAGTGAGGGGACTGCTGTGAAAACAGTC
-GACATTTCCCTTTAGAAGCTTTGGTGGGAGGCAAGAGGGAAGTGCTGCCCTGCAGGCCCCGTCTAACAGTTGGTCATTCC
-CATGGGGCGCCTGTTACAGTTCTGTGATTAGTGCCCAGTCCTGGTCCCTGAAAACGGCGCCCAGTCCTGGTCCCTGAGAA
-TGGTGTTTGTGTCCTTTTACTCCTCCCTCTGGGCTTTTGTCATTCTCCATGTTCTTTTTCCTTCAGTGCCTGGGTTGCCG
-TTGACCAGCTTTCCCTGCCTTTTTCTTATGGTCAATAGGGTATTCAATGGCTTCTTTTTCATTTTTTTTCCTTTTCTTTT
-CTTTTCTTTTTTTTTACTTTGGCCTTTTGAGACAAGAAATTATTTCTTTATATTTTCTCTAAATTCTGTTTGAAAACTGA
-ACCTTCTTCTTTAGATCATGTCCCTCTCCTGTCATATTTATTCAGTGACAGTTAGGGGAGGCTGGTAGCACTTTCCATGT
-TCTTCCCAGATGTCTCCTTAGGCAGATCCCTGAGATGGTGCAGTGCCCTTTCAGTTTCCATGTTGTGGCCATAGTTTTCC
-CACAGTCCCTCAGCAAGTAACTCTCAGACCTTTTCTCCAGTTTCCAATGACATTTTCTCACCGTCCTTCAGGCCCTGACC
-AAGAGTCTTGATGCCCTTCCAGGTTGCATGAATGGTCTCCTTGAGGCCCAGTTACAGGTCAGCCTCACAGTCGTGTCACA
-TATTGTAGCTTCTGATTACCACAGCAGCTCATTTCCAGCTGCCATATTCTGTTCCAGTTATCTATTCTGAAGTAAAACAA
-CTCATTATTACTTGTTTTTTGGCTTAGAGAGTCTTGGTGGCCAGCTCATCTCACACACAGTTGCAGCCAAGCTGGATTGT
-GTGAAAGCACAGTGGGGTGGTGTGCAGGGTGGCTCACTAGTGGTTGGGAGTGGATGTTGCTGGAGGCTCACTAGTTGTTG
-GGAGTCGGTGTTGCTGGAGGCTCAGTGGGGGATGTCAATGCGTGTAGCTAGTCATGGACTGGCCTTGTGGTTTCCATCAT
-GAGGTCTCAGGGGAGTGGGATTTCCTGCCTGGTGACTGGCTTTCTCCTGGGTAAGTGTTCTGTTTTCTCAGCCTGGCTTC
-TGAAGTCCCCAAATACCAGCTTTGTCACCTTCTGTTGGCCAAATAAGTCAGTAGTCTGGTCAAGGTTTAAGGGGAATTGG
-TTCTCACAGAGAGAGGAGCAGGAAAGAATTTGTCACCTTTAGTCTACCAGAAATGAGATTTTTATAACAAGTTTATTCCA
-AATACATTCCAGTTCCCCTTGTGAATACTTTTTTGACTCACAGGGTATTTCAAAGTTTATTACTTGGTTTTCAGACATTT
-GAGGCTTTTCTGGATATCAATTTGTTGTTGGTTTCTAATTTAATTTCAAGTGTTCAGACAACATCCTTTGTATACTATTT
-CAGGCTTGAACCTTTTCTCAATCCATCGACATACAGTCTATCTTGGCACTGCCAAGTACCATTTGGGTCAGGATTTTGTC
-ATTTAGATCCGTATTTTTCCTATATTTTTATCTGGTTGTTCCGTCAGTTACTGAGAGAGCAGTATTAATTCACCAGCTAT
-AATTTTGGATTGTCAATTTCCTGCTTTTGTTCTGTTGTTTTTGATTCACATACTTTGAGGTTCTGTGTGTGTGTGTGTAG
-TTTGTGTGCACTTTGAGGCACAATTTATAATTGTAACATCATCCTCTCTGATTCTTTTATTTTTATTAAATTACCCTGTT
-TATTTCTGGTGATATATTTTGTTCTGAAGCCTCTTTCATCTAGTGTTAACATCTCTGTTGAAGCTTTTTATGATTAGTGT
-CTGGATAGCATATTTTTATGTTTAGCATCTGCATAGCATATTTTTTCTCATACTTTGTGTCTTTGTGTTTAAATTGTGTC
-TCTGTGGATGCCATATTGTTGGGTCTTGCCTTCCTCTCAGGTCTGGCAGTCTCTGTCTTAAGTAGAGTATTTGTCCACTT
-ACATTGTAACTAATCATTGCTAAGGTTGGATTTAGGTCTGCCATTTTTCTACTTATTTTCTATTTGTTTGTTTATTTTTT
-TTAAGACAGGGTCTTGTTCTGTCACCCAGTCTGTAGTGCAATGGTGCAATCTTGGCTCACTGCAACCTCTGCCTCCCAGG
-CCCAACCAATCCTCACTTGAGCCCCCTGAGTAGCTGGGACTACAAGTGCATGGCACCACACCTGGCTAATTTTTATATTT
-TTGTAGAGATAGGGTTTTGCCATGTTGCACAGGCTGGTCTTGAACTACTGAGCTCAAGCAATCTACCCACCTTGGCCTCC
-CAAAGTGTTCAGATTACAGGCATGAGCCACCATGCCTGGCCTTCGTCTGTCTTTTGATCTTCTATATATTCTTTCCTAAC
-TTCTTTTGGGTTAAATATTTCTAAATATTCCAGTTTGATTAATCTTTTGGCTTTTGGAAATAATTTTTTATAGGCTGGGC
-ATGTTGGCTTATGCTCATAATCTCAGCTCTGTGTGAGTCCAAGGGAGGTGGATTGCTTGAACCCAGGAGTTTGAGACCAG
-CCTGGGCAACATGGCAAAACCCTCTCTACAAAAAACCAAACCAAAATTTAGCCTGACATCTTGGTGTGCACCTGTAGTCC
-TAACTATTTGGGAGGCTGAGGTGGGAGGGTTGCTTGAGCCTGGGAGGTTGAGGCTGCAATGAGCTGTGATCATGCCATTC
-CACTCCTGCCAGGGCAACAGAGTAAGACCGTGTGTCAAAAAAGATCATTTTTTATAAATAATTTATAATTTCGAATTTTG
-GTAACAAACACATACCTTAAAATTTACCATCATAACCAGTTGTAAGTATACAGTTTTGTAGAGTTAAGAATATTTACATT
-GTTGTGTAGCAGATTTCTAGATTTTTTTTTATCTTAGAAAACTCTATACCCATTCAACAACTATTAATTTCCCCTTCCTT
-CCACCTCCTGGCAAGTACTATTCTACTTTGTGTTTCTAAAAATTTGGCTTATATACCTAGGGTTATATAATATTTGTTTT
-TTAAGTAGGTTCCATGTTATGTGCAGATGTGTCAGGATTTTCTTCCTTTCTATGGCTGAATAATATTTCTTCATATATAT
-ATATTTTCTCTATATATATATATATGTATATTCTTTTGTTTATCCATCTATTCCTGGATGGACGTTTTGGTTTCTTCCAC
-CTCGTGGCTATGTAATGCTCCTGTGAACACAGGTGTACACATATCTGTTTGAGGTCCTGCTACTAGTTATTCTGTCTCTG
-TAGAAGTTGGATGGCTGGATCATATGGTCATTTTATTTTATTTTTTTGAGGAGCCAGTTAATATTTCCACCAACAGTGTT
-CAAGTGTTTCAGTTTCACCTGCACTTGTTACTTTCTGTTGGGTTTGAAGTGATGTCCCATTGTGGTTTCTATTTGCATTT
-CTCTAATGATTAGTGATGTTACACATCTTCTCATATATCTCATGTATCTGTTGGCTATTTGTATATCATCTTTGCATCTT
-TGGATGAATGTTCTTTGTCCATTTTTTAATCACTTTATTTTGTTGTGTTGTAGCTGGGTTTTTTGGTCATGAGCATTCAT
-TTATCTCACAGTTCATTCTTGTTACTTGGGCCAGGGTCATGATCATTCATTATCTCTCAGTTCATCCTCATTACGTTGGG
-CAAACAGTCATGCTGCAGGGTATAGATTATGTTATTCTGTTACTTTCAGGTAGAATTCGGGTCTAGGTTCTAATTGTTTC
-TAAGTTTAGATTCTGAATGAGAATCAGCAGAGGTAGACCACTGCTGCTGAGGCCTGGGGATTGCTGGGAAAAAGGCAGGA
-AACAGATATTGACCTGACCATGGAGGGTTTATGTTTCACGGCTCCCATCTGGGTACCCAAGGAACCTACATGTAGCTCGT
-GTGTGGAGAGCCTACATTGCCCACTCAAAGCAATTGAGGATGGAACAGTCTTGGGGCTGGAGCTCATTATTTGGAATGAT
-AACCACATCTGCACAGAGAGGACCTGATAAGATGTTGTCCTTCCATGTATATCTGGGAATCCTGTGTAGGGTCTCTCTGT
-AAGGACAGGGGCAGTGTTGGCTCCTTGGCCTCTAGTTAGCTTCACAAGTAGTCTAGTAAAGGCTTTGCCAACTTGTCACC
-ATCTGTGGATATTCTGGTCAGCTCTTGTTTTCACCCTACTGACTTCTTCAGACACTAGGCTTTTGCTTTAGACCATTCAT
-GGTTTTCTTCCTCTTCAAATCAGTAATCAATAAATCGCCTTCAAGTCAATAAATTTCCACTCCTTTAGGAAACCCTGATC
-TTCTGGTCACACCAAGGTTTAATTAACTGGTTTGATTGTTTTTCTGTTTTCTTGGATTTTTTTTCCTTCTTCCTGGGGGT
-TTCTAGTAATTCTAGTTTGATGTCTCACTTTCTCCATTTTTTATTTCTTAGTTTTCTTCTGTGATTATTTTCACTGCAGC
-TGCAGGGCCTAATCCTGGGTTGGCAGAGAACTAGCACTTACTCTGCCCTAATTGGAATCCAGGAGAGATAGCAGGTTCCC
-TAGTGTGAAAATGTGTTTGCTCCTCTCTGCTTCTGGTAGTCTCTCTGTAGGAGTTCTTTACGCATTCTGAATGTTCACTT
-CTTATGAGATACATGATGTGCAACTATAGGTTGAATGTCTCTGATCCAAAAATCTGAAATCCCAAATGCTCCAAAGTCTG
-AAACTTTTTGAGTGCCAACATGACACTCAAAGGAAATGCTTATTGGAGCATCTCAGACTCAGGTGTTTGAATTTGAGATC
-CTCAACCAGTAAGAATAGTGCAAATATTACAAAATCTGAAACACATCCCAAGCATTTCAAATAAGGGACACTCAACTGGT
-ATTTTTTTTAATTTTACAGTTTGCCTTTTACCCTGTTGGTTGTGACCTTTGAGGTACAGAAGTTTTTAGGTTTGATATAT
-TTTTGCTTTTACTGCCTGAGCTTTTAATGTCATATCCTAAAAATTATTGACAAATTCATCGTCATAAAGCATTTTCCAAA
-TTTGTTTTCCCTAGGAGTTTGATAGTTCTAGTTTTACATTTAGGTTTATAATTCACTTTGAATTGATTTTAACGTGGTGT
-AAGGTAAGAGTCCAACTTCATTGTTTTGCATGTAGTTATACAATTTTCCCATCATCACTTGTTGAAGAAACTGTGCTTTT
-CCATTGAGTGGTCTTGGCATCCTTCTGGAAGATCATCGGACCATATATGCCAGGGTTGGTTTCTGAGGTCTCTGTTGTGT
-TGGTCCATAAGTGTGTCAAGAGTGTCTTTATGCCATGACCACATTTTTTCTTTTTGGCTTATTGCAGTTTTGTAATTGCT
-TTGAGACGTTTAATTTTGTTCTGTTTCAAGATTGATTTGCCTATTCATGGGCCCTGGAGATTCCATATGAGTTTTAGGAT
-AGGTTTTTCTGTTTATCAAAAATGTCATTGGAATCTTTATAAGGATTGTATTGAATCTAGGTCACTTCGAGTAGTGTTGA
-CATCATTCCAAGATGAAATCATCTAATTTGCAAACCCAGCTTTTCTTTTCATTTATTTGTGTTTAATTTCTTTTAACAGT
-GTTTTGTAGTTTTCTGTGTTCAAATCTTTTGCCCTCTTGGTTAAGCTTATTTCTAATTTTTATAATGCTGTTGTAAATAT
-AATTTTTTTTTTTTGAGATGGAGTCTTGCTCTGTCTCCCAGGCTGGAGTGCAGTGGCACTATCTCAGGTCACTGCAACCT
-GCACCTTCCTTATTCAAGCGATTCTCCAACCTCAGCCTCTCAAGTACCTGGGATCACAGGTGCGCGCCACCATGCCCAGC
-TAACTTTTTGGTATTTTTAGTAGAGACAGTGTTTCTCCATGTTGACCAGGCTATTCTTGAACTTGTGACCTCAGGTGATC
-TGCCCACCTCGGCCTCCCAAACTGCTGGGATTGCAGGCATGAACCACTGCACCCAGCCAAATGTCATTCTTTTTAAAAAT
-TTCTTTTCTTTTGTTTTCTCTTTCTTTTCTTTTCTTTCTCTCTCTTTCTTTCCTTTCTTTCTTTTTTTTTGAGACGGTGT
-CTCACTCTGTTTCCTAAGCTGGAGCACAGTGGCACAGTCTCAGCTGACTGCAACCTCCACCTTCCAAGTTCAAGCAATTC
-TCCTGCCTCAGCCTCCCAAGTAGCTGGGACTACAGGTGTCTGCCACTATGCCCAGCTAATTTTTGTATTTTTAATAGCGA
-TAGAGTTTTACTATTTATATTAGAGATGGGGTTGACCCAGCTGGTCACGAACTCCTGACCTCAGGTGGTCCACCCGCCTT
-GGCCTTCCAAAGTGCTGGGATTACAACTGTGAGCCACTGCACCTGGCCTCTTTTTAAAATTTTATTTGCAGATTGTTCAT
-TGTTAGTTTATAGAAATGGAACTGACTTGTGTGTGTTACTGTATCCTGAAACTTTGTTGAATTTCATTATTCTACCAGTA
-TTTTGTGGAATTTCAGGATTTTTACACATTACATCATGTTGTCTGTGAACAAAATTTTGTACTTTTTCCTTTCCAATTTG
-CATGCTTTTTATTACTTTCTCTTGCCTAATTATTCTGAGTAGAAATTCCAGTACTGTGGTGAATAGAAGTGGCAGGAAGA
-GATGTTGCTATCTTATTCCTGATCCTAGAGGAAAAGATTTTAGTTTTTCACCATTCAGTATGATGTTAGCTGTGAGCTTT
-TCATGTATAATCTTTATTTACTGAGGAGTTTCCATATATTACTAATTCTTTGAGTGTTTTTATTACAAAAGGTGTTCATC
-TGGCTCTGGAACCAGATAAATGTTGACCTGATAGAGTGGATTGGAATGTCCCCTTCTGGTTTTTGAACATTTTTGGAATA
-TTTTACAAAGGGCTGGCATTAATTCTTCTTGAAATGTTTGGTAAAATTTTCCAGTGAAGTTATCTGGACCTGGAATTTTC
-TTTTTTGGGGGGTTTTTGATTACTGGTTGAATCTTCTTACTAGTTACAGGTCTCTTTGGATTTTTTATTTCTCCATGATG
-CAGTATGGTGGTTTGTGTTTCTAGGAATTTATAAATTTATTCTAGGTTGCCCAGTTCTGTGGCATATGGTTGCTCACATT
-AGTCTCTTGTAATCTTTTTCATTTCTGTGGAATCTGTTGTACTGTCACCTCTTTTATTTATGATTTTAGTATTTGAGATT
-TCTCTTTTTTTCTTAATATAGCTGTGAGTTTTAAAATTTTTATTGATCTTTAAAAAAACAAACTCAGTGGTTTTTTTTTT
-CCTTTTTTTCTGGTCTTATTCTGCTTATCTCTGTTCTAATCTGTTATTTTCTTCCTTTTGCTTGGTTTGTCATTAGTTTT
-TTTTTTTTTCCCTTTAGGTGTAATGTTAGGTTATTGATTTGAGATCTTTCTTCTTTTTAATTTGATCACCTGCAGCTATA
-AGCTTCCCTTTAGCATGGCTTTGAGATCTTTCTTCTTTTTAATTTAAGCATCTGTGGCTGTAAGCTTCCCTTTAGCACTG
-CCTTTGTTGCCTCCTCCTGAGTTTGGGTATGTCATGGTTTTGTTTTCATTTGCTTAAACATTTTTTTTTGTCCTATTGTA
-ATATAATTGTGTTGTTTTTAATAGAGGTAATTAATGAAACACATAATGAATTGTGCTTCTGTTTTTATAATATTTTAAGC
-ATTCTTAACTCAGAAATGTAAATTTTAGAAAAAAATTCCAGGCCAGGCACAGTGGCTCACACCTGTAGTCCCAGCACTTG
-AGGAGGCCGAGGTGGGAGGATCATCTGAGGTCAGGAGTTGGAGACCAGCCTGGCCAACATGGTGAAACCCTGTCTTTACT
-AAAAATAGAAAAAAAATATATAAAAGCTAGCTGAGTGTCATGGCGGGTGCCTGTAATCCCAGCTACTCTGGAGGCTGAGG
-CAGGAGAATCACTTGAATCTGGGAGGCGGAGGTTGCAGTGAGCTGAGATTGCACCACTGCACTCCAGCCTGGGTGACAGA
-ATGAGTCCATCTCAAAAAAAAAAGAAAAAAGAAAAAATTTGAGACATATTTATTTGTATTTCAATTTAGAAACTATGATC
-TCCTAAGTGTATTGACACAGCAACCTGACATAAAGATAAAGAATAATAAGTATATAACAAAACGGAAACTTGCAAATACC
-TTTTTTAATTAATTTTTAATTATATATATTTAAAAATTGCCGGGTGCAGTGGCTTACACCTGTAATCCCAGCACTTTGGG
-AGGCTGAGGTGGGCAGATCACATGAGGTCAGGAGTTTGAGACCAGCCTGGCCAACATGGTGAAACCTCATCTCTATTAAA
-AATCAAAAAATTAGCCAGGCGTGATAGCATGCATCTGTAGTCCCAGCTACTCAGGAGACTGAGGCAGCAGAATTGCTTGA
-ACATGGGAGGCAGAGGTTGCAGTGAGCCAAGATAGTGCCACTGCACTCCAGCCTTGGTGACAGAGTGAGACTCTGACTCA
-AAAAAAAATTGTCTGGGCACGGTGGCTCACACCTGTAATCGCAGCATTTTGGGAAGCTGAGGCAGGCAGATCACGTTAGG
-AGATCGAGACCATCCGGGCTAACACGGTGAAATGCCATCTCTACTAAAAATACAAAAAATTAGCCGGACGTGGTGGCGGG
-TGCCTGTAGTTCCAGATACTCCGGAAGTTGAGGCAGGAGAATGGTGTGAACCTGGGAGGTGGAGCTTGCAGTGAGCTGAG
-ATTGCACCACTGGACTCCAGCCTGGGTGACAGAGCGAGACTCTGTCTCAAATAAAATAAAATAAAATAAAACTAAGGTGT
-GGTTGACATACAAAAATTACACATATTTAATATATACCTTTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTTAC
-GGAGGTTTTACTCTTGTTGCCCAGGCTGGAGTGCAGTGACACGATCTCAGCTAGCTGCAACCTCCACCTCCCGGGTTCAA
-GCAATTCTCCTGCCTCAGCCTCCTGAGTAGCTGGGATCGCAGGCGTGCGCCCCGACACCCGGCTAATTTTTGTATTTTTT
-TAGTACAGACAGGGTTTCACCATGTTGGCCAGGCTGGTCTCGAACTCCTGACCTCAGATGATCCACCTGCCTTTGTCTCC
-CAAAGTGCTGGGATTACAGGCGTGTGACACCGAATATATACATCTTAATGAGTTTAGAGATAAGTATTCGCCCCAGGACT
-CATCACAACAAATAATGCCGTAAACTTGACCATCACTCCCCATATATTTCTCATTCTGACCCTTTTTAAAAAATGAGACC
-GGGAGTGGTGGCTCACGCCTGTAATCCCAGCATTTTGCGAGGCCGAGGCGGGTGGATCACGAGGTCAGGAGATCAAGACC
-ATCCTGGCTAACACAGTGAAACCCCGTTTCTACTAAAAATACAGAAAATTAGCTGGGCGTGATGGCGGGCACCTGTAGTC
-CCAGCTACTTGGGAGACTGAGGCAGGATAGTGGTATGAACTCGGGAGGCAGAGCTTGCAGTGAGCTGAGATCGTGCCACT
-GCACTCCAGCCTGGGCAACAGAGTGAGACTCCGTCTCAAAAAAAAAAATGAGATGACCATTTCACCTAAAATATACCCTC
-TTAAGTTTTATTTTAAGTGTACAATACAGGACGGCCATGCATCAGAGATATATGTGGGTTTGGTTCCAGACCACTGCAAT
-AAAGTGAGTTATACAATTTCTTTTGGTTTTCCAGTGCATGTAAAAGTATGTTTATACTGTGCTGTATAAAGTGTGCAATA
-GCATATGTCTACAAAGTGTTCACACTTTAATTTACAAATACTTTATTGTTAACAAGTGCTAACAGTCATCTGAGCCTTCA
-GAAAGCTGCAATCTTTTTTTGTGTGTGTGACAGGGTTTTACTCTGTGGCTCAGGCTAGAGTAATTGCAGTCTCAACCTCA
-TGCTCAATCAAACCCCCACCTCAGACTCCTGACTAGCTGGAACTACAGATACATGCCACCATGACCAGCTAATTTTTGTA
-TTTTTTTTTTTTTGTAGAGATGGGGTTTTGCCATGTTGCCTTGACTTCCTGGGCTCAAGCAATCTACCCACCTTGGCCTC
-CCAAGGTGTTGGGATGACAGGTGTGAGCCACTGCACCTGGCCAAGTTTCAGTCTTCTTGCTGATGGAGGGTCTTGCCTTA
-ATGTAAGGTGGTGGTTGCTGAGCGTTGGGGTGGCTGTGGCAATTTCTTAAAATAAGACACCATTGAAGTTTGCTGTGTCA
-ATTGACTCTCCCTTTCACAAAAGAATTATCTGTAGCATACGATGTTGTTTGATAGCTTTTTACCCACAGTAGAACTTTCA
-AATTGGATTCAATCCTGTCAAACCTTCGTACAGCTGTACCAACTAAGTTTATGTATTATTGTAAATCATTGTGTCAATCC
-TGTCAAGCCCTCCTTCTGCTGTACCAACTAAGTTTATTCTAAATCTGTTGTCATCTCAACATTGTTTACACTGTCTTCAC
-CACGAGTAGATTTCATCTCAAGAAACCACTTTCTTTGCTCATCCTTGGAAGCAACTCATCCACTCACGTTTTCTCCGGAG
-GCTGCTGCAGTCTCGCCAGATCTTCAGGCTCTGTCTCTGATTCTAGTGCTCTTGTTATTTCCACCATATCTGCAGTTACC
-TCCTCCACAGAAGTCGTGAACCCCTGTGTCATCTGTGAGGGTTGGAATAATCTTCCCAACTTCTCTCTCTCTCTCTCTCT
-CTTTTTTTTTTTTTGAGATGAAGTCTTGCCTGGGCTGGAGTGCAGTGATGCGATCCCAGCTCACTGCAACCTCCACCTCC
-CAGGTTCAAGCAATTCTGCCTCAGCCTCCCAAGTGTTTGGGATTACAGTCACCCCCGACCAGGCCCAGCTAATTTTTTGT
-GTGTTTTTAGTACAGACAGGATTTCACTATGTTGGCCAGGCTGGTCTCAAATTCCTGACCTCGTGACCCACGTGCCTTGG
-CCTGCCAACATGCTGGGATTACAAGTGTGAGCCACCACGCCCGGCCCCAACTTCTCCTAATGTTGCTATTTTGATCTTAT
-TTTTTAAATCATGAATGTTCTCAATGACATCTAGAATGGTGAATCCTTTCCAGTAGGTTTTCAATTATTTTGCCCAGATC
-CATCAAAGGAATCACTTTCTAGAGAAGTTATAGCTTTATGAAATATATTTTTAAGTGATAAGACTTGAAAGTTGAAATTA
-TTCTTTGATCCAAGGGCACCAGAATGAATGTTGGGTTAGTAGGCATGAAAACAATATTCAGCTCTTTGTACATCTCTGTA
-AAAGCCCTTGAGTACCAGGGGCATTGTCAGTGAGCGGTAATACTTTGAAAGGAATCTTATTTCTTGAGCAGTAGGTGTCA
-ACAGTGGGCTTCAGATATTCAGTAAACCATATTTGTAAGCCGATAGTCTGTCATCCAGGCTTTGTTCCCATTTGTAGAGT
-ACAGACAGAGCTGTGTTTTATCATAATTCTTCAGGGCCCTTGGATTTTCAGAATAGTAAATCATCATTGGTTTCAAGTTA
-ACATCACCAACTGCATTAGCCCTTAACAAAAGAGTCAGCATGTCCTTTGAAGCCTTAAAGCCAGGCATCAACTCCTCTCT
-AGCTGGGAACATCCTAGATGGCATCTCCTTCTAGTAGAAGGCTGTTTTGTCTCCATTGCAAATCTATTTAGTGTTGCCAT
-CTTAATCAGTTATCTTCTAGATAGCTTTCTGCAGCTTTTCCATCAGTACTTGCTGCTTTATCTTGCGCTTTTATGTTATG
-GAGATGACTTTTTTCCTTAAACCTCAAGAAACAAGCTCTTCTAGCTTCAGACTTTCCTTCTGCAGCTGCCTCACCACTCT
-AAGTCTTCATAGAATTGAAGAGAGGCCGGGTGCGGTGGCTGTCACACCTGTAATCCTAGCACTTTGGGAGGCCGAGGCGG
-GCAGATCACCTGAGGTCGGGAGTTCGACACCAGTCTGACCAATGTGGAGAAACCCCGTCTCTACTAAAAATACAAAAAAA
-TAGCCAGGTGTGGTGGTGCTTGCCTGTAATCCCAGCTACTTGGGATGCTGAGGCAGGAGAATGGCTTGAACTTGGGAGGC
-AGAGGTTGCGATGAGCCAAGATCACGCCATTGCACTCCAGCTTGGGCAAGAAGAATGAAACTCTGTCTCAAAAAAAAAGA
-AAAAAAAGTAAAAAGAGAGTTAGGCTTAGGCTTAATGGAATGTTTTTTGTTTTTTTTTCATCTTCTATCTAGACCAATTA
-AACTTTCTTCATAACAGCAGCAAGATTGTTTAGCTTTTTATCATTCATGTGTTCACTGGAGCAGTACTTTAAATTTCTTT
-CCAGAACACTTCGTTTGCATTCACAACTTGGCTAAGTGTTTGTTGCATGAGGTCTAGCTACTGGCCTGTCTTGCTTACAG
-CATGCCTTCCTCACTAAGCTTAATTATTTCTTCCTTTTGGTTTAAAGTGACAGACATGCAACTCTTCTTTCATGAACATA
-TAGAGGCTATTGTAGGGTTATTAATTGGCCACATTTTAATATTAATAAAAAGAAGCCTGAGAAAAAGAGAAAGAGAAATG
-GCCCGTTGGTTGGGCAGTCAGAACAAACGCATTTGTCAATTGTTTGCTGTCTTATCCTGGTGTGATTTGTGGTTCCCAAA
-ACAATGACAACAGTAGCATTAAAGATTACTGATTACAGATCACCACAACAGATTCAATAATAAAAATCTTAAAATACTGT
-GAGAATGACCGAAATGTGACACAGAGACGTGAAGTGAGCACGTGCTGTAGGAACAATGGTGCCAGTGAGACCTGCTTATT
-GCAGGGTGGCCACAAACCTTCAATACGTAAAACACATGGTCACAAAACACAATAAAGCAAAGTGCAGTGAAACAAGATGT
-GTCTGTCTTTTGATAGACTCTGACAATCTCTACCTTTGAATTGGTACATTCATACCATTAACATTCAAAGTGATTATTGA
-TATCATTGGATTAATATCTACTATATTTGTTACTGTTTTCTATTCATTCTCCTCAGTCTTCATTCTTTTGTCTACCACTC
-TTTTTCTGCCTTTTGCAGTTTTCATTGATGATTTTAGATGACTCCATTTTCCCTGTCTTTCTTAGTACATACTTCTCTTT
-TTAAAACTTTTTTTTAACTAGTTGCCACAGAATTTGCAATATACATTTACAACCAATTCAAGTCCACTTTCAAATAACAC
-TATCCAACTATCCCACAAATAAGACTACCTGCTTAACAAACAAAACACCTAATTCCTCAGTAACATTTACAACCAATTCA
-AGTCCACTTTCAAATAACACTATCCCACTATCCCACAAATAAGACTACCTGCTTAACAAAGAACACACCTAATTCCTCAA
-TATACATTTACAACCAATTCAAGTCCACTTTCAGATAACACTATCCCACTTCACGGGTGACTACCTGCTTAACAAAGAAA
-ACACCTGATTCCTCCCTCCCATCCTTCCATTCCATTCCTTGTATTATTGTTCCTTATTTCACTTGTGTATAAGCATGCAT
-AATCTATCTGTGTGTATTTATTATTATCTACAAACTTATTGGTCAGATCAATTATGAATAAATACATGTTTTTATTGTAC
-CACAATGCCTCCCTACCATCCTTCCATTCCATTCCTTGTATTAGTGTTACTCATTTCAATTGTATATAAGCATACATAAT
-ATATCTGTATTTGTTATTGTCTATGATCTTCTTGGTCAGATCAATTAAGAATAAATACATAGGTTTTTATTGTACCACAA
-TTCTTTCTTTAATGCTCTTTTTAAAAAAATGTTGATCCAGGTTTCAGTTATATATCTTTTGTTTCCCTAAAGAATTTCAT
-TTAACATTTCTTGCAAGACAGGTCTCCTGGCAACAAGTTTCTTGAATTTTTATTTTTCTGAGGAAGGCCTTAATTCTCCT
-TCACTTTTGAAGGGTGGTTTCAGTGGGTACAGAAACTTAGGTTGGTGGGTTTTTTCTGTCAACATTTTGAATTTTTCATT
-TCACTGTCTTCTTACTTTCACAGTTTCTGAAATGTTGAATGCAGTTCTTATCTTTGTGTCTCTGTAGGTAAGGTGTTTTC
-TGCCCCACCTCTGGTTTCTTTCAGAGTTTTCCTTTATCTTTTATTTCATATAGTTTGAAAATTATATGTCCAAGTGTAGG
-TTGTTGGTATTTATTCTGCCTGGTGTTCTCAGAGCTTCCTGGATCTTTGGTTTGGTGTCTGACATTAATACTGGAAGTTC
-TCAGACATGGTTGTTGCAGAACTTTCTTCTATTTCTTCTCCTCTTGGTATTCTCATTACTGTTTCACCTTTTGTAGTTGT
-CCCACAGTCTTGAATATCATCTTCTGTTCTTTTCAGTGTTTCTTTTCTTTAGTTTTCGAAGTTTCTGATGATAAATCCTC
-AAGCTCAGAGATTTTTACTCAGCTGAGTCCAGTCTACTAATAAGCCATCAGAGGTATTCTTCAGTTATTTACCACGTTTT
-TCATCACTACATTATGTTGAAAGTTCTTACGATGTCTGTCTTTCTCATTACATTACCCATCTACACTTGAATACTGTCTA
-CTTCATTCATTAGGCCCTTAGCATATTCTCCAGAGGTTTAAAAAAAAATTCCAAGATCATATCTTTGTCTGCTTCTGAAG
-CTTGCTCTGTTGACACAAATTGTATTTTTTTCTTTTTTTGGATTTTAGTAAGCCTTGCAATTTTTTCCCTTTATTCTGAT
-GCATGAAGTACCCACTAAAAGTGACTGTTGTTAGTATAGCTTCAGTAATGCGGTGATGAGGTGACAGGGCAGGTGATGCT
-CTCTTAGTCTCTTTAGGCTACTATAACAAAATACTTCAGACTGAGTAATTCATAAACAACAGAGATTATTGTTCACAGAT
-CTGGAGGCTGGAAAGTACAAGACTAAAGGGCCAGGATATTTGGTGTTTGGTGAAGGTCAAACATTCAGACACTCTCAACG
-ACTATAGCGACAGCAGCAGTCTTCAGGAATCCTATGTGAGGGACAAACACTCAGAAGCCAGCTGGAGTGTTCTAGAATCC
-TATGTGAGGGCCAAACATTCAGACCCCAGCAGTAGTGTTGTGGAATCCTATGTGAGGGACAAACATTCAGACCACGGGAG
-CAGTGTTCTGGAATTCTATGTGAAGGACAAACATTAAGACTCTCATAGCAGTGTCCTGGAATCATATGTGAGGGACAACC
-ATTCAGACACCAGCAGAAGTGTTCTGGAATCCTAGGTGTGGGAAAAACATTCAGAACCTAGTAGCAGTGTTCTGGAATCC
-TATGTGAGGGACATACATTCAGACCACGGCAGCAGTGTTCTGGAATGGTATGTGAAGGACAAACATTCAGACCCTTGTAG
-CAGTGTTCCAGAATTTTATGTGAGGGACAAACATTCAGACCACAGCAGCAGTGTTCTGGAATCCTATATGACGGACCAAC
-GTGCAGACCCTTGCAACAGTGTTCTGGAATACTAGGTGAGGGAAAAATATTCACACCCTTGTAGCAGTGTTCTGGAATTC
-TATGTGACTGACAAACATTCAGACTCCAGCAGCAGTGTTCTGTAATCCTATGTGAGGGACAAACATGCAGACCCCAAGAG
-CAGTGTTCTGAAATCCTATGTTAAGGGAAACATTGAGACCCCAGCATGAATGTTCTGGAATCCTATGTGAGTGACAAACA
-TTCAGACCACGGCAGGAGTGTTCTGGAATCCTATGTGAGGAACAAACATTCAGACCACAGCAGGAGTGTTCTGGAATCCT
-ATATGAGGTATAAGCATTCAGACCCTCATAGCAGTGTTCTGGAATCCTATGTGAGGGAGAAGCATTCAGAGCACAGCAGG
diff --git a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai b/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai
deleted file mode 100644
index c5e2e02..0000000
--- a/src/test/resources/htsjdk/samtools/cram/human_g1k_v37.20.21.10M-10M200k.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-20 200000 4 80 81
-21 200000 202508 80 81
diff --git a/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2 b/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2
deleted file mode 100644
index a16c0e0..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/io/bzip2-test.bz2 and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.cram b/src/test/resources/htsjdk/samtools/cram/test.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.cram.bai b/src/test/resources/htsjdk/samtools/cram/test.cram.bai
deleted file mode 100644
index fcb31fc..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test.dict b/src/test/resources/htsjdk/samtools/cram/test.dict
deleted file mode 100644
index dfb98d6..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD VN:1.4 SO:unsorted
- at SQ SN:Sheila LN:20 M5:7ddd8a4b4f2c1dec43476a738b1a9b72 UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/test.fa b/src/test/resources/htsjdk/samtools/cram/test.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/test.fa.fai b/src/test/resources/htsjdk/samtools/cram/test.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila 20 8 20 21
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.cram b/src/test/resources/htsjdk/samtools/cram/test2.cram
deleted file mode 100644
index 59f11d2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/test2.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.dict b/src/test/resources/htsjdk/samtools/cram/test2.dict
deleted file mode 100644
index dfb98d6..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.dict
+++ /dev/null
@@ -1,2 +0,0 @@
- at HD VN:1.4 SO:unsorted
- at SQ SN:Sheila LN:20 M5:7ddd8a4b4f2c1dec43476a738b1a9b72 UR:file:/Users/edwardk/Documents/htsjdk/testdata/htsjdk/samtools/cram/auxf.fa
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.fa b/src/test/resources/htsjdk/samtools/cram/test2.fa
deleted file mode 100644
index 11d25dd..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.fa
+++ /dev/null
@@ -1,2 +0,0 @@
->Sheila
-GCTAGCTCAGAAAAAAAAAA
diff --git a/src/test/resources/htsjdk/samtools/cram/test2.fa.fai b/src/test/resources/htsjdk/samtools/cram/test2.fa.fai
deleted file mode 100644
index f3cdedb..0000000
--- a/src/test/resources/htsjdk/samtools/cram/test2.fa.fai
+++ /dev/null
@@ -1 +0,0 @@
-Sheila 20 8 20 21
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram
deleted file mode 100644
index ec69511..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#blank.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram
deleted file mode 100644
index 0600333..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#blank.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram
deleted file mode 100644
index 29992ea..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram
deleted file mode 100644
index 2b01737..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam b/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam
deleted file mode 100644
index 93fb8cf..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#large_aux.sam
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ SN:xx LN:20
-a1 16 xx 1 1 10M * 0 0 AAAAAAAAAA * aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1 ah:i:1 ai:i:1 aj:i:1 ak:i:1 al:i:1 am:i:1 an:i:1 ao:i:1 ap:i:1 aq:i:1 ar:i:1 as:i:1 at:i:1 au:i:1 av:i:1 aw:i:1 ax:i:1 ay:i:1 az:i:1 ba:i:1 bb:i:1 bc:i:1 bd:i:1 be:i:1 bf:i:1 bg:i:1 bh:i:1 bi:i:1 bj:i:1 bk:i:1 bl:i:1 bm:i:1 bn:i:1 bo:i:1 bp:i:1 bq:i:1 br:i:1 bs:i:1 bt:i:1 bu:i:1 bv:i:1 bw:i:1 bx:i:1 by:i:1 bz:i:1 ca:i:1 cb:i:1 cc:i:1 cd:i:1 ce:i:1 cf:i:1 cg:i:1 ch:i:1 ci:i:1 cj:i:1 ck:i:1 cl:i:1 cm:i:1 c [...]
-a2 16 xx 1 1 10M * 0 0 AAAAAAAAAA * aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1 ah:i:1 ai:i:1 aj:i:1 ak:i:1 al:i:1 am:i:1 an:i:1 ao:i:1 ap:i:1 aq:i:1 ar:i:1 as:i:1 at:i:1 au:i:1 av:i:1 aw:i:1 ax:i:1 ay:i:1 az:i:1 ba:i:1 bb:i:1 bc:i:1 bd:i:1 be:i:1 bf:i:1 bg:i:1 bh:i:1 bi:i:1 bj:i:1 bk:i:1 bl:i:1 bm:i:1 bn:i:1 bo:i:1 bp:i:1 bq:i:1 br:i:1 bs:i:1 bt:i:1 bu:i:1 bv:i:1 bw:i:1 bx:i:1 by:i:1 bz:i:1 ca:i:1 cb:i:1 cc:i:1 cd:i:1 ce:i:1 cf:i:1 cg:i:1 ch:i:1 ci:i:1 cj:i:1 ck:i:1 cl:i:1 cm:i:1 c [...]
-b1 16 xx 1 1 10M * 0 0 AAAAAAAAAA * ZZ:Z:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""####################################################################################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [...]
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram
deleted file mode 100644
index 3d1a6ee..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram
deleted file mode 100644
index 73b1570..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam b/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam
deleted file mode 100644
index 9e338ed..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#large_aux2.sam
+++ /dev/null
@@ -1,11 +0,0 @@
- at SQ SN:xx LN:20
-a1 0 xx 1 1 1M * 0 0 A # aa:i:1
-a2 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1
-a3 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1
-a4 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1
-a5 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1
-a6 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1
-a7 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1
-a8 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1 ah:i:1
-a9 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1 ah:i:1 ai:i:1
-aA 0 xx 1 1 1M * 0 0 A # aa:i:1 ab:i:1 ac:i:1 ad:i:1 ae:i:1 af:i:1 ag:i:1 ah:i:1 ai:i:1 aj:i:1
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram
deleted file mode 100644
index e25b0f2..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#minimal.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram
deleted file mode 100644
index fda0032..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#minimal.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam b/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam
deleted file mode 100644
index eb72140..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#minimal.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ SN:xx LN:20
- at SQ SN:yy LN:20
-a0 16 xx 4 1 10H * 0 0 * *
-a1 16 xx 4 1 5H0M5H * 0 0 * *
-a2 16 xx 4 1 5H0I10M0D5H * 0 0 * *
-A0 16 yy 4 1 0H * 0 0 * *
-A1 16 yy 4 1 0I * 0 0 * *
-A2 16 yy 4 1 0D * 0 0 * *
-A3 16 yy 4 1 0M * 0 0 * *
-A4 16 yy 4 1 0P * 0 0 * *
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram
deleted file mode 100644
index 246ebd8..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#pair.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram
deleted file mode 100644
index 89c1c2f..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#pair.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#pair.sam b/src/test/resources/htsjdk/samtools/cram/xx#pair.sam
deleted file mode 100644
index aa8c77b..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#pair.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ SN:xx LN:20
-a1 99 xx 1 1 10M = 11 20 AAAAAAAAAA **********
-b1 99 xx 1 1 10M = 11 20 AAAAAAAAAA **********
-c1 99 xx 1 1 10M = 11 20 AAAAAAAAAA **********
-a1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
-b1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
-c1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram
deleted file mode 100644
index 618a43d..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#rg.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram
deleted file mode 100644
index 8b0148b..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#rg.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#rg.sam b/src/test/resources/htsjdk/samtools/cram/xx#rg.sam
deleted file mode 100644
index 2d7efbc..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#rg.sam
+++ /dev/null
@@ -1,13 +0,0 @@
- at HD VN:1.4 SO:coordinate
- at SQ SN:xx LN:20 AS:? SP:? UR:? M5:bbf4de6d8497a119dda6e074521643dc
- at RG ID:x1 SM:x1
- at RG ID:x2 SM:x2 LB:x PG:foo:bar PI:1111
- at PG ID:emacs PN:emacs VN:23.1.1
- at CO also test
- at CO other headers
-a1 16 xx 1 1 10M * 0 0 AAAAAAAAAA ********** RG:Z:x1
-b1 16 xx 1 1 10M * 0 0 AAAAAAAAAA ********** RG:Z:x2
-c1 16 xx 1 1 10M * 0 0 AAAAAAAAAA **********
-a2 16 xx 11 1 10M * 0 0 TTTTTTTTTT ********** RG:Z:x1
-b2 16 xx 11 1 10M * 0 0 TTTTTTTTTT ********** RG:Z:x2
-c2 16 xx 11 1 10M * 0 0 TTTTTTTTTT **********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram
deleted file mode 100644
index ecf3396..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram
deleted file mode 100644
index ec1b380..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram
deleted file mode 100644
index 558e4dd..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram
deleted file mode 100644
index add9c38..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#tlen2.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram
deleted file mode 100644
index 8a1d9cf..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#triplet.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram
deleted file mode 100644
index 515827e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#triplet.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam b/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam
deleted file mode 100644
index 1255725..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#triplet.sam
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ SN:xx LN:20
- at SQ SN:yy LN:20
-a1 67 xx 1 1 10M = 6 20 AAAAAAAAAA **********
-a1 35 xx 6 1 10M = 11 -20 AAAAATTTTT **********
-a1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
-a1 67 yy 1 1 10M = 6 15 AAAAAAAAAA **********
-a1 3 yy 6 1 10M = 1 -15 AAAAATTTTT **********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram
deleted file mode 100644
index 9c55dcf..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.2.1.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram
deleted file mode 100644
index e161bca..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.3.0.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam b/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam
deleted file mode 100644
index 05887a3..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx#unsorted.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ SN:xx LN:20
- at SQ SN:yy LN:20
-b1 147 yy 11 1 10M = 1 -20 TTTTTTTTTT **********
-a1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
-a1 99 xx 1 1 10M = 11 20 AAAAAAAAAA **********
-b1 99 yy 1 1 10M = 11 20 AAAAAAAAAA **********
-c1 99 xx 1 1 10M = 11 20 AAAAAAAAAA **********
-c1 147 xx 11 1 10M = 1 -20 TTTTTTTTTT **********
diff --git a/src/test/resources/htsjdk/samtools/cram/xx.fa b/src/test/resources/htsjdk/samtools/cram/xx.fa
deleted file mode 100644
index a233f7d..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx.fa
+++ /dev/null
@@ -1,5 +0,0 @@
->xx
-AAAAAAAAAATTTTTTTTTT
->yy
-AAAAAAAAAATTTTTTTTTT
-
diff --git a/src/test/resources/htsjdk/samtools/cram/xx.fa.fai b/src/test/resources/htsjdk/samtools/cram/xx.fa.fai
deleted file mode 100644
index 97b1a3b..0000000
--- a/src/test/resources/htsjdk/samtools/cram/xx.fa.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-xx 20 4 20 21
-yy 20 29 20 21
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.cram b/src/test/resources/htsjdk/samtools/cram_query_sorted.cram
deleted file mode 100644
index 2397cd6..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_query_sorted.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta b/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta
deleted file mode 100644
index 9561151..0000000
--- a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta
+++ /dev/null
@@ -1,40 +0,0 @@
->chr1
-TTCATGCTGAAGCCCTCTTACGATCGTACAGATGCAAATATTAACAAACC
-TTTAAGGGCAAAAAAAAAACAATACAATAATAGAGTACGTTAACACTCCA
-A
->chr2
-CATCTCTACAAGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATAC
-TTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTTGACACCTTT
-T
->chr3
-CGTATGCGCTTTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAAT
-AAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGGAATGTGCAA
-A
->chr4
-CGTGATACCAACTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATAT
-TTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGGTTTGCAGCC
-C
->chr5
-NTCTCATTTAAAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTT
-CATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCAAGACGTTATC
-T
->chr6
-NAATTGTTCTTAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACA
-ATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACCAGTGTCGAT
-C
->chr7
-CAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAAGG
-TTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCCGA
-AACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCA
-GCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCATA
-CACAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAA
-GGTTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCC
-GAAACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGG
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-TACA
->chr8
-CACATCGTGAATCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGA
-GAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCCTAAGATGAC
-CCCAGGTTCAAATGTGCAGCCCCTTTTGAGAGATTTTTTTTTTGGGCTGG
-AAAAAAGACACAGCTATTCCTAAGATGACAAGATCAGAAAAAAAGTCAAG
-CA
diff --git a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai b/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai
deleted file mode 100644
index d5e1a06..0000000
--- a/src/test/resources/htsjdk/samtools/cram_query_sorted.fasta.fai
+++ /dev/null
@@ -1,8 +0,0 @@
-chr1 101 6 50 51
-chr2 101 116 50 51
-chr3 101 226 50 51
-chr4 101 336 50 51
-chr5 101 446 50 51
-chr6 101 556 50 51
-chr7 404 666 50 51
-chr8 202 1085 50 51
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen.fasta b/src/test/resources/htsjdk/samtools/cram_tlen.fasta
deleted file mode 100644
index 01b8f8a..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen.fasta
+++ /dev/null
@@ -1,41 +0,0 @@
->chr1
-TTCATGCTGAAGCCCTCTTACGATCGTACAGATGCAAATATTAACAAACC
-TTTAAGGGCAAAAAAAAAACAATACAATAATAGAGTACGTTAACACTCCA
-A
->chr2
-CATCTCTACAAGCGCGTCCTACCAGACGCGCTTCCGATCTGAGAGCATAC
-TTTTCATTGGATTCCAGCACAACTCCATTTTTGATCCACTTGACACCTTT
-T
->chr3
-CGTATGCGCTTTTTATGTCGCCCACAGTGCCTAGTATAGCCCCTGCTAAT
-AAAAAGAGATGAATACGTTTACTTAAAAAACTGAAACTAGGAATGTGCAA
-A
->chr4
-CGTGATACCAACTCATGTTCACAGCCAAAGCCTGAAGCTGTCTATTATAT
-TTCTCAACCATAAACTTTTGCCTCAGGCATCCGCAGAATGGTTTGCAGCC
-C
->chr5
-NTCTCATTTAAAAATGGTTATAAAAACATTTATGCTGAAAAGGTGAAGTT
-CATTAATGAACAGGCTGACTGTCTCACTATCGCGTTCGCAAGACGTTATC
-T
->chr6
-NAATTGTTCTTAGTTTCTCGGTTTATGTGCTCTTCCAGGTGGGTAACACA
-ATAATGGCCTTCCAGATCGTAAGAGCGACGTGTGTTGCACCAGTGTCGAT
-C
->chr7
-CAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAAGG
-TTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCCGA
-AACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCA
-GCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCATA
-CACAACAGAAGGGGGGATCTGTGTTTGTGTTTCGGATTTCCTGCTGAAAA
-GGTTTTCGGGTCCCCCCCCCATCCCGATTTCCTTCCGCAGCTTACCTCCC
-GAAACGCGGCATCCCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGG
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-CAGCGCGTCGTGTAGGTCACTATGGTACATCTTGTCGTGCGGCCAGAGCA
-TACA
->chr8
-CACATCGTGAATCTTACAATCTGCGGTTTCAGATGTGGAGCGATGTGTGA
-GAGATTGAGCAACTGATCTGAAAAGCAGACACAGCTATTCCTAAGATGAC
-CCCAGGTTCAAATGTGCAGCCCCTTTTGAGAGATTTTTTTTTTGGGCTGG
-AAAAAAGACACAGCTATTCCTAAGATGACAAGATCAGAAAAAAAGTCAAG
-CA
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai b/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai
deleted file mode 100644
index 4f7bd29..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen.fasta.fai
+++ /dev/null
@@ -1,8 +0,0 @@
-chr1 101 6 50 51
-chr2 101 116 50 51
-chr3 101 226 50 51
-chr4 101 336 50 51
-chr5 101 446 50 51
-chr6 101 556 50 51
-chr7 454 666 50 51
-chr8 202 1136 50 51
diff --git a/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam b/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam
deleted file mode 100644
index 0d1947e..0000000
--- a/src/test/resources/htsjdk/samtools/cram_tlen_reads.sorted.sam
+++ /dev/null
@@ -1,19 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at SQ SN:chr4 LN:101
- at SQ SN:chr5 LN:101
- at SQ SN:chr6 LN:101
- at SQ SN:chr7 LN:454
- at SQ SN:chr8 LN:202
- at RG ID:0 SM:Hi,Mom! PL:ILLUMINA
- at PG ID:1 VN:2.0 PN:Hey!
-both_reads_align_clip_marked 83 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_present_only_first_aligns 89 chr7 1 255 101M * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-read_2_too_many_gaps 83 chr7 1 255 101M = 302 201 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_align_clip_adapter 147 chr7 16 255 101M = 21 -96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_align_clip_adapter 99 chr7 21 255 101M = 16 96 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_align_clip_marked 163 chr7 302 255 101M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-read_2_too_many_gaps 163 chr7 302 255 10M1D10M5I76M = 1 -201 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-both_reads_present_only_first_aligns 165 * 0 0 * chr7 1 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram b/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram
deleted file mode 100644
index 5609d5e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai b/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai
deleted file mode 100644
index db53e08..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_bai_index.cram.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram b/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram
deleted file mode 100644
index 5609d5e..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai b/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai
deleted file mode 100644
index 309f06f..0000000
Binary files a/src/test/resources/htsjdk/samtools/cram_with_crai_index.cram.crai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty.bai b/src/test/resources/htsjdk/samtools/empty.bai
deleted file mode 100755
index 237f2e5..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty.bam b/src/test/resources/htsjdk/samtools/empty.bam
deleted file mode 100644
index c8de04f..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai b/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai
deleted file mode 100755
index 237f2e5..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam b/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam
deleted file mode 100644
index eeb875c..0000000
Binary files a/src/test/resources/htsjdk/samtools/empty_no_empty_gzip_block.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.dict b/src/test/resources/htsjdk/samtools/hg19mini.dict
deleted file mode 100644
index 8c844a8..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.dict
+++ /dev/null
@@ -1,5 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:1 LN:16000 M5:8c0c38e352d8f3309eabe4845456f274 UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ SN:2 LN:16000 M5:5f8388fe3fb34aa38375ae6cf5e45b89 UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ SN:3 LN:16000 M5:94de808a3a2203dbb02434a47bd8184f UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
- at SQ SN:4 LN:16000 M5:7d397ee919e379328d8f52c57a54c778 UR:file:///Users/cmn/projects/htsjdk/testdata/htsjdk/samtools/hg19mini.fasta
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.fasta b/src/test/resources/htsjdk/samtools/hg19mini.fasta
deleted file mode 100644
index 038dd84..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.fasta
+++ /dev/null
@@ -1,804 +0,0 @@
->1 dna:chromosome chromosome:GRCh37:1:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTA
-ACCCTAACCCTAACCCTAACCCTAACCCAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAAC
-CCTAACCCTAACCCTAACCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCC
-TAACCCTAAACCCTAAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCAACCCCAACCCCAACCCCAACCCCAACCC
-CAACCCTAACCCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCC
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTCGCGGTACCCTC
-AGCCGGCCCGCCCGCCCGGGTCTGACCTGAGGAGAACTGTGCTCCGCCTTCAGAGTACCACCGAAATCTGTGCAGAGGAC
-AACGCAGCTCCGCCCTCGCGGTGCTCTCCGGGTCTGTGCTGAGGAGAACGCAACTCCGCCGTTGCAAAGGCGCGCCGCGC
-CGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGC
-GCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGA
-CACATGCTAGCGCGTCGGGGTGGAGGCGTGGCGCAGGCGCAGAGAGGCGCGCCGCGCCGGCGCAGGCGCAGAGACACATG
-CTACCGCGTCCAGGGGTGGAGGCGTGGCGCAGGCGCAGAGAGGCGCACCGCGCCGGCGCAGGCGCAGAGACACATGCTAG
-CGCGTCCAGGGGTGGAGGCGTGGCGCAGGCGCAGAGACGCAAGCCTACGGGCGGGGGTTGGGGGGGCGTGTGTTGCAGGA
-GCAAAGTCGCACGGCGCCGGGCTGGGGCGGGGGGAGGGTGGCGCCGTGCACGCGCAGAAACTCACGTCACGGTGGCGCGG
-CGCAGAGACGGGTAGAACCTCAGTAATCCGAAAAGCCGGGATCGACCGCCCCTTGCTTGCAGCCGGGCACTACAGGACCC
-GCTTGCTCACGGTGCTGTGCCAGGGCGCCCCCTGCTGGCGACTAGGGCAACTGCAGGGCTCTCTTGCTTAGAGTGGTGGC
-CAGCGCCCCCTGCTGGCGCCGGGGCACTGCAGGGCCCTCTTGCTTACTGTATAGTGGTGGCACGCCGCCTGCTGGCAGCT
-AGGGACATTGCAGGGTCCTCTTGCTCAAGGTGTAGTGGCAGCACGCCCACCTGCTGGCAGCTGGGGACACTGCCGGGCCC
-TCTTGCTCCAACAGTACTGGCGGATTATAGGGAAACACCCGGAGCATATGCTGTTTGGTCTCAGTAGACTCCTAAATATG
-GGATTCCTGGGTTTAAAAGTAAAAAATAAATATGTTTAATTTGTGAACTGATTACCATCAGAATTGTACTGTTCTGTATC
-CCACCAGCAATGTCTAGGAATGCCTGTTTCTCCACAAAGTGTTTACTTTTGGATTTTTGCCAGTCTAACAGGTGAAGCCC
-TGGAGATTCTTATTAGTGATTTGGGCTGGGGCCTGGCCATGTGTATTTTTTTAAATTTCCACTGATGATTTTGCTGCATG
-GCCGGTGTTGAGAATGACTGCGCAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCA
-CCGGGTATCATTCACCATTTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTAT
-TTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTT
-CATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTG
-GAGAGGAGCCATGCCTAGAGTGGGATGGGCCATTGTTCATCTTCTGGCCCCTGTTGTCTGCATGTAACTTAATACCACAA
-CCAGGCATAGGGGAAAGATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTT
-GTGCTCATCTCCTTGGCTGTGATACGTGGCCGGCCCTCGCTCCAGCAGCTGGACCCCTACCTGCCGTCTGCTGCCATCGG
-AGCCCAAAGCCGGGCTGTGACTGCTCAGACCAGCCGGCTGGAGGGAGGGGCTCAGCAGGTCTGGCTTTGGCCCTGGGAGA
-GCAGGTGGAAGATCAGGCAGGCCATCGCTGCCACAGAACCCAGTGGATTGGCCTAGGTGGGATCTCTGAGCTCAACAAGC
-CCTCTCTGGGTGGTAGGTGCAGAGACGGGAGGGGCAGAGCCGCAGGCACAGCCAAGAGGGCTGAAGAAATGGTAGAACGG
-AGCAGCTGGTGATGTGTGGGCCCACCGGCCCCAGGCTCCTGTCTCCCCCCAGGTGTGTGGTGATGCCAGGCATGCCCTTC
-CCCAGCATCAGGTCTCCAGAGCTGCAGAAGACGACGGCCGACTTGGATCACACTCTTGTGAGTGTCCCCAGTGTTGCAGA
-GGTGAGAGGAGAGTAGACAGTGAGTGGGAGTGGCGTCGCCCCTAGGGCTCTACGGGGCCGGCGTCTCCTGTCTCCTGGAG
-AGGCTTCGATGCCCCTCCACACCCTCTTGATCTTCCCTGTGATGTCATCTGGAGCCCTGCTGCTTGCGGTGGCCTATAAA
-GCCTCCTAGTCTGGCTCCAAGGCCTGGCAGAGTCTTTCCCAGGGAAAGCTACAAGCAGCAAACAGTCTGCATGGGTCATC
-CCCTTCACTCCCAGCTCAGAGCCCAGGCCAGGGGCCCCCAAGAAAGGCTCTGGTGGAGAACCTGTGCATGAAGGCTGTCA
-ACCAGTCCATAGGCAAGCCTGGCTGCCTCCAGCTGGGTCGACAGACAGGGGCTGGAGAAGGGGAGAAGAGGAAAGTGAGG
-TTGCCTGCCCTGTCTCCTACCTGAGGCTGAGGAAGGAGAAGGGGATGCACTGTTGGGGAGGCAGCTGTAACTCAAAGCCT
-TAGCCTCTGTTCCCACGAAGGCAGGGCCATCAGGCACCAAAGGGATTCTGCCAGCATAGTGCTCCTGGACCAGTGATACA
-CCCGGCACCCTGTCCTGGACACGCTGTTGGCCTGGATCTGAGCCCTGGTGGAGGTCAAAGCCACCTTTGGTTCTGCCATT
-GCTGCTGTGTGGAAGTTCACTCCTGCCTTTTCCTTTCCCTAGAGCCTCCACCACCCCGAGATCACATTTCTCACTGCCTT
-TTGTCTGCCCAGTTTCACCAGAAGTAGGCCTCTTCCTGACAGGCAGCTGCACCACTGCCTGGCGCTGTGCCCTTCCTTTG
-CTCTGCCCGCTGGAGACGGTGTTTGTCATGGGCCTGGTCTGCAGGGATCCTGCTACAAAGGTGAAACCCAGGAGAGTGTG
-GAGTCCAGAGTGTTGCCAGGACCCAGGCACAGGCATTAGTGCCCGTTGGAGAAAACAGGGGAATCCCGAAGAAATGGTGG
-GTCCTGGCCATCCGTGAGATCTTCCCAGGGCAGCTCCCCTCTGTGGAATCCAATCTGTCTTCCATCCTGCGTGGCCGAGG
-GCCAGGCTTCTCACTGGGCCTCTGCAGGAGGCTGCCATTTGTCCTGCCCACCTTCTTAGAAGCGAGACGGAGCAGACCCA
-TCTGCTACTGCCCTTTCTATAATAACTAAAGTTAGCTGCCCTGGACTATTCACCCCCTAGTCTCAATTTAAGAAGATCCC
-CATGGCCACAGGGCCCCTGCCTGGGGGCTTGTCACCTCCCCCACCTTCTTCCTGAGTCATTCCTGCAGCCTTGCTCCCTA
-ACCTGCCCCACAGCCTTGCCTGGATTTCTATCTCCCTGGCTTGGTGCCAGTTCCTCCAAGTCGATGGCACCTCCCTCCCT
-CTCAACCACTTGAGCAAACTCCAAGACATCTTCTACCCCAACACCAGCAATTGTGCCAAGGGCCATTAGGCTCTCAGCAT
-GACTATTTTTAGAGACCCCGTGTCTGTCACTGAAACCTTTTTTGTGGGAGACTATTCCTCCCATCTGCAACAGCTGCCCC
-TGCTGACTGCCCTTCTCTCCTCCCTCTCATCCCAGAGAAACAGGTCAGCTGGGAGCTTCTGCCCCCACTGCCTAGGGACC
-AACAGGGGCAGGAGGCAGTCACTGACCCCGAGACGTTTGCATCCTGCACAGCTAGAGATCCTTTATTAAAAGCACACTGT
-TGGTTTCTGCTCAGTTCTTTATTGATTGGTGTGCCGTTTTCTCTGGAAGCCTCTTAAGAACACAGTGGCGCAGGCTGGGT
-GGAGCCGTCCCCCCATGGAGCACAGGCAGACAGAAGTCCCCGCCCCAGCTGTGTGGCCTCAAGCCAGCCTTCCGCTCCTT
-GAAGCTGGTCTCCACACAGTGCTGGTTCCGTCACCCCCTCCCAAGGAAGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCC
-ATGTCAGAGCAACGGCCCAAGTCTGGGTCTGGGGGGGAAGGTGTCATGGAGCCCCCTACGATTCCCAGTCGTCCTCGTCC
-TCCTCTGCCTGTGGCTGCTGCGGTGGCGGCAGAGGAGGGATGGAGTCTGACACGCGGGCAAAGGCTCCTCCGGGCCCCTC
-ACCAGCCCCAGGTCCTTTCCCAGAGATGCCTGGAGGGAAAAGGCTGAGTGAGGGTGGTTGGTGGGAAACCCTGGTTCCCC
-CAGCCCCCGGAGACTTAAATACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGGCAGCGGCCCT
-GCCTCCTACCCTTGCGCCTCATGACCAGCTTGTTGAAGAGATCCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACT
-GCAACGGGAAAGCCACAGACTGGGGTGAAGAGTTCAGTCACATGCGACCGGTGACTCCCTGTCCCCACCCCCATGACACT
-CCCCAGCCCTCCAAGGCCACTGTGTTTCCCAGTTAGCTCAGAGCCTCAGTCGATCCCTGACCCAGCACCGGGCACTGATG
-AGACAGCGGCTGTTTGAGGAGCCACCTCCCAGCCACCTCGGGGCCAGGGCCAGGGTGTGCAGCACCACTGTACAATGGGG
-AAACTGGCCCAGAGAGGTGAGGCAGCTTGCCTGGGGTCACAGAGCAAGGCAAAAGCAGCGCTGGGTACAAGCTCAAAACC
-ATAGTGCCCAGGGCACTGCCGCTGCAGGCGCAGGCATCGCATCACACCAGTGTCTGCGTTCACAGCAGGCATCATCAGTA
-GCCTCCAGAGGCCTCAGGTCCAGTCTCTAAAAATATCTCAGGAGGCTGCAGTGGCTGACCATTGCCTTGGACCGCTCTTG
-GCAGTCGAAGAAGATTCTCCTGTCAGTTTGAGCTGGGTGAGCTTAGAGAGGAAAGCTCCACTATGGCTCCCAAACCAGGA
-AGGAGCCATAGCCCAGGCAGGAGGGCTGAGGACCTCTGGTGGCGGCCCAGGGCTTCCAGCATGTGCCCTAGGGGAAGCAG
-GGGCCAGCTGGCAAGAGCAGGGGGTGGGCAGAAAGCACCCGGTGGACTCAGGGCTGGAGGGGAGGAGGCGATCTTGCCCA
-AGGCCCTCCGACTGCAAGCTCCAGGGCCCGCTCACCTTGCTCCTGCTCCTTCTGCTGCTGCTTCTCCAGCTTTCGCTCCT
-TCATGCTGCGCAGCTTGGCCTTGCCGATGCCCCCAGCTTGGCGGATGGACTCTAGCAGAGTGGCCAGCCACCGGAGGGGT
-CAACCACTTCCCTGGGAGCTCCCTGGACTGGAGCCGGGAGGTGGGGAACAGGGCAAGGAGGAAAGGCTGCTCAGGCAGGG
->2 dna:chromosome chromosome:GRCh37:2:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-CGTATCCCACACACCACACCCACACACCACACCCACACACACCCACACCCACACCCACACACACCACACCCACACACCAC
-ACCCACACCCACACACCACACCCACACCACACCCACACACCACACACCACACCCACACCCACACACACCACACCCACACA
-CCACACCCACACACACCCTAACCCTAACCCCTAACCCCTAACCCTAACCCTACCCGAACCCTAACCCTAACCCTAACCCC
-TAACCCTAACCCCTAACCCTAACCCTAACCGTAACCCTAACCCTTTACCCTAACCCGAACCCCTAACCCCTAACCCCTAA
-CCCTTAACCCTAACCCTTAACCCTGACCCTGACCCTGACCGTGACCCTGACCCTAACCCGAACCCGAACCCGAACCCCGA
-ACCCCGAACCCCGAACCCCAACCCCAACCCCAACCCCAACCCTAACCCCTCACCCTCACCCTCGACCCCCGACCCCCGAC
-CCCCGACCCCCACCCCGAACCCGACCCCGACCCCGACCCAAACCCTAACCCTAAAACCCTAACCCTAGCCCTAGCCCTAG
-CCCTAGCCCTAACCCCTAACCCCTAACCCTAAGCCGAAGCCTAACTCGTGTCTGACTTTGAGTATTCAGTGCTGCAAACA
-GGAAGTATTTTATTCACCGTCGATGCGGCCCCGAGGGGTCCCAAAGCGAGGCAGTGCCCCCAAACTCTGTCCTGAGGAGA
-ATGCTGCTTCGCCTTTACGGTGTCCACCGGGTGTGTGCTCAGCAAAACGCAGCTCCGCCTTCGCGGTGCCCGTGGCCCAC
-CCGCCCGGGTCTGTGGTGAAGAGAACGCAGCTCCTAGTCGCAAAGGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCG
-CGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGG
-CGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGC
-AGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCAGAGAGGCGCACCGCGCCCGCG
-CAGGCGCAGAGAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGC
-GCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGCGCACCGCGCCCGCGCAGGCGCACACAGGC
-GCACCGCGCCCGCGCAGGCGCACAGAGGGTCGCTGGGCAGGGGTTGGGGGTCGTACTGCAGGTGCACAGCTGCATAAGCG
-CACAGTCGCAAGCCGCCAGGCGCGGAGCGTGGGGGTGGCGGGGTGCAGGCGCAGAGACGGACGTCCCCGGGGGCGCGGCA
-CAGAGACAGGTGGAACCTCAATAATCCGAAAAGCCGGGCTCGGGAACCCCCTGCTTGCAACCGGGCACTACAGGATCCGC
-TTGCCCACGGTGCTCTGCCAGTGCGCCCCTTGCTGGCCACTAGGGCAACTGCAGGGCTATCTTGCTTACAGTGGTGTCCA
-GCGCCCTCTGCTGGCGTCGGAGCATTGCAGGGCTCTCTTGCTCGCAGTGTAGTGGCGGCACGCCGCCTGCTGGCAGCTAG
-GGACATTGCAGAGCCCTCTTGCTCACAGTGTAGTGGCAGCACGCCCGCCTCCTGGCAGCTAGGGACAGTGCCAGGCCCTC
-TTGCTCCAAGTGTAGTGGCAGCTGGCTCCCCCGCTGGCAGCTGGGGACACTGACGGGCCCTCTTGCTTGCAGTATAGTCG
-TCGCACGCCTTCTGGCCGCTGGCGGCAGTACAGGATCCTCTTGCTCACAGTGTAGGGCCCTCTTGCTCCCGGTGTGACGG
-CTGGCGTCCCCTACTGGCCGCCTCCTGCACCAATTAAAGTCGGAGCACCGGTTACGCCCCATCACTTCTGTAAATTCAAA
-CTGAAACGGAGCTATTAGTGGGGAGAGCTGATGTCCCAGTTCTTGTTTAACTTGGAAGAAAGATTTTCACCAAGAGGCAG
-TACAAAGATGACAGATAACTTCATTGAAAAGAAATACAGTGTAAACACCTTACTGTAGAAAAATAGGGAGGACAGGGCTG
-ATCGTGCATGAAAACAGCCTAAGAGTCTTGTGCAGGGAAGTTACTCTAACTGTAACTTACAACAACTTAGTAGATTATAC
-TTTTGTAAACAGAAGTGAAGCATTTATCTTTTTTCTTGCTTGATTATTTACATAATCAAGCAAAATCTAACAAAACAATA
-ATATTTTAACAATAATATTTTTAAAACAATAATAGTCTTACTTTGATTATGATCAAAAATGATGGTTACTACAGAGAGAA
-TTTTTATGTTTCAATGGAAAAGTATAACATGGCCAGGCATGGTTGCACATGCCTATAATTACAGCACTTTGGGAGGCCAG
-GAGTTCAACATCAGCCTGGGCAACATGGTGAAACCACGTCTCTACCAAAAATACAAAAATTAGATGGGCATGGTGGCATG
-TGCCTGTAGTCCCAGGTAATCAGGAGGCTGAGGAGGGAGGATCGTTTGCACCCGGGAAGTAGAGGTTGCAGTGAGCTGAG
-ATTGCACCTTTGCACTCCAGCCTAGGCGACAGAGCCAGATCCTGTCTCAAAAAAAATTTTTTTAAAGGAAAACTACAGCC
-ATTGTGGGTTATCAGATTCTAGTCTTGTTTCTTGTTTCTGGGCTATTTTTACCTCTTTGTAAACTGCATCCTGCCATCTG
-ATGAATTTTGTCCCACAATGATACTTGGGGAACAAGAAGCCAATTATTGTCTCTCCTACTAATGTATCTATTGTCAGTTA
-ATTTGAAGGTCTCCAACCCTGGAACAAAGTTAGAAGAGGAAGGTTCTGCTCCCCAAAATGCATAACCAAATTGTGGTACA
-TTCATGTAATGGAACACTATTTAGCCATAGAAACGAACAAGCTATCAACTCACACAAAGACATGAGTGAATCTTGCATGC
-ACATTGCTAAGTGGAAGAAGACAGTCTGAGGAGGATACACACAGTGTGACCTCATTTAATGAGACACTGGAGAAGGCAAA
-CTACACAGATGGGAAGCCATTGGCTCCATGGGGTGGGGGTTTGAAGCATTCCATATGATACTTTAATAGTGGGATATCTG
-CCACAATGCATTTGTCAAAATATGCAGAATTTTACAGCCATATGGTTAGAGCAAACTCTATTCAAATTAAATAAAATTAC
-TCAGGATGTGGAGTATCCCAGGACAGAATACATCATGTGAAAAAGCATTTATGCTACAAATTACTATGGTAATTATGCTA
-CAAATTTATGGTACCATAAATTACCATAGTAATTTGTAGCATAAATTTGTACTATGGTACAAATTACATGGGAGAGTGAA
-GGTGGGTTAAAACATTCATATTAAAGAACTTCCACTCAGATTGCAAGAAAAGAGAGAGGAATGGAGATGGTAGCACAAGT
-CCCTACAATAAAAGTAGATGTTTTGAGATCAGTTCTATTTGTTCTGACAAAAATTAAAGACAGAAACCAAAGTTTAGCCT
-GAGGCAACAATTAGTTGGGGAATAAGCCAGAGGCATATATGGCATAGACACATTTAAACATTTCTCTCATATTAATACAA
-ATACTAAAATGACATATCAATTGATTCCAAATAAAACAAATATTTAAAACATTTAATGAATAAACACTGGGGTCTACAGT
-AGTAGTTAAAGGAGATCTCACAAACAGGTTTGGTTTTTGAAGGTTAGAAATGATGGTCTAGAGAATTCATTTCATTCCAG
-AGACAGAAAGAGGAATATCTTGGGTTCCTTCAGGAATACATCTGGCTTTGCCTCATCTTTGTGTGTTTGAACTATGCATA
-CGGCAGAAGAAAACATGGGGGTTTCAGAGTTTTTTTTTTTTTTGAGACAGAGTCTTGCTCTGTTGCCCAGGCTGGAGTGC
-CGTGGTGTTATCTCGCCTCACTGCAACCTCTGCCTTCTGGGTTCACACCATTCTCCTGCCTCAGCCTCCGGAGTAGCTGG
-GACTACAGGTGCACCACACCTGGCTACTTTTTCTGTATTTTTTAGTAGAGATGGGGTTTCACCATGTTAGCCAGAATGGT
-CTAGTTCTCCTGACCTTATGATCCAACCGCCTCAGCCGCCAAGAATGATGGGATTACAGGGGTGAACCACCACGCCCGGC
-TAAGGATTTCACAGATTTAAGGTGCTAAAATCACTGGGTTCTCTAAGAAGCCTGGGATTCTTCTGCTGGAAAAATAAGTT
-TGTTGAGAAAAATGAGTTGGAGGAGGTTGTTATTGAAGTGAAGCAGAATTGTTTTTACTAATCTGCTTATTACCCACTCT
-GAAGTGTGGAAACAAATTTTTCATGCACAAGGTCATCTTACTGTTACTGGAATGCAGTGGAAAGAGAACAGATTAGTTTT
-TCTCTCTCAGAACACAACCACTAGAAACGTCCTATGTCAGATGAGATATTGCCCAGTTATTTTCAAAAGACTGAAAAATC
-CTGGATGTAAATGTTTGCTGCAAAATAAATACATGCTAGAAACAGAAGCATCTGGGTCACAGCTATATTAGAGCTACCTG
-TGTTCCCCTGTTACTGAGATTAAAACAAAAATGTCCAATAAAAATCATTCACAGTGTGGGAGAGGGGAAGTTGAAGGATG
-GAAAGGCCAGGCATAAAAAGATTTCAGAATTTCAGTCCATAAGGAAGTTGCTTTGTGCATTGTCTGTTGCTGTGTGCAAG
-GTGAAGGCTGGGGCAAGAAAACGTGCAGTAACAAGGGCTCCTTTGTCCATCTCACCTCTCTAGATACCAAGTTTCAGACA
-TGTTGCATTTTAATTGAAAAGTTGATATAACTTTTTTTAAAAGAATACTTGCAGTGCTTGAAGTGTAAAAAGCTGCTGTG
-ACAAAAAAAAAAGCAGGGAAAGGGATTTTTTTTAAAAAAGCAAACAGCAACAATAAAAAACCCACAAACAACAAATAACA
-AACAAAAAAACAGAGGAAGAAGTCGAAACACCCTGGGCTGAGACTATTTCCAGGAAGGGGCTACGAAAGGCAGTTGGAAA
-TTCCATTTTCTTTGCAACTGTGGGTTTTCTGGCCTGCTTCCTTTCTAAAGTATATTACTTTCTTTTTGGTTCATGAAGTT
-ATCCCTTTGTGTCTTCTGGAACAGCTATGTATTTTCTTTATCTATCATCTAGCTACCTGCCTATCATCTATCTGTCTTTT
-CTGCCTTTTGCTATCAAAAGCTTGGGTCAAGCAGGATAGAATTCCAGTGTATGTTCACTCTACCATTTAAAACAAGAGCT
-CTTGTAGGCATTCTTCATCACATCACAAACCTGAGCTTTCTAAAACAGGGTGTGGCAAACTACCATGCATGGGCCATGTC
-TGACACAGTCTGCATTTGTAAGTAAAGTTGTATTGGGACAAAGCCACATAGATGTGTTATATAACATCTCTGGCTACTTT
-CATAGTACAATGGAAGAGCTGAGTCATTGAGACAGAGACCACATGGCTTGGAAAACTTAAAATATTTAACATTTTGCCCT
-TTGCAGAAAATACTTGCTAACTCTTGTTTTAAAAGATCTTTGTTTAGAATGCTACCTGTTGCCTTCTGGGTAGAATCACA
-ACTATATACCACAATAGACACAACTTGAACCCTGCTTCTATATCCAGCCTCATCTATTATTTCCTCTCCTTCTTATTTTC
-CTTCTGGCCGTGCTGATGGATTGTCAGCTTCCCAGATGTGCGAGAATCTCTCCTCCCTTCCCCACATTCTCATGCTCTCC
-CTCTGCCTCTGGAGAACTACCTGCCCCATCTCTCATGATAAATCCTTTCTTCATTCTTTATGTTGCAGCCCCTTTGCTCC
-TTCCTTAAGGATGTCTATCTGGCTCTATTTTGGGTGACATGCTCCTTCTGCATCTCCCAGAGCCAGCCTGTGTGTGTCAG
->3 dna:chromosome chromosome:GRCh37:3:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
->4 dna:chromosome chromosome:GRCh37:4:1:16000:1
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTTAACCCTTAACCCTAACCCTAACCCTAA
-CCCTAACCCTAACCCTAACCCTAACCCTAACCCTACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCC
-TAACGCTAACCCTAACCCTAACCCTAACCCTAACCCTCATTATTCTCGGCTGCAAAGAGGAAGGATCTTTACCGTGGATG
-TGGCCCCCAGTTGTCCCAAAATGAAGCAGTGCCCCCAACGTCTGTGGAGAGGCATGCGCTGCTCCACCTTCGGGATGTCC
-CCCGCGTCTGTGCTGAGCAGAATGCAGCTCCGTTATCGCGTTCCCCCCGAAGTCTCTGCAGAGGAAAACGGAGCTCCTCC
-TTCGCGATGCTCTCCAGGTCTGCGCTGAGGAGAACGCAGCTCCGCCCTCGCAAAGGCATAGCGCCATCGCAGGCGCAGAA
-AAAAACGTCGGTGCAGCGCAGGCGCAGAGAAAAACGACGGCGCGTCCCTGGGGGGCGCGGCGCAGGCCCAGAGAGGCATG
-CCACCGTTGCGCCGGGGCGTGGGCGCGGCGCAGACGCAGAGACGCACGCCGGCGCAGCGCCGGGATGGGAGCGCGGCCCA
-GGCGCAGACACGGACGGCAGCGTGGCGCCTGGCCGGAGGCGCGACGCAGGCCCAGACACACACGGCGGCGCGGCGCCATG
-ATGGGACCCCGCGCAGGCGCACAGACGGATGGTGGCGCGGCGCAGGCGCAGTAGAAAAACGCCAGCGCGGTGCGGGGGGC
-GCGGCGCAGGCACAGGCGCAGAGACGGACGCCGACGGGGCGCAGGCGCAGAGACGGACGCCGCCGGGGCGCAGGCGCAGA
-GACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCAG
-GCGCAGAGACGGACGCCGCCGCGGCGCAGGCGCAGAGACGGACGCCGCCGCGGCGCCGTGGCGGTGGCAAGAGTCACGCG
-GAGAGATGCACGGCTGCGTGGCGCAGGCGCAGAGAAAAACGCCGGCGCGTCCCCTATGGGCGCGGCGGAGGCCCAGAGAC
-GCACGCCGGCGCGGCGCCGGGGCGGGGGTCGGGGCGCAGGCGCAGAGAAAAACGCCGGCGCGGCGCCGGGGCGGGGGTCG
-CGGCGCAGGCGCAGAGACCCACGCCGGGGCGGGGGCGCGGCGCAGGCGCAGACACGCACGCCGGGGCAGGGGCGCGGCGC
-AGGCCCAGAGACGCACGCCGGCGCGGCGCCGGGGCGGGAGCTCCGCGCAGGGGCAGAAAAGGACGCTGGCGCGGCGCAGG
-CGCAGAAAAAAAATGGCGGCGCAGCGCAGGCGCCGAGAAAAGCGCCAGCGCCGGGGGTCGCGGCGCAGGCGCAGAGAAAA
-ACGCCAGCGCGGCGCCGGCGCAAAGACGGGCGCAGGCGCAGAGTCGGGCGCTGGCGCGTCGCCGAGGTGGGGGCGCGATG
-CACGCGCAGAGACGCACGGCTGCGTGGCGCAGACGCAGAGAAGAACGCGAGCGCGGCGCCGAGGACAAGGCGCAGGCGCG
-GAGACGCACGCCAGCGCGGGGGCGAGGCGCAGGCGCGGAGATGCACTCCGCCAGGCGCGGGGAGGGGGGCGCGGCGCAGG
-CGCAGTGACGCACGCCGCCTGGGGCGCAGCGCAGAGACAGGCGGAACCTCAGTAATCTGAAAAGCCAGGTTGCCCCCTCC
-TTGCGGCCGGGCACTAAAGGGCCCACTTGCTGAAGGCGCTGTGCCAGCGTGCCCCCTGCTGGTGACTGGGGCAACTGCAG
-GGTTCTCTTGCTTCCATTAGTGGCCAGCGGCCCCTGCTGGCGGCGGGGCACCGCAGGGTCCTCTTGCACACAGTATAGTG
-GCGGCATGCCGCCTGCTGGCAGCTGGAGACATTGCAGGGCTCTCTTGCTCATAGTATAGTGACAGGACGCCCGCCTGCTG
-GCAGCTGGGGACACTGCCGGCCACTCTTGCTCCAAGTGTAGTGGCTGTTGGCTCCCCTGCTGGCAGCTGGGGACACTGCC
-GGGCCCTCTTGCTTGCAGTTTACTGGGGGCACGCCCCCTTCTGGCCGCTTGGGGCACTACAGGATGCTCTTGCTCACAGT
-GTAGTGGCAGCTCGCCGCCTGCTGGCAACCAGGGTACTGCAGGGTTCTCTTGCTCATGGTGTGGTGCCCGTCCACCACCT
-GCTGGCAGCTAAGGACACTGCAGGGCCCTCTTGCTCAGAGTGTAGTCGTCGTACACCCCCTGCTGGCAGCTGGGGACGCT
-GCCGGGACTTTTCCTGGCACTGTCGTGGCAGCACACTACCTGCAGGCAGATGGGGACTATGCAGGGACCTCTTGTTCAGG
-GTGTGAGGGCTGGCACGCCCTACTGGCCGCCTCCTGCACCACTTAAAGTCGGAGCGCCAGTTAAGCACCATCAGTTCTGG
-AAATTGAAACTGAAATGGAGCTATTACTGAGGAGAGTTGATGTCCCAGTTCTTGTCTAACTTGGAAGAAAGATTTTTCAC
-CAAGAGGCAGTAAAAACATGGCAGATAACTTCATTGAAAACAAATACAGTGTAAAGAGCTTATTGTAGAATAATAGGGAG
-GAGTGGGCTGATTGTGCAGGAAAACAGCCTGAGAGTCCTGTGCAGGGAATTTTATTTTGGACTTCTTCACATTTCTGCCT
-CTGTCTCAAGTCTCCACCTGTTTTCTTTGTCTGGTTTTCCTGCTACTGCCTTAGGTCCCTGAGTTGCCCCACTTAGGCTT
-ATGGGACCTCCTCACTGTTGGTTGAGGCACATGTGTGCTGATCAATCCGAATCCACTCTGGTACCAGGCTCCTTCCCCCC
-ATCCCAGGCAGGCTGACAGCGGTCATGTTTCTGCCTACAGCGCCTGCCTATCTCTTTTGAATGTCCTTCTCTACACTACT
-CTGTACTTATGGTGCCAGGTTTCTCTTAAGAATGTCCCCTTTGTCCTTCTTATCAGCATGTAGCCAGCAATATTGTGACA
-TTTTTACTGCAGAGTGAATGATGACTGGGGCATCTTAAATGGAGTTCTGGGGTGTTTCTTTCTGCATAGGTACCTCTGCA
-GTAGTAGTTTCCAAAATACTTTTGGTAATTTTTAACCTTAAAGTTAACCTTAAAGTTAAGCTAAGTAAAAGATTTGCATT
-AAATATCTAGACCATTTATAAATAAGATACAATACTAAAACATTACTGAAGATAAATAATTCTAGTTTACATACTTTTGG
-CTACTTATTTTTACAGAGAAACTAAAGATATTTTAGCCCATTAATAAACATGTTTTTGTCTACCACACTGAGAAATTGTA
-CTATGAGGAAACACATCCCTCTAGATGTTGGGAGATGGTATACTCATACATTTTCTAACCTACTATAGAATGCTAACATA
-TGACAGTTTATAACTGTCTACTTCCTAGTTTTCTCTGGAAAATAAAAGATTACTAAGTATTAAAATTATAATCAATATGT
-GTAAATAAAACTACTGGAAATAATAGAATAACTAGAAACAACTCTATGCAAAGCATGCAAGAAAAGTAGTGCATGTTTTG
-CAAGTAAAGTAGGACGTATTTTTTATAAGGAAAACCATACAAAAGATACAAATAAAAAGAGATACCTAGCCTTCCCTGTG
-TTATATTTGTATGGGTAAAATGTCATGTTTTCAGAAATTATATAAAATTCCTGGAAATTTGTCAATGTTCTCCTTATCCA
-TGCTATGTGCCAGTATAGAGTTATGAGTCATAATTCCAATTATTATTTTAAATGTTGTGCTGGGTGCAGTGGCTCACGTC
-TGTAATCCCACCACTTTGGGAGGCCTAGGCAGGTGGATCACAAGGTCAGGAGATCGAGAACATCCTGGCTGACATGGTGA
-AACCCCATCTCTACTAAAAATACAAAAAATTAGCCAGGCGTGGTGGTGGGCACCTGTACTCCCAGCTACTCAGGAGGCTG
-AGGCAGGAGAATGGCATGAACCAGGGAGGCAGAGCTTGCAGTGAGCCAAGATAGCGCCACTGCACTCCAGCATGGGCAAC
-AGAGCGAGACTCTGTCTCTAAATAAATAAATAAATAAATAAATAAATGTTTTATCCCACAGAAAAAATCGAATATCCTTG
-TCAGTTGTGGTATAATGAACTCTCATCAGATCTTTCATCACAGCCATTTCATATTCTTTATCATTTAGATATTATTTCCC
-CCTGATGCTTTCCTGAAAGCTCCTGCAATCAGCTACAGGTCAGAATGTTCATCTCCATCACGGGACTCCCTCTGAGACAC
-ACAGAAAAGAGTATGCAAGATAGTCTGGTTATAGGCTTCTGATGATATTGCTTAAATAACTTTAAGACCATACACTTCGC
-TCAGTGAAGATCTCCAGAAGTCTGCTTCAGAAATTGATGGGTTCATGACACTGCTAACCCAAGATGCAACAAGACTGGAA
-TTGATTACATGGTACTGAATGAACTGATGAAAATTGATTATAATTTTATAGCTTTTTGGAGCATTGCTGGTTCTTTAATG
-TTCTAGTTTCTGGACTTAAGAAATCTCTTTCTCTTAACCTAACTGTAACATACAATTTAGTAGATTATACTTTTGAAAAC
-AGAAGTGAAGCATTTATCTTTTTTCCCCTGCCTGATTTTTCCAGAATTTTGAAATCCTTACTGAACACTCTTATTTTCAC
-GATGATATAGTTGTTAGCAAAAGTCCAATAAGAATCTGTTCACCTTGAACAGAGACCTCAGAAATAATGCCGCATATCTA
-CAACCATCTGATCTTTGACAAACCTGACAAAAACAAGCAATGGGGAAAGGATTCCCTATTTAATAAATGGTGCTGGGAAA
-ACTGGCTAGCCATATGTAGAAAGCTGAAACTGGATCCCTTCCTTACACATTATACAAAAATTAATTCAAGATGGATTAAA
-GACTTACATGTTAGACCTAAAACCATAAAAACCCTAGAAGAAAACCTAGGCAATACCATTCAGGACATAGGCATGGGCAG
-GGACTTCATGTTTAAAACACCAAAAACAATGGCAACAAAAGCCAAAATGGACAAATGGGATCTAATTAAACTAAAGAGCT
-TCTGCACAGCAAAAAAAAACCTACTGTCAGAGTGAACAGGCAACCTACAAAATGGGAGAAAATTTTCACAACCTACTCAT
-CTGACAAAGGGCTAATATCCAGAATCTACAATGAACACAAAGAAATTTACAAGAAAAAAACAAACAACCCCATCAAAAAG
-TGGGCGAAGGATGTGAACAGACACTTCTCAAAAGAAGACATTTATGCAGCCAAAAGACATGTGAAGGAATGCTCATCATC
-ATTGGCCATCAGAGAAATGCAAATCAAAATCACAATGAGACACCATCTCACACCAGTTAGAATGGCGATCATTAAAAAGT
-CAGGAAACAACAGGTGCTGGAGAGGATGTGGAGAAATAGGAACACTTTTACACTGTTGGTGGGACTGTAAACTAGTTCAA
-CCATTGTAGAAGATGGTGTGGCGATTCCTCAGGGATCTAGAACTAGAAATACCATTTGACCCAGCCATCCCATTACTTGG
-TATATACCCAAAGGAGTATAAATCATGCTGCTATAAAGACACATGCACACGTATGTTTATTGCGGCACTATTCACAATAG
-CAAAGACTTGGAACCAACCCAAATATCCAACAATGATAGACTGGATTAAGAAAATGTGGCACATATACACCATGGAATAC
-TATGCAGCCATAAAAAATGAAGAGTTCATGTCCTTTGTAGGGACATGGATGAAACTGGAAACCATCATTCTCAGCAAACT
-ATCACAAGGACAAAAAAACCAAACACTGCATGTTCTCACTCATAGGTGGGAATTGAACAATGAGAATACATGGACATGGG
-AAGGGGAACATCACACTCCAGGGACTGTTGTGGGGTGGGGGGGAGGGGGGAGGGATAGCATTAGGAGATATACCTAATGC
diff --git a/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai b/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai
deleted file mode 100644
index 2a20cf3..0000000
--- a/src/test/resources/htsjdk/samtools/hg19mini.fasta.fai
+++ /dev/null
@@ -1,4 +0,0 @@
-1 16000 48 80 81
-2 16000 16296 80 81
-3 16000 32544 80 81
-4 16000 48792 80 81
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf
deleted file mode 100644
index 39bed22..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTest.vcf
+++ /dev/null
@@ -1,53 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 NA12891 NA12892
-1 8216712 rs11121115 A G 1540.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:23,28:51:99:681,0,668:127 0/1:16,18:34:99:338,0,244:127 0/1:24,22:46:99:560,0,323:127
-1 17032814 rs2773183 T C 2828.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-1 17032818 rs2773183 T C 2828.26 FILTER AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-2 1143476 rs4998209 C T 1483.26 PASS AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0|0:66,0:66:99:0,178,2264:127 0|1:33,38:71:99:844,0,1024:127 0|1:26,26:52:99:678,0,719:127
-2 9240279 rs56249990 A G 3978.01 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS GT:AD:DP:GQ:PL:TP 0|1:33,42:75:99:1400,0,1031:127 0|0:67,0:67:99:0,178,2277:127 1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list
deleted file mode 100644
index aad2820..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestComp.interval_list
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 8216712 8216712 + rs11121115
-1 17032814 17032814 + rs2773183
-2 1143476 1143476 + rs4998209
-2 9240279 9240279 + rs56249990
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list
deleted file mode 100644
index 9bcca99..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverse.interval_list
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 1 8216711 + interval-1
-1 8216713 17032813 + interval-2
-1 17032815 249250621 + interval-3
-2 1 1143475 + interval-4
-2 1143477 9240278 + interval-5
-2 9240280 243199373 + interval-6
-3 1 198022430 + interval-7
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list
deleted file mode 100644
index de85ca5..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestCompInverseManual.interval_list
+++ /dev/null
@@ -1,10 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 1 8216711 + interval-1
-1 8216715 17032813 + interval-2
-1 17032815 249250620 + interval-3
-2 3 1143475 + interval-4
-2 1143477 9240278 + interval-5
-2 9240280 243199373 + interval-6
-3 1 198022430 + interval-7
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf
deleted file mode 100644
index f9ec538..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManual.vcf
+++ /dev/null
@@ -1,57 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 NA12891 NA12892
-1 8216712 rs11121115 A G 1540.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:23,28:51:99:681,0,668:127 0/1:16,18:34:99:338,0,244:127 0/1:24,22:46:99:560,0,323:127
-1 8216713 yossi-1 A G 1540.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:23,28:51:99:681,0,668:127 0/1:16,18:34:99:338,0,244:127 0/1:24,22:46:99:560,0,323:127
-1 8216714 yossi-2 A G 1540.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:23,28:51:99:681,0,668:127 0/1:16,18:34:99:338,0,244:127 0/1:24,22:46:99:560,0,323:127
-1 17032814 rs2773183 T C 2828.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-1 249250621 yossi-4 T C 2828.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-2 1 yossi-5 C T 1483.26 PASS AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0|0:66,0:66:99:0,178,2264:127 0|1:33,38:71:99:844,0,1024:127 0|1:26,26:52:99:678,0,719:127
-2 2 . C T 1483.26 PASS AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0|0:66,0:66:99:0,178,2264:127 0|1:33,38:71:99:844,0,1024:127 0|1:26,26:52:99:678,0,719:127
-2 1143476 rs4998209 C T 1483.26 PASS AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0|0:66,0:66:99:0,178,2264:127 0|1:33,38:71:99:844,0,1024:127 0|1:26,26:52:99:678,0,719:127
-2 9240279 rs56249990 A G 3978.01 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS GT:AD:DP:GQ:PL:TP 0|1:33,42:75:99:1400,0,1031:127 0|0:67,0:67:99:0,178,2277:127 1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list
deleted file mode 100644
index 6c6b5e0..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListFromVCFTestManualComp.interval_list
+++ /dev/null
@@ -1,12 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 8216712 8216712 + rs11121115
-1 8216713 8216713 + yossi-1
-1 8216714 8216714 + yossi-2
-1 17032814 17032814 + rs2773183
-1 249250621 249250621 + yossi-4
-2 1 1 + yossi-5
-2 2 2 + interval-1
-2 1143476 1143476 + rs4998209
-2 9240279 9240279 + rs56249990
diff --git a/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list b/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list
deleted file mode 100644
index f8fd99b..0000000
--- a/src/test/resources/htsjdk/samtools/intervallist/IntervalListchr123_empty.interval_list
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 1 1 + test
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/inttest.bam b/src/test/resources/htsjdk/samtools/inttest.bam
deleted file mode 100644
index 5c646f5..0000000
Binary files a/src/test/resources/htsjdk/samtools/inttest.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/inttest.sam b/src/test/resources/htsjdk/samtools/inttest.sam
deleted file mode 100644
index 805e153..0000000
--- a/src/test/resources/htsjdk/samtools/inttest.sam
+++ /dev/null
@@ -1,26 +0,0 @@
- at HD VN:1.5 SO:unsorted
- at SQ SN:Sheila LN:20
- at RG ID:ID SM:foo
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P0:i:0
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P1:i:127
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P2:i:128
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P3:i:255
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P4:i:256
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P5:i:32767
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P6:i:32768
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P7:i:65535
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P8:i:65536
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P9:i:2147483647
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** PA:i:2147483648
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** PB:i:4294967295
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P0:i:-0
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P1:i:-127
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P2:i:-128
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P3:i:-255
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P4:i:-256
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P5:i:-32767
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P6:i:-32768
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P7:i:-65535
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P8:i:-65536
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** P9:i:-2147483647
-Fred 16 Sheila 1 86 10M * 0 0 GCTAGCTCAG ********** PA:i:-2147483648
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/io/5newline5.txt b/src/test/resources/htsjdk/samtools/io/5newline5.txt
deleted file mode 100644
index 53ff652..0000000
--- a/src/test/resources/htsjdk/samtools/io/5newline5.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/io/slurptest.txt b/src/test/resources/htsjdk/samtools/io/slurptest.txt
deleted file mode 100644
index 44718c3..0000000
--- a/src/test/resources/htsjdk/samtools/io/slurptest.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-bacon and rice
-for breakfast
-wont you join me
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/issue76.bam b/src/test/resources/htsjdk/samtools/issue76.bam
deleted file mode 100644
index 32c05b7..0000000
Binary files a/src/test/resources/htsjdk/samtools/issue76.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/issue76.bam.bai b/src/test/resources/htsjdk/samtools/issue76.bam.bai
deleted file mode 100644
index 2366517..0000000
Binary files a/src/test/resources/htsjdk/samtools/issue76.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain b/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain
deleted file mode 100644
index 9f7a0cf..0000000
--- a/src/test/resources/htsjdk/samtools/liftover/hg18ToHg19.over.chain
+++ /dev/null
@@ -1,30850 +0,0 @@
-chain 21270159960 chr1 247249719 + 0 247199719 chr1 249250621 + 10000 249233096 2
-616 0 137
-166664 50000 50000
-40302 50000 50000
-153649 50000 50000
-1098446 269 272
-773 1 1
-43 1 1
-864369 2 2
-51 0 3
-104 13694 13694
-104 3 0
-51 2 2
-134936 50000 50000
-1161048 60000 150000
-1440092 50000 27273
-7590365 50000 50000
-116914 50088 100088
-237162 50000 50000
-3518496 50000 50000
-12702424 50000 150000
-16145012 1 0
-7772 0 1
-4705841 1 0
-52977198 50000 50000
-157344 50000 21065
-16604841 50000 50000
-189539 50000 150000
-398739 20290000 21050000
-195588 50000 50000
-186739 50000 150000
-175055 50000 50000
-201709 50000 100000
-126477 50000 130183
-381 3 0
-315 2 0
-62 1 1
-73 1 1
-1158 0 1
-314 1 0
-11 1 1
-2849 0 3
-5615 1 1
-37 1 1
-3172 4 6
-190 1 1
-34 1 1
-380 1 0
-2099 0 3
-1135 4 0
-970 5 5
-209 0 1
-460 1 0
-1242 28 28
-574 1 1
-21 1 1
-2268 0 3
-239 1 0
-970 11 11
-2365 1 1
-21 1 1
-384 8 8
-996 0 2
-10383 0 2
-713 1 0
-5188 1 1
-30 1 1
-1233 0 1
-132 1 1
-44 1 1
-2955 0 1
-512 1 1
-39 1 1
-1096 16 0
-743 0 1
-9028 1 0
-2506 6 0
-8446 0 2
-5505 3 0
-7541 0 1
-109864 50000 50000
-78698 50000 50000
-127263 50000 50000
-170669 50000 50000
-38311 100000 100000
-1022394 50000 50000
-281532 50000 294733
-1687 1 1
-39 0 1
-1018 1 1
-26 1 1
-1722 0 2
-158 0 4
-1602 6 0
-1384 0 1
-2066 1 1
-32 3 1
-1556908 50000 150000
-185320 50000 150000
-172789 50000 50000
-220313 50000 50000
-455185 50000 50000
-22047237 0 1
-34365824 50000 150000
-259514 50000 150000
-17265625 50000 50000
-11394365 50000 50000
-13665999 50000 150000
-174886
-
-chain 989083 chr1 247249719 + 2475290 2488984 chr1 249250621 - 246751494 246765188 1383
-13694
-
-chain 5421 chr1 247249719 + 1609759 1609849 chr1 249250621 + 1672838 1672928 2227793
-90
-
-chain 3303 chr1 247249719 + 13192499 13192587 chr1 249250621 - 236203315 236203403 109
-88
-
-chain 467 chr1 247249719 + 142633259 142633287 chr1 249250621 - 128420441 128420469 123
-28
-
-chain 12431961244 chr10 135374737 + 50000 135374737 chr10 135534747 + 60000 135524747 10
-5577107 50006 0
-12337568 50000 50000
-20794160 50000 50000
-286100 2480000 3200000
-191752 50000 50000
-3830277 150000 50000
-952205 150000 100000
-263307 150000 100000
-163231 150000 50000
-989829 150000 100000
-1941874 50000 50000
-211435 50000 50000
-30112515 319974 0
-13249156 10 0
-31058956 50000 50000
-2696597 50000 150000
-4615335 10000 50000
-246123 50000 50000
-1327328 1 1
-47 1 1
-1312 1 0
-56 1 1
-190 1 1
-31 1 1
-20182 0 1
-448068
-
-chain 8134587 chr10 135374737 + 81444609 81551340 chr10 135534747 + 88976631 89083503 218
-369 41 41
-149 6 6
-83 71 71
-548 9 9
-391 9 9
-334 42 42
-81 1 2
-954 1 0
-441 0 4
-922 37 37
-343 253 253
-278 59 58
-404 13 13
-90 39 37
-70 132 123
-145 4 4
-392 9 9
-58 29 29
-166 51 50
-78 14 14
-455 61 65
-243 41 41
-1183 17 17
-163 57 57
-169 51 51
-912 5 5
-667 12 12
-250 20 20
-506 8 8
-292 8 8
-266 17 17
-69 27 27
-131 22 22
-668 46 47
-270 13 13
-128 7 7
-300 48 48
-818 32 32
-667 67 67
-402 24 36
-293 18 18
-423 68 68
-113 9 9
-630 42 42
-269 51 51
-165 0 1
-645 52 52
-76 91 90
-505 13 13
-143 31 31
-319 68 70
-245 126 126
-145 35 37
-90 57 57
-378 41 38
-193 13 13
-333 51 30
-51 6 6
-821 56 56
-547 18 18
-343 9 9
-270 47 47
-706 1 0
-120 21 22
-371 35 35
-530 13 13
-51 36 36
-611 48 48
-587 18 18
-499 9 9
-183 26 26
-847 7 7
-134 5 4
-64 34 34
-120 66 66
-173 147 147
-126 19 16
-53 44 49
-69 1 0
-153 89 90
-81 16 16
-52 32 36
-72 28 28
-86 68 68
-56 51 51
-120 17 17
-181 5 5
-86 17 18
-68 36 36
-356 101 101
-90 3 11
-226 26 28
-70 19 19
-95 9 9
-88 16 16
-272 33 33
-216 71 71
-394 83 83
-853 14 15
-90 23 23
-130 0 3
-52 11 11
-192 49 49
-407 13 13
-122 71 34
-179 28 28
-102 10 10
-299 36 36
-268 4 4
-123 36 36
-112 41 41
-233 77 75
-73 88 92
-519 43 43
-118 101 101
-78 33 43
-117 31 31
-83 37 37
-86 3 0
-468 0 2
-791 55 55
-268 97 97
-111 55 59
-164 38 38
-176 0 3
-116 67 74
-269 0 3
-92 66 67
-205 50 55
-1339 33 34
-86 9 9
-310 34 34
-217 42 42
-194 18 17
-191 4 4
-250 0 3
-148 79 79
-77 3 0
-199 57 57
-200 53 53
-331 52 53
-136 32 42
-69 60 60
-169 0 1
-594 88 88
-174 70 70
-135 48 48
-53 9 9
-862 25 25
-1106 33 33
-974 76 76
-368 17 17
-369 43 43
-263 49 49
-143 8 8
-228 57 57
-74 3 0
-914 2 0
-137 77 74
-243 32 32
-166 53 53
-646 87 87
-71 0 1
-661 45 45
-142 76 76
-851 17 17
-56 60 60
-52 59 58
-80 60 60
-602 13 13
-617 76 78
-51 152 152
-77 38 38
-150 0 4
-386 45 45
-585 40 33
-108 12 12
-219 99 99
-1376 58 58
-517 27 27
-124 20 20
-566 58 58
-235 47 47
-72 26 26
-157 43 43
-208 31 31
-578 122 84
-259 15 15
-1141 119 119
-141 13 13
-817 14 14
-188 0 5
-323 62 75
-447 0 5
-64 161 161
-945 23 23
-66 35 35
-104 125 125
-613 186 184
-102 205 203
-767 27 27
-111 13 13
-107 80 83
-272 0 1
-438 4 4
-127 68 68
-564 44 44
-141 14 14
-137 13 17
-167 18 0
-241 25 25
-586 30 30
-178 44 44
-310 90 87
-1277 35 35
-646 32 32
-704 56 56
-367 93 101
-241 15 14
-340 64 64
-1000 23 26
-163 81 81
-895 12 12
-345 2 0
-117 48 49
-491 32 32
-206 17 17
-439 109 109
-202 6 7
-756 24 24
-380 63 62
-144 48 48
-608 80 80
-154 71 71
-232 16 16
-1809 40 40
-346 53 52
-117 10 0
-383 10 10
-1973 19 19
-879 42 42
-91 50 50
-1147 2 1
-210 68 88
-189 7 7
-595 50 49
-248 104 126
-265 106 106
-167 0 7
-141 93 62
-825 1 0
-348 47 46
-211 3 0
-114 52 56
-66 7 7
-759 48 48
-269 0 1
-106 109 114
-114 38 39
-282 20 20
-504 0 1
-174 14 7
-123 45 46
-82 58 58
-203 12 13
-153 44 44
-121 74 74
-805 43 43
-120 67 68
-171 6 6
-329 20 20
-151 33 33
-71 46 46
-195 25 21
-65 23 42
-96 78 78
-58 0 4
-389 0 3
-214 137 138
-111 2 3
-116 10 10
-128 0 3
-52 8 8
-62 43 43
-142 6 6
-214 0 112
-179 0 1
-234 4 0
-75 116 117
-119 63 67
-286 72 42
-73 150 150
-206 214 220
-73 2 0
-82 48 48
-135 40 67
-115 109 114
-185 49 49
-99 63 63
-52 204 205
-121
-
-chain 2724232 chr10 135374737 + 81309951 81339951 chr10 135534747 + 81320000 81350000 983
-22137 957 957
-46 77 77
-38 83 83
-51 54 54
-984 53 53
-5520
-
-chain 1898345 chr10 135374737 + 81349952 81369946 chr10 135534747 + 81360000 81380000 1327
-15902 21 27
-4071
-
-chain 946327 chr10 135374737 + 81339951 81349952 chr10 135534747 + 81350000 81360000 2894
-6692 1 0
-3308
-
-chain 939763 chr10 135374737 + 81430217 81440202 chr10 135534747 + 81440000 81450000 3159
-163 3 0
-518 0 16
-972 42 43
-5149 0 1
-3138
-
-chain 928169 chr10 135374737 + 81379935 81389948 chr10 135534747 + 81390000 81400000 3587
-1970 7 8
-141 10 0
-413 39 39
-622 4 0
-574 42 42
-2153 0 2
-1520 5 3
-2513
-
-chain 922636 chr10 135374737 + 81300280 81309951 chr10 135534747 + 81310330 81320000 2721
-2989 1 0
-6681
-
-chain 885793 chr10 135374737 + 81369946 81379851 chr10 135534747 + 81380000 81389916 4570
-507 30 32
-880 91 91
-1155 82 82
-784 10 10
-907 16 28
-1265 50 50
-859 0 3
-1375 1 2
-165 27 27
-124 29 29
-275 8 8
-308 6 0
-79 1 0
-871
-
-chain 839370 chr10 135374737 + 81389948 81399836 chr10 135534747 + 81400000 81409799 4960
-446 1 0
-639 0 1
-112 140 59
-198 24 22
-98 162 137
-63 10 10
-97 180 192
-71 31 33
-322 38 38
-431 0 1
-741 45 46
-229 1 3
-186 1 4
-3019 14 14
-131 1 0
-722 16 16
-1530 92 92
-32 2 1
-63
-
-chain 788625 chr10 135374737 + 81241464 81249852 chr10 135534747 + 81251575 81259959 6147
-783 1 0
-883 23 33
-3247 1 0
-143 31 31
-957 15 3
-2304
-
-chain 781678 chr10 135374737 + 81280054 81289770 chr10 135534747 + 81290109 81299824 3334
-65 841 841
-84 228 228
-27 240 240
-1767 0 10
-186 66 54
-976 0 3
-1495 0 7
-899 0 1
-376 7 7
-2156 10 0
-196 50 50
-47
-
-chain 778944 chr10 135374737 + 81250813 81551219 chr10 135534747 - 53516479 54101824 544
-53 63 72
-96 209 213
-193 44 44
-202 331 335
-149 28 28
-100 125 123
-56 238 272
-60 91 93
-123 9 11
-66 147 144
-82 210 211
-77 17 17
-196 31 31
-379 27 27
-954 71 71
-69 4431 3721
-746 66 66
-502 12 12
-282 28 28
-224 59 59
-52 35 35
-448 12 0
-474 42 42
-260 11 11
-83 38 44
-160 152 149
-284 76 76
-110 73 73
-284 9 9
-478 110 110
-95 5 5
-583 122 122
-116 1 1
-67 1 1
-118 1 1
-38 1 1
-566 1 1
-35 1 1
-287 1 0
-481 1 1
-42 1 1
-198 1 1
-22 1 1
-54 1 1
-25 1 1
-50 1 1
-50 1 1
-294 4 0
-158 1 1
-31 1 1
-255 8 8
-291 12 12
-171 2 2
-21 1 1
-685 77 77
-817 20 20
-312 39 39
-181 1 0
-249 50 47
-75 7 7
-86 4 4
-54 8 8
-518 134 134
-376 24 26
-189 17 27
-143 13 13
-93 16 16
-192 24 24
-992 140 132
-828 1 1
-40 1 1
-410 1 1
-25 0 2
-13 1 1
-83 8 8
-143 1 1
-20 1 1
-421 1 1
-49 1 1
-107 1 1
-28 1 1
-77 1 1
-32 0 2
-44 2 2
-348 1 1
-53 0 4
-58 1 1
-97 1 1
-125 56 53
-526 1 1
-46 1 1
-209 9 9
-76 1 1
-37 1 1
-53 1 1
-24 1 1
-141 1 1
-26 1 1
-304 1 1
-60 1 1
-199 1 1
-47 1 1
-92 6 0
-138 64 64
-299 65 65
-186 24 24
-631 84 84
-100 20 20
-108 27 27
-240 8134 8243
-50 47 45
-107 11 11
-750 5 5
-230 25 25
-221 62 62
-106 32 32
-106 52 52
-270 56 56
-166 31 31
-89 77 77
-127 666 662
-56 22 22
-55 95 83
-51 30 30
-77 35 35
-189 16 16
-130 53 53
-131 5 5
-158 140 131
-170 21 21
-55 79 79
-207 200 199
-152 11 11
-105 50 50
-104 34 34
-56 402 402
-69 0 1
-61 150 150
-181 10 10
-130 22 22
-180 5 0
-73 161 161
-77 151 151
-68 128 128
-330 138 126
-116 1211 328
-252 4 4
-102 8 8
-72 23 23
-51 51 51
-608 31808 287592
-56 14 14
-161 9 9
-717 46 50
-77 38 30
-83 51 51
-54 984 987
-53 65700 95386
-47 559 556
-99 119 119
-193 38 38
-164 12 7
-59 38 38
-58 9 5
-57 34 34
-68 30 30
-59 28 28
-51 82 87
-142 7 7
-67 162 152
-248 1 2
-114 34 34
-140 22 22
-58 119 118
-143 50 50
-255 69 65
-53 18 18
-127 11 13
-446 39 39
-134 24 24
-143 42 42
-123 65 65
-57 0 3
-199 73 73
-271 17 17
-113 24 24
-203 40 40
-51 38 38
-119 50 50
-81 60 60
-239 85 70
-79 219 219
-64 149 150
-29 211 211
-91 319 310
-76 40 40
-59 596 591
-34 579 579
-51 90 90
-169 336 329
-146 226 226
-50 480 479
-23 66 66
-95 447 447
-49 298 298
-29 180 180
-45 1186 1169
-53 2222 2217
-11 116 116
-33 313 313
-63 75 75
-14 257 258
-31 122 122
-73 311 316
-238 46 46
-130 81 78
-103 262 266
-56 168 163
-29 861 857
-61 655 666
-18 40 40
-436 1 1
-8 4 0
-35 1 1
-417 21 18
-51 2 0
-54 1 1
-126 10 9
-72 5 5
-377 1 1
-18 2 0
-35 2 2
-78 1 2
-18 2 2
-82 1 0
-99 1 1
-82 0 4
-99 1 1
-50 0 4
-50 7 7
-225 11 11
-135 2 0
-326 26 989
-2646 0 1
-560 10 0
-347 114 114
-284 118541 118621
-43 120 120
-65 1 0
-1 677 677
-33 71 71
-46 404 404
-78 661 663
-137 489 492
-43 854 846
-116 119 119
-63 286 286
-72 73 73
-150 206 206
-17 1 1
-85 1 1
-110 157 157
-48 135 135
-36 0 4
-4 115 115
-73 2 0
-19 1 1
-14 185 185
-49 99 99
-22 1 1
-40 79 80
-177
-
-chain 662550 chr10 135374737 + 81399647 81430169 chr10 135534747 - 46431029 46458544 512
-92 103 101
-125 0 2222
-53 53 50
-58 48 48
-298 191 189
-69 6167 5
-118 101 101
-128 111 111
-207 48 43
-55 175 169
-212 93 89
-159 23 23
-109 34 34
-150 21 20
-258 30 30
-120 51 54
-90 171 171
-268 224 219
-202 62 62
-480 237 237
-394 49 49
-100 28 28
-93 25 25
-52 29 29
-180 45 45
-141 47 47
-56 49 49
-169 39 42
-60 102 113
-53 1 13
-151 105 105
-58 33 30
-88 246 246
-334 116 116
-63 83 84
-268 115 113
-70 43 43
-252 2 1
-62 97 97
-88 6 0
-61 23 23
-84 75 75
-75 2 3
-83 8 8
-53 160 162
-312 153 152
-192 96 98
-122 95 100
-94 793 791
-61 1 5
-154 140 135
-130 32 33
-121 21 21
-82 6 6
-171 34 34
-110 52 49
-129 193 194
-64 26 29
-72 18 18
-286 75 58
-114 6596 7638
-114 284 172
-558 8 9
-111 5 5
-55 2 2
-80 0 1
-27 1 1
-72 1 1
-45 1 1
-516 1 1
-66 1 1
-106 23 42
-64 4 0
-21 1 1
-312 2 2
-30 1 1
-151 20 20
-193 1 1
-38 1 1
-96 6 6
-171 0 3
-27 0 2
-34 2 2
-120 3 3
-39 1 1
-752
-
-chain 650336 chr10 135374737 + 81249915 81259740 chr10 135534747 + 81260018 81269841 3195
-898 53 53
-63 96 96
-209 193 193
-44 202 202
-331 149 149
-28 100 100
-125 56 56
-238 60 60
-91 198 198
-147 82 82
-210 290 290
-31 1360 1360
-71 69 69
-196 1 0
-454 16 15
-3764
-
-chain 462746 chr10 135374737 + 81440202 81450008 chr10 135534747 + 81450000 81459803 2861
-1116 4 4
-801 3 0
-2483 369 369
-41 238 238
-71 1291 1291
-42 2400 2400
-37 343 343
-253 278 278
-36
-
-chain 389885 chr10 135374737 + 81290873 81299672 chr10 135534747 + 81300927 81309722 2802
-25 221 221
-62 106 106
-32 106 106
-52 270 270
-56 166 166
-31 89 89
-77 127 127
-666 133 133
-95 51 51
-30 77 77
-35 335 335
-53 294 294
-103 4 0
-33 246 246
-79 207 207
-200 268 268
-50 104 104
-34 56 56
-402 130 130
-150 601 601
-161 77 77
-151 68 68
-128 330 330
-138 116 116
-1211 512 512
-51
-
-chain 178315 chr10 135374737 + 81400041 81409702 chr10 135534747 + 81410003 81419664 4252
-32 404 404
-191 168 168
-119 193 193
-38 235 235
-38 124 124
-34 68 68
-30 59 59
-28 51 51
-82 216 216
-162 363 363
-34 220 220
-21 9 9
-89 143 143
-50 255 255
-69 995 995
-42 123 123
-65 256 256
-73 628 628
-40 208 208
-50 94 94
-47 239 239
-85 79 79
-219 64 64
-31 147 147
-72 625 625
-40 271 271
-93 754 754
-30 700 700
-66
-
-chain 157388 chr10 135374737 + 81410627 81419292 chr10 135534747 + 81420589 81429247 5183
-66 95 95
-53 1136 1136
-46 81 81
-25 268 268
-38 269 263
-105 58 58
-6 0 1
-27 88 88
-34 53 53
-81 32 32
-46 334 334
-116 63 63
-83 268 266
-115 429 428
-97 262 262
-75 757 757
-75 230 232
-41 343 343
-69 47 47
-78 238 238
-46 130 131
-17 36 34
-28 319 319
-46 56 56
-38 707 707
-52 129 129
-132 125 125
-26 376 376
-75
-
-chain 142913 chr10 135374737 + 81466547 81535718 chr10 135534747 - 46275769 46344990 569
-44 2128 2133
-24 2535 2533
-31 2379 2381
-34 143 143
-43 270 270
-50 1045 1058
-51 494 498
-36 2085 2105
-60 1979 1981
-71 1197 1197
-41 1594 1601
-37 2856 2871
-66 205 205
-50 1339 1339
-33 656 663
-42 805 805
-79 280 275
-56 200 200
-22 18 18
-13 1443 1450
-44 2526 2526
-33 974 974
-75 1489 1489
-47 1658 1653
-53 1652 1653
-41 1071 1071
-59 10705 10669
-57 6434 6441
-25 586 586
-30 178 178
-44 310 310
-74 7 1
-9 1277 1277
-35 5735 5751
-32 2139 2139
-63 3162 3162
-40 346 345
-53 3391 3390
-41 92 92
-50
-
-chain 97392 chr10 135374737 + 81500632 81510012 chr10 135534747 + 81510451 81519840 3573
-60 191 191
-60 1232 1232
-76 51 51
-152 77 77
-38 536 540
-45 585 586
-39 340 340
-99 1376 1373
-58 517 517
-27 710 710
-58 235 235
-47 72 72
-26 157 157
-43 208 208
-31 630 637
-70 1415 1415
-119
-
-chain 87386 chr10 135374737 + 81512081 81517268 chr10 135534747 + 81521923 81527111 3288
-161 1034 1034
-35 104 104
-125 613 613
-186 102 102
-205 767 767
-27 231 232
-80 841 841
-68 564 564
-44
-
-chain 81916 chr10 135374737 + 81260486 81269831 chr10 135534747 + 81270587 81279924 3410
-66 796 796
-28 224 224
-59 52 52
-35 934 925
-42 354 354
-1 0 2
-37 160 160
-121 19 18
-12 284 284
-76 110 110
-73 771 771
-110 683 683
-8 36 35
-78 4099 4100
-77
-
-chain 75208 chr10 135374737 + 81450008 81464865 chr10 135534747 + 81597933 81612795 1746
-23 1356 1354
-29 166 166
-51 547 547
-30 274 278
-40 1364 1363
-57 169 169
-51 3032 3032
-27 1585 1586
-48 818 818
-32 667 667
-67 1160 1160
-68 752 752
-42 269 269
-51 810 813
-52 76 76
-91 661 661
-31 319 319
-42
-
-chain 71596 chr10 135374737 + 81480667 81490183 chr10 135534747 + 81490477 81500000 3725
-36 395 395
-36 536 535
-88 519 519
-43 139 139
-80 78 78
-33 117 134
-31 1468 1468
-55 268 268
-97 111 111
-30 6 0
-19 164 164
-38 292 292
-67 2459 2459
-34 2063 2060
-52 136 136
-26
-
-chain 65913 chr10 135374737 + 81470614 81479436 chr10 135534747 + 81480422 81489246 3085
-36 1955 1955
-26 1450 1450
-97 248 248
-44 223 223
-89 149 149
-32 72 72
-28 86 86
-68 993 993
-49 0 1
-52 319 320
-26 569 569
-33 216 216
-71 1842 1842
-49
-
-chain 63808 chr10 135374737 + 81521220 81529648 chr10 135534747 + 81531068 81539504 3362
-32 704 704
-56 367 367
-93 596 601
-64 1186 1189
-81 1371 1371
-48 1185 1185
-109 1575 1575
-48 608 608
-80 154 154
-71
-
-chain 58084 chr10 135374737 + 81490258 81499708 chr10 135534747 + 81500075 81509527 2957
-60 807 808
-44 174 174
-70 135 135
-48 924 924
-25 2943 2943
-43 263 263
-49 1566 1566
-77 243 243
-32 865 865
-87 732 733
-45 183 183
-35
-
-chain 41373 chr10 135374737 + 81540284 81544136 chr10 135534747 + 81550136 81553982 6087
-47 328 324
-52 832 831
-48 375 375
-79 0 1
-30 114 114
-38 1117 1115
-45 82 82
-58 368 368
-44 121 121
-74
-
-chain 34777 chr10 135374737 + 81464865 81470020 chr10 135534747 + 81474671 81479828 3724
-26 245 245
-34 44 44
-48 145 145
-12 0 2
-23 90 90
-57 378 378
-41 1468 1468
-56 2453 2453
-35
-
-chain 34249 chr10 135374737 + 81270980 81279755 chr10 135534747 + 81281073 81289810 4510
-39 431 431
-50 752 752
-134 2175 2167
-44 3025 2995
-35 14 9
-7 2005 2010
-64
-
-chain 29298 chr10 135374737 + 81537077 81539110 chr10 135534747 + 81546931 81548963 3702
-68 791 797
-50 617 605
-33 0 2
-73 308 311
-93
-
-chain 18939 chr10 135374737 + 81450538 81452241 chr10 135534747 + 81460333 81462036 3255
-39 70 70
-132 1431 1431
-31
-
-chain 6030 chr10 135374737 + 81422413 81430217 chr10 135534747 + 81432363 81440000 5582
-26 7730 7563
-48
-
-chain 5154 chr10 135374737 + 81371363 81371422 chr10 135534747 - 72572913 72572972 4033525
-2 1 1
-56
-
-chain 1569 chr10 135374737 + 81371422 81371454 chrX 155270560 + 63278348 63278380 8657459
-32
-
-chain 1063 chr10 135374737 + 81231366 81231464 chr10 135534747 - 54101945 54102043 901
-98
-
-chain 4275918 chr10_random 113275 + 18676 65432 chr5 180915260 + 138864813 138909803 707
-204 2 0
-4653 4 0
-2427 0 1
-5957 0 1
-1558 1 0
-780 1794 33
-29376
-
-chain 870863 chr10_random 113275 + 9144 18556 chr10 135534747 - 46779061 46789268 4835
-301 2 0
-564 3 0
-802 1 0
-2624 0 112
-142 0 2
-128 100 787
-4745
-
-chain 637317 chr10_random 113275 + 102183 113228 chr10 135534747 + 88758795 88768050 8258
-1205 22 22
-793 0 1
-914 1 1
-9 0 1
-45 0 1
-9 2477 1631
-132 1562 615
-2006 1 1
-36 1 1
-557 24 23
-885 0 2
-194 1 0
-171
-
-chain 383436 chr10_random 113275 + 97894 101991 chr10 135534747 + 88848068 88852165 132306
-2932 0 1
-697 4 3
-464
-
-chain 312568 chr10_random 113275 + 0 3305 chr10 135534747 + 88861095 88864401 225266
-2905 0 1
-400
-
-chain 263395 chr10_random 113275 + 91858 94672 chr10 135534747 + 88776474 88779288 339622
-1683 3 3
-130 11 11
-987
-
-chain 254817 chr10_random 113275 + 83066 85798 chr10 135534747 - 46749813 46752549 368581
-201 0 6
-798 0 1
-403 4 0
-841 14 15
-471
-
-chain 244215 chr10_random 113275 + 5995 97779 chr10 135534747 + 88818267 88897264 4711
-966 0 1
-2072 66256 15486
-2428 10567 42513
-197 0 1
-820 6 6
-18 1 0
-21 0 1
-20 2 1
-1685 0 2
-703 3020 9053
-1156 0 1
-1846
-
-chain 216530 chr10_random 113275 + 72868 75170 chr10 135534747 - 93082016 93084318 524441
-2302
-
-chain 211663 chr10_random 113275 + 85898 88144 chr10 135534747 + 88832831 88835078 546276
-536 0 1
-1710
-
-chain 171789 chr10_random 113275 + 70706 72761 chr10 135534747 - 93140436 93143121 737133
-50 1 1
-68 85 4
-15 15 34
-17 7 53
-13 1 647
-81 1 1
-50 21 21
-1630
-
-chain 129924 chr10_random 113275 + 67807 109229 chr10 135534747 - 46627912 46728083 8515
-467 0 1
-256 0 1
-42 1 1
-1352 0 2
-308 10219 43352
-227 1 1
-22 1 1
-2232 22395 48006
-1581 0 2
-518 1 1
-30 1 0
-197 132 132
-1439
-
-chain 125160 chr10_random 113275 + 4561 5895 chr10 135534747 - 46655374 46656707 1028939
-94 1 0
-1239
-
-chain 104003 chr10_random 113275 + 65554 66651 chr10 135534747 - 93176760 93177857 1232247
-1097
-
-chain 92361 chr10_random 113275 + 66732 67707 chr10 135534747 - 93158718 93159693 1382147
-975
-
-chain 89191 chr10_random 113275 + 3509 4486 chr10 135534747 - 129898314 129899289 1428933
-69 1 1
-35 1 0
-336 1 0
-401 1 1
-44 1 1
-87
-
-chain 29685 chr10_random 113275 + 34270 80352 chr10 135534747 - 46758431 46763489 186939
-210 0 6
-1251 4 4
-73 42015 985
-1249 1 1
-46 1 1
-1232
-
-chain 4572 chr10_random 113275 + 70436 70610 chr10 135534747 - 93144449 93144623 2904410
-51 50 50
-73
-
-chain 3114 chr10_random 113275 + 70610 70643 chr10 135534747 - 93147281 93147314 29780913
-33
-
-chain 12415599352 chr11 134452384 + 50000 134451920 chr11 135006516 + 60000 134946516 11
-1102759 16576 50000
-49571094 207000 307000
-503352 3000000 3100000
-14395596 2605 50000
-488471 34 102
-26 0 176
-30213 141 350
-27914 1 0
-20009 1 0
-19 1 0
-39 1 0
-17 3 1
-10 1 0
-1008 1 0
-95 1 0
-5127 15 0
-302 1 0
-975 0 4
-1548 0 1
-190 20 0
-41 1 0
-29 1 1
-44 0 1
-101 1 0
-25 0 1
-6178 0 1
-1875 21437 52561
-468 1 1
-81 1 1
-2620 1 0
-1640 4 0
-3305 0 1
-3342 1 0
-17899663 12000 50000
-8549206 15562 150000
-38507165 2 0
-1327 174 0
-392 18 0
-48
-
-chain 188276 chr11 134452384 + 69433462 69437111 chr11_gl000202_random 40103 + 7212 10860 1247
-1868 1 0
-1780
-
-chain 38178 chr11 134452384 + 134451288 134452384 chr5 180915260 - 180902450 180903869 1901368
-174 458 926
-1 8 0
-63 136 1
-64 2 0
-190
-
-chain 6040 chr11 134452384 + 134451996 134452128 chr1 249250621 - 249240179 249240388 3449013
-89 36 113
-7
-
-chain 2221 chr11 134452384 + 134452085 134452111 chrY 59373566 + 59362903 59362929 5436109
-26
-
-chain 4284950 chr11_random 215294 + 0 215294 chr11 135006516 - 65191297 65289033 706
-40524 167558 50000
-7212
-
-chain 3340892 chr11_random 215294 + 90524 125679 chr11 135006516 + 69689619 69724695 863
-1003 62 0
-3019 1 0
-695 1 1
-26 1 1
-1133 0 1
-1374 2 2
-20 1 1
-729 11 11
-269 0 1
-1091 14 14
-969 21 21
-532 5 5
-2677 18 0
-21481
-
-chain 3051979 chr11_random 215294 + 175679 208082 chr11_gl000202_random 40103 - 0 32891 790
-17546 11 51
-27 523 35
-32 6 6
-6712 100 1036
-7446
-
-chain 10612 chr11_random 215294 + 193466 193615 chr11_gl000202_random 40103 - 18116 18265 21504297
-59 27 27
-63
-
-chain 5102 chr11_random 215294 + 91527 91580 chr11 135006516 + 69690684 69690737 20979070
-53
-
-chain 12330181372 chr12 132349534 + 16000 132289534 chr12 133851895 + 145739 133779461 12
-7035083 0 4
-544 0 1
-3777 0 1
-3889 73000 52114
-6014 1 0
-6524 168 34
-20974 0 2
-3965 3 0
-444 0 11
-464 1 0
-27577110 1395000 3000000
-38631945 0 1
-14541 0 4
-1703 1 0
-789 250000 12128
-1783 1 0
-1075 0 2
-1042 1 0
-1526 1 1
-27 1 1
-2320 0 1
-166 1 0
-564 0 1
-2856 0 2
-900 0 1
-1387 1 1
-33 1 1
-2139 1 1
-48 1 1
-1305 0 2
-1533 1 2
-879 0 1
-744 26 26
-855 0 4
-1092 6 0
-1114 12 0
-817 1 1
-18 1 0
-217 1 1
-36 1 1
-2002 1 0
-1025 0 1
-450 1 1
-43 1 1
-919 1 0
-18 1 1
-3207 42 42
-1440 0 8
-148 4 0
-3655 2 0
-3403 1 1
-47 1 1
-1524 1 1
-28 1 1
-5561 0 2
-44 0 1
-676 8 8
-810 16 16
-536 2 0
-236 4 0
-167 0 4
-1419 49 53
-4688 1 1
-38 1 1
-18577 5 0
-5284 0 2
-1577 34 34
-4875 1 1
-25 1 1
-4340 0 14
-2663 5 0
-1170 1 0
-4268 0 4
-1036 0 1
-2117 0 8
-5917 1 0
-3239 0 4
-2619 1 1
-21 1 1
-937 1 1
-38 1 1
-2412 0 2
-38 17 0
-2732 0 2
-9314 2 0
-1986 2 2
-16 1 1
-229 1 1
-93 1 1
-895 12 0
-415 1 5
-27 1 1
-78 14 14
-185 8 9
-458 0 2
-89 1 1
-42 1 1
-2034 0 1
-1545 0 2
-280 0 4
-97 14 14
-231 0 2
-2816 5 0
-537 50 50
-1090 1 1
-27 1 1
-25758689 0 1
-6536665 0 1
-377270 57000 96749
-668 1 1
-20 1 0
-3348 1 1
-33 1 1
-648 1 1
-29 1 1
-3732 4 0
-977 46 46
-785 4 0
-34 1 0
-1688 0 10
-4248 1 0
-1167 1 0
-985 9 9
-2897 1 0
-1630 9 0
-1096 0 1
-1356 0 8
-13065723 150011 68363
-799 2 0
-343 0 1
-1771 0 1
-2702 7 6
-1900 1 0
-705 6 0
-303 1 0
-727 1 1
-43 1 0
-3 2 0
-490 1 1
-59 1 1
-226 1 1
-52 3 0
-465 0 8
-194 1 1
-25 1 0
-139 1 1
-15 1 1
-1833 1 0
-81 1 1
-39 1 1
-453 1 0
-719 1 1
-47 1 1
-558 1 0
-838 8 1
-288 10 9
-741 5 2
-465 1 1
-48 1 1
-268 1 1
-26 1 0
-1337 30 48
-84 2 85
-917 1 0
-110 31 31
-1580 1 1
-40 1 1
-683 1 1
-24 1 1
-247 1 1
-36 1 1
-1574 0 1
-10091386 0 3
-296 0 5
-220 45000 100872
-972469
-
-chain 2523 chr12 132349534 + 107924339 107924385 chr20 63025520 - 54448952 54448998 196257
-46
-
-chain 9007877316 chr13 114142980 + 17918000 114127980 chr13 115169878 + 19020000 115109878 14
-26987167 1 0
-40753157 50000 150000
-25443670 400000 150000
-1821999 384108 414007
-369878
-
-chain 17589560 chr13 114142980 + 113473994 113658050 chr13 115169878 - 529930 713796 162
-174857 2 0
-1328 144 0
-1156 1 1
-27 1 1
-2159 2 0
-49 1 1
-175 2 0
-20 4 0
-590 30 0
-163 8 4
-2905 2 0
-430
-
-chain 8677 chr13 114142980 + 113650223 113650314 chr13 115169878 - 706193 706284 25436870
-91
-
-chain 17750502 chr13_random 186858 + 0 186858 chrUn_gl000212 186858 + 0 186858 156
-186858
-
-chain 8359013040 chr14 106368585 + 18070000 106360585 chr14 107349540 + 19000000 107289540 15
-1081285 1 1
-43 1 1
-76 2 0
-437 1 1
-19 1 1
-440 12 13
-59 15 15
-63 12 12
-70 0 1
-734 1 1
-165 1 4
-96 1 1
-46 1 0
-83 1 1
-149 4 4
-164 1 1
-18 1 1
-63 15 16
-359 1 1
-39 1 1
-103 1 1
-76 1 1
-139 1 1
-38 1 1
-344 1 1
-65 0 1
-166 5 5
-88 1 1
-66 0 287
-50 1 1
-317 0 1
-52 1 1
-92 4 0
-651 4 4
-82 1 1
-93 1 1
-64 1 1
-24 1 1
-856 1 1
-35 1 1
-258 1 1
-17 1 1
-478 1 0
-1048 70 70
-1279 1 1
-37 1 1
-1115 3 4
-72 1 1
-126 1 1
-102 1 1
-413 10 10
-132 6 6
-89 0 2
-209 15 4
-77 5 5
-427 1 1
-41 1 1
-949 1 1
-16 1 1
-732 1 1
-44 2 0
-128 0 1
-91 1 1
-180 6 6
-388 6 6
-50 13 12
-275 1 1
-33 1 1
-142 1 1
-61 1 1
-560 1 1
-20 1 1
-1327 6 13
-729 37 37
-284 1 1
-44 1 1
-205 0 4
-40 1 1
-352 10 10
-261 1 1
-39 1 1
-940 12 0
-1677 36 0
-159 1 1
-32 8 1
-818 0 6
-580 1 0
-931 1 0
-276 2 0
-3298 45 45
-169 14 0
-46 1 1
-882 2 0
-94 1 1
-49 1 1
-859 4 0
-45 1 1
-807 16 15
-416 0 3
-3345 15 15
-92 30 29
-80 1 1
-48 1 1
-2459 0 1
-646 1 1
-31 1 1
-392 1 1
-29 54 0
-1875 3 0
-141696 1 1
-32 1 1
-8201115 1 0
-107 1 0
-2137 1 1
-39 1 1
-8848 0 1
-4806 1 0
-2075 1 0
-16619 41 40
-2338 3 0
-11507 8 0
-1352 0 1
-4596 0 1
-2073 2 1
-28 1 1
-2311 1 1
-44 1 1
-10440 0 4
-894 0 1
-1641 0 96
-38 9 0
-20 1 1
-2706 6 0
-351 1 1
-25 1 1
-742 0 1
-1048 2 18
-12085977 0 1
-14871228 3 0
-29067652 1 1
-47 1 1
-20174307 1292 0
-2548043
-
-chain 14855 chr14 106368585 + 19159713 19190443 chr14 107349540 - 87865807 87904514 64
-20 0 6
-50 9933 9915
-37 16916 24930
-30 3690 3692
-25 27 0
-2
-
-chain 6432 chr14 106368585 + 19179765 19190441 chr22 51304566 + 16377620 16388301 97
-45 10604 10609
-27
-
-chain 7700812247 chr15 100338915 + 18260008 100338915 chr15 102531392 + 20000000 102521392 16
-8448 6 2
-4086 1 0
-9569 1 1
-40 0 5
-56 7 1
-872419 40441 40448
-553 4 4
-876 0 1
-38 1 1
-139 1 1
-23 1 1
-1881 1 1
-17 1 0
-499 8 8
-310 2 2
-25 11 5
-46 1 1
-78 1 1
-22 0 3
-181 5 6
-569 11 11
-539 1 1
-23 0 4
-261 1 1
-19 0 2
-776 13 15
-62 13 13
-860 1 0
-719 26 0
-1346 1 1
-134 0 1
-30 1 1
-1070 1 1
-21 1 1
-398 0 1
-177 5 21
-534 4 0
-770 0 6
-17 1 1
-606 1 1
-31 1 1
-1861 1 1
-53 1 1
-2169 3 0
-558 1 0
-18 1 1
-227 2 0
-13 1 1
-329 5 5
-430 1 1
-17 2 0
-620 0 1
-1112 2 0
-641 0 4
-476 1 1
-45 1 1
-1285 0 1
-1139 1 1
-47 1 1
-183 4 0
-1435 20 0
-176 0 1
-219 0 1
-607 1 1
-42 1 1
-371 2 8
-507 2 0
-66 1 0
-41 1 1
-999 4 4
-318 15 15
-1092 1 1
-72 1 1
-808 5 5
-54 2 2
-52 1 1
-40 1 1
-109 3 3
-47 1 1
-1535 14 0
-14012 4 0
-7954 4 1
-1350 1 0
-318 1 1
-25 1 1
-600 0 4
-442 0 1
-1396 1 1
-36 1 1
-1107 0 3
-1441 0 5
-360 1 1
-47 1 1
-228 10 0
-37 1 1
-497 1 1
-37 1 1
-2129 4 0
-1242 2 0
-478 4 0
-708 1 1
-90 1 1
-154 10 10
-1583 1 1
-31 1 1
-1302 0 37
-101 14 14
-1138 1 1
-83 10 0
-11 7 0
-111 1 1
-29 1 1
-2917 1 1
-32 1 1
-1762 1 1
-46 1 1
-449 1 0
-2458 9 1
-869 1 0
-534 1 1
-47 1 1
-309 1 0
-6358 22 0
-564 0 1
-1845 1 0
-660 1 1
-25 1 1
-68 1 0
-182 0 9
-54 3 18
-1519 1 1
-32 1 1
-559 1 1
-30 1 1
-3851 1 0
-265 8 7
-240 4474 0
-428 1 0
-1651 11 10
-297 1 0
-665 21 0
-48 1 1
-1763 2 0
-245 1 1
-39 1 1
-519 1 1
-31 1 1
-2398 0 6
-749 49 1
-2074 4 0
-701 5 5
-337 1 0
-470 1 1
-43 1 1
-1163 3 0
-1342 1 1
-43 1 1
-140 0 1
-83 1 1
-24 1 2
-37 1 1
-723 1 1
-36 1 1
-99 3 0
-27 1 1
-92 1 0
-80 43 43
-1095 0 13
-384 0 2
-292 1 1
-39 1 1
-101 12 12
-576 0 2
-1907 1 1
-19 1 1
-318 1 0
-1973 1 1
-32 1 1
-689 1 1
-49 1 1
-357 8 8
-2081 13 13
-260 15 15
-2295 1 1
-24 1 1
-2558 1 1
-26 1 1
-571 16 23
-323 0 1
-36 0 1
-5353 111 0
-1711 38 70
-272 13 13
-1284 0 1
-1128 4 4
-2189 1 0
-474 2 0
-1284 61 67
-643 1 1
-37 1 1
-381 0 2
-56 1 0
-2591 1 1
-55 1 1
-160 4 4
-116 1 1
-89 2 0
-316 0 1
-785 20 0
-152 1 1
-21 1 1
-600 0 6
-568 1 0
-278 1 1
-29 1 1
-89 0 4
-1737 1 1
-58 1 1
-368 24 24
-2113 20 24
-218 0 2
-18 1 1
-684 4 4
-3200 1 1
-31 1 1
-58 18 18
-164 1 1
-37 1 1
-296 6 6
-431 1 1
-35 1 1
-431 1 1
-45 1 1
-93 1 1
-24 1 1
-216 1 1
-46 1 1
-2773 0 17
-751 2 1
-104 1 1
-59 1 1
-445 1 1
-26 1 1
-356 1 0
-1484 1 2
-436 25 25
-306 1 1
-55 1 1
-230 4 4
-892 1 0
-364 7 7
-796 1 1
-26 1 1
-663 0 2
-80 0 15
-4391 1 0
-133 1 1
-25 0 4
-41 0 2
-164 1 1
-61 4 4
-925 3 0
-1882 13 13
-4513 1 0
-111 1 1
-76 1 1
-202 6 0
-680 0 1
-200 3 0
-429 0 2
-736 1 1
-18 1 1
-1573 0 1
-119 1 1
-245 0 9
-11 1 1
-1656 54 22
-616 2 1
-158 0 1
-587 1 1
-39 4 1
-1053 6 6
-1116 1 1
-34 1 1
-152 10 7
-448 0 1
-269024 100000 863295
-334079 100000 50000
-180553 0 74
-66 73 3
-40 1 0
-28 156 73
-202 1 1
-17 0 1
-156 1 1
-55 1 1
-111 0 1
-144 1 1
-57 0 1
-687074 50000 50000
-120647 0 348
-45586 0 1
-6994 1 0
-3398063 44008 12354
-7672 0 2
-1809 1 0
-428524 101014 10165
-43170 4 4
-1064959 128966 5086
-1021 0 1
-1710 1 0
-931 0 2
-4505 0 1
-686 525 2
-432 33 0
-58 20 20
-12369 1014 0
-6233 0 1
-359485 100000 111749
-33855821 0 239
-2852113 1 0
-7040367 0 1
-2815738 3 1
-7055922 60000 50000
-363827 32 32
-104991 0 1
-203136 0 6050
-2271 47 47
-1424473 60000 50000
-13510190 22012 5553
-9194 0 3
-109 0 4
-40 0 1
-43 0 7
-2352 0 13
-5027 0 2
-534 1 0
-794 0 2
-4233 0 2
-5769 1 0
-381 1 0
-2524 0 2
-547 0 5
-1967 0 1
-1207 105 0
-1027 0 6
-3935380
-
-chain 4143271 chr15 100338915 + 19154641 19368514 chr15 102531392 + 21901264 22115049 110
-40441 8593 8593
-26 89965 89965
-4257 1 1
-30 1 1
-185 16464 16391
-43 29947 29883
-25 1 1
-34 23835 23884
-25
-
-chain 390135 chr15 100338915 + 26478746 26483022 chr15 102531392 + 28681030 28685306 6048
-1039 22 22
-3215
-
-chain 187810 chr15 100338915 + 26483022 26517556 chr15 102531392 - 73809068 73843318 79
-41 12 0
-36 1 1
-490 5 5
-285 1 1
-71 1 1
-215 1 1
-53 0 12
-8114 1 0
-10796 15 15
-2483 0 1
-20 1 1
-2048 8856 8847
-163 792 517
-33
-
-chain 51529 chr15 100338915 + 26530390 26530949 chr15 102531392 + 28731348 28731907 2473877
-450 8 8
-101
-
-chain 17522 chr15 100338915 + 26516748 26516957 chr15 102531392 + 22658399 22658608 1968
-209
-
-chain 14035 chr15 100338915 + 20378176 20378474 chr15 102531392 + 22829101 22829399 772378
-73 69 69
-156
-
-chain 12347 chr15 100338915 + 26530060 26530390 chr15 102531392 + 22671289 22671619 3189077
-244 4 4
-82
-
-chain 5537 chr15 100338915 + 96402403 96402461 chr15 102531392 + 98585049 98585107 22350382
-58
-
-chain 4486 chr15 100338915 + 96402461 96402508 chr15 102531392 + 98585002 98585049 16761199
-47
-
-chain 2874 chr15 100338915 + 26517060 26517091 chr15 102531392 + 28719096 28719127 6634083
-31
-
-chain 2874 chr15 100338915 + 26517029 26517060 chr15 102531392 + 28719096 28719127 6634084
-31
-
-chain 2874 chr15 100338915 + 26516998 26517029 chr15 102531392 + 28719096 28719127 6634085
-31
-
-chain 2874 chr15 100338915 + 26516967 26516998 chr15 102531392 + 28719096 28719127 6634086
-31
-
-chain 2314 chr15 100338915 + 26530003 26530033 chr15 102531392 + 22671232 22671262 5236
-30
-
-chain 12940492 chr15_random 784346 + 189260 358080 chr15 102531392 + 28561246 28726591 233
-2522 0 1
-3762 1 1
-40 1 1
-2427 6472 2
-1744 0 1
-263 0 7
-2963 4 4
-1889 1 0
-2501 0 1
-3377 6 6
-5238 0 1
-1277 5 5
-38 1 1
-8232 12 8
-5507 0 18
-155 1 0
-379 14 14
-363 7 13
-336 1 1
-46 1 1
-218 8 8
-1074 0 4
-101 12 13
-178 1 1
-93 1 1
-156 10 11
-398 0 20
-45 1 1
-255 9 10
-2661 0 1
-17 1 1
-82 1 1
-14 1 1
-227 64 64
-1154 1 0
-493 1 1
-39 1 1
-369 1 0
-21 1 1
-322 2 7
-222 0 2
-171 15 0
-81 1 1
-47 1 1
-159 9 9
-154 1 0
-272 4 4
-26 1 1
-121 8 7
-659 1 0
-440 1 1
-35 1 0
-1419 15 0
-181 0 2
-292 0 15
-1767 1 1
-44 1 1
-59 0 1
-910 0 1
-290 1 0
-288 1 0
-567 2 0
-1088 0 1
-1758 1 0
-72 1 1
-21 1 1
-5748 17 17
-800 0 1
-2037 13 13
-113 5 5
-2832 1 1
-44 1 1
-3581 2 0
-33 1 1
-812 5 5
-33 0 1
-257 17 17
-1932 0 14
-168 0 1
-424 5 0
-24 1 1
-67 14 14
-90 1 5
-124 1 1
-34 1 1
-48 0 9
-460 0 8
-294 7 0
-813 1 3
-240 1 0
-511 0 9
-190 1 0
-267 1 1
-38 1 1
-1082 7 57
-21 15 0
-28 0 1
-5 1 1
-123 0 5
-781 1 1
-21 1 1
-390 1 1
-36 1 1
-287 1 1
-90 0 3
-6 2 2
-189 9 9
-263 2 1
-724 13 14
-308 2 0
-1752 1 1
-114 1 1
-236 4 0
-46 1 1
-72 5 0
-1039 1 1
-25 1 1
-403 1 1
-22 1 1
-231 6 6
-834 15 15
-617 1 1
-53 1 1
-243 1 1
-154 3 5
-571 11 16
-231 1 1
-47 1 1
-910 1 1
-45 1 1
-1510 1 1
-79 1 1
-2053 1 1
-48 1 1
-768 8 8
-546 1 1
-19 1 5702
-784 6 0
-275 20 13
-131 114 114
-363 1 1
-46 1 1
-396 1 1
-39 1 1
-75 15 15
-1875 1 0
-332 1 1
-49 1 1
-265 3 2
-55 1 1
-96 1 1
-136 1 0
-305 8 8
-297 0 2
-255 2 2
-23 1 1
-181 19 6
-151 0 1
-707 667 9324
-284 5 3
-73 1 1
-208 26 25
-34 0 773
-80 20 0
-2003 400 125
-163 2 0
-2630 9 1
-19 1 1
-100 12 0
-2421 0 2
-47 21227 0
-853 1 0
-1238 0 12
-3571 1 1
-20 0 1
-2483 15 15
-8803 287 9594
-5992
-
-chain 8627768 chr15_random 784346 + 422939 629603 chr15 102531392 - 19338638 19927596 385
-168 56 59
-73 4 4
-378 23 23
-868 29 29
-85 1 0
-528 119 5106
-152 31 31
-184 8 7
-322 0 1
-62 46 45
-77 37 46
-80 22 22
-201 45 47
-175 31 33
-1923 82 77
-546 7051 32690
-7810 209 153340
-1308 1 0
-9826 1 0
-1486 1 1
-148 1 0
-76 6 6
-53 36 34
-178 5447 565
-14 14505 121
-72 13 16
-57 1 1
-157 0 2
-11 1 1
-74 1 1
-24 3 3
-220 1 1
-54 1 1
-142 1 1
-82 2 0
-60 4 0
-99 1 1
-106 1 1
-98 1 1
-402 1 1
-79 4 7
-78 1 9
-5 0 1
-31 7 7
-65 1 1
-105 0 1
-22 6 8
-76 10 8
-47 0 1
-39 3 0
-5 1 3
-108 2 2
-61 16307 40121
-676 26 26
-7087 25 25
-20818 7 7
-2750 60358 90388
-69 54 53
-165 166 516
-42 0 42
-81 4 151
-18 0 42
-148 111 112
-73 4 4
-378 23 23
-868 29 29
-85 1 0
-528 8 8
-280 32 34
-426 78 79
-81 648 334
-181 8 7
-485 0 2
-1404 24 24
-101 36 38
-240 8 8
-77 53 54
-347 18 18
-72 9 9
-94 82 82
-384 8 8
-250 108 151474
-1152 0 1
-633 226 12498
-3255 4 0
-58 32 32
-6209 1 1
-30 1 0
-1060 2 0
-3747 4 4
-173 5 5
-2548 0 22
-2275 0 20
-606 41 41
-4653 12 12
-6138 0 1
-148 5 0
-244
-
-chain 3986761 chr15_random 784346 + 0 334816 chr15 102531392 - 78891064 79878228 248
-30328 8040 15984
-3015 1 0
-70 44499 160931
-52 0 5
-1038 1 1
-29 1 1
-1001 0 18
-680 0 329
-181 1 1
-32 1 1
-839 2 0
-440 0 3
-547 1 0
-278 1 0
-410 1 1
-26 3 0
-101 1 1
-24 1 1
-149 0 9
-179 2 1
-29 1 1
-226 3 0
-21 1 1
-473 10 0
-717 2 0
-1044 1 1
-23 1 1
-625 1 1
-41 1 0
-150 1 1
-62 1 1
-145 59 59
-242 12 12
-179 1 1
-64 1 1
-1405 1 1
-35 0 2
-469 5 0
-401 0 1
-25 0 10
-17 1 1
-55 1 1
-165 1 1
-1966 15 23
-839 0 18
-969 1 1
-44 1 1
-1905 1 1
-47 1 1
-1037 128 128
-486 5 0
-1086 2 1
-199 4 4
-59 2 0
-243 84 0
-410 1 1
-39 1 1
-70 0 324
-77 1 187
-42 4 151
-897 135051 676116
-64 54092 52483
-25 1 1
-88 9286 18277
-201 26614 5202
-33 1 0
-1
-
-chain 2185345 chr15_random 784346 + 423107 689458 chr15 102531392 + 82637661 83186296 482
-30 0 5
-26 1346 1346
-29 885 5865
-31 576 577
-46 77 77
-5 0 1
-32 303 304
-45 175 176
-31 1923 1923
-66 1943 144683
-715 0 1
-548 13 13
-1907 1 1
-16 1 1
-66 3 0
-1219 5 1
-1066 34012 198199
-7204 2446 2446
-2762 100 7680
-5162 1 0
-2782 1 1
-26 7 4
-49 1 1
-3627 3 0
-1686 133598 65296
-3109 1 1
-21 1 1
-1430 63 63
-335 3 3
-14 4 0
-203 1 1
-23 5 5
-1262 4 4
-323 1 1
-47 1 1
-417 0 1
-537 19 1
-1913 2 0
-1685 6 0
-1740 1 1
-49 1 1
-120 1 1
-30 0 3
-920 4 0
-479 30 30
-1207 1 1
-182 4 0
-72 3 1
-78 1 1
-150 1 1
-46 1 1
-222 1 1
-24 1 1
-74 1 1
-44 1 1
-391 1 1
-33 1 1
-149 9 8
-56 1 1
-30 1 0
-52 1 1
-298 6 0
-22 1 0
-29 1 1
-393 35 0
-145 36 36
-226 15 15
-185 7 7
-692 1 1
-34 1 1
-1291 0 2
-1824 5 5
-1119 1 1
-49 1 2
-1025 25013 44930
-835 88 11347
-692 0 2
-2551 3 0
-1144 82 77
-1939 26 28
-164 1 1
-44 0 2
-201 1 1
-133 5 14
-77 1 1
-44 1 0
-92 1 0
-293 8 7
-184 31 31
-381 8 8
-384 1 1
-80 1 1
-94 9 9
-57
-
-chain 1845967 chr15_random 784346 + 61569 84889 chr15 102531392 - 73695594 73766494 782
-153 33 33
-49 1 0
-197 15 15
-67 62 62
-241 12 9
-185 41 44
-64 23 23
-559 50 50
-333 46 46
-397 6 6
-141 4 0
-660 50 50
-315 38 38
-282 309 47864
-57 7 7
-85 39 39
-340 62 62
-43 0 1
-77 0 1
-768 0 12
-71 70 69
-102 17 17
-58 45 50
-676 2 0
-430 21 22
-112 0 1
-401 4 0
-617 95 95
-168 50 50
-442 4 0
-91 114 114
-463 0 1
-94 28 28
-1577 16 16
-572 0 1
-1451 55 55
-2327 51 51
-394 1 0
-109 21 24
-660 50 54
-703 1 0
-93 22 22
-94 48 48
-219 46 46
-352 22 22
-150 155 161
-173 19 19
-162 6 12
-1201 48 49
-119 17 17
-435 4 4
-146 38 38
-946 10 10
-98 37 37
-60 47 47
-579
-
-chain 1297748 chr15_random 784346 + 203918 328028 chr15 102531392 - 73698913 73856126 264
-567 109104 118059
-369 106 23997
-700 2 0
-40 0 248
-320 0 33
-130 1 1
-18 1 1
-138 20 20
-1341 8 0
-863 1 1
-48 1 1
-240 1 1
-34 20 0
-3218 1 1
-20 1 1
-2062 46 46
-285 14 14
-937 1 1
-25 3 3
-305 1 1
-42 1 1
-706 2 0
-232 1 1
-67 1 1
-88 4 5
-844 1 1
-82 1 1
-430 0 7
-78 1 1
-458 27 27
-52
-
-chain 898399 chr15_random 784346 + 457589 504019 chr15 102531392 - 19636589 19905366 626
-5344 14 14
-7167 26767 249114
-26 7087 7087
-25
-
-chain 844102 chr15_random 784346 + 95554 784338 chr15 102531392 + 22730405 27183335 411
-59 9906 9932
-128 2128 2090
-42 1792 637909
-89 10 10
-71 198 198
-122 137 141
-341 29 29
-104 103 103
-395 11 14
-667 6 7
-74 7 0
-178 1 5
-203 9 4
-172 55 55
-791 25 25
-714 19 22
-597 133 133
-142 2 0
-252 0 4
-260 67 67
-41 6 0
-860 29 30
-258 93 95
-1793 11 11
-358 71 70
-242 1 1
-20 1 1
-1308 0 3
-468 0 2
-755 1 1
-81 2 2
-72 3 0
-597 4 4
-492 25 7
-1459 10 9
-674 16 16
-711 1 1
-49 1 1
-1525 1 1
-45 1 1
-2919 1 1
-36 1 1
-493 1 1
-21 1 1
-830 16 0
-3 7 0
-644 17 17
-479 0 1
-2343 0 315
-307 8 311
-87 0 3
-330 42 0
-520 7 6
-72 2 1
-745 6 6
-324 6 0
-398 22 22
-118 27 27
-68 600887 3728395
-44872
-
-chain 555121 chr15_random 784346 + 634265 679702 chr15 102531392 + 82723475 82991213 602
-20 1 1
-41 24204 246463
-2085 6 6
-667 14 14
-596 0 24
-1743 415 422
-870 1 0
-3572 1 1
-1152 8 0
-498 0 1
-3239 1 1
-34 1 1
-1283 1 1
-41 1 0
-676 0 2
-2078 0 1
-1283 0 18
-681 1 0
-223
-
-chain 530253 chr15_random 784346 + 409131 430676 chr15 102531392 - 19567939 19581201 1716
-786 8 0
-171 8918 159
-2113 8268 8752
-1281
-
-chain 417534 chr15_random 784346 + 35735 80744 chr15 102531392 + 23413134 23608954 1095
-840 0 54
-916 0 2
-777 3337 13583
-637 50 57
-858 0 4
-779 0 14
-171 1 2
-927 4 0
-1753 2 0
-814 35 35
-1073 14 14
-81 99 101
-66 42 42
-1291 66 66
-240 45 48
-68 36 36
-98 38 38
-1141 5 5
-70 14 15
-150 46 46
-650 13461 153954
-62 1206 1201
-45 3148 3138
-46 6617 6616
-50 2415 2415
-46 615 621
-64
-
-chain 169648 chr15_random 784346 + 417136 418914 chr5 180915260 + 131590649 131592427 748288
-1778
-
-chain 152639 chr15_random 784346 + 200201 201828 chr15 102531392 + 28662778 28664407 841936
-970 0 1
-468 5 6
-184
-
-chain 151945 chr15_random 784346 + 110737 203590 chr15 102531392 - 73700255 73867708 1083
-74 87238 121334
-88 426 14673
-942 2 0
-567 1880 28137
-86 1 1
-62 1 1
-716 14 14
-212 0 1
-468 0 1
-76
-
-chain 142059 chr15_random 784346 + 583198 664057 chr15 102531392 - 16763491 17663089 651
-176 7 7
-242 7 7
-1002 1 1
-61 1 1
-286 10 10
-1697 57790 716388
-17 1 1
-12 3589 70884
-35 145 145
-36 6576 99374
-431 11 1
-19 0 4
-96 2 0
-98 1 1
-62 1 1
-1047 10 15
-223 1 0
-575 2 0
-465 1 0
-8 1 1
-140 1 4
-65 1 1
-381 5111 5164
-145 1 1
-29 1 6
-32 8 2
-199
-
-chain 140486 chr15_random 784346 + 414032 415531 chr5 180915260 + 131627050 131628561 916856
-486 0 13
-290 2 1
-721
-
-chain 136843 chr15_random 784346 + 411466 412886 chr5 180915260 - 49283520 49284940 941594
-1420
-
-chain 113176 chr15_random 784346 + 577887 601700 chr15 102531392 + 85729223 85793813 754
-51 12 12
-630 1 1
-27 5 5
-51 41 41
-249 505 29710
-148 24 24
-110 0 2
-145 12 11
-646 54 53
-291 404 700
-590 7 0
-154 1 1
-36 5 3
-106 1 1
-42 1 1
-517 181 27
-164 18572 30011
-30
-
-chain 110898 chr15_random 784346 + 410214 411366 chr5 180915260 - 49350156 49351308 1158024
-1152
-
-chain 90718 chr15_random 784346 + 415631 422839 chr5 180915260 - 49281425 49321173 523505
-1405 4191 36723
-57 0 4
-785 0 4
-770
-
-chain 87628 chr15_random 784346 + 412986 413908 chr15 102531392 + 82958289 82959211 1453275
-922
-
-chain 78489 chr15_random 784346 + 408080 408895 chr5 180915260 + 131628738 131629553 1616335
-815
-
-chain 75848 chr15_random 784346 + 328894 334289 chr15 102531392 + 28663807 28669202 22165
-415 0 1
-219 14 14
-716 1 1
-62 1 1
-1820 1 0
-432 1 1
-21 1 1
-549 1 1
-42 1 1
-1098
-
-chain 55946 chr15_random 784346 + 579203 582900 chr15 102531392 - 19568187 19572180 874
-256 1085 1091
-54 291 291
-49 100 396
-255 1464 1453
-62 1 6
-80
-
-chain 50039 chr15_random 784346 + 328288 328894 chr15 102531392 - 73792653 73793260 1678654
-449 99 100
-58
-
-chain 41737 chr15_random 784346 + 53223 55079 chr15 102531392 - 79138743 79140590 1899
-987 5 0
-378 4 0
-30 1 1
-324 1 1
-36 1 1
-89
-
-chain 40184 chr15_random 784346 + 35650 52319 chr15 102531392 + 23578289 23604839 1865
-85 6507 16388
-50 5309 5309
-35 1168 1168
-99 66 66
-42 1291 1291
-66 240 240
-45 68 68
-36 98 98
-38 1380 1380
-46
-
-chain 36402 chr15_random 784346 + 63654 139260 chr15 102531392 + 20712328 20743651 996
-46 46877 2371
-29 5894 5886
-28 261 261
-55 0 3
-35 2163 2163
-70 17110 17298
-32 0 42
-10 2220 2218
-27 68 68
-335 31 31
-315
-
-chain 33407 chr15_random 784346 + 63271 84310 chr15 102531392 + 28567817 28636450 784
-50 2730 50298
-39 1361 1355
-70 2485 2497
-95 168 168
-50 618 618
-33 8782 8789
-48 4472 4485
-38
-
-chain 26884 chr15_random 784346 + 71527 84203 chr15 102531392 + 23434933 23447596 1313
-28 3628 3632
-43 3563 3545
-38 1762 1762
-91 1625 1625
-17 1 1
-30 721 722
-38 1054 1054
-37
-
-chain 17994 chr15_random 784346 + 577754 595591 chr15 102531392 + 82746005 82941680 2345
-133 777 777
-41 8083 152910
-1120 114 33023
-47 1 1
-5 265 681
-66 293 293
-111 2277 2277
-32 585 587
-5 0 1
-25 0 1
-6 1 0
-11 3164 2847
-53 540 540
-82
-
-chain 17584 chr15_random 784346 + 334305 334490 chr15 102531392 - 73868107 73868292 12488910
-185
-
-chain 16638 chr15_random 784346 + 334590 334767 chr15 102531392 + 28693782 28693959 13398527
-177
-
-chain 15574 chr15_random 784346 + 203754 203918 chr15 102531392 + 20713399 20713563 2884965
-164
-
-chain 11941 chr15_random 784346 + 112567 138945 chr15 102531392 + 28572611 28599524 1070
-24 791 791
-25 2119 2124
-57 23331 23861
-31
-
-chain 10106 chr15_random 784346 + 307857 307966 chr15 102531392 - 73812018 73812127 6634519
-109
-
-chain 9879 chr15_random 784346 + 198177 198415 chr15 102531392 + 28709863 28710101 596395
-238
-
-chain 5493 chr15_random 784346 + 34234 34291 chrY 59373566 + 27644447 27644504 32044688
-57
-
-chain 4133 chr15_random 784346 + 323293 323339 chr15 102531392 + 22666870 22666916 2166
-46
-
-chain 4016 chr15_random 784346 + 328237 328288 chr15 102531392 + 28668851 28668902 1790991
-51
-
-chain 3958 chr15_random 784346 + 107733 107775 chr15 102531392 - 78958306 78958348 1193
-42
-
-chain 3427 chr15_random 784346 + 198013 198049 chr15 102531392 + 20714128 20714164 4212128
-36
-
-chain 3014 chr15_random 784346 + 591545 685196 chr15 102531392 - 19431434 19585695 819
-47 89045 149655
-87 4422 4422
-50
-
-chain 2874 chr15_random 784346 + 307826 307857 chr15 102531392 - 73812018 73812049 6634520
-31
-
-chain 2855 chr15_random 784346 + 198147 198177 chr15 102531392 + 28831982 28832012 6776371
-30
-
-chain 2097 chr15_random 784346 + 200178 200201 chr15 102531392 - 79852957 79852980 911500
-23
-
-chain 1855 chr15_random 784346 + 307785 307816 chr15 102531392 + 28688468 28688499 5960032
-31
-
-chain 1291 chr15_random 784346 + 110710 110736 chr15 102531392 - 73822377 73822403 1552683
-26
-
-chain 1093 chr15_random 784346 + 687136 688443 chr15 102531392 - 19508634 19509938 742
-25 1251 1248
-31
-
-chain 7474990131 chr16 88827254 + 0 88822254 chr16 90354753 + 60000 90294753 17
-172342 0 1
-112 1 0
-5627 2 1
-8398838 17500 50000
-25336229 100000 150000
-1112651 9800000 11100000
-42003582 20000 50000
-1855370
-
-chain 9963354 chr16_random 105485 + 0 105485 chr16 90354753 + 29712462 29819360 326
-5589 7 8
-6783 0 218
-41 1 3
-38 1 1
-234 9 9
-219 46 0
-15 0 50
-3818 0 1
-1090 1 1
-45 1 1
-308 1 0
-524 0 4
-984 1 1
-24 1 0
-970 0 2
-106 1 1
-25 2 1
-436 0 5
-296 1 1
-23 2 0
-813 0 1
-1173 1 0
-5500 1 0
-1193 16 16
-1329 0 1
-2727 0 1
-3622 0 13
-3844 3 0
-5076 0 1
-4157 2 0
-178 0 2
-126 1 1
-344 5 6
-497 1 0
-620 7 7
-378 0 1
-669 24 25
-211 1 5
-453 0 11
-176 0 1
-486 0 8
-326 1 0
-2143 40 9
-2337 0 1
-866 1 0
-10 2 2
-1366 1 1
-44 1 1
-831 1 1
-45 1 1
-1612 6 5
-3801 0 1
-910 0 2
-486 0 1
-2775 1 0
-1083 1 0
-1793 1 1
-50 0 1
-1339 0 2
-145 17 17
-651 10 10
-1140 0 1
-724 1 1
-39 1 1
-3261 1 0
-1513 0 9
-606 22 0
-2027 27 19
-3470 11 0
-4100 3 0
-2045 0 4
-1047 0 1
-6647 78 1279
-748
-
-chain 7369813928 chr17 78774742 + 0 78653129 chr17 81195210 + 0 81060000 18
-252627 1 1
-24 1 1
-33 0 29
-566 87 0
-116 58 0
-92 29 0
-79 8 37
-485 1 59
-28 1 1
-76 233 1
-27 29 0
-2764 17 20
-2220 18 18
-837 1 1
-39 1 1
-564 1 1
-14 1 1
-2523 39 9
-1824 0 56
-76 29 0
-1681 0 1
-414 0 3
-256 0 68
-119 10 10
-290 0 4
-3193 1 0
-2562 0 4
-1809 3 0
-84 1 1
-62 1 1
-3703 0 27
-2041 16 0
-911 0 2
-696 4 4
-1428 15 15
-290 1 0
-1779 0 1
-60 1 1
-216 0 1
-375 1 1
-41 0 1
-9221 46522 100000
-3080543 0 1
-1208216 0 2
-1370 2 0
-1279 0 4
-322 0 5
-5661 210 0
-307 21 22
-973 8 0
-2901 1 0
-8479 0 1
-4122 7 0
-3187 4 0
-571 0 1
-167 0 1
-10174 7 7
-856 2 1
-1630 1 0
-4258 3 1
-1688 1 0
-264 0 304
-796 1 0
-8494 0 10
-2273 1 0
-8297 1 0
-1500 1 4
-733 2 2
-40 1 0
-4 0 1
-15 19 1
-64 1 253
-22 0 34
-18 1 205
-2070 2 0
-2981 14 13
-1309 0 1
-3991 3 0
-1939 0 3
-887 0 2
-463 18 0
-64 0 3
-2104 0 20
-556 0 4
-121 0 1
-3670 2 0
-4345 0 5394
-5334 0 1
-2505 4 10
-6776 14 11
-9573 0 1
-1136 0 2
-3754 1 0
-4588 1 0
-637 17 17
-1285 8 0
-369 0 1
-2084 1 0
-492 2 0
-517 0 4
-954 0 2
-1517 1 0
-958 9 0
-807 14 14
-357 0 10
-3611 0 2
-3191 0 39
-742 1 0
-646 2 0
-2211 1 0
-14829 1 0
-3465 11 0
-31 0 33
-833 16 16
-1345 0 1
-6443 5 4
-2627353 1 0
-11581979 0 43
-25 0 89
-238783 0 1
-1830653 1 0
-419873 100008 116477
-5587 6 0
-11056 0 2
-3240 1 0
-1237 0 2
-373 1 1
-43 1 1
-558379 100000 3000000
-1823446 0 1
-2728383 0 1
-29 0 1
-138 1 0
-144 6 8
-38 0 2
-7 0 1
-18 1 1
-70935 10 13
-52 28 31
-189 0 1
-41 2 2
-750363 44 44
-4038953 100000 50000
-1524006 1 1
-47 1 1
-231 2 0
-1175 1 0
-555 1 1
-49 1 1
-568 7 0
-605 2 0
-4954 1 1
-18 6 7
-567 0 1
-421 2 0
-943 75 67
-777 0 3
-925 3 0
-5 4 0
-318 1 0
-230 20 13
-244 1 1
-13 0 1
-42 1 1
-220 1 1
-56 1 1
-101 225 0
-1113 1 0
-17 1 1
-2614 4 0
-3186 50 50
-3872 0 2
-617 14 0
-5674 0 2
-1852 1 1
-63 1 1
-56 1 1
-25 1 1
-332 0 6
-423 5 5
-61 4 0
-108 1 1
-46 1 1
-160 2 2
-72 1 1
-162 1 1
-20 1 1
-53 1 1
-63 1 1
-112 1 1
-59 1 1
-5885 2 0
-255 36 36
-6246 1 1
-114 1 1
-255 1 1
-49 1 1
-210 1 1
-138 157793 28603
-927 5 0
-212 7 7
-641 17 17
-1296 46 46
-2513 71 69
-76 1 2
-61 50226 0
-1959 18 18
-2727 22 22
-6616 1 0
-5109 68 86
-2450 7 7
-50 10 0
-3439 0 4
-4179 0 4
-2749 0 1
-1124 8 0
-56 1 1
-1840 14 14
-624 8 0
-1743 4 0
-3689 0 4
-2051 0 1
-751 0 1
-2111 10 11
-3110 1 0
-682 1 0
-2795 5 2
-241 0 1
-165 1 3
-1258 0 1
-1602 5 0
-3715 0 1
-1308 0 1
-2058 1 0
-1624 0 1
-478 4 0
-9 6 0
-35 3 1
-47 0 1
-2425 1 0
-1178 0 4
-33 1 1
-415 5 5
-887 1 3
-946 29 29
-630 15 0
-259 2 0
-78 0 1
-4570 0 1
-322 1 0
-1801 2 0
-836 3 0
-1509 0 1
-1732 0 1
-935 0 6
-1372 1 0
-625 2 12
-5009 1 1
-75 0 1
-20 1 0
-153 20 21
-489 4 326
-1375 1 0
-774 1 1
-16 1 1
-3642 5 0
-497 4 0
-174 9 0
-1317 0 3
-508 0 1
-1126 1 0
-1952 0 2
-565 2 0
-871 0 1
-1460 6 0
-55 0 1
-420 6 0
-57 1 1
-119 1 1
-427 1 0
-459 14 11
-448 0 1
-1275 7 7
-360 1 0
-73 1 1
-48 1 1
-4920 3 0
-713 41 34
-691 1 1
-44 1 1
-1642 9 10
-566 0 1
-173 0 4
-798 0 10
-810 1 0
-78 18 17
-1531 0 2
-1274 1 1
-39 1 1
-53 3 1
-202 0 1
-707 17 17
-1733 0 1
-14053 3 0
-286 3 1
-5600 4 0
-6458 0 1
-4866371 102000 0
-1870113 257 0
-590050 6 18
-2095 12 12
-24846 1 0
-5154 22 22
-1561 0 4
-5946 1 0
-2317 0 4
-1643 1 1
-27 1 1
-1237 1 0
-2698 1 1
-140 1 1
-1689 0 2
-836 29 30
-5333 1 0
-509 1 0
-5216 6 0
-10782 47 47
-1095 13 3
-1039 0 1
-11605 1 0
-22064 0 1
-16612 8 0
-902 1 0
-757 1 0
-619 0 1
-10979 1 1
-18 1 1
-1517 1 0
-4576 1 0
-12559 4 0
-2725 0 1
-5291 2 0
-8706 0 1
-83 1 0
-424 0 7
-72 38 0
-5528 1 0
-23971 1 0
-7855 54 22
-4095 0 1
-803 5 5
-6382 6 0
-3545 0 28
-4265 0 2
-13194 6 6
-6463 1 0
-26075 1 1
-59 1 1
-10791 17 7
-707 0 1
-210 1 0
-1655 0 2
-5301 1 0
-1930 1 0
-14632 2 0
-1043 1 0
-3607 3 0
-312 0 1
-5953 2 0
-170 0 17
-489 0 1
-5260 0 28
-888 10 0
-2461 10 10
-237 2 0
-1716 3 1
-10691 0 4
-3757 1 0
-6173 0 1
-8017 1 2
-3594 0 4
-5439 0 1
-4138 28 57
-6418 0 1
-1267 1 0
-720 0 6
-1083 2 0
-3878 0 1
-3310 23 23
-4349 1 1
-44 1 1
-3135 0 1
-174853 1 2
-2008 7 7
-5657 0 1
-6496 0 3
-89 0 5
-665 0 1
-954 46 46
-375 7 8
-1248 28 28
-2041 0 2
-2753 1 0
-1863 0 3
-3228 1 0
-3575 0 4
-40 1 1
-6488 0 2
-8612 11 11
-3795 0 16
-2105 0 1
-268 1 1
-22 3 0
-7889 4 0
-701 4 0
-2411 28 34
-2943 2 3
-8420 1 0
-926 0 324
-6732 1 0
-543 4 3
-4028 2 0
-51 52 40
-3000 1 0
-530 1 0
-2083 0 2
-1173 0 17
-119 16 16
-2727 1 0
-543 0 1
-783 1 0
-1372 0 4
-8624 20 0
-278 44 44
-4364 51 50
-2856 0 1
-5399 0 1
-1506 1 0
-919 0 6
-7229 10 0
-3225 1 0
-435 1 0
-2814 47 47
-1577 0 132
-9785 0 1
-2035 6 0
-7655 1 0
-198207 0 132
-11704 0 5
-7648 1 0
-9062 4 0
-8778 0 2
-7014 1 0
-1613 0 2
-790 7 5
-7433 1 0
-6482 12 12
-6798 0 1
-1422 1 0
-3454 1 1
-43 1 1
-3097 0 2
-334 0 18
-1444 1 0
-2400 3 0
-3272 0 1
-9106 1 0
-1573 0 1
-4742 1 0
-3366 1 0
-5484 0 1
-2444 0 5
-5448 8 8
-2539 0 1
-1471 0 1
-238 1 1
-16 1 1
-288 5 5
-2995 0 2
-951 1 1
-35 1 1
-279 16 15
-3534 6 0
-3513 0 1
-163 0 1
-6173 0 1
-1074 1 0
-2818 1 0
-2868 0 1
-3796 1 0
-1118 1 167
-1278267 25 25
-10747172 0 217
-3504877 0 1053
-10844 13 11
-18805 1 0
-1960834 126729 50000
-3065 1 0
-3601036 90008 8833
-34292 1 0
-1834 0 44
-3083 1 1
-43 1 1
-789 1 0
-11432680 153000 50000
-1902015 0 4098
-99 0 21
-3183 6 6
-877 1 1
-49 1 1
-296 0 1
-1375 1 1
-21 1 1
-607 5 5
-98 0 22
-6811 1 1
-17 0 11
-3804 1 0
-1356 1 1
-29 1 1
-297 1 0
-9543 0 2
-3130 0 4
-861 0 1
-27346 1 0
-7547 8 6
-2834 0 2
-394 4 0
-6524 1 0
-405 11 8
-1128 7 0
-271 1 1
-21 0 28
-507 6 0
-1211 44 31
-384 0 3
-521 18 18
-395 11 0
-799 1 1
-25 3 2
-51 1 49
-49 1 1
-558 0 1
-351 1 0
-2779 13 13
-114398 65008 82124
-7795 0 1
-18 1 1
-4140 1 0
-28048 1 1
-32 1 1
-4630 1 0
-4573 3 0
-357 2 0
-4812 1 0
-14372 0 3
-203 0 1
-26257 1 0
-2734 0 2
-19262 5 5
-5022 0 1
-25471 0 1
-1114538 0 53
-82 126 0
-1416 16 16
-629 57 0
-463 1 0
-148 1 1
-24 1 1
-2322 1 1
-23 1 0
-725 0 16
-24 16 0
-95 9 9
-1277 0 1
-2498 0 1
-354 49 0
-41 0 50
-17 0 49
-37 0 49
-65 8 152
-906 0 47
-234
-
-chain 3352932 chr17 78774742 + 33364384 33585329 chr17 81195210 - 44852585 44945131 363
-36 7017 7017
-2072 1 1
-16 1 1
-2167 2 0
-2513 1 1
-44 1 1
-1296 17 17
-860 5 0
-1482 0 11
-3433 1 1
-18 1 1
-393 0 3
-198 19 18
-1850 4 5
-267 1 0
-1125 6 7
-1255 1 0
-1502 0 1
-37 0 1
-26 0 1
-302 0 1
-1164 4 2
-1145 8 8
-1170 0 1
-298 1 2
-330 1 0
-2433 13 13
-79 0 2
-5343 1 1
-26 1 1
-994 1 3
-943 0 3
-2485 1 1
-22 1 1
-1574 129212 0
-265 54 54
-5225 26 26
-995 36 36
-240 1 0
-5900 61 61
-112 65 65
-53 14 14
-150 95 95
-160 48 48
-108 70 66
-401 0 6
-354 27 27
-56 65 65
-716 5 3
-1097 4 0
-518 27 27
-944 11 11
-579 37 37
-614 1 0
-2967 12 0
-601 1 10
-1307 35 35
-1719 0 889
-1973 0 3
-709 2 0
-496 5 1
-185 11 11
-98 1 0
-724 3 0
-2103 0 5
-1038 0 1
-257 7 0
-231 1 0
-312 0 2
-423 6 6
-520 10 13
-294 1 0
-17 1 1
-413 4 0
-1698 1 1
-46 1 1
-597 1 1
-21 1 1
-1182 0 2
-50 1 1
-44 0 2
-34 66 3
-3318 3 0
-624 7 0
-507 0 1
-60 1 1
-49 1 1
-332 1 1
-38 1 1
-77 1 1
-19 1 1
-65 1 0
-1174 5 0
-76
-
-chain 1309281 chr17 78774742 + 33410392 33424757 chr17 81195210 + 36336024 36350387 1779
-203 116 116
-6522 2 0
-5195 584 584
-1743
-
-chain 421642 chr17 78774742 + 33424760 33429230 chr17 81195210 - 44789041 44793512 103557
-258 1 0
-320 0 1
-3477 0 1
-414
-
-chain 288364 chr17 78774742 + 33534894 33553104 chr17 81195210 + 60335980 60353933 1564
-39 403 82
-124 31 31
-264 17 18
-283 79 89
-146 36 36
-392 27 27
-75 32 32
-295 106 106
-170 1 0
-69 35 35
-148 57 57
-152 23 23
-96 16 16
-594 57 58
-172 87 87
-108 39 39
-156 68 68
-148 63 63
-54 9 9
-39 289 289
-30 13136 13189
-45
-
-chain 141893 chr17 78774742 + 38701721 38703214 chr17 81195210 + 41346194 41347687 907641
-1493
-
-chain 138910 chr17 78774742 + 59795041 59797994 chr3 198022430 + 46191235 46194190 927459
-65 140 139
-77 32 32
-50 53 53
-51 108 111
-72 86 86
-65 76 76
-109 74 74
-120 2 0
-121 111 111
-69 23 23
-101 39 39
-56 40 40
-294 20 20
-65 100 100
-105 124 124
-147 116 116
-64 108 110
-70
-
-chain 73899 chr17 78774742 + 33536708 33552896 chr17 81195210 + 36333128 36349315 1571
-27 75 75
-32 306 306
-95 240 240
-35 148 148
-57 881 881
-57 172 172
-87 108 108
-39 156 156
-68 148 148
-63 6667 6667
-36 6153 6152
-49 112 112
-64 239 239
-74
-
-chain 29385 chr17 78774742 + 33422514 33422962 chr17 81195210 + 60352539 60352987 2653
-73 72 72
-133 53 53
-117
-
-chain 28843 chr17 78774742 + 33535172 33536316 chr17 81195210 + 34740000 34741144 3516
-164 124 124
-31 564 564
-79 146 146
-36
-
-chain 23419 chr17 78774742 + 40573363 40573608 chr17 81195210 - 37977034 37977279 7093437
-245
-
-chain 22267 chr17 78774742 + 59795106 59797450 chr15 102531392 + 100960318 100962666 927477
-74 509 513
-86 250 250
-74 1061 1061
-100 108 108
-82
-
-chain 19110 chr17 78774742 + 33422430 33422845 chr17 81195210 + 34807497 34807912 5737
-84 73 73
-72 133 133
-53
-
-chain 15302 chr17 78774742 + 59872221 59872543 chrX 155270560 + 133327972 133328295 14745200
-91 145 146
-86
-
-chain 15089 chr17 78774742 + 33553212 33554185 chr17 81195210 + 34758015 34758988 3454
-70 755 755
-27 56 56
-65
-
-chain 12559 chr17 78774742 + 41846587 41875489 chr17 81195210 + 44708735 44737620 783
-44 4372 4365
-43 24396 24386
-47
-
-chain 12028 chr17 78774742 + 253252 253513 chr17 81195210 + 253455 253745 1186280
-87 116 116
-26 30 59
-2
-
-chain 9840 chr17 78774742 + 59850421 59850563 chr12 133851895 - 30785452 30785594 23191844
-56 27 27
-59
-
-chain 8117 chr17 78774742 + 33410595 33410681 chr17 81195210 + 34744635 34744721 10477
-86
-
-chain 7470 chr17 78774742 + 59872141 59872220 chr8 146364022 - 25940938 25941017 21166303
-79
-
-chain 6548 chr17 78774742 + 59823421 59823489 chr9 141213431 + 108396482 108396550 29214974
-68
-
-chain 6212 chr17 78774742 + 33601781 33601849 chr17 81195210 + 34807429 34807497 5781
-68
-
-chain 6147 chr17 78774742 + 33578902 33578968 chr17 81195210 + 34784578 34784649 3380
-29 0 5
-37
-
-chain 5883 chr17 78774742 + 33556525 33558123 chr17 81195210 + 34761324 34762919 3874
-27 1534 1531
-37
-
-chain 5739 chr17 78774742 + 59862459 59862519 chr13 115169878 + 43436593 43436653 31343618
-60
-
-chain 5729 chr17 78774742 + 59852430 59852489 chr7 159138663 - 42785228 42785287 31366016
-59
-
-chain 5493 chr17 78774742 + 254397 254454 chr17 81195210 + 254136 254193 32044913
-57
-
-chain 5493 chr17 78774742 + 254339 254396 chr17 81195210 + 254136 254193 32044914
-57
-
-chain 4633 chr17 78774742 + 59795405 59797489 chr7 159138663 + 22571262 22573349 985966
-53 1992 1995
-39
-
-chain 3684 chr17 78774742 + 59871978 59872017 chr5 180915260 + 67132991 67133030 32368210
-39
-
-chain 3604 chr17 78774742 + 59872312 59872350 chr6 171115067 + 73766967 73767005 18649321
-38
-
-chain 3578 chr17 78774742 + 59797823 59797921 chr9 141213431 - 46000791 46000889 1219359
-98
-
-chain 3496 chr17 78774742 + 59872079 59872141 chrX 155270560 - 52661918 52661980 17303862
-62
-
-chain 3063 chr17 78774742 + 59796390 59796453 chr18 78077248 + 3738092 3738155 1007405
-63
-
-chain 2832 chr17 78774742 + 78651772 78651801 chr17 81195210 + 81058451 81058480 35013371
-29
-
-chain 2507 chr17 78774742 + 254312 254338 chr17 81195210 + 254167 254193 28153285
-26
-
-chain 2327 chr17 78774742 + 253481 253511 chr17 81195210 + 253858 253888 2965414
-30
-
-chain 2229 chr17 78774742 + 59795509 59795562 chr9 141213431 + 99971007 99971060 1163412
-53
-
-chain 2158 chr17 78774742 + 59871912 59871978 chr10 135534747 - 7120285 7120351 17475521
-66
-
-chain 2116 chr17 78774742 + 41755737 41755765 chr17 81195210 - 18330211 18330239 723
-28
-
-chain 2038 chr17 78774742 + 59872018 59872072 chr12 133851895 - 60047857 60047911 21673207
-54
-
-chain 1971 chr17 78774742 + 33410681 33410711 chr17 81195210 + 58084086 58084116 2335
-30
-
-chain 1910 chr17 78774742 + 59797697 59797752 chr7 159138663 - 95523915 95523970 1276958
-55
-
-chain 1797 chr17 78774742 + 59795569 59795617 chr8 146364022 - 39560190 39560238 1234503
-48
-
-chain 1764 chr17 78774742 + 59795840 59795881 chr17 81195210 - 78142303 78142344 1077161
-41
-
-chain 1713 chr17 78774742 + 59797636 59797671 chr10 135534747 - 112842234 112842269 1000659
-35
-
-chain 1680 chr17 78774742 + 59795180 59795214 chr3 198022430 + 108471362 108471396 1315432
-34
-
-chain 1591 chr17 78774742 + 59795881 59795916 chrX 155270560 - 139019545 139019580 1025236
-35
-
-chain 1456 chr17 78774742 + 59796656 59796685 chr6 171115067 + 121488440 121488469 989186
-29
-
-chain 1332 chr17 78774742 + 33532356 33535172 chr17 81195210 + 34572150 34574966 5130
-25 2722 2722
-69
-
-chain 1250 chr17 78774742 + 59795215 59795246 chr11 135006516 - 104930893 104930924 1222490
-31
-
-chain 1089 chr17 78774742 + 59795324 59795355 chrX 155270560 - 141145732 141145763 1311664
-31
-
-chain 1006 chr17 78774742 + 59797671 59797695 chrX 155270560 + 72606434 72606458 1154867
-24
-
-chain 622 chr17 78774742 + 33334125 33344374 chr17 81195210 - 46414201 46424210 397
-69 10130 9890
-50
-
-chain 20335446 chr17_random 2617613 + 224588 1377183 chr17 81195210 - 41910550 46712950 133
-1433 3 0
-976 0 1
-281 0 1
-1231 0 14
-2584 0 15
-2816 1 0
-3815 1 0
-122 1 1
-25 1 1
-335 0 1
-4687 29 0
-68 0 1
-1769 32 0
-616 3 0
-1017 1 1
-35 1 1
-864 17 17
-321 4 4
-47 1 1
-6467 8 10
-746 1 0
-188 30 0
-179 14 14
-120 1 1
-19 1 1
-477 1 1
-25 1 1
-300 5 5
-33 4 4
-968 6 6
-1546 1 1
-39 1 1
-66 1 1
-92 1 1
-349 12 12
-839 3 3
-36 1 1
-654 1 1
-88 1 1
-647 3 0
-993 10 8
-296 0 12
-183 4 4
-385 1 1
-25 1 1
-405 1 1
-29 1 1
-108 1 1
-36 1 1
-57 1 1
-88 2 1
-78 4 4
-39 1 1
-133 1 1
-133 1 1
-162 1 8
-398 14 14
-52 16 16
-122 1 1
-56 1 1
-98 1 1
-25 1 1
-332 1 1
-48 1 1
-83 0 1
-25 1 1
-71 1 1
-71 1 1
-79 4 0
-87 1 1
-207 1 1
-70 1 1
-263 16 16
-143 1 1
-72 1 1
-198 0 1
-1062 104 0
-6 61 0
-278 8 8
-454 49 49
-297 0 1
-1271 1 1
-48 1 1
-85 1 1
-66 1 1
-89 1 0
-327 1 1
-61 1 1
-51 1 1
-25 2 2
-72 1 1
-80 1 1
-132 1 1
-136 4 4
-63 1 1
-47 1 1
-134 1 1
-28 1 1
-1004 1 1
-45 1 1
-2017 1 1
-22 1 1
-778 8 0
-3805 0 4
-3884 1 0
-1082 1 1
-39 1 1
-926 1 0
-12182 105 0
-19079 4 0
-108 0 6
-81968 13 12
-5894 126 0
-5069 696334 2698100
-65 1 1
-31 0 1
-165 15 0
-2504 0 2
-1155 0 10
-463 1 0
-2422 0 1
-90 10 0
-75 0 1
-397 0 1
-64 31 32
-1531 4 0
-2064 0 1
-1305 1 0
-1045 0 1
-1972 0 1
-3554 0 2
-428 1 0
-1541 10 12
-1808 1 0
-1758 0 1
-500 1 0
-737 1 0
-218 0 1
-2132 0 1
-744 0 1
-7456 2 0
-45 0 2
-2311 23 23
-727 0 2
-916 1 0
-360 5 5
-2956 0 1
-3263 3 0
-1460 1 1
-34 1 1
-117 1 0
-1852 10 0
-50 7 7
-3949 42 42
-528 40 40
-736 100 17954
-680 119199 29667
-516 22 22
-2397 100 1694896
-1291 0 4
-232 1 1
-32 1 1
-1529 0 4
-20 2 0
-42 0 2
-94 0 10
-402 1 1
-16 1 1
-1099 1 1
-49 1 1
-2223 32 32
-1530 36 36
-1563 57608 84063
-160 94 94
-164 108 108
-123 61 61
-136 449 449
-3509 28 28
-1092 1 0
-611 1 1
-28 1 1
-2932 1 1
-52 49 45
-64 1 1
-27 1 1
-1320 1074 0
-6819 0 1
-4716
-
-chain 16836081 chr17_random 2617613 + 2022361 2536424 chr17 81195210 + 77630507 81150656 169
-143 0 4
-116 4 4
-74 12 10
-298 1 0
-533 1 0
-340 27 27
-130 16 16
-184 15 14
-699 1 0
-68 1 0
-153 1 0
-1835 1 0
-5 2 0
-95 1 0
-105 6 4
-14 1 0
-10 1 0
-88 1 0
-63 1 0
-27 1 0
-37 1 0
-18 1 0
-75 1 0
-49 2 0
-366 1 0
-206 1 0
-114 1 0
-237 1 0
-265 16 12
-223 1 0
-182 1 0
-26 1 0
-34 1 0
-138 1 0
-170 1 0
-26 1 0
-16 1 0
-53 4 2
-85 1 0
-188 1 0
-107 1 0
-31 1 0
-180 1 0
-4 2 1
-4 1 0
-16 1 0
-21 1 0
-324 1 0
-106 2 0
-46 1 0
-74 1 0
-12 1 0
-557 2 0
-194 5 2
-23 1 0
-67 6 3
-7 1 0
-50 1 0
-143 1 0
-190 1 0
-24 1 0
-310 1 0
-204 1 0
-108 1 0
-15 1 0
-212 1 0
-3 1 0
-57 4 2
-44 1 0
-298 1 0
-38 1 0
-54 1 0
-112 1 0
-20 2 0
-79 1 0
-10 6 3
-12 1 0
-59 1 0
-51 1 0
-234 2 0
-43 1 0
-194 1 0
-5 1 0
-96 9 4
-67 2 0
-270 1 0
-13 1 0
-59 1 0
-54 1 0
-57 1 0
-375 1 0
-50 1 0
-87 1 0
-83 4 2
-234 4 2
-44 1 0
-24 7 4
-25 1 0
-44 1 0
-139 1 0
-201 12 9
-215 1 0
-5 1 0
-30 1 0
-43 1 1
-54 16 13
-210 1 0
-109 2 0
-55 1 0
-14 1 0
-126 1 0
-79 1 0
-326 1 0
-18 1 0
-150 1 0
-13 1 0
-85 1 0
-47 1 0
-16 1 0
-41 1 0
-43 5 3
-56 1 0
-62 1 0
-164 1 0
-108 1 0
-20 2 0
-137 1 0
-214 1 0
-14 1 0
-5 2 0
-60 5 3
-24 1 0
-72 2 0
-25 1 0
-23 1 0
-60 1 0
-53 1 0
-15 1 0
-145 1 0
-337 1 0
-112 1 0
-39 1 0
-234 1 0
-7 2 0
-108 1 0
-19 1 0
-150 1 0
-22 5 3
-221 1 0
-30 1 0
-195 1 0
-126 1 0
-116 1 0
-189 1 0
-231 1 0
-87 2 0
-136 2 0
-69 1 0
-350 1 1
-29 1 0
-76 1 0
-42 1 0
-10 3 1
-63 1 0
-168 1 0
-97 1 0
-11 1 0
-291 1 0
-150 1 0
-10 1 0
-141 15 12
-9 1 0
-35 1 1
-57 1 0
-9 2 0
-211 1 0
-193 1 0
-51 1 0
-337 1 0
-94 1 0
-9 1 0
-58 1 0
-152 1 0
-58 1 0
-127 1 0
-6 1 0
-65 1 0
-379 1 0
-93 1 0
-11 1 0
-106 1 0
-545 1 0
-11 1 0
-66 2 0
-28 1 0
-242 4 2
-32 8 5
-373 10 9
-242 1 0
-207 1 0
-51 1 0
-132 1 0
-118 1 0
-19 2 0
-116 1 0
-16 1 0
-23 1 0
-54 1 0
-67 1 0
-62 1 0
-52 10 7
-15 2 0
-33 1 0
-248 1 1
-27 1 0
-122 1 0
-25 1 0
-55 1 0
-141 1 0
-57 1 0
-45 1 0
-21 1 0
-66 4 2
-23 1 1
-234 1 1
-25 2 2
-56 1 0
-34 1 0
-12 1 0
-11 1 0
-5 1 0
-54 1 0
-16 1 0
-64 1 0
-361 1 1
-24 1 0
-111 1 0
-12 1 0
-74 1 0
-56 1 0
-43 1 0
-21 1 0
-8 1 0
-13 2 0
-34 1 0
-59 1 0
-79 1 0
-159 1 0
-69 2 0
-15 2 0
-8 1 0
-142 19 17
-302 1 0
-49 1 0
-114 1 0
-72 1 0
-38 1 0
-16 1 0
-39 1 0
-106 1 0
-16 3 1
-31 1 0
-5 1 0
-43 1 0
-120 1 0
-16 1 0
-82 1 0
-47 4 1
-10 6 3
-59 1 0
-10 1 0
-258 1 0
-97 14 13
-72 1 0
-126 1 0
-14 1 0
-92 1 0
-406 1 0
-194 1 0
-43 1 0
-30 1 0
-50 1 0
-8 1 0
-161 6 4
-39 1 0
-12 1 1
-60 1 0
-61 1 0
-23 1 0
-13 1 0
-41 2 0
-260 1 0
-144 1 0
-38 1 0
-45 1 0
-17 1 0
-73 1 0
-64 20 13
-25 1 0
-84 1 0
-42 11 6
-180 1 0
-32 2 0
-172 0 1
-65 1 0
-53 1 0
-39 3 1
-203 1 0
-16 3 1
-42 3 2
-27 6 4
-13 1 0
-99 1 0
-34 4 2
-511 1 0
-182 1 0
-230 8 3
-42 1 0
-16 1 1
-270 5 4
-13 1 0
-141 1 0
-100 1 0
-144 1 0
-146 1 0
-356 1 0
-99 1 0
-69 2 0
-146 1 0
-55 18 14
-54 7 4
-18 1 0
-170 2 0
-45 1 0
-13 1 0
-628 1 0
-93 1 0
-46 1 0
-131 1 0
-20 1 0
-98 1 0
-20 1 1
-355 0 2
-88 1 0
-121 1 0
-31 1 0
-27 1 0
-132 1 0
-64 1 0
-43 1 0
-30 1 0
-95 1 0
-22 1 0
-44 6 3
-20 1 0
-138 1 0
-198 1 0
-100 1 0
-163 1 0
-6 1 0
-155 1 0
-79 1 0
-34 1 0
-193 1 0
-159 1 0
-50 5 3
-30 1 0
-9 1 0
-115 1 0
-93 1 0
-54 1 0
-91 1 0
-336 1 0
-134 18 13
-126 1 0
-61 1 0
-133 1 0
-613 4 2
-244 1 0
-586 1 0
-5 1 0
-93 19 16
-148 6 3
-12 2 1
-20 1 1
-138 102 11399
-572 8 6
-529 1 0
-659 1 1
-35 1 0
-191 2 0
-56 1 0
-105 1 0
-18 1 0
-226 1 0
-59 15 16
-275 1 0
-87 1 0
-5 1 0
-85 1 0
-21 1 0
-71 1 0
-507 1 0
-21 3 1
-82 1 0
-32 1 0
-39 1 1
-312 1 0
-263 1 0
-196 5 3
-23 5 3
-275 1 0
-46 2 0
-154 0 6
-229 1 0
-27 1 0
-87 1 0
-5 2 0
-502 1 0
-97 105 101
-162 1 0
-114 1 0
-65 1 1
-43 1 0
-217 1 0
-14 1 0
-172 1 0
-326 1 0
-9 1 0
-446 1 0
-73 1 0
-245 2 0
-114 1 0
-237 1 0
-35 22 13
-318 1 0
-320 1 0
-76 1 1
-54 1 0
-44 1 1
-100 1 0
-30 0 1
-462 1 0
-22 1 1
-72 1 1
-121 1 0
-37 1 0
-22 5 0
-23 1 1
-154 1 0
-63 1 1
-87 1 0
-278 1 0
-36 1 1
-230 1 0
-182 3 1
-51 1 0
-7 1 0
-101 1 0
-39 1 0
-17 1 0
-55 1 0
-13 1 0
-114 1 0
-13 1 0
-24 1 1
-69 10 9
-171 1 0
-60 1 1
-77 1 1
-8 2 1
-25 1 0
-51 1 0
-327 1 0
-105 2 0
-133 0 1
-28 1 0
-67 1 0
-119 4 2
-334 1 0
-37 2 1
-47 1 0
-165 1 0
-29 1 0
-35 1 0
-46 1 0
-9 1 0
-657 1 0
-62 1 0
-171 1 0
-17 1 0
-113 1 0
-15 1 1
-123 1 1
-62 1 0
-4 1 1
-288 21 0
-809 0 1
-22 1 0
-61 1 0
-52 1 0
-25 2 0
-263 3 1
-35 1 0
-192 238701 2061422
-87 1 0
-6 1 0
-1080 1 0
-76 1 0
-1007 1 0
-98 1 0
-35 1 0
-134 1 0
-285 1 0
-33 0 1
-225 1 0
-281 1 0
-108 1 0
-55 1 0
-107 1 0
-202 15 12
-111 1 0
-36 2 0
-25 1 0
-202 1 0
-97 1 0
-143 1 1
-21 1 0
-222 1 0
-41 1 0
-492 0 4
-594 1 0
-181 1 0
-410 1 0
-37 1 0
-13 1 0
-34 1 0
-76 38 37
-204 27 27
-204 40 32
-432 1 0
-143 1 0
-271 1 0
-224 96 91
-385 1 0
-337 1 0
-375 1 0
-139 22 17
-297 1 0
-72 1 0
-5 2 0
-193 1 0
-8 1 0
-28 1 0
-17 1 0
-17 1 0
-445 1 0
-169 1 36
-35 3 1
-425 1 0
-41 1 0
-37 1 0
-79 1 0
-100 1 0
-130 1 0
-419 1 0
-17 1 1
-284 3 1
-56 1 0
-9 2 1
-655 1 0
-158 2 0
-8 1 0
-34 1 1
-519 1 0
-39 1 0
-78 1 0
-216 1 0
-3 1 0
-68 1 0
-56 1 0
-70 1 0
-290 0 4
-46 0 2
-108 0 2
-23 0 114
-830 1 0
-136 76 98
-63 65 64
-380 1 0
-106 1 1
-358 1 0
-64 1 1
-17 1 0
-171 5 3
-27 1 1
-130 13 10
-131 1 0
-415 1 0
-5 1 0
-37 1 0
-29 1 0
-27 1 0
-750 1 0
-249 1 0
-221 1 0
-109 1 0
-50 1 0
-323 1 0
-296 1 0
-383 1 0
-67 1 0
-239 2 0
-248 1 0
-9 1 0
-180 1 0
-241 1 0
-40 3 1
-6 1 0
-19 1 0
-27 1 0
-166 1 0
-80 1 0
-163 1 0
-33 1 0
-9 1 0
-172 1 0
-261 1 0
-200 1 0
-14 6 2
-121 1 0
-37 4 2
-74 1 0
-97 5 3
-10 2 1
-51 1 0
-642 1 0
-317 14 11
-163 3 1
-25 2 0
-875 1 0
-128 1 0
-211 8 4
-409 1 0
-233 1 0
-263 1 0
-12 1 0
-73 1 0
-188 1 0
-96 1 0
-183 1 0
-126 1 0
-235 1 1
-68 0 1
-618 1 0
-13 1 0
-73 1 0
-1315 883 57
-78 2 2
-774 1 0
-21 1 0
-13 1 0
-9 2 0
-168 1 0
-214 1 0
-84 3 1
-645 1 0
-150 1 0
-72 1 0
-8 1 0
-108 1 0
-120 1 0
-1469 1 0
-38 1 0
-697 1 0
-44 1 0
-345 1 0
-126 1 0
-46 1 0
-110 1 0
-972 1 0
-104 23 22
-93 2 2
-38 1 0
-34 3 1
-730 1 0
-151 1 0
-124 1 0
-210 1 0
-60 1 0
-227 1 0
-122 1 0
-225 2 0
-26 1 0
-85 1 0
-84 6 3
-408 1 0
-5 3 1
-18 1 0
-69 1 0
-76 1 0
-122 1 0
-288 1 0
-10 1 0
-55 1 0
-22 2 0
-455 1 0
-246 1 0
-37 1 0
-153 1 0
-27 1 0
-101 1 0
-158 1 0
-107 1 0
-437 1 0
-31 1 0
-149 1 0
-121 1 0
-5 1 0
-175 1 0
-76 1 0
-75 1 0
-26 2 0
-98 1 0
-169 1 0
-82 1 0
-20 1 0
-326 1 0
-274 1 0
-78 1 0
-42 1 0
-64 1 0
-11 7 4
-39 1 0
-91 1 0
-140 1 0
-397 14 12
-500 7 4
-879 5 2
-448 1 0
-42 1 0
-522 1 0
-247 1 0
-484 1 0
-689 1 0
-66 1 0
-198 1 0
-441 1 0
-143 1 0
-35 1 0
-84 1 0
-9 1 0
-445 1 0
-110 1 0
-204 1 0
-31 1 0
-77 1 0
-54 1 0
-213 1 0
-601 1 0
-25 1 0
-239 2 2
-42 1 0
-29 2 0
-15 1 0
-175 1 0
-611 1 0
-418 1 0
-191 1 0
-295 1 0
-30 8 5
-609 1 0
-372 1 0
-154 2 0
-117 1 0
-282 1 0
-360 1 0
-750 1 0
-402 1 0
-45 1 0
-678 1 0
-17 1 0
-117 1 0
-148 1 0
-164 3 1
-51 1 0
-65 1 0
-452 1 0
-1443 1 0
-142 1 0
-509 1 0
-92 10 6
-264 1 0
-69 1 0
-78 1 0
-43 1 0
-164 1 0
-349 1 0
-117 1 0
-373 1 0
-235 1 0
-160 1 0
-8 1 0
-263 1 0
-15 1 0
-23 1 0
-151 1 0
-100 1 0
-204 1 0
-250 1 0
-33 3 1
-272 1 0
-262 1 0
-55 1 0
-519 1 0
-251 1 0
-189 1 0
-459 1 0
-183 1 0
-295 1 0
-552 1 0
-94 16 12
-259 1 0
-30 1 0
-396 1 0
-17 1 0
-72 1 0
-56 1 0
-90 1 0
-106 1 0
-19 2 0
-271 1 0
-448 1 0
-628 497 497
-254 26 26
-391 1 0
-32 1 0
-171 1 0
-126 20 17
-94 1 0
-446 1 0
-30 1 0
-96 1 0
-17 1 0
-159 1 0
-390 1 0
-105 1 0
-94 1 0
-5 2 0
-21 1 0
-22 1 0
-380 1 0
-12 1 0
-211 1 0
-377 1 0
-3 1 0
-63 1 0
-37 2 2
-1596 1 0
-638 1 0
-30 1 0
-665 13 10
-32 1 0
-102 1 0
-361 1 0
-609 1 0
-590 1 0
-1189 29 29
-345 1 0
-732 1 0
-544 1 0
-272 1 0
-725 1 0
-198 1 0
-8 1 0
-275 1 0
-95 1 0
-101 1 0
-626 1 0
-154 1 0
-242 1 0
-937 1 0
-142 1 0
-236 1 0
-456 12 9
-77 1 0
-189 1 0
-172 1 0
-201 1 0
-417 1 0
-179 1 0
-141 1 0
-219 1 0
-164 1 0
-138 1 0
-500 2 0
-263 1 0
-48 1 0
-17 1 0
-91 1 0
-169 1 0
-8 1 0
-185 1 0
-48 1 0
-345 1 0
-546 2 2
-229 2 2
-614 1 0
-73 2 2
-129 1 0
-91 1 0
-287 3 1
-504 2 0
-264 22 22
-508 1 0
-1324 1 0
-1313 1 0
-36 1 0
-346 1 0
-285 5 2
-31 1 0
-6 1 0
-133 1 0
-27 1 0
-101 1 0
-249 1 0
-68 5 3
-34 1 0
-31 1 0
-140 1 0
-350 1 0
-312 1 0
-139 1 0
-66 1 0
-24 1 0
-37 1 0
-16 1 0
-32 1 0
-204 1 0
-21 1 0
-11 1 0
-120 2 0
-161 1 0
-13 1 0
-143 1 0
-46 1 0
-136 3 1
-75 1 0
-176 1 0
-23 1 0
-30 1 0
-34 1 0
-307 1 0
-27 1 0
-261 1 0
-39 1 0
-995 1 0
-556 1 0
-211 1 0
-278 1 0
-850 1 0
-285 1 0
-207 1 0
-154 1 0
-51 1 0
-237 1 0
-204 1 0
-11 1 0
-348 2 0
-41 1 0
-75 2 0
-47 1 0
-49 1 0
-253 1 0
-171 10 6
-106 1 0
-83 1 0
-86 1 0
-30 1 0
-166 1 0
-297 1 0
-480 1 0
-285 1 0
-339 1 0
-30 1 0
-74 1 0
-15 1 0
-310 1 0
-88 1 0
-111 1 0
-104 1 0
-644 1 0
-29 1 0
-413 2 0
-33 3 1
-19 1 0
-321 1 0
-318 1 0
-131 1 0
-111 1 0
-89 1 0
-751 120 120
-314 1 0
-613 2 0
-991 3 1
-44 1 0
-42 1 0
-57 1 0
-102 1 0
-318 1 0
-47 2 0
-186 1 0
-550 1 0
-504 1 0
-76 1 0
-336 1 0
-505 1 0
-34 2 0
-61 1 0
-257 1 0
-439 1 0
-94 1 0
-18 1 0
-6 1 0
-86 1 0
-18 1 0
-179 1 0
-52 1 0
-635 1 0
-535 1 0
-90 1 0
-531 2 0
-59 1 0
-132 1 0
-122 1 0
-17 1 0
-96 1 0
-281 1 0
-145 1 0
-342 1 0
-132 1 0
-95 16 12
-417 1 0
-143 1 0
-135 1 0
-11 1 0
-486 1 0
-224 1 0
-277 1 0
-449 1 0
-321 34 30
-96 1 0
-20 1 0
-358 1 0
-146 1 0
-176 1 0
-37 1 0
-92 1 0
-115 1 0
-245 1 0
-72 1 0
-65 1 0
-108 1 0
-41 13 10
-121 65 54
-54 1 0
-359 1 0
-53 1 0
-55 1 0
-10 1 0
-5 1 0
-6 2 1
-43 1 0
-9 1 0
-223 1 0
-90 1 0
-157 1 0
-686 1 0
-250 1 0
-160 1 0
-264 50363 1224780
-4948 0 1
-1850 60 67
-3859 0 1
-456 4 5
-1605 21 21
-1281 7 13
-5090 456 0
-1543 1 1
-37 1 1
-2825 1 1
-64 1 1
-1075 0 1
-721 0 1
-5566 22 5
-1136 1 0
-2390 0 3
-1347 0 2
-4617
-
-chain 16543266 chr17_random 2617613 + 0 174588 chr17_gl000205_random 174588 + 0 174588 172
-174588
-
-chain 10747371 chr17_random 2617613 + 1609852 1757206 chr17 81195210 - 15050606 15196423 297
-3573 1 0
-1031 1 0
-4890 10 7
-318 0 1
-667 1 0
-168 0 2
-974 2 0
-143 2 0
-208 4 0
-2621 10 10
-634 2 0
-1898 0 2
-99 21 21
-6731 1 1
-49 1 1
-345 2 0
-210 1 1
-1621 1 0
-1077 0 2
-371 6 0
-4548 5769 26131
-1148 0 1
-1283 1 1
-24 1 0
-2931 0 6
-38 22 0
-682 0 1
-1267 0 2
-470 9 19
-2335 0 9
-720 8 0
-2859 26315 4346
-4414 0 1
-777 1 4
-894 4 0
-3207 0 3
-3071 0 1
-1338 1 0
-869 1 0
-2072 0 1
-395 1 0
-1060 8 8
-1138 1 1
-6 2 0
-40 1 1
-473 0 1
-748 2 0
-306 8 0
-81 6 0
-748 4 0
-158 0 22
-6454 0 2
-145 1 1
-49 1 1
-619 0 1
-1579 14 14
-455 1 0
-5224 1 1
-31 1 0
-31 0 57
-3855 0 2
-2164 11 21
-1491 0 4
-213 16 4
-4589 6 6
-1564 0 6
-325 0 1
-2241 0 1
-149 0 1
-4150 0 4
-4768 0 12
-411 0 6
-804 2 0
-124 19 19
-937 2 0
-997 27 29
-685 37 37
-5 2 0
-35 37 48
-29 1 1
-237 2 0
-333 0 1
-1296 31 23
-472 4 0
-34 1 1
-683
-
-chain 7797784 chr17_random 2617613 + 2131554 2212864 chr17_gl000204_random 81310 + 0 81310 420
-81310
-
-chain 5191141 chr17_random 2617613 + 986480 1282720 chr17 81195210 + 34482891 34744119 309
-118 29 29
-73 435 3450
-113 9 9
-74 44 43
-109 53 55
-147 361 38
-603 128 128
-69 8 8
-278 22 22
-1262 20 20
-83 37 44
-478 1 1
-32 1 1
-54 1 1
-81 1 1
-57 0 1
-71 4 4
-83 1 1
-103 1 1
-80 1 1
-15 1 1
-312 15 15
-185 1 1
-24 1 1
-720 1 1
-19 1 1
-185 1 1
-35 1 1
-144 7 7
-238 1 1
-62 3 3
-196 10 10
-123 1 1
-99 1 1
-1997 1 1
-27 1 1
-64 49 45
-19 1 1
-547 1 1
-16 1 1
-796 0 2
-213 0 1
-1353 0 5
-59 1 1
-604 1 0
-1099 28 28
-2219 0 1
-1732 6 6
-115 1 1
-80 1 1
-123 1 1
-106 1 1
-164 1 1
-92 1 1
-160 34984 45270
-79 5 5
-348 149 150
-73 23 23
-322 46 46
-284 35 28
-1307 16 16
-515 89 89
-62 9 9
-203 3 0
-65 10 9
-188 33 32
-342 1 0
-100 0 1
-67 48 52
-69 1 0
-2330 39 42
-356 2 0
-767 5 9
-69 4 0
-373 29 30
-138 1 0
-571 0 1
-273 13 13
-140 25 24
-457 39 39
-204 19 19
-137 49 49
-178 59 59
-220 38 38
-66 23 22
-315 1 0
-399 30 30
-345 62 62
-200 36 36
-1097 33 35
-255 5 0
-61 4 0
-371 48 33
-119 30 30
-52 0 2
-236 0 2
-81 13 13
-168 12 12
-174 0 1
-250 81 81
-185 35 35
-343 27 35
-271 232 235
-79 116 119
-288 61 61
-869 9 8
-282 7 0
-6366 1 0
-2033 112 1128
-417 0 1
-64 145492 5631
-587 0 2
-184 392 14227
-792 0 4
-408 2 1
-1608 0 1
-1287 0 2
-676 1 1
-31 1 1
-112 1 1
-91 1 1
-173 1 0
-42 1 14
-784 11 11
-3219 0 13521
-8127 24 23
-7132 0 12
-9450 0 4
-3351 28 28
-5832 3 0
-100 0 1
-67 0 5
-31 6 5
-10 1 1
-69 2 0
-2314 1 0
-11507 0 1
-742 0 63471
-5695 0 1
-731 1 0
-3536
-
-chain 4342758 chr17_random 2617613 + 615163 663282 chr17 81195210 - 81146986 81195210 699
-117 89 88
-430 1 1
-8 7 3
-19 1 1
-521 14 7
-577 1 0
-4 1 0
-284 1 1
-19 12 6
-55 3 0
-193 1 0
-383 16 13
-508 5 0
-404 6 1
-1326 31 25
-723 84 3
-41 75 0
-21 1 0
-303 27 0
-65 81 27
-94 1 1
-40 1 1
-118 746 87
-30 2 1
-37 1 1
-179 2 0
-43 1 1
-46 27 0
-35 32 0
-278 1 0
-353 8 10
-363 13 1
-106 4 0
-188 34 34
-206 1 0
-3 1 0
-1339 1 0
-632 1 1
-21 0 4
-248 1 0
-655 1 0
-258 1 0
-777 1 0
-1440 16 16
-124 1 1
-36 1 0
-33 1 1
-89 1 0
-165 1 0
-86 1 1
-47 1 1
-319 8 4
-506 4 2
-537 16 12
-2310 1 0
-7 2 0
-922 9 0
-294 1 0
-145 1 0
-1890 2 0
-15 1 0
-38 1 0
-2030 12 6
-1208 2 0
-107 1 0
-438 2 0
-492 2 0
-184 1 0
-42 1 1
-646 1 35
-28 4 4
-62 4 36
-43 0 32
-54 1 1
-8 2 0
-23 1 1
-77 0 32
-34 0 32
-52 1 167
-69 70 6
-61 0 36
-99 0 64
-605 22 22
-133 1 0
-296 1 1
-42 1 0
-361 10 6
-225 14 14
-387 1 97
-405 0 480
-101 1 0
-24 2 2
-339 0 336
-1176 1 0
-192 1 0
-553 1 0
-114 4 1
-544 18 12
-575 3 0
-85 1 0
-934 1 0
-667 13 7
-28 18 12
-770 10 6
-149 1 0
-884 22 20
-214 0 1
-607 1 0
-129 1 0
-14 6 4
-27 6 3
-10 1 0
-4 2 0
-155 39 28
-214 2 0
-43 1 1
-1236 44 27
-1759 2 0
-472 6 2
-342 8 5
-970 6 0
-227 1 0
-691 1 0
-359 2 0
-141 1 0
-5 1 0
-2008 1 0
-302
-
-chain 3923033 chr17_random 2617613 + 864624 922266 chr17 81195210 + 81075742 81117538 762
-924 1 0
-428 1 0
-763 1 0
-19745 32 32
-637 15873 36
-186 1 0
-2389 1 0
-616 1 0
-1932 12 12
-10081 18 18
-2216 1 0
-92 1 0
-271 4 4
-67 5 5
-698 83 82
-473 27 27
-62
-
-chain 3905383 chr17_random 2617613 + 460666 565054 chr17 81195210 + 41343520 41406910 763
-9362 3 1
-1313 0 1
-344 1 0
-2289 0 2
-14919 0 1
-1393 6 4
-1047 1 0
-21 0 1
-31 5511 0
-28 783 8
-978 3 4
-213 0 2
-2198 0 702
-75 4479 3549
-723 0 13
-165 1 1
-19 3 3
-113 0 4
-88 1 1
-41 1 0
-38 7 7
-98 17 17
-152 50743 16221
-115 169 185
-169 0 4
-278 1 1
-48 1 1
-6399
-
-chain 3524656 chr17_random 2617613 + 1876393 1913891 chr17_gl000203_random 37498 + 0 37498 830
-37498
-
-chain 3296870 chr17_random 2617613 + 1963891 2002673 chr17_gl000204_random 81310 + 42877 81310 872
-560 1 0
-101 2 0
-296 42 39
-438 2 0
-256 1 0
-136 1 0
-109 1 0
-101 2 0
-234 64 62
-405 37 35
-61 1 0
-366 5 3
-501 39 37
-142 1 0
-191 27 24
-59 6 4
-53 67 62
-91 1 0
-159 1 0
-74 40 38
-164 1 0
-57 28 26
-75 1 0
-46 1 0
-61 45 43
-117 1 0
-360 45 43
-204 1 0
-180 61 58
-589 1 0
-212 1 0
-88 1 0
-53 1 0
-492 1 0
-75 26 24
-273 1 0
-701 1 0
-444 1 0
-75 1 0
-393 11 9
-105 59 56
-72 42 40
-79 1 0
-79 1 0
-95 153 144
-127 1 0
-85 4 2
-175 3 0
-222 1 0
-121 1 0
-48 1 0
-50 1 0
-61 1 0
-213 1 0
-73 1 0
-180 2 0
-83 1 0
-58 1 0
-192 11 5
-57 140 125
-101 1 0
-91 38 34
-190 1 0
-73 1 0
-116 6 4
-275 16 14
-200 1 0
-201 3 1
-632 1 0
-60 1 0
-198 9 1
-254 2 0
-89 1 0
-60 38 36
-326 32 28
-306 1 0
-55 1 0
-100 18 16
-127 36 32
-67 1 0
-78 1 0
-90 1 0
-63 35 31
-120 150 141
-103 9 7
-406 88 85
-54 15 13
-142 9 7
-112 32 30
-237 1 0
-114 27 18
-157 40 38
-145 1 0
-380 20 18
-73 109 104
-57 1 0
-83 68 65
-567 1 0
-378 0 4
-282 29 27
-725 1 0
-204 1 0
-246 1 0
-295 17 15
-243 1 0
-187 46 44
-56 1 0
-244 1 0
-303 1 0
-121 16 15
-253 1 0
-273 44 44
-427 10 0
-403 2 0
-219 1 0
-151 1 0
-115 14 13
-193 1 0
-63 1 0
-63 38 36
-609 1 0
-81 42 40
-297 1 0
-455 17 14
-278 3 1
-691 1 0
-417 104 101
-57 1 0
-93 5 3
-309 48 47
-303 1 0
-324 1 0
-126 41 37
-138 2 0
-233 1 0
-100 50 47
-86 9 7
-256 1 0
-208 1 0
-486 3 1
-118 1 0
-70 69 64
-455 8 6
-149 1 0
-175 5 2
-115 1 0
-159 1 0
-109 12 9
-135 33 31
-53 1 0
-256 5 3
-82 41 38
-268 70 67
-600 1 0
-128 18 16
-114 1 0
-149 62 58
-99 57 54
-158 42 38
-88 1 0
-75 46 43
-300 50 47
-71 13 11
-118 1 0
-177 1 0
-120 1 0
-275 1 0
-74 13 11
-230 1 0
-117 6 4
-113 39 37
-71 1 0
-597 9 8
-82 10 6
-195 10 8
-361 1 0
-53 1 0
-291 0 1
-149 1 0
-164
-
-chain 2935078 chr17_random 2617613 + 1427191 1457644 chr17 81195210 + 81045288 81075743 955
-1667 2 0
-1156 0 2
-25 0 2
-27603
-
-chain 2199778 chr17_random 2617613 + 671651 748529 chr11 135006516 - 134809692 134880676 533
-53 3 0
-176 68 0
-22 38 1
-38 43 16
-122 41 249
-34 4 16
-5 1 0
-6 1 0
-68 0 37
-1042 1 1
-35 1 1
-27 326 0
-359 1 0
-3 2 0
-176 16 5
-44 5 1
-224 1 0
-432 1 1
-35 1 1
-266 21 16
-109 14 10
-806 0 34
-465 56 0
-57 4 0
-787 1 0
-283 1 1
-27 1 1
-1090 1 1
-81 1 0
-1354 1 0
-40 1 1
-305 1 0
-89 1 1
-63 1 1
-48 1 1
-167 11 11
-83 8 4
-45 5 3
-343 1 1
-47 49 0
-56 0 294
-17 49 0
-79 5 103
-162 49 0
-442 10 10
-438 3 0
-50 1 1
-676 1 1
-39 1 1
-66 1 1
-7 1 0
-35 1 1
-547 7 2
-549 2393 0
-3 2913 0
-65 1 0
-60 1 1
-69 1 1
-42 0 1
-175 5 4
-100 1 0
-402 1 0
-39 1 0
-10 1 0
-10 1 0
-14 1 1
-95 4 2
-120 0 5
-126 1 1
-32 2 1
-72 1 1
-335 1 1
-45 1 0
-403 4 1
-54 1 0
-108 1 0
-289 1 1
-40 1 0
-164 12 12
-169 1 1
-76 1 1
-71 3 3
-34 1 1
-65 72 72
-84 64 1
-55 190 1
-52 1 1
-42 5 5
-138 1 1
-39 1 1
-311 6 7
-300 1 0
-597 17 17
-187 1 1
-32 100 2817
-24 203 202
-36 1 1
-115 4 0
-139 25 24
-1050 1 0
-56 1 0
-90 1 0
-33 1 0
-35 3 0
-114 1 1
-19 1 1
-215 1 0
-431 1 1
-23 1 0
-421 14 11
-292 1 1
-22 1 1
-49 2741 2490
-33 4095 4075
-9 0 3
-18 1474 1474
-3 6 1
-11 3 0
-38 14404 14348
-27 15613 15513
-5 5 5
-21 1 2
-13 19 20
-34 104 104
-44 214 216
-8 3 0
-27 2800 929
-60 1 1
-29 4270 3383
-30 49 0
-26 1 1
-40 2712 2960
-33 1 1
-7
-
-chain 2173268 chr17_random 2617613 + 699498 748919 chr1 249250621 - 248538148 248591008 468
-685 3 3
-36 4 4
-73 9 5
-59 70 63
-42 285 48
-44 1 1
-96 74 80
-321 1 1
-49 1 1
-107 1 1
-47 11 2
-85 3 0
-67 1 0
-179 19 16
-220 9 0
-138 33 33
-136 1 1
-26 1 1
-545 1 0
-8 14 10
-42 1 1
-64 1 1
-28 1 1
-119 1 1
-49 1 1
-54 1 1
-32 1 1
-960 1 1
-41 1 1
-731 16 16
-57 1 1
-19 1 1
-118 1 0
-196 1 1
-50 1 1
-263 1 1
-52 1 1
-171 1 1
-26 1 1
-181 25 16
-51 27 0
-56 1 1
-139 0 4
-33 1 1
-236 1 1
-17 1 1
-192 15 13
-186 1 1
-30 7 7
-280 1 1
-80 1 0
-196 62 54
-290 1 1
-38 1 1
-772 10 10
-123 1 1
-28 1 0
-20 34 22
-81 0 4
-45 1 1
-806 1 1
-31 1 0
-35 1 1
-101 17 15
-89 1 1
-34 1 0
-8 1 1
-290 13 9
-284 1 0
-53 7 0
-26 6 0
-605 4 0
-531 35 35
-704 1 1
-66 1 1
-168 1 1
-34 1 1
-527 1 1
-30 1 1
-249 16 7
-414 1 1
-27 1 1
-344 1 1
-43 1 1
-117 1 1
-30 1 1
-862 0 1
-229 1 1
-48 1 1
-197 14 14
-972 19 31
-924 1 1
-42 1 1
-123 1 1
-56 1 1
-77 1 1
-23 1 1
-119 1 1
-53 18 11
-382 1 1
-17 1 1
-116 5 2
-37 1 1
-38 2 0
-223 1 1
-21 6 1
-583 1 0
-400 0 4
-1574 27 27
-54 4 1
-158 10 7
-336 6 7
-492 1 0
-14 1 1
-843 1 2
-247 1 1
-41 1 1
-50 6 6
-513 17 13
-615 12 12
-585 32 23
-161 6 6
-515 9 5
-43 5 3
-460 5 5
-158 11 11
-252 1 1
-22 3 0
-135 12 12
-556 0 1
-542 3 0
-298 4 1
-24 4 0
-117 9 5
-151 0 1
-291 0 1
-360 15 15
-962 20 17
-231 1 0
-293 1 0
-33 32 0
-40 15 10
-213 23 23
-458 1 1
-51 1 1
-437 1 0
-394 1 1
-25 2 0
-117 10 4
-50 1 1
-40 1 1
-626 8 5
-492 1 0
-383 1 0
-672 1 1
-136 1 1
-203 2 2
-88 1 1
-261 1 1
-45 1 1
-189 15 15
-78 1 1
-49 1 1
-93 1 0
-35 13 10
-21 1 1
-527 99 94
-103 44 44
-79 24 26
-111 39 36
-235 24 27
-117 7 7
-127 222 1777
-58 167 165
-59 75 75
-203 12 12
-55 56 44
-269 34 32
-87 24 24
-250 35 29
-682 91 91
-312 4 3
-583 124 2653
-132 399 398
-134 1 1
-33 1 1
-179 1 1
-27 1 1
-245 4 4
-93 1 1
-940 1 1
-20 1 1
-271 1 1
-16 0 1
-353 24 17
-369 146 0
-83 1 1
-34 1 1
-1103 1 1
-26 1 1
-112 1 0
-3 1 0
-370 32 27
-410 170 174
-51 1 1
-310 42 41
-66 5 2
-319
-
-chain 2047886 chr17_random 2617613 + 532224 554093 chr17 81195210 - 39794017 39815907 1262
-682 50 50
-270 0 4
-316 0 1
-691 1 0
-678 1 2
-601 1 0
-383 1 0
-20 1 1
-1048 2 0
-1884 0 6
-690 0 5
-1205 1 1
-43 0 2
-891 19 19
-1916 7 6
-2354 0 3
-2253 10 0
-2406 0 13
-1972 6 6
-595 0 4
-148 100 100
-356 20 20
-109 4 4
-73 2 0
-59
-
-chain 1863993 chr17_random 2617613 + 1011919 1106715 chr17 81195210 + 34578530 36287451 432
-1027 148 148
-295 18 18
-204 37 37
-144 7 7
-238 38 38
-357 101 101
-125 64 64
-712 21 22
-181 126 1729
-702 0 2
-184 29 30
-236 37 37
-1080 60 65
-606 1 0
-328 63 63
-556 20 20
-94 37 37
-172 0 1
-1430 0 1
-151 53 53
-605 36 36
-292 1 0
-84 17921 60667
-87 11034 74480
-38 804 804
-30 345 345
-62 200 200
-36 1097 1097
-33 696 696
-48 119 119
-30 986 986
-81 185 185
-35 641 641
-232 79 79
-116 288 288
-61 11306 1517682
-155 7 0
-427 5 5
-742 2 0
-85 1 1
-401 1 1
-97 1 1
-566 1 0
-607 1 0
-1318 0 24
-1995 71 3
-34 0 2
-44 1 1
-39 0 1
-3518 0 4
-469 1 0
-294 10 13
-520 6 6
-403 0 3
-331 1 0
-231 7 0
-255 0 1
-3122 0 1
-729 0 1
-117 11 11
-186 4 0
-84 1 0
-412 2 0
-19 1 1
-1642 6 0
-628 1 1
-21 1 1
-377 50 50
-151 0 9
-2370 1 1
-35 1 1
-1328 1 10
-586 14 0
-789 12 13
-1397 0 1
-1521 0 2
-382 0 1
-866 1 1
-20 1 1
-710 2 0
-1259 161 161
-387 28 28
-53 24 24
-3626 1 0
-1718
-
-chain 1732426 chr17_random 2617613 + 2586433 2605017 chr17 81195210 - 39776940 39795500 1439
-1157 1 1
-31 0 5
-2053 8 8
-691 1 1
-30 1 1
-1212 3 0
-3864 1 0
-3 1 0
-56 15 0
-860 1 1
-30 1 1
-6532 4 4
-147 13 13
-1042 17 17
-319 7 0
-181 10 10
-68 42 42
-51 16 14
-115
-
-chain 1719393 chr17_random 2617613 + 1323861 1343929 chr17 81195210 + 45650033 45670000 1446
-76 1 1
-94 1 1
-84 9 9
-70 1 1
-43 1 0
-40 0 2
-126 1 1
-38 1 1
-391 1 1
-43 1 1
-100 0 1
-66 12 12
-65 1 1
-39 2 0
-9 4 0
-25 1 1
-99 1 1
-27 0 4
-362 22 4
-659 2 0
-433 0 20
-16 1 1
-117 1 1
-248 1 1
-200 1 1
-23 1 1
-248 6 0
-120 1 1
-930 1 1
-14 1 1
-76 1 1
-11 1 0
-23 2 0
-23 1 1
-236 1 1
-48 1 1
-108 1 1
-141 7 5
-50 1 1
-27 1 1
-306 0 3
-290 1 1
-20 0 1
-31 1 1
-618 5 6
-350 14 6
-55 0 2
-112 4 0
-50 1 1
-263 1 0
-51 1 1
-527 1 1
-47 1 1
-247 1 1
-34 3 3
-169 0 2
-33 3 0
-165 12 0
-163 1 1
-77 1 0
-56 26 26
-54 6 6
-338 2 0
-185 73 73
-336 0 3
-89 1 1
-19 1 1
-65 18 18
-89 0 1
-178 1 1
-45 1 1
-67 8 0
-347 0 1
-22 1 1
-192 1 1
-73 1 4
-38 0 1
-61 1 1
-164 1 1
-74 3 3
-260 5 0
-89 9 9
-142 1 1
-49 1 1
-71 0 1
-62 1 1
-391 1 1
-78 1 1
-100 1 1
-32 1 1
-155 11 12
-304 8 0
-79 1 1
-115 1 1
-29 1 1
-97 19 0
-168 1 1
-19 4 4
-359 2 0
-18 1 1
-358 1 1
-38 1 1
-83 1 1
-31 1 1
-389 1 1
-32 1 1
-128 1 1
-39 1 1
-54 1 1
-11 2 0
-165 4 0
-34 1 1
-58 1 1
-68 3 0
-230 1 1
-44 1 1
-276 16 16
-170 6 6
-104 1 1
-61 1 1
-107 6 6
-177 1 1
-66 5 0
-60 1 1
-14 1 1
-50 4 4
-15 1 1
-62 1 1
-194 1 1
-72 22 1
-39 1 1
-70 1 1
-42 1 1
-58 1 1
-36 1 1
-329 1 0
-136 1 1
-192 9 10
-682 24 21
-81 0 1
-367 12 12
-81
-
-chain 1570588 chr17_random 2617613 + 1644335 1687876 chr17 81195210 + 66068832 66112387 1087
-1168 16352 16361
-2197 2 0
-1554 1 0
-6339 0 4
-1936 0 7
-2357 2 0
-7231 1 0
-4401
-
-chain 1476469 chr17_random 2617613 + 2303443 2319476 chr17 81195210 + 79885696 79901628 1655
-880 1 0
-298 1 0
-60 43 40
-227 40 38
-326 1 0
-77 1 0
-148 1 0
-199 21 19
-60 1 0
-224 1 0
-173 1 0
-317 88 84
-84 1 0
-96 48 45
-432 1 0
-107 1 0
-505 1 0
-88 1 0
-551 1 0
-107 1 0
-176 1 0
-79 2 0
-127 1 0
-56 1 0
-239 1 0
-218 1 0
-11 1 0
-27 1 0
-256 1 0
-130 1 0
-60 1 0
-586 1 0
-96 1 0
-58 1 0
-80 1 0
-135 1 0
-55 1 0
-219 5 2
-11 4 2
-30 4 1
-368 1 0
-106 1 0
-119 18 13
-146 1 0
-636 1 0
-156 1 0
-541 1 0
-107 1 0
-97 1 0
-61 1 0
-66 1 0
-7 1 0
-238 1 0
-105 1 0
-13 1 0
-667 1 0
-85 1 0
-70 1 0
-642 1 0
-635 1 0
-57 1 0
-249 1 0
-237 1 0
-162 1 0
-166 1 0
-380 1 0
-271 1 0
-215 2 0
-260 1 0
-160 1 0
-62 1 0
-6 1 0
-185 1 0
-48 1 0
-265 5 2
-87 1 0
-186 1 0
-62 1 0
-20 1 0
-135
-
-chain 1260177 chr17_random 2617613 + 853052 928106 chr17 81195210 - 43628 125104 962
-949 1 0
-3976 1 0
-155 1 0
-1382 1 0
-174 1 0
-249 1 0
-3481 16 14
-138 196 313
-72 88 86
-491 22816 3210
-803 32 32
-116 1 0
-346 10 9
-779 1 0
-620 1 0
-336 1 0
-2035 1 0
-1010 1 0
-1029 22 20
-97 39 114
-77 79 0
-5135 26 26
-535 1 0
-2026 21 19
-206 2 0
-254 19578 45525
-174 1 1
-34 1 1
-97 25 25
-137 6 5
-2443 14 9
-445 1 0
-116 1 0
-2150
-
-chain 1227372 chr17_random 2617613 + 986700 1051441 chr17 81195210 + 34570816 36317431 617
-294 0 3023
-141 196 196
-44 109 109
-53 147 147
-19 33 32
-101 42 42
-166 603 602
-128 1742 1742
-37 15134 15157
-88 7169 151654
-89 3878 5468
-37 1080 1080
-60 1668 1668
-37 1753 1753
-53 605 605
-36 506 39138
-695 47 47
-375 59 59
-312 20 20
-185 37 37
-144 7 7
-238 38 38
-357 101 101
-125 64 64
-712 185 184
-2677 120 1494235
-1055 15 15
-700 4 4
-1174 24 24
-888 9 3
-1590 0 3
-913 18 20
-1011 1 1
-26 1 1
-2545 1 1
-35 1 1
-1283 87 87
-45 432 432
-149 418 418
-46 284 284
-2 3 3
-30 1838 1839
-89 540 540
-32 511 512
-48 2400 2403
-39 3223 3228
-39 360 360
-49 178 178
-59
-
-chain 1028733 chr17_random 2617613 + 2262901 2274699 chr17 81195210 - 1281214 1293541 2373
-276 161 161
-1171 1 0
-181 1 0
-943 1 0
-423 1 0
-384 47 47
-111 466 1042
-106 31 31
-75 4 4
-63 20 16
-142 1 0
-59 1 0
-607 1 0
-135 1 0
-31 1 0
-82 1 0
-266 1 0
-76 1 0
-5 4 2
-41 1 0
-52 1 0
-985 1 0
-87 1 0
-4 1 0
-114 1 0
-175 1 0
-30 1 0
-140 2 0
-22 1 0
-130 1 0
-239 1 0
-766 1 0
-203 1 0
-68 2 0
-252 1 0
-300 4 2
-377 1 0
-735 1 0
-279 5 2
-91 1 0
-66 1 0
-159 1 0
-7 1 0
-562
-
-chain 931587 chr17_random 2617613 + 978106 1010959 chr17 81195210 + 36277154 36406169 991
-1048 10 12
-382 0 1
-199 22 22
-381 8 8
-56 66 66
-80 176 176
-73 27 27
-90 32 32
-166 31 209
-634 0 4
-1199 65 65
-56 27 27
-255 27 27
-50 1 7
-422 5 5
-61 4 0
-80 311 311
-40 144 144
-53 3450 47979
-41 18030 69497
-201 21 0
-219 1 0
-310 0 1
-3136 0 1
-510 50 52
-321 3 0
-279
-
-chain 813092 chr17_random 2617613 + 1807252 1826317 chr17 81195210 + 22246129 22262163 2589
-338 20 20
-223 15 15
-164 162 162
-54 59 60
-73 230 230
-52 48 48
-50 66 66
-54 49 49
-257 14 14
-103 22 22
-96 5 5
-357 121 121
-100 88 88
-108 94 94
-490 34 34
-81 27 27
-54 82 82
-80 138 138
-128 12 12
-262 24 21
-199 35 35
-263 80 80
-84 52 52
-185 16 16
-75 113 113
-160 99 99
-70 27 27
-84 49 49
-59 25 25
-133 30 30
-64 45 45
-304 25 25
-986 74 74
-160 13 13
-209 22 22
-54 43 43
-61 156 156
-54 6 6
-77 5 5
-86 85 85
-117 48 165
-381 74 74
-262 32 32
-165 71 71
-57 95 95
-89 31 31
-114 140 140
-117 216 216
-77 5 5
-52 442 441
-185 60 60
-363 22 22
-179 11 11
-259 197 197
-118 35 35
-108 60 60
-61 61 61
-137 50 50
-53 56 56
-269 161 161
-106 103 105
-56 8 8
-368 41 41
-47 3145 0
-401 42 42
-90 23 23
-151 73 73
-81 148 146
-351
-
-chain 788653 chr17_random 2617613 + 1298766 1307227 chr17 81195210 - 44798207 44806654 6145
-463 1 0
-2422 0 1
-90 14 0
-75 0 1
-397 0 1
-64 1 1
-30 0 1
-202 1 0
-1329 2 0
-1396 1 0
-668 0 1
-280 45 45
-980
-
-chain 597412 chr17_random 2617613 + 807879 2303216 chr17 81195210 - 0 1281216 430
-180 1676 138
-25553 1 0
-149 14 14
-1938 1 0
-350 32 32
-1230 1 0
-3 1 0
-6237 1 0
-45 2 2
-6514 1 0
-228 662945 0
-7897 0 1
-2396 1 0
-1101 17 0
-41 1 1
-355 0 52
-50 18 1
-41 0 68
-84 34 0
-4918 0 1
-717 0 1
-313 1 1
-42 1 1
-73 29 31
-205 58 0
-414 1 1
-64 1 1
-959 1 1
-17 1 1
-2276 1 0
-739 0 1
-418 11 49
-1541 0 1
-3494 7 13
-1281 21 21
-1738 1 191
-26 0 38
-40 0 77
-67 5 5
-11 1 75
-55 2266 0
-112 47 9
-78 38 0
-24 1 1
-80 5 5
-551 0 5
-87 1 1
-35 1 1
-54 119 195
-74 1 1
-957 15 15
-64 1277 306
-91 1 1
-35 1 1
-820 48 67
-330 0 1
-2794 1 0
-1127 1 1
-19 0 5
-1483 715858 1169096
-78 1 0
-529 1 0
-25 1 0
-200 1 0
-643 2 0
-450 2 0
-211 1 0
-380 2 2
-180 2 1
-32 1 0
-246 1 0
-61 1 0
-5 1 0
-351 1 0
-37 1 0
-304 1 0
-18 1 0
-109 1 0
-16 1 0
-200 1 0
-105 1 0
-37 1 0
-376 1 0
-108 1 0
-91 1 0
-394 1 0
-20 1 0
-1014 32 30
-21 2 1
-34 1 0
-230 26 26
-941 1 0
-188 1 0
-610 1 0
-555 1 0
-303 1 0
-509 157 157
-169 22 22
-101 1 0
-501 1 0
-140 1 0
-78 2 1
-22 1 0
-39 6 5
-62 94 94
-593 114 111
-260 120 120
-362 1 0
-697 0 1
-123 28 28
-402 36 36
-904 1 0
-50 1 0
-379 1 0
-256 25 25
-23 17 17
-53 27 27
-556 1 0
-409 1 0
-106 1 0
-276 24 24
-35 2 0
-252 32 32
-213 4 4
-70 2 0
-27 4 2
-82 1 0
-17 1 0
-639 1 0
-172 11 7
-10 1 0
-76 1 0
-1582 1 0
-275 1 0
-21 1 0
-17 4 2
-66 1 0
-1653 1 0
-19 3 3
-139 179 179
-76 2 2
-60 1 0
-226 1 0
-538 1 0
-346 4 4
-42 25 25
-1319 1 0
-261 1 0
-512 1 0
-69 1 0
-480 2 0
-388 8 7
-305 5 5
-64 2 2
-846
-
-chain 590397 chr17_random 2617613 + 1317586 1323861 chr17 81195210 - 44817018 44823295 6400
-2259 1 0
-955 0 1
-2132 0 1
-744 0 1
-184
-
-chain 365975 chr17_random 2617613 + 1296053 1313819 chr17 81195210 + 45621804 45639993 6832
-81 12 44
-148 0 6
-401 61 62
-589 32 30
-259 39 57
-53 103 103
-231 127 131
-59 7954 7632
-45 980 978
-16 142 143
-82 46 46
-363 247 934
-159 50 48
-341 33 34
-57 16 16
-304 65 65
-69 9 9
-136 66 66
-138 57 57
-70 10 10
-70 123 120
-143 52 52
-152 15 19
-320 53 52
-121 0 1
-161 98 108
-97 59 59
-205 127 125
-55 11 11
-56 30 30
-88 43 43
-512 45 43
-125 143 136
-165 48 48
-56 24 24
-161 114 115
-364 40 40
-240
-
-chain 323854 chr17_random 2617613 + 753664 757726 chr11 135006516 + 51394886 51398944 206195
-84 571 570
-807 3 1
-2082 1 0
-514
-
-chain 193433 chr17_random 2617613 + 495545 497612 chr17 81195210 + 41377728 41379794 617459
-55 1 0
-1306 28 28
-677
-
-chain 170984 chr17_random 2617613 + 1315777 1317585 chr17 81195210 - 44815210 44817018 741311
-1808
-
-chain 158566 chr17_random 2617613 + 1808012 1818883 chr17 81195210 + 22251644 22262630 5258
-162 209 210
-87 88 88
-32 270 270
-48 855 855
-36 185 185
-88 888 888
-37 888 888
-35 263 263
-80 85 85
-51 276 276
-47 20 20
-46 329 329
-27 350 350
-4 5 5
-21 413 412
-25 986 986
-74 458 458
-43 137 137
-80 228 228
-85 546 663
-9 10 10
-55 262 262
-32 293 293
-68 116 116
-25 120 120
-109 148 148
-60 1 1
-67 6 4
-74 1 1
-7 134 134
-220 1 1
-65 1 1
-91 1 1
-62 186 186
-60
-
-chain 150869 chr17_random 2617613 + 749022 751008 chr11 135006516 + 51475668 51477652 852441
-306 379 377
-1301
-
-chain 148651 chr17_random 2617613 + 808184 809735 chr17 81195210 + 81137722 81139272 865111
-940 1 0
-610
-
-chain 145464 chr17_random 2617613 + 1314230 1315767 chr17 81195210 - 44813661 44815198 885049
-1537
-
-chain 120518 chr17_random 2617613 + 1343929 1345208 chr17 81195210 - 44843364 44844643 723183
-1279
-
-chain 116919 chr17_random 2617613 + 1353036 1364922 chr17 81195210 - 44845210 44857111 1380
-449 299 299
-31 164 164
-55 373 373
-449 9718 9733
-348
-
-chain 115845 chr17_random 2617613 + 508518 509981 chr17 81195210 - 39794017 39795500 1110103
-682 50 50
-270 0 4
-177 169 185
-115
-
-chain 114042 chr17_random 2617613 + 516500 517961 chr17 81195210 - 39794017 39795500 1127130
-682 50 50
-210 5 6
-54 0 6
-175 170 185
-115
-
-chain 113591 chr17_random 2617613 + 521388 522849 chr17 81195210 - 39794017 39795500 1131524
-58 0 1
-623 50 50
-210 5 6
-54 0 6
-175 171 185
-115
-
-chain 112548 chr17_random 2617613 + 503499 505329 chr17 81195210 - 39794017 39795500 1141710
-27 370 0
-655 50 50
-210 5 6
-54 0 7
-174 170 185
-115
-
-chain 92910 chr17_random 2617613 + 1642194 1643169 chr17 81195210 - 1314977 1315952 1374174
-975
-
-chain 86438 chr17_random 2617613 + 1345275 1346182 chr17 81195210 - 44844700 44845607 1472746
-907
-
-chain 80313 chr17_random 2617613 + 2609695 2610598 chr17 81195210 - 39794017 39794920 1580802
-682 50 50
-171
-
-chain 78741 chr17_random 2617613 + 1643269 1644095 chr17 81195210 + 79874782 79875608 1611354
-826
-
-chain 75472 chr17_random 2617613 + 1310578 1313579 chr17 81195210 - 44810007 44813007 188419
-53 282 282
-98 97 97
-59 205 205
-127 122 122
-30 88 88
-43 512 512
-45 125 125
-72 1 0
-70 165 165
-48 241 241
-114 364 364
-40
-
-chain 74354 chr17_random 2617613 + 1547620 1548395 chr8 146364022 - 2302524 2303299 1703290
-775
-
-chain 61189 chr17_random 2617613 + 1546707 1547351 chr8 146364022 + 144057273 144057917 2067192
-644
-
-chain 59362 chr17_random 2617613 + 751149 753548 chr1 249250621 - 248579195 248581575 182656
-35 2 1
-152 1 0
-15 1 0
-107 3 2
-74 1 0
-10 1 0
-19 1 0
-57 1 1
-48 3 1
-6 1 0
-107 12 330
-61 1 1
-51 357 35
-388 110 110
-84 38 38
-62 227 223
-116 106 105
-141
-
-chain 56858 chr17_random 2617613 + 1298104 1298766 chr17 81195210 - 44797535 44798197 1968612
-85 59 59
-518
-
-chain 56536 chr17_random 2617613 + 501286 502149 chr17 81195210 - 39794614 39795500 2243684
-85 50 50
-210 5 6
-54 0 7
-174 170 185
-115
-
-chain 55411 chr17_random 2617613 + 688273 689806 chr7 159138663 - 159114165 159114723 7844
-88 175 0
-148 458 0
-103 231 3
-111 117 3
-102
-
-chain 52941 chr17_random 2617613 + 1822234 1824166 chr17 81195210 - 58941545 58943477 1155
-887 1 1
-77 1 1
-300 1 1
-20 9 9
-133 1 1
-23 1 1
-59 1 1
-158 1 1
-91 1 1
-54 1 1
-112
-
-chain 52559 chr17_random 2617613 + 983839 1162005 chr17 81195210 - 44845659 46605886 726
-299 65 65
-117 68 68
-1986 9723 54270
-49 72036 1500609
-1027 6412 6412
-71 13528 13528
-50 11447 11447
-132 60546 169487
-42 528 528
-40
-
-chain 51097 chr17_random 2617613 + 1023443 1026449 chr17 81195210 + 34744258 34747264 8774
-47 375 375
-59 517 517
-37 389 389
-38 357 357
-101 125 125
-64 712 712
-185
-
-chain 49537 chr17_random 2617613 + 686221 687340 chr7 159138663 - 159114165 159114714 2581538
-393 570 0
-156
-
-chain 49422 chr17_random 2617613 + 2502237 2515076 chr17_gl000206_random 41001 + 6806 19645 760
-60 12323 12323
-456
-
-chain 46461 chr17_random 2617613 + 530697 531391 chr17 81195210 + 41399710 41400427 2769983
-115 170 185
-151 0 7
-77 5 6
-176
-
-chain 44819 chr17_random 2617613 + 1346282 1352646 chr17 81195210 + 36399842 36406169 117269
-158 113 113
-546 19 0
-337 0 1
-343 21 0
-219 1 0
-310 0 1
-3136 0 1
-510 1 1
-49 0 2
-321 1 0
-279
-
-chain 42351 chr17_random 2617613 + 1308282 1310091 chr17 81195210 - 44807710 44809519 659295
-50 341 341
-33 377 377
-65 214 214
-66 138 138
-57 150 150
-123 143 143
-52
-
-chain 41114 chr17_random 2617613 + 1307243 1308123 chr17 81195210 - 44806671 44807550 1295496
-142 82 82
-46 363 362
-247
-
-chain 38415 chr17_random 2617613 + 980212 983216 chr17 81195210 - 46382593 46436652 7347
-66 80 80
-176 73 73
-27 90 90
-32 166 166
-31 1833 52888
-65 56 56
-27 255 255
-27
-
-chain 37708 chr17_random 2617613 + 1313819 1314225 chr17 81195210 - 44813251 44813657 3332998
-406
-
-chain 34385 chr17_random 2617613 + 689365 745709 chr16 90354753 + 90179685 90235100 655
-111 4456 3661
-64 55 55
-25 28 28
-47 0 945
-90 45591 45393
-56 269 269
-34 5469 4540
-13 2 2
-32 0 48
-2
-
-chain 29758 chr17_random 2617613 + 1820296 1826385 chr17 81195210 + 22249775 22252718 80336
-37 643 643
-77 136 133
-51 3143 0
-44 74 74
-224 80 80
-64 79 79
-9 741 741
-39 82 82
-59 25 25
-56 358 358
-68
-
-chain 29219 chr17_random 2617613 + 1551349 1551651 chr17 81195210 + 81144397 81144699 5017519
-302
-
-chain 28762 chr17_random 2617613 + 686677 687796 chr7 159138663 - 159114165 159114714 2625478
-282 456 0
-111 3 3
-57 114 0
-96
-
-chain 26027 chr17_random 2617613 + 1296695 1298103 chr17 81195210 - 44796117 44797535 630440
-61 589 589
-32 259 269
-39 53 53
-103 231 231
-41
-
-chain 25589 chr17_random 2617613 + 1810180 1822057 chr17 81195210 + 22246679 22258671 5893
-31 6949 7063
-28 2666 2666
-60 580 580
-49 73 73
-37 1172 1173
-232
-
-chain 22463 chr17_random 2617613 + 503557 503790 chr17 81195210 - 39794076 39794309 8690008
-233
-
-chain 21299 chr17_random 2617613 + 1013035 1014722 chr17 81195210 + 34795732 34797419 1064
-59 517 517
-37 389 389
-38 357 357
-101 125 125
-64
-
-chain 20434 chr17_random 2617613 + 685587 686087 chr7 159138663 - 159114215 159114487 2822651
-209 248 20
-43
-
-chain 19692 chr17_random 2617613 + 2611651 2612116 chr17 81195210 - 39813091 39813524 10717347
-67 163 137
-78 68 62
-89
-
-chain 19589 chr17_random 2617613 + 2616810 2617276 chr17 81195210 + 41381686 41382119 10803726
-89 68 62
-77 165 138
-67
-
-chain 17762 chr17_random 2617613 + 852036 852257 chr5 180915260 - 51646 51969 938
-13 1 1
-60 1 1
-29 1 1
-13 0 102
-103
-
-chain 17600 chr17_random 2617613 + 1364922 1365125 chr17 81195210 - 46397651 46397854 1833
-172 1 1
-30
-
-chain 17149 chr17_random 2617613 + 1514626 1514877 chr1 249250621 + 547399 547650 3354419
-131 1 3
-101 2 0
-16
-
-chain 16567 chr17_random 2617613 + 2610699 2610873 chr17 81195210 - 39795026 39795200 13468304
-174
-
-chain 16365 chr17_random 2617613 + 1812948 1813633 chr17 81195210 + 22258959 22259644 44227
-99 181 181
-49 59 59
-25 227 227
-45
-
-chain 16348 chr17_random 2617613 + 525487 525673 chr11 135006516 + 62609095 62609281 13688187
-75 4 4
-107
-
-chain 14733 chr17_random 2617613 + 2605728 2605963 chr17 81195210 - 39813295 39813524 15353144
-78 68 62
-89
-
-chain 14711 chr17_random 2617613 + 556093 556262 chr11 135006516 - 72397235 72397404 15378622
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 527846 528015 chr11 135006516 - 72397235 72397404 15378623
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 512402 512571 chr11 135006516 - 72397235 72397404 15378624
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 510910 511079 chr11 135006516 - 72397235 72397404 15378625
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 494247 494416 chr11 135006516 - 72397235 72397404 15378626
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 492878 493047 chr11 135006516 - 72397235 72397404 15378627
-107 4 4
-58
-
-chain 14711 chr17_random 2617613 + 519356 519525 chr11 135006516 + 62609112 62609281 15378630
-58 4 4
-107
-
-chain 14711 chr17_random 2617613 + 514467 514636 chr11 135006516 + 62609112 62609281 15378631
-58 4 4
-107
-
-chain 14711 chr17_random 2617613 + 492408 492577 chr11 135006516 + 62609112 62609281 15378632
-58 4 4
-107
-
-chain 13395 chr17_random 2617613 + 685879 686024 chr7 159138663 - 159114165 159114310 16961745
-145
-
-chain 12350 chr17_random 2617613 + 554102 554230 chr17 81195210 + 41401065 41401193 18472361
-128
-
-chain 11140 chr17_random 2617613 + 2611055 2611170 chr17 81195210 - 39795385 39795500 20498301
-115
-
-chain 11115 chr17_random 2617613 + 1365516 1365648 chr17 81195210 - 46613257 46613389 1914
-132
-
-chain 10814 chr17_random 2617613 + 689806 689963 chr7 159138663 - 159114495 159114652 3160720
-43 20 20
-94
-
-chain 10716 chr17_random 2617613 + 690046 690160 chr11 135006516 - 134823089 134823203 21297817
-114
-
-chain 10594 chr17_random 2617613 + 686107 686221 chr11 135006516 - 134823089 134823203 21541329
-114
-
-chain 10432 chr17_random 2617613 + 752965 753084 chr3 198022430 + 197944313 197944432 1419040
-26 27 27
-66
-
-chain 10233 chr17_random 2617613 + 751962 752152 chr1 249250621 - 25108929 25109119 2449036
-190
-
-chain 10215 chr17_random 2617613 + 298300 298405 chr17 81195210 - 41991981 41992086 2272776
-105
-
-chain 10088 chr17_random 2617613 + 2614941 2615048 chr11 135006516 - 72397235 72397342 22628945
-107
-
-chain 9967 chr17_random 2617613 + 687027 687133 chr7 159138663 - 159114173 159114279 19905170
-106
-
-chain 9953 chr17_random 2617613 + 1352829 1353036 chr17 81195210 - 44845003 44845210 3604154
-38 53 53
-37 50 50
-29
-
-chain 9937 chr17_random 2617613 + 2607755 2608553 chr17 81195210 + 41464708 41466209 22969163
-59 661 1364
-78
-
-chain 9782 chr17_random 2617613 + 685310 686656 chr7 159138663 - 159114165 159114714 2594423
-225 1079 282
-42
-
-chain 9490 chr17_random 2617613 + 268561 268666 chr17 81195210 + 39296306 39296411 8067183
-50 6 6
-49
-
-chain 9384 chr17_random 2617613 + 1808529 1810797 chr17 81195210 + 22256920 22261566 263516
-29 104 104
-28 50 50
-48 1976 4354
-33
-
-chain 9278 chr17_random 2617613 + 1333217 1333901 chr17 81195210 - 44832655 44833339 2515
-26 585 585
-73
-
-chain 9162 chr17_random 2617613 + 1819790 1824781 chr17 81195210 + 22261160 22263006 131478
-64 322 322
-59 818 816
-30 3642 499
-56
-
-chain 8930 chr17_random 2617613 + 507298 507390 chr17 81195210 + 41466131 41466223 25058540
-92
-
-chain 8739 chr17_random 2617613 + 1294354 1363161 chr17 81195210 - 46388680 46446941 1280
-36 59095 48559
-76 160 160
-63 250 250
-52 124 124
-61 4094 4092
-28 4719 4711
-49
-
-chain 7495 chr17_random 2617613 + 1514877 1514981 chr17 81195210 - 42613 42717 4053350
-104
-
-chain 7310 chr17_random 2617613 + 1352662 1353007 chr17 81195210 - 20840434 20840778 292042
-167 38 37
-53 37 37
-50
-
-chain 6706 chr17_random 2617613 + 687825 687939 chr7 159138663 - 159114173 159114287 10506562
-114
-
-chain 6456 chr17_random 2617613 + 673480 673547 chr11 135006516 - 134811854 134811921 22781013
-67
-
-chain 5049 chr17_random 2617613 + 752664 753185 chr1 249250621 - 248584104 248584621 921258
-110 84 84
-38 62 62
-7 119 119
-72 7 3
-22
-
-chain 5012 chr17_random 2617613 + 557502 557555 chr17 81195210 + 41382227 41382280 33565948
-53
-
-chain 4802 chr17_random 2617613 + 1345218 1345268 chr17 81195210 - 44844643 44844693 34312672
-50
-
-chain 4547 chr17_random 2617613 + 688053 688156 chr7 159138663 - 159114401 159114504 10358404
-103
-
-chain 4503 chr17_random 2617613 + 690214 690262 chr7 159138663 - 159114675 159114723 34814023
-48
-
-chain 4408 chr17_random 2617613 + 1808470 1808528 chr17 81195210 + 22261618 22261676 11976838
-58
-
-chain 4236 chr17_random 2617613 + 269418 269467 chr17 81195210 - 41933979 41934028 1349427
-49
-
-chain 3906 chr17_random 2617613 + 1365126 1365187 chr17 81195210 - 23109543 23109604 10221956
-61
-
-chain 3852 chr17_random 2617613 + 685196 685310 chr7 159138663 - 159114165 159114279 3139829
-114
-
-chain 3804 chr17_random 2617613 + 676798 676843 chr11 135006516 - 134814627 134814666 26257176
-33 6 0
-6
-
-chain 3734 chr17_random 2617613 + 1819749 1824493 chr17 81195210 + 22251604 22253205 550639
-41 1133 1133
-53 3451 308
-4 6 6
-56
-
-chain 3666 chr17_random 2617613 + 689649 689704 chr3 198022430 + 197891166 197891221 670
-55
-
-chain 3459 chr17_random 2617613 + 687133 687184 chr7 159138663 - 159114165 159114216 4526522
-51
-
-chain 3336 chr17_random 2617613 + 1365188 1365250 chr17 81195210 - 20853025 20853087 9938797
-62
-
-chain 3079 chr17_random 2617613 + 681792 681827 chr11 135006516 - 134820249 134820284 24010224
-35
-
-chain 2916 chr17_random 2617613 + 690160 690191 chr7 159138663 - 159114621 159114652 25187800
-31
-
-chain 2901 chr17_random 2617613 + 1010962 1011819 chr17 81195210 - 44844823 44845680 205824
-857
-
-chain 2668 chr17_random 2617613 + 837741 837773 chr8 146364022 + 31195 31227 1221
-32
-
-chain 2659 chr17_random 2617613 + 747955 747987 chr5 180915260 + 180755757 180755789 880
-32
-
-chain 2649 chr17_random 2617613 + 622962 622989 chr17 81195210 - 81153206 81153233 29165068
-27
-
-chain 2631 chr17_random 2617613 + 1252044 1252072 chr17 81195210 + 34548405 34548433 469
-28
-
-chain 2530 chr17_random 2617613 + 1100849 1100878 chr17 81195210 - 46384734 46384763 4689
-29
-
-chain 2422 chr17_random 2617613 + 621448 621568 chr17 81195210 - 81152835 81152952 7235512
-27 65 62
-28
-
-chain 2158 chr17_random 2617613 + 688361 688384 chr16 90354753 + 90179770 90179793 21906636
-23
-
-chain 2073 chr17_random 2617613 + 690420 690442 chr7 159138663 - 159114653 159114675 31315602
-22
-
-chain 1877 chr17_random 2617613 + 1533316 1533338 chr17_gl000206_random 41001 - 16469 16491 815
-22
-
-chain 1804 chr17_random 2617613 + 687361 687825 chr7 159138663 - 159114165 159114515 2659234
-54 381 267
-29
-
-chain 1771 chr17_random 2617613 + 742259 742283 chr1 249250621 - 248585388 248585412 123201
-24
-
-chain 1698 chr17_random 2617613 + 268509 268561 chr17 81195210 - 41933055 41933107 4387515
-52
-
-chain 1694 chr17_random 2617613 + 747513 747535 chr1 249250621 - 249115973 249115995 773
-22
-
-chain 1343 chr17_random 2617613 + 555358 555450 chr17 81195210 - 39728987 39729079 19263806
-92
-
-chain 1343 chr17_random 2617613 + 511667 511759 chr17 81195210 - 39728987 39729079 19263807
-92
-
-chain 1343 chr17_random 2617613 + 526316 526408 chr17 81195210 + 41466131 41466223 19263808
-92
-
-chain 1343 chr17_random 2617613 + 520168 520260 chr17 81195210 + 41466131 41466223 19263809
-92
-
-chain 1129 chr17_random 2617613 + 1019025 1019068 chr17 81195210 + 60348267 60348310 2834
-43
-
-chain 1082 chr17_random 2617613 + 686959 687027 chr7 159138663 - 159114561 159114629 2979122
-68
-
-chain 594 chr17_random 2617613 + 1548943 1548990 chr17_gl000206_random 41001 - 30268 30353 3713456
-4 9 47
-34
-
-chain 7055976638 chr18 76117153 + 0 76117153 chr18 78077248 + 10000 78016181 19
-15400898 1363998 3100000
-28218587 15 15
-5329636 47000 150000
-3667309 0 18
-16406890 28008 50000
-3388467 22000 50000
-2103304 3 0
-136125 7 9
-647 0 1
-1543 0 1
-25 0 1
-6 2 7
-19 0 2
-10 4 7
-9 2 4
-656 0 1
-358 0 1
-1625
-
-chain 404699 chr18_random 4262 + 0 4262 chr18_gl000207_random 4262 + 0 4262 116011
-4262
-
-chain 5307789368 chr19 63811651 + 11000 63806651 chr19 59128983 + 60000 59114839 21
-7286004 5000 50000
-1291194 5000 50000
-11767057 0 69160
-4058367 8000000 3100000
-20129228 0 2
-701 3 0
-347 1 1
-31 1 1
-1833 3 0
-1984 1 1
-47 1 1
-190 1 1
-34 1 1
-889 0 2
-1413 0 7
-2680 0 4
-375 0 1
-328 0 4
-15 0 1
-69 1 0
-3881 1 1
-36 0 12
-296 0 14
-1480 0 1
-233 1 1
-45 1 1
-1049 0 1
-1766 44 7
-220 3 0
-536 0 7
-352 8 8
-3603 1 1
-17 3 0
-697 1 0
-269 3 0
-974 6 5
-96 0 10
-1096 10 10
-1177 14 12
-110 3 3
-1028 12 9
-1090 1 0
-173 0 16
-1066 4 0
-4779 1 1
-42 1 1
-722 1 0
-548 2 2
-44 1 1
-424 54 54
-61 1 1
-59 1 1
-2086 0 15
-1500 1 0
-1754 2 0
-11209362
-
-chain 15150451 chr19_random 301858 + 142689 301858 chr19_gl000209_random 159169 + 0 159169 196
-159169
-
-chain 8748871 chr19_random 301858 + 0 92689 chr19_gl000208_random 92689 + 0 92689 377
-92689
-
-chain 14432273 chr1_random 1663265 + 444114 915337 chr1 249250621 - 104328377 105379619 206
-1802 63331 510
-7296 6958 14784
-7961 0 2
-631 19782 48350
-2466 1 1
-72 1 1
-281 2 2
-18 1 1
-2234 1 1
-23 2 1
-1869 0 2
-890 0 1
-2816 0 3
-59 12 12
-1298 1 1
-11 1 1
-294 214294 820733
-136815
-
-chain 10693564 chr1_random 1663265 + 965337 1079393 chr1 249250621 + 199645090 199759149 300
-3537 0 2
-1755 1 1
-38 1 1
-15918 1 0
-2372 0 1
-1251 34 34
-7007 1 6
-3552 1 1
-44 1 1
-799 1 1
-42 1 1
-3907 2 0
-1780 1 1
-49 1 1
-1586 2 0
-197 1 1
-37 1 1
-292 1 1
-47 1 1
-927 0 2
-549 1 1
-27 1 1
-595 1 1
-18 1 1
-291 0 2
-6685 1 0
-2369 1 0
-6503 13 13
-639 1 1
-70 1 1
-477 1 0
-1001 0 2
-1967 2 0
-3454 1 1
-26 1 1
-3144 0 4
-89 1 0
-6546 14 15
-6194 1 0
-5390 13 13
-196 1 0
-7401 1 9
-1242 1 0
-1702 1 0
-477 1 1
-61 0 1
-1487 1 0
-1276 1 0
-1950 9 0
-4681 0 2
-1332 1 0
-956
-
-chain 10110185 chr1_random 1663265 + 1464329 1570762 chr1_gl000191_random 106433 + 0 106433 317
-106433
-
-chain 6680210 chr1_random 1663265 + 198768 359123 chr1 249250621 + 1257620 1436018 467
-467 0 1
-41 0 1
-10 4 4
-930 2 3
-122 3 4
-138 66071 6986
-47 0 1
-945 0 1
-279 1 2
-508 0 1
-482 0 1
-1285 1 1
-40 1 1
-199 0 1
-207 1 1
-29 1 1
-1021 0 1
-1168 0 2
-388 0 1
-69 15 17
-195 4 4
-52 1 1
-9 1 3
-23 0 1
-284 0 1
-1485 15 16
-138 9 9
-27 44 5
-35 46 46
-97 0 1
-5 0 1
-734 0 3
-257 1 1
-18 1 1
-442 0 2
-51 4 0
-424 0 1
-134 1 1
-39 0 1
-22 1 1
-564 15 17
-469 0 3
-39 0 1
-22 2 2
-1076 0 1
-210 14 14
-166 0 1
-3264 1 0
-111 0 1
-309 19898 50666
-91 0 1
-116 0 1
-56 0 1
-152 0 1
-46 0 1
-51 0 1
-63 0 2
-420 4 5
-697 0 1
-2269 7 0
-48 1 1
-4086 0 2
-317 0 1
-49 0 1
-1795 0 1
-1147 1 1
-39 1 1
-1378 0 17
-477 2 0
-4457 1 1
-105 0 1
-1003 0 1
-232 1 2
-147 277 46717
-169 0 1
-37 1 1
-227 0 2
-651 1 0
-1805 1 1
-45 1 1
-498 1 0
-233 1 1
-29 1 1
-231 12 20
-2015 0 1
-20 1 1
-653 0 1
-12 0 1
-17 1 1
-139 0 1
-10 0 1
-22 0 1
-37 16 19
-38 0 5
-54 0 1
-437 0 1
-539 2 0
-1067 0 1
-1042 1 0
-2434 10 0
-256 133 0
-839 0 1
-267 0 1
-640 1 1
-35 1 1
-1351 15 15
-1316 1 1
-31 0 1
-1986 5 5
-1179 0 1
-3153 1 0
-1165 0 1
-22 0 1
-56 1 1
-27 1 1
-77 0 1
-81 15 17
-111 1 1
-44 0 1
-2254 1 0
-320 1 0
-2368 0 1
-26 0 1
-407 5 6
-2982 0 4
-852 0 5
-703 1 0
-191 2 3
-73 5 5
-72
-
-chain 4901563 chr1_random 1663265 + 676697 728522 chr1 249250621 - 205721991 205773795 637
-1664 1 0
-299 1 0
-1113 4 0
-100 1 0
-1522 1 1
-46 1 1
-83 1 1
-30 1 1
-62 1 1
-46 1 1
-1990 1 1
-41 1 1
-1403 0 4
-1148 0 5
-10134 1 1
-21 1 1
-1479 1 0
-1499 9 9
-3057 0 2
-137 6 0
-1251 2 0
-21 1 1
-897 5 4
-2851 1 0
-399 0 2
-624 6 5
-440 1 0
-5 1 0
-2953 1 0
-480 9 0
-2793 36 35
-6791 1 0
-4870 1 0
-1478
-
-chain 4504833 chr1_random 1663265 + 1205412 1353281 chr1 249250621 - 133273039 133340206 679
-3980 0 1
-79 1 1
-34 1 1
-916 4 6
-1818 34 28
-51 21 16
-5 1 0
-5 1 0
-4 1 0
-11 1 0
-28 1 0
-8 1 0
-8 1 0
-1366 1 1
-38 0 1
-7507 0 1
-3084 2 0
-2569 1 0
-20 1 0
-8 1 0
-10 21 16
-51 10 10
-3979 6 5
-2086 1 0
-5466 0 1
-27 1 1
-1117 1 0
-66 1 0
-23 1 0
-2070 0 1
-67 1 0
-2611 1 0
-9 1 0
-23 23 18
-577 97925 17254
-5929 0 1
-1948 1 0
-72 0 1
-1365 60 62
-706
-
-chain 3984524 chr1_random 1663265 + 1620762 1663230 chrX 155270560 - 27920664 27963158 751
-107 0 1
-696 27 12
-658 0 12
-1440 0 2
-671 0 2
-506 0 3
-806 0 1
-4759 0 12
-131 1 0
-848 1 0
-213 0 8
-2046 1 0
-4979 0 1
-2482 1 0
-1502 1 0
-3474 0 4
-782 0 1
-12366 1 0
-3969
-
-chain 2698055 chr1_random 1663265 + 6164 122978 chr1 249250621 - 139553697 139584554 1020
-486 1 1
-19 9 9
-297 1 1
-73 1 1
-341 1 0
-105 1 0
-286 47997 0
-689 1 1
-48 1 1
-53 0 2
-1870 1 1
-39 1 1
-1682 0 39
-470 8 9
-691 1 0
-370 1 1
-24 1 1
-356 0 1
-1496 9599 84
-28 0 1
-7 4 0
-131 0 1
-66 932 181
-88 9 11
-10 7 0
-10 8 5
-5 0 3
-76 27759 26
-44 3 0
-26 0 2
-6 1 1
-59 3 1
-121 2 4
-4990 1 0
-672 0 1
-1487 1 1
-39 1 1
-1691 0 1
-36 10 10
-3503 1 1
-46 1 1
-4128 0 1
-1818 0 5
-1107 16 16
-841
-
-chain 2474973 chr1_random 1663265 + 1129393 1155387 chr1 249250621 + 229232478 229258468 1104
-3505 1 1
-44 1 1
-5232 4 0
-17207
-
-chain 2468882 chr1_random 1663265 + 1280682 1387454 chr1 249250621 - 133163307 133238928 735
-149 0 1
-7073 122 124
-1799 1 1
-43 1 1
-5594 24 23
-60 12182 28596
-3279 1 0
-571 21 21
-1080 1 0
-10 0 2
-1138 1 0
-3484 1 0
-1689 0 8
-810 42350 1
-1088 1 1
-21 1 0
-78 30 29
-746 0 2
-2729 1 0
-2088 0 3
-1949 966 174
-31 9 0
-12 16 16
-29 0 4
-13 100 98
-53 1884 0
-16 1 0
-5 0 1
-18 3916 1388
-1729 0 1
-1373 1 0
-102 1 0
-21 1 0
-4 1 0
-7 1 0
-38 2 0
-48 1 0
-525 5 4
-645 5 5
-1189 1 0
-1911 4 0
-69 8 8
-24 5 4
-284 1 0
-1481
-
-chain 2064841 chr1_random 1663265 + 247141 392880 chr1 249250621 - 247850669 247948213 608
-351 1 0
-965 0 1
-35 0 1
-248 0 1
-122 0 1
-1194 11 11
-580 3 5
-969 0 1
-425 5 5
-25 1 1
-586 1 1
-77 1 1
-1895 1 1
-37 1 2
-253 0 1
-560 1 1
-62 1 1
-74 1 1
-27 1 1
-90 31631 11346
-887 0 40
-759 32 0
-2596 0 1
-308 1 0
-37 0 1
-40 0 1
-346 17 19
-89 2 2
-34 1 2
-44 0 2
-35 0 1
-20 0 1
-260 0 1
-3009 1 1
-30 0 1
-5 10 12
-104 1 1
-48 0 1
-67 13 15
-1226 0 1
-111 7 7
-31 0 1
-47 1 3
-13 3 5
-38 7 10
-7 0 2
-48 0 1
-110 1 0
-623 0 2
-241 1 1
-47 1 1
-1601 0 1
-582 13 21
-1128 2 0
-348 4 4
-28 22 23
-481 0 2
-30 1 1
-628 0 1
-96 0 1
-30 0 1
-78 17 173
-64 55865 28961
-69 13 14
-498 0 1
-1593 0 4
-183 26 27
-337 1 0
-1433 0 1
-6191 0 2
-2435 0 1
-3451 540 0
-83 695 0
-1318 5 5
-21 1 1
-526 0 1
-833 0 1
-144 0 1
-427 8 8
-235 1 2
-297 1 1
-34 0 1
-250 0 3
-1007 0 1
-1403 1 1
-37 1 1
-355 1 1
-6 0 2
-94 1 1
-278 2 2
-5 0 1
-20 1 1
-667 24 24
-1858 10 12
-146 8 7
-2002 0 1
-284 0 1
-1233 0 1
-840 11 0
-914 2 0
-122 1 1
-26 0 2
-118
-
-chain 1850028 chr1_random 1663265 + 76914 101906 chr1 249250621 - 139621990 139717568 1363
-3916 0 1
-77 20 20
-26 0 856
-764 17 16
-12 1 0
-295 1 0
-2648 2870 23264
-250 997 50331
-2203 0 5
-797 1 0
-2197 1 1
-117 7 8
-429 1 0
-7345
-
-chain 1707631 chr1_random 1663265 + 501749 626697 chr1 249250621 + 144188000 145316961 852
-223 42 42
-236 22 22
-242 91 103
-199 8 8
-102 112 112
-50 126 126
-290 32 32
-213 45 45
-125 1 1
-56 1 1
-82 1 1
-27 13 13
-71 5 5
-493 3 3
-15 1 1
-248 1 1
-44 1 1
-65 1 1
-52 1 1
-169 1 1
-82 1 1
-292 1 1
-83 0 1580
-458 1 1
-16 1 1
-478 5 5
-568 23 17
-634 1 1
-46 1 1
-50 14 14
-864 31 61
-55 23320 364967
-85 1 1
-107 1 1
-376 1 1
-20 0 1
-195 10 10
-150 1 1
-35 1 1
-274 5 5
-143 1 0
-862 7 0
-20 1 0
-504 1 1
-25 1 1
-238 1 1
-36 1 1
-139 0 1
-25 1 1
-157 8 8
-60 16 16
-59 17 17
-285 0 1
-120 1 1
-69 1 1
-509 1 1
-59 1 1
-162 0 322
-70 5 5
-2169 1 1
-31 1 1
-224 1 1
-36 1 1
-76 1 0
-5 5 0
-109 6 6
-139 5 3
-65 0 20
-360 47 48
-86 18 17
-149 44 44
-76 54 55
-196 38 38
-139 139 6280
-107 1 1
-95 0 1
-46 1 1
-91 1 1
-18 1 1
-62 11 11
-511 0 1
-106 1 0
-505 0 2
-443 9 9
-519 112 112
-396 1 1
-26 1 1
-225 1 1
-57 1 1
-502 1 0
-485 1 1
-105 0 2
-146 1 1
-41 1 1
-203 1 1
-45 1 1
-62 5 5
-850 1 1
-55 2 2
-215 1 1
-45 1 1
-474 0 3
-19 1 1
-2337 1 1
-34 1 1
-148 1 0
-159 1 1
-32 1 1
-64 0 4
-849 1 1
-34 1 1
-126 38816 272842
-32 0 140
-3176 18 17
-6689 1 0
-274 0 1
-1449 0 1
-1312 1 0
-1861 8888 417910
-92 172 6531
-148 0 2
-213 1 1
-30 1 1
-227 1 1
-62 6 0
-276 1 1
-35 1 1
-94 14 14
-325 5 5
-118 1 1
-81 1 1
-234 4 0
-15 1 1
-243 1 1
-39 1 1
-117 1 1
-35 1 1
-83 1 1
-64 5 5
-55 13 13
-61 11 11
-175 1 1
-27 1 1
-134 1 1
-60 1 1
-64 1 1
-87 1 1
-615 1 1
-22 1 1
-201 5 5
-48 1 1
-117 1 1
-23 3 3
-319 6 6
-156 0 1
-25 1 1
-215 13 13
-97 14 14
-113 0 3
-35 1 1
-65 15 15
-480 0 1
-636 1 1
-107 1 1
-753 1 1
-43 1 1
-861 17 16
-470 1 1
-38 1 1
-579 1 1
-25 1 1
-224 1 1
-71 1 1
-266 36 36
-167 88 88
-400 53 53
-131 6 5
-220 22 19
-317 23 23
-109 95 101
-73 0 4726
-208 28 28
-293
-
-chain 1680348 chr1_random 1663265 + 1245440 1263421 chr1 249250621 + 116101959 116120000 1475
-441 0 14
-728 0 2
-1146 2 0
-1829 6 6
-93 3 2
-2916 0 6
-2013 0 47
-369 1 1
-27 9 0
-37 1 1
-200 1 0
-2285 0 2
-3527 1 1
-24 0 1
-1001 0 1
-1195 1 1
-39 1 1
-85
-
-chain 1335863 chr1_random 1663265 + 231796 246037 chr4 191154276 - 30408128 30422371 1784
-3391 6 6
-562 7 7
-5976 2 3
-4144 10 11
-143
-
-chain 1170727 chr1_random 1663265 + 577933 590476 chr1 249250621 + 144898104 144910646 2036
-1896 48 48
-2779 1 0
-7128 45 45
-646
-
-chain 1143882 chr1_random 1663265 + 1330802 1343100 chr1 249250621 - 133251270 133263558 2093
-1050 1 1
-51 1 1
-237 1 1
-35 1 1
-514 16 12
-76 9 1
-1642 12 12
-53 0 1
-3766 0 1
-40 1 1
-1513 0 1
-195 11 11
-135 26 26
-2627 1 0
-284
-
-chain 988809 chr1_random 1663265 + 564355 574807 chr1 249250621 - 104390169 104400621 2516
-59 1 2
-5994 1 1
-45 1 1
-3985 3 3
-42 1 0
-320
-
-chain 957971 chr1_random 1663265 + 256162 266426 chr1 249250621 + 1291904 1302191 2686
-83 0 1
-585 0 1
-1018 0 1
-18 1 1
-59 16 16
-1569 0 1
-69 1 0
-35 0 1
-36 1 1
-176 0 1
-48 0 1
-56 2 3
-41 0 1
-160 17 1
-461 13 21
-174 0 4
-517 7 7
-141 4 4
-89 0 1
-1155 1 0
-370 7 7
-143 1 0
-1019 22 22
-1177 0 1
-607 0 16
-86 0 3
-279
-
-chain 895962 chr1_random 1663265 + 196343 223209 chr1 249250621 - 247894293 247990621 2587
-108 25 24
-131 0 1
-299 0 1
-137 44 45
-51 0 1
-572 0 1
-406 36 37
-508 2162 63455
-80 5 8
-86 0 1
-61 0 1
-31 1 0
-165 14 15
-78 75 78
-234 0 1
-152 13 15
-849 0 1
-1798 12505 20653
-3495 0 1
-43 0 1
-1944 1 1
-26 1 1
-169 0 1
-365 0 1
-196
-
-chain 884318 chr1_random 1663265 + 4444 145186 chr1 249250621 + 109546538 109651856 1047
-123 47 1183
-818 1 1
-75 1 0
-22 1 1
-455 18927 20784
-855 1 0
-74 12001 11300
-2581 2 2
-31 0 1
-81 1 0
-24 1 1
-123 1 0
-147 0 1
-45 0 1
-26 0 1
-9 1 0
-12 2330 786
-22 41 53
-127 1706 714
-3729 74524 39329
-68 5 7
-3088 2 2
-15 5 6
-14 0 2
-657 1 1
-37 1 1
-2140 1 0
-3034 1 0
-42 1 1
-446 0 1
-55 2 2
-30 1 1
-391 1 1
-35 1 1
-982 3 0
-123 1 1
-28 0 4
-1503 1 0
-1159 0 3
-1464 0 1
-838 1 1
-47 1 3
-162 1 0
-139 1 1
-10 0 1
-2424 6 6
-448 1 0
-846 5 0
-1509
-
-chain 739113 chr1_random 1663265 + 68329 76740 chr1 249250621 + 109654512 109662863 6250
-254 1 0
-27 1 1
-746 1 0
-315 19 19
-163 42 2
-51 3 1
-44 1 1
-592 0 1
-216 1 1
-34 1 1
-2323 10 0
-10 236 236
-125 1 0
-806 213 213
-828 6 0
-82 6 6
-1253
-
-chain 688441 chr1_random 1663265 + 605533 614556 chr1 249250621 + 144612760 144812114 1498
-76 1 1
-70 1 1
-73 4 2
-40 0 2
-159 1 1
-56 2 0
-911 1 1
-63 1 1
-84 9 1
-149 1 1
-21 1 0
-606 1 1
-21 3 3
-132 12 10
-368 1 1
-26 1 1
-50 1 1
-65 1 1
-57 1 1
-44 1 1
-279 0 1
-34 0 4
-7 1 1
-308 0 32
-331 1 1
-84 1 1
-286 1 1
-35 1 1
-59 8 8
-146 1 1
-237 1 1
-52 1 1
-35 2 0
-40 1 1
-53 3 3
-103 1 1
-397 1 1
-59 1 0
-33 1 1
-587 11 11
-219 10 10
-71 5 5
-62 1 1
-38 1 1
-240 1 1
-70 1 1
-85 12 12
-86 413 190724
-207 1 0
-825 186 186
-172
-
-chain 590572 chr1_random 1663265 + 516651 523401 chr1 249250621 - 104651805 104658532 8996
-157 1 1
-17 1 1
-395 1 1
-65 1 1
-187 0 9
-21 1 1
-62 16 16
-110 2 0
-205 1 0
-43 1 1
-248 1 1
-59 4 2
-725 1 1
-49 1 1
-455 1 1
-106 1 1
-450 1 1
-133 0 2
-383 1 1
-37 1 1
-178 4 4
-70 1 1
-85 2 2
-43 1 1
-56 1 1
-22 24 0
-30 1 1
-64 1 1
-21 1 1
-198 1 1
-67 1 1
-58 1 0
-79 7 6
-74 1 1
-79 1 0
-26 1 1
-202 15 15
-352 2 2
-16 1 1
-51 22 19
-574 0 1
-87 1 1
-46 1 1
-88 1 1
-27 1 1
-120
-
-chain 526301 chr1_random 1663265 + 1264935 1361969 chr1 249250621 + 116056429 116101915 1232
-69 0 1
-30 1 1
-2663 2 0
-4185 1 0
-229 1 0
-25 1 1
-1104 1 0
-604 4 0
-1264 1 0
-2613 1 1
-21 1 0
-12 1 13
-2785 72844 21309
-397 19 2
-2203 1 1
-31 1 1
-658 1 1
-27 1 1
-923 9 9
-168 1 1
-46 0 2
-2502 43 43
-879 17 17
-644
-
-chain 506365 chr1_random 1663265 + 1399143 1404500 chr1 249250621 - 133194419 133199775 28136
-3175 1 0
-1447 0 1
-512 1 0
-221
-
-chain 482769 chr1_random 1663265 + 211415 216543 chr1 249250621 - 247889067 247894197 45886
-70 2 3
-905 2 3
-1091 1 1
-23 1 1
-302 15 14
-393 1 1
-24 1 1
-1961 0 1
-336
-
-chain 474976 chr1_random 1663265 + 1295676 1399043 chr1 249250621 + 115999419 116093083 1267
-571 10 10
-627 7 6
-46 1 1
-3095 0 1
-960 0 1
-608 11 10
-426 39 35
-2035 1 1
-23 1 1
-1866 17 18
-79 1 1
-1530 63368 32589
-866 110 110
-100 53 53
-1884 40 40
-3775 15606 36683
-2322 14 14
-145 49 49
-296 96 96
-297 0 2
-465 58 58
-262 22 22
-182 0 1
-638 1 0
-764
-
-chain 456897 chr1_random 1663265 + 1317 37745 chr1 249250621 + 109592282 109609521 6704
-1178 0 1
-16 1 0
-10 0 1
-4 1 1
-245 7763 188
-27 1 1
-1155 1 1
-91 4156 3450
-1810 51 51
-50 9 10
-567 3839 4491
-37 6346 0
-128 0 2
-29 50 48
-45 1519 155
-6 2 0
-9 10 6
-246 1806 0
-18 1 0
-5 2068 31
-2018 2 2
-20 3 3
-833 1 0
-101 1 0
-149
-
-chain 426748 chr1_random 1663265 + 63710 68210 chr1 249250621 - 139547929 139552428 99412
-1542 1 0
-2957
-
-chain 353264 chr1_random 1663265 + 462791 467071 chr1 249250621 + 144608404 144612698 156569
-71 50 50
-33 29 29
-226 10 10
-526 66 67
-55 50 50
-414 5 5
-57 46 58
-57 12 12
-254 1 1
-25 1 1
-52 13 13
-638 16 16
-579 1 1
-60 1 1
-178 1 1
-79 1 0
-35 0 3
-111 1 1
-43 1 1
-264 1 0
-119 1 1
-15 0 1
-76 1 0
-5
-
-chain 327229 chr1_random 1663265 + 1409275 1412904 chr1 249250621 + 115977641 115981270 200837
-2640 156 155
-473 0 1
-360
-
-chain 312923 chr1_random 1663265 + 1319916 1393318 chr1 249250621 + 115926067 115986980 1722
-1418 1 0
-1389 1 0
-1620 0 1
-374 1 0
-1361 0 1
-1994 1 0
-827 0 6
-1784 56909 44431
-253 1 0
-12 2 0
-8 24 14
-5344 2 0
-76
-
-chain 244562 chr1_random 1663265 + 478502 503782 chr1 249250621 - 100680024 100953393 1328
-106 13 13
-478 55 55
-310 1 1
-23 1 1
-376 1 1
-61 1 1
-1100 10 10
-810 5 0
-53 1 1
-119 1 1
-44 1 0
-94 100 32051
-60 5 5
-744 1 1
-87 1 1
-44 2 0
-53 11 5
-584 2 2
-30 0 17
-73 1 1
-49 1 1
-456 8 8
-796 19 19
-166 1 1
-42 1 1
-105 1 1
-38 1 1
-55 1 1
-80 1 1
-293 2 2
-19 1 1
-550 5637 9366
-68 24 22
-103 1 1
-35 0 1
-102 1 1
-39 6 0
-388 9 9
-21 1 1
-338 27 27
-500 4 0
-117 5 5
-271 1 1
-38 1 1
-273 3 3
-16 3 3
-80 1 1
-63 1 1
-130 1 1
-18 1 1
-204 1 1
-45 1 1
-141 1 1
-112 1 1
-75 1 0
-75 4 4
-83 2 0
-854 5 5
-104 0 4
-12 1 1
-351 1 1
-40 1 1
-102 4779 217183
-40 502 502
-31 0 12
-58 311 311
-110 52 52
-78 1 1
-46 535 535
-45
-
-chain 239113 chr1_random 1663265 + 455713 471283 chr1 249250621 + 144877306 144889304 5703
-73 1 0
-944 0 1
-2741 1 1
-77 1770 1206
-12 1449 338
-10 71 1301
-14 10 145
-26 4281 1018
-2672 0 1
-1418
-
-chain 228041 chr1_random 1663265 + 450807 453388 chr1_gl000192_random 547496 + 525635 528523 474030
-521 25 26
-256 4 316
-195 1 0
-183 4 0
-249 48 48
-915 19 18
-161
-
-chain 219405 chr1_random 1663265 + 8071 23476 chr1 249250621 + 109602419 109665881 23204
-1669 2217 48069
-1950 5 1
-213 6609 8813
-681 1 0
-580 0 1
-296 37 38
-248 0 4
-301 31 31
-143 38 38
-386
-
-chain 219231 chr1_random 1663265 + 32127 34517 chr1 249250621 - 139682423 139684814 491274
-85 27 27
-14 0 1
-204 5 5
-63 24 24
-1968
-
-chain 210320 chr1_random 1663265 + 459650 474308 chr1_gl000192_random 547496 + 522489 531711 22108
-267 0 10
-1175 5 1
-48 0 2
-16 3 3
-119 0 12
-37 12 12
-1340 8711 3256
-34 0 2
-58 1 0
-38 1 0
-351 5 5
-486 17 15
-158 81 81
-76 1 1
-36 1 1
-69 12 13
-1500
-
-chain 207966 chr1_random 1663265 + 29704 55292 chr1 249250621 + 109529352 109557857 7568
-742 273 273
-560 0 1
-232 17541 20458
-729 2 2
-97 3 3
-89 1 1
-68 0 1
-28 1 1
-2575 2 0
-59 1 1
-2585
-
-chain 202325 chr1_random 1663265 + 27243 45056 chr1 249250621 - 139669260 139678536 8944
-1432 157 157
-50 45 45
-677 2608 49
-27 8791 867
-266 9 9
-169 1 1
-62 1 1
-67 7 5
-28 1 1
-1619 22 22
-41 127 127
-21 1 1
-40 2 1
-32 1 1
-362 0 1949
-1147
-
-chain 199687 chr1_random 1663265 + 18553 20627 chr1 249250621 + 109595202 109597276 600797
-2074
-
-chain 171508 chr1_random 1663265 + 447628 491985 chr1 249250621 + 148535207 148566609 6481
-121 14 14
-517 0 4
-507 1 0
-74 1 1
-41 0 1
-61 4541 11291
-1073 1 0
-718 70 44
-66 31371 11607
-690 1 1
-115 1 1
-61 1 1
-70 1 1
-57 0 4
-54 1 1
-41 2 6
-28 5 77
-73 1 1
-34 5 5
-887 1 0
-427 1 1
-7 0 5
-40 1 1
-59 1 1
-47 1 1
-121 9 9
-57 2 0
-362 1 1
-48 4 4
-429 1 1
-28 1 1
-160 1 1
-92 5 0
-15 0 5
-15 1 1
-139 5 5
-37 1 1
-87 1 1
-40 1 1
-253 1 1
-35 1 1
-197 1 1
-69 1 1
-114 1 1
-79 1 1
-51
-
-chain 170629 chr1_random 1663265 + 474420 479154 chr1 249250621 - 104365477 104643040 2652
-3982 697 273526
-55
-
-chain 143194 chr1_random 1663265 + 449166 450695 chr1 249250621 - 104373413 104374943 899312
-167 0 1
-362 11 11
-989
-
-chain 141808 chr1_random 1663265 + 195186 230464 chr1 249250621 + 1361949 1390000 8100
-66 0 1
-865 27548 20313
-75 1 1
-163 2 2
-2267 0 2
-1549 0 2
-37 1 1
-597 1 1
-28 1 1
-269 14 19
-59 1 1
-20 1 1
-734 2 0
-977
-
-chain 137395 chr1_random 1663265 + 446016 447466 chr1 249250621 + 144922370 144923820 937713
-1450
-
-chain 120082 chr1_random 1663265 + 1413004 1414278 chr1 249250621 + 115908963 115910237 1071399
-1274
-
-chain 110577 chr1_random 1663265 + 0 1193 chr5 180915260 + 33390295 33391489 1161255
-153 0 1
-942 4 4
-94
-
-chain 101176 chr1_random 1663265 + 442945 444014 chr1 249250621 - 104338746 104339815 1265508
-1069
-
-chain 61431 chr1_random 1663265 + 9891 10535 chr1 249250621 + 109697165 109697809 2020878
-644
-
-chain 48091 chr1_random 1663265 + 497444 501649 chr1 249250621 + 144842054 144846259 8551
-4205
-
-chain 31572 chr1_random 1663265 + 576223 577747 chr4 191154276 + 100714665 100716180 4375428
-114 20 20
-105 460 462
-56 375 378
-65 263 249
-66
-
-chain 28915 chr1_random 1663265 + 230464 231387 chr1 249250621 + 1420670 1421247 4712368
-191 574 228
-67 38 38
-53
-
-chain 27385 chr1_random 1663265 + 205390 205833 chr1 249250621 - 247799065 247799507 5896168
-141 86 86
-106 47 46
-63
-
-chain 25670 chr1_random 1663265 + 87811 88395 chr7 159138663 - 51241913 51242744 3648322
-121 405 652
-58
-
-chain 21035 chr1_random 1663265 + 376636 377171 chr1 249250621 - 247932544 247932844 3872256
-107 118 0
-61 93 15
-49 39 0
-68
-
-chain 18694 chr1_random 1663265 + 540390 626404 chr1 249250621 + 148529505 148589817 1111
-44 254 254
-43 76 73
-54 196 196
-37 240 6477
-31 4 4
-4 2528 2531
-8 1 1
-42 1 1
-60 70185 38258
-94 10137 10136
-31 1 1
-3 167 167
-88 400 400
-52 829 828
-33 10 0
-52 281 281
-28
-
-chain 18305 chr1_random 1663265 + 612752 613165 chr1 249250621 + 146400208 146400621 434456
-18 31 31
-215 97 97
-52
-
-chain 18205 chr1_random 1663265 + 210123 210768 chr1 249250621 + 1400633 1401273 11939617
-55 410 403
-82 10 12
-88
-
-chain 16211 chr1_random 1663265 + 84691 84862 chr5 180915260 + 68593902 68594073 10696361
-171
-
-chain 14543 chr1_random 1663265 + 375983 376437 chr1 249250621 - 247932585 247932921 12601411
-13 231 153
-56 101 61
-53
-
-chain 11766 chr1_random 1663265 + 209234 209374 chr6 171115067 + 48765751 48765891 19406706
-84 4 4
-52
-
-chain 10899 chr1_random 1663265 + 1264583 1264729 chr4 191154276 - 96228610 96228756 20935897
-69 19 19
-58
-
-chain 9779 chr1_random 1663265 + 575439 575892 chr5 180915260 - 127861600 127862049 19918678
-60 389 385
-4
-
-chain 9449 chr1_random 1663265 + 206282 206576 chr1 249250621 - 247814999 247815293 24134146
-64 179 179
-51
-
-chain 9080 chr1_random 1663265 + 376922 377270 chr1 249250621 - 247932789 247932982 12922008
-42 39 0
-12 156 79
-8 39 0
-52
-
-chain 7488 chr1_random 1663265 + 375996 376227 chr1 249250621 - 247932827 247932944 24096271
-39 178 64
-14
-
-chain 7272 chr1_random 1663265 + 492183 493450 chr1_gl000192_random 547496 + 517200 518462 5534
-104 1136 1131
-27
-
-chain 7258 chr1_random 1663265 + 576783 577499 chr14 107349540 - 76512188 76512903 4928952
-56 262 262
-101 216 215
-81
-
-chain 7167 chr1_random 1663265 + 376446 376521 chr1 249250621 - 247932507 247932582 27908410
-75
-
-chain 6857 chr1_random 1663265 + 87342 87413 chr4 191154276 - 48731804 48731875 28524152
-71
-
-chain 6426 chr1_random 1663265 + 508964 509092 chr1 249250621 + 144828390 144828518 146082
-13 51 51
-64
-
-chain 6204 chr1_random 1663265 + 211009 211075 chr1 249250621 + 1467491 1467557 30075428
-66
-
-chain 6008 chr1_random 1663265 + 376783 376999 chr1 249250621 - 247932727 247932982 14593768
-49 132 171
-35
-
-chain 5855 chr1_random 1663265 + 576112 576191 chr20 63025520 + 560198 560277 14627950
-79
-
-chain 5539 chr1_random 1663265 + 247082 247140 chr16 90354753 - 36623787 36623845 31913042
-58
-
-chain 5517 chr1_random 1663265 + 575499 575571 chr1 249250621 - 135388947 135389019 22575370
-19 14 14
-39
-
-chain 5153 chr1_random 1663265 + 463736 463802 chr1 249250621 - 100897669 100897735 496173
-66
-
-chain 4331 chr1_random 1663265 + 576997 577043 chr4 191154276 + 125192159 125192205 31588172
-46
-
-chain 4269 chr1_random 1663265 + 508977 509028 chr1 249250621 - 101245694 101245744 11082093
-11 1 0
-24 1 1
-14
-
-chain 3392 chr1_random 1663265 + 1264741 1264777 chr1 249250621 + 103601716 103601752 22855599
-36
-
-chain 2584 chr1_random 1663265 + 472532 472613 chr1 249250621 - 104701386 104701467 60543
-81
-
-chain 2530 chr1_random 1663265 + 576576 576677 chr2 243199373 + 18874674 18874775 4960893
-101
-
-chain 2443 chr1_random 1663265 + 508878 508906 chr1 249250621 + 145358788 145358816 8460
-28
-
-chain 2298 chr1_random 1663265 + 376035 376059 chr1 249250621 - 247932520 247932544 25650669
-24
-
-chain 2200 chr1_random 1663265 + 377179 377218 chr1 249250621 - 247932814 247932853 18046603
-39
-
-chain 2078 chr1_random 1663265 + 576191 576213 chr2 243199373 - 87184513 87184535 19810119
-22
-
-chain 1902 chr1_random 1663265 + 462945 462974 chr1 249250621 + 146388727 146388756 1440299
-29
-
-chain 1597 chr1_random 1663265 + 87932 87955 chr1 249250621 + 203810737 203810760 8954286
-23
-
-chain 1582 chr1_random 1663265 + 576728 576783 chr12 133851895 + 80469819 80469874 8882774
-55
-
-chain 1575 chr1_random 1663265 + 377270 377295 chr1 249250621 - 247932789 247932814 25950613
-25
-
-chain 1557 chr1_random 1663265 + 376743 376767 chr1 249250621 - 247932958 247932982 25686497
-24
-
-chain 1423 chr1_random 1663265 + 577528 577578 chr3 198022430 + 24122600 24122650 5633229
-50
-
-chain 1401 chr1_random 1663265 + 208964 209027 chr19 59128983 + 53692979 53693042 24768107
-63
-
-chain 1269 chr1_random 1663265 + 577058 577101 chrX 155270560 - 54470903 54470946 5438939
-43
-
-chain 1137 chr1_random 1663265 + 88481 88531 chrX 155270560 - 107394638 107394688 10193603
-50
-
-chain 1096 chr1_random 1663265 + 88429 88481 chr1 249250621 - 213837318 213837370 14790649
-52
-
-chain 963 chr1_random 1663265 + 575892 575970 chr1 249250621 - 198864223 198864301 11419759
-78
-
-chain 917 chr1_random 1663265 + 455298 455327 chr1_gl000192_random 547496 - 58673 58702 411262
-29
-
-chain 870 chr1_random 1663265 + 577218 577269 chr6 171115067 - 89553434 89553485 24911812
-51
-
-chain 794 chr1_random 1663265 + 88312 88337 chr4 191154276 + 171087862 171087887 6635553
-25
-
-chain 649 chr1_random 1663265 + 576545 576576 chr15 102531392 - 5321440 5321471 7251364
-31
-
-chain 622 chr1_random 1663265 + 576462 576495 chr11 135006516 + 114505284 114505317 6564387
-33
-
-chain 546 chr1_random 1663265 + 88531 88556 chr6 171115067 + 144792007 144792032 10415340
-25
-
-chain 398 chr1_random 1663265 + 575763 575814 chr14 107349540 + 34662629 34662680 24063646
-51
-
-chain 22466167312 chr2 242951149 + 0 242751149 chr2 243199373 + 10000 243102476 1
-1201236 1 0
-2057 1 1
-26 1 1
-4043 0 22
-82 101 7
-33 0 74
-36 13 1
-67 0 48
-152 0 418
-50 2 0
-6 6 0
-76 74 0
-20 6 0
-22 118 0
-374 0 2446
-836 0 2310
-21 0 2444
-21507 1 1
-50 0 4
-2041 4 0
-9052 0 2
-81 8 0
-10 42 0
-1078 1 0
-4122 0 1
-1608 1 28
-4029 9 0
-967 1000 4547
-414 0 27
-2237132 1 0
-2458 17 17
-3915 47 47
-633 0 4
-3531 14 14
-3954 50000 51129
-1426129 100025 160449
-11087286 3 0
-773 50000 103977
-1576 1 0
-240 1 0
-318 0 2
-258 16 0
-2848 10 10
-1404 1 1
-27 1 1
-703 0 13
-375 1 0
-4783388 25000 35000
-848 2 0
-1225 2 0
-391 0 1
-3445 24 24
-184 1 1
-28 1 1
-49 4 0
-4514 9 0
-9628 9 1
-1483 7 7
-1990 1 0
-1949 0 1
-2716230 0 1
-46732767 9 5
-9477928 3 0
-7520813 0 72396
-1900436 150000 294073
-17672 0 1
-5792 0 1
-9019 266 0
-2942 1 0
-9388 0 2
-37826 0 4
-23440 4 0
-290929 1000000 1273578
-731068 3000000 3000000
-2558421 1 0
-1196 0 10
-686 1 0
-26 3 0
-15 1 1
-2309 1 0
-1332 23 22
-344 1 0
-1645 4 4
-6564 0 1
-6329 0 1
-769 1 0
-873 0 7
-1299 1 0
-8250 15 15
-4291 12548 10626
-1054 0 103
-84 218 0
-5897 1 1
-33 1 1
-9905 37 51
-1645 113 113
-1597 4 4
-61 1 1
-866 0 13
-2830 0 3
-2819 2 0
-156 436 88
-100 54 0
-4753 8 0
-4903 6 6
-3847 2 0
-108126 145 0
-3542 0 1
-10276 1 0
-402 1 1
-47 1 1
-63 0 2
-583 1 1
-34 1 1
-8975 46 0
-378 1 1
-70 1 1
-2476 102 0
-1754 1 0
-8426 1 0
-11986570 142000 151150
-14207 1 1
-49 1 1
-1784 12 0
-406 0 1
-1874 1 1
-33 1 1
-4795 0 2
-3686 1 1
-15 1 1
-164 0 2
-7287 5 5
-702023 150000 72796
-69 0 1
-1598 1 0
-1340 1 0
-1030 4 0
-1166 10 10
-629 27 27
-5750 1 1
-34 1 1
-3283 4 2
-496 21 1
-25 1 9
-41 1 1
-329 4 4
-9955 41 41
-10953 1 2
-1417 44 0
-911 0 17
-18270 0 1
-178429 281526 0
-34455 406 0
-58863 2 1
-1843 2 0
-14994 1 0
-12992 0 2
-2571146 0 1
-35688061 100000 108224
-29671719 0 1
-39665349 0 1
-14876089 20000 64197
-401 3 0
-1831 1 1
-61 1 1
-654 1 11
-138 28 0
-105 1 1
-25 4 0
-73 9 9
-3247 0 2
-1355 0 1
-816 21 25
-526 1 1
-60 1 1
-773 0 1
-1494 0 1
-448 44 44
-1191 0 1
-21 1 1
-596 0 1
-1582 0 1
-425 3 0
-1141 8 0
-136 744 80
-18 1 0
-4 1 0
-8 4 2
-32 1 0
-71 0 1
-385747 1 1
-110 1 1
-51 7 7
-54 15205 15205
-54 7 7
-51 1 1
-110 1 1
-5198249 1 0
-108 0 40
-65 0 80
-100 2 82
-442 1 1
-35 1 1
-119 129 9
-33 40 0
-42 1 1
-86 40 0
-1330 1 0
-1194 2 0
-11 1 1
-1773 5 0
-1623 1 1
-25 1 1
-2422 1 1
-20 1 0
-2315 1 0
-31 1 1
-1508 3 0
-50 4 0
-970 6 6
-7234 0 4
-1228 0 1
-1233 1 8
-744 16 16
-3447 1 1
-41 1 1
-3297 2 0
-1714 0 2
-2299 0 2
-2143 1 1
-18 1 1
-917 0 1
-1082 1 1
-49 1 1
-9098 4 0
-5529 1 0
-3266 8 0
-894 0 6
-3536 0 2
-4179 13 18
-1785 1 0
-1675 6 0
-1216 33000 32348
-287 109 573
-12548 30000 30000
-952154 25000 41011
-1914 0 1
-225 1 1
-57 1 1
-2910 1 0
-471 0 1
-1956 1 1
-43 1 1
-1000 92 0
-2854 0 3
-1837 0 306
-1007 0 30
-206 35 32
-217 17 17
-1525 0 8
-413 1 1
-32 2 2
-1573 12 12
-2258676
-
-chain 1437141 chr2 242951149 + 234136066 234151271 chr2 243199373 - 8712841 8728046 1459
-15205
-
-chain 1229376 chr2 242951149 + 110524471 111016063 chr2 243199373 - 132402743 134718956 53
-41 12371 12350
-33 0 23
-11 197610 197512
-5295 5 5
-190 69 19
-2195 1 0
-285 34 34
-1682 1 0
-182 11 6
-291 0 1
-1506 15 16
-146 5 5
-2050 51 51
-186 8 7
-68 7 6
-41 1 0
-306 0 1
-1545 1 0
-1334 25 24
-543 0 2
-224 17 21
-615 1 0
-208 2 0
-158 27 21
-3320 0 1
-576 0 2
-4562 0 6
-1023 0 1
-977 0 1
-3904 1 0
-827 415 28
-1508 14 13
-9571 36 36
-1393 1 1
-42 1 1
-2205 0 2
-5258 36 0
-42 2 0
-4437 2 0
-3357 1 0
-6289 0 9
-1996 1 0
-3228 0 1
-202 0 1
-2743 7 0
-24 0 5
-549 3 1
-942 0 6
-1815 8 0
-874 0 3
-4737 0 2
-852 14 18
-518 14 14
-4377 1 1
-49 1 1
-3270 1 0
-753 0 4
-240 1 0
-2391 0 1
-4745 4 0
-5752 0 2
-880 0 1
-397 1 0
-1407 0 3
-120 1 1
-89 1 1
-7011 3 0
-188 8 8
-834 5 0
-94 18 18
-3711 150112 1975291
-345 52 52
-100 8 8
-52 6 6
-650 6 6
-273 91 95
-88 90 90
-331 116 116
-66 35 35
-145 13 15
-95 6 6
-301 43 47
-444 12 12
-645 116 119
-215 31 31
-748 58 57
-212 71 71
-420 38 38
-190 4 4
-51 32 32
-65 32 32
-182 69 69
-161 17 17
-74 36 36
-170 25 25
-124 19 15
-230
-
-chain 33206 chr2 242951149 + 111008548 111015495 chr2 243199373 + 113147044 113153995 310
-112 345 345
-52 1095 1095
-15 0 4
-76 88 88
-90 331 331
-116 66 66
-35 560 560
-43 1101 1101
-116 215 215
-31 748 748
-58 212 212
-71 420 420
-38 245 245
-32 65 65
-32 182 182
-69 252 252
-36
-
-chain 15095 chr2 242951149 + 97284299 97473552 chr2 243199373 - 145080546 145267103 122
-48 13638 11732
-218 15837 15837
-37 1645 1645
-113 8336 8336
-436 100 100
-54 121645 121635
-3 25 0
-101 26915 26159
-9 0 1
-93
-
-chain 10366 chr2 242951149 + 110742577 110753868 chr2 243199373 + 113162562 113173850 1257
-34 5889 5884
-51 5290 5292
-27
-
-chain 3994 chr2 242951149 + 111050518 111050561 chr2 243199373 - 132647167 132647210 483
-43
-
-chain 3626 chr2 242951149 + 1208025 1208063 chr2 243199373 + 1217618 1217656 30090800
-38
-
-chain 3098 chr2 242951149 + 110780566 110780602 chr2 243199373 + 100698198 100698234 394442
-36
-
-chain 2548 chr2 242951149 + 89594034 89594300 chr2 243199373 - 153635204 153635700 103
-90 9 107
-22 9 0
-32 3 0
-5 0 125
-21 15 30
-5 1 0
-25 0 5
-29
-
-chain 2507 chr2 242951149 + 1207989 1208025 chr2 243199373 + 1217656 1217692 7254147
-36
-
-chain 2306 chr2 242951149 + 97446409 97446434 chr2 243199373 + 98080299 98080324 1844703
-25
-
-chain 5644665978 chr20 62435964 + 8000 62435964 chr20 63025520 + 60000 62965520 20
-26259569 1765661 3100000
-234339 1000000 150000
-4004088 0 1
-6459 0 244
-37810 0 2
-1044573 20000 50000
-9411883 2 8
-362 0 1
-11607353 0 1
-1301304 1 0
-31033 0 9
-1154 0 2
-1088 1 1
-29 1 1
-2509 0 2
-407 1 0
-40 1 1
-3787164 27050 50000
-71932 110000 50000
-694117 0 1
-1008033
-
-chain 3228730713 chr21 46944323 + 9719767 46944323 chr21 48129895 + 10697896 48119895 23
-490233 3050000 3150000
-19828060 0 1
-8789369 1199 50000
-243783 1500 1500
-1381822 1359 50000
-3437231
-
-chain 42537850 chr21_random 1679693 + 281005 1255172 chr21 48129895 + 9411193 10647896 88
-184355 50000 489372
-131056 458754 281918
-150002
-
-chain 21600281 chr21_random 1679693 + 876305 1679693 chr21 48129895 - 37585054 38304458 99
-178865 280890 346005
-315 2 2
-38 1 1
-261 1 1
-24 1 1
-157 0 325
-16 1 1
-85 1 1
-66 1 1
-330 11 11
-235 1 1
-51 1 1
-405 1 1
-26 1 1
-130 5 5
-80 1 1
-91 1 1
-20 1 1
-244 0 1
-478 1 1
-5 1 0
-13 0 1
-49 1 1
-197 10 10
-158 1 1
-57 0 1
-829 1 1
-60 1 1
-51 0 1
-584 1 0
-21 2 0
-151 20 20
-316 1 1
-16 1 1
-100 7 7
-102 1 1
-49 1 1
-125 1 0
-102 13 13
-153 20 20
-199 1 0
-35 1 1
-367 1 1
-51 1 1
-344 1 1
-101 1 1
-243 1 1
-27 1 1
-338 0 4
-166 15 15
-73 1 1
-44 1 1
-282 4 4
-67 1 1
-54 1 1
-216 1 1
-48 1 1
-76 1 1
-70 1 1
-392 1 1
-44 1 1
-65 8 9
-362 0 4
-34 1 1
-68 1 1
-57 1 0
-120 1 1
-374 1 1
-21 1 1
-121 1 1
-34 1 1
-80 1 0
-64 2 0
-162 8 8
-184 1 1
-34 1 1
-658 2 2
-52 0 4
-297 1 0
-136 1 1
-20 1 1
-905 0 1
-250 7 8
-138 0 3
-104 1 0
-42 1 1
-539 0 1
-43 4 0
-633 0 20
-353 17 17
-969 4 0
-39 3 3
-210 3 1
-188 7 7
-459 2 2
-25 1 1
-207 1 1
-55 1 1
-375 1 1
-66 1 1
-599 0 2
-395 1 1
-33 1 1
-73 1 1
-35 2 0
-275 9999 10000
-353 1 1
-26 1 1
-423 1 1
-32 1 1
-86 7 7
-197 1 1
-44 1 1
-96 1 1
-77 7 0
-247 0 2
-77 1 1
-425 13 1
-32 1 1
-65 1 1
-217 3 2
-115 1 1
-33 1 1
-268 1 0
-959 1 1
-63 1 1
-93 5 5
-185 1 1
-31 1 1
-944 12 12
-413 1 1
-92 1 1
-276 1 1
-35 1 1
-500 1 1
-31 149436 9
-158069
-
-chain 14432948 chr21_random 1679693 + 78709 231005 chr21 48129895 + 9882623 10034920 205
-77296 0 1
-75000
-
-chain 7807601 chr21_random 1679693 + 1362161 1471624 chr1 249250621 - 105758025 105867745 293
-77 11427 11419
-174 5 5
-857 64 64
-2170 0 2
-621 1 1
-26 1 1
-4365 0 1
-155 0 1
-452 0 4
-941 0 4
-403 1 1
-45 1 1
-534 86 86
-2198 0 1
-303 2 0
-5470 6 6
-845 1 1
-45 1 1
-221 6 0
-321 1 1
-44 1 1
-354 1 0
-374 131 130
-577 6 5
-263 17 16
-207 0 2
-1746 14 14
-3223 1 1
-46 4 4
-1479 1 1
-46 1 1
-383 0 3
-44 1 1
-2724 67 67
-47 145 145
-350 116 116
-138 0 1
-1 65 65
-796 17 17
-645 1 0
-24 1 1
-1318 1 0
-687 1 1
-41 1 1
-2292 1 1
-37 1 1
-589 1 1
-37 1 0
-670 13 13
-357 4 0
-2667 3 0
-1941 1 1
-31 1 1
-1538 54 54
-64 166 166
-120 226 226
-46 14 0
-14 155 155
-92 54 54
-26 55 55
-98 131 131
-36 1 1
-76 391 391
-44 294 294
-37 813 813
-35 219 219
-898 1 1
-19 1 1
-213 12 12
-1926 1 1
-21 1 1
-4561 1 1
-28 1 1
-8361 1 1
-43 1 1
-429 211 492
-3095 0 1
-3873 1 1
-43 5 5
-3785 171 171
-65 122 122
-70 116 116
-29 459 459
-36 352 352
-39 93 93
-39 190 190
-41 1783 1784
-35 509 509
-27 394 394
-57 834 834
-58 10 10
-17 758 760
-41 0 4
-82 194 194
-60 543 543
-31 58 58
-46 607 607
-34 98 98
-31 1 1
-38 563 562
-135 1980 1976
-48 370 370
-42 515 515
-49 456 456
-3137 0 1
-2483 1 0
-357 1 1
-49 1 1
-1181 1 0
-885 1 0
-86
-
-chain 3630496 chr21_random 1679693 + 696416 1463441 chr21 48129895 + 9645548 10215976 235
-129889 481231 310631
-225 46 51
-383 6 6
-73 18 18
-200 18 39
-236 63 68
-123 340 365
-57 300 259
-51 138 138
-71 55 55
-60 152 152
-51 100 103
-61 358 357
-85 1906 236
-88 157 153
-56 39 39
-73 20146 20047
-67 1 0
-57 154 154
-59 940 953
-61 205 205
-60 46 46
-122 149 149
-53 64 56
-210 16 16
-209 1 0
-214 29 29
-71 69616 76139
-67 47 47
-145 350 354
-116 139 135
-65 13718 10425
-54 64 64
-166 120 120
-225 75 75
-74 14 13
-67 92 92
-54 26 26
-55 98 98
-127 117 117
-173 16 15
-202 44 44
-198 21 17
-75 37 37
-442 18 18
-353 35 35
-219 27532 0
-105 0 3
-66 65 65
-122 70 70
-116 29 29
-459 36 36
-278 17 17
-57 39 40
-93 39 39
-190 41 41
-285 16 20
-859 22 37
-176 4 4
-183 32 32
-206 35 36
-509 27 27
-394 57 56
-116 5 5
-596 1 0
-116 85 85
-54 0 1
-119 0 2
-585 124 127
-74 10 11
-109 60 60
-82 22 22
-439 31 31
-58 46 46
-106 21 22
-186 15 14
-279 34 34
-98 70 67
-166 1 0
-396 135 135
-1551 12 12
-90 0 3
-69 4 4
-48 3 0
-203 48 48
-370 42 42
-139 14 53
-362 49 49
-456
-
-chain 2630212 chr21_random 1679693 + 936 28709 chr21 48129895 + 44682664 44710462 1048
-3985 6 7
-8941 0 30
-3327 1 1
-74 1 1
-859 22 22
-89 70 70
-489 14 3
-11 2 1
-10 10 0
-10 0 1
-31 1 27
-556 3 0
-128 0 1
-358 1 1
-45 1 1
-1712 8 0
-6545 32 31
-431
-
-chain 517534 chr21_random 1679693 + 1332563 1373665 chr4_gl000194_random 191469 - 21469 62943 261
-130 2 2
-53 1 1
-139 1 1
-60 1 1
-321 125 125
-72 1 1
-81 59 59
-248 22 23
-250 13 13
-407 61 61
-205 60 60
-46 122 122
-149 53 53
-14 0 8
-50 650 650
-29 19697 20073
-100 1 4
-106 2 2
-158 1 1
-89 1 1
-10 1 1
-65 1 1
-48 1 1
-156 1 1
-61 1 1
-156 1 1
-81 1 1
-522 16 16
-377 22 22
-358 1 1
-17 1 1
-141 1 0
-29 0 1
-16 1 1
-105 1 1
-49 2 1
-63 1 1
-32 1 0
-7 1 1
-349 1 2
-102 1 1
-146 1 0
-93 3 0
-149 1 1
-86 1 1
-220 1 1
-111 1 1
-195 19 19
-108 1 1
-79 6 1
-98 0 1
-29 2 2
-98 1 1
-125 1 1
-196 1 1
-52 1 1
-767 1 1
-68 3 3
-70 1 1
-66 1 1
-331 1 1
-22 1 1
-60 77 77
-437 1 1
-61 1 1
-134 1 1
-48 4 2
-26 0 2
-79 1 1
-16 1 1
-77 1 1
-24 1 1
-176 1 1
-33 1 1
-61 0 4
-141 1 1
-17 1 1
-232 1 1
-42 1 1
-439 2 1
-31 1 1
-55 1 0
-181 1 1
-77 4 4
-145 4 5
-22 1 1
-159 1 6
-53 1 1
-63 1 1
-67 6 6
-71 1 1
-25 1 1
-103 6 6
-303 6513 6492
-211 1 1
-87 1 1
-170 2 2
-36 0 6
-361 1 1
-58 1 1
-292 10 10
-201 1 1
-35
-
-chain 353583 chr21_random 1679693 + 1323386 1332563 chrUn_gl000218 161147 - 0 9198 304
-693 1 1
-28 4 0
-425 51 51
-874 2 4
-421 1 1
-23 1 1
-299 2 1
-20 3 3
-88 1 1
-35 1 1
-283 4 4
-42 4 4
-719 14 14
-181 1 1
-41 1 1
-1010 1 1
-59 1 1
-478 1 1
-45 1 0
-78 1 1
-315 1 1
-22 1 1
-342 1 1
-27 1 1
-716 0 25
-83 1 1
-44 1 1
-218 6 6
-142 1 1
-178 1 1
-220 1 1
-35 1 1
-55 1 1
-44 1 1
-143 1 1
-80 1 1
-85 1 1
-46 1 1
-169 1 1
-56 1 1
-94 1 1
-51 1 1
-48
-
-chain 153763 chr21_random 1679693 + 1307498 1317523 chr1 249250621 + 142541121 142549427 248494
-38 225 225
-46 934 934
-63 240 230
-50 653 627
-57 559 562
-4 186 183
-51 101 101
-16 235 235
-70 1848 174
-58 193 194
-3 255 257
-97 40 40
-164 35 35
-167 27 27
-82 213 218
-106 172 171
-55 274 274
-125 214 209
-158 123 124
-94 169 169
-69 430 425
-66 871 864
-95 213 213
-81
-
-chain 88175 chr21_random 1679693 + 0 28278 chr21_gl000210_random 27682 - 0 27251 1050
-107 675 0
-154 27310 26958
-32
-
-chain 46308 chr21_random 1679693 + 1305249 1307368 chr21 48129895 - 38147885 38150014 728191
-46 171 171
-69 165 166
-32 292 292
-34 184 184
-26 73 73
-23 117 117
-57 54 54
-7 16 25
-68 78 78
-23 242 242
-53 230 230
-59
-
-chain 40072 chr21_random 1679693 + 1311066 1311528 chr3 198022430 + 38430454 38430916 3283349
-95 1 1
-47 1 1
-177 1 1
-41 1 1
-98
-
-chain 25551 chr21_random 1679693 + 1316263 1317134 chr21 48129895 + 10022171 10023044 3443865
-97 94 94
-87 148 147
-94 340 343
-11
-
-chain 20886 chr21_random 1679693 + 1305172 1307309 chrY 59373566 - 45989384 45991522 2022
-77 46 46
-64 50 50
-57 69 70
-165 32 32
-86 11 11
-195 34 34
-184 122 122
-117 57 57
-54 91 91
-50 51 51
-242 61 61
-68 9 9
-145
-
-chain 10360 chr21_random 1679693 + 1384481 1394861 chr21 48129895 - 38158677 38169079 831
-56 10224 10246
-100
-
-chain 9106 chr21_random 1679693 + 1316541 1317639 chr2 243199373 + 56015784 56016880 4408555
-45 37 37
-66 97 95
-66 672 672
-115
-
-chain 7814 chr21_random 1679693 + 1312477 1312593 chr8 146364022 + 34952530 34952621 21041862
-26 37 12
-53
-
-chain 6987 chr21_random 1679693 + 1305359 1306761 chr1 249250621 - 105769657 105771059 738748
-38 5 5
-7 1324 1324
-28
-
-chain 3478 chr21_random 1679693 + 1309705 1309742 chrX 155270560 - 92499801 92499838 30075241
-37
-
-chain 2939 chr21_random 1679693 + 1312274 1312311 chr1 249250621 - 217601682 217601719 16037052
-37
-
-chain 2906 chr21_random 1679693 + 1394861 1394892 chrUn_gl000247 36422 - 2105 2136 848
-31
-
-chain 2805 chr21_random 1679693 + 1309675 1309705 chr4 191154276 - 16268024 16268054 28769751
-30
-
-chain 2788 chr21_random 1679693 + 1374701 1374765 chr4_gl000194_random 191469 - 63980 64044 1175
-9 36 36
-19
-
-chain 2571 chr21_random 1679693 + 1317411 1317442 chr20 63025520 - 39738360 39738391 24462467
-31
-
-chain 2324 chr21_random 1679693 + 1311588 1311646 chr2 243199373 + 3637936 3637994 8156424
-58
-
-chain 1980 chr21_random 1679693 + 1440240 1440313 chr1 249250621 + 142677559 142677632 922
-73
-
-chain 1679 chr21_random 1679693 + 1316387 1316422 chr13 115169878 + 41439086 41439121 11997585
-35
-
-chain 1437 chr21_random 1679693 + 1316422 1316454 chr3 198022430 + 119282439 119282471 8460363
-32
-
-chain 1151 chr21_random 1679693 + 1312216 1312274 chr13 115169878 + 46060123 46060181 10002138
-58
-
-chain 1007 chr21_random 1679693 + 1312144 1312195 chr17 81195210 + 33522637 33522688 8813060
-51
-
-chain 810 chr21_random 1679693 + 1306268 1306301 chr4 191154276 - 63157613 63157646 21715000
-33
-
-chain 762 chr21_random 1679693 + 1312422 1312477 chr7 159138663 + 153013126 153013181 10840208
-55
-
-chain 732 chr21_random 1679693 + 1312000 1312066 chr7 159138663 - 102920653 102920719 25474729
-66
-
-chain 561 chr21_random 1679693 + 18264 18311 chr21 48129895 + 44700101 44700148 25859698
-47
-
-chain 3320960322 chr22 49691432 + 14430000 49591432 chr22 51304566 + 16050000 51244566 22
-647850 150000 150000
-3661581 50000 100000
-15278435 0 18
-293 0 36
-1410 1 1
-46 1 1
-6626947 2 4
-1759 1 1
-43 1 1
-1367363 12000 10615
-7856 4 0
-809336 0 20
-6307 20 0
-6702 50000 2669
-4247727 10618 0
-1558 0 2719
-35231 0 131
-12647 4 0
-45594 85 9
-19562 0 506
-165501 5 7
-1103946 16700 60575
-644 0 2
-319796 1600 1155
-17927 19763 15469
-464566
-
-chain 6025887 chr22_h2_hap1 63661 + 0 63661 chr22 51304566 + 42594964 42658568 527
-748 1 0
-260 4 0
-675 1 0
-4844 0 2
-10592 8 0
-3276 29 0
-2384 10 0
-2795 0 2
-464 1 0
-3865 1 0
-1777 1 0
-1286 0 2
-875 1 0
-2336 1 0
-4337 1 0
-2724 0 3
-1087 6 0
-7154 0 1
-1045 2 0
-11070
-
-chain 15737781 chr22_random 257318 + 90752 257318 chrUn_gl000211 166566 + 0 166566 187
-166566
-
-chain 3641362 chr22_random 257318 + 7 38789 chr11 135006516 - 18284691 18323344 804
-2900 3 1
-66 1 1
-55 1 1
-3449 0 1
-1785 1 1
-37 1 1
-178 1 0
-852 0 1
-2329 2 0
-4939 1 0
-1557 1 1
-30 1 1
-1005 1 0
-622 16 0
-39 0 1
-42 0 22
-755 1 1
-30 1 1
-952 1 1
-26 1 1
-141 18 17
-1110 2 0
-1529 1 1
-22 1 1
-399 1 1
-33 1 1
-1369 20 30
-3959 0 4
-1144 1 0
-1032 27 25
-8 23 0
-56 24 0
-51 0 9
-11 1 57
-34 4 4
-7 134 0
-296 26 0
-25 1 1
-2452 0 5
-19 1 1
-231 1 0
-327 1 0
-962 1 1
-22 1 1
-1571
-
-chain 109494 chr22_random 257318 + 39517 40750 chr22 51304566 - 30977735 30979001 1172425
-166 5 5
-133 3 3
-48 1 1
-297 0 33
-234 1 1
-58 4 4
-283
-
-chain 19094 chr22_random 257318 + 39007 39213 chr22 51304566 - 29625864 29626070 11204980
-206
-
-chain 8587 chr22_random 257318 + 39415 39517 chr22 51304566 - 29782769 29782871 2027258
-50 48 48
-4
-
-chain 3763 chr22_random 257318 + 39465 39513 chr22 51304566 - 30978529 30978577 2726523
-48
-
-chain 17719073 chr2_random 185571 + 0 185498 chr2 243199373 + 242522204 242710000 158
-43034 21 22
-16724 1 0
-52199 0 669
-3059 0 4
-14500 1 0
-409 1 1
-22 1 1
-2039 1 0
-809 0 1
-2041 0 4
-2258 6 6
-4179 12 13
-1973 1 1
-21 1 1
-1855 1 1
-37 2 2
-4315 0 1
-1584 14 0
-281 0 2
-78 1 1
-1497 9 0
-237 2 1
-826 4 0
-21273 4 0
-6716 0 1650
-3449
-
-chain 18404389309 chr3 199501827 + 35000 199446827 chr3 198022430 + 60000 197962430 3
-13552792 1 0
-585083 1 0
-2092 74 72
-31067262 1 0
-90 0 1
-5628461 15 0
-788 0 1
-3676 2 0
-35 1 1
-4682 0 1
-1295 5 0
-437 42 53
-326 2 0
-3309 1 1
-40 1 1
-998 3 0
-3584 0 5
-930 7 5
-845 1 1
-28 1 2
-303 1 0
-509 5 0
-2291 6 6
-2789 0 1
-2541 9692 9690
-949 4 4
-35 1 1
-2874 1 0
-6717 1 0
-2823 0 1
-704 4 0
-5142 0 1
-2490 10 10
-162 7 7
-6308 15 0
-15177535 260003 152352
-2532 0 1
-24209179 4400000 3000000
-60453438 4 0
-40076811 20000 20999
-8195 1 1
-44 1 1
-1408 1 1
-33 1 1
-172 4 3
-25 1 1
-538 13 13
-173 1 1
-27 1 1
-636 1 1
-28 1 1
-470 3 3
-112 1 1
-375 1 1
-26 0 26
-106 0 78
-72 9 6
-12 3 29
-79 5 262
-56 1 1
-20 1 1
-815 43 43
-457 1 1
-49 0 18
-509 3 4
-23 1 1
-391 1 1
-44 1 1
-1270 4 0
-40 1 1
-264 27 31
-2416 2 0
-4377 13 13
-736 1 1
-47 1 1
-1416 1 1
-20 1 1
-1020 1 1
-25 1 1
-482 0 5
-716 0 1
-1697 1 1
-29 1 1
-1270261 27000 23108
-40930 0 1
-17455 1 1
-28 4 4
-45 491 0
-1669 58 0
-18 3 61
-54863 16 53
-7653 6 0
-3 99 0
-170 30 0
-25 0 30
-210 0 45
-359 0 915
-5980 256 640
-1363 1 1
-37 1 1
-7958 1 0
-372 1 0
-2442058
-
-chain 572461 chr3 199501827 + 50900356 50910048 chr3 198022430 - 147087402 147097092 2111
-52 1 6
-5886 1 0
-2586 6 0
-1160
-
-chain 14997 chr3 199501827 + 196923229 196923617 chr3 198022430 + 195437554 195437811 3659243
-77 131 0
-180
-
-chain 6146 chr3 199501827 + 196987930 196988205 chr3 198022430 + 195502296 195502751 2529960
-74 171 141
-23 2 212
-5
-
-chain 4201 chr3 199501827 + 196923126 196923228 chr3 198022430 + 195438036 195438138 6236935
-102
-
-chain 2082 chr3 199501827 + 196994845 196994975 chr3 198022430 + 195509346 195509572 2249717
-55 18 114
-57
-
-chain 20970321 chr3_random 749256 + 196010 556188 chr3 198022430 - 121623404 130096441 129
-131258 0 1
-41217 50000 8162858
-137703
-
-chain 13779918 chr3_random 749256 + 0 146010 chr3 198022430 - 77602115 77748060 219
-64144 1 0
-1191 0 1
-633 0 1
-4651 29 21
-5147 0 1
-947 14 0
-64 56 0
-55 0 2
-2421 0 15
-741 9 0
-371 6 4
-554 1 0
-5424 0 1
-4074 1 1
-44 1 1
-3065 0 1
-2772 1 1
-36 1 1
-15950 1 0
-2351 0 2
-5999 1 0
-17825 0 13
-74 1 1
-367 1 1
-47 1 1
-2084 2 0
-288 0 3
-744 1 0
-131 0 1
-465 1 1
-29 1 1
-659 10 0
-830 0 3
-262 3 0
-1428
-
-chain 13528802 chr3_random 749256 + 606188 749256 chr3 198022430 + 46352896 46495976 221
-8517 0 10
-20860 0 6
-16120 0 1
-4148 7 6
-745 7 6
-517 6 0
-907 5 5
-1382 4 0
-2730 0 1
-1143 36 36
-457 13 17
-1748 1 1
-48 1 1
-954 0 2
-767 1 4
-7353 0 8
-4950 0 12
-13338 0 1
-4685 1 1
-21 1 1
-1414 3 0
-4158 23 23
-5081 0 1
-14097 1 1
-49 1 1
-770 16 16
-424 1 1
-17 1 1
-244 1 1
-23 1 1
-1462 12 0
-2048 14 0
-4573 1 0
-3856 2 0
-754 0 8
-7304 1 0
-5243
-
-chain 17653370240 chr4 191273063 + 0 191263063 chr4 191154276 + 10000 191029082 4
-1413146 51000 71672
-5369 5 6
-65 1 1
-67 1 1
-425 1 1
-32 1 1
-175 1 1
-34 1 1
-5092 1 1
-46 1 1
-1396 15 15
-1446 0 1
-5135 1 0
-586 1 1
-38 1 1
-10 0 21
-1587 0 6
-205 0 3
-97 6 0
-177 0 9
-4059 1 1
-71 1 1
-1413 83 1
-51 7 7
-105 7 7
-67 41 0
-67 42 1
-55 41 0
-25 41 0
-3244 558 0
-64 93 0
-93 558 0
-907 0 2
-1101 55 0
-3473 15 15
-1167 3 0
-25 0 29
-135 29 0
-5074 1 1
-42 1 1
-1825 14 14
-1992 0 3
-23 1 1
-4171 6 6
-796 0 165
-196 0 99
-87 0 33
-190 6 8
-107 2 2
-21 0 2
-62 1 68
-32 14 15
-81 18 18
-55 0 100
-17 1 1
-222 2 169
-51 0 35
-3289 18 18
-298 0 1
-373 0 1
-2965 1 1
-28 0 23
-1704 0 38
-114 0 38
-53 7 44
-119 77 0
-269 1 1
-70 1 1
-2000 23 33
-2400 1 1
-94 1 1
-6002 18 18
-776 1 0
-369 16 16
-418 51 0
-53 1 27
-2181 1 4
-57 1 1
-1973 10 0
-4184 11 11
-1594 0 18
-2038 0 109
-4332 0 7
-49 0 4
-1465 3 1
-4156 2 0
-5455 3 2
-129 4 4
-9082 0 1
-786 20 20
-1506 0 1
-252 8 7
-17512 50 1
-56 1 0
-2474 69 52
-69 0 30
-60 16 0
-19 15 0
-40 1 1
-138 16 0
-74 5 51
-3386 0 1
-968 0 4
-1624 11 11
-1065 0 3
-2935 8 0
-2312 0 181
-2300 1 0
-1641 6 1
-1955 0 1
-68 1 1
-347 1 1
-40 1 1
-1553 6 0
-678 16 16
-92 0 33
-390 4 0
-1147 0 1
-1948 4 4
-4296 18 18
-955 1 1
-47 1 1
-1555 1 0
-2251535 81122 0
-145 1 1
-48 1 1
-718 1 0
-2789 1 1
-27 1 1
-1601 4 0
-1048 39 39
-820 0 2
-20 6 0
-28 2 0
-76 12 18
-28 1 0
-11 9 3
-1772 0 6
-22 1 1
-946 1 1
-24 1 1
-1245 1 0
-3231 1 1
-41 1 1
-1652 20 20
-11270 3 0
-2704 1 1
-41 1 1
-1812 5 6
-1477 0 11
-3790 4 0
-2187 1 1
-48 1 1
-1704 1 1
-73 1 1
-2265 1 1
-10 1 1
-553 1 1
-49 1 1
-67 1 1
-33 1 1
-3932 5 0
-18 1 0
-780 0 1
-1260 0 1
-4203 0 25
-863 14 14
-7114 1 1
-70 1 1
-169 0 1
-43 1 1
-145 1 1
-39 0 3
-8 1 1
-753 0 1
-2255 1 1
-21 1 1
-1605 1 1
-19 2 1
-392 1 1
-29 1 0
-3673 1 0
-145 14 14
-39 0 1
-1246 0 1
-2302 1 0
-1554 9 9
-4537 0 1
-1064 2 0
-2051 1 0
-1130 0 2
-164 1 0
-1972 0 1
-18 3 3
-2597 1 1
-46 3 3
-196 1 1
-17 1 1
-60 4 4
-187 4 4
-46 1 1
-692 1 0
-3920 3 3
-15 1 1
-486 14 14
-1709 8 0
-169 1 0
-597 1 1
-18 0 7
-3423937 0 1
-1295496 1 1
-26 1 1
-760 150000 591802
-22468468 1 1
-27 1 1
-2592 0 2
-33 1 1
-2065 3 0
-1050 11 11
-1046 3 9
-52 11 11
-3200 1 0
-906 1 0
-1644 6 0
-1180 0 1
-475 0 5
-2556 26 22
-351 0 1
-1716 71000 36200
-976586 59000 26528
-7701 0 4
-9296 0 1
-1862 1 0
-3316 7 3
-1131 0 1
-1795 1 0
-569 1 0
-2895 44 44
-458 3 0
-5371 1 0
-6774 0 2
-2504 0 2
-1247 1 1
-45 1 1
-2415 17 17
-8215 1 1
-18 1 1
-272 10 10
-420 1 1
-34 1 1
-7961 4 0
-1973 1 1
-45 1 0
-529 1 0
-603 0 1
-18 1 1
-621 4 12
-67 2 0
-18 34 0
-516 0 1
-1400 38 41
-3786 0 1
-228 3 0
-1026 1 1
-49 1 1
-3336 0 3
-951 1 1
-77 2 1
-441 1 2
-1833 9 9
-301 5 5
-2787 17 17
-1747 1 0
-3040 2 9
-81 10 10
-86 2 0
-7354949 20000 1606
-1681 16 30
-13957 0 8
-1947 0 3
-1255 1 1
-38 0 1
-1788 12 17
-1045 6 0
-1327 0 1
-5775 1 1
-18 1 1
-1933 1 0
-1716 13 13
-255 1 0
-124 0 3
-792 0 5
-1521 1 1
-64 1 1
-9005617 150000 150000
-171176 3000000 3000000
-7074452 53320 65431
-1937 0 1
-2845 2 0
-1387 0 1
-114 1 0
-2382 0 4
-68 6 6
-60 4 0
-20 0 1
-93 0 51
-9781584 351994 0
-1909446 184275 0
-3919546 13 13
-435 23 23
-838 0 1
-807 6 6
-74 1 1
-43 1 1
-652 30000 29839
-13847966 0 1
-14069801 2 0
-8504 0 1
-32266 8 0
-12729 0 2
-35327 12 14
-1503 1 0
-1334 1 0
-759 0 1
-7479 34 34
-2523 7 1
-9912 18 17
-2523 1 0
-1321 0 1
-3684 18 18
-5282 2 0
-5505 20 20
-9694 6 6
-22003 9 0
-578 0 1
-5166 2 0
-92208 2 5
-8 1 0
-5 0 2
-113 4 0
-845 6 7
-2247 3 1
-3770 0 1
-5719 0 2
-2511 0 1
-1557 0 1
-5812 0 1
-3607 0 1
-7405 1 0
-11075 0 1
-2794 1 0
-2340 1 0
-429 0 1
-522 2 0
-2397 5 0
-371 11 0
-1376 1 0
-2416 8 0
-210 1 1
-20 1 1
-5104 1 1
-20 1 1
-525 2 0
-836 0 1
-2094 1 0
-2213 3 0
-327 9 6
-2593 1 1
-57 1 1
-1618 0 1
-1400 4 0
-254 0 2
-93 10 0
-754 0 6
-193 0 1
-2378 0 1
-1753 3 0
-1903 0 4
-29 1 1
-1136 14 14
-2452 4 0
-3622 31 3
-456 14 14
-1076 7 8
-68 1 1
-20 1 1
-145 1 1
-68 1 0
-12 0 1
-10 0 1
-11 1 0
-35 1 0
-5 0 1
-11 1 2
-32 6 7
-35 1 0
-8722 1 0
-888 0 4
-456 3 0
-45 0 1
-151 13 13
-756 0 1
-203 8 7
-140 1 1
-20 1 1
-308 5 0
-1020 0 1
-1258 0 1
-160 0 2
-1411 1 1
-22 1 1
-1180 12 12
-4521 0 2
-1155 27 0
-4954 3 0
-1392 1 1
-47 1 1
-3854 2 1
-130 1 0
-2633 2 0
-3053 12 13
-2308 0 1
-1747 0 45
-732 2 0
-1336 9 11
-3898 0 6
-437 1 0
-981 0 1
-1326 0 1
-382 4 0
-1081 10 0
-81 1 1
-142 0 2
-5452 29 29
-495 1 1
-26 1 1
-485 0 1
-525 0 4
-36 0 6
-3945 347 0
-1034 1 1
-27 1 1
-60 2 0
-2581 3 0
-3880 0 4
-1792 0 1
-20 1 1
-356 1 0
-4244 5 5
-36 1 1
-2232 2 2
-42 1 1
-4462 0 2
-1611 1 0
-1290 0 2
-110 1 0
-1466 0 1
-357 3 0
-850 12 0
-13547766 0 1
-3724943 2 0
-46473408 0 1
-1696 1 1
-28 1 1
-1629 0 4
-666 4 0
-13464 30000 12874
-8520008 2 0
-1107 1 1
-15 1 1
-1892 0 4
-6798 0 2
-1793 1 1
-25 0 3
-422 389 0
-786 2 0
-545 0 2
-54 1 0
-143 1 1
-39 1 1
-89 1 1
-29 1 0
-171 1 1
-46 1 0
-192 1 1
-33 1 1
-2580 0 1
-107 1 1
-29 1 1
-218 1 0
-175 6 5
-1407 1 1
-52 1 1
-8851 1 0
-14427 4 0
-1737 22 0
-5806 1 0
-1115 1 1
-29 0 2
-3395 0 1
-3164 0 2
-522 1 0
-24 1 1
-658 4 0
-5724 9 9
-1209 0 1
-5380 1 0
-97 1 0
-854 4 0
-78 5 11
-2728 6 7
-3754 17 13
-1363 1 0
-1025 1 0
-1811 0 1
-7507 0 4
-1184 3 0
-763 1 0
-797 3 0
-293 2 0
-2488 0 1
-335 0 1
-9959 1 0
-3255 1 0
-1322 0 1
-8118 2 0
-2908 49 49
-369 2 0
-632 1 0
-63 0 5
-3008 0 1
-9582 0 1
-14742673 0 3013
-39686
-
-chain 945825 chr4 191273063 + 69381892 69391896 chr4 191154276 + 69230000 69240000 2911
-2225 1 0
-4917 1 0
-2807 2 0
-51
-
-chain 941684 chr4 191273063 + 69471941 69481941 chr4 191154276 + 69320000 69330000 3076
-3521 0 1
-4784 1 0
-1694
-
-chain 941274 chr4 191273063 + 69614595 69624595 chr4 191154276 + 69580000 69590000 3093
-10000
-
-chain 940419 chr4 191273063 + 69564606 69574607 chr4 191154276 + 69530000 69540000 3129
-3216 5 5
-134 0 1
-5676 2 0
-968
-
-chain 939146 chr4 191273063 + 69534617 69544617 chr4 191154276 + 69500000 69510000 3182
-387 6 6
-9607
-
-chain 939091 chr4 191273063 + 69481941 69491934 chr4 191154276 + 69330000 69340000 3184
-8138 0 4
-1546 0 3
-309
-
-chain 938726 chr4 191273063 + 69461942 69471941 chr4 191154276 + 69310000 69320000 3193
-130 0 1
-9869
-
-chain 936769 chr4 191273063 + 69604595 69614595 chr4 191154276 + 69570000 69580000 3285
-2900 25 25
-7075
-
-chain 936653 chr4 191273063 + 69421914 69431904 chr4 191154276 + 69270000 69280000 3293
-6388 14 14
-338 29 29
-266 0 1
-2309 1 3
-55 1 0
-83 0 8
-506
-
-chain 936357 chr4 191273063 + 69391896 69401898 chr4 191154276 + 69240000 69250000 3304
-2367 1 0
-2329 0 1
-795 23 23
-2819 2 0
-1666
-
-chain 935200 chr4 191273063 + 69441943 69451948 chr4 191154276 + 69290000 69300000 3343
-1203 4 0
-488 57 57
-7133 2 1
-310 1 0
-551 0 1
-256
-
-chain 934799 chr4 191273063 + 69544617 69554606 chr4 191154276 + 69510000 69520000 3366
-1296 39 39
-1112 1 0
-204 1 0
-2340 0 12
-1710 0 1
-3286
-
-chain 933839 chr4 191273063 + 69584607 69594595 chr4 191154276 + 69550000 69560000 3402
-417 3 0
-966 1 0
-2053 0 1
-1784 5 8
-284 0 12
-4475
-
-chain 932655 chr4 191273063 + 69594595 69604545 chr4 191154276 + 69560000 69569950 3440
-8695 26 26
-1229
-
-chain 930772 chr4 191273063 + 69451948 69461942 chr4 191154276 + 69300000 69310000 3507
-1068 0 1
-1437 25 27
-806 0 4
-5337 50 50
-300 1 0
-970
-
-chain 928519 chr4 191273063 + 69411919 69421914 chr4 191154276 + 69260000 69270000 3571
-62 32 32
-801 11 11
-3595 38 38
-941 54 59
-4461
-
-chain 928371 chr4 191273063 + 69511937 69521941 chr4 191154276 + 69360000 69370000 3579
-6433 60 60
-335 10 6
-239 10 10
-2917
-
-chain 925594 chr4 191273063 + 69554606 69564602 chr4 191154276 + 69520000 69529997 3671
-2109 0 1
-4421 81 81
-1599 22 22
-1764
-
-chain 922960 chr4 191273063 + 69501928 69511937 chr4 191154276 + 69350000 69360000 3756
-714 8 8
-423 18 18
-882 33 33
-952 22 22
-607 1 0
-196 64 64
-495 3 0
-2055 2 0
-548 3 0
-2983
-
-chain 915200 chr4 191273063 + 69491934 69501928 chr4 191154276 + 69340000 69350000 3933
-1036 10 10
-2821 5 0
-53 40 40
-209 3 0
-3718 11 0
-421 0 23
-332 11 11
-292 0 2
-432 23 23
-159 20 20
-115 20 20
-263
-
-chain 911203 chr4 191273063 + 69431904 69441943 chr4 191154276 + 69280000 69290000 4026
-364 6 5
-212 4 0
-2445 40 15
-377 30 30
-1126 60 60
-262 8 6
-3222 145 138
-1738
-
-chain 903419 chr4 191273063 + 69401898 69411919 chr4 191154276 + 69250000 69260000 4208
-1051 52 52
-1007 0 1
-319 27 26
-154 98 97
-145 40 40
-512 23 0
-355 5 5
-126 19 19
-128 49 49
-67 0 1
-3337 0 2
-1729 5 5
-773
-
-chain 895926 chr4 191273063 + 69574644 69584607 chr4 191154276 + 69540037 69550000 4357
-3368 220 220
-1524 84 84
-1558 19 19
-889 41 41
-1592 43 43
-625
-
-chain 866339 chr4 191273063 + 69524748 69534617 chr4 191154276 + 69490119 69500000 4930
-190 50 50
-59 111 111
-51 7 7
-78 59 59
-58 121 121
-57 39 39
-70 0 1
-1558 108 108
-737 24 24
-3582 0 1
-84 0 10
-2826
-
-chain 659008 chr4 191273063 + 71711854 71718864 chr4 191154276 + 71492990 71500000 7936
-7010
-
-chain 608986 chr4 191273063 + 69375441 69381892 chr4 191154276 + 69223549 69230000 8701
-135 1 0
-2166 0 1
-4149
-
-chain 248590 chr4 191273063 + 69521941 69527313 chr4 191154276 + 69370000 69375377 111030
-2807 190 190
-50 59 59
-111 136 136
-59 58 58
-121 57 57
-39 1628 1633
-57
-
-chain 214386 chr4 191273063 + 71534589 71536854 chr4 191154276 + 71500000 71502265 534073
-2265
-
-chain 96900 chr4 191273063 + 3963456 3964475 chr4 191154276 + 3912520 3913539 1319679
-1019
-
-chain 52181 chr4 191273063 + 69624595 69625143 chr4 191154276 + 69590000 69590548 2441389
-548
-
-chain 20814 chr4 191273063 + 1495708 1495926 chr4 191154276 + 1526075 1526293 9826122
-218
-
-chain 8858 chr4 191273063 + 1496845 1496937 chr4 191154276 + 1526189 1526281 25171661
-92
-
-chain 8858 chr4 191273063 + 1496752 1496844 chr4 191154276 + 1526189 1526281 25171662
-92
-
-chain 8858 chr4 191273063 + 1496566 1496658 chr4 191154276 + 1526189 1526281 25171663
-92
-
-chain 7802 chr4 191273063 + 1492030 1492276 chr4 191154276 + 1522531 1522736 2805154
-25 83 42
-23 15 15
-4 55 55
-41
-
-chain 7606 chr4 191273063 + 69578098 69578232 chr12 133851895 + 88986938 88987072 9526361
-134
-
-chain 7510 chr4 191273063 + 1496208 1496286 chr4 191154276 + 1526203 1526281 25171660
-78
-
-chain 7439 chr4 191273063 + 1527942 1528019 chr4 191154276 + 1557568 1557645 18158883
-77
-
-chain 7376 chr4 191273063 + 1496452 1496529 chr4 191154276 + 1526075 1526152 27495831
-77
-
-chain 6986 chr4 191273063 + 59479326 59479400 chr7 159138663 + 119297971 119298045 28268313
-74
-
-chain 6131 chr4 191273063 + 1496080 1496144 chr4 191154276 + 1526075 1526139 27495827
-64
-
-chain 5599 chr4 191273063 + 1495650 1495708 chr4 191154276 + 1526203 1526261 27226300
-58
-
-chain 5460 chr4 191273063 + 1496658 1496715 chr4 191154276 + 1526095 1526152 27495830
-57
-
-chain 4356 chr4 191273063 + 1498960 1499009 chr4 191154276 + 1528103 1528152 18458745
-49
-
-chain 4121 chr4 191273063 + 69578012 69578069 chr3 198022430 - 95182224 95182281 17792812
-57
-
-chain 3000 chr4 191273063 + 1495929 1496022 chr4 191154276 + 1526110 1526203 11256589
-93
-
-chain 2961 chr4 191273063 + 69443663 69443695 chr4 191154276 - 68628109 68628141 14494983
-32
-
-chain 2485 chr4 191273063 + 1503833 1503862 chr4 191154276 + 1532970 1532999 23156792
-29
-
-chain 2401 chr4 191273063 + 1492301 1492331 chr4 191154276 + 1522679 1522709 5335388
-30
-
-chain 2012 chr4 191273063 + 1496731 1496752 chr4 191154276 + 1526075 1526096 27495829
-21
-
-chain 1744 chr4 191273063 + 1597414 1597448 chr4 191154276 + 1627062 1627096 3575887
-34
-
-chain 1461 chr4 191273063 + 69579763 69579840 chr5 180915260 + 121968423 121968500 3935628
-77
-
-chain 1332 chr4 191273063 + 69545913 69545943 chr11 135006516 - 130984886 130984916 21069914
-30
-
-chain 909 chr4 191273063 + 69582306 69582346 chr3 198022430 - 10790236 10790276 7796945
-40
-
-chain 18169122 chr4_random 842648 + 440032 631501 chr4_gl000194_random 191469 + 0 191469 150
-191469
-
-chain 18001815 chr4_random 842648 + 0 189789 chr4_gl000193_random 189789 + 0 189789 151
-189789
-
-chain 15268007 chr4_random 842648 + 681501 842648 chrUn_gl000218 161147 + 0 161147 194
-161147
-
-chain 9245037 chr4_random 842648 + 239789 336038 chr4 191154276 + 8829368 8925617 353
-96249
-
-chain 137712 chr4_random 842648 + 388580 390032 chr4 191154276 + 9620000 9621452 935614
-1452
-
-chain 10386 chr4_random 842648 + 388312 388420 chr11 135006516 - 91778086 91778194 21974850
-108
-
-chain 3377 chr4_random 842648 + 388277 388312 chr11 135006516 - 84847900 84847935 23649965
-35
-
-chain 2456 chr4_random 842648 + 388184 388235 chrX 155270560 - 93144339 93144390 24160146
-51
-
-chain 16791974256 chr5 180857866 + 63000 180837866 chr5 180915260 + 10000 180905260 5
-17520657 24032 50000
-1688 3435 1
-37 1399 0
-27 2 1
-8 1 1
-3983 3434 0
-103 1 1
-32 1 1
-67 1 1
-35 1 1
-752 1669 0
-43 1 1
-1207 0 1
-46 0 1
-5 0 1
-19 1 1
-70 3434 0
-962 16 16
-1905 44 44
-85 41 41
-332 49 49
-1675 23 23
-1185 11 11
-124 35 35
-713 105 105
-408 4 4
-113 16 16
-1835 1 2
-26 7 8
-18 2730 25
-3103 1 0
-7858 718 10488
-307 1 636
-7461 0 1
-23772 51 0
-4031 0 1
-20571 0 1
-9135 0 2
-6885 2 3
-110 3 0
-816 2 3
-2295 0 34
-3936 28 28
-3536 0 2
-2917 0 1
-652 1 1
-37 1 1
-657 1 1
-22 1 1
-419 3 4
-3580 1 1
-29 1 1
-274 11 35
-835 3036 0
-1907 1 0
-10504 30 28
-784 0 6
-127 10 0
-668 1 1
-28 1 1
-2467 4 0
-179 0 2
-1650 1 1
-39 1 1
-2433 1 0
-720 1 1
-40 1 1
-772 1 1
-32 1 1
-353 1 1
-17 1 1
-1776 0 1
-6082 3 0
-2669 12 10
-2857 1 1
-35 1 1
-722 60 60
-200 1 1
-240 1 1
-4048 1 1
-49 1 1
-702 1 1
-33 1 1
-2927 1 2
-1487 17 0
-276 16 16
-1039 1 1
-35 1 1
-2068 1 1
-40 1 1
-828 1 1
-36 2 0
-317 8 0
-893 1 1
-33 1 0
-8143 0 4
-28632199 3000000 3000000
-12470071 0 1
-29760415 40000 50000
-5878002 23000 20845
-4521 1 0
-676 6 6
-5928 0 1
-372 1 1
-47 1 1
-6801 3 2
-639 0 1
-871 3 4
-11530 0 4
-22966 0 1
-15447 0 1
-53856 0 2
-15988 0 2
-906887 10 11
-40152817 5000 52715
-3521239 0 1
-1604 10 0
-12778810 4100 51715
-15152692 27 0
-1852096 1 0
-8710030
-
-chain 924655 chr5 180857866 + 17585088 17611949 chr5 180915260 - 163333152 163394435 1227
-14 409 52001
-494 3435 1
-24 1 1
-1487 10 10
-682 13 13
-132 3449 15
-306 1 1
-74 1 1
-967 3434 0
-1285 3434 0
-68 4569 1135
-2087 50 50
-435
-
-chain 315813 chr5 180857866 + 17584685 17618655 chr5 180915260 + 17581691 17599590 1580
-403 14 14
-237 1475 75
-628 25 25
-51 89 89
-304 24 24
-70 33 33
-37 698 698
-667 3506 72
-1354 96 96
-75 4 4
-752 1710 41
-450 382 382
-51 14129 7264
-237 12 12
-614 37 37
-134 16 16
-422 31 31
-796 4345 1642
-62
-
-chain 312488 chr5 180857866 + 17597387 17639380 chr5 180915260 + 17580657 17599710 1454
-373 70 70
-1245 2263 863
-1184 3434 0
-1733 3775 2106
-50 9111 2246
-1078 993 993
-1363 8015 1147
-44 85 85
-41 332 332
-49 6299 3596
-341 45 44
-70
-
-chain 265075 chr5 180857866 + 17745718 17748537 chr5 180915260 + 17713035 17715853 333767
-1906 1 0
-912
-
-chain 207388 chr5 180857866 + 17584033 17596937 chr5 180915260 + 17583073 17597745 2201
-51 557 557
-14 17 17
-13 654 654
-172 494 494
-219 23 23
-567 4975 6743
-176 6 6
-865 14 14
-96 1354 1354
-26 2261 2261
-350
-
-chain 193008 chr5 180857866 + 17583668 17629078 chr5 180915260 + 17580674 17599710 1465
-356 84 84
-533 3434 0
-698 5562 728
-51 4689 1255
-946 4787 1353
-543 8 8
-167 12743 7643
-324 5466 2032
-306 3553 850
-1045 45 44
-70
-
-chain 130263 chr5 180857866 + 17639380 17641654 chr5 180915260 + 17592112 17594386 19200
-936 23 23
-116 16 16
-1183
-
-chain 123401 chr5 180857866 + 17602522 17620625 chr5 180915260 + 17589594 17593961 2306
-159 16 16
-1763 19 19
-54 14448 712
-1644
-
-chain 53192 chr5 180857866 + 17626966 17629142 chr5 180915260 + 17590000 17592176 2614
-952 1045 1045
-45 70 70
-64
-
-chain 42492 chr5 180857866 + 17625757 17626966 chr5 180915260 - 163394507 163395716 9006
-1209
-
-chain 23743 chr5 180857866 + 17605548 17605956 chr5 180915260 + 17596054 17596462 38000
-290 9 9
-109
-
-chain 20601 chr5 180857866 + 17748538 17748754 chr5 180915260 + 17712817 17713033 9842237
-216
-
-chain 11635 chr5 180857866 + 17618762 17618981 chr5 180915260 + 17595532 17595751 149283
-219
-
-chain 9108 chr5 180857866 + 17618655 17618762 chr5 180915260 + 17583355 17583462 1340460
-107
-
-chain 7916 chr5 180857866 + 17587442 17604673 chr5 180915260 - 163387098 163397461 2244
-25 61 61
-79 398 398
-33 16608 9740
-27
-
-chain 7204 chr5 180857866 + 17604533 17604646 chr5 180915260 + 17599204 17599317 3499
-113
-
-chain 4292 chr5 180857866 + 17639265 17639310 chr5 180915260 + 17595431 17595476 67944
-45
-
-chain 2558 chr5 180857866 + 17604673 17604706 chr5 180915260 + 17591745 17591778 3790746
-33
-
-chain 2511 chr5 180857866 + 170275712 170275739 chr5 180915260 + 170343161 170343188 11152528
-27
-
-chain 2447 chr5 180857866 + 17635643 17636496 chr5 180915260 - 163394091 163394944 8841
-35 713 713
-105
-
-chain 2252 chr5 180857866 + 17601306 17601338 chr5 180915260 + 17595246 17595278 11344
-32
-
-chain 2027 chr5 180857866 + 17785693 17785748 chr18 78077248 - 45596607 45596662 524022
-55
-
-chain 1518 chr5 180857866 + 17629142 17629191 chr5 180915260 - 163394458 163394507 205933
-49
-
-chain 1109 chr5 180857866 + 17613421 17613452 chr5 180915260 - 163395907 163395938 8647
-31
-
-chain 143977943 chr5_h2_hap1 1794870 + 0 1794870 chr5 180915260 + 68505249 71134051 52
-5440 1 0
-1785 0 1
-12373 0 2
-7216 0 1
-714 2 0
-4360 0 1
-11179 1 0
-2027 1 0
-6969 0 2
-3779 1 0
-634 4 3
-1384 0 9
-378 0 2
-1153 3 0
-1246 0 6
-1427 0 2
-608 1 1
-23 1 1
-1981 44 44
-3998 1 1
-33 5 0
-148 1 1
-18 1 0
-331 2 0
-162 1 0
-333 0 1
-644 1 0
-2053 1 0
-1896 0 1
-2096 1 1
-32 1 1
-265 0 14
-1061 0 1
-7303 6 6
-1313 1 0
-3225 0 2
-65 1 1
-220 1 1
-1422 0 1
-248 1 1
-21 2 0
-641 0 1
-163 3 0
-522 1 0
-1685 0 1
-299 1 1
-16 1 0
-3259 1 0
-6492 9 9
-700 0 2
-379 1 0
-186 0 16
-21 0 27
-242 21 19
-156 0 3
-2040 1 0
-7852 0 2
-1267 0 4
-8016 0 1
-2057 85 0
-449 0 1
-2797 0 1
-3858 0 1
-2129 1 0
-234 1 1
-28 1 1
-2923 0 3
-4346 1 0
-2467 1 0
-11093 1 0
-3932 0 3
-2223 1 1
-22 0 1
-25 0 6
-1909 2 0
-1136 1 0
-658 2 0
-32 8 0
-9 2 0
-14 15 11
-22 14 0
-20 51 1
-34 2 0
-43 0 2
-38 127 19
-15 14 0
-41 0 5
-9200 1 0
-2655 1 0
-38 1 1
-237 1 1
-28 1 1
-1065 1 0
-2979 3 0
-13 1 1
-653 4 0
-1950 1 0
-2320 2 0
-817 3 0
-524 8 0
-417 1 0
-873 1 0
-352 1 0
-152 2 0
-651 1 0
-285 1 0
-1830 0 1
-1271 0 1
-957 0 1
-1506 2 0
-2454 4 0
-6 4 0
-300 1 1
-68 1 1
-1648 0 1
-10725 10 10
-1308 2 1
-48 1 1
-1242 15 0
-1869 1 0
-26 0 452
-1178 0 3
-43 0 4
-3567 0 1
-2289 0 1
-695 0 6
-721 13 14
-192 0 2
-1190 1 1
-36 1 1
-451 0 1
-4137 1 0
-809 23 0
-1624 0 4
-453 4 0
-983 0 1
-188 0 5
-489 0 1
-299 11 11
-1923 1 0
-168 0 1
-891 1 1
-54 0 1
-908 0 28
-1224 2 0
-175 0 1
-459 2 0
-119 133 153
-50 13 13
-4001 0 1
-4764 3 0
-90 1 1
-117 92 0
-325 0 27
-19 1 1
-92 1 67
-21 1 28
-15 1 28
-9013 0 1
-1376 0 1
-674 10 0
-87 0 1
-1317 43 35
-260 1 0
-1518 11 12
-232 0 1
-1093 0 1
-737 0 2
-176 10 10
-664 1 1
-33 1 1
-2816 3 0
-4679 0 2
-3212 0 2
-2383 14 16
-3049 0 1
-146 1 0
-721 1 1
-35 1 1
-2260 2 0
-1228 0 1
-682 1 0
-8927 1 0
-795 2 0
-5278 0 2
-5578 13 0
-3665 20 0
-1852 9 0
-4564 1 1
-20 4 0
-111 1 1
-1065 37 37
-2979 1 0
-820 0 1
-9147 0 1
-411 0 1
-745 2 0
-144 3 3
-27 2 0
-734 1 1
-38 1 1
-105 0 4
-554 1 0
-35 1 1
-226 2 0
-254 1 1
-39 1 1
-3302 0 2
-16 1 1
-1276 1 1
-57 1 1
-122 5 0
-178 0 1
-29 1 1
-89 1 1
-32 1 1
-1743 1 0
-294 1 1
-27 1 1
-1925 1 1
-48 1 1
-116 1 1
-20 1 1
-163 4 4
-821 4 3
-46 1 1
-247 1 1
-27 2 2
-613 1 1
-44 1 1
-181 9 7
-1220 1 1
-53 0 3
-596 1 0
-1052 12 12
-130 1 0
-1524 0 1
-1878 1 4
-76 0 1
-6 0 5
-895 0 1
-290 9 5
-783 1 1
-45 1 1
-1910 1 1
-48 1 1
-409 1 1
-30 1 1
-158 2 0
-69 6 0
-428 1 1
-136 1 1
-418 44 44
-767 35 27
-711 1 1
-28 1 1
-1137 1 0
-585 1 0
-433 13 0
-3034 1 0
-961 0 3
-950 1 1
-15 1 1
-948 0 5
-153 21 20
-181 38 38
-765 8 10
-207 13 15
-3092 4 0
-202 5 5
-1406 0 5
-205 1 1
-44 1 1
-2719 1 1
-36 1 1
-1050 0 9
-108 0 2
-1177 4 0
-115 1 1
-2051 15 0
-520 8 8
-1072 0 1
-595 2 0
-4576 73 73
-6176 1 0
-1299 1 1
-29 1 0
-496 0 4
-379 2024 0
-7 3663 0
-82 4 0
-79 6 1
-556 11 0
-598 9 9
-138 77 73
-1651 3 9
-3302 0 8
-429 1 0
-163 0 3
-60 3 0
-132 1 1
-23 1 0
-1660 1 16
-2124 0 1
-1601 9 0
-35 525 6
-38 1 1
-235 1 30
-497 1 1
-37 1 0
-79 0 1
-1239 1 1
-31 1 1
-135 1 0
-5 2 0
-669 0 1
-1158 1595 0
-21 3 0
-5 126998 500121
-730 31 27
-278 0 2
-352 0 12
-363 13 21
-366 1 0
-378 3 0
-61 1 0
-105 17 68
-1480 32 32
-640 1 1
-52 1 1
-482 1 0
-638 1 1
-20 1 0
-21 1 1
-326 1 1
-37 1 1
-995 0 7
-1685 0 1
-1607 9 8
-633 1 1
-37 1 1
-697 6 6
-1363 8 8
-234 1 1
-44 1 1
-3022 5 6
-96 12 11
-674 4 0
-768 0 1
-169 3 0
-2083 0 1
-1098 20 20
-5586 1 0
-174 28 13
-366 2 0
-202 1 1
-69 1 1
-682 5 5
-3457 1 0
-232 1 0
-305 10 0
-1770 40 40
-349 38 38
-401 0 1
-441 7 3
-547 11 10
-210 4 0
-779 4 0
-193 4 0
-576 0 4
-514 48 48
-789 23 16
-2496 25 25
-874 25 11
-2776 19 19
-2824 4 0
-440 0 2
-876 14 14
-1198 39 39
-521 6 0
-126 40 40
-315 29 29
-616 94 99
-285 35 35
-175 12 12
-320 17 1
-3339 0 1
-260 49 49
-109 11 11
-586 0 1
-133 19 13
-8202 0 1
-307 0 1
-1366 1 0
-1073 9 12
-1385 0 1
-321 106 108
-1101 28 28
-483 42 42
-1752 58 58
-166 37 36
-748 16 16
-52 1 0
-1679 0 2
-455 9 17
-484 1 10
-74 33 33
-155 0 1
-62 0 8
-424 23 23
-491 8 9
-450 0 2
-63 1 0
-410 5 0
-1131 165 170
-254 39 39
-1162 0 272664
-1919 1 1
-82 1 1
-740 4 4
-261 1 1
-83 1 1
-52 1 1
-49 1 1
-231 6 6
-244 1 1
-21 1 1
-52 44 44
-114 20 20
-87 32 32
-149 0 6
-202 50 50
-115 44 44
-114 65 65
-50 111 111
-61 52 52
-101 42 45
-250 15 15
-208 1 0
-2259 3 0
-239 64 66
-168 10 10
-2393 1 1
-38 1 1
-674 1 1
-29 1 1
-469 22 25
-827 1 0
-1679 0 1
-463 9 13
-232 1 0
-248 1 5
-325 0 7
-1389 0 4
-63 1 0
-410 6 0
-685 3 0
-35 1 1
-407 166 168
-253 39 39
-71 0 4
-1288 35 35
-1697 32 32
-243 22 22
-395 51 51
-259 49 49
-108 6 6
-54 168 168
-464 45 45
-81 20 20
-84 21 21
-240 25 25
-584 0 810
-126 4 4
-42 6 6
-101 0 3
-41 1 1
-473 1 0
-373 1 1
-41 1 1
-614 1 1
-41 1 18042
-857 50 50
-279 2 0
-246 67 69
-160 10 10
-199 0 1
-154 1 0
-276 28 28
-124 29 28
-105 7 7
-355 1 1
-45 1 1
-299 1 1
-25 1 1
-283 30 35
-594 2 0
-1401 1 1
-46 1 1
-123 4 0
-830 1 0
-100 1 1
-61 1 1
-737 2 7
-285 1 1
-58 1 1
-143 18 0
-19 1 1
-575 1 1
-91 1 1
-318 2 0
-4090 4 0
-702 0 1
-2007 0 2
-901 0 1
-79 9 9
-31 3 3
-1203 1 0
-16 1 1
-574 1 1
-28 1 1
-346 6 0
-25 1 3
-22 2 0
-34 4 0
-7 1 0
-20 18 22
-511 0 5
-5088 0 1
-1065 0 4
-51 2 0
-2714 25 25
-81 8 8
-56 788 18
-22 1 1
-4702 0 1
-536 6 6
-3900 1 0
-1063 0 8
-4095 1 0
-1841 1 3
-1015 0 1
-2808 1 1
-17 1 1
-340 1 1
-39 1 1
-1548 1 1
-73 1 1
-291 1 0
-236 72 43
-104 0 1
-1843 4 0
-80 15 15
-1140 29 1
-45 1 1
-1245 3 0
-194 1 0
-816 11 1
-25 1 11
-47 1 1
-508 0 1
-255 1 1
-24 1 0
-319 13 13
-1846 397 398
-803 0 37
-509 0 12
-130 0 4
-609 0 3
-6495 1251 1253
-1091 11 11
-384 2 0
-1657 31 30
-109 31 31
-2815 63 63
-85 0 13
-589 48 48
-194 25 25
-1068 16 16
-209 2 0
-215 47 47
-1775 127 77
-533 188 0
-1164 1 0
-1863 1 1
-29 1 1
-1993 1 1
-19 1 1
-782 2 0
-3224 2 0
-22 1 11
-473 332 0
-604 1 1
-28 1 1
-223 1 1
-28 1 1
-2870 0 1
-38 1 1
-313 1 0
-768 0 1
-1039 9 9
-886 0 4
-243 0 1
-172 17 17
-2721 1 1
-71 0 1
-607 105 117
-54 46 44
-2057 1 1
-32 1 1
-452 1 1
-49 1 1
-169 322 6
-26 1 0
-567 3 0
-2324 1 0
-825 4 0
-1251 4 4
-2651 0 4
-703 14 19
-10731 13 0
-741 2 0
-1659 0 12
-7683 0 6
-838 1 0
-2905 12 326
-1714 1 0
-1172 90 100
-619 2 0
-263 0 59
-730 1 0
-56 4 0
-1746 17 17
-377 1 1
-27 4 0
-836 1 1
-67 1 1
-1022 0 1
-1096 1 1
-40 0 1
-8 1 1
-1864 1 0
-56 5 1
-6 0 10
-114 1 1
-34 1 1
-631 19 19
-139 13 13
-1330 1 11
-22 2 0
-2846 1 0
-358 0 2
-798 11 11
-3004 1 1
-30 1 1
-2032 1 16
-752 16 0
-40 0 6
-3211 0 1
-965 0 14
-2978 1 1
-29 1 1
-138 0 2
-1646 2 0
-375 1 1
-31 1 1
-6235 0 2
-2598 0 3
-592 0 4
-135 0 12
-3892 1 0
-840 0 12
-5528 9 5
-5400 0 1
-181 0 1
-836 0 3
-3087 1 1
-46 1 1
-2796 11 9
-6282 1 1
-25 1 1
-2009 1 1
-56 0 2
-209 15 15
-2433 1 1
-50 1 1
-366 1 0
-3233 0 1
-5144 0 2
-811 53 22
-23 1 0
-6 1 3
-43 0 2
-13 2 0
-5 0 14
-634 8 8
-1663 10 12
-433 1 1
-43 1 1
-397 2 0
-638 1 1
-42 1 1
-285 1 1
-28 1 1
-516 1288 2
-424 4 0
-660 1 1
-49 1 1
-816 0 12
-1015 1 1
-47 1 1
-988 0 3
-1000 14 32
-330 1 1
-38 1 1
-124 7 2
-43 1 1
-693 1 1
-61 1 1
-94 0 1
-963 1 1
-46 1 1
-1393 0 2
-139 2 0
-113 1 1
-20 1 1
-323 6 0
-34 0 1
-978 1 1
-38 1 1
-105 1 1
-18 1 2
-43 1 1
-381 0 1
-811 15 8
-2537 0 2436
-2642 1 1
-42 4 0
-92 10 10
-1363 1 1
-37 1 1
-252 5 0
-165 1 1
-329 1 1
-77 1 1
-705 0 6
-258 6 6
-155 0 1
-57 2 0
-1380 5 0
-348 2 0
-489 9 5
-448 1 0
-1681 0 1
-835 29 25
-1359 36 36
-223 0 1
-399 15 15
-466 4 4
-75 10559 200741
-1150 1 0
-682 12 15
-802 53 53
-535 1 0
-65 62 63
-497 30 1
-1458 1 0
-683 0 1
-1449 1 0
-977 15 0
-1636 0 4
-216 3 0
-587 0 10
-4302 1 1
-28 1 1
-733 0 4
-138 9 9
-595 0 11
-249 1 1
-65 1 1
-242 1 6
-74 0 4
-87 6 5694
-363 4 0
-513 0 1
-29 1 1
-1297 0 1
-415 1 3
-1947 0 2
-978 0 1
-3121 1 1
-17 1 1
-872 1 1
-31 1 1
-602 8 8
-238 1 1
-36 1 1
-930 1 1
-36 1 1
-1073 22 0
-494 0 1
-66 1 5
-60 1 1
-15 1 1
-452 1 0
-1587 0 7
-1465 1 1
-27 1 1
-76 1 1
-44 1 1
-143 16 14
-323 23 23
-685 1 1
-15 1 1
-136 6 0
-400 0 2
-109 3 0
-50 1 1
-18 1 1
-985 1 1
-38 1 1
-1034 12 12
-247 1 1
-91 2 1
-1383 1 1
-44 1 1
-164 15 16
-292 1 1
-47 1 1
-73 1 1
-43 1 1
-203 1 0
-420 1 1
-37 1 1
-449 0 2
-25 0 4
-415 4 6
-155 1 1
-26 1 1
-199 1 1
-41 0 32
-20 1 1
-68 1 1
-28 1 1
-2097 13 15
-207 8 10
-984 21 20
-134 5 0
-967 10 10
-956 3 0
-4424 5 6
-595 0 1
-1140 1 1
-28 1 1
-733 7 16
-1218 149 149
-429 0 4
-59 0 2
-2568 1 1
-45 1 1
-784 5 8
-289 1 0
-877 5 0
-34 1 0
-68 4 1
-735 1 1
-35 1 1
-1094 4 4
-1519 5 6
-138 12 12
-1044 0 1
-91 80 80
-369 1 1
-53 2 0
-63 1 1
-1220 7 9
-181 1 1
-44 1 1
-134 0 3
-476 2 2
-27 1 1
-205 1 1
-88 2 2
-822 4 4
-163 22 22
-116 1 1
-48 1 1
-3849 1 1
-21 1 1
-120 1 1
-32 1 1
-89 1 1
-29 1 0
-178 3 6
-1452 19 17
-5455 1 0
-10333 1 0
-784 0 1
-55 8 0
-468 0 1
-539 12 0
-98 1 1
-24 1 1
-77 1 1
-81 1 1
-4604 17 19
-7803 7 7
-807 0 1
-2260 7 5
-980 0 1
-2105 0 1
-4083 0 1
-836 0 2
-5612 1 0
-519 0 1
-1334 0 1
-2401 0 9
-1823 1 0
-159 0 2
-484 2 0
-14815 1 1
-36 1 1
-2512 4 0
-58 3 0
-3277 1 0
-559 0 1
-4024 1 0
-4383 22 13
-4131 1 1
-35 1 1
-290 1 1
-29 3 0
-533 1 0
-305 0 1
-2608 0 1
-443 3 1
-2322 0 20
-514 1 1
-46 1 1
-791 19 30
-3206 3 0
-6272 0 2
-1789 8 0
-291 39 39
-521 6 0
-126 40 40
-315 29 29
-616 94 99
-206 114 109
-506 0 14
-2370 0 2
-4709 1 1
-36 1 1
-5588 0 11
-299 1 0
-1366 1 0
-1644 1 1
-28 1 0
-4859 16 21
-1992 0 10
-505 0 1
-448 8 12
-721 40973 60417
-3484 1 1
-40 1 1
-2152 0 2
-5298 39 40
-141 25 25
-427 0 11
-1543 1 0
-3707 0 1
-1056 292 8656
-1768 2 0
-717 1 0
-14041 0 1
-4167 0 2
-7403 5 0
-7673 0 1
-3630 67 67
-74 129 129
-226 1 0
-1720 138 136
-1185 1 0
-878 46874 0
-862 1 1
-31 1 1
-9409 1 1
-37 1 1
-2231 0 2
-1682 0 1
-13767 0 1
-9473 0 1
-7168 2 0
-12384 1 0
-1188 0 4
-2044 1 0
-3076 1 0
-796 0 1
-5477 0 2
-5780 1 0
-6338 1 0
-2680 0 4
-2033 0 1
-9452 0 12
-402983
-
-chain 13752336 chr5_h2_hap1 1794870 + 324513 1282806 chr5 180915260 - 110525721 111977366 61
-37 39926 39909
-44 767 767
-34 9178 9179
-38 20004 20004
-27 1 1
-44 8383 8384
-1071 3 3
-511 0 1
-439 7 7
-3663 1483 1482
-77 11199 11214
-525 4132 4132
-704 1 0
-729 3 0
-158 29 29
-653 0 3
-154 0 2
-7041 8 0
-2068 0 7
-166 1 0
-812 6 7
-25 1 1
-1423 0 8
-438 0 1
-4783 0 1
-31 1 1
-1269 1 0
-926 3 0
-2542 2 0
-112 1 1
-2183 1 1
-59 1 1
-1605 2 2
-4515 0 1
-4368 1 0
-382 0 34
-60 1 1
-86 0 1
-552 6 6
-892 1 1
-33 1 1
-6705 0 1
-934 0 2
-8985 2 1
-445 6 0
-6283 0 1
-456 0 1
-1101 0 5
-696 0 1
-2973 6 0
-158 0 3
-449 0 3
-657 12 12
-151 0 1
-406 1 1
-55 1 1
-163 1 1
-72 1 1
-1955 1 0
-713 0 1
-3050 1 1
-35 1 1
-3127 1 0
-233 1 0
-1343 17 7
-1250 3 0
-322 1 0
-2081 0 1
-2413 5 0
-818 0 1
-18 1 1
-268 0 1
-271 1 1
-35 1 0
-586 2 0
-1192 0 1
-494 2 0
-4657 1 1
-30 5 0
-2172 0 334
-1981 5 0
-33 321 0
-2633 2 0
-142 1 0
-1597 7 0
-248 1 0
-317 1 1
-21 1 1
-441 0 1
-600 6 4
-35 1 1
-1593 2 6
-9303 1 0
-2781 0 2
-6052 0 4
-771 1 0
-1500 14 0
-1544 730 730
-31 3419 3419
-30 30394 30395
-40 349 349
-38 3691 3690
-48 3308 3306
-25 874 880
-25 8151 8151
-39 653 653
-40 315 315
-29 616 616
-94 285 285
-35 4123 4120
-49 13570 13573
-58 30899 10440
-165 1652 1655
-35 1697 1697
-32 660 660
-51 259 259
-49 168 168
-168 464 464
-45 446 446
-25 3886 3879
-67 800 800
-28 124 124
-29 1123 1123
-30 24987 23723
-2 1 1
-21 146 146
-2 1 1
-785 22543 22552
-67 3192 3170
-28 5357 5348
-397 8546 8565
-1251 3145 3145
-31 110 110
-29 2816 2816
-63 674 688
-48 195 195
-23 1511 1509
-47 1810 1786
-37 14 0
-41 533 533
-182 1 16
-5 20555 20281
-49 1 21
-55 54 52
-46 2763 2762
-37 5 2
-280 124045 123118
-495 0 1
-703 3 0
-87 27183 48462
-36 1182 1182
-389 16 16
-257 1 0
-118 3 3
-547 1 1
-25 1 1
-126 0 2
-3598 810 0
-148 0 6
-483 1 1
-34 1 1
-266 6 6
-350 2 2
-30 1 1
-297 4 4
-666 1 1
-89 1 1
-52 15 15
-2220 2647 2651
-53 53651 53634
-149 9850 9843
-39 1 1
-39 116984 481498
-39 653 653
-40 315 315
-29 616 616
-94 206 206
-114 65101 68610
-358 27 27
-588 11156 11155
-25 56460 137674
-105 1 0
-2251 13 13
-319 25 26
-826 25 25
-370 7 7
-439 0 1
-192 7 1
-250 0 13
-1302 1 8
-866 91 94
-91 14 14
-501 1 0
-1238 1 0
-113 475 60006
-212 8 10
-907 0 4
-350 1 0
-486 9 17
-448 0 2
-515 0 10
-788 13213 230
-199 16 16
-645 0 2
-112 37 25
-634
-
-chain 283844 chr5_h2_hap1 1794870 + 1261701 1280951 chr5 180915260 + 69698102 69815360 1487
-91 6326 96869
-318 0 10
-505 0 1
-204 64 64
-440 1 0
-235 0 1
-1269 0 1
-945 1 0
-670 242 551
-75 3 0
-1233 50 50
-199 4900 12045
-409 59 59
-310 37 40
-664
-
-chain 206667 chr5_h2_hap1 1794870 + 1287039 1295912 chr17 81195210 + 76583705 76597262 568754
-558 4 0
-365 2 2
-40 0 1
-253 1 1
-31 1 1
-522 6316 11003
-780
-
-chain 184822 chr5_h2_hap1 1794870 + 1284679 1286632 chr17 81195210 - 4506444 4508397 671275
-1953
-
-chain 128717 chr5_h2_hap1 1794870 + 1283006 1284382 chr5 180915260 + 70517839 70519212 1000883
-791 20 17
-565
-
-chain 128621 chr5_h2_hap1 1794870 + 1291852 1293214 chr17 81195210 + 76573863 76575225 1001637
-1362
-
-chain 122147 chr5_h2_hap1 1794870 + 627399 939358 chr5 180915260 - 110828619 111993762 93
-42 1752 1753
-58 6978 6974
-165 255 254
-37 4915 4915
-44 4384 4378
-64 19819 875253
-39 1 1
-9 264030 261784
-58 0 6
-56 6 6
-105 3 3
-98 1 1
-483 7968 7968
-62 497 497
-30
-
-chain 118081 chr5_h2_hap1 1794870 + 1290357 1291631 chr4 191154276 - 20442500 20443774 1089300
-230 18 18
-1026
-
-chain 112391 chr5_h2_hap1 1794870 + 1288972 1290160 chr17 81195210 - 4580707 4581894 1143267
-1134 1 0
-53
-
-chain 92982 chr5_h2_hap1 1794870 + 1293593 1294614 chr4 191154276 + 170627590 170628611 1373141
-72 1 1
-129 1 1
-818
-
-chain 75482 chr5_h2_hap1 1794870 + 1274745 1276419 chr5 180915260 - 111410923 111412615 820
-271 0 10
-350 0 6
-499 9 9
-444 0 2
-101
-
-chain 68300 chr5_h2_hap1 1794870 + 1276804 1279228 chr5 180915260 - 110416917 110419341 216
-2424
-
-chain 29652 chr5_h2_hap1 1794870 + 524804 525112 chr3 198022430 + 8519605 8519913 4781887
-308
-
-chain 29428 chr5_h2_hap1 1794870 + 756919 757240 chr2 243199373 + 16251117 16251431 4913030
-177 7 0
-137
-
-chain 27649 chr5_h2_hap1 1794870 + 641866 1186473 chr5 180915260 + 68929706 69564604 89
-32 351 351
-50 115 115
-44 114 114
-65 50 50
-111 61 61
-52 101 101
-42 14056 14883
-33 529303 618767
-27
-
-chain 20581 chr5_h2_hap1 1794870 + 1249367 1254462 chr5 180915260 - 111122604 111127700 1762
-2153 24 24
-85 8 8
-1086 0 1
-1739
-
-chain 5516 chr5_h2_hap1 1794870 + 253548 253608 chr5 180915260 + 68759177 68759237 7759123
-60
-
-chain 5218 chr5_h2_hap1 1794870 + 1244675 1244945 chr5 180915260 - 159621198 159621468 493
-30 1 1
-36 122 122
-81
-
-chain 4702 chr5_h2_hap1 1794870 + 1279881 1280287 chr5 180915260 + 70518261 70518663 9283
-59 311 307
-36
-
-chain 4436 chr5_h2_hap1 1794870 + 1274323 1274373 chr5 180915260 + 70526833 70526883 9273
-50
-
-chain 4277 chr5_h2_hap1 1794870 + 625682 625728 chr5 180915260 - 111701952 111701998 814
-46
-
-chain 3978 chr5_h2_hap1 1794870 + 1276419 1276466 chr5 180915260 + 70082181 70082228 137301
-47
-
-chain 3805 chr5_h2_hap1 1794870 + 1244816 1244863 chr5 180915260 + 69926901 69926948 475
-47
-
-chain 2924 chr5_h2_hap1 1794870 + 253608 253640 chr5 180915260 + 68759034 68759066 4803455
-32
-
-chain 943 chr5_h2_hap1 1794870 + 1282135 1282172 chr5 180915260 - 111121871 111121900 54522
-21 8 0
-8
-
-chain 692 chr5_h2_hap1 1794870 + 1276691 1276804 chr5 180915260 + 21496928 21497041 821
-113
-
-chain 13519395 chr5_random 143687 + 0 143687 chr5 180915260 + 180261930 180405660 222
-5859 0 4
-460 1 1
-23 0 2
-42 1 3
-42 1 1
-1633 55 55
-2271 0 10
-1279 2 0
-761 2 0
-25 1 1
-150 13 13
-4989 0 1
-1174 1 1
-23 1 1
-495 16 16
-2709 1 4
-349 0 4
-466 0 1
-292 2 0
-184 0 5
-621 13 13
-1788 2 0
-21 1 1
-731 12 12
-149 0 3
-5100 1 0
-1059 0 3
-1724 2 0
-4111 1 0
-890 4 4
-47 1 1
-1137 0 1
-147 17 19
-72 1 1
-22 1 1
-365 1 1
-19 2 2
-1360 0 1
-1476 1 1
-43 1 1
-1141 1 0
-2615 18 18
-4308 0 4
-135 0 2
-1484 8 6
-7384 0 11
-284 1 1
-69 1 1
-232 6 0
-1064 0 2
-4530 0 1
-4542 6 6
-10543 1 0
-4051 2 0
-11340 5 6
-4936 1 0
-12029 3 3
-43 1 1
-2955 27 27
-775 0 10
-822 1 0
-2057 1 0
-733 0 1
-4016 0 1
-4514 1 1
-49 1 1
-4484 1 0
-784 1 1
-25 1 1
-5707 2 0
-1274 1 0
-289 1 1
-34 1 0
-80
-
-chain 15799018021 chr6 170899992 + 5000 170896992 chr6 171115067 + 60000 171055067 6
-1297281 0 1
-7806978 162987 0
-4013144 0 9
-261 15 13
-18786172 17 17
-439 16 16
-59 4 5
-32202 17 17
-439 16 16
-59 5 4
-15403 0 1
-13914166 0 4
-115 1 1
-17 1 1
-415 0 12
-105 3 6
-12160281 50000 50000
-642507 3050000 3100000
-248423 50000 50000
-2918791 0 1238
-9427508 4 4
-162 12 12
-2193 22 22
-293 1 1
-30 1 1
-845 0 1
-45 1 1
-9769 0 2
-6058 1 1
-24 1 1
-2223 1 1
-24 1 1
-182 12 12
-284 1 1
-20 1 1
-970 1 1
-64 36 7
-575 43 43
-389 1 1
-27 1 1
-3279 1 1
-44 1 0
-3012 0 1
-545 17 17
-2562 1 0
-251 1 0
-943 0 8
-29 1 1
-566 0 6
-1483 0 2
-1960 0 1
-4564 1 1
-25 1 1
-832 1 0
-801 8 8
-1131 1 1
-58 1 5
-6177 1 0
-3712 0 1
-2185 1 1
-35 1 1
-710 2 2
-78 1 1
-2201 1 1
-30 1 1
-283 1 1
-30 1 1
-448 0 1
-75012 0 8
-2508457 0 1
-4641788 5 5
-37 1 1
-8503609 2 0
-5363169 200000 150000
-6040303 1 1
-36 0 1
-2020 1 1
-46 1 1
-1559 1 1
-72 1 1
-1098 1 1
-29 1 1
-264 7 7
-580 1 0
-30 1 1
-536 1 1
-41 1 1
-5663 0 1
-423 0 2
-372 1 1
-18 1 1
-9612 0 1
-1414 0 1
-176 2 0
-2742 0 1
-1968 1 0
-754 0 1
-4237 1 0
-2388 1 1
-31 0 1
-3385 1 0
-2004 0 8
-3395 3 0
-32 1 1
-4109 1 0
-1055 0 20
-1611 0 1
-17198424 26 17
-7835 1 0
-11119 1 1
-5197 0 11
-4791 1486 66479
-6787989 1 0
-149 0 4
-947 0 4
-244 1 0
-28418215 1 1
-21 0 1
-3116903 50000 171704
-1939305 1 1
-19 2 0
-8192274 4 4
-122 2 0
-1127 0 1
-1104 1 102
-18 0 29
-40 0 3
-22 1 4
-50 0 26
-56 18125 195105
-950946 1 157
-51 1 1
-104 0 255
-610 0 408
-104 0 105
-1285158 150028 50028
-725067
-
-chain 8374990 chr6 170899992 + 9109557 9199728 chr6 171115067 + 9164559 9254607 394
-3887 2 0
-1509 45 45
-888 7 8
-372 0 1
-4746 3 0
-1114 31 31
-140 35 35
-2111 13 13
-445 248 137
-1437 38 38
-55 25 25
-739 19 19
-2479 70 58
-1297 0 4
-7065 24 24
-542 31 31
-531 22 22
-824 0 1
-2286 40 39
-1209 48 48
-1435 6 0
-4096 4 0
-495 41 42
-6884 0 1
-3177 0 1
-2843 0 1
-904 5 5
-830 18 18
-1997 0 1
-942 4 0
-122 33 33
-1012 0 10
-3751 0 1
-5959 49 49
-4503 0 20
-7514 8 8
-4012 15 15
-673 16 0
-83 4 0
-424 3 0
-3932
-
-chain 892181 chr6 170899992 + 9258019 9267980 chr6 171115067 + 9150000 9160000 4430
-970 53 55
-802 16 17
-389 27 27
-73 5 4
-118 9 5
-615 0 2
-69 17 15
-578 0 1
-114 22 22
-888 130 130
-252 3 9
-564 0 1
-211 5 0
-90 4 0
-1846 21 21
-1832 0 42
-238
-
-chain 763150 chr6 170899992 + 9249728 9258019 chr6 171115067 + 9141295 9150000 6494
-566 0 1
-140 8 0
-205 47 47
-145 18 12
-46 1 0
-3841 0 56
-172 0 372
-444 18 18
-2447 20 20
-173
-
-chain 369937 chr6 170899992 + 9267980 9272102 chr6 171115067 + 9160000 9164126 144773
-1134 49 45
-1420 38 38
-203 0 4
-144 0 3
-115 54 55
-965
-
-chain 4624 chr6 170899992 + 9129966 9130015 chr6 171115067 + 165872977 165873026 28640892
-49
-
-chain 1407 chr6 170899992 + 74606704 74606747 chrX 155270560 + 149588561 149588604 701656
-6 11 11
-26
-
-chain 414456960 chr6_cox_hap1 4731698 + 0 4731698 chr6 171115067 + 28541283 33351542 27
-3409 1 0
-3526 0 1
-2940 0 4
-981 0 1
-4053 0 2
-1433 0 1
-3153 2 0
-369 0 1
-1090 0 1
-884 1 4
-363 1 0
-1969 0 1
-994 5 0
-58 1 1
-131 1 0
-4080 1 0
-680 0 1
-978 0 1
-1062 1 0
-2669 19 19
-7247 1 2
-1704 0 4
-1513 0 2
-49 2 0
-2160 0 5
-672 1 1
-38 1 1
-1384 1 0
-1685 1 1
-30 1 1
-2421 1 1
-42 1 1
-830 1 1
-41 1 1
-1630 0 1
-7458 1 0
-691 0 1
-525 0 1
-79 1 1
-29 1 1
-2055 1 1
-16 0 24
-1867 5 7
-786 0 2
-280 0 1
-227 2 0
-6678 1 0
-4401 1 0
-210 1 0
-3193 2 0
-3619 0 1
-2414 0 2
-5387 0 3
-2927 0 1
-3304 0 1
-440 0 5
-415 0 9
-3597 1 1
-48 1 1
-3412 1 1
-46 1 1
-3604 4 4
-1063 1 1
-36 1 1
-3511 6 6
-2797 32 41
-393 0 1
-477 1 1
-37 1 1
-2459 2 0
-517 0 12
-318 0 1
-1010 7 6
-2103 0 1
-5171 0 8
-1483 1 0
-3813 888 0
-4675 0 2
-5620 1 0
-2017 1 0
-3363 0 5
-1197 0 3
-3208 1 0
-1928 1 0
-174 6 0
-780 1 3
-443 14 0
-3079 0 5
-1993 0 3
-1089 1 1
-58 1 1
-80 0 8
-256 2 0
-2473 37 43
-752 0 2
-33 0 2
-825 0 1
-787 1 1
-37 1 1
-1168 16 0
-377 5 1
-27 1 1
-2161 2 0
-636 25 25
-1663 1 0
-1757 6 6
-205 4 0
-203 7 7
-107 1 1
-28 1 1
-100 4 4
-258 5 0
-659 1 0
-3805 5 8
-1486 4 4
-213 39 43
-4429 0 2
-1199 13 13
-5803 12 0
-2987 0 1
-813 0 17
-920 2 0
-3820 1 3
-130 21 9
-1913 0 14
-1800 0 1
-1255 2 0
-1466 4 0
-747 0 1
-124 2 0
-2108 1 0
-169 0 26
-593 1 0
-632 5 0
-2711 0 4
-1042 0 1
-34 1 1
-1025 2 0
-27 4 18
-81 1 33
-33 0 1
-6 0 76
-3950 1 0
-86 1 1
-12 1 1
-2947 0 1
-1160 1 0
-2046 3 0
-720 1 0
-1341 1 0
-10205 0 5
-1265 1 0
-10 1 1
-1278 5 6
-399 0 32
-96 16 18
-605 4 0
-1072 12 12
-950 11 7
-5128 9 10
-2711 1 0
-676 0 1
-2904 1 1
-30 1 1
-851 0 1
-1410 0 1
-394 1 1
-57 1 1
-1561 0 2
-11062 1 1
-58 1 1
-3238 1 1
-42 1 1
-269 1 0
-284 3 3
-24 1 0
-2796 0 5
-2451 28 0
-2251 1 1
-32 1 0
-10 0 4
-24 1 1
-694 0 2
-3475 0 1
-2008 1 1
-49 1 1
-475 1 1
-28 1 1
-259 160 0
-1858 1 0
-1621 3 0
-1791 1 0
-316 0 2
-1169 0 1
-2549 1 0
-2941 1 1
-34 1 1
-243 9 0
-5157 0 2
-1748 0 8
-472 4 0
-2470 0 4
-402 1 0
-643 2 0
-748 0 2
-859 1 0
-409 2 0
-267 0 2
-322 0 4
-155 1 0
-9957 0 4
-1440 4 4
-127 1 0
-1085 1 0
-131 1 0
-767 1 0
-1160 21 21
-1294 1 0
-712 1 0
-1819 2 1
-464 1 0
-6944 0 4261
-55 0 7
-1235 0 3
-702 0 24
-2847 0 1
-2428 3 0
-7517 0 1
-3204 1 0
-611 1 0
-7104 1 0
-4959 14 14
-2827 1 0
-9421 82 25
-4428 8 0
-5987 41 41
-2108 0 2
-344 1 0
-4216 1 0
-810 0 5
-4443 1 0
-10291 10 0
-7265 5 0
-7041 1 0
-6007 1 0
-8185 4 0
-4961 0 3
-13564 0 1
-1475 0 2
-105 0 10
-10104 2 0
-3073 1 0
-3715 8 0
-2246 24 24
-11461 0 2
-837 61 1
-7660 39 39
-1705 0 1
-6068 7 0
-916 0 4
-569 1 1
-72 1 1
-2260 0 2
-7036 4 0
-3591 0 3
-713 4 0
-7058 11 11
-3319 0 2
-8475 0 1
-1324 0 2
-5438 5 0
-156 1 1
-44 0 1
-21501 7 7
-3359 16 16
-2138 0 5
-4406 11 11
-1525 1 1
-28 1 1
-2159 16 0
-48 4 0
-3030 0 1
-5717 10 0
-6594 2 0
-648 31 31
-1275 1 0
-4 1 0
-3599 1 0
-7515 4 0
-979 0 2
-1990 0 10
-123 1 1
-27 1 1
-1255 0 2
-2769 5 5
-727 1 1
-26 3 3
-785 0 1
-8871 29 29
-15459 1 0
-5978 5 5
-66 1 1
-46 1 1
-18539 1 0
-7732 2 0
-652 0 1
-861 0 1
-10658 17 17
-1313 0 1
-3515 3 0
-19 18 0
-539 0 1
-655 2 0
-10586 2 0
-2385 0 1
-7589 1 0
-29834 1 1
-27 1 1
-1216 1 0
-1323 1 0
-673 0 3
-20031 0 3
-2841 13 0
-1841 4 0
-6446 1 0
-11727 0 1
-8427 17 17
-2864 0 143
-4107 0 8
-748 0 2
-3417 1 1
-32 1 1
-18799 0 2
-21810 1 1
-34 1 1
-2784 2 0
-7864 2 0
-4498 0 1
-49089 1 1
-32 1 1
-509 1 1
-37 1 1
-5371 22 16
-389 1 1
-21 1 1
-806 1 0
-1638 6 6
-228 1 1
-45 1 1
-2068 6 3
-441 1 0
-2338 1 0
-1948 1 1
-26 1 1
-214 0 1
-6118 1 1
-31 1 1
-2382 5 5
-4335 1 1
-39 1 1
-4561 1 1
-38 1 1
-2199 1 1
-49 1 1
-243 19 6
-2779 1 1
-37 2 0
-24 1 1
-1966 3 0
-233 1 1
-29 1 1
-13756 0 4
-3956 4 1
-33765 46 46
-12758 1 0
-18985 0 8
-1384 3 1
-85 1 0
-3539 1 1
-32 1 1
-145 1 0
-1245 2 0
-1736 80 80
-1607 1 5
-712 10 11
-502 0 1
-3670 1 0
-740 0 1
-1693 0 1
-6497 0 2
-2898 1 3
-141 0 1
-1108 0 2
-1448 1 0
-1340 0 1
-7616 74 66
-2882 1 2
-30 8 0
-896 21 3
-395 1 1
-37 3 0
-23 1 2
-1210 18 0
-65 1 1
-20 1 1
-791 0 4
-389 1 0
-809 1 1
-55 0 7
-428 1 1
-17 1 1
-239 1 1
-20 1 1
-69 1 1
-37 1 1
-955 1 0
-839 0 1
-165 1 0
-3867 0 5
-70 1 1
-27 1 1
-899 1 2
-107 1 0
-1457 1 0
-763 12 5
-35 1 1
-1417 10 10
-121 1 1
-38 0 3
-377 1 0
-325 2 2
-178 1 0
-11 4 0
-297 0 24
-337 11 0
-134 1 1
-694 3 0
-72 1 1
-144 1 1
-96 1 1
-199 2 0
-1011 1 0
-107 1 1
-1280 1 1
-73 1 1
-84 25 25
-287 1 1
-26 1 1
-139 1 1
-41 1 1
-440 4 0
-130 12 12
-435 21 0
-85 1 1
-28 1 1
-73 1 1
-61 1 1
-53 5 1
-70 1 2
-52 2 0
-157 30 30
-554 2 2
-128 1 5
-68 1 1
-44 1 1
-125 0 1
-57 1 1
-308 0 7
-15 1 1
-725 9 0
-60 1 1
-180 1 1
-55 1 1
-61 1 1
-23 1 0
-5 1 2
-88 1 1
-56 1 1
-433 2 0
-84 68 68
-182 12 12
-216 1 1
-94 1 1
-561 1 1
-16 1 1
-113 1 1
-86 1 1
-148 2 0
-75 2 0
-77 1 21
-209 3 8
-374 1 0
-173 4 3
-201 1 1
-42 1 1
-56 1 1
-115 1 0
-327 1 1
-54 5 5
-929 1 1
-21 1 1
-97 1 1
-28 0 3
-830 0 2
-68 1 1
-525 0 1
-2081 1 1
-41 1 1
-165 3 3
-46 1 0
-378 1 1
-49 1 1
-352 0 1
-142 1 1
-30 1 1
-95 1 1
-45 1 1
-227 1 1
-53 1 1
-130 1 1
-18 1 1
-138 1 1
-90 1 1
-129 41 41
-50 1 1
-79 1 1
-117 1 1
-31 1 1
-240 5 5
-57 1 1
-152 1 1
-30 1 1
-177 5 5
-321 1 1
-63 1 1
-504 18 18
-662 1 1
-74 1 1
-248 1 1
-34 1 1
-1507 0 10
-1051 0 2611
-560 3 3
-23 1 1
-1631 0 15
-78 4 0
-160 0 21
-3764 0 4
-1358 0 1
-1773 1 1
-43 1 1
-1263 1 1
-39 1 1
-183 0 16
-4097 10 0
-1261 1 1
-20 1 1
-137 1 0
-2351 1 1
-43 1 1
-1010 0 4
-536 1 1
-38 1 1
-381 0 1
-888 19 19
-1521 1 1
-27 1 1
-161 1 1
-46 1 1
-2659 2 0
-533 10 0
-441 1 12
-1684 1 1
-26 3 4
-879 16 16
-514 0 2
-58 1 1
-117 1 1
-24 1 1
-207 1 0
-38 1 1
-730 1 1
-39 1 1
-429 10 10
-134 0 4
-37 1 1
-144 8 8
-1036 2 0
-262 2 2
-38 0 1
-70 18 18
-84 11 13
-317 0 3
-1256 0 2
-332 1 1
-21 1 1
-193 8 28
-30 1 1
-79 1 1
-29 1 1
-536 1 0
-611 1 1
-25 1 1
-399 4 4
-118 0 32
-23 1 1
-116 1 1
-30 1 1
-503 1 1
-22 0 3
-136 1 1
-48 1 1
-330 9 9
-1108 1 1
-98 1 1
-582 0 4
-711 7 7
-89 1 0
-293 7 6
-159 1 1
-24 1 1
-167 6 6
-171 17 17
-681 1 1
-43 1 1
-538 1 1
-44 1 1
-537 16 16
-180 6 6
-778 2 2
-44 1 1
-168 0 7
-211 1 1
-42 1 1
-1253 1 1
-29 1 1
-320 1 1
-36 2 2
-55 1 2
-460 1 1
-35 1 1
-553 8 8
-386 1 1
-26 1 1
-540 1 1
-31 1 1
-65 0 1
-625 12 12
-313 0 1
-52 1 1
-22 1 1
-583 1 1
-49 1 1
-678 37 37
-784 3 0
-770 1 1
-87 11 0
-1129 1 1
-36 1 1
-553 8 8
-997 16 15
-157 1 1
-31 2 2
-204 18 19
-487 1 1
-29 1 1
-374 1 1
-67 1 1
-720 13 13
-266 10 10
-330 16 14
-413 1 1
-44 1 1
-78 6 6
-181 2 2
-36 1 1
-397 1 1
-20 1 1
-311 1 1
-48 2 2
-1298 11 11
-437 4 4
-35 1 1
-194 10 10
-310 1 1
-51 1 1
-136 1 1
-49 1 1
-521 1 1
-23 1 1
-220 1 1
-71 1 1
-1046 15 15
-216 1 1
-21 1 1
-51 1 1
-49 1 1
-527 17 17
-340 12 11
-1025 1 0
-2572 1 1
-29 1 1
-397 2 5
-668 13 13
-541 1 1
-59 0 2
-6 1 1
-122 14 14
-51 1 1
-46 1 1
-72 5 5
-352 0 21
-136 1 1
-12 1 1
-66 16 16
-456 37 34
-371 7 7
-48 1 1
-194 10 10
-108 1 1
-60 1 1
-122 0 1
-48 1 1
-238 1 1
-32 0 1
-100 1 0
-72 1 0
-390 1 1
-38 1 1
-144 1 1
-27 0 4
-184 21 228
-49 1 1
-608 0 1
-152 1 1
-31 1 1
-281 8 8
-337 1 1
-45 1 1
-222 1 1
-20 1 1
-380 1 0
-44 1 1
-368 1 1
-72 1 1
-502 36 18
-63 1 1
-43 0 4
-136 1 1
-42 1 1
-80 4 4
-35 1 0
-89 1 1
-24 0 5
-829 13 13
-102 14 0
-233 1 1
-42 0 3
-85 0 1
-400 1 1
-40 1 1
-538 25 25
-174 1 1
-20 1 1
-705 1 1
-26 2 2
-614 1 1
-44 1 1
-509 1 1
-32 1 1
-224 1 1
-42 1 1
-747 5 5
-804 1 1
-29 1 1
-166 1 1
-43 1 1
-233 1 1
-44 1 1
-620 8 8
-133 1 1
-31 1 1
-165 1 1
-29 1 1
-1249 1 1
-26 4 0
-56 1 1
-67 1 1
-716 1 1
-46 0 1
-16 1 1
-174 1 1
-96 1 1
-141 1 1
-39 0 4
-263 1 1
-18 1 1
-259 4 4
-38 1 1
-104 1 1
-40 1 0
-248 1 1
-18 1 1
-238 1 1
-32 1 1
-70 0 2
-16 1 1
-818 1 1
-22 4 4
-1641 1 1
-46 1 1
-53 1 0
-38 1 1
-373 1 1
-60 1 1
-1149 0 2
-19 1 1
-1653 4 4
-42 1 1
-218 12 12
-363 1 1
-24 1 1
-457 10 10
-414 13 13
-825 1 1
-41 1 1
-492 0 8
-1370 1 1
-18 1 1
-808 2 2
-335 6 4
-880 1 1
-35 1 1
-236 1 1
-67 1 1
-298 0 1
-147 4 4
-322 11 11
-613 1 1
-62 1 1
-340 1 1
-22 1 1
-1057 1 1
-57 1 1
-358 1 1
-128 1 1
-146 10 10
-490 1 1
-20 1 1
-62 1 1
-88 1 1
-293 1 1
-28 1 0
-20 1 1
-83 0 1
-90 1 1
-312 1 1
-44 1 1
-1213 1 1
-51 1 1
-467 1 1
-39 1 1
-122 14 0
-35 1 1
-485 14 14
-110 13 0
-127 1 1
-7150 9 13
-3278 0 2
-28 1 1
-2211 1 0
-1325 18 18
-1304 3727 0
-299 0 248
-2603 2 0
-160 1 1
-34 1 1
-631 1 1
-40 1 3
-38 1 1
-332 17 17
-231 14 14
-202 1 1
-199 1 1
-71 1 1
-42 1 0
-53 11 10
-82 34 34
-135 1 1
-50 3 0
-32 1 1
-194 1 1
-45 1 1
-143 1 1
-78 1 1
-193 6 0
-40 1 1
-432 1 1
-17 1 1
-429 3 6
-58 1 1
-85 1 1
-62 1 1
-85 1 1
-57 1 1
-51 2 2
-278 1 1
-49 1 1
-77 11 11
-120 0 4
-139 1 1
-30 2 2
-205 4 4
-131 1 1
-22 1 1
-251 1 1
-34 1 1
-175 1 1
-36 1 1
-239 1 1
-32 5 5
-63 1 1
-27 1 1
-78 1 1
-19 1 1
-209 1 1
-143 1 13
-176 0 1
-7 0 8
-375 0 1
-62 1 1
-129 2 2
-135 1 1
-88 8 0
-90 6 8
-796 2 0
-1219 1 1
-34 1 1
-833 1 1
-46 1 1
-74 1 1
-45 1 1
-95 1 1
-29 1 1
-298 0 3
-47 1 1
-311 1 1
-58 1 1
-349 15 15
-208 1 1
-37 3 0
-413 11 11
-54 1 1
-97 1 1
-137 0 2
-95 1 1
-257 3 0
-35 1 1
-66 1 1
-47 1 1
-104 7 7
-220 17 17
-228 4 4
-432 1 1
-34 3 3
-175 4 4
-26 1 2
-116 7 7
-60 13 13
-137 1 1
-44 1 1
-744 1 1
-29 1 1
-148 0 5
-30 1 1
-387 1 1
-22 1 1
-309 1 1
-82 1 1
-52 1 1
-32 1 1
-121 1 1
-37 1 1
-396 3 2
-324 1 1
-92 1 1
-51 9 9
-71 7 7
-24 1 1
-115 1 1
-101 1 1
-799 12 12
-197 1 1
-146 1 1
-103 1 1
-134 1 1
-16 1 1
-378 1 1
-85 1 1
-134 1 1
-25 1 1
-54 3 3
-55 1 1
-67 1 1
-22 1 1
-54 13 13
-55 11 11
-120 1 1
-23 1 1
-51 1 1
-22 1 1
-369 1 1
-273 1 1
-119 6 6
-229 34511 40178
-78 1 1
-22 1 1
-180 1 1
-33 1 2
-26 6 6
-474 1 1
-36 1 1
-151 1 1
-29 1 1
-120 1 1
-23 1 1
-865 1 1
-39 1 1
-330 1 1
-24 1 1
-197 1 1
-69 1 1
-116 3 0
-161 1 1
-38 1 1
-753 1 1
-57 3 3
-145 1 1
-121 1 1
-300 1 1
-147 1 1
-379 1 1
-55 2 2
-65 1 1
-32 1 1
-1008 1 1
-24 1 1
-159 18 18
-659 1 1
-76 0 2
-77 1 3
-65 1 1
-84 1 0
-119 1 1
-15 1 1
-247 4 0
-372 1 0
-1633 1 1
-16 1 1
-221 9772 11561
-315 1 1
-53 1 1
-67 1 1
-91 1 0
-23 1 0
-27 2 2
-66 2 2
-80 0 41
-12 1 1
-158 1 0
-92 2 0
-254 1 1
-43 1 1
-846 6 149
-84 1 1
-29 3 3
-315 17 17
-482 1 1
-29 3 3
-278 1 1
-73 1 1
-2767 1 1
-34 1 1
-192 1 1
-33 1 0
-168 6 0
-276 10 10
-344 1 1
-49 1 1
-109 1 1
-35 3 3
-561 24 27
-923 1 1
-102 1 1
-75 14 14
-266 1 1
-80 2 2
-185 1 0
-1035 1 1
-23 1 1
-417 10 10
-97 1 1
-94 1 1
-492 1 1
-37 5 5
-1429 1 1
-19 1 1
-839 1 1
-96 1 1
-1279 4 0
-683 1 1
-49 1 1
-514 1 1
-28 4 4
-2302 1 1
-42 1 1
-537 2 21
-1555 1 1
-42 0 1
-14 4 4
-86 1 1
-62 1 1
-515 5 1
-330 0 1
-159 0 22
-3841 1 0
-5065 12 12
-97 0 3
-772 1 1
-21 2 1
-1058 0 2
-349 2 0
-1080 6 0
-11 1 3
-53 0 2
-14 1 1
-1035 1 1
-85 1 1
-69 1 1
-27 1 1
-547 7 7
-195 1 1
-41 1 1
-395 1 1
-35 1 1
-73 0 1
-71 1 1
-557 3 3
-30 1 1
-66 49 49
-1310 0 2
-26 2 0
-10 1 15
-36 1 1
-196 1 1
-40 1 1
-141 1 1
-76 1 1
-1480 1 3
-347 1 1
-26 1 1
-231 1 1
-82 3 3
-69 3 0
-441 16 16
-147 1 1
-21 1 1
-3565 0 3
-877 2 0
-1036 1 1
-47 2 1
-3761 12 0
-5345 1 0
-11541 1 0
-1843 0 4
-1157 16 16
-7354 19 0
-736 0 1
-8058 1 0
-4449 21 21
-649 1 0
-2913 0 1
-381 331 0
-6066 0 1
-1968 7 0
-3198 1 0
-667 1 0
-3870 0 1
-36 13 0
-1894 1 1
-40 0 4
-1137 6 0
-211 2 0
-345 1 0
-592 4 4
-1043 4 0
-686 14 0
-1032 0 1
-9035 0 4
-167 0 2
-19472 35 35
-4457 0 3
-1470 0 1
-289 3 0
-3780 41 41
-522 1 0
-2026 8 0
-430 0 1
-631 1 1
-21 1 1
-479 0 1
-697 4 0
-1779 1 1
-27 1 1
-196 4 0
-58 8 0
-2881 1 1
-39 1 1
-120 44 45
-538 1 0
-393 6 6
-3090 1 1
-43 1 1
-1246 1 0
-294 1 1
-27 1 1
-374 3 3
-144 1 1
-190 1 6
-750 1 0
-695 2 0
-1003 11 0
-1185 8 8
-763 0 4
-2737 11 11
-453 1 0
-536 1 1
-43 1 1
-57 1 0
-21 7 0
-3892 0 1
-3177 0 1
-8990 0 2
-2303 1 0
-2850 4 0
-1273 0 2
-5863 1 0
-9593 1 1
-81 1 1
-2777 0 2
-4564 34 34
-674 0 8
-11548 2 0
-6086 0 1
-109 1 1
-2286 0 1
-997 0 18
-3344 1 1
-40 1 1
-842 28 24
-1584 1 0
-1582 0 1
-1670 3 25
-17 0 4
-16 2 0
-6 12 0
-49 1 1
-538 1 1
-26 1 1
-5879 2 4
-2513 0 1
-346 8 8
-222 16 16
-103 1 0
-198 1 3
-539 1 1
-47 1 1
-1154 0 1
-3737 1 2
-370 2 0
-1178 1 1
-78 1 1
-47 0 1
-518 6 0
-646 13 13
-469 1 0
-1072 1 4
-858 1 0
-3674 1 0
-282 1 0
-597 0 6
-505 4 4
-183 1 1
-43 1 1
-1294 1 1
-40 1 1
-572 0 4
-464 0 4
-757 40 40
-1089 2 0
-548 1 0
-1300 0 3
-1839 2 0
-189 1 1
-49 1 1
-1253 1 1
-43 1 0
-498 1 1
-45 4 0
-3538 0 1
-1989 14 14
-1332 2 0
-3586 1 0
-989 1 2
-447 0 4
-40 1 1
-2445 16 17
-291 1 3
-7 1 0
-11 0 1
-41 1 1
-94 1 1
-49 1 1
-1515 6 0
-603 13 13
-163 1 1
-45 1 1
-2050 11 11
-1126 1 1
-16 1 1
-391 1 1
-19 0 1
-932 1 0
-42 1 1
-751 1 0
-287 1 1
-42 1 1
-464 0 4
-4069 5 5
-153 1 0
-514 2 0
-1093 1 1
-41 1 1
-1746 4 4
-1351 1 1
-38 1 1
-682 12 12
-519 0 72
-168 18 18
-146 7 7
-293 1 1
-61 0 1
-43 1 1
-236 1 0
-35 1 1
-152 14 14
-776 0 4
-809 4 0
-155 1 1
-44 1 1
-1068 1 1
-93 1 1
-209 15 15
-1331 0 3
-3912 0 1
-6624 0 4
-375 0 1
-7255 5 0
-419 2 0
-293 1 0
-10397 5 24
-11095 0 1
-1770 4 0
-374 0 4
-7714 1 0
-1229 7 6
-3055 1 0
-5818 1 0
-2415 11 9
-2056 0 1
-955 4 0
-3907 0 2
-16936 0 1
-1044 1 0
-2392 0 1
-158 2 1
-199 0 1
-75 6 6
-2094 8 0
-649 2 0
-373 75 75
-2253 1 0
-15 1 0
-1995 0 2
-818 4 0
-676 0 1
-3171 8 0
-170 0 3
-459 1 1
-37 1 1
-336 1 0
-206 1 1
-26 1 1
-224 15 15
-308 2 1
-82 1 1
-23 1 1
-562 1 1
-80 1 1
-241 0 8
-1530 1 1
-20 1 1
-1372 1 1
-44 1 1
-427 1 1
-20 1 1
-651 105 81
-221 1 1
-45 1 1
-1747 1 1
-27 1 1
-179 1 1
-70 1 1
-173 1 1
-84 0 36
-1864 1 1
-41 1 1
-44 9 0
-1028 1 0
-85 1 1
-21 1 1
-475 0 2
-256 1 1
-31 1 1
-653 1 1
-18 1 1
-62 1 1
-19 1 1
-997 1 1
-22 1 1
-326 1 0
-505 5 4
-386 0 7
-466 13 13
-870 11 12
-134 15 15
-248 0 2
-2281 1 1
-79 1 1
-56 9 6
-498 100 100
-802 1 0
-290 1 1
-38 1 1
-185 1 1
-61 1 1
-944 1 1
-22 1 1
-835 1 1
-66 1 1
-890 0 1
-3503 6 6
-231 0 1
-2136 1 0
-999 1 0
-5220 3 4
-830 1 1
-24 1 1
-1209 1 1
-38 1 1
-7077 1 0
-2939 1 0
-3959 0 2
-3746 0 2
-1011 1 1
-34 1 1
-7443 0 1
-688 2 0
-574 1 1
-29 1 1
-1785 2 0
-16 20 0
-4073 2 0
-136 1 1
-77 1 1
-528 27 0
-253 0 1
-204 1 0
-129 2 0
-811 1 1
-38 1 1
-2347 52 0
-4634 1 0
-856 14 14
-1052 1 1
-28 1 1
-1255 1 1
-36 1 1
-97 0 1
-58 1 1
-1708 1 1
-48 1 1
-958 13 0
-3371 1 1
-37 1 1
-4267 0 15
-1059 0 1
-272 0 20
-168 2 0
-26 4 32
-4090 0 2
-3269 1 1
-17 1 2
-1378 1 0
-1443 0 1
-6206 1 0
-2318 0 1
-7695 2 0
-396 22 12
-918 0 1
-1818 0 1
-28 1 1
-492 1 1
-33 1 1
-326 1 1
-80 1 1
-288 8 17
-2671 0 1
-1099 0 1
-144 1 1
-29 0 1
-2098 0 2
-24 4 0
-1207 4 4
-45 1 1
-757 0 5
-1926 1 1
-40 1 1
-2657 0 1
-414 1 0
-61 0 1
-235 0 2
-2087 0 1
-713 0 4
-58 1 0
-1041 3 0
-36 1 1
-377 1 1
-17 1 1
-948 1 1
-41 1 1
-458 1 1
-21 1 1
-1055 0 1
-8189 4 5
-36 1 1
-102 2 0
-14 1 1
-682 0 6
-147 0 1
-750 0 3
-40 1 1
-2428 0 1
-750 2 0
-473 0 2
-2032 1 0
-3841 1 0
-560 1 0
-1108 1 0
-8087 1 0
-11881 1 1
-30 1 1
-4383 2 0
-6883 49 49
-3146 0 1
-906 2 0
-887 1 1
-80 1 1
-2210 1 0
-905 0 1
-1037 1 0
-5866 0 2
-18 1 1
-582 0 5
-2828 1 0
-847 1 0
-1996 4 0
-3170 1 0
-1751 0 1
-910 2 0
-691 0 1
-32873 0 1
-1722 0 1
-17559 16 24
-1369 29 0
-494 2 0
-4432 0 1
-23680 26 26
-10911 0 1
-920 0 1
-4586 0 2
-2232 1 0
-5718 0 1
-12415 1 1
-51 0 1
-7997 0 2
-1700 1 0
-2697 1 0
-2561 2 0
-1544 0 6
-1613 3 7
-37 9 1
-2113 1 0
-7174 0 34
-7914 1 1
-35 1 1
-5308 1 0
-2303 2 1
-423 7 7
-590 1 0
-24 1 1
-165 6 0
-2848 13 13
-64 0 1
-28 1 1
-723 0 4
-2868 0 1
-731 1 1
-60 1 1
-1012 3 0
-490 29 29
-1225 1 1
-78 1 1
-61 1 0
-2362 11 11
-399 1 0
-1494 16 16
-128 24 24
-530 1 1
-35 1 1
-5276 1 0
-415 0 1
-580 1 2
-1450 22 23
-816 1 0
-1953 1 0
-881 10 1
-885 8 14
-183 14 14
-1139 25 25
-155 1 1
-94 1 1
-419 3 3
-26 1 1
-56 1 0
-69 1 0
-117 1 1
-120 1 1
-42 1 1
-825 0 2
-108 1 1
-24 1 1
-956 3 0
-664 1 1
-41 1 1
-716 4 0
-1731 8 8
-4228 0 1
-5694 3 0
-4493 0 1
-2656 1 0
-3029 4 0
-5688 1 0
-170 2 0
-5972 0 2
-840 0 2
-55 1 1
-28 1 1
-2954 0 1
-4343 6 0
-1663 4 0
-150 1 0
-3128 1 0
-1449 3 0
-1534 1 0
-489 1 0
-431 0 4
-299 2 0
-5082 9 0
-413 0 1
-989 0 2
-4941 0 1
-6655 1 0
-349 8 7
-762 1 1
-29 0 3
-1434 0 1
-1267 0 1
-587 1 1
-22 0 1
-894 28 0
-1343 2 0
-2256 0 1
-4332 0 4
-22 1 1
-12415 12 10
-10485 0 1
-1429 0 12
-625 1 7
-1224 0 10
-1680 4 0
-5169 14 14
-3878 0 8
-2544 0 140
-9238 0 1
-1575 0 3
-1775 1 1
-31 1 1
-1200 1 0
-32 0 3
-797 0 8
-35 0 2
-599 1 1
-22 1 1
-5338 2 0
-1998 0 5
-146 0 4
-12031 0 1
-1993 0 1
-706 2 0
-2735 0 1
-3859 0 4
-4845 0 2
-268 2 0
-827 4 4
-1063 6 6
-7834 2 0
-3195 0 1
-4012 10 0
-6429 0 2
-308 0 1
-808 1 0
-17 8 0
-5472 19 2
-2436 0 14
-820 9 9
-2643 1 1
-32 1 1
-1189 1 0
-5710 0 3
-308 1 0
-4930 0 1
-4308 1 0
-946 82 0
-1790 0 2
-1218 25 0
-52 0 1
-1271 1 1
-33 1 1
-4760 1 0
-4924 0 1
-4817 4 4
-39 1 0
-1116 3715 901
-205 1 0
-1591 5 2
-138 2 2
-16 1 1
-802 0 89
-1600 0 6
-2175 0 5
-606 14 14
-519 1 0
-540 1 1
-40 1 1
-568 2 0
-458 1 1
-41 1 1
-1106 24 62
-818 1 1
-42 1 1
-2266 1 0
-14059 0 4
-5030 1 0
-12630 0 3
-84 9 9
-129 13 18
-564 10 15
-154 1 0
-438 10 10
-38 0 5
-98 11 9
-2034 1 1
-25 1 1
-73 10 10
-70 5 5
-132 1 1
-52 1 1
-599 1 1
-46 1 1
-279 1 1
-18 1 1
-239 3 0
-383 6 0
-224 0 1
-321 15 0
-1783 1 1
-18 3 0
-108 1 1
-60 1 1
-405 16 16
-60 1 1
-16 1 1
-970 1 1
-24 1 1
-424 3 0
-41 1 1
-57 8 8
-285 2 0
-672 1 1
-44 1 4
-103 0 1
-148 1 1
-49 3 0
-146 5 11
-91 1 1
-79 1 1
-94 1 1
-101 1 1
-88 16 16
-117 1 1
-15 1 1
-58 1 1
-93 1 1
-466 1 1
-44 1 1
-160 1 1
-23 1 1
-481 14 14
-181 4 4
-72 1 1
-25 1 1
-82 7 12
-4 0 1
-11 1 4
-20 0 5
-92 1 1
-56 10 0
-80 1 1
-141 2 0
-60 1 1
-372 0 2
-784 1 1
-85 1 1
-109 1 1
-16 1 1
-57 1 1
-92 3 1
-23 1 0
-26 1 1
-74 1 1
-33 1 1
-176 1 1
-25 2 2
-193 1 1
-35 0 1
-383 0 5
-249 1 1
-69 1 1
-98 1 1
-70 1 1
-55 1 1
-143 1 1
-438 1 1
-64 1 1
-53 4 0
-127 3 0
-75 5 5
-45 1 1
-197 1 1
-27 1 1
-116 13 13
-218 15 20
-1107 16 19
-73 1 1
-101 1 1
-123 1 1
-60 1 1
-994 1 1
-43 0 1
-18 1 1
-1215 18 18
-340 1 1
-34 1 1
-1350 16 16
-1417 1 1
-29 1 1
-475 1 1
-48 1 1
-198 10 10
-87 1 1
-18 1 1
-171 7 7
-427 1 1
-21 1 1
-2011 0 3
-17 1 1
-1412 1 1
-24 1 1
-214 8 4
-228 1 1
-34 1 1
-410 16 16
-185 1 1
-24 1 0
-164 0 1
-222 1 1
-25 1 1
-297 10 10
-1171 1 0
-569 19 19
-2755 1 0
-11 1 1
-2502 1 1
-23 1 1
-44 12 0
-2856 0 1
-148 1 1
-36 1 1
-993 2 0
-1251 2 0
-6619 14 14
-1014 4 0
-134 2 9
-818 1 0
-61 1 7
-563 46 0
-78 5 5
-1677 1 1
-49 1 1
-399 1 1
-32 1 1
-790 27 27
-104 1 1
-75 1 1
-1638 1 1
-16 1 1
-92 1 1
-44 1 1
-276 0 13
-1020 1 1
-35 1 1
-389 14 14
-256 1 0
-38 1 3
-631 1 1
-40 1 1
-2356 85 83
-1300 0 5
-511 0 2
-605 1 1
-17 1 1
-880 12 0
-1689 4 0
-2492 1 1
-39 1 1
-641 16 16
-682 0 5
-669 1 1
-25 1 1
-1926 1 1
-39 4 3
-1037 1 1
-40 2 0
-890 6 0
-41 2 0
-498 3 0
-321 0 1
-281 3 0
-450 1 1
-34 1 1
-498 1 1
-28 2 1
-280 0 2
-648 1 1
-47 1 1
-1002 4 0
-120 1 1
-1538 0 1
-75 1 1
-37 1 1
-510 91 91
-60 18 18
-2075 1 1
-19 1 1
-2429 1 1
-21 1 1
-107 1 0
-2786 0 2
-31 5 5
-1973 12 0
-3118 1 0
-246 0 1
-33 1 1
-6752 1 0
-822 2 9
-606 1 1
-18 1 1
-3920 1 1
-37 0 2
-4497 10 13
-301 20 20
-2130 1 1
-16 3 0
-1843 0 4
-3780 3 0
-850 0 1
-2774 0 3
-2065 0 1
-20 1 1
-1400 1 0
-3243 0 15
-1336 5 0
-448 49 49
-121 7 7
-1507 8 7
-422 1 0
-2184 0 1
-304 0 2
-19 0 1
-101 1 1
-417 3 3
-22 1 1
-672 4 4
-31 1 1
-150 1 1
-38 1 1
-161 5 0
-17 1 1
-72 1 0
-106 1 1
-463 1 1
-94 1 1
-138 3 4
-185 1 1
-29 1 1
-220 15 15
-167 1 1
-32 1 1
-93 1 3
-217 1 1
-23 1 1
-137 9 9
-62 0 3
-353 1 1
-27 1 1
-117 9 9
-421 1 1
-47 1 1
-124 0 1
-997 6 0
-54 5 5
-764 1 1
-45 1 1
-1431 7 7
-387 6 6
-1103 0 36
-767 1 1
-31 1 3
-208 5 5
-1610 1 1
-23 1 1
-779 0 8
-324 0 2
-45 1 1
-264 0 3
-45 1 1
-250 1 1
-18 1 1
-517 33 0
-117 1 1
-42 1 1
-550 1 1
-20 1 1
-671 1 1
-68 1 1
-89 1 1
-104 1 1
-172 0 1
-124 0 1
-522 0 1500
-466 5 5
-32 1 0
-171 1 1
-19 1 1
-67 1 1
-22 1 1
-654 1 1
-25 1 1
-68 1 1
-21 4 0
-1588 1 1
-66 1 1
-401 0 1
-186 1 1
-21 1 1
-168 0 1
-686 3 0
-19 1 1
-127 1 1
-29 1 1
-234 1 1
-30 1 1
-141 0 2
-33 1 1
-673 1 1
-89 1 1
-161 16 16
-504 20149 20139
-1269 1 1
-40 1 1
-327 1 1
-24 1 1
-172 2 2
-27 11 15
-381 10 11
-376 1 1
-45 1 1
-121 1 1
-62 1 1
-289 1 1
-26 1 1
-191 1 1
-20 11 11
-425 1 1
-37 1 1
-296 1 1
-149 1 1
-284 1 1
-37 1 1
-705 1 12
-106 12 12
-306 1 1
-24 1 1
-1299 1 1
-47 1 1
-2026 1 1
-20 1 1
-133 1 0
-9803 0 4
-15871 3 0
-2464 1 1
-24 1 1
-879 1 1
-73 1 1
-89 1 1
-42 1 1
-108 1 1
-43 0 1
-26 1 1
-511 5 6
-605 19531 20105
-55 1 1
-37 0 2
-89 1 1
-51 1 1
-85 1 1
-78 1 1
-173 1 1
-51 1 1
-90 3 3
-95 1 1
-32 1 1
-53 1 1
-231 1 0
-82 2 0
-27 0 1
-44 1 0
-96 10 7
-132 1 1
-233 1 1
-257 1 1
-56 5 5
-237 1 1
-141 1 1
-92 1 1
-154 7 7
-3208 1 1
-33 1 1
-671 1 1
-21 1 1
-955 0 3
-130 1 1
-26 1 1
-288 8 8
-218 0 3
-1076 8 0
-609 10041 10021
-240 2 2
-66 1 1
-228 1 1
-23 1 1
-1612 1 1
-21 1 1
-261 1 1
-99 1 1
-128 1 1
-15 1 1
-77 9 9
-618 8 8
-84 4 6
-438 1 1
-140 1 1
-158 4 3
-277 12 12
-165 4 4
-36 1 1
-253 1 1
-59 1 1
-910 0 1
-915 4 5
-276 15 15
-682 1 1
-28 1 1
-1483 13 13
-203 1 0
-52 1 1
-48 1 1
-229 12 12
-68 15 15
-83 1 1
-39 1 1
-194 1 1
-24 1 1
-251 8 8
-619 0 4
-15 1 1
-690 1 1
-28 1 1
-54 0 1
-463 1 1
-30 1 1
-449 1 1
-54 1 1
-58 5 5
-979 1 0
-318 1 1
-28 1 1
-898 10 10
-100 1 1
-22 1 1
-446 1 1
-74 1 1
-273 1 1
-19 1 1
-333 1 1
-44 1 1
-220 1 1
-56 2 0
-209 1 1
-70 1 1
-223 0 20
-220 1 1
-31 1 1
-56 1 1
-111 1 1
-220 1 1
-89 1 1
-119 1 1
-113 2 0
-195 1 1
-46 1 1
-184 1 1
-60 0 4
-76 0 4
-53 3 1
-43 1 1
-153 1 1
-53 1 1
-195 6 0
-60 1 1
-278 1 0
-42 1 1
-124 10014 10005
-302 1 1
-24 1 1
-135 20 19
-55 1 1
-40 1 1
-175 1 1
-46 1 1
-52 1 1
-19 1 1
-277 1 1
-88 1 1
-172 1 1
-26 1 1
-129 1 1
-35 1 1
-55 9 9
-318 3 3
-46 1 1
-101 8 8
-4653 1 1
-38 1 1
-817 2 0
-256 1 1
-27 1 1
-339 1 1
-48 1 1
-54 10 10
-1393 3 0
-1491 2 0
-1983 16 0
-167 0 4
-3886 7 8
-535 1 1
-16 1 1
-1555 3 0
-3131 1 1
-17 1 1
-4196 1 0
-14974 0 1
-3514 0 4
-29 1 1
-123 0 2
-51 33 0
-121 0 133
-80 1 10
-26 60 4
-52 13 0
-20 0 2
-19 2 0
-22 4 156
-57 156 3
-61 0 2
-29 20 0
-42 11 0
-21 2 0
-50 4 6
-31 1 3
-23 1 53
-25 0 32
-66 1 55
-11 0 2
-13 0 41
-68 1 42
-23 1 3
-12 2 0
-17 1 29
-51 17 13
-18 2 0
-28 2 0
-26 2 0
-158 1 25
-102 0 82
-99 280 0
-53 21 0
-5064 0 2
-7569 2 0
-2189 0 1
-85 1 1
-31 0 4
-399 14 14
-408 0 1
-681 0 5
-184 1 1
-20 1 1
-64 1 1
-29 1 0
-9 2 0
-442 4 0
-342 1 1
-24 1 1
-131 1 1
-198 1 1
-370 0 1
-34 1 1
-447 21 20
-259 1 1
-23 0 1
-121 2 0
-2257 1 1
-22 1 1
-811 1 1
-27 1 1
-95 18 18
-631 0 5
-843 0 2889
-55 0 88
-1189 0 2
-2274 1 0
-752 4 0
-164 1 1
-55 1 1
-1033 10 10
-683 1 1
-57 1 1
-3578 1 1
-34 1 1
-1446 1 0
-460 1 1
-31 0 1
-6 1 1
-163 1 1
-22 1 1
-81 1 1
-27 1 1
-548 1 1
-61 1 1
-1169 1 1
-41 1 1
-1568 14 14
-4889 1 1
-62 1 1
-530 17 17
-394 1 1
-40 7 0
-57 12 12
-69 2 2
-39 1 1
-70 1 1
-22 0 3
-2307 1 1
-30 1 1
-411 1 1
-104 1 1
-375 26 27
-1218 1 1
-35 1 1
-85 1 1
-20 6 0
-687 1 1
-34 1 1
-268 13 13
-74 1 1
-47 2 0
-69 1 1
-49 1 1
-73 1 1
-48 1 1
-218 1 1
-42 1 1
-197 1 1
-41 1 1
-313 1 1
-40 1 1
-476 1 1
-29 1 1
-185 1 1
-35 1 1
-594 1 1
-24 1 1
-220 26 0
-245 0 1
-261 13 13
-89 1 1
-90 1 1
-224 1 1
-201 1 1
-306 1 1
-29 5 5
-121 1 1
-31 1 1
-109 1 1
-25 1 1
-168 1 1
-19 1 1
-93 12 11
-132 1 0
-113 1 1
-30 1 1
-56 9 9
-300 1 1
-50 2 2
-96 1 1
-43 1 1
-76 1 1
-44 1 1
-197 1 1
-91 7 1
-119 0 9
-392 5 5
-89 1 1
-428 11 11
-260 1 1
-23 1 0
-10 1 1
-70 1 1
-65 2 0
-16 0 19
-28 1 1
-208 1 1
-70 1 1
-149 0 3
-51 29 29
-163 1 1
-55 1 1
-63 17 17
-1208 1 1
-98 1 1
-162 1 1
-45 1 1
-148 14 14
-51 5 5
-209 4 4
-1242 1 1
-42 5 0
-87 1 1
-522 0 3
-305 0 1
-1379 0 2
-390 0 15
-72 1 1
-16 1 1
-270 1 0
-280 7 7
-2763 20 20
-674 10 10
-1375 14 0
-327 2 0
-107 1 1
-629 16 16
-54 4 4
-680 16 16
-395 1 1
-42 1 1
-1763 1 1
-46 1 1
-282 1 1
-39 1 1
-860 1 1
-26 1 1
-745 0 2
-2081 2 0
-817 4 4
-202 1 1
-48 1 1
-168 1 1
-53 1 1
-379 10 10
-1178 14 14
-132 5 0
-555 1 1
-65 1 1
-550 1 1
-21 1 1
-462 1 1
-43 1 1
-121 1 1
-48 0 3
-15 1 5
-1404 0 1
-450 4 0
-626 1 0
-304 1 1
-39 1 1
-564 1 1
-45 1 1
-303 2 0
-409 1 1
-18 1 0
-858 2 0
-2168 0 1
-54 1 1
-20 1 1
-524 0 1
-410 10 10
-106 1 14
-2419 18 14
-64 1 1
-31 1 1
-185 0 5
-1646 1 1
-20 1 1
-227 1 1
-37 1 1
-500 1 0
-136 3 4
-8239 1 1
-23 1 1
-1114 0 2
-688 0 1
-901 18 18
-4781 0 4
-815 0 1
-5069 0 5
-415 0 2
-352 0 1
-1085 11 11
-1099 0 1
-991 0 1
-845 1 1
-32 0 2
-5751 0 3
-1553 1 1
-60 1 1
-278 0 1
-30 1 1
-1855 0 2
-958 0 1
-66 0 16
-2109 0 2
-1265 0 1
-17312 0 4
-1875 0 1
-2157 1 0
-915 0 6
-4940 1 0
-2649 0 1
-3331 2 0
-2276 14 0
-3128 0 4
-3496 1 0
-966 0 1
-3597 1 0
-1647 0 3
-1182 1 0
-654 0 3
-2049 1 0
-6838 1 1
-39 1 1
-186 1 0
-2718 1 1
-30 1 1
-160 11 11
-4954 0 1
-420 1 1
-123 1 1
-156 0 4
-219 4 0
-195 1 0
-4402 2 0
-4295 1 0
-4207 20 20
-468 0 1
-30 1 1
-6025 1 0
-4179 1 0
-19834 0 1
-11605 0 1
-4121 2 0
-2863 0 2
-4890 1 0
-5576 0 6
-4104 4 0
-19858 4 0
-1616 0 3
-1647 4 1
-36 0 12
-2213 0 14
-414 0 1
-458 20 20
-2860 0 3
-678 3 4
-292 2 0
-1922 0 1
-913 0 1
-2720 1 0
-1111 3 0
-2589 0 8
-9425 1 0
-1403 0 2
-1964 0 12
-4433 0 1
-1569 0 1
-7209 1 1
-41 1 1
-2257 1 0
-3001 0 1
-1845 1 0
-1593 0 1
-497 0 2
-6109 0 1
-2019 2 0
-921 0 1
-241 1 0
-5473 1 0
-2213 2 0
-1974 8 0
-4952 0 1
-6146 2 0
-953 1 0
-4141 0 1
-4244 5 0
-152 0 2
-209 0 1
-2400 0 10
-785 2 0
-1733 0 1
-554 1 0
-128 0 2
-3051 0 1
-8577 0 1
-1503 0 1
-1705 0 3
-2052 17 17
-998 177 0
-2804 1 0
-1925 1 0
-9215 0 1
-971 8 0
-36021 1 0
-8016 29 27
-3890 0 1
-67913 1 1
-18 1 6368
-73 1 32739
-14676 1 1
-19 1 1
-22867 1 1
-20 1 1
-5638 5 0
-47 12 0
-11313 0 1
-1769 0 1
-8355 0 3
-4114 0 2
-1403 1 0
-5140 0 1
-490 0 1
-219 1 0
-3483 1 0
-8939 1 1
-44 1 1
-10813 0 2
-7480 2 0
-617 1 0
-1464 0 1
-500 0 2
-1466 1 0
-527 5 0
-3593 0 1
-374 0 1
-2946 22 22
-698 0 1
-2149 1 0
-311 2 0
-6570 1 0
-962 1 0
-23 1 1
-2647 4 0
-588 1 1
-21 1 1
-3256 28 20
-870 0 1
-644 1 0
-602 2 1
-3730 1 1
-45 1 1
-12848 7 7
-7306 0 3
-6647 45 45
-1365 1 1
-63 1 1
-4166 1 0
-1887 10 0
-2949 1 1
-31 0 1
-669 1 0
-2190 2 0
-2081 0 2
-373 0 6
-421 4 4
-1460 0 1
-1699 0 8
-2882 2 0
-147 0 1
-1656 1 1
-27 1 1
-1828 0 2
-4066 35 38
-361 17 17
-1254 6 0
-1643 0 2
-2542 0 1
-848 2 1
-2117 0 2
-119 1 1
-44 1 1
-1104 0 1
-415 0 12
-634 18 1
-377 6 7
-227 6 0
-449 13 13
-895 0 17
-457 18 18
-663 0 3
-382 1 1
-26 1 1
-135 0 1
-105 1 1
-25 1 1
-620 2 0
-290 5 5
-375 1 1
-30 0 4
-98 1 0
-20 17 4
-3824 28 0
-39 4 0
-28 4 0
-44 4 0
-1898 9 9
-221 0 2
-10522 30 0
-783 1 1
-59 1 1
-94 1 1
-21 1 1
-491 1 1
-49 1 1
-289 2 0
-120 0 1
-37 1 1
-112 1 1
-21 1 1
-183 16 16
-73 2 0
-1007 1 1
-38 0 1
-79 1 1
-48 1 1
-561 1 1
-29 1 1
-145 5 5
-576 12 12
-834 1 0
-846 5 7
-34 1 1
-417 10 11
-55 1 1
-40 1 1
-110 1 1
-47 1 1
-351 1 1
-69 1 1
-53 1 1
-91 1 1
-260 1 1
-36 0 1
-604 1 0
-169 0 1
-2118 1 1
-34 1 1
-147 1 1
-213 1 1
-67 1 1
-31 1 1
-566 1 0
-17 1 1
-763 1 1
-34 1 1
-671 5 0
-41 2 2
-98 0 1
-449 0 2
-61 1 1
-38 1 1
-202 1 1
-44 1 1
-190 1 0
-46 4 4
-51 0 4
-476 1 1
-17 1 1
-212 1 1
-26 1 1
-485 1 1
-25 1 1
-263 1 1
-26 1 1
-1327 4 0
-44 1 0
-2397 1 1
-44 1 1
-4146 14 14
-901 0 1
-1769 14 14
-1721 1 0
-1125 1 0
-254 1 0
-427 0 1
-30 1 1
-111 0 2
-52 0 8
-528 44 0
-969 1 1
-10 1 0
-28 1 1
-140 1 1
-43 1 1
-1989 2 1
-598 1 1
-87 0 4
-124 1 0
-4840 1 1
-28 7 4
-505 0 2
-24 1 1
-5134 4 0
-543 1 0
-18 1 1
-97 1 1
-29 1 3
-101 6 0
-148 13 7
-1346 0 1
-128 7 0
-49 0 1
-876 2 0
-286 5 5
-184 0 1
-84 5 5
-365 9 9
-981 1 1
-11 1 1
-734 4 0
-563 4 0
-244 9 9
-379 1 1
-17 1 1
-49 2 0
-95 1 1
-30 1 1
-147 1 1
-37 0 6
-340 1 2
-58 1 1
-332 0 2
-233 6 9
-156 0 1
-26 1 1
-439 4 0
-34 0 2
-508 5 0
-96 1 1
-34 1 1
-1267 63 63
-590 1 1
-24 4 5
-1055 13 13
-135 0 1
-194 1 1
-61 1 1
-384 6 6
-2756 1 1
-19 1 1
-99 15 15
-1754 2 3
-2238 1 1
-31 1 1
-3002 4 0
-2156 15 15
-855 14 13
-442 5 5
-2022 6 6
-506 0 2
-1110 0 1
-2578 0 2
-4864 1 1
-36 1 0
-3187 1 1
-16 1 1
-184 1 1
-18 1 1
-1636 0 7
-23 1 1
-527 1 1
-39 1 1
-653 3 0
-227 1 1
-18 1 1
-102 7 7
-109 0 323
-91 1 0
-124 0 15
-621 0 4
-553 12 12
-463 1 1
-40 1 1
-372 1 1
-25 1 1
-188 12 12
-357 0 1
-250 0 5
-4193 0 4
-967 1 1
-76 1 1
-3236 4 4
-529 7 7
-246 4 0
-160 1 1
-34 0 3
-1469 0 2
-499 1 0
-937 1 1
-45 1 1
-356 71 65
-2127 0 1
-491 1 0
-80 1 1
-72 2 0
-255 6 6
-728 14 11
-702 3 0
-290 0 2
-210 19 1
-473 1 1
-42 4 0
-219 0 1
-348 1 1
-83 1 1
-851 0 16
-72 13 0
-246 1 1
-47 4 0
-410 1 0
-93 0 12
-225 0 16
-428 1 0
-4 6 0
-324 0 1
-3060 0 16
-1305 1 1
-29 1 1
-3094 0 7
-600 0 2
-5495 1 1
-47 1 1
-1247 49 55
-4351 1 1
-15 1 1
-2011 6 14
-8378 2 0
-295 0 17
-4583 1 0
-4132 0 4
-924 4 3
-1751 0 2
-1060 12 12
-380 0 2
-425 8 0
-84 0 1
-244 1 1
-28 1 1
-221 4 0
-348 1 1
-37 11 11
-50 1 1
-180 1 1
-348 1 1
-20 1 1
-1714 1 1
-79 1 1
-729 1 1
-44 1 0
-78 1 1
-112 1 1
-23 1 1
-55 9 9
-1044 1 1
-27 1 1
-494 1 1
-32 1 1
-237 1 1
-27 1 1
-1422 4 4
-413 7 1
-710 8 0
-185 0 2
-966 1 0
-13 15 1
-251 1 1
-47 1 1
-285 1 1
-103 1 1
-977 1 1
-41 1 0
-97 1 1
-131 1 0
-307 1 1
-47 1 1
-1070 1 1
-69 1 1
-382 0 1
-167 1 1
-35 1 1
-161 1 1
-30 1 1
-1068 18 0
-1173 1 1
-32 1 1
-59 1 1
-12 1 0
-18 1 1
-55 0 22
-72 1 1
-2806 1 1
-15 1 1
-1395 1 0
-157 13 0
-536 8 8
-101 1 1
-21 1 1
-147 8 8
-638 1 1
-18 1 1
-183 15 15
-990 0 12
-21 1 1
-145 0 1
-332 1 1
-31 1 1
-231 22 5
-39 1 1
-414 9 9
-93 1 1
-63 1 1
-739 0 2
-632 1 1
-74 1 1
-138 5 5
-128 0 1
-294 1 1
-45 1 1
-679 6 6
-1756 0 34
-560 27 27
-1608 5 0
-219 1 1
-134 0 3
-81 1 1
-82 0 1
-357 1 1
-28 1 1
-670 7 9
-270 0 1
-891 13 33
-257 4 0
-80 0 4
-130 2 0
-2504 42 42
-1226 1 1
-44 1 1
-2256 0 1
-80 12 0
-5544 1 0
-428 13 13
-77 4 4
-63 1 1
-64 13 19
-178 10023 10000
-157 3 3
-109 1 1
-180 1 1
-56 1 1
-169 1 0
-93 1 1
-33 2 2
-72 1 1
-30 1 1
-267 25 25
-65 1 1
-19 2 0
-108 27 27
-218 1 1
-37 1 1
-477 11 11
-93 1 1
-30 7 5
-242 0 1
-171 1 1
-29 1 1
-218 0 9
-241 1 1
-55 4 4
-88 1 1
-99 1 1
-57 0 1
-523 12 16
-399 1 1
-50 1 1
-389 1 1
-71 4 4
-173 12 12
-92 1 1
-20 1 1
-132 0 5
-15 1 1
-75 1 1
-26 5 5
-119 11 11
-542 1 1
-23 2 2
-254 1 1
-34 1 1
-172 1 1
-45 1 1
-95 11 11
-127 23 23
-64 1 1
-95 1 1
-390 1 1
-52 1 1
-170 1 1
-16 5 0
-30 1 1
-599 1 1
-119 1 1
-85 1 1
-75 1 1
-286 4 4
-61 1 1
-286 9 9
-429 1 1
-21 1 1
-53 1 1
-44 1 1
-77 165084 190027
-5156 0 1
-1680 1 1
-88 1 1
-4502 0 1
-46 1 1
-800 4 4
-23 1 1
-1305 2 0
-136 0 1
-4941 0 1
-547 0 1
-70 8 8
-293 1 1
-35 1 1
-1165 4 0
-6662 1 1
-121 1 1
-92 0 8
-214 1 1
-35 1 1
-108 1 0
-1063 0 1
-1017 1 1
-20 0 6
-1725 0 1
-150 5 5
-33 1 0
-12 1 1
-349 1 1
-24 0 1
-1562 1 1
-31 1 1
-2513 0 1
-73 36 36
-305 1 1
-27 1 1
-543 1 1
-47 4 28
-4874 0 3
-599 10 10
-137 1 0
-7 0 4
-54 1 1
-2497 1 1
-166 1 1
-637 3 3
-46 1 1
-74 4 4
-414 1 1
-48 1 1
-75 4 4
-153 0 26
-93 1 1
-39 1 0
-58 1 1
-51 1 1
-145 9 9
-29 1 1
-55 1 1
-427 1 0
-141 1 1
-87 1 1
-20 1 1
-89 3 3
-141 18 5
-48 1 1
-87 14 14
-173 1 1
-68 1 1
-54 1 1
-51 4 0
-22 1 0
-52 1 1
-171 1 1
-109 3 1
-6 0 2
-205 1 1
-54 10064 10083
-76 3 1
-197 15 15
-77 1 1
-70 1 1
-178 1 1
-60 1 1
-210 1 1
-28 1 1
-62 1 1
-33 1 1
-70 0 1
-202 1 1
-60 1 1
-106 2 0
-176 1 1
-79 0 1
-50 1 1
-50 3 3
-207 1 1
-272 5 5
-243 1 1
-84 1 1
-98 1 1
-50 5 5
-77 1 1
-74 1 1
-20 0 1
-143 1 1
-45 0 1
-4 1 1
-1088 1 1
-35 1 1
-320 1 1
-22 1 1
-275 1 1
-47 1 1
-370 19 19
-119 1 6
-51 1 1
-21 1 1
-244 0 1
-345 1 1
-24 1 1
-181 1 1
-61 3 3
-542 1 1
-16 1 1
-312 1 0
-353 4 3
-279 323 0
-86 1 1
-49 1 1
-342 1 1
-44 0 2
-222 1 1
-37 1 1
-588 8 8
-593 47 47
-359 1 1
-25 1 1
-2054 1 0
-2510 1 0
-5040 11 12
-1489 9 9
-3292 1 0
-1449 1 1
-21 1 1
-6768 1 0
-706 2 0
-7107 1 1
-38 1 1
-1163 1 1
-35 1 1
-435 1 1
-60 1 1
-325 0 1
-254 1 1
-43 1 1
-210 1 1
-7 1 0
-47 1 1
-130 4 4
-34 1 1
-208 1 1
-39 2 2
-526 1 1
-36 1 1
-99 9 7
-20 1 1
-73 1 1
-62 1 1
-425 1 1
-43 1 1
-811 1 1
-38 1 1
-362 1 1
-49 1 1
-109 1 1
-19 1 1
-79 1 1
-29 0 1
-26 1 1
-252 1 1
-75 1 1
-441 1 1
-66 1 1
-389 13 13
-67 7 7
-1185 0 311
-64 6 6
-389 31 31
-247 1 1
-38 1 1
-79 1 0
-553 1 1
-30 1 1
-433 1 1
-16 3 0
-1133 12 12
-262 5 5
-276 1 0
-960 14 14
-272 1 1
-41 1 1
-196 1 0
-1424 18 19
-314 1 1
-22 1 1
-345 1 1
-23 3 0
-245 1 1
-78 1 1
-77 1 1
-779 1 1
-32 1 1
-247 1 1
-48 1 1
-778 2 0
-226 1 1
-61 1 1
-867 0 1
-53 1 1
-397 1 1
-12 4 0
-46 1 1
-602 1 1
-35 1 1
-422 1 1
-49 1 1
-789 1 1
-37 1 1
-268 0 2
-589 8 8
-366 12 20
-1651 2 7
-19 1 1
-417 1 1
-37 1 1
-812 1 1
-33 3 0
-1351 18 18
-2186 1 1
-86 1 1
-1433 1 1
-39 1 1
-83 0 1
-238 0 1
-171 1 1
-7 2 1
-67 1 1
-596 1 1
-29 1 1
-144 4 6
-417 1 0
-88 1 1
-24 1 1
-390 18 18
-496 14 21
-145 1 1
-46 1 1
-310 1 1
-35 1 1
-214 1 1
-38 1 1
-206 1 1
-37 1 0
-240 1 1
-32 1 1
-469 1 1
-32 1 1
-208 1 1
-21 1 1
-343 1 1
-17 1 1
-88 1 1
-58 6 0
-169 1 1
-22 1 1
-162 0 1
-196 0 2
-500 6 5
-108 1 1
-40 2 0
-50 1 1
-111 1 0
-21 0 1066
-175 5 5
-155 1 1
-44 1 1
-11005 0 1
-6280 1 1
-48 1 1
-1173 1 1
-19 1 1
-2664 0 1
-351 1 0
-1059 14 14
-593 0 1
-869 16 16
-23065 2 0
-2197 0 1
-949 0 1
-15048 0 1
-606 1 0
-7820 0 4
-14669 1 0
-14708 0 1
-16326 0 1
-304 18 18
-388 2 0
-194 1 1
-49 1 1
-262 0 1
-92 1 1
-10677 2 0
-4856 3 0
-7447 6 6
-421 1 0
-884 6 0
-17 1 0
-3075 1 0
-1610 12 12
-13049 3 1
-3762 2 0
-601 2 0
-2461 0 2
-5154 1 0
-1604 0 16
-3338 26 26
-225 0 1
-1488 1 0
-1196 0 2
-683 0 1
-1218 1 0
-221 1 1
-22 1 1
-296 4 4
-1456 23 41
-880 1 12
-2490 1 0
-151 1 1
-33 1 1
-2809 4 4
-3645 1 1
-17 1 1
-3496 2 0
-154 1 1
-29 1 1
-158 0 1
-5981 1 1
-32 1 1
-1041 0 2
-174 9 0
-1383 0 1
-389 1 2
-1570 2 0
-3993 4 0
-4576 87 87
-142 8 8
-2203 20 24
-2009 1 1
-39 1 1
-489 1 1
-17 1 1
-628 1 1
-124 1 1
-1607 1 1
-23 1 1
-1021 0 8
-1249 0 20
-46 0 32
-46 6 0
-24 0 10
-7679 1 1
-44 1 1
-580 1 1
-28 1 1
-264 1 1
-65 0 1
-15 1 1
-1513 28 28
-830 19 19
-57 1 1
-21 1 1
-231 1 1
-94 1 1
-105 1 1
-208 5 5
-124 1 1
-112 3 3
-207 1 1
-38 1 1
-244 1 1
-60 1 1
-98 1 1
-50 1 1
-256 29 29
-157 1 1
-33 1 1
-143 1 1
-59 1 1
-51 1 1
-45 1 0
-73 1 1
-81 1 1
-270 1 1
-272 1 1
-232 1 1
-94 1 1
-3189 0 176
-834 0 35
-303 0 51
-321 1 0
-17170 0 1
-321 1 1
-25 1 1
-679 1 1
-33 1 1
-990 11 11
-131 8 8
-79 9 9
-1284 9945 10022
-2039 8 23
-491 1 1
-32 1 1
-85 1 1
-41 1 1
-480 1 1
-74 2 2
-1108 59 0
-70 10 10
-325 11 11
-879 1 1
-34 1 1
-524 1 1
-25 1 1
-202 17 17
-1154 1 1
-26 1 1
-89 17 17
-87 1 1
-39 1 1
-950 1 1
-15 2 2
-51 1 1
-81 1 1
-180 1 0
-187 1 1
-37 1 1
-467 1 1
-19 1 1
-755 0 2
-81 3 1
-16 1 1
-67 6 6
-84 1 1
-37 2 0
-31 0 28
-15 0 37
-266 14 14
-372 1 1
-68 1 1
-462 1 1
-46 1 1
-563 19 0
-217 9 9
-363 1 1
-22 1 1
-884 1 1
-40 1 1
-179 1 1
-42 1 1
-94 6 6
-922 1 1
-30 1 1
-481 0 3
-7925 15 11
-333 5 0
-1235 6 6
-355 1 1
-27 1 1
-515 1 0
-1077 11 0
-1521 1 0
-38 1 1
-119 1 1
-58 1 1
-63 4 3
-385 1 1
-49 1 1
-77 44 46
-87 11 11
-190 2 2
-45 1 1
-373 1 1
-47 1 1
-77 10 10
-186 1 1
-24 1 1
-1140 1 0
-214 1 1
-34 1 1
-89 1 1
-36 1 1
-288 0 1
-544 0 331
-320 1 0
-199 1 1
-16 1 1
-112 1 1
-29 1 1
-783 0 3
-311 1 1
-38 1 1
-59 1 1
-68 1 1
-52 1 1
-98 1 1
-166 7 7
-698 1 1
-68 1 1
-165 0 1
-114 1 1
-92 0 1
-14 1 1
-215 1 1
-81 1 1
-792 1 1
-31 1 1
-54 1 1
-44 1 1
-179 1 1
-26 1 1
-200 1 1
-30 1 1
-639 7 7
-505 40 42
-549 12 0
-19 1 1
-2184 1 0
-840 1 1
-69 1 1
-966 21 21
-33 12 0
-56 1 1
-94 1 1
-237 11 9
-189 1 1
-47 1 1
-318 3 0
-80 1 1
-94 5 1
-32 1 1
-126 16 16
-83 1 1
-47 1 1
-104 6 5
-56 1 1
-68 1 1
-417 12 13
-636 0 2
-30 1 1
-694 0 4
-95 1 1
-28 1 1
-1358 1 1
-19 1 1
-68 1 1
-97 1 1
-155 15 15
-323 1 7
-158 2 0
-42 6 0
-59 1 1
-314 14 14
-94 1 1
-64 1 1
-637 1 1
-21 1 1
-144 2 1
-229 11 5
-410 1 1
-96 1 1
-272 1 1
-22 1 1
-118 1 1
-44 1 1
-96 1 1
-48 1 1
-414 22 22
-373 13 13
-554 1 1
-87 10 0
-313 1 1
-37 1 1
-122 17 18
-179 1 1
-40 1 1
-591 8 8
-129 1 0
-70 1 1
-71 1 0
-73 10 6
-12 1 1
-203 0 6
-24 2 0
-45 4 0
-46 1 1
-186 9 9
-87 1 1
-28 1 1
-3625 0 1
-71 1 1
-126 1 1
-34 1 1
-532 0 2
-696 2 0
-555 1 7
-287 1 1
-30 0 3
-946 0 1
-88 1 1
-60 12 0
-12546 1 1
-37 1 0
-2071 0 1
-1253 9 9
-2003 0 1
-24677 0 2
-6212 1 1
-26 1 1
-816 0 4
-13602 18 15
-2375 2 0
-1957 2 0
-2394 6 0
-1561 0 1
-2805 4 0
-12333 8 0
-835 0 1
-426 0 27
-12156 0 18
-6903 2 0
-21807 3 0
-1588 1 0
-2605 1 1
-23 1 1
-11252 8 0
-298 6 7
-946 2 0
-232 0 1
-501 1 0
-4748 0 4
-770 0 7
-914 0 1
-295 1 0
-214 3 0
-121 0 1
-784 0 1
-2512 0 1
-4476 3 0
-926 0 1
-189 2 0
-3543 2 0
-893 1 1
-46 1 1
-1296 0 1
-153 0 1
-336 5 0
-228 1 1
-45 1 1
-207 3 0
-322 0 1
-658 1 0
-1516 3 0
-1025 0 13
-1518 0 1
-591 10 10
-3384 0 2
-182 12 0
-328 1 0
-301 0 1
-994 1 1
-18 0 6
-1743 0 1
-2350 22 23
-1548 0 7
-1976 1 0
-199 0 1
-5922 12 12
-873 0 3
-3080 12 8
-322 1 0
-490 1 0
-3602 1 0
-482 1 0
-3178 1 0
-5157 0 10
-753 0 1
-885 20 0
-1746 10 0
-4045 6 1
-3520 5 13
-2048 0 1
-3529
-
-chain 323865 chr6_cox_hap1 4731698 + 1267152 1270823 chr12 133851895 - 763369 785145 206180
-2772 0 815
-201 0 17291
-643 1 0
-54
-
-chain 65284 chr6_cox_hap1 4731698 + 2460102 2460796 chr6 171115067 - 140105134 140105832 1936071
-178 0 4
-516
-
-chain 59092 chr6_cox_hap1 4731698 + 4004481 4005101 chr4 191154276 + 48364786 48365406 2142970
-620
-
-chain 52987 chr6_cox_hap1 4731698 + 2674042 2675969 chr3 198022430 - 151830192 151832103 2402006
-102 557 556
-77 395 393
-169 221 221
-81 15 15
-81 35 35
-55 44 31
-95
-
-chain 40067 chr6_cox_hap1 4731698 + 3843208 3843655 chr1 249250621 - 189436883 189437330 3283815
-379 3 3
-65
-
-chain 34258 chr6_cox_hap1 4731698 + 2746095 2746514 chrX 155270560 - 17905933 17906346 3956727
-73 15 15
-155 1 1
-20 6 0
-17 1 1
-131
-
-chain 30865 chr6_cox_hap1 4731698 + 3996373 3996892 chr6 171115067 + 32713281 32713770 4500603
-73 89 59
-184 77 77
-96
-
-chain 30808 chr6_cox_hap1 4731698 + 1446736 1447059 chr11 135006516 - 73898390 73898713 4511271
-323
-
-chain 29563 chr6_cox_hap1 4731698 + 4089902 4090211 chr1 249250621 - 75305559 75305868 4853755
-309
-
-chain 29490 chr6_cox_hap1 4731698 + 3888227 3888535 chr20 63025520 - 21266962 21267270 4884719
-308
-
-chain 23990 chr6_cox_hap1 4731698 + 1313393 1314169 chr7 159138663 - 51241795 51242737 7706852
-178 101 101
-72 385 551
-40
-
-chain 19279 chr6_cox_hap1 4731698 + 2759716 2759948 chr5 180915260 + 25289600 25289832 11061062
-91 17 17
-124
-
-chain 18106 chr6_cox_hap1 4731698 + 3844292 3845362 chr7 159138663 + 50640514 50641583 3599691
-33 446 444
-74 250 251
-5 55 55
-48 69 69
-90
-
-chain 17763 chr6_cox_hap1 4731698 + 3840247 3840451 chr6 171115067 - 2083149 2083361 12325354
-52 0 8
-26 2 2
-124
-
-chain 17263 chr6_cox_hap1 4731698 + 3890221 3890428 chr4 191154276 + 3927369 3927573 12785973
-50 3 0
-26 4 4
-124
-
-chain 16283 chr6_cox_hap1 4731698 + 3267732 3267909 chr2 243199373 + 128545205 128545381 580296
-28 2 1
-147
-
-chain 16000 chr6_cox_hap1 4731698 + 3842640 3845155 chr5 180915260 - 144997615 145000132 3598025
-127 1430 1431
-95 205 207
-98 29 29
-57 419 418
-55
-
-chain 15874 chr6_cox_hap1 4731698 + 2744265 2744697 chr6 171115067 + 31304784 31305225 14156555
-58 158 158
-72 76 85
-68
-
-chain 15671 chr6_cox_hap1 4731698 + 1306242 1307477 chr6 171115067 - 139875690 139876935 14366990
-56 408 416
-54 620 622
-97
-
-chain 15351 chr6_cox_hap1 4731698 + 2791400 2791601 chr11 135006516 + 74748600 74748801 14697621
-99 26 26
-76
-
-chain 14920 chr6_cox_hap1 4731698 + 2791114 2791352 chr12 133851895 + 56894984 56895263 15150280
-65 69 110
-104
-
-chain 14203 chr6_cox_hap1 4731698 + 4000567 4000717 chr6 171115067 - 148948255 148948405 15963295
-150
-
-chain 14065 chr6_cox_hap1 4731698 + 3901987 3902139 chr6 171115067 - 138602057 138602209 16122340
-152
-
-chain 13939 chr6_cox_hap1 4731698 + 2790912 2791061 chr15 102531392 - 60147333 60147482 16276423
-149
-
-chain 13590 chr6_cox_hap1 4731698 + 4000399 4000543 chr2 243199373 + 178345068 178345212 16711221
-144
-
-chain 13240 chr6_cox_hap1 4731698 + 3909742 3911000 chr6 171115067 + 32548108 32549235 17164167
-52 422 421
-78 652 522
-54
-
-chain 12556 chr6_cox_hap1 4731698 + 1348680 1348819 chr2 243199373 - 184149574 184149713 18162971
-139
-
-chain 12225 chr6_cox_hap1 4731698 + 3890501 3890631 chr13 115169878 - 44980182 44980312 18662730
-130
-
-chain 12178 chr6_cox_hap1 4731698 + 3972449 3972615 chr14 107349540 - 58393926 58394091 18734378
-55 26 25
-85
-
-chain 12008 chr6_cox_hap1 4731698 + 3896810 3896939 chr8 146364022 + 49154427 49154556 18990652
-129
-
-chain 11746 chr6_cox_hap1 4731698 + 1299553 1299701 chr7 159138663 - 7702899 7703047 19437477
-54 14 14
-80
-
-chain 11718 chr6_cox_hap1 4731698 + 299537 299697 chr13 115169878 + 54026210 54026329 7331663
-62 41 0
-40 13 13
-4
-
-chain 11503 chr6_cox_hap1 4731698 + 3894886 3895312 chr11 135006516 - 111045874 111046295 19852909
-57 287 282
-82
-
-chain 11377 chr6_cox_hap1 4731698 + 3840583 3840825 chr11 135006516 + 57049649 57049891 20071170
-62 107 107
-73
-
-chain 10960 chr6_cox_hap1 4731698 + 3841022 3841165 chr12 133851895 - 49356794 49356937 20822626
-50 15 15
-78
-
-chain 10867 chr6_cox_hap1 4731698 + 2681465 2681622 chr6 171115067 - 132617434 132617597 20998653
-55 29 35
-73
-
-chain 10738 chr6_cox_hap1 4731698 + 3896518 3896639 chr10 135534747 + 59600699 59600817 21255898
-61 3 0
-57
-
-chain 10496 chr6_cox_hap1 4731698 + 3892569 3892679 chr1 249250621 - 174039531 174039641 21744607
-110
-
-chain 10328 chr6_cox_hap1 4731698 + 3840451 3840892 chr4 191154276 - 114078209 114078650 18698120
-15 372 372
-54
-
-chain 9881 chr6_cox_hap1 4731698 + 2734004 2734554 chr6 171115067 + 31205448 31206008 23100546
-72 423 433
-55
-
-chain 9755 chr6_cox_hap1 4731698 + 4021493 4021793 chr6 171115067 + 162490109 162490409 23390927
-65 181 181
-54
-
-chain 9560 chr6_cox_hap1 4731698 + 1301303 1301404 chr6 171115067 - 141323187 141323288 23857061
-101
-
-chain 9455 chr6_cox_hap1 4731698 + 3891953 3892158 chr6 171115067 + 32468923 32469135 24116909
-54 91 98
-60
-
-chain 9090 chr6_cox_hap1 4731698 + 2680711 2680821 chr3 198022430 - 94212956 94213066 24807216
-53 4 4
-53
-
-chain 7297 chr6_cox_hap1 4731698 + 3844000 3844124 chr8 146364022 + 96809146 96809270 3974525
-124
-
-chain 7162 chr6_cox_hap1 4731698 + 2675969 2676329 chr17 81195210 - 22005566 22005927 2836104
-7 302 303
-51
-
-chain 7031 chr6_cox_hap1 4731698 + 2673410 2673921 chr5 180915260 + 106108094 106108601 3265511
-58 376 372
-77
-
-chain 6840 chr6_cox_hap1 4731698 + 3971466 3971538 chr11 135006516 + 40011829 40011901 28544257
-72
-
-chain 6473 chr6_cox_hap1 4731698 + 3890669 3890742 chr1 249250621 - 102907635 102907704 21815173
-11 4 0
-58
-
-chain 6422 chr6_cox_hap1 4731698 + 4013834 4013902 chr6 171115067 + 32728707 32728775 29535230
-68
-
-chain 5921 chr6_cox_hap1 4731698 + 2681183 2681245 chr4 191154276 - 94306644 94306706 30842389
-62
-
-chain 5676 chr6_cox_hap1 4731698 + 2671999 2672059 chr3 198022430 + 95260601 95260661 31509897
-60
-
-chain 5595 chr6_cox_hap1 4731698 + 3972615 3972674 chr14 107349540 - 80191032 80191091 27115653
-59
-
-chain 5576 chr6_cox_hap1 4731698 + 1302171 1302230 chr18 78077248 - 3698437 3698496 31796878
-59
-
-chain 5517 chr6_cox_hap1 4731698 + 3842389 3842453 chr20 63025520 - 5368566 5368630 20848663
-64
-
-chain 5458 chr6_cox_hap1 4731698 + 3985007 3985065 chr2 243199373 + 112827415 112827473 32167738
-58
-
-chain 5421 chr6_cox_hap1 4731698 + 2677334 2677391 chr19 59128983 - 38462903 38462960 32247802
-57
-
-chain 5403 chr6_cox_hap1 4731698 + 3897499 3897556 chr12 133851895 + 59864980 59865037 32286341
-57
-
-chain 5339 chr6_cox_hap1 4731698 + 4081817 4081873 chr17 81195210 + 16805661 16805717 32499905
-56
-
-chain 5266 chr6_cox_hap1 4731698 + 4021149 4021204 chr3 198022430 + 6923000 6923055 32744278
-55
-
-chain 5103 chr6_cox_hap1 4731698 + 2743431 2743485 chr3 198022430 + 27241143 27241197 33231446
-54
-
-chain 5094 chr6_cox_hap1 4731698 + 3984745 3984799 chr6 171115067 + 67966752 67966806 33279729
-54
-
-chain 5089 chr6_cox_hap1 4731698 + 2674314 2675775 chr1 249250621 + 7474130 7475590 2473669
-98 975 974
-58 295 295
-35
-
-chain 5076 chr6_cox_hap1 4731698 + 1300901 1300955 chr11 135006516 + 101518151 101518205 33343005
-54
-
-chain 5067 chr6_cox_hap1 4731698 + 2741303 2741357 chr19 59128983 - 37393851 37393905 33368570
-54
-
-chain 5058 chr6_cox_hap1 4731698 + 3967166 3967220 chr1 249250621 - 172942963 172943017 33379585
-54
-
-chain 5020 chr6_cox_hap1 4731698 + 1345886 1345938 chr6 171115067 + 29692684 29692736 33527644
-52
-
-chain 4959 chr6_cox_hap1 4731698 + 3892516 3892569 chr18 78077248 + 5090594 5090647 22176918
-53
-
-chain 4957 chr6_cox_hap1 4731698 + 2678048 2678100 chr9 141213431 - 31846047 31846099 33735026
-52
-
-chain 4957 chr6_cox_hap1 4731698 + 3946024 3946076 chr6 171115067 + 32439356 32439408 33735182
-52
-
-chain 4930 chr6_cox_hap1 4731698 + 3894496 3894548 chrX 155270560 - 4541772 4541824 33815607
-52
-
-chain 4914 chr6_cox_hap1 4731698 + 2673741 2673793 chrX 155270560 + 7935883 7935935 17711968
-52
-
-chain 4885 chr6_cox_hap1 4731698 + 2740950 2741002 chr5 180915260 - 163072859 163072911 33995114
-52
-
-chain 4884 chr6_cox_hap1 4731698 + 2760326 2760379 chr7 159138663 + 8699184 8699237 23141527
-53
-
-chain 4821 chr6_cox_hap1 4731698 + 3935381 3935432 chr6 171115067 - 11031703 11031754 34213824
-51
-
-chain 4685 chr6_cox_hap1 4731698 + 3915703 3915753 chr12 133851895 + 112261417 112261467 34690968
-50
-
-chain 4613 chr6_cox_hap1 4731698 + 2844682 2846505 chr13 115169878 - 41386504 41386960 3856143
-33 479 279
-7 46 0
-24 11 0
-33 1097 0
-24 13 0
-56
-
-chain 4221 chr6_cox_hap1 4731698 + 2437589 2437671 chr14 107349540 + 75461679 75461839 4623812
-28 0 78
-54
-
-chain 4202 chr6_cox_hap1 4731698 + 2673968 2674023 chr3 198022430 + 156309398 156309453 19139889
-55
-
-chain 4186 chr6_cox_hap1 4731698 + 3955813 3955860 chr5 180915260 - 113986983 113987030 34971958
-47
-
-chain 4136 chr6_cox_hap1 4731698 + 2672610 2672662 chr13 115169878 + 42049101 42049153 23521137
-52
-
-chain 3978 chr6_cox_hap1 4731698 + 2673481 2673609 chrX 155270560 - 130914483 130914611 4485241
-128
-
-chain 3891 chr6_cox_hap1 4731698 + 2760039 2760115 chr16 90354753 - 58442153 58442229 17002345
-76
-
-chain 3877 chr6_cox_hap1 4731698 + 2672485 2672526 chr15 102531392 + 40275232 40275273 21164310
-41
-
-chain 3776 chr6_cox_hap1 4731698 + 2759549 2759589 chr1 249250621 - 143888892 143888932 33598889
-40
-
-chain 3639 chr6_cox_hap1 4731698 + 3890631 3890669 chr3 198022430 + 101411146 101411184 20382394
-38
-
-chain 3574 chr6_cox_hap1 4731698 + 2673146 2673184 chr3 198022430 - 173409162 173409200 29596627
-38
-
-chain 3573 chr6_cox_hap1 4731698 + 2790788 2791088 chr16 90354753 + 31183111 31183406 18086604
-58 215 210
-27
-
-chain 3489 chr6_cox_hap1 4731698 + 3842885 3842952 chrX 155270560 - 48144545 48144612 19043441
-67
-
-chain 3394 chr6_cox_hap1 4731698 + 3896482 3896518 chrX 155270560 - 4545757 4545793 28280414
-36
-
-chain 3393 chr6_cox_hap1 4731698 + 3840688 3840752 chr8 146364022 + 7016797 7016861 21522443
-64
-
-chain 3345 chr6_cox_hap1 4731698 + 1313572 1313633 chrX 155270560 - 101738888 101738949 11083842
-61
-
-chain 3209 chr6_cox_hap1 4731698 + 3842526 3842560 chr4 191154276 + 80147803 80147837 32673071
-34
-
-chain 3189 chr6_cox_hap1 4731698 + 2790872 2790912 chr11 135006516 - 131957088 131957128 22905486
-40
-
-chain 3053 chr6_cox_hap1 4731698 + 4021558 4021590 chr2 243199373 + 38182694 38182726 24706669
-32
-
-chain 3045 chr6_cox_hap1 4731698 + 2677533 2677565 chr11 135006516 - 20509488 20509520 33762261
-32
-
-chain 3033 chr6_cox_hap1 4731698 + 3842991 3843062 chr1 249250621 - 90164672 90164743 11203780
-71
-
-chain 2997 chr6_cox_hap1 4731698 + 2759644 2759694 chr16 90354753 + 47212776 47212826 11278440
-50
-
-chain 2984 chr6_cox_hap1 4731698 + 3842575 3842625 chrX 155270560 + 76422698 76422748 20248077
-50
-
-chain 2960 chr6_cox_hap1 4731698 + 3896779 3896810 chr21 48129895 + 18677639 18677670 32477029
-31
-
-chain 2845 chr6_cox_hap1 4731698 + 2673184 2673214 chr3 198022430 - 156603737 156603767 26791325
-30
-
-chain 2761 chr6_cox_hap1 4731698 + 3844406 3844465 chr6 171115067 + 18547856 18547915 4276868
-59
-
-chain 2745 chr6_cox_hap1 4731698 + 3842326 3844197 chr11 135006516 - 48638733 48640605 3968835
-61 675 676
-53 1015 1015
-67
-
-chain 2739 chr6_cox_hap1 4731698 + 2673924 2673968 chr8 146364022 + 90457478 90457522 20607564
-44
-
-chain 2729 chr6_cox_hap1 4731698 + 1302230 1302259 chr14 107349540 + 79349511 79349540 33029767
-29
-
-chain 2723 chr6_cox_hap1 4731698 + 2673793 2673825 chr5 180915260 - 70673106 70673138 18877917
-32
-
-chain 2561 chr6_cox_hap1 4731698 + 299599 299640 chr6 171115067 + 20244702 20244743 12574490
-41
-
-chain 2518 chr6_cox_hap1 4731698 + 4021649 4021704 chr16 90354753 - 20685134 20685189 24272036
-55
-
-chain 2470 chr6_cox_hap1 4731698 + 2745980 2746030 chr1 249250621 + 111776293 111776343 7607561
-50
-
-chain 2373 chr6_cox_hap1 4731698 + 2760156 2760181 chr17 81195210 - 66761411 66761436 17362234
-25
-
-chain 2319 chr6_cox_hap1 4731698 + 2900811 2900837 chr6 171115067 + 31357660 31357686 3303778
-26
-
-chain 2312 chr6_cox_hap1 4731698 + 2759490 2759549 chr4 191154276 + 98204882 98204941 18366184
-59
-
-chain 2209 chr6_cox_hap1 4731698 + 3843799 3843896 chr12 133851895 + 60159606 60159703 5400255
-97
-
-chain 2146 chr6_cox_hap1 4731698 + 1299766 1299827 chr12 133851895 + 105697047 105697108 23835468
-61
-
-chain 2140 chr6_cox_hap1 4731698 + 3840491 3840558 chr6 171115067 - 96829007 96829074 20827044
-67
-
-chain 2000 chr6_cox_hap1 4731698 + 1313744 1313777 chr4 191154276 + 153686345 153686378 8134925
-33
-
-chain 1995 chr6_cox_hap1 4731698 + 3842817 3842864 chr4 191154276 - 47817470 47817517 17212566
-47
-
-chain 1991 chr6_cox_hap1 4731698 + 2845315 2845345 chr4 191154276 - 30046978 30047008 15284842
-30
-
-chain 1990 chr6_cox_hap1 4731698 + 4008195 4011710 chr6 171115067 + 32722816 32726965 28700009
-61 2506 2690
-85 515 965
-52 103 103
-193
-
-chain 1943 chr6_cox_hap1 4731698 + 3844851 3845272 chr11 135006516 + 83226111 83226530 3906185
-58 323 321
-40
-
-chain 1927 chr6_cox_hap1 4731698 + 2759609 2759644 chr7 159138663 - 110094552 110094587 24531071
-35
-
-chain 1727 chr6_cox_hap1 4731698 + 2674522 2674583 chr20 63025520 - 53185733 53185794 4777998
-61
-
-chain 1671 chr6_cox_hap1 4731698 + 3843897 3843947 chr9 141213431 + 78317603 78317653 4355881
-50
-
-chain 1637 chr6_cox_hap1 4731698 + 2760272 2760326 chr2 243199373 + 119859185 119859239 11695157
-54
-
-chain 1632 chr6_cox_hap1 4731698 + 2673214 2673313 chr4 191154276 - 69486891 69486990 2834158
-99
-
-chain 1628 chr6_cox_hap1 4731698 + 3842952 3842991 chr2 243199373 - 116273698 116273737 14990340
-39
-
-chain 1584 chr6_cox_hap1 4731698 + 1313851 1313915 chr1 249250621 - 24961912 24961976 17607390
-64
-
-chain 1548 chr6_cox_hap1 4731698 + 2672923 2673038 chr2 243199373 - 193655574 193655689 3516324
-115
-
-chain 1509 chr6_cox_hap1 4731698 + 2674838 2674895 chr5 180915260 + 165569524 165569581 2491813
-57
-
-chain 1508 chr6_cox_hap1 4731698 + 2675985 2676708 chr6 171115067 - 141365359 141366083 3289535
-50 615 616
-58
-
-chain 1507 chr6_cox_hap1 4731698 + 2673661 2673741 chr4 191154276 + 138835824 138835904 16168846
-80
-
-chain 1489 chr6_cox_hap1 4731698 + 2845209 2846585 chrX 155270560 - 102215688 102216455 6549884
-27 1297 452
-2 0 236
-50
-
-chain 1467 chr6_cox_hap1 4731698 + 2760221 2760272 chr7 159138663 + 122232756 122232807 13147168
-51
-
-chain 1456 chr6_cox_hap1 4731698 + 3844931 3844983 chr14 107349540 + 48881293 48881345 9320615
-52
-
-chain 1452 chr6_cox_hap1 4731698 + 2673321 2674838 chrX 155270560 - 1098426 1099942 3000529
-51 1428 1427
-38
-
-chain 1354 chr6_cox_hap1 4731698 + 1313967 1314021 chr4 191154276 + 544307 544361 14282164
-54
-
-chain 1310 chr6_cox_hap1 4731698 + 3843714 3843782 chrX 155270560 + 17249549 17249617 3972308
-68
-
-chain 1307 chr6_cox_hap1 4731698 + 1498573 1498607 chr5 180915260 - 156542608 156542642 2089959
-34
-
-chain 1294 chr6_cox_hap1 4731698 + 2760418 2760473 chr4 191154276 + 147516497 147516552 12285122
-55
-
-chain 1278 chr6_cox_hap1 4731698 + 3845015 3845082 chr15 102531392 + 92125438 92125505 4023305
-67
-
-chain 1247 chr6_cox_hap1 4731698 + 3844702 3844748 chr2 243199373 - 7511493 7511539 13743690
-46
-
-chain 1194 chr6_cox_hap1 4731698 + 2676043 2676103 chr1 249250621 + 94380187 94380247 20995710
-60
-
-chain 1160 chr6_cox_hap1 4731698 + 2676209 2676237 chrX 155270560 + 56836392 56836420 21177535
-28
-
-chain 1125 chr6_cox_hap1 4731698 + 3890818 3890886 chr8 146364022 - 86779351 86779419 20749389
-68
-
-chain 1106 chr6_cox_hap1 4731698 + 2760181 2760221 chr9 141213431 + 74027839 74027879 13331514
-40
-
-chain 1039 chr6_cox_hap1 4731698 + 2674441 2674507 chr3 198022430 - 71498815 71498881 4421669
-66
-
-chain 1033 chr6_cox_hap1 4731698 + 2676372 2676431 chr5 180915260 - 20894072 20894131 3124143
-59
-
-chain 1014 chr6_cox_hap1 4731698 + 2759961 2759990 chr10 135534747 + 69125589 69125618 23828230
-29
-
-chain 1005 chr6_cox_hap1 4731698 + 2760005 2760039 chr10 135534747 + 5299750 5299784 23898321
-34
-
-chain 982 chr6_cox_hap1 4731698 + 2759426 2759479 chr13 115169878 + 111326976 111327029 14386536
-53
-
-chain 977 chr6_cox_hap1 4731698 + 3845410 3845467 chrX 155270560 - 144584413 144584470 4043690
-57
-
-chain 963 chr6_cox_hap1 4731698 + 2674253 2676589 chr9 141213431 - 119032541 119034846 4479982
-47 2231 2200
-58
-
-chain 919 chr6_cox_hap1 4731698 + 2677255 2677315 chr4 191154276 + 45112377 45112437 22402156
-60
-
-chain 883 chr6_cox_hap1 4731698 + 3843656 3843714 chr18 78077248 + 28929278 28929336 6530663
-58
-
-chain 881 chr6_cox_hap1 4731698 + 2675038 2675098 chr5 180915260 - 79225133 79225193 14536118
-60
-
-chain 858 chr6_cox_hap1 4731698 + 2676338 2676372 chr7 159138663 - 148564023 148564057 6699557
-34
-
-chain 857 chr6_cox_hap1 4731698 + 2676103 2677646 chr4 191154276 + 171430336 171431860 18546235
-50 1412 1393
-81
-
-chain 838 chr6_cox_hap1 4731698 + 3843947 3843980 chr18 78077248 - 28720814 28720847 7914761
-33
-
-chain 819 chr6_cox_hap1 4731698 + 2673062 2673118 chr2 243199373 + 149156283 149156339 14209631
-56
-
-chain 796 chr6_cox_hap1 4731698 + 1314021 1314060 chrX 155270560 - 10752795 10752834 16687246
-39
-
-chain 747 chr6_cox_hap1 4731698 + 1314275 1314339 chr12 133851895 + 57178267 57178331 20664563
-64
-
-chain 731 chr6_cox_hap1 4731698 + 1638596 1638636 chr15 102531392 + 55738847 55738887 18753864
-40
-
-chain 704 chr6_cox_hap1 4731698 + 3842767 3842817 chr9 141213431 + 32212289 32212339 4117535
-50
-
-chain 701 chr6_cox_hap1 4731698 + 2674653 2674701 chr16 90354753 - 23821388 23821436 3556080
-48
-
-chain 679 chr6_cox_hap1 4731698 + 1313640 1313672 chr21 48129895 - 2887431 2887463 13569070
-32
-
-chain 672 chr6_cox_hap1 4731698 + 3844325 3844357 chr10 135534747 - 103351577 103351609 5595826
-32
-
-chain 661 chr6_cox_hap1 4731698 + 2676159 2676209 chr9 141213431 + 85388422 85388472 5334226
-50
-
-chain 661 chr6_cox_hap1 4731698 + 3844987 3845015 chr2 243199373 + 98215178 98215206 5611311
-28
-
-chain 650 chr6_cox_hap1 4731698 + 2672375 2672435 chr7 159138663 - 140047518 140047578 22707410
-60
-
-chain 643 chr6_cox_hap1 4731698 + 2677085 2677144 chr6 171115067 + 74793831 74793890 5895430
-59
-
-chain 604 chr6_cox_hap1 4731698 + 1314169 1314195 chrX 155270560 - 101522169 101522195 11588450
-26
-
-chain 595 chr6_cox_hap1 4731698 + 2675343 2675387 chr12 133851895 - 110550302 110550346 3606052
-44
-
-chain 571 chr6_cox_hap1 4731698 + 2672827 2672901 chr3 198022430 + 50956018 50956092 15278850
-74
-
-chain 525 chr6_cox_hap1 4731698 + 3902955 3903021 chr6 171115067 + 32474022 32474088 26162225
-66
-
-chain 485 chr6_cox_hap1 4731698 + 2671938 2671998 chr1 249250621 - 193322919 193322979 8312425
-60
-
-chain 412 chr6_cox_hap1 4731698 + 2672740 2672827 chr8 146364022 - 113140827 113140914 13566503
-87
-
-chain 395 chr6_cox_hap1 4731698 + 2846505 2846533 chrX 155270560 - 102216470 102216498 6380381
-28
-
-chain 395 chr6_cox_hap1 4731698 + 2675098 2675125 chr12 133851895 + 9999203 9999230 23891782
-27
-
-chain 347 chr6_cox_hap1 4731698 + 2671704 2671754 chr15 102531392 - 65978487 65978537 12839282
-50
-
-chain 251 chr6_cox_hap1 4731698 + 2671761 2671812 chr9 141213431 + 17677697 17677748 27279073
-51
-
-chain 184 chr6_cox_hap1 4731698 + 2672526 2672587 chrX 155270560 - 91681431 91681492 16167874
-61
-
-chain 369716150 chr6_qbl_hap2 4565931 + 0 4565931 chr6 171115067 + 28742641 33379750 32
-2350 0 1
-1750 0 2
-3815 1 0
-9743 0 2
-3960 0 4
-2109 0 2
-33 2 0
-9000 0 2
-16647 0 2
-38786 1 0
-80529 0 1
-14475 0 1
-6819 1 0
-6845 1 3
-6188 0 1
-6397 0 1
-345 1 0
-68374 2 0
-39133 39 39
-7774 7 0
-1489 1 1
-72 1 1
-2260 0 2
-10629 0 1
-1249 1 1
-195 1 1
-18132 0 1
-1324 0 2
-5438 5 0
-2061 1 0
-3982 6 6
-1725 0 1
-3153 1 0
-18 1 0
-18 1 0
-2026 1 0
-4175 10 10
-4235 18 18
-493 9 9
-4767 7 7
-1225 1 0
-8 1 1
-151 1 2
-5079 1 1
-28 1 1
-281 11 11
-1178 0 4
-685 8 0
-48 4 0
-1701 1 1
-43 5 5
-862 18 18
-58 1 1
-66 1 1
-420 1 1
-44 1 1
-680 4 4
-1675 1 1
-83 1 1
-3082 4 0
-5467 1 1
-27 0 1
-1099 16 0
-627 51 51
-1278 6 1
-129 1 1
-25 1 1
-1397 15 15
-810 1 1
-27 1 1
-1192 2 0
-7515 4 0
-979 0 3
-3406 0 2
-2340 1 1
-20 1 1
-1139 1 1
-26 1 1
-787 0 1
-1416 3 1
-22815 4 4
-126 1 0
-38 1 1
-140 1 0
-999 0 17
-56 0 15
-11759 161391 161513
-11155 0 2
-5376 0 1
-19253 1 0
-4212 1 1
-3671 1 0
-21 0 6
-4451 1 0
-27910 1 0
-9946 0 1
-11233 1 1
-32 1 1
-2238 1 1
-20 1 1
-3659 22 16
-1218 1 0
-1638 6 6
-228 1 1
-45 1 1
-2048 0 3
-461 1 0
-20759 1 0
-3778 2 1
-1268 1 0
-1511 1 1
-42 2 0
-24 1 1
-4119 22 0
-1757 1 0
-1527 1 1
-29 1 1
-1886 1 0
-10628 12 0
-46568 1 0
-18985 0 10
-1825 3 4
-5288 0 9
-1071 50 50
-1607 1 5
-722 0 1
-502 0 1
-1025 0 1
-134 14 0
-4944 0 1
-319 1 0
-6178 0 1
-2898 0 2
-143 0 1
-1775 1 0
-2123 0 1
-2715 1 0
-4901 70 66
-2884 1 0
-1362 1 0
-1233 0 8
-2134 0 1
-1042 0 1
-163 1 1
-45 1 1
-50 2 0
-64 1 1
-48 1 1
-380 0 1
-30 1 0
-30 1 1
-61 1 1
-22 1 1
-368 4 4
-319 5 7
-310 1 1
-37 3 1
-162 1 1
-194 2 0
-36 1 1
-242 9 9
-1932 1 1
-16 1 1
-528 1 1
-20 1 1
-509 0 5
-76 1 1
-21 1 1
-439 15 15
-2779 1 0
-1597 24 28
-59 12 12
-307 1 0
-516 1 0
-286 11 33
-339 5 0
-570 1 1
-37 1 1
-220 1 0
-72 1 1
-144 1 1
-48 1 1
-247 2 0
-174 9 10
-816 1 0
-940 1 1
-45 1 1
-91 3 3
-71 1 1
-291 14 14
-100 1 1
-23 1 1
-452 3 3
-85 1 1
-65 1 1
-77 1 1
-252 0 1
-129 15 15
-432 10 0
-85 1 1
-28 1 1
-189 2 1
-71 1 1
-52 8 0
-810 2 2
-63 1 1
-378 1 1
-26 1 1
-187 31 36
-966 1 1
-25 1 1
-91 12 12
-125 1 1
-38 1 1
-433 2 0
-596 1 1
-48 1 1
-465 4 4
-64 1 1
-20 1 1
-525 5 5
-237 3 8
-183 11 0
-364 4 3
-201 1 1
-42 1 1
-56 1 1
-115 1 0
-67 16 16
-244 1 1
-54 5 5
-929 1 1
-21 1 1
-126 0 3
-830 1 11
-59 1 1
-537 0 2
-24 1 1
-745 15 15
-810 1 0
-425 1 1
-89 1 1
-592 1 1
-49 1 1
-352 0 1
-142 1 1
-30 1 1
-95 1 1
-45 1 1
-227 1 1
-53 1 1
-130 1 1
-18 1 1
-138 1 1
-90 1 1
-129 41 41
-50 1 1
-79 1 1
-117 1 1
-31 1 1
-155 155 0
-34 1 1
-50 5 5
-57 1 1
-152 1 1
-30 1 1
-177 5 5
-345 1 1
-39 1 1
-504 18 18
-596 12 12
-54 1 1
-158 1 1
-164 1 1
-34 1 1
-626 15 15
-866 0 10
-1051 0 2611
-680 0 1
-1537 0 18
-75 1 0
-147 52 1
-119 0 12
-23 1 1
-1927 13 13
-1702 2 0
-3694 1 1
-18 1 1
-958 43 47
-246 2 0
-146 1 1
-49 1 1
-410 1 0
-667 1 1
-38 1 1
-362 7 1
-159 2 0
-515 2 0
-1026 1 1
-29 1 1
-249 0 6
-129 1 1
-33 4 0
-10 1 5
-1236 1 1
-20 1 1
-138 10 9
-448 0 3
-660 1 1
-28 1 1
-83 1 1
-51 1 1
-2659 1 1
-38 1 1
-424 0 1
-70 1 1
-820 1 1
-26 1 1
-1472 1 1
-21 1 1
-491 5 5
-2372 2 0
-533 6 0
-441 1 7
-1689 1 1
-26 3 4
-879 16 16
-514 0 2
-58 1 1
-350 1 0
-769 1 1
-39 1 1
-429 10 10
-134 0 4
-37 1 1
-144 8 8
-668 1 1
-22 1 1
-344 2 0
-262 2 2
-38 0 1
-70 18 18
-84 11 13
-198 0 1
-32 1 1
-74 11 15
-1255 0 2
-332 1 1
-21 1 1
-193 8 24
-34 1 1
-79 1 1
-29 1 1
-536 1 0
-308 0 1
-850 0 32
-23 1 1
-651 1 1
-22 0 3
-136 1 1
-48 1 1
-330 9 9
-1108 1 1
-98 1 1
-582 0 2
-713 7 7
-89 1 0
-293 9 8
-125 1 1
-31 1 1
-192 6 6
-171 17 17
-681 1 1
-43 1 1
-514 1 1
-68 1 1
-537 1 1
-35 1 1
-159 6 6
-778 2 2
-44 1 1
-168 0 7
-211 1 1
-42 1 1
-1253 1 1
-29 1 1
-320 1 1
-36 2 2
-55 1 2
-108 1 1
-33 1 1
-317 1 1
-35 1 1
-553 8 8
-386 1 1
-26 1 1
-540 1 1
-31 1 1
-65 0 1
-625 12 12
-313 0 1
-52 1 1
-22 1 1
-583 1 1
-49 1 1
-678 37 37
-784 3 0
-838 1 1
-19 12 0
-1129 1 1
-36 1 1
-553 8 8
-109 1 1
-45 1 1
-841 16 15
-157 1 1
-31 2 2
-204 18 19
-487 1 1
-29 1 1
-374 1 1
-67 1 1
-720 13 13
-266 10 10
-330 16 14
-413 1 1
-44 1 1
-78 6 6
-181 2 2
-36 1 1
-397 1 1
-20 1 1
-311 1 1
-48 2 2
-1298 11 11
-186 1 1
-33 1 1
-216 4 4
-35 1 1
-194 10 10
-310 1 1
-51 1 1
-136 1 1
-49 1 1
-521 1 1
-23 1 1
-242 1 1
-49 1 1
-600 1 1
-31 1 1
-413 15 15
-290 1 1
-49 1 1
-527 17 17
-340 12 11
-1025 1 0
-2572 1 1
-29 1 1
-397 2 5
-668 13 13
-541 1 1
-59 0 2
-6 1 1
-122 14 14
-51 1 1
-46 1 1
-72 5 5
-110 1 1
-76 1 1
-164 0 21
-136 1 1
-12 1 1
-66 16 16
-456 37 34
-371 7 7
-48 1 1
-194 10 10
-108 1 1
-60 1 1
-122 0 1
-48 1 1
-238 1 1
-32 0 1
-100 1 0
-72 1 0
-390 1 1
-38 1 1
-144 1 1
-27 0 4
-184 21 228
-49 1 1
-608 0 1
-152 1 1
-31 1 1
-281 8 8
-337 1 1
-45 1 1
-222 1 1
-54 1 1
-346 1 0
-44 1 1
-368 1 1
-72 1 1
-502 36 18
-63 1 1
-43 0 4
-136 1 1
-42 1 1
-80 4 4
-35 1 0
-89 1 1
-24 0 5
-829 13 13
-73 1 1
-28 14 0
-233 1 1
-42 0 3
-85 0 1
-400 1 1
-40 1 1
-538 25 25
-174 1 1
-20 1 1
-705 1 1
-26 2 2
-614 1 1
-44 1 1
-793 1 1
-16 1 1
-747 5 5
-804 1 1
-29 1 1
-166 1 1
-43 1 1
-233 1 1
-44 1 1
-507 0 3
-110 8 8
-133 1 1
-31 1 1
-165 1 1
-29 1 1
-1249 1 1
-26 4 0
-56 1 1
-67 1 1
-716 1 1
-46 0 1
-16 1 1
-174 1 1
-96 1 1
-141 1 1
-39 0 4
-263 1 1
-18 1 1
-259 4 4
-38 1 1
-104 1 1
-40 1 0
-248 1 1
-18 1 1
-238 1 1
-32 1 1
-70 0 2
-16 1 1
-818 1 1
-22 4 4
-492 4 4
-1145 1 1
-46 1 1
-53 1 0
-38 1 1
-373 1 1
-60 1 1
-1149 0 1
-20 1 1
-1294 1 1
-41 1 1
-316 4 4
-42 1 1
-218 12 12
-363 1 1
-24 1 1
-457 10 10
-414 13 13
-825 1 1
-41 1 1
-492 0 4
-1374 1 1
-18 1 1
-808 2 2
-335 6 4
-880 1 1
-35 1 1
-236 1 1
-67 1 1
-298 0 1
-147 4 4
-322 11 11
-613 1 1
-62 1 1
-340 1 1
-22 1 1
-1057 1 1
-57 1 1
-358 1 1
-128 1 1
-146 10 10
-490 1 1
-20 1 1
-62 1 1
-88 1 1
-293 1 1
-28 1 0
-20 1 1
-83 0 1
-90 1 1
-312 1 1
-44 1 1
-1213 1 1
-51 1 1
-467 1 1
-39 1 1
-122 14 0
-35 1 1
-485 14 14
-110 12 0
-127 1 1
-5450 0 5
-1699 9 9
-3278 0 2
-28 1 1
-2211 2 0
-521 1 1
-18 1 1
-784 18 18
-1603 0 248
-4769 47 47
-4486 4 4
-103 0 2
-88 1 1
-95 1 1
-2174 1 1
-22 0 1
-1244 7 7
-922 2 0
-1507 1 1
-44 1 1
-208 6 1
-1946 2 2
-85 0 1
-133 1 1
-666 1 0
-52 1 1
-29 1 1
-148 0 5
-30 1 1
-790 14 14
-52 1 1
-32 1 1
-121 1 1
-37 1 1
-396 3 2
-324 1 1
-152 1 1
-71 4 4
-27 1 1
-115 1 1
-101 1 1
-423 10 10
-294 1 1
-101 1 0
-4 0 1
-174 1 1
-146 1 1
-103 1 1
-134 1 1
-16 1 1
-378 1 1
-85 1 1
-134 1 1
-25 1 1
-54 3 3
-55 1 1
-67 1 1
-22 1 1
-54 13 13
-55 11 11
-120 1 1
-23 1 1
-51 1 1
-22 1 1
-364 1 1
-278 1 1
-354 34448 40149
-311 1 1
-33 1 2
-26 6 6
-474 1 1
-36 1 1
-151 1 1
-29 1 1
-120 1 1
-23 1 1
-865 1 1
-39 1 1
-553 1 1
-69 1 1
-116 1 0
-1618 9 9
-820 11 11
-173 0 8
-405 9 9
-196 1 1
-26 1 1
-173 1 1
-27 5 1
-42 1 1
-676 17 19
-77 1 3
-65 16 16
-69 1 0
-277 1 1
-44 1 1
-72 0 3
-70 1 1
-54 1 1
-240 1 0
-31 1 1
-1192 18 19
-454 28 28
-373 1 1
-46 1 1
-1565 1 1
-53 2 2
-543 1 1
-38 1 1
-985 1 1
-27 0 1
-8 1 1
-158 0 38
-656 1 1
-104 1 1
-771 1 1
-21 1 1
-398 1 1
-16 1 2
-163 4 3
-94 1 1
-44 1 1
-172 1 0
-122 5 5
-193 16 16
-535 2 2
-17 1 0
-93 1 1
-580 1 1
-91 1 1
-141 1 1
-79 1 1
-80 13 13
-165 1 1
-129 1 1
-114 1 1
-30 1 1
-83 1 1
-35 1 1
-126 16 16
-270 0 1
-111 9 9
-151 1 1
-118 1 1
-253 1 1
-45 18468 20220
-102 1 1
-20 1 1
-111 1 1
-97 1 0
-86 1 1
-70 0 4
-69 1 1
-52 0 1
-219 3 3
-76 1 5
-209 4 4
-22 1 1
-61 1 1
-91 1 1
-194 0 21
-15 0 1
-229 1 1
-185 0 1
-113 5 5
-45 1 1
-53 1 1
-37 1 1
-157 1 1
-279 1 1
-233 1 1
-19 0 8
-67 2 0
-41 1 1
-102 12 12
-275 14 14
-70 1 1
-82 2 2
-224 5 1
-490 0 22
-3841 1 0
-3216 1 1
-42 1 1
-1914 0 3
-616 11 12
-144 1 1
-21 2 1
-775 1 1
-50 1 1
-50 2 2
-96 2 2
-1522 4 0
-58 0 2
-1099 1 1
-42 1 1
-3502 0 6
-255 1 1
-40 1 1
-150 0 4
-18 1 1
-589 1 1
-37 1 1
-539 5 5
-354 1 3
-128 1 1
-58 1 1
-159 1 1
-5 2 0
-21 1 1
-231 1 1
-82 3 3
-69 3 0
-549 1 1
-69 1 1
-74 9 9
-126 1 1
-47 1 1
-614 9 9
-138 1 1
-29 1 1
-681 1 1
-49 1 1
-67 1 1
-19 4 9
-234 1 1
-93 1 1
-60 4 4
-96 4 4
-76 1 1
-169 1 1
-418 1 1
-130 1 1
-44 1 1
-69 1 1
-80 1 1
-76 1 1
-41 1 1
-129 6 11
-363 1 1
-42 1 1
-295 1 1
-43 1 1
-83 6 0
-52 0 2
-1228 1 1
-34 1 1
-3527 20 0
-1768 2 1
-2467 0 2
-101 10 0
-129 1 1
-37 1 1
-121 1 1
-25 1 1
-161 1 0
-97 1 1
-124 1 0
-178 1 1
-34 1 1
-54 1 1
-38 1 2
-634 83 83
-874 1 1
-40 1 1
-59 0 1
-59 4 4
-316 1 1
-178 1 1
-103 1 1
-61 1 1
-220 1 1
-61 1 1
-296 1 1
-33 1 1
-185 12 12
-269 1 1
-84 1 1
-864 15 15
-241 1 0
-79 3 3
-161 1 1
-48 1 1
-539 1 1
-44 1 1
-357 1 1
-37 1 1
-436 1 1
-59 1 1
-71 1 1
-261 1 1
-289 1 1
-47 1 1
-95 12 12
-97 4 4
-27 1 1
-100 1 1
-16 1 1
-101 1 1
-33 1 2
-481 1 1
-42 1 1
-206 7 7
-56 12 12
-179 10 10
-80 1 1
-41 1 1
-251 1 1
-306 1 1
-80 2 0
-4 94 0
-433 1 1
-23 1 1
-107 1 0
-265 1 1
-49 1 1
-282 72 72
-838 7 7
-60 1 0
-108 1 1
-24 1 1
-134 1 1
-32 1 0
-158 0 2
-1040 1 1
-42 1 1
-737 1 0
-790 1 1
-9 2 1
-11 1 1
-129 1 1
-23 1 1
-894 1 1
-43 3 3
-854 1 1
-23 0 1
-23 2 0
-26 1 1
-395 0 15
-403 5 5
-14 1 1
-2454 1 1
-76 1 1
-170 1 1
-18 1 1
-574 4 0
-291 1 1
-47 1 1
-786 19 0
-88 10 11
-48 1 1
-58 1 1
-28 1 1
-500 0 2
-1280 1 1
-28 1 1
-975 1 0
-3231 1 0
-865 1 1
-39 1 1
-1561 109 100
-1037 0 1
-510 1 1
-49 1 1
-1253 1 1
-19 1 1
-1078 3 0
-221 1 1
-21 1 0
-899 0 4
-466 1 1
-38 1 1
-297 0 3
-730 19 6
-1043 1 1
-49 1 1
-273 0 1
-708 1 0
-364 14 13
-58 1 1
-74 1 1
-614 60 60
-1889 4 0
-531 1 1
-19 1 1
-1944 5 0
-163 6 7
-1206 0 2
-718 1 1
-41 7 0
-1795 13 13
-1390 1 0
-2933 0 16
-540 1 1
-14 1 1
-167 1 0
-897 17 4
-1208 1 0
-1307 1 1
-20 1 1
-540 0 10
-203 2 0
-44 1 1
-298 1 0
-87 11 10
-491 14 8
-991 1 1
-74 6 0
-179 1 1
-34 1 1
-448 10 0
-1688 1 1
-38 21 0
-173 1 1
-49 2 1
-2161 30 30
-203 1 0
-89 1 0
-492 1 1
-30 1 1
-1212 3 0
-990 1 1
-38 1 1
-780 1 0
-191 1 1
-47 6 6
-393 1 1
-41 1 1
-259 1 0
-941 1 1
-20 1 1
-185 0 6
-165 0 16
-420 3 1
-130 1 1
-31 1 1
-253 18 18
-720 16 18
-1257 3 0
-986 0 4
-3311 1 1
-26 1 1
-556 0 4
-120 0 1
-1273 1 1
-20 1 1
-338 8 8
-3965 0 3
-15 1 1
-2531 17 17
-3334 5 5
-121 13 13
-161 1 1
-45 1 1
-94 14 14
-63 9 10
-2108 1 1
-34 1 1
-1436 1 1
-47 1 1
-273 7 0
-153 0 5
-283 12 12
-619 1 1
-36 0 4
-225 1 1
-23 1 1
-553 5 0
-2334 1 1
-49 1 1
-350 1 1
-31 1 1
-1012 2 2
-422 1 1
-46 1 1
-91 4 19
-468 0 1
-46 1 1
-1491 0 4
-426 0 1
-1144 1 2
-1131 1 1
-20 1 1
-1533 16 0
-3103 44 45
-4016 12 12
-346 0 1
-943 1 0
-524 1 1
-20 1 1
-151 3 3
-144 1 1
-189 1 7
-750 1 0
-695 1 0
-1003 0 2
-7819 1 1
-78 1 1
-1811 0 1
-3177 0 1
-8990 0 1
-2268 1 1
-35 0 10
-8205 1 0
-3193 1 1
-76 1 1
-10955 0 1
-22875 0 20
-2417 1 0
-998 0 13
-4236 8 0
-4845 0 2
-64 40 34
-10941 1 1
-40 1 1
-4759 0 6
-12084 0 3
-3052 0 4
-2989 1 0
-13523 1 3
-16170 1 0
-11761 0 3
-3912 3 0
-6620 0 7
-7633 3 0
-419 2 0
-10690 5 24
-10798 0 1
-296 0 1
-1770 4 0
-374 0 4
-230 16 16
-7468 1 0
-1229 1 0
-3061 1 0
-5818 1 0
-2415 12 9
-2056 0 1
-955 4 0
-20022 0 1
-4418 2 1
-2375 0 4
-2086 1 1
-32 1 1
-1225 1 0
-857 2 0
-1154 0 1
-4667 1 0
-170 0 3
-2376 0 1
-2799 10 10
-1512 4 0
-68 9 1
-2170 1 1
-47 1 1
-318 2 0
-19 0 6
-14527 1 1
-33 1 1
-3080 1 1
-23 1 1
-1645 6 6
-231 0 1
-2136 2 0
-6222 0 1
-830 1 1
-24 1 1
-8326 1 0
-2939 1 0
-3959 0 2
-3746 0 2
-1011 1 1
-34 1 1
-7443 0 1
-688 2 0
-574 1 1
-29 1 1
-1799 13 1
-4074 2 0
-136 1 1
-77 1 1
-528 19 0
-253 0 1
-204 1 0
-129 2 0
-811 1 1
-38 1 1
-2347 52 0
-4634 1 0
-856 14 14
-193 0 4
-855 1 1
-28 1 1
-1255 1 1
-36 1 1
-97 0 1
-58 1 1
-1708 1 1
-48 1 1
-958 15 0
-3371 1 1
-37 1 1
-4267 0 13
-1061 0 1
-272 0 26
-8 1 15
-25 0 2
-112 2 0
-26 4 32
-4090 0 1
-3270 1 1
-17 1 1
-2822 0 1
-6206 1 0
-2318 0 2
-1504 0 1
-6189 3 0
-396 22 12
-918 0 1
-2340 1 1
-33 1 1
-326 1 1
-80 1 1
-205 3 2
-81 8 17
-2671 0 1
-1099 0 1
-144 1 1
-29 0 1
-2097 0 3
-24 3 0
-1207 4 4
-45 1 1
-757 0 5
-1926 1 1
-40 1 1
-2657 0 1
-414 1 0
-61 0 1
-235 0 2
-2087 0 1
-713 0 4
-58 3 0
-1027 3 0
-428 1 1
-17 1 1
-948 1 1
-41 1 1
-458 1 1
-21 1 1
-1055 0 1
-6611 0 3
-1575 4 5
-36 1 1
-99 2 0
-700 0 2
-151 0 1
-467 11 11
-272 0 3
-40 1 1
-2428 0 1
-750 2 0
-473 0 2
-421 1 1
-34 1 1
-1575 1 0
-3841 1 0
-560 1 0
-1108 1 0
-8087 1 0
-11881 1 1
-30 1 1
-4383 2 0
-6883 49 49
-3146 0 1
-906 3 0
-887 1 1
-80 1 1
-3115 0 1
-1037 1 0
-5866 0 2
-18 1 1
-582 0 5
-2828 1 0
-847 1 0
-1996 3 0
-3170 1 0
-1751 0 1
-910 3 0
-691 0 1
-5793 0 1
-26407 1 0
-672 0 1
-19269 29 35
-1371 29 0
-494 2 0
-20417 1 0
-18633 0 1
-601 1 0
-319 0 1
-6820 1 0
-5718 0 2
-17894 1 0
-4272 1 0
-4967 3 1
-290 1 0
-2447 1 0
-740 1 9
-9299 0 18
-7427 1 0
-8151 2 1
-673 1 0
-3453 0 1
-149 0 1
-611 0 4
-4662 0 4
-1752 1 1
-78 1 1
-1581 0 1
-1092 2 0
-159 1 0
-4480 0 2
-4019 0 1
-1451 22 23
-816 1 0
-8701 1 1
-23 1 1
-1796 2 0
-5015 6 1
-1383 8 0
-2368 1 1
-31 1 0
-1883 3 0
-335 0 1
-4157 0 1
-561 4 0
-1538 1 1
-61 0 1
-159 0 2
-3362 4 0
-3333 1 1
-46 1 1
-2307 1 0
-170 1 0
-5972 0 2
-840 0 2
-55 1 1
-28 1 1
-1154 0 2
-650 0 4
-30 0 4
-1100 10 11
-4343 6 0
-1663 4 0
-150 1 0
-3128 1 0
-1449 1 0
-2023 0 1
-428 3 6
-299 2 0
-427 7 7
-1914 14 14
-1273 7 7
-1444 72 0
-423 0 4
-954 1 0
-2467 1 0
-190 8 8
-2034 3 1
-6396 1 1
-34 1 1
-485 1 0
-348 7 0
-770 1 1
-29 0 13
-65 1 1
-1358 0 1
-302 0 1
-659 12 12
-293 0 1
-610 0 1
-906 12 0
-1331 0 6
-1786 0 1
-463 0 1
-4305 0 4
-1041 1 0
-11424 3 1
-13797 0 8
-166 0 1
-1510 5 0
-9069 0 8
-25 1 1
-332 5 3
-76 0 1
-1306 1 1
-46 1 1
-134 19 23
-1467 1 1
-32 1 1
-449 17 0
-367 9 9
-3525 12 10
-91 3 0
-1430 1 1
-24 1 1
-1156 9 13
-843 1 1
-28 1 1
-515 0 17
-1559 0 4
-1045 9 9
-1953 1 0
-31 1 1
-843 0 1
-2174 1 0
-3788 1 0
-2001 0 1
-2400 0 1
-1614 1 0
-8167 0 1
-2700 2 0
-2735 0 1
-8508 1 1
-57 1 1
-141 0 3
-448 1 1
-22 1 1
-2215 1 1
-32 1 1
-1714 32 32
-667 14 14
-142 1 0
-789 1 1
-45 1 1
-84 1 1
-95 1 1
-465 1 1
-45 6 4
-541 1 1
-42 1 1
-1339 5 6
-391 1 1
-20 0 1
-251 1 1
-22 1 1
-561 0 2
-78 3 0
-1718 1 1
-12 1 1
-1042 1 1
-38 1 1
-301 14 0
-222 10 10
-436 10 10
-556 55 55
-953 1 1
-17 1 1
-1752 20 0
-1561 135 0
-58 0 45
-245 101 11
-46 90 0
-150 0 270
-54 180 0
-2130 12 12
-1630 1 1
-26 1 1
-189 0 14
-296 2 0
-809 2 0
-17 20 0
-665 0 40
-236 1 1
-44 1 1
-352 1 1
-25 1 1
-554 6 6
-850 1 1
-33 1 1
-809 3 13
-1832 7 9
-468 1 1
-21 1 1
-951 1 1
-22 1 1
-219 17 18
-733 0 14
-215 2 2
-36 1 1
-301 1 1
-22 1 1
-241 1 1
-52 0 1
-47 1 1
-72 1 1
-109 1 1
-129 1 1
-28 1 1
-174 8 8
-683 3 0
-1190 285 0
-48 1 1
-1330 12 0
-557 17 17
-932 3 1
-27 1 1
-166 1 1
-19 1 1
-406 1 1
-48 3 3
-137 1 0
-161 6 6
-884 2 0
-58 1 1
-107 1 1
-150 14 14
-522 1 1
-28 1 1
-945 4 4
-34 1 1
-472 0 2
-203 0 1
-281 1 1
-46 1 1
-1130 1 0
-232 17 17
-510 1 1
-33 1 1
-62 10 10
-1501 1 1
-20 1 1
-573 1 1
-29 1 1
-928 0 3
-304 1 1
-41 1 1
-160 1 1
-58 1 1
-656 1 1
-40 4 0
-108 6 6
-321 1 1
-14 0 16
-91 1 1
-184 1 1
-43 8 3
-180 1 1
-68 1 1
-144 1 1
-27 1 0
-17 1 1
-212 0 1
-212 1 1
-34 1 1
-115 1 1
-41 1 1
-407 10 10
-200 1 1
-44 2 0
-187 2 0
-146 1 1
-17 1 1
-122 4 4
-73 1 0
-56 1 1
-155 1 17
-80 15 15
-458 1 1
-16 3 3
-343 1 1
-111 1 1
-160 55 55
-157 12 12
-346 0 2
-382 4 0
-35 1 1
-937 0 1
-246 25 0
-52 0 1
-419 0 1
-165 1 0
-75 24 3
-297 1 1
-38 1 1
-5066 1 0
-4922 7 9
-2488 14 14
-2241 1 1
-67 4 4
-39 1 0
-547 1 1
-43 1 1
-524 3715 901
-1796 4 2
-138 2 2
-16 1 1
-415 1 1
-18 1 1
-367 0 89
-1600 0 6
-2175 0 5
-606 14 14
-519 1 0
-540 1 1
-40 1 1
-568 2 0
-165 1 2
-31 1 1
-259 1 1
-41 1 1
-452 31 31
-623 40 62
-818 1 1
-42 1 1
-565 1 1
-44 1 1
-571 10 8
-61 1 1
-28 1 1
-233 2 0
-33 28 0
-53 1 1
-37 1 1
-75 0 396
-156 1 0
-473 0 4
-421 1 1
-35 1 1
-2132 1 1
-80 0 2
-544 9 9
-152 2 1
-33 1 1
-2932 1 1
-44 0 1
-164 22 0
-149 1 0
-534 1 1
-36 1 1
-113 1 1
-15 1 1
-661 1 1
-48 1 1
-1987 1 0
-34 1 1
-444 1 1
-45 1 1
-65 1 1
-67 1 1
-210 1 1
-68 1 1
-55 1 1
-47 1 1
-169 1 1
-64 1 1
-109 0 6
-77 2 32
-6 0 5
-67 0 1
-7 16 0
-51 12 0
-36 0 12
-700 1 1
-33 1 0
-49 0 2
-450 0 1
-98 4 0
-489 32 0
-63 5 1
-78 7 7
-538 17 17
-1269 1 0
-841 1 1
-43 1 1
-2004 1 1
-41 1 1
-86 0 4
-5 1 0
-36 1 1
-573 2 1
-297 1 0
-85 1 1
-30 1 1
-1041 1 0
-12 1 1
-392 33 12
-515 5 6
-583 1 1
-33 1 1
-616 16 16
-1052 0 11
-39 1 1
-184 1 1
-67 1 1
-102 7 7
-58 0 1
-307 1 1
-56 0 3
-930 21 19
-1264 0 1
-832 1 1
-28 1 1
-272 1 1
-82 1 1
-56 1 0
-976 6 6
-2015 0 3
-84 9 9
-130 13 17
-564 10 15
-154 1 0
-438 10 10
-38 0 5
-2141 1 1
-25 1 1
-73 10 10
-70 5 5
-132 1 1
-52 1 1
-599 1 1
-46 1 1
-279 1 1
-18 1 1
-239 2 0
-383 6 0
-224 0 1
-321 3 0
-8 16 0
-1775 1 1
-18 2 0
-575 16 16
-60 1 1
-16 1 1
-1247 2 0
-173 3 0
-41 1 1
-57 8 8
-285 2 0
-672 1 1
-44 1 1
-106 0 1
-148 1 1
-49 3 0
-146 5 11
-91 1 1
-79 1 1
-94 1 1
-101 1 1
-88 16 16
-117 1 1
-15 1 1
-58 1 1
-93 1 1
-140 1 0
-326 1 1
-44 1 1
-160 1 1
-23 1 1
-481 14 14
-181 4 4
-72 1 1
-25 1 1
-88 1 3
-36 0 12
-92 1 1
-56 10 0
-13 0 1
-66 1 1
-141 2 0
-65 1 1
-367 0 2
-610 1 1
-22 1 1
-150 1 1
-85 1 1
-109 1 1
-167 3 1
-23 1 0
-26 1 1
-74 1 1
-33 1 1
-176 1 1
-25 2 2
-193 1 1
-35 0 1
-383 0 5
-249 1 1
-69 1 1
-98 1 1
-62 1 1
-62 1 2
-74 0 1
-68 1 1
-438 1 1
-64 1 1
-47 0 8
-125 3 0
-75 5 5
-45 1 1
-197 1 1
-27 1 1
-116 13 13
-218 15 20
-1107 16 19
-73 1 1
-25 1 1
-199 1 1
-60 1 1
-994 1 1
-43 0 1
-18 1 1
-1215 18 18
-340 1 1
-34 1 1
-1350 16 16
-1726 4 4
-193 1 1
-48 1 1
-295 1 1
-18 1 1
-411 19 19
-175 1 1
-49 1 1
-146 1 1
-61 1 1
-116 1 1
-41 1 1
-137 1 1
-30 1 1
-158 9 9
-136 10 13
-349 8 8
-468 1 1
-44 1 1
-862 17 17
-813 1 1
-24 1 1
-214 10 4
-228 1 1
-34 1 1
-101 12 12
-242 1 1
-69 1 1
-185 1 1
-24 1 0
-164 0 1
-222 1 1
-25 1 1
-297 10 10
-1171 1 0
-182 1 1
-35 1 1
-350 19 19
-1966 1 1
-24 1 1
-548 7 7
-208 13 12
-298 1 1
-65 1 1
-193 2 2
-28 1 1
-125 4 4
-95 7 7
-566 1 1
-40 1 1
-118 0 1
-318 1 0
-374 1 1
-58 1 1
-143 1 1
-74 1 1
-53 21 0
-81 1 1
-45 1 1
-138 15 16
-180 1 1
-62 1 1
-661 1 1
-48 1 1
-1463 1 0
-156 0 1
-148 1 1
-19 1 0
-17 1 1
-1927 4 0
-1469 14 14
-466 0 1
-3098 0 1
-1141 2 3
-743 14 14
-79 1 1
-22 1 1
-362 0 1
-682 16 9
-275 0 4
-539 1 0
-61 0 7
-331 0 4
-130 1 1
-31 0 3
-1554 1 1
-43 1 1
-224 1 1
-49 1 1
-159 3 0
-1064 27 27
-104 1 1
-21 1 1
-222 2 2
-49 1 1
-1397 1 1
-37 1 1
-414 0 2
-695 1 1
-31 1 1
-742 1 1
-21 1 1
-230 3 2
-42 1 1
-68 1 1
-37 1 1
-703 0 3
-2216 84 83
-1430 1 1
-23 1 1
-1867 13 0
-35 1 1
-137 16 16
-1500 4 0
-4546 1 1
-25 1 1
-358 19 19
-1549 1 1
-39 4 3
-1037 1 1
-40 2 0
-890 6 0
-41 2 0
-498 3 0
-321 0 1
-281 3 0
-414 1 1
-70 1 1
-284 1 0
-214 1 1
-28 1 1
-280 1 0
-650 1 1
-47 1 1
-1030 1 1
-91 1 1
-6520 5 5
-462 1 0
-2864 0 3
-1930 0 4
-2915 1 1
-20 1 1
-413 1 0
-1844 11 11
-133 0 6
-569 10 10
-110 12 12
-184 0 3
-228 1 1
-43 2 2
-51 14 13
-1499 1 0
-12 1 1
-378 1 1
-49 1 1
-424 1 0
-1069 1 1
-142 0 1
-821 2 9
-311 1 6
-247 1 1
-86 1 1
-1850 1 1
-26 1 1
-498 1 1
-34 1 1
-688 5 9
-44 1 1
-369 1 1
-69 1 1
-156 2 0
-83 1 1
-128 1 1
-50 9 9
-249 1 1
-70 0 1
-624 2 0
-74 2 1
-300 1 1
-26 1 1
-240 4 0
-1705 1 1
-52 1 1
-231 29 24
-378 2 0
-236 1 1
-76 1 1
-116 9 12
-301 20 20
-59 0 6
-43 1 1
-384 15 15
-1414 5 0
-225 0 2
-1234 1 0
-29 1 1
-235 10 10
-227 1 1
-77 4 0
-43 5 9
-485 7 7
-380 10 0
-46 1 0
-90 1 1
-161 1 1
-401 1 1
-58 1 1
-2127 3 0
-186 20 20
-323 5 5
-47 1 1
-236 1 1
-31 0 2
-1568 1 1
-136 0 1
-202 0 3
-77 1 1
-44 1 1
-411 12 11
-317 0 2
-599 1 1
-37 1 1
-391 1 0
-273 1 0
-744 0 4
-703 1 1
-20 1 1
-198 3 0
-158 19 15
-27 12 0
-282 1 1
-32 4 0
-740 1 0
-327 1 1
-105 1 1
-146 16 16
-101 1 0
-21 1 1
-232 1 1
-33 2 0
-12 1 1
-189 1 1
-30 2 2
-544 1 1
-153 1 1
-586 5 0
-1351 21 0
-446 49 49
-121 7 7
-1147 12 12
-777 1 0
-701 1 1
-29 2 2
-154 12 12
-191 1 1
-55 1 1
-113 0 1142
-87 0 2
-15 0 1
-525 1 1
-22 1 1
-355 10 10
-50 0 8
-252 1 1
-31 1 1
-354 6 5
-148 15 15
-407 1 1
-42 1 1
-275 0 1
-737 5 9
-1432 1 1
-39 1 1
-84 0 2
-77 7 7
-514 20 20
-385 7 1
-815 1 1
-45 1 1
-487 1 1
-66 1 1
-2379 0 24
-779 1 1
-18 1 0
-2653 4 0
-34 1 1
-191 1 1
-35 1 1
-1174 12 0
-2497 1 1
-24 0 1500
-447 8 0
-3268 1 0
-946 1 0
-2223 20044 20060
-119 1 1
-71 0 3
-53 0 5
-40 1 1
-309 1 1
-57 1 1
-101 1 1
-47 2 2
-67 1 1
-47 1 1
-74 0 1
-28 1 1
-167 1 1
-33 1 1
-543 1 1
-27 11 34
-33 1 1
-149 7 7
-61 1 1
-120 1 1
-366 1 1
-55 1 1
-121 1 1
-62 1 1
-78 1 1
-48 1 1
-161 1 1
-26 1 1
-191 1 1
-20 11 11
-550 1 1
-76 1 0
-20 1 1
-112 1 1
-149 1 1
-284 1 1
-37 1 1
-705 1 12
-106 12 12
-83 1 1
-46 1 1
-1500 1 1
-81 1 1
-210 1 1
-26 1 1
-713 1 1
-48 1 1
-723 0 3
-196 6 6
-62 2 2
-32 1 1
-606 1 2
-357 1 1
-38 292 0
-589 1 1
-30 1 1
-714 8 8
-639 1 1
-20 1 1
-1068 0 1
-571 1 1
-49 1 1
-436 0 1
-609 0 2
-30 1 1
-66 0 1
-349 11 11
-65 1 1
-40 1 1
-717 0 3
-299 1 1
-29 1 1
-724 1 0
-275 1 1
-33 1 1
-318 0 3
-279 1 1
-28 1 1
-389 1 0
-548 0 8
-330 1 1
-47 1 1
-170 1 1
-47 1 1
-519 14 14
-841 24 24
-732 1 1
-29 3 3
-688 2 2
-23 0 1
-94 14 14
-726 13 13
-508 0 12
-21 6 0
-69 1 1
-37 1 1
-590 1 1
-59 1 1
-89 11 11
-164 1 1
-58 1 1
-1709 18 18
-520 1 1
-27 1 1
-683 10 10
-814 1 1
-26 1 1
-350 1 1
-39 1 1
-132 6 6
-439 10092 10075
-78 15 15
-3352 1 1
-23 1 1
-873 4 4
-887 1 0
-1827 1 0
-216 6 6
-805 2 0
-874 0 8
-2266 1 1
-47 1 1
-761 0 4
-86 1 1
-19 1 1
-1794 9 9
-271 0 1
-2266 1 1
-34 1 1
-916 0 1
-21 1 1
-108 21 21
-141 1 1
-27 1 1
-406 3 0
-3950 1 1
-38 1 1
-128 2 2
-56 1 1
-72 0 1
-96 1 1
-22 1 1
-169 7 7
-511 1 1
-38 1 1
-1070 1 1
-90 1 1
-50 1 1
-41 1 0
-30 1 1
-659 12 12
-701 1 1
-33 1 1
-569 15 15
-70 1 1
-38 1 1
-955 0 3
-130 1 1
-63 1 1
-251 8 8
-191 1 1
-26 0 3
-187 1 0
-916 5 1
-70 13 13
-498 20061 20021
-160 1 1
-76 1 1
-95 1 1
-76 1 1
-275 1 0
-101 1 1
-79 1 1
-100 7 7
-159 1 1
-75 0 8
-87 1 1
-76 1 1
-44 1 1
-71 32 32
-89 11 12
-196 1 1
-55 0 2
-61 1 1
-83 0 1
-944 1 1
-126 1 1
-81 6 6
-41 3 0
-641 1 1
-92 1 0
-113 1 1
-39 1 1
-671 1 1
-28 1 1
-123 1 1
-59 1 1
-210 1 1
-17 1 1
-168 15 14
-494 1 0
-22 1 1
-484 18 18
-376 1 1
-114 2 0
-67 1 1
-10 1 1
-109 1 1
-165 1 1
-149 6 6
-234 1 1
-19 5 5
-64 1 1
-111 1 1
-220 1 1
-89 1 1
-119 1 1
-113 2 0
-168 1 1
-73 1 1
-194 1 1
-50 0 4
-37 1 1
-95 3 1
-43 1 1
-153 1 1
-83 1 1
-55 1 1
-39 1 1
-70 7 0
-59 7 7
-75 1 1
-84 2 2
-110 1 0
-42 1 1
-129 9978 10000
-438 1 1
-43 1 0
-55 1 1
-40 1 1
-175 1 1
-46 1 1
-52 1 1
-19 1 1
-277 1 1
-60 1 1
-98 1 1
-24 1 1
-333 4 4
-1047 2 0
-4080 1 1
-38 1 1
-837 0 64
-172 1 1
-55 1 1
-1818 2 0
-1143 13 13
-335 1 0
-1944 5 0
-39 6 0
-4057 3 8
-9465 5 4
-301 19 1
-191 84 0
-427 1 1
-29 0 4
-157 4 5
-296 21 18
-158 2 2
-36 1 1
-539 13 13
-399 1 1
-46 1 1
-348 1 1
-49 1 1
-268 1 0
-66 0 4
-178 2 2
-107 1 1
-133 5 5
-355 1 1
-30 1 1
-346 1 1
-29 1 1
-161 1 1
-38 1 1
-121 4 4
-55 8 8
-67 7 7
-318 17 17
-259 1 1
-94 1 1
-80 1 1
-35 1 1
-260 1 1
-81 1 1
-106 1 1
-58 1 2
-301 3 0
-2052 1 1
-40 1 1
-174 20 22
-574 0 2
-414 1 0
-234 0 1
-425 51224 51060
-1568 14 14
-11956 0 1
-2667 0 2
-884 1 1
-19 1 1
-676 1 1
-63 1 1
-3138 0 3
-3038 5 2
-132 10 6
-136 18 13
-363 1 1
-89 1 1
-382 1 1
-29 1 1
-58 8 7
-297 4 0
-66 1 1
-93 2 0
-145 1 1
-31 5 5
-576 1 1
-89 1 1
-1256 0 12
-67 1 1
-193 2 2
-23 1 1
-51 1 0
-727 1 0
-1148 12 12
-837 1 1
-77 1 1
-941 10 10
-776 19 19
-300 1 1
-24 1 1
-256 1 7
-93 1 1
-224 2 0
-138 1 1
-563 1 1
-104 4 4
-2898 1 1
-46 1 1
-282 1 1
-39 1 1
-204 2 2
-22 1 1
-469 1 1
-20 1 1
-140 1 1
-26 1 1
-745 0 2
-539 0 6
-1536 1 0
-817 4 4
-202 1 1
-48 1 1
-168 1 1
-53 1 1
-379 10 10
-1178 14 14
-132 5 0
-555 1 1
-42 1 1
-573 1 1
-21 1 1
-462 1 1
-43 1 1
-121 1 1
-48 0 3
-15 1 5
-1404 0 1
-934 1 1
-49 1 1
-1350 1 0
-384 1 1
-24 1 1
-4169 0 15
-244 10 10
-2167 18 14
-64 1 1
-31 1 1
-185 0 4
-1647 1 1
-20 1 1
-227 1 1
-37 1 1
-636 3 4
-5590 1 1
-39 1 1
-461 0 2
-2145 1 1
-23 1 1
-1114 0 2
-688 0 1
-901 18 18
-4781 0 4
-815 0 1
-5027 42 47
-415 0 1
-2743 1 1
-78 1 1
-390 1 0
-328 0 1
-878 0 1
-5752 0 2
-1554 1 1
-60 1 1
-278 0 1
-19 1 1
-1164 11 11
-691 0 2
-960 1 0
-62 0 20
-2108 0 2
-1265 0 1
-1642 2 0
-3584 2 0
-12086 2 0
-3766 0 2
-1209 1 7
-3466 1 0
-1448 1 0
-1943 0 1
-698 0 8
-1166 135 135
-2030 2 0
-540 1 0
-1736 14 0
-3128 0 2
-4464 0 1
-3597 1 0
-378 1 0
-1269 0 3
-1182 1 0
-654 0 3
-2049 1 0
-6838 1 1
-69 0 3
-154 1 0
-2718 1 1
-30 1 1
-160 11 11
-4954 0 1
-420 1 1
-123 1 1
-156 0 4
-219 4 0
-195 1 0
-4402 3 0
-3045 0 1
-1249 1 0
-3522 0 10
-675 20 20
-117 8 0
-346 0 1
-8538 5 0
-455 1 0
-119 0 1
-355 48 48
-724 1 0
-9254 22 22
-1672 1 0
-833 0 1
-4251 1 0
-8 1 1
-2079 0 1
-1735 8 12
-1612 0 1
-1373 5 0
-8585 7 0
-64 1 1
-3799 1 0
-258 2 0
-899 1 0
-1362 8 9
-593 0 2
-3351 2 0
-618 0 4
-905 2 15
-2797 1 0
-2776 2 0
-4110 0 6
-4466 18 18
-1783 9 9
-475 0 4
-134 1 0
-12963 8 0
-1616 0 2
-1685 2 0
-2225 2 0
-428 0 1
-458 20 20
-2860 0 3
-677 4 6
-325 11 1
-1887 0 1
-913 0 1
-997 5 5
-2814 17 15
-1389 1 0
-1200 0 4
-2495 1 0
-3921 26431 26426
-2419 0 1
-6110 0 1
-1370 0 1
-3085 1 0
-3568 1 1
-24 0 9
-597 1 0
-2642 1 0
-1545 10 0
-4952 0 1
-6146 2 0
-1452 1 0
-2967 1 0
-4920 5 0
-147 4 5
-850 1 0
-1875 1 0
-695 3 1
-1719 0 1
-259 0 1
-294 1 0
-128 0 2
-3051 0 1
-908 0 4
-3399 0 1
-4673 1 0
-3179 1 0
-411 1 1
-44 1 1
-174 1 0
-1047 17 17
-998 178 0
-671 0 40
-2093 1 0
-313 0 1
-7581 1 0
-3245 1 0
-972 0 4
-4085 2 0
-346 1 1
-45 1 1
-368 1 0
-26 1 1
-8444 0 1
-17044 1 0
-2795 2 0
-2860 1 0
-622 0 1
-167 0 5
-1968 0 2
-259 2 0
-4992 29 27
-170 1 0
-3528 0 1
-191 1 2
-117 2 0
-2275 1 0
-12676 1 1
-20 1 1
-9972 1 0
-13955 0 5
-19867 1 0
-9612 1 0
-14233 0 32737
-6316 1 1
-19 1 1
-970 8 8
-2685 16 16
-18093 0 1
-6799 0 16
-3350 0 1
-7574 0 12
-2132 0 1
-7228 52793 52800
-1955 22 22
-698 0 1
-2149 1 0
-6880 0 2
-960 0 1
-23 1 1
-2646 2 0
-3867 5 0
-26077 0 3
-3174 1 0
-8183 0 1
-2817 10 0
-5841 1 0
-2081 0 1
-374 0 2
-3589 0 4
-10625 28 28
-3275 3 0
-773 7 7
-175 1 1
-79 1 1
-400 12 12
-1096 0 4
-717 7 7
-52 1 1
-68 5 1
-2117 0 3
-130 14 14
-1124 0 3
-413 0 4
-643 3 0
-58 1 1
-127 1 1
-196 0 2
-226 3 0
-136 3 4
-293 1 1
-25 0 3
-63 1 1
-417 0 2
-412 0 16
-737 4 0
-402 2 0
-654 1 1
-42 1 1
-75 1 1
-64 1 1
-2980 4 0
-576 0 1
-29 2 2
-715 1 1
-36 1 1
-511 38 38
-218 4 40
-44 1 5
-43 49 5
-709 21 21
-1147 9 9
-22 1 1
-195 7 4
-659 3 0
-27 1 1
-637 1 1
-42 1 1
-531 1 1
-67 1 1
-39 1 0
-717 11 11
-53 1 1
-61 1 1
-1535 1 1
-89 0 1
-49 1 0
-102 1 1
-67 1 1
-76 1 1
-129 1 1
-85 1 1
-607 10 0
-12 137 1
-41 1 1
-1043 1 1
-22 1 1
-203 3 0
-480 14 21
-91 23 23
-1345 2 1
-435 15 17
-1188 30 0
-1778 1 0
-120 0 3
-3797 1 0
-3211 0 1
-2456 4 0
-954 0 4
-1847 0 1
-5929 20 20
-984 14 0
-2112 1 0
-2013 1 0
-1770 14 14
-3100 1 0
-1160 16 0
-733 7 7
-238 3 2
-2203 2 1
-5654 1 1
-28 5 10
-482 0 1
-2970 0 4
-2892 0 1
-251 1 7
-1346 1 0
-877 0 4
-3583 0 1
-1178 0 1
-1293 0 2
-491 2 0
-6803 1 1
-22 1 1
-2218 1 1
-44 1 1
-4780 4 0
-3026 14 13
-442 5 5
-2022 6 6
-506 2 0
-8557 1 1
-36 1 0
-1575 1 0
-1329 1 1
-35 1 0
-247 1 1
-16 1 1
-184 1 1
-18 1 1
-1636 0 7
-23 1 1
-527 1 1
-39 1 1
-653 3 0
-227 1 1
-18 1 1
-218 0 323
-91 1 0
-124 0 15
-621 0 2
-555 8 8
-467 1 1
-40 1 1
-372 1 1
-25 1 1
-188 12 12
-357 0 2
-2389 1 1
-22 1 1
-2579 0 5
-461 1 1
-36 1 1
-1584 1 1
-26 1 0
-429 1 0
-33 1 1
-1071 0 4
-1068 9 0
-1472 0 2
-1839 94 92
-337 1 1
-46 1 1
-416 1 1
-42 1 1
-1255 0 2
-628 17 15
-587 15 15
-398 3 0
-623 1 1
-78 0 3
-287 10 0
-191 0 2
-493 1 1
-42 4 0
-219 0 1
-408 1 1
-23 1 1
-283 1 1
-21 1 1
-633 2 0
-241 6 6
-457 1 0
-330 0 16
-428 1 0
-4 6 0
-324 0 1
-3060 0 2
-9953 0 1
-1899 0 6
-6431 0 1
-8674 0 4
-4595 11 0
-5064 2 0
-2813 12 12
-1391 5 0
-3690 1 1
-64 1 1
-2635 1 1
-49 1 1
-69 1 1
-15 1 1
-605 4 4
-400 8 0
-735 0 20
-3074 2 0
-1879 0 1
-572 0 8
-576 1 1
-42 1 1
-265 24 0
-209 11 11
-953 1 1
-42 0 5
-58 1 0
-95 1 0
-1121 1 1
-17 1 1
-751 0 1
-24 1 1
-351 1 1
-43 3 3
-565 1 1
-15 1 1
-271 1 0
-323 1 1
-23 1 1
-221 7 7
-705 9 0
-631 2 0
-64 1 1
-1577 1 1
-21 0 1
-371 7 21
-160 0 1
-283 1 1
-48 1 1
-227 1 1
-40 0 1
-1359 0 2
-836 13 13
-722 7 7
-1153 1 1
-93 1 1
-797 14 14
-433 8 0
-108 11 11
-140 1 1
-40 1 1
-470 1 1
-42 1 1
-1106 0 1
-85 4 4
-129 1 1
-123 1 0
-95 1 1
-104 6 1
-641 1 1
-77 1 1
-57 1 1
-62 1 1
-473 2 0
-262 6 0
-45 1 1
-63 2 0
-39 1 1
-267 0 1
-197 2 104
-189 107 3
-112 0 4
-108 5 0
-563 14 14
-324 1 0
-205 1 1
-17 1 1
-495 0 1
-201 4 0
-14 1 1
-667 42 42
-178 1 1
-58 1 1
-133 1 1
-24 1 1
-91 24 24
-342 1 1
-32 1 1
-121 1 1
-62 1 1
-2371 2 0
-164 8 1
-655 1 1
-30 1 1
-271 1 1
-47 1 1
-609 1 0
-1780 2 0
-742 1 1
-40 1 1
-2014 1 0
-1741 3 0
-3833 0 1
-14622 161198 190000
-5156 0 1
-1680 1 1
-88 1 1
-4502 0 1
-46 1 1
-800 4 4
-23 1 1
-1305 2 0
-136 0 1
-4941 0 1
-547 0 1
-70 8 8
-293 1 1
-35 1 1
-1165 4 0
-6662 1 1
-46 1 1
-167 0 8
-214 1 1
-35 1 1
-108 1 0
-1063 0 1
-1017 1 1
-20 0 6
-1725 0 1
-150 5 5
-33 1 0
-12 1 1
-349 1 1
-24 0 1
-1562 1 1
-31 1 1
-2513 0 1
-73 36 36
-305 1 1
-27 1 1
-543 1 1
-47 4 28
-5476 10 10
-531 1 1
-37 1 1
-776 1 1
-44 2 2
-115 22 20
-181 1 1
-125 3 3
-466 1 1
-76 1 1
-144 5 5
-32 1 1
-225 1 1
-41 1 1
-707 24 24
-66 4 4
-414 1 1
-42 1 1
-81 1 1
-63 1 1
-76 28 46
-187 1 1
-97 1 1
-99 9 9
-85 14 14
-81 6 6
-62 1 1
-109 4 5
-150 1 0
-44 4 4
-93 11 11
-188 3 3
-73 1 1
-52 1 1
-19 13 0
-48 1 1
-62 0 7
-205 1 1
-68 9 9
-99 4 0
-21 1 0
-52 1 1
-171 1 1
-109 3 1
-6 0 2
-190 1 1
-69 10078 10069
-90 3 1
-197 1 1
-157 0 6
-137 1 1
-101 2 2
-233 6 6
-62 1 1
-104 0 1
-143 1 1
-119 1 1
-106 2 0
-176 1 1
-79 0 1
-50 1 1
-50 3 3
-179 1 1
-159 1 1
-36 1 1
-107 1 1
-176 1 1
-154 0 5
-91 1 1
-54 1 1
-77 1 1
-238 2 2
-50 1 1
-1421 1 1
-23 1 1
-216 1 1
-122 1 1
-86 1 1
-41 3 1
-336 7 7
-41 9 0
-107 1 1
-90 1 3
-6 1 0
-84 1 1
-213 1 1
-26 1 1
-138 1 1
-25 1 1
-206 1 1
-36 3 3
-37 7 0
-500 1 1
-52 1 1
-52 1 1
-48 1 1
-395 1 1
-66 6 6
-72 1 0
-69 1 1
-100 10 10
-160 1 0
-64 7 7
-89 1 1
-123 1 1
-128 1 1
-36 1 1
-231 1 1
-61 1 1
-564 8 8
-593 47 47
-163 1 0
-196 8 8
-174 5 5
-37 1 1
-67 0 1
-192 1 1
-60 3 0
-19 1 1
-1149 1 1
-18 1 1
-77 1 1
-32 2 0
-32 1 1
-136 1 1
-78 2 0
-162 4 0
-41 1 1
-351 13 13
-1634 2 0
-229 8 8
-57 13 2
-410 1 1
-76 1 1
-180 1 1
-92 1 1
-270 1 1
-40 1 1
-92 1 1
-53 1 1
-227 1 1
-42 1 1
-357 4 4
-23 1 1
-94 1 0
-200 6 0
-201 7 7
-70 5 13
-57 4 0
-35 1 1
-206 1 1
-76 2 2
-651 1 1
-68 4 0
-73 1 1
-49 4 0
-37 1 1
-145 2 2
-78 2 2
-108 12 12
-52 1 1
-35 1 1
-242 1 3
-76 2 2
-50 12 12
-70 1 1
-33 0 2
-57 1 1
-64 15 15
-168 1 1
-22 1 1
-63 36 37
-73 0 2
-64 1 1
-177 2 0
-19 4 0
-55 1 0
-33 1 1
-51 1 1
-122 1 1
-296 1 1
-85 1 1
-109 1 1
-64 1 1
-155 1 1
-58 0 2
-72 1 1
-25 1 1
-128 1 1
-45 2 0
-444 1 1
-25 1 1
-64 1 1
-21 1 1
-368 15 15
-734 2 0
-701 15 15
-71 1 1
-41 1 1
-77 1 1
-56 1 1
-478 2 0
-714 8 7
-95 2 2
-50 4 3
-1129 1 1
-34 1 1
-1715 1 1
-87 1 1
-692 1 1
-47 0 1
-75 1 1
-541 12 12
-1602 10 10
-1265 1 1
-46 1 1
-298 1 1
-22 1 1
-186 1 1
-34 1 1
-202 1 1
-61 1 0
-185 1 1
-24 1 0
-98 0 2
-258 8 14
-967 1 1
-15 1 1
-625 1 0
-1362 0 4
-23365 4 0
-246 26975 26986
-3307 0 1
-13671 3 3
-52 1 1
-1308 2 0
-942 0 1
-17790 1 0
-4586 0 1
-949 0 2
-15047 0 1
-606 2 0
-7820 0 4
-22313 16 0
-10539 8 0
-4836 0 1
-8320 18 18
-388 2 0
-194 1 1
-49 1 1
-320 1 1
-34 1 1
-6813 0 1
-8719 3 0
-7037 1 0
-721 0 1
-999 6 0
-17 1 0
-3075 5 0
-593 13 11
-1006 12 12
-3487 1 0
-9535 0 4
-23 0 2
-23 2 0
-513 0 3
-377 1 0
-2627 0 2
-16 0 1
-211 18 18
-571 2 0
-7617 0 1
-1607 1 0
-69 1 1
-66 1 1
-275 1 1
-67 7 0
-25 1 1
-1206 1 0
-136 8 7
-612 1 1
-61 1 1
-740 0 2
-78 26 26
-129 15 15
-69 12 16
-1483 13 28
-1062 1 0
-108 4 0
-685 0 2
-1566 1 0
-192 4 4
-1452 9 45
-1514 1 1
-46 1 1
-1969 0 1
-35 1 1
-1094 1 0
-618 1 1
-43 1 1
-6580 1 0
-1636 5 0
-6325 1 1
-32 1 1
-1041 0 2
-174 9 0
-11983 18 18
-142 8 8
-2203 10 8
-2025 1 1
-39 1 1
-907 4 4
-225 1 1
-124 1 1
-3928 0 22
-38 2 0
-44 18 0
-46 0 6
-61 0 1
-3653 6 0
-34 1 1
-4559 1 1
-28 1 1
-283 5 5
-1572 28 28
-351 1 1
-34 1 1
-443 19 19
-57 1 1
-21 1 1
-231 1 1
-94 1 1
-105 1 1
-208 5 5
-124 1 1
-112 3 3
-207 1 1
-38 1 1
-244 1 1
-60 1 1
-98 1 1
-50 1 1
-256 5 5
-23 1 1
-157 1 1
-33 1 1
-143 1 1
-59 1 1
-51 1 1
-45 1 0
-73 1 1
-81 1 1
-339 1 1
-56 0 5
-142 1 1
-232 1 1
-43 1 1
-332 1 1
-47 1 1
-479 1 0
-137 0 3
-1456 10 13
-63 1 1
-37 1 1
-261 0 2
-109 1 1
-50 1 1
-56 129 1
-88 1 0
-44 1 1
-54 1 1
-56 1 50
-58 50 1
-54 277 1
-44 1 1
-297 0 39
-142 1 1
-85 1 1
-124 16 16
-58 3 15
-677 1 0
-1333 2 0
-13591 6 0
-989 1 1
-107 1 1
-678 1 1
-31 1 1
-2571 5 5
-56 2 2
-39 1 1
-3986 0 4
-18351 32 30
-10811 1 1
-25 0 1
-417 1 1
-40 1 1
-159 4 4
-37 4 4
-179 1 1
-51 1 1
-103 2 0
-108 1 1
-79 1 1
-25 1 1
-58 1 1
-12 1 1
-275 14 0
-80 1 1
-83 1 1
-24 1 1
-59 1 0
-91 1 1
-65 1 1
-67 1 1
-136 4 0
-68 8 0
-331 5 0
-40 1 1
-110 10 6
-64 1 1
-368 1 1
-22 1 1
-509 1 1
-89 1 1
-926 1 0
-959 1 1
-44 1 1
-72 11 0
-47 1 1
-361 1 1
-37 1 1
-2204 2 2
-45 1 1
-1117 18 18
-141 1 1
-47 1 1
-148 1 1
-75 1 1
-104 1 0
-205 3 2
-249 1 1
-146 1 1
-94 1 1
-34 1 1
-700 0 331
-21 1 1
-73 1 1
-49 1 1
-356 1 1
-16 1 1
-112 1 1
-36 9 0
-515 1 1
-27 2 2
-192 1 1
-53 0 14
-82 1 1
-302 1 1
-68 1 1
-52 12 12
-52 1 1
-34 1 1
-166 7 7
-384 1 1
-31 1 1
-281 1 1
-57 1 1
-176 0 1
-1625 1 1
-26 1 1
-369 1 1
-21 1 1
-86 1 1
-134 1 1
-215 1 1
-214 15 1
-50 2 2
-26 1 1
-78 0 19
-64 1 1
-118 53 53
-433 1 1
-76 0 1
-6 12 0
-52 1 1
-108 1 1
-87 1 1
-62 1 1
-26 1 1
-291 2 1
-143 1 1
-29 1 1
-56 12 12
-230 1 1
-153 4 4
-87 32 32
-584 12 12
-227 1 0
-1931 4 0
-836 1 1
-68 1 1
-205 24 19
-816 1 2
-1932 0 7
-1732 13 0
-257 4 0
-1423 1 0
-129 6 0
-1505 1 1
-42 0 1
-373 13 13
-565 1 1
-76 1 0
-1881 0 4
-68 4 0
-43 0 4
-2201 8 8
-3726 3 0
-339 15 11
-249 1 1
-35 1 1
-250 1 1
-38 1 1
-359 11 12
-109 1 1
-43 18 0
-822 1 1
-53 1 1
-325 15 15
-123 1 1
-42 6 6
-240 1 1
-44 1 1
-438 7 7
-142 2 0
-1004 0 1
-9275 1 1
-37 1 0
-2071 0 1
-1253 9 9
-9137 0 1
-12513 2 1
-11243 1 1
-26 1 1
-816 4 0
-15996 2 0
-1594 1 0
-363 5 0
-6757 47 41
-2700 1 0
-841 0 1
-1807 0 2
-2565 11 0
-2089 0 2
-477 1 0
-657 0 1
-776 0 20
-365 82 49
-779 0 1
-401 25 63
-441 0 2
-1152 0 2
-1315 1 0
-5352 6 8
-902 0 1
-2154 1 1
-36 1 1
-109 0 1
-668 6 0
-1923 0 1
-91 3 2
-3560 1 0
-1235 1 0
-139 26 0
-7381 1 0
-155 0 14
-2393 1 1
-33 1 1
-507 4 0
-1337 0 1
-9954 3 0
-1588 1 0
-2605 1 1
-23 1 1
-3000 0 3
-8249 8 0
-912 0 1
-338 2 0
-734 1 0
-4332 1 0
-416 0 4
-1691 0 1
-295 1 0
-214 2 0
-121 0 1
-784 0 1
-2512 0 1
-4465 12 11
-926 1 0
-190 1 0
-5780 0 1
-490 5 0
-228 1 1
-45 1 1
-207 3 0
-322 0 1
-633 1 1
-24 1 0
-1516 5 0
-1025 0 13
-1518 0 1
-591 10 10
-1061 1 0
-1371 1 1
-22 1 1
-928 0 2
-182 8 0
-328 1 0
-301 0 1
-994 1 1
-18 0 6
-1743 0 1
-2350 22 23
-1548 0 2
-1498 8 6
-7484 0 3
-2988 7 7
-93 2 0
-322 1 0
-280 1 1
-49 1 1
-2114 16 17
-617 0 1
-1012 0 1
-495 1 0
-29 1 1
-3134 1 0
-1837 0 4
-4079 0 1
-905 8 0
-5764 0 1
-3493 0 20
-1174 0 1
-900 0 1
-1006 1 0
-1699 0 1
-1682 1 0
-688 1 1
-21 1 1
-3349 0 1
-384 3 1
-3616 3 0
-748 0 1
-3001 0 10
-541 1 0
-286 1 1
-22 0 1
-250 1 1
-27 1 1
-898 1 0
-1161 0 2
-2067 0 1
-8000 0 12
-857 29 0
-1399
-
-chain 72788 chr6_qbl_hap2 4565931 + 3808375 3809175 chr11 135006516 + 118201008 118201901 1739030
-615 13 107
-119 2 1
-51
-
-chain 65509 chr6_qbl_hap2 4565931 + 2258974 2259668 chr6 171115067 - 140105134 140105832 1929446
-178 0 4
-516
-
-chain 50097 chr6_qbl_hap2 4565931 + 2471491 2473781 chr6 171115067 + 44553942 44556234 2550079
-125 147 147
-81 297 298
-77 380 378
-160 345 343
-82 181 182
-60 299 303
-56
-
-chain 30865 chr6_qbl_hap2 4565931 + 3800272 3800791 chr6 171115067 + 32713281 32713770 4500604
-73 89 59
-184 77 77
-96
-
-chain 26769 chr6_qbl_hap2 4565931 + 2218659 2218944 chr1 249250621 - 83463584 83463869 6084938
-285
-
-chain 25453 chr6_qbl_hap2 4565931 + 1111775 1112573 chr8 146364022 + 94982474 94983353 6804147
-181 108 108
-72 385 466
-52
-
-chain 18586 chr6_qbl_hap2 4565931 + 2472758 2473366 chr3 198022430 - 151831455 151832050 2830221
-34 221 221
-81 91 91
-5 35 35
-55 44 31
-42
-
-chain 18520 chr6_qbl_hap2 4565931 + 2558133 2558568 chr13 115169878 - 5075411 5075846 11677159
-71 220 220
-144
-
-chain 17263 chr6_qbl_hap2 4565931 + 3694162 3694369 chr4 191154276 + 3927369 3927573 12785974
-50 3 0
-26 4 4
-124
-
-chain 16745 chr6_qbl_hap2 4565931 + 2589692 2589893 chr11 135006516 + 74748600 74748801 13289219
-113 12 12
-76
-
-chain 15761 chr6_qbl_hap2 4565931 + 3069257 3069435 chr19 59128983 - 18504215 18504393 607285
-59 1 1
-45 1 1
-72
-
-chain 15688 chr6_qbl_hap2 4565931 + 3804298 3804527 chr11 135006516 - 109492289 109492518 14350697
-129 50 50
-50
-
-chain 14458 chr6_qbl_hap2 4565931 + 3751685 3752808 chr6 171115067 + 32441118 32442245 15662572
-59 270 268
-88 656 662
-50
-
-chain 14065 chr6_qbl_hap2 4565931 + 3705931 3706083 chr6 171115067 - 138602057 138602209 16122341
-152
-
-chain 13955 chr6_qbl_hap2 4565931 + 2589304 2589471 chr9 141213431 - 10269188 10269355 16251226
-93 11 11
-63
-
-chain 13115 chr6_qbl_hap2 4565931 + 937718 937855 chr7 159138663 + 102343613 102343750 17340123
-137
-
-chain 12452 chr6_qbl_hap2 4565931 + 4213437 4214179 chr12 133851895 + 124586233 124586652 1913233
-57 408 105
-14 32 63
-45 0 78
-44 129 0
-13
-
-chain 12361 chr6_qbl_hap2 4565931 + 1150685 1150815 chr1 249250621 + 48985442 48985572 18455294
-130
-
-chain 12272 chr6_qbl_hap2 4565931 + 2479004 2479160 chrX 155270560 + 155194421 155194569 18587559
-71 1 1
-25 8 0
-51
-
-chain 12201 chr6_qbl_hap2 4565931 + 1105096 1105867 chr6 171115067 - 139876162 139876935 18699321
-54 620 622
-97
-
-chain 12178 chr6_qbl_hap2 4565931 + 3776349 3776515 chr14 107349540 - 58393926 58394091 18734379
-55 26 25
-85
-
-chain 12008 chr6_qbl_hap2 4565931 + 3700751 3700880 chr8 146364022 + 49154427 49154556 18990653
-129
-
-chain 11752 chr6_qbl_hap2 4565931 + 3745259 3747655 chr6 171115067 + 32491461 32493852 19428924
-56 676 682
-61 1516 1505
-87
-
-chain 11746 chr6_qbl_hap2 4565931 + 1097944 1098092 chr7 159138663 - 7702899 7703047 19437479
-54 14 14
-80
-
-chain 11503 chr6_qbl_hap2 4565931 + 3698827 3699253 chr11 135006516 - 111045874 111046295 19852910
-57 287 282
-82
-
-chain 10738 chr6_qbl_hap2 4565931 + 3700459 3700580 chr10 135534747 + 59600699 59600817 21255899
-61 3 0
-57
-
-chain 10686 chr6_qbl_hap2 4565931 + 2478152 2478673 chr18 78077248 + 11342173 11342695 21355061
-80 388 389
-53
-
-chain 10496 chr6_qbl_hap2 4565931 + 3696510 3696620 chr1 249250621 - 174039531 174039641 21744609
-110
-
-chain 10342 chr6_qbl_hap2 4565931 + 3714159 3714889 chr6 171115067 + 32548581 32549235 22073729
-78 598 522
-54
-
-chain 9560 chr6_qbl_hap2 4565931 + 1152614 1152715 chr6 171115067 - 141323187 141323288 23857063
-101
-
-chain 9560 chr6_qbl_hap2 4565931 + 1099695 1099796 chr6 171115067 - 141323187 141323288 23857064
-101
-
-chain 9385 chr6_qbl_hap2 4565931 + 3825573 3825778 chr16 90354753 - 20685009 20685189 24272037
-58 92 67
-55
-
-chain 9214 chr6_qbl_hap2 4565931 + 1102327 1102424 chr6 171115067 + 29758158 29758255 24607529
-97
-
-chain 9048 chr6_qbl_hap2 4565931 + 3694493 3695083 chr16 90354753 - 14504923 14505798 16016601
-79 460 745
-51
-
-chain 8993 chr6_qbl_hap2 4565931 + 2558568 2558745 chr2 243199373 + 116390976 116391155 17783325
-1 102 104
-74
-
-chain 8702 chr6_qbl_hap2 4565931 + 3686082 3686238 chr6 171115067 + 32439449 32439606 25393693
-54 51 52
-51
-
-chain 8427 chr6_qbl_hap2 4565931 + 3804527 3804616 chr6 171115067 - 148948316 148948405 15963296
-89
-
-chain 7704 chr6_qbl_hap2 4565931 + 3688237 3688318 chr6 171115067 + 32557831 32557912 26927503
-81
-
-chain 6794 chr6_qbl_hap2 4565931 + 3775350 3775421 chr3 198022430 - 94748615 94748686 28659148
-71
-
-chain 6473 chr6_qbl_hap2 4565931 + 3694610 3694683 chr1 249250621 - 102907635 102907704 21815174
-11 4 0
-58
-
-chain 6457 chr6_qbl_hap2 4565931 + 1158502 1158569 chr6 171115067 + 30228837 30228904 29438118
-67
-
-chain 6422 chr6_qbl_hap2 4565931 + 3817908 3817976 chr6 171115067 + 32728707 32728775 29535243
-68
-
-chain 6368 chr6_qbl_hap2 4565931 + 2478912 2479004 chr6 171115067 - 132617434 132617532 20998654
-55 29 35
-8
-
-chain 5830 chr6_qbl_hap2 4565931 + 1098157 1098218 chr7 159138663 - 104622057 104622118 31091038
-61
-
-chain 5757 chr6_qbl_hap2 4565931 + 3825218 3825278 chr14 107349540 - 70017731 70017791 31292281
-60
-
-chain 5558 chr6_qbl_hap2 4565931 + 2472407 2472466 chr15 102531392 + 37673660 37673719 31870719
-59
-
-chain 5479 chr6_qbl_hap2 4565931 + 1111956 1112025 chr9 141213431 - 103321949 103322018 11235972
-69
-
-chain 5339 chr6_qbl_hap2 4565931 + 3885926 3885982 chrX 155270560 + 55718242 55718298 32499987
-56
-
-chain 5185 chr6_qbl_hap2 4565931 + 3788909 3788964 chr14 107349540 + 22827226 22827281 32987373
-55
-
-chain 5179 chr6_qbl_hap2 4565931 + 1150896 1150960 chr19 59128983 - 37357346 37357410 20742827
-53 10 10
-1
-
-chain 5176 chr6_qbl_hap2 4565931 + 1100596 1100651 chr14 107349540 + 79349485 79349540 33029769
-55
-
-chain 5058 chr6_qbl_hap2 4565931 + 3771065 3771119 chr1 249250621 - 172942963 172943017 33379587
-54
-
-chain 5039 chr6_qbl_hap2 4565931 + 2475495 2475548 chr7 159138663 - 94193358 94193411 33438564
-53
-
-chain 5038 chr6_qbl_hap2 4565931 + 1148806 1148858 chr6 171115067 + 29856463 29856515 33456716
-52
-
-chain 4959 chr6_qbl_hap2 4565931 + 3696457 3696510 chr18 78077248 + 5090594 5090647 22176919
-53
-
-chain 4949 chr6_qbl_hap2 4565931 + 3825516 3825569 chrX 155270560 - 91231208 91231261 33742123
-53
-
-chain 4829 chr6_qbl_hap2 4565931 + 1159026 1159076 chr6 171115067 + 30459319 30459369 34177698
-50
-
-chain 4685 chr6_qbl_hap2 4565931 + 3719592 3719642 chr12 133851895 + 112261417 112261467 34690970
-50
-
-chain 4391 chr6_qbl_hap2 4565931 + 4214058 4214103 chrX 155270560 - 99494613 99494658 30227326
-45
-
-chain 4348 chr6_qbl_hap2 4565931 + 3739277 3739323 chr7 159138663 - 76863668 76863714 34891433
-46
-
-chain 4338 chr6_qbl_hap2 4565931 + 2201356 2201401 chr6 171115067 + 30954494 30954539 34909104
-45
-
-chain 4061 chr6_qbl_hap2 4565931 + 2201872 2201914 chr6 171115067 + 30955145 30955187 31149648
-42
-
-chain 4003 chr6_qbl_hap2 4565931 + 2470663 2474155 chr12 133851895 + 104783555 104787047 2981748
-99 961 960
-40 481 480
-76 473 472
-44 1256 1259
-62
-
-chain 3775 chr6_qbl_hap2 4565931 + 2471376 2471416 chr10 135534747 - 90944157 90944197 25967017
-40
-
-chain 3639 chr6_qbl_hap2 4565931 + 3694572 3694610 chr3 198022430 + 101411146 101411184 20382400
-38
-
-chain 3574 chr6_qbl_hap2 4565931 + 2470595 2470633 chr3 198022430 - 173409162 173409200 29596632
-38
-
-chain 3494 chr6_qbl_hap2 4565931 + 3700422 3700459 chrX 155270560 + 104134375 104134412 29536090
-37
-
-chain 3491 chr6_qbl_hap2 4565931 + 2471293 2472133 chr8 146364022 - 12751685 12752521 3617865
-79 701 697
-60
-
-chain 3436 chr6_qbl_hap2 4565931 + 2471844 2473225 chr1 249250621 + 7474211 7475590 2872741
-34 959 957
-58 295 295
-35
-
-chain 3220 chr6_qbl_hap2 4565931 + 3776529 3776563 chr12 133851895 + 85826623 85826657 35349035
-34
-
-chain 3148 chr6_qbl_hap2 4565931 + 3825631 3825664 chr2 243199373 + 38182693 38182726 24706670
-33
-
-chain 2975 chr6_qbl_hap2 4565931 + 2478232 2478268 chr3 198022430 - 94213030 94213066 24807218
-36
-
-chain 2972 chr6_qbl_hap2 4565931 + 1105868 1105908 chr6 171115067 + 30459045 30459085 20759384
-40
-
-chain 2845 chr6_qbl_hap2 4565931 + 2470633 2470663 chr3 198022430 - 156603737 156603767 26791326
-30
-
-chain 2838 chr6_qbl_hap2 4565931 + 2474990 2475020 chr4 191154276 + 92075174 92075204 21730347
-30
-
-chain 2761 chr6_qbl_hap2 4565931 + 3804625 3804685 chr4 191154276 + 37278694 37278754 22658556
-60
-
-chain 2671 chr6_qbl_hap2 4565931 + 2478852 2478911 chr9 141213431 - 60456470 60456529 21094091
-59
-
-chain 2604 chr6_qbl_hap2 4565931 + 1151032 1151059 chr17 81195210 + 6784720 6784747 30920849
-27
-
-chain 2579 chr6_qbl_hap2 4565931 + 3700720 3700751 chr21 48129895 + 18677639 18677670 26190064
-31
-
-chain 2574 chr6_qbl_hap2 4565931 + 1150960 1151032 chrX 155270560 + 72544773 72544845 18935818
-72
-
-chain 2481 chr6_qbl_hap2 4565931 + 3804442 3804477 chr3 198022430 - 58737971 58738006 17138123
-35
-
-chain 2394 chr6_qbl_hap2 4565931 + 2478673 2478698 chr11 135006516 - 67345781 67345806 29321362
-25
-
-chain 2363 chr6_qbl_hap2 4565931 + 2473435 2473485 chr3 198022430 - 59783725 59783775 3613581
-50
-
-chain 2322 chr6_qbl_hap2 4565931 + 2470859 2470989 chr15 102531392 - 72822940 72823070 3150079
-130
-
-chain 2266 chr6_qbl_hap2 4565931 + 2470989 2471957 chr9 141213431 - 114376815 114377769 4168715
-45 845 831
-78
-
-chain 2263 chr6_qbl_hap2 4565931 + 2471123 2471268 chr12 133851895 + 84401354 84401499 4041581
-145
-
-chain 2209 chr6_qbl_hap2 4565931 + 2470765 2470818 chr3 198022430 + 182918728 182918781 9563966
-53
-
-chain 2087 chr6_qbl_hap2 4565931 + 2558317 2558369 chrX 155270560 - 89201309 89201361 22578016
-52
-
-chain 2078 chr6_qbl_hap2 4565931 + 1112026 1112064 chr3 198022430 + 120909358 120909396 13027265
-38
-
-chain 2035 chr6_qbl_hap2 4565931 + 2557888 2557938 chr16 90354753 + 47212776 47212826 17692575
-50
-
-chain 1978 chr6_qbl_hap2 4565931 + 4213820 4213948 chr15 102531392 - 61555806 61555934 2051418
-28 68 68
-32
-
-chain 1899 chr6_qbl_hap2 4565931 + 2558399 2558424 chrX 155270560 + 94068150 94068175 17734181
-25
-
-chain 1860 chr6_qbl_hap2 4565931 + 1112180 1112230 chr8 146364022 + 68079613 68079663 13479327
-50
-
-chain 1860 chr6_qbl_hap2 4565931 + 3812269 3815784 chr6 171115067 + 32722816 32726965 29521084
-61 2506 2690
-85 515 965
-52 103 103
-193
-
-chain 1828 chr6_qbl_hap2 4565931 + 2473656 2473684 chr14 107349540 - 54723100 54723128 20222699
-28
-
-chain 1658 chr6_qbl_hap2 4565931 + 1112136 1112169 chr4 191154276 + 153686345 153686378 11053932
-33
-
-chain 1514 chr6_qbl_hap2 4565931 + 1112233 1112291 chr13 115169878 - 5205835 5205893 10260311
-58
-
-chain 1396 chr6_qbl_hap2 4565931 + 2473606 2473656 chr1 249250621 + 83820278 83820328 4577579
-50
-
-chain 1388 chr6_qbl_hap2 4565931 + 4214123 4214166 chr19 59128983 - 43654778 43654821 2801865
-43
-
-chain 1329 chr6_qbl_hap2 4565931 + 2557727 2557778 chr7 159138663 - 55106997 55107048 20610784
-51
-
-chain 1304 chr6_qbl_hap2 4565931 + 4213365 4213389 chr1 249250621 + 182710286 182710310 2078906
-24
-
-chain 1296 chr6_qbl_hap2 4565931 + 4213389 4213424 chr8 146364022 + 99694 99728 9829550
-12 1 0
-22
-
-chain 1233 chr6_qbl_hap2 4565931 + 2558102 2558133 chr5 180915260 + 67992831 67992862 12309329
-31
-
-chain 1171 chr6_qbl_hap2 4565931 + 2473569 2473606 chrX 155270560 - 90928252 90928289 23413190
-37
-
-chain 1170 chr6_qbl_hap2 4565931 + 2471983 2472043 chr9 141213431 + 232427 232487 4190853
-60
-
-chain 1144 chr6_qbl_hap2 4565931 + 2469449 2469508 chr2 243199373 + 81796678 81796737 21594602
-59
-
-chain 1125 chr6_qbl_hap2 4565931 + 3694759 3694827 chr8 146364022 - 86779351 86779419 20749390
-68
-
-chain 1106 chr6_qbl_hap2 4565931 + 1112362 1112413 chr1 249250621 - 17660691 17660742 13643228
-51
-
-chain 1071 chr6_qbl_hap2 4565931 + 2470508 2470575 chr12 133851895 + 78891507 78891574 9444392
-67
-
-chain 1040 chr6_qbl_hap2 4565931 + 2470400 2470457 chr5 180915260 - 146134722 146134779 6672758
-57
-
-chain 1023 chr6_qbl_hap2 4565931 + 2471416 2471471 chr2 243199373 + 162554783 162554838 24613681
-55
-
-chain 935 chr6_qbl_hap2 4565931 + 2558067 2558102 chr4 191154276 + 31205 31240 16972854
-35
-
-chain 919 chr6_qbl_hap2 4565931 + 2474702 2474762 chr4 191154276 + 45112377 45112437 22402157
-60
-
-chain 902 chr6_qbl_hap2 4565931 + 2474552 2474612 chr5 180915260 - 23766246 23766306 4704228
-60
-
-chain 884 chr6_qbl_hap2 4565931 + 2473696 2473725 chr1 249250621 - 199045131 199045160 12500824
-29
-
-chain 825 chr6_qbl_hap2 4565931 + 1112413 1112452 chr1 249250621 - 184583816 184583855 16072417
-39
-
-chain 801 chr6_qbl_hap2 4565931 + 2470111 2470156 chr1 249250621 - 71436588 71436633 19248116
-45
-
-chain 789 chr6_qbl_hap2 4565931 + 3698600 3699777 chr19 59128983 + 8446620 8447803 26630175
-58 1059 1065
-60
-
-chain 788 chr6_qbl_hap2 4565931 + 2470239 2470322 chr6 171115067 + 137168270 137168353 4512040
-83
-
-chain 740 chr6_qbl_hap2 4565931 + 1112667 1112731 chr12 133851895 + 57178267 57178331 20850792
-64
-
-chain 718 chr6_qbl_hap2 4565931 + 2474782 2474837 chr9 141213431 - 49469911 49469966 23568604
-55
-
-chain 694 chr6_qbl_hap2 4565931 + 2469923 2469992 chrX 155270560 - 140437581 140437650 5405913
-69
-
-chain 584 chr6_qbl_hap2 4565931 + 2474349 2474405 chr15 102531392 + 67105223 67105279 15249534
-56
-
-chain 562 chr6_qbl_hap2 4565931 + 2557778 2557819 chrX 155270560 + 91975692 91975733 21019876
-41
-
-chain 562 chr6_qbl_hap2 4565931 + 2469824 2469884 chr2 243199373 - 169790362 169790422 25410177
-60
-
-chain 552 chr6_qbl_hap2 4565931 + 2237356 2237383 chr17 81195210 - 14890828 14890855 11066346
-27
-
-chain 523 chr6_qbl_hap2 4565931 + 2470057 2470111 chr13 115169878 + 42049099 42049153 16964924
-54
-
-chain 489 chr6_qbl_hap2 4565931 + 2469992 2470048 chr14 107349540 + 79003493 79003549 5260265
-56
-
-chain 481 chr6_qbl_hap2 4565931 + 2470189 2470239 chr8 146364022 + 50441810 50441860 5267091
-50
-
-chain 481 chr6_qbl_hap2 4565931 + 2469386 2469447 chr1 249250621 - 193322918 193322979 8728434
-61
-
-chain 455 chr6_qbl_hap2 4565931 + 2472488 2472547 chr6 171115067 - 85200236 85200295 17778688
-59
-
-chain 445 chr6_qbl_hap2 4565931 + 2469210 2469265 chrX 155270560 - 127487766 127487821 16318369
-55
-
-chain 358 chr6_qbl_hap2 4565931 + 2475020 2475084 chr4 191154276 + 74158363 74158427 16300933
-64
-
-chain 347 chr6_qbl_hap2 4565931 + 2469153 2469203 chr15 102531392 - 65978487 65978537 12839283
-50
-
-chain 246 chr6_qbl_hap2 4565931 + 3697415 3697467 chr12 133851895 - 104314075 104314127 28162397
-52
-
-chain 47340388 chr6_random 1875562 + 1357431 1875562 chr6 171115067 + 157393490 158069469 78
-906 2 2
-193 1 0
-29 1 0
-8 10 8
-11 2 1
-842 41 40
-754 2304 72101
-91082 5628 50000
-31833 338 50000
-42477 272 0
-39 168 66
-53 1 1
-15 1 103
-64 2 172
-23 1 103
-14474 4 0
-30198 0 8
-1391 2 0
-1319 4 0
-142 0 3
-3412 9 7
-372 1 1
-22 1 1
-5871 0 1
-237 26 25
-3020 1 1
-83 1 1
-141 7 7
-201 2 1
-403 1 0
-3638 1 0
-20 1 0
-552 32 32
-1386 0 1
-4174 1 1
-37 1 1
-3912 5 5
-4160 2 0
-6561 0 1
-3879 0 1
-8665 0 1
-2170 0 3
-895 1 0
-1812 0 1
-36 0 4
-133 1 0
-165 0 9
-427 0 1
-917 1 0
-3166 0 1
-16647 1 0
-6161 10 10
-833 4 0
-1934 1 1
-56 1 1
-2622 9 9
-749 1 0
-482 0 2
-344 1 1
-32 1 1
-868 2 0
-444 0 3
-1096 12 0
-709 0 1
-113 1 1
-35 1 1
-2349 20 0
-175 0 1
-1675 0 2
-1206 0 3
-345 0 5
-4695 1 0
-6715 1 1
-35 1 1
-2131 0 1
-4220 8 0
-2065 1 0
-1986 0 1
-484 0 1
-1543 4 4
-52 22 0
-5090 0 1
-2768 9 2
-12577 0 5
-13727 9 9
-51 4 4
-26 2 3
-11 0 1
-735 1 1
-35 0 1
-12 1 1
-2616 1 0
-327 1 1
-35 1 1
-345 0 20
-50 98 187
-975 1 0
-7329 0 1
-3241 0 35
-583 5 5
-278 1 1
-40 1 1
-123 12 12
-1208 17 0
-477 0 1
-163 1 1
-28 1 1
-3307 1 0
-66 1 1
-25 4 0
-2459 0 1
-1326 1 0
-700 1 0
-2316 6067 13
-725 3 0
-42 1 1
-8162 0 2
-2147 0 2
-79 1 1
-25 1 1
-313 1 0
-2194 1 0
-709 1 1
-33 1 1
-934 4 4
-543 1 1
-37 1 1
-2581 1 0
-606 1 0
-666 1 1
-34 2 2
-250 9 8
-652 1 0
-2306 22 0
-38 0 24
-946 1 0
-3766 1 1
-57 1 1
-3591 2 0
-128 1 1
-1414 7 1
-435 1 1
-29 1 0
-529 0 1
-3649 1 1
-32 0 1
-9760 0 18
-6470 1 1
-49 1 1
-488 0 1
-304 2 0
-1780 0 5
-2759 1 0
-48 1 1
-380 1 1
-33 1 1
-5102 1 1
-33 1 1
-192 0 1
-1103 1 1
-29 1 1
-12912 0 1
-9445 2 0
-2949 1 1
-28 1 1
-826 1 1
-19 1 1
-404 1 1
-49 1 1
-1408 8 0
-1625 10 0
-2962 0 1
-1824
-
-chain 37689909 chr6_random 1875562 + 884671 1286589 chr5 180915260 - 167715260 168127349 92
-6889 0 1
-34829 1 0
-4156 0 2
-4477 0 8
-7827 0 415
-37 9 9
-207 0 1
-272 7 7
-7925 1 0
-75982 0 1
-11336 0 1
-4233 14 14
-362 10 10
-4607 4 0
-1310 0 3
-1741 4 0
-499 1 1
-69 1 1
-509 15 15
-166 12 8
-145 0 2
-66 1 1
-16 1 1
-325 1 1
-31 1 1
-804 1 1
-109 1 1
-1071 0 106
-73 38 121
-1998 1 1
-37 1 1
-500 0 5
-625 3 0
-2354 1 1
-42 1 1
-1652 0 1
-92 1 1
-68 1 1
-1023 1 1
-16 1 1
-849 2 1
-28 1 1
-1793 4 2
-850 26 26
-251 0 2
-794 1 1
-26 1 1
-798 1 1
-80 1 1
-211 20 12
-153 1 3
-373 6 6
-231 0 4
-302 1 1
-26 1 1
-305 0 4
-3735 1 0
-342 0 2
-2211 0 1
-1969 2 0
-2834 0 10
-1054 0 14
-2176 0 2
-10517 0 2
-3071 6 0
-5697 21 21
-2458 0 5
-1335 3 0
-411 1 5
-2718 10 11
-3652 1 0
-785 1 0
-777 1 0
-2088 0 1
-24 1 1
-1005 16 16
-5426 18 0
-378 1 0
-19 1 1
-5303 0 14
-19 18 0
-2125 1 0
-936 0 5
-29 1 1
-893 19 19
-312 0 2
-32151 1 0
-14548 1 0
-109 0 1
-1481 1 0
-6537 0 2
-3390 1 0
-7479 6 0
-29963 4 0
-3972 9 5
-1637 0 9
-7977 1 0
-1973 0 3
-1212 0 5
-372 29 19
-1216 0 50
-628 0 4
-8388 0 1
-1429 1 0
-3029 2 4
-785 1 0
-291 10 9516
-1642 0 1
-5042 1 0
-1117 1 0
-1558 8 7
-1475 4 0
-1859 0 1
-9528 0 1
-877
-
-chain 31999718 chr6_random 1875562 + 165017 507468 chr6 171115067 - 55532370 55875067 101
-42954 0 1
-24905 1 0
-579 0 6
-612 0 1
-1128 0 2
-5541 1 1
-30 1 1
-2064 1 0
-505 0 1
-1974 0 1
-5299 1 1
-16 1 1
-368 1 1
-28 1 1
-7024 1 0
-19574 8 9
-6646 4 0
-6060 0 1
-2290 0 1
-22638 6 58
-1402 0 1
-502 0 1
-218 0 1
-5768 0 1
-178 0 3
-659 1 1
-33 0 8
-92 4 0
-693 0 2
-1190 0 3
-375 5 0
-422 3 0
-2215 1 0
-7271 1 1
-33 1 1
-817 1 1
-67 1 1
-2442 1 1
-62 16 0
-165 1 0
-1535 1 1
-32 1 1
-596 4 4
-627 1 1
-22 1 2
-201 5 5
-35 1 1
-232 5 0
-651 4 4
-26 1 1
-105 1 1
-45 1 1
-325 1 1
-34 1 1
-265 1 1
-91 2 0
-1383 1 1
-35 1 1
-1469 19 19
-295 0 1
-644 0 1
-3324 1 1
-44 1 1
-1797 1 5
-21 2 0
-10 11 1
-58 2 0
-61 1 9
-715 0 1
-388 1 1
-47 1 1
-774 1 0
-571 0 3
-2308 0 1
-103 15 15
-1339 1 1
-19 1 1
-348 0 1
-372 1 1
-31 0 1
-4 4 0
-14 1 5
-14 1 25
-4634 1 1
-16 2 2
-305 27 24
-2252 10 217
-1695 0 2
-2541 0 7
-741 2 0
-1401 0 2
-202 2 13
-3853 1 0
-3037 36 0
-18 2 0
-25 94 0
-14 0 4
-487 0 1
-5889 0 1
-572 1 1
-17 1 1
-806 1 1
-24 1 1
-723 0 2
-1640 1 0
-2023 1 1
-21 1 1
-192 15 1
-994 0 106
-1362 2 0
-324 1 1
-19 1 1
-683 1 1
-39 1 0
-771 1 0
-1211 13 0
-1728 1 1
-23 1 1
-911 0 2
-1042 6 6
-206 5 0
-17 1 1
-3351 14 19
-783 1 1
-48 1 1
-673 0 4
-137 1 1
-23 1 0
-1357 4 0
-254 0 1
-1408 0 7
-564 1 1
-49 1 1
-319 13 13
-721 12 12
-821 2 0
-912 4 4
-47 1 1
-148 1 1
-61 1 1
-267 1 1
-46 1 1
-421 1 1
-36 1 1
-577 1 1
-35 1 1
-122 1 1
-95 1 1
-241 1 1
-40 1 1
-585 10 1
-1286 0 1
-97 2 0
-22 1 1
-969 0 1
-1448 14 20
-2000 1 0
-1448 0 1
-2390 1 1
-18 5 5
-1421 1 0
-412 0 1
-1867 2 1
-179 3 0
-852 1 0
-1426 20 18
-151 1 1
-26 1 1
-581 1 1
-86 2 1
-2659 1 0
-12163 2 0
-1149 13 13
-818 16 16
-113 1 1
-51 1 1
-343 1 1
-91 0 4
-7 2 0
-8 0 2
-914 1 1
-28 1 1
-670 1 0
-151 7 7
-1887 18 18
-119 0 5
-2395 2 0
-4395 0 6
-380 6 1
-423 17 17
-531 1 0
-23 0 6
-592 1 1
-23 1 0
-844 4 0
-1497 6 0
-407 17 17
-341 19 17
-1020 0 6
-178 1 0
-1233 0 1
-1861 0 1
-2007 2 0
-6480 1 1
-36 1 1
-6817 17 20
-3356 7 5
-1788 1 1
-83 0 1
-7678 18 18
-2095 1 1
-19 1 1
-4934
-
-chain 25195472 chr6_random 1875562 + 615192 884135 chr6 171115067 + 167833423 168297434 120
-2006 1 0
-2654 1 1
-28 1 1
-3139 1 1
-85 1 1
-690 0 1
-639 0 2
-1589 4 4
-122 2 0
-1127 0 1
-1104 1 102
-18 0 29
-40 0 3
-22 1 4
-50 0 26
-56 124 195105
-10440 18 25
-3042 0 24
-72 0 8
-206 4 0
-146 4 0
-2483 0 4
-702 0 1
-1035 0 8
-85 3 1
-2710 1 1
-84 1 1
-3774 1 1
-58 1 1
-20613 15 53
-14 32 0
-52 0 4
-1883 4 0
-52 3 0
-44036 171 0
-2224 2 2
-57 1 1
-7263 0 64
-5311 0 2
-24677 8 8
-1972 1 0
-3543 2 2
-46 1 0
-11768 1 0
-494 47 19
-36447 1 1
-67 1 1
-11347 8 0
-4230 1 3
-591 5 5
-1020 0 8
-680 1 1
-60 1 1
-4536 0 1
-1417 0 2
-2471 1 1
-22 1 1
-6781 0 5
-4943 5 0
-1067 2 0
-2588 2 0
-523 34 35
-9266 0 2
-3897 0 2
-1404 0 1
-3120 0 1
-2566 1 0
-1825 0 8
-5342
-
-chain 9830417 chr6_random 1875562 + 510011 615192 chr5 180915260 - 108917398 109022458 335
-331 57 57
-1247 1 0
-4094 15 15
-6775 12 0
-6148 1 0
-30 1 1
-251 0 1
-26 26 1
-238 1 1
-29 1 1
-148 1 1
-41 1 1
-5831 6 7
-2439 1 0
-4247 12 42
-2333 1 9
-3039 5 0
-476 2 2
-4359 0 1
-1237 11 11
-1223 12 0
-2800 2 0
-2660 0 1
-4531 1 1
-24 1 1
-7407 0 1
-395 2 0
-1841 391 0
-410 50 26
-321 1 1
-27 1 1
-226 9 9
-157 6 6
-80 1 1
-70 1 1
-5158 10 10
-1385 4 0
-991 0 2
-48 1 1
-1083 0 2
-751 0 1
-4266 1 1
-48 1 1
-1557 0 304
-1552 1 1
-21 1 1
-2652 1 0
-598 0 8
-115 15 16
-1277 1 1
-38 1 1
-898 1 1
-27 1 1
-699 0 1
-34 1 1
-279 4 0
-12 1 1
-2863 1 1
-25 1 1
-2484 12 15
-1447 1 0
-8689
-
-chain 8736931 chr6_random 1875562 + 25094 155092 chr6 171115067 - 3172994 3267843 378
-3079 5 5
-1125 2 0
-1270 7 14
-1955 1 1
-47 1 1
-4538 38 38
-1300 25 26
-67 7 8
-176 3 0
-1132 3 0
-906 103 48
-5311 0 16
-133 1 0
-94 153 987
-142 13 13
-2453 2 0
-238 2 0
-960 13 13
-4697 1 1
-26 1 1
-3575 36650 734
-4434 0 1
-5190 138 107
-33 1 1
-5998 4 0
-1660 1 0
-4740 1 1
-29 1 1
-7196 0 12
-17519 30 29
-12768
-
-chain 553807 chr6_random 1875562 + 1768811 1774813 chr4 191154276 - 111879139 111885141 10762
-1294 2 2
-109 1 1
-242 1 1
-106 1 1
-2122 1 1
-17 1 1
-200 1 1
-40 1 1
-1071 1 1
-24 1 1
-284 1 1
-77 1 1
-403
-
-chain 255982 chr6_random 1875562 + 1456339 1459136 chr6 171115067 + 157377507 157380303 364419
-1101 4 4
-21 1 0
-70 43 44
-1490 1 0
-66
-
-chain 238316 chr6_random 1875562 + 1453720 1456237 chr6 171115067 - 13762873 13765390 431401
-2517
-
-chain 190390 chr6_random 1875562 + 1355230 1357270 chr6 171115067 - 13765611 13767650 644275
-875 0 1
-30 1 0
-7 0 1
-32 2 0
-1093
-
-chain 147846 chr6_random 1875562 + 163259 164828 chr10 135534747 - 86648034 86649603 870502
-1569
-
-chain 66179 chr6_random 1875562 + 509035 509994 chr6 171115067 - 55868072 55869030 1909901
-52 241 240
-666
-
-chain 39557 chr6_random 1875562 + 507468 508471 chr14 107349540 - 76514262 76515265 2447482
-67 13 13
-252 48 48
-70 43 43
-73 340 340
-97
-
-chain 15445 chr6_random 1875562 + 574580 574743 chr6 171115067 + 168277787 168277950 14597733
-163
-
-chain 11899 chr6_random 1875562 + 508034 508258 chr7 159138663 - 61729371 61729595 2527246
-50 119 119
-55
-
-chain 6795 chr6_random 1875562 + 508264 508336 chr5 180915260 + 74550099 74550171 28643390
-72
-
-chain 5830 chr6_random 1875562 + 884328 884389 chr6 171115067 - 37135398 37135459 31091070
-61
-
-chain 5767 chr6_random 1875562 + 508601 508846 chr8 146364022 + 54253304 54253548 3655159
-50 103 102
-92
-
-chain 4821 chr6_random 1875562 + 16131 16182 chr10 135534747 - 59552661 59552712 34213212
-51
-
-chain 3598 chr6_random 1875562 + 720272 720329 chr6 171115067 + 168133749 168133806 2857460
-57
-
-chain 3185 chr6_random 1875562 + 1768774 1768810 chr2 243199373 + 130168617 130168653 16948
-36
-
-chain 2982 chr6_random 1875562 + 508896 508970 chr12 133851895 - 4327021 4327095 12758815
-74
-
-chain 2685 chr6_random 1875562 + 509240 510388 chr3 198022430 - 97729559 97730704 3388749
-33 1069 1066
-46
-
-chain 2530 chr6_random 1875562 + 720329 720365 chr6 171115067 + 168133920 168133956 3810246
-36
-
-chain 2208 chr6_random 1875562 + 720386 720422 chr6 171115067 + 168133692 168133728 3917950
-36
-
-chain 1957 chr6_random 1875562 + 507800 507848 chr1 249250621 - 36684504 36684552 2679811
-48
-
-chain 1423 chr6_random 1875562 + 508846 508894 chr2 243199373 - 143356177 143356225 7803118
-48
-
-chain 1172 chr6_random 1875562 + 508537 508601 chrX 155270560 + 123719418 123719482 4007841
-64
-
-chain 1047 chr6_random 1875562 + 509273 509328 chr20 63025520 + 3479096 3479151 2808508
-55
-
-chain 560 chr6_random 1875562 + 508669 508719 chr5 180915260 - 128392227 128392277 20287927
-50
-
-chain 14618906734 chr7 158821424 + 102995 158821424 chr7 159138663 + 10238 159128663 7
-973 5 0
-3912 0 2
-1234 4 0
-51 0 6
-70 1 1
-24 1 0
-143 8 0
-16 170 1
-47 1 1
-243 0 6
-913 3 0
-2538 980 0
-63 1610 0
-1362 0 1
-2104 0 456
-1158 0 1
-791 1 1
-49 0 1
-4175 8 0
-17 1 1
-4845 12 0
-2509 0 1
-1697 6 6
-192827 150000 278557
-5682472 0 1
-42007910 40000 35970
-4371 7 16
-17699 0 4
-5249 4 0
-2088410 1 1
-47 1 1
-4565 0 1
-7116 0 1
-2706 40000 43050
-6577293 50000 13552
-1052855 3000000 3000000
-256182 50000 416507
-190137 50000 50000
-5722629 24 25
-239 1 1
-59 2 2
-138 1 1
-34 1 1
-206 1 3
-18 1 0
-410 1 1
-72 1 1
-199 1 1
-62 5 5
-120 1 0
-468 1 1
-32 1 1
-264 1 1
-23 1 1
-1459 4 4
-107 1 1
-42 1 0
-14 1 1
-201 1 1
-46 1 1
-268 20 20
-303 2 1
-866 0 4
-76 3 3
-63 1 1
-74 1 0
-25 1 1
-66 1 1
-34 0 2
-180 35 36
-93 1 1
-41 1 1
-70 1 1
-49 1 1
-63 1 1
-57 1 1
-383 1 1
-133 1 1
-87 1 1
-38 4 4
-50 0 1
-46 5 6
-136 11 11
-200 1 1
-63 4 0
-6 9 0
-263 1 1
-32 3 3
-152 16 16
-567 1 0
-322 3 0
-1258 0 1
-505 4 0
-1141 11 10
-537 12 12
-1418 1 1
-47 0 1
-164 7 7
-90 5 0
-156 1 1
-20 1 1
-380 3 3
-41 3 0
-5 2 2
-921 1 1
-34 1 1
-1607 2 2
-73 66 0
-46 14 0
-168 1 1
-53 1 1
-3195 1 1
-23 1 1
-2115 0 14
-9872 1 0
-1204 13 13
-416 1 0
-2311 319 0
-6906 0 10
-184 24 0
-2933 4 0
-1392 0 12
-1856 5 0
-3439 0 1
-469 3 0
-771 15 12
-497 1 1
-65 1 1
-1210 0 2
-4131 10 10
-1198 1 0
-718 1 1
-21 1 1
-3668 1 0
-874 1 1
-25 1 1
-2444 0 1
-1867 1 1
-29 1 1
-1660 0 1
-1232 0 6
-784 1 0
-705 0 3
-3577 1 0
-365 1 0
-3389 8 4
-2652 0 3
-664 0 1
-169 1 0
-8 1 1
-138 0 1
-8037 0 56
-112 196 0
-495 0 35
-3028 1 1
-40 1 1
-1068 4 0
-631 0 33
-29 2 0
-86 9 1
-3081 2 0
-806 0 1
-21 1 1
-3901 26 27
-843 0 1
-6916420 250000 50000
-25789103 0 51216
-1399994 1 0
-3623 0 212
-38 1 1
-210 1 0
-5 1 0
-6 1 0
-18 1 0
-1321 16 0
-2187 1 0
-145 0 1
-1388 7 7
-2240 14 14
-771 1 1
-34 1 1
-92 1 1
-39 1 1
-505 1 0
-66 1 1
-49 1 1
-159 1 0
-78 3 0
-15 2 0
-7 1 0
-28 1 0
-27 468 5
-2022 1 0
-1796 7 7
-61 1 1
-20 1 1
-4560 3 0
-157730 1 0
-194 14 14
-650 0 12
-717 26 26
-819 0 5
-278 60 32
-69 0 5
-1345 8 0
-652 84 0
-118 0 4
-498 0 1
-3187 1 1
-43 1 1
-1476 0 3
-2101 5 0
-788 6 6
-872 0 6
-893 3 0
-155 33 33
-4610 5 7
-521 10 0
-2773 40 40
-627 43 43
-1424 0 1
-2554 8 8
-44 0 7
-615 1 1
-32 3 0
-2693 0 1
-1029 0 2
-151 0 1
-1753 0 21
-370 2 3
-969 0 1
-452 1 0
-3035 1 1
-40 1 1
-704 0 2
-2472 0 6
-238 1 0
-1442 1 1
-37 5 5
-126 0 1
-795 0 1
-1191 1 0
-171 17 16
-724 6 5
-2988 40 42
-359 2 0
-199 19 19
-1969 1 0
-251 0 1
-729 0 1
-992 27 27
-205 4 0
-3209 0 2
-1006 8 10
-1571 10 10
-756 0 1
-36 1 1
-433 0 1
-672 0 3
-4430 157 0
-5606 5 1
-17 1 1
-942 10 9
-3433 2 1
-24 1 1
-4262 13 0
-661 2 0
-167 8 0
-3474 6 11
-217 0 2
-778 34 34
-158 0 1
-1167 0 1
-684 0 1
-878 39 39
-2012 0 1
-345 52 52
-640 0 2
-27874045 0 136705
-2519 0 2
-1000 8 0
-14695 1 0
-4456 1 0
-2977 1 0
-9065130 25000 29055
-2369 1 0
-12174 18 20
-877 0 4
-5247 0 12
-3483 2 0
-6766 0 1
-2469878 0 1
-734 2 2
-99 0 1
-2471 1 1
-11 1 1
-758 8 0
-2234 13 14
-8394 1 0
-47 1 1
-903 0 1
-5537 0 1
-269 1 0
-7114 1 1
-30 1 1
-2412 0 1
-2442 21 21
-91 1 1
-37 1 1
-96 1 1
-22 1 1
-246 1 1
-23 1 1
-254 12 12
-569 1 1
-27 1 1
-1624 1 0
-112 3 3
-45 1 1
-384 13 13
-70 1 0
-658 1 1
-20 1 1
-176 1 0
-307 19 19
-428 1 1
-19 1 1
-87 1 1
-30 1 1
-140 1 0
-292 2 0
-1492 1 0
-302 0 2
-364 1 1
-35 1 1
-1956 0 1
-728 12 12
-6522 2 2
-1531 1 0
-488 1 0
-2056 18 8
-1286 1 1
-27 1 1
-731 1 0
-1423 0 7
-2010 1 1
-19 1 1
-6423 0 4
-57 1 1
-4505 13 0
-933 0 12
-1250 0 1
-1313 1 0
-2610 0 1
-2398 0 1
-453 1 0
-346 1 1
-12 1 1
-83 25 25
-83 12 12
-277 0 1
-45 1 0
-811 2 0
-164 0 1
-104 0 1
-32 1 1
-1386 0 14
-306 1 1
-43 1 1
-2765 0 1
-1819 0 1
-1480 1 1
-24 1 1
-276 0 1
-21 0 1
-119 2 0
-12 26 0
-541 1 1
-63 1 1
-180 0 1
-2456 1 0
-1055 1 0
-1166 2 0
-784 0 4
-170 1 0
-939 6 0
-5597 15 15
-1253 0 1
-3336 0 18
-1851 9 0
-45 1 1
-657 38 38
-4099 0 1
-1387 2 0
-1460 1 0
-204 0 5
-1506 0 1
-2621 1 0
-6620 0 1
-34 1 1
-249 1 0
-1440 0 10
-245 0 1
-368 1 9
-257 4 0
-1589 6 0
-1543 0 1
-4189 120 0
-354 312446 278046
-3734 24 25
-3097 1 0
-8 1 1
-4861 0 4
-5649 1 0
-2011 0 1
-4344 24 24
-10546 42 1467
-20955 0 1
-2075 2 1
-5546 1 0
-2168 4 0
-1266 1 0
-4124 1 1
-46 1 1
-54 1 1
-43 15 0
-780 1 1
-25 1 1
-497 0 1
-46 1 1
-810 0 1
-5701 0 1
-6998 0 1
-2002 0 3
-7160 1 1
-24 1 1
-479 2 0
-1872 0 1
-1192 1 0
-371 2 0
-31 1 1
-572 16 16
-1725 16 16
-588 1 1
-90 1 1
-2483 3 19
-187 0 1
-20 1 1
-3673 1 1
-27 4 0
-3021 1 0
-1323 19 6
-498 13 13
-1618 2 0
-5282 0 1
-719 0 8
-2994 1 0
-2822 0 2
-1396 1 1
-48 1 1
-8723 5 0
-291 1 1
-25 1 1
-116 0 1
-2809 1 1
-27 1 1
-224 1 1
-48 1 1
-292 0 2
-400 0 1
-754 1 1
-19 1 1
-4225 1 1
-28 1 1
-801 1 0
-671 1 1
-17 1 1
-390 1 1
-28 1 1
-84 7 7
-568 1 1
-56 1 1
-499 7 8
-266 1 1
-31 1 1
-518 18 18
-164 1 1
-50 1 1
-162 1 1
-60 1 1
-702 1 1
-28 1 1
-146 18 17
-517 1 1
-24 1 1
-686 12 12
-101 1 1
-22 5 5
-107 5 5
-277 9 9
-272 1 1
-48 1 1
-77 1 1
-67 1 1
-1548 1 1
-40 1 1
-763 1 1
-42 1 1
-541 8 8
-88 1 1
-77 1 1
-233 11 11
-311 1 1
-22 1 1
-147 1 8
-504 1 1
-26 1 1
-987 20433 0
-3090 1 0
-405 5 5
-1811 1 0
-1174 0 1
-70 1 1
-1100 10143 18
-2722 0 1
-2957 1 1
-32 1 1
-9585 0 1
-1350 0 1
-473 0 1
-675 0 1
-1435 0 1
-805423 0 79189
-10872737 100000 100000
-721570 1 1
-19 1 1
-816 1 1
-44 1 1
-572 8 6
-2021 0 4
-1001 2 0
-3757 1 0
-5942 2 2
-70 1 1
-100 7 7
-395 80000 17188
-1010 1 1
-45 1 1
-1486 18 18
-173 1 17
-15 1 17
-158 0 192
-33 0 368
-50 50 2
-40 1 1
-95 4 52
-60 39 8
-15 16 0
-92 16 0
-1589 0 1
-897 13 13
-28 3 3
-2454 1 1
-44 1 1
-301 0 468
-2030 1 1
-45 1 1
-1277 8 0
-1716 1 0
-1579 11 15
-2439 36 0
-39 37 1
-349 21 92
-2096 13 11
-192 1 1
-48 1 1
-130 1 1
-22 1 1
-970 1 1
-23 4 0
-64 0 14
-129 17 11
-154 13 14
-53 15 5
-48 1 1
-47 0 2
-114 18 16
-363 1 1
-43 1 1
-559 1 1
-32 1 1
-3980007
-
-chain 16701236 chr7 158821424 + 141723881 141902219 chr7 159138663 - 16862466 17040468 171
-1662 1 1
-69 1 1
-887 1 1
-16 1 1
-115 339 1
-1512 0 1
-3597 0 1
-309 2 0
-34 1 1
-623 0 2
-1746 2 0
-816 4 0
-7868 1 0
-22 0 4
-593 0 1
-2757 0 1
-1147 7 7
-134 1 1
-42 1 1
-669 1 1
-25 1 1
-539 1 1
-49 1 1
-1387 1 1
-53 0 1
-19 1 1
-878 1 1
-27 1 1
-9739 1 1
-15 1 1
-2064 0 1
-1069 1 1
-31 1 1
-612 0 1
-21 1 1
-821 2 0
-1002 2 0
-3478 4 0
-1394 1 1
-25 1 0
-60 1 0
-4 1 0
-10 1 0
-23 0 1
-12 0 1
-2396 1 1
-25 1 1
-401 0 2
-1918 0 2
-43 1 1
-806 1 1
-36 1 1
-126 1 1
-53 1 1
-411 5 5
-524 13 13
-2896 1 1
-62 1 1
-4194 2 0
-8269 2 0
-368 11 10
-546 1 0
-1040 2 0
-45 1 1
-234 1 1
-29 1 1
-1218 16 16
-206 11 11
-584 13 13
-334 4 4
-167 3 3
-31 1 1
-973 9 9
-142 81 81
-58 1 0
-74 1 0
-1707 19 19
-2413 1 1
-57 1 1
-160 1 1
-23 1 1
-2380 0 1
-5561 0 4
-2790 14 14
-76 3 0
-1823 1 1
-11 0 9
-6 2 0
-5 3 0
-9 5 0
-28 1 1
-727 1 1
-37 1 1
-2678 0 3
-1497 1 0
-3414 1 0
-1171 6 6
-4018 7 7
-269 1 1
-36 1 1
-366 1 1
-22 1 1
-916 0 9
-2431 1 1
-68 1 1
-855 4 4
-1052 2 2
-81 0 2
-45 7 7
-648 1 1
-27 1 1
-402 1 0
-791 1 1
-41 1 1
-1041 20 20
-1094 1 1
-29 4 0
-364 1 1
-40 0 1
-22 0 1
-124 0 1
-205 0 1
-720 0 1
-59 1 1
-1063 2 0
-112 2 0
-3106 15 15
-2542 1 1
-64 1 1
-3052 1 1
-73 1 1
-3722 1 1
-31 1 1
-3476 1 0
-229 1 1
-40 1 1
-1321 0 5
-1845 1 0
-558 5 5
-3811 19 19
-125 1 1
-25 1 1
-3387 1 0
-1781 4 4
-2191 0 1
-1201 0 1
-260 1 1
-17 7 7
-137 0 1
-38 1 1
-732 0 1
-1626 1 0
-1987 2 0
-45 1 1
-763 0 1
-1978 0 1
-135 1 0
-6209 1 0
-24 1 1
-4867 0 1
-171 0 1
-6299
-
-chain 6490016 chr7 158821424 + 34000 116005 chr16 90354753 - 90001 171511 354
-591 11 11
-383 0 4
-1364 1 0
-430 12 13
-1431 1 1
-21 1 1
-490 12 12
-509 1 1
-97 1 1
-604 2 0
-1188 1 3
-665 1 1
-22 6 0
-499 1 1
-19 1 1
-402 1 1
-51 1 1
-1193 0 4
-245 1 0
-688 0 1
-975 2 0
-463 0 23
-73 24 0
-32 7 0
-165 1 0
-1593 1 1
-20 1 1
-1203 1 1
-31 1 1
-740 2 0
-47 1 1
-485 1 1
-63 1 1
-381 5 0
-28 1 1
-254 1 1
-22 1 1
-306 0 1
-34 1 1
-283 0 2
-627 10 10
-74 1 1
-50 1 1
-1053 0 1
-54 1 1
-77 1 1
-210 1 1
-70 0 3
-1957 0 4
-2154 1 1
-69 1 1
-147 67 67
-69 1 1
-74 1 1
-242 1 1
-41 1 1
-63 5 5
-155 3 1
-101 1 1
-53 1 1
-877 1 1
-21 1 1
-60 1 1
-49 1 1
-167 1 1
-21 1 1
-623 15 15
-202 0 97
-86 0 49
-9 2 2
-84 5 248
-56 1 98
-40 0 1
-48 1 0
-87 1 1
-55 99 1
-50 50 0
-23 1 1
-81 0 194
-78 1 1
-55 3 3
-53 6 344
-15 1 1
-262 1 1
-80 1 1
-455 1 1
-108 3 3
-431 1 1
-101 1 1
-158 1 0
-9 1 1
-323 3 0
-85 1 1
-19 1 1
-345 32 0
-24 1 1
-342 1 1
-65 1 1
-90 8 8
-545 1 1
-130 2 2
-87 4 3
-62 3 3
-34 2 2
-77 1 1
-47 1 1
-61 1 1
-27 1 1
-224 7 7
-117 2 0
-17 1 1
-242 1 1
-34 1 1
-107 1 1
-36 1 1
-100 15 15
-154 0 8
-13 1 0
-34 5 5
-100 27 27
-263 11 11
-116 1 1
-41 1 1
-117 1 1
-49 1 1
-116 2 0
-70 1 1
-174 1 1
-125 1 1
-70 1 1
-30 1 1
-74 1 1
-32 1 1
-337 1 1
-49 1 1
-2127 1 1
-35 1 1
-538 1 1
-32 1 1
-744 10 10
-471 53 17
-2001 7 7
-453 1 0
-2656 0 1
-1785 1 0
-1454 1 1
-33 1 1
-419 1 1
-49 1 1
-4610 1 1
-36 1 1
-905 1 1
-13 0 2
-5128 17 17
-519 0 3
-613 7 0
-660 0 4
-2632 1 2
-278 21 21
-969 1 0
-2852 14 14
-149 1 1
-21 1 1
-198 1 1
-29 1 1
-801 6442 6416
-125 6 0
-39 3745 3755
-814 162 1
-4 63 63
-74 63 0
-47 1056 13
-370
-
-chain 227647 chr7 158821424 + 141707499 141716076 chr7 159138663 + 142043811 142047809 475649
-53 484 465
-55 51 51
-78 242 220
-60 274 271
-51 13 13
-51 37 37
-229 4 4
-228 16 16
-108 47 47
-50 4583 49
-498 131 130
-945 36 36
-253
-
-chain 87685 chr7 158821424 + 58756 115635 chr3 198022430 - 71488 126874 406
-67 3328 3375
-28 1 1
-29 2 2
-39 50 50
-7 2 2
-41 2708 1663
-32 2831 2828
-27 46647 46820
-96 378 0
-152 47 12
-72 252 0
-43
-
-chain 48969 chr7 158821424 + 142175391 142175904 chr7 159138663 + 142475439 142475952 2613549
-513
-
-chain 47803 chr7 158821424 + 141911444 141913842 chr7 159138663 - 17029555 17031946 2683091
-78 139 139
-57 226 225
-124 92 92
-56 135 135
-72 193 193
-53 23 23
-133 958 952
-59
-
-chain 43189 chr7 158821424 + 142199519 142199970 chr7 159138663 + 142498738 142499189 3009311
-451
-
-chain 30396 chr7 158821424 + 67364377 67364696 chr15 102531392 - 56463077 56463396 4465114
-319
-
-chain 30094 chr7 158821424 + 141700053 141707301 chr7 159138663 + 142042846 142043613 4669748
-89 15 15
-68 6585 104
-66 129 129
-62 35 35
-199
-
-chain 30060 chr7 158821424 + 141963578 141964737 chr11 135006516 + 33264685 33266127 4680203
-91 398 397
-87 228 512
-77 163 163
-115
-
-chain 28591 chr7 158821424 + 141910578 141910878 chr7 159138663 - 17028690 17028990 5361712
-300
-
-chain 21822 chr7 158821424 + 141716123 141716468 chr7 159138663 + 142047850 142048195 9124304
-170 99 99
-76
-
-chain 20144 chr7 158821424 + 142166403 142167075 chr9 141213431 + 33792981 33793662 10344618
-82 380 389
-66 18 18
-51 19 19
-56
-
-chain 16654 chr7 158821424 + 101805867 101806156 chr7 159138663 - 92369277 92369565 11127744
-33 12 11
-63 91 91
-90
-
-chain 14923 chr7 158821424 + 102039289 102039446 chr7 159138663 + 102153090 102153247 2823
-157
-
-chain 10542 chr7 158821424 + 115456 115592 chr16 90354753 - 170836 170972 2672410
-136
-
-chain 10012 chr7 158821424 + 114469 115025 chr9 141213431 - 90660 90901 550
-63 395 80
-98
-
-chain 9195 chr7 158821424 + 141943788 141943884 chr7 159138663 - 16914722 16914818 24637833
-96
-
-chain 8667 chr7 158821424 + 142177809 142178136 chr7 159138663 + 142477851 142478180 25450135
-54 219 221
-54
-
-chain 7349 chr7 158821424 + 142180607 142180684 chr7 159138663 + 142480664 142480741 27551182
-77
-
-chain 7340 chr7 158821424 + 142180197 142180274 chr7 159138663 + 142480253 142480330 27565643
-77
-
-chain 6886 chr7 158821424 + 141960844 141960917 chr8 146364022 - 77913390 77913463 28463282
-73
-
-chain 6730 chr7 158821424 + 102059075 102062034 chr7 159138663 + 102172727 102175692 3338
-34 2887 2893
-38
-
-chain 6431 chr7 158821424 + 142166514 142166582 chr7 159138663 + 142454997 142455065 29498865
-68
-
-chain 6414 chr7 158821424 + 114166 115456 chr9 141213431 - 90644 91234 1816570
-68 791 378
-44 328 41
-59
-
-chain 6276 chr7 158821424 + 142176939 142177005 chr7 159138663 + 142476982 142477048 29891950
-66
-
-chain 6166 chr7 158821424 + 142179945 142180009 chr7 159138663 + 142480002 142480066 30171758
-64
-
-chain 5761 chr7 158821424 + 141963726 141963989 chr14 107349540 - 25420241 25420503 6848073
-68 130 129
-65
-
-chain 5666 chr7 158821424 + 142179798 142179857 chr7 159138663 + 142479855 142479914 31548103
-59
-
-chain 5608 chr7 158821424 + 101977370 101977454 chr7 159138663 + 44036096 44036185 7960
-10 0 5
-74
-
-chain 5430 chr7 158821424 + 142178562 142178619 chr7 159138663 + 142478613 142478670 32231795
-57
-
-chain 5139 chr7 158821424 + 142176520 142176574 chr7 159138663 + 142476565 142476619 33117712
-54
-
-chain 5020 chr7 158821424 + 141966623 141966675 chr12 133851895 + 53762512 53762564 33527602
-52
-
-chain 4939 chr7 158821424 + 142176195 142176247 chr7 159138663 + 142476241 142476293 33775264
-52
-
-chain 4778 chr7 158821424 + 73598 73651 chr5 180915260 - 172444 172497 587
-53
-
-chain 4039 chr7 158821424 + 101996220 101996263 chr7 159138663 + 102308194 102308237 1871
-43
-
-chain 3908 chr7 158821424 + 142167123 142167183 chr7 159138663 + 142455620 142455680 17639294
-60
-
-chain 3217 chr7 158821424 + 141963833 141963883 chr6 171115067 - 41704900 41704950 22743877
-50
-
-chain 2759 chr7 158821424 + 67423135 67423165 chr7 159138663 + 67785172 67785202 11329361
-30
-
-chain 2575 chr7 158821424 + 67423107 67423135 chr7 159138663 + 67785172 67785200 11329362
-28
-
-chain 2575 chr7 158821424 + 67423079 67423107 chr7 159138663 + 67785172 67785200 11329363
-28
-
-chain 2575 chr7 158821424 + 67423051 67423079 chr7 159138663 + 67785172 67785200 11329364
-28
-
-chain 2575 chr7 158821424 + 67423023 67423051 chr7 159138663 + 67785172 67785200 11329365
-28
-
-chain 2575 chr7 158821424 + 67422995 67423023 chr7 159138663 + 67785172 67785200 11329366
-28
-
-chain 2457 chr7 158821424 + 114257 114311 chr16 90354753 - 170806 170860 17475755
-54
-
-chain 2391 chr7 158821424 + 67422969 67422995 chr7 159138663 + 67785202 67785228 13667102
-26
-
-chain 2359 chr7 158821424 + 101974113 101974139 chr7 159138663 + 102286210 102286236 158723
-26
-
-chain 1502 chr7 158821424 + 141709533 141709580 chr7 159138663 + 142013474 142013521 12917072
-47
-
-chain 721 chr7 158821424 + 141963699 141963726 chr17 81195210 + 19853796 19853823 7983736
-27
-
-chain 615 chr7 158821424 + 141964154 141964190 chr19 59128983 - 28688778 28688814 21921932
-36
-
-chain 362 chr7 158821424 + 101987601 101987634 chr7 159138663 - 57149003 57149036 1101
-33
-
-chain 17312866 chr7_random 549659 + 162804 345700 chr7_gl000195_random 182896 + 0 182896 164
-182896
-
-chain 10142542 chr7_random 549659 + 0 112804 chr7 159138663 + 158928464 159038297 315
-4073 0 1
-5056 1 0
-1766 1 1
-63 5 5
-2422 1 0
-1297 1 0
-1967 196 0
-230 28 0
-2331 5 0
-47 1 1
-345 1 0
-41 1 1
-807 1 1
-31 1 1
-238 3 0
-100 1 0
-281 1 1
-43 1 1
-359 27 26
-59 1 1
-43 1 1
-1385 1 0
-161 1 0
-45 1 1
-1693 1 0
-93 1 0
-5 1 0
-805 0 3
-649 0 49
-1400 1 1
-4 1 0
-28 0 1
-7 0 1
-157 1 1
-117 0 31
-166 13 12
-138 1 0
-556 1 1
-46 1 1
-204 1 1
-21 1 1
-511 2 0
-390 1 1
-29 1 1
-60 1 1
-68 0 3
-27 1 1
-71 0 1
-37 5 0
-18 0 6
-56 3 3
-89 2 0
-103 6 15
-43 5 0
-7 0 11
-55 0 4
-456 46 45
-1286 1 1
-46 1 0
-36 2 0
-57 1 0
-396 1 1
-38 1 1
-298 1 1
-16 1 1
-602 224 0
-82 1 56
-1115 1 74
-17 3 3
-88 1 74
-98 158 12
-90 3 3
-70 3 3
-117 1 1
-43 1 1
-53 1 1
-21 1 1
-53 229 10
-120 81 8
-59 8 10
-411 1 0
-47 1 1
-723 0 9
-8142 6 6
-1297 1 1
-22 0 1
-7799 12 11
-1878 1 0
-70 5 5
-592 1 1
-28 1 1
-2251 1 0
-1474 1 0
-1975 0 1
-2577 0 1
-612 15 15
-93 1 0
-3 1 0
-149 1 0
-61 3 3
-34 1 0
-11 2101 0
-63 73 3
-67 106 1
-57 83 13
-60 70 0
-79 561 1
-321 70 0
-262 0 35
-83 183 8
-2406 0 549
-85 32 0
-27 0 26
-72 0 35
-22 3 0
-24 0 93
-74 2 0
-17 28 0
-63 1 0
-6 1 0
-1451 44 4
-23 1 1
-38 0 40
-80 1 121
-34 1 1
-58 0 82
-839 1 0
-31 1 1
-2861 0 4
-1376 1 1
-20 0 1
-78 2 0
-24 2 2
-2760 3 1
-585 8 0
-761 1 0
-6449 4 1
-259 1 1
-22 1 1
-717 0 1
-887 7 8
-2174 3 0
-970 1 0
-1768 12 0
-4378 0 1
-5 0 1
-13 1 0
-1637 5 10
-312 0 1
-2167 11 0
-164 10 10
-1517 1 1
-42 0 3
-698 0 4
-90 1 1
-20 1 1
-167 1 1
-16 1 1
-860 0 1
-1719
-
-chain 9633059 chr7_random 549659 + 402818 549659 chr7 159138663 + 514489 666751 345
-3766 22099 5004
-26 4 4
-11014 7 5
-17 1 0
-8 21 0
-3389 1 1
-54 1 1
-55 1 1
-66 1 1
-165 1 1
-38 1 1
-52 22350 21842
-816 4 4
-10432 15 15
-20532 1 1
-29 9 9
-13871 157 23205
-37837
-
-chain 2073422 chr7_random 549659 + 444161 465736 chr7 159138663 - 158510053 158531628 1246
-21575
-
-chain 1225579 chr7_random 549659 + 415456 428202 chr7 159138663 + 537499 550245 1943
-12746
-
-chain 745495 chr7_random 549659 + 406711 414469 chr7 159138663 - 158580384 158588142 6708
-215 11 11
-2423 4 4
-5105
-
-chain 224185 chr7_random 549659 + 399770 402202 chr7 159138663 + 518876 521308 490490
-367 50 50
-1609 1 1
-53 3 3
-304 1 1
-44
-
-chain 25943 chr7_random 549659 + 67571 70764 chr7 159138663 + 158995434 158996421 1881723
-67 73 3
-55 13 153
-17 71 0
-159 183 8
-119 21 21
-154 1960 0
-64 35 0
-105 35 0
-62
-
-chain 21070 chr7_random 549659 + 68795 70055 chr7 159138663 + 158995572 158996097 2684005
-86 98 63
-43 35 0
-76 455 0
-18 248 38
-61 57 57
-83
-
-chain 19298 chr7_random 549659 + 67796 68209 chr7 159138663 + 158995799 158996246 2040899
-35 195 229
-183
-
-chain 8295 chr7_random 549659 + 70341 70449 chr7 159138663 + 158996348 158996421 13908836
-11 35 0
-62
-
-chain 8007 chr7_random 549659 + 70264 70825 chr7 159138663 + 158995746 158996237 2373081
-77 186 46
-35 218 288
-45
-
-chain 7010 chr7_random 549659 + 69669 69742 chr7 159138663 + 158996026 158996099 13809421
-73
-
-chain 6757 chr7_random 549659 + 71674 71744 chr7 159138663 + 158996246 158996316 26425870
-70
-
-chain 6582 chr7_random 549659 + 16740 16849 chr7 159138663 + 158945342 158945395 9902405
-48 56 0
-5
-
-chain 5793 chr7_random 549659 + 36845 36905 chr7 159138663 + 158964922 158964982 31172491
-60
-
-chain 5504 chr7_random 549659 + 68645 69446 chr7 159138663 + 158995947 158996153 2767372
-68 176 1
-63 420 0
-74
-
-chain 5075 chr7_random 549659 + 34499 34552 chr7 159138663 + 158962931 158962984 33354772
-53
-
-chain 4386 chr7_random 549659 + 36139 36193 chr7 159138663 + 158964435 158964489 9901820
-54
-
-chain 4359 chr7_random 549659 + 69809 69854 chr7 159138663 + 158996061 158996106 24027999
-45
-
-chain 3345 chr7_random 549659 + 71561 71653 chr7 159138663 + 158995923 158996015 5823696
-92
-
-chain 3242 chr7_random 549659 + 36212 36249 chr7 159138663 + 158964435 158964472 7647561
-37
-
-chain 3169 chr7_random 549659 + 68713 69336 chr7 159138663 + 158995385 158995658 13517397
-46 500 150
-77
-
-chain 2856 chr7_random 549659 + 36091 36138 chr7 159138663 + 158964168 158964215 3415068
-47
-
-chain 2508 chr7_random 549659 + 74235 74267 chr7 159138663 + 158999705 158999737 11181217
-32
-
-chain 2422 chr7_random 549659 + 16701 16740 chr7 159138663 + 158944995 158945034 20425801
-39
-
-chain 2296 chr7_random 549659 + 76078 76102 chr7 159138663 + 159001472 159001496 26237556
-24
-
-chain 1888 chr7_random 549659 + 68772 68795 chr7 159138663 + 158995829 158995852 23967691
-23
-
-chain 1646 chr7_random 549659 + 16653 16684 chr7 159138663 + 158945171 158945202 6593972
-31
-
-chain 1510 chr7_random 549659 + 34573 34664 chr7 159138663 + 158962893 158962984 9181320
-91
-
-chain 1319 chr7_random 549659 + 70142 70185 chr7 159138663 + 158996289 158996332 23051286
-43
-
-chain 1065 chr7_random 549659 + 69520 69582 chr7 159138663 + 158996297 158996359 18766264
-62
-
-chain 13483752813 chr8 146274826 + 0 146274826 chr8 146364022 + 10000 146304022 9
-930417 1 1243
-52 10 10
-44 0 972
-100 0 54
-162 0 324
-409 0 1
-2323216 1 0
-3352649 2 0
-854996 100000 50000
-3399023 1 1
-46 1 1
-13965 1 1
-30 1 1
-121189 1 1
-35 1 1
-283700 0 1
-719291 100016 93054
-1155 0 2
-755 26 26
-980 21 21
-1479 54 54
-3597 1 0
-1937 19 19
-322 1 0
-1758 2 0
-1141 0 1
-956 48 48
-739 21 21
-1005 0 1
-543 1734 1734
-5338 15 15
-1029 1 1
-28 1 1
-305 57 57
-164 27 27
-5130707 0 1
-1288 0 1
-446 1 1
-80 1 1
-2123 4 4
-2514 3 0
-545 9 0
-527 1 1
-18 1 1
-256 9 9
-79 1 1
-40 1 1
-148 0 2
-2231 0 27
-958 1 1
-20 1 1
-2487 1 1
-113 1 1
-73 13 13
-365 10 10
-151 1 1
-32 3 0
-26 1 1
-1480 1 1
-29 1 1
-621 1 1
-28 1 1
-701 9 9
-362 1 1
-19 1 1
-691 1 1
-44 6 0
-47 1 1
-513 12 11
-382 1 1
-22 1 1
-111 1 1
-36 1 1
-337 1 1
-42 1 1
-602 2 0
-36 1 1
-475 1 1
-23 0 1
-32 4 3
-65 1 1
-59 1 1
-688 1 1
-22 1 1
-1473 1 1
-36 1 1
-372 1 1
-16 6 6
-1605 1 1
-38 1 1
-816 1 1
-17 1 0
-374 1 1
-17 1 1
-48 1 0
-82 1 1
-45 1 1
-263 1 1
-23 1 1
-204 1 1
-39 1 1
-2341 0 1
-2989 9 11
-811 8 8
-741 0 2
-337 1 1
-25 4 4
-763 1 1
-19 1 1
-343 1 1
-31 1 1
-1953 1 1
-74 1 1
-67 1 1
-18 4 4
-73 1 1
-31 1 1
-114 11 1
-87 1 1
-65 1 1
-125 9 9
-378 49 48
-90 1 1
-99 1 0
-173 13 7
-696 0 1
-6184 13 13
-830 13 13
-128 1 1
-37 1 1
-136 1 0
-66 5 6
-870 1 0
-4877 0 1
-585 3 7
-1728 1 0
-33 1 1
-465 1 1
-68 1 1
-581 6 0
-2088 1 0
-304 0 1
-2674 1 1
-28 1 0
-54 8 8
-846 0 1
-1409 16 16
-559 0 1
-407 0 5
-11 5 1
-29 1 1
-4051 1 1
-10 0 1
-43 1 1
-385 1 1
-35 1 1
-101 11 11
-602 1 0
-491 14 16
-1366 19 19
-321 1 1
-49 1 1
-546 1 1
-25 1 1
-2568 1 1
-51 4 0
-119 1 1
-39 0 1
-1040 0 1
-1682 0 4
-39 8 0
-862 1 1
-17 1 1
-587 1 1
-21 1 1
-904 0 1
-261 0 1
-1151 0 2
-2325 5 5
-5415 0 3
-1545 1 0
-428 4 4
-1950 2 0
-1073 0 1
-3653 0 86
-1283 1 1
-79 1 1
-6656 12 12
-1550 0 18
-5832 1 0
-4835 10 10
-1719 1 1
-84 1 1
-848 0 2
-236 1 1
-42 1 1
-1272 12 0
-49 1 1
-820 1 1
-22 1 0
-58 0 22
-510 8 8
-983 6 0
-539 14 14
-863 0 2
-27 1 1
-204 14 14
-163 4 4
-290 1 1
-59 1 1
-842 0 2
-2044 1 1
-90 0 1
-3434 0 3
-356 0 1
-873 0 1
-864 25 1
-630 12 7
-62 10 10
-156 11 11
-1364 19 19
-156 4 4
-244 4 18
-505 1 0
-109 1 1
-230 1 1
-107 4 3
-150 1 1
-83 5 5
-70 1 1
-33 1 0
-142 1 1
-626 5 6
-274 10 10
-128 1 1
-35 1 1
-216 1 1
-44 1 1
-312 1 1
-16 1 1
-1496 8 7
-451 0 1
-855 1 1
-20 1 1
-350 1 1
-62 1 1
-617 10 10
-845 1 1
-58 1 1
-2189 1 1
-147 1 1
-475 1 1
-27 1 1
-278 1 1
-17 1 1
-994 1 1
-40 1 1
-219 5 5
-26 1 1
-900 1 1
-29 1 0
-26 1 1
-484 15 16
-61 9 9
-114 21 26
-801 1 1
-33 1 1
-560 1 1
-37 1 1
-80 14 14
-211 1 1
-43 1 1
-156 1 1
-20 1 1
-685 1 1
-18 1 1
-48 4 0
-711 1 1
-38 1 1
-402 7 7
-1045 1 1
-37 1 1
-4035 9 9
-247 4 0
-4146274 17400 5734
-330366 0 1
-2346742 0 55
-413177 3 0
-450 1 0
-9436 3 1
-7044 4 0
-2886 1 0
-635 1 0
-16567 1 0
-6926 29 28
-9249 1 0
-14916 8 0
-12872 2 0
-3330 2 0
-2673376 2 0
-2603 1 1
-78 1 1
-2170491 7 7
-29817 66108 2485
-6473782 5 5
-39 1 1
-9574 0 2
-5879 1 1
-29 1 1
-6139 1 0
-2354 1 1
-28 1 1
-91 88 87
-142 16 15
-54 1 1
-22 3 3
-1479 4 4
-221 4 4
-132 1 0
-574 11 11
-23 1 0
-604 1 1
-44 1 1
-899 1 0
-70 1 0
-10 1 0
-13561 1 1
-44 1 1
-4476 4 4
-799 26 25
-1466 18 18
-17897 4 0
-1667 1 0
-4250 1 1
-44 1 3
-14 1 1
-4956 1 1
-18 1 0
-39 3 2
-4990 1 1
-47 13 13
-69 4 0
-9729 1 0
-355 0 1
-2186 1 1
-37 1 1
-6111 3 3
-100 4 4
-68 1 1
-43 1 1
-1126 5 7
-5520 8 8
-2316 1 1
-181 6 6
-50 1 1
-29 1 0
-83 1 1
-1073 245 639
-150 1 1
-25272 0 1
-2132 0 4
-2522 1 1
-48 1 1
-1498528 0 1
-6044582 3000008 3000000
-1291113 60074 16691
-3837 3 0
-811 1 0
-2567 1 0
-7375465 11 11
-42062 1 0
-19604621 1 0
-10692667 1 0
-110 0 1
-3577 0 3
-907 1 1
-18 1 1
-897 1 1
-64 535 251
-21 0 1
-140 0 1
-70 1 0
-77 9 10
-149 4 0
-5 1 5
-68 1 0
-142 5 5
-57 14 14
-43 1 1
-31034 124100 99683
-2301 0 2
-44 2 0
-568015 87325 183549
-330 5 5
-114 0 3088
-1776 0 3085
-949 0 4
-514 37 37
-963 15 14
-1351 71 71
-56 15 15
-405 713 713
-651 1 1
-41 1 1
-837 1 0
-658 0 1
-794 0 1
-73 1 1
-30 1 1
-817 51 51
-566 72 72
-195 0 12193
-1599 0 3085
-217 43 43
-247 29 29
-4148 1 0
-158 266 266
-696 20 20
-58 69 69
-100 13 13
-326 137 137
-151 35 35
-1804 151 151
-1341 289 289
-154 23 23
-1932 17 17
-111 47 47
-128 16 16
-78 30 30
-1022 6 10
-78 1 0
-342 31 31
-86 23 23
-1601 41 41
-144 49 49
-170 10 10
-398 23 23
-419 20 20
-955 55 55
-1139 11 11
-1925 0 276
-223 58 58
-702 25 25
-1030 23 23
-363 164 164
-653 16 16
-78 13 13
-1035 0 4
-514 37 37
-1069 10 10
-321 15 15
-603 68 68
-789 20 20
-56 25 25
-1007 5 5
-1198 24 24
-689 3 0
-743 32 32
-817 43 43
-574 11 11
-123 19 19
-618 28 28
-1270 15 15
-289 29 29
-106 11 11
-1395 46 46
-850 4 4
-777 62 62
-86 36 36
-374 97 97
-2072 31 31
-195 56 56
-379 80 80
-64 11 11
-191 18 18
-1051 13 13
-52 163 169
-1297 1 1
-25 1 1
-3451 0 188
-3097 0 9
-2715 1 0
-11829 0 3
-6001 28 0
-10728 0 1
-3770769 1 0
-62 1 0
-22 1 0
-827 1 0
-1485 1 0
-242 0 1
-7142 1 0
-4029 3 3
-69 1 1
-15865 1 0
-83463 4 0
-5976 9 0
-2661 1 0
-1483 1 0
-15868 4 0
-17798 1 0
-2649 1 0
-3627 1 0
-4789 1 0
-9541 1 0
-6844 1 0
-3187 2 0
-411 14 0
-3056 4 0
-19776 3 0
-29085 0 1
-745 2 0
-11453 2 0
-16739 1 0
-14697 1 0
-8539 1 0
-25514443 1 0
-17680 0 1
-55359 0 1
-58 57 59
-1515 1 0
-1111 1 0
-5736 6 6
-66213 1 0
-68 1 1
-24 6 7
-43 1 1
-33414 7 7
-22 1 1
-19312 0 1
-8588 1 1
-31 1 1
-15969 1 1
-32 1 1
-27034 1 1
-42 1 1
-3352 0 1
-15009 1 0
-20433 18 18
-32141 9 8
-116 41 41
-4920 1 0
-33364 1 0
-11160 15 17
-28423 1 0
-43835 1 1
-24 4 2
-269244 4 4
-37 1 1
-17193 4 3
-53 12 11
-23 2 1
-7 1 1
-37978 9 9
-37743 1 1
-35 3 3
-26636 1 1
-17 1 1
-8728292 1 0
-16734742 0 71275
-27 1 1
-657033 0 2
-2911 0 2
-1941 1 1
-35 1 1
-835 1 1
-116 1 1
-399 1 1
-101 1 0
-194 1 2
-450 1 0
-825 1 1
-73 1 1
-156 1 1
-58 1 1
-50 5 5
-153 11 11
-189 5 5
-233 1 1
-83 1 1
-642 0 1
-1380 1 1
-17 1 1
-315 1 1
-26 1 1
-786 0 901
-76 1 1
-45 1 1
-535 1 1
-34 1 1
-2007 7 7
-159 1 1
-26 1 1
-6362 13 13
-504325 100008 25635
-420771 0 232
-287680 0 104
-73 0 364
-181 0 55
-95 1 1
-46 1 1
-4002 1 1
-24 1 1
-183 49 0
-72 1 2
-8 1 0
-39 688 1
-306 0 50
-1939 0 1
-615 684 0
-254 0 1
-572035 7362 108542
-480202 1 0
-11866 6 6
-26917 0 1
-6097 15 15
-3074 0 1
-12292 0 1
-2209 0 1
-7358 0 1
-321393
-
-chain 161719 chr8 146274826 + 12213564 12217654 chr8 146364022 + 11922619 11926713 3890
-48 2333 2337
-1544 26 26
-139
-
-chain 94297 chr8 146274826 + 86864948 86909782 chr8 146364022 + 86767902 86816113 712
-43 4583 4586
-51 23 23
-69 22 22
-81 3466 3466
-114 1460 1461
-170 2237 2237
-47 3442 3445
-24 161 161
-49 1995 1995
-32 5554 5830
-116 4 4
-12 2309 5394
-37 2018 2018
-68 865 865
-25 3669 3669
-32 817 817
-42 1346 1346
-28 1574 1574
-29 1512 1515
-46 1652 1652
-41 2665 2665
-30 2224 2230
-50
-
-chain 49697 chr8 146274826 + 86036864 86037399 chr8 146364022 + 85964814 85965349 932809
-535
-
-chain 26725 chr8 146274826 + 86857851 86907733 chr8 146364022 + 86754632 86786590 1026
-491 49362 31438
-29
-
-chain 24621 chr8 146274826 + 145396034 145396288 chr8 146364022 + 145493131 145493385 2960834
-254
-
-chain 18039 chr8 146274826 + 144819613 144819801 chr8 146364022 + 144748845 144749033 12082915
-188
-
-chain 14890 chr8 146274826 + 86857082 86862299 chr8 146364022 - 59611598 59616815 1124
-71 476 476
-222 4397 4397
-51
-
-chain 13243 chr8 146274826 + 144819801 144819938 chr8 146364022 + 144748593 144748730 12136518
-137
-
-chain 9530 chr8 146274826 + 144823061 144823289 chr8 146364022 + 144751680 144751756 18947814
-3 152 0
-73
-
-chain 9463 chr8 146274826 + 144819938 144820036 chr8 146364022 + 144748632 144748730 13619337
-98
-
-chain 8087 chr8 146274826 + 86874741 86874834 chr8 146364022 + 86817360 86817453 1088
-93
-
-chain 7965 chr8 146274826 + 86865238 86879045 chr8 146364022 + 86780387 86797281 766
-29 7982 7984
-37 5729 8814
-30
-
-chain 7439 chr8 146274826 + 12201270 12203830 chr8 146364022 + 11910337 11912897 3584
-26 2480 2480
-54
-
-chain 6315 chr8 146274826 + 86909619 86909690 chr8 146364022 + 86556151 86556222 765064
-71
-
-chain 6303 chr8 146274826 + 144823559 144823625 chr8 146364022 + 144751722 144751788 29838951
-66
-
-chain 5756 chr8 146274826 + 86854716 86862896 chr8 146364022 + 86782059 86817706 1940
-37 8112 35579
-31
-
-chain 5521 chr8 146274826 + 144823643 144823701 chr8 146364022 + 144751730 144751788 31959915
-58
-
-chain 5339 chr8 146274826 + 144823077 144823133 chr8 146364022 + 144751620 144751676 32492605
-56
-
-chain 4702 chr8 146274826 + 144819343 144819392 chr8 146364022 + 144748967 144749016 12082914
-49
-
-chain 4684 chr8 146274826 + 144823154 144823323 chr8 146364022 + 144751621 144751752 19314390
-33 102 64
-34
-
-chain 4385 chr8 146274826 + 144820066 144820134 chr8 146364022 + 144748613 144748681 20813384
-68
-
-chain 3959 chr8 146274826 + 144820160 144820201 chr8 146364022 + 144748560 144748601 13619336
-41
-
-chain 3959 chr8 146274826 + 144819572 144819613 chr8 146364022 + 144748560 144748601 13619338
-41
-
-chain 3270 chr8 146274826 + 86905368 86905406 chr8 146364022 - 59611399 59611437 120315
-38
-
-chain 3190 chr8 146274826 + 144819513 144819546 chr8 146364022 + 144748697 144748730 12136519
-33
-
-chain 2525 chr8 146274826 + 144823339 144823377 chr8 146364022 + 144751692 144751730 23202086
-38
-
-chain 2511 chr8 146274826 + 144819546 144819572 chr8 146364022 + 144748632 144748658 13619339
-26
-
-chain 2509 chr8 146274826 + 144820134 144820160 chr8 146364022 + 144748632 144748658 22535050
-26
-
-chain 2395 chr8 146274826 + 144820036 144820061 chr8 146364022 + 144748974 144748999 15328526
-25
-
-chain 2146 chr8 146274826 + 86862896 86862937 chr8 146364022 - 59626667 59626708 2042
-38 1 1
-2
-
-chain 2013 chr8 146274826 + 12224371 12224395 chr8 146364022 + 11933433 11933457 5802
-24
-
-chain 928 chr8 146274826 + 86871422 86871445 chr8 146364022 + 86566156 86566179 4371
-23
-
-chain 19961283 chr8_random 943810 + 732172 943810 chr5 180915260 + 69954173 70165811 138
-211638
-
-chain 4772201 chr8_random 943810 + 62854 113804 chr8 146364022 + 16274686 16325603 650
-4146 9 9
-1642 5 9
-541 4 0
-1197 1 1
-27 1 1
-2498 0 1
-20171 4 0
-2761 3 0
-1978 0 1
-628 10 0
-5533 3 0
-2428 24 0
-47 5 9
-197 11 11
-687 0 2
-642 1 1
-17 1 1
-2228 0 4
-1978 1 0
-1521
-
-chain 4401722 chr8_random 943810 + 396973 443039 chr8 146364022 - 801667 847519 685
-2079 1 0
-22818 62 9
-50 57 0
-25 0 8
-40 91 0
-5953 32 0
-1937 0 2
-803 13 14
-786 0 5
-3908 2 0
-783 0 1
-854 1 0
-142 1 0
-1521 1 0
-114 0 1
-498 4 4
-591 2 0
-2750 0 9
-147
-
-chain 3680035 chr8_random 943810 + 643258 682172 chr8_gl000196_random 38914 + 0 38914 797
-38914
-
-chain 3554032 chr8_random 943810 + 493047 530222 chr8_gl000197_random 37175 + 0 37175 825
-37175
-
-chain 1222443 chr8_random 943810 + 0 12854 chr8 146364022 - 108556772 108569616 1946
-5765 0 1
-2843 2 0
-279 0 1
-299 1 0
-1113 9 0
-2543
-
-chain 995258 chr8_random 943810 + 250482 297042 chr8 146364022 + 46838897 46856230 2491
-52 5 5
-72 1882 0
-246 1888 0
-158 79 78
-59 82 81
-53 46 46
-76 18 18
-100 1942 59
-231 1 0
-84 1 0
-49 23 22
-65 25 25
-312 49 47
-118 1 0
-169 645 640
-71 18 18
-202 15 15
-74 114 112
-65 1444 30
-86 2249 34
-216 9 8
-173 33 30
-63 81 79
-265 87 84
-103 11 10
-122 1 1
-47 1 1
-165 858 0
-14 1027 0
-88 1879 0
-148 7 6
-166 1 0
-288 1888 1
-62 1 1
-90 1 0
-35 1890 1
-280 3 3
-23 1 0
-109 1 1
-283 4 4
-88 1 1
-67 1 1
-23 1 1
-109 680 0
-89 1876 0
-41 1 0
-45 1898 0
-107 18 18
-18 1 0
-28 1 1
-50 1 0
-35 1 1
-50 7 4
-54 1 0
-37 1 1
-298 11 10
-94 1 0
-17 1 0
-36 1 0
-55 1 0
-12 1 1
-148 1 1
-79 11 9
-78 1 1
-140 5 4
-54 3 0
-97 1 0
-138 6 4
-73 1 0
-59 19 19
-207 1 1
-45 1 1
-76 1 0
-8 3 1
-60 2 2
-56 1 1
-70 1 0
-45 1 1
-136 131 128
-86 17 16
-75 7 7
-53 483 144
-75 26 26
-230 135 132
-110 15 15
-61 25 23
-76 43 42
-120 1 0
-78 1735 1728
-192 42 41
-61 82 82
-190 37 37
-90 1911 30
-168 56 56
-56 10 10
-83 26 26
-230 1927 49
-224 1937 52
-244 41 41
-125 36 36
-96 26 26
-83 81 78
-272 2019 139
-59 236 231
-103 71 70
-183 31 31
-58 119 117
-131 1 0
-167 25 25
-72 97 96
-91 6 6
-75 10 9
-219
-
-chain 895028 chr8_random 943810 + 298039 346176 chr8 146364022 - 99507152 99525054 4376
-63 126 463
-229 1883 1
-104 25 25
-58 6 6
-155 36 35
-84 10 10
-88 23 23
-53 1 0
-164 5 5
-68 56 55
-231 24 24
-149 409 408
-53 1 0
-69 1 0
-134 6 6
-201 318 315
-27 1885 0
-105 1 0
-82 82 82
-144 27 27
-56 238 235
-130 24 23
-109 1 0
-77 2 1
-100 31 30
-102 14 14
-63 11 10
-108 91 91
-72 94 93
-169 149 148
-198 238 234
-86 2 0
-169 3 1
-72 11 11
-66 1 0
-247 18 17
-392 540 533
-186 7 7
-121 1 0
-254 1977 89
-53 7 7
-193 483 475
-93 50 47
-198 28 28
-76 1883 8
-61 130 129
-123 29 29
-112 201 199
-138 12 11
-21 1873 0
-107 33 33
-53 1880 1
-118 40 38
-141 1943 53
-168 137 134
-81 16 16
-115 2216 0
-103 32 29
-71 128 127
-104 54 53
-121 128 127
-66 99 96
-80 75 74
-128 1924 40
-53 2 1
-288 1910 24
-53 1907 23
-56 40 40
-72 111 111
-62 127 127
-122 65 65
-80 210 206
-115 0 1
-146 5663 0
-183 40 40
-53 34 33
-229 28 28
-92 83 83
-234 1983 101
-57 1885 0
-44 11 11
-62 1 0
-69 28 28
-126 1 0
-148 147 144
-58 14 12
-53 1 0
-66 1 0
-105 34 33
-71 39 38
-69 17 17
-56 6 5
-79 48 46
-53 6 6
-57 38 35
-77 78 75
-111 649 644
-110 45 43
-235
-
-chain 604051 chr8_random 943810 + 178170 281976 chr8 146364022 + 46838954 46856867 5476
-212 1875 0
-272 566 562
-114 1 0
-143 1 0
-55 74 74
-65 25 25
-63 62 62
-61 31 31
-102 23 23
-215 1 0
-63 67 68
-68 373 34
-158 64 63
-53 46 46
-105 67 67
-55 2294 38
-202 15 15
-63 51 51
-246 23 23
-71 1 0
-271 103 102
-427 6 5
-51 25 22
-54 1878 0
-36 10 10
-122 26 26
-134 1886 0
-121 93 92
-51 1 2
-246 54742 0
-134 1884 0
-129 33 31
-147 39 38
-116 65 61
-66 43 41
-62 1982 95
-213 196 193
-339 260 254
-187 89 88
-10 2292 403
-57 5123 1343
-293 24 22
-61 1 0
-73 7 7
-53 1877 144
-91 4270 499
-59 2463 581
-37 339 671
-59 342 0
-110 266 261
-150 6 6
-92 244 241
-51 62 62
-51 3119 1229
-91 761 80
-60 48 47
-137 1876 0
-136 12 10
-131 12 11
-290 1 0
-45 4005 2083
-59 88 424
-59
-
-chain 496223 chr8_random 943810 + 580222 593236 chr8 146364022 - 59615387 59795086 34662
-2144 4634 17818
-237 1 1
-31 1 1
-194 35 40
-1575 162 153603
-534 0 55
-995 64 64
-1343 58 58
-112 1 1
-38 1 1
-70 1 1
-41 1 1
-81 1 1
-34 1 1
-624
-
-chain 279595 chr8_random 943810 + 199376 329223 chr8 146364022 - 99506514 99525054 6095
-67 50 47
-55 631 967
-63 1082 0
-177 61 58
-147 6 6
-143 1 0
-42 1882 0
-74 31 30
-83 23 23
-13 1879 0
-204 5 5
-58 69 69
-227 1933 51
-152 123 122
-83 1 0
-118 72 72
-159 17 17
-119 34 34
-230 36 36
-134 1929 32
-189 3017 0
-24 83 83
-121 1 0
-49 5680 1
-325 136 129
-277 30 30
-335 1436 53
-51 63 62
-99 867 859
-154 860 855
-269 32 31
-112 1 0
-50 1877 0
-99 58 58
-108 1 0
-96 2221 0
-37 1546 0
-136 2648 89
-52 7 8
-278 1 0
-202 139 136
-145 65 63
-51 44 42
-62 143 139
-61 156 155
-243 214 215
-20 1872 0
-194 74 75
-337 25 25
-145 15 15
-71 65 65
-84 1878 0
-60 1 0
-244 227 225
-226 53 53
-62 42 41
-66 63 61
-120 35 34
-64 56110 1
-98 41 40
-53 2795 914
-65 10 10
-57 8290 755
-67 63 61
-66 17 16
-53 1 0
-58 36 36
-92 3924 162
-40 61 61
-58 4119 368
-133 2082 185
-58 42 42
-167 2235 21
-50 4401 627
-71 40 39
-147 360 353
-60 174 173
-446
-
-chain 208078 chr8_random 943810 + 170910 242131 chr8 146364022 - 99506628 99524507 6380
-55 632 967
-69 73 73
-115 28 28
-146 4836 20
-75 1 0
-54 58 58
-87 10 10
-294 22105 209
-184 59 59
-53 209 208
-64 1388 305
-56 340 338
-60 50 50
-134 32 32
-108 2 0
-106 83 82
-108 1884 0
-62 68 68
-216 1 0
-55 20 20
-107 3862 104
-61 311 311
-29 2182 2154
-53 1 0
-93 1388 251
-108 3 2
-129 159 158
-109 1 0
-31 114 113
-51 60 60
-78 14 14
-99 14 13
-152 64 62
-60 13 12
-120 98 98
-138 115 114
-56 6 4
-26 438 436
-213 183 182
-53 1 0
-81 2318 428
-71 25 25
-145 15 15
-71 65 65
-109 1956 43
-69 112 108
-33 397 392
-58 1466 80
-62 46 46
-401 64 64
-45 51 51
-56 1 0
-6 99 99
-54 146 144
-187 67 67
-166 52 49
-51 9 8
-63 11 10
-61 186 186
-68 38 38
-168 105 102
-125 3 2
-113 17 17
-186 2 0
-3 6394 747
-113 762 83
-102 4015 254
-238 102 101
-91 6 6
-85 1999 129
-12 9 9
-44 2322 442
-90 319 318
-42
-
-chain 110041 chr8_random 943810 + 584910 586860 chr8 146364022 - 59525621 59532924 58275
-151 1 1
-64 1 1
-158 1 1
-137 0 5353
-14 3 3
-73 8 8
-52 11 11
-57 9 9
-54 15 15
-289 15 15
-837
-
-chain 81230 chr8_random 943810 + 228410 243660 chr8 146364022 - 99515272 99524158 121868
-53 818 813
-113 55 55
-76 1036 1025
-78 1 0
-115 1280 591
-98 36 34
-79 25 25
-73 189 188
-120 2622 738
-79 145 145
-8 21 19
-36 157 155
-27 18 14
-98 82 81
-130 280 280
-78 83 83
-21 20 20
-27 51 51
-134 238 238
-10 39 39
-53 216 215
-252 5175 1418
-73 6 6
-146 231 228
-111 1 0
-201 35 35
-101
-
-chain 78595 chr8_random 943810 + 271315 287023 chr8 146364022 + 46844767 46855610 13381
-177 7 6
-61 49 46
-54 86 84
-62 24 23
-151 92 91
-73 109 107
-108 1 0
-51 8 6
-97 2409 1723
-29 1995 118
-92 64 63
-24 701 695
-42 7 7
-53 90 89
-54 403 392
-25 6360 4099
-70 192 192
-26 77 76
-63 336 336
-129 125 126
-143 878 869
-27 23 23
-61
-
-chain 70241 chr8_random 943810 + 583972 584708 chr8 146364022 - 2327498 2328234 1800744
-736
-
-chain 67060 chr8_random 943810 + 583131 583834 chr8 146364022 + 144032710 144033413 1885205
-703
-
-chain 60161 chr8_random 943810 + 163863 193392 chr8 146364022 + 46840361 46854926 51951
-69 30 30
-79 155 153
-22 224 224
-36 635 633
-54 78 77
-53 1660 61
-55 408 405
-36 32 32
-40 163 161
-29 96 89
-5 85 85
-4 108 106
-193 10362 0
-211 23 23
-164 214 212
-108 41 40
-217 35 35
-85 25 25
-266 2366 490
-48 600 260
-32 3507 4987
-74 590 587
-105 2319 2307
-66 2880 990
-102 1 0
-89 507 168
-143
-
-chain 59106 chr8_random 943810 + 169718 174718 chr8 146364022 - 99507650 99524666 884317
-69 73 73
-53 107 105
-145 323 5927
-57 45 43
-58 51 49
-65 130 129
-16 74 74
-175 49 49
-53 423 422
-53 2360 8782
-34 55 55
-95 1 0
-28 1 0
-2 113 113
-292
-
-chain 53138 chr8_random 943810 + 171392 346403 chr8 146364022 - 102525263 102570806 8603
-57 57 57
-79 626 627
-64 1139 91
-72 32 32
-61 1 0
-192 55 53
-253 233 231
-113 1894 10
-151 18218 118
-161 39 39
-89 168 167
-68 174 168
-68 7236 473
-76 2229 347
-40 124 120
-50 21 21
-55 1906 29
-98 2 0
-51 3928 158
-113 3230 214
-58 5760 82
-62 113 112
-39 7442 4152
-122 13 12
-149 90 90
-56 48 47
-71 400 397
-133 1910 21
-97 23 23
-92 2561 0
-54 15 13
-67 70 69
-90 95 94
-59 72 72
-139 45 45
-101 71659 2394
-62 72 72
-84 1 0
-9 2000 117
-95 39 39
-65 70 68
-87 2031 150
-103 1949 61
-106 17 17
-136 75 74
-53 5662 38
-58 1936 41
-42 168 168
-108 95 95
-66 243 241
-50 5018 908
-53 4282 513
-74 1906 30
-83 2078 26035
-107 1947 59
-57 500 483
-160 1936 53
-185 1897 12
-119 3972 202
-29 14 14
-79 61 61
-44
-
-chain 52733 chr8_random 943810 + 164218 295513 chr8 146364022 + 43821028 43838759 7574
-63 20 20
-141 36 36
-153 32 31
-103 40 40
-53 86 85
-99 1658 59
-83 265 263
-110 21 21
-51 29 27
-160 108 108
-51 1 0
-49 1 0
-61 130 123
-85 12281 44
-69 272 272
-118 62 62
-75 7995 1645
-102 45 45
-59 32 32
-14 328 328
-126 2372 483
-86 58668 153
-40 4323 551
-31 1938 56
-58 2392 511
-58 234 222
-51 1403 0
-51 91 91
-50 218 218
-83 67 66
-75 77 77
-110 391 53
-2 2678 792
-147 104 101
-59 1917 33
-92 1958 75
-54 5899 1442
-11 105 104
-132 1 0
-50 2212 332
-66 5506 1369
-60 189 189
-173 223 221
-222 1874 0
-87 23 23
-54 108 108
-109 29 28
-94 64 63
-70 91 86
-97 164 161
-112 123 123
-78 1942 66
-145 118 118
-69 1917 31
-51 10 10
-113 235 231
-193 327 327
-41 392 391
-51 363 361
-123 1977 94
-57
-
-chain 48120 chr8_random 943810 + 172087 205615 chr8 146364022 - 99508140 99525054 275640
-50 1136 89
-81 56 55
-4 1876 5603
-199 577 570
-71 144 141
-39 17920 1690
-56 276 276
-117 289 289
-64 172 170
-10 18 18
-76 284 279
-308 237 229
-64 1904 0
-33 2094 204
-40 43 43
-63 3 2
-59 12 12
-306 15 15
-33 1146 61
-49 757 4487
-37 62 62
-83 46 46
-112 178 174
-95 1 0
-29 1956 73
-248
-
-chain 37837 chr8_random 943810 + 253130 272078 chr8 146364022 + 46839659 46847391 87472
-42 44 44
-61 2771 880
-109 37 36
-171 1 0
-120 209 204
-98 56 55
-61 10 9
-23 187 186
-75 18 18
-17 5316 1682
-9 145 143
-53 1 0
-29 137 137
-73 132 128
-65 14 14
-79 6214 2430
-95 70 70
-83 2232 342
-91
-
-chain 33662 chr8_random 943810 + 209837 215530 chr8 146364022 - 99514311 99520696 710844
-71 67 65
-87 1 0
-118 10 8
-19 543 533
-53 11 11
-89 4 2
-68 143 138
-148 1307 167
-110 627 624
-30 2103 3960
-84
-
-chain 32940 chr8_random 943810 + 226035 229035 chr8 146364022 - 102534454 102537445 203694
-68 23 23
-49 847 842
-50 91 91
-134 57 57
-61 1290 1287
-37 113 113
-86 41 40
-53
-
-chain 31024 chr8_random 943810 + 206449 211988 chr8 146364022 - 99514678 99520173 701886
-8 43 43
-64 6 5
-58 14 12
-82 340 0
-49 416 749
-81 59 59
-117 75 75
-207 1422 3285
-36 2428 531
-34
-
-chain 29825 chr8_random 943810 + 245532 246838 chr8 146364022 + 46839602 46840894 3893579
-57 560 553
-119 226 222
-5 184 184
-21 75 72
-59
-
-chain 28513 chr8_random 943810 + 169082 170209 chr8 146364022 - 99514495 99515614 2995290
-72 337 330
-70 17 17
-84 143 144
-53 81 80
-64 162 161
-44
-
-chain 28403 chr8_random 943810 + 244271 247583 chr8 146364022 + 46840215 46841632 1514192
-150 21 21
-65 247 246
-61 60 60
-144 37 36
-68 1 0
-56 146 144
-158 1945 55
-153
-
-chain 27366 chr8_random 943810 + 305024 329400 chr8 146364022 - 99508828 99514021 185326
-30 144 144
-27 1950 69
-57 1 0
-69 4733 954
-80 7 7
-60 2015 139
-144 51 51
-17 50 48
-20 2199 324
-179 83 83
-149 1 0
-45 50 50
-29 198 197
-38 56 56
-36 163 162
-27 2035 153
-71 157 157
-56 6099 109
-62 47 47
-93 104 100
-75 1 0
-39 342 0
-49 1641 94
-81 539 539
-177
-
-chain 25161 chr8_random 943810 + 165410 166073 chr8 146364022 + 46840031 46840686 5084847
-51 107 104
-69 107 106
-77 51 48
-53 79 78
-69
-
-chain 23498 chr8_random 943810 + 275598 276538 chr8 146364022 + 46848347 46849285 1106774
-150 39 39
-58 1 0
-156 159 160
-43 237 235
-97
-
-chain 22556 chr8_random 943810 + 221873 233787 chr8 146364022 - 102535430 102541485 264178
-56 92 91
-134 1524 140
-26 9348 4879
-77 298 294
-159 126 126
-55 8 7
-11
-
-chain 21554 chr8_random 943810 + 211856 229563 chr8 146364022 - 102534119 102541711 230838
-98 1283 144
-76 1760 1749
-25 1 0
-80 1889 12
-87 80 79
-50 14 14
-51 55 50
-59 207 201
-52 31 30
-212 2303 390
-120 3503 2102
-43 5590 1830
-38
-
-chain 21378 chr8_random 943810 + 315539 346866 chr8 146364022 - 99515536 99522005 182294
-65 7 7
-59 1872 0
-52 1 0
-110 59 59
-145 1929 47
-157 4107 0
-50 19 19
-76 11 11
-9 218 215
-20 69 68
-27 104 104
-38 3941 169
-93 9868 446
-40 53 53
-33 350 349
-83 1915 34
-228 2 1
-71 4993 3080
-80 103 101
-58 162 162
-50
-
-chain 20133 chr8_random 943810 + 187153 190961 chr8 146364022 + 46839718 46841635 711123
-27 2490 610
-70 193 186
-75 6 6
-22 81 81
-48 1 0
-41 200 200
-10 13 12
-78 103 101
-193 10 10
-147
-
-chain 19851 chr8_random 943810 + 184692 274845 chr8 146364022 + 46839508 46849467 34309
-59 20 20
-103 2903 645
-204 29 27
-122 5 4
-251 1 1
-19 1 1
-370 102 102
-45 59 59
-32 2407 520
-35 53082 226
-207 6009 346
-163 6 4
-101 79 79
-50 419 416
-33 1900 15
-227 6 6
-48 1 0
-53 22 21
-65 58 57
-59 43 42
-133 81 80
-20 44 42
-50 14 12
-53 37 36
-104 2375 490
-62 1340 1334
-14 1 0
-183 3854 228
-49 6055 405
-35 6036 1578
-80 25 25
-89 8 7
-13
-
-chain 19146 chr8_random 943810 + 175023 175290 chr8 146364022 - 99508150 99508416 4025470
-88 58 57
-65 25 25
-31
-
-chain 17870 chr8_random 943810 + 167013 193249 chr8 146364022 + 46840039 46851047 112211
-37 407 404
-31 233 231
-41 10382 13
-26 802 800
-40 282 279
-41 6132 1660
-77 3954 2070
-28 510 4239
-81 90 89
-50 30 30
-120 2083 201
-60 192 191
-51 338 0
-118
-
-chain 17758 chr8_random 943810 + 265412 266607 chr8 146364022 + 43830436 43831619 676151
-58 100 98
-16 14 14
-59 946 936
-2
-
-chain 17102 chr8_random 943810 + 196211 212812 chr8 146364022 - 102534634 102539542 315778
-4 176 169
-110 677 661
-101 229 222
-63 12 11
-71 2311 416
-66 5 5
-3 2545 1456
-25 7 5
-52 21 20
-3 9994 1320
-61 8 7
-57
-
-chain 16958 chr8_random 943810 + 303736 319647 chr8 146364022 - 99509421 99514022 288375
-62 1 0
-115 55 55
-12 6716 1059
-173 60 58
-5 238 238
-27 142 138
-80 1 0
-32 1181 1170
-56 95 93
-15 6818 1186
-27
-
-chain 16519 chr8_random 943810 + 191041 191237 chr8 146364022 + 46841712 46841907 5194781
-138 7 6
-51
-
-chain 16395 chr8_random 943810 + 250196 250458 chr8 146364022 + 46842349 46842610 5706058
-109 63 63
-38 1 0
-51
-
-chain 16284 chr8_random 943810 + 248826 295566 chr8 146364022 + 43821313 43835075 8983
-38 3114 1217
-58 3878 108
-134 2320 436
-35 2074 180
-90 6230 729
-53 51 51
-165 2138 257
-18 1 0
-14 9087 4604
-68 26 23
-70 26 25
-165 4726 2469
-31 113 113
-45 6358 726
-53 323 321
-29 3160 1272
-53 1943 60
-1 1 0
-51
-
-chain 16072 chr8_random 943810 + 313809 340982 chr8 146364022 - 102527896 102533983 267291
-28 5309 1547
-73 15383 1858
-110 23 22
-51 120 119
-75 171 167
-144 2405 509
-56 2087 199
-104 240 238
-93 367 364
-59 113 109
-162
-
-chain 15849 chr8_random 943810 + 261982 295288 chr8 146364022 + 43821759 43829198 76114
-110 412 75
-52 237 234
-137 1904 21
-61 17 17
-88 8048 505
-97 1212 533
-118 1 0
-62 80 80
-12 643 644
-105 9123 1231
-153 113 112
-50 1019 1018
-55 3899 142
-89 478 475
-43 4836 1068
-52
-
-chain 15670 chr8_random 943810 + 194296 345941 chr8 146364022 - 102525263 102540770 8834
-113 3789 1
-79 5134 279
-81 25039 3655
-36 72 71
-66 2073 189
-82 66 62
-87 280 277
-20 23 23
-59 87 84
-72 49 48
-51 7 7
-82 1014 334
-62 79983 3178
-76 18 17
-68 2382 504
-43 42 41
-108 10477 733
-134 2033 147
-59 5650 11
-88 3846 65
-64 297 293
-50 3779 12
-69 123 122
-120 121 120
-68 15 15
-57 136 135
-139 239 237
-72 1 0
-63 4 3
-53 59 59
-8 490 488
-28 84 81
-35 298 293
-34 805 799
-67 1 0
-53 69 67
-100 14 14
-81 134 132
-53 38 38
-39 110 109
-45
-
-chain 14986 chr8_random 943810 + 225882 226349 chr8 146364022 - 99518359 99518822 2174986
-18 53 51
-56 166 164
-73 33 33
-68
-
-chain 14834 chr8_random 943810 + 243014 243551 chr8 146364022 - 99519780 99520313 2299338
-16 162 159
-19 313 312
-27
-
-chain 14491 chr8_random 943810 + 298927 299279 chr8 146364022 - 102541139 102541484 3650546
-95 253 246
-4
-
-chain 13927 chr8_random 943810 + 330425 330634 chr8 146364022 - 99513165 99513373 16289681
-108 47 46
-54
-
-chain 13708 chr8_random 943810 + 204114 204446 chr8 146364022 - 99514221 99514551 7956244
-38 2 1
-51 137 136
-104
-
-chain 13201 chr8_random 943810 + 267894 296641 chr8 146364022 + 46841376 46846486 149880
-47 8325 118
-153 12619 975
-124 10 10
-59 1933 45
-415 178 178
-62 103 99
-67 193 193
-45 34 34
-4 542 542
-26 2853 963
-60 194 194
-31 632 628
-38
-
-chain 12234 chr8_random 943810 + 261803 269960 chr8 146364022 + 46841266 46843423 172872
-35 2890 667
-1 24 24
-60 15 15
-6 166 166
-32 2034 149
-193 134 132
-81 69 68
-116 2096 211
-21 87 83
-97
-
-chain 10617 chr8_random 943810 + 337138 337293 chr8 146364022 - 99523571 99523724 21494273
-69 29 27
-57
-
-chain 10554 chr8_random 943810 + 261774 276161 chr8 146364022 + 46850579 46856384 287750
-26 3379 1156
-30 20 20
-51 4844 1067
-12 16 15
-65 51 50
-53 361 357
-85 102 101
-13 51 51
-26 87 87
-46 4988 2413
-81
-
-chain 10039 chr8_random 943810 + 325665 325968 chr8 146364022 - 99512180 99512483 3203386
-32 146 146
-51 12 12
-62
-
-chain 9889 chr8_random 943810 + 299929 343052 chr8 146364022 - 99507161 99512618 194143
-54 125 463
-172 6011 368
-29 4240 471
-68 8003 490
-69 47 47
-10 133 133
-55 45 44
-46 4488 379
-66 1908 22
-82 7833 307
-63 2043 161
-90 115 115
-101 1 0
-97 2144 241
-32 4543 773
-83 294 293
-33
-
-chain 9887 chr8_random 943810 + 315022 315154 chr8 146364022 - 99513153 99513284 7544872
-79 1 0
-52
-
-chain 9860 chr8_random 943810 + 311200 311307 chr8 146364022 - 99513093 99513199 8991129
-52 1 0
-54
-
-chain 9817 chr8_random 943810 + 331048 331155 chr8 146364022 - 99513786 99513892 13428201
-64 1 0
-42
-
-chain 9446 chr8_random 943810 + 266857 296082 chr8 146364022 + 43794817 43828117 103381
-44 9743 27369
-146 121 120
-47 983 976
-79 10221 2331
-165 112 112
-51 81 80
-39 1877 0
-66 2043 157
-36 3318 1429
-53
-
-chain 9082 chr8_random 943810 + 283227 283503 chr8 146364022 + 46855567 46855841 3572014
-72 39 38
-7 101 100
-57
-
-chain 9078 chr8_random 943810 + 266179 266275 chr8 146364022 + 46841541 46841637 24832874
-96
-
-chain 9056 chr8_random 943810 + 234327 343102 chr8 146364022 - 102532678 102541696 177988
-49 2060 180
-83 4311 566
-60 72559 3258
-278 110 111
-124 380 378
-51 246 244
-21 14 13
-37 2147 273
-83 195 193
-50 29 28
-5 2000 121
-73 4435 328
-132 3864 97
-47 5706 63
-45 54 54
-151 1883 5
-99 3796 15
-99 63 61
-64 1 0
-58 1881 0
-137 76 74
-53 53 48
-27 312 310
-85 17 16
-19 140 140
-52 244 244
-62 105 104
-50
-
-chain 8907 chr8_random 943810 + 174718 174972 chr8 146364022 - 99514987 99515577 3222521
-12 195 531
-47
-
-chain 8843 chr8_random 943810 + 329461 329557 chr8 146364022 - 99512211 99512306 12312646
-78 1 0
-17
-
-chain 8728 chr8_random 943810 + 244822 248433 chr8 146364022 + 46838897 46840609 1548241
-52 2949 1051
-100 1 0
-231 55 55
-65 34 34
-124
-
-chain 8619 chr8_random 943810 + 294534 295111 chr8 146364022 + 46855606 46856180 1696895
-31 25 25
-71 52 51
-46 97 97
-58 132 130
-65
-
-chain 8428 chr8_random 943810 + 281982 282213 chr8 146364022 + 46854328 46854560 448042
-60 97 98
-56 17 17
-1
-
-chain 8419 chr8_random 943810 + 261190 261281 chr8 146364022 + 43820969 43821060 10860311
-91
-
-chain 8395 chr8_random 943810 + 294914 295046 chr8 146364022 + 46848509 46848640 12873675
-58 69 68
-5
-
-chain 8358 chr8_random 943810 + 183391 183662 chr8 146364022 + 46851295 46851565 1204104
-177 39 38
-55
-
-chain 8235 chr8_random 943810 + 303417 303563 chr8 146364022 - 99516580 99516725 5721277
-92 1 0
-53
-
-chain 8187 chr8_random 943810 + 330253 330340 chr8 146364022 - 99512994 99513081 26147162
-87
-
-chain 7754 chr8_random 943810 + 175981 176066 chr8 146364022 - 99524049 99524133 15930227
-61 1 0
-23
-
-chain 7677 chr8_random 943810 + 237294 312035 chr8 146364022 - 99517817 99525125 210590
-33 254 254
-156 1 0
-142 25 25
-70 127 127
-226 1925 53
-62 55 55
-112 29 28
-91 36 36
-139 46 43
-7 796 791
-54 65384 1748
-45 3060 1165
-46 839 833
-119 535 529
-77 214 206
-36
-
-chain 7632 chr8_random 943810 + 192816 192897 chr8 146364022 + 46850614 46850695 27043702
-81
-
-chain 7605 chr8_random 943810 + 285785 290878 chr8 146364022 + 46850643 46851974 486318
-50 2571 689
-13 4 4
-73 73 73
-25 2038 160
-132 56 54
-58
-
-chain 7406 chr8_random 943810 + 221929 222203 chr8 146364022 - 99519540 99519813 598559
-62 1 0
-29 134 134
-48
-
-chain 7383 chr8_random 943810 + 294257 294361 chr8 146364022 + 43837510 43837614 4128881
-70 9 9
-25
-
-chain 7298 chr8_random 943810 + 168270 168367 chr8 146364022 + 46839414 46839508 6543284
-4 56 53
-37
-
-chain 7295 chr8_random 943810 + 336620 336697 chr8 146364022 - 99513722 99513799 27625946
-77
-
-chain 7211 chr8_random 943810 + 261472 261549 chr8 146364022 + 46839068 46839145 24666501
-77
-
-chain 7186 chr8_random 943810 + 330047 330123 chr8 146364022 - 99512791 99512867 27853996
-76
-
-chain 7178 chr8_random 943810 + 316571 316677 chr8 146364022 - 102541857 102541963 5712191
-106
-
-chain 7102 chr8_random 943810 + 318170 320971 chr8 146364022 - 99520028 99520932 765669
-72 19 19
-135 121 121
-72 13 12
-29 2280 384
-60
-
-chain 7077 chr8_random 943810 + 192950 193025 chr8 146364022 + 46850748 46850823 28082919
-75
-
-chain 7057 chr8_random 943810 + 203108 206189 chr8 146364022 - 99515093 99516287 1156085
-30 91 89
-53 2333 448
-35 503 503
-36
-
-chain 6980 chr8_random 943810 + 332337 335152 chr8 146364022 - 99522544 99523471 1124480
-50 412 409
-6 79 79
-50 126 126
-65 1978 93
-49
-
-chain 6922 chr8_random 943810 + 183305 183378 chr8 146364022 + 46840000 46840073 28376594
-73
-
-chain 6904 chr8_random 943810 + 266355 266429 chr8 146364022 + 46841714 46841788 28413782
-74
-
-chain 6731 chr8_random 943810 + 303313 303384 chr8 146364022 - 99509001 99509072 28774708
-71
-
-chain 6664 chr8_random 943810 + 303981 314057 chr8 146364022 - 99517140 99519668 641395
-51 3 2
-55 1 0
-72 170 168
-30 7422 1761
-7 12 11
-54 1882 0
-68 153 153
-96
-
-chain 6603 chr8_random 943810 + 322619 327380 chr8 146364022 - 99513231 99513884 1344743
-127 337 0
-120 9 8
-78 1963 78
-31 1885 0
-211
-
-chain 6584 chr8_random 943810 + 197737 202982 chr8 146364022 - 102536127 102540259 775939
-91 1155 1137
-22 12 11
-57 3876 2782
-32
-
-chain 6449 chr8_random 943810 + 218412 233428 chr8 146364022 - 99516080 99519573 697985
-27 8506 1438
-73 54 54
-91 295 295
-235 28 28
-6 100 100
-56 5516 1061
-29
-
-chain 6331 chr8_random 943810 + 327023 327090 chr8 146364022 - 99511661 99511728 29751334
-67
-
-chain 6250 chr8_random 943810 + 208146 208242 chr8 146364022 - 99508890 99508983 12204367
-15 70 67
-11
-
-chain 6212 chr8_random 943810 + 207786 207861 chr8 146364022 - 99514136 99514211 3829743
-75
-
-chain 6150 chr8_random 943810 + 203513 205795 chr8 146364022 - 102537045 102537445 1909663
-16 3 2
-125 118 117
-8 1955 75
-57
-
-chain 6094 chr8_random 943810 + 299279 299402 chr8 146364022 - 99508718 99508841 2977078
-68 21 21
-34
-
-chain 6085 chr8_random 943810 + 250101 250166 chr8 146364022 + 46842254 46842319 30387783
-65
-
-chain 6067 chr8_random 943810 + 293889 294038 chr8 146364022 + 46845620 46845767 4301892
-66 21 19
-62
-
-chain 6049 chr8_random 943810 + 230044 230135 chr8 146364022 - 102569888 102569979 10345810
-91
-
-chain 5962 chr8_random 943810 + 207380 207446 chr8 146364022 - 99509995 99510061 8394857
-66
-
-chain 5949 chr8_random 943810 + 272784 272847 chr8 146364022 + 46853694 46853757 30762472
-63
-
-chain 5823 chr8_random 943810 + 299452 300023 chr8 146364022 - 99514497 99515068 1422380
-470 61 61
-40
-
-chain 5814 chr8_random 943810 + 289476 289952 chr8 146364022 + 46839369 46839842 2257769
-77 110 110
-124 92 90
-42 1 0
-30
-
-chain 5753 chr8_random 943810 + 192024 192086 chr8 146364022 + 46838954 46839016 21955899
-62
-
-chain 5749 chr8_random 943810 + 233271 233333 chr8 146364022 - 102570546 102570608 31315232
-62
-
-chain 5681 chr8_random 943810 + 341821 341883 chr8 146364022 - 99511396 99511458 7040566
-62
-
-chain 5649 chr8_random 943810 + 174777 174837 chr8 146364022 - 99507908 99507968 31588023
-60
-
-chain 5623 chr8_random 943810 + 175706 175950 chr8 146364022 - 102534119 102534360 3287579
-59 23 22
-63 22 20
-77
-
-chain 5394 chr8_random 943810 + 322313 322370 chr8 146364022 - 99511057 99511114 32316179
-57
-
-chain 5303 chr8_random 943810 + 187437 187493 chr8 146364022 + 46840000 46840056 32583273
-56
-
-chain 5285 chr8_random 943810 + 290446 290502 chr8 146364022 + 43794807 43794863 32673339
-56
-
-chain 5276 chr8_random 943810 + 336755 336811 chr8 146364022 - 99513853 99513909 32693850
-56
-
-chain 5265 chr8_random 943810 + 208344 208568 chr8 146364022 - 99514691 99514915 3842595
-38 152 152
-34
-
-chain 5263 chr8_random 943810 + 587464 592229 chr8 146364022 + 86573610 86746488 37343
-35 3283 168311
-47 1343 1343
-20 1 3086
-36
-
-chain 5194 chr8_random 943810 + 184072 184128 chr8 146364022 + 46838897 46838953 32965865
-56
-
-chain 5184 chr8_random 943810 + 329855 329911 chr8 146364022 - 99512600 99512656 19420929
-56
-
-chain 5176 chr8_random 943810 + 177599 177656 chr8 146364022 - 99506628 99506685 33029925
-57
-
-chain 5155 chr8_random 943810 + 281730 289038 chr8 146364022 + 46843205 46844537 960143
-32 6927 953
-200 103 101
-46
-
-chain 5093 chr8_random 943810 + 184617 184671 chr8 146364022 + 43793908 43793962 23494272
-54
-
-chain 5050 chr8_random 943810 + 326962 327016 chr8 146364022 - 102542496 102542550 23236949
-54
-
-chain 5030 chr8_random 943810 + 212164 212217 chr8 146364022 - 99524079 99524132 33461083
-53
-
-chain 5021 chr8_random 943810 + 265903 265956 chr8 146364022 + 46841267 46841320 33516233
-53
-
-chain 5010 chr8_random 943810 + 325697 333370 chr8 146364022 - 99519686 99521704 323579
-146 5416 1638
-176 1905 28
-30
-
-chain 4963 chr8_random 943810 + 195042 195095 chr8 146364022 - 99525006 99525059 2910708
-53
-
-chain 4923 chr8_random 943810 + 294759 294811 chr8 146364022 + 46846486 46846538 24481170
-52
-
-chain 4775 chr8_random 943810 + 300049 300108 chr8 146364022 - 99511357 99511416 2287019
-59
-
-chain 4729 chr8_random 943810 + 323590 341586 chr8 146364022 - 99508256 99511164 508733
-81 188 186
-45 5653 0
-76 6291 651
-50 2125 222
-31 36 36
-21 50 50
-1 57 52
-62 3121 1237
-18 5 4
-85
-
-chain 4516 chr8_random 943810 + 291820 291870 chr8 146364022 + 46839826 46839876 19135311
-50
-
-chain 4460 chr8_random 943810 + 340307 340812 chr8 146364022 - 99522970 99523472 2799007
-59 396 393
-50
-
-chain 4363 chr8_random 943810 + 169662 169718 chr8 146364022 - 99524410 99524466 15024078
-25 20 20
-11
-
-chain 4245 chr8_random 943810 + 323934 340633 chr8 146364022 - 102539490 102542980 824111
-57 5415 1637
-55 4265 507
-46 6509 840
-13 129 125
-132 10 10
-68
-
-chain 4191 chr8_random 943810 + 346770 346816 chr8 146364022 - 99523777 99523823 32415009
-46
-
-chain 4157 chr8_random 943810 + 182640 182685 chr8 146364022 + 46841541 46841586 34989719
-45
-
-chain 4075 chr8_random 943810 + 287206 294116 chr8 146364022 + 46853923 46857394 507901
-58 44 43
-3 6754 3316
-51
-
-chain 4035 chr8_random 943810 + 210210 231774 chr8 146364022 - 99509073 99511132 504053
-68 1 0
-87 1 0
-47 151 148
-33 3084 58
-60 3981 215
-31 2075 179
-62 11852 1040
-31
-
-chain 3902 chr8_random 943810 + 322746 322788 chr8 146364022 - 99511490 99511532 25070576
-42
-
-chain 3842 chr8_random 943810 + 326212 339029 chr8 146364022 - 99518333 99519833 259270
-47 312 308
-17 60 57
-117 12236 926
-28
-
-chain 3793 chr8_random 943810 + 191943 191984 chr8 146364022 + 43793349 43793390 19585042
-41
-
-chain 3728 chr8_random 943810 + 267941 270995 chr8 146364022 + 46845159 46846318 991534
-57 2323 433
-41 406 402
-51 140 139
-36
-
-chain 3715 chr8_random 943810 + 252408 255104 chr8 146364022 + 46840810 46841615 879027
-44 1 0
-30 2575 685
-46
-
-chain 3689 chr8_random 943810 + 281829 281916 chr8 146364022 + 46850779 46850864 2001274
-26 3 1
-58
-
-chain 3667 chr8_random 943810 + 254324 254368 chr8 146364022 + 46840842 46840884 6647423
-30 11 9
-3
-
-chain 3646 chr8_random 943810 + 267998 268037 chr8 146364022 + 46850823 46850862 21797624
-39
-
-chain 3562 chr8_random 943810 + 168212 168270 chr8 146364022 + 43793831 43793889 3070871
-58
-
-chain 3504 chr8_random 943810 + 293480 293517 chr8 146364022 + 46839611 46839648 25642059
-37
-
-chain 3471 chr8_random 943810 + 337522 337596 chr8 146364022 - 99523948 99524022 18137430
-74
-
-chain 3448 chr8_random 943810 + 276204 276644 chr8 146364022 + 46854559 46854996 1897606
-49 365 362
-26
-
-chain 3411 chr8_random 943810 + 253189 255402 chr8 146364022 + 46850929 46853124 621337
-27 1269 1253
-37 776 774
-2 49 49
-53
-
-chain 3373 chr8_random 943810 + 338130 338166 chr8 146364022 - 99513335 99513371 20995505
-36
-
-chain 3359 chr8_random 943810 + 165298 184945 chr8 146364022 + 43823972 43836890 282023
-56 2595 8459
-64 12771 2404
-3 8 8
-69 4024 1798
-57
-
-chain 3297 chr8_random 943810 + 194502 225687 chr8 146364022 - 102525468 102530377 366001
-70 4347 545
-64 92 91
-87 8182 1452
-36 9798 1128
-56 8421 1348
-32
-
-chain 3286 chr8_random 943810 + 278118 290566 chr8 146364022 + 43833036 43837583 504233
-53 11 9
-65 12260 4361
-59
-
-chain 3257 chr8_random 943810 + 218922 219219 chr8 146364022 - 99516581 99516875 4722847
-56 32 30
-58 32 31
-119
-
-chain 3241 chr8_random 943810 + 233589 233706 chr8 146364022 - 102539417 102539534 832166
-52 16 16
-49
-
-chain 3212 chr8_random 943810 + 266430 268559 chr8 146364022 + 46841788 46842035 1348744
-53 1890 10
-128 11 9
-47
-
-chain 3157 chr8_random 943810 + 327996 328036 chr8 146364022 - 99512626 99512665 16621225
-16 15 14
-9
-
-chain 3082 chr8_random 943810 + 310645 310683 chr8 146364022 - 99512541 99512579 16551162
-38
-
-chain 3062 chr8_random 943810 + 163933 165245 chr8 146364022 + 46851641 46852949 942341
-29 1223 1219
-60
-
-chain 3030 chr8_random 943810 + 262108 262298 chr8 146364022 + 43831228 43834818 1405601
-67 13 3413
-110
-
-chain 2982 chr8_random 943810 + 183568 183600 chr8 146364022 + 46840262 46840294 9991965
-32
-
-chain 2745 chr8_random 943810 + 335974 336003 chr8 146364022 - 99513082 99513111 33185960
-29
-
-chain 2672 chr8_random 943810 + 298503 298547 chr8 146364022 - 99522900 99522944 24221385
-44
-
-chain 2671 chr8_random 943810 + 332183 346560 chr8 146364022 - 102528996 102533910 187401
-51 6123 457
-105 6796 3008
-38 249 246
-57 891 885
-67
-
-chain 2639 chr8_random 943810 + 219413 219441 chr8 146364022 - 99507721 99507749 35294427
-28
-
-chain 2612 chr8_random 943810 + 200816 200846 chr8 146364022 - 99525102 99525132 4075609
-30
-
-chain 2604 chr8_random 943810 + 240329 240369 chr8 146364022 - 99522715 99522755 8959532
-40
-
-chain 2556 chr8_random 943810 + 216929 216957 chr8 146364022 - 99514612 99514640 10325210
-28
-
-chain 2552 chr8_random 943810 + 191384 191411 chr8 146364022 + 46840185 46840212 15340406
-27
-
-chain 2552 chr8_random 943810 + 304972 304999 chr8 146364022 - 99516251 99516278 22571486
-27
-
-chain 2523 chr8_random 943810 + 327142 327169 chr8 146364022 - 99524856 99524883 11689776
-27
-
-chain 2451 chr8_random 943810 + 317909 318170 chr8 146364022 - 99521638 99521896 1452880
-31 226 223
-4
-
-chain 2447 chr8_random 943810 + 313295 313321 chr8 146364022 - 99513300 99513326 34910154
-26
-
-chain 2433 chr8_random 943810 + 230135 233158 chr8 146364022 - 99507638 99508095 1270471
-81 73 73
-21 37 37
-40 18 18
-82 2643 77
-28
-
-chain 2394 chr8_random 943810 + 309803 310102 chr8 146364022 - 102570308 102570605 11245020
-97 185 183
-17
-
-chain 2370 chr8_random 943810 + 237880 237905 chr8 146364022 - 99520270 99520295 11943708
-25
-
-chain 2370 chr8_random 943810 + 302899 302924 chr8 146364022 - 99512327 99512352 35222469
-25
-
-chain 2330 chr8_random 943810 + 274710 274735 chr8 146364022 + 46843727 46843752 26272760
-25
-
-chain 2188 chr8_random 943810 + 303139 303300 chr8 146364022 - 99512566 99512727 1325340
-161
-
-chain 2164 chr8_random 943810 + 254246 254269 chr8 146364022 + 46840765 46840788 24904248
-23
-
-chain 2146 chr8_random 943810 + 166073 166100 chr8 146364022 + 43793293 43793320 16498497
-27
-
-chain 2129 chr8_random 943810 + 171463 171506 chr8 146364022 - 99524332 99524375 3948851
-43
-
-chain 2094 chr8_random 943810 + 256486 256530 chr8 146364022 + 46856070 46856114 4878843
-44
-
-chain 2067 chr8_random 943810 + 182380 182437 chr8 146364022 + 46850625 46850682 3805032
-57
-
-chain 2054 chr8_random 943810 + 318711 318733 chr8 146364022 - 99511225 99511247 10715405
-22
-
-chain 1964 chr8_random 943810 + 202805 202867 chr8 146364022 - 99509184 99509246 3143072
-62
-
-chain 1962 chr8_random 943810 + 187357 187601 chr8 146364022 + 46841788 46842031 9057308
-62 87 86
-95
-
-chain 1941 chr8_random 943810 + 278085 278118 chr8 146364022 + 46854559 46854592 1239137
-33
-
-chain 1922 chr8_random 943810 + 294361 294534 chr8 146364022 + 46849827 46850000 1057760
-173
-
-chain 1907 chr8_random 943810 + 166115 166177 chr8 146364022 + 46850070 46850132 2756260
-62
-
-chain 1904 chr8_random 943810 + 294565 294590 chr8 146364022 + 46846293 46846318 7797359
-25
-
-chain 1899 chr8_random 943810 + 239038 239062 chr8 146364022 - 99519559 99519583 3632092
-24
-
-chain 1874 chr8_random 943810 + 311858 316542 chr8 146364022 - 99523087 99524010 1127459
-40 4555 794
-89
-
-chain 1842 chr8_random 943810 + 208242 208344 chr8 146364022 - 99510852 99510954 1122309
-102
-
-chain 1826 chr8_random 943810 + 333370 333404 chr8 146364022 - 102528310 102528344 12860155
-34
-
-chain 1699 chr8_random 943810 + 189740 189801 chr8 146364022 + 43830083 43830143 11700756
-13 1 0
-47
-
-chain 1671 chr8_random 943810 + 586860 586891 chr8 146364022 - 59596972 59597003 79385
-31
-
-chain 1671 chr8_random 943810 + 582366 582405 chr8 146364022 + 86778164 86778203 135745
-39
-
-chain 1614 chr8_random 943810 + 174855 174917 chr8 146364022 - 102535142 102535204 7562660
-62
-
-chain 1604 chr8_random 943810 + 210485 210541 chr8 146364022 - 99516819 99516875 24689779
-56
-
-chain 1577 chr8_random 943810 + 165529 165568 chr8 146364022 + 43833540 43833579 5487018
-39
-
-chain 1529 chr8_random 943810 + 199844 199893 chr8 146364022 - 99524132 99524181 16599934
-49
-
-chain 1430 chr8_random 943810 + 204007 204051 chr8 146364022 - 102535667 102535711 2444362
-44
-
-chain 1384 chr8_random 943810 + 331973 334317 chr8 146364022 - 99510969 99511436 2459541
-88 2124 247
-132
-
-chain 1361 chr8_random 943810 + 178432 178456 chr8 146364022 + 43821398 43821422 13532386
-24
-
-chain 1349 chr8_random 943810 + 282101 282136 chr8 146364022 + 43834762 43834797 3301014
-35
-
-chain 1325 chr8_random 943810 + 330748 334904 chr8 146364022 - 99513486 99513886 3761248
-39 3999 243
-118
-
-chain 1299 chr8_random 943810 + 216700 216875 chr8 146364022 - 99512515 99512690 2121346
-175
-
-chain 1278 chr8_random 943810 + 275077 288204 chr8 146364022 + 46842223 46845574 199410
-48 13052 3276
-27
-
-chain 1258 chr8_random 943810 + 272883 272996 chr8 146364022 + 43835974 43836087 2232086
-113
-
-chain 1256 chr8_random 943810 + 324880 325008 chr8 146364022 - 99513272 99513400 5381670
-128
-
-chain 1237 chr8_random 943810 + 196535 196612 chr8 146364022 - 99507792 99507869 15310375
-77
-
-chain 1235 chr8_random 943810 + 284286 284429 chr8 146364022 + 46839806 46839949 2930992
-143
-
-chain 1191 chr8_random 943810 + 293574 293786 chr8 146364022 + 46839704 46839915 1788603
-62 1 0
-149
-
-chain 1161 chr8_random 943810 + 294116 294212 chr8 146364022 + 43829899 43829995 1318655
-4 39 39
-53
-
-chain 1160 chr8_random 943810 + 183897 184027 chr8 146364022 + 43793197 43793327 2884372
-130
-
-chain 1130 chr8_random 943810 + 241032 308421 chr8 146364022 - 102539359 102541234 585349
-125 60736 871
-57 75 74
-53 2150 266
-105 4036 272
-52
-
-chain 1119 chr8_random 943810 + 229190 229281 chr8 146364022 - 99508572 99508663 1537143
-73 17 17
-1
-
-chain 1018 chr8_random 943810 + 315759 315867 chr8 146364022 - 102570622 102570730 1907772
-108
-
-chain 1013 chr8_random 943810 + 274298 274330 chr8 146364022 + 46839580 46839612 3252033
-32
-
-chain 968 chr8_random 943810 + 209695 209807 chr8 146364022 - 102537590 102537702 976902
-112
-
-chain 955 chr8_random 943810 + 319692 319755 chr8 146364022 - 102541225 102541288 3356813
-63
-
-chain 920 chr8_random 943810 + 258623 258775 chr8 146364022 + 46839508 46839659 980562
-59 25 24
-68
-
-chain 912 chr8_random 943810 + 192332 192490 chr8 146364022 + 46839260 46839417 3759652
-73 1 0
-84
-
-chain 891 chr8_random 943810 + 282553 282623 chr8 146364022 + 46843688 46843758 5243973
-70
-
-chain 873 chr8_random 943810 + 329911 329999 chr8 146364022 - 99523866 99523954 8492095
-88
-
-chain 847 chr8_random 943810 + 202393 202429 chr8 146364022 - 99516251 99516287 1768031
-36
-
-chain 808 chr8_random 943810 + 208103 208146 chr8 146364022 - 99506642 99506685 12166401
-43
-
-chain 772 chr8_random 943810 + 215530 215581 chr8 146364022 - 102536642 102536693 4621463
-51
-
-chain 770 chr8_random 943810 + 298794 298927 chr8 146364022 - 102529795 102529928 1833110
-38 53 53
-42
-
-chain 762 chr8_random 943810 + 250305 250368 chr8 146364022 + 43793197 43793260 2202736
-63
-
-chain 756 chr8_random 943810 + 175550 175595 chr8 146364022 - 102569149 102569194 15473865
-45
-
-chain 725 chr8_random 943810 + 227416 227458 chr8 146364022 - 102569147 102569189 2128584
-42
-
-chain 715 chr8_random 943810 + 237975 238010 chr8 146364022 - 99524101 99524136 9984625
-35
-
-chain 713 chr8_random 943810 + 336818 336983 chr8 146364022 - 102542943 102543107 12287033
-51 32 31
-82
-
-chain 659 chr8_random 943810 + 178382 178432 chr8 146364022 + 43825088 43825138 1126561
-50
-
-chain 630 chr8_random 943810 + 343296 343350 chr8 146364022 - 102532544 102532598 1087222
-54
-
-chain 622 chr8_random 943810 + 284683 284767 chr8 146364022 + 46845804 46845888 4299331
-84
-
-chain 618 chr8_random 943810 + 240201 240253 chr8 146364022 - 99520719 99520771 5790991
-52
-
-chain 609 chr8_random 943810 + 323290 333340 chr8 146364022 - 99511696 99512332 2037608
-32 1962 77
-33 7985 456
-38
-
-chain 511 chr8_random 943810 + 216312 216456 chr8 146364022 - 99508390 99508534 2116227
-83 23 23
-38
-
-chain 484 chr8_random 943810 + 208068 208103 chr8 146364022 - 102535970 102536005 2214348
-35
-
-chain 473 chr8_random 943810 + 323389 323449 chr8 146364022 - 102540821 102540881 1734527
-60
-
-chain 468 chr8_random 943810 + 200282 202177 chr8 146364022 - 99515228 99517906 493558
-37 1827 2610
-31
-
-chain 468 chr8_random 943810 + 309496 309560 chr8 146364022 - 99509535 99509598 902510
-13 1 0
-50
-
-chain 464 chr8_random 943810 + 238361 238411 chr8 146364022 - 102570011 102570061 2549299
-50
-
-chain 406 chr8_random 943810 + 336390 336452 chr8 146364022 - 99513496 99513558 3227798
-62
-
-chain 400 chr8_random 943810 + 198171 198198 chr8 146364022 - 99524348 99524375 19170252
-27
-
-chain 389 chr8_random 943810 + 239467 298039 chr8 146364022 - 99516251 99516834 914933
-36 19 19
-76 58363 374
-78
-
-chain 383 chr8_random 943810 + 268230 268298 chr8 146364022 + 43829500 43829568 7647204
-68
-
-chain 371 chr8_random 943810 + 289553 289594 chr8 146364022 + 43829105 43829146 1419836
-41
-
-chain 325 chr8_random 943810 + 171359 194889 chr8 146364022 - 102534570 102537063 1177879
-33 23458 2421
-39
-
-chain 321 chr8_random 943810 + 245198 245253 chr8 146364022 + 46850481 46850536 16403329
-55
-
-chain 316 chr8_random 943810 + 336558 336619 chr8 146364022 - 99513661 99513722 9588463
-61
-
-chain 316 chr8_random 943810 + 215939 215982 chr8 146364022 - 102570362 102570405 11794790
-43
-
-chain 307 chr8_random 943810 + 268331 268373 chr8 146364022 + 46843677 46843719 14936951
-42
-
-chain 302 chr8_random 943810 + 246654 246683 chr8 146364022 + 46846317 46846346 2597963
-29
-
-chain 277 chr8_random 943810 + 330681 336249 chr8 146364022 - 99513081 99513355 13257215
-37 5476 182
-55
-
-chain 224 chr8_random 943810 + 233016 233053 chr8 146364022 - 102535110 102535147 5909193
-37
-
-chain 219 chr8_random 943810 + 216875 216929 chr8 146364022 - 99508952 99509006 1250703
-54
-
-chain 217 chr8_random 943810 + 192086 192136 chr8 146364022 + 43793491 43793541 12267504
-50
-
-chain 176 chr8_random 943810 + 230251 230289 chr8 146364022 - 99522702 99522740 26486914
-38
-
-chain 171 chr8_random 943810 + 301863 301893 chr8 146364022 - 99524375 99524405 2607431
-30
-
-chain 128 chr8_random 943810 + 303580 303689 chr8 146364022 - 102542031 102542140 1606173
-109
-
-chain 117 chr8_random 943810 + 213542 213590 chr8 146364022 - 102569848 102569896 24793283
-48
-
-chain 107 chr8_random 943810 + 265719 265758 chr8 146364022 + 43793691 43793730 32387625
-39
-
-chain 103 chr8_random 943810 + 302985 303114 chr8 146364022 - 99516149 99516278 2070053
-129
-
-chain 102 chr8_random 943810 + 266041 266087 chr8 146364022 + 43794012 43794058 15664471
-46
-
-chain 87 chr8_random 943810 + 266314 266347 chr8 146364022 + 46839806 46839839 33038660
-33
-
-chain 11336435868 chr9 140273252 + 0 140273252 chr9 141213431 + 10000 141153431 13
-189075 1 1
-14 2 2
-39464594 50000 50000
-261110 50000 50000
-208233 50000 50000
-142805 50000 50000
-464507 50000 50000
-152873 50000 50000
-172579 50000 50000
-799200 0 4
-398958 50000 50000
-549743 50000 100000
-632871 50000 50000
-680077 50000 50000
-181647 50000 50000
-291910 50000 100000
-465318 50000 50000
-350909 50000 50000
-194609 50000 100000
-370335 0 176
-128583 50000 100000
-157546 18100000 18150000
-450681 50000 50000
-223855 50000 50000
-162441 50000 50000
-159539 50000 50000
-199148 50000 50000
-194491 50000 100000
-158462 50000 150000
-471702 50000 150000
-376183 50000 150000
-174765 50000 150000
-289439 50000 50000
-682157 50000 50000
-158187 50000 100000
-187806 50000 50000
-178933 50000 100000
-21507948 50000 100000
-85380 50000 150000
-834971 1 0
-39559293 100000 150000
-3818133 200000 50000
-2075804 30000 50000
-1936434
-
-chain 19053295 chr9_random 1146434 + 140076 853151 chr9 141213431 + 43822338 44639038 145
-1110 1 1
-47 1 0
-215 1 0
-468 9 9
-1934 0 1
-953 14319 26012
-970 11 11
-117 1 1
-57 1 1
-127 0 1
-1035 1 1
-123 1 1
-1418 29455 36221
-965 1 1
-33 5 5
-816 1 1
-38 1 1
-87 8 8
-588 6 6
-286 13 13
-967 6 6
-911 125 14857
-67 1 1
-18 1 1
-472 11 11
-269 7 0
-869 1 1
-23 1 1
-240 1 0
-456 1 1
-96 1 1
-247 22 22
-225 1 1
-13 0 4
-40 1 1
-211 13 29
-582 1 1
-22 4 0
-453 1 1
-37 1 1
-251 11 11
-87 1 1
-49 1 1
-95 11 11
-149 1 1
-31 1 1
-205 5 0
-1090 5 5
-89 1 1
-74 14 14
-83 1 1
-51 1 1
-594 1 3
-462 85 85
-635 50621 3293
-88 0 1
-148 18 18
-428 2 0
-5 2 0
-19 0 1
-43 1 1
-529 1 6
-77 1 1
-31 1 1
-39 0 5
-124 15 15
-51 1 1
-80 1 1
-103 1 1
-77 1 1
-147 1 1
-72 1 1
-95 10 10
-657 1 1
-57 1 1
-69 1 1
-32 1 1
-587 4 4
-298 14 14
-1505 10 8
-560 0 4
-171 1 1
-44 1 1
-211 1 1
-22 1 1
-649 1 1
-42 0 2
-96 8 8
-45 1 0
-195 402195 519766
-38949 0 176
-45847 1 0
-46124 1 0
-3889 0 1
-52224
-
-chain 10363290 chr9_random 1146434 + 903151 1075657 chr9_gl000199_random 169874 + 0 130000 308
-35955 882 0
-20 1020 0
-32 3062 0
-106 14 15
-100 9 7
-334 16 18
-121 1 0
-84 3469 73
-179 1193 0
-255 3064 0
-235 844 167
-325 2720 0
-211 25 25
-216 3639 67
-100 681 1
-58 5271 0
-71 36 36
-155 11817 855
-1017 1 0
-10599 1 1
-42 0 1
-8519 112 112
-9882 0 680
-263 8 8
-56 30 30
-206 865 183
-1131 1 0
-12309 16295 0
-37 2637 0
-463 15 15
-739 1 1
-64 1 1
-2323 1 0
-743 202 202
-245 2 0
-10307 33 32
-8496 15 15
-1065 3 3
-49 1 1
-67 1 1
-24 1 1
-150 15 15
-81 1112 7412
-104 5 5
-160 48 48
-156 31 31
-109 29 29
-32 0 337
-118 36 36
-108 21 21
-69 163 165
-105 29 29
-255 32 32
-176 46 46
-97 54 54
-158 110 5213
-54 5 5
-61 1 0
-12 66 578
-49 0 1
-256 0 1
-5 1 0
-110 0 507
-39 59 227
-44 1 0
-5 1 2
-13 268 611
-32 340 0
-2169 5 5
-109
-
-chain 8496666 chr9_random 1146434 + 526031 616031 chr9_gl000198_random 90085 + 0 90000 391
-90000
-
-chain 3482851 chr9_random 1146434 + 0 36148 chr9_gl000201_random 36148 + 0 36148 837
-36148
-
-chain 3114479 chr9_random 1146434 + 350153 383343 chr7 159138663 + 58020084 58054331 923
-5741 0 1
-5176 1 1
-36 1 1
-8401 0 3
-180 1 0
-1283 1 371
-2015 11 695
-10343
-
-chain 2652717 chr9_random 1146434 + 939453 971857 chr9_gl000199_random 169874 + 50544 169869 966
-78 104 103
-57 43 43
-41 0 1193
-212 20 20
-112 51 51
-93 1 0
-763 32 32
-929 0 85729
-2133 785 785
-1551 1 1
-38 0 1
-29 1 1
-1849 179 179
-1081 14 14
-98 255 255
-3064 235 235
-844 325 325
-2000 1 1
-55 1 1
-663 211 211
-25 216 216
-3639 100 100
-681 58 58
-5271 71 71
-36 155 155
-4203
-
-chain 864673 chr9_random 1146434 + 1126594 1146123 chr9 141213431 - 1097613 1113419 4959
-1953 6 5
-978 2409 6373
-1991 1 1
-30 1 1
-1102 7741 55
-57 1 1
-3259
-
-chain 850211 chr9_random 1146434 + 1025598 1042157 chr9_gl000199_random 169874 + 85137 125159 1202
-223 15 15
-69 106 782
-56 4 4
-103 0 1190
-57 51 51
-154 11 11
-103 0 1190
-303 94 5704
-122 20 700
-283 11 11
-564 0 6798
-68 31 31
-85 0 1
-80 48 48
-422 49 50
-604 27 3091
-147 0 4594
-563 468 470
-104 1 1
-65 1 1
-786 1 1
-26 4 4
-3436 346 0
-2356 158 158
-2985 37 37
-170 167 170
-910 11 11
-54
-
-chain 769263 chr9_random 1146434 + 86461 232520 chr9 141213431 + 40031497 40507253 306
-1287 1 1
-39 9090 8469
-1482 3 0
-72 22972 39210
-845 1 5
-1628 100 33581
-19 1 1
-708 1 1
-40 1 1
-1672 2596 163229
-3012 1 1
-27 1 0
-759 0 1
-98 72164 49914
-85 17764 159979
-3474 1 1
-50 1 1
-6064
-
-chain 759449 chr9_random 1146434 + 205961 214049 chr9 141213431 + 40301888 40309971 6546
-2149 0 1
-2715 38 32
-3186
-
-chain 584316 chr9_random 1146434 + 1135427 1141773 chr9 141213431 + 140095418 140108346 9081
-578 0 1
-958 0 1
-3002 120 6700
-1688
-
-chain 406492 chr9_random 1146434 + 174973 187473 chr9 141213431 - 97329171 97382324 1352
-1045 1 0
-610 3 3
-25 1 1
-707 0 1
-949 1 0
-476 1 1
-37 0 2
-115 22 0
-99 2 0
-19 0 1
-85 84 84
-391 0 2
-2020 102 40820
-178 0 5
-70 1 1
-108 1 0
-1683 56 22
-203 4 0
-53 0 3
-1920 1 0
-25 15 0
-171 0 4
-991 1 0
-102 1 1
-39 1 0
-81
-
-chain 392431 chr9_random 1146434 + 102229 150933 chr9 141213431 - 100800050 101111299 1649
-1200 31 31
-61 100 87
-1550 13066 115954
-174 1 7
-2845 28138 189099
-40 1462 165
-36
-
-chain 384690 chr9_random 1146434 + 98535 256322 chr9 141213431 - 100787713 101169878 613
-1160 1 0
-743 100 2055
-1590 33793 2374
-3943 1 0
-110 10986 2654
-28 3892 11
-65 38 37
-101 8010 603
-1627 0 1
-4154 127 18597
-1903 17 17
-1098 1 0
-907 16 6
-635 1 0
-110 11 10
-1170 39276 55950
-254 1 1
-16 1 1
-222 1 1
-23 0 3
-11 1 1
-963 0 1
-1311 1 1
-22 1 1
-1083 0 2
-4770 9790 219711
-142 1 1
-35 1 1
-191 1 1
-48 1 1
-4295 1 0
-1323 1 1
-26 1 0
-2991 1 0
-1653 100 28511
-184 1 1
-25 1 1
-2332 2 0
-2424 1 1
-18 1 1
-1612 0 2
-1973 2 0
-4314
-
-chain 222862 chr9_random 1146434 + 974475 976909 chr9_gl000199_random 169874 - 29206 35723 496317
-103 0 512
-103 0 2379
-1951 0 1192
-277
-
-chain 216950 chr9_random 1146434 + 179171 191499 chr9 141213431 - 75591738 75613431 4354
-84 8327 17685
-315 1 1
-43 1 1
-565 1 1
-45 1 1
-144 1 1
-47 3 3
-216 4 8
-856 15 15
-173 1 1
-23 0 1
-306 1 1
-34 1 2
-855 1 1
-41 1 1
-59 0 1
-60 1 1
-46 1 1
-55
-
-chain 213582 chr9_random 1146434 + 1129631 1131840 chr9 141213431 - 1091833 1094042 537694
-2209
-
-chain 165378 chr9_random 1146434 + 971957 973731 chrX 155270560 + 21244335 21246110 770883
-1088 0 1
-111 1 1
-46 3 3
-525
-
-chain 132596 chr9_random 1146434 + 92033 271291 chr9 141213431 - 75460140 75627580 890
-687 15 5
-714 42447 12782
-26 11947 6649
-27 11 12
-38 1490 2
-104 2 0
-98 117515 142147
-548 14 14
-760 1 1
-15 5 5
-244 0 8
-225 1 1
-25 1 1
-184 1 1
-24 1 1
-112 1 1
-49 1 1
-657 0 4
-26 1 1
-142 1 1
-117 1 1
-521 1 1
-30 1 1
-427
-
-chain 126182 chr9_random 1146434 + 264182 265594 chr9 141213431 + 41417376 41418784 8289
-408 11 11
-453 3 0
-470 1 0
-66
-
-chain 121265 chr9_random 1146434 + 153981 183865 chr9 141213431 + 40369543 40485128 5651
-820 1 0
-80 65 65
-38 101 101
-1814 1 1
-19 1 1
-2113 24775 110477
-56
-
-chain 112452 chr9_random 1146434 + 977951 979143 chr9 141213431 + 41554070 41555262 1142654
-1192
-
-chain 111666 chr9_random 1146434 + 115028 116206 chr9 141213431 + 38976673 38977851 1144814
-1178
-
-chain 91839 chr9_random 1146434 + 95026 96000 chr9 141213431 - 97340505 97341479 1389514
-974
-
-chain 86695 chr9_random 1146434 + 89274 94894 chr9 141213431 + 40421854 40482922 755289
-656 0 1
-294 1 0
-357 1 1
-58 1 1
-181 2726 58174
-1345
-
-chain 85848 chr9_random 1146434 + 116324 118085 chr9 141213431 + 40126032 40127795 187229
-1300 0 2
-247 1 1
-31 1 1
-181
-
-chain 83527 chr9_random 1146434 + 105271 111078 chr9 141213431 + 43838264 43842306 8535
-1025 1 1
-44 1 1
-374 2077 318
-609 3 0
-643 18 19
-121 15 16
-135 5 0
-736
-
-chain 82351 chr9_random 1146434 + 265594 267154 chr9 141213431 - 97363431 97364991 1727
-341 2 2
-20 1 1
-738 1 1
-34 1 1
-206 1 1
-40 1 1
-174
-
-chain 74906 chr9_random 1146434 + 107880 108681 chr9 141213431 + 40288016 40288817 1344818
-46 1 0
-553 0 1
-201
-
-chain 73427 chr9_random 1146434 + 106816 115028 chr9 141213431 - 93902441 93905998 1707
-229 0 1
-500 19 19
-145 5760 1098
-49 0 1
-9 0 1
-188 1 1
-43 1 1
-243 1 1
-41 1 1
-206 1 1
-25 1 1
-443 0 1
-171 0 3
-135
-
-chain 72594 chr9_random 1146434 + 977068 977842 chr9 141213431 - 99740263 99741035 1743552
-651 1 0
-45 1 0
-76
-
-chain 68316 chr9_random 1146434 + 87923 91873 chr9 141213431 - 101134923 101183249 1049825
-372 0 1
-115 1 1
-37 1 1
-725 1749 46124
-950
-
-chain 61838 chr9_random 1146434 + 1042331 1042988 chr9_gl000199_random 169874 - 40496 41153 2045151
-657
-
-chain 55013 chr9_random 1146434 + 1075993 1076574 chr2 243199373 - 242829160 242829741 2308873
-581
-
-chain 54512 chr9_random 1146434 + 144930 149178 chr9 141213431 - 75605255 75609502 8620
-250 1 1
-26 1 1
-262 14 19
-1397 10 9
-876 1 0
-98 79 75
-65 1 1
-772 1 1
-31 1 1
-235 1 1
-74 1 1
-51
-
-chain 52053 chr9_random 1146434 + 149316 153855 chr9 141213431 + 40375457 40380000 99648
-79 244 244
-76 2437 2440
-75 10 10
-247 0 1
-19 1304 1304
-48
-
-chain 51431 chr9_random 1146434 + 126523 128919 chr9 141213431 - 101152632 101155028 6098
-2396
-
-chain 48062 chr9_random 1146434 + 390785 391322 chr5 180915260 - 163073999 163074536 2667488
-241 1 1
-201 3 3
-91
-
-chain 43629 chr9_random 1146434 + 1073062 1075987 chr9_gl000199_random 169874 + 35053 37976 298767
-312 2456 2456
-1 2 0
-78 21 21
-55
-
-chain 37453 chr9_random 1146434 + 1024767 1030521 chr9_gl000199_random 169874 + 88172 123905 8301
-52 0 3738
-40 1994 12406
-94 1068 11110
-31 165 2038
-48 1933 5847
-329
-
-chain 33524 chr9_random 1146434 + 133017 135796 chr9 141213431 + 39163384 39166153 115831
-53 1 1
-307 5 4
-44 1 1
-406 1 1
-21 5 0
-43 1 1
-177 1 1
-25 1 0
-31 1 1
-137 5 5
-20 1 1
-52 1 1
-27 1 1
-233 1 1
-20 1 1
-394 3 0
-363 1 1
-24 1 1
-370
-
-chain 29196 chr9_random 1146434 + 343146 344485 chr3 198022430 + 156000638 156001989 5034584
-50 1 0
-56 1 1
-104 128 140
-64 838 839
-97
-
-chain 28265 chr9_random 1146434 + 96095 96747 chr9 141213431 - 93903474 93904131 1828707
-74 0 10
-511 4 0
-47 1 0
-15
-
-chain 26156 chr9_random 1146434 + 111189 113362 chr9 141213431 - 102220148 102222323 47568
-1400 0 1
-94 5 6
-674
-
-chain 25868 chr9_random 1146434 + 149715 153807 chr9 141213431 - 93950637 93954729 91748
-181 1 1
-57 1 1
-353 15 15
-330 1 0
-22 1 1
-220 93 93
-114 0 17
-104 9 9
-290 2 0
-293 1 1
-20 1 1
-328 351 343
-127 1 1
-76 1 1
-331 4 0
-52 1 1
-17 1 1
-106 5 0
-146 1 1
-38 0 3
-7 1 0
-116 3 3
-16 1 1
-168 0 1
-85
-
-chain 25003 chr9_random 1146434 + 1069304 1075830 chr9_gl000199_random 169874 + 56286 59580 21268
-305 7 7
-77 487 487
-25 288 288
-36 198 198
-163 105 105
-29 463 463
-46 1256 67
-82 36 36
-95 32 32
-28 2595 552
-103 9 9
-61
-
-chain 23281 chr9_random 1146434 + 1028681 1035309 chr9_gl000199_random 169874 + 97567 114227 7110
-30 1360 6799
-121 342 0
-5 4424 9363
-103 237 233
-6
-
-chain 21805 chr9_random 1146434 + 1135081 1135321 chr9 141213431 + 140101239 140101479 9135145
-197 1 1
-42
-
-chain 21533 chr9_random 1146434 + 1010735 1043373 chr9_gl000199_random 169874 + 61213 69988 6310
-337 14018 4703
-439 42 42
-27 307 307
-106 220 220
-51 16938 2390
-153
-
-chain 19014 chr9_random 1146434 + 335566 335883 chr16 90354753 - 56512811 56513131 11268597
-170 97 100
-50
-
-chain 18803 chr9_random 1146434 + 86148 86348 chr9 141213431 - 100705477 100705677 11441237
-200
-
-chain 13349 chr9_random 1146434 + 1068589 1070018 chr9_gl000199_random 169874 + 79052 79803 7749
-23 14 14
-253 37 37
-60 717 39
-8 269 269
-48
-
-chain 13149 chr9_random 1146434 + 410938 411078 chr8 146364022 + 38639711 38639851 17290853
-140
-
-chain 12972 chr9_random 1146434 + 332343 332481 chr7 159138663 + 61759398 61759536 17535033
-138
-
-chain 12821 chr9_random 1146434 + 388858 389014 chr15 102531392 + 80798356 80798512 17757829
-81 12 12
-63
-
-chain 11442 chr9_random 1146434 + 388166 388417 chr12 133851895 + 34836761 34837526 19956621
-81 109 623
-61
-
-chain 11149 chr9_random 1146434 + 343358 343713 chr3 198022430 - 62479553 62479920 5356830
-1 103 115
-24 134 134
-93
-
-chain 11085 chr9_random 1146434 + 468603 468722 chr9 141213431 + 42720405 42720524 20596057
-119
-
-chain 9550 chr9_random 1146434 + 389696 390760 chrX 155270560 + 61752907 61753125 23891795
-65 939 93
-60
-
-chain 9178 chr9_random 1146434 + 345818 345932 chr16 90354753 + 32819577 32819691 24666411
-52 7 7
-55
-
-chain 9128 chr9_random 1146434 + 321692 322933 chr7 159138663 + 61799163 61799701 24755828
-61 1115 412
-65
-
-chain 9086 chr9_random 1146434 + 338884 339289 chr16 90354753 + 32789437 32789842 24819157
-53 289 289
-63
-
-chain 9023 chr9_random 1146434 + 387021 388166 chr7 159138663 + 61404533 61405164 23790101
-52 1085 571
-8
-
-chain 7872 chr9_random 1146434 + 1069035 1072121 chr9_gl000199_random 169874 + 119465 157584 536281
-72 46 46
-97 2835 37868
-36
-
-chain 7579 chr9_random 1146434 + 402601 403961 chr3 198022430 - 107545066 107546932 27123369
-31 1026 0
-52 201 1733
-50
-
-chain 7458 chr9_random 1146434 + 343360 343449 chr6 171115067 + 69499143 69499232 6836024
-89
-
-chain 6713 chr9_random 1146434 + 425056 425127 chr16 90354753 + 46455806 46455877 28826250
-71
-
-chain 6541 chr9_random 1146434 + 468921 468991 chr7 159138663 + 61361207 61361277 29216706
-70
-
-chain 6486 chr9_random 1146434 + 330636 330705 chr10 135534747 + 42383267 42383336 29375264
-69
-
-chain 6456 chr9_random 1146434 + 411427 412083 chr11 135006516 + 48877623 48879132 29439180
-48 554 1407
-54
-
-chain 6295 chr9_random 1146434 + 404771 404838 chr8 146364022 + 43770407 43770474 29850106
-67
-
-chain 6049 chr9_random 1146434 + 414120 414184 chr7 159138663 - 101095351 101095415 30492982
-64
-
-chain 6040 chr9_random 1146434 + 465963 466027 chr6 171115067 + 83274875 83274939 30512451
-64
-
-chain 5969 chr9_random 1146434 + 389015 389089 chrY 59373566 - 43064540 43064609 20514560
-61 5 0
-8
-
-chain 5636 chr9_random 1146434 + 406636 407740 chr8 146364022 + 43770397 43770476 31630565
-28 1025 0
-51
-
-chain 5631 chr9_random 1146434 + 426803 426863 chr10 135534747 + 42387748 42387808 31636152
-60
-
-chain 5540 chr9_random 1146434 + 419067 419126 chr7 159138663 + 61079182 61079241 31906304
-59
-
-chain 5476 chr9_random 1146434 + 398987 399045 chr12 133851895 + 34839855 34839913 32105830
-58
-
-chain 5376 chr9_random 1146434 + 415322 415379 chr11 135006516 - 86268315 86268372 32415872
-57
-
-chain 5358 chr9_random 1146434 + 413960 414017 chrY 59373566 - 49305277 49305334 32458256
-57
-
-chain 5349 chr9_random 1146434 + 411179 411236 chr7 159138663 + 91218545 91218602 32466470
-57
-
-chain 5349 chr9_random 1146434 + 417041 417098 chr11 135006516 - 84295010 84295067 32466776
-57
-
-chain 5305 chr9_random 1146434 + 979284 979471 chr9_gl000199_random 169874 + 100510 100697 1541
-187
-
-chain 5294 chr9_random 1146434 + 393589 393645 chr19_gl000208_random 92689 - 78786 78842 32648958
-56
-
-chain 5285 chr9_random 1146434 + 407829 407885 chr16 90354753 + 34022252 34022308 32672407
-56
-
-chain 5248 chr9_random 1146434 + 345095 345150 chr3 198022430 + 72765342 72765397 32777800
-55
-
-chain 5194 chr9_random 1146434 + 325928 325983 chr16 90354753 + 46454212 46454267 32965981
-55
-
-chain 5076 chr9_random 1146434 + 385523 385577 chr9 141213431 - 74211269 74211323 33342253
-54
-
-chain 5012 chr9_random 1146434 + 398477 398530 chr3 198022430 - 107545544 107545597 33565319
-53
-
-chain 4985 chr9_random 1146434 + 417987 418040 chr8 146364022 + 43776134 43776187 33649135
-53
-
-chain 4821 chr9_random 1146434 + 397137 397188 chrX 155270560 + 61817502 61817553 34214385
-51
-
-chain 4794 chr9_random 1146434 + 414576 414627 chr11 135006516 + 50778923 50778974 34325073
-51
-
-chain 4794 chr9_random 1146434 + 397714 397765 chr19_gl000208_random 92689 - 71810 71861 34325191
-51
-
-chain 4730 chr9_random 1146434 + 411917 411967 chr21 48129895 - 33764186 33764236 34527656
-50
-
-chain 4709 chr9_random 1146434 + 107713 107880 chr9 141213431 + 40326898 40327067 460940
-64 0 2
-103
-
-chain 4703 chr9_random 1146434 + 396620 396670 chr11 135006516 + 50701175 50701225 34648839
-50
-
-chain 4594 chr9_random 1146434 + 460317 460366 chr1 249250621 + 72586197 72586246 34758860
-49
-
-chain 4154 chr9_random 1146434 + 389765 389825 chrX 155270560 + 61859291 61859351 24051909
-60
-
-chain 4125 chr9_random 1146434 + 1047887 1048034 chr9_gl000199_random 169874 + 145761 145908 266403
-21 18 18
-108
-
-chain 4032 chr9_random 1146434 + 1010207 1010501 chr9_gl000199_random 169874 + 46738 47032 105345
-133 51 51
-110
-
-chain 3744 chr9_random 1146434 + 974418 974475 chr9_gl000199_random 169874 - 111819 111876 792102
-57
-
-chain 3426 chr9_random 1146434 + 939387 939437 chr9_gl000199_random 169874 + 161370 161420 23133078
-50
-
-chain 3397 chr9_random 1146434 + 1069115 1069304 chr9_gl000199_random 169874 + 57287 57476 721888
-38 97 97
-54
-
-chain 3297 chr9_random 1146434 + 1037665 1037723 chr9_gl000199_random 169874 + 108413 108471 1099981
-5 32 32
-21
-
-chain 2900 chr9_random 1146434 + 210827 210859 chr9 141213431 + 43889710 43889742 6957
-32
-
-chain 2688 chr9_random 1146434 + 1042157 1042279 chr9_gl000199_random 169874 + 112227 112349 8300
-65 9 9
-48
-
-chain 2652 chr9_random 1146434 + 999650 1043482 chr9_gl000199_random 169874 + 41812 46278 8409
-112 43376 4009
-54 0 1
-28 153 153
-109
-
-chain 2438 chr9_random 1146434 + 1025529 1025571 chr9_gl000199_random 169874 + 134052 134094 269933
-42
-
-chain 2404 chr9_random 1146434 + 153855 153881 chr9 141213431 + 40071265 40071291 103174
-26
-
-chain 2298 chr9_random 1146434 + 1010672 1010735 chr9_gl000199_random 169874 + 66766 66829 8935
-63
-
-chain 2164 chr9_random 1146434 + 1010368 1010391 chr9 141213431 - 71502272 71502295 32168220
-23
-
-chain 2160 chr9_random 1146434 + 388789 388840 chr7 159138663 - 101569537 101569588 23945255
-51
-
-chain 2026 chr9_random 1146434 + 343746 343819 chr10 135534747 + 18324071 18324144 14357746
-73
-
-chain 1834 chr9_random 1146434 + 1010501 1010672 chr9_gl000199_random 169874 + 60299 60470 7461
-171
-
-chain 1808 chr9_random 1146434 + 391322 391360 chr7 159138663 - 47529927 47529965 6263864
-38
-
-chain 1777 chr9_random 1146434 + 343550 344817 chr22 51304566 + 35077657 35078810 5733588
-48 1167 1053
-52
-
-chain 1529 chr9_random 1146434 + 263922 264091 chr9 141213431 + 65673675 65673833 515
-62 10 0
-17 1 0
-14 2 2
-63
-
-chain 1325 chr9_random 1146434 + 1037723 1037780 chr9_gl000199_random 169874 + 96057 96114 245438
-57
-
-chain 1237 chr9_random 1146434 + 1024624 1024767 chr9_gl000199_random 169874 + 49580 49723 8604
-143
-
-chain 1217 chr9_random 1146434 + 1071842 1072151 chr9_gl000199_random 169874 + 48108 48417 165690
-30 6 6
-74 169 169
-30
-
-chain 897 chr9_random 1146434 + 1035274 1035303 chr9_gl000199_random 169874 + 108574 108603 711169
-29
-
-chain 881 chr9_random 1146434 + 345308 345393 chrX 155270560 - 77826120 77826205 8910963
-85
-
-chain 812 chr9_random 1146434 + 344331 344387 chr9 141213431 + 18649465 18649521 20542621
-56
-
-chain 538 chr9_random 1146434 + 1029334 1029359 chr9_gl000199_random 169874 + 75943 75968 9317
-25
-
-chain 480 chr9_random 1146434 + 344828 344880 chr4 191154276 - 62643619 62643671 15050009
-52
-
-chain 461 chr9_random 1146434 + 96747 96777 chr9 141213431 + 38980922 38980952 1279
-30
-
-chain 364 chr9_random 1146434 + 1025018 1025062 chr9_gl000199_random 169874 + 64308 64352 115390
-44
-
-chain 296 chr9_random 1146434 + 1009971 1010001 chr9_gl000199_random 169874 + 44634 44664 18919
-30
-
-chain 288 chr9_random 1146434 + 974120 974172 chr9_gl000199_random 169874 + 44920 44972 1936043
-52
-
-chain 260 chr9_random 1146434 + 394227 394279 chr11 135006516 + 50701175 50701227 28339537
-52
-
-chain 210 chr9_random 1146434 + 1025062 1025090 chr9_gl000199_random 169874 + 71670 71699 216729
-6 0 1
-22
-
-chain 209 chr9_random 1146434 + 388033 388083 chr11 135006516 - 84294197 84294247 27927923
-50
-
-chain 152 chr9_random 1146434 + 393023 393074 chr20 63025520 + 26259164 26259215 28112557
-51
-
-chain 86 chr9_random 1146434 + 405210 405252 chr3 198022430 - 107550280 107550322 32195393
-42
-
-chain 79 chr9_random 1146434 + 392892 392941 chr11 135006516 + 50661000 50661049 27948217
-49
-
-chain 1574309 chrM 16571 + 0 16571 chrM 16571 + 0 16571 1567
-16571
-
-chain 14267288654 chrX 154913754 + 0 154913754 chrX 155270560 + 60000 155260560 8
-34821 50000 50000
-86563 30000 50000
-766173 50000 50000
-36556 50000 50000
-80121 90000 50000
-754004 100000 50000
-5505644 0 50000
-3064785 0 50079
-26309510 25000 50000
-201175 0 8
-7417 2 0
-53136 0 8
-3076 12 0
-21092 2 0
-60831 0 2
-57728 20 0
-54336 1 0
-31676 4 0
-9986 0 4
-12109 4 0
-11227342 2000 0
-354815 50000 50000
-77401 1 1
-17 1 1
-94 3 0
-266 10 10
-113 1 1
-21 1 1
-5401 5 0
-4970 2 0
-33 6 0
-3221 1 5
-6456 0 1
-1476 5 5
-2100 1 1
-40 1 1
-1316 1 0
-2446 0 1
-1589 17 15
-11171 0 1
-2639 0 1
-5190 4 0
-78 0 8
-5087 1 0
-2663 0 1
-9149 8 7
-1851 1 0
-9081 1 0
-7249 0 25
-199 2 0
-12 2 0
-16 0 209
-37 0 20
-2536 1 0
-1394 6 0
-12550 42 0
-821 0 4
-30579 0 1
-3710 0 4
-3638 0 1
-11945 1 0
-20204 1 0
-4171 0 8
-5680 0 1
-23827 2 0
-54817 1 0
-657 1 0
-342931 180000 50000
-2052068 1 27
-5375 0 2
-46 2 0
-6489 1 0
-7175 0 2
-1239 0 2
-4302 4 0
-27253 1 0
-4244 2 0
-717 2 0
-261 6 0
-26074 0 1
-236464 50000 50000
-6136098 3000000 3100000
-13518993 0 1
-449 0 1
-4533 0 4
-757 0 1
-1102 25 26
-107 0 2
-3470 1 0
-1108 0 1
-4775 0 1
-8628 1 1
-46 1 1
-1072 1 1
-44 1 1
-292 5 4
-9091 4 4
-2218 4 4
-705 1 5
-452 1 0
-88 32 32
-212 1 0
-1801 1 7
-3960 0 1
-2007 0 1
-1979 38 38
-1320 0 1
-2093 0 1
-403 0 310
-6134 1 1
-36 1 1
-1697 0 1
-97 0 13
-7624 1 1
-19 1 1
-6933 0 1
-779 7 7
-721 1 1
-43 1 1
-1626 1 0
-6146 2 0
-150 1 1
-47 1 1
-2172 2 0
-398 1 1
-31 1 1
-1149 2 2
-183 16 16
-1663 1 1
-18 1 1
-2105 10 11
-1409 1 1
-33 1 1
-1753 0 1
-408 1 0
-1916 0 1
-477 37 37
-1415 12 0
-3799 17 17
-2921 1 0
-1811 33 33
-2753 2 0
-486 0 6
-1388 1 1
-44 1 1
-186 1 1
-46 1 1
-3037 1 0
-2301 3 0
-3876 1 1
-22 1 1
-1724 0 1
-3733 0 1
-627 0 1
-250 1 0
-194 1 1
-26 1 1
-20797 10 10
-2445 1 0
-1733 0 2
-1001 12 0
-4394 9 9
-4052 10 9
-670 1 1
-97 6 0
-25 1486 1188
-10 3 2
-28 41 41
-28 2 3
-10 126 1058
-11 1051 417
-25 0 6
-18 1 1
-62 17 17
-77 0 1
-1009 41 41
-3899 10 10
-4690 0 1
-7343 1 0
-1248 1 0
-1259 1 0
-1345 0 4
-1534 1 0
-3797 16 16
-807 1 0
-2427 1 0
-48 0 1
-287 1 0
-611353 0 1
-1041 6 0
-371 0 1
-227 0 1
-2806 1 0
-36 1 1
-234 1 1
-23 1 1
-584 1 0
-22241 1 1
-65 1 1
-4605 0 1
-2326 0 20
-2130 0 1
-6170 9 13
-10665 0 1
-14631 1 0
-5359 4 0
-4004 1 0
-3182 11 0
-3897 14 16
-2551 1 0
-1824 1 0
-5274 1 1
-41 1 1
-4309 0 1
-3827 0 1
-4594 0 1
-65 1 1
-1170 1 1
-42 4 4
-214 0 1
-5228 0 1
-553 1 0
-5528 7 7
-735 14 14
-2861 1 0
-156 0 2
-6183 42 42
-2595 1 1
-41 1 1
-472 1 1
-65 0 1
-8 1 1
-1162 1 0
-565 1 1
-48 1 1
-536 2 1
-766 0 2
-4520 0 1
-1574 1 0
-503 0 1
-2558 0 1
-250061 7 7
-9650 18 18
-3208 1 1
-25 0 1
-744 2 0
-2994 1 1
-33 1 1
-1331 1 0
-2042 6 17
-1292 1 1
-35 1 1
-2485 1 1
-35 1 1
-17284 1 0
-7 7 1
-670 0 4
-429 0 1
-4736 1 0
-3849 0 1
-6745 16 16
-2344 1 1
-41 1 1
-4459 9 9
-3449 0 1
-3876 1 1
-75 1 1
-1429 7 7
-11126 26 26
-781 1 1
-28 1 1
-409 12 13
-1223 12 12
-5354 0 1
-1255 0 6
-851 65 65
-126 1 1
-47 5 5
-5931 4 0
-420 0 1
-2949 0 6
-193 324 324
-6740 1 3
-1074 1 0
-2465 1 1
-40 1 1
-640 2 0
-550 1 1
-32 1 1
-4096 1 1
-29 1 1
-949 6 6
-6258 1 0
-3957 1 0
-19608 1 1
-48 1 1
-234 0 1
-13246 13 13
-4651 321 0
-2617 1 0
-4553 0 3
-491 0 6
-7496 1 1
-9 0 10
-77 0 4
-3314 1 1
-32 1 1
-5217 1 0
-1500 17 17
-2023 1 0
-2425 0 18
-3110 8 8
-3248 1 0
-1946 1 1
-48 1 1
-9620 0 2
-31242 20000 50000
-36075685 3 0
-36004 1 1
-27 1 1
-5196 0 1
-293 0 2
-13307 0 3
-2420 6 0
-1863 0 2
-2911 0 1
-3233 2 0
-66 1 0
-2376 10 0
-4893 1 0
-745 1 0
-3897 0 13
-3835 1 1
-55 1 1
-538 1 1
-48 4 1
-20 0 2
-279 0 2
-33 1 1
-48 1 0
-387 8 8
-692 0 1
-375 3 0
-383 1 1
-18 1 1
-1289 1 1
-29 1 1
-12332 0 331
-856 4 0
-48 0 4
-8716 0 5
-130 2 0
-3001 0 1
-1332 8 5
-23273 0 1
-30174 27 39
-337 0 3
-2838 1 0
-1614 0 9
-313 0 1
-83 4 0
-172 1 1
-25 1 1
-4912 0 39
-1863 0 1
-2931 1 0
-3134 0 3
-390880 0 1
-7199 1 0
-305 2 0
-1811 2 0
-5449 0 3
-7443 0 2
-2171 1 1
-27 1 1
-2668 0 2
-2180 0 1
-1170 0 9
-1450 16 16
-3080 1 0
-920 18 18
-10219 1 0
-678 1 1
-28 1 1
-698 1 0
-112 1 0
-1831 3 0
-14327 2 0
-2087 10 10
-150 0 3
-380 1 1
-28 1 1
-1265 19 21
-7184 3 2
-4225 9 14
-1002 0 1
-3855 4 0
-2534 1 1
-30 1 1
-794 1 0
-25 1 1
-76140 70000 50000
-1432750 4799 0
-8 2973 0
-681864 20000 50000
-4278742 0 56347
-12021233 9 9
-1775 1 0
-1468 1 1
-51 16 14
-6 0 1
-6 0 1
-11 4 5
-7 0 1
-4 0 1
-75 1 2
-26 1 0
-16 0 1
-9 0 1
-19 0 2
-22 1 0
-9 0 1
-5 1 3
-14 6 7
-38 1 0
-26 1 1
-62 0 1
-38 1 1
-1687 0 1
-54 0 1
-8528 0 1
-2722 0 1
-6240 0 1
-33 0 1
-121285 1 0
-6 0 1
-35 1 0
-1381 0 1
-5368 1 0
-3079 0 1
-10863441 0 4
-1799 1 1
-24 1 1
-334 1 0
-4960 17 0
-1160 1 1
-34 1 1
-6153 3 0
-1346 4 0
-103 4 0
-2835 12 12
-304 0 16
-719 0 1
-3286 1 0
-10182 0 9
-804 1 1
-28 1 1
-749 0 1
-3387 1 1
-47 1 1
-482 0 1
-455 15 15
-719 1 1
-18 1 1
-2074 0 1
-1348 0 4
-3928 1 1
-18 1 1
-907 0 1
-2972 2 0
-115 1 1
-37 1 1
-4428 1 0
-1120 1 0
-4055 5 0
-2753 18 18
-158 3 0
-3590 1 1
-47 1 1
-62 1 0
-947 1 1
-45 1 1
-1639 1 1
-32 1 1
-1076 0 1
-3996 4 0
-7965 1 0
-1733 1 0
-1451 0 2
-617 1 0
-4375 0 1
-2194 64 63
-301 1 1
-27 1 1
-6661 1 1
-79 1 1
-1495 1 0
-499 1 1
-37 2 2
-968 1 0
-34 1 1
-6337 1 1
-18 1 1
-8162 1 1
-22 5 0
-9274 1 0
-6017 5 5
-3872 8 0
-5421 1 0
-532 6 7
-5673 0 4
-1542 4 0
-890 3 1
-2561 1 0
-1692 1 0
-1142 1 1
-32 1 1
-503 2 1
-123 1 1
-75 1 1
-2322 1 0
-201 1 0
-40 3 3
-149 3 0
-1441 1 1
-40 1 1
-159 2 0
-1278 1 1
-33 1 1
-221 0 1
-31 1 1
-161 9 10
-1890 0 1
-132 1 1
-37 1 1
-514 17 23
-1373 4 0
-907 1 1
-15 1 1
-714 1 1
-18 0 1
-10 1 1
-55 1 1
-24 1 1
-1038 2 0
-95 1 5
-1094 1 1
-170 1 1
-844 0 3
-369 1 1
-39 1 1
-650 1 1
-41 1 1
-176 12 12
-688 1 0
-7640 4 0
-2650 1 1
-28 0 4
-44 1 1
-728 8 0
-2196 0 1
-13466 0 1
-3510 0 2
-2147 1 1
-44 0 3
-1320 11 11
-210 0 4
-105 1 0
-3239 0 1
-1496 142 153
-2391 1 1
-39 0 2
-438 4 0
-2272 8 0
-6865 0 3
-7183 0 1
-5104 0 3
-182 1 0
-3131 1 1
-31 1 0
-14 1 1
-59 1 0
-373 1 1
-42 1 1
-235 13 13
-1608 0 5
-152 1 1
-106 1 1
-783 34 34
-1633 1 1
-29 3 0
-821 1 1
-24 1 1
-1178 1 1
-33 1 1
-328 1 1
-27 1 1
-5682 16 13
-146398 30000 50000
-59809 0 2
-3389 1 1
-37 1 1
-11606 0 1
-1597 0 1
-618 1 1
-47 1 1
-2698 0 1
-826 5 5
-33 0 2
-2560 0 14
-98 0 3
-1287 0 1
-7600 0 1
-9894 0 8
-7160 0 1
-32 1 1
-1698 0 1
-754 2 0
-6787 0 1
-584 0 2
-1107 1 1
-40 1 1
-365 1 1
-35 1 1
-399 0 8
-11444 0 1
-1973 0 1
-1200 0 1
-716 1 1
-25 1 1
-1570 0 2
-433 2 0
-905 0 2
-94 1 1
-28 1 1
-2490 18 18
-5054 9 1
-2184 0 2
-2955 23 21
-431 49 49
-314 1 0
-1563 1 1
-20 1 1
-1632 11 0
-1671 2 0
-1527 0 1
-676 1 1
-29 1 1
-1245 1 1
-34 0 1
-1203 22 30
-1934 1 0
-3421 0 2
-17 1 1
-774 0 30
-97 6 6
-59 12 26
-840 1 1
-19 1 1
-2036 27 53
-683 30 30
-401 0 1
-25 1 1
-381 16 0
-159 1 1
-17 1 1
-1150 0 4
-700 1 0
-29 0 2
-409 1 1
-49 1 1
-1240 1 1
-37 3 3
-2248 0 1
-1828 0 1
-1997 1 5
-4640 4 4
-4555 2 0
-150 52 0
-618 2 2
-16 1 1
-83 0 22
-56 1 57
-2531 8 0
-4250 17 17
-2203 4 0
-1665 10 0
-415 0 2
-393 0 1
-15728 1 0
-158 0 4
-82 0 14
-543 1 1
-42 1 1
-3261 18 18
-139 1 1
-37 1 1
-410 1 1
-18 1 1
-5405 0 1
-1104 1 1
-53 1 1
-392 1 1
-55 3 3
-3352 0 9
-692 106 52
-27 4 0
-13 1 3
-14 88 0
-61 2 0
-8931 0 1
-6692 2 1
-253 19 19
-869 2 0
-196 0 2
-389 1 1
-30 1 1
-949 1 0
-6057 3 0
-4741 0 1
-7689 0 2
-2046 18 18
-215 1 0
-46885 0 2
-24138 0 2
-4037 0 1
-4047693 0 1
-9545 2 0
-11590 0 4
-1698 3 1
-18923 0 4
-1806 1 1
-44 1 1
-2581 2 0
-10620 1 0
-3804 1 0
-339 2 0
-476 1 0
-5861 5 8
-109 14 0
-901 1 1
-19 1 1
-45 0 2
-1736 0 1
-6625 0 2
-7812 0 4
-7678 0 2
-5086 3 8
-4170 1 0
-1671 0 6
-6333 16 0
-902 1 1
-44 1 1
-384 6 0
-23181 4 4
-214 0 2
-8958 4 0
-220 1 1
-49 1 1
-2783 1 0
-2641 1 0
-136 20 20
-1279 1 0
-3924 6 6
-13054 0 6
-8954 13 0
-4128 0 2
-2269 0 1
-16258 2 0
-30076 1 1
-49 1 1
-102 0 1
-8824 27 27
-1730 1 1
-47 1 1
-3339 1 0
-132 16 0
-81 0 16
-89 0 6
-6369 0 1
-541 0 1
-6288 4 0
-3814 0 2
-7260 1 0
-802 0 68
-1166 1 0
-2230 0 1
-1109 1 0
-1106 0 2
-12396 1 0
-26207 1 1
-21 1 1
-4087 16 0
-1323 7 7
-525 1 0
-4198 1 0
-4682 13 13
-890 2 0
-816 2 0
-1961 4 0
-24586 1 1
-19 1 1
-4403 0 1
-1342 0 1
-57 11 12
-2229 30 31
-1979 35 0
-10541 1 0
-9725 6 0
-2536 1 2
-20 1 1
-1541 12 0
-1130 1 1
-34 1 1
-927 1 0
-4003 1 0
-966 0 1
-149 1 0
-842 0 8
-4326 1 1
-25 1 1
-569 6 7
-664 2 2
-5695 0 1
-3074 1 0
-1539 9 3
-634 1 1
-39 1 1
-8610 1 1
-11 0 1
-345 43 43
-372 0 2
-4311 6 0
-3122 2 0
-369 0 1
-9963 10 10
-2191 1 1
-23 1 1
-1060 1 1
-19 1 1
-240 12 12
-1748 1 1
-45 1 1
-1040 1 1
-31 1 1
-7446 1 1
-25 1 1
-8379 7 7
-7325 0 3
-357 1 0
-1313 1 0
-11624 0 4
-5865 0 1
-9750 0 1
-3540 16 0
-5671 13 13
-2885 4 0
-8179 0 1
-753 1 0
-2289 49 49
-1979 2 0
-1318 0 1
-957 1 0
-825 12 12
-1110 16 0
-3735 17 17
-9997 223 53
-149 22 24
-636 1 1
-22 0 1
-42 1 1
-1634 4 4
-3380 3 0
-979 0 2
-3429 1 0
-7138 14 0
-1727 1 1
-38 1 0
-88 0 1
-630 20 20
-476 0 5
-21 0 1
-94 0 1
-42 1 0
-17 0 1
-27 0 1
-172 1 1
-37 1 1
-191 1 1
-66 1 1
-630 0 1
-261 1 1
-28 1 1
-1282 17 18
-429 0 1
-1588 1 1
-20 1 1
-1416 1 1
-33 1 1
-529 0 1
-25 0 1
-1863 0 4
-1651 1 1
-28 1 1
-11815 0 1
-26 0 1
-19 1 1
-3105 0 1
-700 0 1
-150 0 1
-68 0 1
-1420 0 6
-568 14 16
-2415 0 1
-41 1 1
-415 1 1
-33 1 1
-4521 1 1
-33 1 1
-307 1 0
-176 1 0
-3790 1 1
-86 1 1
-67 1 1
-65 0 1
-7439 1 1
-18 1 1
-16805 0 1
-1764 1 0
-3104 35 35
-3845 0 1
-3384 0 2
-17 0 18
-156 1 1
-30 1 1
-165 0 2
-1087 1 0
-953 1 0
-483 0 1
-632 1 0
-652 1 0
-8563 9 7
-1860 1 0
-398 1 0
-2219 1 1
-53 1 1
-756 1 1
-66 1 1
-69 1 1
-48 1 1
-63 1 1
-28 3 0
-1057 3 0
-63 0 3
-55 1 1
-74 3 2
-159 0 3
-92 1 1
-29 1 1
-58 3 0
-1210 9 9
-54 1 1
-27 1 1
-1374 0 2
-1775 17 2
-764 14 14
-331 16 16
-2291 3 4
-1687 1 1
-26 1 1
-2469 1 0
-3243 0 1
-3636 1 1
-24 1 1
-615 1 0
-2566 0 1
-275 5 0
-695 7 0
-9686 32 32
-3416 0 1
-1452 4 0
-214 13 13
-49 0 124
-1393 9 9
-5812 1 1
-24 1 1
-5703 0 1
-4006 1 0
-1462 3 0
-5199 2 0
-1554 0 2
-715 10 12
-1966 0 2
-2801 0 16
-618 0 1
-413 18 0
-730 1 1
-31 1 1
-4372 5 0
-10789 1 0
-2399 1 0
-6750 0 2
-1363 6 0
-6736 2 0
-4457 0 4
-7867 1 0
-3495 2 1
-7584 0 1
-2652 1 0
-1771 0 1
-14808 41015 41008
-19235 0 1
-9638 0 1
-2994 0 1
-469 3 1
-499 0 1
-12074 13 13
-2807 10 11
-715 0 2
-1627 6 6
-5099 1 0
-488 1 5
-975 0 2
-1761 0 1
-1794 5 0
-8254 3 3
-18 1 1
-3737 9 9
-1442 13 13
-212 0 10
-7712 1 1
-44 1 1
-4480 40 40
-1751 1 0
-1316 1 1
-49 1 1
-9050 4 0
-143 0 2
-2813 13 13
-1286 2857 49999
-75638 40000 50000
-1583473 0 2
-1564099 1 97463
-2933461
-
-chain 1621142 chrX 154913754 + 148570601 148611616 chrX 155270560 - 6466757 6507765 175
-13140 0 1
-20345 6 0
-3704 1 0
-1517 1 0
-2301
-
-chain 259772 chrX 154913754 + 75282398 75286444 chrX 155270560 - 79901776 79905823 6183
-1486 41 41
-41 40 40
-126 11 11
-1051 1209 1210
-41
-
-chain 192506 chrX 154913754 + 114908114 114911060 chrX 155270560 + 114997023 115000000 3054
-63 528 528
-60 0 16
-630 28 44
-689 16 16
-436 1 0
-495
-
-chain 188216 chrX 154913754 + 114908656 114914454 chrX 155270560 + 115000574 115005488 36116
-49 2721 1850
-47 8 8
-197 704 696
-2 16 0
-1155 42 43
-455 2 12
-400
-
-chain 119665 chrX 154913754 + 114906873 114908114 chrX 155270560 + 115003848 115005094 1024208
-1216 0 5
-25
-
-chain 29390 chrX 154913754 + 76491035 76491342 chr1 249250621 - 136684922 136685229 4932608
-307
-
-chain 25643 chrX 154913754 + 114911150 114911426 chrX 155270560 + 115005157 115005433 246321
-276
-
-chain 19821 chrX 154913754 + 114908177 114911739 chrX 155270560 + 114982173 114982762 1997
-479 3022 49
-61
-
-chain 15998 chrX 154913754 + 114911743 114912382 chrX 155270560 + 114967843 114968482 6239
-639
-
-chain 9708 chrX 154913754 + 148714470 148714905 chr5 180915260 - 8837105 8837560 23506322
-56 313 333
-66
-
-chain 9294 chrX 154913754 + 114906712 114906808 chrX 155270560 + 115005518 115005614 24447825
-96
-
-chain 6266 chrX 154913754 + 114906808 114906873 chrX 155270560 + 114962882 114962947 1027613
-65
-
-chain 6215 chrX 154913754 + 76426104 76426191 chrX 155270560 + 29934095 29934182 9535161
-87
-
-chain 5894 chrX 154913754 + 143027611 143027675 chr2 243199373 - 154977524 154977591 249
-15 0 3
-49
-
-chain 3277 chrX 154913754 + 76426069 76426104 chr1 249250621 - 60612464 60612499 19993171
-35
-
-chain 2407 chrX 154913754 + 148714814 148714839 chr2 243199373 + 100113459 100113484 27784968
-25
-
-chain 1984 chrX 154913754 + 76426191 76426234 chr8 146364022 - 27059036 27059079 21505033
-43
-
-chain 1549 chrX 154913754 + 114911087 114911150 chrX 155270560 + 114976136 114976199 336010
-63
-
-chain 1443 chrX 154913754 + 114913555 114913597 chrX 155270560 + 114984570 114984612 98822
-42
-
-chain 1245 chrX 154913754 + 148714288 148714366 chr4 191154276 - 133575330 133575408 22672116
-78
-
-chain 1030 chrX 154913754 + 114911060 114911082 chrX 155270560 + 114988042 114988064 7002
-22
-
-chain 733 chrX 154913754 + 148715982 148716070 chrX 155270560 - 110405878 110405966 21525610
-88
-
-chain 469 chrX 154913754 + 76426248 76426375 chr8 146364022 - 18567958 18568085 6841016
-127
-
-chain 293 chrX 154913754 + 148716634 148716684 chr2 243199373 - 107635751 107635801 26436223
-50
-
-chain 50554324 chrX_random 1719168 + 610279 1452044 chrX 155270560 + 76412035 77367385 75
-7124 5 6
-4742 1 1
-31 1 1
-1606 21 28
-3800 1 1
-23 1 1
-6209 1 1
-4 1 0
-22 1 0
-13 1 0
-1193 1 1
-32 1 1
-2218 0 1
-7608 6 1
-670 0 2
-1396 0 2
-1207 20 20
-5098 1 0
-1294 1 0
-119 0 1
-6626 16 16
-8221 1 0
-3722 4 0
-169 0 4
-1754 11 13
-58 0 1
-239 1 1
-75 1 1
-910 0 1
-518 7 7
-6771 0 1
-4354 26 26
-781 1 1
-28 1 1
-406 16 16
-4353 1 0
-22 100 24
-930 1 0
-33 1 1
-1226 0 1
-1278 660 1078
-3884 2 2
-22 1 1
-2022 4 0
-2593 1 0
-777 0 3
-4596 153 64
-2593 1 10
-1074 1 0
-3147 1 0
-2227 1 0
-9697 1 0
-3957 1 0
-3098 0 186786
-22519 1 0
-204 1 0
-22 1 0
-63 17 18
-9565 0 6
-6660 129 0
-58 1 0
-17671 100 83
-39 1 1
-9798 2 1
-5 0 1
-19 100 237
-1127 0 1
-4928 133 164
-8370 115 394
-3028 259 91
-9555 100 1670
-18018 6 0
-3818 1 0
-72 1 0
-15 1 0
-11 1 0
-4 1 0
-10 100 30
-18171 0 1
-18316 0 28
-22590 0 1
-2592 2 0
-8265 0 2
-4335 4 3
-14218 100 218
-8896 0 2
-5422 18 17
-1347 4 4
-83 166 0
-5120 101 153
-3114 126 148
-4567 1 0
-2511 0 1
-1289 2 0
-3129 124 175
-5332 1 0
-20 1 0
-15993 0 4
-9940 115 1562
-10856 1 1
-18 0 1
-2379 1 1
-32 74 72
-41 1 1
-3148 155 3622
-2876 621 0
-31 1 1
-2212 81729 108028
-557 0 1
-4283 1 0
-148 0 457
-722 1 1
-49 113 176
-33 2 2
-2654 1 0
-25 188 415
-1394 12 0
-5398 0 1
-28 100 19
-5509 151745 28754
-87 102 102
-66 5 5
-53 70 72
-56 201 601
-7819 256 150
-16 0 1
-6 0 1
-8001 4 0
-8135 0 1
-528 12 0
-797 100 193
-2857 496 0
-5822 153 0
-8578 1 0
-10594 1 0
-6352 3 3
-35 6 7
-50 55655 72028
-890 0 1
-72 0 1
-2125 1 1
-64 1 0
-15 1 0
-5 22 19
-12 129 67
-11 1 0
-8 0 1
-4 1 0
-16 2 2
-3637 1 1
-36 1 0
-28 1 0
-942 0 1
-231 1 1
-109 101 336
-18 11 294
-14959 0 2
-22656 3 1
-1280
-
-chain 6857177 chrX_random 1719168 + 1212241 1285856 chrX 155270560 + 76337041 76411192 460
-53 4 4
-3247 0 6
-51 2 0
-2014 2 0
-45 4 0
-20 4 0
-48 1 0
-5158 1 1
-29 1 1
-394 16 13
-1410 1 0
-12 1 0
-14 1 0
-7 1 0
-5 1 0
-13 1 0
-36 106 188
-1195 0 31
-133 0 4
-28 1 1
-1388 1 1
-18 1 1
-2790 0 1
-767 4 4
-49 0 1
-10 110 385
-52 0 1
-56 0 1
-4004 182 11
-23 1 1
-767 1 1
-66 1 1
-3217 2 0
-25 1 1
-4309 1 0
-26 0 1
-820 2 2
-4450 0 1
-1391 1 1
-33 0 1
-31 0 8
-3634 1 0
-1669 111 432
-10524 1 2
-8620 1 0
-2158 1 0
-1513 7 7
-4600 4 4
-2111
-
-chain 5479158 chrX_random 1719168 + 19684 169644 chrX 155270560 + 3753512 3953553 578
-1162 21228 9243
-742 1 0
-2200 7659 14347
-948 1 0
-4152 211 33421
-819 48 49
-92 22 22
-544 44 42
-175 0 1
-63 102 104
-246 37 37
-203 6 5
-279 27 27
-206 54 54
-394 39 40
-260 2 0
-311 16 16
-208 57 57
-349 6 6
-262 134 134
-481 0 6
-56 1 1
-868 0 5
-1387 18095 3193
-790 8 6
-1718 0 2
-3436 13 13
-241 40033 77157
-63 10 10
-425 63 0
-38963
-
-chain 5155611 chrX_random 1719168 + 1349115 1404263 chrX 155270560 - 77841540 77897663 609
-4514 1 1
-4 1 0
-15 0 1
-1714 142 0
-26953 1 1
-31 100 192
-4795 129 41
-2612 4 0
-3389 4 0
-5037 1 1
-22 101 1223
-13 9 8
-34 2 2
-5520
-
-chain 4548442 chrX_random 1719168 + 595876 1601165 chrX 155270560 - 77827311 79038577 141
-3039 114 45
-9150 2 0
-1995 422998 109473
-19795 1 0
-23 1 0
-12 111 343
-20 5 4
-13 1 1
-2240 1980 60
-2381 1 3
-44 1 0
-37 0 1
-24 100 79
-2445 100 136
-5050 0 1
-8804 4 0
-4444 704 262
-34 2 2
-12610 100 395
-4803 1 1
-22 1 1
-4171 128 46
-569 0 1
-2902 29308 112180
-236 1 0
-659 1 0
-711 1 0
-104 0 6764
-3212 4 2485
-1198 1 0
-8224 110 1
-4 0 1
-8 0 1
-21 0 1
-23 4 4
-5939 0 1
-182 101 1162
-2127 1 0
-28 100 77
-5048 2 0
-2345 1 0
-3616 100 211
-11 10 11
-1378 0 44
-1405 0 1
-1238 0 1
-575 0 20
-9423 100 122
-20 1 1
-7723 0 1
-431 0 1
-181 2 0
-5386 16 0
-866 105 61
-1365 0 1
-11613 318206 1966
-13 1 2
-40 1 1
-781 0 2
-5976 121 213
-3371 0 1
-693 1 0
-169 2337 746790
-586 1 0
-2072 1 1
-34 1 1
-58 13 13
-211 1 1
-28 1 1
-332 1 1
-31 1 1
-179 11 0
-2785 0 5
-1418 1 0
-12774 0 1
-3561 1 0
-4305 1 1
-120 1 1
-377 1 1
-68 1 1
-208 9 9
-998 15 15
-2146 0 1
-693 101 90
-36 1 1
-1743 1 1
-18 1 1
-2412 15 15
-1943 29 30
-3136 0 3
-12327 3 4
-2517
-
-chain 4126434 chrX_random 1719168 + 1485975 1530227 chrX 155270560 + 76291305 76335950 725
-1188 0 2
-717 1 1
-34 1 1
-1032 1 1
-42 1 1
-974 1 0
-5479 16 16
-2476 1 1
-35 1 1
-1212 3 0
-152 1 1
-46 1 1
-77 7 6
-912 1 1
-38 1 1
-4230 17 17
-617 146 545
-27 3 3
-374 1 1
-18 1 1
-3639 1 1
-122 1 1
-435 4 4
-1916 16 16
-2739 1 0
-622 16 16
-6383 2 0
-2520 35 35
-5915
-
-chain 3853214 chrX_random 1719168 + 170863 1715347 chrX 155270560 - 151357158 154150181 220
-101 0 61
-11 0 2
-38 0 155
-54 0 1
-34100 0 1
-12001 158233 27287
-105 0 1
-847 4191 3311
-101 25049 633
-4294 18781 8391
-120 26 27
-1173 0 1
-2374 87 87
-206 41 40
-40 7493 0
-1552 0 1
-194 0 1
-6613 4 3
-492 13807 11516
-2651 0 2
-1724 0 2
-2453 0 1
-3866 165 10497
-2912 8 0
-2305 93 94
-6287 1 0
-3225 7 7
-393 1 1
-18 1 1
-298 495 25877
-271 0 138
-31886 6 0
-14613 3 0
-9199 1105799 2318225
-448 0 73
-215 36 2
-248 14 15
-1012 1 0
-110 1 1
-211 15 16
-87 3 0
-268 10 6
-108 12 12
-74 1 1
-27 1 1
-178 1 1
-18 1 1
-1429 0 10
-168 1 1
-36 1 1
-64 1 1
-62 0 1
-129 2 0
-80 13 10
-11 3 0
-19 823 1702
-36 1 0
-605 17 17
-193 1 0
-215 12 13
-271 1 1
-18 1 1
-91 1 0
-178 4 4
-39 1 1
-233 1 1
-31 1 1
-500 1 1
-68 1 1
-325 9 9
-244 0 1
-843 1 1
-46 1 1
-202 0 1
-957 0 1
-150 1 1
-81 1 0
-6 1 1
-303 8540 16182
-59 4 0
-415 4 7
-127 38 38
-333 0 44
-16 0 252
-226 27 26
-64 4 0
-91 0 4
-56 32 32
-977 0 16
-701 1 1
-29 1 1
-1743 1 0
-676 0 2
-2780 0 16
-85 0 11
-22 1 1
-952 3 0
-470 1 0
-840 4 0
-146 0 4
-131 0 34
-39 4 0
-99 1 1
-26 0 4
-80 1 1
-1476 0 13
-977 0 2
-480 0 800
-1133 4 5
-532 1 1
-37 1 1
-207 0 117633
-2070 1 1
-30 2 0
-524 2 0
-484 0 1
-446 1 0
-1642 2 0
-63 1 1
-43 1 1
-148 12 12
-2115 0 1
-116 1 1
-182 10 10
-88 1 1
-65 0 320
-107 0 2
-2083 295 0
-1170 10932 59997
-1792 0 1
-292 6 7
-677 8 11
-1932
-
-chain 2670012 chrX_random 1719168 + 22277 129533 chrX 155270560 - 151420019 151525192 697
-318 0 8
-1212 7792 0
-1334 4590 634
-3132 4549 4298
-403 12 12
-889 7 7
-393 20 20
-2070 17932 14002
-179 0 1
-1042 0 1
-4330 476 475
-66 0 1
-1653 797 0
-2278 8 0
-5943 18846 26826
-69 77 81
-86 822 824
-287 1 0
-7796 1771 9789
-1118 1349 0
-2572 2 0
-4177 1 0
-2904 5 0
-881 1 1
-56 6 0
-590 1 1
-23 1 1
-262 6 6
-349 1 1
-55 1 1
-208 16 16
-311 0 2
-260 1 0
-34 5 5
-394 54 54
-206 27 27
-199
-
-chain 2529127 chrX_random 1719168 + 1458959 1485875 chrX 155270560 + 77160344 77187173 1079
-634 0 1
-9184 1 0
-59 1 0
-14 100 16
-21 1 0
-53 2 2
-11087 2 0
-2487 0 2
-2602 1 0
-667
-
-chain 902700 chrX_random 1719168 + 269161 291745 chrY 59373566 - 58967799 59197152 4215
-4053 3 0
-293 1 1
-26 0 1
-791 0 165863
-51 243 5
-66 134 1
-42 388 5
-141 0 15
-35 2 2
-42 361 0
-256 1 0
-341 3 36
-453 301 1
-147 0 1
-278 4 4
-15 0 3
-29 1 1
-122 2 0
-148 430 0
-222 151 0
-55 0 2
-149 1 0
-687 6309 50121
-61 1 1
-43 1 1
-408 80 0
-147 11 11
-228 1 1
-48 2 2
-1372 1 1
-31 1 1
-75 1 1
-28 97 0
-263 0 1
-495 98 1
-51 1 33
-52 1 1
-51 33 1
-226 1 1
-20 4 0
-211 340 0
-179 1 0
-10 1 1
-236 341 1
-555
-
-chain 569801 chrX_random 1719168 + 1106858 1112877 chrX 155270560 - 78234537 78240560 9279
-4787 0 4
-1232
-
-chain 569444 chrX_random 1719168 + 1452563 1458801 chrX 155270560 - 78136578 78142679 9342
-609 3 13
-1692 0 8
-1539 155 0
-30 3 3
-254 9 9
-1944
-
-chain 534458 chrX_random 1719168 + 90245 170863 chrX 155270560 - 151402385 151465977 943
-12303 69 69
-77 86 86
-822 66146 49119
-57 3 4
-1055
-
-chain 494413 chrX_random 1719168 + 391508 439759 chrX 155270560 - 151446976 151536655 1213
-50 57 60
-3938 36909 78166
-87 206 206
-41 40 40
-6143 240 408
-340 6 6
-194
-
-chain 379298 chrX_random 1719168 + 415243 419212 chrX 155270560 - 151507548 151511517 135808
-663 12 12
-3294
-
-chain 372919 chrX_random 1719168 + 1663885 1667930 chrX 155270560 - 153907181 153911269 141765
-802 0 3
-83 1 1
-47 1 1
-767 17 17
-1585 0 73
-215 36 2
-248 14 15
-229
-
-chain 274258 chrX_random 1719168 + 1667930 1671196 chrX 155270560 - 154066175 154070218 305212
-2034 1 281
-24 1 1
-190 0 200
-632 326 623
-58
-
-chain 267510 chrX_random 1719168 + 422339 428025 chrX 155270560 - 151460048 151465730 1055
-1034 4 3
-2317 3 0
-2328
-
-chain 266050 chrX_random 1719168 + 27992 75212 chrX 155270560 - 151430977 151495459 1091
-2648 315 25719
-644 9056 5097
-1296 30530 26348
-164 1 0
-310 1720 1720
-536
-
-chain 247472 chrX_random 1719168 + 49544 52383 chrX 155270560 + 3800594 3803433 7089
-2766 6 6
-67
-
-chain 247318 chrX_random 1719168 + 58807 462399 chrX 155270560 + 3743706 3828677 987
-48 658 658
-44 238 238
-102 246 246
-37 488 488
-27 206 206
-54 394 394
-39 797 797
-57 617 617
-134 287931 26427
-60 1338 0
-1419 8746 13247
-2214 50 50
-51 31242 578
-263 4 4
-5180 1349 0
-1121 24105 7962
-467 20820 8687
-32 2 2
-3992 2 0
-898 48 49
-92 22 22
-544 44 42
-175 0 1
-63 102 104
-246 37 37
-203 6 5
-279 27 27
-206 54 54
-394 39 40
-260 2 0
-311 16 16
-208 57 57
-349 6 6
-262 25 25
-590 57 63
-881 1017 1022
-1498
-
-chain 203629 chrX_random 1719168 + 419791 421950 chrX 155270560 - 151464996 151467156 582605
-2107 0 1
-52
-
-chain 199106 chrX_random 1719168 + 1699808 1701947 chrX 155270560 - 153935858 153937997 603481
-61 1 1
-57 1 1
-1588 4 4
-59 7 7
-361
-
-chain 199089 chrX_random 1719168 + 378452 380544 chrX 155270560 + 3796616 3798707 602253
-1586 1 0
-505
-
-chain 187776 chrX_random 1719168 + 376353 378301 chrX 155270560 + 3798256 3800203 654951
-729 1 0
-1218
-
-chain 174234 chrX_random 1719168 + 1285969 1288372 chrX 155270560 + 77019422 77021825 343560
-1763 87 87
-102 124 124
-70 56 56
-201
-
-chain 157788 chrX_random 1719168 + 111815 113457 chrX 155270560 + 3753462 3755104 810742
-1642
-
-chain 154415 chrX_random 1719168 + 1055747 1057376 chrX 155270560 + 77369279 77370908 822932
-1629
-
-chain 134293 chrX_random 1719168 + 1708912 1710376 chrX 155270560 + 1185231 1187137 959481
-129 1 1
-82 1 1
-350 2 297
-68 0 147
-831
-
-chain 132265 chrX_random 1719168 + 403961 405553 chrX 155270560 - 151477034 151478628 31377
-436 0 2
-1156
-
-chain 90853 chrX_random 1719168 + 1707707 1708693 chrX 155270560 + 1353464 1354449 1404000
-164 1 0
-46 1 1
-620 1 1
-37 1 1
-115
-
-chain 74037 chrX_random 1719168 + 267762 268693 chrY 59373566 - 59139189 59140054 1710353
-79 97 0
-220 1 0
-317 27 60
-128 1 0
-61
-
-chain 63811 chrX_random 1719168 + 410390 415127 chrX 155270560 + 3822705 3827447 11885
-2487 0 6
-1981 48 47
-221
-
-chain 61116 chrX_random 1719168 + 346359 347004 chrX 155270560 + 3777922 3778567 2069731
-645
-
-chain 55813 chrX_random 1719168 + 2787 3496 chrX 155270560 - 151499719 151505905 2274078
-50 6 6
-412 0 5477
-241
-
-chain 38577 chrX_random 1719168 + 1651263 1651671 chrX 155270560 - 153943757 153944164 3434500
-271 1 0
-136
-
-chain 34659 chrX_random 1719168 + 1707297 1707664 chrX 155270560 + 1118849 1119216 3901406
-367
-
-chain 33830 chrX_random 1719168 + 267400 267758 chrX 155270560 - 154819600 154819959 4017435
-54 0 1
-304
-
-chain 33594 chrX_random 1719168 + 347004 347356 chrX 155270560 - 151523309 151523661 4010211
-352
-
-chain 33500 chrX_random 1719168 + 290273 291150 chrX 155270560 - 155043354 155044230 1935940
-149 427 427
-91 1 0
-137 17 17
-55
-
-chain 33229 chrX_random 1719168 + 1452213 1452563 chrX 155270560 - 78136229 78136579 3954656
-350
-
-chain 31748 chrX_random 1719168 + 1656832 1657169 chrX 155270560 - 154080972 154081310 4345014
-118 0 1
-219
-
-chain 31047 chrX_random 1719168 + 364702 460901 chrX 155270560 + 3752840 3788747 1318
-48 54 53
-80 31133 470
-26 58237 28604
-46 660 660
-40 242 241
-78 0 2
-22 248 248
-33 492 491
-25 208 208
-52 400 400
-34 798 798
-56 1232 1232
-21 1 1
-34 882 887
-1017
-
-chain 26366 chrX_random 1719168 + 1717468 1717765 chrX 155270560 - 154599490 154599787 6355797
-65 8 8
-224
-
-chain 20775 chrX_random 1719168 + 1657225 1657446 chrY 59373566 + 1138227 1138450 9855403
-101 0 2
-120
-
-chain 20767 chrX_random 1719168 + 4453 4700 chrX 155270560 - 151332163 151332410 9860775
-174 10 10
-63
-
-chain 20271 chrX_random 1719168 + 1698243 1698467 chrX 155270560 - 154161726 154161950 2868
-224
-
-chain 20189 chrX_random 1719168 + 22064 22277 chrX 155270560 + 3752676 3752889 10232162
-213
-
-chain 20092 chrX_random 1719168 + 410218 414905 chrX 155270560 + 3784106 3788794 77876
-172 4468 4469
-47
-
-chain 19894 chrX_random 1719168 + 365127 367414 chrX 155270560 + 3744796 3747084 92469
-246 37 37
-203 5 6
-279 27 27
-206 54 54
-394 41 39
-260 0 2
-535
-
-chain 19881 chrX_random 1719168 + 217168 217385 chrX 155270560 + 3913712 3913929 10410664
-217
-
-chain 19372 chrX_random 1719168 + 1704190 1704597 chr2 243199373 + 106598364 106598785 10983407
-91 100 114
-81 74 74
-61
-
-chain 17351 chrX_random 1719168 + 365104 366619 chrX 155270560 + 3783188 3784703 560009
-23 246 246
-37 487 487
-27 206 206
-54 394 394
-41
-
-chain 16176 chrX_random 1719168 + 3557 21469 chrX 155270560 + 3768043 3793719 20345
-896 16406 24170
-326 33 33
-130 29 29
-92
-
-chain 15865 chrX_random 1719168 + 276938 277188 chrY 59373566 - 59140528 59140772 2014767
-82 6 0
-162
-
-chain 15331 chrX_random 1719168 + 367414 367617 chrX 155270560 + 3823924 3824127 647220
-203
-
-chain 13713 chrX_random 1719168 + 489399 489544 chrX 155270560 + 3712149 3712294 16431967
-145
-
-chain 12918 chrX_random 1719168 + 274951 275159 chrY 59373566 - 59139058 59139278 8720139
-52 0 12
-156
-
-chain 12632 chrX_random 1719168 + 1705530 1705970 chrX 155270560 + 145057484 145057926 18056495
-78 288 290
-74
-
-chain 12447 chrX_random 1719168 + 1030429 1030575 chr5 180915260 - 168461964 168462110 18325086
-146
-
-chain 12016 chrX_random 1719168 + 1317064 1317191 chrX 155270560 + 77214259 77214386 18979178
-127
-
-chain 11687 chrX_random 1719168 + 278072 278210 chrX 155270560 - 154988343 154988492 4329206
-112 25 36
-1
-
-chain 11514 chrX_random 1719168 + 278210 278346 chrY 59373566 - 59141204 59141340 4138572
-136
-
-chain 10224 chrX_random 1719168 + 1704620 1704728 chr19 59128983 - 37939031 37939139 22329028
-108
-
-chain 10213 chrX_random 1719168 + 277934 278654 chrY 59373566 - 59141065 59141499 2702219
-138 514 228
-68
-
-chain 9983 chrX_random 1719168 + 290082 290229 chrX 155270560 - 155043503 155043650 2501552
-48 40 40
-59
-
-chain 9686 chrX_random 1719168 + 1671544 1671645 chrX 155270560 + 1359785 1359886 23561825
-101
-
-chain 8627 chrX_random 1719168 + 274506 274913 chrX 155270560 - 154985996 154986278 9490470
-54 20 20
-32 0 8
-10 242 109
-49
-
-chain 7400 chrX_random 1719168 + 1030281 1030397 chr9 141213431 + 129760930 129761046 27439238
-59 26 26
-31
-
-chain 7194 chrX_random 1719168 + 274704 274779 chrY 59373566 - 59139208 59139283 27842833
-75
-
-chain 7041 chrX_random 1719168 + 129047 129334 chrX 155270560 - 151486292 151486579 1717
-54 206 206
-27
-
-chain 6777 chrX_random 1719168 + 275159 275252 chrX 155270560 - 154986140 154986238 15049098
-1 37 42
-55
-
-chain 6125 chrX_random 1719168 + 479075 479168 chrX 155270560 - 151461082 151461175 898
-93
-
-chain 5720 chrX_random 1719168 + 1705205 1705283 chr3 198022430 - 36255828 36255906 21764861
-52 21 21
-5
-
-chain 5699 chrX_random 1719168 + 57777 57859 chrX 155270560 + 3747892 3747974 156364
-82
-
-chain 5684 chrX_random 1719168 + 275730 275789 chrX 155270560 - 154985991 154986050 31480070
-59
-
-chain 5671 chrX_random 1719168 + 278678 278737 chrX 155270560 - 154987944 154988003 7684992
-59
-
-chain 5648 chrX_random 1719168 + 288487 288546 chrY 59373566 - 59194675 59194734 31602153
-59
-
-chain 5292 chrX_random 1719168 + 1698467 1698538 chrX 155270560 - 154160180 154160251 1242775
-71
-
-chain 4986 chrX_random 1719168 + 1705613 1705672 chr7 159138663 + 43857891 43857950 19004666
-59
-
-chain 4456 chrX_random 1719168 + 1030620 1030666 chrX 155270560 + 76367481 76367527 34837220
-46
-
-chain 4200 chrX_random 1719168 + 65786 66804 chrX 155270560 + 3789104 3790122 1705
-1018
-
-chain 4147 chrX_random 1719168 + 1704281 1704341 chr4 191154276 - 52750556 52750615 11058024
-1 2 1
-57
-
-chain 4142 chrX_random 1719168 + 276887 276938 chrY 59373566 - 59140619 59140670 3855343
-51
-
-chain 3859 chrX_random 1719168 + 291150 291190 chrY 59373566 - 59196218 59196258 16097861
-40
-
-chain 3722 chrX_random 1719168 + 1703633 1706063 chr17 81195210 - 47362086 47364493 15646977
-109 441 439
-7 1805 1784
-68
-
-chain 3009 chrX_random 1719168 + 1705804 1705856 chrX 155270560 + 62632912 62632964 24180689
-52
-
-chain 2509 chrX_random 1719168 + 1708877 1708912 chrX 155270560 + 1109247 1109282 2078841
-35
-
-chain 2078 chrX_random 1719168 + 1706063 1706085 chr1 249250621 + 114909259 114909281 21967653
-22
-
-chain 1700 chrX_random 1719168 + 274379 274412 chrY 59373566 - 59139235 59139268 19436247
-33
-
-chain 990 chrX_random 1719168 + 1705283 1705342 chrX 155270560 + 119232530 119232589 19658805
-59
-
-chain 463 chrX_random 1719168 + 1703519 1703583 chrX 155270560 + 65440530 65440594 26501250
-64
-
-chain 2373402471 chrY 57772954 + 0 27228749 chrY 59373566 + 10000 28819361 24
-34821 50000 50000
-86563 30000 50000
-766173 50000 50000
-36556 50000 50000
-80121 90000 50000
-754004 100000 50000
-6846717 50000 50000
-276367 600000 50000
-813231 500000 3000000
-39401 400000 50000
-554624 100000 50000
-535761 1 0
-32919 1 0
-10 1 1
-12811 5 0
-18899 1 1
-121 5 4
-230478 1 0
-750 24 24
-14340 1 1
-43 1 1
-2095 1 0
-14635 9 0
-2781 1 0
-45022 6 5
-7151 1 0
-9343 0 628
-5417477 0 50006
-2175794 0 50000
-1481749 50000 50000
-4867933
-
-chain 46617811 chrY 57772954 + 57228749 57772954 chrY 59373566 + 58819361 59363566 80
-98295 50000 50000
-395910
-
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics
deleted file mode 100644
index 46c724e..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOne.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP DATE_PROP SHORT_PROP INTEGER_PROP LONG_PROP FLOAT_PROP DOUBLE_PROP ENUM_PROP BOOLEAN_PROP CHARACTER_PROP SHORT_PRIMITIVE INT_PRIMITIVE LONG_PRIMITIVE FLOAT_PRIMITIVE DOUBLE_PRIMITIVE BOOLEAN_PRIMITIVE CHAR_PRIMITIVE
-Hello World 2008-12-31 123 9223372036854775807 456.789001 0.713487 Two N A 123 919834781 9223372034707292160 0.55694 0.229233 Y B
-
-## HISTOGRAM java.lang.Integer
-clipped_bases read_count
-6 1
-7 1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics
deleted file mode 100644
index 46c724e..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneCopy.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP DATE_PROP SHORT_PROP INTEGER_PROP LONG_PROP FLOAT_PROP DOUBLE_PROP ENUM_PROP BOOLEAN_PROP CHARACTER_PROP SHORT_PRIMITIVE INT_PRIMITIVE LONG_PRIMITIVE FLOAT_PRIMITIVE DOUBLE_PRIMITIVE BOOLEAN_PRIMITIVE CHAR_PRIMITIVE
-Hello World 2008-12-31 123 9223372036854775807 456.789001 0.713487 Two N A 123 919834781 9223372034707292160 0.55694 0.229233 Y B
-
-## HISTOGRAM java.lang.Integer
-clipped_bases read_count
-6 1
-7 1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics
deleted file mode 100644
index 3e6f088..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedHistogram.metrics
+++ /dev/null
@@ -1,14 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP DATE_PROP SHORT_PROP INTEGER_PROP LONG_PROP FLOAT_PROP DOUBLE_PROP ENUM_PROP BOOLEAN_PROP CHARACTER_PROP SHORT_PRIMITIVE INT_PRIMITIVE LONG_PRIMITIVE FLOAT_PRIMITIVE DOUBLE_PRIMITIVE BOOLEAN_PRIMITIVE CHAR_PRIMITIVE
-Hello World 2008-12-31 123 9223372036854775807 456.789001 0.713487 Two N A 123 919834781 9223372034707292160 0.55694 0.229233 Y B
-
-## HISTOGRAM java.lang.Integer
-clipped_bases read_count
-6 1
-7 1
-8 1
diff --git a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics b/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics
deleted file mode 100644
index a4d23d8..0000000
--- a/src/test/resources/htsjdk/samtools/metrics/metricsOneModifiedMetrics.metrics
+++ /dev/null
@@ -1,13 +0,0 @@
-## htsjdk.samtools.metrics.StringHeader
-# picard.illumina.MarkIlluminaAdapters INPUT=testdata/picard/illumina/MarkIlluminaAdaptersTest/unevenReads.sam OUTPUT=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven5946421709712534555.sam METRICS=/var/folders/tc/hy9lszxd1dg9cf4bky51mrrd9k3s6g/T/uneven4591996041776878558.metrics MIN_MATCH_BASES_SE=12 MIN_MATCH_BASES_PE=6 MAX_ERROR_RATE_SE=0.1 MAX_ERROR_RATE_PE=0.1 ADAPTERS=[INDEXED, DUAL_INDEXED, PAIRED_END] ADAPTER_TRUNCATION_LENGTH=30 PRUNE_ADAPTER_LIST_AFTER_THIS_MANY_ADAPT [...]
-## htsjdk.samtools.metrics.StringHeader
-# Started on: Mon Aug 24 13:31:51 EDT 2015
-
-## METRICS CLASS htsjdk.samtools.metrics.MetricsFileTest$TestMetric
-STRING_PROP DATE_PROP SHORT_PROP INTEGER_PROP LONG_PROP FLOAT_PROP DOUBLE_PROP ENUM_PROP BOOLEAN_PROP CHARACTER_PROP SHORT_PRIMITIVE INT_PRIMITIVE LONG_PRIMITIVE FLOAT_PRIMITIVE DOUBLE_PRIMITIVE BOOLEAN_PRIMITIVE CHAR_PRIMITIVE
-Hello World 2008-12-31 122 9223372036854775807 456.789001 0.713487 Two N A 123 919834781 9223372034707292160 0.55694 0.229233 Y B
-
-## HISTOGRAM java.lang.Integer
-clipped_bases read_count
-6 1
-7 1
diff --git a/src/test/resources/htsjdk/samtools/queryname_sorted.sam b/src/test/resources/htsjdk/samtools/queryname_sorted.sam
deleted file mode 100755
index 068e7bc..0000000
--- a/src/test/resources/htsjdk/samtools/queryname_sorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at RG ID:0 SM:Hi,Mom!
-A 73 chr2 1 255 10M * 0 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-A 133 * 0 0 * chr2 1 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 99 chr1 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 147 chr1 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 99 chr2 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 147 chr2 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 99 chr3 1 255 10M = 25 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 147 chr3 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 99 chr1 2 255 10M = 15 30 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 147 chr1 15 255 10M = 2 -30 CAACAGAAGC )'.*.+2,)) RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/readWithBadRname.sam b/src/test/resources/htsjdk/samtools/readWithBadRname.sam
deleted file mode 100644
index 71bafb9..0000000
--- a/src/test/resources/htsjdk/samtools/readWithBadRname.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr21 afterspace AS:HG18 LN:62435964
- at RG ID:L1 PU:SC_1_10 LB:SC_1 SM:NA12891 PL:ILLUMINA
- at RG ID:L2 PU:SC_2_12 LB:SC_2 SM:NA12891 PL:ILLUMINA
-read_28833_29006_6945 99 = 28833 20 10M1D25M = 28993 195 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< MF:i:130 Nm:i:1 H0:i:0 H1:i:0 RG:Z:L1
-read_28701_28881_323b 147 chr21 afterspace 28834 30 35M = 28701 -168 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 Nm:i:0 H0:i:1 H1:i:0 RG:Z:L2
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai
deleted file mode 100644
index aa00476..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.fasta.fai
+++ /dev/null
@@ -1,45 +0,0 @@
-chrM 16571 6 50 51
-chr1 247249719 16915 50 51
-chr2 242951149 252211635 50 51
-chr3 199501827 500021813 50 51
-chr4 191273063 703513683 50 51
-chr5 180857866 898612214 50 51
-chr6 170899992 1083087244 50 51
-chr7 158821424 1257405242 50 51
-chr8 146274826 1419403101 50 51
-chr9 140273252 1568603430 50 51
-chr10 135374737 1711682155 50 51
-chr11 134452384 1849764394 50 51
-chr12 132349534 1986905833 50 51
-chr13 114142980 2121902365 50 51
-chr14 106368585 2238328212 50 51
-chr15 100338915 2346824176 50 51
-chr16 88827254 2449169877 50 51
-chr17 78774742 2539773684 50 51
-chr18 76117153 2620123928 50 51
-chr19 63811651 2697763432 50 51
-chr20 62435964 2762851324 50 51
-chr21 46944323 2826536015 50 51
-chr22 49691432 2874419232 50 51
-chrX 154913754 2925104499 50 51
-chrY 57772954 3083116535 50 51
-chr1_random 1663265 3142044962 50 51
-chr2_random 185571 3143741506 50 51
-chr3_random 749256 3143930802 50 51
-chr4_random 842648 3144695057 50 51
-chr5_random 143687 3145554571 50 51
-chr6_random 1875562 3145701145 50 51
-chr7_random 549659 3147614232 50 51
-chr8_random 943810 3148174898 50 51
-chr9_random 1146434 3149137598 50 51
-chr10_random 113275 3150306975 50 51
-chr11_random 215294 3150422530 50 51
-chr13_random 186858 3150642144 50 51
-chr15_random 784346 3150832754 50 51
-chr16_random 105485 3151632801 50 51
-chr17_random 2617613 3151740410 50 51
-chr18_random 4262 3154410390 50 51
-chr19_random 301858 3154414752 50 51
-chr21_random 1679693 3154722662 50 51
-chr22_random 257318 3156435963 50 51
-chrX_random 1719168 3156698441 50 51
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict
deleted file mode 100644
index 8dd3e5b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:chrM LN:16571 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ SN:chr20 LN:1000000 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:b4eac854d70893986ac578c53c2324f1
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM 16571 6 60 61
-chr20 1000000 16861 60 61
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.nodict.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM 16571 6 60 61
-chr20 1000000 16861 60 61
diff --git a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta b/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/samtools/reference/Homo_sapiens_assembly18.trimmed.noindex.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict b/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict
deleted file mode 100644
index 8690a8d..0000000
--- a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.5 SO:unsorted
- at SQ SN:chr1 LN:8 M5:cc0af3a4fedb18378b4b57b98068e69f UR:file:/Users/alecw/Documents/work/Picard/Picard-public/htsjdk/testdata/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
- at SQ SN:chr2 LN:8 M5:eaa45adaaf6d104af176897fc5d4b179 UR:file:/Users/alecw/Documents/work/Picard/Picard-public/htsjdk/testdata/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
diff --git a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta b/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
deleted file mode 100644
index b3ab72d..0000000
--- a/src/test/resources/htsjdk/samtools/reference/reference_with_trailing_whitespace.fasta
+++ /dev/null
@@ -1,4 +0,0 @@
->chr1
-ACGTACGT
->chr2
-TCGATCGA
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/samtools/reference/testing.fai b/src/test/resources/htsjdk/samtools/reference/testing.fai
deleted file mode 100644
index 65b7c02..0000000
--- a/src/test/resources/htsjdk/samtools/reference/testing.fai
+++ /dev/null
@@ -1,7 +0,0 @@
-chrM 16571 6 50 51
-chr1;boat 247249719 16915 50 51
-chr2:money 242951149 252211635 50 51
-chr3::; 199501827 500021813 50 51
-;;;;;;;; 123 234 456 789
-file:gi|17981852|ref|NC_001807.4| 16571 2911876801 70 71
-
diff --git a/src/test/resources/htsjdk/samtools/roundtrip.sam b/src/test/resources/htsjdk/samtools/roundtrip.sam
deleted file mode 100644
index d65463a..0000000
--- a/src/test/resources/htsjdk/samtools/roundtrip.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD VN:1.5 SO:unsorted
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at RG ID:0 SM:Hi,Mom!
- at RG ID:rg1 PL:ILLUMINA SM:sm1
-A 73 chr2 1 255 10M * 0 0 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-A 133 * 0 0 * chr2 1 0 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-B 99 chr1 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-B 147 chr1 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-C 99 chr2 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-C 147 chr2 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-D 99 chr3 1 255 10M = 25 35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-D 147 chr3 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-E 99 chr1 2 255 10M = 15 30 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
-E 147 chr1 15 255 10M = 2 -30 CAACAGAAGC )'.*.+2,)) RG:Z:rg1
diff --git a/src/test/resources/htsjdk/samtools/samFilter01.js b/src/test/resources/htsjdk/samtools/samFilter01.js
deleted file mode 100644
index 3fe7e00..0000000
--- a/src/test/resources/htsjdk/samtools/samFilter01.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/** answer to https://www.biostars.org/p/77802/#77966 */
-(record.referenceIndex==record.mateReferenceIndex && record.referenceIndex>=0 && record.readNegativeStrandFlag!=record.mateNegativeStrandFlag && ((record.mateNegativeStrandFlag && record.alignmentStart < record.mateAlignmentStart ) || (record.readNegativeStrandFlag && record.mateAlignmentStart < record.alignmentStart ) ))
diff --git a/src/test/resources/htsjdk/samtools/samFilter02.js b/src/test/resources/htsjdk/samtools/samFilter02.js
deleted file mode 100644
index 046e7ec..0000000
--- a/src/test/resources/htsjdk/samtools/samFilter02.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** accept record if second base of DNA is a A */
-function accept(r)
- {
- /* using substring instead of charAt because http://developer.actuate.com/community/forum/index.php?/topic/25434-javascript-stringcharati-wont-return-a-character/ */
- return r.getReadString().length()>2 &&
- r.getReadString().substring(1,2)=="A";
- }
-
-accept(record);
diff --git a/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat b/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat
deleted file mode 100755
index 7c2624a..0000000
Binary files a/src/test/resources/htsjdk/samtools/seekablestream/megabyteZeros.dat and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt b/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt
deleted file mode 100644
index 194e3be..0000000
--- a/src/test/resources/htsjdk/samtools/seekablestream/seekTest.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-aaaaaaaaa
-bbbbbbbbb
-ccccccccc
-ddddddddd
-eeeeeeeee
diff --git a/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam b/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam
deleted file mode 100755
index 74da758..0000000
Binary files a/src/test/resources/htsjdk/samtools/sequenceWithSpace.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam b/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam
deleted file mode 100755
index 766bc67..0000000
--- a/src/test/resources/htsjdk/samtools/sequenceWithSpace.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD VN:1.0 SO:coordinate
- at SQ SN:chr21 afterspace AS:HG18 LN:62435964
- at RG ID:L1 PU:SC_1_10 LB:SC_1 SM:NA12891 PL:ILLUMINA
- at RG ID:L2 PU:SC_2_12 LB:SC_2 SM:NA12891 PL:ILLUMINA
-read_28833_29006_6945 99 chr21 afterspace 28833 20 10M1D25M = 28993 195 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< MF:i:130 Nm:i:1 H0:i:0 H1:i:0 RG:Z:L1
-read_28701_28881_323b 147 chr21 afterspace 28834 30 35M = 28701 -168 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 Nm:i:0 H0:i:1 H1:i:0 RG:Z:L2
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.bam b/src/test/resources/htsjdk/samtools/serialization_test.bam
deleted file mode 100644
index 3198626..0000000
Binary files a/src/test/resources/htsjdk/samtools/serialization_test.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.bam.bai b/src/test/resources/htsjdk/samtools/serialization_test.bam.bai
deleted file mode 100644
index a20e0b8..0000000
Binary files a/src/test/resources/htsjdk/samtools/serialization_test.bam.bai and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/serialization_test.sam b/src/test/resources/htsjdk/samtools/serialization_test.sam
deleted file mode 100644
index 337bb9a..0000000
--- a/src/test/resources/htsjdk/samtools/serialization_test.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at HD VN:1.5 SO:coordinate
- at SQ SN:1 LN:16000
- at SQ SN:2 LN:16000
- at SQ SN:3 LN:16000
- at SQ SN:4 LN:16000
- at RG ID:0 SM:FOO PL:ILLUMINA
- at PG ID:1 VN:2.0 PN:BAR
-a 99 1 200 0 76M = 255 -130 ACCCTAACCCTAACCCTAACCCTAACCATAACCCTAAGACTAACCCTAAACCTAACCCTCATAATCGAAATACAAC BBBBC at C?AABCBB<63>=B@>+B9-9+)2B8,+ at 327B5A>90((>-+''3?(/'''A)(''19('7.,**%)3: RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/sra/test_archive.sra b/src/test/resources/htsjdk/samtools/sra/test_archive.sra
deleted file mode 100644
index a9b6e70..0000000
Binary files a/src/test/resources/htsjdk/samtools/sra/test_archive.sra and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/uncompressed.sam b/src/test/resources/htsjdk/samtools/uncompressed.sam
deleted file mode 100644
index e3fe151..0000000
--- a/src/test/resources/htsjdk/samtools/uncompressed.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at RG ID:0 SM:Hi,Mom!
-A 73 chr2 1 255 10M * 0 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-A 133 * 0 0 * chr2 1 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 99 chr1 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 147 chr1 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 99 chr2 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 147 chr2 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 99 chr3 1 255 10M = 25 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 147 chr3 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 99 chr1 2 255 10M = 15 30 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 147 chr1 15 255 10M = 2 -30 CAACAGAAGC )'.*.+2,)) RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/unsorted.sam b/src/test/resources/htsjdk/samtools/unsorted.sam
deleted file mode 100755
index e3fe151..0000000
--- a/src/test/resources/htsjdk/samtools/unsorted.sam
+++ /dev/null
@@ -1,15 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:chr1 LN:101
- at SQ SN:chr2 LN:101
- at SQ SN:chr3 LN:101
- at RG ID:0 SM:Hi,Mom!
-A 73 chr2 1 255 10M * 0 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-A 133 * 0 0 * chr2 1 0 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 99 chr1 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-B 147 chr1 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 99 chr2 1 255 10M = 26 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-C 147 chr2 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 99 chr3 1 255 10M = 25 35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-D 147 chr3 26 255 10M = 1 -35 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 99 chr1 2 255 10M = 15 30 CAACAGAAGC )'.*.+2,)) RG:Z:0
-E 147 chr1 15 255 10M = 2 -30 CAACAGAAGC )'.*.+2,)) RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq
deleted file mode 100644
index 5f17cbb..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq
+++ /dev/null
@@ -1,19808 +0,0 @@
- at 30BB2AAXX080903:3:3:1535:1429#0
-ATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGNCGACNCN
-+
-677777888888888888838888777765554431221000/.,.,-,,+,+***))*)(((((''$"#""$"#"
- at 30BB2AAXX080903:3:46:1133:292#0
-ATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGCTTCATCAC
-+
-67777788/88888888888888877776555443222100//.,---,,+++***)))))(()(('$$"#"##"#
- at 30BB2AAXX080903:3:60:396:738#0
-AGGTCTATCACCCTATTAACCACTCACGGGGGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCANCTNN
-+
-677777888888888888888888777765'5443222100//..---,-+++*****))))()'(&&&$""##""
- at 30BB2AAXX080903:3:56:234:1484#0
-CACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCATGT
-+
-677777888888888888888888777764554432/2100//..,-+,,+++(*()()('(()%(&%"#$%$#$#
- at 30BB2AAXX080903:3:45:1034:790#0
-TCACGGGAGCTCTCCATGCATTTGGTATTTTCGTTTGGGGGGGGGGCACGCGATAAGATCGGAAGAGCGGTGCCTC
-+
-6777778888888888888888887.776551443222100/&.%--,,,-+***))))())(((('$%"""#$"#
- at 30BB2AAXX080903:3:54:503:1305#0
-ACGGGAGCTCTCCATGAATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGATGTGTCTNC
-+
-6777778888882888+88888887777655544322210.//.-.--,,+***)&))))*(((((#"""&&$$""
- at 30BB2AAXX080903:3:59:186:1839#0
-CCGGCTCCAGCGTCTCGCAATGCTATCGAGGGCACACCCCCCAAACGAAAATACAAAATGCATGGAGACCACCNNC
-+
-677777888888888884/888487)77$57534+2,+,0&/.*-,-(+,*)+*%)()))#((((%'&"$"#"""#
- at 30BB2AAXX080903:3:51:735:897#0
-TGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCATGGGACACTC
-+
-67777788888888888888888877773555442222100//..--,,,+++++*)*))())((('$$""#"###
- at 30BB2AAXX080903:3:3:724:724#0
-GGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCNCTCANTG
-+
-6777778888888888888888887747655540322,100./--+--,)+*)*))))))'''((''$"#"$#""$
- at 30BB2AAXX080903:3:39:1558:516#0
-TCTCCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCGC
-+
-67777788888888888888888877776555443222100//..-.--,+,++***)*)))(((('"$#$#"#"#
- at 30BB2AAXX080903:3:38:1200:1023#0
-AGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATCCATGGACG
-+
-67777788888888888888888877776555443222100///.--,,,)+++*****)))((((%"$%&$#"#"
- at 30BB2AAXX080903:3:41:523:1441#0
-AGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATACCAAATGCNCNGACA
-+
-6777578888888888888888887777656554321220//..----,,++*)+*))())('((('$%"#"%##"
- at 30BB2AAXX080903:3:53:366:2032#0
-ATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAAAGATCGGGTGACAGN
-+
-6777778888888888888888887777655544321200./.-,.-,,++++)*(*))(((((''&$"#""###"
- at 30BB2AAXX080903:3:51:505:1972#0
-CCATGCATTTGGTATTTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCTCACTCGC
-+
-67777788888888888888888877776555443520120//-.---+,,++*****)()(&((''$"$"#"#""
- at 30BB2AAXX080903:3:57:413:1896#0
-GACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCAGACCCCCAGATCGGAAGAGCGGCCGCTGA
-+
-6233-78.308882888+83'.8,7//525)+111)--+(,-.&-+*&&&)(('('##(''#&'#%&%#$#"#"""
- at 30BB2AAXX080903:3:42:1614:548#0
-TGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCACACGAAAAAACCACACG
-+
-677777888888'88888888888777765404432102/1-.--.)++,*(''*)*)&#(((''''"$%&%%$"#
- at 30BB2AAXX080903:3:59:609:710#0
-TGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAAAATCGCNACGT
-+
-67777788888888888888888877773555443212100//..-,-,,++++****(')))((''""%%"###"
- at 30BB2AAXX080903:3:3:1192:86#0
-ACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAAACGAACNCAGCNAN
-+
-67777788888888.88880888857771553483010/0.//.-.*,,-&+))#)((&'('''(#'$"$$"#"""
- at 30BB2AAXX080903:3:37:77:1412#0
-ATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGATCACCCGCACN
-+
-67777788888888888888888877776555443222000/...---+,,++***)())()((&('"$#$"###"
- at 30BB2AAXX080903:3:34:378:888#0
-TTTCGTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGNTCATGCNN
-+
-67777788888888888888888877776555443222000//..-+,-,++**&*))())(&('''""%#""#""
- at 30BB2AAXX080903:3:33:1309:1759#0
-GTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGGACCCTATAGATCGGAAGANGTACTCNN
-+
-6777778888888888888888887777655541221110+/+.,.&+&&)**)'(()'##'(#''#""##$""""
- at 30BB2AAXX080903:3:52:949:1056#0
-GTTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGNTTCTCG
-+
-67777788888888888888888877776555443222100//..---++,+++*+))))())((('"$""##"$#
- at 30BB2AAXX080903:3:4:1176:963#0
-TTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGAGATCGGAANACCANTN
-+
-67777788888888888888888357771515503.11+./%'-,'-,,+)*#)))##(#'#'#('#$"&&%%"""
- at 30BB2AAXX080903:3:56:536:318#0
-TTTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGAGATCGGACTGCAG
-+
-67777788888888888888888877773555443221100/...+.,+,,+****))))()')'&&"%"$###""
- at 30BB2AAXX080903:3:43:1770:1227#0
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCGCGCAAAGCTATCGCGTGCACATCCCGCGGC
-+
-67777788888888888888888837776565423212100//,.',(,++$**%(#*)))%('(%%&%"&"&%#"
- at 30BB2AAXX080903:3:4:466:1151#0
-TGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGGCNCTTGNTN
-+
-6777778888888888888886887777353543103/0-.//*-,+(),,()*'%)(&)''(%'&#&"%#"""""
- at 30BB2AAXX080903:3:59:1044:433#0
-GGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGGCAGCNA
-+
-6777778888888888888888887777655544122210.//..---,,+,+***)))*))(((('&$#$$#$"#
- at 30BB2AAXX080903:3:4:903:1139#0
-GGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTCNCTCTNAN
-+
-67777788888888888,8888883777652(4130,20*0/.-,,,&,,*,+')*#()&((&'#''$"$&%""""
- at 30BB2AAXX080903:3:37:1075:826#0
-AGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGCGTTGCN
-+
-67777788888888888888888877776555443.22100///-.-,,,+++*+*))())((((''$%#"%%##"
- at 30BB2AAXX080903:3:48:267:1183#0
-AGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGCGTGAGA
-+
-67777788888888888888888877776555443122100///.---,,+++++*)))()((((''$$""""%"$
- at 30BB2AAXX080903:3:1:1520:633#0
-GAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATAGATCGGNACNACAA
-+
-67777788888888888888888577776555443212///./.---+,,*+*'*)*))((((((%'$""#"$$#"
- at 30BB2AAXX080903:3:38:917:1353#0
-GAGGCAGGAATCAAAGACAGATAATGCGACAGAGGGGGCGCCGGCTCCAGCGTCTCGCAATGCTCTCTCCCCACAC
-+
-62777788888888/88838888%7777%/524130221%,+/-,---,(+*#(**'(%(#')##%#"#"#""$#$
- at 30BB2AAXX080903:3:48:1620:1412#0
-TGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTAGCGCGTTCTC
-+
-6777778888888888888888887777655544322-101....--,,,,++***))('(&('''%""$#"##"#
- at 30BB2AAXX080903:3:4:792:911#0
-TGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATANATCANAN
-+
-67777788888888888888888877776555443222120//...--,,+*+**))*)()))((''"""#$#"#"
- at 30BB2AAXX080903:3:35:769:1076#0
-GATGAGGCAGGAATCAAAGAAAGATACTGCGAAATAGGGAGCCCCAGCTCCACCGTCTCGCAAAGCCNCAGTGATN
-+
-67777788888388888881+4867*776555%112221./.+&/.-&$,*'#&*&()))(%##('&"""""#"$"
- at 30BB2AAXX080903:3:36:1397:1463#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCACGACACGN
-+
-6777778888888888888888887777655544322210//0..---+,+,+****)*)((((&'#$$"#%#$""
- at 30BB2AAXX080903:3:39:15:1916#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGACGCAGCTCT
-+
-67777788/888888888888608777&657544220111//'.+-,-,,+++)'*)&)(('('&%#$"%""$##"
- at 30BB2AAXX080903:3:60:1286:1697#0
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCGGCAGCGTCTAGCAATGGTCACATANN
-+
-677777888888888880888188777765554&022*1*,/&(*(-,,(&)%)&*&'##&'('(&#$$%%&""""
- at 30BB2AAXX080903:3:48:1573:1467#0
-CGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCACCGTT
-+
-677777888888888888881888777765554402221000..+*.++,++**&**))&')&''%#$"$""#"##
- at 30BB2AAXX080903:3:50:307:1304#0
-GCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGGCGCAGTATCTGTCTTTGATTCCTGCCCCCTCACAC
-+
-6777778888888888888888887773655532321210&./.---&,+++*)*)**')''('('%"$$#%"$"#
- at 30BB2AAXX080903:3:55:781:193#0
-AATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAACTCTGTGC
-+
-67777788888888888888888877776555443222110//.,---,,,,+*****))()(((('$"##"##"#
- at 30BB2AAXX080903:3:45:1521:794#0
-CGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATCTATCGCAC
-+
-6777778888888888888888887777635554-2221000/.---,,,,++**)*)())((((''$&#""$""%
- at 30BB2AAXX080903:3:50:1663:1087#0
-GGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCACGGCACAC
-+
-67777788888888888888888877776555443221100//.--,-,-++++**))(())()(''$$""#####
- at 30BB2AAXX080903:3:3:760:1493#0
-AGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTANCGCCNTC
-+
-677777888888888888888888777765355430220/00/.-,,-,,+++**&))*)')(((('""$%$#"#%
- at 30BB2AAXX080903:3:44:343:675#0
-CGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTAGATCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(()((&$'&"%"""%
- at 30BB2AAXX080903:3:44:1708:1325#0
-GCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCTCCTCCGT
-+
-6777778888888888888888087777+55544352210///+/.-,,,,*+**)()))))(('(''$#%&#"#$
- at 30BB2AAXX080903:3:57:317:1066#0
-ATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATAAAAGACAGATACTGCGACATAGGGTNCTCGAC
-+
-6777778888888818888888887777655344321210,/.$,----++++%*)**()(((&((&'""""##"#
- at 30BB2AAXX080903:3:44:1187:1203#0
-CGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATT
-+
-67777788888888888888888877776555443222100//..----,+++***)*))))((('&%&&$$&$$$
- at 30BB2AAXX080903:3:2:1371:779#0
-GGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTNCACACAC
-+
-67777788888888888883888877776555443202100....--,,,,,+***()))'((((''&"%&#$##$
- at 30BB2AAXX080903:3:4:1100:1716#0
-TTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTCNCACCNCN
-+
-67777788888888888888&8824777945344322010,//,.---,,,++****)))))((((#$"%$#$"#"
- at 30BB2AAXX080903:3:55:930:977#0
-TGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGATCA
-+
-67777788888888888888888877776555443222100//-..--,-++**))***)*((((''$&"#"#"#"
- at 30BB2AAXX080903:3:50:302:933#0
-ATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGTCGCCGTG
-+
-67777788888888888888888877776555443222100//.----,,+*+*****))))))((($"$"#""""
- at 30BB2AAXX080903:3:57:1469:1852#0
-TTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGAACAGATCAC
-+
-67777788888888888888888877776555443222100/...---,,,++***)*))*(((('('$%####"$
- at 30BB2AAXX080903:3:43:934:69#0
-ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGAG
-+
-67777788888888888888888877776555443222100/./.--,,,+,+***))))()()(''''&#&$%$$
- at 30BB2AAXX080903:3:47:1027:908#0
-TGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGCGCGTGCAT
-+
-67777788888888888888888877776555443222100//..----,+++***)*)()((((('"###""$##
- at 30BB2AAXX080903:3:55:284:788#0
-TTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTAGCTTGACT
-+
-67777788888888888888888877776525443210111/.-,-,-+,+,++****)()(((&''"$#&%$""%
- at 30BB2AAXX080903:3:59:869:664#0
-CCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATANTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(((('&$"%#%##$
- at 30BB2AAXX080903:3:57:144:1832#0
-TACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAATGTCTGCACAGCCGCTTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('('&%&##"###
- at 30BB2AAXX080903:3:59:1087:334#0
-GTTATGATGTCTGTGTGGAAAGCGGCTGGGCAGACATTCAAATGTTATTATTATGTCCTACAAACATTGTAAACNC
-+
-6777778888888888888888887777+5$,4/20'-.&/#..,.+-,,+,)**(%(#''('#'%#'"""""$"#
- at 30BB2AAXX080903:3:56:151:634#0
-ATAATAATAACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACACGACTCGC
-+
-67777788888888888888888878776555443222100/,.--,--,+++**))))))))((('""#&%"#%$
- at 30BB2AAXX080903:3:4:1365:1721#0
-TGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCAAACCCCCCCTCCCCCCCNGTCCNAN
-+
-67777788888888888888888877678355433220110//,---,,++,%**+)*))#)(((('$""#"#"""
- at 30BB2AAXX080903:3:50:1218:1566#0
-TAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTATAAGCGCTGTGGCAAGAAGCGGGGGGGGGTGCACGCCA
-+
-677777888888188888888&8877776.5014/2'%1.0/'.,,.++,+$'*')(#))((((&('""%$$####
- at 30BB2AAXX080903:3:53:407:1013#0
-TTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTTTAAGTGCTGTGGACAGAAGAGGCACG
-+
-67777/888188+8888888888877776555413222*00./.--(-+,+*++**))))))%(('%$#"$""$"#
- at 30BB2AAXX080903:3:57:704:1888#0
-TGGTTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGATGTGTTTAAGTGCTGTGGCCAGGTTTCCG
-+
-67777788888888888888888877776555443222100//.,-,-,,+++***)*)))()(((%%%#"""##"
- at 30BB2AAXX080903:3:8:1664:1236#0
-AAAAGATAAAATTTGAAATCTGGTTAGGCTGGTGTTAGGGTTCTTTGTTTTTGGGGTTTGGCGGAGANCACATGNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((''"%"#"""""
- at 30BB2AAXX080903:3:43:1314:714#0
-ACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTTGGCGGTATGCACTAGATCG
-+
-67777788888888888888888877776555443222000//.----,,+++****)))))((((&%&#"%"""$
- at 30BB2AAXX080903:3:52:36:1832#0
-GGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATACCGCCAAAAGATAAAATTTGAACTCAGTAG
-+
-6777778888888888888888887777655544322010./...--,,,+++*+**)*)))(((('$%"%#%"""
- at 30BB2AAXX080903:3:51:882:161#0
-ATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATACCGCCAAAAGATCACATG
-+
-677777888888888888888888777765554432221/0//..---,,+++***)*))))(((''$#"###%$"
- at 30BB2AAXX080903:3:55:1045:598#0
-TTTGGCGGTATGCACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTACTC
-+
-67777788188888888888888877776555433222100//...--,,-+++**)*))))(('''%&#####"$
- at 30BB2AAXX080903:3:33:507:1544#0
-GATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGTTAAAAGTGCATNTCGTCCNN
-+
-67777788888888888888888877776555843022100//..---,,++****))))))'((('""##$$$""
- at 30BB2AAXX080903:3:59:961:985#0
-TATGCACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTAATCTCAGTCAA
-+
-67777788888888888888888877776555443222100//-----,,,+****)*))))((((''$&#""###
- at 30BB2AAXX080903:3:50:839:564#0
-GTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTGACTGATTACAGT
-+
-67777788888888888888888877776555443222100//.,---+,,++***)))))('('%'%"""##"""
- at 30BB2AAXX080903:3:46:149:683#0
-TTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTAAGATCGGAAGATCGCTGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(&%"%#$#""#
- at 30BB2AAXX080903:3:3:1443:882#0
-GGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTGGGGGGTCNCTGTNCA
-+
-67777788888888884888188677176555.4+222000./.-,,-++*+*+))))())(('((%""%##""##
- at 30BB2AAXX080903:3:57:771:103#0
-GGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAATGTGTTAGTTAGATCGCGGCAC
-+
-67777788848888888888888877776555443222100/...--++++++****))))((((''""%#""##$
- at 30BB2AAXX080903:3:45:891:253#0
-TGTGTGCTGGGGAGGATGGGGGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAACGGCGCACA
-+
-67072788888888888888888877(76.59%42122100//...-+,,+,+%*)*))())((''("""#""$#"
- at 30BB2AAXX080903:3:59:1050:973#0
-GTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGGGAGGGGAAAATAAGCAC
-+
-6777778888888888888881887771655544312210///..---,,,++***%)))(((((&'&"$###%##
- at 30BB2AAXX080903:3:53:277:2041#0
-ATTATTTTCCCCTCCCGCTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCAGATCGGAACGGCNCCN
-+
-6777778888888888*888888877776555443222000//..--++,++++**))*))()((('&$"""""""
- at 30BB2AAXX080903:3:46:1516:861#0
-TGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATTAGTAGTATGGGAGTGAGATCGGACGGGC
-+
-67777788888888888888888877776555443222100//..---,,+)+***)))))#()(''$$"##"""#
- at 30BB2AAXX080903:3:48:533:138#0
-CAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGGTGTATTGATGAGATTAGTAGTATGGGAGGGGGCGCGAGC
-+
-677777888888888888888888777765'54432021*.//.---*,+,+****))))))('(#(""#"#"""#
- at 30BB2AAXX080903:3:1:358:1289#0
-CCTCCCACTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACAAGATNACNACAC
-+
-67777788888888888888888877776555443122200//...,--,,++****()))((((('$"#%"$$##
- at 30BB2AAXX080903:3:47:1079:1305#0
-TCCCACTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACACACCAGCACGACCA
-+
-67777788888888888888888877776555443222100//..---,,,++*****)))((('('%#"%"###"
- at 30BB2AAXX080903:3:3:851:1747#0
-CTCCCATACTACTAATCTCATCAATACAACCCCCACCCATCCTACCCAGCACACACACACCGCTAGACNCGCANCA
-+
-67777788888888888888888877776555043221121/...--,-,-+**+*))))))(((''""$&&%"##
- at 30BB2AAXX080903:3:60:1051:623#0
-GTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTTGTATTGATGAGATCGTGNN
-+
-67777788488888888888888877776555443222101-/.,.--,++,+**'**))))(((('%"&$%""""
- at 30BB2AAXX080903:3:52:187:114#0
-TTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGGCAGAGCGGAAGACCGGCGCG
-+
-67777788888888888888888877770525342212100//+---*-,++)***'#)(#()(#&'$""$$#""#
- at 30BB2AAXX080903:3:2:1270:441#0
-CAATACAACCCCCACCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAACCAACCNGAACACC
-+
-6777778888888888888888887777.3360413000/0.-.,-,,+)***(*&&((((''#'(#&"##"$##"
- at 30BB2AAXX080903:3:50:953:540#0
-TGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGGGGCTGGTGTT
-+
-67777788888888888888888877776555443222100//..---,,+++'**)()))(%('''%$""""""#
- at 30BB2AAXX080903:3:33:1568:449#0
-TTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGGGGNCGACCCNN
-+
-67777788888888888888888877776555443222101/+.,---,,+,+**)*))))(((''&"%"####""
- at 30BB2AAXX080903:3:43:1453:1629#0
-CTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTGCTGGGTAGGATGGGTGGGGGTCTCC
-+
-67777788888888888888888837776555443502000//..-.-,,+)+***%(*)#()((%''%#"#$#$"
- at 30BB2AAXX080903:3:41:1186:644#0
-ACAACCCCCACCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAACCAACCAAACCTCCAANT
-+
-67777788888888888888888877776555443222100//..--,+-+++*++))*)(((((('&%"&&"%""
- at 30BB2AAXX080903:3:50:1591:976#0
-GGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGTAGATCGGAAGGCTCTNCAA
-+
-67777788888888888888888877776556443222100//..---+,(+****()))('((&('"%%#""#"#
- at 30BB2AAXX080903:3:39:244:215#0
-ACTGTGGGGGGTGTCTTTGGGGTTTGGGTGGTTCGGGGTATGGGGTTAGCAGCGGTGTGTGTGGGATAGGGACACA
-+
-67774788888088&8888888-8777365554432220/0//..+-,,,,++**()#)()#(%(('$%"#$#$$#
- at 30BB2AAXX080903:3:34:1458:416#0
-CATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGTTAGCAGCGGGGTGTGGNCTAGACNN
-+
-67777788888888888888888877776555443222100//.----,,+,+***)**)#)#(&(%"%%""#$""
- at 30BB2AAXX080903:3:58:18:1320#0
-ACACCGCTGCTAACCCCATACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTCACTNNT
-+
-677777888888888888888888777795255132210./...-,-,++*+***))(&('(('(''"%""$"""#
- at 30BB2AAXX080903:3:60:1436:1965#0
-TTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGGGGTATGGGGACACNAANN
-+
-677777888888888888888888777765554/3('1100//.,---,(,*+**((*))&'((((%$$##"#%""
- at 30BB2AAXX080903:3:48:1341:337#0
-GTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGGTGGTTCGAGATCTGCATGG
-+
-6177778888888888808888887777651343322210)/..,---,,+$+***&*))((((#(%"#"###"""
- at 30BB2AAXX080903:3:36:757:568#0
-AGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGTGTCTTTGGGGTTTGGTTGGTTCGCTCTCCTGN
-+
-67777788888888888888888877776555443222100//...,-,,+++***)))()((((('%##&$$#""
- at 30BB2AAXX080903:3:36:758:569#0
-AGTGTATTGCTTTGAGGAGGTAAGCTACCTAAACTGTGGGGTGTGTCTTTGGGTGTTGGTTGGTTCGCTATGACGN
-+
-6777778888888888888*18'877776545243))2100./(.,,-,,+++*#*)*)))(((''#$&#$%###"
- at 30BB2AAXX080903:3:41:976:1436#0
-ACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGT
-+
-6777778888888888888888887777655544322210///.---,,-++++***)))))()((&&&%%%#$##
- at 30BB2AAXX080903:3:42:399:173#0
-TGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGGGGGGGGCTAGATCGG
-+
-67777788888888888888888877776555443222200//....-,-,*+***)))*))((#'%&&#&$"##"
- at 30BB2AAXX080903:3:41:1791:827#0
-GTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGGAAGCTACATAAACTGTGGGGGGTGTCTTTGGCC
-+
-677777888888888888888888777765554432221/0/%..-,-,++,+**))*)))((('&'%%%#$#"#"
- at 30BB2AAXX080903:3:57:550:1680#0
-GGGTGATGTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACATAAACTGTGGTGCGACTC
-+
-677.7788888888888888888877776555443222100//..---,,+,+**+)*))))(((('$&%$"##"#
- at 30BB2AAXX080903:3:42:1112:266#0
-TTTATGGGGTGATGTGAGCCCGTCTAAACATTTTCAGTGTATTGCTTTGAGGAGGTAAGCTACAGATCGGGGNCTA
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))((('(''$&"%"#""
- at 30BB2AAXX080903:3:51:69:105#0
-GTTTATGTAGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCACACACCGCTCT
-+
-6770778888888888888888804777555244322+100./.,-,-,+,++***)()(()(('%'%"%""##$"
- at 30BB2AAXX080903:3:40:1472:1490#0
-AGCTTACCTCCTCAACGCAATACACTGCAAATGTTTAGACGTGCTCCCCTCACACACTACACACATAGGCACGTNC
-+
-677077'.8188888+880388(8777&6$/55,02.%2&0//).-*&',*++)*'())))((('(%"&%#$""""
- at 30BB2AAXX080903:3:40:1472:1492#0
-AGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTCGCANC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)))((''"&%"$#$""
- at 30BB2AAXX080903:3:47:43:510#0
-CAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTATTCATCGC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('"$""#$""#
- at 30BB2AAXX080903:3:38:225:158#0
-ACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTTCTACCAGACTNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*))*((((''$$&%"#"""
- at 30BB2AAXX080903:3:2:121:1713#0
-TCACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATNCAANNTC
-+
-6,7777888888888888888858777765554432.1100//-.---,,+++***)*)))))((('""#&$""""
- at 30BB2AAXX080903:3:60:877:1195#0
-CGGGGATGCTTGCATGTGTAATCTTACTAAGAGCTAATAGAAAGGCTAGGACCAAACCTATTTGTTTACTCCAANN
-+
-67777788888888888888888877776555443222100//..---,,,)+***))()))))((&%$$####""
- at 30BB2AAXX080903:3:55:617:1140#0
-GATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAATCTTACTAAGAGCAGCTCACG
-+
-677777888888888888888888777765/5443222100//.,--,,,,+)****))))((('('&&$""#""#
- at 30BB2AAXX080903:3:52:1294:1234#0
-ATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGCTCAGAC
-+
-67777788888888888888888877776555443222100//..---,,++****))))(((((('"&#&&$##"
- at 30BB2AAXX080903:3:1:125:1464#0
-TTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTACAGATCGGAANACNCACT
-+
-67777788888888888888888877756555443.21100//...-+,-+,+****)&))()((('&"#""###"
- at 30BB2AAXX080903:3:51:237:543#0
-CTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCCGCTCACGC
-+
-677777888888888888888888777765554112221.0-/.,.,-,,+,++)*)))))()(''&$%%"$$#"#
- at 30BB2AAXX080903:3:48:1771:173#0
-TGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAATCTCTGACGCA
-+
-67777788888888888888888877776505441220000/..-.--,*+++&)*)()))(&'''%"$"""#"##
- at 30BB2AAXX080903:3:38:1762:688#0
-AGTAAGATTACACATGCAAGCATCCCCGATCCAGTGAGTTCACCCTCAAAAGCACCACGACCAAAAGGACACACNN
-+
-6777778888888888888888887777%45544.2221/0//..--(,-,'()*)()')%%(((''"#""#""""
- at 30BB2AAXX080903:3:59:1285:1050#0
-GTAAGATTACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGTGCCTCCAA
-+
-67777788888888888888888877734/254832222/0/-+/.-,,,,*+)*))*()(((((''"""#"##$#
- at 30BB2AAXX080903:3:48:1340:68#0
-GATTACACATGCAAGCATCCACGTCCCAGCCAGCCCACCCTCTAAATCACCACGATCAAAAGGGACACTCCGCACC
-+
-67777788888888888888*88&-7716)'54$'.2/1'./.+-."+,,*++&)&(((()(#((&'%"&##$###
- at 30BB2AAXX080903:3:44:827:1049#0
-GCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTTGCATGTGTAAT
-+
-67777788888888888888888877776555443222101//..---,,++++***))()((((('$$%#&#""#
- at 30BB2AAXX080903:3:47:173:945#0
-TTACACATGCAAGCATCCCCGTTCCAGGGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGGACGAGCCC
-+
-677777888888888888888888777%65521432,2100*/...--,-++*+****)))((((''"#$""$#"#
- at 30BB2AAXX080903:3:55:1179:1581#0
-TACACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCACCCAC
-+
-677777888888888888,88888777765-554122210/./.--,--,+++**))*)))()(''%%&$%#"$#"
- at 30BB2AAXX080903:3:1:372:1628#0
-ACATGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCAGCANCCNCACC
-+
-67777788888888%88-8888807677654544321200./..-,--',+++*)*)*)()((((#''"#""%$$"
- at 30BB2AAXX080903:3:37:246:1497#0
-TGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGGATGCTCTGANAN
-+
-677777888888888888888888777765554132201000/..+-,-,,++(+**()())(('''%""$#$"""
- at 30BB2AAXX080903:3:46:366:1610#0
-TGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGAGATCGGCACAGCGG
-+
-67777788888888888888888877776555443022100//..---,-+)++**)*))))((((''$###"$"#
- at 30BB2AAXX080903:3:41:1692:846#0
-TGCAAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCAAGATCGGAGTTGCN
-+
-67777788888888888888888877776555443222100//...-,-,+++***)*))()((('''"""$""""
- at 30BB2AAXX080903:3:38:761:1664#0
-AAGCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACTCAGCCACT
-+
-67777788888888888888888877776555443322/01/..--+-,,+++****())()(('('%$$$$###"
- at 30BB2AAXX080903:3:53:1219:936#0
-AAGCATCCCCGTTCCAGTGAGTTCACCCTCTAACTCACCACGATCAAAAGGGACAAGCATCAAGCAATCTCGGACG
-+
-67777788888888888888888877776555443222100//..--,,,+,++**)))))((((('%%$&&###"
- at 30BB2AAXX080903:3:36:634:304#0
-CATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGNGCATACAN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((((&"###$#"#"
- at 30BB2AAXX080903:3:36:635:305#0
-CATTGCTGCGTGCTTGCTGCTTGTCCCTTTTGATCGTGGTGATTTAGATGGTGAACTCACTGGAACGNTCGCTGTN
-+
-6477778888888888%88888887*77855544322-100./...-,$,+++**+)*())))'('&""$"####"
- at 30BB2AAXX080903:3:55:43:1020#0
-CATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGAACGGGCGCGCCT
-+
-677777888888888888888888777765554432221/0./...-,,,++++*)**)))(((((&"&#"#"##"
- at 30BB2AAXX080903:3:1:1181:617#0
-GCATTGCTGCGTGCGTGATGCTTGTCCCTTTTGATCGCGGTGATTTAGAGGGTGAACTCACTGGAACGNCTNACTC
-+
-6770478888888%)8888883882,7-652.42#.2'10&/.(%,,-+,-+%+*##)'(''()#&%&"$""#$##
- at 30BB2AAXX080903:3:36:817:1175#0
-ATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCACACATCCGCN
-+
-677777888888888888888888777765554432221001/.-----,+,++**)))))))(((%$&%&##"$"
- at 30BB2AAXX080903:3:35:955:880#0
-TGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACNCTACCTCN
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(("&%%##"#"
- at 30BB2AAXX080903:3:36:1000:1381#0
-TGAGCTGCATTGCTGCGTGCTTGACGCTTGTCCCTTTTGATCGAGGTGATTTAGAGCGTGAACTTATGAGCGACAN
-+
-677777-888888888888/8888%777/5554(*.+2.0,//#/-,-+,*+**'*')&)))'&#'%""$""#"#"
- at 30BB2AAXX080903:3:51:741:1898#0
-TGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACTGGCACGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))()()(((('"%"$""$$"
- at 30BB2AAXX080903:3:42:723:1669#0
-TTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCCCTGTGAGG
-+
-6777778888888888888888887777655542312210/-/...--+,+,++**))&)#)#(#'%""$%#%###
- at 30BB2AAXX080903:3:56:239:1775#0
-TTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGTGAACTCACGCGTCGT
-+
-67777788888888888888888877776555423222100./...--+,+,*+**))))'((((('$%$#""#""
- at 30BB2AAXX080903:3:51:671:359#0
-GTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCATCCTCAAT
-+
-67777784888888888888888877776555443222100//..---,,+++***)))))((((''"##$#""#"
- at 30BB2AAXX080903:3:47:183:423#0
-TCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAAGATCGGTAGGTCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('($"#$""##"
- at 30BB2AAXX080903:3:55:1023:796#0
-TAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTAGATCGGAAGAGCGTGTCAT
-+
-67777788888888888888888877776555443222100//..---,,,++****)))))((('''$$""###"
- at 30BB2AAXX080903:3:49:602:1841#0
-AGTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTAGATCGNGGTGCAC
-+
-67777788888888888488088877736555441222/00./...-+,,++*****)))((((('%"""""##"#
- at 30BB2AAXX080903:3:43:1468:441#0
-AGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGATTTAGAGGGGGGGT
-+
-677777888888888888888888777765054432321////.-,.*,,,,**)*)))&)&(((&'&$%#"""""
- at 30BB2AAXX080903:3:1:101:1973#0
-CACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTANAANCACA
-+
-67777788888888888888888,7.7765554432220///-.-.,-,-*++*)**())&(()(('%"""""#"#
- at 30BB2AAXX080903:3:41:565:1780#0
-TGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGACTTCGCANG
-+
-677777888888888888888888777765554432201001/.,---,,+++***)*)))))(('&$$%$%#""#
- at 30BB2AAXX080903:3:3:1591:1394#0
-GTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGTGTNTTACNCN
-+
-6777778888888888888888887777655544322200.//...-,-+++*)*)*((%')'((%'""#%#""""
- at 30BB2AAXX080903:3:49:1602:180#0
-GGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTGGGTGCCGCA
-+
-6777778888888888888688887743655544322-1/0./..-,-,,+++**+)()))'('(&(""#"##"#"
- at 30BB2AAXX080903:3:37:580:1209#0
-GGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGCTTTCTCTN
-+
-67774788888888888888888877776555443222100//..--+,,+++***))*)*()((''%$$"$%"#"
- at 30BB2AAXX080903:3:60:1676:228#0
-ATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGACAACACACNN
-+
-67777788888888888888888877776555443222100././---,,+++&**))))'(((((&$%%%%$#""
- at 30BB2AAXX080903:3:56:622:110#0
-TCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACAGCCCAAC
-+
-6777778828888888888888887873655154322210,//..---+-++++*()))))(()(''&&#$$%"##
- at 30BB2AAXX080903:3:43:774:1532#0
-GTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTTGATCGTTGCAC
-+
-67777788888888888888888877776555443122120/..--,-,,+++****)(((()(((&'$%#""#"#
- at 30BB2AAXX080903:3:49:1149:1514#0
-GTGGGGGTGTGGCTAGGCTAAGCGGTTTGAGATGCCTTGCTGCGTGCTTGGTGCTTGTAGATTGGGACGTGCGTGC
-+
-6777778(8888888888..88-81777*+5)%4*.$1+1./+.),*+,+%++)**%'&)('#((&&$"##$#"#$
- at 30BB2AAXX080903:3:49:1283:1557#0
-GTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCCGGCTTGATGCTTTTTCCTTTTTTCTTCGGGGC
-+
-6/777788888888838/8$88.86777155"441,212#+0+$%-&#,,%)+)+*&()##''((&#%""#"#""#
- at 30BB2AAXX080903:3:50:591:1879#0
-CGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCGTTTGACCGTGGTC
-+
-671777888888888.8828188877176525443222*////--.-,-,+&****)*%#'('(((%"$#$""""#
- at 30BB2AAXX080903:3:1:1637:1222#0
-ACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTACCCTAGCCACACNCANCGAC
-+
-671077888888888888888&8&7*77655542300000/+...,--+,+**(*)'(((('#((&%&"%"""""#
- at 30BB2AAXX080903:3:50:1746:1971#0
-CCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTTTATGACAGGC
-+
-6777778888888888-888888877776555441222100/...---,,++++**(*)))((((('""#$#""##
- at 30BB2AAXX080903:3:52:1572:139#0
-CACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCAACACCTCCACGAAC
-+
-67777788888888888888888877276555443222100//..---,,*++****))(#((('(%"&&&%##$"
- at 30BB2AAXX080903:3:38:707:1344#0
-TCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCCCTAGGTCGGACA
-+
-67777788888888888888888877776555443022000//-.---+,,++***)***))(('''""%%#""$#
- at 30BB2AAXX080903:3:36:94:1875#0
-GTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGTGCTTGATGCTTGTCTCTGTCTANN
-+
-67777788888888888888888877776555443222100/...---,,+,+***))()&))(('#%#"%$"$""
- at 30BB2AAXX080903:3:42:1586:1352#0
-TGTTTCCCGTGGGGGTGCGGCTAGGCTAAGCGTTTTGAGCTGCGTTGCTGCGTGCTTGCTGCTTGTCCCGTCTGCT
-+
-67777788888888888/888.887377.5.53432.'1&./,)-++&++&+**&(*)%)'#((('#"&%%#%"$%
- at 30BB2AAXX080903:3:52:1010:1566#0
-AAGGGACAAGCATCAAGCACGCAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCAGATCGGTGGTGCGC
-+
-67777788888888888888888877776/55443222100//..--,,,++)+****)))((((('&"##"%"##
- at 30BB2AAXX080903:3:43:144:721#0
-AGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGAGATCGGGCACG
-+
-67777788888888888888888877776556443222100./.,-,-,,+,+'**(())(('((''&$""#""""
- at 30BB2AAXX080903:3:59:1207:1350#0
-AGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGGATTGAGATTGGANAGGCAA
-+
-67777788888888888888888877776555443222100//.----,,+*+)**)(())((('#''&""""#"#
- at 30BB2AAXX080903:3:42:159:363#0
-AAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGAGATTGGTAGA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()('(&&""%%"$"#
- at 30BB2AAXX080903:3:51:858:1755#0
-TAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGCAACTCT
-+
-67777788888888888888888877+765553432211/0/,..--+,+,+++()()*&%)(('''$"#""#$""
- at 30BB2AAXX080903:3:55:536:1198#0
-TAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCTGCGGTGGACG
-+
-67777788888888888888888877776555443222100//.-.-,,-,++***))))())((('"&#"""##"
- at 30BB2AAXX080903:3:51:513:1866#0
-TGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGCAGCTAGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))(()(('&$"$""##"
- at 30BB2AAXX080903:3:1:953:138#0
-ATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGGGGGGCTAGGCTAAGGGTTTTGAGGTGGGTCNACNTACC
-+
-6777778888888888.808838877720)5+44321'0$0/*.--,+))+)%*))))&%##&(##'""#$""""#
- at 30BB2AAXX080903:3:33:1139:191#0
-TATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCANTGTCACNN
-+
-67777788888888888888888876776555243222.00//...,-,,+++**)**))()(((''"$""$#"""
- at 30BB2AAXX080903:3:40:640:1075#0
-TATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTTGTGTNG
-+
-67777788888888888888888877776555443222100//...--+,,,+*****))()(((''"&$%%$$"#
- at 30BB2AAXX080903:3:54:406:1344#0
-TTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGGGGGGCTAGGCTAAGCGGTTTGAGGTGCATAGATGTG
-+
-677777888888888888888888774765554-32221*0$/.-(,-,++$+))+()*)&#)%'(&$$"%"#""#
- at 30BB2AAXX080903:3:58:781:105#0
-TTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGTTTTGAGCTGCATTGTCNNA
-+
-67777788888888888888888877776555443222100//.--.-,,+++*)*(*)))'(((('$&&$$$"""
- at 30BB2AAXX080903:3:1:67:1567#0
-CAGCAATGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAGCCTTTAGNCANAACA
-+
-6777778888888888888888887777555544322210///...,*,+++++%*)))())(((('$""#"###"
- at 30BB2AAXX080903:3:34:1236:828#0
-TGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGCGATTAGACTTTAGATCGGNACATAGNN
-+
-6777778888888888388888887/77655544322210///...--',+***+()))()((((('""%"#""""
- at 30BB2AAXX080903:3:38:716:1109#0
-GTTAAACTTTCGTTTATTGCTAAAGGCTAAACACCGCTGTTTCCCGTGGGGGTGTGGCAACGCTAAGACTGTACAC
-+
-677777888888888888888888777465.524%2.210....--(-,,,+'*))))'(''%''&%""&&$####
- at 30BB2AAXX080903:3:8:875:1618#0
-GTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGNAGCTCANN
-+
-67777788888888888888888877776555443222100//.--,-,-+,*+***))'))(((''"""$"#$""
- at 30BB2AAXX080903:3:48:1479:858#0
-AGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTAAGCGGTCNTN
-+
-67777788888888888888888877776555443222100//..---,,+++**)))***)(((''%$##$#"""
- at 30BB2AAXX080903:3:1:1655:483#0
-TTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTGGCTAGGCTANGANACTC
-+
-677777888888888888888888777765554432221/0//.---,,,+++*+)))))')(((&'%""""$$#"
- at 30BB2AAXX080903:3:1:1230:1667#0
-AAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAGCCTTTAGCAATAAACGACAGTTNACNCAAC
-+
-677777888888888888888888777765.54432121///..-.-,,,+*+*)*)')))((%('#'"$%""###
- at 30BB2AAXX080903:3:1:1054:903#0
-TTAGTATAGCTTAGTTAAACTTTCGTTAATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGTGTNCANACTC
-+
-677777888888888888868888787765553430220/0//.----,+,++)***()())(((%'%"$#""##"
- at 30BB2AAXX080903:3:35:1065:1365#0
-GGTTAGTATAGCTTAGTTAAAATTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTCCCGTGGGGGNTCTCCACN
-+
-671777888888888888888%8807776355443202100//..-(,,,+++***((*()')(((&""#"##"#"
- at 30BB2AAXX080903:3:8:1265:1332#0
-GGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTAGATCGGAAGANGCATCANN
-+
-67777788888888888888888877776555443222100///.---,,+++***)*))))()(('""###%#""
- at 30BB2AAXX080903:3:39:1017:1515#0
-CCCCACGGGAAACAGCAGTGATTAGCCTTTAGCAATAAACGAAAGTTTAACTAAGCTATACTAAAGATCGGACACA
-+
-67777788888888888888888877776555443221100//..---,,-+++**))*))))((('&&#%$""#"
- at 30BB2AAXX080903:3:49:516:1299#0
-GAAACAGCAGTGATTAGCCTTTAGCAATAAACGAAAGTTTAACTAAGCTATACTAACCCCAGGAGATGGGCGTGAC
-+
-67777788888888888888888877776555443222100//..--,,,++****))()))((((&"""""""$#
- at 30BB2AAXX080903:3:44:354:1549#0
-GAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTAATCACTGCTGTTTC
-+
-67777788888888888888888877776555443222100//..---,,+++**)))*)))((('''$&%%$$#$
- at 30BB2AAXX080903:3:54:794:50#0
-TGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTACTCATTGT
-+
-67777788888888888888888877776555443222100//-.---,,+,+***)))*()()''(%""&%###"
- at 30BB2AAXX080903:3:37:1308:232#0
-GCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCGTTTATTGCTAAAGGCTCACACAN
-+
-67777788888888888888888*7777)-5504222220//,.,.-,,-+++)))*)()((((''%$$#&$#$""
- at 30BB2AAXX080903:3:8:654:682#0
-GTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTGAGTGTAGCTTAGTTAAACTAGATCGNCGCCAANN
-+
-67777788888888888288888877774.451(0222101./.-%---++++*'*))*()((((%'"$"#$##""
- at 30BB2AAXX080903:3:2:664:1407#0
-TCGTGTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTCNCTGTCTC
-+
-67777788888888.88.8883-547336+522-/,,-.0.-/,,,*,+(+)*(')(((((#('(&'$"##""""#
- at 30BB2AAXX080903:3:34:1682:248#0
-TCGTGTGACCGCGGTGGCTGGCACGAAATTGACCAACCCTGGGGTTAGTATAGCTTAGTTAAACTTTNACTACANN
-+
-67777788888888888888888877776555443222100//.%---+,,+++*)*))))((((('""#"#$%""
- at 30BB2AAXX080903:3:60:945:766#0
-AAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATCCACACNN
-+
-67777788888888888888888877776555443222100//..---,,,,****)))())((((''#%$%"#""
- at 30BB2AAXX080903:3:55:134:1049#0
-CTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGAGATCGTGGCGCG
-+
-67777788888888888888888877776555443222100//..+.,+,,+****))()'(((((#"&#%#$#""
- at 30BB2AAXX080903:3:51:370:1606#0
-TAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGTCAATAGAAGCCGACAGTC
-+
-67777788888888888888888877776555443222100//..---,-++*+**)**)(((((('%"""#"""#
- at 30BB2AAXX080903:3:35:318:584#0
-TTCGTGCCAGCCACCGCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTANGTCTCTTN
-+
-67777788888888888888888877776555443222110//...--,,+++**)*)))'(()(('"""##$"""
- at 30BB2AAXX080903:3:44:475:1277#0
-AGTTTTAGCTTTATTGGGGAGGGGGTGATCTAAAACACTCTTTACGCCGGCTTCTATTGACTTGGGTTAATCGTGT
-+
-67777788888888888888888877776555443222100//..---,,,,+**)))*)()((((%'""#&%#$"
- at 30BB2AAXX080903:3:39:820:1606#0
-CGGCGTAAAGAGTGTTTTAGATCACCCCCTCCCCAATAAAGCTAAAACCCACCTGAGTTGTAAAAAACTCCATCTC
-+
-67777788888888888888888877776555242222100././.-+,+++****)*)))()(((''&%&#""""
- at 30BB2AAXX080903:3:37:297:1052#0
-AGTCTATTTTGTGTCAACTGGAGTTTTTTACAACTCAGGTGAGTTTTAGCTTTATTGGGGAGGGGGTGATCTACGN
-+
-67777788888888888888888877776555443222120//..--,,,+++***))))(()((('""#%$##""
- at 30BB2AAXX080903:3:59:1002:797#0
-CACCCCCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAACAACGCCAGTTGACACACAATAGACTACGCTCTA
-+
-677271888888888888888888-11765714/300210,+&...(,,,,)****))))))')(('"$#"#"#"#
- at 30BB2AAXX080903:3:45:626:1898#0
-CAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACTGGAGTTTTTTACAGATCGGAAGAGGGAGTGTTC
-+
-677777888888888888888888777765554432220001/...-,-,+++*)+)**()((((('$"#"""""#
- at 30BB2AAXX080903:3:40:372:2010#0
-GTGTTCAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACGGGAGTTTTTTACAATTCAGCTGAGCTCT
-+
-67777788888888888888,4884777555.%41222100//..-*&,,,+)**))))(((%(&('%%"%"#"#"
- at 30BB2AAXX080903:3:35:928:569#0
-TTTGGGTCTTAGCTATTGTGTGTTCAGATATGTTAAAGCCACTTTCGTAGTCTATTTTGTGTCAACTNGAGCCGTN
-+
-67777788888888888888888877776555443222100//..----,,++***)))*)))(((&""#"%#"#"
- at 30BB2AAXX080903:3:58:1128:1593#0
-AGTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGCCTAAC
-+
-67777788888888888888888877476$55443$0210///,..-,,,++*+)&())(('''('('$&##"""#
- at 30BB2AAXX080903:3:2:257:83#0
-GTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAAAAAACAATAGATAAGAAAAAAAATNCAANNAC
-+
-6777738888888883288)86817073+346-1"./-1#/*.)%+",&,+&*&%(((#'###&(&#$"$""""##
- at 30BB2AAXX080903:3:36:716:897#0
-GTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAAACTCACACCN
-+
-6777778888888888888888887777%5154422220.0.'..---,,-,+*)))*((&'('''#$$$#$###"
- at 30BB2AAXX080903:3:40:810:1481#0
-CTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGTGTGTTCAGATATGTTAAAGCCACTTAGAC
-+
-67777788888888888828888877/7055544-02200,....---,,,+*+*()*))((((((#&&&$%&$#$
- at 30BB2AAXX080903:3:57:821:784#0
-TGAGGTTTAGGGCTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGTGTGTTCAGATGCGCACA
-+
-67777788888888888888888877776555443222200//..---,,+++***)))))(((((''&"#"####
- at 30BB2AAXX080903:3:1:1056:727#0
-CTGTTGAGGTTTAGGGCTAAGCATAGTGGGGTATCTAATCCCAGTTTGGGTCTTAGCTATTGAGATCTNCANACGT
-+
-67777788888888888888888877776553443222100//.----,,,,+++*)))))((((('&"##""#""
- at 30BB2AAXX080903:3:39:925:350#0
-AGCTAAGACCCAAACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGATCGGAAGATCGCTCATC
-+
-67777788888888888888888877776555483222110//-/.--,-,,++**)**())(((('"%%"#""""
- at 30BB2AAXX080903:3:38:1233:1273#0
-CCCAAACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGATCAGACTC
-+
-67777788888888888888888877776555443222100//..-,-,,,++***)*))))(((('$&%$%#$$%
- at 30BB2AAXX080903:3:47:807:461#0
-ACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAAGATCGC
-+
-67777788888888888888888877776555443221100//...--,,+++***)*)*))(((('%"#$$####
- at 30BB2AAXX080903:3:54:1236:264#0
-TAGTGTTCTGGCGAGCAGTTTTGTTGATTTAACTGTTGAGGTTTAGGGCTAAGCAAGATCGGAAGAGCGCGCTCTG
-+
-67777788888888888888888877776555343222100//..---,,++++**))))))(('((%&#%&"#"#
- at 30BB2AAXX080903:3:49:402:2042#0
-TATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAAAA
-+
-67777788888888888888888877776555443222120//.----,,,++***))))))(((''&"$##"""#
- at 30BB2AAXX080903:3:51:944:61#0
-ATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTGACGACTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%%$%""""#
- at 30BB2AAXX080903:3:2:149:210#0
-GCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAACANCAANNCC
-+
-6777778888888888848888887727652+142212100/--.--,-++++()*)*)('(((((&"""%$""#"
- at 30BB2AAXX080903:3:46:1047:873#0
-AGTTAAATCAACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTCCACACA
-+
-67777788888888888888888877776555443222100/..----,,+*++**))))(((((((&""$"###"
- at 30BB2AAXX080903:3:4:1731:1955#0
-AGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCCTCTAGAGGGATATGAATCACCGCNAGTCNCN
-+
-67727788888888888888888877776/5544322001/0..,&-+,,*+++*))())((((((&"""$#$"#"
- at 30BB2AAXX080903:3:51:206:1852#0
-GAGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCCTCTAGAGGGATATGAAGCACCAGATCTCGC
-+
-67777788888888888888888877776555443222020/..-.-,,,+++**))))*)()'('%""""$#"##
- at 30BB2AAXX080903:3:56:1580:124#0
-CTGGCGGTGCTTCATATCCCTCTAGAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACACACAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+)+***)))))((('''$$%$$"##$
- at 30BB2AAXX080903:3:1:1765:118#0
-GCTGAGCAAGAGGTGGTGAGGTTGATCGGGGTTTATCGATTACAGAACAGGCTCATCTAGAGGGAAGCNCANTCAC
-+
-6777778888888+8808888,8877/.655.3432$2000/).---+,++$)'#'&'(''((('#'$"$"""###
- at 30BB2AAXX080903:3:59:53:1534#0
-TCTAGAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCCGTNNC
-+
-6777778888888888888888887777645054322120/...-.,,-,,+++*')))('')'(('&%##""""#
- at 30BB2AAXX080903:3:43:1086:1132#0
-GAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCCTCTTCG
-+
-6777778888888888888888887777655544322.100/....--,+++++****)*)))(((&&$"%"%$$#
- at 30BB2AAXX080903:3:37:1469:797#0
-GCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGTGGTGAGGGTGATCAGATCGGAAGAGCGGGTCACGCGCTTAN
-+
-67272288883888+88828888173772.4+42#22#0&/.#.-+"')+*%%()'()((#((####$"$##"##"
- at 30BB2AAXX080903:3:55:892:1594#0
-GTTTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGGGGGGGGGGTGATCGGGGGTTATTAGATCGGTGTGACA
-+
-67777788888888888888888877776555843222)00./*.-(-,&+'+***)*)')'((('#'#"%$$%##
- at 30BB2AAXX080903:3:60:1460:650#0
-TGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTACAACAACNN
-+
-67777788888888888888888877776555443222100//..----,++++**)*))((((((&$$%%&$%""
- at 30BB2AAXX080903:3:48:1373:72#0
-TCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGTGGGGAGGGTGATCGGGGGTTATCGGTCGTAGC
-+
-67777788888888888888888877776555443220100//(.-+-+-+*+**''))*)(&((&%%""#"""#"
- at 30BB2AAXX080903:3:54:1169:1364#0
-ATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGANGCGCAC
-+
-67777788888888888888888877776555443212100//.,-.,,,,+++****)))((((('$%""""###
- at 30BB2AAXX080903:3:51:1413:994#0
-TGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGGAAGAGGGGGGGGGGGGGGTGCGCGCGCT
-+
-6777778888888888888888887777655544+222100/...,-*+,,++***)(*()((%(%'$"$$$###"
- at 30BB2AAXX080903:3:42:1648:565#0
-TTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGGAAACAGGCTCGGCCAGAGGGGGGGGGGGTGAGGTGGTGAC
-+
-67777788,88088888888888877476575443(1,+#-+/(,$+,'%++)**#**#)(')'#'%%$""#""#"
- at 30BB2AAXX080903:3:40:872:1157#0
-TTACTTTGTAGCCTTCATCAGGGTGTGCTGAAGATGGCGGTATATAGGCTGAGCAAGAGGGGGGGGGGGTGATGTG
-+
-677777888888888888888880-777655544322110&/..,.--**+**)))()))'))((%'%&$&"""""
- at 30BB2AAXX080903:3:8:961:542#0
-CGATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTANCACCACNN
-+
-67777788888888888888888877776555443202100//./---,,,,+***)**))()((('"%$#$"$""
- at 30BB2AAXX080903:3:33:418:778#0
-CTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGGAAGAGGGGGGGGNGCGACANN
-+
-67777788888888888888888877776555443222100....---,(++'*(&))()*'(((&'"#$"##"""
- at 30BB2AAXX080903:3:56:1622:711#0
-GATCAACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACACAAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$"%&#&$%$
- at 30BB2AAXX080903:3:58:613:782#0
-AACCTCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAATACCAC
-+
-67777788888888888888888877776551440222000//..--,,,,+++***))(())((('$&"#"%###
- at 30BB2AAXX080903:3:36:875:755#0
-TCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCTGATCACN
-+
-677777888888888888888888777765554432221000/..---,,++++**))))))(((('$$"""$##"
- at 30BB2AAXX080903:3:46:1110:830#0
-TCACCACCTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCAGGCCTCA
-+
-67777788888888888888888877776555443222100//.--,--,+++****)))()('(('""%#"#"##
- at 30BB2AAXX080903:3:59:1560:376#0
-TGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTGAGCACCAAANNA
-+
-677747888888888888888888777765554432-2100//..---,,+++(*)**)))'(('('$$&%%$""$
- at 30BB2AAXX080903:3:35:547:101#0
-CTCTTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGCAAGCGCAAGANACACACNN
-+
-67077788888888888888888877775-5504321-/00/+...&-)++'+***#)))'((&((#"$$&%%"""
- at 30BB2AAXX080903:3:57:1341:765#0
-TACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGAGATCGGAAGAGCGGGTCAGTCACCA
-+
-6777778888288888888838887'7765.543(,3210+//.--,-,,++++%**)))((')(%'%$%"$###"
- at 30BB2AAXX080903:3:36:1465:756#0
-TTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGCGGTATATAGGCTTNGCACNN
-+
-67777788888888888888888877776555443222100//..----,+++***)*'))()((''%$""$#"""
- at 30BB2AAXX080903:3:59:1045:671#0
-TTGCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGCAGCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(((''%&%$$"#$
- at 30BB2AAXX080903:3:46:846:878#0
-GCTCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCAGCGTCCCGA
-+
-6777778888888888885888887677656544322010///..---,,++****)))()%(('('""""$"#""
- at 30BB2AAXX080903:3:59:991:1214#0
-TCAGCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGCAAACGCAA
-+
-677777888888888888888888777765554432221001/..--,,,+++)*)))))))(((('"#%##"###
- at 30BB2AAXX080903:3:42:835:1439#0
-TAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATCGGAAGACTCGNCNA
-+
-67777788888888888888888877776555443222000./.-.--,,+++***)*))*())((&'$"$""$"#
- at 30BB2AAXX080903:3:38:1473:1954#0
-GCCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTACACATGTCGC
-+
-67777788888888888888888877744550443222/0/1.,..*,,,,,+***#)(((''(''#%"""""#"%
- at 30BB2AAXX080903:3:49:1290:1989#0
-CCTATATACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACACTATA
-+
-6777778888888888888888887776655544322.10.//...--,,+*+****&&()()'(('$%$"""#""
- at 30BB2AAXX080903:3:33:1692:875#0
-CTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGANTAGCGTNN
-+
-677777888888888888888888077765554432121000/....,,-,+***+(*))()('(('""##"#"""
- at 30BB2AAXX080903:3:44:1268:1429#0
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGACACCA
-+
-67777788888888888888888877776555443222100//-.---,,+,++**)))))()(''''$#"%####
- at 30BB2AAXX080903:3:45:421:1459#0
-TACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTTTGCTGAAGATGGC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('''$"$&"#%#"
- at 30BB2AAXX080903:3:3:796:1149#0
-ATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGCNTCGTNCG
-+
-6477778888888888888888+8777165504432120/,//-%,-*,,++)***)())()(((&'""$"%#"#"
- at 30BB2AAXX080903:3:56:485:755#0
-ATGGGCTACACCTTGACCTAACGTATTTACGTGGGTACTGGCGCTTACTTTGTAGCCTGCATCAGGGAGNTGTACT
-+
-67777788888888888888888'$77765554432221/1//...--,,++***+*)))()(((('&$""##"#"
- at 30BB2AAXX080903:3:59:847:1238#0
-ATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCCTTCATCAGGGTAGACACAG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('''&$&##"##"
- at 30BB2AAXX080903:3:60:1576:1973#0
-ACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGTAGCGTTCCACAACNCANN
-+
-677777888888808888888)887777655544122210)//..-+-'+++(***))))''((#(&$$%%"$%""
- at 30BB2AAXX080903:3:53:928:1277#0
-ACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATCGCTCGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('&&"&&%%$#
- at 30BB2AAXX080903:3:50:1548:125#0
-CCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGACGCTAGTC
-+
-677777888883888888888888777765554432221/0//...--,,-++***()))))(((('"$"&$"""#
- at 30BB2AAXX080903:3:51:765:1020#0
-CCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGCGGCAGTAC
-+
-67777788888888888888888877776555443221100//...--,,++++**&))))))(('("###"#"#"
- at 30BB2AAXX080903:3:49:69:1967#0
-CTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAATACTCATC
-+
-67777788888888888888888877776545443222100//.----,,+,+**&)**)'''((''""##"$""#
- at 30BB2AAXX080903:3:53:1046:1880#0
-ATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGATCGGAAGAGTGGCACATC
-+
-67777788888888888888888877776555443222110//..--,,,+++***)*)()()(('("#$#""#""
- at 30BB2AAXX080903:3:1:984:237#0
-TGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGCNCANATAC
-+
-67777788888888888888888877774555343222000//./,,-+,,)+****(())()((''%"$""#"##
- at 30BB2AAXX080903:3:42:1278:1283#0
-GAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGCAATG
-+
-67777788888888888888888877776555443222100//..,--,,++++*))))))((('('&""&"%""#
- at 30BB2AAXX080903:3:53:1365:115#0
-AAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCCAGAAATAG
-+
-67777788888888888888888877776555443222100//-..--,,+++*****))))(&((#$$"$$&###
- at 30BB2AAXX080903:3:34:414:1153#0
-GTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACCTGCGCTNTTCCACNN
-+
-6777778888888888888888887777652511-220100+/-.,,,-,+*+****))#'(('(''"%""$"#""
- at 30BB2AAXX080903:3:47:607:801#0
-TGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGTGGGTACTTGCGCTTACTTTGT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))))((''"&&&$$$$#
- at 30BB2AAXX080903:3:38:1084:1081#0
-AAGCGCAAGTACCCACGTAAAGACGTTAGGTCAAGGTGGAGCCCATGAGGTGGGAAGAAATGGGCTACATTTCATC
-+
-677777888888888888888888777765.0-432%2&00-/.,-,--,)++'(**)*)()((#&'&&&%%%%$$
- at 30BB2AAXX080903:3:59:446:1094#0
-GGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTAGATCGGAAGCACCTC
-+
-67777788888888888888888877776555443222100//..----,++****))*)))(((('&$%#"##"%
- at 30BB2AAXX080903:3:4:372:321#0
-CTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGTCTTTACGANGTGTNTN
-+
-+777778888888888880818885745665.51320210/0/.--+--++,*&*))))('((((&'&""%##"#"
- at 30BB2AAXX080903:3:44:978:1048#0
-ACGTAAAGACGTTAGGTCAAGGTGGAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGACAACTCG
-+
-67717788888888888.8888*8#77565454332/211///.-.",--*)+))*)))(((('(''%""%"#"""
- at 30BB2AAXX080903:3:50:496:1225#0
-ATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGACCTAACGCCTCTC
-+
-67777788,888888888888888779766/54422%.*0////..,,,,,+*())*()((((''%'"$%#%"#"#
- at 30BB2AAXX080903:3:52:566:1534#0
-AGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACACCTTGNNCTAACG
-+
-67777788888888888888888877776555443222100//..--,,,+++****)**)((((('$"""$#%$$
- at 30BB2AAXX080903:3:4:457:1215#0
-CATAAGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCCACCTCATGGGCTACAGNTCGCNAN
-+
-(74777888888888888*88738777365203422,01./../-,+'+,+)*'''((%(((&'('&"""#"#"#"
- at 30BB2AAXX080903:3:1:744:243#0
-CTTCGACCCTTAAGTTTCATAAGGGCTATCGTAGTTTTCTGGGGTAGAAAATGTAGCCCATTTCTTGCNACNCTAT
-+
-67777788088888888888888877776'53441222/00//.,.-,-,+,+***))())))'((''"#""%"##
- at 30BB2AAXX080903:3:45:1424:717#0
-TGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGAAAACTACGATAGCCCTTATGAAACTAGATCGGAAGCGC
-+
-67777788888888888888888877776555443222100//..---,,+*+***))))))))(''&&#""$##"
- at 30BB2AAXX080903:3:49:1632:1032#0
-TGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGAAAACTACGATAGCACTTATGAAACTTAAGAGAGGAACA
-+
-67777-88888888888882888877776555443222100./..--,,,+&****))))))(((('$""""""##
- at 30BB2AAXX080903:3:45:1285:807#0
-CCAGAAAACTACGATAGCCCTTATGAAACTTAAGGGCCGAAGGAGGATTTAGCAGTAAACTGAGAGTAGGGGCACC
-+
-67777788888888888882868877716.5+2432#/10&0/#.,,-++*,++*&)*('((&('(%$"""##"##
- at 30BB2AAXX080903:3:33:1664:2001#0
-AACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGNACCACANN
-+
-6777778888888888888888887877651143/22'10.//.--&,,+++*'*)()')#'('(#'""##"#$""
- at 30BB2AAXX080903:3:49:342:276#0
-CCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGTCCACTGA
-+
-67777788888888888888888877776555443222100//..---,,++++****)))))(((('"#%"""""
- at 30BB2AAXX080903:3:50:686:146#0
-TGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCAGTAGCGA
-+
-67777788888888888888/88877776555443222100//-.-.-,,++++**))))))(((''%"""#""""
- at 30BB2AAXX080903:3:34:634:1566#0
-TGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCTTCGNCACACANN
-+
-6777078888888888888888887777655541312100//...,,-,,,+++*)*)'))((((''"$$#$$#""
- at 30BB2AAXX080903:3:50:1234:1643#0
-TGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCTTCGACTCGAC
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))))(((('&"#$"""""
- at 30BB2AAXX080903:3:58:1493:2014#0
-GTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTAATGCTAAATCAACCTCACACCACN
-+
-6770778888888888888888887/77655544*2000.1-/..-.-+-++%**)**)(((%((%%&$#%&$%$"
- at 30BB2AAXX080903:3:45:1080:1101#0
-AGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACCCC
-+
-67777788888.888888888888777765554432221.0//..---,,++++)*)))()(((((''#"$"$"#$
- at 30BB2AAXX080903:3:46:1298:1235#0
-AGGGTCGAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCTCACACGTG
-+
-67777788888888888888888877776555442222100./.----,-+*++**()())(((((&"$"$"#"#"
- at 30BB2AAXX080903:3:54:290:1649#0
-GCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCCACCGTCGCCC
-+
-67777788888888888888888877776555443222100//.-----,+,++*)*)**)((((('%%#&&%##%
- at 30BB2AAXX080903:3:46:1499:1748#0
-GTCGAAGGGGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACATCCCGCC
-+
-6/777788-88888888888888877776555443212100//-.---,,+++)****)))()((''"##%#"$##
- at 30BB2AAXX080903:3:3:345:1498#0
-CGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGATCGGAAGAGCGGTNTCGTNCC
-+
-677777888888888888583)85414325/5313201*/.*.,-,+,+,+*)))%(((&#'%'&''%""""""##
- at 30BB2AAXX080903:3:54:1504:101#0
-GAAGGTGGATTTAGCAGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGAGATCGGCACAACGCA
-+
-67777288888888888888888877776555423322100//./---,,+,***)**)*()(''('$$%%"#"$#
- at 30BB2AAXX080903:3:46:324:1756#0
-TGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCTAAATCTCCCT
-+
-677777888888888888888888/77760554/3222000./--,--,-+,*+*))())(()(((&%""#"$###
- at 30BB2AAXX080903:3:35:1436:455#0
-GGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTACTGCNAACACCAN
-+
-677777888888888888888888777765654433210000...--,+,,++****))(()('(''"""#"$#""
- at 30BB2AAXX080903:3:1:1412:876#0
-GAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCAGTTTNTGNCCAC
-+
-677777888888888888088888771765551431./1/0-.,,.,,,++)+'()(((('(&'(&%&""""####
- at 30BB2AAXX080903:3:34:548:1928#0
-CTTGAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGGGCCCTGTTCAACTAAGCACTCTACTCTCANCCACATNN
-+
-67777788888888888888888877776543442.0110/-..,-,+,*+**+)*)*))((('('%"$#"$##""
- at 30BB2AAXX080903:3:48:466:1620#0
-AGTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCGCACATA
-+
-67777788848888888808888877774/(1480/./20.+/-.--++,+++')*%#))(('(&''$&"#$$##"
- at 30BB2AAXX080903:3:55:177:980#0
-GTAAACTGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCGCAGATGAG
-+
-677777888888888888888888777765.54432221.0/-.,-,,,,,,+**))))')(('(%'"$#%""$#"
- at 30BB2AAXX080903:3:50:396:1776#0
-TGAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAGTCTACTTCA
-+
-67777788888888888888888877776555443212001//..-.-,,+++***))))))))(('"""$$"###
- at 30BB2AAXX080903:3:53:837:1500#0
-AGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAAGATCGGAAGCGCATCC
-+
-6777778888888888888888887777655444322211//0..----,-,+***)*()))((((%"$$$##"$"
- at 30BB2AAXX080903:3:58:222:99#0
-AGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCCAGAGATCGGAAGANCTCNNC
-+
-67777788888888888888888877776555443222100//.,-,-,,+++**&)*(*')()(&'$&"""#""#
- at 30BB2AAXX080903:3:46:691:1001#0
-CTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCCTCAAGTATAGATCGGAAGCACGTACAN
-+
-6777778888888888888888887773655544322020./...,--,-,+****))*))((((((%"""""#""
- at 30BB2AAXX080903:3:57:1223:1306#0
-TAGGGGTTTTAGTTAAATGTCCTTTGAAGTATACTTGAGGAGGGTGACGGGCGGTGTGTACGCGCTTCAGTGNACA
-+
-67777788888888888888388877776555443222101//.+---,,+*+****)))())(#(''$%$$""##
- at 30BB2AAXX080903:3:46:707:40#0
-AATGCGTAGGGGTTTTAGTTAAATGTCCTTTGAAGTATACTTGAGGAGGGTGACGGGCGGTAGATCGGTACAGCGG
-+
-67777788888888888888888877776555343222100//..---,,++++**))))'((((''&""#""##"
- at 30BB2AAXX080903:3:38:429:109#0
-ATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAGATCGGACGATGATNN
-+
-67777788888888888888888877776555443222+00/...---,,,+++***))))))('('&'&"$"#""
- at 30BB2AAXX080903:3:51:1222:1936#0
-ACTTTCCAGTACACTTACTATGTTACGACTTGTCTCCTCTATATAAATGCGTAGGGGAGATCGGAAGAGGCGTACA
-+
-67777788888888888888888877776555443112000//.----,,++++**)*))('((#((&"$##""""
- at 30BB2AAXX080903:3:57:680:480#0
-GGACATTTAACTAAAACCCATACGCATTTATATAGAGGAGACAAGTCGTAACATCGTAACAGTACTGGTACTCAGC
-+
-6777778888888888-88$18187777*555443'/..00-/-.'--',,&+*'()')')('((%%$"%""##"$
- at 30BB2AAXX080903:3:47:488:36#0
-CCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCGTAGGGGTTCTCACGCGT
-+
-67777788888888888888888877776555443122100//./..-+,++)***)*))(((('''$&%"%"#""
- at 30BB2AAXX080903:3:50:1416:585#0
-ACTAAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGAGATCGGGCAC
-+
-677777888888888888888888777765554432221/0//..--,,,+*++**))))))(('('$"#"#""##
- at 30BB2AAXX080903:3:58:1403:824#0
-AAAACCCCTACGCATTTATATAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGAAACACA
-+
-67777788888888888888888877776555443222110//..---,,,++****)))'()((('$&&""####
- at 30BB2AAXX080903:3:34:866:397#0
-GGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCGTNTGCTCTNN
-+
-67777788888888888888888877776555443222100//...----+,+**)*))((()((('"%%###"""
- at 30BB2AAXX080903:3:46:1210:1439#0
-CTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCAGATCGGAAGAGTCGCCA
-+
-67777788888888888888888877776555443222100//./---,,+,+***)**)))((''(""""$###"
- at 30BB2AAXX080903:3:58:122:359#0
-CACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAAATGCTTNNC
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))()((('%'&#""""$
- at 30BB2AAXX080903:3:46:875:1956#0
-GCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATAGATGCG
-+
-67777788888888888888888877776542443212000/-(..----*++*****()'()'(''"%%""#$#$
- at 30BB2AAXX080903:3:54:644:898#0
-GCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATCTATAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('&%"%%$$#"
- at 30BB2AAXX080903:3:43:445:1400#0
-AGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCAGATCGGCAGGGGG
-+
-67777788888888888888888877776555443222100./..---,,+*+*+**))())()(('%&"##""""
- at 30BB2AAXX080903:3:59:628:253#0
-AGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTATATATGCNC
-+
-677777888888888888888888777765554/3.22100/...-,,,,,++***)))(((('(&'&$&%#"#"$
- at 30BB2AAXX080903:3:4:230:1909#0
-AAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTGTCTCCTCTANCTACNCN
-+
-677777888888888888288688-777655544322.100/..---,-++,***+))))())('''""%#&%"""
- at 30BB2AAXX080903:3:60:414:1167#0
-TGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGAGATCGGACGCNACNN
-+
-6777778888888888888888887775655542322210//....-,,,,,+***))*)))((((&%$%#""%""
- at 30BB2AAXX080903:3:37:1104:1803#0
-TAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTATCTTAACACACN
-+
-67777788888888888888888877776535443222100/../---,,,++**)*)))'()(&(("%%&%%%#"
- at 30BB2AAXX080903:3:38:1735:1918#0
-CTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTTACCATGTTACGACTTAGATAGCNN
-+
-677777888888888888888888777765554/35211000...,,,,,++*(*))*)))'(((('""%%"""""
- at 30BB2AAXX080903:3:38:1686:73#0
-CAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAACAACCAANN
-+
-67777788888888888888888877773552443221100//..--,--,*+)+*))#()))((''%"$$$##""
- at 30BB2AAXX080903:3:38:495:50#0
-CAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAATGCCCCANN
-+
-6777+78888888888888888887777655044323110/-/..-,,,-+*+**+'))()((((('""""#$"""
- at 30BB2AAXX080903:3:55:1539:172#0
-AACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACACACCTGA
-+
-67777788888888888888888877776555443222100//..---,,++++**))*))(('((&$$&"##""#
- at 30BB2AAXX080903:3:49:546:1848#0
-TAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACTCCCCATGT
-+
-67777788888888888888888877776555443222100/....-,,,++++*+)))))))('('%$""$"#"$
- at 30BB2AAXX080903:3:56:1431:57#0
-CTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCAGTACACACACACAC
-+
-67777788888888888888888877776555443222100./..---,,,+++**)*)))((((''&$"&%###"
- at 30BB2AAXX080903:3:8:455:644#0
-AAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCNGCGACGNN
-+
-67777788888888888888888877776555443221100//..---),,++*)***))()('(('""%#"##""
- at 30BB2AAXX080903:3:43:789:1457#0
-GAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACTTTCCACTGTGT
-+
-67777788888888888888888877776555443222000//...--,+++++*))))()((((('$&&$"""""
- at 30BB2AAXX080903:3:55:640:712#0
-GTTGAAATCTCCTAAGGGTAAGTTGGGCGCTTTGTGTTAAGCTACACTCTGGTTCGTCCAAGTGCACNGACCGCTC
-+
-677777888888888888888888377-655944322/1/00*..---,-++++*+)#*()('(''&"$$"&"#"#
- at 30BB2AAXX080903:3:57:20:889#0
-ACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATCTCAACT
-+
-67777788888888888888878877776555443220100/-.----,,++*****&((&)(((''"&#"#"###
- at 30BB2AAXX080903:3:49:1243:1534#0
-TGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATCTCCACTTA
-+
-677777888888888888888888777765550432201/0//..--,,,+,++*+**)))((('('"##"$##"#
- at 30BB2AAXX080903:3:39:1496:1635#0
-GGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTTCGTCCCTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))(((((&&&%&&#%$#
- at 30BB2AAXX080903:3:59:160:1954#0
-CGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTCTGGTAGAGCGTANNC
-+
-67777788888888888888/888777765-54432121(/*...-,-,-+*+)*)()(#''((''''$%%#""""
- at 30BB2AAXX080903:3:2:1154:161#0
-ACTTGGACGAACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACNAGCAACA
-+
-6777778888888888888/88487775655544/2/,/0/-/.-(-+,,-++)**)))%()#('&'$"#$""##"
- at 30BB2AAXX080903:3:38:1623:1208#0
-CAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAAGCTACACTAGCGCGTTGCN
-+
-6777778808888088888888887777655441322-10///.,--,,,+*+***&)(*)')'#''&##%"""#"
- at 30BB2AAXX080903:3:36:14:30#0
-ACCAGAGTGTAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTNCACAGCGN
-+
-6777778-8888888888888888777765/244211100//0..--,,-++)+**))())((''''"$"#""#""
- at 30BB2AAXX080903:3:57:57:1285#0
-CTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTATGCCACCA
-+
-6777778888888888888848817777355544322/101/./.---,++*+***')('()(((('"%%#""###
- at 30BB2AAXX080903:3:36:892:715#0
-TGTAGCTTAACACAAAGCACCCAACTTGCACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAGCTCTCAN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('"#""$"%$"
- at 30BB2AAXX080903:3:46:1232:98#0
-TAGCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACCATGCCA
-+
-67777788888888888888888877776555443222100//..---,,-++****)))))(((((""%#""###
- at 30BB2AAXX080903:3:42:353:1645#0
-TGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGTGTTAGTC
-+
-677777888888888)8888/8(87771+505,)32220/0/-.-+---,+++(**&)))))(%(''&&%#$""""
- at 30BB2AAXX080903:3:39:656:1874#0
-GGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAGTGTAAGTTGGGTGCTTTGCGCT
-+
-67777788888888888888888877776553143221100/..----+,,+****))))())((''&&%%%%%$#
- at 30BB2AAXX080903:3:52:973:575#0
-GGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAAAGATCAGAATCGGCGGA
-+
-67777788888888888888888877754515443021/0,/+...--,,++'+)**)()))((&('$""""#"#"
- at 30BB2AAXX080903:3:8:869:1218#0
-AGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTAANGAGCCANN
-+
-6777778088888888488888887677155344322210///-,---,-+++****)))))(((''""""###""
- at 30BB2AAXX080903:3:1:120:1492#0
-TAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTCCTACNTCNAACA
-+
-67777788888888888888888877776355443220110///--,,,,,+**+)*)))('(((('""#%""#""
- at 30BB2AAXX080903:3:42:1218:1148#0
-TCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTACTAAGTG
-+
-67777788888888888888888877776555443222100//..---,-+++*+***)))((('('&"%%&"%$$
- at 30BB2AAXX080903:3:55:356:374#0
-GGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGANCTCTACN
-+
-67777788888888888888838877776555443232100//..--,,,+,+***)*)()((((('$"###"#""
- at 30BB2AAXX080903:3:42:1225:276#0
-AAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCAAGTTAAGTTGAAATCTC
-+
-67777788888888888888888878776655443222100./.----,-+,++**)))))'((((#&&""%%%##
- at 30BB2AAXX080903:3:56:1410:831#0
-TAAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTAGATCGGAAGCGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('('$"#%#"##"
- at 30BB2AAXX080903:3:47:57:1929#0
-GGTTTGGCTAAGGTTGTCTGGTAGTAAGGTGGAGTGGGTTTGGGGCTAGGTTTAGCTCAGAGCGGTCACCTGTAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()('('&#"""""#"
- at 30BB2AAXX080903:3:42:482:765#0
-TTAACTTGACCGCTCTGAGCTAAACCTAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGATCGGCATA
-+
-677777888888888888888888.7776555453221100/.....++,,,++**)))())('(''%%&%%"#"#
- at 30BB2AAXX080903:3:35:510:632#0
-ATCGCCTATACTTTATTTGGGTAAATGGTTTGGCTAAGGTTGTCTGGTAGTAAGGGGGGGTGGGGTTNGCGTATCN
-+
-677777888888888888888888777765554432221&0//.---*+,*++**())()'(((%('"$"""###"
- at 30BB2AAXX080903:3:4:1655:1851#0
-AACCATTTACCCAAATAAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAANCTCANCN
-+
-67777788888888888888188877775555,432121./1/-,--,+,++*****)*)'((((''""##%#"#"
- at 30BB2AAXX080903:3:45:481:1555#0
-TCATCTTTCCCTTGCGGTACTATATCTATTGCGCCAGGTTTCAATTTCTATCGCCTATACTTTATTTGGGGTTTTC
-+
-637777888888888888838888777765514/3.22&00.'----*,,+*+))))*)((((((('%&""$"#""
- at 30BB2AAXX080903:3:42:482:517#0
-TTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAGAGAG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))(('&'&%&&##"#
- at 30BB2AAXX080903:3:1:408:1140#0
-AACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAANAANTTAT
-+
-677777888888888888888888777765554232221/0/../---,,+,++**))))))))'''%"##"""""
- at 30BB2AAXX080903:3:38:202:192#0
-TCATTATGCAGAAGGTATAGGGGTTAGTCCTTGCTATATTATGCTTGGTTATAATTTTTCATCTTTCTCTTACANN
-+
-67777788888888888888888877776255443222101//..---,,,++***)))))(((('&$&%%"#$""
- at 30BB2AAXX080903:3:50:1068:1354#0
-GCAAGGGAAAGATGAAAAATTATAACCAAGCCTAATATAGCAAGGACTAACCCCTAAGATCGGAAGACTGTCACCT
-+
-6777778888888888888888887777655%443222101//..---,,+++****))))((((('""$"$"$#"
- at 30BB2AAXX080903:3:48:1113:258#0
-AAGGGAAAGATGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAACAACTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''&$""""$"#
- at 30BB2AAXX080903:3:35:1614:462#0
-GTCTGGTTTCGGGGGTCTTAGCTTTGGCTCTCCTTGCAAAGTTATTTCTAGTTAATTCATTATGCAGNCTGACACN
-+
-60777788888888888888888877776555413221/10./..--,-,++++*+))*())))(''"$#$$%$#"
- at 30BB2AAXX080903:3:48:210:598#0
-TATACCTTCTGCATAATGAATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGATACCAGACG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))'(('&%%$"&%$""
- at 30BB2AAXX080903:3:33:601:411#0
-CTACATAGACGGGGGTGCTCTTTTAGCTGTTCTTAGGGAGCTTGTCTGGTGTTGGGGGGCTTTTGTANCCGCATNN
-+
-6777778888888281888888887711642$14+22*,0&#%/,)+,,&$)%'***)&&)####&#"$#"%""""
- at 30BB2AAXX080903:3:34:239:138#0
-TTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGTCTGGTTTCGGGGGTCTTAGNTCACACNN
-+
-67777788888888888888,8887777655544322210,//..--,--+++*+*)))))&'((%'""$$%$#""
- at 30BB2AAXX080903:3:3:610:1261#0
-GCCAAAGCTAAGACCCCCGAAACCAGACGAGCTACCTAAGAACAGCTAAAAGAGCACACCCGAGATCGNAGCTNCA
-+
-677777888888888888888887777+655.-431122000..-.,,,,++****)*)(()(((#'"""""$"##
- at 30BB2AAXX080903:3:37:1417:1349#0
-CCGAAACCAGACGAGCTACCTAAGAACAGCTAAAAGAGCACACCCGTCTAGATCGGAAGAGCGGTTCAGGCCTACN
-+
-67777788888888888888888877776555443222100//..-.-,,+++***))))))((#'%$%%%$%$#"
- at 30BB2AAXX080903:3:50:378:403#0
-ACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGCCTGGCC
-+
-67777788888888888888888877776555443222/0///..---,,+++*****)))(()(('&$$#"""##
- at 30BB2AAXX080903:3:39:438:1749#0
-TACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTAGGTAGCTCGTCGAGT
-+
-677777888888888888888888777765554430221.0//&.&--,,)+(*+*)'*)%)((((#"%"""#"""
- at 30BB2AAXX080903:3:59:141:1526#0
-TTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGTGTGCTCTTTTAGCTGTTCTTCACNNT
-+
-67777788888888888888888877776555443222100//.-.--,$+++&**))*)''#((&(%&&%$%"""
- at 30BB2AAXX080903:3:45:1534:1966#0
-CCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGGGTGCTCTTTTG
-+
-6777778888888888888,8888774,65452432.210///-.,--,,,'+****)*)(()(&(''$"$##$$#
- at 30BB2AAXX080903:3:50:611:1662#0
-TCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTACATAGACGGGATACGCTCT
-+
-67777788888888888888888877776555433222100//..----,+++****))))((('('"""#"#"##
- at 30BB2AAXX080903:3:51:673:1231#0
-GGACAACCAGCTATCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATTTTGCTCTCTGGC
-+
-67777788888888888888888877776555443222100//...---,+++**))))))(((''(%$#"#"#$#
- at 30BB2AAXX080903:3:1:556:1316#0
-CTTGGACAACCAGCTATCACCAGGCTCGGTAGGTTTGTCGCCTCTACCTATAAATCTTCCCACTATATNTCNCACC
-+
-67777788888888888888888877776/55413222000//.-,-,,,+++**))))()()('('%"&%"%##"
- at 30BB2AAXX080903:3:57:1609:1690#0
-TAGTGGGAAGATTTATAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGAACACACCAAA
-+
-67777788888888888888888877776555443221100/...---,,++*****)))())('%&$$%$$#%##
- at 30BB2AAXX080903:3:53:832:373#0
-AAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCAGGCGCGGCAGGGTGGTCGACGCTGCCCAAGATC
-+
-6777778888888888888888/87777655044322110///.--,',,+,+)(()))()')('&'%$%"&$##"
- at 30BB2AAXX080903:3:37:501:1818#0
-ATAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTTAGTTCACCTANCTGN
-+
-67777788888888888888888877776555443222100/....--,,++++**))))))((('(&$%&"#%#"
- at 30BB2AAXX080903:3:53:1186:212#0
-TGTGGGCAAATTTAAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCAGGCTCGGTAGGATTGTCGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('""%%$$""#
- at 30BB2AAXX080903:3:44:894:1343#0
-GACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTTAGTTCAACAGATCGGAAGAGCGGCGCG
-+
-67777788888888888888888877776555443202100//..---,-+++*++**))('(((('&%#$$##""
- at 30BB2AAXX080903:3:58:858:844#0
-GGATTTAGAGGGTTCTGTGGGCAAATTTAAAGTTGAACTAAGATTCTATCTTGGACAACCAGCTATCACCACACGA
-+
-67777788888888888888888877776555443222100//..---,,+,+**+**)())((((''&&#%##"#
- at 30BB2AAXX080903:3:59:158:248#0
-GCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAGTCCAGATCGGAAGAGCGGTTCAGCAGGTCCNNA
-+
-67772788888888888888888877776555443222100//..---,,+++***)*)))'(''('&%%"#%"""
- at 30BB2AAXX080903:3:39:1582:505#0
-TTTAACTGTTAGTCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAACATTTACC
-+
-6777778888888888888888887777655534332210///----,,,,,+***)*))))((((#'$%&##$##
- at 30BB2AAXX080903:3:53:50:1468#0
-AGAGGAACTGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATTTAACACCCATAGTAGTGTCTC
-+
-67777788488888888888888877776555423220100//..---,,,++*++)**))((((('""$"#"##"
- at 30BB2AAXX080903:3:46:241:1775#0
-TAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTAAATTGGTTACT
-+
-6177778888888888888888/877776555443222100-0..-+-,(++*)*)))*)()()&('"#$#$$"##
- at 30BB2AAXX080903:3:47:837:682#0
-TAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTAAGATCGGCGCG
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)))))(((((($$"%"####
- at 30BB2AAXX080903:3:58:1081:970#0
-AGGTAGTGGGTGTTGAGCTTGAACGCTTTCTTAATTGGTGGCTGCTTTTAGGCCTACTATGGGTGTTATGTACCTC
-+
-67777788888888888888888877776555443222100//...-,,,++#++))*)))((&'%(&%$$$"$#%
- at 30BB2AAXX080903:3:33:1614:1576#0
-ACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCAGATCGGAANCAGTCANN
-+
-677777888888888888888888777765552432221000/--.-,,,+,+****()*()((('("%"""$#""
- at 30BB2AAXX080903:3:8:1599:447#0
-CCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACTACCTAAGATNCACACANN
-+
-677777888888888888888888777765554432221/00/...-,,,+++***)*))))))(('"%%$$$$""
- at 30BB2AAXX080903:3:34:1421:377#0
-CATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACAGATCGGAAGANCTCCACNN
-+
-67777788888888888888888877776555443222000//..---,,+++*****))))(((('"'#"##%""
- at 30BB2AAXX080903:3:55:986:1797#0
-AGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACTACCTAAAAAATCACAGACACAC
-+
-67777788888888888888888877776555443222100//..---,,,++**+))))))()'(#'&"&%%$$%
- at 30BB2AAXX080903:3:57:574:166#0
-ATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGATTTTTTAGGTAGTGGGTGTTGAGAGATCGGAAGGGGTCGAGT
-+
-67777738/83888888888888877776555443222101//.,-,-,,,+****))))((()(('$"%"#""""
- at 30BB2AAXX080903:3:59:436:1062#0
-TTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGATTTTTTAGGTAGTGGGTGTTGAGCTTGACCACNA
-+
-67777788888888888888888877476555443222100//..---,,+,+***)))))())'(''&$"#"#""
- at 30BB2AAXX080903:3:35:1085:1659#0
-ATAGGGTGATAGATTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTTTGGGAGATCGGAAGAGGNGGCTCTCN
-+
-67777788888888888888888877776552442222100//..---,,+++***)*(*)((('(&"$#%$#"#"
- at 30BB2AAXX080903:3:50:14:1059#0
-AAAAAATCCCAAACATATAACTGAACCCCTCACACCCAATTGGACCAATCTATCACCCTATAGAAGANATCACGTC
-+
-67777788888888888888888877776555443222100//...--,-+++****)))))))(('"""$"$##"
- at 30BB2AAXX080903:3:34:730:1226#0
-ACTAACATTAGTTCTTCTATAGGGTGATAGATTGGTCCAATTGGGTGTGAGGAGTTCAGTTATATGTNTGGGCTNN
-+
-67777788888888888888888897776555443222000//...--,,++*****))))(((''&"%$""$#""
- at 30BB2AAXX080903:3:4:86:545#0
-CCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTATCACCCTATAGAAGAACTAATGTCNCTATNAN
-+
-67777788888888888888888877776545443220100//..--,+,+++***)*))))(((''%"##"""$"
- at 30BB2AAXX080903:3:46:1307:321#0
-CTTATACTAACATTAGTTCTTCTATAGGGTGATAGATTGGTCCAATTGGGTGTGAGAGATCGGAAGAGGGGGTTGC
-+
-67777788888888888888888877776555443222100//,/---,,+++****))(()((((&""""""""#
- at 30BB2AAXX080903:3:1:606:1984#0
-GACCAATCTATCACCCTATAGAAGAACTAATGTTAGTATAAGTAACACGAAAACATTCTCCTCCGCATNATNTCTC
-+
-67777788888888888888888877776555443222101/-.----,,+,+*****)))((((('&"%%"$%$"
- at 30BB2AAXX080903:3:60:1531:1324#0
-TGACGCAGGCTTATGCGGAGGAGAATGTTTTTATGTTACTTATTCTAACATTAGTTATTCTATAGACACACACANN
-+
-677777888888888888/8888&777+655)2331,,,10-/(%+++&+*+**')#()'(()'#'&$$#%%$%""
- at 30BB2AAXX080903:3:33:999:577#0
-CTGACGCAGGCTTATGCGGAGGAGAATGTTTTCATGTTACTTATACTAACATTAGATCGGAAGAGCGNGCACATNN
-+
-67777788888888888888888877776555443222100//..----,+++**))*)*)(()'(&""#$$##""
- at 30BB2AAXX080903:3:1:930:2008#0
-CCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTCAGANTANAACG
-+
-6777778888888888888888887717155541322010././-.-,,,,++*+****)()(%(''&"%#""#$"
- at 30BB2AAXX080903:3:47:1140:412#0
-AGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTAGAACGGAANTTCACAC
-+
-67777788888888888(88888377776555443222.10//..---+,+++*)*)*()))%#&''$"""$####
- at 30BB2AAXX080903:3:39:968:1105#0
-GTTCAGTGTTTTAATCTGACGCAGGCTTATGCGGAGGAGAATGTTTTCATGTTACTTATACTAACATTAGCACTCC
-+
-677777888888888888888888777765554432221.0///.--,,,+,++*****)))(((('%%%#%%$$#
- at 30BB2AAXX080903:3:8:1690:433#0
-TAAGTAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTCAGATTAAAACACTGAACTGACAATTANACTACANN
-+
-67777788888888888888888877776555433222100//..----,++++**))*))(((((&""##"$#""
- at 30BB2AAXX080903:3:46:422:236#0
-GTTGGTTGATTGTAGATATTGGGCTGTTAATTGTCAGTTCAGTGTTTTAATCTGACGCAGGCTTATGCGTGACTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&&"#"#"#"
- at 30BB2AAXX080903:3:47:1602:1542#0
-CTGCGTCAGATTAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATACGTCGGCT
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(((('""#$#""#"
- at 30BB2AAXX080903:3:40:125:1283#0
-TGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTAATTGTCAGTTCAGTGTTTTANTCTGACAC
-+
-67777788888888888888888877776555443222100./..---,,++++**)))))()('''""$%$#%#$
- at 30BB2AAXX080903:3:1:884:1288#0
-TCAGATTAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACNCTNAGCC
-+
-677777888888888888888888477765554432-2100/..-.--,,+++())**()))(('''&"%"""#"#
- at 30BB2AAXX080903:3:57:1687:512#0
-GTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTAATTGTTCACAACCACA
-+
-67777788888888888888888877776555443222100//..--,,-+,+*#*))))))(('#&'&%%%$%$$
- at 30BB2AAXX080903:3:36:372:1387#0
-CACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCACGCTCCAN
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*)))))((('('&$"%""#""
- at 30BB2AAXX080903:3:34:1773:506#0
-TGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCAGATCGGAANTCACACNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((((""$$&"$""
- at 30BB2AAXX080903:3:36:444:1993#0
-CATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGAGATCTCTAGCTCNN
-+
-67777788888888888888888877776555443220100//..---,,+++***)*)))()(('%%$"####""
- at 30BB2AAXX080903:3:40:1729:914#0
-GCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTTTATTGTC
-+
-67777788888888888888888877776,55443222100//..-,-,-+++)***))))()(('&'#"&&&$""
- at 30BB2AAXX080903:3:48:1074:194#0
-GCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATAGATCGGAAGGTCCCACC
-+
-67777788808888888888888877776/55441220100/0..---,,+++)****)))((('''%"$$##"##
- at 30BB2AAXX080903:3:46:1097:1157#0
-AGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTGGGCTGTGACTTGC
-+
-67777788888888888888888877776555443222100//..--$,,++++**))*()((('&''%"#%""$"
- at 30BB2AAXX080903:3:1:1696:800#0
-ATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATATTCGGNTGNTTCT
-+
-67777788888888888888188877716)55445222100/...-+,,,+,++*))())((((((&%"%%"""#"
- at 30BB2AAXX080903:3:44:1601:1875#0
-TAACAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAG
-+
-677777888888888888888888777765554432221000/..---,,,,++**())))((('''$&&%%"%$#
- at 30BB2AAXX080903:3:43:723:598#0
-CTTATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATGACTTGTTGGTTGATTGTAGATACTGGGCTGGC
-+
-677777888888888888888888777765/5443212100//./---,,+++***)*))))(((('$&%&%##""
- at 30BB2AAXX080903:3:37:1396:872#0
-CAGCCCAATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATCACTN
-+
-67777788888888888888888877776355443222100//..--,,,,+++*))*)()())'(&%$#%$##""
- at 30BB2AAXX080903:3:4:190:253#0
-TCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGTGAGGGTAATAATANATGANAN
-+
-64777788888888888884888277776555343231100//..---,,++++*****)()(((('""$#"#"#"
- at 30BB2AAXX080903:3:39:860:993#0
-TGCCGAGTTCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGATCGGAAGCTGCTA
-+
-67777788888888888888888877776555443222100//..----,+++**))))))())((&%&%$""#"#
- at 30BB2AAXX080903:3:46:345:1922#0
-ATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAAAAAAAGTAAAAGGAACTCGGACAAGC
-+
-67777788888888888888888877775555343222000/...-,--,+*+***)*))()(((''&%#"$"""#
- at 30BB2AAXX080903:3:57:622:842#0
-AAGATTTGCCGAGTTCCTTTTACTTTTTTTAACCTTTCCTTATGAGCATGCCTGTGTTGGGTTGACAGTGCTACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+***)))()((('&&%""#""#
- at 30BB2AAXX080903:3:8:442:1762#0
-TGGTGATGCTAGAGGTGATGTTTTTGGTAAACAGGCGGGGGAAGATTTGCCGGGTTCCTTTTAAGATNACGTCCNN
-+
-6777778888888888888888887772655244332210-/.-)-,++++,**)*#'())(%(%%&""#""##""
- at 30BB2AAXX080903:3:41:217:1293#0
-TGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGGGATGTTTTTGGTAAACAGGCGGGGGGAGCATTTNCGC
-+
-67777788888888888488888877(76555483222&00//-.---,,+*+*)*))'))(()#&'&$%%%"%$"
- at 30BB2AAXX080903:3:1:1280:264#0
-GTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGATAGAGGTGGTGGTTTTGGTAAAGAGGCGGNGCNACGT
-+
-6770*788888888888848/8871373)025413322&0&....)-&+,**+**()''(('''&#'$""$""#""
- at 30BB2AAXX080903:3:51:187:195#0
-TTACCCCGCCTGTTTACCAAAAACATCACCTCTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGACAACACTC
-+
-67777788888888888888888877776555443222100/..%--,,,,++*+*))))()(((('"$"#%"#"#
- at 30BB2AAXX080903:3:41:1536:1059#0
-CATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGTGATGTTTTTGGTAAACAGGCGGGGGGC
-+
-677777888888888888888888777765553432,2/00-/-..--+,,+*'**()))((()'('"$#"#"""#
- at 30BB2AAXX080903:3:2:972:1646#0
-AACATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCCAGAGGGGATGTCTTTTGTAAAAANTGACACT
-+
-677777888888)8888888088%767,6/2.31'22-$0&./+'-++,,$+*$+&#*()#(##(&#"""##$##"
- at 30BB2AAXX080903:3:43:108:590#0
-GTTAAACATGTGGCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGGGATGGTTTTGGTAAACCGGAG
-+
-677777888888,88888888888777-6555443222100//.---,-,+++*%***)&))(((('%%$##$"""
- at 30BB2AAXX080903:3:40:1297:1318#0
-CCTGTTTACCAAAAGCATCACCTCTAGCACCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTNATGCA
-+
-67777788888888888888888877776525443212100/...---,,,+++*))))())()(''&$&"""##"
- at 30BB2AAXX080903:3:44:585:1151#0
-GGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTAATACTGGTGATGCTAGAGGTGGTGTTTTTGGGGGGAG
-+
-677777888888888888888888.77765504(3222011/-..,)-,,++*(*#*)&)''(%((%$$#"$""""
- at 30BB2AAXX080903:3:49:1341:1445#0
-CGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGGCTCTTATATTTGTGATGGTAGGAGAACGGGAACGTTGAC
-+
-6777778888888888888888285771655/44(2-%.-,#'-,$+'+(,$')#*&##(('##'''""""""""#
- at 30BB2AAXX080903:3:35:212:1358#0
-AAACATCACCTCTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGNCGGAGGCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&"$"""""$"
- at 30BB2AAXX080903:3:36:500:514#0
-TTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGCCTCTAATACTGGTCTTGTGTGN
-+
-67777788888888888888888877776555442222100//..---,,+&+(*)*)&)(''((('&$"""""""
- at 30BB2AAXX080903:3:42:19:130#0
-TTGCACGGTTAGGGTAACGCGGCCGTTAAACACGCGGCAGCGTGCAGGCGGGGGCTCTCCTAACTACGCTCTGTAC
-+
-67777788,8888888888888857#/765,9$4'2)+.'#.#-%+),+,+*')*#'(######%##"$"#"""##
- at 30BB2AAXX080903:3:56:1182:668#0
-TTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGGGGTCGGGAGAGGGGTGCACCCT
-+
-67777788888888888888888877776555443222100//..---,,+*+'*'&#))%((&(%#&%$$"###"
- at 30BB2AAXX080903:3:44:924:1681#0
-CTAGCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCACA
-+
-67777788888888888888888877776555443222100/0..---,,+++***)*)')#(('('%&%"%#"""
- at 30BB2AAXX080903:3:47:235:768#0
-TGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTACTTCTCTGT
-+
-67777788888888888888888877776555443222100//-.---,,++++***))#)'((((%$""""###"
- at 30BB2AAXX080903:3:46:1456:951#0
-ATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTGCCTCTAGACTACAN
-+
-67777788888888888888888877776555443222100//..---,+*++****))*#)#'(&%$%"$###""
- at 30BB2AAXX080903:3:3:1343:1688#0
-TATGCTACCTTTGCACGGTTAGGCTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGCCTCTNGTTCNCA
-+
-677777888888888888.888887777655544320/21,0+.%.,+,,)'*+'()))()%(#&#'""""$%"##
- at 30BB2AAXX080903:3:60:316:139#0
-TGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGAGATCGGAAGAGGTGNTCNN
-+
-677777888888888888188888777735554432121///.,-+,,+,,**)'*)))''((''(#%$""""%""
- at 30BB2AAXX080903:3:1:1478:1991#0
-GTGATTATGCTACCTTTGCACGGGTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGGNGTNCTNC
-+
-62777788888888888888888/177760554422320/...(.-+&-,++++*)(*)'&()(('&$"%#"""""
- at 30BB2AAXX080903:3:56:1111:397#0
-AGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACAAGTGTCACTGGGCAGGCGGGAGCGTCGT
-+
-67.77788888888&8,8888888.77765'54412,0/1/%*,.,+-+,++*(**()))()')(('&"%%#"#""
- at 30BB2AAXX080903:3:57:1137:440#0
-AGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGGCGCTACCG
-+
-67777788888888888888888877776555443222100...--,-,,*++***()*)'')(((''$%%"###"
- at 30BB2AAXX080903:3:57:760:1503#0
-AAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCGGTCACCTAT
-+
-67777788888888888888888877776555443222100/...--,,,++++*)**)))((('(''&"$$###"
- at 30BB2AAXX080903:3:3:14:452#0
-AGAGGCACCGCCTGCCCAGTGACACAGGTTTAACGGCCGAGGTACCCTAACCGTGCAAAGGTAGCATCNCACNNCA
-+
-67777788388-88..+08,/8)54'274/524-22,+1#,)&.*)+++,%*)$*#')'(%#'(#''&"%""""##
- at 30BB2AAXX080903:3:49:1290:235#0
-GAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATACACAGTTGT
-+
-67777788888888888818888877776555443222100-/--.*-,,,+(+*(()))#(('(('$$$"""###
- at 30BB2AAXX080903:3:54:1040:1116#0
-ACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGGCTAGCGACT
-+
-67777788888888888888888877776555443222100/...-+--++,+**))*))'((((''%$#$%#"#"
- at 30BB2AAXX080903:3:57:1582:753#0
-ACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCAGATCCTGCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"""""$###
- at 30BB2AAXX080903:3:58:1212:2003#0
-GGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCCGGACCTCN
-+
-677777888888888888888888777765554432110/0//.-.-,-,++%*+***)#('((''#"%&#$#"#"
- at 30BB2AAXX080903:3:42:1338:1898#0
-ACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATAATCACCTCAATATA
-+
-67777788888888888888888877776555443220//0/.----,,,++++*'*)())()(((&&&%%%%%$%
- at 30BB2AAXX080903:3:45:1767:1741#0
-AAGGAACAAGTGACTATGCTACCTTTGCACGGTTAGGGTACCGCGGCCGTTAAACATGTGTCACTGGGCTCTTGGT
-+
-6777778888888888888888887777655544322210/.//.--,,+,+++****()('('((''""#""#""
- at 30BB2AAXX080903:3:40:1493:1863#0
-TGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGGAGCATAATCACTTGTTCCTTACGNGC
-+
-677777888888888888888888777+65,5112222220-/------$,++*)***))((((((%&'%&%$"##
- at 30BB2AAXX080903:3:4:1314:261#0
-CCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACCGCGGAGATCGGAAGAGCGGNACCANCN
-+
-67777788888888888888888878776555443232100//..---+,+++****())(((((&'%"#$$#"#"
- at 30BB2AAXX080903:3:3:820:1431#0
-CCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCATAATCAGATCGGAAGAGNCAGCNNC
-+
-677777888888888888888888777/6555440212/0//+-..),,++++**))*)&()(('('%"%""#""#
- at 30BB2AAXX080903:3:1:1671:1146#0
-CATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGTAGCAGAATCACTTGTTCCTTAAATAGGGACNCANCACA
-+
-677777888888+888888883827747605351/2--000.'.-+-++*+,'**)))(#)((((&(&"""""###
- at 30BB2AAXX080903:3:8:1696:1593#0
-CATGTTTAACGGCCGCGGTACCCTAACCGTGCAAAGGGAGCATAATCACTTGTTCCTTAAATAGGGANCGTCACNN
-+
-677777888888888888'888887777635544322#10..,---,-+,,+++'*)))()((('(&"$""$##""
- at 30BB2AAXX080903:3:33:1730:189#0
-CATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGTACAGATCNACCCTANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)()))((('"##"$##""
- at 30BB2AAXX080903:3:37:1569:1092#0
-CATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGGGAGATCGGAAGNCACTCN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))))('('$'"""##""
- at 30BB2AAXX080903:3:50:1776:595#0
-GTGGAGCCATTCATACAGGTCCCTATTTAAGGAAAAAGTGAATATGCTACCTTTGCAAGGTTAGGACGCGTCACCA
-+
-62777788888088888888/08/73776555441222+00'&./---,,+'+***)')(')'(((#"$#"#####
- at 30BB2AAXX080903:3:43:1237:453#0
-CGCGGTACCCTAACCGTGCAAAGGTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACAGC
-+
-67777788888888888888888847776555443222100//..---,,+++***))*))()(('''&%&$%#$"
- at 30BB2AAXX080903:3:58:1639:1422#0
-CTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGCACACAAAN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&$$"%&#%$"
- at 30BB2AAXX080903:3:2:1410:1565#0
-CCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGTTAGNGTCTACC
-+
-677777888888888888888885787745553432121-./-/..,+,-+++***)()))()(''''"""""$##
- at 30BB2AAXX080903:3:36:1072:929#0
-CCTAACCGTGCAAAGGTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGTATAGCCACN
-+
-67777788,8888888.888888877776555440220000.//.--+,,+++++))*))(('(((%"%""####"
- at 30BB2AAXX080903:3:42:629:1031#0
-GCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCACGGGTAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()()(''''&##$"##
- at 30BB2AAXX080903:3:51:650:536#0
-AGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTTTGCCCGGCTCG
-+
-67777788888888888888888877776555443222100//..----,,++***))))))))((&&""#"$#"#
- at 30BB2AAXX080903:3:58:493:353#0
-AAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACAAGTGATTATGCTACCTCACNC
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))))'(('%&&$##"#
- at 30BB2AAXX080903:3:56:1585:582#0
-GTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAAGATCGGAACACAAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''(''%#$##$#
- at 30BB2AAXX080903:3:4:439:1901#0
-TAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCATNTCGCNCN
-+
-677777888888888888888888777765554432221////....-,,+,+*'))))*()(((('""$'&""$"
- at 30BB2AAXX080903:3:49:478:229#0
-ACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACCTGTGTGCC
-+
-67777788888888888888888877776555443222000//.,--,-,++)***))))((()(''"$"#"#"#"
- at 30BB2AAXX080903:3:49:479:228#0
-ACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCATACAGGTCCCTATTTAAGGAACATGTTGTAC
-+
-677777888888888888888888777765554432220/0./.,.-,,,,++**))*&)(()((''$$$"""""#
- at 30BB2AAXX080903:3:58:1212:747#0
-AATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTANCCTCCA
-+
-67777788888888888888888877776555443222100//..---,,+,+*+**))))()(((($""%####$
- at 30BB2AAXX080903:3:44:1353:990#0
-AAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTAACCAGAGATCGGACGATGTGCT
-+
-67777788888888888888888877776555443222100//.-----,+++++))*)))(('(('""#"#""##
- at 30BB2AAXX080903:3:34:747:2003#0
-CCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCTTACTTTTAATCAGTGAAATTGACCTGCCCGNTCGATANN
-+
-6777778888888888888)8888-7016/45353./1(&/-..,+"+++&+%*)&')&##&'''&#""""%"#""
- at 30BB2AAXX080903:3:57:554:752#0
-GCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATTCNTACACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&"%%$%$#
- at 30BB2AAXX080903:3:46:797:832#0
-CGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGAACCCTCGTGGAGCCATCGACTCAG
-+
-67777788888888888828888877776555443222100//..---,,++++**)))))))((((""#"####"
- at 30BB2AAXX080903:3:52:347:1979#0
-TGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAAGATCGGAAGCGTGGTCT
-+
-67777788888888888888888877776/454432-2000//.,.,,,,-*+**+()(*)(&((''%"#"#"#"#
- at 30BB2AAXX080903:3:33:553:2038#0
-TTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAGATCGGAAGAGGGGGTCANCAGAGCNN
-+
-677777888888888888880888777765554-2202100.+-,,+--*,*%(*#)*&(#)(#&&#"$$"#"#""
- at 30BB2AAXX080903:3:34:158:996#0
-TTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAAGAGACAGCTGANGTCCATNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((''&""####"""
- at 30BB2AAXX080903:3:46:1412:58#0
-GTTCAGCTGTCTCTTACTTTTAACCAGTGAAATTGACCTGCCCGTGAAGAGGCGGGCCTGAGATCGGTCTATACCT
-+
-6777778888&888888888888372776555443222000/..-.-,,,,+++**'#'''('#%%'"$"""###"
- at 30BB2AAXX080903:3:59:678:1080#0
-ATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCAAGATCGGAAGAGCACTCC
-+
-6777778888888888888888884347655544331/0/./...,,-,%+****)))(((#''(&''"&$##"##
- at 30BB2AAXX080903:3:41:1084:1398#0
-CCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAAAAGTAACA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('(''$"&#$""#
- at 30BB2AAXX080903:3:60:655:1701#0
-CCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTCACTGGTTAACATACCNN
-+
-67777788888888888888888877776555443222100./..---,,++++**)*((())('(%%#"""##""
- at 30BB2AAXX080903:3:4:1044:397#0
-ATTAAAGCTCCATAGGGTCTTCTCGTCTTGCTGTGTCATGCCCGCCTCTTCACGGGCAGGTCAATTTANGCACNCN
-+
-67777788888888888&888088767+65454/32/01001*/.+*+',+++***)))(%&'&'''$"%""""""
- at 30BB2AAXX080903:3:47:1248:1008#0
-CGGGCATGACACAGCAAGACGAGAAGACCCTATGGAGCTTTAATTTATTAATGCAAACAGTACCTAACAAACGACC
-+
-67777788888888888888888877776555443222100//..---,-++++***)*)))(((('%%"$&#"$$
- at 30BB2AAXX080903:3:47:1249:1009#0
-CGGGCATGACACAGCAAGACGAGAAGACCCTATGGAGCTTGAATTTATTAATGCAAACAGTACCTAACCGAGCAAT
-+
-6777778888888888888888887777655344322.10&//./----,++++**(())()('(%'&"%##$#""
- at 30BB2AAXX080903:3:41:1655:968#0
-CACAGCAAGACGAGAAGACCCTATGGAGCTTTAATTTATTAATGCAAACAGTACCTAACAAACCCAAAAACGTACA
-+
-67777788888888888888888877776555443222100//..--,+,+++++**))))))(('#"&%%%"#""
- at 30BB2AAXX080903:3:50:969:785#0
-TTAGGACCTGTGGGTTTGTTAGGTACTGTTTGCATTAATAAATTAAAGCTCCATAGGGTCTTCTCGTCCTGCGCAC
-+
-67777788883888888888888877776555443222100//..-,---++++**)))*))(((('&###$"##"
- at 30BB2AAXX080903:3:58:1387:309#0
-GTTTAGGACCTGTGGGTTTGTTAGGTACTGTTTGCATTAATAAATTAAAGCTCCATAGGGTCTTCTCGTCGTTANA
-+
-67777788888888888888888877776555443222100//..---,,++++**))))*((((('&%%"""%"$
- at 30BB2AAXX080903:3:45:534:1703#0
-CCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGACCTGTGGGTTTGTTAGGTACAGATCGGAAGAGGGGCG
-+
-677777888888888888888088/77764551432221..//-.--,,,+++***'*)())('(('&&"#"#"""
- at 30BB2AAXX080903:3:44:357:1864#0
-AGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGACCTGTGGGTTTGAGATCGGAAGAGCGGCAG
-+
-67777788888888888888888877776555443221100//...,,,,+++***)*))))(((('$&%$&""""
- at 30BB2AAXX080903:3:38:1536:1714#0
-GGAGGTTGGGTTCTGCTCCGAGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGTAGTTTAGGAGCATCGTCAC
-+
-67777788888888888888888877776515363022100//./--,,,+*+***)))())((('#'#"""$$##
- at 30BB2AAXX080903:3:8:825:450#0
-ATGTACTGCTCGGAGGTTGGGTTCTGCTCCGAGGTCGCCCCAACCGAAATTTTTAATGCAGGTTTGGNCCTCCANN
-+
-67777788888888888888888877776550442022//1-/.-.,,+-++****)*((()&((''"$##%##""
- at 30BB2AAXX080903:3:54:1424:851#0
-ACTACCAAACCTGCATTAAAAATTTCGGTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACACGCACA
-+
-67777788888888888888888877776555443222100//..---,,+*+***))))))()(''%$$"%%"##
- at 30BB2AAXX080903:3:48:1358:244#0
-TTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGGTTCTGCTCCGAGGTCGAGATCGGAAGCTTGTGCT
-+
-67777788888888888888888877776555440221100//..---,,+++**)*))))((((('%"""$""""
- at 30BB2AAXX080903:3:3:334:1558#0
-TTCGGTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTAGATCGGAAGAGCGGTTCAGCCGCNCTCANAC
-+
-677777888888888888888888734725+52,21/2.01-.),.++++,*)*#)&)*%'#'(##(%"#"$#"#$
- at 30BB2AAXX080903:3:35:53:1222#0
-GTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGATCGGAANGCAAAAGN
-+
-67777788888888888888888877776555441222100//....-,,+,+******))((((('""%"#"#""
- at 30BB2AAXX080903:3:4:498:774#0
-TTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGCNCTACNAN
-+
-6777778888888888888888255777957144331212..0.--,,,,*+*)))())((()(('(&"#""""""
- at 30BB2AAXX080903:3:41:563:568#0
-GAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGGTGGGTTCTGCTCCGCGGTCTGC
-+
-6777778888888888888888887777655544322210///....-,,+++%+**)%('))'(''$"#%#""""
- at 30BB2AAXX080903:3:57:444:1473#0
-TGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGGGGGTGGGGTTGGGTCCGAGCGCGC
-+
-67777788888888888888884877776555/43221100*/..-.,,++)+*&*))))('#&#'#%&""$"$"#
- at 30BB2AAXX080903:3:45:1409:1547#0
-GACCTCGGAGCAGAACCCAACCTCCGAGGAGTACATGCTAAGACTTCACCAGTCAAAGAGAACTACGATACTCAAT
-+
-67.777888888888,+8888488+747'35-44322*2/0/0.,,-,&+*+***)*)')(('('&%$#"%#$"#$
- at 30BB2AAXX080903:3:48:1412:817#0
-AATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGAGATCGGGAGACTCT
-+
-67777788888888888888888877776555443322100//..--,,-+++*)**&)))')(&#%&""%##"#"
- at 30BB2AAXX080903:3:43:1722:534#0
-CTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGA
-+
-67777788888888888888888877776555443222100//..---,,++****)*)))))(((''&%%%%$$$
- at 30BB2AAXX080903:3:57:124:1822#0
-CTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCCATTCA
-+
-67777788888888888888888877776555443221100//..---,-+++**))**))((((('&$&"%#"#"
- at 30BB2AAXX080903:3:2:982:825#0
-TCAATTGAGTATAGTAGTTCGCTCTGACTGGAGAAGTCTTAGCATGTACTGCTCGGAGGTGGGGAGATNTCATTCC
-+
-67777788888888+88888888%7777655'44320*(00/../---,,+*++**()))&))((''$"#"$#"##
- at 30BB2AAXX080903:3:48:248:431#0
-GATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCGGAGGTTGGGTTGTGGTACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''%$""$""#$"
- at 30BB2AAXX080903:3:50:1470:877#0
-ATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGGCTTAGCATGTACTGCTCGGGGGGTACACACTTC
-+
-6777778388.88888(8888888787765535,2/2%1/0/*#'-,,),)**+&))))(')&)(''"##$"#""#
- at 30BB2AAXX080903:3:53:19:1643#0
-CCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGAAGTCTTAGCATGTACTGCTCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+,+***))))*((('''%$$&#%$"#
- at 30BB2AAXX080903:3:48:888:617#0
-ACATGCTAAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACACAGGT
-+
-677777888888888888888888777765594432+2.00//..---+,+++**)**()(('('''%#$##%"""
- at 30BB2AAXX080903:3:48:1129:467#0
-AGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGACGCAGTTGC
-+
-67777788888888888888888877776555443222100//-.---,,-++**&*)))))((((&$$""##"""
- at 30BB2AAXX080903:3:33:1667:1497#0
-TAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTGNATGCCANN
-+
-67777788888888888888888877776555443222100./-.-----+++****))*(')(('&""#"#%#""
- at 30BB2AAXX080903:3:60:861:238#0
-AAGACTTCACCAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTCCCGCTNN
-+
-677777888888888888888888777765554432221/0//.---,-,,,++*+**))((()((&&$$%"$"""
- at 30BB2AAXX080903:3:50:1121:1245#0
-CCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTGACTGGTCCGGACGC
-+
-6777778(88888888+88888887777655544322000///..---,,,++****))))(('((&"$#""##"#
- at 30BB2AAXX080903:3:59:1618:1321#0
-CCGAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGGAGTTCGCTTTGACTGGCAACAANCA
-+
-67777788888888888888888877776555443222100//..---,,+++**')))))((&'''$&%%$$"$%
- at 30BB2AAXX080903:3:2:973:254#0
-TGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGCTTTNGCTTACT
-+
-677777888888888888888888.7776555423212100/../.-,,,+++***)**)()((('''""$"#"""
- at 30BB2AAXX080903:3:47:450:464#0
-CAGTCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACACCG
-+
-64777788888888888888888877776555443222100//.----,,++++***)))()(((''$%"%%#"#"
- at 30BB2AAXX080903:3:41:166:808#0
-TGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGTAGTTCGTTTTCAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)**))((('(&%&#"#""#"
- at 30BB2AAXX080903:3:53:803:571#0
-TAGGATTGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGTTATTGGATCAATTGAGTATAGCCGTGTGN
-+
-67777788888888888888888876776555442222100/.-.-,-,,+,+***()*)*((((('%"$%"$"$"
- at 30BB2AAXX080903:3:2:1457:108#0
-TCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAANAACACAC
-+
-67777788888888888888888877776545443221./0//...--,*++)*'***(&)()(&((""""#####
- at 30BB2AAXX080903:3:52:1089:1385#0
-TCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGCGTCCTTT
-+
-67777788888888888888888877776555243220./0/...--,,,++)***)*)())(((('&"#$%$#""
- at 30BB2AAXX080903:3:55:1017:583#0
-ATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTAACTTGTTCCGTTGGTCAAGGTGTTATG
-+
-6777778888888888888888887777651584322210/..-.--++,&*+***())(*')&'%'%#"$"#"""
- at 30BB2AAXX080903:3:37:512:1228#0
-CTTGACCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGCATCAN
-+
-6777778888888888888888887777655544322210//...---,,,*+**)**))))(((('$%%#""$$"
- at 30BB2AAXX080903:3:50:1616:644#0
-GTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTAACTTGTCACTGACAC
-+
-67777788888888888888888877776555443222100//...--,,+++**))))(()(((('$"#"""#"$
- at 30BB2AAXX080903:3:53:1024:982#0
-CCAACGGAACAAGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(('(&%$$&&%%#%
- at 30BB2AAXX080903:3:37:590:668#0
-CATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGAGCCCGACACN
-+
-6777778882888888888888887777655544322010,/....,-,,+**+)*))'((((('''$""""$"#"
- at 30BB2AAXX080903:3:39:1418:375#0
-CATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGGGTATCTTGTGC
-+
-6777778888888888888888887777655544122210/./....,,,,+(**))())('((((#&"%%&%%""
- at 30BB2AAXX080903:3:34:1123:1566#0
-CAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTAGNTCCTGCNN
-+
-67777788888888888888888877776555443202200/...----,++****)**))(()(&'"$##$##""
- at 30BB2AAXX080903:3:57:1667:1221#0
-CCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGCTGTTATCCCTACACAAAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))()(('&&$%%%$%$$
- at 30BB2AAXX080903:3:51:744:998#0
-AGTTACCCTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGCTGTTGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***())))(((((($"#$""$$"
- at 30BB2AAXX080903:3:50:464:1067#0
-CTAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCAGATCGGACGACATCT
-+
-67777788888888888888888877776453443222110//..---,,+(++*))*))))((#'(""$""#"#"
- at 30BB2AAXX080903:3:43:734:239#0
-TAGGGATAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACA
-+
-67777788888888888888888877776555443222100/...---+-+++***)*))()((((''#&&&&$#"
- at 30BB2AAXX080903:3:56:203:1622#0
-CGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCGGTGCTCT
-+
-67777788888888888888888877776555443222100//.----,,,,+**)))))())('('&&###""#"
- at 30BB2AAXX080903:3:1:461:50#0
-TAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGANCTNCCAT
-+
-677777888888128888,88888-1'763*145.02.21/.../.+,-+*+)****))(((('(''&"&$"###"
- at 30BB2AAXX080903:3:34:282:630#0
-TAACAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGANCAAAACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))((''"&"#""#""
- at 30BB2AAXX080903:3:38:1093:539#0
-ATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTGCTCTTGT
-+
-67777788888888888888888877776555443222100//..--,,-+++****))()()((('""$"#"###
- at 30BB2AAXX080903:3:1:1484:677#0
-CATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATNACNCACT
-+
-6777778888888888888888887777655544321100///..----,+,++***)))()))((''""$"###"
- at 30BB2AAXX080903:3:47:1758:1554#0
-CATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGATTTCACCTC
-+
-6777778888888888888888887777655544322220///..---,,+++***)*))())((('"$"""#$##
- at 30BB2AAXX080903:3:44:1372:1826#0
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCGGCAGAG
-+
-677777888888888888888878777765554432221.0//..--,+,+,+++*))))')(((''&$""$#$##
- at 30BB2AAXX080903:3:37:1546:275#0
-CCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGACTCGCGCN
-+
-677777888888888888888888777765454330221000.-.,--,,,+++****)))(((((#"#&%"#$$"
- at 30BB2AAXX080903:3:49:22:830#0
-CCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAATAGGACTCACCTG
-+
-677777888888888888888888977+6525443222100//...--,,+++**)))))))((('&"%"$"""#"
- at 30BB2AAXX080903:3:38:780:769#0
-TGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGACTCTAGAAGCGTCACAC
-+
-6777778888888888888888887777655544332010///..+--,,+++***)*)*))()(&'"##"#"$##
- at 30BB2AAXX080903:3:1:416:1622#0
-ATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGNCCNCACA
-+
-27777788888888888888888877776555443222200//.-.--,,+++***)*))))()('''""""$#$"
- at 30BB2AAXX080903:3:38:71:31#0
-CGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTATTGTTGATATGGAAGATACGTCACNN
-+
-6777778888888888888888887617/5534-3222/00-..-*-,-+,*+)+*#*(((((((('$$"""#$""
- at 30BB2AAXX080903:3:37:712:571#0
-TTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAGATCGGAAGAGCGGGTCACCACCTN
-+
-6777778888888888888888887777656534322201-///--),,+++*))**')*()(((%%$"#""###"
- at 30BB2AAXX080903:3:40:1552:1482#0
-CGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTCTTGTTGATTTAT
-+
-677777888888888888888888777765414415,202/0.---,--,,,#*+*)(*%()(#'((&$%#%$##"
- at 30BB2AAXX080903:3:2:1496:1839#0
-CATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCAGATCGGAANCACNCAT
-+
-6777778888888888/888785877774452242++000/+..,-,,,,*,*$)%))(&('&'&'#""$"#"$$#
- at 30BB2AAXX080903:3:52:685:1822#0
-TATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGCTCGCTTG
-+
-67777788888888888888888877776,55443222100//.-,-,-,,)+++*)))))()((''%#$""""""
- at 30BB2AAXX080903:3:41:478:926#0
-AAACGAACCTTTAATAGCGGCTGGACCATCGGGATGTCCTGATCCAACATCGAGAGATCGGAAGAGTGTGTTGTAT
-+
-6/717748-88888888288388&3.1&4+/54)-0/-.//*,+,,,),+&)+)'*'(#(('''#'#%""""""""
- at 30BB2AAXX080903:3:4:424:1499#0
-TCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGCNTGCANTN
-+
-6777778888888888888888883777655542322000.0/..,,--+++**)))(('(((('&'%""$%""""
- at 30BB2AAXX080903:3:53:310:1120#0
-CAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCTATNGAG
-+
-67777788888888888888888877776555443221100./.-.--+,,++*+**)())'((((%"$#""""""
- at 30BB2AAXX080903:3:53:870:1424#0
-CAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTGTTGA
-+
-6777778888888888888888887777656544322211/1/.----,,+,+****))))')(((%$$"$$##"#
- at 30BB2AAXX080903:3:60:638:1460#0
-TGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAACCCTCTCNN
-+
-67777788888888888888888877776555443222000//..---,,+++++*)())(()((''$$&"$##""
- at 30BB2AAXX080903:3:45:658:1123#0
-GTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACATCGAGGTCGTAAAGCTCAGT
-+
-6777778888888888888888887777654542-22110,//.)-,-+,*+**'))))(()#((&&%%$#"#"""
- at 30BB2AAXX080903:3:52:1340:132#0
-GGGTTTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTTCACGCAT
-+
-67777788888888888888888877776555243222100///..,-,,++***+**#)'(&(('#$"$&$%""#
- at 30BB2AAXX080903:3:55:81:881#0
-TTACGACCTCGATGTTGGATCAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAAANGATCGGT
-+
-67777788888888888888888877776555343222100//...,-,-+++*'**))))(()(''"""#$"#"#
- at 30BB2AAXX080903:3:1:770:607#0
-TAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGATCCAACNCANACGC
-+
-6777778888888888888888887777655544322110///&,*,++(,++')*('&(((('#''&"%#"$$"$
- at 30BB2AAXX080903:3:8:1599:2002#0
-CGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTAGAACGGAAGAGCGGGTCAGACGNACCTGCNN
-+
-6777778888888888888888887777655541222010//.,,+,#+,*)+(#(#))#######'""###"$""
- at 30BB2AAXX080903:3:34:679:835#0
-ATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGGGATGTCCTGNTCTCCGNN
-+
-67777788888888888888888877776555443222100//..-,-,-++()#*(*))()(''''"#%"$##""
- at 30BB2AAXX080903:3:4:896:1595#0
-TCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCCTCGGGATGTCNACACNAN
-+
-67777788888888888188888877776/55443002/0.10.--,,+*+)*$%#(##(''(##&%$"$""#"#"
- at 30BB2AAXX080903:3:43:256:1351#0
-CTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCGAGGGACTCC
-+
-(477708.88288888348803887117/5153/.0/,,-0.-+)-,++++*+(*)#()#&#&'##%"$"""$"""
- at 30BB2AAXX080903:3:35:1101:967#0
-TCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCNTCACCCCN
-+
-67777788888888888888888877776552443222100//.----,,+++***)**)((('(''""$"####"
- at 30BB2AAXX080903:3:8:1250:1954#0
-TCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGGCTGCACCATCNAGCACANN
-+
-67777788888888888888888877776555443222100//..--,+,+,+****)()(''((#'"""%#$#""
- at 30BB2AAXX080903:3:58:1110:929#0
-ATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCCACCCAT
-+
-67777788888888888888888877776555443222100./..---,,,+++*))*)))(((('''$""%"###
- at 30BB2AAXX080903:3:37:1668:1278#0
-GGTGCAGCCGCTATTAACGGTTCGTTTGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCAGACCGTCTGCACNN
-+
-67777788888888888)88888877776555443222100/./..-,,,+,++***)))))(((''""#"$%#""
- at 30BB2AAXX080903:3:57:287:1324#0
-TGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGAACCTTTAATAGCGNCGCACC
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((''&""##"##
- at 30BB2AAXX080903:3:33:434:184#0
-AGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACAAACGANGACCTCNN
-+
-677777888888888888888888777745.5443022100%...-+,-,,++**()*))(((('''"#$$$##""
- at 30BB2AAXX080903:3:55:1029:1392#0
-ATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTAGATCGGACGCACGGCT
-+
-67777788888888888888888877776555443222100//..---,,+++**))*))))(('('$%%"#""##
- at 30BB2AAXX080903:3:59:1479:1667#0
-TAGATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTGAACACACACANAC
-+
-677777888888888*8882882,7677655544502210//..+---,,++++**))()))((('''&%%%$"$#
- at 30BB2AAXX080903:3:59:454:492#0
-TGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTAAGATCGGTCACAC
-+
-67777788888888888888888877776525443222100/..-----,,++***)))))((('('&$##%$$"#
- at 30BB2AAXX080903:3:53:933:288#0
-GAGGAATTTGAAGTAGATAGAAACCGACCTGGATTACTCCGGTCTGAACTCAGATCACGTAGGACTTTAATCGTTG
-+
-67777788888888888888888877776555443222100//..-,,,,++++**)*)))()((('$&$%&$#$%
- at 30BB2AAXX080903:3:37:163:1920#0
-TGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTCCCTGTACGAAATGTCACAN
-+
-67777788888888888888888877776555443022100//-'---,,,+++**)*)))((('('$$""$"$#"
- at 30BB2AAXX080903:3:58:207:352#0
-ATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTCCCTGTACGAAAGGACAANANA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$$%%&"#"$
- at 30BB2AAXX080903:3:48:1451:1618#0
-GTGAAGTAGGCCTTATTTCTCTTGTCCTTTCGTACAGGGAGGAATTTGAAGTAGATAGAAACCGACCTGAGTAACC
-+
-67777788888888888888888877776555443222100/...---,,+++***))))))()(''""#"#""##
- at 30BB2AAXX080903:3:1:1410:1550#0
-ATTTACGGGGGAAGGCGCTTTGTGAAGTAGGCCTTATTTCTCTTGTCCTTTCGTACAGGGAGGAATTTNTANCTGC
-+
-+777778888888888882381289673635543221110/./,/.,,+++++))**(*((()&('#&""#"""""
- at 30BB2AAXX080903:3:48:1213:1552#0
-TACTTCAAATTCCTCCCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGGTGTAGA
-+
-6777778888888888828)888877776555443222100*/---,-,+,++****))('(((&'%&#""%##"#
- at 30BB2AAXX080903:3:42:1590:464#0
-TTCCTCCCTGTACGAAAGGACAAGAGAAATAAGGACTACTTCACAAAGCGCCTTCCCCCGTAAATGCTCTCATCTC
-+
-67777(8888*88888888818887777655544'0320-0//..,--+,,+(+*))()('#'''&#%"%%"#$$$
- at 30BB2AAXX080903:3:2:94:268#0
-GAGATGATATCATTTACGGGGGAAGGCGCTTTGTGAAGTAGGCCTTATTTCTCTTGTCCTTTCAGATCNGACNNCA
-+
-67777788888888888888888877173545443.22.00/,(.---,-%,'+***(()))''(''$""#"""##
- at 30BB2AAXX080903:3:38:972:1508#0
-TCCTCCCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATAGATCGTCTCTA
-+
-67777788888888888888888877776555443222100//..---,-+++*****)()((((''"$#"####$
- at 30BB2AAXX080903:3:51:1606:2020#0
-GTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTACAAAAACCA
-+
-67777788888888888888888877776555343222120.,..,,+,,++++*+)))))'((''#"""$"%###
- at 30BB2AAXX080903:3:58:777:1192#0
-CGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCAAGATCGGACCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$%$$#"""
- at 30BB2AAXX080903:3:54:1521:613#0
-GAAAGGACAAGAGAAATGAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTACACATAAC
-+
-67777788888888888388888877776555443221100//..---,,,++***)))))(()((''&%%$#"$"
- at 30BB2AAXX080903:3:8:1033:1341#0
-AGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACNACAATCNN
-+
-67777788888888888888888877776555443222200//./-,,,,,,+***)))())(((('"&%"#"#""
- at 30BB2AAXX080903:3:2:544:457#0
-AAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATAGATCGGAAGACNTGGGCTC
-+
-67777788888888888888.838737765/122322110./.,-,-+,,+,+***)*))')(('(&$"""##%##
- at 30BB2AAXX080903:3:42:149:1754#0
-AGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCNACCCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(('('"#$$%%$"#
- at 30BB2AAXX080903:3:37:503:990#0
-GCCTACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCATCCNACGCN
-+
-67777788888888888888888877776555443222100//..---,,-++***)*)))((((('"%&"$""$"
- at 30BB2AAXX080903:3:34:1770:648#0
-TTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCACAGATCNACACAANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)**))(()(('""$"#"#""
- at 30BB2AAXX080903:3:55:204:146#0
-CAAACCCTGTTCTTGGGTGGGTGTGGGTATAATACTAAGTTGAGATGATATCATTTACGGGGGAAGGGACTCGTTC
-+
-67777788888888888888888877776555443210100//.---,--++++**)*)))((''('""%###"%#
- at 30BB2AAXX080903:3:4:1388:1436#0
-AAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCTACACCCACCCAAGAGATCCNTCCGNAN
-+
-677777888888888888888818/7776551)822011-.-.--.-,+,+**(*)))&')'((&&#""""$""#"
- at 30BB2AAXX080903:3:50:1395:1007#0
-CCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGGTTGTTAAGATAGAGAGCCA
-+
-6777778888888888888888887777655544322210///-.,,-,-+*+***'())))(((''%"""""##"
- at 30BB2AAXX080903:3:42:652:559#0
-CGGGCTCTGCCATCTTAACAAACCCTGGTCTTGGGAGGGTGTGGGTATAATACTAAGTGGAGATAAGTCGGGTGCG
-+
-6777778-8888888888%88883477%65/544'2'21&0'//.,,--,*+*+*))$()'((#''''"%%$""#"
- at 30BB2AAXX080903:3:45:404:645#0
-TGATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCTGGTACG
-+
-677777888888888888888888777765554432221/0//..---,++++***)))**()('(''$"&&""""
- at 30BB2AAXX080903:3:40:964:108#0
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCCGGNATACT
-+
-67777788888888888888888877776555443222100//..--(,,++++**)**))()('(#&$&""""$"
- at 30BB2AAXX080903:3:35:1281:998#0
-CGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGTGGGTGTGGGTATAATACTAAGTTGNATCACCTN
-+
-6777778888888888/888888877776555443222100/...-,-,,++*+**)))()((('('"$"$####"
- at 30BB2AAXX080903:3:60:703:511#0
-CTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTGTTAAGATGGCAGAGCCCGGTAATCGCATACACCGGNN
-+
-67777788888888888888888877776555443022100//..---,,+,+***))'*)))((('&$%##""""
- at 30BB2AAXX080903:3:50:777:1316#0
-GACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGTGTCTAACAC
-+
-677777888888888888888888777765554431/2100..,..--,-+***#*()))(()(((%%"#"""$##
- at 30BB2AAXX080903:3:37:1319:1549#0
-TGACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAACAAACCCTGTTCTTGGGGCTNCAGCN
-+
-67777788888888888888888877776555443222100//..---,,+,****)*))))(('(&$#$""#"#"
- at 30BB2AAXX080903:3:4:1538:345#0
-GAAGAGGAATTGAACCTCTGACTGTAAAGTTTTAAGTTTTATGCGATTACCGGGCTCTGCCATCTTAANAAACNGN
-+
-677777888888888%8888888877976'55443222100//,..-+,+**++*))*)#'(('((%""""$%"""
- at 30BB2AAXX080903:3:44:219:1476#0
-GCCATGGGTATGTTGTTAAGAAGAGGAATTGAACCTCTGACTGTAAAGTTTTAAGTTTTATGCGATTACCGTGCTC
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))()(''&%%%%$$##"
- at 30BB2AAXX080903:3:42:984:1688#0
-TAAAACTTTACAGTCAGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTAC
-+
-67777788888888888888888877776555443222100//..-+---+++***')))))('((''$%%%&$#%
- at 30BB2AAXX080903:3:2:784:1803#0
-ATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTTGTTAAGAGGAGGAATTGAACCTCTGACNTATNCGC
-+
-67777788888888888888888827776525443,/1100/.-.--,',,++)*))*))'((((''"""#$"###
- at 30BB2AAXX080903:3:44:506:1880#0
-AGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCAAGATCGGGAGAC
-+
-67777788888888888888888877776555442221.00--./----,+,++*)**))'&(((('%""&#""$"
- at 30BB2AAXX080903:3:60:1123:1974#0
-AGAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCGTGCNCANN
-+
-6777778888888888888888887777655544322.000./.,---,,++++**))*)((((((&"%#&"#"""
- at 30BB2AAXX080903:3:34:18:679#0
-GAGGTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTNGCTTGANN
-+
-64770788888888888888888877776555423222020/...---+,+++***)**)'()'(('"#$"""#""
- at 30BB2AAXX080903:3:41:568:1286#0
-GTTCAATTCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCACTCGC
-+
-67777788888888888888888877776555443221100//..----,,*+****)*)(()((('&&$$##"""
- at 30BB2AAXX080903:3:33:1348:1046#0
-AATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTAGATCGGAANCTTCCCNN
-+
-67777788888888888888888/77766555443'221-0/...-,(+-,++&)))))))('((##"#""###""
- at 30BB2AAXX080903:3:46:1713:876#0
-ATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGTTGTCAAGATATG
-+
-67777788888888888888888877776+55443222100//..---,,-+++**)))&))((((&%""%"""##
- at 30BB2AAXX080903:3:46:1613:947#0
-CATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGTATGGTANGCCCACGA
-+
-67777788888888888888888877776555443222100//-.---,++++*****))())(#('""##"#"""
- at 30BB2AAXX080903:3:59:709:1339#0
-TAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCAGATCGGAAGCAAGTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)))))((('&$"##""##
- at 30BB2AAXX080903:3:34:1093:1103#0
-GTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGAGATNTGTATANN
-+
-67777788888888888888888877776555443222100/...--,,,+++***))))((()(('""""#""""
- at 30BB2AAXX080903:3:42:887:1074#0
-TAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTAAG
-+
-6777778888888888888888887777655544222210.0//.-.--,++++*))*))()(((('&&&%$$##"
- at 30BB2AAXX080903:3:37:1088:1996#0
-GGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGGCATGGGGAGTTCTCTN
-+
-677777888888888888888888777765554432.20/0//..-,-+,+++**#)*)##'(((('""""%$#""
- at 30BB2AAXX080903:3:45:1150:636#0
-TTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTACAATGAGGAGTAGGAGGTTGGCCATGGGGCGGTCA
-+
-67777/8888888888888888887777.5554432221/00/-----,,+*+***))())('('('%%"#"""#$
- at 30BB2AAXX080903:3:57:619:1785#0
-GCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTACCGAACGAAACATATGAT
-+
-67777788888888888888888877776555443222200//.-----,+,+***))))))(((('%"%&"#"""
- at 30BB2AAXX080903:3:46:1485:1914#0
-AACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCATTCCTAATGCTTACAGATCGGAAGAGCGCGTGTC
-+
-677777888888888888888888777765554432221000/....-,,+)++***)))(((''''&###"""""
- at 30BB2AAXX080903:3:60:448:1673#0
-TAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGGAGATCGGAAGATGCCACNN
-+
-6777778888888888888888*877376355423221000//..,-,,,++++**'))('#()#''"#%$#$$""
- at 30BB2AAXX080903:3:41:165:87#0
-ATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGGTGCAATGAGGNGTCTGATG
-+
-677777888888888888-**88&767-63554432221&,$+/'-,*,,++**+**#'''''('('"&##"""""
- at 30BB2AAXX080903:3:49:735:1676#0
-TGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGCGATTAGAATGGCTCGTAC
-+
-67777788888888888888888877776555443222100//..---,,+,****)))))()((('$$#"""""#
- at 30BB2AAXX080903:3:56:113:583#0
-CGTTGGGGCCTTTGCGGAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATTGNGCACTG
-+
-67777788888888888888888877776555443222100//..---,,++++***)))()(((('"%"%"#""$
- at 30BB2AAXX080903:3:38:558:1587#0
-AACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCACTTGCTTCT
-+
-67777788888888888888888877776553443221100//..--+,,+,+*))*))))'((('#&&"#"""##
- at 30BB2AAXX080903:3:54:370:1536#0
-AACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATTTTTCGTTCGGTAAGCATTAGGAATGCCATCGCGATT
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*)))(('('&%"&&%##%
- at 30BB2AAXX080903:3:8:1493:1177#0
-AGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATCGCCTAGAATTTTTCGTTCGGTAAGCATNCTCACANN
-+
-67771788888888888888+68877(763524422210#1-.-.-,,-,+++***%()((((('('"$"$#%$""
- at 30BB2AAXX080903:3:39:564:433#0
-TTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAACGTTGTAGTCACCCACN
-+
-67777788888888888888888877776555443222100/..---,,,,+++*+)*)((#()'('"%#&$#%#"
- at 30BB2AAXX080903:3:34:1251:620#0
-TCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAACGACGGAGGNCATACANN
-+
-&477778888888&88888888887777655244322200/+..---,--+*****(*))##)#((&"%#"#$"""
- at 30BB2AAXX080903:3:42:1612:1081#0
-ATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAAGCCCCAACGCTGTAGGCCCCTACGATAGGC
-+
-677777888888888888888888777765554332201/0-...$-,)-,+*))#%'((%(&'&'#%$"#$##""
- at 30BB2AAXX080903:3:33:1128:1434#0
-GAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGATCGGANCACACANN
-+
-677777..88888888888888887777655544%02200//0..---,++*+**+*)())))((('"$"&$#"""
- at 30BB2AAXX080903:3:52:578:221#0
-GAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGACTTTTTCGA
-+
-677777.8888888888888888877776555442222100//./---,,+++****)))))(((''%""%&$%$#
- at 30BB2AAXX080903:3:47:549:475#0
-AGCGAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAAATGCG
-+
-67777788828888888888888877776555443222100//.----,-++****)**))))((''$$""""%#%
- at 30BB2AAXX080903:3:43:693:644#0
-GTCAGCGAAGGGTTGTAGTAGCCCGTAGAGGCCTACACCGTTGGGGCCTTTGCGTAGTTGTATATAGCCTAGAATT
-+
-677777888888/888888888887777$55544521-20,0/-.---,,*,+*))*))))(((('''$$#&$$$$
- at 30BB2AAXX080903:3:38:1419:622#0
-TTTATGGCGTCAGCGAAGGGTTGTAGTAGCCCGTAGGGGACCACAACGTTGGGGACTCTCCGTAGCTCGATACCAC
-+
-677777888888888888888.88770765554$32221%.%.-,.,-*(+*+*#))')&#(##(##%"#%"#"##
- at 30BB2AAXX080903:3:3:1259:245#0
-TTTATGGCGTCAGCGAAGGGTTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGGCCTTTGCGTAGTTGNCTCANTN
-+
-67777788888880888888188877776/4)44322110)//-,.--+*,,++#%))))()''(&'""$%$#"#"
- at 30BB2AAXX080903:3:48:1528:602#0
-ACAACTACGCAAAGGCCCCAACGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCACAGATCCCACC
-+
-6777778888888888888888887777655544322210-//.----,,++****)())#((((#'"""#""###
- at 30BB2AAXX080903:3:2:1366:421#0
-CTACGCAAAGGCCCCAACGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAGATCNTANCATA
-+
-6773778888888888828888887723655524321020/-)..,++,+)*%'*)#&)%(&('''#%"##"##"#
- at 30BB2AAXX080903:3:36:1730:568#0
-CTTTGGTGAAGAGTTTTATGGCGTCAGCGAAGGGGTGTAGTAGCCCGTAGGGGCCTACAACGTTGGGNCCTCAGNN
-+
-6777778888888888888888887777655544*02110.//,.--',,,**+*')))(()&('('""%#$#"""
- at 30BB2AAXX080903:3:52:577:151#0
-ACTCTTCACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTCAGCTCTC
-+
-6777778888888888(888888877776555453220+00/.,'-,,,-+,+)*))))))((('('"##&""#"$
- at 30BB2AAXX080903:3:39:1508:1332#0
-TCTTCACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTCGCCACCAC
-+
-6777778888888888838888887747655544322/1/00/..--,+,*++**))))(((&((#'$$$$#"$#"
- at 30BB2AAXX080903:3:1:1179:1058#0
-ACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTCAGCTCCNCANCACA
-+
-67777788888888888888888877756555023222)00.///-,-,-+++*'***)))#)('''$"%$"$%$$
- at 30BB2AAXX080903:3:35:1613:379#0
-ACCAAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCNACTAGANN
-+
-67777788888888888888888877776555443222000/...---,,+,+****())'('((''""%"#"#""
- at 30BB2AAXX080903:3:36:1166:1272#0
-AAAGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCATCGTCNCAN
-+
-67777788888888888888888877776555443222100//..---,-,++*+***)))))(''%$'%&&""#"
- at 30BB2AAXX080903:3:44:1193:105#0
-GCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCCTCGCTCCTCTC
-+
-/7777783888888888888888877776555342222000//.----+,,+')())()%)(('&#'&$"%##$$#
- at 30BB2AAXX080903:3:52:113:1129#0
-TAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGTAGAGGGGGGTGGGAGATGGGGGGGGGATCTGGGGG
-+
-67777788888888888888888877776555443*2%+0,*.+.--,,*$,+)%*&#)#()#((('"$$""##""
- at 30BB2AAXX080903:3:49:1358:331#0
-GTAGACGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGGAGAGGGGGATGGTAGATGTGGCGGGCNCTGCTCG
-+
-677770888888888888888888777765554232-2(.0%..%---,,)&++&)&(%(#)(#(('$"#""""#"
- at 30BB2AAXX080903:3:39:367:758#0
-CCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCAGATCCGCACAGAG
-+
-67777788888888888888888877776555443222100//..--,-,,+****)))))(()(''$""%"""#"
- at 30BB2AAXX080903:3:39:859:1204#0
-CCTAAAACCCGCCACATCTACCATCACCCCCTACATCACCGCCCCGACCTTAGATCGGAAGATCGGTCNTGCAGTC
-+
-677777888888888888888883.7776%4.1131',0.&/../++++++)'()&(()'(##&(&'$"#%#"""#
- at 30BB2AAXX080903:3:58:36:1038#0
-CTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTAGACNNA
-+
-67777788888888888888888877776555443222100//...--,+++**+)*))))'(((''&&"""$""#
- at 30BB2AAXX080903:3:1:465:1262#0
-ATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGGGGTGAGGGGGGGGGGGGGTGGGGGGNCANCGCA
-+
-677777888888888888/888.8576;65'24432+21#/#&('$-#,,,*+)%)*'#('#(#&'%""##"#"##
- at 30BB2AAXX080903:3:37:701:1565#0
-GCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGTACACACN
-+
-6777778888888888888888887777655544320212/1.-..--,,+++**)**))))(((('""#%"#"#"
- at 30BB2AAXX080903:3:48:482:795#0
-CACATCTACCATCACCCTCTACATCACCGCCCCGACCTAAGATCTCACCGTCGCTCAGACCGGAAGGACGGACTGC
-+
-6777778888888888888588887/776/5541-02'%&/$/-,-,*-,)+**'(%'(##'(#'(#""#""$"""
- at 30BB2AAXX080903:3:1:513:1712#0
-ACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACNCCNCGCC
-+
-27777788888888888888888877776555443222.00//..,-,-++++++)*))()((((&'&"&""%"$$
- at 30BB2AAXX080903:3:45:1230:805#0
-GGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGTGGAGGGGGGGGTGGGGCACTG
-+
-677777888888888888888888774765454432220/0///.---+,+*+*'*'#)(')((''#%"#"###""
- at 30BB2AAXX080903:3:3:287:126#0
-ATCTACCATCACCCTCTACATCACCGCCCCGACCTTATCTCTCACCGTCGCTCTTCTACTAGATCGGANCTGCNCN
-+
-67777*08808//0.-830)0+/,+2%0)00+/)-,,#.0)-,.,+)')&***('(('%(''#'#&#""%#"$"""
- at 30BB2AAXX080903:3:50:841:182#0
-ATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCGCGTCACCT
-+
-67777788888888888888888877776555443222100//..--,,,+,+++***))(()((('"#$""##$"
- at 30BB2AAXX080903:3:54:122:1321#0
-ACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCGCGCCCCCN
-+
-67777788888888888888888877776555243222100//..----,++***)(*())((((''"%#&""#""
- at 30BB2AAXX080903:3:53:1326:1351#0
-GGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGGGGGGGTAGCACGCATCG
-+
-677777888888888888888888777765564432221/0//,.-,,,++++**#)*((&&'###'%"$$$""$#
- at 30BB2AAXX080903:3:42:1762:1147#0
-CATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCGCCGCTCTTCTAAGATCGGAAGAGCGGGCTAGCTAT
-+
-67777788888888888888,8887086/.052/311.10/#.-.+,,+)*)#)'%#(##&'&'#%'"""""""""
- at 30BB2AAXX080903:3:45:1026:551#0
-GGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGGCGGGGCGGGGGGGGATACATTTGGG
-+
-677777888888888888888888/7776555443122100/..-.--,,)++*****)%)''('#&$$######"
- at 30BB2AAXX080903:3:46:1614:1715#0
-GGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTGAGGTCGGGAGATCGGGTCACTCCG
-+
-6777778888888883888888887777655544332.100//,..--,,,&++*)(*))')((#''"#%#$"##"
- at 30BB2AAXX080903:3:48:683:2015#0
-TCTACATCACCGCCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATAAGACCGGCACG
-+
-67777788888888888888888877776552423212200//-,---,+,+**)*()((&((((''$$##"%"#"
- at 30BB2AAXX080903:3:48:1333:1106#0
-CCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGCGGTGGATCA
-+
-6777778888888888888888887777655544322010//....--*,,+****)*))('((('&%""""""#"
- at 30BB2AAXX080903:3:33:804:301#0
-ACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGGNTAGTGCNN
-+
-67777788848888888888888877775555443232100//..-,-,++*+*+*)))))%(((('""""""#""
- at 30BB2AAXX080903:3:37:1288:903#0
-GGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACGGTGAGAGCTAAGGTCGGGCGCGN
-+
-6777778888888888888888887747655543322210///.,----,,,+*)**)))''((((#$%#%#$$""
- at 30BB2AAXX080903:3:39:903:469#0
-TGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGGTCATAGTAGAAGAGCGACGGCGAGAGCTAAAGCGGTGCT
-+
-67777088888888888888880877776755443212110//(--,,-,+++*&**#)#)'(&(&%"$""$""#"
- at 30BB2AAXX080903:3:39:1339:1313#0
-CCCCGACCTTAGCTCTCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCTCGC
-+
-67777788888888888888888877776555443222000//..--,,,+*+***)*))(()'&'&&#"%%#$"#
- at 30BB2AAXX080903:3:52:27:2008#0
-CCTAGGTTGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGACAGATGCGTGCGTTG
-+
-67777788888888888888888877776555443222100//(-',-+,,++*****#*)'()'%#$""#"""""
- at 30BB2AAXX080903:3:46:129:27#0
-ATAGGAGGCCTAGGTTGAGGTTGACCAGGGGGTTGGGTATGGGGAGGGGGGTTCATAGTAGAAGAGCGTTTACATC
-+
-67777788888888888888888877776555143222100//.----,,+'*****))())((('('$#"##""#
- at 30BB2AAXX080903:3:55:535:612#0
-TCACCGTCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCTCAACAGATCTGCCGCCCC
-+
-67777788888888888888888877776555443222100./..---,,++++**))))))(((''"$""""##"
- at 30BB2AAXX080903:3:47:525:1205#0
-TTCTACTATGAACCACCCTCCCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATGTCTCTCCT
-+
-677777888888282888888888771762/543+3.20*//,.,.--+++++*')())'(((('''""#""###"
- at 30BB2AAXX080903:3:33:148:299#0
-TCCCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTNCTCGGCNN
-+
-67777788888888888888888877776655443222100//..---,,+++***))*))((((('"%$#"""""
- at 30BB2AAXX080903:3:43:1189:1051#0
-CCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGCCTCGT
-+
-67777788888888888888888877776555443222100//..---,,,++****))))())((&'"%#"%#$"
- at 30BB2AAXX080903:3:35:206:1137#0
-CCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCNGTCCTCAN
-+
-67777788888888888888888877776555443221100/...---,,+*++**))))))((('&"""#%#$#"
- at 30BB2AAXX080903:3:35:1621:1669#0
-TGAGTAAACGGCTAGGCTAGAGGTGGCTAGAATAAATAGGAGGCCTAGGTTGAGGTTGACCAGGGGGNGCACACGN
-+
-67777788888888888888888%77'76555413212000//,,++--$-+%**#**)#'(((((&""$&%##""
- at 30BB2AAXX080903:3:42:1269:771#0
-TGAGTAAACGGCTAGGCTAGAGGTGGCTAGAATAAATAGGAGGCCTAGGTTGAGGTTGACAGATCGGAGGAGCTCA
-+
-67777788888888888888888877776555443212101//..-,-,+&+*+*&))()(((''('&"&""""#"
- at 30BB2AAXX080903:3:58:1378:328#0
-CCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGACACCTCTAGCCTAGCCGTTTACCCAACNC
-+
-67777788888888888888888877776555443222100//..-,-,,+++***)))))))(((&'"$&"$%"$
- at 30BB2AAXX080903:3:2:1525:352#0
-CCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATACNATTATCA
-+
-67777788888888888888888877776555443222200/..-----,++++****))((((('#'""$"#"#"
- at 30BB2AAXX080903:3:33:16:1955#0
-CTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCNGACTACNN
-+
-67777788888888888888888877776555443022100//..--,,,++++**))))))(''('"""$"##""
- at 30BB2AAXX080903:3:38:1020:1800#0
-TAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCCGCGCT
-+
-67777784888888888888888877776555441220100//..--,,,+++*****))(((((((&'"$"#"#"
- at 30BB2AAXX080903:3:35:989:1544#0
-TGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGGGGGTAGGAAAAAANCGCTTCCN
-+
-67777788888888888888887877774.55443222&00-.---"('-*++'**(###%(%'('%"%"$""$#"
- at 30BB2AAXX080903:3:35:1387:1147#0
-GGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGTGGCTNGTGTCCTN
-+
-67777788888888888888888877776455443221200//..--+,,+,+**#)(*())#((##""#"#%#""
- at 30BB2AAXX080903:3:46:1466:853#0
-CAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGGCTAGAGGTGGGTCCGACG
-+
-67777788888888888888888877776555443222100//..---,,++++***)))(((((#'""$"""###
- at 30BB2AAXX080903:3:35:1334:961#0
-TCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACNTCTCACAN
-+
-67777788888888888888888877776555443222100//..-,-,,,,+**)***))))((((""%"%$$$"
- at 30BB2AAXX080903:3:35:1246:1254#0
-GATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGGAAACGGCTAGGGTAGAGNTCACGACN
-+
-67771788888888888882888877776/55433021100//..---,(+,+*+*())()%''(&("&$"""#""
- at 30BB2AAXX080903:3:40:1269:66#0
-AGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGAC
-+
-67777788888888888888888877776555443222100//,..--,,+++***)*))))((((%'&&&%$##"
- at 30BB2AAXX080903:3:60:1158:624#0
-GCCGATCAGGGCGTAGTTTGAGGTTGATGCTCACCCTGAGCAGAGGATTGAGTAAACGGCTAGGCTACGGACATNN
-+
-677707888888888888888888777765514432221-0//..-+(,,++***)))))('(((%%&$&#$##""
- at 30BB2AAXX080903:3:51:1139:37#0
-GCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTAAAACTACGACCTGACGCGAC
-+
-6777778888888%888888&883677765558/3+22000//.--,,+,+++*&'&**)&(((''%%$$$"#""$
- at 30BB2AAXX080903:3:46:244:1146#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGCNCNACGCA
-+
-67777788888888888888888877776555443222111/..-.-,,-++++****)(())((('""$"#""#"
- at 30BB2AAXX080903:3:47:1351:859#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCCGTTGC
-+
-6777778888888888888888887777655544322210///..---,,+++**))*)))()('('%"#$#"""#
- at 30BB2AAXX080903:3:55:1138:827#0
-CACCTCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCAGACCGTCAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('''$&#"$""$#
- at 30BB2AAXX080903:3:38:518:1814#0
-GTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGATTGAGTAAACGGCTAGATATCCACC
-+
-67777788888888888888888877776555443111100/..---,,,,,++***)))%))((('$""""$###
- at 30BB2AAXX080903:3:36:807:1447#0
-CGCTAGCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCTCTCATCCN
-+
-27777788888/88%888888888477;555-443222100*/.)---,,,,+*****))'(()(%'$""""$##"
- at 30BB2AAXX080903:3:45:740:1376#0
-CTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGAGTGAGTAAACGTCGCTCCC
-+
-677777888888888888888885774765553432211//..-,.,-,+*)+)*)*'*)()(('(&'"#"#"#""
- at 30BB2AAXX080903:3:58:504:906#0
-GCCTAGCCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACAGTCTNC
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*)))))(('''&"%#%#"%
- at 30BB2AAXX080903:3:48:1645:1176#0
-CGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCCGGCAGA
-+
-67777788888888888888888877776.55443222100//..---,,++++)*&))))((((''%$##"$"""
- at 30BB2AAXX080903:3:42:712:768#0
-GTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGAGATCGGAAGAGCGGGTCCCT
-+
-67777788888888888888888897776555443222100//..-.-,-+++***)*)*)(((((''&"""""#"
- at 30BB2AAXX080903:3:54:983:949#0
-GTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGCAGCCA
-+
-67777788888888888888888807776555443222100//..--,-,+++*+)))))*)()'('$$##""##"
- at 30BB2AAXX080903:3:35:998:187#0
-TGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGANCACTCGNN
-+
-6777778888888888888888887777655544322210//...-.-,,+++*****))))(((('"$"$%$"""
- at 30BB2AAXX080903:3:51:1409:130#0
-TTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTACGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$"##"#%$$
- at 30BB2AAXX080903:3:34:1052:353#0
-TTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGATCAGAGGNCACCACNN
-+
-6777778888888888888888887777455544(22-.00//-,---,-,,**)))')(()(((''"$"%#"#""
- at 30BB2AAXX080903:3:50:400:131#0
-ATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGACCAGATCGGTA
-+
-6777778888888888888888887777652544322210,/...-.-,,,+*+**)*))()(((%'&$"##"""#
- at 30BB2AAXX080903:3:58:276:1628#0
-AATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGATCGTGTACNN
-+
-6777778588888888888888887777655541322210///-.---,,++++*)))))')((('&%%%#"##""
- at 30BB2AAXX080903:3:54:851:860#0
-TGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGAGTTTGATGCTCACCCTGACTCGACT
-+
-67777788888888888888888877776555443222100//..---,,,+++****)))()((''""#"%$##$
- at 30BB2AAXX080903:3:52:74:167#0
-GATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTTCTATGA
-+
-6/777788888888888888888677766555443522100//..---,+++*+***(()(''((%'%"""$%$##
- at 30BB2AAXX080903:3:3:584:1249#0
-GGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATCNCTCTNCA
-+
-67777788888888888888888877776555443222100//.---+,,,++**+()))(((((('%"%#$$""#
- at 30BB2AAXX080903:3:4:1598:1342#0
-GGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATNCACANTN
-+
-67777788888888888888888877776555443222100//-..--),++++*))*)))((((''"""%%#"""
- at 30BB2AAXX080903:3:41:1633:1661#0
-GTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATCNAACACCA
-+
-67777788888888888888888877776565443222100/..,--,,,++++)*))*)')()(&&$"&#%%###
- at 30BB2AAXX080903:3:50:826:732#0
-TGAGCATCAAACTAAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGCAGTGCCCA
-+
-67777788882088888488788%4,774355443220100//..,)-,++,+*+)*)('(((('''$""""###"
- at 30BB2AAXX080903:3:2:113:1930#0
-AGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTAGATCNGAANNCC
-+
-67777788888888888888888877776555443222100//-...-,,,+++*)))())()((''%"##$"""#
- at 30BB2AAXX080903:3:38:1243:686#0
-AGCATCAAACTCAAACTACGCCCTGATCGGCGCATTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTA
-+
-6777778888888888888888887777655544%2221/0//..--,,-*+)**)))&))()((('$%%#"##"$
- at 30BB2AAXX080903:3:33:931:339#0
-CATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGCNGAAGTANN
-+
-67777788888888888888888877773555443222100/....--,,+,++)))))()(((((#"$""#""""
- at 30BB2AAXX080903:3:8:933:903#0
-GCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGTAGTTTGNTGATCANN
-+
-67777788888888888888848877776551443522100/..,---+,+'*+**)*)))((('(&""""#$$""
- at 30BB2AAXX080903:3:45:774:1556#0
-ATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCCGGGCGGAGGTTGGGGGTG
-+
-67777788881888888888888877776553442-2-.0+/-.,.,),+,)++'&&'())'(%%'%$"###""##
- at 30BB2AAXX080903:3:45:1579:1487#0
-GATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAGGGCGGAGCGTCTCGGC
-+
-67777788888388888888888877776552443202100/.#.+,-',++**+)))())(&(#''"""""$##"
- at 30BB2AAXX080903:3:8:493:653#0
-TGATGGCTAGGGAGACTTCATATGAGATTGTTTGGGTGACGGCTAGCAGTGCGCCGATCAGGGCGTANGTGCACNN
-+
-67/77788/88888.888888828777&65400432#'00#/.-%-,,,++$++*)'))()(('(##"$%"#"#""
- at 30BB2AAXX080903:3:40:1759:1633#0
-TCAAACTACGCCCTGATCGGCGCACTGCGAGCAGAAGCCCAAACAATCTCATATGAAGTCACCCTAGCCCTCATCC
-+
-6777778888888888888888887777655544%22/100./-,,,,+,++******)()(((&''&$#"&#$##
- at 30BB2AAXX080903:3:51:260:64#0
-TCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATAAGATCGGAAGAGCGACTCACAGC
-+
-6777778888888888888888887777605544122210//....--,,,++**)))*)(((''('$$"$"#""#
- at 30BB2AAXX080903:3:44:617:788#0
-AGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCAAGATCGGCAGAT
-+
-677777888888888888888888777765554430/010///.----,,,+****)*))('(('('"$%"#"""#
- at 30BB2AAXX080903:3:46:1778:1895#0
-AGTAGAATGATGGCTAGGGCGACTTCATATGAGATTGTTTGGGCTACTGCTAGCAGTGCGCCGATCAGGGCGGACG
-+
-6777778888888888888&808877276555403220100//-.-.-,-,%++*+))(*(')(&('&%"""""$#
- at 30BB2AAXX080903:3:46:1138:1080#0
-TACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCACGATAGGGC
-+
-67777788888888888888888877776555443222100//..---,,+++***(*)))((('(&$""""$#""
- at 30BB2AAXX080903:3:54:1693:1483#0
-GATAGTAGAATGATGGCTAGGGGGACTTCATATGAGATTGTTTTGGGTAGTGTTTGCAGTGGGCGGCACCACAAAA
-+
-677777888888888888888888+'07$(5144'2021001/..-(-+$++)'()'&)()'(#'&&$""%%#%$$
- at 30BB2AAXX080903:3:57:1304:99#0
-GATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCCGATCGCATACA
-+
-67777788888888888888888877776555443222100//..---,-+++****))())(((('&&%$$#$##
- at 30BB2AAXX080903:3:57:436:1523#0
-GCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCAGATCGACAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(''$""""$"$
- at 30BB2AAXX080903:3:60:1189:842#0
-GCCCTGATCGGCGCACTGCGAGCAGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTGCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()((('&&&""#"""
- at 30BB2AAXX080903:3:3:197:106#0
-TGTTGATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGTGCGCNCTCTNCN
-+
-67777788888888888888,88877075+55.4322200///,.--,+,$++)*)'*')#((((%'%"$"$$"""
- at 30BB2AAXX080903:3:43:1473:1994#0
-TTAGTAATGTTGATAGTAGAATGATGGCTAGGGTGACTTCATATGAGATTGTTTGGGCTACTGCTCGCAGGCGTAC
-+
-677777888888888888888888777765554-32+2101//.-----,+,+**)*()*()('(&'&"%""""""
- at 30BB2AAXX080903:3:55:1000:594#0
-AAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGATGGCTAGGGGGACTTCATATGAGATTGTTTAGTCTGCCT
-+
-6777778,88888888888888887777655544322210/....-&,++++'***)(*))(((&('$&&%####"
- at 30BB2AAXX080903:3:39:581:875#0
-CAAACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGAGATCCGAGNNACA
-+
-67777788888888888888888877776555443212100//./---,,++++*****())((('#%%$$"""#$
- at 30BB2AAXX080903:3:60:755:728#0
-TCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGAGATCGGAAGAGCCGAGCANN
-+
-67777788888888888888888877776555343222100//.----,-+,+**+))))))'(((&%$$#"##""
- at 30BB2AAXX080903:3:46:812:103#0
-AGGGTGGAGAGGTTAAAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGGTGGCTAGGGGGACTTATCATGCAC
-+
-67771788888888888888888877776555433220100/..'.-,,,,&++**)()')#(('''$$#&%##"$
- at 30BB2AAXX080903:3:56:346:816#0
-CATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGCTCCTTTAACCTCTCNANGCCGAG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))())'('"$"$#""""
- at 30BB2AAXX080903:3:58:1400:783#0
-TGTTGTGATAAGGGTGGAGAGGTTAAAGGAGCCACTTATTAGTAATGTTGATAGTAGAATGATGGCTATGTGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))(((''''$%$"#$$$
- at 30BB2AAXX080903:3:51:1292:1678#0
-GGTGTTCTTGTGTTGTGATAAGGGTGGAGAGGTTAAAGGAGCCACTTATTAGAGATCGGAAGAGCGGGCTACACGG
-+
-67777788888888888883888877776555141122100',-/.--,,+++***)))(()'(#(%&$#"$"#""
- at 30BB2AAXX080903:3:37:893:2005#0
-ACATTACTAATAAGTGGCTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTCCGCN
-+
-67777788888888888888888877776555443222100//...,-,,+++****()()()(((%$$#"#""$"
- at 30BB2AAXX080903:3:41:757:1851#0
-GGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGTGGAGAGATCGGAAGAGGCGTCGTCTG
-+
-6777778888888888888888887777655644322210///.----,,+++***))'))((('(&"#"#""#""
- at 30BB2AAXX080903:3:36:1663:1725#0
-AGTGGCTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTAGATCGGAAGAGCGACACACCNN
-+
-677777888188888888838888777765/124321/101/,,,.--+,,++++*)(*)()(((&%$%#%$##""
- at 30BB2AAXX080903:3:59:875:111#0
-CCAAGGGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGTGGAGATCGGAAGAGNTCGNNC
-+
-67777784888888888888885877706/55141220100/...,-,,,,++*'*))*)('(((&("'"&#"""#
- at 30BB2AAXX080903:3:45:766:806#0
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTCTGACGTC
-+
-677777888888818888888888777765554432211/0//..---,,+++******))((((''$""%"##""
- at 30BB2AAXX080903:3:46:1738:718#0
-TAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAACAGGC
-+
-67777788888888888888888-77776555443222100//...--,-++*+**))&))((((('%"""##"#"
- at 30BB2AAXX080903:3:36:1402:1172#0
-ATCATATTATGGCCAAGGGTCATGATGGCAGGAGTAATCAGAGGTGTTCTTGTGTTGTGATAAGGGACTTCCAANN
-+
-67777788888888888888888877776555443222100//.----,,+++***)*))))(('(#""####"""
- at 30BB2AAXX080903:3:2:1332:266#0
-CAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACANCACTTAC
-+
-6777778888888888888888887777655544322200.0./.,---,+++***)**))((((''&"%&%%#$$
- at 30BB2AAXX080903:3:58:1140:1308#0
-CAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTCAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))()('''&&"#"$$$
- at 30BB2AAXX080903:3:57:1582:1227#0
-AACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACAGCACGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$"$#$"#$
- at 30BB2AAXX080903:3:40:411:219#0
-TCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGACATGATGGCAGGAGGAATCAGATCGGCAGCAACTC
-+
-6777778888888888888888887777655544502210,/...,-,,++++**&**)(()((#('""##""$##
- at 30BB2AAXX080903:3:57:176:179#0
-CACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTCGCGCTGCT
-+
-677407888888888888888888/7776/521422220/./..-,,+,,,++))*))((()'(((&"&"#$#""#
- at 30BB2AAXX080903:3:33:1434:1349#0
-ACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTANCACCACNN
-+
-67777788888888888888888877776+5544321-*000..),-,,,,+**+**))((((('''"%"%###""
- at 30BB2AAXX080903:3:49:336:2003#0
-AGAACACCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGTGCGTCAC
-+
-677777888888888888888888777765554232210/0//..----,+++***))))*(()('&%""#""##"
- at 30BB2AAXX080903:3:57:290:487#0
-TTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGTCATGATGGCAGGAGTAATCGTACACT
-+
-677777888888888888888.8877476555443222100//..---,,+,+***)))()((('('"$$"#""##
- at 30BB2AAXX080903:3:56:183:1089#0
-CCTCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCTATCCGTAT
-+
-6.777788888888888888888877776555443202100/...,--,,++*+*+*()('((''%'"%$#$#"#"
- at 30BB2AAXX080903:3:43:951:339#0
-TCTGATTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGTACCCC
-+
-67777788888888888888888873776555443222100//..---,,+++++*)*))())(((''&&$&%#$%
- at 30BB2AAXX080903:3:1:550:1202#0
-TGATTACTCCTGCCATCATGACCTTTGGCCATAATATGATTTATCTCCACACTAGCAAGATCGGAAGANTTNCTCA
-+
-67777788888888888888888877776555443222100//..---,,,++++**))()((((''%""""#"##
- at 30BB2AAXX080903:3:54:543:1397#0
-AGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGTCATGATGGCAGTATCACACA
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((&""##"""#"
- at 30BB2AAXX080903:3:3:639:1901#0
-TTACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACNCTCNNCG
-+
-67777788888888888888888877716/458431221///...---,,+++++)))())(((('''"%"%""$$
- at 30BB2AAXX080903:3:55:1379:247#0
-TACTCCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCGTCTAGA
-+
-67777788888888888888888877776555443222100//...,*,,+++***)**))())'''$&"%"#$##
- at 30BB2AAXX080903:3:2:580:1613#0
-CCTGCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCATNCGATCAC
-+
-677777888888888888888888777795.5432%1111//.--.,+-+++***)'(((((&#((%$""&""$#"
- at 30BB2AAXX080903:3:52:312:609#0
-GCCATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACCTTGCC
-+
-67777788888888888888888877776550443222100/0..--,,,,+++**)))))))('('""#%%$$#%
- at 30BB2AAXX080903:3:51:1576:590#0
-ATCATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACACATCACAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''%"$"#""#"
- at 30BB2AAXX080903:3:33:1090:1081#0
-CTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAANGACAGCNN
-+
-67777788888888888888888877776555443222101//..---,,,++***)))))((((('""$$""#""
- at 30BB2AAXX080903:3:40:1107:597#0
-CCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCACGTGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((((($&$$&""#"
- at 30BB2AAXX080903:3:48:355:1061#0
-CCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCAAGGGCGTCG
-+
-67777788888888888888888877776555443222100///.---,,,,****)*)))))((''"$"""""#"
- at 30BB2AAXX080903:3:47:1382:373#0
-CCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAATCATATTATGGCCCTGGTGCG
-+
-6777778888.888%88/88888808776$55420211111-.-.+-,,-,++**)'))(((((('&$"#$&%"##
- at 30BB2AAXX080903:3:47:299:1095#0
-ACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACAGATCGCAACATACN
-+
-67777788888888888888888877776555443222100//...,-+,,++*****))))(((('$""##"##"
- at 30BB2AAXX080903:3:33:284:815#0
-CTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAGTGTGGAGATAAANTGCTCTNN
-+
-67777788888888888888888877776555443212100//..---,,+++***))))(((((('"%"&"$"""
- at 30BB2AAXX080903:3:52:302:1822#0
-TGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTAAGATCGGAAGCGCGTAC
-+
-67777788888888888888888877776555443122100'/..---,,+++****)*())(((('""$"#"""#
- at 30BB2AAXX080903:3:45:1717:41#0
-CTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGGTGGTCTCTGCTAGTGTGGAGAGAACTCT
-+
-6777778888888888888888887777+555,433/2100/#...-#+,,'*))'))('(#(%((&$""""%"#"
- at 30BB2AAXX080903:3:1:360:790#0
-GTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCTANACNCTCG
-+
-6777778888888888888888807777655544321210.*/,,---,,)++**)**)('('((''%""$"###"
- at 30BB2AAXX080903:3:34:672:452#0
-TCCACACTAGCAGAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGNACAGATNN
-+
-67777788888888888888888877776555443222100//-.---,,+++**()*)))'((((&"#&#""#""
- at 30BB2AAXX080903:3:34:569:1444#0
-TTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCNCGCACANN
-+
-67777788888888888888888877776555443222000/...-,-,&+++***%)'))((((%%"$#$###""
- at 30BB2AAXX080903:3:56:1060:539#0
-TTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCGCGTCCACT
-+
-67777788883888888888/88876276362343201110/--..,-,,+,+***')()(((((''$$"#"$##"
- at 30BB2AAXX080903:3:40:961:755#0
-ATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGTTCGGTTGGTCTCTGCGAG
-+
-67777788888888888888888877776555443222100//.-----,+++***)&))))((((''%&$&$%""
- at 30BB2AAXX080903:3:43:266:2030#0
-ATTCGATGTTGAAGCCTGGGACTAGTTCGGCCTCCCCTTTGGCAAGGTTGAAGGGGGTTGGGGTGTTCTCTCTTCT
-+
-67307/-8./3828)+3&&&%'3$7#$$0$$(.&'%'+%#1$&(%,"&$+($%&#&#&%#'&#%%#%$"#"#""#"
- at 30BB2AAXX080903:3:55:86:651#0
-CAGAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATAGGTGACTG
-+
-677777888888888888888888.77+15554(/2121(0*/..(-,+,+**))))*'#('''''#"$""""$""
- at 30BB2AAXX080903:3:49:933:647#0
-GGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGGGGGTCGGGTGGTGTCA
-+
-67777788888888888888888877776555443222100/...---,,,+*)*))*)))(#(&('"$""##"#"
- at 30BB2AAXX080903:3:2:590:615#0
-GAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTAGATCGGAAGNTCGACAT
-+
-677777888888888388888888178763533432211%.-/,.*,-+,+++*))))))((((('%"""$""#"#
- at 30BB2AAXX080903:3:2:1689:858#0
-ACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCNCAGACAC
-+
-677777888888888888888888.77765454112..101/+,-+,--+)*)(*()())((#(#'#'"$%""$##
- at 30BB2AAXX080903:3:2:769:1501#0
-ACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAGATCGGCNCAGCACC
-+
-677777888888888888888888377765453432,2100/....,--,,++)*)*()))))((''$"$"##$"#
- at 30BB2AAXX080903:3:51:707:913#0
-AGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGAAGGACACGGC
-+
-6777778888888888888888887775655544322210///...-+,,+,+++*)*))))(('''$$"#"""##
- at 30BB2AAXX080903:3:54:1582:1694#0
-GAACCCCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGACACAAACAC
-+
-67777788888888888888888877776555443222100//..-,-,--++**)))*)))((((#""$$""##"
- at 30BB2AAXX080903:3:39:331:714#0
-GAAGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCCTTCGGCAAGGTCGTACGCGGTC
-+
-677777888888888888888888777765518430210/0/..,---,-++*(**)))&''((&('"$%#$"###
- at 30BB2AAXX080903:3:38:249:793#0
-CCCTTCGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCAAATACGCAGATCGGACGANTCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))))((('$"$""$#"#
- at 30BB2AAXX080903:3:54:708:204#0
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGGCAGATCGGAAGACTGG
-+
-67777788888888888888888077776555443222100//..----,+++***))*))))((('%"$$&"#""
- at 30BB2AAXX080903:3:54:214:523#0
-TATGAAGAATAGGGCGAAGGGGCCTGCGGCGTATTCGATGTTGAAGCCTGAGACTAGTTCGGACTCCCACTCTNNA
-+
-6777778888888888888888887777655044322-100//-/--,,,++****)()))((''('&#$#$#"""
- at 30BB2AAXX080903:3:1:1102:327#0
-GTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGGGTGTAGATCGGAAGAGCGGTTCAGGAGNACNCACA
-+
-677777888888888888888882771765704832,2.00/*.---,,(,++**)*$))('#''##"""#"##$#
- at 30BB2AAXX080903:3:56:1357:1782#0
-GTAGAGTTCAGGGGAGAGTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGGGTGTTTTTTATGCATGTG
-+
-67777788888888888888888877776555442(2.10/1/-.--++,+++**&)*)()((('%''$%""""""
- at 30BB2AAXX080903:3:41:1287:1411#0
-TGTTGTGTAGAGTTCAGGGGAGAGTGCGTCATATGTTGTTCCTAGGAAGATTGTAGTGGTGAGATCGACACACAGT
-+
-67777788888888888888788877779555443222,00./..-,+,++*++**))*#)(()(&'"%"""##""
- at 30BB2AAXX080903:3:39:930:806#0
-ATAATAAACACCCTCACCACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACCCACACT
-+
-67777788888888888888888877776555443222100//..---,-+,+++**))))()((('&%"$$%#$"
- at 30BB2AAXX080903:3:3:1691:216#0
-AATAAACACCCTCACCACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTAACNTCACNCN
-+
-67777788888888888888888877775555443022/00//..--,,,+*+*))())))(((('#""#&%$"$"
- at 30BB2AAXX080903:3:45:288:117#0
-GGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGAGCGCGTCATATGTTGCTCCTAGGAAGATTGTAGCGGGGACG
-+
-677777888888888888888888377765554422%2100/,.,---,,)++)*)*)(()(((('''"&$"#"#"
- at 30BB2AAXX080903:3:56:434:1429#0
-ATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGAGCGCCGACTC
-+
-6777778888888883888/78(877726555443222/0./*....-,,++++*)*#()))((((&&%#"""$##
- at 30BB2AAXX080903:3:42:941:637#0
-GACGCACTCTCCCCTGACCTCTACACAACAGATTTTGTCACCAAGACCCTACTTCTAAACTCCCCGAGATCGTGTC
-+
-677777888888888888888+88777765)54433221/0//-.,-,,+*++)+*)'&))(((%(%'"&$&#"""
- at 30BB2AAXX080903:3:52:368:1328#0
-AATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAATATGTTGTGTAGAGTTCAGGGGAGTGTGTG
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))()('(&$""#%#"#"
- at 30BB2AAXX080903:3:4:17:1568#0
-GCACTCTCCCCTGAACTCTACACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTNCACTNAN
-+
-677777888888888888881388737/655+442020+&0/.-,-,+,,+++***)))((((#(('"""%%#"#"
- at 30BB2AAXX080903:3:3:1410:1627#0
-CCCTGAACTCTACACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAGATCNTGTCNCA
-+
-67777788888888888888888877776555343222100//...,-,,+,+**)*))()))((('%"""$%"##
- at 30BB2AAXX080903:3:51:182:1380#0
-TATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGAGATCGGAAGAGCGGTCTGGACGGG
-+
-67777788888888888888888877776555443222100//-.---,-+,+***))))))((''&"""#"$$#"
- at 30BB2AAXX080903:3:54:1684:449#0
-AATCGGGGGTATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTAGGGTCTTGGTGACAAAACACACCCCCC
-+
-67777788888888888888888877776555443222100//..---,,++*+**)))))'(('''$$%%&#%##
- at 30BB2AAXX080903:3:56:514:1143#0
-CACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCAGATCGGTCTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('&&#"#"#""
- at 30BB2AAXX080903:3:33:472:1744#0
-AACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCNACTGACNN
-+
-67777488888888888888888877776555443222100//..----++++**+)*)())()'''"$#"""#""
- at 30BB2AAXX080903:3:56:1302:1160#0
-TTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCGTATGAATGCGAACAGCATACCCCCGATTCCGCTCCTATCA
-+
-+7777788888888888888888877776555143-2110///,--+-,,,*++**(())(('(('''&"""#"#"
- at 30BB2AAXX080903:3:38:1192:1538#0
-TGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTCCGCCACT
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)**)(())(''"%%&"%#$"
- at 30BB2AAXX080903:3:47:1447:272#0
-GGTGTATGAGTTGGTCGTAGCGGAATCGGGGGTATGCTGTTCGAATTCATAAGAACAGGGAGGTTAGAAGTACAAA
-+
-67777788888888888888888877776555343222100//..---,,+,+***))))(((#(('"$%"%#"""
- at 30BB2AAXX080903:3:59:1028:1126#0
-TCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCAGAACAAC
-+
-67777788888888888888888877776555443222100/...---,,,+++***)))))((('''%&#$%#$%
- at 30BB2AAXX080903:3:48:306:121#0
-CCTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCTCCTATAGATCGGCCTC
-+
-67777788888888888888888877776555443222100//..---,-,,++***))))))((''$"#"###"#
- at 30BB2AAXX080903:3:2:1679:1728#0
-AGTAATGCTAGGGTGAGTGGTAGGAAGTTTTTTCATAGGAGGTGTATGAGTTGGTAGATCGGAAGAGCNGTCACGC
-+
-677777888888888888888888777365554632/21-0/).-.,-,,+,+*)*)()())(((''""&%%$%""
- at 30BB2AAXX080903:3:38:1062:1120#0
-ACATATCATATAAGTAATGCTAGGGTGAGTGGTAGGAAGGTTTTTCATAGGAGGAGGATGAGGTGGGCGCGTACAC
-+
-6777778888888888888888887)776055)432221&0'/..+*-,-,)+*++#()()(&((('%&$&$%%$$
- at 30BB2AAXX080903:3:38:1783:1571#0
-ACTTCCTACCACTCACCCTAGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCGCTGCNN
-+
-67777788888888888888888877776555443222100//..---+,+,+**)*))))((((''"%&%%##""
- at 30BB2AAXX080903:3:38:1542:47#0
-TTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGCGACTCCTNN
-+
-677777888888888888888880777765.2443222200//--.-+-,,(++)*()())(#(&(%$"####"""
- at 30BB2AAXX080903:3:59:497:1419#0
-TACCACTCACCCTAGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCCCACACCAA
-+
-67777788888888888888888877776555443222100//..---,,-++++)*)))))((('%$%%%&###"
- at 30BB2AAXX080903:3:50:482:707#0
-ACAATCTCCAGCATTCCCCCTCAAACCTAAGAAATATGTGTGATAAAAGAGATACATAAGATCGGACTANGTCNCC
-+
-67777788888188.888888/3877676555/&3.221$-/../+,,,+,'+)+)'((''%('((%$""""#""#
- at 30BB2AAXX080903:3:55:650:1997#0
-CAGGGATGGGTTCGATTCTCATAGTCCTAGAAATAAGGGGGTTTAAGCTCCTATTATAGATCGGAAGAGGCTCACA
-+
-67777788888888888888888877776555443222100//..--,,-,++***)*)))((((('$$##""##"
- at 30BB2AAXX080903:3:44:969:356#0
-TGGGGTGTGATAGGTGGCACGGAGAATTTTGGATTCTCAGGGATGGGTTCGATTCTCATAGTAGATCGCACGGGGG
-+
-67777088888888888888888877776555443222100/...--,,,+*+***)*))))(((''$%%$##""$
- at 30BB2AAXX080903:3:50:808:914#0
-TGGGGTGTGATAGGTGGCACGGAGAATTTTGGATTCTCAGGGATGGGTTAGATCGGAAGAGCGGTTCCGGGCACAC
-+
-67777788888888888888888877776555443222100/...--,,,++++****))))((((#$""#%##""
- at 30BB2AAXX080903:3:52:1386:822#0
-TCTAGGACTATGAGAATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCGCACTAAAA
-+
-6777778888888883818883.7472195224,-2,.0.,./.,-+*,(+()**)))(()(('''%"$"$$#"""
- at 30BB2AAXX080903:3:55:1477:58#0
-TGAGAATCGAACCCATACCTGAAAATCCAAAATTCTCCGTGCCACCTATCACACCACATCCAAAAGTCACCACATC
-+
-6777778888888888888888$/7777655544*20%1*///..---,++++*&'))()(('(('&%$##%#"""
- at 30BB2AAXX080903:3:58:1529:1803#0
-TGAGAATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTACACACACN
-+
-67777788888888888888888877776545442221100//..---,,,++***)))((((((''$$%%&$%$"
- at 30BB2AAXX080903:3:35:1476:870#0
-CGAACCCACCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCANCTATACAN
-+
-67777788.888888888888888777765552432220/0//-.--,,-+++***)))'((('(('"$##"##""
- at 30BB2AAXX080903:3:2:1724:866#0
-GCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATTTTGGANTCTCAGT
-+
-67777788888888888888888877776555441222101//..-,,,,+++++*)*)((((((('""##%"##"
- at 30BB2AAXX080903:3:56:221:1234#0
-GGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAAGATCNGATCACAG
-+
-67777788888888888888888877776555443222100/..----,,+(+***)))()'(((&#"&#"#"#""
- at 30BB2AAXX080903:3:46:97:808#0
-TCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCAGCTAGATCGGAAGAGCGGTTCAGCAGG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((('&"$%$"%###
- at 30BB2AAXX080903:3:49:143:968#0
-CCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGATACAGCCT
-+
-67777788888888888888888877776555443222100//..----,+++*****)))))((''&""$$"##"
- at 30BB2AAXX080903:3:37:1630:1699#0
-GGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGNGTCTN
-+
-67777788888888888888888877776555443222100//..--,,,,++***)*)))(()'''&"#"""#""
- at 30BB2AAXX080903:3:37:114:382#0
-TACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTACGACGACN
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))((((''"$""###""
- at 30BB2AAXX080903:3:37:782:1187#0
-TACGGGAAGGGGATAACCAACATTTTCGGGGTATGGGCCCGATAGCGTATTTAGCTGACCTTACTTTACTGGTCTN
-+
-677777888883888888888888777765564132221/0.-.-+*+,,*+++)))('(((#'('%&$""$#"#"
- at 30BB2AAXX080903:3:44:398:1834#0
-TACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTAGATCGGAGGGGTG
-+
-67777788888888888888888877776555443220000//-..---,+++****)&())()((''$"$$""""
- at 30BB2AAXX080903:3:49:1304:1225#0
-AGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTNCGTGTTG
-+
-67777788888888888888888877776555443221101./-,--+-,+++*'*#))'&'(('%'""#""""""
- at 30BB2AAXX080903:3:34:1217:760#0
-CCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCNCCACTGNN
-+
-67777788888888888888888877776555443222100//./-,-,,,++***)))*())((('""$$$""""
- at 30BB2AAXX080903:3:2:1190:1755#0
-AAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACNCNTACTC
-+
-67777788888888888888888827776552431221210..+.-.&+,+***)))))('('((%'&"$"$%$"#
- at 30BB2AAXX080903:3:37:127:1197#0
-CCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCGATAGCTTATTGCGTCGCGN
-+
-67777788888888888888888877776555413222100//..--,-,++++**)*)))((((''"#"#$"#""
- at 30BB2AAXX080903:3:53:815:1479#0
-GTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGAGATCGGAAGAGCGGTCT
-+
-67777788888888888888888877776555443222000./..----,++++*+)))))))('('%"##%""#"
- at 30BB2AAXX080903:3:60:1572:1261#0
-ACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGGGGTATGGGCCCACACACCANN
-+
-67777788888888888888888877776555443)21000//-.-+-,,++)***)*)()((('(&$$%%%$%""
- at 30BB2AAXX080903:3:53:974:411#0
-TCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTGCTCTCCC
-+
-677777888888888888888808777765554432/2001//.----,-+++****))))((((('&""$$$"##
- at 30BB2AAXX080903:3:41:1700:2012#0
-CGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAAGATCGGACGAGTAT
-+
-6777778888888888888888887677650323330/2.0-/,.--,,,*&)(&))((#''((##%""#%"#"#"
- at 30BB2AAXX080903:3:39:1604:1566#0
-GCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTGTCG
-+
-67777788888888888888888877776559443222100//..---,,++**+**))()))((('&&%$%%"#"
- at 30BB2AAXX080903:3:40:1332:1875#0
-CCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATACATCGGACA
-+
-67777788888888888888888877776555443322100//..-,,-,++++**)))()((((('$#%%%""#"
- at 30BB2AAXX080903:3:59:822:1068#0
-GATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGGTATAACCAACATTTTCGTACACA
-+
-67777788888888888888888877776555443222100//..---,,++++**))*)))((((''%%"####"
- at 30BB2AAXX080903:3:4:1780:1038#0
-TTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCANGCATNCN
-+
-67777788888888888888888877776552423222100//..,-,,,,++*+*))*))()((''%""%#$"$"
- at 30BB2AAXX080903:3:43:1381:1551#0
-GGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACATG
-+
-6777778888888888888888887777655544322210///..---,,+++**)**)))))(((''&#$"#""#
- at 30BB2AAXX080903:3:4:1540:592#0
-TATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACNATCANCN
-+
-677777888888888888888888777765554432202000/..---,,+,+****))))(()(('&"#%&%"#"
- at 30BB2AAXX080903:3:35:520:1418#0
-ATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACNTCCCCTCN
-+
-67777788888888888888888877776555443202100//..---,,,+++**)*))))))(('"##$####"
- at 30BB2AAXX080903:3:41:1560:357#0
-TTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGAGATCGGAAGAGCGGCCAC
-+
-67777788888888888888888877776555463222100//.---,-,++++****)()()('(('$""""###
- at 30BB2AAXX080903:3:50:731:455#0
-GGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGTGTTGTAC
-+
-67777788888888888888888877776555443222100//..--,,,+++****))))))((('%"""""#"#
- at 30BB2AAXX080903:3:45:630:1978#0
-ACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGAAGATCGGAAGAGGTGTCTAAC
-+
-67777788888888888888888877776555443212100//..---,,++****)*)()(((((''"""#""""
- at 30BB2AAXX080903:3:40:119:1851#0
-CCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACGTGAGTACG
-+
-67777788888888888888888877776555442222100//..---,-+++***))'))((('''""""$"##"
- at 30BB2AAXX080903:3:59:116:1595#0
-AAAGCTAGCATGTTTATTTCTAGGCCTACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGCTANNT
-+
-67777788888888888888888877776555443222100//..--,,,+,++***)))))(('''$&%#"#"""
- at 30BB2AAXX080903:3:2:448:1022#0
-GGTTAGAACTGGAATAAAAGCTAGCATGTTTATTTCTAGGCCTACTCAGGTAAAAAATCAGTGCGAGCNTAGAACT
-+
-67777788888888888888888877776555443221100/./.---,,,++***)*)))((('(&&"$&$"#"#
- at 30BB2AAXX080903:3:57:62:1195#0
-TTACCTGAGTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCTCGCTCCCA
-+
-67777788888888888888888877776555443222100//..---,,++++*))*()))((''''%&#$"$#"
- at 30BB2AAXX080903:3:42:712:1149#0
-TCTAACCAAAAAAATAAACCCTCGTTCCACAGAAGCTGCCCTCAAGTATTTCCTCACGCAAGCAACCGAACCGACC
-+
-677777888888888888888888777765554432221/)/...-(--,++***)))())(((((''$"&#&$##
- at 30BB2AAXX080903:3:4:1717:538#0
-TAGCTATTAGAAGGATTATGGATGCGGTTGCTTGCGTGAGGAAATACTTGATGGCAGCTTCTGTGGAANACTANCN
-+
-67777788888888888888888877776555443222100//..---,,+,+*)*))))')('('&""#$"#"$"
- at 30BB2AAXX080903:3:50:1593:611#0
-TATTGTTGAAGAGGATAGCTATTAGAAGGATTATGGATGCGGTTGCTTGCGTGAAGATCGGAAGAGGCGTCCATCA
-+
-67777788888888888888888877776555443222100/*..---,,+'+****)())(((((#"""$"%"$%
- at 30BB2AAXX080903:3:3:1209:1475#0
-TATATTGTTGAAGAGGATAGCTATTAGAAGGATTATGGATGCGGTGGCTTGCGCGAGGAAATACTTGTNCACTNGT
-+
-677777888888888888888888677765514-3+2220,//-*%-*'(+$+$*)*)'(('('(%'""%&$#"$$
- at 30BB2AAXX080903:3:59:1436:1457#0
-CCTTCTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACCAAACAACACNAC
-+
-6777778888888888888888882777655544322210//....-,,-+++***)*)()((((&'$$%%%$"$$
- at 30BB2AAXX080903:3:46:1302:1092#0
-GCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGGATTGGGTTTGGTTCATTAGATCGTCATCTGCC
-+
-67777788888888888888888877776555443222100//&----,)+&+**(*#())'('(%'$$""#%##"
- at 30BB2AAXX080903:3:42:392:1911#0
-TATTGCTATAGCCAGTATGATTATTAATGATGAGGATTGATTGGTAGTATTGGGTAGATCGGAAGGGCGTGTCTCG
-+
-+7777788888888%8888886887777643544*2221%0/-,'+--+,,++)+%(*(#)((''%&&$"$"#"#"
- at 30BB2AAXX080903:3:46:1164:371#0
-GTTTTATTGCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGTATTGGTTATGGTTCATCTCCCGGG
-+
-67777788888888888888888877776555443222000//..---,,+,+***)()*)'(((''$"####"##
- at 30BB2AAXX080903:3:55:651:1211#0
-ACAATGAACCATAACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTATAGCAATATATCTAATA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))'((('"%#&%""##
- at 30BB2AAXX080903:3:49:31:745#0
-TCCTAGTTTTATTGCTATAGCCATTATGATTATTAATGATGAGTATTGATTGGTAGTATTGGTTTTGTNGCTCATA
-+
-67777788888888888888888877776555443222100///.----,+++*+*()))(((('('"""$"#"##
- at 30BB2AAXX080903:3:42:1213:473#0
-TAACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTATAGAAAAAAAAAAGGAAGAACGGGTGAC
-+
-67777788888888888888888877776555443222100//..---),(&%*%*)))(&')'(''""%"""""#
- at 30BB2AAXX080903:3:34:633:880#0
-AACCAATACTACCAATCAATACTCATCATTAATAATCATAATGGCTAGAGCAATAAAAATAGGAATANGCCTCCNN
-+
-677777888888888888880&8877776555443222100//..--)-++++)**))'))'(((#'""##"$#""
- at 30BB2AAXX080903:3:58:712:1953#0
-AATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCCCTTCACCTTTTTGTCCCCATTGGGAGAGCTATCAGN
-+
-677777888888888+8888888876776545443002.0,..)'&$+&,$(*$'(##&###(#&&#%"#$#$"#"
- at 30BB2AAXX080903:3:53:1517:1436#0
-TGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGGGTCTCAGAAGTGAAAGACACGTTTG
-+
-677777888888888888888.8877776555442122100/...---,,++'*+**))())(''('$$%&"""#"
- at 30BB2AAXX080903:3:1:1274:542#0
-GTCATGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGAGATGGGAGGAGCGNTGNTCAN
-+
-67777788888888888888.788/777925-4/32..,/0/..-),+$*+'++)*))&'('%('(%$"#%"%%$"
- at 30BB2AAXX080903:3:8:1401:555#0
-TGGTATATGATTGAGATGGGGGCTAGTTTTTGTCATGTGAGAAGAAGCAGGCCGGATGTCAGAGGGGNCGACTCNN
-+
-67737788888888888888884877776555412221100/+.,-.+,,+')*+))*(('((((('"$""$"$""
- at 30BB2AAXX080903:3:33:1071:1089#0
-AGGCACCCCTCTGACATCCGGCCTGCTTCTTCTCACATGACAAAAACTAGCCCCCATCTCAATCATANAGACATNN
-+
-677777888888888888888888777765554432221000/..---,-,,++****)))((((('""###""""
- at 30BB2AAXX080903:3:37:1069:391#0
-TCTGACATCCGGAATGCTTCTTCTCACATGACAAAAACTAGACCCCATCTCAATCATATACCAAATCGCTCCATCN
-+
-677777888888888888&8%88877772555443222+00*/..---,,+++****)()*)(((''"%"&$""#"
- at 30BB2AAXX080903:3:59:369:1081#0
-TCTGACATCCGGCCTGCTTCTTCTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCNACTNNC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))(((((''"$"%""#
- at 30BB2AAXX080903:3:42:10:884#0
-TTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGAGAGATTTGGTATATGATTGAGATGGGGGCNCGACGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''"$"""""""
- at 30BB2AAXX080903:3:40:1525:958#0
-AAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCAGNTCGCA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)**)))()('''&%""%###
- at 30BB2AAXX080903:3:42:1688:869#0
-GATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGAGAGATTTGGTATATGATTGAGATGTGC
-+
-67777788888888888888888877776555443222100//./----,,+*+**))))))(((('&&%#%&"#"
- at 30BB2AAXX080903:3:55:1139:897#0
-CAATCATATACCAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATATCTCA
-+
-67777788888888888888888877776555443222100//..--,,,,++**)))))))(((('''"$"$"""
- at 30BB2AAXX080903:3:57:1675:1361#0
-CAAATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCCACACAACAA
-+
-67777788888888888888888877776555.43222100//.'--,,,++%***)))()((('%'&$%%$$%$$
- at 30BB2AAXX080903:3:4:791:1513#0
-CACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGGGANATGCNCN
-+
-67777788888888888888888877786/554432221/00/,,-,+-+*))**)'()))#)'(''%"%""%"#"
- at 30BB2AAXX080903:3:53:462:1854#0
-GTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTTTAGTGAGACAGTCTG
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))()(('''$#""""##
- at 30BB2AAXX080903:3:4:835:1013#0
-TCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCAGATCGGAAGAGCGGTANAGTANCN
-+
-6/777788888888888888888877776555443220100//.-.-,,,+,+**)*)())()(('%"""""""#"
- at 30BB2AAXX080903:3:51:164:794#0
-TGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCTTACGTATAGTGTGT
-+
-67777788888888888888888877756555443221110//..--,,,+++***))))(((((''"$"""""#"
- at 30BB2AAXX080903:3:43:8:311#0
-GTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGGCNTNCGTCACGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((#'#$""%"#"#"
- at 30BB2AAXX080903:3:59:334:419#0
-ACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCTANNC
-+
-67777788888888888888888877776555443222100///.---,,+++***))))(((((('$$&&#"""#
- at 30BB2AAXX080903:3:36:134:359#0
-CTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAANAACCACTN
-+
-67777788888888888888888877776555443222100//..---,,+++)**))))))((((&""""$#$""
- at 30BB2AAXX080903:3:33:569:1209#0
-TAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGATCGGAAAGCNGACACANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''"""&%#"""
- at 30BB2AAXX080903:3:35:762:684#0
-AACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCNCCTCCTGN
-+
-67777788888888888888888877776555443222100//..---,,+,*+**())*()()(''"$""##"""
- at 30BB2AAXX080903:3:1:254:1043#0
-CGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGAGATCGGAAGAGCTNTCNACAC
-+
-67777788888888888888888877776555442220100//.--,-+-,*+***)))))(((&'%$"##"$###
- at 30BB2AAXX080903:3:43:1062:1219#0
-TGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAGAGTGAGGAGAAGCTG
-+
-677777888888888888888888777765554432221000/..---+,++++**)*)))((('(&'&%""###"
- at 30BB2AAXX080903:3:56:1069:1119#0
-CTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAACAACA
-+
-67777788888888888888888877776555443222100//.,---,,+++++**))))))(('''&"$"#"#"
- at 30BB2AAXX080903:3:42:1735:1815#0
-CCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGAGATCGGAGGCTCCC
-+
-2777778888888888888888887777655544322*100/,..--,--+,)***))')*(('&''$&"&$"###
- at 30BB2AAXX080903:3:51:49:745#0
-TCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAACCTCCTAGC
-+
-6770738888888888888888887777655584322210///..),,,,,*+**))(*)(('((''$$""$""#$
- at 30BB2AAXX080903:3:35:978:1303#0
-ATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATNGTCACAAN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))())'(&""$%#$#""
- at 30BB2AAXX080903:3:44:851:1548#0
-AGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATAAGATTGAGAG
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)))))((('('$&&&%%%"%
- at 30BB2AAXX080903:3:55:789:2009#0
-TCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATCGACAC
-+
-677777888888888888888888777765555432.2100----.+-+,,+++'*()))))'(((&"%$"""#""
- at 30BB2AAXX080903:3:44:609:1195#0
-TGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGGATATGATC
-+
-67777788888888888888888877776555443222100//..---,,,++***))))))((((&$"&%#"#"#
- at 30BB2AAXX080903:3:50:319:1606#0
-ATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCCTGCTATGATGTTACGTC
-+
-67777788888888888888888877776555443222100/...-.,--+,+*+*))))))(((('%""""#"#"
- at 30BB2AAXX080903:3:60:573:265#0
-TCCATCATAGCAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCATACACNN
-+
-6777778888888888888888887777655544322210///.,---+,+++**))))()))((('&$"#&$$""
- at 30BB2AAXX080903:3:57:266:634#0
-CCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAACTGCTTTCAT
-+
-67777788881888888888888877776555443222/00//..--,,,+*+*****))))()(''$&%"""$"#
- at 30BB2AAXX080903:3:38:769:1843#0
-CAGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACNACGTCCA
-+
-67777788888888888888888877776555443222000//-.---+,+++*)*)*)))))((('%"%#&&###
- at 30BB2AAXX080903:3:1:1659:638#0
-AGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAAGATCGGAAGNCANTTCT
-+
-6777778888888888888888887773655544322210/-./.---,,+,*)**))))))()('(%""#"""#"
- at 30BB2AAXX080903:3:42:1181:40#0
-AGGCAGTTGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGCCACN
-+
-67777788888888888888888877776555443220110//..---,,+++***)))(*)()((&'$$#$##$"
- at 30BB2AAXX080903:3:54:1073:1184#0
-TCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCCACCTCAGCGACCT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((((''$$"%%#$$$
- at 30BB2AAXX080903:3:56:1233:201#0
-TATTCATCCTATGTGGGGAATTGAGGAGTATGCTAAGATTTTGCGTAGCTGGGTTTGGTTTAGTCAGATCTGCCAG
-+
-67777788888888888,88888877776555443222110//..---,,+++(*+))(*)'((&(''&$#""$#"
- at 30BB2AAXX080903:3:48:1129:2038#0
-TTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGAGTTTGCGTAGGTGAGATCGGAAGAGCGGCAGAGTGAC
-+
-67777188888888)888,88&88777263524,10321*,//.%.,,+(+++**(#))(()()#('%$"""""##
- at 30BB2AAXX080903:3:42:1547:933#0
-TGAGGTGGACTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCAGATCGGAAGAGCGGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((''$%&""""#"
- at 30BB2AAXX080903:3:49:1715:1152#0
-TACGGTAGAACTGCTATTATTGATTCGATGTGGGTAATTGAGGGGTATGCGAAGATTTTTCGTAGCTCCCCAGCGC
-+
-67777283182888&88(888&)*$)$-655344",1/.-#//(.'+,+&()*+*)(*)'#(''(%%$"#$""#"#
- at 30BB2AAXX080903:3:51:570:903#0
-TACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGAGATCGGAAGAGCGTGGAGGTG
-+
-6777778888388888888888887777655544222210///..---,,+++***)**))))((((&""""""##
- at 30BB2AAXX080903:3:45:1631:779#0
-CCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTCACACCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(''$$"$#$#"
- at 30BB2AAXX080903:3:37:567:1358#0
-TAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGCGTAGCAN
-+
-67777788888888888888888877776555443222100//-----+,+++***)))))((((('""$"#"$$"
- at 30BB2AAXX080903:3:45:558:1968#0
-TAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGGATGCTAAGATTTTGAGACGATG
-+
-67777088888888888888888877776555423222100//-.----,+++%+*)))))(()(('$"#""#"""
- at 30BB2AAXX080903:3:2:632:1771#0
-AGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACNCACNGTC
-+
-6777778888888888888880.873773353,/1.+1/0,.-,,.,,+++**)*))((((((&'%'%"$#%""#"
- at 30BB2AAXX080903:3:48:1425:1760#0
-TTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTAAGATTTTGGGTACTC
-+
-67777788888888888888888877776555443222100//..---,-++*****)()))()'''&#"""####
- at 30BB2AAXX080903:3:60:913:1278#0
-CTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACACGCNCAANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()((&&"&"$#%""
- at 30BB2AAXX080903:3:38:66:623#0
-TGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCAGATCGCGCAGCGCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))()(('(&"$%""$"##
- at 30BB2AAXX080903:3:36:840:1968#0
-AAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAATAGCAGTTCTACCGTACAACCCTCACCTACANN
-+
-67777788888888888888888877776555443222000//..---,-+++**))*))))(((('&&%#&%"""
- at 30BB2AAXX080903:3:58:1155:1829#0
-AATGGTTATGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGCTACACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&$&%$%###"
- at 30BB2AAXX080903:3:44:1479:878#0
-AGAATGGTTATGTTAGGGTTGTACGGTAGAACTGCTATTATTCATCCTATGTGGGTAATTGAGGAGTATGGACCAC
-+
-677777888888888888/8888877776555443212100//....-,,+,+***)))))(()('%&"$"%$$$%
- at 30BB2AAXX080903:3:56:393:1225#0
-TAATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTACTACATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((('%%%&%%##$
- at 30BB2AAXX080903:3:1:1639:1229#0
-AATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTANACNCACC
-+
-6777778888888888888888887777655544322210///..---,,,++***)**))((''('%""%"%#$#
- at 30BB2AAXX080903:3:37:1448:242#0
-ACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTACTACCGCATTCCTACTACTNTCACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$$%""%$$"
- at 30BB2AAXX080903:3:3:1094:1070#0
-TTTAAGTTGAGTAGTAGGAATGCGGTAGTAGTTAGGATAATATAAATAGTTAAATTAAGAATGGTTATNGTACNGT
-+
-67777788888888888888888877776555443222100//.----,,++++***))))(((((''"$&&$"""
- at 30BB2AAXX080903:3:49:218:1039#0
-TATTATCCTAACTACTACCGCATTCCTACTACGCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCCCCAC
-+
-67777788888888888888888877776555&43222100//..---,,+++***)**)))(('''&%"#"#"##
- at 30BB2AAXX080903:3:39:1466:1073#0
-CAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGTAGGAATGCGGTAAGATCGGGAGCCT
-+
-67777788888888888888888877776555442232100//...--,,+++***))))))()'('&$"""#"#"
- at 30BB2AAXX080903:3:41:1237:1487#0
-ATCCTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAC
-+
-67777788888888888888888877776545443222100/...---,,+,+)*)***)))((((&"&%%&%##"
- at 30BB2AAXX080903:3:36:1399:1114#0
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCAACTGCACNN
-+
-67777788888888888888888877776555443222100//..---,,-++***))))))((''&$&%$%$#""
- at 30BB2AAXX080903:3:48:1141:1309#0
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCAGATNGTCAGCT
-+
-67777788888888888888888877776555443222100//..---,-+++***)*)))((((''%"""$""##
- at 30BB2AAXX080903:3:57:992:1297#0
-TTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGTAGGAAAGATACACA
-+
-677777888888888888888888767765554/3222100//...-,-,+*+)***))))((('''$&%&#$#$"
- at 30BB2AAXX080903:3:58:1400:1418#0
-TAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTAAGTTGAGTAGGCTACAC
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))(((('&'$%$"$%$$
- at 30BB2AAXX080903:3:43:81:245#0
-GTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGAGATCGGAAGAGCGGGGCACAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'"""$"#""
- at 30BB2AAXX080903:3:41:1612:1240#0
-AGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGAGATCGGAAGTACAGTG
-+
-67777788888888888888888877776555443222100//..----,+++***)))*)(((''''$#"%%###
- at 30BB2AAXX080903:3:3:1522:1183#0
-ACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAANCACANTN
-+
-67777788888888888888888877776555443222000//.-,.-,,,,*+***))))((((('$"%#&%"#"
- at 30BB2AAXX080903:3:49:872:1036#0
-TAAGGGTGTTAGGCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGGCGTGGTGGTGGAGGTTATCTTCTCT
-+
-67777788888888888838888837774555,432320$0.'*..--,,(*+)+*%)()))#('#'$"#""""#"
- at 30BB2AAXX080903:3:36:1082:1729#0
-ACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCGTCCACCCN
-+
-67777788888888888888888877776555443222100//-.---,,+++****))))(((('%&"$$#"##"
- at 30BB2AAXX080903:3:60:1084:1917#0
-ATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGTGTNTCNN
-+
-677777888888888888888888777735554430221/0./..,--,-,,****)))))(('(''%&&$""%""
- at 30BB2AAXX080903:3:52:1043:1353#0
-GATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGGAGTTTA
-+
-67777788888888888888888877776555443222100//.----,,+,++**))))))(((''$$%"&"#""
- at 30BB2AAXX080903:3:4:736:1434#0
-AACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATNTCCGNAN
-+
-67777788888888888888888877776555443222000//-.--,,,+,++**)*))))(((('%"$&"""#"
- at 30BB2AAXX080903:3:38:456:1612#0
-TGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGTCGTGGTGCTGTACTA
-+
-6777778888888888888888887777655.44322/1/0/..--,-,,++***()*))&&(((('"#$&"#$##
- at 30BB2AAXX080903:3:36:1636:905#0
-CTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATCACACACCNN
-+
-67777788848888888886888877756545443222100//..--,-,+,+**)))&('(((((&%%%%#$#""
- at 30BB2AAXX080903:3:43:1557:1727#0
-CCCGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATAGATCGG
-+
-67777788888888888888888877776355443221000//..--,,,++**))(()))((((''&&$&#"$"#
- at 30BB2AAXX080903:3:44:151:528#0
-GCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCAGATCGGA
-+
-67777788888888888888888877776555441222100//..---,,+,+***)*)))))(('''$%%$%%$$
- at 30BB2AAXX080903:3:56:855:935#0
-ACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTCACACCCTTAATTCCATCCACCATCTCAC
-+
-6777778888888888888888887/77655544322200///..--(,,+,+***))))'(')((($&$%%###"
- at 30BB2AAXX080903:3:36:402:1305#0
-AGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAAGATCGGAAGAGCGGTTCTGCGCACCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((&'%&%%"%"##"
- at 30BB2AAXX080903:3:38:722:1931#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTGATGCATCAC
-+
-67777788888888888888888877276555243222100./...--+,+,+*)*))))()((('#$"#$""$#$
- at 30BB2AAXX080903:3:50:1284:1667#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGCGCCCGG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))((('('"$#"###""
- at 30BB2AAXX080903:3:40:1389:1755#0
-CACGACCCTACTACTATCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTGCGTGAC
-+
-67777788888888888888888877776555442222/00//..--,,,+*+***))()()')(('&&"#$###$
- at 30BB2AAXX080903:3:37:75:1178#0
-AGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTAGATCGGAAGATACACANCN
-+
-67777788888888888888888877776555443222100//.----,,+++****)*))(((((&""##$""""
- at 30BB2AAXX080903:3:50:1452:1552#0
-TAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAAGATCGGCAGACCGT
-+
-677777888888888888888888777765.5440221100//..---,,+++***)))))((((('"""#"##"#
- at 30BB2AAXX080903:3:57:1571:1018#0
-CCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATACACGACCAC
-+
-67777788888888888888888877776555443222100//...-,,,+++***))))(()(((&$$%"&#$$#
- at 30BB2AAXX080903:3:34:721:328#0
-AGCGGGGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCAGATCGGAAGAGNACCATCNN
-+
-677777888888888888888888777;655/4412221.0...--.(,++++**))((())(((''""##""$""
- at 30BB2AAXX080903:3:49:125:414#0
-TAGCGGGGGCAGGCCTCCTAGGGAGAGGCGGGTGGATGGAATTAAGGGGGGTAGTCATGAGATCGGGCTGTGTGCA
-+
-6777778888888883888888887777635504332210/+/+.---%,)$'*'&)')()((((('%""""""$#
- at 30BB2AAXX080903:3:42:1124:251#0
-ACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCCCTAGGAGGCCTGCCCCCGNTGT
-+
-677777888888888888888888777765554432221/0//..---,,+++**)*))))(()(('&&$%%"#""
- at 30BB2AAXX080903:3:47:318:1586#0
-TAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTCACAAAAAAGAATCACCA
-+
-67777788888888888888888877776555443220100///.---,,+++**)**))))(((''%""###"""
- at 30BB2AAXX080903:3:3:1539:90#0
-GGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTTGAGATCGGAAGAGGGGTNTGGANCN
-+
-67777788888888888888888877773555-33.)100///-+*(,+,+'*)'(#((''''(&('$"#""#"#"
- at 30BB2AAXX080903:3:42:1128:1621#0
-GGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTTGGGCAAAAAGCCGGTTAGCGGG
-+
-67777788888888888888888877776555443522/00///.--,--+,+*)*)))))())&'''$$%%$#"#
- at 30BB2AAXX080903:3:59:389:878#0
-TATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGCCCATTAGATCGGGAGGTCANNG
-+
-67777788888888888888888877774555443220100-..'---,,+,+$**)()(()''((#&%""$""""
- at 30BB2AAXX080903:3:55:397:2001#0
-TGGCTATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTATTCGATAATGGGCCATTTGGGGGGTTTCCT
-+
-67777788888888888888888877176555.43222100'/-.(--%,*+)**(*##)#'(('''$"##""##"
- at 30BB2AAXX080903:3:39:44:1216#0
-ATGGTGGCTATGATGGTGGGGATGATGAGGCTATTTTTTTTTGTGAATTTTTTTATTATTGAGAATGTCCACACCA
-+
-6777478888888888%8888/88777765+2443'12100/+.-$,+,++,''(*&*)()%)(##'$"##$"###
- at 30BB2AAXX080903:3:49:1564:403#0
-AGGGTGATGGTGGCTATGATGGTGGGGATGATGAGGCTATTGTTTTTTGTGAATTCTTCGATAATGGGCGAAGTGG
-+
-677727888888888888888828777765554432221.0/-..---+,+++)*)))()((((%&'"$""""""#
- at 30BB2AAXX080903:3:1:1255:209#0
-AGGTAGAAGTAGAGGGTAAGGAGGGTGATGGTGGCTATGATGGTGGGGGTGATGAGGCTATTGTTTGANTANTAGC
-+
-677*778888888888888880887777655/44(.211-/0/&.---$&+&)*'**(('##(#(#%&"""""#""
- at 30BB2AAXX080903:3:1:883:2024#0
-AAAAAACAATAGCCTCATCATCCCCACCATCATCGCCACCATCACACTCCTTAACCAGATCGAAAGACNTGNCTCC
-+
-677777888888888888888888777765553$323001/....%--,,,++)***))()(''(('%""#"###"
- at 30BB2AAXX080903:3:56:1445:456#0
-AAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCANAATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$&$#"%#$%
- at 30BB2AAXX080903:3:60:1526:1084#0
-ACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACACAACAAANN
-+
-677777888888888888088888767765511/+22*//.-/.---*+,*+*+*)))))('')(('$$%%%$%""
- at 30BB2AAXX080903:3:33:1759:1265#0
-AATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCNCATGCCNN
-+
-67777788888888888888288877776555443232000/...--,,-++++**)))(())((''""#""##""
- at 30BB2AAXX080903:3:40:1617:1863#0
-AATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTACTCGCAC
-+
-67777788888888888888888877776555443221100//-,--+,++*+**))*)((')((''%"$%"#$$"
- at 30BB2AAXX080903:3:45:626:148#0
-AGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTAAAGACCACTC
-+
-67777788888888888888888877776555443222100/-..---,,+++***)**))((((('%"%$%#""#
- at 30BB2AAXX080903:3:49:230:1819#0
-GCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCTACGCCTAATCCTACACCA
-+
-67175788888888888888888877776555443221000./-.---,,,++*+*))*))(()(('%%"##$##"
- at 30BB2AAXX080903:3:37:806:554#0
-TCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTCTACTTCTACCGACGCCTAATCTACTCCCCNCN
-+
-67777788888888888888888877776555443222000//..---,,+,++&)**)))'(((''%$&%$%"$"
- at 30BB2AAXX080903:3:48:1258:1279#0
-AGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGGAGGGTGATGGTGGCTAGTATGTCAC
-+
-67777788888888888888888877776555483201100/....--+,+*+**()))))'(('%'""#"""#"#
- at 30BB2AAXX080903:3:45:1283:2029#0
-TAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGGAGGGTGATGGTGGCTATGGGGGGG
-+
-6777778888888888888888887777655544322210///..-,-,,+++***))())((((#'$#%#"%$$"
- at 30BB2AAXX080903:3:49:1341:649#0
-ATCATAGCCAACATAACCCTCCTTAACCGCGACTTCTACCTACGCCTAATCTACTCCACCTCAAGCACGGCTCAGC
-+
-67777788882888&888888888777754'5343222000//..---,,*++*)**))())((#('&""#"#""$
- at 30BB2AAXX080903:3:35:1551:1786#0
-TTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGAGTAGGTAGAAGAAGAGGTTAAGGANGTGCTACN
-+
-677777888888%88/888488887.7765504422011-0.'.-,&-+,+)**#'*(**%(&'(('"""#%"##"
- at 30BB2AAXX080903:3:42:138:1661#0
-TGTTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGCACTGCTCA
-+
-67777788888888888888888877776555443222100//./---,,+++***)*)))(()((&$%#""#"##
- at 30BB2AAXX080903:3:40:1223:724#0
-TTACGTTGTTAGATATGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGGTAGAAGTAGAGGTTAAGATC
-+
-67777788888888888888888877776555443212100//..---,,,+++**'))))('('(&"%%$#$""#
- at 30BB2AAXX080903:3:59:271:1398#0
-CTACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAACGTAAAGATCGCNNNT
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))(((((&'%%%#""""
- at 30BB2AAXX080903:3:52:759:157#0
-CAAACTGTCATTTTATTTTTACGTTGTTAGATACGGGGAGTAGTGTGATTGAGGTGGAGTAGATTAGGCGTAGTCA
-+
-677777888888888888888888777765554)322200///...-,,,+,+****)))(((((('&""#"$"#"
- at 30BB2AAXX080903:3:41:290:1147#0
-AATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAAGATACAACA
-+
-67777788888888888888888877776555443220100/..----,,+,+++*)))))(()(''$%&%$#$"#
- at 30BB2AAXX080903:3:39:616:1078#0
-CACTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('&$%&%&"$#
- at 30BB2AAXX080903:3:44:1329:345#0
-CTACTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCTCCCAAT
-+
-67777788888888888888888877776/55443222100///.---,,+++)****))()(''((&&"%#$"""
- at 30BB2AAXX080903:3:43:1389:320#0
-CTCCCCATATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCCGCACAC
-+
-677777888888888888888888777765554432%2100//..---,(+++**))*))&))(('''""""##"#
- at 30BB2AAXX080903:3:41:703:876#0
-TATCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCAGATCGGAAGAGCGTTACA
-+
-67777788888888888888888877776555443222100/....--,,,++***)*))))))((&%%$"""##"
- at 30BB2AAXX080903:3:51:1048:163#0
-TGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTTCAAACTGTCATTTTATTTTTCCGCTGTC
-+
-67777788888888888888888877866555443221100/...-----,++**+*)*)))(((('"##"$#$#"
- at 30BB2AAXX080903:3:34:756:350#0
-ACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATCGCCCTNATACAGNN
-+
-677777888888888888888888777765554432221000/..--,,,,++****))))()((('"""#$#"""
- at 30BB2AAXX080903:3:43:815:1993#0
-AGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGGGGGTTTTGTATGTAGATCGGAAGGGGGGGGCA
-+
-677777888888888888888888777765554532..100//(.--),,,,+(**)()'(#((%%'$$%""""#"
- at 30BB2AAXX080903:3:56:1526:1336#0
-AGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTAGATCGGAAGCACATCACA
-+
-67777788888888888888888877776555443212100//..--,,,++++**)))))(((('&$$&$"##$#
- at 30BB2AAXX080903:3:2:1212:283#0
-GTAGGAGTAGCGTGGTAAGGGCGATGGGCGTGGGGAGGAATGGGGTGGGTTTTGTGTGTTCAAATTGTNATGTCCA
-+
-677777888888'88.8,88888777(7$5354)3.2202/./(.+--+(,+++**))('#('(#%'$""&"##"#
- at 30BB2AAXX080903:3:48:338:835#0
-ATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTGTATGTTCAAGTACACTCT
-+
-67777288888888888884888877719535,4+2221*0/+,---,,++++))**))(((('#&#%""#"""#"
- at 30BB2AAXX080903:3:2:774:798#0
-TGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTNCCCACCC
-+
-67777788888888888888888877776555443212100//...--,,,++***)*)))(()(('""%$##$#"
- at 30BB2AAXX080903:3:38:101:1422#0
-GGAGATAGGTAGGAGGAGCGTGGTAAGGGCGATGCGGGTGGGGAGGGAAGGGGTGGGTTTTTGATCGCGAACTACA
-+
-67777788888888888888888877776553%4"2%1%/0//..-"+&,+,+%**)#(()#(#'#'&"#"$"##"
- at 30BB2AAXX080903:3:53:166:1405#0
-AAAGGGGAGATAGGTAGGAGGAGCGTGGCAAGGGCGATGAGGGAGGGGAGGAATGGGGGGGGGGATGGTGGGGATG
-+
-677777888888888888/8,8887777)5554432(2110//..---,,+*+***))#))(#&&%'&#"$#$"""
- at 30BB2AAXX080903:3:33:187:1565#0
-AAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAATGGGGTGGGTTTTNTTATCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((''('"""""##""
- at 30BB2AAXX080903:3:56:380:1065#0
-AAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGGATAGATCGGAAGAGCGGGTACTC
-+
-67777788888888888888888877776+55443222100/..----,,++%**+)))()((((''%&#"""$"#
- at 30BB2AAXX080903:3:46:1066:1736#0
-AGATTATTAGTATAAAAGGGGAGATAGGTAGGAGTAGCGTGGTAAGGGCGATGAGTGTGGGGAGGAAGCGCTNTCT
-+
-67777788888888888888888877776555443220100/..----+,,++***)*)))((('('"$&#""##"
- at 30BB2AAXX080903:3:52:1124:1136#0
-CACCCCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAAGCCGCACA
-+
-677777888888888888888888777765554&3222110//-.--++,+++****))))))((('$"$#$%#"#
- at 30BB2AAXX080903:3:34:110:464#0
-CCATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATAGATCGGANACGCACNN
-+
-67777788888888888888888837776555443222100//..---,,,,+***))))))(('('"$%##"#""
- at 30BB2AAXX080903:3:37:539:1043#0
-ATTCCTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCCTTTAGATCGGAAGAGCGTCGCCATN
-+
-67777788888888888888888877776555443222100//-.---,,++++***)*))(()(('$#""##"#"
- at 30BB2AAXX080903:3:46:69:748#0
-CTCCCCACACTCATCGCCCTTACCACGCTACTCCTACCTATCTCCCAGTTTATACTAATAGATCGGACGTGTCACA
-+
-67777788888882888881888877766+554332)2100///.-,+,,+,+**'))))*(()(''"""$"#"#"
- at 30BB2AAXX080903:3:48:1478:2035#0
-CAGAAATTAAGTATTGCAACTTACTGAGGGCTTTGAAGGCTCTTGGTCTGTATTTAACCTAAATTTCTCTCACTGC
-+
-677777888888888888888888777765/54432121/0-/..-,--,++**+*)&((((((((&$$"&##"""
- at 30BB2AAXX080903:3:33:14:352#0
-AAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTGTAACAGCTAAGANGCTCCGNN
-+
-677777888888888888888888777765/5443222100//..---,,+++***)*)))((''('""#"#%#""
- at 30BB2AAXX080903:3:50:1411:1901#0
-TAATTTCTGTAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTACACAGCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((''"$"%""#"#
- at 30BB2AAXX080903:3:45:88:1797#0
-TAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGCTCAGTTGGGGCAGAGTGGGGGATTGGTGTCCGTAAGACCA
-+
-6777778888888828888878887723.5644/3$2200.//,..)-,%,&+*+**)#))&&(('#$"#""""##
- at 30BB2AAXX080903:3:60:1442:1089#0
-AGTAAGGGCTTAGCTTAATTAAAGTGGCTGTTTTGTGTTTAGTTGATGGAGGGTGGGGGTTTGGAGTCCACACANN
-+
-677777888888888888885888777765$3443)0'1&0//-,'--',,(+$**))&((((##(#&&%%%$%""
- at 30BB2AAXX080903:3:41:812:687#0
-TAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGGTTTGCAGTCCTTAGCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))&*)(((''%'%&&%%#"
- at 30BB2AAXX080903:3:47:458:87#0
-CTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCAGATCTGGTC
-+
-6777778888888888888888887777655544322211///..---,,+++)***)))*)(((('"$#"$"""#
- at 30BB2AAXX080903:3:39:1111:330#0
-CATTGGTCTAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGTTTTGCACA
-+
-6777778888888888888888887777655542322210///..-,-,+++++*))*)*()#('('"&%&%$###
- at 30BB2AAXX080903:3:51:1251:670#0
-AAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCCCTTACTAGACCCACGTATAC
-+
-67777788888888888888888877776555.4300210///.-.-,,,++****)()))')('('"%$""""##
- at 30BB2AAXX080903:3:54:629:1186#0
-AAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCCCTTACTAGACCACTGGTCCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))()((''%$#$$"$#"
- at 30BB2AAXX080903:3:46:77:1630#0
-TTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAAGATCGGAAGAGCGAGCCAGCC
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))))((''$""#$""#"
- at 30BB2AAXX080903:3:34:1763:1024#0
-TAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCNCGCAACNN
-+
-677777888888888888888888777765554432.2100//-.-,-,,,++*+*)*)))))((''""#%"#$""
- at 30BB2AAXX080903:3:43:397:1064#0
-ACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAATCACCCTAATCAACTGGCTTCAATCTACT
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(((''&&$&&%#$$
- at 30BB2AAXX080903:3:37:896:467#0
-GGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTAAGTATCATTTTN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))(((((''"#"""%"""
- at 30BB2AAXX080903:3:57:1211:65#0
-CGGCGGCGGGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTGTCACTC
-+
-677777888888888888888888777765555432221/0/..----,-,**'**)*()')(((('$&#"$##"#
- at 30BB2AAXX080903:3:48:1192:944#0
-CACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCTACGTCTACCTCCGCCGCGCGCATACA
-+
-6777778888888888888888887777654-4/322210/.'..*--*,+$#*+*%))'&)((('&$$"$"#"##
- at 30BB2AAXX080903:3:56:1047:1363#0
-TTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCTGCACCAA
-+
-677777888888888888888888777765554430211/0/./..--,-,++**))**('((((''&#%#"$#""
- at 30BB2AAXX080903:3:37:1724:47#0
-GGCTTCTCCCGCCTTTTTTCCCGGCGGCGGGAGAAGGAGATTGAAGCCAGTTGATTAGGGGGCGTAGCTCCTTCNN
-+
-677747.888888(83888888.89773644"0$'0#'/$#+.('+(($*$$'$&''')(#'#####$"##"$"""
- at 30BB2AAXX080903:3:52:1184:657#0
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGAGAAGCCCCGCGCGCCG
-+
-67777788888888888888888877776555443232100//..---+,+,+***)**))')('''$"$""%##"
- at 30BB2AAXX080903:3:51:1230:864#0
-ATATTGAATTGCAAATTCGAAGAAGCAGCTTCAAACCTGCCGGGGCTTCTCCCGCCTTAGATCGGAAGAGCCACTC
-+
-6777778888888888888888887777655544321210///..---,,,+++****))()((((("""#$"###
- at 30BB2AAXX080903:3:46:1668:1540#0
-TAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGTGATTTTCATATTGAATTGCAAACAGGTCGC
-+
-67777788888888888888888877776555443222100/...,--,-,+++*)**)(()((((%&$"$"##"#
- at 30BB2AAXX080903:3:8:1784:1757#0
-TTTGCAATTCAATATGAAAATCACCTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATCGNGACTCANN
-+
-67777788888888888888888877776555443122100//...--,-+,+***))*)())(((&""#%#"$""
- at 30BB2AAXX080903:3:44:1415:1957#0
-TTGCAATTCAATATGAAAATGACATCGGAGCTGGTAAAAAGAGGACGAACCCCTGTATTTAGATTTACAGTCGAAT
-+
-67777788888888888888%882567765.544202.010//-+(+-,%+'(***(*(*)))(&('&#&"#""#"
- at 30BB2AAXX080903:3:42:295:1373#0
-AAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGAGATCGGAAGAGCGGCTC
-+
-67777788888888888888888877776555443211110//..--,,,,++*****))))(((''$$%"""#"#
- at 30BB2AAXX080903:3:49:1576:617#0
-AGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCTCTTTTTACCAGCTCCGAGGCGATTCTCACGATC
-+
-6777778888888888888888887777655544312110///..---,,+++***)))()(#(%&'$$%"#""""
- at 30BB2AAXX080903:3:57:369:435#0
-AATATGAAAATCACCTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&%#&$$#"
- at 30BB2AAXX080903:3:33:190:1463#0
-CTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTCAGCCANCGACACNN
-+
-67777/888888888888888888777715553432201/0//.---,,,+++*****)))))(('&"$""%#$""
- at 30BB2AAXX080903:3:49:1021:1332#0
-TCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTCAGCCATGTTATCCTA
-+
-67777788888888888888888877776555443222000///.-,++,+++**)**))())('''"$###$$##
- at 30BB2AAXX080903:3:42:893:907#0
-GGTGAGGTAAATTGGCTGAGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCAGATCGGAAGAGGGATT
-+
-67777788888888888888888877776559443222100//..--,-,-++***)*)))))(((&'$##"""""
- at 30BB2AAXX080903:3:53:849:2016#0
-CATCAGTGGGGGTGAGGTAAAATGGCTGAGTGAAGCATTGGACTGTAAATCTAAAGACAGGGGTTAGGCCCGCCAC
-+
-677777888888+888888888887'1765+5443+22100/...---,,+++*+**')))))'(('$##""##"#
- at 30BB2AAXX080903:3:45:127:30#0
-CGGCGAACATCAGTGGGGGTGAGGTAAAATGGCTGAGTGAAGCATTGGACTAGATCGGAAGAGCGGGGACCGCGTC
-+
-677777888888888888888888777765554430221/0//..---,,+,++(')*#))()(('&""#$"$#"$
- at 30BB2AAXX080903:3:40:352:1876#0
-TGTCTTTAGATTTACAGGCCAATGCTTCACTCAGCCATTTTACCTCACCACCACTGATGTTCGCCGAGCGCTGAGT
-+
-67777748888888888%88888877776551442220100/,,,+,+,&++****('*(('(((('"%""%"#""
- at 30BB2AAXX080903:3:3:164:593#0
-TTTAGATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTAGATCGGAAGCNCGCANCA
-+
-67777788888888888888888877776552443221010./.--,-,,+++***)*)))))((''%"#"#$"$$
- at 30BB2AAXX080903:3:54:403:464#0
-TTAGATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGACGTTCTCCGAGATCGGGCGGGCCT
-+
-677777888888'8888888888877716+5144321'000//.'--),(+'(***)$)(((&('(%""#&%#"#"
- at 30BB2AAXX080903:3:42:768:1099#0
-ATTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGACGCACGTTGCCTATGTCATCN
-+
-677777848888888888888881774763555132201&../-.-,+,+$,+*#')$#))#(((&''%"##"%$"
- at 30BB2AAXX080903:3:40:1342:1732#0
-CAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCAACTGATGTTCGCCGACCGTTGACTATAGATCTGAGTGT
-+
-67777788888882888888888877776555412222100//-..,-,+,++)**))))))(((''$%&&$"$##
- at 30BB2AAXX080903:3:47:1572:1922#0
-CAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTCTCTATG
-+
-67777788888888888888888877776555443122100/....--,,,+++**))))()(((''&###$"""#
- at 30BB2AAXX080903:3:50:61:1006#0
-TGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGGGAGGTAAAATGGCTGAGTGAAGCCACGAG
-+
-67777788888888888888888877776555442222100//..-*-+,+%+***)))()(((('(""#""#"""
- at 30BB2AAXX080903:3:45:1090:1187#0
-CCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACCCCCCAGCG
-+
-6737738888888888888888887725+3554430)2&/0./-..+-,++,)&+)()&()((((&%$#"#%"#""
- at 30BB2AAXX080903:3:50:585:1947#0
-ACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGCCACTGGA
-+
-67777788888888888888888877776555443222120//...--,,,*++**))*)()((('("#$"$#""#
- at 30BB2AAXX080903:3:49:53:1508#0
-TTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACTACACCAC
-+
-67777788888888888888888877776555443222100//..,.-,,+++*+**))))((((('%""#"###"
- at 30BB2AAXX080903:3:48:538:966#0
-CCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCCGTTGCA
-+
-67777788888888888888888877776555443222100//...---,,+++**)()))((((&'&&#&"""#"
- at 30BB2AAXX080903:3:38:801:238#0
-ACTGATGTTCGCCGACCGTTGACTATTCTCTACAAAACACAAAGACATTGGAACACTATACCTATTACACGACCNN
-+
-64777382888880888888888,76+765+5443.)2100/.----(,,+,+***))()()(((&'&"%#"#"""
- at 30BB2AAXX080903:3:42:47:418#0
-TGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACACTATACCTATTATTCCGCACTGC
-+
-67777788888888888888388877776555441222110//..---,,+*+)**))()))((''&"""#"#""#
- at 30BB2AAXX080903:3:57:730:1510#0
-CTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGAGATCGTGAGAC
-+
-67777788888888888888888877776555443222100//...--,,+++***)*))()(((''"%%$##"##
- at 30BB2AAXX080903:3:44:1477:365#0
-CGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGGAACACTATACCTATTATTCGGCGCATTCGTCCGT
-+
-67777788888888888886888876776555443222100//..---,,,++**))*))))()((("$""""#""
- at 30BB2AAXX080903:3:39:1156:1677#0
-CTCCAGCTCATGCGCCGAATAATAGGGATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGCGCACC
-+
-67777788888888888888888877*76555443032000/...--,,,,++++*)*)))()('&'''%$%$###
- at 30BB2AAXX080903:3:36:214:1816#0
-AGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTCACGCGCNN
-+
-67777788888888888888888877776555443222100//..---,-+,+****))))((((''&$$"$##""
- at 30BB2AAXX080903:3:2:1682:418#0
-GAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTAGNACGACAC
-+
-67777788888888888888888877776555443222100./..-,--,,*+*+*)))))()((''%"""#####
- at 30BB2AAXX080903:3:2:1372:359#0
-AGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCNGNCACAC
-+
-6777778/8888888888888886767765555423202$0/.,..,--,+'+**)())(&'(('''&"&"%%###
- at 30BB2AAXX080903:3:39:1040:410#0
-CACAAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAACCCTCCTTC
-+
-67777788888888888888888877776555443222100//...--,,+,+*****)))))((('"$%&&%%#"
- at 30BB2AAXX080903:3:39:1680:1963#0
-CGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCAC
-+
-67777788888888888888888877776555443221100//-.-,-,,+++*+*)*)))(((((%&&#%$#%"#
- at 30BB2AAXX080903:3:52:20:726#0
-GACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCCTGTTCAGT
-+
-67777788888888888888888877776555443222100//..--+,,++++**)**(((((((%&$"&#$"""
- at 30BB2AAXX080903:3:3:909:532#0
-CTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTGATGAGATCGGAAGCGCGGGTCNACAANAA
-+
-6077778888888888888888887747635'44322110,.+..+-,-,*+*)#**#))#&('(#'""##"#""#
- at 30BB2AAXX080903:3:3:179:1209#0
-GCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATANCGACNCC
-+
-6777778888888888888888187797652534322-00///.,.,,+-+++***)*())'('(#'$"%"##""#
- at 30BB2AAXX080903:3:44:1147:1236#0
-GGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAGATCGGCCGGGCG
-+
-677777888888888888888888777765524132221000/..---,,++++***)))))((('''&"#"""##
- at 30BB2AAXX080903:3:35:1596:2018#0
-TACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCNGGCTGACN
-+
-67777788888888888888888877476/./843.,,11,+.),,,'+++(%+')(#'&(#&&%&#"""$""##"
- at 30BB2AAXX080903:3:39:908:1960#0
-TACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCAGATCGGAAGAGCGGATCCGTCTG
-+
-677777888888888888888888777763/5343021201/..,,,*+,+'****'*)('(((#('"&%%%##$#
- at 30BB2AAXX080903:3:40:680:1828#0
-TATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCAGATCGAC
-+
-6777778888888888888888887777655544322210.//.---,,,+++***)())(((((('&""#$&%##
- at 30BB2AAXX080903:3:47:667:1328#0
-TATTATTCGGCGCATGAGCTGGAGGCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCACGTCAGC
-+
-677777888888888888888888777765554432-21000/..-,-,,,+++*)()()&))&(''""#$##"""
- at 30BB2AAXX080903:3:51:257:683#0
-GATTCGGCGCATGAGCTGGAGGCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCGGGGCCAGTTGCATAG
-+
-677777888888888888888,8877776555443222101/&..,,,,,++***)*(*)('((#'&$"""#""##
- at 30BB2AAXX080903:3:35:1366:1330#0
-ATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGNCTGTCTGN
-+
-6777778888888888888838887777655541322212///..----,+++***))((('(&'&'"&&&&$#""
- at 30BB2AAXX080903:3:35:986:1201#0
-AAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTNCTCTCCAN
-+
-677777888888888888888888777765/544322210//...--,-,,+++*)))((((((((("$#%"$##"
- at 30BB2AAXX080903:3:37:555:1743#0
-GCGCAGGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCCCCATCTN
-+
-6777778888888888888888887777465141*.-0+//..---,,,++)++**(*)%(((('''$"##$$##"
- at 30BB2AAXX080903:3:39:1568:407#0
-CCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGAGATCGGAAGAGCGCGGCC
-+
-67777788888888888888888877776555443-/0000/...,--,,++**+)*)*)'(((&''"%"%$#"##
- at 30BB2AAXX080903:3:4:238:855#0
-ATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCNCTCANAN
-+
-677777888888888888888888777;655348322210//..---,,+,++*)))*((()((('%%"#"&#"""
- at 30BB2AAXX080903:3:35:1230:663#0
-TGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTCGGCCAGCCAGGCAACANCCCTCCAN
-+
-6777778888+888888888888877736)51443212100/.-),.-,-&++*#)*&)()&(((''"$%#"$$#"
- at 30BB2AAXX080903:3:59:1168:1739#0
-TTACCTAGAAGGTTGCCTGGCTGCCCCAGCTCGGATCGAATAAGGAGGCTTAGAGCTGCGCCTAGAGATCACACGC
-+
-677.7.88-88888888888882,2%7,60/.30*%2-&'&+.&.,--&++'+$*&))'(#'(#(&'%"$"$&%"#
- at 30BB2AAXX080903:3:3:1564:1104#0
-GCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCCNCATANGN
-+
-67777788888888888888888877776542423222,0/0.+---+,-*+**)*())'''#''&&$"####"""
- at 30BB2AAXX080903:3:34:1627:1973#0
-TGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTANGGCTAGNN
-+
-677777888888888888888888737765554412220201/--..-+++,'*)**'((##'''''"""%"#"""
- at 30BB2AAXX080903:3:39:1438:1738#0
-TGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTACCCNA
-+
-67777788888888888888888877776555443222000-/..---,,,+***))*)''((((('"%%%$#""#
- at 30BB2AAXX080903:3:58:700:1027#0
-GTCGTTAACTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGATTAGAGCTGTGCCCATGCACTCC
-+
-6777278/88881888*888837876-7655644*.00/#,'#*',-+-+,*+&)')))&'(#(##%""%%"$###
- at 30BB2AAXX080903:3:43:1426:1344#0
-GAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTCATAGGTAGCGCGTA
-+
-67777788888888888888888877776555343222110/-.-.+,$,++*)+()(#)'#&(&&%""#%%"""#
- at 30BB2AAXX080903:3:55:512:1206#0
-TGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGATCGNGAGCGACG
-+
-67777788888888888888888877776555443222100//..-,--,++++**)*)))(()((&"&$&""##"
- at 30BB2AAXX080903:3:47:226:570#0
-GATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGAGCTGTGACCAGT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))()((('''$$%"####"
- at 30BB2AAXX080903:3:2:743:1397#0
-GTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGACNCGTGACA
-+
-6777778888888888888888887/776555441220./.-.+-.-,),*%)')*))'()%#''&'""$$""$""
- at 30BB2AAXX080903:3:46:665:230#0
-TGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGAGGCTTAGCGAGGTGCG
-+
-67777788888888888888888877276555443222000+//+--,,+,+'))))))())'#'&'$""""####
- at 30BB2AAXX080903:3:8:1383:1016#0
-CACAGCTCTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACNTCTACTNN
-+
-6777778888888888888888887777655544322210..-..-+-,,*++**))))('(('%&'""$""#"""
- at 30BB2AAXX080903:3:37:1138:1483#0
-ACGTGGTAGATGTGGTCGCTACCTAGAAGGCTGCCTGGCGGGCCCAGGGCGGCTCGGATAAGGAGGGCTNGNCGCN
-+
-677057888/88888888/88188773763''4232221&0//)-,-)&+++((')))((((('((#%$"&"##""
- at 30BB2AAXX080903:3:43:162:1401#0
-TAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAGATTGGAAGCGCGGGTT
-+
-67777788888888888888888877776555443212100//.,--,,-,*+***))()('#('''&"%""""""
- at 30BB2AAXX080903:3:50:1229:481#0
-TAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCAGATCGGAAGACCCCNCCT
-+
-677777888888888888888888777765554432221000/..-,+,,,+++***'*(')(((%'$"""$"##"
- at 30BB2AAXX080903:3:54:743:78#0
-TCTAAGCCTCCTTATGCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGGAACGACCACATCTACGTCGGTACT
-+
-677777888880188%8888848877-7653544122110./..,++&'+,$*)')*)('((#''#%""$"$"""#
- at 30BB2AAXX080903:3:52:263:1742#0
-CGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCGAATAAGGCTGCNTGC
-+
-67777788888888888888888877776555443022000//..--+,,*+)*)**(&()''''''"$"#$""##
- at 30BB2AAXX080903:3:1:486:576#0
-TAAGCCTCCTTCTTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACNGANCACT
-+
-67777788888888888858888877776355-8322.10/-/.--,,-,,++**)()())()('''&""""$###
- at 30BB2AAXX080903:3:46:1637:1322#0
-TAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACAGATCGGACCAGTTCTC
-+
-6777778888888888888888887777655544322210///..---,,,++***)*)))))('('"""$#####
- at 30BB2AAXX080903:3:36:1640:417#0
-TGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGGCTCCGNGTCACGNN
-+
-6777778881888888888888887877655145323210../..+,-,,-+)+*&))#)()(#'#'"""%#$"""
- at 30BB2AAXX080903:3:54:256:1201#0
-TGTGACGATAACGTTGTAGATGTGGGCGTTACCTAGAAGGTTGCCTGGCTGGGCCCGCTCGGCTCGCGNATGGATA
-+
-6777778888888888888888887%77'57-4/320.10#./#.',-+(++%()#((#&#(###'%""#"#""#"
- at 30BB2AAXX080903:3:41:1234:1246#0
-CTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCTTCCACA
-+
-6777778888888888888888887/776525243.1/0110..-.,,-++++*)*())((((('''$%""###""
- at 30BB2AAXX080903:3:44:1669:1394#0
-CTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTAGTGGTGACT
-+
-67777788828888888838888/777764554332%/.011-.,,-,,-**+**))()(()&(&''"#&#"""#"
- at 30BB2AAXX080903:3:1:1244:906#0
-GGGCTGTGACGATAAAGTTGTAGACGGGGCCGTTACCTAGAAGGTGGCCTGGCTGGCAGAGCGGAAGANACNCAGC
-+
-677777888888888&8-088888$7$76'754$30-21/)//.,+*,,,+,+&'*'()('&((%&'&"$$"##""
- at 30BB2AAXX080903:3:42:1260:86#0
-ATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCCCGAGCACAGCG
-+
-677777888888888888828888777745514432121..//..-)++-+&++****)*)'((#('"&%###"##
- at 30BB2AAXX080903:3:2:304:203#0
-TTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCAGANCGCNNAC
-+
-6777778888888888/48886887871.575141520101/..-,,--+++***))()))')''''$"#&""""#
- at 30BB2AAXX080903:3:38:1053:520#0
-TTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACCGCTCCTCT
-+
-67777788888888888882888377776552412220100/...---,,+++***)()))((((''"$%"&"#$#
- at 30BB2AAXX080903:3:46:136:456#0
-GCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGGCTGGCTGGAGATCGGGACCACGGG
-+
-677777888888888888888888777765554422221(0//..---),++++**))))#()(('&$"#$#%""#
- at 30BB2AAXX080903:3:50:490:337#0
-GCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCGCCCACCG
-+
-67777788888888888888888877776555413212100/..-.--*,,,+)+**())'))'('%"#"#""##"
- at 30BB2AAXX080903:3:35:487:455#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCNCCATATCN
-+
-6777778888888888888888287777655544102020./,..--,,$,,')*)*((()'#('&'""$""###"
- at 30BB2AAXX080903:3:46:497:1571#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGAGATCGGAAGAGTGTGGGTG
-+
-6777778888888888888888887777655544222210,....---,&,+)**))*((#))''(&'"""$""""
- at 30BB2AAXX080903:3:4:1621:1090#0
-CGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCNCCTANCN
-+
-67777788888888888888888877776559442202200./.-,,,+,,+++*&)))((''('''""#"%""""
- at 30BB2AAXX080903:3:52:417:1814#0
-GAGCCGAGCTGGGGCAGCCAGGCAACGGTCTAGGTAACGACCACATCTACAACGTTATTGTCACAGCCCCGGGAGC
-+
-677777888888888888.888$877($6'52-4.32'10/1/.,+&+,+,)'+**)*%)'()(&'#%##""#$"#
- at 30BB2AAXX080903:3:35:262:1346#0
-GAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGNCCTCTCGN
-+
-67777788888888888888888877776555443222100//..---,,+,++***))))(()(('""$##"#""
- at 30BB2AAXX080903:3:53:124:1929#0
-ATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGATCTG
-+
-67777788888888888888888877776555443222100//..-.-,,+*++****))'))%(''$""%###"#
- at 30BB2AAXX080903:3:42:636:1959#0
-AGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATAGATCGGAAGAGCGAGACAC
-+
-67777788888888888888888877776555442222100//-.-.-,,,++*+**)))'(('(((&&%#$"#"#
- at 30BB2AAXX080903:3:37:611:1961#0
-GAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGATCCCAATCN
-+
-67777788888888888888888877776555443222200//..---,,+++***)*)))))((''"$$##""#"
- at 30BB2AAXX080903:3:57:1032:83#0
-GCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCACACA
-+
-67777788888888888888888877776555443222100//..---,,+,++*+))()()()(((&&&%$$$#"
- at 30BB2AAXX080903:3:34:1365:178#0
-TACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTNCTCGTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"""#"#$""
- at 30BB2AAXX080903:3:45:791:1839#0
-ACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCGTAGTAAA
-+
-677777888888888888888888777765554432/00-//..--,-,,,)+*)*))))(%(((('""#"&$$""
- at 30BB2AAXX080903:3:1:160:605#0
-TAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAAGATCGCNCANCACA
-+
-67777788888888888888888877776555413222000//./---,-+*+***)*))))()('&""%""#""#
- at 30BB2AAXX080903:3:1:1672:271#0
-ACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACACNCCNTACA
-+
-677777888888888888888888777;65522432/2100/./.----(+,**+')**))))(('#'"%#"##""
- at 30BB2AAXX080903:3:56:996:480#0
-CACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCCATCAGATCGACGC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))))(('&&#%""$""
- at 30BB2AAXX080903:3:37:685:525#0
-AAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACTGTCTCN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('$$%%"#"#"
- at 30BB2AAXX080903:3:3:273:607#0
-AGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTANNGACNAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(((''$""##$"#"
- at 30BB2AAXX080903:3:34:1403:1812#0
-GGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAANCCCACTNN
-+
-677777888888888888888888777763554(322210-//..,---,+++*****)))))'((("$$$#%"""
- at 30BB2AAXX080903:3:58:1136:1196#0
-AGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGACATCA
-+
-677777888888888888888888777765554432221000/..---,,+++***)))))(((((&'&%"#$"#$
- at 30BB2AAXX080903:3:51:1018:1423#0
-TTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACACATGTACC
-+
-67777788888888888888888877776555443222000//-.----,,+++****))))))(('%$$#"####
- at 30BB2AAXX080903:3:36:369:1488#0
-TAATAATCTTCTTCATAGTAATACCCATCATAATCGGAGGCTGTGGAAACTGACTAGTTCTCCTAATCNCACATAN
-+
-67777788888888888888888877776555443222100/..,-$---,++***)'))%(()'('$"##%""""
- at 30BB2AAXX080903:3:34:589:162#0
-GGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGNATACGCNN
-+
-677,778888288888888888887777655544322200///./-,,--++*++**))())((((("$"##"$""
- at 30BB2AAXX080903:3:45:94:1006#0
-GGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGCAGAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(&&"&#$#"""
- at 30BB2AAXX080903:3:48:1526:961#0
-CATAGTAATACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTAGATAGACACTACTA
-+
-677777888888888888888888777765554432+110,//..---,,+++***)')))((((%'"$"#""###
- at 30BB2AAXX080903:3:59:960:752#0
-GTAACACCCATCATAATCGGAGGGTTTTGCAACTGACTAGTTCCCCCCATAAACACAGCCCCACACCAGCACAACA
-+
-67777788888388888,88).8(-.3$)$$)$$+$##$#####%&"#&$&$#$########%#&##$"%$%#$$#
- at 30BB2AAXX080903:3:37:992:1531#0
-ACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTGTCCGCAN
-+
-67777788888888888888888877776555443221001//....-,,,*+**))))((((((''""$#$"#$"
- at 30BB2AAXX080903:3:41:708:1809#0
-TCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTAGATCGGGAGAGCGGTTTATCAGCCCTAC
-+
-6.07/784884888+8888&8.)0#2279/)32&-$/-../-,#+.()+()')(#%'#)&'''%###%""###""%
- at 30BB2AAXX080903:3:57:1145:842#0
-GAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGGTGTCATCG
-+
-67777788883888888888888877776555443222100//..,.--,+++****))(()(((('$&&"$###"
- at 30BB2AAXX080903:3:44:1138:131#0
-GAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGGGG
-+
-67777788884888888888888877776555443222100//.----,,,++**+*)))(()((''""$$$%%#$
- at 30BB2AAXX080903:3:52:1292:924#0
-GAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGGCACCGATTATTAGTTG
-+
-67777788888888888888888877776555443222000///.-----+++****)*))))('('"#%&%&""#
- at 30BB2AAXX080903:3:54:1266:181#0
-TAATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCCGCCCGGAC
-+
-6777778888888888888888887777655533322.10//./,.-,,,+,***)*))((((((&'"%""#&$$#
- at 30BB2AAXX080903:3:43:1141:217#0
-AATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''$&&&&%$$%
- at 30BB2AAXX080903:3:55:417:996#0
-AATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCACTCTATGCCTGTG
-+
-67777788888888888888888877779550432202000%//,,(,-,+**+*)))(())%('('$""$"%#"$
- at 30BB2AAXX080903:3:44:101:650#0
-ATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTCCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&'%&%""""#
- at 30BB2AAXX080903:3:37:1389:523#0
-GGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGGGGAAACGCCATATCGGGGTCACACTN
-+
-67777788888888888888888878776565442222000./..---,,,++***)**)((((('#%##$$&%#"
- at 30BB2AAXX080903:3:53:1503:1833#0
-GGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCTCGCCAGATG
-+
-677777888888888888888088977765551430221000/.---,*,,+++))))())((('(#""$#&#$##
- at 30BB2AAXX080903:3:47:1379:503#0
-CCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTNCCACACA
-+
-67777788888888888888888877776555443222100//..,--,,,,+****)))))))(('""$%#%%#$
- at 30BB2AAXX080903:3:44:1268:513#0
-GATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACAGATCGGACNCGCCG
-+
-67777788888888888888888877776555443222100///.---,-,,+*+**)))))(((''&$#"#"#""
- at 30BB2AAXX080903:3:3:1499:686#0
-GGCGTTTCCCCGCATAAACAACATAAGATTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATNAGCANAN
-+
-677777888888888888888888777%654544322200..-.-,+,-,+++**)*)())))(((($"$$$#"#"
- at 30BB2AAXX080903:3:58:1216:987#0
-ACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTATGCGTGTCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(()'('$&%"%"%$$
- at 30BB2AAXX080903:3:35:825:1571#0
-CTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGAAGCTTATGTTGTTTNCGCATTAN
-+
-67777788888888888888888877776555443222100/..-----,,++*****)))))((('"$"$#""""
- at 30BB2AAXX080903:3:36:435:1656#0
-TTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGTAAGAGTCAGACTCCACTTAN
-+
-67777788888888888888888877776555443222000//..---+,+++****))))))('(#"$"#%#"""
- at 30BB2AAXX080903:3:38:88:196#0
-TAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCGACACACNN
-+
-67777788888888888888888877776555443222100//..---,,,++***))))((((('%"""$$##""
- at 30BB2AAXX080903:3:43:1050:857#0
-CTTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAAGATCGGGAGGNGCT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(((((('&$$&""%#"
- at 30BB2AAXX080903:3:55:1633:265#0
-TTCTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGAGATCGGAAGAGCAACACAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'&&&%$$##
- at 30BB2AAXX080903:3:37:1273:1398#0
-CTGACTCTTACCTCCCTCTCTCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACACGGGGCACN
-+
-67777788888888888888888877776555443222100//-.--,,,,++)++*))((()'(#'$&#####$"
- at 30BB2AAXX080903:3:2:1503:893#0
-TGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGAGGGANCGCACAC
-+
-67777788888888888888888878776555443302/101/./+,,,++$*+*'*)*'(()#((#%""""&$$$
- at 30BB2AAXX080903:3:40:214:1297#0
-AGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGGAGAGAGGGCGTGACAAA
-+
-67777788888888888888888877776555443222100//..--,,,+++****)))))((''&'&""##""#
- at 30BB2AAXX080903:3:1:854:1236#0
-AGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGTAGTNGCNCACC
-+
-67777788888888888813888873776555443212100...--,-,,+*++****(())((&&'"""#"$#$#
- at 30BB2AAXX080903:3:35:435:1046#0
-AGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGATCGGAAGANGTCATCTN
-+
-6777778838888888888888887748652331521120.-..-+-,+,,+**'*()(''(('(''"""####""
- at 30BB2AAXX080903:3:3:830:1973#0
-CTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGAGCAGGAGCNCGCNNAT
-+
-6777778888888888888488883771655342020/1/0*..-.+++++++*('*()')(&((%'""%#"""""
- at 30BB2AAXX080903:3:59:764:951#0
-TCCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTACGTAC
-+
-67777788888888888888888877776555413222100//-.---,,,+++***)*))((((''&%%$%"""#
- at 30BB2AAXX080903:3:54:1254:1712#0
-CCTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCCGCTCGTCA
-+
-67777788888888888888888877776555-43202100//.-.---,+,+****)*)(()(('&$%#""""##
- at 30BB2AAXX080903:3:42:1039:1366#0
-CTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCNACCCTCCCTTAGCAGGTC
-+
-6777778888888888888888887777655184322-/00//----)-,,+****)#)(()'((('&"&&###"#
- at 30BB2AAXX080903:3:60:917:627#0
-TAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGCGCGANN
-+
-6777778888888888888888887777655544322210///.----,,,+++***)))(()('''%$$%%$#""
- at 30BB2AAXX080903:3:37:988:540#0
-GTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCTCCGGCCTCCACTATAGCAGATGCGATCATN
-+
-67777788888888888888884877776555443222200//..---,-+++**+*)*())()((%"&%$$%%#"
- at 30BB2AAXX080903:3:53:473:1973#0
-CTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGCTATCATC
-+
-67777788888888888888888877776/5544322.000-/.--,,,,+,*)*))))('(()'''$""#$###"
- at 30BB2AAXX080903:3:59:559:1866#0
-CTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGTGCAACAG
-+
-67777788888888888888888877776.5124312-000*/.,.+,,,*,+)***()(((%(&'''""#"#$$"
- at 30BB2AAXX080903:3:33:1458:593#0
-GGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGACTGTTCAACCTGTTCCTGCTCCGGCCCCCACAGNTACATANN
-+
-677377888888888888888.88777765$5441/2-111/+.,.-,+,***)))))((&'(&'%#""#$$""""
- at 30BB2AAXX080903:3:42:1322:848#0
-TCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCCCCCTG
-+
-67777788884888888888888877778.55,4322000////-.-+,,,*+**+()))()(((''&$$#$%"##
- at 30BB2AAXX080903:3:55:1303:691#0
-TCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTACACTGTTCAACCTGTTCCTGCTCCGGCCTCACNCATTCAC
-+
-6777778088888888888888887777655544*2121/0*/+--++,,)+*)*)()')(('#''#$""$""#""
- at 30BB2AAXX080903:3:44:55:294#0
-AGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCAGAGCGGTAGA
-+
-677777888888888888888888777565554432.2100//..--,+,+++*+****)))(((('&"%&$""""
- at 30BB2AAXX080903:3:4:950:976#0
-GGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGTGGGTAGACTGGTCAACCTGTTCCTGCTCCGANTTCANCN
-+
-677777888888818888838888577765531432#210&./.---',,,*()'*()''((#'#''$"""$#"#"
- at 30BB2AAXX080903:3:36:1168:1309#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCAGATCGGAAGCTGCCACAN
-+
-6777778888888888888888887/7765554422221/0//,.---,,+++*+*'()))(()#('%"%""###"
- at 30BB2AAXX080903:3:57:1531:568#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGTTCAACCTGTTCCTGCACACAGCACA
-+
-6777778888888888888888887777655544+222100//..--,,,*++****)))))(((('$$%&#"###
- at 30BB2AAXX080903:3:57:165:1536#0
-TACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGACTGTTCAACCTGTTCCTGCTCCACCCGCA
-+
-677777888888,888888888287771655544+3221*0//+--,*,,$+))*'(((%('(('''&&"$"""$"
- at 30BB2AAXX080903:3:1:1406:1095#0
-TTAGGTCTACGGAGGATCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGAATGATCAATCTGGCNTCNCTCG
-+
-677777888888888&88868-8+*777655-40321/&1/).,--((,,&++*''*(#('&#'%'#%"##"$%$#
- at 30BB2AAXX080903:3:3:857:183#0
-CAGGAACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACNTCACNCN
-+
-6777778888888888888888887777955541321200///..,*,-,*+++**)')((((('(''"#&%#"$"
- at 30BB2AAXX080903:3:46:206:1832#0
-ACAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++**+*)*))((((('&&$"&%###
- at 30BB2AAXX080903:3:46:369:828#0
-CAGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCACCTCTAG
-+
-6777778888888888882880887777655504/02.11//..,-,,,+,'+*))*$(((&'((&%$""%###"#
- at 30BB2AAXX080903:3:52:1100:878#0
-AGGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCAGATCGGAAGAGCGCGAGATC
-+
-67777788888888888883888877776555443222200//-..--,,*,++*)*&))))(((''%%#""""#"
- at 30BB2AAXX080903:3:46:346:359#0
-GGTTGAACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAAGATCGGAAGAGCGGGTCACGAGTCTGC
-+
-6777778888888888888888887777655544302210///.'.-),,-+++*)*)))())#(('%"#""#"##
- at 30BB2AAXX080903:3:58:1385:723#0
-AAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTAGACTGATCACA
-+
-6777778888888888888888887777655544321210//...*,+,,+,+*)*)**())(#(('$$%##$$$%
- at 30BB2AAXX080903:3:34:1668:795#0
-TAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGGAGNTCTACTNN
-+
-6777778888888888888888887777655544322.100//..-,-,+,,+***))*)))((&('"#$"###""
- at 30BB2AAXX080903:3:50:1187:1260#0
-ACAGTCTACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTGACACT
-+
-67777788888888888888888867776355443022100//-.---,++++***)*&)*)(((('$%#"#$#$"
- at 30BB2AAXX080903:3:41:1274:1572#0
-GGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGCTTGACTTC
-+
-67777788888888888888888877776555440*11100-/..,-,,,&,)''*)('%()(('('"$"""%""#
- at 30BB2AAXX080903:3:47:783:1424#0
-GGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGGGAGGGTCATAGCG
-+
-67777788888888888888888877776555443221100./...-+,,,,****))*(())('(($"$""""""
- at 30BB2AAXX080903:3:59:926:588#0
-CTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTAAGTGGCGTCC
-+
-677777888888888888888888477763554432021/0..----',,,*+)**()(((()((&&'"""#""##
- at 30BB2AAXX080903:3:45:1637:86#0
-ACCCTCCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTAGATCGGCGTAG
-+
-6777778888888888888888887775655.440222/00.,,-,-,),*+*())'$((((''(''"$%""""#"
- at 30BB2AAXX080903:3:47:205:443#0
-ACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGTTCCCTGCTGAGGGGAGG
-+
-67777788888888888888888877776553443222100//...--,,++++***)(()()((('$$$"#"#""
- at 30BB2AAXX080903:3:36:18:269#0
-CCCTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCAGANTCTCATGN
-+
-67777788888888888888888877776555443222000//.+----,++++**)))))(()(('""$###"""
- at 30BB2AAXX080903:3:3:1006:1559#0
-CTTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCACNTCCANAC
-+
-67777788888888888888888877776555443.2210/1.---.,,,+++*+*)(*(((('(''"""#"#"##
- at 30BB2AAXX080903:3:50:115:49#0
-TTAGCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGATCTGTGGTGCT
-+
-67777788888888888888888877776555443222100./..---,,+++***)))))((('''$$#"""#$"
- at 30BB2AAXX080903:3:53:44:1998#0
-AGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGCGTGGTTGAGTGTGTA
-+
-67777-88888888,88)8/8188&7776525113222+'//,,/--+%+*')*+)%))(#)'#&%#""$###""#
- at 30BB2AAXX080903:3:43:958:344#0
-GATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGTAGACTCCT
-+
-6777778888888888888888887777655544232210///-.---,,+,+*+*)(*))'(((('""%"%####
- at 30BB2AAXX080903:3:50:217:332#0
-GATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGGAGCAGCTCGGC
-+
-67777788888888888888882857776554443222100//..---,,+++***)))))&(('&&&%#%"$""#
- at 30BB2AAXX080903:3:51:566:1759#0
-AGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGAGATCGGAGGGCTCGC
-+
-67777788888888888888888877776555443222100//...--,,+++*++*)&)())('('""""$#"##
- at 30BB2AAXX080903:3:41:823:1457#0
-TAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAAGATCGGCAGCACTG
-+
-677777888888888888888888777765554422201000/-.--,,-++++**())(())((''"$"#""$""
- at 30BB2AAXX080903:3:8:773:1334#0
-TAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCAGGGTGGNCATCACNN
-+
-67777788888888888888+88877776655443222100%///..-+,++*+*+))))((((#'&"$""%$#""
- at 30BB2AAXX080903:3:33:179:1759#0
-AACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCAGGTGTCTCCTNTCTAGTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))()((((('""%$#"#""
- at 30BB2AAXX080903:3:43:1414:1126#0
-CTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTAAGATCGGAAGAGCGGGGCAGCGGCA
-+
-67777788888888888888888877576555463222100/)..--'+,+,+*))**())()'((&"$"%""##"
- at 30BB2AAXX080903:3:45:202:768#0
-TGGCAGGGGGTTTTATATTGATAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACCTGCTGGGGG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&&$#$%$$$
- at 30BB2AAXX080903:3:4:1436:690#0
-TATGGCAGGGGGTTTTATATTGATAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACNATCANCN
-+
-67777788888888888888888877774555.4522120,//.---++(,$)*+)(*))))'((&''"#"$""#"
- at 30BB2AAXX080903:3:3:492:1707#0
-ACGAAGAGGGGCGTTTGGTATTGGGTTATGGCAGGGGGGTTTATATTGATAATTGATATCGGCAGAGGNGAATNTG
-+
-6717470888888/88880-73161'2++3/+)113/-($)'&(%&&&$$$$#$#####&%###%##""#""""$$
- at 30BB2AAXX080903:3:49:466:1218#0
-GGACGGATCAGACGAAGAGGGGCGTTTGGTATTGGGTTATGGCAGGGGGGTTTATAAGATCGGGAGAGCGTGAGNA
-+
-67777788888888888888888877776355443222100/./.---,,+++&*()))(#((#'(#&#$""$"""
- at 30BB2AAXX080903:3:1:615:635#0
-ACCCCCTGCCTTAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACNTANCCCC
-+
-677777888888888888888488/7776,5343322210//...,-,-+,)++)*)*)())#(('''""#"$##"
- at 30BB2AAXX080903:3:35:1367:717#0
-AGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGAGGGGCGTTTNGACTCTAN
-+
-67777788888888888888888877776555443222100//..-----+++***)*)*)((('''""######"
- at 30BB2AAXX080903:3:1:563:663#0
-TAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGAGGGGCGTTTNCANACAC
-+
-67777788888888888888888877776355443222100//..---,+,++****)*)))((''(&"%#"####
- at 30BB2AAXX080903:3:46:380:1812#0
-TACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGCTCTAGCTG
-+
-67777788884088888883888,7/275/2534322-00///*,,,,,,*$+**+))()((('((%""%%"$###
- at 30BB2AAXX080903:3:33:1344:1817#0
-TGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAANCCATGTNN
-+
-677777888888888888888888777765554412221/0//..-(,-,,++*)*))))))(&(''"#$"$""""
- at 30BB2AAXX080903:3:59:1002:561#0
-ATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAGACACAAC
-+
-677777888888888888888883774765553133121100/.--*-,,,(+*))*)(((()('(%%'##"$###
- at 30BB2AAXX080903:3:58:1567:1363#0
-CCCTCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCAGATCGGACACACACCN
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))((('&$$%%%$%$"
- at 30BB2AAXX080903:3:40:950:182#0
-TAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAGGAC
-+
-67777788888888888888888877776555443121100//..-.-,,++******)))((((''%##%#%###
- at 30BB2AAXX080903:3:4:994:447#0
-TCTTCGTCTGATCCGTCCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCNCACTNCN
-+
-67777788888888888888888877776543543222100//..-.-+,+,++**)*)))))('''%"#"%#"""
- at 30BB2AAXX080903:3:40:555:354#0
-TATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTAGGACGGATCAGACGAAA
-+
-67777788888888888888888877776555443222100/...-,-,,,++**))*)))))('(''%%%%&##"
- at 30BB2AAXX080903:3:41:1687:558#0
-CCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACGACCAGACGCC
-+
-6777778828888888888888887777655)443212/'0//,-',-+,,+*)***))(('(((''""#&""""#
- at 30BB2AAXX080903:3:49:699:684#0
-CCTAATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('$$"$"$"##
- at 30BB2AAXX080903:3:41:901:774#0
-TGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGAGAAGTAGGACTGCTGTAATTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''&'$$"%#"$
- at 30BB2AAXX080903:3:41:164:161#0
-AATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACATAGCGAAAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(((('%%"$""###
- at 30BB2AAXX080903:3:33:522:1104#0
-ATTACAGCAGTCCTACTTCTCCTATCTCTCCCAGCCCTAGCTGCTGGCATCACTATACTACTAACAGNACTACCNN
-+
-677727848888828838888888/.77655234%1/2/00//.---,,,+++**)(()(((((#''""&#$##""
- at 30BB2AAXX080903:3:54:603:1887#0
-AGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGAGATCGGGAGAGAGGGTTATGCTGTGCTC
-+
-6777778888888888888888887377654414*.2-.///.(,.,+,,$$%*#)(()#))(%###%$#&"####
- at 30BB2AAXX080903:3:44:71:750#0
-TACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCACCCTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((''&%%&%""""#
- at 30BB2AAXX080903:3:58:1705:1764#0
-GTGGTGTTGAGGTTGCGGTCTGTTTGTAGTATAGTGATGCCAGCAGCTAGGAGTGGGGGAGGGAGGCACACAACAN
-+
-677777888888888888888888977365251432121-$%/(,-*+)-,$#****()#)''#(('$&&$%$%$"
- at 30BB2AAXX080903:3:1:1560:1250#0
-GGTGGTGTTGAGGTTGCGGTCCGTTAGTAGTATAGTGATGCCAGCAGCTAGGACTGGGAGAGATAGGANTANGAGC
-+
-6737778888888/8888864)88287+050,3/2.1/00/+..-,.+,),)#$**))'(#('#(''"""#"""""
- at 30BB2AAXX080903:3:41:68:1446#0
-TCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACGTCCCACAG
-+
-67777788888888888888888877776555443222100//..---,,,++*+)*)))))(((('&$#$$#$#"
- at 30BB2AAXX080903:3:50:1461:1468#0
-CCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCCTCTTCGCC
-+
-67777788888888888888888877776555443222100//.----,-+++***)))))()(((%%"&""##"#
- at 30BB2AAXX080903:3:33:1562:1294#0
-CGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCTAGGACNCAGTATNN
-+
-6777778888888888888888887777655534322200.//-,---,,++++**)*))(((((('"$"""##""
- at 30BB2AAXX080903:3:54:196:734#0
-CGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGATCGGGAGAGTGTGTG
-+
-677777888888888888888888771763552422-2/0/./(,.,,,,,++)*)))')'#(('#&%##""""#"
- at 30BB2AAXX080903:3:45:1750:1587#0
-TCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGC
-+
-67777788888888888888888877776555443222100./...,,,-+++***)*))))))(('$%#%%"$$$
- at 30BB2AAXX080903:3:8:1135:912#0
-CTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCAGCNACGCATNN
-+
-67777788888888888888888847776455443522100/..,--,,,,+****))*&)((((('""#"$#"""
- at 30BB2AAXX080903:3:58:201:1044#0
-CCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGGCTGTTAGTAGTATAGTGATGAGATCGGACGACGNNC
-+
-677777888888888888888838787765454232221%0//-..--+,,++*+*)))))()((('%%%"#"""#
- at 30BB2AAXX080903:3:40:111:456#0
-CTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCAGCNACTCGCTA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)))((((''""$"$"#""
- at 30BB2AAXX080903:3:36:29:1528#0
-CCTAGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCNCATCACAN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)*(()('''"$$"%#$#"
- at 30BB2AAXX080903:3:56:221:1884#0
-CCCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGTGATGCCCGCCACCTC
-+
-62777788888888888888888827706555443020+00//.'-.-+,)+*)*#)*()()'('%#"$#""$#"#
- at 30BB2AAXX080903:3:2:878:917#0
-AGCTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGNCTCTCAG
-+
-67777788888888888888888877776555443220110//...-,+,+++*+*)))))()(((%""##$%%$$
- at 30BB2AAXX080903:3:36:596:529#0
-ATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGTATAGCAGTGTNAN
-+
-677777888288888888888888777765554412221/0//..,--,,++++***)))(((((('%$&%$#"""
- at 30BB2AAXX080903:3:50:297:576#0
-ATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAAGATCGGAAGCGCGGACCC
-+
-67777788888888888888888877776555443222100//..-.-,-++++**)))((()((''$$$""""##
- at 30BB2AAXX080903:3:49:1559:880#0
-ATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGGTGGTGTTGAGGTTGCGGTCTGTTAGTAGCTGAGCTGT
-+
-67777788888888888888888877776/554432221/0//.,---,,++++**))))()(('('$""""#"""
- at 30BB2AAXX080903:3:47:1294:1699#0
-TAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCACTCTATACCACGCACGATC
-+
-677077888888888888888888777735554432-2100/*/--+-,,+*%)))(()(((((''&"$###"#""
- at 30BB2AAXX080903:3:51:1489:315#0
-GTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGAAGAAGCTAAACACA
-+
-67777788888888888888888877776555443222100//..----,++++**))())()('(&$$#""%##"
- at 30BB2AAXX080903:3:51:385:1717#0
-CAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGGCGAAGCCCAGGAC
-+
-67777788888888888888888877776555443222100//.,.---,-++***)*)))('('#%"$"$$"##$
- at 30BB2AAXX080903:3:38:1690:1353#0
-TCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCTCCTCCGGCGGGGTCGATGTGCGCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(('((%"%"""""""
- at 30BB2AAXX080903:3:57:546:482#0
-TAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGTCTCCAGAGCGGAAGAGCNCNTCCT
-+
-67777788888888888888888877776555443222100//.-.--,,+*+***))))))(((''''"$""$#"
- at 30BB2AAXX080903:3:46:789:2021#0
-TAAGAATATAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAATGGGGAGATCGGTGGGAGTGGG
-+
-67777788888888888888888177776555243022000./,.--,-,+++***)))()(('((&"$""#"##"
- at 30BB2AAXX080903:3:2:394:1097#0
-GGAGGAGACCCCATTCTATACCAACACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTACNCTANACT
-+
-67777788888888888888888877776555443222100//.----,,++++****))))(((('""%&$"#""
- at 30BB2AAXX080903:3:34:1453:92#0
-AAGCCTGGTAGGATAAGAATATAAACTTCAGGGTGACCGAAAAATCAGAATAGGTGTTGGTATAGAANGACCTTNN
-+
-677777888888888888888888.7776555413222100//..---,,+++*****))()(((('"""$$""""
- at 30BB2AAXX080903:3:55:246:443#0
-ACAATATGGGAGATTATTCCGAAGCCTGGTAGGATAAGAATATAAACTTCAGGGTGACCGAAAAATCACTANANTA
-+
-67777788888888888888888877776555403222.00//.----,,++*'****))(((((('$""#"#""#
- at 30BB2AAXX080903:3:8:523:813#0
-TCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATACTACCAGGCTTCGGAATAATCTCCCATATNACAAGCNN
-+
-6777778888888888-88883887777655544322**0///-----,,+,*++*))))'('((''""#"""$""
- at 30BB2AAXX080903:3:8:599:1587#0
-TTCCGGAGTAGTAAGTTACAATATGGGAGATTATTCCGAAGCCTGGTAGGATAAGAATATAAACTTCNGTGCCCNN
-+
-67777788888888888888888877776555443202100/...-,-,,+++**+))))))(((('""$""##""
- at 30BB2AAXX080903:3:34:1226:870#0
-TATGTATCCAAATGGTTCTTTTTTTCCGGAGTAGTAAGTTACAATATGGGAGATTATTCCGAAGAGANACACATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))(''&"$%$&$#""
- at 30BB2AAXX080903:3:54:1498:2015#0
-ATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGTATGGTCTGAGCTATGATATACACTGGCA
-+
-67777788888888888888888877776555443222100./..--+-,,++***))()))(((('&$&#%%"$#
- at 30BB2AAXX080903:3:52:581:1722#0
-AGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTTTTTTTCCGGAAGATCGGACTA
-+
-67777788888888888888888877776555443222100//..-,-,,,++***)))))((((('&$"&&$"""
- at 30BB2AAXX080903:3:2:209:537#0
-CCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTTTTTTTCCGCNCGANNCT
-+
-67777788888888888888888877776555523220000//./-,,-+,++***))**)((('''%"$$"""#"
- at 30BB2AAXX080903:3:1:1381:1499#0
-CCGGAAAAAAAGAACCATTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGTNCTNTACA
-+
-6777778888888888888888887777655044321210.//..--,,,+,+**)*)))((''(('%"#""#"""
- at 30BB2AAXX080903:3:55:1499:1541#0
-GGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACACACACTTCA
-+
-67777788888888888888888877776555543222+0/-....--),*+')**)*)()(((('%$$%$#%#$#
- at 30BB2AAXX080903:3:37:1034:540#0
-TAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTCCACACCN
-+
-67777788888888888888888877776555443222100./..----,-++***)*)))(((('&$$%%"#"#"
- at 30BB2AAXX080903:3:45:1587:736#0
-TCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGACAATGCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$"#%%"#""
- at 30BB2AAXX080903:3:1:453:1293#0
-CTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAANCANCCTA
-+
-6777778888888888888888887777655144322200./..-.,,,,++*+**)))())(((('&""""$#""
- at 30BB2AAXX080903:3:49:1384:782#0
-TATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGCCTAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((('''&""$#""##
- at 30BB2AAXX080903:3:58:1350:1446#0
-GATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACTACACA
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))))((((('&&&"#$%$$
- at 30BB2AAXX080903:3:55:1033:839#0
-CTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCCAGTTCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()('('$$#"$####
- at 30BB2AAXX080903:3:41:176:368#0
-GGTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCAAGATCGGAAGNGCGCGTNA
-+
-67777788888888888888888877776555443222100//..---,,++++****)*)))(('&"$#""""""
- at 30BB2AAXX080903:3:51:904:1644#0
-TATGGTAGCGGAGGTGAAATACGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCCCACTCCA
-+
-67777788888888888888838877776551443+2010///(-,,+,-,++*****)()'('(%'"$#"$"""#
- at 30BB2AAXX080903:3:1:1497:1140#0
-CGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTCNCTNAACC
-+
-67777788888888888888888877876555443222100-,+,.,-+,+++***)))(''(((''$"$"""#""
- at 30BB2AAXX080903:3:59:689:75#0
-GGTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGCACGCNNA
-+
-67777788888888888888888877776555-43222100/...%,,,,-,***&*))')(('#''&$$$"#"""
- at 30BB2AAXX080903:3:49:1411:1680#0
-ATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCTCATCGCC
-+
-677777888888888888888888777765554432221000...---,,,++****())()()(('%"#""#"#"
- at 30BB2AAXX080903:3:44:1393:884#0
-GACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGAAAAATGCTCGTGTGGCTACGTCTATTCTTNCTGTG
-+
-6777778848888888888888887777655544322200&//&.,-,+,,**'*'#((')#(((''$$#"&%%$%
- at 30BB2AAXX080903:3:44:160:1236#0
-AGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGCCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(''&"###$""
- at 30BB2AAXX080903:3:41:83:549#0
-TAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGGAATATGGTCGTGTGGTNTGGCACTC
-+
-67777788888888888888888877776555443222100/-..,---,)++(*')')()'('(%%"%"#$"#"#
- at 30BB2AAXX080903:3:50:1526:952#0
-CGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGCACATGCACCC
-+
-67777788888888888888888877776555443222100//...--,,+,+**))))))((((#'%$$"%""#"
- at 30BB2AAXX080903:3:55:348:685#0
-CTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGAGATAGGCAGCAG
-+
-67777788888888888888888877776555443222100//..---+,+++*+*)*))()(('('"&%"$###"
- at 30BB2AAXX080903:3:49:1611:783#0
-CTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGCACAATA
-+
-67777788888888888888888877776555443222100./..---,,+++****)))))(((('""#"$"#"#
- at 30BB2AAXX080903:3:33:231:495#0
-TCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATNTCTATCNN
-+
-67777788888888888888888877176555445222100//..---,,+*+***)*))(((('(&"$$"#"#""
- at 30BB2AAXX080903:3:38:1647:608#0
-CCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGACACN
-+
-677777888888888888888888777165554,3222110//...-,,,+,)+)**))((('('''&$&%$"##"
- at 30BB2AAXX080903:3:43:159:718#0
-TCGCTATCCCCACCGGCGTCAAAGAAGTTAGCGGACACGACACACTCCACGGAAGAGATATGAAAAGAGATGCTGA
-+
-6777578888888888+8083888&777*5/'&23')'1/0/&..,-,,,+)*+*)&))()())(''%%""$"#"#
- at 30BB2AAXX080903:3:44:394:1454#0
-AGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGGCGGTGGG
-+
-67777788888888888888888877776555443222100//...--,,+++**)))))')((('&'$%&&"$"#
- at 30BB2AAXX080903:3:8:958:605#0
-CAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGANGCCATCNN
-+
-67777788888888888888808877776555443222100//..---,,+***)**)*)(')((('"#&%""$""
- at 30BB2AAXX080903:3:41:956:760#0
-AGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACTC
-+
-67777788888888888888888877776555443222100//...--,-+++******))(((((''$%&##$"#
- at 30BB2AAXX080903:3:50:945:627#0
-ATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCAGGCCGGACG
-+
-67777788888888888888888877776555443222100//..--,,,,++***))))))()'''$"##"#"#"
- at 30BB2AAXX080903:3:41:1134:226#0
-AAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCGTAGGCTT
-+
-67777788828888888888888877776553442222000/..-----,+++***)())))'('(''"$#&##""
- at 30BB2AAXX080903:3:42:911:348#0
-GATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAAT
-+
-67777788888888888888888877776555443221100//..-,-,,*+++**)*))))((((#%$&##%"$#
- at 30BB2AAXX080903:3:55:1413:1976#0
-CTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCACTNTTCAT
-+
-67777788888888888888888877776555443222000//--.-,-,+++***('()(()((('&$""""#"$
- at 30BB2AAXX080903:3:55:25:1257#0
-AAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGCGGGCGAGATTCG
-+
-67777788888888888888888877776555443222100//./---,-+++***))'))((''#&$%""$#"#"
- at 30BB2AAXX080903:3:2:1741:1364#0
-GACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCNATCTATC
-+
-6777778888888888888888887777635544321211//.-.,-,,,,,++*())'))(((''''"$%$##$#
- at 30BB2AAXX080903:3:57:1350:1968#0
-GAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGAGATCGGCGCACAGC
-+
-67777788888888888888888877776555443222100//..----,+++**)))*)))(((('$$$"#$#"$
- at 30BB2AAXX080903:3:33:283:1903#0
-AGGGGAAAAGAAAGATGAATCATAGGGCTCAGAGTACTGCAGCAGATCATTTCATATTGATTCCGTGNTTGCACNN
-+
-677777388888888888888)887777053524#3221-,/...,*-,,$+++%*))*(()#((&'"#""$"$""
- at 30BB2AAXX080903:3:45:57:409#0
-CCACACTCCACGGAAGAAATATGAAATGATCGGCTGCAGTGCTCTGAGCCCCAGGATTCATCTAGATCACGCAGTG
-+
-6777778888888888)88888887777655'4/3/10100/-..---,(+$+***)*'()()((('&""$""##"
- at 30BB2AAXX080903:3:52:422:719#0
-CCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTCACCACCGT
-+
-677777888888888888888888777765554432221/0//..---,,+++***)*))))(((('$"#$%%%$#
- at 30BB2AAXX080903:3:46:1470:1303#0
-TACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGNGTCAGCGG
-+
-67777788888888888888888877776555443222100//..---,-+++***)))))((((('""%#""#""
- at 30BB2AAXX080903:3:33:1090:274#0
-TCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACNCTTCCANN
-+
-67777788888888888888888877773555443222100//....-,,,++*****))))(((('"%""$#"""
- at 30BB2AAXX080903:3:1:64:885#0
-GGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGNGTNACAC
-+
-67777788888888888888888877776555443212100///.---,,+,+***)*)))))((('&""$""#"#
- at 30BB2AAXX080903:3:58:220:769#0
-AAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATCCATCTTTCTTTAGATCGGAAGAGCNTNTCNC
-+
-67777788888888888888888877776555443222100/..'---,,+++*****)))(('(''&&"#"$#"$
- at 30BB2AAXX080903:3:1:216:374#0
-CAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCNTGNGCCA
-+
-67777788888888888888888877776355443022100/..,---,,,++*'**)))))(((('$"""""###
- at 30BB2AAXX080903:3:33:1396:1247#0
-CAGTCAGGCCACCTACGGCGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGAAGATCATTTNATCTCANN
-+
--77777888888888888,888887777655544320200/./.----,,+++*)*)()')(()(%'"$%$%$#""
- at 30BB2AAXX080903:3:3:833:1687#0
-ACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCAGANCATANCA
-+
-677777888888888888888888787165554,32211/0//.---,-,+,++**)))())()(('%"$"%$"##
- at 30BB2AAXX080903:3:54:1315:1714#0
-GAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGAGATCCAC
-+
-67777788888888888888888877776555443222100//..---,,+,++**)*))()((((&&"%"#"##"
- at 30BB2AAXX080903:3:36:18:1196#0
-TACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGCTCAGAGCACTGCAGCANCCACACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('""$"###""
- at 30BB2AAXX080903:3:38:1587:1387#0
-ATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATAGATCGGACA
-+
-67777788888888888888888877776555443222100//...-,-,+,+***)*)()((((''"$%$#""$#
- at 30BB2AAXX080903:3:39:1317:1418#0
-TGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTATCTACC
-+
-67777788888888888888888877776555443222100/....--,,+**+*)))))()()(('$$###"###
- at 30BB2AAXX080903:3:8:494:1765#0
-TGCTGCAGTGCTCTGAGCCCTAGGATCCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTANAGGAGCNN
-+
-67777788888888888888888877'763.5443.20100/..,.+-+,,*+*+*)*(()((((('"$""#""""
- at 30BB2AAXX080903:3:1:432:453#0
-AGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAANCANCTCC
-+
-67777788888888888888888877776555443212110/...,,,,,+,+*+***))))(((''%"%""""#"
- at 30BB2AAXX080903:3:38:1613:1535#0
-AGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAACCTCACTA
-+
-67777788888888888888888877776555443222100/...---,-,++***)))))(()'('$$$&%#"""
- at 30BB2AAXX080903:3:43:942:1214#0
-GTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAAAGAAAGATGAATCCTAGGGGTTCG
-+
-6777778888888888888888887777655544322210.//..--+,,,,+*+*)*))))))(''&$&%""""#
- at 30BB2AAXX080903:3:49:1118:1874#0
-CCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTATGGTGCCT
-+
-67777788888888888888888877776555445222100////----,+++*)*)*))))(((''"#"""###"
- at 30BB2AAXX080903:3:52:665:1872#0
-TAGGATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACT
-+
-67777788888888888888888877776555443212101//..-.-,,+,++**)*))))))(''""#&%%%$#
- at 30BB2AAXX080903:3:36:1411:1733#0
-GTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAGATCGGATNACTGTNN
-+
-677777888888888888888888777765554432221/0//..---,,+,+++*)))))))('('""###""""
- at 30BB2AAXX080903:3:51:447:677#0
-GTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAGATGGACAGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(((''"""""####
- at 30BB2AAXX080903:3:49:1618:721#0
-CGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTAAGATCGGAGTACGC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('(($$""$"#"#
- at 30BB2AAXX080903:3:50:22:1750#0
-TCTTTTCACCGTAGGTGGCAGGACTGGCATTGTATTAGCAAACTCATCACTAGACATAGTACTACTCGTGCGTCGA
-+
-677777882888888888/888887777654524'22'+00'..,'--,(,++***)')))'()'%'&""$"""""
- at 30BB2AAXX080903:3:38:296:1167#0
-GTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGCTCACCAGA
-+
-677777888888888888888888777+655544.222100//..---,,,++**))))'(((('(&$%""""##%
- at 30BB2AAXX080903:3:45:418:120#0
-AGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCAGATCGGTCGAGCGC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))'('((($$#&"%"#"
- at 30BB2AAXX080903:3:51:258:624#0
-TTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACCCGCTCTT
-+
-67777788888888888888888877776555443222100//..---,,+,+*+*)()))())(('$"$"#"$""
- at 30BB2AAXX080903:3:51:862:1995#0
-CGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTCCNGAGCT
-+
-67777788888888888888888877776555443222200//./---,,,+++**)))))(('('%"$#""""#"
- at 30BB2AAXX080903:3:47:435:968#0
-GTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGAGATCGGAACAGCCATNA
-+
-67777788888888888888888877776555443222200//..---,,+,+*+**)))))((((($$###"#"#
- at 30BB2AAXX080903:3:50:1560:155#0
-AGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGCGTCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"%##"$"##
- at 30BB2AAXX080903:3:44:846:700#0
-GAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGAGATAGGATG
-+
-67777788888888888888888877776555443222100/...---,,+++***)*)))))((('$"%"&%#"$
- at 30BB2AAXX080903:3:8:1090:1869#0
-GGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTCGNCATACANN
-+
-67777788888888888883888877776545445222100//).,.-,-,++****(((((((&%'"$"""$#""
- at 30BB2AAXX080903:3:50:527:539#0
-AAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGACGGGCAGAC
-+
-67737788888888888888888877736)554432221.0/..,---,-+++******))))(((%&"""#####
- at 30BB2AAXX080903:3:60:299:108#0
-CCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCNGANN
-+
-677777888888888888888888777765554432221/0//...-,,,+,+++'**))))''(&&$%&$"""""
- at 30BB2AAXX080903:3:48:1710:2003#0
-GAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGATCAA
-+
-67777788888888888888888877776565443120100-/..--,-,,+++**'*))))%('('%"$"""#""
- at 30BB2AAXX080903:3:35:1148:1226#0
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGNCCACTATN
-+
-67777788888888888888888877776555443222000//..--,,,+++**)***(*()((('"$#"$#"#"
- at 30BB2AAXX080903:3:58:492:1504#0
-GGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATCAGTTTGCTAAGATCGGAAGCCACAC
-+
-67777788888888888888888877776555443232100//..-.-,,,,+**))*)))(((('''$%""###$
- at 30BB2AAXX080903:3:43:1196:1342#0
-GACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCCC
-+
-67777788888888888888888877776555443222100//./---,,+++++*)*))))')((''%#$&%$##
- at 30BB2AAXX080903:3:53:527:1583#0
-GTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAACGTCAGCC
-+
-67777788888888888888888877776555443222201//..---,,+++***)*)()()((''&##"#""##
- at 30BB2AAXX080903:3:40:699:290#0
-ACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACT
-+
-67777788888888888888888877776555443222100//..---,,+*+***))(())(((('%&$&%%$$"
- at 30BB2AAXX080903:3:60:893:488#0
-ACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGAGATCGGCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('''$%&%##""
- at 30BB2AAXX080903:3:44:1651:219#0
-AGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACACTGCACGC
-+
-67777788888888888888888877776555443222100//..---,,+,+*****))))((((''#$%&"$$"
- at 30BB2AAXX080903:3:60:945:1556#0
-AGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATAATCTAACANN
-+
-67777788888888888888888877776555443222100//..---,-+++****)))(())'''""$##$#""
- at 30BB2AAXX080903:3:46:751:1726#0
-CTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCAGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))(((('&"#$$%"#"
- at 30BB2AAXX080903:3:50:233:2044#0
-ATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATATACAACTA
-+
-677777888888888888888888777765554452211/01/..--+,,+++*+**)))))'((('""#$"##"#
- at 30BB2AAXX080903:3:43:501:169#0
-ATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCCCAAGATCGGAGGTACA
-+
-67777788888888888818882877776553453222100//..+,,-+*+**+)))'#((''(%#%&"#"""#"
- at 30BB2AAXX080903:3:34:766:124#0
-AGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGNCTACATNN
-+
-677777888888888888888881777765554422121/0//.----+-+++****)*))'('(('"%#%"##""
- at 30BB2AAXX080903:3:50:1679:1247#0
-TGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTCACTACGA
-+
-677777888888888888888888777767554432-21/0//..---,,+++***()))))((((%"$##""$""
- at 30BB2AAXX080903:3:35:944:1539#0
-TAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTNCTCTACAN
-+
-67777788888888888888888877776555443222100//..---*,+++***)()))((((('"""$""#""
- at 30BB2AAXX080903:3:39:1042:216#0
-TAGGACATAGTGGAAGGGAGCTACAACGTAGTACGTGTCGTGGAGTACGATGTCTAGGGAAGATCGGAAGAGGGAC
-+
-6777778888288888%88852067773355+3/3'2110./#..+,+,,(,($'*(()()((#'''""%"""#$#
- at 30BB2AAXX080903:3:41:1019:1263#0
-TATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTAGCGCGCGGC
-+
-67777788888888888888888877776555443222100//..---+,+,+***))))*))('''%"%#%$%#"
- at 30BB2AAXX080903:3:34:1757:1065#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGNCTACACNN
-+
-67777788888888888883888877776552443222100-/..,,,,,++*+**(*()()(((''"%"#%$$""
- at 30BB2AAXX080903:3:57:127:1200#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGATGTGTCCC
-+
-67777788888888888888888877776555443212100//...,-+,+++***)*))')(((&'%&"""####
- at 30BB2AAXX080903:3:59:1488:629#0
-TGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTACACANTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$%%%%$"#$
- at 30BB2AAXX080903:3:43:121:843#0
-ATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&&$$$""#""
- at 30BB2AAXX080903:3:43:121:845#0
-ATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTCTTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&%$$%"$"""
- at 30BB2AAXX080903:3:52:966:163#0
-AGCAAACTCATCACTAGACATCGTACTACACGACACGCACTACGTTGTAGCTCACAGACCGGAAGAGTCTCTCCTT
-+
-6777778888888888888888887747655,4422.%10/...+--)+,+)++**))&&((('(''"%#$"##""
- at 30BB2AAXX080903:3:38:229:803#0
-AAACTCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCAGATCGGGAGAGCGCGACAGC
-+
-677777888888888888888888766765554402221/00/.---*,,++(*)**()')((((''$%%%%$$"#
- at 30BB2AAXX080903:3:39:1324:467#0
-TCATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGCTCAC
-+
-6777778888888888888888887777654644322.000/..,-,-,,++****))(((('('%'"$&$"#$#$
- at 30BB2AAXX080903:3:37:662:158#0
-CATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTAAGATCGGAAGAGACCCTATNN
-+
-677777888888888888888888777765554432321/0//-..-++-+,+))**)()))(((''$"#$"""""
- at 30BB2AAXX080903:3:46:257:525#0
-ACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGATCGGAAGGGGCCTAGG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('('""####"""
- at 30BB2AAXX080903:3:54:791:1181#0
-ATCACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGAGCCTTAC
-+
-67777788888888888888888877776555443222100//..---,,+,++***)*))))((('%""""""""
- at 30BB2AAXX080903:3:54:439:1762#0
-ATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGATATGTCGACG
-+
-6777778888888888*888888877776355443232200/..,.-,,,+*+***)))()&)&'&'$""#"##$"
- at 30BB2AAXX080903:3:35:1425:1618#0
-AATACAGCTCCTATTGATAGGACATAGAGGAAGTGAGGTACAACGAAGTACGGGTCGTGTAGAACAGNCCTGTACN
-+
-677777888888888888888888787.657541352'+/&..,.(--',++(+*))#*#&)#(#'&"$$"""#$"
- at 30BB2AAXX080903:3:44:1515:2000#0
-ACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGNTGTCTAG
-+
-67777788888888888888888877776555443222/011,.-++++,,++*#)*)*()(((('''"$&""#""
- at 30BB2AAXX080903:3:47:242:1885#0
-ACTAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCCATAGGAGCCCCTAGA
-+
-677777888888818888888888777&6555.4/3+2.00.'..,-,,,++++'*(#*(#&(((''$#$"$##$#
- at 30BB2AAXX080903:3:40:1292:216#0
-AAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTGCGCTGGTTGCC
-+
-6777778888888888888888887773655544'222.%00..--(*,$+++&*(()()'((#(%'"%"&"#""#
- at 30BB2AAXX080903:3:41:811:1406#0
-CAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTAAGATGTCTCG
-+
-67777788888888888888888877776555443222120//..,-,,,+,+****))))(()('#$"%&$"#""
- at 30BB2AAXX080903:3:49:1201:525#0
-CAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACCAGGTATGA
-+
-6777778888888888888888887/776555443/2210/1,..,-++,+,)**+)')()%(('(#$"""$##""
- at 30BB2AAXX080903:3:49:49:1529#0
-TAGACATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCGCCCCACAC
-+
-67705785883388.888038888977595454/32/201/0..',,,+,,*((+)(('))((((''&$""$$#"#
- at 30BB2AAXX080903:3:59:1342:1581#0
-GGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGTACGNATCAC
-+
-6777778888888888888888887747655544322-100-.-,.-+-+++)*(*)*(#)()(''&%%""&"###
- at 30BB2AAXX080903:3:35:274:647#0
-TGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTAGNGCTCAAGN
-+
-67777788888888888888888877776555443222*0./..----*,*,+)*(*&)('((('('""%#&"#""
- at 30BB2AAXX080903:3:55:591:524#0
-ATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACAACGTAGTACGTGTCAGATCTGGCGGCGG
-+
-677777888888888888888888777765554432221*0./&,,,+-)*&+*%+))%*#((('%'%&##"#"""
- at 30BB2AAXX080903:3:47:1278:1119#0
-CATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAAGATCGGAAGANTCGCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('('"%""#"##"
- at 30BB2AAXX080903:3:41:546:806#0
-ATCGTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGAGATCGGTAGCA
-+
-6777778888888888888888887777655543*022.010./..,,,,++*(*****()(()((($%%&#""""
- at 30BB2AAXX080903:3:51:1604:1667#0
-TGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGAAAACACCA
-+
-67777788888888888888888877776555443222100//..---+,+'+***)*&))((('''"""###"##
- at 30BB2AAXX080903:3:49:1371:936#0
-ATGATGGCAAATACAGCTCCTGTTGATAGGACATAGTGGAAGGGAGCTACAACGGAGGACGAGGTGTGGGCAAGCT
-+
-677777888888888888888888772765544432221-0/'..-,--,*+**)))&)()#('#('%"$""""#"
- at 30BB2AAXX080903:3:39:1147:1865#0
-TATGATGGCAAATCCAGCTCCTATTGATCGGACATAGTGGCAGGGAGCTAAAACGTAGTCAGTGGTGTGCTGTCAC
-+
-67777788888888888888888877776555'13222100//(.,--,,*&+**()*)#((&('#&$%#""###$
- at 30BB2AAXX080903:3:39:1148:1864#0
-TATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGTTTTCAC
-+
-67777788888888888888888877776555443222100//..--,,,+++&*)*))*(((((%'&%""""###
- at 30BB2AAXX080903:3:44:183:380#0
-TATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGTCGTGGCGTGAG
-+
-67777788888888888888888877776555443222100//..---,-++++*)))))'(((((&&&""%""#$
- at 30BB2AAXX080903:3:4:1156:1584#0
-GTACTACACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCNCCACNCN
-+
-6777778888888888888888887777655544352210+///--,-,,-,******)*)((((('%"#""%"""
- at 30BB2AAXX080903:3:8:901:1500#0
-CCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTACGTGGNGATAAGNN
-+
-6777778888888888888888887777655544322-1/0/...$-&,++,*)*#)(()&('(#(#"&#""##""
- at 30BB2AAXX080903:3:42:980:1549#0
-CTACACGACACGTACTACGTTGTAGCTCCCTTCCACTATGTCCTATCAATAGGAGCTGTATTTTCCACAGATCTGC
-+
-6777778888882888888888817./-$4+1241.0.&.1*.&'+-,+(*)+)*&')('(((##%'"#&""""##
- at 30BB2AAXX080903:3:37:1601:1443#0
-CTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAAAGTAGTACAGCACGCACGN
-+
-677777888888888888888888777765554432221000/./--),,+**+)))')#))#((''&#$"%#$""
- at 30BB2AAXX080903:3:52:236:1968#0
-CCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACAAAGTAGTACGCCTCCTGCG
-+
-6777778888888888888888887777655544322110,/...-.-&,)+#&)(((&)#&)%'#'%""""""#"
- at 30BB2AAXX080903:3:44:725:1074#0
-CACGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCAGATCGGGAGGGG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()((('&&%"#$""#
- at 30BB2AAXX080903:3:42:1283:1263#0
-CGACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGGGTGCTC
-+
-67777788888888888888888877776555443211010./.----,,+++)*)*()'('(''''"&"#"#""#
- at 30BB2AAXX080903:3:38:632:481#0
-GACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGCAGGTCTCA
-+
-67777788888888888888888877776555443222100./..--,,,-++*****))()(((''$##$%$"$#
- at 30BB2AAXX080903:3:8:664:1443#0
-GACACGTACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCGATAGATCNCTACCTNN
-+
-67777788888888888888888877776555443222100/...--,,-++++*+))))()(((('"$"##"#""
- at 30BB2AAXX080903:3:52:613:1664#0
-TGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTAGTGTGTGCG
-+
-67777788888888888888888877776555443222100//...--,,,++'*))())(((&(%'$"""&###"
- at 30BB2AAXX080903:3:8:841:789#0
-TGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGTANTCCATCNN
-+
-67777788888888888888888877776555443222100//...-,,,,++)**)()(())'(''""#"""#""
- at 30BB2AAXX080903:3:41:1062:1346#0
-TGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGGGAGCTACCACCTGTATCA
-+
-6777778888888888888888887777655542322210////.-,-+,+*+*)*)&)(*'#(##'&"$""#"""
- at 30BB2AAXX080903:3:38:1784:1722#0
-TACTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCGTTCATCANN
-+
-677777888888888888887838737765.4,41.22210-.--,*,,+,+'(('&')#'((((%%$&%$"#"""
- at 30BB2AAXX080903:3:44:644:1913#0
-AGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACAACGGAGCA
-+
-67777788888888888888888877776555443222100//..---,-+,+*****)&*((&((%'&%%"$%#$
- at 30BB2AAXX080903:3:4:1398:315#0
-AGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTAACNCGACNCN
-+
-677777888888%8888888888837776555443012100//./--,,,,,+*****)#)(('''#""#"##"""
- at 30BB2AAXX080903:3:55:415:751#0
-CTACGTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()((('&&%&%%"""
- at 30BB2AAXX080903:3:49:1025:580#0
-TCATTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGCTACACAGCGG
-+
-67777788888888888888888877776555443222100//..---,-,+++**))*))&(('('"$"#"##""
- at 30BB2AAXX080903:3:53:1225:1642#0
-AATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGAGTCACACGCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*))))(&(('"""&%#"#%
- at 30BB2AAXX080903:3:43:869:894#0
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTC
-+
-6777778888888888888388287377655244322210.//..---,,,+)+**)*)(')(('(&$$%&"$%$$
- at 30BB2AAXX080903:3:53:1593:131#0
-TAGGGGAAATAAGTGAATGAAGCCGCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGCACTCTGCC
-+
-677777888888888888888888-7776555443222100//..---,,+++***)))))(((''%&$"""""#"
- at 30BB2AAXX080903:3:43:1247:1346#0
-ATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGAAGTGGGC
-+
-67777788888888888888888877776555443222100//..----,+++****)))))((''&%$&%"""""
- at 30BB2AAXX080903:3:57:1366:1703#0
-GAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGAAGATCGGAAGACGTGTGAC
-+
-67777788888888888888888877776555443222100//.----,,-++***)))))(((((&'$&""""##
- at 30BB2AAXX080903:3:43:124:407#0
-GAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACATAGTGGACGA
-+
-6777778888888888888888887777655544*222100//..----,+++***)))*)(((('&'&"%%#"""
- at 30BB2AAXX080903:3:49:1566:522#0
-CTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCAGATCGCAC
-+
-67777788888888888888888877776555443222100//...--,,++(***))))()))('&"#""&####
- at 30BB2AAXX080903:3:57:1683:1984#0
-TATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTACACCCACAAA
-+
-67777788888888888888888877775555443222100-/.----,-,++***)()))((((%''"%%%$#$$
- at 30BB2AAXX080903:3:43:784:484#0
-TGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTCTGATGGCAAATACAGCTCCTATTGATAGGACTAG
-+
-67777788888888888888888877776555443222100//..---,,*++*****))))(((('&'%%$""""
- at 30BB2AAXX080903:3:44:1718:565#0
-GGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTGCTATTGA
-+
-67777788838888888888888877776555443222100//..-.-,,,++***)*))))()(('%"$$$&%$#
- at 30BB2AAXX080903:3:42:400:1944#0
-TGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTA
-+
-67777788888888888888888877776555443222100//...--,,+++***)))*))(((''&&&&&%%##
- at 30BB2AAXX080903:3:39:1179:855#0
-TAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGAGATCGGAAGAGCTTTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***))())((('('""#"""""#
- at 30BB2AAXX080903:3:38:1310:1789#0
-GTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCACA
-+
-67777788888888888888888877776555343222110//...--,,-,+***)*)))))(((''$%%%$#%#
- at 30BB2AAXX080903:3:47:1693:378#0
-GAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAGGTGGT
-+
-67777748802888888888888877776555443222100./..-,+,,-++****)))()(&(('""#%"%"#"
- at 30BB2AAXX080903:3:51:1093:1405#0
-TGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCACCACCC
-+
-67777788888888888888888877776555443222/00//...--+,,++***)))())(((('$&"##"$""
- at 30BB2AAXX080903:3:58:1117:231#0
-TCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATNCTGNT
-+
-67777788888888888888888877776555443222100//..-----+++****)))))()('''$%"&##"$
- at 30BB2AAXX080903:3:43:19:495#0
-ATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATCGCACATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$"$"#""#
- at 30BB2AAXX080903:3:53:633:1875#0
-TGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAGATCGGAAGAGCGCAGC
-+
-677777888888888888888888777765554332221*0//.-.--,,+++***)))))((((''%"$###"""
- at 30BB2AAXX080903:3:1:800:1703#0
-ATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGNATNCAGC
-+
-6777778888888888888888885.774555463232101//..---,,+++*)**)))(&()((#&"""""###
- at 30BB2AAXX080903:3:36:635:727#0
-TATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGCTATGCATN
-+
-67777788888888888888888877776555443221100//..----,++++**)))))))(('%%&"""#"""
- at 30BB2AAXX080903:3:42:1535:1489#0
-ATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGGG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&%%""#"""
- at 30BB2AAXX080903:3:38:179:1866#0
-TGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAAGATCGGAAGAGCGGTTCCGCCGCCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((''$$%"""###
- at 30BB2AAXX080903:3:49:732:1376#0
-GCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGTCACGCAC
-+
-6777778888888888888888887/776555443222100//---,-,,,++***)))()'()(('%"#"#"#"#
- at 30BB2AAXX080903:3:51:965:869#0
-TACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGCGTGTAGCCTGAGATCGGGCGTAGT
-+
-67777788888888888888888877776555443222100./..---,,+++****))*)((((('"$"$"#"##
- at 30BB2AAXX080903:3:37:479:1565#0
-AGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGCGACACGAN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&&%""%##$"
- at 30BB2AAXX080903:3:49:1482:1821#0
-TAGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTCTAGGGTGTAGCCTGCGTTTATC
-+
-67777788888888888888888877776555443222100//..--+,,+++***)*)())((('&'$"""""#"
- at 30BB2AAXX080903:3:46:330:1392#0
-ACACCCTAGACCAAACCTACGCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))(('(&'"#$$$"$#
- at 30BB2AAXX080903:3:36:999:822#0
-TGTGGGAAGAAAGTTAGATTTACGCCGATGAATATGATAGTGAAATGGATTTTGGCGTAGGTTTGGTATATGTCTN
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))))(''%%$"$$##""
- at 30BB2AAXX080903:3:41:1033:132#0
-CTACGCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACGTTCTCGGCCTC
-+
-67777788888888888888888877776555413222/00/...--,,,,++++***)())#('(''&%%#"#""
- at 30BB2AAXX080903:3:49:586:1158#0
-GCCAAAATCCATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAGATCGGAAGAGCCGCTCGCG
-+
-67777788888888888888888877776555443321101./,.--,,,)+***)*)*((((((''"#"#"#"#"
- at 30BB2AAXX080903:3:34:1015:386#0
-GGGGCATTCCGGATAGGCCGAGAAAGTGTTGTGGGAAGAAAGTTAGATTTACGCCGATAGATCGGAANCCACCCNN
-+
-677777888888888888888888771765554432221/0/0..---,,+,+*****))))(('''"%$"#$#""
- at 30BB2AAXX080903:3:45:1175:1702#0
-ATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTAACTCGGAC
-+
-67777788888888888888888877776555443222101+/..,---,,*+***))))))()(''"%%"$&$#$
- at 30BB2AAXX080903:3:46:607:49#0
-TTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACACGGAGT
-+
-67777.88888888888888888877776555443221100//-.--+,,,++**)*)))()'((''"$"$"#"""
- at 30BB2AAXX080903:3:52:1681:1455#0
-GGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGAGAAAGTGTTGTGGGAAGAAAGTTAGCAAACCCAAC
-+
-6777778888888888888888887777655544322210//.-.---,,+++**)*))))()(('#$$%%$%#$$
- at 30BB2AAXX080903:3:46:1697:1105#0
-ATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGAGAAAGTGGTGTGGGAAGAAAGTTNGTTNACAC
-+
-67777788888888888888888877776555443102100//..+--,-+)+*+*))))))(((&'"#"""#"""
- at 30BB2AAXX080903:3:1:1542:327#0
-TGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGGCGAGAAAGTGTTGTGGGNTANACCA
-+
-67777788888888888/88881877476+5044322-+-0-&/.-*+-,(*+)*%())#)'%'&('"""""###"
- at 30BB2AAXX080903:3:38:763:627#0
-CATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCAGATCGGAAGAGTGTGTCCG
-+
-67777788888888888888888877776555443222100/...---,,+++*+*)*))))(('('$"#"""##"
- at 30BB2AAXX080903:3:41:640:55#0
-TTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCAGACACG
-+
-67777788888888888888888877776555443222100//..---,,++*+*+**)())(((''&%$%%$""#
- at 30BB2AAXX080903:3:46:593:970#0
-TTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGGTAGATCGGAAGAGCGGGTCTGCTG
-+
-67177718818888888888888877176555443222000////--,+,+%+**)))*)(()((''""#%"##""
- at 30BB2AAXX080903:3:55:1529:1414#0
-TTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCAGATCGGGACACNGCGC
-+
-67777788888888888888888897776555443202100./.-,--*(++'**))'#'(%(#&(#&$%$"#"##
- at 30BB2AAXX080903:3:36:251:1061#0
-TAGGATGGTTCATGGGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGGTATCACGN
-+
-67777788888888&8888888887777655044321210,//..'--,,+***+*(*))'()(#'#$"#"$$$$"
- at 30BB2AAXX080903:3:41:520:634#0
-TAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGCCGCTAACTTCC
-+
-6777778888888888888888887777655044322210///...--,,+**'+()))(((((#&&"$$#""""#
- at 30BB2AAXX080903:3:54:616:774#0
-TGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTCCGGATAGGGATGGTCGG
-+
-67777788888888888888888877776555440222100//-----,,+++****)))()'((('"""$""#"$
- at 30BB2AAXX080903:3:41:1033:1357#0
-CTCGGCCTATCCGGAAGGCCCCGACGTTACTCGGAGTACCCCGATGCATACACCACATGAAACATCCCATCCACAC
-+
-67777708888888888888+8887777657+,41'.2.////.+-,,',++***)*#(())'(&'#""%""$"##
- at 30BB2AAXX080903:3:1:1277:1997#0
-GCCTATCCGGAATGCCCCGACGGTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCANCTNCCTC
-+
-6777778888888888888588)377770+422232120-.-.-'--,+,*+*(())'((#('''&'%"&%"$$%%
- at 30BB2AAXX080903:3:59:707:1733#0
-AGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCATTGCGTCACA
-+
-677777888888888888888880&77765/5,4321110///.%--,,,,*+'+*())())(((''&"&&##$##
- at 30BB2AAXX080903:3:53:623:1151#0
-TGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCCTTCCGCAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''%"""$$%""#
- at 30BB2AAXX080903:3:60:479:1687#0
-TGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCACTCCTANN
-+
-67777788888888888888888872776%55342222$//./..-+-,$**+)****))('()((%%$%%#"#""
- at 30BB2AAXX080903:3:1:673:511#0
-GGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGAGATNGANACAC
-+
-677777888888888888888826774165524422201/.-.---.-,+*++)(*(*)()'(('('"""$"$#"#
- at 30BB2AAXX080903:3:43:1489:72#0
-TGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGTAGTCCGAGTAACGTCGGGGCGGGCG
-+
-67777788888888888885888877/7656134320200///.-,--+,**(*))(')#)''(#%&'&""#""#"
- at 30BB2AAXX080903:3:4:1784:678#0
-TGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGAGATCGGAAGAGCGGTTANACTANCN
-+
-6777778888888888888888887777654544322210//.-/,--,,+++)***())()&((%&$""%"""#"
- at 30BB2AAXX080903:3:37:788:1651#0
-GACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATATCTCTATN
-+
-6777778888888888888888887777455544322200////,.,-,,,+++**))))(()('('$"#&&$"#"
- at 30BB2AAXX080903:3:1:1226:1885#0
-TGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGTGTATGCATCGGGGAAGTNCCNTACA
-+
-67777788888888888883588877736/503412.0001*..,,,+,-$,)****)())()(#''$""""$$#"
- at 30BB2AAXX080903:3:39:319:1604#0
-CTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATTTCAGATCGGAGAACA
-+
-67777788888888/888888887777755554$32221/0//.----,-+++**+)))*)))'('%$""%&$##$
- at 30BB2AAXX080903:3:8:1605:890#0
-CGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGGGCATTCAAGATCGGAAANCATACANN
-+
-677777888888888888888888777765554823(.1%//+.--+,-%%))(*)()))##(('%&"""#$$%""
- at 30BB2AAXX080903:3:4:797:612#0
-GGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTCATTAGATCGGAACNCATANAN
-+
-67777788888888888888888877779555442222200./.-.--+,+++*****))()((('&$"$""""""
- at 30BB2AAXX080903:3:50:910:432#0
-TATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGGGTATGCATCTGTAGTCATG
-+
-67777788888888888888888877776555443122100//.+-*-,,+++)**#*)((('(('#$""""$##"
- at 30BB2AAXX080903:3:48:1717:1336#0
-TAATATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGATAGGATGTTTCATGTGGGGTATGCAGCCGGCGTG
-+
-67777788888888888888888877776555443022+00//..--,,-++%)***))#*((((#&%"$"#"###
- at 30BB2AAXX080903:3:8:486:1189#0
-AGGCTTCTCAAATCATGAAAATTATTAATATTACTGCTGTTAGAGAAATGAATGAGCCTACAGATGANTGCATCNN
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))((((''"""""##""
- at 30BB2AAXX080903:3:39:715:1507#0
-CATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTGCAGTGCCTC
-+
-67777788888888888888888877776555413232100//.-----,+*+***))))))('((&$&$%%"$##
- at 30BB2AAXX080903:3:60:263:1064#0
-CATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTGGACTNCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*))))('&&&"#"#$""
- at 30BB2AAXX080903:3:41:1638:1919#0
-TGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTAGGACTTTTCGCTTCGAGCGAGNG
-+
-677777888888888888888888777765554432221.00/.-.-,,+,++***)*)))()((('%$%$&#"""
- at 30BB2AAXX080903:3:59:527:1146#0
-GAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTATGCTAGAC
-+
-67177788888888888888888877776555423222101//...--,,+++*))))*()((('(''$%#"%"##
- at 30BB2AAXX080903:3:37:874:932#0
-TATACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTCTTN
-+
-67777788888888888888888877776355443222100//..---,,+++++*))))))((('("%&#%$"""
- at 30BB2AAXX080903:3:49:972:544#0
-CCCTCCATAAACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTAACGTACGACN
-+
-67777788888888888888888877776555443222100//....-,,++++*)))))))((((($"""####"
- at 30BB2AAXX080903:3:2:1733:1924#0
-GGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTAGATTTTATGTATACGGGTTCTNCGANTGT
-+
-67777788888888888888888297716555443121000/0.-----,++++*+))))()))'''&"%&$""""
- at 30BB2AAXX080903:3:43:258:523#0
-CATGGGGTTGGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTAGATTTTATGTATACGGGATT
-+
-6777778888888888888888887777655524/2'212//.--,--,,+++**(*())()((((%&%%%%$"##
- at 30BB2AAXX080903:3:8:1373:597#0
-AGTCATGGAGGCCATGGGGTTGGCTTGAAACCAGCTTTGGGGGGTTCGATTCCTTCCTTTTTTGTCTNTGTACTNN
-+
-67777788888888888883888877775552243222100//.--,-,,++***))*))))(((''"""##$#""
- at 30BB2AAXX080903:3:43:335:1466#0
-AAGGAAGGAATCGAACCCCCCAAAGCTGGTTTCAAGCCAACCCCATGGCCTCCATGACTTTTTCAAAAAGGAGACG
-+
-67777788888888888888888877776555443212100//*---,,,*+*)(*(())*)(#((''$%&"""""
- at 30BB2AAXX080903:3:53:1361:720#0
-CAACCCCATGGCCTCCATGACTTTTTCAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAATAAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'"$%$%"##
- at 30BB2AAXX080903:3:50:1007:1109#0
-TCAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAAGATCGGAACGCACAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++*****))*((((''"##$$""#"
- at 30BB2AAXX080903:3:54:690:226#0
-AGGTATTAGAAAAACCATTTCATAACTTTCTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCATCC
-+
-67747788888888888888888877776)55443222100//..---,,+++***)*)*)))(((($$%""""#"
- at 30BB2AAXX080903:3:57:565:1448#0
-AACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$%%$$$##"
- at 30BB2AAXX080903:3:55:430:492#0
-ACCATTTCATAACTTTGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAAGATCGGACA
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))()((('$##&&"#$"
- at 30BB2AAXX080903:3:51:518:1466#0
-CGTCTTGTAGACCTACTTGCGCTGCATGTGCCATTAAGATATATAGGATTTAGCCTATAATTTAACTCTTACNATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""""#"""#
- at 30BB2AAXX080903:3:45:1485:1169#0
-GCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCACAGAAGA
-+
-67777788888888888888888877776555443222100//..----,+++***))))(((((('%"#$%"$##
- at 30BB2AAXX080903:3:34:1293:31#0
-ATGGCACATGTAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTNCGCAACNN
-+
-67777788888888888888888877776555443222000//.,--,+,,,++*))))((())'('"%#%"#$""
- at 30BB2AAXX080903:3:4:733:1966#0
-GTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTTGCGCTCNCTTANCN
-+
-677777888888888888888888.7776555443222/10-/.,-+,,,+****())((((((('%""%""""$"
- at 30BB2AAXX080903:3:48:1022:440#0
-GCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCCCG
-+
-67777788888888888888888877776555443222100//..---,,++****)))))))((('&"%$$""##
- at 30BB2AAXX080903:3:42:1566:800#0
-CATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCCAGTAT
-+
-67777788888881888888888877776551142222100-.,/.---,,*++****))'(((('%%$"#%##"#
- at 30BB2AAXX080903:3:59:1092:85#0
-CATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTAGATCGCTCACNNA
-+
-67777788888888888888888877776555342222,-1.--,---,,,****)&((('(&'''%&$"#"#""#
- at 30BB2AAXX080903:3:43:81:1783#0
-GAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGAGATCGGAACACTGAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*)*))((((&&"#"$"""#
- at 30BB2AAXX080903:3:45:332:817#0
-TGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTTGAGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++++*))))))(((('&"%$$""$#
- at 30BB2AAXX080903:3:40:1222:517#0
-AGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACACCGTCAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((''"&%""##$$
- at 30BB2AAXX080903:3:59:766:1214#0
-TATGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTAGACCTACTACGCTA
-+
-67777788888888888888888877776555443.22100//..---,,*++)*)()*()'((#''%$%%##$##
- at 30BB2AAXX080903:3:39:298:1037#0
-GCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGACAGCATAC
-+
-67777788888888888888888877776555443222100./..---,,++***+*)*)))((('($'&%%#%##
- at 30BB2AAXX080903:3:56:696:154#0
-TTATGAGGGCGTGATCATGAAAGGGGATAAGCTCTTCTAGGATAGGGGAAGTAGCGTCTTGTAGACCGACTTGACT
-+
-677777888880888888888886-77-655534120'2#0-.,----+,+$+)')('&('##''#&"$"#"""##
- at 30BB2AAXX080903:3:43:586:671#0
-CGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCAGATCGGACGGCG
-+
-6777778888888888888888887777$555443222100//./---,,++*****)))))()'('&$#"#""""
- at 30BB2AAXX080903:3:2:595:802#0
-AAGTAGGTCTACAAGACGCTACTTCCCCTATAATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCNCACACCT
-+
-677777888888888884088484787765.'45321.000...,-,,++,*+*+*))(()((''(''"$&""#""
- at 30BB2AAXX080903:3:33:257:679#0
-ATGATTATGAGGGCGTGATCATGAAAGGTGATAAGCTCTTCTATGATAGGGGAAGTAGCGTCTTGTANACCCAANN
-+
-677777888/888888888888887777655,44321210//...-+-,,++)**')*))&((((%'""##%#"""
- at 30BB2AAXX080903:3:55:432:1167#0
-CAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTCTCTTATCT
-+
-677777888880888888858888777765554432200///./-.,-,-+,+**)*)))))(((&&$%#%#"##$
- at 30BB2AAXX080903:3:43:1568:1248#0
-CAGATAAGGAAAATGATTATGAGGGCGTGAGCATGAAAGGAGATAAGCTCTTCTATGATAGGGGAGGTAGGCCATG
-+
-6777778888888&8888888888777+65)'44322210&//..---,,,+%+***(*))(((&&'"%$%""#""
- at 30BB2AAXX080903:3:46:1439:942#0
-CCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTNTTACACTC
-+
-677777888888888888888888777765554432211/0//.----,,,++***)*)))))((('""%%&####
- at 30BB2AAXX080903:3:3:1044:1142#0
-GAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTAGATCGGAAGAGNTCGNNAC
-+
-6,7777888888888888/38808071;03.22500110.0//-,*-,+,++*'**()()'((&&'%""""%"""$
- at 30BB2AAXX080903:3:46:451:320#0
-AAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCAAGATCGGAAGCACGAGAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&"$#""#""#
- at 30BB2AAXX080903:3:58:104:1767#0
-TTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTNNN
-+
-67777788888888888888888877776555443222100//..---,,,++****)))(((('(''$%%##"""
- at 30BB2AAXX080903:3:50:234:1426#0
-TGTTAGGAAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATGAACGCTGTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(((''"$"#"""##
- at 30BB2AAXX080903:3:34:1707:1614#0
-AGTGTTAGGAAAAGGGCATACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATNCACATCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()(('"$#%"#$""
- at 30BB2AAXX080903:3:44:1659:430#0
-CATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCAAGATCG
-+
-67777788888888888888888877776555443222100//..---,,++++****))))((((''&"%%#"#$
- at 30BB2AAXX080903:3:38:671:627#0
-TGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACCTGCAACATCA
-+
-677777888882888888888888-777655/44321/100./----,+,++*+*')))))()(#'#"$"#"""#"
- at 30BB2AAXX080903:3:41:759:1319#0
-ATAATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('(&&&&$%##$#
- at 30BB2AAXX080903:3:8:1519:1870#0
-AATCATTTTCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTNATCATCNN
-+
-67777788888888888888888877776555443222100//...--,,+++***))))))()(''"'#&%"#""
- at 30BB2AAXX080903:3:36:1488:883#0
-CTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAACGCGACACNN
-+
-67777788888888888888888877776555443222100//..---,-+++++**)))))((((#""$"#"$""
- at 30BB2AAXX080903:3:59:1110:1393#0
-CTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGCACCTA
-+
-677777888888888888858888777765554432221000/..---,,,++****))*()))((''&&%"#$##
- at 30BB2AAXX080903:3:34:346:1269#0
-TGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATNCACACANN
-+
-67777788888888888888/88897776555443222000//..---,-,,+***)*))))))((("%"#"##""
- at 30BB2AAXX080903:3:49:1047:531#0
-TGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAGATCGGAATGGTAGCC
-+
-67777788888888888888888877776555443222000//..---,,++++**))))))'((&'""""""""#
- at 30BB2AAXX080903:3:34:137:253#0
-CACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGNGACCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&""$####""
- at 30BB2AAXX080903:3:54:1327:1827#0
-GATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTCTATTTCCTGAGAGATCGGAAGAGATGTCCAC
-+
-6777778888888888888888887777655544-02.200-/.----,,)++**)))))'))%((#'""%$###"
- at 30BB2AAXX080903:3:40:1118:1481#0
-TCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCCTCCC
-+
-67777788888888888888880878776455443222100/...,--,-+,+++))***()(((''$%%&#%%#$
- at 30BB2AAXX080903:3:57:346:1419#0
-GGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTCTATTTCCTGATGTCTACG
-+
-6777778888888888888888887747655544322000)..-.'-,*,+***&**))&()('(''$"#"#"###
- at 30BB2AAXX080903:3:40:137:1657#0
-CAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTNGCACGCAC
-+
-677777888888888888888878777765554422221/0/0.----,,+++***)*))(((((('""#"%#"##
- at 30BB2AAXX080903:3:33:1721:302#0
-GTAGGGATGGGAGGGCGATGAGGACTAGCATGATGGCGGGCAGGATAGTTCAGACGGGTTCTATTTCNACAACANN
-+
-6777778888888888888888887777655544322210/./.----&,+*+*)*)#()(((((('"$#""##""
- at 30BB2AAXX080903:3:39:531:1123#0
-GTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTATTTTCTCTCTGCT
-+
-6777778888888888888888887777655544320210.1/.,,--,,)*+*'**'()&)#(((#&&"""""""
- at 30BB2AAXX080903:3:59:417:959#0
-GTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGTTTAGATCGGAATTCTNNA
-+
-67777788888888888888888877776555443222100./...--+,++++**)&)))()('('&$""$""""
- at 30BB2AAXX080903:3:56:289:1815#0
-CTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCAGACCGTCCACC
-+
-6777778888888888888888887777655544322210/../..,-,,,++++))*))))(((''$&&"#$###
- at 30BB2AAXX080903:3:40:161:506#0
-TCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCGTACGCATC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))))(('&%"$&%"""#
- at 30BB2AAXX080903:3:60:449:1142#0
-TCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTCACATNN
-+
-67777788888888888888818877776555443222100//..---,,+++***)))*)())('(&$#"$$"""
- at 30BB2AAXX080903:3:46:287:649#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGGTCAGATCGGGAGAGCGACTGCG
-+
-67777788888888888888888877776555443222100//..(,-,+,*+)*')*)&'((#(''&$""$""#"
- at 30BB2AAXX080903:3:48:93:1377#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTCATTTCCGC
-+
-67777788888888888888888877776555443222100//..,,-,,+++&*))))')(()(&&&##$#$#$$
- at 30BB2AAXX080903:3:51:647:724#0
-GATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCAGACGGGTTCTCTATCAGAC
-+
-67777788888888888888888877776553443222100//..+--,++++(*)*)())(#&(&'%##"###$#
- at 30BB2AAXX080903:3:3:712:1239#0
-AGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTANTCATNTA
-+
-67777788888888888888888877776555443222100-//.--,,-++*+**))))'((((''$""$$$"""
- at 30BB2AAXX080903:3:36:1671:634#0
-ATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCCACCTGACNN
-+
-67777788888888888888888877176555443012120./.-,&+,(,+%***)&)()('((''&&#""#$""
- at 30BB2AAXX080903:3:41:855:309#0
-TGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGGTCAGATCGGGGAGCT
-+
-67777788888888888888888877776555443222100//.,----,+,****(()('('#('%"&&"%"#$"
- at 30BB2AAXX080903:3:2:505:1137#0
-AAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCAAGATCNGACACGA
-+
-67777788888888888888888877476.55443212211//...,,-,,,*++*()()((((('%%"""$####
- at 30BB2AAXX080903:3:42:128:1864#0
-AACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTGACCTAAAC
-+
-67777788888888888888388(77776556443212100//.-+--,-+++***)*))))(''(&&&&"##$"#
- at 30BB2AAXX080903:3:41:601:1383#0
-ACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACACACCAA
-+
-67777788888888888888888877776555443222100//..----,,++*+***))))()(('&%&%%%#"#
- at 30BB2AAXX080903:3:48:816:561#0
-CTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGATAGTTCACACGTC
-+
-67777788888888888888888877776555443222000//..---,,,++***))())))(((#&%#$"##"#
- at 30BB2AAXX080903:3:4:1342:574#0
-GTCTGTTATGTAAAGGATGCGTAGGGATGGCAGGGCGATGAGGACTAGGATGATGGCGGGGAGGAGATNAGACNAN
-+
-673773888888888888888'88771765$1415*2.20///,+-,,,++*))**()((#&')#'%""""##"""
- at 30BB2AAXX080903:3:43:1085:168#0
-TCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTAGATCGGAGGCGCCT
-+
-67777788888888888888888877776555443222100//.--,-,,++**+*)*)((()((('&""%#""#"
- at 30BB2AAXX080903:3:56:821:1211#0
-TCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACCACCAC
-+
-6777778888888888888888887777655544322210///..---,,-++***)**(())((('$&%"%&#$"
- at 30BB2AAXX080903:3:56:966:1583#0
-CTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATAGATCGGAAGAGCGTCATG
-+
-67177788888888888888888877776555443222+0///-.-,(,,+++***)*)()#)(&('&&$#"$#""
- at 30BB2AAXX080903:3:33:602:212#0
-TGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTAGATCGGNTGCACTNN
-+
-67777788888888888888888877776555443222100//.---,,-+++***)))())(((('""##"%"""
- at 30BB2AAXX080903:3:57:1069:1572#0
-CCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGGGCAGGTGCCACTA
-+
-677777888888888888881888777765554431221/00/./--,,,+++)***)))(()(%('$$&$###"#
- at 30BB2AAXX080903:3:3:780:775#0
-GAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACCNGCACNTC
-+
-6477778888888888/.22884877713-.121121/.0.'..,,*,,+*+)*)(()()'((('%%"""$"#"##
- at 30BB2AAXX080903:3:34:765:1500#0
-AACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTGACATAACANACATCTNN
-+
-67777788888888888888888877736555443221100//.,---,,++++*)(*()())((('"#%#"##""
- at 30BB2AAXX080903:3:4:1576:1178#0
-ACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGANCTATNAN
-+
-67777788888888888888888877776555443222101/....-,,-,*++**)*)))()((('$"$##""#"
- at 30BB2AAXX080903:3:36:687:92#0
-GTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGATGATGGCGNGCGACCAN
-+
-6777778888888888888888887777655544322210///.--+,,,++++*))*)))()((''""#"###""
- at 30BB2AAXX080903:3:40:329:1065#0
-ATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGNGCTTAGGT
-+
-67777788888888888888888877776555443222100//..-----+++++*)*))*)((((&"&""#""""
- at 30BB2AAXX080903:3:59:663:1521#0
-ATCCTGCCCGCCATCATCCTAGGCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGCGCGCCG
-+
-6771778888888888888888*0777760554)2221000//.----,,,+++***)*)((((((&$&#%#####
- at 30BB2AAXX080903:3:3:437:1518#0
-TGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCNCCACNCA
-+
-677777888888888888288882977765555402211/.//.-,--,++*+***())(())(((#&"#""#""#
- at 30BB2AAXX080903:3:53:188:62#0
-GCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCGACGACACC
-+
-67777788888888888888888877776555433222110//+.--,,-++++))*))())'((#'$"$&##""#
- at 30BB2AAXX080903:3:52:719:515#0
-GAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGAAGCTGGTCG
-+
-677777888848888888)88888777-6555443222+00//-+---+,+++***))))()''((#"##$%%""$
- at 30BB2AAXX080903:3:55:513:1425#0
-GGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGCNGGTAGAT
-+
-67777788888888888888888877776555443222100//..---,-+++****)))))(((''$""##&$#$
- at 30BB2AAXX080903:3:4:299:1016#0
-GCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGTNGCCANCN
-+
-67777788888888888888888837776/4550320210/./.--,--,++*++))*())(''(&'"""%$""#"
- at 30BB2AAXX080903:3:50:1500:524#0
-CATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCGCCTCCCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))())(((('&$$$""$#"
- at 30BB2AAXX080903:3:52:1272:1210#0
-AAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGCATGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((&'"%"%%%""$
- at 30BB2AAXX080903:3:57:861:723#0
-AAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTCGCCGTGAC
-+
-67777788888888888888888877476552443221000/-/,--,+,++****)))()(((''#"$##$$"#$
- at 30BB2AAXX080903:3:42:796:43#0
-ATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCCCCCTTC
-+
-67777785888888888888888877/7655284321100.-//.---,,+,+++)*('((((('&'&""""%%#"
- at 30BB2AAXX080903:3:3:284:1697#0
-TAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGACTNAGCTNAC
-+
-67777788888888888488888677766-55413)22,././(*.--++,+*&**)()(&)((('#"""&"#"##
- at 30BB2AAXX080903:3:47:1657:1407#0
-GTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGAGGGAGAGTCTAT
-+
-677777888888888888888888777765554432221/0/....--,,,++***))))((((((&$"#""#"""
- at 30BB2AAXX080903:3:48:367:704#0
-GGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAATGGATGCGTAGGGATGGGAGGGCGATGAGGACTAGGACA
-+
-6777778888888)888888+68877776555445212100//..-+-,,++++*))))&)'()&('"$""$###"
- at 30BB2AAXX080903:3:43:134:941#0
-ATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()(((''%&%$%##$
- at 30BB2AAXX080903:3:54:870:526#0
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCTCTTACAAC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))(('&"'#"%%"""
- at 30BB2AAXX080903:3:4:1682:201#0
-CCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCNTGTCNCN
-+
-67777788888888888888888877776555430222110//..--,,,,++(**))*))'''('&$"##"$"#"
- at 30BB2AAXX080903:3:41:863:738#0
-TGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGGGGGGAGGAGAGCGGACGAATA
-+
-677777888888888888888888774764454432220100/..--,,&+++*#')))()(()(##%'"""###"
- at 30BB2AAXX080903:3:60:923:194#0
-TGATGGTAAGGGAGGGATCGCTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGAGGGCGATGCGCAGTNN
-+
-677777+8888888888888&88676$1(,454,3220/00//.-)-+,+++++)(*)*(*((#(%#'$%$%""""
- at 30BB2AAXX080903:3:2:934:336#0
-AGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCAGATCNTGCTGTC
-+
-677757888882888882838888777765098412121//-/.---+,,+*+***)((('((((''&""""#""#
- at 30BB2AAXX080903:3:42:1471:645#0
-GATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGGAGGGATGGGAGGAGATCGCACA
-+
-6777778888888888888888884777655540322/100//.----,),'+$**)*(')))(((#'"#$$$%$%
- at 30BB2AAXX080903:3:4:89:493#0
-GATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGAGTAGGGATGGGAGGGCNGTAGNAN
-+
-67777788888888881888188877770%5$3(11221(0//(,,-,+++$+*&*)*)(*(((((($""#$#"#"
- at 30BB2AAXX080903:3:55:976:1965#0
-CTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTAAGACCGCTCANT
-+
-67777788888888888888888877776555143222100//..-.,,,*++*)))*((())((('"$""""#""
- at 30BB2AAXX080903:3:33:768:826#0
-ATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCANCACGCGNN
-+
-67777788888888888888888877776555443222100//..---,,,,++****))))(((('"$#$"$"""
- at 30BB2AAXX080903:3:38:1744:450#0
-CAATCGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGATGGGTTCACANN
-+
-677-7788388828888888888827746(52140322%0///*,*,),+*,))&*')#')'(##(#&""#"#"""
- at 30BB2AAXX080903:3:55:736:1941#0
-GGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGAAGTCGGACG
-+
-677777888888888888818888777765554431121.0/+..--,,,+++***)))))(((((%"&"""""#"
- at 30BB2AAXX080903:3:39:110:846#0
-TGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGCCAGTACAT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(()''&"&$#""#""
- at 30BB2AAXX080903:3:3:1371:137#0
-TGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGTGTACNCACTNTN
-+
-6777770888888888888888087777:5552/12100/,#.*.,+--,+)+)*()()('((#(##&"###""""
- at 30BB2AAXX080903:3:2:63:972#0
-TTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTCNCTCNNAC
-+
-677777888888888888888888777765554432221000..---,,,+,+**))*)))(((''&%"%"""""#
- at 30BB2AAXX080903:3:3:1542:862#0
-ATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGCNAGCANCN
-+
-6777778888888888888888880747653544321-00/.,.,--,,-+,+)**)))()(%'(&'$"$##""#"
- at 30BB2AAXX080903:3:55:844:905#0
-ATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGNGTGCTGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)**))((((''"&"%##"#"
- at 30BB2AAXX080903:3:58:1437:514#0
-CATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAAAGGATGCGCATCTACA
-+
-67777788888/88888888888877776555443222100//,-----,++******&))((((''%$%"$"%$%
- at 30BB2AAXX080903:3:52:468:470#0
-ATCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAAACAAATGGACCCAGCAGC
-+
-677777888888888888888888777765554432/2110*/-.--'+,+,%**#))#()(#(('#$##"""##"
- at 30BB2AAXX080903:3:57:815:1074#0
-TCCCTACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCACAACA
-+
-67777788888888888888888877776555443222100//./---,,+++*+*))*))))(((''#%%#"##"
- at 30BB2AAXX080903:3:35:351:1316#0
-ACGCATCCTTTACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAGNACCGTCGN
-+
-677777888888888888888888777765553421221000/..---,-*,+))****((((((('"$$$""#""
- at 30BB2AAXX080903:3:39:1404:1268#0
-TAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTATGTAACTCA
-+
-67777788888888888888888877776555443222100//..---,-+++***(**)()()(('&&%#""###
- at 30BB2AAXX080903:3:54:1060:107#0
-CTTTACATAACAGACGAGGTCAACGATCCCTCCCCTACCCTCAAATCAATTTGCCACCAATGGTAAAGTGTGTACA
-+
-677777888888888888888888777765$544%2'22*)-,(/,-+++*$))*(()((##&%'(#"#$"%"###
- at 30BB2AAXX080903:3:59:223:1396#0
-TACATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTCCTNNC
-+
-67777788888888888888888877776555443222100/...---,,,++*****))()(((('&&&&%$""$
- at 30BB2AAXX080903:3:34:848:357#0
-CATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCNATCGCANN
-+
-67777788888888888888888877776555443222100//..---,,+,++*)**))))(((('"""#"$#""
- at 30BB2AAXX080903:3:39:1116:834#0
-TGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCCTCTGTTCT
-+
-67777788888888888888888877776555443202100//...-,,,+*+**+**))()(((('"&&%%%$##
- at 30BB2AAXX080903:3:39:424:471#0
-TGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGACCTCGTCTGTTGT
-+
-677777888888888888888888777765554432221000/..--,,,+++****))())(((('"$&%$%#""
- at 30BB2AAXX080903:3:43:938:221#0
-AACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGCACATC
-+
-6777778888888888888888887777655444322210000...-,,-,+***(*)))()(('('&&%$#%#"#
- at 30BB2AAXX080903:3:49:133:1841#0
-AACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACNAGTAGACA
-+
-67777788888888888888888877776555423222000//..---,-++++*'*(()))(((('"#%%#""#"
- at 30BB2AAXX080903:3:40:606:1392#0
-GTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTGCTCTCGTCT
-+
-67777388888888888888888877776555441221100//..---,,,,+***))))()((((&%"%%$#$#"
- at 30BB2AAXX080903:3:1:525:79#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACATACGAGCANACNAAAC
-+
-67777784888888888808448698-024.5/4-00100/1'.%,,+,+))*)))()(%'('''&#%""%"""#$
- at 30BB2AAXX080903:3:3:792:1854#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGCACCTACGAGTANTCCNNCA
-+
-677777888888888888888888777765654432/1000//./.-(+,,)*+*)#**()(()'('$"#&$""$#
- at 30BB2AAXX080903:3:44:691:469#0
-GACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACT
-+
-67777788888888888888888877776555443222000//...-,,,+*++**)))))))(((''&""%%$##
- at 30BB2AAXX080903:3:33:190:1612#0
-AGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTNCACTTCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))()'(&""#$""$""
- at 30BB2AAXX080903:3:51:512:248#0
-AGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTTCTATTTGTC
-+
-6777770888888888888888887777655534322/200/...---,,++++**)))))((('%'%"""""%$$
- at 30BB2AAXX080903:3:37:1317:183#0
-ACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTAACCAGATCN
-+
-677777888888888888888)0137(065/52112+.12//+*--)*,-$**&)))((''&(''#%"#%""""#"
- at 30BB2AAXX080903:3:50:275:520#0
-ACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACACACTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('('%"#""##""
- at 30BB2AAXX080903:3:34:1764:1302#0
-TAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGTNTTGTCGNN
-+
-677777888888888888888888777765554432221/0//-.---,-+++***))))))()'('""#$"#"""
- at 30BB2AAXX080903:3:44:349:962#0
-CGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTAC
-+
-67777788888888888888888877776555443222100//..---,(,++***)*))(()(((''&$&#$###
- at 30BB2AAXX080903:3:3:1704:1108#0
-GTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGAATCGTNCACANTN
-+
-6777778888888888888888887777655544122210///..---,,+++***)))))('((&''"#$&#"""
- at 30BB2AAXX080903:3:57:1595:719#0
-GTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGATCGCAACGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&%$"$"$$##
- at 30BB2AAXX080903:3:34:1733:2032#0
-ACGTAGTCGGTGTACTCGGAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGAGGGAGNCAACAGNN
-+
-277777888888888888088888777765554432-21//....-,--,+***+))))))(()('%"$""%""""
- at 30BB2AAXX080903:3:57:357:1511#0
-GCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGAGATCGGACGTCGCG
-+
-6777778888888888888888817777655544322210,/.------,++*****)*)*)((''('"#""#"#"
- at 30BB2AAXX080903:3:3:1126:1638#0
-GTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCACTTGATTTGATGGTAAGGGATNCACTNTA
-+
-6-7777888888888882288888.77765551422.1100./.,-,'+++'*+**()))''((((%""$"##"##
- at 30BB2AAXX080903:3:58:1286:1597#0
-AGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGCGGACCCCN
-+
-67777788888888888888888877776555483-30100/..-$,,',,+++**))))*((('''"#&#####"
- at 30BB2AAXX080903:3:38:828:29#0
-TTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGAGATCTGAGTCCNN
-+
-67777788888888888888/8887733654541302210/./.,---,+&*+****))(()'((''"#""#"#""
- at 30BB2AAXX080903:3:43:1781:647#0
-GATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTAAGGGTTGGT
-+
-67777788888888888888188877776555,43221110/0..-,-,,++++****))))()(('&&%&"""##
- at 30BB2AAXX080903:3:52:391:879#0
-AGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGATGGTGCCGCGTCG
-+
-67777788888888888888888877776555443222100/...---,,,+++**))**)((((''"#"##"""#
- at 30BB2AAXX080903:3:4:726:1575#0
-TGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATTTGAGCNCTATNCN
-+
-67777788888888888888888827176555,432120//./.,-,,+-*,+)*)')))(()((##$"%""#"#"
- at 30BB2AAXX080903:3:51:755:1179#0
-TGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTGATAGATCCGCCACGGC
-+
-67777788888888888888888877776555443212100//...--,,-++)**)**))()(((#%"##"#""#
- at 30BB2AAXX080903:3:56:1135:164#0
-TTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATTGGTGGCCAATTCATTTGATGGTGCACC
-+
-677777888888888888888888777;655544322-110//...--,-,*+*()())))(((('%%$%%%%##"
- at 30BB2AAXX080903:3:40:717:415#0
-TGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGGTCAGTACCATTGGTGGCCAAACGATTTGTT
-+
-67777788-88888888888888877%760554&3+1.+00*...,-,,+%,)**#*()'))'(&&#"%"$#%""#
- at 30BB2AAXX080903:3:38:279:1549#0
-TCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAAACCCTCATC
-+
-67777788888888888888888877776553423222200/.,..,-,,+,+***#)))('((&&'""%#%%$$%
- at 30BB2AAXX080903:3:41:666:1859#0
-TGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCAAGATCGGCAG
-+
-67777788888888888888888877776555443222000//..--,+,++++**()(()))('(($$&##"$#"
- at 30BB2AAXX080903:3:49:119:150#0
-TGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACCATNCGACAGAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))()(('&""""$""##
- at 30BB2AAXX080903:3:57:310:1321#0
-TAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCGTAGGTTCAGTACGCGTGTGAT
-+
-2777778888888888+8888888777765554132221000/..--',++)%(**)*)#&'&('(&%"$%"##""
- at 30BB2AAXX080903:3:38:1033:443#0
-CCAATGGAACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACCTCCCCCACTCTGC
-+
-6777778888888888888888-877776-5944321200.*-/,,+,)(,+')*%)))#()#&'('"%##$##$%
- at 30BB2AAXX080903:3:40:1172:1477#0
-ACTGAACCTACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCCGAACGTGTGACCAC
-+
-67777788888888888888888877776555//32)%00$)0(,.,++,+++)#*#))))'(&#(''$%&"$##"
- at 30BB2AAXX080903:3:59:1031:2034#0
-ACTGAACCTACGAGTACACCGACTACGGCGGGGTAATCTTTAAATCCTACATAATTTCCCCCCTATTCCTCAGCAC
-+
-6777778888888888888888887777655$%1++/#00&%.&'&+)'$*$*$%)'$)''##(#''"&$%%"$$$
- at 30BB2AAXX080903:3:8:523:818#0
-GCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACNCTACTCNN
-+
-6777778888888888888888887775655244322210///..-.-,,+++****)))))(('''"#""$"#""
- at 30BB2AAXX080903:3:58:191:1468#0
-TACGAGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATAGATCGGAAGAGCTGCCTNNC
-+
-6777778888888888888888887777655544322210//....-,--,,+)+***))))()(('%"%"#"""#
- at 30BB2AAXX080903:3:59:859:876#0
-TACGAGTACACCGACTACGGCGGACTAATCTGCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGTGTCAC
-+
-27772788888888888)888888(777'/5,453332(0//..-).,,(+++***))((((((('%&$%%$$###
- at 30BB2AAXX080903:3:45:1579:1444#0
-CAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGGGGGCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((((&&$#"""""#
- at 30BB2AAXX080903:3:50:247:1697#0
-TCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCGGCCAGAAT
-+
-67777788888888888888888877776555453222100.....--,,+++*+*)()))()((('""#""""""
- at 30BB2AAXX080903:3:48:896:136#0
-CTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGAC
-+
-67777788888888888888888877776555443222100//..---,,++++*)))))))()(('&$%%"%##"
- at 30BB2AAXX080903:3:37:720:806#0
-GCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGAGATCGACCTCTCTN
-+
-67777788888888888888888877776555443222100//..---,-,+++*))))))((('('"%#"###""
- at 30BB2AAXX080903:3:37:1175:265#0
-TAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTCGATCTCN
-+
-67777788888888888888888877776555443222100//..---,,+,+**))))))()(''%$"%""$"$"
- at 30BB2AAXX080903:3:47:1293:1247#0
-CGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGGACTCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()((('#$""""#$""
- at 30BB2AAXX080903:3:2:201:1492#0
-TACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGCNGTTNNCT
-+
-6777778888888888888888484773555.4432121////..-,,+,++++****))((((''&$""""""#"
- at 30BB2AAXX080903:3:43:257:118#0
-CGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGTAAGTACGTGA
-+
-6777778888888888888888887777655544322210$-/.-*,-),++*+*())(((((((#'%&""""#""
- at 30BB2AAXX080903:3:59:280:177#0
-CAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGGCGCAGGGCGCCTGGGGGATCGGGAGGGGGGGTGTGNNC
-+
-6777778888888888888-8+8875776)5,'432(,10,'..')-,+$('#$*'#(&(%&'##&''"""#$""#
- at 30BB2AAXX080903:3:39:1664:628#0
-TACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTCC
-+
-67777788888888888888888877776555443222100///.---,-+++***))))()((((''$"%%%$#"
- at 30BB2AAXX080903:3:59:912:1892#0
-CTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGGTCTAGGAAGATCCGACACCG
-+
-6777778888888888888888887771355502132200,./+---,&,*++++&)()&))'((&#$"%"$####
- at 30BB2AAXX080903:3:53:487:1066#0
-GGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGGTCTAGGAAGCTCGTAG
-+
-67777788888888888888888877776555443222100//.----,,+&+****))'))((('&%$#$"%""#
- at 30BB2AAXX080903:3:45:1653:1285#0
-GGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTGGATCGGCAGTGCGG
-+
-677777888888888888,8088/77786555&12+2#1'0..-.*,-,,-,))*)*(&)'#)&%%&"$"%""##"
- at 30BB2AAXX080903:3:52:987:308#0
-ACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCAGATCGGCACAGGTCG
-+
-67777788888888888888888877776555443222010//..-.-,,+++***))())()((('"##"%""##
- at 30BB2AAXX080903:3:50:168:1256#0
-TACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGCTTCACGAT
-+
-67777788888888888888888877776555443222100/...---,,-+****)))%))'((('"""##$#""
- at 30BB2AAXX080903:3:59:1069:949#0
-ATACGAATGGGGGCTTCAATCGGGAGTGCTACTCGATTGTCAACGTCAAGGAGTCGCAGGGCGCCTGGGTCCAACC
-+
-67777788888888888888888807476555443.2210/-/---,,,,+%+)'*')*)#')((&#'"$#$#$$#
- at 30BB2AAXX080903:3:53:1388:1053#0
-CCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCGCTCGACNC
-+
-677777888888888888888888777765554432+2100//..--*+,+,++**)*)(((()#'&"##$"##"$
- at 30BB2AAXX080903:3:53:1388:1055#0
-CCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGAGTTAAGCCTCCGCTCGACAT
-+
-+77777888888888&82888888+7776.554(32221/0/..,--),++,****))())(('&''"$"%$$###
- at 30BB2AAXX080903:3:8:1568:1708#0
-TAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATNTCTATCNN
-+
-67777788888888888888888877776555443222000/...-----+++**))(()())((''"%$"#$#""
- at 30BB2AAXX080903:3:49:888:799#0
-AGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGCACAACA
-+
-677777888888888888888888777763554432221000/.-----,,,+++*)))())))(''&%#"#"#"#
- at 30BB2AAXX080903:3:34:923:1335#0
-AATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACTCGATTGTCAACGTCAGATCGGAAGAGGNCCACTANN
-+
-67777788888888888888888877776555443222200/...---,,-++****))))(((('&"$$#"""""
- at 30BB2AAXX080903:3:44:963:1402#0
-CAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCCTTCGTATAATAATTAC
-+
-67777788888888888888888877776555342222100./.--.,,,+,**)))*'#))((('&&#"$%$%##
- at 30BB2AAXX080903:3:41:1544:692#0
-ATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACTNGATTCTGCAT
-+
-67777788888888888888888877776555443220100//..---,,,,+****)')((('&#''&&#"%""#
- at 30BB2AAXX080903:3:3:50:788#0
-TCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTAGATCGGAAGAGCGGTTCNCGCANAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))(((('%'%"#""#"##
- at 30BB2AAXX080903:3:48:415:1835#0
-AGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGAGATCGGAACACATACA
-+
-6777778888888888888888887777655544322210///..---,,+,+****))()))(('%%$#$""###
- at 30BB2AAXX080903:3:39:1217:1534#0
-ACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGAGTACTACCCGGC
-+
-677777888888888888888,38771705554432201000...-*-,,+,#+)()*)())(((%'"%#""""##
- at 30BB2AAXX080903:3:3:378:970#0
-CGAGTAGTACTCCCGATTGAAGGCCCCATTCGTATAATAATTACATCACAAGACTACGTGCACTCAGCNGCACNTA
-+
-/777778888888088+88-88*7367715551431)-00/-/*-+-+,,+(*)*&'&()'('('(&"""%$#"##
- at 30BB2AAXX080903:3:48:332:389#0
-GTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCACA
-+
-67777788888888888888888877776555443222100//..--,,,++*++)**)))))((''%"""$#"$"
- at 30BB2AAXX080903:3:42:1014:996#0
-TGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATAGATCAGGTGAG
-+
-67777788888888888888888877-76+524,3222100/...,-,,+++++*)))&)''('(('&"$%"#$""
- at 30BB2AAXX080903:3:54:405:651#0
-GTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGGCGTACTG
-+
-67777788888888888888888877776555443222100//..---,,,++****)*)))(((((&#"""""""
- at 30BB2AAXX080903:3:48:927:148#0
-CTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATTATTATACGAATGGGGGCTTCAATCGGCTC
-+
-67777788888888888888888877776555443222100//.----,,,+++*)*)))))()(('"##%"$###
- at 30BB2AAXX080903:3:39:124:840#0
-TCCCGATTGAAGCCCCCATCCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCTCCATCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""#$%"#"#
- at 30BB2AAXX080903:3:56:164:1145#0
-AAGCCTAATGTGGGGACAGCGCATGAGTGCAAGACGCCTTGTGATGCAATTATTATACGAAGGGGGGCTTCATGCA
-+
-677707888888888888838888777765534/*2$-+00%/-'-$(,&+*+*+&*))((((((('$"%%#$"##
- at 30BB2AAXX080903:3:48:1028:1375#0
-TCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAACACAGATGCCTGA
-+
-67777788888888888888888877776555443222100//...--,,+++***)*)))((('(&$""$"""""
- at 30BB2AAXX080903:3:50:1605:1316#0
-GGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTAATCGCCATAC
-+
-67777788888888888888888877776555443222100//...--,,+,+****)*))))(((&"#"####""
- at 30BB2AAXX080903:3:41:936:1607#0
-GTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGATGTTATTTC
-+
-67777788888888888888888877776555443222100/../---,,,+*****())(()((('&&$"&%"##
- at 30BB2AAXX080903:3:1:324:1365#0
-CGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTGCNCCNACTA
-+
-6777778838888888888-888877776653.4+23210/*/..-,,,+++++*)*(()('('(''$""#""#""
- at 30BB2AAXX080903:3:4:1469:1727#0
-GACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCTTGTNATCANAN
-+
-677777888888888888888888777;6555443222100.0..-.-,,+*+)+**'))()()(''""##"$"#"
- at 30BB2AAXX080903:3:58:705:800#0
-TTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTCAGATCAACA
-+
-67777788888888888888888877776555443222100//.-----,+++***()))))(((%'&$""#"###
- at 30BB2AAXX080903:3:39:545:202#0
-TTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACGTGTTGTGTGT
-+
-67777788888888888888888877772655443202201//..+-+,,+++)***)))((((((&"&#%#$"#"
- at 30BB2AAXX080903:3:2:693:710#0
-GGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGAGTGCAAGACTNCTTGCGA
-+
-67.7778888888888-2888888777+3555413212000/....-+,++,**+*)*)()((('(%""$##"$""
- at 30BB2AAXX080903:3:56:118:1345#0
-CGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAACGNCAC
-+
-67777788888888888888888877776555443222020//.----,,,+*++*)())()(((''&#%%%"%##
- at 30BB2AAXX080903:3:33:1223:231#0
-GTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCNACACCGNN
-+
-67777788888888888888888877776555443222100//..---+,,+*+*)**)))()'(''"&%%###""
- at 30BB2AAXX080903:3:57:846:32#0
-CTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCCAAACCAAAAGTTGCAC
-+
-67777788,44888888)888888-77765554/32120200/,,.--,,,++'+**'(#)'((('&$%%""""#"
- at 30BB2AAXX080903:3:38:1290:1328#0
-GGTGAAAGTGGTTTGGTTTAGACGCCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCAGCTACAC
-+
-677777888888888888888888'77765.5443222000+/..--,-++,**+***)))(((''''&&"$#%$%
- at 30BB2AAXX080903:3:55:1336:1222#0
-GCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGGGGACAGCTCATGTCT
-+
-67777788888888888888888877776555443220100//..---,,+,+***))))))(((('&&"#%#"#"
- at 30BB2AAXX080903:3:50:399:847#0
-TAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGAGAGCGGGATAGCATA
-+
-6777774888888888.8888+887777655544022211//.....-,,+++*)))*'*))(('('"$"""""#"
- at 30BB2AAXX080903:3:60:1458:90#0
-TCGTGTAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATGTGCAACACANN
-+
-6777778888888888888888887777655544322210.//.----,,+++****))))(((((&$$&%%$%""
- at 30BB2AAXX080903:3:39:591:412#0
-CGGTCGTGTAGCGGTGAAAGTGGTTTGGTTTAGACGTCCGGGAATTGCATCTGTTTTTAAGCCTAATNTCTGGCTC
-+
-67777788888888888888888877776555443222100//-.---,,++++**)*))))(((('"&"&$"$$"
- at 30BB2AAXX080903:3:48:249:1899#0
-CGTAGTATACCCCCGGTCGTGTAGCGGTGAAAGTGGTTTGGTTTAGATCGGAAGAGCGGGTCAGCAGGCACACCAG
-+
-67777788888888884883882827776)424132021/00/.,-,,$+,$****#*)#'##(#%#"$"$"###"
- at 30BB2AAXX080903:3:56:809:400#0
-GCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGCGC
-+
-67777788888888888888888877776555443222100//..---,-++******))))(('(''%%%#"#""
- at 30BB2AAXX080903:3:49:86:1814#0
-CCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAAGATCGGAAACTCTAAGA
-+
-67777788888888888888888877776555443022//0//..---,,+++**(()*))(&(('#%&#$"""""
- at 30BB2AAXX080903:3:58:451:451#0
-GCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGGGGGGGGGGGGAAGAGGGGTGGGGTGGCACTA
-+
-6777778888888+8*88)58888177*0555441.01/.0#-&'.(-,$+,*+#%#(#()(#%%'%"$""###""
- at 30BB2AAXX080903:3:46:1228:901#0
-CGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGGATACTACGGTGAATGCTCTGAAGATCNGTCANTCA
-+
-6777778888888888888888887777650543232210&//...,,,,*(*+)**)))((()(&'"%""""##"
- at 30BB2AAXX080903:3:50:1369:893#0
-GTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGCGGGCACAC
-+
-677777888888888888888888777765554432221-0//,,-,--,,+++*))*))('(((('$"""#"$$#
- at 30BB2AAXX080903:3:40:316:521#0
-GTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGCGGTGAAAAGATCGNCAGANTTG
-+
-6777778888888888888888887777655544322210.//..---,,,+++***))()(((((&"$&#$"#"#
- at 30BB2AAXX080903:3:53:1411:320#0
-AAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGGAGCCCCC
-+
-67777788888888888888888877776555443522100//..--,,,+,+***))))(((('('"""#$###"
- at 30BB2AAXX080903:3:3:332:1924#0
-AACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATAGATCGGAANTATNNAC
-+
-6777778888888888888888887777655244+00000,/..',++',,++*+()()(('((('%""#""""##
- at 30BB2AAXX080903:3:40:280:850#0
-AACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACNACAGTTTC
-+
-67777788888888888888888877776555443222110//..---,,+(+***)*))((()'('"&%&%%#"#
- at 30BB2AAXX080903:3:54:19:1254#0
-AACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACACTCTC
-+
-677777888888888888888888777763554130+110//.&--,,,,+)*+***)()')'&(&%$"%&####"
- at 30BB2AAXX080903:3:44:772:1528#0
-TGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGCGGTGAGAGGAGG
-+
-677777888888888888888888777765554433221000/.-..-++,++**#))()(''#('%'$""$""#"
- at 30BB2AAXX080903:3:37:1333:596#0
-CTTTCACCGCTACACGACCGGGGGGATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGCTNCACACN
-+
-677777888888888888888888'723355424+2.1)00..+,-,,*++*)***)))()'(((&'$""%%$%%"
- at 30BB2AAXX080903:3:36:521:647#0
-TTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCGGTGGAGCAAACCACAGCAGTTCATCGN
-+
-67777788288888888888888877476-554312$2,0/..---+,$,*++**))))&('(''#%$""&""$""
- at 30BB2AAXX080903:3:57:835:1005#0
-TTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCGTCACAC
-+
-6777778888888888888888887777655544322210////,---,,+++****))((((('''&%"&&$###
- at 30BB2AAXX080903:3:41:1206:402#0
-ATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTAGGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('&&%&#%"#"
- at 30BB2AAXX080903:3:46:741:1359#0
-ATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCAGATCGGAAGAGGCGACCT
-+
-67777788888888888888888877776555443222100//..----,+++*****))))(((('"$"#""##"
- at 30BB2AAXX080903:3:43:384:520#0
-CGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATAGATCGGAAGAGCGGAGCGT
-+
-67777788888888888888888877776555443222100//..---,,,++****)*))((((('$&%$"""""
- at 30BB2AAXX080903:3:41:648:339#0
-ACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCGGTCGTGTACAGG
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))(((((&&%#$"#""
- at 30BB2AAXX080903:3:46:1790:517#0
-ACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATTGACCGTAGTATACCCCCAGATCGGATGTGG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$%$""#""#
- at 30BB2AAXX080903:3:35:68:47#0
-GACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTNTCCACCNN
-+
-67777788888888888888888877776555443220100//...-,,,,+++**)*))))()(''""$#$#$""
- at 30BB2AAXX080903:3:45:45:1174#0
-TAATTCTAGGACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGTGCATTGACCGCAGTATCGCACAGTC
-+
-6777778888888888888888&87'770551/45(1/0/+//.,--#',(++*(***)))%)((('$"%&%##"#
- at 30BB2AAXX080903:3:4:858:1672#0
-GGGGGTATACGACGGTCAATGCTCGGAAATCTGTGGAGCAAACCACAGTACCATGCCCATCGTCCTAANGTTCNCN
-+
-67777-888888888888888488$77.055544021110/..---.-+-&')**))))()'(('#'"""#"$"""
- at 30BB2AAXX080903:3:41:1449:963#0
-GGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCAGATCGGAAGAGCTGATC
-+
-67777788888888888888888877776555443222100//..----,++++***))))))((('&%%#""#""
- at 30BB2AAXX080903:3:54:361:148#0
-TACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAAGATCGGATGAGGCCA
-+
-67777788882888888888888877776.554322221.0./..+--,,++***))))(')(((''""$##"##"
- at 30BB2AAXX080903:3:39:1478:1360#0
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAGATCGGAAGACGCTACA
-+
-6777778888888888888278887777655534322210///.-..,,,**+*))(*()(('(((%"$""""#$"
- at 30BB2AAXX080903:3:57:418:358#0
-CTATTTCAAAGATTTTTAGGGGAATTAATTCTAGGACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((''&$$$"####"
- at 30BB2AAXX080903:3:47:553:1649#0
-AACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATCTCCACCTC
-+
-67777788888888888888888877776555443222000//.----,-+++***)*))(((((('"$"$""#""
- at 30BB2AAXX080903:3:33:633:44#0
-CACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACAGNCGACCANN
-+
-67777788888888888888888877776555443222100//..-.-,,+,+*****)))))((('"%"$$##""
- at 30BB2AAXX080903:3:47:883:1377#0
-GCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACAGTGAAATGCCACAGCATCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''"&%"&""""
- at 30BB2AAXX080903:3:36:1201:1481#0
-AGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTAGAGCGGAGTGN
-+
-6777778888888-888888888877776555443222100//..--,,,+++***))))))((((&$$%%#&$#"
- at 30BB2AAXX080903:3:48:1399:1131#0
-GAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATAGCCC
-+
-6777778883.8888888881888777745555/322212,//.--,--++*++**))())&(('(#%$""""##"
- at 30BB2AAXX080903:3:41:370:46#0
-CCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATAAGATCGA
-+
-67777788888888888888888877776555443222100///.---,,+,++**))))))(((''&%%&&%#""
- at 30BB2AAXX080903:3:40:930:166#0
-ATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGGCATTTCACTTGAAAGCAT
-+
-67777788888888888888888877776555443222100/...,-,,-++****)*((')(''''"#&""$"""
- at 30BB2AAXX080903:3:35:1689:1731#0
-TGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGGCATNTACCACAN
-+
-67777788888888888888888877776555443222100//..---,,+*+****))))(((&'&"$"#$###"
- at 30BB2AAXX080903:3:54:167:2042#0
-GGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTGGGTGTGCTCT
-+
-67777788888888888888888877776555443222100//....,,-,++*+*))**)'('(''&"""""""$
- at 30BB2AAXX080903:3:49:1491:672#0
-GAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTACCCCCATACTCCTTACACTATTCCTCCTCCCCC
-+
-67777788888888888888888877776555443222100//.-,---,+++****))))))((('"$##$$"$"
- at 30BB2AAXX080903:3:52:1229:1602#0
-GGGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAAGATCGGAAGAACGCATATC
-+
-67777788888888888888888877776555433222100//..-,,,,+*+***))))(()(((#$%#$""##"
- at 30BB2AAXX080903:3:39:1032:1412#0
-TGGGTGATGAGGAATAGTGTAAGGAGTATGGGGGTAATTATGGTGGGCCATACGGTAGTATTTAGTTTGTGGATCG
-+
-6777/78888888888888888887777655544/2321/0//..--,+,,,+**)))%((()((&'"%"#""##"
- at 30BB2AAXX080903:3:35:1368:1190#0
-TACCGTATGGCCCACCATAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATANTACGACAN
-+
-67777788888888888888888877773555442311000/-..,.--,+,+)*'))))()(((('"$"&$##""
- at 30BB2AAXX080903:3:51:397:327#0
-TCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAAACTACCACCTACCTCCCTCAGATCAGCAGCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))((((('%%""###""
- at 30BB2AAXX080903:3:48:827:1949#0
-TATGGGCTTTGGTGAGGGAGGTAGGTGGTAGTTTGTGTTTAATATTTTTAGTTGGGTGATGAGAGATCGGTGTACA
-+
-67777788888888888888888877776555443222100//-.---,,+++***))))))(('((%&$""""#"
- at 30BB2AAXX080903:3:1:1335:238#0
-TTATGGGCTTTGGTGAGGGAGGTAGGTGGGAGGTTGGGTTGAATATTTTTAGTTGGGTGATGAGGAATNTCNCATC
-+
-6777778888888888888088'177976%+54432/220&/-(.,,-++$+)**+*()(()'((#%&"%%"#"$#
- at 30BB2AAXX080903:3:33:1244:1003#0
-TTATGGGCTTTGGTGAGGGAGGTAGGTGGTAGTTTGTGTTTAATATTTTTAGTTGGGTGATGAGGAGNTCACGANN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))((('(&""%#$""""
- at 30BB2AAXX080903:3:56:695:1485#0
-TTATAACAAACCCTGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGTCCACA
-+
-67777788888888888888888877776555443222100//..----,++++**))))))((&('$&$%"##""
- at 30BB2AAXX080903:3:51:548:134#0
-GGTAGGCCTAGGATGGTGGGGGCAATGAATGAAGCGAACAGATTTTCGTTCATTTTGGTTCTCAGGGCATGTCGTC
-+
-67777788848888(88)88888877276/55443222100./..-.-+,+,+****)())((((('$"""$#$#"
- at 30BB2AAXX080903:3:33:813:140#0
-AAACCCTGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTNCTCTCCNN
-+
-67777788828888888888888870776555443222110//..-.-,-,)++*))))(#(()('&"""&"$"""
- at 30BB2AAXX080903:3:35:57:41#0
-ACTGCGGCGGGTAGGCCTAGGATTGTGGGGGCAATGAATGAAGCGAACAGATTTTCGTTCAAGATCGNACTGCTNN
-+
-6777778888828888888884887777655544322210///..--,,,,++*+))')))()((''""#""$#""
- at 30BB2AAXX080903:3:55:177:33#0
-TGAGAACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCATCCGCCA
-+
-67777788388888888888888877776555443222/20//...-,,++,++*))())(()((('"""%#&##"
- at 30BB2AAXX080903:3:1:1744:1275#0
-GATCAGTACTGCGGCGGGTAGGCCTAGGATTGTGGGGGCAATGAATGAAGCTAACAGATTTTCGTTTANTANGCGC
-+
-6777778888888888888,/84+7677)5452/31/-$.+#,$,$,',$%$%'#))(#'((#####""#""#$"#
- at 30BB2AAXX080903:3:35:160:590#0
-GAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCNGNTTGATN
-+
-67777788888888888888888877776555443222100//..---,,+++**)*))))()((('"""""""""
- at 30BB2AAXX080903:3:43:1214:1240#0
-AAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCAGAT
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*))))))(((''&$%&&%%#%
- at 30BB2AAXX080903:3:45:1521:1467#0
-TGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCCACCAA
-+
-6777778888888888888888806777656534322-201//.-,-+,+%**)**)))(()(#'%'&"$#""""#
- at 30BB2AAXX080903:3:38:443:1978#0
-ATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGTGGGCGTGGGGTACATGCCAT
-+
-67777788888888.8883888887777355344/02222,./...--+,+$+**&')*#('#('''$$$##"#"#
- at 30BB2AAXX080903:3:53:233:1784#0
-CCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCACAGCTCT
-+
-67777788888888888888888877776555143222100//.-.,,,,,,***+)*)('(((('&&$#&##%$$
- at 30BB2AAXX080903:3:37:693:1716#0
-TTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGCAGCGTCGN
-+
-67777788888888888888888877776555423022100./..--,-,++++**)**)))()(('"#"$""#""
- at 30BB2AAXX080903:3:53:359:2024#0
-CGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCTGCGNGGC
-+
-67777788888888888888888877776555443222100//.-.,-,,,,+***())))((((''"""#""""#
- at 30BB2AAXX080903:3:44:23:239#0
-GGGTGGTGATTAGTCGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGCTCAGCGT
-+
-677777888888888888888888777765554432121/0//..---,,,++***)))()((((('&$%$"#"""
- at 30BB2AAXX080903:3:50:1005:1852#0
-TGGGTGGTGATTAGTCGGTTGTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATCACGAGTC
-+
-67777788888888888888888877776555443222100//..---,-+,+***)))))))('('$$"#""#""
- at 30BB2AAXX080903:3:58:338:941#0
-CATTGTTGGGTGGTGATTAGTCGGTTGGTGATGAGACATTTGGAGGGGGGGATCAATAAGACCGGAAGGGCGGTNG
-+
-6777778888288888888888887777655.4132$2100//(.-(-,,,(+*))))%))%'('#&'$&$#""""
- at 30BB2AAXX080903:3:52:742:1486#0
-TTTGAGGTTAGTTTGATTAGTCATTGTTGGGTGGTGATTAGTCGGTTGTTGAGATCGGAAGAGCGGTTACGGCGTA
-+
-67777788888888888888888877776555443222100//..,.--,,(+)*&)*())&(%('%$"#$""$##
- at 30BB2AAXX080903:3:35:1095:1149#0
-CAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACNACACTACN
-+
-6777778888888888888888887777:555443221100/-..---,-+,+****))))(((('(""$$%$"#"
- at 30BB2AAXX080903:3:40:404:30#0
-TTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTGTTGGGTGGTGGTTCGTTCGCAC
-+
-67777788888888888888888877776555543022110//..-,-+,+,+***)*)')('(&('%%&$"$"#"
- at 30BB2AAXX080903:3:39:1091:874#0
-TTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGCTTGATTAGTCATTGTTGGGGTCATGTTTG
-+
-67777783888828888888888847779555443222000/).,---,+&++$**'())(()'(''%""$"%"""
- at 30BB2AAXX080903:3:44:1704:99#0
-TCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGAGATCGAAAA
-+
-6777778888888888888888887777655544322210///..---,,+,+**))*))))(((''&"#&&""##
- at 30BB2AAXX080903:3:44:1253:615#0
-CAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTGTTGGGGGTGGG
-+
-67777788888888888888888877776555443222100//-.-,--,+,+***)))((((((''&'"&%""#"
- at 30BB2AAXX080903:3:8:438:1040#0
-GATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTGATTAGTCATTNTGTACANN
-+
-67777788888888888888888877776555443222.00//..---,,+++)**))))()(((('""""#$#""
- at 30BB2AAXX080903:3:40:1474:769#0
-ACAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATC
-+
-67777788888888888888888877776555443222100//..---,,++++**()))))(('('&&&&%%%"#
- at 30BB2AAXX080903:3:48:917:191#0
-CAATGACTAATCAAACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))())'('""&%#####
- at 30BB2AAXX080903:3:34:1231:82#0
-TAGTATAAGAGAGCAGGTTCGCCCTTTAGGGTTGTGTAGGGTTATCATGTGGTTGGAGGTGAGTTTGNCTTATCNN
-+
-67777788888888888)180%887'7-6)55440222000%/.)-,+&,+*+*&)&))'&'((%''"$#$##$""
- at 30BB2AAXX080903:3:33:252:2022#0
-CTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTTTGGTTATCATTTGTTTTGAGGTTAGTTTNCTCACCNN
-+
-6777778888888888883888807717:5-504322/$01/..'.+*,,+*++**)'()%(#&(('"&#%%##""
- at 30BB2AAXX080903:3:40:1333:321#0
-CTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGTGGTTAGTTTTGTGTTGTC
-+
-67777788888888888858883872779555443222100/./.-,-,,+*++**(#))()'('(''"#$""#"#
- at 30BB2AAXX080903:3:2:1735:1532#0
-ACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGGTTATCATTTGTTTTGAGGTTAGTTTNATTAATA
-+
-67777788888888888888888877776355443222000//-.,--,,,++***))())()(('''"#&%""#"
- at 30BB2AAXX080903:3:3:795:1431#0
-ACTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATNCGTGNCA
-+
-6777778888888888888888887777655544322211//./.---,-,,+*+***)))))((''%"%$$$"$$
- at 30BB2AAXX080903:3:47:1767:821#0
-CTAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTACTCA
-+
-67777788888888888888888877776555443222100//..-,,,,+,+***))*))))((('$"#%"$"#"
- at 30BB2AAXX080903:3:58:291:1771#0
-AATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATAGATCGGAAGAGCGGGCACTNN
-+
-67777788888888888888888877776555343222000/..----,-+++***()())#(('(#'&$%"#"""
- at 30BB2AAXX080903:3:2:320:448#0
-AACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAAGATCTNCATNNCT
-+
-677777888888888888808836677765320400/,00..,.--,,,+*,+*))*'())((('&#""%$"""""
- at 30BB2AAXX080903:3:1:144:1353#0
-TGTGGCAATAAAAATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTCCTTTAGTGTTGTGTATGTNAGNTCGC
-+
-67777788888888888888888877776553443212100//.,-----+++****))))()'('&&"#""#$#"
- at 30BB2AAXX080903:3:57:1377:1121#0
-AAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGAGTCACCAC
-+
-67777788888888888888888877776545443222100//..----,+++*+**))())((('&%"$$##"#$
- at 30BB2AAXX080903:3:41:1309:447#0
-CTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACAGATCGGAAGAGGCGCTAC
-+
-67777788888888888888888877776555443222101//.--.-,,+++***)))()))((('&"&"""""#
- at 30BB2AAXX080903:3:39:1431:1414#0
-ACAACTAACCTCCTAGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGTGAT
-+
-67777788888888&882888888777765554432101/./.----,+*+++***(*))()'(((#%$$"$""#"
- at 30BB2AAXX080903:3:8:1140:1420#0
-TCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATNCACTCCNN
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))*)())((&"&&&$$#""
- at 30BB2AAXX080903:3:35:1494:1271#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNACTCATCN
-+
-67777788388888888888888877776555363022100//..--,+,++'**)*((()'()(''"##"##"#"
- at 30BB2AAXX080903:3:35:1618:817#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNTCCACNAN
-+
-67777788888888888888888877776552443222100/...---,,+,++**))())()('('""$%##"""
- at 30BB2AAXX080903:3:52:1303:1113#0
-CTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCCCCTATGAG
-+
-67777788888888888888888877776555443222100//..---,-+,+****))**()((''"$#&$%##$
- at 30BB2AAXX080903:3:60:477:1222#0
-AGCGAAAGCCTATAATCACTGCGCCCGCTCATAAGGGGATGGCCATGGCTAGGTTTATAGATAGAACGCGACACNN
-+
-677777888888888888888888177705/21432222/0/#.,,--,+()*()*(*))#'(#'#%%$%$$$$""
- at 30BB2AAXX080903:3:48:328:1561#0
-CCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCGCTAGATCGGAAGAGCGGGGCATCCA
-+
-6777778888888888488888887777655544322110///..--,,,+++(+*)())&)(((%("""#""###
- at 30BB2AAXX080903:3:45:1554:358#0
-GGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCCCGCTCATACGCTCGGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"&###$#""
- at 30BB2AAXX080903:3:57:1514:774#0
-ACTTGGGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCAGACACAGACCT
-+
-+777778888888888888/888877776555443222100/...---,,+++***))))))((''&$$%#""###
- at 30BB2AAXX080903:3:34:440:1530#0
-AGCGGGCGCAGTGATTATAGGCTTTCGCTCTAAGATTAAAAATGCCCTAGCCCACAGATCGGACGAGNCACTTGNN
-+
-67777788888888888888888877776555443222100//.-.--,,+++***)*))*))((((""#%"""""
- at 30BB2AAXX080903:3:3:789:195#0
-GGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAACNACACNGN
-+
-6777778888888888888888887777655-44320,000//./.-+,-,++*'**)))'&(((''&"%&#""$"
- at 30BB2AAXX080903:3:36:1306:1933#0
-TATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGAGCTCATAANN
-+
-6777778888888888888888887777655544322000///.-.--,,++*+**))))'))((('&"%#$"#""
- at 30BB2AAXX080903:3:45:1021:220#0
-TAGTATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAATCTTAGACCGCTTC
-+
-677777888888888888888888577765554432320011/-.---,-+,+****)))()((('''#"#"$""$
- at 30BB2AAXX080903:3:48:1229:169#0
-AATAACTAGTATGGGGATAAGGGGTGTAGGTGTGCCTTGTGGTAAGAAGTGGGCTAGGGCATTTTTAACAGTACAT
-+
-67777788888888888888888877776555443222100//..--,,,++++*))*))))(((('"$"##""#"
- at 30BB2AAXX080903:3:49:1150:664#0
-CTTCTTACCACAAGGCACACCTACACCACTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACCGCATNCN
-+
-677777888888888888888888777+6555443222100//.,---,,+,+***)*))))(('('&#"#"""$"
- at 30BB2AAXX080903:3:4:1188:254#0
-TATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTAGGGAGTANAGGANAN
-+
-6777778888888888888*888877776559443512&/0/...---,(+*++**)()())('&(&&"$%$$"#"
- at 30BB2AAXX080903:3:54:387:719#0
-CCACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCACTCACTAC
-+
-67777788888888888888888877776555443221100//..-.,,,,+******))))((((&&$#%%"#"$
- at 30BB2AAXX080903:3:60:491:1158#0
-CCACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCANCCGCCNN
-+
-67777788888888888888888877776555443222000//..-.,,,+,+++*)*)))))(((''"&$"$#""
- at 30BB2AAXX080903:3:33:1532:2005#0
-CACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCANAACACANN
-+
-67777788888888888888888877776555443232100///.---++,,*++*(**()(('''&"$#&%%$""
- at 30BB2AAXX080903:3:43:1239:1104#0
-GCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTAGGTGTGTCTGGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('(&'&"#%#$#"
- at 30BB2AAXX080903:3:56:503:1997#0
-AAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTAGATCGGGCTCTCG
-+
-677777888888888888888888.7776555443222100/..-.-,,)*+))****))()()'(&'%##"#"$"
- at 30BB2AAXX080903:3:35:1418:1875#0
-CCAGGGCTATTGATTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTNGNACATAN
-+
--77777-8888888888888888877776)554632(21-0/...---,,+,+****&)))(((''%"$"$$"#""
- at 30BB2AAXX080903:3:8:1248:1228#0
-CCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGATAAGGGGTGTNCACCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()('''"%$#%%$""
- at 30BB2AAXX080903:3:49:1066:1369#0
-CCTACACCCCTTATCTCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCAGTCCGCTG
-+
-67777788888888888888888877776555443222.00//.----,,+++****))*)((((('"$"$""$#"
- at 30BB2AAXX080903:3:44:120:280#0
-TACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGGCGCACGC
-+
-67777788888888888888888877776555443022100//..---,,+,++**))))))))((&$"&&$$$$%
- at 30BB2AAXX080903:3:44:594:1611#0
-TACACCCCTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTCGCCGCACGC
-+
-67777788888888888888888877776555443/22001/...---,,++%++)***)(('(('#&'#&$$##$
- at 30BB2AAXX080903:3:56:1329:751#0
-TAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTAGTATGGGGGTCACGAGC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*)))(('''$'"$"#""#
- at 30BB2AAXX080903:3:37:916:1562#0
-TCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCCACCAATAGCCCTGGCCGTACGCCTCACAGCGTN
-+
-67777788888888888888888877776559443222100/'./--,,,++++**))))()()('#$"&"##"""
- at 30BB2AAXX080903:3:37:917:1562#0
-TCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTCGCACCTCN
-+
-67777788888888888888888877776555443222100//.-----,+,*+*+)*))()((('%$$%#"#"#"
- at 30BB2AAXX080903:3:40:267:1995#0
-GTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGATAATAACTNGTATGGGC
-+
-67777788-888888888885788774765554432.210//.-.-,--,,++'**&*)))(('(%'"$""""""#
- at 30BB2AAXX080903:3:38:752:1330#0
-AGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATAGATCGGAAGCGCGTAGTA
-+
-67777788888888888888888877/74555-0/2220/.0-.--(,*+,+%()*())'''((#&&&&%""""""
- at 30BB2AAXX080903:3:2:1530:272#0
-GGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGAGATCGGAAGAGGGGTTCAGGAGGAACNCGTCAGA
-+
-67.777888488828888868)14(8151$3+,(3/$'$/0)**%$,,$*)$'$*&#&%#%######%"$""#""#
- at 30BB2AAXX080903:3:43:1278:1568#0
-GGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATCGGTTGAATGAGAGATCGGAAGATGGGTCC
-+
-67777788888888888888888877776555423222200/0..-&-,,++++**)))*)((('''&"##$""#"
- at 30BB2AAXX080903:3:42:997:330#0
-GAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTAC
-+
-6777778888888888888888887777655544322210///..---,,,++*+**))*)()('(''&%&%%%##
- at 30BB2AAXX080903:3:49:263:57#0
-AACCATCAGCCTACTCATTCAACCAATCGCCCTGGCCGCACGCATAGCCGCGAACATTCCTGCAGGCAATCTACAC
-+
-6177778888238/8888'88888(77-63554)3(10&*1./(.+--&-++*%'))('((&(('&'"""$##$#$
- at 30BB2AAXX080903:3:55:910:332#0
-CCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACCCCT
-+
-67777788888888888888888877776555443222100/0..---,,,,+***))**))(((('%&""#"$##
- at 30BB2AAXX080903:3:41:1403:613#0
-GGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGCGGCGTGC
-+
-67777788888888888888888877776555443222100./,.----,(++**(*))*)&()(%#%$%""""""
- at 30BB2AAXX080903:3:34:1027:420#0
-CAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAANCTCAATNN
-+
-67777788888888888888888877776555443222100//..---,,,++**)*))))((((''"$#$"#"""
- at 30BB2AAXX080903:3:39:306:1054#0
-CTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGTCGCACCC
-+
-677777888888888888888888777765554432220/0//..-.-,,,,+****()())'(&''&"$%%%###
- at 30BB2AAXX080903:3:46:855:493#0
-CTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGAG
-+
-67777748888888888888888577776555443222100//-..--,,+++*+*))*)*)((&(&"""$"$""#
- at 30BB2AAXX080903:3:51:1297:908#0
-CCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCCCCCCAGA
-+
-6777778888888888888888887777655544322110///..--,-,,,**+)*))))(((((&$%#%##"$"
- at 30BB2AAXX080903:3:48:1038:1951#0
-TGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCGAGGCGTCGCTCCTGG
-+
-6727778888888888888888887%7+355543/22110/0/.)+-+,,++*+()'*)(&'(('(&"$""$""""
- at 30BB2AAXX080903:3:8:452:567#0
-TGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGAGATCGGAAGANGCTCACNN
-+
-6777778888888888888888887876655045222110....---,,,,+++))()))')(('(%""##%##""
- at 30BB2AAXX080903:3:41:186:1539#0
-CTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAGCCTAGCAA
-+
-67777288888888888888888877776555443022.00-....--,,+*+)****)()((((('&&##$%##"
- at 30BB2AAXX080903:3:52:833:1365#0
-TGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGATCG
-+
-67777788888888888888888877776555443222100//..---,-,+****)**))((((('&$""%#"#$
- at 30BB2AAXX080903:3:55:968:40#0
-TACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAGTATCACC
-+
-67777788888888888888888877776555443222100//..--,,-+,++**)*)))(((('($""&%%$"#
- at 30BB2AAXX080903:3:2:1784:713#0
-AATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGNTGTCACA
-+
-67777788888888888888888877776555443222110//...--,,,,+****))()()((''"""#"$###
- at 30BB2AAXX080903:3:47:1643:746#0
-AATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGATCGTCAC
-+
-67777788888888888888888877776555443222100///..,-,,++*****)))()(((('$"%%$##"#
- at 30BB2AAXX080903:3:49:1363:728#0
-CTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAGATCGACTACTAC
-+
-6777778888888888888888887771655544222000,/.-,----,++)*))**)()))((#'"#%#$%""#
- at 30BB2AAXX080903:3:57:995:288#0
-CTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGAGATCGGAGTTCGAT
-+
-67777788888888888888888877776555443222100//.---,,,+++****))))()((''&'$""####
- at 30BB2AAXX080903:3:54:1625:296#0
-TAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTCACACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"""%#%#$$
- at 30BB2AAXX080903:3:57:18:1373#0
-TAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCTCCCGA
-+
-6777778888888888888888887777655544312200///.--,,,,+++***)*))(((((''%'#"###"#
- at 30BB2AAXX080903:3:46:575:295#0
-AGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCCTTCAC
-+
-67777788888888888888888877776555443222110//..-,-,,+*+****)))()()(('$$""""$##
- at 30BB2AAXX080903:3:56:1611:1757#0
-CGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGATCGGAAGAGACACCACCAC
-+
-67777788888888888888888877776555481222100//..----,+++****)))))((('&$$%####"#
- at 30BB2AAXX080903:3:4:1381:662#0
-TACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTTNACACNTN
-+
-6777778888888888888888887777655544322200/....--,-,,++**))))))((('('""#""#"""
- at 30BB2AAXX080903:3:2:74:682#0
-TGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTNTACNNCA
-+
-677777888888888888888888777765554/3222100//.----,,+++***))))'()((''""#"#"""#
- at 30BB2AAXX080903:3:36:1332:585#0
-CAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAAGATAGCGTACAN
-+
-677717888888888888888888777765054432121*0//.-+,,-(+*+*+)))))'))(((&$&"""###"
- at 30BB2AAXX080903:3:42:1459:1447#0
-GACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGGGGGCTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''&&#"""#""
- at 30BB2AAXX080903:3:42:1609:1743#0
-TGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGTAGCNGTNT
-+
-67777788888888888888888877776555443222100//...---,++++***))))(()('&&"&%"$#"#
- at 30BB2AAXX080903:3:60:1070:1554#0
-AAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAATATNN
-+
-67777788888888888888/88837776555443222100//..-*-,,++****)))))()'(''%&"##$"""
- at 30BB2AAXX080903:3:48:1219:633#0
-GTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCAATTAGGTGCATGAGCA
-+
-67777788888888888888888877736555443222100//..---,,+++***)**)))(('('&&"$"""#"
- at 30BB2AAXX080903:3:36:152:536#0
-TGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTAGATCGGACACTCAGCAN
-+
-67777788888888888888888877776555443222100//..---,,++++**'*))))(('(#%&"##"$$"
- at 30BB2AAXX080903:3:42:664:84#0
-TTGTGAAGATGACAAGTGGAGAGGGAAGGTTAATGGTTGATATTGCTAGCGTGGCGCTTCCAATTAGGTGCGTGAG
-+
-677077888888888888,8888877776%55443202101//...-,,&+'+****()((&((('('%$##""""
- at 30BB2AAXX080903:3:48:79:390#0
-CACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACGTGTCATCTTCAGTATTATCA
-+
-67777788888888888888888877776555443221100+/..----,+++**()*)))((((('""""#""#"
- at 30BB2AAXX080903:3:2:674:750#0
-ATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCTTCCNATTACGT
-+
-67777788888888888888888576776555813202110//...-,--*,*+**)*&)((('('%&"#%%##""
- at 30BB2AAXX080903:3:1:248:1480#0
-TAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAAGANCTNCACC
-+
-67777788888888888888888871/76555423212/0../,-.-,,,++'**)*((()))((''""#""###"
- at 30BB2AAXX080903:3:1:733:176#0
-TAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGCGCNCCNCCTC
-+
-67777788888888888888888873776555243221100///.---,,,++**+(*))))'(('''""""##$#
- at 30BB2AAXX080903:3:51:1165:1430#0
-TTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTATATCTACT
-+
-6777778888888888888888887777655544302200///..---,,++++**))))))()('&%$"#$%#$#
- at 30BB2AAXX080903:3:49:522:1238#0
-GGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATCCTACCGC
-+
-67777788888888888888888877776555443222100//..---,,,,+****)))())('(''$#""%""#
- at 30BB2AAXX080903:3:59:159:1062#0
-TCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGNGCGNNT
-+
-67777788888888888888888877776555443222100//.----,,+++****))))((('''&$"#%$""#
- at 30BB2AAXX080903:3:50:1320:1247#0
-AGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGATGGCTGAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''""""#"###
- at 30BB2AAXX080903:3:39:1718:861#0
-TAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGTGTGNCGCG
-+
-67777788888888888888888877776555443222100//..--,,,-++*+*)**)))(('(&"&"#""$#"
- at 30BB2AAXX080903:3:56:44:1379#0
-TAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTAGGGTGGACGT
-+
-67777788888888888888888877776555443222100//-.--,,,+++***)))))((('('&%""$"###
- at 30BB2AAXX080903:3:41:592:1712#0
-AGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCTCGGGCNT
-+
-67777788888888888888888877776555443222100//..---+,+++***))#)))(((('&$"%#"#"#
- at 30BB2AAXX080903:3:44:1626:703#0
-TAGGATAGGCAGGAGAATTAGAATTGTGAAGATGACAAGTGTAGAGGGAAGGTTAATGGTTGATATTGCGGGGGGG
-+
-677777888888888888388888777765554432221/0//..---,,++++**)))))())(((&""&&%###
- at 30BB2AAXX080903:3:60:247:1511#0
-TAGCAATATCAACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATAGACNGCNN
-+
-67777788888888888888888877776555443220000//..---,,,++***)*))*)((((''&##""$""
- at 30BB2AAXX080903:3:36:1723:152#0
-AACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCNCTGTCGNN
-+
-67777788888888888888888877776555443222100/.-..--,,,,+***))*()(((('(""$%#%"""
- at 30BB2AAXX080903:3:8:1781:1665#0
-AACCATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCNCTCTACNN
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))()'('"$#$"$"""
- at 30BB2AAXX080903:3:54:376:1899#0
-CATTAACCTTCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTAGCCTTC
-+
-67777788888888888888888877776555443222100//..---,-,+****)))))((((('%$""%%##"
- at 30BB2AAXX080903:3:3:960:524#0
-TGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGCNTTGANAC
-+
-67777788888888888888888877776555283222100//...--,,+++***))())()((('$"#""#"##
- at 30BB2AAXX080903:3:33:1607:696#0
-TACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCAGANCGCACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(('&"$"$$$"""
- at 30BB2AAXX080903:3:57:8:1053#0
-GTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAANNGTGAGTCTACN
-+
-67777788888888888888888877776555443222100//..---,-,+++***)))))(##('&%#"#""$"
- at 30BB2AAXX080903:3:35:69:938#0
-AGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAAGTGNGACCTGTN
-+
-67777788888888888888888877776555443222100//..---,,+++***'))))())''&"$"##""#"
- at 30BB2AAXX080903:3:1:1685:1109#0
-AAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGATCGGAAGAGCNGANCTCT
-+
-677777888888888888888888777765554432211200/-.-,-,,+)+**))))&))'((''""$""$%"#
- at 30BB2AAXX080903:3:36:976:1832#0
-CACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACATCTCATGNN
-+
-6777778888888888*888888837776555423222100//..-,,,,+++**+)*))))((((%$"&%%##""
- at 30BB2AAXX080903:3:48:745:1420#0
-TTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGATAGATCGGAAGAGCTGCACAAC
-+
-6777778888888888888888887777655544321210//..-,--+,+,+*)*)*)'))((('($"##"$""#
- at 30BB2AAXX080903:3:54:421:1430#0
-TACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTATACCTGCA
-+
-67777788888888888888888877776555443232100//...--,,++++****))))()''("&"%#%"#"
- at 30BB2AAXX080903:3:58:1032:584#0
-TGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGAGATCGGAAGAGGTACATA
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)(((((''&&"#$###
- at 30BB2AAXX080903:3:37:447:245#0
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCACCCTTCCN
-+
-67777788888888888888888877776555443222100//.----,,+++***)*)))()((('$"$%$"##"
- at 30BB2AAXX080903:3:55:377:168#0
-CGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGCGATTTCTAGGAGCGCCTT
-+
-67777788888888888888888877776555443222100//.-----,+++**))))()))((''$$"#%"""#
- at 30BB2AAXX080903:3:46:649:987#0
-TGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAAGATCGGAAGAGCGGGACAN
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))*)))((''&&%"#"#""
- at 30BB2AAXX080903:3:3:1274:1538#0
-GTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGATTAAGGCGACAGAGATCGGAANCTGANGT
-+
-67777788888888888888888877776055423220100//..-.,,-,,++*****))((((('$""""#"""
- at 30BB2AAXX080903:3:46:1087:1732#0
-CTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACAC
-+
-6777778888888888888888887777655544323210/....--,,,+++)****))()))('(%$#$#"###
- at 30BB2AAXX080903:3:57:1147:1633#0
-TAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGAGATACACCT
-+
-677777888888888888888888777765554432211/0//..---,,+,+**))))())(((('$$$%%$##"
- at 30BB2AAXX080903:3:42:1300:1901#0
-TCATTATGTGTTGTCGTGCAGGGAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGAGATCGGAAGCGCGGTCC
-+
-677777888888888888,5883877774+55%332/10//-/,..,)-%,++)'&()&(((#((&#%"&"""##"
- at 30BB2AAXX080903:3:47:1059:419#0
-GCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAGGCCTCTACCTGCACGACAAGATCGGCGAGACAC
-+
-67777788888888888888888878776555443222100//..---,,+++****))))((((('&$"""##"$
- at 30BB2AAXX080903:3:55:484:683#0
-TGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((((('$&#&$%##%
- at 30BB2AAXX080903:3:47:1475:1126#0
-GGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGAGATTCATCACGA
-+
-67777788888888888888888878779552442222100/...--,,,,++**)**)(()((((#"$""%#$"#
- at 30BB2AAXX080903:3:39:1463:257#0
-TGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGAAAACGTAGGCTTGGAGTGTGGGCGC
-+
-6777778888888888888888887777673544323210/-/.--+-,,*++*)*')))(&((('#'$#&##""#
- at 30BB2AAXX080903:3:58:813:1480#0
-GATTGGTGGGTCATTATGTGTTGTCGTGCAGGGAGAGGCTTACTAGAAGTGTGAGATCGGAAGAGGGGTCTCGCAC
-+
-6777778888.888888888888877776555%43222*00.,.--,,,)+*+&**)&))'((((#'&$%&$%$$%
- at 30BB2AAXX080903:3:49:1160:1060#0
-TGTGATTGGGGGGTCATTATGTGTTGTCGTGCAGGTCGAGGCTTACTAGAAGTGTGAAAACGTAGGCGTGGGTTAC
-+
-677777888888888888888888777765554430+21001/...--,,+++*+*)))*()'(('%$$#"""""#
- at 30BB2AAXX080903:3:35:1068:1504#0
-TAATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACNTCTCCACN
-+
-677707888888888,888888887777655544322210/./..---,-+++**)*)())))#'''""##$###"
- at 30BB2AAXX080903:3:47:331:403#0
-ATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAGATCGGAAGAGCGGTTCACCTCTGA
-+
-677777888888888888888888777765654432'0100/-.-.,,-,,+***+*()))((((#%%"##"##""
- at 30BB2AAXX080903:3:8:1010:1323#0
-CATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGCAGAGGCTTACTAGAAGTGTGAAAACGTAGNTCACATNN
-+
-67777788888888888888888)7777655)24322$10)/0...--,,++**)*(*)(()((('(""$#$#"""
- at 30BB2AAXX080903:3:34:1768:778#0
-ATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCANCCACCANN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))((((('"$##%##""
- at 30BB2AAXX080903:3:59:993:1443#0
-ATCCAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACACCA
-+
-67777788888888888888888877776555443222100//..---,,+++**+***)('(((('$&&#%%##%
- at 30BB2AAXX080903:3:58:1636:245#0
-CAAGCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACACACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&'%%&%#$""
- at 30BB2AAXX080903:3:41:118:1901#0
-GCCTACGTTTTCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACAGCACCAACA
-+
-67777788888888888888888877776555413222100//./-,-,-+++**))))))))((''$##$$"###
- at 30BB2AAXX080903:3:40:363:849#0
-ATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTAGAAGTGTGANAACGGACA
-+
-67777788888888888888888877776555443222100//..,--,,+++++))*)))(((('&"&%%$"$#"
- at 30BB2AAXX080903:3:39:1685:253#0
-TACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAAGATCGGAAGAGAGCTGTCAC
-+
-6777778888888888888888887,776555443220110/...,-,-,,'+*****))))(((('"&%"""##$
- at 30BB2AAXX080903:3:52:36:468#0
-TCACACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCATCAATCACATGCCTATCATATCGTAAAC
-+
-6717778888888888888888887777655544321220.0/--+--&,,)*+*))))(()(((''$$#&##"##
- at 30BB2AAXX080903:3:39:682:1555#0
-GCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCAGGTAGAGGCTTACTATCA
-+
-677777888888888888888888777765554432221/1//..---,,++******))))((('%$$#$%""##
- at 30BB2AAXX080903:3:3:839:1051#0
-AGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATAGATCGGAAGANCGCANAC
-+
-67777788888888888888888877576555443122100//./.-,,,+,+*****))()()(('$"#"%#"#$
- at 30BB2AAXX080903:3:50:1447:1377#0
-GGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGAGATCGGAAGAGAGGCACGCC
-+
-67777788888888888888888877776555443222100//..--*-,+++***))*)))(('('"$$##%"##
- at 30BB2AAXX080903:3:35:812:1365#0
-TAGGGGTCATGGGCTGGGTTGTACTATAGGATAGGCATGTGATTGGTGGGTCAGTATGTGTTGTCGTNCGCACATN
-+
-677777-88888888888*8)8887777$5554432221/0//..---,,&+******()')(('('"$"%"$##"
- at 30BB2AAXX080903:3:39:528:626#0
-CTGTTAGGGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTATGTGTTGTCGTGCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('"&&&%&$"#
- at 30BB2AAXX080903:3:56:1233:1459#0
-GAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGTTTTACTATATGATAGGCATGTGATTGGTGGGTCATTTCTCACG
-+
-67777788888888888888088877776555243222100//./-----,++***)))))()('&'&%"#"###"
- at 30BB2AAXX080903:3:49:612:119#0
-CATATAGTAAAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCAGATCCGTCGCGTC
-+
-677777888888888888888888771705554432210...,,'-,*++++'()')'((&))''#&$""###""#
- at 30BB2AAXX080903:3:35:1144:349#0
-TATAGTAAAACCCAGCCCACGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAACGACCTCCGGCCTANGCACCTNN
-+
-6777778888388882808&888877776555443322&01//.,.-',,+++'*+**)()((((%'""#$$#"""
- at 30BB2AAXX080903:3:45:198:34#0
-ATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGGTGTCCTAT
-+
-67777788888888888888888877776555443222100//..---,,+++******))(((('&&&"""#"#"
- at 30BB2AAXX080903:3:50:806:1799#0
-AATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGGGCTGGGATCTCGTA
-+
-677777888888888888888888777365554422201/0//-,---,,,*++**(')))()&'('%"###""#"
- at 30BB2AAXX080903:3:41:1700:667#0
-TAAAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTCCA
-+
-67777788888888888888888877776552403/2120/1+--+,*++****)))(((%'('('&$""""###"
- at 30BB2AAXX080903:3:36:100:148#0
-AAGTGAAATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGTCATGNCTGCGTCN
-+
-677777888888888888888888777765/544321210///-.+--,,++++***))))((('(("$"##""$"
- at 30BB2AAXX080903:3:54:1471:1186#0
-AGTGGAAGTGAAATCACATGGCTAGGCCGGAGGTCATTAGGAGGGCTGAGAGGGCCCCTGTTAGGGGGACTGGGCG
-+
-67777788888888888888888877776555413222000//..+---,,++**)(*))(((('''$&$&&&$#"
- at 30BB2AAXX080903:3:48:1312:1228#0
-GTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCATTAGGAGGGCTGAGAGGGGCCCTGGGTCCTGAT
-+
-6777778888888888888888887777655544322-10+-.+.,--,,,+%*+(*))))#(''##"""##"""#
- at 30BB2AAXX080903:3:37:80:318#0
-TAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTTCACTTCCACTCCATACAAAACAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%$%"""#""
- at 30BB2AAXX080903:3:59:88:186#0
-TAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATTTCACTTCCAGATCGGAAGCACNNC
-+
-67.7/788888888888888888876)7655544322211&//.---+,++*++*+))))'(((('''$%##$""#
- at 30BB2AAXX080903:3:4:1041:1601#0
-GAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCATTAGGAGGGCTGAGAGGGNCCTCNTN
-+
-67777788888888,84888888877776552243212001/..)--#,)+**++)**)'')(((''$"#$"$"#"
- at 30BB2AAXX080903:3:33:788:349#0
-TGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGTCATTAAGATCGGAAGAGCNGCTCAGNN
-+
-67777788888888888888888877776555433222000./..,--*,+*+)**)((()'((((%""#"$#"""
- at 30BB2AAXX080903:3:54:153:584#0
-CCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGCCGGAGGGCCTTAGGAGGGGAGGACNAC
-+
-6777778888888888888888887777655544322110///..---+-,+'**((#()'()#(('$$#$##"##
- at 30BB2AAXX080903:3:43:138:1709#0
-TTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAAATCACATGGCTAGGGCGGGAGATAGGGACA
-+
-6777778888888888888888887777655544322210//*.,--*+,(*%'*#)'))'(((((&'""##"$#"
- at 30BB2AAXX080903:3:54:872:1097#0
-ATGACCTCCGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAAGCGCCCACC
-+
-67777788888888888888888877776555413222100/...+--,,+++***)*)))((('('%&""%""$#
- at 30BB2AAXX080903:3:41:609:997#0
-CGGCCTAGCCATGTGCTTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACACACNGCACA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))*())(''&"%#"%####
- at 30BB2AAXX080903:3:53:547:1856#0
-CGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACACGAACCCGC
-+
-67777788888888888888888877776555443222100//...-,-,+*+***))))((()(('"#$&%%"""
- at 30BB2AAXX080903:3:54:1539:1762#0
-CGGCCTAGCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAGCCAACACAACACACCCC
-+
-67777788888888888888888877776555443222100/....---,,****)))'(()(((''%%&&$%###
- at 30BB2AAXX080903:3:34:1031:852#0
-TGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGCGGAATANCTGCACNN
-+
-677.7788888888888888888877776550443222100//.-----,+++*#**)))&)%(('%"$""##$""
- at 30BB2AAXX080903:3:48:524:52#0
-TTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGGGTGGAAGGGAAAGAACCACNAT
-+
-6777778888888888888888887/77655544020.100//-.--',%,++&*#*)#(('('&(#"""#"#"""
- at 30BB2AAXX080903:3:54:507:1700#0
-CATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGTGAGATAGGCGTC
-+
-67777788888888888888888877776555443222(00//..,-,,,+++***)*))))(#'#'%$#&&#""#
- at 30BB2AAXX080903:3:49:367:735#0
-CATCATTGGTATATGGGTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGAAGGGCAGAGAGA
-+
-67777788888888888888888897776455343201100./...--+,,+(**))*()'(((((#&$""""###
- at 30BB2AAXX080903:3:50:1772:468#0
-ATAACGCTCCTCATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACCCGATAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('('""$$"""#"
- at 30BB2AAXX080903:3:44:498:284#0
-AACGCTCCTCATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGCGAGGAA
-+
-67777788/82888888888884-77471535443132/00./..'-+,,+*++*))**(((&((''$%"&"""$"
- at 30BB2AAXX080903:3:58:918:1206#0
-TTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATAGATCGGACTCGACA
-+
-67777.8880888888888888887777655544322210-/..--,,,,+++*+))**)()))((%'""$#"###
- at 30BB2AAXX080903:3:50:654:1092#0
-TTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATCACACTC
-+
-6777778888888888888888887777654544321'101//..-.--,,++****)))''(((('%$#####"#
- at 30BB2AAXX080903:3:33:1020:135#0
-AAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCACNCGTCTCNN
-+
-6777778888888888888888887777)55544322%001//,---,,-+(*&**')()))((('#"$"##"#""
- at 30BB2AAXX080903:3:33:665:168#0
-AAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATNGCCGCCNN
-+
-677777888888888888,887837777455,%452211001/,,--+,+,'+*()))(()')&(&%""$##$#""
- at 30BB2AAXX080903:3:35:1162:1259#0
-GAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCANGCTACCAN
-+
-67777788888888888888882877776355443222+/1//..---,,++****))))())((('"""%%"##"
- at 30BB2AAXX080903:3:51:1306:1860#0
-CGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCGCCGCTGGA
-+
-2777778888888888888858887777656542222210///..,--,,+*++**))'))(('('%%#$"#$$""
- at 30BB2AAXX080903:3:39:745:1152#0
-ATCGAAGGCCTTTTTGGACAGGTGGTGTGGGGTGGCCTTGGGATGTTCTTTTTTGTGGGTTTATGCGCTCCCCTCG
-+
-677777888888888888888888777-6)55.430)2.00/-..+-,),++*)%#)#%&&#####'$#%""#"$"
- at 30BB2AAXX080903:3:47:1740:970#0
-ATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGGGGCCTTGGGATGTGCTTTCTCGTGTTACATCGCGCGCACAGAG
-+
-677777888888888888888828737.6555%43+2/100',...-',,,$+)**)')(''(&(''%"$"""""#
- at 30BB2AAXX080903:3:41:440:568#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACAAGATCGGGAGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+**))*))()'('&$%"""#"#
- at 30BB2AAXX080903:3:43:363:32#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCAGG
-+
-67777788888888888888888877+79555433232200/...---,,++****())))())(('&&"""%$""
- at 30BB2AAXX080903:3:52:800:576#0
-TATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCCTG
-+
-67777788888888888888888777776555443222100/...----,+++***))))))))(('%$$"%$%$#
- at 30BB2AAXX080903:3:50:152:803#0
-GTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGCGCTTTCTCGTGTTACATCGAGGTAACGA
-+
-677777888888888888888888'7776555443222100//..--$,,+++**))*)))))('(&"""#"##""
- at 30BB2AAXX080903:3:37:1558:705#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCAGNGCTCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()(((''$$"#""##"
- at 30BB2AAXX080903:3:51:501:1319#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCCCGACCTCA
-+
-67777788888888888888888877776555443222100//.,.--,,,++****)*)*)((((#$%""$"##"
- at 30BB2AAXX080903:3:58:1567:1426#0
-CGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATACACCCACAN
-+
-67777788888888888888888877774555443222//0//.-.--,,+,**'*))))))('((&$$%#%$%$"
- at 30BB2AAXX080903:3:38:1182:87#0
-CCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATTGTNCANN
-+
-6777778888888888888888887778651544-22110///-.-*,,,,++++*)*))))(((''"$$&"#$""
- at 30BB2AAXX080903:3:54:994:1837#0
-TGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTAGCGCGCACA
-+
-677777888888888888888888777765554432221////..-,-+,+++*+*)*)))((((('%""$$"##"
- at 30BB2AAXX080903:3:1:1576:1474#0
-TTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGCTNCCNTCCG
-+
-67777788888888888888888877776552442232100*/.--,-+,*++*)*))))()(('(%&"#%""#""
- at 30BB2AAXX080903:3:53:780:1400#0
-GATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGATCGGAAGAGCGGTTCCGCAG
-+
-6777778888888888888888887777655542322210///..--,+,+**+**)*)))(((''''$"&#%%##
- at 30BB2AAXX080903:3:35:1344:1291#0
-TGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTCGATACGAGNTAGCGNCN
-+
-6777778/88888888888888887777655541322,100-#.'--,,,+*++*(**)*'()((('"'$&$""#"
- at 30BB2AAXX080903:3:58:1063:1837#0
-ATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGTCAGGTGGGGGGTGGGGGGCTTGGGGGGTGTGTGACCTCN
-+
-67777788888888&8*883868877711)5543'5(,,/0-/.%-",$,+*++%'((*))%'('(#'&%"#"#$"
- at 30BB2AAXX080903:3:60:1337:1763#0
-GAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATATTCTAGNN
-+
-67777788888888888888888877776555443511000//.-,--,,+,+**+*)*)()'(('&"$"%"#"""
- at 30BB2AAXX080903:3:2:1075:1871#0
-TGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGTGTGTGAGATCGGAAGANCGCNCAC
-+
-67777788888888888888888877776555443222100//..---+,+++***))*((((((''%""$""##$
- at 30BB2AAXX080903:3:50:476:1528#0
-CGAAGAAAAAAACTTCTGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGTGGCGGGCACGC
-+
-67777388888888888888888877776555343221/00//.,-,,,,+*+**))))((()('((%"""$"#"#
- at 30BB2AAXX080903:3:37:625:156#0
-CCTGCGAAGAAAAAAACTTCTGAGGTAATAAATAGGATTATCCCGTATCGAAGGCCTTTTTGGACAGGCGTTCCNN
-+
-6777778-80888888888888887675635,443212210/...-,+,,+*++*)*)(()))((''$##""#$""
- at 30BB2AAXX080903:3:56:277:1587#0
-TAGGGGCTAGGCTGGAGTGGTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAACTTCTGAGGTAATAAATAGCNT
-+
-677777888888888888888888777765554332221/0//.-,--,,+++*****)))))'(''%"#%###""
- at 30BB2AAXX080903:3:49:882:2013#0
-TCAGAAGTTTTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAAGCAGGAA
-+
-67777788888888888888888877776555441322100.-..-,+,,+****()(()((#(#'%"""$###""
- at 30BB2AAXX080903:3:2:555:1902#0
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGANTGTNTCG
-+
-67777788888888888488828877776055443222100//.-.-,,++*+)**)))))'(((''"""$"""#"
- at 30BB2AAXX080903:3:40:1138:496#0
-GGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGGGTGGGAAAAGGCTCAGAAAAATCCTTCNGCAGNT
-+
-67777788888888888888888877076555443222100//+.-&+,,+++***)*)))()'((%"$""#"""#
- at 30BB2AAXX080903:3:53:453:1717#0
-TCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTTGCCCCC
-+
-6777778888888888*88888887777655558322100///--.-,++,+)+**)())))(((''%""$#"$#$
- at 30BB2AAXX080903:3:39:136:1904#0
-CTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACGGTCACCNC
-+
-677777888888888888888488777755555432-1100/--.---),++*******())((((&"""$#%""#
- at 30BB2AAXX080903:3:51:1688:1968#0
-TCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTACCACCACCA
-+
-677777888888888888888888777765554432221001/..-,,-,+,+**+)))))((((('%&%&#$%$$
- at 30BB2AAXX080903:3:54:172:1563#0
-TCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAAGATCGGAAGAGCGGTCGCGCACG
-+
-6777778088888888888888887777657544102/1/1/...-,+-,+)(+)))*)&')&('''""$"$$"#"
- at 30BB2AAXX080903:3:45:1311:1121#0
-ATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGAGGGGGAAAAAGCTCAGCACGCGC
-+
-6/777788888888888888%8887770654544322#0000/+-,--)++)%+%)*'%'''#(#''"%#"$$#"#
- at 30BB2AAXX080903:3:40:353:1873#0
-GGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGAGATCGGGAGAGCGGTCCGCAC
-+
-677777888888888888888036/7%765254&2221&00//,,--,,(,,++#*('#()#'(#'%""""#""##
- at 30BB2AAXX080903:3:35:336:1990#0
-TGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGATCNACACACAN
-+
-6777778888888888888888887777655532312210.//..---,-+++**))))((')((('""##$"$#"
- at 30BB2AAXX080903:3:59:840:1855#0
-TGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCACTCACATCC
-+
-677777888888888888888888777765555435101/.//-/---,,+,*+*)('*)(((((''$&""$#"##
- at 30BB2AAXX080903:3:48:89:1181#0
-ATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTAATTGGGGGGTAGGGGCTAGGCTGGAGCATGCCATG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()((''&$""##""#
- at 30BB2AAXX080903:3:40:307:713#0
-TTTACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCTCTAAACAC
-+
-67777788888888888888888877176555443222100/0.,--,+,*++**)))())'(('''"&%""##"#
- at 30BB2AAXX080903:3:46:1295:318#0
-TACCACTCCAGCCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCATCAGATCGGCAGACTCCA
-+
-677777888888888888888888777765654432221/0/...--,,,)++**)*()(('(&#&'$""#%"###
- at 30BB2AAXX080903:3:50:619:924#0
-AGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCGCTCCTAATTGGGGGGGCGTCGNCT
-+
-67777788883888888,8$88887777+565432220100./.-+,,*-+&+*)#'#()(((((('"$####"#"
- at 30BB2AAXX080903:3:34:963:312#0
-TGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGTGCCCTCCTNCCACCANN
-+
-67777788888888888888888877776555443222/00//..---,,+++**)**))()(((''"$#"$$#""
- at 30BB2AAXX080903:3:52:1487:1287#0
-TGATGCGAGTAATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTAGCCGCTAC
-+
-67777788888888888888/88877776555443222100//..---,,+,+***))*))&(('('%"#"&##$$
- at 30BB2AAXX080903:3:4:1737:1157#0
-AGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGGAGTGGGACTTCAGATCGGAAGAGCNATCTNCN
-+
-677077888888888888888888777765554432,2/10-/..-+--,+**)))*))())'((('""""$""$"
- at 30BB2AAXX080903:3:45:1033:1736#0
-GGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTGTAGGAGTGGGAGATCGGCAAGGCGGGG
-+
-677777888888.8888888888877776555443222100/...'--',%+++*)*))))))(''#'#$$"#$""
- at 30BB2AAXX080903:3:44:1632:1837#0
-CCATAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCATCAGGAGTATAAATCACCTGCGCTCACCCACGAGC
-+
-67177788888888888888888877756555443.2211-//-.--+,,+))+*'))'))'(''%'"%"%$%"##
- at 30BB2AAXX080903:3:46:884:1759#0
-TTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGGTGTGTTTTGGAGTGTGCAGTCGGG
-+
-67777788888888888888818877776505,43222110//./,--,-+)+*)*%))%)(%(%(&'#####"""
- at 30BB2AAXX080903:3:38:408:2008#0
-ATTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGGGGTGCTCTCAACA
-+
-6777778888888888488888887777655544-22/20.//.-+)-+*++(****((*'((#(#'%#%"$"#$#
- at 30BB2AAXX080903:3:59:1384:710#0
-ATTAGACTATGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGTTTAGAGATCGACAACNGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((('&""$##""#
- at 30BB2AAXX080903:3:2:1770:77#0
-TCCCACTCCTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACAGATCGGAANACACAAC
-+
-6777778888888888888.8888777755454130221/0/-/..(-)%++**&*')((((%%''&""#%%&%#$
- at 30BB2AAXX080903:3:2:485:615#0
-CCAACTCCTAAACACATCCGTAGTACTCGCATCAGGAGTATCAATCACCTGAGCTCACAGAGCGGAATNCGCCCAT
-+
-67.777888888888888&888&877716/65,43222/000/..--,&,,+++**(*)))((''''$"#"##$##
- at 30BB2AAXX080903:3:3:739:217#0
-GTTGTTTTCTATTAGACTGTGGTGAGCTCAGGTGATTGATACTCCTGATGCGAGTAATACGGATGTGCNTTACNGN
-+
-6777778888888888.8$8888877/75555.432/200/-/+---,,,*+++*)**)'))(((&'""""#%"$"
- at 30BB2AAXX080903:3:57:80:906#0
-CATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTAATAGAAAACAACCGAAACCAAATAATTCAAGCACAATA
-+
-677777888/888888888888887777655524222200./--,-,,-,*,*)**))(((((((''&&%%#""#"
- at 30BB2AAXX080903:3:38:1024:1853#0
-AAGCAGTGCTTGAATTATTTGGTTTCGGTTGTTTTCTATTAGACTATGGTGAGCTCAGGTGATTGATACTCGTCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('('&&%%&&%##
- at 30BB2AAXX080903:3:42:930:296#0
-TACAATTTTACTGGGTCTCTATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGAC
-+
-67777788888888888888888877776555443222100//..---,,$++***)))*)))(''''&&&&%$$%
- at 30BB2AAXX080903:3:48:1728:633#0
-TCTATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTAGATCGGAAGAGCGGACCAGCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()((('&""$#""#"
- at 30BB2AAXX080903:3:8:1271:374#0
-AAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTAGGNACACACNN
-+
-67777788888888888888888877476555243222110//..---,,,(+)**)**'(((''&&""#$&$%""
- at 30BB2AAXX080903:3:45:449:1597#0
-AAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTAGGGGGGGATA
-+
-6777778888888888888888887777655544322210///..--+-,+,+***))))(()('&'$"$%"#"#$
- at 30BB2AAXX080903:3:54:1611:1959#0
-AAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTGAGGCTTGTACACACATCCG
-+
-67777788888888888888888877776555443222100//..---,,++****)*))(((('(''&%$$"##"
- at 30BB2AAXX080903:3:47:325:794#0
-CCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACANTTTACGT
-+
-67777788888888888888888877776555443222101//...--,,+++*+)***))))('('%"#"###"#
- at 30BB2AAXX080903:3:52:326:91#0
-CTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATATCTTGTAG
-+
-677777888888888888888888777765554832021.0//..-,,,,,**++(*))(()&(('&"$"&%$$"#
- at 30BB2AAXX080903:3:43:657:803#0
-TCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGC
-+
-67777788888888888888888877776555443222000/...--,,,,,++*)*)*))(((((''&&&&%##$
- at 30BB2AAXX080903:3:34:779:1470#0
-ACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTNATGACCNN
-+
-67777788888888888888888877$765554412220000/...--,-+,+***))*)()((('&""#"##$""
- at 30BB2AAXX080903:3:39:453:1648#0
-ACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTCTCGCTCCA
-+
-677770888888888888/8+888787743.123+322&/0-*..-,,+,*()+'*(&)(''(((('$&"######
- at 30BB2AAXX080903:3:51:407:778#0
-CAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCCACAGTAGATCTGCGCTCGT
-+
-677772888888888888888888777$6555432/1/10/...-.,,,,+***'*%))(''(('&&"%"""""""
- at 30BB2AAXX080903:3:56:391:1579#0
-CCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCNCTAGCANA
-+
-177127388888888888888882374193451002).1//-/--,-,,,+,+)))))))((((''&"%###$#"#
- at 30BB2AAXX080903:3:8:457:1851#0
-CCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCNCGCGCANN
-+
-677777888888888888888888777765554432021/0..//---,,+++**)(*()()(((('"%"%"#$""
- at 30BB2AAXX080903:3:52:1176:1251#0
-GAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGTACTCTTAG
-+
-67777788888888888888888877776555443222100//.----,,+++***))))')(((('$""#"#"#%
- at 30BB2AAXX080903:3:44:1042:160#0
-CGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGGAATGGTGAAGGGGGACTCTGACGGCAT
-+
-67777788888.888888838888777.6555'43+12100...%--,%,)'%+**())))'(('#'"$"#"$#"#
- at 30BB2AAXX080903:3:40:1252:203#0
-CCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGAGACTCGAAGGGCC
-+
-677777888888888888888888777765554432221/0//..---,+++***()(*))(((((#&$""%""##
- at 30BB2AAXX080903:3:59:1515:652#0
-TTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACACCCNTA
-+
-67777788888888888888888877776555443222100//..---,,+*+***)*)*)((((%&$$%%%%"##
- at 30BB2AAXX080903:3:35:1174:2014#0
-GAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGGTGAGCCGGAGAGGCCGTCGAGATTGGGAGAGCGNCACTCCAN
-+
-67777788888888808888888/+.77655/,450.0$1+$.--'*')+&$(((##'()##&#(&'"%"$"##""
- at 30BB2AAXX080903:3:40:1267:862#0
-GTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGAAATGGTGAAGGGGGCTCTA
-+
-6-77.7-888888888888888887747654544332210,0/..-,,,+,+****()())((((('&#"""##"#
- at 30BB2AAXX080903:3:46:594:1507#0
-GTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTTCACGGTCTAGGTGGG
-+
-677777888888888888887388777765554/22/.*////..-,-,+&')+))(&''%&#&&&%"""#""#"#
- at 30BB2AAXX080903:3:43:260:418#0
-CTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCAT
-+
-67777788888888888888888877776555443221100//...--,-+++*+)**)*))(((''"%$%&"##%
- at 30BB2AAXX080903:3:2:1629:1363#0
-TCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCNCGCACTT
-+
-677777888888888888888888774765554432021000/.----+,,++***)()''')'(%''"&&$$#$#
- at 30BB2AAXX080903:3:41:422:1287#0
-AATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCAGATCGGNAGCGCCAT
-+
-67777788888888888888888877776555343222100//..-,,,,,+++*()*()))(('''"$#$""#""
- at 30BB2AAXX080903:3:54:44:719#0
-CTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACCTCATTATT
-+
-677777888888888888888888777765534532221000/.----,,,+***)())('('((''""#"%$##$
- at 30BB2AAXX080903:3:8:1119:1093#0
-TGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGNCCCGCGNN
-+
-67777788888888888888888877776555443.22000-,/..-,+,+++**)))#()((('''"%$%"#$""
- at 30BB2AAXX080903:3:50:978:276#0
-TTTCCGACGGCATCGACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTGCACGGCATTATCCGACCACT
-+
-677777888888%88888888888237+65.544322210/./-+,"-+,++)*&#*))'#((##%%$$"#%#"#"
- at 30BB2AAXX080903:3:40:1659:1272#0
-GTTTAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAAAGTTGAAGAACGGAAGGCGTGTGTAC
-+
-6777778888888888888888887777654544322210/..,,---,,+*+)()***&#))''&%%$"##"""#
- at 30BB2AAXX080903:3:45:187:716#0
-GTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAAAATGTTGAGCCGTAGATGCCGTCGGGCA
-+
-67777788888888888888888877776555443222100//..---,,++***+))))()(((''"&""%#%"#
- at 30BB2AAXX080903:3:56:1702:951#0
-AGGAAAGTTGAGCCAATAATGACGTGAAGAACGTGGGAGACAGTGGGGATAAAAAAAAAAAAGGAAGCAACCCAAC
-+
-67777788888888888888888877776)$-4332%01%)#/-.-,,+%++++**)*(&#''####"&&%%$%$$
- at 30BB2AAXX080903:3:1:1553:665#0
-CATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTAGCTCAACTTNCCNCTCT
-+
-67777788888888888888888877776/554/32.11&0-..++,*&,$$*)**)()()(('(#&&"%""""#"
- at 30BB2AAXX080903:3:47:1295:416#0
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCTCGCATA
-+
-67777788888888888888888877776555443221100//.,---,,,,++*****)))(((''&$"#"$##"
- at 30BB2AAXX080903:3:8:1345:1001#0
-TACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCNCACACANN
-+
-6777778888888888888888887777655544302200///.--,-,++++**))**)(((((%("%"%$$#""
- at 30BB2AAXX080903:3:60:1444:740#0
-AAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGATAAAAAAACACAAACNN
-+
-6777778888288888888*8888777765554432/2000//..,---,++++*)))#((#&((''&&%%%$%""
- at 30BB2AAXX080903:3:35:952:944#0
-GAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGCGGAAGACTGAGACCGGAAGANCTCTCCGN
-+
-6377778884888888888888857777655544-3221000+.,-,-,(,'%+%*(*(&&)(''('"%"##"##"
- at 30BB2AAXX080903:3:8:1002:755#0
-GAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTACAAAANATGTCANN
-+
-67777788888888888888888877776555443222120/.-.---,-+++***))))))((((&"%%%%%#""
- at 30BB2AAXX080903:3:40:1518:271#0
-AACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCCGATAC
-+
-67777788888888888888888877776555443222000//..---,,+++*+*)*)()))((('&&#"""##"
- at 30BB2AAXX080903:3:41:433:1987#0
-GATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTAGATCGGACGACACCT
-+
-67777788888888888888888877776555443221100//..-,,,,++++*((*)))))('(''"%"""##"
- at 30BB2AAXX080903:3:59:1174:1407#0
-CATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTGCCACCA
-+
-6777778888888888888-8888777765454332.2000//-.-,,-++*++**))))('(((&%&&%#$####
- at 30BB2AAXX080903:3:38:1634:1439#0
-GCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTCNCAAAACN
-+
-67777788888888888888888877776555443222100//..---,,+++**+*))())(((('""#&$###"
- at 30BB2AAXX080903:3:4:836:199#0
-TTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGACTGTGCNCTCTNCN
-+
-6777778888888888.818,8287673655544/212000//.--+--,++*)*)**()(#(((%'$"%"#""$"
- at 30BB2AAXX080903:3:51:943:1987#0
-AGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAAGATCGTAGAGCGC
-+
-67777788888888888888888877776555443211120//..----,++++*()*))()((((#&"""""#"#
- at 30BB2AAXX080903:3:55:32:799#0
-AGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTAGCA
-+
-67777788888888888888888877776555443222100//..----,,*++**))))((((((&%""#"""$#
- at 30BB2AAXX080903:3:40:1529:293#0
-TGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATATGTCGGCGT
-+
-67777788888888888888888877776645543%32100/..,-,-,,+*)**))*(()'(('#'"$%%&$"""
- at 30BB2AAXX080903:3:45:793:28#0
-TGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCACCCA
-+
-67777788888888888888888877776352443222100/-..--,,-,++***)*)))'((((('$"$"##"#
- at 30BB2AAXX080903:3:41:838:941#0
-TTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGGAAGCCTGTGGCTCA
-+
-6777778888888888888888886777655544322200///...---,++++**)))())((('&'%%%&###"
- at 30BB2AAXX080903:3:54:484:1617#0
-CCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCAGATCGTCTGCTCC
-+
-2172778888288-8888580888771765533422311////,,-,,+-+++**(**%&)(()(''$$#""#"##
- at 30BB2AAXX080903:3:4:616:1553#0
-ACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACCNCTAGNCN
-+
-677777888888881888888818777;6555443000200....+-,+,+++**)*()()(((('%%"$$"""#"
- at 30BB2AAXX080903:3:51:1185:212#0
-GAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAGATCGGAACACTGCTTC
-+
-67777788888888888888888877775505443222100//...--,,+++***())))))(((&$"$"##"##
- at 30BB2AAXX080903:3:42:1255:1144#0
-AGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCCGTGCGACTA
-+
-67777788888888888888888877776755423222000//..--,-,,,+***)))'))'(''&&&%##""#"
- at 30BB2AAXX080903:3:49:709:1893#0
-CCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACANACAC
-+
-67777788888888888888888877776555402222000/...---,,+**+**())))))((('&""""#$#"
- at 30BB2AAXX080903:3:45:641:807#0
-TGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGTGAAGTCGGGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''%&%$#"#""
- at 30BB2AAXX080903:3:8:718:1747#0
-CACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAGATCGGAAGAGNGCAGCANN
-+
-67777788888888888888888877773455443211110.+..--,,,++***)))))(('(('("&$$"$#""
- at 30BB2AAXX080903:3:52:1224:1300#0
-ACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAAGATCGGAAGAGCGCGTCCAC
-+
-67777788888888888888888877776555443222100//..,--'-,++*****)())(((('%$#%$"#""
- at 30BB2AAXX080903:3:49:347:619#0
-TTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAATGACGGGGAGA
-+
-67777788888888888888888877776555443222100//.'---,,,++++*'))())))(('%$""""$#"
- at 30BB2AAXX080903:3:34:405:690#0
-GATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATNATTCACNN
-+
-67777788888888888888888877776555443222100//.----,,+++**))*))(((((('"#""%""""
- at 30BB2AAXX080903:3:58:810:184#0
-TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCCAATAGTACNNC
-+
-67777788888888888888888877776555443222100/0-..-+,,+++***))())))(((''%%""$""#
- at 30BB2AAXX080903:3:34:974:1466#0
-CGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCNAACATANN
-+
-6777773888888888888888887777655544322210//0.--+--,++++*)))*)))(((''"""$###""
- at 30BB2AAXX080903:3:35:1459:897#0
-AAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGCNATTACTCN
-+
-(-7*7-+,,.338)88408..+361.1/4020/120,/1',',(,+"+&(*(%()#(')###''##'"$""$$#$"
- at 30BB2AAXX080903:3:40:1529:113#0
-CCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGTGCAATA
-+
-67777738888888888888888877776555443222100//..----,+,++**)*))))((&('&$#""""""
- at 30BB2AAXX080903:3:58:164:232#0
-CCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGACACNNC
-+
-67777788888888888888888877776555443222100//-.---,,+++***)*))#((('('&&$&%%""#
- at 30BB2AAXX080903:3:57:1380:300#0
-GCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGTTGAGTCATAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$"%$%""#"
- at 30BB2AAXX080903:3:1:1182:1135#0
-TTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCAAACTAGTATTTCACTTTACATCCAAACATCACNGCNTCGC
-+
-67777788888888+88888887877576556143'.2200*//.-,+,-+,+**+))))))(((&''"&&""#"#
- at 30BB2AAXX080903:3:43:1084:164#0
-TTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATGAAGCAGATAGTGAGGAAAGGTGTG
-+
-6777778888888-88888888887777655544322210//...-,-,+++++*)))))()(((('&$"&"##""
- at 30BB2AAXX080903:3:54:307:1759#0
-CTTCGAAGCCAAAGTGATGTTTGGAGGTAAAGGGAAATATTAGTTGGCGGATGAAAGATCGGAAGAGCGGTCTCTC
-+
-6777778888888818888888887%77655534'222100//&.--,,,,++***)*)()((('('$"""""###
- at 30BB2AAXX080903:3:60:1396:1876#0
-AGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGCGGATCACANGANN
-+
-67777788888888888888888877416/5-4432201.0/..-.-,,,+++*+*)*))()#((&'$$#$""#""
- at 30BB2AAXX080903:3:43:187:112#0
-CTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATAGATG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*)((('('$&$%"%#"#
- at 30BB2AAXX080903:3:46:868:942#0
-CTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGATCGGAAGACTCACTTC
-+
-67777788888888888888888877776555443222100//..---,,++****'*))(((('('$$"%"#""$
- at 30BB2AAXX080903:3:57:277:866#0
-ATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAAAGTGAAATATTAGTTGGGTGATTCAC
-+
-67777788888888888888888877776555441212100//...-,-,+++*)*)))**((((''"$&"""$##
- at 30BB2AAXX080903:3:56:1456:1323#0
-TCATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACAGTGCACT
-+
-67777788888888888888888877776555443222100//..---,,++++*)*))))))(((&$$&""%##%
- at 30BB2AAXX080903:3:35:1043:356#0
-CATCCGCCAACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACNGTCACANN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((((''"%#$"$"""
- at 30BB2AAXX080903:3:42:793:757#0
-AGCCGCAAACTAATATTTCACTTTACATCCAAACAGCACTTTGGCTTCGAAGCCGCCGCCTGGTACGTCATCGGAA
-+
-607077888488888,8883088,7-7-5755443*.,.//0/,'.*++$+*%**&))#('(#(&##%%"$$##""
- at 30BB2AAXX080903:3:59:1361:1122#0
-TAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTACATCAACA
-+
-67777788888888888888888877776555443222101/....--+,,,++*)*)*&())(('''"$"#####
- at 30BB2AAXX080903:3:48:1641:1538#0
-AGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATAGATCGGGACTTAT
-+
-677777888888888888888888777765554432121/01..-.-,+,*+)**)**))((()(&#"#""$""#"
- at 30BB2AAXX080903:3:50:1594:1823#0
-CAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGTTTGGATGTAACGGGGCACT
-+
-67777788888888888888888877776555443222100//..,-,,,+*+****)*))()((''""#""$"#"
- at 30BB2AAXX080903:3:8:1234:1361#0
-ACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTGATGNTGAATANN
-+
-67777788888888888888888877776555443122100//..----,,+++*+*))())')(''"""#"""""
- at 30BB2AAXX080903:3:4:794:1162#0
-TACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGAAGCCAAAGTAGACNTGTCNTN
-+
-677777888888888888888888777765554432211/0//-.-,-,,*,++*)*))(()('(('"""$$#"""
- at 30BB2AAXX080903:3:1:1707:1412#0
-ATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATNTCNTATC
-+
-6777778888888888888888887777655544321220///.,.--,,+++***)*))())((('&"#""$##"
- at 30BB2AAXX080903:3:35:926:995#0
-TCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATNTCTGTATN
-+
-67777788888888888888888877776555443222100///.---,,,+++*))))')(((((&"&&&#%$""
- at 30BB2AAXX080903:3:53:996:259#0
-CAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACAGATCGGCTGGCCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''''$""$"###
- at 30BB2AAXX080903:3:49:1153:1628#0
-ATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTAGATCGGTCCACTAC
-+
-67777788888888888888888877776555443222100//..---),++(+*))*))))()(''%"#"#$"##
- at 30BB2AAXX080903:3:49:1071:1109#0
-TTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTAGATCGGACTNNCTC
-+
-67777788888888888888888877776555443222101//..--,,,+,+***)*)))))((('$"#"""""#
- at 30BB2AAXX080903:3:50:1631:1000#0
-CAATAGATGGAGACATACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCAGGCGGCGGCTTCGATCCTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*+*))))))(((''$$""$#"#"
- at 30BB2AAXX080903:3:3:938:1008#0
-CGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTNCTTCNTA
-+
-677777888888888888888888777765554432220/0//..---,,+++****))))))((''%"#&##"""
- at 30BB2AAXX080903:3:3:1460:740#0
-GCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTGATTNTGGCNTT
-+
-67777788888888888888888877776555443222100///.---,++++)**))*))((((&'""""#$"#"
- at 30BB2AAXX080903:3:47:549:1417#0
-CGCCGCCTGATACTGGCATTTTGTAGATGTGGTCTGACTATTTCTGTATGTCTCCATCTATTGAGATCTGGANTGC
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*)))((('('%"%"""#""
- at 30BB2AAXX080903:3:59:288:1660#0
-AGAGTAAGACCCTCATCAATAGATGGAGACATACAGAAATAGTCAGACCACATCTACAAAATGCCAGTATCCANNT
-+
-67777788888888888888888877776555443222100//-.-.-+-+++****))))))('(&$%%#$#"""
- at 30BB2AAXX080903:3:46:1443:1818#0
-AAAAGAGTAAGACCCTCATCAATAGATGGAGACATACAGAAATAGTCAGACAACATCTACAAAATGCCGTGCCTCA
-+
-67777788888888888888888877776555543222100//...,-,,,&++**)*)))))((('"#"#"#"#"
- at 30BB2AAXX080903:3:38:1347:441#0
-AGTACCGTTAACTTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCAGATCGGCCATATA
-+
-67777788888888888888888877476555443222100.//.--,,*+++*+*))))))(((''"'""#"""#
- at 30BB2AAXX080903:3:54:1587:1230#0
-ATTATTAGTAGTAAGGCTAGGAGGGTGTTGATTATTAAAATTAAGGCGAAGTTTATTACTCTTTTTTGATTGTTGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))())((('''""""%##""
- at 30BB2AAXX080903:3:2:822:1340#0
-AGGGTCGAAGCCGCACTCGTAAGGGGTGGATTTTTCTATGTAGCCGTTGAGTTGTGGTAGGCAGATCGNCGACATC
-+
-6777778888888888888882887727645544322210///.,--+,)+*++**)()*&#(((&#$"#$"#%"%
- at 30BB2AAXX080903:3:41:860:1004#0
-TGACTACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCCCCA
-+
-67777788888888888888888877776555443021100//-----,,+,+***(*)((('((''"'"%%#$$%
- at 30BB2AAXX080903:3:46:933:1526#0
-CTACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCGCGACGCC
-+
-67777788888888888888888877776555443221000//./---,,,++***))))()(('(#'"%"%$"##
- at 30BB2AAXX080903:3:54:542:1730#0
-ACCACAACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCTCGCCTC
-+
-67777788888888888828888877776555443222100//-.-----+*+*'+**)'()((('#%$"&%##"%
- at 30BB2AAXX080903:3:8:1533:439#0
-ACTCAACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCCCGCNTAGCACNN
-+
-67777788888888888888888277775555443211100/'/-$-*&+*&))'*'#)'((''(&'"#%#%%#""
- at 30BB2AAXX080903:3:34:29:81#0
-CCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCCCGCGTCCCTTTCTCCATAAAGATCGGAAGANCCACACNN
-+
-67777788888888888888888877776555443222200//.--.--,++++')**)()))('('"$%#%$%""
- at 30BB2AAXX080903:3:59:433:530#0
-CCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTAGAAATTGCCCTCCTTTTACCCCTACACNA
-+
-6777778888888%888888888877450553443221100/.--,,-+-,++****#))()(((&'&&$####""
- at 30BB2AAXX080903:3:43:529:1054#0
-TTAGTAGCTATTACCTTCTTATTATTTGATCTAGAAATTGCCCTCCTTTTACCCCTACAGATCGGAAGAGAGCATA
-+
-6777778888888888888888887777652544(2221/../---,,,,+*+***)*(((('((&''"$""""""
- at 30BB2AAXX080903:3:60:1165:229#0
-TAACTATTAGTGGCAGGTTAGTTGTTTGTAGGGCTCATGGTAGGGGGAAAAGGAGGGCAATTTCTAGACGCCTCNN
-+
-67777788888888888(8888887777655541320210&//..-,-,,+++***)'))(()'((''%"$###""
- at 30BB2AAXX080903:3:33:1221:765#0
-ATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCATGGGAGGGGGAAAAGGAGGGCAATTTCTANACACGANN
-+
-677777888888888888,888287777355544/01,000*/..--,,,+++*(*))&()&))'('""$##""""
- at 30BB2AAXX080903:3:54:249:1316#0
-TTTGATCTAGAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATCTCTTTCT
-+
-67777788888888888888888877776555443222100//./--+,-,++**+*)))))))(('&%"%"%$#$
- at 30BB2AAXX080903:3:54:1359:999#0
-GAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGGTCATGGTAGGGGGAAAAAGGGGGTCTTTACG
-+
-6777778888888888888888887777*545443.22)0.//.%-,,-*+)+***)))))(((%('&&#""###"
- at 30BB2AAXX080903:3:60:967:1358#0
-AAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCATGGTAGAGATCGGAAGAGTGCAATNN
-+
-677777888888888888888888777765+534*22/100/*..-&-,,+++)****)(#)(%&('""#&#$"""
- at 30BB2AAXX080903:3:44:518:1911#0
-TAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGGTCATGGTAGGGGTAAAAGGGAGGGTGTT
-+
-6777778888888888888888887777655.423222.001/,.--$+++,**)())))'&((((''"#&"""""
- at 30BB2AAXX080903:3:35:163:931#0
-AATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTAATGGGAGGGGGGATGNCATTGCCN
-+
-67777788888888888888888877776555413222100//..--,,++'****&*)))('(((&"$""""##"
- at 30BB2AAXX080903:3:54:178:178#0
-TAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGTTGTTTGTAGGGCTCAAGATCGGAAGAGCGCGTGCTCG
-+
-67777785888888888888888877776555442212&00'/.,++-,,()+')))#(')#((&('&#"#$""$"
- at 30BB2AAXX080903:3:50:73:387#0
-TTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTTATTACTACAATA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((('&$$"""""""
- at 30BB2AAXX080903:3:50:1447:99#0
-CTACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTAGATCGGAAGAGCTTCGAACA
-+
-6777778888888888888888887777655544322210-//..---,,+++***))))))(('('$""""""$"
- at 30BB2AAXX080903:3:46:1554:655#0
-TACCATGAGCCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTTATTAATCATCATACTCAGCAC
-+
-67777788888888888888888877776555423212100//.,.--,,+++***)*)))()((''"$$$"####
- at 30BB2AAXX080903:3:42:1713:320#0
-CTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGGTGTTTGTAGTGGCGTGT
-+
-67777788888888888888888877776555443222100//..--+,,+++**))*%()&)(('%&$%%"$##"
- at 30BB2AAXX080903:3:58:1397:476#0
-CAGACTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTAGTGGCAGGGTAGGTGTTTTGACTACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))()&('(&'$$$%"%%$
- at 30BB2AAXX080903:3:8:1224:1129#0
-TTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATTAATAAGAGGGATGACATAACTATTNCGAAAANN
-+
-6777778888188888888883884777653244102-00.//.,--,-+,,+)****))()(((('"$##""#""
- at 30BB2AAXX080903:3:2:1736:479#0
-TGCCACTAATAGTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGCNAAATTAC
-+
-67777788888888888888888877776555443222100//...-)-,,+****)())()()(%'%"""$""$"
- at 30BB2AAXX080903:3:33:1106:808#0
-GTCTAATCCTTTTTGTAGTCACTCCTAGGCCAGACTTAGGGCTAGGATGATGATTAATAAGAGGAGANCTCTACNN
-+
-67777788888888888888888877776555443221100.0..--,,-+++)**)))))))((('"$%""#%""
- at 30BB2AAXX080903:3:50:1426:1840#0
-ATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATTAACATGTTAGC
-+
-67777788888888888188888877776555443022100//.--.,--+*+*+*#))()(((#'#$$""""##"
- at 30BB2AAXX080903:3:37:787:879#0
-CCAATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTCATAGGCCAGACTTAGGGCTAGGATGATGATGCATATATN
-+
-67777788888888888888888877776555443222100//.-----,+++*****)))((('('"$&%&"#""
- at 30BB2AAXX080903:3:45:75:505#0
-TAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTACAAAAAGGATTAGACTGAACCGAATTGGGTCCAAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&'&"""#""#
- at 30BB2AAXX080903:3:52:591:86#0
-ATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTACAAAAAGGATTAGACAGATCGGAAGAGCGGTCTCGCAGGA
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))))(('(#$"$&$$""#
- at 30BB2AAXX080903:3:56:1046:962#0
-CATTCGTTTTGTTTAAACTATATACCAATTCGGTTCAGTCTAATCCTTTTTGTAGTCACTAGATCGGATGTGCATC
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))()((('%$%""$##"
- at 30BB2AAXX080903:3:42:249:418#0
-TGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTTGTTTAAGATCGGTAGACT
-+
-67777788888888888888888877776555443222100//.-.--,,+++***)*))))()(('&%%"$""""
- at 30BB2AAXX080903:3:48:1465:1762#0
-ATGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTAGATCGGAAGGCGATCTT
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))((('''""""""#""
- at 30BB2AAXX080903:3:53:996:1208#0
-AATGAGGGGCATTTGGTAAATATGATTATCATAATTTAATGAGTCGAAATCATTCGTTTTGTTTAAAAGATCGTTC
-+
-67777788888888888888888877776.55423222100///--+++,+,**)*)))*)(((((%%""&&%""#
- at 30BB2AAXX080903:3:37:1001:196#0
-TATTCCTAGAAGTGAGATGGTAAATGCTAGTATAATATTTATGTAAATGAGGGGCATTTGGTAAATATTCTGCTAN
-+
-67777788888888888888888877776555443222100//..-,-,-+++**+)))))((((('"&$"%%$#"
- at 30BB2AAXX080903:3:2:1772:2031#0
-TGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATGCTAGTATAATATTTATGTAANATANCAA
-+
-6777778888888888888888187777645554/2220/0/.------,+++*****))))()((''"$"%"$"#
- at 30BB2AAXX080903:3:8:613:423#0
-GGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATGCTAGAGATCGGNGCTCCANN
-+
-677777888888888888888888777765554432221///...---,-,++***)*)))))((('""$"#$"""
- at 30BB2AAXX080903:3:41:1343:1436#0
-AAATATTATACTAGCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCAGATCGGCAC
-+
-67777788888888888888888877776555443222101//...--,,+,+++*)()(((((#%'"&&&%#"##
- at 30BB2AAXX080903:3:3:681:1551#0
-TAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGAGATGGTAAATCNCAGANAA
-+
-2777778888888888888888887,7765554632220000..-,,-,,+)**)*)*))))((('&""##%#""$
- at 30BB2AAXX080903:3:49:1630:1869#0
-AGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTATTCCTAGAAGTGGCTGTG
-+
-677777888888888888888888777765554432221/0//..,-,,,++++****))(((('''&"""#"""#
- at 30BB2AAXX080903:3:3:783:684#0
-GAACAGCGACAGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGGTGTGAGCGATATACTAGTANCTCGNTC
-+
-67777788888888888888888877776552442222100./-.-.-,++++***)**)))(((('%"#"%#""#
- at 30BB2AAXX080903:3:8:1099:958#0
-CTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATNGTAATCNN
-+
-677777888888888888888888777765554433201/0//..--,,,-++***)**)()()(('"$#"#"$""
- at 30BB2AAXX080903:3:34:22:508#0
-GAATACTAGTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTNTCCTCANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&""#$#$$""
- at 30BB2AAXX080903:3:52:1329:1356#0
-AGTAGCTATAATGAACAGCGATAGTATTATTCCTTCTAGGCATAGTAGGGAGGATATGAGAGATCGGCAGAGCTTG
-+
-67777788888888888888888877776555443222100//..-.-,,++++**)))))()('('$%$"%#""#
- at 30BB2AAXX080903:3:41:1046:924#0
-GTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTAGATCGGAGGCCTCA
-+
-67777788888888888888888877776555443222100//.----,,+,+***)**)))((('($&"$"""""
- at 30BB2AAXX080903:3:53:491:75#0
-GAGAGTAGCTATAATGAACAGCGATAGTATTATTCCTTCTAGGCATAGTAGGGAAGATCGGAAGAGCGGTACACTC
-+
-6777778888.88888888888887777655544322210,//.,-+-,-+,+*+***)))'((((%""""%"$##
- at 30BB2AAXX080903:3:39:21:1904#0
-TATCGCTCACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCTCTGGTATATCGGATGTCCATCC
-+
-677777888888$&&$+/,,818,9'/14/55&40'2/01/....,,-&++'#$'('')(%((##''$#"##""##
- at 30BB2AAXX080903:3:33:904:739#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCCNCTACTANN
-+
-67777(88888888888888888877776555443222100//..---,,+++***)*))*(((((#"&&##""""
- at 30BB2AAXX080903:3:46:475:51#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCGTGCCCGC
-+
-67777788888888888888888877776555443222100//./.---,*++***))())))'(('"""""##"#
- at 30BB2AAXX080903:3:56:45:786#0
-CACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTNANAACCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(()(((""""$##""
- at 30BB2AAXX080903:3:43:1719:1554#0
-ACACCTCATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCACAACCCCC
-+
-67777788848888888888888877776555443222100//.--+-,,+++*****)()((('(''$%"$%"##
- at 30BB2AAXX080903:3:52:1657:555#0
-ATATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACGCACAAAACAA
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))((((#'&&%""%###
- at 30BB2AAXX080903:3:52:198:488#0
-ATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAGTCCCCAC
-+
-67777788888888888888888877776555443222100//..----,++++*+**))')(((''"$"$"%%##
- at 30BB2AAXX080903:3:52:199:489#0
-ATCCTCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAGCACCCAC
-+
-,7777788888888888888888877776555443222100//..-.--,++++*+**))')(((''"$$"#%%$"
- at 30BB2AAXX080903:3:54:1237:527#0
-TCCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACACCTCCTCCC
-+
-67777788888888888888888877776555443202100//..-.-,,++++*+**)))))((''&%#$&$$#$
- at 30BB2AAXX080903:3:36:826:1713#0
-CCCTACTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACAACACCACAGN
-+
-67777788888888888888888877776555443222100//..-.-,,,++***)))))))((('&$$$"$"""
- at 30BB2AAXX080903:3:43:427:76#0
-CTACTATGCCTAGAAGGAATAAGACTATCGCTGTTCATTATAGCTACTCTCAGAACCCTCAACACCCGCTCCCTCT
-+
-67777788888888888888888877776555463.01100//.----,,()*+*')*))')((('''%"#%$###
- at 30BB2AAXX080903:3:2:42:1347#0
-CTAAGAGGGAGTGGGTGTTGAGGGTTATGAGAGTAGCTATAATGAACAGCGATAGTATTATTCCTTCANTGGNNAA
-+
-6777778888888888888888882747655944322210.//..-+),,+*+**))))(()'(((%%""#"""""
- at 30BB2AAXX080903:3:44:1669:1200#0
-GAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATTTTG
-+
-67777788888888888888888877776555443202100////-.-,-+++****))))((((('&%%$%#$##
- at 30BB2AAXX080903:3:59:600:925#0
-GCACAATATTGGCTAAGAGGGAGTGGGGGTTGAGGGTTATGAGAGTAGCTATAATGAGATCGGAAGAGCGCCTCCC
-+
-677777888888888888888488777-6555443222110//..-----,,+****))('))(('''"%$#"###
- at 30BB2AAXX080903:3:58:1284:384#0
-AGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGGTGAGGGGTATGAGAGGAGGTATAACACA
-+
-67777788888888888888888877776555443222100./..--$,,*++**+*))()&(&((%"#%$"####
- at 30BB2AAXX080903:3:40:1071:1151#0
-TATAGCTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCC
-+
-67777788888888888888888877776555443220100///.---,-++***))))())()'('"%&&%%$$"
- at 30BB2AAXX080903:3:37:139:790#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTCGCGGAGCN
-+
-677777888888888888888888777765554432221/0//..---,,,++***))))))((((&%"%""$"#"
- at 30BB2AAXX080903:3:47:215:981#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATAGATCGGAAGATCGGCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('&"#$""##"
- at 30BB2AAXX080903:3:56:208:1219#0
-CTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATAGATCGGAAGANCCCACT
-+
-67777788888888888888888877776555443222110//..---,,,,+***)*))))()(('%&"""#"#"
- at 30BB2AAXX080903:3:50:565:1341#0
-CAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGTTGAGAGAGCCGTCGACTC
-+
-67777788888888888888888876776545443222100//-.,--,,+'+**))')('('(''%"##$"##"#
- at 30BB2AAXX080903:3:59:409:533#0
-GCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGTGTTGGGGAGATCGTATNNA
-+
-67777788888888888888888877776552423222100//-.-,-,,++#***()#))&)('(&"&%""#""#
- at 30BB2AAXX080903:3:59:593:1035#0
-TTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGGGGTTGAGGGTGACCTCA
-+
-6777778888888888888888887777655544+202100//....,,++++'*')))))%'(%(&""&$$####
- at 30BB2AAXX080903:3:38:292:475#0
-TCATAACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCTCGCGCATC
-+
-67777788888888888888888877776555443222100//.-----,,+++**))*)))()(('"#"%#"""#
- at 30BB2AAXX080903:3:50:1480:1291#0
-TGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGATCGGAAGAGCGGCTGACCCGG
-+
-67777788888888888888188877776555443222100//..--,-,,,+**)(()(()(('''%""""#""#
- at 30BB2AAXX080903:3:51:530:701#0
-ACCCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCAGATCGGACTATGCGCG
-+
-67777788888888888888888877776555443222110//..---,,+++**+)))*)()('''"""""#"""
- at 30BB2AAXX080903:3:55:1247:1936#0
-CCTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGATGTGTACGCT
-+
-/77777888888888838888888+777655544-,21.00-/-.,+--,,*(***))*'())((#%'%"###"$"
- at 30BB2AAXX080903:3:34:729:1884#0
-CACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGGNTCACACNN
-+
-677777-8888888888888/488771765553430.0000/-/--,,,+,,+'*)))')))#)#(&"""$$#$""
- at 30BB2AAXX080903:3:8:1322:444#0
-CTCAACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGAGATCGGAANATCTGCNN
-+
-6777778888888888888888887777655544222211/./-,,-,-,++++*)'*))(('((&'"##%$""""
- at 30BB2AAXX080903:3:52:1536:652#0
-CCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCACAATATTGGCTAAGAGGGAGTGCACATCTAC
-+
-67777788888888888888888877776555443212101//...)-,,-+)*****)())(%''&'$%$"$"""
- at 30BB2AAXX080903:3:36:1659:1279#0
-AACACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGACCTGANNN
-+
-6777778888888888888888887777655344322210///..----,++++***))()'((#%%""%#"""""
- at 30BB2AAXX080903:3:34:764:648#0
-CACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGNCTTCTCNN
-+
-67777788888888888888888877776555443222100//..---,,+,++**)))))((('(&"""#%"#""
- at 30BB2AAXX080903:3:44:1511:1915#0
-CCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGGGGGGTCTGCC
-+
-677777888888888.88888888767765554432211000,..--++,++++'*)))())&)(#''$"""""""
- at 30BB2AAXX080903:3:50:1036:275#0
-CCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACGAGTCGTTGCCGCCTGCGAAACAGCGGGGACGCTGTGT
-+
-6.7.7788883-88888808'8087/-7.-41812220&0.+/#-,-&,$$+#**(#)#(''#((#&"""#"""""
- at 30BB2AAXX080903:3:43:115:2011#0
-TAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGAGATCGGAAGAGCGCTGTGCAAC
-+
-67777788888888888/88,88/7877655912.1-.+0..-.-+,+'++())))%&(('('%(%'%#"""#"#$
- at 30BB2AAXX080903:3:51:49:557#0
-AGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAGGCAAGATCGGGACCCGCTGGC
-+
-67777788888888888888888777770555433',.1.,/+.-*+,+,*'#)**(&)('#%&'#&$"#"""""#
- at 30BB2AAXX080903:3:55:1444:1728#0
-AGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCGCA
-+
-67777788888888888888888877776555443222000//.---,-,+++)+*)$(('(#%(&'&#"&##"##
- at 30BB2AAXX080903:3:41:882:137#0
-CAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCCGCGAAGCAGCGGTGGGGCTAGGCCTCGCCGTGTCCACA
-+
-6777778888888888888888837717655542322,100*,.-,-+,,&,)+#(&)#%#)'#%#%%"%&##""#
- at 30BB2AAXX080903:3:40:780:1829#0
-GGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCAATAAGCGCACNT
-+
-67777788888888888888888877776355433011/0,-/-+-,+*++,+$*')()(')#''&#$&#"#"#""
- at 30BB2AAXX080903:3:54:437:254#0
-TGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAAC
-+
-67777788888888888888888877776555443222100//.-.--,,*+++**(()(')(((''"&$&%%#"$
- at 30BB2AAXX080903:3:50:906:2018#0
-GTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGGCCTACTAGTCTCAATACTCAACA
-+
-6777778888888888888888887777655544322110.//-.--'),,+#'*)(#)'('#(&&'""#"#"$""
- at 30BB2AAXX080903:3:43:286:196#0
-TATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGACTAGTATGGCCGATG
-+
-67777788888888888888888877776555443322100//-----,,++++*)*())('(((%'%&%""#"""
- at 30BB2AAXX080903:3:45:1475:775#0
-TATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGGGGGCCTAGCCCTACTAGTCTCAATCTCCGATCCACAG
-+
-67777788888888888888888877776555343222$00/,.%,.,+-()*'**(*()((#((''""#"##"""
- at 30BB2AAXX080903:3:48:220:506#0
-ATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGAGGAAAAGACTAGACGGGCAGCG
-+
-67777788888888888888888847776555443222.00//.+.--,,,,+&**#&)))')(('&""$####"#
- at 30BB2AAXX080903:3:37:704:1516#0
-CCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACCTCTCGCAN
-+
-6777778888888888888888887777655541322.1-,.+--,+++,++**)))))('('(''#%$$%$"$""
- at 30BB2AAXX080903:3:3:903:1170#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCACACCGCTGCTTCGCAAGATCGGAATNACACNCA
-+
-6777778888888888888888887777655'44323000//'.--&-,++,*****)())#(((''""#$"%"##
- at 30BB2AAXX080903:3:3:988:1658#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAAGNACTANGT
-+
-67777788888888888888888877776553443220110.../---,++++++*)'))')((&'%""$"##""#
- at 30BB2AAXX080903:3:40:762:432#0
-CTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAGGCGGCAAACGTCGGACA
-+
-67777788888888888888888877776555443222100././---,-++*+****))))(''''$#%&&%"#"
- at 30BB2AAXX080903:3:3:222:1275#0
-TCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCCGGCGGCCAANACGTNAT
-+
-677777888888888888888888767;65553432220/0//-----,,,++*+)))&*(()('##$""#$""#"
- at 30BB2AAXX080903:3:57:33:1674#0
-AGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCCGATCGGAAGATGGACAC
-+
-6777778888888888888880887777655544322211///.,-,,,-+*+*)*)(%)((&((#''"""#""#"
- at 30BB2AAXX080903:3:43:761:57#0
-GTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCTTCGCAAGATCGGGAGGTC
-+
-67777788888888888888888873776355443212100/...-,,,,+,*+)**()))((&('#"'%""#"#"
- at 30BB2AAXX080903:3:51:507:1342#0
-TGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTAGATCGGAAATAGGGA
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))))((''""""""#""
- at 30BB2AAXX080903:3:51:1643:519#0
-TGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACACCACACCA
-+
-67777788888888888888888877776555445222100//..---,,++++**)*)))(((''&$"&%%$%$$
- at 30BB2AAXX080903:3:37:803:518#0
-GCCGCCTGCGAAGCAGCGGTGGGCCTATCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTGTCTCGCTN
-+
-67777788888888888884888(714$)55$13132-0/1.+--.,,&,+++*))())(('(((''""#"$##""
- at 30BB2AAXX080903:3:35:170:592#0
-AGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTCGTAGGGCTAGGCCCACCGCTGNCGCCACAN
-+
-677777888888.88888888.887777/555443222100/....-,,,+++++*))))())&(%'"$"%$###"
- at 30BB2AAXX080903:3:51:152:1109#0
-AGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCCACCGCTGCGTCCTCGT
-+
-6777778888888888888888887777655544322210///..--,,,++*+**)'))))(((('$""#$""#"
- at 30BB2AAXX080903:3:53:1029:889#0
-TGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACCTCACCTAA
-+
-67477788888888888888880877776555343222200/...--,,,,++*****))()((''#$$%&%"###
- at 30BB2AAXX080903:3:43:489:1666#0
-CAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTAGATCGGAAGAGCGGGACGGCC
-+
-6777778888888888888/08881777655.421)11/./$.+/-++,+++**)*)('()'((''#'$"#"""#"
- at 30BB2AAXX080903:3:39:1428:1113#0
-AGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAGCTCTGCA
-+
-67777788888888888888888877776565443222100//...-,,,+++***)))))(('(('%""#$""#"
- at 30BB2AAXX080903:3:57:731:544#0
-GGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGGCCTACTCA
-+
-677777888888888888888888777765554402221/0//..---,,+++***)))))((('(&$$#""""$"
- at 30BB2AAXX080903:3:44:424:1363#0
-GGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTCCAA
-+
-67777788888888888888888877776555443222100/...---,,+,++***))*((((((''%&&&$%$#
- at 30BB2AAXX080903:3:50:35:510#0
-ATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGGAACGATCAT
-+
-67777788888888888888888877776555443222100//.----+,,,+***)&)))&((('&""#"""$""
- at 30BB2AAXX080903:3:1:396:1739#0
-TGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACGACGTACATAACCTAAACCTCNCANAACC
-+
-277777888888888888,81878.7461525342$2.100*/-...'-,+'++*))))(('(''(''"%&"##""
- at 30BB2AAXX080903:3:43:1377:1569#0
-CATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTCAGACTG
-+
-67777788888888888888888877776555443222100//..-+-,,+++***))())((((''&$##%##""
- at 30BB2AAXX080903:3:58:1417:1634#0
-GCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTCCAACAAGN
-+
-67777788888888888888888877776555443222000//..----,+++**))))()(((((&%%%$""#""
- at 30BB2AAXX080903:3:3:1150:1405#0
-TAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGNCCTGNTG
-+
-677777888888888888888%8877/76542400+2210/1&.'-&,+(,,+****))*''()(&%&"""#$"#"
- at 30BB2AAXX080903:3:4:504:761#0
-TTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGCNCTCGNCN
-+
-67777788888888888888888877776555443222100./-.-,+,,+,+*+))*)()()((''&"$"%#"$"
- at 30BB2AAXX080903:3:58:960:1382#0
-GATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGGTTAACA
-+
-67777788888888888888888877776555443222100/./.---+,+,++*)*))*)((((''&%&"""###
- at 30BB2AAXX080903:3:49:444:1543#0
-TCTCAATCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTACAATGCTAAAACTAATCGCGACA
-+
-6777778888888888888888887777655546322-100/...-,-,,,+%+***))())(((('&"$&##"#$
- at 30BB2AAXX080903:3:35:1319:412#0
-TGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGTAGANCGCACANN
-+
-67777788888888888888888877776+55443222100//...--,,+++*+*)*())(((((("$"%#$#""
- at 30BB2AAXX080903:3:56:1624:173#0
-TTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTATGTACGTAGTCTAGGCCATATGTGCACAACAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$&&###"#
- at 30BB2AAXX080903:3:4:322:1823#0
-CATGTCAGTGGTAGTAATATAATTGGTGGGACGATTAGTTTTAGCATTGGAGAAGGTTTAGGCTATGANCGTANCN
-+
-6777078888888888888888887,776305435/02&00*/.-.-,-,++'***'())'('((('""#""#"$"
- at 30BB2AAXX080903:3:36:786:988#0
-GTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGATCGGGAGAGCGGCTTCGACAN
-+
-67777788888888888888888877776555423022101//.,+,+,,,+%**)')*%))()%''$"""####"
- at 30BB2AAXX080903:3:60:1351:342#0
-AAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGGTTCCACCANN
-+
-677777888888$8888888888877776555443222100/-..-.-,,+++*)*(*))#()('''"#"####""
- at 30BB2AAXX080903:3:53:235:1478#0
-GTACATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCACTGACATGCGACCG
-+
-6777778828.8888+8888888877776555443222100//..-,,,,+++*+***))()(((('"$%"%####
- at 30BB2AAXX080903:3:47:1715:1485#0
-GGAAAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGGAGTAGGTTTAGTGGCGGGC
-+
-67777788888888888808888877776555443222/00///..--,,+++***)))()((''('&#"""##"#
- at 30BB2AAXX080903:3:42:939:929#0
-TCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTGGTAGTAATATAATTGTTGGGACGATTAGTTTTAGCATTGTG
-+
-677777888888888888888888777765554432221&0/..,,-,,,++)**('))))((((('%&""$%$"#
- at 30BB2AAXX080903:3:58:575:1902#0
-TTCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTGGGAGGAATATAATTGTTGGGGAGATTAGTTTTGGTCTCCN
-+
-6777778888888888888888887777655544122,.0/0/-..,-,,,++***'&*(&)'(('''"%%$"##"
- at 30BB2AAXX080903:3:49:1640:620#0
-GCTAATAATTAGGCTGTGGGTGGTTGTGTTGATTCAAATTATGTGTTTTTTGGAAAGTCATGTCAGTCGAATCGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$&"###""#
- at 30BB2AAXX080903:3:49:959:1978#0
-ACTACCACTGACATGACTTTCCAAAAAACACATAATTTGAATCAACACAACCACCCACAGCAGATCGGAAGCTACA
-+
-6777778-888888888888888877776555443222100/...---,,+*+*)*))))())(('&&"""$""##
- at 30BB2AAXX080903:3:51:1528:1847#0
-AGAGGGATGATGCTAATAATTAGGCTGTGGGTGGTTGTGTTGATTCAAATTATGTGTGTTTTGGAAAGATGGTCCC
-+
-67777788888888888-8888887777655$443222101/...$.-,,+++****())'(()'''"$"""#%"#
- at 30BB2AAXX080903:3:40:513:888#0
-CATAATTTGAATCAACACAACCACCCACAGCCTAATTATTAGCATCATCCCTCTACTATTTTTTAACCAGATCACC
-+
-177777888888888*888888857777655+443222100/...--,+,,++***)*)))((((''&&$$%&%##
- at 30BB2AAXX080903:3:55:302:514#0
-AACAGCTAAATAGGTTGTTGTTGATTTGGGTAAAAAATAGTAGAGGGATGATGCTAATAATTAGGCTGGGGGTTTG
-+
-67777788888-88(88888888377776-551432/2100//.-----,,++**)(*))))(((('""$""""""
- at 30BB2AAXX080903:3:36:237:472#0
-GGAAAAGGTTGGGGAACAGCTAAATAGGTTGTTGTTGATTTGGTTAAAAAATAGTAGAGGGATGATGCTACGCNCN
-+
-67777788888888888888888877776555443222100//...,,,+,++***)*))))(((('%$##"#"$"
- at 30BB2AAXX080903:3:38:1547:96#0
-TTAGGGGGTCGGAGGAAAAGGTTGGGGAACAGCTAAATAGGTTGTTGTTGATTTGGTTAAAAAATAGACGACACNN
-+
-677777888888888888888)887778635544+0/2/00./.'-+&--*+*+++'('(((('''%"$$""""""
- at 30BB2AAXX080903:3:46:115:1597#0
-TAGGAGGGGGGTTGTTAGGGGGTCGGAGGAAAAGGTTGGGGAACAGCTAAATAGGTTGAGATCGGAAGTGCGACGC
-+
-67777788888888888888888877776055443.22100./,----,-,+****)))))()('''&""##"#"#
- at 30BB2AAXX080903:3:55:529:118#0
-ACCAAATCAACAACAACCTATTTAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTGCTCATAAC
-+
-677777888888888888888888777765554432221/0//..---,,+++**(*)))))(((('"'"$%$"##
- at 30BB2AAXX080903:3:60:815:1932#0
-AACAACCTATTTAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTCCNACNN
-+
-6777778888888888888888887877655224+12,101//.,-+,,,++***)(**'()('(%'&""$"#$""
- at 30BB2AAXX080903:3:36:453:1548#0
-TAGCTGTTCCCCAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCGCACATCTN
-+
-677777888888888888888888777765554423111//....---,,,,++*))**)()((('&"$$%$"$#"
- at 30BB2AAXX080903:3:41:1537:428#0
-TGAGGGGTAGGAGTCAGGGAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCAGAGCGGAAGAGCGGTTCAGAACC
-+
-677777848888888888$88888777765554432221-0/..----,,$,+**(*)))))(((''"""&#""#"
- at 30BB2AAXX080903:3:46:886:1075#0
-TGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTGGGAGGAAAAGGTTGGGTGCCGCTT
-+
-6777778588888888888888887777655544322210.//.,---,,(*+*&*)')((()'(''&"""#"#""
- at 30BB2AAXX080903:3:43:1012:1723#0
-TGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCGGAGGAAAAGGTTGGGGGCGCG
-+
-67777788888888888888888877776555442222100//..---,,++++***))')'()'''&$%%"""#"
- at 30BB2AAXX080903:3:54:676:1472#0
-GCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTCGGAGGGACAGGTGC
-+
-67777788888888888888888877776555443522100/...---,++++++*)*))(((((''"%%%%##$$
- at 30BB2AAXX080903:3:52:945:914#0
-TTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGAGATCGGAAGAGCGGTCCCGCGGGG
-+
-677777888888888888888888477765/5343222100/...---,,+++***)*())))(((%"""&%"""#
- at 30BB2AAXX080903:3:37:498:1008#0
-GTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGCCTCCGCN
-+
-6777778888888888888888887'776555443222100//..--+,,+++***)())))(((''&"""""##"
- at 30BB2AAXX080903:3:43:1237:487#0
-GTTGGCTTGCCATGATTGTGAGGGGTAGGAGGCAGGGAGTTAGTATTAGGAGGGGGGTTGTAGATCGGGGGAGACT
-+
-6/777788888888888858088872776/5'3432)-1%0./-.----,,++****&()&)(('%''"#%$"$""
- at 30BB2AAXX080903:3:42:951:1057#0
-TGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGTTGTTAGGGGGTTTT
-+
-6777778888888888888888887777635544321110/./-.--),,+,+***)))))%(('&&%'#""""""
- at 30BB2AAXX080903:3:58:1335:966#0
-TGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGGGTGTTAGTGTCCACA
-+
-67777788888888888888888877776)55443222100//-.---,-+++***)))))%((((''"%"##%$$
- at 30BB2AAXX080903:3:38:1316:1622#0
-GGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGAGGGGGCTGTCACTA
-+
-677777888888888888888888777765554432,1101/--.--#,,)+*+)**))))()((('%$%%%"#""
- at 30BB2AAXX080903:3:41:1035:1846#0
-CACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTAAGATCGGCTCGATGCN
-+
-27777788888888888888/888.7576055323222100//---*'+,*$++**()()((((&''$%%#$###"
- at 30BB2AAXX080903:3:35:1160:1334#0
-TCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGATNTGCTCAAN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)((('('"#%#"$#""
- at 30BB2AAXX080903:3:57:205:1630#0
-ACCCCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCATGCGTA
-+
-67777788888888888888888877776555443222100//..---,,+,++****)))()((('$&$""#"#"
- at 30BB2AAXX080903:3:49:154:485#0
-CCCCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCNCGACAACT
-+
-67777788888888888888888877776555443222100//..---,,++****))*))(((((&"$"###$#"
- at 30BB2AAXX080903:3:42:1571:406#0
-GGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGGTGGTCGT
-+
-6727778880888888888888887777657543322.1/0//.,,.-+-+,+++')*)(((&'''''&##""#""
- at 30BB2AAXX080903:3:45:1422:1974#0
-CCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTAGATCGGAAGGGACG
-+
-67777788888888888888888877776555443222100//..---,,+++*)*)*)))))(('''""#"#""#
- at 30BB2AAXX080903:3:59:294:1395#0
-GTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTAAGATCGNNNC
-+
-67777788888888888888888877776555443222100-/..-,-,,++****)#))()((('''"&&%"""#
- at 30BB2AAXX080903:3:40:385:1146#0
-AGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTACTATGAGGC
-+
-67777788888888888888888877776555413222100/...--+-,+*+***))())((('('$$%$%#$"#
- at 30BB2AAXX080903:3:37:1135:1753#0
-TAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTTGGACN
-+
-67777788888888888888888877776555443220100//..---,-+++*+**))()()('''%%##%###"
- at 30BB2AAXX080903:3:52:837:750#0
-TGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGTAGTTAGTATTAGC
-+
-6777778888888888888888887777655544322010///.----,,+&+***)()()(#((&'""#######
- at 30BB2AAXX080903:3:36:680:352#0
-GTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCCTGATTGTGCGGGGTAGGAGTCAGGTAGTNGTATAGAN
-+
-6777778388488888888888887777655544321.+00./..,-,,,++#***()(('((#(('"$"#&%%#"
- at 30BB2AAXX080903:3:46:364:1500#0
-GTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGGGTAGGAGTCAGGGAGTGNGNGATAC
-+
-67777788888888888888888877776555443232.00./..--+,,++****()((((('(''""%""#"$%
- at 30BB2AAXX080903:3:2:1154:986#0
-TACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTANCCGGTCT
-+
-67777788888888888888888877776555443222001//...-,,,,++*****)))((((''%""%""##"
- at 30BB2AAXX080903:3:59:105:571#0
-TACTAACTACCTGACTCCTACCCCTCCCAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTATCACANNC
-+
-67777788888888888888888877(7655554322210//,..---+-+*++**(*))')'(((''&&#%#""#
- at 30BB2AAXX080903:3:60:1176:418#0
-TACTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGTGAACCACTACGATCCNN
-+
-677777888888888888888888777765554432221000/...--,,,++*+***)))()(((''"%#"##""
- at 30BB2AAXX080903:3:48:30:987#0
-TTTTCGTGATAGTGGTTCACTGGATAAGTGGGGTTGGGTTGTCATGAGTGTGAGGGGGGGGGGGGGGCTCCGCCAC
-+
-677777888888888.888888817777)55)4&*22%.0&#.#+,"',,)*#***)()))((((#&%$##""#"%
- at 30BB2AAXX080903:3:2:853:560#0
-CTAACTACCTGACTCCTACCCCTCACAATCATGGCAAGCCAACGCCACTTATAGATCGGAAGAGCGGCNGCCTCTC
-+
-6777778888888888888388884777655543-2)20-0.+.,,++-,,++**)())&((&(&%(""#"""#"#
- at 30BB2AAXX080903:3:38:239:613#0
-GAGGTAGAGTTTTTTTCGTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGGNGCGTCTCA
-+
-6777778888888888888888887777655544302210///...--,+,,+'+))*&)))()&(&"#""##"#"
- at 30BB2AAXX080903:3:40:404:1033#0
-AGAGGTAGAGTTTTTTTCGTGATAGTGGTTCACTGGATAAGTGGCGTTGGCTTGCCATGATTGTGAGCGTGATCAC
-+
-67777788888888888888888877776535443222100//./---,,+++*)*)*)))((((&&"%"$"""$"
- at 30BB2AAXX080903:3:8:1212:1941#0
-CAAGCCAACGCCACTTATCCAGTGAACCACTATCACGAAAAAAACTCTACCTCTCTATACAGATCGGNCTCGCTNN
-+
-6777778888488888888888167777655544332200/-/,,-,*,-+++*))(#*))((((('"&"#"#"""
- at 30BB2AAXX080903:3:57:91:1513#0
-TCTGTGGCTGTGAAAGTACTAATTAAGGGGGTTTGTCGGGAGGTTAGTATAGAGGGGCAGAGGTTTTTTGTATCTC
-+
-677777888828'8&888,8%8287877%5*'4422$210,/&&-,-#*,)+#+'))$))'(&#'''"$#"$$#$#
- at 30BB2AAXX080903:3:3:15:1417#0
-TTCTGTGGCTGTGAATGTTATAATTAAGGGGATTTGTAGGGGGGTTAGTATAGAGAGGGAGAGGTTTCNCCTNNAC
-+
-67777788888888888.88888877776(5-44322-100*/(.-+-),+++)*()))')((&'(&%"#"%"""$
- at 30BB2AAXX080903:3:35:377:1074#0
-TGATTAGTTCTGTGGCTGTGGATGTTATAATTAAGGAGATTTGTAGGGGGATTAGTATAGAGAGGGANCTACACAN
-+
-677777888888888888$8,888&717.515)432'2000//-,,--&,&,+'*))*))'((('#'"&"#%#$""
- at 30BB2AAXX080903:3:34:330:1261#0
-GAAGATATAAAATATGATTAGTTCTGTGGCTGGGAATGTTATAATTAAGGAGATTTGAGATCGGGAGNCATCCGNN
-+
-67777788888888888888888877776555/4'212,0./-.,-,-,,*++'**'#)''#((&'("$"###"""
- at 30BB2AAXX080903:3:47:993:1219#0
-CTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAGAACTAATCATATTTTATATCTTCTTCGAACACACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''"%"$"%##"
- at 30BB2AAXX080903:3:51:961:1813#0
-TAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGTGGCTGGGGATGTTAAGATCGGGAGAACCGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+,*+'*()))&%()&&&""##"&###
- at 30BB2AAXX080903:3:54:1435:1245#0
-GATAGCCAAGGTGGGGATAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGTGGTTGGGGAGTTGTCA
-+
-67777788888888888888888577776553442220100//.-.--,-++)***%))))(#(((%'"$%%#"##
- at 30BB2AAXX080903:3:50:352:590#0
-ATCGGGTGATGATAGCCAAGGTGGGGATAAGTGTGGTTTCGAAGAAGATATAAAATATGATTAGTTCTGGTGCTGG
-+
-677777-88888888888888)88778165504,32-2100/..-,--,,+,*+***)))(&((%(#""##$#"""
- at 30BB2AAXX080903:3:48:333:1078#0
-TGACTGGTTGCCTCATCGGGTGATGATAGCCAAGGGGGGGGTAAGTGGGGGTTCGAAGAAGATAAGAGCAGGCAGC
-+
-6777778888888888088888887777604--43-2210&/...$-&-,&*+'*&)*()(((&(('"###"##"#
- at 30BB2AAXX080903:3:52:508:1890#0
-GTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGATGATAGCCAAGGTGGGGGTAAGAGAGATCGGGAGCGGCCCG
-+
-677777888888888.888.188876776555,43222100/.,---#,,++*)***#*#(&'#'('$""$"""#%
- at 30BB2AAXX080903:3:58:469:1093#0
-CCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGAGGAAAGGCAAGGGGGGGGGGAGGGGGGGTATGCTAC
-+
-6-77778.888888(88-88,888(27&9)5(,3222.20,/+#,-$'*+,++****)((((''#('&&#"%%"$#
- at 30BB2AAXX080903:3:34:41:314#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGNCTCCTTNN
-+
-67777788888888888888888877776555443222100//..---,,,+++****))))(((('"$$#%""""
- at 30BB2AAXX080903:3:52:1417:358#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGACCGCGCGC
-+
-67777788888888888888888877276555443.22&00//...--,,++++*'())))'(((&'&#$&%#"#$
- at 30BB2AAXX080903:3:52:973:1914#0
-CTTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAGNGCAGCG
-+
-67777788888888888888888877776555443201200/....--,+,*+**')))(('('(('%""&##%#"
- at 30BB2AAXX080903:3:3:1073:1811#0
-TTCGAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAAAGATCGGAAGAGCGGTTCNCGCNNAT
-+
-677777888888888888888888767765/5343222100/..,,.,,-)++*+*))()()(((%#$"$""""#"
- at 30BB2AAXX080903:3:33:1741:589#0
-TGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGTGATGATAGCCAAGGTGAGATCGGAAGANTCACACNN
-+
-677777888888888888888888777765554432221-00...---,++*+*#+)*)&'((%(('"$%"###""
- at 30BB2AAXX080903:3:1:506:1152#0
-GAAACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGCTAGAACGCCTGAACGCNCCNACAC
-+
-64/7718828881*.230,,,,20-,2-+)+0(-*()-)*,)+,'(&&$$($#&#'%#####%%#%#""##"#$##
- at 30BB2AAXX080903:3:51:333:1641#0
-AACCACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCANGCACTGCN
-+
-67777788888888888888888877776555443222100//-..--,,++++*))*)))((('(&""%"$#"#"
- at 30BB2AAXX080903:3:45:272:1952#0
-AGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGGATGATAGCCAAGGGGGGGGTAAGGGGGCG
-+
-67777788888888888888/88897754555(43.+100/./..*-+,,+++*#*()))&)(((''%"$"&"$""
- at 30BB2AAXX080903:3:35:459:433#0
-CACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGAGANCGTGCGNN
-+
-67777788888888888888888877776555443222110...-.--,,+++*++*)))())((('"&""##"""
- at 30BB2AAXX080903:3:43:894:1016#0
-GTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGTGATGATAGCCANGGGGTGC
-+
-67777788888888888888888877776555443222110//..---,,,,+***()*))()((&#$"#""##$#
- at 30BB2AAXX080903:3:44:1221:1665#0
-CCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACC
-+
-67777788888888888888888877776555443220100/....---,++++***)))()(((('&$&&&%$$$
- at 30BB2AAXX080903:3:59:1171:24#0
-CCCACCTTGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCANNN
-+
-67777788888888888888888877776535/31.,210/0,.----,,&+**+*''((#'##(''&"##%%"""
- at 30BB2AAXX080903:3:35:1298:203#0
-TGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCATCGGGGAGATCGGGANCCTCCTNN
-+
-677777888888888888888888777765552432.210///.'--',+*)*****())'&'((#%"$###$"""
- at 30BB2AAXX080903:3:40:1063:1611#0
-TGGCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTCCT
-+
-67777788888888888888888877776555443222100//....-,,+++++)))))))((((''%%&%%"#"
- at 30BB2AAXX080903:3:37:1416:384#0
-TACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCTCCAGATCGGACACGTCGN
-+
-6777778838888888888888/877/7655544.22-1000-(-+&+,+++*)*#(&(#'''#&#%"%%"##%""
- at 30BB2AAXX080903:3:55:1546:483#0
-GCTATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACAACACATCCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$%$&#$$#
- at 30BB2AAXX080903:3:55:527:1151#0
-ATCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCNAGTACACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((''"%##$""$"
- at 30BB2AAXX080903:3:4:497:528#0
-TCATCACCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCAGCNATCANCN
-+
-6777778888888888888888857777655934302.1///0--.,-,,+++)**)*))('(('''%"""%#"#"
- at 30BB2AAXX080903:3:60:859:1679#0
-GAGCCTACTAGGGTGTAGAATAGGAAGTATGTGTCTGCGTTCAGGGGTTCTGTATGGTTGTCTCATATAGCACANN
-+
-677-/7888888888888888888777765534$352,1/1-..-$-,$*++#$)&)&('#''#(%%"%%$%$$""
- at 30BB2AAXX080903:3:33:901:537#0
-GAAGGGAGCCTACTAGGGGGTAGAATAGGAAGTATGTGCCTGAGTTCAGGCGTTCTGACTGGTTGCCNTCTGCANN
-+
-677777888888'8888888888877276555443222100/%./---,,++****))()()(((''""%"#%#""
- at 30BB2AAXX080903:3:42:774:1155#0
-GAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGTCTGGTTGTCTCCCGGTCG
-+
-67777788888888888818818877176555442222&0///.,--,-,+++*)&)#)((%&''#%&$#%#"###
- at 30BB2AAXX080903:3:35:856:1046#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGAAGGCACATACTTCCTATTCTACACCCTAGTAGGNTACCTTCN
-+
-67777788888888888888888877(7655,4,*21210//..--,,,,+*++**))()()('(''"""&&%"#"
- at 30BB2AAXX080903:3:48:394:1813#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGGCCGCTACA
-+
-677777888888888888888888777765554432211/00/-.-,+-,+++**)*)()((((('%"#""$""##
- at 30BB2AAXX080903:3:49:1438:999#0
-CCCGATGAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCCGCGGACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('&""#"""""
- at 30BB2AAXX080903:3:47:1204:2009#0
-GGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTGACTGGTTGCCCTCTTCAC
-+
-6777778888888888888888887777655543322210///-.--,-,+++*+))))()(('((%$$%""#"##
- at 30BB2AAXX080903:3:33:904:1339#0
-GTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGCACAGGCGTACTGACCGNCACTGANN
-+
-677777888888888888888888777765/55432-2100/..,,,-,,+&+***))#')(('#%'"$#$"""""
- at 30BB2AAXX080903:3:57:927:1252#0
-GAGGCAACCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTGCGCTATA
-+
-67777788888888888888888877736555443222100-/.,---,,++)*++**)*)()('((&"&"#"$##
- at 30BB2AAXX080903:3:2:309:46#0
-GATGAGGAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGTCTGCGTTGAGGAGTTCTCNAGTNNAT
-+
-6777778888888888488)*0817677635.44+,221/../&.,-+,$+*+$*')'))('(#(#'$"#""""""
- at 30BB2AAXX080903:3:33:1694:477#0
-GATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGTTCAGGCGTTCTNTCCAGCNN
-+
-6777778888888888888888187777655(443222100//$..-,,,+*+**()))))'('(''""$%$"$""
- at 30BB2AAXX080903:3:55:1137:1834#0
-CCAGTCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCCTCACA
-+
-67777788888888888888888877776555443222100//..---,,,,+****)*))((((('&&"#%$#"#
- at 30BB2AAXX080903:3:49:536:890#0
-GAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACGTCCTC
-+
-67777788888888888888888877776555443222100//..---,,,,++*))*)())))(('&"#""####
- at 30BB2AAXX080903:3:57:843:1396#0
-AACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAGTCTA
-+
-67777788888888888858888877776555443212100//./----,,++**)))(*()(((('&&#"$####
- at 30BB2AAXX080903:3:41:1759:339#0
-ACGCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCCTCCCCTACTCATCGAGATCGGGTCT
-+
-67777788888888888888888897476545443220200*...-+-,,)++***(()((('(&''&##%$""$"
- at 30BB2AAXX080903:3:39:1100:149#0
-TGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCCTTCAGTAC
-+
-67777788888888888888888877776555443222/00/-.-,-,,,+++)**(*))())('('"%#$%%"##
- at 30BB2AAXX080903:3:33:1638:1300#0
-GCCTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTNCTACACNN
-+
-677777888888888888888888777765554432221/0//.-.-,,,,,+++)*)))))))(('""""#"#""
- at 30BB2AAXX080903:3:33:1205:213#0
-AGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTNTCTATANN
-+
-67*747888888888888888788777765552432/212//...-,--,+++**)))()()(((''"%%#""#""
- at 30BB2AAXX080903:3:57:301:1298#0
-CTGAACGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGAGATCGCGCGCTGTA
-+
-67777788888888888888888877776555423222000//..-+,,,+,*)**))(((((((''$$$&###"#
- at 30BB2AAXX080903:3:37:628:257#0
-GAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTATGTGCCTGCGCTACN
-+
-67777788888888888888888877776555443222100//..,---,,+++**))))))(('('$&%%$&##"
- at 30BB2AAXX080903:3:50:736:303#0
-TTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAAAGATCGGAAGATAACACTAA
-+
-677777888388888888888828771765554432221000..-----++*+*))*))&(((((('"""%$#"#"
- at 30BB2AAXX080903:3:2:1507:571#0
-CGCAGGCACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCAGATCGGAAGAGCNCGCTCTC
-+
-6777778888888888888888887777555534322210//./,.-,,,-+++***)('))(((('%"$"""$##
- at 30BB2AAXX080903:3:2:191:498#0
-GTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAGAATAGGAAGTANCGANNTA
-+
-67777788888888888888888877776245443222100/.-.,.,,,+++***)*))(()('(#%"#$"""#"
- at 30BB2AAXX080903:3:37:1327:1296#0
-CACATACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACGANANGACN
-+
-67777788888888888888888877776555443222100//..----,,++++)))))))(((('$&"%"&##"
- at 30BB2AAXX080903:3:50:1770:1826#0
-TAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGATCGGAAGAGCGGATCCGCGCG
-+
-67777788888888888888888877776555443222100//..---,,,++**+*))))()('''""#""#"##
- at 30BB2AAXX080903:3:2:1202:1083#0
-CCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTAAGATCGNAGTCACT
-+
-67777788888888888888888877776555423222100-/..-,-,,,+*+**)*'))))((#'%"#"#%#$"
- at 30BB2AAXX080903:3:46:1029:1155#0
-CCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGAGATCGGAAGACATGGGTG
-+
-67777788888888888888888877776555443322100//..---,,+,+***)))))(((((&$"""#"#"#
- at 30BB2AAXX080903:3:2:1195:196#0
-AGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTACTAGGGTGTANATACACC
-+
-67777788888888888888888877776555442222100./..--,-,+++*)))*())))('(''"""#$"##
- at 30BB2AAXX080903:3:42:300:1964#0
-TTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAAAT
-+
-67777788-888888888883083477765/5/23+2-0.0....--+,,,++*+))*(((((((%'&%&&%"#"#
- at 30BB2AAXX080903:3:43:1094:206#0
-CTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAAGATCGGAGGCGCGC
-+
-67777788888888888888888877776555443222110//..---,,+++***))))))((((''$"&#%"#"
- at 30BB2AAXX080903:3:50:1101:274#0
-TAGAATGGTTAGTGAGCCTAGGGTGTTGAGAGTGTAAATTAGTGCGATGAGTAGGGGCAGGGAGACTACTTCCCTC
-+
-677177888888.88888888888+,77'515442222100.,..-.-,++)+***)()))'(('''$""#$##"#
- at 30BB2AAXX080903:3:38:1506:711#0
-CCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACAGATCGTGAGCGC
-+
-67777788888888888888888877776555443022100//..---,,+++***))))))((((#"$$"""#"#
- at 30BB2AAXX080903:3:41:1224:227#0
-AGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGAAGGGAGCCTNCTGTGA
-+
-6777778888888888888888887*776555443212/00//.,---,-+,+***)))')(#((''&%""&$$##
- at 30BB2AAXX080903:3:36:1726:561#0
-CTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACANTCTCCTNN
-+
-67777788888888888888888877776555443222100//..-.-,,++*+*)**)*))(((('"&&$$$"""
- at 30BB2AAXX080903:3:58:124:1903#0
-AGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACCANNN
-+
-6777778888888888888888887777655944321200///.---++,+,+***)*()(()(('''&%%#$"""
- at 30BB2AAXX080903:3:54:1501:660#0
-AGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGGGGACACTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&$##"#"#"
- at 30BB2AAXX080903:3:46:1617:617#0
-TCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACAGTGCTAGA
-+
-67777788888888888888881877776555443222100//.-.-,+,+*++**)*))())((('""""$""""
- at 30BB2AAXX080903:3:49:1022:1264#0
-CTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACTCACCGCTTCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('''&$"$""##"
- at 30BB2AAXX080903:3:49:1469:208#0
-CAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAAATTAGTGCGATGAGTAGTCTGTC
-+
-6777778888888888%888888877770555443222100+...---+,(*+*+**)&)(()('('$"$#$####
- at 30BB2AAXX080903:3:38:1396:722#0
-CTCATCGCACTAATTTACACTCACAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCAGCTGTC
-+
-67777788888888888888888877776555443222100//...--,,+,++*****))()((''&$#&"%#$#
- at 30BB2AAXX080903:3:41:84:660#0
-CGCACTAATTTACACTTACAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCCAANCCTCATCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"&#"$#"#"
- at 30BB2AAXX080903:3:40:452:1727#0
-TGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGAGTGTAATAGATTCAC
-+
-677777888888888888888-88767565514-322100//).--,,,,+++)*)))))()(('('$$%%%$"##
- at 30BB2AAXX080903:3:60:578:84#0
-CAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGGGTTGTGAGTACTNN
-+
-67777788888888888888888877776553443122/00./...---,++****)()*)&('((&'"&%##"""
- at 30BB2AAXX080903:3:38:695:1481#0
-TCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGAGAGGACAC
-+
-67777788888888888,8888887777655544320210//...-,,,,+++**(())))((((('$$#"""###
- at 30BB2AAXX080903:3:1:1137:1440#0
-CTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGNGCNGCTA
-+
-6777778888888888888888887777655240302100/./..--*,++++***'))()((&('%%"#%""#""
- at 30BB2AAXX080903:3:39:244:1967#0
-CTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGTTGTGACATAC
-+
-67777788888888888888888877776555423220201//----,,,-+++**((*))))((''"$"%%"""$
- at 30BB2AAXX080903:3:54:282:249#0
-TTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGGTGCTGGTAT
-+
-6777778888.8888888888888777765554130221000/..,-+,,+*++**))))())((('$%%#$"#""
- at 30BB2AAXX080903:3:1:726:93#0
-CAACACCCTAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGACNCTNTCAA
-+
-677777888888888888888888777765254131211/0./..+-,-,,,+***)*))()(((('""#""##"#
- at 30BB2AAXX080903:3:38:1501:851#0
-TAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATGTTTAGTGAGCCTAGGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))((('(&&%&""%$"#
- at 30BB2AAXX080903:3:46:635:799#0
-CACTAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGAGCTAT
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))()((('%$$$""""#
- at 30BB2AAXX080903:3:48:1320:595#0
-AAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGGAGATCGCTCGCACA
-+
-677777888888888888888888777365/5'4321200-../.*--,,+++**)*()()#)('#'&&$"##"##
- at 30BB2AAXX080903:3:39:320:1443#0
-TGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGTAGAATTGC
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))()(((&$"%$#"""#
- at 30BB2AAXX080903:3:50:1204:825#0
-TGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGTGAGTAGCTACATCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)))((((((&""##"""##
- at 30BB2AAXX080903:3:48:447:659#0
-AGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATAGTTCTTGGGCAGTGAGAGNGACGCTG
-+
-67777788888888888888888877776555443222100./..--,,,+++***)*)#()((('''"$$#"#""
- at 30BB2AAXX080903:3:2:1683:541#0
-TACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTTACACCNAATCACA
-+
-67777788888888888888888877776555443222100//...--,,+,++***)))))))('&$"""%##""
- at 30BB2AAXX080903:3:4:857:1261#0
-TCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTAGATCGGAAGAGCNCTCANCN
-+
-67777788888888888888888877776555)43222100/...---,,+,++*)))))))((('(&"$"$#"#"
- at 30BB2AAXX080903:3:53:1692:1419#0
-GGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGATCTACACCACA
-+
-67777788888888888888888877776555443222100//..---,,++****)))))(((''#"$%&%#%"#
- at 30BB2AAXX080903:3:36:663:1796#0
-AGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGGCTCAGGAGTTTGACACATCACNN
-+
-67777788888888888888888877776555343220/0///.----,,+++*+***)()(()('#$$""%$%""
- at 30BB2AAXX080903:3:38:913:1126#0
-CAAGAACTATCAAACTCCTGAGCCAACAACTTAATATGACTAGCTTACACAATAGATCGGAAGAGCGGTTCAGCTA
-+
-67777788888888888888888877776555443222100//..---,-+++*****))()(((('%###""""#
- at 30BB2AAXX080903:3:35:374:1092#0
-TAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGAGATCGGAAGAGCNCATCTATN
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))()((('""""#"##"
- at 30BB2AAXX080903:3:2:1611:843#0
-AGTGGAGTCCGTAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTTGTTGNTCACCTA
-+
-67777788888888888888888877776555443202100/....,-,,+++***)*)))((((('&"##"##"#
- at 30BB2AAXX080903:3:3:1070:1084#0
-AAGTGGAGTCCGTAAAGAGGTATCTTTACTATAAAAGCTATTGTGTAAGCTAGTCATATTAAGTAGATNCTGCNAC
-+
-67777788888888888888888877776555442222100//...--,,+,+**)))))()('(('$"#%&#"#$
- at 30BB2AAXX080903:3:53:971:1126#0
-AACTTAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACAGATCGGAAGAGCGGCTG
-+
-67777788888888888888888877776555443222100//...--+,+++)***))))((((''%##"###""
- at 30BB2AAXX080903:3:49:1072:1244#0
-TACCTCTTTACGGACTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATATACGACAT
-+
-67777788888888888888888877776555443210100//..-.,*,,,+)*)*)))()(('&'%"#%""#""
- at 30BB2AAXX080903:3:33:1529:186#0
-TTACGGACTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCGCCATCGCTGGGACAGATCGGAAGNGCGCACNN
-+
-627777888888888888888888777765/54&-'(1201+.(-,-#,),&+**%'(&)(&''#''""$$"#"""
- at 30BB2AAXX080903:3:35:812:1164#0
-CTCCACTTATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTAGATCGGAAGAGCGGGTCNCNCTCCCN
-+
-677777888888888888888888777765554430/21/1/./,-.-),,+*)*)(()()')(#'&""""""##"
- at 30BB2AAXX080903:3:52:227:1277#0
-ATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCAGCGATGGGGGCTTCGACAGATCTGGGGTCG
-+
-67777788888888888888888877776555443222100//...-,,++++****))()((((('&"##"#"#$
- at 30BB2AAXX080903:3:55:483:728#0
-CCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCAGCGATGGGGGCTTCGACATGGCGTCCAT
-+
-67777788888888888888888877776555443)22100//..---,,+,+****)))))(((('"&""###""
- at 30BB2AAXX080903:3:40:243:1720#0
-TAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTAGATCGGAAGANGCGATACG
-+
-6777778888888888888888887777655244021210.//.-,-,,,++++**'*()())('(%"'#""""#"
- at 30BB2AAXX080903:3:43:1725:800#0
-AAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTTCGGGTA
-+
-6777778888888888888888887777655544322210///..----,+,+*+**())())('('"$""%""#"
- at 30BB2AAXX080903:3:59:86:1823#0
-CCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATTGCACNNC
-+
-67777788888888888888888877776555443222100//...-,,,++++**)))))((((('$"&%##"""
- at 30BB2AAXX080903:3:56:806:404#0
-TGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGATCGGAAGAGCGGTCTGCTG
-+
-67777788888881888888888877756-55443222100/.-.---,,+++*+*)))))())((''&"%"""""
- at 30BB2AAXX080903:3:50:484:1458#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAACACTAGGCGGCTATGGTATAGATCGGTACCGCAG
-+
-67777788888888888888888877776555443222100/..----,,++****)))(((((''&&$"##$#"#
- at 30BB2AAXX080903:3:56:1036:248#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCCCACACC
-+
-67777788888888888888888877776555443222100/...---,,++++**))())))((''%%"&$%"#"
- at 30BB2AAXX080903:3:59:1400:106#0
-CCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCACACNNA
-+
-677777888888888888888888777765554$3222100//..---,,++++*)))#)))(('('&%%%"%""#
- at 30BB2AAXX080903:3:51:633:1554#0
-TGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTACTATTGACCCACACCATGC
-+
-67777788888888888888888877776555843222110//+..--,,++*****())))(((''"$"##"""$
- at 30BB2AAXX080903:3:47:17:568#0
-AATGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGAGTACTGCGGCAAGTAGATCGGAAGTGCTCGCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''&&""#"#"##
- at 30BB2AAXX080903:3:43:389:1851#0
-GCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCTCAAACTTCATCTTCC
-+
-6777778888888888888888887777655548322210///..---,,+,++&)($')#%#%#%#$$"&""""#
- at 30BB2AAXX080903:3:53:85:775#0
-GGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGTATAATACGCCAGATCGGAAGAGCGCGTC
-+
-67777788888888888888888877776555443222100...---+,-+,++****()(((((#'&$#"#""#"
- at 30BB2AAXX080903:3:3:1697:1557#0
-GTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCTATGGCATAATACGCCTCACACTCATTCNCCACNCN
-+
-67777788888888888888408877-75555533.220-1*,-,$,++,*,*(**(*)(''#(('%$"$"&$"$"
- at 30BB2AAXX080903:3:41:1638:1451#0
-GGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCAGCCTAGTTTTAAGAGTACTGCGGGCAGTACGATCGT
-+
-677777888888888888888888777765554602221-)/.---,,,-,*++*)*))))))((''%%$%&$%#"
- at 30BB2AAXX080903:3:37:737:186#0
-AGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGACGCCTCGTTTTAAGAGTACTGCGGCAACTAATCACN
-+
-67777748888888888085888877476555443222100/./.,-+,,+*++***))))((((''"$""####"
- at 30BB2AAXX080903:3:36:1663:52#0
-ATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCGATGGTATAATACGCCTCACACTCATTCTCANGCTAATNN
-+
-6777578888888888/8888888777765554432(1001%/-,.+-+,+,**+*)*#)(#'(&('""$"#""""
- at 30BB2AAXX080903:3:58:699:1018#0
-AGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCCGCCTAGTTTTAAGCACAC
-+
-6777778838888888888888887777335544/212100//.----,,+,+*+*))))())('''&$"$$##$#
- at 30BB2AAXX080903:3:56:1142:338#0
-TTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCGAC
-+
-67777788888888888888888877776555443222100//..,--,,+++***)))))((((('&$%&%#""#
- at 30BB2AAXX080903:3:59:996:216#0
-AAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAAACCCCTGACAAAACACATAGCCTACCGACTNC
-+
-67777788888888888888888877+76575443200100/..%.--,+,,+****()(((('&'%%&##""#""
- at 30BB2AAXX080903:3:57:987:160#0
-AGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAGCCGCCCCAAC
-+
-677777888.8888888888888877776555451222000//.,---,,+++)****))()((((&'%"$##""#
- at 30BB2AAXX080903:3:52:756:316#0
-ACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCACGCCTT
-+
-67777788888888888888888877776555443022100//.,--,,-++++**)*)()(()(('%$"#"&$$#
- at 30BB2AAXX080903:3:34:1415:703#0
-AAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTATACCATAANAGCGTCNN
-+
-67777788888888888888888877776555443222100//..--,,,+++***)*))))((((&"#"&$"#""
- at 30BB2AAXX080903:3:54:689:635#0
-ACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTATTAGATCGGAAGGCGCAC
-+
-677777888888.8888888888877776555443222100//..---,,+++***)))))(((''&&#"#$#$""
- at 30BB2AAXX080903:3:52:269:1537#0
-GGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTCANTTGTTC
-+
-67777788888888888888888877776555443212000//...-,,-+,+++)*))))((((((&""$&$#"#
- at 30BB2AAXX080903:3:38:781:199#0
-CTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTCTACTACNN
-+
-67727718888888888888888877776555443222,00//-..--,,*++++***)))(((((#"$"%##"""
- at 30BB2AAXX080903:3:47:1209:426#0
-TGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCCACCCCTTCCGAGATCTGTTGTCA
-+
-+7770788888888888888888817776555413212110//-.---,,++'***)))()((((('$""###"#"
- at 30BB2AAXX080903:3:55:588:1023#0
-TGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCGAATGGGAGNAGCACAAC
-+
-67777788888888888888888877776555443222100//..---,,++++&*)())%#((&#'"&%%#%#"#
- at 30BB2AAXX080903:3:3:123:1016#0
-TAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGAGGCGTANCATCNCA
-+
-67777788888888888888888877776555443222001//..-,-,,+*+**))*)))((('''&"$%##"##
- at 30BB2AAXX080903:3:1:476:1908#0
-TAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCNCCNCATC
-+
-67777788888888888888888877776555(432.21/00&.,--+,,+,++'*))%('((((('&"##""#"#
- at 30BB2AAXX080903:3:57:975:838#0
-GCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGTGTGGTGTCAACT
-+
-67777788888888888888888877776555443220120//---,-,,++'**))))')((&'('&&%"#""#"
- at 30BB2AAXX080903:3:38:990:1689#0
-TTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTTGTCAGGGGGTTGAGAATGAGATGTCCACC
-+
-67777788888888888888888877776555443222100//..---,,,++****)))))(('('"%$"#$###
- at 30BB2AAXX080903:3:58:1114:987#0
-TCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATACATAC
-+
-6777718888888888888888887793652544302210/....--,+-,+***))*()(()((''&$&%%%"#%
- at 30BB2AAXX080903:3:58:1115:989#0
-TCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATACAAAC
-+
-67177388888888888888888877516543443.12201../.,-,-,,+*+*))*()(()((&'&$&%%###%
- at 30BB2AAXX080903:3:36:815:995#0
-AGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGTTTCTCCTGCN
-+
-67777788888888888888888877776555443222100//...--,-+++***))))))(('''"$"$""#""
- at 30BB2AAXX080903:3:55:523:972#0
-GTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATGTGCAGATCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$"""%#""#
- at 30BB2AAXX080903:3:1:1636:466#0
-TGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGTAGGCTATNTCNACTT
-+
-67777788888888888888888877776555441232100//...-+-++++*+)))))')((%'('""#"####
- at 30BB2AAXX080903:3:40:1692:462#0
-TCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGAGATTGGGCTG
-+
-67777788888888888888888877776555443222101///.---,-,++)+***)(())(((($$"%$""#"
- at 30BB2AAXX080903:3:58:1667:376#0
-TCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAAGGAAGGGGCACACAACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''%$$%%%#%""
- at 30BB2AAXX080903:3:35:1581:96#0
-GATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCATAGGGATAGTACAANTCACGCNN
-+
-67777788888888888888888877774555443222100//..---,,++)****)*())'((('"&"$%"$""
- at 30BB2AAXX080903:3:44:1025:712#0
-AATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTTATAATTATGCCTCAGATCGGAAGGGCGGTG
-+
-6777778838888888888888886771655544222200//..-.--,,-,+**))*)())((((&%$"#$##"#
- at 30BB2AAXX080903:3:44:450:1782#0
-GTACTATCCCTATGAGGCATAATTATAACAAGCCCCATCTGCCTACGACAAACAGACCTAAAATCGCTCCTTGCAT
-+
-67777788888888888888868877776555250222.00./..--++,++++*+)*)()((('(''%"%%%%$#
- at 30BB2AAXX080903:3:41:367:1046#0
-TACTATCCCTATGAGGCATAATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATA
-+
-67777788888888888888888877776555443222100//..--,,,++++**)))))()(((&%%&%%%$##
- at 30BB2AAXX080903:3:57:447:1741#0
-TATGAGGCATAATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()('''$&%"%###
- at 30BB2AAXX080903:3:52:1227:1808#0
-GGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTGTAGAGCGGGGACG
-+
-67777788888888888838/888777;6555343212100//.---,,,+++***))*())(('(%"$#&""##"
- at 30BB2AAXX080903:3:3:1594:36#0
-TGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGAGATAGGAAGCNTGCTNCN
-+
-677,778888888888888688887717655544322,100//.-(--,,+&++*())))'#(((&'%""##""#"
- at 30BB2AAXX080903:3:34:238:1981#0
-TATGTGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTAGGCAGATGGAGCTTNTACCACNN
-+
-6777778888888888888888887777:55544322110.0/..----,+++**))*(()(()'''"""$#$#""
- at 30BB2AAXX080903:3:41:989:895#0
-ATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATCC
-+
-67777788888888888888888877776555443222100//..----,,+++***)))))(((('&&%%##$""
- at 30BB2AAXX080903:3:48:112:1397#0
-ATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCCTATCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('''$"$"#"$##
- at 30BB2AAXX080903:3:51:932:211#0
-ACAAGCTCCATCTGCCTACGACAAACAGACCTAAAAACGCTCATTGCATACTCTTCAGATCGGAAGAGTCTCGCGC
-+
-6777770888888888-8888888777765554432#21/1/...-.,,-+'+**'()))()('(('%"######$
- at 30BB2AAXX080903:3:53:665:1041#0
-CAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCACCCACATAGGCGACTC
-+
-67777788888888888888888827776555443222111-...,,-,,+,*****)*)(&('(&'&$""%###"
- at 30BB2AAXX080903:3:46:1195:1334#0
-TCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCCCTCGCCAC
-+
-6777778888888888888888887777655244322210.//.'-,-,,+,+***)*)(()(((('%#"#"#"""
- at 30BB2AAXX080903:3:49:416:31#0
-CATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGATGCCAGC
-+
-67777788888888888888888877776555443222100//..----,+,+*+*)))())((((($#"###""#
- at 30BB2AAXX080903:3:36:1016:1573#0
-GCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTACCTCTACN
-+
-67777788888888888888888877776555443221100//.----,,,,++***()*))((((%'$$#"###"
- at 30BB2AAXX080903:3:37:950:497#0
-GCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTACCAGTCGN
-+
-67777788888888888888888877776555443222100//..---,-++++++)))))))(((%&"%&$"%""
- at 30BB2AAXX080903:3:33:826:1300#0
-TACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACNGCCACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))(((((""$####""
- at 30BB2AAXX080903:3:3:1143:1970#0
-TACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACANCCANNCA
-+
-67777788888888888888888877776555443212.0///..--,,,,*+++))'))%)(%(''$""$$""$#
- at 30BB2AAXX080903:3:40:1183:916#0
-AGAATGGCTGTTACTACGAGGGCGATGTGGCTGATTGAAGAGTATGCAATGAGCGATTTTAGGTCTGTTTGTCGTA
-+
-67777788888888888888882+777765.54022/21///...-,-,,-*+)*(%)))()(''''"$%&$#$##
- at 30BB2AAXX080903:3:40:1184:917#0
-AGACTGGCTGTTACTACGAGGGCTATGTGTCTGATTGAAGAGAATGCAATGAGCGATTGTAGGTCTGCTTGTCTAA
-+
-677*77888888888888888/2877776%/545322210./&.,--',),*+****)#)&)(((&'"$%&&$"#"
- at 30BB2AAXX080903:3:35:1634:300#0
-ACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGAGATCGGANCCTCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&"$$$$##""
- at 30BB2AAXX080903:3:4:676:1466#0
-TGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGTATGCAAAGATCGGAAGAGCGGTCNCGCANAN
-+
-6777778888888883/88.888877376+55,33(22/0//..,,+,&(++*))&))&)('(#((&""%"$""#"
- at 30BB2AAXX080903:3:48:964:534#0
-GACGAGAATGGCTGTTACTACGAGGGGTATGTGGCTGATTGAAGAGTATGCAATGAGAGATTTTTGGGGAGGTTTG
-+
-67777788888888888.02888877+&:/5)34*22%10.#/.--"+',))*)*)*#*''))(&'&"""$"#"#"
- at 30BB2AAXX080903:3:36:1229:1719#0
-CAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCAACCTCTACN
-+
-67777788888888888888888877776555443222100/...---,-+++***))*))(((('#"$$&&#"#"
- at 30BB2AAXX080903:3:1:726:1205#0
-CAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAAAGATCGGAAGANCTNACAA
-+
-677777888888888888888888777765558432220/00/...,,-,,**+')*'*()((('''%""#"$$#"
- at 30BB2AAXX080903:3:48:1339:1623#0
-GTTTGGATGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGTATGGAATGAGCGATTATGCAGTGN
-+
-6777778888888888888/88087877655241332*1&//'..*+,-*+&+**#())(()%)'%'"%"#""##"
- at 30BB2AAXX080903:3:50:670:574#0
-AGGGGGTTTGGATGAGAATGGCTGTTACTACGAGGGCTATGTGGCTGATTGAAGAGGATGCAATGAGCGAGCATAG
-+
-677777888888888888888888/77796551432+1)/0+/..--+,,+(+***&)()%&('(''""""%$#""
- at 30BB2AAXX080903:3:3:677:1857#0
-TTCAGGGGGTTTGGATGAGAATGGCTGGTACCACCAGGGGGAAGGGGCTGGTTGGAGAGGATGGAAAGNGCGNNGT
-+
-67777788888888/88488888877774/*$1-"'121$&%#-%--&$,(&+)'*())((#(##(%""&"$"""#
- at 30BB2AAXX080903:3:53:1563:1983#0
-TCATTGCATACTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCAGATCGGAAGAGCGGCACACCACCA
-+
-677777888888888888888888777765'5,432121/0/...,,,,-*+*)+'**)(((('(('$$%%#%##%
- at 30BB2AAXX080903:3:54:153:385#0
-CCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTCCCACCAGGGGGGTGTGGGTGGCCTTGGCGTGCTGTA
-+
-677777888848888888888888+77-5'5.4$/22'&#,##('),,+)*%#()*)$#('#''###%&#"#""""
- at 30BB2AAXX080903:3:44:475:316#0
-GCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTACTACGAGGGGGATGTGGGTGGTTGGAGGGGGGGCA
-+
-677777888888888888888888777765554432220$,--,),(,,,)$%&*))*(')'#('#'&"&"""#""
- at 30BB2AAXX080903:3:42:992:134#0
-CTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGGACTACGAGGGGGATGTGGGTGGTTGCGGCTCC
-+
-67777788888888888888888877776555442322100/.$%,*',()+++&###'#((&#(##&&#&&###"
- at 30BB2AAXX080903:3:2:618:834#0
-CTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGATCGGAATNCCACACT
-+
-67777788888888888888818877376365)43200101...----,++****)*)(()''(('%""""#%#$#
- at 30BB2AAXX080903:3:4:295:1551#0
-TCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGCNCCACNCN
-+
-6777778888888888888888887727852904351.20//+--*+,),,*+)')()))('(((''%"#$"%"""
- at 30BB2AAXX080903:3:4:1755:405#0
-TGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTAGTACGAGGGGTATAGAGATGNTCACNCN
-+
-67777788888888888888888877736555443222100/...-+&$+*$*$***(&'&'''###%"##$%"$"
- at 30BB2AAXX080903:3:59:991:1691#0
-TGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGTTTTTACGAGGGGGATGTGGGTATGTGACCA
-+
-67777788888888888888888877776555343222/00/...+,#$+($'%***#&##%#('##""&""#$#"
- at 30BB2AAXX080903:3:42:580:215#0
-TTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCCGAAGCTTCACCGGCGCAGTCCTC
-+
-6777778888888888888888887777655544322210///...--,+,++*)*))))))()((''&%%$%"$#
- at 30BB2AAXX080903:3:45:1397:883#0
-CCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCAAGATCGGAGCT
-+
-67777788888888888888888876776555443232200//,.---,,,+++***)))()&('''"$"#$"#""
- at 30BB2AAXX080903:3:38:1423:1370#0
-CACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCATTCCTCTAGCGC
-+
-6777778888888888888888887777655544222/100/./..-,+,+**()*()()(#(((&&""&&#""#"
- at 30BB2AAXX080903:3:53:176:2039#0
-CACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGAGATCTGACTCCCTC
-+
-677777888888888888888888777365558132.2/00...,.--,,++))**(*(%((((''%'%$$$"$#$
- at 30BB2AAXX080903:3:44:227:1032#0
-CGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGGTAGTACGAGGGG
-+
-67777788888888888888888877776555443222100//..,--,,+,++***))))(()&##&"#%"$%#%
- at 30BB2AAXX080903:3:38:1791:835#0
-AGTCCGTGGGCGATTCTGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTGGATGAGAATGGCTGCGATCGCNN
-+
-677777888888888)888888887777655544122210/....---,&,++**))*))))(('('"&$"#"$""
- at 30BB2AAXX080903:3:54:612:516#0
-GTAACAGCCATTCTCAACCAAACCCCCTGAGGCTTCACCGGCGCAGTCAGTCTCATAATCGCCCACGGTAGTCGGA
-+
-6-77578888888888(888888807776-454&32.0.00'/,*-,-,*,++***)*))))(((%%"""&$$$##
- at 30BB2AAXX080903:3:41:493:769#0
-CAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTCACATCCCC
-+
-67777788388888888828888877776555443222100/0--,-,,,+'++)'*(())((((&'&%%$#$""#
- at 30BB2AAXX080903:3:1:1404:845#0
-TAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTTNTANACAT
-+
-67777788888888888888883877776555443221100./.,-,-,,+++**)))'())((('#'""#"%$#"
- at 30BB2AAXX080903:3:55:480:1425#0
-AATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACTGCGCCGGTGAAGCTTCAGGGGGTTCGTAGTA
-+
-67777/888888888888888888-777'55544322210&/...---+-++****)*()((()'('$"##""##"
- at 30BB2AAXX080903:3:42:1284:817#0
-AAACCCCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCT
-+
-67777788888888888888888877776555543221100//-.--,-,+++*+**))))((((('&&%&&%###
- at 30BB2AAXX080903:3:49:1486:1543#0
-CCCTGAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGTCTCTCTG
-+
-67777788888888888888888877776555443.2,10010.-.,-,-++)+*)**))()(((('%"###""""
- at 30BB2AAXX080903:3:38:1054:990#0
-GAAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCCAACTC
-+
-67777788888888888888888877776555443222100///.-.,+-+++*+*)**()))((('$&&#&"$%%
- at 30BB2AAXX080903:3:34:1195:1306#0
-CACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACNCACACTNN
-+
-6777778888888888888888887757655541/220&/1./..,+,++*++***)$)*(((((''"%$%#%#""
- at 30BB2AAXX080903:3:45:785:1387#0
-GTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAATGACAGCGCG
-+
-67777788888888888888888877776552443222100//.-----,+++***)*)))(((((''$$"$$###
- at 30BB2AAXX080903:3:50:236:688#0
-CGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTATGAGAAGTCCCGCTG
-+
-67777788888888888888888877776555443222100//..-----+++**)))))))(((('$#%#$"#""
- at 30BB2AAXX080903:3:47:63:993#0
-CAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACTAGATCGGCCGCCCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((((&%#"$#$"##
- at 30BB2AAXX080903:3:2:230:1581#0
-TGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATCNCTCNNAA
-+
-6777778888888888888888887777635546302220/....---+,++*+**)*)()))('('""%%$""""
- at 30BB2AAXX080903:3:54:328:228#0
-TGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGGGCGATTACGAGCAG
-+
-67777788888888888888888877776555443.22100/...----,+++**))))()))((''"#"%%%#""
- at 30BB2AAXX080903:3:56:739:1440#0
-GACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTAGATCGGTCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++****)*)(((((('&$%##""#"
- at 30BB2AAXX080903:3:34:331:129#0
-TGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTGNTACACANN
-+
-67777788888888888888888877776545443222100././----,+++*+())*))())'&&"""%$##""
- at 30BB2AAXX080903:3:53:330:158#0
-GATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGTATGGTGCG
-+
-67777788888888888888888677776555443221100./-,---,,,++***)*))()((((&"""#"""#"
- at 30BB2AAXX080903:3:45:933:1091#0
-ATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGATGTAAGTCCGAGGTCGG
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))))('(&'$$%"""$$
- at 30BB2AAXX080903:3:57:756:377#0
-CCCACGGACTTACATCCTCATTACTATTCTGCCTAGCAAACTCAAACTACGAACGCACTCACAAGATCGNCAACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()''''$"#""##$
- at 30BB2AAXX080903:3:51:1719:36#0
-AGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGTTTGCTAGGCAGAATAGTAATGAGGGNCAAAACCA
-+
-67777788888888888-888878+777+5554132221*0//..$-,,,(,+)*%))())'((('%"$%%$$$$$
- at 30BB2AAXX080903:3:59:1368:120#0
-ATCCTCATTACTATTCTGCCTAGCAAACTCAAACTACGAACGCACTCACAGTCGCATCATAATCCTCTCTACANNA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('$$%#$#""#
- at 30BB2AAXX080903:3:52:63:581#0
-GTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGCGCATGCTCG
-+
-62777788883888888888888877776555343222100//..--,,+++++*)**)(((((''#&&"%%%$#%
- at 30BB2AAXX080903:3:46:1457:1088#0
-AGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGAGTTCAGATCGGAGGTGTNGTG
-+
-67777788888888888888888877776555443222100//.----+,++++'*(()))((((('"""""""#"
- at 30BB2AAXX080903:3:56:562:1845#0
-AGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTCGTAGTTTGAGGTTCTAC
-+
-67777788888888888888888877776555443222100//...--,,+++***)))))(()('('&"$##"##
- at 30BB2AAXX080903:3:3:1139:105#0
-AAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGACTGTGAGTGCGTTTCNAGACNTN
-+
-67777788888888888888888877776565443222100//..-.--,*++)****))))'('(#$""###"""
- at 30BB2AAXX080903:3:49:348:929#0
-CAAACTACGAACGCACTCACAGTAGCATCATAATCCTCTCTCAAGGACTTCAAAAGAACGGAAGAGCGTGCCGCTG
-+
-67774788888888188882888%7715955544*(-1+0,.%,-.(()+$(***''##((&((#&%&$#"#"#""
- at 30BB2AAXX080903:3:48:1646:1293#0
-AACTACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATCCGTCTCT
-+
-6777778888888888888888887777655541322210/0/..---,,+++****))')))((''&##""#$#$
- at 30BB2AAXX080903:3:59:1452:702#0
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATAGCCACACANCA
-+
-67777788888888888888888877776555443222100//./---,,,+++**)*)))(((((%$$%%%$"#$
- at 30BB2AAXX080903:3:1:1783:1278#0
-CTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCGANCANTAGT
-+
-6777778888888888888888887777655544522210/./..,--,,+++***))))))((''&$"#""""""
- at 30BB2AAXX080903:3:49:1354:407#0
-TGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGATGCCTGCGANA
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))))))((('"%"#$"#""
- at 30BB2AAXX080903:3:51:218:1778#0
-CTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGAGAGGATTATGAGGNTACCTA
-+
-6777778888888888888888887777635546312210-//.,---+-+++***))))(&(((''"""#"##""
- at 30BB2AAXX080903:3:33:747:1400#0
-AGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGGAGAGTTTGAAGTCCTTGAGAGAGGNACATTANN
-+
-67777788888888888858888877736552443202101/'...-+,,+)++*)(**)(()((('""$%##"""
- at 30BB2AAXX080903:3:60:353:1863#0
-ATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATAGCTTTTTGATGACTTCTAGCAGATCANGANN
-+
-67777788888888888888888877276555443222100//.----,,+++***)*)))(((((&'%%$""#""
- at 30BB2AAXX080903:3:43:19:1832#0
-GGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGTCCTTGAGATGCACACCC
-+
-67777788888888888888888877776355443222100//..---,,+,+***))))()(((''""#"$##"#
- at 30BB2AAXX080903:3:2:1733:831#0
-TAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGTTTGAAGGCNATGACAC
-+
-677777888888888888880888177765$0441222100-.-.---',++**)))))'())(((#"""%%$$##
- at 30BB2AAXX080903:3:33:1212:25#0
-GTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGNTCGTCANN
-+
-67777788388888888888888877776555443222000//..---,,,++***())))('('(&""$""$#""
- at 30BB2AAXX080903:3:54:1442:756#0
-AGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGCTATTAGTGGGAGTAGAGAGCGGCCA
-+
-67777788888888888888888877776555443222110//..---,,+,+**+**))))('(''&&#&#"###
- at 30BB2AAXX080903:3:54:456:1969#0
-TAATAGTGGGGGGTAAGGAGAGGTTAGCGAGGCTGGCTAGAAACAATCAAAAAGCTACTAGGGGGAGGAGTGTGTG
-+
-677777.8888888888888/88847776355'432221/&-++*&-*,+*'**))'#)')%#((#(""$"$"#"#
- at 30BB2AAXX080903:3:3:159:219#0
-CTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAAGTCATCAAAAAGTCNCAACNCN
-+
-6777778888888888480888187071:5253430112-0-/,+--,$+)+'+*&#)(#(((((&#&"&$"#"#"
- at 30BB2AAXX080903:3:40:1765:1238#0
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTAACCTACAGGTGCGACT
-+
-67777788888888888888888877776)55443222200//.-,----,,+***)))()(('('%%"$"""##"
- at 30BB2AAXX080903:3:1:220:785#0
-AGCACAGAGAGTTATCCCAGTAGGTTAATAGTGGGGCGTAAGGCGAGGTTAGCGAGGGTTGGCGGCGANTCNCACA
-+
-$371.384828-8%--+)')&)03(.)+)%("1-/+%,$(&%+#,)*($$$'#'#'###########$""#"$"##
- at 30BB2AAXX080903:3:41:747:1782#0
-CTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGCGAGGCTTGCTAGAGGTCATCC
-+
-67777788888888888888888877776555443222100//...-,,,+++*)**))())('(''%"%"#"#"$
- at 30BB2AAXX080903:3:44:1652:35#0
-GATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTAACCTACTGGGAGAACTCTCTGCGTCCGG
-+
-67777788888888888888888877776555143222100./,-+,,+,+)++')')))((((('(&&"""$"""
- at 30BB2AAXX080903:3:8:1217:1635#0
-GACTTCTAGCAAGCCTCGCTAACCCAGACTTACCACCCACTAGTAACCTACTGGGAGAACTCTCTGCNCTACATNN
-+
-677777488882888&888*8888&'7&6)6244*2020/&'+.,,-,+*++++*))&)(')(('('""#"%$"""
- at 30BB2AAXX080903:3:50:547:240#0
-GGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGGAAGGCGAGGGTAGCGAGGCTTATGTCACAT
-+
-67777788888888888888888877776550443222000//..---,,+++**'&))))'((&&'""#"##$#"
- at 30BB2AAXX080903:3:36:86:1966#0
-GAGAACGTGGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGGCGAGGTTAGATACTAGNN
-+
-677777888888888888888888777765554130321/0//./-,-,,+++)***)))((('((&$"""##"""
- at 30BB2AAXX080903:3:36:1555:1366#0
-ATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGTTCTCCCAGTAGGTTAATAGTGGGGGGTAAGACAATACNN
-+
-67777788888888888888888877776555443222100./..,--,,+++***))**)((&(''%$"##"#""
- at 30BB2AAXX080903:3:53:812:2016#0
-ACCCCCCACTATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAGATCGGACGAGCTTA
-+
-67777788888888888888888877776535443221110//.+.-,,,+++****))())((#('"$#""#""#
- at 30BB2AAXX080903:3:43:619:203#0
-ACCCACTATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTT
-+
-67777788888888888888888877776555443222100//..-,,-,+++*****))))((((''&&&&%%$%
- at 30BB2AAXX080903:3:33:902:1486#0
-TATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTANACCCTGNN
-+
-6777778888888888888888887777655544322210//+...-,,,,,++*+)*)*))()('(""#$$""""
- at 30BB2AAXX080903:3:56:354:1212#0
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGCCTCTA
-+
-67777788888888888888888877776555443222100//-.--,,,-+++****)*)))(((''&%"$$#"#
- at 30BB2AAXX080903:3:53:801:363#0
-AGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGTTCTCCCA
-+
-67077788888888888888888877776555443222100//..---,,++++***))))))(('''$#%&%$##
- at 30BB2AAXX080903:3:43:350:266#0
-TGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCACAGAGAGG
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()((''&%&%%%%#"
- at 30BB2AAXX080903:3:56:1089:1123#0
-GCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTACTAGCGCATCAG
-+
-6727778.8888888888888888787165554&3022100/../---'--+****()%))')(&''&%"##"#""
- at 30BB2AAXX080903:3:57:349:761#0
-GCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTAGATCGGAAACTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++*+*)))))(()'(''&&#"###"
- at 30BB2AAXX080903:3:44:1591:255#0
-TGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGCCCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+,+**+)))))()((('&&"%#%$""
- at 30BB2AAXX080903:3:36:480:565#0
-TAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGGTTCTTCGCACN
-+
-67777788888888888888888877776555443220100///.----,,++++*))))(((('''$"#$$%"#"
- at 30BB2AAXX080903:3:39:226:1400#0
-CTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGNCCTATACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"&#&%##$#
- at 30BB2AAXX080903:3:45:1561:1406#0
-AGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAACGTGAGATTCGC
-+
-677777888888888888888888777765054(322,1000/..---,,+++*+*)*)))((((''%#$#"""""
- at 30BB2AAXX080903:3:59:437:1417#0
-TAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGCCCTCAACNC
-+
-67777788888888888888888877776555443222100/...-,+,,,+++***)*))()(((%'$&$"##"#
- at 30BB2AAXX080903:3:3:168:1152#0
-AGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGAGAANCGCANCA
-+
-67777788888888888888888877776555443222100/....--,,++++**)))*)(((('(""#"##""#
- at 30BB2AAXX080903:3:47:459:1772#0
-TAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGGCTGGCGAGG
-+
-677.77888828888888888)877717654540322210-*...*--,,++'*(*(()))((('''""""##"""
- at 30BB2AAXX080903:3:53:238:1269#0
-ATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTTGATCAGTCGACAT
-+
-67777788888888888888888877736555443222/0///...-,,,+)++**))()))((((%"$""""##"
- at 30BB2AAXX080903:3:50:1375:1575#0
-TAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGATATTCGCTCAGAC
-+
-67777788888888888888888877776555443222100//.-----,++++**))))((()(('$"$"#""""
- at 30BB2AAXX080903:3:37:474:1232#0
-TGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGAGAGTGTCACTN
-+
-67777788888888888888888377776555443220100//..---,,+++*****)))((('(#"$%"###""
- at 30BB2AAXX080903:3:55:748:664#0
-ATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGTAAGTAGGANGGTGCT
-+
-67777788888888888888888877776555443222100//.----,,++++**)))))))((('&""""""#"
- at 30BB2AAXX080903:3:39:939:1279#0
-CTACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATCGTGCATCG
-+
-677777888888888888888888777765554432220000/./--,,,++++*)***))))((''"#""$""#"
- at 30BB2AAXX080903:3:52:153:1296#0
-GAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCATGTACGA
-+
-6777778888888888888888887177655544322200.//..---,,+++)*))(())(((''%$""&"%""#
- at 30BB2AAXX080903:3:59:234:456#0
-GAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTGAGTCCTGAANNC
-+
-6777778888888888888888887777655544322200///..---,,-++**)))))))((('('%&"##"""
- at 30BB2AAXX080903:3:53:1222:1551#0
-GTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGGGACTAGTATGTTGAGTCCTGCAG
-+
-67777788888888888888888877776555443222100//..---,,++%**))*)))(((''#""$#%$#$$
- at 30BB2AAXX080903:3:38:510:962#0
-GGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTAGTATGTTAGACGAGGAC
-+
-67777788888888888888888877776555443.22100//..---,,*,+**))*)))()(((("'##%$$%$
- at 30BB2AAXX080903:3:33:1222:1852#0
-TCAACATACTAGTCACAGCACTATACTCCCTCTACATATTTATCACACCACAATGGGGCGCACTCACNCCCACTNN
-+
-6777478888888888881)888877776555442222100/)/-.-+,,,++*)+**)(''(((('"%%##%"""
- at 30BB2AAXX080903:3:33:308:1592#0
-CAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCAAGNCTCAACNN
-+
-67777788888888888888818877776555143212100.//-.--,,,,+**))**)()(((&'"$#$"#$""
- at 30BB2AAXX080903:3:36:803:2042#0
-CAACATACTAGTCACAGACGTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCGTCACGANN
-+
-67777788888888888,&*888''7//6.554/222200.+,/,.-,,,,*)***'#(%(#'(''&""$#$"#""
- at 30BB2AAXX080903:3:41:1699:869#0
-AACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACTTACTTA
-+
-677777888888888888088888777765554432221000/..---,,+++****)*)))(((('&$""%%$$#
- at 30BB2AAXX080903:3:57:1492:735#0
-TAATGTGGTGGGTGAGGGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGGTGTGACACATTACTG
-+
-67777488888888888888888877774544443212000//.,---,,+)+*)*'*))')('((#$$#$"$#""
- at 30BB2AAXX080903:3:39:791:1811#0
-TTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACTTGCTGCC
-+
-67777788888888888888888877776555443222000/...---+,+++***)*)))'(('(&%$"&"%"##
- at 30BB2AAXX080903:3:60:1231:838#0
-TTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTGACCGCTACNN
-+
-67777788838888888888888877776555443222100//..---,,++**+*)))))((('''""##"##""
- at 30BB2AAXX080903:3:33:829:34#0
-ATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCNACTCGCNN
-+
-67777788888888888888888877776555443222100...---,+,*++*****))))(((('""#""""""
- at 30BB2AAXX080903:3:3:1202:1782#0
-ATACTAGTCACAGCCCTATACTCCCTCTACAAATTTACCACAACACAATGGGGCTCACTCACCCACCANCTTNNCA
-+
-67777788888888888888888877776550343222.00//..--,,,,+++****)))((((('&"%&%""#%
- at 30BB2AAXX080903:3:4:1311:1186#0
-TGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTATAGGGCTGTANCTCANTN
-+
-67777788888888888888888877776552443222101/-.---++,*,+***#))'))(##(#$"$%##"""
- at 30BB2AAXX080903:3:39:327:706#0
-CTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACAGTAACCACA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))))((('$$&#$$###
- at 30BB2AAXX080903:3:36:833:1796#0
-TAGTCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATCAACTCANN
-+
-67777788888888808888+888767765/54$32220.0//.,---,-+*+**))()))()((''&$&&$%#""
- at 30BB2AAXX080903:3:8:1122:365#0
-TCACAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAANACCACANN
-+
-677777888888888888888888777765554432221/0//..-.-+-+++*****)(*)()(('"#$#$%$""
- at 30BB2AAXX080903:3:60:1423:1485#0
-GTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATATGTAGAGGGAGTAACCAACCNN
-+
-677777888888888888888888777765553333,2100//..,---,+*+****)*')()'(&%$%%&%$%""
- at 30BB2AAXX080903:3:1:1551:1891#0
-CAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCAGATCGGAAGANCTNCTNC
-+
-6777778888888888888888887777655544321.//....--+,+,++++**)))'(((''''&"%$"##""
- at 30BB2AAXX080903:3:45:359:1834#0
-CAGCCCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATCAACCC
-+
-67777788888888888888888877776555443222100//..---,,++++****))))((((''%&"&$#$$
- at 30BB2AAXX080903:3:42:1717:1361#0
-GTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGGAAATATGTAAGGTGGGG
-+
-677777888888888888888888777765554432-2001/..-.+,-,++++*%))#&(('((('&%&#%"#""
- at 30BB2AAXX080903:3:46:1735:575#0
-CTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAGATCGGTAGAGTGGT
-+
-67717788888888888888888877776/554/11211001....---,++++**)*)()))((('$$%"""#""
- at 30BB2AAXX080903:3:38:782:728#0
-CGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAAATAGCTAGATCA
-+
-6777778888888888888888887777655544322*100//..---,,,+++***))))(()(('""$#"""##
- at 30BB2AAXX080903:3:51:817:250#0
-CCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCAATCACACGA
-+
-67777788888888888888888877776555443222100//.--,-,,,+++*+)*))))()(('""$#%#$$"
- at 30BB2AAXX080903:3:59:808:886#0
-TTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCCATTGTGTTGTGGTAACTCACAGA
-+
-67777788888888888888888877776555443222100./-..--,,+,+***)*)))))('(''"%"&$""#
- at 30BB2AAXX080903:3:42:184:622#0
-CATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((('&'$%&#"%##
- at 30BB2AAXX080903:3:48:1490:1015#0
-ATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGCTAGCACT
-+
-67777788888888888888888877776555443222100//..----,+++*+*))*)))(((''&$"""####
- at 30BB2AAXX080903:3:45:831:918#0
-TACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAGACACGAG
-+
-6777778888888888888888887777655546322210///..--,,,+,++****))*()((('$""#"""""
- at 30BB2AAXX080903:3:42:1771:292#0
-ACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAGATCGGCAGANCGC
-+
-6777778888888888888888887777655544322210///..---,,++****)))))((((('$$%&#""##
- at 30BB2AAXX080903:3:3:858:138#0
-AACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCCCTCNCTCTNCN
-+
-6777778888888888.838888867776556343222100//..,---,+++**&*')((((####%"%"$#"#"
- at 30BB2AAXX080903:3:47:631:253#0
-GAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTGAGCAGATCANAACG
-+
-67777788888888888888888877776555443222100//..---,-+++***))))(((((('$%$""""$#
- at 30BB2AAXX080903:3:42:423:1325#0
-TGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTGAGTAGATCCGAGGACAC
-+
-67777788888888888888888877776545443222200//..---,,++++**)()()(((('#"$"""""#"
- at 30BB2AAXX080903:3:33:1774:178#0
-CAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCANGCACATNN
-+
-67777788888888888888888877776555443222100//...--,,++++*))())))(((''""%$%##""
- at 30BB2AAXX080903:3:57:750:514#0
-ATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCCTACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))(((&&'%$$##$%
- at 30BB2AAXX080903:3:48:660:1679#0
-TGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTATCCACACC
-+
-677777888888888888888888777765554432-020///..----,+++***))(((((((''"#"#%$"$"
- at 30BB2AAXX080903:3:57:786:385#0
-AGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGAGATCGGNACCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(()(((('&"#####"
- at 30BB2AAXX080903:3:4:1110:1612#0
-GGATAGGTGCATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGTNCATANCN
-+
-67777788888888888888888,77776555443222/101/.-+*,,+,++++)*))))()(#''$"#"##"#"
- at 30BB2AAXX080903:3:43:1689:1994#0
-GGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGGTGGGTCTCAT
-+
-67777788888888888888888872776552443321100//-.--,-,+++******('))((('&%###"##"
- at 30BB2AAXX080903:3:38:838:1674#0
-ATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAAGATCGGACTNAC
-+
-6777778888888888888888887777+545442222100//..---,,,+++**)*)))((((('$"%&&$"##
- at 30BB2AAXX080903:3:50:1683:1312#0
-ATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTTGTTAATGTGTCGCTGCC
-+
-67777788888888888888888877776555443202100/...---,,)++***)))))((((''&"#"##"##
- at 30BB2AAXX080903:3:40:570:1949#0
-ACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCC
-+
-67777788888888888888888877776555443222100//..--,,,,++**)*)**)()(((&%%&%&$##"
- at 30BB2AAXX080903:3:53:337:1886#0
-ACAACATAAAACCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCGCTCTAC
-+
-67777788888888888888888877776555443222100//..---,,,++*****))))((((''$"%#%""#
- at 30BB2AAXX080903:3:36:893:750#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTACGAACATGAGGGTGTTTTCTCGTGAGATCGGAATCTGCTAACN
-+
-+77777888888888888888888277765554,3122100//..'-,,,,*+**)))))())((&#%%"""#"""
- at 30BB2AAXX080903:3:40:1329:250#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGGTTTTATGTT
-+
-67777788888888888888888877776355443222100//...-,,,+++***)))))((('(&&%&&&&&##
- at 30BB2AAXX080903:3:4:1367:448#0
-TGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTAGATCGGAAGAGCGGTTCGNCACANTN
-+
-67777788888888888/8888883777635544352.000///.+-,,,+++)**)))))#((#%&""##%#"""
- at 30BB2AAXX080903:3:39:1091:189#0
-TTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATGAGGTTTTTATAA
-+
-67777788888888888888888877776505443222100/0..-,-,-,++***()()(())(((""$&#%"""
- at 30BB2AAXX080903:3:59:1374:1579#0
-GGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGAATCACCACNAC
-+
-67777788888888888888888877776555443222100//..---,,&++***))*))()((('"%"%$$"##
- at 30BB2AAXX080903:3:57:1373:1568#0
-ATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTAGATGGGAAGAGACTACA
-+
-+723178883888888+8218&88/7(0665345-21/.-0..--++#),+'*+*&(&#&#'#''##'"$$$$##"
- at 30BB2AAXX080903:3:37:1315:668#0
-TCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAGATCGCTCCTCN
-+
-677777888888888888888888777765554432221/0//..--,,-++++*)*()*)()'('%$"""$#"$"
- at 30BB2AAXX080903:3:2:1048:1326#0
-CATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCNCCCAGCT
-+
-677777888888888888888888377765554432221000/.-.+,,-,++***)*)())((('''""$##"#"
- at 30BB2AAXX080903:3:37:1198:887#0
-CATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCAGCNCTNGN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((("$$"%%"""
- at 30BB2AAXX080903:3:56:326:737#0
-ATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGAGCCCGAC
-+
-67777788888888888888888877746555443222100//-----,,++*****))*)()(((''$""$$"$#
- at 30BB2AAXX080903:3:43:606:985#0
-AATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGAGGGTGTTTTCTCGTGTGGGG
-+
-6777778888888888888888887777655544322220///...-,,,-++**))))&)%()(#'$%"&#$"""
- at 30BB2AAXX080903:3:40:660:615#0
-GAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATAGACGCCTCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)**))((((''''$"%""##
- at 30BB2AAXX080903:3:33:673:1967#0
-AACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAGATGGGAAGNATCTACNN
-+
-6772478-8888888888888888-77765/54,32(2+-0//...+(,,,'+$*))()&'#('%#'""##"$$""
- at 30BB2AAXX080903:3:2:394:930#0
-GAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCATTATNTCGNGAT
-+
-67777788888888888888888877776555443222100//..--,-,,,+****))))()((('"""&&"#"#
- at 30BB2AAXX080903:3:41:310:1955#0
-GAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAGATCGGTAGAGCAGT
-+
-677777888888288888868888777165514432/2100./..---,+,++*)*))))()()&(("&%###""#
- at 30BB2AAXX080903:3:44:953:144#0
-AACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCAAGATCGGTAGCGCCC
-+
-67777788888888888888888877776555443222100//..-.-,,+++**)))*)(()(('''""#$"#"#
- at 30BB2AAXX080903:3:1:278:1520#0
-GAGGAAAACCCGGCAATGATGTCGGGGTTGAGGGATAGGCGGAGAATGGGGGATAGGTGTATGACCCTNCANATCG
-+
-6777778888888218885-8788777165,544(,,20#0/,--,&---+,)*&+)&*('(((###"""%"$"#"
- at 30BB2AAXX080903:3:59:59:1733#0
-GAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTGTATGAACATGGTAGNNC
-+
-67777788888888888888888877776555443222100/..-,--,,+++++*))))))(((''&$%"""""$
- at 30BB2AAXX080903:3:1:1325:630#0
-AGAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGGGTATGAGACNGCNTGTA
-+
-67777788888888883886888877770551443/1010.//-.--,,,+,+**)*(#)'''('('$""""#"""
- at 30BB2AAXX080903:3:49:1641:854#0
-CTATATTTACAAGAGGAAAACCCGGTAATGATGTCGGGGTTGAGGGATAGGAGGAGAATGGGGGATAGGTCATACC
-+
-67777748808888888888.888777765554232221-0//..--,,,+++*+***)))((('''%#"$#"###
- at 30BB2AAXX080903:3:37:1505:44#0
-CTATCCCTCAACCCCGACATCATTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGTGTNCTANN
-+
-67777788888888888888888877776502843212200.,.--,++-+,+*****)())('((#"$&"$#"""
- at 30BB2AAXX080903:3:57:1111:991#0
-AGCCTCTGTTGTCAGATTCACAATCTGATGTTTTGGTTAAACTATATTTACAAGAGGAAAACCCGGTACTACATAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))())''(&#""##"##
- at 30BB2AAXX080903:3:2:1471:124#0
-TATAGTTTAACCAAAACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGANATACTCC
-+
-6777778888888888888/888877476550443322200/..,--,,,+))*'))))*((('(('%"""#%"##
- at 30BB2AAXX080903:3:50:237:649#0
-AAACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCAGATCGGCCGCGCAC
-+
-67777788888888888888888877776555443222110//..---,-+++*+)*)))(((((('"##"""###
- at 30BB2AAXX080903:3:2:452:1277#0
-AACATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACNTCCACAC
-+
-677777888888888888888888777765554432320010..-.---,+++**))))))))(('''""##%$#%
- at 30BB2AAXX080903:3:2:453:1275#0
-AACATCAGATTGTGACTCTGACAACAGAGGCTTACGACACCTTATTTACCGAGAAAGCTCACACGAACNGCCACAC
-+
-67777788888888888)88588%$'7265$(4$"21,$0/%/,%--&,,+)****)*()((((((&&""$$%$$$
- at 30BB2AAXX080903:3:41:570:1324#0
-ATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGTTGTCATAGTACC
-+
-677777888888888888888888774765554432221*/....,--,,*++***)(()())(((''&##"%"#"
- at 30BB2AAXX080903:3:49:82:451#0
-CATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTAGATACGTAGACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$#""$"#"
- at 30BB2AAXX080903:3:41:1708:798#0
-AGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGTGCNGNCAT
-+
-67777788888888888888888877776555443222100//...---,+++*)))*)()(((((&'%$"$"##$
- at 30BB2AAXX080903:3:46:1650:1344#0
-AGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTAAGCCTCTGNTGGNGTCG
-+
-67777788888888888888888877776555443222000//+..--,,,++*&))))))(((%''"%%""""#"
- at 30BB2AAXX080903:3:59:195:1028#0
-GTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATACGGGGTCGTAAGCCTCTNTTANNC
-+
-67777788888888888808888876776545443222100//..-+,+,,,%***)'))(('(''''$""&#""#
- at 30BB2AAXX080903:3:49:184:1766#0
-GACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCAGGACATAAC
-+
-67777788888888888818,38877776445443222/00//.----,,++++*)*)**))&('''"$"#"""##
- at 30BB2AAXX080903:3:58:701:1013#0
-CATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGAGCTTTCTCGGTAAATAAGGGGTCGTATGTCTACT
-+
-677777888888+88888888888777765554432221000/-.--,,,++*******)))((%(''"%"$"###
- at 30BB2AAXX080903:3:50:1244:1771#0
-AGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTAACNTACACG
-+
-67777788888888888888888877776555443222100//...-,,-+++**)*)**))(((('"$""$##""
- at 30BB2AAXX080903:3:60:1576:1366#0
-AGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTCAACATCANN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))*((((''&$$%"%%""
- at 30BB2AAXX080903:3:8:747:1374#0
-ACGACCCCTTATTTACCGAGAAAGCACACAAGAACTGCTAACTCATGCCCCCATGTCTAACAACATGNCAGACCNN
-+
-6777778888888,888888,8887'7746554432221/0./.---,+,,*++*')**)))(((''"$""$##""
- at 30BB2AAXX080903:3:50:918:222#0
-AGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTAGTGAGCTTAGATCGGAAGACCCCGCN
-+
-67777788888888888888888877776555452222000/...'--,*++++*(**)))))((''$$#"$#"#"
- at 30BB2AAXX080903:3:34:161:1201#0
-TGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTGNCGAGCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((''&"$"#"$#""
- at 30BB2AAXX080903:3:39:844:901#0
-AGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAAAGATCGGAAGAGCGGCTCTCA
-+
-67777788888888888888888877776555443232100//..---,,,++**+))))))((('('""""""#"
- at 30BB2AAXX080903:3:40:503:373#0
-TGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCAGTTCTTGTCA
-+
-67777788888888888888888877776555443222000//..---,,,++***))))())((('"$&&$%$##
- at 30BB2AAXX080903:3:54:1196:1685#0
-ATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGATATCGGAAGAGTGTGCCACCA
-+
-67777788888888888888888877776555443202100//..--,-,+++**(*)())')(((#&###"$##%
- at 30BB2AAXX080903:3:41:982:1276#0
-CCAATGGATAGCCGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTTAGCGTGTCTT
-+
-67777784888388888888888877776555443222010/,....-,,,++*****))()()('''&$$"%"$#
- at 30BB2AAXX080903:3:49:445:302#0
-GACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGCATGAGTCACCCACCA
-+
-67777788888888888888888877776555443222100//.'.-+,+++++**))))(((('''&&##$##""
- at 30BB2AAXX080903:3:38:834:905#0
-GCTAACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATACATTCTCGA
-+
-67777788888888888888888877776555443222121....--,,,+++**)))*)))(((('""%""#"""
- at 30BB2AAXX080903:3:46:491:111#0
-GGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGTTGTTAGACATGGGGGTGTCCCGG
-+
-677777888888888888888888777765554432221/0//..---,++++**(*)*)(()((('&""""""##
- at 30BB2AAXX080903:3:40:1201:108#0
-ACTCATGCCCCCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTAGATCGCT
-+
-67777788888888888888888877776)553411200/0//-/,----++***(*(((''(&&''&""$%%""#
- at 30BB2AAXX080903:3:36:1218:1219#0
-TTTTGGGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGAAAGCCATGAGATCGGAAGCGGCTATTN
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))(((('$$#"#$#$"
- at 30BB2AAXX080903:3:55:1072:436#0
-TATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAGCTGTTATCCTTTAAAAGTTGAGGTACGCC
-+
-67777788888888888888888877776555443222100//-.---,,,++**))*)')((((('&$""##"##
- at 30BB2AAXX080903:3:59:507:435#0
-AAAGGATAACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAANCTTANC
-+
-67777788888888888888888877776555443222100//...--,,+++****)*))(((''''&"&""""#
- at 30BB2AAXX080903:3:54:1589:1065#0
-GTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAACACATAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$$&%"#"""
- at 30BB2AAXX080903:3:50:1451:838#0
-TAACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCTCACTGC
-+
-67777788888888888.888888777765554432221-0//..---,,+++**+)**))((((''%""####"#
- at 30BB2AAXX080903:3:43:893:49#0
-TAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGGATAGCTGT
-+
-67777788888888888888888877776555443222100//..--,,-+++***))*))()((((&%%"$"#$%
- at 30BB2AAXX080903:3:43:912:716#0
-GGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGGGGCCTAAGACCAATGG
-+
-67777788888888888888888&77)76555443222100/&..---,,+++***)*)))((('''$&$&&%%$%
- at 30BB2AAXX080903:3:57:345:1863#0
-AGTCAGGGTTAGGGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTTGTCTC
-+
-6777778888888888888888887777655544322210///..---,,+++***)*))()()(('&$%"$##"#
- at 30BB2AAXX080903:3:41:1343:639#0
-AAGTCAGGGTTAGGGTGGTTATAGTAGTGTGCATGGTTATTACTTTTATTTGGAGTTGCACCAAAATTTTTGTTTA
-+
-677777888888888888888888777560554432,2100/..,--,,,++++*)**(()()((''&'%%#""""
- at 30BB2AAXX080903:3:59:972:1782#0
-CAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAACCACCAGATCGGAAGACTTCAT
-+
-6777778888888888888888887777655244322-100././----,,+++*)*))*)))'(('%"&%""#$"
- at 30BB2AAXX080903:3:53:1343:486#0
-TGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGTTATAGTAGTGTGAGATCGGAAGAGCGGTTGTCG
-+
-677777888888888888888888777765554432221/0//..---,-+++***)*)))()('(&"$%""""#"
- at 30BB2AAXX080903:3:44:410:1284#0
-AATAAAAGTAATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTAAGATC
-+
-67777788888888888888888877776555443222100/...---,,+++**))))))))('('$'&$&%$$$
- at 30BB2AAXX080903:3:36:1505:1842#0
-CGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGTTATAGTAGTGTAGATCGGATCATGTNN
-+
-677777888888888888888888777765554432221200/..---,,,++***)()()))('(#$$%###"""
- at 30BB2AAXX080903:3:56:386:791#0
-AATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCNTCAGAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))((((('&"$"&$#"$#
- at 30BB2AAXX080903:3:58:1573:687#0
-AATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACACACAATACN
-+
-67777788888888888888888877776555443222100/...----,,++****))))(((((&$$$##"##"
- at 30BB2AAXX080903:3:45:1097:1675#0
-TAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTCACCCC
-+
-67777*8888888$88888888887-776521,4121/1$0/.//,.+++,*+*)))(()(%(#'''&&##"$"#"
- at 30BB2AAXX080903:3:3:573:950#0
-CATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTCNCCCANCA
-+
-677777888888888882288838777844553432(.0/.//--$-++,+*')*)()))&'(('''""""#""##
- at 30BB2AAXX080903:3:54:441:1322#0
-TTTGTTAGGGTTAACGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGGGTTAGGGTGGGTATATCAGGCTCT
-+
-677777888888888888888888777765554432/1100//..---,-+++)*))))')(%((''"$##$#%""
- at 30BB2AAXX080903:3:57:856:1914#0
-AATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGATGGGGGGAATTAGGGAAGTCAGTGGCGC
-+
-67777788888888888888888877776555443322100/0..---,,+++**(*))))))((''&&&$%"###
- at 30BB2AAXX080903:3:35:207:658#0
-TGCGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGNCACCAAAN
-+
-67777788888888888888888877774555443222100//..---,+++++*))))))()(('&"$##$""""
- at 30BB2AAXX080903:3:3:115:38#0
-TGAGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGGTGGTAAGGANAGACNGN
-+
-6..77-888888888188588686771;)4304422/200./..-.,++++++$*)()&%()'((''""%"##"""
- at 30BB2AAXX080903:3:41:626:1894#0
-TCCTTACCACCCTCGTTAACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTT
-+
-67777788888888888888888877776555440222100/....---,+,+*+*)))))((((('&$%&"##"#
- at 30BB2AAXX080903:3:53:533:390#0
-TAAAGGTGGATGCGACAATGGATTTTACATAATGGGGGTATGAGTTTTTTTTGTTAGGGTTAACGAGGTCGGTTGT
-+
-67777788888888888888888877776565443222&00/..----,,+++***)))#)))%(('%#$"#""""
- at 30BB2AAXX080903:3:47:456:1708#0
-AGAGACTGATAATAAAGGTGGATGCGACAATGGATTTTACATAATGGGGGGATGAGTTTTTTTTGTTNTATATCAT
-+
-(710'-85)8+-8$2,8848833+''%-)+514&(,)-.%&',(,,"'+,$((*#)&'((#(&''%%""$"#""""
- at 30BB2AAXX080903:3:57:130:1479#0
-ACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTCCAC
-+
-67777788888888888888888877776555443222110//..---,-+++***)))))))((('&%&%%####
- at 30BB2AAXX080903:3:35:1380:1969#0
-GTTGTGGGGAAGAGACTGATAATAAAGGTGGATGCGACAATGGATTTTACATAATGAGATCGGAAGANCANAACTN
-+
-67777788888888888888888877776555442222100//..---,-+,++**))))(((((('"&#"%%##"
- at 30BB2AAXX080903:3:56:767:1423#0
-AAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACACCATCAC
-+
-67777788888888888888888877776555443222100//./---,,+,+****)))))((''''"##$##""
- at 30BB2AAXX080903:3:38:1111:615#0
-CCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGTCTTGT
-+
-677777888188888888888-8877776555443222100//------,+++****)*)))((('&"%&#%#$$#
- at 30BB2AAXX080903:3:42:1284:673#0
-TTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTGGATCTT
-+
-67777788888888888888888877776555443222100//..---,-++++*****)))((((''&"####$"
- at 30BB2AAXX080903:3:2:1763:678#0
-CCATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACAGATCGNATCACAT
-+
-67777788888888888888888877776555443322100//..---,-+,++*)**)))(((((&&"#"%%#""
- at 30BB2AAXX080903:3:36:1034:1688#0
-ATTGTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGCAACTGCAN
-+
-67777788888888888888888877776555443222100//..---,,+++++*)))))))((('%##$#"$#"
- at 30BB2AAXX080903:3:56:1118:184#0
-CGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGAGACTGATAATAAAGGTGGAGNGNCAC
-+
-67777788888888888888888877776555443222100//..-.-,,+++***))*))((((%'$"""%"$#"
- at 30BB2AAXX080903:3:42:1265:207#0
-GTCGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCGATA
-+
-677777888888888888888888777765554432121000/..----,+++***)*)))()('(''$$$$"#"$
- at 30BB2AAXX080903:3:48:1064:359#0
-CGCATCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATGTCGCAC
-+
-67777788888888888888888877776555443222100//..-&-,,+,+***))))))(('('%"#$%%"##
- at 30BB2AAXX080903:3:39:1086:869#0
-CCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACCCAC
-+
-67777788888888888888888877776555443222100//..--,+,+++***)*)))))(('''&%%$$"""
- at 30BB2AAXX080903:3:58:396:950#0
-TCAGTGTCAGTTCGAGATAATAACTTCTTGGGCTAGGCACATGAATATTGTGGTGAGAACGGTAGAGCGGCGTCCA
-+
-64777788888888888888888%7775655$4432221.&0/.,-(-,,+&+$*#*()))(&((('&'"%""###
- at 30BB2AAXX080903:3:59:792:622#0
-GGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGAGACTCTNACTC
-+
-67777788848888888888888877776555443222100//..---,,+++***)))))))(('(&&$""#""$
- at 30BB2AAXX080903:3:34:268:463#0
-GTGGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCACATGAATATTGTTGTGGGGAAGANCCTACTNN
-+
-67777788888888888888888877776555443222100//...--,,+++***))*))((((('"$#""%#""
- at 30BB2AAXX080903:3:44:1220:131#0
-TATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGCTATTATCTCGAACTAGATCGGCGGCGCA
-+
-67777788388888888888888877776555443522100//..--#,,,**+*)*)()(((((''&'""###""
- at 30BB2AAXX080903:3:42:340:1799#0
-TTGTGGCTCAGTGTCCGTTCGAGGTAATAACTTCTTTGTCTAGGGACAAGAATAGATCGGAAGGGCGGTGCGTGCG
-+
-677277888888881#8&8/888*774-65/54/32(20//'/.,+"&',)+**))'$)(#%(%'#'$%&#%$$$#
- at 30BB2AAXX080903:3:33:244:2025#0
-AGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGNCCCACGNN
-+
-6717778888888888888888887777655544321100////.---,,+,+**)))))()(((''"%$#%#"""
- at 30BB2AAXX080903:3:4:520:517#0
-CCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCCNCCACNCN
-+
-67777788888888888888888877776555443222100//..---,,,+++***)))((((((&$"$"$$"""
- at 30BB2AAXX080903:3:43:940:1061#0
-CACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAACCACGCCG
-+
-67777788888888888888888877776555443222100//..---,-+++****)*)*(((((''$##&"$$$
- at 30BB2AAXX080903:3:33:1680:830#0
-ACAACAATATTCAGGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAANACTCACNN
-+
-6777778888888,888888888877776555443222100//..---,,+++****)))))(('(&"$&"###""
- at 30BB2AAXX080903:3:8:1390:1666#0
-TATTCATGTGCCTAGACCAAGAAGTTATGATCTCGAACTGACACTGAGCCACAACCCAAACAACCCANCACTATNN
-+
-6777778888888888888888887777'555443322100/...----,,++++***()))((((("$"%"""""
- at 30BB2AAXX080903:3:47:1198:1436#0
-TTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTCAGTGTCAGTTCGAGATAATAACTTCTTGGTCTAGGCGTGGTAT
-+
-67777788888888888888888877776555443222100/.-..-,+,+++***))))))(((''"$"""""$"
- at 30BB2AAXX080903:3:35:1356:1919#0
-AGACCAAGAAGTTATTATCTCGAACTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCNCACCTCCN
-+
-6777-788888888888888888877776555443222100./.,---,,+++***))))(()(((("""$#"$#"
- at 30BB2AAXX080903:3:59:1381:1438#0
-TAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTGGGTGTCAGCTTGGGATTATTGCGTCAACANCC
-+
-67727788888888888888888873$76$55443222//0*,&'-*,++++%***#()(#(&(%#&&%%$$#"##
- at 30BB2AAXX080903:3:39:1137:1634#0
-GAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTAGATCGGAAGAGGTGTCTGGCA
-+
-67777788888888888888888877776555443222100//..---,,+++****(())%(((''%&%%%$$#"
- at 30BB2AAXX080903:3:46:1252:1032#0
-TATGGAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTTGTTTGGGTTGTGGCTCAGTGTCAGATCGTGCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&"&$#"$#"#
- at 30BB2AAXX080903:3:47:1654:1609#0
-CTCGAACTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACAGATCGGACNGAGAG
-+
-67777788888888888888888877776555443222100///..--,--*****()))()(((('%%"""""#"
- at 30BB2AAXX080903:3:44:349:1047#0
-GACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCAAGATCGGCACAGA
-+
-67777788888888888888888877776555443222000//..---,,+++***))))))(('(&&$&#$"#"#
- at 30BB2AAXX080903:3:2:818:142#0
-CACTGAGCCACAACCCAAACAACCCAGATCTCCCTAAGCTTCAAACTAGACTACTTATACATAGATACNCGCACAC
-+
-6737778888888&188-028888731-6555(43/%,&&1-*.)'-,,,%*+)*)(*%'()((((#""""#$$"#
- at 30BB2AAXX080903:3:46:1779:114#0
-CGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTCTAGTTTGAAGCTTAGGGAGAGCTGGGTATCGCACAT
-+
-67777788888888888888888877776555443222100//..--,,,,+++**)))))(((('#"#$#$#"#"
- at 30BB2AAXX080903:3:35:1291:647#0
-TGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTCTAGTTTGAAGCTNATTCACCN
-+
-67777788888888888888888877776555443222100//..----,-+++**)))))()(((&"&%"#%##"
- at 30BB2AAXX080903:3:36:1072:1854#0
-TATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGGAGAAGTAGTTGAGTTTGAAGAGTAGTCNN
-+
-67777788888888888288838877676555443(22100//..---,,-+)+*&'())))(((&'""""""$""
- at 30BB2AAXX080903:3:49:202:1420#0
-TATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGAGATGGTCCAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"%#"""#$"
- at 30BB2AAXX080903:3:59:395:1706#0
-TTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAGGGATGAATATTATGTGTCTNNC
-+
-67777788888888888888888877776555443222100//..---,-+++***)*)))((('(&$$&$#$""#
- at 30BB2AAXX080903:3:35:379:256#0
-TCCATAATATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTAGATCGGANCTACTTNN
-+
-67775788888888888884888277776355$)-'2210)+&,,,,--,+++******)'(&#(('"%#####""
- at 30BB2AAXX080903:3:3:434:1351#0
-CTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACAATGCTACAAGATCGGAANCTCANGC
-+
-67777788888888888888888877776555443222100//..--,,,,,+***)))())(((('%"#"%$""#
- at 30BB2AAXX080903:3:34:258:1777#0
-TCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATATAAACTCAGACCANCAACACNN
-+
-67777788888888888888888877776555443222100/0..--,,,++++***))))))((''"$"#$##""
- at 30BB2AAXX080903:3:41:641:1177#0
-ACTGATTAATGTTTGGGTCTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGTAACGAACACCACTAA
-+
-67777788888888888888888877776555443222100//...,,,--++**)())*()(&(('"%"$&$$$"
- at 30BB2AAXX080903:3:44:1145:1736#0
-TAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATATAAACTCAGACCCAAACATTAATCAGTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&&$&%%%#%
- at 30BB2AAXX080903:3:36:463:536#0
-GAAGAACTGATTAATGTTTGGGTCTGAGTTTATATATCACAGTGAGAATTCTATGATGGACCATGAGCNCGTGACN
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))(('('$"$"""##"
- at 30BB2AAXX080903:3:45:411:1661#0
-GTCCATCATAGAATTCTCACTGTGATATATAAAATCAGACCCAAACATTAATCAGTTCTTCAAATATCGACTCGGT
-+
-617*77888888888888888888777765553&32220%0/../.-,),+,++))()(&(((((('&%"$%%"""
- at 30BB2AAXX080903:3:50:383:100#0
-TCTCACTGTGATATATAAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATCTTCAGCGAGTCTGC
-+
-67777788888888888888888877776355443222100//..---,,,++***))))))))'''"""""#"""
- at 30BB2AAXX080903:3:33:245:1149#0
-CACTGTGATATATAAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATCAGATCGGANTCGCACNN
-+
-/7777788888888888888882877776545443222100//+..--,,+++**))*)))))('''"$$"%"%""
- at 30BB2AAXX080903:3:35:1307:500#0
-GATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAAGAACTGATTAATGTTTGGGTCTGAGTTTNCGTGCCCN
-+
-677777488880888888888888777765554432222000...---,-,++***)*()))(((('""#%####"
- at 30BB2AAXX080903:3:45:1037:1580#0
-AGATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAAGAACTGATTAATGTTTGGGTCTGAGTTCGTATCTCC
-+
-677772888888882888888888777765554432221/0//..---,,+++++*)*))()((''&""""#"$##
- at 30BB2AAXX080903:3:42:1133:1265#0
-CAAACATTAATCAGTTCTTCAAATATCTACTCATCTTCCTAATTACCATACTAATCTTAGTTACCGCTAACAACTT
-+
-67777788888888888888888877776555443222100//..---,,+++***)')))((((''$&%%%&%##
- at 30BB2AAXX080903:3:57:350:638#0
-GTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAAGATCGGAAGAGGAGACAT
-+
-67777788888888888888888877476545143222111./.,--+,,+*++*&))))('(((''$"%#""##"
- at 30BB2AAXX080903:3:42:1671:268#0
-GAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAGATATTTGAGATGG
-+
-67777788888888888888888877076555443222120//.,-.--,++++***)))'((((('&&%%&"""#
- at 30BB2AAXX080903:3:2:965:758#0
-GATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTAGATNTCTCCAA
-+
-67777788888888888888888877776355443220100//-.--,,,+++**)*))))(((('($"%#%%###
- at 30BB2AAXX080903:3:3:1108:1811#0
-AGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGATGAGTNCATNNTT
-+
-6777778888888888888888837717655541322//0/-.--.,,+-+)+***)*)(()(((('%"$"$""##
- at 30BB2AAXX080903:3:42:227:495#0
-ATCTACTCATCTTCCTAATTACCATACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTACTA
-+
-67777788888888888888882877776555443222100//.----,,+++**+)))))(((''&&%%%%$#"%
- at 30BB2AAXX080903:3:8:1324:1310#0
-TCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTAACTAAGATTAGTATGGTAATTAGGAAGANTCCTAGNN
-+
-67777788888888888888888877756555443220100/.-..--,,,,+******)())((((""$#$#"""
- at 30BB2AAXX080903:3:36:1152:94#0
-AATTCCTACGCCCGCTCAGCCGATGAACAGGTGGGATAAGGTGTTAGCGGGAACTAAGATTAATAGANACGTTACN
-+
-6777778888888)88888888(27575+5/344%2,,&2.*/-.&-*,,&**$'()()##(#&'&'"""#""#$"
- at 30BB2AAXX080903:3:49:172:1151#0
-GCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGATCGGAATCGTCACGA
-+
-67777788888888888888888877776555443222100//..--,,,++++**)))))((((('"$#""###"
- at 30BB2AAXX080903:3:48:246:36#0
-TGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTTAGCGGTCCCGGAGCG
-+
-67777788888888888888888877776555443222100//.---,,,&,++**()))())(((#$"#""""##
- at 30BB2AAXX080903:3:53:1142:1184#0
-TTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTAGTTCATCC
-+
-67777788888888888888888877776555443222100//..--+,,,++***)**))(()(''"""#%"$$"
- at 30BB2AAXX080903:3:36:142:977#0
-GTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGTCTGCCTGCN
-+
-67777788888888888888888877776555443222100//..---,,,++*+*))*)))((('#$""#$""#"
- at 30BB2AAXX080903:3:54:77:1776#0
-GTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCGTGTCCGTT
-+
-6777778888888888888888887777655544322200///..--+,,++++**))(*))((((&"$"&%$"""
- at 30BB2AAXX080903:3:4:1241:282#0
-TTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTCGATNACACNCN
-+
-6777778888888888888'/6887777653144222110///#.,,-,,++++***#(('''(##%""&&%$"#"
- at 30BB2AAXX080903:3:37:220:125#0
-CAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTGTCNAGCTCNN
-+
-67777788888888888888888877776555443222100//..-----,+++**)))))((((''&"&""%#""
- at 30BB2AAXX080903:3:3:186:1889#0
-TCAACTGATGAGCAAGACGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGCATATGTTGTNTGCNNCA
-+
-6777778888888.$88+88&8880277655.443221100//..-,,,,+)***)**(())&(&('"""&$""##
- at 30BB2AAXX080903:3:47:1557:163#0
-TCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCCGATGAACAGTTGGAATAGGTTAGTTCGCTCT
-+
-6777778888888888888888887777655544322011/+-..,,,,+,**+'))*()()()#''"""%"$%##
- at 30BB2AAXX080903:3:37:1257:1238#0
-ACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCCAATCGN
-+
-67777788888888888888888877776555443222100//-.---,,+++**)))))))()(('"%&$"%$#"
- at 30BB2AAXX080903:3:45:875:1547#0
-TAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATAG
-+
-677777888888888888888888777765551432-21/0/---.,,,,))+*'*))))(((&'(#'$"##"""#
- at 30BB2AAXX080903:3:8:1430:1295#0
-CAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGANTGCACANN
-+
-67777788888888888888888877776555443-12101//..-.+,,,*+****))())('(''"$"%$#$""
- at 30BB2AAXX080903:3:41:727:1004#0
-ACCTATTCCAACTGTTCATCGGCTGAGAGCGCGTAGGAATTATATCCTTCTTGCTCATCAGAGATCGGAAGTGCGN
-+
-64777788888888888888888878776)5+4-3222200/...,+,,+++***')#(()((('%'""#&"$%#"
- at 30BB2AAXX080903:3:41:1654:1212#0
-CTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCG
-+
-67777788888888888888888877776555443222100//...-,,,++++*****))(((((('%%&"%"""
- at 30BB2AAXX080903:3:38:1477:1084#0
-TTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCTNGT
-+
-67777788888888888888/8087777055544322210/...-,-,-,-+*+**)*))()(((('"%$#""""#
- at 30BB2AAXX080903:3:39:1380:169#0
-CAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCCTCTTGCTAATCAGAGAACGGGAGAGCGGTCTATCAC
-+
-6777778888888888888588887#276+5,4532010#1/-.-+*#,%+)+())%'((#&(#(&'"#"#%$$#$
- at 30BB2AAXX080903:3:55:973:883#0
-CAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCGCTTACT
-+
-67777788888888888888888877776555443221100/....---,-++***)*)()((('(''"#%#""#"
- at 30BB2AAXX080903:3:47:991:1822#0
-ACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCCACACAC
-+
-67777788888888888888888877776555443222100//-.---,,+,+*+*)**)()('(('$%""###""
- at 30BB2AAXX080903:3:58:1558:699#0
-ACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGCACACGACTN
-+
-67777788888888888888888877776555443222100///.---,,+,+*)*)())()('((#$$%#"#$""
- at 30BB2AAXX080903:3:55:514:1196#0
-TGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAAGTGCGGTGCG
-+
-67777788888888888888888877776555443222100//./---,,+++***)))))()('''"$#&%""#"
- at 30BB2AAXX080903:3:45:963:669#0
-TGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCAGCGGATGTA
-+
-677777-8888888888888888877776555443222100//..---,,+++***))))))))('''$"%"#$""
- at 30BB2AAXX080903:3:58:392:26#0
-CATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCCTCNNC
-+
-67777788888888888888888877776555443222100//..----,+,+******)())'(''&%"""%""#
- at 30BB2AAXX080903:3:48:222:1943#0
-ATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCTACCCAAC
-+
-67777788888888888888888877776555443222120//..---,,+++**()))))()(('&&""#$###"
- at 30BB2AAXX080903:3:3:1096:550#0
-GGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCACNTCAGNCG
-+
-677777888888888888888888777765554132220000/..----,++*))+)*))))()(%(%"#$"""##
- at 30BB2AAXX080903:3:45:844:1213#0
-CTGCTGTGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCAAGAAGGATATAATTCCTACGCCCTCTCCGCC
-+
-677777888888888888888888777765554132221000/..--,,,+,++*)**)()(()'(&'%##"#$#%
- at 30BB2AAXX080903:3:59:1005:868#0
-TGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGAACACG
-+
-67777788888888888888888877776555443222100//..---,,++++*+*)*)))))(('&&%###$$"
- at 30BB2AAXX080903:3:45:709:1767#0
-CGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGAGATCGGAAGAGCGGTGCAGCAG
-+
-67777788888888888888888877776555443222100//..--,,,,,+***)))))((((#%$###$%#"%
- at 30BB2AAXX080903:3:42:178:1153#0
-TTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATCATCAACTGATGAGCANGGACGCTA
-+
-67777788888888888888888877776555443222100//..-.-+,,*++***()))()('#'"%"%""###
- at 30BB2AAXX080903:3:53:961:2044#0
-TACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATTATCAACTGATGGGATCGCG
-+
-6777778888888888888888887777655$4335221//0,..,.-+,+&+)**#(*'()''(''""##"""##
- at 30BB2AAXX080903:3:8:936:491#0
-CTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACNTCCACGNN
-+
-67777788888888888888888477776555443222100//..----,+++***)*))(((((('""#$"&"""
- at 30BB2AAXX080903:3:37:1552:1828#0
-TTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACACCGCAACAN
-+
-67777788888888888888888877776555443222100//..-,-+,,++***(**('((((''"#"#$###"
- at 30BB2AAXX080903:3:57:379:1371#0
-CGATACGGGTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGCGTATCATCCACTGAGCATTAC
-+
-&7777788-888888888888-88774765554,/222+00/)-,'-++$&'++'*'()(('%#(&'&#""#""##
- at 30BB2AAXX080903:3:54:1185:927#0
-GCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGGGTATCATCAACTATTGCGT
-+
-6777778888888888888888887777655544302210//..'+,,,,*+++**'*('(''('&'$#""#"#"#
- at 30BB2AAXX080903:3:41:91:1270#0
-TCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCATCTGCTCGGGGGTATCATANCTCGACAC
-+
-6777778888888888888888887877655544122,10..+.--*,,(,+%+#**)#)#()#((#"$"$""###
- at 30BB2AAXX080903:3:2:1567:1797#0
-TATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGGTGGCATCTGAGATCGGAAGAGCGNCACNTGA
-+
-67777788888888&88-8888880296655.4132..1(&-&.%,-,$)&')'')(###)%'''%#""&&%"##"
- at 30BB2AAXX080903:3:55:748:1415#0
-GTTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGNTTCCAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))))((('%&""""##"
- at 30BB2AAXX080903:3:55:1271:1308#0
-TTGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGAGTCTACC
-+
-6777778888888888888888887777655544332210.//.,---+++,++))))()())(((%&####"##"
- at 30BB2AAXX080903:3:46:726:255#0
-TGATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGACATCCTCT
-+
-6777778888888888888888887777655544322110/./...-,-,+++*****)((((((''""""#$"#"
- at 30BB2AAXX080903:3:47:1563:1186#0
-AAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGTGTGTTGGGATAGATCGGGAGGGNCACTC
-+
-67777788888888888888888877776555442222100//..-&-,,+)+**%')))((#((#'""""""#""
- at 30BB2AAXX080903:3:2:1157:465#0
-ATGATACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCAGATCGGAAGACNCGCACTC
-+
-67777788888888888888888877776555283220100./-.---,-,++*)***))(((((('""#$%"$"#
- at 30BB2AAXX080903:3:56:286:583#0
-GGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGCGGGGTGGGGCTTGGCGTGAAATC
-+
-67777788888888888888882877266305243+(.1////.+'+-'(,)#+)*')))&###%##$"#&$%$$#
- at 30BB2AAXX080903:3:49:175:832#0
-GCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTNCTACCGTC
-+
-67777788888888888888888877776555443222100//...--,,,+++**))))*)')(&'"#""$#"##
- at 30BB2AAXX080903:3:52:1241:900#0
-GCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATAGGGTTTAGTCCTG
-+
-6777778888888888888888887777655544302/10///.------+++***'*)((''((#'$##""""#$
- at 30BB2AAXX080903:3:36:319:1271#0
-CGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGGATCTGCTCCTAN
-+
-67777788888888888888888877776555443022000//..--,,,+++*'*)))((((&#(#&"%"#$"""
- at 30BB2AAXX080903:3:38:955:1730#0
-CCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTAATCNNTGC
-+
-67777788888888888888888877776556443221100//..--,,,,++***)))(&&'(#%'"$%&""#"#
- at 30BB2AAXX080903:3:2:1298:567#0
-GGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTAGATCGGANGGCACAC
-+
-6777778888888888888888887777655244'22.10//.-'--,,,,++(()#'*'&(%##&'$"""$####
- at 30BB2AAXX080903:3:60:513:930#0
-GGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTAGATCGGAGACTNN
-+
-6777778888888888888888887777655544322210///.----,-+++)**&*)')'((('%"'#$##"""
- at 30BB2AAXX080903:3:48:298:1634#0
-AAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTTGGCGTTTCCGG
-+
-677777888888888888888888777766554432101/0//..-*,,-*+++*&))#('&('(''%"""""#""
- at 30BB2AAXX080903:3:59:230:735#0
-AGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCTNNC
-+
-6777778888888888888888787773655044322200/..--&,++,+++)&(&'%'#''###'$"$"$"""#
- at 30BB2AAXX080903:3:57:977:1676#0
-TAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGGTGGGTTTGTGACTCTC
-+
-6777778888888888888888887777655544122%021//-,--),,+****)&()&'((('&%$"%#%"#"#
- at 30BB2AAXX080903:3:42:173:590#0
-GCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGGATGGGTGCTGTGGNGGCGCACT
-+
-677777888888888888888888777765550432/21......)-++,+++&+**))))''(#'%""#"$#$##
- at 30BB2AAXX080903:3:48:1167:970#0
-GCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTGTGTGGGTTGATC
-+
-677777888888888888888888777765554432221/0//..----+++++*)*)(()#&)(('""$"""""#
- at 30BB2AAXX080903:3:51:1105:1525#0
-ATGCTAAGGCGAGGGTGAAATCGATATCGCCGATACGGTTGTGTAGGAGTGCTGGAATGGTTGTTGTTNACATCTC
-+
-67777188888888888-88,8887.7%65'54/32(21&///-'---),*++*')'&*)(###('&"""###$#"
- at 30BB2AAXX080903:3:54:86:457#0
-ATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGGTGGATAGGGGTGCTTGAATGGGGGCTGGGCGCTGANA
-+
-677-778888888888888888883075655511*2.2.0/*&,+.-&*)*&*$*#)#((##(##(#"$#%"""""
- at 30BB2AAXX080903:3:2:30:1263#0
-TCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCTCNAGTNNCA
-+
-677777888888888888888888777765554422/2100//(--,-,,,,+))*(&(())&'(#'$"#"#"""#
- at 30BB2AAXX080903:3:60:710:1356#0
-GCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCCTTACAGTNN
-+
-67777788888888888888888877776555443232100//..-,)+,&*+)**(''#'&'#''#$&$&%""""
- at 30BB2AAXX080903:3:59:443:386#0
-AATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGCGGTATCNC
-+
-67777788888888888888888877776555443212000//..*--,,+++***)))')(()&''$$"$""$"#
- at 30BB2AAXX080903:3:51:205:683#0
-CACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTTCATCCTCGCCCTAGCACGCGTGTAC
-+
-67777788888888888888888877776555443222100/-.-,,-'+-+))))())))&(&((&$$$#"#$""
- at 30BB2AAXX080903:3:58:172:902#0
-GGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATTGCTTGAATGGCTGNNNT
-+
-67777788888888888888888877776555443222100./----,-,+*+*+*()))#((('''%&$"$"""#
- at 30BB2AAXX080903:3:59:995:272#0
-CATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGGTTCATCCTCGCCTTAGCATGATTTATCCTACCCANC
-+
-67777788888888888888888877776555433.011(1.+*,,-+-*++)*((*'&((((('&%"$$%"%#"#
- at 30BB2AAXX080903:3:45:668:294#0
-TGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGATCTCTTGAGA
-+
-67777788888888888888888877776555443222100//..---,,+,+**+)))(((('(('$$$""""""
- at 30BB2AAXX080903:3:36:313:107#0
-TTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGACGATACGGTTGGATAGGGNCACGCCAN
-+
-6777,7888888888888888888777765554,32-210./..--,-%-+++))*)'()##'&'(#"""%"###"
- at 30BB2AAXX080903:3:47:816:1983#0
-TTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGAGGTGACATA
-+
-6777778888888888888888887777655544322210///..-,-,,,++))+*'*)''#'((#&#"""#"#"
- at 30BB2AAXX080903:3:60:671:1118#0
-GTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGAGTACACNN
-+
-67777788888888888888888877776555443222100//....-,,,+*+**))'))''''('$"%%$##""
- at 30BB2AAXX080903:3:52:285:1914#0
-CAATCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCACCACACG
-+
-67777788888888888888888877776552442121100/...---+,++*****))())()((%&"$%$&%#"
- at 30BB2AAXX080903:3:53:124:28#0
-TCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCAGATCGGACGACCGCTGAC
-+
-67777188888888888888888877776555443220100//.----,,,*++**)()'())((#'"$#$"""#"
- at 30BB2AAXX080903:3:55:138:1361#0
-ATCCTATACAACCGTATCGGCGATATCGGGTTTATCCTCGCCTTAGCATGATTTATTCTACACTCCAAGATATCTC
-+
-67777788888888888888888877476)55%03(0/10//+.,-+-+,**++*)#))'#('''('"$"&&%%##
- at 30BB2AAXX080903:3:51:1344:518#0
-CTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGGTTGTATAGGGC
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(('('&""""$$""
- at 30BB2AAXX080903:3:45:1764:117#0
-GGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGATACGCAGGCGGGG
-+
-67777788888.88888888888877776555443322100-/..--,+-*,+***)())(('''('%$#"$#"""
- at 30BB2AAXX080903:3:41:244:1983#0
-TGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCACAACCTCT
-+
-6777778888888-88(80888&8575765254433+0/1.///.-*-'-,&++))*#&)&'('#'&&"#"$"##"
- at 30BB2AAXX080903:3:59:1258:184#0
-TGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATAAGATCCGCAACNC
-+
-677777888888888888888808577765554432/2100/...---+,++*****)))(((((('""%%##%"#
- at 30BB2AAXX080903:3:39:1269:306#0
-CTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGATATCGCCGAC
-+
-67777788888888888888888877776550443222100//..---,,+++***)*))))(('((&&%&%$$#"
- at 30BB2AAXX080903:3:52:1042:1520#0
-GGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGGATGAAACCGTTTCGCCC
-+
-67777788888888888888888877776555443222100//.----,,,++****))))()((('%$#""%"$"
- at 30BB2AAXX080903:3:40:1697:879#0
-GCGATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAAGATCGGAAGCT
-+
-67777788888888888888888877776555443222100//..---,,++++**)**()))(('(&&$&""##"
- at 30BB2AAXX080903:3:42:855:1147#0
-GATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAGATCGGCCATA
-+
-6777778888888888888)888877776555443312100//-.,,,,-+++**)())&(((((''"%%$"""""
- at 30BB2AAXX080903:3:4:352:460#0
-GATATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACACACAACAAACNCACANCN
-+
-6777778888888888888888887777645'4432-2000//.,,+,,,+++(*))&)))((((&'%"%"&""#"
- at 30BB2AAXX080903:3:47:518:1870#0
-TATCGGTTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATACCACTTCTA
-+
-677777888888888888888888777765554432221000/-..-,-,++++*))*)))((((('$""#$####
- at 30BB2AAXX080903:3:2:275:1758#0
-CGTTTAGAAGGGCTATTTGCTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGCGAGTNAGANNTC
-+
-677777888888888888888888775765554531221-0//----,,,,*+****))(()((('&"""%$"""#
- at 30BB2AAXX080903:3:35:1083:255#0
-TTTCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTNTACTACNN
-+
-67777788888888888888888877776555443221100/...,-,-,+,++*+)*)))))((''"###"#$""
- at 30BB2AAXX080903:3:43:1053:343#0
-TGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGGGGGGG
-+
-67777788888888888888888877776555442.20+000/).--',&+**+**))*)&')((''&%%&"$#""
- at 30BB2AAXX080903:3:58:916:900#0
-TGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATAAATCATGCTAAGACAACA
-+
-6777778888888888888888887777655544112/1/0//-.--',,++*+***)))('(((#'&"%%$"#$#
- at 30BB2AAXX080903:3:35:1312:1076#0
-GCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTANTCCAATAN
-+
-67777788888888888888888877776555443222101.....-,-,+,++***))()))(('(""$$"""$"
- at 30BB2AAXX080903:3:4:1729:1372#0
-CTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAGATCGGAACNTCTCNTN
-+
-67777788888888888888888877776555443222010/.-.----,+*++*)*)))))(((('"""$#%"""
- at 30BB2AAXX080903:3:36:1511:2007#0
-GGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTAGGATACTTTCTCNN
-+
-67777788888888888888888877776552443222100//.,-,+,,++****%)')()((&'%%#"""$$""
- at 30BB2AAXX080903:3:39:1074:2007#0
-ATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGACATCGTCAC
-+
-6777778888888888888888887777652044322.10/0..,,+-,++,+*)*())))(&((('$&%%&#$##
- at 30BB2AAXX080903:3:60:1539:721#0
-ATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCACACACANN
-+
-67777788888888888888888877776555440220200//.,,,--++*+*'*())))%(((#&$$&%%$%""
- at 30BB2AAXX080903:3:55:1252:1771#0
-AGTGGGGTGAGGCTCGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGTTGTATCAAAC
-+
-67777788888888888888888877776555443222100//..---,++++***)*)))()(('#$$"##"#""
- at 30BB2AAXX080903:3:41:1477:316#0
-TAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATGAGTTGGAGTGGTGGTAC
-+
-67777788888888888888888877773555443222100//...--,,+++)*)())()')((&'$$#""""##
- at 30BB2AAXX080903:3:2:1244:1247#0
-TACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTANCAGACCG
-+
-677777888888888888888888777765554432221000*-..--,-,++)*)))*)()(('('%""%#$##"
- at 30BB2AAXX080903:3:4:715:728#0
-TACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTTNCAATNAN
-+
-6777778888888888888888887777655543222200././.--,,,+++**)**)))(((((&""##"""#"
- at 30BB2AAXX080903:3:46:579:753#0
-TCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAAAGCTAATCCAAGCATCACCCCACTACTAGGCCTCGGAC
-+
-27777788888888888888888877776555443212/0///.-.,-+,+')***'))&'()(#''"##$$""#"
- at 30BB2AAXX080903:3:3:534:528#0
-CCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCNGCCCNCA
-+
-67774788888888888888/888777795554432211000..-,-,,,+,)**)))))))(((''$""%##"$"
- at 30BB2AAXX080903:3:55:1600:33#0
-CCAAATCATGAGACCCACAACAAATAGCCATTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGACACAATAAC
-+
-67777788888888888888888877776%55)43222100//..---,,+++***)))))((('''$$$#$"###
- at 30BB2AAXX080903:3:43:581:1060#0
-AGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGTCTCATAGATCGG
-+
-67777788888888888888888877776555443221100//.----,,+++***)*)))()('(&&'%%$%$#%
- at 30BB2AAXX080903:3:34:385:1328#0
-CAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCNCGACCTNN
-+
-67777788888888888888888877776555443222100//.-.--,,++++*+)*))*)(('('"%""#$#""
- at 30BB2AAXX080903:3:57:1268:607#0
-CTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTGCAC
-+
-67777788888888888888888877776555413222100//..---,,+,**+*)*)()((((&''%%$"""$#
- at 30BB2AAXX080903:3:8:1773:891#0
-TGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGNCTATCTNN
-+
-677777888888888888888888775765554432221/0//..---,,+++***)))*))((('&"$%""#"""
- at 30BB2AAXX080903:3:38:679:434#0
-ATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTCCCACCA
-+
-6777778888888888888888887777655544332210....-----,,+++***))))((((''&%%%&""#"
- at 30BB2AAXX080903:3:4:216:1410#0
-TGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTANTCTANTN
-+
-677777888888888888888888677765554432221/0/..--*-,,+)+***)*)))(()(('""##"#"""
- at 30BB2AAXX080903:3:49:1688:283#0
-AGACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCGTCA
-+
-67777788888888888888888877776555443222100//..---,,,++++*)*)))()((('"$""#""$#
- at 30BB2AAXX080903:3:2:1679:1156#0
-TGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTNGCGAGTC
-+
-67777788888888888888888877776555442221100/./-,--,,+,)**))()('(((('%'"%&%#$"#
- at 30BB2AAXX080903:3:51:906:607#0
-TGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTGTGGTTGGT
-+
-67777788888888888888888877776555443221100//..---,++++***)))))))((''"""$""##"
- at 30BB2AAXX080903:3:55:363:433#0
-GACCCACAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCCGCACTAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''""%%$"###
- at 30BB2AAXX080903:3:43:721:690#0
-CTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGGGCTATTTGTTGTGGGGG
-+
-67777788888888888888888877776555443222110//..---+,+,+**))*))(()((('&&%"&%#""
- at 30BB2AAXX080903:3:4:242:569#0
-GCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGATCGGAAGGGCNTGCTNCN
-+
-67777788888888888886880673772515443,2.10../..-,,+,)+***)*((&()#'(#'%""#$#"$"
- at 30BB2AAXX080903:3:45:800:969#0
-TGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGCGTTTAGAAGAGATCGGAGGGGGGG
-+
-67777788888888888888888877776555443222100//..---,,+,++***)*)))(((('$"#%"$"#$
- at 30BB2AAXX080903:3:33:1653:1308#0
-TTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGGAGATCGGAAGAGCGGTGANTCACTGNN
-+
-67777788888888888888888877776555443222&00//.-+--+,+*'%**'))))#()#%#""%%%""""
- at 30BB2AAXX080903:3:44:367:1373#0
-CAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAAGATCGGAAGAGCGCG
-+
-67777788888888888888888877774555443222000//.---,-,*,++***))())((((&&&&"%""""
- at 30BB2AAXX080903:3:55:179:999#0
-CAACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAAGATCGTNCTCAG
-+
-67777788888888888888888877776555443222100*/--.*-+,,,++****)&))()((#$&""$#%##
- at 30BB2AAXX080903:3:47:749:1380#0
-ATTTGCCTGCTGCTGCTAGGAGGAGGGCTAGTAGTGGGGTGAGGCTTTGGTTTGCGTTTAGAAGGGGTTGTCGCTC
-+
-67777788888888888888888877$7635+5422221*0./.,,.&,,*,%*'*#*)')'((('%"""%%"$##
- at 30BB2AAXX080903:3:36:1036:1272#0
-AACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCTAGGTGTGN
-+
-67777788888888888888888877776555143222100//..---,,+++****)*))((((''%"#"%$%#"
- at 30BB2AAXX080903:3:57:523:1828#0
-AACAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCTCCAC
-+
-67777788888888888888888877776555443222100//..--,,-,++****))))))(((''&"#"####
- at 30BB2AAXX080903:3:3:749:138#0
-CAAATAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGCNCATCNCN
-+
-6777778888888888888888887/7553452450/1000/....,,),**+*'*)*(((((('''$"$#$$"#"
- at 30BB2AAXX080903:3:44:70:547#0
-TAGCCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAATACAGCCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&""&&%##"#
- at 30BB2AAXX080903:3:49:1248:1539#0
-CCCTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAAGATCGGAAGAGCGGTGTCT
-+
-67777788888888888888888877776555443222100//.--.-,,+++**)*))))()((''$$"""""""
- at 30BB2AAXX080903:3:59:785:1061#0
-CTTCTAAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGAGATCGGAAGAGCTGCAACAC
-+
-67777788888888888888888877776555443222000//..-.-,,+,++*)))(()(((('''$%###$$#
- at 30BB2AAXX080903:3:59:119:1007#0
-ACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATTAGGTGTCNNA
-+
-6777778888888888888888887777655544322,100//-.-,-),+++**)))))))(('(''""$%$""#
- at 30BB2AAXX080903:3:36:1786:967#0
-AGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGATNTGGCAGNN
-+
-677777888888888888888888777765554432221/0//..,-+-,*++**')())(((((&'"%$%%##""
- at 30BB2AAXX080903:3:1:1174:1765#0
-AAACGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATNCGNTCGC
-+
-67777788888888888888888857576456342222120-.,/.--,+,+*)**()()('(((%'%"""""""#
- at 30BB2AAXX080903:3:58:1553:630#0
-GGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGATCGGAACACCACAN
-+
-67777788888888888888888077776555443222000//.,,--,,+++***)()()(('('&$$%$$%$#"
- at 30BB2AAXX080903:3:59:865:1924#0
-TGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGAGGCTTGGAGCACAAC
-+
-677777888888888888888888777765554422121/0/-..*,-+,+++***(*()#()'(('&$#%$"###
- at 30BB2AAXX080903:3:36:687:998#0
-GGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGGGGGGTGAGAGTGTAACACAN
-+
-6777778888888888888888887777355544121..001/.,.-(+)),%**#**))&(#(#(#&$""%#$#"
- at 30BB2AAXX080903:3:36:825:2013#0
-TAATCCAAGCCTCACCCCACTACTAGGCCCTCTCCTAGCAGCAGCAGGCAAATCAGCAGATCGGAAGTCTCGCTNN
-+
-6777778888888888388888887874*5$444-2120./-..-+--$+)+*'**')*)%&(('&%%"#$"$"""
- at 30BB2AAXX080903:3:55:1329:1147#0
-AATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCCCCACCACA
-+
-67777788888888888888888877776555443222100//..--,-,++++**)*)()(((('&"%%##$#$#
- at 30BB2AAXX080903:3:38:204:1656#0
-TCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCATCCGACCA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((((''$"%""####
- at 30BB2AAXX080903:3:33:484:1458#0
-TCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGNGCTGTCNN
-+
-67777788888888888888888877776555443222100//-.-,-,,+++*+))())(()((&&""#""#%""
- at 30BB2AAXX080903:3:38:688:171#0
-TCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTAGTGGGGTGCTGTCAGNN
-+
-67777788888888888888888877776555443222100//-.-,-,+,+++*&))&)(((((%'$"""$#"""
- at 30BB2AAXX080903:3:33:1687:204#0
-GCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCNTCACTCNN
-+
-67777788888888888888888877776555443222100/-.---,-,,++***))()(((((''""%#$"$""
- at 30BB2AAXX080903:3:47:127:277#0
-CCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCCGACTCGCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))()((''$""$##$"#
- at 30BB2AAXX080903:3:2:1533:1696#0
-GAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTAGTATNCGCGCAA
-+
-67777788888888888888888872756555445012100./---,,,,+*+*)**(()#(('(&%""$%&$%##
- at 30BB2AAXX080903:3:36:1638:495#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGAGATCGGGATCTATNN
-+
-677777888888888888888888777765554432.1100/...,--,,,,+**))*))())'((#$$"$$""""
- at 30BB2AAXX080903:3:50:1255:490#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAAGATCGGAAGAGCGCACTCT
-+
-67777788848888888888888877776555443231100/....--,,,+)**))))('))(((&"$##"#"#"
- at 30BB2AAXX080903:3:53:267:155#0
-TGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGAGGCCTCGTCTTCGGGTG
-+
-67777788888888888888888877176555443321100/....--,,,,)**)**)))(('#(#""""$""""
- at 30BB2AAXX080903:3:57:929:328#0
-CTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCTAGGAGGTGCACTCC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))))((('$"%%$$"##
- at 30BB2AAXX080903:3:57:330:1636#0
-AGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGCCTCCACCCGTGACTCCCGTCAGCCATAGCGCCT
-+
-67771788888888888888&888777753454135/0+0//).-(,*,++&++*))#()&((((&%%$""$"##"
- at 30BB2AAXX080903:3:51:1449:1742#0
-GGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATCNAAAGCN
-+
-677777888+8888888888888877776555&41222100/-.'--,,,++*+++(#(#))(('('"$"#"%#$"
- at 30BB2AAXX080903:3:57:358:1455#0
-GTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGAGATCGGAAGAGCGGGTCCGTACC
-+
-6177778088888888888/888877775555413212./..+-----,),,)+*))))(')((#(("'#$"""$"
- at 30BB2AAXX080903:3:49:830:1861#0
-GGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGCTGCCAGCCCG
-+
-6777778888888888888888887777655544322210/0/..---,,+++**))*)))((((''$$#""##""
- at 30BB2AAXX080903:3:55:951:1228#0
-GGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCAGATCGTGTGTAC
-+
-67777788888888888888888877776555443222100//.----,,++++**))*))((('('&$"&$%###
- at 30BB2AAXX080903:3:44:1554:775#0
-CTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCGATCG
-+
-67777788888888888888888877776355443222100//...--,,++++*****)*())('''"$"%###$
- at 30BB2AAXX080903:3:44:19:1322#0
-TCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCTAAGGCAC
-+
-67777788888888888888888877776555443222100/0..---,,+++***)**)))((('''"""""###
- at 30BB2AAXX080903:3:40:659:1779#0
-CCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCTCCACCAC
-+
-67777788888888888888888827776555443221100.....--+,+,++***))))))(((#&"%"$#$##
- at 30BB2AAXX080903:3:39:490:825#0
-CTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCGCACACACA
-+
-67777788888888888888888877776555242222110//.----,-,,++***)())((((%("&#$""$#"
- at 30BB2AAXX080903:3:60:1089:702#0
-CTAGCAGCAGCAGGCAAATCAGCCCAATTAGGTCGCAACCCCTGACTCCCCTCAGCCATAGAAGGCCCGACACCNN
-+
-677777888888888888'888887777+55511/2)21/,../-.,-,,*'+**+)))()'(('&'"%$$#$#""
- at 30BB2AAXX080903:3:45:618:701#0
-ACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATTTGCCTGCTGTTGTGC
-+
-67777785888888888888888877776555443222100//...,--,+++**)*)))()(('((""%#"%"""
- at 30BB2AAXX080903:3:46:1540:1201#0
-CAGCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGACATAGAAGGCCCCACGCTACACCT
-+
-67777788888888888888888877776552443222100///--.,,,,*+*+*)&)('('('('&$""$####
- at 30BB2AAXX080903:3:52:333:909#0
-GCAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCCTCCTCAG
-+
-67777788888888888888888877776555443222100//..---,,+,+**)*)))))(((('%""#"#$"%
- at 30BB2AAXX080903:3:47:877:2004#0
-CAGCAGGCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCAGATCGGTACCGCGAAC
-+
-67777788888888888888888877776555543222.0/-....--,,+,++***)()()(#((#"$""$"""#
- at 30BB2AAXX080903:3:35:507:1548#0
-GGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGATNTGCCCCAN
-+
-677777888888888888888888777765554432211/0//..-,-,,+,**+)))**)((('''"""#####"
- at 30BB2AAXX080903:3:49:1524:1809#0
-AGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGTGGAGACCTAATTGGGCTGGATACACAC
-+
-6777778888888888888888887777655244/2221/0/,,.---+-+'+)'#)(&)((((#'&""""#"#""
- at 30BB2AAXX080903:3:37:1650:1056#0
-GCAAATCAGCCCAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCTGCNN
-+
-67777788888888888885888877776555443221100//.--,,-+,+****)*)(((''(''"%""""$""
- at 30BB2AAXX080903:3:39:1410:1543#0
-AGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGATCGGAAGAGCGGTTCCGCAGTA
-+
-67777788888888888888888877776575443122100/...--+,(&++**)*)(()((#('%"#"$%"##"
- at 30BB2AAXX080903:3:54:480:1740#0
-GAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGATCGGAAGAGCGGTCGCGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+,+****))()(((''&"#"#%%""#
- at 30BB2AAXX080903:3:54:523:336#0
-CAATTAGGTCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACCCACGTC
-+
-67777788488888888888888877776555433222100//...-,-,++++*****))((((('&&#&%%$""
- at 30BB2AAXX080903:3:39:1219:400#0
-ATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGGGTGGGCGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))())(('''$&"&"#$##
- at 30BB2AAXX080903:3:2:1781:656#0
-ACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTGAGGGGAGTCAGGGNCGAGCGC
-+
-67777788888888888888888877776555443221100/...----,+++**)*)))&('%(('&"#%"###$
- at 30BB2AAXX080903:3:48:644:1554#0
-CAACTATAGTGCTTGAGTGGAGTAGGGATGAGACTGGGGTGGGGACTTATATGGCTGAGGGGCGACAGAGCACTAA
-+
-677777888888888888888888777+65554432221*0//-'--+%,-,+*)*)))))('(&''"""$##"#"
- at 30BB2AAXX080903:3:40:342:1281#0
-GATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATGGCTCGCGGGAAT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))('('%""%"#"""
- at 30BB2AAXX080903:3:57:1435:687#0
-AAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTATAGACGACACAT
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('(&&%""$$##"
- at 30BB2AAXX080903:3:56:786:316#0
-AAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTTCTAGATCGAATG
-+
-67777788888888888888888877776555443222100//..---,,+++**))))))()(''''&%%&##""
- at 30BB2AAXX080903:3:4:720:1212#0
-TCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATNCTCANCN
-+
-6777778888888888*88888887777625544302210//0.,,.,+,+*+**)**)()()((''"""%%#"#"
- at 30BB2AAXX080903:3:2:71:347#0
-AGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAAAGANACANNGC
-+
-677777888888888888188883777164104131/010...----++,+,++**'*)#(((&(''$"&%""""#
- at 30BB2AAXX080903:3:39:1233:581#0
-AGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATACTCTCACAC
-+
-67777788888888888888888577136/55043221000//,.-.,+-,,+(*)())))(()('#&&%%$%%$$
- at 30BB2AAXX080903:3:33:1236:1913#0
-GAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGCCTNCCCACGNN
-+
-6777778888888888888888887777655544322210///..--,,,+++***)*)())(((''"$#$"$"""
- at 30BB2AAXX080903:3:42:804:1382#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGGGTT
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('('&'#"#""""
- at 30BB2AAXX080903:3:43:474:1012#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGTGGGGGCTC
-+
-67777788888888888888888877776555443220100//..----,*++****)))(((((('&&$$""#""
- at 30BB2AAXX080903:3:57:1550:1751#0
-AAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGGGCACTCAAAT
-+
-67777788888888888888808877776530443222110//...--,,,+++*()))))'(((('$$%"##$$"
- at 30BB2AAXX080903:3:1:730:1431#0
-GAAGCGGATGAGTAAGAAGAGTCTGGCTCCAACTAAAGAGCTGGAGGGGGGAAGGGAGGGGAGATCGCNATNCCAC
-+
-67777788888888-&88268'8%'75-$-12,,+$20+-,/&.%."-+%+&***)(&(#(#(###'$"%$""#"#
- at 30BB2AAXX080903:3:33:1537:1426#0
-GAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAAGATCGGNCACGCCNN
-+
-67777788888888888888/888777765551432/220//..,-,-,,,+++**())())(('('"$%$"##""
- at 30BB2AAXX080903:3:33:261:767#0
-GAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGGANCAAACANN
-+
-67777788888888888888888877776555443222.00///,-+-,++++***(*)))(('('#"&###"$""
- at 30BB2AAXX080903:3:36:108:1418#0
-GGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCACACTTN
-+
-677777888888888888888888777765554432211000/..-,-,,+++***)))*))('(''$%"#"##""
- at 30BB2AAXX080903:3:36:1204:194#0
-TGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTATGGCTGAGACTGNAGCCGTAN
-+
-6777778888888888888888887777655544322210.//..---,,++++**))))))((((&"#%#$#"""
- at 30BB2AAXX080903:3:39:891:601#0
-CCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCCTAC
-+
-67777788888888888888888877776555443222100//..---,,,++*****)*))()((&'&&&#%"""
- at 30BB2AAXX080903:3:56:877:2036#0
-GGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGACTGTACTTC
-+
-67777788888888888888888877776555443222100//...--,,+++*+**))))(((('''&%"##""#
- at 30BB2AAXX080903:3:37:143:1292#0
-GGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTGAGCGTATCGTN
-+
-6777778888888888888888887777655544321110//..----,,+++***)()))(()'''%""""#"#"
- at 30BB2AAXX080903:3:2:403:827#0
-CTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGTGGAGTAGGGCTNAGACGCT
-+
-677777888888888888888888777765553432221/0-/..---+,+++***)))))(((((&$""&%&"#"
- at 30BB2AAXX080903:3:4:1420:400#0
-TGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGATCGGAAGAGCGGTTCACNCACANCN
-+
-67777788888888888888884877776555441122/00+..,.,,,-,***+*()((#))#'##$"%$#""#"
- at 30BB2AAXX080903:3:36:1103:912#0
-CTCAGCCCTACTCCACTCAAGCACCATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCGATGCACN
-+
-67777788888888888888888877776555443222100//..---,-+,++*+))*)))((((#%""""##$"
- at 30BB2AAXX080903:3:49:581:2014#0
-CTCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCATATCCCATAT
-+
-67777788888888/,8483888/67756/55123+021//-)..,(-+)+*+*#('#(('''(#%%""#""#"""
- at 30BB2AAXX080903:3:4:989:1712#0
-TCAGCCCTACTCCACTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCCNCTAGNCN
-+
-677777888888888888888888275725604420220///--,,++,,+)**)**(()(''(('%&"%""#"$"
- at 30BB2AAXX080903:3:8:1017:788#0
-GCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTTGAGNTCACACNN
-+
-67777788888888888888888877776555443220100//.---,,-,++**)**)()((('('"$#"$#$""
- at 30BB2AAXX080903:3:42:1294:932#0
-AGTGTGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACAACTATAGTGCTATTGTTCT
-+
-677747888888888/88288888-77765154/3222.00/...-)-+,,,)**(*))()(&&'(''##"&#"#$
- at 30BB2AAXX080903:3:40:1780:1441#0
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAAAC
-+
-67777788888888888888888877776555443222100//..--,--+++***)())'(('(('%&$%$##"#
- at 30BB2AAXX080903:3:54:217:1473#0
-TCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAGATG
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))((('''$&&"%###
- at 30BB2AAXX080903:3:33:1469:357#0
-CAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCNATATCTNN
-+
-67777788888888888888888877776555443212100/...---,,+******))*(((((('"$##$$$""
- at 30BB2AAXX080903:3:38:664:888#0
-CACTATAGTTGTAGCAGGAATCTTCTTCCTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTACTCTCACAC
-+
-67777788888888888888888877703555443212100//...--,,+++++***))(()((''&$%#%#"#"
- at 30BB2AAXX080903:3:39:1049:483#0
-AGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCCTGCTACACCTATCG
-+
-67774788888888(888888888777765554432121/0//..,,-,,+++**))*))())('&('$#$"$$#"
- at 30BB2AAXX080903:3:46:122:961#0
-TGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACCCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((('(&%"##%#$""
- at 30BB2AAXX080903:3:59:1513:1142#0
-TAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTAAGAAGATTCACAACNAC
-+
-67777788888888888888888877776555443222100//..---,,++****)))))))((('$$%%%$"$$
- at 30BB2AAXX080903:3:46:123:914#0
-TAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGCGGATGAGTGAGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''''%#"#"$""
- at 30BB2AAXX080903:3:50:97:1499#0
-TAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGAGATCCGGCGCCAC
-+
-67777788888888888888888877776555443222001//...---,+++***%))**(((((#$""$"##"#
- at 30BB2AAXX080903:3:40:768:1375#0
-GGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCGATTTTCTGCTAGAGATCGGAAGAGTGGCGTT
-+
-674777888888888888888888777763554432,-100//(%--,,,*+***)*()()'()'('&%""#""""
- at 30BB2AAXX080903:3:8:1721:722#0
-GGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGGGGGTGGAAGNCATCTCNN
-+
-67777788888888888888888877776555443222100//..---,,,++**)))))))((((&""##%##""
- at 30BB2AAXX080903:3:44:88:784#0
-ACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTAGATGAGAAGAGCGCTCTC
-+
-67777788888888888/88888877776555-452/2100../----,,(++++*)*)))&((((&&""""$##"
- at 30BB2AAXX080903:3:1:305:216#0
-TTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACNTGNCTCA
-+
-677777888888888888888882087765553/322.100/0-/,.,-,*,++**()()))((%&('""""####
- at 30BB2AAXX080903:3:33:1319:516#0
-TTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCANCTCACANN
-+
-67777788888888888888888/.777055444320100/1/-.-&,,,*&(*'*()(((''(&'%"$#%$##""
- at 30BB2AAXX080903:3:56:1252:1047#0
-CTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGCTAGTGGCTC
-+
-67777788888888888888888877776555443222100//..---,,,+****))*)))()('''%%"""$""
- at 30BB2AAXX080903:3:60:1084:1851#0
-CTAGCAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGTNTGNN
-+
-67770788888888888888888877776555443222100//..--,,,+++**()*))()(((''&%%#"#"""
- at 30BB2AAXX080903:3:42:1712:170#0
-CAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGCTATTTTCTGTTG
-+
-67777788888888888888888877776555483222000//..--,,,+++**+)*))))()(''$&%%&$"##
- at 30BB2AAXX080903:3:47:727:856#0
-GCAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATAGATCGGAAGATGCGATGC
-+
-67777788888888888888888877776/55413222000/..,---,,+,+****))))'(((''""#"$""##
- at 30BB2AAXX080903:3:60:908:191#0
-GCAGACTGCTGCGAACAGAGTGGCGATAGCGCCTAAGCATAGGGTTAGAGTTTGGATTAGTGGGCTATATCCGCNN
-+
-67777788888888888888,88,77476/5'4,0221/-0/#.%,--,,*)+++())()%(()%&&'#%#%"$""
- at 30BB2AAXX080903:3:59:346:751#0
-CGCAGACTGCTGCGAACAGAGTGGTGATAGCGCCCAAGCATAGTGTTTGAGGTTGGGTTAGTAGGCTATTTCANNA
-+
-677777888888888888888088577-65.5(-"-.-0.,-/,.,,#,+,$*+**(&(#(#')(#%%"&"%$"""
- at 30BB2AAXX080903:3:37:1709:1765#0
-CAGAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCCGCTCTCNN
-+
-67777788888888888888888877776555443222100//..---,-+++***)**()((((('"$$"#"$""
- at 30BB2AAXX080903:3:36:1216:177#0
-GAAAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCAAGACCGGAAGAGCGGNCANCTACN
-+
-677777888888888888888888777785554432-11-0//.---,*(+)***#&&&('(((&''"$""$""$"
- at 30BB2AAXX080903:3:43:667:969#0
-AAGGGCGCAGACTGCTGCGAACAGAGTGGTGATAGCGCCTAAGCATAGTGTTAGAGTTTGGATTAGTGGGGGGACA
-+
-67777788888888888888888877776555443222100//..----,,++****)))))()(('$$&#""#"#
- at 30BB2AAXX080903:3:37:1211:1239#0
-CTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACCAACACGN
-+
-67777788888888888888888877776555443221100//..---,,++++*))))*)(()(('&$#$#%"#"
- at 30BB2AAXX080903:3:49:1270:978#0
-CCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTAAGATCGGTAACCTC
-+
-67777788888888888888888877776545443222200//.-.--,,+++*'*))*((((((('%""""##"#
- at 30BB2AAXX080903:3:44:767:623#0
-CAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAACGACATCA
-+
-67777788888888888888888877776555443222110//..--,,,+,+**+))))))()('('$#""#"##
- at 30BB2AAXX080903:3:48:960:1633#0
-AACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGATATCATC
-+
-67777788888888888888888877776555443222100//..----,++++***)))))(((('"""###"#"
- at 30BB2AAXX080903:3:4:581:669#0
-CTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGAGATCGGAAGAGAGGGTCCNCCTCNCN
-+
-67777788888888888888888/77716555443021001./-,--,,,+,+****$*'*#)(%'%"""#"#"""
- at 30BB2AAXX080903:3:44:65:2007#0
-TGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATGCAAGTCA
-+
-67777788888888888888888877776553443312.0/..-.-,,),,++**+))*)))()(('$"##"""#"
- at 30BB2AAXX080903:3:1:906:1104#0
-GCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAGATCGTNACNTATA
-+
-6777778888888888888888887777655544320211/...----,,+++**)*)*)(((('&'""##"#""#
- at 30BB2AAXX080903:3:57:112:689#0
-AAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGATAGCGNGTNCCC
-+
-67777788828888888888888877776555443222101/...---,-+*****)))))((('''&&"##"$$#
- at 30BB2AAXX080903:3:8:838:1370#0
-TAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAGATCGGAAGANCATGTANN
-+
-6777778888888888888888887777654544322120///.--,-,,+++**))*))))('(''"%""#"#""
- at 30BB2AAXX080903:3:4:793:1855#0
-GAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGACNCTGANAN
-+
-67777788888888888888888877776555543202(00//...--,--++*)****()&))#('%"$""#"#"
- at 30BB2AAXX080903:3:4:751:1909#0
-AGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAGATCGGAACNACCTNCN
-+
-677777888888888888868888/7776+534432021/1//.,-,+,,++)**)*))()((((''$"%"##"$"
- at 30BB2AAXX080903:3:36:732:936#0
-GGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGTGCTCAGATAN
-+
-67777788888888888888888877776555443222100//.----,,,+++*))*))((((''&"%###$"$"
- at 30BB2AAXX080903:3:38:109:1392#0
-TGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGGACATCGCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*))(('''%$"#""###
- at 30BB2AAXX080903:3:50:1612:982#0
-AGTGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGACTGCTGCGAACAGAGTGACGCTCTCT
-+
-67777788888888888888888877776555443222100//..---,,,,+****)))()(('&'"$"#"###"
- at 30BB2AAXX080903:3:2:998:1935#0
-TATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCCNCACNGCC
-+
-677777888888888888888888777765454032211///,-----,,+)++)*)))')((('%'""%""""#"
- at 30BB2AAXX080903:3:34:716:1406#0
-CACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCNCCTCGCNN
-+
-67777788888888888888888877776555443222100//..-----+,+*)**))(())('('"$$"$""""
- at 30BB2AAXX080903:3:35:169:1277#0
-ACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTAGATCGNACTACCAN
-+
-67777788888888888888888877776555443222/00//..---,,,++**)*))))((((&&""##$$#$"
- at 30BB2AAXX080903:3:56:1070:890#0
-GTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCAGATCGGAAGAGCGCATACCA
-+
-67777788888888888888888877776555443222100//&.--,,,+,++**)*))))()('''%#""####
- at 30BB2AAXX080903:3:42:1197:1745#0
-TATGAGTCCTAGTTGACTTGAAGTGGAGAAGGCTACGATTTTTTTGATGTCATTTTGTGTAAGGGCGCAGATTGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))((('(&&$%""##""
- at 30BB2AAXX080903:3:57:1017:1304#0
-GTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCGTATAAC
-+
-62777-88888888888888888877(7655544322210//..----,,+&+****'())())'''&$#&""#"#
- at 30BB2AAXX080903:3:44:1323:1466#0
-CTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACAGATCGGAAGAGACAAA
-+
-67777788888888888888888877776555443222000/..--,,,-++'*)))*))(()('('&$"#&#%##
- at 30BB2AAXX080903:3:33:1145:1447#0
-ATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGAAGGCTACGATTTTTTTGATGTNACTCTGNN
-+
-64777788888888888888888877776555443222000//..---,,+++*+**)))))()(''"#"&%%#""
- at 30BB2AAXX080903:3:54:845:989#0
-ATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCCACCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((''%"$"%$$#$
- at 30BB2AAXX080903:3:44:1551:1387#0
-TAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAGATCGGAAGAGCGGGTCAGCAG
-+
-6777778888888888888888887777655544322210///-.---,,,++****)))()((''&'"#$%$$"$
- at 30BB2AAXX080903:3:58:1666:1483#0
-ATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACAAAAGACAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()('&'&"#"$$$"
- at 30BB2AAXX080903:3:35:32:1292#0
-AATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGANACAAGAGN
-+
-67777788888888888888888877776555443222100//..----,+++***))*)))(((''""$"""#""
- at 30BB2AAXX080903:3:38:1105:1630#0
-AATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTAGATCGGAAGACGTCATTGT
-+
-677777888888888888888888777765554452221/0//./---,,+,+*)*))*)'(('(('%$#"#"$$#
- at 30BB2AAXX080903:3:33:669:983#0
-GTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACAAGNCAATGTNN
-+
-67777788888888888888888877776555443222100//...--,,++++*+**)))()(((("%""""#""
- at 30BB2AAXX080903:3:44:1727:1505#0
-GTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAGATCGGAAGAGAGGGAC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))()('''$&&"$""""
- at 30BB2AAXX080903:3:56:291:48#0
-GGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGTCCTAGTTGACTTGAAGTGGAGAGGGACGC
-+
-67777788388888888888888877776355420322010/0.--,--,*,***))*))((('((&&"#%%$$"#
- at 30BB2AAXX080903:3:39:1044:391#0
-TCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCCGCACACCC
-+
-67777788888888888888888877716555443222000///.---,,-,+***)*()))(((('"&%%$""##
- at 30BB2AAXX080903:3:41:1427:771#0
-CTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCAGATCGCTAC
-+
-67777788888888888888888877776555443222010//..-.-,,-+++'*)*)()((((''&$&%%"#$#
- at 30BB2AAXX080903:3:40:332:1500#0
-TGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAACTATTATGAGATCGGTAGGCGCGA
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((''$&%%$%""#
- at 30BB2AAXX080903:3:4:101:739#0
-TGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTGTAAATATTATGAGTCCTAGNCGAGNCN
-+
-67777788888888888888888877716,554432+2100/+-.---,+++#+**))(())(''(&"""""""#"
- at 30BB2AAXX080903:3:57:1001:1821#0
-GTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATAGAACCACATCC
-+
-6777778888888888888888887772855.54022,100*-.,.,,,,+$+)*()))()'(((''""$"%#"#$
- at 30BB2AAXX080903:3:43:1190:752#0
-CTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATCTGTACCCACGCCCATA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))('('%$%$#$##"
- at 30BB2AAXX080903:3:43:1631:572#0
-TAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATAGATCGGAAGAGCGATCT
-+
-67777788888888888888888877776555443221100//...--,,+++*****))))((('''&%#$""""
- at 30BB2AAXX080903:3:2:1332:587#0
-GAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGCCGATTAGATCGGAAANCGCACAC
-+
-67777788888888888888888877776555443222100/...-,-,,*+***))*)))('(((&""##&$$##
- at 30BB2AAXX080903:3:52:476:1667#0
-TGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGGTTGATGAGATCGGAAGGGCGTCG
-+
-67777788888888888888888877776555443222100./.----,,+++*****)))))(('%"$"$"%"##
- at 30BB2AAXX080903:3:43:1245:460#0
-TACAATCGGCATCAACCAACCACACCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTT
-+
-67777788888888888888888877776555443222100//..----,++++*****)))((((''&&&&$%%$
- at 30BB2AAXX080903:3:43:10:226#0
-CATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGATCGGAAGAGCGGTCACAGACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('&"$"%"""##
- at 30BB2AAXX080903:3:4:1650:612#0
-AGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTGTNCTATNTN
-+
-67777788888888888888888877776545443212/00/..--,,,,*++*)*)))()(()'('""#""%"""
- at 30BB2AAXX080903:3:45:1092:704#0
-GGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTAGGATGCAC
-+
-677777888888888888888888777765554422220000/..---,,++++**)*)))'('''%$%"""#$#"
- at 30BB2AAXX080903:3:47:1768:1464#0
-CGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGTGTGGTTAGCTGGA
-+
-67777788888888888888888877776555443222100./..--,,,+++*+*)()))((((''$$""$""""
- at 30BB2AAXX080903:3:60:1397:1728#0
-GGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAATGCTAGGACAAACANN
-+
-67777788888888888888888877776555443222000//..-,,,,+++*)))))))(()((''&&%%%#""
- at 30BB2AAXX080903:3:59:1146:1872#0
-TGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGGAAGATCGGACACCC
-+
-67777788888888888888888877776555443222100/..----,-+,++***)#*)(((''''&&"#$%##
- at 30BB2AAXX080903:3:48:1703:446#0
-CCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATAACCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))()(('&"""""##$"
- at 30BB2AAXX080903:3:53:970:982#0
-CCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGAGATCGGAAGGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((((($$""""""#
- at 30BB2AAXX080903:3:39:1561:1853#0
-TGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACAGATGTGCAGTGATANAGN
-+
-67777788888888888818888877776555443222100//..---+,+++*)*')))()'(#('"&&#$"##"
- at 30BB2AAXX080903:3:3:1186:1466#0
-GTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACGGATGGGGTNCTCTNAC
-+
-6777778888888888888888884175655541/22200//-.,-,,-,*+(+**#(&(('#('%'%"&"#"""$
- at 30BB2AAXX080903:3:2:736:303#0
-TGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACNGTCTGCA
-+
-67777788888888&8/8088888787765154435201/01/./---$-,++'*)*)*))(#((('&"#&#"""#
- at 30BB2AAXX080903:3:56:539:515#0
-GCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACATTAACATC
-+
-67777788848888888888888877756555443222100//..---,,+++***)))))((((('$$%&"#""#
- at 30BB2AAXX080903:3:58:1080:2019#0
-TCATTGTTAAGGTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTTGAAGAAGGCGTGGGTACNACACN
-+
-6777778888888888888888887777655542222222///..----,+++*)**))))&('(('$&%""#"#"
- at 30BB2AAXX080903:3:8:1731:1740#0
-CTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACAGATCGNGCATCANN
-+
-67777788888888888888888877776555443222100//.-.,-,+,+++****)())(((''"""#&##""
- at 30BB2AAXX080903:3:43:398:1158#0
-TGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAG
-+
-67777788888888888888888877776555443222100//..---,,,++****)*)())(((&'&%&&%%""
- at 30BB2AAXX080903:3:35:812:1787#0
-TTTCGAATATCTTGTTCATTGTTAAGGTTGTGGATGATGGACCCGGAGCACATAAATAGTATGGCTTNGACACTAN
-+
-677777888888888888888888777765554432221001.-.-,--,++*+))*))()))('(&"##%$$"$"
- at 30BB2AAXX080903:3:45:810:764#0
-TACTATTTATGTGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGCATAAC
-+
-67777788888888888888888877776565443222100//..--,,,+++***))))*()((('%%##"""""
- at 30BB2AAXX080903:3:60:479:723#0
-GGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGTTCATTGTTAAGGTTGTGGATGAGATAGGAAGCGCACGNN
-+
-67777788888888888888888877776555443222100//..---,+++***))*()))#((''&"&%#$"""
- at 30BB2AAXX080903:3:60:376:823#0
-TGCTCCGGGTCCATCATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAGTNGANN
-+
-67777788888888888888888870776555443222000//.-.-,,,++****)*))())((('%%&"""#""
- at 30BB2AAXX080903:3:55:923:1011#0
-GTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGTTCATTGTTAAGGTTGTGGAGGTTGTCCC
-+
-67777788888888888888888877776555443222000//..---,,++*****)))(((((''$&"$"###"
- at 30BB2AAXX080903:3:2:886:107#0
-AGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATCTTGAGATCGGAAGAGTGGTTCACNCGCAACA
-+
-6777578888888888888,8038./67.05048332+0/1/./,.,,,,*+#**)()()#)(%'##""%$#"$##
- at 30BB2AAXX080903:3:33:772:1141#0
-CATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCNCTCGACNN
-+
-67777788888888888888888877776555443322100/...----,+,+***))))*('((''"$####$""
- at 30BB2AAXX080903:3:57:1094:1151#0
-CATCCACAACCTTAACAACGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTGCATAC
-+
-67777788888888888838888877776555443222100//..---,,++++****))))(((('$$&""###"
- at 30BB2AAXX080903:3:33:791:1659#0
-CACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTAGATCNCACCTANN
-+
-67777788888888888888888877776565443222100/../--,,,+++*****()))(((('"$%"$""""
- at 30BB2AAXX080903:3:60:1262:580#0
-CCCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTCCTCAAAACCATACCTCTCACTTCAACCCCACTANN
-+
-*777778888888888888888887777655544322210,./..,-,+,&++*+*)))))((%''''#&#$""""
- at 30BB2AAXX080903:3:60:1263:579#0
-ACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCACACNN
-+
-67777788888888888888888877776555443222100//..---+,++++**))))))))'''$&%#%$$""
- at 30BB2AAXX080903:3:43:737:1917#0
-GTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATAGATCGGAAGAGCGGCTCTC
-+
-67777788888888888888+88*777765554431.2+-/.+.-+--,-++*'&*)*))'))&&(''#%"#"##"
- at 30BB2AAXX080903:3:56:1542:996#0
-AACGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACACTTGCCA
-+
-67777788888888888888888877776555443222100//..-,-,,+++****))*)(((''&$$%$%##$%
- at 30BB2AAXX080903:3:47:1709:1411#0
-CTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGAATATATTGTCCAT
-+
-67777788888888888888888877776555443222100//..-----+++*+*))))))(((('"%"""##""
- at 30BB2AAXX080903:3:44:1690:1260#0
-GCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTGATCGGAAGCGGGTG
-+
-677777888888888888888888774745554/2222/00/-...--+$,,***(*)))%(((&('$"%#"""##
- at 30BB2AAXX080903:3:57:875:335#0
-CTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTAGATCGGAAGNATGCCC
-+
-67777788888888888888888877776555443221100/...---,,++++**))*))))('''%&""$####
- at 30BB2AAXX080903:3:42:1034:1784#0
-AAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTACC
-+
-67777788888888888888888877776551443222000//..----,+*+*******()(('(('%&&%%$"#
- at 30BB2AAXX080903:3:48:1571:2016#0
-ATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATTTTTCGTACGTC
-+
-6777778888888888888888882777652141302-10&....%+,,,*+')*'&#)#'(&'(''"$$#$#"""
- at 30BB2AAXX080903:3:3:704:1274#0
-TATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTCACTTAAACCTCCATCACCATTGGCAGCCNCGTANAC
-+
-6777778888888888888818887777652544122200.+/,%,,,++++')*+)))(((((((&'"#&$#"$"
- at 30BB2AAXX080903:3:40:1025:2020#0
-CTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCCTCCTATCTTTCGAAT
-+
-677777888888888888888888777765754/322200///*----+,,+++*)**)&')''(''$$#%#%###
- at 30BB2AAXX080903:3:44:799:1882#0
-CCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGCATGGTTTTGAGTAGTGCTCCTAGTNTGC
-+
-6777778888888888888848887'7-655144-22*.0&/,.---#,,,+%*)**()(()#'(&(%"##%"#"#
- at 30BB2AAXX080903:3:3:390:1182#0
-TATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTTGAGTAGTCNCTCGNAC
-+
-67777788888888888888888877776555443322.00...,-,-,,+)+***#*))*((('(''"%$%#""#
- at 30BB2AAXX080903:3:45:814:637#0
-GAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGGATGGTTTTGGGGAGGCGT
-+
-67777788888888888888888877776525443222100//.,--,,,+++***)&)*)('((((%&"#%"##"
- at 30BB2AAXX080903:3:35:1471:1981#0
-GGACTACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAANACTCCAGN
-+
-67777788888888888888888877776553343322100//..--,,,++****(*()('(((#'""%"####"
- at 30BB2AAXX080903:3:1:871:1913#0
-GAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTGAGGGAGGTTGAAGTGAGAGGTATGGTTTNTCNGTGC
-+
-6777778888888888888808887777655544-222/0///..--+,,)*+)***)))'(()('&&"$%""##"
- at 30BB2AAXX080903:3:46:799:732#0
-GAGGAAAGGTATCCCTGCGAATGCTAGGCCGCCAATGGTGAGGGGGGATGCTGTGAGAGGTATGGTTGCGTGCAGG
-+
-677777888288%88883#88828&77+2%514(2222*00//.%-&&,,$&)$*'')))%(''(#'%#$""%$"#
- at 30BB2AAXX080903:3:48:1712:639#0
-TACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATAGATCGGAAGAGCGCGACCACG
-+
-67777788888888888888888877776555443222100//..-,-,,+,++***()*)()((('$"""##"#"
- at 30BB2AAXX080903:3:8:1132:1392#0
-TACTCAAAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCNTCACCCNN
-+
-67777788888888888888888877776555443222100//..---,,+,+****))))()((''"$"$$##""
- at 30BB2AAXX080903:3:52:1350:805#0
-AAACCATACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCCCAGGTTC
-+
-67777788888888888888888877776555443222100//..--,,,+,+**))*))))(((('"$%%&%"""
- at 30BB2AAXX080903:3:47:480:1397#0
-TACCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGCTTCATCTC
-+
-6777778888888882888888887777655544122010./...+,-,,,++))))*%(((('(&'"""$""#""
- at 30BB2AAXX080903:3:41:1509:1803#0
-GGAGTAGAAACCTGTGAGGAAAGGCATTCCTGCTAATGCCAGGCTGCCAATGGTGGGGGAGGTTGCAGTGAGCCTA
-+
-67775788888888888888888,6777)555,4%212.%,/-#--+,,(++*$+#**)&))#'(#'%%%$""##"
- at 30BB2AAXX080903:3:37:221:169#0
-CCTCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGAGTNGAGTTNN
-+
-677(778,8888.8888888888877476555442222100//..--*--+++***)()))()((''&"%&%"$""
- at 30BB2AAXX080903:3:46:1746:264#0
-TCTCACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAAGATCGGAGGCGAGC
-+
-67777788888888888888888877776555343222100//...-,,,++****)*)))(((''($%""#"""#
- at 30BB2AAXX080903:3:55:30:1588#0
-GATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCAATGGTCCCTCGT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((('&'#"##"#$#
- at 30BB2AAXX080903:3:2:390:1386#0
-TTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCTGCCANTGGNCTG
-+
-67777788888888888888888877775555443222001//.----,,+,+**+**)())((((''"#&#"%$$
- at 30BB2AAXX080903:3:36:1523:1305#0
-GCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCTAGGCACACTCCNN
-+
-6777278888888888888888857'7.45624432211/0/..---',,,,)+*)*()))'((((%$"#%"$#""
- at 30BB2AAXX080903:3:55:861:1298#0
-TTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGAGATCGGAAGCGCGGTCTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*))*(((((&%%#$%####
- at 30BB2AAXX080903:3:52:1568:83#0
-TGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATCATCGAAACAGCAAAA
-+
-67777788888888888888888877776555443222100/...---,,+,+***)**))(((''&%'%"#""##
- at 30BB2AAXX080903:3:34:301:1637#0
-TGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTAATGCNCGCAAGNN
-+
-67777788888888888888888877776555443222000//..---,,+++****))))()((''"%#$"""""
- at 30BB2AAXX080903:3:48:801:936#0
-TATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCAGATCGCGTGCTA
-+
-67777788888888888888888877776555443222100//..---,,,,+***)*)))(()'('&$""""#""
- at 30BB2AAXX080903:3:33:1147:994#0
-CTAGCATTAGCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATCATCGAAACCGCAANCCACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&"##"%#%""
- at 30BB2AAXX080903:3:3:435:246#0
-ATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCGNATGCNTN
-+
-67777788888888888888888877776555443222100///----,,-++++*))))))(''(&%"#%"#"""
- at 30BB2AAXX080903:3:57:1309:699#0
-TATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGTATTCCTGCTACACCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((('''&#$###"
- at 30BB2AAXX080903:3:43:1428:1750#0
-GCAGGAATACCTTTCCTCACAGGTTTCTACTCCAAAGACCACATAATCGAAACAGCAAACATATCATACACAACCC
-+
-677777888888888888888888387765553&5101100//+,---,,+++)*%)))()((((('''%$%##"#
- at 30BB2AAXX080903:3:42:1341:902#0
-GCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGGNATGCCTG
-+
-677777888888888888488888737765.54432-21.0//..---,,,++**))*)))(((((('"$&"%$##
- at 30BB2AAXX080903:3:59:313:363#0
-TCAGGCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGGTCTTTGGAGTAGAAACCTGTGAGGAAAGCANNT
-+
-67777788888888888888888877776355443222100//..---,,++***)*)*()()(('('&"&$#"""
- at 30BB2AAXX080903:3:56:1654:1651#0
-GGTTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGCCCTATACCAACACA
-+
-67777788888888888888888877776555443222100//..---,,+++***())))((('(&&&%%#$%%%
- at 30BB2AAXX080903:3:2:1014:1698#0
-GTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGTATGATATGTTTGCGGTTTCGATGATGTGNCTCTCGT
-+
-6777778888888888888888887777655541332.100//--,,-+,+,**+)*)()()((((&&""##$$""
- at 30BB2AAXX080903:3:49:1259:1767#0
-CATCATCGAAACCGAAAACATATCATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCACCTTCACT
-+
-27777788888888$881888888777363254330/21.1++,.,-+,,+++))**))*((#('%'"##"##"#"
- at 30BB2AAXX080903:3:38:403:1455#0
-TTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGTATGATATGTTTGCGGTATCGTCGCC
-+
-67777788888888888888888877776545443232110/..-.--,,+++*****)))))((('"&#&"$"##
- at 30BB2AAXX080903:3:46:165:1888#0
-CTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTTGTGGATGATATGTTTAGATCGGCCGAGC
-+
-67777788888888888888888877776555443221100//-..--,-,)+*****))'((((('&%%###"#"
- at 30BB2AAXX080903:3:36:370:1925#0
-CGCAAACATATCATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCTCCCTAACAAGACTCACACNN
-+
-67777788888888888888888877776525443222100./...,-+,,,++**)***(()(((#%"%"%"#""
- at 30BB2AAXX080903:3:35:602:1105#0
-TATTCGAGTGCTATAGGCGCTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGGGCTCAGGCGTTANCTCTACTN
-+
-67777788888888888888888877776455443221100/..,---,,,++***())())')%''"%#$###""
- at 30BB2AAXX080903:3:49:1686:677#0
-ATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGCTACCTCCCTAACAAGAGATCGGAAGAGCCTCCGCACA
-+
-6777778882888888888888887777655.4432220/0//-.--+,-+*+*+***))))()((#%"$#"$#$"
- at 30BB2AAXX080903:3:34:801:910#0
-GGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGTTAGGGAGGTAGCGATGAGAGTAATAGATAGNCAAGATNN
-+
-67777788888888888888888877776555443222100/...+--,,,,+***)())))(((('"$$#"##""
- at 30BB2AAXX080903:3:36:96:1682#0
-CGCTACCTCCCTAACAAGCGCCTATACCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTACCCNATN
-+
-67777788888888888888888877726555443222100//..---+,+,++**))))))((('&$"$$$"$""
- at 30BB2AAXX080903:3:59:691:335#0
-CGCTACCTCCCTAACAAGCGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGAGATCAACNC
-+
-67777788888888888888888877776555443220100//..-.--,+++****)))))(((('&&#$##$"$
- at 30BB2AAXX080903:3:56:1682:205#0
-GTAAGGGTGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGCACACACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&&%%#$%$%
- at 30BB2AAXX080903:3:39:1645:1004#0
-TAGTAAGGGTGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAGAATTATTCGAGTGCTATAGGCGCTTGGCTATCA
-+
-677777888888888888888888777765554432/2100//..---,,+++****)*))(()''('&%$%#"$"
- at 30BB2AAXX080903:3:39:1190:1461#0
-CAAGCGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCAGATCTGCGCTTCT
-+
-67777788888888888888888877776555443222100//..---,,+++******)))()((&$&"""""#"
- at 30BB2AAXX080903:3:46:306:1636#0
-CGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACACGCTCGGA
-+
-67777788888888888888888877776555443222100//..---,,++++*****)))((((''%$#"#$#"
- at 30BB2AAXX080903:3:51:751:1889#0
-TAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATAGATCGGGATAAC
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('('&$""""""#
- at 30BB2AAXX080903:3:39:1197:550#0
-AGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGGGGGGAAGCGAGGTTGACCTGTTAGGGTGAGAAAAATACCAG
-+
-6777778888888888888888880777455544%222110//..--+,,+&+**))**))((('('$""%$####
- at 30BB2AAXX080903:3:40:1571:1053#0
-ATGGGGTTTAGTAGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGTGGGGAAGCGAGGTTGACCTGTTGCGTGAT
-+
-67777788888888888888888877776555443222000//..-*-,,+++***)))()(('((''&%$&#"""
- at 30BB2AAXX080903:3:46:220:1335#0
-AGGTCAACCTCGCTTCCCCACCCTTACTAACATTAAAGAAAATAACCCCACCCTACTAAACCCCATTAGAACACTG
-+
-677777888888888882888888777765554432%2000//.-%--+,-*++++)*))))(((''&$"#%#%#%
- at 30BB2AAXX080903:3:39:1488:1570#0
-GCTGCCAGGCGTTTAATGGGGTTTAGTAGGGTGGGGTTATTTTCGTTAATGTTAGTAAGGGTGGGGAAGTCTGCCA
-+
-67777788888888888888888877776555443222100//..---+,++++**)*)))((('''%$""#"##"
- at 30BB2AAXX080903:3:2:1390:1379#0
-TGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGTTTAGTAGGGGGGGGTTATTTTCGTTAATGTNTGTAGTC
-+
-6777778888888888888888887775635344322+10./-,--.#,,++*)***))(('(&('''""%""""#
- at 30BB2AAXX080903:3:58:1402:645#0
-CCTGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGGTTAGTAGGGTGGGGTTATTTTCGTTAATGTATGACA
-+
-677777888888888888888888777765550432221%0/...---,,+++*&*)))))'))'''$$&"""$$$
- at 30BB2AAXX080903:3:8:1401:1341#0
-AATCCTGCGAATAGGCTTCCGGCTGCCAGGCGTTTAATGGGGTTTAGTAGGGCGGGGTTATTTTCGTNCTCTCTNN
-+
-64777788888888888888883)7777/5154,.-1-10//#.,+-*++,+#+**)(('&)(''''"$%#"##""
- at 30BB2AAXX080903:3:57:203:555#0
-GGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGAAATCCTGCGAATAGGCTTCCGGCTCGGTTGGGATGTCT
-+
-67777788888888888888888877776555443220100./..,-,,,,+++**()*)&(#'#%#$%#"#"###
- at 30BB2AAXX080903:3:51:303:1022#0
-GCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCATTACTAACAACATTTCCCCCGAGATCGGAAGGCACAGCGC
-+
-6777778888888888888888887777655544+2121&00/,..,-+,*)***))()'#(((('&%$#####"$
- at 30BB2AAXX080903:3:1:919:1238#0
-GTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGAAATCCTGCGAAGATCGGAAGAGCNGTNATCT
-+
-677777888888888888888888777165/)4/322200,//./.,++,+,+**)*)(()('('%'&"##"###"
- at 30BB2AAXX080903:3:4:1652:529#0
-TGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAATGAGCNTGGTNTN
-+
-67777788888888888888888877776555443222100/-..---,,,++***))')()(((''""&&#%"$"
- at 30BB2AAXX080903:3:36:303:1975#0
-GCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTTGTTAGTAAGTACACANN
-+
-6777778888888888888888887777655544321.100//-.-,-,,++***+*)))))((('%"""$"$$""
- at 30BB2AAXX080903:3:38:217:1646#0
-GACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGAGATAGGAAGCGGACCGA
-+
-67777788888888-83888888877770555441222100///.-*,,,+++(**())))'')(('&#""###""
- at 30BB2AAXX080903:3:46:1507:923#0
-TGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGAAATGTGATCACT
-+
-67777788888888888888888877776555443222100//..--,-,+++***))))))(''('"#"""####
- at 30BB2AAXX080903:3:8:1493:824#0
-AAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGGGGATGCGGGGGNCACCACNN
-+
-67777788888888888888888877776555443222110//..---,,+++***)))))(((((&"$"##"#""
- at 30BB2AAXX080903:3:4:1012:1341#0
-GGAAAGTGACAGCGAGGGCTGTGCGTTTTAGGCAGAGGGGGATTGTTCTGTGGAAGGGGGAGGCGGAGNACGCNGN
-+
-67777728888888)8388'8$8&73476255%330+210.%.-.,,&'*+**()*)())&%('((&"""&%$"$"
- at 30BB2AAXX080903:3:56:424:538#0
-AGGAAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTAGATCGGAAGAGCGGTTCAGCCGCGACGC
-+
-67777788888888888888888877776555443222100//..---,,,,+**))))))(#(('($"&$""#"#
- at 30BB2AAXX080903:3:54:246:1321#0
-CCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTAGATGTACACTA
-+
-677777888888888888888888727765554432221000/..---,,+,++****)())()'('$"""$#$""
- at 30BB2AAXX080903:3:58:628:423#0
-CCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTATACGAC
-+
-67777788888888888888888877776555443222110//..-.-,,,++*+**)*()()((''''$"##"#$
- at 30BB2AAXX080903:3:45:783:2045#0
-GAAGTCCTAGGAAAGTGAGAGCGAGGGCGGTGGGTTTTAGGTAGAGGGGGATTGTTGTTTGGAAGGTGAGCGAGGG
-+
-6777778888888888880888887772(5)5)42221.00-).%---,,+,)+*)(*)())'#((&$"%##$"#"
- at 30BB2AAXX080903:3:54:1368:1964#0
-GCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTGTGAGTTTTAGGTAGAGGGGGATTGTTGTTTGGTGTGCAC
-+
-677777888888888888888888777765554452221.0//...----+,+****)))))()(('$""$%$#"#
- at 30BB2AAXX080903:3:42:1717:204#0
-CCCCTTCCAAACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACCACC
-+
-67777788888888888888888877776755443222101./.----,,+++*)&)*(#'((((&'&%&#"""#%
- at 30BB2AAXX080903:3:36:1734:565#0
-ACAACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCNAGATCTNN
-+
-6777778888888888888888887777655544322210.//..---,-,++++))**)*))((('""##"$$""
- at 30BB2AAXX080903:3:4:1196:1002#0
-AACAATCCCCCTCTACCTAAAACTCACAGCCCTCGCTGACACTTTCCTAGGACTTCTAACAGCCCTACNCACTNCN
-+
-67777788888888888888888877776555443222100//...--,,++****))))))((((&$"%%$%"#"
- at 30BB2AAXX080903:3:39:1000:1553#0
-CCTCTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTAGCTACCA
-+
-67777788888888888888888877776555443222100//..-,-,-+,+*)***)))()(('(&$"'&&"##
- at 30BB2AAXX080903:3:58:866:1006#0
-TGGTTAGGTAGTTGAGGTCTAGGGCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTAGATCGGAATGGCGCTC
-+
-67777788888888888888888877776555443222100//..---,,+,+++*)))))))'(('$$#&"%###
- at 30BB2AAXX080903:3:37:667:1687#0
-CTACCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTACTACAN
-+
-67777788888888888888888877776555423222100//-.----,+,++**)*))))(((('$###"#$#"
- at 30BB2AAXX080903:3:48:1298:1992#0
-TTGTTGGTTAGGTAGTTGAGGTCTAGGGCTGTTAGAAGTCCTAGGAAAGTGACAGCGAGGGCTGTGAGGTCTCGCA
-+
-677777888888888888888808777765554431121-./...,-,,,+++**))())(#(('('$"#"$#"#"
- at 30BB2AAXX080903:3:56:155:1614#0
-AACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAACCAACACAGCCAC
-+
-67777788888888888888888877776553443222100//..-.-,,-++**+)**))))(('''&#$$"###
- at 30BB2AAXX080903:3:4:380:1658#0
-TTCTAACAGCCCTAGACCTCAACTACCTAACCAACAAACTTAAAATAAAATCCCCACTATGCACATTANATTTNTN
-+
-6777778888888888888888887777655544322-100...-..,,-,,+**)))())()((''"""&"#"#"
- at 30BB2AAXX080903:3:56:1219:694#0
-GAGAAATAAAATGTGCATAGTGGGGATTTTATTTTAAGTTTGTTGGTTAGGTAGTTAGATCGGAAGAGTGTGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$%%#"###$
- at 30BB2AAXX080903:3:60:1049:25#0
-CTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATTCTACCCTAGCATCACACCACCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)**)()()(('%##&$##""
- at 30BB2AAXX080903:3:51:1196:1390#0
-TAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGAATCCGAGTATGTTGGAGAAATAAAATGTGCTGAGCGGA
-+
-67777788888888888888888877776555441222100//...--,-++++****)))))(((''"""$#$$"
- at 30BB2AAXX080903:3:45:743:1497#0
-TTTTATTTCTCCAACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTTCCACGC
-+
-677777888888888888888888777765514232222/.//.-.-,,,+*+*(*)()'(((((''"""#""#""
- at 30BB2AAXX080903:3:47:792:1051#0
-TTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGGGTGTGATGCTAGGGTAGAATCCGAGAGAAGTCGTGACC
-+
-67777708888888888884882877779'5544+22-1'0/.,,-"*,,+,#**)*((%(')(((#$"######"
- at 30BB2AAXX080903:3:53:1409:1325#0
-TTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGAATCCGAGTATGCTTGCGTAA
-+
-6777778888888888888888887777655544222/100//..---,,++*+*))*())(((((($##&"""#"
- at 30BB2AAXX080903:3:39:253:1770#0
-CTCCAACATACTCGGGTTCTACCCTCGCATCAGGCACCCCACACTCCGCTATCTAGGCATTCTTACGCGTCTCCAC
-+
-(7.7278888,88)-%+888%3085'%+1)65,11%+,.0/$.#,$-(+,),'$)##)(('#&(''%$""#$"$#$
- at 30BB2AAXX080903:3:60:1613:1509#0
-AACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGACACACAACNN
-+
-677777888888888888888888777765554432221000/..---,,,++*)*)*))))((''&$$%%"$%""
- at 30BB2AAXX080903:3:49:52:1174#0
-ACATACTCGGATTCTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCACAACCTGCC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((((&"$#"%#"##
- at 30BB2AAXX080903:3:33:234:393#0
-AGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTGTGATGCTAGGGTAGANCCACTCNN
-+
-677777888888888888888888777765554402221/0//..---+,++****)))()))#(('"%%%%##""
- at 30BB2AAXX080903:3:54:1013:1584#0
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACCTCTCCTA
-+
-67777788888888888888888877776555443222110//..--,,,+*+****)())((((('&%"&%%%$$
- at 30BB2AAXX080903:3:49:931:491#0
-CCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCCTNCGCCAC
-+
-67777788888888888888888877776555443220100//..---,,,+++****)))')((''"""#""#"#
- at 30BB2AAXX080903:3:57:850:790#0
-CCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCTCCTCCTCC
-+
-67777788888888888888888877776555443222100//..---,,,,++**)))))))('(('&&%$#"##
- at 30BB2AAXX080903:3:35:1122:44#0
-TAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGTGTNTGCCTCNN
-+
-67777788888888888888888873776555443222100//..-,--,,++**)())()(((''%""$####""
- at 30BB2AAXX080903:3:3:1318:1012#0
-TAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGGGGTGGTNTGTCNAC
-+
-677777888888888888888038715765401/2..-0.,..(,*)++()++**#%()#'#'(#'&""%"##"##
- at 30BB2AAXX080903:3:33:93:1601#0
-GGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGCGGNTCGTGTNN
-+
-67777788888888888888888877776555443232000/...-,-,+++**++)))'))(('('"$%"#"#""
- at 30BB2AAXX080903:3:48:882:1982#0
-CAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTAGATCGGGCGA
-+
-6777778888888888888888887777655544320200/-..----'++)+**)))))'((('&'"###"""#"
- at 30BB2AAXX080903:3:1:1215:888#0
-GTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGNGCNTACT
-+
-67777788888888888888888877776555343222111//.----+,+****)***))(#%((%%""#"""#"
- at 30BB2AAXX080903:3:50:991:1594#0
-GTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGATTGTGTGATACCA
-+
-67777788888888888888888877776555443222100/../-,--,(++**(*()))(&((('%"$"""###
- at 30BB2AAXX080903:3:35:1367:1708#0
-CTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGCCTAGATAGGGGGTNTGCACATN
-+
-67777788888888888888888877776555443.221001/.--*--,+,+(*'())(()))(%'"$$$#$##"
- at 30BB2AAXX080903:3:57:1070:340#0
-GCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACGACTCAC
-+
-67777788888888888888888877776555-43220100//..'--,++*+*+')*))''(((('%'"#$"###
- at 30BB2AAXX080903:3:37:1017:83#0
-CTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGGTTTGGCTCGTAAGAAGGCCCAGCTAGCGTGGCTNN
-+
-6777778888888888888888887777654544322110&//..--+-)*'****')#(##(##&'$&$%#%#""
- at 30BB2AAXX080903:3:50:1755:1702#0
-AGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGGGCAGTCTC
-+
-67737788888888888888888877776555443222110//..---,+,++***)*)((((((&'""##""#"#
- at 30BB2AAXX080903:3:41:1740:887#0
-TTAGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGGAGGAGTAGGGGCAGGTTTTGGCTCGTAAGAAGGATTCTAT
-+
-67777788888888888888888877776555443222100//..---,,+)+***)**))#(((('&$"#"#"##
- at 30BB2AAXX080903:3:33:1694:740#0
-TTACGAGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCGAAAACNACACACNN
-+
-677777888888888888888.88.77765454431220..#'.%-+-+,,+++**'()'(''('(%"#%$$$$""
- at 30BB2AAXX080903:3:38:1488:1643#0
-AGCCAAAACCTGCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCCGT
-+
-67777788888888888888888877776555442222100./..---,,+++**)*)))))((('''"%$#$#"#
- at 30BB2AAXX080903:3:52:1596:1556#0
-TGGAGGTGGAGATTTGGTGCTGTGAAATTGTTTTAGGTAATAGCTTTTCTAGTCAGGTTAGGTCTAGCACAAGAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('"""##"##"
- at 30BB2AAXX080903:3:35:757:516#0
-ACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCNACTCCANN
-+
-6777778888888888888888887777655544322210//...---,,+++++***))())((('""%%"##""
- at 30BB2AAXX080903:3:44:635:77#0
-CCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCACCCCAAAA
-+
-67777788888888888888888877776555443222100//,/.-,,,++++**)*)()(()((''"%&%$%#%
- at 30BB2AAXX080903:3:48:356:1388#0
-TTATGCCTTTTTGGGTTGAGGTGATGATGGAGGTGGAGATTTGGTGCTGTGAAATTGTTTTAGGTAATAGGCTTCC
-+
-677777888888888888888882777765554/3202.00//..---,-+(+***)*))))((('($$$"##"#"
- at 30BB2AAXX080903:3:42:833:1839#0
-AAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAAT
-+
-67777788888888888888888877776555243220100//,.'--,,+++*+())))()()((''&%"""##"
- at 30BB2AAXX080903:3:53:369:1855#0
-CCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAATTCTACCG
-+
-67777788888888888888888877776555443222100//..---,,++++*))))))))('(&$"#$&##"#
- at 30BB2AAXX080903:3:56:418:1180#0
-TAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTCTACTAC
-+
-67777788888888888888888877776555443222100//..----,++++**)))))(((((''$#&%%#"%
- at 30BB2AAXX080903:3:46:1017:165#0
-ACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTCCCTCT
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))))((((%$$##$$##
- at 30BB2AAXX080903:3:57:457:665#0
-CACAGCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCCT
-+
-67777788888888888888888877776555443222100///.--,,-,++****)))*))((('&'"$""###
- at 30BB2AAXX080903:3:51:271:1380#0
-CCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTCCCTCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((((''$$#"%&#$%
- at 30BB2AAXX080903:3:46:1263:423#0
-AGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATGATGGAGGCTCTGTGGG
-+
-67777788888888888888888877776655443222110//.,----,+++**))**))((((('$$#""#"#"
- at 30BB2AAXX080903:3:36:1672:1516#0
-TCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTAGATCGCTACATANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))((((&$""$$""""
- at 30BB2AAXX080903:3:39:324:274#0
-AGGATGAGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATGACGGATGCAC
-+
-67777788888888888888888877776555443122020//..---+,+++**+*))))(((''(&$$""$"$#
- at 30BB2AAXX080903:3:2:1557:1454#0
-GTTAGGATGAGTGGGAAGAAGAAAGAGAGGAAGTAAAGTTTAATTATGCCTTTTTGGGTTGAGGTGATNTGTACGC
-+
-67777788888888888888888877776555423222.000....--,+,,+*****(*)(((((''"""""#"#
- at 30BB2AAXX080903:3:33:1648:1183#0
-CCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTTCTTCCCACTCATNCGCTACNN
-+
-67777788888888888888888877776555443222100//.----,,+++***))))))(((('"%"#$#%""
- at 30BB2AAXX080903:3:52:300:450#0
-ATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTTCTTCCCACTCATCCTTGACCTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''""""$####
- at 30BB2AAXX080903:3:35:1368:1341#0
-TTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCCGAGCAATCTCAATTACAATANATCATACN
-+
-67777788888888888888888877776555443222100//..---,,,+*+**)))))(((((&"&%&%###"
- at 30BB2AAXX080903:3:52:130:672#0
-CCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCCGAGCAATCTAGATCGGAAGAGCGGCTCAGCAG
-+
-67777/88888888888888888877776555443022100//.-+-,+,**'*)*'))((()((''$$#$"%#$#
- at 30BB2AAXX080903:3:47:281:1197#0
-GGTTGAACATTGTTTGTTGGTGTATATATTGTAATTGAGATTGCTCGGGGGAATAGGTTATGTGATTAATCTCACG
-+
-6777778888888888888888887777655'443221100//..---,,++++**))*))()((('"""#""#""
- at 30BB2AAXX080903:3:43:547:317#0
-TCACATAACCTATTCCCCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((&&##%$"$"#
- at 30BB2AAXX080903:3:58:448:1757#0
-GGGCGTTGATTAGTAGTAGTTACTGGTTGAACATTGTTTGTTGGTGTATATATTGTAATTGAGATTGCAGCGATCN
-+
-67777788888888888888888877776555343222100//..---,,+++***))))))((('&&&%#""$#"
- at 30BB2AAXX080903:3:56:96:511#0
-CCCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTACTAGATCGGCTNGCTCGT
-+
-6777778888888888888888887777655544322210///..---,,++++**)))))((((''$""%%%%##
- at 30BB2AAXX080903:3:51:1374:267#0
-CCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACTACTACTAATCAACGNCNATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"$#"$"$#"
- at 30BB2AAXX080903:3:43:841:186#0
-GAAGGAGAGGGGTCAGGGCTGATTCGGGAGGAGCATATTGGTGCGGGGGATTTGTAGGATTATGGGCGTTGTGTGG
-+
-677777888888888888&888287777'55543"(0./0.+/&.-,,,(*,#+')&'&#%((('''$##$""#""
- at 30BB2AAXX080903:3:54:1409:1705#0
-GAAGGAGAGGGGTCAGGGGTGATTCGGGAGGGTCCTATTGGTGGGAGGGCTTTGTATGATTATGGGTGCGAGCACA
-+
-677777888888888888888828(777655'31/2)2.00-/$.%,'+,+))**'(*'(()(('''$#"#%%#$#
- at 30BB2AAXX080903:3:60:312:1326#0
-GAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCTTTGTAAGATCGGAAGAGCGCNGANN
-+
-67777788888888888888888877776555443222100//..---,,+++*+)*))*(((((''&$%$"""""
- at 30BB2AAXX080903:3:8:1707:1664#0
-GAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCTTTGTATGATTATGGGCNATCCAANN
-+
-6777778888888888882888887777655341321%100-/..-,-,,+)*+*)*)((()()('#"$##%"$""
- at 30BB2AAXX080903:3:55:462:1131#0
-AGGAAGCTGAATAATTTATGAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGGTGCGGGGGCATTGACT
-+
-6777778888888888888888887777655544322/100//..---,,,+++****))((((''&"""%$$##$
- at 30BB2AAXX080903:3:39:1400:1385#0
-TTTAATAGTGTAGGAAGCTGAATAATTTATGAAGGAGAGGGGTCAGGGTTGATTCGGGAGGATCCTATTGTCTCGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))()&((''%%#$$#"#
- at 30BB2AAXX080903:3:51:117:880#0
-GCACCAATAGGATCCTCCCGAATCAACCCCGACCCCTCTCTCTCATAAATTATTCAGCTTCCTACTCCACGTCATC
-+
-+7777708888388888488828827776$561422-11/&)/-'-)+*%+)+)&''((&'&)'(&%$"#""#""#
- at 30BB2AAXX080903:3:34:1602:1855#0
-TCCTCCCGAATCAACCCTGACCCCTCTCCTTCATAAATTATTCAGCTTCACACACTCTTAAAAGATCNCTCTCGNN
-+
-6777718888888888888888887777:-3-.1323-100./#.,-*+$$++*))&'()'(('###"$"$#%"""
- at 30BB2AAXX080903:3:50:816:964#0
-GATGGGGGGGTGGTTGTGGTAAACTTTAATAGTGTAGGAAGCTGAATAATTTATGAAGGAGAGGGGTCGTCCAGCA
-+
-6777778/88888888(888888-77776555$42222100'..,--,,,++*+*)*))))(()((&$"""#""##
- at 30BB2AAXX080903:3:52:1384:1857#0
-TGACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCACCCCAGATCTGCCA
-+
-677(5088388188888888888871773550/42*1$100/---.--,,(*+'**'#)'#((#%%%"""&&%""#
- at 30BB2AAXX080903:3:38:208:1288#0
-GTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGTGTAGGAAGCTGAATAATTTAGATCGCAACAT
-+
-6777778888888888888888887777655,043'221&0//.--,,,,+++'**'*))))(((''%"#""###"
- at 30BB2AAXX080903:3:36:1039:1295#0
-CTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCACCCCATCATACTCTCTGTGN
-+
-67777788888888888888888877776555443222100//..---,,++++**)**)))))(''$&&$%%%#"
- at 30BB2AAXX080903:3:58:312:1709#0
-ATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGTAAACTTTAATAGTGTAGGAAGCTGNATACNN
-+
-67777788888888888888888877776555543222&00./.',,,+,++***))))')()(((#%&"%$"#""
- at 30BB2AAXX080903:3:2:271:1903#0
-GGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGAGGAGATCGNCGANNTC
-+
-67777788888888888888'8.8.777655543%22+10-0/,.-)+,,++**)*)))')&'((&%%"#"#"""#
- at 30BB2AAXX080903:3:54:1619:660#0
-GGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTTGTGGGAAACTTTAATAGTGTAGATACAACATCCA
-+
-67777788888888888888888877776555443222100//..---,,(++***)))))(((''#$$&%%"###
- at 30BB2AAXX080903:3:44:1069:135#0
-GATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGGGGGGGGTGTGGGAAACTTTCACAGTCGGCAG
-+
-67777788888888888888888877776255441222100//.---&,,+*+*+*()#)'%((#(#""""%%""#
- at 30BB2AAXX080903:3:54:476:1819#0
-CACTATTAAAGTTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCTCTCGCCTA
-+
-67777788888888888888888877776555443222100//...--,,,++****))())(((((""$%%$#""
- at 30BB2AAXX080903:3:48:318:1422#0
-TGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGGGGGGGTTGTGGTCGAAGCCTC
-+
-677777888888888888888818777765554432#2+-0//.,-.--,+++*&*)&))&((''('$"""###"#
- at 30BB2AAXX080903:3:44:1552:1847#0
-TAAAGTTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCAC
-+
-67777788888888888888888877776550453222100//..---,-++++****)*)()(((&'#&&%%$#%
- at 30BB2AAXX080903:3:40:1399:1074#0
-TAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGGGAAAGAGTATGATGGGGTGGGGGGTGGTGTCGGTAC
-+
-677777888888888888888888777765554432221&0./..,-+,,+++***)'))(()'(('"$%&"#"##
- at 30BB2AAXX080903:3:47:1125:428#0
-TTTACCACAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCAGATCGGAGTTGTTAT
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))))((('&#"#""""#
- at 30BB2AAXX080903:3:38:981:596#0
-TTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTCTCATCTCA
-+
-67777788888888888888848897776555423222000/).,-,-+,,++**))*))')(#((%"%"&%$%$#
- at 30BB2AAXX080903:3:49:548:943#0
-GTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGTGGTGTCTCCGC
-+
-67777788888888888888888877776555443222100//-..--,,+,+***)))))(((''&"$"#"##"#
- at 30BB2AAXX080903:3:1:1177:1935#0
-GAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGGNGCNACTC
-+
-67777788888888888888888877/76355443222/00//-.---,,-++**)))))))(('&'&""#""#"#
- at 30BB2AAXX080903:3:59:715:1055#0
-TGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGTATGATGGGGTGTGCATCCA
-+
-67777788888888888888888877776555443222100//..---+,,*+***)*))))(('''$%%$#"##$
- at 30BB2AAXX080903:3:41:1158:1111#0
-CAACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAAGATCGGAAGAGGCTTCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+++*****))))()((&'%"""#$#"
- at 30BB2AAXX080903:3:56:1714:605#0
-AACCACCACCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAAACCCACCAAACAAAACACA
-+
-67777788888888888888888877776/158/50200%&...--+--)),*+(&)$)))&'%'&'&%%%%$%$$
- at 30BB2AAXX080903:3:51:407:596#0
-GGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGGAAGAAGATCGGAAGGCTATAGTC
-+
-67777788888888888888888877776555023222100./..---,,)+%*+**)))(&)('''"$"""""##
- at 30BB2AAXX080903:3:57:1377:1215#0
-TTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAGGAGTATGATGGTGCACNCT
-+
-67777788888888888888868877756555441222000//(.(---,,+)*&)))#)#')('&&$%%$%$"#"
- at 30BB2AAXX080903:3:4:562:859#0
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCNTCACNCN
-+
-677777888888888888888888777765754432211000.-.--,,,+**+***)()()((((#'"$#%$"#"
- at 30BB2AAXX080903:3:36:373:744#0
-TGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGCAATAGGTN
-+
-67777788888888888888888877776555443222100-/...--,,+++***)))%)((('''$$"#"""""
- at 30BB2AAXX080903:3:47:1645:1845#0
-TTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGAGCGCGCCGT
-+
-67777788888888888888888877776555443222100/...-,--,+++***))))')((((''#%"""#"#
- at 30BB2AAXX080903:3:46:1443:1289#0
-GTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGGTGAAAGCGCCTGAGC
-+
-6777778888888/88888888887777654544322210///.,----,+++*)*)')*)((((('$"""""""#
- at 30BB2AAXX080903:3:4:1232:1142#0
-GTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGAGATCGGAAGAGCGNCTCTNCN
-+
-6777778888888888888888887777655544322210///,.--,,,++****)(***(((((#""#$#$"$"
- at 30BB2AAXX080903:3:36:487:919#0
-TACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTGCACACACN
-+
-67777788888888888&8888883/776550443021200/./,--,,+,++**)*))))()(('%$%%%$###"
- at 30BB2AAXX080903:3:43:577:655#0
-CATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGTGCTGTGGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***)()))((('('$%#&#%$#"
- at 30BB2AAXX080903:3:3:1242:2005#0
-CACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCNCACNNCA
-+
-677777888888888888888888777765554430010..//-.,,-+(+)+*'*)&*')(#%&''&"$%"""##
- at 30BB2AAXX080903:3:59:317:793#0
-ACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCACCANNC
-+
-67777788888888888888888877776555443221100//..---,,+,++****)))((((('&$%###""#
- at 30BB2AAXX080903:3:36:678:1512#0
-GAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGGTCTGTGACGN
-+
-67777788888888888888888877476555423021100-//.-.-&,*+***+)*)))&&((#'&$&"##$#"
- at 30BB2AAXX080903:3:42:1717:975#0
-CAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('(&'$$&%%##"
- at 30BB2AAXX080903:3:39:1740:694#0
-TGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGGTTGGTGCGT
-+
-67777788888888888888188877276555142212000//.,---,+,+++*+)))()(&(('#$&#%""#"#
- at 30BB2AAXX080903:3:44:1057:981#0
-TGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGATTGGGGGTG
-+
-67777788888888888888888877776555443222100//..---,-+,+***)))()(()'('$&%&"$"#$
- at 30BB2AAXX080903:3:36:719:1454#0
-CTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGCAGGTTTCN
-+
-6777778888888888888888887775655543302.100//(.,--,,$**+'*&)))(()'&(&%$##"###"
- at 30BB2AAXX080903:3:38:1256:1995#0
-TCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTGCGATACACC
-+
-67777788888888888888888877776555443221100//...--,,++++**()))))'(('&$""""#"##
- at 30BB2AAXX080903:3:41:1234:732#0
-TCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGATGGAGGTAGGTGTGTAC
-+
-67777788888888888888888877776555443222100//...-,,,+++****))))()('%'&&#"#""""
- at 30BB2AAXX080903:3:54:1432:313#0
-ACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATAGCTCGTCAG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''$$#&%##%#
- at 30BB2AAXX080903:3:37:458:1311#0
-GAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGGGGTTAGCGAGCTCTATCN
-+
-67777788888888888888888877776559445222000//..---,-+++**)))))))((('#"$#$"#"#"
- at 30BB2AAXX080903:3:57:987:166#0
-ACCCCACTAAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCGGGATACTCCTCAATAGCAATACACCC
-+
-67777788888888888888888877776555343222100//..--,,,+++)**(*())((((('$""#$$###
- at 30BB2AAXX080903:3:43:1160:891#0
-ACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTGTTTTAGTGAGGA
-+
-67777788888888888888888877776554543222101./..-,-,,,+))+***()&)'(#'''"&"&"$""
- at 30BB2AAXX080903:3:33:998:1792#0
-TACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGGGTCAGGGGTTGAGGTCTTGGTGAGTNTCATTCNN
-+
-67777788888888888888888877776555443222100//..---,,-++***(*)))((('('"%%"""#""
- at 30BB2AAXX080903:3:35:437:1613#0
-AAAACACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCAACAAACCNCCACACTN
-+
-6777-788088888888888888877776575443222100//.,-,--),,+***))(*())'(('"$$$%$$""
- at 30BB2AAXX080903:3:2:1206:2010#0
-ACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATAGATCGGAAGANACANCAC
-+
-6777778888888888888888887777655544222210/././.,-,++*****())(')(''('$""#"""#"
- at 30BB2AAXX080903:3:3:670:1119#0
-GGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGAGATCGGAAGACNGATCNAC
-+
-67777788888888888888888877776555442222001//.-.-,,,+++**+)*))()(('(&""##%&"##
- at 30BB2AAXX080903:3:57:1319:1123#0
-GATGGTTGTCGTGGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGACAGGGGGGGCAGGTGTGNACACC
-+
-67777788888888888888,38877770545'42/21000-/.-.,-+,,,+*)#(*)(((%'('%'$#"%%"##
- at 30BB2AAXX080903:3:4:981:197#0
-GGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGGGCNCATCNTN
-+
-6777778888888888888888887777655244351210///..-+-,++++*'&))())''((''""%""$"""
- at 30BB2AAXX080903:3:50:134:1742#0
-TAGGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTAGATCGGACGATTCACA
-+
-67777788888888888888888877776555443212100//..---,,+,+*+*)))()))'(''%$"#"#$$"
- at 30BB2AAXX080903:3:49:443:697#0
-TTTAGGGGGAATGATGGTTGTCTTTGGATATACTACAGCGATGGCTATTGAGGAGTATCCTGAGGCATGACACTAC
-+
-67777788888888888888888877776555443322100//..---,,++++****((()(((('%#"%&""##
- at 30BB2AAXX080903:3:47:371:1552#0
-AAATTAAAAAAACTATTAAACCCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACCTCGCTACA
-+
-67777788888888888888888877776555443222011//..--,,,,++*****)(((()((&$"##$""##
- at 30BB2AAXX080903:3:50:721:698#0
-CTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCAATACTAAACCCCCATACATAGGCAA
-+
-67777788888888888888888877776555443222100//..---,-+++*****))(((((('"$$#""#""
- at 30BB2AAXX080903:3:41:282:259#0
-TAAGCCTTCTCCTATTTATGGGGGTTTAGTATTGATTGTTAGCGGTGTGGTCGGGTGTGTTATTATTNTTGCTTAT
-+
-6777778888888888888888887777655544322210///...--,,,++**()*)))(()(('"&%%#%#"#
- at 30BB2AAXX080903:3:1:487:1508#0
-TAACACACCCGACCACACCGCTAACAATCAATACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAANACNCGAC
-+
-6777778888888888888888887777631244312.0/0...-.,,+,,****))))((()(''($"#""$""#
- at 30BB2AAXX080903:3:55:697:1702#0
-TGAGTGTGGGTTTAGTAATGGGGTTTGTGGGGTTTTCTTCTAAGCCTTCTCCTATTTATCGGGGTTTCTATGGCCG
-+
-677777888888888%8888888,777765550131'11#0-/-,.*,,,$**)&))&)#)((('%'&#""""$#"
- at 30BB2AAXX080903:3:58:1711:719#0
-TGCGAGAATAATGATGTATGCTTTGTTTTTGTTGTGTGTGGGGTGTGGAATGGGGGTTGTGGGGTGTCACCAACAN
-+
-67777788888888888888$8887777)55544%222100//,.'-)%(+,+***())())((((%$$#%%$$$"
- at 30BB2AAXX080903:3:44:1661:724#0
-GAAGAAAACCCCACAAACCCCATTACTAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCCCGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)((('('%&&%"$%""
- at 30BB2AAXX080903:3:38:1109:476#0
-TAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTTTAGTAATGGGGTTTGTTGGTACGAC
-+
-67777788888888888888888877776555443222100./..---,(+++***)))))(%('''""#"""""#
- at 30BB2AAXX080903:3:36:1727:1255#0
-GTGGTTGTAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGGGTGGGGTTAGTAGATGNGTCGACNN
-+
-67777788888888888888888877776555443222100/....--,,(++***&))()(((('#"""$"""""
- at 30BB2AAXX080903:3:53:377:622#0
-CCCCATTACTAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCAAGATCGGAAGAGCGNGCCCTC
-+
-67*77788888888888888888877776555443222100///.----,+,++**)*))))((('&&"""##""#
- at 30BB2AAXX080903:3:56:1101:544#0
-TCATTGGTCGTGGTTGTAGTCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTTTTGCATACT
-+
-67777788888888888888888/7777627544322211///-.---,,+++***)))())()'%'"%%##""#"
- at 30BB2AAXX080903:3:40:628:1779#0
-ATCATTGGTCGTGGTTGTAGGCCGTGCGAGAATAATGATGTATGCTTTGTTTCTGTTGAGTGTGGGTAGAGTCTGC
-+
-67777788888888888888$888.77765504032211000/..---,,++****)*()))((('%$%##$#"$#
- at 30BB2AAXX080903:3:40:1313:293#0
-TAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTAAAACCACGACCAATGAGATCGAC
-+
-67777788888888888888888877776555443222200//..---,,+,+***)*)))((((('$$%#"#"##
- at 30BB2AAXX080903:3:59:414:1767#0
-AAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATGACGNNA
-+
-67777788888888888888888877776555443222100//...----+++*+***))))((((&&"%"$"""#
- at 30BB2AAXX080903:3:52:416:608#0
-CACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAAGATCGGAAGCGGGGTGTG
-+
-67777788888888888888888877776555443222100//./----,+++*+****))(((((($$"""""""
- at 30BB2AAXX080903:3:41:1146:1701#0
-ACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGAAGAGCGGCACAGACAA
-+
-6777778888888888828888887777655342302210///.,---,,,++)')*'))))(#&('$&"$""$$$
- at 30BB2AAXX080903:3:46:1012:269#0
-CAACGATGGTTTTTCATATCATTGGTCGTGGTTGGAGTCCGTGCGAGAATAATGATGTATGCTTTGTTGCGTACGG
-+
-67777788888888888888888878)7*55'44*'20000)//.--,,*,+)+***()))&%((('"$$"""###
- at 30BB2AAXX080903:3:58:407:1023#0
-ACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCAGCGTATTCA
-+
-67777788888888881888888877770555443221100./,.--,+-++***)*()')((''('$"%%#""##
- at 30BB2AAXX080903:3:48:1175:103#0
-ACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTAGTCCACTAT
-+
-677777888888888888888888777765554432221-0//..-,-,,+++**))))*)((('''$#####"#"
- at 30BB2AAXX080903:3:46:355:658#0
-AAAGCATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTGTAGTTACCATA
-+
-6777//08//888&8888888828777365.644232110/--,-+,-,-+'+*(*)()(')(((''$"#$##""#
- at 30BB2AAXX080903:3:36:768:1852#0
-CATACATCATTATTCTCGCACGGACTACAACCACGACCAATGATATGAAAAACCATCGTTGTATTTCACCTACANN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))))('''$$%##%#""
- at 30BB2AAXX080903:3:49:1768:1457#0
-CTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGGTTGTAGTCCGTGCGAGAATAATCGTTACAT
-+
-67777788888888888888888877776555443222100//..---,,++*)*)))))))(((('"#"#""##"
- at 30BB2AAXX080903:3:59:154:426#0
-ATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGGCTGTTGTGCNNA
-+
-67777785888888888.8888887/776453243122000/'.---,,,+)*)*)*('&('((#''%"&""#""#
- at 30BB2AAXX080903:3:58:794:1427#0
-TTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTCGTGTGACTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$&%"""$#$
- at 30BB2AAXX080903:3:53:930:1485#0
-TAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGATGGTTTTTCATATCATTGGTGTTTCG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()(('$%##$"###
- at 30BB2AAXX080903:3:41:1378:1138#0
-ATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACAACGAGATAGTGCGCT
-+
-67777788888888888888888377776555413222100/..----,,+,+****)))))()(('""%#$"""#
- at 30BB2AAXX080903:3:4:1709:1062#0
-TTAATTAATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATTGGTGTTCTTGTAGTTGAAATACCNCGACNCN
-+
-67777788888888888888888877776555443222100//..--,,,+++****)))))(((('""%$&%"""
- at 30BB2AAXX080903:3:42:1230:1821#0
-GGTCGATGAATGAGTGGTTAATTAATTTTATTAGGGGGTTAATTTTGCGTATTGGGGTCATCGGTGTTCTTGTGGT
-+
-6777778888888888888888887777655544322200/0/..---,,,++***)(**)#(((''&&%%%%""#
- at 30BB2AAXX080903:3:33:761:934#0
-GAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGAAGATCGGAAGAGCGNCCACTGNN
-+
-67777788888882888888888377176552,43.22110)//.-$-,&(+'*+)'#))%'(&(&'"$##$""""
- at 30BB2AAXX080903:3:1:556:1495#0
-AATTAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCNCCNCACT
-+
-6777778888888888888888886777655544031-.0/-+.,-,,-+++**+))((('((%''%'"##"$"$"
- at 30BB2AAXX080903:3:53:398:112#0
-CAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGTCGAGATCGGAAGAGTCTATACA
-+
-677777888888888888888888777765/54432221/0//..,--,,,++&**'))'(()#'(%"$"#""###
- at 30BB2AAXX080903:3:53:995:1722#0
-CAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGTCGATGAATGAGTGNTTGGATAG
-+
-67777788888888888888888877776555343222100//...--,,+++***(*)()))((''""%%&#"##
- at 30BB2AAXX080903:3:36:1566:495#0
-TAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACCACACNN
-+
-67777788888888888888888877776655441222000//.-----,+++****))('(()(('&$##&"#""
- at 30BB2AAXX080903:3:54:1293:1705#0
-TAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCCTCACCTGG
-+
-6777778888888888888888807/+7255621522-0////./,*-,,-+++**))(((()(#(&"""###"""
- at 30BB2AAXX080903:3:46:98:802#0
-ATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCCCGGCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((((''"$$#$%###
- at 30BB2AAXX080903:3:2:647:98#0
-TAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCNCGCACCC
-+
-6777778888888888843/8888977715558/32/10..-..,,--+,,++*))*))'(((('(%&"%&%$$##
- at 30BB2AAXX080903:3:58:1268:216#0
-TAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTCTGNNA
-+
-67777788888888888-88888577716/52113.2201/./..--,,,++++**)*)()((((('&$##""""#
- at 30BB2AAXX080903:3:44:1572:680#0
-AACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCC
-+
-67777788888888888888888877776555443222100//..----,+++**+)**)))(((((%$%&$%#""
- at 30BB2AAXX080903:3:54:187:1498#0
-CAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGGCGAATCAG
-+
-67777788888888888888888877776555443222100-//.---,,+++***&))))&)('%'&$#""%#"$
- at 30BB2AAXX080903:3:54:1200:226#0
-TCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCATGCAGTC
-+
-67777788888888888888888877776555443222100//...-+,,,++++*)*)))((((('%"#&&"#$#
- at 30BB2AAXX080903:3:46:299:1138#0
-ATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCAGATCCATACCC
-+
-677777888888888888888888777765523432/11/0//..-,-,+,)+**)))('(%(('('""$""###"
- at 30BB2AAXX080903:3:51:1187:805#0
-ATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGGCCGCGC
-+
-67777788888888888888888877776555443221100//..----,+++**)*)))(((((('"""#"#""$
- at 30BB2AAXX080903:3:55:1268:579#0
-GATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGAGGGCGCTCATT
-+
-67777788888888888888888877776552443222100//.----,,++++**)))()((((''""#"$"#""
- at 30BB2AAXX080903:3:51:125:1186#0
-GGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGGAGATCGCAGCACGGC
-+
-6777778888888888+888888877776+55,43222,10//..+-,+,)++**))*))((((#''$%"$#$#"#
- at 30BB2AAXX080903:3:56:1457:531#0
-TCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCACTACCAA
-+
-67777788888888888888888877716553443.22100//.---*,,,++**)*()(*(((((''%$#""#""
- at 30BB2AAXX080903:3:1:453:259#0
-CATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCAGATCGCNCCNCTCT
-+
-67777788888888880888*88877776/6521320210/0..,+,,+,*))()))())((('(&'""$%"####
- at 30BB2AAXX080903:3:39:381:1474#0
-GAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATAGATCGGAACAGCAGCGC
-+
-67777788888888888888888877776555443222200//..---,-++)***)**)))(((('&$##"##"#
- at 30BB2AAXX080903:3:4:1057:1598#0
-GAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGANACTANCN
-+
-6777778888888888888888787777655544322210/....-.*,*,+'***(())(((((('"""$"#"""
- at 30BB2AAXX080903:3:4:110:587#0
-ATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTAGACNTGACNAN
-+
-67777788888888888888888877776555443022100./.---,,-,++**)**)()(()(('%"""##"""
- at 30BB2AAXX080903:3:1:948:201#0
-GGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTCTCATCATGCGGAGATGTTGGATGGGGGGGGGNGCNACGT
-+
-677777888888888888888888777765255433022/0../.---,,+,+****())))(#(('"""#""#""
- at 30BB2AAXX080903:3:57:819:2041#0
-TCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATACTCCA
-+
-6777778888888888888888887777:555443222100//..---,,,+******)))(()((''%"%%###"
- at 30BB2AAXX080903:3:51:327:681#0
-TGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGGGGGCGCACACA
-+
-67777788888888888888488877-765554102%11/,//.,-.-,)+*+*'**)(()((((('$#"#"%"##
- at 30BB2AAXX080903:3:55:1014:1114#0
-TGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGGGGCGCGTG
-+
-677777888888888888888888774765554432111/0//.--,-,,+++***))())()((''%$""#%""#
- at 30BB2AAXX080903:3:36:1314:919#0
-TTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTACCTCCGCN
-+
-67777788888888888888888877775555443122100//..---,,+*+*+*)*))))((('#"$""$#"#"
- at 30BB2AAXX080903:3:53:779:1012#0
-TTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGGTGGCCGGGTC
-+
-6777708888288888880888-877174555./3300.0/-.---,-+-,*+))*()))'(((((#$"#"#"""#
- at 30BB2AAXX080903:3:35:351:1853#0
-GATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTGGATGGGNATGCATGN
-+
-6777778888888888888808887777655534032110&//,--,--,+++***()*)()((('&"#""###""
- at 30BB2AAXX080903:3:48:1717:1752#0
-GATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGAAGTTGGATGGGGTGGGGGCG
-+
-60777788888888888888884/7777650534522100-%/+,.,,-,+,+'**#*#)((&((('&""""""##
- at 30BB2AAXX080903:3:2:1455:756#0
-CTCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTNAAACTAC
-+
-677777888888888888888888777763554332200//0/...-,,,+,+++)(()((()'('&&""""###"
- at 30BB2AAXX080903:3:3:1460:962#0
-TCCCCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCNACCANCC
-+
-6777778888888888888888887767955544332110///..,,-,,++++)*)()(')&''''%"##"#"#"
- at 30BB2AAXX080903:3:44:1246:1249#0
-TGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGATGTTAGATCGGGGGGA
-+
-677777888888888888888888777765554432221000/.----+,,++***)))))((((('"%&%$""""
- at 30BB2AAXX080903:3:38:62:786#0
-CCACCCCATCCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCACCTCACCAC
-+
-67777788888888888888888877776555443222100//..---,,++*****))))))(((&$#""&%###
- at 30BB2AAXX080903:3:59:1462:766#0
-AGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCATCATGCGGAGCACCAAANCA
-+
-67777788888888888888888877776555443222110//..-,-,,+++***))))))()'(#$%%%%$"#$
- at 30BB2AAXX080903:3:45:131:984#0
-TAGTACTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGCGAGCCGAAGTTTCATCATGCGGAGATGTTGGCG
-+
-6777778888888888/88888887777655544/22,101/&.---&,,++*%*))*()((#(('&$#$"#$$#$
- at 30BB2AAXX080903:3:1:136:1103#0
-TGGCTAGGAATAGTCCTGTGGTGATTCGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCACNAANCCTA
-+
-67777788888888888888888877+76555443222000/.--,,,,,++****())(()('(''$""#"$#"#
- at 30BB2AAXX080903:3:41:406:1926#0
-CATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTTCCTCCGCAC
-+
-67777788888888888888888877776555443221100//.--,,,,+++***)))))(((((&&"%#""#"#
- at 30BB2AAXX080903:3:49:1066:1146#0
-TGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCGAAGTTCTCAAGTG
-+
-67777788888888888888888877776555443222100//..-,-,,,++*)*))))')('('&&$"$"""#$
- at 30BB2AAXX080903:3:53:105:1225#0
-TGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGGGAGCCGAAGTCNATTGTCT
-+
-67777788888888888888888877756555443221110/.,.-,-+,(*+*)*&)&)&((%#(#$""""""#"
- at 30BB2AAXX080903:3:43:1024:1353#0
-ATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('%&%&%%###
- at 30BB2AAXX080903:3:38:1055:423#0
-AGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCCCAAGCGTGT
-+
-677777888888888888888888777765554432220000//.---,,,++***)))()((('('$%&$$"$%"
- at 30BB2AAXX080903:3:1:646:1533#0
-GAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATCNCCNCATC
-+
-6777778888888888888888887777655544322010././.---,,-,++**)))))()((('"""$"""#%
- at 30BB2AAXX080903:3:36:496:476#0
-TGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGCGCCAAGGAGTGAGCTCACGATN
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(('(&%##"#""""
- at 30BB2AAXX080903:3:44:243:1264#0
-TTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))()((''&&&%%%$#
- at 30BB2AAXX080903:3:40:365:427#0
-CGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACNCCACACAC
-+
-67777788888888888888888877776555443222100//...--,,+++++**)))))()(('"$%&%%#$"
- at 30BB2AAXX080903:3:34:881:111#0
-GGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCAGATCGNCCCGTGNN
-+
-67777788888888888888888877776555443220100//..--,,,+++****)))(((('('"&$$""#""
- at 30BB2AAXX080903:3:3:976:717#0
-GTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATAAGGCAGGGNACCTNTC
-+
-677777888888881888388+88777795+54302011(./...-*-,++,+****)(#'(('''&""#&$"""$
- at 30BB2AAXX080903:3:40:700:1850#0
-GGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGCTCGGAAAC
-+
-67777788888888888888888877776555443222100//..---,-+++***))))()((((&&%%%%""##
- at 30BB2AAXX080903:3:43:882:461#0
-GGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGAGCAGGCAGGTGGCCGGT
-+
-6777778888828888888&88&8777+657541323210/./.,--+,,(++**(*)))&(('&&'&"%"##"#"
- at 30BB2AAXX080903:3:48:396:1231#0
-CGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGGTGATTTGGAGGATCAGGCAGGGCTNAGC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))))('('&""#"""##
- at 30BB2AAXX080903:3:54:1288:1637#0
-TGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTCTTCAC
-+
-677777888888888888888888777765554432210/0/..----,-,+++****)))))((''$&%$%$$#"
- at 30BB2AAXX080903:3:43:552:720#0
-GCGATTGATGAAAAGGCGGTTGAGGCGTCTGGGGGGTAGTGCATGGCTAGGAATAGTCCTGTGGGGATNTTGGGAG
-+
-6777778888888888888/8888727+6555'4(2-2100..---,++,+&+)**((())(((&'#&"#"#$$#"
- at 30BB2AAXX080903:3:33:1667:1842#0
-GTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCCTGTGNGTCCTCNN
-+
-67777788888888888888888877776555443212/0.//..,--,,+++**))*))('(((&&""$$$"#""
- at 30BB2AAXX080903:3:37:1351:470#0
-CAAATCACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCAGATCNGGAGCACN
-+
-67777788888888888888888877776555443222100//..---+,,*+****())*)()(''"&$%&%#$"
- at 30BB2AAXX080903:3:46:818:2003#0
-GATGTGGGCGATTGATGAAAAGGCGGTTGAGGGGTGTGGTGGGTAGTGGATGGGTAGGGATAGTTCTGGGTGGCAC
-+
-67777788888888888888888077%76+75(4-$2*0&.)/().),'$+,*')%()&(&#'###'&""""##""
- at 30BB2AAXX080903:3:1:999:892#0
-GTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGGCTGGTGAGGAGTGCATGGCTAGGGATAGTCCNTGNTAGA
-+
-6777778888888888888888187777254044-5$,/00-/+.',,$,((++***(()#('(''%""$"""#""
- at 30BB2AAXX080903:3:35:1548:577#0
-GTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGAGTAGTGCATGGCTAGGAATAGTCNTGGTGTAN
-+
-677777888888888888888888777745524432-1000%/+.)--),()++*())))#)&((#'"$%$%%$#"
- at 30BB2AAXX080903:3:54:14:1185#0
-ACCACAGGACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATAGATCGGGAGCGCGCTCT
-+
-677777888888888888888888777703,544322010,/)-).,--,+**$*)(*))('%((#%$$#"#"##"
- at 30BB2AAXX080903:3:56:1070:843#0
-CGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGTTGAGGCGTCTGGTGGGTAGTGCATGGCTAGGGCTGCTCA
-+
-677777888888888888888888777763554432%2100/..+,,-,(+&+&*+(*&&(((%''#&##&"$##"
- at 30BB2AAXX080903:3:48:890:1412#0
-GACTATTCCTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCAGATCGGTCAC
-+
-67777788888888888888888877776555443222100//..---,,++****))))()(((('$#%%""$##
- at 30BB2AAXX080903:3:8:1685:1928#0
-CTAGCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGNAAACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++**)*))())(((('"&%%%%"""
- at 30BB2AAXX080903:3:37:1602:2012#0
-GCCATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCAGATCGGAAGACCACCAN
-+
-6777778888888888888888887777655584322210./...-.,,,,+++**))))(()(''%"""$#$#""
- at 30BB2AAXX080903:3:50:1362:1019#0
-CATGCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATAAAGGATAC
-+
-67777788888888888888888677176555-43220//0//...-,-,,+++**))))))''(''"""""""$#
- at 30BB2AAXX080903:3:43:1127:2005#0
-GCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGTCGTCTA
-+
-67777788888888888888888877776555443222100//..----,+++*****)*)((((('&&""""#"#
- at 30BB2AAXX080903:3:59:1134:558#0
-GCACTACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGGTCACAC
-+
-67777788888888888,8888887774)5554232222//...-*--,,,*+***)()(')(((''&$%##%%$$
- at 30BB2AAXX080903:3:45:1041:389#0
-TACTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGTAGCTCTG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((((&'$"#&""""
- at 30BB2AAXX080903:3:60:1180:1589#0
-GGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGTTGAGATTGGCAGAACCNN
-+
-67777788888888888888888877776555443222100./..---+-,++*)*)&)'((&(##'$&#""#"""
- at 30BB2AAXX080903:3:58:1528:611#0
-CTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGACACAACATN
-+
-67777788888888888888888877776555443222100//..---,,++++*+)))))(((''&$$%&$$%#"
- at 30BB2AAXX080903:3:47:1577:775#0
-ACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAAGATCGGAAGAGCGGTGCATCCA
-+
-67777788888888888888888877776545443222001/....--,-++*+**'))))))((&'%#"%"####
- at 30BB2AAXX080903:3:55:797:1648#0
-GTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGGGGTGCCAGCA
-+
-677777888888888888888888777765554/3222100//.----,,+++**)*))()('('#%'#$$"""##
- at 30BB2AAXX080903:3:2:40:990#0
-CCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCAGNGCANNCA
-+
-67777788888888888888888677736559445121111//.--,,,-+,+***))*())(((''$""""""%#
- at 30BB2AAXX080903:3:37:974:767#0
-CCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCCCCGCN
-+
-677777888888888888888888777765554432201011/.,-+,,)+,***))))))'(('&#"$$""%##"
- at 30BB2AAXX080903:3:38:1289:57#0
-GGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGGTGGGACANN
-+
-67777788888888888888888877776555442212010//..-----+++**+(**))()&'(&$'"#"##""
- at 30BB2AAXX080903:3:3:1457:1469#0
-AGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAAAAGGCGGGTGANCGCANAC
-+
-6777778888888888888888887777655584322/101/...,*,,++,+**+()))((((##'""%"$#"#$
- at 30BB2AAXX080903:3:50:1097:629#0
-AGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATACCGGAATTC
-+
-67777788888888888888888877776555443222100//./---,,+++***))))))()'(($""""#"##
- at 30BB2AAXX080903:3:43:216:533#0
-GAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATAGATCGGAAGAGGGGGTTAG
-+
-677777888888888888888888777765554432201/0//.----,,,++*+**)*))(((('''$&%""""#
- at 30BB2AAXX080903:3:41:282:1362#0
-CTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACNTTNGNGCA
-+
-677777888888888888888888777765554432321000...---,,,++****)))(((((''"%&"""%$#
- at 30BB2AAXX080903:3:54:953:1565#0
-TCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAAAGATCGGAAGAGCTGTCCACA
-+
-67777788888888888888888877776545803220000/./.--,,,,++&*))*)&'(%((''$""##"#$#
- at 30BB2AAXX080903:3:60:1056:1106#0
-TCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGGAAATTATGGCTGAATCATCCGCTACCGACACAANN
-+
-6777778888888888888588$80777630332302.+0$//.---,+,+++)*)')&((('''#'$""$$##""
- at 30BB2AAXX080903:3:33:213:794#0
-ATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGAANACCATANN
-+
-6777778888888,888888888877776545443222100//..,-,,,,+****'))))(((('&"$"#"""""
- at 30BB2AAXX080903:3:36:238:1812#0
-CATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGTGTACTCANN
-+
-677777888888888888888882777765554422222/00..--,-+,+,+***)()(()((('%%#"#"##""
- at 30BB2AAXX080903:3:54:1442:1840#0
-GCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGATTGATGACAGGGTA
-+
-67777788888888888888888877776554443222100+/.---,,,++****)))#)&()(&'$$&%#&###
- at 30BB2AAXX080903:3:59:900:93#0
-AGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGTGGGCGAGTGCGAGNNC
-+
-677777888888888888888888777765554432221/////-,-,,,++**'*)*)())((('#'$#&#"""$
- at 30BB2AAXX080903:3:56:156:191#0
-TGAGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGGGATGTGGGCGATACGCCAC
-+
-677777888888888888888848777725504432201&.+/.,-+,-,+*+*'*%)&()()((#'%"""$####
- at 30BB2AAXX080903:3:3:1093:892#0
-TCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGCNTCATNCG
-+
-67777788888888888888888877776555443222/00/..,-.-+,*+**))*()('((('%'&""##$"#"
- at 30BB2AAXX080903:3:8:1655:1637#0
-CATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATAANTACAAGNN
-+
-6777778888888888888888887777655544322210//./.---,-++***))()(()(''(%""$#"#"""
- at 30BB2AAXX080903:3:47:864:1648#0
-ATTGAGGCGCCATTGGCGTGAAGGGAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGGTGTGGGACAGCAACA
-+
-677777888888888888888888477765504432.01-1..-----,*,*')('#)')#((#'&%"$"###"#"
- at 30BB2AAXX080903:3:58:1610:1538#0
-GAATATTGAGGCGCCATTGGCGTGAAGGTAGCGGATGATTCAGCCATAATTTACGTCTCGAGTGATGCACAACCAN
-+
-6777778888888888888888887777655544322210.///,---,,+++***))))&()(''%$$%"$$%$"
- at 30BB2AAXX080903:3:40:354:659#0
-CCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCAGATCGGACGAGTGCGC
-+
-67777788888888888888888877776555443222100//-.---,-++++**))*)))(((('%#$#"#""#
- at 30BB2AAXX080903:3:49:1720:353#0
-ACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTACGTGTCCTC
-+
-6777778888388888848888887777655544322110///..,-+-,+++****)*))((((('$""#"####
- at 30BB2AAXX080903:3:35:1608:904#0
-CTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATNTGCACTGN
-+
-67777788888888888888888877776555443222100//..*--,,++++*))*))))(((''"$#$##"#"
- at 30BB2AAXX080903:3:33:656:296#0
-CGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCGCGCCAATGGCGCCTCAATATTCTTTATCTNACTACANN
-+
-67777788888888888888888877776555443221100/------,,,++***))*))))((''"%$""#"""
- at 30BB2AAXX080903:3:38:1790:1349#0
-AGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTTCNN
-+
-67777788888888888888888877776555443222100//..---,,,,*+*))*)))(((((&$"&%%"$""
- at 30BB2AAXX080903:3:3:1029:184#0
-ATTATGGCTGAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTCNTCACNGN
-+
-6777778888888888838888387777454144322-1.-/...---,++++**)*)'()(()&''%""&$$"""
- at 30BB2AAXX080903:3:49:1727:1150#0
-CCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGTAGCGGGAGACAAAAA
-+
-67777788888888888888888877776555443222100//...---,+++***)*))'))('''$$%"&%%#%
- at 30BB2AAXX080903:3:49:1183:414#0
-GAATCATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCCACACAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))()((('"$#"$####
- at 30BB2AAXX080903:3:3:1671:781#0
-AGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGGAGCCNATCTNCN
-+
-67777788888888888888888877776555443222100//..-,-+,,+***))'*'()(%''#""#%"%"""
- at 30BB2AAXX080903:3:44:1507:880#0
-TAATATAGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAGGAGGGACA
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((('''&&"#$""""
- at 30BB2AAXX080903:3:1:999:1009#0
-CGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGATCGNCGNCACA
-+
-67777788888888888888888877776-5544321220//0-,--,+,,++*+*)*()')(('%'%"#""$##"
- at 30BB2AAXX080903:3:54:935:1115#0
-GATCCGTAATATAGGCCTCGCCCGATATGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTCGAGACGCCCC
-+
-67777788888888888888888897146+254$3212100/.+-'--,,+,*++**)((('('(&'&"%%&#""$
- at 30BB2AAXX080903:3:43:395:326#0
-ATGATCCGTAATATAGGCCTCGCCCGATGTGTAGGAAGAGGCAGATAAAGAATATTGAGGCGCCATTGGCGTGAAG
-+
-677777888888888888888888774765554432121000..----,,+*+++)**))(('('#'''%&"$"##
- at 30BB2AAXX080903:3:37:823:233#0
-GCCAATGGCGCCACAATATTCTTGATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTTN
-+
-67777788888818888888888+77776525443221100//...--,,+++*+)**)(()(('('%#$#$%#""
- at 30BB2AAXX080903:3:54:1247:984#0
-AATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATGTCTCTCCC
-+
-67777788888888888888888877776555143222000//..--,,,+++***())))((((('$$"&%%###
- at 30BB2AAXX080903:3:40:84:1261#0
-ATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAGCATCTATA
-+
-67777788888888888888888877776555443211100//..,--,,**+**)))))((()(('$$#"#""""
- at 30BB2AAXX080903:3:38:1473:997#0
-CTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGTCCAC
-+
-67777788888888888888888877776555443222100/...---,,-+****)))()((((''$#$%""#$%
- at 30BB2AAXX080903:3:40:1525:1930#0
-TCTTCCTACACATCGGGCGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCAC
-+
-67777788888888888888888877776555443222100//....-,,+,+***)))))(((''('$%&#%$""
- at 30BB2AAXX080903:3:50:1162:2045#0
-GGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGAAATGATCCGTAATATAGGCCTCGCCCGATGCAGCGGCC
-+
-67777788888888888888888877776555443222100//.-.--,,+++****))))((('('$$""#""##
- at 30BB2AAXX080903:3:51:848:510#0
-TGCAAGCAGGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGAAAAGATCCGTAAGATCGGAAGGGCACACGG
-+
-67777788888888888888888877776555%43222/00//..---$,,++***)*))(('(('&""#"###""
- at 30BB2AAXX080903:3:44:625:415#0
-CGAGGCCTATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCAGATCGGAAGAGCGGCTA
-+
-67777788888888888888888877776555443222100//..-.-,,+++++***))))(((''$"$%&$"$#
- at 30BB2AAXX080903:3:56:1115:697#0
-ATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCGACCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$'"####"#
- at 30BB2AAXX080903:3:43:227:1084#0
-TACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAGATCGGAACA
-+
-677777888888888888888888777765554432.2100/..-.--,+,,++*+)))))))((''&&&%&#%"%
- at 30BB2AAXX080903:3:50:1546:1294#0
-TATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTCAGGTTTCTGAGTAGAGACNCGCGTCG
-+
-6777778888888888888888887777655544222'10///..-,-,,+++%+*'*)'*'(((('""%$"""#"
- at 30BB2AAXX080903:3:37:1188:1877#0
-GGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGACTACAGCN
-+
-67777788888888888888888877776355443212100./.---,,,++***))*)))()('''"$%"$%"#"
- at 30BB2AAXX080903:3:59:956:555#0
-CATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAAGATCGGGTACTGC
-+
-67777788888888888888888877776555443222100/../.--,,+++*+)*)))((((((''%"###""#
- at 30BB2AAXX080903:3:37:1490:155#0
-ATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGCCANN
-+
-67777788888888888888888877776555443222000//..----,++++**)*))))()#('%$%&#$$""
- at 30BB2AAXX080903:3:34:1732:1649#0
-TCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATANCACATCNN
-+
-67777788888888888888888577776555443222100//..-.-,,++++****))))(((('"$%&#"%""
- at 30BB2AAXX080903:3:2:1628:171#0
-GGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTTAGGGTTTCNCGACGCA
-+
-677777888888888888888888377765/54&322.000./.),---,$$+)**#((%'&&(''%%"##"#"##
- at 30BB2AAXX080903:3:48:548:708#0
-GGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGGTGTTTCTGGTTTTCGGGG
-+
-677777888848.888888888887777).3544022..00+...'--,&,,**#))'()#((##''""""%"#""
- at 30BB2AAXX080903:3:55:740:2013#0
-CGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTTATGTCTCTTCT
-+
-67777788888888888888888877776452443222200/++.-,-,,+*+)+#)*)()#('#%#'&#$#$"#"
- at 30BB2AAXX080903:3:46:663:205#0
-TCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGGTCACGTCT
-+
-67777788888888888888888877776552445222010/..---,,,,++*(**))(()('('%$"#""###"
- at 30BB2AAXX080903:3:41:536:2037#0
-TCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTCAGATACAT
-+
-67777788888888883188888877776555143212000-...+,-,++,#()*)*&')')((#(%"""""$#"
- at 30BB2AAXX080903:3:1:453:1068#0
-GCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATGGTTGCAAGCAGATCGGACGAGCGGCTGTNTGNTATA
-+
-6777778888888888/)8808-8724763$5/4.21-/')'&-',+-,,+)#*)(#$##'&'(#'&""#""##""
- at 30BB2AAXX080903:3:40:1243:997#0
-ATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGCAAGCAGGAGGATAATGCCGATGTTTT
-+
-67777788888888888888888877776555443222100/...---,,+++***)*))((((((#''"%%#"""
- at 30BB2AAXX080903:3:36:609:1060#0
-ACATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGACACACAAN
-+
-67777788888888888888888877776555443222101//..---,,+,+*****))))((((#"%$%%"##"
- at 30BB2AAXX080903:3:41:282:323#0
-CATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCTCACTCCTA
-+
-6777778888888888888888887.776555443222100/...---,,,,++*)))))(&)'(('$&%%#%$##
- at 30BB2AAXX080903:3:46:1192:1126#0
-ATCGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCCAATCACAT
-+
-67777788888888888888888877776555443222100//..--,,,+,*)**)*))')(('&'$"##%"$""
- at 30BB2AAXX080903:3:59:1439:1479#0
-CGGCATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAACACACANCA
-+
-67777788888888888888888877776555443222100//..---,,+++****)))())(((&$$&&"$"$$
- at 30BB2AAXX080903:3:55:32:1289#0
-ATTATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGCGCGGGGATCGGAGTGTCGCAC
-+
-6777778888.888888888888877776555423212000./.%+,,-+++++(*#*)')%&''(%'##"#"$##
- at 30BB2AAXX080903:3:46:343:1278#0
-ATCCTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATCTATTGCGC
-+
-67777788888888888888888877776555443222000//-,--,+,+)+)**()()))()'''$""""####
- at 30BB2AAXX080903:3:56:189:767#0
-CTCCTGCTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGACGCC
-+
-67777788888888888888888877776555443222100//..----,++++*)))))()(((('%"$""""#"
- at 30BB2AAXX080903:3:50:1410:1742#0
-CTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGCTATAGTTGACCTCTA
-+
-67777788888888888888888877776555443022100/0.,,-,,,++++**)())')(('(%"$#"$"#""
- at 30BB2AAXX080903:3:54:489:1196#0
-CTTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGTCCCCTNTC
-+
-67777788888888888888888877776555443222100/...---,,,++**+**)))((((('"$###""$%
- at 30BB2AAXX080903:3:2:386:640#0
-CAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACANCATNCAC
-+
-6777778888888888888888887777655514122210,//...--,-+++***))))))(''(''"#%""$$#
- at 30BB2AAXX080903:3:4:1469:285#0
-TTGTAATTACTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATAGATCGGAAGNACACNCN
-+
-677777888888888888888888777765554432/2101///.---,-,,+))**)*))('(('#""#%$#"#"
- at 30BB2AAXX080903:3:58:691:2012#0
-TTTGTAATTACTGTGGCCCCTCAGAATGATATTTGGCCTCACGGGAGGACATAGCCTATGAAGGCTGTTGACACCN
-+
-67777788888888888888888877776555443210100//..---,,++++))*)))((()&''"&%###$#"
- at 30BB2AAXX080903:3:35:877:1404#0
-TAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAGANACTACGTN
-+
-677777888888888888888888777765554432221000//..--,,+++***)))()))((('"#$%"$"#"
- at 30BB2AAXX080903:3:37:694:823#0
-TTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTCTCCTCAN
-+
-677777888888888888888888777765554432221000/..-.-,-+++++***))()((((("%%%$###"
- at 30BB2AAXX080903:3:50:928:967#0
-TATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCTCATAGA
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))(((('%$"$"####
- at 30BB2AAXX080903:3:54:250:1496#0
-CCCAATGTATGGGATGGCGGATAGTAAGTTTGGAATTACTGTGGCCCCTCAGATCGGAAGAGCGGTTAAGCGGCAC
-+
-6777778.888888888888880877476555%2322200//..-,,,,,*+****)'))'(#)(##"#"%""#""
- at 30BB2AAXX080903:3:53:263:1321#0
-TGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGCAGCAGC
-+
-67777788888888888888888877776555443222100//..---,,++++****)))((((('&"$"#"##"
- at 30BB2AAXX080903:3:39:491:413#0
-TAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGTAATTACTGTGGCTGCGCAGAATGATCTGCTGTGT
-+
-677777888888,888888883'177776-5+1-3221100....,--,,*++)&**(()''('('%%&##&%%##
- at 30BB2AAXX080903:3:50:661:214#0
-CAAATATCATTCGGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGCGGCCGCTC
-+
-6777778888881888888888887177.555443222100//..----,++++**))))))()(('"""#$"##"
- at 30BB2AAXX080903:3:4:962:1296#0
-AATATCATTCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCNACTCNCN
-+
-67777788888888888888888/77776552443.2210/./.,-,),,++**+*&(((((((('%%"#&%$"$"
- at 30BB2AAXX080903:3:4:620:905#0
-GATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGAGATCGGAAGAGCGCNTCACNCN
-+
-67777788888888888888888877776555443222100//..-.-,,,,+****)))()((('&$""%#%"#"
- at 30BB2AAXX080903:3:33:757:524#0
-TCTGAGGGGCCACAGTAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCANGCGAAANN
-+
-6777778488888888888888887777655544322220//-/---,,-+,+***)*))))(((('""$""""""
- at 30BB2AAXX080903:3:45:1654:229#0
-CTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGTAATTACTGTGGACCTCAC
-+
-67777788888888888888888877772555443222100//..---,++++***)*)))))((('%$""%#%#$
- at 30BB2AAXX080903:3:43:102:322#0
-CCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGATAGTAAGTTTGAGATCGGAAGACAGCGCT
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('('&&#"$"###
- at 30BB2AAXX080903:3:41:599:89#0
-TACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCCGTACAC
-+
-67777788888888888888888877776555445222100/..-.--,-,*+*))**))()((''%$%"%#""#"
- at 30BB2AAXX080903:3:36:1626:1762#0
-GGACTGGCTAATGAGTAGCCTCCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATGGCGGCTATCTTNN
-+
-6777778888-8888888&888+$777/655544322$000/.(/-,,+,*+**)))))))&(((('$$#"##"""
- at 30BB2AAXX080903:3:44:1588:964#0
-TTACTATCCGCCATCCCATACATTGGGACCGACCTAGTTCAATGAATCTGAGGAGGCTACCCAGTAGACGGGCCAC
-+
-6777778888888%8888888888.7730.55243)2/10//+.----,,+++****))'%#%'#(%&"$#""#"#
- at 30BB2AAXX080903:3:36:131:251#0
-TGGGACTGTCTACTGAGTAGCCTCCTCAGATTCATTGAACTAGGTCTGTCCCAATGTATGGGATAGANCTCACAGN
-+
-67777788888888888888888877776555443222100//..---,,++******)))(((((&"$"$%$#""
- at 30BB2AAXX080903:3:36:363:509#0
-TATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGCACCGACTN
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))(((('$"%$""#""
- at 30BB2AAXX080903:3:34:1130:631#0
-ATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTNTTACAGNN
-+
-67777788888888888888888877776555443222100//..---,,++++****)))))((''"""$%#"""
- at 30BB2AAXX080903:3:47:1601:971#0
-ATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTACACCAAAT
-+
-67777788888888888888888877776555443)20100/+..----,+)+*))*))(((((('#"&"#%#%"#
- at 30BB2AAXX080903:3:33:498:673#0
-TCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAAGANGTGAGCNN
-+
-67777788888888888888888877776555443222100//.---,,,+++)**)*&)*(((((("#""#"$""
- at 30BB2AAXX080903:3:55:356:570#0
-GCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCATCTCCACAA
-+
-67777788888888888888888877776555443222100//..--,,,+++****))))((((('"'"&&%$$$
- at 30BB2AAXX080903:3:60:866:277#0
-GCCATCCCATACATTGGGACAGACCTAGTTCACTGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCCGCANN
-+
-67777788188888888888888877776555-23222100///.---,,+,++*)**&(()'((('''"#"$#""
- at 30BB2AAXX080903:3:60:867:275#0
-GCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCTCGCANN
-+
-67777788888888888888888877776555443222100//-------,,++*))*))()'('('&&""$%#""
- at 30BB2AAXX080903:3:2:216:1902#0
-ATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCANCACNNAC
-+
-67777788888888888888888577776555453222200//..-.,-,+++*+)**)(()('(('""#"#""##
- at 30BB2AAXX080903:3:51:829:1466#0
-CATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGCATCCGCGCA
-+
-677777888888883888888888777765554432221001..-.----+++**)))(()'(((&%"""#"#"""
- at 30BB2AAXX080903:3:45:124:592#0
-GAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTACTGAGTAGCCTCCTCAGATCGGAAGAGCGGGGCCGGAGTG
-+
-67777788888888888888888877776255443212100'/.---,,,+++*+)*)()))('(''"%$%""$##
- at 30BB2AAXX080903:3:37:1640:1971#0
-AGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCACTCCTCAN
-+
-677777888888888888888888777,6555443322101/*.,--,,-,,+***))()(()(('%"$"$$#%$"
- at 30BB2AAXX080903:3:50:170:1235#0
-GATGAAGTGAAAGGTAAAGAATCGTGCGAGGGTGGGACTGTCTACTGAGTAGCCTCCTCAGATTCATCGGCGGACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*)))(('&$$"$#""#"
- at 30BB2AAXX080903:3:55:1667:36#0
-TCAATGAATCTGAGGAGGCTACTCAGTAGACAGACACACCCTCAAACGATTCTTGACCTTTCACTACACAACAAAA
-+
-677777888888888888888888777765554$3)2210////)---,,++)+**)*()))(#(&&$&"%&$#$$
- at 30BB2AAXX080903:3:48:1282:1336#0
-CAATGAATCTGAGGAGGCTACGCAGTAGACAGTCCCACTCTCACACGATGCTTTAACTTTCACTTCAACGCGCTCC
-+
-67777788888888888888108877776555'40,2,*00-/,,+-,)(+(+*'')$((#(&#'(#"#"$"""#"
- at 30BB2AAXX080903:3:49:693:1538#0
-CAATAATGAAGGGCAAGATGAAGTGAAAGGGAAAGAATCGTGGGGGGGGGGGGGGGGTGACTGGGGGCGCCATGCC
-+
-677777888888888888888886777765(344152+$1).&.%---,-++))()(#######'##"##""""#"
- at 30BB2AAXX080903:3:2:686:1072#0
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCAGATCNGCTAGTC
-+
-677777888888888888888888777725452432210100/.-----,+++*+***))()(((''"""$"#""#
- at 30BB2AAXX080903:3:45:1124:1058#0
-GAGGAGGCTACTCAGTAGACAGACCCACCCCCACAAGATGCGTTACCTTTCACCTCCTCCTAGCCATCCTGAGATC
-+
-6/77778588888888888888))777765(5'-.'2/&*,'.--&(#++*$)$*##(%#(#&'##%"""$"$"""
- at 30BB2AAXX080903:3:58:1337:421#0
-AGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCAGTAGCACA
-+
-6777778888888888888888887777655544120$100//.,-+*,+,+++*)*))))'(('''%$&""$%$%
- at 30BB2AAXX080903:3:56:752:106#0
-TGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTACTGAGCAGACTCCT
-+
-67777788888888888888888877776555243222100/..----,,*++****))))(((''&%$##%"###
- at 30BB2AAXX080903:3:45:101:1113#0
-GGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATAGATCGGA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((''''%&&"$%##
- at 30BB2AAXX080903:3:4:1017:1901#0
-GCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGAGATCGGANGATGNTN
-+
-6777778888888888888888887675655544222210///.--+-,,,,**+**)()))(((('&""""""""
- at 30BB2AAXX080903:3:43:128:189#0
-GGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTAACTTTCACTTCATCTTGCCCTTCATTATTAGATCGG
-+
-67777788888888888888888/7877655544322210#//..-*,,+*++**))*)))((('(''%%%"###%
- at 30BB2AAXX080903:3:42:1307:1711#0
-CTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCGTCTGCA
-+
-67777788888888888888888877776575463222020//.,,--,,,+++**(*)((((((('$&%&&#"#"
- at 30BB2AAXX080903:3:38:299:1070#0
-CTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCACCCCTACAC
-+
-67777788888888888888888877776555443222100//..----,+++*+*))))))()(('%"&##%"##
- at 30BB2AAXX080903:3:42:785:820#0
-CTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGTCTCTTGG
-+
-67777788888888888888888877776555443222110/...----,,+***)*)))&))((('&&%&""#"#
- at 30BB2AAXX080903:3:51:991:187#0
-GCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACTGCTCTCGG
-+
-67777788888888888888888877776555443222100//-.---,,+++**+)*)))((('('""####"#"
- at 30BB2AAXX080903:3:37:1665:1484#0
-TGCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGTAAAGAATCGTGTGAGGGTGGGACATTGACNN
-+
-67777788888888888888888877776555443222100//.*---,,,++*+**))))(&('''""""""$""
- at 30BB2AAXX080903:3:59:532:1230#0
-GGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGAGGAAGTGAAAGGGAAAGAATCGTGTGGGGGTGAGCGCNAC
-+
-677777888888888888888888777305553432(2000//-.+--'&,,+**('*()&)#(((#&$%#"$"##
- at 30BB2AAXX080903:3:33:194:1128#0
-ACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCNTCAACANN
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)))'(((''""%"#$$""
- at 30BB2AAXX080903:3:2:966:696#0
-CCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCNACCTCCC
-+
-677777888888888888888888774766554432.1200/.-,.--,,+++*)'))()'(('('''"$"""##"
- at 30BB2AAXX080903:3:60:1165:497#0
-CGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGATGAAGTGAAAGGGAAACACCNN
-+
-67777788888888888888888877776555443221100//./---,-+,++****)))()(((#&%&"$##""
- at 30BB2AAXX080903:3:45:250:1372#0
-CTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCGCGTAACG
-+
-677777888888888888888888777765554432220/0//...-,-,+,*+****)))))((('%"$&##"#%
- at 30BB2AAXX080903:3:53:52:1051#0
-TTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGAGNCAGNTCT
-+
-677777888888.8888886888877756535433122001/../-,-,,+*+*)))()))(#'(('""#""""#"
- at 30BB2AAXX080903:3:2:1640:1675#0
-GTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCAAGANTGACGTC
-+
-67777788888888888888888877776550441222010//,.,-,,-+*)**))*))))(''''&"&##%#""
- at 30BB2AAXX080903:3:33:498:592#0
-CTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTAGATCGGAAGAGCGNTAGTCCNN
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(&"""""##""
- at 30BB2AAXX080903:3:43:842:45#0
-AGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAGGGCACAG
-+
-67777788888888888888888877776555443222100/..---,,,++++**)*((((((((''&%##""""
- at 30BB2AAXX080903:3:52:773:1544#0
-CTTGCCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACAGATCGGAAGATGCTCCCC
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))(((('%"""""""#
- at 30BB2AAXX080903:3:43:1755:765#0
-CCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGATCAAACAACCCCCTAGGAA
-+
-67777788888888888888888877776555443222100//..---,-+,******)))()((('&&%%%%$""
- at 30BB2AAXX080903:3:37:1464:295#0
-TTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAGACCCTCNTCN
-+
-67777788888888888888888867776555433222200./.*---,+++++****)))'(('('"&$%$"$$"
- at 30BB2AAXX080903:3:42:536:888#0
-GATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCTGCTAGGGCTGCAATAATGAAG
-+
-67777788888888888888888877776555443222200//..---,,+,+****)*))((('('$&$%$$##%
- at 30BB2AAXX080903:3:55:1148:1423#0
-TCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGCAACGGGATCAAACAACAGACAGGACTACTA
-+
-677777888888888888888888772745554)521'&0//-..'-,',++*')())())((((#%"$"$"##"#
- at 30BB2AAXX080903:3:39:1005:560#0
-ATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAAGATCGGAAGAGTGTAG
-+
-67777788883888888-888%8877772555443210//0/.-+-*-,+++**&***()((&'(&#$$"%$""""
- at 30BB2AAXX080903:3:50:597:724#0
-ATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCACCACTG
-+
-677777888888888888888888777735554432220000/.-----,+++***)))))'(((('%%$#$"#""
- at 30BB2AAXX080903:3:51:1165:707#0
-ATCCGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTTACTCNCTC
-+
-67777788888888888888888877776555443221100./..-,-,,,+****)**))'()('&""$""""##
- at 30BB2AAXX080903:3:49:1498:2039#0
-TATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGTGCAAGAATAGGAGGTGGAGTGCATTCAC
-+
-67777788888888888888888877776/55443212+.///./+-',++*+***)*)())#((('""""""#"#
- at 30BB2AAXX080903:3:50:384:50#0
-CTCCACCTCCTATTCTTGCACGAAACGGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAATCTCACAC
-+
-67777788888888888888888877776555443222100//..--,,,+,+***)))))()((('""#"$"$""
- at 30BB2AAXX080903:3:37:998:1081#0
-TAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGATCCCGTTTCGCTCCTGCTAN
-+
-67777708888888888888888877776555443222100//..---+,+,++**)))))'((('%"%"""##""
- at 30BB2AAXX080903:3:52:276:326#0
-TGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTATGGGGTTGTTTGATCCCGCCTCTTTC
-+
-67777788888888888888888877776555443222100././--,-+)+++*)))))))(((('%"$"$"""#
- at 30BB2AAXX080903:3:53:1565:1415#0
-TGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGGGTTGTTTGACACACTCCT
-+
-67777788888888888888888847776555413221100/...--,,,**+***)*)()(((((&$$%%$"##"
- at 30BB2AAXX080903:3:3:900:1007#0
-TTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTAGGGAGATCGGACNGCACNTG
-+
-67777788888888888888888877776555401222000//.---,,-,+)**)*))()(%#(('$"""$#"#"
- at 30BB2AAXX080903:3:39:94:1347#0
-GGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACATATACATCA
-+
-67777788888888888888888877776555443022100//..----,++++***))))(()'(&$$##"%"##
- at 30BB2AAXX080903:3:43:1649:1221#0
-ACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATAAAAGACGCCCACGG
-+
-6777778888888888888888867777455544322-2///..,,--+-,****)*)))'&(((''&$"&#"#""
- at 30BB2AAXX080903:3:49:1177:804#0
-CAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCACTCACA
-+
-67777788888888888888888877776555443222*00./..--,,,+,+***)))))()((('$$""#$$##
- at 30BB2AAXX080903:3:8:589:1921#0
-CAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTAAGATCGGAAGAGCNGATTCANN
-+
-+77777888888888888888$8877776/5943021211/.).,-,-+,+++)*)()))(('('(("""""##""
- at 30BB2AAXX080903:3:49:1009:1992#0
-AGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCCTCGGCTACC
-+
-677777888888888888888888777765555432221/0//..---+,+++***)))*'((((&#$"%"##"$#
- at 30BB2AAXX080903:3:36:333:1879#0
-AAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGGAGGTGATTCGACCTCCNN
-+
-677777888888888888088888+27-6/554$32+-10,/+,,--,-),+#**)**&))&)'('%""$$###""
- at 30BB2AAXX080903:3:49:1198:690#0
-CCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAGATCGGAAGCGACTCGAC
-+
-67777788888888888888888877776550443222100//..---,,+++(*+))))))()((&"""#""""#
- at 30BB2AAXX080903:3:37:295:617#0
-TAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCCTACAACN
-+
-677777888888888888888888777765,5)43122100//..----,+++***)**))((((('%$%"$"##"
- at 30BB2AAXX080903:3:60:747:779#0
-TAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTGCGCNN
-+
-67777788888.8888888883887773055/483222100//./-----,+++**)))))()'('''"""%"$""
- at 30BB2AAXX080903:3:54:949:93#0
-GGAAGAGAAGTAAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTATCGGAATGGCCTGCACT
-+
-67777788888888888888888877776555443222100//.,---,,+*+***)**))()((('%"#"#"##"
- at 30BB2AAXX080903:3:55:241:443#0
-CCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGAGATCGGAAGACGACTGCT
-+
-67777788888888888888888877776552413212.0/--.-*,-+,,++*&*)(*(%((('&'%#""###$$
- at 30BB2AAXX080903:3:57:1368:1723#0
-TCCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCTCTTCCACACTA
-+
-67777788888888888888888877776555443222100//..--,,,,++*****))()(('('$"%%""#""
- at 30BB2AAXX080903:3:50:535:717#0
-CCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCAGATCGCCAACGT
-+
-67777788888888888888888877776555443222100/....--,-+,++**(*))))((('&&"$#""#""
- at 30BB2AAXX080903:3:59:23:909#0
-CCCATTCCGATAAAATCACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTAGATCGGAAGAGACCNNA
-+
-67777788888888888888888877776555443222100//..---,,,++*****)))()('((&%&"#%""#
- at 30BB2AAXX080903:3:54:219:1792#0
-GGAGAGAAGGAAGAGAAGTAAGCCGAGGGCGTCTTTGATTGTGTAGTAAGGGTGGAAGGTGATTTTAGCGGATCAG
-+
-67777788888888888888888877776555443221100//..----,+++**))))))(()'''$$#$""$"#
- at 30BB2AAXX080903:3:48:1643:1650#0
-AATCACCTTACACCCTTACTACACAATCAAAGACGCCCTCGGGTTATTTCTCTTCCTTCTTTCCTTTATGTACACA
-+
-677777888/8888888888888877776555421-+0&.//%$%,&',+*))+#(')&(&)'#%'&""""$%""#
- at 30BB2AAXX080903:3:39:1579:1523#0
-ATCAAAGACGCCCCCGGCTTACTTTTCTTCCCTCTCTCCTTAATGACATTAACACAATTCTCCAGAACGTCCCTCA
-+
-6777778888888%8888,-.324(.1,3%5%1$+'1.1%0%)*%,**++*+'''#(&)%'&#&###"%#""#"##
- at 30BB2AAXX080903:3:46:730:1679#0
-GCCTAGGAGGTCTGGTGAGAATAGTGTTAATGTCATTAAGGAGAGAAGGAAGAGAAGTAAGCCGAGGGCGACAGCG
-+
-67777788888.88888884888877776555423222100./-.---,,,+****)))))'((((#'#""#""##
- at 30BB2AAXX080903:3:55:1035:617#0
-TGTCTGGGTCGCCTAGGAGGTCTGGTGAGAATAGTGTTAATGTCATTAAGGAGAGAAGGAAGAGAAGCAACCGATG
-+
-67777788888888888888888877776555441222/00//..--,,,++++*))))))()((('"%$$%""""
- at 30BB2AAXX080903:3:42:1523:859#0
-GGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTATTCTCACCAGACCTCCTAGATCGGAAGCGTCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()(('''&"###"""
- at 30BB2AAXX080903:3:45:1252:1669#0
-TGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGTCTGGTGAGAATAGTGGTAATGTCATTAAGGAGAGGGAGAC
-+
-6777778888888888882888887717655544322210&//.---,,$+%++*))())())(((''$#$$"##"
- at 30BB2AAXX080903:3:1:220:976#0
-TGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGTCTGGANCTNACAA
-+
-677777888888888888888888777765553432111/1//.,,--,,**+))*)))()(&'(((""#"""$#"
- at 30BB2AAXX080903:3:60:1401:1615#0
-CGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAAGATACCCACANN
-+
-677777888888888888888888777765554432.2000/./.-,-,,,)+****')(')('(('$$#%%$%""
- at 30BB2AAXX080903:3:53:195:1912#0
-GTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTACTATTCGTT
-+
-677777888888888888888888777765554422221/0//.----,+,++**))))()'(((#%%##&&#""#
- at 30BB2AAXX080903:3:60:878:1621#0
-GTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTGGCTAGGGTATATACAANN
-+
-677777888888888888888888777765554432221*0//.',,--,*++***())()()((#'&$#&%#"""
- at 30BB2AAXX080903:3:2:1139:1227#0
-GAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGAGATCGNCGGCTGA
-+
-6777778888888888828888887777655544322210///..---,,+++)****)*)))((('%"%""$#"$
- at 30BB2AAXX080903:3:53:1584:1417#0
-GGAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGTATTTAAGGGGTTCACTACAAA
-+
-67777788888888888888888877776555443221100//..---,,+++***)))))((('(%"$#"""##"
- at 30BB2AAXX080903:3:36:1273:1389#0
-CTAGCCAACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAAGTCTCGTCN
-+
-67777788888888888888888877776455443221100//..---,,,+++*****))(((((%&&&$"#"#"
- at 30BB2AAXX080903:3:35:978:2036#0
-TAGCCAACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATNCTCACACN
-+
-677777888888888888888888777765554431221/0//...--,,+++**))()))()((''"%#%$##$"
- at 30BB2AAXX080903:3:37:898:1093#0
-GATCGGAGAATTGTGTAGGCGAATAGGAAAGAGCAGTCGGGCGTGATGTGGGGAGGGGGATTTAAGATGGAACATN
-+
-67777788888888888888888*777765$54,3522100-/-..--,,+++***)*&))()(''(%"""##"""
- at 30BB2AAXX080903:3:52:633:280#0
-AACCCCTTAAATACCCCTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGCCCCGCCC
-+
-67777788888888888888888877776555443222100//..----+,+++***)*)(')((('$##&%&##$
- at 30BB2AAXX080903:3:34:1619:1444#0
-TTAGGGACGGATCGGAGAATTGTGTAGGCGAATAGGAAATATCATTCGGGCTTGATGTGGGGAGGGGNACACACNN
-+
-67777788888888888888888877776555443222100//...,-,,,++***)*)))((('(&""#%$##""
- at 30BB2AAXX080903:3:41:1012:759#0
-AAGGACGCCTCCTAGTTTGTTAGGGACGGATCGGAGAATTGTGTAGGCGAATAGGAAATATCATGCGGGTCTCTGC
-+
-67777788888888888888888877776555443222000//-/---,,,++**+)*)))()('''%$$""""""
- at 30BB2AAXX080903:3:8:1421:1061#0
-AAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGNGCCACANN
-+
-67777788888888888888888877776555443222200//.----,-+++***))))))(((('""##$$#""
- at 30BB2AAXX080903:3:38:202:141#0
-ATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCNCCNN
-+
-67777788888888888888888877776555443122100//..--,-,+++****))())((((("$$%"##""
- at 30BB2AAXX080903:3:3:1438:141#0
-ATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCACNGCCANAN
-+
-6777778888888888881488883777.55543322-100//..+-+,(,++)&))**))#()('%&"""%%"""
- at 30BB2AAXX080903:3:55:246:89#0
-TTCGCCTACACAATTCGCCGATCCGTCCCTAACAAACGAGGAGGCGTCCCTCCACTACTACTCTCCCACACCANCA
-+
-6777778388888888(88888887*4+6/$0,$12+1.0--/.,-",+$+'#$*'(&)'('#'#%#"""%&#"$#
- at 30BB2AAXX080903:3:50:659:294#0
-CGCCTACACAATTCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCCTCGCC
-+
-6777778888888888888888887777655542'222100//..---,,+++***)))())(((''$"##%$##"
- at 30BB2AAXX080903:3:47:685:1662#0
-GCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGTTAGGGACGGATCGGAGAATTGGGGAGG
-+
-6777778888888888888888887777655544321-100/...---,,,++**))*()(()('#'"$$#"""##
- at 30BB2AAXX080903:3:34:1682:758#0
-TCTCCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCANTAACATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&"%####"""
- at 30BB2AAXX080903:3:57:117:699#0
-ATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGTTAGGGACGCTCTTAT
-+
-67777788888888888888888877776555443222100//..----,+++*****))()(('''$&$%%#%$#
- at 30BB2AAXX080903:3:1:250:1496#0
-CCGATCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATACNCCNTGCC
-+
-677777888888882888888888777163323522210/1./.,),,,,+++**))))((((('&'$"%%""""$
- at 30BB2AAXX080903:3:53:746:1037#0
-TCCGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCGTAC
-+
-67777788888888888888888877776555443222100//..---,,++++****))*(()((&&$#%%#"##
- at 30BB2AAXX080903:3:35:405:1942#0
-GGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGATCGGANTCTCNCAN
-+
-677777888888888888888888777766554432211/00/..--,,,+++)***&*))))('('""%"$"$#"
- at 30BB2AAXX080903:3:33:884:1604#0
-CGTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAAGATCGNACACGANN
-+
-67777788888888888888888877776-45463221100./.-,,,+,,+++**'())*()((('"&#"%""""
- at 30BB2AAXX080903:3:42:956:1811#0
-GTCCCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCAGATCGGACTACT
-+
-6777778888888888888888889777655534321210///.-.--,,*++***)*)*))((((''&%"""##"
- at 30BB2AAXX080903:3:38:21:1839#0
-TATGGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACGCCTCCTAGTTTGAACCCCAT
-+
-67777788888888888888888877776555443212101//..---+,+++***(*)())(((('"""$###$#
- at 30BB2AAXX080903:3:55:1116:25#0
-CCTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCAGATACT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((''%&"$$#"#"
- at 30BB2AAXX080903:3:1:489:491#0
-TAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTGGCAATAATCCCCATCCTCCNCANCCTC
-+
-67777788888888888888888577766545453112100/../,-,,-*+++*)*))())((%'''"##"##"#
- at 30BB2AAXX080903:3:54:842:451#0
-CTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACCAT
-+
-6777778888888(88888878887*47655544521100&-/..+-,,-,,+*****())((((('"%%%&%#$$
- at 30BB2AAXX080903:3:50:697:1139#0
-TTTGTTGTTTGGATATATGGAGGATGGGGATTATTGCTAGGATGAGGATGGATAGTAATAGGGCAAGGACTGCACA
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*)))((((''""#""#"##
- at 30BB2AAXX080903:3:35:204:344#0
-GTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACNACAACANN
-+
-677777888888888888888888777765554432221/0//..---,,+++****))))))((('"%%#"%#""
- at 30BB2AAXX080903:3:34:195:294#0
-GAAATATTATGCTTTGTTGTTTGGATATATGGAGGATGGGGATTATTGCTAGGATGAGAGATCGGAANACTACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('('"$#""#$""
- at 30BB2AAXX080903:3:1:1365:1506#0
-CCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATANTANTTCT
-+
-67777788888888888888828877776555443222100//...--+,,+++**))))))((((''""""$#$#
- at 30BB2AAXX080903:3:36:1558:664#0
-TATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCCACGCCTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((#$'#"%#$""
- at 30BB2AAXX080903:3:50:1452:1649#0
-TATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAACACCAAAGCATAATATTTCGCCTCCTCAC
-+
-67777788888888888888888877776555443222100//...--,(,+++*+))))))()(('&%"$$#""$
- at 30BB2AAXX080903:3:56:819:1752#0
-TGGCTTAGTGGGCGAAATATTATGATTTGTTGTTTGGATATTTGGAGGATGGGGGTTATTGCTAGGTGTGTGTCTG
-+
-677747888888888888888888$777655544322-1/0%/..---+-+++*')($()(&(&((#'&%#"#$""
- at 30BB2AAXX080903:3:48:920:1781#0
-AGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTTGGATATATGGAGGATGGGGATTATTGTCACAGACC
-+
-67777788888888888828888877776565442222110./.-,-+,-+&+*))**))#((('('"%#&#""##
- at 30BB2AAXX080903:3:40:345:1151#0
-ATCCTAGCAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCNATCATACC
-+
-67777788888888888888888877776555,43222120//.-----,++++***))))((('('"$%%%$%$#
- at 30BB2AAXX080903:3:60:879:1349#0
-CAATAATCCCCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTCTGACANN
-+
-67777788888888888888888877776555443220100//..--,,-,,+****))())()(('&$"""##""
- at 30BB2AAXX080903:3:59:1716:418#0
-GGAGTCAATAAAGTGATTGGCTTAGTGGGCGGAATATTATGCTTTGTTGTTTGGGTATATGGCGGACAACAAANNC
-+
-67777788883888888888+8887177655(44/2022/0%0-..--,,,++*&)(*)))(#'(&%&%&#$%""#
- at 30BB2AAXX080903:3:40:84:1589#0
-AGGAGTCAATAAAGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTTGGAGATCGGAAGAGACAGCGACT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$$#"$""##
- at 30BB2AAXX080903:3:53:17:1179#0
-GGCTAGGAGTCAATAAAGTGATTGGCTTAGTGGGCGAAATATTATGCTTTGTTGTTAGATTGGGAGAGTATAGACA
-+
-677757888888888888888888777725554412+,001*/...,,,,,+++*)')((#((#'(#$#"""#""$
- at 30BB2AAXX080903:3:4:649:1000#0
-TCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCTNCACANCN
-+
-67777788888888888888888877776555443222100//-.---,,+)++***))))))((('""##"#"#"
- at 30BB2AAXX080903:3:46:1154:83#0
-TCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCACACTTT
-+
-67777788888888888888888877776555443222100//..---,,+++**+)***)(()((("#"#"$$""
- at 30BB2AAXX080903:3:49:391:1222#0
-AAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCAGATCGGAAGAGCGGTGTAGCAAAA
-+
-67777788888888888888888877776555443222100//..---,,+++**)))))))(('''$"#%###"#
- at 30BB2AAXX080903:3:37:472:268#0
-GGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGATTGGGTTAGTGGGCGGAATATTATGTGTTCTTCN
-+
-672777888848888888888888777725.111/2-2,%0/..,-&+-()*++*'*#%(#('('&%"$%###"#"
- at 30BB2AAXX080903:3:2:1170:677#0
-CAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCCTCATNATCACAC
-+
-6777778888888888888888887777655544323210///..---,-,,******((()('(('&""&%%%##
- at 30BB2AAXX080903:3:55:966:280#0
-TGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGAGATCGGACGGCTGTCA
-+
-67777788888888888888888877776555443222100//..-,-*,,+++**)'*()(('(('$&"""%$#"
- at 30BB2AAXX080903:3:50:1788:693#0
-TACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGAGTCAATAAAGTGATTGGCATAGACAG
-+
-67777788888888888888888877776555443220000//.,---,,+*))***))(&((&((($""#""$""
- at 30BB2AAXX080903:3:44:1750:1248#0
-AAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGGGCAATAAAGTGAT
-+
-67777788888888888888888877776555443222100//..-.-,,+,+***))()(()&#&'"#"%$"#"#
- at 30BB2AAXX080903:3:4:524:996#0
-ATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGANCACGNCN
-+
-67777788888888888888888877776555413220101//.,---,,+++*)))*(*)(('('&""%"#""#"
- at 30BB2AAXX080903:3:54:1370:421#0
-GATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGGTAGAATGAGGAGGTCTGCGGCTAGGGTGGAGTGC
-+
-67777788888888888888888877776555440222100%/...-),,++***')()(*((%('''"""""#""
- at 30BB2AAXX080903:3:42:143:1909#0
-TGATGGTAAAAGGGTAGCTTACTGGTTGTACTCCGATTCAGGGTAGAATGAGGAGGTCTGGGGCTAGCGTCCATCC
-+
-67777788888888888888888877776$55413222(/0/)..-,-,,+++****')(#)(&('&&""#$$"##
- at 30BB2AAXX080903:3:56:384:785#0
-AATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATTCAGGTTAGAATGAGGAGGTCTGCGGCTAGGGGCACG
-+
-67777788888888888888888877776555443221100//.,-,-,,,+****))((()()(''$&"""$#$"
- at 30BB2AAXX080903:3:36:1379:258#0
-TGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTAGNTCTGTAGN
-+
-67777788888888888888888877776555443222100//..---,,+,*+****))(()(((("%%&%$"""
- at 30BB2AAXX080903:3:53:975:1452#0
-TCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCCTTGGCTG
-+
-67177788888888888888888877776555443222100//...--,,+++*+()))'*((''''$"$&%%$""
- at 30BB2AAXX080903:3:39:594:1968#0
-CGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTCTGA
-+
-67777788888888888888188877776555443221000//..,--,++,+***))))())(((''&%%&&###
- at 30BB2AAXX080903:3:50:1097:1761#0
-GCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCGACCCTTTTACCATCATTGGACAGCGTGCAC
-+
-6777778888888888888888887777655543321210///.-)--,,,++**))*)))))(((&""#"""#""
- at 30BB2AAXX080903:3:55:772:1503#0
-GCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACCACTAGCCC
-+
-67777788888888888888888877076555443222100//...--,,&++**)()))))((((&"&#$$####
- at 30BB2AAXX080903:3:37:180:1854#0
-CAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAGCACTCACN
-+
-67777788888888888888888877776555443002100//..--,+,+++**))))))((((('$%#%#$##"
- at 30BB2AAXX080903:3:50:368:997#0
-CTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATACATAC
-+
-67777788888888888888888877776555443202100../.---,,,*+***))))())(((''$#"##"$%
- at 30BB2AAXX080903:3:46:1010:284#0
-AGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGGAGCTTACTGGTTGTGCTCCGATTCAGGGTTGTAGTCGGG
-+
-6777778888888888888888'8777745554432)2100//..--,,,)$+*)*(('('&')#'#&""#""###
- at 30BB2AAXX080903:3:2:1419:114#0
-ATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCAGATCGGAAANTGTCTAC
-+
-67777788888888888888288877776555443222/00+/..,---+++*$)*'))(('#(('#""%"$$"##
- at 30BB2AAXX080903:3:1:1447:542#0
-TCTAACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAAGATCGGAAGNTANATCG
-+
-6777778888888888888888887777654544032/100..--,---,,,++**))*))(#((('$"%""#"#"
- at 30BB2AAXX080903:3:33:223:699#0
-GAAGTATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGTCCTCCGATANTGCGACNN
-+
-67777788888888888888888877776555443222100//,.---,,,++*+*)(%))(((&('"%$#""#""
- at 30BB2AAXX080903:3:56:367:1126#0
-ACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCAGATCGGAAGACTCCG
-+
-67777788888888888888888877776555443222000//..----,+++***)))*)((((''$$##""##"
- at 30BB2AAXX080903:3:34:1416:632#0
-ATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGGTAAAAGGGTAGCTTACTGGTTGGCNTCCTAGNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((%%"&&##""""
- at 30BB2AAXX080903:3:39:928:402#0
-CGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTAGATCGGAAGAGCGGTCCC
-+
-67777788888888888888888877776555443222100/..-,-,,,,++****)*))())(('$&#"""###
- at 30BB2AAXX080903:3:59:457:1640#0
-GGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCAGATCTGATAAGC
-+
-67777788888888888888888877776555443222100//..--,,,++****)**)*)()((''"%##"""#
- at 30BB2AAXX080903:3:52:43:522#0
-TTAGGATTAGGATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGTGAAAAGGGTAGCTTCATGGATG
-+
-67777788888-8888888888887777655544.2120/,//.,-*)+,*++)'('(*))(#'('&"#"%%%"##
- at 30BB2AAXX080903:3:41:976:1353#0
-AACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAAGATCGGAAGAGCGGAC
-+
-67777788888888888888888877776555443222110/.-.--,,,+++***)*)))))((('%%#%$""""
- at 30BB2AAXX080903:3:58:1048:887#0
-CAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATCAC
-+
-67777788888888888888888877776555443222100//..---,-+,++**)*)))((((('&$&$""##%
- at 30BB2AAXX080903:3:1:952:396#0
-GTTGGTATTAGGATTAGGATTGTTGTGAAGTATAGTACGGATGCTACTTGTCCAATGATGAGATCGGANTCNCATC
-+
-67777788888888888888888877776555443220100//...--,,++)+***)*)()((#(&&"#$"$###
- at 30BB2AAXX080903:3:44:944:1948#0
-CTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTCAGA
-+
-67777788888888888888888877776555443222100//..---,-,+++*)*))))(((('''%%%%%%$%
- at 30BB2AAXX080903:3:56:1281:147#0
-TACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTACCTCCTT
-+
-67777788888888888888888877776555443222100///.---,-+,+***))*))()((((&"&#$##""
- at 30BB2AAXX080903:3:34:301:2039#0
-ACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTNCAGCACNN
-+
-67777788888888888888888877776555443222100//..----,,++***))*)))()'(("&#"#"$""
- at 30BB2AAXX080903:3:40:1323:925#0
-CCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCCTAATACCAACTATCTCCCTAATTGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)()('''&$%#%$$""
- at 30BB2AAXX080903:3:54:740:1683#0
-ACAAGGACAGGCCCATTTGAGTATTTTGTTTTCAATTAGGGAGATAGTTGGTATTAGGATTTGGATTAGCGTGGAG
-+
-6777778888888888888884887777655532222-100//,.--*,,,%#*+*)*&()#(('''$""%#%#$"
- at 30BB2AAXX080903:3:57:810:1004#0
-ATACTACAAGGACAGGCCCATTTGAGTATTTTGTTTTCAATTAGGGAGATAGTTGGTATAGATCGGAAGGATACAC
-+
-67777788888888888888888877-7655544322.0/0/...-,--,,+*+**))))()((((%&&""""##%
- at 30BB2AAXX080903:3:1:1068:707#0
-AAGGTTTTCATCTCCGGTTTACAAGACTGGTGTATTAGTTTATACTACAAGGACAGGCCCATTTGAAGNACNCACA
-+
-67777788888888888888888877776525443222000//.---,,,,++****)(')((((('""#%"####
- at 30BB2AAXX080903:3:2:1188:1280#0
-ATACTCAAATGGGCCTGTCCTTGTAGTATAAACTAATACACCAGTCTTGTAAACCGGAGATGAAAACCNGTTCCAC
-+
-67777788888888888888888877776555443222100//..--,,,,++****))))((((((%""&%$$""
- at 30BB2AAXX080903:3:37:78:1987#0
-AGACTTTTTCTCTGATTTGGCCTTGGAAAAAGGATTTCATCTCCGGTTTACAAGACTGGTGTATTAGTCAATACAN
-+
-67777788888888888888888877776555442221101//..-,,,,*++**)*))))((#(('"""##"#""
- at 30BB2AAXX080903:3:1:353:277#0
-GAGATGAAAACCTTTTTCCAAGGACAAATCAGAGAAAAAGTCTTTAACTCCACCATTAGCACAGATCTNCANTCAT
-+
-6777778888888888881888487/7760.5343000+0,-/---,,,,&*)&**(*('('((('%$"##""%#"
- at 30BB2AAXX080903:3:35:628:32#0
-AGAGAATAGTTTAAATTAGAATCTTAGCTTTGGGTGCTAATGGTGGAGTTAAAGACTTTTTCTCTGTNTTGTCANN
-+
-67777788888888888888888877776555441222100//...*--,++)**))*))('((((%"'%""##""
- at 30BB2AAXX080903:3:56:1670:650#0
-TTGGGTGGTACCCAAATCTGTTTCCCCATGAAAGAAGAGAGAATAGTGTAAATTAGAATCTTAAGATACACACACC
-+
-67777788888888888888$888777765554432.2100//..---,,+++***)))()(((((''&&%%$%%#
- at 30BB2AAXX080903:3:50:823:229#0
-TGGGTGAGTCAATACTTGGGTGGTACCCAAATCTGCTTCCCCATGAAAGAACAGAGAATAGTTTAAATCACACCAT
-+
-67771788888888882888388877776555443212100/0..---,,+++****))))((((('$$"#"%#""
- at 30BB2AAXX080903:3:42:1230:2002#0
-ATTTAAACTATTCTCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCACACAC
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*)(')(%#'%%'#$$###%
- at 30BB2AAXX080903:3:3:1281:452#0
-CTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATNTCCTNTC
-+
-6777778888888888888888887777635244333220/./..---+-*++++*))(*)(#('(($""#$"""#
- at 30BB2AAXX080903:3:52:1652:149#0
-GTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGCACACACAC
-+
-67777788888888888888888877776555443222100//..----,+++***))))'()(((%""%%$$$##
- at 30BB2AAXX080903:3:49:1560:2000#0
-TCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCCGTCC
-+
-677777888888888/88888888777//54,1222%21001+.,.&,'++)+)#*)&%('(('(&'"""##""##
- at 30BB2AAXX080903:3:51:770:842#0
-TCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTAGA
-+
-677777888888888888888880787755554432,2010//..---,,++++*+*)()()(('('%######$$
- at 30BB2AAXX080903:3:42:1433:1929#0
-TTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCACCAACCGCTATGTATTTAGTTCCTCT
-+
-6777778888888888888888$8937664554,3122.-/0..+,,-,,))**'())('()(('%'"#"#""#""
- at 30BB2AAXX080903:3:44:1337:358#0
-TTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGGGCATCT
-+
-67777788888888888888888877776555453212100//.--,,-,,+++*)*)))()'((%'&""""""#"
- at 30BB2AAXX080903:3:51:76:1710#0
-TCATGGGGAAGCAGATTTGGGTACAACCAACGCATTGACTCACCCATCAACAACCGCTATGAACCTCGTCCCCTCC
-+
-677777888888888,48888/88'767)3$504'2220&/0..,)-,+,,++)****%)%%(%'(($"""#$""#
- at 30BB2AAXX080903:3:43:1511:1868#0
-TGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACCTC
-+
-677777888888888888888888777765553430211////.-.,,,,+*+**)**)(())'(''&%#&$"##$
- at 30BB2AAXX080903:3:37:1601:1577#0
-GGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGTTGATGGGTGGGGCAATACTTGGGGGGGAACTATATATN
-+
-6777778888888888888888887777655544322110/-....-&,%%*+(*)*))))&((('#&$%%%""""
- at 30BB2AAXX080903:3:59:382:1713#0
-ATTTGGGTACCACCCAAGTATTGACTCACCCACCAACAACCGCTATGTATTTCGTACAAGATCGGAAGAGCAANNA
-+
-67777788888888888888888877776555443222100//..----,+++****)))))(((''&%%$"#""#
- at 30BB2AAXX080903:3:40:1281:1063#0
-TTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGGTGTTGGTGGGGGGGTCAATACTTGGGGTGTGTACAC
-+
-6777778888888888888888887777655,4432221-0/-.'&-,,,++(*&#)*')#')((('$%#"""""#
- at 30BB2AAXX080903:3:37:508:189#0
-GTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTGCATTACTGCCAGTCACCACTAACGAN
-+
-67777788888888888888888877776555443222100//..---+,++**+**)))))(((('"$""%$"""
- at 30BB2AAXX080903:3:33:1757:1818#0
-ACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATNGTCCTGNN
-+
-67777788888888888888888877776555443222100//.--,-,,+,++**)*)))))(&('"""$$""""
- at 30BB2AAXX080903:3:40:355:782#0
-ACAATATTCATGGTGACTGGCAGCAATGTACGAAACACATAGCGGATGATGAGGGGAGCGCTAAGAGNCTGGGGCC
-+
-6/777084888888888888888*77776545443+22000//..--++,+')+&*)*')#%&(##%"$#&""###
- at 30BB2AAXX080903:3:40:209:2014#0
-CCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCAAGNTCGCAAAC
-+
-67777788888888888888888877776555443222100//..--,,,+++***))))()(((('"&#&"""#$
- at 30BB2AAXX080903:3:46:1441:1189#0
-CCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATANTACAGACA
-+
-677777888888888888888888777765554432221/0//..---,,+*++*****)))(((('"""$"""##
- at 30BB2AAXX080903:3:50:916:860#0
-CCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAAGATCGGAAGAGCGGTCACCCA
-+
-677777888888888888888888777365554432221-0///.--,,,+,++)*)*))((((((#%$"#"####
- at 30BB2AAXX080903:3:2:760:721#0
-GTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGAGGTTGTTGATGGGGGAGTNTACACAT
-+
-677777088888888888881888777765/143302*1/0//-+--,-(++***')(#''((#(&'"""%#$#""
- at 30BB2AAXX080903:3:39:1742:542#0
-GTACCGTACAATATTCATGGTGACTGGCAATAATGTACGAAATACATAGCGGTTGTTGATGGGTGAGTCCATTCTG
-+
-67777788888888888888888877776555443222100./...--,-+++**)*))())(#(''%%"&$"""#
- at 30BB2AAXX080903:3:52:963:1624#0
-ATGGTACCGTACAATATTCACGGTGACTGGCAGTAATGTACGAAATACATAGCGGGTGGTGATGGGTGCAGGCTGC
-+
-67/77788888888888388888,777765554432/2$-&/'.-+.+,,*'(+*))*()(#()('&&$""$####
- at 30BB2AAXX080903:3:58:307:207#0
-TATGGTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGTTGTGGGGGGNGTCNNC
-+
-67777388888888888888888847+7655544%5/01/../,--,,+,('*'**&#*&&(##''''%"%"#""$
- at 30BB2AAXX080903:3:4:1229:619#0
-TTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAGATCGGAAGAGNCGTCNCN
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((((('""%$"$"#"
- at 30BB2AAXX080903:3:53:1240:1660#0
-ACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACACAGAACG
-+
-677777888888888888888888777765554432221001/..---+,,+++***))))((((''%###&"#$#
- at 30BB2AAXX080903:3:35:189:196#0
-TCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTAGATCGGAAGNTGCGTCNN
-+
-677777888888888888888888577765554432221000/..-,-,,++++*))))))((((('"""$"##""
- at 30BB2AAXX080903:3:34:148:519#0
-CAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGTAATGTACGAAATACATAGCGGTTGNCCACTCNN
-+
-67777788888888888888888877776555343222100/-...-+-,++++**)))))()((%'"#%$$"#""
- at 30BB2AAXX080903:3:4:985:1056#0
-TGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGGAATGTACGAAATACATAGCGTNCGTANTN
-+
-6777778828888888888888.8777765*54432%200.//..-*,,++$+'*)'*&)((&&(&'""%"$""#"
- at 30BB2AAXX080903:3:3:699:1843#0
-TCAACAACCGCTATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACCAAGATCGGNAGANNCG
-+
-677777-8888888888888888877779555482221//0/..,,-,,,,+++*)&(()(((('('$"""#""##
- at 30BB2AAXX080903:3:50:1740:362#0
-TATGTATTTCGTACATTACTGCCAGTCACCATGAATATTGTACGGTACCATAAATACTTGACCACCTGCGCACAGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''$$"%#%#"#
- at 30BB2AAXX080903:3:43:1723:370#0
-TTATGTACTACAGGTGGTCAAGTATTTATGGTACCGGACAATATTCATGGTGACTGGCAGGAAAGGAGGGGGATAC
-+
-67777788888888,888/-88587777662(4231.0210/....,*+-*,++#*)((')'(#(%'%#&"""##"
- at 30BB2AAXX080903:3:44:649:1570#0
-TGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACTGGCAGGGGGTCGGG
-+
-67777788888888888888888877776555443222100///.--,,-++++**)*))()((((&""%$""$$"
- at 30BB2AAXX080903:3:47:613:1319#0
-ATGTGGATTGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGTGACGCGCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))()(((('$%#"$$""#
- at 30BB2AAXX080903:3:48:452:648#0
-GGTTTGATGTGGATTGGGTTTTTATGTACTACAGGTGGTCAAGTATTTATGGTACCGTACAATATTCATGGGGAGT
-+
-67777788888888888888888877776555443122+0.//*----,,,+++*+)))()((((''%%&$"##""
- at 30BB2AAXX080903:3:45:1570:1609#0
-TGAATATTGTACGGTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCAAGATCGGAAGCGCGCTG
-+
-67777788888888888888888877776555443222101//..----,+*+****)*))))((('%%###""""
- at 30BB2AAXX080903:3:46:220:1308#0
-GGGGGGGGGGGTTTGATGTGGATTGGGTTTTTTTGTACTACAGGTGGGCAAGTATTTATGGTAACGTCCCTACCTC
-+
-677777888888888+88*8838877776555,422,'1.+1/.'--,),,+*)**)$))(%'#(('%$$"#####
- at 30BB2AAXX080903:3:60:439:622#0
-GTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCACATCAAACCCCCCCCCCCCCGCGTCAGTNN
-+
-67777788888888888888888877776555442022000./..---,,,*****)*)))(('###$""##"#""
- at 30BB2AAXX080903:3:4:40:2019#0
-TGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGGTTGGGGGGGGTTGGCNCTCTNTN
-+
-677777888888888888888884.7776555413222000//..---,,+,'('*%')'((%&#''""""#%"#"
- at 30BB2AAXX080903:3:49:898:1401#0
-TAAAAACCCAATCCACATCAAACCCCCCCCCCCCATTCTTTAAAAAAAAGACAACAAACAACCCCCCCACCGCGAT
-+
-677777888888888,888804/1077;6/224)#$##(/&$),%$&))&)$%&#&(&##&#&####""#%"""""
- at 30BB2AAXX080903:3:36:1068:1677#0
-TGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGGTGATCATCCN
-+
-67777788888888888888888877776545443222100//..-.,,,+++****)*))((((&'"""$$###"
- at 30BB2AAXX080903:3:59:1634:1181#0
-TGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGTTCAACCANCA
-+
-67777788888888888888888877776555443222100/0..-.-,,,++***)))))((('''$'%%%#"$$
- at 30BB2AAXX080903:3:40:232:782#0
-TTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGGGGGGGGGGGGTCTAGTGTCA
-+
-67777788888888388888888877776555443222100//..---,-+++***)))))((('('$&#"##"##
- at 30BB2AAXX080903:3:46:1552:973#0
-GGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTAAGCATGTCCGCGCC
-+
-677777888888888888888888777/65554/321210&//.---+,-+$(**+()*()&((#''%"#$"#"##
- at 30BB2AAXX080903:3:46:374:1334#0
-CCCCCCCCATGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCAGATCTGAAGC
-+
-67777788888888888888888877776555443212100//..---,,+++**+*))*))((((&&$$##""""
- at 30BB2AAXX080903:3:38:1280:1689#0
-TGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTGCTTGTACGTGTTACA
-+
-677777888888888888888888777765554432120000/...--,+,+*+***))))'))(('%$%$$""#"
- at 30BB2AAXX080903:3:58:243:1377#0
-CCCATGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCACGCNC
-+
-.7777788888888888888888877776555443222100//..-.--,,,+***)*)))))(((''&%#&"$""
- at 30BB2AAXX080903:3:46:520:139#0
-TGCTTACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCAGA
-+
-67777788888888888888888877776555443222100/....--,,,+++**)*)))()((('&$%$&$"""
- at 30BB2AAXX080903:3:50:1379:95#0
-TAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGTTGCTGTACTTCGCTGGGAG
-+
-67777788888888888888888877776355443222120//-..--,,+++***)*)*)())('(""%"""##"
- at 30BB2AAXX080903:3:53:1562:1290#0
-CTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGTTGGGTGGTGTACTCACATCAAC
-+
-67777788888888888888888877776555443022100//.--+-,,+++**+)$)*#))('%&$$%%$###"
- at 30BB2AAXX080903:3:52:111:895#0
-ACAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTGGAA
-+
-67777788888888888888888877776555443222100//..---,,+++******))))((''&&#&&&#""
- at 30BB2AAXX080903:3:57:1136:59#0
-CAAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAAGCC
-+
-6777778888888888888888887777655544322210///..---,,+,+**)))))))((((''$$#%%"#"
- at 30BB2AAXX080903:3:59:377:73#0
-AAGCAAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTCTGNNA
-+
-6777778,888888888888888877776555443222100//.-.--,,+)***+**)))()(((''&&"$#""#
- at 30BB2AAXX080903:3:4:786:1138#0
-GGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTNCACANCN
-+
-67777788888888888888838877776555843522000*/.--)-'+++#+*')))&())''(#""""##"""
- at 30BB2AAXX080903:3:59:1112:304#0
-GGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTCTCTCANG
-+
-67777788881888888888888877776555443222000//.,-,-,,++*+*))*)#))('((''$%""&%""
- at 30BB2AAXX080903:3:43:454:229#0
-TGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGTTGAGGGGTGGTTGCTGGACTTG
-+
-6777778888888888888888+8777765554432221.0/...--,,++*+***))))')(('('%%%#""$$#
- at 30BB2AAXX080903:3:48:244:91#0
-AAGTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGACTCACCC
-+
-67777788888888888888888877776555443222100//..---+,,,+**+)*)))))((('$"#"$$###
- at 30BB2AAXX080903:3:37:1280:1001#0
-GTACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATCCGACCN
-+
-67777788888888888888888877776555443222100//..---,-++++**)))))()((''%&$%#%%#"
- at 30BB2AAXX080903:3:43:339:741#0
-ACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAC
-+
-67777788888888888888888877776555443222100//..---,,,++***))*)))((((''&%&%%$$#
- at 30BB2AAXX080903:3:48:925:871#0
-ACAGCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATATCACATAC
-+
-67777788888888888888888877776555443222100//..---,,+++*****))))(((('&"$$%$"#"
- at 30BB2AAXX080903:3:57:610:143#0
-GCAACCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTATGATACCAACCACACA
-+
-677777-88888888888888888777765554432221010/...---,+++**+*)*(#)('((('$"$%$##"
- at 30BB2AAXX080903:3:41:1598:398#0
-TGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTGCAGTTGATGTGTGATAGGTGGGGTATC
-+
-67774788888888880888888877771535443*22100//.--,-,,)+'**&**&)')''((%'$#%""#"#
- at 30BB2AAXX080903:3:36:1607:1024#0
-CAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCACCCCTCNN
-+
-67777788888888888888888877776555443222100//..---,-++++*))*))))((('(&$#%#$#""
- at 30BB2AAXX080903:3:60:1483:1864#0
-AACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACACAACANAANN
-+
-67777788888888888888888877776561481202001-..-.--,,++)%*)'*((&#(('(&&$#&"$%""
- at 30BB2AAXX080903:3:53:1212:415#0
-TATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTCACCACC
-+
-67777788888888888888888877776555443222100//..---,,,++*+*)**)))))'('"##&#%##$
- at 30BB2AAXX080903:3:36:808:1994#0
-GTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGGTTTGGAGATAGGGAGATCTCTCNN
-+
-67777788888888888888868877776555-12321100%/+/---+,,)***))#)'(#((%&#%#&##"$""
- at 30BB2AAXX080903:3:50:840:1990#0
-GTACTGTTAAGGGTGGGTAGGGTTGTTGGTATCCTAGTGGGTGAGGGGGGGCTTTGGAGTTGCAGTTGCGATCACT
-+
-677777888888808888888)8877776345113,2%100-/*.---$,+&+)***$)(()##(%'"#"""#"#"
- at 30BB2AAXX080903:3:38:404:1533#0
-ACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTAGATACGCANACT
-+
-6777778888888888888888887777652524122010//.--.-,-,,*+*+*())()(((('%"$%#"""#"
- at 30BB2AAXX080903:3:52:118:1596#0
-ATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGACACTAGCC
-+
-67777788888888888888888877776555443222100//..--,,-+,++*))*)))()((('$%"$"$"""
- at 30BB2AAXX080903:3:49:646:1661#0
-CAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTAAATAGCACA
-+
-67777788888888888888888877776555443222120//..---+,++)+**))))))(((''$"#""####
- at 30BB2AAXX080903:3:60:602:369#0
-ATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGAGTTCACCNN
-+
-67777788888888888888888877776555443222100//.----,,+++***)()))((('''&'#%###""
- at 30BB2AAXX080903:3:58:710:1583#0
-TATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGCTTTGGGGGCGANTA
-+
-67777788888888888888888,777-65534331221.0/./.)-+,,+&+***))())((((((""##"""""
- at 30BB2AAXX080903:3:49:1156:518#0
-CTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAGACCTACCCACCCTTAACAGTACATCATCCANCT
-+
-63777788888888$888885888777363.343-2./10./%.--,-,,+++$))#()())(('('""""%#""#
- at 30BB2AAXX080903:3:55:1543:1116#0
-CTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACAACACACCACA
-+
-6777778888888888888888887777655544323$100///-----+,++*****))))(('('$$%&"""$#
- at 30BB2AAXX080903:3:48:1310:1002#0
-TGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGGTTTGGCGC
-+
-67777788888888888888888877776555443222100//...--,-+++***)))()((('''"$###"###
- at 30BB2AAXX080903:3:2:131:1913#0
-ATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTAGATCGGAANTGCNNTA
-+
-67777788888888888888888877476545441522200//..--,,,++*+***)())((#(('"""$"""#"
- at 30BB2AAXX080903:3:42:1035:1027#0
-AATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGGTGGATTGGTC
-+
-677777888888888888888888777765504433221*0//-..---,,,*+*))))()'((((&'%"#$#"#"
- at 30BB2AAXX080903:3:53:1623:1497#0
-CCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATACACACCAAC
-+
-67777788888888888888888877776555443222100//...--,,+++***))))))()''%%&%#$$#$#
- at 30BB2AAXX080903:3:39:1298:1490#0
-AAGCCACCCCTCACCCACTAGGATACCAACAAACCGACCCACACGCAACAGGACAAAGAACACAAACATCTTTCAA
-+
-6777778888388+8882&288877/55635243.%.,1-..&*%%-''+*$+(*#''#'%(%''('"$#"$"#""
- at 30BB2AAXX080903:3:53:629:128#0
-AAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACACAAAGCTCATCACG
-+
-67777788888888888888888877776552443222100/0..,--,,+*+*+*))())(%((&'%%%"$%%%#
- at 30BB2AAXX080903:3:58:12:700#0
-GGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGTGAGGGNGGCNNC
-+
-67777788888888888888888877776555443022101//-.---,,+++**)*))))()#'''&$"""#""$
- at 30BB2AAXX080903:3:56:779:1644#0
-CCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACACGC
-+
-67777788888888888888888877776552412'220/0/..-.,-+,,++**)))))()((%('$%##$#$""
- at 30BB2AAXX080903:3:48:1165:1269#0
-TGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTGGGCAGCTCAC
-+
-67777788888888888888888877776555443222100//.----*,+++*****)(')(((''&$""$"%#$
- at 30BB2AAXX080903:3:56:874:1115#0
-ATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGCGGGTAGGTTTGTTGGTATCCTAGTAGAGAGGATC
-+
-6777778888888888888888887717635,44322.100./..---,+-++***)(*''(((((''$"%&"#"#
- at 30BB2AAXX080903:3:1:1397:1840#0
-GCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGNTGNCAGT
-+
-67777788888888.8888618887227636501222.0.,/..%.--%+,+(***)())#'('''&'""""#"""
- at 30BB2AAXX080903:3:46:450:1935#0
-GTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTGGGTTTGTTGGTATCCGCGGGGGTG
-+
-67777788888888888888888807776/55443.(2100....-(-,,+)++#***)))((((#'$%%""$#""
- at 30BB2AAXX080903:3:58:1058:1119#0
-GTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCTAGTACCTC
-+
-67777788888888888888888877776555443222100//..-*-,,*,+*)*))&*)(((''(&$&%#####
- at 30BB2AAXX080903:3:46:1076:1244#0
-CCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACACAGCCAAGA
-+
-67777788888888888888888877776555443222100//..---,,++++**))))))((''&$%$##""#"
- at 30BB2AAXX080903:3:50:380:1721#0
-AATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGGGGGGAGGTTTGTTGGTATCCCACGGG
-+
-67777788888888888888888877776555340222100//..---,$+++&)*)$))))(((&#"""""##""
- at 30BB2AAXX080903:3:42:813:616#0
-GTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTGGTATCCGTNT
-+
-67777788888888888888888877776555443222100//..---,,+,+****))())(('(&'$&&%$""$
- at 30BB2AAXX080903:3:37:1750:557#0
-CTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGTTCTTGTTGNN
-+
-67777788,88888888888888877776555443222000./..-,-,,+++&**)&)))((('''"$%%"%$""
- at 30BB2AAXX080903:3:41:1315:569#0
-ACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTTGGTGCGCTTCC
-+
-67777788888888888888888877776555443222100//.---,,-+++***))#)))&)((%&$#&"""$"
- at 30BB2AAXX080903:3:46:815:664#0
-GACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAAGATCGGCGTCATGG
-+
-67777788888888888888888877776555443222101//-/---+,,'+**')))&)((('&''$""$#"##
- at 30BB2AAXX080903:3:55:1479:86#0
-TTGACTGTAATGTGTTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGGTAGGTTGGTGTCGTA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))'(('(&$#$"""#""
- at 30BB2AAXX080903:3:39:543:919#0
-TTTGACTGTAATGTGCTATGTACGGGAAATGGCTTTATGTACTATGGACTGTTAAGGGTGGGTAGGGTTGGTGCAT
-+
-67777788888888888888888877776555843*211/01...-&-,-+++***))#))('(('&"%#"$#"#"
- at 30BB2AAXX080903:3:37:314:1099#0
-ACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACTCTCACAN
-+
-67777788888888888888888877776555443222100//..---,,+,++**)))))()((''$$""%"$#"
- at 30BB2AAXX080903:3:60:1103:496#0
-ACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACCGCCATNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((''$%###"""
- at 30BB2AAXX080903:3:42:367:1499#0
-GGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGAGATCGGAAGAGCGGTTCTGAGGGNA
-+
-677777888888888888888888777763554432-2101/.-,--+,,&++****)))))#((#''$%#%"#""
- at 30BB2AAXX080903:3:38:1676:659#0
-CAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAGATCCCTN
-+
-67777788888888888888888877776355443222100//..---,,+++***)*)))()(''&$"$&&#$""
- at 30BB2AAXX080903:3:60:998:1537#0
-GAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGGGTGGCGAACANN
-+
-67777788888888888888888877776555443222100//..----,,++++*)))))()(''&%$"##$$""
- at 30BB2AAXX080903:3:41:534:484#0
-ACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACTGTTAAGTGGCGGTCT
-+
-677777888888888848888888777765554432.2000//..--,,,++*+***))())()''&%$%#""###
- at 30BB2AAXX080903:3:8:1294:565#0
-CATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTACNCGCCACNN
-+
-67777788888888888888888877776555443222100//--,--,,+,+++**))())((('%"##$%#%""
- at 30BB2AAXX080903:3:44:462:1317#0
-CCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCAGATCGGGAGCC
-+
-67777788888888888888888877776555333222100/.-.---,,,++++*)*('((%(((''&%""##"#
- at 30BB2AAXX080903:3:36:511:156#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGGACTATGTNCTTACACN
-+
-677777888888.888888388880777655540322110///-.'-++,+++**)))*((#((#''"$%"%$##"
- at 30BB2AAXX080903:3:55:304:632#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGCGCTATGTACGGTAAATGGCTTTATGTAAGATCGGCGGGACCT
-+
-6777778888888888888488887777555343322-10//...%,,,,,+'***))(((((('&&%"#"""$""
- at 30BB2AAXX080903:3:56:255:1024#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGAGATCGGACGGACCTAC
-+
-677777888888888888888888777765554432221000/...,-,,++++****)))))'(('$$""$"#"#
- at 30BB2AAXX080903:3:56:899:1956#0
-TCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACTATGTATGATCAAT
-+
-67777788888888888888888877776555443122100//..---,,++)++*))*))'((((''###"#"#"
- at 30BB2AAXX080903:3:35:1422:1443#0
-TAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCNCCCACCCN
-+
-67777788888888888888888877776555443222100//..---,,,*++**(**)))(((('"$#"####"
- at 30BB2AAXX080903:3:51:461:754#0
-TAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCTCCTATCT
-+
-67777788888888888888888877776555443222100//..---,-,++***)))))((((('&""#"""""
- at 30BB2AAXX080903:3:34:758:1173#0
-AACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCNATCACTNN
-+
-67777788888888888888888877776555443222000//...--,-+,***)*))))((((''""%##%"""
- at 30BB2AAXX080903:3:51:612:182#0
-TCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTAGATCGGACCACACGTC
-+
-6777778888888888888888887777655244322210///.,---),+++**()*)))(('(''$$"""#""#
- at 30BB2AAXX080903:3:43:861:1849#0
-ACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGAGATCG
-+
-67777788888888888888888877776555443220110//.---,,,+++)*)**)))(((((&&'%%&"#$$
- at 30BB2AAXX080903:3:56:803:2016#0
-AGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGTGCTCACT
-+
-6777+788888888888888888877776555443222000//...--+-+*****()))(((((&('"$$$$#$"
- at 30BB2AAXX080903:3:54:530:404#0
-GGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTACGCTGGTCT
-+
-67717088888888888888888873776555443220100///.-,,,,,+++*)**)))()((''&"#$$#$##
- at 30BB2AAXX080903:3:60:1423:74#0
-GGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATAGATCGGAAGGACACACCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))&(((('#%&&%%$%""
- at 30BB2AAXX080903:3:52:233:1754#0
-GGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGGAAATGGCTTTATGACTCATGT
-+
-677777888888888888888.880777655543/3210/0/%.,,,,,&++++&#)()()'(((&'&$$""#$$"
- at 30BB2AAXX080903:3:52:655:1729#0
-GAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTTTATGTATTTT
-+
-67777788888888888888888877776555443222100./..-,-,,+,+)**))())))'(('&"$%"##"#
- at 30BB2AAXX080903:3:33:1263:126#0
-TGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGCACGGCAAATGGCTTNTCTACCNN
-+
-67777788838888888888888877976552101210200..-.--,,+,+%+**)#)')(((#''"$$#$##""
- at 30BB2AAXX080903:3:37:262:1056#0
-TGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGGGCTATGTACGGTAAGATCGGACACCACTAN
-+
-6777778888888888888888887777655.44321/.0/1/.,&-+-++++*)**)))()(''('&"$#"$"#"
- at 30BB2AAXX080903:3:46:346:760#0
-AGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCAGATCGGAAGATATGTCC
-+
-67777788888888888888888877776554443222100//..--+,,,)%)*)**('''('(%'$""#"""#"
- at 30BB2AAXX080903:3:41:288:1891#0
-CTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAATGTGCTATGTACGGTAAATGGCTCTATGTCCC
-+
-67777788888888888888888877766555343222100///.----,++++*))*)()((((&&%$%%$$##"
- at 30BB2AAXX080903:3:50:662:506#0
-GTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCACCTCAGA
-+
-67777788888888888888888877776555443222100///.---,,++++*)))**)(((((%&"%$$%"##
- at 30BB2AAXX080903:3:50:1762:337#0
-TACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCACCCCCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(((('$"$#$#"""
- at 30BB2AAXX080903:3:2:1266:798#0
-AAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATAGATGACCCCCCTCCNATATATC
-+
-67777788888888888888888877776555443221110///.-,-,,+,++***))))((((''%"#$#"#"#
- at 30BB2AAXX080903:3:4:792:1223#0
-ATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGCNCTCANGN
-+
-67777788888888888888888877776555413222100//.--,-,,+++**))()()))('''%"#"##"#"
- at 30BB2AAXX080903:3:45:1487:923#0
-TTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGTNCACCCG
-+
-67777788888888888888888877776552443222100//..---,,+,++**))))))('(('$""$"##""
- at 30BB2AAXX080903:3:3:875:1311#0
-TGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGAGATCGGACNAGTCNCA
-+
-6777778888888888488888887777353533122210.-/+.),,-,*****)())()(&'((&""#""#"##
- at 30BB2AAXX080903:3:49:1718:1404#0
-GTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCGTGCTTAGC
-+
-67777788888888888888888877776555443012100//..-,,+-++++**)))))))&'&#"#$%""""#
- at 30BB2AAXX080903:3:52:1424:1588#0
-TACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGAGATCGGAAGAGCGTGCCAGC
-+
-67777788888888888888888877776555443222100//..----,+++***))))))(('(&%""$"""##
- at 30BB2AAXX080903:3:38:1342:752#0
-GATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTAACGCGTCACA
-+
-67777.88888888888888888877776555413202120//...--,,++++*)')))(((('&'$&"$$"#%$
- at 30BB2AAXX080903:3:45:1567:27#0
-GATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAGATAGGAAGAGCGGTGCAGTTGCAC
-+
-67777(88-88888888828838837/723554430(,0'0//&,,,,,-+++*#&*&)(((#((##&""""###"
- at 30BB2AAXX080903:3:59:885:1091#0
-GCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACNCNCAGTC
-+
-67777788888888888888888877776555443222110//.----,,++++***))))((((''&"$"##""#
- at 30BB2AAXX080903:3:3:669:505#0
-CACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGCNTGTANTG
-+
-67777788888888888888888878776555413222100./.-,--,-+++***)())))(((('%"#&##""#
- at 30BB2AAXX080903:3:43:754:1987#0
-CACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGACTGTGACG
-+
-6777778888888888-888882-7'77255/4$322210.+..,$&,+-+,%$*)*#&)(('#'''""%%%#"#"
- at 30BB2AAXX080903:3:46:659:673#0
-TCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGGGGACGAGAAGGGATTTGTGTAGAGG
-+
-67777788888888888888888877776555443222100//..---,,+++++**)*))(((((''""$#$"""
- at 30BB2AAXX080903:3:36:1108:197#0
-GTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGNTCACTACN
-+
-67777788888888888888888877776555443222120//..-,-,,+,++**))))))()(('"$#"%&$$"
- at 30BB2AAXX080903:3:56:1455:1407#0
-AATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAACCTAACAC
-+
-67777788888888888888888877776555443212100/...,.,,,,++*))*))*)()(((%$%"#""$#"
- at 30BB2AAXX080903:3:46:640:575#0
-TTCTCGTCCCCATGGATGACCCCCCTAAGATAGGGGCCCCTGGACCACCACCCTCCGTGAAACAAATATCCGCCAA
-+
-6777778888888888888888887'4765'04432%21000++.&--&-&*))*))#)(((&(('%"$$%"##""
- at 30BB2AAXX080903:3:3:582:1307#0
-TGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCATGTNNTACNAT
-+
-67777788888888888888888677(76535332.-101.-.*-*+)),,'+**)*)#&'''&%&'$""""%"#"
- at 30BB2AAXX080903:3:38:492:589#0
-TAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCTATCTGAGGGGGGTCATCCTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$$#%%%""#
- at 30BB2AAXX080903:3:59:1015:644#0
-AGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGCGGTCAAGGGACCCCTATAGATCGGTCAAC
-+
-677777858888888888888888777765254432221/0//,--$-,,,+)**+*))())(((('&&&#"$###
- at 30BB2AAXX080903:3:49:462:1243#0
-CCCCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCT
-+
-67777788888888888888888877776555441212100/..----,,++++*)*)))((()(('%$&%$%##"
- at 30BB2AAXX080903:3:2:1301:909#0
-CGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCCCNAGCGACG
-+
-67777788888888888888888877776555443222100//..---,,+++(**()))))((''#&"#%&$"""
- at 30BB2AAXX080903:3:33:1027:786#0
-CCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGGGACCNCTCGACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))(((('&"%%$&#%""
- at 30BB2AAXX080903:3:56:350:1962#0
-CCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGGATGGTGGTCAAGATCGGGAGAGTTCC
-+
-67777788888888888888888877776555443222100//..---,,,++*+*)())(((((('"%&##""##
- at 30BB2AAXX080903:3:44:219:1775#0
-TAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCAGATCGGAAGAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''$&%%#"###
- at 30BB2AAXX080903:3:48:1429:955#0
-GGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCCAGAACGCACACA
-+
-67777788888888888888888877776555433222000/../---+,+,++)***)'(((''('"$#"#####
- at 30BB2AAXX080903:3:38:1706:394#0
-ACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACCGCTGGANN
-+
-67777788888888888888888877776555443222000//..---,,++++**)))))(('(('"$"&"##""
- at 30BB2AAXX080903:3:37:1024:956#0
-CCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGAGTCTCTAGTN
-+
-677777-8888888888888888877776555443222100//.----,,,,+*****))))(((('"$&$"#"""
- at 30BB2AAXX080903:3:42:1137:1299#0
-CACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGACCATAACACTTGGGTTCT
-+
-677777888888888888888888777765554432/2000//...---,++*+*))&))(((((((&&%%%""""
- at 30BB2AAXX080903:3:36:975:1594#0
-TACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGCGATCTCTN
-+
-67777788888888888884888877774551443.221/0/...-,-,-++****()()(((('('%$""$"#""
- at 30BB2AAXX080903:3:45:797:292#0
-GCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGATATTGATTTCACGGGGGCGGG
-+
-67777788888888888888888877776545443222100//..-.-+,+++***)))))(((((('&""%##""
- at 30BB2AAXX080903:3:49:123:1918#0
-CAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTTGTGCGGGANTCTTCTAC
-+
-67777788888888888888888877776555443322000//...--,,++*+***))))((((''"%$$##$""
- at 30BB2AAXX080903:3:42:446:886#0
-ATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGAC
-+
-67777788888888888888888877776555443222100///.---,,++++)))))))))(('''%&%#$$"#
- at 30BB2AAXX080903:3:53:790:383#0
-GATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTAGCACTCTCGTGATG
-+
-67777788888888888888888877776555443122100//..---,,+++***()))()()(('&$#%&%""$
- at 30BB2AAXX080903:3:56:1256:1063#0
-CAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGAGCGGATGTACTCA
-+
-677777888888888888888888777763554612201.0//..-*'+,+++'***)')())'#''"%%%&##$%
- at 30BB2AAXX080903:3:36:1220:1187#0
-AACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGAGTGGTGTNCN
-+
-67777788888888888888888877776555443222001//..---,,+,+***)))))'((((#$$&"%$"#"
- at 30BB2AAXX080903:3:34:958:571#0
-GAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGGAGAGTNCGCCTANN
-+
-67777788888888888888888877776555443222100*/-.-,-,,,)*+**)*))))((((%""""#"#""
- at 30BB2AAXX080903:3:1:295:568#0
-GTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTATGGGCCCGGAGCGAGAGANCANAACA
-+
-677777888888888)888880087627655544122.0//-+..--,,++,+*'((*)()'('('(""%""""##
- at 30BB2AAXX080903:3:50:1738:1119#0
-GCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGACATCTGGAGACTCTAG
-+
-6777778888888888888888887777655544322*100//-.---+,,++***)*))))(((('"""#"#""#
- at 30BB2AAXX080903:3:56:1659:521#0
-TGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAGTGTTAGATCGGAAGAGCGACAAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&'%#%%$%$$
- at 30BB2AAXX080903:3:4:1086:896#0
-TCCGGGCCCATAACACTTGGGGGTAGCTAAAATGAACTGTATCCGACATCTGGTTCCTACTTCAGATCNGACANCN
-+
-6777778888888888888888887777656544521211./.-.---,+,++***())())''('(%""""""#"
- at 30BB2AAXX080903:3:42:1353:411#0
-TGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACCCCCAAAGAC
-+
-6777778888888888888888883787656544321110.//...-+,,*,%**))*()'(''(''&%&"#%"""
- at 30BB2AAXX080903:3:52:707:1478#0
-TGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGCTACACCCACAC
-+
-67777788888888888888888877776555443221100//...--,,+++***)**)))((((''""$#$%$"
- at 30BB2AAXX080903:3:51:1717:173#0
-CGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAACACAACACAC
-+
-677777888888888888888888777765554432221&1//.---),,+++(**&)()))((('&$$%&%&$$$
- at 30BB2AAXX080903:3:50:1121:1425#0
-GAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTAGATCTGCTGCTACG
-+
-6777778888888888888888887777355544321210//.----,,,,+***)())(((((('#$#""$""#"
- at 30BB2AAXX080903:3:40:1656:1952#0
-GGAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGTCGGATACAGTTCATTTTAGTCNCAC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))))))((((''&$#$"$#$
- at 30BB2AAXX080903:3:48:1643:1982#0
-GTAGCTAAAATGAACTGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACANCACTCTC
-+
-6777778888888888888888887777655240322010/0/..,-,,,,++*)+**))))&('('&"%#$"#"#
- at 30BB2AAXX080903:3:55:1468:822#0
-AATGAACTGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACAGATCGGAAGCTCTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&'&"#""$""
- at 30BB2AAXX080903:3:36:1334:1173#0
-TGTATCCGACATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATTAGACNTCN
-+
-67777788888888888888888877776555443222100//..---+,+++***)*)))))('(#"&%#$"##"
- at 30BB2AAXX080903:3:37:218:257#0
-TGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGGCCCTGAAGTAGGAACCAGATGCTGGANACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))(((&$%&&#"##"
- at 30BB2AAXX080903:3:53:1174:25#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTGAGGAGTG
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))))('''$$#%%"$""
- at 30BB2AAXX080903:3:38:251:416#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCGCAACCTA
-+
-67777.88888888888888888,777765554430.2100/..,.--+-++)')*)))'(%&'(&'$""##"#"%
- at 30BB2AAXX080903:3:1:625:1741#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGNTCNACTG
-+
-6777778888888888888/888)77776355443/2/100-/,.--*+++++)*)*)*((((((''""##""##"
- at 30BB2AAXX080903:3:36:943:1853#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGCTCGCTCNN
-+
-67777788888888888888888877776555443221100//...--,-+,+*****)))(((((#%&#%$$$""
- at 30BB2AAXX080903:3:52:1558:1025#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGCACAGGTAC
-+
-67777788888888888888888877776555443222100//-.---,,+,+***)*)))))('('$$&"$""#"
- at 30BB2AAXX080903:3:37:1103:1443#0
-AGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTATTNGNCGCN
-+
-6777778888888888888888887777655544222210./...-,--,+++++*)))))()('(%"$"""$%$"
- at 30BB2AAXX080903:3:1:1088:277#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCACNCCNCGCC
-+
-67777788888888888488888677776/454410-200.-,-..,',--++&)*)))''((('&#%"$$"$""#
- at 30BB2AAXX080903:3:2:1470:1751#0
-GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTNCGGCAAT
-+
-6773778888888188888284887*4065504/3221/.///,,,.,-+**+)+#'))()##(('''"%&"####
- at 30BB2AAXX080903:3:57:1159:1969#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTNCTCTGTC
-+
-67777788888888888888888877776555443222100-/..-,,+,+++)**)*)((()(('%&"#"$""#%
- at 30BB2AAXX080903:3:50:179:800#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGTATCCCG
-+
-67777788888888888888888877776/55443222100//..---,,+++***)))()((('('%""#"###"
- at 30BB2AAXX080903:3:38:1353:1150#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCACACCATCA
-+
-677777888888888888888888777765554432221/0//..--,,,+++***)))((((((''""%%&%###
- at 30BB2AAXX080903:3:40:313:823#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCNAAAGCTCC
-+
-67777788888888888888888877776555443222100//..---,,,,+*****))(((((&'"&#%%""#"
- at 30BB2AAXX080903:3:55:1600:757#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACACACACAATC
-+
-677777888888*8888888888877776555443222100//..---,,+++*&**))')((('%&'&%"###"#
- at 30BB2AAXX080903:3:1:1571:390#0
-TTAGGGTTGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGGGGTGAGGGTTAGGGTTANCCNGTCC
-+
-67777788888888888888888876776559443220100-.*.--,+(,++)'')))&'()((&%"""%"""##
- at 30BB2AAXX080903:3:41:1736:2020#0
-CTAACCCTAACCCTAGCCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCGGACGCTCTNC
-+
-6777778888888888888888887777655542211210/...-,,,,,,,*())()('('(%#&&&"$""#""#
- at 30BB2AAXX080903:3:38:1506:1060#0
-TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGACAGACACCA
-+
-677777888888888888888888777765554332221000'..---,,-*****)())(((((''"""#$"###
- at 30BB2AAXX080903:3:2:599:1510#0
-AACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTACNCACACAC
-+
-677777888888888888888888777763533432221//..--.,+,++++)))())'&((('%'&"&"%%$#$
- at 30BB2AAXX080903:3:54:1472:1803#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCACACCCAC
-+
-67727788488888888888888877176552363200/101..-,-,,,+*+*))()))(((((''$$%&"""""
- at 30BB2AAXX080903:3:60:1288:1358#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGATCNCACGTANN
-+
-67777788888888888888888877776555243220000/..-.--,,**+***')))))(((('""%$""#""
- at 30BB2AAXX080903:3:40:702:1131#0
-CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCCTACCGCAC
-+
-67777788888888888888888877776555443221100//..---,,+++***)*))((()(('$&##"$$$$
- at 30BB2AAXX080903:3:36:358:2013#0
-TTAGGGTTAGGGTTGGGTTAGGGTTAGGGTGAGGGTGAGGGTGCGGGTGAGGGTGAGGGTGTGGGGGCGCCACANN
-+
-67.77788888888888.1888817677645'443*2/100./(---&,(,,(%*(*)*&)%(((##&$"""#"""
- at 30BB2AAXX080903:3:39:1436:304#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCAAACAGATCGCACGCGCGCAA
-+
-677777888888888888888888777765554432211/0./.,----,+++%*#)()('(#&(&#$%$"""$##
- at 30BB2AAXX080903:3:60:1189:129#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCAGATCGGACGCACANN
-+
-677777888888888888888888777765554132121/0//...-,,,+,++')*))()(('(('&$"$###""
- at 30BB2AAXX080903:3:8:1516:1398#0
-TGGGTTAGGGTTAGGGTTGGGTTAGGGTTAGGGTTAGGGTTAGGGTGGGGGTTGGGGTTGGGGTTGGNCTCACANN
-+
-6777778888888888+8888888777065554&2,2210.+...,"#-,*+#'*+)'&')(''#&'"&"$$%#""
- at 30BB2AAXX080903:3:57:1246:836#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGATCGGAAGAGCGTGCACTAC
-+
-67777788888888888888888877776555443222100//...--+-++++*+)*)))((((('&""#$##"#
- at 30BB2AAXX080903:3:40:888:550#0
-ACCCTAACCCTAATCCTAACCCTAACCCTAACCGTAACCCTAACCCTAACCTAACCCGAACCCTAAGCTTAACCCA
-+
-6277578888888%8+888(0%887.*743513/122/00/-/-'--,,,)+++*#)(*(('%(('#'"$"#"%#"
- at 30BB2AAXX080903:3:50:1324:1835#0
-GTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGGGTTAGGGTTAGGGACCGATNGT
-+
-6777778888888888888888887777555544322210///.--,-,,+++**))))))')((('"$"""""""
- at 30BB2AAXX080903:3:35:543:275#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTAGGGTNATCACGNN
-+
-67777788888888888888888877776555543212100//.----,-+++**)#)))%&(('('"#$$"#"""
- at 30BB2AAXX080903:3:49:1703:379#0
-CACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTAACCCTCTCTCACAC
-+
-677777888888888888888888777765554432220000/.-----,++++**)))*)))(''&$"#"$"#"#
- at 30BB2AAXX080903:3:39:606:1085#0
-CTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCTAACCCTAAGATCGGAACATCCGCAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))()('''$&%$"""##
- at 30BB2AAXX080903:3:36:1320:637#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGTTAAGGTTAGGGTTAGGGTTAGGGTTACTCGTGTGN
-+
-67777788888888888/88888877776555443222100//-.-,-,,++****))())(((((#%$""""#""
- at 30BB2AAXX080903:3:48:578:1107#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGATCGGAAGAGCGGTTGAGCACGGTC
-+
-67777788888888888888888877776555443222100//-.--+,,+++)**)*)))'(('(%"$###""""
- at 30BB2AAXX080903:3:38:1259:1343#0
-TTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAAGATCGGAAGAGCGGTCTATCNTAT
-+
-67177788888888888888888877776545243202100//..---,,,+++**)*))))((''&$"""$"#$%
- at 30BB2AAXX080903:3:40:1690:1470#0
-ACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCCTAACCCTAACCCTAACCCCAACC
-+
-677777888888888888888888777765555432221/.//.,----,+++**)))(((((#(&%%$%$$%#$#
- at 30BB2AAXX080903:3:56:1127:42#0
-CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTTAACCCTAACCCTAACCCTTAACCCTTAGATCGCAGC
-+
-67777788888888888888888877776555443222100//-/--,,,,*+****())(')(%&('&&&&#""#
- at 30BB2AAXX080903:3:2:59:1248#0
-TAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTGGGGTTGGGGTTGGGGTTGGGGTTGGGGGGGGGGGCNCTGNNCA
-+
-67777788888888888886888-76776.5$-4302.200..+,--*$+*++)#&())(%&((('&$"$#"""##
- at 30BB2AAXX080903:3:52:1068:1516#0
-TTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTGAGGCTG
-+
-67777788888888888888888877776555443222100//.----,,+++***)))))((((''&#"#%##""
- at 30BB2AAXX080903:3:41:1099:881#0
-ACGCAGCTCCGCCCTCGCGGTGCTCTCCGGGGCTGTGCTGAGGAGAACGCAACTCCGCCGTCGCTATGTGCTCCCT
-+
-14777788888888838888*8887'936)5('4..//0//$/,'.-#++)++*')&'&(#'''#%%&"""$##$"
- at 30BB2AAXX080903:3:4:1243:1902#0
-TGCGCCTGCGCCACGCCTCCACCCCTGGACGCGCTAGCATGTGTCTCTGCGCCTGAGATCGGAAGAGCNTACANCN
-+
-67717788888888888-8888137/10+24.(0*.../&,%-**,,&*(*)+)))''&('(&''%'""#$"#"#"
- at 30BB2AAXX080903:3:48:152:905#0
-GACTGGCAAAAATCCAAAAGTAAACACTTTGTGGAGAAACAGGCACTCCTAGACATTGCTGGTGGGATAATCAACA
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((('''&"#"##$##
- at 30BB2AAXX080903:3:53:533:539#0
-TCACAGCCAAGGAGATGAGCACAAGCACTACTTACTGGCCTAGGTTGTGAGAGAAGTTGATGAGATCGGCGGCGTC
-+
-67777788888888888888888877776555443222100//.+---,-++++****)))((((('"%"%#$#""
- at 30BB2AAXX080903:3:52:1058:1679#0
-GGGCCGGCATCTCCTGTCTCCTGGAGAGGCTTCGAGGCCCCTCCACACCCTCTTGATCTTCCCTGTTGCAGNACCA
-+
-6777778888888888888888887777635524.22-,10/..--,,+,,+*+)))')*#'((('&&$"""%#$$
- at 30BB2AAXX080903:3:40:828:533#0
-TCCCTGCAGACCAGGCCCATGACAAACACCGTCTCCAGCGGGCAGAGCAAAGGAAGGGCACAGCGCCAGGGCGCGC
-+
-67777788888888888888888877776553443222100/.-.--,-,+,+*****))(()((''"&"####"#
- at 30BB2AAXX080903:3:41:892:1427#0
-CACTCTGGACTCCACACTCTCCTGGGTTTCACCTTTGTAGCAGGATCCCTGCAGACCAGGCCCATGACACACCCAC
-+
-677747888888888888,888287777655.823222100-/.,%,$,,+,+*+*)))*((((((''%"%$"$$"
- at 30BB2AAXX080903:3:45:948:170#0
-AGGGCAGTAGCAGATGGGTCTGCTCCGTCTCGCTTCTAAGAAGGTGGGCAGGACAAATGAGATCGGAAGGCGACGC
-+
-6777778888888888888888887773665544322110/./.%--,+-+++)*)*()()(''('&""""""#""
- at 30BB2AAXX080903:3:42:601:500#0
-AAGGGCAGTAGCAGATGGGTCTGCTCCGTCTCGCTTCTAAGAAGGTCGGCAGGACAAATGGCAGCCTCCCGCTCAC
-+
-67777788888888888888888877776555441212.00//..*,-,-+++*')*(#))'((#(&&&##""#""
- at 30BB2AAXX080903:3:48:340:1748#0
-AGGGAGATAGAAATCCAGGCAAGGCTGTGGGGCAGGTTAGGGAGCAAGGCTGCAAGATCGGAAGAGGGTCCCTCAG
-+
-67777788888888888888888877776555143212100/..++--,,,,*+****)))'(((''%####"#""
- at 30BB2AAXX080903:3:58:1014:1441#0
-CAGACACGGGGTCTCTAAAAATAGTCATGCTGAGAGCCTAATGGCCCTTGGCACAATTGCTGGTAGATCGTCACCG
-+
-677777888888888888888888777765554432021/0//.-,-,,,++++*))*)'))('(('$$%%$#$#"
- at 30BB2AAXX080903:3:39:737:853#0
-CCACACAGTGCTGGTTCCGTCACCCCCTCCCAAGGAAGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCCCCGTCTG
-+
-67777788888888888888888877776555443222.00//..---,,+,++****))))()'''&&$#%#$$%
- at 30BB2AAXX080903:3:54:154:35#0
-CAGCTGGCAAGAGCAGGGGGTGGGCAGAAAGCACCCGGTGGACTCAGGGCTGGAGGGGAGGAGGCGAGTATGCCTC
-+
-61777788888888&88888/8887*70.,55022111&00--*,&,(,+&*+&*)))#('#((&'#$""$&###"
- at 30BB2AAXX080903:3:57:33:538#0
-ACAGCAGCAGCAGCGCGTCTCCTTCAGGTGGGAGCAGCTCTTTGAGGCCACCTGATTTCTGGTGTGCACAGATNCA
-+
-67777788888888888888888877771555,431221/-00.'---,,++**(*)*))))()(('$%&$##"##
- at 30BB2AAXX080903:3:45:710:1725#0
-CGGCAATGTACATGAGGTCGTTGGCAATGCCGGACAGGTCAGGCAGGTAGGATGGAACATCAATCTCAGGGGGATC
-+
-6777778888888888888888887777655543322211///.---+-,+)+**)*())()))'('%&$"""""#
- at 30BB2AAXX080903:3:41:967:408#0
-TACATGAGGTCGTTGGCAATGCCGGGCAGGTCAGGCAGGTAGGATGGAACATCAATCTCAGGCACCTGGCCCAGTT
-+
-677777888888888888888888777765554432221/0//.---,,-++****)))))))((('%&$#$"%""
- at 30BB2AAXX080903:3:56:134:794#0
-CTCCAGTCAAGGCTGTTGGGCCCCTTATTCCACCCATGGGAGGTGCACACAAGGTCTAGAGCGGGAGNGNCTTCCA
-+
-6777775888888888888888887667235(0430/010,//+--+,++))++#)%&''#'((##'"%"$""###
- at 30BB2AAXX080903:3:42:876:490#0
-AAAGCTCAAGGTACAGGTGGGCAGCAGGGCAGAGACTGGGCAGCCTCAGAGGCACGGGGAAATGGAGGGCGGGCCC
-+
-67777788888888888888888877776555443222100//..---,,,++***)*)((()((''$%#"""##"
- at 30BB2AAXX080903:3:41:363:1455#0
-AGGGCAGAGACTGGGCAGCCTCAGAGGCACGGGGAAATGGAGGGACTGCCCAGTAGATCGGAAGAGCNGCGCACAA
-+
-6777278888888888888888887777655544+212101//.-'--,*+++))*)))))((('(#"'$#$##""
- at 30BB2AAXX080903:3:59:656:332#0
-TGCCCCATCAGTAGCCATGTGTGCATGTGTAAATACCATCCTCTGTGTGCCCTGGAGGCTGTCCTTCAGATAACNA
-+
-67777788888888888888888877776555443222100//...-,,,,,+**)*)*))&'(&('%&$$#"#"#
- at 30BB2AAXX080903:3:35:1540:622#0
-GGGTTGTGAAGTGCTTGCCCCATCAGTAGCCATGTGTGCATGTGTAAATACCATCCTCTGTGTAGATNCTACNACN
-+
-67777788888888888888888877776555443222100//..---,,,++****))))((('('"%%$$"$$"
- at 30BB2AAXX080903:3:45:1395:34#0
-CCTGCTGTTCCCCAGATGTGCCAAGTGCATTCTTGTGTGCTTGCGTCTCATGGAACGCCATTTCCCCGATCTCCCA
-+
-6777778888888888882888887777+55544322210///...--,,++*+**)))*('(((''"""##"##"
- at 30BB2AAXX080903:3:40:861:1811#0
-CCCTTGCCCACAGGGCCACAATCCACGTGCAGAGCAGCCCAAGCACTCACCGGGCACGAGGTATACGCGCACTNCC
-+
-672777+884,88888(8&8+8853677652514%+2-.%&*--,(,,,+*))*))&)(#&&&('''""%"#"""#
- at 30BB2AAXX080903:3:36:1322:1307#0
-GTGCTCTTCTTTTTTCTTTCTGAATTGTGGCCACCTTCATACCAGTCTGTCATGGAACACTTAAGCCTCACGCACN
-+
-67777788888888888888888877776555443222100//..---,,++*++)*))())((('%$&##"#"#"
- at 30BB2AAXX080903:3:55:343:357#0
-AGGTGCATAAGCTCTGCATTCGAGGTCCACAGGGGCAGTGGGAGGGAACTGAGACTGGGGAGGGACAGTGTATANG
-+
-67777788888888888888888877776555443222&00//..-,--,,+++**))))'((('''%$$%""#""
- at 30BB2AAXX080903:3:36:209:1470#0
-CGAAATGTACAGCATTTCTCTTTGTAACAGGATTATTAGCCTGCTGTGCCCGGGGAAAACATGCAGCACTCGACGN
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$%$$#"#""
- at 30BB2AAXX080903:3:4:536:1872#0
-AGACACAGTTCAGGTGAAGAAAGACCTGGAAACTTCTTTTAACTATAAGCTCAGTAGGGGCTAAAAGCNACTCNAN
-+
-67777788888888/8828884887877:-43442021100.0.---+,,,+++)))()(#((&('&"""%&$"""
- at 30BB2AAXX080903:3:3:1599:1484#0
-CCGGCCTCTGGCCTCACTGGCGTCTGTGCCCAGTGACGCAGGCAGGGGAGCTCCCGGCAAAATAACACNCCCANAN
-+
-67777788888888888/8888/8277165534-23+/,-///+,-$,'++$(*'('&&''#%&#%&""$#$""""
- at 30BB2AAXX080903:3:39:332:978#0
-GAAAAGCCCACTAGCTTGTCCAGTGCCACAGGAGGGGCAAGTGGAGGAGGAGAGGTGGCGGGGCTCCCCCCTCATC
-+
-67777788888888888888888877776555443221100//..--,,,+,++*))*&))#(%'&'$%##"%""#
- at 30BB2AAXX080903:3:57:192:729#0
-GAAGGGAAGGGAGAGCCAGTGACGACTGGCAGTGGAGTGGGGAGCACCGCCCCCTCTCCTCCTCCACCTGCCACTC
-+
-6777778888888888888888887777655534332-100//.-.--,,,%++'*(*)&)('((&'$%&#%##"#
- at 30BB2AAXX080903:3:38:979:972#0
-GGAACGAGGATGAAGGGAAGGGAGAGCCAGTGACGACTGGCAGTGGAGTGGGGAGCACCGCCACCTCACCTCCTTC
-+
-67777788888888888888888877776555443222100//&/-+-%,+++&*()(()#((''#'$$&&&%##$
- at 30BB2AAXX080903:3:45:9:1807#0
-GCTTGCAAGTCCCCTGTCTGCAGCCTCACCCCTGTCGCATCCTGACTACAATAACAGCTTCTGGGTGTNCACGCAA
-+
-6777778888888888888888887777655544322210///..---,,++**+**)))()(('''$"&"$""""
- at 30BB2AAXX080903:3:58:592:1403#0
-TCTCGGGGCATGAGAGGCTGACTTTCCGTGAGCCTGTGGGCCAGGCCTCTTTGAATGGGGCTGAGGGAGCTCCTAC
-+
-67777788888888888888888877776555443222100//..---,,,+++**)))))((((''&&$&###"#
- at 30BB2AAXX080903:3:45:1313:1067#0
-CCAGGGCAACCTGCATATCCACCTCCCTACCCTGCCCCCCTCTTCCAGGAGTCTGCCCTATGTGGAGCAGTGCGGG
-+
-67777788888888888888888877776555443222100//...,,,++,++**)))(()(('&'$""""##""
- at 30BB2AAXX080903:3:51:498:1610#0
-AAGTGCTGGACATGGGGTGGCCACAATCTGGAGCTGATGGCTCTTAAAGACCTGCATCCTCTTCCCTCGGTGTGAC
-+
-67777788888888888888138877776552443222100//+.---,,+)%+**)'))((((''&%"#$""""#
- at 30BB2AAXX080903:3:33:954:1706#0
-CACATACTTCCCACTGGGGTCTACCATGTGAGGCATGGTGTGGGATCCTGGGAAGGAGACCAAGCCTNCTCTCTNN
-+
-67777788888888888888888877776555443222100//..---,,++++***)))()(((&'"%&#"""""
- at 30BB2AAXX080903:3:53:1561:274#0
-ACATACTTCCCACTGGGGTCTACCATGTGAGGCATGGTGTGGGATCCTGGGAAGGAGACCAAGCCTCACACCCGCT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((('&$$%&$"$"#
- at 30BB2AAXX080903:3:2:39:582#0
-ATGGGTTCCCCAGGACCGGGATTCCCCAAGGGGGCTGCTCCGAGAGGGTGGGGTGATGGGGTTGCACANACANNCA
-+
-67777788888888888888888/77%56552442.2010.%..--,-$,$+%)*&))))#&(('%'"""#$""#"
- at 30BB2AAXX080903:3:38:1749:1701#0
-TGGGATTGCCCAGGACAGGGATGGCCCTCTCATCAGGTGGGGGGGAGTGGCAGCACCCACCTGCTGTATGGTGANN
-+
-6777778888888888888888887017675641122$100//(.,-*,,(*+&%&'('&'#(&''#""%&###""
- at 30BB2AAXX080903:3:45:134:925#0
-CAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGTGGTCGTGGGGGGCTCTGACGCTCCGGCTCCGATCGGGAGC
-+
-677777888888888888888888777765554431221/0-/..'--&++,+)&*('&(()''&''""$$"""#"
- at 30BB2AAXX080903:3:58:485:1940#0
-GCTGTGTTGTCTCAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGTGGTCGTGGGGGGCTCTGGCGCTCGCCTN
-+
-67777788888888888888888877776555443222110-/-.--,,,**+)*+)&))'(''(##&%$%"###"
- at 30BB2AAXX080903:3:47:1141:1513#0
-AGAGCCACCCACGACCACCGGCACCCACCCACCACAGGGCAGCGTGGTGTTGAGACAACACAGCCCTCCTCCCTAC
-+
-6777778888888888888888887777655544+222100/...--,,,+++****)*))))('''$""##""##
- at 30BB2AAXX080903:3:51:1206:1287#0
-TATGTGCATAGTTGGGATGAGGGCTGTGTTGTCTCAACACCACGCTGCCCTGTGGTGGGGGCGTGCCGGGTGGTGT
-+
-67777788888888888888888877776555443222100/0..---,-+++***)*)))'('(&%$#"""""#"
- at 30BB2AAXX080903:3:43:880:1474#0
-TACAGTGGGGCCCTTGGTTGCAACACAAGTAGGTAGGGATGGATGAGTGTGGCATAGATCGGAAGAGCGCTGAGCA
-+
-67777388888888888488888877776-554/2222000///.--+,++++*+*)*)())(((''%&%#$""#"
- at 30BB2AAXX080903:3:34:678:962#0
-TACCAACTGTAAGTCACCCTATCTTCATACTTTGTCTTTATGTAAACCTAAATTAGATCTGTAGATCNCACAGCNN
-+
-67777788888888888888888877776555443222100//./---,,,+++**)*))))(((('"%#%$"#""
- at 30BB2AAXX080903:3:46:1623:647#0
-GCACAAAGGGGTTGATTAGCAATTATCTTTTGAAAAGCCTGTAGTTGCTCATCTGAAAGATCGGAAGAGTGGCACA
-+
-67777788888888888888888877776555443221100./.---,,,++++**)))))(((('&$$#""#"#"
- at 30BB2AAXX080903:3:59:308:1040#0
-AACAAAATCCCCTGACTTCTCAACTAGTTAATGTCTGCCCACAAAAGAAGAGGGGGTCCGTCGCCATTTCATCNNA
-+
-67777788888888$88888888877776)$54-321'000.*,--,,+,+,+)**($))#'#%###&"#&%%""%
- at 30BB2AAXX080903:3:60:570:1889#0
-GGAGAGACCCTGGAGCGGGGTGTGGGAGAACGGTCTGGAGGAAGGGCTCCGAGCACTTCAGATCGGAAGATNCANN
-+
-6777178888888888888818887747/565422232/00.+---,,++,*+)*)'))()(''((&%##%"##""
- at 30BB2AAXX080903:3:51:760:1891#0
-CGAGCTCCCGACGTGCACACGGCTCCCATGCGTTGTCTTCCGAGCGTCAGGCCGCCCCTACCCGTGCGTCTGTCTC
-+
-677777888888888888888888777765554432121////.--,+,,,*+**)(*)(((((''#"##""""#$
- at 30BB2AAXX080903:3:47:151:1547#0
-AGGAATGTCCCATGCACAAGGTGCACCGATGCCTGGGTAAAGCAGCCTGTCACCGACGGATGCACGACTGGTCGAG
-+
-(-/),7.'+0.+8/$*+&$.,#0$-#1&$',''$'.'%(-)')*%'&+)$**#$&%#)###%'#'&%%"#""##""
- at 30BB2AAXX080903:3:4:535:2007#0
-TAAGCTGTCTGGTCTGTCTGGTGAAGCTTCAAATGCTGTTCATTTCCGATAAGGGAGATCGGAAGAGCNTCACNCN
-+
-677777888888888888888485777065504132220/0-/.-.,,+-+(++**)()()((&('&$"$#"$"#"
- at 30BB2AAXX080903:3:59:969:575#0
-TGTGATGTTCTCTCCCCCATGTCCAAGCGTTCTCATTGTTCAGTTCCCACCTGTGAGTGAGAACATGCAGTGCTCA
-+
-67777788888888888888888877776555443222100//..----,+,+***)))))(()((&'&&&"$"#$
- at 30BB2AAXX080903:3:52:1065:1496#0
-CTTTCTCATGCCAAGATGAGGCTCCCCCAGATTTGCTCAGACTTACCTATAGTCAGCAGCATCGGGGGTGGGCATC
-+
-67777788888888888888888877776555443222100//..,,-,,-++*+*)))(()(((''&"""$#"""
- at 30BB2AAXX080903:3:49:178:481#0
-AGGTGCTGCCCCGAGAAGGATGCATTTATGGCTTCGTGAAGTCTTTCCTGACCCCCGATGCTGCTGAACATGCCTC
-+
-677177888888888888888888777765503432221001/.,---,-,+*****)*)((()(('"$""##"""
- at 30BB2AAXX080903:3:1:248:536#0
-CCTGGCTAGCAGGACTCAGCCCCTCCCCTTCAACTTTACTCAGGACCTGGTCTCCCCTCCTTAAGGTCNCANACAC
-+
-6777778888888888/88854857817656+130101/0..//-+*,-,+*+())()(('((&'''&"$#"####
- at 30BB2AAXX080903:3:49:511:813#0
-CAGGCTCTGGGCTGTGTTACTGGACTAACACTAACACCGTCCCCTTGCACTTCTGAGGGGTCCCTGGAACTCCCCC
-+
-67777788888888888888888877776555443222100/....--,,++++**)**)))(((('$"%$"$#$%
- at 30BB2AAXX080903:3:37:129:1079#0
-CTAAACCCGATTTAGATGAGATTCGGGACTGTGAGCATGAAGGGATCTCAAGAGGGGTGAATGTGTTCTGCACTCN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()'('"$&&&#"#"
- at 30BB2AAXX080903:3:2:436:275#0
-CTCTGCCATTCACACCCTTGAATAATCCCCTTCTCTGGTTGTAAGCAGAACCTGTGGCTTGCAGATCCNTGTCCTC
-+
-67777788888888888888888877776555443222100//...---,,++***))))('((('#$"#$%#$"#
- at 30BB2AAXX080903:3:40:439:201#0
-GCTGGCTGACACACTGATGGCACCTTACAGAGGACCAGTTAGGCTGTGCCAACACCTGACCTGAGATCGTGAGGTC
-+
-677777888838.8888488888877776525543021.0,//-+-,--,+,+&)*)(&'(()((''&&#"$$""#
- at 30BB2AAXX080903:3:45:826:118#0
-GTCAGGGCAGTGTGCTAGGAAGTGAAGGCAGGGAGATGCAGGAGGTGTGGATTGGTGGGGCGTCACAGGGTGGACG
-+
-67777788888888888888888877776555443232110//..&-#,,*++*&*()))()&('&''"$""###"
- at 30BB2AAXX080903:3:37:876:1114#0
-GACGCCCCAACAATCCACACCTCCTGCATCTCCCTGCCTTCACTTCCTAGCACACTGCCCTGACTCCAGAGACCAN
-+
-67777788888888888888888877776555443222001//-/.-,,,+***+)*)))())((%($#%""##""
- at 30BB2AAXX080903:3:33:351:917#0
-CAGCGTGGCTGCGGCAGAGGGAGTCAGGGCAGTGTGCTAGGAAGTGAAGGCAGGGAGATGCAGGAGGNATCTCTNN
-+
-67777788888888888888888878776555443222000./.+--,,,+++***))()'(((''&"""$###""
- at 30BB2AAXX080903:3:42:311:1944#0
-AGGGTGTGCAGTAGTGACACTGGGAAACTGATCATTTTGATTTCTGCTTTCTAGTAGAATCAGCTCCCAGAGACCA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*))(((((('"&%%%""""
- at 30BB2AAXX080903:3:42:743:504#0
-ATTCAACCCAGCAATTCCATTACTGGGTATATACCCAGAAGAATATAAATCGTTCTACCATAAAGACGTCAACACA
-+
-67777788888888888888888877716555443222100//..---,,+++++***))))((((''"%&%&%$$
- at 30BB2AAXX080903:3:60:747:2024#0
-TATTGAATTCATGCTCAGAGCAGTGAGAAAAGAGTGTATTCAAATAAGTTGAAAGAGAAAACATTTAGTGCNCANN
-+
-67777788888888888888888877776555442222100//..---,,++++**)**))(((((''&%#"#"""
- at 30BB2AAXX080903:3:54:582:1338#0
-GAGGGCAGGAGAGCGAGACCATCCTGGCTAACACGGGGAAACACCGTCCACACTATTAATATAAAATCTACACGTC
-+
-67777788888888888888888877776555443222.00./+,--)'-+,+)*%(*)()%(''(%%"#$%##$"
- at 30BB2AAXX080903:3:52:1090:647#0
-CAAAATGTGTGTTTCCTTTGTTGGAGGCATCCTGGATAGTCAGGATAATCCATGCTGTATCTCAGTTTGGTCTCTT
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*)))((((('&""&#%"#"
- at 30BB2AAXX080903:3:8:791:557#0
-ATGAACGTCTCCATGGAAAGACTGGGAAAATGGATTGCAGGTTCTAGCAGGATGTCATAATAAATGGNTCAACANN
-+
-6777778888888888888888887777655544322/100/0,/--,,,,++**)))*)))(((('"$$$%%$""
- at 30BB2AAXX080903:3:37:756:1698#0
-CATCCAGGAAAGTAGGAGGTTAGATCTGTGGATCAGGAACTCAAGAAATAGTACCAGGGTAGATCGGAAGAGTCCN
-+
-67777788888888888888888877776555443222100/0...--,-+++***))))*()((''""$"""##"
- at 30BB2AAXX080903:3:35:573:1176#0
-AGGGAGTTGGCCAGCCAGATACAGAACATGTTGTGATTTGAAGGCTGTTTCCTGAAGATCGGAAGAGNGCACTCAN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)**))('(''&""%#""#$"
- at 30BB2AAXX080903:3:59:1019:1847#0
-CATTTCAATACGCTGTTCGGCCTGCTACCCCAGTTTCCCACTTAGAACAATGGCACACAGGACAGGAGCACACACT
-+
-67777788888888888888888877776552443220200//..--,--+++*****))))((((''&%$#$%$#
- at 30BB2AAXX080903:3:36:319:123#0
-AGTAGTTGGGACTACAGGCATGCACCACCATGCCCAGCTAATTTTTGTTATTTTTAGTAAGATCGGANCACTATAN
-+
-6777778888888888888888887777655544322200///..---,-+,+***)*)))((('('""######"
- at 30BB2AAXX080903:3:35:65:319#0
-AAGGCATCTCTGAAAGCTGTTTCCTACATGTGCCTATAATGATCTACCCCAAACCAACACGTGAATCNCGTCTCNN
-+
-67777788888888888888888877776555443222100//..---,,,+++**))))))(((('""$"###""
- at 30BB2AAXX080903:3:51:356:1137#0
-CCTTGTTATAAGTATTATGCTGGCAACAATTGTCGAGTCCTCCTCCTCACTCTTCTGGGCTAATTTGTTGCACTGC
-+
-6777778888888888888888887777655534322-000//...,,+,++)**))*))(''((('$""##$"##
- at 30BB2AAXX080903:3:49:563:1296#0
-AGGCCTCCTAGCACACAAGCTCATATCTTAACTACTTTAATACGTTGCGCGATGGGAGCTTACAGGTCGTCCTTCA
-+
-6777178888888888888888887777655044-222100//..,-,+,+++***#(*#)(#'(('%$######"
- at 30BB2AAXX080903:3:34:1596:1443#0
-TAATACGTTGCTCGATGGGATCTTACAGGTCTTCATTCACCCCTTTCCTGCTCACACAACCACAACCNCCCCCANN
-+
-67777788888888888888888872776+554)322.10,/.&.-(-,,++*****)*'()'(((%"$%#&$%""
- at 30BB2AAXX080903:3:58:679:475#0
-TATTTGGTTTTCTGTTTCAGTGTTAATTCACTTAGGATAATGGCCTCCAACTGCATTCATGCTGATGCATATGCTA
-+
-67777788888888888888888877776555443222100//...--,,+++****))))((&((&'&##$##"#
- at 30BB2AAXX080903:3:49:1559:181#0
-ACCCCCTGATCCCCAACAAGCAGAGCCCTAACCTCACACCAGCAGTACAGCTGCCCCATCCCCCAGGCTGCAACAT
-+
-67777788888888888888888877776555443222100//..---,-,++****))))()('(&%""#""###
- at 30BB2AAXX080903:3:60:373:1638#0
-CATAGATAATAGATGTTTTCAGATTCTGGTACATTTTGGCTGCATTTGTTTGTTTCATGAGATCGGAACGCNAGNN
-+
-67777788888888888888888877776555443222100/.,.---,,++***))*)))(('('#'$$$"#"""
- at 30BB2AAXX080903:3:44:595:1727#0
-TTTGCTGGCCAACACGAGCACTCTGGGTGCTGAGGGCGAGAGGTGGGAGGTCAGAGGAGATAGATCGGACGCGCGC
-+
-67777788888888888888888877776555443212000///.--,,,+*+***)))()(()(''&"#%"&#$"
- at 30BB2AAXX080903:3:40:52:2000#0
-CTCGCCCTCTGCACCCAGAGTGCTCGTGACGGCCAGCAGAGCCAGCCCCCATCTCCTCTGACCTCCCATGCATGCC
-+
-67777788888888888888888877776355-/32/2010*+--',+*++)#*()(&)((%&'%&'$""#"""##
- at 30BB2AAXX080903:3:41:969:902#0
-CCTTGGGACCCACATTGCTACTCCTCTGCCTGTAGGGGGACCCACAGGTATCCACACAGCTCACTCCTGTCGTACA
-+
-677777888888888888888888777705'521322$001/),---#-+,,+***))*#%''('#'&%#$$%"$#
- at 30BB2AAXX080903:3:42:960:893#0
-GCAGGGACTGTGCTGGTCTTACCTGAGCAGACCTGCATGTCTGCGGTCAACTGGGATGGCAGAGACAGAGTGTGTG
-+
-6777778888888888888888887777655544322212&//...,-,,,+++*&)))((('(((''"&#&$#""
- at 30BB2AAXX080903:3:4:1499:1032#0
-GTAGCTTTTTTGTCTTTGTGTAATAGCTATCTTATTTAGGAACCAGATGGGAAGCAGAGATCGGAAGCNGTCTNCN
-+
-67777788888888888888888877776555443222100//.--.-,,+++***)*))(((((('$""##""#"
- at 30BB2AAXX080903:3:35:220:1888#0
-CATGTTGCTGTTGTTGTTATTGATATTGTTGTTTCTGATGGATAGAGATCTAGGCCTGACACTCCAANCCCTCTGN
-+
-6777778888888888882888881777655'44522010///..'--,,+,+*)*)))()'(((''""#$"##""
- at 30BB2AAXX080903:3:44:1434:1305#0
-AGACGTGCTCATGGTCTGCTTTGCTGCTCAGCATGGCTGGGAGGCACAGTTGAAGATCATGCATCCTGCGGGACGG
-+
-67777788888888888888888877776555443212100-/.,-$),%,+**+**'*')#(&((%&&"&""###
- at 30BB2AAXX080903:3:39:101:423#0
-TAGTCAGGATGGGCTGGATTATGCTGTGTTAACAGCCATTCTCTAAATCTCTGTGGCTCAACAGGGATCTCTGCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$""#$$##
- at 30BB2AAXX080903:3:57:854:311#0
-CATCATTTTTCTCCTCGCTGGAAGTCTGAGGGGCAGTTCACTTATCTCCTCCCCTCCCCTACTCCTCACNCCACAC
-+
-6777778888888888+8888888777765554432021000/..---,,+++***)*)))(((((&'$"%%%##"
- at 30BB2AAXX080903:3:36:388:946#0
-TTTGAGACGGAATCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGTGCGATCTCGGCTCCCTGCAACTCGCCACTN
-+
-67777788888888888888888877774555443222100/...--,,,++****))))('((&(($%"##"##"
- at 30BB2AAXX080903:3:46:556:592#0
-ACCCATGTTGCTGAAGTCATTTCTCCAATTCATGATCCATGAAACTACTTCAGCAGTGAAAATGGCAGTCCTCAGG
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$"%#"#"$$
- at 30BB2AAXX080903:3:48:1590:122#0
-TTTGATAGTGACTAGCTCTGTCACCTAGGCTAGAGTGCAGCGGTGCAAACACGACTCACTGCAGCCCTGCCGACCT
-+
-677777888888888888'88886717763.544.'3020.//...,,,,,)))%)('#()(((''#"""$"#"##
- at 30BB2AAXX080903:3:43:386:578#0
-ACTGGTGTGAGATGGTATCTCATTATGGTTTTGATTTGCATTTCTCTAATGATCAGTGATGTTGAACTTTTTTTTT
-+
-677777888888888888888888777765554132221/0///.----,+,+****))))((((''&&%&%%%$$
- at 30BB2AAXX080903:3:46:1757:533#0
-AAGGGAGGCAGTTAGGGAAGCCTTCCCTGAGTTAGTGCCACTTAACCTGAATTATGATAGATGAGATCGACAGGGT
-+
-6777778888888888888888$827786/50443+2'11,//*..-,,,,+*+**)*))))((''%%""#"""""
- at 30BB2AAXX080903:3:46:363:547#0
-GTTCAGCCCTTACTGCATATTCCAGGCACTATTCTGACTGTGGCAGGAGGGAACAAACAGGCAAGGTATCTTCTCC
-+
-67777788888888888888888877776555443222100//..--&,&+&+*+*)()()#'#(''$"#""###$
- at 30BB2AAXX080903:3:33:1000:529#0
-GAAGTGAAATGACATCAAGAGACCTATCAAGACCTGTATCCAGGAAAAGGTAAATCTGAGCTGAAATNGCCCACNN
-+
-67777788888888888888888877776555443222100//.----,,(++***)*))#')((('""#%$$#""
- at 30BB2AAXX080903:3:55:1518:1008#0
-CAAGACTGCAGCATTTCAGATAAGCCACCCTCACAAGAACACTTGCCTAGCAATGGCTGTTTCTGCCACGACGTCA
-+
-67777788888888888888888877776555443222100//..---,,+++****))()(()('''&"$%%$$$
- at 30BB2AAXX080903:3:40:8:1726#0
-CAATGAGAAAAGGAATGCTGATGTTCTCTAGAAGATAGAAAAGGCCAGGATATGGATTCTACCANANATATGCGTT
-+
-6777778.88888888888888887777655544312200///.,,,--*+++***()()'''(#(#""""##"""
- at 30BB2AAXX080903:3:52:1007:530#0
-TGAGGATATTTTACTGCAGTTCGAGTTGTAATAATAGCTCTGTTTAAGATCCGTCAGTCACTTGAATCACGTCTAG
-+
-67777788888888888888888877776555443222100//..---,,++++*+))))))(((&'%%$"##%$%
- at 30BB2AAXX080903:3:50:174:1040#0
-ATGCTGTACGAAGTACATGTTGACATGTGAGCATATAATAAATGGGCTGGAGGCCAGAGGATAGATCGCGACAGCC
-+
-67777788888888888888888877776555443222100//..--,,,+++*++)))))(((((%$$"#%#"""
- at 30BB2AAXX080903:3:56:176:432#0
-CTAGCAGGGCGTGGTGGCTCATGCCTGTAATCTCAGCACTGTGGGAGGCCGAGGTGGGTCGACTACCAGAGTCACC
-+
-67777788888888.8888888887773655544/222110./..,----+*++#*)*&()()('''"&#""#"#"
- at 30BB2AAXX080903:3:38:1047:1029#0
-GTCGACCCACCTCGGCCTCCCACAGTGCTGAGATTACAGGCATGAGCCACCACGCCCTGCTAGGAGTCTCTTCATA
-+
-6777778888888888888888882776655543322210//..--,,,,,,**#))&))((((('&$%"""#$$$
- at 30BB2AAXX080903:3:43:1699:645#0
-TAGCCAGGTGTGGTGGCACACGCCTGTAGTGGTGGGGCATGCCTATAGTCCCAGCTACTCAAGAGGCTGGGGGTCT
-+
-67777788888888888888888877776655443'2%,&0//,,,-,',,,'**(()(('((('('"%#%"$"""
- at 30BB2AAXX080903:3:59:185:201#0
-TCCCTGCAGCCACACGAGGCCCAGCAACCTGCCAGTCACTCAGTGGCCTCCAACCAGACAAAACACCGTGCACNNA
-+
-6777778288888888888888.8781765554422221*/%/&.--,,,+&*)*%((#(''('(%&%$%$$#""#
- at 30BB2AAXX080903:3:48:1203:1580#0
-GCAGCCCAAACACTCCAGAGCTCGGATACCAAGGAGCAGCTTCTGTGGGGCAGAACGGCTGCACACAGGCNATNTC
-+
-67777788888888888888888877776555443222100//..---,,+,+**))*(*)(('(''""$"""""#
- at 30BB2AAXX080903:3:36:432:1108#0
-GGGCAGCCCTGCTGCCGCCCACGTGAGCTGCTCATTCCCAGCACATGGCCAGCGAGGTCATAGCGATGTCCTCACN
-+
-67777788888888888888888877776555443222100//..---,+,,+***)())(()(''#"&%#"###"
- at 30BB2AAXX080903:3:43:1392:1284#0
-CTGTCCTCCTCCTACACATACTTGGATGCTTCCTCCTCAACCTTGGCACCCACCTCCTTCTTACTGGGCCCAGGAC
-+
-67777788888888888888888877776555443322100//-.,--,-+++**+**)))((((('&&$&%$#""
- at 30BB2AAXX080903:3:55:952:1813#0
-GGAGGAGCCTCAGCCTCGCAGGCTGCTCCGTGGGACTGATGACTGCATGATCTTCTGGGCACCTCACCGGTCGCAC
-+
-67777788888888888888888877776505443222110/.-..,-,,+*++**))*)('((((%"$$&&%#$"
- at 30BB2AAXX080903:3:2:1543:1260#0
-GCAGGGCAGCCAGGGTTGTGCCAGAGCCTGAGCAGGTGGAGGGGGGGTGAGGCGGGGCTGGGGGGCATNCGACTCG
-+
-2-+7573888,1818&)/&.*)*)&'+&*)(,$&.*%#+#,*#(,**#$$%'%$&(&&##&###%%#""$#"%"#"
- at 30BB2AAXX080903:3:58:1209:655#0
-GTCTCGAAGGCCTGCACGGGCCCAGCCTCGGCCTCGGCCTCACAGCGGACTCTCCACGCCCAGCTAGCTCTCCAAC
-+
-67777788888888888888888877776555443222100//...--,,+++******))(((((''&&%#%"$%
- at 30BB2AAXX080903:3:3:1253:995#0
-TGGGAGGTCGCGGTGGGGCGAGAGCTGGGCCTGGAGAATCCCCTGGGAGGCAACAGCGGGGTATGGGANCGTCNCT
-+
-6777778888888888,8838818(77766.'4402.'0.-./+,.-+,-(*')**')(''&##'##""#%$""#"
- at 30BB2AAXX080903:3:33:317:1713#0
-TCCCACGCTGAGAGAGGTCAGCCTGAGCCCTTGCCTCACACCAGCCCCTCCCACGCGGACAGAGGTCNCTACACNN
-+
-6777778888888888888888887777655544222210/0/.-.,-,,+,+*+***)))()((''"$##%$#""
- at 30BB2AAXX080903:3:4:1136:1040#0
-CCTCCCACGCGGACAGAGGTCAGCGTGAGCCCCTTGCCTCACACCGGCCCCTCCCACGCTGAGAGAGTNACCTNTN
-+
-677777888888888888888888-/7,335243.0.,1./../,+-+,)+***')((('&'(''&'""#&&%"""
- at 30BB2AAXX080903:3:3:1096:557#0
-CCCCTCCCACGCTGAGAGAGGTCAGCCCGAGCCCCTTGCCTCACACCGGCCCCTCCCACGCTGAGAGCNCGCTNCC
-+
-6/2774888888882888.88.5///+/603(1$/..1&01*,+++*++&%&'(#'&'&''#(#'##$"%##""##
- at 30BB2AAXX080903:3:41:865:161#0
-GGCTCGGGCTGACCTCTGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGGATCGGGCTGACCTGCATCCGGATCC
-+
-647(778888888888888888884707655148222-1%0-/.*%+-,,)$%'*)*)((#&('&'#%$"&$%#$#
- at 30BB2AAXX080903:3:57:26:621#0
-TCCTCCCACGCTGAGAGAGGTCAGTGTGAGCCCTTGCCTCACACCGGCCCCTCCCACGCGGACAGAGGTTCNACAC
-+
-6777778888888888888888289777555541132000,..--,-,+,+%+*)&()(('&'&'#&$"#"""$$"
- at 30BB2AAXX080903:3:3:793:2004#0
-TGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGCTCACACTGACCTCTCTCAGCAGATCGGAAGAGCNTGTNNCG
-+
-67777788888888888808808,71153/.232/.0-0..)-*,,,+)+()'())')%('(#''%'$""#"""#"
- at 30BB2AAXX080903:3:49:1451:1705#0
-GCGTGCGGCCCAGCTCCTCCCTCACGGTGGCCTGTTGATGCCCAACTCATGAGATCGGAAGGGCGGGCGCAGGCCT
-+
-6777778888888888888*8688771-650533%22+00)#.(,-),+++*+)*%))&()()#((%$"#"""##"
- at 30BB2AAXX080903:3:8:1007:1602#0
-CCAGGAGATGGGTAGGCACTGAGTCCAAAGAGGTTGTTGAGAGGCAGGAATCGGGCCTGGAGACCCANACTAGANN
-+
-677777888888888888888788777765454,32,21/0//.--,,),$)))*((&()%('&'''"%$""""""
- at 30BB2AAXX080903:3:52:1492:1419#0
-TGGTGGCCTATGAAGGCCCAAAATCTCCTCAAGTTGACCTGTCCAGGCCCAGCTCCTGCCTCCTGTCCACCTCTAC
-+
-67777788888888888888888877776555443220000//..--,,++,+**))*)())(((('$"##$##"#
- at 30BB2AAXX080903:3:51:1475:1741#0
-CATGACTCTCAATGGCCTATTTAGGCCCATACCCTACGTCACGGCAGCCTCCGCAGATGAGGCAGATGTCATNGGA
-+
-677777888888888888888888777765551432221/0//...-'+++*+)(*(()&()#('%'""#""""""
- at 30BB2AAXX080903:3:57:1499:235#0
-GAATGTGAGCAAAGGGGAGTGGCTGTAAATACAGACGAAGCTTCCCTCACTCCCTCACTCGACACCGCACTCCTCC
-+
-6777778888888888888888887*77655244302210/*/-.-+-,,,++*(*))')((((((''$%"#$"#"
- at 30BB2AAXX080903:3:60:348:1822#0
-TCATGGGATACCCAGTTAATATCCAGAGCACTGAAGAATCTGGTGTAGAAACTCCATACGTACATTCAGTGNGANN
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))))((((('&%"""#""
- at 30BB2AAXX080903:3:1:1061:1251#0
-TGCTGCTGATCTGACAGGACATGGAGCTCAGGTGGTCATGCAAGCGATGGGAGGGGCTAGAAATACAGNACNCACA
-+
-67777788888888888888888877776555,42220100-/---,,,,,*+*+*())()((((''""##""##"
- at 30BB2AAXX080903:3:35:1669:1510#0
-GTTGGGTGCAATGGCTCACACCTGTAATCCCAGCTACTCAGGAGGCTCAGCTAGGAGGATGGCTTGGNCTCTACAN
-+
-67777788888888888888888877776555443222100//..-.-,,++++*)*)(())'((&%"%"&""##"
- at 30BB2AAXX080903:3:4:369:930#0
-TCAGAGCAAAAGCCAAAGCCCCAGCAATAGCGTCCCAGGGATTACACGATCTGTACCGATCTCAGCGCNTCTANCN
-+
-6777778888888888888)88883777653528121210//+-,---+,*++***(*)&(&((('#%"#""#"#"
- at 30BB2AAXX080903:3:37:1298:800#0
-GAGTTGGAGAACTGGTGTAGAAACTCTGCACACACATTTGGTCAGAAGTCTGTGAGTAGAGAGAAACGTGTCTACN
-+
-67777788888888888888888877776555443222100//..---,,+++*+***)*)(()(('%$&###$$"
- at 30BB2AAXX080903:3:35:194:71#0
-GGAGTTCGAGACCAGCCTGATCAACATGGTGAAACCACGTTTCTACTAAAAATACAAAAATTAACCANCCACATNN
-+
-67777788888888888888888877776555443222100//..---+,,++***)))*)()(('&""##$#"""
- at 30BB2AAXX080903:3:47:112:269#0
-GCAGGTCAGGTGAGGTGGCTCATACCTATAATCCCAGCCCACTGGGAGACTAACGCAGGAAGAGTCCGATCGTGCG
-+
-677777.888.88888888888-877)7655244322210)/..'-,-,++++'*()*)&(((''#%&""$""##"
- at 30BB2AAXX080903:3:51:262:1243#0
-GGAGGCAGGGAGAATTGCTTGAACACAGGAGGTGAGACTGCGATGAGCTGAGATCAGACCACTGCACCATGACAGC
-+
-&777778888-888888881818)7.57155,%322%,./.%#-'-&',-*+(*')(&#)''&(#%#$"#""$"#"
- at 30BB2AAXX080903:3:38:1258:1769#0
-GAGGCAGGGAGAATTGCTTGAACACAGGAGGTGAGCTTGCCATGAGCTGAGATCATACCACTGCACTCCTGCTCAC
-+
-67777788888888888888888877776552443.22./01....(,,+,,+)**)()('#(((('%$%%%"###
- at 30BB2AAXX080903:3:35:180:1763#0
-TGAACCCAGGAGGCAGACATTGCAGTGAGCCAAGATCACGCCACTGCCAGCCTGGATGACAGAGCAANTGTCACTN
-+
-6777778888888888888888887777655544322210///..---,,,,+**))))))()((('""##$##""
- at 30BB2AAXX080903:3:43:101:113#0
-GGAGAATCCGTTTCCTGGCCGTAGAGGTGGACTGCACTCCGCAGCTTGTGCTGCCCGTCGCGAAGGGTTGGAGATC
-+
-677777888888888888888888777765$5143222100//.,----,)++))*)()))(#((%'$$%%""#"#
- at 30BB2AAXX080903:3:42:1289:788#0
-CAGAGTAACATGGCAGGAAGTGAGGGGGAAAGCCGCCCTGGAACTGCGCCTCTCTGCCCCCTGACGTCAGCTCGGA
-+
-67777788888888888888888877776755143321,00./+,---,,+,***+*))))(((((#'$%""%""#
- at 30BB2AAXX080903:3:47:1349:1408#0
-CCCGCAGCTATGGGGCTGAAGGGGAATTACAGCCCAAACACCAGATGCTGGCTCTCAAACCAACACTGTCGCGTCC
-+
-6777778888888888888$880817776555.3/222.(,/.+*,,,+++&'%&&&'('&'&&'%%""#"$""##
- at 30BB2AAXX080903:3:36:1643:70#0
-AAAGTGCGCTGATTGTATCTCCCTGTGGGCACTGAGGGCTCAGTGTGAGTTTGAGAGCCAGCAAGATNATACATNN
-+
-67774788888888888888888&77776552,422220#0-/#.*&++((+*))**')('(''((#""""$#"""
- at 30BB2AAXX080903:3:2:1208:1712#0
-TAAGAGACAAAGACCAACGAGCCACCACAGCCACCAGTCCCAGAACCTGCCAATGCTGGCGAACGCAANACTGACG
-+
-677777888888888888888888777715$544332'1//0.,--,-,-+**)*))))#)(('(&'$""#&#"$"
- at 30BB2AAXX080903:3:41:1032:925#0
-TAGAGATGGGGTTACAACATGTTGCCCGGGCTGGTCTCAAACTACTGACGTCAAGTGATCCACCTGCCTTGGCTTC
-+
-67777788888888888888888877776555443222100//./---,,+++**))**))((((''&&%&%%##$
- at 30BB2AAXX080903:3:49:1300:1010#0
-GATGTTCTACAACATTGCTTAACGCAAGGGGAGACGCTCCTGACTCAGAGTGTTTAATTGCTCACCTACTTAGCTC
-+
-677777888888888888888888777765554422221-0//..-,-,,+++***))))()(((''"$"###"$$
- at 30BB2AAXX080903:3:37:1558:1949#0
-AGAAAAAGAAGTAGGTGAGCAATTAAACACTCTGAGTCAGGAGCGTCTCCCCTTGCGTTAAGCAATGTTGCACCGN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))(()((('"$##"#$""
- at 30BB2AAXX080903:3:41:1521:31#0
-CTCAGTGGTCAGCGGAAACTTGATGATAGCATAGTGGCCAAGCTTGTTTCTCCTGGGGGTGCTCAGATCGGATGCT
-+
-6777738888888888888888887677655544322210///.,--,,,)++)*****#(''(''%"$%"#""#"
- at 30BB2AAXX080903:3:43:1395:698#0
-GAGGTCACACTATGTGTATCCTCCTCAGACTGTCTTCTCCCACTTAGCAATGTGCATGCAAGATTCACTCATGTAG
-+
-67777788888888888888888877776555443222100//..---,,,++*+**))))()(('''&&$&$$#$
- at 30BB2AAXX080903:3:35:1014:2002#0
-AAGGCACATGAACTATACTTCATTATTGGATTCCATTTTATAAAGTTCTTTCCAACAGATCGGAAGANCCGCTCTN
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))((((''"$$"%##""
- at 30BB2AAXX080903:3:1:1373:706#0
-GTAGGTTAGACACACACATATACTTCCTAGCATTGCTAATGAGGGACAAGATACAATGTGCATTCAGCNCCNAGAC
-+
-67777788888888888888888877776555443222100//..---,,++***+))))()()'((&"%$"""#"
- at 30BB2AAXX080903:3:44:724:1311#0
-TACTACTGTAACAGAAAACATGTAAAGGACATTTGTTTTGATTTATATATCAGTCTGCAAGATCGGAAGAGCGATT
-+
-67777788888888888888888877776555443222100//..---,,,+++***)))))((((''&"#"""""
- at 30BB2AAXX080903:3:59:1599:1766#0
-AGGAAGGGATGCTTTTGTAAAACAAGACTTGTGGAATATAACATGTGAAAGTAAAGCCCATGGCAAACACCCANAC
-+
-677777888888888888888888777765554432221000/..---,,+++***()*))((('(&$$%%%$"$$
- at 30BB2AAXX080903:3:42:1295:1267#0
-AAAGTGAGAAGCAGAGATAAACTAGTCCTAGACAGCTGACTCATGTTGGGGGCAGCCCACAGATCGGAAGCGCCAC
-+
-67777788888888888888888877776555443222100/...---,,+++***))))))()((('#&"$$##$
- at 30BB2AAXX080903:3:47:1062:671#0
-CACCTCGAGGCAGCTTTGTAAGCTTCTGAGCACTTCCCAATTCCGGGTGACTTCAGGCACTGGGAGGCCTTCTGTT
-+
-67777788888888888888888877776555443222100/...--,,,++++****))))(((('$&"$#$"""
- at 30BB2AAXX080903:3:59:968:73#0
-TGAGACTCACCTTGGTTGTGTTCTTTTATTAGTGCCTGTGACGCAGCTTCAGGAGGTCCTGAGAACGTGGTCANNC
-+
-6777778888888888888888887777655544322210///..---,,+++)**))*))((''#'&%$$%$""#
- at 30BB2AAXX080903:3:50:1512:1586#0
-TGTTTTGTGTCAGGGAAAGAATCAACCTGGGAGCCAAGCCCAGGAATCAGGATGACCAAGACATACTCGGCGAGAC
-+
-6777778888888888888888887777655544322201///..--,--++*+**&)))('(&(%'$""#"#""#
- at 30BB2AAXX080903:3:4:1738:1246#0
-ACTGCACAAGGAGGGAACAAACCCATCCAAGGACACTCAAGGACAAATCAAGCAAATGAATTTAAGGCNGCTCNAN
-+
-677777888888888888888888767722554632010-/..---,+,,++)**)(*)(('(('''"""""#"#"
- at 30BB2AAXX080903:3:54:828:1860#0
-AAGTCGGTAGACTAATACCTAATAAAAGCAAAGCTGCCAACAATTGAAATTGCCTAGGCTGCTCTGTGTGTCCCTC
-+
-67777788888888888888888877776555443222100//..-,-,++++***)))))()(('&$$%$"$#"#
- at 30BB2AAXX080903:3:36:644:1261#0
-TGTTAATATCAGATTAGTCAGGATGGGCTGGATTATGCTGTGTTAACAGCCATTCTCTAAATCTCTTGTGTGTGCN
-+
-67777788888888888888888877776555443222100//..-,-,,,,+*+*))))))()(('%&#$$%#$"
- at 30BB2AAXX080903:3:40:537:1113#0
-ATCTGGGTGCCTGGCAGGATGACATGGTGTGAGGCTCAAGCAGCACTGTGGGAATTCAAGCATCTGTTTATTTANA
-+
-67777788888888888888888877776555443222000//.-----,+++***)*))())((''"&#%"$#""
- at 30BB2AAXX080903:3:3:1615:1646#0
-AAGTACAGAGGTTATTCCTAGGGTCTTTAATATTACTGTCCCTTTAGGCAAGATTATCCGTATGATAANATGANCN
-+
-677777888888882888888&887777635544312200./,--,-,,+++)**)())')'((''%&""""#"""
- at 30BB2AAXX080903:3:34:1136:1098#0
-CTCTTGCTGCCCAGGTTGGAATGTAGTGGTGCGATCTTGGCTCACTGCAACATCCACCTCACGGGTTNTACTCTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('%'"%%"##"""
- at 30BB2AAXX080903:3:39:961:878#0
-GGTTGTTAACAAGAGCCTGGCACAAACCCCTCTCTCTCGCCACGTGATCTCTGCACATGCCAGCTTACATCGTACA
-+
-67777488818888888888888877776555443212100./.'---,,+,++**)**((()''('"""%"""#"
- at 30BB2AAXX080903:3:43:1170:932#0
-CACAGTTCTGAAGGTGTGCAAGAAGCATGGTGCCACCATTTGCTTCTGGTGAGGGCGTTAGGCTGTTTCAGATGTA
-+
-67777788888888888888888877776565443222100//..---,-+++**))*)))(((''(&$#&"""""
- at 30BB2AAXX080903:3:49:39:584#0
-TTGGAAAGCGGAATTTATCTTCATATAAACAACACTGAGCTAAATCTCAATATTTCAGATCTCTAGACCGCTCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&$"#"$#"""
- at 30BB2AAXX080903:3:58:786:154#0
-TAGAACTATCCATCAGTGAAATGGATTGCAAATACAAAGAGTAATACCATGTCACTTAAGAATACAATCATTGNNA
-+
-67777788888888888888888877776555443222100././--,,-+++*++**))))((((''&%%""""#
- at 30BB2AAXX080903:3:56:1030:521#0
-GGTCTCAGTTCAAATGTCACTTCCCTGTAAAAGCTTCCTGGCCATCAAGCCTTCTTTACACACTCAGATCTGCGCC
-+
-67777788888888888888888877776555443222100//..---,,+++****)*))(()(('%'"""""#"
- at 30BB2AAXX080903:3:43:1004:671#0
-TGTGGAGGCAAGAGGATCACTTGAGGATCACTTGAGTCCATGAGGTCAAGGCTGCAGTGAGTCATGGTTGCGCCAC
-+
-67777788888888888888888877776555443202120//..,-,,,+**+*)*#*()'(('(#&#%$$%###
- at 30BB2AAXX080903:3:57:960:270#0
-ATTATGGTTTTGATTTGCATTTCTCTAATGATCAGTGATGTTGAACTTTTTTTTTGTATGTTTGTAGATGTTCATA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((''&&'#""##""
- at 30BB2AAXX080903:3:52:1474:218#0
-AAAAACCACCACCATCATTTTGCAAGTGTTACCACTATTGTGTGTTAATATTGTAGAAGTATTCCTAGTGATGTGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"#"&%$##$
- at 30BB2AAXX080903:3:2:180:685#0
-ATTGTCTCATTTTCAGAACAGAGTACTAAATGGATCATGAACACTATCTGGTATGTCACAGATCGGACNTGTNNCT
-+
-67777788888888888888888877776555443222100//..,-,,,+*+***)*)))(('(('"""$"""""
- at 30BB2AAXX080903:3:56:1111:307#0
-GAGAATGGGACATTTAAGAATAGACTTGAAGGACAGGCAAGAGCAATCTCTATGTTTATATGGGAGATCGGTCATC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('&"%$%"###"
- at 30BB2AAXX080903:3:51:1412:1403#0
-ACTGAATGCAATAAAGGCTTATCAGATGTGATTAAGGATGCAAACCGAGATGGAGAGATCTTCCTGGATGCTCACN
-+
-67777788888888888888888877776555443222100//..---,,++++**)))()((('''"""#"#"#"
- at 30BB2AAXX080903:3:42:222:1832#0
-CACCATTCCCTGAACAAAATATGCCATCTTCGTTGTTCAGGTCTGTACAGTGCTAGATCGGAAGAGCNGCACACAC
-+
-+77777848888/8.8/83808889777654544322./0/.-..-,),,,+*+*+**)))'((((#"$#"$%"""
- at 30BB2AAXX080903:3:53:1153:1961#0
-TCCTGCCACACTTAATTCACCATTCCCTGAACAAAATATGCCATCTTCGTCGTTCAGGTCTGTACAGGGGTGACCT
-+
-6777778888888888888858887/77655544522210/.0.,--,,,++++**))(()))('(%"$""####"
- at 30BB2AAXX080903:3:2:1594:1461#0
-CATGCATGTGTAGTCCTAGCTACTTGGGAGGTTGAGATGGGAGGATTGCTTGATCTCAGAAGGCCAACNCTACACA
-+
-67777788888888888888888877776556443222100./.-.--,,+,)+**)*)(())('('""#$##$"#
- at 30BB2AAXX080903:3:40:564:69#0
-GGATGCACTTGAGCAGGGGTCCCCAACCCCTGAGCCATGGAGCCGCAAGGAGCCACACAGCAGGAGGTGACCAGAG
-+
-67777788888888888888888877776555543222101/...--*,,*++****)())((('''"&####""#
- at 30BB2AAXX080903:3:35:753:1760#0
-GCAGCTGGCCAGGTGTGGTGGCTCACACTGGTAATCGCAACACTTTGGGAGGCTGAGGCAGGAGGAGNCTCATATN
-+
-6777778888888888888888887777655,48332020////.---,,++*+*))))(*((((%&"%"####""
- at 30BB2AAXX080903:3:49:1196:1797#0
-AGGCCGACGGGAGGCAGAGGCTGGGCCTGGAGGGGCCACCAAGATGCAGGAGCTGGGCCTGGAGAGGCAACCACAC
-+
-6777778888888888888888887/776565443.01000-/.--,,,,++'**)*#())((('('%"""$"#"#
- at 30BB2AAXX080903:3:55:1711:1853#0
-CCCAAATCAGGCTTTTGCCCAACTTCTGTCTACTGTCGGACTCTACAGGTCAGCCTCTGCCTCACACACACCCACA
-+
-6727778888888888888888887/7763550432.2100//.-+--++*+*$')(*)&()((''&$$%%$&%$$
- at 30BB2AAXX080903:3:59:367:1142#0
-GTGAGGCCTGACCTGGGCCTGGGGAGCTTGGCTTGAGGAAGCTGTGGGCCGACCAAGGCCGCCAGGAGGTAACNNA
-+
-677777888888888888888888.77765554430220/0...-----,+*+*))*))))')(((#&%"""#""#
- at 30BB2AAXX080903:3:39:38:1695#0
-TGTTGAGGCAGGGGGTCACGCTGACCTCTGTCCGCGTGGGAGGGGCCGGTGTGAGGCAAGGGGTCACCTACACCAC
-+
-677777888888888888,878882777655334221211,0/.-+---*,'+(**##'(((###%#$""#"##"#
- at 30BB2AAXX080903:3:43:1318:786#0
-AGCAGCCCGAGAGCGATCCTGTTCCTCCCTCACGGTGGCCTGTTGAGCCAGGGGGGCGCCGCGCAGTACGGCCGCG
-+
-0777778880,888884888888861276)5514/0112$)..&..-$')*)++*######'(##&&"#""#$##"
- at 30BB2AAXX080903:3:33:1128:1150#0
-ACCCGGAAGGCTGAGGCAGGAGAATGGCGTGAACCCGGCGGGAAGAGGTTGCAGTGAGCCAAGATTGNGCCCCCNN
-+
-67777788888888888888888877776555483222100//..---)-+***+**))(()(('('""##$##""
- at 30BB2AAXX080903:3:54:155:1356#0
-CTATGCACACATCTTCCCCTCCAAGGTTTGTTCTGCCCCTGCCCTGACTCCCAGCCCTGTGGGGGTCCTCAACCCC
-+
-67777788888888888888888877476555343210020...,---,-++)+*)))('(((((%&"""""$###
- at 30BB2AAXX080903:3:42:1470:976#0
-GCAGTGGGCCTGGAAGAGCTGCATGATCAGGGCCGGCACTGGTCCAGGGTACGTGCAGTGAAGAGGACNAGATCCT
-+
-6777-7888888888888888888777765554432211*1/...---,+++++**)*()('(((('%"$&#"""#
- at 30BB2AAXX080903:3:1:1184:305#0
-CACTGAGGGACTGGGCCTGACATCATCTGAGTGGTAGAGGCAACTGGGTGTCAGGAGACATGATGGAGNCANTAAC
-+
-6777778888888888888388887747655644022111/..(-.-,+,+(***)))((()(''(&""##""""$
- at 30BB2AAXX080903:3:56:1412:1940#0
-TGCTCTTGTCACCCAGGCTGGAGTGTAATGGTGAGATCTCTGCTCACTGCAACCTCCACCAGATCGGATGCTGCGC
-+
-67777788888888888888888877776555443221100//.-.+-,++,+)**)*)()((''(''##"##"""
- at 30BB2AAXX080903:3:4:388:998#0
-GCACTCTGTCACCCAGGCTGGAGTGCAGTGGCACAATCTCTGCTCACTGCAACCTCTGCCTCCTGGGANATCANCN
-+
-67777788888888888888888'777785554330201/0...--,+,-,*(**)())(((((('&&""#%""#"
- at 30BB2AAXX080903:3:34:913:939#0
-ATAAACAAGGATTATAATCTGAGATATTTGTGCTATGATCAATCATAGGTGCATCCCAAGAGATCGGNCTCACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))())('&"$"##%"""
- at 30BB2AAXX080903:3:40:407:531#0
-AGGAAAATATGTAAAGACAAAAAGAAGTCCATGCAAGCTGTTTTGAAACAAACATCATTGGTCACAGCGAGGCACA
-+
-6777778888888888888888887775635544322210///...--,,-++***)))))))(((&&%#"""###
- at 30BB2AAXX080903:3:34:825:1405#0
-AATCTGTGTGGCTTCCAAATTTGCAAGCTGAGAATTTAATTCAAAGTGGTCTCAGGTTGAAGATCGGNCACACTNN
-+
-67777788888888888888888877776555443222100/0..-.-,,,++***)*)()))(((&"$$#$#"""
- at 30BB2AAXX080903:3:47:11:1920#0
-TTCTTGTGCCCTCTCCCTCTCTCTCTTTCTCTTGCCCTCTCATTTGAATGAAGCCAACTGGCATGCTGACACACAG
-+
-677777888888888888888888777765554403221000/..,-,,,+++*)**))))(()('(&%###"##"
- at 30BB2AAXX080903:3:40:161:1355#0
-GAGATTTGGGTGGGGACACAGCCAAACCATATTGCTGCTGAATAGATCATGTAGACAGGCTCTCAAANTCCAGAAC
-+
-67777788888888888888888877776555443222100//...--,,+++****))()))((('"$""%$"##
- at 30BB2AAXX080903:3:50:961:593#0
-TTGGGAAGGCATGATTGGTTTTGAAATGTGAGGACATGAGATTTGGGAGGTGCCAGAGGCAGAATGAGGCGACCAA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((''$"##"##""
- at 30BB2AAXX080903:3:44:703:170#0
-CCACGGTGCCTGATCCCTGCTGCATCCTCCTTCTCTAGTGGCAACAGCAAATGGCCACACAGAAGGCAGACACTGC
-+
-67777788888888888888888877776555443222000//..---,++,++****))(((('(''$"""""##
- at 30BB2AAXX080903:3:1:657:109#0
-TGACAGAGCAGGCTCCTAAGTCAATGAAGGAGAGACTGGCCAGTAGAAAGTACATGGGGGAGTGGAACNAANACAC
-+
-677777888888888888888388777765451410222*)-/,-.*,,,$*%*'))*))#(#(##%"""""####
- at 30BB2AAXX080903:3:38:1408:1753#0
-GCAATCCTAGTCTCTGATAAAACAGACTTTAAACCAACAAAGATCAAAAGAGACAAATAAGGGCATTACATAACTG
-+
-67777788888888888888888877776555443222100//.----,,++++**)))))((('(&$$%&$#"""
- at 30BB2AAXX080903:3:38:423:536#0
-CAAGCTGGCATGTGGCTTGAGGTGACCCGAATATGTCAGCACCCCTCAGATGTCTTTCAGATCGGAATAGCCGACA
-+
-677777888888888888888888777765554430221*,./..--*-,++*****)((((((('&$#"#"""##
- at 30BB2AAXX080903:3:3:27:1957#0
-CATGTGTTTTTTGGCTGCATAGATGTCTTCTTTTGAGAAGTGTCTGTTCATATCCTTTGCCCCCTTTCNTACNNGT
-+
-6777778888888888888888887777655544302110///..-,-,,+++**()*))))(('('%"#"#"""#
- at 30BB2AAXX080903:3:43:823:764#0
-GTCCATGTGTTCTCATTGTCCAATTCCCACCTATGAGTGAGAACATGCACTGTTTGGTTTTTTTTCCTTCTGGTTT
-+
-6777778.888888888888888877/76555'432221/0//..----,,+*****)&))'(%(''&&$&#$#""
- at 30BB2AAXX080903:3:54:34:362#0
-TTCTGGGTGCAGCACACCAACATGGCACATGTATACATATGTAACAAACCTGCACTTTGTGCACATGTGGCGATGA
-+
-6777778/88888888885388887777655.4432302/0-.-..,,,,*,+**)())()((((''$""%""""#
- at 30BB2AAXX080903:3:52:540:1144#0
-CCCCTGAGAGGCCCTGGTGTGTGTTGTTCCCCTCCATGTATCCACGTGTTTGTCCTGATGGTAGATCGCGCGACTA
-+
-67777788888888888888888877776555443222100/.-.-,-,,+++*+*)))))(((('#$$"#""#$#
- at 30BB2AAXX080903:3:37:1436:1234#0
-TTCCCCTCCATGTATCCACGTGTTTGTCCTGATGGTCTCCTACCCCCTCTCCCCCTGAGAGTCCATTCTCTCTCTN
-+
-67777788888888888888.8887777+5554432212/.//,-.-,%+,++$)()()(&#'(%&#%$#"$"##"
- at 30BB2AAXX080903:3:4:735:1949#0
-CCCCTGTCCCCCTGACAGGCCCTGGTGTGTGTTGTTCCCCTCCATGTATCCACGCGTTTGTCCTGACANACTCNCN
-+
-67777788888888828888888877776)554413222/#/.,,+,*+,+'+(()'))(((((((&%"%$#""""
- at 30BB2AAXX080903:3:38:261:1349#0
-ATGTACCCACGTGTTTGTCCTGATGGTCTCCTACCCCCTGTCCCCCTGAGAGGCCCTGGTGTGTGTTATTCCCGCT
-+
-67777788888888888888888877776555443232100/.-----,,,,+**)*)))))(('''"&%%%%"$#
- at 30BB2AAXX080903:3:51:826:1191#0
-CATCAAGACAAACACGTGGGTACATGGAGGGGAACAACACACACCAGGGCCTCTCAGGGGGACAGGGGGGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$"#%"#"#"
- at 30BB2AAXX080903:3:45:572:45#0
-CCTGTCATTTAATGTTTTTTCAATAAATGCTGGCAGGGCTAGCTAGTCAGGGCTCGTGGCTGCCCGACGNGTCGGC
-+
-677777888888888888888888777765554432221/0//.,.,,),,,*)+(#)*(''&(##%""""##""#
- at 30BB2AAXX080903:3:56:995:113#0
-ATGGTGGCCCAGGCTGGAGTACGATAGTGTGATCTTGGCTCACTGCAACCTGTGTCCTGGGCTTAAGGGTCCACCG
-+
-67777788888888888888888877736555443222100-/-.--,,,,+*+*)***))('((''$&#"#"##"
- at 30BB2AAXX080903:3:45:1022:248#0
-CCAGGCTGGAGTACGATAGTGTGATCTTGGCTCACTGCAACCTGTGTCCTGGGCTTAAGTGATCCTCNCACACCAC
-+
-6777778888888888888888887777655544322210./,.,---,,,,+***)*)()((((''"&"$""##"
- at 30BB2AAXX080903:3:42:321:801#0
-ACAAACTTATAGTTTGATTTTTGTAAACATCCCTGTAATCATCACATAAGTCAAGATATAGGACTTTAGATCGGAA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))(((((&'&&%%$$#$
- at 30BB2AAXX080903:3:2:1005:1899#0
-TGTATTATCTAAGAATGCATTGCCAATCCACAGCAATGTTTTATTTCCATGTTTTCTTCTAAGCATGTNTGGNCTC
-+
-67777788888888888888888877776755443222100//.----,,++++****))())((((&""%""#""
- at 30BB2AAXX080903:3:52:1130:1835#0
-TGTTAATTTGCCTTTGGATGATCTGATTTCTAAAGGTTTGGTGGAATTCTCTGTGAAAACATCTAAACCTAGTGTT
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))()(((("""$%%#"%
- at 30BB2AAXX080903:3:56:733:1970#0
-TGAGAGGCAGAGGTTGCAGTGAGCCAAGATCATGCCACTGCACTCCAACTGGGGCAACAGAAGATCGGANGAGTCC
-+
-67777788888888888888888877776555441222100//.-----,+++**)*)*)()))('''%""##""#
- at 30BB2AAXX080903:3:1:1112:1239#0
-TGACAGAGTCTTGCTGTGGCACCCAGGCTGGAGTGCAGTGGTGCAATCTCAGCTCACTGCAACCTCCANNTNTCGT
-+
-677777888888888,88*3888&77786552443212.00//----,+,+,+*+*()*)))('('&%""""$#""
- at 30BB2AAXX080903:3:45:230:803#0
-CTCTGTCTGATGCTGGGCTGTCACCATGCCCAAGACTGAGGGGACCCACAGTCTAGCTAGAAGGCATGGAGTAGAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))((((('%"""##$%
- at 30BB2AAXX080903:3:49:375:934#0
-TGCTTTGCTGCTCAGCATGGCTGGGAGGCACAGTGGAAGATCATGCATCCTTCCCCTGGGACTCCTCTGCCCTCAC
-+
-677777888888888888888888777765554232/21/0/.-.-,,+,+,***))**)(((((('$#"$#"#"#
- at 30BB2AAXX080903:3:43:1559:1760#0
-ACCTGCTCATGGTCTGCTTTGCTGCTCAGCATGGCTGGGGGGGACAGGGGGAGGACAAGCATGCCAGAGGGGGACG
-+
-677777888888888888888888704763454422221/0/+)%.-#,-**+)##'#(&'&#%##&%"""%#"""
- at 30BB2AAXX080903:3:45:543:1504#0
-GGGCACGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCAAGGCAGGCAGATCACGAGGTCAGGCGACGGT
-+
-67777788888888888888888877776555343222100/.-/,--,,+,***))))()()('&''""""""""
- at 30BB2AAXX080903:3:3:1522:47#0
-CAAGTCTAAACTCCCGACCCTGGAACATCAGGTCTTTGTGCTCTGTTCAGTGCTTCTCTACCTCACACNACACNCN
-+
-677777888888888882,288887.7725552,321110,/....-,,,+,)+*(*(*)'#(#(%#""####"""
- at 30BB2AAXX080903:3:38:199:546#0
-AAAGAGCTGATCAGGAAGCAACTATGCACGGTCTTCCCCTCCACACCTCCAGCCCCAGCTCCCTTCCTCACACCTA
-+
-67777788888888888888888877776555443222100//..-.-,-,++**))*))))(((('"%"""####
- at 30BB2AAXX080903:3:60:1392:1511#0
-AGTGCATGGCTCCACACTGCCATCTTGGGGGCTGGCACAGGCTGGCAGTGAGTCTGGGGGAGGGAGGCACAACCNN
-+
-67777788888888888881*-307777654'443$+-.01-/..+,&+,(*)'*)'))#((((#(#$$%%%%$""
- at 30BB2AAXX080903:3:41:1728:799#0
-GCCGACTGCTGGGTGCGCGGCAGACCTAGTGCATGGCTCCACACTGCCATCTTGGGGGCTGGCACAGGCCAGNTCC
-+
-67777788888888888888888877216+5444322010///-'.--++))+*(*))''()(''&'&$""&"$#"
- at 30BB2AAXX080903:3:33:659:237#0
-AAGAACCCACAGCCGACTGCTGGGTGCGCGGCAGACCTAGTGCATGGCTCCACACTGCCATCTTGGGNCAGCATNN
-+
-677777888888888888888888+777655544322210///.---,,,,+++*))**((()((('"&""$#"""
- at 30BB2AAXX080903:3:42:1316:1812#0
-TATTACACACCAGATTCATTCCCTGATTAGAGCTGCTGAATTCTTTTACTCTCACTGCACTCATGCTACAGTTTCT
-+
-677777888888888888888888777765554432221/0//..----,,++++*)))))(()(('&"%%$#%#$
- at 30BB2AAXX080903:3:47:234:803#0
-TCACTGCCTGGAGCCAGCTCTTGGAAGTTCCCCAGGAGCTGTCCAGTCTTACGTCATGTCTAGTCAGCAGTGCCTN
-+
-67777788888888888888888877776555443222100//.----,,,,++*)**))))(((('%##""##""
- at 30BB2AAXX080903:3:57:1354:908#0
-AATTGACTCTATGTTCCACAGTCCATACAGGGAGCCTGGCTTGTGAGCGATGCCGTCATACACCCTAGAGCGCACG
-+
-27724728888888888)843&78.027635"34/-2'00+..-+$-+$,$%*'**''%()(##(%#%&%#"%"#"
- at 30BB2AAXX080903:3:45:343:174#0
-CTGCTCAGCTGAACCCCTGGGAGCTGAGGGGCCAACTCTGACTCCCAAGAAGGTGACCTCTATCTCCCTTCCGGGG
-+
-6777778888888888888888887717655548322220///..-,+,+*++(**()*))()((('&""$$"%#"
- at 30BB2AAXX080903:3:34:808:1334#0
-ATGTTGTGTGAGGCCTGACCGCTGTGAGGATGGACTTCCATCTGTGTGAATGGATTCATGAGACCAGNCTCACCNN
-+
-67777788888888888888888877776555443222100//..---,,++++**)***))(((('"%"%"$#""
- at 30BB2AAXX080903:3:1:1153:736#0
-TGCACAGAAACTTAGGCATATGCCTACCAACATGCCCGATGTTGTGTGAGGCCTGACCGCTGTGAGGANTCNCCAC
-+
-67777788888888888888888877776555443222100./.--,-,-++++***))))())(('&""%"####
- at 30BB2AAXX080903:3:52:1018:2027#0
-TCCTTCCACATAGGTGGTTCTCCACCCAGGCTGCCCAGGAGAATGTGGAATCTCCAGCAGTTCTGACGTACGGNGG
-+
-67777788888888.888888188777765554131221/0-.-.,--,,+*+*))*)((&((''%%$""""#"""
- at 30BB2AAXX080903:3:1:506:1384#0
-GGTGTTTGGAGCTTCCTGGTAGGGGCTGGGGACAAAGTGTGGATGGGGCACCTGCTGGACCTGTGGGCNGANCACA
-+
-67777788888888888885888872776553,0..2,1.0/,,.-*-$$+*'*##))%#&#(#(#'""#&"$##"
- at 30BB2AAXX080903:3:41:1164:1967#0
-TGTGCGTGAGTCCCTGTGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGGTGTGACGGGGGGTGTGCTGTATCNT
-+
-677777888888888888888888777765554432211/0//..,--,,++++*()))))(((''&&'%&#%"""
- at 30BB2AAXX080903:3:3:124:1345#0
-TGTGCTGGGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGGCCCTGTGTGTGATGTTNTGTCNCT
-+
-6777778888888888888-888177776555443222100//..---,,+%+***)*)()((((''&"$&##"#"
- at 30BB2AAXX080903:3:53:1237:733#0
-GGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTGAGATCGGCACAGTTG
-+
-67777788888888888888888877776555443222100//..---,,+++******)))((((&$$"""""""
- at 30BB2AAXX080903:3:4:1614:1500#0
-TGGGTGTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTAGATCGGAAGAGCGNTCGCNCN
-+
-6777778888888888888888887777655343322210./...-.,,,,,++*+*)())))(((%"""""#"#"
- at 30BB2AAXX080903:3:36:1382:1870#0
-TAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTATGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGCTCGTGNN
-+
-67777788888888888888888877776555443222100//..---,,,++**+)*))))((('%"$"""""""
- at 30BB2AAXX080903:3:34:1573:1705#0
-AGGGACTCACGCACAGAGGACATGTGAACACTACACACACGTTCTCACACAGCACACACCCCAGATCNCATACCNN
-+
-677777888888888888888888777755554)30211/0//..----,,)+****))(((('&#'"%"#%$#""
- at 30BB2AAXX080903:3:41:922:166#0
-TGTGAACACTACACACATGCTCTCACACAGCACACACCGCATCACACCCACACCCCCACAAGACNGGTGGCGCGAC
-+
-6777778088888888848$888897776/25243112000..+-,,,-*+*+)+))()('')##''"$%"%#"#"
- at 30BB2AAXX080903:3:38:1400:171#0
-CGGAGGGGCCTCCCTGCCGACTCTGCCCCCGTCCTGTGGCCGTAAGCCCACCCAGAGCGCCCCCTCCTCCCTACNN
-+
-6777778888888888888888833777654'44/.)10//.'(*-",,(+*+&'&))((#(###'%$%$$#"#""
- at 30BB2AAXX080903:3:36:1153:871#0
-GGCCACAGAGAACCCGCGTGCACCGGCCGCCAGGCCTGGGCATCTCCTCTCCTGCAGCGCCGCCTGCCNCAGACGN
-+
-6777778888888888888888887777655544322210/1/-.-,,,,,+++****))))(('(&""###$$""
- at 30BB2AAXX080903:3:51:1670:1413#0
-GCACACGGGTTCTCTGTAGCCAGCAGGCGGCGCTGCAGGAGAGGAGATGCCCAGGCCAGGCGGCCGGAACACACCA
-+
-67777788888888888888888877776555443212120//..---,-+,+***))))((((('&$$&#$#$#$
- at 30BB2AAXX080903:3:44:1274:1604#0
-TGTGAGTGTGTGTGGCTCTCAGGCCTGTTCTGTCCTGGGTGCGCTGCGTTCCCCAGGCGGCACCATCTCTCTGCTC
-+
-67777788888888888888888877776555423222100//.----+-+,+**)))))&'('&'&"$"$$%$"#
- at 30BB2AAXX080903:3:44:1718:847#0
-CACGAGAGCTGTGAAATGGGAGTGAGGGGTGAGGCAGGCCATGGGGCCTTCCACAAGGTGGGCAAGATGGGTGTCG
-+
-677777888888888888888888777763554432221/0-./.-,,+,++*)&**)(())'''('"$$""""#"
- at 30BB2AAXX080903:3:56:504:1509#0
-TGTCAGTCAGAGCTCAGGCCAAACACTGGGGCTAATAGGGGTGAGAGCAGGGAGCTGTGGGGTCCTCACAGCNTNN
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))))((((('%&"&""$""
- at 30BB2AAXX080903:3:60:1067:1145#0
-ACCCTACCCTGTCAACAACACTGGCCTTCAAGACCCTTTGTAGCATAACTCCCACCTATAACTCCCAACTTCAANN
-+
-677777888888888,8888848877776555443222100//..---,,,+++**)))))(()(('"$&##$$""
- at 30BB2AAXX080903:3:58:445:1310#0
-CATTTCCTCCCCACAAAGCCACCTCATGAGCCTGGGGGGGGCCTAGCCAGGCCTGCTGCTGAACCTGCTCTTCCAC
-+
-677777888888888888888888787765.94432.21-0-/.--,-,,&++')*&*'()((#(#''%%#""##%
- at 30BB2AAXX080903:3:43:1138:131#0
-GCAGCGCTAGCCCCTGGACTATTCTCACCACTCACGCCTTGGCCTCCATACCCGCGCGCACACCGCCCCCGGCGCC
-+
-67077788888888/8888888&87777455)43'221+-&/+.--.&)+(+%**&'#'(##((#''""""#""#"
- at 30BB2AAXX080903:3:35:1407:524#0
-ACCGCCTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCGCGCGTAGCTGGGACTACAGGTGCCTGNCGACCTTN
-+
-677777-888888888888888),7777.5/514112200,/..+'+,,*+**()()#))(&('%&%""#"#$"""
- at 30BB2AAXX080903:3:48:72:1271#0
-CGGGCCTCCCCTGCCTCCCTCTGCAGCTGTCCACGCCCAGCCAGCCTCCCTGCCTCCCTCTGCAGCTGTCTGTACT
-+
-67777788888888888888888877776555443222100//.-----,++++****)))()('''$$#""#"##
- at 30BB2AAXX080903:3:2:589:1114#0
-CTGCAGAGGGAGGCAGGGAGGCTGGCTGGGCGTGGACAGCTGCAGAGGGGGGCAGGGGGGGGGCGGGTNTGCATAC
-+
-6777778888888888881883)3712765+5'43$+*0-,/*(-*-,,%,+#&)**)#)(###'##"""%$"""$
- at 30BB2AAXX080903:3:36:90:188#0
-CAGGGCAGGACCAGCCCCCCAAGCTGTGAACCTCGCCCGAGGCTATGCCCCACTCTGGAGCAGAACGNCTACGGTN
-+
-67777788888888888888888877776555443222100//.-.-,,,++++**))())(('(('"""#%""""
- at 30BB2AAXX080903:3:41:759:1634#0
-AGCCTCGGGCGAGGTTCACAGCTTGGGGGGCTGGTCCTGCCCTGTCCCACATGTGGCTGGTTTGGGGGCGTGGCGA
-+
-6777778888888888888882887777655544302110.//..-,-,+++***)&*)&'(&''##"$""$"#""
- at 30BB2AAXX080903:3:41:694:781#0
-TGAGGGTGAGGCCCATGGCCTTGGGAAGCAGGCATAAGTTGGGGGGGGTGGGCACACAGGGGCACCGCGGGACCAG
-+
-677777888888888888888888777765554432.2000//..---*,,++*+**)))(#'(('''&""""##"
- at 30BB2AAXX080903:3:34:439:399#0
-ACACACACGTGCATGTGCATACATGGCTTAGCACACACATCTGTAGATCCTGGGTTTGTCCTTTAGANCACGTCNN
-+
-67777788888888888888888877776555443222100//..----,+++**+**))))))(('"#"$#"#""
- at 30BB2AAXX080903:3:41:947:127#0
-ATCTTGGCTCACTGCAAGCTCCACCTCCCGGGCTCACACCATTCTCCTGCCCCAAGATCGGAAGAGGGTTCAGCAC
-+
-6777778888888888888888887/7765254131211//++--.-&+-+**)*))&(')'')#('&%$$""$##
- at 30BB2AAXX080903:3:47:1096:1669#0
-CAAAGAATTTGGGCACCATGGTAATTACTGAACATTTAGGGGAGACACTTTGACAGTATAGATCGGAAGTGTCGGG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)*)(('(('"""""#"""
- at 30BB2AAXX080903:3:46:770:234#0
-CACCTTGGCCGTGTGATCAAGGTCCAGACCACCAGTGATGAGGCATGTTGACATCGTGGCCCCTGAGACGCTGACG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))((((%'%""""""#"
- at 30BB2AAXX080903:3:41:827:784#0
-GCAGCTCACGTCCAGGACCCCAGGCTGCACTGGCCCTCACGCCTCCTTAGTCCCCTGCACCTGTGACCCTTTCCTC
-+
-677777888888888888888888777765554452220/0///..-,-,,+++**(*)))((('('&$#&$%##"
- at 30BB2AAXX080903:3:33:712:1620#0
-CGAGGGTGCCGTCTCAGCAGCTAAAGGTGTGGAAACTGGGACACTCACGCGGGTGCGGGGATCGGAANACACACNN
-+
-677777888888.8888288+8$)+78+3)55452+.1&0,..,,&,',%+++$*%&(#(###('#%""&%&$$""
- at 30BB2AAXX080903:3:50:685:603#0
-ATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCAGTCTCAGCAGCTCACGGCGTGGATACACA
-+
-67777788888888888888888877776555443222110//$.---+,+,*+**)))*()((#(#$""""##$#
- at 30BB2AAXX080903:3:56:1307:1519#0
-CACGGGTGCCATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGGCATCTCAGCAGATANGACAC
-+
-677777888888888888888888777+6/55443012/2/./-----,+++*)*#(()'#(()'('&&""##$##
- at 30BB2AAXX080903:3:51:749:1955#0
-AGTTTCCACACCGTGAGCTGCTGAGATGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCNCGCATGG
-+
-67777788888888888888888877776555343220100./.,--,,,++*****)()()(((''"""""#"""
- at 30BB2AAXX080903:3:43:807:1752#0
-ACACTCACACGGGTGCCATCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCGGCC
-+
-67777788888888888888888877776555441212100//..,-,,,,,+**(()))()'(('''&%"%"##"
- at 30BB2AAXX080903:3:3:429:941#0
-TGTGTATGACTGTGTGTATGAGTGTGTATGATTTGTGTGTGTGAGTGTGTACATGTATACACTAGTGTNCGTCNCC
-+
-67777788888888888888888877776555443222100//..---,,+,+***))*()))((('$"&#"#""#
- at 30BB2AAXX080903:3:39:469:1852#0
-TGTGTATGAGTGAGCATGAATGTGAACATGTGTGCACGAATGTATATATGATCTGGGTGTGTAGGAGATAGCAACA
-+
-67777788888888888888888877776555442232000//...--,,,++**+)*)))((((('"$""#"###
- at 30BB2AAXX080903:3:53:57:1762#0
-CATGTGTGCACGAGTGTATATATGATCTGGGTGTGTAGGAGTGAGCATGAATGCGTATGCACAAGTGGCCTATCTG
-+
-647777888888888888888888777765514433221/0./-...-,,+++***)*)())(('''"$#"""#""
- at 30BB2AAXX080903:3:45:936:1683#0
-CCAGAAAAGCCTGGATGCCACACAGACTCAATGCTGAAAGCTCCCAGTGCACCTGCACAGATCGGAAGCGCGCGGC
-+
-6777778888888888888888887777655544322200.///-.-,,,+++**)*))*)((((('$"$#%"#"#
- at 30BB2AAXX080903:3:3:651:1124#0
-CATGTGTGGGTGTCTTTGTGCAGGTGCACTGGGAGCTTTCAGCATTGAGTCTGTGTGGCATCCAGGCTNCTGCNTA
-+
-6777778888888,88888881887777655544322212///.-.-+,,*,++**)*#'(&''((%&""&$$"""
- at 30BB2AAXX080903:3:40:540:1733#0
-GACTGAGTTGGCCTGGTCCATTGTGAGGTCAGGTAGAGCCAGGGCCGAGGTGGGGATGCCAAGGGCCTATGTATAT
-+
-671777888888888888888888767765454/3232000/../--+,,+++**))*(((')(&&'%$%%$%%$%
- at 30BB2AAXX080903:3:50:53:145#0
-GGTGAGCATTTCCGGTTCCCCTGCTGTGCTTTGCTGCGTTGTTCTCTCCTGCTGCAACGTTCAGATCNGTCACACG
-+
-67777788888888888888888877776555443222100//..---,,+++*****)(*))((('"$"#"###"
- at 30BB2AAXX080903:3:59:1267:943#0
-GAGCATGGGGCTGTGCGGCGTCCCCTCCCTGGCGCCCACCTGTGCCCTGCACACTGGCCTGCACTGTCATCACACA
-+
-67707788888888888888888877776555443232100/..----,,+++**))()()'''('%"""###$$#
- at 30BB2AAXX080903:3:41:486:1918#0
-GGAGGCAGGCATGGAGCCTTGGAGGAACCACTCCTCCCCAGCCGCCACCAACATTTGTGGCACCGAGAAGCACATC
-+
-677777888188888848888808777754/51/32/-00/-.--+,++++))**)('()%('&(''%"$$$#""#
- at 30BB2AAXX080903:3:57:1025:1228#0
-GGAATTCTGCCCTAGCTGATGGCTTCTCCGAGGCCTAGGCCCAAATCCACACCTGCTGTTTAGCCCAGAGCGTGCC
-+
-677777888888888888888888777765454532221/.././-,,,,+**++***(()(('&''&""$"#"##
- at 30BB2AAXX080903:3:54:1538:1826#0
-GGAGTCAGCCCCCTGCCCACGCCACCAGGCTCACGTTCAGGGCCCTGGCTGGAGAAACCTGAGCTGACACACTGAG
-+
-6777778888888888888887187777:45083520-20//,,-.,,+,,+**&))'(((((%%&&$$%&"""#"
- at 30BB2AAXX080903:3:35:998:167#0
-GAACAGAAGCGGAACAGCCTAATGCTAATGTTTGGGAAGAAGAGAACAGTGATCCCCCTGGTTACCCNACCACCNN
-+
-677777888888888888884888777765554422121/0//.-.--,$+,+**')*())#'(('%""$#$##""
- at 30BB2AAXX080903:3:50:1195:1750#0
-CCTCTGTCTTCACGAGAGCTACTTTTTTAGTAGGTGGGAGAGAACATTCAATGTTTGTCTTTAGATCGGTAGTCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('(%""#"$"##"
- at 30BB2AAXX080903:3:35:1436:929#0
-CGAGTAGCTGGGATTTATAGGTGCGCACCACCACGCCCAGCTAATTTTTTGTATTTTAGTAGAGACGNCGCATCCN
-+
-6777778888888888888888887777655544301110/0---.-,,,++++**)*))))((((&"$"$####"
- at 30BB2AAXX080903:3:33:1435:1262#0
-CCTCAGGAAATCAATGTCATGCTGACATCACTCTAGATCTAAAAGTTGGGTTCTTGGACCAGGTGTGNCCACAGNN
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('(&""%#$$"""
- at 30BB2AAXX080903:3:42:1588:115#0
-GCTGCTTCCTGGAGGAAGACAGTCCCTCTGTCCCTCTGTCTCTGCCCACCAGAGATCGGAAGGGCGGGTGGTGGCC
-+
-677777888888888888888818782707.344'2,-0.,/+-,,$'+,*)'('#(#)#&'#&#'%$""""#"#"
- at 30BB2AAXX080903:3:47:309:1172#0
-CTGGGTCAGAGTCAGAGCCAGAAGTATGGTTAGAGGGGGGGTCATGGTCAGGGTCGAGATCAAAGTCGGGGGACTG
-+
-677777888888888888888888777765554232$2100./-.--,,,+++***)))%()(((##$""$$""#%
- at 30BB2AAXX080903:3:8:1315:1812#0
-ATGCCTCCTCAGGAGATCCTGACAACATGGGCCCAAGGTGGTCGGGGCACCGCTTGGTTTTATAAGANCTCGTGNN
-+
-67777788888888888888888877776555343,21&01*..-.-,++&,)&***&)&(((((''"%"&#$#""
- at 30BB2AAXX080903:3:42:1167:659#0
-AATGGTTTCATTCTTTTGCATTGCTGATTACCCTCTCCACGTGAGGCAATCAGGTATGCATTTATCTCGCTCTGTA
-+
-67777788888888888888888877776555443222100./..-,,-,,++**)*)*(())(((('&"$$"""#
- at 30BB2AAXX080903:3:45:1662:1554#0
-ACGATGGTTTGGATGTGGTTTGTCCCCACAAAAACTCATGTTGAAATTTGACTCCCACTGTGTAGATCGGGGGCAA
-+
-6777778888888888888888887777655544322210///..---,,-++***))))(())(('%$""""$""
- at 30BB2AAXX080903:3:50:1530:1673#0
-CTGTGGTCCCAGGTAATCAGGAGGCTGAGGAGGGAGGATCGTTTGCACCCAGGAGGTAGAGGTTGCAGCCGACTGC
-+
-677777888888888888888888777765554432221/0//...-,-,+++***()))))(('%&"$#""#""#
- at 30BB2AAXX080903:3:38:1262:1788#0
-CAGTGAACACAAGCGTGTTGTTTTCTTCTATCTTCTTCACGCCGACTCAGTGGTCAGCGGAAACTTGATGATGATC
-+
-67777788888888888888888877776555443222100/0..---,,+++*+*))))(((((('$&%##"""#
- at 30BB2AAXX080903:3:3:267:1855#0
-CTGTAGCTCAAGAGAGGATGTAGCTGCCCCCACCCCGCATCCCCGGGCGCGGGTTTGCCTTGCTGACCNCTCNNAG
-+
-677777888888888880882188.77;6.502422,1&'-...+'++$,+*+$'))#(%'((((%'$""#"""#"
- at 30BB2AAXX080903:3:39:376:911#0
-AAAATGAGTCATTGCAAGGATGACAAAGACGCTCTCCTTGACCAAACTCCATTCAGGCTCCTTTGAGCCTTCTCAT
-+
-6777778888888888888888887777655544322210/0/..---,-,,+++*)**)(((((''&%"&%%%""
- at 30BB2AAXX080903:3:58:356:910#0
-ACAGCTCACAGCAGCCTCAAACTCCTAGGCTCAAAGGATCCTCCCACCTCAGCCTCCTGCGTAGTTGAGATCACNA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((&'$""&"#""
- at 30BB2AAXX080903:3:52:238:333#0
-AAGGATCCTCCCACCTCAGCCTCCTGCGTAGTTGGGACTACAGGTGTGTGCCACTGCACCAAATAATCTGTGTAAA
-+
-677777888888888888888888*777655144322210/*..+---&,++****)))('(('(&'"""""""##
- at 30BB2AAXX080903:3:44:175:741#0
-GATTAATTGTTTGCTATTGTTTGAGCTCCTGGTTATGAATCACTTGTCAGGTGGGTAGCGTGCAAAGATNANTAAC
-+
-67777788888888888888888877776555,43222100*-..-,*,,+)+**)*)()((((('&$'"""""""
- at 30BB2AAXX080903:3:42:1035:180#0
-GTTTCTCTGATGATTAGTGATGTTGAGCATTTTTTCATGTACCTGCTGGCCATTTGTACATCTTTTGAGTGTTATT
-+
-67777788888888888888888877776555443222100//..---,,+*+*****)())((((''$""""""#
- at 30BB2AAXX080903:3:40:463:919#0
-AGGCAGGGGAATCGCTTAAACACAGGAACCCGGGAGGCAGAGGTTGCAGTGAGCCAAGATCACACCACTGCACCCA
-+
-67777788888888888888888877776555443221000//.,--,,(+++)*)*)()))(((''"&&&#$"""
- at 30BB2AAXX080903:3:4:18:454#0
-TGAGTTCATCAGCGGATGATGGATAAACAGAACGTGGTGTGTATACACAGTGGAATATTCTTCAGCCANGACANTN
-+
-67777788888888888888888877776555443222100//...-,-,++++***))()(((((#""""$""#"
- at 30BB2AAXX080903:3:43:128:589#0
-ATGGCGTGAACCCGGGAGGCGGAGCTTGCAGTGAGCCGAGATCCCGCCACTGCACTCCAGCCAGATCGGACGCCCG
-+
-67777788888888888888888877776555443222200//..---,,+++*+*)))))((((('&&#""###"
- at 30BB2AAXX080903:3:45:1526:694#0
-CTGCTGGTAGCAGAGCCTCAGTTCCTCTCCTGCGTTCTTTCGCTACAGGTGTTAGACCTCCAGATCGGGCGTGCGC
-+
-67777788888888888888888877776555442222100//..---,,+++*****))))(((('$$#%"$#""
- at 30BB2AAXX080903:3:54:1479:90#0
-AGCTGGATAGGTTGCCTTTGGCCCACATGGAGTCAGCCCCCTGCCCACGCCACCAGGCTCACGTTCACACATGCTA
-+
-67777788888888888888888877776555443232100//-/.--,-,+*)***)(())('(('&$&$""#""
- at 30BB2AAXX080903:3:39:999:1933#0
-ACGGTGGGACTGGGCTAGGGAGACAGGCAGGCTGGCCTACCCACTGAAGGAGCCAGTCTGCTTTCACCTATCTCTC
-+
-67777788888888888888888877736550143+-/0(...+--,,,,++#(()'&()''(#'&#%$&#&#%$#
- at 30BB2AAXX080903:3:47:319:1003#0
-CTGAAGGAGCCAGTCTGCTTCCACCTAGTCAGCAGCTCCAGGGAGCGCATCTCCCTCAGATCGGAAGGACACCTGT
-+
-67777788888888888888888877776555443222100//-.---,,+++**+*)))))(((''$"#"#"###
- at 30BB2AAXX080903:3:40:597:1510#0
-TGGGGCTGTGCGGCGTCCCCTCCCTGGCGCCCACCTGTGCCCTGCACACTGGCCTGCACTGTGGTGATCTCGCTGA
-+
-67777788888888888888888877776565412221100/...,,-,-+++***)()()()('''$"$%%$$""
- at 30BB2AAXX080903:3:45:825:1815#0
-TGGCCTGCACTGTGGTGATCTCGCTTGGCCCCCACCTGATTCCTGACATACAGCAGAGGAAGCTTAGGCTCAGGGG
-+
-67777788888888888888888877776555443222110+/...--,,+,++***))(()'&('%&$###&#"#
- at 30BB2AAXX080903:3:47:553:318#0
-AGTTAAGGGACTGTGGCCCTGTGTAATGCCAGGCAGTGACAAGGACTGTGACTGGGAGCCATCGTAACGCGCATGC
-+
-677777888888888888888888767765554412/21////..----,-,+***)))()'((#''"%%#%"#""
- at 30BB2AAXX080903:3:36:565:943#0
-AGTGTGTGTATGATCTGGGTATGAGTGATTGTGAATGTGAGCATGTGTGCACGAGTGTGTATATGATCACTGGTAN
-+
-67777788888888888888888877776555443222100//..---,,,,+***))))))(('('%$%#"""#"
- at 30BB2AAXX080903:3:36:1383:1270#0
-GTGCACACATTCACACTCATACACACCCAAATCATACTCACATTCATGCACACATGTAGATCGGAAGCTCTCTCTN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('$#&##"$#"
- at 30BB2AAXX080903:3:51:918:1442#0
-ATATGATCTGGGTGTGTATGAGTGAGCATGAGTGTGAACATGTGTGCATGAATGTGAGTATGATTTGGGTTCCTCT
-+
-67777788888888888888888877776555443222100//..---,,+++****))))()('''&$#""#"#"
- at 30BB2AAXX080903:3:2:301:814#0
-ACCCAAATCATACTCACATTCATGCACACATGTTCACATTCATGCTCACTCATACACACCCAGATCAANCTANNAC
-+
-610047888488888.+88)5811./151/45&,/0)*1/,++++-,*++))*)*)(()#&'&&''%$"###""##
- at 30BB2AAXX080903:3:53:1469:791#0
-GTGTATATATGATCTGGGTGTGTATGAGTGAGCATGAATGTGAACATGTGTGCATGAATGTGAGTATCACTTGTCG
-+
-67777788888888888888888877776555443222100//..---,,++++**)*)))((('(''$%&%$%#$
- at 30BB2AAXX080903:3:43:133:755#0
-CAGCTTCCTCTCACTTGAGCATCTTACACGCAATGAGGCACGTGTAGAAACTGCGACACTCACAAGATCGGAACAG
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((('&'"&#"""#"
- at 30BB2AAXX080903:3:37:615:904#0
-GACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGGGTGGCGCTNCATN
-+
-67777788888888888888888*7)7065554832(220/*,,--,,+,+++**)*('(''#(#'#&$##"%#""
- at 30BB2AAXX080903:3:53:900:830#0
-GGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCAAGATCCTG
-+
-67777788888888888888888877776555443222100//..---,,*+++***)*)))(('%%&#$"#"""$
- at 30BB2AAXX080903:3:48:1673:47#0
-CCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGCTTCGCCACCCCGAGCGGCCGCGACTACAGCC
-+
-243772-0/02/828888,25+0//*/0)'*,$3",#*%(&-',%$",$&($#&###('########""#"%#"##
- at 30BB2AAXX080903:3:44:866:942#0
-TGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGGGGGCG
-+
-677777888888888888888883784765554410.010//*..-,+,(+,)+**)*('('((('#'"$""""""
- at 30BB2AAXX080903:3:50:442:106#0
-TCCACACCGTGAGCTGCTGAGACGGCACACCAACGAGAGTCGCAGATTCCACACCGTGAGCTGCTGCGACTACCGT
-+
-67777788828888888888888877776$'534322-1//1/,.$-,+,++***))(()'#((#'#$$#$"##"#
- at 30BB2AAXX080903:3:8:907:898#0
-AGTTTCCACACCGTGAGCTGATGAGACGGCACCCGCGTGAGGGTCGCAGTTTCCACACCGTGCGCTGNGTCCACNN
-+
-67177788888888888888'88877676555833021200#/,,.,)-++**))))(()'(#((&&""#$""%""
- at 30BB2AAXX080903:3:40:998:1656#0
-AGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGCACC
-+
-67777788888888888888888877776555443222100//.---,,,++***)*)()()(((('&&$#"""##
- at 30BB2AAXX080903:3:40:393:1821#0
-TGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACAGATCGGAAGAGCGGCTCCG
-+
-677777888888888888888888777765554423221/1//.----,-,++***))))')('(''$""%$""#"
- at 30BB2AAXX080903:3:2:734:1657#0
-CGCGTGTGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGCGTGTCGCAGGTTCCNCACCCGT
-+
-677777888888882888888028774-6/2121201-0-/...-,*-,++$+$*%)#('&''####""$""##""
- at 30BB2AAXX080903:3:54:953:26#0
-GCACCCGCGTGAGTGTTGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGCGAGTGTCGCCGTGTCCACA
-+
-67777788888888888888888877776555-4022210//..-.-,,,+++)*)#)))#(#'(&#"$"%#$###
- at 30BB2AAXX080903:3:51:1273:825#0
-CTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGCGACACTCTCG
-+
-67777788888888888888888877776555413022100//.---,+,+*++)*)**))(((('("%""$%"#"
- at 30BB2AAXX080903:3:51:541:612#0
-AGCTCACGGTGTGGAAACTGCGACACTCACGCGGGTGCCGTCTCAGCAGCTCACGGTGTGGAAACTGGCAACANAC
-+
-67777788888388888888888877776555443121000//..--,,,+**)**')())((((&'$%#"%"""#
- at 30BB2AAXX080903:3:2:725:1428#0
-CGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGCGTGAGTGTCGCAGTTTAGATCGGAAGAGCNTCATACC
-+
-67777785883888888888730731-1054.1-1..0+/#.)-',&*+&&*#$)&&&#''&#&'#'""""""%##
- at 30BB2AAXX080903:3:48:155:835#0
-CGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACAGATCGGAAGAGCGGTTCANACGAGTGT
-+
-67777788888888888888888877776755241222010./.--,+,,+**+**)*)*'()#(%%"""#"""""
- at 30BB2AAXX080903:3:2:99:643#0
-CACCGTGAGCTGCTGAGACGGCACCCGTGTGAGTGTCGCAGTTTCCACACGGTGGGGTGCGGGGGTGCNCGCNNAC
-+
-677777888888888888888888777-65514230022/0/0-'+++-+&+*)&*#')##(&(&#'&"#"&""#"
- at 30BB2AAXX080903:3:37:109:865#0
-CACACCGTGAGCTGCTGAGACGGCACCCGTGTGAGTGTCGCAGTTTCCACACCGTGAGCTGCTGAGAGNGGNTCAN
-+
-67777788888888888888888873776555443222001//-.-+-+,+(+***)))()(()&(%""$"""#$"
- at 30BB2AAXX080903:3:41:987:437#0
-GTGTCGCAGTTTCCACACCGTGAGCTGCTGAGACGGCACCCGTGTGAGGGGCGAAGGTTCCCCACCGCGGCAGCTC
-+
-67777788888/8888888858887377654524321,.0/*%*%,,,+,$$%&)'####%'(&(&'&$"##$%#"
- at 30BB2AAXX080903:3:46:579:1731#0
-GGAGGCGTGAGGGCCAGTGCAGCCTGGGGTCCTGTACGTGAGCTGCTGAGACGGCACCCGCGTGAGTGCGAGTGAC
-+
-67777788888888888888888877776305443202100/+..,--+,+%+*')('()')%)&(''##"""""#
- at 30BB2AAXX080903:3:37:27:27#0
-CTGTCAAGGCAGTGAAGCGAAGACAGGCCAGGAAAGGGTCACAGGTGCAGGGGACTAAGGAGGCGTGCGTCACANN
-+
-677777.8888888888888888847776/55433222//0.+..--+,,,,++*))(()&))((#'%""%#$#""
- at 30BB2AAXX080903:3:39:187:1638#0
-AGAGTGCTGCTCAGGTATTCTGCAAGACGCCCCTCAATTGGTGTGTGTGTGATGTTCTCAGATCGGACGGNACAGT
-+
-67777788888888888888888877776555443222100//..---,,+,+****)))))(((''"&#"%%$""
- at 30BB2AAXX080903:3:59:18:1625#0
-TGTGTGGGCAGCATGGATCTTCTTCCGCGGTGACCCTGTGTGCCCACCCCCGCCAACTTATGCCTGCTTCACANNT
-+
-67777788888888888888888877776555143222100/.----,,,,,+*'**))())'(((&&%&"%$""#
- at 30BB2AAXX080903:3:34:1322:491#0
-GTGCACAGCCTATGTGCATGGTGGAAGCTCTGCAGAGGCCGTTCCGCTCCAGAGTGGGGCATAGCCTNACTAGTNN
-+
-62777788888888888888888877776555443122100#..%.-(--*+**&*)))))'((''%"$"$##$""
- at 30BB2AAXX080903:3:34:810:842#0
-CGACAGCTGCAGAGGGAGGCAGGGAGGCTGGCTGGGCGTGGACAGCTGCAGAGGGGGGCAGGGGAGGNGTGAACNN
-+
-677777888888888888888888777765551432/00/0/.-.,,-++-)++*'**)()((('('""""""$""
- at 30BB2AAXX080903:3:38:1630:1572#0
-AGGCCTCACTTCAGACCATAAACACCCTCCCTGTGTGGGATAGAAACACACATCGTCACAGCCAGGAGCACTGCTN
-+
-677777888888888888888888777765554432221/0//..-.-,,+++***)))))((((('$$"$""#""
- at 30BB2AAXX080903:3:45:505:1811#0
-CACAGGGAGAGCTGCCGGGGCTGGGTGGGGGAGCGTGACTGTGAACGGAGTTCTGGGGGTGATGTAACTGGTCTGT
-+
-677777888888888888888888777765534532222001/.-+--*,(,****)))')(((''&"%%"###$"
- at 30BB2AAXX080903:3:45:594:1146#0
-CACCGACTTGGTGCGGTGTGTGTGACAGACCAGCGAAGCGGGTCTTGCTGCCTGTCCTGTGGTTGGTCCACTGCAG
-+
-67777788888888888888888877776555433222100/)+-.-,,,+++*)#*))(((''((#%""#$$$#"
- at 30BB2AAXX080903:3:33:1094:855#0
-CAGGCAGGCAGCCCCGAACAGTGCACTCCAACATGGGATAGTGAGCCAGCTTGGGGGACAGCAAGACNGGACGANN
-+
-677777888888888888888288774065+231322010/1/...,+,-++++*)**)((''(('#""""#""""
- at 30BB2AAXX080903:3:3:1254:1767#0
-CTGGGCATCTCCTCTCCTGCAGCGCCGCCTGCTGGCCACAGAGAACCCGCGTGAGATCGGAAGAGCGGNCCTCNAC
-+
-6777778888888888888888887777645544322,/////,.--,-,+'+**)())()'('(&'""#""$"##
- at 30BB2AAXX080903:3:51:1375:2001#0
-CCTGCTGGCCACAGAGAACCCGCGTGCGCCGGCCGCCAGGCCTGGGCATCTCCTCTCCTGCAGCGCAGGGCGNCGC
-+
-67777788888888888888788877776555-42'32.0.-,--.+++++)*))&#'('&#(#'%#%""%$""#"
- at 30BB2AAXX080903:3:59:1403:192#0
-TCATGCCTGCTTCATGGGGGAGACGTGGAGGACAGGTCAGACGCAGAGCCCGGGGCACACGCCGCAGCACAACNNC
-+
-677777888888888888*888887'776350-432/010)//..-,-,%*++**()*)()'(((%&&%$&#%""#
- at 30BB2AAXX080903:3:35:718:1977#0
-TCTTCCGTCCACCAGGCCAGGGATGCGCGCAGAGTAAGGATGTGTGTGTCTACGCATGTGGGGGTGTNGTCCTGCN
-+
-6777778888888888888888887775655514+1201.0/+.----+,+,++**))))))))'(%"""#$""#"
- at 30BB2AAXX080903:3:4:997:1183#0
-CCACCAGGCCAGGGATGCGCGCAGAGTAAGGATGTGTGTGTCTACGCATGTGGGGGTGTGGGGGTGACNGTGCNTN
-+
-67777788888888.8888888887753655144321200...--.-,,,*++++*#*#)))#('(%$""""#"""
- at 30BB2AAXX080903:3:50:554:1511#0
-GTGTGGGTGTGACAGGGTGTGTTCTGTGTGAGAACATGTGTGTAGTGTCCACATGTCCTCTGTGCGTGTGCCGCCG
-+
-67777788888888888888888877776555442222100//..---,,+++**)))))))(('('&##$#"###
- at 30BB2AAXX080903:3:37:314:1556#0
-TCACACCGAGAACACAACATCACACACAGGGACTCACGCACAGAGGACATGTGGACACTACACACAACATCTCCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()('&&$$#"##$"
- at 30BB2AAXX080903:3:50:1424:930#0
-TGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTGATGTTGTGTTCTCGGTGTGAGCACCTACTG
-+
-67777788888888888888888877776555443222100//..-.-,,+++****)))))()''&$"$$"#$""
- at 30BB2AAXX080903:3:47:385:1782#0
-GTGTGAGTTCATGGGTGTGATGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGCACGCG
-+
-6777778888888888888888887777655244322200/0/.----,,++++**&)))))(('''&$"$"#"#"
- at 30BB2AAXX080903:3:41:701:63#0
-CGAGAACACAACATCACACACGGGGACTCACGCACAGAGGACATGTGAACACTACACACACGTTCTCACACAACAC
-+
-677777888888888888888888777765554432221010...+-*,,,++*****))()&'(''&$#$$"##$
- at 30BB2AAXX080903:3:44:1232:736#0
-GTGTGACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCGGTGTGGG
-+
-677777888888888888888888/7776555443222100//..---,,+++***))(('(((%&''"%$%##""
- at 30BB2AAXX080903:3:56:264:557#0
-CACACACGGGGACTCACGCACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACCACGTCGTAG
-+
-67772788818088880882888877776/5,443',11'/-/,,-,++*)$+*(')(*#&#''(%'$%#"&&$$#
- at 30BB2AAXX080903:3:60:1110:1003#0
-GACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTATGTGCGTGAGTCCCCGTGTGCACANN
-+
-67777784888888888888888877776555443222100./..--,,&+++*)**))))((('('$$%%"##""
- at 30BB2AAXX080903:3:41:1071:1007#0
-CTACACACACGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACATAC
-+
-67777788888888888888888877776555413222100/..,-----,,++***)))*)((((''&%&&#"#"
- at 30BB2AAXX080903:3:42:1509:1682#0
-AGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACGNCGCAG
-+
-67777788888888888888888877776555443022100./...-,-+,,++**)(()('(((''&$""""#""
- at 30BB2AAXX080903:3:4:343:1643#0
-GAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTGATGTTTTGTTCTCGTNTAGANCN
-+
-6777778888888888888808887757)555443221100-..---,,,+*+***)*)()))((('""#""#"""
- at 30BB2AAXX080903:3:41:1295:1796#0
-CCTCTGTGCGTGAGTCCCTGTGTGTGATGTTTTGTTCTCGGTGTGAGTTCATGGGTGTGACGGGGTGTGCCGCACC
-+
-67777708888888888888880877176252443222100./+.--,,,++++*))())')()(#'"""#"###"
- at 30BB2AAXX080903:3:46:628:592#0
-CGTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACACGGGTCCTGAGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))(((('''"#"#"""#
- at 30BB2AAXX080903:3:60:1375:1490#0
-TCCCCGTGTGTGATGTTGTGTTCTCGGTGTGAGTTCATGGTTGTGACGGGGTGTGTGCTGTGTGAGAACAACAANN
-+
-6777778888888888888888887777655/44322210,./..-,--,+)+**)))(('('('(%'&%%%##""
- at 30BB2AAXX080903:3:44:284:1267#0
-GACGGGGTGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCCGTGTGTGATGT
-+
-67777788888888888888888877776555443222100//,.--,,,+++****))))((((''&%%"%""""
- at 30BB2AAXX080903:3:59:1463:967#0
-TCACACACGGGGACTCACGCACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACACACAACANCA
-+
-677777888888888888888888777765554433220000//-,--,,+,++***))))))((''$$&%$$"$$
- at 30BB2AAXX080903:3:58:1620:382#0
-TGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCCGTGTGTGAACATCACAAN
-+
-6777778888888888888888887777655544322210///..---,,+++**+)))))(((''%$$"&%$%$"
- at 30BB2AAXX080903:3:58:525:892#0
-GTTCTCACACAGCACACACCCCGTCACACCCATGAACTCACACCGAGAACACAACATCACACACGGGGAGTCGCTC
-+
-67777788888888888888888877776555443222100//...-+,-+++***)*))))()''''$#&&#$#$
- at 30BB2AAXX080903:3:33:1649:1030#0
-TGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCATGAGTCCCTGTGTGTGATGTTGTGTNTACCACNN
-+
-67777788888888888888888877776555443222000//..---+,,++****)())((((''"###$$#""
- at 30BB2AAXX080903:3:33:662:1042#0
-CACAGAGGACATGTGGACACTACACACACGTTCTCACACAGCACACCCCGTCACACCCATGAACTCANCCATACNN
-+
-67777788888888888888888877776555443222100//-..+,,,*++***()((('(('''"%#"###""
- at 30BB2AAXX080903:3:33:375:891#0
-GTTCATGGGTGTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGGNATTACGNN
-+
-67777788828888888888888877776555443222100//..--,,-,++****)))))((''%""""#$"""
- at 30BB2AAXX080903:3:59:152:733#0
-GTGACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTCCACATGTCCTCTGTGCGTGAGTCCCTGTATGTCGNNC
-+
-67777788888888888888888877776555443222100//...--,,,++*+**)()'))(((''"&##"""#
- at 30BB2AAXX080903:3:41:1140:527#0
-GCACAGAGGACATGTGAACACTACACACACGTTCTCACACAGCACACCCCGCCACACCCATGAACTCACACTCCTA
-+
-67777788888888888888888877776553443222100//..----,,&++**)))(()(((%(%%#&###$"
- at 30BB2AAXX080903:3:47:590:752#0
-GACGGGGTGTGCTGTGTGAGAACGTGTGTGTAGTGTTCACATGTCCTCTGTGCGTGAGTCCCTGTGTGTTCGTGTG
-+
-677777888888888888888888'7776555443222100./.,.-,,,+++*)*)**))'(((('%"#$"""""
- at 30BB2AAXX080903:3:49:318:370#0
-TGGAAGGCCCTGAGCACAGGAGTTGATTGCTAGCTGCTAAGAGGCTGCGCTTTGTTCCTGAAGGAGAACGTCTCAG
-+
-67777788888888888888888877776555443222100//./--,-,+*++**()))((((((($%""$"##"
- at 30BB2AAXX080903:3:60:738:1265#0
-TAATTCTCCCTTCCACCGGGGGAAGGGCTGGGTCTCAGGAAAGGTCTAAGAGACACACAGTGCCGGGAGCACTANN
-+
-6777778888888888888888887777'355443,22100-/.,,--',&++**)))))'(('(((&"#"#"#""
- at 30BB2AAXX080903:3:53:1319:1606#0
-AGACACGACTTTTCATGGGCCTCTTCCTTTCTCCCCACCGGTAAATCACCACCCTTCAAAAGATCGGCTGCATCTC
-+
-67777788888888888883888877(765)5311112000-/..-*-++++*)*+*)())))('('$"""""#""
- at 30BB2AAXX080903:3:43:563:397#0
-TCTGATTAGGGCATTTCATCCTTCTCTGAAATGCAGCTGAGAACTGGTCAGCCTCACTCCAGATCGGANGAAGCGA
-+
-67777788888888888888888877776555443222100./..--,-,+*+++***))))((((('"$""""""
- at 30BB2AAXX080903:3:38:1752:1355#0
-TGGTAGGGGCTGGGGACAAAGTGTGGATGGGGAGCCTGCTGGACCTGTGGGGCGAGCAACTGGGGTGACTGTTGNN
-+
-67727788888888888&8$8888777&6555.(/('2010//.)---,,*+#)**)&(&)())'#'"$"#%$#""
- at 30BB2AAXX080903:3:40:652:147#0
-ACAACCACAGGAACTGAATTCTACTGACAACCAGTGAGCTTGCAAAGAGGACTTGGAGCCCCAGATGCGAGAGNGC
-+
-677777888888888888888888777765554432221&//..---,,,,,++***))(()(((''"%#""$"##
- at 30BB2AAXX080903:3:48:361:1555#0
-TAAAAATTATTTTTCAAAATGTTTCTGCCCTACCTTCCGTGAGCATCTGGTGATGGAAGATCGGAAGGGGGGGCGC
-+
-67777788888888888888888877776555443222100//..---,,-+++****)))((((''%""#""#"#
- at 30BB2AAXX080903:3:35:188:1526#0
-TTAGAGCTGGTGTCTTGCTCTGTTGCCCAAGTTTGAGTGCAATGGCTCAATCACAGCTTCACTGCAGNCACTTCAN
-+
-677777888888888888888888777765554432221001/..---,,+++****))))))((('"%"&""$""
- at 30BB2AAXX080903:3:48:1246:1576#0
-GGAATAGAGTTTGTCACTTGGGCTGTACTGACCCCAGTGGTGATGTCTTCCCTTTGATGGGTGGTGAGTGACTACG
-+
-6777778888888888888888887777655544322110.//...---,+,+**))))))')(''%""$#"""""
- at 30BB2AAXX080903:3:3:1726:204#0
-CTGGAATGTAAACTCCCTGAAAGCAAGGACTTGGCTTATTGCTGTATCCCAAGAGCCTGACACAGTGCNCGCGNCN
-+
-67777788888888888888888877776355442222100./..--,+,+,++*)'*))()%((&'&"#$$#"#"
- at 30BB2AAXX080903:3:3:1032:917#0
-TGAAATAGCAATTGATTTTCAGACATGAGTTGATAGAACCATGATTTTCTAATACTGTTCCAAAGAGCNGAACNCA
-+
-67777788888888888888888877776555443222000//..----,,++***)))))('(((&%""%##"%$
- at 30BB2AAXX080903:3:37:1109:523#0
-GGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGGCCCCTTCGCCCTATTCTTCATAGCCCGCTCN
-+
-67777788888888888888888877776555443222100/..-.--,+,++****()()(()(('"$$""#"#"
- at 30BB2AAXX080903:3:43:1168:765#0
-CTGTTCTTATGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATAGATCGGAAGAGCGGTTGCGCGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))()()'('$$"""%"""
- at 30BB2AAXX080903:3:46:1727:250#0
-TGAATTCGAACAGCATACCCCCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTCCCATTCC
-+
-67777788888888888888888877776555443222100//-.---,,+*++**))))(((((''$$#""#"$"
- at 30BB2AAXX080903:3:53:206:374#0
-GATTCCGCTACGACAAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCAGATCGGAAGAGCGGACCTA
-+
-67777788888888(88888888877776555443222100//..---,,+++***)))))((('((&$%"""#""
- at 30BB2AAXX080903:3:58:60:90#0
-GACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCTAGCATTACTTATATGATATGTCNCACNNT
-+
-67777788888888888888888877776555443222100//.---,,,+,*****))))((((('&&"%"%"""
- at 30BB2AAXX080903:3:49:416:142#0
-GCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGGTAGGAAGTTTTGCTCTAGC
-+
-67777788888888888888888877756555443222101./..---,,+++***)()))%))(%'"""""$#""
- at 30BB2AAXX080903:3:3:1196:818#0
-GAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGGTNCTCCNCA
-+
-67777788888888888888888877772555443212100//..---,,,++***))))(((('''&"#&"$"#"
- at 30BB2AAXX080903:3:36:1464:1271#0
-TGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACATATCATATAAGTAATGCTAGGGTGAGTGTGAGTCCNN
-+
-67777788888888888888884877776345443221000.+-----+,*,++*))))))&('(#'"$""###""
- at 30BB2AAXX080903:3:36:1645:827#0
-GTTTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAGACAGATCATATAAGTAATGCTAGGGTGCATAGCATNN
-+
-677777888888888888888888777765553/32221-,.#.-.--+,,*+)*))*(''(((#(%""""##"""
- at 30BB2AAXX080903:3:54:1525:1479#0
-CAGACATATTTCTTAGTTTTGAGGGGGAATGCTGGAGAGTGTAATGTGTATGGAGAAATATCATATAACACTACCA
-+
-&7777788888888888888882877776555443222+00//,.-,,+,+++**(#))))')((((&$%##"###
- at 30BB2AAXX080903:3:38:1701:185#0
-CTTTTATCAGACATATTTCTTAGGTTTGAGGGGGAATGCTGGAGATTGTAATGGGTATGGAAGATCGGCAGATCNN
-+
-677777888888888888888888777765554432221/0//.------,++**))*))))(((('""$%""#""
- at 30BB2AAXX080903:3:4:1719:1723#0
-CATTACAATCTCCAGCATTCCCCCTCAAACCTAAGAAAGATGTCTGATAAAAGAGACACTGTGATAGANGTATNAN
-+
--777778888888888888886886777655'443112001/./,-+,,++++***#*))#'('('%%""""""""
- at 30BB2AAXX080903:3:1:319:1608#0
-AATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCAGATCGGAAGAGCGTNCCNCTCT
-+
-6777778888888%88888888887717655544302.201/)./---+,-++)*)))))'(()('&"""$"##""
- at 30BB2AAXX080903:3:60:1219:1146#0
-TATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATATTTAAANN
-+
-67777788888888888888888877776555443222100//...--,,+++*+*)))))()(((&$$$"%##""
- at 30BB2AAXX080903:3:43:600:1777#0
-GGTATGGGCCCGATAGCTTATTTAGCTGACCTTACTTTAGGATGGGGTGTGATAGGTGGCACGGAGAATTTTAGAT
-+
-67777788888888888888888877776555443222100//..---,-+,+***))))))((''''&&'&#%#$
- at 30BB2AAXX080903:3:45:862:1238#0
-TCACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATCCCCTTC
-+
-67777788888888888888888877776555443202100//.----,,,+++*)))())((((('$""$%%##%
- at 30BB2AAXX080903:3:34:216:1110#0
-CACACCCCATCCTAAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTAGNCTCGACNN
-+
-67777788888888888888888877776555443222100//..---,,,,+****))))(((('&"$#$$#"""
- at 30BB2AAXX080903:3:38:1100:1656#0
-GAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGGGAAGGCTATAACAC
-+
-67777788888888888888888877776555443232100//..---,,++****)*)))((((''"%#$%"%#$
- at 30BB2AAXX080903:3:41:205:986#0
-GATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGATCGGAANAGCGTGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&"&%$%#"""
- at 30BB2AAXX080903:3:38:1018:1051#0
-TGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGGATTAATTAGTACGAGTGCCTAC
-+
-60777788888888888888888877776555443222100/-/.----,+++**))))))((((('"%&%%%%$#
- at 30BB2AAXX080903:3:43:691:803#0
-TGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGAGATCGGAAGAGCGGTTCAGCAG
-+
-67777788888888888888888877776455443222100/...----,+++*****))))(((''$$%&$%$#%
- at 30BB2AAXX080903:3:59:56:1905#0
-GCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGACGGGTTGGGCCAGGGAGATCGGGCCANNC
-+
-6777778888888888888888887777055344322210/////--,,,+++*+*((()))&)'(&&%####""#
- at 30BB2AAXX080903:3:47:868:1806#0
-TACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCCCACCCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))((('('$%""#$#$"
- at 30BB2AAXX080903:3:48:547:1179#0
-TACTAATTAATCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTACGCTG
-+
-677777888888888888888888777765554432221////..---,,+++*****)*)))((('&&%$#""""
- at 30BB2AAXX080903:3:38:778:253#0
-TCCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTCATNC
-+
-6777778888888888888888887777655544322210///..--+,,+++****))()(()((''%&$"#%"#
- at 30BB2AAXX080903:3:3:1487:1529#0
-CCCCTGGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCAGATCGGAAGAGNCAGCNAN
-+
-6777778888888888888888287777634384102101..*,,-,,,++++**))((&(((''&'""%""""""
- at 30BB2AAXX080903:3:58:1307:1845#0
-CCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTAGATCAACTN
-+
-67777788888888888888888877776555423222100/..-.-+,,+++****))))(()(''$$&%#"#""
- at 30BB2AAXX080903:3:54:1309:883#0
-CAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTGTACCTCAT
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))()(((&"#$%$%###
- at 30BB2AAXX080903:3:54:630:1038#0
-ACTCAGGTAAAAAATCAGTGCGAGCTTAGCGCTGTGATGAGTGTGCCTGCAAAGATGGTAGAGTAGATGTCGCTAC
-+
-67777788888888888888888877776)55443222100.//.--,,,,*++*)))(*))('(''"$"%&""#"
- at 30BB2AAXX080903:3:8:730:454#0
-ATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGAGNTCAGCTNN
-+
-67777788888888888888888877776555443020100-..--,,,,,++*****)))'')(''""#""$#""
- at 30BB2AAXX080903:3:50:979:723#0
-GGCACACTCATCACAGCGCTAAGCTCGCACTGAGTTTTTACCTGAGTAGGCCTAGAAATAAACAAGACCGGTCTGC
-+
-6777778888888888888888887777655524322110/0/..-,-,-++*+***))))((((''"#""""""#
- at 30BB2AAXX080903:3:8:1790:1920#0
-GCAAGCAACCGCATCCATAATCCTTCTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGANCCGCTCNN
-+
-67777788888888888888888877776555443222100///---,,,++++**)*)))))((('"$%%&&"""
- at 30BB2AAXX080903:3:35:1156:897#0
-AGGCCGGATGTCAGAGGGGTGCCTTGGGTAACTTCTGGGACTCAGAAGTGAAAGGGGGCTATTCCTANTTTCTACN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(()(''""#&$$$#"
- at 30BB2AAXX080903:3:46:195:1575#0
-ACTAGGAATAGCCCCCTTTCACTTCTGAGTCCCAGAAGTTACCCAAGGCACCCCTCTGACATCCGGCCAGCTCCAT
-+
-67777788888888888888888877776555443222100//..---,,+*+***)))))()(''('#%$"$%#%
- at 30BB2AAXX080903:3:47:1637:1579#0
-GGTGCTGGAGTTTAAGTTGAGTAGTAGGAATGCGGTAGTAGTTAGGATAATATAAATAGTTAAATTACTANTACGC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*))))))(('%""""####
- at 30BB2AAXX080903:3:45:1649:842#0
-TATCCTAACTACTACCGCATTCCTACTACTCAACTTAAAAACCAGCACCACGACCCCACTACTATCTGTGCACCAC
-+
-677777888888888888888888777746553,*2-21&&-/(-,,',++%+)))%()'%'#(&#'"%#%$##""
- at 30BB2AAXX080903:3:44:1381:808#0
-AGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGGAGGGTCGTCTG
-+
-677777888)888888888888887'71655+44522'101/-.+--,,,+'+)*()()(*'(('''&"#"#"#""
- at 30BB2AAXX080903:3:43:494:1042#0
-GAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTAGGGGTGCTG
-+
-67777788888888888888888877776555443222100./..----,+++***))*))((('&''&%#"#""#
- at 30BB2AAXX080903:3:56:1086:1031#0
-AGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGCGAGATAGTAGTGTTGCAC
-+
-67777788848888888888888877776555443222100//..---,,+++**))))))()('''$&$$""$##
- at 30BB2AAXX080903:3:48:570:1352#0
-GGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGTGTTAGTCATGTTAGCTTGTTTCAGGTGTGATAG
-+
-67777788888888888888888877+76555423220100/...---,,++++**)()*)())'(("$%""#"""
- at 30BB2AAXX080903:3:51:1009:751#0
-GCGGGGGCAGGCCTCCTAGGGAGAGGAGGGTGGATGGAATTAAGGGCGTTAGTCATGTTAGCTTGTTTCGAGATGC
-+
-6777778888888888888888887777650544322.100/...---,-+++***)))))()((''$$""##"#$
- at 30BB2AAXX080903:3:42:162:348#0
-CTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCCCTAGATCGGAAGAGCGCTCACACC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))((''(%"#""""""
- at 30BB2AAXX080903:3:56:1075:747#0
-GGCCCATTTGGGCAAAAAGCCGGTTAGCGGGGGCAGGCCTCCTAGGGAGAGGAGGGGGGATGGAATTGANGCGCTA
-+
-67777788888888888888888877776555443220100//,.--,,,+++***())(((('(('"$"&"""##
- at 30BB2AAXX080903:3:52:520:1754#0
-TCGTCGATAATGGCCCGTTGGGGCAAAAAGCCGGTTAGCGGGGGGAGGGCTTCTACGGAGCGGAGGGATAGCGGTG
-+
-6777778888888888/88888887777655-442200+00//.',--$+)&))*%))#)#((&(('""#"$#"""
- at 30BB2AAXX080903:3:1:1292:584#0
-TATCTAACAACGTAAAAATAAAATGACAGTTTGAACACACAAAACCCACCCCATTCCTCCCCACACTCNGTNCCAC
-+
-6777778888888888888888887747645344312-00//-.-,,,,))*+**)())(('(''&'$""$"%%$"
- at 30BB2AAXX080903:3:46:1289:1701#0
-AGAAATTTAGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTGTAACGCCA
-+
-67777788888888888888888877776555443222/11//..---,,++++****)))(((''''""#$#"""
- at 30BB2AAXX080903:3:41:720:1218#0
-AAAGTGGCTGATTTGCGTTCAGTTGATGCAGAGTGGGGTTTTGCAGTCCTTAGCTGTTACAGAAATTAAGTATTTC
-+
-67777788888888888888888877776559443222&00//,----,-+++***'*)())(((''&$%$"$"##
- at 30BB2AAXX080903:3:44:1581:1616#0
-TCTGTAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGC
-+
-67777788888888888888888877776555443222100//..---,,++++***))*)()(((''%%&$$$$%
- at 30BB2AAXX080903:3:40:1329:522#0
-AAGGACTGCAAAACCCCACACTGCATCAACTGAACGCAAATCAGCAACTTTAATTAAGCTAAGCCCCTACTAGACC
-+
-6777778888888888888".8887667655544322210.0...+,-++*++(*+)))()(((('#""#&%%#$#
- at 30BB2AAXX080903:3:37:116:1610#0
-TGTGGGTTTAAGTCCCATTGGTCTAGTAAGGGCTTAGCTTAATTAAAGTGGCTGATTTGCGTTCAGTNGGTTATGN
-+
-677777888888888888888888777765554/32221/0//..---,,+++*+*)))()'(((''"""&"%##"
- at 30BB2AAXX080903:3:41:1680:277#0
-CAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTAAGTCCCATTGGTCTAGTAAGGGCTTAGCTC
-+
-67777788888888888888888877776555343222000//..---,-+,++*+*)))()((((''&&%&&#$"
- at 30BB2AAXX080903:3:49:743:1400#0
-TAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCAGATCGGGCGATA
-+
-67777788888888888888888877776555443222100//..-,-,,,++*****))))(((('&#""##"""
- at 30BB2AAXX080903:3:40:238:963#0
-ACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCNACTTCTAC
-+
-67777788888888888888888877776555443222000./-..-,,,,++***)**)))((((%"%"%$$##$
- at 30BB2AAXX080903:3:41:1347:216#0
-GGCGGGAGAAGTAGATTGAAGCCAGTTGATTAGGGTGCTTAGCTGTTAACTAAGTGTTTGTGGGTTTACGGCATNC
-+
-6777778888888888888888887777655544322210///....-,,+++***)))))((((('&$%#$##"#
- at 30BB2AAXX080903:3:46:208:811#0
-TGAATTGCAAATTCGAAGAAGCAGCTTCAAACCTGCCGGGGCTTCTCCCGCGTTTTTTCCCGGCGGCGTCTTCCAT
-+
-67777788888888888888888877776555443222100../+,-,--,%****))(')))'(('&$$""##""
- at 30BB2AAXX080903:3:60:1625:1681#0
-TTTACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTCAAACAACNN
-+
-67777788888888888888888877776555443232100//..---,,+++***)*)))(((&'&'$%%%"%""
- at 30BB2AAXX080903:3:1:505:1390#0
-ACAGTCCAATGCTTCACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGAGATCGGANGTNACAC
-+
-677777888888888888888886777765554432210/0//---,-,,,++*+*)())())''('&"%""#$"#
- at 30BB2AAXX080903:3:41:1761:1312#0
-CACTCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACCAGAC
-+
-677777888888888888888888777765554402/21//./----+,+,+****)()))&(((&'&$#"####"
- at 30BB2AAXX080903:3:39:748:1227#0
-CCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGTGAGAGATCGGCGGAGCTCA
-+
-67777788888888888888888877776555443211100//..--,-,-++***)*))))(('(&"""""""#"
- at 30BB2AAXX080903:3:49:246:1867#0
-CCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGTCGGCGAACATCAGTGGGGGTGAGGTAAAATGAGCGAGAG
-+
-647777888888888888888888777765554332..10.//-+.-++,*++***#*&*)#(((''"####&"$"
- at 30BB2AAXX080903:3:34:768:1637#0
-TCAGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAGATNCAGACANN
-+
-6777778888888888888888887777655543120200../.--,--++++*)()*'(((((('%"##"#$#""
- at 30BB2AAXX080903:3:42:1264:24#0
-AGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATACTCAACGGTCGGCGAACATCAGTGGGGGGGAGGGACACTGCG
-+
-67777788888888888888888877776555443122100//..-.-+,++++)*%))))('('(&&"$"$""#"
- at 30BB2AAXX080903:3:57:641:352#0
-GGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTCAACGGCCGGAGATCGGAAGAGCGGTGCATACGAA
-+
-67777788888888888888888877776555443222100//..--,,,++++*)*))))()((''""""""""#
- at 30BB2AAXX080903:3:43:407:262#0
-CACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTAGATCGGAAGAGCGGACTCC
-+
-6777778888888888888888(87,77670134%212/0///--.-,+,++)*#**))(())'((''"&%#""""
- at 30BB2AAXX080903:3:33:36:651#0
-CTCATGCGCCGAATAATAGGTATAGTTTTACAATGTCTTTGTGGGTTGTAGAGAATAGATCGGGAGGNCTCAGANN
-+
-6777778888888+8888880888777.6053543222100//.%.--+,+++****))'#()'((%"%"##"#""
- at 30BB2AAXX080903:3:56:1646:1004#0
-TCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGAGAAGATCGGACACACCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*())*))(#(''$&"#%%%$%
- at 30BB2AAXX080903:3:1:181:790#0
-TAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGTGGTTTGTAGATCGGANCANAACT
-+
-67777788888888888888888877776555343212100/...--,,,+++**)*)*)(())'('""##"#"##
- at 30BB2AAXX080903:3:43:544:1761#0
-TAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGGGTTCCAATGTCTTTGTGGTTTGTAGAGAATAGTGAACGG
-+
-67777788888888888288%8$8777765551352'210+/+-.--+,,+++**((*)&()(('%'$&##"""##
- at 30BB2AAXX080903:3:39:937:230#0
-GGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCAGATCGGAAGAGCGCGCAG
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))*))))('(&%$$"""#"
- at 30BB2AAXX080903:3:42:1249:422#0
-AAACCACAAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTC
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))((((''%"$$"$"%
- at 30BB2AAXX080903:3:54:300:1423#0
-ATAAGGAGGCTTAGAGCTGTGCCTAGGACTCCAGCTCATGCGCCGAATAATAGGTATAGTGTTCCAATGTCTTTGT
-+
-6777778888888888888888887777655544322/000//...,-,,+,+**+)*)))()((''$"$%$%""%
- at 30BB2AAXX080903:3:1:192:541#0
-CATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGTTGCCTGGCTGGCCCAGCTCCNACNGCTG
-+
-67777788888888888838888877476355353220///./----),,(*+*+())(&'''(#%#%""$""#""
- at 30BB2AAXX080903:3:44:1104:694#0
-TGCATGGGCTGTGACGATAACGTTGTAGATGTGGGCGTTACCTAGAAGGTTGCCTGGCTGGGCCACCCCGGGGGGC
-+
-6777778888888888888888-87*476.5344201-10,./.-,.+,&+,*))*)))(('((&&#$$$%"""#"
- at 30BB2AAXX080903:3:57:423:213#0
-CAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGGCTGGCCCCNCTCGCT
-+
-67777788888888888888888877776355443122100-/-.-*+,++,+$*+**')()'((''&&""""%##
- at 30BB2AAXX080903:3:58:1640:499#0
-CAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGTTACCTAGAAGGGTGCCTGGGTGGGACAAGAACAN
-+
-67777788888888888888888877776555443222120//.,.--,,++++**#*)))%)('(%$&""%$%$"
- at 30BB2AAXX080903:3:41:1097:323#0
-TGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAAT
-+
-67777788888888888888888877776555443222100//..---,,+++**+))))))((((&''&%"%""#
- at 30BB2AAXX080903:3:50:757:526#0
-TGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAGTCAT
-+
-67777788888888888888888878776555443222100//...--,,+,++**)*))(()('''""#""""""
- at 30BB2AAXX080903:3:56:755:965#0
-TACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCGGTACCTCACGCCACC
-+
-67777788888888888888888877776555443222000//.+-+-,++++**)))##)')#'&'""""$###"
- at 30BB2AAXX080903:3:49:1607:397#0
-TATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTCAGATCGGGGGGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***))()))(('''%$"""""#"
- at 30BB2AAXX080903:3:60:1280:1912#0
-TCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTACNACNN
-+
-677777888888%-82,8/.8)8877476452413*2-.-/./.,..,,,+*+****)*)#))((('%$%#"##""
- at 30BB2AAXX080903:3:60:781:755#0
-ATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGGTATTNACANN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''&$""$##""
- at 30BB2AAXX080903:3:43:150:269#0
-TGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTAGATGTGAGATGGGAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&&&"""#$"#
- at 30BB2AAXX080903:3:42:398:1088#0
-ACGACCACATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAAGCTTCTTCATAGTAATACCCAGTCTAAC
-+
-6777778888888888888)8888787255412332.12/00/.-,--$(*+**))*))((()((##&%#%#"#""
- at 30BB2AAXX080903:3:37:62:842#0
-CGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATAACGTTGTACATGCTGTN
-+
-67777788888888888888888877776555443222100//..----,+++*+*))*))((('('&#$#$##""
- at 30BB2AAXX080903:3:42:75:841#0
-CAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCTGTGACGATNCGCTCCAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&"$"%""#"#
- at 30BB2AAXX080903:3:48:688:658#0
-TAGTCAGTTGCCAAAGCCTCCGATTATGATGGGTATTACTATGAAGAAGATTATTACAAATGCATGGGCCGCACAT
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((((''$""$$#""
- at 30BB2AAXX080903:3:35:972:190#0
-CAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCCATCATAATCGGAGGCTTTGGCAACTGNAGCGTANN
-+
-67777788888888888888888877776555443222100//..---,,++**+****)))(((('"""%""#""
- at 30BB2AAXX080903:3:52:431:625#0
-TTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGATGTGTATTACTATGAAGAAGATTATTACAATTGCATG
-+
-677777888888888888888888777765550$3222110-/...,-,-,+++**)))))((((('$"#"%###%
- at 30BB2AAXX080903:3:56:1337:1009#0
-TTATTAGGGGAACTAGGCAGTTGCCAAAGCCGCCGATTATGATGGGTATTACTATGAAGAAGATTATTACTACATC
-+
-6277778888888*883888)88877776)5$44322,1000/...-,--,+***)))))))(('(''$%##$$"#
- at 30BB2AAXX080903:3:4:9:1631#0
-GGGAAACGCCATATCGGGGGCACCGATTATTAGGGGAACTAGTCAGTTGCCAAAGCCTCCGATTATGCNCAACNCN
-+
-67777788888888888888818876771555443230.1)/..----,-,+')+(*))))'((&('$"&"#%"#"
- at 30BB2AAXX080903:3:42:676:371#0
-ACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGGCTCCCCGA
-+
-677777888888888888&8888877776555463321110//.---,+-+*+*))**)'('(((''""&%#%$""
- at 30BB2AAXX080903:3:50:880:231#0
-CATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTTTCCCCGCACCACG
-+
-67777788888888888888888877776555443222100/0..,---,+++****))))(&((('&"#"$#"#"
- at 30BB2AAXX080903:3:53:252:270#0
-CTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGATTACCCGCCTAAACAACATAAGCTTC
-+
-6777778888888888888888887777655.44332110..*-'(--+,+$%)+)(*(')&))('%"""#%"""#
- at 30BB2AAXX080903:3:60:756:420#0
-ACTAGTTCCCCTAATAATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTCACNN
-+
-67777788888888888888888877776555443222200//...,--,,,+****))))((((('&%#"%##""
- at 30BB2AAXX080903:3:52:1086:1998#0
-GGCTCCTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCAGAACGGACAG
-+
-6777778888888888828858827777655.44212220.//,.-----+++'*)'*)())'(#''$$#%%"##"
- at 30BB2AAXX080903:3:46:1515:1094#0
-TGATGGCTCCTAAGATAGAGGAGACACCTGCTAGGTGTAAGGAGAAGATGGTTAGGTCTACGGAGGCTCCACTCAT
-+
-67777788888888888888888877775545543020100//.----,,+*+***&())')('((&"#$"$"#""
- at 30BB2AAXX080903:3:46:1354:60#0
-TAATTGTTGTGATGAAATTGATGGCTCCTAAGATAGAGGAGACACCTGCTAGGTGCAAGGAGAAGAAGGTATGATC
-+
-67777788888888888888888810776655433232100.//-,,,+*+++&*'))()')'(('#""#"""#"#
- at 30BB2AAXX080903:3:60:1023:908#0
-CGGAGGAGGAGACCCTATTCTATACCAACACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCNTACAANN
-+
-67777788888888888888888877776555443222100//..---,-+,++**)))))()((((&"%"%##""
- at 30BB2AAXX080903:3:49:437:25#0
-CACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCTATGTATCCAAATGGTTCTATTTATACG
-+
-6777778888888888888882887777455544322220//.+.-,,+,++*+*)*()((()%(''"#"#""#$"
- at 30BB2AAXX080903:3:39:533:494#0
-AACCATTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGTCCCTCT
-+
-67777788888888888888888877776555443222100/...---,-,*+***(*)*))(('(&&$#"""$##
- at 30BB2AAXX080903:3:45:160:555#0
-TTTGGATACATAGGTATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACGAGCGGG
-+
-67777788888888/88888888877776555443222100//.,---,,+)+****)))*((((''&$%"""%"$
- at 30BB2AAXX080903:3:1:1670:468#0
-GTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATACCNTCNTCAA
-+
-6777778888888888888888887777655344322211///..---,,+++*****))))')((%&""%"$%#"
- at 30BB2AAXX080903:3:35:1075:210#0
-CTGTAAATATATGGTGTGCTCACACGATAAACCCTAGGAAGCCAATTGATATCATAGCTCAGACCATNACCAACNN
-+
-67777788888888888888888877776555443222100//...--,,+++++*)*))))()(('"#&####""
- at 30BB2AAXX080903:3:1:922:385#0
-GGTATGGTCTGAGCTATGATATCAATTGGCTTCTTAGGGTTTATCGTGTGAGCACACCATATATTTACNACNCACA
-+
-671.778828888132.84830.2'147:.+5/$'+2-2(.1-/'$)+++$)))''($#(&'%(''&$""%"#$$%
- at 30BB2AAXX080903:3:53:1045:1609#0
-TCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGACTAGAACA
-+
-677777888888888888888888777765554432201.0//..-,---+,++**)*))()((((%%$""%#"#"
- at 30BB2AAXX080903:3:56:1669:1250#0
-TATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACCACAAACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''"$$&%$%$$
- at 30BB2AAXX080903:3:1:1092:1262#0
-GTGAAATATGCTCGTGTGTCTACGTCTATTCCTACTGTAAATATATGGTGTGCTCACACGATAAACCCNTGNAATC
-+
-677777888888888888*88088'7776/504,.22-100%.&.--,),)**))&'&()(((''('$"%&"""""
- at 30BB2AAXX080903:3:35:680:1031#0
-TCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATANTGCACCCN
-+
-677777888888888888888888777765554332/110//0..---,,+*+***)))))))((%("$"""###"
- at 30BB2AAXX080903:3:51:1146:676#0
-ATCGTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTCCNCAAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()('(''%#"""$$$
- at 30BB2AAXX080903:3:57:1444:235#0
-GTGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCAGATCGAGCGGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$&"#""$##
- at 30BB2AAXX080903:3:49:1507:1189#0
-TGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCNCTCGAAC
-+
-67777788888888888888888877776555443222100//..---,,++++****()())(((#&"####"##
- at 30BB2AAXX080903:3:54:662:206#0
-TGTGAGCACACCATATATTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACAATCATCCT
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))(((('"#%"%#"##
- at 30BB2AAXX080903:3:36:1191:728#0
-GTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTATACGTCGATTCCTAGAGACTACACCN
-+
-6777778888888888888888887777655+4432/200+'./,.,-,,++%*''#())()''((#"$$"$"##"
- at 30BB2AAXX080903:3:37:675:976#0
-GTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGTGTCTACGTCTATTCCTAAGATCTGCCAGN
-+
-6777778888888888888888887777655(4432.2(00...,-,-,,+)*+&)*)'))('(('%"&&&##"#"
- at 30BB2AAXX080903:3:47:275:71#0
-GCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGAAATATGCTCGTGTGGCTACGTCAGATCGGCATACCTGT
-+
-67777788888888888888888877776555443'2*000/.-,,,,,,(,%&))')##&'&#'''$"""##"""
- at 30BB2AAXX080903:3:37:28:1911#0
-ACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGGGGAATATGCTCGTGTGTCTACGTCTAGATGCAATAGAN
-+
-6777778888888888888888887777655544322-1'0/).-.)-,,$,***%)(((%')'%'#"$"""#"#"
- at 30BB2AAXX080903:3:46:835:1539#0
-AATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAGTCAAGCA
-+
-67777788888888888888888877736545443122000//...--+,,+++)*(*))(((((''&$"#""%"#
- at 30BB2AAXX080903:3:47:1068:679#0
-GACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCAAGATCGGAAGAGCGGTTCAGCTCATAA
-+
-67777788888888888888888877776551343222100//...-,*,++****)))()(((#&%$$#""""""
- at 30BB2AAXX080903:3:40:705:1440#0
-TGGCGAGTCAGCTAAATACTTTGACGCCGGTGGGGATAGCGATGATTATGGTAGCGGAGGTGAAATATGCTCGTGT
-+
-67777788888888888888888877776555443222120./..--,,,+++*)*)())#)#'(%'"%""$%#"#
- at 30BB2AAXX080903:3:40:852:1798#0
-CCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACAGATCCGA
-+
-6777778888888888888888887177655544221-.00/,..--,-++,+**)*())('''('''$##&#"##
- at 30BB2AAXX080903:3:60:940:1464#0
-ACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTAAATACTTTGACGCCGGTACACACNN
-+
-67777788888888888888888877776555463222100//.--,-,,,*+**)))))(()(((&'&"&%#$""
- at 30BB2AAXX080903:3:56:935:536#0
-ACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAAGAGCTCACG
-+
-67777788888888888888888837776)5544/2221.0//..--,,,++******)))(((''''%"%"##$"
- at 30BB2AAXX080903:3:58:813:661#0
-TAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGAGATCGGAAGATGTTCCAC
-+
-67777788888888888888888877776555443222100//..---+,+++(**)*))((()(''$$&""####
- at 30BB2AAXX080903:3:47:221:452#0
-ATCCTAGGGCTCAGAGCACTGCAGCAGATCATTTCATATTGCTTCCGTGGAGTGTGGCGAGTCAGCTGAGAACTGT
-+
-67777788888888888888888877776555443222100//..---,,-++***)))))&(((((&$$"#$#$"
- at 30BB2AAXX080903:3:42:1500:1933#0
-TATTTAGCTGACTCGCCACACTCCACGGAAGAAATATGAAATGAACTGCTGCAGTGCGCTGCGCCCTAGGGCACAC
-+
-67777788888888888018&7&06367$52"-1*022001%.,,+,,*++&'*')#'&&'#(%'%%"$""""$"#
- at 30BB2AAXX080903:3:1:1194:734#0
-TAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATNTCNCCTT
-+
-677777888888888888888888777765554432221/0-..-.-,+-)+*+*)*)*)')((((''""$"##$#
- at 30BB2AAXX080903:3:50:896:1907#0
-TAGCTTACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATGTGTATAT
-+
-677777888888888888888.8877736555443121110/..-.-*+,++))**))))((((((%%$""""#"#
- at 30BB2AAXX080903:3:53:1718:1107#0
-TGCTGCAGTGCTCTGAGCCCTCGGATTCATATTTTTTTTTTTTGTTTGTGGTTTGACTGGACTCAGTACAACACAA
-+
-67.77788888888888&05&'08+17$0-$24/'22210,/&$.&(-,+*&%*)##'))%#&#%%#$$&%%$$$$
- at 30BB2AAXX080903:3:36:237:119#0
-GTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGAGATCGGAANAACAGCCN
-+
-67777788888888888888888577776555442221100//..--,,,,*+***)*)*((')((%"""$#"##"
- at 30BB2AAXX080903:3:57:840:845#0
-GTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACAGATCGGAAGAGCGGTGCATCGC
-+
-67777788888888888888888877776555443222100//..---,--++***)*))()()'('$$"%"#$"#
- at 30BB2AAXX080903:3:36:821:1014#0
-CGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACAGATCGGAAGAGCAGCGACTCN
-+
-67777788888888888888888877776555443232000/....,,,,+*+***)'()((((((%""##"#"#"
- at 30BB2AAXX080903:3:43:385:1195#0
-GTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACAGATCGGAAGGGCGGT
-+
-6777778888888888888883887747655544322210///.-.-,'+-++**)*))(()(((('$&%$"""#"
- at 30BB2AAXX080903:3:51:1585:1216#0
-GTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTACGGTGAAAAGCACGA
-+
-67777788888888888888888877776555443222100//...--,,,++***))))))(('''$#$"###"#
- at 30BB2AAXX080903:3:36:1572:1081#0
-TAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCAAGATTGCTACANN
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*)))((('(%"""""#"""
- at 30BB2AAXX080903:3:47:1500:392#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAT
-+
-67777788888828888888888877776555443222100//..---,,++++*****)))))('(&$%"%#"#"
- at 30BB2AAXX080903:3:55:1663:1126#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGAAACACACACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(%%$%%#&%#$
- at 30BB2AAXX080903:3:8:799:1454#0
-TTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACNCACGTCNN
-+
-67777788888888888888888877776555443221100/../---,,,++***))))))))(('"'##""#""
- at 30BB2AAXX080903:3:39:785:481#0
-ACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCACCTGCGGGCG
-+
-67777788888888888888.88877774555443222100//..---,,+++*+*))*)))(((''&&&&&#"#"
- at 30BB2AAXX080903:3:44:38:1424#0
-ACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTAGCATCCAC
-+
-67777788888888888888888877776555443220/00//..--+,,-+++(***)))(()(''$"$##$#"#
- at 30BB2AAXX080903:3:38:82:1200#0
-CAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCGTCTACTCA
-+
-67777788888888888888888877776555443222100//..--,,,+++*****))))(('('""$"#$"##
- at 30BB2AAXX080903:3:52:65:437#0
-CAACGTAGTACGTGTCGTGTAGTACGATGTCTAGTGATGAGTTTGCTAATACAATGCCAGTCAGGCCCACTGGATG
-+
-67777788888888888888888877776555442222100./..---,,+++***))))()(((('$"$%"$$##
- at 30BB2AAXX080903:3:52:292:573#0
-GTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTACGTGGNGGCTCG
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))))((''""""%""#"
- at 30BB2AAXX080903:3:8:1477:553#0
-TGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGACANTGCCTCNN
-+
-67777788888888888888888877776355441221100.)-..-,,,+,**+(*)*)())'(''"%"$#$$""
- at 30BB2AAXX080903:3:38:1155:1161#0
-CCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTATTGATAGGAGATAGTGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))()'''"&&%%##$%
- at 30BB2AAXX080903:3:37:582:1497#0
-TCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACGCCAN
-+
-677777888888888888888888-7773555443222001/.--,-,,,+++***)))))'(((('$$%&"#$#"
- at 30BB2AAXX080903:3:58:848:1948#0
-TGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCACCACN
-+
-67777788888888888888888877776555443222100//...---,+,+*+*)))))((('(''&%#%"##"
- at 30BB2AAXX080903:3:41:1225:1810#0
-GTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACAGCTCCTA
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))((((&$$%%%%##$
- at 30BB2AAXX080903:3:50:543:824#0
-TAGGGTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCATCCTATGATGGCAAATCNACGAC
-+
-6777528888888888-8888888777764554232221/0//.,-----++++'+))))()(('('%""""#"##
- at 30BB2AAXX080903:3:45:617:1437#0
-GTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCAAATACTGCT
-+
-67777788888888888888888877776555443222100//...--,,++++**))))))((((''"%#"""""
- at 30BB2AAXX080903:3:46:1435:1085#0
-GTAGGTTTGGTCTAGGGTGTAGCCTGAGAATAGGGGAAATCAGTGAATGAAGCCTCCTATGATGGCACCTGCTCTA
-+
-67777788888888888888888877776555443222100///.---,,,++***)))))))((('$$""$"#""
- at 30BB2AAXX080903:3:49:989:436#0
-TATTTGCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTCTCTTGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))))(((&&"##%"""#
- at 30BB2AAXX080903:3:53:1395:1187#0
-GCCATCATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCGAATTCC
-+
-67777788888888888888888877776554443222100//./---,,,+++**)**))()(((&"""#&"#$#
- at 30BB2AAXX080903:3:37:1020:102#0
-TATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACTTCNN
-+
-67777788888888888888888877776555443222100//..---,,+++++**))))((((('"&$&%##""
- at 30BB2AAXX080903:3:42:690:1087#0
-ATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCAGGGATGCCCCGGCCGTGCT
-+
-674777888880888888*888887777657104320210///.'--),,+++*)*%))))'(('#''$%#%##$"
- at 30BB2AAXX080903:3:60:561:140#0
-TCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCAGATCGGACGCCCCNN
-+
-677777888888888888888888777765554432221/0//..,),,,+,+****)*)'(((((''#&"$#$""
- at 30BB2AAXX080903:3:55:37:1695#0
-CATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAATGCCCCGACGTTACGCCGACATC
-+
-67777788888888888888888877776555443222100//..---,,+,++****))()(((('"$##""##"
- at 30BB2AAXX080903:3:38:99:857#0
-TGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTTCTTCTACTATTAGGATCCTCTCCCG
-+
-67777788888888888888888877776555443222100//..---,,+*+*+*)*)))(((((#$$&%$&##"
- at 30BB2AAXX080903:3:3:1374:1552#0
-ATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGGTCTTCTACTAAGATCNAGCANCC
-+
-677777888088888888888888(71765524431/2/00-).,.--,,,+%('*)))(('((('%%""""$"#$
- at 30BB2AAXX080903:3:1:15:1043#0
-ATAGTAGAAGAACCCTCCATAAACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGNNCTNACAC
-+
-67777788888888888888888877775555443211100./.'-,,+,+,+*')()())((''''""$""#$##
- at 30BB2AAXX080903:3:55:1032:786#0
-TACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTTATGGAGGGTNTNTCTCGT
-+
-677777888888888888888848777.6555443222000//..---,,+++**)))&)))')'(&"""%%$#""
- at 30BB2AAXX080903:3:4:75:371#0
-GTATACGGGTTCTTCGAATGTGTGGTAGGGTGGGGGGCATCCATATAGTCACTCCAGGTTAGATCGGCNCTCGNTN
-+
-6777778888488888888888887/77651244122220.//-.--+&++&+(*))((((('((('""%""""""
- at 30BB2AAXX080903:3:57:1639:95#0
-TGTCAAAGTTAAATTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTAACACACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('(&$$%%&%$#$
- at 30BB2AAXX080903:3:51:1293:1482#0
-ATAGGGGAAGTAGCGTCTTGTAGACCTACTTGCGCTGCATGTGCCATTAAGATATAAGATCGGAAGAGCGCGGCAT
-+
-6777778888888888888888887777655524112.100//#,.--,-++++*(**))')((((%"$"#""#""
- at 30BB2AAXX080903:3:40:882:158#0
-CCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTGATA
-+
-67777788888888888888888877776555443212100/..-.---,+++**)*)(()((((''&$%#"""""
- at 30BB2AAXX080903:3:55:1126:950#0
-TATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCAGATCGGAAGGTGCGCGAC
-+
-67777788888888888888888877776555843222100//-.---,+,+****(()))'()'''$#$$$#"##
- at 30BB2AAXX080903:3:35:1659:1352#0
-TATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTNACCATTGN
-+
-67777788888888888888888877776555443222100-/.-(-,+,,,+*)**))))(()#&'""$%#""#"
- at 30BB2AAXX080903:3:56:1175:147#0
-GGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCTATCATAGAAGAGCTTATCAAGATCGGTACNACT
-+
-67777788888888888888888877776555443511.0//.--,--+-+,++**()))((()(&''$##"""#"
- at 30BB2AAXX080903:3:46:1611:1061#0
-TACAGGACTAGGAAGCAGATAAGGAAAATGATTATGAGGGCGTGATCATGAGATCGGAAGAGCGGTTCAGCATGGG
-+
-67777788888888888888888877776555443222100/...---,,-++***))*))('('(&%"##"""""
- at 30BB2AAXX080903:3:52:1512:647#0
-AGACGGTTTCTATTTCCTGAGCGTCTGAGATGTTAGTATTAGTTAGTTTTGTTGTGAGTGTTAGGAACAGCGAGCG
-+
-67777788888888888888888877776555443222100//..---,,+++****))))((('('%'"&"##$#
- at 30BB2AAXX080903:3:52:1512:649#0
-AGACGGTTTCTATTTCCTGAGCGTCTGAGATGTTAGTATTAGTTAGTTTTGTTGTGAGTGTTAGGAANAGGTAGCG
-+
-67777788828888888888888877776555443222100//..---,,+++***))))(()('('"""$"#"##
- at 30BB2AAXX080903:3:43:693:421#0
-CACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCGCGC
-+
-6777778888888888888888887777655244322210&/...*--+,+++**()()((()('(''%#%&#%$#
- at 30BB2AAXX080903:3:57:1163:1524#0
-CTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTAGATCGGAAGATGNACACA
-+
-67777788888888888888888877776555443222100//..-----+,+****))))))(((''%$""#$$#
- at 30BB2AAXX080903:3:48:1355:828#0
-ATGGCCAATTGATTTGATGGTAAAGGAGGAATCGTTGACCTCGTCTGTTATGTAAAGGATGCGTAGGGGAGTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))))))(((''$""""""##
- at 30BB2AAXX080903:3:59:482:535#0
-GGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGTAGGAGTTGAAGATTAGTCCGCCGTAGTCGGTGTACTCCAA
-+
-6717778888888888888888887777435)443222110//.---,,,+++*+**))'()((''#'&#""##"#
- at 30BB2AAXX080903:3:52:504:1093#0
-ACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAAGATCGGAAGCGAAACAA
-+
-67777788888888888888888877776555443222100//..---,,++****)))))()((('$$""$%##"
- at 30BB2AAXX080903:3:37:1005:832#0
-AAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGCATGTAGGATTTGAAGAGTAGTCCGCTGCATCCN
-+
-677777888888888888883$88727765554432201-0/),.-+,,-*&'*)*)*)('((((''"""#"%##"
- at 30BB2AAXX080903:3:56:1232:1741#0
-GACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACCACACC
-+
-6777778888888888888888887,776555433221/0//0.---,,+,++*'**))())('('%&$#"#%$##
- at 30BB2AAXX080903:3:40:783:397#0
-AACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))())()((('$$%##$"#$
- at 30BB2AAXX080903:3:44:591:1677#0
-GTACTACTCGATTGTCAACGTCAAGGAGTCGCAGGTCGCCTGGTTCTAGGAATAATGGGGGAAGTATGGAGATCGG
-+
-677777888888888888888888777765554435221////,.--,,,+++***)))))')((((&""%#$"$%
- at 30BB2AAXX080903:3:43:892:1725#0
-ACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTGCCGCTGCTC
-+
-6777778888888888)88888837777655544+2211//-..---',,+()+)'*()'))&('(''&%##""""
- at 30BB2AAXX080903:3:3:129:387#0
-ACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGATAAAAGATCNCAACNCA
-+
-6277778888888888(88888787777.3554332(2110*-.,-",,,,+*%*'#*&()#)(((%'"#"$$""#
- at 30BB2AAXX080903:3:54:1223:1032#0
-TGTAAAGAGGTGTTGGTTCTCTTAATCTTTAACTTAAAAGGTTAATGCTAAGTTAGCTTTACAGTGGGCGCTGTCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((('''#"&%$"##
- at 30BB2AAXX080903:3:47:208:784#0
-GCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAAGAGAACCAACACCTCTTTACACTCACAT
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('(&'###$#"#%
- at 30BB2AAXX080903:3:59:1518:686#0
-TAAGTTAAAGATTAAGAGAACCAACACCTCTCTACAGTGAAATGCCCCAACTAAATACTACCGTATGCACACANAA
-+
-6777778888888888888888887777655.443222100//..,.,,,+,++****)))((((('&$#%$$"##
- at 30BB2AAXX080903:3:54:682:1851#0
-TTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTAACAGTCCTC
-+
-67777788888888888888888877776555443222100//..-.-,,+++**+))))())(''&"$%"%$%#%
- at 30BB2AAXX080903:3:49:1243:344#0
-ATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGGAGGCCCAGGATCGAGACTCC
-+
-67777788888888888888888877776555442222100//..---,,+++**%**)'(#(('%%%"#"##"##
- at 30BB2AAXX080903:3:55:523:676#0
-GTTGATGAGATATTTGGAGGTGGGGATCAATAGAGGGGGAAATAGAATGATCAGTACTGCGGCGGGGAGGTTACTC
-+
-677777888888888888888888777765554432221/0//-.-.-,,,,+*****)))(((((%""$"""###
- at 30BB2AAXX080903:3:48:1345:142#0
-CTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCACACATA
-+
-677777888888888888888888777;6555443222100//.,.-,-,+++****())('('(''$""##%%"#
- at 30BB2AAXX080903:3:48:247:1781#0
-GCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCATCAACAACCGACCACACA
-+
-6747+78888888888888888887777.55534322210/-.#.-,+,,,++****))))(((('%"$$""$"#"
- at 30BB2AAXX080903:3:59:1320:999#0
-GCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCATCAACAACCTACACCACA
-+
-677777888888888888888888777765554432220/0/./,--,+,,++****)*))()(((#$&&&$##$#
- at 30BB2AAXX080903:3:1:444:322#0
-GGTTAGTTGTGGCAATAAAAATGATTAAGGATACTAGTATAAGAGATCAGGTTCGTAGATCGGAAGATNAANTGCA
-+
-677777888888888888888888777765554432221000/...-,,,+++)*)**))(()((''"""#""##"
- at 30BB2AAXX080903:3:54:672:1670#0
-ACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTTTATTGCCACAACTAACCTCCTCGGACTCCTNCCTCAC
-+
-67777788888888888888888877776555443222100//.-.---,+++***))()))((((#&""%$%%$#
- at 30BB2AAXX080903:3:55:835:609#0
-TGGGTGGTTGGTGTAAATGAGTGAGGCAGGAGTCCGAGGAGGTTAGTTGTGGCAATAAAAATGATTAAGNGNCACA
-+
-67772788888088888888888877776555442222100/.----,,)++)***)))*)((((('"%"""%$#"
- at 30BB2AAXX080903:3:53:70:484#0
-AGGGGATGGCCATGGCTAGGTTTATAGATAGTTGGGTGGTTGGTGTAAATGAGTGAGGCAGGAGGCCGTGTCGTGG
-+
-677773888888888888888881787163524432,2100//*.(-++,+++&*)))(())#)''%"""#"%"""
- at 30BB2AAXX080903:3:3:566:1332#0
-CCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTATCTATAAACCTAGCCATGGCCATCCNCATCNCA
-+
-67777788888888888888888877776555443222100//.----,,+,++**)*)'(()(''''"%"%$""#
- at 30BB2AAXX080903:3:41:830:1931#0
-TGCGCCCGCTCATAAGGGGATGGCCATGGCTAGGTTTATAGATAGTTGGGTGGTTGAGATCGGAAGGGCGTCTCGC
-+
-6777778888888888888888887777655344222/1101//.,-,,-+++***'*')%((#('#%$$""#$""
- at 30BB2AAXX080903:3:44:1293:462#0
-AAAGCCTATAATCACTGCGCCCGCTCATAAGGGGATGGCCATGGCCAGGGTTCTTGATAGTTGGGGCGAAGCAGCA
-+
-677777888888888888888888&7%735+5403.12.2,+%.%$*'+%,,(*#'#(#('('(%%''"""#"#$#
- at 30BB2AAXX080903:3:44:1777:239#0
-AGTGGGCTAGGGCATTTTTAATCTTAGAGCGAAAGCCTATAATCACTGCGCCCGCTCATAGATCGGACGGACATGC
-+
-67477788888888888888888877776559443222100/...-,,-,+++*+)*)()))#(&''"$"#""#"#
- at 30BB2AAXX080903:3:39:417:1670#0
-CCATCCCCTTATGAGCGGGCGCAGTGAGTATAGGCTTTCGCTATAAGATTAAAAATGCCCTAGCCCACTTCTTCTC
-+
-67777788888888888888885817756555440210000/+------,-++**(*&))('(%(''"%"$%####
- at 30BB2AAXX080903:3:1:1001:812#0
-CACTTCTTACCACAAGGCACACCTACACCCCTTATCCCGATACTAGTTATTATCGAAACCATCAGCCTNACNCACG
-+
-67777788888888888288880877-76545443110.10...--,,,-,++**)()(()(((('#""#%""##"
- at 30BB2AAXX080903:3:53:1077:309#0
-TACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTACCATCCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(((''&#"%%%"##
- at 30BB2AAXX080903:3:51:851:1724#0
-CCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGTAGGCTGATGGTTTCGACTAACT
-+
-6777778888888888888888887777655544322.100//.---,-,+++++*)(*)()(((('%$##"#"#"
- at 30BB2AAXX080903:3:57:579:976#0
-AACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACCC
-+
-67777788888888888888888877776555443222100//..---,,+++**+***))))(((''&&$"###"
- at 30BB2AAXX080903:3:41:241:1097#0
-CATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATGAGGCGGTCGGCG
-+
-6777778888888888888888887777655522522.10/+/.,.+,,,(*+***))))(((('(%$$%""""""
- at 30BB2AAXX080903:3:39:445:207#0
-GGTGCATGAGTAGGTGGCCTGCAGTAATGTTAGCGGCTAGGCGTACGGCCAGGGCTATTGGTTGAATAGGTACACA
-+
-677777888888888888888888777765554432221000/-,,--,,*++**))*)))())((%$"%$%"###
- at 30BB2AAXX080903:3:3:160:1439#0
-ACTCATTCAACCAATAGCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGANTCCANAT
-+
-677777888888888888888888772765554432320/1///-+--+,+*+**)'))((((('('"""&#$"""
- at 30BB2AAXX080903:3:51:352:1004#0
-GCCCTGGCCGTACGCCTAGCCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGACTCGCGAG
-+
-6777278888888888888888887777655454322210/./.-.,,,+++***)'*))()(((''"#"%"#"""
- at 30BB2AAXX080903:3:59:190:1177#0
-TTGGATTAAGGCGACAGCGATTTCTAGGATAGTCAGTAGAATTAGAATTGTGAAGATGACAAGTGTAGCGCANNNA
-+
-67777788888888888888888877776555.4/22.100//...--,,(+++*+*))))((''(''""$""""$
- at 30BB2AAXX080903:3:55:1673:1897#0
-TCCCTCTACACTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTCACACCCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(''&$&%%%$%#$
- at 30BB2AAXX080903:3:33:295:1041#0
-CTTGTCATCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGAGANCAACCANN
-+
-67777788888888888888888877776555443222100./..---,-,+++***)))(((('('"%#"###""
- at 30BB2AAXX080903:3:55:255:594#0
-TAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTAAAACCCAGCCCA
-+
-67777788888888888888888877776550443222101./..---,,+++***))))))'(('($"$%%%###
- at 30BB2AAXX080903:3:57:1552:1305#0
-TAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTAAAACACATACCA
-+
-67777788888888888888888877776555443221100/...---,,,+++**)))))()(((&'$&$"##$$
- at 30BB2AAXX080903:3:42:522:1136#0
-ATCGCGCCATCATTGGTCTATGGTTCGTGTGTTGGTTAGTAGGCCTAGGATGAGGAGCGTTGTGGAGTGGTGTATA
-+
-6737778888888888888888887'736$514432021.///,.-,-+-,++**))())()(((''&&#$$"#""
- at 30BB2AAXX080903:3:42:1309:868#0
-TACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGGTTT
-+
-67777788888888888888888877776555443222100//..---,,+++**+)))))()(('&&%%#%#"""
- at 30BB2AAXX080903:3:43:837:1057#0
-TACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGGTAGTAGGCCGAGTATGAGGAGCGCTATGGCACCGTGT
-+
-6777778888888888888)8888777745*5442222(00/.-.-,,,,++*****)())(&((('$$""$%#$"
- at 30BB2AAXX080903:3:55:825:1264#0
-TTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGTTATGGAGTGTAT
-+
-67777788888888888888888877776555443222100//..--,-,,+++**))))))()'(&$&"$$%#""
- at 30BB2AAXX080903:3:2:864:1183#0
-TGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGACTAGTATGAGGAGCGATANGGACATC
-+
-677777888848*88888888881777765(94(3022100-.--.--,),,)+*)*)())((#'%'"""#%$$"#
- at 30BB2AAXX080903:3:40:1507:1694#0
-GTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGAGATCGTAGGGTTGC
-+
-67777788888888888888888877776552343212100//-,-+,,,,(+**)*)))))((''&$%#""""#"
- at 30BB2AAXX080903:3:49:1026:996#0
-CGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGAGCGCTATGGAGG
-+
-67777788888888888888888877776555443222100//..---,,++++**)*))*((('(&$#$#$$"""
- at 30BB2AAXX080903:3:34:1041:1648#0
-TTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGAGGNTAGATANN
-+
-67777788888888888888888877776555443222100//..---,,+++******))(((('&""#""##""
- at 30BB2AAXX080903:3:4:1588:709#0
-TTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGAGATCGGAAGAGCGNCACCNCN
-+
-677777888888888888888888777765554412221/0-/.---',-,**+))*()))('((('$"%&$#"""
- at 30BB2AAXX080903:3:43:991:1309#0
-ATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTATTAGGCCTAGTATGAGGAC
-+
-671,4.8382888-8+.88,118,7317)-+/34#0)-.1/*&.,-(+$,('+(')(#&%('&'(&'$""%#%###
- at 30BB2AAXX080903:3:59:138:1822#0
-ATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTAGATCGGAAGAGCGGACGNNC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)*)))(()'(&'$%#$"""#
- at 30BB2AAXX080903:3:44:1284:1377#0
-TGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCCTAGTATGCG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))*))(('''%"%##$%"%
- at 30BB2AAXX080903:3:44:710:798#0
-TGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGAGATCGGAAGGGAGGGACACGCCA
-+
-6777778888888-888/8888(8-777655'%)1%(21&//+&..+,'+)+++''()))%('('(('"#""$"#"
- at 30BB2AAXX080903:3:41:1379:1187#0
-CATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACTNT
-+
-67777788888888888888888877776555443222100//..,---,*++**)())))((((''&&%%%$"""
- at 30BB2AAXX080903:3:41:1594:920#0
-TTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGTAGGCACGTTCTC
-+
-6777778888888888888888887777655544322210.-/..---,,++++*+)))()(('((&&""%%""$%
- at 30BB2AAXX080903:3:56:454:912#0
-TTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTAGATCGGTGGAGCTG
-+
-6777778888888888888888887777655544332210///..---,,+&+*+))))))'(((#''$"%"##"$
- at 30BB2AAXX080903:3:53:375:802#0
-GGGGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTCGTAGTCC
-+
-677777833888888888888888777765554432221/0//-.--,-,+++****)()(((('(#$&%$$%"#"
- at 30BB2AAXX080903:3:42:228:196#0
-TGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGTTCGGAGGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)*))((''&&&$$&"&%#
- at 30BB2AAXX080903:3:8:1106:844#0
-GTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTANCTGCTCNN
-+
-67777788888888888888888877776555443222100//..---,,++****))))((()(('"$""%#"""
- at 30BB2AAXX080903:3:2:60:1894#0
-CTACTAACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGACAGCACATACCACGANGACNNCA
-+
-6777778888888888888838884777635504322200-//,-,-,,,,++&*))(((&(&((%'"""%%""##
- at 30BB2AAXX080903:3:41:1383:27#0
-TGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTTGGCGGACAC
-+
-67777788888888888888888877774555443212100/.-.+-,,,**+*+**(*((((((&'%&%##$#"#
- at 30BB2AAXX080903:3:56:671:2024#0
-TGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTAGATCGGAAGAGCTTTCA
-+
-67777788888888888888888877776555443212100//...--,,-+++**))))))()(('&%$"""##"
- at 30BB2AAXX080903:3:35:824:1294#0
-GTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGTNGTCTTAGN
-+
-67777738888888888888888877776555443222100//..---,,++****))*))()(('&""$%#""#"
- at 30BB2AAXX080903:3:41:363:1372#0
-TGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGAGATCGGAAGAGCAGCNGTCACACC
-+
-67777788888888888888888877776555443222000//..---,,,+++*)*)*))(('((%"$#"$####
- at 30BB2AAXX080903:3:57:439:55#0
-TGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTGCTNGTTACT
-+
-67777788888888888888888877776555443222100//.----,,++++**)))()((('(&$$"#""#$"
- at 30BB2AAXX080903:3:55:1265:762#0
-GGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGCGACTCGCT
-+
-67777788888888888888888877776555443222100//..--,--+,+***)()))((('&'"&"#"""#"
- at 30BB2AAXX080903:3:35:411:459#0
-AACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACNACCCCGAN
-+
-67777788888888888888888877776555443222100//..----,+++*****)))(((((&""$#"%"""
- at 30BB2AAXX080903:3:49:1094:1196#0
-AACCAACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACGCACTCCGC
-+
-67777788888888888888888877776555443222100//...--,,+*+***)))*()(('('$$"%#####
- at 30BB2AAXX080903:3:36:849:1531#0
-GTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGAGATCGGAAGCGCCCCCCGN
-+
-67777788888888888888888877776555445222100//.-----,,,+****))))()(('#$$###"#""
- at 30BB2AAXX080903:3:47:950:926#0
-GGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTATCGGGCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))(((((("#"""##"#
- at 30BB2AAXX080903:3:49:881:609#0
-GGTGGTGTGTGGTGGCCTTGGTATGAGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGACATATGG
-+
-677777888888888888888)887,73455544322210.//..---,,++++****))((((%'#&$#"$#"""
- at 30BB2AAXX080903:3:37:951:1054#0
-AGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTCGTTACCAN
-+
-67777788888888888888888877776555443222100//..---,,+++)**)))))))((''$$%$"##$"
- at 30BB2AAXX080903:3:3:1203:1601#0
-CAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTNTACANAT
-+
-67775788888888888888888817776555443221100///----,,+*****)))())(((('%"%#%&""#
- at 30BB2AAXX080903:3:60:427:1283#0
-ACACACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACATCCNGTNN
-+
-67777788888888888888888877776555443222100/.,.----,,++(**))*())))(('%#%#"#"""
- at 30BB2AAXX080903:3:36:321:1673#0
-ACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGCTCTGCGCN
-+
-67777788888888888888888877776555443222100//..---,,+++*+)')))))()(('%#$"$#"#"
- at 30BB2AAXX080903:3:44:619:2017#0
-GACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGGTTAGTGTG
-+
-677777-8888888888888888872776553443221110//.---,,,+*+**)**)*)(((('''%%&%$%##
- at 30BB2AAXX080903:3:1:341:1411#0
-GGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGNCCNCACT
-+
-677777888888888884888888777765/554323210//..,,+-,,,+***))()())%'(''""$#"$$""
- at 30BB2AAXX080903:3:8:1447:1549#0
-CACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCNCCTCACNN
-+
-677777888888888888888888777765-5443222100//..---,,+,*+*)))))())((('"&##%##""
- at 30BB2AAXX080903:3:44:1712:1095#0
-TGGACAGGTGGTGTGTGGTGGCCTTGGTATGTGCTTTCTCGTGTTACATCGCGCCATCATTGGTATATGTGTGGTG
-+
-67777788888888888888888877776555443222100//-.---,,++++**))*))(((('''&&&$"#"#
- at 30BB2AAXX080903:3:56:1020:2017#0
-ACTAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCGCAGTAC
-+
-67777788888888888888888877776555443222100/..----,,+,+**)*)))()((((''&"##""##
- at 30BB2AAXX080903:3:43:53:1026#0
-TAACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGCGACACA
-+
-67777788888888888888888877776555443222100//..---,,+++****))))(((''''"#"#$###
- at 30BB2AAXX080903:3:39:1330:161#0
-ACCATATACCAATGATGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCAGACCCGTGTCTCA
-+
-67777788888888888888888877776555443222100//.---,,-++++*))**)))'((#%"&$"%%#$"
- at 30BB2AAXX080903:3:34:701:316#0
-ATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTAGATCGGAAGAGNCTAACGNN
-+
-67777788888888888888888877776555443222100//...--,,+,**)**)('()((((("$"""$"""
- at 30BB2AAXX080903:3:35:1380:1616#0
-TAATACGGATGTGTTTAGGAGTGGGACTTCTAGGGGATTTAGCGGGGTGATGCCTGTTGGGGGCCAGNAAACACGN
-+
-67777788888888888888888877776555443202100/0..--,,,+++***)*)())(('''"""##%$#"
- at 30BB2AAXX080903:3:4:385:913#0
-CCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCACNAGTCNAN
-+
-67777788888888888888888877576545443222100//,..--,,,++*+**))()))('(('"#""#"#"
- at 30BB2AAXX080903:3:3:1050:1036#0
-CAACAGGCATCACCCCGCTAAATCCCCGAGAAGTCCAACTCCCAAACACATCCGTATTACGCGCATCCNCGCANCA
-+
-6777778888888888888888277/(/255'.,22#1//.%&/.-+,+,*$++&*))))'))(('&""$""#"##
- at 30BB2AAXX080903:3:3:1447:1191#0
-AACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTCCTAAACACATCCGTATTACTCGCATCACNCGTGNCA
-+
-677777888888888888888883777763511/10,-(/-/*,--,,+,*)*)*'()((()(('''$""#%#"#"
- at 30BB2AAXX080903:3:39:90:135#0
-AGCAGTGCTTGAATTATTTGGTTTCGGTTGTTTTCTATTAGACTATGGTGAGCTCAGGTGATTGATACGCCTCTCA
-+
-67777788888888888888888877776555443222100/...---,,+++**))))))()(('&""#$"#"##
- at 30BB2AAXX080903:3:58:838:308#0
-AAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGTTTCGGTTGAGATCGGAAGAGGTCTCNC
-+
-67777788888888888888888877776555443222110//..---,,+++***))))))(((('&$$"$"#"#
- at 30BB2AAXX080903:3:58:830:1259#0
-GTCTAATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTCTATTTTCACAT
-+
-67777788888888888888888877776555443222100//..---,,-++***))))))(((''%$&%$#$#"
- at 30BB2AAXX080903:3:56:1234:725#0
-CTTGTAGGAGGGTAAAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGTTTCGGTTGTCTTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('$&$"%#"""
- at 30BB2AAXX080903:3:33:1640:1067#0
-TGAGGCTTGTAGGAGGGTAAAATAGAGACCCAGTAAAATTGTAATAAGCAGTGCTTGAATTATTTGGNGCATATNN
-+
-67777788888888888888888877776555443222100//..---,-+++***))))))()(''""$##""""
- at 30BB2AAXX080903:3:41:546:757#0
-AGTGAGCTGAGATCGTGCCACTGCACTCCAGCCTGGGCAGCAGAGTGAGACTCTGTCTAGATCGGAAGAGCTGCAC
-+
-67777788888888888888888877776555443222100//..---,,+++****)()))((('("&%"""###
- at 30BB2AAXX080903:3:41:1130:1596#0
-ATGGGTGCAGCACACCAACATGGTACATGTATACATACGTAACAGACCTGCACGTTGTGCACAAGATCGGGAATGT
-+
-67777788888888888888888877776555443222100/...--+,,++++*+**))(((((('&$"""""""
- at 30BB2AAXX080903:3:34:1449:1144#0
-TGGTGTTGCCCAGGCTCAGCTCTGCCTAGACACACGTGAGGGCCAAGATCTGGTTTGTGTTTCATGANCACACANN
-+
-67777788888888888888888877776555443202100//.---+,,,++)***))())'((''"&#%"##""
- at 30BB2AAXX080903:3:52:1258:1115#0
-TGAGCCCTGCCTTCCTAGGGAATCTTGTAGGAAAGACAAAGGTAGAGAATCTGTCTGATGGCGGAAGNCAATGATG
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))((((&""%#%%"##
- at 30BB2AAXX080903:3:37:1354:1363#0
-CTGGGGACTGAAGCACCCACCTCCTGTTCATGTTGATACACGGTGAGCAGAATATGGATGTGGGAGGTGTGTGNTN
-+
-67777788888888888888888877776555443222100//-.---,,++++**))*)'))(((%"&"#%#"$"
- at 30BB2AAXX080903:3:40:1436:495#0
-ACACAGGCTAGGGGGAGGGCAGTTGGAATTGATCCATGCCTTCTAGCTAGACTGTGGGTCCCCTCAGTCTTGGGCA
-+
-67777788888888388888/848777765555332-210,0/.-.-(,&+*)+')**&(((('(#'&$#&$%"#"
- at 30BB2AAXX080903:3:2:1482:1047#0
-TTTGGCACAGAATAATCCCGAGGGCTAAATGACATTGTTCCTACAGTGGGCACCTGAAGACAAGATCANCTCTCTC
-+
-67777788888888888(5888387.4765054132211.0*).,-"-,,+++*))'))))'&('&%'""$"#$""
- at 30BB2AAXX080903:3:50:636:1323#0
-GGTGGGCAGGTCACTTGAGGTCAGGAGTTCCAGACCAGCCTCGTCAACATGGCGACACCCTGTCTCTGCAGCACGG
-+
-677777888888888888888888777765$5443322000//..--,+-+++*+**)))))(((('"$#"$"##"
- at 30BB2AAXX080903:3:59:1629:55#0
-GTAATCCCAGCTACTTAGGAGGCTGAGGCAGGAGAATTCCTTGAACCCAGAAGGTGGAGGTTGCAGACACACCNNA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(('(''$$%%%#""$
- at 30BB2AAXX080903:3:39:1392:1551#0
-GGCAGATCACCTGAGGTCAGGAGTTCCAGACCAGCCGGGCCAACATGGTGAAATGTTGTGAGATCGGCACTCCCTC
-+
-67777788888888888288888,7/7.63*543%'(210/..().-,$,)++*#)(#)%)''(#%'"#$#""##$
- at 30BB2AAXX080903:3:40:910:769#0
-ACACACACACACACACACACACACACACATACACACAAACGCAAAAGCAGACTAAAACAGGAACTAATTAGACGAT
-+
-67777788888888888888888877776+55443.2110,/0.-++),+,(*+*')**(&')(%''"$&#%$"##
- at 30BB2AAXX080903:3:58:1402:1823#0
-GGGCAGGAAGACTATTTGAAGAAATGTGTTTGAAAGCTTCCCAAATTTCACTAAAAACAAATATATACATTACGCN
-+
-6777778888888888888888887777655544323211///..---,,+++**+)*)))()((''&"%$$$"""
- at 30BB2AAXX080903:3:3:1506:354#0
-CATCACCTACAATCTTACCAAAAATAGAACCAAGCACGTGTCCTAGTCAAACAGATCGGAAGAGCGGTNTATANAN
-+
-67777788888888888888888877776555443222100....--,,-+,+***(*)*)()('('%"""%#"#"
- at 30BB2AAXX080903:3:55:1172:1085#0
-TATGCAGTATCTGGCTTTCTGTGCCTGGATTATTTTACTCAGTATAATGTCCTCCCGGTTCATTCATGAGATCACA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&'%"%%$"#"
- at 30BB2AAXX080903:3:39:484:1224#0
-TGGGGGTGTTGTATAGCTTCAGTAATAGATCTGAATGAAGGCGGCCTAATCCTTCCTTGAGTAAACAGCTTAAATC
-+
-6777778888888888888888887777655544322.200//.-----,,,+*+*))))))(((((%$$&$%"""
- at 30BB2AAXX080903:3:43:759:622#0
-GCCTGTGCAGGCATTCTGCTGGGTCACAAAAAGAAAAAAAAAAAGCTGACTTTGCATGCATCCAGATTGAAAAGGG
-+
-67777788888888888888888877776555443222100//..-,-,,+,+****)))))((((''$%&$#"#"
- at 30BB2AAXX080903:3:46:179:1337#0
-GGTGGGGTAGCTCAGGATGCTGGTCCAGGTAGACAGGTGCTCCAATGCCTGAATTTCTGCCTGAGATCAAGCGAGG
-+
-67777788888888888888888877776555443222100//..---,,+++****))*)((('('&"""$$#"#
- at 30BB2AAXX080903:3:37:817:1511#0
-GAAAATTCCTCAAAGATCTAGAACCAGAAATGCCATTTGCCCCAGCAATCCCTTTACTGGATATATGACCACAGCN
-+
-6777778888888888,888888877776555(432.210///..--,-,+)+***))*))(((((($$%#"#"""
- at 30BB2AAXX080903:3:4:674:204#0
-CACGTGGATACATGGAGGGGAACAACACACACCAGGGCCTCTCAGCGGGAGAGGGGGAGGAGAACACANACCANCN
-+
-27377788888888888888,8)871436051(/3.2*01./,.-(-,,,&+++*+'*()')#''(#$"%&##"#"
- at 30BB2AAXX080903:3:33:598:321#0
-CAACACACACCAGGGCCTCTCAGGGGGACAGGGGTAGGAGACCATCAGGACAAACACATGGATACATNCTCGTCNN
-+
-677777888888888888888888777765554402221000/-/---,,++++****))))(((('"%"$"#%""
- at 30BB2AAXX080903:3:41:758:1171#0
-AAGGAGAAAGAGTATTTCCAAACTCATTTTAAAAGATCAGCATTATTGTTTTTTTTTTAAAGTGAAGTTCCCCTTC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()(((''&&&%%##$
- at 30BB2AAXX080903:3:50:754:114#0
-AGGGAGGTGCCCGCGCTGGGTCGGAGGAGCAGGAGTATGGAGGGAAGACTCCTGGGTGGCATGGAGCTGCTGCGCC
-+
-6777778488888888888888887777655542302210///.+--,,,++****%*)((((((''""###$##"
- at 30BB2AAXX080903:3:46:922:951#0
-CTAGGCACTGCCCAGCCCTGTGTCAGCCAGGGCTGAACACCCACAGGATAAGGAAGCCTGAGTGCGTACCTCTCCT
-+
---777788888888888808282/77772525443022*0./...(,,),+++***&*%('(%(((%%$$#$$##$
- at 30BB2AAXX080903:3:52:920:1172#0
-GAGCCAGACCACTTGGCTCCCTGGCTTCAGCCCCCTTTCCAGGAGAGAGAATGGTTCTGTCTTGTTGGTTGCCCCG
-+
-67777788888888888888888877776555443222200//-.--,,++++*****))())((('%$"""#"#"
- at 30BB2AAXX080903:3:33:488:391#0
-AGAGAGCAGCAGATCTCCCTGCACAGTATTCGAGCTCTGATAAGGGTCAGACTGCCTCCTCAAGTGGNACTTCANN
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))'((('"%$#"$#""
- at 30BB2AAXX080903:3:4:1365:519#0
-GTCAGACTGCCTCCTCAAGTGGGTCCCTAACCCCCGTGTATCCTGACTGGGAGACACCTCCCAGTAGGNACACNGN
-+
-6777778888888888888888887777655144323220/././.---,+,++*)())()'((''#$"%%#$"""
- at 30BB2AAXX080903:3:3:1355:328#0
-AAATCAATAAACATAATTCATCATATAAATAGAACCAATGGCAAAAACCACATGCTTCTCTCAATAGANACACNCN
-+
-67777788888888888888888877776555443.22100./..---+,,++***)))())(((''%"#$%$"""
- at 30BB2AAXX080903:3:42:292:1971#0
-CACAGTGGTCCTTTTGTTCTTTGGTCCACCCATGTTTGTGTATACACGGCCACACCCTAATTCACAGATGGTCCAC
-+
-+7777788828888888888888877476055445222101//..---,,*++*)'**((')(('((%&%#"###"
- at 30BB2AAXX080903:3:58:334:753#0
-AGAATATGTATAAGTACAAATGGAATATGTTGGAAATGAGGAATAGTTAATATCACAGGTCATTTAAACACCTANA
-+
-67777788888888888888888877776555443222100./..---,-+,+****)*))))(((('&&&#"#"#
- at 30BB2AAXX080903:3:52:493:203#0
-CAGTCATGCACATCAGAAAATTAAATGGCGAGTCAAGACCAAATTCCTAGTCACAGTTATGTTCTGTTTCCCGGTC
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((('''"$$$$#$$#
- at 30BB2AAXX080903:3:36:280:920#0
-TGGTGTATGTTGAAGCATACAGATTGTCTACATCCTAAAAATCATTTTGGTGAATAAAGGAAAATACTCACGCGCN
-+
-67777788888888888888888877776552433522011/.-..--,,+++***))))((((''#$$"$"#"#"
- at 30BB2AAXX080903:3:1:516:1108#0
-ATTTGAGGTCACTTAGTTTGCAGAAATTTGTTACAGCAGTAATAGAACAAGTGGTTATCCATATGAGTNCANTTAC
-+
-677777888888888888888888777765554432221.0//..--,,,+'+*'))*(((((((('$"#""""#"
- at 30BB2AAXX080903:3:55:382:1444#0
-CACACCTCAGAGATTCTGTACATGTTCTTCCTCCTGCCTAGAAAGGATCGTCCCTCCACTTTCGCCAGCTATCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''"&#%$$"$%
- at 30BB2AAXX080903:3:52:260:1286#0
-TGTTCAGCCACACTGCTTTGGTGTCACAACTGCACATTGGTTTCACAGCTGCAGGACAAGTTCGAGCACGTTAAAT
-+
-6777778888888888888882887777655544322210///..---,,+++****)))(((((''"$"&%$$#"
- at 30BB2AAXX080903:3:37:1165:1340#0
-TGGTGGGAGGTGAGCTTTTACCAAGTTCCACCACCCCCAAAGTGTGTGGGGTTGCGGGCCCTGGGCTNTCATCACN
-+
-67777788888888888888888877776555443222101/...---,,+++***))))()()(''"&&&$#"$"
- at 30BB2AAXX080903:3:35:588:449#0
-TCATGTCTCCTGACACCCAGTTGCCTCTACCACTCAGATGATGTCAGGCCCAGTCCCTCAGTGCCCTNACAGCANN
-+
-67777788888888888888888877776555443222101//..---+,,******))()')('('"$###$"""
- at 30BB2AAXX080903:3:50:542:52#0
-GTCCTCTGAACTCCTGTCAGTTGCAGCCCAAACACTCCAGAGCTCGGATACCAAGGAGCAGCTTCTGTACACCAGC
-+
-67777788888888888888888877776/+,44322200,/...--,,++++))*'*)')(#'('%""$"$#""$
- at 30BB2AAXX080903:3:44:1308:706#0
-GAAATAGACCGTCAGGCACTACGGGAACTGACACAGGTGGCGTCCGGCACTGCATCATACTAGATCGGCTCGTCCG
-+
-6777778888888888888888887777655334322110,/..'.-,,,,)+**)*())((((#''%"#%"""""
- at 30BB2AAXX080903:3:57:1344:1654#0
-TGAGGGAGGTGACCCGTGGGCAGCCCTGCTGTCGCCCACGCGAGCTGCTCATTCCATGCACATGGCCATGCACCAC
-+
-6777778888888888388833862747+55$24101,,0&/-,)+-+,+**+))##((''(#''&#"$#$"####
- at 30BB2AAXX080903:3:3:1418:1533#0
-TCCCCACTCTCACTCGGTCACCCACTCCTTGAACTTGAGATCGGTGTCGGTGGTGCTAAAGCCATCATNGGCANAC
-+
-67777788888888888888888877776555542022101//.--+,,+*++'*)(()(&#''#&%""""&$"##
- at 30BB2AAXX080903:3:43:1681:586#0
-CATCCGAGTATGTGTAGGAGGAGGACAGGGTGTGACCATAGACTGCCAAAAGCTGCAGGTGGATCGGGGGGGGGAG
-+
-67777788888888888888888877776565343222100//..---,,++++***))()()((('$%##"""#"
- at 30BB2AAXX080903:3:38:1253:755#0
-GCGACCTCCCAGGCCCAAGTCCCTGCCTACCTCCCAGCAGCCCGAGTGCGACCCTGTAGATCGGAAGCGCGCCGCG
-+
-677777888888888888888880777.655544332210///.,-)--,*)++))(*))'((('%'"""""$"#"
- at 30BB2AAXX080903:3:44:523:644#0
-CCACGCGGACAGAGGTCAGCGTGATCCCCTGCCTCAACAGGCCACCGTGAGGGGGGAACAGGATCGCAGTCGGGCG
-+
-67777788888888888888888877776555443222100/....-+,++,+**+()()))(((('&##%%$$""
- at 30BB2AAXX080903:3:56:391:186#0
-CTTGCCTCACACCGGCCCCTCCCACGCGGACAGAGGTCAGCGTGATCCCCTGCCTCAACAGGCCACCGTCTACCAC
-+
-677777888888888888888888777765554432/2100/..,---,,++++***()))))('('$%$"#"###
- at 30BB2AAXX080903:3:39:1589:255#0
-TCCGGTCGGTGGGCTCCTCCACGCCAAGGTTGGGCCTCCCGGCGACCGCCGCAAGACCGGAAGAGCGGATCAGACT
-+
-677772888.8888888888088871776$454412,101//./,-,+-+))#&*%#'&(''(''%%""""$"##"
- at 30BB2AAXX080903:3:53:658:868#0
-GCGGCCTTGGTCGGCCCACAGCTTCCTCAAGCCAAGCTCCCCAGGCCCAGGTCAGGCCTCACGGTGGCTCCTACAG
-+
-67777788883888888888888877776555443222100//.--.,,-++++**)))*))(((''%#"""#%##
- at 30BB2AAXX080903:3:42:1336:435#0
-TTGGGTCTCCAGGCCCGATTCCTGCCTCTCAACAACCTCTTTGGACTCAGTGCCTACCCATCTCCTGGCGGCCCCC
-+
-677777888888888888888888777765554232221010/..----,*++*****))))()('''&&&#"""#
- at 30BB2AAXX080903:3:42:1023:641#0
-GTAGACGCTGACAGGAGGCAGGAGCGGGGCATGGACAGGTCAACTTGAGGAGATTTTGGGCCTTCATAGGCCCAGC
-+
-6777778888808888888888*8377765/5443202.0,/.-)--,,-+*+(+*)(%*('(('&'%&"####"#
- at 30BB2AAXX080903:3:54:707:1524#0
-CAGGCATGAGCCACCATGCCTGGCCTGGGCTAGTCCCATATTCTCTAGAGTTCTCTTTACTCTGTGCTAGCCACCC
-+
-67777788888888888888888877776555443122100/...---,-,++***)*))))(((''""%#&$"$#
- at 30BB2AAXX080903:3:39:1503:787#0
-TACGAAAATTCCAAATGTTAGTTGGGCATAGTGGCAAGCACCTGTAGTCTCAGCCACGTGGGAGGGTTGTGACGCT
-+
-67777788888888888888888877776555443222100//.-----,+,+*)***()))(((#%"%#%#""$#
- at 30BB2AAXX080903:3:2:970:1734#0
-ACGCTGCTGCTCATCTGAGAAGGTGGAGCTCAGGCGGGAATGTGAGCAAAGGGGAGTGGCTGGGAAAANAGCACAC
-+
-6777778888888888888.888&77176555443222.0./-.---,,++++***())(()(%#%#""$#"#$##
- at 30BB2AAXX080903:3:44:1580:667#0
-AAAGAACTCATATTACTTTACTTGTCACATTTCAACATCTTTCCTCAGCTTATTAGCTCTATTTCTTTTCTGTCTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((''&&'&&%&$$#
- at 30BB2AAXX080903:3:50:608:210#0
-ACGATGGAGCTGTGCCTGTGGAGGCTGGTGTGGGGCAGGAGGCTCATCTGCGGGGGCTGCCCCGGCGCCCGAGTCT
-+
-677777888888888888888888777*6545%43%,2..1/)#-+**&(+*+'**%#(&'%#(#%&""#"""##"
- at 30BB2AAXX080903:3:45:1267:1277#0
-ATAATCATGCCTCACTGCAGCCTTGACCTCCCAGGCTCAAACTTCAGCATTCCGAGTAGCTGGGACTACCGTTAGC
-+
-67777788888888888888888877776555443222100//..---,,+++++*()))))()(('""#"""""#
- at 30BB2AAXX080903:3:1:155:790#0
-TCAGCAAAGTGGGAATATTGTACAGTGTGTGTTGAAGTTCCTATACAACATTGTTTATCTAGTTTGGANTGNAGTC
-+
-6777778888888888888888887777655544322110,//.-'-,,,+)+***')#)()###('$""""####
- at 30BB2AAXX080903:3:35:28:1542#0
-AAAGTTCTTCTTGCTGTCAAAAGAATATGCGTGAATAAGTCATTTTTACTTATTCTTCTGTTTTTTTNTACTGCNN
-+
-67777788888888888,8888887/7765524532001*/./..-(,+,+*+*)*)))))())(%&""#$""#""
- at 30BB2AAXX080903:3:48:1531:1112#0
-TACCCTACGTCACGGCAGCCTTCGCAGAAGAGGCTAATGGCTCACAACACCCCCCCCAAGCACAACACGCGCTCTC
-+
-67777788888888888828'8)80377)5564$++(#(#)#*)'++$,$&)%&*'%'#(&&%'&&#&"$"""###
- at 30BB2AAXX080903:3:37:171:949#0
-GCTGTGCCTGTGGAGGCTGTTGTGAGGCAGGAGCCTCATCTGCGAAGGCTGGCGTGGCGTAGGGGGGCCCTGATCN
-+
-677777888888888888868888477005+11010,%/.--/.%.,-,(,&+***'(*##)(((##%%""##$$"
- at 30BB2AAXX080903:3:33:821:269#0
-CTTGTTTTCCTGCAACTGGATGTTCCCACCTGAGCGTGATGGGAGAAAGTGACAGATCAATAGGTATNACACTTNN
-+
-67777788888888888888882877776555443212100//...-,,+++++*)**)()))('('"$&###"""
- at 30BB2AAXX080903:3:2:1207:1193#0
-GGAATGTGAGCAAAGGGGAGTGGCTGTGAATACAGACGAAACTTACCCCACCCCCCCTCTCAGCACCANACACCTC
-+
-677777888888888888883388$7$&85,.$3/0/'&0&)).,.,,-(*$*+)#&#%'(###''%""$$###"#
- at 30BB2AAXX080903:3:51:246:835#0
-ACAGCAGGAGGTGAGCGGGGTCGAGTGAGGGAGTGAGGGAAGCTTCGTCTGTATTTACCGCCACTCCGCTGTACTC
-+
-6777778848888888885888857777645%4230221.0/'.-(-#,-+')***()#(')'&('%"##"#"#"#
- at 30BB2AAXX080903:3:42:632:166#0
-TCACCAACAGCCAAAGGCTTTATCAATCATGCTTGCATAATAAAGCCTCCATAAACACCCTGAAAGGGGTCGGCAC
-+
-67777788888888888-88888177776+5544322+0/0/0.-.-,,&)+*****)))()(((''&$##""#$"
- at 30BB2AAXX080903:3:36:113:1093#0
-GGCCAACACAACAAGACCCCATCTATACAAAAAATAAAAGAAACTAGCCAGATGTGGTGGGGGAGGGTGATACTGN
-+
-67777788888888888888888877776555443222100//..----,+++***)*))(('#((#""$$"$"#"
- at 30BB2AAXX080903:3:3:474:375#0
-AATGGTGCAGTCATAGCTCATTGCAGCCTTGATTGTCTGGGTTCCAGTGGTTCTCCCACCTCAGCCTCNCTCANCN
-+
-67777788888888883828888877456553443212100./,---,,-+,**()))'((((('&'&"&$&$"#"
- at 30BB2AAXX080903:3:42:876:1457#0
-CTGGAGTGCAGTGGTGCAATCAGGCTCACTGCAGCCTTGACCACCTGGGCTCAAGTAATAGATCGGAAGACTNCNC
-+
-67777788888888888888888877776555443122100//..---,,+,++**)*))))(((('&&$&$"#"#
- at 30BB2AAXX080903:3:42:318:823#0
-TAAGGAGTACACAACCTAGATCCCTCGCATGCACACTTCACAACAGAGTTTGTGCTCCTATGACAACCTAATGCTG
-+
-67777788888888888888888877776555443222100//..----,+++*****())(((((($&&%%%$##
- at 30BB2AAXX080903:3:3:160:1800#0
-ACCACCTGAGCTCCATGTCCTGTCAGATCAGCAGCAGCATTAGGTTGTCATAGGAGCACAAACTCTGTNGTGNNCT
-+
-677777888888888888888888/7/76/554422220./-/.,--++++)+*)))))')'('(''"""$#""##
- at 30BB2AAXX080903:3:47:1312:1872#0
-TGAGCCTGGCAGGTGGAGGCTGCAGTGAGCAGAGGTTGTGCCACTGTACTCCAGCCTGGGTGACAGAGTCCGTGTC
-+
-6777778888888888888888887777655544322200,-.-,---,-*+(+'***))((&#'(%$"#$%"""#
- at 30BB2AAXX080903:3:52:82:1955#0
-GGAACTAGCAGAGGCCAGGCATTGTGGCTCATGCCTGTAATCCCAGCAATTTGGGAAGCCTAGGCAGGACGGCACG
-+
-67777788888888888888888877776545413222100./.--,,+,++++*)))(()'(('''""##"""#"
- at 30BB2AAXX080903:3:40:721:346#0
-AGAGGAGAAAGAGTGTGCGTTCAAGGGGCAGATGAGGCTCAGTTGGACTCCATAGCAGATGAAATGGAGCGGGGTA
-+
-677777888888888888888&8877776555443222100/...--,-,+*+*****)))()((''$&#""""""
- at 30BB2AAXX080903:3:36:636:995#0
-GTATTTTTGATAGAGTCAGAGTTTCACCGTGTTGGCCAGGCTGGTCTCGAACTCCAGACTTCAGGTCGCGTGCCAN
-+
-6777778888888888888888887777655544322210.//...---,+++**)*)))(((((&&$%"""##""
- at 30BB2AAXX080903:3:1:83:1580#0
-GATCTCGTCTCTATGATAAAAAATTACCTGGACATGGTGGCACATGTCTGTAGTCCCAGCTACTTGGGNGCNCACA
-+
-677777888888888888888888777765544432221000/.-----,,++*+**)))()(((('""""""##$
- at 30BB2AAXX080903:3:49:1415:1092#0
-GCCCAGGCAGGGAAACCAGCACTATACAGACCTGAACAATGAAGATGGCACATTTTGTTCAGATCGGCACGGCTCA
-+
-67777788888888888888808877776555443222100/...---,,+++***))))))(((''$"$""#"##
- at 30BB2AAXX080903:3:41:862:1482#0
-CCACCCAGAGTAGTATGTAGAGGAGTCATTCAGGACCGTGCTCATACTTCATTGTATCAAATGGGAGATCCCTTTC
-+
-6777778888888888888888887777655544232200///..-,,,,,,++***()())()((&$%"&"""##
- at 30BB2AAXX080903:3:33:161:1240#0
-ATGAGCACGGTCCTGAATGACTCCTCTACATACTACTCTGGGTGGCTTGAAGTGAAAGATCGGAAGANTCTCACNN
-+
-67777788888888888888888877776555443222100//..---,,+++*+*)))))((((''"$##$##""
- at 30BB2AAXX080903:3:49:1185:745#0
-CCCTACAAAAAAAGCACAAGACAGAATGTGAGCCAAGCAGCTTAGGGTTTAGGCAAGGCTTCTGCCTACACGCCAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*)))(('('"#$%"#$#"
- at 30BB2AAXX080903:3:2:1543:2014#0
-AAGAAGCAGGCCCAGGCTGGGCGCAGTGGCTCATGCCTGTAATCCCAGCACTTTGGGAGATCGGAAGGNTGCNCTC
-+
-677777888888888888888883-7+765/5-&2/1*1&,+#,++&(++)&%&)))$(&##&'##%""%"#"#"$
- at 30BB2AAXX080903:3:44:1666:1166#0
-TGCCGTGGCTTGAGGGCAATGACGTGATCTCAGGTCACCACATTCTCTGCCTTCCAGGTTCAAGCAATTCTCTTGC
-+
-6777778888888818888888887777655544/2221/0//.----,,+++**))))())(((('%&%&&"#$$
- at 30BB2AAXX080903:3:36:1323:706#0
-CTTGAACCTGGAAGGCAGAGAATGTGGTGACCTGAGATCACGTCATTGCCCTCAAGATCGGAAGAGCGTNCTTCAN
-+
-67777788888888888888888877776555443222100//.,---,,++++)*))))))(((''$$"$"#%#"
- at 30BB2AAXX080903:3:49:40:1805#0
-CTGGAAGGCAGAGAATGTAGTGACCTGAGATGACGGCATTGCCCGCAAGAAACGGAAACAAGAAGACATATCGCTA
-+
-67777788888888888888888,7'776/5$44/022000+.+%+,+,(%*+**(&*%#((((%(#$"""$"#"#
- at 30BB2AAXX080903:3:47:999:1737#0
-TGCCTTAGCCTCCCAAGTCACTGGGATTACAGGTGCCCACCACCACACCAGGCTAATTTTTGTATTTTTAGCGGTG
-+
-6777778888888888888888887777655544321212///.,-.-,,+,++*(*)))(((((('"""##""""
- at 30BB2AAXX080903:3:33:1446:1159#0
-AGTTCGAGACCAGCCCAGCCAACATGGTGAAATGCCATCTATACAAAAAATACAAAAACTAGCCGGGNCATCTCNN
-+
-67777788888888888888888877736555443222100///.---,,+++***)))))(()(''"%"$$"#""
- at 30BB2AAXX080903:3:44:1695:922#0
-AAAAGTAGCTAGGGATTCCAACTAGGTGAGAAGGAGAGTGGGGCAGAGCCAGACCAGACAAGGACAGATCGGAACG
-+
-67777788888888888888888877776555443222100//..---,,++++**)))*)(((('''"%&&"#"#
- at 30BB2AAXX080903:3:47:1571:861#0
-ACTGGCGTGCACTCCTCCCCCCCCTCAGGCAGTGGCATGAGTTCCATGTGAGCGCTGAGATCGGAAGAGAGCTATA
-+
-677777888888888*88888888(77765,5)430./1*0$++.,+,&-++(+(#*()('(((&'%$"""###"#
- at 30BB2AAXX080903:3:46:1273:785#0
-CACTGGCGTGCACTCCTCCCCCCCCTCAGGCAGTGGCATGAGTTCCATGTGAGCGCTGTCCTGCTCCATCTGCTAT
-+
-6777778888888888888888887777655541322210./....-,--+*+**)())((((((('""$%$#"""
- at 30BB2AAXX080903:3:41:251:1302#0
-TGAGGCAGGAGAATCACTTGAACCTGGGAGGTGCAGGTTGTAGTGTGGTGAGATCACGCCACTGCACGCCCGACCG
-+
-6777778888888888888888889777655241222010/./-.---,,,++*))))())((((('%&$%&$"#"
- at 30BB2AAXX080903:3:58:277:1811#0
-GAGACAGGGTTTCGCCATGTTGGGCAGGCTGGTCTTGAACTCCTGACCTCAGGTGATCCGACTGGCTCCGTGACNN
-+
-67717088888818/,8888083716770352.$//+,*&-+*,,(**++)))$''(''(''&('&&$&"""$$""
- at 30BB2AAXX080903:3:45:892:521#0
-TGGCCGGTTCTCCTAGCCCCATGGCTCTAGGGATGGAGGACGCTGCAGGAGATGCAGCGCTCACTTCCCCGCTGAG
-+
-6777778888888888888888887775655544322210///..-+-,+++)+*))()('(''&&&&"###"$"#
- at 30BB2AAXX080903:3:49:1133:1296#0
-TGGGAATGCCTACTGGTTACCTTGGTAACAGAGAACAAGGCATTTACCTGATATGAGTGTCTTGGTTCTCATCCTC
-+
-67777788888888888888888877776555443210100//..--,-,+++***)*))())((''&"%"#""#$
- at 30BB2AAXX080903:3:59:222:828#0
-ACACCCCACCTTACCTGGTTTCTTCCTGCCAGGGCCAATCTTCAGACCTCAGGACTTTACAGCCTATCCCACTNNC
-+
-67777788888888888888888877776555443220100//..---,,++++**)))))(()((('&&###""#
- at 30BB2AAXX080903:3:52:62:1203#0
-AGGCACTGCGCATCCATCCAGAGGGGCACTGCCTCAGGCTGCTCGCTGTTCACTGCCTTCTCAAGCAGGCCCTTGT
-+
-67777788888888888828888877776555443222100./..,,-)%*'***))&)(((#'&'%""#$$####
- at 30BB2AAXX080903:3:34:365:1159#0
-TTGGTAGCTGTGAACTCTCCATGCCTCAGGGACCTGCAGAACTGAGCTCTGTCTGAGCCAGGTTCCANTCCCTANN
-+
-6777778888888888888888887777655244322111/...--,,,,)+***)*(()))'('''""$##"#""
- at 30BB2AAXX080903:3:44:1376:1446#0
-TTTGAGATGGAGTCTTTCTATTGTCACCCAGGCTAGAGTGCAGTGGCGTGATCTTCGCTCACTGCAACTACCACCC
-+
-67777788888888888888888877776055243222$0,).#--"-)-+''(#()'((&'#'(##%"""%"#"$
- at 30BB2AAXX080903:3:50:1603:38#0
-TTGATGAACATAGAAGTACTGTATGTAGAATTGACCCAGTGCTGCCCTGGCAACTTTGTAGATCGGACACGACCCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('$"$""#""#
- at 30BB2AAXX080903:3:36:1529:604#0
-ATTTCAGGTCACTGTTGGCCTTAGAAGAAGAGCCCAAAGGCAACAAGCAAAGGCGCTGGAGATCGGCGGCCCCCNN
-+
-67777788888888888888888877776555443222100//..---,,++++***))())((((#$#$#$##""
- at 30BB2AAXX080903:3:53:310:2026#0
-AAATACAGCGTCCTTTACAAAAGCAGTTTTGTCTTTCAAAGCGCATAGATAAGGCACTCAAGTAAATCCGTCNGCT
-+
-67777788888888888888888897776555343112020./,----,,,,+**#()))(((('''$"##"""##
- at 30BB2AAXX080903:3:3:1210:143#0
-CTTGAACCCGGGAGGCAGAGGTTGCACTGTGAAAAGATCACACCACAGCACCACAGTGCGTGCGACGCNACACNAN
-+
-677777888888882,88,,%8*2(7/;6$+')&3,2*$*&/+&,-&$$,)$#$###&#(#'#&##%$"$&"#"""
- at 30BB2AAXX080903:3:49:1671:1599#0
-CCCAGCTACTTGAACCCAAAGGTTCAAGGCTCCAGTGAGCTATGATCCCACCACAGCATTCCAGCCTGCGCTCTCA
-+
-67777788888888888888888877776555443222120...-.,,+,+*+***))))((()'('$#%###"##
- at 30BB2AAXX080903:3:35:811:1022#0
-ATGCGCGCTCCTGGAAGAACCAGCAGCCCCCACCGCGAGTTCTGATTGGCCCTGCGTGAGTGGTAGTNCGCCTCCN
-+
-6777778888888888888888887777155244322-1000/..+-+,,+,****%)()()(#'(%"%"&$#"#"
- at 30BB2AAXX080903:3:57:881:338#0
-CGCAGAGTCTGGCCCTTGCTGCGCCCGGCGCCGAAGACCGGGAAGTCGTAAAGCTCCTCCTCGCGGCCTGTGTCTC
-+
-6777778888888888888888887757655541122-/00/+..'--%,+++***)(*)()(#(('$&"%%"$##
- at 30BB2AAXX080903:3:42:1438:281#0
-TGAGACCAGCCTGCAGTGAGCCGAGATTGCACCACTGCACTCCAGCCTGGGAGACAGAGTGAGACTCCATGGATCG
-+
-67777788888888888888888877776555443222101/./..-,,,+*+**))()'*)(((''&$%"%##"#
- at 30BB2AAXX080903:3:56:879:710#0
-TCGGCTCACTGCAACCTCCACCTCCTGAGTTCAAGCGATTCTCCTGCCTCAGCCTGCCAAGATCGGACGGTCCTCT
-+
-67777738888888388888888877736)55443020101//---,,+,,++**(#*)((('((''"&"#$#%"$
- at 30BB2AAXX080903:3:33:687:808#0
-AGCCTACTCCAGGCCAGAACTGTTCACGTGCCTCCTCTCTGCTCGTGTCCTATATATTACCTAGCAGNCACTAANN
-+
-67777738888888888888888877776550443222100//..---,)++++****))))()(('"%##"""""
- at 30BB2AAXX080903:3:49:1285:1095#0
-CAATCTTTTCCAAACTCAAGGGAACTAAAGAGGCATGAAATCTAAATGCTTAATTCTGGATTTCATCTCTCGTCTA
-+
-67777788888888888888888877776555423222100./..----,+++***))**)(()(('%#$####"#
- at 30BB2AAXX080903:3:57:1680:1669#0
-TTGCATTCCATTCCATCCCATTCCATTCCGTTCCATTCCATTCCATTACATTCCAATATCGTAAGACAAAACACAA
-+
-6770*78/-288.).8()).88**-87+(/01&$(11*&*/-'#%-+'$(+*#$#'#'(######%#""#%%$%$#
- at 30BB2AAXX080903:3:47:403:759#0
-GACACAAATGGAACCAAATGGAATGGAATGGACTCGAATGGAATACAATGGAATTTAATGGAATGGACTCTCATGA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))))('''$%&%###$"
- at 30BB2AAXX080903:3:51:696:858#0
-TTCTATTCCATTCGAGTCCATTCCATTGCATTCCATACCATTCGAGCCTATTCCGTTCTATAGATCGGGTGATCGT
-+
-677777888888888888888888777765554432221/0//..-,,-,+*++**)*)))))(((%"""#""##"
- at 30BB2AAXX080903:3:8:1105:543#0
-GGAATGGTATGGAATAGAATGGAATGGAATGAAATGGAATATAATGGAATGGAATGGAATGGAATGGNTAGCGTNN
-+
-67777788888888888888888877776555543220100//..---,,+,++**)*())((((('""""#""""
- at 30BB2AAXX080903:3:44:1325:1215#0
-TCCATTCCATTCGAGTCCGTTCCATTCCATTCCATTCCATTCCTTTCCATTAGATCGGAAGAGCGGTTCCGCTGTA
-+
-6-+,7084,43882./.48823)2711*57.+)1+0,,00)*&+,+"*+(+)%))##(##%#(&#%#"##$"""""
- at 30BB2AAXX080903:3:34:1049:1521#0
-CAATGGAATCGACCCGAATGGAATGGAATGGAATGGAATGGAATGGAATGCAAGGGAATCGAATGGGNGTACTTNN
-+
-07777788888888888888880877776552443222100./(.---,,+++%**)()'))&('(&""$"%%"""
- at 30BB2AAXX080903:3:46:1548:427#0
-CATTCGAGACCATTCCATTGTATTCCATTCCAATCCTTTCGAGTCCATTCCATTCCATTCCATCTGAAGATCTGTT
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))(()(('$$"""""""
- at 30BB2AAXX080903:3:51:1655:1952#0
-GAGTCCATTCCATTGCAGTCCATTCCATTCGAGTCCATTACATTCCATTCCATTCGATATCTTTCACACCCCCAAC
-+
-67777788888888888888888877776555443022100//.-.--,,+++*+*))))(((((#'&"""%$$%$
- at 30BB2AAXX080903:3:33:1648:1554#0
-GAATGGAATGGAATGTAATGGACTCGAATGGAATGGACTGCAATGGAATGGACTCGAGTGGAATTGANACGTGCNN
-+
-67777788888888888888888877776555443222100//..--,,,,++***)*)))((((('"$#"#"#""
- at 30BB2AAXX080903:3:59:912:629#0
-ATCGAATGGAATGGAATGGAATCGAATGGAATGGAATGCAATGGAATGGATTCAACTTGAATGGAATGGCAGCTAC
-+
-67777788888888888888888877776555443222000//..---,,,++**)**))))((((''$%&"""#$
- at 30BB2AAXX080903:3:57:751:206#0
-TCCATTCCATTCCATTCCATTCCAGTCCTTTCCATTCCATTCCACTCGGGTTAATTCCATTCTATTAGTGTCCAGC
-+
-67777788888888888888888877776555443222100//-..--,-)++****)()))(((('&$%$%$#"#
- at 30BB2AAXX080903:3:60:912:688#0
-TCCATTCCATTCCATTCCATTCCGTTCCATTCCATTCCATTCCATTCTATTCTGGTTAATTCCATTCTGTTNTANN
-+
-+77777888888888888588888777765554833010.0/.-.---+,,++)****&))((((''&%$%"%$""
- at 30BB2AAXX080903:3:43:993:1371#0
-TTCCATTCCATTCCATTCCGTTCCGTTCAATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATTAGATCGGAC
-+
-67777788888888888888888877776455443222110//.-----,+++*****))))((('''$$&$%#""
- at 30BB2AAXX080903:3:44:1178:214#0
-TTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATTCCATTCCTT
-+
-67777788888888888888888877476415443222101./.,-,-,,+++*+*))*))))('('&#"&$%%#$
- at 30BB2AAXX080903:3:39:400:995#0
-CATTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCTTTCTATTCGGGTTAATTCCACTCTATTCC
-+
-6777778888888888888888887777655544322210.0/...--,,++++*+**)))()((''$'&&#%$#"
- at 30BB2AAXX080903:3:50:657:2028#0
-CATTCCATTCCATTCCATTCCGTTCCGTTCCATTCCATTCCATTCCATTCTATTCGGGTTAATTCCATCACTGCCC
-+
-677777888888888888888888727;6555442./210////.,--,,+,+***())*((((&'&"$"#""##"
- at 30BB2AAXX080903:3:59:1265:812#0
-TCATTCCATTCCATTCCATTCAATTCCATTCCGTTCCATTCCATTCCATTACATTCGGATTGATTCTANTCCACAC
-+
-67777788888888888888888877776555443222110//.----,,+,+**)))*))(((((&&"%$%#$$#
- at 30BB2AAXX080903:3:48:351:1053#0
-TTTCATTCCATTCCATTCCATTTCATTCCATTCCATTCCATTCGCTTCCATTCCATTCGTGTCCATTCCACTACAT
-+
-67777788888888888888888877776555423222100/..----,,+++*+***)))((((('%$"$%#$#"
- at 30BB2AAXX080903:3:54:1222:227#0
-AATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAACGGAGGTGT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))(('('$$$#$$%##
- at 30BB2AAXX080903:3:39:1420:1343#0
-ATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAATGGAACGGAACGGAATGGAATGGAATGGATTGGCA
-+
-67777788888888888888888877776555443222100//..---,,,++***)))))((((('"%$"#$"#"
- at 30BB2AAXX080903:3:49:821:672#0
-ATGGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAACGGAACGGAATGGAATGGAATGGAATGGTGGGGAG
-+
-677777888888888888888888777765554432221000/.--.-,,+++****))))(((('''##"#""""
- at 30BB2AAXX080903:3:34:280:817#0
-GGAATTAACCCGAATAGAATGGAATGGAATGGAATGGAACGGAATGGAATGGAATGGAATGGAATCANCTATCANN
-+
-67777788888888888888888877776555443222100/...--,,,++****)*)*)((((''"%"""$#""
- at 30BB2AAXX080903:3:48:16:1113#0
-AACCCGAATGGAATGGAATCGAACGGAATGGAATGGAATGGAATGGAATGGAATGGAATGAGATTCGCACCGCCAC
-+
-67777788888888888888888877076555443222000-/..-,,,,+)+***))*)))''#&''&%#"$#""
- at 30BB2AAXX080903:3:50:1555:334#0
-CGAATGGAATGGAATCGAATGGATTGGAATGAAATCGAATGGAACGGAATAGAATAGACTCGAATGTACTGGCGTC
-+
-67777788888888888888888877776555443222100/..---+-,+++***))))))'(((%$"#"""""#
- at 30BB2AAXX080903:3:2:192:240#0
-AATGGAATGGAATGGAATGGATTCGAATGGAATCGAATGGAACAATATGGAATGGTACCGAATGGAACNCAANNCA
-+
-6777778888888888888888887777655544322210//-..----,,,+***)))))))('('$"$$$""##
- at 30BB2AAXX080903:3:1:1473:728#0
-ATTGCATTCGATTCCATTCCATTCCATTCGATTCCATTCCATTACATTCCAGTCCATTCCAGTACATTNCTNTCCA
-+
-6777778888888888888'888837%76555-/02120(.//.----,&++%*'))*%(#'('(''&"%#""##"
- at 30BB2AAXX080903:3:57:904:835#0
-ATTCCATTCCATTCCATTCCATTTCATTCCATTCGATTCCATTCCATTCCACTAAATTCCATTACATTCCACTCCC
-+
-67777788888888888884888877776555443222010//.------+,+***)*))))(((('&%%"$"###
- at 30BB2AAXX080903:3:37:934:1167#0
-GAATGGAATGGAATGGAATTGAAATGAATGGAATGGAATCGAATGGAATGGACTGGAATGGAATGGAACCGCTTCN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)))(((('&$$$#"""#"
- at 30BB2AAXX080903:3:33:1272:1848#0
-AATGGAATGGACTTGAAAGGAATGGAATGGACTCAAATGGAATGGAATGGAATGGAATGGAATGGAANTCTCGCNN
-+
-6777778888888888888888887777655(44522210///..-,-,,++****)*))))(((('"%%"$"#""
- at 30BB2AAXX080903:3:44:337:904#0
-TTCCATTCCATTCCATTCCATTCCATTCCATTTCGTTCCATTCCATTCTATTCGGTACCATTCCATTCCATTCCAT
-+
-677777888888888888888888777765554432221/0//..--,,,++++***)()))(((('&&%%&%$#%
- at 30BB2AAXX080903:3:42:1397:1971#0
-GAATGGAATGGAAGCGAATGGAATGGAATGGAATGAAATGGAATGGAATGGAATGAAATGGAATGGAAACGAATAA
-+
-67777788888888888888888877776555443222100//..---,,+,+***)*))))((((''#"&"%$""
- at 30BB2AAXX080903:3:49:1324:1312#0
-CGAGTCCATTCCATTCCATTGCATTCCATTCCATTCCGTTCCATTTGATTCCAATCCGTTCGATTCCACGANCTNC
-+
-67777788888888888888888877776555443222100//..---,,+)+***))))))((('%$$""""""#
- at 30BB2AAXX080903:3:36:1037:1830#0
-CATTCGAGTCGAAACCATTCCATTCCATTCCATTCCATTCCATTCCATGCCAATCCATTGCACACGGGCTCACTNN
-+
-6777778888888%88888888884777*5554/2+2-10//-.,---,,+,++)))')('((('(#"#$""#"""
- at 30BB2AAXX080903:3:33:1525:1009#0
-CGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAACGGACATGAATGGNCTCACTNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((''"""##$"""
- at 30BB2AAXX080903:3:54:1169:1071#0
-TGGAAAGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGATTGAACCCGAATGAAATGGAAAGGGCTGTCAT
-+
-67777788888888888888888877776555443222100//..---,,,+++**)*)))((((('%""&&"###
- at 30BB2AAXX080903:3:43:1280:1724#0
-GGAATGGAATGGAATGGAATGGAATGGAATGGAATGGAATGGGTTCAACTCGAATGGAATGGAAAGGAGTGGCATC
-+
-67777788888888888888888877776555443222100//..----,,+++**)))))(((('&'"%%&"#""
- at 30BB2AAXX080903:3:48:183:1192#0
-GGAATGGAATGGCATGGAATGGAATGCAATGGAATGGACTCGAATGGAATGGAAAGGAATGGACCCGNCTGACACG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))(((((&""#%"$###
- at 30BB2AAXX080903:3:3:62:194#0
-TAACCACCGACCTTTTCTCCTCTGCCCTCCACTCACACTCTGCTCCATCACCCTCAGCCACACAGCTANCGCTNCN
-+
-67777788888888888852888877174555413220100...-+-,&,***+*))(()'((((#'$"#"$""""
- at 30BB2AAXX080903:3:4:1448:1688#0
-CGGCTCACTGCAACCTCTGCTTCCTGGGTTCAAGCGATTCTCCAGCCTCAGCTTCCCGAGCAGCTCACNACATNGN
-+
-6777778888888888888,88887777(555.4222211///.---,-,**')*))(((((('&#%"""%#""""
- at 30BB2AAXX080903:3:47:1765:1261#0
-TGATCTGGCTGCCTCGGCCTCCCAAAGTGCTGGGATTGCAGGCGTTAGCCACCATAGATCGGAAGAGCACTGCGCT
-+
-677777888888888888888888777765554432221/0//..---,,+****)**)())(((('"""#""###
- at 30BB2AAXX080903:3:4:1279:1169#0
-AAGCTGGAAACCATTATTCTCAGCAAACTAACACGAGAACAGAAAACCAAACACCACATGTTCTTATTNATACNCN
-+
-67777788888888888888888877776555443220100//.--,,,,+++*))))))((()(('"""$$$"""
- at 30BB2AAXX080903:3:35:1255:1788#0
-TCCCAACACTTTGGGAGGCCGAGGCAGGTGGATTACTTGAGGTCAGGAGTTCAAGACCAGCCTGGCCNTCATTGCN
-+
-67777788888888888888888877773551243222100/.-/---,++*++**(**)(((((&'""%%$%%""
- at 30BB2AAXX080903:3:3:170:1262#0
-GTTTCAACTAGATATTTGTAACACCTACATCCTTACAATGCAGTTAATCAGATGATTTATGTATTTTGNATTTNTT
-+
-67777788888888888888888877776555443221100./...---,+++****))))))(('&""#&""""#
- at 30BB2AAXX080903:3:58:604:211#0
-TAAGCACCAGTTTTTTTGGTGTTTTGGGTTCTTGGCATCCGTGCTCCCAGCCTGAAAGCTGCCCGTGGTCGGANNT
-+
-67777788888888888888888877776555443222100//..---,,+++***()))*)((''(&%%$##"""
- at 30BB2AAXX080903:3:55:1653:659#0
-GACAAGCAGCAGGCACTTGCTCTATACCAGGTGAGGGTGTGGAGACATGACGTGGTGCAGGAGATCCACCTCCTCC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))((((&&'#"%#"#%
- at 30BB2AAXX080903:3:48:1748:1106#0
-CTGCCCTCCAAAACACGCCACAGGGAGGACACATTCCCATCAGCATCAGGGGTTCATGCTAACACAGACGCACGCC
-+
-67777788888888888888888877776555443222100//.--.,,,++)+***)))()(((('$$"$"""##
- at 30BB2AAXX080903:3:3:277:575#0
-ACCATACATCCCACAGACCAATGTGTGCATAAATACATGCACAACCATACATACACACCATACATACCNTCACNCA
-+
-67777788888888888828888877776555843222100./.,,.,,,+++**)))())('((('$"$%$%"#%
- at 30BB2AAXX080903:3:46:1741:319#0
-ATACCACATGCACATGCAAGCACACACAATGGAGAATCACTGCCTCAAAAGCTCCTAGATCGGAAGAGCGTCATCG
-+
-67777788888888888888888877776555443222100//..---,,+'****))*))()(((($&%"#""#"
- at 30BB2AAXX080903:3:40:234:1345#0
-AAACATATCAAAGGAAAAGCACAAATACAATGTTCTCCAGAAATAGTGTCGCAGAAATAAAGACAGACTATGGAAC
-+
-67777788888888888888888877776555443221100//..---,,+++**))))*)(((('&"$%%%%$#"
- at 30BB2AAXX080903:3:1:9:362#0
-CTTTAAGACGGCGTTTCCCTTCTGCCAGATTGCACTCTGTGCACAGTGCAGTTGCTTCTCCCTGCGGCNCTNCACT
-+
-67777788888888888888880857774553082222100//..-+-,-+,++'+*()((((('''$"#""###"
- at 30BB2AAXX080903:3:48:14:1740#0
-TGAGTTAATTTTTGTATATGGTGAAAGGTAGGGGTCTGGCTTCAGTCTTCTGTATGTGGATAGCCAGACAGCGCAA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))'))(((('"$#"$##"$
- at 30BB2AAXX080903:3:48:101:663#0
-ATGGGAACCACACATGTAAACACTGAGGTGCCCTGCCACGCCAGTGAAGTGCATGCTGCTCGAGATCNTCACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))()((('""$#$""##
- at 30BB2AAXX080903:3:1:1054:894#0
-AGCATGGGAACCACACATGTAAACACTGAGGTGCCCTGCCACGCCAGTGAAGTGCATGCTGCTCGTGTNACNTGTC
-+
-2777778888888888888888887777/55.4432220/.///-,,+-,++(+'*)*)))'('(('&""$""""#
- at 30BB2AAXX080903:3:54:1240:1096#0
-TGCAGCTGAGATGGCTGCTCCCCGGTGGGGTGTGTGCTCGGCCTGCAGTCCCCGCCCTCCGGACTCCGNGCGCCAC
-+
-67777788888888888&88888877776555243201100+./.-,-+(+**))))')(((&('('%""#"####
- at 30BB2AAXX080903:3:4:80:2016#0
-CTTGTAGGTCACGCAGTCCAGGGATGCAAAATTAGAAGACAATGACGAGGTGCAAACCTGAGAGCGGCNTCACNAN
-+
-6777778888888888888888817773)3,542323200./-.---,,,&++)*)((((()(((''$"#%$$"""
- at 30BB2AAXX080903:3:50:623:175#0
-GTGTAGACAGGGTAGTTCTGCTGTATAGGCAGGGAAAATAAACAGGGGGGGGTCTTTTGGGGGTCCACACCGCTCC
-+
-63777788888888888808878,767765,544-0%20/,-&,,--,,,&(#$*)**(#)&###%#$"$$"#"##
- at 30BB2AAXX080903:3:1:1446:870#0
-CTTGCCTGTCCAGCAGATCCACTCTGTCTACACTAACTGCCTGCCCAGCAGATCCACCCTGTCTATACNACNCATC
-+
-6777778888888888888888887777654544322111/./--&(,,+++))**())()%((&''&""%"###"
- at 30BB2AAXX080903:3:1:1329:683#0
-AGGGAGGTAGTGTAGACAGGGTGGACCTGCTGGATGGGCAGGGAGTATAGACAGGGGGGGTCTGCTAANCCNACGT
-+
-67777788888888888888888896636755461222.*0/#.-$+,+++(****'()####(###""#%""$""
- at 30BB2AAXX080903:3:3:1563:415#0
-AGAAGATCCACCCTGTCTACACTACCTTCCTTGCCAGTAATGCACGCTATCTACACTATCTGCCTGACNCCTANCN
-+
-67777788888888888888828877776355423220100/..,-+--,+++)*#**)(((''(('$"#""%"""
- at 30BB2AAXX080903:3:51:838:1846#0
-GTGGATCTGCTAGCCAGGCAGATAGTGTAGATAGCGTGCATTACTGGCAAGGAAGGTAGTGTAGACAGGTGGCGCA
-+
-67777788888888888888888877776555442222000//..---,-++++**&*)()'(((##"""####"#
- at 30BB2AAXX080903:3:3:745:1796#0
-ACTACCTGCCTGCTCAGCAGATCCACCCTGTCTATACTAACTGCCTGGCCAGCAGATCCACGCTGTCCNCACNNCG
-+
-67777788888888888888888877756503311.02././.-.(,++-+**))(#)())((''%&""#"%""##
- at 30BB2AAXX080903:3:45:1752:49#0
-TAGACAGGGTGCATCTGCTCGACAGTTAGGTAGTATAGACAGGGTGGATCTGCTGGACAGGCAGGGACACAGCCCT
-+
-6777778888888888888888887777655544322210///.%---+,,+++**))())(&((##$"#""#"#"
- at 30BB2AAXX080903:3:53:490:1603#0
-ACCTGCCTATCCTGCAGGTCCACCTTGTCTACACTACCTGCCTGCCCAGCAGATCCACCCTGTCTACACGACCTCC
-+
-67777788888888888888888877776555443222100//..--,,-++++*+**)*)()((('&&#&$&$"%
- at 30BB2AAXX080903:3:42:63:347#0
-GGCAGGTAGTGTAGACAGGGTGGATCTGCTGGGCAGGCAGGTAGTGTAGACAAGGGGGGCCTGCAGGAGCCACCAT
-+
-67777788888888888888088877776555443222100-/.----,,+)+**)))(')')('(&$"$""##""
- at 30BB2AAXX080903:3:54:1652:795#0
-CAGTAGATCCATGCTATCTACACTACCTGCCTGGCCGGCAGATCCACTCTGTCTACACTGCCTGCACACCAAAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)*)))((('(#%%%%&&%#"
- at 30BB2AAXX080903:3:52:1348:912#0
-ATATCCTCATTGAGTTTTAAAATTTATTTACATGGGTCTACAAATTTATTTCAAATCGTAGTCAAGATCGGAATAG
-+
-67777788888888888888888877776555443222100//..---,,+,+***()*))))((('"%&$""#$"
- at 30BB2AAXX080903:3:45:1412:902#0
-AAGGGAAGGCTATGGGTGAGTTGGGAAATGTGTTAGGCAGGGTCAGAGATTACCACATCCTAAGATCGGCGGGAGC
-+
-67777788888888888888888877776555443222100/).,-,-,,,+***))(()((((((&"&##"#"#"
- at 30BB2AAXX080903:3:51:263:649#0
-ATTCTGTCCTCCATATCTCTGCTGATTCCCATTTTGTCTATTTCCATTTACCCCACTACTGCTTGCTACTCTACAT
-+
-67777788888888888888888837776525443211100///-,--,,+*++*+*()))))((''"$"#""##"
- at 30BB2AAXX080903:3:55:458:1928#0
-CCATATCTCTGCTGATTCCCATTTTGTCTATTTCCATTTACCCCACTACTGCTTGCTCAGGTCACTCTTCTGCGCT
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))))(('&$$&$$##$
- at 30BB2AAXX080903:3:39:1734:535#0
-AATCGCCTCCCACTAGCGGTGACTGTTGGGTGTCTACCCTCCCGGAGTCCTCCTGAGATCGGAACAGCGTGTGTCT
-+
-677777488888888888838888777765253(*.2*+/1...-+-)-,&%+%+(%)('((''#%'&$$"&#%##
- at 30BB2AAXX080903:3:54:1563:87#0
-AAGGGTTGGGACTCTGCTTCCCAGATGGTACCTTGTGGCTGGGGCCTCACGCGGCAGGAGGGGGAAGCACAGAACA
-+
-67777788888888888888888877776555443222100//(*,,,,,++)*'&))&))')''#'$%%%"%#$$
- at 30BB2AAXX080903:3:4:1598:961#0
-TGGGAAGCAGAGTCCCAACCCTTGCCAGACACTGAGCCCACTGGTGCTTTATCTTGGACTCCCAGCCCNTCACNTN
-+
-6777778888888888888888887777655544322110///.,.--,,++)***)()(((('('#$"#"#$"""
- at 30BB2AAXX080903:3:40:661:1840#0
-TGCAGTGGCGTGATCTTGGCTCACTGCAGCCTCCACCTTAGAGCAATCCTCTTGCCTCCTCCTCCCGCCATATTCA
-+
-677777888888888888888888777765554432+,1/0//----*,,++++***)))(((('(("""""%##"
- at 30BB2AAXX080903:3:55:1134:126#0
-CACCTTGGCCCTGCTCGTGGTCCTGCTGTGGGGCACTGGTCAGGTGAGGGTGGGGGGTCTGCAGAGCCGCCGGCAA
-+
-677777888888888888888888777735554421221-0//.)---,+&++**)#))))('((#%"&##""$"#
- at 30BB2AAXX080903:3:2:606:1744#0
-CTGAGGACAAGCACAGGCTGAAGCAGGGGAGCCCTAGTCCTCTCAGTTGCAACTTCCTGGAACGGTGTNTCTTCAA
-+
-6777778888888888888888884777635544122//0.0.--.$,-+**)&((((&)'((((&'$"#$#"#"#
- at 30BB2AAXX080903:3:41:1024:24#0
-TGCCACACCTGGGATGGGGCTCCCACCCTCTGAGGACAAGCACAGGCTGAAGCAGGGGAGCCCCAGTCCTCTCACT
-+
-677777888888888888888888.7770525143012./1..-,-,+-+)++***))&('('#'&#%$%&$$"##
- at 30BB2AAXX080903:3:47:1021:565#0
-CCAGAGCGACACCCTTGCTGCATGAGCCAGTAGCTGGGTGGGCATGGTAGCCTCTTGTCTTCCTAGCTTGCTACCA
-+
-67777788888888888888888877776555443222000//..--,,,,++***)))))))((('$$"#""#""
- at 30BB2AAXX080903:3:55:1356:699#0
-GCTCTGATATTGCTCCTCAGAGGGCACAGCCTTGGACTAGCACACAGTCTCTCCGACCACCTGTGGTATCAGAACA
-+
-67777788888888888888888877776555443222100//..---,,+++**+)*))())(('''&$"$$$$$
- at 30BB2AAXX080903:3:36:1646:1470#0
-GACGCACACACCTGGACGCACACACCTAGACAAACACACCTGGACACACACACCTAGACACACACACTCACACCNN
-+
-67777788888888888888888877776555443222101//-.----,++++*****)))()(('"$%&%$#""
- at 30BB2AAXX080903:3:47:276:804#0
-AGGTGGACATGACCTCAAGCTCCTGGGCCCGTTGCCTGGGATGCATCCCAAGGCACGCACCAGGACCGAAGAGGAC
-+
-677+774888888888888883880774635.24"1-.10)+.*-,,,,++****()()('(((&'&$""""""##
- at 30BB2AAXX080903:3:46:234:1718#0
-GGAGACCTGTGGCTCTGGGAGCCCTTAGGTGGGAGGAAGGATCAGTGTCTCTTCCAGTTAGGTTTGAGGGGGGGGG
-+
-6777778888888888888884'87777645544321110-.,/.,-*+-+++$*(*'*()(#((%%"$""""#""
- at 30BB2AAXX080903:3:48:1600:567#0
-CTCTCTCCTTGGCGTGCAGATGCCATCCTCTGTGTCCTCACACGATCGTCCCTCTGTATGTGAGATCGGCTNACTC
-+
-67777788888888888888888877776555443222100//.-----,,++******))((((''&$##""###
- at 30BB2AAXX080903:3:37:1240:1356#0
-GATGTATCCAAGACATTTTCCCTGTTTCAGGTCATTACTCATCTTGCGCAGCCACTGAGCAAAGCGGGTCCTGCAN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))((''"&%$$%"$"
- at 30BB2AAXX080903:3:58:821:673#0
-GAGGAAGAAGCCGAGCGCGATTCTCCAACACACTGGGGTAAGTACTGGCTGGCCTATGTCCTGGGTCGTCCCAACA
-+
-67777788888888888888888877776555443222000//..---,,++'+'))*)')((('#''%##%"#$%
- at 30BB2AAXX080903:3:8:973:854#0
-TACTTAGGAGGCTGAGGTGGGAGGATCCCTTGAGCCCAGGAGTTCAAGTCTAGCCTGGGCAACATAANACACACNN
-+
-677777888888888888888888777765554402.010//+--.+-+,,++*))**)()''('(&"$$$&$#""
- at 30BB2AAXX080903:3:34:1467:1720#0
-ACTTTGGGAGGCCGAGGCGGGCAGATCACTTGAGGTCAGGAGTTCGATCGGAAGAGCGGGTCAGCAGNCACTGTNN
-+
-67777780888888888.88838847101/51-32,)-/10/,.',*+*++('*)*#)(#'%#(#''"&"$"""""
- at 30BB2AAXX080903:3:57:784:1586#0
-ATCCTCTAGGCCTCTGTAAGCTTCTAGAAGGAAGAAGTTACGTCCTTTAGAGTAATAAAATTCCTCAGATCTCGCT
-+
-67777788888888888888&.*8677765534432%21/&/...-+-,,&***+)))))(((&('''&%&##"#"
- at 30BB2AAXX080903:3:46:658:1178#0
-TTAGTCTGCTCTGGAAAGCAAGATGTGTGCAGATGAGTGACGCAGTGCATCGTGTGGATGCAAAGGGATCTAGCCC
-+
-67777788888888888888888877776555443222100//..----,,++***))))()(('('""#""""#"
- at 30BB2AAXX080903:3:59:979:1032#0
-AGCTCCCCTGGGCTTCACATGGCCATGGAGCACCCAGCAAGTGTAGGCTCTGAGCCTTCAGGGAGGGGGGNAACCA
-+
-67777788888888888888888877776555442222000-/-----,,,+****))*)))((((''"#"$###$
- at 30BB2AAXX080903:3:56:1003:1204#0
-CACATATACACCTGTGTGCATGTGTACATGGTATTTAAGCATGTTTGCACGTGTGTTTGTGCTTGCATGTTCACTC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))))('(''$$#"##"#
- at 30BB2AAXX080903:3:38:1745:1480#0
-CTCAATTCTCAGCCTCCCCACAGCCCAGACTTTCTGTTTTAACCTCACAGCTGCCCAGCGTGATGGCCTTGTAGNN
-+
-67777788888888888888888877776555443222100//..----,,,++*+**))')''((#%$"""""""
- at 30BB2AAXX080903:3:35:1708:161#0
-CCAGTGCTGTGTTGTCATTTGCAAGTTCTTCCTGTGACTGAACTCCAAATGGCACTGGGACTGCTGANCTCGCGNN
-+
-67777788888888888888888877776555441222100//..--,,,+,+*****))*(()(('"$#%"##""
- at 30BB2AAXX080903:3:57:1432:1376#0
-AGGAACTCATGCTGGCCTGCCGGTCCCACCTGACCTGAGAGTGGCGGGGACTCAGCGGGTTAGGAAGCAGTATCCT
-+
-67777788888888888888888877776555443222100//..---'&$&)**')##)%#'##%''""$""###
- at 30BB2AAXX080903:3:34:1180:687#0
-GAAACAAGAGGGCACTGTATGCAAACATCTCTTGAACTCTGGAGTCTGCTCACCTTCCTGCCTCAAGNGCCTCTNN
-+
-67777788888888888888888877776555443222100//.----,,+++++*))*))((((''""%##%#""
- at 30BB2AAXX080903:3:52:580:1028#0
-CCGGGTGGGGGACGGGAATGGTGGGACTGGGGATGCCACGGGACAAGGCTGCTGGCCTGGAAGGGAGCTACATAGT
-+
-67777/88888888888888878877776555443211200/0.,---,,++++*))())'()(#'($$$#"""""
- at 30BB2AAXX080903:3:51:1291:628#0
-CCATCCAGATGGGAGGCTGAGTGCAGAGCAAACGGAGCCCAGCACTCCAGAGCCGTGTCCCTTCACTGACGCCACA
-+
-6777778888888888888883887777:555443221)00//..---,,+++***)))()')((('"$#""#$$#
- at 30BB2AAXX080903:3:2:450:502#0
-GTAGTGATGATTCTAGCACCTTCCTCAGGTTTCTTTAGATTCCTGGTTCTACCTGCATGGAGCATTTCNAGCTACA
-+
-67777788888888888888888)77776/55443222000/.-.-+,+-,+)+**))*)(((((''"""#"####
- at 30BB2AAXX080903:3:46:1623:1211#0
-CTCTGGGCATCAGCGCCAGGCCAGCGAGTAGAGAAGTCCGGCTTGGAGAGTACAAAACAGGCGCGATGTCACTGGT
-+
-67777788888888888888888877776555443220000//..-,-,,*+*)***()))(('(#'$##""#"""
- at 30BB2AAXX080903:3:38:1060:1246#0
-CCCAGCATGGTCAGGGCATTCTGGGCAGAGGAACTGATAATCAGCCCCTCAGCAACCGCAGAGGGAATGCTGTCTC
-+
-6/777788888288888888888877776555.13220&0,//.,-,,+,**+$)*)))(((%(%%%"%$%$%$$$
- at 30BB2AAXX080903:3:2:913:963#0
-GTTCCCCTCTGATATGGAGATTGGTGGAGAATGACCAGGATATTTTATGTGGCAATGGGGGTTGAAGCNCTCACAG
-+
-67777788888888888888888877776555443512100//.,-.-,,++****)*)))%(('('&"&#%%%$$
- at 30BB2AAXX080903:3:44:1217:1380#0
-GAAAAGGAAGGGGGGCACCTACAGTTGCCAGTTCTGTTTGGAAGTGAGGGAGGGGAGGGCAGATTCCCATACTCGC
-+
-6777178888888%88888888882177635,4422)2100//.'---,,*+****))))()((&(#'#%#""""#
- at 30BB2AAXX080903:3:52:1334:429#0
-CTGGAAGTCCCAGGCTTTGCCATCTCTGGTTCCCCACTTCCCCAGTTTCGACGCTCTCCTCTCTCCCCCCCCGCTC
-+
-67777788888888888888888877776345443222100//-.-,-,,+,)+*))**(((((((("$#%%%#"$
- at 30BB2AAXX080903:3:58:1105:328#0
-TGCAGCTCTGGTCGGGCTCTAACACATGCATGGCTGGCATGGATGCCCAAGTGTGCCTGGGGAATAGACGCNTCNG
-+
-677772888888888888888888777765454432+-/10/.-,---&$)*+)*))'(()''&#'%&$&"""#"#
- at 30BB2AAXX080903:3:2:1622:87#0
-CAAACAGAAGGACATGCTCAGTCCTAAAGGTTCTTTGTGGCCCAAGATGTTCTGGCATGAGAACTGACNCACAGTA
-+
-67777788888888888888882/78746515-4521010,.-.,.,-,+*%***&)))((((&%'#'"$%##""#
- at 30BB2AAXX080903:3:47:1300:1883#0
-CACCTGTGCAGCTCATCTGGCCATGAACCTCTCCAGCTCACAACTCTGTTTTCTCCCTGTTGTTTCTCTGAAACCA
-+
-67777788888888888888888877776555443222100//...---,+++****))))((('('"&$"""##"
- at 30BB2AAXX080903:3:58:1536:676#0
-GGCTGTGATAGGGGTCAGATGGGTGACAGCCACATGAGAGGCCGTCCGCTTGGGTGTGATGAGGGGACACAACATN
-+
-6$.72'2,8888)/$88-2/0-4,7-(5+$$1'33-.,)-))','$+#+)+&#*##'(##''####&$$%&"#"""
- at 30BB2AAXX080903:3:35:516:1417#0
-ACGTGGAGGCTACCACGGGCATCGCTGCTCTGCAGTCTGTCAACCCGAGGCCCCTGGTGCTGAGATCNCTACGTAN
-+
-677777888888888888888888777765551/33021.-+.,-$-,-,*')*')*&*())'(''%"##"$"#""
- at 30BB2AAXX080903:3:51:1678:170#0
-CACGGCCTTGGCAGCTTCACCAACAGGAATGTGTTCTCCTAGGGTACTGGAGGGTGGCAGTCCCAGACAAAAACCA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))))('(&$$%%%&%$$
- at 30BB2AAXX080903:3:33:1002:1269#0
-CTCCCTCTGCACTCACATCCCTGACGTCCTCCCGTGCCCTCACGTGGTCCTCCCCCTGCACTCACAGNCTGCACNN
-+
-6777778888888888888888887777655548321-1000/.-.,,,,+,++**))))))(((('"%#"#"#""
- at 30BB2AAXX080903:3:49:742:220#0
-TGCCCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGAGCCCTCACGTGGTCCTCCCTCTCCCC
-+
-67777788888888888888888877776555443222100//..--,,,+++***)))(()(((('$%#%#$###
- at 30BB2AAXX080903:3:54:954:1661#0
-CACGTGAGGGCACGGGAGGACGTCAGGGATGTGAGTGCAGAGGGAGGACCATGTGAGGGCGCGGGAGGTAGACGTC
-+
-6777778888888888888818.87777*$53442221.00//.---,',,++))**()(%((((#&&"#%"#"""
- at 30BB2AAXX080903:3:40:1533:1397#0
-TCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGTGCCCTCACGTGGTACACCCCACGCACTGACTGCCCATCA
-+
-607777888888888888888$8*7777*5554432+210/1/..---,(++**))*)%&'(&'##'"&&%&#"$"
- at 30BB2AAXX080903:3:52:132:269#0
-CCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGAGCCCTCACATGGTCCTCCCTCCTCCCTCA
-+
-67777788888888888888888877774555443222100//..-,--,,+++*(')((()((('#$#$%"###"
- at 30BB2AAXX080903:3:38:276:828#0
-GTCAGGGATGTGAGGGCAGGGGGAGGACCACGTGAGGGCTCGGGAGGACGTCAGGGATGGGAGTGCAAGCACGCAC
-+
-60777788888888.8888888887777656554-2221////..---,,+++++*())'*(('(&#"$###""##
- at 30BB2AAXX080903:3:37:121:300#0
-GCACGGGACGATGTCAGGGATGTGAGTGCAGGGGGAGGACCATGTGAGGGCTCGGGAGGACGTCAGGTCCACCTCN
-+
-6777778-888/8-888888888857676.55242.2201/.%-*.+,+,+%****)*)&((('#('&$%#$##$"
- at 30BB2AAXX080903:3:46:1353:1444#0
-CGTGAGGGCACGGGAGGATGTCAGGGATGTGAGAGCAGGGGGAGGACGATGTGAGGGATCGGGGGGACACGTAGAG
-+
-67777788888888888888/888771765514&3022100/)..,"&,,+'+***)*)'))(#(''%"$""##"#
- at 30BB2AAXX080903:3:1:464:1309#0
-ACCACGTGAGGGCACGGGAGGATGTCAGGGATGTGAGTGCAGGGGGAGGACCATGGGAGGGCGCGGGCNGCNCCTC
-+
-077777888888888888888308476765-541332/1.).+./----%()'(*#)$)()'#((''"""%"##"#
- at 30BB2AAXX080903:3:48:1739:132#0
-ACTCACATCCCTGACGTCCTCCCGTGCCCTCACATGGTCCTCCCCCTGCACTTGCATCCATGACGTCCGCCTGCAC
-+
-6777778888888888888888887777655544322.100//..-*-,,++%***))*)')(((&'%##"""##$
- at 30BB2AAXX080903:3:45:1790:766#0
-GGGCATGGGAGGACGTCATGGATGCAAGTGCAGGGGGAGGACCATGTGAGGGCACGGGAGGACGTCACGGCTGTGG
-+
-67777788888888888888888877776555443220100/.---,-,,+++++***)))()('('%%"#"#"#"
- at 30BB2AAXX080903:3:35:469:1825#0
-ATCCATGACGTCCTCCCATGCCCTCACGTGGTCCTCCCCCTGCACTCACATCCCTGACGTCCTCCCGNCCTCTACN
-+
-67777788888888888888888877776555333002100/.-/-,,,,,++***))))(()('('"#"#$"#$"
- at 30BB2AAXX080903:3:60:995:1902#0
-AAGACCTGCATTTCTTCAACAACCCACACTGAGAGGCTTTCCTGTACTTCTGACCTGTGAGGTCGGGACACNAANN
-+
-677777888888888888888888771745524432/210,./.,.,*-,+++*')*)*((&(&((#%$"$"$"""
- at 30BB2AAXX080903:3:54:332:584#0
-GTGTGTGCTCAGCAGCCACGTGGCTCATCTGCTGGGAGCTTGCTAAATACGATGTTCTACAACATTGCCTAACCAC
-+
-67777788888888888888888877776555443222100//.-.-,-,+++*)***))'()((('"$""$%##"
- at 30BB2AAXX080903:3:57:838:417#0
-AATACTTGATGTTACTTTGTTTTATATAAATGTGTATTTCTACGATAGTTTTAGTGTCATCTAATATTTTTTTGCT
-+
-67777788888888888888888877776555243222100//.-,,-+,++*)+*)())'((((''&&"&%$#$"
- at 30BB2AAXX080903:3:35:1555:774#0
-GGAGTCAAACCTGAGACGGGCTAACCTCGCTGCAGGTGGAGCAAATGAAACCCCCTCCCCCCGAGATNCGTGACCN
-+
-677777888888888888888888777765554432/21/0+/./,--,-,++**'***((%'&('#"$"#"###"
- at 30BB2AAXX080903:3:59:568:1055#0
-CATTTGCTCCACCTGCAGGGCGAATGGTGCTCTCACCTCACACGTGACACTTGGTCCTTTTTGCATTATGACGCGC
-+
-67777788888888888888888877776555443222100...,.,-,,,++***))()))((('('%&#$"$"#
- at 30BB2AAXX080903:3:43:29:929#0
-TGAGAGCTGTAACTGCCTGCAGGGTTTCCAGCTGACCCACTCCCTGGGTTGGGGGAGTGGGTCTGGGCGCTTGGAC
-+
-677777888888888.8888888877776552443'1.100/...---,,+*+***)))()'&(''&""#"""""#
- at 30BB2AAXX080903:3:3:1355:516#0
-GCCGTGACGGGGGTCACGGGCAGCCATCATGTTCTTAGCATCAAACATCTGCTGGGGGAGCTCAGCGCNATCANAC
-+
-677777888888888888881883177/5550413200/./-.--+,,$+******#(#'#&##'##""#"$#"##
- at 30BB2AAXX080903:3:1:711:1825#0
-ACACCGGGCTTGATTCCTGCCTAGTCCCTGCCAGATACCCCATGCCCACCTGGTGAAGAGAATGAGGCNCCNCACC
-+
-2177778888888888888888881717453-311.21//.+-.--,,,,*+*'*'()()'(&('(''"#%"####
- at 30BB2AAXX080903:3:43:408:934#0
-GAAGGGCCTATCCCCAAAGGTGCCACCCTCACCAGGCTCATCCTGACAATCTTGGATTATTTTTTCCCTGAAGTTT
-+
-67777788888888888888888877776755443212110//...-,,,,+++***)))))((((%'&%"##"$#
- at 30BB2AAXX080903:3:53:200:101#0
-ATGGGCATGCCTAGGGGACCTGGGGTAGCGCCTGTTCATCTCCCCACCCCTGGCCCATGCTGGCTTCAGTTTTTCT
-+
-6777778888888888888888887257652543222/00/0-.-)-,+,)*+&)#&('(''((&%#"#"%"""#$
- at 30BB2AAXX080903:3:3:755:871#0
-GTGGGCGAGCGTGGGGGAGCGTGGGGGGGTGTGAGAGATCGGAAGGGCGGTTGAGCGGGGAGGCCGGGNACACNAC
-+
-61777288828888.22-1)8&85*77$6+0'/$-((*%&/-#+,$(&+%&$#$#&##%#&####&#""$#"#"#$
- at 30BB2AAXX080903:3:60:1648:767#0
-CGCCCACACTCGCCCACACTCCCCCACACTCCCTCACAGTCGCCCACACTCCCCCACACTCCCCCAACACACCANN
-+
-67777788888888888888888877776555143222100//..---,,+,++)*)*))))(((&''"%%&"%""
- at 30BB2AAXX080903:3:33:643:1909#0
-TGGGGGAGCGTGGGCGAGTATGGGGGAGCGCGGGCGGGTGTGGGGGAGCGTGGGGGAGTGTGGGGGGNCTACCCNN
-+
-6777778888388888888888887707$5$944/0#1+%1/..-.+-),*++)*)&(#(&(&(''#"$""%##""
- at 30BB2AAXX080903:3:2:1122:671#0
-ATCACCCAGGCCCTGCAAAACTGAGCCACCAACAACCACCTGCACCACTTCCCAGGAGGCCAAATAATNCATAACC
-+
-677777888888888888888888777765553431-11-/-/,-',,,+,*)*#)()))#((('''$"%""####
- at 30BB2AAXX080903:3:3:1518:98#0
-GGAAGATTGAATCAGTAATCGAAAACCCAGCAACAATGAAAAGCCTGGAGCAGATGGCTTCACTGTTCNCACANCN
-+
-677777888.888888888&888873+165+54,3102100/.)'(,,*((+**(*(#''#'#((&%&"%#%#"#"
- at 30BB2AAXX080903:3:57:563:576#0
-TTTGTAGATTCTGGATATTAGCCCTTTGTCAGACAGATAGATTGCAAAAATTTTCTCCCGATCTGTAAGTGTACAT
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''&&%"""##"
- at 30BB2AAXX080903:3:56:729:528#0
-TAGCAATTGTGAATGAATTTCATTCATGATTTGGCTCTCTACTTGCCTGTTGTTGATGTATAAGATCGGCTGAACG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('&&""""##"
- at 30BB2AAXX080903:3:47:1590:997#0
-TGAAGGGATGTTGAATTTCATTGAAGGCCTTTTCTGCATCTATTGAGATAGTCGTGTTGTTTTATGTTNCCTTATC
-+
-67777788888888888888888877776555443222100//...--,,+++****)))()(((''&"#%#"###
- at 30BB2AAXX080903:3:38:878:517#0
-CGCATGCCCCAGTGAGCCAGCGAGCATTCCGCCGAGACTCCACACAGCTCTGTGCTTCAGACCCAAGCTCATCTCC
-+
-6772478888888888888888887777235544022000,./--,--+,+,*+##'*)((('('%'"#%%""$##
- at 30BB2AAXX080903:3:50:765:1020#0
-AGCGAGCATTCCGCCGAGACTCCACACAGCTCTGTGCTTCAGACCCAAGATCGGAAGAGCGGGGCAGCACTCTCNG
-+
-67777788888888288888,88571(7)5150502/#0//..,,-*+,+($%*#)(((#()##'##""#"#"#""
- at 30BB2AAXX080903:3:54:955:1998#0
-ACACAGCTCTGTGCTTCAGACCCAAGGCCATGGTGGCTGAACTCATGAGGGGACCTCCTGATCTGCAGGCCTTATC
-+
-67777788888888888888888877706555443222110//-..-,,,+++)**()))))(((('%$#""""#"
- at 30BB2AAXX080903:3:59:1401:1441#0
-GTAACAAGATGTGAGTACCACTTCAAACTCCACAACTTCACTGGCAGTGTTTGGAGTTATGATTCATACCAACNCA
-+
-67777788888288888%8888)8777765'544322'00.//..+-+,,++'(***##)('((#'%'%"#%$"#%
- at 30BB2AAXX080903:3:51:1319:350#0
-TGGGGACGGAAAGGGAAGAGGAGCCAGCCACAGGCTACAGGCTGGTTGGTCACTCCGAAACGAAAAAGCCAGTGCG
-+
-6777778888888888888888887777655544322.000./.-'--%+&**&&&#)##''#(##&""$#"""#"
- at 30BB2AAXX080903:3:4:65:424#0
-AATATTGAAGCGTGTAACTCATGGCAGAAGGTGGAATATTTAAAAGGCAAAACTGCCTGGGTCACATANCAACNAN
-+
-67777788888888888888888877776551443522100//..--+,,,+*+*(())))((('('%"$$##"""
- at 30BB2AAXX080903:3:1:1354:1893#0
-AAATGGGTTAAAATGTCCCATTACATGGAGAGTGCTGATCCACAGGGTTGAGATCATTGACTTAGGGCNGTNCTCA
-+
-27777788888888888888888877776515343222000//..--+,-+++**)*))))((((('$""&"%$#"
- at 30BB2AAXX080903:3:34:1563:782#0
-GACATGAGTCCCATCACCTGGGTGATCAGTGCAGAGTTCTGTCACAATGCCCCTGTAGGCAGAGCCTNTCTACANN
-+
-67777788888888888888882877776555443222100//..---,-,,+**)**)))()(((&""$#"#"""
- at 30BB2AAXX080903:3:50:154:1256#0
-AATAAGTTGTCATTGTTGTTTACCTGTCACCCAGGTGATGTAACTCTTGTCTCGGCTCTGCCTACGACTGCACGCG
-+
-67777788888888888888888877776555443222100//..---,,,++***))))(()''(&$""&$#"#"
- at 30BB2AAXX080903:3:54:1676:251#0
-GAAAAGCCTAGACAAGAGTTACATCACCTGGGTGACAGGCAAACAACAATGACAACTTATTTTCACACAAACAACA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('%$%&%%%#$
- at 30BB2AAXX080903:3:58:1532:856#0
-TCAAATCCAAGCTCCACCCCTCGCTGTGTGAGCTTGCTCATGCTGCTAACCTCTCTGAGACTTGAGATAGTACAAN
-+
-67777788888888888888888877776555443222100/0..--,,,,++***)*))))(((''$$%"$$%#"
- at 30BB2AAXX080903:3:4:1497:1652#0
-ACTAAGAGAAGCTGAAAAGGAGCGGGGAGGAACTAACTGCAATGTTACATCAATGAGTTGCATCTTAANCCTCNTN
-+
-6177778888888888888888)877-125454/02220#0..$-.-,,,*++%)*'))(%(('(&'""$""$"""
- at 30BB2AAXX080903:3:51:298:898#0
-GGCATGGTCCCTCAGCCACCTTGTAGCCTTGGCTTGCAACATCTCGACATTGAAACCAAAACGCTGCACGGGCCAC
-+
-6777778888888888888888887777655544322210//...---,,,+***))*)()(((('&$#"#"##"#
- at 30BB2AAXX080903:3:42:791:927#0
-GCCTGGACAACTTTTCAGGAACCTTCAGATCACACGGGCCCTGCTGCATTTTGGTTTCCTTGTCGAGATGCTGCAG
-+
-67777788888888888888888877776545443222100./-.--+,++++*+)*()&))('(&'$%##%##"#
- at 30BB2AAXX080903:3:51:1007:190#0
-TTGAGACAAGGTCTCTCTCTAAGGTCTCACTCTGTTCCCCAGGCTGGAGTGCAGTAGTGGGACCAGAGACCACTGC
-+
-67777788888888888888888877776555443222100//..---,,+++***)*))))()(''$"#%#%$$#
- at 30BB2AAXX080903:3:33:64:358#0
-GCAGGAGAATTGCTCAAACCTGGGAGGTGGAGGTTGCAGTGAGCCAAGATTGTACCACTGTACTCCANCGACCANN
-+
-67777788888880888888888877776575443221100//,..--+(+++***)**))((((('"$""$"#""
- at 30BB2AAXX080903:3:38:1726:1013#0
-ACAAGCGGGCCGGGCGTGGTGGCTCACGCCTGTAAACCCAACACTTTGGGAGGCTTAGGCAGGCGGGTGCACTTNN
-+
-677777888888888882888888777765252322...///,,%---,,+++'()'))(''(#(&#"'&"$""""
- at 30BB2AAXX080903:3:55:637:831#0
-GGGACCTTTTGCAGGGGTTCCCCAGGCAGAGGGCTCACAGCTTTTGTGCAGCAGATCGGAAGAGCGGATACGCACG
-+
-67777788888888888888888877776455443122100//.,----,+,+*+**))))()(('&$$%%%$$"#
- at 30BB2AAXX080903:3:45:120:1660#0
-CTGGTTTGGTCTCCCATCCCACCCCATCCCTGCATCCCATCCTGTTTCAGCCAGTGTCCCACTTCCTGGGGCGGTC
-+
-67777788888888888888888877776555443222100//..---,,+++***))*))(((''('$%"#$#""
- at 30BB2AAXX080903:3:36:905:1336#0
-ATTTAGAACTATTCTGCACTGGAGATTTGTCTGTTCTCCCCCATGATAGATATTTAACCTCACGTTTACATCTCTN
-+
-67777788888888888888888877776555443222200//..--,,-+,++**)*())))(((&$%#"####"
- at 30BB2AAXX080903:3:48:49:1724#0
-TGCAGAGTGGAGGTCAGTGGTGGAGTGAAGACGGACCAGGGTTAACATCGGCAGGGGTCACGTGAGCTCACTGGAT
-+
-67777788888888888&88.888777-655.4430.'100-,.-..,--+)+*)*(##&%#'&##'"$#$#""""
- at 30BB2AAXX080903:3:49:1003:1049#0
-AGGAGGGCCAGTCAGGTATTTTGGAGAACGTCCCTCAATTAGGATTTGTCTATTTTCCTCAAGATCGGCAGCGCGT
-+
-6777778888888888888888887777655922321-10///-..--,-+*+***))*)()(((&(""""$"""#
- at 30BB2AAXX080903:3:37:1257:1176#0
-GACACTCGAGGGCTGCTTTTAGGAGTGCTGACTACATGCTTCCCTACCTCCATGTAGGCATGTGTGTCCACAACAN
-+
-677777888888888888888888767765554432221/0/..----,,-*++))**)')(((''#$#"%""##"
- at 30BB2AAXX080903:3:54:141:1721#0
-GACCCCGCGGCTTTGAGGGGGCCCCGGCACTCACGCCCTGACCCTGGCGTCCTGAGCCTGCGCCCAACGGACCCAC
-+
-6777778888888888888888887777655544321210.//.---,-++*+***)())()#''&%%%"#"#"#"
- at 30BB2AAXX080903:3:40:1123:1233#0
-AACGCGGCCTCCTCCTCCTCCGAACGCGGCCGCCTCCTCCTCCGAACGTGGCCGCCTCCGAACGTGGCCGCCGACC
-+
-6777778888888888888/188677776455313.21100/..-,-,*++)***''()(''''#%'&%#"#""##
- at 30BB2AAXX080903:3:2:1127:406#0
-GAGCTGAAGACTGGGCGCGTGCCGGCGGCAAATGTTCACAGCAAAGGGCGGCCCAGTGCGCAGCTGGANCATACTC
-+
-64777788888888838888888877772/554412/..00*,----,),+*'***(*()&(('(''%"$$#$#"#
- at 30BB2AAXX080903:3:59:1126:569#0
-GGTCGTGGTGGAGCCTGGGTGAGGGCAGAGGTGGTACACCCCAGAAGACCCTGCTCCAGGCAGCGGCGGGTAACCC
-+
-6777778888888888888888887777655244-2120/,//.,---,,+)+('))*()('((('%&$$"$"%##
- at 30BB2AAXX080903:3:49:1044:1595#0
-GGAGCAGGGTCTTCTGGGGTGTACCACCTCTGCCCTCACCCAGGCTCCACCACGACCAGCTTCGTCCACCCCGATC
-+
-67777788888888888888888877776555443222110//.---,,,,,+*+)**))))()(('%&%"$####
- at 30BB2AAXX080903:3:48:933:2045#0
-AGCCCACCCTCCCATCTCCCTGAACTACGGGTAGGACCCCTCTGGCCCCCAGCCCTGCCCTTGACCCAGACTACAT
-+
-677777888848888288288888477765514432+-*//./.-+++*,++*(())(''&'((###"""$""$##
- at 30BB2AAXX080903:3:48:105:1104#0
-AGTCTGCTGTCGCTTCCCCTTTAAGCACACTCATTCACCACACCCGAGGAGGCCAGAGGTGCAGGGACAGAGAACT
-+
-67777788888888888888888877776555443222100//..-.-,,++*+**))*&)((((''$$##"""##
- at 30BB2AAXX080903:3:3:910:1602#0
-CGGTCCCGACCTGCCTGGTCCCTGGAGCTGGGGTGGGAGTCGTGCCTTGAGATCGGAAGAGCGGCTCCNCGGCNAC
-+
-6737778888888888888888827777555541322.1%1/*.-$-,,(++*(*((()()#'(''%""#""#""#
- at 30BB2AAXX080903:3:52:1143:870#0
-TCCTGGGACCTCGGCCCTGGGCAGGATTTGGGGGATGGCCACGTCTCTCTGAGTGGGCTCTGCTCATGGCCCTCAC
-+
-677777888888888888888888777765554432221/0//..-----+*+**+)*)))()(((''$"""####
- at 30BB2AAXX080903:3:1:118:1172#0
-AGATAAACCTGGTGAGCTGCGCCTTTGTGCTCACACGCAGCTGGCAATGGCAAGTCAGTGGATTTGTANATNCACG
-+
-6777778888888888888888789777655544322210../-,,,+-,++)+)%&))))'('(('$""""#"#"
- at 30BB2AAXX080903:3:8:602:371#0
-CATGTGCTTGCGGGGGCTGGGGGCTGAGGGAGGCCATCTGGGATGTGGGGTCTGGGAGATCGGAAGGNGACTGCNN
-+
--777778888888288388/888/972765*52,(*0*20/.*--+,,,-&$***)#)#'&((##'&""##"#$""
- at 30BB2AAXX080903:3:54:118:214#0
-CAGCCACTGTGAGGTGGGTGCTGGTCCCACCTCCTTCACAGGTGCCAGCTGGCAGGTGGTGGAGGGGTCACNATNT
-+
-6777728888888888888888887777255444322-10..-...*-,,+++'**&*)#))#((%#"$""""$"#
- at 30BB2AAXX080903:3:52:680:247#0
-GACCCTGCAGCCACTGTGAGGTGGGTGCTGGTCCCACCTCCTTCACAGGTGCCAGCTGGCAGGTGGGAGAGGCTTC
-+
-67777388888888888888818873776)554432-2100./.,-*,-&,,+(**(**)()'&((#"$#%#""""
- at 30BB2AAXX080903:3:59:1497:1795#0
-CTTCACGCAGACACCAGTCCCCTCTCTCTATTCCTGTTCATCCTTGATGCCAATGTCAAAGATCGGACAACAANCA
-+
-6777778888888888888*838,77776755-53222//0.+..---,+++++*)))))((('(('$&%&%%"$$
- at 30BB2AAXX080903:3:44:567:1178#0
-TGCTGTGGAGTGCAGAAAAGGAAGCTCCAAGCTTGCACCTGGGGCGTGCAGAGCCACCTTCTGCCAAATGCTCCGC
-+
-67777788888888888888888877776555443011000//.----,++++&)*)'))&'('''&&#"##"#""
- at 30BB2AAXX080903:3:35:1685:634#0
-CATTGAGCGTGTGGGGTGGGGCAGAGACAGCCACCTTGCAGCTGGTGAGGCCCTTACAGCATCTGGTNCTCTCCAN
-+
-6777778888888888888888887777:550425002111....+-+,,)+**)))((&'''('(&"&%""$##"
- at 30BB2AAXX080903:3:47:1789:102#0
-CAAGATGAAATTAACATGCATTGAGCGTGTGGGGTGGGGCAGAGACAGCCACCTTGCAGCTGGTGAGGCCACTCGA
-+
-67777788888888888888888877776555441222100/....,-,-*++$**)())'((#('&&"###"""#
- at 30BB2AAXX080903:3:57:1453:1811#0
-TCGGCGTGAGCGCAGGGTAAACTCACGGACCCGAACTCTCAGATGTGCTTCCTGGGCTCAGCTTCCCCATACATGT
-+
-677777888888888888888388767763224032211/0//...-,,,+++**))*)))(((#'#$%#"$#""#
- at 30BB2AAXX080903:3:4:498:969#0
-TCCCACCTGCCCCCTCCTTTTCTGGTCTTGCCTGCGCTGGGCCCAGGGGCTCTGGCTGTGGGTTTTCTNCTCTNCN
-+
-677707888888888888888888777765724422-21/0.-.-.-,,,+*+**))*()))##'''"""""#"#"
- at 30BB2AAXX080903:3:1:56:933#0
-TCCAAGGCGGTGTCCTGGACTCCCACTGTGCTCCCCAGAGGGCAGGGTGAGTGCGTGGCATCCTTTTANGCNCGAA
-+
-67777788888888888888888877775556333202/00/...--+,,,(+)**))(()'(((('&"##"##"#
- at 30BB2AAXX080903:3:1:651:606#0
-CTGGGGGTAGCAGGCCCTCTGTCAGCACTGACTTCTGTATCATGTCAGGGATTTTTAGGGCGGCAAGCNCANCACT
-+
-677777888888888888888888777;65-0440222/0../.--.-,,,++**+))))())&''''"##"$#""
- at 30BB2AAXX080903:3:33:204:72#0
-ACCCAGGTCGCTGGCGTCTGTGCCATCTCTGCTCCACTGACCACTCGTGGTGGTCCTGGAGCTCCTGNGCACACNN
-+
-6777778888888888888888882777655)442.2-10/$,,,."-,,*,*$)*'&)#)'&#(#%""%$$"$""
- at 30BB2AAXX080903:3:46:1507:126#0
-TGCCACGCCACTGTCCAGGAGACTGTCTCCTGAGACTGACCTCCCCCTGCACTGGGCAATGTCTGCCTCACCACTC
-+
-677777888888888888888888777765154432221//+/..-&&,,*&****)&)(('(#(##$%"#$"$"#
- at 30BB2AAXX080903:3:59:491:1031#0
-GCCCACCCTCCCCTGGACACAATGGAGGACCCCGTGTGTGGTTTTCACTGACTGAGCACCTATCTCGTGCCATCCA
-+
-67777788,88888888888888877776555445222100././.--,,,,++****))(((((('%%#$""###
- at 30BB2AAXX080903:3:37:422:239#0
-CCTGTTACGCACGTTCTGGTCTCTCCGTGCCCACAGACCCGCCAAGCTCACCAGCCAATGTGCCGCCGGCTCTCCN
-+
-677777888888888888/8/8887/746)55-2/222(0//.,,*--,++)***#'(()%)'#&#'""%"#"##"
- at 30BB2AAXX080903:3:57:725:1925#0
-CGAGGCCGTCACACAGCACCTGTGCTGAGAGTGAGCTGACGTGGACGGCGGCACCGTGGCCGTGGCCGCGCCGCAC
-+
-67777788888888888888888877776555433222110-/.-,--,,+')*)*#*)(&(#((##'"&##"$##
- at 30BB2AAXX080903:3:56:341:1202#0
-TGACGTGGACGGCGGCACCGTGGCCGTGGCCGAGGCACCATCCCTCCACCCTCACTCATGTAGGGATGTGTCGCGC
-+
-67777788888888888888788877/765552432211//1..,.-,,-+'+)*()())#'(((#'$%"$""#"#
- at 30BB2AAXX080903:3:36:1112:1764#0
-GGGCTCCAGTCCGTGTGCCCCACATCCCTACATGAGTGAGGGTGGAGGGATGGTGCCTCGGCCACGGCAGCACTNN
-+
-67777788888888888888888877776555442212100/-...--,,,++)**()())(((((#&#"#"#"""
- at 30BB2AAXX080903:3:48:206:1195#0
-TCGGCTCCCAGAGTCTCCCACCCAATGTCAGAGAGGGGGCCGCAACAGTGGTTCGGGGGGTCCTGTTAGCACTCGA
-+
-677777888888888)888888817777155544322,1.,/'$.,,,$,$+)***)))(('#&('#""##$"#"#
- at 30BB2AAXX080903:3:37:1666:1038#0
-TTTCGAGGACGCAAGAAGGTGTTTCCAAGTCCAGTCTGTCCACCGACCTGAACCTTTACCATTGAAACACCCACNN
-+
-677777888888888888888888777765554432221000/./---+,,++*+**)))()(((('"&%"$#"""
- at 30BB2AAXX080903:3:2:1126:993#0
-GCTCCTGCAGAAGTGGCCAGGACCTCAGGAACGCACCTGCTCCTGGTCAGACAGGAGGGGCTGCCGTGNAGTCTCC
-+
-6777778888888888888888887777655544322221//0-.-,,,,,++)*)))*)#'(&''%%""""$""#
- at 30BB2AAXX080903:3:46:1601:201#0
-CAGAGGTGGGGTGGGGAGGAGAGAGATGGGGAAGCTGAGTCCGGGGCCACAGGTGCAGCCAGGAGGTGCACAGCCA
-+
-677777088881888888888883777765554432221.11..-..--++++&*)))('(()#('#&"$##"$##
- at 30BB2AAXX080903:3:42:308:880#0
-GAGGCGGCATGCGGGCTGGGGCAGCGGCCCCTGGCGCCCCCACACTCCCCCAGGACGTCTGGGGGCACCGCCTACT
-+
-677777888888888888888888777765513422020/1+.,---,,,+&*))))$((()((#%%$'%""""""
- at 30BB2AAXX080903:3:45:1270:921#0
-CATGGGACACAGGTGTGGTAGTGGAGGACACGTGTGAGCAAGTGAACACATCACACAGATGTGCGAGCAGACTCTA
-+
-67777788888888888888888877776555443222100/...-.-,,-++****))))((((('&&$##"#""
- at 30BB2AAXX080903:3:43:614:1567#0
-ATGGGACACAGGTGTGGTAGTGGAGGACACGTGTGAGCAAGTGAACACATCACACAGATGTGCGAGCAGACCTCCG
-+
-6777778888888888888888887777655544322/0/0-//.+,,,,,+****)))))(((((&%%#%"#"#"
- at 30BB2AAXX080903:3:59:189:1019#0
-CACGAGACACAGGTGTGGGAGTGGACACAGGTGTGTGGGAGTGGACACAGAACAGGGGGGAACATGGACTCTNNNC
-+
-67777788888888888888888877776555443222100-/...-++,+++***')#))(#(((''"%"&"""#
- at 30BB2AAXX080903:3:58:1720:376#0
-CCAGCATCACCCTTTTCCACGGGGGTGTGCCCCTTCCTTGGTCCTGTCCCCTCCCACACACCCGAGCCAACACANN
-+
-6777778888888888888888887777655544322*10.///--+-,+,++)*(*')()&((#('"$%%%$%""
- at 30BB2AAXX080903:3:8:864:1934#0
-CCCCAGCATCACCCTTTTCCACGGGGTTGTGCCCCTTCCTTGGTCCTGTCCACTCACACACACCCGTNACTCTANN
-+
-67777788888888888888888877476%555530212/00/.-,,-)++++****()())(((('""%#%"#""
- at 30BB2AAXX080903:3:4:1073:1492#0
-TGCCTGAGCAGAGCACCCCCGGCCCAGACCTCAATCCGCGGGCTGGCTGTGCGAGCACCAGAATCCTCNATCANCN
-+
-6777778888888888'88&8888707565-5413222200/#-,+,,-+,%+$&&)$%'(''#'##'"#"##"""
- at 30BB2AAXX080903:3:58:226:1271#0
-CTGGCCCCTGCCCTTGAGATGCAGCTGGCATGTCCCTGTGGGCATCTCCCAGAGCAGGTCCAGGGGTGAGCTGANC
-+
-67777788888888888888888877776335401212000/-.-,,,),+++++)*)(()())((''"&#""#"#
- at 30BB2AAXX080903:3:38:1483:1449#0
-GCTGTGCGGTGTTGCATCCACTAGAAAGGGGCCTCCTGTTCTGACCCTGGCCCCTGAGATCGGAAGAGCGCTACAC
-+
-67777788888888888888888877776555443222000//...--,,,,++*****(()(((('"%""""##"
- at 30BB2AAXX080903:3:42:1383:1032#0
-CTGACAGGTCAGTCTGGGCCCCAGTCCCTGGTTCCTGGTGAGCTTCCCATCACCCCCCACCTCCCTGCGCCCCCAC
-+
-677777888888888888888808-847655+442522000//-..,,+-++******')(((((&''$"####"#
- at 30BB2AAXX080903:3:52:1393:242#0
-TGCGCAAAGTCCCAGAGCCGCCGGCGCACGCTCACACCCCGGCGAGCAGCCCCCAGCTCCCTCCCTCTCAGGGCCA
-+
-67777788888888888888888877776555443222100//..---,,++++***)*))(()(''$##""""#"
- at 30BB2AAXX080903:3:53:889:985#0
-GCGGCTGGAATCCAGGACTCCGCGCGGGACTGGGATGGGCTGGGCTGGTCGCGGACCGGGCTCCTCTCGGAGGACG
-+
-6777778888888888888888887777055544222210.//.-.--+-+++**)***)'('((''"""""""#"
- at 30BB2AAXX080903:3:49:1195:77#0
-GGATCCTGCAGGTGCATCCTCCGATCTGCGACTGCCCGGGCTGCCGAATATCCTCCCCGGCGGTGAGATGTCGCGT
-+
-67777788888888888888888877776555243222100//....+-,*++**')*')#()&'&'""""%"#""
- at 30BB2AAXX080903:3:55:1286:840#0
-GATTGTGTGTCAGGTGGGCACATGGGTGAGGTGCGGCTGGGTCCCCTTCCCCTGCCCAACAAGCTGGGGTCATAAC
-+
-677777888888888888888888777765554432221-0+#.-.+,)++*')%))&)('#(&&(#"""""""#"
- at 30BB2AAXX080903:3:4:443:755#0
-ACACAGCCGCACCTCACCCATGTGCCCACCTGACACACAATCCGACATGGACCTGCACGCACAGGCACNCACANCN
-+
-67777788888888,8888288887'7165554122.10(0/..--,-,,*%*****)(&)(')'&&$"%$"#"#"
- at 30BB2AAXX080903:3:47:359:341#0
-CTGTCTCCCCCAAGCCCCATGCCAAATCCGCAGGCATGTGCACCTCATGGTCACAGATGCTCCGGGGCNCGAGGCC
-+
-67777788888888888883888877776555443222.000..-.,--,+++***)))()(('(('&"###""##
- at 30BB2AAXX080903:3:42:210:284#0
-GCCGAGTTTTCAGATCTGTGTGCTGTGGCCGAGGTCTCTAGTGTGGAGGAGGTGTGTTCTGTCCTTGAGNTACGNG
-+
-67774788888888888888888877776555443222100//..---,,++****()))))(((&'$&""%$""#
- at 30BB2AAXX080903:3:8:590:1890#0
-CTGGGGTGCCGGTGTGTCCCCACGCCCGACTCTGCGCATCACGGGGCTGAGGCTGGCATACAGCCTGNCCATCCNN
-+
-6777778888888888888888882767/565343220+11**.,,-&,++,+***))&)((&#'&'""%""$#""
- at 30BB2AAXX080903:3:52:1129:1306#0
-TGCCCGGGCCTCCGCGTGTCAGCTGGAGCTCGGGGGTCCCTTCAACAGCCACAGCCTGTCCGGAGTGTGACTGTCG
-+
-677777888888888888888888777765554432/0*//-,--,-,,,,,++*)*(((&)('(#($""#"%%#"
- at 30BB2AAXX080903:3:33:1368:1702#0
-ACAGACAGGCATCATACCTTCGGCCTTGGCCGCACTCTGTGGTCATTGGTGTTGGCGGCAGCCCAGGNTATCTGNN
-+
-67777788888888888888888877776555483220100/,.+----*+++*+**)%#(''''''"#""##"""
- at 30BB2AAXX080903:3:45:571:1217#0
-ATGTAGTAACAGGCCGCTGGCTCCGGGAGGTGGCAGAGCCCTTGAGAGCGTCTAACTCACTCCCTCCTCCGATCCG
-+
-6777778888888888888888887776650541322200/0..--,-,,+++*))))(((((((''"$%#"##"#
- at 30BB2AAXX080903:3:41:1484:384#0
-GCCCGCTGTGGTCCCTGCAGAGCACAGCCGAGCCCCGAGCTGACGCACACACGCGGCGGACGCGCCCGCGGCTCGC
-+
-6777778818888888888888887777645544321211//...-.-,,-+++*)*)((()#''''$$%$""$"%
- at 30BB2AAXX080903:3:48:855:533#0
-CTGAGAGAAATGCGGGGCAGGGTTTGCGGAACGGAGGACCTGGGCTGGTGAGGGCTCCTCGTCTGGTGCCCCGTGC
-+
-67777788888888888888888877776555443222200//..---,,+++****))))()(('#$"$#$#""#
- at 30BB2AAXX080903:3:3:8:941#0
-CTGTCTGAGCTGAACCCTCGCAGACTGCAGGCCCCGGGGCTCACAGGTCACCAGACGAGGAGCCCTCGNTACNNTT
-+
-67777788888888838888/8887778644013/20-2//..---,+)+(+***(*())((#''%'%"#$$""""
- at 30BB2AAXX080903:3:2:224:380#0
-GCCTGGTGCAAGGCCACTGGCAACTGTCTGAGCTGAACCCTCGCAGACTGCAGGCCCCGGGGCTCACANCTCNNCC
-+
-67777788888888888888,881737363.521322+0....-+,,,,+++***(&)))()((''%""$#"""##
- at 30BB2AAXX080903:3:60:1703:384#0
-TCACAAAGTACGGGTGGGATTGGCAGGCAGATAAAAGGAGGGAAAGAGAGGAATTGAGTGGAAGAACACACCAGNN
-+
-677777888888888888888883777+65554-3+02100//.,.&-%,%,%****)&)')')#'&$%%%$$"""
- at 30BB2AAXX080903:3:51:849:370#0
-GCAGGGGAGGGCTGAGCCAGTGGGCGTCGTCTGTAGGGGGATGCCCAACTGCGGCCCCGTCTCTCGAGACAAATAC
-+
-67777788888888888888088877776/5548322210,-/.,-,,,+++++*))*)(('(''%%%$%#""""#
- at 30BB2AAXX080903:3:58:487:704#0
-GGCCCGGTCCAGCCCCACCTTCCTCTCCTCCTGCCCCACCTTCCTCTCCTCCTGCCCCACCTTCCTCTCCTGCCGC
-+
-67777788888888888888888877776555443222100//..---,-++++*)))*))((((('&%%%"####
- at 30BB2AAXX080903:3:34:357:1406#0
-AGAACAGGACCGAGGCCCCTTCTCCCTACTGCTTGTTGCCGTGCACTAACACGAGCACTCCTGTTCTNCACGAGNN
-+
-67777788888888888(8/8)887787%542442/110/+-....,))&+'*)**))()'()''&%"$"%###""
- at 30BB2AAXX080903:3:49:525:2023#0
-GAAGGGTGTGTAGGAGCTCTAAGGTGAGGGGATGTATGCAGGGTGGGGGGAGAGGGGAGGGCGGAGATTCTCGCCA
-+
-6777778838888888-8&,,388$7%765554/3'12.#0$/-.-+,,)+')*+(#')()#&(#'#""#######
- at 30BB2AAXX080903:3:51:1323:735#0
-CCTGGAATCACACCCCCTACCGTCCTGCTTCCACAGCCTGAATCCAATCCCCTGTCTGCCAGGAAGGCCCCGCGCT
-+
-6777778888888888888888887777655544321210///..-.-,,,+++****))))(((('"$#$"#$#"
- at 30BB2AAXX080903:3:38:1490:1640#0
-GAAGGCCCAGGGGACCTGCGTGTCTTGGCTCCACGCCAGATGTGTTATTATTTATGTCTATGAGAAGCGAGGACAC
-+
-6777778888888888888888817777)53234302-1(,.*.,)+-,,+,+)*))'(#'(%(&''"""""%$##
- at 30BB2AAXX080903:3:35:68:1295#0
-GTCTGCCGTCAGTGCTGCCGAGGGACGCTGCATTCCCGAGGCCAGGCAGACGGAGGAGGGGGCTGCGNCCTCGACN
-+
-67777.88888888888888/8880/7$655-141../.-0/,...*,,+),*$**(*))'(##(#&"$###""#"
- at 30BB2AAXX080903:3:42:565:1695#0
-GGGGAGGGCGTGCTGGGGTCCCCGGAGGAGAAGGCCCAGCACACGCCTGAGTGGACTGAAGCCTCCGCCTGTCCAG
-+
-6777778888888888888803887177154,41--//.0/..,.*,,-+-)*+*()*)'''#''&'&%%%%$%$%
- at 30BB2AAXX080903:3:47:15:1542#0
-CTTCTGCCTCTGCAGGCTCCCACAGAAAACACTGCCAGGCCACCTCCATCTGTGTGTTCATTTGCTCCTGCGCACA
-+
-677777888888888888888888777&25554232.0100...).-+),)***()#)(((()('&'&""$"$#$#
- at 30BB2AAXX080903:3:49:634:380#0
-CCTCGAGCCATTGTTTGCAGGCGGGGGCTTGGCCCCTCTCTCCTGGGCCCCTGAGCTGGTGGGAAAACGCGNGACA
-+
-6777778888888888888888887777255544320200.//,,.-,,-,*+(+()*)'))(''''"$#""#"#"
- at 30BB2AAXX080903:3:47:244:560#0
-TCAGGGGAGCCGGGAGCTATTTAACGAGGTTTAGGGTAGGCTCCCAGGTCACTGCGCAGGACTGCTCCGCACACGC
-+
-6777778888888888888888887757655544320110///..,--+,,,+*)*))))(('((''"$""#####
- at 30BB2AAXX080903:3:42:1715:493#0
-AGGGGAGGCTGCTCCGTTACAGGTGGGCAGGGGAGGCGGCTCCGTTACAGGGGGGGAGGGGGGGGGGGCAGCGCNA
-+
-673177488/.888888183,88,171824153-2+).0##++&%$&#$,*$*)(&#'''#'####%$#""##""#
- at 30BB2AAXX080903:3:46:948:1513#0
-GAGCAGCCAGCCGGCTCTGCCTTCACGCCCTCCACAGGGAATCACAGTTATCTCACTCCCTGCCTCACNGCGCGGC
-+
-6777778888888888888888887777655544322212///..--,,,+++****)(*)((((('"""""#""#
- at 30BB2AAXX080903:3:42:43:813#0
-GGCGGCTGCGGTGGACGCTGGATATGAGGGTGGGAAGGTTGCCGTCCTGGCTGGAGAACGGGACCGGNATGCTCGC
-+
-677777888888888888888884771765'5440222%00*,.)(,,,-*'+%(*&)#)#('#''&""""#"#"#
- at 30BB2AAXX080903:3:34:375:1494#0
-TCCTCCTGCCTCTCTGGCTGCCTGCCAAGGCTGCTGGTGCTGAGTGGAGACGGCACCGTCCCCTGGCNCTCTGCNN
-+
-67777788888888,888/8'8387#)305.340322$1*//),,--',+)+%*'&)(#((''#&'%""%%%""""
- at 30BB2AAXX080903:3:58:114:1203#0
-ATCTGTGTCCCCCATCCATGGCCCCCATCCGCGTCCTCGGGCACCTAGGAAGGCCCTTAGATCGGAAGCGTCANNA
-+
-677777848888888-88888883779&)5554&23001./.,.-,*,,+*++')'((()&'#((%&'"%"##""#
- at 30BB2AAXX080903:3:33:1543:42#0
-ACAGTGGAAACTACCCTCTCCGTTCTGTGGGGGGCTAAGGCCTCCTCCTAGCCCGGGGGAGGGGGCGNTCGCCANN
-+
-677777888888888888/888'87777655544-52.11,/.-.,+-)&(+)$*)))(#((#####"$$"#$$""
- at 30BB2AAXX080903:3:50:1576:91#0
-CCACTGCTCAGGCCCCTGAGAAGCCATCGTCTCCCCCACAGCCTCCCGTGCCCGAGCTCGGTGGGCAGTGAGTCAA
-+
-67777788888888888888888877776.5544522210.//..--,+,++%*))*))()'(((&%%"""""#"#
- at 30BB2AAXX080903:3:3:1499:703#0
-GATGGCTTCTCAGGGGCCTGAGCAGTGGTGCCTGGATCCGTGTGTGGCCAGGGAGATCGGAAGGGGGGNCGTCNCN
-+
-67777788888888888/88888871779532441./')0)/./-,,*&&++#(*&(#()#%'#'#'""$"##"#"
- at 30BB2AAXX080903:3:58:307:224#0
-CAGTGGTGCCTGGATCCGTGTGTGGCCAGGTGCCCCCCGCCGCCCGCCGGGCCCAGCCCCCCGACCTCGNGCGNNC
-+
-677777888888888888381848777365,51/2222*00/..,+,,,+**#*'('(#(&(''#&%%&""$%""$
- at 30BB2AAXX080903:3:4:911:601#0
-GGGAGGACCTCAGGAGAGTGAGCTGGGCCTGGCCTGGGCCTCCCCTCTGCCACCTGCTGGGCTGTGTTNGATCNGN
-+
-67777784884888888288084677410440.,3212/0/**,-.,,,(*+*)**()(''#((''#$"#"%#"""
- at 30BB2AAXX080903:3:53:788:2041#0
-GGCCCAGTCCTGCCTGAGCTAGCACCCTGGCGTGGCTGGCATGGCCTTGTCCACCCGCCCAGCCAGGCACGCGGCG
-+
-67777788888888888888888877776545443322&%.--#,,(*))$(%&*#'&((#'''###$"#$"$"#"
- at 30BB2AAXX080903:3:38:1522:1373#0
-GACAAGGGCATGACAGCCACGCCAGGGTGCTAGCTCAGGCAGGACTGGGCCAGAGAGGAGGACGGGGCCCTCGCTG
-+
-677777888888888888888883777/655544223210///-,,-,,,+*+)+)*)))((((#'(""$##"#""
- at 30BB2AAXX080903:3:49:1121:995#0
-CTTGCCCAACAGGTCACCTGCGGGAGGGTAGTGAGTGCCCACCTGCATCTCAAGGAATGGAAGGGGACATCCGCCC
-+
-6777778888888888888888887777655544322011./...-.-,-+,****))))(((((('%"#$#"#$#
- at 30BB2AAXX080903:3:42:623:814#0
-TCGCTCAGTGCTGACACAAGCCGGCGGTAAAGGGCCTCCCGGCCCACGCTGGGTCCCAGCTCCCGCGGCAGCACGC
-+
-6177718888888888+8838888.77$*4$,4$*0)-&*/.'&,'"))+$')$')(###&#''#'#$$""#"#"$
- at 30BB2AAXX080903:3:34:1296:1102#0
-CGCCTCTACCACCTGGGCCTCCCCAGCCACGGTGAGGACCCACCCTGGCATGATCTCCCCTCATCACNGCATCANN
-+
-67777788888888888888888877776555-1020/./0-/-,)+-,+(+'***)()(&((#'%'""$""%$""
- at 30BB2AAXX080903:3:33:1275:1431#0
-GGACCTAGGGGACATGGAGGTGTGGCCCGCCCCAGGGGGCATGGGGCAGGACGTGTGGCAGAGGGGGNTCACAANN
-+
-677777888888888888888888777765554432221-.//..-,+,,**+'*(*)(()'(((('""%"%""""
- at 30BB2AAXX080903:3:57:203:182#0
-GGAGAACGTCCTGAGGTGGGGTGGACAGGGTCAGGGCCGACCCGGGGGAAGGGGCAGCCCCTCCAGCTGNATACCT
-+
-677747888888888888888888772765/51412221/0///---,)),*+**(*))()&'(&''"&"$&###"
- at 30BB2AAXX080903:3:2:1758:558#0
-CGGGTGCGCATCCCCTGGGAGCCCGCGTGGAGGCTCCCGGAGCCGGCCCCGGCCCCTCCCGGGGCCGCNCGTCTAC
-+
-677777888888888888888888777-6/354/10)*(&&#+,'+&++%$%)))%#######&###$""%"%##$
- at 30BB2AAXX080903:3:56:666:68#0
-GTTGAGTGGTGGCTCCTGGAGATTTGTGTGGCCCCACCCCTACCCCCGGCCACCTCAACACCGAGGCGTGCCGTCG
-+
-6777778888888888388884887757655544301210.+/-.-.,,+(++*&*%))((%'''('%"$##"##"
- at 30BB2AAXX080903:3:47:1097:1460#0
-CTCCAAGGCTGGCTTCTTCCTGATAAAGCAAAATTTATGTAGCCTCCATCTCTCCCCAGATCGGAAGTAGGTGCAA
-+
-67777788888888888888888877776555443222110///..,,,,+,+*+*)))())(((('"$""""#""
- at 30BB2AAXX080903:3:38:1185:987#0
-GAGAGGGCAGGGGCTGGCGGCCACAGCAGGGCCAGGCATCGCCAGACCCACCACCAGGGCCCCATGTGTCCCTCTC
-+
-6777778888888888888818-8077045514/32/0101./,-,,,,)+**)))(()((()(''#""#######
- at 30BB2AAXX080903:3:2:361:1667#0
-GCCTGGGAGAAGCTGACCCGGGAAGAGGGGACACCCCTGACCTTGTACTACAGCCACTGGCGCAAGCTNCGTNACT
-+
-6777778888888888888888.671776355181200*.-.,,-',+,,++****))(((((''('""#%"""##
- at 30BB2AAXX080903:3:42:1683:1627#0
-CTGGGGGGTTGGGGGAGTTCAGGGTCATGCCTCACCCTGGGCAAACCCCCACATGTAGCTGGGGCTATACCCTGCC
-+
-677777888888888888888888777763551312021./1.--,,-,,***(+))))((((('%'%$%$####"
- at 30BB2AAXX080903:3:41:65:1885#0
-TTCTCCTGAACCTTCCCAAGCAGCTGCTGCACCTGCCGGCAGTAGTTGGCCACCTTGCACTCCCGGGTTCTACCGC
-+
-6727/7888888888+88888888777765511132.011//.+-+-+,+*+*)&))(((('((''&""##"##"#
- at 30BB2AAXX080903:3:35:258:206#0
-AAACAGACCTCCCGTGGGGGCCCAGAAGGACCTTCTGAGGATAAGGAGAACCCCCTCCCCCACCCCANCTCTAGNN
-+
-6777778888888888888888887777655522322,10,./...-,,-****)(*)%')(((('%""$%"##""
- at 30BB2AAXX080903:3:54:1451:912#0
-CGGGATGGCCTGGGGAAGTGTGCGATCAGCGTACCAGCCTGAGCCAGGGTCGGCATGCTCAGTCCCACAGCCGCTG
-+
-67777788888888888888888877776555443221100///----,,+++***)))))(((('''&"%%##""
- at 30BB2AAXX080903:3:40:578:806#0
-TCCTGAATGGCTTAGAACCCCTCATCAGCCCCTCCAAGGGGGCCTCACGGGGCGCGTTGCCAAGATCTGTGATGNA
-+
-67777788888888888888888877776555443212100/.--.,,,,,+****)()''((((&#"$$#%"""#
- at 30BB2AAXX080903:3:56:1525:1088#0
-GGCCGAGTGCATCAGGGAGAGGCTGGGGCTGGGCACTCAGGCCCCTTCCCCACAGGCTGTCAGGGCACACACCCCT
-+
-67777788888888888888888877773555411020200.*.-++*,,+*+())%$)(((&'(#'$$&"$###"
- at 30BB2AAXX080903:3:33:1146:1424#0
-TTCGGACTCCAATCTTTCCCTACCGGAGTGGCATGTGCACGTGCAAAGATGCATACACACAGGGACANACACGTNN
-+
-67777788888888888,88888&&77765554432221/0..,,---,(+++**)*))(()(#(''""$#"#"""
- at 30BB2AAXX080903:3:4:1642:1404#0
-TACGTGTGTGCCTGTGCATGTGTGCGCCTGTGTGTACCTGTGTGTATGCATCTTTGCACGTGCACATANCAAANAN
-+
-6777778888888888888888887777655544322210///.--.--,,,++**)))))))(('#$"%#"""""
- at 30BB2AAXX080903:3:3:1569:678#0
-GAGTGGCATGTGCACGTGCAAAGATGCATACACACAGGTACACACAGGCGCACACATGCACAGGCACANATCTNGN
-+
-67777788888888888888888877776545441222.00/..-.--+,)*(+)*()()'((('(#$""%%$"#"
- at 30BB2AAXX080903:3:43:249:880#0
-TGCATCTGCATGTGTGTACTGTGCGTGTGTACCTGTGCGTGTACCTGTACACTTGGGTGCATGCATGCACGTCTGC
-+
-67777788888888888888888877776555443222100//----,+,-++++**)))(((((((&%&&#%$$#
- at 30BB2AAXX080903:3:1:1521:96#0
-TGGGCACCTATGTGCATACACACGTGTCTGTGTGCATTTGTGTGCATGCATTTGCATCTGCATGTGTTNCANTCTG
-+
-6727+7888888882888188888.77165454423%200./..----+,,)+*)**$)('(((('%""$#""$#"
- at 30BB2AAXX080903:3:57:1037:1080#0
-ATGCAAATGCATGCACACAAGTGCACACAGACACGTGTGTATGCACATAGGTGCACAAAGGTACATAGATCCCCTC
-+
-6777778888888888888888887777655544322210///..--,,,+++**+)*)))'((((''$"$$####
- at 30BB2AAXX080903:3:37:315:1077#0
-CAAATGCATGCACACAAGTGCACACAGACACGTGTGTATGCACATAGGTGCACAGATCGGAAGACGGCGCAGCCAN
-+
-67777788888888888808888877776555142222100//.----,,*++***)*))()()(''$#%#"$##"
- at 30BB2AAXX080903:3:34:1362:466#0
-TGCATGTGCGTCTGCGTGTATCTATGTACCTTTGTGCACCTATGTGCATACACACGTGTCTGTGTGCNCTCTCTNN
-+
-6777778888888888888888887777:555443222100//..-----++++**)*)))))('('"$%#"%$""
- at 30BB2AAXX080903:3:39:1328:1242#0
-TGTGTGCATCTGTGCGTGTGTACACCTGTGTGTATGCATGTGTGTACCTTTGCGTGAGATCGGAAGACCTGTCGCA
-+
-67777788888888888888888877776555443222100//...-,,,+++****))))()((''"$#$"""$#
- at 30BB2AAXX080903:3:45:97:971#0
-GTGTGCCTGCAGGTGTGTGCATCTGTGCGTGTGTACACCTGTGTGTATGCATGTGTGTACCTTTGCGAGGGGTTGG
-+
-67777788888888888888888877776555443222100//..---,-,+++**)*))(((('(&"%$""""##
- at 30BB2AAXX080903:3:3:477:2041#0
-CCACCTCCCTTCCCAGCCTTGAGTTTCTAAGGCTCAGCCAGACAGATGCCCCCTCCTGGCCAACGATCNCGGNNCA
-+
-677777888888888888888883237765521,22/12././.-+,+',++)(*)'((((%(&(%''"#"#""$%
- at 30BB2AAXX080903:3:33:1242:952#0
-CTGACCAGGAAACATACCAGTCTGTGTACAACTGGCAGTATGTGCACTGCCTCTTCCTGTGGTGCCGNGCAGTCNN
-+
-67777788888888888888888877776555443222100//./-.-,,++*+****)((((((''"#%""""""
- at 30BB2AAXX080903:3:49:205:1069#0
-CGCAGGTGTATGGCGAGCTGGAGGATGTAGAGGAAGGCGTGCTGGTAGGCCATACCTGGCACAAGGACAACACGTA
-+
-27777788888888888/888)88'77745554432221-0././+--,,++%*)*&)*))()'(''%"##$#""#
- at 30BB2AAXX080903:3:39:564:1845#0
-CCTGGTGCCCTCCCCTTCATCAGTTTCATGCAGTGGACCTTGACGGAGCTGCTGGCCCTGGAGCCGGGTAGANTCT
-+
-67707788-88888888888868877716555433220211/.-,.,-+,,+***(()((('('('&"$#%#"""#
- at 30BB2AAXX080903:3:2:1349:1656#0
-TGGAGGAGGACACTGGGTGTTGGGACCTGACGCCATGGCCAGGGGACAGTCCCACTGCCCGTCCCCACNACGTAGC
-+
-67777788888888888-827888777&3.$/441*)10.)..+%-*'*$**#')#'((('#(''('&""""#"""
- at 30BB2AAXX080903:3:8:571:770#0
-TTTGCCTGGCTGGGGAGGGCTGTGCTGGCCCTGGGGCATCCCTGCTGAGGAGGCTGGGGGGCCACCANTCTACTNN
-+
-6777778888888888888888887777635544322210....---,-,,++)*+**)))&''%'&""$#%%#""
- at 30BB2AAXX080903:3:4:1029:1789#0
-TTCACTTCTGTAACTGAGCACCTAACTCACGGCTCCCCCGAGGTGCTTTGGGAAGAGCTGGTGGCCACNCGCANGN
-+
-677777888888888888888882777765555632221/0..(,.,,+,*+*)*())(((#((&('%"$#$#"""
- at 30BB2AAXX080903:3:41:1592:2006#0
-GGTGCCCTGCTTCCTGACCTTCCCCAAGCAGTGCCGCATGCTGCTCAAGGTGGGTGGCCCAGTCCCCCGGCTCGAC
-+
-672777888888888888188318377785264/-0/.10,./)-,++++(*'*#)(#&##'###%#"""%"#""#
- at 30BB2AAXX080903:3:34:1734:1975#0
-TGGTGCCCTGCTTCCTGACCTTCCCCAAGCAGTGCCGCATGCTGCTCAAGGTGGGTGGCCCAGTCCCNATAGACNN
-+
-677777888888888*888888887727635554122-2/0+./,,+,,,+$**+#))'#('('&'%"$"#"##""
- at 30BB2AAXX080903:3:47:1091:942#0
-ACGACGGTGTTGGCGGACGTGCGGCGGCACATCAGCGTGCTGGCGCCCCACTTCCTGACCCTCCCCAACGACTCAT
-+
-6777778880888888#8828828/7731330-3320#1%.//#.**++&+*)$*&'((('''#(&%""""$"#""
- at 30BB2AAXX080903:3:53:717:875#0
-CTGGTGTCCTGTCTGTCGGAGACGACGGTGTTGGCGGCCGTGCTGCGGCACATCAGCGTGCTGGTGGCGCGGCGGN
-+
-6777778888888888888888887777355544222110-/+,-*,-&(+'(*'*')%)##((%(%"$#"""%$"
- at 30BB2AAXX080903:3:52:225:1682#0
-GAGCAGCCTCGCGTCCGAGCCGTGGGGCCTCCCAGCCAGGGGTGGGGGGTCTCTCTAGATCGGAAGAGNGTCGAGC
-+
-6777778888888888888888887777655544322-100/#..-$-,&++++))(*)(&)('#('$"#"""#"#
- at 30BB2AAXX080903:3:53:951:1893#0
-ACCCCTGGCTGGGAGGCCCCACGGCTCGGACGCGAGGCTGCTCAGCATGTTGGCGGGATCGGGAGGTGCGACCGAA
-+
-64777(88888888/88/882788777/65/5-4(32*./&.+,,++,+&+(*$*#)&&(&(#''##&$%%$#$"#
- at 30BB2AAXX080903:3:40:192:864#0
-TGAGCCACCAGGTCAGGGACCCCTGTCGAGGCAGCAGCTGTACCGGAGGGAGTCAGGCAGGGGGGGGTAGACGCCC
-+
-67777788888888888888888877776555543221100.+..-+-,,++*%*+)(#)#)(('('&"""#"###
- at 30BB2AAXX080903:3:35:1530:450#0
-CCTGGATGCCAGGCTCCCCCCAAGCTCACCAGCACTGTCCGTGACCTGGAATTTGTTGGCCTCAGCANCGCGACNN
-+
-67777788888888888888888877776555443220100-/-.---,,,+++**)*)))(((('%"%"$"#$""
- at 30BB2AAXX080903:3:55:1513:664#0
-TGAGAATTGAACTATGTGGTGGTTTGAGAGGAGGCACGAACGGGTTTGAAGGTGGTGAGATTGGGAACACAGCCAC
-+
-6777778888888888888888887777655544*22220.//&---,+,,+'+**)())&#((%(%$$&$"$###
- at 30BB2AAXX080903:3:43:535:1867#0
-GAAAGGAAGGACAGAGGGGCTGAAGAGAGAGTTGCAGGGGAGCCGAGTTGCTCTGTTAGAAGGAGCGGAGGGTGCG
-+
-67777788888888888888887873776355441122101/+..--+,,+,+**)*))()))((&'&"&""""##
- at 30BB2AAXX080903:3:39:758:317#0
-TTTGTGGGAGCTCTTTGCATAGGAGCCCCGCCGTTGCAGTCTGGCGTCCTCGCAGGCAGATCGGAAGAGGGGGGCA
-+
-677777888888888888888888777765554132221/0//..-,-,-+++*+**)))()))'('"&%%#####
- at 30BB2AAXX080903:3:57:1081:929#0
-AGGACCCGCGGGCTTAACGGACGCGGAGACTGCCGGAGGGCTGCTCGGCGGTGGCGGGCCGGCCAGAGTGTACACA
-+
-67777788888888888888888877776555443202100-/.-.,-,,+$+*)*)'(('&(%#'&%$%"##$$$
- at 30BB2AAXX080903:3:3:685:939#0
-AGAAGGGGCGGGGGCCGCTTCCGAGGGCCGGGGGAGGTCGGGACTCAGGGGCGGCGCTGGGGGCACTANAACANGA
-+
-67777788888888888488184,777./50545111,&///#(,+(-,$+$%*#)%&)&((###%%'"""$$"""
- at 30BB2AAXX080903:3:44:116:1187#0
-GCGCTGGCGCATGCGGCTCATGGCCACGAAGGCATCGTGGTAGGGCCGCTTGGAGTTGTGGGGCACGCCGTGAACG
-+
-6/777788888828883888888827670055/01(2/1/,..#-*&,$(,+)$*)((&()(%&%#'%$"""#"##
- at 30BB2AAXX080903:3:46:267:1348#0
-CCGGTGTCCCCCGACCCTGTGCCTCCCTCACCTGCCTCTCGGTGCCCCGTAGACTCTGCTCCCAGCCGTGCACGTC
-+
-67777788888888888888888877776555443221100//.-.--,,++++*)))))((((('''""##%"##
- at 30BB2AAXX080903:3:40:783:59#0
-GCTGCAGCACTTCGTGGACGTGGCCAAGACCGAGGAGTTTATGCTGCTGCCCCTGCAACAGGGAACACGTAGGCTG
-+
-677777888888888888888888774765550432201////.*.-,,++++'*())'()(#(&%'""%$""#"$
- at 30BB2AAXX080903:3:2:871:1669#0
-TGCCTAGGACGCCCCTCTGCTCAGGCAGCAGGTGGAACTTCAGGGCCTCGATGAGGAGGTCCTTGCCANGAGGCGC
-+
-67777788888888888888888877756/45&22-10000/....,(,,((+&*)&))''(#&(&#""""$"#"#
- at 30BB2AAXX080903:3:46:1730:424#0
-GCCGGCCGAGTACAGGAGTCCATGCAAGGCGGCCACACCCAGGCAGCTTCGGCTTGTGCCCATGGACGTCCTCTGT
-+
-67777788888888888888888877776555443211000.//-.-++-*%+*)*)))))(''(''""#"$#"#"
- at 30BB2AAXX080903:3:59:670:1635#0
-TCATAGCCGCCGGCCGAGTACAGGAGTCCATGCAAGGCGGCCACACCCAGGCAGCTTCGCCTTGTGCGCNTTCACA
-+
-67777788888888888888388877476555333220101..-,,,++,+****()))((&(('(%"$"####$$
- at 30BB2AAXX080903:3:1:818:1064#0
-AGGCAGCCAGGGTCCTGTGCCCACCAGCGGGCCCTGCCTGGTAGGACTTTGCGGTCTGAGTTTGACTCNCANGCGT
-+
-6777778888888888888838287715641232-5/-00-'*,,*+(++*)+)#('('(''((&%#%"#"""$""
- at 30BB2AAXX080903:3:51:1465:1764#0
-CAGCCATTCCGCTGGGGAGGGCAGGTCCTGGGGCCGGGACGCCTTTCTGTCAGATCGGAAGAGCGGTTCAGCAGGA
-+
-6777778888888888888888887777655541/222/00-...-,-,,*+++*))))()((((('"$"####$"
- at 30BB2AAXX080903:3:3:1580:1279#0
-TGGGAGTGGGGTCTCCACGGTGGGGGAAGGTGGGGATGCCCCCCAGGCGGGCCCCCTCACCCACCAACNCTACNTN
-+
--/7777.888888888888808757745/5'111/+-0&-,))+'',&%(+'#'&##&#%'#%%'##""#""""""
- at 30BB2AAXX080903:3:51:994:41#0
-AGGTGTGAGGAGCTGTCGTAGCCGCCCACAGCATACAGGTTCCCATCTGCCGGAAGTCAACACACCCGAGATACTC
-+
-67777788888888888888888877776555443222100//..---,,+++)**()))))(('('"$#"""#"#
- at 30BB2AAXX080903:3:54:1043:691#0
-GCCACGTACAGGGCACCCTCCAGCACGGCCACGCCCGCTGAGCTGCGTCGGCTCAGCATGGACGCCACCGCACCCC
-+
-6777778888888888888888887777655544322210///..--,,,+,+*****)))((('('%$#&&#"""
- at 30BB2AAXX080903:3:35:31:1731#0
-TGCCACGTACAGGGCACCCTCCAGCACGGCCACGCCCGCTGAGCTGCGTCGGCTCAGCATGGACGCCNACACGCAN
-+
-67777788888888888888888877776555443222000//..----,+++**))))))((((''"#$#$"%#"
- at 30BB2AAXX080903:3:58:1374:2026#0
-GGGGGGAGGGGCCACACCACAAAAAGGGGTGGTGGCGGGACATGCTCGCTGAGGGTGGGGGAACTCCCATTCTCCN
-+
-677777888.888888,882848477776.51240.21.-$*-,%'"+$&+'**'*'))#(#'####&"""#"$#"
- at 30BB2AAXX080903:3:42:719:901#0
-TGGTCCTCGGGTTGTACTTCTCGATGGAGTTGAGGCTGGAGCTACCGTCGTTACCCCCCACGGCGTACCACCATCC
-+
-677777888888888888888888777765554432221/00..-,,,,-*,)*&*)*)(('(((#'&"&%$###$
- at 30BB2AAXX080903:3:37:142:97#0
-CACCAGCCTCTGACCCACCTACCACCAGAGGCCTGCAGCCTCCCACATGCCTTAAGGGGACCGTGGCTGATACCNN
-+
-67777788888888888888888877776555443222000/...---,,,++&**))))()(((''"""""##""
- at 30BB2AAXX080903:3:38:1745:401#0
-CTCCACTGCCTGCATGGGGGGCGCGGGGAGTGACCAGGCGGGGGCCTCACCGCCCCAGGGCCGCTGCCAGTTCANN
-+
-67777788888888888888888877774545543222100/,.-.*-+,+*+***''((('(#%&&$"#""#"""
- at 30BB2AAXX080903:3:48:1343:884#0
-GGTCCAGGGTGAGGGGTGTGGGGGGGTGCCCTGAGATGCGCAGGCATCTGGGAGCTGCAAGGCAGAGCTGCGCGCG
-+
-677777888+8888888888888877276552443212200./.--.-,-,,)***))(('((((&'$"$%$$"#"
- at 30BB2AAXX080903:3:39:1428:819#0
-CCACATCGTGGGCTCTGGGGTTCGGGCTGGGGAGGACAGCCTTGCCCCCGAGCGCGCTGCCTGGCTGTGNTGNTCA
-+
-6777778888888888888888$877776555343+-011,*&--.+,,+*''*%'*&)'&((%#'#"&"%#""##
- at 30BB2AAXX080903:3:36:72:1028#0
-CCATGGGGAACAGCCACTGTGTCCCTCAGGCCCCCAGGAGGCTCCGGGCCTCCTTCTCCAGAAAGACTATCACAGN
-+
-677777888888888888888888777165554431/2200//..---),+,+(*+*))))((((#'$&#%#%"""
- at 30BB2AAXX080903:3:47:900:319#0
-AGGAAATGGGGCTGGGGGAGGAGCTCTGGGCCAGTCCTAGAGCCAGTGCTCCGCGGCCCTGTACCTGTGTCTGCTC
-+
-677377888188888888388642-80.0-73.1/.0.00,-+,-+*,++**+)))(#(#'#(&''&"""##"#"$
- at 30BB2AAXX080903:3:56:327:1058#0
-CACTGGGTGCAGAGCCCAGGTACAGGGCCGCGGAGCACTGGCTCTAGGACTGGCCCAGCGCTCCTCCTCCCATCAC
-+
-67777788888888888888*888767765554/3222,00//.%&,-,&&,+&)*))#%(#'(#''"&"%""%#$
- at 30BB2AAXX080903:3:39:478:1119#0
-CTTAGCACCGACCTGACCCCGCTCACTGGATCTATTGATTTGTCCCGTCGTGTGTCTCTGCCGTGGGCATATCTCA
-+
-67777788888888888888888877776355443222100//.,---,,+++***))))()((('&%$%#""$$"
- at 30BB2AAXX080903:3:56:497:804#0
-TCCAAGAATTCCTTTTCTGAAAGCCTTTCTAAAATTCCAGCCTTCCCTGATCCTCTGCACTCATCCCGTCCTGTCT
-+
-67777788888888888888888877776555443222100.-..--,,++*+)*'*)&&%('('''"$$&%"$#$
- at 30BB2AAXX080903:3:3:1247:224#0
-TTAACACCTGGTTCTACAAAAAACAGACACAGAAACACACCGATGCCCTGATTCGTAACGTTTGCCACNATCANCN
-+
-6777778888888888888888817777655544322/10,//..-*,,,+,+(+***()))))&&(""""%#"#"
- at 30BB2AAXX080903:3:54:1558:957#0
-GGTGTGCATGTGTATGTGTGCACGTGTGTATGTGCACGTGTGTATGTGTATACATGTGTATGGGTGTCACAGAGTG
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('''$$%&&"""$
- at 30BB2AAXX080903:3:37:431:514#0
-TGTATTTGCGTGTGGATATGTATGCATGTATGCACGTGTGTGCATATCTGTGTATGTGCAACTGTGTACTCGCACN
-+
-67777788888888888888888877776555443222100//..---,,+++****)))))((('&"$##"$%$"
- at 30BB2AAXX080903:3:35:324:1083#0
-TGTGTATGTGTGCACGTGTGTATCCATGCATATGTGTGCGTGTGTGTACATGTGTGTATAAGTGCGTNTCTATTAN
-+
-67777788888888888888888877776555443222100//..-----+++****)*)(((((''"&$""""#"
- at 30BB2AAXX080903:3:59:243:1142#0
-AGGCAACATGCATGCATCCATATATGCGCACACATACACATGTATAAATGCACACACACACACATGCATGCACNNC
-+
-67777788888888888888888877776555443222100/...-,,,,++++****)*))((((''$#&%$""#
- at 30BB2AAXX080903:3:51:782:761#0
-TTATACATGTGTATGTGTGCGCATATATGGATGCATGCATGTTGCCTGCATGTGCACGTATCGGGTGATGCTCGGC
-+
-67777788888888888888888877776555443222100/..----,-+++***'))))((((''"""##$###
- at 30BB2AAXX080903:3:2:411:202#0
-CATACATATATGCATACATGCATATTCGTGTACACGTACACGCACACACACCCGATACGTGCACATGCNAGACACT
-+
-67777788888888888888188877476555342210.2////--,,*,+*)****))((((#'('%""""$##"
- at 30BB2AAXX080903:3:42:148:1556#0
-TGGGGGGCTGTTCTTCACATATGTGTTGTGTGGCTATGCACAGGCAGACCATGCTATAGTCCTGTAGNCTTGTGCT
-+
-67777788888888888888888877776555443222100//...--,,+,+***)*))')((('&""%"$#$""
- at 30BB2AAXX080903:3:39:481:1768#0
-GGCCATGGCCCCACCCCATTGCCCACCGCCTCACCTGAAATGTGAGTCCTTCCGAGCCGTGGGCCTGCACGCCACA
-+
-677777884888888833888782724765622/-31'.///..,-,*+,+)')')'()'()(#&''$"#######
- at 30BB2AAXX080903:3:39:150:1415#0
-CAGGGTGAGAACCTCAGGGCGGGCAGGGGCTCCTCCATGTCACAGCGGAGACCAGACAGATCGGAAGCGAGGCACT
-+
-67777288888888888888888877776655442222100//..---+,+'))***)*))(((&''%$#"""$#"
- at 30BB2AAXX080903:3:52:56:1514#0
-CCAGGGTTGGTGGTAGCCCCAGGAGACATGGGACCCACTGGCCTCCCTCAGGGTGGTGGCCTCGGTGCCTCGGCGC
-+
-67777788888888888888888877756555441222100/./---,,&+++(**(*)((('((%'$$""%"#"%
- at 30BB2AAXX080903:3:34:1535:321#0
-TCCGCGTGGTGTGCGCCAGCTACGAGGACTACGGTCACTGGCTGCTGTGGCTTCGCGCCGTCCCCCCNCGCCCTNN
-+
-67777788848888888888888877776343443222./0...)+-&-$+&)'()(&#%&%##'''"&"#$##""
- at 30BB2AAXX080903:3:41:166:573#0
-GTGCGCCACCACGCCCGGTCTGCTGCCCCCTTTTTACCACTGCCCAGGACCTGGGCTGTGGGGCCTANTGATCACT
-+
-67777788888888888888888877776555443222100//..----,+++**)*)*))((((('""$#"%"#"
- at 30BB2AAXX080903:3:49:560:1967#0
-GCCCAGGCTGCAGTACAGTGGCACGATCTCGGCTCACTGCAACCTCCGCCTCCTGGTCAAGCGATTCTCCTCACTG
-+
-6777778888888888888888887876645534/2.02//.'.-+,-,,,)****(((()((('(%"$#"$###"
- at 30BB2AAXX080903:3:8:699:670#0
-AGAGAAGAGGTGGCCTAGGCTGTTTCTAGCCGAGAAGCCCATTTCTCCCACCTCTGCCCTGCAGATCNATACACNN
-+
-6777778888888888888888887777635544312//0/1..,--,,,++****(()()((((('"$$##%$""
- at 30BB2AAXX080903:3:42:431:624#0
-TTTGGGGTTCCAGGTCTCCTCTGCCAGGGAAGGTTCGCCCGAACCATGGCTGCCTCTGACAGGTGAGTAGNGCGCG
-+
-677777888888888888888888777765554/3021100./-.'-,,,++%**)())(()(&(%&%"""%#$#%
- at 30BB2AAXX080903:3:55:1179:1147#0
-ACCGACCATCTGGTAGGGAAGGCAGAGATGTGTCAGCCTGTGGGAGGCAACAGGCACTCACCCCAGGCTCTACACA
-+
-67777788888888888888888877776555443222100//..---,,,++*+****))()((('""###""#"
- at 30BB2AAXX080903:3:55:813:1384#0
-TCCTCCCACCAGAAGTGCCCCCAGCTTGGAGGGCCTGAGGCCAGTGGGGGGCTTGTGCAGTGGATCTGGNGGCCCA
-+
-677777888888.8888888888877776555441222100//.,----,++++*')))*')(((''"""$""###
- at 30BB2AAXX080903:3:60:870:880#0
-CCCCATCCAAAGGATGCCCTGGCCAGCGAGGCTGGGTCACAGGTCAGGGAGGTCCTGGCAGATCGGAATGGCCANN
-+
-67777788888888888888888877779555443222100//./,--,,++%**))*)))(((('&%%"$$##""
- at 30BB2AAXX080903:3:55:817:1350#0
-CCTGTGACCCTCATGCCCTCTGACCTCACATACTCTGACCCTGCTGACCTTTCTCTGTCCTCCGACCCTCACGCCC
-+
-67777788888888888888888877776555443222100//..----,+++***)*)))))(((#$%%%&%#"%
- at 30BB2AAXX080903:3:54:752:1805#0
-TGTGAGGTCAGAGGGCATGAGGGTCACAGGTCAGCAAGGTGTGAGTAGCACAAGCCAGGGTGCCCCGAGAGCGTAC
-+
-677777888888888888888888777765554432221/0//..---,-+++*)*)))))()(((&$&"&"###"
- at 30BB2AAXX080903:3:1:281:879#0
-AGATCCCTGGACAGTGTGTGCCTGGGATCTGGACGGGCTGTGGGATCCGAGAGCACGTACCTGCCCGCNTCNCTGT
-+
-6777778888888888888888887797655511322120,./-,+++,*,*+&'')(&''&('#&'"""#"#"""
- at 30BB2AAXX080903:3:36:139:1021#0
-GCTAGAGGTGGCTTCATCTCCACCTGTCTCGGAGGCTGTGCCGAGGATGACCGAGTCCAGCGGGCTTGTTAAGCAN
-+
-6777778888888888888888887777655544322210.//..---,-+++**)))))(((((''%&"$""$#"
- at 30BB2AAXX080903:3:43:1425:1818#0
-ATGTGGCCTTGCCTACAGCAGGCCCAGTGGCTAAGCTAGAGGTGGCTTCATCTCCACAGATCGGAAGAGGACTCCC
-+
-67777788888888888888888877776555343.22120/+..&+-)++)*&*((())'%((&%'&$%"""#""
- at 30BB2AAXX080903:3:41:1248:213#0
-AGACACAGCCATGTCCGTGTCAGGTTGCGGCTCAGAGGCAGGGGGAGACACAACCATGTCCCCGTCAACGGGCGTA
-+
-677777888888888888888288/77765564(12220.0/..,.-++))('**)(('(((&'#&%"#%#%""#"
- at 30BB2AAXX080903:3:58:645:1784#0
-GAGGCTCCTGTGTGCCCACCCCCCTTGGCACCCACAGCTCGCCTCTTCTTTCGGCTGGGGCTCCGTGGGNCAGCTN
-+
-67777788888888888888838877776555283220000----.-,,--+*+)**))*''&((%&'&"$"#"""
- at 30BB2AAXX080903:3:55:692:1757#0
-GCCGGACCAGGGCAGGATGAGAACTGGCTGGGAGGGCTGGCGCCGGGGCCGAGGGGCGGGGGAGCGTCTCCCCGAC
-+
-67777788888888888888888877776555-432(010./-/----&$,)+**&(*)#()#(##'$""#$$"##
- at 30BB2AAXX080903:3:60:561:433#0
-CTCAGGGTGAGCCTGTCTTGGCCCTGGGGACCGGTCAGCAGACACCCAGCACGTCCGCACGGGCAGAANTAACANN
-+
-67777784888888888888888877776455442212100./-.--,,,+++(*)**)))(()(('%""####""
- at 30BB2AAXX080903:3:44:1788:613#0
-CTGGGTGTCTGCTGACCGGTCCCCAGGGCCAAGACAGGCTCACCCTGAGACCTGCTGACCGGCTGCTGTGCGGCCG
-+
-677777888888888888888888777765554432221/0//...-,,,+,+**))))*((('(&%&#&"$#""#
- at 30BB2AAXX080903:3:60:1629:1886#0
-CCCGGGCACCACCCTGCACATGCCGCCCCTGCCCCACGAGACCTGGGAGCTCACACGGCCTCAGAACACACNACNN
-+
-&777778881881888488888*1717-655.0$20./.0/+).---)+%*)%'*)%#('''('#'&$#"#"##""
- at 30BB2AAXX080903:3:1:1534:865#0
-TCCAGCTACAGTACATGAGGACGACTTCCTGGCACGGGGCCGGGCTGAGGTGGGGTCAGACATGGGCCNCGNCAGC
-+
-67777788888881888888782876/1.3002-+3210.01,-*+-',,$+**)##()##'#'#&#""#""$#"#
- at 30BB2AAXX080903:3:39:390:1656#0
-TCCCGTGCCTCCGCCACCCGCGGTGAAACCTCAGACCTGCCCTCCCTGCCGCCCCGGGAATGTTCCACATCGTGTG
-+
-+777728888888088-/18/88(772.*/5()4+',21.#..--+,,&+,+*))#((%'((%(##%&$$$%""#"
- at 30BB2AAXX080903:3:48:1788:1277#0
-GGTCAGGACCGGGAGGCACAAGCCCTGGCCGGGACACAGAGGCCATCTCAGAAGCAGGCCAGGAACATTGCTCCTC
-+
-67777788888888888888888877776555433221110/*-.',,,,,)*+*)))#('((#'#&"""%####$
- at 30BB2AAXX080903:3:33:1480:1507#0
-TCTGTCGCCCAGACTGGAGTGCAGTGGCGCAATCCCAGCTCACTGCAGCCTCCACCTCCCAGGCTCANGTATTCNN
-+
-67777788888888888888888877776555443312100/....--,,++*+****))))(((((""##$"#""
- at 30BB2AAXX080903:3:41:316:1689#0
-GTCCTGTACGAAGAAGGGCCCAGCGGACGATTCTAGCCAATGCAACTTACTCTGCAGGGACAGCGGANTCGGCCAT
-+
-6777778888888888888818887747635544222.0.0/..--.--,,*+**)**))(()((('"&$"%###"
- at 30BB2AAXX080903:3:42:727:764#0
-CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCTGATCACGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACCT
-+
-677777888888888888888888777765554423210/0//..-,-,,+,+$*))*))(()((''&%#"""#"#
- at 30BB2AAXX080903:3:57:378:2044#0
-CCACGCCCTCTGGGTAATTTTTTGTATTTTTATTAGAAACGGGGTTTCACCATGTTGGCCAAGATCGGACTATCAC
-+
-6777778888888888888888887'7765551332221*0//.%--,,-**++*)*()#(((('%'%&%""#$##
- at 30BB2AAXX080903:3:44:103:788#0
-ATATGAGATCATGCCATCTGAAAAGTTTCACATCTTTTTCTTTTCTTTTGAGACAAGGTCTCACTCTGTCATGCAG
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('(&'"&#$%%#%
- at 30BB2AAXX080903:3:1:1120:1095#0
-CGCCCCACCTCAGCCTGCAGAGTAGCTGGGGCTGCAGGTGCACACCACTATGCCCCGCTGATTTTTGCNCTNTCTT
-+
-6777778888888888885858/8771;4771/1-)10(/.-/,+,$*'(&('&*#&'%(##(&'&%$"%%"$###
- at 30BB2AAXX080903:3:55:270:306#0
-TATTCCAGGTGTGGTTGTGTGTGCCTATAGTCCCAGCTACTCAAGATGCCAAGGCCAGCCTGGGCAACACAGCGAC
-+
-67777748838888888888888877776555443222101/,..---,,+++****)))'))((&'&#"%#%###
- at 30BB2AAXX080903:3:37:137:358#0
-GGTGGGCAGAGGAAGGCAGCGGCATCTGAGACGTTGGGATCACTCTGACCTGGACAGGGCAACGGGGCACTCTGCN
-+
-67777788888888888888888877776505443222+/01/..---+,&++*+)))))()((((#&"#"$""$"
- at 30BB2AAXX080903:3:45:1624:268#0
-GCTGAGAGTGAGACCCTGTCTCAGAAAAAAAAAGAAATCAGTTGACTGTAGATCGGAAGAGCGGTTCNGCAGGGCG
-+
-67777788888888888888888877776555443222100//..----,+++***)*))))((#('"%#"##""#
- at 30BB2AAXX080903:3:45:435:920#0
-GCCCTGGGGTGGCAGCCTCCCTGACGTCCCACTGTCCCCGTCTGGCATTCACACCTCAGTGTCCTGAGGGTGGCGA
-+
-677777888888888888888888777765554432221/0//..---,,+++*(+)*)))'''(('$#"##"#$"
- at 30BB2AAXX080903:3:53:442:1469#0
-GGTGCCCCCTCCAGCGGGGGGTCCTTTCTGCCCTCCCCACCCTGCATCCTGTGGCCCCAGACGTGGGGTGCCCCCC
-+
-67777788888888888888888877776575443222100....---,,+)+**))((((#)#(#'"$"$""###
- at 30BB2AAXX080903:3:35:1021:1097#0
-TGAGGGGGAGCCCAGGACAGCCCCTATGCTGCCCCCGTCCAGCCCGGCCCCTCAGGCTGTGTTTCCTNCCTCGCTN
-+
-67777788888888888888888877776555443222100//..---+,,+*)***()()&((#('""$"#"$#"
- at 30BB2AAXX080903:3:40:375:1791#0
-GAGGCCCCCTTCCCCTTGGGAGCTTGAGACCCCGTGAGGGAGGCCTCCTCAGCAGCACAGGAAGGGACGGGCGTAC
-+
-6777778888888288888888887777632134121200)//),-+,,++,+)*)))()(''((('$""#""""#
- at 30BB2AAXX080903:3:59:346:800#0
-CGAGCCCTCCCACCAGCACTGGCCCTCCAGGCCCCAGTCTGTGCCTCCATCAGGAGAGATCGGAAGAGCGCGTNNT
-+
-67777788888888888888888877776555443220100./.----+,+*++**)))(()('((''$%""""""
- at 30BB2AAXX080903:3:1:448:1126#0
-GGAGGCTGCGGGCAGGGCCGACGCCCTCGTGAGCGACGTCCTTGGCCCCGGCACTCGGTAGATCGGGCNCTNTCTC
-+
--71773.888888++,1().+).(*.--+%,',(*$%,$#&%&('%"&$&%$#&#&&'##'####%#%"#$""$"#
- at 30BB2AAXX080903:3:34:1184:718#0
-CAGCAGCGGGCGGCCCGCGTAGACCTCGGGCGCTGGGGCCTCTGCGGGGGCAGATCGGAAGAGCGGGNCACCATNN
-+
-67777788888888888888888877776555423222.00/../----,++++()**)()()'((#"&##$$#""
- at 30BB2AAXX080903:3:58:1383:65#0
-GAGGGCGTCCCGGCCGACGTGCGCTCCCGCCTGCTGGGCCACCTGGCAGCCTGCCTGAGATCGGAAGAGGACANNC
-+
-677777888888888888888388777763/94122220/11.).,+,,,()+&*)(()(''&('%'%"###"""$
- at 30BB2AAXX080903:3:43:733:935#0
-CCACCCGTGCGCCCCTTCGCCGTCCGCTGACTCCGCCCTCCCGCCTGCCGACCCGGCCGCCAACCTTCCCCCGGCC
-+
-67777788888888888888888877776555443222100//...-,,-++++**))*))''(('&&$%%%$""#
- at 30BB2AAXX080903:3:37:229:351#0
-GCAGGACCTCGAGGAGCAGAACGTGCGCGTGACGCGAGCGGGCTGGTGACGTCACCAGGCACCCGGGTCANCNTGN
-+
-6777778888888888888888887777655544322210//0..-",,,+**())())((((('('$$""""##"
- at 30BB2AAXX080903:3:42:1182:1353#0
-TGTGAGCCCCACTTTGCTGCTGCTGAGTTCGCCAGCGGGTCACCTGGAAGCACGTGGCGACACGGGCCACATGACG
-+
-677777888888888888888888777765554432221/0//...-,-,+++***)))))(((((&'%&&%%#"$
- at 30BB2AAXX080903:3:48:144:1354#0
-CCACGCACCTCAGCCTCCCAAAGTGCTGGGATTACAGGTGTGAGCCACCGTGCCAGATCGGAAGAGCGGTCACAAC
-+
-6777778838888888+888888877776555443222100//..---&,+++***))))))(((''$""$"#""#
- at 30BB2AAXX080903:3:52:820:775#0
-GTCGGCACCATCCTGGGCTGCAGCCCAGGATCCACCCCCACACTCAGAGCAAGGGAACCCCAAGGAGCACGCGCAC
-+
-677777888888888888888888777765554432221000/..--,,-,++**))**)()(((('""#&##"##
- at 30BB2AAXX080903:3:38:1086:618#0
-TGTCCCAGGACAGCGAGGTACGCATGGCGTCTTCCAAGTCAGCCTCAGAAGTCATGTCCTGCCAAACACACCATAC
-+
-67777788888888888888888877776555443222100//./---,-+++*******))(((''&&$%&#$$#
- at 30BB2AAXX080903:3:58:1140:1676#0
-AGTCGCTGAGCCTCTGCCTCTGTGGAAGAGAGGAAGGGATCAGCGAGGAGGGAGCAGGGGTGAGGAGGGCAGAGTN
-+
-67777788888888888888882877776555423222./)///-$--+-+,*+)))())&((((#%&"##""$""
- at 30BB2AAXX080903:3:1:488:1415#0
-TGTTGGGGGGTCTCCTCACATTGGGCCACTGTGGCCGCACTCCATGACCACAGCCAGTGTCCCCAGAANCGNATCC
-+
-6777778888888888888886807777655144352../0...,..,+,+++**))()'((&((''"""""#"#"
- at 30BB2AAXX080903:3:58:198:700#0
-GTGGCGAGATGGCAGCCGCCACCTCTGGGTCAGAGGTTGGGAGGGGAGGTCACAGCCAGCACCTAGATCGTCANNC
-+
-67777788888888888888888877776355443212100//..-,-,&+*+**))())(((%'('"&%#$"""#
- at 30BB2AAXX080903:3:54:1090:1969#0
-AGAGACCAGGACTCAGGCAGAAGCAGCAGCACGAGGCTGGCGCCACTGCCAACCCACCGGCATGCATGGCTCGCAC
-+
-67777188888888888888888&77776)55(4322210,//..-,-++$++*%())#)(('((''$"$"$$##$
- at 30BB2AAXX080903:3:39:1261:99#0
-CTGCTGAGAAGGCATGCAGGTGGGGTGGCAGTGGCACCAGCCTGGTGCTGCGGCCTCTGCCTGAGTCCGTGGTCAC
-+
-67777788888888888888/88877776521483%12000/&,,'-,,-+$**#(('(((%(#'#%$$#"%"###
- at 30BB2AAXX080903:3:52:1502:677#0
-CTTGGAGACACAGCTCCCACCGCTGCTGAGAAGGCATGCAGGTGGGGTGGCAGTGGCAGCAGCCTGGCAGCGCCNC
-+
-6777778888888888888888887777656554122..00/-..--,-,+++)**%)()(()('('$$#$"#$"%
- at 30BB2AAXX080903:3:3:1331:522#0
-AGCAGCACCAGGCTGGTGCCACTGCCACCCCACCTGCATGCCTTCTCAGCAGCGGTGGGGGCTGTGTCNCGCANCA
-+
-677777888888888888888188787626/54112/100.+,/,,,+,,++'**#(()#'##'#%#$"#"&#"##
- at 30BB2AAXX080903:3:60:1053:1721#0
-AGGCTGGTGCCACTGCCACCCCACCTGCATGCCTTCTCAGCAGCGGTGGGAGCTGGGTCTCCAAGCATGNGACANN
-+
-6777778888888888888888887777655144322200/-.-..&+,,$,%*+#*(&(''&&#&&"%""#%#""
- at 30BB2AAXX080903:3:2:1138:959#0
-GAAGTGGAAGCCTAGGGACTCTTGAGGCCAGGATCCAGAACGCACATAGTAAGATCGGAAGAGCGGGTNTCCGACC
-+
-613207-88888,1188-/8+388+31-)+*20-(%%/$-#*&)%&&'+%)'''##%(#'&#'#'&#"""###$#"
- at 30BB2AAXX080903:3:51:413:189#0
-CCACTGGAGACCCAGGCCCAGCTGTCCTGGGGGCACTGCTGCGGGGGGAACTGAGATCGGAAGAGCGAGTCTTNCT
-+
-677777888888888888888888777765554432121/0//..---+++*+)**))))('(((('""$%""""#
- at 30BB2AAXX080903:3:1:312:802#0
-CTCCACGGGCGAGGATCACGTAGAGACGTGTAGAGACGCGACGAAGCACGAAGACCCGCGTTTGACGTNAGNACAC
-+
-677777888888888888888888764765)5403,2210,-/,.--+,,&&+(''()#)#''(%&'"""""#%##
- at 30BB2AAXX080903:3:37:54:607#0
-GAGGCAGGAGAATCGCTTGAACCCGGGAGGTAAAGGTTATGGTGAGCCAAGATCATGCCACTGCACTCGCCACTAN
-+
-67777788888888888888888877776555443222100//..-.-,,+++***)*)))((((('%"##"$"$"
- at 30BB2AAXX080903:3:39:492:805#0
-GATCTCCTGACCTCGTGATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCACCGCGCCCCC
-+
-6777778888888888888888887777655544301210//..-.---,+,++***()()()''''$$%#$%###
- at 30BB2AAXX080903:3:58:1378:782#0
-CAGGAGTTCAAGACCAGCCTGGCCAACACAGTGAAACCCCGTCTCTACAAAGATCGGAAGAGCGGTTCAGCTCACA
-+
-67777788888888888888888877776555443222100/...---,,+++***)**))(()''''"%""#$$$
- at 30BB2AAXX080903:3:50:124:431#0
-CCAGGCTGGAGTGCAGTGTCGCAATCTCGGCTCACTGCATCCTCCGCCTCCCGGGTTCAGATCGGAAGAGAGCACA
-+
-67777788888888888888888877776555443222100//..---,,+++**)))))))(('''"""""#"##
- at 30BB2AAXX080903:3:45:37:146#0
-TGTCAGATGGTGGCTCACATCTGTAATTTCAGCACTTTGGAAGCAAAGCCTAGAGGATCGCTTGAGCTAGCGTACC
-+
-6777778888888888888888887777655544322210///...--,,+++***)))))))((''"$""#""#"
- at 30BB2AAXX080903:3:43:530:1752#0
-TCTCAAACTGCTGACCTCAGGTGATCTACCCGCCTCGGTCTCTCAAAGTGCTGGGATTACAGGTGAGCCACTGCGC
-+
-677777888888888888,8888877774555443222100//.,---,,+++**(())()((&('(%%$%$&#"$
- at 30BB2AAXX080903:3:8:1762:889#0
-CCCAGGAGACAGAGATTGTGGTGAGCCAAGATTGCACCAATGCACTCCAGCCTGGGCAGATCGGAAGNCAGTCANN
-+
-67777788888888888888888877776555443221110/..---,--+**+*)()))(((('''"%"""$#""
- at 30BB2AAXX080903:3:35:393:48#0
-GCTGGCACAGAGCCCACCTCCCCCCACCTGTGACATCTGCCTTACCATGGCTGTGGGCTGCCGGCTGNTGTCTCNN
-+
-6777778888888888%(8888887.70151,1,221110-.+-,--+',+'+$'*)(')##'&#%'"#"%#"$""
- at 30BB2AAXX080903:3:45:278:963#0
-GTGCCGCCTCCCCGCAGGCGCAGATTCATGAACACGGTGCTCAGGGGCTTGAGGCCGGACTCCCCCAGGGGGGGAG
-+
-67777788888888888888888877776555443222100//..---,,+,+***)#('('((((%&"%$##$"#
- at 30BB2AAXX080903:3:33:156:616#0
-CTGATCAGGCGGGTCCCTGCCTAAGCCGTCTGCTGTCCCAGATGGAGGACAGGCAGGATGGGCTCCANGTCACANN
-+
-67777788888888888888888877776555443222110//..----,,++***)()))((('('""#$"$"""
- at 30BB2AAXX080903:3:39:1125:878#0
-TTGAACTCCTGGCCTCAAGTGGTCCGCCTGCCTCGGGCTCCCAAAATGCTGGGATTACAGGTGTGAAGGTCGGATA
-+
-67777788888888888882888877775555443221101/.-.---,,++++***(())')&(&'""&#"#"""
- at 30BB2AAXX080903:3:34:214:1614#0
-AGGCAGTTTCACCATGTTGGTCAGGCTGGTCCCGAACTCCTGACCTTGTGATCCACTCCCCCCTTGGNAGGCATNN
-+
-67777788888888888888888877776555443222100/...-.-,,+++)**)*)())(((('"$""%#"""
- at 30BB2AAXX080903:3:36:1697:1705#0
-GCTAGACATAAATGTTCTCCAAGGTCTCACCAGAGTAGCTAGATACAGAGTGTAGATAGGAAGAGCGNCTCTCANN
-+
-6777778888888888888888887777655248303210//--.-,-,,(+%***($))#)('('&"""%"$"""
- at 30BB2AAXX080903:3:4:386:938#0
-GTTCTCCAAGGTCTCACCAGAGTAGCTAGATACAGAGTGTCCACTGGCGCATTCACAAACCCTGAGCANCGTCNAN
-+
-677777888888888888888885777765554431201.1./.-&-(,+*+*')))((((((('''&"#"#""#"
- at 30BB2AAXX080903:3:49:732:1128#0
-CACAGGGTGCTGATTGGTGTATTTACAATCCCTGAGCTAGACATAAAGGTTCTCCACGTCTCCACCACGCACAGNT
-+
-6777778888888888888888887777655544322220///..---,++,+*++**))))((('''"#""#"""
- at 30BB2AAXX080903:3:37:56:1616#0
-TCTCCACGTCTCCACCACTCAGGAGCCCAGCTGGCTTCACCCAGTGGATCCCGCACTGGGGCTGCACGCAGNTCAN
-+
-677777888888888888888888777765054432210//0,..--+,+*++***()*))%#(''#"&$#""$""
- at 30BB2AAXX080903:3:43:1004:645#0
-CCCCTGCTCCACCGTGCCTAGTCCCATGACCACCCAAGGGCTGAGGAGTGCGGGTGCACAGATCGGAAGGGCGGTC
-+
-67777788888888888888888877776555443222100//..----,,++***)))*))(((('%&"%"%#""
- at 30BB2AAXX080903:3:4:994:354#0
-CTGAGGCAGGAGAATCGCTTGAACCCAGGAGGCGGAGGTTGCAGTGAGCTGAGATAGATCGGAAGAGCNTTCANAN
-+
-67777788888888888888888677776-55343122200-..,.,-,-,)+)**)))'()('(('$"""%#"#"
- at 30BB2AAXX080903:3:47:333:508#0
-TGAGCACCACGTTCGCCTCCTCCTCGCGCCGCTCCAGCGCGCGCTCCGGGCATGTCCCGCCAGATCGGACCATTGT
-+
-67777788888888888888888877776555443/221000/.-.,,,,++*+*)))))((((&''"$##$""##
- at 30BB2AAXX080903:3:42:605:1576#0
-GGCGGGGCGGCAGGCGTCGCGAGGGGAGGCCGGGGTCCGGGTGGGCGCACCTTGCAGGAGTACGTGTGCTGCACCT
-+
-67777788888888888888888877576345445,,-100%/..'-'++*)+*'(**&)'&'('(''&"&&##$"
- at 30BB2AAXX080903:3:42:875:993#0
-TCCTGCGGGAACCGGGGCTCCCCACCCCGGGGATGGGAAGTTTCCCTGGTTTCTCCTTCAGGTGCTTCTGGGGGTC
-+
-6777778888888888888888887777655543322.200./------,+,)+***))(()'('''&%#$""""#
- at 30BB2AAXX080903:3:39:1305:1795#0
-CCAGTTGCGCAGGCAGAGCCTCTTCCACGCCCCCCAACAGTAGGCTCCAGGAGGCAGATGACCCAGGCACCGTTCG
-+
-6.777788888888888888888877776/)5343)-1/.)/.-*,,,),+(+*&)()'(('#'##'$""#"""#"
- at 30BB2AAXX080903:3:39:1706:1058#0
-AGGCCGAATTTGGGAAGGGGGCCCACCTGGCTTGGGGTGCCTGCCGTCCACACCTCTCCCCACAGCTCGTCAGCAG
-+
-677777888888888888*888887677655)&4322#000-.-,)+,)%&&%)**(((%'((''##$%&##&%$%
- at 30BB2AAXX080903:3:51:816:1387#0
-CACACGAGCCCCCCACCACGCACCTTCCACACAGAACTCCACCTCCTCCAGGTTCCGCAGGGTGATCCGACNCANG
-+
-67777788888888888888888877776555443222100/./.----+++)*****))((((((#%$"$"##""
- at 30BB2AAXX080903:3:60:760:824#0
-TGCCGGCCAACGGAGCAGATCGGAGAGACGGGAAGTCAGGACCCTTACCGTTGCCTTGAGGAGGAAGCACTCTGNN
-+
-67777788888888888888888877776555343522100//..,--,,+++***))))))((((&'"%"$"#""
- at 30BB2AAXX080903:3:47:925:1894#0
-GCCAGCCCTGGGCAGCTGGCACTGCGGAGGCCAGGCCACTTCCCTGACAAAGCAGGGGCGGGGGGCGACCTGTCCC
-+
-67.77788888888888888888877746542343.-02./'-+-.-+,,++)+*))(')()((###"""#""###
- at 30BB2AAXX080903:3:40:730:1742#0
-CTGGCCCCCTGCCCTGTCCCTGTGCCAGGCCCCGGCAGGGGCAGACAACACTCCCTTTCTCTGCTCCCGCCCCCGC
-+
-67777788888888888888,8887777636634330210/+-.,..(++++*)****))(()'('#$$""$##"$
- at 30BB2AAXX080903:3:1:1716:1165#0
-GCACCCTCCCTTCCTCCCTGCCTGGCCAGCTGCCTAGGCCTCAGGACGGCAGTCCTAGGGGAAGCCGCNCCNACCA
-+
-67777788888888/8882/8426.*41+3-1,1/(.-*-)-+)*'+++)*)#&###'&''######%"##""###
- at 30BB2AAXX080903:3:1:351:1530#0
-CAGGAGGGGGCAGGAGAGGGTGGCAGGAATGGGGAGGAGTTGGGGGCAGGAGCTGAGCCCTGGAGAGCNACNACAC
-+
-61777788888888188888,888*74-+05632(12'0$)..--.+*++%*#$*#)&(&#'(#(##$""%""$"#
- at 30BB2AAXX080903:3:60:1146:1564#0
-CAGCAAAGCCCCCCCCCAGGCCAAGGCAGGGACAAGCCCAGGAGAAGTCAAAGACGGGACAAGTCCACTCCATTNN
-+
-67777788888888888888888877776555242200*.0//.,--,,-++++'**))()((('&'&%"$#""""
- at 30BB2AAXX080903:3:52:1113:1194#0
-CCACCAGCGGCCTGGGTGGGGCAGGAACGGACCCCCTCCCTGCAGTCCTGGTTCTGGCACCCCCTCCCCCCTCTGC
-+
-677777888888888888888888767765564432220/,/../,-,+,+$*)**)(((''(((&'"$"&%""""
- at 30BB2AAXX080903:3:34:437:786#0
-ACGCATGTGTGTGCACGTGCCTGCAGCCTCAGATGTACCAGCCTGTGCACTTCAGAAGATCGGAAGANCACGACNN
-+
-677777888888888388888888777765554-322210///..*-,,,*,+**(*)))()('((&"$"$##$""
- at 30BB2AAXX080903:3:51:91:1306#0
-CTTGCTGTTGGTTGTCCACTCTCCTGCCCTCTGCTCACTGCGTCCAGCACGCTGCCCCGTGTCTGGCAACGCTCGC
-+
-677777888888888888888888777766554420220010../,--+++***))*))()'((''#""$"#"""#
- at 30BB2AAXX080903:3:41:1380:918#0
-TGATGAAATCAGTGAAGGTCATGGTGAGCCCTGCTCACACCCCAGCCTCCCCAGATCGGAAGAGCGGTTCAGCCTT
-+
-67777788888888888888888877776555443222100//..--,,,+++*+**)))(()((('%$$#$""""
- at 30BB2AAXX080903:3:47:1290:845#0
-TCCACGCCAGCTGTTTTCCTTGGTTGGGGTTGGGGGCACCGAGCGTTTGGGTGGACCGGAAGTCAGCGGCTGCTCT
-+
-67777788888888888888888877776355443222110-/..-.,,,+*+***)**(()%'('%""$#$#"$#
- at 30BB2AAXX080903:3:44:1188:1097#0
-TTGGCCCACGAGGGGCTGGGGCTCGGTTCCTTCGGAAAGGGTGGCGTGGGTGTGGGCGGCCTTGGCGCGCGGCGTA
-+
-6777778888888888888881887717.315343-2/110-..+.-,,,$('***(*(((#%(('#%"%%""#"#
- at 30BB2AAXX080903:3:55:344:1944#0
-GTGTGCCTGTGTCCACACGGGAACATATGGGTGGGAGGTGAGGAGAACGTGCCTTCCCAGTGTATGGGTGTGCTAC
-+
-67777788888888888888888877776555443222/0///...-+,++)*(*)()#)')#'(''"$#""####
- at 30BB2AAXX080903:3:1:145:2036#0
-CCCTCCACCTGCCCACATAGACGCGGGATGTCCCCCTCCCCCTACCTCCCTGCATAGACACTGATGTCNACNCACA
-+
-67777788888888+838388888637-05+55430+112//'*.-($,-&)+*&'(()')#(&#&#%"#$"##$"
- at 30BB2AAXX080903:3:60:627:1694#0
-GGTGCTGGGCAGGCCAGGAATACCCATTGTGTGGCCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGCTAACANN
-+
-67777788888888888888888877776555443222100//..---,++++***)))()(((('''"$$"%$""
- at 30BB2AAXX080903:3:50:232:1691#0
-GCTGATCTCACAGCACCATGCACTGCACACACACATGATCTCACAGCACCATGCACTGCACACACACACACACATC
-+
-67777788888888888888888877776555443222100//..----,++++**)))))((((''$%"%"##"#
- at 30BB2AAXX080903:3:36:1047:646#0
-TGTGTGCAGTGCATGGTGCTGTGAGATCATGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGCTTGACACN
-+
-67777788888888888888888877776555443221100/...---,+-++****)))()(('%'%$%$$$$#"
- at 30BB2AAXX080903:3:39:595:1280#0
-TGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGTGTGAGATCGTGTGTGTGTGTGCAGAGTGTGGCC
-+
-67777788888888888888888877776555413222/01/..+----,$+***+***)()&)'''"&#"%$$""
- at 30BB2AAXX080903:3:44:88:600#0
-AGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGTGCGACACG
-+
-67777788888888888888888877776555443220100//..---,,,+++**)))))()(('&&&"%"""""
- at 30BB2AAXX080903:3:50:24:714#0
-CGCTGCACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATCTCAATCACC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''%$""#"#"#
- at 30BB2AAXX080903:3:45:817:797#0
-ATGCTGATCTCACACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCATGCACTGCACACACAAGC
-+
-67777788888888888888888877776555443222100//..---,,,++****))))()(((''$$"##"$"
- at 30BB2AAXX080903:3:43:39:1175#0
-TGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATCTCACCG
-+
-67777788888888888888888877776555443222100//..---,,-++***)))))((((''%"#"#$#""
- at 30BB2AAXX080903:3:40:1414:1013#0
-CACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCNTGCCC
-+
-67777788888888888888888877776555443222100//..---,,+,++**)**)))((((''&%"#%"$"
- at 30BB2AAXX080903:3:45:1434:1505#0
-TCTCACAGCACCAGGCACTGCACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACAGACACGCC
-+
-677777888888888888888888777765554422.11/0//--,-,,,*++*)))*)*('(('('%""#""#""
- at 30BB2AAXX080903:3:2:954:1913#0
-ATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGCAGTGCCTGGTGCTGTGAAGATCGGAAGAGCGNCTGNCGC
-+
-677777888888888888888888/7873555242222100//./.",+,+$+***)#()''((%(#$"#"""#"#
- at 30BB2AAXX080903:3:42:699:1233#0
-ATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGCAGTGCCTGGTGCTGTGAGATCAGCGTGTGTGTGTGCCCT
-+
-.7777788888888888888888877776555443221100/...-&--,++++***)())((((''&&%%%#""$
- at 30BB2AAXX080903:3:8:1779:873#0
-GATCTCACAGCACCATGCACTGCACACACACACACGCTGATCTCACAGCACCACGCACTGCACACACNCAACTGNN
-+
-6777778888888888888888887777655544323020/+..,.-()++''$)))*&%''&''''"&#"%##""
- at 30BB2AAXX080903:3:39:1663:397#0
-CTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCGGGTCG
-+
-677777888888888888888888777765554432321000/..---,,+++***)))))(((((('&""""##"
- at 30BB2AAXX080903:3:36:432:1667#0
-CTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACATGCTGATCTCACACAGTGCACATCN
-+
-67777788888888888888888877776555443222100//..-----,++**+))*))(()(''&"$"%###"
- at 30BB2AAXX080903:3:3:446:170#0
-CTCACACAGCACCATGCGCTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACATNCTACNCN
-+
-677757888888888848028)8146754.524132.,.0,.*..-++'+++)('*)#('((('(&%""%"$$"#"
- at 30BB2AAXX080903:3:33:860:1735#0
-TGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGTAGANCGCGCCNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((('"&$$###""
- at 30BB2AAXX080903:3:35:1594:1487#0
-CACACGCTGATCTCACACAGCACCATGCGCTGCACACACACACGCTGATCTCACAGCACCATGCACTNCACCGCAN
-+
-67777788888888888888888877776555443222100//...-,-,++++**))())'((((%"$"$#"$$"
- at 30BB2AAXX080903:3:43:1135:1584#0
-CACAGCACCATGCACTGCACACACACACACACATGCTGATCTCACACAGCACCATGCGCTGCACACAGATCGGAAG
-+
-6777778888888888888888887777655344352210//...---,,+++***)))()(('''''"%%&#%"#
- at 30BB2AAXX080903:3:34:898:1843#0
-ATGCACTGCACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACCCACACACACTTCTNGACAGCNN
-+
-67777788488888888(88880877716-$54,3302+100...,(-,,+++%(***#)&###%''"""####""
- at 30BB2AAXX080903:3:58:800:436#0
-TGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGCGTGAGATCAGCATGTGTGTGTGTGCAGTGCGTAACCA
-+
-67777788888888888888888877476555413222&0///...-,,,+++**))*))))((((''%"#####$
- at 30BB2AAXX080903:3:8:1007:1618#0
-TGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGCAGTGCATGGTAGATNACCACANN
-+
-67777788888888888888880877736355442212000/..,-.-+,+++*+)))))))((((&"####%#""
- at 30BB2AAXX080903:3:52:1069:1270#0
-TGTGTGTGTGCAGCGCATGGTGCTGTGTGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGAGCGGCGTG
-+
-6777778888888888888888887777655544322210///.--.-+,+++)%***))'()((&'""""&#"##
- at 30BB2AAXX080903:3:34:1223:389#0
-ACACGCTGATCTCACAGCACCATGCGCTGCACACACACACGCTGATCTCACACAGCACCACGCGCCGNCAACTANN
-+
-6777778883-88888888888887277655544322210//'.,.--,,++***+)(((&((''#'"%##$#"""
- at 30BB2AAXX080903:3:3:1535:1296#0
-TGCACTGCACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACGCTGATCTCACAGCNTCACNCN
-+
-677777888888888888888888777765594612.000/...-,,+,,++***(&()(('('#%'"""&%%"#"
- at 30BB2AAXX080903:3:57:876:1633#0
-CTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATTGTCACAC
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(('''%$%%$"###
- at 30BB2AAXX080903:3:38:439:1679#0
-TGAGATCAGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGAGCTCTTCC
-+
-67777788888888888888888877776555443222200/,-.--+,,+*++**)())()('(('""$##""##
- at 30BB2AAXX080903:3:51:757:258#0
-AGCGTGTGTGTGTGCAGCGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGTGACAGGGC
-+
-6777778888888888888888882777655544322210///.-----,+,+*****))(()((('"""#""""#
- at 30BB2AAXX080903:3:8:1553:738#0
-CGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGNGGCCACNN
-+
-677777888888888888888888777;6554443212./0/...,--,,,+*)'(*()()((('(&"$"####""
- at 30BB2AAXX080903:3:34:1493:416#0
-TGTGTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGTGTGTGTGCAGTGCATGGTGCAGNCTGTCTNN
-+
-67777788838888888888888877776555443232001//.-----,,+***()))()(')'('"$$%"#"""
- at 30BB2AAXX080903:3:34:991:975#0
-TCACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCATGCACTGCACACACACACACNCTGTCANN
-+
-67777788888888888888888877776555443222100/...,,'-,,+***+**)))((((('"#"""$"""
- at 30BB2AAXX080903:3:35:834:571#0
-TGTGTGTGCAGTGCATGGTGCTGTGAGATCAGCATGTGTGTGCGCAGTGCATGGTGCTGTGAGATCANCACACCGN
-+
-67777788888888888808888877776555443222100/&..---,,++**+***()))(((''"#"$$#$#"
- at 30BB2AAXX080903:3:44:1385:690#0
-GCACACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACATGCTGATCTCACAGCACCAGGCACACA
-+
-67777788888888888888888877776555443222100//..---,,+++**+**))))()(('%"$$"%"""
- at 30BB2AAXX080903:3:39:319:2022#0
-ATGCACTGCACACACACACACGCTGATCTCACAGCACCATGCACTGCACACACACACGCTGATCTCAGAGCCCCAC
-+
-67777.88888888880833+8/87371635(3411#-1-/..,,.,-,,++*+*)()(''((&'%'"$""#%###
- at 30BB2AAXX080903:3:39:34:1250#0
-GTGCAGTGCATGGTGCTGTGAGATCAGCGTGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGACGATCTCT
-+
-67777788888888888888888877776555443222100//..-+-,,+++***)))))(((((&%$""##"#"
- at 30BB2AAXX080903:3:34:898:1844#0
-ATGCACTGCACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATNCACAGCNN
-+
-67777788888888888888888877776555443222000//...---,+,+****)))((('(''"$""#"$""
- at 30BB2AAXX080903:3:54:256:1513#0
-TGTGTGAGATCAGCATGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATCAGCATGTGTGTGTGTGTGGGGGGTG
-+
-67777788888888888888888877776555443222100//..----,+,+**+)))))((('(&$"$"##"""
- at 30BB2AAXX080903:3:56:1495:865#0
-ACACACACACACATGCTGATCTCACACAGCACCATGCACTGCACACACACACACGCTGATCTCACAGCACCACCCC
-+
-67777788888888888888888877776555443222100//..---,,+,+*&*)&)()&)(('%$$%&&"##"
- at 30BB2AAXX080903:3:8:909:1802#0
-ATGTGTGTGCAGTGCATGGTGCTGTGAGTGTATCAGCATGTGTGTGTGTGCAGTGCATGTTGCTGTGNCTCAGANN
-+
-677777888888888888868888.777955544120110./,.,-,,+,+,+(*)'))(()(((&'"$"&"#"""
- at 30BB2AAXX080903:3:55:965:1270#0
-CACACACAATCACACTCACAGCACCATGCACTGCACACACACACATGCTGATACACTCACAGCACCACGCACCTCA
-+
-67777788888888888888888877776555443222100//..---,,+++***))))))(((('%$%&"$"##
- at 30BB2AAXX080903:3:37:448:860#0
-GCACACACACACACACAATCACACTCACAGCACCATGCACTGCACACACACACATGCTGATACACTCTNAGANTGN
-+
-67777788888888888888888877776555443222100//..---,,+++*****)*)((((''""$%#"%#"
- at 30BB2AAXX080903:3:48:1334:729#0
-GTGTGATTGTGTGTGTGTGTGTGCGGTGCATGGTGCTGTGTGAGATGTGTGTGTGTGCAGTGCATGGGAGTCGCAG
-+
-67777788888888888888888877776555433222100//..---,,+++***)**)()(((('"#""#""#"
- at 30BB2AAXX080903:3:44:1255:1397#0
-GGTGCATGGTGCTGTGTGAGATGTGTGTGTGTGCAGTGCATGGTGCTGTGTGAGATTGTGTGTGTGCAGGCTACGA
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((((''&"##"""#%
- at 30BB2AAXX080903:3:38:1048:217#0
-TGCTGTGTGAGATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGGCGCTCTCNN
-+
-67777788888888888888888877776555443222/0//..--.-,-++++*()*))))((('#$$&%&&$""
- at 30BB2AAXX080903:3:3:249:59#0
-GATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTCNCTGTNCN
-+
-6777778888888828880888817177.555241101&/0*-/.--,-,+++$#)')#&((('(#%&"#""""#"
- at 30BB2AAXX080903:3:37:1529:1008#0
-ATTGTGTGTGTGCAGTGCATGGTGCTGAGTGTGAGATCAGCATGTGTGTGTGCAGTGCATGGTGCTGATCGCCCGN
-+
-67777788888888888888888877766555443222100//.--.--,,++**))))*))&('('$##"$##""
- at 30BB2AAXX080903:3:48:241:1228#0
-TGTGTGTGCAGTGCATGGTGCTGTGAGTGTATCAGCATGTCTGTGTGTGTGCAGTGCATGGTGCTGAGTGATATGA
-+
-67777788888888888888888877776555443222100//..---,,++****)*)))((((''""$""""""
- at 30BB2AAXX080903:3:4:1098:711#0
-CACTCACAGCACCATGCACCGCACACACATACACACACATGCTGATCTCACACTCAGCACCATGCACCNCACCNAN
-+
-6777778888888888888888887777655544322221///.-.---,+++****))(((('(('""####"#"
- at 30BB2AAXX080903:3:56:529:265#0
-CTGGCCCCACCCAGCCCCAGTCAGTGTCTGAGCCCCCCACAGAGGCCCAGATGCCTTCAGAAAGACAGAGGGCCCG
-+
-67777788888888888888888837776555443222100/...---,,+*++***)))'(((((("""&#####
- at 30BB2AAXX080903:3:51:401:237#0
-CCAGGAAGGCAGCAGGTGTGGGCAGTGGGTCCTCTGGGGTGGACTGAGGTGAGGCCTGGGTGTGACCAGAGCGGGC
-+
-677777888888888828)888857777655$0,32221.0/..--+-,(+++**)))))')(((''"#""#"%""
- at 30BB2AAXX080903:3:42:1745:575#0
-TGCCGGCAGCCACCAGTGCCACCGCGTGGTCACACCCAGGCCTCACCTCAGTCCACCCCAGAGGACCCCCTCNCNG
-+
-67777788888888888888888877876/55443222100/..---+,,,*+***))*(('(((('&"%"#"%""
- at 30BB2AAXX080903:3:44:897:1052#0
-CAGCTGCCGGCAGCCACCAGTGCCACCGCGTGGTCACACCCAGGCCTCACCTCAGTCCACCCCAGAGGCCCCACTG
-+
-67777788888888888888888877776555433212000//.--,,,-++**+))))((((((''&"%$$$$##
- at 30BB2AAXX080903:3:54:51:775#0
-TGCCCCGGCCGCACCCGCCTCCGCTCCAGCACGCGACGCTGCCCGGCGCGACCCCTGCTCCCCAGACCGGACACAG
-+
-67777788888888888888888877776555443222100//..---,,+,***))*()))('(&#""""#"###
- at 30BB2AAXX080903:3:34:1736:404#0
-TGGCGCGGGACACCCGGCAGCCGCCTGGCGCCTCCCTGCTGGTGCGAGGCTTCATGGTGCCCAGATCNACACGANN
-+
-67777788888888888888,88876776/55/132+00-/-'-,,+++*$*)&(((#(#'(''##%"$%#%""""
- at 30BB2AAXX080903:3:35:1422:172#0
-CTTGTCCAGCCTCCTCCTCACTCCAGACACACTCCACACGTCTGGGTGCACACCTCCAAATGAGATCNACATGCNN
-+
-67777788888888888888888877776555443222100//..-,-,-,*+*++))())))((('""&"#"$""
- at 30BB2AAXX080903:3:52:43:932#0
-GGGGGCGGGCTGACCTTGTTGACCTGCTTTGTGAGGTGGGGCCTGTCCTCCCCGGGGTGCTCCTGGANCCGGGCAG
-+
-67777788888888888888888877776555443222100//....-,-+,+++*)()(('((((#"##"&$"##
- at 30BB2AAXX080903:3:36:1702:1668#0
-GTTGACCTGCTTTGTGAGGTGGGGCCTGTCCTCCCCGGGGTGCTCCTGGTGTTTGGGCGACTGTAGANTTCCTTNN
-+
-67777388888888888888888877776555413222/00/...---,,+(++**)(()(((((('"""###"""
- at 30BB2AAXX080903:3:60:1147:1574#0
-CCCCATCACTGGGTCTCACTTGCGTTCAGTTGTGTGTGCAGGGGTGTGTGTGAGGGCTTTGCTGGGGTCTCATCNN
-+
-67777788888888888888888877776555441222&/0//(---$-,,+%***(&(()&((%('$'$%%"$""
- at 30BB2AAXX080903:3:47:894:168#0
-GGAATGGGGAATGGTGGCTGTGGGAACCCGTCCTACCCCTGGGCTCTAGCCCTGCAACCTGCCCGTCTGANTATAC
-+
-67777788888888888888888857776/'242/5222(///-).+++(+*#)*()(*%'###&#%$"""""#""
- at 30BB2AAXX080903:3:43:1148:612#0
-GCTCTGGCCCGTAACTATGACCACAGTTAGGTGGCATGTGGGTCACGATGGCCTTGGTGTGGAGAGATCGGGGGCG
-+
-67777788888888888888888877776555443222100/0..---,,+++***)))))(((('&&&&##"#"#
- at 30BB2AAXX080903:3:43:842:1137#0
-ATGCGCTGTGCCTGGCGGGTACGTGCGTGTGTGCCATCACCACGTGCACCTGTCTTCAGGTGATCAGATCGCGCTC
-+
-67777788888888888888888877716.5044322-000/..---,+,-+**++***)'((('''""%%#"$"#
- at 30BB2AAXX080903:3:45:224:1085#0
-ATGGGGGGCCAGTGCTCAGCCTGGCTTCAAGGTCCCGCCAGGTACCCAAGGTCTCTCCACTGCCCTGCCACCTTGG
-+
-67777788888888888888888877776555443222100//...--,,+++*****))))((('''%"$"##$%
- at 30BB2AAXX080903:3:58:221:534#0
-CAAGGTCTCTCCACTGCCCTGCCACATTGGTCCAGCAGCTGGTCACTCAGAGCCTGTAGATCGGAAGGTGTACANA
-+
-67777788888888888888888877776555443212100/..-----,,+++*+**))))))'(&$$%"##%"#
- at 30BB2AAXX080903:3:3:434:949#0
-TCCAGGAACAGTGCCCTTGGCCATGGTGTCAGGGCCTTGGGAGAGGTCTGGCTGAGCCAAGGTGACCCNAAGANCA
-+
-67777788888888888888888877176555442322100//-.-,,,,-+****())())&)('#%"""##""#
- at 30BB2AAXX080903:3:57:197:1222#0
-ACCAAAAGGGGAGAAAGGCTCAGGAGCCCTGGTGCAGGGAGGTGACTGGGTCCTTGGCCATGGGGTTCGNGTCCAT
-+
-677777888888888888888888777765554432221/0/-.-.--,,+++***)))(()(((#'%$"""####
- at 30BB2AAXX080903:3:37:1335:1194#0
-TGGGCCAGTATCTGCAAAGCTTAGAGGGTGCCCAGCACACAGCGCTATGTGGCCCGTCTGCTGCCGTCGCTATCTN
-+
-6777778888888888888888887777654544322210//..------,++*)+(*))((((''%$$#"#"#""
- at 30BB2AAXX080903:3:55:357:1047#0
-GCTGTCTGTCTGGGTGTCCCTGCCCCCACCCCAGAAGGCTGAGTGAGGGCCATCAGCCTGCCATCCCTGCGTCTTG
-+
-67771788888888888888888877776555343222110//+.,.-,,,+)++*()()('(&(''$$$&$###"
- at 30BB2AAXX080903:3:4:576:1751#0
-AGGCTCGCGGGACCCCTGCTCCAACGTGACCTGCAGCTTCGGCAGCCCCCGTGCGCGCCCGGCCGCCCNCACANCN
-+
-6777778888888888888888037721/55153+01/.0,-,(,,&(*$+%*)*)((#('''''##%"$$%#"#"
- at 30BB2AAXX080903:3:52:797:592#0
-TGCAGCTTCGGCAGCACCTGTGCGCGCTCGGCCGACGGGCTGACGGCCTCGTGCCTGAGATCGGAAGGGTGGGTTC
-+
-6777778888888888888888887778655534-2121/-/-.---,+,+)+**(*()(''((#&%"""$"##"#
- at 30BB2AAXX080903:3:36:448:113#0
-AGTCAGGACGCTGTCGCCGCGCGCCCACAGAGCTCGAGCCGTGCGCCCGCCGCCGCGCTCACCACAANGTCANATN
-+
-67777788888888888888888877778545412212100*..-,,--,++***)((%(&('&'&%"$$&""$""
- at 30BB2AAXX080903:3:39:570:533#0
-TGGATGAAGATGGCATGTGATGTCCAGGCAGGGACTGACGCAGGAGCAGCCCACCCTGCCTGGCCTCCACCCCTGT
-+
-67777788888888888888888877776555443222100//..---,,,+*+*+)*))())((('&%&%%$%$$
- at 30BB2AAXX080903:3:41:827:453#0
-GGCGAACTGACCAAGACGAACACGACGGGACACGACGGCCACTGCCTCCCCCTGGCCCTTCAAGTCCTGCTCCNCA
-+
-67777788888888888888888877776455443222001/..,---,,+,%**))*%))'(((('&&""#""##
- at 30BB2AAXX080903:3:44:32:1733#0
-AGCGTGTGAAGGCCTGCAGGCGTGATCGAGGCTCTACGATCCTGTGTGCGGGAGCGACGGGGGCACAGTGACACGA
-+
-6777078888888)888)8,8886-377)5+5442.1200&//.----,,(&*+&)&''(&)#'('&"""#$#$""
- at 30BB2AAXX080903:3:53:1461:564#0
-ACACACGGGCTGGGCCAAAGCCACGCATTCAGAGGGGCACACGCAGCGCCCGGTCTCGGCCTCGCACAGACGACCA
-+
-67707788488881888888888878776555443222100//.---,,,,*++**)(*((#((('($$"&""$#"
- at 30BB2AAXX080903:3:44:1049:568#0
-GAGACCGGGCGCTGCGTGTGCCCCTCTGAATGCGTGGCTTTGGCCCAGCCCGTGTGAGATCGGAAGAGCGGGGGCG
-+
-67777788888888888888888877776555442222110//..---,,,+*****)*))((((((&%%$"#""#
- at 30BB2AAXX080903:3:51:413:713#0
-CACACCAGATCAGCCTGCACGTGGCCTCAGCTGGACCCTGTGGTGAGTGAGGCCCTGGGGCCGGGCGGGCCACTAC
-+
-67777788888888888888888877776555443222101///.--,,,+++***)**))))((('""####""$
- at 30BB2AAXX080903:3:35:1183:1815#0
-CGGCAGGCTCCCTGGGCCGCTACGTAGAGCCCTCGCTGTGACTCACACCTGGCCTTCTTCAGCTCACNCTCGGTCN
-+
-67777788888888888888888877776535443212100//...,,--++******)))(()(('"$%&%$#""
- at 30BB2AAXX080903:3:44:1273:1964#0
-GCACATTTGTGCAGCTGCGTGCGCGGGCGTGTGCGTCCATCAGTCAGTGGGCGTGCACCAGGCCAGGCGCGCGCGG
-+
-677777888888888888888'8*7773655(4&3..,0/-/.,-,-#-,,*+)*'&##'''##''&%"#""$#""
- at 30BB2AAXX080903:3:47:1328:800#0
-GTGTGGGCACTTTCTCTGCATACGTCCATCCGGTCGATGTATCACATCAATTAGGTAAAAGTGGTGCACGCGTAGC
-+
-6/7777888888888888838088777555554/32+,101..-.---+,+)***))(*'&%(&'''"$$$#$""#
- at 30BB2AAXX080903:3:41:174:332#0
-GTGGGCCTGGCTGGCTGCCCCAGTGAGTACCTGAGCTCAGCCCCGACCCCGGGCCTGGTGCGGCTGGACAGCCCGC
-+
-67777788888888.88888888,777-655544312/1000...,.,,*+*+****)())((('''&$$$###""
- at 30BB2AAXX080903:3:38:412:310#0
-AGGCCAGGGCAGGACAAGGTCACGTGGCCGCACAGCCGCACCAGGCCCGGGAGATCGGAAGAGCGGTGCTCTAGNG
-+
-6477728888888888888*8388$7779511&332/20*.-./*+)+,,+)+)*)((&&)'('('%"$"$%##"$
- at 30BB2AAXX080903:3:2:1644:1857#0
-CAGGGCCTGCAAATCTCTATCCAGAGCCTGGGCCCGTGCCAGGGTGAGGCCAGAAGACCGGAAGAGCGNCACNCAG
-+
-67777788888888888,8/88886777*5554332(.20-/..%+,,,,+&)*&*(''((&'(#'#&"%#$"%#"
- at 30BB2AAXX080903:3:52:1370:1334#0
-GAGCAGCAGCCCAACGCGGAGTTGTAGCAGGAAGCCCTCTCGACAGGTGGCCCAGGGGTGGCCACGCAGCTGACAC
-+
-6777778888888888888888887777655524101200//..-.-,-,+**(**)))*)#((&('"""&#$"#"
- at 30BB2AAXX080903:3:39:223:1250#0
-GATGTGCACTTTGACCCCAGTGAGACCTGCACCCTGGACCCTTCCTGGGAGGCAATGGGTGGGGGATCCCTGCCGC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((('''&%&%#"#"#
- at 30BB2AAXX080903:3:44:26:1712#0
-AGCCCGTTGCCAAGACCACGGCAGCCCCCACCACACGTCGGCCCCCCCCCGCTGCCCCCAGCCGTGTCTGACCGCT
-+
-6/.347888888888888288828.316.56-4/2,.,./,-+,-(+#&,*+*(%'')'''#''#'#%"""$###"
- at 30BB2AAXX080903:3:46:395:1067#0
-GGGGCCGGGCGATGGTCCTGAGCACCTGCTCCTGCCCTCAGGTTTGACACAGGTTCGGGGCCGGCGGCTTGCAGAG
-+
-67777788888888888888888877776555443122101/..---,,,,++(*((((((&'(''&$""$$#"""
- at 30BB2AAXX080903:3:2:1508:1015#0
-GACGGCCTCAACCTGGACACAGACCTCTTTGTGGGCGGCGTACCCGAGGACCAGATCGGAAGAGCGGTNCATCTAC
-+
-6777778888888888888888887777655544332200/0..,.,,-,+%)*)(())(&(&(#''""$##%###
- at 30BB2AAXX080903:3:52:326:99#0
-TCCAAGGGACTCACACGGCAGCCTGGTCCTCGGGTACGCCGCCCACAAAGAGGTCTGTGTCCAGGTTGCGGGGGGG
-+
-6777778888888888888888887777655544-022000//.-.+'+,*,+(***()()('((#'&"#%"""""
- at 30BB2AAXX080903:3:54:1436:208#0
-CCTCCTGGTGGCAGGGCGCTGGAGCGGACCTTCGTGGGCGCCGGCCTGAGGGGGTGCATCCGTTTGCACGTGAATC
-+
-6777778888888888888888887777:455443222100//.--.-,,+++***))))))('(('&'$$%$"#"
- at 30BB2AAXX080903:3:54:1437:207#0
-CCTCCTGGTGGCAGGGCGCTGGAGCGGACCTTCGTGGGCGCCGGCCTGAGGGGGTGCATCCGTTTGCACGNCGTCG
-+
-6777778888888888888888887770445544322210///.----,,+,+*)*))))))('(('%$$""%"#"
- at 30BB2AAXX080903:3:59:1062:1958#0
-AGAGGCCTGCACACCTTTGCACGGGACCTGGGGTCGGTGGGGCAGGAGCAGGGGGAAGGGCCGGCCCCGCACCTAT
-+
-6777778888888888888-84887.21454.4/*21,101.+,..),$),,+*)#(()(''('&&#&"$"%#"#"
- at 30BB2AAXX080903:3:44:1715:1810#0
-GGCCTCGTGCCAGGAACACGACCTCCAGCGCCATCTTCTCCCTGGGGTCATGGGGAGTCGGGGTGTCTTAGATCGG
-+
-67777788888888888888888877776555443222100//..--,,-+++***))()))(''(&$%%'%##$#
- at 30BB2AAXX080903:3:58:710:819#0
-CGGAACTCCAGGCGGCGGTCCCGCAGTGCCAGCGACACGAAGTCCCCCTTGCCGTCCGTCTTCTGCCCGGTACCAC
-+
-67777788888888888888888877176765343310/0//*-..,-)+++**&())&('(''(%%&&"#"$#$%
- at 30BB2AAXX080903:3:47:89:438#0
-GGGAGGAGCTACCCTAGGGGTTGAGGCGCCAGAGACGGTGAGCAGATGAGAGGCCGACAGTAAGATCGTGTGCTGT
-+
-67777788888888888888888877776555343222100//-.---,,+++***)*)))))(((''$""###$#
- at 30BB2AAXX080903:3:54:1694:93#0
-GCCAGCAGAGGATGGCACATTACCTCTCGGTCACAGCGTTGAGGGACTCGACAAAGGTCCGCCCGTCACCAAAAAA
-+
-677777888888888888888888777765554332/2100//.----,,+++***)')')(((''%&%%%%$$$$
- at 30BB2AAXX080903:3:60:528:332#0
-TCTACTCACACGGGGATCTCATTGGCCAGTTCGCTTGGAAACAAAGAGACAGACAGTGAGAGGCGGGAGGACACNN
-+
-67777788888888888888888877776555443222100//..---,,+++***)))))((('('%%$$%"#""
- at 30BB2AAXX080903:3:42:948:1609#0
-GTGCAGTCGCCCCTCCCAGGGCACAGGCCGAGGGTCGCCCCACAGCCAACCCCCACCACTGAGGCTGTACACCACG
-+
-6777778888888888888888887777655544%022201/.-..,,+,++)*)*())()'((%''$$%"%#$#$
- at 30BB2AAXX080903:3:43:1581:1980#0
-CCAGCTGTGTGTGTGCATGGGTCCATGTATATGTGTGTGTGTATATGTGGGGGGGACAAGATCGGAAGAGCGGGTC
-+
-67777788888888888888888877776555443222100//..---,,+++**(#*))))&)(''&&%""""""
- at 30BB2AAXX080903:3:47:847:1461#0
-TGTGCACACACTATACACACATGGACCCATGCACACACACTCGGACACACACCTGCGTGTCTCCCTCACAACAACA
-+
-6777278838388888882874880.1,655-8/1-2/0./-.-''+++*)(*()((()(''('&%&""""%#"##
- at 30BB2AAXX080903:3:35:450:576#0
-ACACATGCATGTGTGCATGCACGCAAACCTACACACGGACACACACACCCCTCCATGTTAGATCGGANACATCCCN
-+
-67777788888888888888888877776555443222100//..-----+++***)*))))((('(""%#####"
- at 30BB2AAXX080903:3:45:1020:94#0
-GTAGGGTGGAATGGAGTGGAGACCAGGGGCTTGGATGCCCCAGTACACACATGCATGTGTGCATGCACGCGACCAC
-+
-67777788888888888888888877776555442220120*-),.++++*)*)'()()#)'(#''#$"###%#"#
- at 30BB2AAXX080903:3:33:812:26#0
-TTCCACCCTACGCCTACCTCCTTGATCTCTGCGCCCAGCCTTGGCTGTGCTCCCCTGCTGTCTGCACNCGCTGCNN
-+
-6777778888888888888888887777655542321212/-/..--)-+))+**'))(('('('#'"&$$""$""
- at 30BB2AAXX080903:3:53:257:1728#0
-GCCTACCTCCTTGATCTCTGCGCCCAGCCTTGGCTGTGCTCCCCTGCTGTCTGCACGTGGGTGTCTGCCAGNGANG
-+
-67777788888888888888888877776555443222//1//-,--,-,+*+)))*')))&(%&''$"#&"#"""
- at 30BB2AAXX080903:3:49:979:817#0
-ACACTTGAGGGCACAGACACCCACATGCAGACACCCACGTGCAGACACCCACGTGCAGACAGCAGGGCGGCCACGC
-+
-67777788888888888888888877776555445222100//..---,,+++)**))))*))((('"""#$"#"#
- at 30BB2AAXX080903:3:37:534:1546#0
-CCAAAGAGCCCAGCAGGGACACCTACACATGCTTGTGCGGACACGAGACACGTGAGGGTGCAGAGATCAGCTATCN
-+
-6777778888888888888888387777655541332.100-/-.,-*,,++++*)))#)#()((%#$"%&#""$"
- at 30BB2AAXX080903:3:47:293:910#0
-GTGGGGTGCAAGGAGCAGGCACCCACAGAAGACATGCGTGACCTCGAGGATCACTGGCCGCCCACCACAGACACGT
-+
-6777778888888888888888887777655544322220//...---,,+,*++**))))()((''%"#"#"##"
- at 30BB2AAXX080903:3:59:516:1825#0
-CCAGCAGGTGCAGCGGGTGCCGGCCCACCACCACATCCCGCAAGCAGCCCACAAAGCCTGTGCCGTAGNCAGCTAC
-+
-*7777788888888888888088/23676%5211/10-/0,-..,-,+++)+*)')(()(''''(%%$""""#"##
- at 30BB2AAXX080903:3:56:1616:1284#0
-GCCATCCACGCCGAGCCCTCCACGCTGCCACCTCGCCTGTCCATCCCTCAGCACTAGGTCTGTCTGACACCTCAAC
-+
-67777788888888888888888877776555443222100//..----,+++***)))))((('''$$%$"#$$%
- at 30BB2AAXX080903:3:3:1739:1235#0
-GATGGCAGCCTCAGGACACACACCCCTGCCTCAAGGTGCTGAGCCCCCGCCTTGCACTGCGCCTGCACNCCCANCN
-+
-67777788888888888888882477276533,422$20//*.,---++,)&**'(((('''##'&#&"#""""#"
- at 30BB2AAXX080903:3:38:1576:736#0
-CGATAGCCCCTCGCAGGGCCTGGGGTGTGGCAGAGGGATACGGTCATGTCCAGGGTGGCTGGGCAGGGCCTGCGTC
-+
-677777888888888888888888707365554432221/0//-..,-+,+)+**#))(')))'#''"&$""$"##
- at 30BB2AAXX080903:3:33:32:1145#0
-CACACGCACCCACACGCACATGCACCCACACGTACCCGCACCCACACGCACCCACACGTGCACGCCANACACACNN
-+
-67777788888888888888888877776555%43222100//..---,,+,+****)))*())'''"$#"##$""
- at 30BB2AAXX080903:3:34:1565:991#0
-GAGAGCAGGCACACGCACCCACACCCACACGTACCCACACGTGCACGCCAGAGAGCAGGCACACGCANGGTATCNN
-+
-67777788888888888888888877776551443221100+..---,,,+++**))()()((((''"""##$$""
- at 30BB2AAXX080903:3:50:461:948#0
-TGTGGGTGCATGTGCCTGCTCTCTGGCGTGCACGTGTGGGTGCGTGTGGGTGCGGGTGCGTGTGGGTGTACAATCG
-+
-6777778888388818888888887777655544222210//..,-+-,,*+****&(()')'(''#"#"#"""$#
- at 30BB2AAXX080903:3:54:1586:2029#0
-TGTGCCTGCTCTCTGGCGTGCACGTGTGGGTACGTGTGGGTGTGGGTGCGTGTGCCTGCTCTCCGAGCAACACAAC
-+
-67777788888888888888888877776555243222100//..---',+++*#)))')#)'''&#"$#######
- at 30BB2AAXX080903:3:49:577:1937#0
-GGTGCGTGTGCGTGTGGGGGCGTGTGCTTGCTCTCCGGCGTGCATGTGTGGGTGTATGTACGTGTGTGNCCNGACT
-+
-6717778888888828,8&8,828.72785'524..-000)/,.-.,-,,+,*+')(((('(()(''%""#"""#"
- at 30BB2AAXX080903:3:59:1028:261#0
-TGTGCCTGCTCTCCGGCGTGTACGTGTGGGTGCGTGTGCCTGCTCTCTGGCGTGCACGTGTGTGTGTGTGAGCTNA
-+
-677777888888888888888888977765/5443212000//..----,,+****))()()(('('&$%""#"""
- at 30BB2AAXX080903:3:48:1212:977#0
-TCTCACTATGTTGCCCAAGCTGATCTCCCACTCTTGGCCTCAAGCGATCCTCCAGCCTCAGCCTCAGACCGACATA
-+
-67777788888888888888888877776555443222100/...---,,+,++**)))*))()(('&#%%"#"""
- at 30BB2AAXX080903:3:50:124:1343#0
-GCACCGGCAGATGTGAGCCCTGGGGAGAAGCAGGGGGAGAAGGGGTAGGGTGTGTGGCGAGCTGGGTCAATCGACC
-+
-677777888888888883888888777065724432211.///..$--,,(+++**)$)))'(((''$"""$""##
- at 30BB2AAXX080903:3:54:407:660#0
-GGGAGGCTGAGGCACGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCACGATCGCACCAGTGCACCC
-+
-67777788888888888888888877776555443022100//.,--,,,,++*+***)))))((('&""&%"##$
- at 30BB2AAXX080903:3:43:344:1362#0
-CCTGCACACCGTCCAATGGACCCACACCACATGCCCCGCCTCTGGCCTCCTCACCTGCCCTCCCCCTGCTCATGCT
-+
-67777788888888888888888877776555422222100//.,+--,-,++**)*)())(((((''&&&$%$#$
- at 30BB2AAXX080903:3:58:1442:212#0
-CTGGTTCTGCGCACCCTCCTCCTACCCTCCGAGGTCCTCCTCCCTCCTCCATTTCTGGAGATCGGAAGCGTGCNNA
-+
-67777788888888888888888877776555443022210/../.-,,,,+++**))))))()(''&$%""%""$
- at 30BB2AAXX080903:3:56:72:129#0
-ACCTACAGGGAGGCGGACGCGGCACCGCCAGGGAGGTCGGTCCCGCGAGATCGGAAGAGCGGGGCAGAACAACGAC
-+
-6777778888888888888888817%776)554132%110,//.,-,',*$*+*#&*()'()&#(&'""%""%"##
- at 30BB2AAXX080903:3:40:860:2018#0
-GCCTGCCCCCCTCCACCCGCAGGCCCTGCCAGGACACTTTGGTCCCTGGCCCGCCAGGCCTAGATCGCAAGTGCGC
-+
-67777788888888888888888827973525433222000/.,-,,,+($'+)%%))#&('((%#'$""&#$$"#
- at 30BB2AAXX080903:3:49:1042:397#0
-CCTGGCAGGCCCAGGCGGTTGGAGGAGAAGTGGTCGGCTCTGGACACCTTTGTTGTTTTTTTGTTTTTCTTCTCAC
-+
-677777888888888888087878727153.94$-22-//,-.+)&)+&,+)*+*'(*)*(%(&(''"%""#"###
- at 30BB2AAXX080903:3:42:406:1519#0
-GGGCCCTTTGTCCTCCTCCTCGATGGGAGCCCCAGGCCCTGGCTCTTCTGTGTCTGCACAGAGTCTACGCTGGTAC
-+
-677777888888888888888888777763554430/11/,//..--+,,+++)**)((')(('('&$'"#%"###
- at 30BB2AAXX080903:3:37:661:533#0
-GGGCGGGACACGGCTCTGGAGATGAGGGAGAGGACGGGCCGTGCCGACCGGCACCGCGGTGTTCCTGAGCGCGAAN
-+
-67777788888888888888888877776565443222,00./---,*-,-+*)+)))*%)#('&''"$%%""#""
- at 30BB2AAXX080903:3:44:1326:910#0
-CAGACTAGGAAGGTCCTGGGACGGGGGGGATGTTCACCACAACAGGGCCAGGCTCCCGCCCCAGCCTCACATCCAC
-+
-6777778888.88888888888(827776/55)4*.)01-+*&,%--+%*))+%)'(*')''((''#%"$""####
- at 30BB2AAXX080903:3:2:1253:1523#0
-CTCTCCCCACTCCAGGTGGTTTCACCCCAACATCAGCAGGGTGGAGGCGGAGAAGCTGTTCCTATCCCNCTAGTCC
-+
-67777788888888888888888877776755363221100*/.----,,++*)+)')%(%(#''#'%"%"%##"#
- at 30BB2AAXX080903:3:50:109:485#0
-TGGACACGAGGACTTGGTGCGGGGGGCCGATGCCCTGGGAAGGTGGTGAGAGTTGGACGTGGTGCTGTCACACACT
-+
-67777788888888888888888877776555443222100//..---,,,+#***)))()('(#(&"%"$"$"#"
- at 30BB2AAXX080903:3:47:302:683#0
-GTTGGAGTGGTGAGCCCTGGCCCAGCATCCGCGTGTCAGCACACGTGTGTACGTGTGCATGTGTGTGTCCGATACT
-+
-6777778888388888888884887777555544331110.//..,-+,+++***))()()')((&&$##""#"#"
- at 30BB2AAXX080903:3:60:1175:1214#0
-CAGACGCCGTCCCTCAGGATGCAGGCACACGCACACACACACACACACATGCACACGCACACACATGNACACAANN
-+
-67777788888888888888888877776555443222100//...---+,,+*****)))'(((''"'&%#$"""
- at 30BB2AAXX080903:3:34:1508:481#0
-CTGGCTGGTACCCTGGGCTGAGCTGGTTCCTCCAGCCTCAGTTTCCCCACTGCAGCGGGCTGCATCTNCCCCACNN
-+
-67777788-88888888888882677269546532500/-0-./,,(-+,$+*)'))(&'#'%#&'#"$#"#"$""
- at 30BB2AAXX080903:3:33:976:1293#0
-CCTACCAGCCCCTCCGTGTGTCCTCCTGGCACATGGCGACCTCCATGACCCGATGAGGGTGCGGGGCNGTCTCANN
-+
-677777888888888888888888777765554/322211///,-.---,,+)**)**)')()((('""$$$%#""
- at 30BB2AAXX080903:3:50:878:487#0
-GGGGTGCGGGGCCCGGGGCAGCTGCCCTCGGTGGGAGGGGTGTGGTGTGGTCTGCGGGGCCCTGAGAACCGCGCAC
-+
-6777478888888888888888887775935(443.2210+/)..&-+,,*++*)*)))(%(&(%'#"$#"$"#"#
- at 30BB2AAXX080903:3:4:1709:1362#0
-GTACTCCTGGTTCCTCTTTGAAGTTCGTAGTAGATAGCGGTAGAAGAAATAGTGAAAGTCTTAAAGTCNGTTCNCN
-+
-6777778888888888888888887777655544322210////--+--,+++****)))))))(('%""&"#"""
- at 30BB2AAXX080903:3:52:1636:1138#0
-GGTAACGCCAGTGTCTGGGAAGGCACCCGTTACTGAGCAGACCGGGAAAGGGAGTCTCCTTTCCTTGCACAACATA
-+
-67777788888888888888888877776555443222100//..---,,+++**))*)))(((''%&&%&"$%""
- at 30BB2AAXX080903:3:55:352:598#0
-GCCCACCCCTCCCTTGGGGACCCTGGTTCGTCCTGAGCCCCCCAGGAGCAATGGGCACAGGCCCCGCATCTCGCCC
-+
-67177788888888888888888877176'5348312.10///,,-,,-,(&(***&)(%()('(('""##&$###
- at 30BB2AAXX080903:3:42:360:1451#0
-GCCCCGCTCCATCTCCCTGGTGGTCATGACGATGACACGCGTGTTCTCCTGGTGCACCGTGGCCCAAGATCGTACA
-+
-67777788888888888888888877776555443220120//...--,,,++***)))))((((''&&%&%#$#"
- at 30BB2AAXX080903:3:45:1097:1381#0
-TGCATCTGCACAGCCCGCGTGGGCCCGCCCCGCCGCAGCTGAAGTGCACCACCATGGGCCCGGCCCGCGCACCCGG
-+
-67777788888888888888888876776555433322200/-.--,--++)+*)**)(''(('(&'%"""$"#""
- at 30BB2AAXX080903:3:37:352:1667#0
-AGCCTCCGTCTGCACCATTCCCCAGTGCTGCCGCCAAACCAGCTGGATCGTCTTCGGGACGTCGGGGACTCCACCN
-+
-677777888888888888888888777765554432111////..---,,+++*)+)*'')'(((#&"%"#####"
- at 30BB2AAXX080903:3:3:854:402#0
-CCGAAGACGATCCAGCTGGTTTGGCGGCAGAACTGGGGAATGGTGCAGATGGAGGGTCCGGAGCATTCNGCNANTA
-+
-67717788/8888*8&888/8388178/4+$30)3522&/,-,&-(-,+$+,)**)##&(&%'#(##$"#%"""##
- at 30BB2AAXX080903:3:56:1025:867#0
-CGCAGGGCCACGCCCCCACCTGCTCGCGCAGGCGCAGTTACTCGCCCCGGCTGTGCCGCCGCAGCGCCAGACACGA
-+
-67777788888888888488888877776555540.2*10../.-,-,+,$*+)*))&(#(('('&&'$"$$##"#
- at 30BB2AAXX080903:3:38:571:1616#0
-GGGGCGAGTAACTGCGCCAGCGCGAGCAGGTGGGGGCGTGGCCCTGCGCGGCGTGGCCTGTGCGGGCGTACGCGAT
-+
-67774788+8888888-8881888/77165454432/2/00/..--,-',+)+%*)#&))#)#(((#$""#"###"
- at 30BB2AAXX080903:3:42:354:1525#0
-GCCGTCCCAGGGCTGCGGGGTTCTGCGCGTGGAGCAGCGGCTCAGCCCTGCATCCCGCACGTCCCAGACCCTCCAC
-+
-617777888888,8888888,8887/7764553410--20-/,+.'-,+,&)*'*'(()('%(('''%&&&$"%##
- at 30BB2AAXX080903:3:46:742:159#0
-GGAGTGGCCGAGCTGGGGGCGCACGCGGGTTCACACGTGGTCACCGGGGGGGTTCGCAGCCCGTCGCCACTCGCGG
-+
-67777788888888888888888877776.2512322,20./.--+-#+,,*%))*&')'(#(#'&%%"#"$"#"#
- at 30BB2AAXX080903:3:1:1624:303#0
-CACGGGTGGTCAAATGAATATGTCACACACACCTCACTCCACAGACATCCACCATGTGCCTGATGGGGNCGNCTAC
-+
-67777708888888888888887173786/41-/.21-1./-/..--++&,*%(**')#(((('(&'""#""#"##
- at 30BB2AAXX080903:3:51:1015:507#0
-AGGAAGTACCTGGGCTCTGGGGTCAGGGATGGGAAGGCTGAGGAGGCCTGCGTGCGCTGGACCTGGCCCCGGTCTA
-+
-67777788888888888888888877776-45443222000//..-----(++****)()())((&'"##"#"$""
- at 30BB2AAXX080903:3:49:714:1768#0
-CTTGCCGGGCTTCCACTCATGCTGACATTTCCCCGCGGGGCTGGTCCGGCAGATCTGAAGAGAGGGTGCGCACGTC
-+
-6777578,8888*8883-/88.88776765*1&23,'210,./.'+&+,+)&*)#()#()&(#&'#'"$"###"##
- at 30BB2AAXX080903:3:1:858:1885#0
-CTTGGCAAGGGGCTTCCCTGGCAGGCAGTTCACAGGGTGTGTGGGTGGGGGGGATGCTGACCAGCTGCNTCNCCGG
-+
-6777778888888888388888-8577722521,320*/-1-/-.+-,,+++*)())((((('''#&%""""##""
- at 30BB2AAXX080903:3:55:1596:432#0
-TACTGGGGAGGCTGAGGCAGGAGAACTGCTTGAACCGGGGAGGTGGAGGTGGCAGTGAGCCAAGATTCAAGAACAA
-+
-67777788888888888888888877776555443222100//-.---,,++++*))))()((('''"#$"####"
- at 30BB2AAXX080903:3:2:1718:1254#0
-TCCGAGCCAGGGGTGCCAGGGGACCTGGGGCTGCCGGCCGAGCTGGGGGGCCTGGCATCGGGGCGAGCNTGACCTC
-+
-6777778888888288848888807773.33.52212,10$-*&--,,+$$'#(*%'##&#'(####""#""##"#
- at 30BB2AAXX080903:3:48:639:1001#0
-GGCGGCCGGTGATTGCTTACCACAGTCCCTGTCCCACAGCTCAGAGACATGTCGTCAGGCCAGCAGGGCANGNCTC
-+
-67777788818888888888888877776555343221100//..-,,-,++***))*)((&)((('"%""""$"#
- at 30BB2AAXX080903:3:43:1641:1733#0
-CTCACATAGCTGCCTACAAATCAGGCCTGCACCGCCCAAGCCAGGCACCCATCCTGGGATAGATCGGACGACTGCC
-+
-67777788888888888888888877776555445110100/...--,+-++)*****)())(('('&"%"%"#$"
- at 30BB2AAXX080903:3:49:612:1479#0
-GGGGGCTTTGGGACGACAGGGAGGGCCCAGGCAGGGGCAGGGGTCAGTGCCCGAGGAAGGTGCACGTGTACTACAT
-+
-67777788888888888888888877776556542221200//--,-,,***+)*)()))#)'''('"$"#"##""
- at 30BB2AAXX080903:3:2:1466:634#0
-AGGTGGGACCCCTGTGGCTCCCTGCAGCGGATCCTGGGTGCAGGGGAGGGGCGGGGGGTGGAGCAGGGNTCNCAGG
-+
-67777788888888888888388877776545442222.0///..-,-,,+*+**'))#)(#'##%'""#%"#$""
- at 30BB2AAXX080903:3:42:424:701#0
-ATGGTGCCCCACCCTGAGCCTGTGCAGGTAAGGGGTGAACACGGGCTGAGCTGGCCTTACCTGGTGGCCGGGGGGN
-+
-67777788888888888888888877776555443222100//...---,,++*)**)))))(((''&&%#"##""
- at 30BB2AAXX080903:3:45:1728:1601#0
-GCGGGTGACGGCGCACGCATTCCTTGTGTCCCCGCCTGTCTTGGACAGAGCAGAAGCCACACCTGCCAGGCGAGTG
-+
-6777778888888888888888887777655544322210///.-,,-,-,+++**(*)))(('(''"""%""$"#
- at 30BB2AAXX080903:3:45:180:875#0
-CCCACACCCAGCAACTCACACCTGCCTCAGACCAGAGCTCTGTGCGGGTGACGGCGCACGCATTCCTTGTGTCCCC
-+
-67777788888888888888888877776555443222100//..---,,+++*+*))*))))(('&'&"$$""#$
- at 30BB2AAXX080903:3:51:145:928#0
-GGCTGGCTTCATCCTCTCCTTGGCGGGCCAGGCAGCTGGAGGGCAGGGGGGGGGGGGGGAGGGGGGGCGCGCGTGC
-+
-677777888888888888888888777763554432121&///(%---+,+++***)))#)(((#((%##""""##
- at 30BB2AAXX080903:3:47:990:425#0
-GTGGCTGCTCTCACACATGGGCCATGTGTTCACACGCTCTATGCCCCCGTGTCCACAGGCTCGCACCATCACATAT
-+
-617777882848888888888888/777851244313-20-/.*,-.-&$&&'*)*)((&&'#(#&#""%"####"
- at 30BB2AAXX080903:3:56:1073:1094#0
-TAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGCACGTGTGTGAGAGCATGTGTACATGGCGAGCC
-+
-67777788888888888888888877776555443222010//..--,,+++++**))))))(((''"&&#"""##
- at 30BB2AAXX080903:3:46:1569:205#0
-AGTCTGCTAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGCACGTGTGTGAGAGCATGTGTNCNAG
-+
-67777788888888888888888877776555443222100/...---,,+,+***))))))()(('&""#"$"#"
- at 30BB2AAXX080903:3:33:1211:314#0
-GCACAGACCAGTCCTGTAGTCTGCTAGGGCATGTGGACATGGCATGTGTGTGTGTGTGGACACAGGGNCCTCCCNN
-+
-67777788888888888888888877776555443222100/.-.-,-,,+++***)**())'((''""%"##$""
- at 30BB2AAXX080903:3:4:972:966#0
-TTCCTGAGCCCAAGTCCCTGTGCTCCTCCTCGGGGTGTTGCCCCCGGGCCTCTGCAGTCCTGGGTCCGNATTANAN
-+
-6777773888888888888888887777655544322/+00.-..'-++,,*++*)*))(((('(''%"""##"""
- at 30BB2AAXX080903:3:54:1671:1552#0
-ACGGAGTCCCCATAGCCTCAGCCTCCCCCCACGGAGTCCCCATAGCCTCAGCCTCAGATCGGAAGAGACCAAAACA
-+
-67777788888888888888888877776555443220000//..----,+,****)*)))()(''%"""%&$%$$
- at 30BB2AAXX080903:3:51:472:1192#0
-TGCGGGGTGGCTGAGGCTATGGGGACTCCGTGCCGGGAGGCTGAGGCTATGGGGACTCCAGATCGGACGGTCACAG
-+
-6777778088888888888888889773655534322110///-.---,,,++***((*&)'((((%$"""$"##"
- at 30BB2AAXX080903:3:40:596:230#0
-GTGCCGGGAGGCTGAGGCTATGGGGACTCCGTGCCGGGAGGCTGAGGCTATGGGGACTCCGTGGGGGTCGCGTGAT
-+
-67777788888888888888888877776555443222/00//.----,,,++****))))&)(((&"#&#$#"##
- at 30BB2AAXX080903:3:36:734:672#0
-CCACGGAGTCCCCATAGCCTCAGCCTCCCCCCACGGAGTCCCCATAGCCTCAGCCTCCCGGCACGGCATACCTNCN
-+
-67777788888888888888888877776555443232100///----,-+++**)*)*)((((('#$####%"#"
- at 30BB2AAXX080903:3:58:791:536#0
-TCCAGGCCTCGGTTACGGGTCACACCTGGCACTGCCAGGCCTGGGGACGTGGTGCGGCCGGTGCGGGGGGTCTCAC
-+
-677777888888888888888888777765554432221000/..-,,,,+,**)**))))'(((('&"%#$"###
- at 30BB2AAXX080903:3:42:1324:1277#0
-CGTGCCCCTCGCTGCCACAGGTCCTGGCTGACCACGTGCTGCCCAAGGGCCAATCGCGAGTGCGCAGGTGGGNCTC
-+
-677777888888888888888888777765554222/2100/0.,,,,,,+*+'&)&)((')'('&'&"$"""""#
- at 30BB2AAXX080903:3:42:1614:348#0
-ACAGCAGGTCCAGCCAGGCAGGGTCTGGAGGCCAGGCCAGACACAGACAGGCACCTCCCAGCCCACCCTCTGCAGC
-+
-67777788888888888888888,77776555443222.1///.--,-+,++*+*())*('((('''&$$#%""""
- at 30BB2AAXX080903:3:37:350:1141#0
-GAGGGAAGGAGTCCACATCCCCCTGGAAACTCCACTCCTGCATTTGCACCAGGCTGGGCGTCTGGTTTACATATCN
-+
-67777788888888888888888877776555443222100//..---,-,++*+*))))))(((('$###"#"#"
- at 30BB2AAXX080903:3:46:1540:1941#0
-CAGACGCCCAGCCTGGTGCAAATGCAGGAGTGGAGTTTCCAGGGGGATGTGGACTCCTTCCCTCCACGCCCGCCAC
-+
-67777788888888888888888877776555423222100//..-.-,,,++****))))((((''"##"%###"
- at 30BB2AAXX080903:3:52:421:1492#0
-CCCTGGCTGCAAACCTCAGGCTGGGGGTTTTTGGGGACAGGGATGCAGGTGTCTAAGGACACGACCCTTCAGGCAG
-+
-67777788888888888888888877736555443222100//..---,-+++**)*)))))((''&""$"&$$"#
- at 30BB2AAXX080903:3:53:481:2002#0
-GGACAGGGATGCAGGTGTCTAAGGACACGACCCTTCAGGCAGTGGATGTTTTAGATCGGGAGAGGGGGTCGACCGA
-+
-67777788888888888888888877776555443.2210./-..,"-&*+%'')&#()#'('(#'%"#%%""#""
- at 30BB2AAXX080903:3:4:955:1307#0
-CTCCAGGCAGTGGACGTTTCTGCCTGGGTGGAGGGCACGGTTACGAGAGCAGGGCCCGCGCTCTGGCTNCGACNAN
-+
-67777788888888883883888877770555443.000/&-**'+,),++)++'))((((#(##''$"$%$%"#"
- at 30BB2AAXX080903:3:57:1252:74#0
-GCCAGTGGGGAGGACACAGCCTAGGAACCAGCTGCCTGAGACCAGGGTGCCTCTGGGCTGTCCTCCCGTGACTCAC
-+
-677777888888888888888888777165554412220/1.-*---#,+,**)())()(''(&'#''"%%$####
- at 30BB2AAXX080903:3:53:812:126#0
-AAGTGCGTGGCGTGGTCTCGGCCTCCAGGTCAGACATTGCTGATACGGGCCTCCCCCGGGAAGGCCGCGCGCACAG
-+
-677777888888888888888888771765554622211////.--,+,+,(+)***(*('((('#'$$#$#"##"
- at 30BB2AAXX080903:3:47:746:1426#0
-GGCGCCCGGGGCTGTTTACTCTGACCAGGTGGGAACCCAGATGCCCCCTGCCCCTAAGGCGCCCTCANCGCTCCTC
-+
-67777788888888888888888877476/554350/1001..-,-,,+,+**+*)())()'&'''&"$"%###"#
- at 30BB2AAXX080903:3:52:763:1694#0
-GGCAGGGGCTGGGAAGGCAGACAGCGTCCTCCCCGAAGCCTCGGGAAGCGTGTGGCCTTGTGTGCCCCGCGGATGT
-+
-6777778888888888888888887777+5553432320(///..,,-,,+,***#))()(&((''#%$"&$"%""
- at 30BB2AAXX080903:3:39:781:949#0
-TGGGTCAGGCGGACCCAAGAGTCAGCCCGGTTAGGACCCATTTTATGTGCGGGGCCACAGACACAGGCTGAGATCA
-+
-67777788888888888888888878776555443210000//.,---,-+,+*)*))))))(((((&&&&$#$""
- at 30BB2AAXX080903:3:55:1627:829#0
-CAGCAGAGGCCCCGGGGCTGCAGGGTCTCCCCCAACCTCTCCCTGCGGTGCATCAGCCTGGCCCTCCACACACAAC
-+
-67777788888888888888888877776555443222100//..---,,,+++**))))))(('(%$$%%%$&$$
- at 30BB2AAXX080903:3:50:935:144#0
-CTCCGGGGCACGCACAGGTGCGGGGGCATCCCGAGCACCCCAGGGGAGTCCCCGCTCCCGGGACGCACTCTCCCAC
-+
-6.77778888881888-8-8888/777+6545%4'122100/-.-.+,+,+'+***)**#(&((&(&%$$"##$"#
- at 30BB2AAXX080903:3:60:626:592#0
-GTGGGGCTCAAAGCCACCTCGTGCCTGAGGCTCCTCCCGGGAGGGGGGGAGGGGAGCCCGTCCCCTGGTCACAANN
-+
-6777778888888888888808887777555546+2/2.00*...&--,+-++$'*)))'()'((#'$"%$&#"""
- at 30BB2AAXX080903:3:46:1773:1441#0
-TGACCCCTTCCCACTGGAGAGACGGCCTTGTGACTGTGGGGCCTTCAGGCGGGGGCGGGGTCTGGGANGTATACTA
-+
-677077888888888888888888777765554432-10-0#/&-+*,,++++++()*((#&((&'#""$""##""
- at 30BB2AAXX080903:3:50:820:1165#0
-CCCGCCTGAAGGCACCACAGTCACAAGGCCGTCTCTCCAGTGGGAAGGGGTCAGTGCCCAGGCCCGGGCGCTCTGG
-+
-6777778888888888888888887777655544322210.//...--,,+++***)))*)(((('(%$"""#"""
- at 30BB2AAXX080903:3:40:264:1575#0
-GAAACGCCTCTCCGATTCCAGTTGCCCCTGAAAGCCAGGGGGTTCTCAGCCTTGTTCCTTCCTCCGGACACACACC
-+
-6'*1.2+88281./188/068888+'1/6501483('1///.)-)-*),*(++&**'()('%('''#$&#&&$###
- at 30BB2AAXX080903:3:60:743:670#0
-GCTCACGGCCACACCGCACGCTCTTAGGTTCACACTTAAGGCTCACACTCACGGCTCACGCTGACACCCACAATNN
-+
-67777788888888888888888877776555443222000//..---,,+++*+**)*))(((('''$"&"#"""
- at 30BB2AAXX080903:3:37:680:901#0
-CATGGCTCACGGCCACACCGCACGCTCTTAGGTTCACACTTAAGGCTCACACTCACGGCTCACGCTGCNACGACCN
-+
-67777788888888888-8888887-7163/5/4322200/-/-..--,,++*()***)((()((''"""""$$#"
- at 30BB2AAXX080903:3:57:421:267#0
-CAGCGTGAGCCGTGAGTGTGAGCCTTAAGTGTGAACCTAAGAGCGTGCGGTGTGGCCGTGAGCCATGAGCGTATAT
-+
-67777788888888888888888877776755443222110//..---,,,++***))))(('('''&$#%#""##
- at 30BB2AAXX080903:3:8:591:1715#0
-AGAGCGTGCGGTGTGGCCGTGAGCCAGGAGTGGGAACCTGAGAGCGTGTGGCTGGGGGGGGAGGACGNGGCGACNN
-+
-67777788888888888888888877)765.5'4321210./,.--,-*,,*)*'*#*&#(#)%##'""%$#"#""
- at 30BB2AAXX080903:3:35:1260:433#0
-CTCTTCCCGAGTCTGCTGGGCCATTCGGGACAGCTCTGTGGTGAGGGCTGCTCCGCCCCCTCAGCCCNCTCTTANN
-+
-67777788888888888888888877776555443222000-/..--,+,+++*+)*))(()(((''"%"#""#""
- at 30BB2AAXX080903:3:52:471:1340#0
-TGCCCGGCTCCCCCCGGCTCCCTTCTCACAGCTCCAGCTGTGGGAGACACTGTGGGGGGTGGTGTCCTGTGTCTCC
-+
-677777888888888888888878727/65551,3220101//.--,,,,++#++*#)&&'#''###"""#"""##
- at 30BB2AAXX080903:3:41:1297:799#0
-GCTGTGAGAAGGGAGCCGGGGGGAGCCGGGCAGACCTACAGCTTCTACACTCGGAGCCGTTGTAGGCTGGGACCTC
-+
-67777788888888888888888577776555422501.00..-,,,+,,+***))'))#''#&(%#%$$""##"#
- at 30BB2AAXX080903:3:2:1772:883#0
-CCGGGGTGCTCGGCGTGGAGTGCAGCGTGGAGTACTCGGGGCTGGGGGGCTCGGCGTGGGGAGTGCGCNCTGCTCT
-+
-677777888888888888880888777;6555241202100*..,-.$,(*)+*&*#*)#)#(#(#%""$"####"
- at 30BB2AAXX080903:3:42:1535:1455#0
-CAGCGGGCACTTCTGGGGACAGTGCTGCGCTGGTGTTTGGCTCCCTGCCGTGGACTCCGTTCTTCGGCCTCCGGGC
-+
-67777788888888888888888877776555443222100//...--,,+++*****)()(((((''#%&###""
- at 30BB2AAXX080903:3:36:1009:517#0
-AGGACCCCAAGGTGCTCAGCTTCCTCCCAGCCCCTCTGTTCCCCCTCAGAGCGGTGCCCTCCTCCTCACTCGCGCN
-+
-677777888888888888888888772765550431%2//1$/...-,,++)*)#))')#'&(('%'"%#&####"
- at 30BB2AAXX080903:3:39:1638:1437#0
-AGGGCAGCCAGTGGGAGCAGCCAGGGGAGGGGAGGACAGAGTGAGAAGGTGCAAGGGCCACTCCTTGTACCGCACA
-+
-677777888888888888888888777765554432-2110-/..-,-,(+*++**)')'('(&#&'"""""###"
- at 30BB2AAXX080903:3:33:1418:466#0
-GCTTTGCCAGAGGCCCCTGGAGCCAGGACAGCCCCGTGAGAATGGCTGAGCTCATGGGAGATCGGGANAACAGTNN
-+
-67777788888888888-8888789777355,3212)2100/....*-&,+*+))**)))'((((#'"$##"""""
- at 30BB2AAXX080903:3:56:1363:157#0
-GCCAGCCAGGAGGGCGAGGTGCCGCAGCGCCATGCCAGGAGCAGATGCGCAGAGCCAGCCACAGGGCGAGTACATC
-+
-67777788884888888888888877776)55-4-222100*..,--+,-+****)%(#)(('('(#$"""$$"##
- at 30BB2AAXX080903:3:1:1668:1715#0
-TTGGCTCCGCATGCTCCTCCCTGTGGCAGGCTCTGCGCATCTGCTCCTGGCATGGCGCCGCGGCACCCNCCNCTCC
-+
-6777778888888888888882807771656,3-/0/1(*.)+,%,-&)++&#)**))#(''((%#'"""#"#%#"
- at 30BB2AAXX080903:3:50:55:1198#0
-CCAGTCCTGCAGATGAAGACAGCAGGTGAGGCCGTGGTCACGCGAGGGCAACCCAGGTGGGCCGTGGATTACGCTC
-+
-67777788888888888888888877776555443222100//..----,+,****)*))))(('''""""$"#"#
- at 30BB2AAXX080903:3:46:129:667#0
-TGTGCGGAGAGTGGACCGTCCCTGTGCAGAGACTGGAGCTGTGTCCTCCAGGGCCTCCGTCTCCCTGCAGACGCAC
-+
-67777788888888888888888877776555443222100//..---,,++++***))))((('(&&#""$##"#
- at 30BB2AAXX080903:3:40:1705:697#0
-ACGGACACCCTGCGTGCACCCACATCGCCAGTGGGAGGGTATACAGCACAGCCACTGTGGAAGACGGCTGCAGGCA
-+
-677777888888888888888888777765534432221/0//..----,++++*)))))))((((&&%%#"$"#"
- at 30BB2AAXX080903:3:57:105:1283#0
-ATACATAAGTCTGATGAAGAATATGTGTTTTAGCTGAGCGTGGTGGTGACGCACACCTCTAGTCTCAGCTCTCACA
-+
-67777788888888888888888877776555443222100//..---,,+++******)(((((('&&"$"$###
- at 30BB2AAXX080903:3:35:934:475#0
-GGCAGCACTTGCTTGTGTTCCAGCTACTTGGGAGGCTGAGGTGGGAGGATGGCCTGGGCCTGGGAGANCTCGGCAN
-+
-67777788888888888888888877776555443222200-/..---,,++******())))((('"$#$##$#"
- at 30BB2AAXX080903:3:55:1342:1356#0
-TCAATCTTTCCAATCTTTTAGGGAAAAAATCAGCTTTTGATATTGTTAAGTTTCTCCATTTTTCTCATGCTTTCAT
-+
-67777788888888888888888877776555443222110//..---,,++++*+**)))(()'('&%#&$%$##
- at 30BB2AAXX080903:3:1:611:1148#0
-CACATCACCACCACTCAAAGTCCATGGTTGACACGAGGGCGCACTCTTGGTGCTGCACGTTAGATCGANCANCGCC
-+
-67777788888888888888188897786579113/112./-+.,,*++,&+*))#(()#'#(#'#'""##"#""#
- at 30BB2AAXX080903:3:37:44:723#0
-TCTCACCCCGGCCTCCTGAATAGTTGGGACCTCAGGTGCACACCATTACACCCAGGTAACAGATCGGCGTCCTGTN
-+
-67777788888888888888888677776555443222100///.---,,+*++***)*))()((('%""#####"
- at 30BB2AAXX080903:3:56:732:1223#0
-TCCTGACCTCGTGATCCACCTGCCTCTGCCTCCCAAAGTGCTGGGATCACAGGCGTGAGCCACTGCATCACGTGCT
-+
-6777778888888888888888887777655544322210///..---,,+++***)*))'(()(('"$"%%$$"#
- at 30BB2AAXX080903:3:56:1532:1930#0
-GACCATGCAGGCTTGTTACTGCCCAGAGTTGAGCACCTGGGAAGCAACACCAGCGCCCACCGTCTAACACCTCCGC
-+
-67777788888888888888888877776555413//2100//.---+,++,+**)&))'()('(''$$%%$&#"$
- at 30BB2AAXX080903:3:41:918:1630#0
-GGCTGATGCAAGAGGACTGCTTGAGCCCAGGAGTTCGAAGCCGAAGTGCAGACGCATTCAAGCTGGTCGCGCAGCT
-+
-6777778888888888888888887777655/4432200/1-/-----+-,,)****))*'('(((%&$$%#%#$"
- at 30BB2AAXX080903:3:55:674:380#0
-ATAGGGCCTCGCTCTGTTGCCCAGGCTGCAGTGCAGGTGCGCTCCCGGCTCGACCAGCTTGCGTGTTGTCTCTGCG
-+
-2717,7232488)&&8)388%$08671&)+3'0,+0.*/..*-,-$*++&()#')#($&###&####"$""#""#"
- at 30BB2AAXX080903:3:42:22:1324#0
-CGCACCTGCACTCCAGCCTGGGCAACAGAGCGAGGCCCTGTCTCAAAGGAAAAAAAAAAAGCTTTGGCTCCTCACC
-+
-67777788888888888888888877776555443212100//.,).,,,*+++****))))(((('""$#"####
- at 30BB2AAXX080903:3:57:848:1966#0
-GGGAGGCTGAGGCAGGAGAATAGCATGAACCTGGGAAGGTGGAGCTTGCGGTGAGCCGAGATAGCACCACTCACCC
-+
-677777888888888888888888777765554432221.0//.-.--+,+++**'()))))((&(&''%##"$##
- at 30BB2AAXX080903:3:46:1634:372#0
-TGCCGGGCCTCAGCTGCCTCCCCGCGGGGCAGGGCTCGGCAGCCTGCCAGATCGGGAGGGCGGGTCCTCAGCACTA
-+
-67777788888888888888888877386401441/0-10,.,,%,*+&+&&)**#%)#(#'(##&#$$""$"$"#
- at 30BB2AAXX080903:3:3:193:405#0
-GAGCAGCGATTGGTGCATTTACAAACCTTGAGCTAGACACAAGGTGATGATTGGTGCGTTTACAAACCNACACNAC
-+
-677777888888888888888)8877772505&33220120//.'-$,-,+++*'+(*()((#((&#$"$"$#"#"
- at 30BB2AAXX080903:3:38:1659:1935#0
-TGCTGAGACATGGGGCTGTGGTGAATGGTGCTGCCGAGACATGGTGGCTGGGGGGGATGGGGGTGCTATACTGTGN
-+
-677770888888888888888+88777765-5443202010//.---++,&++%*)))))'('((&#%##"$###"
- at 30BB2AAXX080903:3:39:568:39#0
-GGTGCTGCTGAGACATGGTGGCTGTGGTGAACGGTGCTGAGACATGGTGGCTGGGGGGGGGGGGGCGTGGGGGGTA
-+
-677777888888888888888888777765554422221/0/0-.--',,*)+)**()))%((((#&"&#&$##$%
- at 30BB2AAXX080903:3:40:1067:1195#0
-ATGTCTCAGCACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTTCACCACAGCCACCATGTCTCGCCCCACT
-+
-67777788888888888888888877776555443222100//---,-,,,*****)))())((((''""#$$"#"
- at 30BB2AAXX080903:3:58:1528:1758#0
-ACATGGTGGCTGTGGTGAACGGTGCCAAGACATGGTGGCTGTGGGGGGGGGGGGTGGTGGGACATGGCAAAAAACN
-+
-6777778888888888888/888877776512443222+00$..'--+&,,**)#(()&()##''%($$"%%$%$"
- at 30BB2AAXX080903:3:58:510:184#0
-ACGGTGCTGCTGAGACATGGTGGCTGTGGTGAACGGTGCCGAGACATGGTGGCTGGGGGGGGAGGGGGGCGATNNA
-+
-677747888888888888888888771763554432,2100-/.-+,--+++***&)))))(#((%'$%##%#""#
- at 30BB2AAXX080903:3:43:1231:1156#0
-CGGCACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTCCACCACAGCCACCATGTAGATCGGAACGCGGACG
-+
-677777888888888888887888/7176555243+.210./...-,),,,+*+*())()))''(('%"$"""##"
- at 30BB2AAXX080903:3:43:755:369#0
-TCAGCAGCACCGTCCACCACAGCCACCATGTCTCGGCAGCACCGCCCACCACAGCCACCACGTCTCGGCACCACCC
-+
-677777888888888888888888777765354422211/...-%--+,,-+)*))(()(#'&(%'#'%#&$"#"#
- at 30BB2AAXX080903:3:45:1601:1697#0
-CAGCCACCATGTCTCGGCAGCACCGTCCACCACAGCCACCATGTCTCGGCACCGTTCACCACAGCCACCATGTCCG
-+
-67777788888888888888888877776555443.1210.0/-----,--++*)+)())(((((''$$""$"""$
- at 30BB2AAXX080903:3:2:1403:1054#0
-CACCATGTCTCGGCAGCACCGTCCACCACAGCCACCATGTCTCGGCACCGTTCACCACAGAAGATCGCNTGACACA
-+
-677777888888888888888888-77765554432..1/0./.-'(,*-**'')))))(#'((#&'"""&"##"#
- at 30BB2AAXX080903:3:50:732:1756#0
-CACCATGTCTCGGCACCATTCACCACAGCCACCATGTCTCGGCACCGTCCACCACAGCCACCATGTCGCGGCCCCC
-+
-67777788888888888888888877776555343222100//.,----,+++****))(((((('#"%"#"$###
- at 30BB2AAXX080903:3:49:121:2021#0
-ACCGTTCACCACAGCCACCATGTCTCAGCAGCACCGTCCACCACAGCCACCATGTCTCGGCAGCACCCGCAACACA
-+
-6777778888888888888888887777655540.21./2,./+-.,*-+*,***)))))'(''(##$#%#"###"
- at 30BB2AAXX080903:3:39:820:979#0
-CCATGTCTCGGCAGCACCGTTCACCACAGCCACCATGTCTCAGCACCATCCACCACGGCCACCATGTCTCAGCTAC
-+
-67777788888888888888888857776555442121.0/1/..--+,*+++*+*(*))()((''%$#"###"##
- at 30BB2AAXX080903:3:45:506:229#0
-GGACGGTGCTGCTGAGACATGGTGGCCGTGGTGGATGGTGCTGAGACATGGTGGCTGGGGGGGAAGGGTGCGCACA
-+
-67777788888888888888888877775551443222+00-/,..-,,,+*+*&*)'))%)('#''&"%#"#"#"
- at 30BB2AAXX080903:3:38:1077:875#0
-TGTGGTGAACGGTGCCGAGACATGGTGGCTGTGGTGAACGGGGCTGCCGAGACATGGGGGGTGGGGGCTGTTCTAC
-+
-6777778888888888888888887.77655244-230.00)/.,.,,-,,+*()**())%#)'(('"$""""""$
- at 30BB2AAXX080903:3:41:509:358#0
-TGTGGTGAACGGTGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCCGAGACATGGTGGCCGGGGGGGGGGCAAT
-+
-6777778888888888888888887/7765514412'2./0-//,-,,-+,,+*(**&*)##)'((("%"#"""#"
- at 30BB2AAXX080903:3:34:1765:1123#0
-TGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCTGAGACATGGTGGCCGGGGGGGGTGGGGGGGGNCACTAANN
-+
-6777778888888888888888787727635044322110&+...+,-&(+'++***(#))'(##''"%#%###""
- at 30BB2AAXX080903:3:58:136:1200#0
-GGACGGTGCTGCCGAGACATGGTGGCTGTGGTGGACGGGGCTGCTGAGACATGGGGGGTGGGGGGGGGTGTCTNNC
-+
-6777778888888888888888887777455+44+.22&0.-/),-"-,*)*++&))(#)(()((('&"%"$"""#
- at 30BB2AAXX080903:3:41:1452:1401#0
-GGTGCTGCCGAGACATGGTGGCTGTGGTGGACGGTGCTGCCGAGACATGGAGGCTGGGGGGGGCGGGGTCTNGACA
-+
-671777888888888888888888.77-650044'2)+1.0.+.,-,#-,$++$#)'))'(((#(('%$#""""""
- at 30BB2AAXX080903:3:60:1542:1754#0
-ACCGTCCACCACAGCCACCATGTCTCGGCAGCACCGTTCACCACAGCCACCATGTCTCAGGACCAACAAACACANN
-+
-67777788888888/88438888/7777455.1,+5/1//.-/+,.+#&$(%)()'(&(##(#'%%&$$%&&$%""
- at 30BB2AAXX080903:3:36:266:1657#0
-GTGGACGGTGCTGCTGAGACATGGTGGCCGTGGTGGATGGTGCTGAGGCGTGGTGGCTGTGGGGGGACACATCTTN
-+
-6777/7888888888888887888177105/54&32/110&/'+.'-(%(+++$*+%&)#()&('%%$#%#$%#""
- at 30BB2AAXX080903:3:44:1142:1341#0
-TGTGGTGAACAATGCTGCTGCAGACATGGTGGCTGGGGGGAACGGGGCCGGGACATGGGGGGGGGGGGGGCTAGCG
-+
-67777788888888888888888877776555443%2200,/'..,-*,,&)+')%)*&))'&('('&$"$$"###
- at 30BB2AAXX080903:3:58:1404:183#0
-CTCGGCACCGTTCACCACAGCCACCATGTCTGCAGCAGCATTGTTCACCACAGATGAATGGATAAACAAAATCNNA
-+
-677777888888888888888888777765554432221/0//..---,,+)++**)*))))()(('%%%##%""$
- at 30BB2AAXX080903:3:51:1451:282#0
-ACTAACTGACCCCCCATTTCACGGCCATAACTACAGCGTCACTTTCCATAACTTCCTCCTGATAAGACACTCTGGC
-+
-67777788888888888888888877776555443222100//..---,,+,+***)))))(((''&&"""$""$"
- at 30BB2AAXX080903:3:8:607:1304#0
-TTATGGAAAGTGACGCTGTAGTTATGGCCGTGAAATGGGGGGGCAGTTAGGGCCTGGCAGCGAGCCANCACTCANN
-+
-677777888888888888888888977765452/1012100/#+,-+,+,$+*)(*)'(('(#'#'&"$%##$$""
- at 30BB2AAXX080903:3:35:1505:1904#0
-CCGGATTTCATGTGTTTTCTAGCTATTGGGAGCCTGTCTTTCCCTGGCGCTGGGTGCAACCAGTTCTNGTCGCACN
-+
-67777788888888888888888877776555443210100-/.-.--,,+,+*#+%(('''('(&'""$#"###"
- at 30BB2AAXX080903:3:40:769:561#0
-ACACGCCGCCATTTTGCCCCTCAGTGCACACGCTTGAGCCAACTCGCCCAGTTCCTGAGATCGTATCAGGGTCTCT
-+
-677777888838888888&883486777455530*22210--+)-,-,-&+%*)*))()(('('(#%"%#$""##"
- at 30BB2AAXX080903:3:47:1683:2020#0
-TCCCTGGAGGGAGGGAGCATGCCCGGTGTGTTCACTGGAGGGAGGGAGGATGCCCCGTGTATTCAGGCATGCGTCA
-+
-6777778888888888888888)87777152544/220(00/,..-*,%)**#$##%#'###'####$"""$###"
- at 30BB2AAXX080903:3:55:287:410#0
-GCACCCCTTCTCCCCTGATCCTTCTTCAGGGTGGGCTGTCCACCCATGCAGCATCTTGCGAGAGATCGGCGGCGGT
-+
-67777788888888888888888,7777655/443222&00//+..,-,,+*(***'))'(((((''&"%&&""""
- at 30BB2AAXX080903:3:33:1562:607#0
-TGAGATGGAGTCTGTCTCTGTCGCCCAGGCTGAAGTCCAGTGGCACAATCTCCGCTCACTGCACGCTNGCCACTNN
-+
-67777788848888888888838877876.55'430011/)./--+-,++*&%*'(((&((#'#(%#""$#"#"""
- at 30BB2AAXX080903:3:53:173:884#0
-GCACTTGGGAGGGAGCATGCACAGAGTTTACTGGAGTTGTGCGCACGCTCCCTCGAGGCCTTTTTTTTCTTTTTTT
-+
-677777888088888888888888774763554422011/0//-,.-,+,+*)**())((('''(&'$$$$&%$$$
- at 30BB2AAXX080903:3:3:1044:1064#0
-CCCCCATTGTGCGGCGCGCGGAGGAGCCGCCAGCGCCTGGGCCCGCGTCCTCGTCGCCGCCAGATCGTNAGCCNCA
-+
-677777888888888888088+883784652,411.1-./1...,+,)++*)*$&(#()'%%'##%'""""$#"##
- at 30BB2AAXX080903:3:60:500:161#0
-CATGCGCCCGCGGACGTGCAGCTTCTGTGTCGGTCCCATTAAGAGGAACCCGGCCCAGATCGGAAGAGCCGCTCNN
-+
-6777778888888888888.8888777665554)222')/-.,,,-,,&+$*+)*#(''#(')#'(#%&#$$"#""
- at 30BB2AAXX080903:3:56:467:1684#0
-GCATGATCGTGGCTCACTGCAGCCTGGACCTCCTAGGCTCAAGCGATCCTCCACCTCAGCCTCCAGAGTCTCTCAC
-+
-67777788888888888888888877776555443222100./..---,,,+++*+**)))))(''''$"#$#$##
- at 30BB2AAXX080903:3:56:89:2027#0
-ACACACCCGTGGTCCCAGCTACTCTGGAGGCTGAGGTGGAGGATCGCTTGAGCCTAGGAGGTCCAGGCTGCTCGCC
-+
-677777888888888888888888777765544/32/2100/,.,-,,,,*+*)*%))((('&#&&%"$%#"####
- at 30BB2AAXX080903:3:8:1605:568#0
-CTGTGGCCCTGGGTGACCGTGTCCTTATGCTGGAGCTTGGTCCACAAGTGTCCCCGCCCCTAGATCGNCCTGCGNN
-+
-677777888888888888888888777765554431221000...-+-+,+***)*(*)((((('''""$$"#"""
- at 30BB2AAXX080903:3:35:1258:1134#0
-ACGCCGGCAGGGGCTCTGCTCCCAGAGATCAGGTGGGTGCTGGTCTCAGAGCACAGTTCAGCAGGGGNTCTATCAN
-+
-677777888888888888888884777864554-322.10///.--,,+,,*+$')#'((''(''#'"$$""#$#"
- at 30BB2AAXX080903:3:54:609:1219#0
-GTTCTCGGGAATGTGCACCCCGTGCGGTTACTCAGGAGGGAGCCTCCAGGGACATCTCGCATGGCCTAGACTCTCT
-+
-67777788888888888888888877775555443232100/...---,-+,+**+)))))))((''$%"$$$"$$
- at 30BB2AAXX080903:3:45:1228:510#0
-GCGGTGGCTCACGCCTGGAATCCCAGCACTCTTGAGAGGCCAAGGCGGGCGGAGCCCGTGGAGTCCGGCGNCTGCG
-+
-677777883818'88&88888888/77/6-5%4(103/11/./--+---+,*%)#'##)&%((##%%%##"#"###
- at 30BB2AAXX080903:3:37:502:284#0
-GACGCAACAGAAACCGAACCCCACCAAGGCCCCCAAAACCGAGCCCCACCGAGGCCCCCAAGATCGGACGTCGCCN
-+
-6777778888888888888888887777655542322001/../-.--,++*+)**)*)((((&((%%"""""##"
- at 30BB2AAXX080903:3:41:369:530#0
-TTGGGGGCCTTGGTGGGGTTCGGTTTCTGTTGCGTCACCTCTATGCGGTCCCTGGGGCTGGCGTGCCACGCGCNGG
-+
-67777788888888888888888877776555443222200//..---,,,,+***)*)))((('''%"%#%$""#
- at 30BB2AAXX080903:3:3:1454:1726#0
-GGGGGTAAAGGGCACCCAGCTGCAGTTCTGAGCCTCCCTCGTCCACGCACGTCCTGGTGTAGCTATGCNCATCNTA
-+
-6777778888888888888888887,$76-55441210(/00/.,.,,+,*)+**))#)'(((((&'"""#"%""#
- at 30BB2AAXX080903:3:49:1063:534#0
-GCTGCCTGGCTGGGCAGGAGGCTGGGGGGCCTCTGTCCCGCCATGGCTTCCCCGGGACCGCACCCCCCGCATACAC
-+
-677777888888888888888888777;655043321110///,--,++,+*+))*'())(''('#&$""""$""%
- at 30BB2AAXX080903:3:41:1725:888#0
-ACCTGCAGGCGGGCTCAGGGACCTGGCACTGGGGAGACGAGGGTCAGCGGGGGCCCCAGCCCGAGCTCCNAGCGTT
-+
-677777888888888888888.2'77719'3544/31-1.1/.&+$+(,,$$*$#&'#%#&#&#'%#%$"%#"""#
- at 30BB2AAXX080903:3:45:1667:1542#0
-GGCGGGGCTGCCTCCCATCAGCTCCGAAGATCCCCCAGGTCCTGAGAACCCCTGCTCCGGGTCTCCTGGGGGCCGG
-+
-6777778888888888888888887707665544322212//..--,,,,++*+*()$)(('('(''&"#""#"#"
- at 30BB2AAXX080903:3:51:1686:695#0
-TGAGCTTCGAGGTGCCGTAGCTTCACTTCCGAGGGAGCCGGCCTCACAGGCCGAGGCCAGGGGGCCTNCACACAAC
-+
-67777788888888888888888877776555443222100//..---,,++++**)))))((((''"$&%$##$$
- at 30BB2AAXX080903:3:46:1033:1163#0
-CACAGGCCCCACCTCCCCACGGGCGAGGGGCACCCCTTGATTCAGGAGGTAGAATGTGGCAACAGAGCGATCTCAC
-+
-67777788888888888888888877776555243222100///.---,,++****))*))(('(((""#"#"#"#
- at 30BB2AAXX080903:3:43:1533:1444#0
-AGGAGAGCAACTGCGGAGAAGGCTGTGCCCTGAGGCGGCAGAGCTGAGGCCAACAGCAACCAGATCGGACAAGGCN
-+
-67777788888888888888888877776555443222210./,'-,-,+,*+*)*())'((((#&(&$#""""""
- at 30BB2AAXX080903:3:33:85:362#0
-AAGGTGGGGCTCTCCAGATGGGGCTGTAAACGCCGCGTCCTGTGTGCTCTGCCTGGGATGGCGCGCCNCACTATNN
-+
-6777178.8888888888888888777765554&3222101%-.,-**-,,++'**)*))))&(('&"%#$###""
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam
deleted file mode 100644
index a98d864..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt
deleted file mode 100644
index 8b96bba..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt
+++ /dev/null
@@ -1,40 +0,0 @@
- at SL-XAP:1:1:0:1171#0/1
-NTGAGGAGGAATCAGATGAAGTGGAGGATAACGACAATGACTCTGAAATGGAGAGGCCTGTAAATAGAGGAGGCAG
-+SL-XAP:1:1:0:1171#0/1
-DNUYUPUNUXXYWYSYYSVYVRNSWUUYYYYVTSYYXWPWYVYVYPSRTRNPLTQLUYSFSVXXBBBBBBBBBBBB
- at SL-XAP:1:1:0:1477#0/1
-NCACTCGTTTATCCATCCTCTCGTTACTGGGTCATGTCATAAGACTGCAGCCATCTTGGAATCATAAGCTCTATCA
-+SL-XAP:1:1:0:1477#0/1
-DMWYUSUWVWYUQRSUSUWSWYWVWSYYVVVWNRTWROQUWBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:0:1733#0/1
-NAGAACGAGCAGTTTGGAAGTTGCTACCAATTTAATACTCAGACTGCTCTTTCTTGTAAAGAAGCTTATGTTTCAT
-+SL-XAP:1:1:0:1733#0/1
-DOTWZVRUNUVQV[VQNVRNUTKTZZZXVVY[YTQVXXZZRJQODEOYYYYZBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:0:1384#0/1
-NAAATTTATACTTTAAATTACCTTCACTGTTCCATCAAATGACCAAGAAAGCAGTCTTGAATTTTTCAATATTCTA
-+SL-XAP:1:1:0:1384#0/1
-DP[[[[[[Z[[[[[YZZ[[[Z[[[Z[[XRX[[ZZ[ZXXUVOV[[XTPWUUMXXIXZYTOTQVYYYY[WBBBBBBBB
- at SL-XAP:1:1:0:528#0/1
-NAGAAATAATATATATCCTATTTCTTAGTAAGCCACCTAGAACAGCAAGAGTGGCTAAAATGAGATGGTGTTCCTT
-+SL-XAP:1:1:0:528#0/1
-DOUVXXXXYZ[[[YXY[[YXY[[[[YSLVXURXZZ[[[TBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:1:408#0/1
-NGCCACTACGCCATGAAGATCCTCAACAAGCAGAAGGTGGTGAATATGAAGCATGTCTAGCACATACTTAACTAGA
-+SL-XAP:1:1:1:408#0/1
-DMWYVYWUUQUYYTLSWSVYYYYWVWYWVPBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:1424#0/1
-NTCAAGTTTCATTACTTTCTTAATTTATTTCCTAAATAGGCTGCCATGATGTCTTATGATCTTAAGAATTAACATT
-+SL-XAP:1:1:2:1424#0/1
-DO[[VLV[[[[[[[[[[[[[[[[[[[[[[[Y[[ZZZZBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:1419#0/1
-NGATCATAGGCAAGAGCCACCACATCGACCTAGCACTGCTTTNTAACCTGTGCTCTGACCTGCCCCTCCCAAGCAT
-+SL-XAP:1:1:2:1419#0/1
-DMWWXWXWURWWURWUUWWWWWXVWSKSWWWWUWWWUKSWXNDPUWWWNEMPSWWUOPVWTOTXWVWBBBBBBBBB
- at SL-XAP:1:1:2:1872#0/1
-NTATGTACGTAGTCTAGGCCATATGTGTTGGAGATTGAGACTAGTAGGGCTAGTCCCACCGCTGCTTCGCAGGCGG
-+SL-XAP:1:1:2:1872#0/1
-DPWWUWXWRWTPUWWSPPTWUWVWSTNUUONUPTWBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
- at SL-XAP:1:1:2:472#0/1
-NATGACTTGTGGGACATCACAGTAGAAGTTGTCCAGTTCATTGGGCCCACAGAAAGGCAGCTGTATGACTAGTATG
-+SL-XAP:1:1:2:472#0/1
-DNWVWYYWRVTSSVWVWYYYYVWUUUVSVTRTYWTRVYWVWUNFLTYWBBBBBBBBBBBBBBBBBBBBBBBBBBBB
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam
deleted file mode 100644
index 7235dfa..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq
deleted file mode 100644
index 2154981..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq
+++ /dev/null
@@ -1,8 +0,0 @@
- at FAKE0003 Original version has Solexa scores from 62 to -5 inclusive (in that order)
-ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
-+
-;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
- at FAKE0004 Original version has Solexa scores from -5 to 62 inclusive (in that order)
-TGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCA
-+
-~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;
diff --git a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam b/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam
deleted file mode 100644
index b47ad2b..0000000
--- a/src/test/resources/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.0 SO:queryname
- at RG ID:0 SM:Hi,Mom! PL:ILLUMINA
-both_reads_align_clip_adapter 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_align_clip_adapter 141 * 0 0 * * 0 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-both_reads_align_clip_marked 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0 XT:i:97
-both_reads_align_clip_marked 141 * 0 0 * * 0 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0 XT:i:97
-both_reads_present_only_first_aligns 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-both_reads_present_only_first_aligns 141 * 0 0 * * 0 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-neither_read_aligns_or_present 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-neither_read_aligns_or_present 141 * 0 0 * * 0 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
-read_2_too_many_gaps 77 * 0 0 * * 0 0 CAACAGAAGCNGGNATCTGTGTTTGTGTTTCGGATTTCCTGCTGAANNGNTTNTCGNNTCNNNNNNNNATCCCGATTTCNTTCCGCAGCTNACCTCCCAAN )'.*.+2,))&&'&*/)-&*-)&.-)&)&),/-&&..)./.,.).*&&,&.&&-)&&&0*&&&&&&&&/32/,01460&&/6/*0*/2/283//36868/& RG:Z:0
-read_2_too_many_gaps 141 * 0 0 * * 0 0 NCGCGGCATCNCGATTTCTTTCCGCAGCTAACCTCCCGACAGATCGGCAGCGCGTCGTGTAGGTTATTATGGTACATCTTGTCGTGCGGCNAGAGCATACA &/15445666651/566666553+2/14/&/555512+3/)-'/-&-'*+))*''13+3)'//++''/'))/3+&*5++)&'2+&+/*&-&&*)&-./1'1 RG:Z:0
diff --git a/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam b/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam
deleted file mode 100644
index 749b8e7..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/defective_bgzf.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam b/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam
deleted file mode 100644
index 0d9cbf7..0000000
Binary files a/src/test/resources/htsjdk/samtools/util/no_bgzf_terminator.bam and /dev/null differ
diff --git a/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt b/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt
deleted file mode 100644
index 21c7fd8..0000000
--- a/src/test/resources/htsjdk/samtools/util/whitespace_text_file.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Now is the time
-for all good men
-to come to the
-#This is a comment
-aid of their country.
-15.0 23 55 67.88888
diff --git a/src/test/resources/htsjdk/tribble/Tb.vcf.idx b/src/test/resources/htsjdk/tribble/Tb.vcf.idx
deleted file mode 100644
index daf3430..0000000
Binary files a/src/test/resources/htsjdk/tribble/Tb.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp b/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp
deleted file mode 100644
index fd1fc5e..0000000
--- a/src/test/resources/htsjdk/tribble/basicDbSNP.dbsnp
+++ /dev/null
@@ -1,43 +0,0 @@
-#bin chrom chromStart chromEnd name score strand refNCBI refUCSC observed molType class valid avHet avHetSE func locType weight
-585 1 259 260 rs72477211 0 + C C A/G genomic single unknown 0 0 unknown exact 3
-585 1 433 433 rs56289060 0 + - - -/C genomic insertion unknown 0 0 unknown between 1
-585 1 491 492 rs55998931 0 + C C C/T genomic single unknown 0 0 unknown exact 1
-585 1 518 519 rs62636508 0 + G G C/G genomic single unknown 0 0 unknown exact 1
-585 1 582 583 rs58108140 0 + G G A/G genomic single unknown 0 0 unknown exact 1
-585 1 690 691 rs10218492 0 + G G A/G genomic single by-cluster 0 0 unknown exact 1
-585 1 766 767 rs10218493 0 + G G A/G genomic single by-cluster 0 0 unknown exact 1
-585 1 789 790 rs10218527 0 + A A A/G genomic single by-cluster 0 0 unknown exact 1
-585 1 800 801 rs28853987 0 + G G A/G genomic single unknown 0 0 unknown exact 1
-585 1 876 877 rs28484712 0 + G G A/G genomic single unknown 0 0 unknown exact 1
-585 1 884 885 rs28775022 0 + G G A/G genomic single unknown 0 0 unknown exact 1
-585 1 884 885 rs62636509 0 + G G A/G genomic single unknown 0 0 unknown exact 3
-585 1 943 944 rs10218495 0 + G G G/T genomic single by-cluster 0 0 unknown exact 3
-585 1 1016 1017 rs62635278 0 + A A A/C genomic single unknown 0 0 unknown exact 3
-585 1 1029 1030 rs62635279 0 + C C A/C genomic single unknown 0 0 unknown exact 3
-585 1 1271 1272 rs2441671 0 - A A C/T genomic single unknown 0 0 unknown exact 3
-585 1 1271 1272 rs9803797 0 + A A A/G genomic single by-cluster 0 0 unknown exact 3
-585 1 1319 1320 rs2758124 0 - C C C/G genomic single unknown 0 0 unknown exact 3
-585 1 1332 1333 rs3950659 0 - G G C/T genomic single unknown 0 0 unknown exact 3
-585 1 1370 1371 rs3877545 0 - A A C/T genomic single unknown 0 0 unknown exact 3
-585 1 1404 1405 rs2758123 0 - A A A/T genomic single unknown 0 0 unknown exact 3
-585 1 1427 1428 rs2691333 0 - G G A/C genomic single unknown 0 0 unknown exact 3
-585 1 1468 1469 rs62162368 0 - A A C/T genomic single unknown 0 0 unknown exact 3
-585 1 1539 1540 rs4030196 0 - G G C/G genomic single unknown 0 0 unknown exact 3
-585 1 1554 1555 rs2363296 0 - A A G/T genomic single unknown 0 0 unknown exact 3
-585 1 1591 1592 rs4592209 0 + T T C/T genomic single unknown 0 0 unknown exact 3
-585 1 1643 1644 rs61427470 0 - C C A/G genomic single unknown 0 0 unknown exact 3
-585 1 1643 1644 rs62162367 0 - C C A/G genomic single unknown 0 0 unknown exact 3
-585 1 1649 1650 rs57905273 0 - T T -/A genomic deletion unknown 0 0 unknown exact 3
-585 1 1665 1666 rs62162366 0 - T T A/G genomic single unknown 0 0 unknown exact 3
-585 1 1730 1731 rs11510383 0 - C C A/G genomic single unknown 0 0 unknown exact 3
-585 1 1757 1758 rs4030194 0 - G G C/T genomic single unknown 0 0 unknown exact 3
-585 1 1783 1784 rs57442816 0 - T T A/G genomic single unknown 0 0 unknown exact 3
-585 1 1808 1809 rs4849250 0 - C C A/G genomic single by-2hit-2allele 0 0 unknown exact 3
-585 1 1809 1810 rs7564627 0 - G G C/T genomic single by-cluster 0 0 unknown exact 3
-585 1 1822 1823 rs71234145 0 + C C C/T genomic single unknown 0 0 unknown exact 3
-585 1 1823 1824 rs2981848 0 - G G C/T genomic single unknown 0 0 unknown exact 3
-585 1 1825 1826 rs2462500 0 - G G A/C genomic single by-cluster 0 0 unknown exact 3
-585 1 1832 1833 rs7357973 0 - A A C/T genomic single by-cluster 0 0 unknown exact 3
-585 1 1863 1864 rs62028714 0 + C C C/G genomic single unknown 0 0 unknown exact 3
-585 1 1911 1912 rs7357889 0 - C C C/G genomic single by-cluster 0 0 unknown exact 3
-585 1 1936 1937 rs11510263 0 - T T A/G genomic single unknown 0 0 unknown exact 3
diff --git a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed b/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed
deleted file mode 100644
index 36959bb..0000000
--- a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19.bed
+++ /dev/null
@@ -1,35 +0,0 @@
-#comment
-1 25592413 25657872
-1 35101420 35111976
-1 110226277 110241477
-1 152555536 152587611
-2 34695828 34736559
-3 65188868 65214748
-3 162512133 162626335
-3 192875328 192885405
-4 10210770 10234599
-4 70130411 70231411
-4 116166903 116177179
-5 104432112 104503671
-6 55825956 55846709
-6 67008726 67048918
-6 78967153 79036479
-6 103737463 103762885
-7 141767909 141785939
-8 24972431 24990943
-8 39232073 39387227
-8 144700483 144714692
-9 23362800 23377775
-9 44242964 44280939
-10 53203675 53214217
-10 71281002 71291092
-11 51341924 51362954
-11 55366389 55376449
-11 55388020 55431449
-11 55445865 55456751
-14 73996607 74025282
-16 19945549 19967579
-19 20595809 20717976
-19 52133806 52150233
-20 1560965 1594435
-20 52647063 52658002
diff --git a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed b/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed
deleted file mode 100644
index ea34a83..0000000
--- a/src/test/resources/htsjdk/tribble/bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed
+++ /dev/null
@@ -1,36 +0,0 @@
-##########
-1 25592413 25657872
-1 35101420 35111976
-1 110226277 110241477
-1 152555536 152587611
-2 34695828 34736559
-3 65188868 65214748
-3 162512133 162626335
-3 192875328 192885405
-4 10210770 10234599
-4 70130411 70231411
-4 116166903 116177179
-5 104432112 104503671
-6 55825956 55846709
-6 67008726 67048918
-6 78967153 79036479
-6 103737463 103762885
-#########
-7 141767909 141785939
-8 24972431 24990943
-8 39232073 39387227
-8 144700483 144714692
-9 23362800 23377775
-9 44242964 44280939
-10 53203675 53214217
-10 71281002 71291092
-11 51341924 51362954
-11 55366389 55376449
-11 55388020 55431449
-11 55445865 55456751
-14 73996607 74025282
-16 19945549 19967579
-19 20595809 20717976
-19 52133806 52150233
-20 1560965 1594435
-20 52647063 52658002
diff --git a/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed b/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed
deleted file mode 100644
index 1628199..0000000
--- a/src/test/resources/htsjdk/tribble/bed/Unigene.sample.bed
+++ /dev/null
@@ -1,72 +0,0 @@
-chr2 1 200000000 LONG_FEATURE 0 + 178707289 178707561 0 3 85,177,8, 0,87,264,
-chr2 178707289 178707561 Hs.666133 0 + 178707289 178707561 0 3 85,177,8, 0,87,264,
-chr2 178709699 178711955 Hs.377257 0 + 178709699 178711955 0 1 2256, 0,
-chr2 178711404 178712057 Hs.688767 0 - 178711404 178712057 0 1 653, 0,
-chr2 178777793 178778272 Hs.541631 0 - 178777793 178778272 0 1 479, 0,
-chr2 178908612 178916376 Hs.318775 0 + 178908612 178916376 0 4 2644,3067,464,1588, 0,2645,5712,6176,
-chr2 178969501 178972156 Hs.593061 0 + 178969501 178972156 0 2 1262,1393, 0,1262,
-chr2 178969902 178971077 Hs.712020 0 - 178969902 178971077 0 1 1175, 0,
-chr2 178973806 178974450 Hs.634282 0 + 178973806 178974450 0 1 644, 0,
-chr2 178974749 178975493 Hs.323349 0 + 178974749 178975493 0 4 337,389,4,13, 0,337,726,731,
-chr2 179004517 179006503 Hs.632540 0 - 179004517 179006503 0 1 1986, 0,
-chr2 179004764 179005050 Hs.625283 0 + 179004764 179005050 0 2 9,276, 0,10,
-chr2 179007083 179007837 Hs.684082 0 + 179007083 179007837 0 5 28,30,20,226,79, 0,72,117,449,675,
-chr2 179008250 179008984 Hs.685223 0 + 179008250 179008984 0 1 734, 0,
-chr2 179008373 179013032 Hs.570274 0 + 179008373 179013032 0 3 2710,583,1365, 0,2711,3294,
-chr2 179011106 179011819 Hs.662660 0 + 179011106 179011819 0 8 556,6,22,98,12,6,6,5, 0,558,564,586,684,696,702,708,
-chr2 179012189 179013184 Hs.658781 0 - 179012189 179013184 0 7 5,9,22,99,844,4,6, 0,6,16,39,139,984,989,
-chr2 179018046 179018564 Hs.633180 0 - 179018046 179018564 0 1 518, 0,
-chr2 179020446 179020899 Hs.605693 0 - 179020446 179020899 0 1 453, 0,
-chr2 179026223 179034260 Hs.87734 0 + 179026223 179034260 0 5 1276,142,118,99,306, 0,2759,5259,7097,7731,
-chr2 179033863 179034261 Hs.607684 0 - 179033863 179034261 0 1 398, 0,
-chr2 179036643 179037341 Hs.645700 0 + 179036643 179037341 0 2 678,19, 0,679,
-chr2 179037911 179051526 Hs.410378 0 - 179037911 179051526 0 5 813,179,134,152,275, 0,814,4713,12123,13340,
-chr2 179052287 179052856 Hs.560940 0 - 179052287 179052856 0 2 291,277, 0,292,
-chr2 179053444 179078029 Hs.41086 0 + 179053444 179078029 0 8 438,117,156,137,165,44,116,1297, 0,5169,10187,13381,15024,18739,20589,23288,
-chr2 179053611 179058730 Hs.560270 0 + 179053611 179058730 0 7 105,37,4,23,99,9,107, 0,105,144,148,172,5002,5012,
-chr2 179078066 179078770 Hs.600801 0 - 179078066 179078770 0 2 350,8, 0,696,
-chr2 179078529 179079064 Hs.541630 0 + 179078529 179079064 0 1 535, 0,
-chr2 179087076 179087882 Hs.560768 0 + 179087076 179087882 0 11 586,90,17,10,22,7,14,23,8,13,10, 0,586,680,697,708,730,738,752,775,783,796,
-chr2 179088297 179088941 Hs.612551 0 + 179088297 179088941 0 7 383,4,214,16,6,5,12, 0,384,389,603,620,626,632,
-chr2 179088778 179089441 Hs.712123 0 - 179088778 179089441 0 8 7,6,8,7,9,12,17,588, 0,9,17,26,34,44,57,75,
-chr2 179088997 179089435 Hs.470769 0 - 179088997 179089435 0 1 438, 0,
-chr2 179095799 179178377 Hs.714450 0 + 179095799 179178377 0 17 34,185,97,331,1193,63,140,135,191,398,421,176,86,118,157,192,675, 0,625,12905,14534,15871,17280,19395,59745,60164,60697,61746,68312,74768,75728,76766,77648,81903,
-chr2 179098961 179380395 Hs.134602 0 - 179098961 179380395 0 314 1319,303,154,692,157,5609,594,306,576,300,306,585,303,303,300,288,594,282,306,306,297,291,306,303,2067,300,288,294,1767,306,303,300,288,297,303,588,297,17106,303,588,297,198,105,588,288,291,288,306,303,297,288,300,303,300,276,303,300,285,321,2967,294,300,282,309,303,300,282,303,303,38,243,151,149,315,300,295,27,292,300,130,33,149,309,430,191,309,300,294,285,297,300,303,363,303,300,279,306,197,106,300,300,116,187,297,288,122 [...]
-chr2 179114097 179114772 Hs.596354 0 - 179114097 179114772 0 1 675, 0,
-chr2 179115873 179116818 Hs.622912 0 - 179115873 179116818 0 2 67,603, 0,342,
-chr2 179121907 179122356 Hs.609542 0 - 179121907 179122356 0 2 224,224, 0,225,
-chr2 179122873 179123656 Hs.621944 0 - 179122873 179123656 0 1 783, 0,
-chr2 179123897 179124349 Hs.619377 0 - 179123897 179124349 0 1 452, 0,
-chr2 179127533 179131939 Hs.640473 0 + 179127533 179131939 0 1 4406, 0,
-chr2 179150961 179151480 Hs.609295 0 - 179150961 179151480 0 1 519, 0,
-chr2 179189619 179190087 Hs.710694 0 + 179189619 179190087 0 12 33,37,18,29,11,179,33,13,34,16,5,52, 0,34,72,91,120,131,311,344,358,393,409,416,
-chr2 179204887 179205401 Hs.661496 0 - 179204887 179205401 0 2 16,498, 0,16,
-chr2 179209546 179287210 Hs.620337 0 - 179209546 179287210 0 5 124,358,6,11,109, 0,77179,77537,77544,77555,
-chr2 179217688 179218151 Hs.603086 0 - 179217688 179218151 0 1 463, 0,
-chr2 179227481 179235392 Hs.678928 0 - 179227481 179235392 0 12 6,15,2,11,72,85,5,79,81,73,8,83, 0,7,23,235,247,402,990,7254,7438,7632,7705,7828,
-chr2 179266309 179266748 Hs.609465 0 - 179266309 179266748 0 1 439, 0,
-chr2 179296428 179300012 Hs.623987 0 + 179296428 179300012 0 1 3584, 0,
-chr2 179302952 179303488 Hs.594545 0 - 179302952 179303488 0 1 536, 0,
-chr2 179305908 179308754 Hs.595834 0 + 179305908 179308754 0 6 121,194,124,4,13,40, 0,701,1567,1691,2793,2806,
-chr2 179315565 179317384 Hs.628418 0 - 179315565 179317384 0 1 1819, 0,
-chr2 179315565 179316076 Hs.670754 0 + 179315565 179316076 0 1 511, 0,
-chr2 179317750 179337584 Hs.589824 0 + 179317750 179337584 0 6 64,57,54,75,373,53, 0,11487,14212,16161,19407,19781,
-chr2 179349897 179352934 Hs.570275 0 + 179349897 179352934 0 2 1830,125, 0,2912,
-chr2 179360386 179361066 Hs.711672 0 + 179360386 179361066 0 1 680, 0,
-chr2 179405591 179445166 Hs.324341 0 - 179405591 179445166 0 13 1821,236,352,117,113,184,195,141,150,180,189,126,62, 0,4274,4773,13006,17429,20821,22727,23637,33147,35406,36497,38807,39513,
-chr2 179433849 179434307 Hs.663044 0 - 179433849 179434307 0 1 458, 0,
-chr2 179445992 179623031 Hs.591627 0 - 179445992 179623031 0 19 283,2269,402,296,353,208,10,1299,192,120,142,173,195,117,254,109,192,123,220, 0,283,2553,2955,3252,3605,3813,3824,11880,13731,15506,32308,45692,71514,88209,102036,105463,174263,176819,
-chr2 179531336 179531470 Hs.610180 0 + 179531336 179531470 0 1 134, 0,
-chr2 179531674 179531995 Hs.610180 0 + 179531674 179531995 0 4 6,17,164,130, 0,10,27,191,
-chr2 179674663 179837595 Hs.30977 0 - 179674663 179837595 0 18 8337,122,192,123,82,160,115,195,123,212,56,98,114,114,91,109,80,125, 0,11032,13373,14976,15840,20078,22023,22672,30612,41900,44710,47605,49586,70428,74756,81388,90095,162807,
-chr2 179675396 179681310 Hs.714518 0 + 179675396 179681310 0 2 435,41, 0,5873,
-chr2 179675483 179675797 Hs.609408 0 + 179675483 179675797 0 1 314, 0,
-chr2 179698890 179699454 Hs.667783 0 - 179698890 179699454 0 2 436,125, 0,439,
-chr2 179702362 179702797 Hs.602509 0 + 179702362 179702797 0 1 435, 0,
-chr2 179714478 179714731 Hs.679403 0 - 179714478 179714731 0 1 253, 0,
-chr2 179720333 179721089 Hs.686454 0 + 179720333 179721089 0 1 756, 0,
-chr2 179820582 179821132 Hs.671087 0 + 179820582 179821132 0 1 550, 0,
-chr2 179820805 179821282 Hs.621019 0 - 179820805 179821282 0 2 264,205, 0,272,
-chr2 179908392 179909870 Hs.516555 0 - 179908392 179909870 0 3 227,147,6, 0,1115,1472,
-chr2 179929123 179929744 Hs.541629 0 - 179929123 179929744 0 4 18,41,385,164, 0,30,71,457,
-chr2 179972131 179973464 Hs.179697 0 - 179972131 179973464 0 3 4,1011,317, 0,5,1016,
diff --git a/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed b/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed
deleted file mode 100644
index 9f3334b..0000000
--- a/src/test/resources/htsjdk/tribble/bed/disconcontigs.bed
+++ /dev/null
@@ -1,5 +0,0 @@
-chr2 178707289 178707561 Hs.666133 0 + 178707289 178707561 0 3 85,177,8, 0,87,264,
-chr1 178709699 178711955 Hs.377257 0 + 178709699 178711955 0 1 2256, 0,
-chr1 178711404 178712057 Hs.688767 0 - 178711404 178712057 0 1 653, 0,
-chr2 178777793 178778272 Hs.541631 0 - 178777793 178778272 0 1 479, 0,
-chr2 178908612 178916376 Hs.318775 0 + 178908612 178916376 0 4 2644,3067,464,1588, 0,2645,5712,6176,
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/bed/unsorted.bed b/src/test/resources/htsjdk/tribble/bed/unsorted.bed
deleted file mode 100644
index 42500d8..0000000
--- a/src/test/resources/htsjdk/tribble/bed/unsorted.bed
+++ /dev/null
@@ -1,5 +0,0 @@
-chr2 178707289 178707561 Hs.666133 0 + 178707289 178707561 0 3 85,177,8, 0,87,264,
-chr2 178709699 178711955 Hs.377257 0 + 178709699 178711955 0 1 2256, 0,
-chr2 178711404 178712057 Hs.688767 0 - 178711404 178712057 0 1 653, 0,
-chr2 178908612 178916376 Hs.318775 0 + 178908612 178916376 0 4 2644,3067,464,1588, 0,2645,5712,6176,
-chr2 178777793 178778272 Hs.541631 0 - 178777793 178778272 0 1 479, 0,
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/complexExample.vcf b/src/test/resources/htsjdk/tribble/complexExample.vcf
deleted file mode 100644
index fb76a8d..0000000
--- a/src/test/resources/htsjdk/tribble/complexExample.vcf
+++ /dev/null
@@ -1,23 +0,0 @@
-##format=VCRv3.3
-##source=ArbitrarySource
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##reference=human_b36_both.fasta
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-1 10001292 testid1 G A 12.22 0 AF=0.50;AlleleBalance=0.57;DoC=23;HomopolymerRun=0;MAPQ0=8;NS=1;RMSMAPQ=46.31;SB=-24.92;SpanningDeletions=0 GT:DP:GQ 1/0:23:19.27 ./. ./.
-1 10002963 . C G 22.22 . AF=0.50;AlleleBalance=0.47;DoC=30;HomopolymerRun=0;MAPQ0=0;NS=1;RMSMAPQ=81.91;SB=-41.73;SpanningDeletions=0 GT:DP:GQ 0/1:30:33.07 ./. ./.
-1 10005008 . A T,C 123.78 0 AF=1.00;DoC=30;HomopolymerRun=6;MAPQ0=2;NS=1;RMSMAPQ=61.05;SB=-75.45;SpanningDeletions=1 GT:DP:GQ 1/1:27:4.03 0/1:26:3.0 0/0:16:2.0
-1 10006296 . C T 42.23 0 AF=0.50;AlleleBalance=0.33;DoC=7;HomopolymerRun=0;MAPQ0=11;NS=1;RMSMAPQ=46.62;SB=-0.04;SpanningDeletions=0 GT:DP:GQ 0/1:7:2000000 ./. ./.
-1 10023478 . G C,A,T 84.23 . AF=1.00;DoC=27;HomopolymerRun=1;MAPQ0=10;NS=1;RMSMAPQ=42.16;SB=-48.38;SpanningDeletions=0 GT:DP:GQ 1/1:27:4.03 2/2:26:3.0 0/3:16:2.0
-1 10029362 . T C 52.22 . AF=0.50;AlleleBalance=0.52;DoC=44;HomopolymerRun=0;MAPQ0=0;NS=1;RMSMAPQ=81.28;SB=-42.22;SpanningDeletions=0 GT:DP:GQ ./. 1/0:-1:36.62 ./.
-1 10042312 . G C 31.81 . AF=0.50;AlleleBalance=0.70;DoC=24;HomopolymerRun=1;MAPQ0=0;NS=1;RMSMAPQ=85.07;SB=0.00;SpanningDeletions=0 GT:DP:GQ 1/0::5.85 0/0:: 0/1:4:
-1 10044557 . C T 62.22 . AF=0.50;AlleleBalance=0.68;DoC=31;HomopolymerRun=16;MAPQ0=0;NS=1;RMSMAPQ=85.34;SB=-0.00;SpanningDeletions=0 GT:DP:GQ ./. ./. 0/1:31:15.01
-1 10045603 . A D3 40.26 0 AF=0.50 GT:DP:GQ 0/1:15:7.94 0/0:15:7.94 1/1:15:7.94
-1 10045604 . A ICAT 41.26 0 AF=0.50 GT:DP:GQ 1/1:14:6.94 0/0:15:7.94 1/0:15:7.94
-1 10048142 . A G 126.81 foo AF=1.00;DoC=36;HomopolymerRun=4;MAPQ0=0;NS=1;RMSMAPQ=82.11;SB=-85.45;SpanningDeletions=0 GT:DP:GQ 0/1:15:7.94 0/0:15:7.94 1/1:15:7.94
-1 10048580 . T A 72.22 bar;baz AF=0.50;AlleleBalance=0.69;DoC=33;HomopolymerRun=6;MAPQ0=0;NS=1;RMSMAPQ=84.45;SB=-27.41;SpanningDeletions=0 GT:DP:GQ 0/1:15:7.94 0/0:15:7.94 1/1:15:7.94
diff --git a/src/test/resources/htsjdk/tribble/fakeBed.bed b/src/test/resources/htsjdk/tribble/fakeBed.bed
deleted file mode 100644
index 0c46b81..0000000
--- a/src/test/resources/htsjdk/tribble/fakeBed.bed
+++ /dev/null
@@ -1,51 +0,0 @@
-chrM 1 1 TITLE
-chr1 1 1 TITLE
-chr1 101 101 TITLE
-chr1 201 201 TITLE
-chr1 301 301 TITLE
-chr1 401 401 TITLE
-chr1 501 501 TITLE
-chr1 601 601 TITLE
-chr1 701 701 TITLE
-chr1 801 801 TITLE
-chr1 901 901 TITLE
-chr1 1001 1001 TITLE
-chr1 1101 1101 TITLE
-chr1 1201 1201 TITLE
-chr1 1301 1301 TITLE
-chr1 1401 1401 TITLE
-chr1 1501 1501 TITLE
-chr1 1601 1601 TITLE
-chr1 1701 1701 TITLE
-chr1 1801 1801 TITLE
-chr1 1901 1901 TITLE
-chr1 2001 2001 TITLE
-chr1 2101 2101 TITLE
-chr1 2201 2201 TITLE
-chr1 2301 2301 TITLE
-chr1 2401 2401 TITLE
-chr1 2501 2501 TITLE
-chr1 2601 2601 TITLE
-chr1 2701 2701 TITLE
-chr1 2801 2801 TITLE
-chr1 2901 2901 TITLE
-chr1 3001 3001 TITLE
-chr1 3101 3101 TITLE
-chr1 3201 3201 TITLE
-chr1 3301 3301 TITLE
-chr1 3401 3401 TITLE
-chr1 3501 3501 TITLE
-chr1 3601 3601 TITLE
-chr1 3701 3701 TITLE
-chr1 3801 3801 TITLE
-chr1 3901 3901 TITLE
-chr1 4001 4001 TITLE
-chr1 4101 4101 TITLE
-chr1 4201 4201 TITLE
-chr1 4301 4301 TITLE
-chr1 4401 4401 TITLE
-chr1 4501 4501 TITLE
-chr1 4601 4601 TITLE
-chr1 4701 4701 TITLE
-chr1 4801 4801 TITLE
-chr1 4901 4901 TITLE
diff --git a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz b/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz
deleted file mode 100644
index e8c7465..0000000
Binary files a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi
deleted file mode 100644
index 0f71973..0000000
Binary files a/src/test/resources/htsjdk/tribble/fakeVCF.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/gwas/smallp.gwas b/src/test/resources/htsjdk/tribble/gwas/smallp.gwas
deleted file mode 100644
index 0344a98..0000000
--- a/src/test/resources/htsjdk/tribble/gwas/smallp.gwas
+++ /dev/null
@@ -1,20 +0,0 @@
-SNP CHR BP P
-rs1233367 6 29622220 2.28235e-32
-rs29228 6 29623739 0.931148124684
-rs29228 6 29623739 1.70737e-89
-rs3130250 6 29625001 7.18775027174e-05
-rs2535260 6 29628883 0.00246256208471
-rs3129063 6 29645613 3.32185e-97
-rs387642 6 29645634 8.0006e-123
-rs385492 6 29649547 7.60380647336e-12
-rs3129045 6 29652576 4.16094765754e-07
-rs3129090 6 29664131 9.31671032411e-06
-rs3131886 6 29664452 1.85639e-21
-rs3129190 6 29669443 6.50202338003e-05
-rs6456993 6 29670536 5.71059057921e-05
-rs3129046 6 29670652 8.48154e-66
-rs3116788 6 29674197 2.1088206692e-07
-rs3131862 6 29675227 1.81790802347e-05
-rs1610584 6 29675615 7.97182551082e-08
-rs1610585 6 29675676 1.44138539548e-07
-rs9258126 6 29675791 0.000193925445894
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed b/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed
deleted file mode 100644
index b85a841..0000000
--- a/src/test/resources/htsjdk/tribble/index/chrY_Y4_small.bed
+++ /dev/null
@@ -1,5000 +0,0 @@
-track name="chrY_Y4 Sequences" description="Illumina bowtie-aligned reads - Y4" visibility=4 priority=10 itemRgb="On"
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770199 2770251 CATGGCCCGGGGCCCCAAGAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCA 0 + 2770199 2770251 255,0,0
-chrY 2770217 2770269 GAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGCCAAACT 0 + 2770217 2770269 255,0,0
-chrY 2770217 2770269 GAAGCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGCTGCTTGACAAATT 0 + 2770217 2770269 255,0,0
-chrY 2770220 2770272 GCNCTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAAC 0 + 2770220 2770272 255,0,0
-chrY 2770220 2770272 GCACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAAATAAC 0 + 2770220 2770272 255,0,0
-chrY 2770222 2770274 ACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGG 0 + 2770222 2770274 255,0,0
-chrY 2770222 2770274 ACTTAAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGG 0 + 2770222 2770274 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770226 2770278 AAAGCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGTGT 0 + 2770226 2770278 255,0,0
-chrY 2770229 2770281 GCGTGTTGCAGCGCCGAAGCATTGGATGCTTGACAAACTAACGGGGGTATT 0 + 2770229 2770281 255,0,0
-chrY 2772150 2772202 GGAATGTCTTCCTCTGATCGTCTTCCTCAGGAATAGGCTCAAGTATGCGTG 0 - 2772150 2772202 0,0,255
-chrY 2772150 2772202 GGAAGGTCTTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTG 0 - 2772150 2772202 0,0,255
-chrY 2772157 2772209 CTTCCTCTGATCGTCTTCCTCAGGAATCGACTCAAGTATGCGTTGACTGGA 0 + 2772157 2772209 255,0,0
-chrY 2772157 2772209 CCTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGA 0 + 2772157 2772209 255,0,0
-chrY 2772157 2772209 CTTCCTCTGATGGTCTTCCCCGGGAATAGACTCAAGTATGCGTTGACTGGA 0 + 2772157 2772209 255,0,0
-chrY 2772157 2772209 CTTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGG 0 + 2772157 2772209 255,0,0
-chrY 2772158 2772210 TTCCTCTGATCGGCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAG 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGGCTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGATTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772158 2772210 TTCCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAA 0 - 2772158 2772210 0,0,255
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772160 2772212 TCTCTGATCGTCTTCCTCAGGAATAGACTCAAGTATGCGTTGACTGGAGAT 0 + 2772160 2772212 255,0,0
-chrY 2772187 2772239 CTCAAGCATGCGTTGACTGGAGATGAGGAAAAGAAGATATGTATGCAACGT 0 + 2772187 2772239 255,0,0
-chrY 2772201 2772253 GACCGGAGATGAGGTAAAGAAGATATGTATGCAACGTTTCATCAAAATTGA 0 - 2772201 2772253 0,0,255
-chrY 2772214 2772266 GTAAAGAAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGATCGA 0 + 2772214 2772266 255,0,0
-chrY 2772214 2772266 GTAAAGACGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGA 0 + 2772214 2772266 255,0,0
-chrY 2772215 2772267 AAAAGAAGATATGTATGCAACGTTTCATCAAAATAGATGGCAAGGTTCGAG 0 - 2772215 2772267 0,0,255
-chrY 2772215 2772267 TAAAGAAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCTAG 0 - 2772215 2772267 0,0,255
-chrY 2772215 2772267 TAAAGAAGATATGTATGCAACGTTTCATCAAAATTGGTGGCAAGGTTCGAG 0 - 2772215 2772267 0,0,255
-chrY 2772215 2772267 TAAAGAGGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAG 0 - 2772215 2772267 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGACGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAATGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTAGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGAGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATAGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 + 2772220 2772272 255,0,0
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772220 2772272 AAGATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGAT 0 - 2772220 2772272 0,0,255
-chrY 2772223 2772275 ATATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTC 0 - 2772223 2772275 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772224 2772276 TATGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCA 0 - 2772224 2772276 0,0,255
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772226 2772278 TGTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACA 0 + 2772226 2772278 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAGGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGCCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 NTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGATTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772227 2772279 GTATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACAT 0 + 2772227 2772279 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAAGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGGCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772229 2772281 ATGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATAC 0 + 2772229 2772281 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772230 2772282 TGCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACC 0 + 2772230 2772282 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772231 2772283 GCAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCC 0 + 2772231 2772283 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGTATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGAGGATGTCACATACCAT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGCTGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCG 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCT 0 + 2772232 2772284 255,0,0
-chrY 2772232 2772284 CAACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCC 0 - 2772232 2772284 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772233 2772285 AACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTG 0 - 2772233 2772285 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATCGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGN 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772234 2772286 ACGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGC 0 - 2772234 2772286 0,0,255
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG 0 - 2772235 2772287 0,0,255
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG 0 - 2772235 2772287 0,0,255
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG 0 - 2772235 2772287 0,0,255
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCG 0 - 2772235 2772287 0,0,255
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT 0 + 2772235 2772287 255,0,0
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT 0 + 2772235 2772287 255,0,0
-chrY 2772235 2772287 CGTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCT 0 + 2772235 2772287 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772236 2772288 GTTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTG 0 + 2772236 2772288 255,0,0
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772237 2772289 TTTCATCAAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGG 0 - 2772237 2772289 0,0,255
-chrY 2772244 2772296 AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGAGTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772244 2772296 AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCGGGATTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772244 2772296 AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772244 2772296 AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772244 2772296 AAAAGTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGATTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772244 2772296 AAAATTGATGGCAAGGTTCGAGTGGATGTCACATACCCTGCTGGCTTCATG 0 + 2772244 2772296 255,0,0
-chrY 2772244 2772296 AAAATTGATGGCAAGGTTCGAGTGGATGTCACATGCCCTGCTGGATTCATG 0 - 2772244 2772296 0,0,255
-chrY 2772245 2772297 AAATTGATGGCAAGGTTCGAGTGGATGTCACGTACCCTGCTGGATTCATGG 0 + 2772245 2772297 255,0,0
-chrY 2772245 2772297 AAATTGATGGCAAGGTTTGAGTGGATGTCACATACCCTGCTGGATTCATGG 0 + 2772245 2772297 255,0,0
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTTGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 GTCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ANCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773689 2773741 ATCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAG 0 - 2773689 2773741 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCACGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 + 2773690 2773742 255,0,0
-chrY 2773690 2773742 TCAGCATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGG 0 - 2773690 2773742 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGAGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCG 0 - 2773694 2773746 0,0,255
-chrY 2773694 2773746 CATCGAGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCA 0 - 2773694 2773746 0,0,255
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTTTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773699 2773751 AGAAGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTG 0 + 2773699 2773751 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 GGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773702 2773754 AGACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTG 0 + 2773702 2773754 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773703 2773755 GACAGGTGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGT 0 + 2773703 2773755 255,0,0
-chrY 2773709 2773761 TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG 0 + 2773709 2773761 255,0,0
-chrY 2773709 2773761 TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG 0 + 2773709 2773761 255,0,0
-chrY 2773709 2773761 TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG 0 + 2773709 2773761 255,0,0
-chrY 2773709 2773761 TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG 0 + 2773709 2773761 255,0,0
-chrY 2773709 2773761 TGAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCG 0 + 2773709 2773761 255,0,0
-chrY 2773710 2773762 GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC 0 - 2773710 2773762 0,0,255
-chrY 2773710 2773762 GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC 0 - 2773710 2773762 0,0,255
-chrY 2773710 2773762 GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC 0 - 2773710 2773762 0,0,255
-chrY 2773710 2773762 GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC 0 - 2773710 2773762 0,0,255
-chrY 2773710 2773762 GAACATTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGC 0 - 2773710 2773762 0,0,255
-chrY 2773715 2773767 TTTCCNCCTGGTCTATGACACCAAGGGCCGTTTTGCNGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773715 2773767 TTTCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCAC 0 + 2773715 2773767 255,0,0
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCATTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCATTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773717 2773769 TCCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAG 0 - 2773717 2773769 0,0,255
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTTCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773718 2773770 CCGCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGT 0 + 2773718 2773770 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773720 2773772 GCCTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGG 0 + 2773720 2773772 255,0,0
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773722 2773774 CTGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAA 0 - 2773722 2773774 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773723 2773775 TGGTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAG 0 - 2773723 2773775 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACGAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773725 2773777 GTCTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAG 0 - 2773725 2773777 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773727 2773779 CTATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGC 0 - 2773727 2773779 0,0,255
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCNNGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCNA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTCCTGTTCACCGCATCCCAGTGGAAGAGCCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAA 0 + 2773729 2773781 255,0,0
-chrY 2773729 2773781 ATGACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGCCAA 0 + 2773729 2773781 255,0,0
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773731 2773783 GACACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAG 0 - 2773731 2773783 0,0,255
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2773733 2773785 CACCAAGGGCCGTTTTGCTGTTCACCGCATCACAGTGGAAGAGGCAAAGTA 0 + 2773733 2773785 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTATGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774693 2774745 TTCGCCCACAGGAGGTACTTTGTTTTAGATGATAGGAACTAGGCCTTGAAT 0 + 2774693 2774745 255,0,0
-chrY 2774811 2774863 AAATCAAAGCTGATGACTGGTTTCTGCTTTTGTATGGAATTTGGATCTCAA 0 - 2774811 2774863 0,0,255
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCCGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGACCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGNGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCTGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCCGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2774930 2774982 CTGGAGTGTTGTTAATACCTAGTACTGGCCCTACCAGATTGGCCAGCCAGG 0 + 2774930 2774982 255,0,0
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 TCGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCAGTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775049 2775101 ACGGTATTGGCCTTATCCTTGTGTAACAGGTGAGAGACTTGGGAAGTTTTG 0 - 2775049 2775101 0,0,255
-chrY 2775260 2775312 CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG 0 + 2775260 2775312 255,0,0
-chrY 2775260 2775312 CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG 0 + 2775260 2775312 255,0,0
-chrY 2775260 2775312 CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG 0 + 2775260 2775312 255,0,0
-chrY 2775260 2775312 CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG 0 + 2775260 2775312 255,0,0
-chrY 2775260 2775312 CAGGGAGCCTTTTCATAGTTTATTAATCCACCAGGTAGCATAGGTTAGTGG 0 + 2775260 2775312 255,0,0
-chrY 2775362 2775414 GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT 0 - 2775362 2775414 0,0,255
-chrY 2775362 2775414 GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT 0 - 2775362 2775414 0,0,255
-chrY 2775362 2775414 GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT 0 - 2775362 2775414 0,0,255
-chrY 2775362 2775414 GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT 0 - 2775362 2775414 0,0,255
-chrY 2775362 2775414 GTGGTATTTTGTGGGTCTTGGGAAAACAGCCTGATGGATTTCAGACATAAT 0 - 2775362 2775414 0,0,255
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2776928 2776980 GTGTAGTTATTTTTATCCCTGGCCCCCTCCCAACCTCCCTCATCTGGGTCT 0 + 2776928 2776980 255,0,0
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATGGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777048 2777100 ACTCATAGCAAGATAGGGGTTTTGGTTTTCCACTCCTGTGTTATTTCACTT 0 - 2777048 2777100 0,0,255
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777447 2777499 CTCAATCCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTA 0 + 2777447 2777499 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCGCATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777453 2777505 CCGAACTCTGATTCCTTTACCACATAGAGGCTGAGCCCCATACTAGGAACT 0 + 2777453 2777505 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777539 2777591 CATTGTTGTGCCTTTCTCACTTGCCAGTGGTGACTCAGAGGGCCCTACAGT 0 + 2777539 2777591 255,0,0
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGGCGCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGTGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777561 2777613 GCCAGGGGTGACTCAGAGGGCCCTACAGTCTTTGGGAGTCTTGGGGCTGGA 0 - 2777561 2777613 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777581 2777633 CCCTACAGTCTTTGGGAGTCTTGGGGCTGGAGGACAGAAGGTGATGGGGTG 0 - 2777581 2777633 0,0,255
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTAAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTTACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777631 2777683 GTCACATCTTTAAAATCTGAAGACAGTCTTTTCAGCTGTGGGACAGAGGAA 0 + 2777631 2777683 255,0,0
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAGTTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 CGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGCGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777667 2777719 TGTGGGACAGAGGAAAAATAATTGGTTTTCTGCAGATGTTGAGGCTACCCC 0 - 2777667 2777719 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2777745 2777797 AGTTCCCCTCATGATATGGCCAGTCTTACCCTTAGTGAACCTCTAGTTTCC 0 - 2777745 2777797 0,0,255
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTATTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778418 2778470 AAAGTTTTTACTTGTTTTGTTTTTGCTGTCTTTCTCCTGACTGTCAGCAGT 0 + 2778418 2778470 255,0,0
-chrY 2778697 2778749 TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA 0 + 2778697 2778749 255,0,0
-chrY 2778697 2778749 TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA 0 + 2778697 2778749 255,0,0
-chrY 2778697 2778749 TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA 0 + 2778697 2778749 255,0,0
-chrY 2778697 2778749 TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA 0 + 2778697 2778749 255,0,0
-chrY 2778697 2778749 TTAGAATCACCCAAGTAGGTTCAGGATGTCACATACAAAAAATGTGGAGGA 0 + 2778697 2778749 255,0,0
-chrY 2778798 2778850 TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC 0 - 2778798 2778850 0,0,255
-chrY 2778798 2778850 TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC 0 - 2778798 2778850 0,0,255
-chrY 2778798 2778850 TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC 0 - 2778798 2778850 0,0,255
-chrY 2778798 2778850 TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC 0 - 2778798 2778850 0,0,255
-chrY 2778798 2778850 TCATGAAGTTGGAGGGGCAGAGGTAGAGAGCTTGCATTTCAGAGTTCTTTC 0 - 2778798 2778850 0,0,255
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779169 2779221 CCGCGCCCGGCCCAGAGGGTTTCTTATATCTAGCGTGGAGTAGAGCTGGAG 0 + 2779169 2779221 255,0,0
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779277 2779329 GTGGTCACTGGATTGGTACTGATGATTGGATAGCACATTTTAAAGGTAAAG 0 - 2779277 2779329 0,0,255
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779315 2779367 TTTAAAGGTAAAGTGCAAGTTACTCTTTTAAATGAGGATGGAAGAGTGAAG 0 + 2779315 2779367 255,0,0
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAAGGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTGTGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779428 2779480 TTTCTTATGGTTTGGTCCCAGGGCTTCGGGAGGTATAAGGGGAAAATGTGT 0 - 2779428 2779480 0,0,255
-chrY 2779683 2779735 ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG 0 + 2779683 2779735 255,0,0
-chrY 2779683 2779735 ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG 0 + 2779683 2779735 255,0,0
-chrY 2779683 2779735 ATCCCTCTGTGCCCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTG 0 + 2779683 2779735 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779695 2779747 CCTTGTTATATCATTTATTGTCTGAGGCAGTTCTGCTTGGCTGCTTAGTGA 0 + 2779695 2779747 255,0,0
-chrY 2779735 2779787 CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA 0 - 2779735 2779787 0,0,255
-chrY 2779735 2779787 CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA 0 - 2779735 2779787 0,0,255
-chrY 2779735 2779787 CTGCTTAGTGAACCTCCTTTCAGTACCCTGGACACTCTGTGTCTGTGTCCA 0 - 2779735 2779787 0,0,255
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779789 2779841 TCTCCCTCTGCCTCATCTCACGTAAGTATTTTGCCTACTGTAGCACCACAG 0 + 2779789 2779841 255,0,0
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779810 2779862 GTAAGTATTTTGCCTACTGTAGCACCACAGCTTGATGATTTTCTGTTCTGG 0 - 2779810 2779862 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2779899 2779951 TCTGTCTTCTCTTATGGGGATGTTTATACCTGATTGGAAGGAATGTGCCAA 0 - 2779899 2779951 0,0,255
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780254 2780306 ATTGTCCTTTAGGGCCAAGTTCTGGACCCAAAGGCATTCCTAAAGTTAATT 0 + 2780254 2780306 255,0,0
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780385 2780437 TCAGCCTAATTGTCCCTTGAAGTGCTTCCAACTTTTCTTTTAAGAGCTTTA 0 - 2780385 2780437 0,0,255
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAACGCTGGCAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780563 2780615 GCAGCTTTCAATTCTTTGCTTAACTCACTGGCCAGGAAAGCTGGAAATGAT 0 + 2780563 2780615 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGACCACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780640 2780692 AAATATGAGGTGGTGGTGGCAAACAAACTGAACACTCATTGGAGAATGCCT 0 + 2780640 2780692 255,0,0
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2780701 2780753 GTCAACTGTGAAGTTTTGATTTGAAGAGCGTGCTCTCATTAGATTGACTGC 0 - 2780701 2780753 0,0,255
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781475 2781527 CAAAGCTGAAAGAAAACCCACTTTGTCACTTCTGAGCGGTGACAGTCCATG 0 + 2781475 2781527 255,0,0
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTGGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781572 2781624 TATGTTTGTTTGAGATTACATAGTGTACCATTTGAATCTCCTGAAAATTGC 0 - 2781572 2781624 0,0,255
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781670 2781722 CTTGGTATGAGACATTTTGAACTCCTCCTGCTGATAGATGTCACGAGCAAC 0 + 2781670 2781722 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781743 2781795 AAGGAATAAAGCAAGTAGTTAATGGGTTGTGCCATTTAAAAATGAGATGAG 0 + 2781743 2781795 255,0,0
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781797 2781849 GAGCAGCATTGTGTACAGAAAGCATGTAGCTGGCCGAGACAGCTGTTTTAC 0 - 2781797 2781849 0,0,255
-chrY 2781864 2781916 AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA 0 - 2781864 2781916 0,0,255
-chrY 2781864 2781916 AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA 0 - 2781864 2781916 0,0,255
-chrY 2781864 2781916 AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA 0 - 2781864 2781916 0,0,255
-chrY 2781864 2781916 AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA 0 - 2781864 2781916 0,0,255
-chrY 2781864 2781916 AGCCTCATGATTTTTTTTTTTTTTGAGACAGAGTTTCACTCTTGTTGCCCA 0 - 2781864 2781916 0,0,255
-chrY 2781973 2782025 CGACTTTCCTGCCTCAGCCTCCCGAGTAGGTGGGATTACAGGCTTGTGCCC 0 + 2781973 2782025 255,0,0
-chrY 2782189 2782241 GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC 0 - 2782189 2782241 0,0,255
-chrY 2782189 2782241 GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC 0 - 2782189 2782241 0,0,255
-chrY 2782189 2782241 GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC 0 - 2782189 2782241 0,0,255
-chrY 2782189 2782241 GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC 0 - 2782189 2782241 0,0,255
-chrY 2782189 2782241 GTTCTTAGTAGTGGTAGAGTTAAGTTTGTCTCTGGGGCTCTTTGTTACCAC 0 - 2782189 2782241 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCCGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782506 2782558 GTTTTTCCCAAGAGCACTCCTTCTCTGACCGAGGAAATGCTGGAAATCGAT 0 - 2782506 2782558 0,0,255
-chrY 2782528 2782580 CTCTGACCGAGGAAATGCTGGAAATCGATGGGATAAGTAATGTCTGGGTGA 0 + 2782528 2782580 255,0,0
-chrY 2782537 2782589 AGGAAATGCTGGAAATCGATGGGATAAGTAATGTCTGGGTGACTGCTTTAG 0 - 2782537 2782589 0,0,255
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782582 2782634 CTTTAGGCTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTT 0 + 2782582 2782634 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782589 2782641 CTGGCTTTGTGTTTACATATTGAATTGATTTTCCTTGCTGTGTTTATAGTA 0 + 2782589 2782641 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 ACAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782632 2782684 GCAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGA 0 + 2782632 2782684 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGCACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782633 2782685 CAAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAA 0 + 2782633 2782685 255,0,0
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGTAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782634 2782686 AAAGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTCGGAGTGAAGGGAAT 0 - 2782634 2782686 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTCGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782636 2782688 AGTACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCC 0 - 2782636 2782688 0,0,255
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782638 2782690 TACAAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCT 0 + 2782638 2782690 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782641 2782693 AAGTTGTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCAC 0 + 2782641 2782693 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGTTTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782646 2782698 GTGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGT 0 + 2782646 2782698 255,0,0
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782647 2782699 TGCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTG 0 - 2782647 2782699 0,0,255
-chrY 2782648 2782700 GCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGA 0 + 2782648 2782700 255,0,0
-chrY 2782648 2782700 GCAAAGTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGA 0 + 2782648 2782700 255,0,0
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782653 2782705 GTGAGGAAGATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCAT 0 - 2782653 2782705 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782661 2782713 GATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCG 0 - 2782661 2782713 0,0,255
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACCCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGAGTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782662 2782714 ATTACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGA 0 + 2782662 2782714 255,0,0
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782664 2782716 TACTGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAAC 0 - 2782664 2782716 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782667 2782719 TGTGGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCAC 0 - 2782667 2782719 0,0,255
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 + 2782670 2782722 255,0,0
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 + 2782670 2782722 255,0,0
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 - 2782670 2782722 0,0,255
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 - 2782670 2782722 0,0,255
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 - 2782670 2782722 0,0,255
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 - 2782670 2782722 0,0,255
-chrY 2782670 2782722 GGGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCG 0 - 2782670 2782722 0,0,255
-chrY 2782671 2782723 GATCTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGCGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782671 2782723 GGAGTGAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGC 0 - 2782671 2782723 0,0,255
-chrY 2782676 2782728 GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC 0 + 2782676 2782728 255,0,0
-chrY 2782676 2782728 GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC 0 + 2782676 2782728 255,0,0
-chrY 2782676 2782728 GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC 0 + 2782676 2782728 255,0,0
-chrY 2782676 2782728 GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC 0 - 2782676 2782728 0,0,255
-chrY 2782676 2782728 GAAGGGAATCCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCC 0 + 2782676 2782728 255,0,0
-chrY 2782685 2782737 CCCTCACCTGGTGACTCATCATGCTCGAACCATCCGCTACCCAGATCCTGT 0 + 2782685 2782737 255,0,0
-chrY 2782685 2782737 CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT 0 + 2782685 2782737 255,0,0
-chrY 2782685 2782737 CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT 0 + 2782685 2782737 255,0,0
-chrY 2782685 2782737 CCCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTACCCAGATCCTGT 0 + 2782685 2782737 255,0,0
-chrY 2782686 2782738 CCTCACCTGGTGACTCATGATGCTCGAACCATCCGCTATCCAGATCCTGTC 0 + 2782686 2782738 255,0,0
-chrY 2782690 2782742 CCCTGGTGACTCATGATGCTCGACCCATCCGCTACCCAGATCCTGTCATCA 0 - 2782690 2782742 0,0,255
-chrY 2782710 2782762 CAACCCATCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG 0 - 2782710 2782762 0,0,255
-chrY 2782710 2782762 CAACCCATCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG 0 - 2782710 2782762 0,0,255
-chrY 2782710 2782762 CCACCCACCCGCTACCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG 0 - 2782710 2782762 0,0,255
-chrY 2782710 2782762 AGACCCATCCGCTCCCCAGATCCTGTCATCAAGGTGAACGATACTGTGCAG 0 - 2782710 2782762 0,0,255
-chrY 2782716 2782768 ATCCGCTACCCAGATCCTGTCATCAAGGTGAACGAAACTGTGCAGATTTAT 0 + 2782716 2782768 255,0,0
-chrY 2782718 2782770 CCGCCACCCAGATCCTGTCATCAAGGTGAACGATACCGTGCAGCTTGATTT 0 + 2782718 2782770 255,0,0
-chrY 2782755 2782807 GTGCAGATTGAATTAGGGGCTGGCAAGATAATCAACTTTATCAAATTTGAT 0 - 2782755 2782807 0,0,255
-chrY 2782755 2782807 GTGTAGATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGAT 0 - 2782755 2782807 0,0,255
-chrY 2782756 2782808 TGCAGATTGATTTAGGGACTGGCAAGATAAACAACTTTATCAAATTTGATA 0 + 2782756 2782808 255,0,0
-chrY 2782760 2782812 GATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAAGTTGATACAGG 0 - 2782760 2782812 0,0,255
-chrY 2782760 2782812 GATTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACTGG 0 - 2782760 2782812 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782762 2782814 TTGATTTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCG 0 - 2782762 2782814 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2782767 2782819 TTAGGGACTGGCAAGATAATCAACTTTATCAAATTTGATACAGGCAATTTG 0 - 2782767 2782819 0,0,255
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTGGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2789679 2789731 GTTTCATTCTTGTTGCCTAGGCTGGACTGCAGTGGTGACATCTCTGCTCAC 0 + 2789679 2789731 255,0,0
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2790238 2790290 GTGCCACCATGCCTAGCTGTGATCCACTGCAGTAGAAAATTTTGTTTTCAC 0 - 2790238 2790290 0,0,255
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793126 2793178 GCAATTTGTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGA 0 + 2793126 2793178 255,0,0
-chrY 2793133 2793185 GTGTATGGTGATTGGTGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAA 0 + 2793133 2793185 255,0,0
-chrY 2793144 2793196 TGTGTGGGGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC 0 - 2793144 2793196 0,0,255
-chrY 2793144 2793196 TTGGGGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC 0 - 2793144 2793196 0,0,255
-chrY 2793144 2793196 TGGGTGGAGCCAACCTCGGTCGTGTTGGTGTGATCACCAACAGGGAAAGAC 0 - 2793144 2793196 0,0,255
-chrY 2793150 2793202 GAGCCTGCCTCGGTCGTGTTGGTGTGATCTCCAACAGGGAAAGACATCCTG 0 - 2793150 2793202 0,0,255
-chrY 2793150 2793202 GAGCCAACCTCGGTCGTGTTGGTGTGATCAACAAAAGGGAAAGACATCCTG 0 + 2793150 2793202 255,0,0
-chrY 2793150 2793202 GAGCCAACCTCGGTCGCGTTGGTGTGATCACCAACAGGGAACGACATCCTG 0 + 2793150 2793202 255,0,0
-chrY 2793159 2793211 TCGGTCGTGTTGGTGTGATCCCCAACAGGGAAAGACATCCTGGTTCTTTTG 0 - 2793159 2793211 0,0,255
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGATCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793170 2793222 GGTGTGATCACCAACAGGGAAAGACAACCTGGTTCTTTTGATGTGGTGCAT 0 + 2793170 2793222 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCGCCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 - 2793173 2793225 0,0,255
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793173 2793225 GTGATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTG 0 + 2793173 2793225 255,0,0
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACGGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAN 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793175 2793227 GATCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAA 0 - 2793175 2793227 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATATGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793177 2793229 TCACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGG 0 - 2793177 2793229 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 - 2793178 2793230 0,0,255
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCANGTGANGGA 0 + 2793178 2793230 255,0,0
-chrY 2793178 2793230 CACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGA 0 + 2793178 2793230 255,0,0
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATACTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793179 2793231 ACCAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGAT 0 - 2793179 2793231 0,0,255
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGCAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 NAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793181 2793233 CAACAGGGAAAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGC 0 + 2793181 2793233 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793190 2793242 AAGACATCCTGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAA 0 + 2793190 2793242 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793199 2793251 TGGTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGC 0 + 2793199 2793251 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GCTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGATGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 + 2793201 2793253 255,0,0
-chrY 2793201 2793253 GTTCTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCA 0 - 2793201 2793253 0,0,255
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCAAGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793204 2793256 CTTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGA 0 + 2793204 2793256 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATCGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 - 2793205 2793257 0,0,255
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 - 2793205 2793257 0,0,255
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 - 2793205 2793257 0,0,255
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCACTGGCAACAGCTTTGCCACGCG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCAACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793205 2793257 TTTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAG 0 + 2793205 2793257 255,0,0
-chrY 2793206 2793258 TTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGG 0 + 2793206 2793258 255,0,0
-chrY 2793206 2793258 TTTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGG 0 + 2793206 2793258 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TCGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGACAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793207 2793259 TTGATGTGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGC 0 + 2793207 2793259 255,0,0
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793213 2793265 TGGTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCA 0 - 2793213 2793265 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGTCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAATAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 + 2793215 2793267 255,0,0
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793215 2793267 GTGCATGTGAAGGATGCCAATGGCAACAGCTTTGCCACGAGGCTTTCCAAC 0 - 2793215 2793267 0,0,255
-chrY 2793221 2793273 GTGAAGGATGCCAATGAAAACAGCTTTGCCACGAGGATTTCCAACATTTTT 0 + 2793221 2793273 255,0,0
-chrY 2793223 2793275 GAAGGATGCCAATGGCAACAGCTTTGCCACGGGGCTTTCCAACATTTTTGT 0 + 2793223 2793275 255,0,0
-chrY 2793231 2793283 CCAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATCGGCA 0 - 2793231 2793283 0,0,255
-chrY 2793232 2793284 CAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAN 0 - 2793232 2793284 0,0,255
-chrY 2793232 2793284 CAATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCGTTGGCAA 0 - 2793232 2793284 0,0,255
-chrY 2793232 2793284 CAATGGCAACAGCTTTGCCACGAGGCTTTCGAACATTTTTGTCATTGGCAA 0 - 2793232 2793284 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGCCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793233 2793285 AATGGCAACAGCTTTGCCACGAGGCTTTCCAACATTTTTGTCATTGGCAAC 0 - 2793233 2793285 0,0,255
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793336 2793388 ATAAAGACCTGCATCCACTACTGGTGTTTGTCTGTTTGTTCTTTTTCCAGT 0 + 2793336 2793388 255,0,0
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGAGCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAACCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793447 2793499 AGATCTAGAGCCTTACACCTGCCTCTTCAGGTGGTCTGTGTGAGATGCCAG 0 - 2793447 2793499 0,0,255
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAGGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793566 2793618 GCTGGATTAAGGTCACTGGCTCCAATCCTGGTAGTGCTGTGCCCCCTTAAT 0 + 2793566 2793618 255,0,0
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793684 2793736 ATGGAGATTGATGCAAGGGGGCTATGAGTGAGTTGCTAATTTGAGAATAAG 0 - 2793684 2793736 0,0,255
-chrY 2793788 2793840 CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG 0 + 2793788 2793840 255,0,0
-chrY 2793788 2793840 CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG 0 + 2793788 2793840 255,0,0
-chrY 2793788 2793840 CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG 0 + 2793788 2793840 255,0,0
-chrY 2793788 2793840 CTCTGGGATCTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATG 0 + 2793788 2793840 255,0,0
-chrY 2793797 2793849 CTTTTGAGACCTTTTCAGTGAAGGAGCACCTCTGAAATCATGCAGTATCCT 0 + 2793797 2793849 255,0,0
-chrY 2793868 2793920 CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT 0 + 2793868 2793920 255,0,0
-chrY 2793868 2793920 CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT 0 + 2793868 2793920 255,0,0
-chrY 2793868 2793920 CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT 0 + 2793868 2793920 255,0,0
-chrY 2793868 2793920 CAAGACTTAAGGAAAGGGCAACGGACATAATTGAAAAGGCTTTTTATTTTT 0 + 2793868 2793920 255,0,0
-chrY 2793894 2793946 ATAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGG 0 - 2793894 2793946 0,0,255
-chrY 2793895 2793947 TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA 0 - 2793895 2793947 0,0,255
-chrY 2793895 2793947 TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA 0 - 2793895 2793947 0,0,255
-chrY 2793895 2793947 TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA 0 - 2793895 2793947 0,0,255
-chrY 2793895 2793947 TAATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGA 0 - 2793895 2793947 0,0,255
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2793897 2793949 ATTGAAAAGGCTTTTTATTTTTATTTATTTATTTATTTTTTGAGACGGAAT 0 + 2793897 2793949 255,0,0
-chrY 2794051 2794103 CTGGGACTAAGGCGCCCGCCACCAGACCTGGCTAATTTCTTTTTGTATTTT 0 + 2794051 2794103 255,0,0
-chrY 2794051 2794103 CTGGGACTAAGGCGCCCGCCACCAGACCTGGCTAATTTCTTTTTGTATTTT 0 + 2794051 2794103 255,0,0
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATATCCTGACCTGGTGATCAACCAGCTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794124 2794176 TGTTAGCCAGGATGGTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGC 0 - 2794124 2794176 0,0,255
-chrY 2794138 2794190 GTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGCCTCCCAAAGTGCAG 0 - 2794138 2794190 0,0,255
-chrY 2794138 2794190 GTTTCGATCTCCTGACCTGGTGATCACCCAACTTGGCCTCCCAAAGTGCAG 0 - 2794138 2794190 0,0,255
-chrY 2794216 2794268 GGCCAACTGAAAAGCTTTTCATCAAGCTATTCAGCCCCGGGAGCAGCATCT 0 + 2794216 2794268 255,0,0
-chrY 2794216 2794268 GGCCAACTGAAAAGCTTTTCATCAAGCTATTCAGCCCCGGGAGCAGCATCT 0 + 2794216 2794268 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794297 2794349 TTTGAGAGAAGTGGTACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTG 0 + 2794297 2794349 255,0,0
-chrY 2794312 2794364 ACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTGCCACTCAGAAGCTCT 0 - 2794312 2794364 0,0,255
-chrY 2794312 2794364 ACAGAGGCGAAGCCTGCTGTTGTTTTTTTGGCTGTGCCACTCAGAAGCTCT 0 - 2794312 2794364 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794400 2794452 AAACCTCAGTTTATACCTTTGAAAGCAGGGGATCAGGGAAGTGAGTAAATG 0 - 2794400 2794452 0,0,255
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTAAGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794517 2794569 CTGAAGTTAGTGGCCTTGCCTTTAAAGATGCTTATGAAAAACTTGTTGGCT 0 + 2794517 2794569 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794573 2794625 CTTCACATAAAATAGAAGCAGGAAGACCTTTATTTAGCAGCTCAGCAGTGA 0 + 2794573 2794625 255,0,0
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794627 2794679 GTGGGAGGGACTGTGAGAGGCAGATAACCTCTCAGGAGACATGTATAAGGA 0 - 2794627 2794679 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTGTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794667 2794719 ATGTATAAGGAAGTGTTTATTTTGTTTTAGATTTTGTTGGGTGGTGGTCTG 0 - 2794667 2794719 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794704 2794756 TGGGTGGTGGTCTGTTAGCTGGCTATTAATGTGAAGGAAGGTATGAGGCAT 0 - 2794704 2794756 0,0,255
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794727 2794779 TATTAATGTGAAGGAAGGTATGAGGCATGTGTGTTTTGGTGGGATGTTGTT 0 + 2794727 2794779 255,0,0
-chrY 2794759 2794811 GTTTTGGTGGGATGTTGTTTTTCTCTCCTCCCTTTCTTTCTGTACTTACTT 0 + 2794759 2794811 255,0,0
-chrY 2794759 2794811 GTTTTGGTGGGATGTTGTTTTTCTCTCCTCCCTTTCTTTCTGTACTTACTT 0 + 2794759 2794811 255,0,0
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794845 2794897 GATTTCCCTGCCCAGGGGAAAGGGCATTCGACTTACTGTCTCTGAAGAGAG 0 - 2794845 2794897 0,0,255
-chrY 2794852 2794904 TTGCCCAGGGGAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAG 0 - 2794852 2794904 0,0,255
-chrY 2794858 2794910 AGGGGAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTA 0 - 2794858 2794910 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794862 2794914 GAAAGGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCA 0 - 2794862 2794914 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794866 2794918 GGGCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAA 0 - 2794866 2794918 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794868 2794920 GCATTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAAC 0 - 2794868 2794920 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794871 2794923 TTCGACTTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGA 0 - 2794871 2794923 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794877 2794929 TTACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTG 0 - 2794877 2794929 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794878 2794930 TACTGTTGCTGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGG 0 - 2794878 2794930 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 GGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794887 2794939 TGAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGC 0 - 2794887 2794939 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAAAGGTTGGCCACCAAACAAAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794888 2794940 GAAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCA 0 - 2794888 2794940 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794889 2794941 AAGAGAGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAG 0 - 2794889 2794941 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCA 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794894 2794946 AGAGATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCC 0 - 2794894 2794946 0,0,255
-chrY 2794897 2794949 GATAAGAGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCG 0 - 2794897 2794949 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794903 2794955 AGGCTGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTT 0 - 2794903 2794955 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794907 2794959 TGGCCACCAAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTT 0 - 2794907 2794959 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGAAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794915 2794967 AAACAGAGCAGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCA 0 - 2794915 2794967 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATGGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794924 2794976 AGTGGCTAAATTGCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAAC 0 - 2794924 2794976 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTCTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GNAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCG 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2794936 2794988 GCAGTAGCAGCATATCTTTTTTTCTTTGCACAAATAAACAGTGAATTCTCA 0 - 2794936 2794988 0,0,255
-chrY 2857835 2857887 TTCAACGTGAAATTCTAAGACAAAACTCATAGGCTGGCCAGCATGTGAGAA 0 + 2857835 2857887 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTCGCTCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863491 2863543 CCCGCGTGCCCCCGCGGCCGCGGGGCCTAGTGCGCGCGCAGTAACCTGTTT 0 + 2863491 2863543 255,0,0
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TGTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCGCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCGGGTCGGCGTCCCGGAGGGCGCCCTCCCGCGCTAGGCCGGAC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTTGTGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863539 2863591 TTGGGGGCCTGGTCGGCGTCCCGTAGGGCGCCCTCCCGCGCTAGGCCGGCC 0 - 2863539 2863591 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CGGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2863606 2863658 CCGAACAGGCCCCGAGGAGGCCGCAGTTAGGCCTAGTGATTATCCAGTTGC 0 - 2863606 2863658 0,0,255
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAC 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865129 2865181 CACACCTCAGTTTATGCTGAGCTCTGGCTGCAGCTGTTACAAAAGTTTAAA 0 + 2865129 2865181 255,0,0
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865241 2865293 CAAGAAGGTAGCTGTTTTTTGGCCAGGTGCGGTGACTCACGCCTGTAATCC 0 - 2865241 2865293 0,0,255
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865316 2865368 GCGGATCACCCGAGGTCAGGAGTTCGAATCCAGCTCGAGACCAGCTGGAGA 0 + 2865316 2865368 255,0,0
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCGGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2865423 2865475 CGGCGCGCGCCTGTAATCCCAGGTACTTTGAAGGCGGAGGTTGCAGTGAGC 0 - 2865423 2865475 0,0,255
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866382 2866434 CTTGCTAAGGGGTCAGCATAAACTGTAGAGGTAGTTGCCTTATATCTTGAC 0 + 2866382 2866434 255,0,0
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2866472 2866524 CAGTACAGCAGCTGTAGATGTTCCAGTACATCAGCAGTGGATGTGCAAAAA 0 - 2866472 2866524 0,0,255
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871012 2871064 CAAAAAGTTATACTTACCAGTTGTTGTAATTTATAATAGAAATCCTATTGA 0 + 2871012 2871064 255,0,0
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2871111 2871163 GAGATGTATAAATCTTCATATTTTAGCACTTCTAAAATCTGAATGTATTTT 0 - 2871111 2871163 0,0,255
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTGAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876103 2876155 GTGAAACAACTGAAACTAGAGAATAAGGAATTAAAAGATTAAAAAATAAGT 0 + 2876103 2876155 255,0,0
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2876229 2876281 CTTGGTGGTTTGACACCATAAATGAAAGATCTTCTTTTGCCATAGTGTGTC 0 - 2876229 2876281 0,0,255
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGNNACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880278 2880330 TTTTATTAGAACTAATGAAATTGCTGTTTTTAGGAAAATTGGAAGGTCACT 0 + 2880278 2880330 255,0,0
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 ATAAGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2880395 2880447 TTATGCAGAGAAGATTAGTTTGCATTTATAATTTTATAATTACATTTTTTT 0 - 2880395 2880447 0,0,255
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2881985 2882037 ATGAATTTGAATTGCAGCCACAAGAGCCAAACTCATTTTTTGATGGAATAG 0 + 2881985 2882037 255,0,0
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2889166 2889218 CAGTTTTTGTTTCTAATATTGTGGATTCTGACATAACTGTGCATAACTTTG 0 - 2889166 2889218 0,0,255
-chrY 2890047 2890099 TTTCCCCTTTTTTTCTACCTTATTGTCCGTTTTCTCTTTAAGTAATGATTT 0 + 2890047 2890099 255,0,0
-chrY 2890134 2890186 AAATCTAGTGAATTCTCTGAAATACAGTGGTCTCACCAAGACCATCAACCG 0 - 2890134 2890186 0,0,255
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898706 2898758 CAGACATCCTTCTCATTTCCTCACCTCTCCCTTTCGTAGCTGATTGGCTTG 0 + 2898706 2898758 255,0,0
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2898850 2898902 TAGGTTAATTTGTGAATTCTTTCTTGCCCCTGCCTTAAATTGTAATCTCAC 0 - 2898850 2898902 0,0,255
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2902594 2902646 TTGTATTCAGAAGTACTGAATGTTAGGTAATGCTCATAAAATATATTAGGA 0 + 2902594 2902646 255,0,0
-chrY 2904753 2904805 GAGAGGAGGATGCTGCTGTTGCAGCAGCAGCAGCTGCTGTGCATGAGCAGC 0 + 2904753 2904805 255,0,0
-chrY 2904753 2904805 GAGAGGAGGATGCTGCTGTTGCAGCAGCAGCAGCTGCTGTGCCTGAGCCGC 0 + 2904753 2904805 255,0,0
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907254 2907306 TCATATTTGTGTGGAGTGTGGTAAAGGTTTCCGACACCCGTCGGAACTGAG 0 - 2907254 2907306 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCCTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2907629 2907681 CAGGCCTTCAGAACTTAAGAAACATGTGGCTGTCCACAAAGGTAAAAAAAT 0 - 2907629 2907681 0,0,255
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2908968 2909020 TTTGAGGTGAATAATTAAAAAGAAAAGGACATTAGGAGAGTGAAAATCTTC 0 + 2908968 2909020 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCGAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909010 2909062 AAAATCTTCTCTTCAAATAATCTTTGATAGATAAAAATGGAAGGTAAGATG 0 + 2909010 2909062 255,0,0
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909109 2909161 TTTCTGGAAAGCTATTTCAGACATAGATTTCATAGTATTTTTCTGAGAATC 0 - 2909109 2909161 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTCGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909135 2909187 ATTTCATAGTATTTTTCTGAGAATCCTGTGAAGGAACGCTGTCTCTTTGCA 0 - 2909135 2909187 0,0,255
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909455 2909507 TATAAATTGAATTCATATAATTAAAAAGAATTTGGTTAATAAGAATTTGGA 0 + 2909455 2909507 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTTTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909485 2909537 TTTGGTTAATAAGAATTTGGAGAATGGAAAATACATTTCTAGGTTCCTTAA 0 + 2909485 2909537 255,0,0
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCNTCTNGCTTTAGTATGGTAGTGCTTCATNCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909596 2909648 ACATTACAGCTACCTTCTAGCTTTAGTATGGTAGTGCTTCATTCAACTTTT 0 - 2909596 2909648 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGCTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 ATAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909618 2909670 TTAGTATGGTAGTGCTTCATTCAACTTTTGCTGTCAGGTTTTTATTTTCAC 0 - 2909618 2909670 0,0,255
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909655 2909707 GTTTTTATTTTCACCTTTTTCTGTGCCACCAATTCAAAAGTTATAGGATTA 0 + 2909655 2909707 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909735 2909787 CAGCCTCTGAAATGTTAGATTAATTTGATCTAGTTCTAAAGTGCTTTAGTC 0 + 2909735 2909787 255,0,0
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909760 2909812 TGATCTAGTTCTAAAGTGCTTTAGTCATATATGAATTTAAACCTAGTACCA 0 - 2909760 2909812 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2909842 2909894 GTTAGGCCTTCTTAGCCTTTATACATGTCCCTACCTGATTTTTACTGTCCG 0 - 2909842 2909894 0,0,255
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGNN 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATACTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910075 2910127 AAAAAACGTGACACTTTACATATTTCATATTTTTCATATAGTCTGGAGGTA 0 + 2910075 2910127 255,0,0
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910182 2910234 ATTTGGTCAAGTAAATATAGAACATTTGTATAAAGAAAGAAATGAAATTGT 0 - 2910182 2910234 0,0,255
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGGTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTACAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910224 2910276 TGAAATTGTGCTTAATGTTATATACTGTTATTATTTGCAGGCTGGTTTTAA 0 + 2910224 2910276 255,0,0
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910330 2910382 AGAGGTACAAAATCTTACAAGGACATAAATTATTATTTGGTTGAAAAATAG 0 - 2910330 2910382 0,0,255
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTCTGAAGCATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 2910400 2910452 CCCTTCCTCTGTACAAATTGTAAAATACTTAAAATAACTATGAAGAATTCA 0 + 2910400 2910452 255,0,0
-chrY 3547861 3547913 CACACCTGGCTAATTTTTTATATTTTTAGTGGAGACAGGGCTCCACCGTGC 0 - 3547861 3547913 0,0,255
-chrY 3547861 3547913 CACACCTGGCTAATTTTTTATATTTTTAGTGGAGACAGGGCTCCACCGTGC 0 - 3547861 3547913 0,0,255
diff --git a/src/test/resources/htsjdk/tribble/large.txt b/src/test/resources/htsjdk/tribble/large.txt
deleted file mode 100644
index 5f4e1d4..0000000
--- a/src/test/resources/htsjdk/tribble/large.txt
+++ /dev/null
@@ -1,165 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES down [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsampli [...]
-##FILTER=<ID=Indel_FS,Description="FS>200.0">
-##FILTER=<ID=Indel_InbreedingCoeff,Description="InbreedingCoeff<-0.8">
-##FILTER=<ID=Indel_QD,Description="QD<2.0">
-##FILTER=<ID=Indel_ReadPosRankSum,Description="ReadPosRankSum<-20.0">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheSNP98.50to98.60,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -0.9687 <= x < -0.8298">
-##FILTER=<ID=VQSRTrancheSNP98.60to98.80,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.2821 <= x < -0.9687">
-##FILTER=<ID=VQSRTrancheSNP98.80to98.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.5011 <= x < -1.2821">
-##FILTER=<ID=VQSRTrancheSNP98.90to99.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -1.7494 <= x < -1.5011">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.30,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -2.9782 <= x < -1.7494">
-##FILTER=<ID=VQSRTrancheSNP99.30to99.50,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -4.7694 <= x < -2.9782">
-##FILTER=<ID=VQSRTrancheSNP99.50to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -15.7985 <= x < -4.7694">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -4789.109">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -4789.109 <= x < -15.7985">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SNPEFF_AMINO_ACID_CHANGE,Number=1,Type=String,Description="Old/New amino acid for the highest-impact effect resulting from the current variant (in HGVS style)">
-##INFO=<ID=SNPEFF_CODON_CHANGE,Number=1,Type=String,Description="Old/New codon for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_EFFECT,Number=1,Type=String,Description="The highest-impact effect resulting from the current variant (or one of the highest-impact effects, if there is a tie)">
-##INFO=<ID=SNPEFF_EXON_ID,Number=1,Type=String,Description="Exon ID for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_FUNCTIONAL_CLASS,Number=1,Type=String,Description="Functional class of the highest-impact effect resulting from the current variant: [NONE, SILENT, MISSENSE, NONSENSE]">
-##INFO=<ID=SNPEFF_GENE_BIOTYPE,Number=1,Type=String,Description="Gene biotype for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_GENE_NAME,Number=1,Type=String,Description="Gene name for the highest-impact effect resulting from the current variant">
-##INFO=<ID=SNPEFF_IMPACT,Number=1,Type=String,Description="Impact of the highest-impact effect resulting from the current variant [MODIFIER, LOW, MODERATE, HIGH]">
-##INFO=<ID=SNPEFF_TRANSCRIPT_ID,Number=1,Type=String,Description="Transcript ID for the highest-impact effect resulting from the current variant">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##OriginalSnpEffCmd="SnpEff eff -v -onlyCoding true -c /seq/references/Homo_sapiens_assembly19/v1/snpEff/Homo_sapiens_assembly19.snpEff.config -i vcf -o vcf GRCh37.64 /seq/dax/t2d_genes/v1/t2d_genes.unannotated.vcf "
-##OriginalSnpEffVersion="2.0.5 (build 2011-12-24), by Pablo Cingolani"
-##SelectVariants="analysis_type=SelectVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsampling [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/seq/dax/t2d_genes/v1/t2d_genes.bam.list] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/scatter/temp_0001_of_2500/scattered.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomizati [...]
-##VariantAnnotator="analysis_type=VariantAnnotator input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/references/HybSelOligos/whole_exome_agilent_1.1_refseq_plus_3_boosters/whole_exome_agilent_1.1_refseq_plus_3_boosters.Homo_sapiens_assembly19.targets.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=50 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assemb [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null tag=NA read_filter=[] intervals=[/seq/dax/t2d_genes/v1/t2d_genes.padded.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta nonDeterministicRandomSeed=false disableRandomization=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsa [...]
-##contig=<ID=1,length=249250621>
-##contig=<ID=2,length=243199373>
-##contig=<ID=3,length=198022430>
-##contig=<ID=4,length=191154276>
-##contig=<ID=5,length=180915260>
-##contig=<ID=6,length=171115067>
-##contig=<ID=7,length=159138663>
-##contig=<ID=8,length=146364022>
-##contig=<ID=9,length=141213431>
-##contig=<ID=10,length=135534747>
-##contig=<ID=11,length=135006516>
-##contig=<ID=12,length=133851895>
-##contig=<ID=13,length=115169878>
-##contig=<ID=14,length=107349540>
-##contig=<ID=15,length=102531392>
-##contig=<ID=16,length=90354753>
-##contig=<ID=17,length=81195210>
-##contig=<ID=18,length=78077248>
-##contig=<ID=19,length=59128983>
-##contig=<ID=20,length=63025520>
-##contig=<ID=21,length=48129895>
-##contig=<ID=22,length=51304566>
-##contig=<ID=X,length=155270560>
-##contig=<ID=Y,length=59373566>
-##contig=<ID=MT,length=16569>
-##contig=<ID=GL000207.1,length=4262>
-##contig=<ID=GL000226.1,length=15008>
-##contig=<ID=GL000229.1,length=19913>
-##contig=<ID=GL000231.1,length=27386>
-##contig=<ID=GL000210.1,length=27682>
-##contig=<ID=GL000239.1,length=33824>
-##contig=<ID=GL000235.1,length=34474>
-##contig=<ID=GL000201.1,length=36148>
-##contig=<ID=GL000247.1,length=36422>
-##contig=<ID=GL000245.1,length=36651>
-##contig=<ID=GL000197.1,length=37175>
-##contig=<ID=GL000203.1,length=37498>
-##contig=<ID=GL000246.1,length=38154>
-##contig=<ID=GL000249.1,length=38502>
-##contig=<ID=GL000196.1,length=38914>
-##contig=<ID=GL000248.1,length=39786>
-##contig=<ID=GL000244.1,length=39929>
-##contig=<ID=GL000238.1,length=39939>
-##contig=<ID=GL000202.1,length=40103>
-##contig=<ID=GL000234.1,length=40531>
-##contig=<ID=GL000232.1,length=40652>
-##contig=<ID=GL000206.1,length=41001>
-##contig=<ID=GL000240.1,length=41933>
-##contig=<ID=GL000236.1,length=41934>
-##contig=<ID=GL000241.1,length=42152>
-##contig=<ID=GL000243.1,length=43341>
-##contig=<ID=GL000242.1,length=43523>
-##contig=<ID=GL000230.1,length=43691>
-##contig=<ID=GL000237.1,length=45867>
-##contig=<ID=GL000233.1,length=45941>
-##contig=<ID=GL000204.1,length=81310>
-##contig=<ID=GL000198.1,length=90085>
-##contig=<ID=GL000208.1,length=92689>
-##contig=<ID=GL000191.1,length=106433>
-##contig=<ID=GL000227.1,length=128374>
-##contig=<ID=GL000228.1,length=129120>
-##contig=<ID=GL000214.1,length=137718>
-##contig=<ID=GL000221.1,length=155397>
-##contig=<ID=GL000209.1,length=159169>
-##contig=<ID=GL000218.1,length=161147>
-##contig=<ID=GL000220.1,length=161802>
-##contig=<ID=GL000213.1,length=164239>
-##contig=<ID=GL000211.1,length=166566>
-##contig=<ID=GL000199.1,length=169874>
-##contig=<ID=GL000217.1,length=172149>
-##contig=<ID=GL000216.1,length=172294>
-##contig=<ID=GL000215.1,length=172545>
-##contig=<ID=GL000205.1,length=174588>
-##contig=<ID=GL000219.1,length=179198>
-##contig=<ID=GL000224.1,length=179693>
-##contig=<ID=GL000223.1,length=180455>
-##contig=<ID=GL000195.1,length=182896>
-##contig=<ID=GL000212.1,length=186858>
-##contig=<ID=GL000222.1,length=186861>
-##contig=<ID=GL000200.1,length=187035>
-##contig=<ID=GL000193.1,length=189789>
-##contig=<ID=GL000194.1,length=191469>
-##contig=<ID=GL000225.1,length=211173>
-##contig=<ID=GL000192.1,length=547496>
-##contig=<ID=NC_007605,length=171823>
-##reference=file:///seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta
-##source=SelectVariants
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 100 1000-10D 1001 1001-10D 10018 1002-10D 10029 1003-10D 10032 1004-10D 10046 10049 1005 1005-10D 10050 10059 1006-10D 10069 1007-10BD 1008-10D 10088 1009-10D 10090 1010-10D 10105 10109 1011-10D 10110 10114 10118 1012-10D 1013-10D 1014-10D 10148 1015-10D 1016-10D 1018-10D 1019-10D 10191 10194 10196 1020-10D 10204.0 1021-10D 10210 10211.0 10221 10268 1028 10282 10304 10326 10330 10339 10356 10371 10376 10388.0 10397 10402 10434 10447 10451 104 [...]
-1 69270 . A G 67802.61 VQSRTrancheSNP99.50to99.90 AC=4763;AF=0.736;AN=6468;BaseQRankSum=-29.966;DP=1452155;Dels=0.00;FS=0.000;HaplotypeScore=0.0519;InbreedingCoeff=0.3564;MLEAC=3470;MLEAF=0.536;MQ=2.72;MQ0=522186;MQRankSum=17.776;QD=0.32;ReadPosRankSum=-9.274;SNPEFF_AMINO_ACID_CHANGE=S108;SNPEFF_CODON_CHANGE=tcA/tcG;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW;S [...]
-1 69335 . G A 97.21 VQSRTrancheSNP99.90to100.00 AC=1;AF=6.701e-05;AN=14924;BaseQRankSum=3.221;DP=1123713;Dels=0.00;FS=0.000;HaplotypeScore=0.0941;InbreedingCoeff=-0.0589;MLEAC=1;MLEAF=6.701e-05;MQ=4.99;MQ0=459016;MQRankSum=0.427;QD=1.30;ReadPosRankSum=-1.122;SNPEFF_AMINO_ACID_CHANGE=R130H;SNPEFF_CODON_CHANGE=cGc/cAc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1 69366 . T G 871.42 VQSRTrancheSNP99.50to99.90 AC=2;AF=1.239e-04;AN=16146;BaseQRankSum=-1.719;DP=990333;Dels=0.00;FS=0.000;HaplotypeScore=0.0933;InbreedingCoeff=-0.0247;MLEAC=2;MLEAF=1.239e-04;MQ=5.96;MQ0=407294;MQRankSum=0.001;QD=21.25;ReadPosRankSum=0.517;SNPEFF_AMINO_ACID_CHANGE=V140;SNPEFF_CODON_CHANGE=gtT/gtG;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69037_69829;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW;SN [...]
-1 69409 . A G 4406.28 VQSRTrancheSNP99.50to99.90 AC=8;AF=4.147e-04;AN=19290;BaseQRankSum=13.621;DP=1362430;Dels=0.00;FS=26.031;HaplotypeScore=0.1448;InbreedingCoeff=0.0053;MLEAC=8;MLEAF=4.147e-04;MQ=11.68;MQ0=219922;MQRankSum=5.323;QD=9.71;ReadPosRankSum=-9.497;SNPEFF_AMINO_ACID_CHANGE=I107V;SNPEFF_CODON_CHANGE=Atc/Gtc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMP [...]
-1 69428 rs140739101 T G 419908.06 VQSRTrancheSNP99.50to99.90 AC=453;AF=0.022;AN=20242;BaseQRankSum=49.526;DB;DP=1394601;Dels=0.00;FS=975.380;HaplotypeScore=0.1195;InbreedingCoeff=0.2461;MLEAC=334;MLEAF=0.017;MQ=16.42;MQ0=138676;MQRankSum=-2.177;QD=17.57;ReadPosRankSum=-10.322;SNPEFF_AMINO_ACID_CHANGE=F113C;SNPEFF_CODON_CHANGE=tTt/tGt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=O [...]
-1 69438 . T C 3107.59 VQSRTrancheSNP99.50to99.90 AC=2;AF=9.729e-05;AN=20558;BaseQRankSum=-2.899;DP=1379680;Dels=0.00;FS=8.925;HaplotypeScore=0.1499;InbreedingCoeff=0.0001;MLEAC=2;MLEAF=9.729e-05;MQ=22.72;MQ0=95489;MQRankSum=0.850;QD=24.66;ReadPosRankSum=-0.870;SNPEFF_AMINO_ACID_CHANGE=Y116;SNPEFF_CODON_CHANGE=taT/taC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW; [...]
-1 69453 rs142004627 G A 923.30 VQSRTrancheSNP99.00to99.30 AC=141;AF=7.059e-03;AN=19974;BaseQRankSum=-19.711;DB;DP=1292464;Dels=0.00;FS=234.751;HaplotypeScore=0.2262;InbreedingCoeff=0.1247;MLEAC=44;MLEAF=2.203e-03;MQ=31.12;MQ0=15075;MQRankSum=-11.276;QD=1.14;ReadPosRankSum=-4.900;SNPEFF_AMINO_ACID_CHANGE=K121;SNPEFF_CODON_CHANGE=aaG/aaA;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5 [...]
-1 69478 . T C 625.46 VQSRTrancheSNP99.50to99.90 AC=2;AF=9.713e-05;AN=20590;BaseQRankSum=-5.701;DP=1224140;Dels=0.00;FS=9.248;HaplotypeScore=0.1621;InbreedingCoeff=-0.0073;MLEAC=1;MLEAF=4.857e-05;MQ=28.40;MQ0=31089;MQRankSum=-0.497;QD=7.19;ReadPosRankSum=-4.289;SNPEFF_AMINO_ACID_CHANGE=C130R;SNPEFF_CODON_CHANGE=Tgt/Cgt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPA [...]
-1 69489 . A C 1035.55 VQSRTrancheSNP99.50to99.90 AC=3;AF=1.469e-04;AN=20422;BaseQRankSum=4.705;DP=1117540;Dels=0.00;FS=2.442;HaplotypeScore=0.1773;InbreedingCoeff=-0.0003;MLEAC=2;MLEAF=9.793e-05;MQ=28.74;MQ0=29993;MQRankSum=-1.170;QD=12.78;ReadPosRankSum=-2.427;SNPEFF_AMINO_ACID_CHANGE=A133;SNPEFF_CODON_CHANGE=gcA/gcC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT=LOW [...]
-1 69496 rs150690004 G A 74883.53 VQSRTrancheSNP99.00to99.30 AC=33;AF=1.628e-03;AN=20272;BaseQRankSum=-5.450;DB;DP=993841;Dels=0.00;FS=22.218;HaplotypeScore=0.2924;InbreedingCoeff=0.0259;MLEAC=17;MLEAF=8.386e-04;MQ=29.16;MQ0=27895;MQRankSum=10.649;QD=70.12;ReadPosRankSum=0.884;SNPEFF_AMINO_ACID_CHANGE=G136S;SNPEFF_CODON_CHANGE=Ggc/Agc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=O [...]
-1 69496 . GGCATTATGGCTGTCA G 555413.58 Indel_FS AC=2988;AF=0.148;AN=20226;BaseQRankSum=43.899;DP=993841;FS=Infinity;HaplotypeScore=20.7358;InbreedingCoeff=0.7977;MLEAC=3420;MLEAF=0.169;MQ=29.16;MQ0=0;MQRankSum=-13.694;QD=3.63;ReadPosRankSum=37.478;SNPEFF_AMINO_ACID_CHANGE=GIMAVT136A;SNPEFF_CODON_CHANGE=ggcattatggctgtcaca/gca;SNPEFF_EFFECT=CODON_CHANGE_PLUS_CODON_DELETION;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4 [...]
-1 69502 . A G 509.73 VQSRTrancheSNP99.50to99.90 AC=2;AF=9.975e-05;AN=20050;BaseQRankSum=6.603;DP=919807;Dels=0.00;FS=1.954;HaplotypeScore=0.3679;InbreedingCoeff=-0.0070;MLEAC=1;MLEAF=4.988e-05;MQ=29.88;MQ0=25457;MQRankSum=-2.320;QD=6.22;ReadPosRankSum=-2.827;SNPEFF_AMINO_ACID_CHANGE=M138V;SNPEFF_CODON_CHANGE=Atg/Gtg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1 69511 rs75062661 A G 31383854.34 VQSRTrancheSNP99.50to99.90 AC=16694;AF=0.858;AN=19460;BaseQRankSum=60.147;DB;DP=773705;Dels=0.00;FS=138.417;HaplotypeScore=0.2818;InbreedingCoeff=0.5035;MLEAC=16887;MLEAF=0.868;MQ=31.39;MQ0=16811;MQRankSum=-164.893;QD=52.42;ReadPosRankSum=-36.782;SNPEFF_AMINO_ACID_CHANGE=T141A;SNPEFF_CODON_CHANGE=Aca/Gca;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_N [...]
-1 69521 . T C 722.77 VQSRTrancheSNP99.50to99.90 AC=2;AF=1.011e-04;AN=19776;BaseQRankSum=2.538;DP=915452;Dels=0.00;FS=1.110;HaplotypeScore=0.2063;InbreedingCoeff=-0.0088;MLEAC=2;MLEAF=1.011e-04;MQ=34.73;MQ0=15188;MQRankSum=-1.312;QD=4.82;ReadPosRankSum=-4.246;SNPEFF_AMINO_ACID_CHANGE=I144T;SNPEFF_CODON_CHANGE=aTt/aCt;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5;SNPEFF_IMPACT [...]
-1 69534 rs190717287 T C 10791.59 VQSRTrancheSNP99.50to99.90 AC=14;AF=7.034e-04;AN=19902;BaseQRankSum=15.572;DB;DP=1059436;Dels=0.00;FS=1.036;HaplotypeScore=0.1863;InbreedingCoeff=-0.0037;MLEAC=14;MLEAF=7.034e-04;MQ=35.59;MQ0=12762;MQRankSum=-2.121;QD=11.54;ReadPosRankSum=-6.516;SNPEFF_AMINO_ACID_CHANGE=H148;SNPEFF_CODON_CHANGE=caT/caC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_69091_70008;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=OR4F5; [...]
diff --git a/src/test/resources/htsjdk/tribble/sites.bed b/src/test/resources/htsjdk/tribble/sites.bed
deleted file mode 100644
index 3750b3f..0000000
--- a/src/test/resources/htsjdk/tribble/sites.bed
+++ /dev/null
@@ -1,1000 +0,0 @@
-chr1 1245 1425 chr1.1 348 0.0432341
-chr1 1578 1818 chr1.2 430 0.314475
-chr1 2018 2318 chr1.3 345 0.038427
-chr1 10665 11465 chr1.4 478 0.589475
-chr1 18100 19780 chr1.5 558 1.22721
-chr1 81011 81491 chr1.6 460 0.474365
-chr1 227342 227822 chr1.7 415 0.245863
-chr1 409247 409627 chr1.8 349 0.045556
-chr1 481720 482000 chr1.9 415 0.245863
-chr1 501569 502049 chr1.10 415 0.245863
-chr1 580608 580888 chr1.11 465 0.502745
-chr1 580906 581246 chr1.12 418 0.256501
-chr1 604472 604712 chr1.13 446 0.395281
-chr1 604748 607828 chr1.14 564 1.28828
-chr1 607863 610103 chr1.15 558 1.2282
-chr1 613316 613496 chr1.16 380 0.118186
-chr1 613539 613919 chr1.17 415 0.245863
-chr1 659767 660147 chr1.18 349 0.045555
-chr1 753372 753552 chr1.19 430 0.312979
-chr1 753620 754600 chr1.20 773 4.13035
-chr1 763942 764200 chr1.21 442 0.372517
-chr1 766594 766939 chr1.22 546 1.11774
-chr1 792467 793007 chr1.23 433 0.330713
-chr1 801766 802806 chr1.24 580 1.44576
-chr1 802807 803681 chr1.25 575 1.39455
-chr1 815798 816776 chr1.26 447 0.398158
-chr1 817006 818146 chr1.27 520 0.897849
-chr1 819524 820204 chr1.28 488 0.65421
-chr1 832980 834171 chr1.29 520 0.897575
-chr1 834220 834309 chr1.30 346 0.0402192
-chr1 845033 845448 chr1.31 497 0.71717
-chr1 847812 848512 chr1.32 478 0.589475
-chr1 864905 865029 chr1.33 461 0.481443
-chr1 874965 875487 chr1.34 423 0.278914
-chr1 879344 880327 chr1.35 699 2.94227
-chr1 880399 880708 chr1.36 495 0.706021
-chr1 880819 881023 chr1.37 383 0.127674
-chr1 881317 881911 chr1.38 418 0.256617
-chr1 883868 883904 chr1.39 312 0.002659
-chr1 896391 896556 chr1.40 385 0.135142
-chr1 898579 898621 chr1.41 355 0.0577104
-chr1 898899 899244 chr1.42 465 0.502855
-chr1 899766 899825 chr1.43 370 0.090538
-chr1 900065 900365 chr1.44 380 0.120379
-chr1 915757 916630 chr1.46 503 0.763638
-chr1 916730 917500 chr1.47 497 0.717085
-chr1 918108 918284 chr1.48 364 0.076574
-chr1 933354 933459 chr1.49 334 0.022302
-chr1 934187 936901 chr1.50 633 2.05262
-chr1 941632 942976 chr1.51 724 3.32186
-chr1 950199 950539 chr1.52 379 0.116623
-chr1 950732 950911 chr1.53 397 0.173826
-chr1 951480 952193 chr1.54 540 1.06184
-chr1 959185 959967 chr1.55 547 1.1301
-chr1 974506 974514 chr1.56 464 0.498756
-chr1 974607 975915 chr1.57 511 0.820906
-chr1 976014 976607 chr1.58 520 0.896575
-chr1 977283 977586 chr1.59 476 0.570696
-chr1 977654 977656 chr1.60 321 0.00827205
-chr1 980210 980408 chr1.61 362 0.070928
-chr1 988439 989479 chr1.62 683 2.70895
-chr1 994719 995751 chr1.63 695 2.88776
-chr1 995982 996106 chr1.64 343 0.0347552
-chr1 1007846 1009215 chr1.65 543 1.09033
-chr1 1015954 1016662 chr1.66 844 5.46574
-chr1 1034335 1034386 chr1.67 352 0.0505361
-chr1 1034434 1035191 chr1.68 639 2.12808
-chr1 1035857 1035864 chr1.69 316 0.005078
-chr1 1038865 1039724 chr1.70 632 2.03877
-chr1 1043743 1045133 chr1.71 703 3.00446
-chr1 1045399 1045565 chr1.72 356 0.05951
-chr1 1051338 1055456 chr1.73 562 1.27378
-chr1 1066992 1067071 chr1.74 396 0.170616
-chr1 1074179 1074787 chr1.75 439 0.358819
-chr1 1074991 1075171 chr1.76 399 0.180898
-chr1 1090923 1092369 chr1.77 788 4.3897
-chr1 1092391 1092445 chr1.78 488 0.656287
-chr1 1097165 1097971 chr1.79 708 3.07697
-chr1 1109347 1109587 chr1.80 354 0.054381
-chr1 1111706 1111715 chr1.81 355 0.056866
-chr1 1112293 1113013 chr1.82 609 1.76339
-chr1 1114276 1114340 chr1.83 312 0.00306007
-chr1 1114376 1115977 chr1.84 557 1.22389
-chr1 1116001 1116077 chr1.85 356 0.0594875
-chr1 1116556 1116778 chr1.86 485 0.636473
-chr1 1119001 1120315 chr1.87 692 2.84254
-chr1 1132538 1133672 chr1.88 660 2.39289
-chr1 1147188 1147624 chr1.89 447 0.400542
-chr1 1148692 1149412 chr1.90 593 1.59091
-chr1 1150502 1150712 chr1.91 395 0.166746
-chr1 1175365 1175776 chr1.92 397 0.175746
-chr1 1175855 1175965 chr1.93 390 0.152057
-chr1 1175988 1176265 chr1.94 373 0.100502
-chr1 1176365 1177189 chr1.95 705 3.0325
-chr1 1179837 1179888 chr1.96 317 0.005669
-chr1 1181827 1181950 chr1.97 331 0.0186511
-chr1 1182204 1182342 chr1.98 372 0.096425
-chr1 1183309 1184620 chr1.99 596 1.62052
-chr1 1186006 1186106 chr1.100 387 0.141911
-chr1 1187635 1189712 chr1.101 466 0.512313
-chr1 1190211 1190243 chr1.102 341 0.0312
-chr1 1192080 1192764 chr1.103 514 0.847194
-chr1 1194721 1194953 chr1.104 413 0.23692
-chr1 1206466 1207907 chr1.105 964 8.1342
-chr1 1225896 1226676 chr1.106 677 2.62722
-chr1 1248823 1249818 chr1.107 679 2.65973
-chr1 1259437 1259474 chr1.108 373 0.099368
-chr1 1267142 1267455 chr1.109 467 0.518669
-chr1 1280573 1281286 chr1.110 546 1.12306
-chr1 1282929 1284571 chr1.111 782 4.2808
-chr1 1299611 1300483 chr1.113 508 0.80183
-chr1 1324330 1325361 chr1.114 655 2.33046
-chr1 1330452 1330468 chr1.115 334 0.0224878
-chr1 1330481 1331143 chr1.116 431 0.316867
-chr1 1346249 1347613 chr1.117 532 0.991835
-chr1 1347713 1347813 chr1.118 347 0.0411966
-chr1 1349983 1351025 chr1.119 545 1.10701
-chr1 1419517 1420926 chr1.120 629 1.99595
-chr1 1427488 1428398 chr1.121 525 0.935949
-chr1 1448100 1448474 chr1.122 470 0.536396
-chr1 1452780 1453180 chr1.123 364 0.076725
-chr1 1455704 1455804 chr1.124 345 0.03843
-chr1 1461588 1461788 chr1.125 402 0.193601
-chr1 1491957 1492840 chr1.126 539 1.05258
-chr1 1525496 1525636 chr1.127 366 0.081578
-chr1 1531949 1533247 chr1.128 799 4.59657
-chr1 1560514 1561514 chr1.129 619 1.87645
-chr1 1590384 1590764 chr1.130 410 0.223637
-chr1 1590893 1591133 chr1.131 421 0.273791
-chr1 1594138 1596142 chr1.132 778 4.21174
-chr1 1655537 1655677 chr1.133 377 0.109362
-chr1 1655705 1657274 chr1.134 561 1.26111
-chr1 1663663 1663999 chr1.135 364 0.076725
-chr1 1687411 1688491 chr1.136 608 1.75721
-chr1 1688694 1688834 chr1.137 354 0.054312
-chr1 1691755 1692664 chr1.138 526 0.947746
-chr1 1708812 1708952 chr1.139 377 0.109362
-chr1 1708980 1710540 chr1.140 557 1.22281
-chr1 1740616 1741256 chr1.141 419 0.264632
-chr1 1741318 1741356 chr1.142 319 0.00727334
-chr1 1741824 1743156 chr1.143 772 4.11305
-chr1 1743330 1744816 chr1.144 694 2.86169
-chr1 1746429 1746901 chr1.145 466 0.512036
-chr1 1747199 1747370 chr1.146 366 0.080847
-chr1 1807202 1807442 chr1.147 357 0.061208
-chr1 1808587 1808927 chr1.148 398 0.179818
-chr1 1822336 1822611 chr1.149 464 0.501034
-chr1 1844627 1844854 chr1.150 373 0.099617
-chr1 1852389 1852529 chr1.151 404 0.201567
-chr1 1852929 1853169 chr1.152 382 0.126305
-chr1 1853350 1855972 chr1.153 745 3.66134
-chr1 1869830 1869840 chr1.154 332 0.0200274
-chr1 1869854 1870110 chr1.155 421 0.2737
-chr1 1872207 1873215 chr1.157 847 5.52993
-chr1 1882469 1883811 chr1.158 882 6.24189
-chr1 1907330 1908222 chr1.159 558 1.23049
-chr1 1923744 1923940 chr1.160 390 0.152416
-chr1 1923977 1924078 chr1.161 448 0.405503
-chr1 1959820 1960149 chr1.162 410 0.225941
-chr1 1982813 1983428 chr1.163 494 0.69409
-chr1 1984368 1984428 chr1.164 362 0.071593
-chr1 1989288 1989779 chr1.165 470 0.535642
-chr1 2007586 2007647 chr1.166 400 0.185196
-chr1 2008131 2008215 chr1.167 433 0.328356
-chr1 2008217 2008948 chr1.168 605 1.71627
-chr1 2010135 2010260 chr1.169 350 0.047398
-chr1 2013529 2014584 chr1.170 979 8.49978
-chr1 2055212 2055259 chr1.171 382 0.124886
-chr1 2068581 2068781 chr1.172 381 0.122871
-chr1 2086746 2087226 chr1.173 418 0.25753
-chr1 2090656 2091256 chr1.174 414 0.242561
-chr1 2095779 2096421 chr1.175 536 1.03316
-chr1 2096481 2097513 chr1.176 878 6.17002
-chr1 2103292 2103757 chr1.177 412 0.231373
-chr1 2103804 2103951 chr1.178 390 0.151735
-chr1 2109803 2110443 chr1.179 466 0.507647
-chr1 2112092 2113186 chr1.180 628 1.98414
-chr1 2116483 2116895 chr1.181 556 1.21258
-chr1 2134155 2134284 chr1.182 359 0.064291
-chr1 2137988 2137998 chr1.183 333 0.0212074
-chr1 2138022 2138316 chr1.184 430 0.315656
-chr1 2152859 2153858 chr1.185 721 3.27329
-chr1 2158055 2159299 chr1.186 711 3.11241
-chr1 2162443 2163421 chr1.187 721 3.27972
-chr1 2168224 2169293 chr1.188 809 4.78985
-chr1 2175799 2176777 chr1.189 542 1.08667
-chr1 2190263 2190275 chr1.190 308 0.001444
-chr1 2190962 2191887 chr1.191 945 7.67556
-chr1 2191916 2192099 chr1.192 448 0.408285
-chr1 2192279 2192298 chr1.193 459 0.470934
-chr1 2192819 2196309 chr1.194 666 2.47055
-chr1 2196880 2196980 chr1.195 409 0.221254
-chr1 2197480 2198620 chr1.196 597 1.63065
-chr1 2200780 2201425 chr1.197 516 0.865186
-chr1 2201461 2201525 chr1.198 322 0.00900521
-chr1 2203957 2204865 chr1.199 495 0.703671
-chr1 2218787 2220327 chr1.200 629 2.00121
-chr1 2222381 2223142 chr1.201 508 0.799448
-chr1 2240080 2240229 chr1.202 336 0.024456
-chr1 2242187 2242252 chr1.203 339 0.028898
-chr1 2251956 2252371 chr1.204 470 0.533144
-chr1 2253682 2255082 chr1.205 631 2.01952
-chr1 2263846 2265446 chr1.206 802 4.65529
-chr1 2274218 2274318 chr1.207 394 0.16333
-chr1 2274518 2274818 chr1.208 400 0.184861
-chr1 2274918 2275118 chr1.209 405 0.205095
-chr1 2275146 2275641 chr1.210 462 0.489108
-chr1 2277948 2279581 chr1.211 694 2.86896
-chr1 2281005 2281170 chr1.212 355 0.057667
-chr1 2345305 2345741 chr1.213 584 1.48807
-chr1 2345971 2345977 chr1.214 463 0.493836
-chr1 2354701 2355774 chr1.215 899 6.63001
-chr1 2374003 2374258 chr1.216 379 0.116116
-chr1 2375777 2377035 chr1.217 948 7.74791
-chr1 2377735 2378575 chr1.218 692 2.84491
-chr1 2378809 2378949 chr1.219 406 0.207187
-chr1 2378999 2379885 chr1.220 504 0.768902
-chr1 2379906 2380606 chr1.221 541 1.07024
-chr1 2397286 2397294 chr1.222 348 0.042792
-chr1 2413260 2413261 chr1.223 438 0.352263
-chr1 2430347 2431135 chr1.224 441 0.367269
-chr1 2431624 2431978 chr1.225 424 0.284169
-chr1 2457576 2457707 chr1.226 346 0.039385
-chr1 2459172 2460272 chr1.227 552 1.17653
-chr1 2463388 2463823 chr1.228 417 0.253052
-chr1 2470454 2470461 chr1.229 390 0.150899
-chr1 2486936 2488236 chr1.230 636 2.09041
-chr1 2489257 2490776 chr1.231 817 4.93949
-chr1 2492492 2492761 chr1.232 364 0.0760051
-chr1 2493101 2493146 chr1.233 469 0.531862
-chr1 2493326 2493347 chr1.235 461 0.482003
-chr1 2494419 2494642 chr1.236 341 0.031532
-chr1 2507151 2507330 chr1.237 387 0.141125
-chr1 2509159 2512197 chr1.238 772 4.11993
-chr1 2512208 2512756 chr1.239 642 2.16565
-chr1 2512807 2513247 chr1.240 516 0.860853
-chr1 2528188 2529907 chr1.241 690 2.80766
-chr1 2530087 2530368 chr1.242 432 0.324825
-chr1 2541499 2541739 chr1.243 437 0.346076
-chr1 2541759 2542339 chr1.244 578 1.4257
-chr1 2547635 2548035 chr1.245 549 1.14232
-chr1 2548806 2551026 chr1.246 937 7.48971
-chr1 2592434 2592526 chr1.247 336 0.024189
-chr1 2598191 2598791 chr1.248 445 0.388726
-chr1 2605620 2607520 chr1.249 834 5.268
-chr1 2664089 2664689 chr1.250 471 0.543906
-chr1 2665089 2665155 chr1.251 323 0.0105816
-chr1 2665189 2665259 chr1.252 374 0.103334
-chr1 2665289 2665989 chr1.253 524 0.925015
-chr1 2726150 2726886 chr1.254 549 1.14798
-chr1 2741401 2741593 chr1.255 397 0.174468
-chr1 2761650 2762004 chr1.256 464 0.497814
-chr1 2779686 2780556 chr1.257 750 3.73479
-chr1 2787864 2787900 chr1.258 346 0.04022
-chr1 2803409 2803859 chr1.259 375 0.105857
-chr1 2807226 2807228 chr1.260 308 0.001362
-chr1 2825483 2825625 chr1.261 435 0.34042
-chr1 2834138 2834756 chr1.262 538 1.04609
-chr1 2838065 2838157 chr1.263 345 0.038829
-chr1 2861188 2862281 chr1.264 548 1.13627
-chr1 2952115 2952560 chr1.265 418 0.258463
-chr1 2972843 2973318 chr1.266 411 0.230882
-chr1 2989768 2989968 chr1.267 386 0.137707
-chr1 3009017 3009062 chr1.268 390 0.15157
-chr1 3017175 3017575 chr1.269 456 0.451931
-chr1 3100471 3100558 chr1.270 335 0.023096
-chr1 3100898 3100998 chr1.271 338 0.0268333
-chr1 3101023 3101198 chr1.272 379 0.115724
-chr1 3105089 3105689 chr1.273 448 0.406987
-chr1 3190046 3190546 chr1.274 391 0.155685
-chr1 3364248 3364299 chr1.275 337 0.0257644
-chr1 3364410 3364646 chr1.276 398 0.18047
-chr1 3392559 3393373 chr1.277 587 1.51733
-chr1 3393741 3393850 chr1.278 430 0.314211
-chr1 3394031 3394804 chr1.279 409 0.222675
-chr1 3395156 3395206 chr1.280 353 0.0526742
-chr1 3395208 3395317 chr1.281 385 0.135351
-chr1 3398334 3398339 chr1.282 320 0.00753599
-chr1 3416964 3417115 chr1.283 521 0.904628
-chr1 3423248 3424044 chr1.284 530 0.9811
-chr1 3430716 3431581 chr1.285 656 2.3428
-chr1 3441703 3441928 chr1.286 426 0.295677
-chr1 3470113 3471947 chr1.287 1000 11.4006
-chr1 3475465 3475504 chr1.288 374 0.101467
-chr1 3504471 3505271 chr1.289 527 0.953672
-chr1 3511697 3512037 chr1.290 459 0.466982
-chr1 3512150 3512990 chr1.291 537 1.04137
-chr1 3522919 3523619 chr1.292 433 0.326354
-chr1 3536918 3537783 chr1.293 633 2.04946
-chr1 3550327 3550461 chr1.294 330 0.0169024
-chr1 3550933 3551686 chr1.295 571 1.35693
-chr1 3558392 3559167 chr1.296 563 1.27809
-chr1 3563409 3563437 chr1.297 324 0.0106548
-chr1 3563440 3565944 chr1.298 1000 11.196
-chr1 3588610 3590407 chr1.300 768 4.04642
-chr1 3590997 3591377 chr1.301 376 0.107667
-chr1 3591959 3592119 chr1.302 338 0.0268488
-chr1 3592147 3592218 chr1.303 474 0.558572
-chr1 3596509 3596651 chr1.304 374 0.102515
-chr1 3635398 3635663 chr1.305 583 1.47628
-chr1 3643823 3643991 chr1.306 374 0.103457
-chr1 3663878 3664519 chr1.307 534 1.01189
-chr1 3686655 3687421 chr1.308 750 3.73117
-chr1 3711401 3713059 chr1.309 824 5.07398
-chr1 3715204 3715280 chr1.310 339 0.0290495
-chr1 3715304 3715504 chr1.311 390 0.151907
-chr1 3715577 3716104 chr1.312 540 1.06776
-chr1 3723440 3723532 chr1.313 320 0.00791382
-chr1 3723732 3724032 chr1.314 436 0.341917
-chr1 3724132 3724232 chr1.315 355 0.0573958
-chr1 3727297 3727730 chr1.316 424 0.285042
-chr1 3735696 3736832 chr1.317 824 5.06396
-chr1 3790191 3790391 chr1.318 397 0.173633
-chr1 3790591 3790791 chr1.319 377 0.111306
-chr1 3790891 3790991 chr1.320 363 0.074843
-chr1 3796408 3797763 chr1.321 980 8.53863
-chr1 3830679 3831134 chr1.322 430 0.315135
-chr1 3839363 3841336 chr1.323 781 4.26183
-chr1 3841840 3843168 chr1.324 588 1.52897
-chr1 4046527 4046867 chr1.325 447 0.399924
-chr1 4046958 4047138 chr1.326 414 0.24036
-chr1 4179552 4179952 chr1.327 416 0.249199
-chr1 4263232 4263472 chr1.328 394 0.16575
-chr1 4273382 4273755 chr1.329 746 3.66676
-chr1 4495319 4495376 chr1.330 343 0.03471
-chr1 4604953 4605053 chr1.331 369 0.088698
-chr1 4622971 4623877 chr1.332 552 1.178
-chr1 4744712 4745512 chr1.333 533 1.00327
-chr1 4940852 4941152 chr1.334 396 0.170009
-chr1 5047636 5047838 chr1.335 351 0.048973
-chr1 5048038 5048138 chr1.336 339 0.0282311
-chr1 5056002 5056102 chr1.337 362 0.072234
-chr1 5119853 5119944 chr1.338 330 0.016646
-chr1 5295783 5295854 chr1.339 340 0.030582
-chr1 5299567 5300031 chr1.340 462 0.484579
-chr1 5304398 5305198 chr1.341 521 0.90563
-chr1 5308358 5308368 chr1.342 318 0.006299
-chr1 5314173 5314313 chr1.343 359 0.06435
-chr1 5317356 5317596 chr1.344 412 0.231594
-chr1 5336290 5336503 chr1.345 341 0.032255
-chr1 5417389 5418189 chr1.346 489 0.662748
-chr1 5429980 5430720 chr1.347 501 0.747305
-chr1 5463124 5463804 chr1.348 438 0.352774
-chr1 5476109 5476633 chr1.349 485 0.633405
-chr1 5504277 5504573 chr1.350 433 0.329133
-chr1 5508837 5509421 chr1.351 562 1.26653
-chr1 5631634 5631785 chr1.352 380 0.118948
-chr1 5661217 5661497 chr1.353 384 0.131985
-chr1 5661536 5662716 chr1.354 544 1.09861
-chr1 5664507 5664525 chr1.355 409 0.219854
-chr1 5681109 5681436 chr1.356 358 0.062922
-chr1 5707550 5707830 chr1.357 418 0.258635
-chr1 5707893 5708339 chr1.358 411 0.230736
-chr1 5810885 5811785 chr1.359 487 0.646923
-chr1 5845657 5845897 chr1.360 383 0.128835
-chr1 5905304 5906204 chr1.361 540 1.06385
-chr1 5907432 5907824 chr1.362 470 0.538406
-chr1 5909947 5910847 chr1.363 558 1.2354
-chr1 5953137 5953377 chr1.364 384 0.130998
-chr1 5969567 5970207 chr1.365 435 0.33689
-chr1 5985436 5989627 chr1.366 937 7.48701
-chr1 6020073 6023367 chr1.367 763 3.95216
-chr1 6025268 6025914 chr1.369 416 0.250311
-chr1 6047083 6047181 chr1.370 381 0.123346
-chr1 6051121 6051151 chr1.371 349 0.045605
-chr1 6065059 6065145 chr1.372 367 0.084044
-chr1 6103157 6103198 chr1.373 393 0.160523
-chr1 6103280 6103514 chr1.374 400 0.184768
-chr1 6110849 6110906 chr1.375 322 0.00935
-chr1 6121907 6122607 chr1.376 566 1.3095
-chr1 6139611 6139786 chr1.377 350 0.047781
-chr1 6142543 6142589 chr1.378 347 0.0410937
-chr1 6142845 6143478 chr1.379 507 0.796213
-chr1 6174913 6174926 chr1.380 322 0.00919397
-chr1 6175613 6175672 chr1.381 344 0.037
-chr1 6179651 6179851 chr1.382 371 0.093017
-chr1 6193230 6194465 chr1.383 825 5.09165
-chr1 6194589 6194769 chr1.384 361 0.0694778
-chr1 6199507 6199764 chr1.385 542 1.08144
-chr1 6199776 6199845 chr1.386 470 0.532812
-chr1 6200213 6201182 chr1.387 470 0.532765
-chr1 6203569 6203691 chr1.388 326 0.013056
-chr1 6203924 6204029 chr1.389 427 0.298376
-chr1 6229736 6230720 chr1.390 663 2.43144
-chr1 6230962 6231102 chr1.391 397 0.175743
-chr1 6239308 6239343 chr1.392 490 0.671257
-chr1 6239348 6239881 chr1.393 609 1.76614
-chr1 6240252 6240434 chr1.394 359 0.0644718
-chr1 6240452 6241652 chr1.395 667 2.48376
-chr1 6254059 6254762 chr1.396 619 1.88495
-chr1 6255114 6255608 chr1.397 595 1.61068
-chr1 6276001 6276541 chr1.398 425 0.291287
-chr1 6342254 6343584 chr1.399 612 1.80057
-chr1 6353019 6354469 chr1.400 556 1.21155
-chr1 6359423 6359670 chr1.401 426 0.292977
-chr1 6387410 6388963 chr1.403 833 5.24564
-chr1 6398989 6399799 chr1.404 565 1.29732
-chr1 6408661 6409101 chr1.405 435 0.336793
-chr1 6413979 6414449 chr1.406 415 0.244244
-chr1 6414720 6414782 chr1.407 418 0.258695
-chr1 6417717 6419744 chr1.408 615 1.83352
-chr1 6431850 6432707 chr1.409 534 1.01216
-chr1 6434544 6435100 chr1.410 604 1.70279
-chr1 6441530 6442436 chr1.411 487 0.644963
-chr1 6443498 6444188 chr1.412 421 0.272466
-chr1 6444808 6444908 chr1.413 397 0.174494
-chr1 6453802 6455542 chr1.414 796 4.54512
-chr1 6458957 6460910 chr1.415 715 3.17974
-chr1 6469556 6470536 chr1.416 670 2.53514
-chr1 6479822 6480051 chr1.417 464 0.500152
-chr1 6480191 6481291 chr1.418 606 1.7329
-chr1 6484026 6485952 chr1.419 642 2.16671
-chr1 6485996 6486113 chr1.420 347 0.0424213
-chr1 6487684 6487830 chr1.421 375 0.104822
-chr1 6491298 6492410 chr1.422 690 2.80757
-chr1 6515040 6515180 chr1.423 329 0.016359
-chr1 6539345 6539585 chr1.424 439 0.358308
-chr1 6539609 6540252 chr1.425 549 1.14281
-chr1 6548511 6549715 chr1.426 713 3.1525
-chr1 6573604 6575104 chr1.427 805 4.70201
-chr1 6585740 6585839 chr1.428 354 0.054151
-chr1 6593261 6594397 chr1.429 564 1.28992
-chr1 6595174 6596474 chr1.430 693 2.85379
-chr1 6596574 6596606 chr1.431 335 0.0227389
-chr1 6596789 6598555 chr1.433 656 2.34421
-chr1 6606848 6609592 chr1.434 856 5.71167
-chr1 6618971 6620258 chr1.435 727 3.36245
-chr1 6640224 6640764 chr1.436 524 0.925278
-chr1 6640789 6641228 chr1.437 546 1.11628
-chr1 6645301 6645401 chr1.438 358 0.062647
-chr1 6645465 6645501 chr1.439 316 0.00506949
-chr1 6695708 6696512 chr1.440 700 2.9551
-chr1 6714442 6714554 chr1.441 356 0.059668
-chr1 6721933 6722127 chr1.442 369 0.089852
-chr1 6728819 6729659 chr1.443 523 0.919928
-chr1 6736584 6736598 chr1.444 319 0.007138
-chr1 6737420 6737700 chr1.445 444 0.384274
-chr1 6737762 6738402 chr1.446 485 0.633369
-chr1 6778180 6780361 chr1.447 924 7.17666
-chr1 6780589 6781263 chr1.448 432 0.325742
-chr1 6956891 6957167 chr1.449 397 0.174899
-chr1 6957391 6957964 chr1.450 504 0.769395
-chr1 7113515 7114155 chr1.451 440 0.363658
-chr1 7212679 7212780 chr1.452 336 0.024595
-chr1 7231995 7232034 chr1.453 314 0.004009
-chr1 7459398 7459598 chr1.454 372 0.096016
-chr1 7641508 7641952 chr1.455 553 1.18241
-chr1 7661729 7662412 chr1.456 530 0.979164
-chr1 7663793 7664125 chr1.457 452 0.430045
-chr1 7664193 7665093 chr1.458 492 0.679594
-chr1 7671588 7671988 chr1.459 396 0.172629
-chr1 7674459 7675524 chr1.460 582 1.47493
-chr1 7698392 7699989 chr1.461 672 2.55111
-chr1 7703712 7704052 chr1.462 338 0.027123
-chr1 7719286 7719826 chr1.463 436 0.343389
-chr1 7719860 7719966 chr1.464 318 0.00611124
-chr1 7720728 7721328 chr1.465 405 0.203769
-chr1 7727749 7728266 chr1.466 379 0.116645
-chr1 7730905 7731605 chr1.467 378 0.1146
-chr1 7746847 7747449 chr1.468 459 0.467609
-chr1 7761778 7761876 chr1.469 331 0.018436
-chr1 7764993 7765980 chr1.470 764 3.96799
-chr1 7776325 7776328 chr1.471 311 0.002269
-chr1 7777665 7779419 chr1.472 858 5.75116
-chr1 7821343 7822543 chr1.473 549 1.14715
-chr1 7880838 7881078 chr1.474 335 0.023662
-chr1 7897160 7897302 chr1.475 380 0.119257
-chr1 7897330 7897335 chr1.476 331 0.0180441
-chr1 7925170 7925557 chr1.477 462 0.485144
-chr1 7936502 7937182 chr1.478 539 1.06055
-chr1 7937244 7937484 chr1.479 421 0.272625
-chr1 7943310 7943950 chr1.480 537 1.04177
-chr1 7947986 7949355 chr1.481 660 2.39798
-chr1 7955338 7957402 chr1.482 824 5.07687
-chr1 7976547 7977227 chr1.483 536 1.03135
-chr1 8009415 8009785 chr1.484 428 0.305295
-chr1 8018822 8021099 chr1.485 612 1.80179
-chr1 8041607 8042107 chr1.486 376 0.10901
-chr1 8107706 8107849 chr1.487 372 0.096754
-chr1 8132243 8132543 chr1.488 382 0.125108
-chr1 8143554 8143894 chr1.489 433 0.327808
-chr1 8143933 8144213 chr1.490 480 0.597669
-chr1 8146312 8146674 chr1.491 439 0.358509
-chr1 8146925 8147810 chr1.492 582 1.47331
-chr1 8148073 8148653 chr1.493 499 0.732333
-chr1 8163643 8165099 chr1.494 652 2.28248
-chr1 8176501 8177381 chr1.495 624 1.93584
-chr1 8188192 8188532 chr1.496 425 0.289221
-chr1 8188549 8188889 chr1.497 403 0.197338
-chr1 8226358 8227023 chr1.498 493 0.690844
-chr1 8227114 8227294 chr1.499 431 0.318179
-chr1 8308676 8308954 chr1.500 430 0.315372
-chr1 8311985 8312979 chr1.501 709 3.08172
-chr1 8343035 8343828 chr1.502 627 1.97195
-chr1 8365384 8365684 chr1.503 399 0.180655
-chr1 8367944 8368781 chr1.504 392 0.158363
-chr1 8377207 8377958 chr1.505 485 0.633445
-chr1 8378241 8378299 chr1.506 319 0.00705539
-chr1 8389754 8391034 chr1.507 582 1.47437
-chr1 8391225 8391458 chr1.508 427 0.300652
-chr1 8391775 8392255 chr1.509 506 0.785274
-chr1 8392257 8392497 chr1.510 451 0.425152
-chr1 8401847 8401987 chr1.511 411 0.229506
-chr1 8401988 8403428 chr1.512 582 1.47017
-chr1 8403494 8403828 chr1.513 426 0.295087
-chr1 8406765 8406965 chr1.514 365 0.077851
-chr1 8413105 8413405 chr1.515 392 0.157024
-chr1 8415222 8415722 chr1.516 416 0.248503
-chr1 8416622 8419418 chr1.517 615 1.83419
-chr1 8421702 8422460 chr1.518 525 0.933497
-chr1 8443136 8443793 chr1.519 490 0.667712
-chr1 8445710 8446070 chr1.520 406 0.20897
-chr1 8455610 8455710 chr1.521 393 0.162064
-chr1 8455810 8456023 chr1.522 352 0.0506586
-chr1 8457410 8458110 chr1.523 481 0.60741
-chr1 8467012 8467112 chr1.524 392 0.15691
-chr1 8467212 8467289 chr1.525 309 0.00179666
-chr1 8473205 8473445 chr1.526 402 0.194979
-chr1 8504074 8505261 chr1.527 639 2.12098
-chr1 8505309 8505549 chr1.528 457 0.455829
-chr1 8518014 8521014 chr1.529 638 2.11
-chr1 8539553 8539588 chr1.530 308 0.001211
-chr1 8555596 8556022 chr1.531 407 0.211031
-chr1 8556483 8556583 chr1.532 338 0.027828
-chr1 8596816 8597258 chr1.533 505 0.774181
-chr1 8597269 8597809 chr1.534 540 1.06175
-chr1 8598776 8598916 chr1.535 402 0.193151
-chr1 8598936 8599276 chr1.536 431 0.316757
-chr1 8617713 8618353 chr1.537 421 0.272994
-chr1 8626317 8627317 chr1.538 549 1.14922
-chr1 8632762 8632902 chr1.539 385 0.133882
-chr1 8661178 8661718 chr1.540 438 0.353218
-chr1 8664366 8664706 chr1.541 407 0.211497
-chr1 8665732 8665919 chr1.542 372 0.096127
-chr1 8695228 8696331 chr1.543 715 3.176
-chr1 8697421 8698862 chr1.544 585 1.50209
-chr1 8698906 8699146 chr1.545 425 0.287892
-chr1 8706288 8707511 chr1.546 569 1.3331
-chr1 8731775 8731915 chr1.547 377 0.110385
-chr1 8731995 8732575 chr1.548 466 0.509635
-chr1 8809256 8809314 chr1.549 359 0.065604
-chr1 8810776 8813089 chr1.550 850 5.58414
-chr1 8824007 8824219 chr1.551 395 0.167879
-chr1 8843233 8843545 chr1.552 497 0.718104
-chr1 8853785 8854065 chr1.553 413 0.237218
-chr1 8855301 8855801 chr1.554 367 0.084444
-chr1 8868031 8868671 chr1.555 447 0.398462
-chr1 8872166 8873910 chr1.556 798 4.57685
-chr1 8894251 8894279 chr1.557 392 0.158434
-chr1 8894282 8894552 chr1.558 475 0.567848
-chr1 8907813 8908393 chr1.559 416 0.252026
-chr1 8912501 8912881 chr1.560 502 0.754464
-chr1 8920942 8921307 chr1.561 381 0.122501
-chr1 8939414 8940401 chr1.562 492 0.681736
-chr1 8957412 8957500 chr1.563 368 0.085716
-chr1 8961522 8961662 chr1.564 346 0.0405167
-chr1 8961759 8962339 chr1.565 448 0.408565
-chr1 8964588 8964813 chr1.566 416 0.248209
-chr1 8965060 8965759 chr1.567 592 1.57161
-chr1 8980485 8980585 chr1.568 326 0.012831
-chr1 8981022 8981340 chr1.569 424 0.287339
-chr1 8981392 8981424 chr1.570 402 0.193757
-chr1 8981992 8982827 chr1.571 545 1.1102
-chr1 8999149 8999943 chr1.572 580 1.44595
-chr1 9096355 9096448 chr1.573 349 0.044431
-chr1 9104051 9104214 chr1.574 333 0.021132
-chr1 9105039 9105050 chr1.575 322 0.00894791
-chr1 9105071 9105545 chr1.576 496 0.713335
-chr1 9116162 9116802 chr1.577 532 0.998398
-chr1 9122811 9124711 chr1.578 876 6.11381
-chr1 9136473 9136935 chr1.579 495 0.706033
-chr1 9175634 9176189 chr1.580 547 1.13023
-chr1 9176362 9176368 chr1.581 317 0.00586586
-chr1 9176450 9176468 chr1.582 331 0.018376
-chr1 9176470 9176541 chr1.583 325 0.0121209
-chr1 9177287 9177603 chr1.584 420 0.266916
-chr1 9190382 9191375 chr1.585 623 1.92201
-chr1 9195449 9196089 chr1.586 428 0.302592
-chr1 9228264 9229757 chr1.587 796 4.53492
-chr1 9229896 9229910 chr1.588 304 0.000402749
-chr1 9233829 9234632 chr1.589 525 0.934048
-chr1 9261379 9261919 chr1.590 519 0.889613
-chr1 9270017 9270163 chr1.591 490 0.66517
-chr1 9278539 9278796 chr1.592 454 0.438251
-chr1 9283189 9283674 chr1.593 456 0.452064
-chr1 9283688 9283928 chr1.594 394 0.166216
-chr1 9284257 9285108 chr1.595 431 0.320773
-chr1 9286721 9287687 chr1.596 650 2.25714
-chr1 9287823 9287962 chr1.597 492 0.679897
-chr1 9288179 9288206 chr1.598 347 0.0421743
-chr1 9288642 9289182 chr1.599 468 0.525884
-chr1 9289184 9289282 chr1.600 358 0.0623004
-chr1 9394854 9394931 chr1.601 333 0.020678
-chr1 9406782 9407951 chr1.602 539 1.05838
-chr1 9411837 9412817 chr1.603 579 1.43638
-chr1 9420268 9421248 chr1.604 679 2.64855
-chr1 9422600 9423877 chr1.605 717 3.21228
-chr1 9449753 9449853 chr1.606 341 0.0322128
-chr1 9449953 9450569 chr1.607 573 1.37542
-chr1 9467097 9467337 chr1.608 392 0.15655
-chr1 9467637 9467837 chr1.609 368 0.0858662
-chr1 9485361 9485821 chr1.610 513 0.840315
-chr1 9489645 9489876 chr1.611 413 0.235815
-chr1 9489953 9490033 chr1.612 415 0.247304
-chr1 9533273 9535021 chr1.613 709 3.08609
-chr1 9553064 9553181 chr1.614 350 0.0477783
-chr1 9553783 9554331 chr1.615 437 0.347944
-chr1 9568019 9568099 chr1.616 330 0.016923
-chr1 9582594 9583420 chr1.617 903 6.69798
-chr1 9583449 9584334 chr1.618 506 0.787083
-chr1 9610065 9610145 chr1.619 342 0.032849
-chr1 9610260 9610283 chr1.620 373 0.09963
-chr1 9621183 9621955 chr1.622 691 2.82618
-chr1 9622147 9622287 chr1.623 401 0.191001
-chr1 9622579 9624821 chr1.624 696 2.89883
-chr1 9645580 9646153 chr1.625 442 0.371898
-chr1 9646271 9648303 chr1.626 646 2.21344
-chr1 9648349 9649129 chr1.627 520 0.898129
-chr1 9649348 9650028 chr1.628 455 0.4443
-chr1 9681057 9681092 chr1.629 335 0.0229328
-chr1 9681190 9682723 chr1.630 582 1.47354
-chr1 9683237 9684175 chr1.631 732 3.45277
-chr1 9708410 9709147 chr1.632 562 1.27224
-chr1 9709689 9710489 chr1.633 529 0.968673
-chr1 9710538 9710589 chr1.634 343 0.0341791
-chr1 9711289 9711317 chr1.635 332 0.0199725
-chr1 9711389 9712729 chr1.636 770 4.0696
-chr1 9712751 9712891 chr1.637 398 0.178471
-chr1 9716067 9716402 chr1.638 429 0.309362
-chr1 9719049 9719682 chr1.639 549 1.14888
-chr1 9722503 9724028 chr1.640 651 2.27965
-chr1 9724115 9724128 chr1.641 309 0.0015425
-chr1 9766728 9766968 chr1.642 386 0.137728
-chr1 9778793 9779291 chr1.643 463 0.490789
-chr1 9782028 9782274 chr1.644 443 0.381381
-chr1 9817059 9817732 chr1.645 448 0.408183
-chr1 9817953 9820336 chr1.646 868 5.94748
-chr1 9820415 9820651 chr1.647 439 0.359755
-chr1 9830856 9831496 chr1.648 496 0.712757
-chr1 9844382 9845378 chr1.649 558 1.22972
-chr1 9861218 9862258 chr1.650 583 1.47632
-chr1 9868810 9869815 chr1.651 631 2.01853
-chr1 9876719 9877271 chr1.652 477 0.580527
-chr1 9903639 9905821 chr1.653 981 8.54314
-chr1 9926380 9926459 chr1.654 357 0.060471
-chr1 9936538 9938255 chr1.655 642 2.1585
-chr1 9944645 9945128 chr1.656 542 1.08591
-chr1 9991451 9991619 chr1.657 362 0.0722512
-chr1 9991905 9992075 chr1.658 430 0.312042
-chr1 10026446 10027898 chr1.659 901 6.66041
-chr1 10152497 10152897 chr1.660 415 0.244103
-chr1 10203931 10205596 chr1.661 844 5.46755
-chr1 10252928 10253558 chr1.662 453 0.436453
-chr1 10267847 10268147 chr1.663 398 0.179382
-chr1 10302008 10302908 chr1.664 555 1.20448
-chr1 10340217 10340457 chr1.665 380 0.118807
-chr1 10340474 10340654 chr1.666 353 0.0524881
-chr1 10368060 10368099 chr1.667 339 0.028562
-chr1 10392571 10395144 chr1.668 908 6.82367
-chr1 10422302 10422338 chr1.669 363 0.0739107
-chr1 10422348 10422721 chr1.670 535 1.02426
-chr1 10424138 10425705 chr1.671 776 4.17679
-chr1 10430996 10431476 chr1.672 414 0.242571
-chr1 10465584 10466024 chr1.673 422 0.276309
-chr1 10466142 10467509 chr1.674 701 2.9744
-chr1 10468986 10469846 chr1.675 639 2.11803
-chr1 10488894 10490094 chr1.676 637 2.09619
-chr1 10492577 10492817 chr1.677 354 0.054395
-chr1 10501511 10502108 chr1.678 445 0.390985
-chr1 10502491 10502504 chr1.679 348 0.042946
-chr1 10504244 10504584 chr1.680 431 0.318759
-chr1 10504616 10506302 chr1.681 680 2.67308
-chr1 10513400 10513700 chr1.682 395 0.167584
-chr1 10538500 10538537 chr1.683 308 0.00122817
-chr1 10538741 10538822 chr1.684 327 0.013649
-chr1 10589375 10589975 chr1.685 449 0.410125
-chr1 10632536 10633579 chr1.686 570 1.34375
-chr1 10646692 10646717 chr1.687 382 0.124599
-chr1 10661090 10661197 chr1.688 397 0.175384
-chr1 10686500 10689884 chr1.689 1000 9.21871
-chr1 10690597 10690937 chr1.690 347 0.041224
-chr1 10749912 10750903 chr1.691 614 1.81912
-chr1 10772740 10773080 chr1.692 377 0.109684
-chr1 10778350 10778391 chr1.693 318 0.005996
-chr1 10786017 10786025 chr1.694 324 0.010846
-chr1 10861097 10861213 chr1.695 444 0.384366
-chr1 10861380 10862435 chr1.696 640 2.1315
-chr1 10866122 10866302 chr1.697 371 0.095126
-chr1 10882982 10883087 chr1.698 426 0.294169
-chr1 10891540 10891604 chr1.699 320 0.007629
-chr1 10898133 10899553 chr1.700 514 0.849986
-chr1 10904157 10904210 chr1.701 410 0.224514
-chr1 10904269 10904564 chr1.702 469 0.528286
-chr1 10911375 10911665 chr1.703 431 0.316975
-chr1 10912049 10912921 chr1.704 516 0.861241
-chr1 10926584 10926733 chr1.705 359 0.065068
-chr1 10933863 10935019 chr1.706 510 0.817714
-chr1 10936200 10936966 chr1.707 506 0.786559
-chr1 10955303 10955741 chr1.708 543 1.09428
-chr1 10959321 10959801 chr1.709 477 0.583446
-chr1 10960104 10960341 chr1.710 425 0.290026
-chr1 10990398 10990778 chr1.711 405 0.206693
-chr1 11006124 11006152 chr1.712 338 0.0274196
-chr1 11006373 11008013 chr1.713 765 3.99066
-chr1 11018515 11019115 chr1.714 405 0.203476
-chr1 11024710 11024910 chr1.715 397 0.174439
-chr1 11031646 11032526 chr1.716 674 2.57742
-chr1 11032603 11032843 chr1.717 438 0.354543
-chr1 11053181 11053281 chr1.718 324 0.0114404
-chr1 11053875 11055539 chr1.719 935 7.44763
-chr1 11093526 11094719 chr1.720 760 3.90018
-chr1 11138750 11139150 chr1.721 452 0.428346
-chr1 11207178 11207878 chr1.722 487 0.64576
-chr1 11221841 11222026 chr1.723 380 0.1194
-chr1 11236089 11236216 chr1.724 452 0.429745
-chr1 11240175 11241255 chr1.725 549 1.14549
-chr1 11256285 11257525 chr1.726 833 5.23514
-chr1 11266912 11267010 chr1.727 440 0.363964
-chr1 11267052 11268289 chr1.728 720 3.26155
-chr1 11275264 11275760 chr1.729 511 0.826675
-chr1 11288942 11289089 chr1.730 364 0.076249
-chr1 11306190 11306330 chr1.732 391 0.153405
-chr1 11306357 11306597 chr1.733 454 0.438669
-chr1 11306897 11306997 chr1.734 331 0.0179042
-chr1 11314602 11314779 chr1.735 365 0.078178
-chr1 11331880 11331885 chr1.736 329 0.0160068
-chr1 11331990 11332094 chr1.737 354 0.053898
-chr1 11333774 11333923 chr1.738 403 0.197859
-chr1 11348931 11349031 chr1.739 359 0.0657591
-chr1 11349331 11349631 chr1.740 447 0.401474
-chr1 11378211 11378740 chr1.741 439 0.356991
-chr1 11472644 11473841 chr1.742 605 1.71862
-chr1 11474475 11474725 chr1.743 545 1.10582
-chr1 11532620 11532693 chr1.744 338 0.026821
-chr1 11548123 11548303 chr1.745 370 0.0902696
-chr1 11548367 11548507 chr1.746 391 0.154725
-chr1 11636532 11637090 chr1.747 528 0.962523
-chr1 11640057 11640342 chr1.748 545 1.11199
-chr1 11643261 11643263 chr1.749 454 0.442281
-chr1 11643310 11643450 chr1.750 372 0.0964662
-chr1 11644166 11645286 chr1.751 631 2.02555
-chr1 11648139 11648395 chr1.752 374 0.10208
-chr1 11648444 11649651 chr1.753 535 1.02368
-chr1 11649814 11649862 chr1.754 439 0.360995
-chr1 11658259 11659370 chr1.755 680 2.66911
-chr1 11674833 11676363 chr1.756 755 3.81803
-chr1 11685899 11685963 chr1.757 348 0.0427532
-chr1 11686103 11686203 chr1.758 386 0.137489
-chr1 11686723 11686803 chr1.759 358 0.0624899
-chr1 11687143 11687225 chr1.760 347 0.0419641
-chr1 11687275 11687853 chr1.761 421 0.270193
-chr1 11700314 11700321 chr1.762 320 0.007512
-chr1 11705512 11705965 chr1.763 454 0.440738
-chr1 11713519 11714464 chr1.764 641 2.14917
-chr1 11724399 11724538 chr1.765 324 0.0111745
-chr1 11724656 11725336 chr1.766 531 0.98641
-chr1 11730045 11731533 chr1.767 644 2.19209
-chr1 11734375 11735216 chr1.768 503 0.765884
-chr1 11735248 11735477 chr1.769 393 0.159503
-chr1 11743298 11743951 chr1.770 589 1.54117
-chr1 11756894 11757005 chr1.771 403 0.199074
-chr1 11797494 11798391 chr1.772 666 2.46757
-chr1 11798736 11799516 chr1.773 589 1.54157
-chr1 11799528 11801368 chr1.774 876 6.12942
-chr1 11832726 11833584 chr1.775 654 2.31091
-chr1 11839882 11840382 chr1.776 461 0.479399
-chr1 11853568 11854246 chr1.777 502 0.757542
-chr1 11888103 11888671 chr1.778 548 1.13601
-chr1 11900015 11900148 chr1.779 366 0.0825749
-chr1 11900247 11900335 chr1.780 400 0.18488
-chr1 11901991 11902909 chr1.781 608 1.7513
-chr1 11902976 11903612 chr1.782 711 3.12403
-chr1 11903696 11904564 chr1.783 518 0.882039
-chr1 11904863 11905003 chr1.784 396 0.170739
-chr1 11919310 11919389 chr1.785 352 0.050833
-chr1 11920555 11921134 chr1.786 637 2.09438
-chr1 11928312 11929587 chr1.787 706 3.04291
-chr1 11973919 11975541 chr1.788 778 4.21722
-chr1 11975727 11975967 chr1.789 434 0.332081
-chr1 12013365 12014345 chr1.790 869 5.96891
-chr1 12041403 12042004 chr1.791 453 0.435287
-chr1 12058298 12059198 chr1.792 505 0.780643
-chr1 12060328 12060406 chr1.793 321 0.00834494
-chr1 12060419 12060530 chr1.794 375 0.105754
-chr1 12072388 12072482 chr1.795 309 0.001827
-chr1 12081725 12083553 chr1.796 529 0.973503
-chr1 12083592 12084172 chr1.797 473 0.552283
-chr1 12100660 12100749 chr1.798 339 0.0294
-chr1 12112953 12113194 chr1.799 434 0.331642
-chr1 12119325 12119399 chr1.800 378 0.112809
-chr1 12127227 12127737 chr1.801 571 1.35524
-chr1 12137135 12138575 chr1.802 516 0.860251
-chr1 12144761 12145329 chr1.803 504 0.773191
-chr1 12146431 12146852 chr1.804 370 0.092743
-chr1 12147573 12148060 chr1.805 426 0.29298
-chr1 12152020 12152520 chr1.807 457 0.455083
-chr1 12154183 12154374 chr1.808 398 0.17961
-chr1 12155721 12155925 chr1.809 362 0.070915
-chr1 12156003 12156605 chr1.810 505 0.780809
-chr1 12160994 12161705 chr1.811 491 0.678695
-chr1 12162251 12162338 chr1.812 367 0.083161
-chr1 12166143 12166283 chr1.813 386 0.137527
-chr1 12166483 12166623 chr1.814 390 0.152242
-chr1 12166685 12166825 chr1.815 367 0.0831564
-chr1 12167125 12167365 chr1.816 365 0.0779965
-chr1 12167457 12168531 chr1.817 665 2.45889
-chr1 12171747 12172044 chr1.818 435 0.336281
-chr1 12172089 12173870 chr1.819 626 1.95922
-chr1 12183907 12183974 chr1.820 344 0.035861
-chr1 12197940 12198104 chr1.821 394 0.164764
-chr1 12198287 12199067 chr1.822 551 1.16823
-chr1 12202922 12203798 chr1.823 586 1.51165
-chr1 12204860 12205296 chr1.824 582 1.4676
-chr1 12223965 12223992 chr1.825 357 0.0617072
-chr1 12224082 12224704 chr1.826 776 4.18161
-chr1 12225014 12225192 chr1.827 360 0.0667278
-chr1 12225392 12225556 chr1.828 334 0.022319
-chr1 12237712 12238106 chr1.830 394 0.162787
-chr1 12238306 12238406 chr1.831 374 0.102884
-chr1 12250439 12251019 chr1.832 430 0.314475
-chr1 12296646 12296833 chr1.833 374 0.102431
-chr1 12308740 12309003 chr1.834 382 0.123975
-chr1 12332362 12333062 chr1.835 449 0.41104
-chr1 12336091 12336191 chr1.836 395 0.167755
-chr1 12336391 12336891 chr1.837 496 0.70959
-chr1 12338572 12340898 chr1.838 600 1.65857
-chr1 12379179 12380859 chr1.839 573 1.38276
-chr1 12402071 12402250 chr1.840 372 0.095808
-chr1 12404145 12404785 chr1.841 439 0.357204
-chr1 12427890 12428967 chr1.842 549 1.14903
-chr1 12429946 12430557 chr1.843 452 0.430647
-chr1 12430657 12430757 chr1.844 332 0.0193219
-chr1 12432758 12433138 chr1.845 450 0.419825
-chr1 12442728 12444136 chr1.846 576 1.40849
-chr1 12447658 12448191 chr1.847 393 0.159936
-chr1 12456074 12456274 chr1.849 381 0.123171
-chr1 12466961 12468243 chr1.850 579 1.44035
-chr1 12468308 12468343 chr1.851 317 0.00565047
-chr1 12469713 12470813 chr1.852 577 1.42181
-chr1 12472613 12473713 chr1.853 592 1.57865
-chr1 12474674 12475574 chr1.854 499 0.732854
-chr1 12504326 12505648 chr1.855 694 2.86522
-chr1 12507812 12508452 chr1.856 460 0.476398
-chr1 12589337 12590109 chr1.857 527 0.95416
-chr1 12595533 12595885 chr1.858 538 1.04484
-chr1 12595964 12596007 chr1.859 381 0.122329
-chr1 12598333 12599059 chr1.860 634 2.0554
-chr1 12602441 12602921 chr1.861 437 0.347268
-chr1 12609975 12615062 chr1.862 681 2.67612
-chr1 12628983 12629038 chr1.863 328 0.01499
-chr1 12653139 12653750 chr1.864 585 1.49641
-chr1 12709964 12710204 chr1.865 392 0.158386
-chr1 13536563 13536663 chr1.866 365 0.079255
-chr1 13648290 13648564 chr1.867 396 0.170599
-chr1 13648630 13648930 chr1.868 394 0.164951
-chr1 13662441 13662743 chr1.869 376 0.106974
-chr1 13664935 13665135 chr1.870 385 0.136126
-chr1 13737241 13738053 chr1.871 550 1.15861
-chr1 13771156 13773437 chr1.872 602 1.68301
-chr1 13774089 13774979 chr1.873 568 1.32514
-chr1 13802090 13803586 chr1.874 669 2.51079
-chr1 13805063 13805403 chr1.875 469 0.529197
-chr1 13805417 13805657 chr1.876 408 0.21799
-chr1 13806857 13807057 chr1.877 402 0.194273
-chr1 13807157 13807258 chr1.878 366 0.0805917
-chr1 13820234 13821790 chr1.879 863 5.85212
-chr1 13860441 13860681 chr1.881 405 0.206331
-chr1 13860716 13860994 chr1.882 425 0.289412
-chr1 13866367 13866907 chr1.883 419 0.263851
-chr1 13869148 13870002 chr1.884 499 0.730528
-chr1 14032227 14032506 chr1.885 412 0.232528
-chr1 14111264 14111804 chr1.886 402 0.192342
-chr1 14175862 14176462 chr1.887 401 0.190955
-chr1 14261116 14261256 chr1.888 348 0.043671
-chr1 14377545 14378045 chr1.889 447 0.398278
-chr1 14606946 14607186 chr1.890 354 0.054381
-chr1 14778554 14778888 chr1.891 414 0.240023
-chr1 14906714 14907214 chr1.892 434 0.333813
-chr1 14995701 14996075 chr1.893 565 1.3023
-chr1 14996277 14996382 chr1.894 466 0.512972
-chr1 15040834 15041229 chr1.895 431 0.319072
-chr1 15090292 15090325 chr1.896 331 0.018017
-chr1 15136259 15136736 chr1.897 448 0.404303
-chr1 15162138 15162749 chr1.898 409 0.221743
-chr1 15172653 15172993 chr1.899 443 0.377085
-chr1 15173052 15173192 chr1.900 393 0.160083
-chr1 15173226 15173392 chr1.901 352 0.0515823
-chr1 15200339 15200879 chr1.902 543 1.08883
-chr1 15209631 15210311 chr1.903 486 0.641895
-chr1 15257215 15257749 chr1.904 388 0.144293
-chr1 15276886 15277426 chr1.905 449 0.409087
-chr1 15394922 15395202 chr1.906 453 0.432337
-chr1 15395205 15395885 chr1.907 517 0.869571
-chr1 15395960 15396200 chr1.908 417 0.254147
-chr1 15404605 15405145 chr1.909 472 0.549452
-chr1 15413596 15414121 chr1.910 426 0.294237
-chr1 15417888 15418021 chr1.911 367 0.082711
-chr1 15480449 15480689 chr1.912 440 0.364072
-chr1 15480762 15483101 chr1.913 657 2.35582
-chr1 15483501 15484141 chr1.914 451 0.420121
-chr1 15488902 15489744 chr1.915 527 0.95526
-chr1 15502704 15503364 chr1.916 604 1.70467
-chr1 15523081 15523221 chr1.917 380 0.119752
-chr1 15595510 15597650 chr1.918 922 7.1369
-chr1 15597865 15599193 chr1.919 750 3.74345
-chr1 15649465 15650083 chr1.920 490 0.667183
-chr1 15650330 15651770 chr1.921 670 2.52282
-chr1 15655458 15655571 chr1.922 330 0.017011
-chr1 15656213 15656968 chr1.923 611 1.79092
-chr1 15674755 15675864 chr1.924 788 4.39598
-chr1 15688133 15690546 chr1.925 724 3.31213
-chr1 15733832 15734032 chr1.926 375 0.106116
-chr1 15755232 15755432 chr1.928 411 0.229849
-chr1 15755792 15757966 chr1.929 723 3.30323
-chr1 15768518 15769498 chr1.930 615 1.83402
-chr1 15769591 15769971 chr1.931 443 0.378344
-chr1 15812858 15813715 chr1.932 620 1.88854
-chr1 15828323 15828328 chr1.933 310 0.002096
-chr1 15829882 15830047 chr1.934 441 0.36691
-chr1 15830227 15830286 chr1.935 445 0.389135
-chr1 15830395 15830629 chr1.936 529 0.972392
-chr1 15863863 15864128 chr1.937 458 0.465222
-chr1 15875248 15875369 chr1.938 366 0.080629
-chr1 15887454 15887600 chr1.939 385 0.135358
-chr1 15905267 15905365 chr1.940 339 0.0289332
-chr1 15905461 15908288 chr1.941 827 5.1255
-chr1 15918864 15922205 chr1.942 738 3.54094
-chr1 15958522 15958769 chr1.943 419 0.264563
-chr1 15996735 15997035 chr1.944 414 0.239623
-chr1 16021081 16022481 chr1.945 707 3.05552
-chr1 16022581 16023617 chr1.946 452 0.430443
-chr1 16037778 16038658 chr1.947 505 0.776284
-chr1 16047135 16048662 chr1.948 774 4.14074
-chr1 16066441 16066479 chr1.949 331 0.018547
-chr1 16080746 16081381 chr1.950 441 0.371092
-chr1 16084523 16084632 chr1.951 456 0.450871
-chr1 16084650 16084783 chr1.952 344 0.0365067
-chr1 16127613 16128489 chr1.953 678 2.6351
-chr1 16142110 16142395 chr1.954 480 0.603216
-chr1 16145119 16145707 chr1.955 699 2.9408
-chr1 16145724 16145764 chr1.956 468 0.521564
-chr1 16150588 16151175 chr1.957 595 1.60769
-chr1 16215862 16216336 chr1.958 441 0.369728
-chr1 16226595 16227829 chr1.959 583 1.48114
-chr1 16229788 16230117 chr1.960 487 0.64524
-chr1 16231910 16232110 chr1.961 368 0.085952
-chr1 16233262 16233351 chr1.962 427 0.297411
-chr1 16233531 16234692 chr1.963 623 1.93145
-chr1 16239119 16240074 chr1.964 604 1.71212
-chr1 16259549 16259795 chr1.965 424 0.284513
-chr1 16259815 16259883 chr1.966 459 0.471239
-chr1 16277952 16279335 chr1.967 772 4.10972
-chr1 16287820 16289983 chr1.968 719 3.23859
-chr1 16307757 16309643 chr1.969 701 2.963
-chr1 16316085 16316553 chr1.970 459 0.469429
-chr1 16335846 16336486 chr1.971 442 0.372348
-chr1 16385123 16385373 chr1.972 375 0.105099
-chr1 16385463 16385803 chr1.973 369 0.0889854
-chr1 16423272 16424769 chr1.974 754 3.80381
-chr1 16424803 16425083 chr1.975 498 0.722923
-chr1 16438330 16440076 chr1.976 711 3.11638
-chr1 16448707 16448947 chr1.977 376 0.108169
-chr1 16458706 16458814 chr1.978 401 0.189876
-chr1 16459154 16459289 chr1.979 371 0.0930393
-chr1 16459554 16459754 chr1.980 372 0.0972496
-chr1 16492328 16492973 chr1.981 564 1.29202
-chr1 16511879 16513759 chr1.982 716 3.19559
-chr1 16524480 16524580 chr1.983 370 0.091235
-chr1 16567461 16567841 chr1.984 349 0.045555
-chr1 16570611 16571718 chr1.985 689 2.79814
-chr1 16584704 16585284 chr1.986 529 0.9694
-chr1 16585413 16586501 chr1.987 591 1.55995
-chr1 16586544 16587124 chr1.988 552 1.178
-chr1 16592295 16593134 chr1.989 526 0.945032
-chr1 16605956 16607226 chr1.990 578 1.42612
-chr1 16607330 16607426 chr1.991 331 0.018543
-chr1 16650721 16651561 chr1.992 495 0.703933
-chr1 16657017 16657717 chr1.993 447 0.399027
-chr1 16663475 16664375 chr1.994 538 1.05196
-chr1 16684068 16686560 chr1.995 820 4.99284
-chr1 16687546 16687708 chr1.996 348 0.043704
-chr1 16692836 16692860 chr1.997 395 0.16956
-chr1 16692903 16693329 chr1.998 557 1.21841
-chr1 16694833 16694937 chr1.999 372 0.097097
-chr1 16696709 16696711 chr1.1000 315 0.00459888
-chr1 16696773 16697030 chr1.1001 471 0.543454
-chr1 16703861 16703878 chr1.1003 312 0.002797
-chr1 16715636 16715735 chr1.1004 370 0.092628
-chr1 16715776 16717338 chr1.1005 868 5.95332
-chr1 16719238 16720038 chr1.1006 545 1.11388
-chr1 16724525 16725049 chr1.1007 379 0.116114
-chr1 16733239 16733339 chr1.1008 329 0.016083
-chr1 16737378 16737958 chr1.1009 536 1.02924
-chr1 16738014 16738594 chr1.1010 536 1.02924
-chr1 16738684 16739164 chr1.1011 512 0.83069
-chr1 16739206 16739786 chr1.1012 536 1.02924
-chr1 16770909 16770930 chr1.1013 376 0.108583
-chr1 16771358 16771728 chr1.1014 539 1.05694
-chr1 16771773 16772096 chr1.1015 373 0.0984549
-chr1 16772128 16773528 chr1.1016 617 1.85105
diff --git a/src/test/resources/htsjdk/tribble/soapsnp.txt b/src/test/resources/htsjdk/tribble/soapsnp.txt
deleted file mode 100644
index 906408c..0000000
--- a/src/test/resources/htsjdk/tribble/soapsnp.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-chr1 00024553502 C T 8 T 34 2 2 C 0 0 0 2 2 1.00000 1.00000 1
-chr1 00032906555 T Y 0 C 34 1 1 T 0 0 0 1 1 0.00000 1.00000 1
-chr1 00043851998 T C 11 C 34 1 1 T 0 0 0 1 1 1.00000 1.00000 1
-chr1 00085336726 A G 9 G 34 1 1 A 0 0 0 1 1 1.00000 1.00000 1
-chr1 00089619960 G T 15 T 34 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr1 00150459311 T C 25 C 18 2 2 T 0 0 0 2 2 1.00000 1.00000 1
-chr1 00150542507 C M 0 C 34 1 1 G 0 0 0 1 1 0.00000 1.00000 1
-chr1 00155208036 T G 8 G 34 2 2 T 0 0 0 2 2 1.00000 1.00000 1
-chr1 00159060586 G C 15 C 34 2 2 G 0 0 0 2 2 1.00000 1.00000 1
-chr1 00159279214 G A 4 A 34 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr1 00173313412 A G 10 G 35 1 1 A 0 0 0 1 1 1.00000 1.00000 1
-chr1 00184407924 G A 12 A 34 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr1 00205302577 G A 2 A 34 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr2 00057129003 G A 1 A 35 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr2 00068399444 T G 14 G 32 1 1 T 0 0 0 1 1 1.00000 1.00000 1
-chr2 00068399489 C G 4 G 2 2 2 C 0 0 0 2 2 1.00000 1.00000 1
-chr2 00074039384 A T 11 T 34 1 1 A 0 0 0 1 1 1.00000 1.00000 1
-chr2 00099388952 C A 2 A 34 2 2 C 0 0 0 2 2 1.00000 1.00000 0
-chr2 00129970560 G A 2 A 34 2 2 G 0 0 0 2 2 1.00000 1.00000 0
-chr2 00172106557 T C 20 C 33 2 2 T 0 0 0 2 2 1.00000 1.00000 1
-chr2 00190398016 G A 6 A 34 1 1 G 0 0 0 1 1 1.00000 1.00000 1
-chr2 00202177606 C T 32 T 32 1 1 C 0 0 0 1 1 1.00000 1.00000 1
-chr2 00230378724 C A 2 A 31 2 2 C 0 0 0 2 2 1.00000 1.00000 0
-chr2 00239133677 G A 0 A 33 1 1 G 0 0 0 1 1 1.00000 1.00000 1
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part1 b/src/test/resources/htsjdk/tribble/split/test.bin.part1
deleted file mode 100644
index a128411..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part1 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part2 b/src/test/resources/htsjdk/tribble/split/test.bin.part2
deleted file mode 100644
index 011fd79..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part2 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.part3 b/src/test/resources/htsjdk/tribble/split/test.bin.part3
deleted file mode 100644
index b8aa567..0000000
Binary files a/src/test/resources/htsjdk/tribble/split/test.bin.part3 and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/split/test.bin.split b/src/test/resources/htsjdk/tribble/split/test.bin.split
deleted file mode 100644
index 8d0fb5a..0000000
--- a/src/test/resources/htsjdk/tribble/split/test.bin.split
+++ /dev/null
@@ -1,3 +0,0 @@
-test.bin.part1 4000
-test.bin.part2 4000
-test.bin.part3 4000
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz
deleted file mode 100644
index d98edfb..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi
deleted file mode 100644
index e80441b..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/YRI.trio.2010_07.indel.sites.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi
deleted file mode 100644
index 232a1a2..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/bigger.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf b/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf
deleted file mode 100644
index ab31c59..0000000
--- a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf
+++ /dev/null
@@ -1,51 +0,0 @@
-##fileformat=VCFv4.2
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA19238 NA19239 NA19240
-1 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-2 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-3 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-5 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-6 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-7 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-8 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-9 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-10 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-11 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-12 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-13 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-14 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-15 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-16 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-17 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-18 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-19 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-20 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-21 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-22 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-X 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-Y 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz
deleted file mode 100644
index 761f6a3..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/testTabixIndex.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf
deleted file mode 100644
index 39e4b90..0000000
--- a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf
+++ /dev/null
@@ -1,75 +0,0 @@
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA19238 NA19239 NA19240
-1 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-2 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-3 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-5 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-6 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-7 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-8 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-9 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-10 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-11 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-12 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-13 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-14 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-15 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-16 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-17 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-18 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-19 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-20 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-21 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-22 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-X 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-Y 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz
deleted file mode 100644
index ccda746..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi
deleted file mode 100644
index 6bc4be2..0000000
Binary files a/src/test/resources/htsjdk/tribble/tabix/trioDup.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test with spaces.vcf b/src/test/resources/htsjdk/tribble/test with spaces.vcf
deleted file mode 100644
index 27d4500..0000000
--- a/src/test/resources/htsjdk/tribble/test with spaces.vcf
+++ /dev/null
@@ -1,24 +0,0 @@
-##fileformat=VCFv4.1
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
-20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
-20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
-20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
-20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/test.bed b/src/test/resources/htsjdk/tribble/test.bed
deleted file mode 100644
index 2a68645..0000000
--- a/src/test/resources/htsjdk/tribble/test.bed
+++ /dev/null
@@ -1,9 +0,0 @@
-track name="test bed"
-#a comment
-chr1 100 101
-chr1 200 201
-chr1 300 301
-chr1 100000 100010
-chr1 100020 100040
-chr2 1 10
-chr2 20 30
diff --git a/src/test/resources/htsjdk/tribble/test.gff b/src/test/resources/htsjdk/tribble/test.gff
deleted file mode 100644
index 6a24793..0000000
--- a/src/test/resources/htsjdk/tribble/test.gff
+++ /dev/null
@@ -1,9 +0,0 @@
-#header
-#cont
-chr1 100 101
-chr1 200 201
-chr1 300 301
-chr1 100000 100010
-chr1 100020 100040
-chr2 1 10
-chr2 20 30
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz b/src/test/resources/htsjdk/tribble/test.tabix.bed.gz
deleted file mode 100644
index 7c3b419..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi b/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi
deleted file mode 100644
index b9d16c8..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.tabix.bed.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.vcf b/src/test/resources/htsjdk/tribble/test.vcf
deleted file mode 100644
index 27d4500..0000000
--- a/src/test/resources/htsjdk/tribble/test.vcf
+++ /dev/null
@@ -1,24 +0,0 @@
-##fileformat=VCFv4.1
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens",taxonomy=x>
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
-20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
-20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
-20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
-20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/test.vcf.bgz b/src/test/resources/htsjdk/tribble/test.vcf.bgz
deleted file mode 100644
index 44072dc..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.vcf.bgz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/test.vcf.gz b/src/test/resources/htsjdk/tribble/test.vcf.gz
deleted file mode 100644
index 0033290..0000000
Binary files a/src/test/resources/htsjdk/tribble/test.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/testGeliText.txt b/src/test/resources/htsjdk/tribble/testGeliText.txt
deleted file mode 100644
index 6c3d5cc..0000000
--- a/src/test/resources/htsjdk/tribble/testGeliText.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-22 14438070 A 0 0 GG 33.2618 33.2618 0 0 0 0 0 0 0 33.2618 0 0
-22 14438200 G 0 0 AA 1.1886 1.1886 1.1886 0 0 0 0 0 0 0 0 0
-22 14441250 T 0 0 CC 53.483 53.483 0 0 0 0 53.483 0 0 0 0 0
-22 14447887 G 0 0 AA 12.4813 12.4813 12.4813 0 0 0 0 0 0 0 0 0
-22 14457860 C 0 0 AA 12.4084 12.4084 12.4084 0 0 0 0 0 0 0 0 0
-22 14458514 C 0 0 TT 7.5213 7.5213 0 0 0 0 0 0 0 0 0 7.5213
-22 14461115 T 0 0 AA 16.8074 16.8074 16.8074 0 0 0 0 0 0 0 0 0
-22 14461207 G 0 0 AA 16.2602 16.2602 16.2602 0 0 0 0 0 0 0 0 0
-22 14461877 G 0 0 CC 38.4419 38.4419 0 0 0 0 38.4419 0 0 0 0 0
-22 14477581 G 0 0 CC 100.1684 100.1684 0 0 0 0 100.1684 0 0 0 0 0
-22 14478631 C 0 0 GG 183.3861 183.3861 0 0 0 0 0 0 0 183.3861 0 0
-22 14481814 T 0 0 CC 85.2846 85.2846 0 0 0 0 85.2846 0 0 0 0 0
-22 14483033 G 0 0 AA 31.8788 31.8788 31.8788 0 0 0 0 0 0 0 0 0
-22 14483299 A 0 0 GG 77.8744 77.8744 0 0 0 0 0 0 0 77.8744 0 0
-22 14485386 T 0 0 CC 74.4269 74.4269 0 0 0 0 74.4269 0 0 0 0 0
-22 14485626 C 0 0 TT 113.7914 113.7914 0 0 0 0 0 0 0 0 0 113.7914
-22 14493000 C 0 0 AA 80.076 80.076 80.076 0 0 0 0 0 0 0 0 0
-22 14493115 T 0 0 CC 13.3876 13.3876 0 0 0 0 13.3876 0 0 0 0 0
-22 14493547 C 0 0 AA 66.7446 66.7446 66.7446 0 0 0 0 0 0 0 0 0
-22 14498096 C 0 0 TT 22.2114 22.2114 0 0 0 0 0 0 0 0 0 22.2114
-22 14500486 A 0 0 CC 40.1737 40.1737 0 0 0 0 40.1737 0 0 0 0 0
-22 14500558 C 0 0 AA 9.7267 9.7267 9.7267 0 0 0 0 0 0 0 0 0
-22 14513510 T 0 0 CC 0.371 0.371 0 0 0 0 0.371 0 0 0 0 0
-22 14515016 C 0 0 TT 18.3656 18.3656 0 0 0 0 0 0 0 0 0 18.3656
-22 14515375 C 0 0 AA 8.0465 8.0465 8.0465 0 0 0 0 0 0 0 0 0
-22 14518569 T 0 0 CC 7.0936 7.0936 0 0 0 0 7.0936 0 0 0 0 0
-22 14521164 G 0 0 AA 14.6779 14.6779 14.6779 0 0 0 0 0 0 0 0 0
-22 14521784 T 0 0 AA 103.5567 103.5567 103.5567 0 0 0 0 0 0 0 0 0
-22 14523455 G 0 0 AA 111.3576 111.3576 111.3576 0 0 0 0 0 0 0 0 0
-22 14523946 A 0 0 GG 557.6265 557.6265 0 0 0 0 0 0 0 557.6265 0 0
-22 14524113 T 0 0 CC 13.5924 13.5924 0 0 0 0 13.5924 0 0 0 0 0
-22 14529743 T 0 0 AA 14.9931 14.9931 14.9931 0 0 0 0 0 0 0 0 0
-22 14529851 G 0 0 AA 36.2328 36.2328 36.2328 0 0 0 0 0 0 0 0 0
-22 14530198 C 0 0 TT 10.9314 10.9314 0 0 0 0 0 0 0 0 0 10.9314
-22 14530589 C 0 0 AA 5.7191 5.7191 5.7191 0 0 0 0 0 0 0 0 0
-22 14532450 A 0 0 GG 36.3551 36.3551 0 0 0 0 0 0 0 36.3551 0 0
-22 14532603 G 0 0 CC 1.1431 1.1431 0 0 0 0 1.1431 0 0 0 0 0
-22 14533615 A 0 0 CC 76.6265 76.6265 0 0 0 0 76.6265 0 0 0 0 0
-22 14535726 A 0 0 GG 16.5307 16.5307 0 0 0 0 0 0 0 16.5307 0 0
-22 14537455 G 0 0 TT 8.0559 8.0559 0 0 0 0 0 0 0 0 0 8.0559
-22 14539060 G 0 0 AA 11.4875 11.4875 11.4875 0 0 0 0 0 0 0 0 0
-22 14539158 A 0 0 GG 8.9543 8.9543 0 0 0 0 0 0 0 8.9543 0 0
-22 14541357 T 0 0 CC 2.2916 2.2916 0 0 0 0 2.2916 0 0 0 0 0
-22 14543758 C 0 0 TT 5.108 5.108 0 0 0 0 0 0 0 0 0 5.108
-22 14556926 T 0 0 AA 101.0105 101.0105 101.0105 0 0 0 0 0 0 0 0 0
-22 14561744 T 0 0 CC 2.4103 2.4103 0 0 0 0 2.4103 0 0 0 0 0
-22 14579503 C 0 0 TT 49.7801 49.7801 0 0 0 0 0 0 0 0 0 49.7801
-22 14582170 C 0 0 TT 37.9647 37.9647 0 0 0 0 0 0 0 0 0 37.9647
-22 14591631 T 0 0 CC 2.5744 2.5744 0 0 0 0 2.5744 0 0 0 0 0
-22 14592250 A 0 0 GG 16.8241 16.8241 0 0 0 0 0 0 0 16.8241 0 0
diff --git a/src/test/resources/htsjdk/tribble/testIntervalList.list b/src/test/resources/htsjdk/tribble/testIntervalList.list
deleted file mode 100644
index 304d8fb..0000000
--- a/src/test/resources/htsjdk/tribble/testIntervalList.list
+++ /dev/null
@@ -1,6 +0,0 @@
-chr1:1-100
-chr1:200-300
-chr1:500-600
-chr1:700-800
-chr1:900-1001
-chr1:1001-1002
diff --git a/src/test/resources/htsjdk/tribble/trio.vcf b/src/test/resources/htsjdk/tribble/trio.vcf
deleted file mode 100644
index 8a24fb2..0000000
--- a/src/test/resources/htsjdk/tribble/trio.vcf
+++ /dev/null
@@ -1,100 +0,0 @@
-##fileformat=VCFv3.2
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA19238 NA19239 NA19240
-1 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-1 4793 rs6682385 A G 1687.16 GATK_STANDARD;HARD_TO_VALIDATE AB=0.54;AC=3;AF=0.50;AN=6;DB=1;DP=242;Dels=0.00;HRun=0;MQ=77.94;MQ0=43;QD=6.97;SB=-891.19;set=filteredInBoth GT:DP:GQ 0/1:15:4.94 0/1:58:99.00 0/1:73:99.00
-1 45162 rs10399749 C T 634.21 HARD_TO_VALIDATE AB=0.63;AC=3;AF=0.50;AN=6;DB=1;DP=67;Dels=0.00;HRun=0;MQ=115.93;MQ0=7;QD=12.44;SB=-359.74;set=filteredInBoth GT:DP:GQ 1/1:6:18.05 0/0:12:35.94 0/1:35:99.00
-1 48677 . G A 1049.06 HARD_TO_VALIDATE AB=0.48;AC=2;AF=0.33;AN=6;DB=0;DP=88;Dels=0.00;HRun=1;MQ=120.08;MQ0=12;QD=14.78;SB=-423.81;set=filteredInBoth GT:DP:GQ 1/0:16:99.00 0/0:12:36.07 1/0:42:99.00
-1 56724 rs28375825 C T 65.41 GATK_STANDARD;HARD_TO_VALIDATE AB=0.88;AC=1;AF=0.50;AN=2;DB=1;DP=145;Dels=0.00;HRun=0;MQ=42.19;MQ0=140;QD=1.01;SB=-44.70;set=filteredInBoth GT:DP:GQ ./. ./. 0/1:4:16.39
-1 61969 . T C 98.69 GATK_STANDARD;HARD_TO_VALIDATE AC=2;AF=1.00;AN=2;DB=0;DP=83;Dels=0.00;HRun=0;MQ=62.34;MQ0=78;QD=2.30;SB=-40.43;set=filteredInBoth GT:DP:GQ ./. ./. 1/1:5:15.00
-1 66069 rs6672770 T C 129.77 GATK_STANDARD;HARD_TO_VALIDATE AB=0.79;AC=1;AF=0.50;AN=2;DB=1;DP=81;Dels=0.00;HRun=1;MQ=79.82;MQ0=72;QD=3.24;SB=-34.43;set=filteredInBoth GT:DP:GQ ./. ./. 1/0:8:49.36
-1 72824 . C T 442.04 HARD_TO_VALIDATE AB=0.64;AC=2;AF=0.33;AN=6;DB=0;DP=77;Dels=0.00;HRun=1;MQ=110.14;MQ0=34;QD=7.76;SB=-223.18;set=filteredInBoth GT:DP:GQ 0/1:8:45.25 0/0:6:17.89 0/1:19:99.00
-1 77053 rs1524602 G A 550.09 GATK_STANDARD;HARD_TO_VALIDATE AC=4;AF=0.67;AN=6;DB=1;DP=79;Dels=0.00;HRun=0;MQ=107.50;MQ0=42;QD=9.02;SB=-259.27;set=filteredInBoth GT:DP:GQ 1/1:1:3.00 0/0:8:23.91 1/1:15:45.14
-1 77999 rs59529791 G A 405.10 GATK_STANDARD;HARD_TO_VALIDATE AB=0.54;AC=1;AF=0.50;AN=2;DB=1;DP=149;Dels=0.00;HRun=0;MQ=97.90;MQ0=125;QD=4.82;SB=-212.96;set=filteredInBoth GT:DP:GQ ./. ./. 1/0:18:99.00
-1 78032 rs940550 C T 326.66 GATK_STANDARD;HARD_TO_VALIDATE AB=0.62;AC=2;AF=0.33;AN=6;DB=1;DP=166;Dels=0.00;HRun=0;MQ=106.31;MQ0=90;QD=2.68;SB=-159.68;set=filteredInBoth GT:DP:GQ 0/1:9:55.54 0/0:13:19.59 0/1:36:99.00
-1 78201 rs55700207 G A 727.51 HARD_TO_VALIDATE AB=0.69;AC=2;AF=0.33;AN=6;DB=1;DP=156;Dels=0.00;HRun=1;MQ=123.99;MQ0=18;QD=6.11;SB=-313.22;set=filteredInBoth GT:DP:GQ 1/0:15:71.23 0/0:30:89.75 1/0:76:99.00
-1 79870 rs6600761 G A 446.08 GATK_STANDARD;HARD_TO_VALIDATE AB=0.79;AC=5;AF=0.83;AN=6;DB=1;DP=144;Dels=0.00;HRun=0;MQ=63.25;MQ0=120;QD=3.10;SB=-207.47;set=filteredInBoth GT:DP:GQ 1/1:1:3.01 1/0:4:39.73 1/1:16:1.78
-1 79914 rs7545609 C T 330.71 GATK_STANDARD;HARD_TO_VALIDATE AB=0.43;AC=3;AF=0.75;AN=4;DB=1;DP=113;Dels=0.00;HRun=1;MQ=52.52;MQ0=95;QD=3.31;SB=-87.43;set=filteredInBoth GT:DP:GQ ./. 1/1:3:8.99 0/1:11:15.70
-1 81468 rs13328714 C T 1069.45 GATK_STANDARD;HARD_TO_VALIDATE AB=0.62;AC=3;AF=0.50;AN=6;DB=1;DP=140;Dels=0.00;HRun=0;MQ=54.71;MQ0=81;QD=7.64;SB=-475.44;set=filteredInBoth GT:DP:GQ 0/1:10:34.30 0/1:6:59.37 0/1:31:84.17
-1 98093 rs9726668 C T 112.02 GATK_STANDARD;HARD_TO_VALIDATE AC=2;AF=1.00;AN=2;DB=1;DP=129;Dels=0.00;HRun=1;MQ=44.79;MQ0=116;QD=2.15;SB=-79.41;set=filteredInBoth GT:DP:GQ ./. ./. 1/1:4:12.04
-1 130294 . A T 197.39 GATK_STANDARD;HARD_TO_VALIDATE AB=0.86;AC=1;AF=0.50;AN=2;DB=0;DP=103;Dels=0.00;HRun=0;MQ=90.59;MQ0=90;QD=3.72;SB=-106.74;set=filteredInBoth GT:DP:GQ ./. ./. 0/1:11:99.00
-1 235923 . G A 594.00 HARD_TO_VALIDATE AB=0.60;AC=2;AF=0.33;AN=6;DB=0;DP=109;Dels=0.00;HRun=2;MQ=79.25;MQ0=18;QD=6.91;SB=-296.81;set=filteredInBoth GT:DP:GQ 0/0:18:52.41 1/0:21:99.00 1/0:38:99.00
-1 526849 rs9918921 G T 729.63 GATK_STANDARD;HARD_TO_VALIDATE AB=0.70;AC=3;AF=0.50;AN=6;DB=1;DP=144;Dels=0.00;HRun=1;MQ=58.35;MQ0=63;QD=5.07;SB=-386.25;set=filteredInBoth GT:DP:GQ 0/1:22:99.00 0/1:9:5.72 0/1:32:99.00
-1 554535 rs2792856 A C 460.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.98;AC=2;AF=0.33;AN=6;DB=1;DP=5992;Dels=0.00;HRun=0;MQ=24.07;MQ0=3765;QD=0.17;SB=-263.03;set=filteredInBoth GT:DP:GQ 0/1:11:11.51 0/0:1904:99.00 0/1:49:99.00
-1 555454 rs7416152 C T 337.28 GATK_STANDARD;HARD_TO_VALIDATE AB=0.69;AC=1;AF=0.17;AN=6;DB=1;DP=613;Dels=0.00;HRun=0;MQ=69.04;MQ0=411;QD=1.44;SB=-37.69;set=filteredInBoth GT:DP:GQ 0/0:28:10.08 0/0:15:44.56 0/1:45:99.00
-1 556655 rs9283152 T C 271.50 HARD_TO_VALIDATE AB=0.56;AC=3;AF=0.50;AN=6;DB=1;DP=143;Dels=0.00;HRun=0;MQ=113.17;MQ0=28;QD=1.90;SB=-150.20;set=filteredInBoth GT:DP:GQ 1/0:15:11.69 1/0:6:0.60 1/0:43:99.00
-1 556738 rs2185539 C T 969.07 GATK_STANDARD;HARD_TO_VALIDATE AB=0.98;AC=2;AF=0.33;AN=6;DB=1;DP=6824;Dels=0.00;HRun=0;MQ=14.67;MQ0=6699;QD=0.19;SB=-473.67;set=filteredInBoth GT:DP:GQ 0/1:12:41.37 0/0:10:29.98 0/1:49:99.00
-1 557239 rs1972376 G A 206.76 GATK_STANDARD;HARD_TO_VALIDATE AB=0.99;AC=2;AF=0.33;AN=6;DB=1;DP=9777;Dels=0.00;HRun=0;MQ=14.50;MQ0=9698;QD=0.03;SB=-116.61;set=filteredInBoth GT:DP:GQ 0/0:12:35.59 1/0:6:3.58 1/0:34:99.00
-1 558119 rs4098612 C T 883.08 GATK_STANDARD;HARD_TO_VALIDATE AB=0.68;AC=3;AF=0.50;AN=6;DB=1;DP=846;Dels=0.00;HRun=0;MQ=61.17;MQ0=599;QD=1.04;SB=-257.60;set=filteredInBoth GT:DP:GQ 0/1:38:99.00 0/1:29:99.00 0/1:89:99.00
-1 558554 rs8179256 T C 148.11 GATK_STANDARD;HARD_TO_VALIDATE AB=0.83;AC=2;AF=0.33;AN=6;DB=1;DP=203;Dels=0.00;HRun=1;MQ=120.71;MQ0=124;QD=0.87;SB=-66.34;set=filteredInBoth GT:DP:GQ 1/0:4:18.64 0/0:5:15.05 1/0:51:99.00
-1 558581 rs7417964 C T 290.58 GATK_STANDARD;HARD_TO_VALIDATE AB=0.82;AC=2;AF=0.33;AN=6;DB=1;DP=265;Dels=0.00;HRun=0;MQ=111.81;MQ0=79;QD=1.49;SB=-93.95;set=filteredInBoth GT:DP:GQ 0/1:13:14.08 0/0:22:47.05 0/1:77:99.00
-1 588696 . T C 218.82 GATK_STANDARD;HARD_TO_VALIDATE AB=0.54;AC=2;AF=0.33;AN=6;DB=0;DP=134;Dels=0.00;HRun=0;MQ=83.72;MQ0=47;QD=2.77;SB=-104.66;set=filteredInBoth GT:DP:GQ 1/0:24:61.33 1/0:20:99.00 0/0:26:78.22
-1 593378 . C A 251.81 GATK_STANDARD;HARD_TO_VALIDATE AB=0.79;AC=3;AF=0.50;AN=6;DB=0;DP=87;Dels=0.00;HRun=0;MQ=89.00;MQ0=57;QD=3.87;SB=-90.25;set=filteredInBoth GT:DP:GQ 0/0:1:3.01 1/1:2:6.01 1/0:18:99.00
-1 593379 . C A 264.50 GATK_STANDARD;HARD_TO_VALIDATE AB=0.80;AC=3;AF=0.50;AN=6;DB=0;DP=88;Dels=0.00;HRun=0;MQ=88.49;MQ0=59;QD=4.01;SB=-90.26;set=filteredInBoth GT:DP:GQ 0/0:2:6.02 1/1:2:6.02 1/0:17:99.00
-1 625979 rs3871845 G C 930.94 GATK_STANDARD;HARD_TO_VALIDATE AC=6;AF=1.00;AN=6;DB=1;DP=107;Dels=0.00;HRun=0;MQ=52.60;MQ0=65;QD=8.70;SB=-330.39;set=filteredInBoth GT:DP:GQ 1/1:2:6.02 1/1:13:3.64 1/1:13:39.08
-1 658074 . G A 158.20 GATK_STANDARD;HARD_TO_VALIDATE AB=0.85;AC=1;AF=0.50;AN=2;DB=0;DP=128;Dels=0.00;HRun=1;MQ=107.95;MQ0=103;QD=2.11;SB=-62.45;set=filteredInBoth GT:DP:GQ ./. ./. 1/0:18:99.00
-1 670109 . G A 261.26 SnpCluster;HARD_TO_VALIDATE AB=0.64;AC=3;AF=0.50;AN=6;DB=0;DP=50;Dels=0.00;HRun=0;MQ=57.55;MQ0=22;QD=7.92;SB=-162.18;set=filteredInBoth GT:DP:GQ 0/0:6:17.87 1/1:4:12.03 1/0:10:99.00
-1 670115 . A G 95.67 SnpCluster;HARD_TO_VALIDATE AB=0.47;AC=1;AF=0.17;AN=6;DB=0;DP=49;Dels=0.00;HRun=0;MQ=45.30;MQ0=22;QD=6.38;SB=-48.65;set=filteredInBoth GT:DP:GQ 0/1:6:17.65 0/0:4:12.03 0/0:9:27.08
-1 695744 . C T 287.83 0 AB=0.53;AC=2;AF=0.33;AN=6;DB=0;DP=115;Dels=0.00;HRun=0;MQ=134.37;MQ0=4;QD=8.72;SB=-139.69;set=Intersection GT:DP:GQ 0/1:6:39.04 0/1:17:99.00 0/0:67:99.00
-1 705134 . G C 479.55 HARD_TO_VALIDATE AB=0.46;AC=2;AF=0.33;AN=6;DB=0;DP=115;Dels=0.00;HRun=0;MQ=103.92;MQ0=31;QD=8.56;SB=-251.32;set=filteredInBoth GT:DP:GQ 1/0:7:14.41 1/0:20:99.00 0/0:40:99.00
-1 713682 rs11804171 T A 146.13 0 AB=0.49;AC=2;AF=0.33;AN=6;DB=1;DP=137;Dels=0.00;HRun=1;MQ=162.31;MQ0=7;QD=3.32;SB=-73.71;set=Intersection GT:DP:GQ 1/0:10:99.00 1/0:23:78.43 0/0:80:99.00
-1 714613 . T A 128.46 GATK_STANDARD;HARD_TO_VALIDATE AB=0.85;AC=1;AF=0.17;AN=6;DB=0;DP=312;Dels=0.00;HRun=0;MQ=62.11;MQ0=223;QD=1.01;SB=-96.00;set=filteredInBoth GT:DP:GQ 0/0:8:23.94 0/0:8:24.02 1/0:30:99.00
-1 714914 . G C 1014.25 GATK_STANDARD;HARD_TO_VALIDATE AB=0.89;AC=3;AF=0.50;AN=6;DB=0;DP=1105;Dels=0.00;HRun=0;MQ=40.04;MQ0=802;QD=0.92;SB=-342.49;set=filteredInBoth GT:DP:GQ 1/0:19:99.00 1/0:63:99.00 1/0:121:99.00
-1 714919 . C T 182.40 GATK_STANDARD;HARD_TO_VALIDATE AB=0.93;AC=2;AF=0.33;AN=6;DB=0;DP=1718;Dels=0.00;HRun=1;MQ=31.70;MQ0=1407;QD=0.14;SB=-70.23;set=filteredInBoth GT:DP:GQ 0/0:16:13.44 0/1:47:99.00 0/1:116:71.35
-1 715102 . C T 464.73 SnpCluster;GATK_STANDARD;HARD_TO_VALIDATE AB=0.91;AC=2;AF=0.33;AN=6;DB=0;DP=1683;Dels=0.00;HRun=1;MQ=35.16;MQ0=913;QD=0.40;SB=-83.11;set=filteredInBoth GT:DP:GQ 0/0:84:37.60 0/1:133:36.77 0/1:137:99.00
-1 715843 . C T 246.91 SnpCluster;GATK_STANDARD;HARD_TO_VALIDATE AB=0.57;AC=3;AF=0.75;AN=4;DB=0;DP=573;Dels=0.00;HRun=1;MQ=54.60;MQ0=530;QD=0.60;SB=-78.54;set=filteredInBoth GT:DP:GQ ./. 1/1:2:6.00 0/1:21:99.00
-1 716461 . A T 15831.28 GATK_STANDARD;HARD_TO_VALIDATE AB=0.39;AC=3;AF=0.50;AN=6;DB=0;DP=4568;Dels=0.00;HRun=1;MQ=25.76;MQ0=2971;QD=3.47;SB=-4224.71;set=filteredInBoth GT:DP:GQ 0/1:198:99.00 0/1:47:99.00 0/1:355:99.00
-1 716471 . A T 63.29 GATK_STANDARD;HARD_TO_VALIDATE AB=0.84;AC=2;AF=0.33;AN=6;DB=0;DP=1752;Dels=0.00;HRun=1;MQ=26.79;MQ0=1662;QD=0.05;SB=-6.09;set=filteredInBoth GT:DP:GQ 0/1:2:22.36 0/0:5:15.04 0/1:31:67.13
-1 716513 . G T 355.52 GATK_STANDARD;HARD_TO_VALIDATE AB=0.87;AC=1;AF=0.17;AN=6;DB=0;DP=432;Dels=0.00;HRun=1;MQ=67.96;MQ0=365;QD=1.74;SB=-22.88;set=filteredInBoth GT:DP:GQ 0/0:5:15.03 0/0:9:26.77 0/1:37:99.00
-1 716514 . C A 297.66 GATK_STANDARD;HARD_TO_VALIDATE AB=0.90;AC=1;AF=0.17;AN=6;DB=0;DP=384;Dels=0.00;HRun=1;MQ=72.11;MQ0=313;QD=1.60;SB=-30.31;set=filteredInBoth GT:DP:GQ 0/0:6:9.42 0/0:11:24.43 1/0:38:99.00
-1 716758 . A G 95.95 GATK_STANDARD;HARD_TO_VALIDATE AB=0.51;AC=2;AF=0.33;AN=6;DB=0;DP=484;Dels=0.00;HRun=1;MQ=36.47;MQ0=449;QD=0.26;SB=-91.54;set=filteredInBoth GT:DP:GQ 0/0:1:3.01 0/1:4:18.64 0/1:17:99.00
-1 723728 . A G 314.08 GATK_STANDARD;HARD_TO_VALIDATE AB=0.56;AC=2;AF=0.33;AN=6;DB=0;DP=87;Dels=0.00;HRun=2;MQ=78.26;MQ0=55;QD=4.69;SB=-169.71;set=filteredInBoth GT:DP:GQ 0/0:3:8.98 0/1:5:19.54 0/1:16:99.00
-1 726158 . A T 365.11 0 AB=0.53;AC=2;AF=0.33;AN=6;DB=0;DP=73;Dels=0.01;HRun=6;MQ=84.48;MQ0=0;QD=8.11;SB=-183.35;set=Intersection GT:DP:GQ 0/1:17:99.00 0/1:23:99.00 0/0:26:75.17
diff --git a/src/test/resources/htsjdk/tribble/trio.vcf.idx b/src/test/resources/htsjdk/tribble/trio.vcf.idx
deleted file mode 100644
index b3aaaff..0000000
Binary files a/src/test/resources/htsjdk/tribble/trio.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/trioDup.vcf b/src/test/resources/htsjdk/tribble/trioDup.vcf
deleted file mode 100644
index 39e4b90..0000000
--- a/src/test/resources/htsjdk/tribble/trioDup.vcf
+++ /dev/null
@@ -1,75 +0,0 @@
-##fileformat=VCFv3.3
-##FILTER=GATK_STANDARD,"AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10,AB > 0.75 || DP > 360 || MQ0 > 40 || SB > -0.10"
-##FILTER=HARD_TO_VALIDATE,"MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1),MQ0 >= 4 && ((MQ0 / (1.0 * DP)) > 0.1)"
-##FILTER=SnpCluster,"SNPs found in clusters,SNPs found in clusters,SNPs found in clusters"
-##FILTER=match-0,"(set eq 'Intersection' || set eq 'filteredInBoth')"
-##FORMAT=DP,1,Integer,"Read Depth (only filtered reads used for calling)"
-##FORMAT=GQ,1,Integer,"Genotype Quality"
-##FORMAT=GT,1,String,"Genotype"
-##INFO=AB,1,Float,"Allele Balance for hets (ref/(ref+alt))"
-##INFO=AC,1,Integer,"Allele count in genotypes, for each ALT allele, in the same order as listed"
-##INFO=AF,1,Float,"Allele Frequency"
-##INFO=AN,1,Integer,"Total number of alleles in called genotypes"
-##INFO=DB,1,Integer,"dbSNP membership"
-##INFO=DP,1,Integer,"Total Depth"
-##INFO=Dels,1,Float,"Fraction of Reads Containing Spanning Deletions"
-##INFO=HRun,1,Integer,"Largest Contiguous Homopolymer Run of Variant Allele In Either Direction"
-##INFO=MQ,1,Float,"RMS Mapping Quality"
-##INFO=MQ0,1,Integer,"Total Mapping Quality Zero Reads"
-##INFO=QD,1,Float,"Variant Confidence/Quality by Depth"
-##INFO=SB,1,Float,"Strand Bias"
-##NA19238=../depthFilter/filtered.NA19238.chromX.SLX.maq.SRP000032.2009_07.glf
-##NA19239=../depthFilter/filtered.NA19239.chromX.SLX.maq.SRP000032.2009_11.glf
-##NA19240=../merged/NA19240.chromX.merged.glf
-##UG_assume_single_sample_reads=null
-##UG_base_model=EMPIRICAL
-##UG_genotype=false
-##UG_genotype_model=JOINT_ESTIMATE
-##UG_heterozygosity=0.0010
-##UG_include_experimental_annotations=false
-##UG_max_deletion_fraction=0.05
-##UG_max_mismatches_in_40bp_window=3
-##UG_min_base_quality_score=10
-##UG_min_confidence_threshold=50.0
-##UG_min_mapping_quality_score=10
-##UG_noSLOD=false
-##UG_output_all_callable_bases=false
-##UG_platform=SOLID
-##UG_poolSize=0
-##UG_use_reads_with_bad_mates=false
-##maxTotalDepth=1000
-##minMapQuality=30
-##minPosterior=0.9990
-##minTotalDepth=0
-##program=glfTrio
-##reference=human_b36_both.fasta
-##source=UnifiedGenotyper
-##source=VariantFiltration
-##source=VariantSelect
-##versionDate=Sun Sep 20 17:38:54 2009
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA19238 NA19239 NA19240
-1 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-2 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-3 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-4 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-5 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-6 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-7 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-8 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-9 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-10 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-11 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-12 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-13 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-14 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-15 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-16 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-17 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-18 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-19 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-20 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-21 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-22 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-X 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
-Y 327 . T C 666.18 GATK_STANDARD;HARD_TO_VALIDATE AB=0.74;AC=3;AF=0.50;AN=6;DB=0;DP=936;Dels=0.00;HRun=3;MQ=34.66;MQ0=728;QD=0.71;SB=-268.74;set=filteredInBoth GT:DP:GQ 1/0:10:62.65 1/0:37:99.00 1/0:53:99.00
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf b/src/test/resources/htsjdk/tribble/vcfexample.vcf
deleted file mode 100644
index 5d482c9..0000000
--- a/src/test/resources/htsjdk/tribble/vcfexample.vcf
+++ /dev/null
@@ -1,12 +0,0 @@
-##format=VCRv3.2
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=1000GenomesPilot-NCBI36
-##phasing=partial
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-20 14370 rs6054257 G A 29 0 NS=58;DP=258;AF=0.786 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5
-20 15330 . T A 3 q10 NS=55;DP=202;AF=0.024 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
-20 111096 rs6040355 A G 67 0 NS=55;DP=276;AF=0.421,0.579;AA=T GT:GQ:DP:HQ 1|0:21:6:23,27 0|1:2:0:18,2 0/0:35:4
-20 120237 . T . 47 0 NS=57;DP=257;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
-20 123456 microsat1 G D4 50 0 NS=55;DP=250;AA=G GT:GQ:DP 0/1:35:4 0/1:17:2 1/1:40:3
-20 123457 microsat1 G IGA 50 0 NS=55;DP=250;AA=G GT:GQ:DP 0/1:35:4 0/1:17:2 1/1:40:3
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz
deleted file mode 100644
index 9d2b1d0..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi b/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi
deleted file mode 100644
index 194073c..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.gz.tbi and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz
deleted file mode 100644
index eaeb499..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz b/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz
deleted file mode 100644
index bbea6c9..0000000
Binary files a/src/test/resources/htsjdk/tribble/vcfexample.vcf.truncated.hdr.gz and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/HiSeq.10000.vcf b/src/test/resources/htsjdk/variant/HiSeq.10000.vcf
deleted file mode 100644
index a304ba2..0000000
--- a/src/test/resources/htsjdk/variant/HiSeq.10000.vcf
+++ /dev/null
@@ -1,10001 +0,0 @@
-##fileformat=VCFv4.0
-##FILTER=<ID=ABFilter,Description="AB 0.75 && DP 40">
-##FILTER=<ID=DPFilter,Description="DP 120 || SB -0.10">
-##FILTER=<ID=FDRtranche0.00to0.10,Description="FDR tranche level at qual 0.06">
-##FILTER=<ID=FDRtranche0.10to1.00,Description="FDR tranche level at qual 0.03">
-##FILTER=<ID=FDRtranche1.00to2.00,Description="FDR tranche level at qual 0.02">
-##FILTER=<ID=FDRtranche2.00to10.00+,Description="FDR tranche level at qual > 0.06">
-##FILTER=<ID=FDRtranche2.00to10.00,Description="FDR tranche level at qual unknown">
-##FILTER=<ID=HARD_TO_VALIDATE,Description="MQ0 = 4 && ((MQ0 / (1.0 * DP)) 0.1)">
-##FILTER=<ID=Indel,Description="Overlaps a user-input mask">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=LowQual,Description="QUAL 50.0">
-##FILTER=<ID=SnpCluster,Description="SNPs found in clusters">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth (only filtered reads used for calling)">
-##FORMAT=<ID=GL,Number=3,Type=Float,Description="Log-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; not applicable if site is not biallelic">
-##FORMAT=<ID=GQ,Number=1,Type=Float,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##INFO=<ID=AC,Number=.,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with two (and only two) segregating haplotypes">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=OQ,Number=1,Type=Float,Description="The original variant quality score">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-23/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-24/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-5/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessi [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf, mask,Bed,wgs.v9/HiSeq.WGS.cleaned.indels.10.mask] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.in [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf err=null outerr=null filterZeroMappingQualityReads=false dow [...]
-##source=VariantOptimizer
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878
-chr1 109 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1019;Dels=0.00;HRun=0;HaplotypeScore=686.65;MQ=19.20;MQ0=288;OQ=2175.54;QD=2.13;SB=-1042.18 GT:AD:DP:GL:GQ 0/1:610,327:308:-316.30,-95.47,-803.03:99
-chr1 147 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=348;Dels=0.01;HRun=2;HaplotypeScore=268.66;MQ=20.23;MQ0=105;OQ=196.24;QD=0.56;SB=-76.48 GT:AD:DP:GL:GQ 0/1:294,49:118:-57.87,-34.96,-338.46:99
-chr1 177 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=432;Dels=0.02;HRun=2;HaplotypeScore=404.17;MQ=17.76;MQ0=153;OQ=697.20;QD=1.61;SB=-140.54 GT:AD:DP:GL:GQ 0/1:283,140:122:-108.58,-35.57,-292.84:99
-chr1 180 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=630;Dels=0.01;HRun=2;HaplotypeScore=495.41;MQ=14.22;MQ0=327;OQ=885.33;QD=1.41;SB=-412.44 GT:AD:DP:GL:GQ 0/1:466,154:104:-122.27,-30.46,-246.17:99
-chr1 234 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=336;Dels=0.00;HRun=1;HaplotypeScore=423.95;MQ=19.45;MQ0=111;OQ=596.60;QD=1.78;SB=-230.12 GT:AD:DP:GL:GQ 0/1:267,67:106:-94.87,-31.93,-297.68:99
-chr1 235 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=391.04;MQ=19.68;MQ0=106;OQ=580.03;QD=1.78;SB=-219.50 GT:AD:DP:GL:GQ 0/1:274,47:105:-99.60,-38.31,-293.27:99
-chr1 250 . A C 22.88 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=182;Dels=0.01;HRun=3;HaplotypeScore=244.83;MQ=21.91;MQ0=52;QD=0.13;SB=-23.67 GT:AD:DP:GL:GQ 0/1:148,33:70:-26.66,-21.09,-215.78:55.69
-chr1 291 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=284.50;MQ=20.72;MQ0=39;OQ=529.94;QD=3.93;SB=-160.31 GT:AD:DP:GL:GQ 0/1:87,43:32:-69.55,-13.28,-54.44:99
-chr1 297 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=214.52;MQ=20.93;MQ0=36;OQ=101.21;QD=0.82;SB=-38.97 GT:AD:DP:GL:GQ 0/1:98,15:30:-33.20,-19.79,-87.91:99
-chr1 309 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=153.70;MQ=21.12;MQ0=35;OQ=53.98;QD=0.46;SB=-50.01 GT:AD:DP:GL:GQ 0/1:103,9:32:-18.33,-9.64,-96.32:86.82
-chr1 321 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=612.30;MQ=19.11;MQ0=29;OQ=136.39;QD=0.67;SB=-61.25 GT:AD:DP:GL:GQ 0/1:171,23:33:-33.14,-16.22,-92.98:99
-chr1 327 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=3;HaplotypeScore=227.75;MQ=19.74;MQ0=24;OQ=143.34;QD=0.69;SB=-63.56 GT:AD:DP:GL:GQ 0/1:183,21:38:-34.61,-16.99,-113.13:99
-chr1 352 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=325;Dels=0.00;HRun=1;HaplotypeScore=437.89;MQ=18.90;MQ0=142;OQ=774.23;QD=2.38;SB=-355.54 GT:AD:DP:GL:GQ 0/1:238,84:81:-104.82,-24.11,-183.81:99
-chr1 354 . C A 24.89 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=486;Dels=0.01;HRun=1;HaplotypeScore=281.11;MQ=16.12;MQ0=261;QD=0.05;SB=17.54 GT:AD:DP:GL:GQ 0/1:459,24:90:-32.28,-26.51,-269.47:57.71
-chr1 469 . C A 22.04 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=82.51;MQ=26.50;MQ0=12;QD=0.39;SB=-7.00 GT:AD:DP:GL:GQ 0/1:34,21:20:-11.52,-6.03,-45.07:54.85
-chr1 664 . C G 30.66 PASS AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=50.85;QD=25.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-8.49,-0.60,-0.00:6.02
-chr1 666 . C G 10.99 LowQual AC=1;AF=0.50;AN=2;DP=1;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=10.99;SB=-10.00 GT:AD:DP:GL:GQ 0/1:0,1:1:-4.35,-0.30,-0.00:1.76
-chr1 2646 rs62635284 G A 0.15 PASS AC=2;AF=1.00;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=9.27;MQ=6.23;MQ0=107;OQ=89.13;QD=0.70;SB=-10.00 GT:AD:DP:GL:GQ 1/1:53,75:3:-12.40,-0.90,-0.00:9.03
-chr1 2979 rs62635286 T G 83.67 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=11.99;MQ0=41;OQ=300.29;QD=4.77;SB=-10.00 GT:AD:DP:GL:GQ 1/1:31,32:9:-33.61,-2.71,-0.00:27.09
-chr1 2981 rs62028691 A G 14.69 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=11.89;MQ0=42;OQ=285.31;QD=4.46;SB=-10.00 GT:AD:DP:GL:GQ 1/1:31,33:9:-32.12,-2.71,-0.00:27.08
-chr1 3759 . C A 0.19 PASS AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=9.71;MQ0=116;OQ=458.45;QD=3.14;SB=-211.61 GT:AD:DP:GL:GQ 0/1:106,40:25:-56.66,-7.53,-33.77:99
-chr1 4536 rs11582131 G C 0.18 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=9.63;MQ=12.37;MQ0=52;OQ=335.66;QD=4.48;SB=8.06 GT:AD:DP:GL:GQ 0/1:42,33:16:-41.67,-4.82,-26.29:99
-chr1 4540 . G A 47.71 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=2;HaplotypeScore=11.12;MQ=11.52;MQ0=49;QD=0.67;SB=8.05 GT:AD:DP:GL:GQ 0/1:66,5:13:-11.97,-3.92,-35.35:80.54
-chr1 4562 rs11490464 C G 0.14 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=11.28;MQ0=37;OQ=136.40;QD=2.44;SB=-10.00 GT:AD:DP:GL:GQ 0/1:26,30:9:-19.64,-2.72,-14.87:99
-chr1 4770 rs6682375 A G 0.32 PASS AC=2;AF=1.00;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=26.23;MQ0=31;OQ=2992.25;QD=24.73;SB=-1410.84 GT:AD:DP:GL:GQ 1/1:9,111:84:-306.27,-28.58,-3.46:99
-chr1 4793 rs6682385 A G 0.15 PASS AC=2;AF=1.00;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=8.98;MQ=29.61;MQ0=5;OQ=3517.41;QD=29.56;SB=-1722.01 GT:AD:DP:GL:GQ 1/1:4,115:109:-350.74,-32.88,-0.10:99
-chr1 5074 rs11586607 T G 0.01 FDRtranche2.00to10.00 AC=2;AF=1.00;AN=2;DB;DP=126;Dels=0.00;HRun=1;HaplotypeScore=24.34;MQ=21.42;MQ0=68;OQ=1230.02;QD=9.76;SB=-234.94 GT:AD:DP:GL:GQ 1/1:29,97:39:-130.41,-11.75,-3.82:79.31
-chr1 5137 rs62636497 A T 140.49 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=21.69;MQ0=25;OQ=1453.92;QD=17.73;SB=-222.33 GT:AD:DP:GL:GQ 1/1:0,74:39:-148.99,-11.75,-0.01:99
-chr1 5966 . T G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=129;Dels=0.18;HRun=5;HaplotypeScore=140.84;MQ=21.40;MQ0=8;OQ=1764.68;QD=13.68;SB=-234.42 GT:AD:DP:GL:GQ 1/1:0,106:53:-180.07,-15.66,-0.02:99
-chr1 6092 . C A 11.16 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=9.08;MQ=27.90;MQ0=10;QD=0.08;SB=14.05 GT:AD:DP:GL:GQ 0/1:125,11:94:-32.68,-28.32,-307.61:43.65
-chr1 6120 rs11489794 G C 0.46 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=27.31;MQ0=11;OQ=181.15;QD=2.01;SB=8.06 GT:AD:DP:GL:GQ 0/1:73,17:66:-41.29,-19.89,-251.91:99
-chr1 6151 rs62028673 C G 0.34 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=22.13;MQ0=10;OQ=58.79;QD=1.73;SB=-6.99 GT:AD:DP:GL:GQ 0/1:24,10:14:-13.38,-4.22,-45.26:91.62
-chr1 6241 rs17041382 T C 5.47 PASS AC=1;AF=0.50;AN=2;DB;DP=138;Dels=0.00;HRun=0;HaplotypeScore=4.98;MQ=14.62;MQ0=74;OQ=755.36;QD=5.47;SB=-258.37 GT:AD:DP:GL:GQ 0/1:39,99:33:-88.77,-9.95,-20.05:99
-chr1 6358 rs3210724 G C 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=174;Dels=0.00;HRun=0;HaplotypeScore=19.20;MQ=25.41;MQ0=15;OQ=678.86;QD=3.90;SB=-150.77 GT:AD:DP:GL:GQ 0/1:131,42:113:-105.24,-34.07,-360.44:99
-chr1 6360 rs7359297 A G 49.26 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=2;HaplotypeScore=19.20;MQ=25.54;MQ0=15;QD=0.29;SB=20.10 GT:AD:DP:GL:GQ 0/1:155,16:111:-41.64,-33.43,-398.12:82.10
-chr1 6397 rs15642 C T 157.37 PASS AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=21.39;MQ0=24;OQ=850.53;QD=7.88;SB=-122.64 GT:AD:DP:GL:GQ 0/1:45,63:33:-98.28,-9.94,-33.57:99
-chr1 7270 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=18.12;MQ=8.37;MQ0=128;OQ=66.01;QD=0.43;SB=-47.55 GT:AD:DP:GL:GQ 0/1:137,16:8:-12.30,-2.42,-14.38:98.84
-chr1 7558 rs7357853 G A 28.66 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=11.88;MQ0=88;QD=0.23;SB=-10.00 GT:AD:DP:GL:GQ 0/1:113,10:21:-12.48,-6.33,-62.63:61.49
-chr1 7609 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=4.53;MQ=19.87;MQ0=60;OQ=69.47;QD=0.58;SB=-10.00 GT:AD:DP:GL:GQ 0/1:98,22:48:-24.69,-14.46,-166.38:99
-chr1 7766 . C T 24.46 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=9.88;MQ=9.94;MQ0=60;QD=0.35;SB=-10.00 GT:AD:DP:GL:GQ 0/1:66,3:7:-7.84,-2.11,-15.08:57.28
-chr1 9089 rs28609851 T A 1.71 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=14.01;MQ0=34;OQ=172.68;QD=2.93;SB=-37.66 GT:AD:DP:GL:GQ 0/1:50,9:19:-26.28,-5.72,-45.27:99
-chr1 9185 rs2974813 C T 45.14 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=3.92;MQ0=67;QD=0.65;SB=-47.56 GT:AD:DP:GL:GQ 1/1:67,2:2:-7.92,-0.60,-0.00:6.02
-chr1 9721 rs12354145 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=2;HaplotypeScore=26.09;MQ=12.03;MQ0=77;OQ=197.90;QD=1.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:97,31:18:-28.50,-5.42,-36.05:99
-chr1 9805 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=10.83;MQ0=134;OQ=142.73;QD=0.73;SB=-10.00 GT:AD:DP:GL:GQ 0/1:171,24:24:-24.81,-7.25,-68.77:99
-chr1 9993 rs7354882 G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=155;Dels=0.00;HRun=0;HaplotypeScore=22.48;MQ=21.20;MQ0=19;OQ=727.76;QD=4.70;SB=-285.16 GT:AD:DP:GL:GQ 0/1:126,29:124:-113.46,-37.39,-308.40:99
-chr1 10108 rs6682921 G A 129.70 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=249;Dels=0.00;HRun=1;HaplotypeScore=98.13;MQ=8.71;MQ0=185;QD=0.52;SB=-64.03 GT:AD:DP:GL:GQ 0/1:175,74:25:-23.78,-7.53,-70.54:99
-chr1 10113 rs11490226 T C 60.45 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.00;HRun=0;HaplotypeScore=99.00;MQ=8.29;MQ0=191;QD=0.24;SB=-6.56 GT:AD:DP:GL:GQ 0/1:200,52:22:-15.96,-6.63,-68.61:93.28
-chr1 10117 . G A 27.78 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=0;HaplotypeScore=92.18;MQ=8.29;MQ0=191;QD=0.11;SB=-12.58 GT:AD:DP:GL:GQ 0/1:210,41:21:-12.39,-6.33,-58.67:60.61
-chr1 10375 rs6683179 G T 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=229;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=7.78;MQ0=173;OQ=50.55;QD=0.22;SB=-10.00 GT:AD:DP:GL:GQ 0/1:152,76:16:-13.16,-4.82,-44.89:83.39
-chr1 10410 rs11489908 A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=236;Dels=0.00;HRun=2;HaplotypeScore=3.67;MQ=7.06;MQ0=196;OQ=84.39;QD=0.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:188,48:18:-17.15,-5.42,-52.83:99
-chr1 16862 rs376349 A G 0.50 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=2.47;MQ=20.73;MQ0=3;OQ=399.27;QD=24.95;SB=-188.41 GT:AD:DP:GL:GQ 1/1:2,14:12:-43.52,-3.61,-0.00:36.11
-chr1 18110 rs4413987 G A 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.00;HRun=0;HaplotypeScore=6.99;MQ=6.98;MQ0=101;OQ=80.12;QD=0.70;SB=-10.00 GT:AD:DP:GL:GQ 0/1:95,19:5:-12.80,-1.51,-7.39:58.87
-chr1 18357 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=8.76;MQ=5.01;MQ0=96;OQ=60.18;QD=0.60;SB=-6.99 GT:AD:DP:GL:GQ 0/1:80,21:4:-10.51,-1.20,-3.97:27.63
-chr1 18421 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=23.14;MQ=14.44;MQ0=48;OQ=339.38;QD=4.35;SB=-90.89 GT:AD:DP:GL:GQ 0/1:55,23:25:-44.76,-7.53,-46.87:99
-chr1 18426 rs4099234 A G 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=22.14;MQ=14.77;MQ0=46;OQ=857.23;QD=11.13;SB=-429.56 GT:AD:DP:GL:GQ 1/1:24,53:25:-89.32,-7.53,-0.01:75.22
-chr1 18451 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=15;HaplotypeScore=19.76;MQ=19.64;MQ0=16;OQ=152.23;QD=2.67;SB=-85.40 GT:AD:DP:GL:GQ 0/1:45,12:33:-28.45,-9.95,-82.12:99
-chr1 18454 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=47.13;MQ=19.20;MQ0=19;OQ=58.45;QD=0.99;SB=-20.71 GT:AD:DP:GL:GQ 0/1:53,6:35:-19.67,-10.55,-115.15:91.28
-chr1 18526 rs2418705 T A 37.69 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=4.16;MQ0=59;QD=0.62;SB=-10.00 GT:AD:DP:GL:GQ 1/1:52,9:2:-7.18,-0.60,-0.00:6.02
-chr1 18698 rs3871714 A G 0.86 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=9.06;MQ0=38;OQ=98.37;QD=2.19;SB=-10.00 GT:AD:DP:GL:GQ 1/1:27,18:4:-13.37,-1.21,-0.00:12.03
-chr1 18726 rs16924801 C A 45.81 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=3.57;MQ=10.40;MQ0=25;QD=1.27;SB=-10.00 GT:AD:DP:GL:GQ 1/1:31,5:2:-7.99,-0.60,-0.00:6.02
-chr1 20391 rs4248192 C T 0.40 PASS AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=17.17;MQ0=74;OQ=114.21;QD=1.08;SB=-10.00 GT:AD:DP:GL:GQ 0/1:95,11:32:-24.34,-9.64,-88.28:99
-chr1 20411 rs62028215 T G 8.08 PASS AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.84;MQ=18.51;MQ0=71;OQ=573.84;QD=5.26;SB=-10.00 GT:AD:DP:GL:GQ 0/1:56,53:38:-72.12,-11.45,-46.57:99
-chr1 20723 rs28673882 G C 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=0;HaplotypeScore=9.28;MQ=29.99;MQ0=37;OQ=163.32;QD=1.45;SB=40.84 GT:AD:DP:GL:GQ 0/1:100,13:69:-40.42,-20.80,-251.48:99
-chr1 20786 rs806731 G T 139.58 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=34.31;MQ0=5;OQ=1407.60;QD=31.99;SB=-624.57 GT:AD:DP:GL:GQ 1/1:0,44:38:-144.35,-11.44,-0.01:99
-chr1 21158 rs806729 A C 233.61 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.41;MQ0=5;OQ=71.14;QD=7.90;SB=-10.00 GT:AD:DP:GL:GQ 1/1:6,3:3:-10.60,-0.90,-0.00:9.03
-chr1 30569 rs62101646 G A 24.23 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=13.59;MQ0=55;QD=0.37;SB=-0.99 GT:AD:DP:GL:GQ 0/1:53,12:8:-8.12,-2.41,-18.79:57.05
-chr1 30757 rs56954914 G A 38.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=7.79;MQ0=81;QD=0.44;SB=-10.00 GT:AD:DP:GL:GQ 0/1:56,30:4:-8.31,-1.20,-6.94:57.33
-chr1 30916 . C T 44.25 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=6.25;MQ0=41;QD=1.03;SB=-10.00 GT:AD:DP:GL:GQ 1/1:40,3:2:-7.83,-0.60,-0.00:6.02
-chr1 41536 rs2531251 T C 28.51 LowQual AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=19.20;MQ0=3;QD=4.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,2:3:-7.04,-0.90,-3.46:25.52
-chr1 41761 . C A 0.43 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=27.62;MQ0=8;OQ=172.06;QD=5.55;SB=14.07 GT:AD:DP:GL:GQ 0/1:17,14:19:-26.21,-5.72,-39.58:99
-chr1 41791 . G A 3.24 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.83;MQ=30.13;MQ0=12;OQ=368.88;QD=8.20;SB=14.07 GT:AD:DP:GL:GQ 0/1:28,17:31:-49.51,-9.34,-69.71:99
-chr1 42101 rs2691277 T G 379.72 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.14;MQ0=8;OQ=1117.45;QD=27.25;SB=-498.06 GT:AD:DP:GL:GQ 1/1:0,41:32:-115.34,-9.64,-0.01:96.29
-chr1 44243 rs2691279 T C 13.38 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.42;MQ0=2;QD=0.32;SB=29.13 GT:AD:DP:GL:GQ 0/1:35,7:40:-16.65,-12.05,-143.10:46.01
-chr1 44449 . T C 10.02 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=30.96;MQ0=0;QD=0.25;SB=38.15 GT:AD:DP:GL:GQ 0/1:31,9:34:-14.48,-10.24,-121.45:42.40
-chr1 44539 rs2462492 C T 2.85 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=48.14;MQ0=0;OQ=219.90;QD=4.40;SB=-111.03 GT:AD:DP:GL:GQ 0/1:40,10:50:-40.33,-15.06,-146.68:99
-chr1 44571 . G C 349.91 SnpCluster AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=22.88;MQ=46.02;MQ0=0;QD=5.74;SB=-120.67 GT:AD:DP:GL:GQ 0/1:43,18:49:-53.04,-14.77,-155.67:99
-chr1 44573 . A T 77.97 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=5;HaplotypeScore=28.86;MQ=46.27;MQ0=0;QD=1.22;SB=18.79 GT:AD:DP:GL:GQ 0/1:55,9:53:-27.05,-15.97,-167.03:99
-chr1 44575 . T C 100.77 SnpCluster AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=36.58;MQ=45.60;MQ0=1;QD=1.53;SB=-17.16 GT:AD:DP:GL:GQ 0/1:57,9:54:-29.63,-16.27,-179.47:99
-chr1 44579 . C T 185.88 SnpCluster AC=1;AF=0.50;AN=2;DP=83;Dels=0.04;HRun=5;HaplotypeScore=85.91;MQ=43.82;MQ0=2;QD=2.24;SB=-100.05 GT:AD:DP:GL:GQ 0/1:66,14:58:-39.34,-17.47,-169.22:99
-chr1 44707 . G A 14.95 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=25.67;MQ0=14;OQ=285.82;QD=6.35;SB=-102.92 GT:AD:DP:GL:GQ 0/1:29,16:26:-39.70,-7.83,-56.06:99
-chr1 44948 . T A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=3.69;MQ=36.35;MQ0=4;OQ=152.52;QD=2.99;SB=0.17 GT:AD:DP:GL:GQ 0/1:39,12:36:-29.38,-10.84,-106.91:99
-chr1 45027 rs3091274 C A 22.40 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=21.32;MQ0=9;OQ=324.14;QD=13.51;SB=-88.90 GT:AD:DP:GL:GQ 1/1:0,24:10:-36.00,-3.01,-0.00:30.09
-chr1 45162 rs10399749 C T 268.24 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=27.59;MQ0=3;OQ=1749.04;QD=37.21;SB=-889.19 GT:AD:DP:GL:GQ 1/1:1,46:44:-178.50,-13.25,-0.01:99
-chr1 45189 rs3107975 T C 528.74 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.64;MQ0=0;OQ=1690.04;QD=36.74;SB=-682.96 GT:AD:DP:GL:GQ 1/1:0,46:46:-172.60,-13.85,-0.01:99
-chr1 45408 rs28396308 C T 25.10 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=23.65;MQ0=4;OQ=659.03;QD=19.97;SB=-174.67 GT:AD:DP:GL:GQ 1/1:0,33:17:-69.49,-5.12,-0.00:51.17
-chr1 46501 rs2691308 C T 1.65 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=36.83;MQ0=2;OQ=218.70;QD=3.22;SB=47.17 GT:AD:DP:GL:GQ 0/1:55,13:65:-44.73,-19.58,-190.42:99
-chr1 46662 rs2691309 T C 45.27 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=41.65;MQ0=3;QD=1.29;SB=26.11 GT:AD:DP:GL:GQ 0/1:27,8:32:-17.45,-9.64,-107.04:78.10
-chr1 46896 rs2691311 T C 94.73 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=47.00;MQ0=0;OQ=492.79;QD=6.48;SB=-211.35 GT:AD:DP:GL:GQ 0/1:55,21:75:-75.15,-22.59,-219.09:99
-chr1 46927 rs2548884 G A 0.20 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=44.33;MQ0=0;OQ=115.48;QD=1.89;SB=-71.32 GT:AD:DP:GL:GQ 0/1:53,8:60:-32.90,-18.07,-195.48:99
-chr1 47021 rs6658003 G C 0.57 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=8.74;MQ0=44;OQ=79.96;QD=1.45;SB=-46.90 GT:AD:DP:GL:GQ 0/1:36,19:6:-13.09,-1.81,-12.99:99
-chr1 47109 rs2691313 C G 35.94 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=36.99;MQ0=0;OQ=346.71;QD=6.80;SB=47.18 GT:AD:DP:GL:GQ 0/1:38,13:51:-53.32,-15.37,-164.95:99
-chr1 47155 . C T 135.45 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=34.92;MQ0=10;OQ=1281.86;QD=17.56;SB=-510.08 GT:AD:DP:GL:GQ 0/1:34,39:60:-149.57,-18.10,-69.03:99
-chr1 47239 rs2854673 C T 32.39 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.73;MQ0=3;OQ=244.39;QD=4.61;SB=47.16 GT:AD:DP:GL:GQ 0/1:39,14:49:-42.48,-14.76,-140.73:99
-chr1 47719 . T A 0.78 PASS AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=19.08;MQ0=29;OQ=670.79;QD=8.49;SB=-194.63 GT:AD:DP:GL:GQ 0/1:47,32:46:-84.22,-13.86,-89.29:99
-chr1 48074 rs2691335 A G 2.10 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.51;MQ0=2;OQ=156.22;QD=22.32;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:5:-19.18,-1.51,-0.00:15.05
-chr1 48634 . T C 2.39 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.66;MQ=33.49;MQ0=8;OQ=733.26;QD=12.22;SB=-133.25 GT:AD:DP:GL:GQ 0/1:32,28:50:-91.67,-15.06,-103.96:99
-chr1 50195 rs62637816 T C 137.58 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=17.45;MQ0=31;OQ=544.88;QD=7.46;SB=-273.42 GT:AD:DP:GL:GQ 0/1:46,26:42:-70.43,-12.65,-88.66:99
-chr1 50884 rs3844232 G A 43.24 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.69;MQ0=8;OQ=74.12;QD=4.12;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,7:6:-12.50,-1.81,-9.19:73.80
-chr1 51151 . T A 30.50 LowQual AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.43;MQ0=2;QD=5.08;SB=-37.96 GT:AD:DP:GL:GQ 0/1:4,2:4:-7.54,-1.20,-7.68:63.33
-chr1 51152 . A G 76.91 PASS AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.59;MQ0=2;OQ=62.44;QD=8.92;SB=-39.93 GT:AD:DP:GL:GQ 0/1:4,3:5:-11.03,-1.51,-8.33:68.29
-chr1 51305 rs2531261 A G 318.95 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.94;MQ0=3;OQ=1035.37;QD=25.88;SB=-471.86 GT:AD:DP:GL:GQ 1/1:0,40:29:-107.13,-8.73,-0.01:87.27
-chr1 51850 . A G 82.68 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=39.81;MQ0=7;OQ=720.99;QD=12.22;SB=-171.50 GT:AD:DP:GL:GQ 0/1:32,27:50:-90.45,-15.06,-94.52:99
-chr1 51852 . G C 25.49 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=40.15;MQ0=6;OQ=1021.36;QD=17.61;SB=-245.09 GT:AD:DP:GL:GQ 0/1:31,27:50:-120.48,-15.06,-101.09:99
-chr1 52066 rs28402963 T C 139.56 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=39.80;MQ0=3;OQ=684.28;QD=9.50;SB=-320.22 GT:AD:DP:GL:GQ 0/1:42,30:68:-92.19,-20.48,-169.52:99
-chr1 52134 rs28599927 A G 180.85 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=31.13;MQ0=5;OQ=314.17;QD=8.73;SB=-124.71 GT:AD:DP:GL:GQ 0/1:23,13:30:-43.74,-9.04,-73.62:99
-chr1 52441 rs2531315 G A 15.83 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.89;MQ0=7;OQ=286.62;QD=17.91;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:8:-32.24,-2.41,-0.00:24.08
-chr1 52640 rs3844233 A T 1.57 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=20.92;MQ0=32;OQ=114.33;QD=2.04;SB=-23.31 GT:AD:DP:GL:GQ 0/1:45,11:17:-19.84,-5.12,-46.79:99
-chr1 53560 . T C 39.15 PASS AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=25.49;MQ0=11;OQ=919.76;QD=11.22;SB=-454.58 GT:AD:DP:GL:GQ 0/1:47,35:69:-116.05,-20.79,-145.77:99
-chr1 54476 rs1627939 T A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=2;HaplotypeScore=1.16;MQ=27.48;MQ0=38;OQ=233.94;QD=2.36;SB=-139.05 GT:AD:DP:GL:GQ 0/1:84,15:50:-41.74,-15.06,-148.46:99
-chr1 54790 rs996010 G T 31.78 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=23.12;MQ0=20;QD=0.47;SB=29.08 GT:AD:DP:GL:GQ 0/1:55,13:40:-18.51,-12.05,-121.17:64.61
-chr1 54839 rs2854687 C T 10.60 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=27.08;MQ0=0;OQ=1633.87;QD=34.04;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,48:40:-166.98,-12.05,-0.01:99
-chr1 55660 . T C 47.12 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=8.71;MQ0=70;QD=0.52;SB=-10.00 GT:AD:DP:GL:GQ 0/1:73,17:9:-10.71,-2.71,-24.43:79.96
-chr1 55735 . T G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=7.24;MQ0=61;OQ=58.14;QD=0.81;SB=-10.00 GT:AD:DP:GL:GQ 0/1:55,17:5:-10.60,-1.51,-6.69:51.83
-chr1 56025 rs62639105 A T 0.18 PASS AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=1.00;MQ=23.00;MQ0=0;OQ=377.29;QD=31.44;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,11:12:-44.38,-3.61,-3.44:2.23
-chr1 60591 . C T 1.69 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=14.15;MQ0=46;OQ=324.67;QD=4.39;SB=-159.64 GT:AD:DP:GL:GQ 0/1:50,24:28:-44.18,-8.43,-61.59:99
-chr1 60624 . T C 29.51 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=5.38;MQ0=69;QD=0.40;SB=-6.99 GT:AD:DP:GL:GQ 0/1:53,20:3:-7.14,-0.90,-3.77:28.64
-chr1 63704 rs3020697 C T 122.92 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.04;MQ=34.36;MQ0=1;OQ=168.10;QD=12.93;SB=-51.56 GT:AD:DP:GL:GQ 1/1:0,13:6:-20.39,-1.81,-0.01:18.05
-chr1 64418 . A G 43.84 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=8.82;MQ=6.47;MQ0=82;QD=0.45;SB=-10.00 GT:AD:DP:GL:GQ 1/1:82,16:2:-7.79,-0.60,-0.00:6.02
-chr1 64433 . T A 31.10 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=7.92;MQ0=71;QD=0.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:82,12:3:-7.30,-0.90,-3.84:29.36
-chr1 64544 rs13328683 G T 4.16 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.57;MQ=18.78;MQ0=9;OQ=435.52;QD=13.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:10,22:12:-47.14,-3.61,-0.00:36.12
-chr1 67325 rs2462497 G A 48.02 LowQual AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.51;MQ0=2;QD=12.01;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,4:2:-8.21,-0.60,-0.00:6.02
-chr1 72009 . A G 32.65 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=5.60;MQ=18.28;MQ0=7;QD=1.72;SB=-38.67 GT:AD:DP:GL:GQ 0/1:14,5:11:-9.86,-3.31,-31.53:65.48
-chr1 72112 rs1851945 A G 1.46 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=25.77;MQ0=4;OQ=504.38;QD=26.55;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,15:15:-54.03,-4.52,-0.00:45.14
-chr1 72166 rs2907073 T C 81.98 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.95;MQ0=1;OQ=468.64;QD=33.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,14:13:-50.45,-3.91,-0.00:39.13
-chr1 72179 rs2260604 A C 22.50 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.51;MQ0=4;OQ=244.12;QD=17.44;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,10:10:-28.01,-3.01,-0.01:30.03
-chr1 72195 . T C 61.39 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.33;MQ0=10;OQ=206.79;QD=10.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,7:10:-26.97,-3.01,-11.90:88.90
-chr1 73690 . A G 59.97 Indel AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=8.93;MQ=23.64;MQ0=3;QD=4.28;SB=-6.99 GT:AD:DP:GL:GQ 0/1:7,7:8:-11.69,-2.41,-21.22:92.80
-chr1 73692 . G A 71.09 Indel AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=3;HaplotypeScore=9.93;MQ=23.64;MQ0=3;QD=5.08;SB=-6.99 GT:AD:DP:GL:GQ 0/1:7,7:8:-12.80,-2.41,-18.45:99
-chr1 73996 . A T 22.55 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=27.59;MQ0=22;OQ=466.23;QD=7.40;SB=-57.87 GT:AD:DP:GL:GQ 0/1:36,27:38:-61.35,-11.44,-82.94:99
-chr1 74170 rs4118012 C A 85.72 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=197.97;QD=32.99;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:6:-23.37,-1.81,-0.00:18.06
-chr1 74355 rs3871778 C G 11.43 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.46;MQ0=2;OQ=92.52;QD=18.50;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:3:-12.74,-0.90,-0.00:9.03
-chr1 74885 . G A 80.42 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=18.46;MQ0=14;OQ=538.01;QD=13.12;SB=-187.68 GT:AD:DP:GL:GQ 0/1:20,21:26:-64.92,-7.83,-36.63:99
-chr1 80719 . G A 41.54 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=8.20;MQ0=31;QD=1.19;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,2:3:-8.34,-0.91,-2.50:15.90
-chr1 81004 rs4245761 G T 39.81 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=13.75;MQ0=7;QD=3.32;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,5:2:-7.39,-0.60,-0.00:6.02
-chr1 81077 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=13;HaplotypeScore=2.26;MQ=18.21;MQ0=7;OQ=85.86;QD=5.05;SB=-62.92 GT:AD:DP:GL:GQ 0/1:11,6:5:-13.38,-1.51,-3.74:22.35
-chr1 81199 rs4245763 A T 30.68 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.70;MQ0=7;QD=3.07;SB=-10.00 GT:AD:DP:GL:GQ 1/1:6,4:2:-6.48,-0.60,-0.00:6.01
-chr1 81378 . A C 3.99 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=33.30;MQ0=0;OQ=188.72;QD=4.72;SB=-114.61 GT:AD:DP:GL:GQ 0/1:31,9:34:-32.39,-10.24,-89.64:99
-chr1 81399 rs6702460 G T 307.92 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=32.81;MQ0=0;OQ=1379.58;QD=33.65;SB=-370.87 GT:AD:DP:GL:GQ 1/1:0,41:37:-141.55,-11.14,-0.01:99
-chr1 81444 rs1524604 G A 325.75 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.68;MQ0=1;OQ=1101.93;QD=36.73;SB=-340.44 GT:AD:DP:GL:GQ 1/1:0,30:28:-113.78,-8.43,-0.01:84.28
-chr1 81611 rs4256762 C T 100.30 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=17.29;MQ0=34;OQ=684.35;QD=12.01;SB=-10.00 GT:AD:DP:GL:GQ 1/1:14,43:19:-75.91,-5.72,-3.90:18.23
-chr1 82517 . T C 0.75 PASS AC=2;AF=1.00;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=13.00;MQ0=6;OQ=70.17;QD=3.19;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,22:3:-10.51,-0.90,-0.00:9.03
-chr1 86134 . C G 0.28 PASS AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=17.64;MQ0=31;OQ=214.58;QD=2.38;SB=-33.05 GT:AD:DP:GL:GQ 0/1:81,9:51:-40.11,-15.36,-187.83:99
-chr1 88546 . G A 0.08 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.25;MQ0=8;OQ=736.28;QD=19.90;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,24:26:-84.74,-7.83,-23.08:99
-chr1 88616 rs4504463 T C 1.95 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.27;MQ0=29;OQ=80.37;QD=1.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:43,9:21:-17.65,-6.33,-64.09:99
-chr1 88704 . G A 26.43 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=13.14;MQ0=25;QD=0.76;SB=-10.00 GT:AD:DP:GL:GQ 0/1:33,2:8:-8.34,-2.41,-22.88:59.26
-chr1 88715 . A G 0.29 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.96;MQ0=21;OQ=53.96;QD=1.74;SB=-10.00 GT:AD:DP:GL:GQ 0/1:28,3:8:-11.09,-2.41,-20.54:86.80
-chr1 88808 . C T 3.03 PASS AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.56;MQ0=9;OQ=459.05;QD=18.36;SB=-49.56 GT:AD:DP:GL:GQ 1/1:1,24:12:-49.49,-3.61,-0.00:36.12
-chr1 88856 rs1851939 G A 178.37 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=30.10;MQ0=10;QD=3.64;SB=-37.62 GT:AD:DP:GL:GQ 0/1:36,12:37:-32.26,-11.14,-102.50:99
-chr1 88918 . C A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=6.89;MQ=32.20;MQ0=8;OQ=309.74;QD=3.64;SB=-68.70 GT:AD:DP:GL:GQ 0/1:64,21:74:-56.55,-22.29,-199.33:99
-chr1 88963 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=30.09;MQ=26.41;MQ0=31;OQ=291.13;QD=2.62;SB=-116.74 GT:AD:DP:GL:GQ 0/1:88,23:71:-53.80,-21.40,-203.68:99
-chr1 88966 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=24.42;MQ=26.07;MQ0=32;OQ=253.10;QD=2.32;SB=-149.24 GT:AD:DP:GL:GQ 0/1:88,21:67:-48.78,-20.19,-197.64:99
-chr1 89000 . A G 0.14 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=15.31;MQ0=39;OQ=157.34;QD=2.76;SB=-51.84 GT:AD:DP:GL:GQ 0/1:48,9:10:-22.04,-3.02,-12.09:90.71
-chr1 89029 . C T 23.46 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.84;MQ=12.16;MQ0=50;QD=0.36;SB=5.02 GT:AD:DP:GL:GQ 0/1:50,16:9:-8.34,-2.71,-21.03:56.28
-chr1 89043 . T C 25.04 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=9.57;MQ0=58;QD=0.36;SB=-0.97 GT:AD:DP:GL:GQ 0/1:54,16:6:-7.59,-1.81,-16.33:57.86
-chr1 89188 . C T 0.06 PASS AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=17.90;MQ0=10;OQ=61.10;QD=3.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,3:7:-11.50,-2.11,-14.49:93.93
-chr1 89528 . C T 1.15 PASS AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.04;MQ0=0;OQ=168.19;QD=24.03;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,6:5:-20.38,-1.51,-0.00:15.05
-chr1 90974 rs62639107 G T 14.16 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=10.20;MQ0=34;QD=0.33;SB=-0.97 GT:AD:DP:GL:GQ 0/1:33,10:6:-6.49,-1.81,-14.67:46.83
-chr1 91131 . G A 0.50 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=10.39;MQ0=55;OQ=206.73;QD=2.79;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,33:9:-26.67,-2.71,-7.60:48.84
-chr1 91212 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=134;Dels=0.01;HRun=13;HaplotypeScore=35.68;MQ=19.40;MQ0=63;OQ=147.19;QD=1.10;SB=-6.99 GT:AD:DP:GL:GQ 0/1:107,25:41:-30.37,-12.37,-109.55:99
-chr1 91252 . A C 43.23 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=1;HaplotypeScore=36.75;MQ=16.93;MQ0=85;QD=0.29;SB=-10.00 GT:AD:DP:GL:GQ 0/1:138,10:43:-20.56,-12.95,-127.64:76.06
-chr1 91549 . A G 49.47 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=15.98;MQ=27.81;MQ0=39;QD=0.24;SB=65.80 GT:AD:DP:GL:GQ 0/1:179,30:144:-51.61,-43.38,-519.29:82.31
-chr1 91758 . G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=22.49;MQ0=25;OQ=143.40;QD=2.17;SB=15.64 GT:AD:DP:GL:GQ 0/1:56,10:34:-27.86,-10.24,-97.22:99
-chr1 91835 . T C 60.94 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.01;MQ0=36;OQ=785.45;QD=10.47;SB=-10.00 GT:AD:DP:GL:GQ 0/1:43,32:33:-91.79,-9.96,-12.24:22.78
-chr1 91851 rs4109800 G C 35.73 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.96;MQ0=33;OQ=1198.57;QD=15.98;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,34:33:-133.08,-9.94,-16.89:69.53
-chr1 91938 . G A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=2.53;MQ=14.92;MQ0=47;OQ=298.50;QD=3.21;SB=-10.00 GT:AD:DP:GL:GQ 0/1:77,15:21:-39.46,-6.32,-39.15:99
-chr1 92459 rs3912701 G A 1.57 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.98;MQ=17.65;MQ0=34;OQ=809.52;QD=14.99;SB=-10.00 GT:AD:DP:GL:GQ 1/1:30,24:20:-84.54,-6.02,-0.00:60.20
-chr1 92527 rs4618909 A G 1.05 PASS AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=1;HaplotypeScore=7.26;MQ=22.11;MQ0=40;OQ=1083.35;QD=10.62;SB=-10.00 GT:AD:DP:GL:GQ 0/1:55,47:51:-126.98,-15.36,-75.91:99
-chr1 92632 rs3872168 C A 251.56 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.40;MQ0=16;OQ=274.62;QD=10.98;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,25:9:-31.05,-2.71,-0.00:27.07
-chr1 92814 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=1;HaplotypeScore=9.83;MQ=30.05;MQ0=21;OQ=659.75;QD=3.88;SB=-292.33 GT:AD:DP:GL:GQ 0/1:135,35:144:-112.64,-43.38,-415.54:99
-chr1 93070 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=8.90;MQ=17.00;MQ0=65;OQ=190.64;QD=1.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:83,17:34:-32.59,-10.25,-92.04:99
-chr1 93104 rs62642109 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=24.91;MQ=20.20;MQ0=60;OQ=819.40;QD=6.83;SB=-0.98 GT:AD:DP:GL:GQ 0/1:72,48:57:-102.42,-17.19,-99.00:99
-chr1 93113 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=17.60;MQ=21.02;MQ0=51;OQ=474.12;QD=4.23;SB=5.03 GT:AD:DP:GL:GQ 0/1:79,33:56:-67.57,-16.87,-129.01:99
-chr1 93181 . T C 7.86 PASS AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.97;MQ0=67;OQ=759.85;QD=7.17;SB=20.10 GT:AD:DP:GL:GQ 0/1:53,53:35:-89.81,-10.54,-44.53:99
-chr1 93248 rs62639110 G A 30.22 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=8.07;MQ0=76;QD=0.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:62,22:6:-8.11,-1.81,-14.17:63.05
-chr1 93307 . G A 47.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=5.80;MQ0=48;QD=0.94;SB=-10.00 GT:AD:DP:GL:GQ 1/1:44,6:2:-8.11,-0.60,-0.00:6.02
-chr1 93757 . T C 30.28 LowQual AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=10.09;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,2:2:-6.44,-0.60,-0.00:6.01
-chr1 93896 rs4287120 T C 0.17 PASS AC=2;AF=1.00;AN=2;DB;DP=174;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=4.84;MQ0=151;OQ=128.63;QD=0.74;SB=-81.37 GT:AD:DP:GL:GQ 1/1:41,133:5:-16.43,-1.51,-0.00:15.04
-chr1 93971 rs4492556 A G 12.01 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=2.58;MQ=7.18;MQ0=71;QD=0.15;SB=-31.93 GT:AD:DP:GL:GQ 0/1:47,34:7:-6.57,-2.11,-19.60:44.57
-chr1 94001 . G T 0.94 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=16.11;MQ0=45;OQ=194.11;QD=3.35;SB=-41.38 GT:AD:DP:GL:GQ 0/1:51,7:13:-26.61,-3.91,-21.51:99
-chr1 94049 rs4288537 T C 0.39 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=10.96;MQ=20.93;MQ0=24;OQ=438.79;QD=10.45;SB=-71.88 GT:AD:DP:GL:GQ 0/1:18,24:17:-52.28,-5.12,-8.24:31.18
-chr1 94088 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.06;MQ=13.40;MQ0=57;OQ=79.42;QD=1.15;SB=-38.36 GT:AD:DP:GL:GQ 0/1:64,5:10:-14.24,-3.02,-19.96:99
-chr1 94312 . C A 18.04 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=10.70;MQ0=65;QD=0.24;SB=-10.00 GT:AD:DP:GL:GQ 0/1:72,2:9:-7.79,-2.71,-24.60:50.81
-chr1 98160 rs4109806 A C 199.96 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.46;MQ0=21;OQ=505.68;QD=12.97;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,39:15:-54.16,-4.52,-0.00:45.14
-chr1 98173 . T C 2.30 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.05;MQ0=20;OQ=109.74;QD=3.05;SB=-45.95 GT:AD:DP:GL:GQ 0/1:14,22:12:-17.87,-3.61,-27.89:99
-chr1 98191 rs4109805 A G 15.99 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=16.84;MQ0=14;QD=0.50;SB=5.05 GT:AD:DP:GL:GQ 0/1:28,4:15:-9.39,-4.52,-49.05:48.72
-chr1 98276 rs4457511 T G 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=9.15;MQ=5.64;MQ0=97;OQ=125.84;QD=1.20;SB=-67.98 GT:AD:DP:GL:GQ 0/1:81,24:6:-17.67,-1.81,-3.90:20.89
-chr1 99188 . T C 0.10 PASS AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=8.00;MQ0=82;OQ=57.15;QD=0.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:85,4:6:-10.81,-1.81,-11.97:89.99
-chr1 99237 . G A 48.25 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=4.41;MQ0=117;QD=0.40;SB=-10.00 GT:AD:DP:GL:GQ 1/1:114,6:2:-8.23,-0.60,-0.00:6.02
-chr1 99503 rs4126043 T A 232.13 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.79;MQ0=3;OQ=79.29;QD=11.33;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:3:-11.42,-0.90,-0.00:9.03
-chr1 110568 rs4117992 T C 36.28 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=12.09;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-7.04,-0.60,-0.00:6.02
-chr1 110846 . C T 29.97 PASS AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=21.24;MQ0=9;OQ=175.53;QD=12.54;SB=-93.11 GT:AD:DP:GL:GQ 1/1:6,8:5:-21.11,-1.51,-0.00:15.05
-chr1 110872 rs1851943 C T 61.13 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.59;MQ0=3;OQ=127.11;QD=18.16;SB=-91.11 GT:AD:DP:GL:GQ 1/1:0,7:4:-16.25,-1.20,-0.00:12.04
-chr1 117436 . G A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=9.09;MQ0=104;OQ=195.33;QD=1.58;SB=-97.57 GT:AD:DP:GL:GQ 0/1:100,24:19:-28.54,-5.73,-40.13:99
-chr1 119192 . C G 13.29 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=6.87;MQ0=19;QD=0.58;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,8:1:-4.59,-0.30,-0.00:1.76
-chr1 125911 rs11531330 C T 87.12 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=18.40;MQ0=3;OQ=89.79;QD=11.22;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,3:3:-12.47,-0.90,-0.00:9.03
-chr1 217782 . A T 46.88 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.40;MQ0=4;QD=5.86;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:2:-8.10,-0.60,-0.00:6.02
-chr1 219536 rs6678242 A C 214.27 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.88;MQ0=9;OQ=112.38;QD=6.61;SB=-45.01 GT:AD:DP:GL:GQ 1/1:0,17:4:-14.77,-1.20,-0.00:12.04
-chr1 219731 . C T 12.21 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.96;MQ0=44;QD=0.17;SB=38.14 GT:AD:DP:GL:GQ 0/1:62,9:27:-12.61,-8.14,-82.06:44.77
-chr1 219921 rs12239119 T G 63.08 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.26;MQ0=4;OQ=606.74;QD=25.28;SB=-312.56 GT:AD:DP:GL:GQ 1/1:0,24:18:-64.26,-5.42,-0.01:54.16
-chr1 221068 rs10047119 T A 39.88 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=254;Dels=0.00;HRun=1;HaplotypeScore=6.12;MQ=8.79;MQ0=135;QD=0.16;SB=-10.00 GT:AD:DP:GL:GQ 1/1:167,87:2:-7.40,-0.60,-0.00:6.02
-chr1 221077 rs10047174 C A 38.69 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=271;Dels=0.00;HRun=0;HaplotypeScore=6.64;MQ=8.55;MQ0=150;QD=0.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:181,90:2:-7.28,-0.60,-0.00:6.02
-chr1 221092 rs10047175 C A 39.69 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=283;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=7.57;MQ0=174;QD=0.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:201,82:2:-7.38,-0.60,-0.00:6.02
-chr1 221109 rs10047121 T C 34.28 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=275;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=7.06;MQ0=184;QD=0.12;SB=-10.00 GT:AD:DP:GL:GQ 1/1:197,78:2:-6.84,-0.60,-0.00:6.02
-chr1 221318 . T A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=19.94;MQ0=85;OQ=462.52;QD=1.92;SB=39.55 GT:AD:DP:GL:GQ 0/1:212,29:108:-82.07,-32.53,-323.83:99
-chr1 221343 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=0;HaplotypeScore=2.12;MQ=22.79;MQ0=47;OQ=408.64;QD=1.57;SB=-215.29 GT:AD:DP:GL:GQ 0/1:222,38:157:-91.46,-47.31,-595.18:99
-chr1 221367 rs10047230 G A 0.14 PASS AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=11.19;MQ=25.20;MQ0=11;OQ=1571.46;QD=5.65;SB=-527.77 GT:AD:DP:GL:GQ 0/1:197,80:212:-224.34,-63.91,-509.11:99
-chr1 221389 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=260;Dels=0.00;HRun=1;HaplotypeScore=1.74;MQ=24.37;MQ0=22;OQ=840.34;QD=3.23;SB=-412.02 GT:AD:DP:GL:GQ 0/1:209,50:201:-147.86,-60.54,-597.88:99
-chr1 221420 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=1;HaplotypeScore=4.60;MQ=20.04;MQ0=77;OQ=83.18;QD=0.40;SB=26.98 GT:AD:DP:GL:GQ 0/1:192,14:117:-46.84,-35.24,-385.27:99
-chr1 222364 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.03;HRun=0;HaplotypeScore=32.96;MQ=22.76;MQ0=12;OQ=2072.95;QD=11.14;SB=59.21 GT:AD:DP:GL:GQ 0/1:70,111:137:-251.84,-41.26,-268.25:99
-chr1 222793 . C G 25.72 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=260;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=16.62;MQ0=87;QD=0.10;SB=81.54 GT:AD:DP:GL:GQ 0/1:230,30:110:-38.99,-33.14,-447.79:58.55
-chr1 223336 . C G 28.20 PASS AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=35.25;MQ0=2;OQ=1925.92;QD=21.40;SB=-854.31 GT:AD:DP:GL:GQ 0/1:39,51:87:-222.09,-26.21,-160.96:99
-chr1 224095 rs8179512 G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=229;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=15.51;MQ0=125;OQ=91.58;QD=0.40;SB=-45.96 GT:AD:DP:GL:GQ 0/1:203,26:89:-39.28,-26.84,-255.40:99
-chr1 224171 rs7195389 A G 40.71 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=269;Dels=0.00;HRun=0;HaplotypeScore=47.18;MQ=22.11;MQ0=18;QD=0.15;SB=122.50 GT:AD:DP:GL:GQ 0/1:232,36:234:-77.87,-70.51,-842.48:73.55
-chr1 224176 rs56055731 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=1;HaplotypeScore=39.67;MQ=21.41;MQ0=32;OQ=545.76;QD=1.98;SB=-248.71 GT:AD:DP:GL:GQ 0/1:242,34:226:-125.93,-68.07,-709.89:99
-chr1 224241 rs62053733 A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=0;HaplotypeScore=20.29;MQ=17.49;MQ0=74;OQ=1752.30;QD=8.11;SB=-714.08 GT:AD:DP:GL:GQ 0/1:103,113:104:-209.87,-31.36,-152.51:99
-chr1 224344 rs8179403 T A 166.23 PASS AC=1;AF=0.50;AN=2;DB;DP=163;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=23.92;MQ0=45;OQ=2824.26;QD=17.33;SB=-725.16 GT:AD:DP:GL:GQ 0/1:38,125:108:-318.26,-32.55,-66.31:99
-chr1 224419 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=18.87;MQ=14.35;MQ0=100;OQ=127.03;QD=0.68;SB=8.05 GT:AD:DP:GL:GQ 0/1:161,26:49:-30.75,-14.76,-153.48:99
-chr1 224472 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=1;HaplotypeScore=6.53;MQ=15.44;MQ0=125;OQ=992.61;QD=3.80;SB=-39.67 GT:AD:DP:GL:GQ 0/1:177,84:84:-127.86,-25.32,-192.69:99
-chr1 224623 rs7548182 A T 1.19 PASS AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=3;HaplotypeScore=1.37;MQ=26.54;MQ0=23;OQ=863.08;QD=8.07;SB=50.19 GT:AD:DP:GL:GQ 0/1:39,68:64:-108.87,-19.28,-138.61:99
-chr1 225707 rs6603780 C G 0.19 PASS AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=6.28;MQ=15.73;MQ0=150;OQ=1742.87;QD=6.27;SB=-566.38 GT:AD:DP:GL:GQ 0/1:147,131:57:-194.74,-17.17,-58.86:99
-chr1 225839 rs6422503 C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=34.58;MQ0=26;OQ=4599.62;QD=21.39;SB=-1688.57 GT:AD:DP:GL:GQ 0/1:70,145:162:-458.96,-48.79,-124.49:99
-chr1 226216 . T C 24.03 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=3.20;MQ=9.23;MQ0=93;QD=0.13;SB=-10.00 GT:AD:DP:GL:GQ 0/1:162,19:7:-7.79,-2.11,-21.54:56.85
-chr1 227048 . C A 43.64 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=9.30;MQ0=121;QD=0.28;SB=-44.79 GT:AD:DP:GL:GQ 0/1:134,21:22:-14.27,-6.63,-62.25:76.48
-chr1 227333 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=5.51;MQ=14.65;MQ0=59;OQ=58.63;QD=0.42;SB=-10.00 GT:AD:DP:GL:GQ 0/1:125,16:25:-16.68,-7.54,-70.62:91.47
-chr1 227353 . C A 20.49 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=1;HaplotypeScore=4.94;MQ=14.92;MQ0=62;QD=0.15;SB=-10.00 GT:AD:DP:GL:GQ 0/1:122,18:29:-14.07,-8.74,-90.83:53.29
-chr1 227461 rs28618397 A G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=0;HaplotypeScore=6.94;MQ=8.17;MQ0=115;OQ=63.90;QD=0.44;SB=-10.00 GT:AD:DP:GL:GQ 0/1:131,13:8:-12.09,-2.41,-14.97:96.73
-chr1 227626 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=4.92;MQ=20.49;MQ0=18;OQ=315.55;QD=1.73;SB=-168.42 GT:AD:DP:GL:GQ 0/1:163,19:138:-76.40,-41.57,-437.40:99
-chr1 227735 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=14.30;MQ=17.08;MQ0=35;OQ=66.90;QD=0.75;SB=20.77 GT:AD:DP:GL:GQ 0/1:78,11:41:-22.33,-12.35,-159.24:99
-chr1 230298 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=1;HaplotypeScore=4.58;MQ=24.72;MQ0=17;OQ=319.24;QD=2.47;SB=-97.27 GT:AD:DP:GL:GQ 0/1:109,19:104:-66.59,-31.38,-356.71:99
-chr1 230890 . G A 0.28 PASS AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=4.05;MQ=28.42;MQ0=10;OQ=452.11;QD=3.77;SB=-186.08 GT:AD:DP:GL:GQ 0/1:99,21:95:-77.11,-28.62,-272.62:99
-chr1 231027 rs1917217 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=16;HaplotypeScore=20.40;MQ=32.62;MQ0=10;OQ=363.52;QD=5.05;SB=32.11 GT:AD:DP:GL:GQ 0/1:47,24:50:-54.70,-15.07,-118.26:99
-chr1 231044 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=16;HaplotypeScore=28.71;MQ=27.06;MQ0=9;OQ=128.09;QD=1.69;SB=39.29 GT:AD:DP:GL:GQ 0/1:63,12:57:-36.63,-20.54,-166.03:99
-chr1 231045 . A T 16.10 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=26.04;MQ=26.31;MQ0=9;QD=0.22;SB=44.16 GT:AD:DP:GL:GQ 0/1:63,8:54:-21.15,-16.27,-182.36:48.82
-chr1 231183 . A G 0.09 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=8.45;MQ=28.02;MQ0=10;OQ=325.16;QD=6.25;SB=-110.63 GT:AD:DP:GL:GQ 0/1:19,32:27:-43.95,-8.15,-48.50:99
-chr1 231232 rs11490246 C T 142.56 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=27.55;MQ0=9;OQ=1010.69;QD=16.84;SB=-258.84 GT:AD:DP:GL:GQ 1/1:0,59:26:-104.66,-7.83,-0.01:78.25
-chr1 234887 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=14.30;MQ=23.11;MQ0=12;OQ=591.52;QD=2.82;SB=-248.32 GT:AD:DP:GL:GQ 0/1:173,36:184:-117.86,-55.42,-542.00:99
-chr1 235002 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=3;HaplotypeScore=1.45;MQ=7.75;MQ0=92;OQ=65.10;QD=0.63;SB=-6.99 GT:AD:DP:GL:GQ 0/1:88,15:7:-11.90,-2.11,-15.26:97.93
-chr1 235268 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=1;HaplotypeScore=31.21;MQ=26.04;MQ0=17;OQ=96.26;QD=2.53;SB=-57.31 GT:AD:DP:GL:GQ 0/1:24,12:15:-17.43,-4.52,-39.23:99
-chr1 235318 . C G 0.88 PASS AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=31.66;MQ0=1;OQ=172.25;QD=9.57;SB=-27.84 GT:AD:DP:GL:GQ 0/1:12,6:17:-25.63,-5.12,-44.90:99
-chr1 237291 rs62639107 G T 22.08 PASS AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=12.32;MQ0=83;OQ=830.85;QD=6.59;SB=-342.75 GT:AD:DP:GL:GQ 0/1:51,75:34:-96.61,-10.24,-28.48:99
-chr1 237573 . T C 21.25 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=8.41;MQ=14.44;MQ0=98;QD=0.12;SB=17.09 GT:AD:DP:GL:GQ 0/1:155,19:37:-16.55,-11.15,-125.38:54.05
-chr1 238151 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=9.86;MQ0=83;OQ=59.88;QD=0.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:91,4:10:-12.29,-3.01,-24.61:92.72
-chr1 238167 rs4109800 G C 1.40 PASS AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=9.69;MQ0=81;OQ=122.76;QD=1.31;SB=-10.00 GT:AD:DP:GL:GQ 0/1:83,11:9:-18.27,-2.71,-21.24:99
-chr1 238254 . G A 14.34 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=10.94;MQ0=73;QD=0.13;SB=-10.00 GT:AD:DP:GL:GQ 0/1:101,9:10:-7.71,-3.01,-28.55:47.01
-chr1 242992 rs4109808 G C 0.33 PASS AC=1;AF=0.50;AN=2;DB;DP=205;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=17.96;MQ0=77;OQ=316.33;QD=1.54;SB=11.07 GT:AD:DP:GL:GQ 0/1:143,62:81:-59.32,-24.40,-284.11:99
-chr1 244543 rs62639119 A G 39.09 PASS AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=13.13;MQ0=71;OQ=645.60;QD=5.98;SB=-100.72 GT:AD:DP:GL:GQ 0/1:56,52:34:-78.09,-10.25,-42.39:99
-chr1 244959 rs4096710 C T 45.82 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=3.93;MQ=13.07;MQ0=59;QD=0.54;SB=-26.62 GT:AD:DP:GL:GQ 0/1:74,11:15:-12.39,-4.52,-39.32:78.66
-chr1 245030 rs4247528 T G 34.76 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=14.80;MQ0=42;QD=0.49;SB=8.04 GT:AD:DP:GL:GQ 0/1:62,9:14:-10.98,-4.22,-38.66:67.59
-chr1 245496 . A G 44.84 LowQual AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.49;MQ0=2;QD=7.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:2:-7.89,-0.60,-0.00:6.02
-chr1 314685 . A T 13.26 PASS AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.75;MQ=14.76;MQ0=13;OQ=314.43;QD=11.65;SB=-42.39 GT:AD:DP:GL:GQ 1/1:12,15:9:-35.03,-2.71,-0.00:27.09
-chr1 314938 . G C 1.97 PASS AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=12.45;MQ0=16;OQ=80.86;QD=3.23;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,9:3:-11.58,-0.91,-0.00:9.03
-chr1 314990 . T C 42.83 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=12.15;MQ0=12;QD=2.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:10,10:2:-7.69,-0.60,-0.00:6.02
-chr1 354114 rs3905534 G T 4.20 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=1.96;MQ=17.14;MQ0=8;OQ=149.39;QD=8.30;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,8:10:-21.23,-3.01,-14.53:99
-chr1 374336 rs4959767 C G 48.85 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=9.01;MQ=5.04;MQ0=75;QD=0.57;SB=-10.00 GT:AD:DP:GL:GQ 1/1:78,7:2:-8.29,-0.60,-0.00:6.02
-chr1 374388 rs4120938 C T 0.16 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=7.85;MQ=3.88;MQ0=74;OQ=50.25;QD=0.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:76,7:2:-8.43,-0.60,-0.00:6.02
-chr1 374916 . A C 6.13 PASS AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.92;MQ0=3;OQ=209.71;QD=17.48;SB=-40.56 GT:AD:DP:GL:GQ 1/1:2,10:8:-24.56,-2.41,-0.01:24.03
-chr1 391491 . T G 33.28 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=5.85;MQ0=67;QD=0.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:70,4:3:-7.51,-0.90,-3.44:25.36
-chr1 394166 . C T 0.46 PASS AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=7.89;MQ0=95;OQ=178.49;QD=1.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:96,6:7:-23.23,-2.11,-3.57:14.61
-chr1 394272 . T G 16.31 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=17.93;MQ0=35;OQ=484.03;QD=7.81;SB=-10.00 GT:AD:DP:GL:GQ 0/1:39,23:22:-58.31,-6.63,-19.38:99
-chr1 394291 rs12121306 C T 153.03 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=16.59;MQ0=30;OQ=364.11;QD=7.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:31,16:14:-43.91,-4.22,-11.01:67.92
-chr1 394310 . C T 0.18 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=12.47;MQ0=36;OQ=147.86;QD=3.21;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,5:8:-20.48,-2.41,-10.61:81.97
-chr1 394537 . G A 2.58 PASS AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=6.78;MQ=23.70;MQ0=52;OQ=1238.38;QD=11.79;SB=-421.21 GT:AD:DP:GL:GQ 0/1:65,40:50:-142.19,-15.07,-44.99:99
-chr1 394765 . A G 0.18 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=7.43;MQ0=57;OQ=65.19;QD=1.07;SB=-10.00 GT:AD:DP:GL:GQ 0/1:58,3:4:-11.01,-1.20,-3.46:22.51
-chr1 394834 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=7.99;MQ=12.79;MQ0=47;OQ=202.79;QD=3.56;SB=-10.00 GT:AD:DP:GL:GQ 0/1:49,8:10:-26.57,-3.01,-12.50:94.91
-chr1 394837 . A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=7.99;MQ=12.80;MQ0=51;OQ=216.52;QD=3.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:48,14:11:-28.25,-3.31,-11.97:86.56
-chr1 404035 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=20.45;MQ=17.63;MQ0=51;OQ=155.60;QD=2.22;SB=-84.79 GT:AD:DP:GL:GQ 0/1:62,8:17:-23.97,-5.12,-38.73:99
-chr1 511466 rs3902909 G A 114.88 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.37;MQ0=1;OQ=299.83;QD=6.00;SB=-10.00 GT:AD:DP:GL:GQ 0/1:35,15:40:-45.34,-12.07,-85.80:99
-chr1 513688 rs61767343 C T 0.33 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=21.22;MQ0=15;OQ=264.79;QD=2.88;SB=32.01 GT:AD:DP:GL:GQ 0/1:78,14:66:-49.68,-19.91,-161.21:99
-chr1 522943 . G A 31.72 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=14;HaplotypeScore=31.16;MQ=21.11;MQ0=30;QD=0.33;SB=74.23 GT:AD:DP:GL:GQ 0/1:84,11:55:-23.03,-16.58,-166.54:64.56
-chr1 523155 . C T 20.46 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=11.23;MQ0=37;QD=0.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:56,5:10:-8.34,-3.02,-25.17:53.26
-chr1 523163 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=11.49;MQ0=30;OQ=99.30;QD=1.99;SB=-10.00 GT:AD:DP:GL:GQ 0/1:37,13:9:-15.92,-2.71,-17.34:99
-chr1 523812 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=9.50;MQ=11.52;MQ0=31;OQ=145.45;QD=2.05;SB=-10.00 GT:AD:DP:GL:GQ 0/1:61,10:10:-20.85,-3.02,-13.58:99
-chr1 523821 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=9.21;MQ=15.64;MQ0=25;OQ=121.38;QD=1.84;SB=-10.00 GT:AD:DP:GL:GQ 0/1:57,9:12:-19.04,-3.62,-21.78:99
-chr1 523868 . G A 13.34 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.79;MQ0=4;OQ=177.69;QD=5.08;SB=-10.00 GT:AD:DP:GL:GQ 0/1:21,14:15:-25.58,-4.53,-24.67:99
-chr1 524029 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=26.24;MQ0=29;OQ=72.18;QD=0.99;SB=-17.85 GT:AD:DP:GL:GQ 0/1:58,15:34:-20.75,-10.24,-100.17:99
-chr1 524055 rs6680723 C T 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=2;HaplotypeScore=11.94;MQ=30.97;MQ0=23;OQ=525.09;QD=5.30;SB=-269.67 GT:AD:DP:GL:GQ 0/1:68,31:65:-75.37,-19.58,-166.45:99
-chr1 524061 rs6680725 C T 44.53 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=14.45;MQ=31.89;MQ0=22;QD=0.42;SB=98.20 GT:AD:DP:GL:GQ 0/1:92,13:70:-28.85,-21.11,-204.21:77.37
-chr1 524105 rs2792879 C T 49.58 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=35.66;MQ0=5;QD=0.40;SB=82.58 GT:AD:DP:GL:GQ 0/1:106,18:95:-36.89,-28.65,-274.71:82.42
-chr1 524187 . G T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=13.69;MQ=38.72;MQ0=2;OQ=392.49;QD=8.18;SB=-133.62 GT:AD:DP:GL:GQ 0/1:25,22:25:-49.77,-7.23,-31.06:99
-chr1 524410 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=27.66;MQ=40.25;MQ0=9;OQ=582.52;QD=5.34;SB=-205.05 GT:AD:DP:GL:GQ 0/1:82,27:83:-86.53,-25.00,-225.34:99
-chr1 524592 rs61767348 C T 0.12 PASS AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=35.17;MQ0=0;OQ=230.33;QD=1.84;SB=-71.36 GT:AD:DP:GL:GQ 0/1:109,16:125:-63.96,-37.65,-391.79:99
-chr1 524704 . C G 0.30 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=15.62;MQ0=42;OQ=247.71;QD=3.26;SB=-10.00 GT:AD:DP:GL:GQ 0/1:63,13:16:-32.88,-4.82,-37.64:99
-chr1 525671 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=16.72;MQ=18.80;MQ0=44;OQ=189.70;QD=1.52;SB=-93.64 GT:AD:DP:GL:GQ 0/1:113,12:40:-34.30,-12.05,-118.97:99
-chr1 525779 . A G 0.63 PASS AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=22.14;MQ0=11;OQ=348.30;QD=4.15;SB=-47.83 GT:AD:DP:GL:GQ 0/1:66,18:49:-52.88,-14.76,-137.92:99
-chr1 525958 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=25.63;MQ=21.45;MQ0=28;OQ=60.59;QD=0.61;SB=-44.97 GT:AD:DP:GL:GQ 0/1:86,13:50:-24.43,-15.08,-139.15:93.42
-chr1 526007 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=23.90;MQ=27.74;MQ0=20;OQ=72.77;QD=0.52;SB=-61.14 GT:AD:DP:GL:GQ 0/1:119,22:81:-34.97,-24.41,-279.63:99
-chr1 526679 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=6.10;MQ=15.23;MQ0=50;OQ=159.06;QD=1.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:72,25:19:-24.93,-5.74,-37.85:99
-chr1 526910 . C T 33.12 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=15.09;MQ=12.21;MQ0=78;QD=0.31;SB=8.05 GT:AD:DP:GL:GQ 0/1:95,11:28:-15.03,-8.43,-86.21:65.95
-chr1 527066 rs1109924 C T 18.08 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=24.80;MQ0=20;QD=0.22;SB=56.20 GT:AD:DP:GL:GQ 0/1:74,8:55:-21.66,-16.57,-168.07:50.84
-chr1 527350 rs1105044 C T 0.77 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=5.45;MQ=30.46;MQ0=9;OQ=109.38;QD=3.91;SB=5.03 GT:AD:DP:GL:GQ 0/1:19,9:14:-18.45,-4.22,-27.73:99
-chr1 527399 . C G 0.15 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.45;MQ=22.48;MQ0=26;OQ=195.21;QD=3.42;SB=2.03 GT:AD:DP:GL:GQ 0/1:49,8:23:-29.74,-6.93,-66.80:99
-chr1 527400 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=5.09;MQ=22.50;MQ0=26;OQ=149.94;QD=2.50;SB=3.82 GT:AD:DP:GL:GQ 0/1:51,8:23:-28.15,-9.87,-58.83:99
-chr1 527445 . C G 0.06 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=15.27;MQ0=33;OQ=120.74;QD=2.05;SB=-43.89 GT:AD:DP:GL:GQ 0/1:47,12:21:-21.68,-6.33,-71.74:99
-chr1 530476 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=20.30;MQ0=34;OQ=101.99;QD=0.68;SB=16.46 GT:AD:DP:GL:GQ 0/1:135,15:110:-46.63,-33.14,-338.24:99
-chr1 534258 rs61769278 G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=9.91;MQ0=64;OQ=75.11;QD=0.62;SB=-10.00 GT:AD:DP:GL:GQ 0/1:81,40:6:-12.60,-1.81,-10.89:90.82
-chr1 534650 rs61769279 G C 10.23 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=22.82;MQ0=11;OQ=171.47;QD=4.76;SB=-10.00 GT:AD:DP:GL:GQ 0/1:26,10:21:-26.76,-6.33,-62.71:99
-chr1 536560 rs12025928 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=20.90;MQ=24.04;MQ0=6;OQ=206.19;QD=3.49;SB=8.06 GT:AD:DP:GL:GQ 0/1:26,33:37:-35.06,-11.16,-99.03:99
-chr1 536665 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=53.76;MQ=25.56;MQ0=32;OQ=200.39;QD=1.71;SB=-106.47 GT:AD:DP:GL:GQ 0/1:92,25:66:-43.22,-19.90,-241.56:99
-chr1 536668 rs61769283 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=116;Dels=0.00;HRun=0;HaplotypeScore=52.49;MQ=25.44;MQ0=31;OQ=176.14;QD=1.52;SB=-101.57 GT:AD:DP:GL:GQ 0/1:89,25:62:-39.59,-18.70,-187.95:99
-chr1 536745 rs9438485 T C 0.12 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=10.16;MQ=22.38;MQ0=21;OQ=208.92;QD=2.37;SB=-117.20 GT:AD:DP:GL:GQ 0/1:59,28:39:-35.93,-11.75,-108.78:99
-chr1 536815 rs9438487 T C 0.71 PASS AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=5.65;MQ=26.07;MQ0=22;OQ=487.78;QD=3.81;SB=-195.14 GT:AD:DP:GL:GQ 0/1:76,52:82:-76.77,-24.71,-234.35:99
-chr1 536828 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=25.55;MQ0=22;OQ=75.76;QD=0.57;SB=28.89 GT:AD:DP:GL:GQ 0/1:122,12:82:-35.59,-24.73,-235.80:99
-chr1 537100 . G A 12.85 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=13.16;MQ0=46;QD=0.12;SB=-7.00 GT:AD:DP:GL:GQ 0/1:81,22:25:-12.08,-7.53,-73.93:45.46
-chr1 537113 . C T 31 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=12.14;MQ0=51;QD=0.29;SB=-6.99 GT:AD:DP:GL:GQ 0/1:84,22:18:-11.81,-5.42,-56.12:63.83
-chr1 537596 . G A 46.75 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=23.62;MQ=12.88;MQ0=95;QD=0.28;SB=83.26 GT:AD:DP:GL:GQ 0/1:155,15:50:-23.03,-15.07,-148.87:79.59
-chr1 537643 rs9438495 T C 0.24 PASS AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=12.92;MQ0=56;OQ=64.59;QD=0.65;SB=29.12 GT:AD:DP:GL:GQ 0/1:83,15:29:-18.49,-8.74,-88.70:97.43
-chr1 540378 . T C 1.66 PASS AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=10.44;MQ0=61;OQ=250.82;QD=2.82;SB=-10.00 GT:AD:DP:GL:GQ 0/1:69,20:17:-33.49,-5.12,-26.69:99
-chr1 543605 . G A 0.71 PASS AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=19.26;MQ0=44;OQ=534.14;QD=4.38;SB=-165.55 GT:AD:DP:GL:GQ 0/1:95,27:72:-78.41,-21.71,-168.45:99
-chr1 544671 rs4120954 G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=1;HaplotypeScore=17.61;MQ=20.21;MQ0=40;OQ=184.77;QD=1.55;SB=-112.49 GT:AD:DP:GL:GQ 0/1:103,16:61:-40.15,-18.39,-172.29:99
-chr1 549231 . A G 0.07 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=20.37;MQ0=37;OQ=179.14;QD=2.21;SB=30.55 GT:AD:DP:GL:GQ 0/1:67,14:40:-33.25,-12.05,-121.81:99
-chr1 549235 . C G 0.42 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=21.34;MQ0=35;OQ=329.96;QD=4.12;SB=-9.65 GT:AD:DP:GL:GQ 0/1:65,15:43:-49.24,-12.96,-142.49:99
-chr1 549756 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=4.27;MQ=22.29;MQ0=22;OQ=255.07;QD=4.40;SB=-111.11 GT:AD:DP:GL:GQ 0/1:45,13:33:-38.73,-9.94,-83.62:99
-chr1 551019 . T G 0.10 PASS AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=26.98;MQ0=20;OQ=197.80;QD=2.50;SB=4.26 GT:AD:DP:GL:GQ 0/1:67,12:53:-39.03,-15.96,-159.29:99
-chr1 551526 rs3908981 C A 0.27 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=9.51;MQ0=72;OQ=83.63;QD=0.93;SB=-10.00 GT:AD:DP:GL:GQ 0/1:72,18:8:-14.06,-2.41,-15.23:99
-chr1 552065 . T G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=19.90;MQ0=42;OQ=77.24;QD=1.04;SB=-15.93 GT:AD:DP:GL:GQ 0/1:68,6:22:-17.64,-6.63,-61.21:99
-chr1 553226 . C T 0.19 PASS AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=3;HaplotypeScore=1.62;MQ=24.97;MQ0=44;OQ=605.74;QD=6.51;SB=-203.18 GT:AD:DP:GL:GQ 0/1:67,26:42:-76.51,-12.65,-84.24:99
-chr1 553488 . T C 0.79 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=309.81;QD=34.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:9:-34.57,-2.71,-0.00:27.09
-chr1 555282 rs55668158 C G 1.90 PASS AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=7.94;MQ=40.12;MQ0=17;OQ=1152.38;QD=10.38;SB=-595.15 GT:AD:DP:GL:GQ 0/1:77,33:92:-146.24,-27.72,-249.40:99
-chr1 555454 rs7416152 C T 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=6.80;MQ=46.34;MQ0=10;OQ=133.21;QD=0.99;SB=31.52 GT:AD:DP:GL:GQ 0/1:100,33:107:-48.84,-32.23,-339.95:99
-chr1 555839 rs9283151 C T 3.01 PASS AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.60;MQ0=9;OQ=549.78;QD=4.07;SB=-291.62 GT:AD:DP:GL:GQ 0/1:100,35:123:-95.32,-37.06,-353.94:99
-chr1 555911 rs6421780 G A 0.18 PASS AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=39.59;MQ0=14;OQ=584.19;QD=4.56;SB=-299.10 GT:AD:DP:GL:GQ 0/1:90,32:104:-93.03,-31.32,-293.74:99
-chr1 557751 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=2961;Dels=0.00;HRun=2;HaplotypeScore=55.38;MQ=12.90;MQ0=2051;OQ=15633.32;QD=5.28;SB=59.42 GT:AD:DP:GL:GQ 0/1:109,2851:490:-1562.33,-147.66,-305.00:99
-chr1 558077 . C T 9.05 PASS AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=45.73;MQ0=8;OQ=1080.95;QD=8.72;SB=-436.58 GT:AD:DP:GL:GQ 0/1:87,37:109:-144.24,-32.87,-230.68:99
-chr1 559290 rs55665739 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=606;Dels=0.00;HRun=3;HaplotypeScore=17.31;MQ=15.96;MQ0=469;OQ=1033.33;QD=1.71;SB=-487.92 GT:AD:DP:GL:GQ 0/1:561,45:103:-137.67,-31.06,-222.34:99
-chr1 559575 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=0;HaplotypeScore=67.59;MQ=29.40;MQ0=143;OQ=1081.89;QD=3.78;SB=-504.88 GT:AD:DP:GL:GQ 0/1:248,38:131:-150.96,-39.49,-301.87:99
-chr1 560501 rs3912527 T C 0.59 PASS AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=42.53;MQ0=1;OQ=256.32;QD=2.44;SB=101.36 GT:AD:DP:GL:GQ 0/1:81,24:98:-58.45,-29.53,-320.39:99
-chr1 561486 rs4951848 T G 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=3;HaplotypeScore=1.10;MQ=14.41;MQ0=91;OQ=408.98;QD=3.27;SB=-10.00 GT:AD:DP:GL:GQ 0/1:75,49:28:-52.62,-8.43,-47.04:99
-chr1 561492 rs4951847 T C 0.48 PASS AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=12.50;MQ0=93;OQ=266.80;QD=2.28;SB=-10.00 GT:AD:DP:GL:GQ 0/1:73,44:19:-35.69,-5.72,-37.10:99
-chr1 561756 rs4092521 C A 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=234;Dels=0.00;HRun=0;HaplotypeScore=3.92;MQ=28.08;MQ0=93;OQ=133.54;QD=0.57;SB=-15.37 GT:AD:DP:GL:GQ 0/1:211,23:136:-57.61,-40.97,-421.13:99
-chr1 574427 rs4317776 G T 26.75 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=197;Dels=0.00;HRun=9;HaplotypeScore=3.53;MQ=6.95;MQ0=179;QD=0.14;SB=-30.89 GT:AD:DP:GL:GQ 0/1:180,17:17:-11.08,-5.12,-48.02:59.57
-chr1 575363 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=13.77;MQ=11.89;MQ0=66;OQ=93.79;QD=0.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:97,11:18:-18.09,-5.43,-51.57:99
-chr1 575571 . A G 44.95 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=12.50;MQ0=35;QD=0.49;SB=-7.00 GT:AD:DP:GL:GQ 0/1:88,3:9:-10.49,-2.71,-23.69:77.78
-chr1 575656 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=17.86;MQ=21.34;MQ0=33;OQ=102.29;QD=0.86;SB=-15.11 GT:AD:DP:GL:GQ 0/1:101,18:60:-31.59,-18.08,-183.63:99
-chr1 577203 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=2;HaplotypeScore=18.06;MQ=18.60;MQ0=50;OQ=68.56;QD=0.90;SB=-15.46 GT:AD:DP:GL:GQ 0/1:71,5:16:-14.96,-4.82,-42.28:99
-chr1 578945 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=108;Dels=0.01;HRun=3;HaplotypeScore=26.60;MQ=35.12;MQ0=11;OQ=422.46;QD=3.91;SB=-212.09 GT:AD:DP:GL:GQ 0/1:86,21:88:-72.04,-26.51,-252.61:99
-chr1 581862 rs428603 C T 12.84 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=16.17;MQ0=62;QD=0.11;SB=5.04 GT:AD:DP:GL:GQ 0/1:112,5:25:-12.07,-7.53,-76.64:45.44
-chr1 582131 rs2808300 G T 0.12 PASS AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=20.19;MQ0=60;OQ=103.03;QD=0.77;SB=74.25 GT:AD:DP:GL:GQ 0/1:113,20:71:-34.97,-21.38,-223.52:99
-chr1 590341 . G A 2.32 PASS AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=31.66;MQ0=1;OQ=697.92;QD=5.91;SB=-148.83 GT:AD:DP:GL:GQ 0/1:88,30:101:-103.52,-30.45,-248.69:99
-chr1 591004 . C T 96.57 PASS AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.15;MQ0=0;OQ=697.04;QD=7.58;SB=-276.23 GT:AD:DP:GL:GQ 0/1:66,26:89:-99.83,-26.84,-204.19:99
-chr1 591498 rs2531322 C A 0.53 PASS AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=32.80;MQ0=0;OQ=356.51;QD=2.76;SB=131.06 GT:AD:DP:GL:GQ 0/1:108,21:125:-76.61,-37.67,-331.80:99
-chr1 592316 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=5.89;MQ=8.09;MQ0=42;OQ=58.17;QD=0.88;SB=-10.00 GT:AD:DP:GL:GQ 0/1:52,12:5:-10.61,-1.51,-6.31:48.04
-chr1 592508 rs2686868 C T 15.96 PASS AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=1;HaplotypeScore=3.16;MQ=34.52;MQ0=0;OQ=1500.76;QD=12.61;SB=-645.23 GT:AD:DP:GL:GQ 0/1:71,48:113:-187.40,-34.04,-240.50:99
-chr1 616184 rs2808330 A G 13.87 PASS AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.61;MQ0=5;OQ=348.18;QD=3.38;SB=86.31 GT:AD:DP:GL:GQ 0/1:75,28:95:-66.73,-28.63,-299.16:99
-chr1 625884 rs3857304 G A 2.14 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=6.38;MQ0=48;OQ=115.97;QD=2.23;SB=-51.67 GT:AD:DP:GL:GQ 1/1:47,5:4:-15.13,-1.21,-0.00:12.03
-chr1 625907 rs4030160 G A 213.52 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=11.50;MQ0=27;OQ=320.38;QD=8.90;SB=-93.34 GT:AD:DP:GL:GQ 1/1:25,11:9:-35.62,-2.71,-0.00:27.09
-chr1 625979 rs3871845 G C 249.04 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=11.96;MQ0=27;OQ=358.10;QD=9.68;SB=-129.40 GT:AD:DP:GL:GQ 1/1:26,11:9:-39.40,-2.71,-0.00:27.09
-chr1 626181 rs3873089 G A 177.45 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.43;MQ0=3;OQ=376.84;QD=28.99;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:10:-41.27,-3.01,-0.00:30.10
-chr1 638976 . C T 0.12 PASS AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=4.06;MQ=23.85;MQ0=8;OQ=648.49;QD=24.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,27:17:-68.44,-5.12,-0.00:51.17
-chr1 640686 . A G 25.04 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=6.84;MQ0=102;QD=0.23;SB=-10.00 GT:AD:DP:GL:GQ 0/1:98,10:6:-7.60,-1.81,-15.47:57.87
-chr1 641012 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=12.45;MQ0=138;OQ=282.66;QD=1.80;SB=-113.62 GT:AD:DP:GL:GQ 0/1:142,15:18:-36.97,-5.42,-32.71:99
-chr1 647651 . G C 91.46 PASS AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=15.14;MQ0=31;OQ=441.56;QD=9.39;SB=-238.61 GT:AD:DP:GL:GQ 1/1:28,19:11:-47.74,-3.31,-0.00:33.11
-chr1 652720 rs62639125 G A 47.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=8.82;MQ0=19;QD=1.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:13,20:2:-8.11,-0.60,-0.00:6.02
-chr1 652960 rs61769340 G C 105.13 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=20.58;MQ0=11;OQ=1522.59;QD=27.68;SB=-684.47 GT:AD:DP:GL:GQ 1/1:10,45:39:-155.88,-11.77,-0.03:99
-chr1 656406 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=11.93;MQ0=83;OQ=127.34;QD=1.14;SB=-0.98 GT:AD:DP:GL:GQ 0/1:95,17:17:-21.14,-5.12,-45.67:99
-chr1 662072 . G A 11.72 PASS AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=27.50;MQ0=7;OQ=1481.48;QD=11.06;SB=-511.41 GT:AD:DP:GL:GQ 0/1:80,54:118:-187.00,-35.57,-233.79:99
-chr1 662535 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=4.63;MQ=12.94;MQ0=86;OQ=221.86;QD=1.71;SB=-10.00 GT:AD:DP:GL:GQ 0/1:117,13:31:-34.81,-9.34,-77.61:99
-chr1 664297 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=8.91;MQ=25.89;MQ0=44;OQ=139.99;QD=0.72;SB=29.32 GT:AD:DP:GL:GQ 0/1:135,59:118:-52.83,-35.54,-396.03:99
-chr1 664319 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=1;HaplotypeScore=4.98;MQ=25.84;MQ0=39;OQ=562.89;QD=2.86;SB=-70.36 GT:AD:DP:GL:GQ 0/1:152,44:131:-101.81,-42.24,-385.33:99
-chr1 665009 . G A 0.15 PASS AC=2;AF=1.00;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=7.66;MQ=13.29;MQ0=30;OQ=394.21;QD=6.36;SB=-10.00 GT:AD:DP:GL:GQ 1/1:20,42:11:-43.01,-3.32,-0.01:33.10
-chr1 665981 . C T 314.88 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.49;MQ0=9;OQ=1228.86;QD=15.36;SB=-521.03 GT:AD:DP:GL:GQ 0/1:42,38:68:-146.65,-20.48,-114.04:99
-chr1 678857 . T C 37.39 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=9.96;MQ0=52;QD=0.58;SB=-41.94 GT:AD:DP:GL:GQ 0/1:58,5:10:-10.04,-3.02,-24.70:70.23
-chr1 681407 . T A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=56;Dels=0.00;HRun=13;HaplotypeScore=8.39;MQ=28.14;MQ0=23;OQ=991.49;QD=17.71;SB=-487.41 GT:AD:DP:GL:GQ 1/1:17,39:33:-109.19,-9.95,-6.46:34.91
-chr1 681927 . C G 40.97 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.89;MQ=4.61;MQ0=72;QD=0.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:72,2:3:-8.29,-0.90,-4.05:31.44
-chr1 684740 rs1829739 A C 31.20 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=3;HaplotypeScore=24.15;MQ=12.41;MQ0=41;QD=0.60;SB=-34.97 GT:AD:DP:GL:GQ 0/1:47,5:9:-9.12,-2.71,-21.21:64.03
-chr1 684742 . C A 14.57 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=37.61;MQ=12.41;MQ0=41;QD=0.28;SB=-31.35 GT:AD:DP:GL:GQ 0/1:46,6:9:-7.44,-2.71,-24.53:47.25
-chr1 684781 . C T 48.14 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.66;MQ=4.69;MQ0=46;QD=1.00;SB=-49.56 GT:AD:DP:GL:GQ 1/1:40,8:2:-8.22,-0.60,-0.00:6.02
-chr1 684978 . A T 38.37 PASS AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.29;MQ0=2;OQ=86.08;QD=14.35;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:3:-12.10,-0.90,-0.00:9.03
-chr1 690691 rs6685320 T A 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=41.41;MQ0=1;OQ=71.22;QD=0.76;SB=149.48 GT:AD:DP:GL:GQ 0/1:83,11:90:-37.51,-27.11,-298.94:99
-chr1 692785 . C T 0.89 PASS AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.63;MQ0=14;OQ=282.72;QD=2.30;SB=-80.41 GT:AD:DP:GL:GQ 0/1:107,16:98:-61.07,-29.52,-300.46:99
-chr1 692834 . C T 2.02 PASS AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=26.70;MQ0=10;OQ=722.71;QD=6.12;SB=-381.76 GT:AD:DP:GL:GQ 0/1:89,29:108:-108.08,-32.53,-294.03:99
-chr1 692878 rs12124557 G C 71.38 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.28;MQ0=34;OQ=350.61;QD=4.61;SB=-168.38 GT:AD:DP:GL:GQ 0/1:61,15:41:-50.70,-12.35,-126.27:99
-chr1 694230 rs9727436 T C 8.89 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=32.48;MQ0=2;OQ=333.56;QD=17.56;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,18:12:-36.95,-3.62,-0.01:36.08
-chr1 695745 . G A 102.02 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=41.82;MQ0=0;OQ=1169.68;QD=16.02;SB=-501.47 GT:AD:DP:GL:GQ 0/1:36,37:71:-141.66,-21.41,-112.07:99
-chr1 696231 rs12029736 A G 92.82 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=39.21;MQ0=1;OQ=1205.31;QD=20.78;SB=-587.73 GT:AD:DP:GL:GQ 0/1:5,53:49:-138.60,-14.79,-16.39:15.94
-chr1 696641 . G A 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=11.92;MQ=21.76;MQ0=28;OQ=1527.01;QD=18.18;SB=-47.56 GT:AD:DP:GL:GQ 1/1:26,58:39:-156.30,-11.75,-0.02:99
-chr1 704290 rs12028261 G A 67.98 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=38.97;MQ0=0;OQ=1407.21;QD=35.18;SB=-656.37 GT:AD:DP:GL:GQ 1/1:0,40:36:-144.32,-10.85,-0.01:99
-chr1 705211 rs3131984 T G 181.58 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=48.59;MQ0=0;OQ=1797.71;QD=32.69;SB=-808.10 GT:AD:DP:GL:GQ 1/1:0,55:52:-183.37,-15.66,-0.02:99
-chr1 705859 rs4614203 A T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=9;HaplotypeScore=9.09;MQ=20.66;MQ0=19;OQ=690.18;QD=13.80;SB=-46.39 GT:AD:DP:GL:GQ 1/1:1,48:20:-72.61,-6.03,-0.01:60.18
-chr1 708249 rs10900602 A G 1.62 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=25.93;MQ0=21;OQ=1118.18;QD=17.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,63:38:-115.46,-11.48,-0.05:99
-chr1 708418 rs10751453 T C 415.24 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.69;MQ0=5;OQ=1667.51;QD=27.79;SB=-566.12 GT:AD:DP:GL:GQ 1/1:4,56:54:-174.43,-16.28,-4.09:99
-chr1 710103 rs3121393 T C 439.85 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.62;MQ0=19;OQ=1791.16;QD=20.59;SB=-717.22 GT:AD:DP:GL:GQ 1/1:0,87:51:-182.72,-15.36,-0.02:99
-chr1 710660 rs3115846 G A 23.98 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=32.94;MQ0=7;OQ=1843.21;QD=32.91;SB=-738.02 GT:AD:DP:GL:GQ 1/1:0,56:47:-187.92,-14.16,-0.01:99
-chr1 713754 rs2977670 G C 680.35 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.16;MQ0=0;OQ=1954.35;QD=36.87;SB=-819.16 GT:AD:DP:GL:GQ 1/1:0,53:49:-199.05,-14.78,-0.03:99
-chr1 714052 . G A 38.81 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=27.06;MQ=47.82;MQ0=13;QD=0.40;SB=-19.66 GT:AD:DP:GL:GQ 0/1:88,9:69:-27.95,-20.79,-220.66:71.64
-chr1 714724 rs12123401 G A 77.21 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=38.16;MQ=32.18;MQ0=19;QD=1.19;SB=53.18 GT:AD:DP:GL:GQ 0/1:50,14:32:-20.64,-9.64,-97.41:99
-chr1 714732 rs12735556 C A 597.50 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=35.96;MQ=32.37;MQ0=15;QD=9.34;SB=-186.20 GT:AD:DP:GL:GQ 0/1:31,30:31:-72.37,-9.34,-42.36:99
-chr1 714734 rs12735557 C G 606.51 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=32.96;MQ=32.01;MQ0=15;QD=9.48;SB=-232.37 GT:AD:DP:GL:GQ 0/1:31,33:32:-73.58,-9.64,-63.94:99
-chr1 714811 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=105.18;MQ=32.80;MQ0=13;OQ=394.82;QD=4.11;SB=-25.79 GT:AD:DP:GL:GQ 0/1:48,48:42:-55.42,-12.65,-93.88:99
-chr1 714830 . G A 44.58 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=2;HaplotypeScore=123.02;MQ=32.55;MQ0=17;QD=0.46;SB=2.03 GT:AD:DP:GL:GQ 0/1:60,27:26:-15.57,-7.83,-82.81:77.42
-chr1 714865 . G A 118.87 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=2;HaplotypeScore=72.07;MQ=36.16;MQ0=17;QD=1.19;SB=45.52 GT:AD:DP:GL:GQ 0/1:83,11:39:-26.94,-11.77,-99.77:99
-chr1 714869 . G A 210.22 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=70.54;MQ=36.82;MQ0=18;QD=2.08;SB=89.30 GT:AD:DP:GL:GQ 0/1:78,22:52:-39.97,-15.66,-154.79:99
-chr1 714870 . G C 132.10 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=64.77;MQ=36.96;MQ0=18;QD=1.33;SB=86.32 GT:AD:DP:GL:GQ 0/1:81,18:51:-31.86,-15.37,-195.72:99
-chr1 714885 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=11.63;MQ=42.34;MQ0=19;OQ=59.67;QD=0.80;SB=57.28 GT:AD:DP:GL:GQ 0/1:59,16:42:-21.91,-12.66,-130.29:92.50
-chr1 714965 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.06;HRun=0;HaplotypeScore=109.90;MQ=37.50;MQ0=15;OQ=104.38;QD=1.12;SB=93.07 GT:AD:DP:GL:GQ 0/1:76,7:50:-34.61,-20.89,-189.48:99
-chr1 714987 . A T 75.82 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=80;Dels=0.03;HRun=1;HaplotypeScore=85.54;MQ=37.34;MQ0=12;QD=0.95;SB=77.28 GT:AD:DP:GL:GQ 0/1:70,6:44:-26.77,-15.90,-141.85:99
-chr1 714990 . A G 169.75 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=75;Dels=0.04;HRun=1;HaplotypeScore=76.84;MQ=38.08;MQ0=11;QD=2.26;SB=1.07 GT:AD:DP:GL:GQ 0/1:50,19:44:-36.22,-15.96,-136.58:99
-chr1 714991 . A G 49.83 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=75;Dels=0.01;HRun=0;HaplotypeScore=63.75;MQ=38.08;MQ0=11;QD=0.66;SB=86.30 GT:AD:DP:GL:GQ 0/1:68,6:44:-21.52,-13.26,-154.68:82.67
-chr1 714995 . C A 39.02 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=2;HaplotypeScore=68.11;MQ=38.07;MQ0=12;QD=0.54;SB=48.86 GT:AD:DP:GL:GQ 0/1:52,10:39:-31.66,-24.48,-125.33:71.86
-chr1 715012 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=28.31;MQ=43.81;MQ0=11;OQ=81.07;QD=1.33;SB=77.26 GT:AD:DP:GL:GQ 0/1:50,6:42:-27.43,-16.04,-129.03:99
-chr1 715014 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=28.31;MQ=44.76;MQ0=10;OQ=135.00;QD=2.29;SB=80.30 GT:AD:DP:GL:GQ 0/1:48,10:43:-29.74,-12.96,-149.46:99
-chr1 715704 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=1;HaplotypeScore=25.25;MQ=54.80;MQ0=2;OQ=145.06;QD=1.23;SB=-43.38 GT:AD:DP:GL:GQ 0/1:97,21:107:-50.01,-32.22,-342.89:99
-chr1 716048 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=178;Dels=0.00;HRun=1;HaplotypeScore=18.47;MQ=39.54;MQ0=8;OQ=52.50;QD=0.29;SB=34.27 GT:AD:DP:GL:GQ 0/1:78,99:81:-32.94,-24.40,-274.16:85.34
-chr1 716061 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=21.67;MQ=39.51;MQ0=6;OQ=115.15;QD=0.62;SB=43.85 GT:AD:DP:GL:GQ 0/1:135,49:85:-40.41,-25.61,-331.38:99
-chr1 716222 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=139.36;MQ=31.95;MQ0=27;OQ=92.92;QD=0.79;SB=-50.76 GT:AD:DP:GL:GQ 0/1:103,13:47:-26.73,-14.16,-149.22:99
-chr1 716344 rs3131980 T G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=39.71;MQ=55.45;MQ0=6;OQ=2415.81;QD=31.79;SB=-1086.51 GT:AD:DP:GL:GQ 1/1:2,74:68:-245.18,-20.48,-0.02:99
-chr1 716802 rs4520358 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=160;Dels=0.00;HRun=0;HaplotypeScore=127.95;MQ=28.01;MQ0=48;OQ=1542.52;QD=9.64;SB=-717.92 GT:AD:DP:GL:GQ 0/1:109,49:76:-180.46,-22.93,-134.20:99
-chr1 716807 rs3131979 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.00;HRun=1;HaplotypeScore=146.45;MQ=27.53;MQ0=52;OQ=2520.74;QD=14.92;SB=-1257.54 GT:AD:DP:GL:GQ 0/1:69,89:79:-286.20,-30.85,-56.55:99
-chr1 717392 . A G 3.52 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.37;MQ=24.74;MQ0=13;OQ=554.36;QD=8.66;SB=-175.95 GT:AD:DP:GL:GQ 0/1:36,28:38:-70.17,-11.45,-77.18:99
-chr1 717776 . A G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=36.84;MQ0=8;OQ=198.21;QD=1.82;SB=-48.31 GT:AD:DP:GL:GQ 0/1:82,26:93:-51.12,-28.02,-315.62:99
-chr1 717825 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=45.12;MQ0=3;OQ=93.24;QD=0.90;SB=-41.95 GT:AD:DP:GL:GQ 0/1:87,17:97:-41.83,-29.22,-341.26:99
-chr1 718022 rs3131978 C T 227.01 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=24.78;MQ0=12;OQ=2206.38;QD=27.93;SB=-528.20 GT:AD:DP:GL:GQ 1/1:0,79:55:-224.24,-16.57,-0.01:99
-chr1 718105 rs3131977 C G 701.77 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.42;MQ0=9;OQ=2564.24;QD=33.30;SB=-886.52 GT:AD:DP:GL:GQ 1/1:0,77:61:-260.03,-18.38,-0.02:99
-chr1 718468 rs2977661 C A 0.97 PASS AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=44.88;MQ0=1;OQ=306.65;QD=3.13;SB=125.41 GT:AD:DP:GL:GQ 0/1:81,17:92:-61.67,-27.72,-254.10:99
-chr1 719542 rs4951859 C G 20.03 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=0.73;MQ=51.87;MQ0=0;OQ=2314.11;QD=40.60;SB=-1158.05 GT:AD:DP:GL:GQ 1/1:0,57:55:-235.02,-16.58,-0.02:99
-chr1 722635 . G A 178.90 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.65;MQ0=17;OQ=703.25;QD=9.38;SB=-329.31 GT:AD:DP:GL:GQ 0/1:40,35:48:-88.07,-14.46,-95.92:99
-chr1 723861 rs3094321 C T 2.53 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=4.03;MQ=14.10;MQ0=13;OQ=171.30;QD=5.53;SB=-52.67 GT:AD:DP:GL:GQ 1/1:0,31:5:-20.69,-1.51,-0.00:15.05
-chr1 723905 rs3115866 G A 435.39 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.45;MQ0=11;OQ=1488.74;QD=31.02;SB=-417.55 GT:AD:DP:GL:GQ 1/1:0,48:37:-152.47,-11.14,-0.01:99
-chr1 724152 rs2427932 G A 28.59 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=40.65;MQ0=10;OQ=544.36;QD=7.78;SB=29.11 GT:AD:DP:GL:GQ 0/1:46,24:57:-74.91,-17.19,-123.40:99
-chr1 724325 rs12564807 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.02;HRun=14;HaplotypeScore=12.95;MQ=25.23;MQ0=25;OQ=486.84;QD=10.36;SB=-195.27 GT:AD:DP:GL:GQ 0/1:7,39:20:-57.99,-6.03,-17.33:99
-chr1 724354 rs7518433 T C 213.81 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.24;MQ0=8;OQ=108.50;QD=7.23;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:4:-14.38,-1.21,-0.00:12.04
-chr1 724429 . G A 5.67 PASS AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=39.71;MQ0=12;OQ=1919.08;QD=16.26;SB=-856.39 GT:AD:DP:GL:GQ 0/1:56,62:102:-225.91,-30.72,-172.49:99
-chr1 724483 rs2427930 A G 156.88 PASS AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.92;MQ0=8;OQ=1015.40;QD=8.46;SB=-368.74 GT:AD:DP:GL:GQ 0/1:73,47:110:-137.96,-33.13,-289.42:99
-chr1 724814 rs61770166 A G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.01;HRun=0;HaplotypeScore=8.00;MQ=38.81;MQ0=11;OQ=57.16;QD=0.57;SB=101.37 GT:AD:DP:GL:GQ 0/1:74,25:85:-34.30,-25.30,-302.54:90
-chr1 725289 rs10900603 G A 319.30 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.84;MQ0=12;OQ=1308.47;QD=22.56;SB=-614.32 GT:AD:DP:GL:GQ 1/1:0,58:33:-134.44,-9.94,-0.01:99
-chr1 727603 rs3893479 G A 3.33 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=20.83;MQ0=35;OQ=241.46;QD=3.71;SB=-122.11 GT:AD:DP:GL:GQ 0/1:49,15:27:-35.56,-8.14,-65.14:99
-chr1 729005 rs2340527 T A 17.56 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=11;HaplotypeScore=0.00;MQ=42.93;MQ0=12;QD=0.18;SB=2.25 GT:AD:DP:GL:GQ 0/1:70,25:68:-25.52,-20.49,-222.57:50.31
-chr1 729073 rs2427917 A G 0.66 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=1.32;MQ=36.83;MQ0=11;OQ=1725.34;QD=25.00;SB=-386.59 GT:AD:DP:GL:GQ 1/1:8,61:54:-180.20,-16.27,-4.08:99
-chr1 729289 rs3131973 A G 242.97 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.01;MQ0=22;OQ=768.10;QD=13.48;SB=-48.96 GT:AD:DP:GL:GQ 1/1:0,57:23:-80.40,-6.93,-0.01:69.20
-chr1 729391 rs3094317 G A 25.41 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=29.31;MQ0=14;OQ=1050.45;QD=23.87;SB=-501.02 GT:AD:DP:GL:GQ 1/1:0,44:27:-108.64,-8.13,-0.01:81.26
-chr1 731442 rs3115865 T C 10.98 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=14.78;MQ0=18;OQ=257.65;QD=3.79;SB=-147.73 GT:AD:DP:GL:GQ 1/1:0,68:9:-29.35,-2.71,-0.01:27.07
-chr1 732688 . A G 132.94 PASS AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=40.79;MQ0=0;OQ=1231.30;QD=15.02;SB=-638.22 GT:AD:DP:GL:GQ 0/1:40,42:81:-150.81,-24.40,-157.55:99
-chr1 732884 rs2488925 T C 45.12 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=12.78;MQ0=54;QD=0.47;SB=-0.97 GT:AD:DP:GL:GQ 0/1:72,25:9:-10.51,-2.71,-24.07:77.96
-chr1 732935 rs2488505 C A 405.73 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=25.42;MQ0=21;OQ=984.68;QD=12.62;SB=-456.35 GT:AD:DP:GL:GQ 1/1:10,68:28:-102.06,-8.43,-0.01:84.26
-chr1 734986 rs61823337 A C 21.52 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=22.23;MQ0=45;QD=0.18;SB=23.10 GT:AD:DP:GL:GQ 0/1:104,17:71:-26.81,-21.38,-234.10:54.33
-chr1 735210 rs2488501 T C 0.42 PASS AC=1;AF=0.50;AN=2;DB;DP=117;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=29.20;MQ0=16;OQ=204.37;QD=1.75;SB=-126.97 GT:AD:DP:GL:GQ 0/1:101,16:100:-53.85,-30.13,-340.21:99
-chr1 736231 rs3925106 C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=38.77;MQ0=4;OQ=87.62;QD=1.33;SB=28.85 GT:AD:DP:GL:GQ 0/1:58,8:62:-30.72,-18.67,-192.09:99
-chr1 736257 rs28622890 G A 34.58 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=41.58;MQ0=5;QD=0.43;SB=53.57 GT:AD:DP:GL:GQ 0/1:73,8:73:-28.75,-22.01,-217.76:67.42
-chr1 737271 rs2427896 G A 1.34 PASS AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.89;MQ0=27;OQ=95.91;QD=0.96;SB=26.10 GT:AD:DP:GL:GQ 0/1:78,22:62:-31.55,-18.68,-198.47:99
-chr1 737583 rs2488922 A G 0.48 PASS AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=42.10;MQ0=2;OQ=266.56;QD=2.17;SB=-121.05 GT:AD:DP:GL:GQ 0/1:92,31:105:-61.60,-31.66,-333.56:99
-chr1 738741 rs2519043 G T 42.42 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=26.82;MQ0=11;OQ=2109.65;QD=29.30;SB=-875.26 GT:AD:DP:GL:GQ 1/1:7,65:57:-214.56,-17.17,-0.01:99
-chr1 739128 rs2519041 G A 43.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=8.37;MQ0=49;QD=0.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:19,51:2:-7.71,-0.60,-0.00:6.02
-chr1 739546 rs12184332 C T 184.94 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=12.22;MQ0=29;OQ=412.05;QD=9.81;SB=-172.22 GT:AD:DP:GL:GQ 1/1:0,15:11:-44.79,-3.31,-0.00:33.11
-chr1 739719 rs12409679 C T 476.33 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.16;MQ0=31;OQ=1249.90;QD=19.53;SB=-559.74 GT:AD:DP:GL:GQ 1/1:9,55:32:-128.58,-9.64,-0.01:96.31
-chr1 739852 rs12409693 C T 32.23 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=4;HaplotypeScore=0.83;MQ=11.24;MQ0=16;QD=1.29;SB=-3.98 GT:AD:DP:GL:GQ 0/1:9,16:4:-7.71,-1.20,-7.59:63.88
-chr1 739860 rs12410209 A G 6.46 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=11.03;MQ0=14;OQ=69.01;QD=3.14;SB=-6.99 GT:AD:DP:GL:GQ 0/1:7,15:4:-11.39,-1.20,-4.06:28.52
-chr1 742429 rs3094315 G A 709.48 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.17;MQ0=0;OQ=3081.43;QD=40.02;SB=-1319.35 GT:AD:DP:GL:GQ 1/1:0,77:77:-311.75,-23.19,-0.02:99
-chr1 742584 rs3131972 A G 25.55 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=43.52;MQ0=0;OQ=2970.98;QD=35.37;SB=-1399.49 GT:AD:DP:GL:GQ 1/1:0,84:83:-300.71,-25.00,-0.02:99
-chr1 742757 rs3131971 T C 41.65 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=23.17;MQ0=17;OQ=516.07;QD=12.59;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,37:19:-55.23,-5.74,-0.04:57.08
-chr1 743132 rs3115861 C G 14.67 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=27.06;MQ0=17;OQ=1234.23;QD=26.26;SB=-15.29 GT:AD:DP:GL:GQ 1/1:0,46:29:-129.86,-11.46,-2.85:86.17
-chr1 743268 rs3115860 C A 75.43 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.75;MQ0=7;OQ=486.16;QD=22.10;SB=-153.55 GT:AD:DP:GL:GQ 1/1:0,22:14:-52.20,-4.22,-0.00:42.13
-chr1 743288 rs3131970 T C 362.63 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.31;MQ0=12;OQ=231.44;QD=11.57;SB=-100.85 GT:AD:DP:GL:GQ 1/1:0,20:8:-26.73,-2.41,-0.01:24.06
-chr1 743337 rs2073814 C G 1.55 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=4;HaplotypeScore=1.47;MQ=27.30;MQ0=10;OQ=1125.84;QD=30.43;SB=-429.30 GT:AD:DP:GL:GQ 1/1:1,36:27:-116.18,-8.13,-0.01:81.27
-chr1 743712 rs56101360 G T 37.36 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=10.96;MQ0=18;OQ=73.40;QD=3.50;SB=-44.39 GT:AD:DP:GL:GQ 1/1:0,21:3:-10.83,-0.90,-0.00:9.03
-chr1 744045 rs3131969 A G 233.56 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.14;MQ0=6;OQ=1104.31;QD=23.50;SB=-502.19 GT:AD:DP:GL:GQ 1/1:0,47:36:-114.05,-10.86,-0.03:99
-chr1 744055 rs3131968 A G 489.63 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.65;MQ0=5;OQ=1245.81;QD=27.08;SB=-566.90 GT:AD:DP:GL:GQ 1/1:0,46:40:-128.20,-12.07,-0.04:99
-chr1 744197 rs3131967 T C 119.26 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=53.80;MQ0=2;OQ=2119.16;QD=28.26;SB=-841.48 GT:AD:DP:GL:GQ 1/1:1,74:67:-215.56,-20.21,-0.06:99
-chr1 744366 rs3115859 G A 143.80 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.48;MQ0=0;OQ=2152.98;QD=37.77;SB=-958.79 GT:AD:DP:GL:GQ 1/1:0,55:55:-218.90,-16.57,-0.02:99
-chr1 744827 rs3131966 C T 120.29 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=47.82;MQ0=1;OQ=2882.74;QD=38.96;SB=-1406.06 GT:AD:DP:GL:GQ 1/1:1,73:72:-291.88,-21.69,-0.02:99
-chr1 745638 rs3131965 A G 37.34 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=59.56;MQ0=0;OQ=1308.09;QD=25.16;SB=-645.91 GT:AD:DP:GL:GQ 1/1:2,50:45:-138.61,-13.58,-4.21:93.63
-chr1 745750 rs3131964 C G 3.97 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=53.42;MQ0=0;OQ=1959.71;QD=42.60;SB=-541.05 GT:AD:DP:GL:GQ 1/1:0,46:45:-199.57,-13.56,-0.01:99
-chr1 745753 rs3115858 A T 53.72 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=52.51;MQ0=0;OQ=1749.78;QD=37.23;SB=-548.77 GT:AD:DP:GL:GQ 1/1:0,47:47:-178.57,-14.15,-0.01:99
-chr1 745791 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=2;HaplotypeScore=18.24;MQ=43.86;MQ0=9;OQ=50.05;QD=0.65;SB=68.26 GT:AD:DP:GL:GQ 0/1:71,6:65:-27.87,-19.59,-256.05:82.88
-chr1 745803 rs3115857 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=56.59;MQ=40.14;MQ0=10;OQ=1678.77;QD=22.69;SB=-752.72 GT:AD:DP:GL:GQ 0/1:24,50:53:-187.11,-15.98,-16.89:9.18
-chr1 745905 . G C 40.04 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=109.46;MQ=39.52;MQ0=1;QD=0.47;SB=41.16 GT:AD:DP:GL:GQ 0/1:44,42:46:-21.15,-13.87,-174.52:72.88
-chr1 745926 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=71.25;MQ=39.59;MQ0=1;OQ=190.93;QD=2.22;SB=53.16 GT:AD:DP:GL:GQ 0/1:47,39:55:-38.95,-16.57,-157.39:99
-chr1 745944 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=34.08;MQ=37.55;MQ0=2;OQ=183.15;QD=2.23;SB=41.15 GT:AD:DP:GL:GQ 0/1:68,13:63:-40.58,-18.98,-189.40:99
-chr1 745947 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=37.64;MQ0=2;OQ=144.60;QD=1.76;SB=41.13 GT:AD:DP:GL:GQ 0/1:61,21:63:-36.72,-18.98,-195.32:99
-chr1 745969 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=26.39;MQ=43.31;MQ0=1;OQ=191.12;QD=2.62;SB=65.24 GT:AD:DP:GL:GQ 0/1:56,17:62:-41.07,-18.68,-205.74:99
-chr1 745970 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=53.14;MQ=43.05;MQ0=1;OQ=181.87;QD=2.46;SB=65.22 GT:AD:DP:GL:GQ 0/1:57,13:62:-40.15,-18.68,-186.08:99
-chr1 746120 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=45.83;MQ=41.92;MQ0=5;OQ=178.43;QD=2.66;SB=1.10 GT:AD:DP:GL:GQ 0/1:36,31:38:-32.58,-11.45,-99.35:99
-chr1 746127 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=64.18;MQ=39.79;MQ0=5;OQ=90.17;QD=1.29;SB=23.10 GT:AD:DP:GL:GQ 0/1:61,9:40:-24.35,-12.05,-113.93:99
-chr1 746131 rs12567639 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=86.22;MQ=40.15;MQ0=5;OQ=1193.97;QD=14.74;SB=-198.46 GT:AD:DP:GL:GQ 0/1:23,47:41:-137.40,-14.72,-24.14:94.15
-chr1 746140 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=67.36;MQ=39.96;MQ0=6;OQ=451.51;QD=4.47;SB=-226.37 GT:AD:DP:GL:GQ 0/1:64,37:56:-65.31,-16.87,-128.04:99
-chr1 746183 rs61768169 G A 45.64 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=15.14;MQ=43.93;MQ0=4;QD=0.48;SB=0.06 GT:AD:DP:GL:GQ 0/1:84,10:80:-31.96,-24.11,-251.75:78.48
-chr1 746197 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=9.62;MQ=45.83;MQ0=2;OQ=266.46;QD=3.10;SB=-143.52 GT:AD:DP:GL:GQ 0/1:62,24:69:-50.72,-20.79,-191.84:99
-chr1 746210 . C G 29.36 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=12.28;MQ=48.57;MQ0=1;QD=0.39;SB=83.30 GT:AD:DP:GL:GQ 0/1:61,15:60:-24.30,-18.08,-232.38:62.19
-chr1 746211 . A C 19.28 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=12.28;MQ=48.88;MQ0=1;QD=0.26;SB=56.68 GT:AD:DP:GL:GQ 0/1:55,20:60:-23.28,-18.07,-191.05:52.07
-chr1 746241 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=37.04;MQ=43.41;MQ0=2;OQ=460.88;QD=4.90;SB=-102.94 GT:AD:DP:GL:GQ 0/1:66,28:77:-72.58,-23.21,-260.56:99
-chr1 746243 rs3131963 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=38.28;MQ=42.00;MQ0=2;OQ=2225.83;QD=20.61;SB=-986.67 GT:AD:DP:GL:GQ 0/1:37,71:77:-249.07,-23.20,-37.48:99
-chr1 746259 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=53.13;MQ=42.82;MQ0=2;OQ=115.63;QD=1.04;SB=-45.40 GT:AD:DP:GL:GQ 0/1:89,21:81:-39.28,-24.43,-223.64:99
-chr1 746271 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=62.70;MQ=43.89;MQ0=1;OQ=73.67;QD=0.68;SB=-12.36 GT:AD:DP:GL:GQ 0/1:82,19:79:-37.12,-26.47,-271.48:99
-chr1 746467 rs3131962 A G 256.08 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.92;MQ0=2;OQ=1247.82;QD=23.54;SB=-557.88 GT:AD:DP:GL:GQ 1/1:1,52:40:-128.40,-12.06,-0.04:99
-chr1 747503 rs3115853 G A 25.12 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.30;MQ=58.23;MQ0=2;OQ=3098.30;QD=37.78;SB=-1549.56 GT:AD:DP:GL:GQ 1/1:0,81:79:-317.18,-27.31,-3.76:99
-chr1 747597 rs4951929 C T 626.13 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2652.10;QD=38.44;SB=-1324.28 GT:AD:DP:GL:GQ 1/1:0,69:67:-268.81,-20.18,-0.02:99
-chr1 747799 rs4951862 C A 77.67 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=57.90;MQ0=0;OQ=1743.44;QD=32.90;SB=-442.30 GT:AD:DP:GL:GQ 1/1:0,53:51:-177.95,-15.36,-0.02:99
-chr1 748007 rs3131956 A G 613.10 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1973.59;QD=34.03;SB=-931.61 GT:AD:DP:GL:GQ 1/1:0,58:58:-200.97,-17.48,-0.03:99
-chr1 748187 rs3131955 T C 137.90 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=57.23;MQ0=0;OQ=1684.65;QD=30.08;SB=-868.87 GT:AD:DP:GL:GQ 1/1:0,56:51:-172.08,-15.37,-0.03:99
-chr1 748489 rs3131954 C T 606.26 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.38;MQ0=0;OQ=1957.02;QD=37.63;SB=-957.97 GT:AD:DP:GL:GQ 1/1:0,52:51:-199.31,-15.37,-0.02:99
-chr1 749563 rs3115852 T C 295.01 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.43;MQ0=19;OQ=1638.73;QD=24.46;SB=-694.62 GT:AD:DP:GL:GQ 1/1:0,67:46:-167.47,-13.85,-0.01:99
-chr1 749700 rs3115851 T A 246.72 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=37.92;MQ0=12;OQ=2113.34;QD=28.18;SB=-566.84 GT:AD:DP:GL:GQ 1/1:0,75:55:-214.93,-16.56,-0.01:99
-chr1 750775 rs1048488 C T 147.65 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=55.79;MQ0=0;OQ=2544.23;QD=37.42;SB=-1282.72 GT:AD:DP:GL:GQ 1/1:0,68:64:-258.02,-19.28,-0.02:99
-chr1 751010 rs3115850 T C 532.65 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.77;MQ0=0;OQ=2501.23;QD=35.73;SB=-1116.81 GT:AD:DP:GL:GQ 1/1:0,70:69:-253.73,-20.78,-0.02:99
-chr1 751595 rs2286139 C T 599.50 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=41.46;MQ0=7;OQ=1283.06;QD=32.08;SB=-543.21 GT:AD:DP:GL:GQ 1/1:0,40:32:-131.90,-9.64,-0.01:96.32
-chr1 751615 rs1057213 C T 31.34 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=31.78;MQ0=12;OQ=906.27;QD=25.17;SB=-453.10 GT:AD:DP:GL:GQ 1/1:0,36:23:-94.22,-6.93,-0.00:69.23
-chr1 751674 rs1057212 G A 293.40 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=15.73;MQ0=12;OQ=176.65;QD=10.39;SB=-51.56 GT:AD:DP:GL:GQ 1/1:0,17:5:-21.22,-1.51,-0.00:15.05
-chr1 752136 rs3115849 G A 60.54 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.04;MQ0=8;OQ=733.35;QD=26.19;SB=-160.21 GT:AD:DP:GL:GQ 1/1:0,28:19:-76.93,-5.73,-0.01:57.18
-chr1 752452 rs3115848 G C 110.74 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=44.19;MQ0=1;OQ=1521.80;QD=34.59;SB=-621.54 GT:AD:DP:GL:GQ 1/1:1,43:40:-155.80,-12.08,-0.04:99
-chr1 752455 rs3131950 C G 3.82 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=4.46;MQ=42.62;MQ0=2;OQ=1386.15;QD=32.24;SB=-555.07 GT:AD:DP:GL:GQ 1/1:1,42:36:-142.24,-10.87,-0.04:99
-chr1 752464 rs3131949 T C 84.88 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=40.87;MQ0=2;OQ=1077.25;QD=28.35;SB=-454.51 GT:AD:DP:GL:GQ 1/1:1,37:32:-111.32,-9.64,-0.01:96.27
-chr1 752495 rs3131948 T A 77.80 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=37.91;MQ0=2;OQ=926.17;QD=28.94;SB=-390.81 GT:AD:DP:GL:GQ 1/1:1,31:26:-96.21,-7.83,-0.01:78.23
-chr1 753257 rs3115847 G A 0.46 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=27.21;MQ0=9;OQ=840.10;QD=24.71;SB=-20.92 GT:AD:DP:GL:GQ 1/1:5,28:22:-89.90,-8.89,-2.30:65.88
-chr1 755968 rs2519015 T A 366.75 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.21;MQ0=48;OQ=1019.18;QD=12.90;SB=-121.94 GT:AD:DP:GL:GQ 1/1:23,56:29:-105.51,-8.74,-0.01:87.26
-chr1 757643 rs2905042 G A 71.81 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=34.85;MQ0=1;OQ=1607.55;QD=32.81;SB=-663.38 GT:AD:DP:GL:GQ 1/1:0,49:41:-164.35,-12.35,-0.01:99
-chr1 758116 rs2977608 A C 58.89 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=47.69;MQ0=11;OQ=2396.98;QD=30.34;SB=-914.67 GT:AD:DP:GL:GQ 1/1:4,75:68:-243.30,-20.48,-0.02:99
-chr1 759692 rs2977607 C A 65.29 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=47.39;MQ0=6;OQ=1539.69;QD=31.42;SB=-733.73 GT:AD:DP:GL:GQ 1/1:0,49:42:-157.56,-12.65,-0.01:99
-chr1 759938 rs2977606 C T 514.72 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.63;MQ0=7;OQ=1693.07;QD=33.20;SB=-574.34 GT:AD:DP:GL:GQ 1/1:0,51:44:-172.91,-13.26,-0.01:99
-chr1 760431 rs3131943 A G 213.11 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=31.32;MQ0=2;OQ=527.61;QD=27.77;SB=-87.92 GT:AD:DP:GL:GQ 1/1:0,19:16:-56.35,-4.82,-0.00:48.14
-chr1 760781 rs3095826 T G 40.05 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=15.14;MQ0=8;QD=3.64;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,11:2:-7.41,-0.60,-0.00:6.02
-chr1 761273 rs2519006 C T 29.93 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=27.71;MQ0=20;OQ=1719.34;QD=22.33;SB=-558.69 GT:AD:DP:GL:GQ 1/1:18,59:45:-179.00,-13.55,-3.48:99
-chr1 761686 rs2977605 T C 284.90 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.99;MQ0=4;OQ=744.87;QD=26.60;SB=-283.54 GT:AD:DP:GL:GQ 1/1:0,28:24:-78.09,-7.24,-0.02:72.16
-chr1 762618 rs2905039 A C 494.84 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.90;MQ0=0;OQ=1864.52;QD=29.13;SB=-798.77 GT:AD:DP:GL:GQ 1/1:0,64:60:-190.09,-18.09,-0.06:99
-chr1 764599 rs28830877 A C 154.63 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=49.78;MQ0=3;OQ=2217.13;QD=30.37;SB=-1008.12 GT:AD:DP:GL:GQ 1/1:0,73:64:-225.32,-19.28,-0.02:99
-chr1 764648 rs28873693 G A 193.89 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=40.27;MQ0=2;OQ=1900.97;QD=32.22;SB=-951.98 GT:AD:DP:GL:GQ 1/1:0,59:49:-193.70,-14.76,-0.02:99
-chr1 764732 rs55994826 G A 15.73 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=36.88;MQ0=1;QD=0.58;SB=17.08 GT:AD:DP:GL:GQ 0/1:24,3:23:-11.77,-6.93,-72.32:48.45
-chr1 764737 rs28810152 A C 715.74 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=38.33;MQ0=0;QD=28.63;SB=-297.55 GT:AD:DP:GL:GQ 1/1:0,25:22:-75.17,-6.63,-0.01:66.18
-chr1 764742 . A T 46.72 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=39.13;MQ0=0;QD=2.03;SB=-38.86 GT:AD:DP:GL:GQ 0/1:19,4:18:-13.38,-5.42,-51.11:79.56
-chr1 764746 . G A 393.33 SnpCluster AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=40.70;MQ0=1;QD=17.88;SB=-221.92 GT:AD:DP:GL:GQ 0/1:8,14:19:-48.34,-5.72,-22.76:99
-chr1 764763 rs28797844 C G 118.37 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=44.74;MQ0=1;OQ=234.91;QD=8.39;SB=-89.25 GT:AD:DP:GL:GQ 0/1:20,8:26:-34.62,-7.84,-73.94:99
-chr1 764786 rs28769076 G C 293.91 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.71;MQ0=4;OQ=1154.38;QD=32.98;SB=-346.74 GT:AD:DP:GL:GQ 1/1:0,35:27:-119.03,-8.14,-0.01:81.27
-chr1 765119 . T G 7.65 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=15.72;MQ0=15;OQ=87.25;QD=4.15;SB=-66.98 GT:AD:DP:GL:GQ 0/1:15,6:6:-13.82,-1.81,-7.64:58.28
-chr1 765289 rs2905037 G A 284.46 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=48.40;MQ0=0;OQ=3000.65;QD=37.51;SB=-1455.38 GT:AD:DP:GL:GQ 1/1:0,80:75:-303.67,-22.59,-0.02:99
-chr1 765522 rs2905035 A G 84.99 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=40.77;MQ0=3;OQ=2096.78;QD=30.39;SB=-645.26 GT:AD:DP:GL:GQ 1/1:0,68:58:-213.28,-17.47,-0.02:99
-chr1 766409 rs12124819 A G 273.30 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=51.01;MQ0=0;OQ=1354.31;QD=15.75;SB=-621.86 GT:AD:DP:GL:GQ 0/1:41,45:85:-164.32,-25.60,-163.76:99
-chr1 766985 rs2980319 A T 684.18 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.93;MQ0=0;OQ=2347.43;QD=37.26;SB=-849.94 GT:AD:DP:GL:GQ 1/1:0,63:62:-238.35,-18.68,-0.02:99
-chr1 768432 rs2977615 A G 315.81 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.80;MQ0=5;OQ=1414.86;QD=25.27;SB=-618.23 GT:AD:DP:GL:GQ 1/1:0,56:46:-145.13,-13.88,-0.05:99
-chr1 769890 rs2977613 G T 314.36 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=53.23;MQ0=0;OQ=2549.06;QD=34.45;SB=-1034.15 GT:AD:DP:GL:GQ 1/1:0,74:70:-258.51,-21.09,-0.02:99
-chr1 770648 rs2977612 T A 316.89 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=55.02;MQ0=0;OQ=2471.78;QD=34.81;SB=-1070.63 GT:AD:DP:GL:GQ 1/1:1,70:68:-253.32,-20.49,-2.56:99
-chr1 773167 rs2980295 T C 625.67 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.46;MQ0=0;OQ=2479.28;QD=34.43;SB=-1064.87 GT:AD:DP:GL:GQ 1/1:0,72:71:-251.54,-21.39,-0.02:99
-chr1 774913 rs2905062 G A 647.91 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.25;MQ0=0;OQ=2057.09;QD=38.09;SB=-793.69 GT:AD:DP:GL:GQ 1/1:0,54:52:-209.31,-15.66,-0.01:99
-chr1 775852 rs2980300 T C 398.92 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.91;MQ0=0;OQ=1925.83;QD=36.34;SB=-289.45 GT:AD:DP:GL:GQ 1/1:0,53:52:-196.18,-15.66,-0.01:99
-chr1 776110 rs59319764 G A 135.46 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.95;MQ0=5;OQ=708.27;QD=21.46;SB=-330.44 GT:AD:DP:GL:GQ 1/1:5,28:18:-74.41,-5.42,-0.00:54.18
-chr1 776673 rs2905061 G A 271.44 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.77;MQ0=2;OQ=243.21;QD=12.80;SB=-51.67 GT:AD:DP:GL:GQ 1/1:0,19:7:-27.90,-2.11,-0.00:21.07
-chr1 776882 rs2905060 C T 28.05 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.47;MQ0=13;OQ=680.11;QD=21.25;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,32:18:-71.60,-5.42,-0.01:54.17
-chr1 776908 . C G 26.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=23.04;MQ0=7;QD=1.35;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,8:6:-7.79,-1.82,-13.09:59.77
-chr1 776998 rs28753393 A G 1.62 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=22.78;MQ0=8;OQ=492.59;QD=20.52;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,24:14:-52.85,-4.22,-0.00:42.13
-chr1 777048 rs2905058 G A 64.34 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=17.04;MQ0=12;OQ=310.80;QD=12.43;SB=-128.67 GT:AD:DP:GL:GQ 1/1:0,25:9:-34.67,-2.71,-0.01:27.08
-chr1 777068 rs2905057 G A 256.67 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=15.61;MQ0=17;OQ=265.15;QD=9.14;SB=-131.67 GT:AD:DP:GL:GQ 1/1:0,29:8:-30.10,-2.41,-0.01:24.07
-chr1 777125 rs2905056 C G 369.51 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=42.20;MQ0=14;OQ=1716.63;QD=32.39;SB=-514.60 GT:AD:DP:GL:GQ 1/1:0,53:39:-175.26,-11.75,-0.01:99
-chr1 777262 rs2905055 G T 436.57 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.93;MQ0=5;OQ=1457.00;QD=33.11;SB=-678.96 GT:AD:DP:GL:GQ 1/1:0,44:39:-149.29,-11.74,-0.01:99
-chr1 777290 . C T 29.42 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=32.80;MQ0=5;OQ=855.45;QD=17.11;SB=-308.80 GT:AD:DP:GL:GQ 0/1:21,29:44:-102.09,-13.26,-62.10:99
-chr1 777548 rs2905054 G T 500.83 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.40;MQ0=0;OQ=2267.93;QD=36.00;SB=-851.89 GT:AD:DP:GL:GQ 1/1:0,63:62:-230.39,-18.67,-0.01:99
-chr1 777707 rs2905053 C T 334.21 PASS AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=44.44;MQ0=2;OQ=3957.07;QD=39.57;SB=-1940.72 GT:AD:DP:GL:GQ 1/1:0,100:95:-394.71,-28.61,-0.02:99
-chr1 778576 rs2980306 T C 128.68 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=33.51;MQ0=34;OQ=1562.02;QD=19.05;SB=-268.41 GT:AD:DP:GL:GQ 1/1:13,69:45:-159.81,-13.56,-0.02:99
-chr1 778703 rs10157303 T C 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=7.41;MQ=38.85;MQ0=14;OQ=444.81;QD=5.30;SB=-42.81 GT:AD:DP:GL:GQ 0/1:40,44:57:-64.95,-17.19,-138.39:99
-chr1 778707 rs10159337 C G 0.38 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=6.67;MQ=39.47;MQ0=14;OQ=423.04;QD=5.29;SB=32.36 GT:AD:DP:GL:GQ 0/1:47,33:53:-61.57,-15.98,-162.13:99
-chr1 778752 rs10159341 C T 0.26 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=43.79;MQ0=4;OQ=82.84;QD=1.45;SB=53.17 GT:AD:DP:GL:GQ 0/1:50,7:44:-24.83,-13.27,-122.87:99
-chr1 778808 . G C 4.86 PASS AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=23.40;MQ0=13;OQ=99.43;QD=5.52;SB=-51.47 GT:AD:DP:GL:GQ 1/1:11,7:3:-13.43,-0.90,-0.00:9.03
-chr1 778958 . C G 0.12 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=6.83;MQ=13.77;MQ0=12;OQ=373.21;QD=7.46;SB=-3.98 GT:AD:DP:GL:GQ 0/1:40,10:17:-45.73,-5.12,-29.92:99
-chr1 778962 rs10158938 G A 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=6.77;MQ=13.74;MQ0=12;OQ=114.14;QD=2.24;SB=-77.09 GT:AD:DP:GL:GQ 0/1:17,34:17:-19.83,-5.13,-36.56:99
-chr1 779001 . C G 62.18 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=43.25;MQ=17.50;MQ0=24;QD=0.60;SB=-3.98 GT:AD:DP:GL:GQ 0/1:92,11:44:-22.76,-13.26,-160.88:95.02
-chr1 779004 . G C 379.18 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=41.31;MQ=17.52;MQ0=26;QD=3.61;SB=-3.98 GT:AD:DP:GL:GQ 0/1:83,21:42:-55.98,-14.78,-128.84:99
-chr1 779007 . G C 125.98 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=41.47;MQ=17.84;MQ0=24;QD=1.21;SB=-3.98 GT:AD:DP:GL:GQ 0/1:82,22:45:-29.45,-13.56,-167.32:99
-chr1 779046 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=13.36;MQ=16.85;MQ0=30;OQ=85.18;QD=0.76;SB=-0.98 GT:AD:DP:GL:GQ 0/1:103,9:39:-23.55,-11.75,-110.84:99
-chr1 779119 rs3131939 T C 14.51 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=38.97;MQ0=6;OQ=1691.71;QD=26.03;SB=-847.52 GT:AD:DP:GL:GQ 1/1:0,65:53:-172.80,-15.99,-0.05:99
-chr1 782126 rs1044922 A G 199.05 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=35.10;MQ0=8;OQ=1304.52;QD=20.38;SB=-463.86 GT:AD:DP:GL:GQ 1/1:3,61:42:-134.08,-12.67,-0.04:99
-chr1 782343 rs2905036 C T 605.33 PASS AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=44.88;MQ0=2;OQ=3789.97;QD=39.07;SB=-1780.39 GT:AD:DP:GL:GQ 1/1:0,97:94:-378.00,-28.32,-0.03:99
-chr1 783071 rs2905029 C G 4.69 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=24.02;MQ0=7;OQ=636.50;QD=15.91;SB=29.13 GT:AD:DP:GL:GQ 0/1:20,20:32:-76.58,-9.64,-67.00:99
-chr1 783292 rs2519067 T C 14.72 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=32.87;MQ0=7;OQ=1046.72;QD=28.29;SB=-162.84 GT:AD:DP:GL:GQ 1/1:5,32:30:-108.26,-9.03,-0.01:90.27
-chr1 785455 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=20;HaplotypeScore=3.33;MQ=47.34;MQ0=4;OQ=246.17;QD=4.48;SB=-56.75 GT:AD:DP:GL:GQ 0/1:43,12:47:-42.06,-14.16,-132.17:99
-chr1 786397 . T C 0.59 PASS AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=41.18;MQ0=9;OQ=325.37;QD=4.52;SB=-24.72 GT:AD:DP:GL:GQ 0/1:50,22:59:-53.59,-17.77,-179.67:99
-chr1 786590 rs2909612 G T 160.63 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=27.34;MQ0=10;OQ=1960.56;QD=30.63;SB=-1001.80 GT:AD:DP:GL:GQ 1/1:0,64:54:-199.65,-16.26,-0.01:99
-chr1 786630 rs12076540 G A 0.40 PASS AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=7.41;MQ=41.01;MQ0=13;OQ=2659.94;QD=26.60;SB=-1327.51 GT:AD:DP:GL:GQ 0/1:23,77:83:-294.28,-25.01,-36.59:99
-chr1 786634 rs2909613 T C 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=7.24;MQ=42.00;MQ0=12;OQ=84.11;QD=0.83;SB=12.37 GT:AD:DP:GL:GQ 0/1:80,21:85:-37.30,-25.61,-300.66:99
-chr1 786902 . A G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=48.19;MQ0=15;OQ=198.92;QD=1.55;SB=-72.06 GT:AD:DP:GL:GQ 0/1:96,32:111:-56.61,-33.43,-385.87:99
-chr1 787026 . G A 14.82 LowQual AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=46.76;MQ0=8;QD=0.17;SB=-27.80 GT:AD:DP:GL:GQ 0/1:74,15:80:-28.85,-24.10,-261.80:47.51
-chr1 787041 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=44.71;MQ0=13;OQ=84.25;QD=0.90;SB=-23.86 GT:AD:DP:GL:GQ 0/1:71,22:80:-37.92,-26.21,-271.06:99
-chr1 787889 rs4951864 C T 266.17 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.78;MQ0=1;OQ=2714.18;QD=38.77;SB=-989.31 GT:AD:DP:GL:GQ 1/1:1,69:67:-275.02,-20.18,-0.01:99
-chr1 789326 rs4245756 T C 211.89 PASS AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.75;MQ0=0;OQ=3107.92;QD=34.53;SB=-1502.55 GT:AD:DP:GL:GQ 1/1:0,90:89:-314.41,-26.81,-0.04:99
-chr1 789870 rs6681049 T C 615.97 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.06;MQ0=1;OQ=2660.56;QD=34.55;SB=-1115.14 GT:AD:DP:GL:GQ 1/1:0,77:73:-269.66,-21.99,-0.02:99
-chr1 790246 rs4951931 C T 190.77 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=47.97;MQ0=4;OQ=2808.35;QD=36.95;SB=-1258.17 GT:AD:DP:GL:GQ 1/1:1,75:70:-284.44,-21.09,-0.02:99
-chr1 791806 rs7516866 C T 78.65 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=49.91;MQ0=4;OQ=2127.43;QD=34.88;SB=-1017.37 GT:AD:DP:GL:GQ 1/1:0,61:56:-216.36,-16.88,-0.03:99
-chr1 791858 rs7553084 G A 0.25 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=36.92;MQ0=13;OQ=63.33;QD=1.47;SB=-33.64 GT:AD:DP:GL:GQ 0/1:29,14:21:-15.95,-6.33,-55.40:96.17
-chr1 791869 rs9700144 T C 36.55 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=30.98;MQ0=16;OQ=499.95;QD=11.90;SB=-156.35 GT:AD:DP:GL:GQ 0/1:18,24:19:-59.00,-5.72,-11.19:54.70
-chr1 791956 rs7553197 G A 67.79 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=36.93;MQ0=8;OQ=1294.09;QD=27.53;SB=-402.66 GT:AD:DP:GL:GQ 1/1:3,44:34:-133.00,-10.24,-0.01:99
-chr1 792054 . G A 0.09 PASS AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=2.92;MQ=30.80;MQ0=19;OQ=223.16;QD=2.37;SB=-57.50 GT:AD:DP:GL:GQ 0/1:66,28:40:-37.67,-12.07,-95.70:99
-chr1 792085 rs61768213 G A 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=11.76;MQ=27.41;MQ0=19;OQ=204.34;QD=1.93;SB=-8.44 GT:AD:DP:GL:GQ 0/1:88,18:55:-40.31,-16.60,-140.17:99
-chr1 792094 rs59334306 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=46.76;MQ=26.45;MQ0=20;OQ=280.32;QD=2.64;SB=-7.86 GT:AD:DP:GL:GQ 0/1:75,30:53:-47.28,-15.96,-151.37:99
-chr1 792103 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=25.85;MQ=29.18;MQ0=20;OQ=339.53;QD=3.09;SB=-172.66 GT:AD:DP:GL:GQ 0/1:84,26:61:-55.65,-18.41,-142.90:99
-chr1 792163 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.02;HRun=3;HaplotypeScore=9.77;MQ=36.34;MQ0=8;OQ=472.25;QD=5.02;SB=-153.68 GT:AD:DP:GL:GQ 0/1:49,43:64:-69.50,-18.99,-156.72:99
-chr1 792183 . G A 7.22 PASS AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=42.20;MQ0=9;OQ=1359.41;QD=15.27;SB=-245.27 GT:AD:DP:GL:GQ 0/1:36,53:59:-157.01,-17.79,-57.64:99
-chr1 792201 . G A 0.06 PASS AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=43.46;MQ0=8;OQ=234.21;QD=2.47;SB=6.27 GT:AD:DP:GL:GQ 0/1:68,27:69:-47.53,-20.82,-170.85:99
-chr1 792244 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=3.46;MQ=47.18;MQ0=4;OQ=75.38;QD=1.05;SB=92.33 GT:AD:DP:GL:GQ 0/1:49,23:53:-26.79,-15.97,-181.50:99
-chr1 793978 rs9725068 G A 105.15 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.47;MQ0=13;OQ=1474.93;QD=26.34;SB=-321.42 GT:AD:DP:GL:GQ 1/1:0,56:37:-151.09,-11.15,-0.01:99
-chr1 794403 rs11240778 T C 115.53 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.32;MQ0=0;OQ=2475.68;QD=30.95;SB=-1150.98 GT:AD:DP:GL:GQ 1/1:0,80:77:-251.22,-23.23,-0.07:99
-chr1 797375 rs10751454 A G 614.93 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.93;MQ0=1;OQ=2184.15;QD=34.67;SB=-971.41 GT:AD:DP:GL:GQ 1/1:0,63:61:-222.02,-18.37,-0.02:99
-chr1 797624 rs4951932 C A 532.14 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.69;MQ0=0;OQ=2699.27;QD=36.48;SB=-1270.15 GT:AD:DP:GL:GQ 1/1:0,74:72:-273.52,-21.68,-0.01:99
-chr1 798086 rs4951933 G C 74.24 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=48.23;MQ0=3;OQ=1918.57;QD=25.24;SB=-881.14 GT:AD:DP:GL:GQ 1/1:5,71:54:-198.81,-16.33,-3.37:99
-chr1 798494 rs11240779 G A 160.91 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=54.32;MQ0=0;OQ=2346.63;QD=37.85;SB=-859.15 GT:AD:DP:GL:GQ 1/1:0,62:60:-238.27,-18.08,-0.02:99
-chr1 798785 rs6594027 G A 211.91 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=43.75;MQ0=6;OQ=1743.42;QD=29.06;SB=-625.73 GT:AD:DP:GL:GQ 1/1:3,57:47:-180.84,-14.16,-2.92:99
-chr1 798791 rs11240780 C T 1.58 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=44.87;MQ0=5;OQ=1874.68;QD=30.73;SB=-625.19 GT:AD:DP:GL:GQ 1/1:3,58:49:-194.73,-14.76,-3.68:99
-chr1 801153 rs6683530 G C 58.35 Indel AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=47.12;MQ0=0;QD=7.29;SB=-48.46 GT:AD:DP:GL:GQ 0/1:3,5:6:-10.93,-1.81,-12.15:91.19
-chr1 801443 . G C 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=38.48;MQ0=1;OQ=52.85;QD=17.62;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-8.69,-0.60,-0.00:6.02
-chr1 801493 . G A 49.74 LowQual AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=43.23;MQ0=0;QD=5.53;SB=-18.25 GT:AD:DP:GL:GQ 0/1:2,4:4:-12.63,-4.37,-6.30:19.25
-chr1 801563 . C G 14.05 LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=42.60;MQ0=0;QD=1.40;SB=-3.98 GT:AD:DP:GL:GQ 0/1:8,2:7:-6.79,-2.12,-21.33:46.71
-chr1 801598 . T C 10.44 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=49.26;MQ0=0;OQ=130.47;QD=6.21;SB=-25.63 GT:AD:DP:GL:GQ 0/1:13,8:15:-20.85,-4.52,-36.05:99
-chr1 801628 . C T 6.09 PASS AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=52.56;MQ0=0;OQ=245.60;QD=14.45;SB=-39.65 GT:AD:DP:GL:GQ 0/1:7,10:12:-31.46,-3.62,-11.96:83.42
-chr1 802130 rs7541694 A G 69.50 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=55.65;MQ0=0;OQ=1955.23;QD=29.18;SB=-933.35 GT:AD:DP:GL:GQ 1/1:0,67:63:-199.17,-19.00,-0.06:99
-chr1 802147 rs7545373 C G 33.64 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=3.57;MQ=55.54;MQ0=0;OQ=2348.31;QD=37.27;SB=-1198.48 GT:AD:DP:GL:GQ 1/1:2,61:60:-246.74,-18.09,-8.33:97.66
-chr1 802165 . G A 18.16 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.79;MQ=55.42;MQ0=0;QD=0.31;SB=71.21 GT:AD:DP:GL:GQ 0/1:51,8:51:-20.46,-15.37,-155.58:50.93
-chr1 802175 . C T 26.53 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=55.08;MQ0=0;QD=0.48;SB=56.20 GT:AD:DP:GL:GQ 0/1:46,8:48:-20.39,-14.46,-154.35:59.35
-chr1 802189 . G A 11.38 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=55.49;MQ0=0;QD=0.20;SB=56.19 GT:AD:DP:GL:GQ 0/1:49,8:51:-19.75,-15.37,-163.52:43.89
-chr1 802470 . T C 21.38 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=54.38;MQ0=1;QD=0.34;SB=62.23 GT:AD:DP:GL:GQ 0/1:57,6:59:-23.19,-17.77,-210.98:54.19
-chr1 802488 . G T 29.03 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=53.89;MQ0=1;QD=0.53;SB=65.21 GT:AD:DP:GL:GQ 0/1:49,6:52:-21.85,-15.66,-163.62:61.86
-chr1 802614 rs4246500 T C 405.83 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1600.84;QD=34.80;SB=-568.88 GT:AD:DP:GL:GQ 1/1:0,46:45:-163.68,-13.56,-0.02:99
-chr1 803503 rs16973606 A G 11.51 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=28.75;MQ0=1;OQ=1669.54;QD=28.30;SB=-566.93 GT:AD:DP:GL:GQ 1/1:0,58:52:-170.59,-15.68,-0.05:99
-chr1 803610 rs4970388 G A 620.03 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.63;MQ0=0;OQ=2297.43;QD=38.94;SB=-1171.71 GT:AD:DP:GL:GQ 1/1:0,59:58:-233.34,-17.47,-0.02:99
-chr1 803950 . C A 24.11 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=7.91;MQ=35.01;MQ0=10;QD=0.32;SB=59.14 GT:AD:DP:GL:GQ 0/1:54,21:50:-20.76,-15.06,-152.32:56.93
-chr1 803957 rs61768235 A G 0.17 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=7.75;MQ=34.03;MQ0=10;OQ=322.16;QD=4.30;SB=35.12 GT:AD:DP:GL:GQ 0/1:42,30:47:-49.67,-14.18,-120.05:99
-chr1 803968 . C T 1.63 PASS AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=30.80;MQ0=12;OQ=418.55;QD=4.81;SB=59.13 GT:AD:DP:GL:GQ 0/1:53,34:61:-63.53,-18.39,-146.32:99
-chr1 804010 rs4268301 G C 0.65 PASS AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=6.53;MQ=32.14;MQ0=12;OQ=1062.36;QD=10.84;SB=53.20 GT:AD:DP:GL:GQ 0/1:43,55:71:-130.91,-21.39,-167.36:99
-chr1 804023 . C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=7.44;MQ=36.24;MQ0=5;OQ=967.44;QD=10.63;SB=62.24 GT:AD:DP:GL:GQ 0/1:48,43:70:-121.12,-21.09,-190.26:99
-chr1 804036 . A T 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=7.15;MQ=36.45;MQ0=7;OQ=717.66;QD=8.34;SB=65.21 GT:AD:DP:GL:GQ 0/1:47,38:68:-95.53,-20.48,-155.46:99
-chr1 804078 rs4468103 A G 426.89 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=12.81;MQ=43.94;MQ0=3;QD=5.62;SB=77.26 GT:AD:DP:GL:GQ 0/1:53,23:63:-64.96,-18.98,-178.46:99
-chr1 804080 rs34234497 C A 381.14 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=12.71;MQ=43.70;MQ0=3;QD=4.95;SB=89.27 GT:AD:DP:GL:GQ 0/1:53,24:67:-61.57,-20.18,-178.60:99
-chr1 804083 . C A 27.31 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=12.71;MQ=43.58;MQ0=4;QD=0.34;SB=86.24 GT:AD:DP:GL:GQ 0/1:70,11:67:-26.19,-20.18,-214.42:60.14
-chr1 804127 rs4571914 C T 3.06 PASS AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=47.10;MQ0=4;OQ=2988.66;QD=31.13;SB=-1433.34 GT:AD:DP:GL:GQ 1/1:3,93:75:-302.47,-22.59,-0.02:99
-chr1 804160 . T A 1.44 PASS AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=46.18;MQ0=5;OQ=470.49;QD=4.06;SB=48.91 GT:AD:DP:GL:GQ 0/1:72,44:82:-75.03,-24.70,-237.11:99
-chr1 804163 . T A 0.61 PASS AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=45.72;MQ0=5;OQ=536.43;QD=4.62;SB=45.90 GT:AD:DP:GL:GQ 0/1:71,45:81:-81.32,-24.40,-231.88:99
-chr1 804176 . C T 0.11 PASS AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=42.84;MQ0=5;OQ=284.28;QD=2.41;SB=31.59 GT:AD:DP:GL:GQ 0/1:90,28:84:-57.01,-25.30,-251.94:99
-chr1 804255 rs61768236 C T 415.82 PASS AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.82;MQ0=7;OQ=1235.94;QD=11.44;SB=-464.41 GT:AD:DP:GL:GQ 0/1:49,59:70:-147.96,-21.08,-123.48:99
-chr1 804268 rs61768237 T C 267.05 PASS AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.38;MQ0=8;OQ=1449.21;QD=11.32;SB=-624.62 GT:AD:DP:GL:GQ 0/1:53,75:88:-174.71,-26.51,-156.34:99
-chr1 804322 . T C 170.65 PASS AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.67;MQ0=9;OQ=1734.45;QD=11.19;SB=-540.49 GT:AD:DP:GL:GQ 0/1:72,83:118:-212.27,-35.54,-249.66:99
-chr1 804353 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=4;HaplotypeScore=24.21;MQ=44.77;MQ0=2;OQ=299.39;QD=2.32;SB=-27.46 GT:AD:DP:GL:GQ 0/1:106,23:112:-66.96,-33.74,-330.98:99
-chr1 804358 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=1;HaplotypeScore=23.14;MQ=46.13;MQ0=0;OQ=958.19;QD=8.33;SB=-257.80 GT:AD:DP:GL:GQ 0/1:68,47:100:-129.23,-30.12,-232.16:99
-chr1 804472 . A T 0.19 PASS AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=48.14;MQ0=4;OQ=798.74;QD=6.89;SB=107.38 GT:AD:DP:GL:GQ 0/1:75,41:98:-112.67,-29.52,-266.53:99
-chr1 804474 . A C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=2;HaplotypeScore=5.00;MQ=47.90;MQ0=4;OQ=704.41;QD=6.18;SB=101.34 GT:AD:DP:GL:GQ 0/1:73,41:96:-102.63,-28.91,-247.09:99
-chr1 804544 . A T 0.11 PASS AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=3.62;MQ=40.45;MQ0=6;OQ=406.04;QD=3.15;SB=95.34 GT:AD:DP:GL:GQ 0/1:99,30:89:-70.69,-26.81,-271.16:99
-chr1 804557 . A C 0.23 PASS AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=40.10;MQ0=5;OQ=416.51;QD=3.82;SB=86.28 GT:AD:DP:GL:GQ 0/1:65,43:73:-66.93,-21.99,-180.79:99
-chr1 804573 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=8.85;MQ=43.02;MQ0=4;OQ=579.16;QD=6.16;SB=83.29 GT:AD:DP:GL:GQ 0/1:56,38:69:-81.99,-20.79,-176.35:99
-chr1 804594 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=7.80;MQ=47.78;MQ0=4;OQ=294.82;QD=3.04;SB=104.36 GT:AD:DP:GL:GQ 0/1:66,31:74:-55.06,-22.29,-235.53:99
-chr1 804605 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=13.95;MQ=49.87;MQ0=3;OQ=284.24;QD=2.81;SB=113.40 GT:AD:DP:GL:GQ 0/1:73,28:82:-56.44,-24.73,-279.54:99
-chr1 804976 . T C 11.87 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=17.62;MQ=47.74;MQ0=10;QD=0.07;SB=128.44 GT:AD:DP:GL:GQ 0/1:107,52:112:-38.18,-33.74,-401.64:44.42
-chr1 805001 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=1;HaplotypeScore=76.93;MQ=42.40;MQ0=12;OQ=1246.68;QD=5.17;SB=146.50 GT:AD:DP:GL:GQ 0/1:129,112:153:-174.09,-46.14,-468.17:99
-chr1 805002 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=75.93;MQ=42.40;MQ0=13;OQ=1673.16;QD=6.89;SB=-6.76 GT:AD:DP:GL:GQ 0/1:105,138:154:-217.01,-46.41,-335.99:99
-chr1 805021 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=298;Dels=0.00;HRun=1;HaplotypeScore=153.68;MQ=38.48;MQ0=13;OQ=1337.90;QD=4.49;SB=-19.37 GT:AD:DP:GL:GQ 0/1:146,152:156:-184.06,-46.99,-421.14:99
-chr1 805031 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=318;Dels=0.00;HRun=0;HaplotypeScore=207.07;MQ=37.99;MQ0=12;OQ=1684.06;QD=5.30;SB=131.37 GT:AD:DP:GL:GQ 0/1:175,143:165:-221.39,-49.70,-405.98:99
-chr1 805042 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=0;HaplotypeScore=155.12;MQ=37.32;MQ0=17;OQ=677.06;QD=1.99;SB=140.48 GT:AD:DP:GL:GQ 0/1:285,55:199:-130.92,-59.93,-605.02:99
-chr1 805044 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=1;HaplotypeScore=156.13;MQ=36.94;MQ0=19;OQ=889.27;QD=2.62;SB=-0.09 GT:AD:DP:GL:GQ 0/1:243,95:179:-146.12,-53.91,-499.80:99
-chr1 805060 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=82.46;MQ=36.20;MQ0=28;OQ=262.53;QD=0.74;SB=131.47 GT:AD:DP:GL:GQ 0/1:269,85:206:-91.58,-62.05,-725.20:99
-chr1 805070 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=335;Dels=0.00;HRun=0;HaplotypeScore=72.27;MQ=36.04;MQ0=29;OQ=243.31;QD=0.73;SB=122.43 GT:AD:DP:GL:GQ 0/1:284,51:196:-86.65,-59.04,-686.22:99
-chr1 805096 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=1;HaplotypeScore=49.35;MQ=36.73;MQ0=27;OQ=2126.16;QD=7.70;SB=101.36 GT:AD:DP:GL:GQ 0/1:81,194:152:-261.68,-45.78,-320.28:99
-chr1 805097 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=277;Dels=0.00;HRun=0;HaplotypeScore=50.14;MQ=36.84;MQ0=27;OQ=2166.21;QD=7.82;SB=104.34 GT:AD:DP:GL:GQ 0/1:80,196:153:-269.55,-49.64,-287.57:99
-chr1 805200 . G T 14.62 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=163;Dels=0.00;HRun=0;HaplotypeScore=25.70;MQ=44.88;MQ0=22;QD=0.09;SB=134.45 GT:AD:DP:GL:GQ 0/1:137,26:122:-41.47,-36.74,-399.49:47.31
-chr1 805236 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=3;HaplotypeScore=58.62;MQ=48.88;MQ0=19;OQ=385.49;QD=2.77;SB=18.48 GT:AD:DP:GL:GQ 0/1:87,52:105:-73.46,-31.63,-322.22:99
-chr1 805261 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=375.75;MQ=40.95;MQ0=20;OQ=701.87;QD=3.00;SB=-184.24 GT:AD:DP:GL:GQ 0/1:132,101:136:-114.44,-40.97,-420.32:99
-chr1 805262 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=0;HaplotypeScore=355.61;MQ=40.41;MQ0=21;OQ=112.78;QD=0.47;SB=-10.32 GT:AD:DP:GL:GQ 0/1:195,42:136:-62.96,-48.40,-549.49:99
-chr1 805283 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=350;Dels=0.00;HRun=0;HaplotypeScore=86.54;MQ=35.73;MQ0=32;OQ=70.17;QD=0.20;SB=7.66 GT:AD:DP:GL:GQ 0/1:314,35:208:-72.95,-62.65,-681.33:99
-chr1 805284 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=355;Dels=0.00;HRun=0;HaplotypeScore=88.37;MQ=35.41;MQ0=32;OQ=4656.41;QD=13.12;SB=-1324.68 GT:AD:DP:GL:GQ 0/1:83,272:209:-464.64,-62.96,-333.94:99
-chr1 805326 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=520;Dels=0.00;HRun=0;HaplotypeScore=98.56;MQ=31.27;MQ0=33;OQ=692.81;QD=1.33;SB=-240.64 GT:AD:DP:GL:GQ 0/1:439,81:305:-164.43,-91.87,-1058.15:99
-chr1 805332 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=545;Dels=0.00;HRun=2;HaplotypeScore=105.70;MQ=31.02;MQ0=35;OQ=141.69;QD=0.26;SB=-23.90 GT:AD:DP:GL:GQ 0/1:483,62:326:-115.64,-98.18,-1059.59:99
-chr1 805355 . A G 982.52 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=566;Dels=0.00;HRun=0;HaplotypeScore=511.67;MQ=31.08;MQ0=42;QD=1.74;SB=-163.90 GT:AD:DP:GL:GQ 0/1:444,82:337:-230.52,-128.98,-1164.43:99
-chr1 805360 . A G 1795.44 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=565;Dels=0.00;HRun=0;HaplotypeScore=478.07;MQ=31.09;MQ0=46;QD=3.18;SB=-791.73 GT:AD:DP:GL:GQ 0/1:432,132:335:-287.21,-104.38,-1038.16:99
-chr1 805365 . T C 1655.74 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=542;Dels=0.00;HRun=0;HaplotypeScore=449.89;MQ=31.32;MQ0=44;QD=3.05;SB=-765.34 GT:AD:DP:GL:GQ 0/1:385,157:321:-265.54,-96.68,-1024.45:99
-chr1 805383 rs61768238 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=498;Dels=0.00;HRun=3;HaplotypeScore=98.26;MQ=31.16;MQ0=41;OQ=7913.78;QD=15.89;SB=-2299.71 GT:AD:DP:GL:GQ 0/1:75,423:268:-790.38,-80.71,-278.68:99
-chr1 805386 rs61768239 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=483;Dels=0.00;HRun=1;HaplotypeScore=91.10;MQ=31.39;MQ0=41;OQ=3141.51;QD=6.50;SB=-667.16 GT:AD:DP:GL:GQ 0/1:227,256:265:-397.24,-79.81,-626.74:99
-chr1 805419 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=1;HaplotypeScore=30.13;MQ=32.93;MQ0=34;OQ=719.57;QD=1.75;SB=-330.57 GT:AD:DP:GL:GQ 0/1:225,186:205:-136.99,-61.75,-686.74:99
-chr1 805436 rs61768240 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=352;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=34.71;MQ0=24;OQ=2408.76;QD=6.84;SB=-1167.64 GT:AD:DP:GL:GQ 0/1:93,259:163:-293.26,-49.10,-323.35:99
-chr1 805464 . T C 90.93 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=2;HaplotypeScore=145.78;MQ=37.92;MQ0=13;QD=0.36;SB=50.70 GT:AD:DP:GL:GQ 0/1:218,34:131:-51.84,-39.46,-473.80:99
-chr1 805469 . G A 411.01 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=129.65;MQ=39.23;MQ0=10;QD=1.77;SB=-144.72 GT:AD:DP:GL:GQ 0/1:163,68:125:-82.03,-37.65,-380.30:99
-chr1 805474 . C T 980.44 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=4;HaplotypeScore=70.79;MQ=41.63;MQ0=7;QD=4.83;SB=-326.68 GT:AD:DP:GL:GQ 0/1:87,114:116:-136.29,-34.97,-264.49:99
-chr1 805480 . G T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=1;HaplotypeScore=5.97;MQ=42.07;MQ0=5;OQ=803.65;QD=4.10;SB=-259.91 GT:AD:DP:GL:GQ 0/1:87,109:116:-118.58,-34.93,-301.30:99
-chr1 805558 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=21.59;MQ=45.69;MQ0=3;OQ=812.25;QD=4.51;SB=-279.67 GT:AD:DP:GL:GQ 0/1:110,69:130:-123.67,-39.16,-392.54:99
-chr1 805591 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=34.23;MQ=41.40;MQ0=5;OQ=1850.17;QD=8.49;SB=-635.41 GT:AD:DP:GL:GQ 0/1:84,134:148:-232.88,-44.58,-338.13:99
-chr1 805603 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=0;HaplotypeScore=49.54;MQ=40.33;MQ0=6;OQ=1757.35;QD=7.35;SB=-559.93 GT:AD:DP:GL:GQ 0/1:109,130:154:-225.41,-46.39,-351.31:99
-chr1 805620 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=50.16;MQ=37.51;MQ0=8;OQ=230.26;QD=0.84;SB=134.91 GT:AD:DP:GL:GQ 0/1:246,28:171:-77.81,-51.50,-552.70:99
-chr1 805666 . G A 1332.87 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=0;HaplotypeScore=203.60;MQ=35.75;MQ0=0;QD=3.93;SB=119.41 GT:AD:DP:GL:GQ 0/1:281,58:223:-203.73,-67.16,-610.84:99
-chr1 805667 . T G 1225.05 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=341;Dels=0.00;HRun=2;HaplotypeScore=286.55;MQ=35.76;MQ0=2;QD=3.59;SB=122.41 GT:AD:DP:GL:GQ 0/1:261,66:222:-230.10,-104.31,-623.63:99
-chr1 805699 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=311;Dels=0.00;HRun=0;HaplotypeScore=73.71;MQ=35.76;MQ0=12;OQ=1765.48;QD=5.68;SB=-47.39 GT:AD:DP:GL:GQ 0/1:139,171:182:-234.66,-54.83,-454.10:99
-chr1 805716 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=1;HaplotypeScore=131.75;MQ=37.99;MQ0=12;OQ=2170.35;QD=7.72;SB=-121.23 GT:AD:DP:GL:GQ 0/1:87,193:163:-269.41,-49.09,-357.63:99
-chr1 805720 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=145.61;MQ=38.29;MQ0=13;OQ=527.98;QD=1.87;SB=137.43 GT:AD:DP:GL:GQ 0/1:237,44:165:-105.78,-49.70,-509.42:99
-chr1 805742 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=47.83;MQ=40.90;MQ0=15;OQ=1225.89;QD=5.11;SB=-296.81 GT:AD:DP:GL:GQ 0/1:97,143:138:-167.44,-41.57,-348.72:99
-chr1 805786 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=3.15;MQ=44.26;MQ0=7;OQ=155.59;QD=0.86;SB=-81.22 GT:AD:DP:GL:GQ 0/1:95,86:108:-51.37,-32.53,-383.93:99
-chr1 805792 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=9.50;MQ=44.61;MQ0=6;OQ=192.56;QD=1.10;SB=-88.24 GT:AD:DP:GL:GQ 0/1:93,82:108:-55.07,-32.53,-377.29:99
-chr1 805825 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=46.58;MQ0=3;OQ=327.36;QD=1.98;SB=-101.34 GT:AD:DP:GL:GQ 0/1:95,70:115:-70.67,-34.65,-378.60:99
-chr1 805831 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=10.96;MQ=47.14;MQ0=3;OQ=324.94;QD=2.11;SB=-17.64 GT:AD:DP:GL:GQ 0/1:97,57:110:-68.91,-33.13,-331.34:99
-chr1 805897 . G T 104.51 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=51.05;MQ0=2;QD=0.74;SB=119.34 GT:AD:DP:GL:GQ 0/1:121,19:121:-50.18,-36.44,-386.79:99
-chr1 805898 . C A 129.42 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=35.61;MQ=51.05;MQ0=2;QD=0.91;SB=116.38 GT:AD:DP:GL:GQ 0/1:123,19:121:-52.67,-36.45,-375.35:99
-chr1 805905 . T G 13.51 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=25.14;MQ=52.44;MQ0=2;QD=0.10;SB=92.42 GT:AD:DP:GL:GQ 0/1:98,32:107:-36.84,-32.23,-356.89:46.15
-chr1 806044 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=16.71;MQ=40.59;MQ0=35;OQ=921.37;QD=5.06;SB=-438.60 GT:AD:DP:GL:GQ 0/1:71,111:106:-127.34,-31.92,-261.51:99
-chr1 806066 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=250;Dels=0.00;HRun=1;HaplotypeScore=9.43;MQ=37.37;MQ0=38;OQ=287.57;QD=1.15;SB=103.29 GT:AD:DP:GL:GQ 0/1:214,36:146:-76.01,-43.97,-467.77:99
-chr1 806081 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=255;Dels=0.00;HRun=0;HaplotypeScore=39.62;MQ=37.88;MQ0=27;OQ=908.24;QD=3.56;SB=97.71 GT:AD:DP:GL:GQ 0/1:178,77:158:-141.71,-47.60,-556.49:99
-chr1 806157 . T C 806.81 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=71.06;MQ=40.64;MQ0=4;QD=3.75;SB=110.40 GT:AD:DP:GL:GQ 0/1:92,123:126:-121.92,-37.95,-368.73:99
-chr1 806159 . A C 141.17 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=72.96;MQ=40.68;MQ0=4;QD=0.64;SB=110.38 GT:AD:DP:GL:GQ 0/1:166,49:128:-59.78,-42.38,-415.09:99
-chr1 806180 . A G 18.74 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=0;HaplotypeScore=59.33;MQ=41.65;MQ0=4;QD=0.09;SB=116.41 GT:AD:DP:GL:GQ 0/1:140,60:110:-38.29,-33.13,-408.92:51.52
-chr1 806197 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=1;HaplotypeScore=58.42;MQ=43.62;MQ0=5;OQ=190.94;QD=0.95;SB=134.47 GT:AD:DP:GL:GQ 0/1:110,91:116:-57.32,-34.94,-409.71:99
-chr1 806222 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=4;HaplotypeScore=6.94;MQ=47.96;MQ0=4;OQ=291.81;QD=1.80;SB=146.43 GT:AD:DP:GL:GQ 0/1:98,64:114:-66.80,-34.33,-354.69:99
-chr1 806232 . T A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=1;HaplotypeScore=11.98;MQ=49.02;MQ0=3;OQ=233.87;QD=1.55;SB=140.48 GT:AD:DP:GL:GQ 0/1:96,55:110:-59.80,-33.13,-362.79:99
-chr1 806258 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=0;HaplotypeScore=10.30;MQ=50.03;MQ0=8;OQ=407.17;QD=2.51;SB=100.40 GT:AD:DP:GL:GQ 0/1:106,56:126:-81.95,-37.95,-384.61:99
-chr1 806268 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=1;HaplotypeScore=25.82;MQ=48.78;MQ0=9;OQ=670.14;QD=4.09;SB=84.39 GT:AD:DP:GL:GQ 0/1:109,55:126:-108.24,-37.95,-362.57:99
-chr1 806273 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=24.82;MQ=48.14;MQ0=9;OQ=549.55;QD=3.23;SB=88.59 GT:AD:DP:GL:GQ 0/1:119,51:130:-97.39,-39.15,-372.33:99
-chr1 806316 . T G 0.95 PASS AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=0;HaplotypeScore=6.00;MQ=41.01;MQ0=11;OQ=1685.25;QD=7.49;SB=-248.74 GT:AD:DP:GL:GQ 0/1:86,139:148:-216.38,-44.57,-322.16:99
-chr1 806332 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=118.47;MQ=40.66;MQ0=10;OQ=669.93;QD=2.51;SB=-242.01 GT:AD:DP:GL:GQ 0/1:204,61:176:-123.31,-53.03,-632.31:99
-chr1 806338 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=0;HaplotypeScore=122.42;MQ=40.64;MQ0=8;OQ=2439.01;QD=9.17;SB=-856.79 GT:AD:DP:GL:GQ 0/1:98,144:180:-333.38,-86.20,-389.89:99
-chr1 806349 . G A 3132.30 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=280;Dels=0.07;HRun=0;HaplotypeScore=186.48;MQ=39.25;MQ0=4;QD=11.19;SB=-1153.15 GT:AD:DP:GL:GQ 0/1:91,170:182:-371.34,-54.83,-329.61:99
-chr1 806378 rs61768241 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=371;Dels=0.00;HRun=0;HaplotypeScore=37.20;MQ=35.74;MQ0=10;OQ=1136.07;QD=3.06;SB=-392.71 GT:AD:DP:GL:GQ 0/1:284,87:244:-190.38,-73.49,-742.15:99
-chr1 806405 . A T 171.83 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=402;Dels=0.02;HRun=5;HaplotypeScore=383.28;MQ=34.90;MQ0=14;QD=0.43;SB=-100.81 GT:AD:DP:GL:GQ 0/1:350,43:240:-91.25,-70.78,-803.92:99
-chr1 806411 . A T 5745.19 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=405;Dels=0.00;HRun=5;HaplotypeScore=552.66;MQ=35.31;MQ0=14;QD=14.19;SB=-2306.85 GT:AD:DP:GL:GQ 0/1:102,301:243:-573.52,-72.58,-344.41:99
-chr1 806412 . A T 2395.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=407;Dels=0.00;HRun=0;HaplotypeScore=506.57;MQ=35.27;MQ0=14;QD=5.89;SB=-1049.34 GT:AD:DP:GL:GQ 0/1:219,186:244:-315.74,-72.89,-600.57:99
-chr1 806419 . G T 930.64 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=4;HaplotypeScore=220.68;MQ=34.42;MQ0=17;QD=2.15;SB=-419.01 GT:AD:DP:GL:GQ 0/1:342,91:258:-174.05,-77.70,-758.54:99
-chr1 806424 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=450;Dels=0.00;HRun=4;HaplotypeScore=249.41;MQ=33.94;MQ0=20;OQ=971.28;QD=2.16;SB=-437.51 GT:AD:DP:GL:GQ 0/1:358,92:263:-179.62,-79.21,-806.78:99
-chr1 806430 rs61768242 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=441;Dels=0.01;HRun=1;HaplotypeScore=160.65;MQ=34.18;MQ0=22;OQ=1511.20;QD=3.43;SB=-624.36 GT:AD:DP:GL:GQ 0/1:304,134:257:-231.81,-77.41,-730.64:99
-chr1 806460 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=368;Dels=0.01;HRun=0;HaplotypeScore=18.13;MQ=35.78;MQ0=21;OQ=826.67;QD=2.25;SB=-89.07 GT:AD:DP:GL:GQ 0/1:306,59:217:-150.70,-64.75,-660.76:99
-chr1 806471 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=38.11;MQ0=12;OQ=2295.87;QD=7.92;SB=-836.85 GT:AD:DP:GL:GQ 0/1:88,202:166:-282.86,-49.99,-314.28:99
-chr1 806472 . T G 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=38.55;MQ0=12;OQ=2108.07;QD=7.42;SB=-683.52 GT:AD:DP:GL:GQ 0/1:91,193:165:-263.78,-49.69,-338.75:99
-chr1 806498 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=2;HaplotypeScore=28.30;MQ=42.69;MQ0=9;OQ=436.81;QD=2.11;SB=-20.91 GT:AD:DP:GL:GQ 0/1:161,46:144:-90.38,-43.41,-400.65:99
-chr1 806543 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=100.50;MQ=43.92;MQ0=14;OQ=975.93;QD=5.00;SB=-107.11 GT:AD:DP:GL:GQ 0/1:89,101:124:-149.49,-48.61,-281.82:99
-chr1 806545 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=0;HaplotypeScore=104.33;MQ=43.14;MQ0=16;OQ=1451.12;QD=6.88;SB=-262.10 GT:AD:DP:GL:GQ 0/1:103,108:137:-189.66,-41.27,-324.56:99
-chr1 806559 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=338;Dels=0.00;HRun=5;HaplotypeScore=96.33;MQ=38.72;MQ0=24;OQ=1155.72;QD=3.42;SB=-374.82 GT:AD:DP:GL:GQ 0/1:243,83:209:-199.57,-80.72,-560.52:99
-chr1 806579 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=0;HaplotypeScore=77.21;MQ=36.57;MQ0=25;OQ=319.95;QD=0.84;SB=31.35 GT:AD:DP:GL:GQ 0/1:306,63:241:-152.76,-117.48,-790.42:99
-chr1 806588 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=0;HaplotypeScore=158.67;MQ=35.58;MQ0=25;OQ=4390.20;QD=10.76;SB=-833.37 GT:AD:DP:GL:GQ 0/1:156,252:245:-438.02,-73.80,-510.93:99
-chr1 806591 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=423;Dels=0.00;HRun=0;HaplotypeScore=153.73;MQ=35.14;MQ0=25;OQ=116.80;QD=0.28;SB=22.12 GT:AD:DP:GL:GQ 0/1:359,64:250:-90.26,-75.29,-922.92:99
-chr1 806599 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=465;Dels=0.00;HRun=3;HaplotypeScore=92.78;MQ=34.88;MQ0=25;OQ=533.96;QD=1.15;SB=-62.62 GT:AD:DP:GL:GQ 0/1:398,67:259:-134.68,-78.00,-790.36:99
-chr1 806614 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=4;HaplotypeScore=128.97;MQ=33.43;MQ0=27;OQ=171.34;QD=0.31;SB=81.53 GT:AD:DP:GL:GQ 0/1:512,39:328:-122.57,-102.16,-1083.77:99
-chr1 806616 . A C 48.77 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=560;Dels=0.00;HRun=0;HaplotypeScore=145.79;MQ=33.35;MQ0=27;QD=0.09;SB=125.19 GT:AD:DP:GL:GQ 0/1:521,38:333:-108.15,-99.99,-1104.08:81.61
-chr1 806647 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=500;Dels=0.00;HRun=1;HaplotypeScore=106.37;MQ=33.16;MQ0=15;OQ=6479.54;QD=12.96;SB=-2653.75 GT:AD:DP:GL:GQ 0/1:87,413:252:-646.95,-75.89,-317.53:99
-chr1 806652 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=463;Dels=0.00;HRun=0;HaplotypeScore=119.18;MQ=33.47;MQ0=16;OQ=6167.91;QD=13.32;SB=-2596.35 GT:AD:DP:GL:GQ 0/1:76,386:224:-615.79,-67.46,-279.43:99
-chr1 806659 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=0;HaplotypeScore=138.09;MQ=33.68;MQ0=14;OQ=4821.66;QD=11.70;SB=-2064.94 GT:AD:DP:GL:GQ 0/1:127,285:208:-481.17,-62.64,-276.81:99
-chr1 806663 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=403;Dels=0.00;HRun=1;HaplotypeScore=116.74;MQ=34.29;MQ0=14;OQ=4902.23;QD=12.16;SB=-2019.44 GT:AD:DP:GL:GQ 0/1:76,327:212:-489.22,-63.85,-279.67:99
-chr1 806698 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=346;Dels=0.00;HRun=0;HaplotypeScore=104.08;MQ=36.06;MQ0=23;OQ=205.16;QD=0.59;SB=41.51 GT:AD:DP:GL:GQ 0/1:305,41:216:-88.85,-65.05,-740.73:99
-chr1 806719 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=400.08;MQ=40.22;MQ0=20;OQ=582.43;QD=2.75;SB=89.75 GT:AD:DP:GL:GQ 0/1:145,66:134:-101.59,-40.07,-419.05:99
-chr1 806735 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=24.14;MQ=41.77;MQ0=24;OQ=129.16;QD=0.59;SB=143.49 GT:AD:DP:GL:GQ 0/1:169,49:138:-57.78,-41.58,-482.40:99
-chr1 806755 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=0;HaplotypeScore=72.66;MQ=42.05;MQ0=23;OQ=1702.34;QD=7.99;SB=-97.29 GT:AD:DP:GL:GQ 0/1:86,127:148:-218.09,-44.57,-348.93:99
-chr1 806758 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=66.82;MQ=42.51;MQ0=24;OQ=101.05;QD=0.48;SB=140.48 GT:AD:DP:GL:GQ 0/1:180,31:147:-57.67,-44.28,-533.12:99
-chr1 806774 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=33.98;MQ=43.76;MQ0=28;OQ=1370.17;QD=7.29;SB=4.43 GT:AD:DP:GL:GQ 0/1:94,94:136:-181.26,-40.96,-326.53:99
-chr1 806807 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=247;Dels=0.00;HRun=1;HaplotypeScore=84.17;MQ=41.43;MQ0=32;OQ=1901.04;QD=7.70;SB=-364.66 GT:AD:DP:GL:GQ 0/1:93,133:161:-255.61,-62.23,-399.73:99
-chr1 806819 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=1;HaplotypeScore=51.78;MQ=39.46;MQ0=35;OQ=117.55;QD=0.45;SB=-52.87 GT:AD:DP:GL:GQ 0/1:235,29:167:-65.33,-50.29,-569.53:99
-chr1 806835 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=24.93;MQ=38.15;MQ0=32;OQ=3184.79;QD=11.46;SB=-1086.54 GT:AD:DP:GL:GQ 0/1:75,203:179:-375.67,-53.91,-276.38:99
-chr1 806857 . A G 426.69 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=0;HaplotypeScore=416.26;MQ=36.42;MQ0=33;QD=1.10;SB=-205.00 GT:AD:DP:GL:GQ 0/1:336,52:260:-124.27,-78.32,-915.07:99
-chr1 806858 . A C 2180.12 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=390;Dels=0.00;HRun=1;HaplotypeScore=419.10;MQ=36.36;MQ0=33;QD=5.59;SB=-410.18 GT:AD:DP:GL:GQ 0/1:135,134:259:-523.35,-302.06,-691.29:99
-chr1 806860 . T C 364.40 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=414;Dels=0.02;HRun=1;HaplotypeScore=391.10;MQ=36.35;MQ0=33;QD=0.88;SB=-200.49 GT:AD:DP:GL:GQ 0/1:360,44:277:-126.33,-86.61,-1004.70:99
-chr1 806864 . G A 1874.70 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=430;Dels=0.00;HRun=0;HaplotypeScore=443.75;MQ=36.02;MQ0=32;QD=4.36;SB=-378.35 GT:AD:DP:GL:GQ 0/1:340,90:284:-276.29,-85.54,-766.79:99
-chr1 806872 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=439;Dels=0.00;HRun=3;HaplotypeScore=61.91;MQ=35.95;MQ0=27;OQ=241.94;QD=0.55;SB=-56.85 GT:AD:DP:GL:GQ 0/1:394,45:294:-116.03,-88.55,-994.05:99
-chr1 806914 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=1;HaplotypeScore=82.84;MQ=36.13;MQ0=15;OQ=91.45;QD=0.21;SB=145.33 GT:AD:DP:GL:GQ 0/1:380,53:292:-100.38,-87.95,-1073.99:99
-chr1 806929 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=1;HaplotypeScore=53.78;MQ=36.16;MQ0=12;OQ=628.62;QD=1.60;SB=165.96 GT:AD:DP:GL:GQ 0/1:300,94:257:-143.55,-77.40,-778.57:99
-chr1 806933 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=384;Dels=0.00;HRun=1;HaplotypeScore=52.56;MQ=36.30;MQ0=13;OQ=624.21;QD=1.63;SB=148.11 GT:AD:DP:GL:GQ 0/1:298,86:253:-141.91,-76.20,-801.85:99
-chr1 807097 rs4970387 A T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=141;Dels=0.00;HRun=4;HaplotypeScore=35.71;MQ=49.47;MQ0=9;OQ=3569.50;QD=25.32;SB=-1647.14 GT:AD:DP:GL:GQ 1/1:0,141:95:-355.95,-28.62,-0.03:99
-chr1 807120 . C T 28.74 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=5;HaplotypeScore=8.47;MQ=47.00;MQ0=10;QD=0.19;SB=107.30 GT:AD:DP:GL:GQ 0/1:82,66:90:-33.27,-27.11,-295.41:61.57
-chr1 807127 . C G 240.31 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=32.57;MQ=46.64;MQ0=10;QD=1.61;SB=107.38 GT:AD:DP:GL:GQ 0/1:80,69:92:-55.04,-27.72,-340.23:99
-chr1 807132 . T C 652.10 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=41.20;MQ=46.24;MQ0=10;QD=4.29;SB=107.38 GT:AD:DP:GL:GQ 0/1:77,75:102:-99.22,-30.73,-310.86:99
-chr1 807136 . C A 59.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=2;HaplotypeScore=75.46;MQ=45.64;MQ0=10;QD=0.36;SB=6.21 GT:AD:DP:GL:GQ 0/1:135,27:108:-41.72,-32.53,-330.47:91.87
-chr1 807137 . T G 132.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=74.46;MQ=45.79;MQ0=10;QD=0.83;SB=113.39 GT:AD:DP:GL:GQ 0/1:140,19:114:-50.84,-34.34,-356.98:99
-chr1 807144 . G C 321.19 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=33.44;MQ=44.89;MQ0=10;QD=1.96;SB=17.66 GT:AD:DP:GL:GQ 0/1:131,27:122:-82.39,-46.99,-445.41:99
-chr1 807168 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=236.47;MQ=42.45;MQ0=9;OQ=1209.57;QD=6.91;SB=-394.74 GT:AD:DP:GL:GQ 0/1:124,51:131:-163.71,-39.47,-414.74:99
-chr1 807169 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=262.45;MQ=42.56;MQ0=9;OQ=108.48;QD=0.61;SB=74.80 GT:AD:DP:GL:GQ 0/1:162,17:135:-54.79,-40.66,-456.43:99
-chr1 807188 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.01;HRun=8;HaplotypeScore=227.66;MQ=43.88;MQ0=1;OQ=1264.52;QD=6.80;SB=-460.79 GT:AD:DP:GL:GQ 0/1:118,67:149:-174.32,-44.58,-377.47:99
-chr1 807190 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=246.34;MQ=43.75;MQ0=1;OQ=529.31;QD=2.86;SB=137.46 GT:AD:DP:GL:GQ 0/1:148,37:145:-99.89,-43.67,-443.33:99
-chr1 807204 . A C 36.37 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=12.98;MQ=42.45;MQ0=6;QD=0.19;SB=109.90 GT:AD:DP:GL:GQ 0/1:167,21:153:-53.00,-46.08,-519.54:69.21
-chr1 807245 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=1;HaplotypeScore=17.90;MQ=38.97;MQ0=18;OQ=1145.58;QD=6.94;SB=-550.34 GT:AD:DP:GL:GQ 0/1:87,78:121:-154.28,-36.44,-312.35:99
-chr1 807259 . G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=39.36;MQ0=20;OQ=646.71;QD=4.25;SB=-192.93 GT:AD:DP:GL:GQ 0/1:96,56:108:-100.48,-32.53,-300.21:99
-chr1 807350 rs4082611 G A 0.14 PASS AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=9.97;MQ=44.42;MQ0=8;OQ=866.67;QD=5.70;SB=98.31 GT:AD:DP:GL:GQ 0/1:80,69:106:-125.51,-35.56,-282.07:99
-chr1 807353 . C A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=8.92;MQ=43.77;MQ0=8;OQ=867.33;QD=5.45;SB=95.29 GT:AD:DP:GL:GQ 0/1:76,83:108:-122.54,-32.52,-265.26:99
-chr1 807384 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=0;HaplotypeScore=61.52;MQ=40.31;MQ0=13;OQ=503.09;QD=2.47;SB=116.39 GT:AD:DP:GL:GQ 0/1:145,57:132:-93.37,-39.78,-338.75:99
-chr1 807385 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=61.52;MQ=40.32;MQ0=13;OQ=1779.01;QD=8.76;SB=73.73 GT:AD:DP:GL:GQ 0/1:76,126:131:-220.64,-39.46,-278.09:99
-chr1 807400 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=1;HaplotypeScore=26.31;MQ=38.88;MQ0=12;OQ=2472.80;QD=10.18;SB=76.74 GT:AD:DP:GL:GQ 0/1:81,162:155:-297.25,-46.69,-297.33:99
-chr1 807412 rs4082610 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=262;Dels=0.00;HRun=4;HaplotypeScore=30.19;MQ=38.31;MQ0=9;OQ=2516.42;QD=9.60;SB=119.38 GT:AD:DP:GL:GQ 0/1:109,153:168:-305.53,-50.60,-311.50:99
-chr1 807432 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=25.55;MQ=38.32;MQ0=6;OQ=4433.84;QD=16.92;SB=-160.81 GT:AD:DP:GL:GQ 0/1:80,182:176:-442.38,-53.03,-343.20:99
-chr1 807469 . C T 416.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=92.28;MQ=41.14;MQ0=1;QD=1.98;SB=-49.34 GT:AD:DP:GL:GQ 0/1:84,126:97:-74.18,-29.22,-280.73:99
-chr1 807471 . A C 318.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=2;HaplotypeScore=90.45;MQ=41.29;MQ0=1;QD=1.49;SB=-31.35 GT:AD:DP:GL:GQ 0/1:85,128:99:-64.91,-29.81,-297.50:99
-chr1 807475 . C T 356.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=0;HaplotypeScore=174.77;MQ=40.93;MQ0=2;QD=1.67;SB=-36.29 GT:AD:DP:GL:GQ 0/1:85,128:101:-69.35,-30.45,-273.00:99
-chr1 807484 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=1;HaplotypeScore=266.19;MQ=40.31;MQ0=2;OQ=100.09;QD=0.47;SB=95.09 GT:AD:DP:GL:GQ 0/1:168,47:127:-51.55,-38.26,-450.15:99
-chr1 807508 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=1;HaplotypeScore=7.00;MQ=41.28;MQ0=4;OQ=211.72;QD=1.14;SB=90.69 GT:AD:DP:GL:GQ 0/1:142,43:119:-60.30,-35.84,-379.49:99
-chr1 807527 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=2;HaplotypeScore=9.95;MQ=41.68;MQ0=7;OQ=177.85;QD=1.10;SB=146.44 GT:AD:DP:GL:GQ 0/1:119,42:108:-53.60,-32.53,-346.10:99
-chr1 807556 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=1;HaplotypeScore=66.91;MQ=41.77;MQ0=6;OQ=532.40;QD=3.89;SB=-236.01 GT:AD:DP:GL:GQ 0/1:68,69:85:-82.13,-25.60,-230.23:99
-chr1 807561 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=0;HaplotypeScore=70.93;MQ=41.65;MQ0=7;OQ=124.65;QD=0.89;SB=101.32 GT:AD:DP:GL:GQ 0/1:96,44:87:-41.95,-26.20,-282.69:99
-chr1 807571 rs34106744 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=3;HaplotypeScore=33.63;MQ=41.31;MQ0=9;OQ=377.46;QD=2.80;SB=-157.65 GT:AD:DP:GL:GQ 0/1:62,73:80:-65.12,-24.09,-230.06:99
-chr1 807588 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=29.86;MQ=39.35;MQ0=12;OQ=1527.96;QD=9.32;SB=-255.65 GT:AD:DP:GL:GQ 0/1:60,104:105:-187.72,-31.65,-191.88:99
-chr1 807611 . G C 0.98 PASS AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=7.78;MQ=38.64;MQ0=13;OQ=1984.90;QD=11.81;SB=-213.08 GT:AD:DP:GL:GQ 0/1:60,108:111:-235.21,-33.44,-245.33:99
-chr1 807628 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=0;HaplotypeScore=15.09;MQ=38.17;MQ0=13;OQ=1889.96;QD=9.74;SB=-59.93 GT:AD:DP:GL:GQ 0/1:68,126:123:-229.33,-37.05,-239.27:99
-chr1 807662 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=324;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=35.02;MQ0=24;OQ=5029.36;QD=15.52;SB=-1355.57 GT:AD:DP:GL:GQ 0/1:79,245:206:-501.94,-62.04,-299.38:99
-chr1 807698 rs61768243 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=413;Dels=0.00;HRun=1;HaplotypeScore=119.83;MQ=33.65;MQ0=41;OQ=7356.92;QD=17.81;SB=-2911.42 GT:AD:DP:GL:GQ 0/1:85,328:252:-734.69,-75.92,-368.28:99
-chr1 807726 rs61768244 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=451;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=33.55;MQ0=36;OQ=2315.76;QD=5.13;SB=-928.19 GT:AD:DP:GL:GQ 0/1:303,148:263:-314.08,-79.22,-727.35:99
-chr1 807759 rs4034377 A C 755.20 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=336;Dels=0.00;HRun=0;HaplotypeScore=236.06;MQ=33.74;MQ0=39;QD=2.25;SB=-109.97 GT:AD:DP:GL:GQ 0/1:260,76:175:-131.50,-52.70,-521.92:99
-chr1 807761 . A G 2451.79 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=328;Dels=0.00;HRun=0;HaplotypeScore=310.08;MQ=33.84;MQ0=39;QD=7.47;SB=-739.45 GT:AD:DP:GL:GQ 0/1:164,163:171:-299.96,-51.50,-359.62:99
-chr1 807766 rs3969819 A C 564.07 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=320;Dels=0.00;HRun=0;HaplotypeScore=284.38;MQ=33.76;MQ0=45;QD=1.76;SB=-303.05 GT:AD:DP:GL:GQ 0/1:266,53:164:-109.08,-49.39,-509.36:99
-chr1 807787 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=301;Dels=0.00;HRun=1;HaplotypeScore=10.94;MQ=35.09;MQ0=34;OQ=678.04;QD=2.25;SB=50.87 GT:AD:DP:GL:GQ 0/1:179,122:124:-108.43,-37.34,-358.12:99
-chr1 807799 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=330;Dels=0.00;HRun=1;HaplotypeScore=46.01;MQ=35.31;MQ0=34;OQ=1300.39;QD=3.94;SB=-358.87 GT:AD:DP:GL:GQ 0/1:191,139:161:-181.81,-48.48,-410.83:99
-chr1 807817 rs4034379 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=305;Dels=0.00;HRun=0;HaplotypeScore=40.59;MQ=36.43;MQ0=47;OQ=1097.69;QD=3.60;SB=-508.19 GT:AD:DP:GL:GQ 0/1:205,100:154:-159.44,-46.39,-521.49:99
-chr1 807831 rs4034380 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=324;Dels=0.00;HRun=0;HaplotypeScore=53.25;MQ=36.07;MQ0=54;OQ=860.18;QD=2.65;SB=-52.35 GT:AD:DP:GL:GQ 0/1:235,89:165:-139.00,-49.70,-477.57:99
-chr1 807843 rs61768247 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=340;Dels=0.00;HRun=3;HaplotypeScore=25.24;MQ=35.61;MQ0=59;OQ=2917.98;QD=8.58;SB=-1176.92 GT:AD:DP:GL:GQ 0/1:93,247:179:-348.99,-53.91,-340.62:99
-chr1 807878 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=3;HaplotypeScore=1.68;MQ=33.99;MQ0=59;OQ=2636.13;QD=7.75;SB=-1148.59 GT:AD:DP:GL:GQ 0/1:141,199:182:-321.71,-54.82,-379.20:99
-chr1 807900 rs61768248 A G 107.46 PASS AC=1;AF=0.50;AN=2;DB;DP=254;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=36.51;MQ0=52;OQ=2423.92;QD=9.54;SB=-510.71 GT:AD:DP:GL:GQ 0/1:72,182:155:-292.36,-46.69,-288.83:99
-chr1 807921 rs4034381 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=0;HaplotypeScore=52.91;MQ=37.12;MQ0=38;OQ=730.38;QD=3.07;SB=87.15 GT:AD:DP:GL:GQ 0/1:169,69:152:-122.12,-45.80,-464.61:99
-chr1 807923 rs2311679 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=1;HaplotypeScore=53.91;MQ=36.90;MQ0=37;OQ=150.90;QD=0.63;SB=114.49 GT:AD:DP:GL:GQ 0/1:205,33:149:-63.25,-44.87,-483.89:99
-chr1 807940 rs61768249 C T 132.32 PASS AC=1;AF=0.50;AN=2;DB;DP=201;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=39.52;MQ0=18;OQ=2365.28;QD=11.77;SB=-227.57 GT:AD:DP:GL:GQ 0/1:70,131:135:-280.47,-40.66,-242.20:99
-chr1 807969 . G T 0.34 PASS AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=3.99;MQ=40.13;MQ0=16;OQ=852.49;QD=4.24;SB=25.59 GT:AD:DP:GL:GQ 0/1:139,62:138:-130.10,-41.57,-369.51:99
-chr1 807986 . G A 410.65 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=0;HaplotypeScore=37.75;MQ=40.61;MQ0=11;QD=2.15;SB=32.93 GT:AD:DP:GL:GQ 0/1:73,117:91:-71.78,-27.44,-235.41:99
-chr1 807989 . A G 41.79 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=63.74;MQ=41.32;MQ0=11;QD=0.24;SB=71.44 GT:AD:DP:GL:GQ 0/1:71,104:80:-31.56,-24.09,-295.20:74.62
-chr1 807990 . G T 63.48 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=63.74;MQ=41.32;MQ0=11;QD=0.36;SB=71.41 GT:AD:DP:GL:GQ 0/1:71,104:79:-33.42,-23.79,-250.10:96.32
-chr1 808001 rs2311681 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=1;HaplotypeScore=145.95;MQ=39.96;MQ0=12;OQ=189.55;QD=1.02;SB=-28.87 GT:AD:DP:GL:GQ 0/1:68,100:81:-53.53,-31.29,-271.83:99
-chr1 808002 . C T 30.08 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=1;HaplotypeScore=147.95;MQ=39.81;MQ0=12;QD=0.16;SB=5.97 GT:AD:DP:GL:GQ 0/1:124,64:83:-31.29,-25.00,-266.30:62.91
-chr1 808027 rs3969820 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=178;Dels=0.00;HRun=0;HaplotypeScore=57.38;MQ=38.17;MQ0=19;OQ=723.18;QD=4.06;SB=-165.45 GT:AD:DP:GL:GQ 0/1:134,44:108:-108.14,-32.53,-287.08:99
-chr1 808030 . A G 1086.71 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=0;HaplotypeScore=42.92;MQ=38.47;MQ0=18;QD=6.51;SB=-568.31 GT:AD:DP:GL:GQ 0/1:57,109:99:-141.80,-29.84,-220.97:99
-chr1 808043 . A G 970.86 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=1;HaplotypeScore=39.52;MQ=39.24;MQ0=20;QD=6.11;SB=-490.82 GT:AD:DP:GL:GQ 0/1:58,101:92:-128.08,-27.71,-229.15:99
-chr1 808058 rs4068670 A G 19.55 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=0;HaplotypeScore=41.67;MQ=39.19;MQ0=26;QD=0.13;SB=-33.62 GT:AD:DP:GL:GQ 0/1:54,74:61:-37.68,-32.44,-211.21:52.34
-chr1 808064 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=1;HaplotypeScore=40.55;MQ=38.61;MQ0=24;OQ=246.33;QD=1.85;SB=-81.77 GT:AD:DP:GL:GQ 0/1:48,85:54:-44.19,-16.27,-162.59:99
-chr1 808071 . C T 20.12 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=40.24;MQ=40.16;MQ0=22;QD=0.15;SB=14.54 GT:AD:DP:GL:GQ 0/1:54,82:58:-22.76,-17.47,-182.75:52.91
-chr1 808112 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=2;HaplotypeScore=125.36;MQ=37.91;MQ0=32;OQ=1776.62;QD=7.83;SB=-160.46 GT:AD:DP:GL:GQ 0/1:73,153:125:-218.60,-37.66,-274.51:99
-chr1 808131 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=257;Dels=0.00;HRun=1;HaplotypeScore=46.49;MQ=37.72;MQ0=22;OQ=2127.72;QD=8.28;SB=-282.13 GT:AD:DP:GL:GQ 0/1:106,150:146:-260.04,-43.99,-307.83:99
-chr1 808143 rs2871830 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=266;Dels=0.00;HRun=0;HaplotypeScore=22.61;MQ=37.96;MQ0=21;OQ=255.61;QD=0.96;SB=23.44 GT:AD:DP:GL:GQ 0/1:214,51:151:-74.35,-45.50,-504.23:99
-chr1 808170 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=1;HaplotypeScore=39.92;MQ=39.75;MQ0=13;OQ=386.02;QD=1.54;SB=116.39 GT:AD:DP:GL:GQ 0/1:201,50:155:-88.58,-46.69,-468.07:99
-chr1 808187 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=7;HaplotypeScore=162.06;MQ=41.27;MQ0=11;OQ=363.00;QD=1.65;SB=17.72 GT:AD:DP:GL:GQ 0/1:176,44:136:-80.56,-40.98,-399.39:99
-chr1 808189 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=288.29;MQ=41.39;MQ0=11;OQ=708.25;QD=3.28;SB=-149.01 GT:AD:DP:GL:GQ 0/1:142,53:138:-146.61,-72.50,-410.59:99
-chr1 808297 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=0;HaplotypeScore=21.45;MQ=38.78;MQ0=17;OQ=1228.84;QD=6.27;SB=-563.99 GT:AD:DP:GL:GQ 0/1:75,120:104:-157.52,-31.35,-213.62:99
-chr1 808336 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=1;HaplotypeScore=34.12;MQ=34.50;MQ0=28;OQ=414.84;QD=1.47;SB=-185.55 GT:AD:DP:GL:GQ 0/1:228,54:155:-91.47,-46.70,-585.75:99
-chr1 808347 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=78.29;MQ=34.29;MQ0=30;OQ=600.10;QD=2.16;SB=-67.28 GT:AD:DP:GL:GQ 0/1:221,39:151:-138.41,-75.12,-545.71:99
-chr1 808349 rs61768250 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=274;Dels=0.00;HRun=0;HaplotypeScore=172.09;MQ=34.47;MQ0=30;OQ=2858.46;QD=10.43;SB=-822.44 GT:AD:DP:GL:GQ 0/1:82,190:149:-334.02,-44.89,-232.77:99
-chr1 808359 . C T 950.38 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=0;HaplotypeScore=192.43;MQ=34.52;MQ0=31;QD=3.53;SB=-243.11 GT:AD:DP:GL:GQ 0/1:178,83:148:-142.90,-44.58,-399.15:99
-chr1 808362 . G A 76.04 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=113.80;MQ=34.64;MQ0=30;QD=0.28;SB=96.15 GT:AD:DP:GL:GQ 0/1:234,29:151:-56.37,-45.49,-495.71:99
-chr1 808363 . C A 14.91 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=113.80;MQ=34.60;MQ0=34;QD=0.05;SB=125.29 GT:AD:DP:GL:GQ 0/1:250,29:157:-52.05,-47.29,-518.11:47.61
-chr1 808367 . G A 731.54 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=120.25;MQ=34.34;MQ0=33;QD=2.52;SB=-82.29 GT:AD:DP:GL:GQ 0/1:229,61:165:-126.14,-49.70,-491.32:99
-chr1 808394 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=235;Dels=0.00;HRun=0;HaplotypeScore=10.16;MQ=37.74;MQ0=26;OQ=126.55;QD=0.54;SB=56.98 GT:AD:DP:GL:GQ 0/1:188,47:147:-60.25,-44.31,-434.17:99
-chr1 808413 . T G 317.98 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=2;HaplotypeScore=72.86;MQ=40.13;MQ0=20;QD=1.94;SB=-24.43 GT:AD:DP:GL:GQ 0/1:121,43:105:-66.71,-31.62,-317.98:99
-chr1 808417 . G A 68.93 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=67.03;MQ=42.13;MQ0=16;QD=0.46;SB=83.26 GT:AD:DP:GL:GQ 0/1:135,13:103:-41.21,-31.03,-340.99:99
-chr1 808421 . G A 1042.35 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=46.56;MQ=44.72;MQ0=15;QD=7.72;SB=-112.51 GT:AD:DP:GL:GQ 0/1:67,68:99:-137.34,-29.83,-234.94:99
-chr1 808447 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=2;HaplotypeScore=11.26;MQ=49.75;MQ0=9;OQ=392.50;QD=3.54;SB=-21.38 GT:AD:DP:GL:GQ 0/1:71,40:86:-68.46,-25.93,-223.10:99
-chr1 808451 . A T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=9.78;MQ=50.21;MQ0=9;OQ=368.72;QD=3.29;SB=-63.61 GT:AD:DP:GL:GQ 0/1:73,39:88:-66.66,-26.51,-263.45:99
-chr1 808566 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=42.07;MQ=40.72;MQ0=9;OQ=262.25;QD=1.45;SB=83.19 GT:AD:DP:GL:GQ 0/1:73,108:86:-55.43,-25.93,-233.09:99
-chr1 808594 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=0;HaplotypeScore=18.85;MQ=37.64;MQ0=16;OQ=690.50;QD=2.77;SB=110.37 GT:AD:DP:GL:GQ 0/1:80,169:110:-105.47,-33.14,-280.23:99
-chr1 808641 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=1;HaplotypeScore=21.83;MQ=33.64;MQ0=19;OQ=2063.93;QD=7.29;SB=28.04 GT:AD:DP:GL:GQ 0/1:72,211:133:-249.73,-40.06,-265.59:99
-chr1 808664 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=245;Dels=0.00;HRun=1;HaplotypeScore=236.43;MQ=34.77;MQ0=16;OQ=159.51;QD=0.65;SB=12.22 GT:AD:DP:GL:GQ 0/1:197,22:147:-105.83,-86.60,-492.17:99
-chr1 808677 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=233;Dels=0.00;HRun=0;HaplotypeScore=83.64;MQ=35.28;MQ0=11;OQ=206.00;QD=0.88;SB=113.55 GT:AD:DP:GL:GQ 0/1:190,43:144:-67.26,-43.38,-499.53:99
-chr1 808728 . C A 203.60 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=31.96;MQ=45.04;MQ0=12;QD=1.82;SB=15.39 GT:AD:DP:GL:GQ 0/1:87,25:80:-47.74,-24.10,-238.32:99
-chr1 808731 . C T 444.24 SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=24.97;MQ=46.65;MQ0=11;QD=4.04;SB=-165.40 GT:AD:DP:GL:GQ 0/1:69,41:86:-73.64,-25.93,-224.50:99
-chr1 808732 . G A 408.16 SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=24.97;MQ=46.65;MQ0=11;QD=3.71;SB=-130.98 GT:AD:DP:GL:GQ 0/1:69,41:85:-69.72,-25.62,-220.30:99
-chr1 808802 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=47.94;MQ=46.85;MQ0=10;OQ=50.85;QD=0.45;SB=55.37 GT:AD:DP:GL:GQ 0/1:67,39:74:-30.66,-22.29,-262.89:83.69
-chr1 808813 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=9.12;MQ=42.90;MQ0=8;OQ=68.22;QD=0.48;SB=65.92 GT:AD:DP:GL:GQ 0/1:121,22:85:-35.73,-25.62,-328.85:99
-chr1 808837 . A G 640.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=190.29;MQ=37.94;MQ0=4;QD=3.42;SB=66.67 GT:AD:DP:GL:GQ 0/1:64,123:88:-93.80,-26.51,-252.52:99
-chr1 808839 . G A 725.93 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=188;Dels=0.01;HRun=3;HaplotypeScore=118.63;MQ=37.90;MQ0=4;QD=3.86;SB=63.76 GT:AD:DP:GL:GQ 0/1:65,112:89:-102.68,-26.81,-229.73:99
-chr1 808842 . A G 234.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=1;HaplotypeScore=215.12;MQ=37.45;MQ0=5;QD=1.20;SB=62.67 GT:AD:DP:GL:GQ 0/1:152,43:87:-52.93,-26.20,-300.50:99
-chr1 808844 . C A 211.39 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=139.43;MQ=37.30;MQ0=5;QD=1.09;SB=62.33 GT:AD:DP:GL:GQ 0/1:151,43:87:-50.63,-26.20,-257.94:99
-chr1 808878 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=228;Dels=0.00;HRun=0;HaplotypeScore=11.87;MQ=35.54;MQ0=6;OQ=484.59;QD=2.13;SB=67.42 GT:AD:DP:GL:GQ 0/1:69,159:88:-78.25,-26.50,-268.80:99
-chr1 808900 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=0;HaplotypeScore=53.01;MQ=34.26;MQ0=7;OQ=319.52;QD=1.51;SB=101.36 GT:AD:DP:GL:GQ 0/1:68,143:78:-58.73,-23.49,-234.89:99
-chr1 808952 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=30.36;MQ0=16;OQ=684.75;QD=4.08;SB=-303.13 GT:AD:DP:GL:GQ 0/1:69,99:91:-99.17,-27.41,-260.34:99
-chr1 808969 rs57185426 C T 0.56 PASS AC=1;AF=0.50;AN=2;DB;DP=167;Dels=0.00;HRun=0;HaplotypeScore=6.98;MQ=27.19;MQ0=22;OQ=1308.35;QD=7.83;SB=-543.36 GT:AD:DP:GL:GQ 0/1:64,103:97:-163.35,-29.23,-183.79:99
-chr1 809028 rs61768251 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=24.74;MQ=37.22;MQ0=19;OQ=1197.89;QD=7.88;SB=-487.91 GT:AD:DP:GL:GQ 0/1:69,83:107:-155.31,-32.23,-252.53:99
-chr1 809058 . T C 0.11 PASS AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=4.46;MQ=47.89;MQ0=8;OQ=300.60;QD=2.95;SB=-111.38 GT:AD:DP:GL:GQ 0/1:71,31:84:-58.65,-25.31,-262.00:99
-chr1 809087 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=12.78;MQ=44.45;MQ0=38;OQ=174.63;QD=1.20;SB=29.35 GT:AD:DP:GL:GQ 0/1:79,66:90:-47.85,-27.11,-283.45:99
-chr1 809147 . A G 708.22 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=385;Dels=0.00;HRun=0;HaplotypeScore=142.43;MQ=32.08;MQ0=67;QD=1.84;SB=-338.08 GT:AD:DP:GL:GQ 0/1:273,112:167:-124.42,-50.31,-531.00:99
-chr1 809152 . A G 2828.87 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=380;Dels=0.00;HRun=0;HaplotypeScore=142.28;MQ=32.36;MQ0=64;QD=7.44;SB=-821.16 GT:AD:DP:GL:GQ 0/1:76,304:165:-335.87,-49.70,-295.78:99
-chr1 809155 . G A 906.28 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=379;Dels=0.00;HRun=1;HaplotypeScore=107.83;MQ=32.25;MQ0=64;QD=2.39;SB=-437.76 GT:AD:DP:GL:GQ 0/1:271,108:165:-143.61,-49.69,-484.11:99
-chr1 809196 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=2;HaplotypeScore=63.80;MQ=34.67;MQ0=22;OQ=1194.90;QD=4.80;SB=-269.68 GT:AD:DP:GL:GQ 0/1:67,182:101:-153.20,-30.42,-236.52:99
-chr1 809260 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=41.08;MQ0=8;OQ=376.66;QD=3.30;SB=116.36 GT:AD:DP:GL:GQ 0/1:80,34:93:-68.96,-28.01,-266.36:99
-chr1 809273 . T C 463.34 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=8.66;MQ=40.73;MQ0=7;QD=3.83;SB=119.42 GT:AD:DP:GL:GQ 0/1:85,36:100:-79.74,-30.12,-319.61:99
-chr1 809278 . T A 448.40 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=9.66;MQ=40.70;MQ0=10;QD=3.59;SB=128.40 GT:AD:DP:GL:GQ 0/1:95,30:101:-78.54,-30.42,-301.76:99
-chr1 809279 . C A 472.08 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=9.66;MQ=40.57;MQ0=10;QD=3.72;SB=128.43 GT:AD:DP:GL:GQ 0/1:97,30:103:-81.51,-31.02,-300.46:99
-chr1 809374 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=40.85;MQ=49.25;MQ0=14;OQ=274.74;QD=2.18;SB=128.46 GT:AD:DP:GL:GQ 0/1:85,41:95:-59.38,-28.62,-356.10:99
-chr1 809396 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=153;Dels=0.03;HRun=0;HaplotypeScore=81.33;MQ=46.63;MQ0=11;OQ=370.18;QD=2.42;SB=128.42 GT:AD:DP:GL:GQ 0/1:90,59:107:-71.93,-31.63,-311.43:99
-chr1 809418 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=0;HaplotypeScore=18.59;MQ=42.45;MQ0=17;OQ=1574.87;QD=7.57;SB=-383.90 GT:AD:DP:GL:GQ 0/1:84,123:141:-203.25,-42.48,-331.17:99
-chr1 809463 . T C 270.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=113.69;MQ=41.23;MQ0=17;QD=1.24;SB=22.33 GT:AD:DP:GL:GQ 0/1:180,37:141:-72.78,-42.48,-486.18:99
-chr1 809466 . G A 91.66 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=2;HaplotypeScore=122.84;MQ=41.24;MQ0=16;QD=0.43;SB=110.32 GT:AD:DP:GL:GQ 0/1:181,32:144:-55.83,-43.38,-458.71:99
-chr1 809470 . T C 630.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=2;HaplotypeScore=238.78;MQ=41.40;MQ0=14;QD=3.03;SB=-114.41 GT:AD:DP:GL:GQ 0/1:153,55:135:-107.03,-40.67,-427.65:99
-chr1 809480 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=103.82;MQ=41.73;MQ0=11;OQ=1974.03;QD=10.79;SB=-338.07 GT:AD:DP:GL:GQ 0/1:66,116:122:-237.45,-36.76,-206.62:99
-chr1 809721 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=3;HaplotypeScore=9.02;MQ=53.95;MQ0=4;OQ=80.85;QD=0.86;SB=59.35 GT:AD:DP:GL:GQ 0/1:75,18:84:-36.67,-25.30,-283.82:99
-chr1 809780 rs6605057 A G 0.76 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=11.81;MQ=56.13;MQ0=2;OQ=3054.85;QD=32.85;SB=-1362.55 GT:AD:DP:GL:GQ 1/1:0,93:85:-309.09,-25.60,-0.02:99
-chr1 809879 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=0;HaplotypeScore=59.97;MQ=40.35;MQ0=14;OQ=622.51;QD=3.19;SB=42.71 GT:AD:DP:GL:GQ 0/1:76,119:98:-95.05,-29.52,-272.29:99
-chr1 809895 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=1;HaplotypeScore=66.59;MQ=38.60;MQ0=19;OQ=465.46;QD=2.28;SB=92.30 GT:AD:DP:GL:GQ 0/1:110,94:92:-77.54,-27.71,-254.54:99
-chr1 809906 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=107.86;MQ=38.19;MQ0=19;OQ=204.28;QD=1.02;SB=98.35 GT:AD:DP:GL:GQ 0/1:163,38:93:-51.72,-28.01,-294.59:99
-chr1 810152 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=23.45;MQ=46.60;MQ0=18;OQ=256.17;QD=1.80;SB=89.22 GT:AD:DP:GL:GQ 0/1:80,62:93:-56.93,-28.03,-260.32:99
-chr1 810179 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=166;Dels=0.00;HRun=0;HaplotypeScore=40.97;MQ=43.29;MQ0=18;OQ=423.48;QD=2.55;SB=-10.82 GT:AD:DP:GL:GQ 0/1:90,76:99:-75.44,-29.81,-289.52:99
-chr1 810200 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=0;HaplotypeScore=91.89;MQ=44.44;MQ0=8;OQ=93.53;QD=0.60;SB=79.37 GT:AD:DP:GL:GQ 0/1:113,44:97:-41.85,-29.21,-309.84:99
-chr1 810211 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=3;HaplotypeScore=28.81;MQ=44.83;MQ0=8;OQ=438.48;QD=2.67;SB=-23.86 GT:AD:DP:GL:GQ 0/1:92,72:104:-78.46,-31.33,-303.09:99
-chr1 810249 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=0;HaplotypeScore=54.95;MQ=45.56;MQ0=5;OQ=532.92;QD=3.29;SB=-263.19 GT:AD:DP:GL:GQ 0/1:92,70:108:-89.11,-32.53,-336.39:99
-chr1 810266 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=6.95;MQ=49.31;MQ0=7;OQ=320.58;QD=2.31;SB=3.34 GT:AD:DP:GL:GQ 0/1:87,51:105:-66.97,-31.63,-352.01:99
-chr1 810282 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=2;HaplotypeScore=2.11;MQ=50.38;MQ0=7;OQ=214.82;QD=1.51;SB=75.99 GT:AD:DP:GL:GQ 0/1:98,44:111:-58.20,-33.43,-338.53:99
-chr1 810326 . T C 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.92;MQ0=10;OQ=89.69;QD=0.81;SB=59.40 GT:AD:DP:GL:GQ 0/1:87,24:95:-40.87,-28.62,-338.92:99
-chr1 810564 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=14.88;MQ=44.23;MQ0=6;OQ=498.14;QD=2.90;SB=-150.99 GT:AD:DP:GL:GQ 0/1:102,70:118:-88.65,-35.55,-364.99:99
-chr1 810629 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=38.71;MQ=50.61;MQ0=2;OQ=253.97;QD=2.29;SB=-143.03 GT:AD:DP:GL:GQ 0/1:83,27:94:-56.99,-28.31,-290.69:99
-chr1 810683 . T C 21.46 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=45.49;MQ0=13;QD=0.17;SB=104.38 GT:AD:DP:GL:GQ 0/1:80,50:88:-31.93,-26.50,-325.33:54.27
-chr1 810696 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=34.97;MQ=44.00;MQ0=14;OQ=294.30;QD=1.91;SB=110.32 GT:AD:DP:GL:GQ 0/1:85,69:98:-62.23,-29.52,-298.08:99
-chr1 810711 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=44.23;MQ=40.46;MQ0=17;OQ=839.07;QD=4.51;SB=107.39 GT:AD:DP:GL:GQ 0/1:81,105:106:-119.13,-31.94,-347.53:99
-chr1 810733 . C A 43.01 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=56.61;MQ=40.22;MQ0=16;QD=0.19;SB=125.38 GT:AD:DP:GL:GQ 0/1:192,33:131:-47.04,-39.45,-426.81:75.84
-chr1 810794 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=3;HaplotypeScore=52.64;MQ=44.21;MQ0=2;OQ=1066.68;QD=5.73;SB=31.06 GT:AD:DP:GL:GQ 0/1:92,94:128:-148.50,-38.55,-332.75:99
-chr1 810798 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=60.51;MQ=44.84;MQ0=1;OQ=1224.15;QD=6.69;SB=34.50 GT:AD:DP:GL:GQ 0/1:93,90:127:-163.96,-38.27,-393.95:99
-chr1 810830 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=3;HaplotypeScore=77.56;MQ=44.23;MQ0=2;OQ=74.26;QD=0.42;SB=98.47 GT:AD:DP:GL:GQ 0/1:145,25:125:-59.06,-48.35,-399.04:99
-chr1 810842 . C G 7.71 PASS AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=44.02;MQ0=3;OQ=1687.26;QD=9.37;SB=-373.48 GT:AD:DP:GL:GQ 0/1:84,96:131:-211.48,-39.47,-372.20:99
-chr1 810901 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=0;HaplotypeScore=76.75;MQ=45.85;MQ0=4;OQ=1193.00;QD=8.40;SB=-508.15 GT:AD:DP:GL:GQ 0/1:72,70:110:-155.72,-33.14,-263.20:99
-chr1 810906 . T C 38.41 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=84.75;MQ=46.22;MQ0=3;QD=0.29;SB=-42.29 GT:AD:DP:GL:GQ 0/1:104,29:99:-36.95,-29.82,-359.79:71.24
-chr1 810914 rs2871831 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=47.06;MQ0=6;OQ=781.68;QD=6.20;SB=-314.19 GT:AD:DP:GL:GQ 0/1:70,55:96:-110.36,-28.91,-259.38:99
-chr1 810923 . A T 0.10 PASS AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=1;HaplotypeScore=7.81;MQ=46.94;MQ0=8;OQ=838.41;QD=6.60;SB=-348.34 GT:AD:DP:GL:GQ 0/1:70,57:101:-117.55,-30.42,-266.19:99
-chr1 810974 rs61768253 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=90.96;MQ=39.12;MQ0=31;OQ=376.97;QD=2.37;SB=-131.06 GT:AD:DP:GL:GQ 0/1:90,68:97:-70.20,-29.22,-313.33:99
-chr1 810984 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=2;HaplotypeScore=97.32;MQ=34.90;MQ0=35;OQ=108.00;QD=0.52;SB=94.23 GT:AD:DP:GL:GQ 0/1:166,41:109:-46.91,-32.83,-360.50:99
-chr1 810998 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=0;HaplotypeScore=73.35;MQ=33.36;MQ0=43;OQ=73.40;QD=0.31;SB=-50.06 GT:AD:DP:GL:GQ 0/1:185,54:123:-47.67,-37.04,-404.38:99
-chr1 811006 rs61768254 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=248;Dels=0.00;HRun=1;HaplotypeScore=66.91;MQ=33.49;MQ0=48;OQ=832.91;QD=3.36;SB=-277.39 GT:AD:DP:GL:GQ 0/1:106,142:128:-125.13,-38.56,-331.35:99
-chr1 811069 rs35186927 T A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=481;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=31.63;MQ0=35;OQ=1139.00;QD=2.37;SB=-237.78 GT:AD:DP:GL:GQ 0/1:346,135:257:-194.59,-77.40,-784.30:99
-chr1 811112 rs2311684 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=350;Dels=0.00;HRun=0;HaplotypeScore=77.41;MQ=35.82;MQ0=8;OQ=2362.85;QD=6.75;SB=-654.92 GT:AD:DP:GL:GQ 0/1:216,134:219:-305.59,-66.02,-466.00:99
-chr1 811131 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=87.33;MQ=41.16;MQ0=2;OQ=4074.75;QD=16.43;SB=-1430.41 GT:AD:DP:GL:GQ 0/1:100,147:200:-406.47,-62.90,-355.42:99
-chr1 811184 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=2;HaplotypeScore=27.77;MQ=43.71;MQ0=0;OQ=460.52;QD=3.74;SB=149.45 GT:AD:DP:GL:GQ 0/1:91,32:108:-81.87,-32.53,-317.70:99
-chr1 811205 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=2;HaplotypeScore=18.01;MQ=44.82;MQ0=0;OQ=329.41;QD=2.86;SB=146.50 GT:AD:DP:GL:GQ 0/1:87,28:104:-67.56,-31.33,-345.48:99
-chr1 811285 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=37.25;MQ=40.88;MQ0=3;OQ=828.79;QD=5.53;SB=-15.76 GT:AD:DP:GL:GQ 0/1:66,84:93:-114.20,-28.04,-207.99:99
-chr1 811292 . G C 33.11 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=58.15;MQ=39.23;MQ0=3;QD=0.21;SB=95.35 GT:AD:DP:GL:GQ 0/1:79,14:72:-31.92,-25.33,-286.41:65.95
-chr1 811309 . A C 218.07 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=95.42;MQ=36.77;MQ0=3;QD=1.21;SB=75.78 GT:AD:DP:GL:GQ 0/1:95,84:77:-48.28,-23.19,-225.41:99
-chr1 811313 . C A 77.35 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=1;HaplotypeScore=126.41;MQ=36.87;MQ0=1;QD=0.41;SB=64.94 GT:AD:DP:GL:GQ 0/1:128,61:85:-36.63,-25.61,-260.99:99
-chr1 811315 . G A 900.17 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=189;Dels=0.00;HRun=1;HaplotypeScore=96.44;MQ=36.96;MQ0=1;QD=4.76;SB=64.69 GT:AD:DP:GL:GQ 0/1:57,131:88:-122.19,-28.89,-207.10:99
-chr1 811336 . T C 533.21 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=37.36;MQ0=1;QD=2.63;SB=59.62 GT:AD:DP:GL:GQ 0/1:62,140:81:-81.01,-24.41,-227.12:99
-chr1 811339 . T C 458.52 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=1;HaplotypeScore=44.80;MQ=38.07;MQ0=1;QD=2.29;SB=92.33 GT:AD:DP:GL:GQ 0/1:65,135:85:-74.74,-25.60,-261.77:99
-chr1 811347 . T G 278.98 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=226;Dels=0.00;HRun=3;HaplotypeScore=134.53;MQ=37.01;MQ0=0;QD=1.23;SB=83.27 GT:AD:DP:GL:GQ 0/1:65,161:80:-55.28,-24.10,-233.47:99
-chr1 811354 . C T 677.91 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=233;Dels=0.00;HRun=0;HaplotypeScore=163.01;MQ=36.31;MQ0=0;QD=2.91;SB=83.23 GT:AD:DP:GL:GQ 0/1:63,170:82:-95.80,-24.72,-187.92:99
-chr1 811362 . C T 454.65 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=226.76;MQ=36.80;MQ0=0;QD=1.97;SB=83.14 GT:AD:DP:GL:GQ 0/1:64,167:80:-72.88,-24.13,-190.51:99
-chr1 811364 . T C 196.31 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=1;HaplotypeScore=66.22;MQ=36.51;MQ0=0;QD=0.85;SB=79.92 GT:AD:DP:GL:GQ 0/1:84,145:75:-47.99,-25.07,-244.42:99
-chr1 811375 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=93.49;MQ=37.41;MQ0=0;OQ=1696.08;QD=7.34;SB=71.11 GT:AD:DP:GL:GQ 0/1:93,137:119:-208.77,-35.88,-209.62:99
-chr1 811378 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=1;HaplotypeScore=193.97;MQ=37.86;MQ0=0;OQ=1149.75;QD=4.81;SB=77.23 GT:AD:DP:GL:GQ 0/1:188,51:123:-155.31,-37.05,-314.47:99
-chr1 811386 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=2;HaplotypeScore=163.58;MQ=38.25;MQ0=0;OQ=516.99;QD=2.28;SB=29.28 GT:AD:DP:GL:GQ 0/1:149,78:121:-91.43,-36.45,-384.88:99
-chr1 811400 . C T 562.85 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=151.19;MQ=39.64;MQ0=0;QD=2.69;SB=23.60 GT:AD:DP:GL:GQ 0/1:96,113:102:-90.30,-30.73,-291.44:99
-chr1 811402 . C T 93.97 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=1;HaplotypeScore=101.45;MQ=39.46;MQ0=1;QD=0.46;SB=62.16 GT:AD:DP:GL:GQ 0/1:188,18:99:-42.50,-29.82,-326.30:99
-chr1 811408 . G T 250.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=192;Dels=0.00;HRun=0;HaplotypeScore=79.23;MQ=40.75;MQ0=2;QD=1.30;SB=59.20 GT:AD:DP:GL:GQ 0/1:111,80:98:-57.85,-29.52,-298.59:99
-chr1 811413 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=67.52;MQ=40.58;MQ0=2;OQ=77.44;QD=0.41;SB=62.19 GT:AD:DP:GL:GQ 0/1:97,91:86:-36.94,-25.92,-277.54:99
-chr1 811430 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=4;HaplotypeScore=58.87;MQ=40.65;MQ0=2;OQ=63.77;QD=0.39;SB=65.24 GT:AD:DP:GL:GQ 0/1:88,76:92:-37.38,-27.72,-324.79:96.61
-chr1 811435 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=19.26;MQ=40.95;MQ0=1;OQ=266.78;QD=1.72;SB=71.27 GT:AD:DP:GL:GQ 0/1:84,71:100:-60.08,-30.12,-340.43:99
-chr1 811443 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=2;HaplotypeScore=30.32;MQ=41.18;MQ0=1;OQ=189.19;QD=1.39;SB=77.28 GT:AD:DP:GL:GQ 0/1:79,56:91:-52.39,-30.19,-304.45:99
-chr1 811635 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=82.21;MQ=40.79;MQ0=16;OQ=141.45;QD=0.98;SB=-89.35 GT:AD:DP:GL:GQ 0/1:111,34:74:-39.73,-22.30,-281.80:99
-chr1 811650 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=95.82;MQ=42.47;MQ0=12;OQ=224.58;QD=1.65;SB=-61.36 GT:AD:DP:GL:GQ 0/1:66,70:76:-48.64,-22.89,-228.84:99
-chr1 811656 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=71.17;MQ=43.15;MQ0=11;OQ=112.09;QD=0.87;SB=-75.98 GT:AD:DP:GL:GQ 0/1:102,27:76:-37.39,-22.90,-238.94:99
-chr1 811750 rs6677354 A G 0.61 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=4.05;MQ=50.03;MQ0=0;OQ=1811.37;QD=31.78;SB=-810.16 GT:AD:DP:GL:GQ 1/1:0,56:52:-184.74,-15.66,-0.02:99
-chr1 811789 rs35660652 C G 23.26 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=4.89;MQ=49.27;MQ0=1;OQ=933.21;QD=16.97;SB=-483.19 GT:AD:DP:GL:GQ 0/1:25,30:48:-111.08,-14.47,-94.44:99
-chr1 811811 rs6671445 T C 60.28 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=51.17;MQ0=1;OQ=1096.50;QD=26.11;SB=-519.10 GT:AD:DP:GL:GQ 1/1:0,42:35:-113.27,-10.56,-0.03:99
-chr1 811899 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=32.15;MQ=43.49;MQ0=20;OQ=124.06;QD=1.01;SB=92.32 GT:AD:DP:GL:GQ 0/1:62,60:72:-37.38,-21.69,-248.07:99
-chr1 812359 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=23.61;MQ=48.84;MQ0=1;OQ=66.32;QD=0.77;SB=71.21 GT:AD:DP:GL:GQ 0/1:52,34:57:-27.09,-17.17,-171.46:99
-chr1 812367 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=15.11;MQ=47.39;MQ0=1;OQ=182.54;QD=1.77;SB=-16.56 GT:AD:DP:GL:GQ 0/1:55,46:66:-41.42,-19.89,-213.25:99
-chr1 812395 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=0;HaplotypeScore=16.89;MQ=44.59;MQ0=4;OQ=290.02;QD=1.97;SB=-35.46 GT:AD:DP:GL:GQ 0/1:75,71:87:-58.50,-26.21,-278.39:99
-chr1 812396 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=12.57;MQ=44.24;MQ0=4;OQ=510.01;QD=3.40;SB=-121.97 GT:AD:DP:GL:GQ 0/1:77,73:89:-81.09,-26.81,-250.00:99
-chr1 812452 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=1;HaplotypeScore=44.19;MQ=38.30;MQ0=6;OQ=174.18;QD=0.73;SB=140.46 GT:AD:DP:GL:GQ 0/1:178,59:128:-59.25,-38.55,-429.97:99
-chr1 812470 . G A 3027.24 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=2;HaplotypeScore=95.67;MQ=37.00;MQ0=5;QD=11.38;SB=-136.01 GT:AD:DP:GL:GQ 0/1:72,177:161:-375.45,-69.45,-279.59:99
-chr1 812474 . A G 225.39 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=98.08;MQ=36.45;MQ0=4;QD=0.80;SB=107.36 GT:AD:DP:GL:GQ 0/1:225,57:173:-77.95,-52.13,-605.26:99
-chr1 812476 . G A 4194.86 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=1;HaplotypeScore=148.97;MQ=36.56;MQ0=4;QD=14.98;SB=-125.96 GT:AD:DP:GL:GQ 0/1:71,208:172:-418.49,-51.81,-254.37:99
-chr1 812496 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=383;Dels=0.00;HRun=3;HaplotypeScore=110.05;MQ=34.24;MQ0=3;OQ=4072.28;QD=10.63;SB=-60.38 GT:AD:DP:GL:GQ 0/1:191,192:229:-406.23,-68.97,-420.64:99
-chr1 812509 . A G 1306.01 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=390;Dels=0.00;HRun=0;HaplotypeScore=338.39;MQ=34.90;MQ0=4;QD=3.35;SB=113.39 GT:AD:DP:GL:GQ 0/1:88,302:134:-174.25,-40.36,-354.14:99
-chr1 812511 . C T 253.04 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=392;Dels=0.00;HRun=1;HaplotypeScore=342.27;MQ=34.93;MQ0=3;QD=0.65;SB=107.37 GT:AD:DP:GL:GQ 0/1:210,181:105:-60.21,-31.62,-326.58:99
-chr1 812536 . C T 6216.93 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=431;Dels=0.00;HRun=0;HaplotypeScore=21.13;MQ=33.82;MQ0=5;QD=14.42;SB=89.30 GT:AD:DP:GL:GQ 0/1:86,345:239:-620.69,-71.99,-300.06:99
-chr1 812546 . A T 6301.61 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=5;HaplotypeScore=527.01;MQ=34.23;MQ0=5;QD=15.33;SB=95.32 GT:AD:DP:GL:GQ 0/1:107,219:261:-629.16,-251.98,-546.86:99
-chr1 812557 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=384;Dels=0.00;HRun=0;HaplotypeScore=98.60;MQ=34.24;MQ0=5;OQ=4742.49;QD=12.35;SB=92.31 GT:AD:DP:GL:GQ 0/1:201,182:235:-473.25,-70.78,-414.34:99
-chr1 812581 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=273;Dels=0.00;HRun=0;HaplotypeScore=142.64;MQ=35.76;MQ0=4;OQ=1205.24;QD=4.41;SB=74.26 GT:AD:DP:GL:GQ 0/1:167,71:149:-175.85,-52.04,-375.17:99
-chr1 812582 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=141.33;MQ=35.99;MQ0=4;OQ=1716.18;QD=6.43;SB=71.26 GT:AD:DP:GL:GQ 0/1:103,164:146:-218.89,-43.99,-346.52:99
-chr1 812608 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=1;HaplotypeScore=67.91;MQ=41.17;MQ0=4;OQ=693.18;QD=4.20;SB=50.19 GT:AD:DP:GL:GQ 0/1:102,63:97:-101.82,-29.21,-294.33:99
-chr1 812623 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=28.33;MQ=46.60;MQ0=1;OQ=165.38;QD=1.61;SB=41.15 GT:AD:DP:GL:GQ 0/1:59,44:68:-40.30,-20.48,-216.18:99
-chr1 812625 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=1;HaplotypeScore=28.33;MQ=46.70;MQ0=1;OQ=134.52;QD=1.27;SB=44.17 GT:AD:DP:GL:GQ 0/1:60,46:69:-37.52,-20.78,-218.11:99
-chr1 812637 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=37.48;MQ=47.73;MQ0=2;OQ=214.50;QD=1.87;SB=-61.85 GT:AD:DP:GL:GQ 0/1:67,48:77:-47.94,-23.20,-220.91:99
-chr1 812655 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=33.89;MQ=47.71;MQ0=3;OQ=405.95;QD=3.35;SB=-136.06 GT:AD:DP:GL:GQ 0/1:68,53:87:-70.08,-26.20,-247.74:99
-chr1 812661 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=2;HaplotypeScore=21.84;MQ=47.58;MQ0=5;OQ=365.64;QD=2.95;SB=-168.82 GT:AD:DP:GL:GQ 0/1:87,37:88:-66.35,-26.51,-263.64:99
-chr1 812666 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=21.15;MQ=47.18;MQ0=5;OQ=451.13;QD=3.67;SB=-190.13 GT:AD:DP:GL:GQ 0/1:65,57:86:-74.30,-25.91,-260.71:99
-chr1 812725 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=2;HaplotypeScore=17.99;MQ=47.07;MQ0=7;OQ=51.25;QD=0.37;SB=36.23 GT:AD:DP:GL:GQ 0/1:99,33:95:-37.06,-28.65,-279.36:84.09
-chr1 812740 . T A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=2;HaplotypeScore=10.99;MQ=47.57;MQ0=4;OQ=391.52;QD=3.08;SB=-178.55 GT:AD:DP:GL:GQ 0/1:69,58:85:-68.04,-25.60,-259.04:99
-chr1 812742 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=11.99;MQ=46.41;MQ0=4;OQ=355.87;QD=2.58;SB=-160.38 GT:AD:DP:GL:GQ 0/1:72,66:89:-65.67,-26.80,-277.85:99
-chr1 812772 . C A 4524.81 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=340;Dels=0.00;HRun=1;HaplotypeScore=205.36;MQ=35.68;MQ0=5;QD=13.31;SB=-1151.01 GT:AD:DP:GL:GQ 0/1:83,257:202:-451.48,-60.83,-296.00:99
-chr1 812774 . G A 5465.17 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=359;Dels=0.00;HRun=1;HaplotypeScore=230.04;MQ=35.29;MQ0=5;QD=15.22;SB=-1392.69 GT:AD:DP:GL:GQ 0/1:83,276:217:-545.52,-65.36,-295.35:99
-chr1 812778 . A C 2967.60 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=395;Dels=0.00;HRun=0;HaplotypeScore=217.58;MQ=34.63;MQ0=8;QD=7.51;SB=-725.51 GT:AD:DP:GL:GQ 0/1:219,176:242:-372.92,-72.88,-512.65:99
-chr1 812823 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=734;Dels=0.00;HRun=0;HaplotypeScore=134.36;MQ=30.02;MQ0=41;OQ=617.75;QD=0.84;SB=-157.33 GT:AD:DP:GL:GQ 0/1:653,81:442:-198.19,-133.13,-1425.62:99
-chr1 812838 rs657923 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=716;Dels=0.00;HRun=1;HaplotypeScore=212.74;MQ=29.97;MQ0=41;OQ=1388.92;QD=1.94;SB=-7.94 GT:AD:DP:GL:GQ 0/1:599,117:439:-274.39,-132.21,-1407.52:99
-chr1 812875 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=465;Dels=0.00;HRun=0;HaplotypeScore=110.91;MQ=32.05;MQ0=37;OQ=83.36;QD=0.18;SB=55.37 GT:AD:DP:GL:GQ 0/1:398,67:296:-100.77,-89.15,-980.63:99
-chr1 812885 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=346;Dels=0.00;HRun=1;HaplotypeScore=111.42;MQ=33.27;MQ0=30;OQ=5208.47;QD=15.05;SB=-2233.36 GT:AD:DP:GL:GQ 0/1:69,277:208:-519.85,-62.65,-238.95:99
-chr1 812886 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=335;Dels=0.00;HRun=1;HaplotypeScore=55.46;MQ=33.49;MQ0=30;OQ=451.06;QD=1.35;SB=-154.07 GT:AD:DP:GL:GQ 0/1:302,33:200:-108.62,-60.23,-633.51:99
-chr1 812900 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=14.94;MQ=39.79;MQ0=13;OQ=813.81;QD=4.45;SB=92.87 GT:AD:DP:GL:GQ 0/1:73,110:100:-114.78,-30.12,-260.13:99
-chr1 812923 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=27.88;MQ=50.22;MQ0=2;OQ=306.33;QD=2.95;SB=-30.81 GT:AD:DP:GL:GQ 0/1:70,34:81:-58.31,-24.40,-238.03:99
-chr1 812935 . G A 2.07 PASS AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=2.66;MQ=47.53;MQ0=2;OQ=744.11;QD=5.55;SB=-223.02 GT:AD:DP:GL:GQ 0/1:69,65:96:-106.61,-28.92,-247.13:99
-chr1 812951 . G T 11.25 PASS AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=43.90;MQ0=5;OQ=1351.36;QD=8.72;SB=-400.31 GT:AD:DP:GL:GQ 0/1:63,92:108:-170.95,-32.53,-225.30:99
-chr1 812975 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=28.65;MQ=40.87;MQ0=15;OQ=1862.55;QD=9.36;SB=-484.23 GT:AD:DP:GL:GQ 0/1:66,132:123:-230.20,-40.66,-212.95:99
-chr1 812981 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=40.75;MQ=39.82;MQ0=15;OQ=1797.82;QD=8.86;SB=-460.63 GT:AD:DP:GL:GQ 0/1:63,140:120:-219.20,-36.14,-217.08:99
-chr1 812999 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=293;Dels=0.00;HRun=3;HaplotypeScore=112.34;MQ=35.70;MQ0=17;OQ=746.50;QD=2.55;SB=103.46 GT:AD:DP:GL:GQ 0/1:201,92:175:-130.64,-52.71,-522.15:99
-chr1 813018 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=409;Dels=0.00;HRun=4;HaplotypeScore=24.00;MQ=34.51;MQ0=18;OQ=2503.76;QD=6.12;SB=-85.25 GT:AD:DP:GL:GQ 0/1:266,142:285:-339.49,-85.83,-765.92:99
-chr1 813030 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=463;Dels=0.00;HRun=0;HaplotypeScore=48.87;MQ=34.17;MQ0=19;OQ=2316.95;QD=5.00;SB=-56.40 GT:AD:DP:GL:GQ 0/1:312,151:338:-336.77,-101.79,-911.65:99
-chr1 813038 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=491;Dels=0.00;HRun=0;HaplotypeScore=299.82;MQ=33.86;MQ0=19;OQ=574.58;QD=1.17;SB=49.00 GT:AD:DP:GL:GQ 0/1:442,49:363:-170.06,-109.32,-1157.10:99
-chr1 813041 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=493;Dels=0.00;HRun=0;HaplotypeScore=391.76;MQ=34.08;MQ0=19;OQ=10262.92;QD=20.82;SB=-1216.69 GT:AD:DP:GL:GQ 0/1:84,408:369:-1025.29,-114.38,-315.19:99
-chr1 813055 . T G 5105.47 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=534;Dels=0.00;HRun=1;HaplotypeScore=573.54;MQ=33.39;MQ0=15;QD=9.56;SB=-804.21 GT:AD:DP:GL:GQ 0/1:355,179:410:-509.55,-123.48,-999.47:99
-chr1 813070 . G T 1334.14 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=573;Dels=0.00;HRun=1;HaplotypeScore=588.05;MQ=33.10;MQ0=9;QD=2.33;SB=-193.13 GT:AD:DP:GL:GQ 0/1:472,101:440:-269.21,-132.51,-1306.87:99
-chr1 813073 . C G 2805.72 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=592;Dels=0.00;HRun=1;HaplotypeScore=532.94;MQ=33.08;MQ0=8;QD=4.74;SB=-566.71 GT:AD:DP:GL:GQ 0/1:469,123:455:-420.94,-137.09,-1553.33:99
-chr1 813077 . G A 139.61 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=606;Dels=0.00;HRun=1;HaplotypeScore=787.16;MQ=33.34;MQ0=7;QD=0.23;SB=20.29 GT:AD:DP:GL:GQ 0/1:564,42:462:-156.39,-139.14,-1597.16:99
-chr1 813078 . C G 7856.82 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=607;Dels=0.00;HRun=1;HaplotypeScore=894.22;MQ=33.34;MQ0=7;QD=12.94;SB=-567.18 GT:AD:DP:GL:GQ 0/1:367,165:476:-784.68,-363.52,-1514.16:99
-chr1 813086 . C G 6412.49 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=625;Dels=0.00;HRun=0;HaplotypeScore=667.82;MQ=33.46;MQ0=7;QD=10.26;SB=-767.41 GT:AD:DP:GL:GQ 0/1:438,186:509:-640.25,-153.35,-1590.01:99
-chr1 813088 . G A 7116.40 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=627;Dels=0.00;HRun=1;HaplotypeScore=625.87;MQ=33.36;MQ0=7;QD=11.35;SB=-863.76 GT:AD:DP:GL:GQ 0/1:405,186:507:-710.64,-256.24,-1344.66:99
-chr1 813094 . C T 2968.23 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=620;Dels=0.00;HRun=0;HaplotypeScore=211.21;MQ=33.22;MQ0=9;QD=4.79;SB=-1023.50 GT:AD:DP:GL:GQ 0/1:481,139:495:-449.19,-149.09,-1385.37:99
-chr1 813107 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=546;Dels=0.00;HRun=0;HaplotypeScore=55.14;MQ=33.11;MQ0=20;OQ=871.93;QD=1.60;SB=-175.62 GT:AD:DP:GL:GQ 0/1:477,69:368:-201.32,-110.84,-1286.63:99
-chr1 813112 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=540;Dels=0.00;HRun=1;HaplotypeScore=215.40;MQ=33.46;MQ0=24;OQ=633.86;QD=1.17;SB=-102.54 GT:AD:DP:GL:GQ 0/1:489,51:349:-171.78,-105.11,-1109.57:99
-chr1 813120 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=452;Dels=0.00;HRun=0;HaplotypeScore=223.96;MQ=34.07;MQ0=26;OQ=8026.64;QD=17.76;SB=-2723.00 GT:AD:DP:GL:GQ 0/1:104,348:294:-801.66,-88.56,-349.63:99
-chr1 813123 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=449;Dels=0.00;HRun=0;HaplotypeScore=337.04;MQ=33.84;MQ0=28;OQ=7271.87;QD=16.20;SB=-2574.23 GT:AD:DP:GL:GQ 0/1:72,377:266:-726.19,-80.11,-257.87:99
-chr1 813133 . G C 2818.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=399;Dels=0.00;HRun=0;HaplotypeScore=373.63;MQ=34.21;MQ0=30;QD=7.06;SB=-1307.24 GT:AD:DP:GL:GQ 0/1:279,119:209:-348.13,-62.97,-562.66:99
-chr1 813135 . A G 6195.50 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=391;Dels=0.00;HRun=0;HaplotypeScore=305.70;MQ=34.41;MQ0=29;QD=15.85;SB=-2650.19 GT:AD:DP:GL:GQ 0/1:69,321:237:-618.55,-71.38,-275.07:99
-chr1 813142 . T C 345.82 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=364;Dels=0.00;HRun=1;HaplotypeScore=286.54;MQ=33.82;MQ0=33;QD=0.95;SB=-108.69 GT:AD:DP:GL:GQ 0/1:317,47:188:-94.49,-56.62,-663.95:99
-chr1 813148 . C A 1435.04 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=349;Dels=0.00;HRun=2;HaplotypeScore=161.77;MQ=34.46;MQ0=34;QD=4.11;SB=-365.32 GT:AD:DP:GL:GQ 0/1:282,67:257:-224.19,-77.40,-705.20:99
-chr1 813156 . T A 297.72 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=111.01;MQ=35.71;MQ0=35;QD=0.97;SB=9.92 GT:AD:DP:GL:GQ 0/1:276,32:221:-99.61,-66.55,-759.37:99
-chr1 813157 . G C 549.74 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=111.01;MQ=35.86;MQ0=35;QD=1.79;SB=-210.25 GT:AD:DP:GL:GQ 0/1:247,59:221:-124.85,-66.59,-828.88:99
-chr1 813168 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=2;HaplotypeScore=4.86;MQ=37.54;MQ0=37;OQ=984.94;QD=3.88;SB=44.86 GT:AD:DP:GL:GQ 0/1:209,45:173:-153.88,-52.11,-496.83:99
-chr1 813186 . G C 76.25 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=0;HaplotypeScore=72.20;MQ=40.71;MQ0=36;QD=0.48;SB=71.95 GT:AD:DP:GL:GQ 0/1:148,12:83:-35.91,-25.01,-332.34:99
-chr1 813187 . A G 513.33 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=1;HaplotypeScore=71.20;MQ=41.66;MQ0=35;QD=3.49;SB=-73.38 GT:AD:DP:GL:GQ 0/1:75,50:94:-82.93,-28.31,-287.29:99
-chr1 813188 . C A 79.88 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=1;HaplotypeScore=71.20;MQ=41.50;MQ0=35;QD=0.55;SB=44.61 GT:AD:DP:GL:GQ 0/1:120,26:78:-34.77,-23.49,-243.41:99
-chr1 813189 . C A 521.18 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=67.21;MQ=41.65;MQ0=35;QD=3.62;SB=-1.36 GT:AD:DP:GL:GQ 0/1:108,26:91:-101.37,-45.97,-249.59:99
-chr1 813208 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=2;HaplotypeScore=18.83;MQ=43.26;MQ0=23;OQ=418.24;QD=3.37;SB=-54.23 GT:AD:DP:GL:GQ 0/1:61,63:76:-68.00,-22.89,-206.10:99
-chr1 813240 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=2;HaplotypeScore=43.28;MQ=41.04;MQ0=25;OQ=943.89;QD=6.13;SB=-68.91 GT:AD:DP:GL:GQ 0/1:64,90:92:-125.38,-27.71,-227.61:99
-chr1 813250 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=195;Dels=0.00;HRun=0;HaplotypeScore=62.53;MQ=37.95;MQ0=22;OQ=226.25;QD=1.16;SB=14.99 GT:AD:DP:GL:GQ 0/1:153,42:96:-54.82,-28.92,-298.56:99
-chr1 813271 . T C 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=0;HaplotypeScore=8.46;MQ=34.98;MQ0=19;OQ=1147.61;QD=4.61;SB=-134.40 GT:AD:DP:GL:GQ 0/1:63,186:103:-149.07,-31.02,-256.47:99
-chr1 813292 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=2;HaplotypeScore=102.43;MQ=30.92;MQ0=23;OQ=1986.60;QD=5.20;SB=-566.46 GT:AD:DP:GL:GQ 0/1:105,277:133:-242.00,-40.06,-276.00:99
-chr1 813307 . A G 32.13 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=535;Dels=0.00;HRun=0;HaplotypeScore=181.84;MQ=30.25;MQ0=27;QD=0.06;SB=46.55 GT:AD:DP:GL:GQ 0/1:504,31:255:-83.31,-76.81,-935.22:64.97
-chr1 813316 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=619;Dels=0.00;HRun=2;HaplotypeScore=75.11;MQ=29.97;MQ0=27;OQ=3157.81;QD=5.10;SB=-1462.71 GT:AD:DP:GL:GQ 0/1:382,237:331:-418.76,-99.69,-846.79:99
-chr1 813335 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=826;Dels=0.00;HRun=1;HaplotypeScore=136.91;MQ=30.11;MQ0=21;OQ=7119.57;QD=8.62;SB=-2280.77 GT:AD:DP:GL:GQ 0/1:537,288:549:-710.96,-165.36,-1364.58:99
-chr1 813362 . A G 16357.98 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=920;Dels=0.00;HRun=1;HaplotypeScore=446.32;MQ=30.10;MQ0=24;QD=17.78;SB=-5014.09 GT:AD:DP:GL:GQ 0/1:273,494:683:-1634.80,-554.43,-1400.88:99
-chr1 813367 . T C 20902.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=914;Dels=0.00;HRun=0;HaplotypeScore=426.41;MQ=30.28;MQ0=24;QD=22.87;SB=-7448.46 GT:AD:DP:GL:GQ 0/1:141,716:687:-2089.26,-358.04,-691.48:99
-chr1 813368 rs13302980 T C 206.93 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=916;Dels=0.00;HRun=0;HaplotypeScore=426.41;MQ=30.25;MQ0=24;QD=0.23;SB=-118.41 GT:AD:DP:GL:GQ 0/1:843,73:685:-230.32,-206.34,-2521.41:99
-chr1 813385 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=888;Dels=0.00;HRun=0;HaplotypeScore=40.71;MQ=30.82;MQ0=25;OQ=1088.75;QD=1.23;SB=-408.14 GT:AD:DP:GL:GQ 0/1:783,105:699:-322.70,-210.54,-2232.26:99
-chr1 813404 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=750;Dels=0.00;HRun=2;HaplotypeScore=134.73;MQ=32.26;MQ0=17;OQ=670.55;QD=0.89;SB=-191.51 GT:AD:DP:GL:GQ 0/1:685,65:613:-254.96,-184.62,-2037.75:99
-chr1 813405 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=741;Dels=0.00;HRun=2;HaplotypeScore=133.74;MQ=32.36;MQ0=17;OQ=1633.92;QD=2.21;SB=-672.01 GT:AD:DP:GL:GQ 0/1:597,144:607:-349.50,-182.82,-2122.95:99
-chr1 813418 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=590;Dels=0.00;HRun=0;HaplotypeScore=47.11;MQ=33.33;MQ0=15;OQ=65.79;QD=0.11;SB=206.84 GT:AD:DP:GL:GQ 0/1:544,46:476:-153.22,-143.35,-1574.37:98.63
-chr1 813443 . T G 3848.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=38.86;MQ=37.99;MQ0=5;QD=13.99;SB=-1241.58 GT:AD:DP:GL:GQ 0/1:79,195:186:-383.81,-56.02,-279.85:99
-chr1 813451 . C T 1033.45 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=197;Dels=0.01;HRun=0;HaplotypeScore=22.13;MQ=41.75;MQ0=4;QD=5.25;SB=-217.95 GT:AD:DP:GL:GQ 0/1:81,115:114:-140.97,-34.34,-279.86:99
-chr1 813452 . A G 765.89 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=186;Dels=0.01;HRun=0;HaplotypeScore=26.12;MQ=42.21;MQ0=4;QD=4.12;SB=-130.38 GT:AD:DP:GL:GQ 0/1:79,106:109:-112.71,-32.84,-316.56:99
-chr1 813514 rs61768255 T A 0.19 PASS AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=40.18;MQ0=52;OQ=194.92;QD=1.28;SB=-18.62 GT:AD:DP:GL:GQ 0/1:64,87:75:-45.36,-22.59,-238.39:99
-chr1 813576 . G T 36.42 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=256;Dels=0.00;HRun=0;HaplotypeScore=114.90;MQ=32.12;MQ0=13;QD=0.14;SB=80.27 GT:AD:DP:GL:GQ 0/1:231,25:108:-39.45,-32.53,-355.25:69.25
-chr1 813577 . C T 12.25 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=253;Dels=0.00;HRun=0;HaplotypeScore=118.76;MQ=32.29;MQ0=11;QD=0.05;SB=83.28 GT:AD:DP:GL:GQ 0/1:222,24:110:-47.87,-43.39,-370.50:44.82
-chr1 813595 . G A 14.36 DPFilter;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=304;Dels=0.02;HRun=3;HaplotypeScore=679.47;MQ=32.56;MQ0=1;QD=0.05;SB=59.22 GT:AD:DP:GL:GQ 0/1:279,19:122:-44.63,-39.92,-398.76:47.04
-chr1 813600 . G A 274.89 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=874.07;MQ=32.03;MQ0=1;QD=0.84;SB=65.24 GT:AD:DP:GL:GQ 0/1:247,78:142:-73.54,-42.77,-440.28:99
-chr1 813603 . G A 897.36 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=326;Dels=0.00;HRun=2;HaplotypeScore=1015.89;MQ=31.94;MQ0=0;QD=2.75;SB=17.55 GT:AD:DP:GL:GQ 0/1:201,125:138:-134.59,-41.57,-374.40:99
-chr1 813618 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=385;Dels=0.01;HRun=2;HaplotypeScore=1064.00;MQ=30.68;MQ0=0;OQ=4144.71;QD=10.77;SB=-60.77 GT:AD:DP:GL:GQ 0/1:139,193:174:-413.47,-52.40,-263.62:99
-chr1 813640 . G A 6008.25 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=492;Dels=0.03;HRun=2;HaplotypeScore=778.76;MQ=30.34;MQ0=0;QD=12.21;SB=-280.67 GT:AD:DP:GL:GQ 0/1:225,249:279:-599.83,-82.23,-444.10:99
-chr1 813644 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=499;Dels=0.00;HRun=2;HaplotypeScore=589.76;MQ=30.13;MQ0=0;OQ=1319.59;QD=2.64;SB=-65.34 GT:AD:DP:GL:GQ 0/1:370,128:286:-221.39,-86.15,-815.48:99
-chr1 813653 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=493;Dels=0.00;HRun=1;HaplotypeScore=439.06;MQ=30.75;MQ0=0;OQ=617.48;QD=1.25;SB=-157.65 GT:AD:DP:GL:GQ 0/1:455,38:256:-142.14,-77.10,-775.99:99
-chr1 813667 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=450;Dels=0.03;HRun=0;HaplotypeScore=1087.09;MQ=31.84;MQ0=0;OQ=612.31;QD=1.36;SB=24.15 GT:AD:DP:GL:GQ 0/1:310,99:290:-203.97,-139.46,-953.68:99
-chr1 813680 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=385;Dels=0.03;HRun=2;HaplotypeScore=1191.21;MQ=32.81;MQ0=0;OQ=1213.04;QD=3.15;SB=-10.63 GT:AD:DP:GL:GQ 0/1:276,97:229:-193.56,-68.97,-645.40:99
-chr1 813720 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=252;Dels=0.06;HRun=1;HaplotypeScore=327.60;MQ=37.03;MQ0=0;OQ=194.28;QD=0.77;SB=110.38 GT:AD:DP:GL:GQ 0/1:205,33:146:-66.38,-43.67,-457.57:99
-chr1 813729 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=373.81;MQ=39.70;MQ0=0;OQ=281.23;QD=1.50;SB=15.00 GT:AD:DP:GL:GQ 0/1:127,60:111:-64.84,-33.43,-345.95:99
-chr1 813820 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=81;Dels=0.05;HRun=2;HaplotypeScore=42.41;MQ=49.74;MQ0=3;OQ=162.06;QD=2.00;SB=-100.42 GT:AD:DP:GL:GQ 0/1:56,21:59:-37.26,-17.77,-183.03:99
-chr1 813869 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=73.61;MQ=47.62;MQ0=2;OQ=155.20;QD=1.94;SB=41.14 GT:AD:DP:GL:GQ 0/1:71,9:54:-35.07,-16.26,-160.29:99
-chr1 813877 . G A 25.05 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=66.85;MQ=49.86;MQ0=1;QD=0.34;SB=32.11 GT:AD:DP:GL:GQ 0/1:64,9:51:-21.15,-15.36,-169.54:57.88
-chr1 813907 . G A 23.05 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.04;HRun=1;HaplotypeScore=56.30;MQ=49.27;MQ0=1;QD=0.32;SB=38.13 GT:AD:DP:GL:GQ 0/1:63,7:54:-21.25,-15.66,-171.08:55.87
-chr1 813910 . G A 12.29 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=61.37;MQ=49.27;MQ0=1;QD=0.17;SB=35.12 GT:AD:DP:GL:GQ 0/1:63,10:55:-21.06,-16.57,-179.39:44.87
-chr1 813923 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=75;Dels=0.03;HRun=2;HaplotypeScore=23.38;MQ=50.12;MQ0=1;OQ=138.74;QD=1.85;SB=-24.20 GT:AD:DP:GL:GQ 0/1:50,23:55:-33.43,-16.28,-173.24:99
-chr1 813957 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=2;HaplotypeScore=18.68;MQ=43.32;MQ0=1;OQ=871.71;QD=6.86;SB=-275.74 GT:AD:DP:GL:GQ 0/1:65,62:85:-116.06,-25.61,-200.91:99
-chr1 813978 . A C 0.71 PASS AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=39.28;MQ0=4;OQ=705.69;QD=4.77;SB=-252.74 GT:AD:DP:GL:GQ 0/1:54,94:80:-97.95,-24.09,-193.62:99
-chr1 814078 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=6.42;MQ=36.79;MQ0=24;OQ=486.46;QD=2.55;SB=-267.20 GT:AD:DP:GL:GQ 0/1:63,128:82:-76.63,-24.70,-247.64:99
-chr1 814121 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=39.43;MQ=40.45;MQ0=17;OQ=289.94;QD=1.73;SB=-38.08 GT:AD:DP:GL:GQ 0/1:70,98:82:-56.99,-24.71,-295.92:99
-chr1 814147 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=0;HaplotypeScore=14.17;MQ=45.92;MQ0=13;OQ=964.78;QD=6.39;SB=-366.58 GT:AD:DP:GL:GQ 0/1:82,69:112:-133.50,-33.74,-285.66:99
-chr1 814171 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=1;HaplotypeScore=20.78;MQ=44.66;MQ0=14;OQ=904.13;QD=5.38;SB=-364.51 GT:AD:DP:GL:GQ 0/1:83,85:118:-129.23,-35.54,-305.53:99
-chr1 814202 . C A 1692.96 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=197;Dels=0.09;HRun=0;HaplotypeScore=162.31;MQ=41.97;MQ0=8;QD=8.59;SB=-578.48 GT:AD:DP:GL:GQ 0/1:79,100:139:-213.84,-41.26,-286.69:99
-chr1 814220 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=0;HaplotypeScore=50.82;MQ=39.65;MQ0=8;OQ=329.14;QD=1.52;SB=-86.50 GT:AD:DP:GL:GQ 0/1:161,56:136:-77.16,-40.96,-423.94:99
-chr1 814233 . G A 2067.86 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=147.47;MQ=38.66;MQ0=13;QD=9.23;SB=-544.97 GT:AD:DP:GL:GQ 0/1:105,119:132:-249.86,-39.79,-228.63:99
-chr1 814239 . A G 1315.30 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=1;HaplotypeScore=123.50;MQ=38.45;MQ0=13;QD=5.98;SB=-142.40 GT:AD:DP:GL:GQ 0/1:70,150:114:-169.16,-34.34,-278.17:99
-chr1 814242 . A G 554.64 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=125.56;MQ=38.13;MQ0=16;QD=2.40;SB=-155.01 GT:AD:DP:GL:GQ 0/1:172,59:130:-97.91,-39.16,-422.03:99
-chr1 814256 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=245;Dels=0.00;HRun=0;HaplotypeScore=21.41;MQ=37.07;MQ0=15;OQ=2324.45;QD=9.49;SB=-360.77 GT:AD:DP:GL:GQ 0/1:68,177:144:-279.11,-43.38,-270.96:99
-chr1 814273 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=59.92;MQ=36.71;MQ0=15;OQ=51.68;QD=0.19;SB=122.32 GT:AD:DP:GL:GQ 0/1:221,49:163:-60.05,-51.60,-506.38:84.51
-chr1 814274 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=0;HaplotypeScore=59.77;MQ=36.62;MQ0=15;OQ=1850.48;QD=6.88;SB=-407.81 GT:AD:DP:GL:GQ 0/1:149,120:153:-234.45,-46.12,-315.76:99
-chr1 814294 . A G 2410.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=2;HaplotypeScore=103.79;MQ=37.05;MQ0=15;QD=9.06;SB=-443.47 GT:AD:DP:GL:GQ 0/1:75,191:153:-290.38,-46.10,-295.34:99
-chr1 814296 . G A 1211.04 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=219.20;MQ=36.82;MQ0=15;QD=4.42;SB=-351.23 GT:AD:DP:GL:GQ 0/1:200,74:158:-171.99,-47.60,-420.58:99
-chr1 814301 . A G 978.34 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=274;Dels=0.00;HRun=0;HaplotypeScore=220.77;MQ=36.41;MQ0=15;QD=3.57;SB=-180.08 GT:AD:DP:GL:GQ 0/1:73,201:110:-134.26,-33.14,-291.65:99
-chr1 814305 . T C 45.78 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=232.83;MQ=35.76;MQ0=15;QD=0.16;SB=-43.14 GT:AD:DP:GL:GQ 0/1:206,71:102:-38.59,-30.73,-365.14:78.61
-chr1 814318 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=0;HaplotypeScore=167.17;MQ=36.26;MQ0=13;OQ=2113.99;QD=7.60;SB=-387.55 GT:AD:DP:GL:GQ 0/1:72,191:148:-269.75,-55.07,-295.63:99
-chr1 814320 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=167.17;MQ=36.49;MQ0=13;OQ=746.17;QD=2.66;SB=-108.14 GT:AD:DP:GL:GQ 0/1:218,62:140:-120.08,-42.18,-412.31:99
-chr1 814333 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=285;Dels=0.00;HRun=0;HaplotypeScore=281.15;MQ=35.53;MQ0=9;OQ=1990.33;QD=6.98;SB=-447.96 GT:AD:DP:GL:GQ 0/1:95,190:142:-245.09,-42.77,-288.22:99
-chr1 814346 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=251;Dels=0.00;HRun=0;HaplotypeScore=225.23;MQ=36.32;MQ0=4;OQ=1683.84;QD=6.71;SB=-421.88 GT:AD:DP:GL:GQ 0/1:107,144:128:-210.24,-38.57,-269.23:99
-chr1 814360 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=2;HaplotypeScore=149.83;MQ=38.08;MQ0=4;OQ=172.19;QD=0.77;SB=51.61 GT:AD:DP:GL:GQ 0/1:195,28:117:-55.74,-35.24,-362.13:99
-chr1 814384 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=42.51;MQ=45.49;MQ0=3;OQ=551.67;QD=3.70;SB=-145.33 GT:AD:DP:GL:GQ 0/1:76,73:99:-88.27,-29.82,-286.26:99
-chr1 814428 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=10.58;MQ=49.14;MQ0=17;OQ=342.52;QD=2.63;SB=-111.49 GT:AD:DP:GL:GQ 0/1:82,48:99:-67.35,-29.82,-298.71:99
-chr1 814439 . C T 20.82 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=47.72;MQ0=20;QD=0.14;SB=152.46 GT:AD:DP:GL:GQ 0/1:137,12:115:-40.00,-34.64,-383.60:53.62
-chr1 814456 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=15.28;MQ=46.84;MQ0=26;OQ=753.94;QD=4.65;SB=-138.63 GT:AD:DP:GL:GQ 0/1:92,70:122:-115.43,-36.75,-321.50:99
-chr1 814470 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=189;Dels=0.00;HRun=1;HaplotypeScore=31.58;MQ=44.82;MQ0=39;OQ=884.58;QD=4.68;SB=-229.69 GT:AD:DP:GL:GQ 0/1:97,92:121:-128.25,-36.50,-368.74:99
-chr1 814488 . C A 76.03 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=247;Dels=0.00;HRun=0;HaplotypeScore=105.09;MQ=41.14;MQ0=41;QD=0.31;SB=176.55 GT:AD:DP:GL:GQ 0/1:229,16:148:-55.47,-44.58,-476.50:99
-chr1 814489 . C G 69.13 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=89.81;MQ=41.12;MQ0=41;QD=0.28;SB=176.62 GT:AD:DP:GL:GQ 0/1:231,17:149:-55.10,-44.90,-596.57:99
-chr1 814495 . T C 1858.16 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=56.93;MQ=40.44;MQ0=47;QD=7.20;SB=-760.45 GT:AD:DP:GL:GQ 0/1:92,166:157:-236.40,-47.30,-370.00:99
-chr1 814529 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=433;Dels=0.00;HRun=0;HaplotypeScore=120.51;MQ=38.11;MQ0=39;OQ=500.57;QD=1.16;SB=-243.42 GT:AD:DP:GL:GQ 0/1:383,50:261:-131.95,-78.61,-806.43:99
-chr1 814534 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=446;Dels=0.00;HRun=0;HaplotypeScore=107.63;MQ=38.32;MQ0=36;OQ=359.59;QD=0.81;SB=-173.49 GT:AD:DP:GL:GQ 0/1:401,44:272:-121.18,-81.93,-841.90:99
-chr1 814540 . A G 36.54 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=477;Dels=0.00;HRun=1;HaplotypeScore=62.33;MQ=38.25;MQ0=37;QD=0.08;SB=123.17 GT:AD:DP:GL:GQ 0/1:445,32:265:-86.76,-79.83,-986.21:69.37
-chr1 814554 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=529;Dels=0.00;HRun=0;HaplotypeScore=89.36;MQ=37.97;MQ0=32;OQ=9731.93;QD=18.40;SB=-1976.66 GT:AD:DP:GL:GQ 0/1:80,449:318:-972.19,-95.79,-281.92:99
-chr1 814557 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=0;HaplotypeScore=97.56;MQ=38.01;MQ0=31;OQ=8661.84;QD=15.69;SB=-1680.73 GT:AD:DP:GL:GQ 0/1:195,357:340:-865.18,-102.42,-472.42:99
-chr1 814572 rs564838 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=625;Dels=0.00;HRun=1;HaplotypeScore=63.63;MQ=38.08;MQ0=27;OQ=2371.32;QD=3.79;SB=-326.77 GT:AD:DP:GL:GQ 0/1:480,145:413:-364.80,-124.39,-1136.05:99
-chr1 814627 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=504;Dels=0.00;HRun=1;HaplotypeScore=183.33;MQ=39.27;MQ0=14;OQ=10984.00;QD=21.79;SB=-1265.89 GT:AD:DP:GL:GQ 0/1:67,203:343:-1097.40,-537.50,-676.52:99
-chr1 814675 . G A 2732.90 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=265;Dels=0.00;HRun=1;HaplotypeScore=261.45;MQ=41.69;MQ0=11;QD=10.31;SB=-108.93 GT:AD:DP:GL:GQ 0/1:161,102:166:-330.09,-53.51,-314.61:99
-chr1 814679 . A G 2402.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=1;HaplotypeScore=135.51;MQ=41.79;MQ0=13;QD=10.14;SB=-20.34 GT:AD:DP:GL:GQ 0/1:70,167:146:-287.52,-43.99,-273.83:99
-chr1 814680 . C T 2092.18 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=238;Dels=0.00;HRun=0;HaplotypeScore=134.51;MQ=41.43;MQ0=17;QD=8.79;SB=-7.62 GT:AD:DP:GL:GQ 0/1:151,86:144:-255.88,-43.38,-283.23:99
-chr1 814701 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=51.82;MQ=41.75;MQ0=19;OQ=1622.55;QD=7.41;SB=-75.48 GT:AD:DP:GL:GQ 0/1:87,132:141:-208.02,-42.48,-267.24:99
-chr1 814708 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=76.68;MQ=40.68;MQ0=25;OQ=2028.26;QD=9.14;SB=-58.81 GT:AD:DP:GL:GQ 0/1:84,138:144:-249.49,-43.38,-267.28:99
-chr1 814713 rs563211 T C 1374.69 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=232;Dels=0.00;HRun=0;HaplotypeScore=105.58;MQ=40.40;MQ0=29;QD=5.93;SB=29.72 GT:AD:DP:GL:GQ 0/1:146,86:143:-183.83,-43.08,-359.04:99
-chr1 814720 . T C 689.97 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=108.11;MQ=39.59;MQ0=32;QD=2.84;SB=46.65 GT:AD:DP:GL:GQ 0/1:85,157:115:-106.92,-34.64,-346.63:99
-chr1 814722 . C G 183.01 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=0;HaplotypeScore=126.09;MQ=39.61;MQ0=33;QD=0.72;SB=68.61 GT:AD:DP:GL:GQ 0/1:217,37:122:-58.35,-36.76,-472.38:99
-chr1 814737 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=30.86;MQ=38.18;MQ0=38;OQ=2218.82;QD=7.42;SB=-36.77 GT:AD:DP:GL:GQ 0/1:186,113:186:-281.20,-56.03,-416.78:99
-chr1 814767 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=365;Dels=0.00;HRun=2;HaplotypeScore=49.56;MQ=35.63;MQ0=43;OQ=5264.89;QD=14.42;SB=-427.42 GT:AD:DP:GL:GQ 0/1:96,269:216:-525.49,-65.13,-366.09:99
-chr1 814784 . A G 211.71 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=402;Dels=0.00;HRun=0;HaplotypeScore=324.91;MQ=34.66;MQ0=41;QD=0.53;SB=-28.05 GT:AD:DP:GL:GQ 0/1:357,45:243:-97.65,-73.19,-885.32:99
-chr1 814787 . A G 1988.10 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=404;Dels=0.00;HRun=0;HaplotypeScore=288.76;MQ=34.45;MQ0=41;QD=4.92;SB=-448.31 GT:AD:DP:GL:GQ 0/1:239,165:199:-262.08,-59.99,-467.56:99
-chr1 814790 . G A 2076.12 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=406;Dels=0.00;HRun=0;HaplotypeScore=289.81;MQ=34.38;MQ0=42;QD=5.11;SB=-426.20 GT:AD:DP:GL:GQ 0/1:294,112:245:-284.69,-73.80,-651.34:99
-chr1 814794 . G C 5521.90 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=0;HaplotypeScore=359.70;MQ=34.34;MQ0=40;QD=13.80;SB=-919.83 GT:AD:DP:GL:GQ 0/1:77,252:207:-551.19,-211.22,-478.27:99
-chr1 814804 . C T 88.70 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=434;Dels=0.00;HRun=1;HaplotypeScore=347.22;MQ=35.87;MQ0=35;QD=0.20;SB=-33.30 GT:AD:DP:GL:GQ 0/1:387,47:188:-68.79,-56.64,-599.68:99
-chr1 814807 . A C 912.16 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=446;Dels=0.00;HRun=1;HaplotypeScore=302.12;MQ=36.31;MQ0=35;QD=2.05;SB=-348.23 GT:AD:DP:GL:GQ 0/1:319,127:242:-167.40,-72.90,-690.79:99
-chr1 814811 . C T 8629.57 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=472;Dels=0.00;HRun=2;HaplotypeScore=321.44;MQ=36.81;MQ0=35;QD=18.28;SB=-2662.56 GT:AD:DP:GL:GQ 0/1:133,339:310:-861.96,-93.38,-350.61:99
-chr1 814815 . G A 1219.97 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=497;Dels=0.00;HRun=1;HaplotypeScore=253.88;MQ=37.19;MQ0=33;QD=2.45;SB=-308.28 GT:AD:DP:GL:GQ 0/1:414,82:332:-225.30,-100.02,-991.58:99
-chr1 814833 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=552;Dels=0.00;HRun=0;HaplotypeScore=30.66;MQ=38.93;MQ0=25;OQ=13138.69;QD=23.80;SB=-5564.86 GT:AD:DP:GL:GQ 0/1:68,484:387:-1312.87,-116.58,-241.99:99
-chr1 814846 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=600;Dels=0.00;HRun=1;HaplotypeScore=69.54;MQ=39.19;MQ0=23;OQ=3136.64;QD=5.23;SB=-1237.78 GT:AD:DP:GL:GQ 0/1:435,165:409:-440.13,-123.18,-1039.78:99
-chr1 814879 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=693;Dels=0.00;HRun=0;HaplotypeScore=388.69;MQ=39.91;MQ0=7;OQ=8125.01;QD=11.72;SB=-2578.04 GT:AD:DP:GL:GQ 0/1:409,284:467:-811.50,-140.66,-960.39:99
-chr1 814880 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=692;Dels=0.00;HRun=2;HaplotypeScore=381.90;MQ=39.95;MQ0=7;OQ=2413.57;QD=3.49;SB=-960.49 GT:AD:DP:GL:GQ 0/1:533,158:465:-387.57,-142.93,-1289.43:99
-chr1 814900 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=699;Dels=0.00;HRun=0;HaplotypeScore=119.56;MQ=39.22;MQ0=14;OQ=14541.95;QD=20.80;SB=-4000.09 GT:AD:DP:GL:GQ 0/1:90,605:445:-1453.20,-134.09,-272.14:99
-chr1 814929 . C T 1261.33 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=562;Dels=0.00;HRun=0;HaplotypeScore=644.78;MQ=37.11;MQ0=29;QD=2.24;SB=-29.99 GT:AD:DP:GL:GQ 0/1:384,176:313:-223.70,-94.28,-953.66:99
-chr1 814931 . T C 7350.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=554;Dels=0.00;HRun=4;HaplotypeScore=616.85;MQ=36.93;MQ0=28;QD=13.27;SB=-1896.86 GT:AD:DP:GL:GQ 0/1:148,405:309:-734.01,-93.08,-440.40:99
-chr1 814932 rs4475692 G A 10783.24 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=554;Dels=0.00;HRun=0;HaplotypeScore=621.95;MQ=36.79;MQ0=29;QD=19.46;SB=-2129.22 GT:AD:DP:GL:GQ 0/1:174,298:306:-1077.32,-380.57,-459.91:99
-chr1 814939 . G A 1306.21 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=568;Dels=0.00;HRun=1;HaplotypeScore=479.84;MQ=36.20;MQ0=35;QD=2.30;SB=-170.45 GT:AD:DP:GL:GQ 0/1:402,165:327:-232.39,-98.48,-986.51:99
-chr1 814952 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=543;Dels=0.00;HRun=0;HaplotypeScore=51.53;MQ=35.74;MQ0=35;OQ=140.17;QD=0.26;SB=144.16 GT:AD:DP:GL:GQ 0/1:482,61:349:-122.41,-105.11,-1207.38:99
-chr1 814967 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=541;Dels=0.00;HRun=0;HaplotypeScore=312.71;MQ=35.10;MQ0=40;OQ=7468.20;QD=13.80;SB=-2338.34 GT:AD:DP:GL:GQ 0/1:256,284:360:-745.82,-108.45,-622.35:99
-chr1 814975 . C T 35.90 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=483;Dels=0.00;HRun=0;HaplotypeScore=80.80;MQ=34.88;MQ0=44;QD=0.07;SB=387.40 GT:AD:DP:GL:GQ 0/1:418,42:326:-167.53,-160.66,-1098.08:68.73
-chr1 815007 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=591;Dels=0.00;HRun=1;HaplotypeScore=71.67;MQ=32.27;MQ0=41;OQ=5134.52;QD=8.69;SB=-1587.17 GT:AD:DP:GL:GQ 0/1:388,203:408:-512.45,-122.89,-966.60:99
-chr1 815060 rs7417801 G A 11239.90 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=650;Dels=0.00;HRun=0;HaplotypeScore=316.82;MQ=33.42;MQ0=19;QD=17.29;SB=-4737.34 GT:AD:DP:GL:GQ 0/1:178,470:421:-1122.99,-126.87,-458.77:99
-chr1 815061 . C T 1691.04 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=650;Dels=0.00;HRun=1;HaplotypeScore=315.98;MQ=33.65;MQ0=19;QD=2.60;SB=-738.44 GT:AD:DP:GL:GQ 0/1:537,113:421:-299.19,-126.80,-1266.58:99
-chr1 815070 rs61768257 T C 12258.60 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=631;Dels=0.00;HRun=0;HaplotypeScore=343.15;MQ=33.97;MQ0=16;QD=19.43;SB=-5504.71 GT:AD:DP:GL:GQ 0/1:80,551:412:-1224.86,-124.09,-309.22:99
-chr1 815113 rs61768258 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=470;Dels=0.00;HRun=0;HaplotypeScore=109.35;MQ=33.63;MQ0=24;OQ=6584.76;QD=14.01;SB=-2185.39 GT:AD:DP:GL:GQ 0/1:114,356:254:-657.48,-76.51,-273.29:99
-chr1 815129 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=382;Dels=0.00;HRun=3;HaplotypeScore=48.33;MQ=33.58;MQ0=23;OQ=4485.00;QD=11.74;SB=-986.12 GT:AD:DP:GL:GQ 0/1:120,260:190:-447.50,-57.26,-260.95:99
-chr1 815155 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=321;Dels=0.00;HRun=2;HaplotypeScore=58.38;MQ=34.02;MQ0=21;OQ=1737.47;QD=5.41;SB=15.00 GT:AD:DP:GL:GQ 0/1:189,132:155:-223.72,-46.69,-361.30:99
-chr1 815170 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=270;Dels=0.00;HRun=0;HaplotypeScore=137.94;MQ=34.80;MQ0=19;OQ=2424.70;QD=8.98;SB=14.59 GT:AD:DP:GL:GQ 0/1:64,205:125:-283.44,-37.69,-171.56:99
-chr1 815209 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=4;HaplotypeScore=80.30;MQ=38.66;MQ0=0;OQ=2224.65;QD=10.44;SB=11.50 GT:AD:DP:GL:GQ 0/1:67,146:136:-266.72,-40.97,-258.01:99
-chr1 815222 . C G 180.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=2;HaplotypeScore=142.18;MQ=38.40;MQ0=0;QD=0.81;SB=9.29 GT:AD:DP:GL:GQ 0/1:186,36:136:-62.35,-41.04,-500.13:99
-chr1 815223 . G T 2117.77 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=129.82;MQ=38.70;MQ0=0;QD=9.80;SB=21.09 GT:AD:DP:GL:GQ 0/1:67,149:140:-257.24,-42.18,-220.42:99
-chr1 815225 . C A 1105.29 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=2;HaplotypeScore=129.82;MQ=38.83;MQ0=0;QD=5.09;SB=62.22 GT:AD:DP:GL:GQ 0/1:119,82:139:-174.62,-60.81,-341.62:99
-chr1 815273 rs13303179 G A 2565.92 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=228;Dels=0.03;HRun=0;HaplotypeScore=354.84;MQ=39.22;MQ0=2;QD=11.25;SB=-1159.78 GT:AD:DP:GL:GQ 0/1:137,80:90:-286.39,-26.51,-60.11:99
-chr1 815278 . G T 761.09 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=623.87;MQ=38.93;MQ0=0;QD=3.17;SB=80.36 GT:AD:DP:GL:GQ 0/1:181,48:118:-132.78,-53.39,-296.79:99
-chr1 815284 . A T 612.72 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=234;Dels=0.01;HRun=0;HaplotypeScore=131.40;MQ=39.54;MQ0=0;QD=2.62;SB=-4.85 GT:AD:DP:GL:GQ 0/1:70,108:89:-96.12,-31.56,-237.53:99
-chr1 815299 . C T 462.61 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=1;HaplotypeScore=228.02;MQ=37.95;MQ0=1;QD=1.71;SB=107.29 GT:AD:DP:GL:GQ 0/1:137,134:104:-80.88,-31.33,-296.80:99
-chr1 815300 . A G 825.50 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=0;HaplotypeScore=227.74;MQ=37.73;MQ0=1;QD=3.08;SB=104.37 GT:AD:DP:GL:GQ 0/1:110,156:125:-123.50,-37.66,-346.20:99
-chr1 815308 . A G 1233.06 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=0;HaplotypeScore=419.76;MQ=37.40;MQ0=1;QD=4.67;SB=68.40 GT:AD:DP:GL:GQ 0/1:127,137:154:-172.99,-46.40,-402.39:99
-chr1 815312 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=0;HaplotypeScore=183.65;MQ=36.17;MQ0=1;OQ=3931.91;QD=14.25;SB=-32.81 GT:AD:DP:GL:GQ 0/1:62,214:156:-392.19,-47.02,-185.37:99
-chr1 815328 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=297;Dels=0.00;HRun=0;HaplotypeScore=61.42;MQ=35.05;MQ0=1;OQ=1563.62;QD=5.26;SB=37.57 GT:AD:DP:GL:GQ 0/1:210,87:190:-216.89,-57.25,-456.11:99
-chr1 815333 . A G 262.79 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=239.02;MQ=35.16;MQ0=1;QD=0.88;SB=12.36 GT:AD:DP:GL:GQ 0/1:257,42:214:-94.06,-64.49,-716.97:99
-chr1 815339 . G A 1298.73 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=1;HaplotypeScore=174.26;MQ=34.74;MQ0=1;QD=4.57;SB=28.57 GT:AD:DP:GL:GQ 0/1:213,70:192:-191.01,-57.85,-488.27:99
-chr1 815340 . C A 157.45 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=166.11;MQ=34.52;MQ0=1;QD=0.56;SB=56.17 GT:AD:DP:GL:GQ 0/1:238,39:195:-77.77,-58.74,-595.87:99
-chr1 815347 . C T 431.68 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=149.67;MQ=34.21;MQ0=1;QD=1.59;SB=13.61 GT:AD:DP:GL:GQ 0/1:219,52:183:-101.60,-55.14,-567.56:99
-chr1 815356 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=134.05;MQ=33.48;MQ0=1;OQ=648.64;QD=2.30;SB=53.15 GT:AD:DP:GL:GQ 0/1:240,42:173:-120.28,-52.13,-519.88:99
-chr1 815363 . G A 778.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=288;Dels=0.00;HRun=0;HaplotypeScore=145.91;MQ=33.47;MQ0=1;QD=2.70;SB=9.52 GT:AD:DP:GL:GQ 0/1:221,66:188:-137.76,-56.63,-540.20:99
-chr1 815371 . T A 4591.13 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=258.43;MQ=32.98;MQ0=1;QD=16.70;SB=38.12 GT:AD:DP:GL:GQ 0/1:49,226:171:-458.11,-51.51,-170.42:99
-chr1 815373 . A T 533.41 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=2;HaplotypeScore=261.79;MQ=33.03;MQ0=1;QD=1.87;SB=35.14 GT:AD:DP:GL:GQ 0/1:246,39:154:-103.02,-46.39,-455.31:99
-chr1 815376 . C A 1170.34 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=282;Dels=0.00;HRun=0;HaplotypeScore=127.10;MQ=33.82;MQ0=1;QD=4.15;SB=38.15 GT:AD:DP:GL:GQ 0/1:188,94:146:-164.30,-43.98,-347.79:99
-chr1 815381 . G A 252.28 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=149.34;MQ=33.65;MQ0=1;QD=0.84;SB=44.17 GT:AD:DP:GL:GQ 0/1:261,37:167:-78.82,-50.30,-512.70:99
-chr1 815393 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=2;HaplotypeScore=32.62;MQ=34.43;MQ0=1;OQ=361.63;QD=1.32;SB=59.23 GT:AD:DP:GL:GQ 0/1:214,61:130:-78.62,-39.18,-425.44:99
-chr1 815401 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=139.53;MQ=35.48;MQ0=0;OQ=534.52;QD=2.04;SB=65.23 GT:AD:DP:GL:GQ 0/1:204,58:105:-88.37,-31.63,-309.51:99
-chr1 815405 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=256;Dels=0.00;HRun=0;HaplotypeScore=139.38;MQ=35.34;MQ0=0;OQ=1047.66;QD=4.09;SB=65.23 GT:AD:DP:GL:GQ 0/1:61,195:95:-136.67,-28.62,-215.61:99
-chr1 815412 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=227;Dels=0.00;HRun=1;HaplotypeScore=225.15;MQ=36.20;MQ0=0;OQ=276.35;QD=1.22;SB=65.25 GT:AD:DP:GL:GQ 0/1:61,166:74:-53.21,-22.29,-232.02:99
-chr1 815417 rs4970337 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=202;Dels=0.00;HRun=1;HaplotypeScore=585.49;MQ=36.06;MQ0=0;OQ=1433.41;QD=7.10;SB=-630.86 GT:AD:DP:GL:GQ 1/1:20,53:52:-158.74,-15.68,-11.81:38.71
-chr1 815425 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=183;Dels=0.00;HRun=0;HaplotypeScore=313.15;MQ=35.48;MQ0=0;OQ=58.46;QD=0.32;SB=65.13 GT:AD:DP:GL:GQ 0/1:47,51:54:-25.40,-16.27,-162.78:91.30
-chr1 815458 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=13.84;MQ=40.96;MQ0=1;OQ=53.27;QD=0.51;SB=62.22 GT:AD:DP:GL:GQ 0/1:68,36:55:-25.19,-16.58,-184.48:86.11
-chr1 815470 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=23.44;MQ=43.10;MQ0=1;OQ=126.81;QD=1.44;SB=62.23 GT:AD:DP:GL:GQ 0/1:44,44:50:-31.03,-15.06,-165.46:99
-chr1 815557 . T C 22.78 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=22.31;MQ=51.18;MQ0=1;QD=0.27;SB=2.47 GT:AD:DP:GL:GQ 0/1:71,13:68:-26.06,-20.50,-237.08:55.60
-chr1 815639 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=2;HaplotypeScore=38.60;MQ=52.07;MQ0=2;OQ=197.56;QD=2.27;SB=80.29 GT:AD:DP:GL:GQ 0/1:75,12:73:-45.07,-22.03,-247.37:99
-chr1 815714 rs4549984 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=282;Dels=0.00;HRun=0;HaplotypeScore=45.55;MQ=35.23;MQ0=6;OQ=3065.05;QD=10.87;SB=-490.50 GT:AD:DP:GL:GQ 0/1:131,151:198:-369.43,-59.64,-380.00:99
-chr1 815740 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=1;HaplotypeScore=91.19;MQ=33.31;MQ0=8;OQ=203.81;QD=0.53;SB=46.30 GT:AD:DP:GL:GQ 0/1:351,35:273:-111.13,-87.46,-857.56:99
-chr1 815759 . A T 981.66 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=425;Dels=0.00;HRun=0;HaplotypeScore=319.89;MQ=33.30;MQ0=16;QD=2.31;SB=-282.31 GT:AD:DP:GL:GQ 0/1:309,70:292:-258.47,-157.02,-944.68:99
-chr1 815760 . C A 1978.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=424;Dels=0.00;HRun=3;HaplotypeScore=319.89;MQ=33.21;MQ0=16;QD=4.67;SB=-361.60 GT:AD:DP:GL:GQ 0/1:311,113:290:-288.45,-87.35,-755.50:99
-chr1 815761 . C A 1757.71 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=422;Dels=0.00;HRun=1;HaplotypeScore=319.47;MQ=33.03;MQ0=16;QD=4.17;SB=-393.48 GT:AD:DP:GL:GQ 0/1:295,112:286:-275.36,-96.30,-763.46:99
-chr1 815762 . A G 1602.96 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=423;Dels=0.00;HRun=0;HaplotypeScore=319.57;MQ=33.04;MQ0=16;QD=3.79;SB=-325.52 GT:AD:DP:GL:GQ 0/1:273,113:288:-310.25,-146.67,-857.16:99
-chr1 815765 . G A 2936.95 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=427;Dels=0.00;HRun=3;HaplotypeScore=320.41;MQ=33.17;MQ0=17;QD=6.88;SB=-566.97 GT:AD:DP:GL:GQ 0/1:277,150:291:-384.73,-87.75,-614.82:99
-chr1 815777 . C T 24.19 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=434;Dels=0.00;HRun=0;HaplotypeScore=73.54;MQ=32.97;MQ0=17;QD=0.06;SB=99.73 GT:AD:DP:GL:GQ 0/1:393,41:292:-93.65,-87.95,-958.63:57.01
-chr1 815780 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=1;HaplotypeScore=75.21;MQ=32.79;MQ0=17;OQ=115.11;QD=0.27;SB=79.01 GT:AD:DP:GL:GQ 0/1:399,33:289:-101.84,-87.05,-1076.94:99
-chr1 815810 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=3;HaplotypeScore=40.23;MQ=35.68;MQ0=17;OQ=207.08;QD=0.78;SB=-57.21 GT:AD:DP:GL:GQ 0/1:229,35:180:-78.22,-54.22,-636.76:99
-chr1 815845 . C G 0.13 PASS AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=5.72;MQ=49.45;MQ0=9;OQ=487.79;QD=4.69;SB=-262.79 GT:AD:DP:GL:GQ 0/1:68,36:85:-77.68,-25.61,-285.79:99
-chr1 815857 . T A 21.33 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=5.01;MQ=54.04;MQ0=5;QD=0.23;SB=16.48 GT:AD:DP:GL:GQ 0/1:77,14:82:-30.11,-24.70,-281.02:54.14
-chr1 815931 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=2;HaplotypeScore=25.80;MQ=41.76;MQ0=34;OQ=413.34;QD=2.70;SB=-90.95 GT:AD:DP:GL:GQ 0/1:89,64:100:-74.74,-30.13,-291.31:99
-chr1 815936 . T G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=41.51;MQ0=35;OQ=307.08;QD=1.93;SB=-87.61 GT:AD:DP:GL:GQ 0/1:91,68:101:-64.41,-30.42,-308.26:99
-chr1 815949 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=25.06;MQ=39.71;MQ0=34;OQ=456.33;QD=2.82;SB=-102.31 GT:AD:DP:GL:GQ 0/1:134,28:100:-79.04,-30.12,-319.08:99
-chr1 815979 . A G 1177.05 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=1;HaplotypeScore=140.50;MQ=42.13;MQ0=3;QD=7.18;SB=-203.16 GT:AD:DP:GL:GQ 0/1:88,76:129:-159.86,-38.87,-326.00:99
-chr1 815980 . T C 32.10 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=144.97;MQ=42.03;MQ0=3;QD=0.19;SB=-40.00 GT:AD:DP:GL:GQ 0/1:145,23:122:-43.25,-36.76,-439.68:64.94
-chr1 815986 . A G 296.02 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=2;HaplotypeScore=92.41;MQ=40.86;MQ0=3;QD=1.64;SB=-47.33 GT:AD:DP:GL:GQ 0/1:153,28:121:-69.34,-36.45,-404.50:99
-chr1 816000 . G A 125.95 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=173;Dels=0.00;HRun=1;HaplotypeScore=82.29;MQ=39.25;MQ0=3;QD=0.73;SB=53.66 GT:AD:DP:GL:GQ 0/1:159,14:109:-48.71,-32.83,-348.18:99
-chr1 816001 . G A 216.96 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=0;HaplotypeScore=91.06;MQ=39.38;MQ0=3;QD=1.27;SB=50.65 GT:AD:DP:GL:GQ 0/1:127,38:117:-81.21,-56.23,-367.68:99
-chr1 816004 . G A 219.09 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=92.89;MQ=39.19;MQ0=0;QD=1.27;SB=56.64 GT:AD:DP:GL:GQ 0/1:125,47:119:-61.04,-35.85,-362.44:99
-chr1 816007 . G A 88.79 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=173;Dels=0.02;HRun=1;HaplotypeScore=88.30;MQ=38.80;MQ0=0;QD=0.51;SB=95.33 GT:AD:DP:GL:GQ 0/1:131,39:117:-47.40,-35.24,-375.36:99
-chr1 816018 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=1;HaplotypeScore=112.53;MQ=36.89;MQ0=0;OQ=274.62;QD=1.40;SB=-52.14 GT:AD:DP:GL:GQ 0/1:173,23:109:-63.59,-32.85,-401.41:99
-chr1 816026 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=509.63;MQ=37.96;MQ0=0;OQ=1247.86;QD=6.86;SB=56.18 GT:AD:DP:GL:GQ 0/1:108,73:128:-166.63,-38.56,-316.49:99
-chr1 816043 . A G 1178.79 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=0;HaplotypeScore=614.45;MQ=34.94;MQ0=1;QD=4.19;SB=56.21 GT:AD:DP:GL:GQ 0/1:198,83:191:-178.71,-57.55,-539.60:99
-chr1 816057 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=287;Dels=0.00;HRun=0;HaplotypeScore=198.13;MQ=34.34;MQ0=4;OQ=1603.81;QD=5.59;SB=62.23 GT:AD:DP:GL:GQ 0/1:144,109:196:-293.22,-129.56,-512.85:99
-chr1 816072 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=33.06;MQ=33.48;MQ0=15;OQ=115.32;QD=0.37;SB=71.18 GT:AD:DP:GL:GQ 0/1:282,15:160:-71.44,-56.63,-531.53:99
-chr1 816077 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=299;Dels=0.00;HRun=0;HaplotypeScore=55.33;MQ=33.49;MQ0=15;OQ=4794.59;QD=16.04;SB=68.22 GT:AD:DP:GL:GQ 0/1:81,218:173:-478.46,-52.11,-201.39:99
-chr1 816088 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=278;Dels=0.00;HRun=1;HaplotypeScore=51.57;MQ=34.30;MQ0=16;OQ=4463.53;QD=16.06;SB=62.23 GT:AD:DP:GL:GQ 0/1:58,220:169:-445.35,-50.90,-214.04:99
-chr1 816103 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=237;Dels=0.00;HRun=0;HaplotypeScore=38.99;MQ=36.26;MQ0=16;OQ=1889.47;QD=7.97;SB=68.20 GT:AD:DP:GL:GQ 0/1:61,152:117:-237.42,-45.19,-199.18:99
-chr1 816115 . C T 1441.66 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=145.73;MQ=37.27;MQ0=15;QD=7.14;SB=68.18 GT:AD:DP:GL:GQ 0/1:132,70:112:-181.22,-33.77,-214.53:99
-chr1 816118 . A T 125.43 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=0;HaplotypeScore=164.12;MQ=38.34;MQ0=15;QD=0.66;SB=77.28 GT:AD:DP:GL:GQ 0/1:145,37:109:-58.41,-42.58,-369.08:99
-chr1 816122 . G C 132.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=159.96;MQ=38.91;MQ0=15;QD=0.73;SB=80.30 GT:AD:DP:GL:GQ 0/1:155,27:96:-45.43,-28.94,-364.83:99
-chr1 816123 . A G 766.79 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=157.96;MQ=38.91;MQ0=14;QD=4.28;SB=80.30 GT:AD:DP:GL:GQ 0/1:86,89:106:-121.93,-41.97,-306.67:99
-chr1 816140 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=2;HaplotypeScore=35.96;MQ=45.77;MQ0=9;OQ=496.37;QD=3.82;SB=92.32 GT:AD:DP:GL:GQ 0/1:81,49:95:-81.53,-28.61,-273.48:99
-chr1 817130 rs2879698 C T 1.75 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=52.69;MQ0=4;OQ=2390.21;QD=32.30;SB=-1172.34 GT:AD:DP:GL:GQ 1/1:5,69:61:-242.62,-18.38,-0.02:99
-chr1 817140 rs4246498 T C 134.82 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=52.12;MQ0=4;OQ=2043.04;QD=29.61;SB=-1026.82 GT:AD:DP:GL:GQ 1/1:0,69:59:-207.91,-17.78,-0.03:99
-chr1 817186 rs4970386 C T 31.13 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.56;MQ=51.33;MQ0=3;OQ=2194.13;QD=35.39;SB=-970.28 GT:AD:DP:GL:GQ 1/1:3,59:55:-223.01,-16.57,-0.01:99
-chr1 819196 rs9778019 G A 567.53 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.32;MQ0=0;OQ=1941.14;QD=39.62;SB=-968.30 GT:AD:DP:GL:GQ 1/1:0,49:49:-197.71,-14.76,-0.01:99
-chr1 819500 rs4437820 C T 68.03 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=47.44;MQ0=2;OQ=2599.35;QD=37.13;SB=-1006.03 GT:AD:DP:GL:GQ 1/1:0,70:64:-263.53,-19.28,-0.01:99
-chr1 819787 . G A 25.28 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=51.75;MQ0=1;QD=0.29;SB=104.31 GT:AD:DP:GL:GQ 0/1:80,8:75:-28.42,-22.61,-220.79:58.10
-chr1 820044 rs28444699 A G 2.65 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.59;MQ=55.18;MQ0=2;OQ=1994.05;QD=28.49;SB=-1022.00 GT:AD:DP:GL:GQ 1/1:9,61:60:-210.82,-18.07,-7.83:99
-chr1 820670 rs6422669 G C 266.94 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=1;OQ=1743.26;QD=40.54;SB=-467.22 GT:AD:DP:GL:GQ 1/1:1,42:42:-177.93,-12.66,-0.02:99
-chr1 821139 rs4024798 C T 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=239;Dels=0.00;HRun=1;HaplotypeScore=9.98;MQ=39.26;MQ0=24;OQ=434.25;QD=1.82;SB=23.91 GT:AD:DP:GL:GQ 0/1:189,50:167:-97.03,-50.32,-487.12:99
-chr1 821171 rs477080 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=308;Dels=0.00;HRun=0;HaplotypeScore=33.10;MQ=34.56;MQ0=43;OQ=282.37;QD=0.92;SB=137.47 GT:AD:DP:GL:GQ 0/1:233,75:190:-88.75,-57.23,-688.44:99
-chr1 821352 rs4970385 C T 0.69 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=12.93;MQ=49.51;MQ0=5;OQ=2978.23;QD=32.02;SB=-1308.26 GT:AD:DP:GL:GQ 1/1:14,79:78:-308.32,-23.50,-6.91:99
-chr1 821772 rs9697642 C T 1.09 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=6.48;MQ=53.07;MQ0=1;OQ=2639.96;QD=38.26;SB=-935.74 GT:AD:DP:GL:GQ 1/1:1,68:65:-267.59,-19.58,-0.01:99
-chr1 821923 rs9697378 G A 628.11 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.85;MQ0=2;OQ=2615.06;QD=34.87;SB=-1164.40 GT:AD:DP:GL:GQ 1/1:9,66:67:-268.90,-20.18,-3.81:99
-chr1 821929 rs9697380 G C 204.81 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=46.00;MQ0=2;OQ=2952.34;QD=37.85;SB=-1375.91 GT:AD:DP:GL:GQ 1/1:9,69:70:-303.53,-21.09,-4.71:99
-chr1 821975 rs9697725 T C 60.31 PASS AC=2;AF=1.00;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=42.31;MQ0=7;OQ=2446.13;QD=25.75;SB=-880.44 GT:AD:DP:GL:GQ 1/1:20,75:74:-256.35,-22.29,-8.15:99
-chr1 822041 rs13302934 A G 54.22 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=37.41;MQ0=11;OQ=2291.03;QD=26.64;SB=-1047.92 GT:AD:DP:GL:GQ 1/1:17,69:67:-236.77,-20.18,-4.08:99
-chr1 822181 rs4500250 C A 165.39 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.49;MQ0=0;OQ=2287.58;QD=33.15;SB=-1055.56 GT:AD:DP:GL:GQ 1/1:2,67:63:-232.36,-18.97,-0.02:99
-chr1 822261 rs4553118 T C 105.61 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=53.16;MQ0=0;OQ=2074.16;QD=32.41;SB=-1031.91 GT:AD:DP:GL:GQ 1/1:0,64:58:-211.02,-17.47,-0.02:99
-chr1 827077 . G C 11.08 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1103.43;QD=20.06;SB=-557.74 GT:AD:DP:GL:GQ 0/1:23,32:50:-128.70,-15.07,-86.51:99
-chr1 832688 rs7519340 A G 206.11 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.92;MQ0=0;OQ=2256.38;QD=34.19;SB=-897.99 GT:AD:DP:GL:GQ 1/1:0,66:64:-229.25,-19.28,-0.02:99
-chr1 833268 rs11516185 A G 180.02 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.49;MQ=58.03;MQ0=0;OQ=720.81;QD=12.65;SB=-270.98 GT:AD:DP:GL:GQ 0/1:24,33:50:-90.45,-15.09,-82.68:99
-chr1 834163 rs61769713 C G 7.44 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=34.66;MQ0=0;OQ=386.18;QD=32.18;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,12:11:-42.22,-3.32,-0.01:33.11
-chr1 834187 rs61769714 G A 6.81 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=34.17;MQ0=0;OQ=258.44;QD=25.84;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:8:-29.44,-2.42,-0.01:24.06
-chr1 834206 rs61769715 A G 21 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=32.88;MQ0=0;OQ=98.47;QD=14.07;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:4:-13.38,-1.21,-0.00:12.03
-chr1 834961 . T G 0.56 PASS AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=16.23;MQ0=3;OQ=70.14;QD=6.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,10:3:-10.50,-0.90,-0.00:9.03
-chr1 835146 rs7366404 G T 7.38 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=37.00;MQ0=0;OQ=260.28;QD=32.54;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:8:-29.61,-2.41,-0.00:24.08
-chr1 836201 rs4970334 A G 56.75 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=57.95;MQ0=0;OQ=1280.53;QD=26.68;SB=-522.83 GT:AD:DP:GL:GQ 1/1:0,47:43:-131.69,-12.98,-0.05:99
-chr1 836352 rs4970333 T C 54.39 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=58.58;MQ0=0;OQ=1607.31;QD=32.80;SB=-789.15 GT:AD:DP:GL:GQ 1/1:0,49:46:-164.33,-13.86,-0.02:99
-chr1 837113 rs7416129 G A 502.58 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=3431.98;QD=39.91;SB=-1125.99 GT:AD:DP:GL:GQ 1/1:0,85:84:-342.20,-25.31,-0.02:99
-chr1 839861 rs13303222 A G 170.66 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.09;MQ0=0;OQ=2748.15;QD=33.51;SB=-1203.79 GT:AD:DP:GL:GQ 1/1:0,81:78:-278.43,-23.50,-0.03:99
-chr1 840081 rs6664536 T A 113.50 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.64;MQ0=0;OQ=1837.58;QD=35.34;SB=-814.88 GT:AD:DP:GL:GQ 1/1:0,52:50:-187.36,-15.06,-0.02:99
-chr1 840234 rs6679046 G T 614.25 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.48;MQ0=0;OQ=2550.23;QD=33.56;SB=-1032.51 GT:AD:DP:GL:GQ 1/1:0,76:73:-258.64,-22.00,-0.04:99
-chr1 840643 rs6657440 C T 589.62 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2334.22;QD=36.47;SB=-836.99 GT:AD:DP:GL:GQ 1/1:0,64:61:-237.03,-18.38,-0.02:99
-chr1 841253 . G T 87.70 PASS AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=59.70;MQ0=0;OQ=1174.44;QD=15.25;SB=-547.82 GT:AD:DP:GL:GQ 0/1:37,40:75:-143.32,-22.59,-125.03:99
-chr1 841362 rs4970465 A G 15.40 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=60.00;MQ0=0;OQ=1972.18;QD=30.34;SB=-856.55 GT:AD:DP:GL:GQ 1/1:0,65:61:-200.85,-18.39,-0.05:99
-chr1 841500 . G C 11.73 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=3;HaplotypeScore=11.47;MQ=56.60;MQ0=0;QD=0.26;SB=59.23 GT:AD:DP:GL:GQ 0/1:36,10:33:-14.38,-9.96,-126.72:44.27
-chr1 841620 rs62677860 A G 51.10 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=1201.63;QD=27.31;SB=-317.48 GT:AD:DP:GL:GQ 1/1:0,43:38:-123.78,-11.46,-0.03:99
-chr1 841900 rs4970463 G A 437.16 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=1176.31;QD=36.76;SB=-508.18 GT:AD:DP:GL:GQ 1/1:0,32:31:-121.23,-9.34,-0.01:93.29
-chr1 841926 rs28436996 G A 99.38 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=58.05;MQ0=0;OQ=1247.42;QD=34.65;SB=-580.28 GT:AD:DP:GL:GQ 1/1:0,35:33:-128.34,-9.94,-0.01:99
-chr1 841996 rs7518702 C T 517.92 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1573.23;QD=37.46;SB=-692.34 GT:AD:DP:GL:GQ 1/1:0,41:40:-160.92,-12.05,-0.01:99
-chr1 842738 rs13303369 C T 76.16 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=58.47;MQ0=0;OQ=2145.17;QD=36.99;SB=-908.72 GT:AD:DP:GL:GQ 1/1:0,58:57:-218.13,-17.18,-0.03:99
-chr1 842827 rs4970461 T G 8.55 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.36;MQ=59.03;MQ0=0;OQ=1414.13;QD=29.46;SB=-684.25 GT:AD:DP:GL:GQ 1/1:0,48:47:-145.05,-14.17,-0.05:99
-chr1 843817 rs1806509 C A 190.21 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.61;MQ0=0;OQ=1993.99;QD=33.80;SB=-878.64 GT:AD:DP:GL:GQ 1/1:0,59:57:-203.01,-17.17,-0.02:99
-chr1 844640 rs13303019 A G 51.99 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.20;MQ0=0;OQ=644.86;QD=22.24;SB=-345.42 GT:AD:DP:GL:GQ 1/1:0,29:23:-68.11,-6.95,-0.04:69.10
-chr1 844841 rs13303057 A C 5.18 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=58.36;MQ0=0;OQ=1059.33;QD=26.48;SB=-412.87 GT:AD:DP:GL:GQ 1/1:0,40:35:-109.55,-10.55,-0.04:99
-chr1 844938 rs6673914 C G 24.53 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.27;MQ0=0;OQ=1048.92;QD=37.46;SB=-371.18 GT:AD:DP:GL:GQ 1/1:0,28:26:-108.49,-7.84,-0.02:78.26
-chr1 847591 rs6689107 T G 181.31 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.19;MQ0=0;OQ=1848.72;QD=32.43;SB=-803.49 GT:AD:DP:GL:GQ 1/1:0,57:54:-188.48,-16.27,-0.02:99
-chr1 848664 rs7418179 A G 160.64 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=1692.05;QD=34.53;SB=-783.00 GT:AD:DP:GL:GQ 1/1:0,49:48:-172.81,-14.46,-0.02:99
-chr1 850279 rs61464428 G A 12.90 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.66;MQ0=0;OQ=337.99;QD=33.80;SB=-134.01 GT:AD:DP:GL:GQ 1/1:0,10:10:-37.39,-3.02,-0.01:30.09
-chr1 850324 rs57465118 G A 8.27 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=54.65;MQ0=0;OQ=218.19;QD=24.24;SB=-48.67 GT:AD:DP:GL:GQ 1/1:0,9:7:-25.40,-2.11,-0.00:21.06
-chr1 850384 rs57924093 C A 117.02 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.88;MQ0=0;OQ=151.15;QD=25.19;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:5:-18.67,-1.51,-0.00:15.05
-chr1 850551 rs60837925 G A 175.87 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=188.60;QD=31.43;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:6:-22.43,-1.81,-0.00:18.06
-chr1 850660 . G T 32.80 LowQual AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=65.19;MQ0=0;QD=16.40;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-6.69,-0.60,-0.00:6.02
-chr1 850717 rs57816555 T C 168.04 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.96;MQ0=0;OQ=139.82;QD=27.96;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:5:-17.54,-1.51,-0.00:15.04
-chr1 850871 rs28521172 G C 136.83 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=409.27;QD=34.11;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,12:11:-44.52,-3.32,-0.00:33.11
-chr1 851493 rs2879816 G A 181.32 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=58.51;MQ0=0;OQ=1761.97;QD=35.24;SB=-837.99 GT:AD:DP:GL:GQ 1/1:0,50:46:-179.80,-13.86,-0.02:99
-chr1 851671 rs13302982 A G 540.86 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.19;MQ0=0;OQ=1746.20;QD=30.64;SB=-800.68 GT:AD:DP:GL:GQ 1/1:0,57:56:-178.25,-16.89,-0.05:99
-chr1 851956 rs13303291 T C 0.63 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=5;HaplotypeScore=0.79;MQ=59.54;MQ0=0;OQ=1647.69;QD=32.95;SB=-763.57 GT:AD:DP:GL:GQ 1/1:0,50:48:-168.38,-14.46,-0.02:99
-chr1 851987 rs13303101 A G 75.91 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=58.42;MQ0=0;OQ=1718.71;QD=29.13;SB=-814.55 GT:AD:DP:GL:GQ 1/1:0,59:55:-175.51,-16.59,-0.06:99
-chr1 852246 rs6680268 C T 87.18 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.89;MQ0=0;OQ=1535.86;QD=36.57;SB=-649.38 GT:AD:DP:GL:GQ 1/1:0,42:40:-157.19,-12.05,-0.02:99
-chr1 852252 rs6693546 A G 8.74 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=57.97;MQ0=0;OQ=1460.23;QD=31.74;SB=-743.12 GT:AD:DP:GL:GQ 1/1:0,45:42:-149.63,-12.66,-0.02:99
-chr1 852729 rs3892970 C T 119.55 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1397.63;QD=34.09;SB=-551.29 GT:AD:DP:GL:GQ 1/1:0,41:38:-143.37,-11.46,-0.02:99
-chr1 852987 rs4040604 G T 33.76 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=59.28;MQ0=0;OQ=1900.46;QD=32.77;SB=-758.90 GT:AD:DP:GL:GQ 1/1:0,58:55:-193.66,-16.57,-0.02:99
-chr1 853374 rs28626846 T C 176.60 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=56.72;MQ0=0;OQ=383.16;QD=9.12;SB=-198.44 GT:AD:DP:GL:GQ 0/1:24,18:39:-53.37,-11.77,-80.00:99
-chr1 853419 rs7410998 G A 181.10 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.05;MQ0=1;OQ=787.22;QD=31.49;SB=-167.67 GT:AD:DP:GL:GQ 1/1:1,24:21:-82.31,-6.33,-0.01:63.20
-chr1 853425 rs7417972 A C 3.94 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=51.24;MQ0=1;OQ=853.26;QD=25.86;SB=-413.26 GT:AD:DP:GL:GQ 1/1:1,32:29:-88.94,-8.74,-0.03:87.12
-chr1 853552 rs7417994 A G 58.67 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=47.89;MQ0=0;OQ=1045.12;QD=27.50;SB=-347.41 GT:AD:DP:GL:GQ 1/1:0,38:34:-108.13,-10.26,-0.03:99
-chr1 854589 rs2340590 T A 319.49 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.35;MQ0=0;OQ=1082.41;QD=34.92;SB=-267.73 GT:AD:DP:GL:GQ 1/1:0,31:30:-111.84,-9.04,-0.02:90.27
-chr1 854618 rs2340589 A G 2.04 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1104.04;QD=28.31;SB=-284.44 GT:AD:DP:GL:GQ 1/1:0,39:37:-114.04,-11.17,-0.05:99
-chr1 854620 rs2340588 G A 306.13 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1407.34;QD=36.09;SB=-288.88 GT:AD:DP:GL:GQ 1/1:0,39:36:-144.33,-10.85,-0.01:99
-chr1 854801 . G A 27.13 PASS AC=2;AF=1.00;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.52;MQ0=0;OQ=1814.99;QD=37.81;SB=-848.99 GT:AD:DP:GL:GQ 1/1:0,48:46:-185.10,-13.86,-0.01:99
-chr1 856182 rs9988021 G A 414.08 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1807.60;QD=37.66;SB=-511.65 GT:AD:DP:GL:GQ 1/1:0,48:47:-184.36,-14.16,-0.02:99
-chr1 856756 rs2880024 T C 439.96 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.61;MQ0=0;OQ=1661.89;QD=33.92;SB=-660.32 GT:AD:DP:GL:GQ 1/1:0,49:47:-169.79,-14.16,-0.01:99
-chr1 856783 rs2341361 A G 391.16 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1555.14;QD=34.56;SB=-535.20 GT:AD:DP:GL:GQ 1/1:0,45:44:-159.12,-13.26,-0.02:99
-chr1 857447 rs2341360 A T 453.14 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1951.43;QD=37.53;SB=-755.79 GT:AD:DP:GL:GQ 1/1:0,51:51:-198.74,-15.36,-0.01:99
-chr1 858192 rs2341359 A C 117.47 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=55.20;MQ0=0;OQ=1194.83;QD=30.64;SB=-603.64 GT:AD:DP:GL:GQ 1/1:0,39:36:-123.08,-10.85,-0.02:99
-chr1 858267 rs13302914 C T 413.34 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.75;MQ0=0;OQ=1181.60;QD=33.76;SB=-589.79 GT:AD:DP:GL:GQ 1/1:0,35:32:-121.76,-9.65,-0.02:96.30
-chr1 858654 rs13303003 C T 431.96 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=892.14;QD=35.69;SB=-459.35 GT:AD:DP:GL:GQ 1/1:1,24:23:-92.80,-6.93,-0.01:69.23
-chr1 858754 rs13303066 A G 117.57 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.96;MQ0=0;OQ=1127.68;QD=32.22;SB=-537.22 GT:AD:DP:GL:GQ 1/1:0,35:32:-116.36,-9.64,-0.01:96.29
-chr1 858844 rs13303037 C T 239.71 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.36;MQ0=0;OQ=920.18;QD=35.39;SB=-178.71 GT:AD:DP:GL:GQ 1/1:0,26:25:-95.62,-7.54,-0.02:75.23
-chr1 859186 rs13303207 T C 5.25 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=1.75;MQ=49.46;MQ0=0;OQ=860.62;QD=31.87;SB=-321.13 GT:AD:DP:GL:GQ 1/1:0,27:25:-89.66,-7.53,-0.01:75.22
-chr1 859220 . G T 15.33 LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=44.47;MQ0=0;QD=0.73;SB=-4.00 GT:AD:DP:GL:GQ 0/1:18,3:16:-9.63,-4.82,-45.13:48.04
-chr1 859232 rs13303328 G T 26.22 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=42.12;MQ0=0;OQ=238.10;QD=15.87;SB=-41.94 GT:AD:DP:GL:GQ 0/1:4,11:12:-30.71,-3.62,-8.58:49.58
-chr1 859236 rs13303330 G C 2.57 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=42.12;MQ0=0;OQ=289.97;QD=19.33;SB=-45.46 GT:AD:DP:GL:GQ 0/1:4,11:11:-35.60,-3.32,-10.54:72.26
-chr1 859264 rs13303353 G C 17.54 PASS AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=37.87;MQ0=1;OQ=164.66;QD=13.72;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,7:8:-22.16,-2.41,-12.54:99
-chr1 859992 . G C 97.38 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.96;MQ0=0;OQ=93.52;QD=10.39;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:3:-12.84,-0.90,-0.00:9.03
-chr1 860032 . G T 37.54 PASS AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.43;MQ0=0;OQ=70.96;QD=5.46;SB=-10.00 GT:AD:DP:GL:GQ 1/1:8,5:3:-10.58,-0.90,-0.00:9.03
-chr1 860180 rs28451560 G A 12.62 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=73.11;QD=18.28;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,3:3:-10.80,-0.90,-0.00:9.03
-chr1 860766 rs13303094 T C 16.65 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.17;MQ0=0;OQ=826.94;QD=29.53;SB=-125.69 GT:AD:DP:GL:GQ 1/1:0,28:25:-86.29,-7.54,-0.02:75.20
-chr1 861197 rs4072383 G T 400.06 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.63;MQ0=0;OQ=731.30;QD=30.47;SB=-355.85 GT:AD:DP:GL:GQ 1/1:0,24:22:-76.73,-6.63,-0.01:66.18
-chr1 861546 rs4504834 G A 1.38 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.70;MQ0=0;OQ=257.15;QD=25.71;SB=-133.67 GT:AD:DP:GL:GQ 1/1:0,10:8:-29.30,-2.41,-0.01:24.07
-chr1 863421 rs1110052 G T 380.03 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1308.42;QD=32.71;SB=-530.08 GT:AD:DP:GL:GQ 1/1:0,40:39:-134.45,-11.76,-0.03:99
-chr1 865499 . C T 29.46 LowQual AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;QD=4.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,2:5:-7.74,-1.51,-8.99:62.30
-chr1 865506 rs7411115 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=55.21;MQ0=0;OQ=112.00;QD=22.40;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,4:5:-15.99,-1.51,-3.39:18.84
-chr1 866063 . G C 0.28 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=689.42;QD=21.54;SB=-257.43 GT:AD:DP:GL:GQ 0/1:12,20:31:-81.58,-9.35,-46.59:99
-chr1 866362 rs4372192 A G 0.01 FDRtranche2.00to10.00 AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=6;HaplotypeScore=0.89;MQ=56.86;MQ0=0;OQ=933.15;QD=29.16;SB=-432.49 GT:AD:DP:GL:GQ 1/1:0,31:29:-96.92,-8.74,-0.02:87.21
-chr1 867578 rs6605066 C G 7.06 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=93.52;QD=31.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:3:-12.84,-0.90,-0.00:9.03
-chr1 867694 rs6672356 T C 3.72 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=52.96;QD=17.65;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:3:-8.79,-0.91,-0.01:9.01
-chr1 868792 . G C 15.78 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.02;HRun=2;HaplotypeScore=22.45;MQ=51.57;MQ0=2;QD=0.38;SB=59.22 GT:AD:DP:GL:GQ 0/1:36,4:34:-14.81,-9.96,-119.24:48.50
-chr1 869539 rs6605067 G A 19.27 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.58;MQ=56.16;MQ0=0;OQ=2221.47;QD=39.67;SB=-1054.70 GT:AD:DP:GL:GQ 1/1:0,56:55:-225.74,-16.57,-0.01:99
-chr1 869550 rs2839 T C 133.50 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=56.64;MQ0=0;OQ=2001.68;QD=34.51;SB=-1024.77 GT:AD:DP:GL:GQ 1/1:0,58:57:-203.78,-17.17,-0.02:99
-chr1 870101 rs3748592 A G 495.56 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=1890.23;QD=34.37;SB=-862.36 GT:AD:DP:GL:GQ 1/1:0,55:54:-192.63,-16.27,-0.02:99
-chr1 871490 rs2272757 G A 6.94 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.19;MQ=57.04;MQ0=0;OQ=1394.54;QD=37.69;SB=-510.64 GT:AD:DP:GL:GQ 1/1:0,37:36:-143.05,-10.85,-0.01:99
-chr1 872666 rs2340582 A G 42.12 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.34;MQ=59.14;MQ0=0;OQ=1872.55;QD=34.68;SB=-917.03 GT:AD:DP:GL:GQ 1/1:0,54:54:-190.86,-16.27,-0.02:99
-chr1 873488 rs4970378 A G 248.98 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1449.35;QD=35.35;SB=-732.23 GT:AD:DP:GL:GQ 1/1:0,41:41:-148.53,-12.35,-0.01:99
-chr1 873762 . T G 3.38 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=57.58;MQ0=0;OQ=623.05;QD=12.98;SB=-319.82 GT:AD:DP:GL:GQ 0/1:24,24:47:-79.75,-14.16,-84.17:99
-chr1 873892 . A C 58.62 SnpCluster AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=2.09;SB=-41.91 GT:AD:DP:GL:GQ 0/1:23,5:28:-17.58,-8.43,-82.84:91.46
-chr1 873894 . C T 82.90 SnpCluster AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=2.96;SB=-56.23 GT:AD:DP:GL:GQ 0/1:23,5:28:-20.01,-8.43,-84.10:99
-chr1 873895 . C T 48.24 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.20;MQ0=0;QD=1.56;SB=-25.58 GT:AD:DP:GL:GQ 0/1:26,5:28:-16.54,-8.43,-88.26:81.07
-chr1 873901 . T G 115.57 SnpCluster AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.52;MQ0=0;QD=3.50;SB=-81.81 GT:AD:DP:GL:GQ 0/1:26,7:33:-24.78,-9.94,-99.02:99
-chr1 873954 rs7522415 C G 8.33 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=43.40;MQ0=0;OQ=1100.42;QD=22.93;SB=-415.98 GT:AD:DP:GL:GQ 0/1:16,32:45:-126.89,-13.56,-66.90:99
-chr1 873964 rs4970455 A C 1.05 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=2.44;MQ=43.46;MQ0=0;OQ=358.55;QD=6.77;SB=-63.88 GT:AD:DP:GL:GQ 0/1:38,15:50:-54.21,-15.07,-122.51:99
-chr1 874630 . G A 13.69 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=47.61;MQ0=0;OQ=1000.31;QD=21.75;SB=-485.51 GT:AD:DP:GL:GQ 0/1:17,29:46:-117.17,-13.86,-57.54:99
-chr1 874678 rs4246503 A G 158.46 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=55.11;MQ0=0;OQ=1771.59;QD=30.03;SB=-814.69 GT:AD:DP:GL:GQ 1/1:0,59:55:-180.79,-16.58,-0.04:99
-chr1 875539 rs4970377 C A 535.35 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.40;MQ0=0;OQ=2636.42;QD=36.12;SB=-1177.36 GT:AD:DP:GL:GQ 1/1:1,72:71:-267.24,-21.38,-0.02:99
-chr1 875552 rs4970452 G A 0.79 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=56.01;MQ0=0;OQ=2730.82;QD=37.93;SB=-1364.34 GT:AD:DP:GL:GQ 1/1:1,71:70:-276.69,-21.09,-0.03:99
-chr1 875562 rs4970376 A G 1.74 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=9.96;MQ=55.41;MQ0=0;OQ=2063.84;QD=30.35;SB=-1045.24 GT:AD:DP:GL:GQ 1/1:1,67:64:-210.02,-19.30,-0.05:99
-chr1 875869 rs4970375 T C 458.99 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.16;MQ0=0;OQ=1904.11;QD=35.26;SB=-492.54 GT:AD:DP:GL:GQ 1/1:0,54:53:-194.01,-15.96,-0.01:99
-chr1 876651 rs10465242 G A 37.22 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=58.78;MQ0=0;OQ=1853.33;QD=37.07;SB=-743.49 GT:AD:DP:GL:GQ 1/1:0,50:47:-188.93,-14.16,-0.01:99
-chr1 876680 rs10465241 C T 139.09 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1420.84;QD=37.39;SB=-598.99 GT:AD:DP:GL:GQ 1/1:0,38:38:-145.68,-11.45,-0.02:99
-chr1 877423 rs3748595 A C 60.20 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.73;MQ0=0;OQ=1913.10;QD=31.88;SB=-946.06 GT:AD:DP:GL:GQ 1/1:0,60:56:-194.92,-16.87,-0.02:99
-chr1 877664 rs3828047 A G 27.25 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.38;MQ0=0;OQ=1254.26;QD=33.90;SB=-513.49 GT:AD:DP:GL:GQ 1/1:0,37:36:-129.02,-10.84,-0.01:99
-chr1 878502 rs3748596 T C 69.46 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=55.26;MQ0=0;OQ=1390.46;QD=33.11;SB=-577.30 GT:AD:DP:GL:GQ 1/1:0,42:41:-142.65,-12.35,-0.02:99
-chr1 878522 rs3748597 T C 420.43 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.43;MQ0=0;OQ=1101.61;QD=31.47;SB=-433.56 GT:AD:DP:GL:GQ 1/1:0,35:33:-113.76,-9.94,-0.02:99
-chr1 879021 rs56262069 G C 15.32 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1649.51;QD=39.27;SB=-490.55 GT:AD:DP:GL:GQ 1/1:0,42:39:-168.56,-11.76,-0.02:99
-chr1 879022 rs13302945 A C 102.46 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1299.59;QD=30.94;SB=-461.34 GT:AD:DP:GL:GQ 1/1:0,42:39:-133.56,-11.75,-0.02:99
-chr1 879501 rs13303206 G C 38.13 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.78;MQ0=0;OQ=1536.75;QD=40.44;SB=-636.90 GT:AD:DP:GL:GQ 1/1:0,38:37:-157.27,-11.15,-0.01:99
-chr1 879576 rs13303051 C A 192.55 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=59.05;MQ0=0;OQ=1663.22;QD=33.94;SB=-850.81 GT:AD:DP:GL:GQ 1/1:1,48:46:-169.92,-13.85,-0.01:99
-chr1 880884 rs13302957 G A 138.98 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=59.32;MQ0=0;OQ=2228.59;QD=40.52;SB=-1097.37 GT:AD:DP:GL:GQ 1/1:0,55:55:-226.45,-16.57,-0.01:99
-chr1 880922 rs13303065 C T 237.80 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2022.89;QD=39.66;SB=-914.68 GT:AD:DP:GL:GQ 1/1:0,51:51:-205.89,-15.36,-0.01:99
-chr1 881808 rs13303106 A G 3.31 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=59.21;MQ0=0;OQ=1343.98;QD=25.36;SB=-644.88 GT:AD:DP:GL:GQ 1/1:0,53:43:-138.03,-12.97,-0.04:99
-chr1 882608 rs13303227 G A 569.43 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2091.00;QD=38.72;SB=-899.68 GT:AD:DP:GL:GQ 1/1:0,54:53:-212.70,-15.97,-0.01:99
-chr1 883143 rs4970371 G A 143.48 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=57.73;MQ0=0;OQ=2249.45;QD=37.49;SB=-940.26 GT:AD:DP:GL:GQ 1/1:0,60:57:-228.55,-17.17,-0.02:99
-chr1 883494 rs6605069 A G 58.53 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=58.62;MQ0=0;OQ=2094.43;QD=32.73;SB=-870.68 GT:AD:DP:GL:GQ 1/1:0,64:60:-213.05,-18.07,-0.02:99
-chr1 883582 rs4970445 G A 189.37 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.14;MQ0=0;OQ=1807.99;QD=33.48;SB=-798.52 GT:AD:DP:GL:GQ 1/1:1,53:49:-184.42,-14.78,-0.04:99
-chr1 884436 rs13303010 G A 1.14 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=58.63;MQ0=0;OQ=585.11;QD=34.42;SB=-52.67 GT:AD:DP:GL:GQ 1/1:0,17:16:-62.10,-4.82,-0.01:48.15
-chr1 885569 rs13303327 G A 161.74 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=61.07;MQ0=0;OQ=743.89;QD=37.19;SB=-245.00 GT:AD:DP:GL:GQ 1/1:0,20:20:-77.98,-6.03,-0.01:60.19
-chr1 887188 rs4970441 G C 2.34 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=753.54;QD=39.66;SB=-289.25 GT:AD:DP:GL:GQ 1/1:0,19:18:-78.95,-5.42,-0.01:54.18
-chr1 887427 rs13303229 T C 257.67 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1210.82;QD=33.63;SB=-286.61 GT:AD:DP:GL:GQ 1/1:0,36:36:-124.69,-10.85,-0.02:99
-chr1 888186 rs6605071 T C 17.61 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.35;MQ=58.67;MQ0=0;OQ=1185.73;QD=33.88;SB=-618.22 GT:AD:DP:GL:GQ 1/1:0,35:34:-122.17,-10.24,-0.01:99
-chr1 889791 rs6677386 G C 245.35 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=39.71;MQ0=0;QD=16.36;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:8:-28.14,-2.43,-0.02:24.07
-chr1 889800 . G T 344.36 SnpCluster AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.12;MQ0=0;QD=28.70;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,12:11:-38.03,-3.31,-0.01:33.08
-chr1 889801 . G C 465.29 SnpCluster AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=39.12;MQ0=0;QD=38.77;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,12:11:-50.12,-3.31,-0.00:33.11
-chr1 889805 . G A 501.88 SnpCluster AC=2;AF=1.00;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.71;MQ0=0;QD=33.46;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:14:-53.78,-4.22,-0.01:42.13
-chr1 889852 rs6669071 A C 11.50 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=44.10;MQ0=0;OQ=318.72;QD=26.56;SB=-44.57 GT:AD:DP:GL:GQ 1/1:0,12:11:-35.46,-3.31,-0.01:33.07
-chr1 889864 rs28754834 G A 283.84 Indel AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=44.79;MQ0=0;QD=31.54;SB=-93.34 GT:AD:DP:GL:GQ 1/1:0,9:8:-31.97,-2.41,-0.00:24.08
-chr1 889872 rs6704181 C G 264.94 Indel AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=42.50;MQ0=0;QD=33.12;SB=-56.93 GT:AD:DP:GL:GQ 1/1:0,8:7:-30.07,-2.11,-0.00:21.07
-chr1 890148 rs4970435 C T 1.99 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=54.37;MQ0=0;OQ=1059.65;QD=35.32;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,29:28:-109.56,-8.43,-0.01:84.27
-chr1 890149 rs4970434 A G 1.27 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=54.37;MQ0=0;OQ=1048.98;QD=34.97;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,30:29:-108.49,-8.74,-0.01:87.27
-chr1 890161 . C G 0.39 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=54.80;MQ0=0;OQ=464.33;QD=12.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,21:31:-59.09,-9.37,-60.44:99
-chr1 890593 rs3935066 G A 1827.67 Indel AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.80;MQ0=0;QD=38.08;SB=-380.50 GT:AD:DP:GL:GQ 1/1:0,48:46:-186.37,-13.86,-0.02:99
-chr1 890835 rs9697711 T G 5.70 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=57.77;MQ0=0;OQ=1087.73;QD=27.19;SB=-563.56 GT:AD:DP:GL:GQ 1/1:0,40:34:-112.38,-10.25,-0.03:99
-chr1 890886 rs13303351 T C 4.74 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=56.17;MQ0=0;OQ=1868.96;QD=27.89;SB=-762.95 GT:AD:DP:GL:GQ 1/1:0,67:61:-190.56,-18.41,-0.08:99
-chr1 891422 rs13303160 G A 335.14 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1009.81;QD=38.84;SB=-456.35 GT:AD:DP:GL:GQ 1/1:0,26:26:-104.57,-7.83,-0.01:78.26
-chr1 891470 rs13302996 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1288.09;QD=33.03;SB=-383.20 GT:AD:DP:GL:GQ 1/1:0,39:34:-132.43,-10.27,-0.04:99
-chr1 891515 rs2879814 A G 4.78 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.80;MQ=59.05;MQ0=0;OQ=1360.05;QD=30.91;SB=-420.15 GT:AD:DP:GL:GQ 1/1:0,44:40:-139.61,-12.06,-0.03:99
-chr1 892627 rs28416780 C G 985.40 Indel AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.73;MQ=60.94;MQ0=0;QD=29.86;SB=-516.60 GT:AD:DP:GL:GQ 1/1:0,33:26:-102.16,-7.86,-0.03:78.25
-chr1 892860 rs7524174 G A 607.69 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2039.21;QD=35.78;SB=-884.69 GT:AD:DP:GL:GQ 1/1:0,57:52:-207.52,-15.67,-0.02:99
-chr1 893108 rs28690976 A G 19.77 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.50;MQ0=0;OQ=1221.87;QD=33.02;SB=-508.55 GT:AD:DP:GL:GQ 1/1:0,37:34:-125.78,-10.24,-0.01:99
-chr1 893184 rs6669800 G A 536.30 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1821.94;QD=35.04;SB=-645.66 GT:AD:DP:GL:GQ 1/1:0,52:47:-185.80,-14.16,-0.02:99
-chr1 895023 rs7555426 C T 0.47 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.03;HRun=0;HaplotypeScore=12.36;MQ=55.36;MQ0=0;OQ=2346.52;QD=37.25;SB=-860.64 GT:AD:DP:GL:GQ 1/1:0,60:62:-238.26,-18.08,-0.02:99
-chr1 895028 rs7522959 A G 167.42 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=55.43;MQ0=0;OQ=2120.68;QD=33.14;SB=-824.97 GT:AD:DP:GL:GQ 1/1:0,63:62:-215.68,-18.68,-0.03:99
-chr1 899282 rs28548431 C T 198.63 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.43;MQ0=0;OQ=508.80;QD=15.42;SB=-237.75 GT:AD:DP:GL:GQ 0/1:15,18:31:-63.51,-9.35,-46.57:99
-chr1 899418 rs2340594 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1231.29;QD=30.03;SB=-602.23 GT:AD:DP:GL:GQ 1/1:0,41:40:-126.75,-12.06,-0.03:99
-chr1 899631 rs2340593 A G 106.26 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1110.83;QD=35.83;SB=-387.48 GT:AD:DP:GL:GQ 1/1:0,31:31:-114.68,-9.34,-0.01:93.28
-chr1 900257 rs28477686 C T 200.51 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=716.99;QD=16.30;SB=-337.87 GT:AD:DP:GL:GQ 0/1:20,24:40:-87.03,-12.05,-62.41:99
-chr1 900301 rs6685581 A G 61.67 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.90;MQ0=0;OQ=1025.59;QD=26.99;SB=-469.48 GT:AD:DP:GL:GQ 1/1:0,38:34:-106.18,-10.26,-0.04:99
-chr1 900766 rs4970429 T C 21.40 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1255.50;QD=27.90;SB=-520.11 GT:AD:DP:GL:GQ 1/1:0,45:41:-129.18,-12.37,-0.04:99
-chr1 901458 rs7417106 A G 62.69 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.69;MQ0=0;OQ=1131.68;QD=22.63;SB=-392.29 GT:AD:DP:GL:GQ 1/1:0,48:37:-116.79,-11.16,-0.04:99
-chr1 901912 rs9803103 T C 68.99 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.16;MQ0=0;OQ=72.78;QD=4.85;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,5:15:-15.08,-4.52,-39.48:99
-chr1 901966 rs9803017 G A 5.21 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=48.89;MQ0=0;OQ=164.19;QD=23.46;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,5:5:-19.98,-1.51,-0.00:15.05
-chr1 903262 . C T 47.02 LowQual AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.12;MQ0=0;QD=23.51;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-8.11,-0.60,-0.00:6.02
-chr1 903752 rs2340596 G A 213.15 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.63;MQ0=0;OQ=437.08;QD=12.86;SB=-239.73 GT:AD:DP:GL:GQ 0/1:19,15:34:-57.25,-10.26,-59.16:99
-chr1 904055 rs2340595 G C 462.22 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1540.41;QD=36.68;SB=-743.79 GT:AD:DP:GL:GQ 1/1:0,42:38:-157.65,-11.46,-0.02:99
-chr1 904196 rs13302979 C G 14.38 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=238.96;QD=11.95;SB=-110.33 GT:AD:DP:GL:GQ 0/1:12,8:19:-32.91,-5.73,-43.20:99
-chr1 904715 rs13303368 G C 150.50 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=58.83;MQ0=0;OQ=429.52;QD=11.93;SB=-165.16 GT:AD:DP:GL:GQ 0/1:21,15:34:-56.48,-10.25,-87.94:99
-chr1 904739 rs13302983 T C 1.98 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=59.49;MQ0=0;OQ=1146.65;QD=25.48;SB=-382.24 GT:AD:DP:GL:GQ 1/1:0,45:37:-118.29,-11.16,-0.04:99
-chr1 904803 rs13303033 T C 97.04 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=59.44;MQ0=0;OQ=505.70;QD=12.33;SB=-138.55 GT:AD:DP:GL:GQ 0/1:20,21:40:-65.92,-12.07,-67.38:99
-chr1 905090 rs13303355 A G 1.94 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=8.34;MQ=56.14;MQ0=0;OQ=1675.03;QD=29.39;SB=-822.95 GT:AD:DP:GL:GQ 1/1:1,56:50:-171.12,-15.07,-0.03:99
-chr1 906412 rs6660139 A G 108.89 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=506.06;QD=14.88;SB=-146.57 GT:AD:DP:GL:GQ 0/1:14,20:33:-63.84,-9.95,-51.10:99
-chr1 906453 rs28566954 G A 282.05 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=491.61;QD=13.66;SB=-253.24 GT:AD:DP:GL:GQ 0/1:20,16:35:-62.99,-10.55,-63.70:99
-chr1 906697 rs6694632 G A 262.48 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.25;MQ0=0;OQ=424.41;QD=13.69;SB=-233.73 GT:AD:DP:GL:GQ 0/1:16,15:29:-54.46,-8.74,-53.31:99
-chr1 906923 rs6605058 C G 4.01 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.45;MQ0=0;OQ=1718.51;QD=40.92;SB=-739.75 GT:AD:DP:GL:GQ 1/1:0,42:41:-175.45,-12.36,-0.02:99
-chr1 907503 rs41285816 G A 149.42 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=650.11;QD=15.12;SB=-327.85 GT:AD:DP:GL:GQ 0/1:21,22:41:-80.65,-12.35,-76.53:99
-chr1 908101 rs28552711 C G 269.46 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.03;MQ0=0;OQ=561.89;QD=11.71;SB=-234.09 GT:AD:DP:GL:GQ 0/1:27,21:45:-73.04,-13.57,-111.91:99
-chr1 908247 rs13303118 G T 75.04 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.58;MQ0=0;OQ=378.28;QD=8.60;SB=-112.78 GT:AD:DP:GL:GQ 0/1:27,17:40:-53.17,-12.06,-75.89:99
-chr1 908436 rs2341354 A G 288.04 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.09;MQ0=0;OQ=687.85;QD=13.49;SB=-217.36 GT:AD:DP:GL:GQ 0/1:22,29:47:-86.23,-14.17,-83.30:99
-chr1 908990 rs28469033 T C 203.63 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=58.06;MQ0=0;OQ=712.75;QD=12.29;SB=-242.27 GT:AD:DP:GL:GQ 0/1:29,28:55:-91.13,-16.57,-114.97:99
-chr1 909282 rs6605059 T C 230.41 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=181.71;QD=7.57;SB=-100.01 GT:AD:DP:GL:GQ 0/1:13,11:22:-28.09,-6.63,-51.27:99
-chr1 909352 rs61606412 C T 41.71 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=53.76;MQ0=0;OQ=576.99;QD=16.03;SB=-77.09 GT:AD:DP:GL:GQ 0/1:16,19:32:-70.62,-9.64,-54.85:99
-chr1 909718 . G A 32.42 PASS AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=82.61;QD=6.35;SB=-28.51 GT:AD:DP:GL:GQ 0/1:9,4:13:-15.46,-3.92,-29.36:99
-chr1 909851 . C T 379.69 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=14.99;MQ=38.66;MQ0=0;QD=8.44;SB=-209.86 GT:AD:DP:GL:GQ 0/1:32,13:38:-52.70,-11.44,-90.66:99
-chr1 909854 . C A 33.53 Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=23.31;MQ=39.61;MQ0=0;QD=0.73;SB=-35.83 GT:AD:DP:GL:GQ 0/1:41,3:18:-18.90,-12.26,-52.66:66.37
-chr1 909858 . T A 34.25 Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=85.24;MQ=39.71;MQ0=0;QD=0.69;SB=-24.32 GT:AD:DP:GL:GQ 0/1:46,4:25:-14.24,-7.53,-79.28:67.09
-chr1 909861 rs2341357 A C 442.96 Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=92.23;MQ=37.93;MQ0=0;QD=9.23;SB=-187.18 GT:AD:DP:GL:GQ 0/1:13,31:32:-70.70,-23.12,-57.83:99
-chr1 909862 . T C 28.94 Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=90.34;MQ=37.54;MQ0=1;QD=0.59;SB=-27.89 GT:AD:DP:GL:GQ 0/1:45,4:23:-13.11,-6.93,-76.03:61.77
-chr1 909865 rs55746336 A C 368.04 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=65.88;MQ=38.28;MQ0=1;QD=7.51;SB=-150.94 GT:AD:DP:GL:GQ 0/1:20,29:28:-48.52,-8.43,-49.13:99
-chr1 910511 rs6677020 T C 126.81 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.99;MQ0=0;OQ=1842.74;QD=30.71;SB=-555.07 GT:AD:DP:GL:GQ 1/1:0,60:57:-187.90,-17.18,-0.04:99
-chr1 910596 rs6677131 T C 281.37 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=1029.24;QD=25.10;SB=-459.07 GT:AD:DP:GL:GQ 1/1:0,41:35:-106.55,-10.56,-0.04:99
-chr1 911433 rs6662128 T C 65.09 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=42.74;MQ0=0;OQ=1332.64;QD=27.76;SB=-494.18 GT:AD:DP:GL:GQ 1/1:0,48:43:-136.89,-12.97,-0.04:99
-chr1 911523 rs6703008 C T 253.53 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.87;MQ0=0;OQ=592.10;QD=14.44;SB=-247.55 GT:AD:DP:GL:GQ 0/1:21,20:40:-74.55,-12.06,-68.34:99
-chr1 911579 rs13303278 C A 321.21 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=57.82;MQ0=0;OQ=846.22;QD=16.27;SB=-412.14 GT:AD:DP:GL:GQ 0/1:22,30:49:-102.67,-14.76,-65.25:99
-chr1 911872 rs6693747 G A 247.15 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=57.81;MQ0=0;OQ=692.72;QD=11.94;SB=-247.55 GT:AD:DP:GL:GQ 0/1:34,24:51:-87.93,-15.37,-94.90:99
-chr1 912939 rs6605060 A G 422.47 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1569.95;QD=29.62;SB=-431.82 GT:AD:DP:GL:GQ 1/1:0,53:52:-160.64,-15.69,-0.06:99
-chr1 913322 rs9442609 A G 120.23 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=58.95;MQ0=0;OQ=1780.01;QD=28.25;SB=-752.61 GT:AD:DP:GL:GQ 1/1:0,63:58:-181.64,-17.49,-0.06:99
-chr1 913612 rs9442610 T C 76.57 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.45;MQ0=1;OQ=2496.82;QD=28.70;SB=-1150.17 GT:AD:DP:GL:GQ 1/1:1,86:79:-253.33,-23.82,-0.07:99
-chr1 913974 rs28447224 T A 288.86 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.45;MQ0=0;OQ=731.87;QD=12.20;SB=-322.51 GT:AD:DP:GL:GQ 0/1:33,27:58:-93.94,-17.47,-123.87:99
-chr1 914034 . A T 3.99 PASS AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.53;MQ0=0;OQ=328.12;QD=3.57;SB=-36.46 GT:AD:DP:GL:GQ 0/1:74,18:90:-63.21,-27.12,-275.61:99
-chr1 914043 . A T 0.15 PASS AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=53.25;MQ0=0;OQ=310.60;QD=3.20;SB=-88.90 GT:AD:DP:GL:GQ 0/1:71,26:82:-59.05,-24.71,-248.58:99
-chr1 914057 rs36034299 T A 46.78 PASS AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=52.48;MQ0=0;OQ=1254.45;QD=10.20;SB=-515.06 GT:AD:DP:GL:GQ 0/1:78,44:120:-164.87,-36.14,-292.57:99
-chr1 914062 rs34208189 G T 4.13 PASS AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=1;HaplotypeScore=4.71;MQ=52.50;MQ0=0;OQ=1304.79;QD=10.87;SB=-551.46 GT:AD:DP:GL:GQ 0/1:72,47:118:-172.13,-38.37,-252.01:99
-chr1 914098 rs28489602 G A 178.03 PASS AC=1;AF=0.50;AN=2;DB;DP=123;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=53.92;MQ0=0;OQ=1142.45;QD=9.29;SB=-414.29 GT:AD:DP:GL:GQ 0/1:80,43:115:-152.18,-34.65,-273.57:99
-chr1 914111 . T G 3.17 PASS AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=54.02;MQ0=0;OQ=717.31;QD=5.56;SB=-222.67 GT:AD:DP:GL:GQ 0/1:95,34:128:-113.56,-38.55,-355.41:99
-chr1 914118 rs59424352 T G 15.06 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=131;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=54.89;MQ0=0;QD=0.11;SB=-22.32 GT:AD:DP:GL:GQ 0/1:103,28:116:-39.71,-34.94,-387.42:47.76
-chr1 914126 rs28607403 A T 0.47 PASS AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=56.46;MQ0=0;OQ=177.88;QD=1.41;SB=-25.34 GT:AD:DP:GL:GQ 0/1:106,20:118:-56.62,-35.55,-387.33:99
-chr1 914231 rs35562283 C T 2.83 PASS AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=2;HaplotypeScore=2.10;MQ=59.39;MQ0=0;OQ=4072.19;QD=40.72;SB=-2034.20 GT:AD:DP:GL:GQ 1/1:0,100:100:-406.22,-30.12,-0.03:99
-chr1 914391 rs34712273 C A 51.10 PASS AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=5.23;MQ=56.94;MQ0=0;OQ=1123.83;QD=11.59;SB=-531.23 GT:AD:DP:GL:GQ 0/1:55,42:95:-144.28,-28.62,-196.31:99
-chr1 914466 rs28422907 T C 454.63 PASS AC=2;AF=1.00;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=3679.99;QD=36.08;SB=-1782.71 GT:AD:DP:GL:GQ 1/1:0,102:101:-367.00,-30.42,-0.03:99
-chr1 914492 rs28622096 A G 82.91 PASS AC=2;AF=1.00;AN=2;DB;DP=92;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=2947.74;QD=32.04;SB=-1451.63 GT:AD:DP:GL:GQ 1/1:0,92:91:-298.43,-27.44,-0.07:99
-chr1 914761 rs6665000 C A 607.33 PASS AC=2;AF=1.00;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3789.11;QD=37.15;SB=-1446.45 GT:AD:DP:GL:GQ 1/1:0,101:101:-377.91,-33.59,-3.42:99
-chr1 915547 rs6605061 T C 196.60 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=57.81;MQ0=0;OQ=1982.79;QD=33.05;SB=-855.97 GT:AD:DP:GL:GQ 1/1:0,60:57:-201.89,-17.17,-0.03:99
-chr1 916214 rs6671243 C T 469.30 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2468.85;QD=39.82;SB=-737.98 GT:AD:DP:GL:GQ 1/1:0,62:61:-250.48,-18.37,-0.01:99
-chr1 916294 rs4970403 A T 304.51 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=59.43;MQ0=0;OQ=2680.54;QD=36.72;SB=-1154.05 GT:AD:DP:GL:GQ 1/1:1,72:71:-271.66,-21.39,-0.02:99
-chr1 916484 rs4970351 A C 485.68 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1740.98;QD=35.53;SB=-550.05 GT:AD:DP:GL:GQ 1/1:0,49:49:-177.70,-14.76,-0.01:99
-chr1 917172 rs2341362 T C 555.17 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1855.09;QD=30.92;SB=-890.64 GT:AD:DP:GL:GQ 1/1:0,60:59:-189.15,-17.80,-0.06:99
-chr1 917604 rs6665587 G A 343.04 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=746.63;QD=16.23;SB=-250.74 GT:AD:DP:GL:GQ 0/1:23,23:45:-91.50,-13.55,-86.19:99
-chr1 918279 . G A 19.72 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=64.12;MQ0=0;OQ=347.49;QD=8.91;SB=-127.57 GT:AD:DP:GL:GQ 0/1:25,14:32:-47.68,-9.65,-62.78:99
-chr1 918383 rs35002855 A G 36.80 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.30;MQ0=0;OQ=923.20;QD=27.98;SB=-310.47 GT:AD:DP:GL:GQ 1/1:0,33:30:-95.93,-9.05,-0.03:90.20
-chr1 918441 rs28394749 G A 367.26 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1345.86;QD=38.45;SB=-480.97 GT:AD:DP:GL:GQ 1/1:0,35:35:-138.18,-10.55,-0.01:99
-chr1 918699 rs9777703 C T 463.81 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.88;MQ0=0;OQ=1525.43;QD=38.14;SB=-621.02 GT:AD:DP:GL:GQ 1/1:0,40:39:-156.14,-11.75,-0.01:99
-chr1 919053 rs9777939 A G 223.28 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1351.32;QD=33.78;SB=-678.95 GT:AD:DP:GL:GQ 1/1:0,40:38:-138.73,-11.45,-0.01:99
-chr1 919179 rs9777893 C T 85.58 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=55.86;MQ0=0;OQ=1631.07;QD=35.46;SB=-540.88 GT:AD:DP:GL:GQ 1/1:0,46:44:-166.72,-13.27,-0.03:99
-chr1 919184 rs13302916 A C 0.11 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=5;HaplotypeScore=2.13;MQ=54.60;MQ0=0;OQ=1536.74;QD=31.36;SB=-480.03 GT:AD:DP:GL:GQ 1/1:0,49:45:-157.28,-13.56,-0.02:99
-chr1 919190 rs13302924 A G 46.51 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=54.92;MQ0=0;OQ=1263.79;QD=24.30;SB=-518.21 GT:AD:DP:GL:GQ 1/1:0,52:42:-130.02,-12.68,-0.06:99
-chr1 919921 . C A 110.32 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=58.99;MQ0=0;OQ=1041.89;QD=15.10;SB=-490.89 GT:AD:DP:GL:GQ 0/1:34,35:65:-127.06,-19.58,-99.23:99
-chr1 920192 rs3128108 C T 194.44 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.69;MQ0=0;OQ=711.37;QD=14.23;SB=-187.15 GT:AD:DP:GL:GQ 0/1:24,26:47:-88.59,-14.17,-77.59:99
-chr1 920240 rs3128109 C T 215.53 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.70;MQ0=0;OQ=1131.05;QD=17.95;SB=-367.88 GT:AD:DP:GL:GQ 0/1:29,34:63:-135.38,-18.99,-92.17:99
-chr1 920396 rs3128110 C G 210.15 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=58.26;MQ0=0;OQ=1157.59;QD=14.84;SB=-599.54 GT:AD:DP:GL:GQ 0/1:41,37:77:-142.27,-23.22,-177.91:99
-chr1 920430 rs3121574 A G 364.31 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.06;MQ0=0;OQ=652.89;QD=9.60;SB=-349.53 GT:AD:DP:GL:GQ 0/1:41,27:65:-88.16,-19.59,-156.95:99
-chr1 920614 rs3128111 C G 139.72 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=58.99;MQ0=0;OQ=1461.73;QD=21.18;SB=-736.36 GT:AD:DP:GL:GQ 0/1:28,41:68:-169.95,-20.49,-124.60:99
-chr1 920786 rs2710882 A G 12.29 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.97;MQ=49.62;MQ0=0;OQ=1291.93;QD=28.71;SB=-670.84 GT:AD:DP:GL:GQ 1/1:0,45:41:-132.82,-12.37,-0.04:99
-chr1 920877 rs2710881 A G 324.40 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=966.43;QD=26.85;SB=-364.34 GT:AD:DP:GL:GQ 1/1:0,36:31:-100.25,-9.35,-0.03:93.22
-chr1 921029 rs2710880 A G 58.88 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=56.56;MQ0=0;OQ=562.50;QD=14.06;SB=-270.38 GT:AD:DP:GL:GQ 0/1:15,25:36:-70.39,-10.85,-55.63:99
-chr1 921225 rs2799060 G A 150.73 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.04;MQ=54.08;MQ0=0;OQ=614.91;QD=17.08;SB=-332.87 GT:AD:DP:GL:GQ 0/1:15,21:29:-73.51,-8.74,-35.50:99
-chr1 921371 rs2799061 T A 126.55 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=52.82;MQ0=0;OQ=1479.30;QD=33.62;SB=-589.54 GT:AD:DP:GL:GQ 1/1:0,44:41:-151.53,-12.35,-0.02:99
-chr1 921411 rs2799062 G T 122.68 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=53.36;MQ0=0;OQ=738.91;QD=16.06;SB=-235.96 GT:AD:DP:GL:GQ 0/1:19,27:43:-90.13,-12.95,-62.40:99
-chr1 921593 rs2005437 A G 3.88 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=3.71;MQ=50.61;MQ0=0;OQ=1146.23;QD=32.75;SB=-497.46 GT:AD:DP:GL:GQ 1/1:0,35:33:-118.22,-9.94,-0.01:99
-chr1 921666 rs1891908 C T 2.08 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.85;MQ=32.06;MQ0=2;OQ=160.89;QD=4.35;SB=-6.43 GT:AD:DP:GL:GQ 0/1:19,17:19:-25.09,-5.72,-45.39:99
-chr1 921743 rs2710878 G A 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=13.34;MQ=30.42;MQ0=11;OQ=92.22;QD=1.77;SB=38.12 GT:AD:DP:GL:GQ 0/1:43,9:31:-21.85,-9.35,-87.56:99
-chr1 921798 rs59581901 T C 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=13.36;MQ=44.02;MQ0=2;OQ=265.71;QD=4.66;SB=-27.22 GT:AD:DP:GL:GQ 0/1:37,20:42:-42.52,-12.66,-114.67:99
-chr1 921802 rs13303155 G A 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=12.88;MQ=43.29;MQ0=2;OQ=165.28;QD=2.85;SB=-96.56 GT:AD:DP:GL:GQ 0/1:44,13:47:-33.98,-14.17,-116.58:99
-chr1 921917 rs13302969 G T 74.55 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=21.41;MQ0=5;OQ=283.37;QD=8.86;SB=-65.73 GT:AD:DP:GL:GQ 0/1:6,26:13:-35.54,-3.92,-11.08:71.59
-chr1 921950 rs4350142 T G 3.51 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=16.76;MQ0=5;OQ=77.67;QD=4.32;SB=-39.55 GT:AD:DP:GL:GQ 0/1:13,5:9:-13.76,-2.71,-16.22:99
-chr1 922320 rs1891910 G A 55.08 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=54.96;MQ0=0;OQ=908.58;QD=18.93;SB=-365.40 GT:AD:DP:GL:GQ 0/1:20,28:47:-108.30,-14.16,-73.49:99
-chr1 922481 rs3128112 C G 140.23 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.00;MQ0=0;OQ=2826.91;QD=42.19;SB=-1373.36 GT:AD:DP:GL:GQ 1/1:0,67:66:-286.30,-19.89,-0.02:99
-chr1 923653 rs9442392 G A 34.86 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.66;MQ0=0;OQ=346.01;QD=17.30;SB=-99.62 GT:AD:DP:GL:GQ 0/1:8,12:18:-43.31,-5.43,-22.69:99
-chr1 923962 rs2710867 G C 179.76 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=491.87;QD=30.74;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:14:-52.79,-4.24,-0.02:42.13
-chr1 923969 rs2799063 A G 177.71 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.52;MQ0=0;OQ=467.35;QD=31.16;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:15:-50.33,-4.52,-0.01:45.12
-chr1 923984 rs2488989 G A 4.47 PASS AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=52.45;MQ0=0;OQ=54.72;QD=4.21;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,4:12:-12.37,-3.61,-31.32:87.56
-chr1 924007 rs9697551 C G 2.08 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.65;MQ0=0;OQ=378.82;QD=37.88;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,10:10:-41.47,-3.01,-0.00:30.10
-chr1 925085 rs2298214 C A 41.67 PASS AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=126.82;QD=15.85;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,5:8:-18.37,-2.41,-10.50:80.94
-chr1 925696 rs3128115 C G 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=341.24;QD=28.44;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,12:10:-37.72,-3.03,-0.02:30.09
-chr1 925974 rs1936360 C T 39.87 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=58.35;MQ0=0;OQ=214.61;QD=12.62;SB=-42.53 GT:AD:DP:GL:GQ 0/1:9,8:14:-28.97,-4.22,-22.12:99
-chr1 926057 rs3121570 A G 2.88 PASS AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=311.77;QD=28.34;SB=-100.02 GT:AD:DP:GL:GQ 1/1:0,11:11:-34.77,-3.32,-0.01:33.06
-chr1 926073 rs3121569 C A 189.59 PASS AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=295.10;QD=26.83;SB=-77.88 GT:AD:DP:GL:GQ 1/1:0,11:10:-33.10,-3.01,-0.01:30.07
-chr1 927551 rs2489000 T C 23.57 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.20;MQ0=0;OQ=869.96;QD=30.00;SB=-383.48 GT:AD:DP:GL:GQ 1/1:0,29:26:-90.60,-7.84,-0.01:78.21
-chr1 927679 . G T 11.95 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=20;HaplotypeScore=4.44;MQ=51.49;MQ0=1;QD=0.30;SB=29.12 GT:AD:DP:GL:GQ 0/1:35,5:33:-14.39,-9.94,-101.16:44.50
-chr1 927979 rs2710869 T G 68.27 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=52.06;MQ0=0;OQ=1400.53;QD=31.83;SB=-711.32 GT:AD:DP:GL:GQ 1/1:0,44:41:-143.66,-12.35,-0.02:99
-chr1 927988 rs2710868 G A 255.30 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.36;MQ0=0;OQ=410.87;QD=10.02;SB=-73.54 GT:AD:DP:GL:GQ 0/1:27,14:38:-55.83,-11.46,-75.32:99
-chr1 928076 rs2799058 A G 513.54 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.12;MQ0=1;OQ=1982.35;QD=34.78;SB=-956.40 GT:AD:DP:GL:GQ 1/1:0,57:56:-201.84,-16.87,-0.02:99
-chr1 929868 rs2799056 A G 83.40 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=60.00;MQ0=0;OQ=292.67;QD=13.30;SB=-94.98 GT:AD:DP:GL:GQ 0/1:10,12:19:-38.28,-5.73,-31.90:99
-chr1 929959 rs4503294 C T 66.68 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=59.48;MQ0=0;OQ=871.55;QD=19.81;SB=-434.84 GT:AD:DP:GL:GQ 0/1:17,27:40:-102.50,-12.06,-44.62:99
-chr1 931147 rs3128116 C T 186.46 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=58.74;MQ0=0;OQ=584.87;QD=15.81;SB=-318.85 GT:AD:DP:GL:GQ 0/1:17,20:34:-72.02,-10.25,-50.30:99
-chr1 931197 rs57683598 G A 242.64 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.63;MQ0=0;OQ=443.86;QD=13.05;SB=-202.91 GT:AD:DP:GL:GQ 0/1:19,15:33:-57.62,-9.95,-57.41:99
-chr1 931402 rs9778087 C T 103.12 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=58.18;MQ0=0;OQ=521.73;QD=14.49;SB=-147.61 GT:AD:DP:GL:GQ 0/1:17,19:30:-64.50,-9.04,-41.68:99
-chr1 933113 rs3121568 C T 81.24 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=27.66;MQ0=1;OQ=764.02;QD=34.73;SB=-301.68 GT:AD:DP:GL:GQ 1/1:1,21:20:-79.99,-6.02,-0.00:60.20
-chr1 933331 rs3121567 T C 90.20 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=52.92;MQ0=0;OQ=1930.66;QD=28.39;SB=-605.93 GT:AD:DP:GL:GQ 1/1:0,67:59:-196.69,-17.79,-0.04:99
-chr1 933550 rs2465140 G C 10.53 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=52.98;MQ0=0;OQ=1826.77;QD=24.04;SB=-482.83 GT:AD:DP:GL:GQ 0/1:29,47:76:-208.87,-22.91,-115.72:99
-chr1 933770 rs2488992 C G 622.99 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2496.05;QD=39.00;SB=-1249.63 GT:AD:DP:GL:GQ 1/1:1,63:62:-253.23,-18.70,-0.04:99
-chr1 933831 rs13303313 C T 77.45 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=54.98;MQ0=1;OQ=1022.40;QD=21.30;SB=-421.46 GT:AD:DP:GL:GQ 0/1:17,31:46:-119.39,-13.87,-49.73:99
-chr1 934427 rs3128117 T C 70.90 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.79;MQ=59.48;MQ0=0;OQ=1012.81;QD=12.50;SB=-424.88 GT:AD:DP:GL:GQ 0/1:46,35:81:-128.96,-24.40,-186.84:99
-chr1 934959 rs3135457 C T 611.86 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=2185.20;QD=35.82;SB=-904.70 GT:AD:DP:GL:GQ 1/1:0,61:55:-222.12,-16.57,-0.02:99
-chr1 934974 rs13303172 C T 140.68 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.59;MQ0=0;OQ=2216.02;QD=34.63;SB=-887.19 GT:AD:DP:GL:GQ 1/1:0,63:58:-225.21,-17.48,-0.03:99
-chr1 935337 rs3121566 C T 64.84 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=57.82;MQ0=0;OQ=2650.36;QD=37.33;SB=-1265.29 GT:AD:DP:GL:GQ 1/1:0,71:68:-268.65,-20.49,-0.03:99
-chr1 935475 rs3121565 C T 3.95 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.58;MQ=54.82;MQ0=0;OQ=1712.26;QD=33.57;SB=-826.14 GT:AD:DP:GL:GQ 1/1:0,51:46:-174.83,-13.86,-0.02:99
-chr1 935997 rs2341364 T G 377.30 Indel AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=10.97;MQ=57.32;MQ0=2;QD=7.12;SB=-202.78 GT:AD:DP:GL:GQ 0/1:37,16:48:-55.47,-14.46,-118.77:99
-chr1 935998 rs9723307 T G 915.61 Indel AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=11.45;MQ=57.32;MQ0=2;QD=17.28;SB=-353.60 GT:AD:DP:GL:GQ 0/1:21,32:48:-109.30,-14.46,-57.43:99
-chr1 936897 rs2465126 G A 228.15 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.52;MQ0=0;OQ=1823.18;QD=37.98;SB=-798.06 GT:AD:DP:GL:GQ 1/1:0,48:47:-185.92,-14.16,-0.02:99
-chr1 937401 rs2465125 C T 186.23 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.20;MQ0=0;OQ=2163.80;QD=37.31;SB=-987.00 GT:AD:DP:GL:GQ 1/1:0,58:56:-219.99,-16.88,-0.02:99
-chr1 938555 rs2341365 G A 140.11 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.55;MQ0=0;OQ=1650.26;QD=34.38;SB=-693.43 GT:AD:DP:GL:GQ 1/1:0,47:44:-168.63,-13.26,-0.02:99
-chr1 938733 rs4615788 C G 63.76 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=59.05;MQ0=0;OQ=1777.68;QD=37.82;SB=-661.48 GT:AD:DP:GL:GQ 1/1:0,47:45:-181.39,-13.58,-0.03:99
-chr1 938784 rs15842 T C 63.77 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=51.15;MQ0=0;OQ=1180.61;QD=25.67;SB=-593.57 GT:AD:DP:GL:GQ 1/1:0,46:38:-121.68,-11.46,-0.04:99
-chr1 939098 rs2465124 G A 101.68 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.32;MQ0=0;OQ=1385.28;QD=35.52;SB=-635.85 GT:AD:DP:GL:GQ 1/1:0,39:36:-142.13,-10.85,-0.02:99
-chr1 939471 rs1921 G A 210.99 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.46;MQ0=0;OQ=818.95;QD=19.05;SB=-428.80 GT:AD:DP:GL:GQ 0/1:17,25:41:-97.53,-12.36,-57.36:99
-chr1 939517 rs8997 A G 93.12 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.52;MQ=58.71;MQ0=0;OQ=1127.57;QD=31.32;SB=-511.18 GT:AD:DP:GL:GQ 1/1:0,36:33:-116.36,-9.94,-0.02:99
-chr1 939788 rs2799070 C T 122.12 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=60.00;MQ0=0;OQ=1513.64;QD=36.92;SB=-701.35 GT:AD:DP:GL:GQ 1/1:0,40:39:-154.96,-11.75,-0.01:99
-chr1 940106 rs1891906 A C 58.36 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.38;MQ0=0;OQ=496.04;QD=13.41;SB=-49.04 GT:AD:DP:GL:GQ 0/1:19,18:37:-64.03,-11.14,-68.15:99
-chr1 940540 rs9331223 T C 228.94 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.40;MQ0=0;OQ=564.77;QD=13.45;SB=-287.31 GT:AD:DP:GL:GQ 0/1:17,25:39:-71.52,-11.76,-66.74:99
-chr1 940579 rs2799069 A T 132.14 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=57.66;MQ0=0;OQ=1217.27;QD=32.90;SB=-595.76 GT:AD:DP:GL:GQ 1/1:0,37:34:-125.32,-10.24,-0.01:99
-chr1 941146 rs9442363 C T 200.29 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=29.19;MQ0=1;OQ=502.68;QD=12.89;SB=-262.28 GT:AD:DP:GL:GQ 0/1:16,22:28:-61.99,-8.44,-37.57:99
-chr1 941158 rs9442388 C T 75.76 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.38;MQ=27.92;MQ0=1;OQ=496.98;QD=10.80;SB=-155.64 GT:AD:DP:GL:GQ 0/1:24,22:37:-64.14,-11.16,-65.52:99
-chr1 941185 rs9697362 C T 0.27 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=4;HaplotypeScore=0.96;MQ=26.62;MQ0=0;OQ=1253.78;QD=25.59;SB=-636.34 GT:AD:DP:GL:GQ 1/1:0,49:34:-128.98,-10.25,-0.02:99
-chr1 941193 rs9697717 G A 313.44 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.36;MQ0=0;OQ=1030.78;QD=25.77;SB=-468.62 GT:AD:DP:GL:GQ 1/1:0,40:27:-106.67,-8.14,-0.01:81.26
-chr1 941427 rs2465141 A G 200.39 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=50.56;MQ0=1;OQ=585.65;QD=10.65;SB=-303.21 GT:AD:DP:GL:GQ 0/1:29,26:48:-76.32,-14.47,-98.65:99
-chr1 941491 . A T 28.08 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.78;MQ0=3;QD=0.52;SB=41.14 GT:AD:DP:GL:GQ 0/1:46,8:45:-19.65,-13.56,-148.74:60.91
-chr1 941866 rs3128118 G A 182.23 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.48;MQ=58.42;MQ0=1;OQ=769.91;QD=13.27;SB=-278.19 GT:AD:DP:GL:GQ 0/1:30,27:54:-96.56,-16.28,-93.17:99
-chr1 942291 rs9442611 G A 158.27 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=58.27;MQ0=0;OQ=928.32;QD=19.34;SB=-479.01 GT:AD:DP:GL:GQ 0/1:19,29:48:-110.59,-14.48,-59.61:99
-chr1 943087 rs4970390 C T 107.20 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=50.43;MQ0=1;OQ=376.23;QD=6.60;SB=-175.84 GT:AD:DP:GL:GQ 0/1:38,19:49:-55.68,-14.78,-111.95:99
-chr1 943217 rs61766298 G A 33.08 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=54.66;MQ0=1;OQ=355.20;QD=4.80;SB=-58.95 GT:AD:DP:GL:GQ 0/1:57,16:65:-58.41,-19.60,-158.72:99
-chr1 943541 rs2952918 T C 3.09 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=5.78;MQ=53.39;MQ0=0;OQ=348.13;QD=8.70;SB=-186.61 GT:AD:DP:GL:GQ 0/1:24,16:38:-49.55,-11.46,-86.70:99
-chr1 943815 rs9442612 G A 205.15 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=57.73;MQ0=0;OQ=533.79;QD=13.02;SB=-257.75 GT:AD:DP:GL:GQ 0/1:22,19:39:-68.42,-11.76,-70.56:99
-chr1 944640 rs61766299 C A 104.63 PASS AC=1;AF=0.50;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=57.66;MQ0=0;OQ=76.34;QD=7.63;SB=-34.38 GT:AD:DP:GL:GQ 0/1:6,4:9:-13.63,-2.71,-15.11:99
-chr1 946715 rs9777931 C T 99.84 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=313.20;QD=12.05;SB=-129.12 GT:AD:DP:GL:GQ 0/1:14,11:22:-41.23,-6.63,-41.31:99
-chr1 949018 rs3845291 G A 42.15 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=59.54;MQ0=0;OQ=843.29;QD=16.87;SB=-349.52 GT:AD:DP:GL:GQ 0/1:23,27:47:-101.78,-14.17,-66.18:99
-chr1 949032 rs3845292 G C 180 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.52;MQ0=0;OQ=777.11;QD=16.19;SB=-360.45 GT:AD:DP:GL:GQ 0/1:22,26:45:-94.57,-13.58,-90.66:99
-chr1 949094 rs4039721 G A 273.59 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.09;MQ0=0;OQ=688.73;QD=16.80;SB=-366.42 GT:AD:DP:GL:GQ 0/1:19,22:36:-83.01,-10.86,-46.17:99
-chr1 950272 rs4970392 G C 3.67 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=405.25;QD=17.62;SB=-227.38 GT:AD:DP:GL:GQ 0/1:10,13:21:-50.14,-6.33,-36.47:99
-chr1 951690 rs3121556 G A 175.37 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=59.49;MQ0=0;OQ=541.95;QD=12.04;SB=-261.27 GT:AD:DP:GL:GQ 0/1:25,20:39:-69.24,-11.76,-65.32:99
-chr1 952469 rs4970393 G A 53.25 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=4.24;MQ=58.80;MQ0=0;OQ=631.93;QD=18.06;SB=-331.90 GT:AD:DP:GL:GQ 0/1:14,21:33:-76.42,-9.95,-42.13:99
-chr1 952754 rs4970394 C T 113.27 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=59.23;MQ0=0;OQ=488.22;QD=16.27;SB=-210.21 GT:AD:DP:GL:GQ 0/1:14,15:29:-60.84,-8.74,-49.96:99
-chr1 953112 rs2710870 C T 198.18 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=60.00;MQ0=0;OQ=692.82;QD=14.74;SB=-280.19 GT:AD:DP:GL:GQ 0/1:24,23:46:-86.43,-13.86,-83.87:99
-chr1 953580 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=16;HaplotypeScore=1.95;MQ=42.79;MQ0=0;OQ=89.92;QD=8.17;SB=-0.97 GT:AD:DP:GL:GQ 0/1:7,4:8:-14.69,-2.41,-16.44:99
-chr1 953584 rs2465127 T C 0.45 PASS AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=3;HaplotypeScore=3.77;MQ=52.61;MQ0=0;OQ=94.29;QD=7.86;SB=-65.34 GT:AD:DP:GL:GQ 0/1:4,8:9:-15.43,-2.71,-16.16:99
-chr1 954093 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=9.68;MQ=33.26;MQ0=5;OQ=209.72;QD=5.67;SB=-3.99 GT:AD:DP:GL:GQ 0/1:21,12:15:-28.78,-4.52,-24.72:99
-chr1 954161 rs61766303 C G 18.49 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=31.02;MQ0=1;OQ=184.53;QD=5.27;SB=-0.98 GT:AD:DP:GL:GQ 0/1:19,16:16:-26.57,-4.83,-37.31:99
-chr1 954252 rs4970397 C T 103.23 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=32.94;MQ0=3;OQ=204.52;QD=7.57;SB=-35.64 GT:AD:DP:GL:GQ 0/1:17,10:18:-29.16,-5.43,-34.74:99
-chr1 954703 rs4970343 T C 2.35 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=6.47;MQ=58.52;MQ0=0;OQ=457.55;QD=14.30;SB=-98.71 GT:AD:DP:GL:GQ 0/1:14,18:30:-58.08,-9.04,-50.50:99
-chr1 954711 rs4970344 A T 37.45 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.43;MQ0=0;OQ=626.99;QD=19.00;SB=-168.81 GT:AD:DP:GL:GQ 0/1:12,21:33:-75.92,-9.94,-45.13:99
-chr1 954872 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=20.43;MQ=48.78;MQ0=1;OQ=116.04;QD=3.14;SB=-52.28 GT:AD:DP:GL:GQ 0/1:25,12:25:-22.42,-7.54,-71.63:99
-chr1 955038 rs28373660 A G 250.76 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=55.30;MQ0=0;OQ=611.00;QD=13.28;SB=-229.46 GT:AD:DP:GL:GQ 0/1:20,26:39:-76.13,-11.75,-66.91:99
-chr1 955106 . A G 23.39 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=10.05;MQ=39.47;MQ0=7;QD=0.46;SB=-5.58 GT:AD:DP:GL:GQ 0/1:38,13:31:-14.97,-9.35,-98.23:56.21
-chr1 955141 rs28433148 T C 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.04;HRun=0;HaplotypeScore=16.86;MQ=40.85;MQ0=6;OQ=407.46;QD=7.41;SB=-215.36 GT:AD:DP:GL:GQ 0/1:25,28:41:-56.09,-12.06,-84.28:99
-chr1 955386 rs4970404 A G 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.02;HRun=0;HaplotypeScore=18.83;MQ=42.69;MQ0=11;OQ=218.68;QD=3.58;SB=-113.62 GT:AD:DP:GL:GQ 0/1:39,21:33:-35.11,-9.95,-82.73:99
-chr1 955467 rs4970345 C T 151.03 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=44.49;MQ0=2;OQ=398.93;QD=9.73;SB=-192.19 GT:AD:DP:GL:GQ 0/1:19,21:26:-51.01,-7.84,-42.93:99
-chr1 955802 rs4970398 A T 97.51 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=47.03;MQ0=2;OQ=550.07;QD=10.19;SB=-184.73 GT:AD:DP:GL:GQ 0/1:27,27:47:-72.45,-14.16,-100.00:99
-chr1 955812 rs4970399 A G 52.54 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.02;HRun=0;HaplotypeScore=3.69;MQ=45.58;MQ0=2;OQ=418.21;QD=7.47;SB=-156.96 GT:AD:DP:GL:GQ 0/1:27,28:43:-57.78,-12.67,-88.06:99
-chr1 955927 . T C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.47;MQ=51.74;MQ0=5;OQ=79.40;QD=1.80;SB=-44.68 GT:AD:DP:GL:GQ 0/1:30,14:34:-21.47,-10.25,-106.58:99
-chr1 955942 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=21.62;MQ=50.59;MQ0=7;OQ=96.72;QD=1.97;SB=-71.62 GT:AD:DP:GL:GQ 0/1:29,17:31:-22.31,-9.35,-90.50:99
-chr1 956010 . A G 17.59 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=45.86;MQ0=9;QD=0.35;SB=1.17 GT:AD:DP:GL:GQ 0/1:36,13:34:-15.29,-10.25,-111.87:50.35
-chr1 957521 rs4970349 C T 109.68 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.54;MQ=59.65;MQ0=0;OQ=696.48;QD=12.90;SB=-243.23 GT:AD:DP:GL:GQ 0/1:30,24:51:-88.30,-15.37,-100.68:99
-chr1 960023 . C T 7.39 PASS AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=53.50;MQ0=0;OQ=70.28;QD=5.86;SB=-0.98 GT:AD:DP:GL:GQ 0/1:7,5:10:-13.33,-3.02,-17.80:99
-chr1 960078 rs9442364 G C 190.47 PASS AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=59.38;QD=8.48;SB=-32.42 GT:AD:DP:GL:GQ 0/1:3,4:6:-11.04,-1.82,-11.54:92.22
-chr1 961087 rs2799055 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=6;HaplotypeScore=0.98;MQ=59.32;MQ0=0;OQ=442.07;QD=13.00;SB=-186.63 GT:AD:DP:GL:GQ 0/1:16,18:32:-57.14,-9.65,-55.82:99
-chr1 961230 rs2710883 T C 342.64 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=662.38;QD=14.09;SB=-345.94 GT:AD:DP:GL:GQ 0/1:23,24:47:-83.68,-14.16,-90.90:99
-chr1 961997 rs3121575 C T 135.78 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=582.22;QD=15.32;SB=-286.19 GT:AD:DP:GL:GQ 0/1:17,20:35:-72.05,-10.55,-56.30:99
-chr1 962043 rs4970350 G A 118.77 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=762.03;QD=19.05;SB=-359.38 GT:AD:DP:GL:GQ 0/1:16,24:38:-90.95,-11.46,-47.96:99
-chr1 963199 rs2488993 A G 276.26 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=691.22;QD=14.71;SB=-269.95 GT:AD:DP:GL:GQ 0/1:22,25:46:-86.26,-13.86,-87.86:99
-chr1 963240 rs2465129 G A 277.94 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.66;MQ=58.44;MQ0=0;OQ=598.48;QD=15.35;SB=-309.81 GT:AD:DP:GL:GQ 0/1:19,20:36:-73.98,-10.85,-56.47:99
-chr1 963321 rs2465130 C T 51.96 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=517.87;QD=11.26;SB=-211.85 GT:AD:DP:GL:GQ 0/1:28,18:43:-68.02,-12.95,-92.79:99
-chr1 963531 rs2488994 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=7.50;MQ=58.37;MQ0=0;OQ=421.46;QD=9.80;SB=-94.66 GT:AD:DP:GL:GQ 0/1:26,17:40:-57.48,-12.05,-93.15:99
-chr1 964043 rs3121577 G T 194.69 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.29;MQ0=0;OQ=740.60;QD=11.39;SB=-370.98 GT:AD:DP:GL:GQ 0/1:36,29:64:-96.63,-19.29,-128.48:99
-chr1 964062 rs2465131 C T 262.80 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.28;MQ0=0;OQ=941.69;QD=14.71;SB=-361.86 GT:AD:DP:GL:GQ 0/1:34,30:62:-116.13,-18.68,-116.79:99
-chr1 964088 rs2488995 A G 204.47 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=60.00;MQ0=0;OQ=709.06;QD=12.66;SB=-311.29 GT:AD:DP:GL:GQ 0/1:29,27:55:-90.77,-16.58,-108.13:99
-chr1 964159 rs2488996 A G 168.04 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=59.09;MQ0=0;OQ=732.05;QD=15.91;SB=-365.63 GT:AD:DP:GL:GQ 0/1:18,28:43:-89.45,-12.96,-67.34:99
-chr1 964218 rs2488997 G A 8.67 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.51;MQ=58.80;MQ0=0;OQ=657.04;QD=18.77;SB=-348.46 GT:AD:DP:GL:GQ 0/1:15,20:35:-79.53,-10.55,-53.54:99
-chr1 964219 rs2465132 T C 152.74 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=58.80;MQ0=0;OQ=438.83;QD=12.54;SB=-221.28 GT:AD:DP:GL:GQ 0/1:15,20:33:-57.12,-9.95,-56.00:99
-chr1 964357 rs2465133 G T 31.32 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=5.89;MQ=58.66;MQ0=0;OQ=971.31;QD=14.72;SB=-505.87 GT:AD:DP:GL:GQ 0/1:30,36:62:-119.10,-18.68,-97.98:99
-chr1 964433 rs2465134 T G 140.23 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.32;MQ=58.54;MQ0=0;OQ=578.70;QD=12.58;SB=-251.93 GT:AD:DP:GL:GQ 0/1:22,23:38:-72.60,-11.45,-62.23:99
-chr1 964525 rs2465135 G T 124.08 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=58.59;MQ0=0;OQ=621.72;QD=18.84;SB=-320.48 GT:AD:DP:GL:GQ 0/1:13,20:32:-75.10,-9.64,-38.41:99
-chr1 964757 rs3121578 C T 344.84 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.81;MQ0=0;OQ=283.06;QD=10.11;SB=-156.67 GT:AD:DP:GL:GQ 0/1:18,10:26:-39.43,-7.84,-52.76:99
-chr1 964996 rs3121579 T A 109.73 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.40;MQ0=0;OQ=475.63;QD=15.34;SB=-146.82 GT:AD:DP:GL:GQ 0/1:15,16:30:-59.88,-9.04,-53.03:99
-chr1 965565 rs9331224 A G 58.24 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=1.21;MQ=58.67;MQ0=0;OQ=414.04;QD=11.83;SB=-233.27 GT:AD:DP:GL:GQ 0/1:19,16:32:-54.33,-9.64,-64.60:99
-chr1 967066 rs3121552 G C 40.51 LowQual AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=8.10;SB=-43.44 GT:AD:DP:GL:GQ 0/1:3,2:4:-8.54,-1.21,-8.39:71.79
-chr1 967193 rs2799066 T C 15.85 LowQual AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.05;MQ0=0;QD=1.98;SB=-24.63 GT:AD:DP:GL:GQ 0/1:6,2:8:-7.27,-2.41,-22.53:48.57
-chr1 967433 rs2710876 G A 2.15 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=7.34;MQ=57.29;MQ0=0;OQ=207.99;QD=8.00;SB=-101.60 GT:AD:DP:GL:GQ 0/1:14,12:21:-30.42,-6.34,-38.59:99
-chr1 967643 rs2710875 C T 1.07 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=57.25;MQ0=0;OQ=665.34;QD=21.46;SB=-289.34 GT:AD:DP:GL:GQ 0/1:11,20:28:-78.26,-8.44,-23.82:99
-chr1 970323 rs3128097 G A 1.18 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=9.72;MQ=59.47;MQ0=0;OQ=926.21;QD=16.84;SB=-308.84 GT:AD:DP:GL:GQ 0/1:24,31:51:-111.27,-15.36,-80.98:99
-chr1 970950 rs3128098 A G 264.56 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.28;MQ0=0;OQ=593.17;QD=14.83;SB=-270.38 GT:AD:DP:GL:GQ 0/1:15,24:36:-73.46,-10.85,-50.98:99
-chr1 971794 rs2465128 A G 68.21 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=60.00;MQ0=0;OQ=206.80;QD=7.66;SB=-83.65 GT:AD:DP:GL:GQ 0/1:13,14:23:-30.90,-6.93,-51.94:99
-chr1 972307 rs3128099 A G 0.33 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=7.82;MQ=57.77;MQ0=0;OQ=622.11;QD=14.81;SB=-282.64 GT:AD:DP:GL:GQ 0/1:15,25:37:-76.65,-11.15,-58.34:99
-chr1 972325 rs3128100 T C 8.29 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=4.33;MQ=57.56;MQ0=0;OQ=1298.64;QD=27.06;SB=-459.21 GT:AD:DP:GL:GQ 1/1:0,48:42:-133.49,-12.67,-0.04:99
-chr1 972376 rs3128101 T C 10.73 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=5.66;MQ=56.76;MQ0=0;OQ=571.56;QD=13.94;SB=-141.55 GT:AD:DP:GL:GQ 0/1:15,25:36:-73.37,-12.93,-53.37:99
-chr1 972804 rs3128102 T C 4.22 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=3.75;MQ=59.50;MQ0=0;OQ=547.08;QD=11.89;SB=-200.60 GT:AD:DP:GL:GQ 0/1:23,23:37:-69.14,-11.15,-71.89:99
-chr1 972857 rs10267 T C 1.79 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.51;MQ=58.63;MQ0=0;OQ=633.32;QD=18.63;SB=-175.96 GT:AD:DP:GL:GQ 0/1:12,21:33:-76.56,-9.94,-48.12:99
-chr1 974010 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=20;HaplotypeScore=11.22;MQ=50.83;MQ0=0;OQ=57.83;QD=3.04;SB=2.03 GT:AD:DP:GL:GQ 0/1:15,4:17:-14.19,-5.12,-41.74:90.67
-chr1 974165 rs9442391 T C 32.20 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=57.07;MQ0=0;OQ=302.47;QD=11.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,13:22:-40.16,-6.63,-43.34:99
-chr1 975129 rs2275813 C T 11.79 PASS AC=1;AF=0.50;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.16;MQ0=0;OQ=102.58;QD=20.52;SB=-45.66 GT:AD:DP:GL:GQ 0/1:1,4:5:-15.04,-1.51,-2.70:11.90
-chr1 975309 rs2275812 G T 1.40 PASS AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=7.77;MQ=59.16;MQ0=0;OQ=108.56;QD=9.87;SB=-36.92 GT:AD:DP:GL:GQ 0/1:5,6:10:-17.15,-3.01,-16.77:99
-chr1 975312 rs56255212 G A 0.19 PASS AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=7.96;MQ=57.00;MQ0=0;OQ=248.84;QD=22.62;SB=-118.97 GT:AD:DP:GL:GQ 0/1:2,9:10:-31.18,-3.01,-6.57:35.54
-chr1 976306 rs2710887 C T 180.42 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=498.86;QD=13.13;SB=-206.20 GT:AD:DP:GL:GQ 0/1:21,17:37:-64.33,-11.16,-66.50:99
-chr1 977063 rs9803031 C T 254.02 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=585.89;QD=18.90;SB=-309.86 GT:AD:DP:GL:GQ 0/1:13,18:30:-70.92,-9.05,-35.55:99
-chr1 977533 rs13303287 T G 495.76 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=796.56;QD=13.73;SB=-424.70 GT:AD:DP:GL:GQ 0/1:25,33:58:-100.42,-17.48,-92.24:99
-chr1 978366 rs2799071 A T 261.84 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=849.34;QD=16.33;SB=-440.60 GT:AD:DP:GL:GQ 0/1:23,29:48:-102.68,-14.47,-71.41:99
-chr1 978795 rs2710871 G C 22.28 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=58.33;MQ0=0;OQ=743.65;QD=17.71;SB=-370.12 GT:AD:DP:GL:GQ 0/1:18,24:36:-88.51,-10.86,-57.89:99
-chr1 980143 rs4275402 C T 40.06 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=58.13;MQ0=0;OQ=896.64;QD=35.87;SB=-438.31 GT:AD:DP:GL:GQ 1/1:0,25:24:-93.26,-7.23,-0.01:72.23
-chr1 980380 rs2710872 C T 78.16 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=549.92;QD=18.33;SB=-189.29 GT:AD:DP:GL:GQ 0/1:12,18:27:-66.42,-8.14,-30.90:99
-chr1 980636 rs2799072 C T 101.12 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=1104.80;QD=20.09;SB=-396.92 GT:AD:DP:GL:GQ 0/1:22,33:54:-130.03,-16.27,-75.12:99
-chr1 980669 rs2799073 G A 136.86 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=60.00;MQ0=0;OQ=1001.06;QD=20.02;SB=-407.16 GT:AD:DP:GL:GQ 0/1:17,32:47:-117.55,-14.17,-57.43:99
-chr1 980847 rs8014 G A 99.13 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=656.29;QD=17.27;SB=-261.26 GT:AD:DP:GL:GQ 0/1:18,20:38:-80.37,-11.45,-56.60:99
-chr1 981587 rs3121562 C T 350.10 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.79;MQ0=0;OQ=354.87;QD=13.14;SB=-164.15 GT:AD:DP:GL:GQ 0/1:12,15:25:-46.32,-7.55,-37.60:99
-chr1 981840 rs4970400 G A 115.33 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=38.45;MQ=54.81;MQ0=0;QD=3.04;SB=-51.02 GT:AD:DP:GL:GQ 0/1:30,8:33:-24.78,-9.96,-81.20:99
-chr1 981844 rs13303259 A G 138.38 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=33.28;MQ=55.32;MQ0=0;QD=3.29;SB=-90.63 GT:AD:DP:GL:GQ 0/1:32,10:37:-28.28,-11.16,-110.43:99
-chr1 981845 rs2710885 T C 325.46 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=29.31;MQ=55.32;MQ0=0;QD=7.75;SB=-95.70 GT:AD:DP:GL:GQ 0/1:24,18:34:-46.08,-10.25,-78.60:99
-chr1 981905 rs3121564 C T 503.25 Indel AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=56.07;MQ0=0;QD=13.24;SB=-230.23 GT:AD:DP:GL:GQ 0/1:19,19:34:-63.86,-10.25,-57.54:99
-chr1 981947 rs2710886 T C 139.57 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=57.30;MQ0=0;OQ=454.51;QD=9.88;SB=-191.43 GT:AD:DP:GL:GQ 0/1:25,21:45:-62.31,-13.57,-94.53:99
-chr1 981957 rs2799074 T C 39.32 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=57.39;MQ0=0;OQ=362.93;QD=6.48;SB=-127.51 GT:AD:DP:GL:GQ 0/1:32,23:44:-52.84,-13.27,-101.58:99
-chr1 982190 rs2245754 C T 115.77 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=56.87;MQ0=0;OQ=667.97;QD=12.60;SB=-322.42 GT:AD:DP:GL:GQ 0/1:29,24:49:-84.84,-14.76,-98.05:99
-chr1 982682 rs9331226 G A 139.28 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=47.23;MQ0=0;OQ=1563.99;QD=20.85;SB=-791.90 GT:AD:DP:GL:GQ 0/1:29,46:74:-181.97,-22.29,-107.08:99
-chr1 983223 rs13303240 C A 201.17 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.32;MQ0=0;OQ=838.66;QD=15.82;SB=-290.67 GT:AD:DP:GL:GQ 0/1:25,28:52:-102.82,-15.67,-74.49:99
-chr1 984254 rs2488991 G T 204.10 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=58.59;MQ0=0;OQ=458.34;QD=13.89;SB=-201.49 GT:AD:DP:GL:GQ 0/1:13,19:30:-58.16,-9.04,-45.43:99
-chr1 985344 rs9442393 T G 429.35 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=599.53;QD=14.99;SB=-298.50 GT:AD:DP:GL:GQ 0/1:18,22:39:-74.98,-11.75,-60.16:99
-chr1 987271 rs28397086 T C 29.44 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.90;MQ0=0;OQ=513.69;QD=32.11;SB=-117.05 GT:AD:DP:GL:GQ 1/1:0,16:15:-54.96,-4.52,-0.01:45.13
-chr1 988258 rs7526076 A G 181.81 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.56;MQ0=0;OQ=852.42;QD=16.08;SB=-332.31 GT:AD:DP:GL:GQ 0/1:24,29:52:-104.19,-15.67,-91.85:99
-chr1 988445 rs3813194 G C 229.28 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.48;MQ0=0;OQ=676.17;QD=16.90;SB=-324.02 GT:AD:DP:GL:GQ 0/1:19,21:38:-82.36,-11.46,-78.97:99
-chr1 990019 rs11584349 C T 5.80 PASS AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=221.74;QD=18.48;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,7:12:-29.08,-3.62,-14.98:99
-chr1 991040 rs4970401 G C 199.01 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1348.36;QD=21.75;SB=-452.37 GT:AD:DP:GL:GQ 0/1:27,35:61:-156.51,-18.39,-101.07:99
-chr1 992297 rs11260596 C T 126.12 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.11;MQ0=0;OQ=235.14;QD=11.76;SB=-75.09 GT:AD:DP:GL:GQ 0/1:10,10:18:-32.23,-5.43,-30.14:99
-chr1 992795 rs4246502 C G 1.88 PASS AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.20;MQ0=0;OQ=331.32;QD=25.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,10:12:-40.03,-3.62,-11.85:82.27
-chr1 992916 rs4074992 C T 64.57 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.96;MQ0=0;OQ=236.09;QD=13.12;SB=-45.65 GT:AD:DP:GL:GQ 0/1:9,9:18:-32.32,-5.43,-28.25:99
-chr1 993492 rs4075116 C T 510.01 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=697.41;QD=15.16;SB=-277.76 GT:AD:DP:GL:GQ 0/1:23,23:43:-85.98,-12.96,-73.34:99
-chr1 994820 rs4073176 G A 10.79 PASS AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=141.42;QD=15.71;SB=-0.98 GT:AD:DP:GL:GQ 0/1:4,5:9:-20.14,-2.71,-13.80:99
-chr1 994843 rs4073177 G A 1.13 PASS AC=1;AF=0.50;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=225.74;QD=20.52;SB=-3.99 GT:AD:DP:GL:GQ 0/1:4,7:11:-29.17,-3.31,-13.13:98.16
-chr1 995932 rs55918415 G A 129.98 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=57.98;MQ0=1;OQ=500.10;QD=13.89;SB=-124.09 GT:AD:DP:GL:GQ 0/1:20,16:33:-63.24,-9.94,-54.88:99
-chr1 996086 rs9442394 G A 160.48 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=2.17;MQ=59.51;MQ0=0;OQ=685.95;QD=14.59;SB=-304.81 GT:AD:DP:GL:GQ 0/1:25,22:45:-85.44,-13.56,-78.07:99
-chr1 996853 rs4326571 G A 22.99 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.32;MQ=58.90;MQ0=0;OQ=529.40;QD=13.93;SB=-35.65 GT:AD:DP:GL:GQ 0/1:21,17:38:-67.68,-11.45,-66.25:99
-chr1 999097 rs9442366 T C 69.15 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.30;MQ0=0;OQ=217.52;QD=6.59;SB=-81.95 GT:AD:DP:GL:GQ 0/1:21,12:31:-34.38,-9.34,-81.07:99
-chr1 999304 . G A 28.33 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=57.94;MQ0=0;OQ=327.19;QD=9.62;SB=-182.19 GT:AD:DP:GL:GQ 0/1:21,13:31:-45.35,-9.34,-65.26:99
-chr1 999341 rs9442367 G C 25.99 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=0.81;MQ=58.59;MQ0=0;OQ=590.30;QD=17.89;SB=-256.14 GT:AD:DP:GL:GQ 0/1:14,19:30:-71.37,-9.06,-48.75:99
-chr1 1000580 rs9442368 C T 47.69 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=4.96;MQ=54.71;MQ0=0;OQ=650.78;QD=15.49;SB=-262.79 GT:AD:DP:GL:GQ 0/1:21,21:39:-80.11,-11.75,-60.91:99
-chr1 1000958 rs11810785 A G 695.93 Indel AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=6;HaplotypeScore=2.96;MQ=54.24;MQ0=1;QD=26.77;SB=-339.63 GT:AD:DP:GL:GQ 1/1:0,26:21:-73.19,-6.33,-0.01:63.17
-chr1 1001394 . T C 34.95 LowQual AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=41.30;MQ0=1;QD=3.88;SB=-6.99 GT:AD:DP:GL:GQ 0/1:6,3:8:-9.19,-2.41,-20.53:67.78
-chr1 1001500 . A T 20.13 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=16.78;MQ0=8;QD=0.81;SB=-10.00 GT:AD:DP:GL:GQ 0/1:19,5:9:-8.01,-2.72,-22.07:52.92
-chr1 1002064 . G C 10.08 LowQual AC=1;AF=0.50;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.77;MQ0=0;QD=5.04;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,1:1:-4.25,-0.30,-0.00:1.76
-chr1 1002464 . A T 1.23 PASS AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=18.46;MQ0=3;OQ=57.47;QD=3.59;SB=-37.37 GT:AD:DP:GL:GQ 0/1:8,7:4:-10.24,-1.21,-3.80:25.95
-chr1 1002488 . A T 34.11 LowQual AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=7.23;MQ=19.96;MQ0=3;QD=2.27;SB=-4.00 GT:AD:DP:GL:GQ 0/1:9,6:4:-7.90,-1.21,-5.60:43.89
-chr1 1002494 . A T 35.11 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=19.72;MQ0=3;QD=2.51;SB=-7.00 GT:AD:DP:GL:GQ 0/1:7,7:3:-7.70,-0.90,-3.30:23.95
-chr1 1002516 . G A 46.02 LowQual AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=18.44;MQ0=1;QD=4.60;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,5:2:-8.01,-0.60,-0.00:6.02
-chr1 1002856 . T G 12.29 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.33;MQ0=1;OQ=106.33;QD=5.32;SB=-21.95 GT:AD:DP:GL:GQ 0/1:10,10:13:-17.84,-3.92,-27.80:99
-chr1 1003100 . C T 26.46 LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=39.70;MQ0=0;QD=2.65;SB=-3.99 GT:AD:DP:GL:GQ 0/1:8,2:6:-7.74,-1.81,-13.13:59.28
-chr1 1003243 . G C 4.11 PASS AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.94;MQ=27.95;MQ0=9;OQ=330.47;QD=13.77;SB=-94.94 GT:AD:DP:GL:GQ 1/1:14,10:9:-36.64,-2.72,-0.01:27.09
-chr1 1003514 . C A 42.25 LowQual AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.30;MQ0=1;QD=7.04;SB=-46.39 GT:AD:DP:GL:GQ 1/1:0,6:2:-7.63,-0.60,-0.00:6.02
-chr1 1003557 . T A 0.08 PASS AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=5.02;MQ=17.13;MQ0=14;OQ=71.49;QD=2.98;SB=-43.38 GT:AD:DP:GL:GQ 0/1:21,3:4:-11.64,-1.20,-3.64:24.35
-chr1 1003864 . G C 10.99 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=9.87;MQ=5.60;MQ0=15;QD=0.58;SB=-10.00 GT:AD:DP:GL:GQ 0/1:17,2:1:-4.35,-0.30,-0.00:1.76
-chr1 1004168 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=12.18;MQ=19.95;MQ0=11;OQ=53.86;QD=2.56;SB=-37.95 GT:AD:DP:GL:GQ 0/1:14,6:6:-10.48,-1.81,-11.22:86.70
-chr1 1004254 . G C 33.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=6.90;MQ=13.09;MQ0=11;QD=1.32;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,12:4:-7.80,-1.21,-8.59:65.89
-chr1 1004313 . G C 21.04 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=11.38;MQ0=14;QD=0.84;SB=-3.98 GT:AD:DP:GL:GQ 0/1:23,2:6:-7.19,-1.81,-17.58:53.84
-chr1 1004699 rs12401605 A G 193.45 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=54.82;MQ0=0;OQ=256.92;QD=8.56;SB=-154.32 GT:AD:DP:GL:GQ 0/1:17,12:28:-37.42,-8.44,-63.53:99
-chr1 1004727 rs12411041 T A 29.53 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=54.35;MQ0=0;OQ=225.92;QD=6.11;SB=-72.06 GT:AD:DP:GL:GQ 0/1:25,11:32:-35.52,-9.65,-76.83:99
-chr1 1004989 rs36027499 A G 65.38 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=54.55;MQ0=0;OQ=184.41;QD=7.38;SB=-109.60 GT:AD:DP:GL:GQ 0/1:16,9:24:-28.96,-7.24,-58.60:99
-chr1 1005120 rs9442369 A G 5.28 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=59.36;MQ0=0;OQ=146.76;QD=4.08;SB=-64.75 GT:AD:DP:GL:GQ 0/1:26,10:34:-28.21,-10.25,-99.59:99
-chr1 1005414 rs9442370 C T 185.20 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.23;MQ0=0;OQ=413.23;QD=13.77;SB=-165.25 GT:AD:DP:GL:GQ 0/1:14,16:26:-52.45,-7.84,-38.57:99
-chr1 1005680 rs12746483 G A 50.56 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=2.06;MQ=55.16;MQ0=0;OQ=462.98;QD=16.54;SB=-241.55 GT:AD:DP:GL:GQ 0/1:13,15:28:-58.02,-8.44,-44.58:99
-chr1 1007033 rs3766193 C G 206.38 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=57.65;MQ0=0;OQ=606.89;QD=15.97;SB=-241.40 GT:AD:DP:GL:GQ 0/1:19,19:36:-74.82,-10.85,-77.35:99
-chr1 1007060 rs3766192 C T 263.39 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=59.03;MQ0=0;OQ=740.51;QD=17.22;SB=-335.87 GT:AD:DP:GL:GQ 0/1:19,24:42:-90.01,-12.67,-54.97:99
-chr1 1007204 rs1133647 G T 220.81 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.63;MQ0=0;OQ=352.30;QD=10.36;SB=-144.83 GT:AD:DP:GL:GQ 0/1:20,14:34:-48.76,-10.25,-68.42:99
-chr1 1008007 rs9442395 T C 79.76 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.17;MQ=58.20;MQ0=0;OQ=515.12;QD=11.71;SB=-260.59 GT:AD:DP:GL:GQ 0/1:23,21:43:-67.76,-12.96,-87.04:99
-chr1 1008425 rs9442371 C T 263.64 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.95;MQ0=0;OQ=629.69;QD=14.31;SB=-217.52 GT:AD:DP:GL:GQ 0/1:24,20:39:-78.01,-11.76,-59.01:99
-chr1 1008567 rs9442372 A G 252.74 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.72;MQ=58.97;MQ0=0;OQ=538.45;QD=11.97;SB=-254.34 GT:AD:DP:GL:GQ 0/1:20,24:42:-69.79,-12.66,-79.04:99
-chr1 1009038 rs2298215 C G 217.10 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=687.91;QD=14.95;SB=-237.07 GT:AD:DP:GL:GQ 0/1:26,20:46:-85.94,-13.87,-107.64:99
-chr1 1009043 rs9442396 T C 432.81 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=537.22;QD=11.94;SB=-291.59 GT:AD:DP:GL:GQ 0/1:24,21:42:-69.65,-12.65,-93.39:99
-chr1 1010269 rs9442397 T C 3.22 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.96;MQ=59.38;MQ0=0;OQ=202.19;QD=5.46;SB=-53.82 GT:AD:DP:GL:GQ 0/1:25,12:35:-34.05,-10.54,-100.39:99
-chr1 1011278 rs3737728 A G 36.30 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=58.01;MQ0=0;OQ=401.40;QD=7.72;SB=-209.34 GT:AD:DP:GL:GQ 0/1:32,20:49:-58.20,-14.77,-121.11:99
-chr1 1011558 rs9442398 A G 416.42 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.92;MQ0=0;OQ=544.78;QD=12.67;SB=-280.28 GT:AD:DP:GL:GQ 0/1:17,25:38:-69.23,-11.47,-56.30:99
-chr1 1011900 rs6701114 C T 240.77 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.30;MQ0=0;OQ=587.87;QD=17.81;SB=-314.84 GT:AD:DP:GL:GQ 0/1:13,20:30:-71.11,-9.04,-40.79:99
-chr1 1013307 rs9442399 C G 25.25 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=338.37;QD=37.60;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:9:-37.42,-2.71,-0.00:27.09
-chr1 1015133 . C T 6.55 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.91;MQ=59.48;MQ0=0;OQ=504.60;QD=11.47;SB=-145.62 GT:AD:DP:GL:GQ 0/1:26,18:38:-65.20,-11.46,-67.24:99
-chr1 1015164 rs9442400 T C 212.54 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.61;MQ0=0;OQ=1416.80;QD=29.52;SB=-594.18 GT:AD:DP:GL:GQ 1/1:0,48:47:-145.32,-14.18,-0.06:99
-chr1 1016570 rs4074137 C A 81.77 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=60.00;MQ0=0;OQ=196.23;QD=6.33;SB=-112.43 GT:AD:DP:GL:GQ 0/1:22,9:30:-31.95,-9.04,-69.97:99
-chr1 1016664 rs4562563 T A 69.49 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=58.99;MQ0=0;OQ=428.33;QD=18.62;SB=-222.84 GT:AD:DP:GL:GQ 0/1:8,15:23:-53.05,-6.93,-28.44:99
-chr1 1021403 rs9651273 A G 292.85 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=648.57;QD=9.40;SB=-308.20 GT:AD:DP:GL:GQ 0/1:44,25:69:-88.92,-20.78,-180.93:99
-chr1 1022047 rs9651272 A G 123.66 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=59.58;MQ0=0;OQ=389.06;QD=8.84;SB=-195.60 GT:AD:DP:GL:GQ 0/1:25,19:42:-54.85,-12.66,-100.05:99
-chr1 1023862 rs4970353 C T 10.88 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=971.03;QD=16.18;SB=-472.48 GT:AD:DP:GL:GQ 0/1:30,30:59:-118.16,-17.77,-101.63:99
-chr1 1025668 rs12759295 G A 84.62 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=59.60;MQ0=0;OQ=2089.51;QD=36.03;SB=-522.67 GT:AD:DP:GL:GQ 1/1:0,58:54:-212.56,-16.27,-0.02:99
-chr1 1026680 rs61766341 T C 205.76 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=959.29;QD=13.51;SB=-415.84 GT:AD:DP:GL:GQ 0/1:32,39:68:-119.71,-20.50,-125.74:99
-chr1 1026910 rs12134754 C T 210.31 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.33;MQ0=0;OQ=1080.76;QD=17.43;SB=-366.87 GT:AD:DP:GL:GQ 0/1:30,32:60:-129.44,-18.08,-89.78:99
-chr1 1027893 . T A 15.04 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=20;HaplotypeScore=5.87;MQ=44.25;MQ0=4;QD=0.40;SB=32.13 GT:AD:DP:GL:GQ 0/1:33,5:23:-11.70,-6.93,-76.52:47.73
-chr1 1037844 rs11584392 G A 163.44 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.82;MQ0=0;OQ=608.74;QD=14.16;SB=-241.74 GT:AD:DP:GL:GQ 0/1:22,21:40:-76.22,-12.06,-65.82:99
-chr1 1043248 rs4970408 C T 441.42 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.36;MQ0=0;OQ=945.52;QD=17.51;SB=-425.94 GT:AD:DP:GL:GQ 0/1:25,29:54:-114.11,-16.27,-86.23:99
-chr1 1050037 rs7548798 C T 114.73 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=3.36;MQ=58.61;MQ0=0;OQ=733.89;QD=15.61;SB=-330.30 GT:AD:DP:GL:GQ 0/1:24,23:47:-90.84,-14.17,-83.86:99
-chr1 1050038 rs7556082 T C 10.07 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=4;HaplotypeScore=2.36;MQ=58.61;MQ0=0;OQ=528.95;QD=11.25;SB=-283.60 GT:AD:DP:GL:GQ 0/1:24,23:46:-70.05,-13.87,-95.38:99
-chr1 1050218 rs12567855 G C 18.84 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=1.10;MQ=59.48;MQ0=0;OQ=549.12;QD=15.25;SB=-150.55 GT:AD:DP:GL:GQ 0/1:19,17:33:-68.15,-9.95,-68.62:99
-chr1 1050923 . C G 38.31 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=7.12;MQ=59.57;MQ0=0;QD=0.71;SB=62.24 GT:AD:DP:GL:GQ 0/1:40,14:36:-17.98,-10.86,-134.66:71.15
-chr1 1051029 rs11807848 T C 153.72 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.10;MQ=60.00;MQ0=0;OQ=328.64;QD=9.39;SB=-171.94 GT:AD:DP:GL:GQ 0/1:21,14:34:-46.39,-10.24,-82.90:99
-chr1 1051657 rs34530354 A G 139.07 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.25;MQ0=0;OQ=341.50;QD=11.02;SB=-128.73 GT:AD:DP:GL:GQ 0/1:17,14:30:-46.47,-9.04,-63.98:99
-chr1 1051711 rs35207507 A G 157.75 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=57.36;MQ0=0;OQ=232.59;QD=9.30;SB=-75.78 GT:AD:DP:GL:GQ 0/1:12,13:22:-33.17,-6.63,-47.34:99
-chr1 1051888 rs9329411 A G 8.12 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=58.95;MQ0=0;OQ=307.14;QD=13.96;SB=-152.31 GT:AD:DP:GL:GQ 0/1:10,12:20:-40.02,-6.03,-35.33:99
-chr1 1052501 rs9442373 C A 218.78 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.03;MQ0=0;OQ=1229.67;QD=18.35;SB=-293.35 GT:AD:DP:GL:GQ 0/1:29,38:65:-145.84,-19.58,-78.11:99
-chr1 1052907 rs7545801 A G 1.69 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.49;MQ=60.00;MQ0=0;OQ=935.67;QD=29.24;SB=-247.57 GT:AD:DP:GL:GQ 1/1:0,32:30:-97.17,-9.04,-0.02:90.21
-chr1 1053104 rs4970413 G T 111.15 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=59.42;MQ0=0;OQ=637.82;QD=15.95;SB=-209.62 GT:AD:DP:GL:GQ 0/1:16,24:36:-77.92,-10.85,-38.08:99
-chr1 1053355 rs55945496 G A 154.74 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=58.97;MQ0=0;OQ=692.26;QD=15.38;SB=-240.56 GT:AD:DP:GL:GQ 0/1:24,21:40:-84.57,-12.06,-60.15:99
-chr1 1054398 rs6682475 G C 62.97 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=3.35;MQ=57.20;MQ0=0;OQ=522.88;QD=16.34;SB=-284.57 GT:AD:DP:GL:GQ 0/1:16,16:32:-65.22,-9.65,-67.94:99
-chr1 1054533 rs7547403 C G 0.36 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=4;HaplotypeScore=0.79;MQ=59.42;MQ0=0;OQ=1637.77;QD=40.94;SB=-672.45 GT:AD:DP:GL:GQ 1/1:0,40:39:-167.38,-11.75,-0.02:99
-chr1 1054665 rs2298216 T C 152.44 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=59.60;MQ0=0;OQ=1938.74;QD=34.01;SB=-772.11 GT:AD:DP:GL:GQ 1/1:0,57:57:-197.48,-17.17,-0.02:99
-chr1 1055159 rs4072537 T C 138.47 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.50;MQ0=0;OQ=1817.15;QD=30.80;SB=-665.83 GT:AD:DP:GL:GQ 1/1:0,59:56:-185.34,-16.89,-0.04:99
-chr1 1055460 rs9442357 C A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.04;HRun=20;HaplotypeScore=17.31;MQ=48.11;MQ0=2;OQ=1123.16;QD=23.90;SB=-311.46 GT:AD:DP:GL:GQ 1/1:9,36:37:-122.62,-11.15,-6.72:44.32
-chr1 1056122 rs4072496 G C 273.90 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=828.08;QD=31.85;SB=-146.57 GT:AD:DP:GL:GQ 1/1:0,26:22:-86.41,-6.64,-0.02:66.21
-chr1 1056145 rs10907181 A G 65.29 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=60.00;MQ0=0;OQ=849.61;QD=28.32;SB=-350.43 GT:AD:DP:GL:GQ 1/1:0,30:29:-88.58,-8.75,-0.04:87.15
-chr1 1056266 rs10907182 T C 152.84 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.47;MQ0=0;OQ=1343.61;QD=29.86;SB=-493.15 GT:AD:DP:GL:GQ 1/1:0,45:43:-137.99,-12.97,-0.04:99
-chr1 1056679 . A G 17.68 PASS AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.92;MQ0=0;OQ=622.64;QD=23.06;SB=-77.91 GT:AD:DP:GL:GQ 1/1:0,27:19:-65.86,-5.72,-0.01:57.16
-chr1 1056682 rs7513297 A G 4.15 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=33.92;MQ0=0;OQ=613.60;QD=22.73;SB=-73.89 GT:AD:DP:GL:GQ 1/1:0,27:19:-64.96,-5.73,-0.01:57.15
-chr1 1056691 rs7553878 C G 182.98 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.04;MQ0=0;OQ=986.57;QD=30.83;SB=-182.68 GT:AD:DP:GL:GQ 1/1:0,32:25:-102.26,-7.54,-0.01:75.24
-chr1 1056809 rs7513404 A G 1483.16 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=11.12;MQ=36.69;MQ0=3;QD=26.02;SB=-571.97 GT:AD:DP:GL:GQ 1/1:2,55:47:-151.94,-14.18,-0.04:99
-chr1 1056815 rs7513405 A G 1422.20 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=12.03;MQ=35.94;MQ0=3;QD=26.83;SB=-591.02 GT:AD:DP:GL:GQ 1/1:4,49:44:-145.84,-13.27,-0.03:99
-chr1 1056816 rs7516160 T C 1466.09 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=12.03;MQ=36.53;MQ0=3;QD=27.15;SB=-727.28 GT:AD:DP:GL:GQ 1/1:3,50:47:-150.24,-14.18,-0.04:99
-chr1 1057725 rs9442374 T G 13.34 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=58.50;MQ0=0;OQ=951.55;QD=30.70;SB=-471.37 GT:AD:DP:GL:GQ 1/1:0,31:29:-98.75,-8.74,-0.01:87.23
-chr1 1057728 rs9442358 A C 4.18 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.48;MQ=58.50;MQ0=0;OQ=931.22;QD=30.04;SB=-418.04 GT:AD:DP:GL:GQ 1/1:1,30:28:-96.72,-8.44,-0.02:84.22
-chr1 1059288 rs9442375 C A 11.97 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=37.62;MQ0=0;OQ=1307.51;QD=33.53;SB=-359.86 GT:AD:DP:GL:GQ 1/1:0,39:37:-134.35,-11.15,-0.01:99
-chr1 1059306 rs9442376 G A 317.82 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=30.41;MQ0=0;OQ=1189.43;QD=32.15;SB=-404.66 GT:AD:DP:GL:GQ 1/1:0,37:31:-122.54,-9.34,-0.01:93.30
-chr1 1059314 rs9442377 G A 1.90 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=29.14;MQ0=0;OQ=1298.78;QD=30.92;SB=-496.01 GT:AD:DP:GL:GQ 1/1:0,42:35:-133.48,-10.55,-0.02:99
-chr1 1059991 rs9442378 T G 44.61 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.34;MQ0=0;OQ=1111.12;QD=31.75;SB=-500.92 GT:AD:DP:GL:GQ 1/1:0,35:33:-114.71,-9.94,-0.02:99
-chr1 1060304 rs9442379 C T 128.73 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1793.65;QD=37.37;SB=-715.98 GT:AD:DP:GL:GQ 1/1:0,48:46:-182.96,-13.86,-0.01:99
-chr1 1060981 rs10907183 G C 289 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.17;MQ=58.88;MQ0=0;OQ=1986.90;QD=34.26;SB=-998.16 GT:AD:DP:GL:GQ 1/1:0,58:51:-202.32,-15.40,-0.05:99
-chr1 1061055 rs6604971 T C 165.65 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.35;MQ0=0;OQ=1959.28;QD=30.61;SB=-872.00 GT:AD:DP:GL:GQ 1/1:0,64:62:-199.57,-18.70,-0.06:99
-chr1 1062361 rs9442360 G C 41.74 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;QD=13.91;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-7.58,-0.60,-0.00:6.02
-chr1 1063812 . C A 39.60 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=20;HaplotypeScore=10.99;MQ=49.89;MQ0=1;QD=0.94;SB=53.19 GT:AD:DP:GL:GQ 0/1:34,7:30:-16.28,-9.04,-89.71:72.44
-chr1 1064433 . T C 21.13 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=43.11;MQ0=1;QD=1.11;SB=5.04 GT:AD:DP:GL:GQ 0/1:14,5:14:-9.62,-4.23,-37.37:53.93
-chr1 1064508 . A G 48.32 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=5;HaplotypeScore=5.11;MQ=25.52;MQ0=20;QD=0.93;SB=-10.00 GT:AD:DP:GL:GQ 0/1:42,6:27:-16.25,-8.14,-83.13:81.15
-chr1 1064534 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=5.91;MQ=22.24;MQ0=19;OQ=77.81;QD=1.62;SB=-10.00 GT:AD:DP:GL:GQ 0/1:26,22:23:-17.99,-6.93,-63.10:99
-chr1 1064544 . G A 18.70 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=9.26;MQ=23.84;MQ0=13;QD=0.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:39,3:23:-12.08,-6.93,-67.67:51.47
-chr1 1064666 . G A 28.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=17.49;MQ0=7;QD=1.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:19,2:4:-7.31,-1.21,-6.24:50.32
-chr1 1064676 . G A 32.25 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=15.31;MQ0=8;QD=1.61;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,4:3:-7.41,-0.90,-3.57:26.65
-chr1 1064678 . A G 13.68 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=15.31;MQ0=8;QD=0.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,5:3:-5.54,-0.90,-4.06:31.54
-chr1 1065083 . T G 0.75 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=13.28;MQ0=6;OQ=72.14;QD=8.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,7:3:-10.70,-0.90,-0.00:9.03
-chr1 1065545 . A T 15.58 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=6.82;MQ=15.84;MQ0=10;QD=0.78;SB=-20.32 GT:AD:DP:GL:GQ 0/1:16,4:8:-7.24,-2.41,-23.49:48.29
-chr1 1065754 . T G 10.50 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=26.23;MQ0=5;QD=0.50;SB=-7.00 GT:AD:DP:GL:GQ 0/1:10,11:9:-7.00,-2.71,-25.01:42.93
-chr1 1065788 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=4;HaplotypeScore=1.91;MQ=35.15;MQ0=3;OQ=426.85;QD=16.42;SB=-65.33 GT:AD:DP:GL:GQ 0/1:10,16:20:-52.00,-6.03,-21.27:99
-chr1 1065876 rs34294086 G T 14.09 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.05;MQ=16.68;MQ0=19;QD=0.25;SB=-0.98 GT:AD:DP:GL:GQ 0/1:47,10:18:-10.10,-5.43,-46.58:46.75
-chr1 1065896 rs34976191 A G 3.15 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=25.24;MQ0=16;OQ=221.06;QD=5.02;SB=-47.30 GT:AD:DP:GL:GQ 0/1:32,12:17:-30.51,-5.13,-29.81:99
-chr1 1065898 rs35853231 G A 14.06 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=25.42;MQ0=15;OQ=228.24;QD=5.43;SB=-22.49 GT:AD:DP:GL:GQ 0/1:33,9:15:-30.63,-4.52,-21.87:99
-chr1 1066927 rs4970357 C A 263.23 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=704.25;QD=32.01;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,22:21:-74.02,-6.32,-0.01:63.19
-chr1 1067825 rs55750860 C T 23.40 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.51;MQ=58.95;MQ0=0;OQ=1494.41;QD=37.36;SB=-613.01 GT:AD:DP:GL:GQ 1/1:0,40:39:-153.04,-11.75,-0.01:99
-chr1 1070149 rs1539638 G A 498.18 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1278.23;QD=37.59;SB=-657.67 GT:AD:DP:GL:GQ 1/1:0,34:33:-131.42,-9.94,-0.01:99
-chr1 1070766 . C G 0.10 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=47.59;MQ0=0;OQ=113.71;QD=2.58;SB=-2.32 GT:AD:DP:GL:GQ 0/1:34,9:39:-26.42,-11.76,-133.80:99
-chr1 1070768 . C T 0.13 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=46.93;MQ0=0;OQ=115.95;QD=2.64;SB=-32.19 GT:AD:DP:GL:GQ 0/1:34,10:38:-26.33,-11.45,-104.66:99
-chr1 1070788 rs1539637 G C 8.38 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=2.86;MQ=44.98;MQ0=0;OQ=574.54;QD=14.73;SB=-154.58 GT:AD:DP:GL:GQ 0/1:22,17:37:-71.91,-11.17,-77.14:99
-chr1 1070790 rs4512588 T C 118.97 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.33;MQ=44.52;MQ0=0;OQ=439.51;QD=11.57;SB=-120.73 GT:AD:DP:GL:GQ 0/1:20,18:36:-58.08,-10.85,-73.14:99
-chr1 1070804 . T C 317.73 Indel AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=43.50;MQ0=0;QD=8.83;SB=-125.65 GT:AD:DP:GL:GQ 0/1:20,16:34:-45.31,-10.25,-78.50:99
-chr1 1070810 . T C 59.59 Indel AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=42.56;MQ0=0;QD=1.92;SB=-21.88 GT:AD:DP:GL:GQ 0/1:21,10:26:-17.08,-7.83,-82.36:92.43
-chr1 1070825 . C T 12.15 LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=46.99;MQ0=0;QD=0.45;SB=-5.49 GT:AD:DP:GL:GQ 0/1:24,3:26:-12.31,-7.84,-75.55:44.71
-chr1 1070828 . C T 17.92 LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=46.99;MQ0=0;QD=0.66;SB=-11.45 GT:AD:DP:GL:GQ 0/1:24,3:24:-12.30,-7.23,-73.32:50.69
-chr1 1074807 . T G 14.10 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=4;HaplotypeScore=1.72;MQ=58.59;MQ0=0;QD=0.43;SB=59.21 GT:AD:DP:GL:GQ 0/1:24,8:27:-12.81,-8.13,-82.30:46.77
-chr1 1075432 . C T 38.87 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=57.97;MQ0=0;OQ=818.81;QD=17.80;SB=-345.86 GT:AD:DP:GL:GQ 0/1:20,26:46:-99.04,-13.88,-63.69:99
-chr1 1077546 rs9442380 T C 202.60 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=2295.26;QD=29.81;SB=-1162.13 GT:AD:DP:GL:GQ 1/1:0,76:73:-233.18,-22.02,-0.07:99
-chr1 1079125 rs4970358 A G 12.32 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=5.70;MQ=59.35;MQ0=0;OQ=2374.58;QD=33.44;SB=-995.95 GT:AD:DP:GL:GQ 1/1:0,69:68:-244.00,-23.26,-2.96:99
-chr1 1079873 rs9442361 C A 5.87 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=1.89;MQ=53.07;MQ0=0;OQ=1204.88;QD=33.47;SB=-532.76 GT:AD:DP:GL:GQ 1/1:0,36:34:-124.08,-10.24,-0.01:99
-chr1 1080440 rs6604972 A G 531.63 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1807.70;QD=30.64;SB=-735.76 GT:AD:DP:GL:GQ 1/1:0,59:56:-184.40,-16.89,-0.04:99
-chr1 1082462 rs56863140 G C 99.95 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=146.93;QD=24.49;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:5:-18.26,-1.52,-0.01:15.05
-chr1 1084348 rs4970360 C T 64.65 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=58.41;MQ0=0;OQ=1613.83;QD=36.68;SB=-777.04 GT:AD:DP:GL:GQ 1/1:0,44:42:-164.99,-12.66,-0.02:99
-chr1 1084535 rs4970361 A C 88.25 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=58.78;MQ0=1;OQ=1424.16;QD=32.37;SB=-688.05 GT:AD:DP:GL:GQ 1/1:1,43:41:-146.01,-12.35,-0.01:99
-chr1 1084601 rs4970362 A G 229.75 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.53;MQ0=0;OQ=1464.98;QD=29.90;SB=-668.84 GT:AD:DP:GL:GQ 1/1:0,49:47:-150.13,-14.18,-0.04:99
-chr1 1084842 rs7538773 G A 9.80 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.13;MQ0=0;OQ=1279.59;QD=36.56;SB=-199.76 GT:AD:DP:GL:GQ 1/1:0,33:33:-131.55,-9.94,-0.01:99
-chr1 1085246 rs6604973 G A 85.72 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.42;MQ0=0;OQ=1511.71;QD=37.79;SB=-646.86 GT:AD:DP:GL:GQ 1/1:0,40:38:-154.76,-11.45,-0.01:99
-chr1 1085482 rs4970419 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=7;HaplotypeScore=2.24;MQ=59.45;MQ0=0;OQ=1670.84;QD=39.78;SB=-828.31 GT:AD:DP:GL:GQ 1/1:0,42:40:-170.69,-12.06,-0.02:99
-chr1 1085874 rs9442381 C G 314.67 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.11;MQ0=0;OQ=1195.39;QD=38.56;SB=-412.65 GT:AD:DP:GL:GQ 1/1:0,31:28:-123.13,-8.44,-0.01:84.28
-chr1 1086061 rs9442382 C T 139.37 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=990.01;QD=38.08;SB=-164.21 GT:AD:DP:GL:GQ 1/1:0,26:26:-102.60,-7.84,-0.01:78.25
-chr1 1086771 rs1539636 T C 148.49 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=60.00;MQ0=0;OQ=1262.30;QD=33.22;SB=-642.89 GT:AD:DP:GL:GQ 1/1:0,38:37:-129.83,-11.15,-0.02:99
-chr1 1086955 rs1539635 G A 48.48 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=56.37;MQ0=0;OQ=1687.66;QD=35.91;SB=-612.00 GT:AD:DP:GL:GQ 1/1:0,47:43:-172.36,-12.95,-0.01:99
-chr1 1086963 rs1539634 C T 83.45 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.95;MQ0=0;OQ=1761.33;QD=36.69;SB=-642.86 GT:AD:DP:GL:GQ 1/1:0,48:45:-179.73,-13.56,-0.02:99
-chr1 1087150 rs9442384 T C 36.04 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=59.81;MQ0=0;OQ=1429.90;QD=29.79;SB=-636.25 GT:AD:DP:GL:GQ 1/1:0,48:46:-146.63,-13.88,-0.05:99
-chr1 1087198 rs9442385 T G 89.37 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=57.84;MQ0=0;OQ=1240.37;QD=26.39;SB=-556.87 GT:AD:DP:GL:GQ 1/1:0,47:40:-127.66,-12.06,-0.04:99
-chr1 1087800 rs1891907 A G 2.98 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=57.36;MQ0=0;OQ=810.89;QD=32.44;SB=-193.80 GT:AD:DP:GL:GQ 1/1:0,25:24:-84.68,-7.23,-0.01:72.21
-chr1 1088284 rs12135382 C T 198.45 PASS AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=312.05;QD=28.37;SB=-50.56 GT:AD:DP:GL:GQ 1/1:0,11:9:-34.79,-2.71,-0.00:27.09
-chr1 1088577 rs4379629 C G 8.91 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=217.53;QD=24.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:7:-25.35,-2.12,-0.02:21.06
-chr1 1089205 rs9660710 A C 62.17 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=60.00;MQ0=0;OQ=1253.07;QD=26.66;SB=-477.88 GT:AD:DP:GL:GQ 1/1:0,47:40:-128.93,-12.06,-0.03:99
-chr1 1090080 rs1891905 C T 107.83 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.89;MQ0=0;OQ=1593.75;QD=37.95;SB=-678.31 GT:AD:DP:GL:GQ 1/1:0,42:41:-162.97,-12.35,-0.01:99
-chr1 1090182 rs1891904 C A 413.02 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=739.19;QD=30.80;SB=-375.45 GT:AD:DP:GL:GQ 1/1:0,24:22:-77.51,-6.63,-0.01:66.17
-chr1 1090866 rs7549819 C T 73.60 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=59.25;MQ0=0;OQ=998.72;QD=32.22;SB=-450.59 GT:AD:DP:GL:GQ 1/1:1,30:27:-103.47,-8.14,-0.02:81.25
-chr1 1091932 rs9442386 A G 1.23 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=172.84;QD=21.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:7:-20.87,-2.12,-0.01:21.04
-chr1 1093405 rs7518873 T C 57.10 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.77;MQ0=0;OQ=646.68;QD=30.79;SB=-268.71 GT:AD:DP:GL:GQ 1/1:0,21:20:-68.26,-6.03,-0.01:60.16
-chr1 1093821 rs7521584 T G 116.26 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.95;MQ0=0;OQ=1316.49;QD=29.92;SB=-587.88 GT:AD:DP:GL:GQ 1/1:0,44:43:-135.27,-12.96,-0.04:99
-chr1 1095101 rs9442362 T C 65.07 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=60.00;MQ0=0;OQ=375.39;QD=7.99;SB=-207.86 GT:AD:DP:GL:GQ 0/1:27,20:44:-54.09,-13.27,-100.76:99
-chr1 1095924 rs6656236 G A 130.43 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=57.77;MQ0=0;OQ=609.61;QD=16.04;SB=-273.30 GT:AD:DP:GL:GQ 0/1:18,20:34:-74.49,-10.25,-50.31:99
-chr1 1096647 rs4442317 T C 203.56 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=59.13;MQ0=0;OQ=506.89;QD=10.56;SB=-244.47 GT:AD:DP:GL:GQ 0/1:29,19:48:-68.44,-14.47,-111.87:99
-chr1 1114401 rs11577350 G A 483.74 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1009.34;QD=13.28;SB=-463.05 GT:AD:DP:GL:GQ 0/1:45,31:75:-126.83,-22.61,-139.35:99
-chr1 1114613 rs6702156 T C 467.81 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=978.73;QD=12.23;SB=-374.99 GT:AD:DP:GL:GQ 0/1:42,38:78:-124.66,-23.50,-162.90:99
-chr1 1127805 . C T 17.93 LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.76;MQ=47.96;MQ0=1;QD=0.48;SB=-4.44 GT:AD:DP:GL:GQ 0/1:29,6:21:-11.40,-6.33,-63.23:50.69
-chr1 1133298 rs55945303 G A 59.18 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=925.55;QD=21.52;SB=-252.58 GT:AD:DP:GL:GQ 0/1:14,29:40:-107.89,-12.05,-42.24:99
-chr1 1139524 rs35878953 C T 131.94 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=58.24;MQ0=0;OQ=799.98;QD=18.60;SB=-423.99 GT:AD:DP:GL:GQ 0/1:17,25:37:-94.44,-11.16,-36.66:99
-chr1 1148494 rs6603781 A G 136.52 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.05;MQ0=0;OQ=1330.48;QD=27.15;SB=-433.29 GT:AD:DP:GL:GQ 1/1:0,49:42:-136.66,-12.66,-0.03:99
-chr1 1149380 rs6702268 T C 227.72 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.80;MQ0=0;OQ=961.17;QD=27.46;SB=-122.75 GT:AD:DP:GL:GQ 1/1:0,35:31:-99.73,-9.35,-0.03:93.18
-chr1 1152189 rs4970423 A G 15.48 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.39;MQ0=0;OQ=1088.52;QD=28.65;SB=-378.40 GT:AD:DP:GL:GQ 1/1:0,38:34:-112.46,-10.25,-0.02:99
-chr1 1161280 rs6603782 C T 102.99 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=59.00;MQ0=0;OQ=708.75;QD=16.88;SB=-201.20 GT:AD:DP:GL:GQ 0/1:20,22:40:-86.21,-12.05,-64.42:99
-chr1 1162770 rs715643 C T 309.12 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.65;MQ0=0;OQ=561.34;QD=14.77;SB=-301.32 GT:AD:DP:GL:GQ 0/1:18,19:36:-70.27,-10.85,-55.47:99
-chr1 1171665 . C T 4.62 PASS AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.39;MQ0=0;OQ=105.76;QD=11.75;SB=-6.99 GT:AD:DP:GL:GQ 0/1:5,4:9:-16.57,-2.71,-16.65:99
-chr1 1178813 . G C 27.28 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=10.95;MQ=55.60;MQ0=0;QD=0.43;SB=74.28 GT:AD:DP:GL:GQ 0/1:46,17:41:-18.38,-12.37,-155.87:60.10
-chr1 1182131 . G A 44.09 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.04;HRun=20;HaplotypeScore=11.11;MQ=50.33;MQ0=0;QD=0.85;SB=65.22 GT:AD:DP:GL:GQ 0/1:38,12:42:-20.05,-12.36,-125.30:76.92
-chr1 1183574 . T C 30.78 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=5;HaplotypeScore=13.00;MQ=56.93;MQ0=0;QD=0.83;SB=23.10 GT:AD:DP:GL:GQ 0/1:22,15:21:-12.69,-6.33,-67.62:63.61
-chr1 1186726 rs6659787 T C 444.24 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1920.21;QD=33.11;SB=-425.81 GT:AD:DP:GL:GQ 1/1:0,58:55:-195.63,-16.57,-0.02:99
-chr1 1194535 . A G 16.67 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=6.08;MQ=52.52;MQ0=1;QD=0.32;SB=29.11 GT:AD:DP:GL:GQ 0/1:42,10:39:-16.70,-11.76,-128.34:49.41
-chr1 1204684 rs34258594 C T 26.14 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=41.53;MQ0=1;OQ=534.60;QD=15.27;SB=-99.92 GT:AD:DP:GL:GQ 0/1:16,19:32:-66.39,-9.65,-50.26:99
-chr1 1206810 . C A 15.67 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=59.17;MQ0=0;QD=0.56;SB=17.05 GT:AD:DP:GL:GQ 0/1:19,7:21:-11.17,-6.33,-52.97:48.38
-chr1 1212553 . C T 5.74 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=5.06;MQ=57.97;MQ0=0;OQ=298.13;QD=12.96;SB=-173.70 GT:AD:DP:GL:GQ 0/1:12,11:19:-38.83,-5.73,-27.23:99
-chr1 1213523 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=15.57;MQ=33.50;MQ0=4;OQ=59.03;QD=3.28;SB=2.04 GT:AD:DP:GL:GQ 0/1:9,9:9:-11.90,-2.71,-23.47:91.86
-chr1 1213617 . C T 7.11 PASS AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=18.72;MQ0=10;OQ=134.34;QD=6.72;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,15:4:-16.97,-1.20,-0.00:12.04
-chr1 1213622 . T C 11.33 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.30;MQ=19.74;MQ0=10;QD=0.49;SB=-3.98 GT:AD:DP:GL:GQ 0/1:20,3:7:-6.49,-2.11,-18.92:43.83
-chr1 1213635 . C T 23.33 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=18.06;MQ0=13;QD=0.75;SB=-33.62 GT:AD:DP:GL:GQ 0/1:24,7:9:-8.33,-2.71,-24.32:56.15
-chr1 1213653 . C T 47.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=17.89;MQ0=21;QD=1.00;SB=-23.48 GT:AD:DP:GL:GQ 0/1:37,11:13:-11.99,-3.92,-35.04:80.78
-chr1 1213671 . C T 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=22.77;MQ0=22;OQ=90.19;QD=1.80;SB=-17.46 GT:AD:DP:GL:GQ 0/1:28,22:20:-18.33,-6.03,-51.67:99
-chr1 1213694 . T C 39.97 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=2;HaplotypeScore=8.39;MQ=23.73;MQ0=21;QD=0.73;SB=-15.88 GT:AD:DP:GL:GQ 0/1:51,4:21:-13.61,-6.33,-64.53:72.80
-chr1 1213750 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=7.03;MQ=25.74;MQ0=11;OQ=59.44;QD=1.56;SB=-49.23 GT:AD:DP:GL:GQ 0/1:22,16:17:-14.35,-5.12,-45.82:92.28
-chr1 1213763 . C T 47.85 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.61;MQ0=8;QD=1.65;SB=-29.61 GT:AD:DP:GL:GQ 0/1:21,8:13:-11.99,-3.92,-33.55:80.68
-chr1 1213781 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=3.20;MQ=28.82;MQ0=7;OQ=70.59;QD=2.82;SB=-20.63 GT:AD:DP:GL:GQ 0/1:21,4:13:-14.26,-3.92,-34.86:99
-chr1 1213884 . C T 18.32 PASS AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=20.52;MQ0=9;OQ=123.88;QD=9.53;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,11:4:-15.92,-1.20,-0.00:12.04
-chr1 1213994 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=2;HaplotypeScore=2.99;MQ=9.42;MQ0=22;OQ=67.77;QD=1.94;SB=-42.68 GT:AD:DP:GL:GQ 0/1:31,4:4:-11.26,-1.21,-2.97:17.61
-chr1 1214386 . C T 18.53 PASS AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=12.80;MQ0=7;OQ=79.89;QD=6.15;SB=-52.67 GT:AD:DP:GL:GQ 1/1:3,10:3:-11.48,-0.90,-0.00:9.03
-chr1 1214538 . C T 13.99 PASS AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.76;MQ0=3;OQ=222.41;QD=22.24;SB=-119.99 GT:AD:DP:GL:GQ 1/1:1,9:7:-25.82,-2.11,-0.00:21.06
-chr1 1214556 . C T 78.88 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.62;MQ0=3;OQ=125.22;QD=13.91;SB=-42.55 GT:AD:DP:GL:GQ 1/1:2,7:4:-16.06,-1.21,-0.00:12.04
-chr1 1214569 . C T 4.09 PASS AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=21.21;MQ0=3;OQ=121.10;QD=17.30;SB=-81.10 GT:AD:DP:GL:GQ 1/1:3,4:4:-15.65,-1.21,-0.00:12.04
-chr1 1214849 . T C 10.83 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=11.01;MQ0=15;QD=0.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,8:6:-6.14,-1.81,-16.12:43.30
-chr1 1214919 . A T 0.53 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=20.32;MQ0=10;OQ=98.85;QD=4.94;SB=-69.74 GT:AD:DP:GL:GQ 0/1:10,9:7:-15.28,-2.11,-10.80:86.87
-chr1 1215102 . A T 1.26 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=20.59;MQ0=9;OQ=98.25;QD=4.91;SB=-47.98 GT:AD:DP:GL:GQ 0/1:4,16:7:-15.22,-2.11,-12.20:99
-chr1 1215147 . T C 24.78 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=2;HaplotypeScore=5.19;MQ=18.98;MQ0=32;QD=0.28;SB=-36.82 GT:AD:DP:GL:GQ 0/1:83,7:38:-17.21,-11.45,-127.57:57.61
-chr1 1215165 . C T 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=3.30;MQ=20.48;MQ0=21;OQ=101.26;QD=1.35;SB=26.10 GT:AD:DP:GL:GQ 0/1:48,27:30:-22.45,-9.04,-79.18:99
-chr1 1215324 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.60;MQ=26.05;MQ0=19;OQ=186.49;QD=2.49;SB=8.19 GT:AD:DP:GL:GQ 0/1:60,15:45:-35.50,-13.57,-130.76:99
-chr1 1227467 rs2296475 T C 67.24 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=59.44;MQ0=0;OQ=1380.81;QD=33.68;SB=-616.59 GT:AD:DP:GL:GQ 1/1:0,40:39:-141.68,-11.75,-0.01:99
-chr1 1227692 rs11586188 G A 13.68 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=60.00;MQ0=0;OQ=456.88;QD=14.74;SB=-204.92 GT:AD:DP:GL:GQ 0/1:15,16:30:-58.02,-9.04,-49.24:99
-chr1 1228900 . T C 25.48 LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=4;HaplotypeScore=1.75;MQ=56.48;MQ0=0;QD=0.75;SB=-20.62 GT:AD:DP:GL:GQ 0/1:26,7:28:-14.27,-8.44,-89.93:58.30
-chr1 1229202 rs11260584 T G 37.45 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=976.99;QD=27.91;SB=-499.87 GT:AD:DP:GL:GQ 1/1:0,35:32:-101.31,-9.64,-0.03:96.16
-chr1 1229816 rs10399878 A G 473.23 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1102.82;QD=26.90;SB=-522.83 GT:AD:DP:GL:GQ 1/1:0,41:37:-113.91,-11.17,-0.05:99
-chr1 1231392 rs1536168 A G 97.21 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.82;MQ0=0;OQ=1395.06;QD=27.90;SB=-606.94 GT:AD:DP:GL:GQ 1/1:0,50:45:-143.13,-13.57,-0.04:99
-chr1 1231663 rs3737720 A G 139.66 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=58.81;MQ0=0;OQ=1690.11;QD=30.73;SB=-679.26 GT:AD:DP:GL:GQ 1/1:0,55:50:-172.62,-15.06,-0.03:99
-chr1 1231766 rs3737719 C G 2.42 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.43;MQ=58.78;MQ0=0;OQ=1400.23;QD=36.85;SB=-370.18 GT:AD:DP:GL:GQ 1/1:0,38:34:-143.63,-10.26,-0.03:99
-chr1 1232078 rs4970431 A G 216.41 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1612.70;QD=32.91;SB=-685.61 GT:AD:DP:GL:GQ 1/1:0,49:46:-164.87,-13.86,-0.01:99
-chr1 1232570 rs2274262 A G 6.01 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=2.33;MQ=58.39;MQ0=0;OQ=927.22;QD=31.97;SB=-261.82 GT:AD:DP:GL:GQ 1/1:0,28:29:-99.47,-11.27,-3.16:81.12
-chr1 1232846 rs2887285 G A 7.05 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=60.00;MQ0=0;OQ=156.17;QD=26.03;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,5:5:-19.18,-1.51,-0.00:15.05
-chr1 1233759 rs61766198 C T 47.25 LowQual AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=23.62;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-8.13,-0.60,-0.00:6.02
-chr1 1235231 rs11590283 G A 557.67 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1461.68;QD=36.54;SB=-745.00 GT:AD:DP:GL:GQ 1/1:1,39:37:-149.76,-11.15,-0.01:99
-chr1 1235867 rs2296474 A G 712.67 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.51;MQ0=0;OQ=1812.39;QD=34.20;SB=-908.32 GT:AD:DP:GL:GQ 1/1:0,53:53:-184.85,-15.97,-0.02:99
-chr1 1237357 rs12103 T C 207.29 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=647.94;QD=29.45;SB=-286.45 GT:AD:DP:GL:GQ 1/1:0,22:21:-68.40,-6.33,-0.02:63.15
-chr1 1237452 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=10;HaplotypeScore=2.81;MQ=58.76;MQ0=0;OQ=54.80;QD=4.98;SB=-3.98 GT:AD:DP:GL:GQ 0/1:7,4:6:-10.58,-1.82,-11.64:87.64
-chr1 1239050 rs12142199 G A 66.55 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.62;MQ=58.97;MQ0=0;OQ=2440.21;QD=38.73;SB=-1144.03 GT:AD:DP:GL:GQ 1/1:1,62:62:-247.62,-18.68,-0.02:99
-chr1 1239352 . C G 26.31 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=58.82;MQ0=0;OQ=1214.59;QD=20.59;SB=-515.28 GT:AD:DP:GL:GQ 0/1:25,34:56:-141.62,-16.88,-95.25:99
-chr1 1242263 rs55998830 C T 160.41 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=57.24;MQ0=0;OQ=503.69;QD=12.29;SB=-134.60 GT:AD:DP:GL:GQ 0/1:23,18:39:-65.41,-11.76,-71.08:99
-chr1 1243999 rs4970432 G A 36.99 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=58.63;MQ0=0;OQ=2692.59;QD=39.60;SB=-1179.08 GT:AD:DP:GL:GQ 1/1:0,68:67:-272.86,-20.18,-0.01:99
-chr1 1244299 rs1886773 A G 203.79 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.11;MQ0=0;OQ=1463.44;QD=28.14;SB=-748.56 GT:AD:DP:GL:GQ 1/1:0,52:48:-149.98,-14.48,-0.05:99
-chr1 1244306 rs1886772 G A 170.95 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=58.89;MQ0=0;OQ=2428.21;QD=38.54;SB=-1150.05 GT:AD:DP:GL:GQ 1/1:0,63:62:-246.42,-18.68,-0.02:99
-chr1 1244704 rs10907179 C G 226.16 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=2474.22;QD=40.56;SB=-1116.55 GT:AD:DP:GL:GQ 1/1:0,61:58:-251.03,-17.48,-0.03:99
-chr1 1245150 rs10449892 C T 372.09 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1031.28;QD=35.56;SB=-512.17 GT:AD:DP:GL:GQ 1/1:0,29:28:-106.73,-8.44,-0.02:84.26
-chr1 1247456 rs1810745 A G 110.17 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=54.75;MQ0=0;OQ=1043.28;QD=28.20;SB=-313.49 GT:AD:DP:GL:GQ 1/1:0,37:33:-107.94,-9.95,-0.02:99
-chr1 1256339 rs28704486 A G 29.57 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=16.01;MQ0=0;OQ=60.16;QD=4.63;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:3:-9.51,-0.90,-0.00:9.02
-chr1 1258710 rs307378 T G 2.23 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=76.83;QD=25.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:3:-11.17,-0.90,-0.00:9.03
-chr1 1259417 rs307377 T C 101.96 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=21.92;MQ0=3;OQ=105.39;QD=15.06;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:4:-14.07,-1.20,-0.00:12.04
-chr1 1260192 rs188647 A G 29.27 LowQual AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=14.64;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-6.34,-0.60,-0.00:6.01
-chr1 1260222 rs307374 T C 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=63.98;QD=21.33;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:3:-9.89,-0.91,-0.00:9.02
-chr1 1262360 rs307372 A G 1.31 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.52;MQ=35.06;MQ0=0;OQ=290.20;QD=24.18;SB=-151.34 GT:AD:DP:GL:GQ 1/1:0,12:11:-32.62,-3.32,-0.02:33.05
-chr1 1262979 rs307371 A G 118.35 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.17;MQ0=0;OQ=96.93;QD=24.23;SB=-72.91 GT:AD:DP:GL:GQ 1/1:0,4:4:-13.23,-1.21,-0.00:12.03
-chr1 1263141 rs307370 A G 373.13 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.14;MQ0=0;OQ=479.19;QD=34.23;SB=-188.41 GT:AD:DP:GL:GQ 1/1:0,14:14:-51.51,-4.22,-0.00:42.13
-chr1 1265154 rs11582808 G A 10.31 PASS AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=44.52;MQ0=0;OQ=273.35;QD=19.53;SB=-116.97 GT:AD:DP:GL:GQ 0/1:5,9:13:-34.54,-3.92,-12.73:88.15
-chr1 1266341 rs307364 T G 24.11 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=22.99;MQ0=5;OQ=64.81;QD=5.40;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,10:3:-9.97,-0.90,-0.00:9.02
-chr1 1267396 rs17854636 T C 111.78 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.81;MQ0=1;OQ=372.39;QD=23.27;SB=-142.72 GT:AD:DP:GL:GQ 1/1:0,16:13:-40.84,-3.92,-0.02:39.08
-chr1 1268100 rs307361 T C 193.77 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.78;MQ0=3;OQ=449.98;QD=25.00;SB=-194.71 GT:AD:DP:GL:GQ 1/1:0,18:15:-48.59,-4.52,-0.01:45.11
-chr1 1268888 rs307360 A G 2.79 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=29.77;MQ0=0;OQ=268.28;QD=26.83;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:9:-30.42,-2.71,-0.01:27.07
-chr1 1270382 rs307358 T C 22.61 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=83.45;QD=20.86;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,4:4:-11.88,-1.21,-0.01:12.02
-chr1 1276604 . G C 27.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.66;MQ=11.97;MQ0=10;QD=1.29;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,12:4:-7.20,-1.21,-7.49:59.88
-chr1 1276657 rs35104845 C T 49.02 PASS AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=23.40;MQ0=3;OQ=76.78;QD=6.98;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,5:3:-11.17,-0.90,-0.00:9.03
-chr1 1276684 rs61766214 G C 3.73 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=32.46;MQ0=2;OQ=374.70;QD=28.82;SB=-82.81 GT:AD:DP:GL:GQ 1/1:1,12:10:-41.06,-3.02,-0.01:30.10
-chr1 1276760 rs34380086 G C 256.91 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.61;MQ0=0;OQ=915.51;QD=35.21;SB=-194.53 GT:AD:DP:GL:GQ 1/1:0,26:24:-95.15,-7.24,-0.02:72.23
-chr1 1276990 rs56165241 G A 0.14 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=23.71;MQ0=1;OQ=124.88;QD=20.81;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:4:-16.02,-1.20,-0.00:12.04
-chr1 1278208 rs13249 A G 0.03 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=4;HaplotypeScore=0.79;MQ=29.00;MQ0=0;OQ=519.51;QD=34.63;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:15:-55.54,-4.52,-0.01:45.13
-chr1 1278334 rs3766183 C T 70.79 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=12.77;MQ0=25;OQ=129.88;QD=4.48;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,29:4:-16.52,-1.20,-0.00:12.04
-chr1 1279774 rs4970365 G A 205.12 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=37.02;MQ0=1;OQ=413.00;QD=27.53;SB=-81.33 GT:AD:DP:GL:GQ 1/1:0,15:12:-44.89,-3.62,-0.01:36.11
-chr1 1283627 rs34841888 G C 242.04 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=17.25;MQ0=18;OQ=165.64;QD=7.20;SB=-87.83 GT:AD:DP:GL:GQ 1/1:0,23:5:-20.13,-1.51,-0.00:15.05
-chr1 1284791 rs2649608 A G 15.70 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=325.53;QD=25.04;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:12:-36.15,-3.62,-0.02:36.07
-chr1 1285186 rs34389364 G A 48.74 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=44.84;MQ0=0;OQ=775.48;QD=28.72;SB=-269.63 GT:AD:DP:GL:GQ 1/1:0,25:23:-81.16,-6.94,-0.03:69.18
-chr1 1285266 rs34876581 T C 166.99 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=42.89;MQ0=0;OQ=1629.47;QD=31.95;SB=-823.96 GT:AD:DP:GL:GQ 1/1:0,51:47:-166.55,-14.16,-0.02:99
-chr1 1285545 rs61766236 A G 14.70 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=53.58;MQ0=0;OQ=756.88;QD=26.10;SB=-99.85 GT:AD:DP:GL:GQ 1/1:0,29:25:-79.29,-7.54,-0.02:75.15
-chr1 1285750 . T C 31.55 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=14.50;MQ0=6;QD=3.94;SB=-38.95 GT:AD:DP:GL:GQ 1/1:0,8:2:-6.56,-0.60,-0.00:6.01
-chr1 1286016 rs2765027 T G 82.17 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=481.12;QD=30.07;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:16:-51.71,-4.82,-0.01:48.07
-chr1 1286554 rs2765025 C G 315.48 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.90;MQ0=0;OQ=1204.51;QD=36.50;SB=-193.69 GT:AD:DP:GL:GQ 1/1:0,33:29:-124.04,-8.74,-0.01:87.29
-chr1 1286681 rs2765024 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=715.35;QD=35.77;SB=-192.69 GT:AD:DP:GL:GQ 1/1:0,20:18:-75.13,-5.42,-0.01:54.18
-chr1 1286922 rs35056373 G A 454.44 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.41;MQ0=1;OQ=1368.71;QD=34.22;SB=-459.59 GT:AD:DP:GL:GQ 1/1:0,40:36:-140.48,-10.85,-0.02:99
-chr1 1287079 rs2649611 A G 142 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.17;MQ0=0;OQ=99.93;QD=24.98;SB=-76.36 GT:AD:DP:GL:GQ 1/1:0,4:4:-13.53,-1.21,-0.00:12.03
-chr1 1287285 rs2765021 C T 19.52 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=27.13;MQ0=1;OQ=211.29;QD=26.41;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:6:-24.70,-1.81,-0.00:18.06
-chr1 1287346 . G A 32.26 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.41;MQ=19.54;MQ0=6;QD=3.23;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,5:4:-7.72,-1.21,-5.84:46.31
-chr1 1287498 rs34896744 G A 28.51 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=522.90;QD=37.35;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,14:14:-55.88,-4.22,-0.00:42.14
-chr1 1288153 . C T 10.16 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=6.84;MQ0=17;QD=0.56;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,3:1:-4.26,-0.30,-0.00:1.76
-chr1 1288274 rs4970439 C T 158.39 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.76;MQ0=1;OQ=198.94;QD=24.87;SB=-120.99 GT:AD:DP:GL:GQ 1/1:0,8:6:-23.47,-1.81,-0.00:18.06
-chr1 1288396 rs9700464 T G 39.49 LowQual AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.48;MQ0=3;QD=7.90;SB=-46.01 GT:AD:DP:GL:GQ 1/1:0,5:2:-7.36,-0.60,-0.00:6.02
-chr1 1288400 rs2477784 C T 45.25 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.37;MQ0=1;QD=15.08;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-7.93,-0.60,-0.00:6.02
-chr1 1288965 . T C 42.83 LowQual AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=3;HaplotypeScore=1.16;MQ=15.81;MQ0=3;QD=8.57;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,2:2:-7.69,-0.60,-0.00:6.02
-chr1 1288989 . G A 32 LowQual AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.68;MQ0=2;QD=8.00;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,2:2:-6.61,-0.60,-0.00:6.01
-chr1 1288993 . G A 39.02 LowQual AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.68;MQ0=2;QD=9.75;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,2:2:-7.31,-0.60,-0.00:6.02
-chr1 1289038 . G A 46.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=8.33;MQ0=16;QD=2.56;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,2:2:-8.01,-0.60,-0.00:6.02
-chr1 1289229 rs28368296 C T 48.25 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.08;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,2:2:-8.23,-0.60,-0.00:6.02
-chr1 1292190 . A C 28.74 DPFilter;HARD_TO_VALIDATE;Indel;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=31.67;MQ=32.93;MQ0=5;QD=1.44;SB=2.03 GT:AD:DP:GL:GQ 0/1:14,6:12:-9.77,-3.62,-33.18:61.57
-chr1 1292271 rs61766242 A G 18.08 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=30.84;MQ0=4;OQ=1066.32;QD=26.66;SB=-193.80 GT:AD:DP:GL:GQ 1/1:0,40:32:-110.23,-9.64,-0.01:96.27
-chr1 1292418 rs3104610 C T 418.78 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=45.84;MQ0=1;OQ=2220.73;QD=38.96;SB=-760.52 GT:AD:DP:GL:GQ 1/1:0,57:55:-225.67,-16.57,-0.01:99
-chr1 1297501 rs2649597 T C 2.48 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.11;MQ0=4;OQ=360.28;QD=22.52;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:12:-39.62,-3.62,-0.01:36.08
-chr1 1298491 rs2477775 A G 32.28 LowQual AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=16.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-6.64,-0.60,-0.00:6.02
-chr1 1298734 rs2649595 A T 1.65 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.11;MQ0=1;OQ=88.08;QD=22.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,4:3:-12.30,-0.90,-0.00:9.03
-chr1 1300531 rs2242398 A C 250.70 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.82;MQ0=0;OQ=470.94;QD=31.40;SB=-111.01 GT:AD:DP:GL:GQ 1/1:0,15:15:-50.69,-4.52,-0.01:45.12
-chr1 1300838 rs2649594 C T 51.73 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.25;MQ0=5;OQ=315.14;QD=22.51;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,14:9:-35.10,-2.71,-0.01:27.08
-chr1 1300941 rs2649592 G T 12.43 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.29;MQ0=5;OQ=256.28;QD=18.31;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,14:8:-29.21,-2.41,-0.00:24.07
-chr1 1302674 rs34582295 C T 6.04 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.06;MQ=25.59;MQ0=11;OQ=374.66;QD=16.29;SB=-144.64 GT:AD:DP:GL:GQ 1/1:0,23:11:-41.06,-3.32,-0.01:33.10
-chr1 1303447 rs11489820 G C 2.99 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=7.53;MQ0=41;OQ=125.53;QD=2.73;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,46:4:-16.09,-1.21,-0.00:12.04
-chr1 1304035 rs2477777 C T 175.22 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.74;MQ0=4;OQ=578.49;QD=28.92;SB=-248.33 GT:AD:DP:GL:GQ 1/1:0,20:15:-61.44,-4.52,-0.00:45.15
-chr1 1304333 rs2313135 T G 34.29 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.98;MQ0=4;QD=4.90;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,2:3:-7.61,-0.90,-3.34:24.36
-chr1 1304907 rs2368566 G A 186.02 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.16;MQ0=0;OQ=83.01;QD=27.67;SB=-45.55 GT:AD:DP:GL:GQ 1/1:0,3:3:-11.79,-0.90,-0.00:9.03
-chr1 1305206 rs2368565 G A 178.76 PASS AC=2;AF=1.00;AN=2;DB;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=123.88;QD=30.97;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,4:4:-15.92,-1.20,-0.00:12.04
-chr1 1305756 rs2454652 C T 47.02 LowQual AC=2;AF=1.00;AN=2;DB;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=23.51;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-8.11,-0.60,-0.00:6.02
-chr1 1306033 rs2649587 G A 6.56 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=34.70;MQ0=1;OQ=503.12;QD=31.45;SB=-129.67 GT:AD:DP:GL:GQ 1/1:0,16:14:-53.90,-4.22,-0.01:42.13
-chr1 1306331 rs2649586 A G 0.26 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=29.00;MQ0=0;OQ=293.94;QD=24.50;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,11:10:-32.98,-3.01,-0.01:30.07
-chr1 1307502 . C G 13.29 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=4.50;MQ0=24;QD=0.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:26,1:1:-4.59,-0.30,-0.00:1.76
-chr1 1307925 . G C 0.13 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=13.45;MQ0=29;OQ=83.85;QD=1.78;SB=-0.97 GT:AD:DP:GL:GQ 0/1:38,9:8:-14.08,-2.41,-22.17:99
-chr1 1307979 . T C 42.83 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=7.67;MQ0=16;QD=2.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:13,5:2:-7.69,-0.60,-0.00:6.02
-chr1 1308095 . C G 10.99 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.17;HRun=1;HaplotypeScore=14.74;MQ=6.41;MQ0=25;QD=0.38;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,4:1:-4.35,-0.30,-0.00:1.76
-chr1 1321841 . G T 47.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=20;HaplotypeScore=6.03;MQ=23.98;MQ0=9;QD=1.65;SB=-0.97 GT:AD:DP:GL:GQ 0/1:18,11:6:-9.89,-1.81,-11.27:80.77
-chr1 1323299 rs1240743 C A 6.63 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=38.33;MQ0=6;OQ=144.07;QD=3.27;SB=50.03 GT:AD:DP:GL:GQ 0/1:30,14:36:-28.54,-10.85,-84.17:99
-chr1 1332475 rs2275915 G C 24.94 PASS AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=31.54;MQ0=6;OQ=92.26;QD=5.77;SB=-43.44 GT:AD:DP:GL:GQ 0/1:8,8:10:-15.53,-3.02,-24.58:99
-chr1 1346911 . G A 0.08 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=8.57;MQ=40.33;MQ0=2;OQ=331.50;QD=8.72;SB=-7.00 GT:AD:DP:GL:GQ 0/1:22,16:33:-46.38,-9.94,-72.87:99
-chr1 1349702 . C A 0.66 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=5.78;MQ=19.45;MQ0=7;OQ=297.18;QD=9.29;SB=-141.76 GT:AD:DP:GL:GQ 0/1:14,17:13:-36.92,-3.92,-7.86:39.43
-chr1 1352746 rs58304223 G C 14.25 LowQual AC=1;AF=0.50;AN=2;DB;DP=1;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=14.25;SB=-10.00 GT:AD:DP:GL:GQ 0/1:0,1:1:-4.69,-0.30,-0.00:1.76
-chr1 1353363 . G T 42.81 LowQual AC=2;AF=1.00;AN=2;DP=2;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=37.00;MQ0=0;QD=21.40;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-7.69,-0.60,-0.00:6.02
-chr1 1355197 rs1781138 A G 15.22 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=39.89;MQ0=3;OQ=305.23;QD=16.96;SB=-38.95 GT:AD:DP:GL:GQ 1/1:0,18:10:-34.11,-3.01,-0.00:30.08
-chr1 1358462 rs1240703 A C 0.99 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=21.92;MQ0=3;OQ=100.91;QD=14.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:4:-13.63,-1.21,-0.00:12.03
-chr1 1358648 . C G 24.94 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=3;HaplotypeScore=2.70;MQ=19.30;MQ0=6;QD=1.19;SB=5.05 GT:AD:DP:GL:GQ 0/1:13,8:7:-7.89,-2.11,-21.96:57.76
-chr1 1377530 rs1781144 C G 16.31 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=20.51;MQ0=10;OQ=394.74;QD=19.74;SB=-103.85 GT:AD:DP:GL:GQ 1/1:0,20:10:-43.06,-3.01,-0.00:30.10
-chr1 1380491 . G A 10.40 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=6;HaplotypeScore=29.42;MQ=36.22;MQ0=8;QD=0.18;SB=26.07 GT:AD:DP:GL:GQ 0/1:33,26:17:-9.41,-5.13,-45.72:42.82
-chr1 1390605 rs1240723 T C 30.71 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.36;MQ=30.70;MQ0=2;OQ=239.92;QD=7.06;SB=-41.82 GT:AD:DP:GL:GQ 0/1:20,14:26:-35.12,-7.84,-56.30:99
-chr1 1390829 . C T 33.01 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=3;HaplotypeScore=8.88;MQ=28.73;MQ0=9;QD=1.00;SB=26.10 GT:AD:DP:GL:GQ 0/1:27,6:18:-12.01,-5.42,-52.81:65.84
-chr1 1394381 . T G 40.77 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=20.66;MQ0=17;QD=0.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:31,13:12:-10.98,-3.61,-30.75:73.61
-chr1 1398226 . C T 36.49 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=10.21;MQ0=21;QD=1.46;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,13:3:-7.84,-0.90,-3.10:21.92
-chr1 1410500 rs35871802 C T 116.85 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.49;MQ0=17;OQ=181.39;QD=6.05;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,18:11:-24.74,-3.31,-17.34:99
-chr1 1413144 . G A 12.73 PASS AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=22.29;MQ0=2;OQ=489.12;QD=14.82;SB=-131.14 GT:AD:DP:GL:GQ 0/1:17,16:30:-61.25,-9.05,-41.87:99
-chr1 1414249 . G C 31.95 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=2;HaplotypeScore=6.60;MQ=15.28;MQ0=13;QD=1.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,6:4:-7.69,-1.21,-7.60:63.89
-chr1 1423959 rs1781141 T G 30.05 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=21.23;MQ0=4;QD=1.58;SB=5.04 GT:AD:DP:GL:GQ 0/1:13,6:14:-10.50,-4.22,-40.36:62.88
-chr1 1424829 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=20;HaplotypeScore=5.78;MQ=28.83;MQ0=9;OQ=77.31;QD=1.98;SB=59.13 GT:AD:DP:GL:GQ 0/1:32,7:28:-19.45,-8.44,-75.28:99
-chr1 1424855 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=20;HaplotypeScore=4.13;MQ=29.08;MQ0=4;OQ=54.78;QD=1.96;SB=29.12 GT:AD:DP:GL:GQ 0/1:21,7:17:-13.88,-5.12,-48.25:87.62
-chr1 1425922 rs28755011 C T 122.75 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.56;MQ0=1;OQ=756.68;QD=16.45;SB=-222.92 GT:AD:DP:GL:GQ 0/1:21,25:43:-91.92,-12.96,-62.88:99
-chr1 1430132 rs3104609 A G 485.47 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.69;MQ0=1;OQ=1088.71;QD=31.11;SB=-534.36 GT:AD:DP:GL:GQ 1/1:0,35:33:-112.47,-9.94,-0.02:99
-chr1 1447936 rs3118507 A G 40.78 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=47.98;MQ0=0;OQ=209.16;QD=6.97;SB=-124.72 GT:AD:DP:GL:GQ 0/1:20,10:26:-32.03,-7.83,-67.04:99
-chr1 1450120 rs6603789 G C 0.59 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=28.41;MQ0=9;OQ=784.91;QD=23.09;SB=-55.93 GT:AD:DP:GL:GQ 1/1:6,28:20:-82.08,-6.03,-0.01:60.20
-chr1 1450953 rs3128345 A G 6.78 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=8.00;MQ=58.21;MQ0=0;OQ=533.48;QD=10.67;SB=-234.27 GT:AD:DP:GL:GQ 0/1:28,22:48:-71.10,-14.47,-106.23:99
-chr1 1457784 . T A 85.12 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.74;MQ0=0;OQ=950.58;QD=15.09;SB=-335.63 GT:AD:DP:GL:GQ 0/1:32,31:63:-117.32,-18.98,-122.45:99
-chr1 1458041 rs6694994 T C 138.18 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.26;MQ0=0;OQ=499.68;QD=12.19;SB=-117.64 GT:AD:DP:GL:GQ 0/1:20,21:38:-64.71,-11.46,-68.00:99
-chr1 1459409 rs3128344 G A 558.61 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.45;MQ0=0;OQ=1638.56;QD=37.24;SB=-778.68 GT:AD:DP:GL:GQ 1/1:0,43:42:-167.45,-12.65,-0.01:99
-chr1 1461502 . A C 42.07 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=57.05;MQ0=0;QD=2.63;SB=14.06 GT:AD:DP:GL:GQ 0/1:8,8:12:-11.11,-3.62,-27.42:74.90
-chr1 1461910 rs3118505 C T 45.13 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=58.35;MQ0=0;OQ=649.92;QD=17.57;SB=-339.91 GT:AD:DP:GL:GQ 0/1:17,20:34:-78.52,-10.25,-48.35:99
-chr1 1462403 rs1571148 T G 289.59 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=414.06;QD=9.41;SB=-126.87 GT:AD:DP:GL:GQ 0/1:27,17:41:-57.04,-12.35,-89.89:99
-chr1 1462736 rs4259576 T A 334.86 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=60.00;MQ0=0;OQ=380.45;QD=11.19;SB=-195.57 GT:AD:DP:GL:GQ 0/1:20,14:33:-51.27,-9.94,-69.97:99
-chr1 1464030 rs1571149 A G 400.49 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=649.88;QD=11.01;SB=-311.08 GT:AD:DP:GL:GQ 0/1:30,29:55:-84.85,-16.58,-112.84:99
-chr1 1464167 rs1571150 C A 91.13 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.52;MQ0=0;OQ=665.06;QD=17.05;SB=-221.93 GT:AD:DP:GL:GQ 0/1:16,23:39:-81.54,-11.75,-55.47:99
-chr1 1464327 rs56239289 T C 341.41 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=731.44;QD=11.99;SB=-372.97 GT:AD:DP:GL:GQ 0/1:31,30:58:-93.91,-17.48,-117.75:99
-chr1 1464734 rs9439465 G C 86.71 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=410.54;QD=15.21;SB=-187.22 GT:AD:DP:GL:GQ 0/1:13,14:25:-51.89,-7.55,-46.69:99
-chr1 1468557 rs55694463 C G 72.40 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.11;MQ0=0;OQ=367.44;QD=14.13;SB=-116.67 GT:AD:DP:GL:GQ 0/1:13,13:22:-46.66,-6.63,-46.00:99
-chr1 1468920 rs61777888 A T 11.23 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=40.58;MQ0=0;QD=1.12;SB=2.00 GT:AD:DP:GL:GQ 0/1:8,2:6:-6.19,-1.81,-11.86:43.73
-chr1 1471211 rs3766177 T C 144.43 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=59.42;MQ0=0;OQ=424.79;QD=8.50;SB=-61.74 GT:AD:DP:GL:GQ 0/1:28,22:46:-59.63,-13.86,-111.57:99
-chr1 1472873 rs7517401 G A 289.79 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=59.55;MQ0=0;OQ=742.89;QD=14.57;SB=-367.87 GT:AD:DP:GL:GQ 0/1:27,24:48:-92.05,-14.47,-78.97:99
-chr1 1474833 rs7515814 C G 227.61 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.23;MQ0=0;OQ=1418.95;QD=20.87;SB=-692.35 GT:AD:DP:GL:GQ 0/1:30,38:67:-165.38,-20.20,-121.41:99
-chr1 1476697 rs3128342 C A 175.56 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=1.77;MQ=59.37;MQ0=0;OQ=1038.77;QD=15.74;SB=-518.96 GT:AD:DP:GL:GQ 0/1:32,34:66:-127.04,-19.88,-111.54:99
-chr1 1478935 rs3930748 A G 131.03 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=57.35;MQ0=0;OQ=678.62;QD=14.44;SB=-210.49 GT:AD:DP:GL:GQ 0/1:18,29:41:-83.51,-12.36,-58.93:99
-chr1 1479484 rs11590038 T C 187.36 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=60.00;MQ0=0;OQ=498.05;QD=12.45;SB=-267.61 GT:AD:DP:GL:GQ 0/1:17,23:38:-64.56,-11.47,-62.93:99
-chr1 1479489 rs11588893 C T 162.61 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=60.00;MQ0=0;OQ=580.48;QD=15.69;SB=-263.76 GT:AD:DP:GL:GQ 0/1:17,20:34:-71.58,-10.25,-50.12:99
-chr1 1479533 rs7531530 C T 220.27 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=59.18;MQ0=1;OQ=444.32;QD=12.01;SB=-149.64 GT:AD:DP:GL:GQ 0/1:19,18:31:-57.07,-9.35,-49.87:99
-chr1 1479791 rs7366884 T C 122.14 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=816.32;QD=13.61;SB=-418.23 GT:AD:DP:GL:GQ 0/1:30,30:57:-102.08,-17.17,-116.37:99
-chr1 1479937 rs7366635 A G 20.12 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=59.07;MQ0=0;OQ=292.89;QD=6.51;SB=-136.53 GT:AD:DP:GL:GQ 0/1:30,15:42:-45.23,-12.66,-112.08:99
-chr1 1480024 rs3753332 A G 36.05 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.44;MQ0=0;OQ=490.38;QD=11.96;SB=-170.97 GT:AD:DP:GL:GQ 0/1:21,20:37:-63.47,-11.15,-78.00:99
-chr1 1480095 rs3753331 T C 462.82 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=783.79;QD=15.07;SB=-339.35 GT:AD:DP:GL:GQ 0/1:24,28:51:-97.03,-15.37,-89.70:99
-chr1 1480422 rs3820075 A G 268.84 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=768.88;QD=14.24;SB=-360.10 GT:AD:DP:GL:GQ 0/1:23,31:53:-96.15,-15.98,-92.13:99
-chr1 1480490 rs3753330 T A 237.50 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=615.93;QD=11.41;SB=-300.65 GT:AD:DP:GL:GQ 0/1:28,26:50:-79.94,-15.07,-101.11:99
-chr1 1480556 . C T 26.64 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.59;MQ0=0;OQ=854.85;QD=18.58;SB=-376.92 GT:AD:DP:GL:GQ 0/1:20,26:44:-102.04,-13.27,-56.58:99
-chr1 1481114 rs12048706 T C 201.19 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=57.91;MQ0=0;OQ=878.58;QD=11.87;SB=-292.17 GT:AD:DP:GL:GQ 0/1:36,38:70:-112.24,-21.10,-138.24:99
-chr1 1484218 rs3118509 T C 19.29 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1926.74;QD=28.76;SB=-881.49 GT:AD:DP:GL:GQ 1/1:0,67:60:-196.31,-18.09,-0.05:99
-chr1 1484946 rs6667347 G C 188.55 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.64;MQ0=0;OQ=1104.15;QD=17.25;SB=-384.86 GT:AD:DP:GL:GQ 0/1:33,31:63:-132.69,-18.99,-142.09:99
-chr1 1485056 rs3118508 A G 123.40 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.54;MQ0=0;OQ=1673.18;QD=28.36;SB=-768.59 GT:AD:DP:GL:GQ 1/1:0,59:54:-170.96,-16.29,-0.05:99
-chr1 1486871 rs3766170 T C 6.17 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=1.66;MQ=57.15;MQ0=0;OQ=440.82;QD=8.82;SB=-192.43 GT:AD:DP:GL:GQ 0/1:28,22:46:-61.23,-13.87,-105.72:99
-chr1 1488802 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=20;HaplotypeScore=27.79;MQ=52.29;MQ0=1;OQ=57.57;QD=0.82;SB=89.30 GT:AD:DP:GL:GQ 0/1:49,20:48:-23.51,-14.47,-151.88:90.40
-chr1 1489161 rs9439468 A G 111.48 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=56.25;MQ0=0;OQ=911.03;QD=16.56;SB=-250.50 GT:AD:DP:GL:GQ 0/1:21,34:50:-109.45,-15.06,-75.57:99
-chr1 1490804 rs6603791 A G 440.61 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=55.41;MQ0=0;OQ=778.85;QD=12.98;SB=-348.06 GT:AD:DP:GL:GQ 0/1:28,32:58:-98.65,-17.48,-110.76:99
-chr1 1490867 . C G 0.31 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=53.32;MQ0=0;OQ=206.00;QD=2.71;SB=-32.07 GT:AD:DP:GL:GQ 0/1:64,12:75:-46.49,-22.61,-271.24:99
-chr1 1490871 . A G 0.08 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=53.82;MQ0=0;OQ=220.05;QD=2.75;SB=-14.75 GT:AD:DP:GL:GQ 0/1:66,14:78:-48.79,-23.50,-263.73:99
-chr1 1490927 rs6656541 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=23.59;MQ=53.32;MQ0=0;OQ=1558.39;QD=20.51;SB=-788.78 GT:AD:DP:GL:GQ 0/1:23,53:74:-181.42,-22.29,-76.04:99
-chr1 1490930 rs12730242 C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=22.45;MQ=53.65;MQ0=0;OQ=417.53;QD=5.49;SB=-224.35 GT:AD:DP:GL:GQ 0/1:55,21:70:-66.13,-21.09,-238.86:99
-chr1 1490948 rs12742689 T C 0.19 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=53.98;MQ0=0;OQ=96.30;QD=1.23;SB=-34.35 GT:AD:DP:GL:GQ 0/1:66,12:72:-34.61,-21.70,-240.60:99
-chr1 1490950 rs12730248 C T 0.53 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=54.06;MQ0=0;OQ=172.01;QD=2.18;SB=-98.81 GT:AD:DP:GL:GQ 0/1:67,11:73:-45.59,-25.10,-225.19:99
-chr1 1491329 rs7543799 G A 29 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.33;MQ=58.37;MQ0=0;OQ=592.32;QD=13.16;SB=-320.34 GT:AD:DP:GL:GQ 0/1:24,21:38:-73.97,-11.45,-67.99:99
-chr1 1492958 rs7367692 G A 226.72 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=59.16;MQ0=0;OQ=759.07;QD=13.80;SB=-311.80 GT:AD:DP:GL:GQ 0/1:31,24:51:-94.56,-15.37,-89.99:99
-chr1 1492962 rs7364711 A C 163.84 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=59.20;MQ0=0;OQ=581.10;QD=10.02;SB=-270.86 GT:AD:DP:GL:GQ 0/1:35,23:56:-78.26,-16.87,-122.50:99
-chr1 1493671 rs11578409 C G 251.66 PASS AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=59.04;MQ0=0;OQ=1371.84;QD=13.45;SB=-443.87 GT:AD:DP:GL:GQ 0/1:57,45:96:-169.40,-28.93,-244.12:99
-chr1 1493791 rs7550471 G A 6.65 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=5.83;MQ=58.91;MQ0=0;OQ=1272.31;QD=21.21;SB=-593.09 GT:AD:DP:GL:GQ 0/1:20,38:56:-150.16,-19.64,-65.04:99
-chr1 1494423 rs7552586 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=6;HaplotypeScore=3.99;MQ=59.04;MQ0=0;OQ=1025.73;QD=12.36;SB=-469.22 GT:AD:DP:GL:GQ 0/1:45,38:80:-129.96,-24.11,-158.72:99
-chr1 1494904 rs6603792 T C 342.81 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=427.21;QD=9.94;SB=-158.94 GT:AD:DP:GL:GQ 0/1:24,19:43:-58.97,-12.96,-97.93:99
-chr1 1495118 rs6603793 C T 185.94 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.74;MQ0=0;OQ=1162.21;QD=15.92;SB=-407.71 GT:AD:DP:GL:GQ 0/1:38,35:73:-141.49,-21.99,-140.54:99
-chr1 1495830 rs7548959 C T 131.47 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=58.74;MQ0=0;OQ=1025.47;QD=14.65;SB=-444.99 GT:AD:DP:GL:GQ 0/1:38,32:69:-126.64,-20.81,-114.78:99
-chr1 1495898 rs7540231 G A 67.32 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=1.75;MQ=58.44;MQ0=0;OQ=3508.72;QD=37.73;SB=-1621.33 GT:AD:DP:GL:GQ 1/1:0,92:90:-349.87,-27.12,-0.03:99
-chr1 1497229 rs9439469 G A 187.99 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.17;MQ0=0;OQ=210.39;QD=8.42;SB=-10.00 GT:AD:DP:GL:GQ 0/1:17,8:25:-31.85,-7.53,-57.26:99
-chr1 1497775 rs61774865 A C 52.62 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.97;MQ0=0;OQ=260.15;QD=7.88;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,13:31:-38.64,-9.34,-70.58:99
-chr1 1498322 rs9439473 A G 18.83 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=56.11;MQ0=0;OQ=610.76;QD=13.57;SB=-249.32 GT:AD:DP:GL:GQ 0/1:21,24:44:-77.63,-13.27,-79.03:99
-chr1 1498506 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=5;HaplotypeScore=2.45;MQ=50.85;MQ0=0;OQ=161.89;QD=3.37;SB=24.24 GT:AD:DP:GL:GQ 0/1:38,10:40:-31.52,-12.05,-112.23:99
-chr1 1498508 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=15;HaplotypeScore=1.82;MQ=51.05;MQ0=0;OQ=196.72;QD=4.01;SB=27.81 GT:AD:DP:GL:GQ 0/1:38,11:41:-35.31,-12.36,-104.62:99
-chr1 1498897 rs7520996 T C 291.45 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=56.74;MQ0=0;OQ=1344.56;QD=17.46;SB=-662.63 GT:AD:DP:GL:GQ 0/1:31,46:75:-160.33,-22.59,-123.58:99
-chr1 1499019 rs7518083 A G 453.47 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.97;MQ0=0;OQ=1144.84;QD=14.49;SB=-308.25 GT:AD:DP:GL:GQ 0/1:39,40:76:-140.66,-22.89,-155.49:99
-chr1 1499688 rs6666293 A G 47.16 LowQual AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=1.90;MQ=53.03;MQ0=0;QD=6.74;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,3:5:-9.51,-1.51,-8.01:65.07
-chr1 1500664 rs7519837 C T 335.96 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=543.75;QD=13.59;SB=-294.78 GT:AD:DP:GL:GQ 0/1:21,19:39:-69.41,-11.75,-74.55:99
-chr1 1500967 rs7556282 G C 209.02 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=56.81;MQ0=0;OQ=874.72;QD=17.85;SB=-362.79 GT:AD:DP:GL:GQ 0/1:21,27:44:-104.04,-13.28,-69.73:99
-chr1 1501107 rs4590622 G A 74.70 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=35.43;MQ0=2;OQ=406.87;QD=8.30;SB=-78.55 GT:AD:DP:GL:GQ 0/1:30,19:38:-55.43,-11.46,-75.84:99
-chr1 1501178 rs4618908 T C 437.65 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.31;MQ0=1;OQ=645.96;QD=14.68;SB=-291.48 GT:AD:DP:GL:GQ 0/1:19,25:40:-79.93,-12.05,-65.32:99
-chr1 1504046 . C T 7.57 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=59.17;MQ0=0;OQ=1022.24;QD=18.25;SB=-279.21 GT:AD:DP:GL:GQ 0/1:26,30:52:-121.18,-15.67,-71.09:99
-chr1 1504960 rs9331751 T A 36.07 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=4.88;MQ=56.51;MQ0=1;OQ=1100.76;QD=14.11;SB=-360.40 GT:AD:DP:GL:GQ 0/1:39,39:73:-135.35,-21.99,-132.17:99
-chr1 1506133 rs9442407 C T 139.40 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=35.12;MQ0=12;OQ=825.82;QD=11.16;SB=-394.16 GT:AD:DP:GL:GQ 0/1:42,32:54:-102.14,-16.28,-92.88:99
-chr1 1509564 rs9442406 T C 136.95 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=56.80;MQ0=0;OQ=711.41;QD=13.42;SB=-198.20 GT:AD:DP:GL:GQ 0/1:27,26:51:-89.79,-15.37,-103.56:99
-chr1 1510588 rs28788874 C T 634.33 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.10;MQ0=1;OQ=2154.00;QD=35.90;SB=-1071.35 GT:AD:DP:GL:GQ 1/1:0,60:56:-219.01,-16.88,-0.03:99
-chr1 1510832 rs6666084 A G 27.92 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=29.16;MQ0=1;OQ=863.94;QD=22.15;SB=-357.32 GT:AD:DP:GL:GQ 1/1:0,34:29:-93.05,-11.63,-3.07:85.61
-chr1 1511143 rs6679999 C T 270.78 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.32;MQ0=0;OQ=967.03;QD=37.19;SB=-287.88 GT:AD:DP:GL:GQ 1/1:0,26:25:-100.30,-7.53,-0.01:75.24
-chr1 1511216 . T A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=40.83;MQ0=0;OQ=921.95;QD=25.61;SB=-124.48 GT:AD:DP:GL:GQ 0/1:7,29:35:-106.02,-10.55,-27.02:99
-chr1 1511668 rs4648786 A G 87.12 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=58.14;MQ0=0;OQ=1843.13;QD=31.78;SB=-498.18 GT:AD:DP:GL:GQ 1/1:0,58:57:-187.94,-17.18,-0.05:99
-chr1 1511869 rs4648787 C T 29.58 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.56;MQ=56.20;MQ0=1;OQ=2155.57;QD=37.82;SB=-1079.94 GT:AD:DP:GL:GQ 1/1:1,56:55:-219.17,-16.58,-0.02:99
-chr1 1511922 rs4648612 C T 25.92 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=42.53;MQ0=1;OQ=1102.46;QD=35.56;SB=-299.68 GT:AD:DP:GL:GQ 1/1:1,30:28:-113.84,-8.43,-0.01:84.28
-chr1 1512199 rs4648613 T C 554.79 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.33;MQ0=0;OQ=1584.81;QD=33.02;SB=-688.28 GT:AD:DP:GL:GQ 1/1:0,48:45:-162.08,-13.55,-0.01:99
-chr1 1512230 rs28809773 G A 465.17 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=52.87;MQ0=0;OQ=1755.99;QD=36.58;SB=-748.51 GT:AD:DP:GL:GQ 1/1:0,48:45:-179.20,-13.56,-0.01:99
-chr1 1512325 . G A 85.65 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=55.47;MQ0=0;OQ=776.49;QD=14.65;SB=-378.86 GT:AD:DP:GL:GQ 0/1:28,24:51:-96.30,-15.37,-89.39:99
-chr1 1512595 rs4366263 A G 19.23 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.13;MQ=56.40;MQ0=0;OQ=1310.46;QD=34.49;SB=-610.36 GT:AD:DP:GL:GQ 1/1:0,38:38:-134.64,-11.45,-0.01:99
-chr1 1512656 rs28778974 C T 131.47 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=49.50;MQ0=1;OQ=1426.66;QD=34.80;SB=-730.49 GT:AD:DP:GL:GQ 1/1:1,40:37:-146.26,-11.15,-0.01:99
-chr1 1512790 rs61774869 C T 40.58 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=48.67;MQ0=1;OQ=1682.46;QD=36.58;SB=-840.63 GT:AD:DP:GL:GQ 1/1:2,44:43:-171.84,-12.95,-0.01:99
-chr1 1513302 rs9725077 G A 148.03 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=48.17;MQ0=1;OQ=1464.10;QD=34.05;SB=-687.33 GT:AD:DP:GL:GQ 1/1:1,42:38:-150.01,-11.45,-0.01:99
-chr1 1514300 rs9442423 T C 34.69 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.59;MQ0=0;OQ=266.23;QD=6.83;SB=-0.97 GT:AD:DP:GL:GQ 0/1:24,15:34:-40.16,-10.25,-85.89:99
-chr1 1514394 . C T 901.86 Indel AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.65;MQ0=0;QD=14.78;SB=-128.11 GT:AD:DP:GL:GQ 0/1:33,28:59:-111.26,-17.79,-98.57:99
-chr1 1514734 rs9442403 A G 0.24 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=12.23;MQ=53.49;MQ0=0;OQ=367.70;QD=7.99;SB=-54.31 GT:AD:DP:GL:GQ 0/1:25,19:37:-51.21,-11.16,-85.57:99
-chr1 1514861 . A T 164.64 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.34;MQ0=0;OQ=646.82;QD=13.76;SB=-331.07 GT:AD:DP:GL:GQ 0/1:25,22:46:-81.82,-13.86,-91.60:99
-chr1 1515925 rs6681422 T C 152.90 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.53;MQ0=0;OQ=534.97;QD=11.15;SB=-174.52 GT:AD:DP:GL:GQ 0/1:23,25:43:-69.74,-12.96,-84.05:99
-chr1 1516662 rs12735276 A G 21.98 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.05;MQ=57.32;MQ0=1;OQ=2133.75;QD=30.05;SB=-1092.47 GT:AD:DP:GL:GQ 1/1:2,69:66:-217.02,-19.91,-0.06:99
-chr1 1516946 rs10157140 T C 503.19 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.65;MQ0=0;OQ=1116.09;QD=14.69;SB=-475.23 GT:AD:DP:GL:GQ 0/1:37,39:76:-137.79,-22.90,-145.96:99
-chr1 1517815 . T C 151.98 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.19;MQ0=0;OQ=718.93;QD=11.41;SB=-330.87 GT:AD:DP:GL:GQ 0/1:32,31:61:-93.57,-18.39,-126.83:99
-chr1 1518089 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=19;HaplotypeScore=19.37;MQ=53.15;MQ0=1;OQ=397.54;QD=5.76;SB=50.30 GT:AD:DP:GL:GQ 0/1:45,23:60:-60.81,-17.78,-147.22:99
-chr1 1518109 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.01;HRun=19;HaplotypeScore=9.39;MQ=51.76;MQ0=1;OQ=216.06;QD=2.63;SB=62.19 GT:AD:DP:GL:GQ 0/1:54,27:58:-42.07,-17.18,-142.92:99
-chr1 1518112 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=77;Dels=0.01;HRun=4;HaplotypeScore=9.55;MQ=51.62;MQ0=1;OQ=92.02;QD=1.20;SB=65.18 GT:AD:DP:GL:GQ 0/1:56,20:51:-27.56,-15.07,-144.06:99
-chr1 1518863 rs12725297 G C 139.44 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=58.84;MQ0=0;OQ=1568.02;QD=18.67;SB=-365.83 GT:AD:DP:GL:GQ 0/1:39,45:81:-184.49,-24.41,-167.76:99
-chr1 1518975 rs12725449 G C 178.35 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.97;MQ0=0;OQ=2276.77;QD=38.59;SB=-1002.01 GT:AD:DP:GL:GQ 1/1:0,59:56:-231.29,-16.89,-0.03:99
-chr1 1519320 rs28566709 T C 64.56 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=59.59;MQ0=0;OQ=477.78;QD=8.53;SB=-190.61 GT:AD:DP:GL:GQ 0/1:33,23:51:-66.44,-15.38,-114.90:99
-chr1 1519374 rs28662991 T C 77.77 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.56;MQ0=0;OQ=635.95;QD=12.23;SB=-285.60 GT:AD:DP:GL:GQ 0/1:29,23:51:-82.25,-15.37,-108.55:99
-chr1 1519813 rs28503881 A G 211.45 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.02;MQ0=0;OQ=531.98;QD=8.58;SB=-234.91 GT:AD:DP:GL:GQ 0/1:35,27:58:-73.97,-17.49,-134.84:99
-chr1 1519842 rs4648788 T C 59.76 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=56.83;MQ0=0;OQ=1829.71;QD=27.72;SB=-554.05 GT:AD:DP:GL:GQ 1/1:0,66:57:-186.60,-17.18,-0.04:99
-chr1 1519857 . G C 3.15 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=5.53;MQ=56.98;MQ0=0;OQ=985.46;QD=15.64;SB=-338.06 GT:AD:DP:GL:GQ 0/1:28,35:57:-119.03,-17.20,-116.72:99
-chr1 1519861 rs28689700 C G 213.40 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=56.88;MQ0=0;OQ=841.97;QD=13.80;SB=-287.94 GT:AD:DP:GL:GQ 0/1:30,31:57:-104.69,-17.21,-125.41:99
-chr1 1520060 rs4648789 A C 15.22 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=4;HaplotypeScore=1.27;MQ=50.71;MQ0=0;OQ=838.47;QD=14.46;SB=-329.82 GT:AD:DP:GL:GQ 0/1:26,32:54:-103.41,-16.28,-79.25:99
-chr1 1520063 rs4648790 C T 336.83 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=51.65;MQ0=0;OQ=926.60;QD=15.19;SB=-418.36 GT:AD:DP:GL:GQ 0/1:30,31:60:-114.03,-18.08,-107.59:99
-chr1 1520195 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.02;HRun=0;HaplotypeScore=46.04;MQ=50.13;MQ0=3;OQ=55.61;QD=0.49;SB=110.40 GT:AD:DP:GL:GQ 0/1:96,14:92:-36.27,-27.42,-356.52:88.45
-chr1 1520222 . G A 94.09 SnpCluster AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=77.51;MQ=46.35;MQ0=0;QD=0.80;SB=-48.89 GT:AD:DP:GL:GQ 0/1:102,15:106:-44.62,-31.93,-348.40:99
-chr1 1520225 . G C 344.68 SnpCluster AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=69.75;MQ=44.94;MQ0=0;QD=2.92;SB=-153.13 GT:AD:DP:GL:GQ 0/1:100,18:110:-70.90,-33.15,-412.65:99
-chr1 1520229 . C G 412.05 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=94.26;MQ=43.35;MQ0=0;QD=3.41;SB=-151.44 GT:AD:DP:GL:GQ 0/1:103,18:106:-76.44,-31.95,-372.75:99
-chr1 1520237 . G C 91.10 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=128;Dels=0.05;HRun=0;HaplotypeScore=131.86;MQ=42.98;MQ0=0;QD=0.71;SB=13.51 GT:AD:DP:GL:GQ 0/1:106,16:113:-45.55,-33.15,-430.26:99
-chr1 1520238 rs61774873 T A 718.56 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.05;HRun=0;HaplotypeScore=125.70;MQ=43.01;MQ0=0;QD=5.75;SB=-75.62 GT:AD:DP:GL:GQ 0/1:71,41:100:-122.71,-47.57,-247.49:99
-chr1 1520243 . C G 225.05 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=118.32;MQ=42.36;MQ0=0;QD=1.77;SB=107.39 GT:AD:DP:GL:GQ 0/1:107,20:111:-59.26,-33.47,-404.28:99
-chr1 1520250 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=130;Dels=0.03;HRun=1;HaplotypeScore=70.65;MQ=43.20;MQ0=0;OQ=629.57;QD=4.84;SB=-297.59 GT:AD:DP:GL:GQ 0/1:85,37:107:-98.49,-32.25,-308.33:99
-chr1 1520281 rs61774874 G C 511.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=95.68;MQ=43.19;MQ0=0;QD=4.13;SB=-246.08 GT:AD:DP:GL:GQ 0/1:99,25:103:-85.52,-31.04,-362.79:99
-chr1 1520285 . G C 387.17 SnpCluster AC=1;AF=0.50;AN=2;DP=119;Dels=0.01;HRun=0;HaplotypeScore=65.61;MQ=43.42;MQ0=0;QD=3.25;SB=-155.15 GT:AD:DP:GL:GQ 0/1:98,20:100:-71.84,-29.84,-355.29:99
-chr1 1520289 rs62642589 C G 93.31 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=121;Dels=0.01;HRun=0;HaplotypeScore=35.98;MQ=43.17;MQ0=0;QD=0.77;SB=134.48 GT:AD:DP:GL:GQ 0/1:107,13:109:-45.17,-32.56,-411.19:99
-chr1 1520331 rs28654137 C G 48.96 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.01;HRun=0;HaplotypeScore=27.98;MQ=47.63;MQ0=0;QD=0.60;SB=18.43 GT:AD:DP:GL:GQ 0/1:72,9:75:-30.78,-22.60,-290.44:81.79
-chr1 1520344 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=73;Dels=0.01;HRun=0;HaplotypeScore=35.55;MQ=46.62;MQ0=0;OQ=147.13;QD=2.02;SB=-55.25 GT:AD:DP:GL:GQ 0/1:57,14:62:-36.39,-18.39,-179.58:99
-chr1 1520377 . C G 26.02 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=20.54;MQ=46.26;MQ0=1;QD=0.42;SB=59.22 GT:AD:DP:GL:GQ 0/1:52,10:48:-20.35,-14.47,-182.03:58.84
-chr1 1520381 rs28593368 C G 11.70 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=9.32;MQ=47.21;MQ0=1;QD=0.18;SB=37.38 GT:AD:DP:GL:GQ 0/1:58,8:56:-21.30,-16.87,-217.45:44.23
-chr1 1520469 rs11488585 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.01;HRun=0;HaplotypeScore=36.86;MQ=43.53;MQ0=4;OQ=2355.10;QD=23.55;SB=-1049.66 GT:AD:DP:GL:GQ 0/1:35,63:89:-265.31,-26.51,-115.33:99
-chr1 1520498 . G A 0.22 PASS AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=42.41;MQ0=4;OQ=313.12;QD=3.48;SB=-164.48 GT:AD:DP:GL:GQ 0/1:71,19:76:-57.51,-22.91,-206.14:99
-chr1 1520609 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=16.97;MQ=45.11;MQ0=1;OQ=1017.74;QD=9.51;SB=-327.71 GT:AD:DP:GL:GQ 0/1:72,34:94:-133.38,-28.32,-275.79:99
-chr1 1520627 . T C 0.10 PASS AC=2;AF=1.00;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=10.65;MQ=46.29;MQ0=2;OQ=3224.03;QD=30.42;SB=-1396.99 GT:AD:DP:GL:GQ 1/1:0,101:93:-329.81,-30.68,-3.83:99
-chr1 1520757 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=47.64;MQ0=6;OQ=89.81;QD=0.88;SB=110.39 GT:AD:DP:GL:GQ 0/1:91,11:89:-39.08,-26.81,-310.80:99
-chr1 1520774 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=99;Dels=0.01;HRun=0;HaplotypeScore=56.31;MQ=48.08;MQ0=6;OQ=62.24;QD=0.63;SB=110.34 GT:AD:DP:GL:GQ 0/1:89,9:83:-34.23,-24.72,-231.51:95.08
-chr1 1520787 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=96;Dels=0.04;HRun=0;HaplotypeScore=27.20;MQ=49.95;MQ0=4;OQ=173.92;QD=1.81;SB=77.51 GT:AD:DP:GL:GQ 0/1:78,14:87:-45.69,-25.01,-305.10:99
-chr1 1520821 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=51.43;MQ0=1;OQ=216.93;QD=2.55;SB=101.36 GT:AD:DP:GL:GQ 0/1:69,16:80:-49.07,-24.10,-269.00:99
-chr1 1520848 . G A 0.20 PASS AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=50.21;MQ0=2;OQ=302.35;QD=3.44;SB=74.15 GT:AD:DP:GL:GQ 0/1:72,16:76:-56.43,-22.92,-203.92:99
-chr1 1520892 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=71.05;MQ=51.39;MQ0=2;OQ=950.76;QD=9.51;SB=-387.75 GT:AD:DP:GL:GQ 0/1:63,37:86:-124.27,-25.91,-211.22:99
-chr1 1520953 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=74;Dels=0.01;HRun=0;HaplotypeScore=47.85;MQ=52.80;MQ0=2;OQ=265.98;QD=3.59;SB=-146.32 GT:AD:DP:GL:GQ 0/1:59,14:61:-47.97,-18.09,-205.99:99
-chr1 1520957 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=21.78;MQ=53.36;MQ0=2;OQ=105.70;QD=1.55;SB=-47.11 GT:AD:DP:GL:GQ 0/1:59,9:55:-30.43,-16.57,-209.84:99
-chr1 1520979 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=45.80;MQ=49.11;MQ0=2;OQ=234.58;QD=3.72;SB=-118.04 GT:AD:DP:GL:GQ 0/1:53,10:50:-41.81,-15.07,-172.68:99
-chr1 1521029 . C G 208.12 Indel AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=31.42;MQ=47.45;MQ0=1;QD=3.20;SB=-33.62 GT:AD:DP:GL:GQ 0/1:53,12:61:-42.48,-18.38,-218.36:99
-chr1 1521111 . C G 34.71 LowQual AC=1;AF=0.50;AN=2;DP=75;Dels=0.05;HRun=0;HaplotypeScore=51.94;MQ=49.50;MQ0=5;QD=0.46;SB=-34.07 GT:AD:DP:GL:GQ 0/1:62,9:60:-24.84,-18.09,-231.30:67.54
-chr1 1521139 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=19.29;MQ=49.73;MQ0=4;OQ=471.32;QD=8.42;SB=-237.06 GT:AD:DP:GL:GQ 0/1:38,18:43:-63.38,-12.96,-121.81:99
-chr1 1521149 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=50;Dels=0.04;HRun=0;HaplotypeScore=25.97;MQ=51.25;MQ0=5;OQ=94.80;QD=1.90;SB=0.71 GT:AD:DP:GL:GQ 0/1:42,6:42:-25.43,-12.66,-151.77:99
-chr1 1521416 . G A 908.87 Indel AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=49.66;MQ0=7;QD=12.12;SB=-403.37 GT:AD:DP:GL:GQ 0/1:47,28:66:-114.05,-19.88,-141.06:99
-chr1 1521692 . G A 0.94 PASS AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=9.14;MQ=58.40;MQ0=0;OQ=1252.37;QD=15.27;SB=-600.00 GT:AD:DP:GL:GQ 0/1:41,41:79:-152.32,-23.80,-150.35:99
-chr1 1521772 rs36210710 A G 0.25 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=15.96;MQ=57.04;MQ0=1;OQ=875.12;QD=13.46;SB=-359.37 GT:AD:DP:GL:GQ 0/1:32,33:57:-107.96,-17.17,-110.70:99
-chr1 1522125 rs28569178 A G 2.98 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=5.24;MQ=53.41;MQ0=0;OQ=1519.29;QD=31.65;SB=-783.99 GT:AD:DP:GL:GQ 1/1:0,48:43:-155.53,-12.95,-0.01:99
-chr1 1522142 rs35051391 A C 34.82 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=4.14;MQ=53.19;MQ0=0;OQ=509.94;QD=11.86;SB=-251.92 GT:AD:DP:GL:GQ 0/1:20,23:38:-65.73,-11.45,-61.61:99
-chr1 1522705 . C T 4.71 PASS AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=50.65;MQ0=0;OQ=133.19;QD=16.65;SB=-79.09 GT:AD:DP:GL:GQ 0/1:3,5:8:-19.01,-2.41,-10.59:81.80
-chr1 1524477 rs11552172 T C 56.64 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.17;MQ0=0;OQ=436.12;QD=15.58;SB=-113.68 GT:AD:DP:GL:GQ 0/1:12,16:28:-55.34,-8.44,-45.31:99
-chr1 1527039 rs4075469 A C 248.77 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.34;MQ0=0;OQ=696.22;QD=16.58;SB=-340.88 GT:AD:DP:GL:GQ 0/1:16,26:40:-84.95,-12.05,-59.28:99
-chr1 1527300 rs7554569 C T 296.92 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=424.42;QD=8.16;SB=-236.55 GT:AD:DP:GL:GQ 0/1:35,17:46:-59.60,-13.87,-96.44:99
-chr1 1527750 . C A 254.99 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=986.18;QD=16.71;SB=-374.21 GT:AD:DP:GL:GQ 0/1:26,33:55:-118.47,-16.57,-69.65:99
-chr1 1527909 . G A 103.61 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.52;MQ0=0;OQ=783.03;QD=16.31;SB=-358.36 GT:AD:DP:GL:GQ 0/1:23,25:47:-95.76,-14.17,-71.60:99
-chr1 1528300 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=10.61;MQ=58.05;MQ0=0;OQ=286.83;QD=5.98;SB=62.19 GT:AD:DP:GL:GQ 0/1:26,22:41:-44.32,-12.35,-90.74:99
-chr1 1529232 rs6656591 T C 65.49 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.39;MQ=56.33;MQ0=0;OQ=1005.79;QD=17.65;SB=-491.70 GT:AD:DP:GL:GQ 0/1:23,34:55:-120.43,-16.57,-83.35:99
-chr1 1529445 rs6691649 G A 161.84 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.46;MQ0=0;OQ=1057.94;QD=19.59;SB=-480.07 GT:AD:DP:GL:GQ 0/1:20,34:51:-124.45,-15.37,-67.92:99
-chr1 1529817 rs4075275 G C 15.87 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=58.35;MQ0=0;OQ=1607.65;QD=30.92;SB=-720.33 GT:AD:DP:GL:GQ 1/1:0,52:40:-164.38,-12.07,-0.03:99
-chr1 1530590 . C T 27.41 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=55.36;MQ0=0;OQ=363.07;QD=13.45;SB=-133.59 GT:AD:DP:GL:GQ 0/1:14,13:26:-47.43,-7.84,-42.81:99
-chr1 1530910 . G C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=6.92;MQ=37.58;MQ0=2;OQ=79.86;QD=5.32;SB=-10.00 GT:AD:DP:GL:GQ 0/1:7,8:5:-12.78,-1.51,-7.90:63.88
-chr1 1530912 . C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=2;HaplotypeScore=4.15;MQ=38.11;MQ0=2;OQ=71.50;QD=5.11;SB=-6.99 GT:AD:DP:GL:GQ 0/1:4,10:6:-12.24,-1.81,-12.03:99
-chr1 1530952 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=8.79;MQ=42.16;MQ0=2;OQ=53.35;QD=3.33;SB=-39.44 GT:AD:DP:GL:GQ 0/1:11,5:9:-11.33,-2.71,-25.48:86.19
-chr1 1530975 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=5.18;MQ=46.58;MQ0=0;OQ=57.06;QD=3.57;SB=5.04 GT:AD:DP:GL:GQ 0/1:12,4:12:-12.60,-3.61,-32.43:89.90
-chr1 1531008 . C G 10.82 LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=2;HaplotypeScore=6.64;MQ=46.16;MQ0=1;QD=0.52;SB=-26.85 GT:AD:DP:GL:GQ 0/1:16,5:11:-7.66,-3.33,-32.36:43.28
-chr1 1531060 . A C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=9.36;MQ=36.61;MQ0=1;OQ=116.93;QD=7.31;SB=-3.99 GT:AD:DP:GL:GQ 0/1:5,10:9:-17.69,-2.71,-12.57:98.57
-chr1 1531096 . C T 31.46 LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=8.94;MQ=35.04;MQ0=1;QD=3.15;SB=-6.99 GT:AD:DP:GL:GQ 0/1:5,5:4:-7.64,-1.21,-6.67:54.60
-chr1 1531214 . C T 12.58 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=48.08;MQ0=0;QD=0.90;SB=-28.53 GT:AD:DP:GL:GQ 0/1:11,2:10:-7.53,-3.02,-23.43:45.17
-chr1 1531255 . G A 2.13 PASS AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=54.60;MQ0=0;OQ=208.62;QD=17.39;SB=-121.64 GT:AD:DP:GL:GQ 0/1:2,10:8:-26.44,-2.41,-2.60:1.87
-chr1 1531316 . A T 48.17 LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=48.85;MQ0=0;QD=2.01;SB=-30.94 GT:AD:DP:GL:GQ 0/1:15,8:14:-12.32,-4.22,-35.65:81.01
-chr1 1531334 . C T 13.43 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=45.60;MQ0=1;QD=0.56;SB=5.01 GT:AD:DP:GL:GQ 0/1:15,7:11:-7.93,-3.32,-25.96:46.07
-chr1 1531359 . G A 17.07 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=4.20;MQ=46.76;MQ0=1;QD=0.74;SB=11.04 GT:AD:DP:GL:GQ 0/1:19,4:19:-10.71,-5.73,-55.15:49.82
-chr1 1531380 . C G 42.65 LowQual AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=3;HaplotypeScore=7.66;MQ=46.38;MQ0=2;QD=1.42;SB=-45.68 GT:AD:DP:GL:GQ 0/1:23,7:24:-14.78,-7.24,-85.75:75.49
-chr1 1531419 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=2;HaplotypeScore=5.63;MQ=45.92;MQ0=1;OQ=63.73;QD=3.03;SB=23.10 GT:AD:DP:GL:GQ 0/1:16,5:18:-15.09,-5.43,-50.86:96.57
-chr1 1531527 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=3.70;MQ=32.41;MQ0=1;OQ=75.08;QD=3.75;SB=-44.95 GT:AD:DP:GL:GQ 0/1:9,10:9:-13.51,-2.71,-17.78:99
-chr1 1531545 . G C 27.47 LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=8.08;MQ=36.24;MQ0=1;QD=1.37;SB=-32.85 GT:AD:DP:GL:GQ 0/1:18,2:9:-8.74,-2.71,-27.23:60.30
-chr1 1531547 . C G 25.49 LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=8.42;MQ=36.81;MQ0=1;QD=1.34;SB=-27.40 GT:AD:DP:GL:GQ 0/1:14,5:6:-7.64,-1.81,-15.17:58.31
-chr1 1532873 rs9442420 T C 73.52 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.50;MQ0=0;OQ=1279.49;QD=27.81;SB=-597.57 GT:AD:DP:GL:GQ 1/1:0,46:41:-131.57,-12.37,-0.04:99
-chr1 1533487 rs61774903 T C 6.43 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.07;MQ0=0;OQ=267.71;QD=10.71;SB=-22.90 GT:AD:DP:GL:GQ 0/1:12,13:23:-36.99,-6.93,-45.73:99
-chr1 1533846 . C A 150.54 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=607.30;QD=13.20;SB=-294.38 GT:AD:DP:GL:GQ 0/1:23,23:45:-77.57,-13.56,-81.22:99
-chr1 1534313 . G A 286.31 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.20;MQ0=0;OQ=679.07;QD=15.09;SB=-355.53 GT:AD:DP:GL:GQ 0/1:22,23:43:-84.16,-12.97,-66.20:99
-chr1 1535152 rs6671612 G T 108.66 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.91;MQ=57.71;MQ0=0;OQ=838.64;QD=11.98;SB=-304.64 GT:AD:DP:GL:GQ 0/1:41,29:64:-106.43,-19.29,-110.69:99
-chr1 1536167 rs11492279 C T 248.42 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=60.00;MQ0=0;OQ=1040.79;QD=15.31;SB=-440.43 GT:AD:DP:GL:GQ 0/1:36,32:64:-126.65,-19.29,-102.67:99
-chr1 1536812 rs4612573 T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.03;HRun=1;HaplotypeScore=39.15;MQ=49.08;MQ0=0;OQ=1478.03;QD=23.09;SB=-556.56 GT:AD:DP:GL:GQ 1/1:5,57:50:-162.89,-15.07,-11.50:35.64
-chr1 1537429 rs4369171 A G 1.14 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=7.54;MQ=57.32;MQ0=0;OQ=2121.87;QD=33.68;SB=-744.31 GT:AD:DP:GL:GQ 1/1:0,62:59:-215.79,-17.77,-0.02:99
-chr1 1537803 . G T 52.70 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=13;HaplotypeScore=28.28;MQ=58.09;MQ0=1;QD=0.71;SB=63.90 GT:AD:DP:GL:GQ 0/1:60,13:55:-25.14,-16.58,-155.96:85.54
-chr1 1537805 . T C 135.64 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=41.12;MQ=58.24;MQ0=1;QD=2.02;SB=15.89 GT:AD:DP:GL:GQ 0/1:57,10:56:-33.73,-16.88,-176.73:99
-chr1 1538333 . A G 136.38 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.86;MQ0=0;OQ=748.93;QD=13.87;SB=-356.58 GT:AD:DP:GL:GQ 0/1:27,27:53:-94.15,-15.98,-99.69:99
-chr1 1538565 rs9442431 T C 829.64 Indel AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=7.58;MQ=50.06;MQ0=1;QD=21.83;SB=-151.73 GT:AD:DP:GL:GQ 1/1:0,37:28:-86.58,-8.45,-0.03:84.18
-chr1 1538664 rs9442430 T C 1.04 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.01;HRun=1;HaplotypeScore=8.39;MQ=59.12;MQ0=0;OQ=2182.53;QD=31.63;SB=-555.08 GT:AD:DP:GL:GQ 1/1:0,68:67:-221.88,-20.20,-0.05:99
-chr1 1539012 rs34501155 C T 24.47 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.10;MQ=59.44;MQ0=0;OQ=1523.49;QD=20.31;SB=-698.38 GT:AD:DP:GL:GQ 0/1:29,46:74:-177.93,-22.30,-104.96:99
-chr1 1539217 rs12066 G A 112.48 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2269.66;QD=38.47;SB=-1077.37 GT:AD:DP:GL:GQ 1/1:0,59:57:-230.57,-17.17,-0.02:99
-chr1 1539583 . C T 13.58 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.17;MQ=59.69;MQ0=0;OQ=849.58;QD=14.16;SB=-408.41 GT:AD:DP:GL:GQ 0/1:34,26:60:-106.31,-18.07,-125.62:99
-chr1 1540565 rs4648611 A G 1.07 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=4.13;MQ=58.95;MQ0=0;OQ=632.46;QD=28.75;SB=-329.75 GT:AD:DP:GL:GQ 1/1:0,22:20:-66.85,-6.03,-0.02:60.13
-chr1 1541790 rs7418389 T C 9.16 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=644.37;QD=28.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,23:21:-68.04,-6.33,-0.01:63.14
-chr1 1542618 rs6604985 T C 187.42 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.49;MQ0=0;OQ=2789.66;QD=34.02;SB=-860.05 GT:AD:DP:GL:GQ 1/1:0,82:81:-282.58,-24.40,-0.03:99
-chr1 1543361 rs28546565 G A 262.71 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.46;MQ0=0;OQ=627.76;QD=14.60;SB=-285.20 GT:AD:DP:GL:GQ 0/1:20,23:40:-78.11,-12.05,-70.94:99
-chr1 1543456 rs28623434 C G 8.50 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=2.93;MQ=59.20;MQ0=0;OQ=2332.23;QD=40.21;SB=-1030.14 GT:AD:DP:GL:GQ 1/1:0,58:55:-236.83,-16.57,-0.02:99
-chr1 1543533 rs9442410 G C 82.06 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=2713.47;QD=43.07;SB=-1108.14 GT:AD:DP:GL:GQ 1/1:0,63:62:-274.95,-18.68,-0.02:99
-chr1 1544225 rs9442425 G A 33.58 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.11;MQ=59.22;MQ0=0;OQ=1855.01;QD=38.65;SB=-869.17 GT:AD:DP:GL:GQ 1/1:0,48:47:-189.10,-14.16,-0.01:99
-chr1 1545229 rs9329576 T C 4.58 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=60.00;MQ0=0;OQ=1266.55;QD=28.15;SB=-625.18 GT:AD:DP:GL:GQ 1/1:0,45:39:-130.27,-11.76,-0.03:99
-chr1 1545852 rs7543265 G A 8.95 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=6.32;MQ=58.20;MQ0=0;OQ=611.29;QD=15.67;SB=-238.27 GT:AD:DP:GL:GQ 0/1:17,20:35:-74.97,-10.56,-46.23:99
-chr1 1546595 rs34983251 G A 45.65 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=59.23;MQ0=0;OQ=349.98;QD=11.67;SB=-133.57 GT:AD:DP:GL:GQ 0/1:16,14:26:-46.12,-7.83,-51.50:99
-chr1 1547538 rs28710339 G C 59.83 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=3.45;MQ=58.50;MQ0=0;OQ=866.08;QD=15.47;SB=-347.43 GT:AD:DP:GL:GQ 0/1:31,25:53:-105.89,-16.00,-107.63:99
-chr1 1547753 . C T 52.88 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.60;MQ0=0;OQ=1139.64;QD=19.99;SB=-512.06 GT:AD:DP:GL:GQ 0/1:22,35:54:-133.53,-16.28,-63.46:99
-chr1 1548655 rs12755088 T C 97.70 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=439.27;QD=24.40;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,18:16:-47.54,-4.84,-0.03:48.08
-chr1 1548983 . C G 40.73 LowQual AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=5;HaplotypeScore=1.58;MQ=47.12;MQ0=0;QD=6.79;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,5:2:-7.48,-0.61,-0.00:6.02
-chr1 1549329 rs28617190 G A 97.62 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.74;MQ=57.37;MQ0=0;OQ=547.08;QD=16.09;SB=-253.53 GT:AD:DP:GL:GQ 0/1:16,18:32:-67.63,-9.64,-54.05:99
-chr1 1549834 rs12748433 C T 442.94 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.23;MQ0=0;OQ=1400.65;QD=37.86;SB=-569.32 GT:AD:DP:GL:GQ 1/1:0,37:36:-143.66,-10.85,-0.01:99
-chr1 1549963 rs28441650 G A 319.81 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.05;MQ0=0;OQ=739.99;QD=15.10;SB=-342.91 GT:AD:DP:GL:GQ 0/1:25,24:48:-91.75,-14.47,-81.34:99
-chr1 1551048 . G A 13.72 PASS AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=55.20;MQ0=0;OQ=331.40;QD=13.81;SB=-96.94 GT:AD:DP:GL:GQ 0/1:12,12:21:-42.75,-6.33,-33.17:99
-chr1 1551194 . G A 9.75 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.45;MQ0=0;OQ=497.08;QD=14.62;SB=-108.95 GT:AD:DP:GL:GQ 0/1:18,16:33:-62.94,-9.95,-55.65:99
-chr1 1552758 rs12735861 C T 11.10 PASS AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=56.58;MQ0=0;OQ=143.44;QD=15.94;SB=-6.99 GT:AD:DP:GL:GQ 0/1:3,6:8:-20.04,-2.41,-9.16:67.50
-chr1 1553652 . C A 57.28 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.52;MQ0=0;OQ=736.76;QD=15.35;SB=-347.43 GT:AD:DP:GL:GQ 0/1:23,25:44:-90.22,-13.26,-60.84:99
-chr1 1554057 rs3935032 C T 0.35 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=59.31;MQ0=0;OQ=580.92;QD=21.52;SB=-104.60 GT:AD:DP:GL:GQ 0/1:9,18:26:-69.21,-7.83,-32.29:99
-chr1 1555931 rs28730454 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=7;HaplotypeScore=0.32;MQ=55.21;MQ0=0;OQ=59.16;QD=11.83;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:3:-9.41,-0.90,-0.00:9.02
-chr1 1556023 rs28464684 T C 13.91 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=73.72;QD=24.57;SB=-40.68 GT:AD:DP:GL:GQ 1/1:0,3:3:-10.86,-0.90,-0.00:9.03
-chr1 1556952 rs28451771 T C 12.66 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=601.05;QD=31.63;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,19:19:-63.70,-5.72,-0.01:57.14
-chr1 1561503 rs61774909 G T 0.68 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=9.65;MQ0=29;OQ=78.96;QD=2.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,16:3:-11.38,-0.90,-0.00:9.03
-chr1 1563882 rs61774911 A G 1.20 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=39.06;MQ0=5;OQ=124.38;QD=2.76;SB=-85.66 GT:AD:DP:GL:GQ 0/1:34,10:35:-26.27,-10.55,-104.24:99
-chr1 1563939 rs9442413 G A 8.49 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=40.26;MQ0=2;OQ=315.22;QD=4.50;SB=-153.56 GT:AD:DP:GL:GQ 0/1:51,19:59:-52.60,-17.79,-143.72:99
-chr1 1564183 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=20;HaplotypeScore=14.98;MQ=46.49;MQ0=5;OQ=64.66;QD=1.80;SB=35.13 GT:AD:DP:GL:GQ 0/1:31,5:28:-18.18,-8.44,-79.86:97.49
-chr1 1564572 rs28401288 T G 29.42 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=41.92;MQ0=1;OQ=1158.48;QD=27.58;SB=-476.97 GT:AD:DP:GL:GQ 1/1:0,42:35:-119.45,-10.55,-0.02:99
-chr1 1565479 rs28394074 T C 98.76 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=12.86;MQ0=16;OQ=207.25;QD=7.68;SB=-36.94 GT:AD:DP:GL:GQ 1/1:0,27:7:-24.31,-2.11,-0.00:21.06
-chr1 1565699 . C G 5.41 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.34;MQ=26.47;MQ0=10;OQ=657.44;QD=8.65;SB=-346.42 GT:AD:DP:GL:GQ 0/1:55,21:62:-87.73,-18.71,-164.80:99
-chr1 1566499 rs3765908 G A 18.31 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.75;MQ=37.81;MQ0=3;OQ=1730.84;QD=29.34;SB=-752.15 GT:AD:DP:GL:GQ 1/1:8,51:54:-192.27,-16.27,-15.84:4.30
-chr1 1566866 rs3819995 C T 33.13 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=17.30;MQ0=34;OQ=418.63;QD=7.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:21,36:18:-50.57,-5.43,-18.99:99
-chr1 1567043 rs1137001 C T 0.22 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=9.65;MQ0=38;OQ=66.77;QD=1.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:35,15:6:-11.77,-1.81,-10.91:90.99
-chr1 1569585 rs61774912 C T 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=8.98;MQ=13.84;MQ0=43;OQ=132.92;QD=1.51;SB=-3.99 GT:AD:DP:GL:GQ 0/1:64,24:26:-24.41,-7.83,-74.67:99
-chr1 1569917 rs6688326 C A 0.25 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=26.34;MQ0=26;OQ=227.69;QD=3.04;SB=-87.75 GT:AD:DP:GL:GQ 0/1:58,17:44:-39.31,-13.26,-117.30:99
-chr1 1570601 rs4648767 T A 243.47 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=24.85;MQ0=18;OQ=1006.84;QD=11.57;SB=-380.53 GT:AD:DP:GL:GQ 0/1:42,45:58:-121.45,-17.48,-87.58:99
-chr1 1570928 . G C 0.90 PASS AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=3.62;MQ=32.27;MQ0=14;OQ=845.01;QD=5.52;SB=-333.79 GT:AD:DP:GL:GQ 0/1:113,40:123:-124.85,-37.07,-408.45:99
-chr1 1570959 . C T 0.27 PASS AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=2;HaplotypeScore=4.89;MQ=34.90;MQ0=12;OQ=2272.40;QD=13.77;SB=-727.55 GT:AD:DP:GL:GQ 0/1:85,80:144:-273.90,-43.38,-268.43:99
-chr1 1571421 rs61774913 C T 442.63 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.06;MQ0=31;OQ=744.27;QD=14.31;SB=-218.78 GT:AD:DP:GL:GQ 1/1:0,52:19:-78.02,-5.72,-0.00:57.19
-chr1 1571449 rs61774914 T C 385.68 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=19.48;MQ0=37;OQ=993.50;QD=14.19;SB=-324.14 GT:AD:DP:GL:GQ 1/1:0,70:28:-102.94,-8.43,-0.01:84.26
-chr1 1571467 . G A 0.11 PASS AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=5.46;MQ=31.83;MQ0=25;OQ=330.51;QD=3.76;SB=-146.19 GT:AD:DP:GL:GQ 0/1:69,19:55:-52.91,-16.58,-135.58:99
-chr1 1571576 . A C 50.03 PASS AC=2;AF=1.00;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=35.58;MQ0=13;OQ=1974.59;QD=21.23;SB=-847.56 GT:AD:DP:GL:GQ 1/1:0,61:79:-282.59,-90.56,-81.54:90.13
-chr1 1571744 rs61774916 T C 0.32 PASS AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=43.65;MQ0=18;OQ=618.53;QD=4.99;SB=-195.46 GT:AD:DP:GL:GQ 0/1:91,33:103:-96.17,-31.03,-294.76:99
-chr1 1571789 rs61774917 G T 99.17 PASS AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=40.38;MQ0=17;OQ=858.73;QD=7.53;SB=-166.41 GT:AD:DP:GL:GQ 0/1:66,48:94:-117.47,-28.31,-223.12:99
-chr1 1571821 rs4279785 T C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=33.09;MQ0=22;OQ=74.70;QD=0.60;SB=13.40 GT:AD:DP:GL:GQ 0/1:103,22:85:-36.35,-25.60,-306.33:99
-chr1 1571969 rs4648753 T C 252.37 PASS AC=2;AF=1.00;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.21;MQ0=23;OQ=2308.47;QD=23.08;SB=-928.73 GT:AD:DP:GL:GQ 1/1:1,99:73:-234.50,-22.02,-0.07:99
-chr1 1572065 rs61774918 C T 271.62 PASS AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=40.98;MQ0=5;OQ=1993.46;QD=16.08;SB=-715.20 GT:AD:DP:GL:GQ 0/1:57,67:116:-237.58,-34.95,-201.11:99
-chr1 1572318 rs61774919 G A 28.59 PASS AC=1;AF=0.50;AN=2;DB;DP=173;Dels=0.00;HRun=0;HaplotypeScore=4.27;MQ=26.57;MQ0=15;OQ=1639.76;QD=9.48;SB=-550.56 GT:AD:DP:GL:GQ 0/1:104,69:121:-203.75,-36.49,-222.67:99
-chr1 1572479 . T C 0.14 PASS AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=45.14;MQ0=0;OQ=1750.04;QD=12.24;SB=-888.87 GT:AD:DP:GL:GQ 0/1:83,60:141:-220.76,-42.47,-332.08:99
-chr1 1572504 . T C 0.71 PASS AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=42.33;MQ0=3;OQ=1049.29;QD=7.72;SB=-546.16 GT:AD:DP:GL:GQ 0/1:84,52:129:-147.09,-38.88,-337.66:99
-chr1 1572657 rs4648754 C A 97.80 PASS AC=2;AF=1.00;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=39.40;MQ0=0;OQ=4131.60;QD=35.01;SB=-1448.13 GT:AD:DP:GL:GQ 1/1:1,117:114:-412.16,-34.34,-0.04:99
-chr1 1572704 rs61774920 A G 0.40 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=29.04;MQ0=13;OQ=131.71;QD=1.78;SB=23.25 GT:AD:DP:GL:GQ 0/1:54,20:56:-33.33,-16.87,-184.69:99
-chr1 1572707 rs61774921 G T 0.96 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=28.52;MQ0=13;OQ=177.56;QD=2.50;SB=-37.61 GT:AD:DP:GL:GQ 0/1:52,19:55:-37.61,-16.57,-159.55:99
-chr1 1572743 rs3820000 G C 38.18 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.84;MQ0=19;OQ=650.68;QD=7.75;SB=38.16 GT:AD:DP:GL:GQ 0/1:50,34:58:-85.85,-17.49,-156.24:99
-chr1 1572824 rs3820001 G C 184.22 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=41.82;MQ0=4;OQ=1359.68;QD=17.43;SB=-597.25 GT:AD:DP:GL:GQ 0/1:31,47:67:-159.47,-20.22,-110.10:99
-chr1 1572866 rs61776849 C T 39.28 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=4.48;MQ=49.73;MQ0=0;OQ=1155.72;QD=12.70;SB=-351.36 GT:AD:DP:GL:GQ 0/1:50,41:84:-144.17,-25.32,-161.47:99
-chr1 1572951 . A G 0.08 PASS AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=47.33;MQ0=7;OQ=238.29;QD=2.91;SB=26.27 GT:AD:DP:GL:GQ 0/1:60,22:73:-49.11,-21.99,-235.06:99
-chr1 1573358 rs61774952 T C 32.21 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=47.33;MQ0=8;QD=0.37;SB=67.42 GT:AD:DP:GL:GQ 0/1:70,16:71:-27.89,-21.39,-252.84:65.04
-chr1 1573532 . C T 35.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=10.41;MQ0=15;QD=1.97;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,3:3:-7.73,-0.90,-3.80:28.93
-chr1 1573550 . T C 24.36 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=33.97;MQ0=17;QD=0.72;SB=-17.89 GT:AD:DP:GL:GQ 0/1:23,11:14:-9.94,-4.22,-42.08:57.18
-chr1 1573618 . C T 2.54 PASS AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=45.15;MQ0=15;OQ=814.16;QD=7.75;SB=-232.64 GT:AD:DP:GL:GQ 0/1:66,38:82:-109.43,-24.73,-173.93:99
-chr1 1573625 . G A 3.56 PASS AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=45.17;MQ0=14;OQ=654.74;QD=6.18;SB=-207.09 GT:AD:DP:GL:GQ 0/1:70,36:84:-94.09,-25.34,-189.03:99
-chr1 1573865 rs6691927 A G 0.48 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=13.93;MQ=47.63;MQ0=8;OQ=1026.45;QD=17.40;SB=-411.69 GT:AD:DP:GL:GQ 0/1:13,46:46:-119.80,-13.87,-37.07:99
-chr1 1573965 rs28525262 G A 126.85 PASS AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=48.13;MQ0=7;OQ=3091.70;QD=33.97;SB=-1505.87 GT:AD:DP:GL:GQ 1/1:7,83:80:-316.25,-24.10,-3.49:99
-chr1 1573980 rs4648756 G C 18.18 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=4.39;MQ=47.15;MQ0=6;OQ=3392.36;QD=38.99;SB=-1642.01 GT:AD:DP:GL:GQ 1/1:0,87:79:-338.24,-23.81,-0.03:99
-chr1 1574055 rs4648606 G A 59.73 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=37.73;MQ0=7;OQ=2424.32;QD=33.21;SB=-1231.00 GT:AD:DP:GL:GQ 1/1:0,72:61:-246.03,-18.38,-0.02:99
-chr1 1574081 rs4648607 T C 84.11 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=40.76;MQ0=4;OQ=2240.23;QD=31.55;SB=-1072.45 GT:AD:DP:GL:GQ 1/1:0,71:63:-227.63,-18.98,-0.02:99
-chr1 1574087 rs4648757 G C 98.21 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=43.14;MQ0=1;OQ=2791.35;QD=39.31;SB=-1268.99 GT:AD:DP:GL:GQ 1/1:0,71:65:-282.74,-19.59,-0.02:99
-chr1 1574123 . A C 149.77 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=169.77;MQ=39.72;MQ0=1;QD=1.63;SB=83.29 GT:AD:DP:GL:GQ 0/1:79,13:73:-40.25,-21.99,-225.95:99
-chr1 1574124 . A G 50.98 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=170.51;MQ=39.99;MQ0=1;QD=0.55;SB=86.31 GT:AD:DP:GL:GQ 0/1:80,13:72:-30.08,-21.70,-250.90:83.81
-chr1 1574131 . A G 472.59 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=2;HaplotypeScore=66.93;MQ=41.08;MQ0=1;QD=5.25;SB=86.31 GT:AD:DP:GL:GQ 0/1:61,29:78:-74.04,-23.50,-234.93:99
-chr1 1574135 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=78.57;MQ=41.20;MQ0=1;OQ=155.65;QD=1.75;SB=86.32 GT:AD:DP:GL:GQ 0/1:76,13:71:-40.23,-21.39,-240.65:99
-chr1 1574143 . A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=43.74;MQ0=1;OQ=78.06;QD=1.07;SB=89.31 GT:AD:DP:GL:GQ 0/1:60,13:65:-30.68,-19.59,-219.52:99
-chr1 1574152 . C T 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=43.30;MQ0=0;OQ=130.78;QD=1.92;SB=41.52 GT:AD:DP:GL:GQ 0/1:58,10:59:-34.15,-17.79,-160.93:99
-chr1 1574339 . T A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=12.88;MQ=42.39;MQ0=0;OQ=429.14;QD=5.50;SB=104.35 GT:AD:DP:GL:GQ 0/1:59,19:76:-69.09,-22.90,-217.44:99
-chr1 1574367 rs12749208 C T 7.96 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=36.29;MQ0=0;OQ=733.94;QD=10.48;SB=80.18 GT:AD:DP:GL:GQ 0/1:43,27:66:-96.58,-19.90,-132.61:99
-chr1 1574398 rs12756960 A G 17.43 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=34.26;MQ0=0;QD=0.28;SB=39.57 GT:AD:DP:GL:GQ 0/1:29,33:32:-14.67,-9.65,-103.72:50.18
-chr1 1574404 rs12756961 A T 204.46 Indel AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=35.46;MQ0=0;QD=3.01;SB=-19.65 GT:AD:DP:GL:GQ 0/1:32,36:41:-36.08,-12.35,-112.04:99
-chr1 1574410 rs12749336 C G 884.89 Indel AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=10.32;MQ=35.72;MQ0=0;QD=12.82;SB=-17.81 GT:AD:DP:GL:GQ 0/1:40,29:35:-102.33,-10.56,-39.37:99
-chr1 1574434 rs61774954 A C 428.65 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=8.25;MQ=34.95;MQ0=1;QD=6.30;SB=56.20 GT:AD:DP:GL:GQ 0/1:39,29:57:-63.32,-17.18,-124.62:99
-chr1 1574437 rs61774955 A C 431.78 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=7.93;MQ=34.95;MQ0=1;QD=6.35;SB=56.19 GT:AD:DP:GL:GQ 0/1:38,30:51:-61.82,-15.36,-118.50:99
-chr1 1574456 rs12749364 C A 1380.74 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=20.46;MQ=37.20;MQ0=1;QD=17.26;SB=-577.01 GT:AD:DP:GL:GQ 1/1:30,50:46:-152.08,-13.86,-10.42:34.36
-chr1 1574458 . G C 45.27 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=79;Dels=0.01;HRun=0;HaplotypeScore=10.44;MQ=37.76;MQ0=1;QD=0.57;SB=71.27 GT:AD:DP:GL:GQ 0/1:52,26:51:-22.87,-15.06,-200.14:78.10
-chr1 1574459 . G A 19.52 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=78;Dels=0.01;HRun=1;HaplotypeScore=9.38;MQ=37.85;MQ0=1;QD=0.25;SB=68.24 GT:AD:DP:GL:GQ 0/1:50,27:51:-20.29,-15.06,-165.60:52.31
-chr1 1574490 . C T 446.32 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=13.97;MQ=40.46;MQ0=1;QD=6.11;SB=62.20 GT:AD:DP:GL:GQ 0/1:48,25:59:-65.69,-17.77,-151.07:99
-chr1 1574491 . A G 363.54 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=40.79;MQ0=1;QD=4.91;SB=65.24 GT:AD:DP:GL:GQ 0/1:48,26:58:-57.11,-17.48,-164.32:99
-chr1 1574495 . G A 435.54 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=16.96;MQ=40.97;MQ0=1;QD=5.73;SB=65.16 GT:AD:DP:GL:GQ 0/1:50,26:61:-65.23,-18.39,-146.68:99
-chr1 1574611 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=41.66;MQ0=2;OQ=80.08;QD=1.13;SB=68.24 GT:AD:DP:GL:GQ 0/1:54,17:60:-29.38,-18.09,-195.87:99
-chr1 1574622 . G A 0.30 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=40.91;MQ0=2;OQ=251.34;QD=3.44;SB=59.11 GT:AD:DP:GL:GQ 0/1:55,18:61:-46.81,-18.39,-160.50:99
-chr1 1574627 . C T 0.19 PASS AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=42.21;MQ0=2;OQ=221.98;QD=2.88;SB=74.24 GT:AD:DP:GL:GQ 0/1:61,16:67:-45.68,-20.20,-184.31:99
-chr1 1574705 rs12753686 C T 533.95 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.26;MQ0=1;OQ=2577.15;QD=38.46;SB=-1301.71 GT:AD:DP:GL:GQ 1/1:1,66:64:-261.31,-19.28,-0.01:99
-chr1 1574781 rs12753729 C T 0.96 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.51;MQ=55.74;MQ0=0;OQ=2039.46;QD=37.77;SB=-910.24 GT:AD:DP:GL:GQ 1/1:1,53:52:-207.55,-15.67,-0.02:99
-chr1 1575120 rs4648758 A G 435.58 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.79;MQ0=0;OQ=1070.30;QD=28.93;SB=-511.19 GT:AD:DP:GL:GQ 1/1:0,37:35:-110.65,-10.56,-0.04:99
-chr1 1575210 rs4648760 T C 43.48 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=63.90;MQ0=0;OQ=1693.31;QD=34.56;SB=-784.12 GT:AD:DP:GL:GQ 1/1:0,49:49:-172.94,-14.76,-0.02:99
-chr1 1575251 rs4648761 A G 5.46 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.80;MQ0=0;OQ=1436.67;QD=28.17;SB=-671.85 GT:AD:DP:GL:GQ 1/1:0,51:45:-147.29,-13.57,-0.04:99
-chr1 1575460 rs7531938 A G 536.50 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.20;MQ0=0;OQ=2059.81;QD=30.29;SB=-875.65 GT:AD:DP:GL:GQ 1/1:0,68:66:-209.63,-19.91,-0.06:99
-chr1 1575505 rs3936009 G T 209.53 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=57.75;MQ0=0;OQ=2310.00;QD=35.54;SB=-1127.37 GT:AD:DP:GL:GQ 1/1:0,65:65:-234.60,-19.58,-0.02:99
-chr1 1576615 rs11486023 T C 106.32 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.19;MQ0=0;OQ=1526.39;QD=31.15;SB=-484.14 GT:AD:DP:GL:GQ 1/1:0,49:47:-156.26,-14.17,-0.04:99
-chr1 1577178 rs4648762 A G 161.07 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=54.74;MQ0=0;OQ=2251.82;QD=30.85;SB=-761.70 GT:AD:DP:GL:GQ 1/1:0,72:69:-228.82,-20.80,-0.05:99
-chr1 1578533 rs61774958 G A 209.68 PASS AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.20;MQ0=11;OQ=1051.54;QD=7.73;SB=-56.39 GT:AD:DP:GL:GQ 0/1:86,50:122:-145.19,-36.75,-299.83:99
-chr1 1578580 rs61774959 G A 15.52 PASS AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.73;MQ0=4;OQ=297.29;QD=2.89;SB=-52.85 GT:AD:DP:GL:GQ 0/1:73,30:83:-58.01,-25.00,-251.41:99
-chr1 1578600 rs61776760 C T 0.35 PASS AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=43.98;MQ0=2;OQ=158.49;QD=1.69;SB=-47.28 GT:AD:DP:GL:GQ 0/1:69,25:74:-41.42,-22.29,-233.46:99
-chr1 1579194 rs28530622 C G 155.54 PASS AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.72;MQ0=1;OQ=430.39;QD=33.11;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:10:-46.62,-3.01,-0.00:30.10
-chr1 1579428 rs61776762 A G 153.73 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.52;MQ0=1;OQ=97.37;QD=13.91;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:4:-13.27,-1.21,-0.00:12.02
-chr1 1580015 rs11486024 G A 46.74 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=22.93;MQ0=7;OQ=160.84;QD=5.96;SB=11.04 GT:AD:DP:GL:GQ 0/1:15,12:15:-23.90,-4.53,-24.75:99
-chr1 1580190 rs7547516 A G 298.92 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.87;MQ0=6;OQ=291.00;QD=13.23;SB=-79.37 GT:AD:DP:GL:GQ 1/1:0,22:11:-32.70,-3.32,-0.02:33.05
-chr1 1580389 rs9329573 G C 27.04 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=38.23;MQ0=0;OQ=1419.74;QD=36.40;SB=-378.04 GT:AD:DP:GL:GQ 1/1:0,39:37:-145.59,-11.17,-0.03:99
-chr1 1580438 rs9661285 G A 38.22 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=39.42;MQ0=4;OQ=1274.78;QD=31.87;SB=-484.63 GT:AD:DP:GL:GQ 1/1:2,38:33:-131.07,-9.94,-0.01:99
-chr1 1580544 rs9661500 G A 46.95 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=56.47;MQ0=0;OQ=1331.19;QD=35.03;SB=-445.09 GT:AD:DP:GL:GQ 1/1:0,38:35:-136.72,-10.55,-0.02:99
-chr1 1581642 . C T 0.06 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.20;MQ=10.78;MQ0=31;OQ=96.64;QD=2.06;SB=-42.54 GT:AD:DP:GL:GQ 0/1:28,19:6:-14.76,-1.81,-6.20:43.86
-chr1 1581652 rs61776763 A G 3.75 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=12.19;MQ0=23;OQ=234.90;QD=5.87;SB=-48.96 GT:AD:DP:GL:GQ 1/1:0,40:8:-27.08,-2.41,-0.00:24.06
-chr1 1581732 . C T 10.55 PASS AC=2;AF=1.00;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.72;MQ0=12;OQ=388.23;QD=16.18;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,24:11:-42.41,-3.31,-0.00:33.10
-chr1 1581758 rs61776764 C G 0.40 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=4.17;MQ=24.63;MQ0=12;OQ=1218.98;QD=26.50;SB=-184.87 GT:AD:DP:GL:GQ 1/1:2,44:29:-125.50,-8.74,-0.02:87.29
-chr1 1582007 rs28625763 T C 180.58 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.96;MQ0=0;OQ=1011.19;QD=29.74;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,34:31:-104.72,-9.34,-0.02:93.23
-chr1 1582130 rs4648770 T G 609.06 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=44.32;MQ0=0;OQ=2027.74;QD=33.24;SB=-1018.12 GT:AD:DP:GL:GQ 1/1:1,60:58:-206.38,-17.47,-0.02:99
-chr1 1582744 rs4648774 A C 3.99 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=4.26;MQ=37.79;MQ0=0;OQ=1971.73;QD=29.87;SB=-941.08 GT:AD:DP:GL:GQ 1/1:1,65:56:-200.78,-16.87,-0.02:99
-chr1 1582886 rs1062088 G C 0.12 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=28.33;MQ0=1;OQ=872.58;QD=39.66;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,22:20:-90.85,-6.03,-0.01:60.20
-chr1 1584178 rs1061892 C T 196.43 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=53.48;MQ0=0;OQ=3220.76;QD=38.34;SB=-1363.82 GT:AD:DP:GL:GQ 1/1:0,84:80:-325.67,-24.10,-0.02:99
-chr1 1584256 rs6659270 T A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=6;HaplotypeScore=1.24;MQ=50.39;MQ0=3;OQ=904.07;QD=12.05;SB=-396.42 GT:AD:DP:GL:GQ 0/1:40,35:71:-115.08,-21.39,-150.96:99
-chr1 1584361 rs7416520 C T 137.41 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.09;MQ0=1;OQ=651.60;QD=13.86;SB=-179.69 GT:AD:DP:GL:GQ 0/1:25,22:41:-80.80,-12.36,-66.61:99
-chr1 1585061 rs4307513 A G 66.26 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.44;MQ0=9;OQ=1311.89;QD=23.85;SB=-662.93 GT:AD:DP:GL:GQ 1/1:0,55:42:-134.81,-12.67,-0.04:99
-chr1 1585263 rs4313339 A G 2.76 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=25.65;MQ0=5;OQ=594.23;QD=25.84;SB=-123.88 GT:AD:DP:GL:GQ 1/1:0,23:18:-63.01,-5.42,-0.01:54.15
-chr1 1585730 rs4443835 C A 38.28 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=31.44;MQ0=8;OQ=878.16;QD=23.73;SB=-366.86 GT:AD:DP:GL:GQ 1/1:0,37:25:-91.41,-7.53,-0.01:75.22
-chr1 1586059 rs1109644 C T 45.13 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=26.30;MQ0=10;OQ=1336.40;QD=26.73;SB=-334.34 GT:AD:DP:GL:GQ 1/1:3,47:35:-137.24,-10.55,-0.01:99
-chr1 1586167 rs1109645 G A 15.01 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=25.64;MQ0=10;OQ=920.81;QD=25.58;SB=-127.66 GT:AD:DP:GL:GQ 1/1:5,31:24:-95.67,-7.23,-0.01:72.23
-chr1 1586837 rs4074020 C T 96.36 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.56;MQ0=0;OQ=1972.50;QD=37.93;SB=-886.69 GT:AD:DP:GL:GQ 1/1:0,52:51:-200.86,-15.37,-0.02:99
-chr1 1588296 . A C 37.76 DPFilter;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=2.36;SB=20.08 GT:AD:DP:GL:GQ 0/1:12,4:13:-10.98,-3.92,-35.85:70.59
-chr1 1588297 . C T 55.71 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=3.48;SB=17.08 GT:AD:DP:GL:GQ 0/1:12,4:12:-12.47,-3.61,-34.17:88.55
-chr1 1588300 . G T 70.59 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=2;HaplotypeScore=3.93;MQ=44.22;MQ0=1;QD=4.41;SB=-0.98 GT:AD:DP:GL:GQ 0/1:12,4:13:-14.26,-3.92,-32.75:99
-chr1 1588313 . A G 0.48 PASS AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=34.54;MQ0=0;OQ=106.39;QD=17.73;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:4:-14.17,-1.20,-0.00:12.04
-chr1 1588430 . A C 41.05 HARD_TO_VALIDATE;LowQual;SnpCluster AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=7.96;MQ=16.51;MQ0=4;QD=5.86;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,5:2:-7.51,-0.60,-0.00:6.02
-chr1 1588435 . G A 88.13 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=17.24;MQ0=5;QD=8.81;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,5:3:-12.30,-0.90,-0.00:9.03
-chr1 1588436 . C T 85.79 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=17.47;MQ0=5;QD=9.53;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,5:3:-12.07,-0.90,-0.00:9.03
-chr1 1588443 . T A 229.32 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.72;MQ0=5;QD=15.29;SB=-115.17 GT:AD:DP:GL:GQ 1/1:5,10:7:-26.51,-2.11,-0.00:21.07
-chr1 1589024 rs6604981 A G 620.61 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.22;MQ0=0;OQ=1995.26;QD=35.00;SB=-949.98 GT:AD:DP:GL:GQ 1/1:0,57:56:-203.13,-16.87,-0.02:99
-chr1 1589224 rs6662227 A G 24.79 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=48.28;MQ0=4;OQ=837.14;QD=23.92;SB=-301.43 GT:AD:DP:GL:GQ 1/1:0,35:27:-87.33,-8.14,-0.03:81.18
-chr1 1589250 . A G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.35;MQ=44.60;MQ0=6;OQ=197.93;QD=4.95;SB=-12.85 GT:AD:DP:GL:GQ 0/1:24,16:34:-33.32,-10.25,-92.46:99
-chr1 1589410 rs12725286 C T 1.49 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=10.99;MQ=39.64;MQ0=8;OQ=1191.02;QD=13.38;SB=-569.58 GT:AD:DP:GL:GQ 0/1:50,39:71:-143.77,-21.38,-134.51:99
-chr1 1589675 rs12729295 C T 309.36 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.48;MQ0=3;OQ=671.60;QD=8.72;SB=-350.30 GT:AD:DP:GL:GQ 0/1:53,24:68:-90.94,-20.50,-145.90:99
-chr1 1589751 rs2072923 A G 247.26 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=29.67;MQ0=6;OQ=1186.35;QD=17.98;SB=-547.83 GT:AD:DP:GL:GQ 0/1:14,52:56:-138.81,-16.89,-48.69:99
-chr1 1589844 . C T 0.07 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=10.53;MQ=52.48;MQ0=3;OQ=898.69;QD=17.28;SB=-297.81 GT:AD:DP:GL:GQ 0/1:24,28:47:-107.32,-14.16,-70.31:99
-chr1 1589914 . C G 0.11 PASS AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=2;HaplotypeScore=0.33;MQ=46.80;MQ0=0;OQ=573.53;QD=6.52;SB=39.39 GT:AD:DP:GL:GQ 0/1:67,21:88:-87.20,-26.56,-264.39:99
-chr1 1589924 . G A 1.33 PASS AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=0.49;MQ=46.92;MQ0=0;OQ=633.71;QD=6.67;SB=49.65 GT:AD:DP:GL:GQ 0/1:70,25:92:-94.37,-27.71,-247.48:99
-chr1 1590019 . C G 30.30 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=49.37;MQ0=3;OQ=641.05;QD=9.29;SB=-314.06 GT:AD:DP:GL:GQ 0/1:47,21:64:-90.20,-22.81,-187.56:99
-chr1 1590023 . C T 0.46 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=8.72;MQ=48.76;MQ0=3;OQ=551.31;QD=8.89;SB=-275.75 GT:AD:DP:GL:GQ 0/1:40,22:54:-74.68,-16.27,-125.00:99
-chr1 1590878 . G A 29.06 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=58.63;MQ0=0;OQ=418.19;QD=12.30;SB=-160.22 GT:AD:DP:GL:GQ 0/1:18,16:32:-54.75,-9.64,-59.96:99
-chr1 1590915 . G A 47.89 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.20;MQ0=0;OQ=322.06;QD=8.26;SB=-141.18 GT:AD:DP:GL:GQ 0/1:27,12:38:-46.95,-11.46,-84.40:99
-chr1 1592399 rs4648609 G C 54.97 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=906.62;QD=20.60;SB=-310.97 GT:AD:DP:GL:GQ 0/1:19,25:42:-106.61,-12.66,-75.02:99
-chr1 1592450 rs4233029 C T 90.67 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=60.00;MQ0=0;OQ=849.63;QD=19.76;SB=-437.98 GT:AD:DP:GL:GQ 0/1:15,28:37:-99.40,-11.15,-39.71:99
-chr1 1592650 rs4639697 G T 61.57 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.87;MQ=58.92;MQ0=0;OQ=2757.17;QD=35.35;SB=-1369.99 GT:AD:DP:GL:GQ 1/1:1,77:76:-279.32,-22.89,-0.02:99
-chr1 1593099 rs11523819 G A 285.98 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.60;MQ0=0;OQ=1010.41;QD=14.43;SB=-280.29 GT:AD:DP:GL:GQ 0/1:39,31:68:-124.83,-20.51,-114.09:99
-chr1 1593297 rs6699975 G T 40.53 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.04;MQ=58.42;MQ0=0;OQ=872.27;QD=15.58;SB=-424.16 GT:AD:DP:GL:GQ 0/1:24,32:48:-104.97,-14.46,-59.27:99
-chr1 1594362 rs36048328 G A 212.33 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=53.76;MQ0=0;OQ=936.15;QD=14.86;SB=-437.40 GT:AD:DP:GL:GQ 0/1:33,30:61:-115.28,-18.38,-109.00:99
-chr1 1595120 rs12736155 A C 482.21 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=48.94;MQ0=1;OQ=857.21;QD=13.61;SB=-454.19 GT:AD:DP:GL:GQ 0/1:31,32:60:-107.08,-18.07,-108.87:99
-chr1 1595458 . A G 4.92 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=5.30;MQ=27.16;MQ0=16;OQ=685.03;QD=9.01;SB=-336.52 GT:AD:DP:GL:GQ 0/1:42,34:52:-87.45,-15.67,-106.28:99
-chr1 1595935 . C A 13.79 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=13;HaplotypeScore=5.11;MQ=47.25;MQ0=0;QD=0.27;SB=44.14 GT:AD:DP:GL:GQ 0/1:44,8:42:-17.30,-12.66,-119.04:46.44
-chr1 1596150 rs28678861 G C 0.01 FDRtranche2.00to10.00 AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=6;HaplotypeScore=0.16;MQ=35.71;MQ0=1;OQ=1428.28;QD=37.59;SB=-739.75 GT:AD:DP:GL:GQ 1/1:0,38:34:-146.42,-10.25,-0.01:99
-chr1 1596170 rs61776786 G A 218.03 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.46;MQ=33.82;MQ0=1;OQ=367.66;QD=11.86;SB=-172.25 GT:AD:DP:GL:GQ 0/1:17,14:26:-47.89,-7.84,-41.82:99
-chr1 1596393 . A G 1.96 PASS AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=1.79;MQ=38.63;MQ0=2;OQ=223.84;QD=8.95;SB=-123.74 GT:AD:DP:GL:GQ 0/1:13,12:22:-32.30,-6.64,-46.25:99
-chr1 1596434 rs61776787 A G 239.06 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=27.74;MQ0=11;OQ=461.68;QD=12.82;SB=-213.08 GT:AD:DP:GL:GQ 1/1:0,36:16:-49.77,-4.83,-0.02:48.10
-chr1 1598092 rs61776790 C T 85.65 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=16.88;MQ0=18;OQ=268.46;QD=6.88;SB=-142.62 GT:AD:DP:GL:GQ 0/1:27,12:20:-36.16,-6.04,-33.65:99
-chr1 1599022 rs12724172 T G 248.35 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=48.86;MQ0=1;OQ=792.00;QD=12.00;SB=-236.82 GT:AD:DP:GL:GQ 0/1:30,36:59:-100.27,-17.78,-99.33:99
-chr1 1599028 rs12757736 A T 344.72 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=49.16;MQ0=1;OQ=842.96;QD=13.82;SB=-342.44 GT:AD:DP:GL:GQ 0/1:27,34:53:-103.55,-15.97,-87.26:99
-chr1 1600387 rs7544851 T C 182.79 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=59.17;MQ0=0;OQ=618.77;QD=11.05;SB=-250.34 GT:AD:DP:GL:GQ 0/1:28,28:48:-79.63,-14.47,-94.46:99
-chr1 1601295 rs6700884 A G 128.62 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=57.79;MQ0=0;OQ=747.49;QD=15.90;SB=-253.32 GT:AD:DP:GL:GQ 0/1:21,26:46:-91.89,-13.86,-83.83:99
-chr1 1601516 rs6695303 T C 234.37 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=57.63;MQ0=0;OQ=837.86;QD=14.45;SB=-344.58 GT:AD:DP:GL:GQ 0/1:27,31:54:-103.34,-16.27,-95.10:99
-chr1 1601858 rs4074196 A G 175.78 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.26;MQ0=0;OQ=386.06;QD=8.39;SB=-209.64 GT:AD:DP:GL:GQ 0/1:26,20:39:-53.65,-11.76,-84.70:99
-chr1 1601974 rs4074197 C T 305.80 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=818.07;QD=17.41;SB=-411.47 GT:AD:DP:GL:GQ 0/1:22,25:46:-98.95,-13.86,-71.35:99
-chr1 1602466 rs4074198 G A 258.82 PASS AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.07;MQ0=0;OQ=1998.12;QD=19.98;SB=-732.09 GT:AD:DP:GL:GQ 0/1:43,57:99:-232.92,-29.82,-143.69:99
-chr1 1602672 rs4076580 T G 4.32 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=6.99;MQ=58.71;MQ0=0;OQ=379.11;QD=10.53;SB=-115.90 GT:AD:DP:GL:GQ 0/1:20,16:35:-51.74,-10.54,-71.19:99
-chr1 1603230 . C A 105.90 PASS AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.30;MQ0=0;OQ=439.60;QD=13.32;SB=-227.94 GT:AD:DP:GL:GQ 0/1:17,16:31:-56.59,-9.34,-45.91:99
-chr1 1605211 rs7520934 A C 437.30 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=732.80;QD=12.42;SB=-285.83 GT:AD:DP:GL:GQ 0/1:28,31:56:-93.43,-16.87,-99.80:99
-chr1 1605568 rs28774670 T C 204.99 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.50;MQ0=0;OQ=582.27;QD=9.87;SB=-203.22 GT:AD:DP:GL:GQ 0/1:33,26:57:-78.69,-17.18,-127.49:99
-chr1 1605610 rs28435953 G C 130.21 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=58.73;MQ0=0;OQ=779.25;QD=14.17;SB=-322.40 GT:AD:DP:GL:GQ 0/1:29,26:52:-96.88,-15.68,-122.76:99
-chr1 1605921 rs28464677 G A 40.24 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.09;MQ=58.05;MQ0=1;OQ=855.32;QD=14.50;SB=-377.37 GT:AD:DP:GL:GQ 0/1:31,28:56:-105.70,-16.88,-92.60:99
-chr1 1606119 rs61776792 G C 0.17 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=15.64;MQ=49.02;MQ0=1;OQ=469.22;QD=9.02;SB=-238.10 GT:AD:DP:GL:GQ 0/1:28,21:33:-60.17,-9.96,-72.09:99
-chr1 1606735 . G A 20.16 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=18;HaplotypeScore=5.53;MQ=52.51;MQ0=0;QD=0.29;SB=62.21 GT:AD:DP:GL:GQ 0/1:55,14:41:-17.65,-12.36,-123.60:52.96
-chr1 1607449 rs28736713 T G 133.05 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.99;MQ=58.63;MQ0=0;OQ=1023.89;QD=16.00;SB=-507.80 GT:AD:DP:GL:GQ 0/1:29,35:64:-124.95,-19.28,-105.76:99
-chr1 1607623 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=18;HaplotypeScore=7.66;MQ=51.83;MQ0=1;OQ=52.14;QD=1.00;SB=0.53 GT:AD:DP:GL:GQ 0/1:41,11:37:-19.66,-11.16,-103.64:84.98
-chr1 1608184 rs28367203 T C 304.04 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.41;MQ0=0;OQ=680.60;QD=12.15;SB=-333.30 GT:AD:DP:GL:GQ 0/1:31,25:55:-87.91,-16.57,-127.27:99
-chr1 1608363 rs28463291 C T 163.50 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1453.08;QD=22.02;SB=-689.01 GT:AD:DP:GL:GQ 0/1:22,44:66:-168.48,-19.89,-77.76:99
-chr1 1608455 rs28366981 A G 89.05 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=57.97;MQ0=0;OQ=661.92;QD=12.98;SB=-317.10 GT:AD:DP:GL:GQ 0/1:21,30:45:-83.04,-13.57,-76.52:99
-chr1 1608461 rs28561498 G T 18.93 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=3.73;MQ=57.75;MQ0=0;OQ=745.42;QD=16.20;SB=-317.33 GT:AD:DP:GL:GQ 0/1:20,26:44:-91.08,-13.26,-59.03:99
-chr1 1608538 rs28541555 T G 156.62 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=57.89;MQ0=0;OQ=606.69;QD=12.91;SB=-204.78 GT:AD:DP:GL:GQ 0/1:20,27:44:-77.21,-13.26,-75.77:99
-chr1 1608823 rs4648780 T C 124.64 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.99;MQ0=0;OQ=1965.86;QD=28.49;SB=-779.58 GT:AD:DP:GL:GQ 1/1:0,69:63:-200.23,-19.00,-0.06:99
-chr1 1608945 rs7524863 G A 246.35 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=57.51;MQ0=0;OQ=796.58;QD=15.03;SB=-348.35 GT:AD:DP:GL:GQ 0/1:28,25:52:-98.61,-15.67,-100.29:99
-chr1 1609404 rs28487995 G A 270.45 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=56.05;MQ0=0;OQ=943.08;QD=14.97;SB=-428.82 GT:AD:DP:GL:GQ 0/1:34,29:58:-115.07,-17.48,-93.42:99
-chr1 1609630 rs9442411 T C 340.52 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.02;MQ0=2;OQ=562.05;QD=9.37;SB=-254.95 GT:AD:DP:GL:GQ 0/1:29,31:53:-75.47,-15.98,-117.16:99
-chr1 1609711 rs61776794 G C 177 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=50.27;MQ0=2;OQ=557.29;QD=11.15;SB=-303.13 GT:AD:DP:GL:GQ 0/1:25,25:40:-71.08,-12.07,-91.96:99
-chr1 1609833 . C T 8.33 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=46.17;MQ0=4;OQ=546.56;QD=9.42;SB=-24.96 GT:AD:DP:GL:GQ 0/1:34,24:50:-73.01,-15.07,-102.31:99
-chr1 1609872 . T A 2.74 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=43.11;MQ0=2;OQ=308.49;QD=7.17;SB=35.14 GT:AD:DP:GL:GQ 0/1:26,17:38:-45.58,-11.45,-97.07:99
-chr1 1609888 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.91;MQ=43.11;MQ0=0;OQ=145.44;QD=3.93;SB=26.10 GT:AD:DP:GL:GQ 0/1:23,14:31:-27.18,-9.35,-84.75:99
-chr1 1609946 . A G 0.35 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=42.17;MQ0=4;OQ=138.81;QD=3.39;SB=-12.69 GT:AD:DP:GL:GQ 0/1:29,12:37:-28.31,-11.14,-120.75:99
-chr1 1610085 rs61776797 A G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=1.23;MQ=52.83;MQ0=0;OQ=168.50;QD=4.32;SB=29.12 GT:AD:DP:GL:GQ 0/1:29,10:36:-30.98,-10.85,-111.33:99
-chr1 1610720 rs3737622 A G 151.65 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=52.83;MQ0=0;OQ=742.56;QD=16.14;SB=-328.41 GT:AD:DP:GL:GQ 0/1:21,25:45:-91.09,-13.55,-80.03:99
-chr1 1610745 rs3737623 C T 272.53 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=54.47;MQ0=0;OQ=1103.20;QD=18.09;SB=-448.99 GT:AD:DP:GL:GQ 0/1:28,33:59:-131.40,-17.79,-81.29:99
-chr1 1610764 rs3737624 G A 559.02 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=1181.67;QD=16.88;SB=-410.16 GT:AD:DP:GL:GQ 0/1:34,36:69:-142.24,-20.78,-119.02:99
-chr1 1612040 . T A 0.13 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=1.10;MQ=42.64;MQ0=1;OQ=306.88;QD=6.39;SB=17.08 GT:AD:DP:GL:GQ 0/1:34,14:39:-45.73,-11.76,-89.73:99
-chr1 1612676 rs1855706 C T 48.38 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=4.57;MQ=18.63;MQ0=42;OQ=747.37;QD=8.59;SB=-370.40 GT:AD:DP:GL:GQ 0/1:52,35:41:-90.38,-12.36,-60.67:99
-chr1 1612716 rs61776798 T C 0.25 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=7.54;MQ0=54;OQ=87.83;QD=1.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:40,23:6:-13.87,-1.81,-8.21:64.05
-chr1 1613585 rs7542306 C A 20.92 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=15.32;MQ0=21;QD=0.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,13:6:-7.18,-1.81,-14.53:53.72
-chr1 1614256 rs368915 T G 26.47 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=20.52;MQ0=9;QD=2.04;SB=-32.98 GT:AD:DP:GL:GQ 1/1:0,13:2:-6.06,-0.60,-0.00:6
-chr1 1614726 rs4648651 G A 96.84 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.04;MQ0=5;OQ=94.30;QD=5.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,5:9:-15.42,-2.71,-17.14:99
-chr1 1615466 rs35947799 G A 107.06 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.41;MQ0=0;OQ=601.60;QD=18.23;SB=-258.27 GT:AD:DP:GL:GQ 0/1:13,20:32:-73.09,-9.64,-46.27:99
-chr1 1616758 rs28587348 A G 239 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=22.66;MQ0=5;OQ=648.18;QD=9.53;SB=-227.25 GT:AD:DP:GL:GQ 0/1:39,28:59:-88.06,-19.96,-129.14:99
-chr1 1617046 rs1932228 C T 15.28 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.02;MQ0=16;OQ=210.38;QD=4.29;SB=-111.61 GT:AD:DP:GL:GQ 0/1:30,19:14:-28.54,-4.22,-22.09:99
-chr1 1617416 rs61776801 G A 266.02 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=37.27;MQ0=15;OQ=982.95;QD=15.60;SB=-353.39 GT:AD:DP:GL:GQ 0/1:28,35:47:-115.75,-14.17,-56.63:99
-chr1 1617665 rs601141 A C 373.76 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=54.30;MQ0=0;OQ=987.22;QD=15.19;SB=-461.24 GT:AD:DP:GL:GQ 0/1:31,34:63:-120.98,-18.98,-104.99:99
-chr1 1618057 rs61776802 A G 60.56 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=53.96;MQ0=1;OQ=690.37;QD=9.86;SB=-238.28 GT:AD:DP:GL:GQ 0/1:36,33:62:-91.01,-18.69,-134.09:99
-chr1 1618313 rs61776803 G T 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.46;MQ=39.85;MQ0=11;OQ=285.62;QD=3.97;SB=-133.03 GT:AD:DP:GL:GQ 0/1:51,21:59:-49.62,-17.77,-159.76:99
-chr1 1618571 rs12081891 G A 12.44 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=28.69;MQ0=14;OQ=348.19;QD=5.36;SB=-177.80 GT:AD:DP:GL:GQ 0/1:47,18:38:-49.56,-11.46,-83.32:99
-chr1 1618766 rs61776804 G A 86.02 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=43.94;MQ0=0;OQ=732.16;QD=19.27;SB=-352.49 GT:AD:DP:GL:GQ 0/1:16,22:37:-87.65,-11.15,-51.61:99
-chr1 1619321 rs4648621 G A 136.25 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=27.57;MQ0=5;OQ=508.21;QD=13.37;SB=-144.61 GT:AD:DP:GL:GQ 0/1:18,20:30:-63.15,-9.04,-45.60:99
-chr1 1619347 rs34716550 T C 0.89 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=6.10;MQ=29.73;MQ0=3;OQ=380.00;QD=9.05;SB=-24.63 GT:AD:DP:GL:GQ 0/1:23,19:33:-51.24,-9.95,-72.01:99
-chr1 1624864 rs874516 T C 339.91 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=46.52;MQ0=1;OQ=784.43;QD=15.38;SB=-383.28 GT:AD:DP:GL:GQ 0/1:22,29:49:-96.49,-14.76,-89.37:99
-chr1 1625479 rs2076329 T C 1.54 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=3.63;MQ=58.85;MQ0=0;OQ=346.77;QD=7.08;SB=-173.37 GT:AD:DP:GL:GQ 0/1:30,19:42:-50.63,-12.67,-103.10:99
-chr1 1625609 rs1136997 C A 28.98 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.88;MQ=49.57;MQ0=0;OQ=129.32;QD=4.62;SB=-74.73 GT:AD:DP:GL:GQ 0/1:19,9:24:-23.45,-7.23,-57.11:99
-chr1 1625904 rs1059822 G A 133.74 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=49.02;MQ0=1;OQ=290.88;QD=7.65;SB=-88.57 GT:AD:DP:GL:GQ 0/1:22,16:33:-42.33,-9.95,-69.30:99
-chr1 1626134 rs2179381 C T 246.87 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=42.93;MQ0=0;OQ=354.22;QD=9.84;SB=-190.16 GT:AD:DP:GL:GQ 0/1:22,14:30:-47.74,-9.04,-64.17:99
-chr1 1626190 . G A 71.25 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=48.48;MQ0=0;OQ=619.32;QD=15.48;SB=-321.82 GT:AD:DP:GL:GQ 0/1:21,19:40:-77.26,-12.05,-77.19:99
-chr1 1627098 rs61774911 A G 6.01 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.86;MQ0=3;OQ=57.73;QD=2.14;SB=17.07 GT:AD:DP:GL:GQ 0/1:19,8:19:-14.79,-5.73,-53.94:90.57
-chr1 1627115 rs9439480 A G 25.79 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=40.42;MQ0=0;QD=1.07;SB=26.10 GT:AD:DP:GL:GQ 0/1:18,5:21:-12.19,-6.33,-66.21:58.62
-chr1 1627865 rs17162876 G C 61.32 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=50.90;MQ0=0;OQ=596.59;QD=13.56;SB=-287.98 GT:AD:DP:GL:GQ 0/1:25,19:41:-75.32,-12.38,-88.05:99
-chr1 1628397 . C T 6.47 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=17.03;MQ0=21;OQ=258.72;QD=7.19;SB=-86.31 GT:AD:DP:GL:GQ 0/1:19,17:11:-32.47,-3.31,-10.93:76.22
-chr1 1628516 . G A 0.42 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=23.14;MQ0=15;OQ=161.97;QD=3.60;SB=-32.64 GT:AD:DP:GL:GQ 0/1:32,13:24:-26.72,-7.23,-54.65:99
-chr1 1629661 . T C 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=34.50;MQ0=9;OQ=82.09;QD=2.22;SB=-48.26 GT:AD:DP:GL:GQ 0/1:21,16:24:-18.73,-7.24,-70.81:99
-chr1 1631887 rs61776845 C T 226.45 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.12;MQ0=0;OQ=487.31;QD=34.81;SB=-143.63 GT:AD:DP:GL:GQ 1/1:0,14:14:-52.32,-4.22,-0.01:42.13
-chr1 1633129 rs6688326 C A 4.88 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=11.56;MQ0=25;OQ=150.41;QD=4.30;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,10:8:-20.73,-2.41,-7.32:49.07
-chr1 1634432 rs2143105 A G 2.04 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=24.63;MQ0=4;OQ=286.53;QD=16.85;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,17:11:-32.26,-3.33,-0.02:33.05
-chr1 1634696 rs2179382 G A 8.71 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=32.34;MQ0=16;OQ=279.13;QD=3.58;SB=-95.45 GT:AD:DP:GL:GQ 0/1:61,16:59:-48.98,-17.78,-155.91:99
-chr1 1634768 rs2179383 C T 205.44 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=11.72;MQ0=13;OQ=127.00;QD=6.35;SB=-51.67 GT:AD:DP:GL:GQ 1/1:0,20:4:-16.23,-1.20,-0.00:12.04
-chr1 1634910 . C T 73.11 PASS AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=12.98;MQ0=22;OQ=295.97;QD=9.25;SB=-135.01 GT:AD:DP:GL:GQ 1/1:0,32:8:-33.18,-2.41,-0.00:24.08
-chr1 1634953 . C T 62.81 PASS AC=2;AF=1.00;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=17.86;MQ0=18;OQ=384.85;QD=13.27;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,29:10:-42.07,-3.01,-0.00:30.10
-chr1 1634973 . T C 4.22 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.05;MQ0=18;OQ=118.84;QD=3.71;SB=-10.00 GT:AD:DP:GL:GQ 0/1:22,10:13:-19.08,-3.92,-33.24:99
-chr1 1634975 . C T 14.66 PASS AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=19.05;MQ0=18;OQ=504.84;QD=15.78;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,32:13:-54.07,-3.92,-0.00:39.13
-chr1 1635050 rs4279785 T C 293.02 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.94;MQ0=12;OQ=364.98;QD=8.90;SB=-161.33 GT:AD:DP:GL:GQ 0/1:23,18:28:-48.21,-8.43,-62.26:99
-chr1 1635547 rs61774919 G A 162.09 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=14.59;MQ0=11;OQ=173.64;QD=7.55;SB=-50.56 GT:AD:DP:GL:GQ 1/1:6,17:5:-20.92,-1.51,-0.00:15.05
-chr1 1635860 rs3819996 T C 34.28 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=13.67;MQ0=7;QD=3.81;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:2:-6.84,-0.60,-0.00:6.02
-chr1 1635866 rs3819997 A G 27.83 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.50;MQ0=6;QD=3.48;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:2:-6.19,-0.60,-0.00:6.01
-chr1 1635934 rs3819998 A G 17.88 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=31.93;MQ0=9;OQ=462.29;QD=12.84;SB=-95.99 GT:AD:DP:GL:GQ 0/1:9,27:21:-55.85,-6.34,-11.59:52.52
-chr1 1635937 rs3819999 G T 0.54 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=31.93;MQ0=9;OQ=663.10;QD=18.42;SB=-104.11 GT:AD:DP:GL:GQ 0/1:9,26:24:-76.82,-7.23,-11.28:40.49
-chr1 1635973 rs3820000 G C 54.40 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.49;MQ0=15;OQ=883.63;QD=21.55;SB=-127.19 GT:AD:DP:GL:GQ 1/1:8,33:25:-95.91,-7.54,-3.96:35.78
-chr1 1636091 rs3820002 T C 108.62 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.55;MQ0=2;OQ=418.10;QD=27.87;SB=-161.84 GT:AD:DP:GL:GQ 1/1:0,15:13:-45.40,-3.92,-0.01:39.10
-chr1 1636096 rs61776849 C T 171.23 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.06;MQ0=2;OQ=513.34;QD=30.20;SB=-178.68 GT:AD:DP:GL:GQ 1/1:0,17:14:-54.92,-4.22,-0.01:42.13
-chr1 1636231 rs61776850 G T 45.78 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.84;MQ=41.85;MQ0=7;OQ=641.89;QD=13.95;SB=-342.30 GT:AD:DP:GL:GQ 0/1:20,26:39:-79.22,-11.75,-58.73:99
-chr1 1636287 rs61776851 T G 219.44 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=36.80;MQ0=8;OQ=1107.10;QD=20.13;SB=-508.74 GT:AD:DP:GL:GQ 1/1:4,51:37:-114.34,-11.16,-0.05:99
-chr1 1636310 rs3820004 G A 84.02 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=34.50;MQ0=11;OQ=1585.10;QD=27.33;SB=-811.33 GT:AD:DP:GL:GQ 1/1:6,52:41:-162.11,-12.35,-0.01:99
-chr1 1636434 rs56030177 T C 84.71 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=28.90;MQ0=10;OQ=1324.64;QD=27.60;SB=-500.48 GT:AD:DP:GL:GQ 1/1:0,48:38:-136.06,-11.45,-0.01:99
-chr1 1636517 rs760926 T C 66.97 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.90;MQ0=7;OQ=976.98;QD=25.05;SB=-384.56 GT:AD:DP:GL:GQ 1/1:1,38:28:-101.29,-8.43,-0.01:84.25
-chr1 1636649 rs760927 T C 127.83 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.47;MQ0=5;OQ=898.10;QD=25.66;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,35:25:-93.41,-7.53,-0.01:75.22
-chr1 1636735 . C G 66.44 PASS AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=39.28;MQ0=9;OQ=1254.01;QD=12.80;SB=-309.31 GT:AD:DP:GL:GQ 0/1:56,42:83:-153.70,-25.01,-208.71:99
-chr1 1636777 . C T 31.32 PASS AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=38.96;MQ0=9;OQ=1301.14;QD=13.41;SB=-647.75 GT:AD:DP:GL:GQ 0/1:49,48:84:-158.72,-25.32,-141.36:99
-chr1 1636840 rs61776853 A C 1.58 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=0.97;MQ=31.48;MQ0=5;OQ=997.06;QD=27.70;SB=-256.95 GT:AD:DP:GL:GQ 1/1:0,36:30:-103.31,-9.04,-0.02:90.22
-chr1 1636845 rs61776854 C T 13.28 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=31.12;MQ0=5;OQ=595.02;QD=17.50;SB=-27.62 GT:AD:DP:GL:GQ 0/1:11,23:28:-71.23,-8.44,-30.58:99
-chr1 1636852 rs35642458 G A 71.80 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.10;MQ0=4;OQ=612.21;QD=24.49;SB=-39.52 GT:AD:DP:GL:GQ 0/1:3,22:20:-70.53,-6.02,-10.71:46.85
-chr1 1637044 rs61073446 G A 19.06 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=48.10;MQ0=1;OQ=604.36;QD=8.06;SB=-316.73 GT:AD:DP:GL:GQ 0/1:54,21:68:-84.21,-20.50,-156.95:99
-chr1 1637060 . G C 0.16 PASS AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=3.23;MQ=46.92;MQ0=1;OQ=770.35;QD=8.37;SB=83.29 GT:AD:DP:GL:GQ 0/1:66,26:89:-107.18,-26.86,-257.87:99
-chr1 1637092 . A G 13.80 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=45.24;MQ0=3;OQ=524.47;QD=7.09;SB=62.24 GT:AD:DP:GL:GQ 0/1:50,24:71:-77.11,-21.38,-201.71:99
-chr1 1637137 rs4437818 C T 70.80 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.48;MQ=37.21;MQ0=3;OQ=419.91;QD=7.63;SB=-236.03 GT:AD:DP:GL:GQ 0/1:38,17:49:-60.03,-14.76,-127.40:99
-chr1 1637159 rs760928 C T 610.42 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.78;MQ0=3;OQ=1773.57;QD=35.47;SB=-891.67 GT:AD:DP:GL:GQ 1/1:0,50:45:-180.95,-13.56,-0.01:99
-chr1 1637161 rs760929 G A 499.31 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=39.49;MQ0=3;OQ=1819.83;QD=36.40;SB=-852.64 GT:AD:DP:GL:GQ 1/1:0,50:45:-185.58,-13.55,-0.01:99
-chr1 1637349 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=12.15;MQ=53.21;MQ0=0;OQ=258.06;QD=3.04;SB=74.27 GT:AD:DP:GL:GQ 0/1:68,17:73:-51.13,-22.04,-238.97:99
-chr1 1637350 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=13.99;MQ=53.21;MQ0=0;OQ=156.60;QD=1.84;SB=74.27 GT:AD:DP:GL:GQ 0/1:68,16:78:-42.44,-23.50,-258.99:99
-chr1 1637384 rs760930 C T 155.40 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.38;MQ0=0;OQ=2369.71;QD=38.22;SB=-867.02 GT:AD:DP:GL:GQ 1/1:0,62:60:-240.58,-18.08,-0.02:99
-chr1 1637388 rs760931 G C 174.43 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.72;MQ0=0;OQ=2115.79;QD=36.48;SB=-781.25 GT:AD:DP:GL:GQ 1/1:0,58:53:-215.20,-15.99,-0.03:99
-chr1 1637546 rs56081394 A C 94.23 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=52.34;MQ0=0;OQ=2774.94;QD=32.65;SB=-1180.71 GT:AD:DP:GL:GQ 1/1:0,85:81:-281.12,-24.40,-0.04:99
-chr1 1637613 . C T 21.89 LowQual AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=50.67;MQ0=0;QD=0.27;SB=-29.39 GT:AD:DP:GL:GQ 0/1:68,12:72:-27.16,-21.69,-231.62:54.70
-chr1 1637638 . C G 0.51 PASS AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=47.75;MQ0=0;OQ=459.74;QD=4.84;SB=-189.88 GT:AD:DP:GL:GQ 0/1:65,30:83:-74.29,-25.03,-272.64:99
-chr1 1637674 . T C 96.11 PASS AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.42;MQ0=0;OQ=794.87;QD=7.87;SB=-336.87 GT:AD:DP:GL:GQ 0/1:55,46:82:-107.47,-24.70,-217.72:99
-chr1 1637731 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=47.58;MQ0=0;OQ=197.23;QD=2.38;SB=-124.83 GT:AD:DP:GL:GQ 0/1:61,22:74:-45.30,-22.29,-250.27:99
-chr1 1637788 rs1883424 A G 452.02 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.70;MQ0=0;OQ=1180.37;QD=13.26;SB=-539.57 GT:AD:DP:GL:GQ 0/1:48,41:89:-148.13,-26.81,-196.69:99
-chr1 1637887 rs61776857 T C 8.97 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=37.62;MQ0=3;OQ=1207.11;QD=23.21;SB=-211.69 GT:AD:DP:GL:GQ 1/1:2,49:41:-124.35,-12.38,-0.05:99
-chr1 1638000 . G C 4.04 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=49.72;MQ0=1;OQ=363.96;QD=6.17;SB=-28.72 GT:AD:DP:GL:GQ 0/1:37,21:48:-56.87,-17.19,-155.52:99
-chr1 1638008 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=51.97;MQ0=1;OQ=62.73;QD=1.08;SB=29.80 GT:AD:DP:GL:GQ 0/1:41,17:44:-22.82,-13.26,-168.23:95.57
-chr1 1638068 rs61776858 C T 414.28 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.78;MQ0=0;OQ=1645.34;QD=38.26;SB=-705.35 GT:AD:DP:GL:GQ 1/1:1,42:42:-168.13,-12.65,-0.01:99
-chr1 1638095 rs28722732 A C 115.66 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=48.13;MQ0=1;OQ=1285.24;QD=32.95;SB=-522.05 GT:AD:DP:GL:GQ 1/1:1,38:38:-132.12,-11.45,-0.02:99
-chr1 1638236 . G A 17.91 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=8.77;MQ=38.97;MQ0=0;QD=0.34;SB=23.08 GT:AD:DP:GL:GQ 0/1:43,6:25:-15.81,-10.75,-74.55:50.67
-chr1 1638252 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=56.73;MQ=41.68;MQ0=0;OQ=220.25;QD=3.86;SB=17.08 GT:AD:DP:GL:GQ 0/1:43,13:37:-36.47,-11.16,-97.19:99
-chr1 1638265 rs28669101 A G 1.73 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=5.08;MQ=44.94;MQ0=1;OQ=1841.80;QD=27.49;SB=-530.20 GT:AD:DP:GL:GQ 1/1:1,66:52:-187.79,-15.67,-0.02:99
-chr1 1638282 . T C 372.16 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=2;HaplotypeScore=20.32;MQ=48.81;MQ0=1;QD=5.64;SB=53.20 GT:AD:DP:GL:GQ 0/1:48,18:62:-59.18,-18.68,-176.85:99
-chr1 1638285 . G A 362.16 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=22.88;MQ=49.05;MQ0=1;QD=5.57;SB=50.16 GT:AD:DP:GL:GQ 0/1:45,17:60:-57.59,-18.09,-158.00:99
-chr1 1638291 . G T 350.74 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=36.28;MQ=47.79;MQ0=1;QD=5.48;SB=47.16 GT:AD:DP:GL:GQ 0/1:46,17:57:-55.53,-17.18,-142.31:99
-chr1 1638353 . T C 4.41 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=49.10;MQ0=0;OQ=579.45;QD=7.24;SB=-118.38 GT:AD:DP:GL:GQ 0/1:52,28:75:-83.82,-22.59,-209.22:99
-chr1 1638397 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.02;HRun=4;HaplotypeScore=13.77;MQ=49.39;MQ0=0;OQ=1251.99;QD=12.16;SB=-214.10 GT:AD:DP:GL:GQ 0/1:54,47:95:-156.50,-28.02,-195.84:99
-chr1 1638484 rs61776859 C A 0.46 PASS AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=1;HaplotypeScore=3.66;MQ=44.01;MQ0=0;OQ=2573.54;QD=19.06;SB=-1062.18 GT:AD:DP:GL:GQ 0/1:54,81:126:-298.59,-37.95,-167.48:99
-chr1 1638485 . A G 2.65 PASS AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=44.20;MQ0=0;OQ=954.08;QD=7.07;SB=27.40 GT:AD:DP:GL:GQ 0/1:81,54:124:-136.06,-37.37,-329.92:99
-chr1 1638496 . A C 4.42 PASS AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=43.37;MQ0=0;OQ=1281.45;QD=9.42;SB=-10.58 GT:AD:DP:GL:GQ 0/1:80,56:126:-169.38,-37.95,-296.59:99
-chr1 1638502 . T C 3.56 PASS AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=44.49;MQ0=0;OQ=1373.44;QD=10.25;SB=-79.40 GT:AD:DP:GL:GQ 0/1:76,58:123:-177.67,-37.05,-300.79:99
-chr1 1638544 . C T 171.39 PASS AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=48.39;MQ0=0;OQ=1993.39;QD=14.44;SB=-439.97 GT:AD:DP:GL:GQ 0/1:62,76:123:-239.68,-37.06,-213.30:99
-chr1 1638628 . C T 21.95 PASS AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=49.90;MQ0=0;OQ=1604.78;QD=15.14;SB=-725.65 GT:AD:DP:GL:GQ 0/1:52,53:100:-193.90,-30.14,-170.77:99
-chr1 1638640 . A C 22.88 PASS AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=47.54;MQ0=0;OQ=1027.76;QD=10.18;SB=-470.68 GT:AD:DP:GL:GQ 0/1:56,45:93:-134.07,-28.01,-207.58:99
-chr1 1638645 . G C 1.18 PASS AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=6.44;MQ=47.94;MQ0=0;OQ=1189.28;QD=12.14;SB=-604.90 GT:AD:DP:GL:GQ 0/1:56,42:91:-149.63,-27.42,-247.05:99
-chr1 1638691 rs61777460 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=1;HaplotypeScore=70.95;MQ=45.55;MQ0=0;OQ=1598.01;QD=14.14;SB=-702.52 GT:AD:DP:GL:GQ 0/1:53,60:107:-195.32,-32.23,-214.62:99
-chr1 1638728 . T A 0.06 PASS AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=48.71;MQ0=0;OQ=2481.89;QD=16.22;SB=-1020.86 GT:AD:DP:GL:GQ 0/1:71,82:150:-296.65,-45.18,-270.24:99
-chr1 1638806 rs909824 T C 0.61 PASS AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=50.30;MQ0=0;OQ=2209.99;QD=14.35;SB=-996.92 GT:AD:DP:GL:GQ 0/1:79,75:150:-269.47,-45.19,-301.46:99
-chr1 1638825 rs61777461 C T 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=50.48;MQ0=0;OQ=2137.82;QD=14.95;SB=-1070.06 GT:AD:DP:GL:GQ 0/1:71,72:135:-257.74,-40.67,-255.42:99
-chr1 1638946 . C T 467.64 SnpCluster AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=32.37;MQ=43.71;MQ0=5;QD=7.19;SB=-205.68 GT:AD:DP:GL:GQ 0/1:44,21:47:-64.21,-14.16,-108.79:99
-chr1 1638954 . T C 736.34 SnpCluster AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=21.87;MQ=42.89;MQ0=5;QD=12.70;SB=-358.18 GT:AD:DP:GL:GQ 0/1:23,35:42:-89.58,-12.66,-57.09:99
-chr1 1638955 . G A 193.46 SnpCluster AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=28.88;MQ=42.53;MQ0=5;QD=3.39;SB=-66.48 GT:AD:DP:GL:GQ 0/1:44,13:42:-35.29,-12.66,-112.58:99
-chr1 1638965 rs61777464 A G 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=17.05;MQ=41.40;MQ0=5;OQ=280.02;QD=5.83;SB=-138.25 GT:AD:DP:GL:GQ 0/1:30,18:32:-40.93,-9.64,-84.27:99
-chr1 1638997 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=41.45;MQ0=4;OQ=154.17;QD=3.08;SB=35.12 GT:AD:DP:GL:GQ 0/1:37,12:37:-29.85,-11.15,-98.68:99
-chr1 1639030 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=25.29;MQ=40.65;MQ0=7;OQ=247.09;QD=2.75;SB=50.20 GT:AD:DP:GL:GQ 0/1:68,21:63:-46.97,-18.98,-193.46:99
-chr1 1639109 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=25.12;MQ=46.53;MQ0=4;OQ=115.22;QD=1.05;SB=83.25 GT:AD:DP:GL:GQ 0/1:96,13:84:-40.14,-25.34,-234.06:99
-chr1 1639113 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=24.12;MQ=46.66;MQ0=4;OQ=396.71;QD=3.64;SB=8.10 GT:AD:DP:GL:GQ 0/1:82,27:87:-69.20,-26.24,-219.98:99
-chr1 1639145 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=44.81;MQ=46.42;MQ0=3;OQ=230.67;QD=1.94;SB=-28.38 GT:AD:DP:GL:GQ 0/1:92,27:94:-54.66,-28.31,-297.41:99
-chr1 1639152 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=23.68;MQ=46.30;MQ0=1;OQ=1088.67;QD=9.07;SB=-62.94 GT:AD:DP:GL:GQ 0/1:69,50:95:-140.79,-28.64,-195.69:99
-chr1 1639166 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=19.38;MQ=46.56;MQ0=1;OQ=479.08;QD=3.89;SB=-121.97 GT:AD:DP:GL:GQ 0/1:92,31:101:-81.65,-30.45,-258.17:99
-chr1 1639203 . C T 59.61 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=106;Dels=0.01;HRun=4;HaplotypeScore=28.93;MQ=49.66;MQ0=0;QD=0.56;SB=37.04 GT:AD:DP:GL:GQ 0/1:84,20:85:-34.85,-25.61,-268.94:92.45
-chr1 1639204 . A G 88.80 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=34.26;MQ=50.07;MQ0=0;QD=0.81;SB=122.42 GT:AD:DP:GL:GQ 0/1:87,23:90:-39.28,-27.11,-316.10:99
-chr1 1639210 . T G 106.61 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=109.94;MQ=48.22;MQ0=0;QD=0.90;SB=107.36 GT:AD:DP:GL:GQ 0/1:99,20:91:-41.35,-27.41,-290.49:99
-chr1 1639221 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=51.18;MQ=48.34;MQ0=0;OQ=110.59;QD=0.87;SB=-36.37 GT:AD:DP:GL:GQ 0/1:109,18:89:-41.16,-26.82,-305.73:99
-chr1 1639227 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=3;HaplotypeScore=53.65;MQ=47.85;MQ0=2;OQ=61.26;QD=0.48;SB=63.76 GT:AD:DP:GL:GQ 0/1:90,38:88:-35.92,-26.51,-284.90:94.09
-chr1 1639237 . A T 220.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=2;HaplotypeScore=39.50;MQ=47.38;MQ0=3;QD=1.53;SB=98.34 GT:AD:DP:GL:GQ 0/1:108,36:102:-56.01,-30.73,-323.39:99
-chr1 1639238 . T C 363.43 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=40.62;MQ=46.99;MQ0=4;QD=2.51;SB=-35.37 GT:AD:DP:GL:GQ 0/1:115,29:91:-67.04,-27.41,-296.52:99
-chr1 1639239 . T G 307.74 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=40.46;MQ=46.55;MQ0=5;QD=2.08;SB=5.35 GT:AD:DP:GL:GQ 0/1:110,36:106:-65.98,-31.93,-325.39:99
-chr1 1639244 . C G 433.01 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=0;HaplotypeScore=72.81;MQ=46.68;MQ0=6;QD=2.87;SB=-83.32 GT:AD:DP:GL:GQ 0/1:112,37:109:-82.29,-35.70,-402.49:99
-chr1 1639252 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=2;HaplotypeScore=45.12;MQ=45.10;MQ0=7;OQ=932.16;QD=6.13;SB=-397.36 GT:AD:DP:GL:GQ 0/1:117,33:103:-127.53,-31.03,-261.51:99
-chr1 1639301 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=21.56;MQ=40.71;MQ0=20;OQ=622.52;QD=6.35;SB=-215.64 GT:AD:DP:GL:GQ 0/1:52,46:51:-80.90,-15.37,-137.71:99
-chr1 1639318 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=38.28;MQ=34.31;MQ0=28;OQ=125.27;QD=1.35;SB=-14.91 GT:AD:DP:GL:GQ 0/1:76,17:35:-26.35,-10.54,-101.55:99
-chr1 1639325 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=5.46;MQ=33.52;MQ0=28;OQ=116.93;QD=1.38;SB=23.07 GT:AD:DP:GL:GQ 0/1:73,12:33:-24.93,-9.95,-86.29:99
-chr1 1639374 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=20.02;MQ=34.37;MQ0=20;OQ=192.31;QD=2.19;SB=-88.00 GT:AD:DP:GL:GQ 0/1:73,15:45:-36.07,-13.55,-128.18:99
-chr1 1639407 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=42.54;MQ0=9;OQ=114.05;QD=1.02;SB=-8.75 GT:AD:DP:GL:GQ 0/1:85,19:71:-46.36,-31.67,-236.26:99
-chr1 1639417 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=4;HaplotypeScore=17.30;MQ=43.78;MQ0=5;OQ=74.87;QD=0.61;SB=-8.76 GT:AD:DP:GL:GQ 0/1:106,16:83:-35.80,-25.03,-240.05:99
-chr1 1639441 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=3;HaplotypeScore=5.23;MQ=45.90;MQ0=8;OQ=109.77;QD=0.77;SB=-10.15 GT:AD:DP:GL:GQ 0/1:120,22:103:-45.28,-31.02,-334.31:99
-chr1 1639479 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=26.42;MQ=48.72;MQ0=12;OQ=76.35;QD=0.64;SB=70.54 GT:AD:DP:GL:GQ 0/1:100,20:90:-38.04,-27.12,-310.60:99
-chr1 1639492 . C T 15.20 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=3;HaplotypeScore=52.40;MQ=48.82;MQ0=15;QD=0.14;SB=67.73 GT:AD:DP:GL:GQ 0/1:90,22:79:-28.59,-23.80,-254.17:47.90
-chr1 1639499 rs36141200 G A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=107;Dels=0.01;HRun=0;HaplotypeScore=32.74;MQ=48.53;MQ0=15;OQ=2982.80;QD=27.88;SB=-1344.29 GT:AD:DP:GL:GQ 1/1:0,106:74:-301.88,-22.29,-0.02:99
-chr1 1639600 rs36135823 C T 0.07 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=3;HaplotypeScore=14.31;MQ=43.93;MQ0=12;OQ=2247.07;QD=26.44;SB=-416.38 GT:AD:DP:GL:GQ 1/1:10,75:60:-232.21,-18.08,-3.91:99
-chr1 1639610 rs34963151 A T 0.17 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=15.64;MQ=43.34;MQ0=11;OQ=1936.12;QD=25.14;SB=-344.48 GT:AD:DP:GL:GQ 1/1:5,72:55:-200.25,-16.56,-3.05:99
-chr1 1639612 rs36137888 T G 0.67 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=11.64;MQ=43.34;MQ0=11;OQ=1831.08;QD=23.78;SB=-311.74 GT:AD:DP:GL:GQ 1/1:2,72:55:-190.04,-16.56,-3.35:99
-chr1 1639702 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=34.54;MQ=35.32;MQ0=37;OQ=98.37;QD=0.75;SB=39.28 GT:AD:DP:GL:GQ 0/1:59,72:53:-29.08,-15.96,-156.59:99
-chr1 1639726 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=70.45;MQ=36.36;MQ0=39;OQ=52.18;QD=0.37;SB=48.69 GT:AD:DP:GL:GQ 0/1:67,74:65:-28.09,-19.58,-201.69:85.02
-chr1 1639861 . C T 25.55 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=57.75;MQ=41.48;MQ0=14;QD=0.18;SB=-23.37 GT:AD:DP:GL:GQ 0/1:90,50:90:-32.98,-27.15,-260.27:58.37
-chr1 1639867 . C T 19.37 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=3;HaplotypeScore=75.47;MQ=41.18;MQ0=14;QD=0.14;SB=-17.32 GT:AD:DP:GL:GQ 0/1:97,46:92:-32.93,-27.71,-303.81:52.16
-chr1 1639892 rs61777469 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.04;HRun=2;HaplotypeScore=74.14;MQ=41.98;MQ0=12;OQ=2469.47;QD=18.43;SB=-1178.56 GT:AD:DP:GL:GQ 0/1:25,104:86:-276.13,-25.90,-32.75:68.49
-chr1 1639893 rs61777470 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=137.24;MQ=41.98;MQ0=12;OQ=2615.52;QD=19.52;SB=-1204.51 GT:AD:DP:GL:GQ 0/1:44,90:89:-291.64,-26.81,-37.18:99
-chr1 1639911 . G A 14.93 LowQual AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=26.42;MQ=45.76;MQ0=10;QD=0.13;SB=-12.75 GT:AD:DP:GL:GQ 0/1:81,37:78:-28.28,-23.52,-231.19:47.63
-chr1 1639962 rs61777471 C T 260.52 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=54.09;MQ0=1;OQ=1805.36;QD=37.61;SB=-829.34 GT:AD:DP:GL:GQ 1/1:0,48:47:-184.14,-14.16,-0.02:99
-chr1 1640060 rs1969650 A C 38.33 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=47.36;MQ0=0;OQ=1283.12;QD=25.66;SB=-659.19 GT:AD:DP:GL:GQ 1/1:0,50:43:-131.95,-12.97,-0.05:99
-chr1 1640123 rs1967676 G T 619.20 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.68;MQ0=0;OQ=2013.64;QD=35.33;SB=-938.04 GT:AD:DP:GL:GQ 1/1:0,57:55:-204.96,-16.56,-0.01:99
-chr1 1640270 rs1967677 T C 0.01 FDRtranche2.00to10.00 AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=23.68;MQ=51.29;MQ0=1;OQ=2260.88;QD=25.69;SB=-1076.20 GT:AD:DP:GL:GQ 1/1:7,81:78:-241.90,-23.52,-12.23:99
-chr1 1640284 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=21.65;MQ=49.80;MQ0=1;OQ=283.77;QD=2.56;SB=107.23 GT:AD:DP:GL:GQ 0/1:95,16:94:-60.00,-28.34,-253.49:99
-chr1 1640321 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=250.42;MQ=48.13;MQ0=0;OQ=561.76;QD=3.98;SB=122.35 GT:AD:DP:GL:GQ 0/1:98,27:119:-99.13,-39.67,-333.17:99
-chr1 1640332 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=158;Dels=0.00;HRun=0;HaplotypeScore=133.26;MQ=46.63;MQ0=0;OQ=950.96;QD=6.02;SB=119.36 GT:AD:DP:GL:GQ 0/1:94,64:124:-135.74,-37.36,-315.76:99
-chr1 1640347 . T C 550.46 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=23.57;MQ=45.32;MQ0=0;QD=3.72;SB=95.35 GT:AD:DP:GL:GQ 0/1:118,30:114:-92.67,-34.34,-350.75:99
-chr1 1640368 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=38.96;MQ=45.47;MQ0=0;OQ=414.73;QD=2.94;SB=65.22 GT:AD:DP:GL:GQ 0/1:119,22:108:-77.29,-32.53,-317.79:99
-chr1 1640378 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=4;HaplotypeScore=21.61;MQ=45.56;MQ0=0;OQ=227.10;QD=1.77;SB=59.14 GT:AD:DP:GL:GQ 0/1:110,18:98:-55.53,-29.53,-284.49:99
-chr1 1640389 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=23.69;MQ=45.00;MQ0=0;OQ=372.62;QD=3.11;SB=38.14 GT:AD:DP:GL:GQ 0/1:83,37:73:-62.56,-22.01,-186.44:99
-chr1 1640393 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=31.49;MQ=46.43;MQ0=0;OQ=193.70;QD=1.67;SB=47.18 GT:AD:DP:GL:GQ 0/1:63,52:78:-46.16,-23.50,-255.92:99
-chr1 1640402 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=3;HaplotypeScore=44.61;MQ=47.57;MQ0=0;OQ=589.53;QD=5.51;SB=47.18 GT:AD:DP:GL:GQ 0/1:71,36:90:-89.34,-27.11,-243.28:99
-chr1 1640405 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=32.67;MQ=47.67;MQ0=0;OQ=576.56;QD=5.54;SB=44.17 GT:AD:DP:GL:GQ 0/1:79,25:85:-86.54,-25.60,-227.82:99
-chr1 1640428 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=12.31;MQ=51.68;MQ0=0;OQ=687.66;QD=7.47;SB=59.21 GT:AD:DP:GL:GQ 0/1:63,29:86:-97.95,-25.90,-226.28:99
-chr1 1640435 . T C 0.39 PASS AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=52.41;MQ0=0;OQ=479.95;QD=4.95;SB=65.24 GT:AD:DP:GL:GQ 0/1:69,28:91:-78.69,-27.41,-274.97:99
-chr1 1640479 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=10.56;MQ=53.01;MQ0=0;OQ=125.57;QD=1.23;SB=55.33 GT:AD:DP:GL:GQ 0/1:77,25:89:-42.65,-26.81,-277.44:99
-chr1 1640500 . C A 40.46 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=5.00;MQ=52.43;MQ0=0;QD=0.42;SB=79.01 GT:AD:DP:GL:GQ 0/1:71,25:78:-30.82,-23.49,-254.06:73.30
-chr1 1640502 . T G 39.38 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=52.41;MQ0=0;QD=0.40;SB=58.40 GT:AD:DP:GL:GQ 0/1:73,26:82:-31.92,-24.69,-274.53:72.21
-chr1 1640517 . C G 1.85 PASS AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.82;MQ0=0;OQ=540.14;QD=4.54;SB=-210.84 GT:AD:DP:GL:GQ 0/1:81,38:99:-87.13,-29.83,-340.31:99
-chr1 1640647 rs17845218 T C 5.93 PASS AC=1;AF=0.50;AN=2;DB;DP=139;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=46.16;MQ0=1;OQ=829.41;QD=5.97;SB=-392.09 GT:AD:DP:GL:GQ 0/1:85,54:124:-123.60,-37.37,-339.83:99
-chr1 1640657 rs1059830 A G 689.07 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=46.01;MQ0=1;QD=5.07;SB=-273.97 GT:AD:DP:GL:GQ 0/1:84,52:114:-106.55,-34.36,-315.05:99
-chr1 1640661 rs1137004 T C 924.56 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=137;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.08;MQ0=1;QD=6.75;SB=-478.80 GT:AD:DP:GL:GQ 0/1:82,55:116:-130.68,-34.94,-330.64:99
-chr1 1640667 rs3200657 T C 2206.14 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=43.98;MQ0=1;QD=16.59;SB=-708.39 GT:AD:DP:GL:GQ 0/1:59,73:112:-259.82,-35.92,-162.90:99
-chr1 1640692 . A G 15.57 PASS AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=41.55;MQ0=0;OQ=1129.49;QD=8.89;SB=-491.78 GT:AD:DP:GL:GQ 0/1:59,68:99:-146.06,-29.83,-231.81:99
-chr1 1640705 rs1059831 G A 307.80 PASS AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=41.79;MQ0=0;OQ=1854.51;QD=15.72;SB=-686.99 GT:AD:DP:GL:GQ 0/1:63,55:86:-214.65,-25.92,-105.31:99
-chr1 1640780 rs36191908 G A 2.57 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=50.84;MQ0=0;OQ=222.00;QD=2.52;SB=-69.38 GT:AD:DP:GL:GQ 0/1:66,22:78:-49.00,-23.51,-215.31:99
-chr1 1640799 . G A 26.24 LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.16;MQ0=0;QD=0.29;SB=-18.77 GT:AD:DP:GL:GQ 0/1:79,12:87:-32.13,-26.22,-265.70:59.07
-chr1 1640856 . T C 1.18 PASS AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=51.06;MQ0=0;OQ=537.04;QD=4.84;SB=42.60 GT:AD:DP:GL:GQ 0/1:73,38:93:-85.00,-28.02,-284.38:99
-chr1 1640863 . G A 0.15 PASS AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=50.41;MQ0=0;OQ=682.37;QD=6.20;SB=40.52 GT:AD:DP:GL:GQ 0/1:69,41:93:-99.55,-28.03,-223.44:99
-chr1 1640907 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=91;Dels=0.01;HRun=2;HaplotypeScore=10.49;MQ=48.20;MQ0=0;OQ=731.52;QD=8.04;SB=71.23 GT:AD:DP:GL:GQ 0/1:53,37:73:-98.42,-21.99,-174.07:99
-chr1 1640923 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=64.78;MQ=43.84;MQ0=1;OQ=272.78;QD=3.17;SB=56.20 GT:AD:DP:GL:GQ 0/1:67,19:80:-54.67,-24.11,-250.01:99
-chr1 1640931 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=98.55;MQ=40.13;MQ0=1;OQ=147.14;QD=2.16;SB=38.15 GT:AD:DP:GL:GQ 0/1:57,11:64:-37.28,-19.28,-217.64:99
-chr1 1640986 . A C 0.64 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=43.40;MQ0=0;OQ=371.72;QD=5.81;SB=77.22 GT:AD:DP:GL:GQ 0/1:47,17:62:-59.13,-18.68,-158.05:99
-chr1 1640996 . C T 0.49 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=45.56;MQ0=0;OQ=291.78;QD=4.63;SB=80.17 GT:AD:DP:GL:GQ 0/1:49,14:56:-49.34,-16.88,-145.60:99
-chr1 1641016 . C T 53.74 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=51.28;MQ0=0;QD=0.87;SB=74.21 GT:AD:DP:GL:GQ 0/1:47,15:50:-23.72,-15.06,-152.06:86.58
-chr1 1641017 . A G 257.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=51.43;MQ0=0;QD=4.08;SB=80.28 GT:AD:DP:GL:GQ 0/1:48,15:61:-47.39,-18.39,-179.46:99
-chr1 1641026 . C T 369.95 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=52.99;MQ0=0;QD=5.97;SB=74.25 GT:AD:DP:GL:GQ 0/1:47,15:60:-58.35,-18.07,-168.55:99
-chr1 1641040 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=51.94;MQ0=0;OQ=253.54;QD=4.23;SB=74.26 GT:AD:DP:GL:GQ 0/1:44,15:55:-45.26,-16.62,-168.61:99
-chr1 1641126 rs12137617 A G 24.87 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=54.87;MQ0=0;OQ=1275.18;QD=31.10;SB=-536.43 GT:AD:DP:GL:GQ 1/1:0,41:37:-131.12,-11.15,-0.02:99
-chr1 1641482 rs11260627 C T 34.89 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=55.33;MQ0=0;OQ=1435.98;QD=36.82;SB=-496.00 GT:AD:DP:GL:GQ 1/1:0,39:37:-147.19,-11.15,-0.01:99
-chr1 1641491 rs12135951 T G 20.84 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=56.50;MQ0=0;OQ=197.57;QD=5.20;SB=-66.56 GT:AD:DP:GL:GQ 0/1:25,13:35:-33.59,-10.55,-90.46:99
-chr1 1641587 rs12044811 G A 0.08 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=15.92;MQ=55.20;MQ0=1;OQ=1462.24;QD=35.66;SB=-578.76 GT:AD:DP:GL:GQ 1/1:1,40:37:-149.82,-11.15,-0.01:99
-chr1 1641608 rs12044814 G C 398.84 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.85;MQ0=0;OQ=998.26;QD=30.25;SB=-358.22 GT:AD:DP:GL:GQ 1/1:1,32:26:-103.43,-7.84,-0.02:78.25
-chr1 1641675 rs4648768 T C 52.50 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=49.39;MQ0=0;OQ=640.24;QD=18.29;SB=-205.57 GT:AD:DP:GL:GQ 1/1:0,32:21:-67.63,-6.34,-0.02:63.13
-chr1 1641761 rs4648772 T C 503.17 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.21;MQ0=0;OQ=1369.78;QD=30.44;SB=-625.00 GT:AD:DP:GL:GQ 1/1:0,45:43:-140.60,-12.97,-0.03:99
-chr1 1641771 rs4648773 C A 18.84 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.41;MQ=54.78;MQ0=0;OQ=1559.28;QD=33.90;SB=-751.90 GT:AD:DP:GL:GQ 1/1:0,46:44:-159.53,-13.25,-0.02:99
-chr1 1641797 rs4648775 G A 91.99 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=54.06;MQ0=0;OQ=1591.86;QD=36.18;SB=-734.99 GT:AD:DP:GL:GQ 1/1:0,44:41:-162.79,-12.35,-0.01:99
-chr1 1641822 rs4648776 G A 529.47 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.06;MQ0=0;OQ=1730.65;QD=38.46;SB=-774.66 GT:AD:DP:GL:GQ 1/1:0,45:44:-176.66,-13.26,-0.01:99
-chr1 1642086 rs4648777 A G 238.91 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.56;MQ0=1;OQ=1172.89;QD=24.44;SB=-406.15 GT:AD:DP:GL:GQ 1/1:1,47:39:-120.92,-11.77,-0.04:99
-chr1 1642864 rs36039898 T C 113.78 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.55;MQ0=0;OQ=2211.83;QD=36.26;SB=-727.29 GT:AD:DP:GL:GQ 1/1:0,61:61:-224.79,-18.37,-0.02:99
-chr1 1642888 rs16825265 C T 105.46 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=54.90;MQ0=0;OQ=2464.17;QD=40.40;SB=-985.30 GT:AD:DP:GL:GQ 1/1:0,61:61:-250.01,-18.37,-0.01:99
-chr1 1643163 rs35548050 T C 620.20 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.02;MQ0=0;OQ=2383.87;QD=34.06;SB=-1115.83 GT:AD:DP:GL:GQ 1/1:0,70:67:-241.99,-20.18,-0.02:99
-chr1 1643221 rs2206307 C T 629.97 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.40;MQ0=0;OQ=2196.71;QD=34.87;SB=-1116.03 GT:AD:DP:GL:GQ 1/1:0,63:57:-223.28,-17.18,-0.02:99
-chr1 1643274 rs2206308 C T 615.08 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.68;MQ0=0;OQ=2077.20;QD=37.77;SB=-1010.04 GT:AD:DP:GL:GQ 1/1:0,55:53:-211.32,-15.97,-0.02:99
-chr1 1643659 rs2223485 C T 454.72 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.70;MQ0=1;OQ=1724.40;QD=36.69;SB=-535.21 GT:AD:DP:GL:GQ 1/1:0,47:43:-176.03,-12.95,-0.01:99
-chr1 1643745 rs61777493 C A 268.51 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=53.15;MQ0=3;OQ=2449.58;QD=34.50;SB=-1240.29 GT:AD:DP:GL:GQ 1/1:3,68:66:-248.56,-19.87,-0.01:99
-chr1 1643867 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=19.40;MQ0=14;OQ=84.98;QD=3.04;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,15:12:-15.40,-3.61,-30.71:99
-chr1 1643873 . C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=27;Dels=0.41;HRun=0;HaplotypeScore=83.92;MQ=18.34;MQ0=14;OQ=350.65;QD=12.99;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:10:-42.29,-6.54,-3.64:28.97
-chr1 1643898 rs61777494 G A 157 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.17;MQ0=2;OQ=461.81;QD=27.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,16:12:-49.77,-3.61,-0.00:36.12
-chr1 1643918 rs61777495 C T 757.85 Indel AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.37;MQ0=1;QD=31.58;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,23:19:-79.37,-5.72,-0.00:57.19
-chr1 1643924 . A T 950.73 Indel AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.62;MQ0=1;QD=30.67;SB=-180.94 GT:AD:DP:GL:GQ 1/1:1,30:26:-98.67,-7.83,-0.01:78.24
-chr1 1644591 rs61777496 G A 138.94 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.34;MQ0=0;OQ=130.88;QD=26.18;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:4:-16.62,-1.20,-0.00:12.04
-chr1 1644813 rs2056977 A G 170.73 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.65;MQ0=9;OQ=292.06;QD=7.69;SB=-147.83 GT:AD:DP:GL:GQ 1/1:7,31:10:-32.80,-3.01,-0.01:30.08
-chr1 1645334 rs11486024 G A 35.89 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=22.46;MQ0=10;OQ=345.89;QD=5.67;SB=32.11 GT:AD:DP:GL:GQ 0/1:46,15:32:-47.52,-9.65,-66.64:99
-chr1 1645788 rs28649027 G C 26.17 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=53.44;MQ0=0;OQ=593.92;QD=15.23;SB=-280.31 GT:AD:DP:GL:GQ 0/1:20,19:36:-73.54,-10.87,-73.49:99
-chr1 1646881 rs61777497 T C 0.39 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=11.68;MQ0=43;OQ=71.62;QD=1.23;SB=-32.65 GT:AD:DP:GL:GQ 0/1:40,18:10:-13.46,-3.01,-23.67:99
-chr1 1646928 . C T 0.40 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=15.38;MQ0=21;OQ=97.42;QD=2.87;SB=-39.65 GT:AD:DP:GL:GQ 0/1:20,14:7:-15.13,-2.11,-10.71:85.98
-chr1 1646938 rs61776763 A G 17.48 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.10;MQ=17.28;MQ0=15;OQ=266.90;QD=8.34;SB=-88.98 GT:AD:DP:GL:GQ 1/1:0,32:9:-30.28,-2.71,-0.01:27.04
-chr1 1646996 rs4648783 T C 206.37 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=31.62;MQ0=1;OQ=494.82;QD=9.00;SB=-214.36 GT:AD:DP:GL:GQ 0/1:25,30:43:-65.73,-12.96,-90.44:99
-chr1 1647044 rs4648784 C G 2.96 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.82;MQ=32.49;MQ0=8;OQ=1818.45;QD=23.93;SB=-827.04 GT:AD:DP:GL:GQ 0/1:14,62:58:-202.62,-17.49,-37.52:99
-chr1 1647352 rs9439501 G C 210.43 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=45.38;MQ0=4;OQ=1643.24;QD=34.96;SB=-614.99 GT:AD:DP:GL:GQ 1/1:0,47:39:-167.92,-11.75,-0.01:99
-chr1 1647425 rs11576302 G A 125.25 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=52.45;MQ0=0;OQ=868.24;QD=17.72;SB=-259.77 GT:AD:DP:GL:GQ 0/1:23,26:49:-104.87,-14.76,-83.38:99
-chr1 1647461 rs11589282 T C 44.46 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=51.71;MQ0=1;OQ=1927.78;QD=33.24;SB=-715.12 GT:AD:DP:GL:GQ 1/1:0,58:56:-196.39,-16.87,-0.02:99
-chr1 1648203 rs4648785 T C 8.14 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=39.29;MQ0=4;OQ=1376.56;QD=30.59;SB=-396.50 GT:AD:DP:GL:GQ 1/1:0,45:38:-141.25,-11.44,-0.01:99
-chr1 1648805 rs1062057 T C 6.42 PASS AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=3.69;MQ=25.80;MQ0=25;OQ=1469.54;QD=13.86;SB=-734.60 GT:AD:DP:GL:GQ 0/1:45,61:78:-173.74,-23.50,-116.68:99
-chr1 1649970 rs1801781 C A 600.71 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.53;MQ0=0;OQ=2075.47;QD=36.41;SB=-874.83 GT:AD:DP:GL:GQ 1/1:0,57:57:-211.15,-17.17,-0.01:99
-chr1 1650495 rs2377220 T G 497.64 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.20;MQ0=1;OQ=1908.80;QD=31.81;SB=-547.03 GT:AD:DP:GL:GQ 1/1:0,60:54:-194.48,-16.27,-0.02:99
-chr1 1650579 . G C 24.29 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=9.52;MQ=48.11;MQ0=12;QD=0.34;SB=80.30 GT:AD:DP:GL:GQ 0/1:60,12:43:-18.68,-12.97,-167.36:57.11
-chr1 1650586 rs28662997 T C 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=7.30;MQ=48.54;MQ0=13;OQ=175.02;QD=2.22;SB=-47.44 GT:AD:DP:GL:GQ 0/1:53,26:60:-38.86,-18.08,-194.29:99
-chr1 1650595 rs1061883 T C 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=49.38;MQ0=13;OQ=60.20;QD=0.69;SB=-8.74 GT:AD:DP:GL:GQ 0/1:58,29:65:-28.90,-19.59,-216.78:93.04
-chr1 1651158 rs1546882 A G 91.08 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.86;MQ=36.24;MQ0=1;OQ=1126.99;QD=14.09;SB=-474.67 GT:AD:DP:GL:GQ 0/1:32,48:73:-138.00,-22.01,-116.79:99
-chr1 1651704 rs61777505 G C 26.06 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=32.64;MQ0=2;OQ=1226.35;QD=32.27;SB=-479.52 GT:AD:DP:GL:GQ 1/1:4,34:33:-134.22,-9.95,-8.01:19.39
-chr1 1652175 . C G 107.65 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.31;MQ0=18;OQ=446.15;QD=8.42;SB=-112.32 GT:AD:DP:GL:GQ 0/1:32,21:35:-58.45,-10.56,-85.98:99
-chr1 1652288 rs2281171 A G 55.47 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.68;MQ=47.07;MQ0=0;OQ=1046.84;QD=33.77;SB=-483.46 GT:AD:DP:GL:GQ 1/1:0,31:31:-108.28,-9.34,-0.01:93.26
-chr1 1652674 rs61777506 T C 260.73 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.10;MQ0=0;OQ=1515.24;QD=32.94;SB=-289.56 GT:AD:DP:GL:GQ 1/1:0,46:45:-155.13,-13.56,-0.02:99
-chr1 1652697 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=17;HaplotypeScore=26.60;MQ=53.41;MQ0=0;OQ=216.45;QD=3.80;SB=47.16 GT:AD:DP:GL:GQ 0/1:42,15:40:-36.99,-12.06,-92.34:99
-chr1 1652700 . G A 48.19 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=19.75;MQ=52.95;MQ0=0;QD=0.96;SB=53.18 GT:AD:DP:GL:GQ 0/1:40,10:33:-18.05,-9.95,-95.61:81.03
-chr1 1652755 rs61777507 A G 615.92 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1969.12;QD=34.55;SB=-927.86 GT:AD:DP:GL:GQ 1/1:0,57:57:-200.52,-17.17,-0.03:99
-chr1 1653262 rs34298494 A C 3.15 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=4.92;MQ=57.93;MQ0=0;OQ=1820.14;QD=28.89;SB=-933.22 GT:AD:DP:GL:GQ 1/1:0,63:59:-185.65,-17.78,-0.05:99
-chr1 1653465 . A G 0.67 PASS AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.82;MQ=58.69;MQ0=0;OQ=1218.77;QD=28.34;SB=-585.02 GT:AD:DP:GL:GQ 1/1:0,43:39:-125.50,-11.76,-0.03:99
-chr1 1653691 rs3817856 C T 262.98 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=59.21;MQ0=0;OQ=2006.29;QD=37.85;SB=-990.80 GT:AD:DP:GL:GQ 1/1:0,53:51:-204.23,-15.37,-0.02:99
-chr1 1653879 rs2294488 T C 118.63 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=52.10;MQ0=0;OQ=1419.75;QD=28.40;SB=-681.96 GT:AD:DP:GL:GQ 1/1:0,49:45:-145.60,-13.57,-0.04:99
-chr1 1653984 rs2294489 T C 14.56 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=58.58;MQ0=0;OQ=1353.88;QD=31.49;SB=-691.09 GT:AD:DP:GL:GQ 1/1:0,43:40:-138.99,-12.05,-0.02:99
-chr1 1655431 rs61777508 T G 492.95 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.47;MQ0=3;OQ=2585.92;QD=31.92;SB=-532.88 GT:AD:DP:GL:GQ 1/1:0,81:75:-262.21,-22.59,-0.04:99
-chr1 1655473 rs4648764 A G 513.83 PASS AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.46;MQ0=4;OQ=2874.97;QD=29.64;SB=-827.61 GT:AD:DP:GL:GQ 1/1:1,96:86:-291.13,-25.92,-0.05:99
-chr1 1655600 rs2281176 T C 43.16 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=43.78;MQ0=0;OQ=2374.61;QD=30.44;SB=-588.04 GT:AD:DP:GL:GQ 1/1:0,78:71:-241.09,-21.40,-0.04:99
-chr1 1655607 rs2281177 T C 16.19 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=43.12;MQ0=0;OQ=1801.45;QD=22.24;SB=-550.84 GT:AD:DP:GL:GQ 0/1:17,64:75:-206.03,-22.60,-57.34:99
-chr1 1656111 . G A 19.94 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=24.98;MQ0=9;OQ=1269.10;QD=20.14;SB=-363.89 GT:AD:DP:GL:GQ 0/1:20,43:51:-145.56,-15.37,-46.93:99
-chr1 1656198 rs2072924 G A 130.85 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=29.23;MQ0=3;OQ=1510.31;QD=34.33;SB=-636.84 GT:AD:DP:GL:GQ 1/1:0,44:39:-154.63,-11.75,-0.02:99
-chr1 1656202 rs2072925 A G 35.86 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=31.20;MQ0=3;OQ=1130.90;QD=24.58;SB=-545.87 GT:AD:DP:GL:GQ 1/1:0,46:37:-116.71,-11.16,-0.04:99
-chr1 1656475 rs2076325 C T 114.33 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=50.53;MQ0=0;OQ=1787.32;QD=37.24;SB=-867.16 GT:AD:DP:GL:GQ 1/1:0,48:46:-182.33,-13.86,-0.01:99
-chr1 1657113 rs1474648 T C 589.09 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.20;MQ0=0;OQ=2447.49;QD=32.63;SB=-1145.82 GT:AD:DP:GL:GQ 1/1:0,75:68:-248.35,-20.48,-0.02:99
-chr1 1657231 rs1474649 A G 31.11 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=49.42;MQ0=0;OQ=1497.15;QD=33.27;SB=-642.31 GT:AD:DP:GL:GQ 1/1:0,45:43:-153.31,-12.95,-0.02:99
-chr1 1657279 rs2377208 A C 135.92 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=44.04;MQ0=1;OQ=1645.48;QD=30.47;SB=-668.23 GT:AD:DP:GL:GQ 1/1:0,54:48:-168.15,-14.46,-0.02:99
-chr1 1658028 rs28718827 G T 1.42 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=10.14;MQ=51.62;MQ0=0;OQ=1872.10;QD=31.73;SB=-828.68 GT:AD:DP:GL:GQ 1/1:2,57:55:-190.82,-16.57,-0.03:99
-chr1 1658119 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=18;HaplotypeScore=24.79;MQ=51.46;MQ0=0;OQ=102.87;QD=1.49;SB=-23.99 GT:AD:DP:GL:GQ 0/1:55,12:49:-28.05,-14.47,-131.71:99
-chr1 1658135 rs2889577 A G 0.64 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=15.54;MQ=53.86;MQ0=0;OQ=1611.78;QD=21.78;SB=-529.45 GT:AD:DP:GL:GQ 1/1:8,66:53:-172.54,-15.98,-7.77:82.05
-chr1 1658803 rs28537345 A C 60.48 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.02;HRun=1;HaplotypeScore=0.16;MQ=51.80;MQ0=0;OQ=1884.76;QD=31.95;SB=-820.50 GT:AD:DP:GL:GQ 1/1:0,58:56:-192.08,-16.57,-0.02:99
-chr1 1659088 rs11485870 T C 2.06 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=5.25;MQ=48.74;MQ0=0;OQ=1314.03;QD=25.77;SB=-582.00 GT:AD:DP:GL:GQ 1/1:2,49:46:-142.54,-13.87,-7.55:63.21
-chr1 1659426 rs9442408 C T 56.19 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=38.94;MQ0=1;OQ=469.40;QD=7.96;SB=-62.79 GT:AD:DP:GL:GQ 0/1:41,18:57:-67.39,-17.17,-141.22:99
-chr1 1659594 rs61777512 G T 329.49 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.52;MQ0=1;OQ=761.00;QD=27.18;SB=-349.52 GT:AD:DP:GL:GQ 1/1:2,26:23:-79.70,-6.93,-0.01:69.17
-chr1 1659896 . C A 16.91 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=18.32;MQ0=25;OQ=324.85;QD=7.55;SB=-33.35 GT:AD:DP:GL:GQ 0/1:14,29:14:-39.99,-4.22,-11.38:71.59
-chr1 1659905 . C T 19.49 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=18.62;MQ0=24;OQ=356.25;QD=8.28;SB=-31.52 GT:AD:DP:GL:GQ 0/1:14,29:15:-43.43,-4.52,-12.58:80.58
-chr1 1661214 rs2005995 G A 408.17 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=11.78;MQ0=23;OQ=327.72;QD=9.93;SB=-165.22 GT:AD:DP:GL:GQ 1/1:16,17:9:-36.36,-2.71,-0.00:27.09
-chr1 1661590 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.96;MQ=36.56;MQ0=3;OQ=54.36;QD=1.05;SB=68.26 GT:AD:DP:GL:GQ 0/1:38,14:35:-19.28,-10.56,-129.90:87.20
-chr1 1661642 rs4648793 C T 457.64 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.04;MQ0=0;OQ=1470.76;QD=37.71;SB=-587.27 GT:AD:DP:GL:GQ 1/1:0,39:38:-150.68,-11.45,-0.01:99
-chr1 1661726 rs7364986 A T 4.25 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=5.15;MQ=47.34;MQ0=1;OQ=2656.76;QD=33.63;SB=-1106.52 GT:AD:DP:GL:GQ 1/1:0,79:72:-269.28,-21.69,-0.02:99
-chr1 1662002 . C T 0.16 PASS AC=2;AF=1.00;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.72;MQ=52.52;MQ0=1;OQ=1857.08;QD=37.14;SB=-705.36 GT:AD:DP:GL:GQ 1/1:0,50:47:-189.31,-14.16,-0.02:99
-chr1 1662772 . C T 43.11 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=50.80;MQ0=2;QD=0.70;SB=83.20 GT:AD:DP:GL:GQ 0/1:53,9:53:-23.58,-15.98,-150.38:75.94
-chr1 1663032 . T C 46.58 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=53.54;MQ0=2;QD=0.93;SB=38.12 GT:AD:DP:GL:GQ 0/1:38,9:34:-18.20,-10.26,-102.10:79.41
-chr1 1663379 rs35790103 T C 8.23 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=-0.24;MQ=57.22;MQ0=0;OQ=1409.71;QD=33.56;SB=-634.30 GT:AD:DP:GL:GQ 1/1:0,42:41:-144.58,-12.35,-0.02:99
-chr1 1663767 rs35678883 G C 8.07 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=2.38;MQ=50.72;MQ0=2;OQ=2425.38;QD=39.12;SB=-647.42 GT:AD:DP:GL:GQ 1/1:0,62:56:-246.15,-16.88,-0.03:99
-chr1 1663886 rs36050429 G C 377.70 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.29;MQ0=3;OQ=1259.11;QD=34.03;SB=-328.71 GT:AD:DP:GL:GQ 1/1:0,37:30:-129.51,-9.04,-0.01:90.30
-chr1 1664767 . G C 282.90 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.97;MQ0=0;OQ=606.08;QD=13.77;SB=-320.01 GT:AD:DP:GL:GQ 0/1:24,20:40:-75.96,-12.06,-88.71:99
-chr1 1664855 . A G 129.97 Indel AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=9.28;MQ=43.11;MQ0=1;QD=4.06;SB=-24.89 GT:AD:DP:GL:GQ 0/1:24,8:26:-24.12,-7.84,-71.93:99
-chr1 1664856 . G A 433.28 Indel AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=12;HaplotypeScore=9.83;MQ=42.77;MQ0=1;QD=12.74;SB=-25.59 GT:AD:DP:GL:GQ 0/1:18,16:29:-55.35,-8.74,-47.19:99
-chr1 1665027 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=13;HaplotypeScore=3.74;MQ=53.18;MQ0=0;OQ=78.07;QD=1.28;SB=0.76 GT:AD:DP:GL:GQ 0/1:47,14:45:-24.65,-13.56,-131.48:99
-chr1 1665395 . C T 17.70 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.53;MQ=22.06;MQ0=30;QD=0.34;SB=14.07 GT:AD:DP:GL:GQ 0/1:42,10:21:-11.37,-6.32,-66.25:50.46
-chr1 1667416 rs16824474 G C 10.38 LowQual AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=47.86;MQ0=3;QD=0.61;SB=-0.97 GT:AD:DP:GL:GQ 0/1:12,5:14:-8.50,-4.22,-50.97:42.79
-chr1 1670869 . G C 14.33 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=45.06;MQ0=4;QD=0.19;SB=74.28 GT:AD:DP:GL:GQ 0/1:64,12:62:-23.39,-18.69,-239.55:47
-chr1 1670881 . G C 19.24 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.38;MQ=42.81;MQ0=4;QD=0.27;SB=74.28 GT:AD:DP:GL:GQ 0/1:59,12:59:-22.99,-17.79,-226.11:52.02
-chr1 1670904 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=38.22;MQ0=4;OQ=63.86;QD=0.91;SB=56.13 GT:AD:DP:GL:GQ 0/1:50,20:51:-25.06,-15.39,-141.72:96.69
-chr1 1670928 . G A 848.58 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=30.83;MQ0=10;QD=13.91;SB=-297.25 GT:AD:DP:GL:GQ 0/1:30,31:35:-98.68,-10.54,-33.99:99
-chr1 1670936 . G T 255.10 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=3;HaplotypeScore=4.00;MQ=28.80;MQ0=12;QD=3.99;SB=20.07 GT:AD:DP:GL:GQ 0/1:33,31:36:-39.64,-10.84,-86.07:99
-chr1 1671525 rs35301881 C T 26.84 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=43.35;MQ0=4;OQ=980.88;QD=30.65;SB=-483.00 GT:AD:DP:GL:GQ 1/1:4,28:26:-101.68,-7.83,-0.01:78.25
-chr1 1672234 rs4648812 G A 127.32 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=26.23;MQ0=1;OQ=275.04;QD=7.86;SB=-150.63 GT:AD:DP:GL:GQ 0/1:24,11:30:-39.83,-9.05,-63.69:99
-chr1 1673187 rs14390 C T 78.82 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=730.68;QD=36.53;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,20:19:-76.66,-5.72,-0.00:57.19
-chr1 1673425 rs12588 G A 34.78 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=30.14;MQ0=16;OQ=466.02;QD=6.66;SB=-83.01 GT:AD:DP:GL:GQ 0/1:47,23:47:-64.06,-14.17,-100.00:99
-chr1 1675073 rs2072928 C G 44.21 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.71;MQ=59.55;MQ0=0;OQ=1934.62;QD=37.93;SB=-835.43 GT:AD:DP:GL:GQ 1/1:0,51:47:-197.07,-14.17,-0.02:99
-chr1 1675900 rs4751 G T 24.68 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.42;MQ=59.65;MQ0=0;OQ=1889.22;QD=34.99;SB=-617.91 GT:AD:DP:GL:GQ 1/1:0,54:52:-192.52,-15.66,-0.02:99
-chr1 1676803 rs2072929 T C 69.29 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1256.22;QD=28.55;SB=-491.53 GT:AD:DP:GL:GQ 1/1:0,44:41:-129.26,-12.37,-0.05:99
-chr1 1676822 rs2076327 C T 34.01 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=58.97;MQ0=0;OQ=1637.49;QD=36.39;SB=-774.03 GT:AD:DP:GL:GQ 1/1:0,45:43:-167.35,-12.96,-0.02:99
-chr1 1677485 rs34306661 T C 77.88 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=60.00;MQ0=0;OQ=1787.88;QD=27.94;SB=-566.94 GT:AD:DP:GL:GQ 1/1:0,64:57:-182.43,-17.19,-0.05:99
-chr1 1677651 . C T 157.32 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=1381.04;QD=20.92;SB=-549.37 GT:AD:DP:GL:GQ 0/1:23,43:64:-160.68,-19.29,-80.55:99
-chr1 1677956 . C T 7.81 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=59.68;MQ0=0;OQ=1209.30;QD=20.50;SB=-531.10 GT:AD:DP:GL:GQ 0/1:22,37:56:-141.09,-16.88,-73.03:99
-chr1 1678052 rs2281173 A G 576.86 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1215.40;QD=30.39;SB=-536.99 GT:AD:DP:GL:GQ 1/1:0,40:39:-125.17,-11.77,-0.04:99
-chr1 1678329 rs4648623 C G 0.20 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.16;MQ0=0;OQ=844.68;QD=36.73;SB=-124.74 GT:AD:DP:GL:GQ 1/1:0,23:22:-88.07,-6.64,-0.02:66.21
-chr1 1678373 rs4648624 G T 1.77 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.84;MQ0=0;OQ=639.15;QD=31.96;SB=-120.84 GT:AD:DP:GL:GQ 1/1:0,20:19:-67.51,-5.72,-0.01:57.16
-chr1 1679024 rs2235536 C T 173.64 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.47;MQ0=0;OQ=2302.66;QD=39.70;SB=-1126.49 GT:AD:DP:GL:GQ 1/1:0,58:58:-233.87,-17.47,-0.02:99
-chr1 1679622 rs2235537 T C 108.22 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=59.56;MQ0=0;OQ=1772.95;QD=33.45;SB=-589.32 GT:AD:DP:GL:GQ 1/1:0,53:52:-180.90,-15.67,-0.02:99
-chr1 1681624 . G A 66.45 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=58.28;MQ0=0;OQ=379.97;QD=10.00;SB=-141.64 GT:AD:DP:GL:GQ 0/1:24,13:33:-51.23,-9.94,-69.72:99
-chr1 1682181 rs1107910 T C 610.89 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1733.17;QD=30.41;SB=-652.94 GT:AD:DP:GL:GQ 1/1:0,57:55:-176.95,-16.58,-0.05:99
-chr1 1683963 rs2011384 A G 3.98 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=4.20;MQ=58.55;MQ0=0;OQ=1546.21;QD=34.36;SB=-525.21 GT:AD:DP:GL:GQ 1/1:0,45:43:-158.22,-12.95,-0.01:99
-chr1 1684111 . C T 6.27 PASS AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=5.81;MQ=58.90;MQ0=0;OQ=1337.84;QD=16.12;SB=-601.14 GT:AD:DP:GL:GQ 0/1:40,41:79:-160.90,-23.83,-119.77:99
-chr1 1685322 rs4648629 C A 210.40 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.13;MQ0=0;OQ=2599.96;QD=34.67;SB=-1123.97 GT:AD:DP:GL:GQ 1/1:0,75:71:-263.60,-21.38,-0.02:99
-chr1 1685434 rs876029 G T 83.73 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1202.21;QD=31.64;SB=-492.27 GT:AD:DP:GL:GQ 1/1:0,38:36:-123.83,-10.85,-0.02:99
-chr1 1685691 rs63093560 C T 514.92 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=1899.13;QD=37.98;SB=-713.35 GT:AD:DP:GL:GQ 1/1:0,50:49:-193.52,-14.77,-0.02:99
-chr1 1686194 rs35270315 A C 13.33 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=3.38;MQ=58.28;MQ0=0;OQ=2324.40;QD=30.19;SB=-1042.79 GT:AD:DP:GL:GQ 1/1:0,77:73:-236.08,-22.00,-0.06:99
-chr1 1686519 . A G 162.43 PASS AC=2;AF=1.00;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1839.98;QD=29.21;SB=-784.98 GT:AD:DP:GL:GQ 1/1:0,63:60:-187.66,-18.11,-0.08:99
-chr1 1687967 rs35086222 C T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=6;HaplotypeScore=6.25;MQ=58.18;MQ0=0;OQ=2341.51;QD=37.77;SB=-1078.61 GT:AD:DP:GL:GQ 1/1:1,61:60:-237.76,-18.08,-0.02:99
-chr1 1688667 rs4648826 C G 14.69 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=58.62;MQ0=0;OQ=2540.02;QD=41.64;SB=-864.78 GT:AD:DP:GL:GQ 1/1:0,61:58:-257.61,-17.48,-0.02:99
-chr1 1689061 rs4648827 C A 174 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2030.67;QD=34.42;SB=-1001.13 GT:AD:DP:GL:GQ 1/1:1,58:58:-206.68,-17.47,-0.02:99
-chr1 1692374 rs6658139 T C 285.34 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.82;MQ0=0;OQ=1093.26;QD=29.55;SB=-273.03 GT:AD:DP:GL:GQ 0/1:3,34:37:-123.62,-11.15,-11.29:1.44
-chr1 1694514 rs61774982 C A 248.31 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.73;MQ0=0;OQ=726.51;QD=34.60;SB=-285.07 GT:AD:DP:GL:GQ 1/1:0,21:21:-76.24,-6.33,-0.01:63.18
-chr1 1695016 . T A 11.74 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=37;Dels=0.03;HRun=0;HaplotypeScore=27.67;MQ=32.06;MQ0=0;QD=0.32;SB=-25.92 GT:AD:DP:GL:GQ 0/1:10,26:10:-7.44,-3.01,-29.53:44.28
-chr1 1695024 . T A 13.63 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=9.62;MQ=29.68;MQ0=0;QD=0.39;SB=-25.92 GT:AD:DP:GL:GQ 0/1:9,26:10:-7.64,-3.01,-29.53:46.28
-chr1 1695026 . T A 81.80 SnpCluster AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=32.06;MQ0=0;QD=2.21;SB=-59.89 GT:AD:DP:GL:GQ 0/1:8,29:12:-15.08,-3.61,-28.63:99
-chr1 1695028 . T A 128.81 SnpCluster AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=32.06;MQ0=0;QD=3.48;SB=-77.75 GT:AD:DP:GL:GQ 0/1:7,30:9:-18.88,-2.71,-13.92:99
-chr1 1695464 rs61774983 A G 565.11 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.28;MQ0=0;OQ=1675.23;QD=34.19;SB=-712.27 GT:AD:DP:GL:GQ 1/1:0,49:49:-171.13,-14.76,-0.02:99
-chr1 1695607 rs6603809 G A 610.11 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1827.34;QD=36.55;SB=-919.23 GT:AD:DP:GL:GQ 1/1:0,50:48:-186.34,-14.47,-0.02:99
-chr1 1695633 rs6603810 A G 70.23 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.63;MQ0=1;OQ=1141.91;QD=27.85;SB=-557.89 GT:AD:DP:GL:GQ 1/1:0,41:37:-117.81,-11.16,-0.04:99
-chr1 1695996 rs6603811 T C 513.06 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1134.00;QD=29.08;SB=-433.18 GT:AD:DP:GL:GQ 1/1:0,39:37:-117.03,-11.17,-0.04:99
-chr1 1696020 rs7531583 A G 565.84 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1293.98;QD=28.76;SB=-649.94 GT:AD:DP:GL:GQ 1/1:0,45:43:-133.03,-12.97,-0.04:99
-chr1 1697600 rs12041925 T G 3.96 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=58.61;MQ0=0;OQ=1724.62;QD=29.73;SB=-619.85 GT:AD:DP:GL:GQ 1/1:0,58:53:-176.09,-15.97,-0.04:99
-chr1 1702090 rs10907194 C T 0.75 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=5.73;MQ=57.94;MQ0=0;OQ=1197.78;QD=35.23;SB=-529.68 GT:AD:DP:GL:GQ 1/1:1,33:31:-123.37,-9.34,-0.01:93.30
-chr1 1703208 rs10907195 C T 76.64 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.55;MQ0=0;OQ=1814.27;QD=37.80;SB=-686.40 GT:AD:DP:GL:GQ 1/1:0,48:45:-185.02,-13.55,-0.01:99
-chr1 1703574 rs454577 T G 67.40 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=652.72;QD=31.08;SB=-294.53 GT:AD:DP:GL:GQ 1/1:0,21:20:-68.87,-6.03,-0.01:60.16
-chr1 1703729 rs7534617 T G 38.29 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.38;MQ0=0;OQ=1200.11;QD=32.44;SB=-519.95 GT:AD:DP:GL:GQ 1/1:0,37:36:-123.61,-10.85,-0.02:99
-chr1 1704871 rs742359 C A 251.57 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.49;MQ0=0;OQ=1398.04;QD=31.07;SB=-698.80 GT:AD:DP:GL:GQ 1/1:0,45:41:-143.41,-12.36,-0.02:99
-chr1 1706848 . G A 26.61 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=3.11;MQ=59.44;MQ0=0;QD=0.65;SB=62.22 GT:AD:DP:GL:GQ 0/1:33,8:34:-16.19,-10.25,-103.26:59.43
-chr1 1709327 . C A 45.07 LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=18;HaplotypeScore=15.97;MQ=51.18;MQ0=0;QD=1.07;SB=-1.26 GT:AD:DP:GL:GQ 0/1:34,8:30:-16.83,-9.04,-86.61:77.90
-chr1 1710980 . G C 20.70 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.37;MQ=53.66;MQ0=1;QD=0.48;SB=38.15 GT:AD:DP:GL:GQ 0/1:38,5:37:-16.51,-11.16,-138.32:53.50
-chr1 1712688 rs3737627 G A 389.56 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1534.00;QD=37.41;SB=-461.61 GT:AD:DP:GL:GQ 1/1:0,41:41:-157.01,-12.36,-0.03:99
-chr1 1715121 rs7545812 A G 362.56 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2055.38;QD=33.69;SB=-1042.38 GT:AD:DP:GL:GQ 1/1:0,61:58:-209.15,-17.47,-0.02:99
-chr1 1715620 rs6690956 C T 11.88 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=58.81;MQ0=0;OQ=2937.89;QD=37.67;SB=-1197.36 GT:AD:DP:GL:GQ 1/1:0,77:75:-297.40,-22.60,-0.03:99
-chr1 1716741 . G A 184.26 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=52.39;MQ0=0;OQ=1148.50;QD=16.18;SB=-579.64 GT:AD:DP:GL:GQ 0/1:37,34:69:-138.94,-20.80,-109.67:99
-chr1 1718547 rs6603794 C G 73.37 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.81;MQ=57.85;MQ0=0;OQ=2921.36;QD=42.96;SB=-1363.94 GT:AD:DP:GL:GQ 1/1:0,68:67:-295.74,-20.18,-0.02:99
-chr1 1722071 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.01;HRun=18;HaplotypeScore=24.45;MQ=58.30;MQ0=0;OQ=60.55;QD=0.72;SB=155.39 GT:AD:DP:GL:GQ 0/1:70,13:70:-30.14,-20.80,-197.36:93.38
-chr1 1724830 rs12077553 C T 351.52 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.34;MQ0=0;OQ=2450.74;QD=39.53;SB=-952.27 GT:AD:DP:GL:GQ 1/1:0,62:62:-248.68,-18.68,-0.02:99
-chr1 1726513 rs12134783 T G 35.44 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=59.11;MQ0=0;OQ=1936.28;QD=28.47;SB=-959.69 GT:AD:DP:GL:GQ 1/1:0,68:64:-197.28,-19.30,-0.07:99
-chr1 1726715 rs11260613 A G 12.97 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=55.98;MQ0=0;OQ=727.27;QD=23.46;SB=-220.64 GT:AD:DP:GL:GQ 1/1:0,31:24:-76.34,-7.24,-0.02:72.14
-chr1 1728231 rs11585349 C T 444.74 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.78;MQ0=0;OQ=853.44;QD=13.13;SB=-325.29 GT:AD:DP:GL:GQ 0/1:37,28:63:-107.61,-18.98,-131.07:99
-chr1 1728793 . C A 11.24 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=87;Dels=0.01;HRun=20;HaplotypeScore=12.66;MQ=49.01;MQ0=7;QD=0.13;SB=83.42 GT:AD:DP:GL:GQ 0/1:67,19:60:-22.45,-18.07,-182.40:43.74
-chr1 1731385 rs12407008 A G 570.73 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1462.68;QD=34.02;SB=-730.24 GT:AD:DP:GL:GQ 1/1:0,43:43:-149.87,-12.95,-0.02:99
-chr1 1733337 rs4648725 G C 64.92 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=54.96;MQ0=0;OQ=2515.07;QD=40.57;SB=-1047.66 GT:AD:DP:GL:GQ 1/1:0,62:59:-255.12,-17.78,-0.02:99
-chr1 1733967 rs6603795 T C 231.72 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.62;MQ0=0;OQ=1265.69;QD=28.77;SB=-184.41 GT:AD:DP:GL:GQ 1/1:0,44:42:-130.20,-12.68,-0.05:99
-chr1 1736016 rs12408690 A G 634.80 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1961.02;QD=35.02;SB=-638.31 GT:AD:DP:GL:GQ 1/1:0,56:56:-199.70,-16.87,-0.02:99
-chr1 1736120 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=20;HaplotypeScore=11.72;MQ=42.99;MQ0=2;OQ=648.30;QD=8.64;SB=8.14 GT:AD:DP:GL:GQ 0/1:44,31:58:-85.60,-17.49,-115.79:99
-chr1 1737932 . A T 32.39 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=5;HaplotypeScore=48.11;MQ=56.04;MQ0=0;QD=0.40;SB=116.40 GT:AD:DP:GL:GQ 0/1:65,15:66:-26.41,-19.89,-217.38:65.23
-chr1 1737943 . C T 27.67 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=20;HaplotypeScore=10.01;MQ=51.69;MQ0=1;QD=0.36;SB=101.33 GT:AD:DP:GL:GQ 0/1:61,16:52:-21.72,-15.67,-162.40:60.50
-chr1 1739272 . T G 33.88 PASS AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=58.21;MQ0=0;OQ=1071.30;QD=13.56;SB=-555.72 GT:AD:DP:GL:GQ 0/1:40,39:77:-133.61,-23.19,-145.75:99
-chr1 1741546 rs12140085 T C 459.98 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.38;MQ0=0;OQ=960.01;QD=14.12;SB=-398.30 GT:AD:DP:GL:GQ 0/1:32,36:66:-119.17,-19.88,-129.12:99
-chr1 1741636 rs11260615 A G 471.98 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.06;MQ0=1;OQ=1308.14;QD=29.07;SB=-638.27 GT:AD:DP:GL:GQ 1/1:1,44:42:-134.44,-12.67,-0.04:99
-chr1 1742815 rs4648726 C T 274.47 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=3089.56;QD=40.12;SB=-1427.40 GT:AD:DP:GL:GQ 1/1:0,77:77:-312.56,-23.19,-0.02:99
-chr1 1743224 rs7542340 T C 171.92 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=-0.06;MQ=58.50;MQ0=0;OQ=2101.69;QD=35.62;SB=-1028.76 GT:AD:DP:GL:GQ 1/1:0,59:59:-213.77,-17.77,-0.02:99
-chr1 1744541 . G A 32.03 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=61;Dels=0.03;HRun=20;HaplotypeScore=23.82;MQ=51.57;MQ0=1;QD=0.53;SB=71.26 GT:AD:DP:GL:GQ 0/1:45,13:49:-20.64,-14.16,-151.56:64.87
-chr1 1748886 rs9786963 T C 652.35 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1920.23;QD=32.55;SB=-686.89 GT:AD:DP:GL:GQ 1/1:0,59:59:-195.65,-17.79,-0.04:99
-chr1 1748914 rs10907187 G A 586.04 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2397.92;QD=36.89;SB=-817.09 GT:AD:DP:GL:GQ 1/1:0,65:65:-243.43,-19.61,-0.05:99
-chr1 1750849 rs12568603 A C 141.73 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=1462.88;QD=34.02;SB=-618.64 GT:AD:DP:GL:GQ 1/1:0,43:43:-149.89,-12.95,-0.02:99
-chr1 1751196 rs1999704 A C 13.93 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.14;MQ=56.69;MQ0=1;OQ=2047.05;QD=32.49;SB=-593.04 GT:AD:DP:GL:GQ 1/1:1,62:59:-208.31,-17.77,-0.02:99
-chr1 1751865 rs11260616 A T 0.13 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=6;HaplotypeScore=1.13;MQ=59.11;MQ0=0;OQ=1852.12;QD=35.62;SB=-771.53 GT:AD:DP:GL:GQ 1/1:0,52:52:-188.82,-15.67,-0.02:99
-chr1 1751874 rs7553640 T C 711.95 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1893.02;QD=35.06;SB=-889.04 GT:AD:DP:GL:GQ 1/1:0,54:53:-192.90,-15.97,-0.02:99
-chr1 1752558 rs6603796 T C 171.81 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.20;MQ0=0;OQ=1646.02;QD=32.27;SB=-583.16 GT:AD:DP:GL:GQ 1/1:0,51:48:-168.22,-14.47,-0.03:99
-chr1 1755443 rs6603797 T C 720.20 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=2694.93;QD=35.46;SB=-935.73 GT:AD:DP:GL:GQ 1/1:0,76:74:-273.10,-22.29,-0.02:99
-chr1 1755954 rs6663586 A C 220.63 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.45;MQ0=0;OQ=1370.69;QD=32.64;SB=-604.02 GT:AD:DP:GL:GQ 1/1:0,42:40:-140.67,-12.05,-0.02:99
-chr1 1756219 rs6603798 A G 29.08 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=55.51;MQ0=2;OQ=1475.64;QD=28.38;SB=-669.92 GT:AD:DP:GL:GQ 1/1:2,50:47:-151.19,-14.18,-0.04:99
-chr1 1757221 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=20;HaplotypeScore=10.23;MQ=53.30;MQ0=1;OQ=618.88;QD=9.67;SB=31.58 GT:AD:DP:GL:GQ 0/1:38,25:58:-82.66,-17.49,-122.37:99
-chr1 1758520 rs10752417 C G 0.14 PASS AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=5.58;MQ=57.83;MQ0=0;OQ=4550.45;QD=42.93;SB=-2086.29 GT:AD:DP:GL:GQ 1/1:0,106:103:-454.04,-31.03,-0.03:99
-chr1 1758754 rs10907188 C T 32.55 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=58.85;MQ0=1;OQ=2558.37;QD=38.18;SB=-882.18 GT:AD:DP:GL:GQ 1/1:1,66:64:-259.44,-19.28,-0.02:99
-chr1 1759918 rs6603799 T C 1.47 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=56.09;MQ0=0;OQ=1988.53;QD=33.14;SB=-981.94 GT:AD:DP:GL:GQ 1/1:1,59:56:-202.45,-16.87,-0.02:99
-chr1 1760648 rs6657357 C G 301.74 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.38;MQ0=0;OQ=2954.84;QD=38.37;SB=-1347.06 GT:AD:DP:GL:GQ 1/1:0,77:74:-299.12,-22.32,-0.05:99
-chr1 1760649 rs6665287 T A 112.70 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.39;MQ0=0;OQ=2934.49;QD=37.15;SB=-1492.41 GT:AD:DP:GL:GQ 1/1:0,79:78:-297.05,-23.49,-0.02:99
-chr1 1762348 rs6603800 T G 88.85 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.54;MQ0=0;OQ=1401.85;QD=28.04;SB=-481.90 GT:AD:DP:GL:GQ 1/1:0,50:43:-143.80,-12.96,-0.03:99
-chr1 1762595 rs10907189 T C 215.16 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.73;MQ0=1;OQ=2558.08;QD=35.53;SB=-1178.50 GT:AD:DP:GL:GQ 1/1:1,71:71:-259.41,-21.39,-0.02:99
-chr1 1763512 rs11260618 A G 251.61 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=34.24;MQ0=0;OQ=1296.92;QD=19.36;SB=-537.23 GT:AD:DP:GL:GQ 1/1:0,67:42:-133.32,-12.67,-0.05:99
-chr1 1763520 rs11260619 C G 204.70 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=32.31;MQ0=0;OQ=1789.21;QD=27.11;SB=-722.93 GT:AD:DP:GL:GQ 1/1:0,66:41:-182.52,-12.35,-0.01:99
-chr1 1763525 rs11260620 T C 490.04 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.33;MQ0=0;OQ=1197.40;QD=18.42;SB=-469.25 GT:AD:DP:GL:GQ 1/1:0,65:37:-123.35,-11.15,-0.02:99
-chr1 1763536 rs11260621 T C 53.91 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=32.77;MQ0=1;OQ=1342.11;QD=19.74;SB=-614.98 GT:AD:DP:GL:GQ 1/1:1,67:42:-137.83,-12.66,-0.03:99
-chr1 1763632 rs10907190 G A 500.76 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=2342.36;QD=38.40;SB=-955.26 GT:AD:DP:GL:GQ 1/1:0,61:60:-237.85,-18.08,-0.03:99
-chr1 1765035 rs11260622 A G 3.08 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.83;MQ=58.68;MQ0=1;OQ=1949.34;QD=28.25;SB=-876.43 GT:AD:DP:GL:GQ 1/1:0,68:61:-198.58,-18.40,-0.06:99
-chr1 1766129 rs4648727 C A 222.67 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.39;MQ0=0;OQ=2474.83;QD=35.87;SB=-1254.46 GT:AD:DP:GL:GQ 1/1:0,69:68:-251.09,-20.48,-0.02:99
-chr1 1768896 rs6692959 T C 606.28 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2761.38;QD=31.74;SB=-1372.68 GT:AD:DP:GL:GQ 1/1:0,87:87:-279.80,-26.24,-0.08:99
-chr1 1769657 . A T 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=45;Dels=0.02;HRun=0;HaplotypeScore=8.89;MQ=56.00;MQ0=1;OQ=229.76;QD=5.11;SB=-125.76 GT:AD:DP:GL:GQ 0/1:24,18:27:-34.10,-7.84,-57.21:99
-chr1 1770738 rs6603801 T C 614.13 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1986.61;QD=34.85;SB=-910.02 GT:AD:DP:GL:GQ 1/1:0,57:57:-202.27,-17.17,-0.02:99
-chr1 1771205 rs6664578 G A 696.21 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=3186.74;QD=38.39;SB=-1518.58 GT:AD:DP:GL:GQ 1/1:0,83:81:-322.28,-24.40,-0.02:99
-chr1 1772480 rs12066667 C T 200.36 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.77;MQ0=0;OQ=1986.28;QD=37.48;SB=-1001.85 GT:AD:DP:GL:GQ 1/1:0,53:51:-202.23,-15.37,-0.02:99
-chr1 1773061 rs12402876 G A 282.08 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=57.70;MQ0=0;OQ=2522.68;QD=37.10;SB=-929.21 GT:AD:DP:GL:GQ 1/1:0,68:65:-255.88,-19.59,-0.03:99
-chr1 1773444 rs7526236 G A 531.06 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=1822.31;QD=37.96;SB=-748.50 GT:AD:DP:GL:GQ 1/1:0,48:47:-185.83,-14.16,-0.02:99
-chr1 1782409 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=18;HaplotypeScore=10.25;MQ=50.63;MQ0=2;OQ=451.92;QD=7.66;SB=-97.66 GT:AD:DP:GL:GQ 0/1:39,20:52:-64.14,-15.67,-118.24:99
-chr1 1782428 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=65;Dels=0.02;HRun=18;HaplotypeScore=18.34;MQ=52.25;MQ0=1;OQ=88.42;QD=1.36;SB=56.19 GT:AD:DP:GL:GQ 0/1:56,8:49:-26.89,-14.77,-145.13:99
-chr1 1782863 rs1889678 A G 536.70 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.83;MQ0=0;OQ=1352.43;QD=28.18;SB=-598.57 GT:AD:DP:GL:GQ 1/1:0,48:43:-138.86,-12.97,-0.04:99
-chr1 1782931 rs12076620 A G 575.25 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1635.06;QD=34.79;SB=-754.18 GT:AD:DP:GL:GQ 1/1:0,47:46:-167.10,-13.85,-0.01:99
-chr1 1782971 rs10907192 A G 594.85 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1599.36;QD=34.03;SB=-532.43 GT:AD:DP:GL:GQ 1/1:0,47:46:-163.54,-13.86,-0.02:99
-chr1 1783646 rs7511905 A C 266.52 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1582.35;QD=31.65;SB=-751.07 GT:AD:DP:GL:GQ 1/1:0,50:47:-161.84,-14.16,-0.02:99
-chr1 1785347 rs6660452 A C 506.81 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.51;MQ0=0;OQ=1748.60;QD=30.15;SB=-666.84 GT:AD:DP:GL:GQ 1/1:0,58:55:-178.49,-16.58,-0.04:99
-chr1 1785613 . C A 22.53 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=20;HaplotypeScore=2.54;MQ=46.56;MQ0=0;QD=0.48;SB=89.31 GT:AD:DP:GL:GQ 0/1:40,7:41:-17.88,-12.35,-133.39:55.34
-chr1 1785636 rs6697311 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.01;HRun=20;HaplotypeScore=31.36;MQ=43.36;MQ0=1;OQ=989.12;QD=9.79;SB=-44.45 GT:AD:DP:GL:GQ 0/1:50,49:75:-124.51,-22.31,-136.94:99
-chr1 1785639 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=98;Dels=0.01;HRun=4;HaplotypeScore=41.45;MQ=42.87;MQ0=1;OQ=381.85;QD=3.90;SB=86.26 GT:AD:DP:GL:GQ 0/1:59,38:65:-60.76,-19.29,-163.75:99
-chr1 1785649 rs12036384 C T 5.26 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=10.21;MQ=50.24;MQ0=1;OQ=2105.43;QD=30.96;SB=-932.26 GT:AD:DP:GL:GQ 1/1:2,63:54:-214.14,-16.27,-0.02:99
-chr1 1786577 rs12134553 A C 2.61 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=7.76;MQ=57.97;MQ0=1;OQ=1915.32;QD=26.98;SB=-959.05 GT:AD:DP:GL:GQ 1/1:3,68:63:-201.59,-18.99,-6.48:99
-chr1 1787250 rs6670246 T A 192 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.78;MQ0=0;OQ=2864.46;QD=33.70;SB=-1257.90 GT:AD:DP:GL:GQ 1/1:2,83:84:-296.95,-25.31,-6.91:99
-chr1 1789560 rs4648591 T C 58.31 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=47.68;MQ0=0;OQ=1563.80;QD=30.66;SB=-605.93 GT:AD:DP:GL:GQ 1/1:0,51:49:-160.01,-14.78,-0.04:99
-chr1 1789813 rs7516995 T C 114.34 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.57;MQ0=0;OQ=1801.38;QD=30.53;SB=-555.03 GT:AD:DP:GL:GQ 1/1:0,59:55:-183.76,-16.58,-0.04:99
-chr1 1790511 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=20;HaplotypeScore=40.13;MQ=50.15;MQ0=2;OQ=70.47;QD=0.70;SB=149.46 GT:AD:DP:GL:GQ 0/1:69,28:73:-32.03,-21.69,-222.30:99
-chr1 1790894 rs4648592 G A 598.36 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.49;MQ0=0;OQ=2599.64;QD=38.23;SB=-928.70 GT:AD:DP:GL:GQ 1/1:0,68:65:-263.57,-19.58,-0.02:99
-chr1 1792032 rs6666068 A G 457.40 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2160.60;QD=28.43;SB=-673.85 GT:AD:DP:GL:GQ 1/1:0,76:67:-219.70,-20.20,-0.05:99
-chr1 1794162 rs3855951 C T 52.04 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=2.26;MQ=59.71;MQ0=0;OQ=3179.43;QD=39.74;SB=-1555.57 GT:AD:DP:GL:GQ 1/1:0,80:79:-321.55,-23.80,-0.02:99
-chr1 1795251 rs10907193 G A 266.85 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=60.00;MQ0=0;OQ=1860.92;QD=32.65;SB=-731.44 GT:AD:DP:GL:GQ 1/1:0,56:50:-189.71,-15.08,-0.03:99
-chr1 1796166 rs10399762 A G 54.56 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.73;MQ0=0;OQ=1409.98;QD=25.64;SB=-484.50 GT:AD:DP:GL:GQ 1/1:0,55:46:-144.64,-13.88,-0.05:99
-chr1 1798609 . A T 162.96 SnpCluster AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=74.10;MQ=46.50;MQ0=2;QD=4.29;SB=-81.05 GT:AD:DP:GL:GQ 0/1:27,11:32:-29.22,-9.64,-87.24:99
-chr1 1798611 . A T 632.57 SnpCluster AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=43.92;MQ=46.08;MQ0=2;QD=17.10;SB=-306.76 GT:AD:DP:GL:GQ 0/1:10,25:30:-75.58,-9.04,-33.08:99
-chr1 1798613 rs57488553 A T 825.28 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=35.29;MQ=45.64;MQ0=2;QD=22.92;SB=-393.55 GT:AD:DP:GL:GQ 0/1:7,29:31:-95.15,-9.34,-18.41:90.67
-chr1 1798615 rs58263709 A T 846.29 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=33.82;MQ=45.64;MQ0=2;QD=23.51;SB=-402.56 GT:AD:DP:GL:GQ 0/1:6,30:30:-96.95,-9.04,-14.67:56.29
-chr1 1799369 rs11260624 C T 198.24 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.40;MQ0=0;OQ=2735.01;QD=39.07;SB=-1363.94 GT:AD:DP:GL:GQ 1/1:0,69:70:-279.86,-23.72,-2.77:99
-chr1 1799950 rs7525092 C T 160.98 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=59.72;MQ0=0;OQ=3051.79;QD=36.77;SB=-1420.35 GT:AD:DP:GL:GQ 1/1:0,83:79:-308.79,-23.80,-0.03:99
-chr1 1800981 rs12133865 G A 87.68 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=56.12;MQ0=0;OQ=1844.69;QD=38.43;SB=-730.97 GT:AD:DP:GL:GQ 1/1:0,48:48:-188.07,-14.47,-0.02:99
-chr1 1802311 . A G 78.46 Indel AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.28;MQ=57.45;MQ0=0;QD=1.09;SB=-6.51 GT:AD:DP:GL:GQ 0/1:62,10:70:-32.22,-21.09,-246.49:99
-chr1 1802688 rs6670776 G A 560.73 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=2301.44;QD=40.38;SB=-996.99 GT:AD:DP:GL:GQ 1/1:0,57:57:-233.74,-17.17,-0.01:99
-chr1 1805482 rs12138152 G A 76.26 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.49;MQ0=0;OQ=2306.96;QD=39.10;SB=-1138.66 GT:AD:DP:GL:GQ 1/1:0,59:59:-234.30,-17.78,-0.02:99
-chr1 1807030 rs10796396 G A 291.66 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.36;MQ0=0;OQ=1090.79;QD=38.96;SB=-403.67 GT:AD:DP:GL:GQ 1/1:0,28:28:-112.67,-8.43,-0.01:84.28
-chr1 1809238 rs6603804 T C 659.20 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2030.11;QD=33.84;SB=-689.61 GT:AD:DP:GL:GQ 1/1:0,60:59:-206.62,-17.78,-0.03:99
-chr1 1809966 rs28608797 A C 520.78 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.00;MQ0=0;OQ=1235.99;QD=32.53;SB=-595.06 GT:AD:DP:GL:GQ 1/1:1,37:36:-127.20,-10.84,-0.01:99
-chr1 1813782 rs6688000 A G 233.16 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=58.61;MQ0=0;OQ=1439.33;QD=30.62;SB=-681.87 GT:AD:DP:GL:GQ 1/1:0,46:46:-147.56,-13.87,-0.04:99
-chr1 1818624 rs12045595 G A 59.58 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.53;MQ0=0;OQ=1836.38;QD=37.48;SB=-594.97 GT:AD:DP:GL:GQ 1/1:0,49:48:-187.24,-14.46,-0.02:99
-chr1 1821118 rs6603808 A G 79.87 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=60.00;MQ0=0;OQ=1052.30;QD=28.44;SB=-413.55 GT:AD:DP:GL:GQ 1/1:0,37:31:-108.83,-9.34,-0.01:93.27
-chr1 1822217 rs941531 G A 113.99 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=58.68;MQ0=0;OQ=2643.63;QD=39.46;SB=-1073.33 GT:AD:DP:GL:GQ 1/1:0,67:66:-267.97,-19.88,-0.02:99
-chr1 1822410 . A G 49.96 LowQual AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;QD=0.89;SB=-35.78 GT:AD:DP:GL:GQ 0/1:49,7:55:-24.85,-16.57,-195.12:82.80
-chr1 1822442 rs4996032 G A 113.94 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.02;HRun=2;HaplotypeScore=1.09;MQ=59.55;MQ0=0;OQ=884.12;QD=14.03;SB=-419.83 GT:AD:DP:GL:GQ 0/1:35,27:62:-110.37,-18.67,-127.42:99
-chr1 1822448 rs4996031 A G 133.35 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.02;MQ=59.08;MQ0=1;OQ=897.87;QD=14.03;SB=-423.51 GT:AD:DP:GL:GQ 0/1:31,33:61:-111.45,-18.38,-115.75:99
-chr1 1823355 rs10454464 G A 100.58 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=57.95;MQ0=0;OQ=1113.42;QD=34.79;SB=-534.62 GT:AD:DP:GL:GQ 1/1:0,31:31:-117.34,-11.71,-2.42:92.95
-chr1 1824608 rs4648731 A G 30.88 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=54.33;MQ0=0;OQ=891.08;QD=28.74;SB=-233.75 GT:AD:DP:GL:GQ 1/1:0,31:26:-92.71,-7.84,-0.01:78.21
-chr1 1824902 rs11260625 G A 47.11 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=46.58;MQ0=0;OQ=814.82;QD=27.16;SB=-295.36 GT:AD:DP:GL:GQ 1/1:0,25:22:-85.08,-6.64,-0.02:66.19
-chr1 1824916 rs11260626 C T 92.97 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=48.72;MQ0=0;OQ=1289.62;QD=36.85;SB=-588.96 GT:AD:DP:GL:GQ 1/1:0,35:34:-132.56,-10.25,-0.01:99
-chr1 1825136 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=16;HaplotypeScore=8.80;MQ=56.14;MQ0=0;OQ=163.77;QD=3.72;SB=41.15 GT:AD:DP:GL:GQ 0/1:27,17:32:-29.31,-9.65,-83.86:99
-chr1 1826546 rs2748989 C G 308.42 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.60;MQ0=0;OQ=2438.44;QD=41.33;SB=-736.72 GT:AD:DP:GL:GQ 1/1:0,59:58:-247.45,-17.48,-0.02:99
-chr1 1827738 rs4648732 C T 470.86 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=1741.59;QD=38.70;SB=-666.40 GT:AD:DP:GL:GQ 1/1:0,45:44:-177.75,-13.25,-0.01:99
-chr1 1828376 rs2377037 C A 189.26 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=1605.71;QD=33.45;SB=-826.68 GT:AD:DP:GL:GQ 1/1:1,47:46:-164.17,-13.86,-0.02:99
-chr1 1828498 rs28672079 A G 314.26 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=1270.30;QD=29.54;SB=-594.88 GT:AD:DP:GL:GQ 1/1:0,43:41:-130.66,-12.37,-0.05:99
-chr1 1829551 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=17.55;MQ=56.35;MQ0=0;OQ=57.59;QD=1.48;SB=26.11 GT:AD:DP:GL:GQ 0/1:19,19:17:-14.19,-5.14,-50.87:90.43
-chr1 1829898 rs2474461 T C 40.50 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=579.60;QD=34.09;SB=-105.03 GT:AD:DP:GL:GQ 1/1:0,17:17:-61.55,-5.12,-0.01:51.14
-chr1 1830536 rs28384316 G T 112.96 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=125.10;QD=25.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:5:-16.07,-1.51,-0.01:15.03
-chr1 1832651 . A G 0.32 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=742.60;QD=18.11;SB=-247.32 GT:AD:DP:GL:GQ 0/1:17,24:40:-89.59,-12.05,-62.50:99
-chr1 1834219 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=20;HaplotypeScore=9.36;MQ=53.72;MQ0=0;OQ=93.63;QD=2.46;SB=11.06 GT:AD:DP:GL:GQ 0/1:25,13:25:-20.18,-7.53,-63.71:99
-chr1 1834282 . T C 14.27 PASS AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=417.56;QD=26.10;SB=-221.65 GT:AD:DP:GL:GQ 1/1:0,16:14:-45.35,-4.22,-0.01:42.10
-chr1 1834553 rs28842562 C T 275.34 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.51;MQ0=1;OQ=892.93;QD=34.34;SB=-192.75 GT:AD:DP:GL:GQ 1/1:0,26:23:-92.88,-6.93,-0.01:69.22
-chr1 1836321 rs41306992 C T 57.34 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.24;MQ0=0;OQ=2100.54;QD=38.19;SB=-756.01 GT:AD:DP:GL:GQ 1/1:0,55:53:-213.65,-15.97,-0.01:99
-chr1 1836442 rs2748987 A G 431.11 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=1604.85;QD=34.15;SB=-631.28 GT:AD:DP:GL:GQ 1/1:0,47:47:-164.09,-14.16,-0.02:99
-chr1 1838594 rs941532 A G 20.25 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=58.71;MQ0=0;OQ=477.15;QD=26.51;SB=-129.69 GT:AD:DP:GL:GQ 1/1:0,18:17:-51.32,-5.13,-0.02:51.08
-chr1 1839996 rs2295364 C T 1.07 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.59;MQ0=0;OQ=1245.14;QD=37.73;SB=-117.65 GT:AD:DP:GL:GQ 1/1:0,33:32:-128.11,-9.64,-0.01:96.31
-chr1 1841796 rs2474458 C A 22.03 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.16;MQ=58.78;MQ0=0;OQ=1243.51;QD=32.72;SB=-630.04 GT:AD:DP:GL:GQ 1/1:0,38:36:-127.95,-10.85,-0.01:99
-chr1 1842344 rs28508199 A G 34.17 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.67;MQ0=0;OQ=1404.62;QD=28.67;SB=-672.87 GT:AD:DP:GL:GQ 1/1:0,49:45:-144.09,-13.57,-0.04:99
-chr1 1843148 rs1884454 G T 340.59 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=56.74;MQ0=0;OQ=831.99;QD=14.34;SB=-322.02 GT:AD:DP:GL:GQ 0/1:28,30:55:-103.05,-16.57,-95.32:99
-chr1 1844181 rs2250833 A G 20.17 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=995.90;QD=27.66;SB=-313.46 GT:AD:DP:GL:GQ 1/1:0,36:31:-103.20,-9.35,-0.02:93.22
-chr1 1845310 rs28423370 A G 170.66 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=608.06;QD=32.00;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,19:19:-64.40,-5.72,-0.01:57.14
-chr1 1845407 . C A 46.94 LowQual AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=55.21;MQ0=0;QD=9.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,3:5:-9.49,-1.51,-6.80:52.97
-chr1 1845958 rs752965 C T 17.19 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.17;MQ0=0;OQ=985.76;QD=35.21;SB=-88.34 GT:AD:DP:GL:GQ 1/1:0,28:26:-102.17,-7.83,-0.01:78.25
-chr1 1846560 rs2092922 C T 67.91 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.95;MQ0=0;OQ=1561.86;QD=36.32;SB=-529.71 GT:AD:DP:GL:GQ 1/1:0,43:41:-159.79,-12.36,-0.02:99
-chr1 1848991 rs4648734 C T 0.80 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.13;MQ=58.00;MQ0=0;OQ=1973.99;QD=36.56;SB=-772.04 GT:AD:DP:GL:GQ 1/1:0,53:53:-203.45,-18.19,-2.47:99
-chr1 1849418 rs28670388 T C 0.23 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=7.22;MQ=55.28;MQ0=2;OQ=1025.15;QD=29.29;SB=-496.47 GT:AD:DP:GL:GQ 1/1:3,32:30:-106.11,-9.04,-0.01:90.24
-chr1 1850605 rs28685049 C T 18.19 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=778.38;QD=38.92;SB=-47.56 GT:AD:DP:GL:GQ 1/1:0,20:20:-81.43,-6.03,-0.01:60.20
-chr1 1850678 . T A 0.69 PASS AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=41.96;MQ0=0;OQ=61.03;QD=6.78;SB=5.04 GT:AD:DP:GL:GQ 0/1:6,3:9:-12.10,-2.71,-21.43:93.87
-chr1 1850683 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=10.93;MQ=35.14;MQ0=0;OQ=63.11;QD=9.02;SB=-3.99 GT:AD:DP:GL:GQ 0/1:4,3:6:-11.40,-1.81,-10.53:87.27
-chr1 1851012 rs55825112 G A 257.30 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.15;MQ0=0;OQ=1284.14;QD=38.91;SB=-355.97 GT:AD:DP:GL:GQ 1/1:0,33:33:-132.01,-9.94,-0.01:99
-chr1 1852535 rs2474449 C T 115.82 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=42.11;MQ0=1;OQ=2050.54;QD=37.28;SB=-856.64 GT:AD:DP:GL:GQ 1/1:1,54:53:-211.75,-15.96,-3.11:99
-chr1 1852731 . T A 22.37 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=63;Dels=0.05;HRun=20;HaplotypeScore=13.90;MQ=48.22;MQ0=0;QD=0.36;SB=16.21 GT:AD:DP:GL:GQ 0/1:42,18:40:-16.96,-11.45,-121.97:55.18
-chr1 1852818 rs4648595 A G 3.40 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.78;MQ=50.34;MQ0=1;OQ=917.27;QD=25.48;SB=-127.78 GT:AD:DP:GL:GQ 1/1:1,35:28:-95.33,-8.44,-0.02:84.22
-chr1 1853042 . C A 10.89 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=20;HaplotypeScore=9.56;MQ=49.02;MQ0=4;QD=0.19;SB=86.27 GT:AD:DP:GL:GQ 0/1:51,7:42:-16.99,-12.66,-132.54:43.35
-chr1 1853068 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=2;HaplotypeScore=13.43;MQ=48.98;MQ0=4;OQ=94.12;QD=1.00;SB=104.36 GT:AD:DP:GL:GQ 0/1:70,24:65:-32.29,-19.60,-195.03:99
-chr1 1853265 rs60147457 T C 26.01 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.17;MQ0=0;OQ=1299.21;QD=28.24;SB=-640.40 GT:AD:DP:GL:GQ 1/1:1,45:44:-136.91,-13.28,-3.40:98.74
-chr1 1855559 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.77;MQ=58.15;MQ0=0;OQ=143.93;QD=1.87;SB=17.18 GT:AD:DP:GL:GQ 0/1:67,10:76:-40.57,-22.90,-237.26:99
-chr1 1855612 rs2748968 C T 224.03 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=53.49;MQ0=2;OQ=1207.94;QD=15.10;SB=-597.02 GT:AD:DP:GL:GQ 0/1:40,40:73:-146.08,-22.00,-120.30:99
-chr1 1855646 . T C 0.93 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=9.48;MQ=53.45;MQ0=2;OQ=1049.44;QD=14.78;SB=-537.98 GT:AD:DP:GL:GQ 0/1:31,40:66:-128.11,-19.89,-114.90:99
-chr1 1855674 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=15.63;MQ=50.86;MQ0=1;OQ=126.19;QD=2.25;SB=-24.71 GT:AD:DP:GL:GQ 0/1:49,7:53:-31.88,-15.98,-189.82:99
-chr1 1855675 . A G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=14.63;MQ=50.86;MQ0=1;OQ=886.43;QD=15.83;SB=-281.60 GT:AD:DP:GL:GQ 0/1:21,35:52:-107.60,-15.67,-76.26:99
-chr1 1856033 rs34454803 C G 2.87 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=4.56;MQ=48.03;MQ0=9;OQ=1928.44;QD=26.78;SB=-825.04 GT:AD:DP:GL:GQ 1/1:9,62:49:-203.74,-17.80,-7.31:99
-chr1 1856195 rs61775027 C T 136.98 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=55.46;MQ0=1;OQ=2158.57;QD=29.98;SB=-1089.45 GT:AD:DP:GL:GQ 1/1:8,64:59:-222.77,-17.79,-3.33:99
-chr1 1856465 rs34793596 C G 37.34 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.87;MQ=54.29;MQ0=1;OQ=3153.75;QD=39.92;SB=-1439.03 GT:AD:DP:GL:GQ 1/1:3,76:75:-323.13,-22.60,-4.17:99
-chr1 1856473 rs35531706 C G 44.13 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=2.23;MQ=55.29;MQ0=1;OQ=2974.48;QD=40.20;SB=-1193.83 GT:AD:DP:GL:GQ 1/1:1,73:71:-301.06,-21.40,-0.03:99
-chr1 1858345 rs28658236 G A 98.82 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1111.27;QD=16.34;SB=-403.37 GT:AD:DP:GL:GQ 0/1:35,33:68:-134.91,-20.49,-114.02:99
-chr1 1859106 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=2;HaplotypeScore=6.59;MQ=57.30;MQ0=0;OQ=100.83;QD=1.80;SB=56.18 GT:AD:DP:GL:GQ 0/1:31,25:39:-25.12,-11.75,-106.73:99
-chr1 1859766 rs28592294 C T 2.76 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=5.60;MQ=57.03;MQ0=0;OQ=2783.58;QD=37.62;SB=-907.72 GT:AD:DP:GL:GQ 1/1:1,72:73:-285.26,-22.00,-3.32:99
-chr1 1860070 rs2803323 G A 91.89 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.89;MQ0=0;OQ=1564.69;QD=37.25;SB=-659.28 GT:AD:DP:GL:GQ 1/1:0,42:41:-160.07,-12.36,-0.02:99
-chr1 1861277 rs2803324 T C 62.39 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=848.26;QD=30.30;SB=-320.13 GT:AD:DP:GL:GQ 1/1:0,28:28:-88.44,-8.45,-0.03:84.18
-chr1 1863485 rs12758705 G A 595.32 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2263.21;QD=38.36;SB=-926.70 GT:AD:DP:GL:GQ 1/1:0,59:57:-229.92,-17.17,-0.01:99
-chr1 1864441 rs2803329 A G 280.82 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1008.85;QD=27.27;SB=-491.17 GT:AD:DP:GL:GQ 1/1:0,37:33:-104.50,-9.95,-0.03:99
-chr1 1864697 rs2803330 A G 60.11 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=756.37;QD=30.25;SB=-313.68 GT:AD:DP:GL:GQ 1/1:0,25:22:-79.23,-6.63,-0.01:66.20
-chr1 1865005 rs2803331 C T 233.79 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.84;MQ0=0;OQ=1354.55;QD=33.86;SB=-668.39 GT:AD:DP:GL:GQ 1/1:0,37:37:-139.06,-11.16,-0.02:99
-chr1 1865127 rs2262190 A G 525.82 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=948.06;QD=30.58;SB=-404.33 GT:AD:DP:GL:GQ 1/1:0,31:30:-98.41,-9.05,-0.02:90.22
-chr1 1867098 rs2748978 T G 544.45 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=1416.47;QD=34.55;SB=-657.23 GT:AD:DP:GL:GQ 1/1:0,41:41:-145.24,-12.35,-0.01:99
-chr1 1867212 rs2803339 T C 83.30 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=54.90;MQ0=0;OQ=1104.15;QD=27.60;SB=-492.17 GT:AD:DP:GL:GQ 1/1:1,39:37:-114.04,-11.17,-0.04:99
-chr1 1868944 rs2490543 C T 282.58 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=58.05;MQ0=0;OQ=849.11;QD=14.15;SB=-315.86 GT:AD:DP:GL:GQ 0/1:33,27:55:-104.77,-16.57,-95.97:99
-chr1 1868947 rs28573337 G A 161.30 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.95;MQ0=0;OQ=983.65;QD=17.26;SB=-292.79 GT:AD:DP:GL:GQ 0/1:26,31:55:-118.23,-16.58,-80.47:99
-chr1 1869420 rs28498068 T G 172.46 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=56.75;MQ0=0;OQ=395.95;QD=11.31;SB=-182.88 GT:AD:DP:GL:GQ 0/1:18,17:34:-53.12,-10.25,-61.66:99
-chr1 1869908 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=14;HaplotypeScore=14.65;MQ=46.99;MQ0=0;OQ=127.58;QD=2.90;SB=11.06 GT:AD:DP:GL:GQ 0/1:29,15:29:-24.78,-8.74,-71.11:99
-chr1 1870211 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=105;Dels=0.02;HRun=2;HaplotypeScore=156.21;MQ=37.45;MQ0=0;OQ=89.02;QD=0.85;SB=-10.74 GT:AD:DP:GL:GQ 0/1:91,12:93:-39.61,-27.42,-314.70:99
-chr1 1870216 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.13;HRun=3;HaplotypeScore=129.57;MQ=35.88;MQ0=0;OQ=216.82;QD=2.28;SB=-71.49 GT:AD:DP:GL:GQ 0/1:69,14:77:-47.26,-22.30,-241.64:99
-chr1 1870237 . C T 350.17 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=136.82;MQ=33.84;MQ0=0;QD=4.38;SB=-96.57 GT:AD:DP:GL:GQ 0/1:64,16:68:-58.79,-20.48,-197.51:99
-chr1 1870241 . T C 795.72 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=2;HaplotypeScore=105.65;MQ=33.28;MQ0=0;QD=10.33;SB=-171.98 GT:AD:DP:GL:GQ 0/1:49,28:68:-103.35,-20.49,-158.12:99
-chr1 1870246 . T C 783.37 SnpCluster AC=1;AF=0.50;AN=2;DP=75;Dels=0.01;HRun=3;HaplotypeScore=106.17;MQ=32.28;MQ0=0;QD=10.44;SB=-190.65 GT:AD:DP:GL:GQ 0/1:44,29:65:-101.22,-19.60,-139.10:99
-chr1 1870249 rs28490251 C T 536.49 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=65.25;MQ=33.25;MQ0=0;QD=8.01;SB=-19.48 GT:AD:DP:GL:GQ 0/1:45,22:60:-75.01,-18.07,-158.51:99
-chr1 1870263 . T C 67.37 SnpCluster AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=2;HaplotypeScore=102.33;MQ=35.77;MQ0=0;QD=1.07;SB=-0.98 GT:AD:DP:GL:GQ 0/1:55,8:53:-25.99,-15.97,-184.95:99
-chr1 1870272 . C T 96.33 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=53.42;MQ=40.73;MQ0=0;QD=1.55;SB=5.03 GT:AD:DP:GL:GQ 0/1:52,10:55:-29.48,-16.57,-180.28:99
-chr1 1870273 . T C 72.37 SnpCluster AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=53.42;MQ=40.73;MQ0=0;QD=1.17;SB=-0.98 GT:AD:DP:GL:GQ 0/1:55,7:53:-26.49,-15.97,-188.35:99
-chr1 1870281 . C T 187.69 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=96.79;MQ=44.56;MQ0=0;QD=3.24;SB=5.04 GT:AD:DP:GL:GQ 0/1:46,12:51:-37.41,-15.36,-160.10:99
-chr1 1870294 . T C 11.65 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=47.97;MQ0=0;QD=0.19;SB=8.05 GT:AD:DP:GL:GQ 0/1:55,6:59:-22.20,-17.78,-213.89:44.18
-chr1 1870405 . C A 16.24 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=38.44;MQ0=0;OQ=457.23;QD=8.97;SB=-4.29 GT:AD:DP:GL:GQ 0/1:33,18:50:-64.07,-15.06,-117.59:99
-chr1 1870410 . T C 0.86 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=38.95;MQ0=0;OQ=422.51;QD=8.80;SB=-31.25 GT:AD:DP:GL:GQ 0/1:31,17:47:-59.69,-14.16,-126.57:99
-chr1 1870428 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=20.35;MQ=41.74;MQ0=0;OQ=75.20;QD=2.15;SB=23.10 GT:AD:DP:GL:GQ 0/1:27,8:31:-20.14,-9.34,-96.20:99
-chr1 1870432 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=16.08;MQ=42.82;MQ0=0;OQ=52.58;QD=1.81;SB=29.11 GT:AD:DP:GL:GQ 0/1:24,5:28:-16.98,-8.43,-86.35:85.42
-chr1 1870446 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=25;Dels=0.04;HRun=2;HaplotypeScore=17.65;MQ=47.45;MQ0=0;OQ=105.58;QD=4.22;SB=-62.85 GT:AD:DP:GL:GQ 0/1:18,6:24:-20.77,-6.93,-68.32:99
-chr1 1871370 rs2490541 C A 191.01 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.38;MQ0=1;OQ=2594.06;QD=33.69;SB=-1155.38 GT:AD:DP:GL:GQ 1/1:0,76:73:-263.01,-21.99,-0.02:99
-chr1 1872147 rs2490540 A G 201.87 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.87;MQ0=0;OQ=2121.33;QD=34.22;SB=-1028.42 GT:AD:DP:GL:GQ 1/1:0,62:60:-215.74,-18.07,-0.02:99
-chr1 1872797 rs28754760 C T 596.04 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2762.82;QD=40.63;SB=-1367.30 GT:AD:DP:GL:GQ 1/1:0,68:68:-279.88,-20.48,-0.01:99
-chr1 1872809 rs2490564 A G 614.38 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=2664.00;QD=34.60;SB=-1257.66 GT:AD:DP:GL:GQ 1/1:0,77:76:-270.02,-22.89,-0.03:99
-chr1 1872820 rs2490563 C A 537.89 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.73;MQ0=0;OQ=2673.37;QD=36.62;SB=-1103.59 GT:AD:DP:GL:GQ 1/1:0,73:73:-270.94,-21.99,-0.02:99
-chr1 1872941 rs28505085 C T 182.42 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.70;MQ0=0;OQ=3049.13;QD=40.12;SB=-1406.71 GT:AD:DP:GL:GQ 1/1:0,76:76:-308.51,-22.89,-0.02:99
-chr1 1873219 rs2490562 A G 659.58 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=2029.90;QD=31.23;SB=-828.58 GT:AD:DP:GL:GQ 1/1:0,65:64:-206.63,-19.30,-0.05:99
-chr1 1874915 rs2474455 C T 626.28 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2935.86;QD=37.64;SB=-1349.01 GT:AD:DP:GL:GQ 1/1:0,78:74:-297.19,-22.29,-0.02:99
-chr1 1876080 rs4648738 C T 622.15 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.86;MQ0=0;OQ=2172.76;QD=36.21;SB=-969.30 GT:AD:DP:GL:GQ 1/1:0,60:56:-220.88,-16.87,-0.02:99
-chr1 1876082 rs2803287 T G 577.20 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.86;MQ0=0;OQ=1927.37;QD=32.12;SB=-839.09 GT:AD:DP:GL:GQ 1/1:0,60:56:-196.35,-16.87,-0.02:99
-chr1 1876206 . G A 152.24 Indel AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=32.79;MQ=48.52;MQ0=0;QD=4.91;SB=-65.27 GT:AD:DP:GL:GQ 0/1:20,7:27:-34.54,-16.03,-70.20:99
-chr1 1876245 rs2803286 T C 61.43 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=51.77;MQ0=0;OQ=999.35;QD=27.76;SB=-355.43 GT:AD:DP:GL:GQ 1/1:0,36:34:-103.57,-10.26,-0.05:99
-chr1 1876361 rs2748976 C A 113.55 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=45.22;MQ0=0;OQ=179.32;QD=6.90;SB=-106.45 GT:AD:DP:GL:GQ 0/1:18,8:25:-28.75,-7.53,-52.51:99
-chr1 1876371 . C A 48.69 LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=43.76;MQ0=0;QD=2.03;SB=-50.67 GT:AD:DP:GL:GQ 0/1:20,4:23:-15.08,-6.93,-60.82:81.52
-chr1 1876379 rs2748975 C A 111.71 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=47.73;MQ0=0;OQ=820.31;QD=34.18;SB=-360.86 GT:AD:DP:GL:GQ 1/1:0,24:23:-85.62,-6.93,-0.01:69.21
-chr1 1876719 rs3795290 C T 341.91 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.08;MQ0=0;OQ=1064.55;QD=38.02;SB=-422.06 GT:AD:DP:GL:GQ 1/1:0,28:28:-110.05,-8.44,-0.01:84.27
-chr1 1876879 rs28548017 A G 12.14 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=3.36;MQ=59.09;MQ0=0;OQ=1547.11;QD=33.63;SB=-748.91 GT:AD:DP:GL:GQ 1/1:0,45:45:-158.32,-13.56,-0.02:99
-chr1 1877105 rs28575980 G A 126.28 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=58.88;MQ0=0;OQ=2123.64;QD=39.33;SB=-940.36 GT:AD:DP:GL:GQ 1/1:0,54:54:-215.96,-16.27,-0.02:99
-chr1 1878053 rs3820011 C A 596.21 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1358.01;QD=33.95;SB=-534.23 GT:AD:DP:GL:GQ 1/1:0,40:39:-139.40,-11.75,-0.01:99
-chr1 1878190 rs28535696 C T 4.02 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.27;MQ=59.60;MQ0=0;OQ=1961.78;QD=33.82;SB=-651.37 GT:AD:DP:GL:GQ 1/1:0,56:52:-199.79,-15.68,-0.03:99
-chr1 1878229 rs2803285 A G 106.12 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=1952.57;QD=31.49;SB=-789.62 GT:AD:DP:GL:GQ 1/1:0,62:61:-198.90,-18.40,-0.05:99
-chr1 1878313 rs28549710 G A 560.24 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1883.77;QD=38.44;SB=-852.64 GT:AD:DP:GL:GQ 1/1:0,49:48:-191.98,-14.46,-0.02:99
-chr1 1878885 rs2748974 A G 5.77 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.37;MQ=58.15;MQ0=0;OQ=1276.90;QD=26.60;SB=-511.07 GT:AD:DP:GL:GQ 1/1:1,47:40:-131.31,-12.06,-0.03:99
-chr1 1878935 rs941533 C T 78.39 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.81;MQ0=0;OQ=1331.51;QD=34.14;SB=-642.34 GT:AD:DP:GL:GQ 1/1:0,39:35:-136.75,-10.55,-0.02:99
-chr1 1879652 rs2748973 A T 145.27 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1566.33;QD=34.81;SB=-658.70 GT:AD:DP:GL:GQ 1/1:0,44:44:-160.23,-13.26,-0.02:99
-chr1 1881908 rs2803292 G C 343.50 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1280.73;QD=16.85;SB=-445.74 GT:AD:DP:GL:GQ 0/1:41,35:73:-153.35,-22.00,-166.87:99
-chr1 1882185 rs2803291 T C 583.24 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1616.58;QD=28.87;SB=-749.95 GT:AD:DP:GL:GQ 1/1:0,56:52:-165.29,-15.68,-0.05:99
-chr1 1883521 rs9777849 T C 52.56 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=58.55;MQ0=0;OQ=2600.99;QD=33.78;SB=-793.15 GT:AD:DP:GL:GQ 1/1:0,77:75:-263.71,-22.59,-0.03:99
-chr1 1883775 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=18;HaplotypeScore=34.55;MQ=54.67;MQ0=0;OQ=115.46;QD=1.72;SB=60.06 GT:AD:DP:GL:GQ 0/1:50,15:53:-37.44,-22.61,-153.19:99
-chr1 1884144 rs4648739 T C 265.60 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=56.66;MQ0=0;OQ=1089.11;QD=12.10;SB=-234.30 GT:AD:DP:GL:GQ 0/1:41,48:84:-137.52,-25.33,-160.93:99
-chr1 1884622 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=7.50;MQ=53.07;MQ0=0;OQ=108.82;QD=2.02;SB=71.24 GT:AD:DP:GL:GQ 0/1:31,23:39:-25.91,-11.75,-106.64:99
-chr1 1884705 rs9697615 G A 136.68 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.71;MQ0=0;OQ=608.41;QD=12.94;SB=-170.23 GT:AD:DP:GL:GQ 0/1:24,22:44:-77.39,-13.26,-79.80:99
-chr1 1884754 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=43.50;MQ=52.44;MQ0=1;OQ=107.17;QD=1.76;SB=65.22 GT:AD:DP:GL:GQ 0/1:47,13:52:-29.66,-15.66,-164.16:99
-chr1 1884755 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=20;HaplotypeScore=45.92;MQ=52.41;MQ0=1;OQ=326.78;QD=5.11;SB=65.23 GT:AD:DP:GL:GQ 0/1:48,16:59:-53.73,-17.77,-157.95:99
-chr1 1884837 rs35817970 T C 556.60 Indel AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=55.91;MQ0=0;QD=10.91;SB=-219.26 GT:AD:DP:GL:GQ 0/1:29,21:48:-73.41,-14.46,-106.68:99
-chr1 1885037 rs7523728 C T 495.93 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.35;MQ0=0;OQ=754.75;QD=13.98;SB=-403.19 GT:AD:DP:GL:GQ 0/1:30,24:50:-93.83,-15.07,-88.75:99
-chr1 1885400 rs28561741 A G 4.33 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=59.52;MQ0=0;OQ=350.23;QD=7.30;SB=-137.55 GT:AD:DP:GL:GQ 0/1:31,17:46:-52.17,-13.87,-117.69:99
-chr1 1885962 rs13302978 G A 113.63 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=53.12;MQ0=0;OQ=689.28;QD=12.53;SB=-222.75 GT:AD:DP:GL:GQ 0/1:26,26:49:-87.00,-14.79,-79.84:99
-chr1 1886045 rs13303324 T C 252.63 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.41;MQ0=0;OQ=434.96;QD=11.15;SB=-181.59 GT:AD:DP:GL:GQ 0/1:18,21:37:-57.94,-11.16,-71.83:99
-chr1 1886083 rs13303202 C T 406.23 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=730.31;QD=16.98;SB=-346.33 GT:AD:DP:GL:GQ 0/1:21,22:43:-89.27,-12.95,-73.96:99
-chr1 1886300 rs16824585 G A 23.99 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.05;MQ0=0;OQ=933.53;QD=20.75;SB=-382.89 GT:AD:DP:GL:GQ 0/1:18,27:45:-110.19,-13.56,-62.00:99
-chr1 1886413 rs28625839 C T 106.43 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.20;MQ0=0;OQ=181.47;QD=6.98;SB=-69.07 GT:AD:DP:GL:GQ 0/1:17,9:21:-27.77,-6.34,-42.14:99
-chr1 1887329 rs28523363 A G 314.68 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=60.00;MQ0=0;OQ=843.98;QD=13.40;SB=-333.92 GT:AD:DP:GL:GQ 0/1:32,31:62:-106.36,-18.68,-128.89:99
-chr1 1887451 rs4648599 C T 245.43 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.01;MQ0=0;OQ=690.92;QD=14.70;SB=-275.28 GT:AD:DP:GL:GQ 0/1:24,23:44:-85.64,-13.26,-73.07:99
-chr1 1887613 rs4648600 C G 12.90 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=4.38;MQ=58.99;MQ0=0;OQ=734.25;QD=15.96;SB=-239.38 GT:AD:DP:GL:GQ 0/1:23,23:42:-89.37,-12.66,-89.33:99
-chr1 1887905 rs28712827 G A 21.15 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=6.31;MQ=57.89;MQ0=0;OQ=502.21;QD=13.22;SB=-250.22 GT:AD:DP:GL:GQ 0/1:20,17:35:-64.07,-10.57,-52.53:99
-chr1 1888209 rs28414188 C T 21.14 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=59.03;MQ0=0;OQ=593.85;QD=13.81;SB=-128.12 GT:AD:DP:GL:GQ 0/1:24,19:42:-75.32,-12.65,-82.23:99
-chr1 1888229 rs28629936 G A 50.03 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=708.17;QD=17.70;SB=-204.21 GT:AD:DP:GL:GQ 0/1:19,21:39:-85.85,-11.75,-58.81:99
-chr1 1888545 rs17715950 T C 188.94 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=392.93;QD=12.68;SB=-143.27 GT:AD:DP:GL:GQ 0/1:16,15:29:-51.31,-8.74,-58.30:99
-chr1 1888637 rs34506333 G C 174.46 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=57.85;MQ0=0;OQ=1081.48;QD=18.97;SB=-492.64 GT:AD:DP:GL:GQ 0/1:26,30:56:-128.32,-16.89,-103.04:99
-chr1 1888639 rs35698161 C A 246.37 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=57.81;MQ0=0;OQ=901.53;QD=16.10;SB=-413.05 GT:AD:DP:GL:GQ 0/1:26,30:56:-110.30,-16.87,-89.43:99
-chr1 1888688 rs34824947 T C 245.62 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.71;MQ0=0;OQ=584.90;QD=12.44;SB=-198.60 GT:AD:DP:GL:GQ 0/1:25,22:46:-75.63,-13.86,-99.35:99
-chr1 1888695 rs34586002 C A 280.09 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.48;MQ0=0;OQ=561.20;QD=12.75;SB=-230.89 GT:AD:DP:GL:GQ 0/1:24,20:42:-72.05,-12.65,-79.10:99
-chr1 1888719 rs35031992 G A 261.38 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=534.91;QD=11.38;SB=-199.88 GT:AD:DP:GL:GQ 0/1:28,19:46:-70.65,-13.87,-88.35:99
-chr1 1888794 rs35186797 T C 29.82 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.78;MQ=57.65;MQ0=0;OQ=525.33;QD=10.94;SB=-267.94 GT:AD:DP:GL:GQ 0/1:23,25:43:-68.78,-12.96,-87.05:99
-chr1 1888798 rs13303138 G A 173.43 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=57.75;MQ0=0;OQ=779.95;QD=15.60;SB=-266.18 GT:AD:DP:GL:GQ 0/1:24,26:46:-95.14,-13.87,-72.15:99
-chr1 1888835 rs34940616 G A 9.86 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.88;MQ0=0;OQ=741.91;QD=23.93;SB=-335.86 GT:AD:DP:GL:GQ 0/1:9,22:29:-86.21,-8.74,-25.83:99
-chr1 1889024 rs17778128 G C 179.10 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=57.35;MQ0=0;OQ=668.72;QD=10.79;SB=-360.78 GT:AD:DP:GL:GQ 0/1:38,24:59:-87.94,-17.79,-162.55:99
-chr1 1889139 rs61775058 A T 458.44 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.25;MQ0=0;OQ=787.44;QD=13.58;SB=-299.67 GT:AD:DP:GL:GQ 0/1:31,27:58:-99.50,-17.47,-121.67:99
-chr1 1889179 rs61775059 T C 275.84 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.27;MQ0=0;OQ=765.16;QD=11.42;SB=-328.14 GT:AD:DP:GL:GQ 0/1:35,32:66:-99.69,-19.89,-140.70:99
-chr1 1889260 rs13303007 G A 42.33 Indel;LowQual AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.98;MQ=52.93;MQ0=0;QD=0.73;SB=-30.38 GT:AD:DP:GL:GQ 0/1:52,6:58:-24.99,-17.47,-182.54:75.16
-chr1 1889721 rs4648601 C T 94.28 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=56.35;MQ0=0;OQ=530.41;QD=10.20;SB=-77.51 GT:AD:DP:GL:GQ 0/1:33,19:47:-70.50,-14.17,-95.11:99
-chr1 1890092 rs16824588 T C 13.33 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=57.02;MQ0=0;OQ=150.77;QD=3.97;SB=-54.71 GT:AD:DP:GL:GQ 0/1:26,12:35:-28.91,-10.55,-104.30:99
-chr1 1890192 rs55709963 A G 31.87 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.20;MQ0=0;OQ=293.66;QD=11.75;SB=-65.87 GT:AD:DP:GL:GQ 0/1:12,13:24:-39.88,-7.23,-45.12:99
-chr1 1890199 rs56126097 A G 24.29 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=55.86;MQ0=0;OQ=270.97;QD=11.78;SB=-47.83 GT:AD:DP:GL:GQ 0/1:11,12:22:-37.01,-6.63,-43.67:99
-chr1 1890235 rs55676322 G A 36.70 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.45;MQ0=0;QD=2.82;SB=-3.98 GT:AD:DP:GL:GQ 0/1:10,3:12:-10.57,-3.62,-30.38:69.54
-chr1 1890236 . C T 56.05 SnpCluster AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.03;MQ0=0;QD=4.00;SB=-3.98 GT:AD:DP:GL:GQ 0/1:11,3:13:-12.81,-3.92,-36.41:88.89
-chr1 1890241 rs55784504 G A 37.70 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=53.95;MQ0=0;QD=2.36;SB=-0.97 GT:AD:DP:GL:GQ 0/1:13,3:15:-11.57,-4.52,-40.91:70.54
-chr1 1890268 rs61776961 A G 12.56 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=53.61;MQ0=0;QD=0.66;SB=-31.93 GT:AD:DP:GL:GQ 0/1:15,4:17:-9.64,-5.12,-56.10:45.15
-chr1 1890270 rs61776962 C T 67.49 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=53.03;MQ0=0;QD=3.21;SB=-45.25 GT:AD:DP:GL:GQ 0/1:16,5:19:-15.77,-5.74,-45.89:99
-chr1 1890274 rs61776963 T C 59.17 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=2;HaplotypeScore=2.43;MQ=51.33;MQ0=0;QD=2.96;SB=-53.70 GT:AD:DP:GL:GQ 0/1:14,6:19:-14.93,-5.73,-56.51:92.01
-chr1 1890292 rs61776964 T G 172.84 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=50.53;MQ0=0;OQ=263.44;QD=9.08;SB=-95.94 GT:AD:DP:GL:GQ 0/1:17,12:28:-38.07,-8.44,-56.66:99
-chr1 1890305 rs61776965 C T 161.45 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=50.32;MQ0=0;OQ=365.34;QD=11.79;SB=-175.70 GT:AD:DP:GL:GQ 0/1:18,13:27:-47.95,-8.13,-56.49:99
-chr1 1890314 rs6681749 A G 143.47 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=50.65;MQ0=0;OQ=306.18;QD=9.57;SB=-129.77 GT:AD:DP:GL:GQ 0/1:17,15:29:-42.64,-8.74,-64.98:99
-chr1 1890507 . T C 42.73 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=3.92;MQ=54.77;MQ0=0;QD=1.86;SB=14.07 GT:AD:DP:GL:GQ 0/1:16,7:17:-12.68,-5.13,-48.62:75.57
-chr1 1890548 . A T 8.30 PASS AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=60.00;MQ0=0;OQ=79.81;QD=7.98;SB=-57.71 GT:AD:DP:GL:GQ 0/1:6,4:10:-14.28,-3.01,-22.53:99
-chr1 1890778 rs28707401 G A 84.90 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.74;MQ=58.33;MQ0=0;OQ=401.02;QD=14.32;SB=-129.13 GT:AD:DP:GL:GQ 0/1:13,14:24:-53.53,-10.14,-35.22:99
-chr1 1892326 . A C 112.36 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.24;MQ0=0;OQ=852.28;QD=15.50;SB=-429.85 GT:AD:DP:GL:GQ 0/1:26,29:52:-104.18,-15.67,-81.22:99
-chr1 1892422 rs7367171 A G 220.04 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.60;MQ0=0;OQ=514.17;QD=9.02;SB=-267.96 GT:AD:DP:GL:GQ 0/1:32,25:54:-70.98,-16.28,-126.05:99
-chr1 1892426 rs7367879 G A 251.13 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=59.60;MQ0=0;OQ=832.91;QD=14.36;SB=-352.38 GT:AD:DP:GL:GQ 0/1:32,26:52:-102.26,-15.68,-81.39:99
-chr1 1892733 rs7366028 C T 234.62 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.35;MQ0=0;OQ=1086.69;QD=15.31;SB=-535.37 GT:AD:DP:GL:GQ 0/1:36,35:67:-132.15,-20.20,-106.68:99
-chr1 1893163 rs4648603 C T 25.39 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.48;MQ0=0;OQ=261.75;QD=5.95;SB=-111.10 GT:AD:DP:GL:GQ 0/1:32,12:41:-41.83,-12.38,-90.87:99
-chr1 1893572 rs13303201 C A 360.69 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.58;MQ0=0;OQ=726.40;QD=15.46;SB=-340.06 GT:AD:DP:GL:GQ 0/1:22,25:44:-89.18,-13.26,-62.88:99
-chr1 1895166 rs56313717 C A 171.85 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=635.59;QD=15.13;SB=-197.47 GT:AD:DP:GL:GQ 0/1:18,24:41:-79.20,-12.35,-61.36:99
-chr1 1897772 rs7528894 C T 135.70 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.63;MQ0=0;OQ=607.52;QD=11.91;SB=-152.65 GT:AD:DP:GL:GQ 0/1:30,21:44:-77.30,-13.26,-84.20:99
-chr1 1897865 rs7536087 T C 25.44 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=54.74;MQ0=0;OQ=378.78;QD=5.83;SB=-147.48 GT:AD:DP:GL:GQ 0/1:38,27:56:-58.05,-16.88,-148.17:99
-chr1 1897872 rs28588807 T C 29.81 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=53.22;MQ0=0;OQ=367.97;QD=6.24;SB=-166.50 GT:AD:DP:GL:GQ 0/1:36,23:50:-55.16,-15.08,-127.98:99
-chr1 1897899 rs4388640 C T 188.74 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.25;MQ0=0;OQ=499.97;QD=8.20;SB=-247.55 GT:AD:DP:GL:GQ 0/1:39,22:51:-68.65,-15.37,-112.84:99
-chr1 1897945 rs28410799 A G 3.16 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.71;MQ=54.36;MQ0=0;OQ=341.23;QD=5.59;SB=-142.90 GT:AD:DP:GL:GQ 0/1:39,21:52:-53.08,-15.68,-138.70:99
-chr1 1897960 rs28789409 G T 236.91 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=55.27;MQ0=0;OQ=569.89;QD=9.19;SB=-286.60 GT:AD:DP:GL:GQ 0/1:38,24:59:-78.04,-17.77,-137.70:99
-chr1 1898245 rs13303203 C T 367.31 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.47;MQ0=0;OQ=546.46;QD=10.31;SB=-185.87 GT:AD:DP:GL:GQ 0/1:33,20:47:-72.10,-14.17,-90.13:99
-chr1 1898289 rs28545809 T C 170.68 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=55.94;MQ0=0;OQ=320.54;QD=7.82;SB=-173.95 GT:AD:DP:GL:GQ 0/1:24,16:37:-46.49,-11.16,-87.43:99
-chr1 1898563 rs4233027 C G 427.81 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=977.32;QD=15.27;SB=-297.92 GT:AD:DP:GL:GQ 0/1:36,28:63:-120.00,-18.99,-153.02:99
-chr1 1899064 rs35953639 A G 134.17 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.58;MQ=58.52;MQ0=0;OQ=901.65;QD=15.82;SB=-439.15 GT:AD:DP:GL:GQ 0/1:25,32:55:-110.02,-16.57,-94.81:99
-chr1 1899178 rs61776976 G A 36.91 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=59.15;MQ0=0;OQ=1106.44;QD=22.13;SB=-371.92 GT:AD:DP:GL:GQ 0/1:16,34:48:-128.39,-14.47,-53.19:99
-chr1 1899305 rs55863117 A G 206.03 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.24;MQ0=0;OQ=872.61;QD=14.31;SB=-340.17 GT:AD:DP:GL:GQ 0/1:25,35:57:-107.73,-17.18,-95.38:99
-chr1 1899354 rs28716654 C T 202.23 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=59.30;MQ0=0;OQ=1176.35;QD=17.82;SB=-612.15 GT:AD:DP:GL:GQ 0/1:31,35:62:-139.59,-18.67,-102.07:99
-chr1 1899413 rs28680595 T A 360.31 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=1036.44;QD=15.95;SB=-464.88 GT:AD:DP:GL:GQ 0/1:30,35:63:-125.91,-18.98,-108.28:99
-chr1 1899561 rs28613404 C T 21.64 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=5.89;MQ=58.07;MQ0=0;OQ=742.01;QD=16.13;SB=-312.34 GT:AD:DP:GL:GQ 0/1:20,25:42:-90.15,-12.66,-60.03:99
-chr1 1899593 rs28491083 G T 384.56 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=572.46;QD=14.31;SB=-222.49 GT:AD:DP:GL:GQ 0/1:17,23:37:-71.67,-11.14,-60.73:99
-chr1 1899703 rs28433557 C T 153.68 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.28;MQ0=0;OQ=695.04;QD=16.55;SB=-241.74 GT:AD:DP:GL:GQ 0/1:19,23:39:-84.54,-11.75,-59.04:99
-chr1 1899714 rs28448395 G A 59.92 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=57.87;MQ0=0;OQ=975.55;QD=21.68;SB=-411.21 GT:AD:DP:GL:GQ 0/1:16,29:43:-113.79,-12.96,-49.10:99
-chr1 1899728 rs28539219 G A 22.10 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.50;MQ0=0;OQ=1039.92;QD=21.66;SB=-531.16 GT:AD:DP:GL:GQ 0/1:16,32:45:-120.83,-13.56,-54.90:99
-chr1 1899861 rs28468541 C G 2.92 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=9.03;MQ=56.76;MQ0=0;OQ=898.89;QD=17.63;SB=-410.04 GT:AD:DP:GL:GQ 0/1:24,26:48:-107.64,-14.46,-99.37:99
-chr1 1899872 rs28588737 T C 12.45 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.04;MQ=57.56;MQ0=0;OQ=448.65;QD=9.35;SB=-239.28 GT:AD:DP:GL:GQ 0/1:25,23:43:-61.11,-12.96,-97.10:99
-chr1 1899946 rs28645949 G T 144.20 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=60.00;MQ0=0;OQ=332.80;QD=10.40;SB=-155.69 GT:AD:DP:GL:GQ 0/1:19,13:30:-45.61,-9.04,-50.81:99
-chr1 1900096 rs28651716 T C 225.12 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=54.90;MQ0=0;OQ=686.40;QD=12.71;SB=-338.36 GT:AD:DP:GL:GQ 0/1:28,26:53:-87.90,-15.97,-105.41:99
-chr1 1900231 rs28642304 G A 31.56 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=5.35;MQ=52.67;MQ0=2;OQ=686.17;QD=14.00;SB=-341.85 GT:AD:DP:GL:GQ 0/1:25,24:43:-84.86,-12.96,-72.07:99
-chr1 1900342 . C G 14.82 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=12.94;MQ=53.14;MQ0=2;QD=0.37;SB=26.12 GT:AD:DP:GL:GQ 0/1:35,5:34:-15.00,-10.25,-129.63:47.51
-chr1 1900344 . T C 47.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=13.10;MQ=54.07;MQ0=2;QD=1.16;SB=26.11 GT:AD:DP:GL:GQ 0/1:32,9:34:-18.29,-10.25,-109.75:80.39
-chr1 1900366 . T C 19.64 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=56.14;MQ0=0;QD=0.48;SB=17.08 GT:AD:DP:GL:GQ 0/1:34,7:35:-15.79,-10.55,-116.81:52.43
-chr1 1900466 rs7550407 A G 75.71 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=45.89;MQ0=2;OQ=380.59;QD=19.03;SB=-189.68 GT:AD:DP:GL:GQ 1/1:0,20:13:-41.66,-3.92,-0.01:39.09
-chr1 1900518 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=10.99;MQ=35.59;MQ0=6;OQ=55.62;QD=1.29;SB=-13.87 GT:AD:DP:GL:GQ 0/1:29,14:19:-14.57,-5.73,-56.56:88.46
-chr1 1900571 . C T 45.32 LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=19.95;MQ=36.93;MQ0=3;QD=0.91;SB=-24.62 GT:AD:DP:GL:GQ 0/1:41,9:25:-15.36,-7.54,-65.46:78.16
-chr1 1900816 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=6.83;MQ=47.18;MQ0=2;OQ=71.50;QD=1.79;SB=-42.78 GT:AD:DP:GL:GQ 0/1:30,10:31:-19.78,-9.34,-96.64:99
-chr1 1900861 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=8.07;MQ=42.04;MQ0=5;OQ=136.19;QD=2.67;SB=-39.59 GT:AD:DP:GL:GQ 0/1:31,18:36:-30.43,-13.53,-101.33:99
-chr1 1900880 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=21.93;MQ=42.64;MQ0=5;OQ=81.77;QD=1.99;SB=26.03 GT:AD:DP:GL:GQ 0/1:32,9:28:-19.91,-8.45,-71.11:99
-chr1 1900981 . G A 32.02 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=14.77;MQ=47.97;MQ0=0;QD=1.07;SB=20.08 GT:AD:DP:GL:GQ 0/1:27,3:20:-12.51,-6.03,-56.06:64.85
-chr1 1900982 . C T 11.94 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=14.77;MQ=47.50;MQ0=0;QD=0.41;SB=35.07 GT:AD:DP:GL:GQ 0/1:26,3:25:-11.99,-7.54,-69.22:44.49
-chr1 1900987 . C G 179.53 SnpCluster AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=15.25;MQ=49.14;MQ0=0;QD=5.79;SB=-106.68 GT:AD:DP:GL:GQ 0/1:23,8:22:-27.88,-6.64,-59.47:99
-chr1 1901007 . A G 17.82 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=50.60;MQ0=0;OQ=269.42;QD=8.42;SB=-129.64 GT:AD:DP:GL:GQ 0/1:19,13:29:-38.97,-8.74,-66.56:99
-chr1 1901025 . T C 1.37 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=50.85;MQ0=0;OQ=146.63;QD=3.67;SB=-63.91 GT:AD:DP:GL:GQ 0/1:26,13:31:-27.31,-9.36,-79.17:99
-chr1 1901036 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.09;MQ=51.49;MQ0=1;OQ=87.37;QD=1.99;SB=-8.61 GT:AD:DP:GL:GQ 0/1:38,6:38:-23.49,-11.46,-98.15:99
-chr1 1901053 . T C 11.36 LowQual AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=52.41;MQ0=1;QD=0.25;SB=-25.22 GT:AD:DP:GL:GQ 0/1:37,8:38:-15.84,-11.45,-126.44:43.87
-chr1 1901418 rs28645431 C T 0.52 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=3.95;MQ=41.39;MQ0=1;OQ=172.22;QD=4.53;SB=-89.91 GT:AD:DP:GL:GQ 0/1:29,9:21:-26.84,-6.33,-42.67:99
-chr1 1901574 rs13303001 G A 41.49 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=7.68;MQ=10.86;MQ0=15;QD=1.66;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,5:3:-8.34,-0.90,-3.10:21.92
-chr1 1901637 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=16.41;MQ=17.84;MQ0=13;OQ=157.79;QD=2.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:44,10:26:-26.90,-7.83,-65.70:99
-chr1 1901664 . G A 34.02 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.20;MQ=18.33;MQ0=14;QD=0.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:42,9:17:-11.81,-5.13,-50.35:66.86
-chr1 1901668 . G A 0.06 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.04;MQ=18.51;MQ0=13;OQ=99.32;QD=2.03;SB=-7.00 GT:AD:DP:GL:GQ 0/1:40,9:16:-18.04,-4.83,-38.64:99
-chr1 1901732 rs13303290 T C 12.82 LowQual AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.55;MQ0=0;QD=0.64;SB=-24.62 GT:AD:DP:GL:GQ 0/1:15,5:16:-9.37,-4.82,-51.21:45.43
-chr1 1901798 rs4648740 A G 153 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=48.72;MQ0=0;OQ=495.24;QD=14.15;SB=-240.44 GT:AD:DP:GL:GQ 0/1:16,19:34:-63.06,-10.25,-57.72:99
-chr1 1901828 rs4648741 T A 223.12 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=49.47;MQ0=0;OQ=518.42;QD=14.01;SB=-218.56 GT:AD:DP:GL:GQ 0/1:16,21:33:-65.07,-9.94,-58.68:99
-chr1 1902252 rs35209771 G A 29.20 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.72;MQ=59.38;MQ0=0;OQ=570.39;QD=15.42;SB=-188.28 GT:AD:DP:GL:GQ 0/1:17,20:31:-69.66,-9.34,-43.55:99
-chr1 1902361 rs35032062 A G 8.53 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=1.19;MQ=56.62;MQ0=0;OQ=288.56;QD=9.31;SB=-81.77 GT:AD:DP:GL:GQ 0/1:15,16:27:-40.29,-8.15,-49.29:99
-chr1 1902443 rs4648742 T G 2.74 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=3;HaplotypeScore=1.88;MQ=52.64;MQ0=0;OQ=307.57;QD=13.98;SB=-102.98 GT:AD:DP:GL:GQ 0/1:8,14:19:-39.76,-5.72,-27.07:99
-chr1 1902590 rs34957887 A G 5.37 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=54.60;MQ0=0;OQ=111.21;QD=3.83;SB=-42.82 GT:AD:DP:GL:GQ 0/1:21,8:27:-22.55,-8.14,-76.38:99
-chr1 1902594 rs34699657 T C 6.89 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=55.30;MQ0=0;OQ=114.19;QD=4.08;SB=-28.64 GT:AD:DP:GL:GQ 0/1:19,9:26:-22.55,-7.85,-71.28:99
-chr1 1902618 rs13302917 G C 80.21 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=55.30;MQ0=0;OQ=235.26;QD=8.40;SB=8.06 GT:AD:DP:GL:GQ 0/1:18,10:26:-34.65,-7.84,-76.52:99
-chr1 1902752 . G A 16.41 LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=23.04;MQ0=3;QD=0.82;SB=-30.52 GT:AD:DP:GL:GQ 0/1:17,3:9:-7.63,-2.71,-23.66:49.15
-chr1 1902780 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=12.84;MQ=20.15;MQ0=3;OQ=68.78;QD=3.62;SB=-7.00 GT:AD:DP:GL:GQ 0/1:14,5:6:-11.97,-1.81,-9.13:73.25
-chr1 1902787 . G A 0.55 PASS AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=20.15;MQ0=3;OQ=103.65;QD=5.46;SB=-46.55 GT:AD:DP:GL:GQ 0/1:13,6:5:-15.16,-1.51,-3.80:22.92
-chr1 1902803 . A G 0.43 PASS AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=19.89;MQ0=3;OQ=59.98;QD=3.75;SB=-6.99 GT:AD:DP:GL:GQ 0/1:11,5:6:-11.09,-1.81,-11.69:92.82
-chr1 1902817 . T C 41.42 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=9.95;MQ=22.02;MQ0=2;QD=2.96;SB=-35.94 GT:AD:DP:GL:GQ 0/1:9,4:6:-9.23,-1.81,-11.87:74.25
-chr1 1902835 rs61776983 A C 26.37 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.55;MQ=20.97;MQ0=2;OQ=78.83;QD=5.63;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,12:3:-11.37,-0.90,-0.00:9.03
-chr1 1903052 . G A 0.07 PASS AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=21.19;MQ0=5;OQ=185.24;QD=7.12;SB=-114.97 GT:AD:DP:GL:GQ 0/1:13,13:10:-24.83,-3.02,-9.74:67.23
-chr1 1903096 . C T 19.36 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=27.09;MQ=29.12;MQ0=4;QD=0.84;SB=-32.50 GT:AD:DP:GL:GQ 0/1:20,3:10:-8.23,-3.01,-26.23:52.14
-chr1 1903103 . G A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=11.25;MQ=32.31;MQ0=4;OQ=203.36;QD=8.13;SB=-108.63 GT:AD:DP:GL:GQ 0/1:11,14:13:-27.54,-3.92,-21.98:99
-chr1 1903122 . G A 1.51 PASS AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=5.86;MQ=37.50;MQ0=2;OQ=277.72;QD=11.11;SB=-116.63 GT:AD:DP:GL:GQ 0/1:11,14:14:-35.28,-4.22,-14.88:99
-chr1 1903133 . C T 26.70 DPFilter;HARD_TO_VALIDATE;Indel;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=14.79;MQ=33.51;MQ0=4;QD=0.92;SB=2.00 GT:AD:DP:GL:GQ 0/1:25,3:16:-10.78,-4.83,-41.60:59.53
-chr1 1903194 . G A 0.17 PASS AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=22.60;MQ0=6;OQ=59.87;QD=3.15;SB=-29.63 GT:AD:DP:GL:GQ 0/1:15,4:8:-11.68,-2.41,-15.55:92.71
-chr1 1903256 rs56273126 A C 0.43 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=9.88;MQ=34.34;MQ0=2;OQ=157.91;QD=8.77;SB=-43.00 GT:AD:DP:GL:GQ 0/1:8,10:11:-22.39,-3.31,-17.60:99
-chr1 1903263 rs56067355 C T 0.21 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=9.27;MQ=35.40;MQ0=1;OQ=103.77;QD=4.72;SB=-3.99 GT:AD:DP:GL:GQ 0/1:16,6:17:-18.78,-5.12,-41.68:99
-chr1 1903283 . G A 8.07 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.95;MQ=39.68;MQ0=0;OQ=372.77;QD=10.96;SB=-73.09 GT:AD:DP:GL:GQ 0/1:17,16:22:-47.20,-6.63,-29.71:99
-chr1 1903404 . C T 39.84 LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=6.15;MQ=48.13;MQ0=1;QD=1.73;SB=-35.65 GT:AD:DP:GL:GQ 0/1:19,4:16:-12.09,-4.83,-40.40:72.68
-chr1 1903423 rs58434854 A G 0.71 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=7.95;MQ=46.73;MQ0=3;OQ=182.58;QD=6.30;SB=-71.95 GT:AD:DP:GL:GQ 0/1:18,11:23:-28.48,-6.94,-51.85:99
-chr1 1903439 rs58923167 C T 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=17.53;MQ=42.29;MQ0=6;OQ=136.42;QD=4.01;SB=-25.62 GT:AD:DP:GL:GQ 0/1:26,8:22:-23.56,-6.63,-53.26:99
-chr1 1903440 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=17.53;MQ=42.29;MQ0=6;OQ=187.84;QD=5.52;SB=-110.54 GT:AD:DP:GL:GQ 0/1:26,8:23:-29.00,-6.94,-48.31:99
-chr1 1903458 rs55879512 A G 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=7.35;MQ=44.38;MQ0=5;OQ=75.85;QD=1.85;SB=-63.75 GT:AD:DP:GL:GQ 0/1:26,14:24:-18.11,-7.24,-65.52:99
-chr1 1903493 . G A 1.04 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=47.31;MQ0=2;OQ=168.07;QD=4.31;SB=-57.28 GT:AD:DP:GL:GQ 0/1:31,8:25:-27.63,-7.54,-58.38:99
-chr1 1903509 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=11.62;MQ=39.25;MQ0=5;OQ=92.69;QD=2.73;SB=5.04 GT:AD:DP:GL:GQ 0/1:25,9:18:-17.98,-5.43,-46.46:99
-chr1 1903540 . G A 33.23 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=27.81;MQ=22.93;MQ0=9;QD=1.15;SB=-3.98 GT:AD:DP:GL:GQ 0/1:26,3:5:-8.11,-1.51,-11.06:66.06
-chr1 1903547 . T A 34.51 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=29.76;MQ=15.81;MQ0=9;QD=1.33;SB=-42.38 GT:AD:DP:GL:GQ 0/1:19,6:3:-7.64,-0.90,-3.64:27.36
-chr1 1903587 rs4648605 C T 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=14.50;MQ=19.08;MQ0=11;OQ=79.27;QD=1.98;SB=-3.99 GT:AD:DP:GL:GQ 0/1:27,13:10:-14.23,-3.02,-19.87:99
-chr1 1904125 rs4648745 T C 247.21 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.25;MQ0=0;OQ=694.34;QD=11.20;SB=-245.29 GT:AD:DP:GL:GQ 0/1:33,29:61:-91.10,-18.39,-129.32:99
-chr1 1904347 rs4648746 A G 176.14 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.39;MQ0=0;OQ=338.48;QD=8.91;SB=-150.90 GT:AD:DP:GL:GQ 0/1:21,17:36:-47.98,-10.85,-82.55:99
-chr1 1904465 rs28737396 A T 328.52 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1094.85;QD=18.56;SB=-354.42 GT:AD:DP:GL:GQ 0/1:24,35:59:-130.54,-17.77,-93.43:99
-chr1 1904806 rs61776990 C T 103.75 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=56.91;MQ0=0;OQ=639.60;QD=17.29;SB=-221.92 GT:AD:DP:GL:GQ 0/1:15,22:35:-77.80,-10.56,-46.60:99
-chr1 1905885 rs4648747 G A 213.38 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=54.80;MQ0=0;OQ=758.00;QD=15.16;SB=-295.79 GT:AD:DP:GL:GQ 0/1:26,24:49:-93.85,-14.76,-88.23:99
-chr1 1905894 rs13303091 C T 219.74 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=53.79;MQ0=0;OQ=656.87;QD=13.14;SB=-261.28 GT:AD:DP:GL:GQ 0/1:27,22:45:-82.54,-13.57,-75.64:99
-chr1 1905900 rs13302998 T C 119.27 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=54.88;MQ0=0;OQ=405.99;QD=8.83;SB=-193.60 GT:AD:DP:GL:GQ 0/1:27,19:44:-57.15,-13.26,-102.12:99
-chr1 1906158 rs13302999 C T 171.25 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=58.63;MQ0=0;OQ=813.49;QD=15.95;SB=-262.17 GT:AD:DP:GL:GQ 0/1:25,26:49:-99.40,-14.77,-77.74:99
-chr1 1906389 rs3795284 C T 21.30 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=2.33;MQ=60.00;MQ0=0;OQ=758.20;QD=14.04;SB=-278.28 GT:AD:DP:GL:GQ 0/1:28,26:52:-94.77,-15.67,-93.68:99
-chr1 1906447 rs3795283 G T 377.61 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=60.00;MQ0=0;OQ=998.45;QD=16.37;SB=-378.14 GT:AD:DP:GL:GQ 0/1:26,35:60:-121.20,-18.07,-93.96:99
-chr1 1906750 rs3795280 C T 425.49 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=568.99;QD=13.55;SB=-250.75 GT:AD:DP:GL:GQ 0/1:24,18:42:-72.83,-12.65,-87.72:99
-chr1 1906918 rs34331632 A G 117.25 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=58.45;MQ0=0;OQ=396.71;QD=8.82;SB=-212.27 GT:AD:DP:GL:GQ 0/1:26,19:41:-55.32,-12.36,-92.05:99
-chr1 1907309 rs34567059 T G 9.37 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=3;HaplotypeScore=0.99;MQ=59.28;MQ0=0;OQ=266.80;QD=8.34;SB=-138.72 GT:AD:DP:GL:GQ 0/1:18,13:26:-37.80,-7.84,-51.38:99
-chr1 1907332 rs13303173 G A 219.11 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.50;MQ0=0;OQ=402.42;QD=8.75;SB=-215.71 GT:AD:DP:GL:GQ 0/1:30,16:41:-55.89,-12.37,-85.41:99
-chr1 1907475 rs13302992 A T 11.71 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.57;MQ=54.24;MQ0=0;OQ=373.16;QD=8.88;SB=-86.42 GT:AD:DP:GL:GQ 0/1:20,21:33:-50.55,-9.95,-63.90:99
-chr1 1907510 rs13302993 T C 10.65 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=3.38;MQ=53.93;MQ0=0;OQ=691.42;QD=12.35;SB=-327.29 GT:AD:DP:GL:GQ 0/1:24,32:51:-87.80,-15.38,-95.79:99
-chr1 1907689 rs4648748 T G 25.50 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.34;MQ=60.00;MQ0=0;OQ=189.73;QD=5.93;SB=-95.86 GT:AD:DP:GL:GQ 0/1:21,11:31:-31.60,-9.34,-75.09:99
-chr1 1907731 rs4648749 T A 88.57 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=58.55;MQ0=0;OQ=1056.82;QD=33.03;SB=-482.74 GT:AD:DP:GL:GQ 1/1:0,32:31:-109.29,-9.34,-0.02:93.25
-chr1 1907768 rs4648750 A C 41.15 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=58.69;MQ0=0;OQ=501.71;QD=15.68;SB=-178.91 GT:AD:DP:GL:GQ 0/1:13,18:31:-62.79,-9.34,-46.86:99
-chr1 1908051 rs4233028 A G 0.83 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=11.36;MQ=58.24;MQ0=0;OQ=590.53;QD=10.36;SB=-318.09 GT:AD:DP:GL:GQ 0/1:28,29:51:-77.71,-15.37,-108.19:99
-chr1 1908348 rs4350140 A G 295.92 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=483.27;QD=11.51;SB=-249.48 GT:AD:DP:GL:GQ 0/1:22,19:40:-63.66,-12.05,-87.28:99
-chr1 1908395 rs4535948 A T 243.05 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=561.16;QD=14.03;SB=-291.34 GT:AD:DP:GL:GQ 0/1:20,20:38:-70.85,-11.45,-68.83:99
-chr1 1908444 rs4603072 C T 95.97 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.91;MQ=59.00;MQ0=0;OQ=825.49;QD=16.19;SB=-274.16 GT:AD:DP:GL:GQ 0/1:24,27:46:-99.69,-13.86,-72.18:99
-chr1 1908455 rs4466593 G A 154 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.00;MQ0=0;OQ=749.94;QD=14.70;SB=-209.69 GT:AD:DP:GL:GQ 0/1:25,26:47:-92.45,-14.17,-73.64:99
-chr1 1910822 rs13303020 T C 316 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.07;MQ0=0;OQ=856.90;QD=15.30;SB=-348.06 GT:AD:DP:GL:GQ 0/1:22,34:54:-105.26,-16.29,-79.82:99
-chr1 1912163 rs13303195 C T 281.64 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.42;MQ0=0;OQ=1071.80;QD=15.76;SB=-460.45 GT:AD:DP:GL:GQ 0/1:35,33:67:-130.66,-20.19,-113.97:99
-chr1 1912512 rs13303233 T C 59.35 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=5.24;MQ=56.21;MQ0=1;OQ=632.02;QD=12.15;SB=-238.92 GT:AD:DP:GL:GQ 0/1:24,28:49:-81.26,-14.77,-90.12:99
-chr1 1912694 rs6605075 T C 195.05 PASS AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.81;MQ0=0;OQ=3518.98;QD=36.28;SB=-1667.64 GT:AD:DP:GL:GQ 1/1:0,97:97:-350.90,-29.22,-0.04:99
-chr1 1912989 rs13303332 A G 477.80 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.92;MQ0=0;OQ=1063.77;QD=12.66;SB=-392.88 GT:AD:DP:GL:GQ 0/1:42,42:74:-131.95,-22.29,-145.18:99
-chr1 1913060 rs13303315 T C 275.58 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=55.32;MQ0=0;OQ=932.62;QD=13.14;SB=-432.88 GT:AD:DP:GL:GQ 0/1:32,39:67:-116.74,-20.20,-124.71:99
-chr1 1913077 rs7529662 A G 28.09 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=51.94;MQ0=0;OQ=415.73;QD=6.60;SB=-158.33 GT:AD:DP:GL:GQ 0/1:37,26:55:-61.45,-16.59,-136.84:99
-chr1 1913121 rs6605076 G A 18.01 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=38.45;MQ0=0;OQ=1375.58;QD=22.55;SB=-647.86 GT:AD:DP:GL:GQ 1/1:0,60:36:-143.81,-13.38,-2.67:99
-chr1 1913134 rs6662056 C T 90.11 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=31.19;MQ0=0;OQ=470.14;QD=8.11;SB=-253.79 GT:AD:DP:GL:GQ 0/1:33,25:32:-59.95,-9.65,-52.35:99
-chr1 1913140 rs6605077 T C 265.58 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=26.77;MQ0=0;OQ=931.68;QD=17.25;SB=-415.14 GT:AD:DP:GL:GQ 1/1:0,54:27:-96.76,-8.13,-0.01:81.23
-chr1 1913166 rs6605078 A G 225.40 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=29.40;MQ0=0;OQ=379.61;QD=9.73;SB=-193.70 GT:AD:DP:GL:GQ 1/1:0,39:13:-41.56,-3.92,-0.01:39.09
-chr1 1913525 rs13303140 A G 349.47 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.90;MQ0=0;OQ=337.35;QD=9.92;SB=-170.51 GT:AD:DP:GL:GQ 0/1:16,18:26:-44.86,-7.84,-45.87:99
-chr1 1913541 rs6675865 A G 238.98 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=54.81;MQ0=0;OQ=476.22;QD=12.53;SB=-203.64 GT:AD:DP:GL:GQ 0/1:19,19:32:-60.55,-9.64,-59.13:99
-chr1 1914266 rs35822535 A G 10.16 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.48;MQ=52.01;MQ0=0;OQ=172.60;QD=5.57;SB=-106.80 GT:AD:DP:GL:GQ 0/1:17,12:25:-30.72,-10.17,-62.92:99
-chr1 1914406 rs28674034 C A 137.53 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=56.09;MQ0=0;OQ=479.30;QD=11.15;SB=-93.09 GT:AD:DP:GL:GQ 0/1:24,19:37:-62.36,-11.14,-73.40:99
-chr1 1914407 . C G 17.06 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.38;MQ=56.18;MQ0=0;OQ=578.11;QD=13.14;SB=-126.71 GT:AD:DP:GL:GQ 0/1:24,20:35:-71.66,-10.56,-69.93:99
-chr1 1914645 rs58504758 G A 76.95 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.31;MQ0=0;OQ=649.38;QD=14.43;SB=-87.56 GT:AD:DP:GL:GQ 0/1:23,22:44:-81.48,-13.26,-81.33:99
-chr1 1914669 rs57460771 C G 59.99 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=52.90;MQ0=0;OQ=635.24;QD=15.88;SB=-152.79 GT:AD:DP:GL:GQ 0/1:17,23:37:-77.97,-11.16,-71.80:99
-chr1 1915019 rs5021356 C T 38.12 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=38.83;MQ0=0;OQ=299.26;QD=5.16;SB=-51.25 GT:AD:DP:GL:GQ 0/1:26,32:29:-41.96,-8.75,-54.57:99
-chr1 1915025 rs5021357 C T 0.49 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=37.79;MQ0=0;OQ=104.46;QD=1.66;SB=-36.16 GT:AD:DP:GL:GQ 0/1:31,32:32:-23.37,-9.64,-89.65:99
-chr1 1915153 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=18.97;MQ=41.21;MQ0=1;OQ=317.64;QD=7.56;SB=-31.63 GT:AD:DP:GL:GQ 0/1:23,16:24:-42.29,-7.24,-39.07:99
-chr1 1915186 rs2377036 C A 0.52 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=38.80;MQ0=2;OQ=789.31;QD=23.22;SB=-127.84 GT:AD:DP:GL:GQ 1/1:3,31:25:-82.54,-7.54,-0.02:75.13
-chr1 1915197 . C T 2.41 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=35.96;MQ0=2;OQ=151.83;QD=4.34;SB=2.02 GT:AD:DP:GL:GQ 0/1:24,11:24:-25.70,-7.23,-56.48:99
-chr1 1915324 rs2889540 C T 459.53 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.97;MQ0=0;OQ=2370.24;QD=35.38;SB=-497.01 GT:AD:DP:GL:GQ 1/1:1,66:63:-240.64,-18.99,-0.03:99
-chr1 1915581 rs6691182 G A 155.40 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=58.09;MQ0=0;OQ=1565.00;QD=18.20;SB=-799.86 GT:AD:DP:GL:GQ 0/1:40,46:84:-185.10,-25.32,-125.47:99
-chr1 1915947 rs6661597 T C 434.36 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=753.37;QD=11.59;SB=-273.59 GT:AD:DP:GL:GQ 0/1:32,33:62:-97.31,-18.69,-126.97:99
-chr1 1915962 rs6675751 G C 346.68 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1124.09;QD=17.56;SB=-315.97 GT:AD:DP:GL:GQ 0/1:34,30:64:-134.99,-19.30,-134.99:99
-chr1 1916138 rs6667687 A T 24.65 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=5.93;MQ=59.44;MQ0=0;OQ=1046.27;QD=14.14;SB=-543.64 GT:AD:DP:GL:GQ 0/1:37,36:71:-129.30,-21.39,-135.06:99
-chr1 1917124 rs13302991 A G 77.08 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=48.19;MQ0=0;OQ=664.15;QD=15.09;SB=-132.68 GT:AD:DP:GL:GQ 0/1:17,27:41:-82.05,-12.36,-62.14:99
-chr1 1918235 rs58325500 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.01;HRun=15;HaplotypeScore=12.28;MQ=47.41;MQ0=2;OQ=54.80;QD=0.68;SB=8.48 GT:AD:DP:GL:GQ 0/1:66,14:56:-25.35,-16.59,-150.42:87.64
-chr1 1918448 rs28827857 G A 289.35 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=57.61;MQ0=0;OQ=1091.40;QD=15.82;SB=-363.89 GT:AD:DP:GL:GQ 0/1:36,33:66:-132.32,-19.90,-105.59:99
-chr1 1918459 rs28770275 C T 156.31 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.33;MQ0=0;OQ=990.70;QD=15.98;SB=-272.19 GT:AD:DP:GL:GQ 0/1:31,31:62:-121.04,-18.69,-98.12:99
-chr1 1919267 rs6672175 T C 222.23 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=59.22;MQ0=0;OQ=1139.84;QD=14.61;SB=-513.90 GT:AD:DP:GL:GQ 0/1:38,40:77:-140.46,-23.19,-152.92:99
-chr1 1919526 rs7532409 A G 229.15 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.27;MQ0=0;OQ=832.47;QD=13.21;SB=-385.03 GT:AD:DP:GL:GQ 0/1:26,37:58:-104.01,-17.48,-104.69:99
-chr1 1919694 rs7532529 A C 228.41 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=57.10;MQ0=0;OQ=714.32;QD=14.58;SB=-265.84 GT:AD:DP:GL:GQ 0/1:24,25:47:-88.87,-14.15,-84.13:99
-chr1 1919719 rs7527169 T C 335.23 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.16;MQ0=0;OQ=729.87;QD=16.59;SB=-259.34 GT:AD:DP:GL:GQ 0/1:16,28:43:-89.23,-12.96,-64.51:99
-chr1 1919737 rs7520124 C A 233.30 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.52;MQ0=0;OQ=916.99;QD=20.84;SB=-414.85 GT:AD:DP:GL:GQ 0/1:15,29:44:-108.24,-13.26,-45.66:99
-chr1 1919954 rs7542825 G A 154.86 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.01;MQ0=0;OQ=805.39;QD=15.79;SB=-224.54 GT:AD:DP:GL:GQ 0/1:26,25:50:-98.90,-15.08,-78.21:99
-chr1 1920251 rs6605079 C G 333.78 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1146.24;QD=15.08;SB=-200.61 GT:AD:DP:GL:GQ 0/1:45,31:76:-140.81,-22.90,-188.17:99
-chr1 1920372 rs6605080 A G 234.56 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=57.79;MQ0=0;OQ=682.29;QD=12.87;SB=-281.00 GT:AD:DP:GL:GQ 0/1:25,28:47:-85.67,-14.16,-99.05:99
-chr1 1920614 rs6605081 C T 426.14 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=58.39;MQ0=0;OQ=1403.83;QD=17.12;SB=-667.29 GT:AD:DP:GL:GQ 0/1:39,43:80:-167.77,-24.10,-135.75:99
-chr1 1920665 rs6605082 G C 238.27 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=58.49;MQ0=0;OQ=1324.95;QD=16.99;SB=-669.29 GT:AD:DP:GL:GQ 0/1:42,36:76:-158.70,-22.92,-158.25:99
-chr1 1920803 rs13303035 C T 159 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=59.45;MQ0=0;OQ=1062.14;QD=13.98;SB=-530.37 GT:AD:DP:GL:GQ 0/1:41,35:73:-131.51,-22.01,-125.50:99
-chr1 1920841 rs13303352 T C 445.18 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.82;MQ0=0;OQ=837.48;QD=11.63;SB=-306.06 GT:AD:DP:GL:GQ 0/1:38,34:70:-108.13,-21.10,-146.79:99
-chr1 1921055 rs13303031 G T 88.89 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=58.92;MQ0=0;OQ=786.34;QD=15.12;SB=-342.30 GT:AD:DP:GL:GQ 0/1:26,26:52:-97.58,-15.66,-91.48:99
-chr1 1921356 rs6685055 A G 17.33 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.97;MQ=59.49;MQ0=0;OQ=448.41;QD=9.96;SB=-237.28 GT:AD:DP:GL:GQ 0/1:26,19:44:-61.39,-13.26,-100.60:99
-chr1 1921389 rs6679335 T G 83.14 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.67;MQ=59.13;MQ0=0;OQ=685.03;QD=12.93;SB=-353.06 GT:AD:DP:GL:GQ 0/1:29,24:52:-87.45,-15.66,-100.08:99
-chr1 1922327 rs28588769 G A 183.28 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.89;MQ0=1;OQ=778.96;QD=15.58;SB=-259.18 GT:AD:DP:GL:GQ 0/1:25,25:47:-95.35,-14.17,-73.16:99
-chr1 1922868 rs2376808 G A 157.54 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.34;MQ0=0;OQ=723.69;QD=10.34;SB=-347.08 GT:AD:DP:GL:GQ 0/1:45,25:64:-94.96,-19.30,-123.08:99
-chr1 1922895 rs2376807 G A 266.63 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=58.98;MQ0=0;OQ=1217.48;QD=13.99;SB=-488.00 GT:AD:DP:GL:GQ 0/1:49,38:84:-150.33,-25.30,-168.79:99
-chr1 1923727 rs4434797 T C 63.04 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.46;MQ0=0;OQ=1150.76;QD=28.77;SB=-542.44 GT:AD:DP:GL:GQ 1/1:1,39:35:-118.68,-10.55,-0.02:99
-chr1 1923976 rs2376806 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=7;HaplotypeScore=3.79;MQ=59.30;MQ0=0;OQ=886.58;QD=14.78;SB=-242.95 GT:AD:DP:GL:GQ 0/1:31,29:60:-110.01,-18.07,-107.98:99
-chr1 1924507 rs6682175 C G 459.83 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1286.38;QD=16.93;SB=-654.00 GT:AD:DP:GL:GQ 0/1:39,37:74:-154.22,-22.30,-163.90:99
-chr1 1925440 . A C 17.47 PASS AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=54.31;MQ0=0;OQ=233.12;QD=9.71;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,12:20:-32.62,-6.03,-38.03:99
-chr1 1925994 rs13303219 G A 173.92 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.24;MQ0=0;OQ=2130.07;QD=38.04;SB=-927.23 GT:AD:DP:GL:GQ 1/1:0,56:55:-216.61,-16.57,-0.02:99
-chr1 1927245 . C A 6.32 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=50.81;MQ0=0;OQ=1490.54;QD=26.15;SB=-627.15 GT:AD:DP:GL:GQ 0/1:11,46:54:-168.60,-16.27,-27.03:99
-chr1 1929194 . G A 93.04 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=54.76;MQ0=0;OQ=934.74;QD=16.40;SB=-478.51 GT:AD:DP:GL:GQ 0/1:29,28:56:-113.63,-16.87,-101.37:99
-chr1 1929934 . G A 0.59 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=6.95;MQ=58.36;MQ0=1;OQ=902.25;QD=19.20;SB=-435.95 GT:AD:DP:GL:GQ 0/1:20,27:46:-107.37,-13.86,-69.60:99
-chr1 1931518 rs6605072 C T 176.76 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.65;MQ0=0;OQ=1960.94;QD=37.71;SB=-913.32 GT:AD:DP:GL:GQ 1/1:0,52:51:-199.70,-15.37,-0.02:99
-chr1 1931688 rs13303071 T C 1556.10 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=48.24;MQ0=0;QD=27.79;SB=-792.66 GT:AD:DP:GL:GQ 1/1:0,56:50:-159.24,-15.08,-0.05:99
-chr1 1931693 . A G 1848.16 SnpCluster AC=2;AF=1.00;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.03;MQ0=0;QD=33.60;SB=-934.96 GT:AD:DP:GL:GQ 1/1:0,55:53:-188.42,-15.97,-0.02:99
-chr1 1931694 . T A 1917.61 SnpCluster AC=2;AF=1.00;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=49.24;MQ0=0;QD=35.51;SB=-952.61 GT:AD:DP:GL:GQ 1/1:0,54:52:-195.36,-15.66,-0.02:99
-chr1 1931789 rs6656398 G A 540.24 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.77;MQ0=0;OQ=2040.90;QD=38.51;SB=-804.04 GT:AD:DP:GL:GQ 1/1:0,53:51:-207.69,-15.36,-0.01:99
-chr1 1931893 rs13303124 C A 616.35 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.54;MQ0=0;OQ=2901.26;QD=36.72;SB=-1390.14 GT:AD:DP:GL:GQ 1/1:0,79:79:-293.73,-23.79,-0.02:99
-chr1 1933151 rs6672254 C T 447.19 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1292.37;QD=33.14;SB=-431.53 GT:AD:DP:GL:GQ 1/1:0,39:34:-132.84,-10.25,-0.02:99
-chr1 1933961 rs6605073 C G 112.88 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=54.93;MQ0=0;OQ=3433.93;QD=42.39;SB=-1558.19 GT:AD:DP:GL:GQ 1/1:0,81:81:-342.39,-24.42,-0.04:99
-chr1 1936451 rs13303016 G A 86.32 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=58.88;MQ0=0;OQ=2221.58;QD=38.30;SB=-691.42 GT:AD:DP:GL:GQ 1/1:0,56:56:-225.76,-16.87,-0.02:99
-chr1 1936669 rs4648752 C T 217.65 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=2508.96;QD=37.45;SB=-1210.99 GT:AD:DP:GL:GQ 1/1:0,67:64:-254.50,-19.28,-0.02:99
-chr1 1937615 rs2376804 C A 568.58 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.26;MQ0=0;OQ=1581.66;QD=34.38;SB=-723.87 GT:AD:DP:GL:GQ 1/1:0,46:45:-161.77,-13.56,-0.02:99
-chr1 1938260 rs13303344 C A 671.62 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1865.08;QD=33.91;SB=-728.87 GT:AD:DP:GL:GQ 1/1:0,55:54:-190.12,-16.27,-0.02:99
-chr1 1938665 rs4481796 T C 1.68 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=7.00;MQ=59.19;MQ0=0;OQ=1999.82;QD=33.90;SB=-790.00 GT:AD:DP:GL:GQ 1/1:1,58:55:-203.58,-16.56,-0.01:99
-chr1 1939404 rs3121818 G T 55.95 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.13;MQ=57.70;MQ0=0;OQ=2038.83;QD=32.88;SB=-977.56 GT:AD:DP:GL:GQ 1/1:1,61:60:-210.75,-18.07,-3.28:99
-chr1 1940481 rs28603108 G A 85.60 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=244.10;QD=30.51;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:7:-27.99,-2.11,-0.00:21.07
-chr1 1941687 rs3121819 A G 228.42 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2020.01;QD=32.58;SB=-994.40 GT:AD:DP:GL:GQ 1/1:0,62:62:-205.63,-18.69,-0.05:99
-chr1 1942465 rs28502222 T C 371.08 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=1719.40;QD=30.16;SB=-855.54 GT:AD:DP:GL:GQ 1/1:0,57:54:-175.57,-16.29,-0.05:99
-chr1 1942470 rs28407473 T C 563.92 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1937.81;QD=31.25;SB=-894.53 GT:AD:DP:GL:GQ 1/1:0,62:60:-197.41,-18.09,-0.05:99
-chr1 1942642 rs3128318 C A 368.40 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1363.24;QD=34.95;SB=-493.39 GT:AD:DP:GL:GQ 1/1:0,39:38:-139.92,-11.45,-0.01:99
-chr1 1943112 rs3128321 T C 309.66 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=865.40;QD=28.85;SB=-224.64 GT:AD:DP:GL:GQ 1/1:0,30:27:-90.14,-8.14,-0.02:81.21
-chr1 1943436 rs28595482 G A 148.08 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.62;MQ0=0;OQ=1902.67;QD=38.83;SB=-885.18 GT:AD:DP:GL:GQ 1/1:0,49:48:-193.87,-14.46,-0.01:99
-chr1 1943672 rs4648614 C T 198.11 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.32;MQ0=0;OQ=2028.99;QD=36.89;SB=-959.37 GT:AD:DP:GL:GQ 1/1:0,55:53:-206.51,-15.97,-0.03:99
-chr1 1944296 rs3128322 G A 216.26 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.01;MQ0=0;OQ=2427.18;QD=36.78;SB=-1173.08 GT:AD:DP:GL:GQ 1/1:0,65:64:-246.33,-19.29,-0.03:99
-chr1 1944940 rs3128323 G A 20.33 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=59.13;MQ0=0;OQ=1516.55;QD=28.61;SB=-577.76 GT:AD:DP:GL:GQ 1/1:0,53:41:-155.26,-12.36,-0.02:99
-chr1 1945844 rs2889475 C T 626.28 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=2161.84;QD=35.44;SB=-988.03 GT:AD:DP:GL:GQ 1/1:0,61:56:-219.79,-16.87,-0.02:99
-chr1 1946222 rs2376805 G A 202.65 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.86;MQ0=0;OQ=2273.19;QD=37.27;SB=-1064.36 GT:AD:DP:GL:GQ 1/1:0,61:58:-230.92,-17.47,-0.02:99
-chr1 1946897 rs2229110 T C 11.35 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=58.29;MQ0=0;OQ=1169.00;QD=28.51;SB=-410.54 GT:AD:DP:GL:GQ 1/1:1,40:35:-120.50,-10.54,-0.02:99
-chr1 1947159 rs3820007 C T 19.86 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=59.17;MQ0=0;OQ=557.21;QD=19.90;SB=-159.09 GT:AD:DP:GL:GQ 1/1:0,24:17:-62.02,-7.79,-2.71:50.81
-chr1 1949121 rs28574670 A G 500.63 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1666.55;QD=35.46;SB=-850.35 GT:AD:DP:GL:GQ 1/1:0,47:47:-170.25,-14.16,-0.02:99
-chr1 1949838 rs28409373 C T 14.57 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.07;MQ0=0;OQ=1034.54;QD=34.48;SB=-177.68 GT:AD:DP:GL:GQ 1/1:0,30:29:-107.06,-8.75,-0.02:87.26
-chr1 1950786 rs28581504 T C 332.55 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.64;MQ0=0;OQ=1013.22;QD=32.68;SB=-423.78 GT:AD:DP:GL:GQ 1/1:0,31:30:-104.92,-9.04,-0.02:90.23
-chr1 1953035 rs13302932 A G 11.68 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.55;MQ=60.00;MQ0=0;OQ=905.11;QD=24.46;SB=-434.83 GT:AD:DP:GL:GQ 1/1:0,37:30:-94.12,-9.05,-0.03:90.20
-chr1 1953275 rs17715203 A G 438.40 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1126.75;QD=30.45;SB=-438.29 GT:AD:DP:GL:GQ 1/1:0,37:35:-116.28,-10.55,-0.02:99
-chr1 1955750 . G C 30.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=3;HaplotypeScore=5.70;MQ=42.68;MQ0=2;QD=0.27;SB=83.98 GT:AD:DP:GL:GQ 0/1:64,50:68:-26.83,-20.49,-269.17:63.39
-chr1 1955789 . C G 28.79 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=3.29;MQ=41.60;MQ0=2;QD=0.26;SB=62.45 GT:AD:DP:GL:GQ 0/1:60,50:64:-25.45,-19.29,-247.08:61.62
-chr1 1956476 rs3128311 A G 7.52 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=2.79;MQ=58.13;MQ0=0;OQ=1189.30;QD=33.98;SB=-560.89 GT:AD:DP:GL:GQ 1/1:0,35:34:-122.53,-10.24,-0.01:99
-chr1 1956519 rs3128312 A G 0.03 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=5;HaplotypeScore=2.16;MQ=57.85;MQ0=0;OQ=1010.92;QD=30.63;SB=-251.77 GT:AD:DP:GL:GQ 1/1:0,33:30:-104.69,-9.04,-0.02:90.25
-chr1 1956874 . G A 318.30 PASS AC=2;AF=1.00;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1884.66;QD=38.46;SB=-687.34 GT:AD:DP:GL:GQ 1/1:0,49:48:-192.06,-14.46,-0.01:99
-chr1 1957814 rs2376803 C T 3.63 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=59.46;MQ0=0;OQ=1636.24;QD=38.05;SB=-662.40 GT:AD:DP:GL:GQ 1/1:0,43:42:-167.22,-12.65,-0.01:99
-chr1 1958691 rs9442614 A G 93.39 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.19;MQ0=0;OQ=1548.19;QD=27.16;SB=-690.61 GT:AD:DP:GL:GQ 1/1:0,57:50:-158.45,-15.08,-0.05:99
-chr1 1958819 rs13303086 G A 42.72 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.38;MQ0=0;OQ=1355.91;QD=36.65;SB=-559.75 GT:AD:DP:GL:GQ 1/1:0,37:35:-139.19,-10.54,-0.01:99
-chr1 1961249 rs3121820 G C 348.51 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.98;MQ0=0;OQ=1964.71;QD=40.10;SB=-703.68 GT:AD:DP:GL:GQ 1/1:0,49:48:-200.08,-14.47,-0.02:99
-chr1 1964088 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=20;HaplotypeScore=27.35;MQ=45.54;MQ0=0;OQ=216.77;QD=4.93;SB=-12.47 GT:AD:DP:GL:GQ 0/1:28,16:30:-34.00,-9.04,-73.59:99
-chr1 1966711 rs28394674 G T 70.40 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=58.47;MQ0=0;OQ=2068.09;QD=33.90;SB=-496.39 GT:AD:DP:GL:GQ 1/1:0,60:58:-210.42,-17.47,-0.02:99
-chr1 1974087 rs3128319 C T 215.82 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=59.66;MQ0=0;OQ=974.85;QD=17.72;SB=-353.37 GT:AD:DP:GL:GQ 0/1:25,30:52:-116.43,-15.67,-87.00:99
-chr1 1974552 rs3121826 A G 92.93 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.67;MQ0=0;OQ=1020.08;QD=29.15;SB=-506.02 GT:AD:DP:GL:GQ 1/1:0,35:33:-105.63,-9.96,-0.04:99
-chr1 1974671 rs3121827 G T 491.82 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.58;MQ0=0;OQ=1710.64;QD=34.91;SB=-820.86 GT:AD:DP:GL:GQ 1/1:0,49:48:-174.66,-14.46,-0.02:99
-chr1 1975030 rs35020387 G A 113.28 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1769.06;QD=36.10;SB=-889.65 GT:AD:DP:GL:GQ 1/1:0,49:46:-180.51,-13.86,-0.02:99
-chr1 1982066 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=56.20;MQ0=0;OQ=60.60;QD=2.42;SB=35.14 GT:AD:DP:GL:GQ 0/1:18,7:19:-15.09,-5.75,-56.99:93.44
-chr1 1982837 rs17777295 G T 2.34 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=4.79;MQ=57.88;MQ0=0;OQ=1411.52;QD=35.29;SB=-620.56 GT:AD:DP:GL:GQ 1/1:0,40:39:-144.75,-11.75,-0.01:99
-chr1 1987331 rs56136180 A G 202.47 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=55.14;MQ0=0;OQ=1346.89;QD=15.85;SB=-685.93 GT:AD:DP:GL:GQ 0/1:38,47:81:-162.37,-24.40,-147.70:99
-chr1 1989540 rs28479788 G A 186.47 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=58.66;MQ0=0;OQ=851.87;QD=16.38;SB=-358.89 GT:AD:DP:GL:GQ 0/1:25,27:48:-102.94,-14.47,-69.44:99
-chr1 1995600 rs2459986 T C 313.08 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.14;MQ0=0;OQ=733.38;QD=27.16;SB=-310.12 GT:AD:DP:GL:GQ 1/1:0,27:25:-76.96,-7.55,-0.03:75.14
-chr1 1996588 rs2678943 T C 52.85 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.08;MQ0=0;OQ=1052.54;QD=26.99;SB=-491.16 GT:AD:DP:GL:GQ 1/1:0,38:34:-108.87,-10.26,-0.03:99
-chr1 1997534 rs2803307 A G 10.35 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.74;MQ=59.13;MQ0=0;OQ=1580.39;QD=29.82;SB=-788.60 GT:AD:DP:GL:GQ 1/1:0,53:50:-161.67,-15.08,-0.05:99
-chr1 1999411 . C T 1.67 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=5.65;MQ=58.95;MQ0=0;OQ=1145.66;QD=18.48;SB=-378.12 GT:AD:DP:GL:GQ 0/1:25,36:58:-135.32,-17.47,-87.50:99
-chr1 2004056 rs28436686 G A 119.72 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.61;MQ0=0;OQ=2326.78;QD=39.44;SB=-1079.37 GT:AD:DP:GL:GQ 1/1:0,59:59:-236.28,-17.77,-0.01:99
-chr1 2014367 rs9729600 T C 414.10 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=1723.74;QD=27.36;SB=-655.55 GT:AD:DP:GL:GQ 1/1:0,63:57:-176.03,-17.20,-0.07:99
-chr1 2015467 rs61775405 G A 154 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=57.06;MQ0=0;OQ=444.57;QD=10.84;SB=-245.22 GT:AD:DP:GL:GQ 0/1:23,18:37:-58.92,-11.18,-62.94:99
-chr1 2015957 . T A 20.13 LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.77;MQ0=3;QD=0.75;SB=-6.99 GT:AD:DP:GL:GQ 0/1:17,10:5:-6.80,-1.51,-8.98:52.92
-chr1 2015991 . G T 43.95 LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=23.36;MQ0=2;QD=1.19;SB=-6.99 GT:AD:DP:GL:GQ 0/1:34,3:8:-10.09,-2.41,-13.96:76.78
-chr1 2017284 rs12123775 G A 100.24 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=256.85;QD=11.17;SB=-34.51 GT:AD:DP:GL:GQ 0/1:14,9:22:-35.60,-6.63,-46.44:99
-chr1 2019252 rs3128329 T C 18.82 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=58.39;MQ0=0;OQ=1634.16;QD=29.71;SB=-754.64 GT:AD:DP:GL:GQ 1/1:0,55:52:-167.05,-15.69,-0.05:99
-chr1 2019320 . T G 18.93 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=4;HaplotypeScore=7.98;MQ=58.04;MQ0=0;QD=0.34;SB=68.22 GT:AD:DP:GL:GQ 0/1:29,26:34:-15.41,-10.24,-102.90:51.71
-chr1 2019693 . T G 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=51.54;MQ0=0;OQ=164.91;QD=4.34;SB=47.17 GT:AD:DP:GL:GQ 0/1:19,19:29:-28.51,-8.74,-68.55:99
-chr1 2023899 rs7521371 A G 276.27 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.14;MQ0=0;OQ=762.93;QD=15.26;SB=-284.46 GT:AD:DP:GL:GQ 0/1:23,27:49:-94.34,-14.76,-92.20:99
-chr1 2025239 rs10910029 A G 201.72 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.60;MQ0=0;OQ=1376.71;QD=29.29;SB=-649.94 GT:AD:DP:GL:GQ 1/1:0,47:44:-141.29,-13.27,-0.04:99
-chr1 2025544 rs10910030 C T 525.81 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1279.25;QD=36.55;SB=-479.12 GT:AD:DP:GL:GQ 1/1:0,35:34:-131.53,-10.25,-0.02:99
-chr1 2025659 rs10752741 G A 653.38 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2163.55;QD=37.96;SB=-800.07 GT:AD:DP:GL:GQ 1/1:0,57:55:-219.96,-16.57,-0.02:99
-chr1 2025837 rs10752742 G T 4.06 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=6.39;MQ=58.92;MQ0=0;OQ=1340.29;QD=31.17;SB=-640.07 GT:AD:DP:GL:GQ 1/1:0,43:38:-137.63,-11.45,-0.01:99
-chr1 2026123 rs10797413 G A 219.84 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.78;MQ0=0;OQ=1381.00;QD=36.34;SB=-700.35 GT:AD:DP:GL:GQ 1/1:0,38:36:-141.70,-10.85,-0.01:99
-chr1 2026457 rs3128332 G T 494.54 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1536.71;QD=35.74;SB=-400.25 GT:AD:DP:GL:GQ 1/1:0,43:42:-157.27,-12.65,-0.01:99
-chr1 2027806 . A G 242.28 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=33.01;MQ0=5;QD=9.69;SB=-135.79 GT:AD:DP:GL:GQ 0/1:9,16:13:-31.43,-3.92,-15.54:99
-chr1 2027817 . A G 86.37 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=28.31;MQ0=5;QD=5.08;SB=-66.32 GT:AD:DP:GL:GQ 0/1:7,10:8:-14.33,-2.41,-15.43:99
-chr1 2027825 rs7364595 T C 235.65 PASS AC=2;AF=1.00;AN=2;DB;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.06;MQ0=5;OQ=93.65;QD=7.80;SB=-40.95 GT:AD:DP:GL:GQ 1/1:0,12:4:-12.90,-1.21,-0.00:12.03
-chr1 2027884 . A G 40.99 LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=37.48;MQ0=2;QD=4.10;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,7:4:-8.59,-1.21,-3.37:21.64
-chr1 2027902 . C T 0.78 PASS AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=45.01;MQ0=2;OQ=55.77;QD=3.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,3:11:-12.18,-3.32,-23.75:88.60
-chr1 2027903 . A G 47.94 LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=45.01;MQ0=2;QD=3.00;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,4:11:-11.39,-3.31,-30.54:80.77
-chr1 2027922 rs61775410 A G 254.38 Indel AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=52.34;MQ0=2;QD=12.11;SB=-40.68 GT:AD:DP:GL:GQ 0/1:8,13:15:-33.24,-4.52,-21.40:99
-chr1 2027961 rs12745429 G A 0.31 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=51.66;MQ0=4;OQ=50.47;QD=1.58;SB=-46.03 GT:AD:DP:GL:GQ 0/1:27,5:21:-14.67,-6.34,-51.74:83.30
-chr1 2027962 rs12723086 T C 0.38 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=51.66;MQ0=4;OQ=55.89;QD=1.75;SB=-41.82 GT:AD:DP:GL:GQ 0/1:25,7:25:-16.41,-7.54,-72.40:88.73
-chr1 2027980 . A G 0.42 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=49.52;MQ0=4;OQ=96.12;QD=2.75;SB=-41.28 GT:AD:DP:GL:GQ 0/1:27,8:28:-21.34,-8.45,-80.79:99
-chr1 2027991 . A G 34.81 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.55;MQ=51.01;MQ0=3;OQ=431.23;QD=9.58;SB=-194.62 GT:AD:DP:GL:GQ 0/1:24,21:36:-57.25,-10.85,-78.85:99
-chr1 2028038 rs7349084 A G 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=50.77;MQ0=1;OQ=115.20;QD=1.99;SB=-64.54 GT:AD:DP:GL:GQ 0/1:47,10:48:-29.27,-14.47,-151.97:99
-chr1 2028049 rs12133181 A G 36.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=65.95;MQ=50.10;MQ0=2;QD=0.48;SB=17.41 GT:AD:DP:GL:GQ 0/1:60,12:63:-25.92,-18.99,-218.94:69.39
-chr1 2028057 rs7514664 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=1;HaplotypeScore=92.07;MQ=50.08;MQ0=4;OQ=1734.98;QD=17.53;SB=-712.36 GT:AD:DP:GL:GQ 0/1:13,84:69:-197.59,-20.81,-27.48:66.63
-chr1 2028096 rs7349113 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=1;HaplotypeScore=338.66;MQ=50.60;MQ0=2;OQ=249.31;QD=1.73;SB=17.40 GT:AD:DP:GL:GQ 0/1:107,21:99:-60.23,-32.01,-282.27:99
-chr1 2028116 rs61775411 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=130;Dels=0.00;HRun=1;HaplotypeScore=156.17;MQ=50.22;MQ0=2;OQ=1368.71;QD=10.53;SB=-489.55 GT:AD:DP:GL:GQ 0/1:47,78:82:-164.90,-24.74,-105.56:99
-chr1 2028135 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=77.77;MQ=49.84;MQ0=2;OQ=170.97;QD=2.04;SB=-24.42 GT:AD:DP:GL:GQ 0/1:67,11:63:-39.37,-18.98,-181.92:99
-chr1 2028136 rs12080420 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=76.98;MQ=49.85;MQ0=2;OQ=157.43;QD=1.94;SB=-74.46 GT:AD:DP:GL:GQ 0/1:62,16:61:-37.41,-18.38,-198.10:99
-chr1 2028154 rs3753241 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=33.73;MQ=52.95;MQ0=1;OQ=379.95;QD=7.31;SB=-7.96 GT:AD:DP:GL:GQ 0/1:34,16:44:-54.55,-13.27,-93.77:99
-chr1 2028522 rs3128334 G A 30.30 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=59.44;MQ0=0;OQ=1539.70;QD=37.55;SB=-534.21 GT:AD:DP:GL:GQ 1/1:0,39:39:-157.57,-11.75,-0.01:99
-chr1 2028753 rs908744 G A 89.13 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.73;MQ=58.80;MQ0=0;OQ=1922.45;QD=33.15;SB=-549.87 GT:AD:DP:GL:GQ 1/1:0,58:52:-195.86,-15.68,-0.03:99
-chr1 2029096 rs1040231 G T 78.45 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=58.48;MQ0=0;OQ=1527.94;QD=33.22;SB=-620.05 GT:AD:DP:GL:GQ 1/1:1,45:45:-156.40,-13.56,-0.02:99
-chr1 2029381 rs16824792 G T 92.11 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.28;MQ0=0;OQ=1106.74;QD=34.59;SB=-441.64 GT:AD:DP:GL:GQ 1/1:0,32:31:-114.27,-9.34,-0.01:93.28
-chr1 2029579 rs1878752 G A 107.74 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.58;MQ0=0;OQ=1364.65;QD=36.88;SB=-510.18 GT:AD:DP:GL:GQ 1/1:0,37:36:-140.06,-10.85,-0.01:99
-chr1 2029956 rs6666117 T C 57.04 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=967.27;QD=27.64;SB=-467.25 GT:AD:DP:GL:GQ 1/1:0,35:31:-100.34,-9.35,-0.03:93.22
-chr1 2030248 rs6683011 G A 365.12 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=938.15;QD=36.08;SB=-369.99 GT:AD:DP:GL:GQ 1/1:0,26:24:-97.41,-7.23,-0.01:72.24
-chr1 2030623 rs4648805 G A 629.77 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=1690.17;QD=38.41;SB=-769.01 GT:AD:DP:GL:GQ 1/1:0,44:44:-172.62,-13.26,-0.02:99
-chr1 2030637 rs4648806 C T 94.85 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=56.04;MQ0=0;OQ=1691.52;QD=35.24;SB=-723.01 GT:AD:DP:GL:GQ 1/1:0,48:44:-172.75,-13.26,-0.02:99
-chr1 2030645 rs6674878 A G 54.62 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=55.66;MQ0=0;OQ=1170.82;QD=26.61;SB=-567.76 GT:AD:DP:GL:GQ 1/1:0,44:39:-120.72,-11.78,-0.06:99
-chr1 2030758 rs4648807 T C 223.06 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=59.17;MQ0=0;OQ=1628.83;QD=29.09;SB=-733.30 GT:AD:DP:GL:GQ 1/1:0,56:52:-166.52,-15.69,-0.05:99
-chr1 2030796 rs4648808 T C 215.31 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.65;MQ0=0;OQ=1868.75;QD=28.75;SB=-846.52 GT:AD:DP:GL:GQ 1/1:0,65:59:-190.51,-17.80,-0.05:99
-chr1 2031015 rs10910046 C T 236.58 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.92;MQ0=0;OQ=619.66;QD=30.98;SB=-276.86 GT:AD:DP:GL:GQ 1/1:0,20:17:-65.56,-5.12,-0.01:51.16
-chr1 2031321 rs12059660 C T 236.90 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.27;MQ0=0;OQ=1048.92;QD=38.85;SB=-437.08 GT:AD:DP:GL:GQ 1/1:0,27:27:-108.48,-8.13,-0.01:81.26
-chr1 2032403 rs11584491 A G 58.20 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=59.38;MQ0=0;OQ=893.06;QD=29.77;SB=-424.80 GT:AD:DP:GL:GQ 1/1:0,30:30:-92.92,-9.05,-0.03:90.18
-chr1 2032854 rs3128336 C G 73.49 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=59.29;MQ0=0;OQ=1394.69;QD=35.76;SB=-622.82 GT:AD:DP:GL:GQ 1/1:0,39:35:-143.08,-10.56,-0.03:99
-chr1 2033844 rs3107141 C T 92.22 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=59.25;MQ0=0;OQ=2275.40;QD=36.70;SB=-1025.90 GT:AD:DP:GL:GQ 1/1:0,62:59:-231.15,-17.78,-0.02:99
-chr1 2033897 rs925905 T C 149.67 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.07;MQ0=0;OQ=2152.92;QD=34.17;SB=-821.32 GT:AD:DP:GL:GQ 1/1:0,63:61:-218.90,-18.38,-0.02:99
-chr1 2033914 rs925906 A C 279.99 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.02;HRun=0;HaplotypeScore=0.48;MQ=59.34;MQ0=0;OQ=1986.91;QD=33.12;SB=-865.63 GT:AD:DP:GL:GQ 1/1:0,59:59:-202.29,-17.47,-0.02:99
-chr1 2034402 rs3107142 T C 2.70 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=862.83;QD=28.76;SB=-292.45 GT:AD:DP:GL:GQ 1/1:0,30:25:-89.88,-7.54,-0.02:75.20
-chr1 2035025 rs1467217 G A 101.18 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=58.81;MQ0=0;OQ=1215.26;QD=31.16;SB=-472.57 GT:AD:DP:GL:GQ 1/1:2,37:32:-125.13,-9.65,-0.02:96.30
-chr1 2035232 rs3107143 G C 1383.32 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=1.46;MQ=53.42;MQ0=0;QD=40.69;SB=-202.29 GT:AD:DP:GL:GQ 1/1:0,34:32:-141.93,-9.65,-0.01:96.32
-chr1 2035236 rs61775448 A G 957.24 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=52.98;MQ0=0;QD=29.91;SB=-159.74 GT:AD:DP:GL:GQ 1/1:0,32:29:-99.32,-8.74,-0.01:87.24
-chr1 2035240 rs3107144 C A 1108.98 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=53.21;MQ0=0;QD=33.61;SB=-288.09 GT:AD:DP:GL:GQ 1/1:0,33:31:-114.49,-9.34,-0.01:93.28
-chr1 2035742 rs3128337 A G 495.13 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.14;MQ0=0;OQ=2084.14;QD=30.20;SB=-613.59 GT:AD:DP:GL:GQ 1/1:0,69:67:-212.07,-20.22,-0.07:99
-chr1 2036646 rs3128338 G A 633.58 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2283.85;QD=36.84;SB=-1084.46 GT:AD:DP:GL:GQ 1/1:0,61:60:-232.00,-18.09,-0.03:99
-chr1 2036798 rs3128339 G T 418.21 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.44;MQ0=0;OQ=1615.06;QD=33.65;SB=-604.54 GT:AD:DP:GL:GQ 1/1:0,48:46:-165.11,-13.86,-0.02:99
-chr1 2037356 rs3128340 C G 20.94 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.21;MQ=59.34;MQ0=0;OQ=2469.41;QD=39.20;SB=-820.16 GT:AD:DP:GL:GQ 1/1:0,63:62:-250.56,-18.70,-0.04:99
-chr1 2037407 rs3107145 G A 220.34 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.05;MQ0=0;OQ=2392.58;QD=37.38;SB=-1173.71 GT:AD:DP:GL:GQ 1/1:0,64:62:-242.87,-18.68,-0.02:99
-chr1 2037444 rs3107146 T C 445.88 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=1708.25;QD=30.50;SB=-576.98 GT:AD:DP:GL:GQ 1/1:0,56:53:-174.45,-15.98,-0.04:99
-chr1 2038589 rs3107147 G A 179.13 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.78;MQ0=0;OQ=3375.92;QD=40.19;SB=-1379.05 GT:AD:DP:GL:GQ 1/1:0,83:83:-336.59,-25.00,-0.02:99
-chr1 2039293 . A T 534.23 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=3;HaplotypeScore=26.93;MQ=46.16;MQ0=1;QD=5.40;SB=50.36 GT:AD:DP:GL:GQ 0/1:64,35:82:-81.41,-24.70,-228.25:99
-chr1 2039297 . C T 849.12 Indel AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=16;HaplotypeScore=37.86;MQ=45.71;MQ0=2;QD=8.01;SB=-44.28 GT:AD:DP:GL:GQ 0/1:72,34:90:-115.31,-27.11,-215.41:99
-chr1 2039368 rs3128290 G T 199.82 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.68;MQ0=0;OQ=1893.89;QD=32.65;SB=-943.62 GT:AD:DP:GL:GQ 1/1:0,58:54:-193.00,-16.27,-0.02:99
-chr1 2039459 rs3107148 T C 580.43 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1837.96;QD=36.04;SB=-792.00 GT:AD:DP:GL:GQ 1/1:0,51:51:-187.40,-15.36,-0.01:99
-chr1 2040055 rs3107149 A T 0.64 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.05;MQ=47.19;MQ0=2;OQ=1180.60;QD=26.83;SB=-338.84 GT:AD:DP:GL:GQ 1/1:1,43:33:-121.66,-9.94,-0.01:99
-chr1 2040785 rs3107150 T A 621.62 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=2606.94;QD=34.76;SB=-964.53 GT:AD:DP:GL:GQ 1/1:0,75:72:-264.30,-21.69,-0.03:99
-chr1 2041373 rs3107151 T G 405.29 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=1384.90;QD=30.11;SB=-485.99 GT:AD:DP:GL:GQ 1/1:0,46:41:-142.10,-12.35,-0.02:99
-chr1 2042357 rs3107152 T C 727.24 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2187.52;QD=34.72;SB=-1010.74 GT:AD:DP:GL:GQ 1/1:0,63:62:-222.36,-18.68,-0.02:99
-chr1 2042782 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.57;MQ=44.83;MQ0=0;OQ=64.06;QD=1.26;SB=2.03 GT:AD:DP:GL:GQ 0/1:44,7:48:-24.15,-14.46,-148.69:96.90
-chr1 2042814 . C G 7.67 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.26;MQ=39.19;MQ0=0;OQ=415.49;QD=7.69;SB=-85.80 GT:AD:DP:GL:GQ 0/1:38,16:51:-60.21,-15.38,-162.70:99
-chr1 2042818 . A G 548.88 SnpCluster AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=3.40;MQ=38.13;MQ0=0;QD=9.15;SB=-238.62 GT:AD:DP:GL:GQ 0/1:35,25:55:-74.74,-16.57,-136.02:99
-chr1 2042827 rs56946456 C T 974.86 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=37.16;MQ0=0;QD=15.23;SB=-13.45 GT:AD:DP:GL:GQ 0/1:33,30:59:-118.54,-17.77,-108.89:99
-chr1 2042828 rs59510407 A G 718.63 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.75;MQ=36.52;MQ0=0;QD=11.98;SB=-10.84 GT:AD:DP:GL:GQ 0/1:33,26:56:-92.01,-16.87,-122.40:99
-chr1 2042846 rs58866862 A G 74.49 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=35.77;MQ0=0;QD=1.16;SB=32.14 GT:AD:DP:GL:GQ 0/1:43,21:44:-23.99,-13.25,-151.62:99
-chr1 2042857 rs61526019 C T 19.11 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=37.11;MQ0=1;QD=0.30;SB=35.13 GT:AD:DP:GL:GQ 0/1:49,15:46:-19.05,-13.86,-151.53:51.90
-chr1 2042876 . G T 13.23 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=1;HaplotypeScore=9.69;MQ=38.17;MQ0=2;QD=0.18;SB=41.11 GT:AD:DP:GL:GQ 0/1:58,9:53:-20.55,-15.96,-167.03:45.86
-chr1 2042878 . T C 0.10 PASS AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=11.69;MQ=38.38;MQ0=2;OQ=1187.23;QD=16.96;SB=-479.73 GT:AD:DP:GL:GQ 0/1:15,55:50:-137.09,-15.08,-24.25:91.67
-chr1 2042931 . A G 53.02 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=15.54;MQ=37.98;MQ0=2;QD=0.69;SB=20.09 GT:AD:DP:GL:GQ 0/1:67,10:63:-27.57,-18.98,-213.37:85.85
-chr1 2042932 . C T 144.76 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=10.55;MQ=37.98;MQ0=2;QD=1.88;SB=20.04 GT:AD:DP:GL:GQ 0/1:64,13:62:-36.47,-18.71,-162.72:99
-chr1 2042933 rs61775451 A G 2056.36 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=7.24;MQ=37.41;MQ0=2;QD=27.79;SB=-304.45 GT:AD:DP:GL:GQ 1/1:0,74:61:-209.25,-18.38,-0.03:99
-chr1 2042939 rs61775452 A G 1556.23 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=44.30;MQ=35.88;MQ0=3;QD=19.21;SB=-241.65 GT:AD:DP:GL:GQ 0/1:26,55:67:-179.09,-20.18,-61.01:99
-chr1 2042967 . G A 494.62 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=42.03;MQ=31.07;MQ0=2;QD=5.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:65,21:57:-69.92,-17.17,-132.17:99
-chr1 2042968 . T C 324.84 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=41.51;MQ=30.57;MQ0=2;QD=3.82;SB=-7.00 GT:AD:DP:GL:GQ 0/1:68,17:56:-52.65,-16.88,-157.62:99
-chr1 2042975 . G A 918.15 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=43.08;MQ=30.97;MQ0=1;QD=11.92;SB=-7.00 GT:AD:DP:GL:GQ 0/1:43,34:50:-110.16,-15.06,-77.95:99
-chr1 2042993 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=37.83;MQ=26.92;MQ0=1;OQ=262.34;QD=4.60;SB=-10.00 GT:AD:DP:GL:GQ 0/1:38,19:39:-41.26,-11.74,-103.99:99
-chr1 2043003 . A G 593.68 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=39;Dels=0.03;HRun=0;HaplotypeScore=30.47;MQ=26.18;MQ0=1;QD=15.22;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,22:23:-69.27,-6.63,-8.02:13.91
-chr1 2043004 . C T 763.57 Indel;SnpCluster AC=2;AF=1.00;AN=2;DP=36;Dels=0.06;HRun=0;HaplotypeScore=22.21;MQ=26.52;MQ0=1;QD=21.21;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,31:22:-82.94,-6.33,-3.00:33.26
-chr1 2043011 . A G 85.38 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=13.94;MQ=26.97;MQ0=0;QD=3.28;SB=-10.00 GT:AD:DP:GL:GQ 0/1:19,7:20:-17.84,-6.02,-61.94:99
-chr1 2043025 . C T 0.23 PASS AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=7.88;MQ=23.26;MQ0=0;OQ=89.13;QD=11.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,5:3:-12.40,-0.90,-0.00:9.03
-chr1 2043058 . C T 0.16 PASS AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=7.97;MQ=18.94;MQ0=5;OQ=124.33;QD=12.43;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,6:4:-15.97,-1.21,-0.00:12.04
-chr1 2043061 . C T 0.16 PASS AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=9.08;MQ=17.30;MQ0=6;OQ=117.32;QD=9.78;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,8:4:-15.27,-1.21,-0.00:12.04
-chr1 2043097 . C T 1.40 PASS AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=4.78;MQ=17.14;MQ0=7;OQ=117.84;QD=7.86;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,4:5:-16.57,-1.51,-3.10:15.90
-chr1 2043134 rs62641630 A G 85.81 Indel AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=34.82;MQ=24.20;MQ0=2;QD=5.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,7:9:-14.57,-2.71,-19.58:99
-chr1 2043141 . T G 143.26 Indel AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=21.33;MQ0=2;QD=11.94;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,9:5:-17.89,-1.51,-0.00:15.05
-chr1 2043178 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=18.82;MQ=19.76;MQ0=6;OQ=129.40;QD=2.70;SB=-10.00 GT:AD:DP:GL:GQ 0/1:34,14:15:-20.75,-4.53,-30.16:99
-chr1 2043181 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=18.51;MQ=19.26;MQ0=7;OQ=70.77;QD=1.31;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,12:15:-14.88,-4.52,-41.18:99
-chr1 2043199 . T C 326.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=71.39;MQ=18.51;MQ0=9;QD=3.23;SB=5.04 GT:AD:DP:GL:GQ 0/1:73,28:19:-41.66,-5.73,-27.12:99
-chr1 2043200 . G T 127.31 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=1;HaplotypeScore=109.06;MQ=18.45;MQ0=9;QD=1.24;SB=5.04 GT:AD:DP:GL:GQ 0/1:88,15:19:-21.74,-5.72,-47.36:99
-chr1 2043203 . A G 195.43 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=1;HaplotypeScore=58.32;MQ=18.15;MQ0=10;QD=1.74;SB=5.04 GT:AD:DP:GL:GQ 0/1:95,17:20:-28.85,-6.02,-47.43:99
-chr1 2043227 rs61775455 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=139;Dels=0.00;HRun=1;HaplotypeScore=26.18;MQ=17.76;MQ0=15;OQ=512.67;QD=3.69;SB=-282.20 GT:AD:DP:GL:GQ 0/1:22,117:18:-59.98,-5.43,-16.39:99
-chr1 2043250 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=40.25;MQ=18.52;MQ0=5;OQ=52.10;QD=0.80;SB=5.03 GT:AD:DP:GL:GQ 0/1:47,18:9:-11.21,-2.71,-18.54:84.93
-chr1 2043253 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=69.74;MQ=17.96;MQ0=6;OQ=126.28;QD=2.18;SB=-31.52 GT:AD:DP:GL:GQ 0/1:37,20:7:-18.02,-2.11,-6.74:46.31
-chr1 2043286 . C T 29.35 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=15.82;MQ=16.30;MQ0=5;QD=1.47;SB=-39.54 GT:AD:DP:GL:GQ 0/1:10,10:4:-7.42,-1.21,-6.19:49.87
-chr1 2043289 . C T 29.39 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=12.80;MQ=15.14;MQ0=5;QD=1.73;SB=-36.53 GT:AD:DP:GL:GQ 0/1:8,8:3:-7.13,-0.91,-2.70:17.92
-chr1 2043333 . T G 28.03 LowQual AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=18.60;MQ0=2;QD=4.00;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:2:-6.21,-0.60,-0.00:6.01
-chr1 2043370 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=30.96;MQ=17.94;MQ0=3;OQ=266.78;QD=3.51;SB=-158.18 GT:AD:DP:GL:GQ 0/1:20,55:9:-32.59,-2.71,-3.10:3.86
-chr1 2043387 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=305.93;MQ=17.79;MQ0=4;OQ=61.76;QD=0.60;SB=5.03 GT:AD:DP:GL:GQ 0/1:70,33:9:-12.17,-2.71,-18.55:94.59
-chr1 2043399 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=80.07;MQ=17.30;MQ0=8;OQ=50.40;QD=0.46;SB=-41.37 GT:AD:DP:GL:GQ 0/1:77,30:6:-10.13,-1.81,-8.76:69.51
-chr1 2043410 . G A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=62.95;MQ=16.84;MQ0=8;OQ=120.99;QD=1.22;SB=-42.66 GT:AD:DP:GL:GQ 1/1:14,85:4:-15.63,-1.21,-0.00:12.04
-chr1 2043421 . C T 40.51 LowQual AC=1;AF=0.50;AN=2;DP=97;Dels=0.01;HRun=0;HaplotypeScore=78.29;MQ=16.56;MQ0=9;QD=0.42;SB=-7.00 GT:AD:DP:GL:GQ 0/1:75,21:3:-8.24,-0.90,-2.77:18.65
-chr1 2043428 . G A 73.75 Indel AC=2;AF=1.00;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=65.46;MQ=16.72;MQ0=6;QD=0.88;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,68:3:-10.87,-0.91,-0.00:9.02
-chr1 2043438 . G A 70.80 Indel AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=64.65;MQ=17.33;MQ0=2;QD=1.00;SB=-10.00 GT:AD:DP:GL:GQ 0/1:44,27:4:-11.57,-1.20,-3.47:22.64
-chr1 2043560 . G C 29.95 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=54.01;MQ=17.20;MQ0=4;QD=0.86;SB=-10.00 GT:AD:DP:GL:GQ 0/1:29,6:4:-7.49,-1.21,-7.00:57.86
-chr1 2043565 . C T 49.25 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=47.09;MQ=17.14;MQ0=4;QD=1.37;SB=-10.00 GT:AD:DP:GL:GQ 1/1:19,17:2:-8.33,-0.60,-0.00:6.02
-chr1 2043572 . G A 46.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=33.86;MQ=16.62;MQ0=6;QD=1.18;SB=-10.00 GT:AD:DP:GL:GQ 1/1:22,17:2:-8.01,-0.60,-0.00:6.02
-chr1 2043583 . C T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=32.32;MQ=16.61;MQ0=6;OQ=173.76;QD=4.57;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,22:5:-20.94,-1.51,-0.00:15.05
-chr1 2043590 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=28.82;MQ=16.31;MQ0=5;OQ=78.84;QD=2.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,18:4:-12.37,-1.20,-2.87:16.64
-chr1 2043797 . C T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=30.70;MQ=15.39;MQ0=12;OQ=90.55;QD=2.66;SB=-10.00 GT:AD:DP:GL:GQ 1/1:10,21:4:-15.80,-4.21,-3.24:9.74
-chr1 2043818 . T C 79 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=39.74;MQ=12.98;MQ0=29;QD=1.39;SB=-10.00 GT:AD:DP:GL:GQ 1/1:42,15:3:-11.39,-0.90,-0.00:9.03
-chr1 2043819 . G T 74.28 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=66.63;MQ=12.86;MQ0=30;QD=1.28;SB=-10.00 GT:AD:DP:GL:GQ 1/1:43,15:3:-10.92,-0.90,-0.00:9.03
-chr1 2043822 . G A 85.78 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=66.31;MQ=12.73;MQ0=32;QD=1.41;SB=-10.00 GT:AD:DP:GL:GQ 1/1:35,26:3:-12.07,-0.90,-0.00:9.03
-chr1 2043840 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=53.86;MQ=13.17;MQ0=31;OQ=75.78;QD=1.28;SB=-3.99 GT:AD:DP:GL:GQ 0/1:33,26:5:-12.37,-1.51,-6.39:48.86
-chr1 2043865 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=29.69;MQ=17.30;MQ0=6;OQ=56.87;QD=2.19;SB=-30.92 GT:AD:DP:GL:GQ 0/1:19,7:4:-10.17,-1.21,-3.00:17.97
-chr1 2043873 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=65.88;MQ=20.81;MQ0=0;OQ=78.81;QD=5.63;SB=-7.00 GT:AD:DP:GL:GQ 0/1:7,7:4:-12.37,-1.21,-3.20:19.92
-chr1 2044254 . A G 32.28 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=14.52;MQ0=7;QD=1.90;SB=-10.00 GT:AD:DP:GL:GQ 1/1:8,9:2:-6.64,-0.60,-0.00:6.02
-chr1 2044261 . G T 34.69 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=14.97;MQ0=6;QD=2.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:8,8:2:-6.88,-0.60,-0.00:6.02
-chr1 2045053 . A G 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=1;HaplotypeScore=13.98;MQ=19.49;MQ0=2;OQ=141.20;QD=10.86;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,8:5:-17.68,-1.51,-0.00:15.04
-chr1 2045060 . G T 46.93 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=16.54;MQ=19.21;MQ0=2;QD=3.35;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,5:5:-9.49,-1.51,-6.61:50.97
-chr1 2045064 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=17.54;MQ=18.55;MQ0=3;OQ=51.75;QD=3.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,9:5:-9.97,-1.51,-6.44:49.32
-chr1 2045454 . C T 0.01 FDRtranche2.00to10.00 AC=2;AF=1.00;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=19.88;MQ=20.43;MQ0=9;OQ=198.28;QD=7.34;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,20:6:-23.40,-1.81,-0.00:18.06
-chr1 2045469 . C T 0.06 PASS AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=12.29;MQ=20.17;MQ0=11;OQ=284.41;QD=8.89;SB=-48.56 GT:AD:DP:GL:GQ 1/1:9,23:8:-32.02,-2.41,-0.00:24.08
-chr1 2045505 . C T 28.68 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=18.97;MQ=24.13;MQ0=5;QD=0.54;SB=11.04 GT:AD:DP:GL:GQ 0/1:44,9:20:-12.18,-6.03,-54.06:61.51
-chr1 2045518 . C G 738.24 SnpCluster AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=15.01;MQ=25.23;MQ0=2;QD=13.67;SB=-291.20 GT:AD:DP:GL:GQ 0/1:10,44:25:-84.64,-7.53,-25.69:99
-chr1 2045519 . G A 107.30 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=14.97;MQ=25.69;MQ0=2;QD=1.95;SB=11.06 GT:AD:DP:GL:GQ 0/1:46,9:22:-20.64,-6.63,-60.44:99
-chr1 2045523 rs61775456 C T 1156.65 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=31.40;MQ=26.13;MQ0=1;QD=21.03;SB=-340.35 GT:AD:DP:GL:GQ 1/1:5,50:30:-119.26,-9.04,-0.01:90.29
-chr1 2045530 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=38.81;MQ=25.91;MQ0=2;OQ=314.66;QD=4.56;SB=14.05 GT:AD:DP:GL:GQ 0/1:30,39:21:-41.08,-6.33,-36.84:99
-chr1 2045541 rs61775457 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=85.67;MQ=25.28;MQ0=4;OQ=1042.79;QD=14.28;SB=-111.96 GT:AD:DP:GL:GQ 0/1:30,43:36:-118.41,-10.85,-17.33:64.79
-chr1 2045548 rs61775458 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=80.30;MQ=24.94;MQ0=7;OQ=952.67;QD=11.48;SB=11.05 GT:AD:DP:GL:GQ 0/1:35,48:39:-110.31,-11.76,-31.30:99
-chr1 2045552 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=3;HaplotypeScore=82.09;MQ=25.54;MQ0=10;OQ=109.35;QD=1.09;SB=14.08 GT:AD:DP:GL:GQ 0/1:83,17:53:-30.20,-15.98,-173.43:99
-chr1 2045562 rs61775459 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=44.83;MQ=25.87;MQ0=15;OQ=1085.84;QD=10.54;SB=-112.96 GT:AD:DP:GL:GQ 0/1:18,82:44:-125.15,-13.28,-24.49:99
-chr1 2045577 rs61776561 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=71.26;MQ=25.93;MQ0=17;OQ=471.38;QD=4.36;SB=-66.29 GT:AD:DP:GL:GQ 0/1:83,25:48:-64.89,-14.47,-100.62:99
-chr1 2045590 rs61776562 C G 1122.80 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=71.62;MQ=27.29;MQ0=12;QD=12.62;SB=-466.47 GT:AD:DP:GL:GQ 0/1:38,51:51:-130.94,-15.38,-82.60:99
-chr1 2045591 . G A 91.87 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=67.28;MQ=27.29;MQ0=12;QD=1.03;SB=20.08 GT:AD:DP:GL:GQ 0/1:68,21:39:-24.23,-11.76,-108.70:99
-chr1 2045595 rs61776563 C T 1533.88 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=45.58;MQ=27.30;MQ0=11;QD=17.43;SB=-260.54 GT:AD:DP:GL:GQ 1/1:9,79:49:-170.95,-14.77,-14.14:6.27
-chr1 2045606 . A G 34.51 DPFilter;HARD_TO_VALIDATE;Indel;LowQual AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=3;HaplotypeScore=43.22;MQ=27.00;MQ0=12;QD=0.42;SB=23.11 GT:AD:DP:GL:GQ 0/1:76,7:41:-19.11,-12.37,-129.33:67.35
-chr1 2045616 . T C 78.88 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=250.84;MQ=27.16;MQ0=10;QD=1.21;SB=21.87 GT:AD:DP:GL:GQ 0/1:53,10:39:-22.94,-11.77,-110.81:99
-chr1 2045620 rs61776564 G A 378.54 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=91.32;MQ=25.99;MQ0=10;QD=7.14;SB=2.03 GT:AD:DP:GL:GQ 0/1:31,22:26:-48.98,-7.84,-44.75:99
-chr1 2045631 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=20.68;MQ=23.69;MQ0=10;OQ=345.67;QD=8.43;SB=-190.29 GT:AD:DP:GL:GQ 0/1:16,25:18:-43.28,-5.43,-21.54:99
-chr1 2045638 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=35.28;MQ=23.82;MQ0=10;OQ=167.44;QD=4.29;SB=-58.06 GT:AD:DP:GL:GQ 0/1:24,15:14:-24.25,-4.23,-24.00:99
-chr1 2045652 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=49.08;MQ=21.77;MQ0=9;OQ=173.85;QD=5.43;SB=-84.31 GT:AD:DP:GL:GQ 0/1:13,19:7:-22.76,-2.11,-3.10:9.89
-chr1 2045656 . G A 40.26 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=55.88;MQ=22.32;MQ0=8;QD=1.34;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,14:3:-8.21,-0.90,-3.07:21.65
-chr1 2045667 . C T 56.78 SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=27.04;MQ=25.03;MQ0=2;QD=2.18;SB=-3.99 GT:AD:DP:GL:GQ 0/1:9,17:7:-11.07,-2.11,-11.53:89.62
-chr1 2045670 . C T 22.25 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=24.25;MQ=25.19;MQ0=1;QD=0.93;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,19:3:-6.41,-0.91,-3.37:24.66
-chr1 2045674 . G A 38.46 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=35.09;MQ=29.74;MQ0=1;QD=1.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,15:4:-8.34,-1.21,-6.59:53.87
-chr1 2045688 rs61776565 C T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=37.51;MQ=32.86;MQ0=0;OQ=472.91;QD=12.78;SB=-219.35 GT:AD:DP:GL:GQ 1/1:8,29:13:-50.88,-3.92,-0.00:39.13
-chr1 2045716 rs11589827 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=37.92;MQ=32.79;MQ0=0;OQ=1051.52;QD=19.47;SB=-363.54 GT:AD:DP:GL:GQ 0/1:22,32:36:-119.28,-10.85,-21.22:99
-chr1 2045975 rs56260599 A G 8.24 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=2.17;MQ=48.30;MQ0=0;OQ=1370.04;QD=29.78;SB=-550.86 GT:AD:DP:GL:GQ 1/1:0,45:39:-140.61,-11.75,-0.02:99
-chr1 2047610 rs3107154 A C 149.56 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.43;MQ0=0;OQ=1416.93;QD=32.20;SB=-509.01 GT:AD:DP:GL:GQ 1/1:0,44:41:-145.30,-12.35,-0.02:99
-chr1 2047883 rs3128291 A G 544.70 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1311.92;QD=28.52;SB=-584.18 GT:AD:DP:GL:GQ 1/1:0,46:44:-134.83,-13.28,-0.06:99
-chr1 2050384 rs3107155 T C 5.04 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=59.45;MQ0=0;OQ=1167.72;QD=27.80;SB=-528.96 GT:AD:DP:GL:GQ 1/1:0,42:38:-120.40,-11.47,-0.04:99
-chr1 2050490 rs3107156 T C 249.61 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=2021.38;QD=30.17;SB=-957.45 GT:AD:DP:GL:GQ 1/1:0,67:63:-205.77,-19.00,-0.05:99
-chr1 2050592 rs10797427 C T 209.13 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=2020.11;QD=36.73;SB=-999.03 GT:AD:DP:GL:GQ 1/1:0,54:53:-205.62,-15.97,-0.03:99
-chr1 2051236 rs6603815 T C 200 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.85;MQ0=0;OQ=2560.21;QD=35.07;SB=-874.04 GT:AD:DP:GL:GQ 1/1:0,73:73:-259.63,-21.99,-0.03:99
-chr1 2051829 rs3107157 T C 631.33 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.47;MQ0=0;OQ=1661.55;QD=30.21;SB=-807.71 GT:AD:DP:GL:GQ 1/1:0,55:52:-169.78,-15.68,-0.04:99
-chr1 2053024 rs2222217 G A 330.52 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=1814.00;QD=39.43;SB=-879.02 GT:AD:DP:GL:GQ 1/1:0,46:46:-185.00,-13.86,-0.01:99
-chr1 2055199 rs3128293 A G 0.17 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=4;HaplotypeScore=2.50;MQ=57.87;MQ0=0;OQ=714.48;QD=32.48;SB=-354.81 GT:AD:DP:GL:GQ 1/1:0,22:21:-75.04,-6.33,-0.01:63.18
-chr1 2055203 rs3128294 G C 31.92 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.50;MQ=59.11;MQ0=0;OQ=958.73;QD=36.87;SB=-480.55 GT:AD:DP:GL:GQ 1/1:0,26:24:-99.47,-7.24,-0.01:72.23
-chr1 2056850 rs55958603 C T 1.19 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=3.45;MQ=57.77;MQ0=0;OQ=633.04;QD=15.07;SB=-129.09 GT:AD:DP:GL:GQ 0/1:21,21:38:-78.03,-11.45,-68.95:99
-chr1 2058340 rs3128295 C T 135.04 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=57.98;MQ0=0;OQ=1478.85;QD=33.61;SB=-754.65 GT:AD:DP:GL:GQ 1/1:0,43:39:-151.49,-11.75,-0.02:99
-chr1 2058766 rs3128296 G T 62.70 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=59.52;MQ0=0;OQ=1387.47;QD=35.58;SB=-366.86 GT:AD:DP:GL:GQ 1/1:0,39:38:-142.34,-11.45,-0.01:99
-chr1 2060181 rs411021 T C 39.97 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.62;MQ0=0;OQ=1893.37;QD=29.58;SB=-877.01 GT:AD:DP:GL:GQ 1/1:0,64:60:-192.98,-18.10,-0.06:99
-chr1 2061200 rs424079 C A 282.41 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.70;MQ0=0;OQ=2061.38;QD=33.25;SB=-816.15 GT:AD:DP:GL:GQ 1/1:2,60:59:-209.75,-17.78,-0.03:99
-chr1 2061416 rs436045 A G 341.67 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1852.88;QD=31.95;SB=-463.52 GT:AD:DP:GL:GQ 1/1:0,58:55:-188.90,-16.57,-0.02:99
-chr1 2061625 rs364677 A G 92.05 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=57.88;MQ0=0;OQ=1754.29;QD=33.10;SB=-829.10 GT:AD:DP:GL:GQ 1/1:0,53:50:-179.03,-15.06,-0.02:99
-chr1 2062860 rs2945573 A G 10.32 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=53.50;MQ0=0;OQ=1269.78;QD=34.32;SB=-473.51 GT:AD:DP:GL:GQ 1/1:0,37:36:-130.57,-10.84,-0.01:99
-chr1 2063413 rs643076 A G 32.55 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=23.27;MQ0=4;QD=3.26;SB=-41.68 GT:AD:DP:GL:GQ 1/1:0,9:2:-6.66,-0.60,-0.00:6.02
-chr1 2063477 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=1;HaplotypeScore=9.72;MQ=34.90;MQ0=16;OQ=82.45;QD=1.04;SB=5.04 GT:AD:DP:GL:GQ 0/1:72,7:47:-25.69,-14.16,-141.31:99
-chr1 2063706 rs56038539 T C 3.16 PASS AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=41.37;MQ0=1;OQ=139.38;QD=19.91;SB=-78.92 GT:AD:DP:GL:GQ 1/1:0,7:5:-17.50,-1.51,-0.00:15.04
-chr1 2068664 . C T 1.14 PASS AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=1;HaplotypeScore=4.59;MQ=58.77;MQ0=0;OQ=1604.59;QD=18.44;SB=-789.85 GT:AD:DP:GL:GQ 0/1:40,47:84:-189.05,-25.30,-139.35:99
-chr1 2076421 rs2459983 A G 9.14 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.88;MQ=57.31;MQ0=0;OQ=556.13;QD=9.43;SB=-262.92 GT:AD:DP:GL:GQ 0/1:36,23:54:-75.17,-16.28,-123.64:99
-chr1 2080370 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=7.10;MQ=51.87;MQ0=1;OQ=83.25;QD=1.63;SB=68.25 GT:AD:DP:GL:GQ 0/1:34,17:35:-22.19,-10.58,-111.66:99
-chr1 2084392 rs12132341 G A 174.47 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.31;MQ0=0;OQ=863.52;QD=15.99;SB=-268.13 GT:AD:DP:GL:GQ 0/1:26,28:52:-105.30,-15.67,-88.61:99
-chr1 2089742 rs12137653 G A 181.23 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=58.90;MQ0=0;OQ=1123.18;QD=19.04;SB=-544.82 GT:AD:DP:GL:GQ 0/1:23,36:56:-132.48,-16.88,-70.24:99
-chr1 2096700 rs12135175 T C 69.07 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=484.58;QD=34.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,14:14:-52.05,-4.22,-0.00:42.13
-chr1 2096756 rs12135178 T C 1.47 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=63.69;QD=21.23;SB=-45.69 GT:AD:DP:GL:GQ 1/1:0,3:3:-9.86,-0.91,-0.00:9.02
-chr1 2097150 . G T 29.88 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=4.60;MQ=59.01;MQ0=0;QD=1.57;SB=20.09 GT:AD:DP:GL:GQ 0/1:12,7:13:-10.19,-3.92,-36.97:62.71
-chr1 2103132 . T G 33.73 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=13.23;MQ=58.26;MQ0=0;QD=0.50;SB=77.26 GT:AD:DP:GL:GQ 0/1:40,27:45:-20.22,-13.56,-132.60:66.56
-chr1 2103519 . T G 34.88 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=24.16;MQ=56.69;MQ0=0;QD=0.66;SB=65.20 GT:AD:DP:GL:GQ 0/1:32,21:34:-17.01,-10.24,-99.26:67.71
-chr1 2110321 rs12145923 A C 0.48 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=12.44;MQ=52.00;MQ0=0;OQ=558.55;QD=9.01;SB=-276.83 GT:AD:DP:GL:GQ 0/1:36,25:56:-76.01,-16.87,-110.27:99
-chr1 2119788 . T C 18.51 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=3;HaplotypeScore=2.86;MQ=58.76;MQ0=0;QD=0.33;SB=56.21 GT:AD:DP:GL:GQ 0/1:41,15:42:-17.79,-12.66,-139.27:51.28
-chr1 2129255 . C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=12.54;MQ=53.09;MQ0=0;OQ=134.48;QD=3.96;SB=-44.78 GT:AD:DP:GL:GQ 0/1:28,6:25:-24.27,-7.54,-83.09:99
-chr1 2130727 . C A 3.24 PASS AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=883.89;QD=21.05;SB=-232.51 GT:AD:DP:GL:GQ 0/1:13,29:42:-104.32,-12.65,-47.37:99
-chr1 2133967 rs2503715 A G 158.02 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=295.10;QD=12.30;SB=-168.37 GT:AD:DP:GL:GQ 0/1:13,11:24:-40.02,-7.23,-52.87:99
-chr1 2146787 . G T 26.55 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=20;HaplotypeScore=12.86;MQ=49.19;MQ0=1;QD=0.48;SB=62.22 GT:AD:DP:GL:GQ 0/1:43,12:38:-17.39,-11.45,-117.88:59.38
-chr1 2157661 . T G 18.80 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=2;HaplotypeScore=22.82;MQ=58.47;MQ0=0;QD=0.32;SB=110.33 GT:AD:DP:GL:GQ 0/1:45,13:50:-20.22,-15.06,-154.85:51.58
-chr1 2158219 . G A 102.84 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=58.11;MQ0=0;OQ=732.58;QD=15.59;SB=-362.51 GT:AD:DP:GL:GQ 0/1:23,24:45:-90.10,-13.56,-76.34:99
-chr1 2159397 . G A 168.87 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=557.34;QD=13.59;SB=-169.24 GT:AD:DP:GL:GQ 0/1:23,18:39:-70.77,-11.75,-72.68:99
-chr1 2162698 rs55996607 T A 417.68 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=618.41;QD=12.13;SB=-230.72 GT:AD:DP:GL:GQ 0/1:28,23:50:-80.19,-15.06,-104.77:99
-chr1 2164572 rs263525 T C 240.22 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=58.19;MQ0=0;OQ=1470.94;QD=30.02;SB=-709.84 GT:AD:DP:GL:GQ 1/1:0,49:48:-150.72,-14.48,-0.04:99
-chr1 2166877 rs4648817 C T 227.81 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=42.45;MQ0=0;OQ=888.81;QD=15.06;SB=-258.26 GT:AD:DP:GL:GQ 0/1:29,28:53:-108.14,-15.97,-85.30:99
-chr1 2167087 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=78;Dels=0.03;HRun=20;HaplotypeScore=33.19;MQ=45.08;MQ0=3;OQ=60.74;QD=0.78;SB=86.28 GT:AD:DP:GL:GQ 0/1:57,18:48:-23.51,-14.16,-146.86:93.57
-chr1 2172859 rs55827021 G A 215.80 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=60.00;MQ0=0;OQ=711.82;QD=15.47;SB=-343.87 GT:AD:DP:GL:GQ 0/1:21,25:42:-87.13,-12.66,-66.29:99
-chr1 2181828 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=5;HaplotypeScore=57.83;MQ=51.68;MQ0=2;OQ=160.28;QD=2.32;SB=74.25 GT:AD:DP:GL:GQ 0/1:46,21:51:-34.38,-15.07,-143.28:99
-chr1 2181834 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=20;HaplotypeScore=10.75;MQ=49.92;MQ0=3;OQ=651.07;QD=8.57;SB=86.24 GT:AD:DP:GL:GQ 0/1:47,28:67:-88.59,-20.20,-142.58:99
-chr1 2190201 rs4648625 G T 81.26 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=59.03;MQ0=0;OQ=1500.00;QD=34.88;SB=-738.07 GT:AD:DP:GL:GQ 1/1:0,43:43:-153.60,-12.95,-0.02:99
-chr1 2194650 rs4648819 G A 133.33 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=743.48;QD=16.52;SB=-314.80 GT:AD:DP:GL:GQ 0/1:22,23:44:-90.89,-13.26,-76.95:99
-chr1 2200056 rs55778641 A C 21.64 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.74;MQ=60.00;MQ0=0;OQ=608.53;QD=12.95;SB=-87.63 GT:AD:DP:GL:GQ 0/1:21,26:44:-77.39,-13.25,-77.32:99
-chr1 2201955 . C T 11.73 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=16.61;MQ=30.48;MQ0=8;QD=0.49;SB=-3.98 GT:AD:DP:GL:GQ 0/1:18,6:8:-6.84,-2.41,-19.02:44.27
-chr1 2202003 . A G 11.74 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=1;HaplotypeScore=7.13;MQ=18.21;MQ0=12;QD=0.30;SB=-3.98 GT:AD:DP:GL:GQ 0/1:31,8:9:-7.14,-2.71,-26.71:44.28
-chr1 2202019 . C A 24.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=18.13;MQ0=6;QD=1.05;SB=-6.99 GT:AD:DP:GL:GQ 0/1:15,8:6:-7.50,-1.81,-11.06:56.87
-chr1 2202047 . A G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=10.59;MQ=18.96;MQ0=8;OQ=148.17;QD=5.93;SB=-3.98 GT:AD:DP:GL:GQ 0/1:17,8:9:-20.81,-2.71,-12.59:98.81
-chr1 2202060 . C T 1.87 PASS AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=16.70;MQ0=15;OQ=178.09;QD=5.94;SB=-4.00 GT:AD:DP:GL:GQ 0/1:17,12:9:-23.81,-2.71,-8.44:57.22
-chr1 2202081 . C T 18.49 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.03;HRun=0;HaplotypeScore=43.99;MQ=16.84;MQ0=21;QD=0.47;SB=-6.99 GT:AD:DP:GL:GQ 0/1:31,7:8:-7.54,-2.41,-18.75:51.27
-chr1 2202085 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=40;Dels=0.03;HRun=0;HaplotypeScore=35.15;MQ=14.59;MQ0=24;OQ=74.01;QD=1.85;SB=-48.55 GT:AD:DP:GL:GQ 0/1:30,9:6:-12.50,-1.81,-8.79:69.79
-chr1 2202103 . C T 23.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=12.67;MQ=15.94;MQ0=20;QD=0.57;SB=-6.99 GT:AD:DP:GL:GQ 0/1:31,9:7:-7.74,-2.11,-15.15:56.28
-chr1 2202167 . C A 13.22 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=11.12;MQ=8.91;MQ0=36;QD=0.22;SB=-10.00 GT:AD:DP:GL:GQ 0/1:51,9:4:-5.79,-1.21,-5.41:41.98
-chr1 2202296 . C A 18.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=9.91;MQ=10.32;MQ0=37;QD=0.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:36,13:6:-6.98,-1.81,-13.53:51.72
-chr1 2202348 . A G 10.17 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=23.55;MQ=13.35;MQ0=40;QD=0.15;SB=-25.65 GT:AD:DP:GL:GQ 0/1:57,8:7:-6.37,-2.11,-18.82:42.57
-chr1 2202364 . C T 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=20.33;MQ0=13;OQ=62.56;QD=1.49;SB=-32.09 GT:AD:DP:GL:GQ 0/1:34,6:7:-15.23,-5.69,-14.13:84.42
-chr1 2202391 . A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=5.05;MQ=22.23;MQ0=9;OQ=175.98;QD=4.09;SB=-54.84 GT:AD:DP:GL:GQ 0/1:26,17:18:-26.30,-5.42,-41.13:99
-chr1 2202434 . A G 21.78 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=15.47;MQ=13.87;MQ0=17;QD=0.81;SB=-34.93 GT:AD:DP:GL:GQ 0/1:19,8:5:-6.97,-1.51,-11.89:54.59
-chr1 2202602 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=59.56;MQ=10.62;MQ0=43;OQ=145.43;QD=2.24;SB=-6.99 GT:AD:DP:GL:GQ 0/1:30,35:7:-19.94,-2.11,-6.77:46.57
-chr1 2202632 . G T 82.62 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=11.21;MQ0=49;QD=1.18;SB=-10.00 GT:AD:DP:GL:GQ 0/1:61,9:9:-14.26,-2.71,-18.59:99
-chr1 2202667 . A C 16.33 DPFilter;HARD_TO_VALIDATE;Indel;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=25.34;MQ=10.07;MQ0=49;QD=0.22;SB=8.05 GT:AD:DP:GL:GQ 0/1:64,9:8:-7.32,-2.41,-22.67:49.06
-chr1 2202682 . G A 36.23 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=78.01;MQ=9.70;MQ0=44;QD=0.48;SB=-3.98 GT:AD:DP:GL:GQ 0/1:63,12:4:-8.11,-1.20,-7.39:61.88
-chr1 2202686 . G A 35.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=79.87;MQ=9.88;MQ0=42;QD=0.50;SB=-3.99 GT:AD:DP:GL:GQ 0/1:59,12:4:-8.01,-1.21,-5.99:47.86
-chr1 2202707 . C T 38.48 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=10.09;MQ=9.21;MQ0=26;QD=0.82;SB=-10.00 GT:AD:DP:GL:GQ 0/1:44,3:4:-8.34,-1.21,-5.59:43.85
-chr1 2202728 . T C 26.83 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=9.84;MQ=8.94;MQ0=16;QD=1.07;SB=-10.00 GT:AD:DP:GL:GQ 1/1:12,12:2:-6.09,-0.60,-0.00:6.01
-chr1 2202823 . G A 38.25 LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=5.28;MQ=19.51;MQ0=2;QD=3.82;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,8:3:-8.01,-0.90,-3.57:26.65
-chr1 2203054 . A C 12.92 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=9.60;MQ0=26;QD=0.31;SB=-27.98 GT:AD:DP:GL:GQ 0/1:36,6:4:-5.76,-1.21,-6.84:45.53
-chr1 2203334 . C T 27.36 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=7.10;MQ=12.34;MQ0=21;QD=0.94;SB=-37.65 GT:AD:DP:GL:GQ 0/1:21,8:4:-7.23,-1.21,-5.77:45.59
-chr1 2203377 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=20.17;MQ=13.03;MQ0=22;OQ=140.31;QD=3.79;SB=-42.53 GT:AD:DP:GL:GQ 0/1:23,14:7:-19.42,-2.11,-7.14:50.30
-chr1 2203636 . C T 0.06 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=18.31;MQ0=12;OQ=75.25;QD=2.03;SB=-3.99 GT:AD:DP:GL:GQ 0/1:28,9:19:-16.53,-5.73,-47.88:99
-chr1 2203679 rs2643914 C T 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=6.14;MQ=18.30;MQ0=12;OQ=93.96;QD=1.92;SB=-63.48 GT:AD:DP:GL:GQ 0/1:36,12:24:-19.91,-7.23,-64.90:99
-chr1 2203718 rs2645079 T C 32.47 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.98;MQ0=8;OQ=123.75;QD=3.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,20:15:-20.18,-4.52,-29.86:99
-chr1 2203765 rs12117574 T C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=5.02;MQ=32.99;MQ0=11;OQ=133.28;QD=2.18;SB=-88.55 GT:AD:DP:GL:GQ 0/1:50,11:38:-28.07,-11.46,-111.19:99
-chr1 2204009 . C G 47.74 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=47.05;MQ0=0;OQ=366.61;QD=8.94;SB=-120.51 GT:AD:DP:GL:GQ 0/1:27,14:39:-51.71,-11.77,-108.96:99
-chr1 2206228 rs4648821 T G 261.20 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.19;MQ0=0;OQ=657.01;QD=12.63;SB=-349.05 GT:AD:DP:GL:GQ 0/1:29,23:51:-84.34,-15.36,-102.93:99
-chr1 2206251 rs6689315 A G 495.75 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=794.59;QD=13.94;SB=-403.30 GT:AD:DP:GL:GQ 0/1:29,28:56:-99.61,-16.87,-113.15:99
-chr1 2206925 rs61759158 G A 51.82 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=54.01;MQ0=0;OQ=371.96;QD=12.40;SB=-7.00 GT:AD:DP:GL:GQ 0/1:17,13:28:-48.92,-8.45,-48.51:99
-chr1 2207673 . G C 46.34 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=3;HaplotypeScore=11.90;MQ=55.68;MQ0=0;QD=1.03;SB=71.27 GT:AD:DP:GL:GQ 0/1:33,12:36:-18.77,-10.85,-141.59:79.18
-chr1 2207894 . C T 62.11 PASS AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=60.00;MQ0=0;OQ=1408.04;QD=16.96;SB=-562.41 GT:AD:DP:GL:GQ 0/1:38,45:79:-167.91,-23.82,-117.96:99
-chr1 2208688 rs10910049 G T 213.58 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=47.61;MQ0=2;OQ=399.96;QD=8.89;SB=-196.49 GT:AD:DP:GL:GQ 0/1:28,17:40:-55.33,-12.05,-79.33:99
-chr1 2208825 rs6691983 C T 81.79 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.59;MQ=52.03;MQ0=1;OQ=657.40;QD=17.30;SB=-233.73 GT:AD:DP:GL:GQ 0/1:18,20:35:-79.57,-10.55,-49.20:99
-chr1 2208828 rs6682474 G A 54.35 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=53.40;MQ0=1;OQ=696.36;QD=18.33;SB=-278.18 GT:AD:DP:GL:GQ 0/1:17,21:37:-84.07,-11.15,-57.35:99
-chr1 2209299 rs56051051 T G 55.14 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=58.49;MQ0=0;OQ=442.31;QD=9.41;SB=-244.75 GT:AD:DP:GL:GQ 0/1:22,25:42:-60.17,-12.66,-79.16:99
-chr1 2209740 rs17372827 A C 232.76 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=877.78;QD=13.10;SB=-279.93 GT:AD:DP:GL:GQ 0/1:36,31:66:-110.94,-19.88,-129.70:99
-chr1 2209930 rs4648823 T A 295.53 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.11;MQ0=0;OQ=697.00;QD=13.40;SB=-278.32 GT:AD:DP:GL:GQ 0/1:27,24:50:-88.05,-15.06,-97.62:99
-chr1 2210285 rs2643884 T C 4 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.32;MQ=58.60;MQ0=0;OQ=1465.33;QD=29.31;SB=-698.59 GT:AD:DP:GL:GQ 1/1:0,50:47:-150.17,-14.18,-0.05:99
-chr1 2210377 rs1039065 A C 393.22 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=1107.46;QD=29.14;SB=-383.86 GT:AD:DP:GL:GQ 1/1:0,38:36:-114.37,-10.85,-0.04:99
-chr1 2210509 rs2017143 C T 306.58 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.15;MQ0=0;OQ=1280.02;QD=38.79;SB=-395.53 GT:AD:DP:GL:GQ 1/1:0,33:33:-131.60,-9.94,-0.01:99
-chr1 2211082 rs2643885 A C 289.56 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1017.95;QD=35.10;SB=-113.02 GT:AD:DP:GL:GQ 1/1:0,29:29:-105.39,-8.74,-0.01:87.26
-chr1 2211133 rs2843166 C A 247.56 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.20;MQ0=0;OQ=767.67;QD=31.99;SB=-111.83 GT:AD:DP:GL:GQ 1/1:0,24:23:-80.36,-6.93,-0.01:69.19
-chr1 2211394 rs903924 A G 577.26 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1710.61;QD=33.54;SB=-819.09 GT:AD:DP:GL:GQ 1/1:0,51:49:-174.66,-14.76,-0.02:99
-chr1 2211494 rs903923 G C 2.57 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=5.22;MQ=56.20;MQ0=0;OQ=1828.69;QD=36.57;SB=-846.47 GT:AD:DP:GL:GQ 1/1:0,50:45:-186.48,-13.57,-0.02:99
-chr1 2211496 rs903922 A T 57.75 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.95;MQ=56.42;MQ0=0;OQ=1691.54;QD=31.92;SB=-801.63 GT:AD:DP:GL:GQ 1/1:0,53:49:-172.77,-14.77,-0.03:99
-chr1 2211936 rs903921 G A 86.49 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=57.20;MQ0=0;OQ=1373.97;QD=32.71;SB=-609.72 GT:AD:DP:GL:GQ 1/1:1,40:39:-143.60,-11.76,-2.62:91.42
-chr1 2212420 rs903920 A G 98.07 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.39;MQ0=0;OQ=1274.47;QD=33.54;SB=-555.35 GT:AD:DP:GL:GQ 1/1:0,38:37:-131.05,-11.15,-0.02:99
-chr1 2212443 rs903919 T C 439.40 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=897.63;QD=27.20;SB=-373.47 GT:AD:DP:GL:GQ 1/1:0,33:30:-93.38,-9.05,-0.03:90.19
-chr1 2212983 rs2172900 T C 377 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1306.72;QD=32.67;SB=-161.75 GT:AD:DP:GL:GQ 1/1:0,40:40:-134.28,-12.05,-0.02:99
-chr1 2213118 rs2132303 T C 18.89 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.55;MQ0=0;OQ=1347.55;QD=32.08;SB=-116.87 GT:AD:DP:GL:GQ 1/1:0,41:39:-138.35,-11.75,-0.01:99
-chr1 2214142 rs903617 A G 32.99 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=58.97;MQ0=0;OQ=1261.61;QD=28.04;SB=-567.89 GT:AD:DP:GL:GQ 1/1:0,45:41:-129.80,-12.38,-0.05:99
-chr1 2214469 rs2643886 T G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=5;HaplotypeScore=4.66;MQ=57.70;MQ0=0;OQ=1258.31;QD=26.77;SB=-451.03 GT:AD:DP:GL:GQ 1/1:1,46:38:-129.44,-11.45,-0.02:99
-chr1 2214505 rs2645091 A G 160.46 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.58;MQ0=0;OQ=1430.84;QD=31.11;SB=-424.25 GT:AD:DP:GL:GQ 1/1:0,46:44:-146.70,-13.26,-0.03:99
-chr1 2214736 rs10910050 A C 929.01 Indel AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=9;HaplotypeScore=4.06;MQ=59.20;MQ0=0;QD=27.32;SB=-435.82 GT:AD:DP:GL:GQ 1/1:1,33:28:-96.50,-8.43,-0.01:84.23
-chr1 2215144 rs1532385 G A 183.41 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.56;MQ0=0;OQ=1969.69;QD=37.88;SB=-987.83 GT:AD:DP:GL:GQ 1/1:1,51:50:-200.57,-15.06,-0.01:99
-chr1 2216193 rs903918 T A 121.47 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=60.00;MQ0=0;OQ=1515.17;QD=34.44;SB=-696.39 GT:AD:DP:GL:GQ 1/1:0,44:41:-155.11,-12.35,-0.01:99
-chr1 2216414 . T G 45.79 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=2;HaplotypeScore=10.58;MQ=58.61;MQ0=0;QD=0.68;SB=86.26 GT:AD:DP:GL:GQ 0/1:37,30:42:-20.52,-12.66,-118.85:78.63
-chr1 2217282 rs2843163 C T 190.11 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=57.17;MQ0=0;OQ=844.33;QD=16.89;SB=-357.35 GT:AD:DP:GL:GQ 0/1:22,28:45:-101.28,-13.56,-64.72:99
-chr1 2217535 rs56117572 A C 228.37 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=59.71;MQ0=0;OQ=819.93;QD=12.61;SB=-293.99 GT:AD:DP:GL:GQ 0/1:33,32:61:-103.65,-18.38,-105.35:99
-chr1 2219307 rs2643888 A G 69.82 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=2.64;MQ=59.39;MQ0=0;OQ=1301.49;QD=34.25;SB=-624.24 GT:AD:DP:GL:GQ 1/1:0,38:38:-133.76,-11.45,-0.02:99
-chr1 2219413 rs2843161 C T 101.78 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1668.32;QD=37.92;SB=-845.15 GT:AD:DP:GL:GQ 1/1:0,44:43:-170.43,-12.96,-0.01:99
-chr1 2219777 . C T 48.76 PASS AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.44;MQ=59.45;MQ0=0;OQ=599.56;QD=14.28;SB=-283.32 GT:AD:DP:GL:GQ 0/1:19,21:37:-74.40,-11.16,-63.66:99
-chr1 2220425 rs56341331 C G 57.44 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=59.52;MQ0=0;OQ=468.59;QD=12.02;SB=-132.55 GT:AD:DP:GL:GQ 0/1:23,16:35:-60.70,-10.56,-79.04:99
-chr1 2221427 rs1809823 G T 87.22 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.54;MQ0=0;OQ=673.61;QD=16.43;SB=-228.53 GT:AD:DP:GL:GQ 0/1:18,23:40:-82.70,-12.05,-57.34:99
-chr1 2221826 rs55710545 G C 290.21 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.48;MQ0=0;OQ=503.65;QD=11.45;SB=-276.95 GT:AD:DP:GL:GQ 0/1:26,18:42:-66.31,-12.67,-107.95:99
-chr1 2223172 rs903618 A G 139.54 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1447.93;QD=30.17;SB=-664.81 GT:AD:DP:GL:GQ 1/1:0,48:47:-148.43,-14.18,-0.05:99
-chr1 2224111 rs1496555 A G 103.05 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=57.88;MQ0=0;OQ=1360.32;QD=32.39;SB=-504.48 GT:AD:DP:GL:GQ 1/1:0,42:39:-139.63,-11.75,-0.01:99
-chr1 2224763 rs2256178 C T 433.01 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=665.60;QD=16.23;SB=-342.52 GT:AD:DP:GL:GQ 0/1:20,21:41:-82.21,-12.37,-61.19:99
-chr1 2225516 rs11577387 G A 98.98 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.87;MQ0=0;OQ=626.11;QD=16.92;SB=-209.93 GT:AD:DP:GL:GQ 0/1:17,20:32:-75.54,-9.65,-40.72:99
-chr1 2226199 rs4648825 T C 63.68 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=59.17;MQ0=0;OQ=999.95;QD=17.24;SB=-492.13 GT:AD:DP:GL:GQ 0/1:22,36:55:-119.85,-16.57,-85.50:99
-chr1 2226557 rs2643904 A G 112.25 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=59.50;MQ0=0;OQ=1489.85;QD=32.39;SB=-771.11 GT:AD:DP:GL:GQ 1/1:0,46:44:-152.59,-13.26,-0.02:99
-chr1 2226618 rs2843158 G C 77.30 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1399.75;QD=34.99;SB=-297.26 GT:AD:DP:GL:GQ 1/1:0,40:37:-143.60,-11.18,-0.04:99
-chr1 2227108 rs11580302 A G 15.25 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=58.99;MQ0=0;OQ=1313.96;QD=28.56;SB=-483.14 GT:AD:DP:GL:GQ 1/1:0,46:42:-135.02,-12.67,-0.04:99
-chr1 2228420 . T C 34.45 PASS AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.20;MQ0=0;OQ=345.13;QD=11.90;SB=-158.70 GT:AD:DP:GL:GQ 0/1:16,13:29:-46.53,-8.74,-63.45:99
-chr1 2229866 rs2173049 T C 234.22 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.01;MQ0=0;OQ=1791.17;QD=29.36;SB=-845.65 GT:AD:DP:GL:GQ 1/1:0,60:57:-182.75,-17.19,-0.05:99
-chr1 2230243 rs2843157 C T 3.13 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=5.43;MQ=58.16;MQ0=0;OQ=293.03;QD=7.71;SB=-52.03 GT:AD:DP:GL:GQ 0/1:21,15:25:-40.13,-7.54,-43.56:99
-chr1 2233378 rs2843156 C T 2.48 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.97;MQ0=0;OQ=1676.83;QD=39.00;SB=-476.64 GT:AD:DP:GL:GQ 1/1:0,43:42:-171.28,-12.65,-0.01:99
-chr1 2234765 rs2843154 C T 245.28 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.42;MQ0=0;OQ=364.59;QD=11.39;SB=-94.60 GT:AD:DP:GL:GQ 0/1:19,13:29:-48.48,-8.74,-59.24:99
-chr1 2235081 rs2843153 C T 158.69 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.00;MQ0=0;OQ=1550.87;QD=36.93;SB=-657.38 GT:AD:DP:GL:GQ 1/1:0,42:40:-158.69,-12.05,-0.01:99
-chr1 2235299 rs2643902 T C 83.90 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=58.80;MQ0=0;OQ=1694.87;QD=26.90;SB=-805.69 GT:AD:DP:GL:GQ 1/1:0,63:54:-173.12,-16.28,-0.05:99
-chr1 2235430 rs2843152 C G 36.95 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=1353.71;QD=36.59;SB=-455.86 GT:AD:DP:GL:GQ 1/1:0,37:35:-138.99,-10.57,-0.03:99
-chr1 2235493 rs2843151 C T 341.97 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=1519.57;QD=37.99;SB=-552.74 GT:AD:DP:GL:GQ 1/1:0,40:39:-155.55,-11.75,-0.01:99
-chr1 2237259 rs2643903 T C 68.22 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.78;MQ0=0;OQ=1099.17;QD=28.93;SB=-371.38 GT:AD:DP:GL:GQ 1/1:0,38:35:-113.53,-10.55,-0.03:99
-chr1 2237347 rs2645076 A G 8.05 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=892.74;QD=27.90;SB=-347.40 GT:AD:DP:GL:GQ 1/1:0,32:29:-92.89,-8.75,-0.03:87.17
-chr1 2237604 rs2843150 G C 105.40 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.39;MQ0=0;OQ=929.83;QD=32.06;SB=-483.10 GT:AD:DP:GL:GQ 1/1:0,29:23:-96.58,-6.93,-0.01:69.23
-chr1 2237845 rs2643905 T C 349.37 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1229.58;QD=32.36;SB=-467.52 GT:AD:DP:GL:GQ 1/1:0,38:37:-126.56,-11.15,-0.02:99
-chr1 2238243 rs60565777 G T 1452.57 Indel AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.48;MQ0=0;QD=34.58;SB=-671.66 GT:AD:DP:GL:GQ 1/1:0,42:42:-148.86,-12.66,-0.02:99
-chr1 2238484 rs12035836 A C 189.10 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.53;MQ0=0;OQ=471.85;QD=11.80;SB=-205.81 GT:AD:DP:GL:GQ 0/1:20,20:36:-61.31,-10.85,-64.85:99
-chr1 2239096 rs2645077 G A 27.69 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=1.28;MQ=59.32;MQ0=0;OQ=1136.46;QD=33.43;SB=-382.99 GT:AD:DP:GL:GQ 1/1:0,33:31:-117.25,-9.35,-0.02:93.28
-chr1 2241682 . G A 17.89 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=57.94;MQ0=0;OQ=417.19;QD=12.27;SB=-164.16 GT:AD:DP:GL:GQ 0/1:17,17:31:-54.36,-9.35,-49.53:99
-chr1 2243754 rs56393204 G A 58.20 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.84;MQ0=0;OQ=282.27;QD=14.11;SB=-81.31 GT:AD:DP:GL:GQ 0/1:7,11:14:-35.73,-4.22,-15.87:99
-chr1 2244770 rs2645075 T C 149.18 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.02;MQ0=0;OQ=1276.49;QD=27.75;SB=-655.75 GT:AD:DP:GL:GQ 1/1:0,46:42:-131.28,-12.68,-0.05:99
-chr1 2245871 rs2645074 A G 281.10 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.11;MQ0=0;OQ=516.48;QD=10.99;SB=-220.38 GT:AD:DP:GL:GQ 0/1:24,23:43:-67.90,-12.97,-87.14:99
-chr1 2246105 rs2843148 A T 522.32 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.70;MQ0=0;OQ=1342.05;QD=33.55;SB=-593.22 GT:AD:DP:GL:GQ 1/1:0,40:36:-137.80,-10.84,-0.01:99
-chr1 2246150 . C T 22.21 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=51.90;MQ0=0;OQ=477.24;QD=15.39;SB=-219.23 GT:AD:DP:GL:GQ 0/1:15,16:26:-58.85,-7.84,-34.36:99
-chr1 2246331 . T A 1.20 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=56.18;MQ0=0;OQ=642.82;QD=20.09;SB=-121.93 GT:AD:DP:GL:GQ 0/1:11,21:32:-77.21,-9.64,-40.89:99
-chr1 2246422 . C T 17.03 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=2;HaplotypeScore=46.69;MQ=32.60;MQ0=2;QD=0.46;SB=17.08 GT:AD:DP:GL:GQ 0/1:33,4:25:-12.51,-7.53,-79.77:49.78
-chr1 2246424 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=54.85;MQ=32.43;MQ0=2;OQ=173.30;QD=4.56;SB=-18.60 GT:AD:DP:GL:GQ 0/1:26,12:25:-28.15,-7.53,-68.25:99
-chr1 2246439 rs9725291 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=64.95;MQ=33.89;MQ0=1;OQ=86.92;QD=2.12;SB=-39.19 GT:AD:DP:GL:GQ 0/1:33,8:25:-19.51,-7.53,-71.60:99
-chr1 2246445 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=48.09;MQ=35.48;MQ0=0;OQ=216.97;QD=4.82;SB=-10.56 GT:AD:DP:GL:GQ 0/1:34,11:29:-33.72,-8.74,-70.74:99
-chr1 2246456 . C T 34.43 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=27.71;MQ=37.83;MQ0=0;QD=0.69;SB=1.58 GT:AD:DP:GL:GQ 0/1:43,7:33:-16.67,-9.94,-103.65:67.27
-chr1 2246469 . T C 28.75 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=49;Dels=0.02;HRun=2;HaplotypeScore=77.34;MQ=40.72;MQ0=0;QD=0.59;SB=44.16 GT:AD:DP:GL:GQ 0/1:38,10:28:-14.30,-8.14,-89.44:61.58
-chr1 2246471 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=2;HaplotypeScore=72.35;MQ=42.43;MQ0=0;OQ=76.08;QD=1.58;SB=-6.17 GT:AD:DP:GL:GQ 0/1:36,12:29:-19.64,-8.74,-87.84:99
-chr1 2246484 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=2;HaplotypeScore=51.65;MQ=47.04;MQ0=0;OQ=81.71;QD=2.15;SB=50.19 GT:AD:DP:GL:GQ 0/1:29,8:26:-19.29,-7.83,-83.08:99
-chr1 2246793 . G A 5.64 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=3.91;MQ=55.18;MQ0=1;OQ=1074.55;QD=18.53;SB=-560.61 GT:AD:DP:GL:GQ 0/1:23,35:54:-127.01,-16.27,-81.39:99
-chr1 2247067 rs35006635 C A 47.20 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.81;MQ0=0;OQ=1074.59;QD=21.07;SB=-429.40 GT:AD:DP:GL:GQ 1/1:0,28:51:-197.40,-96.91,-86.36:99
-chr1 2247213 rs12566205 C T 241.62 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=57.90;MQ0=0;OQ=759.24;QD=13.09;SB=-368.12 GT:AD:DP:GL:GQ 0/1:33,25:57:-96.39,-17.18,-106.07:99
-chr1 2247351 rs2643892 C T 241.87 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=665.97;QD=19.59;SB=-340.91 GT:AD:DP:GL:GQ 0/1:14,20:33:-79.82,-9.94,-42.88:99
-chr1 2247555 rs10910051 G A 197.02 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=4.80;MQ=58.86;MQ0=0;OQ=1049.52;QD=16.15;SB=-447.98 GT:AD:DP:GL:GQ 0/1:31,34:61:-126.63,-18.39,-90.57:99
-chr1 2247587 rs2643893 C T 300.53 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.44;MQ0=0;OQ=2112.94;QD=35.22;SB=-1052.32 GT:AD:DP:GL:GQ 1/1:0,60:56:-214.91,-16.88,-0.03:99
-chr1 2247723 rs2645092 C T 700.02 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=2085.22;QD=38.62;SB=-998.04 GT:AD:DP:GL:GQ 1/1:0,54:53:-212.12,-15.97,-0.01:99
-chr1 2247791 rs2645093 G A 189.38 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=60.00;MQ0=0;OQ=700.42;QD=15.92;SB=-289.76 GT:AD:DP:GL:GQ 0/1:22,22:42:-85.99,-12.66,-67.45:99
-chr1 2248183 rs2643894 C T 135.91 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=57.95;MQ0=0;OQ=1940.09;QD=35.27;SB=-797.32 GT:AD:DP:GL:GQ 1/1:0,55:52:-197.62,-15.67,-0.03:99
-chr1 2248333 rs2643895 G A 408.80 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2697.00;QD=39.09;SB=-1222.14 GT:AD:DP:GL:GQ 1/1:0,69:68:-273.30,-20.48,-0.02:99
-chr1 2248552 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.80;MQ=51.38;MQ0=0;OQ=50.72;QD=0.83;SB=23.47 GT:AD:DP:GL:GQ 0/1:53,7:56:-28.20,-19.84,-214.64:83.56
-chr1 2248554 . G A 35.21 LowQual AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=3;HaplotypeScore=5.80;MQ=51.10;MQ0=0;QD=0.57;SB=-8.06 GT:AD:DP:GL:GQ 0/1:56,6:58:-24.27,-17.47,-188.51:68.04
-chr1 2248658 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=56.92;MQ0=0;OQ=60.63;QD=0.88;SB=6.91 GT:AD:DP:GL:GQ 0/1:61,8:68:-29.84,-20.49,-240.21:93.47
-chr1 2249886 . C T 54.96 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=60.00;MQ0=0;OQ=750.55;QD=14.72;SB=-348.88 GT:AD:DP:GL:GQ 0/1:25,26:44:-91.61,-13.27,-61.40:99
-chr1 2249910 rs2645063 G A 24.12 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=5.82;MQ=59.50;MQ0=0;OQ=758.18;QD=16.48;SB=-336.52 GT:AD:DP:GL:GQ 0/1:22,24:45:-92.67,-13.57,-67.35:99
-chr1 2250405 rs2645064 G A 151.63 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.71;MQ0=0;OQ=569.60;QD=15.82;SB=-242.53 GT:AD:DP:GL:GQ 0/1:16,20:34:-70.49,-10.25,-54.37:99
-chr1 2251037 rs35273536 C T 60.30 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.05;MQ=58.82;MQ0=0;OQ=1072.47;QD=18.18;SB=-334.93 GT:AD:DP:GL:GQ 0/1:24,34:52:-128.89,-18.36,-63.36:99
-chr1 2253264 . T C 16.56 Indel;LowQual AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=51.77;MQ0=0;QD=2.76;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,2:6:-6.74,-1.81,-16.62:49.30
-chr1 2253282 . C G 16.92 PASS AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=51.16;MQ0=0;OQ=118.58;QD=9.88;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,6:11:-18.46,-3.32,-24.69:99
-chr1 2253362 rs12752072 T C 172.88 PASS AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=253.44;QD=12.07;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,11:21:-34.96,-6.33,-38.76:99
-chr1 2254886 rs2645066 G A 78.79 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=5.62;MQ=59.17;MQ0=0;OQ=893.72;QD=15.96;SB=-436.47 GT:AD:DP:GL:GQ 0/1:25,31:52:-108.33,-15.67,-85.72:99
-chr1 2255036 rs2645067 T C 87.26 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.60;MQ0=0;OQ=995.78;QD=33.19;SB=-523.42 GT:AD:DP:GL:GQ 1/1:0,30:29:-103.17,-8.74,-0.01:87.25
-chr1 2255079 rs2643898 C T 28.85 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=59.03;MQ0=0;OQ=590.58;QD=13.73;SB=-262.25 GT:AD:DP:GL:GQ 0/1:23,20:42:-75.01,-12.66,-72.41:99
-chr1 2255654 rs7546567 G A 132.53 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.73;MQ0=0;OQ=454.68;QD=13.78;SB=-126.36 GT:AD:DP:GL:GQ 0/1:16,16:32:-61.47,-12.72,-52.76:99
-chr1 2255829 rs2843146 T G 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=441.34;QD=27.58;SB=-113.02 GT:AD:DP:GL:GQ 1/1:0,16:14:-47.73,-4.22,-0.01:42.10
-chr1 2255938 rs2643899 T C 18.62 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=58.69;MQ0=0;OQ=756.05;QD=23.63;SB=-323.76 GT:AD:DP:GL:GQ 1/1:0,32:26:-79.22,-7.85,-0.03:78.14
-chr1 2256793 rs903905 C T 99.15 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.29;MQ0=0;OQ=354.28;QD=16.10;SB=-192.21 GT:AD:DP:GL:GQ 0/1:10,12:21:-45.05,-6.33,-27.84:99
-chr1 2258430 rs12091632 A G 318.94 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=1030.69;QD=30.31;SB=-507.55 GT:AD:DP:GL:GQ 1/1:0,34:33:-106.69,-9.95,-0.03:99
-chr1 2258440 rs12085675 G A 96.71 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.39;MQ0=0;OQ=1318.84;QD=34.71;SB=-520.68 GT:AD:DP:GL:GQ 1/1:0,37:35:-135.49,-10.55,-0.02:99
-chr1 2258510 rs28394874 C G 5.91 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=4.06;MQ=57.77;MQ0=0;OQ=783.94;QD=18.67;SB=-330.90 GT:AD:DP:GL:GQ 0/1:17,25:36:-92.55,-10.88,-48.65:99
-chr1 2258528 rs35986070 A G 102.16 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.27;MQ0=0;OQ=457.65;QD=16.95;SB=-106.83 GT:AD:DP:GL:GQ 0/1:11,16:27:-57.18,-8.13,-41.35:99
-chr1 2258538 rs2645069 T C 177.52 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.13;MQ0=0;OQ=677.36;QD=27.09;SB=-198.05 GT:AD:DP:GL:GQ 1/1:0,25:23:-71.35,-6.94,-0.03:69.14
-chr1 2258598 rs2645070 A G 16.76 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=60.00;MQ0=0;OQ=322.02;QD=18.94;SB=-156.34 GT:AD:DP:GL:GQ 0/1:4,13:17:-40.61,-5.13,-15.36:99
-chr1 2258651 rs2843145 A G 4.44 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=2.01;MQ=59.14;MQ0=0;OQ=426.64;QD=15.80;SB=-196.02 GT:AD:DP:GL:GQ 0/1:8,19:23:-52.88,-6.93,-31.12:99
-chr1 2258910 . A G 4.11 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.17;MQ=58.13;MQ0=0;OQ=457.98;QD=13.09;SB=-246.31 GT:AD:DP:GL:GQ 0/1:17,18:33:-59.02,-9.94,-70.06:99
-chr1 2259759 rs2036085 T C 103.79 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=626.01;QD=14.56;SB=-172.51 GT:AD:DP:GL:GQ 0/1:16,27:40:-77.94,-12.06,-63.91:99
-chr1 2259869 rs12734736 C T 347.07 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=60.00;MQ0=0;OQ=965.34;QD=16.64;SB=-492.13 GT:AD:DP:GL:GQ 0/1:29,29:54:-116.09,-16.28,-80.58:99
-chr1 2259958 rs2843142 A G 263.06 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=59.76;MQ0=0;OQ=1095.49;QD=13.87;SB=-502.48 GT:AD:DP:GL:GQ 0/1:40,39:78:-136.33,-23.50,-157.46:99
-chr1 2261724 rs2843141 C T 591.96 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1956.29;QD=36.91;SB=-863.62 GT:AD:DP:GL:GQ 1/1:0,53:52:-199.24,-15.68,-0.03:99
-chr1 2262086 rs1472318 C T 44.42 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=57.36;MQ0=0;OQ=484.27;QD=19.37;SB=-215.23 GT:AD:DP:GL:GQ 0/1:8,16:22:-58.34,-6.63,-21.67:99
-chr1 2262763 rs2843139 A G 28.96 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=58.77;MQ0=0;OQ=1612.91;QD=30.43;SB=-829.43 GT:AD:DP:GL:GQ 1/1:0,53:52:-164.94,-15.69,-0.06:99
-chr1 2262883 . G A 16 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=49.61;MQ0=5;QD=0.44;SB=-17.46 GT:AD:DP:GL:GQ 0/1:28,8:25:-12.42,-7.54,-69.64:48.73
-chr1 2263004 rs12730050 A G 0.31 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=14.25;MQ=55.46;MQ0=1;OQ=1032.60;QD=11.35;SB=-477.87 GT:AD:DP:GL:GQ 0/1:51,40:84:-131.86,-25.32,-172.18:99
-chr1 2263146 rs2843138 T C 3.27 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.02;HRun=0;HaplotypeScore=5.34;MQ=54.41;MQ0=0;OQ=1335.96;QD=29.04;SB=-625.83 GT:AD:DP:GL:GQ 1/1:0,44:44:-137.23,-12.97,-0.04:99
-chr1 2263291 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=4;HaplotypeScore=15.31;MQ=57.02;MQ0=0;OQ=65.39;QD=1.72;SB=65.25 GT:AD:DP:GL:GQ 0/1:31,7:33:-19.78,-9.96,-120.76:98.22
-chr1 2263292 . A G 14.86 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=57.52;MQ0=0;QD=0.41;SB=62.21 GT:AD:DP:GL:GQ 0/1:29,6:31:-14.10,-9.35,-99.44:47.55
-chr1 2263765 rs1472319 T C 33.65 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.68;MQ=59.72;MQ0=0;OQ=1846.27;QD=27.56;SB=-842.46 GT:AD:DP:GL:GQ 1/1:0,67:60:-188.28,-18.10,-0.07:99
-chr1 2264170 rs12735747 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=4;HaplotypeScore=15.88;MQ=53.27;MQ0=1;OQ=600.98;QD=16.24;SB=-322.72 GT:AD:DP:GL:GQ 0/1:17,20:33:-73.32,-9.94,-46.93:99
-chr1 2264171 rs12740557 T A 0.25 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=15.88;MQ=53.27;MQ0=1;OQ=596.15;QD=16.11;SB=-294.37 GT:AD:DP:GL:GQ 0/1:17,20:33:-72.84,-9.94,-48.77:99
-chr1 2264298 rs61288374 A G 10.67 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=58.45;MQ0=0;OQ=219.39;QD=7.31;SB=-3.98 GT:AD:DP:GL:GQ 0/1:16,13:26:-33.06,-7.84,-58.70:99
-chr1 2264816 rs4648828 G A 38.81 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.55;MQ=58.44;MQ0=0;OQ=661.80;QD=16.97;SB=-286.79 GT:AD:DP:GL:GQ 0/1:17,22:36:-80.32,-10.86,-47.76:99
-chr1 2264998 rs4648829 C T 229.79 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.45;MQ0=0;OQ=171.83;QD=11.46;SB=-76.07 GT:AD:DP:GL:GQ 0/1:9,6:13:-24.38,-3.92,-22.89:99
-chr1 2265236 rs4648830 T G 6.90 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.55;MQ0=0;OQ=452.22;QD=28.26;SB=-174.97 GT:AD:DP:GL:GQ 1/1:0,16:15:-48.82,-4.52,-0.01:45.09
-chr1 2265809 rs2643909 C G 56 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=57.02;MQ0=0;OQ=1592.56;QD=34.62;SB=-562.49 GT:AD:DP:GL:GQ 1/1:0,46:39:-162.87,-11.76,-0.03:99
-chr1 2265882 . G A 8.69 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.87;MQ0=0;OQ=753.33;QD=18.37;SB=-247.76 GT:AD:DP:GL:GQ 0/1:17,24:37:-89.77,-11.15,-48.26:99
-chr1 2265933 . T C 0.10 PASS AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=3;HaplotypeScore=2.25;MQ=58.59;MQ0=0;OQ=218.96;QD=6.64;SB=-11.87 GT:AD:DP:GL:GQ 0/1:21,12:30:-34.22,-9.04,-78.51:99
-chr1 2266056 rs11589063 C A 17.26 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.57;MQ=58.25;MQ0=0;OQ=453.86;QD=11.35;SB=-250.27 GT:AD:DP:GL:GQ 0/1:23,17:40:-60.72,-12.05,-77.71:99
-chr1 2266060 rs2843137 T A 278.60 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=57.66;MQ0=0;OQ=421.83;QD=10.55;SB=-226.71 GT:AD:DP:GL:GQ 0/1:23,17:37:-56.61,-11.15,-79.80:99
-chr1 2266231 rs11589451 C A 57.46 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.26;MQ=58.41;MQ0=0;OQ=597.75;QD=10.67;SB=-255.49 GT:AD:DP:GL:GQ 0/1:32,24:50:-78.13,-15.07,-90.69:99
-chr1 2266279 rs11590175 A G 185.77 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.15;MQ0=0;OQ=537.72;QD=10.97;SB=-262.22 GT:AD:DP:GL:GQ 0/1:22,25:41:-69.42,-12.37,-72.12:99
-chr1 2266621 . G A 34.89 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=59.21;MQ0=0;OQ=474.72;QD=13.56;SB=-211.70 GT:AD:DP:GL:GQ 0/1:17,18:29:-59.50,-8.75,-41.35:99
-chr1 2267026 . G A 47.30 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.99;MQ0=0;OQ=613.73;QD=16.59;SB=-254.78 GT:AD:DP:GL:GQ 0/1:17,20:34:-74.91,-10.25,-50.44:99
-chr1 2267073 . T C 188.99 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=394.61;QD=9.87;SB=-211.55 GT:AD:DP:GL:GQ 0/1:22,18:38:-54.20,-11.45,-84.44:99
-chr1 2267410 rs61762093 G C 176.11 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.35;MQ=56.22;MQ0=0;OQ=747.58;QD=15.26;SB=-308.18 GT:AD:DP:GL:GQ 0/1:27,22:44:-91.30,-13.26,-97.18:99
-chr1 2267687 rs2843134 G A 624.83 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=2217.24;QD=36.95;SB=-1015.91 GT:AD:DP:GL:GQ 1/1:0,60:58:-225.33,-17.48,-0.02:99
-chr1 2267975 rs12409523 G C 1.77 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=5.47;MQ=59.03;MQ0=0;OQ=822.23;QD=17.13;SB=-209.63 GT:AD:DP:GL:GQ 0/1:24,24:46:-99.39,-13.88,-93.78:99
-chr1 2268100 rs2132595 C T 240.52 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.35;MQ0=0;OQ=844.37;QD=16.56;SB=-387.19 GT:AD:DP:GL:GQ 0/1:23,28:47:-101.89,-14.17,-71.24:99
-chr1 2268508 rs2843133 A G 0.07 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=4;HaplotypeScore=2.38;MQ=57.65;MQ0=0;OQ=995.04;QD=26.19;SB=-340.62 GT:AD:DP:GL:GQ 1/1:0,38:30:-103.10,-9.04,-0.01:90.24
-chr1 2268841 rs2643910 C T 6.12 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=58.25;MQ0=0;OQ=784.65;QD=19.62;SB=-334.39 GT:AD:DP:GL:GQ 0/1:16,24:39:-93.50,-11.75,-52.91:99
-chr1 2269677 rs56030548 C T 80.69 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=57.12;MQ0=0;OQ=443.83;QD=15.85;SB=-131.12 GT:AD:DP:GL:GQ 0/1:13,15:27:-55.80,-8.14,-42.23:99
-chr1 2269999 rs35941092 C T 0.23 PASS AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=8.68;MQ=48.71;MQ0=0;OQ=64.58;QD=4.61;SB=-21.48 GT:AD:DP:GL:GQ 0/1:10,4:14:-13.97,-4.23,-30.76:97.42
-chr1 2270100 . T A 5.69 PASS AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.04;MQ0=0;OQ=92.13;QD=5.12;SB=-47.85 GT:AD:DP:GL:GQ 0/1:13,5:18:-17.92,-5.42,-46.07:99
-chr1 2270283 rs2645072 A C 0.37 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=56.22;MQ0=0;OQ=963.23;QD=33.21;SB=-173.01 GT:AD:DP:GL:GQ 1/1:0,29:28:-99.92,-8.44,-0.01:84.24
-chr1 2270521 rs2055204 G A 60.41 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=3.82;MQ=59.66;MQ0=0;OQ=983.74;QD=17.89;SB=-468.43 GT:AD:DP:GL:GQ 0/1:22,33:52:-117.32,-15.67,-79.90:99
-chr1 2271586 rs7527871 A C 436.10 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=784.91;QD=12.08;SB=-319.01 GT:AD:DP:GL:GQ 0/1:36,29:64:-101.05,-19.28,-130.62:99
-chr1 2271838 rs1039063 T G 2.04 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=5;HaplotypeScore=1.22;MQ=60.00;MQ0=0;OQ=495.93;QD=11.27;SB=-259.90 GT:AD:DP:GL:GQ 0/1:22,22:41:-65.23,-12.35,-74.62:99
-chr1 2271995 rs10910053 G A 269.15 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=928.57;QD=18.95;SB=-437.81 GT:AD:DP:GL:GQ 0/1:20,29:47:-110.30,-14.16,-67.66:99
-chr1 2272064 . G A 22.07 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.67;MQ=59.48;MQ0=0;OQ=676.05;QD=15.36;SB=-356.51 GT:AD:DP:GL:GQ 0/1:22,22:42:-83.55,-12.66,-69.45:99
-chr1 2272233 . C T 4.84 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=3.42;MQ=59.14;MQ0=0;OQ=912.77;QD=16.90;SB=-354.47 GT:AD:DP:GL:GQ 0/1:26,28:53:-110.53,-15.96,-92.85:99
-chr1 2272335 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.06;MQ=56.98;MQ0=0;OQ=124.90;QD=3.20;SB=56.19 GT:AD:DP:GL:GQ 0/1:24,15:32:-25.41,-9.64,-85.35:99
-chr1 2272540 rs2279704 C T 249.66 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.55;MQ0=0;OQ=742.26;QD=14.55;SB=-245.76 GT:AD:DP:GL:GQ 0/1:25,25:47:-91.67,-14.16,-87.05:99
-chr1 2272636 rs2254874 G C 9.15 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.74;MQ=56.62;MQ0=0;OQ=1562.16;QD=37.19;SB=-628.86 GT:AD:DP:GL:GQ 1/1:0,42:38:-159.82,-11.46,-0.02:99
-chr1 2272850 rs2036082 C T 429.96 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=669.32;QD=14.55;SB=-278.20 GT:AD:DP:GL:GQ 0/1:25,21:46:-84.08,-13.87,-81.55:99
-chr1 2273702 rs2643912 G T 414.73 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=338.96;QD=15.41;SB=-195.57 GT:AD:DP:GL:GQ 0/1:9,13:21:-43.50,-6.33,-31.88:99
-chr1 2273756 rs2840528 A G 171.15 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.44;MQ0=0;OQ=666.96;QD=16.27;SB=-294.48 GT:AD:DP:GL:GQ 0/1:18,23:41:-82.33,-12.35,-70.40:99
-chr1 2273863 rs2645082 T C 3.28 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=2.08;MQ=58.41;MQ0=0;OQ=1044.33;QD=23.73;SB=-369.45 GT:AD:DP:GL:GQ 1/1:0,44:35:-108.06,-10.56,-0.04:99
-chr1 2274055 rs3795272 T C 1.91 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=3;HaplotypeScore=4.58;MQ=58.20;MQ0=0;OQ=382.95;QD=8.15;SB=-128.51 GT:AD:DP:GL:GQ 0/1:28,19:44:-54.84,-13.26,-106.89:99
-chr1 2274346 rs12049067 C T 357.23 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.77;MQ0=0;OQ=508.21;QD=12.71;SB=-252.25 GT:AD:DP:GL:GQ 0/1:22,18:38:-65.56,-11.45,-75.12:99
-chr1 2274758 rs2840529 T G 24.15 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=0.63;MQ=59.39;MQ0=0;OQ=311.73;QD=8.20;SB=-145.73 GT:AD:DP:GL:GQ 0/1:25,13:34:-44.70,-10.25,-72.81:99
-chr1 2275042 rs2036083 A T 221.53 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=59.63;MQ0=0;OQ=509.88;QD=10.20;SB=-241.63 GT:AD:DP:GL:GQ 0/1:29,21:43:-67.22,-12.95,-90.87:99
-chr1 2275274 rs2843129 G A 298.24 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.43;MQ0=0;OQ=2821.79;QD=38.65;SB=-1326.28 GT:AD:DP:GL:GQ 1/1:0,73:71:-285.78,-21.39,-0.02:99
-chr1 2276807 rs1039100 A G 434.33 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1195.19;QD=31.45;SB=-467.43 GT:AD:DP:GL:GQ 1/1:0,38:36:-123.12,-10.85,-0.02:99
-chr1 2277377 rs2645083 T C 625.87 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=1448.36;QD=34.48;SB=-607.22 GT:AD:DP:GL:GQ 1/1:0,42:42:-148.44,-12.65,-0.02:99
-chr1 2277394 rs11577374 C T 128.24 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=58.95;MQ0=0;OQ=767.18;QD=17.44;SB=-322.88 GT:AD:DP:GL:GQ 0/1:20,24:40:-92.06,-12.06,-52.10:99
-chr1 2277476 rs2645085 T C 300.52 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.58;MQ0=0;OQ=627.13;QD=11.40;SB=-216.37 GT:AD:DP:GL:GQ 0/1:27,28:51:-81.37,-15.38,-100.48:99
-chr1 2277708 rs16825067 G C 15.92 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=58.92;MQ0=0;OQ=727.07;QD=18.64;SB=-379.89 GT:AD:DP:GL:GQ 0/1:17,22:37:-87.14,-11.15,-70.33:99
-chr1 2278607 rs2645086 T C 275.36 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.11;MQ0=0;OQ=269.17;QD=10.35;SB=-101.72 GT:AD:DP:GL:GQ 0/1:13,13:25:-37.74,-7.54,-47.79:99
-chr1 2279110 rs903912 C G 0.92 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=12.20;MQ=57.42;MQ0=0;OQ=679.10;QD=12.81;SB=-356.81 GT:AD:DP:GL:GQ 0/1:28,25:46:-85.06,-13.87,-109.25:99
-chr1 2279111 rs903913 T C 0.56 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.02;HRun=1;HaplotypeScore=12.09;MQ=57.42;MQ0=0;OQ=643.89;QD=12.15;SB=-297.64 GT:AD:DP:GL:GQ 0/1:27,25:52:-83.04,-15.37,-108.03:99
-chr1 2279181 rs903914 G A 327.01 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=59.27;MQ0=0;OQ=1113.86;QD=17.68;SB=-571.62 GT:AD:DP:GL:GQ 0/1:30,33:61:-133.06,-18.39,-88.20:99
-chr1 2280148 rs2840544 T C 12.55 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=59.49;MQ0=0;OQ=176.15;QD=3.91;SB=-95.61 GT:AD:DP:GL:GQ 0/1:34,11:43:-33.87,-12.97,-121.04:99
-chr1 2280520 rs2645088 T C 494.99 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=961.96;QD=28.29;SB=-437.29 GT:AD:DP:GL:GQ 1/1:0,34:31:-99.81,-9.35,-0.03:93.20
-chr1 2280750 rs2840543 C T 201 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.69;MQ0=0;OQ=2174.81;QD=36.25;SB=-926.73 GT:AD:DP:GL:GQ 1/1:0,60:56:-221.09,-16.88,-0.02:99
-chr1 2280771 rs2645089 G A 262.49 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=676.44;QD=13.53;SB=-331.88 GT:AD:DP:GL:GQ 0/1:29,21:47:-85.09,-14.16,-84.51:99
-chr1 2281127 rs6424093 A G 144.23 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.16;MQ0=0;OQ=492.45;QD=11.73;SB=-156.68 GT:AD:DP:GL:GQ 0/1:23,19:40:-64.58,-12.05,-85.73:99
-chr1 2281540 rs2840542 T C 309.75 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=56.56;MQ0=0;OQ=2607.54;QD=33.86;SB=-1074.11 GT:AD:DP:GL:GQ 1/1:0,77:73:-264.36,-21.99,-0.02:99
-chr1 2282015 rs2840541 T C 311.98 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=585.20;QD=9.75;SB=-280.12 GT:AD:DP:GL:GQ 0/1:36,24:60:-79.89,-18.08,-145.26:99
-chr1 2282269 rs2645090 T C 432.32 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=613.50;QD=9.16;SB=-290.16 GT:AD:DP:GL:GQ 0/1:38,29:64:-83.92,-19.29,-153.60:99
-chr1 2283026 rs2250799 G A 138.76 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.62;MQ0=0;OQ=1864.73;QD=38.06;SB=-791.54 GT:AD:DP:GL:GQ 1/1:0,49:48:-190.08,-14.47,-0.02:99
-chr1 2284017 rs10797420 G A 1.04 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=10.89;MQ=55.69;MQ0=1;OQ=1110.47;QD=17.63;SB=-493.05 GT:AD:DP:GL:GQ 0/1:28,34:55:-130.90,-16.57,-82.96:99
-chr1 2284704 rs55873848 C T 485.15 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.27;MQ0=0;OQ=939.68;QD=16.78;SB=-471.48 GT:AD:DP:GL:GQ 0/1:26,30:53:-113.22,-15.97,-82.15:99
-chr1 2284890 rs7530501 T G 19.05 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=5.02;MQ=57.51;MQ0=0;OQ=731.65;QD=13.80;SB=-124.84 GT:AD:DP:GL:GQ 0/1:25,28:51:-91.81,-15.36,-86.72:99
-chr1 2285068 rs57840322 G A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=6;HaplotypeScore=29.71;MQ=39.31;MQ0=0;OQ=1533.11;QD=35.65;SB=-660.69 GT:AD:DP:GL:GQ 1/1:0,43:40:-156.91,-12.05,-0.01:99
-chr1 2285112 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=42;Dels=0.05;HRun=7;HaplotypeScore=20.40;MQ=45.44;MQ0=0;OQ=661.72;QD=15.76;SB=-259.95 GT:AD:DP:GL:GQ 0/1:19,21:41:-81.21,-11.75,-63.70:99
-chr1 2285126 rs6682345 A T 200.65 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.08;MQ0=0;OQ=1898.67;QD=35.16;SB=-880.24 GT:AD:DP:GL:GQ 1/1:1,53:53:-197.20,-15.96,-3.75:99
-chr1 2285128 rs6682346 A T 359.27 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.28;MQ0=0;OQ=737.49;QD=13.41;SB=-376.75 GT:AD:DP:GL:GQ 0/1:30,25:55:-93.60,-16.56,-117.95:99
-chr1 2285638 rs10910055 A C 76.19 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=3.44;MQ=49.97;MQ0=2;OQ=838.51;QD=11.65;SB=-398.65 GT:AD:DP:GL:GQ 0/1:39,33:60:-105.20,-18.07,-117.50:99
-chr1 2285783 rs12026746 C T 166.61 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.98;MQ=27.61;MQ0=1;QD=3.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,15:30:-28.99,-9.05,-73.71:99
-chr1 2285784 . A G 712.90 SnpCluster AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.98;MQ=27.61;MQ0=1;QD=15.17;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,34:30:-83.61,-9.04,-20.49:99
-chr1 2285789 . T C 107.62 SnpCluster AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=51.95;MQ=27.67;MQ0=1;QD=2.20;SB=-10.00 GT:AD:DP:GL:GQ 0/1:37,12:31:-23.38,-9.34,-102.78:99
-chr1 2285797 . C T 99.87 SnpCluster AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=27.29;MQ0=3;QD=1.72;SB=-6.99 GT:AD:DP:GL:GQ 0/1:46,12:38:-24.73,-11.46,-107.35:99
-chr1 2285798 rs6685453 A G 587.05 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=37.13;MQ=27.02;MQ0=4;QD=10.12;SB=-34.94 GT:AD:DP:GL:GQ 0/1:35,23:38:-73.44,-11.45,-64.40:99
-chr1 2285805 rs2840539 G A 1277.62 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=29.98;MQ=27.32;MQ0=3;QD=21.65;SB=-159.63 GT:AD:DP:GL:GQ 0/1:13,46:41:-143.39,-12.35,-21.42:90.69
-chr1 2285956 rs7539098 A T 36.30 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.84;MQ0=4;OQ=256.31;QD=4.93;SB=-97.36 GT:AD:DP:GL:GQ 0/1:30,22:31:-38.25,-9.34,-84.38:99
-chr1 2285957 rs7539099 A T 39.69 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=32.84;MQ0=4;OQ=262.32;QD=5.04;SB=-99.37 GT:AD:DP:GL:GQ 0/1:29,23:31:-38.85,-9.34,-83.38:99
-chr1 2286519 rs12029098 A G 0.14 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=10.29;MQ=20.58;MQ0=25;OQ=214.67;QD=3.41;SB=-10.00 GT:AD:DP:GL:GQ 0/1:52,10:32:-34.39,-9.64,-87.93:99
-chr1 2286535 rs10910056 C T 41.85 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=18.11;MQ0=29;OQ=264.94;QD=4.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:49,10:24:-37.01,-7.23,-58.35:99
-chr1 2286632 rs12062221 G A 163.59 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.73;MQ0=23;OQ=318.86;QD=6.13;SB=-122.97 GT:AD:DP:GL:GQ 0/1:37,15:21:-41.50,-6.33,-38.58:99
-chr1 2286682 rs10910057 T C 259.25 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=21.36;MQ0=18;OQ=880.98;QD=17.98;SB=-392.60 GT:AD:DP:GL:GQ 1/1:18,31:25:-91.69,-7.53,-0.01:75.23
-chr1 2287320 rs7366927 T C 67.59 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=20.66;MQ0=24;OQ=467.32;QD=6.97;SB=-192.02 GT:AD:DP:GL:GQ 0/1:40,27:33:-59.96,-9.95,-57.33:99
-chr1 2287795 rs10910058 A T 108.02 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.68;MQ0=0;OQ=672.40;QD=13.18;SB=-131.84 GT:AD:DP:GL:GQ 0/1:26,25:50:-85.58,-15.06,-97.61:99
-chr1 2287854 rs10910059 G C 295.33 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.70;MQ0=0;OQ=1098.70;QD=16.90;SB=-242.39 GT:AD:DP:GL:GQ 0/1:34,31:65:-132.74,-19.58,-150.89:99
-chr1 2288115 rs4648834 A G 229.51 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=58.69;MQ0=0;OQ=974.25;QD=11.88;SB=-367.23 GT:AD:DP:GL:GQ 0/1:45,37:80:-124.81,-24.10,-176.65:99
-chr1 2288354 rs55960350 C A 363.99 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.19;MQ0=0;OQ=926.53;QD=15.44;SB=-445.49 GT:AD:DP:GL:GQ 0/1:29,31:60:-114.01,-18.07,-107.19:99
-chr1 2288496 rs10453826 G A 57.25 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1349.11;QD=17.75;SB=-668.70 GT:AD:DP:GL:GQ 0/1:36,39:75:-160.78,-22.59,-131.92:99
-chr1 2288624 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.02;HRun=18;HaplotypeScore=24.48;MQ=54.73;MQ0=1;OQ=401.02;QD=6.57;SB=-41.45 GT:AD:DP:GL:GQ 0/1:43,17:55:-59.67,-16.28,-122.97:99
-chr1 2288630 rs28792725 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.02;HRun=6;HaplotypeScore=25.44;MQ=54.48;MQ0=1;OQ=211.43;QD=3.92;SB=68.22 GT:AD:DP:GL:GQ 0/1:42,11:47:-38.29,-13.87,-121.95:99
-chr1 2288943 rs6704200 G A 186.62 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.03;MQ0=0;OQ=2659.42;QD=39.69;SB=-1189.57 GT:AD:DP:GL:GQ 1/1:0,67:67:-269.55,-20.19,-0.02:99
-chr1 2289098 rs12069579 C T 14.78 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=4;HaplotypeScore=1.46;MQ=57.20;MQ0=1;OQ=865.75;QD=14.43;SB=-343.49 GT:AD:DP:GL:GQ 0/1:32,28:57:-107.04,-17.18,-97.55:99
-chr1 2289170 rs12069588 C T 455.09 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=1016.01;QD=15.88;SB=-357.83 GT:AD:DP:GL:GQ 0/1:33,31:64:-124.17,-19.28,-114.93:99
-chr1 2289171 rs12071572 A G 466.33 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=819.05;QD=12.80;SB=-318.26 GT:AD:DP:GL:GQ 0/1:33,31:63:-104.18,-18.99,-126.28:99
-chr1 2289487 rs7545940 T C 276.29 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=59.67;MQ0=0;OQ=618.09;QD=11.04;SB=-316.36 GT:AD:DP:GL:GQ 0/1:32,24:55:-81.66,-16.57,-127.86:99
-chr1 2289511 rs2840538 T C 82.58 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=59.24;MQ0=0;OQ=1874.35;QD=34.08;SB=-939.34 GT:AD:DP:GL:GQ 1/1:0,55:54:-191.04,-16.27,-0.02:99
-chr1 2289772 rs7546224 T C 223.24 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.97;MQ0=0;OQ=650.32;QD=11.02;SB=-248.17 GT:AD:DP:GL:GQ 0/1:33,26:58:-85.80,-17.48,-124.44:99
-chr1 2290017 rs12070927 C A 51.76 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=59.12;MQ0=0;OQ=1316.41;QD=19.08;SB=-657.73 GT:AD:DP:GL:GQ 0/1:26,43:67:-155.11,-20.18,-89.64:99
-chr1 2290238 rs7514750 G C 5.37 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=56.12;MQ0=0;OQ=999.16;QD=16.93;SB=-161.14 GT:AD:DP:GL:GQ 0/1:29,30:55:-119.78,-16.58,-120.03:99
-chr1 2290509 rs7542190 C T 358.30 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.38;MQ0=0;OQ=592.85;QD=11.62;SB=-156.20 GT:AD:DP:GL:GQ 0/1:31,20:49:-77.34,-14.77,-99.87:99
-chr1 2290635 rs7554609 A G 100.55 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=57.81;MQ0=0;OQ=439.50;QD=11.27;SB=-190.14 GT:AD:DP:GL:GQ 0/1:19,19:37:-60.47,-13.23,-75.89:99
-chr1 2290654 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=20;HaplotypeScore=28.09;MQ=53.25;MQ0=0;OQ=241.28;QD=4.02;SB=92.32 GT:AD:DP:GL:GQ 0/1:44,16:53:-43.38,-15.97,-152.46:99
-chr1 2290675 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=20;HaplotypeScore=29.22;MQ=49.62;MQ0=0;OQ=64.81;QD=0.94;SB=71.20 GT:AD:DP:GL:GQ 0/1:52,14:46:-23.33,-13.56,-132.10:97.65
-chr1 2291469 rs2840535 G T 504.16 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=896.75;QD=14.95;SB=-459.55 GT:AD:DP:GL:GQ 0/1:30,30:59:-110.74,-17.78,-88.69:99
-chr1 2291551 rs6665546 G A 392.04 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1434.00;QD=17.70;SB=-726.06 GT:AD:DP:GL:GQ 0/1:39,42:81:-171.09,-24.41,-128.82:99
-chr1 2292331 rs2453567 C T 202.13 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=54.48;MQ0=0;OQ=1114.28;QD=17.14;SB=-425.43 GT:AD:DP:GL:GQ 0/1:31,34:60:-132.80,-18.08,-88.05:99
-chr1 2292376 rs2453566 T C 254.25 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=52.46;MQ0=0;OQ=498.58;QD=10.18;SB=-208.48 GT:AD:DP:GL:GQ 0/1:22,27:40:-65.21,-12.06,-74.69:99
-chr1 2293426 rs2840534 A G 74.94 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=4.04;MQ=59.63;MQ0=0;OQ=998.53;QD=16.11;SB=-332.38 GT:AD:DP:GL:GQ 0/1:27,35:61:-121.51,-18.38,-106.86:99
-chr1 2297776 rs2843165 A C 120.65 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=714.07;QD=14.28;SB=-105.81 GT:AD:DP:GL:GQ 0/1:23,27:49:-89.45,-14.76,-84.29:99
-chr1 2298377 rs2843162 C G 368.81 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=490.57;QD=15.82;SB=-257.11 GT:AD:DP:GL:GQ 0/1:17,14:31:-61.68,-9.34,-73.31:99
-chr1 2298942 rs2843160 T G 117.23 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=59.17;MQ0=0;OQ=634.08;QD=11.32;SB=-278.70 GT:AD:DP:GL:GQ 0/1:27,29:53:-82.67,-15.98,-90.35:99
-chr1 2302255 rs2643908 C T 314.36 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.55;MQ0=0;OQ=684.01;QD=13.41;SB=-309.40 GT:AD:DP:GL:GQ 0/1:26,25:46:-85.54,-13.86,-88.50:99
-chr1 2303400 rs2843132 A G 8.40 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=3.40;MQ=59.58;MQ0=0;OQ=438.03;QD=9.96;SB=-158.56 GT:AD:DP:GL:GQ 0/1:24,20:38:-58.54,-11.45,-84.41:99
-chr1 2304179 rs2643901 T C 196.35 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=59.45;MQ0=0;OQ=721.33;QD=17.17;SB=-281.01 GT:AD:DP:GL:GQ 0/1:15,26:39:-87.17,-11.75,-56.36:99
-chr1 2305298 rs2645060 G A 178.67 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=60.00;MQ0=0;OQ=1082.92;QD=18.05;SB=-486.00 GT:AD:DP:GL:GQ 0/1:25,35:57:-128.76,-17.18,-76.49:99
-chr1 2305540 rs2843128 A G 194.82 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.59;MQ0=0;OQ=482.38;QD=10.49;SB=-248.93 GT:AD:DP:GL:GQ 0/1:24,22:42:-64.18,-12.66,-86.34:99
-chr1 2305577 rs2843127 A G 547.43 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=527.20;QD=11.98;SB=-284.59 GT:AD:DP:GL:GQ 0/1:25,19:44:-69.26,-13.26,-98.42:99
-chr1 2306175 rs2843126 A G 188.97 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=58.39;MQ0=0;OQ=344.67;QD=9.07;SB=-143.56 GT:AD:DP:GL:GQ 0/1:18,19:33:-47.70,-9.95,-71.62:99
-chr1 2306848 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=13;HaplotypeScore=4.17;MQ=55.00;MQ0=0;OQ=100.30;QD=4.18;SB=17.09 GT:AD:DP:GL:GQ 0/1:17,7:16:-18.14,-4.82,-46.21:99
-chr1 2309288 rs903903 A G 560.94 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1265.25;QD=17.33;SB=-657.78 GT:AD:DP:GL:GQ 0/1:28,45:70:-150.90,-21.10,-100.41:99
-chr1 2309390 rs2645061 G T 558.68 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=773.84;QD=12.28;SB=-380.71 GT:AD:DP:GL:GQ 0/1:36,27:63:-99.64,-18.97,-129.32:99
-chr1 2310428 . G A 99.95 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=70;Dels=0.04;HRun=15;HaplotypeScore=39.00;MQ=46.05;MQ0=0;QD=1.43;SB=52.68 GT:AD:DP:GL:GQ 0/1:53,14:55:-29.56,-16.28,-149.90:99
-chr1 2313868 rs2840533 C T 252.17 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=59.24;MQ0=0;OQ=794.28;QD=14.44;SB=-234.49 GT:AD:DP:GL:GQ 0/1:29,26:54:-98.98,-16.27,-105.03:99
-chr1 2314319 . A G 42.45 LowQual AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=50.37;MQ0=0;QD=0.63;SB=-7.70 GT:AD:DP:GL:GQ 0/1:58,9:63:-26.51,-18.98,-220.77:75.28
-chr1 2314326 . A G 0.25 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=50.58;MQ0=0;OQ=173.32;QD=2.44;SB=-79.68 GT:AD:DP:GL:GQ 0/1:59,12:69:-41.40,-20.79,-226.63:99
-chr1 2314333 rs41315342 C T 21.24 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=49.96;MQ0=0;OQ=309.71;QD=4.62;SB=-180.11 GT:AD:DP:GL:GQ 0/1:53,14:62:-52.95,-18.70,-157.19:99
-chr1 2315408 . G A 4.80 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=3.55;MQ=59.13;MQ0=0;OQ=1258.74;QD=16.78;SB=-356.05 GT:AD:DP:GL:GQ 0/1:37,38:74:-151.46,-22.30,-126.73:99
-chr1 2315869 rs1123571 G A 390.91 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.65;MQ0=0;OQ=976.67;QD=13.95;SB=-457.41 GT:AD:DP:GL:GQ 0/1:38,32:64:-120.23,-19.28,-120.05:99
-chr1 2316672 rs903911 A G 4.65 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=4.83;MQ=58.81;MQ0=0;OQ=646.68;QD=16.58;SB=-230.30 GT:AD:DP:GL:GQ 0/1:16,22:38:-79.40,-11.45,-61.89:99
-chr1 2317675 rs2840532 C T 230.75 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.63;MQ0=0;OQ=2453.68;QD=38.95;SB=-993.83 GT:AD:DP:GL:GQ 1/1:0,63:62:-248.97,-18.68,-0.02:99
-chr1 2318574 rs2645081 A G 8.21 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=6.83;MQ=58.95;MQ0=0;OQ=2467.67;QD=30.85;SB=-995.94 GT:AD:DP:GL:GQ 1/1:0,79:71:-250.38,-21.39,-0.03:99
-chr1 2319521 rs6698680 A G 273.51 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.27;MQ0=0;OQ=618.22;QD=12.12;SB=-195.44 GT:AD:DP:GL:GQ 0/1:27,24:49:-79.88,-14.77,-98.83:99
-chr1 2319668 rs3001344 A G 117.65 PASS AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.27;MQ0=0;OQ=3223.06;QD=35.42;SB=-1436.46 GT:AD:DP:GL:GQ 1/1:0,91:90:-325.91,-27.11,-0.03:99
-chr1 2319862 rs6698978 A G 270.88 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=53.38;MQ0=0;OQ=935.78;QD=15.60;SB=-478.67 GT:AD:DP:GL:GQ 0/1:27,33:58:-114.34,-17.47,-100.10:99
-chr1 2319876 rs6685829 C T 18.19 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=6.10;MQ=50.59;MQ0=0;OQ=722.12;QD=12.24;SB=-192.86 GT:AD:DP:GL:GQ 0/1:35,24:57:-92.67,-17.18,-109.45:99
-chr1 2320050 rs6693447 T G 274.62 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.41;MQ0=0;OQ=1099.08;QD=15.48;SB=-483.82 GT:AD:DP:GL:GQ 0/1:33,38:70:-134.27,-21.08,-119.27:99
-chr1 2321898 rs55912310 A G 16.38 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=6.30;MQ=59.22;MQ0=0;OQ=1063.46;QD=13.63;SB=-443.56 GT:AD:DP:GL:GQ 0/1:40,38:76:-132.53,-22.90,-155.79:99
-chr1 2322251 rs12037485 C T 255.22 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=54.76;MQ0=0;OQ=603.45;QD=12.57;SB=-317.81 GT:AD:DP:GL:GQ 0/1:27,21:45:-77.19,-13.56,-84.03:99
-chr1 2322525 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=3;HaplotypeScore=18.90;MQ=37.53;MQ0=0;OQ=105.39;QD=3.90;SB=-31.65 GT:AD:DP:GL:GQ 0/1:20,7:25:-21.36,-7.54,-75.64:99
-chr1 2322526 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=17.62;MQ=38.02;MQ0=0;OQ=76.24;QD=2.63;SB=-0.98 GT:AD:DP:GL:GQ 0/1:23,6:24:-18.14,-7.23,-69.35:99
-chr1 2322566 . C T 184.67 Indel AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=7.93;MQ=44.33;MQ0=0;QD=9.72;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,7:16:-26.58,-4.82,-31.47:99
-chr1 2322586 . T C 43.94 LowQual AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=2;HaplotypeScore=6.02;MQ=50.39;MQ0=0;QD=3.38;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,4:11:-10.99,-3.32,-30.04:76.77
-chr1 2322650 . T C 18.09 LowQual AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=2;HaplotypeScore=5.99;MQ=43.00;MQ0=0;QD=3.01;SB=-3.98 GT:AD:DP:GL:GQ 0/1:4,2:6:-6.89,-1.81,-15.35:50.86
-chr1 2322668 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=1;HaplotypeScore=16.47;MQ=36.20;MQ0=0;OQ=99.28;QD=6.62;SB=-3.98 GT:AD:DP:GL:GQ 0/1:11,4:11:-16.52,-3.31,-24.94:99
-chr1 2322705 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=18.95;MQ=39.10;MQ0=0;OQ=127.82;QD=7.99;SB=-6.99 GT:AD:DP:GL:GQ 0/1:11,5:12:-19.68,-3.62,-24.01:99
-chr1 2322711 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=13.96;MQ=44.08;MQ0=0;OQ=161.06;QD=8.05;SB=-38.94 GT:AD:DP:GL:GQ 0/1:13,7:16:-24.21,-4.82,-34.51:99
-chr1 2322848 rs3001337 T C 21.54 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.78;MQ0=0;OQ=436.82;QD=19.86;SB=-71.91 GT:AD:DP:GL:GQ 1/1:0,22:15:-47.28,-4.52,-0.02:45.08
-chr1 2322891 rs3001336 G A 52.42 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.61;MQ=57.77;MQ0=0;OQ=1380.55;QD=34.51;SB=-210.77 GT:AD:DP:GL:GQ 1/1:0,39:36:-141.66,-10.85,-0.02:99
-chr1 2324121 . G T 2.67 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=60.00;MQ0=0;OQ=1012.17;QD=19.85;SB=-217.60 GT:AD:DP:GL:GQ 0/1:19,32:51:-119.87,-15.37,-54.76:99
-chr1 2324716 rs41315648 C T 55.76 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=58.50;MQ0=0;OQ=419.39;QD=13.53;SB=-59.02 GT:AD:DP:GL:GQ 0/1:17,14:29:-53.97,-8.74,-50.19:99
-chr1 2325536 rs1129333 A G 283.63 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=1733.67;QD=33.99;SB=-802.65 GT:AD:DP:GL:GQ 1/1:0,51:50:-176.97,-15.06,-0.02:99
-chr1 2327137 rs11586985 C T 102.53 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=429.81;QD=12.28;SB=-139.15 GT:AD:DP:GL:GQ 0/1:21,14:35:-56.82,-10.56,-64.66:99
-chr1 2327397 rs2494426 C G 233.81 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=927.58;QD=37.10;SB=-342.73 GT:AD:DP:GL:GQ 1/1:0,25:23:-96.36,-6.94,-0.02:69.23
-chr1 2327420 rs55746053 G A 222.42 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.19;MQ0=0;OQ=251.55;QD=10.94;SB=-144.16 GT:AD:DP:GL:GQ 0/1:13,10:21:-34.77,-6.33,-37.00:99
-chr1 2327986 rs3795269 C A 81.57 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.48;MQ=59.11;MQ0=0;OQ=721.54;QD=13.88;SB=-337.19 GT:AD:DP:GL:GQ 0/1:25,27:47:-89.60,-14.16,-76.64:99
-chr1 2328429 rs2494427 T C 699.34 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1614.58;QD=34.35;SB=-832.33 GT:AD:DP:GL:GQ 1/1:0,47:46:-165.06,-13.86,-0.02:99
-chr1 2328739 rs6671420 G A 245.45 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=58.64;MQ0=0;OQ=433.47;QD=13.98;SB=-240.76 GT:AD:DP:GL:GQ 0/1:16,15:30:-55.68,-9.05,-50.08:99
-chr1 2328934 rs2494428 C T 252.86 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=2537.82;QD=38.45;SB=-908.73 GT:AD:DP:GL:GQ 1/1:0,66:65:-257.39,-19.59,-0.03:99
-chr1 2328975 rs2494599 T C 150.34 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=60.00;MQ0=0;OQ=1601.93;QD=34.08;SB=-647.90 GT:AD:DP:GL:GQ 1/1:0,47:46:-163.80,-13.86,-0.02:99
-chr1 2328999 rs6671730 G A 141.04 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=617.02;QD=15.43;SB=-196.85 GT:AD:DP:GL:GQ 0/1:20,20:39:-76.74,-11.75,-69.55:99
-chr1 2329255 rs2494429 A G 318.55 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.40;MQ0=0;OQ=347.51;QD=11.21;SB=-114.76 GT:AD:DP:GL:GQ 0/1:16,15:29:-46.78,-8.74,-56.84:99
-chr1 2329287 rs4648634 C T 185.49 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.86;MQ=59.06;MQ0=0;OQ=270.55;QD=13.53;SB=-158.18 GT:AD:DP:GL:GQ 0/1:11,9:17:-35.47,-5.13,-24.67:99
-chr1 2329933 . C G 22.59 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=58.67;MQ0=0;OQ=614.01;QD=12.53;SB=-287.97 GT:AD:DP:GL:GQ 0/1:22,27:40:-76.76,-12.08,-83.82:99
-chr1 2330060 rs2494598 T C 290.44 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=58.95;MQ0=0;OQ=481.10;QD=12.03;SB=-246.32 GT:AD:DP:GL:GQ 0/1:19,21:39:-63.16,-11.76,-72.17:99
-chr1 2332427 . C T 0.21 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.66;MQ=58.03;MQ0=0;OQ=1034.47;QD=16.96;SB=-503.70 GT:AD:DP:GL:GQ 0/1:28,33:58:-124.21,-17.48,-97.70:99
-chr1 2333054 rs2494597 T C 55.95 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.48;MQ0=0;OQ=1376.62;QD=31.29;SB=-454.42 GT:AD:DP:GL:GQ 1/1:0,44:41:-141.27,-12.35,-0.02:99
-chr1 2334551 rs2494595 A G 104.16 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=58.99;MQ0=0;OQ=304.12;QD=13.22;SB=-164.34 GT:AD:DP:GL:GQ 0/1:12,11:22:-40.32,-6.63,-44.91:99
-chr1 2334785 rs9424320 T C 95.96 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.20;MQ0=0;OQ=385.94;QD=13.31;SB=-75.78 GT:AD:DP:GL:GQ 0/1:11,17:25:-49.42,-7.54,-38.41:99
-chr1 2335959 rs7556447 C G 349.75 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=56.82;MQ0=0;OQ=713.10;QD=13.71;SB=-329.23 GT:AD:DP:GL:GQ 0/1:30,22:47:-88.76,-14.16,-115.39:99
-chr1 2336342 rs4648839 T C 24.11 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=49.60;MQ0=0;OQ=479.90;QD=20.87;SB=-161.36 GT:AD:DP:GL:GQ 1/1:1,22:17:-51.60,-5.13,-0.02:51.09
-chr1 2336383 rs10910065 G C 120.25 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=52.63;MQ0=0;OQ=649.76;QD=18.05;SB=-286.56 GT:AD:DP:GL:GQ 0/1:17,19:34:-78.51,-10.25,-66.28:99
-chr1 2336384 rs10910066 T C 189.89 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=52.63;MQ0=0;OQ=539.82;QD=14.99;SB=-236.31 GT:AD:DP:GL:GQ 0/1:17,19:36:-68.12,-10.85,-65.37:99
-chr1 2336612 . G A 111.33 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=53.01;MQ0=0;OQ=620.89;QD=13.80;SB=-302.81 GT:AD:DP:GL:GQ 0/1:24,21:40:-77.43,-12.05,-71.03:99
-chr1 2337326 rs12746918 C T 6.83 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=7.69;MQ=54.86;MQ0=0;OQ=484.18;QD=9.68;SB=-259.25 GT:AD:DP:GL:GQ 0/1:29,21:42:-64.36,-12.66,-87.95:99
-chr1 2337359 . C T 7.61 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=4.85;MQ=55.32;MQ0=0;OQ=435.73;QD=9.68;SB=-169.11 GT:AD:DP:GL:GQ 0/1:27,17:41:-59.22,-12.37,-82.09:99
-chr1 2337436 . G T 34.30 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=57.73;MQ0=0;OQ=368.11;QD=11.87;SB=-146.62 GT:AD:DP:GL:GQ 0/1:16,15:30:-49.13,-9.04,-55.91:99
-chr1 2337592 rs12184328 G A 0.69 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=8.46;MQ=57.94;MQ0=0;OQ=510.09;QD=15.00;SB=-111.95 GT:AD:DP:GL:GQ 0/1:17,16:33:-64.24,-9.94,-57.68:99
-chr1 2337900 rs10910068 T C 14.61 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=1.32;MQ=56.47;MQ0=0;OQ=310.27;QD=9.13;SB=-165.49 GT:AD:DP:GL:GQ 0/1:15,19:29:-43.06,-8.75,-59.62:99
-chr1 2339629 rs2494432 G A 402.74 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=824.63;QD=16.83;SB=-334.87 GT:AD:DP:GL:GQ 0/1:23,26:44:-99.01,-13.26,-63.50:99
-chr1 2339896 . C T 167.28 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=715.32;QD=13.50;SB=-333.31 GT:AD:DP:GL:GQ 0/1:31,22:52:-90.49,-15.68,-97.09:99
-chr1 2340772 rs10910070 G A 197.79 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=60.00;MQ0=0;OQ=631.24;QD=14.35;SB=-260.25 GT:AD:DP:GL:GQ 0/1:23,21:43:-79.37,-12.96,-74.56:99
-chr1 2340956 rs11577147 A G 10.98 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=289.51;QD=8.77;SB=-78.79 GT:AD:DP:GL:GQ 0/1:19,14:32:-41.88,-9.65,-72.03:99
-chr1 2341435 rs11590507 G A 0.61 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=57.66;MQ0=0;OQ=472.75;QD=15.76;SB=-44.54 GT:AD:DP:GL:GQ 0/1:14,15:29:-59.30,-8.74,-51.63:99
-chr1 2341559 rs3935659 T C 7.79 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=3.23;MQ=59.25;MQ0=0;OQ=287.36;QD=11.49;SB=-29.91 GT:AD:DP:GL:GQ 0/1:13,12:25:-39.55,-7.53,-50.79:99
-chr1 2341739 rs3935660 C T 165.26 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=58.09;MQ0=0;OQ=670.17;QD=13.68;SB=-195.21 GT:AD:DP:GL:GQ 0/1:27,21:42:-82.97,-12.67,-64.00:99
-chr1 2342006 rs12731309 C T 203.63 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=58.88;MQ0=0;OQ=846.80;QD=15.68;SB=-399.13 GT:AD:DP:GL:GQ 0/1:28,26:51:-103.32,-15.36,-93.02:99
-chr1 2342252 . A T 13.40 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=20.03;MQ=56.40;MQ0=0;QD=0.29;SB=20.83 GT:AD:DP:GL:GQ 0/1:37,6:32:-14.24,-9.64,-106.31:46.04
-chr1 2342253 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=16;HaplotypeScore=7.92;MQ=56.40;MQ0=0;OQ=132.41;QD=2.82;SB=14.63 GT:AD:DP:GL:GQ 0/1:39,8:37:-27.67,-11.15,-101.20:99
-chr1 2342945 rs10910071 A G 300.82 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=58.83;MQ0=0;OQ=1016.43;QD=13.20;SB=-494.01 GT:AD:DP:GL:GQ 0/1:41,36:76:-127.82,-22.90,-155.86:99
-chr1 2343155 rs12143389 C T 127 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=58.70;MQ0=1;OQ=925.95;QD=15.69;SB=-402.44 GT:AD:DP:GL:GQ 0/1:31,28:58:-113.35,-17.47,-107.32:99
-chr1 2343729 rs35799953 G T 69.33 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.02;MQ0=0;OQ=852.19;QD=13.75;SB=-419.16 GT:AD:DP:GL:GQ 0/1:33,29:62:-107.18,-18.68,-104.15:99
-chr1 2343876 rs34574702 C T 503.31 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1119.07;QD=15.54;SB=-507.56 GT:AD:DP:GL:GQ 0/1:37,35:71:-136.60,-21.41,-114.39:99
-chr1 2344230 rs12022832 T C 209.47 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=58.42;MQ0=0;OQ=1122.84;QD=12.62;SB=-438.76 GT:AD:DP:GL:GQ 0/1:44,45:86:-141.48,-25.92,-179.52:99
-chr1 2344260 rs12096965 C T 229.98 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.88;MQ0=0;OQ=1606.93;QD=18.26;SB=-801.37 GT:AD:DP:GL:GQ 0/1:41,47:83:-188.99,-25.01,-117.57:99
-chr1 2344423 rs12097032 C T 484.25 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=986.20;QD=13.33;SB=-465.97 GT:AD:DP:GL:GQ 0/1:43,31:74:-124.19,-22.29,-159.47:99
-chr1 2344746 rs10797421 G A 65.48 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.32;MQ0=1;OQ=3166.01;QD=39.09;SB=-1482.03 GT:AD:DP:GL:GQ 1/1:0,81:79:-320.20,-23.80,-0.02:99
-chr1 2345260 . A G 75.95 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.23;MQ0=0;OQ=680.86;QD=11.35;SB=-282.57 GT:AD:DP:GL:GQ 0/1:36,24:58:-88.84,-17.47,-139.70:99
-chr1 2346437 rs4648840 A G 47.43 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.94;MQ0=0;OQ=537.49;QD=18.53;SB=-194.00 GT:AD:DP:GL:GQ 0/1:11,18:29:-65.77,-8.74,-43.90:99
-chr1 2346772 rs2494433 G A 58.11 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=56.91;MQ0=0;OQ=1163.67;QD=17.63;SB=-493.51 GT:AD:DP:GL:GQ 0/1:29,36:61:-138.03,-18.37,-99.55:99
-chr1 2347335 rs2494434 T C 559.97 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=1472.38;QD=29.45;SB=-544.87 GT:AD:DP:GL:GQ 1/1:0,50:48:-150.87,-14.48,-0.05:99
-chr1 2347933 rs2494588 C T 188.87 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=57.48;MQ0=0;OQ=702.34;QD=16.33;SB=-327.35 GT:AD:DP:GL:GQ 0/1:19,24:41:-85.88,-12.36,-61.93:99
-chr1 2348381 rs55852252 G A 9.22 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=6.28;MQ=58.74;MQ0=0;OQ=406.10;QD=10.98;SB=-128.60 GT:AD:DP:GL:GQ 0/1:20,16:33:-53.85,-9.96,-60.26:99
-chr1 2348618 rs2494587 C T 128.74 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=58.45;MQ0=0;OQ=376.88;QD=12.56;SB=-173.14 GT:AD:DP:GL:GQ 0/1:17,13:28:-49.41,-8.44,-50.72:99
-chr1 2348708 rs12116913 G C 294.62 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=640.63;QD=17.31;SB=-259.09 GT:AD:DP:GL:GQ 0/1:14,23:34:-77.61,-10.26,-60.10:99
-chr1 2349777 rs2494436 T C 163.31 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.34;MQ0=0;OQ=309.46;QD=8.84;SB=-92.69 GT:AD:DP:GL:GQ 0/1:19,16:32:-43.87,-9.64,-70.50:99
-chr1 2349800 rs7515934 C T 251.15 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=58.83;MQ0=0;OQ=424.25;QD=11.78;SB=-175.26 GT:AD:DP:GL:GQ 0/1:19,17:28:-54.15,-8.45,-42.69:99
-chr1 2350992 rs10910075 C T 473.62 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=647.50;QD=14.08;SB=-334.47 GT:AD:DP:GL:GQ 0/1:24,22:45:-81.60,-13.57,-79.99:99
-chr1 2351241 . T G 21.83 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=2;HaplotypeScore=2.69;MQ=59.58;MQ0=0;QD=0.40;SB=68.21 GT:AD:DP:GL:GQ 0/1:36,19:40:-17.52,-12.05,-117.29:54.64
-chr1 2351880 rs4531246 G T 25.70 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.77;MQ=57.66;MQ0=0;OQ=504.52;QD=12.61;SB=-172.18 GT:AD:DP:GL:GQ 0/1:16,23:33:-63.68,-9.95,-50.73:99
-chr1 2352624 rs10797424 A T 924.88 Indel AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.64;MQ=59.45;MQ0=0;QD=16.52;SB=-353.59 GT:AD:DP:GL:GQ 0/1:25,31:52:-111.44,-15.67,-81.17:99
-chr1 2352687 rs2494641 C T 290.78 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=59.48;MQ0=0;OQ=558.90;QD=11.89;SB=-269.24 GT:AD:DP:GL:GQ 0/1:28,19:43:-72.14,-12.96,-80.82:99
-chr1 2353187 rs2494640 G C 26.97 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=4.41;MQ=59.56;MQ0=0;OQ=532.94;QD=10.25;SB=-240.06 GT:AD:DP:GL:GQ 0/1:33,18:51:-71.97,-15.39,-132.20:99
-chr1 2361858 rs12756220 T C 1.74 PASS AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=2;HaplotypeScore=7.14;MQ=34.26;MQ0=3;OQ=1721.38;QD=12.30;SB=-137.87 GT:AD:DP:GL:GQ 0/1:41,97:98:-204.99,-29.57,-118.98:99
-chr1 2361893 rs34648463 T G 24.56 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=3.90;MQ=42.90;MQ0=5;OQ=1167.25;QD=12.83;SB=-195.79 GT:AD:DP:GL:GQ 0/1:32,58:69:-140.80,-20.79,-99.18:99
-chr1 2361936 rs28669301 A C 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=18.37;MQ=47.88;MQ0=0;OQ=797.11;QD=9.96;SB=-212.34 GT:AD:DP:GL:GQ 0/1:30,48:65:-102.59,-19.60,-99.90:99
-chr1 2361993 rs2494638 G C 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=3.02;MQ=48.10;MQ0=3;OQ=294.71;QD=3.68;SB=53.21 GT:AD:DP:GL:GQ 0/1:57,23:60:-50.84,-18.09,-206.36:99
-chr1 2363043 . G A 28.79 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=59.14;MQ0=0;OQ=346.36;QD=12.83;SB=-157.68 GT:AD:DP:GL:GQ 0/1:14,13:24:-45.16,-7.24,-42.35:99
-chr1 2380627 . C G 34.70 LowQual AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=57.50;MQ0=0;QD=0.48;SB=-30.39 GT:AD:DP:GL:GQ 0/1:66,6:63:-25.74,-18.99,-243.93:67.54
-chr1 2380700 rs28508164 T C 2.51 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.08;MQ0=1;OQ=73.76;QD=1.76;SB=-56.90 GT:AD:DP:GL:GQ 0/1:36,6:33:-20.60,-9.94,-107.88:99
-chr1 2380723 . G C 46.32 LowQual AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=2;HaplotypeScore=2.29;MQ=49.69;MQ0=1;QD=2.72;SB=-23.39 GT:AD:DP:GL:GQ 0/1:12,5:11:-11.23,-3.32,-34.81:79.16
-chr1 2380725 . C T 43.06 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=49.69;MQ0=1;QD=2.53;SB=5.04 GT:AD:DP:GL:GQ 0/1:12,5:11:-10.90,-3.32,-27.83:75.90
-chr1 2380739 . G C 31.92 LowQual AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=2;HaplotypeScore=1.16;MQ=44.53;MQ0=1;QD=1.88;SB=-3.98 GT:AD:DP:GL:GQ 0/1:10,7:9:-9.19,-2.71,-29.02:64.75
-chr1 2380741 . C T 23.47 LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=43.38;MQ0=1;QD=1.47;SB=-3.99 GT:AD:DP:GL:GQ 0/1:10,6:8:-8.04,-2.42,-18.12:56.29
-chr1 2380787 . C G 11.87 PASS AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=41.08;MQ0=2;OQ=228.10;QD=9.12;SB=-107.32 GT:AD:DP:GL:GQ 0/1:13,12:14:-30.31,-4.22,-31.36:99
-chr1 2380789 . T C 0.06 PASS AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=2;HaplotypeScore=3.66;MQ=41.08;MQ0=2;OQ=146.59;QD=5.86;SB=-69.76 GT:AD:DP:GL:GQ 0/1:13,12:14:-22.16,-4.22,-27.36:99
-chr1 2380812 . C T 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=13.92;MQ=46.38;MQ0=1;OQ=329.40;QD=9.98;SB=-91.91 GT:AD:DP:GL:GQ 0/1:15,18:19:-41.95,-5.73,-28.82:99
-chr1 2380819 . C G 37.83 LowQual AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=9.81;MQ=46.57;MQ0=1;QD=1.08;SB=-27.83 GT:AD:DP:GL:GQ 0/1:27,8:18:-12.49,-5.42,-65.92:70.67
-chr1 2382567 . A G 10.80 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=573.70;QD=14.34;SB=-186.56 GT:AD:DP:GL:GQ 0/1:16,24:36:-71.50,-10.85,-55.65:99
-chr1 2390539 rs56368227 C T 147.22 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=58.63;MQ0=0;OQ=772.55;QD=15.15;SB=-231.31 GT:AD:DP:GL:GQ 0/1:25,25:47:-96.89,-16.35,-71.90:99
-chr1 2391510 rs942818 T C 169.46 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1503.43;QD=30.07;SB=-692.23 GT:AD:DP:GL:GQ 1/1:0,50:44:-153.95,-13.26,-0.02:99
-chr1 2393714 rs10910080 G A 120.05 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.52;MQ=58.38;MQ0=0;OQ=343.05;QD=13.19;SB=-140.60 GT:AD:DP:GL:GQ 0/1:13,13:24:-44.83,-7.24,-36.59:99
-chr1 2394116 rs2494626 C T 263.72 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.95;MQ0=0;OQ=492.85;QD=12.32;SB=-207.19 GT:AD:DP:GL:GQ 0/1:23,17:37:-63.72,-11.16,-67.50:99
-chr1 2398521 rs1536155 A G 7.46 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=2.26;MQ=58.44;MQ0=0;OQ=280.60;QD=10.39;SB=-38.80 GT:AD:DP:GL:GQ 0/1:14,13:25:-38.88,-7.54,-51.71:99
-chr1 2399136 rs12049628 A G 275.01 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=58.16;MQ0=0;OQ=457.42;QD=9.94;SB=-243.30 GT:AD:DP:GL:GQ 0/1:24,22:43:-61.98,-12.96,-96.02:99
-chr1 2399220 rs59417818 G A 58.40 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=60.00;MQ0=0;OQ=406.26;QD=15.63;SB=-103.61 GT:AD:DP:GL:GQ 0/1:12,13:24:-51.14,-7.23,-38.48:99
-chr1 2399752 rs12727342 A G 0.92 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=4.77;MQ=57.40;MQ0=0;OQ=225.70;QD=6.10;SB=-108.60 GT:AD:DP:GL:GQ 0/1:20,17:31:-35.20,-9.35,-75.95:99
-chr1 2399993 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.11;MQ=57.31;MQ0=0;OQ=125.38;QD=3.58;SB=53.21 GT:AD:DP:GL:GQ 0/1:25,10:27:-23.96,-8.14,-94.75:99
-chr1 2400649 rs11799501 C T 116.65 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.89;MQ=60.00;MQ0=0;OQ=748.36;QD=14.39;SB=-393.78 GT:AD:DP:GL:GQ 0/1:28,24:51:-93.50,-15.38,-86.98:99
-chr1 2401311 rs10797428 A G 76.46 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=59.53;MQ0=0;OQ=638.41;QD=15.96;SB=-314.23 GT:AD:DP:GL:GQ 0/1:15,25:38:-78.58,-11.46,-54.60:99
-chr1 2402139 rs4648638 A T 283.51 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.43;MQ0=0;OQ=382.69;QD=11.60;SB=-121.80 GT:AD:DP:GL:GQ 0/1:19,14:31:-50.89,-9.34,-63.99:99
-chr1 2403494 rs942817 G C 329.65 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.68;MQ0=0;OQ=865.92;QD=18.82;SB=-441.92 GT:AD:DP:GL:GQ 0/1:21,25:43:-102.83,-12.96,-79.86:99
-chr1 2404788 rs4995304 G A 54.16 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=55.45;MQ0=0;OQ=801.00;QD=19.54;SB=-282.18 GT:AD:DP:GL:GQ 0/1:16,24:39:-95.13,-11.75,-53.28:99
-chr1 2405062 . T G 6.04 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=55.86;MQ0=0;OQ=164.49;QD=7.15;SB=2.04 GT:AD:DP:GL:GQ 0/1:15,8:23:-26.66,-6.93,-55.71:99
-chr1 2405078 . C T 5.98 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=52.76;MQ0=0;OQ=151.99;QD=6.61;SB=-0.99 GT:AD:DP:GL:GQ 0/1:16,7:20:-24.51,-6.03,-50.27:99
-chr1 2405106 . G T 34.21 LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=4.38;MQ=49.04;MQ0=0;QD=1.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,5:14:-10.92,-4.22,-37.23:67.05
-chr1 2405179 . T G 0.09 PASS AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=3;HaplotypeScore=3.52;MQ=52.14;MQ0=0;OQ=147.78;QD=8.21;SB=-98.66 GT:AD:DP:GL:GQ 0/1:11,7:13:-21.98,-3.92,-24.09:99
-chr1 2405189 . T C 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=19;Dels=0.00;HRun=3;HaplotypeScore=5.56;MQ=47.05;MQ0=0;OQ=344.28;QD=18.12;SB=-173.40 GT:AD:DP:GL:GQ 1/1:0,19:11:-38.02,-3.32,-0.01:33.08
-chr1 2405210 . C A 0.76 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=2.86;MQ=39.01;MQ0=0;OQ=86.77;QD=6.20;SB=-60.75 GT:AD:DP:GL:GQ 0/1:10,4:8:-14.37,-2.41,-11.67:92.61
-chr1 2405220 . G C 0.99 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=39.01;MQ0=0;OQ=62.38;QD=4.46;SB=-40.43 GT:AD:DP:GL:GQ 0/1:10,4:7:-11.64,-2.12,-15.93:95.21
-chr1 2405254 . T C 25.50 LowQual AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=3;HaplotypeScore=1.85;MQ=37.93;MQ0=1;QD=3.64;SB=-6.99 GT:AD:DP:GL:GQ 0/1:3,4:4:-7.04,-1.21,-6.92:57.17
-chr1 2405275 . C A 10.07 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=32.15;MQ0=1;OQ=98.76;QD=10.97;SB=-39.94 GT:AD:DP:GL:GQ 1/1:5,4:4:-13.41,-1.21,-0.00:12.03
-chr1 2405285 . G C 5.32 PASS AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=37.51;MQ0=1;OQ=185.89;QD=12.39;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,7:7:-23.98,-2.11,-4.50:23.85
-chr1 2405307 . G C 0.94 PASS AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=44.11;MQ0=0;OQ=225.33;QD=17.33;SB=-6.99 GT:AD:DP:GL:GQ 0/1:5,8:9:-28.53,-2.71,-8.94:62.30
-chr1 2405357 rs61763948 T C 6.42 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.63;MQ0=0;OQ=296.15;QD=17.42;SB=-3.98 GT:AD:DP:GL:GQ 0/1:4,13:16:-37.72,-4.82,-15.46:99
-chr1 2406217 rs4648639 G A 225.22 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=51.38;MQ0=0;OQ=834.51;QD=18.14;SB=-265.24 GT:AD:DP:GL:GQ 0/1:20,26:45:-100.29,-13.55,-72.00:99
-chr1 2407818 rs4648640 G A 162.08 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=59.09;MQ0=0;OQ=709.86;QD=15.43;SB=-272.15 GT:AD:DP:GL:GQ 0/1:23,23:44:-87.53,-13.26,-76.87:99
-chr1 2408795 rs10910082 C T 122.37 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.49;MQ0=0;OQ=319.86;QD=7.11;SB=-107.45 GT:AD:DP:GL:GQ 0/1:33,12:44:-48.52,-13.25,-117.65:99
-chr1 2410450 rs10752744 T C 140.49 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=60.00;MQ0=0;OQ=499.26;QD=10.62;SB=-158.91 GT:AD:DP:GL:GQ 0/1:28,19:47:-67.37,-14.16,-113.54:99
-chr1 2410773 rs6668720 A G 120.35 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.84;MQ0=0;OQ=320.90;QD=8.02;SB=-52.83 GT:AD:DP:GL:GQ 0/1:24,16:36:-46.22,-10.85,-86.61:99
-chr1 2412474 rs2477699 G A 360.42 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=58.60;MQ0=0;OQ=676.25;QD=13.52;SB=-318.34 GT:AD:DP:GL:GQ 0/1:25,25:46:-84.77,-13.86,-87.14:99
-chr1 2413426 rs3001349 C G 122.02 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=59.07;MQ0=0;OQ=984.04;QD=19.68;SB=-507.27 GT:AD:DP:GL:GQ 0/1:22,28:50:-116.76,-15.07,-93.45:99
-chr1 2414277 rs2477701 T C 471.99 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1313.31;QD=32.03;SB=-482.12 GT:AD:DP:GL:GQ 1/1:0,41:41:-134.95,-12.36,-0.03:99
-chr1 2414754 rs2477702 T C 257.38 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=58.58;MQ0=0;OQ=407.32;QD=11.31;SB=-181.54 GT:AD:DP:GL:GQ 0/1:18,17:33:-53.96,-9.95,-62.99:99
-chr1 2415234 . G A 52.54 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.25;MQ0=0;OQ=558.86;QD=13.97;SB=-294.85 GT:AD:DP:GL:GQ 0/1:20,20:36:-70.03,-10.86,-54.36:99
-chr1 2415852 rs2477703 C T 47.65 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=7.69;MQ=58.80;MQ0=0;OQ=763.15;QD=13.16;SB=-352.50 GT:AD:DP:GL:GQ 0/1:34,24:57:-96.78,-17.18,-104.35:99
-chr1 2416626 rs3001347 A G 166.06 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=58.74;MQ0=0;OQ=303.26;QD=8.20;SB=-170.50 GT:AD:DP:GL:GQ 0/1:20,17:33:-43.56,-9.95,-71.18:99
-chr1 2417572 rs3762444 C T 276.23 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=447.88;QD=14.93;SB=-199.90 GT:AD:DP:GL:GQ 0/1:15,15:29:-56.82,-8.74,-44.39:99
-chr1 2418734 rs2477706 T C 40.91 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=58.67;MQ0=0;OQ=224.99;QD=6.43;SB=-131.52 GT:AD:DP:GL:GQ 0/1:20,15:30:-34.83,-9.05,-71.11:99
-chr1 2422191 rs4648641 C A 142.70 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=139.36;QD=6.33;SB=-88.78 GT:AD:DP:GL:GQ 0/1:13,9:20:-23.25,-6.03,-44.88:99
-chr1 2422622 rs4648642 G A 142.31 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=59.39;MQ0=0;OQ=411.20;QD=10.82;SB=-172.27 GT:AD:DP:GL:GQ 0/1:23,15:36:-55.26,-10.86,-70.83:99
-chr1 2422899 . G A 37.84 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=59.45;MQ0=0;OQ=458.87;QD=13.50;SB=-199.87 GT:AD:DP:GL:GQ 0/1:18,16:31:-58.52,-9.34,-51.58:99
-chr1 2423328 . G A 53.96 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=296.62;QD=12.90;SB=-35.64 GT:AD:DP:GL:GQ 0/1:13,10:22:-39.58,-6.63,-40.93:99
-chr1 2423754 rs55874156 G A 35.47 LowQual AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=5.91;SB=-7.00 GT:AD:DP:GL:GQ 0/1:3,3:5:-8.34,-1.51,-8.96:68.30
-chr1 2423760 rs12736998 C T 230.21 PASS AC=1;AF=0.50;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=70.89;QD=11.81;SB=-46.66 GT:AD:DP:GL:GQ 0/1:3,3:6:-12.18,-1.81,-9.71:78.98
-chr1 2424604 rs3814298 C T 190.56 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=60.00;MQ0=0;OQ=798.59;QD=18.57;SB=-384.92 GT:AD:DP:GL:GQ 0/1:19,24:41:-95.50,-12.36,-53.02:99
-chr1 2428628 rs12725663 C T 86.80 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=59.46;MQ0=0;OQ=892.70;QD=20.76;SB=-466.01 GT:AD:DP:GL:GQ 0/1:16,27:41:-104.92,-12.36,-47.45:99
-chr1 2429459 rs2494621 C A 2.75 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=3;HaplotypeScore=1.26;MQ=59.48;MQ0=0;OQ=889.11;QD=20.21;SB=-361.22 GT:AD:DP:GL:GQ 0/1:15,29:43:-105.15,-12.95,-49.46:99
-chr1 2429541 rs4648559 C T 370.29 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=862.47;QD=17.60;SB=-340.86 GT:AD:DP:GL:GQ 0/1:22,27:49:-104.31,-14.78,-68.65:99
-chr1 2429545 rs3791180 G C 362.92 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=669.25;QD=13.12;SB=-329.42 GT:AD:DP:GL:GQ 0/1:24,27:45:-83.79,-13.58,-96.76:99
-chr1 2434274 rs7535528 G A 398.69 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=57.41;MQ0=0;OQ=974.09;QD=16.23;SB=-447.47 GT:AD:DP:GL:GQ 0/1:29,31:55:-117.28,-16.58,-80.59:99
-chr1 2440170 rs56168662 G C 440.84 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=641.06;QD=13.94;SB=-291.00 GT:AD:DP:GL:GQ 0/1:24,22:44:-80.67,-13.28,-95.39:99
-chr1 2442429 rs2985862 T C 118.89 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=58.11;MQ0=0;OQ=446.59;QD=12.07;SB=-57.29 GT:AD:DP:GL:GQ 0/1:20,17:36:-58.79,-10.85,-82.58:99
-chr1 2442985 . C G 26.50 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=2.73;MQ=57.66;MQ0=0;QD=0.66;SB=53.21 GT:AD:DP:GL:GQ 0/1:27,13:28:-14.38,-8.45,-107.19:59.33
-chr1 2443996 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=42.41;MQ=51.42;MQ0=0;OQ=532.54;QD=4.29;SB=-103.57 GT:AD:DP:GL:GQ 0/1:93,31:115:-91.18,-34.64,-325.86:99
-chr1 2444008 rs12757829 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=24.89;MQ=51.04;MQ0=0;OQ=890.38;QD=6.31;SB=-413.05 GT:AD:DP:GL:GQ 0/1:89,52:127:-130.59,-38.27,-352.78:99
-chr1 2444025 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=0;HaplotypeScore=101.62;MQ=51.11;MQ0=0;OQ=575.04;QD=3.76;SB=-161.02 GT:AD:DP:GL:GQ 0/1:119,34:145:-104.47,-43.68,-467.68:99
-chr1 2444046 rs11582708 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.00;HRun=3;HaplotypeScore=36.45;MQ=48.57;MQ0=0;OQ=119.48;QD=0.71;SB=230.81 GT:AD:DP:GL:GQ 0/1:152,17:154:-61.64,-46.41,-606.32:99
-chr1 2444064 rs11583446 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=165;Dels=0.00;HRun=0;HaplotypeScore=21.72;MQ=47.52;MQ0=0;OQ=2894.91;QD=17.54;SB=-1278.77 GT:AD:DP:GL:GQ 0/1:56,109:148:-337.38,-44.60,-196.45:99
-chr1 2444078 rs2494629 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=179;Dels=0.00;HRun=0;HaplotypeScore=85.91;MQ=46.23;MQ0=1;OQ=3166.59;QD=17.69;SB=-903.91 GT:AD:DP:GL:GQ 0/1:79,100:143:-363.06,-43.11,-245.67:99
-chr1 2444084 rs11583448 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=183;Dels=0.00;HRun=0;HaplotypeScore=146.19;MQ=45.66;MQ0=1;OQ=1337.56;QD=7.31;SB=32.08 GT:AD:DP:GL:GQ 0/1:128,54:167:-187.36,-50.32,-447.47:99
-chr1 2444090 rs11582711 C T 0.69 PASS AC=1;AF=0.50;AN=2;DB;DP=184;Dels=0.00;HRun=1;HaplotypeScore=9.96;MQ=45.23;MQ0=1;OQ=1767.35;QD=9.61;SB=-110.22 GT:AD:DP:GL:GQ 0/1:119,64:165:-229.73,-49.72,-378.76:99
-chr1 2444114 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=1;HaplotypeScore=224.24;MQ=44.82;MQ0=1;OQ=1189.56;QD=7.12;SB=-484.53 GT:AD:DP:GL:GQ 0/1:105,62:153:-168.35,-46.11,-399.99:99
-chr1 2444123 rs60947977 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.00;HRun=1;HaplotypeScore=187.19;MQ=44.56;MQ0=1;OQ=222.03;QD=1.35;SB=140.46 GT:AD:DP:GL:GQ 0/1:146,18:145:-69.17,-43.68,-451.95:99
-chr1 2444144 rs12735280 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=41.21;MQ=45.78;MQ0=2;OQ=126.97;QD=0.80;SB=158.55 GT:AD:DP:GL:GQ 0/1:146,13:126:-53.98,-38.00,-474.20:99
-chr1 2444156 rs61763952 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=1;HaplotypeScore=50.63;MQ=44.65;MQ0=2;OQ=841.78;QD=5.89;SB=-177.38 GT:AD:DP:GL:GQ 0/1:107,36:119:-123.33,-35.87,-307.59:99
-chr1 2444175 . A G 1992.57 SnpCluster AC=1;AF=0.50;AN=2;DP=119;Dels=0.00;HRun=1;HaplotypeScore=57.72;MQ=43.73;MQ0=1;QD=16.74;SB=-969.28 GT:AD:DP:GL:GQ 0/1:46,73:107:-234.78,-32.23,-167.74:99
-chr1 2444179 . C T 733.69 SnpCluster AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=1;HaplotypeScore=94.68;MQ=43.15;MQ0=1;QD=6.79;SB=-249.70 GT:AD:DP:GL:GQ 0/1:79,29:94:-104.98,-28.32,-236.84:99
-chr1 2444180 . T C 74.50 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=102.88;MQ=43.30;MQ0=1;QD=0.72;SB=40.74 GT:AD:DP:GL:GQ 0/1:89,15:92:-38.46,-27.73,-318.94:99
-chr1 2444188 . C T 230.63 SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=69.58;MQ=42.94;MQ0=1;QD=2.33;SB=-68.96 GT:AD:DP:GL:GQ 0/1:80,18:83:-51.35,-25.01,-254.74:99
-chr1 2444203 rs12723596 A G 0.31 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=13.04;MQ=41.89;MQ0=1;OQ=932.46;QD=10.25;SB=-166.34 GT:AD:DP:GL:GQ 0/1:48,43:72:-118.23,-21.70,-146.57:99
-chr1 2444214 . T G 33.51 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=90.11;MQ=41.94;MQ0=0;QD=0.39;SB=20.19 GT:AD:DP:GL:GQ 0/1:75,10:71:-28.02,-21.39,-222.83:66.35
-chr1 2444236 rs3001351 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=1;HaplotypeScore=44.56;MQ=42.21;MQ0=1;OQ=1478.32;QD=13.82;SB=-341.03 GT:AD:DP:GL:GQ 0/1:32,75:79:-174.93,-23.81,-103.79:99
-chr1 2444239 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=57.18;MQ=42.22;MQ0=1;OQ=253.01;QD=2.32;SB=-45.72 GT:AD:DP:GL:GQ 0/1:94,15:81:-52.98,-24.40,-242.61:99
-chr1 2444569 rs2494625 T C 30.67 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.30;MQ0=0;OQ=234.27;QD=7.10;SB=-122.64 GT:AD:DP:GL:GQ 0/1:20,13:30:-35.75,-9.04,-76.61:99
-chr1 2445722 rs12131236 C T 283.83 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=971.15;QD=13.87;SB=-406.34 GT:AD:DP:GL:GQ 0/1:39,31:69:-121.19,-20.79,-133.37:99
-chr1 2446063 rs3122922 A G 422.66 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.95;MQ0=0;OQ=840.10;QD=14.48;SB=-338.93 GT:AD:DP:GL:GQ 0/1:28,30:57:-104.46,-17.17,-113.53:99
-chr1 2452678 rs2494603 T C 117.86 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.28;MQ0=0;OQ=471.49;QD=14.73;SB=-130.66 GT:AD:DP:GL:GQ 0/1:12,20:28:-58.88,-8.44,-38.02:99
-chr1 2452695 rs10910087 A G 48.63 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=58.97;MQ0=0;OQ=650.54;QD=14.46;SB=-235.28 GT:AD:DP:GL:GQ 0/1:22,23:45:-81.90,-13.56,-89.06:99
-chr1 2453274 rs11583602 G A 37.53 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=1048.89;QD=19.42;SB=-532.12 GT:AD:DP:GL:GQ 0/1:23,31:52:-123.83,-15.66,-80.52:99
-chr1 2453609 rs4648645 G T 421.56 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=634.41;QD=13.22;SB=-255.25 GT:AD:DP:GL:GQ 0/1:25,23:48:-81.19,-14.46,-89.13:99
-chr1 2453905 rs6694195 G A 6.21 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=641.00;QD=22.10;SB=-187.27 GT:AD:DP:GL:GQ 0/1:9,20:26:-75.22,-7.83,-25.34:99
-chr1 2454427 rs12406506 G T 168.99 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.39;MQ0=0;OQ=384.63;QD=10.12;SB=-161.15 GT:AD:DP:GL:GQ 0/1:22,16:36:-52.59,-10.85,-75.30:99
-chr1 2454955 rs11585747 C T 158.41 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.68;MQ0=0;OQ=442.85;QD=9.63;SB=-209.92 GT:AD:DP:GL:GQ 0/1:30,16:43:-60.53,-12.97,-87.57:99
-chr1 2455004 rs9803764 C T 21.92 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=718.09;QD=21.76;SB=-255.79 GT:AD:DP:GL:GQ 0/1:12,21:31:-84.43,-9.34,-35.39:99
-chr1 2455189 rs11584295 G A 326.39 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.30;MQ0=0;OQ=897.10;QD=14.95;SB=-369.89 GT:AD:DP:GL:GQ 0/1:30,30:57:-110.18,-17.19,-92.60:99
-chr1 2455531 rs4648561 T C 59.57 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.71;MQ=60.00;MQ0=0;OQ=506.09;QD=9.04;SB=-221.92 GT:AD:DP:GL:GQ 0/1:28,28:51:-69.27,-15.38,-110.78:99
-chr1 2455652 rs3001339 C T 0.17 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=3.44;MQ=59.16;MQ0=0;OQ=1028.71;QD=18.70;SB=-294.19 GT:AD:DP:GL:GQ 0/1:22,32:53:-122.12,-15.97,-77.91:99
-chr1 2455772 rs6661956 C T 143.28 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=537.50;QD=14.93;SB=-189.16 GT:AD:DP:GL:GQ 0/1:19,17:35:-67.58,-10.55,-58.49:99
-chr1 2455810 rs2494605 A G 6.95 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=3.59;MQ=59.41;MQ0=0;OQ=1343.57;QD=34.45;SB=-641.25 GT:AD:DP:GL:GQ 1/1:0,39:38:-137.96,-11.45,-0.01:99
-chr1 2456285 rs2985860 T G 0.20 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=9.84;MQ=58.13;MQ0=0;OQ=394.22;QD=7.88;SB=-79.96 GT:AD:DP:GL:GQ 0/1:20,30:34:-52.96,-10.25,-63.38:99
-chr1 2456493 rs2494606 A G 522.55 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1382.51;QD=30.72;SB=-394.30 GT:AD:DP:GL:GQ 1/1:0,45:44:-141.87,-13.27,-0.04:99
-chr1 2460535 . T C 626.63 Indel AC=1;AF=0.50;AN=2;DP=47;Dels=0.04;HRun=0;HaplotypeScore=9.81;MQ=45.54;MQ0=0;QD=13.33;SB=-234.30 GT:AD:DP:GL:GQ 0/1:22,23:45:-78.90,-12.95,-84.01:99
-chr1 2460708 rs12042279 G A 153.95 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=58.99;MQ0=0;OQ=696.74;QD=15.15;SB=-237.53 GT:AD:DP:GL:GQ 0/1:24,22:46:-86.83,-13.87,-76.84:99
-chr1 2461941 rs1886731 T C 87.33 PASS AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=203.62;QD=14.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,9:14:-27.87,-4.22,-19.55:99
-chr1 2462004 rs4487972 G C 44.05 PASS AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=56.62;MQ0=0;OQ=71.85;QD=10.26;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,4:6:-12.28,-1.81,-12.84:99
-chr1 2464065 rs942824 T C 72.36 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.36;MQ0=0;OQ=370.87;QD=10.30;SB=-61.73 GT:AD:DP:GL:GQ 0/1:20,16:34:-50.61,-10.24,-77.88:99
-chr1 2465072 rs10797429 G C 201.07 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=57.71;MQ0=0;OQ=487.96;QD=13.19;SB=-257.25 GT:AD:DP:GL:GQ 0/1:21,16:34:-62.33,-10.25,-80.32:99
-chr1 2465334 rs55929178 C T 11.28 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.63;MQ=56.91;MQ0=0;OQ=721.66;QD=14.73;SB=-233.74 GT:AD:DP:GL:GQ 0/1:26,23:43:-88.40,-12.95,-74.05:99
-chr1 2467218 rs12097268 T A 23.21 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=190.70;QD=11.22;SB=-35.94 GT:AD:DP:GL:GQ 0/1:9,8:17:-27.48,-5.13,-30.96:99
-chr1 2468371 rs2477678 T A 119.20 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=60.00;MQ0=0;OQ=463.47;QD=13.24;SB=-147.88 GT:AD:DP:GL:GQ 0/1:17,17:32:-59.27,-9.64,-59.80:99
-chr1 2469843 rs1974044 A G 45.39 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.40;MQ=59.34;MQ0=0;OQ=371.34;QD=10.61;SB=-193.60 GT:AD:DP:GL:GQ 0/1:21,14:32:-50.06,-9.64,-71.49:99
-chr1 2471303 . C T 62.24 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=41.42;MQ0=6;OQ=776.47;QD=14.38;SB=-282.22 GT:AD:DP:GL:GQ 0/1:29,25:42:-93.59,-12.66,-60.88:99
-chr1 2472781 rs2147905 T C 210.38 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=57.08;MQ0=0;OQ=779.17;QD=15.90;SB=-258.93 GT:AD:DP:GL:GQ 0/1:21,26:47:-95.36,-14.16,-80.25:99
-chr1 2473130 rs3748825 T C 24.77 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=50.53;MQ0=0;OQ=489.49;QD=14.40;SB=-174.97 GT:AD:DP:GL:GQ 0/1:17,17:34:-62.48,-10.24,-67.15:99
-chr1 2473158 rs2985858 C G 170.01 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=52.63;MQ0=0;OQ=759.64;QD=17.67;SB=-375.14 GT:AD:DP:GL:GQ 0/1:22,21:42:-91.90,-12.65,-91.93:99
-chr1 2474608 rs4449972 T C 1.07 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=17.16;MQ0=14;OQ=59.70;QD=2.60;SB=-42.68 GT:AD:DP:GL:GQ 0/1:13,10:7:-11.36,-2.11,-16.47:92.53
-chr1 2474629 rs2764846 G T 13.02 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=13.44;MQ0=12;OQ=72.28;QD=4.25;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,10:3:-10.72,-0.90,-0.00:9.03
-chr1 2474959 rs10910088 A G 3.08 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=22.58;MQ0=15;OQ=106.75;QD=3.44;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,14:12:-17.58,-3.63,-21.51:99
-chr1 2475164 rs2182176 C T 397.56 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=48.51;MQ0=0;OQ=552.02;QD=13.14;SB=-223.69 GT:AD:DP:GL:GQ 0/1:24,18:39:-70.24,-11.76,-69.97:99
-chr1 2475556 rs1555791 C G 11.33 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=2.88;MQ=58.58;MQ0=0;OQ=550.02;QD=11.96;SB=-241.08 GT:AD:DP:GL:GQ 0/1:27,19:40:-70.37,-12.08,-87.80:99
-chr1 2475800 rs10910089 C A 3.66 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=9.04;MQ=58.28;MQ0=0;OQ=671.47;QD=13.70;SB=-238.39 GT:AD:DP:GL:GQ 0/1:23,26:46:-84.29,-13.86,-77.00:99
-chr1 2476366 rs61054170 G A 7.02 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=6.03;MQ=57.64;MQ0=0;OQ=224.60;QD=8.64;SB=-97.61 GT:AD:DP:GL:GQ 0/1:16,10:23:-32.68,-6.93,-48.70:99
-chr1 2476391 rs2495365 T C 262.15 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=56.62;MQ0=0;OQ=373.37;QD=12.04;SB=-190.59 GT:AD:DP:GL:GQ 0/1:16,15:29:-49.36,-8.74,-57.56:99
-chr1 2476740 rs11577783 T C 207.60 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=58.69;MQ0=0;OQ=459.72;QD=9.19;SB=-194.29 GT:AD:DP:GL:GQ 0/1:30,20:49:-64.03,-14.78,-111.22:99
-chr1 2476777 rs7550231 C T 162.70 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.21;MQ0=0;OQ=483.70;QD=13.44;SB=-69.05 GT:AD:DP:GL:GQ 0/1:20,15:32:-61.30,-9.65,-52.93:99
-chr1 2477765 rs7515633 T C 23.90 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=58.71;MQ0=0;OQ=253.35;QD=14.07;SB=-51.83 GT:AD:DP:GL:GQ 0/1:8,10:18:-34.04,-5.43,-30.81:99
-chr1 2477769 rs7544646 G C 297.66 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=6.07;MQ=56.04;MQ0=0;QD=16.54;SB=-32.86 GT:AD:DP:GL:GQ 0/1:9,9:14:-37.27,-4.22,-20.23:99
-chr1 2477776 . G C 10.29 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=1;HaplotypeScore=18.19;MQ=56.92;MQ0=0;QD=0.45;SB=20.10 GT:AD:DP:GL:GQ 0/1:13,10:13:-8.19,-3.92,-49.87:42.70
-chr1 2477778 . A C 172 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=2;HaplotypeScore=22.60;MQ=57.66;MQ0=0;QD=5.73;SB=23.08 GT:AD:DP:GL:GQ 0/1:12,18:21:-26.81,-6.33,-40.53:99
-chr1 2477836 rs2843396 C G 11.98 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=59.36;MQ0=0;OQ=1290.53;QD=35.85;SB=-556.54 GT:AD:DP:GL:GQ 1/1:0,36:34:-132.68,-10.27,-0.04:99
-chr1 2478204 rs10910090 G A 182.29 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.53;MQ0=0;OQ=449.68;QD=11.24;SB=-202.69 GT:AD:DP:GL:GQ 0/1:23,17:38:-59.71,-11.46,-71.62:99
-chr1 2479633 rs8725 C T 49.19 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.46;MQ=59.51;MQ0=0;OQ=577.64;QD=12.29;SB=-219.70 GT:AD:DP:GL:GQ 0/1:27,20:42:-73.71,-12.66,-80.51:99
-chr1 2480088 rs2234167 C T 215.09 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=60.00;MQ0=0;OQ=519.75;QD=13.33;SB=-131.13 GT:AD:DP:GL:GQ 0/1:22,17:38:-66.72,-11.46,-63.96:99
-chr1 2481753 rs11573988 C A 159.02 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.54;MQ0=0;OQ=542.33;QD=13.23;SB=-158.65 GT:AD:DP:GL:GQ 0/1:20,21:37:-68.66,-11.14,-62.61:99
-chr1 2483213 rs2234161 G A 326.82 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.71;MQ0=0;OQ=435.68;QD=12.10;SB=-173.67 GT:AD:DP:GL:GQ 0/1:20,16:32:-56.50,-9.65,-56.89:99
-chr1 2483476 rs2281852 G T 352.55 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.50;MQ0=0;OQ=604.05;QD=13.13;SB=-299.46 GT:AD:DP:GL:GQ 0/1:23,23:43:-76.65,-12.96,-66.34:99
-chr1 2483520 rs2257763 G T 186.21 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.87;MQ=58.41;MQ0=0;OQ=599.64;QD=13.63;SB=-190.60 GT:AD:DP:GL:GQ 0/1:21,23:41:-75.60,-12.36,-64.98:99
-chr1 2485488 rs2495366 C T 214.98 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.54;MQ0=0;OQ=410.34;QD=10.01;SB=-177.87 GT:AD:DP:GL:GQ 0/1:24,17:33:-54.27,-9.95,-57.69:99
-chr1 2485810 rs1886730 A G 395.82 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=201.47;QD=10.07;SB=-95.61 GT:AD:DP:GL:GQ 0/1:11,9:20:-29.46,-6.03,-42.35:99
-chr1 2486265 rs4870 T C 17.43 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=53.94;MQ0=0;OQ=133.00;QD=5.54;SB=-10.85 GT:AD:DP:GL:GQ 0/1:16,8:22:-23.21,-6.63,-59.96:99
-chr1 2486652 rs2227313 A G 323.64 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=361.41;QD=9.04;SB=-171.95 GT:AD:DP:GL:GQ 0/1:24,16:39:-51.18,-11.76,-90.45:99
-chr1 2486755 rs2227312 G T 192.71 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.51;MQ0=0;OQ=435.37;QD=11.46;SB=-199.58 GT:AD:DP:GL:GQ 0/1:21,17:35:-57.36,-10.54,-70.01:99
-chr1 2489670 rs4449972 A G 6.05 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=14.84;MQ0=21;OQ=104.96;QD=3.09;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,15:5:-15.28,-1.51,-4.27:27.62
-chr1 2489758 rs4385650 G C 16.53 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=2.00;MQ=35.98;MQ0=1;OQ=450.14;QD=15.00;SB=-208.64 GT:AD:DP:GL:GQ 0/1:17,13:27:-56.44,-8.15,-54.66:99
-chr1 2490753 rs4648647 G A 26.84 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.33;MQ=50.09;MQ0=0;OQ=371.65;QD=10.04;SB=-147.20 GT:AD:DP:GL:GQ 0/1:24,13:35:-51.00,-10.56,-68.63:99
-chr1 2490924 . G A 58.67 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=40.19;MQ0=3;OQ=773.22;QD=14.59;SB=-281.28 GT:AD:DP:GL:GQ 0/1:27,26:42:-93.26,-12.65,-67.56:99
-chr1 2491198 rs10797432 C T 12.45 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=7.73;MQ=51.44;MQ0=1;OQ=449.43;QD=8.48;SB=-221.51 GT:AD:DP:GL:GQ 0/1:35,17:47:-62.39,-14.17,-101.99:99
-chr1 2491376 rs10910092 A G 353.95 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.86;MQ0=0;OQ=953.50;QD=15.89;SB=-479.29 GT:AD:DP:GL:GQ 0/1:27,33:59:-116.41,-17.77,-105.03:99
-chr1 2491870 rs10797433 T C 399.98 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.09;MQ0=0;OQ=643.74;QD=13.99;SB=-281.26 GT:AD:DP:GL:GQ 0/1:20,26:45:-81.22,-13.56,-79.26:99
-chr1 2492640 rs6667605 C T 284.33 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1076.76;QD=20.32;SB=-511.53 GT:AD:DP:GL:GQ 0/1:22,31:53:-126.92,-15.96,-81.92:99
-chr1 2492694 rs6672381 A G 59.10 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=2.96;MQ=59.67;MQ0=0;OQ=836.72;QD=14.68;SB=-261.21 GT:AD:DP:GL:GQ 0/1:25,31:56:-103.83,-16.88,-100.88:99
-chr1 2493042 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=3;HaplotypeScore=24.29;MQ=58.55;MQ0=0;OQ=229.07;QD=5.45;SB=41.17 GT:AD:DP:GL:GQ 0/1:24,18:31:-35.54,-9.35,-97.62:99
-chr1 2494094 rs6671426 C A 112.49 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=782.65;QD=13.98;SB=-297.63 GT:AD:DP:GL:GQ 0/1:30,26:56:-98.41,-16.86,-108.17:99
-chr1 2494223 rs28734787 T C 285.54 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.94;MQ=59.74;MQ0=0;OQ=1016.84;QD=14.32;SB=-488.08 GT:AD:DP:GL:GQ 0/1:37,34:71:-126.35,-21.38,-153.97:99
-chr1 2495573 rs10910093 C T 602.04 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1162.34;QD=15.92;SB=-466.49 GT:AD:DP:GL:GQ 0/1:38,35:73:-141.53,-22.01,-121.32:99
-chr1 2496089 rs55658746 T C 89.31 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=57.64;MQ0=0;OQ=790.54;QD=12.35;SB=-411.26 GT:AD:DP:GL:GQ 0/1:36,28:63:-101.32,-18.98,-139.07:99
-chr1 2496219 rs2477685 G T 165.82 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=55.91;MQ0=0;OQ=1646.89;QD=32.29;SB=-779.73 GT:AD:DP:GL:GQ 1/1:1,50:48:-168.30,-14.46,-0.02:99
-chr1 2496348 rs10910094 C T 138.18 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=47.91;MQ0=1;OQ=444.30;QD=9.66;SB=-141.63 GT:AD:DP:GL:GQ 0/1:26,19:40:-59.77,-12.06,-79.45:99
-chr1 2497303 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=4;HaplotypeScore=6.77;MQ=59.20;MQ0=0;OQ=63.06;QD=2.17;SB=17.06 GT:AD:DP:GL:GQ 0/1:13,16:15:-14.11,-4.52,-33.25:95.89
-chr1 2497798 rs10752745 A G 23.19 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=2.74;MQ=53.22;MQ0=0;OQ=566.34;QD=12.59;SB=-208.51 GT:AD:DP:GL:GQ 0/1:24,21:42:-72.57,-12.65,-89.49:99
-chr1 2498203 rs6675676 G C 138.01 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=30.17;MQ0=2;OQ=540.65;QD=15.02;SB=-227.70 GT:AD:DP:GL:GQ 0/1:18,18:32:-67.01,-9.66,-62.30:99
-chr1 2500615 rs10910095 G A 293.14 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.83;MQ0=0;OQ=619.40;QD=15.49;SB=-326.87 GT:AD:DP:GL:GQ 0/1:18,21:35:-75.77,-10.55,-51.15:99
-chr1 2501140 rs10797434 C T 359.97 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=59.72;MQ0=0;OQ=1006.21;QD=15.25;SB=-442.36 GT:AD:DP:GL:GQ 0/1:35,31:65:-123.49,-19.58,-121.16:99
-chr1 2501248 rs12129508 G A 509.24 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1099.72;QD=18.33;SB=-426.78 GT:AD:DP:GL:GQ 0/1:28,32:59:-131.03,-17.77,-95.59:99
-chr1 2502312 rs4648648 G A 10.75 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.67;MQ=56.86;MQ0=0;OQ=538.80;QD=17.96;SB=-254.77 GT:AD:DP:GL:GQ 0/1:13,17:27:-65.30,-8.13,-39.62:99
-chr1 2502510 rs4648649 T C 255.66 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.39;MQ0=0;OQ=590.46;QD=13.42;SB=-228.32 GT:AD:DP:GL:GQ 0/1:17,27:40:-74.40,-12.07,-60.31:99
-chr1 2502570 rs10910096 T C 112.48 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.22;MQ0=0;OQ=671.99;QD=19.20;SB=-218.66 GT:AD:DP:GL:GQ 0/1:13,22:35:-81.03,-10.54,-52.21:99
-chr1 2502755 . G A 190.59 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=20;HaplotypeScore=16.86;MQ=48.05;MQ0=1;QD=2.32;SB=89.22 GT:AD:DP:GL:GQ 0/1:62,20:60:-40.44,-18.10,-157.12:99
-chr1 2502759 . G A 95.63 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=4;HaplotypeScore=8.02;MQ=49.03;MQ0=1;QD=1.15;SB=92.21 GT:AD:DP:GL:GQ 0/1:62,21:60:-30.94,-18.09,-170.87:99
-chr1 2502764 . G A 61.94 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=4;HaplotypeScore=11.73;MQ=52.06;MQ0=1;QD=0.77;SB=101.27 GT:AD:DP:GL:GQ 0/1:64,16:66:-29.37,-19.89,-196.86:94.78
-chr1 2502769 . G A 36.83 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=4;HaplotypeScore=29.21;MQ=54.00;MQ0=1;QD=0.49;SB=101.32 GT:AD:DP:GL:GQ 0/1:66,9:67:-27.16,-20.19,-206.36:69.66
-chr1 2502915 rs4486391 A T 575.38 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=706.11;QD=12.61;SB=-348.36 GT:AD:DP:GL:GQ 0/1:31,25:55:-90.46,-16.56,-121.47:99
-chr1 2502965 rs735000 C T 134.95 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.41;MQ0=0;OQ=774.05;QD=19.85;SB=-347.38 GT:AD:DP:GL:GQ 0/1:16,23:37:-91.84,-11.15,-44.36:99
-chr1 2503076 rs734999 C T 284.99 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=51.96;MQ0=0;OQ=837.38;QD=13.51;SB=-164.65 GT:AD:DP:GL:GQ 0/1:35,27:61:-105.40,-18.37,-127.82:99
-chr1 2503492 rs2016175 C G 123.40 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=50.82;MQ0=0;OQ=1084.11;QD=19.71;SB=-398.00 GT:AD:DP:GL:GQ 0/1:24,31:54:-127.97,-16.28,-102.13:99
-chr1 2503538 rs2016366 A T 76.85 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=3.79;MQ=51.20;MQ0=0;OQ=1061.50;QD=16.33;SB=-509.95 GT:AD:DP:GL:GQ 0/1:31,34:63:-128.41,-18.98,-104.88:99
-chr1 2504435 rs2094074 C T 20.77 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=6.13;MQ=59.30;MQ0=0;OQ=1039.69;QD=17.04;SB=-426.84 GT:AD:DP:GL:GQ 0/1:29,32:61:-125.64,-18.39,-96.67:99
-chr1 2506299 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=15.52;MQ=57.83;MQ0=0;OQ=93.19;QD=2.39;SB=56.19 GT:AD:DP:GL:GQ 0/1:27,12:31:-21.95,-9.34,-90.63:99
-chr1 2511290 rs10910097 C T 251.37 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.70;MQ0=0;OQ=1148.10;QD=18.52;SB=-511.69 GT:AD:DP:GL:GQ 0/1:27,35:61:-136.47,-18.38,-99.00:99
-chr1 2512252 rs2296443 G A 195.68 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.53;MQ0=0;OQ=544.43;QD=13.61;SB=-235.74 GT:AD:DP:GL:GQ 0/1:18,22:33:-67.68,-9.95,-51.18:99
-chr1 2515036 . A C 42.97 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.51;MQ0=0;OQ=337.76;QD=7.68;SB=-183.81 GT:AD:DP:GL:GQ 0/1:27,17:42:-49.72,-12.66,-93.24:99
-chr1 2517538 rs2260976 A G 4.94 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.14;MQ=56.76;MQ0=0;OQ=1272.91;QD=31.05;SB=-372.36 GT:AD:DP:GL:GQ 1/1:0,41:39:-130.90,-11.76,-0.03:99
-chr1 2517993 rs2843401 T C 105.48 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=57.77;MQ0=0;OQ=962.33;QD=26.73;SB=-342.23 GT:AD:DP:GL:GQ 1/1:0,36:31:-99.85,-9.36,-0.04:93.19
-chr1 2518542 rs2843402 T C 221.44 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=60.00;MQ0=0;OQ=1968.59;QD=35.79;SB=-942.98 GT:AD:DP:GL:GQ 1/1:0,55:55:-200.46,-16.56,-0.01:99
-chr1 2518859 rs2764845 G T 123.68 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=60.00;MQ0=0;OQ=1822.58;QD=33.75;SB=-893.66 GT:AD:DP:GL:GQ 1/1:0,54:52:-185.86,-15.67,-0.02:99
-chr1 2518957 rs2843403 T C 21.95 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=1.02;MQ=56.17;MQ0=0;OQ=926.62;QD=29.89;SB=-317.56 GT:AD:DP:GL:GQ 1/1:0,31:28:-96.27,-8.44,-0.02:84.21
-chr1 2519052 rs2764842 A G 76.78 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1201.00;QD=30.79;SB=-460.21 GT:AD:DP:GL:GQ 1/1:0,39:38:-123.72,-11.46,-0.03:99
-chr1 2519220 rs2764841 G A 268.55 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=59.01;MQ0=0;OQ=1602.47;QD=34.10;SB=-756.02 GT:AD:DP:GL:GQ 1/1:0,46:43:-163.85,-12.96,-0.02:99
-chr1 2519297 rs2764840 C T 22.50 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=57.55;MQ0=0;OQ=1701.90;QD=37.00;SB=-691.34 GT:AD:DP:GL:GQ 1/1:0,46:43:-173.78,-12.95,-0.01:99
-chr1 2520418 rs2843404 T C 200.03 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.75;MQ0=0;OQ=2535.27;QD=33.80;SB=-857.06 GT:AD:DP:GL:GQ 1/1:0,75:73:-257.13,-21.99,-0.02:99
-chr1 2520554 rs2764848 G A 508.37 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2620.71;QD=40.32;SB=-1288.71 GT:AD:DP:GL:GQ 1/1:0,65:65:-265.67,-19.58,-0.01:99
-chr1 2521232 rs2985855 A C 625.35 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.53;MQ0=0;OQ=2344.13;QD=34.47;SB=-1125.14 GT:AD:DP:GL:GQ 1/1:0,68:67:-238.02,-20.18,-0.02:99
-chr1 2521327 rs6689711 T C 152.61 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.71;MQ0=0;OQ=2140.18;QD=32.93;SB=-405.31 GT:AD:DP:GL:GQ 1/1:0,65:64:-217.64,-19.29,-0.04:99
-chr1 2521365 rs6681973 C T 205.20 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1951.81;QD=38.27;SB=-716.95 GT:AD:DP:GL:GQ 1/1:0,51:50:-198.79,-15.07,-0.02:99
-chr1 2521374 rs6682043 C A 555.65 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1757.71;QD=35.87;SB=-715.96 GT:AD:DP:GL:GQ 1/1:0,49:49:-179.37,-14.76,-0.01:99
-chr1 2521839 . A G 1244.02 Indel AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.74;MQ0=0;QD=31.90;SB=-233.75 GT:AD:DP:GL:GQ 1/1:1,38:37:-132.07,-11.15,-4.08:70.65
-chr1 2522276 rs2985859 T C 630.86 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.35;MQ0=0;OQ=2205.91;QD=35.58;SB=-1051.93 GT:AD:DP:GL:GQ 1/1:0,62:62:-224.19,-18.67,-0.02:99
-chr1 2522366 rs3001837 G A 528.70 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.76;MQ0=0;OQ=2660.16;QD=39.12;SB=-1251.03 GT:AD:DP:GL:GQ 1/1:0,68:68:-269.62,-20.49,-0.02:99
-chr1 2522484 rs2985857 C T 472.23 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=3579.52;QD=41.62;SB=-1476.96 GT:AD:DP:GL:GQ 1/1:0,86:86:-356.95,-25.90,-0.02:99
-chr1 2522759 rs6424092 C A 529.01 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2798.98;QD=36.83;SB=-1322.91 GT:AD:DP:GL:GQ 1/1:0,76:75:-283.50,-22.58,-0.01:99
-chr1 2523213 . A C 18.95 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=2;HaplotypeScore=7.65;MQ=59.48;MQ0=0;QD=0.43;SB=47.15 GT:AD:DP:GL:GQ 0/1:27,17:32:-14.82,-9.65,-87.52:51.73
-chr1 2530333 . T C 29.61 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=7.38;MQ=54.61;MQ0=1;QD=0.64;SB=33.57 GT:AD:DP:GL:GQ 0/1:37,5:39:-21.30,-15.06,-133.42:62.44
-chr1 2530381 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=20.91;MQ=54.33;MQ0=2;OQ=131.02;QD=2.85;SB=56.21 GT:AD:DP:GL:GQ 0/1:39,7:40:-28.44,-12.05,-138.25:99
-chr1 2537888 rs4379628 A G 6.62 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.46;MQ=59.75;MQ0=0;OQ=2299.26;QD=31.07;SB=-964.39 GT:AD:DP:GL:GQ 1/1:0,74:72:-233.58,-21.72,-0.07:99
-chr1 2541362 . T C 301.82 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=1099.72;QD=15.94;SB=-567.63 GT:AD:DP:GL:GQ 0/1:31,38:67:-133.44,-20.18,-122.76:99
-chr1 2541645 rs12117343 C T 412.42 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.64;MQ0=0;OQ=1073.30;QD=16.77;SB=-513.05 GT:AD:DP:GL:GQ 0/1:32,32:63:-129.60,-18.99,-99.14:99
-chr1 2543980 rs61765771 T G 318.19 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=635.63;QD=14.45;SB=-332.88 GT:AD:DP:GL:GQ 0/1:20,24:43:-79.80,-12.95,-72.63:99
-chr1 2546847 . G A 17.21 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.27;MQ0=0;OQ=1072.92;QD=19.87;SB=-329.89 GT:AD:DP:GL:GQ 0/1:19,35:49:-125.34,-14.77,-58.33:99
-chr1 2547051 rs7523364 C T 194.54 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=55.15;MQ0=0;OQ=3310.62;QD=39.41;SB=-1353.31 GT:AD:DP:GL:GQ 1/1:0,84:83:-330.06,-25.01,-0.03:99
-chr1 2547391 rs6422657 C T 186.53 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=2783.42;QD=38.13;SB=-1334.38 GT:AD:DP:GL:GQ 1/1:1,71:72:-284.61,-21.69,-2.69:99
-chr1 2548168 rs6668149 A C 205.71 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.44;MQ0=0;OQ=2627.68;QD=35.04;SB=-1288.37 GT:AD:DP:GL:GQ 1/1:0,75:74:-266.37,-22.29,-0.02:99
-chr1 2548600 rs12748729 C T 627.69 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2890.24;QD=37.05;SB=-1331.37 GT:AD:DP:GL:GQ 1/1:0,78:77:-292.65,-23.21,-0.04:99
-chr1 2549449 rs12730932 T G 82.44 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.16;MQ0=0;OQ=1601.53;QD=32.03;SB=-737.35 GT:AD:DP:GL:GQ 1/1:0,50:47:-163.76,-14.16,-0.02:99
-chr1 2550595 rs4648657 A G 5.77 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.33;MQ0=0;OQ=350.17;QD=25.01;SB=-43.68 GT:AD:DP:GL:GQ 1/1:0,14:13:-38.62,-3.93,-0.02:39.06
-chr1 2550742 rs4648658 G A 10.42 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.23;MQ0=0;OQ=551.80;QD=32.46;SB=-125.66 GT:AD:DP:GL:GQ 1/1:0,17:15:-58.77,-4.52,-0.01:45.14
-chr1 2550763 rs4648659 T G 0.34 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=309.18;QD=19.32;SB=-86.14 GT:AD:DP:GL:GQ 1/1:0,16:12:-34.52,-3.62,-0.02:36.01
-chr1 2551146 rs28532547 T G 110.03 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=53.21;MQ0=0;OQ=1059.23;QD=30.26;SB=-548.02 GT:AD:DP:GL:GQ 1/1:0,35:32:-109.53,-9.64,-0.02:96.26
-chr1 2552029 rs4648564 C T 0.99 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=7.47;MQ=58.85;MQ0=1;OQ=2625.23;QD=39.18;SB=-1028.39 GT:AD:DP:GL:GQ 1/1:1,66:66:-266.13,-19.88,-0.02:99
-chr1 2553110 rs12749591 G T 349.46 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=723.50;QD=32.89;SB=-266.61 GT:AD:DP:GL:GQ 1/1:0,22:22:-75.95,-6.63,-0.01:66.17
-chr1 2553270 . G T 45.57 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=10.71;MQ=58.27;MQ0=0;QD=1.69;SB=20.06 GT:AD:DP:GL:GQ 0/1:17,10:20:-13.87,-6.03,-50.95:78.40
-chr1 2554043 rs6698817 T C 9.96 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=887.43;QD=26.89;SB=-424.17 GT:AD:DP:GL:GQ 1/1:0,33:29:-92.36,-8.75,-0.03:87.20
-chr1 2554325 rs12752515 T C 17.47 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.11;MQ0=0;OQ=775.65;QD=29.83;SB=-403.34 GT:AD:DP:GL:GQ 1/1:0,26:25:-81.17,-7.54,-0.02:75.18
-chr1 2554665 rs12723864 A G 160.30 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=60.00;MQ0=0;OQ=414.17;QD=9.86;SB=-197.61 GT:AD:DP:GL:GQ 0/1:26,16:42:-57.35,-12.65,-104.43:99
-chr1 2555187 rs55649610 G T 258.93 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=951.34;QD=20.68;SB=-431.11 GT:AD:DP:GL:GQ 0/1:14,32:46:-112.28,-13.86,-47.81:99
-chr1 2555885 . C T 1.81 PASS AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=57.89;MQ0=0;OQ=690.84;QD=23.82;SB=-291.84 GT:AD:DP:GL:GQ 0/1:8,21:28:-80.81,-8.44,-25.16:99
-chr1 2556197 . T G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=11.22;MQ=54.79;MQ0=0;OQ=66.20;QD=3.31;SB=-59.09 GT:AD:DP:GL:GQ 0/1:16,4:14:-14.12,-4.22,-33.87:99
-chr1 2556342 rs6657378 T G 21.29 LowQual AC=1;AF=0.50;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=3.31;MQ=37.32;MQ0=0;QD=3.04;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,2:5:-6.92,-1.51,-9.22:54.10
-chr1 2556350 rs6671623 G A 0.26 PASS AC=2;AF=1.00;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=6.12;MQ=40.03;MQ0=1;OQ=207.84;QD=25.98;SB=-95.34 GT:AD:DP:GL:GQ 1/1:1,7:6:-24.36,-1.81,-0.00:18.06
-chr1 2556357 rs6671625 G A 182.34 PASS AC=2;AF=1.00;AN=2;DB;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.68;MQ0=1;OQ=89.01;QD=14.84;SB=-50.56 GT:AD:DP:GL:GQ 1/1:1,5:3:-12.39,-0.90,-0.00:9.03
-chr1 2556483 rs61765773 C T 0.15 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=11.29;MQ=45.87;MQ0=1;OQ=153.35;QD=5.11;SB=26.06 GT:AD:DP:GL:GQ 0/1:23,7:20:-24.65,-6.03,-43.69:99
-chr1 2556797 rs61765774 G C 178.56 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.58;MQ0=0;OQ=587.02;QD=17.79;SB=-197.49 GT:AD:DP:GL:GQ 0/1:16,17:32:-71.63,-9.64,-64.58:99
-chr1 2557281 rs12756665 C T 187.45 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.25;MQ=59.28;MQ0=0;OQ=722.29;QD=11.29;SB=-327.75 GT:AD:DP:GL:GQ 0/1:40,24:64:-94.79,-19.28,-146.15:99
-chr1 2557351 rs12739597 A G 96.49 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.10;MQ0=0;OQ=470.82;QD=7.03;SB=-215.20 GT:AD:DP:GL:GQ 0/1:44,23:67:-70.56,-20.20,-177.79:99
-chr1 2557360 rs6666788 A G 33.09 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=2.28;MQ=59.11;MQ0=0;OQ=2385.56;QD=35.08;SB=-1067.87 GT:AD:DP:GL:GQ 1/1:0,68:67:-242.16,-20.18,-0.02:99
-chr1 2558285 rs4648661 T C 264.82 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.76;MQ0=0;OQ=708.13;QD=11.80;SB=-352.07 GT:AD:DP:GL:GQ 0/1:29,30:58:-91.59,-17.49,-110.76:99
-chr1 2559883 rs4648565 A G 68.89 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=1657.37;QD=34.53;SB=-734.30 GT:AD:DP:GL:GQ 1/1:0,48:47:-169.34,-14.16,-0.02:99
-chr1 2561683 rs28690427 A G 44.51 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.48;MQ0=0;OQ=1625.27;QD=33.17;SB=-564.36 GT:AD:DP:GL:GQ 1/1:0,49:47:-166.13,-14.16,-0.02:99
-chr1 2563059 rs4648662 A G 36.80 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=57.88;MQ0=0;OQ=986.78;QD=31.83;SB=-278.44 GT:AD:DP:GL:GQ 1/1:0,30:28:-102.27,-8.43,-0.01:84.25
-chr1 2563587 rs4648663 A C 432.35 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1398.67;QD=33.30;SB=-656.05 GT:AD:DP:GL:GQ 1/1:0,42:41:-143.47,-12.35,-0.02:99
-chr1 2563763 rs12726651 C T 270.02 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.90;MQ0=0;OQ=164.81;QD=9.69;SB=-74.06 GT:AD:DP:GL:GQ 0/1:11,6:16:-24.59,-4.82,-34.68:99
-chr1 2563938 rs9970196 T C 22.23 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.81;MQ=59.28;MQ0=0;OQ=1014.31;QD=31.70;SB=-295.06 GT:AD:DP:GL:GQ 1/1:0,32:30:-105.04,-9.04,-0.02:90.22
-chr1 2566315 rs6604989 T C 18.73 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1647.45;QD=28.40;SB=-794.64 GT:AD:DP:GL:GQ 1/1:0,58:52:-168.38,-15.68,-0.05:99
-chr1 2568080 rs12744876 G T 183.89 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=58.84;MQ0=0;OQ=1106.09;QD=17.02;SB=-318.70 GT:AD:DP:GL:GQ 0/1:29,35:64:-133.17,-19.27,-104.78:99
-chr1 2571402 rs28611770 A G 632.64 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.32;MQ0=1;OQ=2534.42;QD=35.20;SB=-1124.79 GT:AD:DP:GL:GQ 1/1:0,72:70:-257.05,-21.08,-0.02:99
-chr1 2571473 . C T 26.42 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=54.51;MQ0=1;OQ=420.48;QD=8.58;SB=-192.15 GT:AD:DP:GL:GQ 0/1:33,16:41:-57.68,-12.35,-93.81:99
-chr1 2571476 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=3;HaplotypeScore=3.65;MQ=54.65;MQ0=1;OQ=290.92;QD=5.94;SB=-124.22 GT:AD:DP:GL:GQ 0/1:34,15:41:-44.73,-12.36,-110.26:99
-chr1 2571505 . C T 0.62 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=52.42;MQ0=0;OQ=231.01;QD=4.20;SB=-18.13 GT:AD:DP:GL:GQ 0/1:42,13:52:-42.05,-15.67,-144.47:99
-chr1 2571527 . A T 14.96 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.42;MQ=51.64;MQ0=0;OQ=434.87;QD=7.91;SB=-142.65 GT:AD:DP:GL:GQ 0/1:35,20:51:-62.14,-15.37,-122.01:99
-chr1 2572200 rs12732266 C G 51.91 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=5.49;MQ=58.04;MQ0=0;OQ=559.70;QD=11.91;SB=-261.11 GT:AD:DP:GL:GQ 0/1:26,21:41:-71.62,-12.36,-99.19:99
-chr1 2573315 rs12738064 C T 887.13 DPFilter;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=171.89;MQ=24.26;MQ0=9;QD=6.67;SB=-137.01 GT:AD:DP:GL:GQ 1/1:10,119:25:-96.41,-11.12,-4.11:70.06
-chr1 2573322 . T G 343.20 DPFilter;SnpCluster AC=2;AF=1.00;AN=2;DP=144;Dels=0.01;HRun=0;HaplotypeScore=333.45;MQ=22.10;MQ0=11;QD=2.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:29,104:11:-37.91,-3.31,-0.00:33.09
-chr1 2573323 . C G 95.88 DPFilter;SnpCluster AC=2;AF=1.00;AN=2;DP=144;Dels=0.01;HRun=1;HaplotypeScore=342.46;MQ=22.10;MQ0=11;QD=0.67;SB=-10.00 GT:AD:DP:GL:GQ 1/1:103,36:3:-13.08,-0.90,-0.00:9.03
-chr1 2573324 . G C 506.46 DPFilter;Indel;SnpCluster AC=2;AF=1.00;AN=2;DP=147;Dels=0.01;HRun=1;HaplotypeScore=339.64;MQ=22.28;MQ0=11;QD=3.45;SB=-10.00 GT:AD:DP:GL:GQ 1/1:15,116:14:-57.88,-7.75,-3.65:41.01
-chr1 2573329 rs12734173 G A 146.94 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=218;Dels=0.00;HRun=1;HaplotypeScore=513.41;MQ=21.01;MQ0=20;QD=0.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:132,84:24:-25.21,-7.23,-67.73:99
-chr1 2573338 . C G 83.26 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=710.09;MQ=20.03;MQ0=40;QD=0.29;SB=-0.97 GT:AD:DP:GL:GQ 0/1:254,26:38:-23.06,-11.45,-135.55:99
-chr1 2573342 . C A 213.70 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=322;Dels=0.00;HRun=1;HaplotypeScore=673.88;MQ=20.07;MQ0=46;QD=0.66;SB=1.99 GT:AD:DP:GL:GQ 0/1:277,45:41:-37.01,-12.35,-108.15:99
-chr1 2573345 . A C 1425.86 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=338;Dels=0.02;HRun=3;HaplotypeScore=632.90;MQ=20.26;MQ0=48;QD=4.22;SB=-172.79 GT:AD:DP:GL:GQ 0/1:132,186:90:-176.25,-30.38,-146.77:99
-chr1 2573350 . T C 293.04 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=399;Dels=0.00;HRun=0;HaplotypeScore=691.94;MQ=19.84;MQ0=54;QD=0.73;SB=44.71 GT:AD:DP:GL:GQ 0/1:277,71:78:-104.74,-72.15,-238.43:99
-chr1 2573354 . C A 62.42 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=1;HaplotypeScore=848.73;MQ=19.94;MQ0=56;QD=0.14;SB=50.16 GT:AD:DP:GL:GQ 0/1:379,40:51:-24.89,-15.36,-155.69:95.25
-chr1 2573358 . T C 129.61 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=457;Dels=0.00;HRun=1;HaplotypeScore=683.78;MQ=19.93;MQ0=58;QD=0.28;SB=-34.65 GT:AD:DP:GL:GQ 0/1:367,56:52:-42.68,-26.43,-169.09:99
-chr1 2573364 rs55738582 C G 575.47 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=473;Dels=0.00;HRun=1;HaplotypeScore=961.37;MQ=19.71;MQ0=62;QD=1.22;SB=-67.52 GT:AD:DP:GL:GQ 0/1:411,23:43:-73.79,-12.96,-105.12:99
-chr1 2573370 rs55790383 G A 775.08 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=470;Dels=0.00;HRun=1;HaplotypeScore=917.62;MQ=19.72;MQ0=61;QD=1.65;SB=-367.90 GT:AD:DP:GL:GQ 0/1:265,173:48:-98.76,-17.97,-89.48:99
-chr1 2573371 rs55657722 G C 3489.08 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=470;Dels=0.00;HRun=0;HaplotypeScore=944.58;MQ=19.72;MQ0=61;QD=7.42;SB=-1002.13 GT:AD:DP:GL:GQ 1/1:47,398:84:-347.91,-28.85,-3.68:99
-chr1 2573372 . A G 46.25 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=482;Dels=0.00;HRun=2;HaplotypeScore=999.26;MQ=19.79;MQ0=62;QD=0.10;SB=26.11 GT:AD:DP:GL:GQ 0/1:425,48:54:-24.18,-16.27,-184.96:79.08
-chr1 2573374 . C A 193.31 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=490;Dels=0.00;HRun=1;HaplotypeScore=979.59;MQ=19.99;MQ0=60;QD=0.39;SB=-75.64 GT:AD:DP:GL:GQ 0/1:438,45:65:-48.93,-26.32,-189.47:99
-chr1 2573382 . C A 261.06 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=502;Dels=0.01;HRun=1;HaplotypeScore=946.29;MQ=19.95;MQ0=64;QD=0.52;SB=17.04 GT:AD:DP:GL:GQ 0/1:391,72:71:-67.99,-38.60,-197.52:99
-chr1 2573383 . C G 55.13 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=502;Dels=0.00;HRun=0;HaplotypeScore=899.21;MQ=20.04;MQ0=63;QD=0.11;SB=37.79 GT:AD:DP:GL:GQ 0/1:438,33:65:-35.38,-26.59,-240.37:87.97
-chr1 2573385 . C A 145.75 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=503;Dels=0.00;HRun=0;HaplotypeScore=828.45;MQ=20.02;MQ0=64;QD=0.29;SB=-23.06 GT:AD:DP:GL:GQ 0/1:432,48:49:-35.99,-18.13,-141.74:99
-chr1 2573390 . T C 166.49 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=483;Dels=0.01;HRun=0;HaplotypeScore=660.44;MQ=20.15;MQ0=61;QD=0.34;SB=-43.82 GT:AD:DP:GL:GQ 0/1:342,96:43:-35.67,-15.74,-120.66:99
-chr1 2573404 rs56352113 A C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=412;Dels=0.00;HRun=1;HaplotypeScore=785.14;MQ=20.24;MQ0=50;OQ=1746.05;QD=4.24;SB=-272.76 GT:AD:DP:GL:GQ 1/1:48,316:72:-242.08,-66.55,-63.89:26.61
-chr1 2573410 rs12759490 A G 148.65 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DB;DP=383;Dels=0.00;HRun=0;HaplotypeScore=682.21;MQ=20.35;MQ0=44;QD=0.39;SB=-43.26 GT:AD:DP:GL:GQ 0/1:276,96:57:-35.34,-17.19,-178.84:99
-chr1 2573423 . C A 163.64 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=1;HaplotypeScore=927.03;MQ=21.34;MQ0=33;QD=0.58;SB=26.07 GT:AD:DP:GL:GQ 0/1:224,38:48:-34.11,-14.46,-128.40:99
-chr1 2573426 . C A 487.43 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=275;Dels=0.00;HRun=0;HaplotypeScore=598.86;MQ=21.74;MQ0=31;QD=1.77;SB=-144.61 GT:AD:DP:GL:GQ 0/1:229,39:67:-72.21,-20.18,-167.89:99
-chr1 2573431 . T A 55.01 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=0;HaplotypeScore=414.88;MQ=22.20;MQ0=23;QD=0.23;SB=-37.64 GT:AD:DP:GL:GQ 0/1:198,17:62:-42.64,-33.85,-190.83:87.85
-chr1 2573439 rs12738268 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=199;Dels=0.00;HRun=0;HaplotypeScore=197.41;MQ=23.56;MQ0=17;OQ=1379.28;QD=6.93;SB=-473.52 GT:AD:DP:GL:GQ 0/1:75,107:51:-156.58,-15.37,-36.65:99
-chr1 2573442 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=0;HaplotypeScore=181.20;MQ=23.67;MQ0=14;OQ=103.36;QD=0.53;SB=32.13 GT:AD:DP:GL:GQ 0/1:179,11:55:-39.39,-25.77,-162.27:99
-chr1 2573451 . A G 329.45 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=156;Dels=0.00;HRun=0;HaplotypeScore=168.85;MQ=25.71;MQ0=9;QD=2.11;SB=-36.23 GT:AD:DP:GL:GQ 0/1:80,76:54:-52.50,-16.27,-154.97:99
-chr1 2573454 rs55760918 C G 556.39 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=0;HaplotypeScore=206.74;MQ=26.90;MQ0=8;QD=3.97;SB=-52.80 GT:AD:DP:GL:GQ 0/1:46,88:51:-74.30,-15.38,-138.45:99
-chr1 2573455 rs56258540 A C 134.39 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=145;Dels=0.00;HRun=1;HaplotypeScore=218.70;MQ=26.73;MQ0=9;QD=0.93;SB=-34.89 GT:AD:DP:GL:GQ 0/1:91,52:51:-34.62,-17.90,-142.52:99
-chr1 2573485 rs55714819 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=241;Dels=0.00;HRun=1;HaplotypeScore=172.11;MQ=27.92;MQ0=9;OQ=766.38;QD=3.18;SB=-61.60 GT:AD:DP:GL:GQ 0/1:152,84:106:-115.24,-35.32,-271.38:99
-chr1 2573510 rs61765777 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=332;Dels=0.00;HRun=1;HaplotypeScore=336.11;MQ=27.14;MQ0=14;OQ=2271.13;QD=6.84;SB=-383.23 GT:AD:DP:GL:GQ 0/1:103,229:130:-269.56,-39.16,-232.28:99
-chr1 2573523 . C T 271.88 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=476;Dels=0.00;HRun=0;HaplotypeScore=388.59;MQ=26.03;MQ0=25;QD=0.57;SB=-54.44 GT:AD:DP:GL:GQ 0/1:421,51:171:-82.00,-51.53,-495.80:99
-chr1 2573524 . G A 673.59 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=489;Dels=0.00;HRun=0;HaplotypeScore=381.72;MQ=26.07;MQ0=26;QD=1.38;SB=-235.66 GT:AD:DP:GL:GQ 0/1:348,136:174:-123.14,-52.50,-452.42:99
-chr1 2573532 . A G 266.78 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=584;Dels=0.00;HRun=0;HaplotypeScore=454.81;MQ=26.29;MQ0=38;QD=0.46;SB=-50.09 GT:AD:DP:GL:GQ 0/1:462,118:225:-100.76,-70.80,-803.69:99
-chr1 2573533 . C T 518.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=590;Dels=0.00;HRun=0;HaplotypeScore=454.86;MQ=26.25;MQ0=38;QD=0.88;SB=-177.22 GT:AD:DP:GL:GQ 0/1:555,34:221:-123.94,-68.80,-639.87:99
-chr1 2573545 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=760;Dels=0.00;HRun=0;HaplotypeScore=554.01;MQ=25.28;MQ0=58;OQ=2752.41;QD=3.62;SB=-334.08 GT:AD:DP:GL:GQ 0/1:504,247:275:-368.19,-89.67,-758.94:99
-chr1 2573551 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=816;Dels=0.00;HRun=0;HaplotypeScore=706.82;MQ=24.77;MQ0=61;OQ=92.57;QD=0.11;SB=99.33 GT:AD:DP:GL:GQ 0/1:767,48:306:-104.74,-92.20,-1021.89:99
-chr1 2573560 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=935;Dels=0.00;HRun=0;HaplotypeScore=771.90;MQ=24.19;MQ0=82;OQ=1354.07;QD=1.45;SB=-436.68 GT:AD:DP:GL:GQ 0/1:723,199:339:-248.95,-110.26,-942.99:99
-chr1 2573563 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=967;Dels=0.00;HRun=0;HaplotypeScore=867.36;MQ=23.97;MQ0=86;OQ=1389.93;QD=1.44;SB=161.22 GT:AD:DP:GL:GQ 0/1:819,137:345:-262.46,-120.18,-962.42:99
-chr1 2573572 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1012;Dels=0.00;HRun=0;HaplotypeScore=731.51;MQ=23.62;MQ0=98;OQ=634.63;QD=0.63;SB=-79.47 GT:AD:DP:GL:GQ 0/1:773,210:334:-172.80,-106.05,-1139.69:99
-chr1 2573600 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=878;Dels=0.00;HRun=0;HaplotypeScore=653.71;MQ=23.12;MQ0=120;OQ=1122.68;QD=1.28;SB=-567.08 GT:AD:DP:GL:GQ 0/1:678,154:296:-246.10,-130.55,-807.07:99
-chr1 2573603 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=862;Dels=0.00;HRun=0;HaplotypeScore=618.67;MQ=23.10;MQ0=123;OQ=316.50;QD=0.37;SB=-169.71 GT:AD:DP:GL:GQ 0/1:783,67:305:-136.37,-101.44,-918.41:99
-chr1 2573643 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=406;Dels=0.00;HRun=0;HaplotypeScore=240.70;MQ=22.59;MQ0=105;OQ=101.01;QD=0.25;SB=40.47 GT:AD:DP:GL:GQ 0/1:341,64:133:-53.47,-40.09,-445.02:99
-chr1 2573645 . T G 27.32 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=393;Dels=0.00;HRun=0;HaplotypeScore=214.15;MQ=22.61;MQ0=102;QD=0.07;SB=22.12 GT:AD:DP:GL:GQ 0/1:333,60:125:-43.68,-37.67,-396.83:60.15
-chr1 2573659 rs28581291 G C 4615.63 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=333;Dels=0.00;HRun=1;HaplotypeScore=205.79;MQ=24.13;MQ0=78;QD=13.86;SB=-1212.00 GT:AD:DP:GL:GQ 0/1:35,294:132:-460.56,-39.52,-82.06:99
-chr1 2573662 . C T 559.05 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=280.21;MQ=24.11;MQ0=79;QD=1.58;SB=-274.91 GT:AD:DP:GL:GQ 0/1:309,45:145:-102.89,-43.70,-398.94:99
-chr1 2573665 . C G 1510.34 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=0;HaplotypeScore=325.78;MQ=24.58;MQ0=76;QD=3.70;SB=-297.94 GT:AD:DP:GL:GQ 0/1:264,141:179:-211.73,-57.41,-536.45:99
-chr1 2573688 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=651;Dels=0.00;HRun=2;HaplotypeScore=395.85;MQ=24.99;MQ0=65;OQ=362.26;QD=0.56;SB=-155.57 GT:AD:DP:GL:GQ 0/1:581,65:307:-140.30,-100.79,-1081.14:99
-chr1 2573689 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=665;Dels=0.00;HRun=0;HaplotypeScore=525.06;MQ=24.91;MQ0=65;OQ=1827.67;QD=2.75;SB=-517.28 GT:AD:DP:GL:GQ 0/1:550,112:319:-282.15,-96.10,-903.12:99
-chr1 2573699 rs28514305 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=700;Dels=0.00;HRun=1;HaplotypeScore=627.89;MQ=25.13;MQ0=51;OQ=504.00;QD=0.72;SB=-50.28 GT:AD:DP:GL:GQ 0/1:553,135:325:-164.84,-111.15,-1100.31:99
-chr1 2573722 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=939;Dels=0.00;HRun=0;HaplotypeScore=511.14;MQ=24.55;MQ0=41;OQ=652.05;QD=0.69;SB=-156.78 GT:AD:DP:GL:GQ 0/1:833,100:448:-203.46,-134.97,-1376.56:99
-chr1 2573743 . C A 1376.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=920;Dels=0.01;HRun=1;HaplotypeScore=1049.31;MQ=24.03;MQ0=45;QD=1.50;SB=-654.94 GT:AD:DP:GL:GQ 0/1:771,125:393:-273.72,-132.79,-1119.66:99
-chr1 2573744 . C A 2246.36 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=920;Dels=0.00;HRun=0;HaplotypeScore=1100.48;MQ=24.05;MQ0=45;QD=2.44;SB=-774.39 GT:AD:DP:GL:GQ 0/1:696,198:389:-363.03,-135.11,-1033.83:99
-chr1 2573747 . C T 2541.21 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=900;Dels=0.00;HRun=0;HaplotypeScore=1014.50;MQ=23.93;MQ0=43;QD=2.82;SB=-593.64 GT:AD:DP:GL:GQ 0/1:671,157:361:-422.27,-164.86,-953.11:99
-chr1 2573753 . A T 936.20 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=863;Dels=0.00;HRun=0;HaplotypeScore=1289.29;MQ=23.50;MQ0=46;QD=1.08;SB=-444.50 GT:AD:DP:GL:GQ 0/1:735,98:311:-195.18,-98.28,-961.18:99
-chr1 2573759 . C T 306.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=786;Dels=0.00;HRun=0;HaplotypeScore=944.88;MQ=23.40;MQ0=46;QD=0.39;SB=80.59 GT:AD:DP:GL:GQ 0/1:568,186:262:-146.29,-112.39,-779.46:99
-chr1 2573762 . C T 1224.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=751;Dels=0.00;HRun=0;HaplotypeScore=1008.25;MQ=23.38;MQ0=43;QD=1.63;SB=32.31 GT:AD:DP:GL:GQ 0/1:549,181:260:-207.81,-82.08,-705.47:99
-chr1 2573768 . G A 69.35 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=690;Dels=0.00;HRun=0;HaplotypeScore=1128.47;MQ=23.25;MQ0=39;QD=0.10;SB=181.10 GT:AD:DP:GL:GQ 0/1:645,45:222:-77.09,-66.88,-732.33:99
-chr1 2573775 rs61765778 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=598;Dels=0.00;HRun=0;HaplotypeScore=829.09;MQ=23.11;MQ0=35;OQ=51.56;QD=0.09;SB=-51.39 GT:AD:DP:GL:GQ 0/1:411,178:176:-78.89,-70.45,-552.62:84.40
-chr1 2573784 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=482;Dels=0.00;HRun=0;HaplotypeScore=533.05;MQ=23.86;MQ0=35;OQ=97.06;QD=0.20;SB=-41.06 GT:AD:DP:GL:GQ 0/1:428,39:135:-57.53,-44.54,-428.93:99
-chr1 2573791 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=376;Dels=0.00;HRun=0;HaplotypeScore=279.62;MQ=25.08;MQ0=23;OQ=809.10;QD=2.15;SB=-122.99 GT:AD:DP:GL:GQ 0/1:249,119:103:-122.37,-38.18,-240.78:99
-chr1 2573803 rs61765779 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=238;Dels=0.00;HRun=0;HaplotypeScore=273.29;MQ=27.85;MQ0=11;OQ=738.52;QD=3.10;SB=-305.23 GT:AD:DP:GL:GQ 0/1:82,152:68:-97.64,-20.50,-141.62:99
-chr1 2573809 rs61765805 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=1;HaplotypeScore=207.51;MQ=30.86;MQ0=7;OQ=486.71;QD=2.85;SB=-123.47 GT:AD:DP:GL:GQ 0/1:47,107:55:-75.59,-23.64,-159.88:99
-chr1 2573825 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.04;HRun=2;HaplotypeScore=133.51;MQ=37.12;MQ0=1;OQ=152.18;QD=1.48;SB=68.24 GT:AD:DP:GL:GQ 0/1:42,51:50:-47.81,-29.31,-160.18:99
-chr1 2573831 rs55855140 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=126.91;MQ=39.65;MQ0=1;OQ=158.89;QD=1.62;SB=62.19 GT:AD:DP:GL:GQ 0/1:53,43:46:-39.96,-20.79,-124.08:99
-chr1 2573842 . A C 115.63 SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=142.04;MQ=40.93;MQ0=1;QD=1.17;SB=-71.86 GT:AD:DP:GL:GQ 0/1:45,45:51:-30.22,-15.37,-141.99:99
-chr1 2573846 rs61765806 C G 427.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=128;Dels=0.00;HRun=0;HaplotypeScore=158.02;MQ=39.65;MQ0=2;QD=3.34;SB=50.19 GT:AD:DP:GL:GQ 0/1:94,33:65:-65.70,-19.61,-201.59:99
-chr1 2573851 . G A 820.83 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=1;HaplotypeScore=122.19;MQ=40.52;MQ0=2;QD=5.86;SB=-152.15 GT:AD:DP:GL:GQ 0/1:66,72:74:-107.66,-22.30,-166.53:99
-chr1 2573859 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=126.84;MQ=40.41;MQ0=2;OQ=121.72;QD=0.77;SB=152.53 GT:AD:DP:GL:GQ 0/1:122,36:93:-43.49,-28.03,-346.24:99
-chr1 2573901 rs35515286 G C 550.86 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=206;Dels=0.00;HRun=0;HaplotypeScore=105.96;MQ=43.03;MQ0=1;QD=2.67;SB=237.50 GT:AD:DP:GL:GQ 0/1:135,63:142:-119.31,-60.94,-520.06:99
-chr1 2573904 . G C 824.37 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=3;HaplotypeScore=109.03;MQ=42.87;MQ0=2;QD=4.04;SB=193.35 GT:AD:DP:GL:GQ 0/1:129,71:137:-131.62,-45.90,-468.47:99
-chr1 2573907 . C T 232.33 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=169.38;MQ=41.15;MQ0=2;QD=0.99;SB=246.29 GT:AD:DP:GL:GQ 0/1:198,35:151:-72.01,-45.49,-466.42:99
-chr1 2573937 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=313;Dels=0.00;HRun=2;HaplotypeScore=156.05;MQ=41.48;MQ0=6;OQ=610.21;QD=1.95;SB=184.28 GT:AD:DP:GL:GQ 0/1:179,131:178:-121.09,-56.78,-561.52:99
-chr1 2573955 rs4648664 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=309;Dels=0.01;HRun=0;HaplotypeScore=189.00;MQ=39.75;MQ0=9;OQ=5144.30;QD=16.65;SB=-1373.56 GT:AD:DP:GL:GQ 0/1:99,207:204:-513.43,-64.42,-219.84:99
-chr1 2573957 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=210.03;MQ=39.51;MQ0=9;OQ=1411.76;QD=4.57;SB=186.52 GT:AD:DP:GL:GQ 0/1:164,144:192:-204.89,-60.43,-482.07:99
-chr1 2573977 rs36074084 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=329;Dels=0.14;HRun=3;HaplotypeScore=420.13;MQ=34.94;MQ0=9;OQ=1855.95;QD=5.64;SB=145.19 GT:AD:DP:GL:GQ 0/1:152,125:193:-244.66,-55.78,-561.08:99
-chr1 2573987 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=436;Dels=0.02;HRun=3;HaplotypeScore=523.62;MQ=29.87;MQ0=18;OQ=97.02;QD=0.22;SB=235.20 GT:AD:DP:GL:GQ 0/1:315,109:216:-76.87,-63.88,-657.84:99
-chr1 2574006 rs56001931 C A 193.50 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=578;Dels=0.00;HRun=0;HaplotypeScore=796.32;MQ=26.82;MQ0=27;QD=0.33;SB=-95.26 GT:AD:DP:GL:GQ 0/1:506,46:197:-84.56,-61.92,-620.37:99
-chr1 2574010 . G A 47.43 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=576;Dels=0.00;HRun=1;HaplotypeScore=936.31;MQ=26.86;MQ0=27;QD=0.08;SB=305.98 GT:AD:DP:GL:GQ 0/1:514,37:196:-70.15,-62.12,-641.00:80.27
-chr1 2574012 . G A 1112.09 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=567;Dels=0.00;HRun=1;HaplotypeScore=881.66;MQ=26.70;MQ0=27;QD=1.96;SB=173.94 GT:AD:DP:GL:GQ 0/1:337,218:205:-176.25,-61.76,-573.77:99
-chr1 2574013 rs35375421 G C 2739.83 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=556;Dels=0.00;HRun=0;HaplotypeScore=907.42;MQ=26.74;MQ0=27;QD=4.93;SB=-98.82 GT:AD:DP:GL:GQ 0/1:185,358:186:-340.69,-63.42,-477.87:99
-chr1 2574046 rs61765808 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=633;Dels=0.00;HRun=1;HaplotypeScore=769.62;MQ=25.77;MQ0=33;OQ=2369.47;QD=3.74;SB=-14.31 GT:AD:DP:GL:GQ 0/1:214,394:219:-332.81,-92.58,-459.77:99
-chr1 2574062 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=571;Dels=0.02;HRun=0;HaplotypeScore=1395.05;MQ=27.31;MQ0=25;OQ=270.74;QD=0.47;SB=9.21 GT:AD:DP:GL:GQ 0/1:393,159:156:-79.45,-49.09,-466.84:99
-chr1 2574081 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=574;Dels=0.00;HRun=0;HaplotypeScore=636.02;MQ=28.62;MQ0=23;OQ=102.79;QD=0.18;SB=258.30 GT:AD:DP:GL:GQ 0/1:339,178:156:-99.87,-86.31,-482.50:99
-chr1 2574099 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=481;Dels=0.01;HRun=2;HaplotypeScore=469.12;MQ=32.08;MQ0=15;OQ=332.15;QD=0.69;SB=-15.43 GT:AD:DP:GL:GQ 0/1:184,278:155:-88.85,-52.35,-456.19:99
-chr1 2574112 rs4648665 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=407;Dels=0.00;HRun=1;HaplotypeScore=376.40;MQ=32.86;MQ0=13;OQ=5520.38;QD=13.56;SB=-1708.96 GT:AD:DP:GL:GQ 1/1:7,385:151:-551.04,-45.49,-0.05:99
-chr1 2574233 rs6678571 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=482;Dels=0.00;HRun=0;HaplotypeScore=317.44;MQ=37.14;MQ0=103;OQ=51.18;QD=0.11;SB=33.13 GT:AD:DP:GL:GQ 0/1:400,76:222:-75.35,-66.94,-654.61:84.02
-chr1 2574280 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=411;Dels=0.00;HRun=0;HaplotypeScore=206.24;MQ=40.63;MQ0=25;OQ=702.83;QD=1.71;SB=165.25 GT:AD:DP:GL:GQ 0/1:262,145:248:-148.35,-74.78,-882.77:99
-chr1 2574370 rs56005609 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=224;Dels=0.00;HRun=0;HaplotypeScore=51.47;MQ=47.47;MQ0=12;OQ=160.10;QD=0.71;SB=-105.06 GT:AD:DP:GL:GQ 0/1:203,21:172:-71.19,-51.89,-483.26:99
-chr1 2574383 rs4648666 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=0;HaplotypeScore=154.22;MQ=48.52;MQ0=8;OQ=4531.65;QD=21.08;SB=-1293.59 GT:AD:DP:GL:GQ 0/1:45,169:169:-452.16,-50.92,-131.50:99
-chr1 2574398 rs4648667 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=297;Dels=0.00;HRun=0;HaplotypeScore=177.69;MQ=43.72;MQ0=17;OQ=1775.91;QD=5.98;SB=-869.96 GT:AD:DP:GL:GQ 0/1:211,86:190:-238.16,-57.29,-446.26:99
-chr1 2574435 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=784;Dels=0.00;HRun=0;HaplotypeScore=476.42;MQ=30.94;MQ0=61;OQ=552.66;QD=0.70;SB=-126.39 GT:AD:DP:GL:GQ 0/1:497,287:235:-129.39,-70.84,-631.70:99
-chr1 2574468 . A C 45.91 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=925;Dels=0.00;HRun=3;HaplotypeScore=499.34;MQ=30.78;MQ0=79;QD=0.05;SB=344.95 GT:AD:DP:GL:GQ 0/1:799,98:301:-105.40,-97.53,-960.73:78.74
-chr1 2574499 . C A 22.95 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=665;Dels=0.00;HRun=2;HaplotypeScore=681.86;MQ=36.15;MQ0=63;QD=0.03;SB=89.36 GT:AD:DP:GL:GQ 0/1:533,92:270:-145.98,-140.40,-853.73:55.76
-chr1 2574516 rs61765812 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=416;Dels=0.00;HRun=0;HaplotypeScore=217.32;MQ=43.57;MQ0=35;OQ=129.59;QD=0.31;SB=68.68 GT:AD:DP:GL:GQ 0/1:278,133:243:-89.48,-73.24,-851.13:99
-chr1 2574566 rs28558799 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=282;Dels=0.00;HRun=0;HaplotypeScore=119.44;MQ=43.46;MQ0=13;OQ=5625.16;QD=19.95;SB=-2459.11 GT:AD:DP:GL:GQ 0/1:49,230:200:-561.52,-60.25,-174.15:99
-chr1 2574594 rs56062029 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=452;Dels=0.00;HRun=2;HaplotypeScore=294.75;MQ=33.13;MQ0=30;OQ=1117.30;QD=2.47;SB=-453.09 GT:AD:DP:GL:GQ 0/1:369,56:211:-181.97,-66.96,-565.43:99
-chr1 2574621 rs57267388 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=571;Dels=0.00;HRun=0;HaplotypeScore=771.91;MQ=31.23;MQ0=33;OQ=342.14;QD=0.60;SB=-185.77 GT:AD:DP:GL:GQ 0/1:283,102:222:-153.52,-116.02,-729.22:99
-chr1 2574649 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=993;Dels=0.00;HRun=0;HaplotypeScore=693.61;MQ=28.27;MQ0=75;OQ=1079.32;QD=1.09;SB=-556.01 GT:AD:DP:GL:GQ 0/1:844,137:401:-235.64,-124.42,-1471.20:99
-chr1 2574659 . A C 29.66 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=980;Dels=0.00;HRun=3;HaplotypeScore=948.25;MQ=27.73;MQ0=79;QD=0.03;SB=242.38 GT:AD:DP:GL:GQ 0/1:842,123:385:-128.64,-122.39,-1217.71:62.50
-chr1 2574737 rs61765814 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=400;Dels=0.00;HRun=0;HaplotypeScore=203.09;MQ=41.26;MQ0=24;OQ=736.68;QD=1.84;SB=-0.60 GT:AD:DP:GL:GQ 0/1:202,185:205:-145.42,-68.47,-717.91:99
-chr1 2574757 rs61765815 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=370;Dels=0.00;HRun=0;HaplotypeScore=249.27;MQ=42.55;MQ0=25;OQ=384.28;QD=1.04;SB=73.46 GT:AD:DP:GL:GQ 0/1:205,136:201:-108.67,-66.96,-637.57:99
-chr1 2574806 rs61765816 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=433;Dels=0.00;HRun=0;HaplotypeScore=271.20;MQ=41.78;MQ0=23;OQ=447.69;QD=1.03;SB=-108.45 GT:AD:DP:GL:GQ 0/1:271,156:236:-119.20,-71.14,-762.60:99
-chr1 2574851 rs6691639 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=333;Dels=0.00;HRun=0;HaplotypeScore=216.92;MQ=45.13;MQ0=5;OQ=7151.39;QD=21.48;SB=-2958.67 GT:AD:DP:GL:GQ 0/1:25,306:212:-714.14,-63.86,-81.27:99
-chr1 2574904 rs6604990 T C 6413.62 DPFilter;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=427;Dels=0.06;HRun=3;HaplotypeScore=563.84;MQ=34.54;MQ0=9;QD=15.02;SB=-2045.14 GT:AD:DP:GL:GQ 1/1:119,272:189:-640.36,-56.34,-15.02:99
-chr1 2574911 . A C 149.58 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=456;Dels=0.00;HRun=3;HaplotypeScore=557.08;MQ=32.46;MQ0=11;QD=0.33;SB=-79.57 GT:AD:DP:GL:GQ 0/1:298,141:171:-69.76,-51.52,-530.42:99
-chr1 2574914 . A G 786.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=464;Dels=0.02;HRun=1;HaplotypeScore=590.68;MQ=31.99;MQ0=11;QD=1.70;SB=-166.87 GT:AD:DP:GL:GQ 0/1:189,264:184:-140.25,-58.27,-581.91:99
-chr1 2574924 rs61765818 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=562;Dels=0.00;HRun=1;HaplotypeScore=584.85;MQ=29.44;MQ0=16;OQ=664.13;QD=1.18;SB=-72.04 GT:AD:DP:GL:GQ 0/1:412,132:178:-126.09,-56.39,-566.98:99
-chr1 2574942 rs60506177 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=681;Dels=0.00;HRun=2;HaplotypeScore=1240.22;MQ=29.22;MQ0=28;OQ=4364.77;QD=6.41;SB=-1487.53 GT:AD:DP:GL:GQ 0/1:160,495:256:-435.48,-89.03,-503.32:99
-chr1 2574956 rs59191334 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=906;Dels=0.00;HRun=0;HaplotypeScore=851.71;MQ=29.72;MQ0=44;OQ=1149.69;QD=1.27;SB=-284.23 GT:AD:DP:GL:GQ 0/1:632,252:274:-200.91,-82.66,-713.01:99
-chr1 2574986 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=944;Dels=0.00;HRun=1;HaplotypeScore=1818.61;MQ=31.01;MQ0=59;OQ=1122.41;QD=1.19;SB=-398.32 GT:AD:DP:GL:GQ 0/1:745,146:351:-246.18,-130.65,-980.48:99
-chr1 2575019 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=719;Dels=0.00;HRun=0;HaplotypeScore=472.84;MQ=36.86;MQ0=62;OQ=2013.75;QD=2.80;SB=-548.67 GT:AD:DP:GL:GQ 0/1:509,205:351:-310.40,-105.75,-919.85:99
-chr1 2575034 rs61763547 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=646;Dels=0.00;HRun=1;HaplotypeScore=246.19;MQ=38.01;MQ0=57;OQ=1218.08;QD=1.89;SB=297.56 GT:AD:DP:GL:GQ 0/1:304,285:351:-300.74,-175.64,-1150.43:99
-chr1 2575068 . C G 824.18 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=841;Dels=0.00;HRun=0;HaplotypeScore=834.43;MQ=32.24;MQ0=93;QD=0.98;SB=69.34 GT:AD:DP:GL:GQ 0/1:592,151:395:-352.89,-267.19,-1451.52:99
-chr1 2575069 rs11510858 C A 2054.73 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=851;Dels=0.00;HRun=0;HaplotypeScore=833.69;MQ=32.03;MQ0=94;QD=2.41;SB=-732.04 GT:AD:DP:GL:GQ 0/1:701,130:386:-337.44,-128.68,-1037.66:99
-chr1 2575076 . C G 56.74 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=869;Dels=0.00;HRun=2;HaplotypeScore=716.58;MQ=31.37;MQ0=95;QD=0.07;SB=276.82 GT:AD:DP:GL:GQ 0/1:773,41:392:-146.00,-137.04,-1458.73:89.57
-chr1 2575191 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=619;Dels=0.01;HRun=3;HaplotypeScore=666.18;MQ=32.68;MQ0=22;OQ=1037.47;QD=1.68;SB=-98.59 GT:AD:DP:GL:GQ 0/1:385,224:265:-186.87,-79.84,-734.84:99
-chr1 2575196 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=669;Dels=0.00;HRun=0;HaplotypeScore=585.81;MQ=31.95;MQ0=25;OQ=410.40;QD=0.61;SB=138.71 GT:AD:DP:GL:GQ 0/1:518,139:278:-128.14,-83.81,-902.17:99
-chr1 2575224 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=936;Dels=0.00;HRun=0;HaplotypeScore=711.05;MQ=30.70;MQ0=52;OQ=206.48;QD=0.22;SB=16.18 GT:AD:DP:GL:GQ 0/1:817,101:399:-165.30,-141.37,-1545.34:99
-chr1 2575246 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=981;Dels=0.00;HRun=1;HaplotypeScore=733.47;MQ=31.11;MQ0=67;OQ=1892.73;QD=1.93;SB=-760.65 GT:AD:DP:GL:GQ 0/1:771,204:430:-322.12,-129.56,-1274.76:99
-chr1 2575261 rs6692051 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=945;Dels=0.00;HRun=3;HaplotypeScore=358.84;MQ=32.03;MQ0=68;OQ=2338.43;QD=2.47;SB=-661.83 GT:AD:DP:GL:GQ 0/1:802,142:427:-365.78,-128.65,-1131.84:99
-chr1 2575299 . G T 161.49 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=614;Dels=0.00;HRun=1;HaplotypeScore=591.39;MQ=37.63;MQ0=50;QD=0.26;SB=20.79 GT:AD:DP:GL:GQ 0/1:494,69:362:-227.05,-207.62,-1136.93:99
-chr1 2575300 rs61765821 T C 1192.57 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=603;Dels=0.00;HRun=0;HaplotypeScore=567.88;MQ=38.04;MQ0=47;QD=1.98;SB=-535.85 GT:AD:DP:GL:GQ 0/1:348,222:348:-246.80,-124.26,-1045.28:99
-chr1 2575308 . C A 283.33 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=591;Dels=0.00;HRun=1;HaplotypeScore=502.16;MQ=39.21;MQ0=53;QD=0.48;SB=90.50 GT:AD:DP:GL:GQ 0/1:465,102:356:-142.06,-110.45,-1099.38:99
-chr1 2575350 rs28411086 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=541;Dels=0.00;HRun=2;HaplotypeScore=281.76;MQ=38.20;MQ0=48;OQ=2021.31;QD=3.74;SB=-545.18 GT:AD:DP:GL:GQ 0/1:247,291:277:-288.88,-83.46,-673.01:99
-chr1 2575391 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=992;Dels=0.00;HRun=2;HaplotypeScore=510.05;MQ=30.36;MQ0=68;OQ=227.39;QD=0.23;SB=145.08 GT:AD:DP:GL:GQ 0/1:854,132:434:-160.44,-134.42,-1359.22:99
-chr1 2575398 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1075;Dels=0.00;HRun=0;HaplotypeScore=310.34;MQ=30.19;MQ0=65;OQ=528.27;QD=0.49;SB=20.12 GT:AD:DP:GL:GQ 0/1:895,162:479:-203.83,-147.72,-1593.06:99
-chr1 2575422 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1315;Dels=0.00;HRun=1;HaplotypeScore=628.02;MQ=29.05;MQ0=70;OQ=417.47;QD=0.32;SB=307.23 GT:AD:DP:GL:GQ 0/1:1146,168:592:-223.40,-178.37,-1814.12:99
-chr1 2575443 rs6678990 C G 1968.81 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=1397;Dels=0.00;HRun=0;HaplotypeScore=834.10;MQ=29.41;MQ0=63;QD=1.41;SB=-880.90 GT:AD:DP:GL:GQ 0/1:1263,104:657:-428.32,-228.16,-2407.74:99
-chr1 2575448 . C T 306.07 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=1347;Dels=0.00;HRun=0;HaplotypeScore=969.72;MQ=29.55;MQ0=58;QD=0.23;SB=98.85 GT:AD:DP:GL:GQ 0/1:1166,127:596:-237.42,-203.53,-1765.67:99
-chr1 2575453 . G A 633.22 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=1324;Dels=0.01;HRun=0;HaplotypeScore=1094.28;MQ=29.55;MQ0=52;QD=0.48;SB=22.83 GT:AD:DP:GL:GQ 0/1:1098,210:631:-255.45,-188.85,-1774.06:99
-chr1 2575459 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1275;Dels=0.00;HRun=1;HaplotypeScore=976.35;MQ=29.72;MQ0=48;OQ=260.30;QD=0.20;SB=456.22 GT:AD:DP:GL:GQ 0/1:1186,88:626:-217.90,-188.59,-2068.65:99
-chr1 2575467 . A T 1827.05 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=1257;Dels=0.00;HRun=0;HaplotypeScore=1002.71;MQ=30.06;MQ0=39;QD=1.45;SB=-471.84 GT:AD:DP:GL:GQ 0/1:1025,208:608:-372.29,-186.30,-1881.69:99
-chr1 2575472 . C A 9687.38 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=1255;Dels=0.00;HRun=1;HaplotypeScore=858.65;MQ=30.07;MQ0=41;QD=7.72;SB=-1503.87 GT:AD:DP:GL:GQ 0/1:729,316:639:-967.74,-542.07,-1662.70:99
-chr1 2575476 rs28479903 C T 328.26 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=1232;Dels=0.00;HRun=0;HaplotypeScore=989.29;MQ=30.12;MQ0=43;QD=0.27;SB=122.56 GT:AD:DP:GL:GQ 0/1:1040,174:572:-219.19,-183.08,-1716.97:99
-chr1 2575484 rs61765822 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=1214;Dels=0.00;HRun=0;HaplotypeScore=468.08;MQ=30.51;MQ0=43;OQ=1888.53;QD=1.56;SB=-874.96 GT:AD:DP:GL:GQ 0/1:984,212:602:-396.91,-204.77,-1679.64:99
-chr1 2575509 rs7367485 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=1003;Dels=0.00;HRun=3;HaplotypeScore=708.39;MQ=31.59;MQ0=44;OQ=1317.31;QD=1.31;SB=-683.17 GT:AD:DP:GL:GQ 0/1:599,311:447:-397.20,-262.18,-1298.11:99
-chr1 2575527 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=899;Dels=0.00;HRun=1;HaplotypeScore=616.46;MQ=32.40;MQ0=36;OQ=2129.63;QD=2.37;SB=-658.87 GT:AD:DP:GL:GQ 0/1:666,188:432:-362.76,-146.52,-1154.94:99
-chr1 2575536 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=816;Dels=0.00;HRun=1;HaplotypeScore=629.02;MQ=33.06;MQ0=36;OQ=245.82;QD=0.30;SB=187.48 GT:AD:DP:GL:GQ 0/1:660,150:389:-147.61,-119.74,-1232.57:99
-chr1 2575553 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=672;Dels=0.00;HRun=0;HaplotypeScore=869.01;MQ=35.62;MQ0=23;OQ=1048.35;QD=1.56;SB=44.73 GT:AD:DP:GL:GQ 0/1:542,123:340:-220.20,-112.08,-1057.17:99
-chr1 2575577 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=529;Dels=0.00;HRun=0;HaplotypeScore=616.14;MQ=41.10;MQ0=11;OQ=295.55;QD=0.56;SB=93.12 GT:AD:DP:GL:GQ 0/1:363,155:340:-135.27,-102.43,-1079.29:99
-chr1 2575583 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=497;Dels=0.00;HRun=0;HaplotypeScore=739.15;MQ=41.67;MQ0=9;OQ=177.97;QD=0.36;SB=340.79 GT:AD:DP:GL:GQ 0/1:426,63:314:-122.58,-101.50,-1218.09:99
-chr1 2575632 rs6686754 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=363;Dels=0.00;HRun=1;HaplotypeScore=439.13;MQ=46.08;MQ0=4;OQ=7215.73;QD=19.88;SB=-2967.87 GT:AD:DP:GL:GQ 0/1:59,294:248:-720.57,-74.71,-189.55:99
-chr1 2575661 rs28498367 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=482;Dels=0.00;HRun=0;HaplotypeScore=598.03;MQ=41.57;MQ0=4;OQ=4453.10;QD=9.24;SB=-977.05 GT:AD:DP:GL:GQ 0/1:194,269:275:-444.31,-82.91,-730.02:99
-chr1 2575692 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=647;Dels=0.00;HRun=1;HaplotypeScore=594.08;MQ=36.97;MQ0=17;OQ=2155.18;QD=3.33;SB=272.10 GT:AD:DP:GL:GQ 0/1:259,365:295:-329.81,-111.01,-802.38:99
-chr1 2575711 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=667;Dels=0.00;HRun=3;HaplotypeScore=1191.59;MQ=36.49;MQ0=18;OQ=1467.43;QD=2.20;SB=-170.23 GT:AD:DP:GL:GQ 0/1:245,407:245:-231.00,-80.98,-619.30:99
-chr1 2575718 . C T 91.63 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=668;Dels=0.07;HRun=0;HaplotypeScore=726.36;MQ=36.74;MQ0=18;QD=0.14;SB=390.06 GT:AD:DP:GL:GQ 0/1:453,157:278:-93.88,-81.43,-798.07:99
-chr1 2575725 . C T 321.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=662;Dels=0.00;HRun=1;HaplotypeScore=724.85;MQ=36.17;MQ0=17;QD=0.49;SB=411.17 GT:AD:DP:GL:GQ 0/1:600,56:323:-132.74,-97.29,-1057.81:99
-chr1 2575728 . A T 148.72 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=660;Dels=0.00;HRun=0;HaplotypeScore=737.53;MQ=36.50;MQ0=17;QD=0.23;SB=417.37 GT:AD:DP:GL:GQ 0/1:600,48:321:-114.85,-96.69,-1096.48:99
-chr1 2575731 . G A 128.25 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=638;Dels=0.00;HRun=1;HaplotypeScore=523.34;MQ=37.45;MQ0=16;QD=0.20;SB=259.66 GT:AD:DP:GL:GQ 0/1:525,83:335:-143.82,-127.71,-1107.68:99
-chr1 2575750 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=473;Dels=0.00;HRun=1;HaplotypeScore=339.24;MQ=40.86;MQ0=6;OQ=314.90;QD=0.67;SB=-156.95 GT:AD:DP:GL:GQ 0/1:417,42:281:-123.25,-88.47,-781.88:99
-chr1 2575766 rs6694964 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=418;Dels=0.00;HRun=0;HaplotypeScore=190.54;MQ=43.00;MQ0=6;OQ=9217.59;QD=22.05;SB=-3555.11 GT:AD:DP:GL:GQ 0/1:33,383:267:-920.76,-80.43,-83.85:34.20
-chr1 2575784 rs28583924 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=426;Dels=0.00;HRun=0;HaplotypeScore=272.61;MQ=42.95;MQ0=8;OQ=181.28;QD=0.43;SB=6.29 GT:AD:DP:GL:GQ 0/1:359,64:257:-98.92,-77.51,-960.45:99
-chr1 2575825 rs6689281 T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=557;Dels=0.01;HRun=2;HaplotypeScore=469.61;MQ=35.81;MQ0=25;OQ=9475.08;QD=17.01;SB=-3650.18 GT:AD:DP:GL:GQ 1/1:3,541:282:-946.51,-86.27,-2.51:99
-chr1 2575851 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=634;Dels=0.00;HRun=0;HaplotypeScore=686.59;MQ=33.18;MQ0=30;OQ=77.00;QD=0.12;SB=-18.66 GT:AD:DP:GL:GQ 0/1:437,151:251:-86.73,-75.75,-723.32:99
-chr1 2575861 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=670;Dels=0.00;HRun=0;HaplotypeScore=1084.95;MQ=32.16;MQ0=34;OQ=174.30;QD=0.26;SB=144.01 GT:AD:DP:GL:GQ 0/1:448,201:255:-97.68,-76.97,-707.97:99
-chr1 2575918 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=659;Dels=0.00;HRun=0;HaplotypeScore=602.10;MQ=33.55;MQ0=33;OQ=1205.47;QD=1.83;SB=-331.68 GT:AD:DP:GL:GQ 0/1:520,139:294:-212.43,-88.60,-836.61:99
-chr1 2575963 rs61765824 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=414;Dels=0.00;HRun=0;HaplotypeScore=225.65;MQ=45.71;MQ0=16;OQ=175.37;QD=0.42;SB=-3.54 GT:AD:DP:GL:GQ 0/1:256,154:262:-99.81,-78.99,-882.64:99
-chr1 2576027 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=375;Dels=0.00;HRun=0;HaplotypeScore=441.20;MQ=41.08;MQ0=22;OQ=359.44;QD=0.96;SB=-25.38 GT:AD:DP:GL:GQ 0/1:347,27:212:-103.15,-63.92,-790.76:99
-chr1 2576035 rs55917765 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=384;Dels=0.02;HRun=4;HaplotypeScore=406.51;MQ=41.42;MQ0=19;OQ=289.17;QD=0.75;SB=-132.89 GT:AD:DP:GL:GQ 0/1:212,141:214:-106.50,-74.30,-717.21:99
-chr1 2576075 rs57994724 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=300;Dels=0.03;HRun=4;HaplotypeScore=363.80;MQ=42.84;MQ0=2;OQ=76.42;QD=0.25;SB=-28.60 GT:AD:DP:GL:GQ 0/1:192,90:162:-61.96,-51.03,-580.93:99
-chr1 2576111 rs58221160 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=281;Dels=0.00;HRun=1;HaplotypeScore=182.21;MQ=43.93;MQ0=7;OQ=597.72;QD=2.13;SB=-221.46 GT:AD:DP:GL:GQ 0/1:232,45:207:-125.42,-62.37,-596.71:99
-chr1 2576240 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1159;Dels=0.00;HRun=0;HaplotypeScore=623.69;MQ=25.02;MQ0=69;OQ=409.78;QD=0.35;SB=-223.95 GT:AD:DP:GL:GQ 0/1:968,178:369:-162.51,-118.25,-1426.92:99
-chr1 2576263 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1066;Dels=0.00;HRun=1;HaplotypeScore=622.37;MQ=26.52;MQ0=59;OQ=159.54;QD=0.15;SB=19.45 GT:AD:DP:GL:GQ 0/1:984,81:387:-135.82,-116.58,-1209.01:99
-chr1 2576333 . C G 40.07 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=1;HaplotypeScore=154.83;MQ=40.65;MQ0=29;QD=0.18;SB=-8.93 GT:AD:DP:GL:GQ 0/1:181,32:158:-64.21,-56.92,-644.64:72.91
-chr1 2576335 . C T 1221.15 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=167.65;MQ=40.55;MQ0=30;QD=5.65;SB=-581.17 GT:AD:DP:GL:GQ 0/1:122,94:144:-168.83,-43.43,-331.79:99
-chr1 2576336 rs28676518 G A 1105.16 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=214;Dels=0.00;HRun=0;HaplotypeScore=205.71;MQ=40.45;MQ0=30;QD=5.16;SB=-168.80 GT:AD:DP:GL:GQ 0/1:170,44:143:-156.87,-43.08,-364.02:99
-chr1 2576346 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=74.98;MQ=40.01;MQ0=31;OQ=210.24;QD=1.17;SB=-126.34 GT:AD:DP:GL:GQ 0/1:138,41:111:-57.78,-33.47,-394.51:99
-chr1 2576366 rs61765835 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=158;Dels=0.00;HRun=0;HaplotypeScore=35.61;MQ=33.02;MQ0=57;OQ=96.35;QD=0.61;SB=-36.52 GT:AD:DP:GL:GQ 0/1:92,66:79:-36.73,-23.81,-255.03:99
-chr1 2576428 rs61765837 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=303;Dels=0.00;HRun=2;HaplotypeScore=260.74;MQ=16.89;MQ0=145;OQ=101.18;QD=0.33;SB=-66.11 GT:AD:DP:GL:GQ 0/1:155,144:52:-29.09,-15.69,-174.52:99
-chr1 2576448 rs61765838 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=595;Dels=0.00;HRun=0;HaplotypeScore=426.54;MQ=17.45;MQ0=199;OQ=372.66;QD=0.63;SB=-42.53 GT:AD:DP:GL:GQ 0/1:377,206:114:-74.98,-34.43,-280.80:99
-chr1 2576460 rs61765839 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=687;Dels=0.00;HRun=1;HaplotypeScore=471.75;MQ=17.40;MQ0=212;OQ=453.85;QD=0.66;SB=-3.98 GT:AD:DP:GL:GQ 0/1:511,164:138:-90.25,-41.59,-375.50:99
-chr1 2576472 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=774;Dels=0.03;HRun=1;HaplotypeScore=800.59;MQ=17.54;MQ0=228;OQ=234.98;QD=0.30;SB=-38.37 GT:AD:DP:GL:GQ 0/1:618,98:166:-76.78,-50.00,-493.07:99
-chr1 2576534 rs57105227 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=374;Dels=0.00;HRun=1;HaplotypeScore=347.91;MQ=18.87;MQ0=112;OQ=329.07;QD=0.88;SB=-154.80 GT:AD:DP:GL:GQ 0/1:156,198:111:-73.27,-37.08,-391.39:99
-chr1 2576577 rs4648668 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=1;HaplotypeScore=59.62;MQ=22.81;MQ0=26;OQ=851.22;QD=6.98;SB=10.08 GT:AD:DP:GL:GQ 0/1:55,66:69:-109.20,-20.79,-201.97:99
-chr1 2576600 rs4648566 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=1;HaplotypeScore=109.15;MQ=20.95;MQ0=39;OQ=455.68;QD=3.38;SB=83.24 GT:AD:DP:GL:GQ 0/1:105,30:52:-64.51,-15.66,-117.10:99
-chr1 2576616 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=178.18;MQ=20.10;MQ0=38;OQ=374.43;QD=2.62;SB=-39.54 GT:AD:DP:GL:GQ 0/1:116,27:44:-54.00,-13.27,-93.80:99
-chr1 2576848 rs61765840 G T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=22.44;MQ=39.05;MQ0=35;OQ=52.46;QD=0.37;SB=-15.32 GT:AD:DP:GL:GQ 0/1:129,12:77:-31.72,-23.19,-231.93:85.30
-chr1 2577010 rs4648671 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=239;Dels=0.00;HRun=0;HaplotypeScore=65.16;MQ=37.14;MQ0=12;OQ=5199.52;QD=21.76;SB=-2266.90 GT:AD:DP:GL:GQ 1/1:7,232:163:-518.95,-49.17,-3.73:99
-chr1 2577062 rs28507281 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=0;HaplotypeScore=78.67;MQ=40.58;MQ0=11;OQ=1143.65;QD=3.88;SB=-492.64 GT:AD:DP:GL:GQ 0/1:238,57:237:-189.11,-71.46,-605.04:99
-chr1 2577084 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=72.39;MQ=39.59;MQ0=17;OQ=519.07;QD=1.69;SB=-15.56 GT:AD:DP:GL:GQ 0/1:259,48:248:-129.89,-74.70,-751.71:99
-chr1 2577123 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=291;Dels=0.00;HRun=1;HaplotypeScore=84.53;MQ=39.37;MQ0=26;OQ=265.40;QD=0.91;SB=-39.23 GT:AD:DP:GL:GQ 0/1:250,41:219:-95.80,-65.98,-773.71:99
-chr1 2577397 rs58719822 G C 0.55 PASS AC=2;AF=1.00;AN=2;DB;DP=190;Dels=0.00;HRun=0;HaplotypeScore=14.16;MQ=39.42;MQ0=19;OQ=6097.98;QD=32.09;SB=-764.81 GT:AD:DP:GL:GQ 1/1:1,189:137:-608.80,-41.28,-0.05:99
-chr1 2577433 rs60264562 G C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=207;Dels=0.05;HRun=4;HaplotypeScore=105.46;MQ=35.87;MQ0=25;OQ=5113.11;QD=24.70;SB=-614.98 GT:AD:DP:GL:GQ 1/1:9,184:123:-510.31,-38.53,-16.18:99
-chr1 2577515 . A C 17.95 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=331;Dels=0.00;HRun=3;HaplotypeScore=311.11;MQ=35.94;MQ0=23;QD=0.05;SB=173.50 GT:AD:DP:GL:GQ 0/1:258,71:167:-55.40,-50.33,-521.31:50.72
-chr1 2577549 rs4648567 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=289;Dels=0.00;HRun=0;HaplotypeScore=107.18;MQ=38.40;MQ0=7;OQ=5448.91;QD=18.85;SB=-2125.98 GT:AD:DP:GL:GQ 1/1:24,231:174:-543.89,-82.79,-51.97:99
-chr1 2577655 . G C 44.44 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=2;HaplotypeScore=58.73;MQ=26.75;MQ0=23;QD=0.33;SB=26.12 GT:AD:DP:GL:GQ 0/1:116,10:43:-24.31,-16.59,-159.35:77.27
-chr1 2577671 rs58842912 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=128.81;MQ=16.71;MQ0=28;OQ=137.08;QD=1.46;SB=-35.94 GT:AD:DP:GL:GQ 0/1:63,25:12:-20.61,-3.62,-16.30:99
-chr1 2577677 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=3;HaplotypeScore=117.98;MQ=17.54;MQ0=28;OQ=281.66;QD=3.03;SB=-45.56 GT:AD:DP:GL:GQ 0/1:33,58:12:-35.06,-3.61,-7.69:40.79
-chr1 2577682 . T C 14.20 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=57.79;MQ=17.58;MQ0=34;QD=0.14;SB=-10.00 GT:AD:DP:GL:GQ 0/1:68,26:4:-5.89,-1.21,-7.84:46.86
-chr1 2577700 . T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=167.08;MQ=18.58;MQ0=41;OQ=266.89;QD=2.36;SB=-10.00 GT:AD:DP:GL:GQ 1/1:35,36:10:-34.52,-6.65,-4.25:23.97
-chr1 2577709 . C T 15.40 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=131;Dels=0.00;HRun=0;HaplotypeScore=233.03;MQ=18.07;MQ0=48;QD=0.12;SB=-10.00 GT:AD:DP:GL:GQ 0/1:96,13:7:-9.83,-5.02,-17.83:48.10
-chr1 2577721 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=182;Dels=0.00;HRun=0;HaplotypeScore=74.87;MQ=18.10;MQ0=63;OQ=399.60;QD=2.20;SB=-10.00 GT:AD:DP:GL:GQ 0/1:147,35:41:-55.60,-12.35,-87.25:99
-chr1 2577722 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=54.78;MQ=18.15;MQ0=62;OQ=179.28;QD=0.99;SB=-10.00 GT:AD:DP:GL:GQ 0/1:160,20:38:-32.69,-11.48,-98.33:99
-chr1 2577735 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=37.61;MQ=17.86;MQ0=65;OQ=262.32;QD=1.37;SB=-10.00 GT:AD:DP:GL:GQ 0/1:173,18:55:-46.08,-16.57,-148.55:99
-chr1 2577740 rs61763463 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=1;HaplotypeScore=34.83;MQ=17.84;MQ0=63;OQ=1671.60;QD=8.99;SB=-10.00 GT:AD:DP:GL:GQ 0/1:52,133:54:-186.71,-16.27,-40.75:99
-chr1 2577765 . C A 125.78 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=41.35;MQ=16.77;MQ0=52;QD=0.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:91,53:26:-23.70,-7.84,-54.51:99
-chr1 2577769 . C T 71.72 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=43.82;MQ=16.10;MQ0=52;QD=0.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:87,47:21:-16.80,-6.34,-49.74:99
-chr1 2577770 . G C 89.65 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=1;HaplotypeScore=42.82;MQ=16.09;MQ0=52;QD=0.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:85,48:21:-18.58,-6.33,-66.40:99
-chr1 2577784 rs61761450 G C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=108;Dels=0.00;HRun=0;HaplotypeScore=93.26;MQ=15.12;MQ0=44;OQ=499.20;QD=4.62;SB=-10.00 GT:AD:DP:GL:GQ 1/1:36,72:12:-53.51,-3.62,-0.00:36.12
-chr1 2577796 rs28368363 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=154.23;MQ=14.20;MQ0=39;OQ=53.95;QD=0.56;SB=-10.00 GT:AD:DP:GL:GQ 0/1:68,23:5:-10.19,-1.51,-6.10:45.96
-chr1 2577799 rs61765844 A C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=4;HaplotypeScore=106.56;MQ=13.50;MQ0=38;OQ=136.44;QD=1.53;SB=-10.00 GT:AD:DP:GL:GQ 1/1:37,52:5:-17.20,-1.51,-0.00:15.04
-chr1 2577815 rs61761446 G A 0.11 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=16.91;MQ=12.99;MQ0=33;OQ=113.87;QD=2.19;SB=-10.00 GT:AD:DP:GL:GQ 1/1:30,21:4:-14.92,-1.21,-0.00:12.04
-chr1 2577825 . G A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=32.84;MQ=14.16;MQ0=28;OQ=149.17;QD=3.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:28,19:5:-18.48,-1.51,-0.00:15.04
-chr1 2577833 . C T 42.25 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=22.86;MQ=13.04;MQ0=28;QD=0.98;SB=-10.00 GT:AD:DP:GL:GQ 1/1:33,10:2:-7.63,-0.60,-0.00:6.02
-chr1 2577851 . G T 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=11.27;MQ=14.57;MQ0=20;OQ=148.54;QD=4.24;SB=-10.00 GT:AD:DP:GL:GQ 1/1:17,14:6:-18.43,-1.81,-0.01:18.02
-chr1 2577883 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=114.78;MQ=19.71;MQ0=31;OQ=87.78;QD=0.84;SB=-10.00 GT:AD:DP:GL:GQ 0/1:82,22:16:-16.89,-4.83,-35.06:99
-chr1 2577892 rs61761448 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=139.63;MQ=19.08;MQ0=41;OQ=358.39;QD=3.04;SB=-10.00 GT:AD:DP:GL:GQ 0/1:46,69:13:-43.04,-3.92,-5.80:18.77
-chr1 2577904 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=169.18;MQ=18.99;MQ0=45;OQ=432.72;QD=3.38;SB=-10.00 GT:AD:DP:GL:GQ 0/1:56,72:16:-51.38,-4.83,-6.85:20.23
-chr1 2577913 . A G 43.14 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=228.63;MQ=18.89;MQ0=43;QD=0.37;SB=-10.00 GT:AD:DP:GL:GQ 0/1:102,14:7:-9.71,-2.11,-14.52:75.98
-chr1 2577923 . G A 12.44 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=139.34;MQ=19.75;MQ0=38;QD=0.10;SB=-10.00 GT:AD:DP:GL:GQ 0/1:84,37:10:-7.51,-3.01,-26.55:45.02
-chr1 2577924 . T C 61.88 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=137.09;MQ=19.68;MQ0=38;QD=0.52;SB=-10.00 GT:AD:DP:GL:GQ 0/1:94,23:11:-12.79,-3.32,-26.27:94.71
-chr1 2577931 rs61763465 G C 371.46 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=106.32;MQ=19.54;MQ0=35;QD=3.50;SB=-10.00 GT:AD:DP:GL:GQ 1/1:30,75:9:-40.73,-2.71,-0.00:27.09
-chr1 2577945 rs61765845 G C 1059.87 HARD_TO_VALIDATE;Indel AC=2;AF=1.00;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=141.04;MQ=19.73;MQ0=38;QD=10.00;SB=-10.00 GT:AD:DP:GL:GQ 1/1:31,70:26:-113.65,-11.26,-4.08:71.85
-chr1 2577953 . A G 356.53 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=136.50;MQ=18.50;MQ0=43;QD=3.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:78,20:16:-43.76,-4.82,-8.02:32
-chr1 2577977 . G A 20.69 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=1;HaplotypeScore=16.21;MQ=15.79;MQ0=48;QD=0.27;SB=-10.00 GT:AD:DP:GL:GQ 0/1:72,5:20:-11.37,-6.02,-58.36:53.49
-chr1 2579397 rs61761374 C G 193.05 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=22.35;MQ0=6;OQ=1341.59;QD=14.91;SB=-551.47 GT:AD:DP:GL:GQ 0/1:44,46:77:-160.66,-23.22,-161.20:99
-chr1 2580726 . T G 35.92 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=5.25;MQ0=59;QD=0.59;SB=-10.00 GT:AD:DP:GL:GQ 1/1:58,2:2:-7.00,-0.60,-0.00:6.02
-chr1 2580768 . T C 36.28 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=5.74;MQ0=49;QD=0.71;SB=-10.00 GT:AD:DP:GL:GQ 1/1:46,5:2:-7.04,-0.60,-0.00:6.02
-chr1 2580784 rs11488598 T A 45.88 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=6.33;MQ0=40;QD=1.09;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,41:2:-8.00,-0.60,-0.00:6.02
-chr1 2581065 rs61761440 A C 33.92 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=9.03;MQ=10.33;MQ0=29;QD=0.71;SB=-10.00 GT:AD:DP:GL:GQ 1/1:28,20:2:-6.80,-0.60,-0.00:6.02
-chr1 2581076 . T A 42.69 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=11.35;MQ0=18;QD=1.33;SB=-10.00 GT:AD:DP:GL:GQ 1/1:16,15:2:-7.68,-0.60,-0.00:6.02
-chr1 2581088 . A C 35.92 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=15.32;MQ0=5;QD=3.27;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,8:2:-7.00,-0.60,-0.00:6.02
-chr1 2581203 . C G 46.77 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=10.81;MQ0=53;QD=0.69;SB=5.05 GT:AD:DP:GL:GQ 0/1:57,11:14:-12.18,-4.22,-47.55:79.61
-chr1 2581221 rs4648702 C A 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=1;HaplotypeScore=12.38;MQ=17.15;MQ0=42;OQ=109.22;QD=1.11;SB=-5.56 GT:AD:DP:GL:GQ 0/1:80,16:46:-28.07,-13.86,-128.22:99
-chr1 2581257 rs4648701 T A 0.08 PASS AC=2;AF=1.00;AN=2;DB;DP=134;Dels=0.00;HRun=0;HaplotypeScore=5.16;MQ=20.38;MQ0=25;OQ=3859.45;QD=28.80;SB=-1801.06 GT:AD:DP:GL:GQ 1/1:0,134:101:-384.94,-30.42,-0.03:99
-chr1 2587428 . A C 37.49 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=14.36;MQ0=8;QD=1.10;SB=-45.01 GT:AD:DP:GL:GQ 1/1:0,34:2:-7.16,-0.60,-0.00:6.02
-chr1 2593169 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=425;Dels=0.00;HRun=1;HaplotypeScore=105.62;MQ=17.46;MQ0=82;OQ=848.96;QD=2.00;SB=-332.82 GT:AD:DP:GL:GQ 0/1:365,60:163:-137.29,-49.11,-428.79:99
-chr1 2596443 . C T 41.24 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=12.40;MQ0=7;QD=3.75;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,4:2:-7.53,-0.60,-0.00:6.02
-chr1 2596445 . T G 36.05 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=2.31;MQ=11.87;MQ0=8;QD=3.00;SB=-10.00 GT:AD:DP:GL:GQ 1/1:5,7:2:-7.01,-0.60,-0.00:6.02
-chr1 2596476 . G A 46.02 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=60;Dels=0.00;HRun=1;HaplotypeScore=26.89;MQ=5.53;MQ0=56;QD=0.77;SB=-10.00 GT:AD:DP:GL:GQ 1/1:58,2:2:-8.01,-0.60,-0.00:6.02
-chr1 2596850 . G C 35.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=11.43;MQ0=28;QD=0.82;SB=-10.00 GT:AD:DP:GL:GQ 0/1:29,14:5:-8.30,-1.51,-13.08:67.88
-chr1 2596943 . C A 49.59 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=50.99;MQ=11.35;MQ0=54;QD=0.70;SB=-6.99 GT:AD:DP:GL:GQ 0/1:65,5:13:-12.16,-3.92,-30.66:82.43
-chr1 2597318 . T C 31.81 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=14.62;MQ=5.54;MQ0=70;QD=0.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:73,2:2:-6.59,-0.60,-0.00:6.01
-chr1 2598250 . T A 27.90 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=1;HaplotypeScore=2.24;MQ=16.56;MQ0=5;QD=1.27;SB=-0.98 GT:AD:DP:GL:GQ 0/1:19,3:5:-7.58,-1.51,-10.62:60.73
-chr1 2598257 . G T 12.16 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=15.61;MQ0=8;QD=0.55;SB=-0.98 GT:AD:DP:GL:GQ 0/1:19,3:5:-5.98,-1.51,-10.70:44.72
-chr1 2598656 . G A 10.26 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=1;HaplotypeScore=114.17;MQ=5.78;MQ0=152;QD=0.06;SB=-10.00 GT:AD:DP:GL:GQ 0/1:161,14:1:-4.27,-0.30,-0.00:1.76
-chr1 2598795 . G A 10.26 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=47.85;MQ=7.17;MQ0=69;QD=0.12;SB=-10.00 GT:AD:DP:GL:GQ 0/1:84,2:1:-4.27,-0.30,-0.00:1.76
-chr1 2598944 . A C 17.83 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=1;HaplotypeScore=67.67;MQ=10.48;MQ0=39;QD=0.27;SB=-25.99 GT:AD:DP:GL:GQ 0/1:48,17:3:-5.96,-0.91,-2.50:15.92
-chr1 2598946 . A G 34.06 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=82.40;MQ=11.36;MQ0=42;QD=0.46;SB=-10.00 GT:AD:DP:GL:GQ 0/1:70,4:3:-7.59,-0.90,-4.17:32.64
-chr1 2598950 . C A 54.26 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=105.52;MQ=12.29;MQ0=47;QD=0.53;SB=-3.99 GT:AD:DP:GL:GQ 0/1:94,7:7:-10.82,-2.11,-14.32:87.10
-chr1 2599001 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=31.75;MQ=12.68;MQ0=54;OQ=83.85;QD=0.63;SB=-3.99 GT:AD:DP:GL:GQ 0/1:91,33:10:-18.26,-6.59,-21.60:99
-chr1 2599015 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=2;HaplotypeScore=24.68;MQ=11.50;MQ0=72;OQ=64.97;QD=0.46;SB=-43.54 GT:AD:DP:GL:GQ 0/1:128,12:9:-12.49,-2.71,-23.15:97.80
-chr1 2599040 rs61761456 A T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=133;Dels=0.00;HRun=0;HaplotypeScore=87.15;MQ=9.23;MQ0=88;OQ=72.77;QD=0.55;SB=-10.00 GT:AD:DP:GL:GQ 1/1:81,14:5:-17.43,-7.71,-6.64:10.71
-chr1 2599044 rs61761457 T A 33.25 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=131;Dels=0.00;HRun=1;HaplotypeScore=64.29;MQ=9.30;MQ0=86;QD=0.25;SB=-10.00 GT:AD:DP:GL:GQ 0/1:104,11:6:-11.67,-5.06,-13.57:66.08
-chr1 2599198 . C T 23.45 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=16.24;MQ=14.99;MQ0=19;QD=0.50;SB=-3.99 GT:AD:DP:GL:GQ 0/1:29,18:5:-7.14,-1.51,-10.24:56.27
-chr1 2599218 . G A 105.55 HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=106.10;MQ=16.73;MQ0=11;QD=2.29;SB=-69.07 GT:AD:DP:GL:GQ 0/1:28,17:6:-15.65,-1.81,-6.14:43.30
-chr1 2599225 . C G 35.32 HARD_TO_VALIDATE;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=82.64;MQ=16.87;MQ0=11;QD=0.78;SB=-10.88 GT:AD:DP:GL:GQ 0/1:36,6:7:-14.02,-7.20,-19.31:68.16
-chr1 2599228 . G A 323.86 HARD_TO_VALIDATE;Indel;SnpCluster AC=2;AF=1.00;AN=2;DP=46;Dels=0.04;HRun=0;HaplotypeScore=68.32;MQ=16.68;MQ0=12;QD=7.04;SB=-89.34 GT:AD:DP:GL:GQ 1/1:16,28:10:-35.98,-3.02,-0.01:30.08
-chr1 2599239 . T A 19.57 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=43.45;MQ=14.62;MQ0=19;QD=0.36;SB=-4.42 GT:AD:DP:GL:GQ 0/1:49,2:7:-12.49,-7.25,-17.00:52.36
-chr1 2599247 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=40.77;MQ=14.18;MQ0=20;OQ=70.13;QD=1.35;SB=-7.01 GT:AD:DP:GL:GQ 0/1:29,21:6:-12.11,-1.81,-8.56:67.52
-chr1 2599654 . G C 12.35 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=26.39;MQ=2.65;MQ0=119;QD=0.10;SB=-10.00 GT:AD:DP:GL:GQ 0/1:119,1:1:-4.49,-0.30,-0.00:1.76
-chr1 2601422 . A G 25.82 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=10.71;MQ=4.09;MQ0=110;QD=0.23;SB=-10.00 GT:AD:DP:GL:GQ 1/1:99,14:2:-5.99,-0.60,-0.00:6.01
-chr1 2601437 . T C 35.28 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=3.79;MQ0=129;QD=0.27;SB=-10.00 GT:AD:DP:GL:GQ 1/1:103,30:2:-6.94,-0.60,-0.00:6.02
-chr1 2601504 . G A 41.24 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=19.74;MQ=3.30;MQ0=165;QD=0.25;SB=-10.00 GT:AD:DP:GL:GQ 1/1:158,9:2:-7.53,-0.60,-0.00:6.02
-chr1 2601515 . A C 43.05 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=155;Dels=0.00;HRun=2;HaplotypeScore=7.29;MQ=3.29;MQ0=153;QD=0.28;SB=-10.00 GT:AD:DP:GL:GQ 1/1:91,64:2:-7.71,-0.60,-0.00:6.02
-chr1 2601516 . G A 0.02 FDRtranche1.00to2.00 AC=2;AF=1.00;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=6.38;MQ=3.29;MQ0=153;OQ=51.25;QD=0.33;SB=-10.00 GT:AD:DP:GL:GQ 1/1:89,66:2:-8.53,-0.60,-0.00:6.02
-chr1 2601859 . G A 39.02 DPFilter;HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=20.82;MQ=4.64;MQ0=146;QD=0.24;SB=-10.00 GT:AD:DP:GL:GQ 1/1:150,13:2:-7.31,-0.60,-0.00:6.02
-chr1 2603248 rs11486046 A C 0.95 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=4;HaplotypeScore=1.14;MQ=19.37;MQ0=3;OQ=283.27;QD=11.33;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,23:9:-31.91,-2.71,-0.00:27.08
-chr1 2603587 . A G 31.28 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=24.46;MQ=5.10;MQ0=81;QD=0.34;SB=-10.00 GT:AD:DP:GL:GQ 1/1:74,19:2:-6.54,-0.60,-0.00:6.01
-chr1 2603630 . C T 0.04 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.88;MQ=7.26;MQ0=55;OQ=82.12;QD=1.35;SB=-10.00 GT:AD:DP:GL:GQ 1/1:51,10:3:-11.70,-0.90,-0.00:9.03
-chr1 2603684 . A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=23.79;MQ=8.35;MQ0=58;OQ=160.35;QD=2.36;SB=-10.00 GT:AD:DP:GL:GQ 1/1:55,13:6:-19.61,-1.81,-0.00:18.04
-chr1 2603850 . C G 10.08 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=0;HaplotypeScore=68.31;MQ=3.10;MQ0=215;QD=0.04;SB=-10.00 GT:AD:DP:GL:GQ 0/1:213,10:1:-4.25,-0.30,-0.00:1.76
-chr1 2604182 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=169;Dels=0.00;HRun=1;HaplotypeScore=49.21;MQ=7.86;MQ0=143;OQ=70.78;QD=0.42;SB=-10.00 GT:AD:DP:GL:GQ 0/1:162,7:11:-13.68,-3.31,-27.79:99
-chr1 2604202 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=66.53;MQ=7.81;MQ0=146;OQ=55.73;QD=0.32;SB=-10.00 GT:AD:DP:GL:GQ 0/1:164,10:11:-12.17,-3.31,-27.45:88.56
-chr1 2604211 . C A 34.20 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=110.16;MQ=8.09;MQ0=168;QD=0.17;SB=-10.00 GT:AD:DP:GL:GQ 0/1:190,11:14:-10.92,-4.22,-40.03:67.04
-chr1 2604257 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=82.11;MQ=12.16;MQ0=114;OQ=80.38;QD=0.46;SB=32.96 GT:AD:DP:GL:GQ 0/1:146,20:31:-22.91,-11.59,-89.29:99
-chr1 2604263 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=1;HaplotypeScore=133.02;MQ=12.71;MQ0=105;OQ=191.66;QD=1.14;SB=50.18 GT:AD:DP:GL:GQ 0/1:122,46:33:-32.40,-9.95,-88.01:99
-chr1 2604269 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=77.37;MQ=13.05;MQ0=90;OQ=192.77;QD=1.32;SB=17.43 GT:AD:DP:GL:GQ 0/1:70,69:33:-34.89,-12.33,-71.96:99
-chr1 2604305 . T A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=7.47;MQ=17.34;MQ0=29;OQ=55.74;QD=0.69;SB=74.25 GT:AD:DP:GL:GQ 0/1:58,22:37:-20.01,-11.15,-121.92:88.58
-chr1 2604310 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.63;MQ=18.11;MQ0=23;OQ=69.18;QD=0.93;SB=74.24 GT:AD:DP:GL:GQ 0/1:55,19:37:-21.34,-11.14,-111.00:99
-chr1 2604358 . C T 71.23 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=145.78;MQ=14.15;MQ0=44;QD=0.82;SB=11.06 GT:AD:DP:GL:GQ 0/1:71,13:12:-14.02,-3.62,-30.75:99
-chr1 2604359 . C A 74.64 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=131.89;MQ=14.13;MQ0=41;QD=0.91;SB=5.02 GT:AD:DP:GL:GQ 0/1:26,56:10:-13.76,-3.01,-18.66:99
-chr1 2604363 . G C 180.85 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=2;HaplotypeScore=137.79;MQ=13.57;MQ0=46;QD=2.10;SB=2.04 GT:AD:DP:GL:GQ 0/1:29,40:11:-24.68,-3.31,-21.48:99
-chr1 2604377 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=82.82;MQ=13.39;MQ0=50;OQ=54.76;QD=0.61;SB=-10.00 GT:AD:DP:GL:GQ 0/1:65,25:4:-9.97,-1.21,-3.57:23.65
-chr1 2604397 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=1;HaplotypeScore=150.87;MQ=13.17;MQ0=49;OQ=71.12;QD=0.83;SB=-10.00 GT:AD:DP:GL:GQ 0/1:47,38:4:-11.60,-1.21,-3.90:26.92
-chr1 2604403 . T C 38.45 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=82;Dels=0.00;HRun=2;HaplotypeScore=145.51;MQ=12.80;MQ0=46;QD=0.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:13,58:3:-10.84,-4.28,-3.54:7.45
-chr1 2604424 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=48.30;MQ=13.20;MQ0=33;OQ=76.83;QD=1.35;SB=-6.99 GT:AD:DP:GL:GQ 0/1:21,30:6:-12.78,-1.81,-6.73:49.16
-chr1 2604431 . C T 25.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=33.49;MQ=13.71;MQ0=25;QD=0.55;SB=-7.01 GT:AD:DP:GL:GQ 0/1:40,3:5:-7.32,-1.51,-9.43:58.07
-chr1 2604444 . G C 43.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=38.64;MQ=15.55;MQ0=13;QD=1.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,16:4:-12.26,-4.63,-7.13:24.99
-chr1 2604449 . G C 30.45 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=21;Dels=0.10;HRun=4;HaplotypeScore=30.98;MQ=14.63;MQ0=12;QD=1.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,6:4:-11.16,-4.83,-7.63:28
-chr1 2604508 . G C 0.07 PASS AC=2;AF=1.00;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=11.01;MQ=14.95;MQ0=13;OQ=265.66;QD=7.81;SB=-10.00 GT:AD:DP:GL:GQ 1/1:9,25:7:-30.15,-2.11,-0.00:21.07
-chr1 2604516 . G T 0.07 PASS AC=2;AF=1.00;AN=2;DP=41;Dels=0.00;HRun=1;HaplotypeScore=5.00;MQ=14.42;MQ0=18;OQ=191.90;QD=4.68;SB=-10.00 GT:AD:DP:GL:GQ 1/1:15,26:7:-22.77,-2.11,-0.00:21.05
-chr1 2604535 rs61763522 A G 0.35 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=9.63;MQ=11.76;MQ0=38;OQ=251.64;QD=3.87;SB=-10.00 GT:AD:DP:GL:GQ 1/1:12,53:8:-28.75,-2.41,-0.00:24.07
-chr1 2604555 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=35.24;MQ=12.18;MQ0=57;OQ=115.73;QD=1.24;SB=14.08 GT:AD:DP:GL:GQ 0/1:66,27:12:-18.47,-3.62,-35.84:99
-chr1 2604572 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=3;HaplotypeScore=50.74;MQ=13.39;MQ0=78;OQ=55.27;QD=0.40;SB=20.07 GT:AD:DP:GL:GQ 0/1:127,10:20:-14.84,-6.03,-56.38:88.11
-chr1 2604579 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=62.98;MQ=13.28;MQ0=75;OQ=144.76;QD=1.05;SB=20.08 GT:AD:DP:GL:GQ 0/1:125,13:18:-23.19,-5.43,-45.19:99
-chr1 2604585 rs61763523 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=140;Dels=0.00;HRun=1;HaplotypeScore=70.32;MQ=13.11;MQ0=76;OQ=158.49;QD=1.13;SB=-6.99 GT:AD:DP:GL:GQ 0/1:102,37:9:-21.84,-2.71,-10.97:82.64
-chr1 2604597 . A G 110.83 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=107.90;MQ=13.27;MQ0=78;QD=0.74;SB=8.05 GT:AD:DP:GL:GQ 0/1:135,14:14:-18.58,-4.22,-35.74:99
-chr1 2604601 . A C 218.40 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=111.25;MQ=13.41;MQ0=75;QD=1.51;SB=4.22 GT:AD:DP:GL:GQ 0/1:108,36:15:-33.23,-8.10,-26.51:99
-chr1 2604603 . T C 273.40 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=2;HaplotypeScore=107.87;MQ=13.23;MQ0=76;QD=1.89;SB=-75.88 GT:AD:DP:GL:GQ 0/1:65,76:14:-34.84,-4.22,-16.55:99
-chr1 2604631 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=169;Dels=0.00;HRun=1;HaplotypeScore=78.83;MQ=15.93;MQ0=66;OQ=130.30;QD=0.77;SB=-43.00 GT:AD:DP:GL:GQ 0/1:129,40:31:-25.65,-9.34,-87.13:99
-chr1 2604640 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=154;Dels=0.00;HRun=0;HaplotypeScore=101.27;MQ=16.99;MQ0=53;OQ=84.42;QD=0.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:93,61:34:-21.98,-10.25,-116.76:99
-chr1 2604659 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=114.19;MQ=17.85;MQ0=39;OQ=180.46;QD=1.31;SB=-10.00 GT:AD:DP:GL:GQ 0/1:106,32:34:-31.57,-10.24,-88.52:99
-chr1 2604673 rs7415296 T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=120;Dels=0.00;HRun=1;HaplotypeScore=73.29;MQ=18.57;MQ0=29;OQ=1125.63;QD=9.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,107:33:-116.16,-9.94,-0.01:99
-chr1 2604706 rs6673862 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=39.35;MQ=23.53;MQ0=16;OQ=454.13;QD=4.83;SB=-3.99 GT:AD:DP:GL:GQ 0/1:51,43:41:-61.05,-12.35,-88.54:99
-chr1 2604709 rs6604993 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=41.02;MQ=25.10;MQ0=15;OQ=512.66;QD=5.40;SB=-34.93 GT:AD:DP:GL:GQ 0/1:48,47:45:-68.11,-13.56,-92.92:99
-chr1 2604721 rs61763524 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=115.04;MQ=25.76;MQ0=12;OQ=386.36;QD=4.15;SB=-44.44 GT:AD:DP:GL:GQ 0/1:49,44:40:-53.97,-12.05,-114.41:99
-chr1 2604728 rs61763525 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=150.75;MQ=27.24;MQ0=8;OQ=52.75;QD=0.62;SB=-10.00 GT:AD:DP:GL:GQ 0/1:49,22:37:-19.70,-11.14,-117.15:85.59
-chr1 2604813 rs6687492 A C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.04;HRun=2;HaplotypeScore=47.11;MQ=23.79;MQ0=20;OQ=1537.32;QD=16.53;SB=-154.02 GT:AD:DP:GL:GQ 1/1:2,87:44:-157.33,-12.95,-0.02:99
-chr1 2604848 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=9.77;MQ=17.69;MQ0=30;OQ=71.77;QD=1.30;SB=-10.00 GT:AD:DP:GL:GQ 0/1:37,18:14:-14.68,-4.22,-36.61:99
-chr1 2604864 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=28.67;MQ=16.02;MQ0=35;OQ=77.33;QD=1.17;SB=-10.00 GT:AD:DP:GL:GQ 0/1:62,4:12:-14.63,-3.61,-28.91:99
-chr1 2604867 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=23.02;MQ=16.18;MQ0=37;OQ=170.35;QD=2.43;SB=-10.00 GT:AD:DP:GL:GQ 0/1:59,11:15:-24.84,-4.52,-31.52:99
-chr1 2604879 . A G 48.78 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=25.49;MQ=18.59;MQ0=41;QD=0.57;SB=-6.99 GT:AD:DP:GL:GQ 0/1:79,7:20:-14.19,-6.03,-66.66:81.62
-chr1 2604892 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=1;HaplotypeScore=62.88;MQ=20.71;MQ0=36;OQ=145.34;QD=1.60;SB=-40.00 GT:AD:DP:GL:GQ 0/1:67,21:27:-25.95,-8.13,-71.88:99
-chr1 2604894 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.01;HRun=1;HaplotypeScore=55.68;MQ=20.44;MQ0=36;OQ=138.96;QD=1.49;SB=-41.95 GT:AD:DP:GL:GQ 0/1:67,21:26:-25.01,-7.83,-77.06:99
-chr1 2604912 rs61763528 T G 20.95 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=50.36;MQ=22.66;MQ0=25;QD=0.19;SB=-10.00 GT:AD:DP:GL:GQ 0/1:76,35:29:-14.11,-8.74,-95.07:53.75
-chr1 2604916 rs61763529 T G 194.85 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=113;Dels=0.00;HRun=0;HaplotypeScore=46.31;MQ=24.02;MQ0=23;QD=1.72;SB=-10.00 GT:AD:DP:GL:GQ 0/1:75,37:38:-34.21,-11.44,-107.06:99
-chr1 2604917 rs61763530 C G 1480.34 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=47.31;MQ=24.13;MQ0=22;QD=13.22;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,96:38:-168.50,-25.75,-16.88:88.75
-chr1 2604946 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=1;HaplotypeScore=63.84;MQ=27.71;MQ0=21;OQ=79.42;QD=0.34;SB=27.56 GT:AD:DP:GL:GQ 0/1:204,31:106:-43.16,-31.93,-335.49:99
-chr1 2604947 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=1;HaplotypeScore=57.70;MQ=27.78;MQ0=20;OQ=56.57;QD=0.24;SB=26.25 GT:AD:DP:GL:GQ 0/1:201,34:107:-41.17,-32.23,-378.22:89.40
-chr1 2604959 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=241;Dels=0.00;HRun=1;HaplotypeScore=113.45;MQ=29.01;MQ0=17;OQ=854.86;QD=3.55;SB=-18.43 GT:AD:DP:GL:GQ 0/1:165,75:109:-121.61,-32.84,-284.29:99
-chr1 2604960 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=123.76;MQ=29.06;MQ0=17;OQ=593.64;QD=2.47;SB=71.18 GT:AD:DP:GL:GQ 0/1:190,50:108:-95.18,-32.53,-286.72:99
-chr1 2604983 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=1;HaplotypeScore=495.52;MQ=29.66;MQ0=13;OQ=71.64;QD=0.32;SB=60.44 GT:AD:DP:GL:GQ 0/1:161,61:71:-31.89,-21.44,-242.50:99
-chr1 2604984 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=666.90;MQ=29.67;MQ0=14;OQ=53.59;QD=0.24;SB=51.85 GT:AD:DP:GL:GQ 0/1:162,59:73:-33.13,-24.49,-250.82:86.43
-chr1 2604994 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=301;Dels=0.00;HRun=1;HaplotypeScore=445.50;MQ=27.33;MQ0=32;OQ=911.93;QD=3.03;SB=-289.52 GT:AD:DP:GL:GQ 0/1:244,47:103:-139.58,-45.10,-310.97:99
-chr1 2605000 . A G 39.90 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=313;Dels=0.00;HRun=0;HaplotypeScore=296.02;MQ=26.42;MQ0=37;QD=0.13;SB=95.30 GT:AD:DP:GL:GQ 0/1:236,73:110:-42.96,-35.69,-387.52:72.73
-chr1 2605008 . C A 80.14 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=1;HaplotypeScore=230.13;MQ=26.37;MQ0=45;QD=0.26;SB=104.26 GT:AD:DP:GL:GQ 0/1:278,18:127:-64.22,-52.92,-396.67:99
-chr1 2605010 . C A 77.92 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=1;HaplotypeScore=334.39;MQ=26.26;MQ0=46;QD=0.25;SB=101.18 GT:AD:DP:GL:GQ 0/1:276,18:125:-51.79,-40.71,-371.85:99
-chr1 2605026 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=292;Dels=0.00;HRun=0;HaplotypeScore=503.51;MQ=24.87;MQ0=63;OQ=127.24;QD=0.44;SB=-33.91 GT:AD:DP:GL:GQ 0/1:107,181:82:-40.71,-24.70,-242.51:99
-chr1 2605040 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=333;Dels=0.00;HRun=0;HaplotypeScore=585.35;MQ=23.26;MQ0=69;OQ=164.03;QD=0.49;SB=60.04 GT:AD:DP:GL:GQ 0/1:234,98:87:-48.89,-29.20,-293.13:99
-chr1 2605055 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=0;HaplotypeScore=493.35;MQ=22.62;MQ0=80;OQ=367.10;QD=0.93;SB=90.44 GT:AD:DP:GL:GQ 0/1:300,89:126:-77.94,-37.95,-375.51:99
-chr1 2605064 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=394;Dels=0.00;HRun=1;HaplotypeScore=562.83;MQ=22.35;MQ0=77;OQ=111.09;QD=0.28;SB=241.07 GT:AD:DP:GL:GQ 0/1:342,17:127:-65.55,-51.15,-483.41:99
-chr1 2605074 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=367;Dels=0.02;HRun=1;HaplotypeScore=550.64;MQ=22.20;MQ0=72;OQ=1826.16;QD=4.98;SB=11.30 GT:AD:DP:GL:GQ 0/1:140,136:125:-251.01,-65.11,-307.30:99
-chr1 2605078 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=360;Dels=0.00;HRun=1;HaplotypeScore=645.39;MQ=22.69;MQ0=67;OQ=145.82;QD=0.41;SB=80.26 GT:AD:DP:GL:GQ 0/1:281,25:108:-50.40,-32.54,-347.91:99
-chr1 2605087 rs9442451 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=302;Dels=0.00;HRun=1;HaplotypeScore=515.01;MQ=23.21;MQ0=61;OQ=1550.28;QD=5.13;SB=0.26 GT:AD:DP:GL:GQ 0/1:127,172:83:-183.36,-25.04,-152.30:99
-chr1 2605095 rs7411254 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=0;HaplotypeScore=864.08;MQ=22.89;MQ0=61;OQ=861.12;QD=2.92;SB=-439.01 GT:AD:DP:GL:GQ 0/1:231,62:100:-119.53,-30.13,-233.73:99
-chr1 2605099 rs61763531 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=268;Dels=0.03;HRun=1;HaplotypeScore=671.07;MQ=23.34;MQ0=56;OQ=331.54;QD=1.24;SB=62.18 GT:AD:DP:GL:GQ 0/1:101,158:88:-62.36,-25.93,-228.22:99
-chr1 2605116 rs61763532 G T 727.77 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=280;Dels=0.00;HRun=0;HaplotypeScore=340.71;MQ=26.06;MQ0=38;QD=2.60;SB=80.25 GT:AD:DP:GL:GQ 0/1:98,160:86:-122.32,-46.26,-192.83:99
-chr1 2605118 . G A 130.78 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=2;HaplotypeScore=353.34;MQ=26.07;MQ0=39;QD=0.45;SB=68.17 GT:AD:DP:GL:GQ 0/1:266,20:82:-41.07,-24.71,-249.92:99
-chr1 2605120 . A G 143.56 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=286;Dels=0.00;HRun=0;HaplotypeScore=391.53;MQ=26.07;MQ0=38;QD=0.50;SB=44.57 GT:AD:DP:GL:GQ 0/1:230,56:92:-45.37,-27.73,-305.63:99
-chr1 2605121 . C A 843.63 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=2;HaplotypeScore=384.52;MQ=26.08;MQ0=38;QD=2.98;SB=80.20 GT:AD:DP:GL:GQ 0/1:195,69:112:-123.96,-36.31,-258.00:99
-chr1 2605143 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=261;Dels=0.00;HRun=0;HaplotypeScore=165.80;MQ=26.36;MQ0=57;OQ=2061.60;QD=7.90;SB=82.92 GT:AD:DP:GL:GQ 0/1:135,121:131:-251.29,-41.84,-249.16:99
-chr1 2605152 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=276;Dels=0.00;HRun=0;HaplotypeScore=166.41;MQ=25.95;MQ0=68;OQ=1747.63;QD=6.33;SB=68.24 GT:AD:DP:GL:GQ 0/1:180,94:128:-216.61,-38.56,-254.69:99
-chr1 2605164 rs56278231 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=99.67;MQ=26.36;MQ0=65;OQ=2109.83;QD=7.59;SB=62.23 GT:AD:DP:GL:GQ 0/1:140,134:129:-253.13,-38.87,-210.06:99
-chr1 2605176 rs61763533 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=283;Dels=0.00;HRun=4;HaplotypeScore=192.72;MQ=26.37;MQ0=64;OQ=2285.97;QD=8.08;SB=50.20 GT:AD:DP:GL:GQ 0/1:155,126:135:-272.62,-40.74,-266.81:99
-chr1 2605179 rs7415101 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=293;Dels=0.00;HRun=0;HaplotypeScore=210.05;MQ=26.19;MQ0=65;OQ=1158.68;QD=3.95;SB=-384.91 GT:AD:DP:GL:GQ 0/1:236,57:97:-148.38,-29.23,-220.79:99
-chr1 2605208 . C A 465.30 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=269;Dels=0.00;HRun=1;HaplotypeScore=227.21;MQ=26.15;MQ0=63;QD=1.73;SB=32.07 GT:AD:DP:GL:GQ 0/1:153,116:69:-70.60,-20.78,-175.32:99
-chr1 2605210 . C A 482.33 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=1;HaplotypeScore=189.40;MQ=26.42;MQ0=62;QD=1.81;SB=32.08 GT:AD:DP:GL:GQ 0/1:149,115:67:-71.70,-20.18,-161.20:99
-chr1 2605214 rs61082664 T C 967.30 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=2;HaplotypeScore=127.28;MQ=27.64;MQ0=60;QD=3.50;SB=23.10 GT:AD:DP:GL:GQ 0/1:97,178:76:-122.91,-22.90,-161.42:99
-chr1 2605243 . G T 751.64 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=305;Dels=0.00;HRun=1;HaplotypeScore=253.27;MQ=31.30;MQ0=36;QD=2.46;SB=71.20 GT:AD:DP:GL:GQ 0/1:173,132:102:-109.18,-30.73,-247.59:99
-chr1 2605244 rs28455054 T C 853.34 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=304;Dels=0.00;HRun=0;HaplotypeScore=224.13;MQ=31.61;MQ0=34;QD=2.81;SB=-69.58 GT:AD:DP:GL:GQ 0/1:99,183:104:-137.17,-48.55,-265.91:99
-chr1 2605247 . C T 78.33 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=241.73;MQ=32.15;MQ0=30;QD=0.26;SB=92.28 GT:AD:DP:GL:GQ 0/1:261,44:108:-43.66,-32.54,-342.18:99
-chr1 2605252 . C A 302.63 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=316;Dels=0.00;HRun=1;HaplotypeScore=325.23;MQ=32.85;MQ0=33;QD=0.96;SB=113.24 GT:AD:DP:GL:GQ 0/1:197,119:109:-66.39,-32.84,-311.74:99
-chr1 2605255 rs55876897 A C 449.77 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=317;Dels=0.00;HRun=3;HaplotypeScore=260.93;MQ=33.01;MQ0=35;QD=1.42;SB=-150.70 GT:AD:DP:GL:GQ 0/1:239,77:117:-83.21,-34.95,-326.08:99
-chr1 2605259 rs56999649 T G 716.83 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=300;Dels=0.00;HRun=1;HaplotypeScore=227.19;MQ=34.47;MQ0=29;QD=2.39;SB=-184.23 GT:AD:DP:GL:GQ 0/1:116,182:121:-111.42,-36.45,-316.52:99
-chr1 2605264 rs4648676 C T 210.17 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=316;Dels=0.00;HRun=0;HaplotypeScore=557.56;MQ=35.06;MQ0=25;QD=0.67;SB=-21.82 GT:AD:DP:GL:GQ 0/1:289,24:136:-67.74,-43.44,-416.85:99
-chr1 2605334 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=408;Dels=0.00;HRun=4;HaplotypeScore=186.79;MQ=36.75;MQ0=7;OQ=1485.59;QD=3.64;SB=-538.59 GT:AD:DP:GL:GQ 0/1:275,118:294:-243.85,-92.01,-1014.23:99
-chr1 2605341 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=415;Dels=0.00;HRun=0;HaplotypeScore=229.92;MQ=36.33;MQ0=7;OQ=215.75;QD=0.52;SB=102.02 GT:AD:DP:GL:GQ 0/1:365,48:297:-114.34,-89.49,-957.91:99
-chr1 2605353 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=430;Dels=0.00;HRun=0;HaplotypeScore=200.04;MQ=35.29;MQ0=7;OQ=112.93;QD=0.26;SB=60.60 GT:AD:DP:GL:GQ 0/1:389,39:313:-108.94,-94.36,-1191.77:99
-chr1 2605354 rs4648678 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=435;Dels=0.00;HRun=0;HaplotypeScore=203.33;MQ=35.33;MQ0=8;OQ=1038.03;QD=2.39;SB=-273.03 GT:AD:DP:GL:GQ 0/1:373,60:307:-199.57,-92.49,-955.77:99
-chr1 2605374 rs61763535 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=451;Dels=0.00;HRun=4;HaplotypeScore=174.52;MQ=33.98;MQ0=15;OQ=1772.73;QD=3.93;SB=-155.11 GT:AD:DP:GL:GQ 0/1:257,185:286:-266.74,-86.18,-803.52:99
-chr1 2605416 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=641;Dels=0.00;HRun=0;HaplotypeScore=116.73;MQ=29.52;MQ0=38;OQ=101.05;QD=0.16;SB=-26.09 GT:AD:DP:GL:GQ 0/1:592,49:383:-128.76,-115.37,-1229.08:99
-chr1 2605473 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=505;Dels=0.00;HRun=1;HaplotypeScore=72.40;MQ=31.01;MQ0=19;OQ=529.76;QD=1.05;SB=-238.32 GT:AD:DP:GL:GQ 0/1:450,54:383:-171.63,-115.37,-1165.16:99
-chr1 2605495 rs56293461 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=486;Dels=0.00;HRun=0;HaplotypeScore=95.08;MQ=32.56;MQ0=15;OQ=821.52;QD=1.69;SB=-409.31 GT:AD:DP:GL:GQ 0/1:403,80:369:-196.58,-111.15,-1127.43:99
-chr1 2605529 rs28651038 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=428;Dels=0.00;HRun=0;HaplotypeScore=82.79;MQ=34.53;MQ0=16;OQ=2602.34;QD=6.08;SB=-653.43 GT:AD:DP:GL:GQ 0/1:288,123:298:-353.40,-89.88,-659.17:99
-chr1 2605657 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=389;Dels=0.01;HRun=3;HaplotypeScore=175.38;MQ=30.03;MQ0=70;OQ=99.64;QD=0.26;SB=74.25 GT:AD:DP:GL:GQ 0/1:326,61:215:-77.75,-64.51,-660.65:99
-chr1 2605686 . A C 325.50 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=398;Dels=0.00;HRun=0;HaplotypeScore=501.75;MQ=28.89;MQ0=57;QD=0.82;SB=95.28 GT:AD:DP:GL:GQ 0/1:281,115:207:-98.21,-62.38,-634.44:99
-chr1 2605688 . T C 330.54 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=397;Dels=0.00;HRun=2;HaplotypeScore=497.47;MQ=28.92;MQ0=57;QD=0.83;SB=65.64 GT:AD:DP:GL:GQ 0/1:226,152:200:-122.31,-85.97,-661.75:99
-chr1 2605695 rs55827558 C T 892.89 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=401;Dels=0.00;HRun=0;HaplotypeScore=534.98;MQ=29.24;MQ0=57;QD=2.23;SB=9.18 GT:AD:DP:GL:GQ 0/1:315,49:193:-153.53,-60.96,-575.72:99
-chr1 2605725 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=284;Dels=0.00;HRun=0;HaplotypeScore=360.95;MQ=32.85;MQ0=34;OQ=61.42;QD=0.22;SB=89.31 GT:AD:DP:GL:GQ 0/1:168,111:137:-50.75,-41.32,-529.65:94.25
-chr1 2605754 . C T 591.89 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=467.58;MQ=37.63;MQ0=15;QD=2.12;SB=140.37 GT:AD:DP:GL:GQ 0/1:235,40:127:-100.77,-38.29,-327.93:99
-chr1 2605755 . G A 525.10 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=436.48;MQ=37.79;MQ0=15;QD=1.94;SB=80.56 GT:AD:DP:GL:GQ 0/1:156,112:135:-96.50,-40.71,-357.83:99
-chr1 2605761 rs61763538 C G 1339.29 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=259;Dels=0.00;HRun=1;HaplotypeScore=254.24;MQ=38.34;MQ0=17;QD=5.17;SB=4.72 GT:AD:DP:GL:GQ 0/1:84,169:121:-173.69,-36.48,-327.29:99
-chr1 2605783 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=297;Dels=0.00;HRun=0;HaplotypeScore=293.73;MQ=35.79;MQ0=20;OQ=562.93;QD=1.90;SB=121.81 GT:AD:DP:GL:GQ 0/1:195,74:123:-135.97,-76.40,-335.89:99
-chr1 2605795 . G A 252.45 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=324;Dels=0.00;HRun=0;HaplotypeScore=499.11;MQ=34.45;MQ0=20;QD=0.78;SB=203.66 GT:AD:DP:GL:GQ 0/1:201,116:126:-66.49,-37.96,-390.94:99
-chr1 2605804 . C T 66.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=356;Dels=0.00;HRun=0;HaplotypeScore=268.83;MQ=34.41;MQ0=22;QD=0.19;SB=-31.15 GT:AD:DP:GL:GQ 0/1:312,39:152:-58.55,-48.66,-460.06:98.95
-chr1 2605805 . G A 2340.79 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=356;Dels=0.00;HRun=0;HaplotypeScore=224.04;MQ=34.36;MQ0=23;QD=6.58;SB=164.74 GT:AD:DP:GL:GQ 0/1:199,157:186:-293.46,-56.10,-343.74:99
-chr1 2605831 . C T 1118.55 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=295;Dels=0.00;HRun=0;HaplotypeScore=238.92;MQ=35.23;MQ0=23;QD=3.79;SB=174.98 GT:AD:DP:GL:GQ 0/1:220,69:156:-162.17,-47.03,-376.03:99
-chr1 2605834 . C T 954.45 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=236.05;MQ=35.80;MQ0=20;QD=3.42;SB=200.51 GT:AD:DP:GL:GQ 0/1:218,59:162:-147.54,-48.81,-432.29:99
-chr1 2605836 . T G 306.78 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=263;Dels=0.00;HRun=0;HaplotypeScore=206.04;MQ=36.89;MQ0=20;QD=1.17;SB=188.58 GT:AD:DP:GL:GQ 0/1:205,52:142:-88.13,-54.17,-440.06:99
-chr1 2605841 . A G 545.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=1;HaplotypeScore=155.67;MQ=38.58;MQ0=20;QD=2.35;SB=182.62 GT:AD:DP:GL:GQ 0/1:160,70:131:-97.35,-39.47,-411.37:99
-chr1 2605874 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=124.99;MQ=42.37;MQ0=11;OQ=512.21;QD=2.21;SB=-14.46 GT:AD:DP:GL:GQ 0/1:155,74:147:-102.43,-47.93,-470.53:99
-chr1 2605886 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=108.30;MQ=44.38;MQ0=8;OQ=363.46;QD=1.81;SB=149.68 GT:AD:DP:GL:GQ 0/1:128,71:139:-81.51,-41.88,-451.45:99
-chr1 2605893 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=0;HaplotypeScore=120.52;MQ=42.83;MQ0=17;OQ=327.45;QD=1.66;SB=185.60 GT:AD:DP:GL:GQ 0/1:128,68:129:-77.12,-41.09,-417.50:99
-chr1 2605899 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=1;HaplotypeScore=109.97;MQ=40.67;MQ0=24;OQ=225.12;QD=1.10;SB=176.57 GT:AD:DP:GL:GQ 0/1:183,21:132:-65.55,-39.76,-408.38:99
-chr1 2605937 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=2;HaplotypeScore=54.75;MQ=35.12;MQ0=33;OQ=125.52;QD=0.63;SB=203.69 GT:AD:DP:GL:GQ 0/1:151,48:110:-48.99,-33.15,-378.43:99
-chr1 2605949 rs55869659 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=295;Dels=0.00;HRun=1;HaplotypeScore=266.34;MQ=30.03;MQ0=43;OQ=1589.71;QD=5.39;SB=-453.79 GT:AD:DP:GL:GQ 0/1:231,64:135:-202.93,-40.67,-294.60:99
-chr1 2605976 rs6683769 G C 6974.39 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=343;Dels=0.02;HRun=3;HaplotypeScore=423.51;MQ=29.44;MQ0=37;QD=20.33;SB=-2874.56 GT:AD:DP:GL:GQ 1/1:19,284:159:-696.44,-51.43,-8.07:99
-chr1 2605977 rs6661848 C T 1027.05 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=358;Dels=0.00;HRun=0;HaplotypeScore=456.32;MQ=29.31;MQ0=37;QD=2.87;SB=-210.09 GT:AD:DP:GL:GQ 0/1:307,50:125:-143.65,-37.67,-316.41:99
-chr1 2605979 . C A 1028.24 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=357;Dels=0.00;HRun=1;HaplotypeScore=354.37;MQ=29.31;MQ0=37;QD=2.88;SB=152.21 GT:AD:DP:GL:GQ 0/1:297,56:154:-152.50,-46.39,-400.06:99
-chr1 2605985 . A G 302.88 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=344;Dels=0.00;HRun=1;HaplotypeScore=327.75;MQ=29.96;MQ0=33;QD=0.88;SB=170.59 GT:AD:DP:GL:GQ 0/1:269,70:128:-72.14,-38.56,-425.79:99
-chr1 2606004 . C T 951.09 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=290;Dels=0.00;HRun=0;HaplotypeScore=672.95;MQ=32.63;MQ0=23;QD=3.28;SB=87.89 GT:AD:DP:GL:GQ 0/1:220,66:128:-136.98,-38.59,-302.88:99
-chr1 2606005 rs6683777 G A 1342.36 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=287;Dels=0.00;HRun=0;HaplotypeScore=631.13;MQ=33.21;MQ0=21;QD=4.68;SB=-76.00 GT:AD:DP:GL:GQ 0/1:85,177:126:-230.50,-92.98,-257.82:99
-chr1 2606006 rs57008511 G T 1549.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=289;Dels=0.00;HRun=0;HaplotypeScore=644.99;MQ=33.16;MQ0=21;QD=5.36;SB=-385.70 GT:AD:DP:GL:GQ 0/1:228,60:127:-196.55,-38.27,-243.78:99
-chr1 2606009 . A T 459 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=281;Dels=0.00;HRun=0;HaplotypeScore=430.52;MQ=33.69;MQ0=19;QD=1.63;SB=105.62 GT:AD:DP:GL:GQ 0/1:113,66:123:-152.84,-103.65,-371.87:99
-chr1 2606031 . C G 597.38 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=1;HaplotypeScore=164.77;MQ=37.58;MQ0=8;QD=2.69;SB=139.07 GT:AD:DP:GL:GQ 0/1:114,51:127:-143.77,-80.75,-412.83:99
-chr1 2606038 . C A 277.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=0;HaplotypeScore=107.00;MQ=38.94;MQ0=8;QD=1.28;SB=120.78 GT:AD:DP:GL:GQ 0/1:160,54:121:-67.44,-36.45,-363.09:99
-chr1 2606041 . G T 124.23 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=0;HaplotypeScore=125.82;MQ=39.98;MQ0=7;QD=0.60;SB=144.54 GT:AD:DP:GL:GQ 0/1:161,44:113:-49.75,-34.04,-340.70:99
-chr1 2606206 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=315;Dels=0.00;HRun=1;HaplotypeScore=256.44;MQ=28.06;MQ0=39;OQ=155.48;QD=0.49;SB=-29.90 GT:AD:DP:GL:GQ 0/1:209,63:107:-66.50,-47.67,-397.67:99
-chr1 2606217 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=250;Dels=0.00;HRun=3;HaplotypeScore=224.65;MQ=29.86;MQ0=28;OQ=458.20;QD=1.83;SB=-95.78 GT:AD:DP:GL:GQ 0/1:87,160:81:-76.54,-27.44,-208.99:99
-chr1 2606220 rs36162961 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=249;Dels=0.00;HRun=0;HaplotypeScore=180.31;MQ=29.93;MQ0=27;OQ=201.47;QD=0.81;SB=-7.21 GT:AD:DP:GL:GQ 0/1:213,32:103:-54.47,-31.04,-311.81:99
-chr1 2606247 rs6662065 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=156;Dels=0.00;HRun=0;HaplotypeScore=58.65;MQ=36.60;MQ0=15;OQ=2337.23;QD=14.98;SB=-1097.47 GT:AD:DP:GL:GQ 0/1:41,86:97:-280.18,-43.17,-102.47:99
-chr1 2606279 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=1;HaplotypeScore=25.92;MQ=42.76;MQ0=2;OQ=312.76;QD=2.56;SB=-74.63 GT:AD:DP:GL:GQ 0/1:94,28:104:-65.90,-31.34,-343.27:99
-chr1 2606294 rs28562476 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.00;HRun=0;HaplotypeScore=45.48;MQ=41.64;MQ0=3;OQ=158.71;QD=1.23;SB=-91.27 GT:AD:DP:GL:GQ 0/1:99,30:98:-48.69,-29.54,-326.61:99
-chr1 2606300 rs6662172 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=1;HaplotypeScore=45.57;MQ=40.35;MQ0=4;OQ=2445.81;QD=16.53;SB=-1064.82 GT:AD:DP:GL:GQ 0/1:63,84:112:-281.60,-33.73,-119.13:99
-chr1 2606379 rs28410393 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=0;HaplotypeScore=27.63;MQ=39.78;MQ0=6;OQ=368.46;QD=3.02;SB=6.71 GT:AD:DP:GL:GQ 0/1:95,26:92:-67.86,-27.73,-327.77:99
-chr1 2606380 rs28520729 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=27.50;MQ=39.82;MQ0=6;OQ=559.99;QD=4.71;SB=-194.85 GT:AD:DP:GL:GQ 0/1:94,25:96:-88.22,-28.94,-322.33:99
-chr1 2606465 rs28436923 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=147;Dels=0.00;HRun=0;HaplotypeScore=131.13;MQ=40.98;MQ0=13;OQ=2035.71;QD=13.85;SB=-905.49 GT:AD:DP:GL:GQ 0/1:80,64:81:-231.26,-24.41,-73.56:99
-chr1 2606518 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=218.01;MQ=25.24;MQ0=20;OQ=216.97;QD=1.17;SB=68.19 GT:AD:DP:GL:GQ 0/1:119,56:69:-45.78,-20.79,-195.94:99
-chr1 2606520 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=182;Dels=0.01;HRun=1;HaplotypeScore=197.55;MQ=24.90;MQ0=18;OQ=425.87;QD=2.34;SB=7.72 GT:AD:DP:GL:GQ 0/1:98,71:68:-66.40,-20.53,-203.96:99
-chr1 2606555 rs55641610 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=142;Dels=0.00;HRun=0;HaplotypeScore=86.83;MQ=22.44;MQ0=15;OQ=611.31;QD=4.31;SB=-217.67 GT:AD:DP:GL:GQ 0/1:66,72:64:-83.70,-19.29,-186.04:99
-chr1 2606567 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=1;HaplotypeScore=115.34;MQ=22.30;MQ0=19;OQ=114.64;QD=0.87;SB=-3.31 GT:AD:DP:GL:GQ 0/1:113,14:59:-32.52,-17.77,-180.72:99
-chr1 2606594 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=41.70;MQ=23.56;MQ0=16;OQ=75.03;QD=0.63;SB=28.48 GT:AD:DP:GL:GQ 0/1:83,36:66:-30.68,-19.89,-255.45:99
-chr1 2606643 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=21.80;MQ=30.64;MQ0=12;OQ=1721.23;QD=15.37;SB=-793.00 GT:AD:DP:GL:GQ 0/1:46,66:82:-200.11,-24.70,-94.60:99
-chr1 2606798 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=16.08;MQ=18.33;MQ0=33;OQ=155.22;QD=2.13;SB=-92.26 GT:AD:DP:GL:GQ 0/1:36,34:23:-29.36,-10.56,-75.52:99
-chr1 2607095 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=174;Dels=0.00;HRun=0;HaplotypeScore=115.98;MQ=20.76;MQ0=93;OQ=63.80;QD=0.37;SB=-35.41 GT:AD:DP:GL:GQ 0/1:164,10:54:-25.95,-16.29,-195.04:96.63
-chr1 2607127 rs28555663 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.00;HRun=0;HaplotypeScore=71.01;MQ=31.05;MQ0=18;OQ=1628.35;QD=13.57;SB=-397.76 GT:AD:DP:GL:GQ 0/1:27,60:78:-215.41,-49.30,-93.76:99
-chr1 2607162 rs61763542 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=215;Dels=0.00;HRun=1;HaplotypeScore=85.56;MQ=29.70;MQ0=30;OQ=368.13;QD=1.71;SB=-56.56 GT:AD:DP:GL:GQ 0/1:178,35:124:-77.45,-37.35,-360.47:99
-chr1 2607163 . G A 13.12 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=2;HaplotypeScore=87.56;MQ=29.61;MQ0=31;QD=0.06;SB=-11.83 GT:AD:DP:GL:GQ 0/1:187,28:129:-43.44,-38.86,-425.52:45.74
-chr1 2607204 . G C 43.54 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=196;Dels=0.00;HRun=0;HaplotypeScore=43.04;MQ=31.64;MQ0=30;QD=0.22;SB=-29.18 GT:AD:DP:GL:GQ 0/1:170,26:109:-40.50,-32.86,-424.67:76.37
-chr1 2607231 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=1;HaplotypeScore=72.77;MQ=31.17;MQ0=24;OQ=125.47;QD=0.87;SB=-42.71 GT:AD:DP:GL:GQ 0/1:125,19:75:-38.43,-22.60,-228.94:99
-chr1 2607242 rs61763545 G T 46.85 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=36.90;MQ=31.04;MQ0=29;QD=0.40;SB=43.89 GT:AD:DP:GL:GQ 0/1:84,30:54:-24.25,-16.28,-154.98:79.69
-chr1 2607298 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=68.12;MQ=14.41;MQ0=82;OQ=66.90;QD=0.45;SB=20.86 GT:AD:DP:GL:GQ 0/1:129,10:21:-19.87,-9.89,-58.18:99
-chr1 2607355 rs61765818 C T 12.91 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=56.37;MQ=16.61;MQ0=62;QD=0.11;SB=29.06 GT:AD:DP:GL:GQ 0/1:90,27:23:-11.49,-6.94,-61.93:45.51
-chr1 2607366 . A G 13.05 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=2;HaplotypeScore=34.50;MQ=17.10;MQ0=55;QD=0.12;SB=29.12 GT:AD:DP:GL:GQ 0/1:102,6:22:-11.19,-6.63,-75.23:45.67
-chr1 2607368 rs61763546 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=35.70;MQ=17.26;MQ0=53;OQ=303.93;QD=2.87;SB=-146.92 GT:AD:DP:GL:GQ 0/1:46,59:26:-41.51,-7.84,-47.60:99
-chr1 2607409 . G A 15.60 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=0;HaplotypeScore=56.89;MQ=28.46;MQ0=6;QD=0.24;SB=38.64 GT:AD:DP:GL:GQ 0/1:41,24:37:-15.99,-11.15,-106.07:48.31
-chr1 2607422 rs56133135 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=19.37;MQ=32.69;MQ0=0;OQ=693.38;QD=12.61;SB=2.03 GT:AD:DP:GL:GQ 0/1:26,28:39:-84.38,-11.76,-83.37:99
-chr1 2607465 rs61763547 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=40.98;MQ=25.86;MQ0=35;OQ=388.51;QD=4.63;SB=-36.91 GT:AD:DP:GL:GQ 0/1:60,23:42:-54.79,-12.65,-94.92:99
-chr1 2607520 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=176;Dels=0.00;HRun=1;HaplotypeScore=43.55;MQ=22.90;MQ0=79;OQ=121.23;QD=0.69;SB=8.68 GT:AD:DP:GL:GQ 0/1:158,14:67:-35.59,-20.18,-205.83:99
-chr1 2607562 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=147;Dels=0.00;HRun=0;HaplotypeScore=58.31;MQ=31.97;MQ0=28;OQ=222.37;QD=1.51;SB=-108.77 GT:AD:DP:GL:GQ 0/1:118,16:74:-51.32,-25.80,-191.60:99
-chr1 2607568 rs61763549 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=80.59;MQ=33.84;MQ0=16;OQ=1066.74;QD=7.90;SB=-480.14 GT:AD:DP:GL:GQ 0/1:64,70:72:-131.67,-21.72,-176.26:99
-chr1 2607579 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=1;HaplotypeScore=59.49;MQ=32.83;MQ0=15;OQ=376.87;QD=2.37;SB=-134.64 GT:AD:DP:GL:GQ 0/1:129,30:89:-67.78,-26.81,-244.98:99
-chr1 2607622 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=166;Dels=0.00;HRun=1;HaplotypeScore=74.61;MQ=28.79;MQ0=41;OQ=121.71;QD=0.73;SB=1.49 GT:AD:DP:GL:GQ 0/1:144,22:68:-35.94,-20.49,-206.61:99
-chr1 2607635 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=177;Dels=0.00;HRun=1;HaplotypeScore=30.67;MQ=24.43;MQ0=69;OQ=168.44;QD=0.95;SB=-26.38 GT:AD:DP:GL:GQ 0/1:144,24:48:-34.61,-14.49,-156.01:99
-chr1 2607650 . G A 36.08 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=194;Dels=0.00;HRun=1;HaplotypeScore=75.42;MQ=22.15;MQ0=92;QD=0.19;SB=17.06 GT:AD:DP:GL:GQ 0/1:183,11:48:-21.35,-14.46,-155.19:68.92
-chr1 2607670 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=229;Dels=0.00;HRun=0;HaplotypeScore=160.50;MQ=16.74;MQ0=141;OQ=99.29;QD=0.43;SB=62.11 GT:AD:DP:GL:GQ 0/1:219,9:33:-23.18,-9.97,-80.62:99
-chr1 2607674 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=226;Dels=0.00;HRun=0;HaplotypeScore=115.26;MQ=15.31;MQ0=147;OQ=144.37;QD=0.64;SB=59.23 GT:AD:DP:GL:GQ 0/1:144,82:32:-27.37,-9.65,-111.07:99
-chr1 2607705 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=307;Dels=0.00;HRun=0;HaplotypeScore=135.41;MQ=9.50;MQ0=238;OQ=88.23;QD=0.29;SB=44.16 GT:AD:DP:GL:GQ 0/1:293,13:26:-19.94,-7.83,-70.73:99
-chr1 2607732 . A G 46.69 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=264;Dels=0.00;HRun=0;HaplotypeScore=160.28;MQ=9.40;MQ0=205;QD=0.18;SB=38.16 GT:AD:DP:GL:GQ 0/1:246,15:21:-14.28,-6.33,-70.03:79.52
-chr1 2607768 . C G 49.76 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=95.94;MQ=10.01;MQ0=124;QD=0.30;SB=-3.98 GT:AD:DP:GL:GQ 0/1:136,25:16:-13.08,-4.82,-52.20:82.60
-chr1 2607891 rs7416366 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=122;Dels=0.00;HRun=0;HaplotypeScore=58.84;MQ=34.41;MQ0=14;OQ=1644.48;QD=13.48;SB=-506.65 GT:AD:DP:GL:GQ 0/1:59,63:73:-189.73,-22.00,-69.36:99
-chr1 2607919 . C G 24.55 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=0;HaplotypeScore=83.78;MQ=30.54;MQ0=25;QD=0.11;SB=109.84 GT:AD:DP:GL:GQ 0/1:205,16:120:-41.91,-36.17,-462.22:57.38
-chr1 2607925 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=225;Dels=0.00;HRun=1;HaplotypeScore=102.41;MQ=29.59;MQ0=28;OQ=208.07;QD=0.92;SB=12.89 GT:AD:DP:GL:GQ 0/1:171,51:116:-59.04,-34.95,-344.67:99
-chr1 2607990 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=62.53;MQ=19.75;MQ0=60;OQ=143.02;QD=0.67;SB=-11.93 GT:AD:DP:GL:GQ 0/1:169,45:70:-38.68,-21.10,-211.21:99
-chr1 2608016 rs61763552 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.00;HRun=1;HaplotypeScore=33.08;MQ=18.38;MQ0=35;OQ=157.73;QD=1.02;SB=-56.91 GT:AD:DP:GL:GQ 0/1:74,80:55:-35.63,-16.57,-153.82:99
-chr1 2608035 rs60386739 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=68.10;MQ=20.23;MQ0=19;OQ=139.83;QD=0.99;SB=-34.61 GT:AD:DP:GL:GQ 0/1:123,11:68:-37.75,-20.49,-226.75:99
-chr1 2608187 . T A 19.78 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=100.91;MQ=20.82;MQ0=35;QD=0.14;SB=68.21 GT:AD:DP:GL:GQ 0/1:73,68:45:-18.82,-13.56,-139.70:52.57
-chr1 2608269 rs28464857 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=186;Dels=0.00;HRun=0;HaplotypeScore=134.04;MQ=20.25;MQ0=84;OQ=169.32;QD=0.91;SB=-92.57 GT:AD:DP:GL:GQ 0/1:170,15:57:-37.38,-17.17,-176.94:99
-chr1 2608484 rs28436796 C G 0.48 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.24;MQ=47.84;MQ0=1;OQ=487.04;QD=5.47;SB=-196.59 GT:AD:DP:GL:GQ 0/1:66,21:74:-74.31,-22.32,-232.63:99
-chr1 2608664 rs4074927 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=182;Dels=0.01;HRun=1;HaplotypeScore=99.89;MQ=34.06;MQ0=19;OQ=2375.90;QD=13.05;SB=-939.83 GT:AD:DP:GL:GQ 0/1:91,85:111:-274.32,-33.45,-107.97:99
-chr1 2608867 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=118;Dels=0.01;HRun=2;HaplotypeScore=20.49;MQ=45.47;MQ0=7;OQ=974.46;QD=8.26;SB=-210.08 GT:AD:DP:GL:GQ 0/1:62,55:87:-126.99,-26.26,-221.81:99
-chr1 2609068 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=3;HaplotypeScore=118.35;MQ=34.13;MQ0=24;OQ=526.94;QD=2.38;SB=137.47 GT:AD:DP:GL:GQ 0/1:93,112:118:-95.11,-39.14,-362.67:99
-chr1 2609088 rs6604995 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=244;Dels=0.00;HRun=1;HaplotypeScore=80.61;MQ=35.58;MQ0=31;OQ=2415.96;QD=9.90;SB=-1183.52 GT:AD:DP:GL:GQ 0/1:168,75:136:-285.85,-40.97,-232.15:99
-chr1 2609117 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=242;Dels=0.00;HRun=0;HaplotypeScore=86.85;MQ=40.05;MQ0=22;OQ=564.86;QD=2.33;SB=136.90 GT:AD:DP:GL:GQ 0/1:188,54:147:-104.06,-44.29,-429.75:99
-chr1 2609119 . T A 10.35 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=240;Dels=0.00;HRun=1;HaplotypeScore=66.02;MQ=40.40;MQ0=19;QD=0.04;SB=-13.71 GT:AD:DP:GL:GQ 0/1:216,24:153:-50.36,-46.09,-521.00:42.77
-chr1 2609136 rs6680012 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.00;HRun=0;HaplotypeScore=138.11;MQ=41.19;MQ0=14;OQ=1288.83;QD=5.11;SB=-20.42 GT:AD:DP:GL:GQ 0/1:111,140:159:-180.06,-47.89,-385.06:99
-chr1 2609225 rs61765683 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=279;Dels=0.00;HRun=0;HaplotypeScore=196.30;MQ=28.44;MQ0=55;OQ=715.74;QD=2.57;SB=-196.88 GT:AD:DP:GL:GQ 0/1:215,53:119:-124.19,-49.34,-290.35:99
-chr1 2609273 rs4648680 A T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=189;Dels=0.00;HRun=0;HaplotypeScore=41.61;MQ=19.84;MQ0=34;OQ=2444.19;QD=12.93;SB=-891.61 GT:AD:DP:GL:GQ 1/1:0,186:71:-248.05,-21.40,-0.04:99
-chr1 2609305 rs6672446 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=196;Dels=0.00;HRun=1;HaplotypeScore=44.27;MQ=21.28;MQ0=40;OQ=1443.42;QD=7.36;SB=-313.15 GT:AD:DP:GL:GQ 0/1:121,75:90:-174.74,-27.11,-141.16:99
-chr1 2609332 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=25.23;MQ=24.42;MQ0=31;OQ=1010.88;QD=5.29;SB=-411.33 GT:AD:DP:GL:GQ 0/1:130,60:101:-134.82,-30.45,-224.41:99
-chr1 2609354 rs61765685 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=264;Dels=0.00;HRun=0;HaplotypeScore=43.36;MQ=26.38;MQ0=47;OQ=877.95;QD=3.33;SB=-290.40 GT:AD:DP:GL:GQ 0/1:123,140:122:-127.86,-36.78,-326.56:99
-chr1 2609381 . C A 220.25 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=378;Dels=0.00;HRun=0;HaplotypeScore=205.42;MQ=26.54;MQ0=63;QD=0.58;SB=-92.16 GT:AD:DP:GL:GQ 0/1:327,50:132:-65.07,-39.76,-400.14:99
-chr1 2609387 . C A 185.57 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=439;Dels=0.00;HRun=0;HaplotypeScore=250.48;MQ=26.77;MQ0=67;QD=0.42;SB=5.95 GT:AD:DP:GL:GQ 0/1:387,52:145:-65.52,-43.68,-445.14:99
-chr1 2609389 . C T 92.18 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=450;Dels=0.00;HRun=0;HaplotypeScore=251.37;MQ=26.71;MQ0=67;QD=0.20;SB=175.01 GT:AD:DP:GL:GQ 0/1:391,58:155:-59.19,-46.69,-504.94:99
-chr1 2609452 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=378;Dels=0.00;HRun=2;HaplotypeScore=241.26;MQ=31.94;MQ0=54;OQ=971.37;QD=2.57;SB=-357.67 GT:AD:DP:GL:GQ 0/1:305,73:146:-144.40,-43.98,-395.70:99
-chr1 2609455 rs58318704 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=356;Dels=0.00;HRun=0;HaplotypeScore=220.51;MQ=31.91;MQ0=49;OQ=2158.97;QD=6.06;SB=-1017.43 GT:AD:DP:GL:GQ 0/1:79,219:141:-270.22,-51.04,-310.17:99
-chr1 2609547 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=66.94;MQ=35.31;MQ0=17;OQ=674.03;QD=3.60;SB=-244.40 GT:AD:DP:GL:GQ 0/1:135,50:133:-110.75,-40.07,-356.06:99
-chr1 2609555 rs28575476 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=0;HaplotypeScore=68.51;MQ=35.35;MQ0=12;OQ=1288.35;QD=7.53;SB=-481.51 GT:AD:DP:GL:GQ 0/1:88,78:120:-168.27,-36.15,-252.36:99
-chr1 2609591 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=34.97;MQ=33.84;MQ0=11;OQ=2484.13;QD=14.44;SB=-938.03 GT:AD:DP:GL:GQ 0/1:84,88:135:-292.43,-40.73,-257.29:99
-chr1 2609644 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=353;Dels=0.00;HRun=1;HaplotypeScore=213.12;MQ=29.19;MQ0=26;OQ=1530.86;QD=4.34;SB=-311.00 GT:AD:DP:GL:GQ 0/1:205,118:177:-209.80,-53.43,-491.62:99
-chr1 2609668 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=375;Dels=0.01;HRun=0;HaplotypeScore=299.53;MQ=28.31;MQ0=38;OQ=119.51;QD=0.32;SB=-39.52 GT:AD:DP:GL:GQ 0/1:330,33:168:-65.89,-50.66,-484.68:99
-chr1 2609669 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=370;Dels=0.01;HRun=3;HaplotypeScore=295.29;MQ=28.20;MQ0=38;OQ=509.10;QD=1.38;SB=-148.65 GT:AD:DP:GL:GQ 0/1:202,146:144:-97.68,-43.48,-474.43:99
-chr1 2609682 . T C 10.13 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=1;HaplotypeScore=318.76;MQ=28.20;MQ0=43;QD=0.03;SB=29.61 GT:AD:DP:GL:GQ 0/1:328,21:141:-56.49,-52.23,-495.36:42.52
-chr1 2609688 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=357;Dels=0.00;HRun=0;HaplotypeScore=304.49;MQ=28.68;MQ0=43;OQ=540.31;QD=1.51;SB=-146.86 GT:AD:DP:GL:GQ 0/1:288,44:135:-97.99,-40.67,-405.76:99
-chr1 2609713 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=325;Dels=0.00;HRun=2;HaplotypeScore=235.46;MQ=29.07;MQ0=50;OQ=183.31;QD=0.56;SB=-70.06 GT:AD:DP:GL:GQ 0/1:293,30:98:-51.18,-29.56,-309.43:99
-chr1 2609764 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=67.69;MQ=41.15;MQ0=28;OQ=547.70;QD=3.06;SB=-220.32 GT:AD:DP:GL:GQ 0/1:154,22:97:-87.34,-29.29,-296.73:99
-chr1 2609770 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=51.04;MQ=41.72;MQ0=28;OQ=50.39;QD=0.29;SB=107.80 GT:AD:DP:GL:GQ 0/1:92,83:96:-37.25,-28.93,-332.67:83.23
-chr1 2609843 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=0;HaplotypeScore=18.24;MQ=41.49;MQ0=22;OQ=514.69;QD=3.78;SB=-103.96 GT:AD:DP:GL:GQ 0/1:89,47:97:-83.99,-29.23,-261.15:99
-chr1 2609879 rs60995822 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.00;HRun=0;HaplotypeScore=53.77;MQ=31.75;MQ0=20;OQ=1688.97;QD=13.62;SB=-590.07 GT:AD:DP:GL:GQ 0/1:21,102:69:-192.97,-20.79,-48.84:99
-chr1 2609938 rs61765691 T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=210;Dels=0.00;HRun=0;HaplotypeScore=78.06;MQ=23.32;MQ0=40;OQ=3717.12;QD=17.70;SB=-1751.06 GT:AD:DP:GL:GQ 1/1:3,206:105:-370.71,-31.64,-0.05:99
-chr1 2610024 rs60041779 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=125;Dels=0.00;HRun=0;HaplotypeScore=93.88;MQ=40.95;MQ0=10;OQ=112.09;QD=0.90;SB=83.51 GT:AD:DP:GL:GQ 0/1:77,47:69:-35.30,-20.81,-248.60:99
-chr1 2610174 rs61765693 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=331;Dels=0.00;HRun=1;HaplotypeScore=45.52;MQ=28.55;MQ0=47;OQ=762.69;QD=2.30;SB=-121.02 GT:AD:DP:GL:GQ 0/1:162,168:127:-117.91,-38.35,-381.81:99
-chr1 2610186 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=354;Dels=0.00;HRun=0;HaplotypeScore=102.42;MQ=26.42;MQ0=47;OQ=1467.29;QD=4.14;SB=-129.66 GT:AD:DP:GL:GQ 0/1:303,49:127:-191.55,-41.54,-284.06:99
-chr1 2610220 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=0;HaplotypeScore=158.15;MQ=26.10;MQ0=33;OQ=52.73;QD=0.15;SB=-33.83 GT:AD:DP:GL:GQ 0/1:323,33:128:-47.12,-38.57,-405.99:85.57
-chr1 2610228 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=347;Dels=0.00;HRun=0;HaplotypeScore=258.31;MQ=25.86;MQ0=32;OQ=417.23;QD=1.20;SB=-217.33 GT:AD:DP:GL:GQ 0/1:235,103:129:-86.15,-41.14,-407.87:99
-chr1 2610288 rs61765694 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=240;Dels=0.00;HRun=0;HaplotypeScore=161.76;MQ=34.28;MQ0=24;OQ=460.60;QD=1.92;SB=-235.27 GT:AD:DP:GL:GQ 0/1:119,106:122:-91.58,-42.24,-307.51:99
-chr1 2610304 rs57887432 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=214;Dels=0.00;HRun=1;HaplotypeScore=126.12;MQ=34.24;MQ0=19;OQ=2078.47;QD=9.71;SB=-912.59 GT:AD:DP:GL:GQ 0/1:141,72:106:-243.09,-31.96,-204.85:99
-chr1 2610325 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=58.60;MQ=38.14;MQ0=8;OQ=610.61;QD=3.94;SB=-307.83 GT:AD:DP:GL:GQ 0/1:117,38:94:-92.67,-28.33,-261.00:99
-chr1 2610342 rs58318302 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=64.33;MQ=41.99;MQ0=6;OQ=1628.60;QD=14.67;SB=-308.68 GT:AD:DP:GL:GQ 0/1:43,66:83:-191.15,-25.00,-121.94:99
-chr1 2610414 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=331;Dels=0.00;HRun=0;HaplotypeScore=235.51;MQ=30.47;MQ0=22;OQ=935.47;QD=2.83;SB=-429.72 GT:AD:DP:GL:GQ 0/1:275,53:139:-142.25,-45.42,-348.13:99
-chr1 2610415 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=337;Dels=0.00;HRun=1;HaplotypeScore=237.48;MQ=30.55;MQ0=22;OQ=1122.12;QD=3.33;SB=-419.64 GT:AD:DP:GL:GQ 0/1:156,170:150:-188.30,-72.80,-443.59:99
-chr1 2610441 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=398;Dels=0.00;HRun=0;HaplotypeScore=305.07;MQ=30.41;MQ0=29;OQ=523.24;QD=1.31;SB=-254.15 GT:AD:DP:GL:GQ 0/1:145,184:159:-118.96,-63.35,-451.63:99
-chr1 2610473 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=351;Dels=0.00;HRun=1;HaplotypeScore=331.68;MQ=29.41;MQ0=37;OQ=1376.69;QD=3.92;SB=-162.02 GT:AD:DP:GL:GQ 0/1:286,64:127:-179.22,-38.27,-253.78:99
-chr1 2610474 rs28418735 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=350;Dels=0.03;HRun=3;HaplotypeScore=309.89;MQ=29.49;MQ0=38;OQ=65.43;QD=0.19;SB=221.76 GT:AD:DP:GL:GQ 0/1:271,68:132:-49.66,-39.83,-486.19:98.27
-chr1 2610506 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=143.13;MQ=32.96;MQ0=24;OQ=241.48;QD=1.21;SB=-28.90 GT:AD:DP:GL:GQ 0/1:85,107:74:-49.73,-22.29,-227.60:99
-chr1 2610517 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=3;HaplotypeScore=142.26;MQ=34.55;MQ0=20;OQ=220.80;QD=1.35;SB=75.68 GT:AD:DP:GL:GQ 0/1:65,82:63:-52.24,-26.88,-202.10:99
-chr1 2610573 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=104.72;MQ=37.56;MQ0=8;OQ=553.10;QD=3.29;SB=-39.90 GT:AD:DP:GL:GQ 0/1:88,80:80:-82.71,-24.12,-188.70:99
-chr1 2610594 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=122;Dels=0.02;HRun=0;HaplotypeScore=84.91;MQ=43.41;MQ0=3;OQ=1001.55;QD=8.21;SB=-522.00 GT:AD:DP:GL:GQ 0/1:52,66:81:-127.86,-24.42,-216.74:99
-chr1 2610598 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=2;HaplotypeScore=59.26;MQ=42.74;MQ0=3;OQ=1239.36;QD=9.61;SB=-593.34 GT:AD:DP:GL:GQ 0/1:51,77:86:-153.17,-25.95,-194.38:99
-chr1 2610632 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=151.91;MQ=39.51;MQ0=6;OQ=369.19;QD=2.01;SB=-62.83 GT:AD:DP:GL:GQ 0/1:154,30:112:-73.95,-33.75,-316.70:99
-chr1 2610635 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=139.15;MQ=38.51;MQ0=6;OQ=274.48;QD=1.35;SB=-41.80 GT:AD:DP:GL:GQ 0/1:164,37:123:-67.82,-37.08,-455.22:99
-chr1 2610665 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=1;HaplotypeScore=315.73;MQ=36.51;MQ0=11;OQ=1591.77;QD=7.40;SB=-670.77 GT:AD:DP:GL:GQ 0/1:149,65:109:-195.35,-32.89,-252.45:99
-chr1 2610712 rs55957791 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=278;Dels=0.00;HRun=0;HaplotypeScore=331.10;MQ=30.73;MQ0=38;OQ=351.17;QD=1.26;SB=50.69 GT:AD:DP:GL:GQ 0/1:157,116:120:-81.22,-42.82,-389.65:99
-chr1 2610714 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=276;Dels=0.03;HRun=1;HaplotypeScore=276.80;MQ=30.44;MQ0=40;OQ=799.29;QD=2.90;SB=-215.74 GT:AD:DP:GL:GQ 0/1:208,58:112:-116.35,-33.14,-272.42:99
-chr1 2610938 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=0;HaplotypeScore=61.08;MQ=40.33;MQ0=9;OQ=2312.34;QD=13.21;SB=-496.11 GT:AD:DP:GL:GQ 0/1:80,95:114:-268.87,-34.35,-152.15:99
-chr1 2610982 rs61765696 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=168;Dels=0.00;HRun=1;HaplotypeScore=77.40;MQ=36.09;MQ0=4;OQ=730.22;QD=4.35;SB=-250.72 GT:AD:DP:GL:GQ 0/1:133,34:93:-104.33,-28.02,-240.35:99
-chr1 2610988 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=177;Dels=0.00;HRun=2;HaplotypeScore=104.66;MQ=37.43;MQ0=4;OQ=180.91;QD=1.02;SB=-14.66 GT:AD:DP:GL:GQ 0/1:124,53:103:-52.42,-31.04,-397.79:99
-chr1 2611005 rs28657620 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=175;Dels=0.00;HRun=0;HaplotypeScore=240.92;MQ=35.09;MQ0=11;OQ=589.04;QD=3.37;SB=-319.71 GT:AD:DP:GL:GQ 0/1:148,26:83:-87.21,-25.02,-177.35:99
-chr1 2611008 rs61765697 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=177;Dels=0.00;HRun=0;HaplotypeScore=268.58;MQ=34.75;MQ0=11;OQ=814.23;QD=4.60;SB=-203.16 GT:AD:DP:GL:GQ 0/1:94,75:81:-109.12,-24.42,-183.44:99
-chr1 2611037 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=3;HaplotypeScore=47.75;MQ=33.75;MQ0=25;OQ=310.37;QD=1.46;SB=128.35 GT:AD:DP:GL:GQ 0/1:180,32:105:-65.95,-31.63,-301.79:99
-chr1 2611075 . C A 675.15 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=0;HaplotypeScore=289.45;MQ=35.67;MQ0=15;QD=3.41;SB=-245.12 GT:AD:DP:GL:GQ 0/1:138,49:92:-105.75,-34.95,-225.78:99
-chr1 2611076 . C A 59.41 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=0;HaplotypeScore=288.77;MQ=35.79;MQ0=15;QD=0.30;SB=-43.36 GT:AD:DP:GL:GQ 0/1:179,20:91:-36.64,-27.42,-281.03:92.25
-chr1 2611077 . T C 1287 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=199;Dels=0.00;HRun=3;HaplotypeScore=272.49;MQ=35.97;MQ0=16;QD=6.47;SB=-518.91 GT:AD:DP:GL:GQ 0/1:56,142:93:-160.01,-28.02,-190.32:99
-chr1 2611149 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=128.93;MQ=29.89;MQ0=30;OQ=118.35;QD=0.49;SB=-20.53 GT:AD:DP:GL:GQ 0/1:190,53:92:-42.83,-27.72,-276.95:99
-chr1 2611155 rs61765698 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=245;Dels=0.00;HRun=0;HaplotypeScore=130.50;MQ=30.96;MQ0=25;OQ=203.44;QD=0.83;SB=-29.37 GT:AD:DP:GL:GQ 0/1:191,50:97:-52.56,-28.94,-359.64:99
-chr1 2611193 rs61029569 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=154;Dels=0.01;HRun=0;HaplotypeScore=78.67;MQ=38.69;MQ0=8;OQ=1417.86;QD=9.21;SB=-633.08 GT:AD:DP:GL:GQ 0/1:43,100:84:-170.37,-25.30,-121.64:99
-chr1 2611212 rs28774982 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=125;Dels=0.00;HRun=0;HaplotypeScore=29.20;MQ=42.14;MQ0=3;OQ=3660.18;QD=29.28;SB=-1724.01 GT:AD:DP:GL:GQ 1/1:0,124:85:-365.02,-25.61,-0.03:99
-chr1 2611218 rs28581654 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=132;Dels=0.00;HRun=1;HaplotypeScore=33.13;MQ=42.84;MQ0=2;OQ=1779.64;QD=13.48;SB=-735.33 GT:AD:DP:GL:GQ 0/1:39,85:92:-211.73,-30.48,-139.53:99
-chr1 2611236 rs61765699 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=181;Dels=0.00;HRun=1;HaplotypeScore=137.95;MQ=39.80;MQ0=14;OQ=1598.49;QD=8.83;SB=-821.38 GT:AD:DP:GL:GQ 0/1:99,78:96:-192.06,-28.93,-137.58:99
-chr1 2611310 . G C 25 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=214;Dels=0.00;HRun=2;HaplotypeScore=68.15;MQ=29.71;MQ0=28;QD=0.12;SB=77.64 GT:AD:DP:GL:GQ 0/1:182,25:80:-33.47,-27.69,-302.15:57.82
-chr1 2611331 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=0;HaplotypeScore=171.01;MQ=28.57;MQ0=19;OQ=169.19;QD=1.00;SB=32.13 GT:AD:DP:GL:GQ 0/1:101,40:47:-34.37,-14.17,-141.57:99
-chr1 2611336 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=0;HaplotypeScore=142.89;MQ=27.04;MQ0=20;OQ=617.89;QD=3.86;SB=-201.64 GT:AD:DP:GL:GQ 0/1:32,126:45:-78.63,-13.56,-88.17:99
-chr1 2611359 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=160;Dels=0.00;HRun=2;HaplotypeScore=100.78;MQ=27.44;MQ0=19;OQ=605.72;QD=3.79;SB=-223.68 GT:AD:DP:GL:GQ 0/1:36,124:39:-75.62,-11.76,-86.35:99
-chr1 2611360 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=172;Dels=0.01;HRun=0;HaplotypeScore=100.05;MQ=27.08;MQ0=24;OQ=169.30;QD=0.98;SB=23.10 GT:AD:DP:GL:GQ 0/1:135,36:41:-32.56,-12.35,-112.95:99
-chr1 2611385 . A G 25.43 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=202;Dels=0.00;HRun=0;HaplotypeScore=141.90;MQ=28.13;MQ0=36;QD=0.13;SB=77.25 GT:AD:DP:GL:GQ 0/1:184,18:55:-22.41,-16.58,-186.56:58.25
-chr1 2611395 . C A 10.87 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=1;HaplotypeScore=214.46;MQ=28.47;MQ0=34;QD=0.06;SB=44.16 GT:AD:DP:GL:GQ 0/1:160,27:48:-18.79,-14.46,-145.75:43.33
-chr1 2611409 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=176;Dels=0.00;HRun=0;HaplotypeScore=170.63;MQ=30.96;MQ0=28;OQ=246.71;QD=1.40;SB=-63.23 GT:AD:DP:GL:GQ 0/1:66,90:51:-46.30,-18.34,-146.08:99
-chr1 2611417 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=201.92;MQ=31.46;MQ0=25;OQ=276.60;QD=1.55;SB=-61.04 GT:AD:DP:GL:GQ 0/1:50,88:59:-67.59,-36.64,-159.73:99
-chr1 2611440 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=180;Dels=0.00;HRun=0;HaplotypeScore=297.52;MQ=31.70;MQ0=24;OQ=229.57;QD=1.28;SB=65.18 GT:AD:DP:GL:GQ 0/1:152,22:68:-46.74,-20.49,-196.70:99
-chr1 2611441 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=175;Dels=0.00;HRun=4;HaplotypeScore=281.36;MQ=31.83;MQ0=24;OQ=677.61;QD=3.87;SB=-187.78 GT:AD:DP:GL:GQ 0/1:57,116:70:-92.13,-21.09,-155.28:99
-chr1 2611460 . G C 143.72 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=209;Dels=0.02;HRun=1;HaplotypeScore=206.53;MQ=28.72;MQ0=29;QD=0.69;SB=95.33 GT:AD:DP:GL:GQ 0/1:169,33:67:-37.89,-20.23,-223.47:99
-chr1 2611462 . G C 346.96 DPFilter;HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=0;HaplotypeScore=159.36;MQ=28.99;MQ0=26;QD=1.68;SB=95.35 GT:AD:DP:GL:GQ 0/1:176,30:73:-60.00,-22.02,-249.89:99
-chr1 2611473 . C A 226.87 DPFilter;HARD_TO_VALIDATE;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=0;HaplotypeScore=716.79;MQ=27.80;MQ0=23;QD=1.15;SB=98.33 GT:AD:DP:GL:GQ 0/1:167,28:68:-46.46,-20.49,-193.68:99
-chr1 2611481 . A C 47.15 DPFilter;HARD_TO_VALIDATE;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=3;HaplotypeScore=376.14;MQ=26.76;MQ0=25;QD=0.22;SB=4.29 GT:AD:DP:GL:GQ 0/1:158,51:68:-32.16,-24.16,-211.95:79.99
-chr1 2611482 rs28657015 C T 493.48 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.03;HRun=0;HaplotypeScore=277.76;MQ=26.81;MQ0=24;QD=2.28;SB=-58.33 GT:AD:DP:GL:GQ 0/1:180,23:71:-73.42,-20.79,-178.37:99
-chr1 2611484 . G A 123.65 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=217;Dels=0.00;HRun=1;HaplotypeScore=257.24;MQ=26.43;MQ0=26;QD=0.57;SB=52.66 GT:AD:DP:GL:GQ 0/1:181,35:66:-35.53,-19.88,-208.25:99
-chr1 2611506 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=1;HaplotypeScore=227.39;MQ=23.92;MQ0=38;OQ=83.72;QD=0.34;SB=1.08 GT:AD:DP:GL:GQ 0/1:205,36:67:-31.84,-20.19,-209.30:99
-chr1 2611529 . G C 1369.67 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=198.19;MQ=24.21;MQ0=25;QD=7.40;SB=-595.38 GT:AD:DP:GL:GQ 0/1:36,136:57:-168.20,-27.95,-90.83:99
-chr1 2611531 . T A 49.73 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=1;HaplotypeScore=167.31;MQ=24.09;MQ0=26;QD=0.27;SB=30.12 GT:AD:DP:GL:GQ 0/1:175,9:48:-26.14,-17.88,-160.86:82.57
-chr1 2611537 . A C 10.75 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=1;HaplotypeScore=150.76;MQ=24.75;MQ0=25;QD=0.06;SB=49.53 GT:AD:DP:GL:GQ 0/1:160,17:47:-21.51,-17.19,-149.44:43.20
-chr1 2611551 . C A 34.16 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=166;Dels=0.02;HRun=1;HaplotypeScore=423.66;MQ=25.51;MQ0=20;QD=0.21;SB=47.16 GT:AD:DP:GL:GQ 0/1:139,17:37:-21.33,-14.63,-112.07:67
-chr1 2611559 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=150;Dels=0.01;HRun=3;HaplotypeScore=531.42;MQ=25.48;MQ0=17;OQ=388.67;QD=2.59;SB=-7.62 GT:AD:DP:GL:GQ 0/1:47,82:45:-90.78,-48.63,-105.70:99
-chr1 2611586 . G A 21.13 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=158;Dels=0.00;HRun=1;HaplotypeScore=127.50;MQ=28.93;MQ0=18;QD=0.13;SB=47.15 GT:AD:DP:GL:GQ 0/1:123,29:42:-18.05,-12.65,-132.34:53.94
-chr1 2611593 . C A 39.57 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=189.22;MQ=30.35;MQ0=16;QD=0.29;SB=47.17 GT:AD:DP:GL:GQ 0/1:123,13:39:-18.99,-11.75,-120.10:72.41
-chr1 2611600 . T C 291.60 SnpCluster AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=2;HaplotypeScore=197.17;MQ=32.27;MQ0=10;QD=2.58;SB=-146.84 GT:AD:DP:GL:GQ 0/1:38,66:38:-47.43,-14.99,-100.79:99
-chr1 2611602 . C G 76.87 SnpCluster AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=173.17;MQ=32.76;MQ0=9;QD=0.68;SB=-63.17 GT:AD:DP:GL:GQ 0/1:81,31:39:-22.73,-11.76,-142.68:99
-chr1 2611613 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=122.16;MQ=34.85;MQ0=5;OQ=326.72;QD=4.08;SB=-171.57 GT:AD:DP:GL:GQ 0/1:20,59:33:-49.07,-13.11,-79.40:99
-chr1 2611623 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=114.07;MQ=31.99;MQ0=3;OQ=59.10;QD=0.57;SB=53.18 GT:AD:DP:GL:GQ 0/1:44,51:42:-30.56,-21.37,-135.55:91.94
-chr1 2611678 . C A 64.73 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=1;HaplotypeScore=80.70;MQ=27.19;MQ0=13;QD=0.45;SB=-53.00 GT:AD:DP:GL:GQ 0/1:121,21:50:-24.83,-15.07,-143.50:97.56
-chr1 2611679 . C T 18.94 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=0;HaplotypeScore=77.77;MQ=26.46;MQ0=13;QD=0.14;SB=-28.00 GT:AD:DP:GL:GQ 0/1:130,7:48:-19.64,-14.46,-152.87:51.72
-chr1 2611680 . C A 348.12 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=72.18;MQ=26.57;MQ0=13;QD=2.58;SB=-130.78 GT:AD:DP:GL:GQ 0/1:71,64:46:-51.95,-13.86,-109.26:99
-chr1 2611697 rs28420770 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.01;HRun=1;HaplotypeScore=63.25;MQ=30.55;MQ0=12;OQ=549.37;QD=5.97;SB=-271.47 GT:AD:DP:GL:GQ 0/1:70,21:28:-66.35,-8.13,-30.04:99
-chr1 2611699 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=39.05;MQ=32.12;MQ0=10;OQ=169.31;QD=2.23;SB=14.08 GT:AD:DP:GL:GQ 0/1:20,50:24:-27.45,-7.24,-73.47:99
-chr1 2611710 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=70.70;MQ=31.94;MQ0=10;OQ=120.36;QD=1.56;SB=14.06 GT:AD:DP:GL:GQ 0/1:29,48:25:-22.85,-7.53,-69.69:99
-chr1 2611716 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=60.36;MQ=32.04;MQ0=11;OQ=222.09;QD=2.71;SB=-31.85 GT:AD:DP:GL:GQ 0/1:24,55:26:-33.33,-7.83,-79.05:99
-chr1 2611761 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=2;HaplotypeScore=77.17;MQ=34.64;MQ0=9;OQ=73.97;QD=1.01;SB=-32.72 GT:AD:DP:GL:GQ 0/1:30,33:31:-23.41,-12.73,-88.75:99
-chr1 2611777 . A C 23.19 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=20.98;MQ=38.72;MQ0=5;QD=0.42;SB=23.10 GT:AD:DP:GL:GQ 0/1:24,30:28:-14.03,-8.43,-89.75:56.01
-chr1 2611805 . A G 44.82 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=14.04;MQ=39.70;MQ0=6;QD=0.79;SB=-36.77 GT:AD:DP:GL:GQ 0/1:29,28:32:-17.41,-9.64,-104.85:77.66
-chr1 2611822 . C T 55.46 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=121;Dels=0.00;HRun=0;HaplotypeScore=122.77;MQ=30.12;MQ0=10;QD=0.46;SB=-42.84 GT:AD:DP:GL:GQ 0/1:92,29:48:-23.31,-14.48,-136.72:88.30
-chr1 2611823 . G A 42.96 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=122.08;MQ=30.26;MQ0=10;QD=0.35;SB=5.54 GT:AD:DP:GL:GQ 0/1:91,15:51:-29.64,-22.06,-149.48:75.79
-chr1 2611827 . C G 117.16 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=127;Dels=0.00;HRun=1;HaplotypeScore=109.01;MQ=29.94;MQ0=10;QD=0.92;SB=-46.17 GT:AD:DP:GL:GQ 0/1:97,15:52:-50.99,-35.99,-189.94:99
-chr1 2611857 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=1;HaplotypeScore=130.70;MQ=25.34;MQ0=25;OQ=261.41;QD=1.07;SB=-55.24 GT:AD:DP:GL:GQ 0/1:221,22:85:-55.03,-25.61,-242.15:99
-chr1 2611880 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=242.50;MQ=25.49;MQ0=23;OQ=371.36;QD=1.47;SB=-110.03 GT:AD:DP:GL:GQ 0/1:223,22:91:-74.78,-34.36,-326.09:99
-chr1 2611909 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=0;HaplotypeScore=117.77;MQ=27.67;MQ0=16;OQ=1593.34;QD=8.80;SB=-695.72 GT:AD:DP:GL:GQ 0/1:25,155:74:-184.91,-22.29,-95.32:99
-chr1 2611913 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=162;Dels=0.01;HRun=0;HaplotypeScore=121.10;MQ=28.43;MQ0=16;OQ=688.73;QD=4.25;SB=-310.55 GT:AD:DP:GL:GQ 0/1:24,47:69:-160.80,-88.65,-165.59:99
-chr1 2611940 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=1;HaplotypeScore=46.12;MQ=30.62;MQ0=15;OQ=640.18;QD=4.61;SB=-181.43 GT:AD:DP:GL:GQ 0/1:50,89:56:-84.19,-16.88,-155.00:99
-chr1 2611948 . A C 23.15 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=138;Dels=0.00;HRun=1;HaplotypeScore=36.39;MQ=28.65;MQ0=12;QD=0.17;SB=47.17 GT:AD:DP:GL:GQ 0/1:116,20:55:-22.17,-16.57,-171.47:55.97
-chr1 2612014 rs28499205 G C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=56.64;MQ=32.76;MQ0=15;OQ=1145.21;QD=14.50;SB=-563.07 GT:AD:DP:GL:GQ 1/1:1,78:27:-118.11,-8.13,-0.01:81.27
-chr1 2612058 rs61765702 C T 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=0;HaplotypeScore=18.96;MQ=27.13;MQ0=31;OQ=323.91;QD=1.80;SB=-155.18 GT:AD:DP:GL:GQ 0/1:143,37:66:-55.56,-19.88,-179.35:99
-chr1 2612062 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=39.83;MQ=27.44;MQ0=33;OQ=304.96;QD=1.66;SB=-159.14 GT:AD:DP:GL:GQ 0/1:147,37:67:-53.98,-20.20,-229.14:99
-chr1 2612081 rs61765703 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=136;Dels=0.01;HRun=2;HaplotypeScore=85.10;MQ=27.93;MQ0=25;OQ=1205.35;QD=8.86;SB=-216.92 GT:AD:DP:GL:GQ 0/1:19,114:53:-139.78,-15.97,-53.09:99
-chr1 2612085 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=63.07;MQ=28.64;MQ0=22;OQ=1108.83;QD=8.66;SB=-225.89 GT:AD:DP:GL:GQ 0/1:16,110:51:-129.53,-15.36,-50.00:99
-chr1 2612107 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=1;HaplotypeScore=61.85;MQ=27.81;MQ0=21;OQ=276.90;QD=1.72;SB=-68.50 GT:AD:DP:GL:GQ 0/1:116,39:58:-48.45,-17.48,-165.18:99
-chr1 2612151 rs61765704 A C 24.50 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=129;Dels=0.02;HRun=0;HaplotypeScore=220.24;MQ=28.08;MQ0=15;QD=0.19;SB=6.59 GT:AD:DP:GL:GQ 0/1:44,80:28:-14.16,-8.43,-88.22:57.33
-chr1 2612161 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=149;Dels=0.05;HRun=2;HaplotypeScore=289.32;MQ=26.74;MQ0=14;OQ=154.71;QD=1.04;SB=-60.88 GT:AD:DP:GL:GQ 0/1:35,100:29:-27.20,-8.44,-77.78:99
-chr1 2612175 rs61765705 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=189;Dels=0.00;HRun=1;HaplotypeScore=208.27;MQ=26.09;MQ0=18;OQ=54.71;QD=0.29;SB=-8.07 GT:AD:DP:GL:GQ 0/1:131,51:39:-26.91,-18.15,-132.87:87.54
-chr1 2612187 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=211.77;MQ=24.98;MQ0=26;OQ=72.89;QD=0.35;SB=45.47 GT:AD:DP:GL:GQ 0/1:143,55:44:-28.75,-18.18,-125.97:99
-chr1 2612211 . C A 45.89 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=1;HaplotypeScore=262.96;MQ=25.29;MQ0=30;QD=0.22;SB=-5.55 GT:AD:DP:GL:GQ 0/1:190,13:50:-25.52,-17.65,-153.60:78.73
-chr1 2612261 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=73.22;MQ=36.24;MQ0=2;OQ=156.42;QD=1.55;SB=-48.52 GT:AD:DP:GL:GQ 0/1:66,32:53:-34.90,-15.97,-147.29:99
-chr1 2612283 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=4;HaplotypeScore=43.06;MQ=38.47;MQ0=2;OQ=327.02;QD=4.74;SB=-23.62 GT:AD:DP:GL:GQ 0/1:32,34:36:-46.54,-10.55,-82.71:99
-chr1 2612309 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=19.73;MQ=36.93;MQ0=0;OQ=479.11;QD=9.39;SB=-112.96 GT:AD:DP:GL:GQ 0/1:16,33:31:-63.92,-12.72,-54.61:99
-chr1 2612321 rs58055515 A C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.06;HRun=2;HaplotypeScore=36.08;MQ=38.02;MQ0=0;OQ=654.82;QD=13.64;SB=-115.75 GT:AD:DP:GL:GQ 1/1:1,35:27:-89.55,-24.40,-20.49:39.17
-chr1 2612344 . C G 24.81 LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=34.46;MQ=40.80;MQ0=2;QD=0.48;SB=-19.81 GT:AD:DP:GL:GQ 0/1:23,28:23:-12.71,-6.94,-79.49:57.63
-chr1 2612349 rs56814247 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=26.66;MQ=40.32;MQ0=2;OQ=741.43;QD=14.54;SB=-345.45 GT:AD:DP:GL:GQ 1/1:6,45:24:-77.75,-7.24,-0.02:72.17
-chr1 2612359 . A C 18.09 LowQual AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=26.16;MQ=43.64;MQ0=3;QD=0.33;SB=-28.97 GT:AD:DP:GL:GQ 0/1:34,20:31:-14.42,-9.34,-99.97:50.86
-chr1 2612360 . A C 30.50 LowQual AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=3;HaplotypeScore=20.17;MQ=44.05;MQ0=2;QD=0.58;SB=-0.42 GT:AD:DP:GL:GQ 0/1:26,25:28:-14.77,-8.43,-87.24:63.33
-chr1 2612401 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=42.26;MQ=44.22;MQ0=1;OQ=144.16;QD=2.72;SB=-18.17 GT:AD:DP:GL:GQ 0/1:29,20:34:-31.58,-13.88,-103.42:99
-chr1 2612402 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=41.27;MQ=43.87;MQ0=1;OQ=96.43;QD=1.85;SB=-29.80 GT:AD:DP:GL:GQ 0/1:26,21:30:-21.97,-9.04,-85.20:99
-chr1 2612447 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=39.94;MQ=46.94;MQ0=0;OQ=81.12;QD=1.66;SB=23.03 GT:AD:DP:GL:GQ 0/1:31,17:32:-23.40,-12.01,-88.55:99
-chr1 2612451 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=20.86;MQ=47.66;MQ0=0;OQ=53.68;QD=1.14;SB=26.08 GT:AD:DP:GL:GQ 0/1:30,14:32:-18.30,-9.65,-100.77:86.52
-chr1 2612461 . A C 44.60 LowQual AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=34.01;MQ=47.11;MQ0=0;QD=0.86;SB=-23.85 GT:AD:DP:GL:GQ 0/1:42,10:33:-17.68,-9.94,-101.23:77.43
-chr1 2612468 . C G 44.05 LowQual AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=46.41;MQ=45.54;MQ0=0;QD=0.76;SB=-1.30 GT:AD:DP:GL:GQ 0/1:51,7:35:-18.24,-10.55,-129.78:76.89
-chr1 2612500 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=0;HaplotypeScore=111.55;MQ=36.58;MQ0=2;OQ=75.18;QD=0.91;SB=-6.47 GT:AD:DP:GL:GQ 0/1:42,40:29:-19.55,-8.75,-75.63:99
-chr1 2612520 . C T 19.28 LowQual AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=133.17;MQ=33.82;MQ0=3;QD=0.19;SB=-16.60 GT:AD:DP:GL:GQ 0/1:87,13:36:-16.06,-10.85,-103.87:52.07
-chr1 2612521 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=3;HaplotypeScore=133.17;MQ=33.95;MQ0=3;OQ=122.65;QD=1.20;SB=-13.90 GT:AD:DP:GL:GQ 0/1:59,34:32:-39.02,-23.47,-101.66:99
-chr1 2612546 rs56822453 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=145.71;MQ=34.54;MQ0=2;OQ=1448.77;QD=15.58;SB=-452.10 GT:AD:DP:GL:GQ 1/1:7,78:40:-172.07,-31.81,-23.61:81.95
-chr1 2612548 . A G 23.46 LowQual AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=130.25;MQ=34.63;MQ0=2;QD=0.24;SB=-12.60 GT:AD:DP:GL:GQ 0/1:76,19:32:-15.27,-9.65,-107.66:56.27
-chr1 2612572 rs61765712 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=119.88;MQ=29.64;MQ0=12;OQ=136.28;QD=1.57;SB=-70.93 GT:AD:DP:GL:GQ 0/1:30,56:22:-23.54,-6.63,-51.28:99
-chr1 2612576 . C G 19.60 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=1;HaplotypeScore=117.65;MQ=28.19;MQ0=14;QD=0.19;SB=-14.55 GT:AD:DP:GL:GQ 0/1:68,14:25:-20.23,-14.99,-84.25:52.39
-chr1 2612600 . A C 31.76 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=4;HaplotypeScore=156.76;MQ=23.41;MQ0=28;QD=0.14;SB=30.15 GT:AD:DP:GL:GQ 0/1:163,45:61:-27.98,-21.52,-181.64:64.60
-chr1 2612627 . A C 39.29 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=243;Dels=0.00;HRun=0;HaplotypeScore=198.32;MQ=23.30;MQ0=41;QD=0.16;SB=-11.41 GT:AD:DP:GL:GQ 0/1:198,41:66:-27.09,-19.88,-204.81:72.12
-chr1 2612682 . A C 10.13 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=52.92;MQ=47.05;MQ0=0;QD=0.24;SB=14.06 GT:AD:DP:GL:GQ 0/1:27,14:23:-11.18,-6.93,-67.83:42.53
-chr1 2612696 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=17.87;MQ=44.37;MQ0=2;OQ=127.11;QD=2.08;SB=-25.83 GT:AD:DP:GL:GQ 0/1:32,29:31:-25.34,-9.35,-104.60:99
-chr1 2612737 rs61765713 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=31.73;MQ=37.37;MQ0=1;OQ=431.17;QD=5.01;SB=-153.88 GT:AD:DP:GL:GQ 0/1:41,45:46:-60.27,-13.87,-108.65:99
-chr1 2612767 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=55.42;MQ=39.20;MQ0=1;OQ=525.18;QD=6.48;SB=-145.82 GT:AD:DP:GL:GQ 0/1:30,49:46:-69.66,-13.86,-97.51:99
-chr1 2612773 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=50.07;MQ=38.87;MQ0=1;OQ=424.50;QD=5.31;SB=-154.37 GT:AD:DP:GL:GQ 0/1:53,27:45:-59.30,-13.57,-131.50:99
-chr1 2612799 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=27.45;MQ=41.43;MQ0=1;OQ=164.57;QD=2.70;SB=-62.57 GT:AD:DP:GL:GQ 0/1:27,34:35:-30.28,-10.54,-94.10:99
-chr1 2612844 rs55724072 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=94.30;MQ=38.07;MQ0=8;OQ=665.81;QD=9.12;SB=-251.98 GT:AD:DP:GL:GQ 0/1:45,26:28:-81.79,-11.92,-21.81:98.87
-chr1 2612950 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=215;Dels=0.00;HRun=0;HaplotypeScore=255.70;MQ=27.55;MQ0=15;OQ=78.72;QD=0.37;SB=19.51 GT:AD:DP:GL:GQ 0/1:145,61:50:-33.24,-22.08,-169.61:99
-chr1 2612958 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=205;Dels=0.05;HRun=2;HaplotypeScore=345.72;MQ=28.14;MQ0=11;OQ=268.77;QD=1.31;SB=-87.58 GT:AD:DP:GL:GQ 0/1:82,113:44:-43.44,-13.28,-132.37:99
-chr1 2612962 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=206;Dels=0.01;HRun=1;HaplotypeScore=293.73;MQ=28.22;MQ0=11;OQ=53.07;QD=0.26;SB=-7.29 GT:AD:DP:GL:GQ 0/1:160,36:46:-29.48,-20.89,-140.25:85.91
-chr1 2612982 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=165;Dels=0.00;HRun=0;HaplotypeScore=272.98;MQ=28.95;MQ0=11;OQ=81.29;QD=0.49;SB=23.09 GT:AD:DP:GL:GQ 0/1:43,117:27:-19.56,-8.14,-70.61:99
-chr1 2612988 rs28729890 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=157;Dels=0.00;HRun=1;HaplotypeScore=282.08;MQ=29.13;MQ0=10;OQ=1088.24;QD=6.93;SB=-426.67 GT:AD:DP:GL:GQ 1/1:3,146:27:-116.69,-11.76,-4.28:74.86
-chr1 2613013 . G A 31.52 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=131;Dels=0.00;HRun=1;HaplotypeScore=164.33;MQ=32.03;MQ0=7;QD=0.24;SB=26.10 GT:AD:DP:GL:GQ 0/1:117,14:35:-16.98,-10.54,-112.15:64.35
-chr1 2613017 . T C 180.98 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=137.52;MQ=33.34;MQ0=7;QD=1.65;SB=26.11 GT:AD:DP:GL:GQ 0/1:27,81:34:-31.63,-10.24,-97.73:99
-chr1 2613018 rs28484972 G C 140.73 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.00;HRun=0;HaplotypeScore=137.35;MQ=33.34;MQ0=7;QD=1.28;SB=31.01 GT:AD:DP:GL:GQ 0/1:28,44:35:-37.27,-19.91,-118.50:99
-chr1 2613040 rs55713073 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=61.60;MQ=39.34;MQ0=3;OQ=876.14;QD=14.13;SB=-413.05 GT:AD:DP:GL:GQ 0/1:33,24:31:-100.24,-9.35,-30.73:99
-chr1 2613043 . T C 38.29 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=3;HaplotypeScore=55.65;MQ=43.83;MQ0=2;QD=0.78;SB=29.13 GT:AD:DP:GL:GQ 0/1:25,20:28:-15.55,-8.44,-93.33:71.12
-chr1 2613090 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=62.85;MQ=32.34;MQ0=20;OQ=113.77;QD=0.92;SB=20.02 GT:AD:DP:GL:GQ 0/1:89,34:35:-25.22,-10.56,-90.70:99
-chr1 2613132 . T C 17.83 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=135.62;MQ=34.15;MQ0=7;QD=0.19;SB=20.93 GT:AD:DP:GL:GQ 0/1:49,17:34:-18.39,-13.34,-109.40:50.59
-chr1 2613155 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=54.50;MQ=36.94;MQ0=5;OQ=56.13;QD=0.85;SB=-8.31 GT:AD:DP:GL:GQ 0/1:26,40:25:-16.44,-7.54,-66.14:88.97
-chr1 2613166 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=54;Dels=0.04;HRun=0;HaplotypeScore=39.25;MQ=40.07;MQ0=1;OQ=108.06;QD=2.00;SB=-13.35 GT:AD:DP:GL:GQ 0/1:25,27:25:-21.62,-7.53,-86.20:99
-chr1 2613178 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=39.82;MQ=40.42;MQ0=1;OQ=87.18;QD=1.53;SB=-9.45 GT:AD:DP:GL:GQ 0/1:38,18:28:-20.44,-8.44,-74.35:99
-chr1 2613186 rs28398452 A T 0.15 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=19.52;MQ=46.06;MQ0=0;OQ=818.22;QD=19.96;SB=-414.28 GT:AD:DP:GL:GQ 1/1:0,40:23:-85.41,-6.93,-0.01:69.21
-chr1 2613234 . C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=40.12;MQ=46.29;MQ0=1;OQ=1357.25;QD=31.56;SB=-584.52 GT:AD:DP:GL:GQ 1/1:1,41:32:-139.32,-9.64,-0.01:96.32
-chr1 2613318 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=61.23;MQ=29.57;MQ0=14;OQ=124.73;QD=1.48;SB=-14.36 GT:AD:DP:GL:GQ 0/1:67,16:36:-26.61,-10.86,-123.23:99
-chr1 2613323 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=0;HaplotypeScore=72.34;MQ=25.61;MQ0=20;OQ=95.66;QD=0.62;SB=33.80 GT:AD:DP:GL:GQ 0/1:133,12:61:-34.86,-22.01,-226.45:99
-chr1 2613370 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=0;HaplotypeScore=293.23;MQ=21.10;MQ0=61;OQ=714.05;QD=1.79;SB=-288.95 GT:AD:DP:GL:GQ 0/1:327,73:124:-112.05,-37.36,-344.59:99
-chr1 2613374 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=416;Dels=0.00;HRun=0;HaplotypeScore=328.46;MQ=20.95;MQ0=62;OQ=571.93;QD=1.37;SB=-114.36 GT:AD:DP:GL:GQ 0/1:288,118:123:-97.54,-37.07,-375.44:99
-chr1 2613385 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=437;Dels=0.00;HRun=0;HaplotypeScore=225.97;MQ=20.17;MQ0=68;OQ=628.49;QD=1.44;SB=-284.83 GT:AD:DP:GL:GQ 0/1:363,65:125:-113.05,-46.91,-348.87:99
-chr1 2613405 rs61765715 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=430;Dels=0.00;HRun=0;HaplotypeScore=214.90;MQ=20.78;MQ0=65;OQ=1559.54;QD=3.63;SB=-415.95 GT:AD:DP:GL:GQ 0/1:296,132:120:-195.39,-36.15,-225.88:99
-chr1 2613406 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=428;Dels=0.00;HRun=0;HaplotypeScore=190.35;MQ=20.81;MQ0=64;OQ=96.31;QD=0.23;SB=35.50 GT:AD:DP:GL:GQ 0/1:369,32:113:-77.37,-64.46,-359.74:99
-chr1 2613418 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=358;Dels=0.00;HRun=0;HaplotypeScore=49.55;MQ=21.34;MQ0=50;OQ=281.60;QD=0.79;SB=32.81 GT:AD:DP:GL:GQ 0/1:313,45:98:-60.98,-29.53,-359.08:99
-chr1 2613432 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=200;Dels=0.00;HRun=2;HaplotypeScore=59.86;MQ=23.20;MQ0=28;OQ=127.98;QD=0.64;SB=-77.60 GT:AD:DP:GL:GQ 0/1:175,24:60:-37.72,-21.64,-201.76:99
-chr1 2613443 rs61765716 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=4;HaplotypeScore=21.82;MQ=28.33;MQ0=15;OQ=129.32;QD=1.54;SB=2.14 GT:AD:DP:GL:GQ 0/1:37,47:28:-24.65,-8.44,-74.06:99
-chr1 2613523 rs61765738 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=30.76;MQ=30.14;MQ0=9;OQ=85.37;QD=1.61;SB=5.05 GT:AD:DP:GL:GQ 0/1:23,13:17:-22.76,-10.94,-45.61:99
-chr1 2613566 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=71;Dels=0.04;HRun=3;HaplotypeScore=57.78;MQ=26.34;MQ0=13;OQ=54.80;QD=0.77;SB=8.05 GT:AD:DP:GL:GQ 0/1:32,29:23:-15.40,-6.63,-70.44:87.64
-chr1 2613630 . G A 0.07 PASS AC=2;AF=1.00;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=13.24;MQ=22.14;MQ0=5;OQ=193.82;QD=10.20;SB=-82.32 GT:AD:DP:GL:GQ 1/1:2,17:6:-22.96,-1.81,-0.00:18.06
-chr1 2613635 . G A 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=13.88;MQ=20.75;MQ0=5;OQ=116.09;QD=7.26;SB=-82.32 GT:AD:DP:GL:GQ 1/1:1,15:4:-15.15,-1.21,-0.00:12.04
-chr1 2613646 . G C 10.99 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.07;HRun=2;HaplotypeScore=14.02;MQ=19.81;MQ0=4;QD=0.79;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,8:1:-4.35,-0.30,-0.00:1.76
-chr1 2613690 . T C 13.23 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=116.33;MQ=18.38;MQ0=8;QD=0.19;SB=-10.00 GT:AD:DP:GL:GQ 0/1:49,18:4:-5.79,-1.21,-8.34:45.86
-chr1 2613693 . G C 35.94 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=149.70;MQ=18.45;MQ0=8;QD=0.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:76,3:6:-8.69,-1.81,-15.69:68.78
-chr1 2613698 . T G 15.64 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=2;HaplotypeScore=190.59;MQ=18.98;MQ0=9;QD=0.16;SB=-10.00 GT:AD:DP:GL:GQ 0/1:64,7:8:-12.71,-7.87,-20.94:48.35
-chr1 2613700 . G A 196.12 SnpCluster AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=236.20;MQ=18.98;MQ0=9;QD=2.06;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,83:8:-25.29,-2.41,-3.47:10.61
-chr1 2613710 . G A 290.78 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=258.37;MQ=18.71;MQ0=19;QD=1.88;SB=-45.65 GT:AD:DP:GL:GQ 0/1:71,77:15:-43.35,-10.99,-17.24:62.53
-chr1 2613712 . A G 19.12 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=162;Dels=0.00;HRun=1;HaplotypeScore=303.47;MQ=18.88;MQ0=19;QD=0.12;SB=-3.98 GT:AD:DP:GL:GQ 0/1:153,6:17:-10.32,-5.13,-49.10:51.90
-chr1 2613717 . C G 26.91 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=408.47;MQ=18.72;MQ0=23;QD=0.14;SB=-6.99 GT:AD:DP:GL:GQ 0/1:167,10:18:-16.44,-10.47,-59.87:59.74
-chr1 2613725 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=210;Dels=0.00;HRun=0;HaplotypeScore=344.41;MQ=18.80;MQ0=26;OQ=51.69;QD=0.25;SB=-6.99 GT:AD:DP:GL:GQ 0/1:188,19:21:-17.15,-8.70,-57.87:84.53
-chr1 2613732 . A C 62.04 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=212;Dels=0.00;HRun=0;HaplotypeScore=339.87;MQ=19.08;MQ0=26;QD=0.29;SB=-6.99 GT:AD:DP:GL:GQ 0/1:184,21:14:-13.71,-4.22,-32.30:94.88
-chr1 2613741 . C T 167.14 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=432.19;MQ=19.10;MQ0=22;QD=0.81;SB=-10.00 GT:AD:DP:GL:GQ 0/1:175,24:13:-27.15,-7.15,-25.74:99
-chr1 2613742 . T A 554.18 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=437.29;MQ=19.15;MQ0=21;QD=2.73;SB=-10.00 GT:AD:DP:GL:GQ 1/1:10,159:27:-96.09,-42.87,-37.09:57.79
-chr1 2613744 . C T 234.43 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=208;Dels=0.00;HRun=0;HaplotypeScore=584.09;MQ=19.37;MQ0=21;QD=1.13;SB=-10.00 GT:AD:DP:GL:GQ 0/1:171,26:22:-36.59,-9.87,-49.51:99
-chr1 2613745 . C G 76.87 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=0;HaplotypeScore=579.63;MQ=19.38;MQ0=20;QD=0.37;SB=-10.00 GT:AD:DP:GL:GQ 0/1:148,19:15:-15.49,-4.52,-49.92:99
-chr1 2613750 . G A 306.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=658.57;MQ=19.32;MQ0=20;QD=1.48;SB=-7.01 GT:AD:DP:GL:GQ 0/1:99,104:19:-39.62,-5.73,-26.69:99
-chr1 2613754 . C A 11.17 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=223;Dels=0.00;HRun=1;HaplotypeScore=578.78;MQ=19.04;MQ0=24;QD=0.05;SB=-7.00 GT:AD:DP:GL:GQ 0/1:199,19:23:-11.29,-6.93,-65.57:43.66
-chr1 2613765 . C A 112.66 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=0;HaplotypeScore=358.32;MQ=18.80;MQ0=30;QD=0.49;SB=-6.99 GT:AD:DP:GL:GQ 0/1:192,30:26:-22.38,-7.83,-66.37:99
-chr1 2613766 . C G 145.08 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=229;Dels=0.00;HRun=0;HaplotypeScore=340.83;MQ=18.60;MQ0=30;QD=0.63;SB=-3.99 GT:AD:DP:GL:GQ 0/1:197,20:34:-28.04,-10.25,-119.31:99
-chr1 2613770 . T C 33.51 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=219;Dels=0.00;HRun=0;HaplotypeScore=286.65;MQ=18.56;MQ0=29;QD=0.15;SB=-3.99 GT:AD:DP:GL:GQ 0/1:176,33:38:-18.09,-11.45,-126.83:66.35
-chr1 2613772 . A G 57.20 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=261.18;MQ=18.59;MQ0=29;QD=0.26;SB=-0.97 GT:AD:DP:GL:GQ 0/1:199,13:41:-24.12,-15.12,-140.12:90.03
-chr1 2613796 . G C 177.04 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=135;Dels=0.04;HRun=2;HaplotypeScore=330.87;MQ=18.33;MQ0=22;QD=1.31;SB=-45.45 GT:AD:DP:GL:GQ 0/1:71,48:21:-34.21,-13.22,-61.82:99
-chr1 2613800 . G A 69.22 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=111;Dels=0.04;HRun=0;HaplotypeScore=218.43;MQ=17.88;MQ0=19;QD=0.62;SB=-7.00 GT:AD:DP:GL:GQ 0/1:92,15:13:-14.13,-3.92,-31.45:99
-chr1 2613801 . C G 13.55 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=246.51;MQ=18.17;MQ0=17;QD=0.12;SB=-7.00 GT:AD:DP:GL:GQ 0/1:104,4:15:-12.67,-8.05,-55.30:46.19
-chr1 2613803 . C A 151.29 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=241.51;MQ=18.66;MQ0=17;QD=1.36;SB=-3.98 GT:AD:DP:GL:GQ 0/1:89,19:17:-27.02,-8.61,-39.19:99
-chr1 2613805 . C T 87.71 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=0;HaplotypeScore=208.83;MQ=18.81;MQ0=15;QD=0.80;SB=-0.98 GT:AD:DP:GL:GQ 0/1:93,15:13:-15.97,-3.92,-32.68:99
-chr1 2613807 . C T 57.07 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=165.36;MQ=18.87;MQ0=15;QD=0.53;SB=-3.99 GT:AD:DP:GL:GQ 0/1:93,9:11:-12.30,-3.31,-28.01:89.90
-chr1 2613812 . G A 29.24 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=106.13;MQ=18.30;MQ0=14;QD=0.32;SB=-3.99 GT:AD:DP:GL:GQ 0/1:75,16:5:-7.71,-1.51,-10.06:62.07
-chr1 2613813 . T C 74.94 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=91.21;MQ=18.35;MQ0=14;QD=0.88;SB=-6.99 GT:AD:DP:GL:GQ 0/1:16,66:5:-12.29,-1.51,-3.76:22.52
-chr1 2613826 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=36.04;MQ=20.56;MQ0=13;OQ=192.78;QD=2.30;SB=-28.63 GT:AD:DP:GL:GQ 0/1:21,57:13:-29.99,-7.43,-22.77:99
-chr1 2613831 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=23.92;MQ=20.73;MQ0=14;OQ=180.38;QD=2.20;SB=-29.94 GT:AD:DP:GL:GQ 0/1:21,61:13:-25.24,-3.92,-19.14:99
-chr1 2613859 . G T 41.43 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=24.92;MQ=20.48;MQ0=13;QD=0.62;SB=-43.38 GT:AD:DP:GL:GQ 0/1:19,47:11:-10.74,-3.32,-20.71:74.26
-chr1 2613869 rs28391329 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=60.53;MQ=21.20;MQ0=15;OQ=293.59;QD=2.94;SB=-0.98 GT:AD:DP:GL:GQ 0/1:82,18:19:-38.38,-5.73,-37.90:99
-chr1 2613889 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=72.75;MQ=25.64;MQ0=15;OQ=180.19;QD=1.96;SB=-114.68 GT:AD:DP:GL:GQ 0/1:18,61:28:-47.05,-25.75,-76.38:99
-chr1 2613903 rs11486068 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=48.68;MQ=24.40;MQ0=19;OQ=50.76;QD=0.51;SB=-13.14 GT:AD:DP:GL:GQ 0/1:40,15:30:-30.07,-21.71,-94.96:83.60
-chr1 2613959 rs61765741 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=0;HaplotypeScore=30.66;MQ=19.75;MQ0=50;OQ=129.32;QD=0.85;SB=-3.99 GT:AD:DP:GL:GQ 0/1:135,11:45:-36.43,-20.22,-129.55:99
-chr1 2613977 rs61765742 T A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=20.51;MQ=18.10;MQ0=36;OQ=631.54;QD=6.19;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,87:32:-76.08,-9.64,-40.58:99
-chr1 2614061 . C G 47.32 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=9.70;MQ=18.60;MQ0=18;QD=1.05;SB=-42.45 GT:AD:DP:GL:GQ 0/1:29,16:12:-11.64,-3.62,-36.27:80.16
-chr1 2614087 rs61765744 A C 20.16 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=3;HaplotypeScore=20.71;MQ=12.14;MQ0=19;QD=0.63;SB=-6.99 GT:AD:DP:GL:GQ 0/1:25,7:6:-7.10,-1.81,-13.92:52.96
-chr1 2614090 . A G 19.51 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=20.91;MQ=12.88;MQ0=18;QD=0.59;SB=-6.99 GT:AD:DP:GL:GQ 0/1:21,12:7:-7.34,-2.11,-20.39:52.30
-chr1 2614091 . G C 37.94 HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=21.91;MQ=12.37;MQ0=20;QD=1.05;SB=-6.99 GT:AD:DP:GL:GQ 0/1:28,8:7:-9.19,-2.11,-21.58:70.77
-chr1 2614114 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=32.88;MQ=18.47;MQ0=36;OQ=121.42;QD=1.52;SB=-36.64 GT:AD:DP:GL:GQ 0/1:36,44:20:-21.46,-6.03,-44.98:99
-chr1 2614128 . T C 13.34 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=4;HaplotypeScore=47.41;MQ=18.72;MQ0=40;QD=0.11;SB=-2.29 GT:AD:DP:GL:GQ 0/1:78,34:26:-19.39,-14.79,-91.44:45.97
-chr1 2614209 . G A 41.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=1;HaplotypeScore=24.29;MQ=22.02;MQ0=31;QD=0.45;SB=-24.59 GT:AD:DP:GL:GQ 0/1:55,36:29:-16.14,-8.74,-87.91:74.08
-chr1 2614364 rs28730517 A C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=28.46;MQ=18.26;MQ0=16;OQ=311.67;QD=6.23;SB=-151.28 GT:AD:DP:GL:GQ 1/1:14,32:12:-37.44,-3.62,-2.80:8.16
-chr1 2614590 rs28497985 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=34.12;MQ=28.69;MQ0=18;OQ=755.20;QD=6.74;SB=-383.20 GT:AD:DP:GL:GQ 0/1:87,25:65:-98.40,-19.59,-181.93:99
-chr1 2614771 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=33.03;MQ=8.84;MQ0=54;OQ=63.99;QD=0.94;SB=-10.00 GT:AD:DP:GL:GQ 0/1:54,14:6:-11.49,-1.81,-12.10:96.82
-chr1 2614794 . A C 36.23 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=12.63;MQ=15.22;MQ0=54;QD=0.39;SB=8.03 GT:AD:DP:GL:GQ 0/1:56,38:25:-14.44,-7.53,-71.85:69.07
-chr1 2614835 rs61765748 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=146;Dels=0.00;HRun=0;HaplotypeScore=67.43;MQ=23.43;MQ0=43;OQ=134.71;QD=0.92;SB=83.23 GT:AD:DP:GL:GQ 0/1:105,39:61:-35.15,-18.40,-166.15:99
-chr1 2615014 . A G 45.47 PASS AC=2;AF=1.00;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=21.27;MQ0=3;OQ=106.85;QD=8.90;SB=-34.66 GT:AD:DP:GL:GQ 1/1:0,12:5:-14.25,-1.51,-0.01:15.01
-chr1 2615159 . C A 49.14 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=220;Dels=0.00;HRun=2;HaplotypeScore=142.59;MQ=8.79;MQ0=169;QD=0.22;SB=-7.86 GT:AD:DP:GL:GQ 0/1:185,31:17:-13.32,-5.12,-43.12:81.98
-chr1 2615230 . C G 11.72 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=6.15;MQ=11.52;MQ0=52;QD=0.14;SB=-26.39 GT:AD:DP:GL:GQ 0/1:72,12:14:-8.65,-4.23,-47.78:44.25
-chr1 2615372 . G A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=29.65;MQ=17.03;MQ0=60;OQ=691.36;QD=8.13;SB=-292.88 GT:AD:DP:GL:GQ 1/1:59,24:18:-72.73,-5.42,-0.01:54.18
-chr1 2615442 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=52.99;MQ=12.22;MQ0=96;OQ=368.66;QD=2.38;SB=-99.96 GT:AD:DP:GL:GQ 0/1:30,125:25:-47.68,-7.53,-41.84:99
-chr1 2615466 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=61.50;MQ=14.17;MQ0=69;OQ=112.35;QD=0.77;SB=-18.60 GT:AD:DP:GL:GQ 0/1:116,29:31:-23.86,-9.34,-81.69:99
-chr1 2615470 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=63.31;MQ=14.07;MQ0=68;OQ=351.94;QD=2.53;SB=-90.74 GT:AD:DP:GL:GQ 0/1:65,72:34:-48.72,-10.24,-70.14:99
-chr1 2615502 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=32.33;MQ=16.10;MQ0=38;OQ=288.56;QD=3.65;SB=2.03 GT:AD:DP:GL:GQ 0/1:49,30:24:-39.38,-7.24,-59.32:99
-chr1 2615515 . T G 27.54 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=32.70;MQ=13.65;MQ0=43;QD=0.37;SB=-0.98 GT:AD:DP:GL:GQ 0/1:31,13:15:-18.30,-12.26,-45.52:60.37
-chr1 2615553 . G A 21.44 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=1;HaplotypeScore=33.08;MQ=9.60;MQ0=74;QD=0.23;SB=-3.99 GT:AD:DP:GL:GQ 0/1:70,24:9:-8.14,-2.71,-26.22:54.25
-chr1 2615563 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=52.83;MQ=8.09;MQ0=76;OQ=64.78;QD=0.70;SB=-10.00 GT:AD:DP:GL:GQ 0/1:82,10:5:-11.27,-1.51,-6.24:47.31
-chr1 2615689 . T C 30.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=62.56;MQ=10.13;MQ0=88;QD=0.28;SB=-3.98 GT:AD:DP:GL:GQ 0/1:18,89:9:-9.09,-2.71,-22.98:63.77
-chr1 2615717 rs61765669 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=37.80;MQ=10.99;MQ0=80;OQ=103.09;QD=0.95;SB=-3.99 GT:AD:DP:GL:GQ 0/1:26,83:10:-16.61,-3.01,-17.76:99
-chr1 2615757 . C A 39.74 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=1;HaplotypeScore=30.17;MQ=13.18;MQ0=60;QD=0.43;SB=0.17 GT:AD:DP:GL:GQ 0/1:71,20:17:-15.95,-8.69,-48.17:72.57
-chr1 2615837 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=39.99;MQ=26.86;MQ0=21;OQ=73.19;QD=1.33;SB=-36.22 GT:AD:DP:GL:GQ 0/1:29,26:20:-16.63,-6.03,-56.46:99
-chr1 2615892 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=3;HaplotypeScore=44.02;MQ=30.58;MQ0=2;OQ=63.96;QD=1.12;SB=26.10 GT:AD:DP:GL:GQ 0/1:25,32:26:-17.51,-7.83,-73.92:96.79
-chr1 2615945 rs28619423 T C 0.80 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=8.32;MQ=22.59;MQ0=1;OQ=99.94;QD=5.26;SB=-76.91 GT:AD:DP:GL:GQ 1/1:3,15:4:-13.53,-1.21,-0.00:12.03
-chr1 2615949 rs28373809 G A 10.26 LowQual AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=9.32;MQ=19.47;MQ0=1;QD=0.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,14:1:-4.27,-0.30,-0.00:1.76
-chr1 2615990 . C G 0.11 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=8.97;MQ=20.31;MQ0=1;OQ=58.76;QD=6.53;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:2:-9.28,-0.60,-0.00:6.02
-chr1 2615997 . G A 36.46 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=29.63;MQ=20.63;MQ0=6;QD=1.35;SB=-7.00 GT:AD:DP:GL:GQ 0/1:18,9:5:-8.44,-1.51,-10.16:69.30
-chr1 2616009 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=37.74;MQ=29.64;MQ0=6;OQ=112.90;QD=3.53;SB=-3.99 GT:AD:DP:GL:GQ 0/1:15,17:12:-18.19,-3.62,-24.59:99
-chr1 2616012 . A C 43.77 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=39.70;MQ=31.56;MQ0=5;QD=1.41;SB=-0.98 GT:AD:DP:GL:GQ 0/1:13,18:11:-10.97,-3.31,-27.78:76.61
-chr1 2616021 . C A 30.19 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=71.42;MQ=30.54;MQ0=5;QD=0.70;SB=-0.98 GT:AD:DP:GL:GQ 0/1:37,6:16:-11.12,-4.82,-46.67:63.02
-chr1 2616048 . A C 104.33 Indel AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=256.69;MQ=33.48;MQ0=5;QD=1.53;SB=-0.98 GT:AD:DP:GL:GQ 0/1:26,38:27:-21.85,-8.13,-76.79:99
-chr1 2616053 . A C 36.21 Indel;LowQual AC=1;AF=0.50;AN=2;DP=80;Dels=0.06;HRun=3;HaplotypeScore=159.99;MQ=31.20;MQ0=8;QD=0.45;SB=-3.99 GT:AD:DP:GL:GQ 0/1:43,32:27:-15.04,-8.13,-81.51:69.04
-chr1 2616066 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=127.16;MQ=28.37;MQ0=17;OQ=116.17;QD=0.90;SB=11.03 GT:AD:DP:GL:GQ 0/1:64,41:40:-43.16,-28.26,-112.08:99
-chr1 2616091 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=152;Dels=0.02;HRun=3;HaplotypeScore=245.31;MQ=26.01;MQ0=24;OQ=74.30;QD=0.49;SB=8.05 GT:AD:DP:GL:GQ 0/1:77,30:40:-32.83,-22.11,-117.91:99
-chr1 2616098 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=238.65;MQ=25.86;MQ0=23;OQ=203.33;QD=1.36;SB=8.03 GT:AD:DP:GL:GQ 0/1:83,65:39:-35.37,-11.76,-97.26:99
-chr1 2616121 rs28707614 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=1;HaplotypeScore=348.16;MQ=25.38;MQ0=21;OQ=754.79;QD=6.92;SB=-132.69 GT:AD:DP:GL:GQ 0/1:14,95:27:-86.90,-8.14,-12.11:39.77
-chr1 2616201 rs28495110 G T 0.10 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=18.82;MQ=45.96;MQ0=6;OQ=1088.68;QD=25.92;SB=-422.58 GT:AD:DP:GL:GQ 1/1:8,34:31:-112.47,-9.34,-0.01:93.25
-chr1 2616235 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=22.81;MQ=34.27;MQ0=9;OQ=189.73;QD=2.67;SB=-88.83 GT:AD:DP:GL:GQ 0/1:28,43:31:-31.59,-9.34,-82.55:99
-chr1 2616250 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=1;HaplotypeScore=98.35;MQ=24.83;MQ0=26;OQ=53.95;QD=0.27;SB=-52.26 GT:AD:DP:GL:GQ 0/1:175,16:77:-39.01,-30.33,-235.94:86.79
-chr1 2616284 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=316;Dels=0.00;HRun=0;HaplotypeScore=207.75;MQ=22.41;MQ0=34;OQ=472.89;QD=1.50;SB=-261.05 GT:AD:DP:GL:GQ 0/1:280,35:108:-83.11,-32.54,-299.84:99
-chr1 2616291 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=168.73;MQ=22.17;MQ0=35;OQ=503.17;QD=1.63;SB=-147.25 GT:AD:DP:GL:GQ 0/1:228,77:110:-86.74,-33.14,-306.67:99
-chr1 2616303 rs61765755 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=285;Dels=0.00;HRun=0;HaplotypeScore=48.79;MQ=22.14;MQ0=36;OQ=3893.80;QD=13.66;SB=-1294.80 GT:AD:DP:GL:GQ 0/1:13,240:102:-388.38,-54.71,-62.45:77.36
-chr1 2616333 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=234;Dels=0.00;HRun=0;HaplotypeScore=268.36;MQ=23.38;MQ0=29;OQ=127.30;QD=0.54;SB=-30.73 GT:AD:DP:GL:GQ 0/1:215,16:95:-44.63,-28.62,-299.60:99
-chr1 2616354 rs7544898 A C 1854.66 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=113;Dels=0.00;HRun=1;HaplotypeScore=61.29;MQ=28.89;MQ0=15;QD=16.41;SB=-484.04 GT:AD:DP:GL:GQ 1/1:2,105:53:-193.02,-19.43,-3.97:99
-chr1 2616358 . A G 865.25 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=46.74;MQ=30.83;MQ0=11;QD=8.83;SB=-6.56 GT:AD:DP:GL:GQ 0/1:29,69:51:-105.17,-15.36,-93.21:99
-chr1 2616363 . G C 842.15 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=1;HaplotypeScore=46.38;MQ=31.26;MQ0=12;QD=8.68;SB=-14.79 GT:AD:DP:GL:GQ 0/1:55,42:53:-103.48,-15.98,-115.82:99
-chr1 2616398 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=48.31;MQ=34.63;MQ0=12;OQ=554.46;QD=5.84;SB=10.29 GT:AD:DP:GL:GQ 0/1:66,29:54:-75.00,-16.28,-154.28:99
-chr1 2616612 . G C 20.97 LowQual AC=1;AF=0.50;AN=2;DP=70;Dels=0.01;HRun=0;HaplotypeScore=165.26;MQ=30.37;MQ0=2;QD=0.30;SB=-32.74 GT:AD:DP:GL:GQ 0/1:19,45:24:-19.94,-14.57,-91.68:53.77
-chr1 2616615 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=3;HaplotypeScore=70.16;MQ=28.36;MQ0=2;OQ=89.21;QD=1.29;SB=-14.35 GT:AD:DP:GL:GQ 0/1:26,38:19:-17.94,-5.74,-58.45:99
-chr1 2616647 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=0;HaplotypeScore=217.54;MQ=24.00;MQ0=30;OQ=94.92;QD=0.69;SB=35.11 GT:AD:DP:GL:GQ 0/1:84,43:37:-23.93,-11.16,-103.88:99
-chr1 2616654 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=1;HaplotypeScore=223.04;MQ=23.83;MQ0=42;OQ=359.87;QD=1.99;SB=35.13 GT:AD:DP:GL:GQ 0/1:140,35:44:-52.54,-13.27,-92.39:99
-chr1 2616670 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=198;Dels=0.00;HRun=0;HaplotypeScore=299.99;MQ=23.86;MQ0=44;OQ=60.86;QD=0.31;SB=35.11 GT:AD:DP:GL:GQ 0/1:127,67:50:-24.46,-15.09,-137.52:93.69
-chr1 2616692 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=0;HaplotypeScore=231.37;MQ=26.06;MQ0=26;OQ=91.62;QD=0.55;SB=35.13 GT:AD:DP:GL:GQ 0/1:91,73:56:-32.64,-20.19,-183.88:99
-chr1 2616713 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=98.28;MQ=31.06;MQ0=12;OQ=565.06;QD=6.81;SB=-40.25 GT:AD:DP:GL:GQ 0/1:27,50:40:-78.76,-18.97,-82.14:99
-chr1 2616803 . G C 11.63 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=76;Dels=0.01;HRun=0;HaplotypeScore=115.33;MQ=32.59;MQ0=10;QD=0.15;SB=23.09 GT:AD:DP:GL:GQ 0/1:27,42:23:-11.36,-6.95,-79.45:44.16
-chr1 2616826 . T C 18.72 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=39.74;MQ=39.24;MQ0=2;QD=0.38;SB=20.09 GT:AD:DP:GL:GQ 0/1:24,24:22:-11.78,-6.63,-68.52:51.50
-chr1 2616954 rs28486014 C A 1246.57 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=172;Dels=0.00;HRun=0;HaplotypeScore=118.85;MQ=19.01;MQ0=19;QD=7.25;SB=-604.12 GT:AD:DP:GL:GQ 1/1:2,165:36:-131.25,-13.77,-3.01:99
-chr1 2616962 . A G 25.32 DPFilter;HARD_TO_VALIDATE;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=218;Dels=0.00;HRun=0;HaplotypeScore=150.59;MQ=18.32;MQ0=25;QD=0.12;SB=17.48 GT:AD:DP:GL:GQ 0/1:179,39:39:-17.57,-11.75,-132.90:58.14
-chr1 2616963 . C G 90.14 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=167.60;MQ=18.42;MQ0=25;QD=0.41;SB=8.17 GT:AD:DP:GL:GQ 0/1:182,34:40:-27.79,-15.49,-139.11:99
-chr1 2616976 . C A 13.99 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=267;Dels=0.00;HRun=0;HaplotypeScore=283.46;MQ=18.62;MQ0=35;QD=0.05;SB=55.93 GT:AD:DP:GL:GQ 0/1:236,26:51:-20.03,-15.36,-160.20:46.65
-chr1 2616982 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=251.51;MQ=19.64;MQ0=37;OQ=486.76;QD=1.74;SB=8.99 GT:AD:DP:GL:GQ 0/1:187,73:54:-71.97,-20.01,-131.66:99
-chr1 2617013 . A C 16.86 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=5;HaplotypeScore=227.22;MQ=22.36;MQ0=34;QD=0.07;SB=14.07 GT:AD:DP:GL:GQ 0/1:208,22:59:-25.00,-20.04,-187.42:49.60
-chr1 2617015 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=222;Dels=0.00;HRun=0;HaplotypeScore=200.07;MQ=22.66;MQ0=33;OQ=161.89;QD=0.73;SB=20.10 GT:AD:DP:GL:GQ 0/1:186,27:59:-43.12,-23.65,-203.21:99
-chr1 2617028 rs61765757 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=178;Dels=0.00;HRun=0;HaplotypeScore=111.43;MQ=24.75;MQ0=28;OQ=1236.03;QD=6.94;SB=-23.31 GT:AD:DP:GL:GQ 0/1:36,141:55:-143.45,-16.57,-61.22:99
-chr1 2617033 rs61765759 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=173;Dels=0.00;HRun=0;HaplotypeScore=123.68;MQ=24.76;MQ0=29;OQ=945.67;QD=5.47;SB=-60.88 GT:AD:DP:GL:GQ 0/1:19,129:49:-112.61,-14.76,-62.28:99
-chr1 2617058 rs28585375 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=236;Dels=0.00;HRun=0;HaplotypeScore=112.06;MQ=22.97;MQ0=54;OQ=357.80;QD=1.52;SB=-120.52 GT:AD:DP:GL:GQ 0/1:214,20:72:-60.76,-21.69,-192.59:99
-chr1 2617101 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=207;Dels=0.00;HRun=1;HaplotypeScore=89.01;MQ=23.73;MQ0=48;OQ=1884.44;QD=9.10;SB=-387.68 GT:AD:DP:GL:GQ 0/1:34,172:76:-214.63,-22.90,-42.31:99
-chr1 2617123 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=48.50;MQ=26.08;MQ0=56;OQ=129.18;QD=0.64;SB=-72.20 GT:AD:DP:GL:GQ 0/1:185,17:80:-40.33,-24.13,-284.57:99
-chr1 2617151 . G C 42.86 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=2;HaplotypeScore=97.11;MQ=23.22;MQ0=69;QD=0.22;SB=-10.77 GT:AD:DP:GL:GQ 0/1:167,21:55:-24.18,-16.61,-193.30:75.70
-chr1 2617160 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=181;Dels=0.00;HRun=1;HaplotypeScore=68.35;MQ=20.95;MQ0=76;OQ=103.39;QD=0.57;SB=17.08 GT:AD:DP:GL:GQ 0/1:148,32:50:-28.69,-15.07,-157.59:99
-chr1 2617178 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.01;HRun=4;HaplotypeScore=67.98;MQ=19.71;MQ0=69;OQ=224.46;QD=1.59;SB=-23.83 GT:AD:DP:GL:GQ 0/1:56,82:32:-35.39,-9.66,-90.46:99
-chr1 2617216 . T C 14.18 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=2;HaplotypeScore=54.33;MQ=16.92;MQ0=58;QD=0.13;SB=5.04 GT:AD:DP:GL:GQ 0/1:54,55:21:-11.01,-6.33,-70.16:46.85
-chr1 2617218 . C G 13.85 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=108;Dels=0.00;HRun=0;HaplotypeScore=69.57;MQ=15.97;MQ0=58;QD=0.13;SB=5.05 GT:AD:DP:GL:GQ 0/1:87,20:21:-10.98,-6.33,-76.68:46.51
-chr1 2617261 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=41.53;MQ=20.71;MQ0=16;OQ=109.26;QD=1.79;SB=-48.91 GT:AD:DP:GL:GQ 0/1:26,35:19:-19.93,-5.73,-46.91:99
-chr1 2617273 rs61466658 T C 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=31.65;MQ=19.33;MQ0=33;OQ=744.68;QD=8.97;SB=-307.99 GT:AD:DP:GL:GQ 1/1:6,73:24:-80.83,-7.23,-2.78:44.58
-chr1 2617320 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=383;Dels=0.00;HRun=2;HaplotypeScore=179.89;MQ=20.12;MQ0=69;OQ=511.87;QD=1.34;SB=-192.93 GT:AD:DP:GL:GQ 0/1:271,102:88:-80.98,-26.51,-240.14:99
-chr1 2617333 . A C 189.16 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=1;HaplotypeScore=324.51;MQ=20.25;MQ0=68;QD=0.46;SB=-46.42 GT:AD:DP:GL:GQ 0/1:362,48:102:-52.93,-30.73,-310.85:99
-chr1 2617334 . C T 347.52 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=413;Dels=0.00;HRun=0;HaplotypeScore=315.80;MQ=20.22;MQ0=68;QD=0.84;SB=-93.66 GT:AD:DP:GL:GQ 0/1:367,35:98:-67.59,-29.55,-258.47:99
-chr1 2617338 . C G 222.34 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=432;Dels=0.00;HRun=0;HaplotypeScore=396.78;MQ=20.69;MQ0=66;QD=0.51;SB=19.38 GT:AD:DP:GL:GQ 0/1:381,42:103:-66.44,-40.92,-386.05:99
-chr1 2617341 . G T 154.66 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=435;Dels=0.00;HRun=1;HaplotypeScore=393.28;MQ=20.73;MQ0=66;QD=0.36;SB=-27.31 GT:AD:DP:GL:GQ 0/1:377,44:114:-56.17,-37.42,-341.25:99
-chr1 2617354 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=456;Dels=0.00;HRun=0;HaplotypeScore=284.18;MQ=21.50;MQ0=65;OQ=410.45;QD=0.90;SB=-157.97 GT:AD:DP:GL:GQ 0/1:367,88:128:-86.24,-41.91,-394.71:99
-chr1 2617375 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=397;Dels=0.00;HRun=0;HaplotypeScore=286.33;MQ=23.04;MQ0=37;OQ=238.47;QD=0.60;SB=-127.61 GT:AD:DP:GL:GQ 0/1:316,80:131:-66.59,-39.46,-400.07:99
-chr1 2617377 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=393;Dels=0.00;HRun=0;HaplotypeScore=264.38;MQ=23.09;MQ0=38;OQ=52.53;QD=0.13;SB=34.31 GT:AD:DP:GL:GQ 0/1:349,42:132:-48.29,-39.76,-421.34:85.37
-chr1 2617406 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=150.38;MQ=24.81;MQ0=30;OQ=1026.09;QD=4.44;SB=-81.56 GT:AD:DP:GL:GQ 0/1:71,150:85:-131.52,-25.63,-230.33:99
-chr1 2617434 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=111.67;MQ=24.27;MQ0=28;OQ=290.81;QD=2.02;SB=-29.80 GT:AD:DP:GL:GQ 0/1:61,70:56:-59.33,-26.96,-156.98:99
-chr1 2617463 rs56282610 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=58.94;MQ=24.92;MQ0=20;OQ=411.11;QD=4.42;SB=-153.67 GT:AD:DP:GL:GQ 0/1:29,63:36:-55.25,-10.85,-76.21:99
-chr1 2617490 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=85.26;MQ=28.92;MQ0=14;OQ=93.54;QD=0.96;SB=32.09 GT:AD:DP:GL:GQ 0/1:84,12:39:-24.38,-11.75,-112.74:99
-chr1 2617496 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=107.91;MQ=30.31;MQ0=12;OQ=102.53;QD=1.11;SB=32.10 GT:AD:DP:GL:GQ 0/1:79,12:38:-24.98,-11.44,-111.78:99
-chr1 2617505 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=81.67;MQ=32.33;MQ0=11;OQ=247.78;QD=2.69;SB=-60.73 GT:AD:DP:GL:GQ 0/1:40,39:40:-40.11,-12.05,-107.49:99
-chr1 2617521 rs56279030 G C 42.50 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=0;HaplotypeScore=51.30;MQ=31.83;MQ0=12;QD=0.40;SB=0.26 GT:AD:DP:GL:GQ 0/1:94,13:44:-20.79,-13.26,-170.49:75.34
-chr1 2617526 rs28536771 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=105;Dels=0.00;HRun=0;HaplotypeScore=63.55;MQ=32.40;MQ0=9;OQ=160.23;QD=1.53;SB=-3.57 GT:AD:DP:GL:GQ 0/1:45,55:37:-30.46,-11.15,-113.20:99
-chr1 2617584 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=87.31;MQ=28.18;MQ0=10;OQ=524.04;QD=3.59;SB=-151.92 GT:AD:DP:GL:GQ 0/1:49,97:62:-74.37,-18.69,-162.12:99
-chr1 2617611 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=154;Dels=0.01;HRun=0;HaplotypeScore=176.05;MQ=27.08;MQ0=16;OQ=81.66;QD=0.53;SB=-0.83 GT:AD:DP:GL:GQ 0/1:126,24:59:-29.22,-17.77,-179.32:99
-chr1 2617617 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=177.05;MQ=27.20;MQ0=14;OQ=126.07;QD=0.84;SB=8.21 GT:AD:DP:GL:GQ 0/1:125,25:58:-33.36,-17.47,-170.99:99
-chr1 2617626 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=140;Dels=0.00;HRun=0;HaplotypeScore=162.52;MQ=28.40;MQ0=11;OQ=508.32;QD=3.63;SB=-161.48 GT:AD:DP:GL:GQ 0/1:40,77:57:-73.89,-19.78,-125.32:99
-chr1 2617630 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=1;HaplotypeScore=122.08;MQ=28.20;MQ0=11;OQ=734.14;QD=5.13;SB=-361.31 GT:AD:DP:GL:GQ 0/1:73,47:61:-98.65,-21.95,-111.48:99
-chr1 2617659 rs55801140 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=159;Dels=0.00;HRun=0;HaplotypeScore=125.08;MQ=27.55;MQ0=12;OQ=175.93;QD=1.11;SB=23.11 GT:AD:DP:GL:GQ 0/1:141,12:44:-34.15,-13.27,-148.76:99
-chr1 2617668 rs28535687 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=135;Dels=0.00;HRun=0;HaplotypeScore=255.63;MQ=27.99;MQ0=8;OQ=172.40;QD=1.28;SB=-72.12 GT:AD:DP:GL:GQ 0/1:31,69:32:-40.65,-20.12,-107.26:99
-chr1 2617672 . G T 32.81 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=245.46;MQ=28.29;MQ0=7;QD=0.25;SB=11.06 GT:AD:DP:GL:GQ 0/1:84,46:25:-14.10,-7.54,-64.41:65.64
-chr1 2617713 . C T 25.50 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=0;HaplotypeScore=235.92;MQ=23.71;MQ0=16;QD=0.15;SB=11.61 GT:AD:DP:GL:GQ 0/1:80,75:31:-15.18,-9.35,-88.30:58.32
-chr1 2617737 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=1;HaplotypeScore=196.10;MQ=25.34;MQ0=20;OQ=242.18;QD=1.19;SB=-124.57 GT:AD:DP:GL:GQ 0/1:154,44:50:-42.56,-15.06,-131.92:99
-chr1 2617767 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=115.66;MQ=29.10;MQ0=18;OQ=374.38;QD=2.92;SB=-46.69 GT:AD:DP:GL:GQ 0/1:37,72:41:-53.07,-12.35,-97.04:99
-chr1 2617781 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=110.28;MQ=28.42;MQ0=22;OQ=65.20;QD=0.50;SB=26.12 GT:AD:DP:GL:GQ 0/1:110,18:43:-22.77,-12.97,-156.99:98.03
-chr1 2617809 rs28698520 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=120;Dels=0.01;HRun=1;HaplotypeScore=154.47;MQ=26.46;MQ0=29;OQ=544.53;QD=4.54;SB=20.07 GT:AD:DP:GL:GQ 0/1:74,45:37:-68.88,-11.15,-59.02:99
-chr1 2617834 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=142.69;MQ=25.75;MQ0=33;OQ=247.39;QD=1.66;SB=-8.79 GT:AD:DP:GL:GQ 0/1:101,20:44:-48.54,-20.52,-132.57:99
-chr1 2617846 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=163;Dels=0.00;HRun=0;HaplotypeScore=110.83;MQ=27.45;MQ0=31;OQ=574.67;QD=3.53;SB=-169.29 GT:AD:DP:GL:GQ 0/1:34,98:52:-84.16,-23.41,-106.75:99
-chr1 2617859 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=189.65;MQ=26.24;MQ0=36;OQ=661.11;QD=2.56;SB=-188.93 GT:AD:DP:GL:GQ 0/1:183,74:74:-91.72,-22.32,-216.13:99
-chr1 2617878 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=308;Dels=0.00;HRun=0;HaplotypeScore=214.86;MQ=26.40;MQ0=36;OQ=1364.14;QD=4.43;SB=-695.16 GT:AD:DP:GL:GQ 0/1:245,61:100:-169.82,-30.12,-204.71:99
-chr1 2617913 rs61766463 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=276;Dels=0.00;HRun=0;HaplotypeScore=33.34;MQ=34.26;MQ0=23;OQ=345.85;QD=1.25;SB=54.43 GT:AD:DP:GL:GQ 0/1:130,145:134:-78.24,-40.37,-397.42:99
-chr1 2617929 rs61766464 G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=313;Dels=0.00;HRun=0;HaplotypeScore=209.86;MQ=34.59;MQ0=24;OQ=2475.95;QD=7.91;SB=-469.20 GT:AD:DP:GL:GQ 0/1:207,106:147:-295.16,-44.28,-232.82:99
-chr1 2617945 rs61766465 G A 678.02 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=327;Dels=0.00;HRun=0;HaplotypeScore=293.41;MQ=35.76;MQ0=33;QD=2.07;SB=57.72 GT:AD:DP:GL:GQ 0/1:285,42:156:-118.09,-47.00,-457.61:99
-chr1 2617948 . A T 1515.78 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=339;Dels=0.00;HRun=0;HaplotypeScore=339.78;MQ=35.84;MQ0=34;QD=4.47;SB=-315.59 GT:AD:DP:GL:GQ 0/1:267,71:155:-201.56,-46.69,-377.16:99
-chr1 2617953 rs61766466 C A 621.95 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=348;Dels=0.00;HRun=0;HaplotypeScore=257.70;MQ=36.09;MQ0=43;QD=1.79;SB=55.33 GT:AD:DP:GL:GQ 0/1:287,49:168:-116.08,-50.61,-483.68:99
-chr1 2618063 rs28379532 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.02;HRun=0;HaplotypeScore=36.25;MQ=31.70;MQ0=29;OQ=1863.52;QD=13.03;SB=-253.52 GT:AD:DP:GL:GQ 0/1:27,111:85:-215.25,-25.61,-83.05:99
-chr1 2618135 rs28499404 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=183;Dels=0.00;HRun=0;HaplotypeScore=48.32;MQ=27.35;MQ0=42;OQ=347.83;QD=1.90;SB=-174.55 GT:AD:DP:GL:GQ 0/1:162,21:105:-69.72,-31.65,-366.58:99
-chr1 2618152 rs61766467 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=192;Dels=0.00;HRun=1;HaplotypeScore=85.82;MQ=26.36;MQ0=44;OQ=458.63;QD=2.39;SB=-15.83 GT:AD:DP:GL:GQ 0/1:151,41:104:-80.48,-31.33,-290.41:99
-chr1 2618186 rs28655771 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=193;Dels=0.00;HRun=1;HaplotypeScore=114.84;MQ=21.49;MQ0=56;OQ=2645.92;QD=13.71;SB=-1050.69 GT:AD:DP:GL:GQ 1/1:5,188:77:-268.22,-23.20,-0.04:99
-chr1 2618191 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=203;Dels=0.00;HRun=0;HaplotypeScore=161.00;MQ=22.90;MQ0=57;OQ=50.10;QD=0.25;SB=39.02 GT:AD:DP:GL:GQ 0/1:173,30:86:-34.21,-25.91,-268.48:82.93
-chr1 2618226 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=0;HaplotypeScore=192.42;MQ=33.49;MQ0=36;OQ=337.18;QD=1.26;SB=-53.39 GT:AD:DP:GL:GQ 0/1:227,40:152:-82.80,-45.80,-457.42:99
-chr1 2618254 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=296;Dels=0.00;HRun=0;HaplotypeScore=166.54;MQ=37.41;MQ0=24;OQ=808.97;QD=2.73;SB=-397.12 GT:AD:DP:GL:GQ 0/1:225,67:181:-140.83,-56.65,-515.36:99
-chr1 2618301 . C A 998.94 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=292;Dels=0.00;HRun=0;HaplotypeScore=277.61;MQ=43.53;MQ0=9;QD=3.42;SB=-458.03 GT:AD:DP:GL:GQ 0/1:215,74:195:-161.93,-58.75,-524.06:99
-chr1 2618303 . C A 591.91 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=295;Dels=0.00;HRun=0;HaplotypeScore=301.39;MQ=43.31;MQ0=10;QD=2.01;SB=-293.38 GT:AD:DP:GL:GQ 0/1:236,56:205:-124.23,-61.75,-600.14:99
-chr1 2618307 . G A 971.72 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=283;Dels=0.00;HRun=0;HaplotypeScore=193.14;MQ=43.47;MQ0=11;QD=3.43;SB=-273.43 GT:AD:DP:GL:GQ 0/1:228,48:199:-160.42,-59.96,-556.19:99
-chr1 2618320 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=309;Dels=0.00;HRun=0;HaplotypeScore=150.76;MQ=41.04;MQ0=29;OQ=452.34;QD=1.46;SB=-151.56 GT:AD:DP:GL:GQ 0/1:223,31:184:-121.13,-72.62,-509.07:99
-chr1 2618366 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=558;Dels=0.00;HRun=0;HaplotypeScore=219.65;MQ=26.44;MQ0=134;OQ=289.23;QD=0.52;SB=167.70 GT:AD:DP:GL:GQ 0/1:454,69:221:-105.97,-73.77,-728.70:99
-chr1 2618375 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=585;Dels=0.00;HRun=0;HaplotypeScore=337.36;MQ=25.16;MQ0=141;OQ=507.21;QD=0.87;SB=196.74 GT:AD:DP:GL:GQ 0/1:487,75:227:-128.47,-74.47,-700.80:99
-chr1 2618378 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=594;Dels=0.00;HRun=0;HaplotypeScore=307.01;MQ=24.92;MQ0=142;OQ=386.51;QD=0.65;SB=-74.59 GT:AD:DP:GL:GQ 0/1:524,66:225:-115.59,-73.65,-670.89:99
-chr1 2618414 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=573;Dels=0.00;HRun=1;HaplotypeScore=206.56;MQ=24.36;MQ0=140;OQ=719.44;QD=1.26;SB=-72.20 GT:AD:DP:GL:GQ 0/1:439,119:210:-138.50,-63.27,-592.09:99
-chr1 2618418 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=531;Dels=0.00;HRun=0;HaplotypeScore=181.25;MQ=24.54;MQ0=131;OQ=939.27;QD=1.77;SB=-76.38 GT:AD:DP:GL:GQ 0/1:427,103:204:-158.68,-61.47,-574.55:99
-chr1 2618432 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=412;Dels=0.00;HRun=0;HaplotypeScore=70.50;MQ=25.62;MQ0=105;OQ=877.24;QD=2.13;SB=-428.33 GT:AD:DP:GL:GQ 0/1:368,44:152:-136.86,-45.86,-364.87:99
-chr1 2618444 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=352;Dels=0.00;HRun=1;HaplotypeScore=46.24;MQ=26.18;MQ0=89;OQ=1301.34;QD=3.70;SB=170.58 GT:AD:DP:GL:GQ 0/1:167,181:143:-176.57,-43.15,-394.32:99
-chr1 2618459 rs61766471 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=309;Dels=0.00;HRun=0;HaplotypeScore=122.77;MQ=27.15;MQ0=60;OQ=430.68;QD=1.39;SB=-167.89 GT:AD:DP:GL:GQ 0/1:283,25:135:-87.04,-40.69,-380.50:99
-chr1 2618482 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=91.95;MQ=32.62;MQ0=31;OQ=752.10;QD=3.36;SB=-248.53 GT:AD:DP:GL:GQ 0/1:115,107:101:-108.92,-30.43,-254.35:99
-chr1 2618501 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=234;Dels=0.01;HRun=4;HaplotypeScore=341.35;MQ=30.82;MQ0=33;OQ=155.62;QD=0.67;SB=92.01 GT:AD:DP:GL:GQ 0/1:155,66:98:-53.97,-35.12,-329.58:99
-chr1 2618530 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=231;Dels=0.00;HRun=0;HaplotypeScore=168.93;MQ=32.32;MQ0=29;OQ=236.35;QD=1.02;SB=-122.19 GT:AD:DP:GL:GQ 0/1:211,19:107:-59.16,-32.24,-318.05:99
-chr1 2618557 rs28411025 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=156;Dels=0.00;HRun=0;HaplotypeScore=133.44;MQ=39.19;MQ0=9;OQ=2883.82;QD=18.49;SB=-1383.19 GT:AD:DP:GL:GQ 0/1:27,128:92:-319.41,-27.74,-64.72:99
-chr1 2618577 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=228;Dels=0.01;HRun=1;HaplotypeScore=243.04;MQ=34.35;MQ0=14;OQ=206.46;QD=0.91;SB=-125.59 GT:AD:DP:GL:GQ 0/1:119,105:92:-51.66,-27.73,-260.87:99
-chr1 2618590 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=341;Dels=0.00;HRun=0;HaplotypeScore=269.37;MQ=32.40;MQ0=23;OQ=694.60;QD=2.04;SB=-10.03 GT:AD:DP:GL:GQ 0/1:206,129:134:-115.74,-43.00,-326.10:99
-chr1 2618603 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=385;Dels=0.00;HRun=0;HaplotypeScore=742.67;MQ=32.24;MQ0=20;OQ=374.09;QD=0.97;SB=-84.54 GT:AD:DP:GL:GQ 0/1:213,140:157:-94.37,-53.68,-577.68:99
-chr1 2618613 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=414;Dels=0.00;HRun=1;HaplotypeScore=803.50;MQ=31.66;MQ0=23;OQ=626.38;QD=1.51;SB=181.82 GT:AD:DP:GL:GQ 0/1:349,58:175:-118.68,-52.76,-621.84:99
-chr1 2618617 . A C 34.85 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=417;Dels=0.00;HRun=1;HaplotypeScore=645.23;MQ=31.22;MQ0=23;QD=0.08;SB=-15.32 GT:AD:DP:GL:GQ 0/1:232,176:163:-62.01,-55.24,-512.02:67.68
-chr1 2618648 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=485;Dels=0.00;HRun=0;HaplotypeScore=582.18;MQ=29.51;MQ0=32;OQ=1313.91;QD=2.71;SB=163.03 GT:AD:DP:GL:GQ 0/1:367,113:208:-197.35,-62.68,-695.38:99
-chr1 2618651 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=487;Dels=0.00;HRun=0;HaplotypeScore=686.95;MQ=29.46;MQ0=33;OQ=108.10;QD=0.22;SB=256.13 GT:AD:DP:GL:GQ 0/1:431,46:211:-84.08,-69.98,-671.09:99
-chr1 2618685 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=500;Dels=0.00;HRun=1;HaplotypeScore=291.67;MQ=27.86;MQ0=33;OQ=4318.30;QD=8.64;SB=-761.47 GT:AD:DP:GL:GQ 0/1:182,284:216:-430.83,-67.58,-458.35:99
-chr1 2618707 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=462;Dels=0.01;HRun=4;HaplotypeScore=721.39;MQ=29.06;MQ0=34;OQ=2615.02;QD=5.66;SB=-699.35 GT:AD:DP:GL:GQ 0/1:165,282:202:-327.27,-62.48,-383.70:99
-chr1 2618711 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=464;Dels=0.00;HRun=0;HaplotypeScore=458.70;MQ=28.79;MQ0=35;OQ=1658.43;QD=3.57;SB=-180.55 GT:AD:DP:GL:GQ 0/1:156,178:185:-246.74,-77.62,-433.93:99
-chr1 2618743 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=565;Dels=0.00;HRun=1;HaplotypeScore=594.08;MQ=28.52;MQ0=39;OQ=195.57;QD=0.35;SB=27.58 GT:AD:DP:GL:GQ 0/1:503,58:268:-103.62,-80.78,-771.76:99
-chr1 2618776 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=541;Dels=0.00;HRun=0;HaplotypeScore=502.52;MQ=30.93;MQ0=35;OQ=5244.83;QD=9.69;SB=-856.66 GT:AD:DP:GL:GQ 0/1:182,353:279:-523.48,-84.06,-514.94:99
-chr1 2618784 . C T 23.85 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=542;Dels=0.00;HRun=0;HaplotypeScore=612.02;MQ=31.33;MQ0=33;QD=0.04;SB=67.53 GT:AD:DP:GL:GQ 0/1:386,152:218:-71.34,-65.68,-703.92:56.67
-chr1 2618799 rs61766473 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=520;Dels=0.00;HRun=1;HaplotypeScore=456.03;MQ=31.14;MQ0=35;OQ=4809.01;QD=9.25;SB=-828.34 GT:AD:DP:GL:GQ 0/1:169,328:274:-479.90,-94.56,-523.76:99
-chr1 2618813 rs28570043 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=586;Dels=0.00;HRun=0;HaplotypeScore=299.20;MQ=30.92;MQ0=47;OQ=1856.68;QD=3.17;SB=-717.31 GT:AD:DP:GL:GQ 0/1:501,75:250:-270.75,-81.80,-777.18:99
-chr1 2618823 rs61766474 A T 4860.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=562;Dels=0.00;HRun=0;HaplotypeScore=709.32;MQ=30.48;MQ0=44;QD=8.65;SB=-560.15 GT:AD:DP:GL:GQ 0/1:287,273:277:-485.00,-83.44,-550.46:99
-chr1 2618832 . C G 1479.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=512;Dels=0.00;HRun=2;HaplotypeScore=411.64;MQ=30.81;MQ0=42;QD=2.89;SB=-17.36 GT:AD:DP:GL:GQ 0/1:367,94:241:-231.26,-80.00,-778.36:99
-chr1 2618833 . G C 375.40 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=513;Dels=0.00;HRun=1;HaplotypeScore=505.52;MQ=30.67;MQ0=42;QD=0.73;SB=152.53 GT:AD:DP:GL:GQ 0/1:466,47:236:-112.05,-71.23,-847.97:99
-chr1 2618853 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=470;Dels=0.00;HRun=0;HaplotypeScore=742.82;MQ=31.02;MQ0=40;OQ=917.98;QD=1.95;SB=-4.91 GT:AD:DP:GL:GQ 0/1:336,89:211:-236.75,-141.67,-586.15:99
-chr1 2618854 rs61766475 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=465;Dels=0.00;HRun=1;HaplotypeScore=675.66;MQ=31.14;MQ0=39;OQ=3030.86;QD=6.52;SB=-170.15 GT:AD:DP:GL:GQ 0/1:129,210:216:-470.96,-164.59,-497.24:99
-chr1 2618865 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=505;Dels=0.00;HRun=0;HaplotypeScore=338.61;MQ=30.47;MQ0=44;OQ=342.56;QD=0.68;SB=-14.42 GT:AD:DP:GL:GQ 0/1:439,53:231:-117.83,-80.29,-726.19:99
-chr1 2618904 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=499;Dels=0.00;HRun=4;HaplotypeScore=608.12;MQ=29.15;MQ0=44;OQ=1769.15;QD=3.55;SB=89.28 GT:AD:DP:GL:GQ 0/1:280,197:227:-252.16,-71.97,-553.68:99
-chr1 2618905 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=514;Dels=0.00;HRun=0;HaplotypeScore=596.36;MQ=29.03;MQ0=46;OQ=337.81;QD=0.66;SB=-30.28 GT:AD:DP:GL:GQ 0/1:424,43:227:-138.22,-101.16,-705.27:99
-chr1 2618928 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=624;Dels=0.00;HRun=2;HaplotypeScore=323.04;MQ=29.42;MQ0=49;OQ=696.10;QD=1.12;SB=42.74 GT:AD:DP:GL:GQ 0/1:499,120:322:-169.90,-97.01,-976.27:99
-chr1 2618942 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=632;Dels=0.00;HRun=0;HaplotypeScore=427.92;MQ=29.57;MQ0=51;OQ=1430.20;QD=2.26;SB=-6.35 GT:AD:DP:GL:GQ 0/1:441,177:340:-255.05,-108.75,-1027.84:99
-chr1 2618944 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=660;Dels=0.01;HRun=1;HaplotypeScore=381.00;MQ=29.09;MQ0=58;OQ=94.18;QD=0.14;SB=-52.32 GT:AD:DP:GL:GQ 0/1:544,51:336:-209.60,-196.90,-1072.15:99
-chr1 2619010 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=979;Dels=0.00;HRun=0;HaplotypeScore=447.29;MQ=26.60;MQ0=70;OQ=796.25;QD=0.81;SB=-92.06 GT:AD:DP:GL:GQ 0/1:864,98:425:-220.34,-137.43,-1275.90:99
-chr1 2619053 rs28733941 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=909;Dels=0.00;HRun=0;HaplotypeScore=595.79;MQ=27.09;MQ0=60;OQ=13631.67;QD=15.00;SB=-2975.80 GT:AD:DP:GL:GQ 0/1:104,553:419:-1362.17,-600.80,-836.54:99
-chr1 2619065 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1083;Dels=0.00;HRun=0;HaplotypeScore=883.09;MQ=27.27;MQ0=55;OQ=741.35;QD=0.68;SB=-174.53 GT:AD:DP:GL:GQ 0/1:939,125:552:-281.40,-203.98,-1716.07:99
-chr1 2619068 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1124;Dels=0.00;HRun=1;HaplotypeScore=958.29;MQ=27.28;MQ0=55;OQ=693.79;QD=0.62;SB=-203.14 GT:AD:DP:GL:GQ 0/1:985,132:593:-257.34,-184.67,-1827.88:99
-chr1 2619088 rs28368434 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=1328;Dels=0.00;HRun=2;HaplotypeScore=334.46;MQ=28.00;MQ0=46;OQ=7035.59;QD=5.30;SB=-1628.81 GT:AD:DP:GL:GQ 0/1:1024,295:793:-702.56,-254.86,-2119.90:99
-chr1 2619105 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1330;Dels=0.00;HRun=0;HaplotypeScore=932.09;MQ=28.23;MQ0=29;OQ=2367.59;QD=1.78;SB=-1159.72 GT:AD:DP:GL:GQ 0/1:991,151:799:-779.65,-539.60,-2921.50:99
-chr1 2619148 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=990;Dels=0.00;HRun=0;HaplotypeScore=340.48;MQ=27.70;MQ0=55;OQ=2332.09;QD=2.36;SB=-739.43 GT:AD:DP:GL:GQ 0/1:796,178:558:-439.22,-202.73,-1989.78:99
-chr1 2619186 . A C 371.93 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=419;Dels=0.00;HRun=2;HaplotypeScore=464.28;MQ=28.43;MQ0=32;QD=0.89;SB=-209.63 GT:AD:DP:GL:GQ 0/1:320,97:190:-97.71,-57.24,-585.62:99
-chr1 2619187 . A C 430.91 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=400;Dels=0.00;HRun=1;HaplotypeScore=324.16;MQ=28.26;MQ0=30;QD=1.08;SB=-112.57 GT:AD:DP:GL:GQ 0/1:310,88:169:-97.29,-50.91,-502.75:99
-chr1 2619196 rs61766477 C T 639.34 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=339;Dels=0.00;HRun=0;HaplotypeScore=406.21;MQ=29.84;MQ0=24;QD=1.89;SB=-240.09 GT:AD:DP:GL:GQ 0/1:283,37:141:-134.06,-66.84,-411.36:99
-chr1 2619205 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=257;Dels=0.00;HRun=0;HaplotypeScore=259.69;MQ=32.70;MQ0=16;OQ=1928.35;QD=7.50;SB=-426.10 GT:AD:DP:GL:GQ 0/1:80,173:106:-228.05,-31.94,-159.03:99
-chr1 2619218 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=235;Dels=0.00;HRun=1;HaplotypeScore=278.38;MQ=35.10;MQ0=10;OQ=372.83;QD=1.59;SB=-167.14 GT:AD:DP:GL:GQ 0/1:174,58:82:-65.27,-24.71,-216.22:99
-chr1 2619230 . G A 206.96 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=238;Dels=0.00;HRun=1;HaplotypeScore=422.57;MQ=34.96;MQ0=8;QD=0.87;SB=86.30 GT:AD:DP:GL:GQ 0/1:192,38:100:-59.43,-35.45,-312.61:99
-chr1 2619232 . T C 831.94 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=232;Dels=0.00;HRun=0;HaplotypeScore=355.75;MQ=35.18;MQ0=8;QD=3.59;SB=-351.57 GT:AD:DP:GL:GQ 0/1:163,64:87:-112.72,-26.24,-194.80:99
-chr1 2619238 . G T 230.19 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=214;Dels=0.00;HRun=0;HaplotypeScore=374.27;MQ=36.67;MQ0=6;QD=1.08;SB=104.29 GT:AD:DP:GL:GQ 0/1:105,106:92:-54.02,-27.71,-267.56:99
-chr1 2619244 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=201;Dels=0.00;HRun=0;HaplotypeScore=269.42;MQ=37.21;MQ0=7;OQ=1921.19;QD=9.56;SB=-479.90 GT:AD:DP:GL:GQ 0/1:57,142:93:-223.42,-28.02,-104.14:99
-chr1 2619306 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=2;HaplotypeScore=23.50;MQ=42.95;MQ0=2;OQ=983.37;QD=8.48;SB=-151.45 GT:AD:DP:GL:GQ 0/1:49,66:80:-128.94,-27.32,-178.83:99
-chr1 2619313 . T G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=14.58;MQ=45.37;MQ0=2;OQ=717.70;QD=7.40;SB=-61.81 GT:AD:DP:GL:GQ 0/1:47,50:71:-96.45,-21.40,-150.45:99
-chr1 2619324 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=29.83;MQ=44.91;MQ0=2;OQ=606.68;QD=6.74;SB=-59.89 GT:AD:DP:GL:GQ 0/1:45,45:58:-81.45,-17.50,-117.39:99
-chr1 2619346 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=198;Dels=0.01;HRun=2;HaplotypeScore=304.95;MQ=34.96;MQ0=2;OQ=1893.09;QD=9.56;SB=62.22 GT:AD:DP:GL:GQ 0/1:48,144:92:-224.02,-31.43,-163.64:99
-chr1 2619351 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=249;Dels=0.00;HRun=1;HaplotypeScore=417.56;MQ=32.10;MQ0=4;OQ=1347.04;QD=5.41;SB=71.23 GT:AD:DP:GL:GQ 0/1:80,143:111:-171.44,-33.46,-209.78:99
-chr1 2619360 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=388;Dels=0.00;HRun=1;HaplotypeScore=438.87;MQ=28.93;MQ0=6;OQ=112.12;QD=0.29;SB=98.35 GT:AD:DP:GL:GQ 0/1:301,77:156:-68.00,-53.51,-526.40:99
-chr1 2619395 rs61766478 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=748;Dels=0.00;HRun=0;HaplotypeScore=964.64;MQ=26.94;MQ0=26;OQ=5287.26;QD=7.07;SB=128.59 GT:AD:DP:GL:GQ 0/1:216,518:288:-527.73,-89.49,-471.13:99
-chr1 2619416 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=775;Dels=0.00;HRun=0;HaplotypeScore=727.49;MQ=27.55;MQ0=26;OQ=6889.43;QD=8.89;SB=178.09 GT:AD:DP:GL:GQ 0/1:249,511:342:-687.94,-103.01,-497.11:99
-chr1 2619432 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=738;Dels=0.01;HRun=0;HaplotypeScore=785.98;MQ=28.56;MQ0=15;OQ=287.49;QD=0.39;SB=162.31 GT:AD:DP:GL:GQ 0/1:586,116:299:-161.89,-129.86,-1001.87:99
-chr1 2619446 rs61766479 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=555;Dels=0.00;HRun=1;HaplotypeScore=580.47;MQ=30.08;MQ0=12;OQ=4833.38;QD=8.71;SB=183.30 GT:AD:DP:GL:GQ 0/1:214,317:283:-482.34,-118.04,-540.99:99
-chr1 2619465 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=306;Dels=0.02;HRun=1;HaplotypeScore=404.44;MQ=32.23;MQ0=6;OQ=129.50;QD=0.42;SB=102.00 GT:AD:DP:GL:GQ 0/1:203,74:120:-64.50,-48.27,-416.86:99
-chr1 2619467 rs61766480 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=303;Dels=0.02;HRun=1;HaplotypeScore=363.13;MQ=31.91;MQ0=6;OQ=4502.12;QD=14.86;SB=-1253.39 GT:AD:DP:GL:GQ 0/1:40,252:153:-449.21,-45.80,-111.82:99
-chr1 2619477 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=279;Dels=0.00;HRun=0;HaplotypeScore=335.87;MQ=32.02;MQ0=7;OQ=542.66;QD=1.95;SB=122.33 GT:AD:DP:GL:GQ 0/1:161,107:129:-96.42,-38.87,-351.57:99
-chr1 2619489 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=268;Dels=0.00;HRun=1;HaplotypeScore=215.67;MQ=32.52;MQ0=8;OQ=1128.11;QD=4.21;SB=95.32 GT:AD:DP:GL:GQ 0/1:114,145:131:-166.02,-49.92,-331.55:99
-chr1 2619505 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=271;Dels=0.00;HRun=0;HaplotypeScore=305.81;MQ=31.15;MQ0=10;OQ=135.21;QD=0.50;SB=68.22 GT:AD:DP:GL:GQ 0/1:237,31:129:-55.67,-38.86,-389.56:99
-chr1 2619511 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=262;Dels=0.00;HRun=0;HaplotypeScore=356.76;MQ=30.03;MQ0=11;OQ=250.01;QD=0.95;SB=47.18 GT:AD:DP:GL:GQ 0/1:212,49:118:-63.84,-35.55,-351.09:99
-chr1 2619524 rs34081960 A G 343.80 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=1;HaplotypeScore=217.57;MQ=30.42;MQ0=7;QD=1.59;SB=47.18 GT:AD:DP:GL:GQ 0/1:179,33:102:-68.39,-30.73,-325.69:99
-chr1 2619526 . C A 23.86 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=205;Dels=0.00;HRun=1;HaplotypeScore=236.96;MQ=30.18;MQ0=8;QD=0.12;SB=44.17 GT:AD:DP:GL:GQ 0/1:190,11:95:-34.28,-28.61,-300.58:56.68
-chr1 2619527 . A C 538.74 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=197;Dels=0.00;HRun=1;HaplotypeScore=224.55;MQ=30.05;MQ0=8;QD=2.73;SB=-87.11 GT:AD:DP:GL:GQ 0/1:122,73:87:-83.37,-26.21,-226.60:99
-chr1 2619530 . T G 866.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=215.21;MQ=31.06;MQ0=6;QD=4.84;SB=12.12 GT:AD:DP:GL:GQ 0/1:87,85:86:-126.63,-36.72,-179.70:99
-chr1 2619534 . A G 264.68 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=172;Dels=0.00;HRun=1;HaplotypeScore=280.66;MQ=30.98;MQ0=7;QD=1.54;SB=41.16 GT:AD:DP:GL:GQ 0/1:139,33:74:-52.04,-22.29,-233.98:99
-chr1 2619544 . C T 108.85 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=155;Dels=0.06;HRun=0;HaplotypeScore=267.97;MQ=31.40;MQ0=5;QD=0.70;SB=38.12 GT:AD:DP:GL:GQ 0/1:124,16:57:-34.75,-20.58,-177.62:99
-chr1 2619546 . C G 37.35 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=150;Dels=0.00;HRun=0;HaplotypeScore=251.96;MQ=31.91;MQ0=5;QD=0.25;SB=38.15 GT:AD:DP:GL:GQ 0/1:138,7:61:-25.40,-18.38,-245.36:70.19
-chr1 2619553 . A G 821.41 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=113.41;MQ=33.54;MQ0=5;QD=6.96;SB=23.10 GT:AD:DP:GL:GQ 0/1:33,83:56:-102.29,-16.87,-105.73:99
-chr1 2619570 rs12757527 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=61.91;MQ=39.68;MQ0=1;OQ=223.25;QD=2.51;SB=41.15 GT:AD:DP:GL:GQ 0/1:39,49:45:-39.17,-13.56,-132.69:99
-chr1 2619576 rs11516512 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=85.98;MQ=40.41;MQ0=1;OQ=1215.90;QD=15.59;SB=-537.94 GT:AD:DP:GL:GQ 0/1:9,69:47:-139.03,-14.16,-23.39:92.31
-chr1 2619644 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=167.24;MQ=38.77;MQ0=11;OQ=65.21;QD=0.53;SB=59.09 GT:AD:DP:GL:GQ 0/1:83,36:47:-23.99,-14.18,-125.75:98.05
-chr1 2619667 rs12757684 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.02;HRun=3;HaplotypeScore=150.20;MQ=38.48;MQ0=2;OQ=87.98;QD=0.80;SB=-4.94 GT:AD:DP:GL:GQ 0/1:62,46:39:-23.84,-11.75,-110.18:99
-chr1 2619672 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=2;HaplotypeScore=165.55;MQ=38.18;MQ0=2;OQ=67.69;QD=0.61;SB=56.21 GT:AD:DP:GL:GQ 0/1:58,23:45:-37.64,-27.58,-156.78:99
-chr1 2619717 rs35537872 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=158.55;MQ=37.91;MQ0=1;OQ=82.21;QD=0.81;SB=12.47 GT:AD:DP:GL:GQ 0/1:41,55:41:-23.87,-12.36,-127.50:99
-chr1 2619725 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=160.68;MQ=38.53;MQ0=0;OQ=110.57;QD=1.00;SB=59.22 GT:AD:DP:GL:GQ 0/1:96,15:49:-29.10,-14.76,-154.28:99
-chr1 2619755 rs35198281 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=135.67;MQ=40.63;MQ0=1;OQ=77.36;QD=0.78;SB=-26.15 GT:AD:DP:GL:GQ 0/1:44,49:41:-23.37,-12.36,-121.95:99
-chr1 2619802 . G A 11.69 LowQual AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=127.16;MQ=33.63;MQ0=4;QD=0.12;SB=-22.48 GT:AD:DP:GL:GQ 0/1:79,20:38:-15.87,-11.45,-120.55:44.22
-chr1 2619811 rs11516513 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=94.34;MQ=31.96;MQ0=5;OQ=1057.97;QD=11.02;SB=-282.04 GT:AD:DP:GL:GQ 0/1:29,63:37:-120.23,-11.15,-15.87:47.21
-chr1 2619844 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=163.21;MQ=35.54;MQ0=9;OQ=150.26;QD=1.60;SB=-85.59 GT:AD:DP:GL:GQ 0/1:35,58:32:-27.96,-9.65,-83.83:99
-chr1 2619873 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=1;HaplotypeScore=84.94;MQ=33.03;MQ0=22;OQ=528.32;QD=3.80;SB=-259.93 GT:AD:DP:GL:GQ 0/1:45,94:55:-72.69,-16.57,-137.30:99
-chr1 2619885 rs4648686 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=143;Dels=0.00;HRun=0;HaplotypeScore=76.46;MQ=34.20;MQ0=29;OQ=72.77;QD=0.51;SB=-32.15 GT:AD:DP:GL:GQ 0/1:107,35:58:-28.03,-17.47,-178.69:99
-chr1 2619907 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.02;HRun=0;HaplotypeScore=75.23;MQ=35.05;MQ0=37;OQ=78.76;QD=0.61;SB=20.08 GT:AD:DP:GL:GQ 0/1:80,29:48:-28.88,-17.72,-148.42:99
-chr1 2619934 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=66.32;MQ=35.85;MQ0=29;OQ=172.74;QD=1.52;SB=-28.24 GT:AD:DP:GL:GQ 0/1:48,66:48:-35.03,-14.47,-147.33:99
-chr1 2619955 rs6604996 C G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=63.40;MQ=33.93;MQ0=36;OQ=1440.37;QD=13.21;SB=-479.54 GT:AD:DP:GL:GQ 1/1:0,108:38:-147.67,-11.48,-0.04:99
-chr1 2620070 rs12740972 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=47.55;MQ=45.30;MQ0=8;OQ=554.48;QD=5.72;SB=-255.88 GT:AD:DP:GL:GQ 0/1:70,21:53:-74.72,-15.98,-142.31:99
-chr1 2620085 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=0;HaplotypeScore=54.16;MQ=39.71;MQ0=11;OQ=120.34;QD=1.02;SB=-33.16 GT:AD:DP:GL:GQ 0/1:69,45:56:-32.19,-16.87,-164.99:99
-chr1 2620124 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=144;Dels=0.00;HRun=0;HaplotypeScore=63.81;MQ=34.92;MQ0=3;OQ=525.60;QD=3.65;SB=47.19 GT:AD:DP:GL:GQ 0/1:42,93:57:-80.08,-24.23,-172.63:99
-chr1 2620133 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=151;Dels=0.00;HRun=1;HaplotypeScore=107.36;MQ=34.37;MQ0=3;OQ=432.59;QD=2.86;SB=-11.69 GT:AD:DP:GL:GQ 0/1:52,96:55:-63.12,-16.58,-172.84:99
-chr1 2620148 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=170;Dels=0.00;HRun=3;HaplotypeScore=138.11;MQ=33.81;MQ0=6;OQ=406.05;QD=2.39;SB=-68.70 GT:AD:DP:GL:GQ 0/1:52,113:57:-61.06,-17.17,-159.71:99
-chr1 2620167 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=206;Dels=0.00;HRun=1;HaplotypeScore=129.33;MQ=31.98;MQ0=15;OQ=238.76;QD=1.16;SB=-5.73 GT:AD:DP:GL:GQ 0/1:136,68:69:-47.94,-20.78,-212.90:99
-chr1 2620268 rs12741311 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=74.94;MQ=48.87;MQ0=0;OQ=615.93;QD=7.90;SB=-166.53 GT:AD:DP:GL:GQ 0/1:39,39:52:-80.54,-15.66,-101.64:99
-chr1 2620338 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=10.27;MQ=42.72;MQ0=7;OQ=159.57;QD=1.60;SB=-79.74 GT:AD:DP:GL:GQ 0/1:47,53:53:-35.21,-15.97,-154.39:99
-chr1 2620373 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=37.37;MQ=38.59;MQ0=9;OQ=479.31;QD=3.40;SB=-63.47 GT:AD:DP:GL:GQ 0/1:49,92:64:-70.51,-19.30,-148.48:99
-chr1 2620382 . G A 119.16 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=95.95;MQ=37.22;MQ0=9;QD=0.82;SB=68.14 GT:AD:DP:GL:GQ 0/1:86,59:65:-34.81,-19.61,-177.00:99
-chr1 2620388 . A C 105.30 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=153;Dels=0.00;HRun=1;HaplotypeScore=83.57;MQ=35.41;MQ0=9;QD=0.69;SB=-45.48 GT:AD:DP:GL:GQ 0/1:132,21:67:-34.00,-20.19,-204.42:99
-chr1 2620390 rs28376921 A C 238.82 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=152;Dels=0.00;HRun=3;HaplotypeScore=84.30;MQ=34.68;MQ0=9;QD=1.57;SB=-137.48 GT:AD:DP:GL:GQ 0/1:57,64:66:-69.75,-42.59,-188.12:99
-chr1 2620438 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=39.76;MQ=41.64;MQ0=7;OQ=388.27;QD=3.70;SB=-212.33 GT:AD:DP:GL:GQ 0/1:46,59:60:-60.19,-18.08,-149.44:99
-chr1 2620448 . T C 36.03 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=0;HaplotypeScore=55.60;MQ=44.75;MQ0=3;QD=0.36;SB=59.63 GT:AD:DP:GL:GQ 0/1:72,27:62:-25.58,-18.69,-209.22:68.86
-chr1 2620451 rs28507126 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=42.59;MQ=44.33;MQ0=4;OQ=207.39;QD=2.07;SB=-2.70 GT:AD:DP:GL:GQ 0/1:56,44:55:-40.61,-16.58,-162.04:99
-chr1 2620498 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=143;Dels=0.00;HRun=0;HaplotypeScore=117.30;MQ=35.77;MQ0=21;OQ=96.72;QD=0.68;SB=-10.89 GT:AD:DP:GL:GQ 0/1:119,24:63:-31.93,-18.98,-196.03:99
-chr1 2620509 . C A 44.02 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=155;Dels=0.00;HRun=1;HaplotypeScore=149.75;MQ=36.71;MQ0=19;QD=0.28;SB=8.48 GT:AD:DP:GL:GQ 0/1:122,32:70:-28.77,-21.09,-215.81:76.85
-chr1 2620530 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.01;HRun=0;HaplotypeScore=86.24;MQ=39.02;MQ0=10;OQ=202.63;QD=1.69;SB=-58.78 GT:AD:DP:GL:GQ 0/1:60,45:53:-46.29,-22.74,-131.05:99
-chr1 2620553 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=4;HaplotypeScore=12.66;MQ=42.96;MQ0=4;OQ=154.29;QD=1.66;SB=6.59 GT:AD:DP:GL:GQ 0/1:47,46:55:-35.28,-16.57,-164.62:99
-chr1 2620589 rs4648687 C A 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=19.10;MQ=49.13;MQ0=2;OQ=495.80;QD=9.01;SB=-265.29 GT:AD:DP:GL:GQ 0/1:36,19:38:-64.31,-11.45,-69.99:99
-chr1 2620786 rs12742092 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=51.45;MQ=48.85;MQ0=1;OQ=289.75;QD=5.57;SB=-99.04 GT:AD:DP:GL:GQ 0/1:36,16:30:-41.30,-9.04,-64.97:99
-chr1 2620835 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=99.62;MQ=36.59;MQ0=7;OQ=441.17;QD=4.64;SB=-224.20 GT:AD:DP:GL:GQ 0/1:74,18:36:-60.73,-13.33,-87.56:99
-chr1 2620875 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=107.69;MQ=35.97;MQ0=15;OQ=95.46;QD=0.71;SB=-26.90 GT:AD:DP:GL:GQ 0/1:113,19:59:-30.61,-17.78,-174.51:99
-chr1 2620960 . T A 14.94 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=17.98;MQ=48.66;MQ0=1;QD=0.38;SB=38.15 GT:AD:DP:GL:GQ 0/1:35,4:38:-16.21,-11.45,-119.38:47.63
-chr1 2621024 . C A 47.37 LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=15.73;MQ=45.56;MQ0=1;QD=1.18;SB=-9.87 GT:AD:DP:GL:GQ 0/1:33,7:35:-18.56,-10.54,-104.34:80.21
-chr1 2621154 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=51.59;MQ=53.22;MQ0=2;OQ=488.50;QD=9.77;SB=-206.66 GT:AD:DP:GL:GQ 0/1:29,19:38:-63.61,-11.47,-88.44:99
-chr1 2621346 rs12746691 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=78.63;MQ=48.13;MQ0=0;OQ=876.62;QD=14.61;SB=-440.96 GT:AD:DP:GL:GQ 0/1:34,26:44:-104.20,-13.26,-62.31:99
-chr1 2621414 rs12746841 C G 50.04 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=5.31;MQ=55.95;MQ0=0;OQ=526.83;QD=11.97;SB=-219.19 GT:AD:DP:GL:GQ 0/1:24,20:36:-66.82,-10.85,-82.62:99
-chr1 2621575 rs61766505 T A 0.76 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=9.78;MQ=51.58;MQ0=2;OQ=514.79;QD=12.26;SB=-105.13 GT:AD:DP:GL:GQ 0/1:24,18:33:-64.70,-9.94,-57.89:99
-chr1 2621592 rs11516514 C A 2.97 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=7.05;MQ=51.18;MQ0=2;OQ=412.67;QD=8.78;SB=-93.77 GT:AD:DP:GL:GQ 0/1:31,16:35:-55.10,-10.55,-68.38:99
-chr1 2621664 rs12743419 G A 126.86 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=54.07;MQ0=3;OQ=805.45;QD=17.14;SB=-279.82 GT:AD:DP:GL:GQ 0/1:16,31:40:-95.89,-12.06,-46.66:99
-chr1 2621957 rs12751643 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.02;HRun=1;HaplotypeScore=33.34;MQ=53.32;MQ0=0;OQ=1019.18;QD=17.27;SB=-299.66 GT:AD:DP:GL:GQ 0/1:24,34:54:-121.47,-16.27,-70.01:99
-chr1 2622417 . C G 34.36 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=22.88;MQ0=7;QD=1.01;SB=-10.00 GT:AD:DP:GL:GQ 0/1:28,6:20:-12.75,-6.03,-74.77:67.20
-chr1 2622422 rs11488613 G T 0.62 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=6.76;MQ=21.77;MQ0=7;OQ=525.32;QD=15.45;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,31:16:-56.12,-4.82,-0.00:48.14
-chr1 2622433 rs12752340 C A 26.89 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=20.67;MQ0=10;QD=0.75;SB=-10.00 GT:AD:DP:GL:GQ 0/1:30,6:16:-10.79,-4.82,-42.41:59.72
-chr1 2674088 . C G 42.96 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=0;HaplotypeScore=11.98;MQ=19.55;MQ0=6;QD=3.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,3:5:-9.09,-1.51,-12.64:75.79
-chr1 2674094 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=17.86;MQ=18.47;MQ0=6;OQ=64.31;QD=4.95;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,3:4:-10.92,-1.20,-3.26:20.53
-chr1 2674111 . T A 27.07 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=32.32;MQ0=6;QD=1.80;SB=-6.99 GT:AD:DP:GL:GQ 0/1:12,3:7:-8.10,-2.11,-18.86:59.90
-chr1 2674112 . A G 16.12 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=32.32;MQ0=6;QD=1.07;SB=-6.99 GT:AD:DP:GL:GQ 0/1:12,3:7:-6.99,-2.11,-20.42:48.85
-chr1 2674407 . A G 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=13.44;MQ=45.39;MQ0=5;OQ=445.12;QD=11.41;SB=-215.68 GT:AD:DP:GL:GQ 0/1:16,22:32:-57.44,-9.65,-56.21:99
-chr1 2674852 rs61766513 G A 450.01 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=13.17;MQ0=18;OQ=519.69;QD=10.39;SB=-286.88 GT:AD:DP:GL:GQ 1/1:0,50:14:-55.56,-4.22,-0.00:42.14
-chr1 2676124 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=15.64;MQ=24.04;MQ0=14;OQ=178.81;QD=2.03;SB=-90.56 GT:AD:DP:GL:GQ 0/1:59,29:40:-33.21,-12.05,-114.97:99
-chr1 2676150 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=19.23;MQ=23.09;MQ0=22;OQ=221.70;QD=2.33;SB=-83.88 GT:AD:DP:GL:GQ 0/1:54,41:38:-36.91,-11.46,-90.41:99
-chr1 2676190 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=39.71;MQ=18.24;MQ0=31;OQ=65.56;QD=0.85;SB=-25.50 GT:AD:DP:GL:GQ 0/1:64,13:22:-16.48,-6.63,-57.54:98.40
-chr1 2676191 . G A 29.02 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=39.71;MQ=17.81;MQ0=31;QD=0.39;SB=26.10 GT:AD:DP:GL:GQ 0/1:60,14:18:-11.61,-5.43,-50.51:61.85
-chr1 2676208 . G A 16.39 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.26;MQ=15.36;MQ0=32;QD=0.30;SB=-24.49 GT:AD:DP:GL:GQ 0/1:43,10:12:-8.53,-3.62,-33.94:49.13
-chr1 2676293 rs11486072 G T 42.12 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=21.44;MQ0=18;QD=0.68;SB=83.26 GT:AD:DP:GL:GQ 0/1:53,9:41:-19.85,-12.35,-121.85:74.96
-chr1 2676409 . C G 16.08 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=24.91;MQ=14.80;MQ0=58;QD=0.16;SB=-10.00 GT:AD:DP:GL:GQ 0/1:83,17:12:-8.50,-3.62,-44.92:48.81
-chr1 2677515 . G T 19.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=14.46;MQ=8.37;MQ0=110;QD=0.16;SB=-10.00 GT:AD:DP:GL:GQ 0/1:117,3:8:-7.59,-2.41,-19.90:51.83
-chr1 2677525 . C T 16.29 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=20.34;MQ=9.26;MQ0=102;QD=0.14;SB=-10.00 GT:AD:DP:GL:GQ 0/1:110,4:10:-7.91,-3.01,-27.95:49.02
-chr1 2677552 . A T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=0;HaplotypeScore=12.35;MQ=15.52;MQ0=82;OQ=53.71;QD=0.48;SB=0.32 GT:AD:DP:GL:GQ 0/1:89,18:28:-23.83,-15.18,-91.71:86.54
-chr1 2677675 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=104;Dels=0.00;HRun=0;HaplotypeScore=15.33;MQ=33.22;MQ0=25;OQ=57.19;QD=0.55;SB=35.14 GT:AD:DP:GL:GQ 0/1:87,15:66:-28.89,-19.89,-231.82:90.03
-chr1 2677743 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=4.26;MQ=19.03;MQ0=67;OQ=90.19;QD=0.78;SB=-10.00 GT:AD:DP:GL:GQ 0/1:98,17:39:-24.05,-11.75,-110.96:99
-chr1 2677829 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=23.79;MQ=23.13;MQ0=70;OQ=279.18;QD=2.18;SB=-0.99 GT:AD:DP:GL:GQ 0/1:107,21:47:-45.38,-14.18,-109.88:99
-chr1 2677890 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=0;HaplotypeScore=41.46;MQ=39.72;MQ0=24;OQ=334.00;QD=2.24;SB=-111.40 GT:AD:DP:GL:GQ 0/1:125,24:98:-66.21,-29.53,-281.36:99
-chr1 2677918 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=22.75;MQ=42.78;MQ0=7;OQ=406.29;QD=3.01;SB=-222.57 GT:AD:DP:GL:GQ 0/1:111,24:99:-73.74,-29.83,-281.76:99
-chr1 2678023 rs4601526 G T 43.97 LowQual AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=8.77;MQ=39.66;MQ0=3;QD=0.46;SB=-45.56 GT:AD:DP:GL:GQ 0/1:69,27:71:-29.07,-21.39,-211.74:76.81
-chr1 2678153 rs4287119 C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=112;Dels=0.00;HRun=0;HaplotypeScore=21.76;MQ=40.92;MQ0=5;OQ=2547.58;QD=22.75;SB=-1076.65 GT:AD:DP:GL:GQ 0/1:21,91:87:-284.26,-26.22,-47.57:99
-chr1 2679458 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=42.73;MQ=34.12;MQ0=11;OQ=188.41;QD=2.36;SB=-47.79 GT:AD:DP:GL:GQ 0/1:51,29:31:-31.49,-9.36,-91.42:99
-chr1 2679642 . C G 45.83 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=7.58;MQ=33.48;MQ0=11;QD=0.45;SB=71.27 GT:AD:DP:GL:GQ 0/1:93,9:79:-31.68,-23.81,-299.21:78.67
-chr1 2679803 rs56221638 T A 49.73 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=28.41;MQ=20.22;MQ0=17;QD=0.80;SB=-24.63 GT:AD:DP:GL:GQ 0/1:36,25:21:-14.59,-6.33,-59.48:82.57
-chr1 2679816 rs4648571 G A 0.30 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=13.76;MQ=19.63;MQ0=17;OQ=484.56;QD=8.35;SB=18.94 GT:AD:DP:GL:GQ 1/1:9,49:16:-54.94,-4.82,-2.91:19.19
-chr1 2680538 rs58288263 C A 0.59 PASS AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=19.45;MQ0=42;OQ=235.18;QD=2.28;SB=-135.60 GT:AD:DP:GL:GQ 0/1:70,33:45:-40.37,-13.56,-115.16:99
-chr1 2681143 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=43.31;MQ=7.59;MQ0=129;OQ=216.62;QD=1.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:128,12:8:-27.36,-2.41,-6.90:44.81
-chr1 2681205 . C T 16.27 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=0;HaplotypeScore=11.46;MQ=9.18;MQ0=122;QD=0.12;SB=-10.00 GT:AD:DP:GL:GQ 0/1:130,4:11:-8.21,-3.31,-32.22:49.01
-chr1 2681386 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.02;HRun=1;HaplotypeScore=17.33;MQ=40.82;MQ0=2;OQ=547.52;QD=6.44;SB=26.11 GT:AD:DP:GL:GQ 0/1:58,25:71:-78.82,-20.79,-186.55:99
-chr1 2681420 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=13.55;MQ=31.27;MQ0=32;OQ=249.95;QD=2.34;SB=17.08 GT:AD:DP:GL:GQ 0/1:90,15:70:-49.36,-21.09,-234.22:99
-chr1 2681440 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=118;Dels=0.00;HRun=2;HaplotypeScore=12.17;MQ=28.00;MQ0=51;OQ=57.67;QD=0.49;SB=-0.98 GT:AD:DP:GL:GQ 0/1:103,11:57:-26.23,-17.18,-176.09:90.51
-chr1 2681463 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=112;Dels=0.00;HRun=0;HaplotypeScore=17.45;MQ=24.10;MQ0=61;OQ=86.42;QD=0.77;SB=-10.00 GT:AD:DP:GL:GQ 0/1:104,8:47:-26.08,-14.16,-135.23:99
-chr1 2681473 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=11.36;MQ=22.15;MQ0=63;OQ=86.11;QD=0.79;SB=-10.00 GT:AD:DP:GL:GQ 0/1:101,7:42:-24.54,-12.65,-127.26:99
-chr1 2681679 rs61766519 A T 2.14 PASS AC=1;AF=0.50;AN=2;DB;DP=109;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=46.07;MQ0=2;OQ=403.94;QD=3.71;SB=-208.28 GT:AD:DP:GL:GQ 0/1:86,23:102:-74.40,-30.73,-305.98:99
-chr1 2681697 . C G 10.09 PASS AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=45.11;MQ0=2;OQ=843.38;QD=7.21;SB=-230.77 GT:AD:DP:GL:GQ 0/1:84,33:113:-121.68,-34.06,-367.48:99
-chr1 2681715 rs4430271 G A 32.27 PASS AC=2;AF=1.00;AN=2;DB;DP=112;Dels=0.00;HRun=1;HaplotypeScore=3.54;MQ=44.60;MQ0=4;OQ=4104.48;QD=36.65;SB=-1313.32 GT:AD:DP:GL:GQ 1/1:1,111:104:-409.45,-31.34,-0.04:99
-chr1 2681869 . T C 23.42 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=42.88;MQ0=2;QD=0.35;SB=71.26 GT:AD:DP:GL:GQ 0/1:51,15:54:-21.90,-16.27,-186.51:56.24
-chr1 2681986 rs11586212 G A 7.71 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.27;MQ=47.82;MQ0=3;OQ=510.08;QD=6.80;SB=56.19 GT:AD:DP:GL:GQ 0/1:53,22:70:-75.38,-21.09,-180.91:99
-chr1 2682337 . G A 7.34 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=27.22;MQ0=23;OQ=345.10;QD=8.03;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,23:16:-42.61,-4.82,-16.65:99
-chr1 2682347 . G T 0.70 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=19.93;MQ0=26;OQ=183.77;QD=4.59;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,20:10:-24.67,-3.01,-11.27:82.62
-chr1 2682645 . C A 19.07 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.93;MQ=11.47;MQ0=37;QD=0.33;SB=-0.98 GT:AD:DP:GL:GQ 0/1:31,27:8:-7.60,-2.41,-19.17:51.85
-chr1 2683816 rs10909957 C T 271.77 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=46.26;MQ0=0;OQ=686.46;QD=13.46;SB=-268.23 GT:AD:DP:GL:GQ 0/1:24,27:45:-85.49,-13.56,-81.02:99
-chr1 2684356 rs6424062 G A 144.95 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.15;MQ0=0;OQ=655.97;QD=13.39;SB=-112.11 GT:AD:DP:GL:GQ 0/1:26,23:46:-82.76,-13.88,-73.01:99
-chr1 2687573 rs4648459 G T 323.17 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=991.84;QD=18.37;SB=-411.82 GT:AD:DP:GL:GQ 0/1:20,34:49:-117.23,-14.76,-57.58:99
-chr1 2689509 rs4648499 A C 571.48 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=812.32;QD=13.32;SB=-346.80 GT:AD:DP:GL:GQ 0/1:31,30:60:-102.59,-18.07,-113.17:99
-chr1 2689977 rs4648502 C G 37.31 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=4.68;MQ=58.83;MQ0=0;OQ=362.80;QD=11.34;SB=-98.64 GT:AD:DP:GL:GQ 0/1:15,17:26:-47.41,-7.85,-58.24:99
-chr1 2691287 rs10909982 A C 5.74 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=1.88;MQ=58.74;MQ0=0;OQ=1314.76;QD=31.30;SB=-536.04 GT:AD:DP:GL:GQ 1/1:0,42:39:-135.08,-11.75,-0.02:99
-chr1 2691405 . T C 26.51 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.83;MQ=54.55;MQ0=0;QD=0.72;SB=1.18 GT:AD:DP:GL:GQ 0/1:31,6:36:-16.78,-10.85,-121.87:59.34
-chr1 2691676 rs1456462 C G 51.18 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=56.36;MQ0=0;OQ=806.36;QD=17.53;SB=-304.60 GT:AD:DP:GL:GQ 0/1:21,25:41:-96.28,-12.36,-77.64:99
-chr1 2694331 rs12748553 C T 3.51 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=8.78;MQ=58.48;MQ0=0;OQ=835.97;QD=17.06;SB=-250.13 GT:AD:DP:GL:GQ 0/1:21,26:46:-100.74,-13.86,-71.99:99
-chr1 2694778 rs55972083 G T 162.91 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.66;MQ0=0;OQ=915.47;QD=16.64;SB=-316.68 GT:AD:DP:GL:GQ 0/1:25,30:54:-111.10,-16.27,-82.95:99
-chr1 2697298 rs7526311 A T 117.22 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.01;MQ0=0;OQ=185.29;QD=9.75;SB=-41.37 GT:AD:DP:GL:GQ 0/1:12,7:18:-27.23,-5.42,-39.59:99
-chr1 2697760 . G T 0.81 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=344.69;QD=12.77;SB=-29.36 GT:AD:DP:GL:GQ 0/1:13,14:25:-45.29,-7.54,-35.79:99
-chr1 2697817 rs57572926 T A 7.58 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.48;MQ0=0;OQ=773.03;QD=21.47;SB=-134.51 GT:AD:DP:GL:GQ 0/1:11,25:35:-91.13,-10.54,-41.10:99
-chr1 2699252 rs12044475 G A 223.02 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.73;MQ0=0;OQ=1184.05;QD=17.41;SB=-586.14 GT:AD:DP:GL:GQ 0/1:32,36:66:-141.59,-19.90,-99.06:99
-chr1 2699436 rs12024170 C T 193.04 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.75;MQ0=0;OQ=1445.81;QD=19.54;SB=-655.75 GT:AD:DP:GL:GQ 0/1:31,43:72:-169.56,-21.69,-100.95:99
-chr1 2699862 rs6687680 G A 230.47 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.28;MQ0=0;OQ=1732.28;QD=19.25;SB=-761.79 GT:AD:DP:GL:GQ 0/1:40,50:89:-203.33,-26.82,-125.78:99
-chr1 2700237 . G A 246.23 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1343.35;QD=18.92;SB=-523.75 GT:AD:DP:GL:GQ 0/1:31,40:71:-159.02,-21.40,-102.65:99
-chr1 2702030 rs12731995 A G 434.35 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=677.81;QD=11.11;SB=-347.04 GT:AD:DP:GL:GQ 0/1:33,28:60:-89.15,-18.08,-132.37:99
-chr1 2703187 rs2377041 C T 502.97 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=621.61;QD=15.54;SB=-277.29 GT:AD:DP:GL:GQ 0/1:21,19:39:-77.20,-11.76,-63.03:99
-chr1 2704632 . T C 38.02 LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=4;HaplotypeScore=7.59;MQ=52.48;MQ0=0;QD=2.38;SB=-19.89 GT:AD:DP:GL:GQ 0/1:10,6:12:-10.71,-3.62,-29.51:70.86
-chr1 2704685 . G A 22.35 LowQual AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=7.62;MQ=56.04;MQ0=0;QD=1.86;SB=-34.51 GT:AD:DP:GL:GQ 0/1:9,2:7:-7.63,-2.11,-16.67:55.16
-chr1 2704950 . A G 2.25 PASS AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=48.87;MQ0=0;OQ=588.34;QD=32.69;SB=-143.72 GT:AD:DP:GL:GQ 1/1:0,18:17:-62.42,-5.12,-0.01:51.15
-chr1 2705371 . T C 47.74 LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=60.80;MQ0=0;QD=2.51;SB=-6.99 GT:AD:DP:GL:GQ 0/1:12,6:14:-12.28,-4.22,-38.37:80.58
-chr1 2705380 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=2;HaplotypeScore=2.68;MQ=59.93;MQ0=0;OQ=62.82;QD=3.31;SB=-3.98 GT:AD:DP:GL:GQ 0/1:14,5:17:-14.69,-5.13,-40.99:95.66
-chr1 2706146 . A G 47.67 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=5;HaplotypeScore=3.46;MQ=57.94;MQ0=0;QD=1.40;SB=47.18 GT:AD:DP:GL:GQ 0/1:26,7:27:-16.19,-8.14,-86.26:80.50
-chr1 2706767 rs751358 G C 35.53 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=240.08;QD=16.01;SB=-112.68 GT:AD:DP:GL:GQ 0/1:7,8:15:-31.82,-4.53,-27.47:99
-chr1 2708350 rs897627 T C 68.67 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.23;MQ0=0;OQ=241.23;QD=8.04;SB=-88.78 GT:AD:DP:GL:GQ 0/1:18,12:26:-35.25,-7.84,-56.33:99
-chr1 2709162 rs897626 T C 124.16 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=58.50;MQ0=0;OQ=297.67;QD=9.60;SB=-169.49 GT:AD:DP:GL:GQ 0/1:13,16:23:-39.99,-6.94,-39.26:99
-chr1 2709764 rs12725202 C A 209.03 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.58;MQ0=0;OQ=806.35;QD=14.66;SB=-275.34 GT:AD:DP:GL:GQ 0/1:27,28:48:-98.38,-14.47,-61.56:99
-chr1 2711436 rs897623 A G 190.36 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=58.98;MQ0=0;OQ=627.29;QD=15.30;SB=-199.45 GT:AD:DP:GL:GQ 0/1:15,26:39:-77.77,-11.76,-60.17:99
-chr1 2712708 rs6692145 C T 11.73 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=7.75;MQ=59.11;MQ0=0;OQ=873.72;QD=16.80;SB=-440.44 GT:AD:DP:GL:GQ 0/1:21,31:48:-105.13,-14.48,-65.51:99
-chr1 2713074 rs4648450 C A 220.10 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.19;MQ0=0;OQ=931.32;QD=16.34;SB=-352.41 GT:AD:DP:GL:GQ 0/1:24,33:49:-111.18,-14.76,-58.95:99
-chr1 2713205 rs4648360 C T 362.23 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.64;MQ0=0;OQ=808.14;QD=12.63;SB=-348.52 GT:AD:DP:GL:GQ 0/1:38,26:64:-103.39,-19.29,-126.27:99
-chr1 2713822 rs11588256 T C 179.59 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.44;MQ0=0;OQ=1164.73;QD=28.41;SB=-522.80 GT:AD:DP:GL:GQ 1/1:0,40:39:-122.64,-14.15,-2.58:99
-chr1 2715335 rs7537581 C A 258.05 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.30;MQ0=0;OQ=476.92;QD=14.45;SB=-256.43 GT:AD:DP:GL:GQ 0/1:16,17:32:-60.62,-9.64,-51.47:99
-chr1 2715367 rs56038961 C T 199.13 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.45;MQ0=0;OQ=479.64;QD=15.99;SB=-264.20 GT:AD:DP:GL:GQ 0/1:12,18:27:-59.39,-8.14,-35.88:99
-chr1 2716724 rs17387572 C G 92.23 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=2.10;MQ=58.95;MQ0=0;OQ=183.11;QD=8.32;SB=-57.73 GT:AD:DP:GL:GQ 0/1:14,8:19:-27.33,-5.74,-48.15:99
-chr1 2717498 rs10909879 G A 568.71 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=638.90;QD=14.20;SB=-321.91 GT:AD:DP:GL:GQ 0/1:24,21:43:-80.13,-12.96,-77.89:99
-chr1 2717664 rs10909880 C T 111.56 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.85;MQ=58.20;MQ0=0;OQ=901.98;QD=16.40;SB=-412.72 GT:AD:DP:GL:GQ 0/1:27,27:53:-109.45,-15.96,-95.84:99
-chr1 2718581 rs2290583 C T 466.48 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.90;MQ0=0;OQ=858.25;QD=15.60;SB=-364.54 GT:AD:DP:GL:GQ 0/1:27,28:51:-104.48,-15.37,-82.61:99
-chr1 2720957 rs56242447 T C 191.02 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=60.00;MQ0=0;OQ=720.09;QD=11.43;SB=-266.23 GT:AD:DP:GL:GQ 0/1:29,34:60:-93.39,-18.10,-112.64:99
-chr1 2725957 rs4648454 C A 155.77 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.23;MQ0=0;OQ=2137.84;QD=35.63;SB=-968.57 GT:AD:DP:GL:GQ 1/1:0,60:60:-217.39,-18.07,-0.02:99
-chr1 2727346 rs4515734 C T 401.62 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=1193.72;QD=37.30;SB=-333.34 GT:AD:DP:GL:GQ 1/1:0,32:32:-122.97,-9.64,-0.01:96.30
-chr1 2728125 rs11584658 C T 220.84 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=58.92;MQ0=0;OQ=363.72;QD=9.33;SB=-203.89 GT:AD:DP:GL:GQ 0/1:25,14:38:-51.11,-11.46,-81.85:99
-chr1 2728509 . C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=7.07;MQ=57.48;MQ0=0;OQ=153.44;QD=5.48;SB=38.15 GT:AD:DP:GL:GQ 0/1:17,11:22:-25.28,-6.65,-60.78:99
-chr1 2728983 rs12025517 T C 254.56 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.46;MQ0=0;OQ=692.09;QD=16.10;SB=-320.61 GT:AD:DP:GL:GQ 0/1:17,25:42:-87.78,-15.29,-69.40:99
-chr1 2731560 rs897622 T C 5.62 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.40;MQ=59.38;MQ0=0;OQ=1158.40;QD=31.31;SB=-281.53 GT:AD:DP:GL:GQ 1/1:0,37:35:-119.44,-10.55,-0.02:99
-chr1 2734276 rs56400103 G A 253.28 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=949.71;QD=17.92;SB=-409.46 GT:AD:DP:GL:GQ 0/1:24,29:51:-113.64,-15.38,-67.18:99
-chr1 2734570 rs12747919 T C 241.01 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.34;MQ0=0;OQ=778.48;QD=12.36;SB=-342.05 GT:AD:DP:GL:GQ 0/1:32,31:63:-100.12,-18.99,-128.39:99
-chr1 2734737 rs12125787 G A 71.93 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.70;MQ=57.83;MQ0=0;OQ=2028.15;QD=37.56;SB=-957.98 GT:AD:DP:GL:GQ 1/1:0,54:53:-206.42,-15.97,-0.02:99
-chr1 2735743 rs4609377 C T 266.10 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=58.76;MQ0=0;OQ=803.58;QD=14.35;SB=-286.83 GT:AD:DP:GL:GQ 0/1:31,25:54:-99.92,-16.28,-93.51:99
-chr1 2735926 rs1001620 G C 451.59 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.61;MQ0=0;OQ=977.15;QD=12.69;SB=-354.56 GT:AD:DP:GL:GQ 0/1:46,31:77:-124.21,-23.21,-202.34:99
-chr1 2739474 rs10797389 G A 308.93 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=60.00;MQ0=0;OQ=750.99;QD=15.65;SB=-309.79 GT:AD:DP:GL:GQ 0/1:23,25:47:-92.55,-14.16,-81.12:99
-chr1 2739576 rs4648481 G T 368.63 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=60.00;MQ0=0;OQ=793.99;QD=14.70;SB=-305.02 GT:AD:DP:GL:GQ 0/1:26,28:52:-98.35,-15.67,-82.42:99
-chr1 2739781 rs4648482 T C 14.80 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=4.29;MQ=58.44;MQ0=0;OQ=365.14;QD=8.69;SB=-69.92 GT:AD:DP:GL:GQ 0/1:24,18:40:-51.86,-12.06,-91.45:99
-chr1 2740297 rs1563471 C T 85.39 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=5.94;MQ=59.22;MQ0=0;OQ=682.02;QD=11.56;SB=-286.79 GT:AD:DP:GL:GQ 0/1:33,26:55:-88.08,-16.60,-99.20:99
-chr1 2740756 rs12132067 G A 288.53 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.87;MQ=59.52;MQ0=0;OQ=623.21;QD=12.98;SB=-250.12 GT:AD:DP:GL:GQ 0/1:27,21:48:-80.07,-14.46,-95.69:99
-chr1 2742125 rs7511879 A G 408.25 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.68;MQ0=0;OQ=942.16;QD=16.24;SB=-438.99 GT:AD:DP:GL:GQ 0/1:24,34:55:-114.07,-16.57,-91.14:99
-chr1 2742553 rs10797390 C T 146.24 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=1057.36;QD=18.88;SB=-301.83 GT:AD:DP:GL:GQ 0/1:24,32:56:-125.89,-16.87,-83.67:99
-chr1 2743097 rs12031493 A G 99.82 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.23;MQ=59.34;MQ0=0;OQ=647.93;QD=9.26;SB=-314.90 GT:AD:DP:GL:GQ 0/1:40,29:67:-88.27,-20.19,-156.45:99
-chr1 2743232 rs11803074 T C 136.13 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.52;MQ0=0;OQ=450.58;QD=9.39;SB=-159.47 GT:AD:DP:GL:GQ 0/1:26,22:43:-61.31,-12.96,-94.61:99
-chr1 2743923 rs2377040 G A 85.94 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.57;MQ0=0;OQ=1679.85;QD=39.07;SB=-699.34 GT:AD:DP:GL:GQ 1/1:0,43:43:-171.58,-12.96,-0.02:99
-chr1 2744048 rs6691019 A G 253.73 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=599.61;QD=12.24;SB=-315.28 GT:AD:DP:GL:GQ 0/1:24,25:46:-77.11,-13.87,-86.95:99
-chr1 2744266 rs729045 A G 494.21 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=550.14;QD=10.19;SB=-251.93 GT:AD:DP:GL:GQ 0/1:30,24:53:-74.27,-15.97,-120.98:99
-chr1 2744372 rs6680471 C T 188.10 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=743.73;QD=13.52;SB=-388.16 GT:AD:DP:GL:GQ 0/1:30,25:50:-92.73,-15.07,-87.39:99
-chr1 2744840 rs7541827 T G 3.84 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=3.30;MQ=53.60;MQ0=0;OQ=317.87;QD=7.95;SB=-163.88 GT:AD:DP:GL:GQ 0/1:27,13:38:-46.52,-11.45,-85.79:99
-chr1 2745157 rs10909938 C G 278.22 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.10;MQ0=0;OQ=946.24;QD=11.98;SB=-426.32 GT:AD:DP:GL:GQ 0/1:47,32:78:-121.44,-23.53,-202.08:99
-chr1 2745633 rs10909941 A G 382.13 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.59;MQ0=0;OQ=1890.77;QD=33.76;SB=-793.15 GT:AD:DP:GL:GQ 1/1:0,56:54:-192.68,-16.26,-0.02:99
-chr1 2746148 rs4648382 C T 75.36 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=4.95;MQ=58.25;MQ0=0;OQ=1103.18;QD=17.24;SB=-437.97 GT:AD:DP:GL:GQ 0/1:30,34:62:-132.29,-18.69,-91.91:99
-chr1 2746257 rs4648383 C T 112.72 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.45;MQ0=0;OQ=1198.75;QD=17.63;SB=-573.37 GT:AD:DP:GL:GQ 0/1:33,35:67:-143.34,-20.18,-115.97:99
-chr1 2746481 rs4648384 C A 147.70 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=2.23;MQ=58.55;MQ0=0;OQ=974.97;QD=15.98;SB=-482.87 GT:AD:DP:GL:GQ 0/1:29,32:59:-118.55,-17.77,-93.40:99
-chr1 2746667 rs7516014 G T 183 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=529.64;QD=10.81;SB=-238.43 GT:AD:DP:GL:GQ 0/1:28,20:47:-70.41,-14.16,-95.06:99
-chr1 2746749 rs7548023 T G 93.22 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=3.08;MQ=57.92;MQ0=0;OQ=762.24;QD=14.12;SB=-346.84 GT:AD:DP:GL:GQ 0/1:27,27:54:-95.77,-16.26,-99.72:99
-chr1 2747056 rs4648495 T C 0.66 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=4;HaplotypeScore=4.04;MQ=53.57;MQ0=0;OQ=334.06;QD=9.83;SB=-158.61 GT:AD:DP:GL:GQ 0/1:15,19:25:-44.23,-7.54,-43.47:99
-chr1 2747271 rs4648496 A T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=20.04;MQ=49.89;MQ0=0;OQ=70.38;QD=0.95;SB=-47.55 GT:AD:DP:GL:GQ 0/1:64,10:68:-30.81,-20.49,-219.78:99
-chr1 2747291 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=65;Dels=0.03;HRun=0;HaplotypeScore=32.13;MQ=46.89;MQ0=0;OQ=444.72;QD=6.84;SB=-168.12 GT:AD:DP:GL:GQ 0/1:44,19:62:-65.84,-18.08,-149.47:99
-chr1 2747315 . A T 0.07 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=12.70;MQ=47.25;MQ0=0;OQ=757.92;QD=13.53;SB=-390.15 GT:AD:DP:GL:GQ 0/1:29,27:49:-93.84,-14.77,-85.21:99
-chr1 2747334 rs36040910 C G 1014.60 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.02;HRun=0;HaplotypeScore=10.13;MQ=46.42;MQ0=0;QD=19.14;SB=-531.73 GT:AD:DP:GL:GQ 0/1:24,28:52:-120.42,-15.67,-100.79:99
-chr1 2747338 . G C 826.30 SnpCluster AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=9.97;MQ=47.26;MQ0=0;QD=17.21;SB=-358.43 GT:AD:DP:GL:GQ 0/1:23,24:47:-99.78,-13.86,-101.33:99
-chr1 2747339 . A T 752.39 SnpCluster AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=3.00;MQ=47.26;MQ0=0;QD=15.67;SB=-313.68 GT:AD:DP:GL:GQ 0/1:23,24:47:-92.38,-13.86,-82.64:99
-chr1 2747369 . A T 3.22 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=49.16;MQ0=0;OQ=703.99;QD=14.37;SB=-261.27 GT:AD:DP:GL:GQ 0/1:25,24:47:-87.84,-14.16,-92.00:99
-chr1 2747375 rs61766530 T A 10.44 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=7.95;MQ=48.99;MQ0=0;OQ=615.25;QD=13.37;SB=-274.62 GT:AD:DP:GL:GQ 0/1:24,22:43:-77.76,-12.95,-81.15:99
-chr1 2747387 rs34464542 A T 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.05;HRun=0;HaplotypeScore=17.99;MQ=50.33;MQ0=0;OQ=475.32;QD=10.80;SB=-181.51 GT:AD:DP:GL:GQ 0/1:25,17:43:-63.16,-12.35,-94.24:99
-chr1 2747397 rs12739189 C T 56.98 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.47;MQ=51.77;MQ0=0;OQ=606.36;QD=14.44;SB=-321.86 GT:AD:DP:GL:GQ 0/1:23,19:42:-76.58,-12.66,-74.78:99
-chr1 2747562 rs35401657 A G 338.79 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=54.94;MQ0=0;OQ=916.49;QD=12.73;SB=-443.41 GT:AD:DP:GL:GQ 0/1:37,34:70:-119.52,-24.59,-154.08:99
-chr1 2747592 rs34262355 G A 349.69 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=54.28;MQ0=0;OQ=1032.22;QD=12.74;SB=-451.44 GT:AD:DP:GL:GQ 0/1:45,35:78:-130.02,-23.51,-145.95:99
-chr1 2747610 rs34202711 A G 414.76 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.97;MQ0=0;OQ=1011.04;QD=11.89;SB=-504.68 GT:AD:DP:GL:GQ 0/1:42,43:82:-129.10,-24.71,-172.46:99
-chr1 2747660 rs1456461 C T 603.75 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.82;MQ0=0;OQ=891.16;QD=15.63;SB=-457.95 GT:AD:DP:GL:GQ 0/1:30,27:57:-109.57,-17.17,-111.30:99
-chr1 2748044 rs12740180 C A 413.82 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=606.44;QD=10.83;SB=-262.28 GT:AD:DP:GL:GQ 0/1:33,23:54:-80.19,-16.26,-114.41:99
-chr1 2748753 rs2889541 G A 337.75 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.41;MQ0=0;OQ=1139.69;QD=16.05;SB=-477.50 GT:AD:DP:GL:GQ 0/1:37,34:70:-138.35,-21.10,-115.20:99
-chr1 2749666 rs12037615 A T 1.80 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=5;HaplotypeScore=1.16;MQ=59.20;MQ0=0;OQ=1128.99;QD=14.86;SB=-549.41 GT:AD:DP:GL:GQ 0/1:40,36:76:-139.07,-22.89,-148.90:99
-chr1 2749715 rs12047690 C T 131.06 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=816.13;QD=12.95;SB=-150.20 GT:AD:DP:GL:GQ 0/1:36,27:60:-102.99,-18.09,-107.52:99
-chr1 2751235 rs12049543 C A 405.31 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.56;MQ0=0;OQ=1060.86;QD=12.63;SB=-512.22 GT:AD:DP:GL:GQ 0/1:47,37:84:-134.67,-25.30,-168.73:99
-chr1 2751390 rs1840738 T C 158.28 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=56.95;MQ0=0;OQ=466.03;QD=9.14;SB=-238.28 GT:AD:DP:GL:GQ 0/1:29,21:47:-64.06,-14.17,-105.57:99
-chr1 2751392 rs1840737 T C 150.88 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=56.89;MQ0=0;OQ=432.09;QD=8.64;SB=-211.35 GT:AD:DP:GL:GQ 0/1:30,20:46:-60.36,-13.87,-105.49:99
-chr1 2751468 rs1840736 C T 225.14 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.99;MQ0=0;OQ=538.81;QD=11.71;SB=-284.82 GT:AD:DP:GL:GQ 0/1:28,18:46:-71.04,-13.87,-86.92:99
-chr1 2751723 rs1456460 G T 356.16 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=57.19;MQ0=0;OQ=1157.64;QD=13.31;SB=-342.38 GT:AD:DP:GL:GQ 0/1:48,39:87:-145.25,-26.21,-162.75:99
-chr1 2753129 rs6424080 T C 316.66 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.51;MQ0=0;OQ=966.99;QD=12.24;SB=-274.18 GT:AD:DP:GL:GQ 0/1:43,36:77:-123.19,-23.21,-165.41:99
-chr1 2753241 rs6424081 G C 7.87 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=4;HaplotypeScore=2.76;MQ=58.85;MQ0=0;OQ=855.86;QD=17.47;SB=-443.74 GT:AD:DP:GL:GQ 0/1:25,24:49:-103.64,-14.77,-108.86:99
-chr1 2753928 rs10909950 G C 275.97 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.98;MQ0=0;OQ=738.28;QD=13.67;SB=-369.83 GT:AD:DP:GL:GQ 0/1:27,27:50:-92.19,-15.07,-120.46:99
-chr1 2754032 rs7553697 T C 122.97 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=50.90;MQ0=0;OQ=845.37;QD=27.27;SB=-371.38 GT:AD:DP:GL:GQ 1/1:0,31:28:-88.15,-8.45,-0.03:84.18
-chr1 2754183 rs6424082 A G 8.12 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=5.05;MQ=58.51;MQ0=0;OQ=416.20;QD=9.46;SB=-192.43 GT:AD:DP:GL:GQ 0/1:23,21:40:-56.97,-12.06,-83.18:99
-chr1 2754298 rs6424083 C G 173.34 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=55.35;MQ0=0;OQ=1296.80;QD=37.05;SB=-603.86 GT:AD:DP:GL:GQ 1/1:0,35:33:-133.29,-9.95,-0.02:99
-chr1 2754773 . G A 0.64 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=3.22;MQ=60.00;MQ0=0;OQ=1109.61;QD=18.81;SB=-280.74 GT:AD:DP:GL:GQ 0/1:25,34:58:-131.72,-17.47,-86.47:99
-chr1 2754949 rs34133714 C T 67.94 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=57.50;MQ0=0;OQ=577.42;QD=16.98;SB=-168.27 GT:AD:DP:GL:GQ 0/1:16,18:34:-71.28,-10.25,-51.84:99
-chr1 2755031 rs34352177 T C 19.62 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=7.41;MQ=59.06;MQ0=0;OQ=899.29;QD=13.03;SB=-455.95 GT:AD:DP:GL:GQ 0/1:36,31:67:-116.13,-22.92,-145.73:99
-chr1 2755403 rs11806141 T G 18.81 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=6.77;MQ=51.89;MQ0=9;QD=0.27;SB=74.23 GT:AD:DP:GL:GQ 0/1:49,20:51:-20.52,-15.36,-159.70:51.59
-chr1 2755508 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=79;Dels=0.06;HRun=2;HaplotypeScore=38.09;MQ=49.34;MQ0=4;OQ=65.07;QD=0.82;SB=71.26 GT:AD:DP:GL:GQ 0/1:58,15:62:-27.57,-17.78,-196.95:97.90
-chr1 2755529 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=65.45;MQ=46.51;MQ0=7;OQ=513.73;QD=7.04;SB=-185.79 GT:AD:DP:GL:GQ 0/1:43,30:51:-70.02,-15.37,-107.03:99
-chr1 2755532 . A G 42.46 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=67.89;MQ=46.23;MQ0=7;QD=0.57;SB=41.14 GT:AD:DP:GL:GQ 0/1:61,13:50:-22.60,-15.07,-170.16:75.29
-chr1 2755579 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=21.20;MQ=45.33;MQ0=9;OQ=157.48;QD=2.02;SB=-23.25 GT:AD:DP:GL:GQ 0/1:60,12:47:-33.22,-14.19,-119.56:99
-chr1 2755596 rs11806928 A G 0.11 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=12.62;MQ=45.10;MQ0=9;OQ=205.66;QD=2.78;SB=-15.21 GT:AD:DP:GL:GQ 0/1:58,16:54:-40.13,-16.28,-162.81:99
-chr1 2755612 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=11.17;MQ=46.38;MQ0=5;OQ=126.58;QD=1.73;SB=14.62 GT:AD:DP:GL:GQ 0/1:63,10:57:-33.13,-17.19,-158.30:99
-chr1 2755632 rs10909952 C T 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=10.73;MQ=46.85;MQ0=3;OQ=64.17;QD=0.87;SB=26.06 GT:AD:DP:GL:GQ 0/1:61,13:47:-23.87,-14.17,-131.74:97
-chr1 2755643 . C T 0.06 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=46.66;MQ0=2;OQ=370.42;QD=5.22;SB=-83.91 GT:AD:DP:GL:GQ 0/1:46,20:49:-55.11,-14.78,-108.17:99
-chr1 2755657 rs61763677 G T 0.15 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=8.88;MQ=44.97;MQ0=5;OQ=282.63;QD=3.29;SB=-9.61 GT:AD:DP:GL:GQ 0/1:69,17:72:-53.24,-21.69,-193.61:99
-chr1 2755674 rs61763678 C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=0;HaplotypeScore=23.01;MQ=44.47;MQ0=7;OQ=292.56;QD=2.76;SB=-24.23 GT:AD:DP:GL:GQ 0/1:76,27:79:-56.37,-23.83,-203.58:99
-chr1 2755706 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=46.46;MQ=43.46;MQ0=6;OQ=100.65;QD=1.01;SB=48.33 GT:AD:DP:GL:GQ 0/1:73,19:68:-33.86,-20.51,-216.35:99
-chr1 2755733 rs10909953 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=134.56;MQ=44.60;MQ0=11;OQ=218.03;QD=1.83;SB=-68.77 GT:AD:DP:GL:GQ 0/1:91,18:82:-72.98,-47.89,-237.50:99
-chr1 2755738 rs10909954 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.00;HRun=0;HaplotypeScore=94.54;MQ=44.07;MQ0=12;OQ=119.63;QD=1.01;SB=15.66 GT:AD:DP:GL:GQ 0/1:86,29:80:-42.04,-26.79,-256.64:99
-chr1 2755753 . G A 11.77 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=1;HaplotypeScore=33.32;MQ=44.33;MQ0=10;QD=0.09;SB=66.29 GT:AD:DP:GL:GQ 0/1:116,10:95:-33.05,-28.62,-308.21:44.31
-chr1 2755755 rs57067996 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=130;Dels=0.00;HRun=1;HaplotypeScore=39.46;MQ=44.65;MQ0=10;OQ=1208.64;QD=9.30;SB=-349.24 GT:AD:DP:GL:GQ 0/1:72,52:91:-151.57,-27.42,-186.87:99
-chr1 2755787 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=209;Dels=0.00;HRun=0;HaplotypeScore=9.86;MQ=44.22;MQ0=18;OQ=212.29;QD=1.02;SB=84.79 GT:AD:DP:GL:GQ 0/1:175,28:147:-68.83,-44.32,-479.03:99
-chr1 2755816 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=1;HaplotypeScore=62.94;MQ=43.89;MQ0=23;OQ=172.99;QD=0.80;SB=63.05 GT:AD:DP:GL:GQ 0/1:192,24:159:-68.50,-47.92,-487.91:99
-chr1 2755844 rs4991850 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.00;HRun=0;HaplotypeScore=53.96;MQ=43.72;MQ0=16;OQ=1135.99;QD=6.93;SB=-394.17 GT:AD:DP:GL:GQ 0/1:112,52:121:-153.35,-36.47,-275.01:99
-chr1 2755847 rs57868894 T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=161;Dels=0.00;HRun=1;HaplotypeScore=64.38;MQ=43.84;MQ0=16;OQ=859.67;QD=5.34;SB=-128.73 GT:AD:DP:GL:GQ 0/1:103,58:122:-126.01,-36.76,-296.17:99
-chr1 2755864 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=139;Dels=0.00;HRun=0;HaplotypeScore=32.56;MQ=44.46;MQ0=14;OQ=96.62;QD=0.70;SB=30.17 GT:AD:DP:GL:GQ 0/1:117,20:102:-43.73,-30.78,-282.87:99
-chr1 2755889 rs4991849 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=114;Dels=0.04;HRun=2;HaplotypeScore=40.28;MQ=47.08;MQ0=9;OQ=2321.13;QD=20.36;SB=-1120.12 GT:AD:DP:GL:GQ 0/1:18,92:93:-262.51,-27.11,-65.29:99
-chr1 2755910 rs12728224 T G 16.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=49.38;MQ0=5;QD=0.17;SB=88.35 GT:AD:DP:GL:GQ 0/1:84,11:79:-28.73,-23.80,-253.95:49.30
-chr1 2755924 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=18.40;MQ=49.90;MQ0=6;OQ=1394.92;QD=15.16;SB=-476.13 GT:AD:DP:GL:GQ 0/1:39,53:66:-162.68,-19.90,-75.57:99
-chr1 2755992 . G A 33.66 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=19.55;MQ=45.20;MQ0=8;QD=0.40;SB=27.48 GT:AD:DP:GL:GQ 0/1:73,12:61:-25.05,-18.40,-176.14:66.50
-chr1 2756013 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=17.90;MQ=45.32;MQ0=5;OQ=157.50;QD=2.67;SB=-33.78 GT:AD:DP:GL:GQ 0/1:38,21:37:-30.19,-11.15,-106.30:99
-chr1 2756025 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=4.66;MQ=45.60;MQ0=4;OQ=63.13;QD=1.15;SB=26.12 GT:AD:DP:GL:GQ 0/1:45,10:38:-21.07,-11.48,-129.01:95.97
-chr1 2756051 rs4992290 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=36.34;MQ=44.26;MQ0=6;OQ=205.91;QD=3.38;SB=35.13 GT:AD:DP:GL:GQ 0/1:37,24:36:-34.74,-10.86,-87.18:99
-chr1 2756088 rs6676347 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=50.22;MQ=41.73;MQ0=14;OQ=1315.11;QD=15.29;SB=-568.14 GT:AD:DP:GL:GQ 0/1:37,49:48:-149.26,-14.46,-35.10:99
-chr1 2756101 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=1;HaplotypeScore=21.36;MQ=40.87;MQ0=15;OQ=73.71;QD=0.88;SB=47.17 GT:AD:DP:GL:GQ 0/1:64,20:51:-26.02,-15.36,-158.57:99
-chr1 2756151 rs4648513 T C 97.75 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.14;MQ=50.77;MQ0=9;OQ=1380.54;QD=20.92;SB=-651.39 GT:AD:DP:GL:GQ 1/1:9,57:48:-150.01,-14.48,-8.38:61.01
-chr1 2756174 rs59048447 G A 70.95 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=5.41;MQ=56.28;MQ0=2;OQ=675.24;QD=12.74;SB=-328.31 GT:AD:DP:GL:GQ 0/1:26,27:46:-84.67,-13.86,-86.53:99
-chr1 2756831 rs4648515 C T 238.63 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=59.11;MQ0=0;OQ=2661.31;QD=39.14;SB=-1337.11 GT:AD:DP:GL:GQ 1/1:1,67:68:-272.30,-20.49,-2.59:99
-chr1 2757061 rs4648518 A G 438.92 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1894.09;QD=32.66;SB=-719.10 GT:AD:DP:GL:GQ 1/1:0,58:55:-193.02,-16.57,-0.02:99
-chr1 2757563 rs4648519 C T 617.31 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=2063.43;QD=38.21;SB=-1058.93 GT:AD:DP:GL:GQ 1/1:0,54:53:-209.94,-15.97,-0.02:99
-chr1 2758482 . C T 0.54 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=50.17;MQ0=3;OQ=191.27;QD=4.25;SB=-120.51 GT:AD:DP:GL:GQ 0/1:31,14:38:-33.86,-11.45,-100.08:99
-chr1 2758751 . T G 48.69 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=34.31;MQ0=7;QD=1.62;SB=-11.91 GT:AD:DP:GL:GQ 0/1:21,9:22:-14.78,-6.63,-62.96:81.53
-chr1 2758819 . A G 182.25 PASS AC=2;AF=1.00;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=42.84;MQ0=2;OQ=868.67;QD=27.15;SB=-395.30 GT:AD:DP:GL:GQ 1/1:1,31:28:-90.48,-8.45,-0.03:84.20
-chr1 2758861 . T C 30.75 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=44.85;MQ0=1;QD=0.90;SB=29.12 GT:AD:DP:GL:GQ 0/1:26,7:26:-14.19,-7.84,-86.43:63.58
-chr1 2758882 . G A 6.14 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=35.37;MQ0=5;OQ=748.79;QD=17.41;SB=-255.79 GT:AD:DP:GL:GQ 0/1:14,29:29:-86.90,-8.74,-21.14:99
-chr1 2758933 . T C 5.05 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=4.40;MQ=30.24;MQ0=6;OQ=270.13;QD=7.50;SB=-156.34 GT:AD:DP:GL:GQ 0/1:9,26:16:-35.12,-4.83,-17.51:99
-chr1 2758959 . T G 27.66 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=27.02;MQ0=8;QD=0.92;SB=-23.52 GT:AD:DP:GL:GQ 0/1:24,6:11:-9.36,-3.32,-25.67:60.48
-chr1 2759011 . T G 0.06 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=3.83;MQ=18.26;MQ0=23;OQ=314.04;QD=4.42;SB=-69.87 GT:AD:DP:GL:GQ 0/1:37,34:26:-42.52,-7.83,-50.68:99
-chr1 2759038 . G T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=15.13;MQ=25.49;MQ0=29;OQ=89.07;QD=0.97;SB=-9.29 GT:AD:DP:GL:GQ 0/1:85,7:35:-22.74,-10.55,-90.79:99
-chr1 2759090 . G T 15.10 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=11.61;MQ=28.51;MQ0=10;QD=0.35;SB=-6.99 GT:AD:DP:GL:GQ 0/1:32,11:16:-9.61,-4.83,-35.57:47.80
-chr1 2759130 rs61763686 T C 37.28 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=18.78;MQ0=1;QD=12.43;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-7.14,-0.60,-0.00:6.02
-chr1 2759142 . G A 1.53 PASS AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=18.78;MQ0=2;OQ=80.16;QD=13.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,3:4:-12.50,-1.21,-3.10:18.91
-chr1 2759167 . G T 2.82 PASS AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=26.71;MQ0=4;OQ=151.71;QD=6.90;SB=-6.99 GT:AD:DP:GL:GQ 0/1:16,6:14:-22.67,-4.22,-28.76:99
-chr1 2759193 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=15.10;MQ=26.07;MQ0=10;OQ=142.00;QD=2.90;SB=-61.29 GT:AD:DP:GL:GQ 0/1:38,11:32:-27.13,-9.65,-83.88:99
-chr1 2759219 . G T 0.58 PASS AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=27.42;MQ0=13;OQ=233.66;QD=3.03;SB=-10.31 GT:AD:DP:GL:GQ 0/1:59,18:48:-41.11,-14.46,-126.09:99
-chr1 2759237 rs10909961 G A 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.56;MQ=30.14;MQ0=15;OQ=68.31;QD=0.77;SB=29.11 GT:AD:DP:GL:GQ 0/1:82,7:55:-26.69,-16.57,-172.16:99
-chr1 2759271 . G T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=31.60;MQ0=17;OQ=103.26;QD=1.09;SB=14.07 GT:AD:DP:GL:GQ 0/1:79,16:53:-29.57,-15.96,-157.88:99
-chr1 2759402 rs10752737 G A 706.16 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.81;MQ0=0;OQ=3330.93;QD=38.29;SB=-1475.63 GT:AD:DP:GL:GQ 1/1:0,87:84:-332.09,-25.31,-0.03:99
-chr1 2759793 rs6665646 C T 285.69 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.67;MQ0=0;OQ=1210.11;QD=17.54;SB=-511.14 GT:AD:DP:GL:GQ 0/1:33,36:69:-145.09,-20.79,-106.44:99
-chr1 2760042 rs6679343 A T 0.12 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=6;HaplotypeScore=1.76;MQ=59.01;MQ0=0;OQ=2240.29;QD=33.94;SB=-793.89 GT:AD:DP:GL:GQ 1/1:0,66:63:-227.64,-18.99,-0.03:99
-chr1 2761186 . C G 0.63 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.71;MQ=59.37;MQ0=0;OQ=541.38;QD=12.30;SB=-216.32 GT:AD:DP:GL:GQ 0/1:26,18:41:-69.78,-12.36,-101.99:99
-chr1 2761364 rs12743952 G A 204.61 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=59.65;MQ0=0;OQ=611.70;QD=11.33;SB=-279.20 GT:AD:DP:GL:GQ 0/1:32,22:50:-79.52,-15.07,-100.94:99
-chr1 2761375 rs12743965 G A 240.15 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.65;MQ0=0;OQ=726.42;QD=13.45;SB=-307.80 GT:AD:DP:GL:GQ 0/1:31,23:53:-91.89,-15.96,-108.39:99
-chr1 2761483 rs34161193 G A 219.36 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=58.78;MQ0=0;OQ=505.10;QD=13.29;SB=-258.15 GT:AD:DP:GL:GQ 0/1:20,17:37:-64.94,-11.15,-70.90:99
-chr1 2761516 rs35134901 G C 42.78 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=58.89;MQ0=0;OQ=485.26;QD=11.55;SB=-253.13 GT:AD:DP:GL:GQ 0/1:25,17:38:-63.28,-11.47,-90.46:99
-chr1 2761538 rs35767265 C A 434.92 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=663.44;QD=13.54;SB=-277.32 GT:AD:DP:GL:GQ 0/1:26,23:47:-83.79,-14.16,-83.28:99
-chr1 2761907 rs35313744 A C 3.99 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=4;HaplotypeScore=1.29;MQ=59.00;MQ0=0;OQ=545.25;QD=12.98;SB=-173.29 GT:AD:DP:GL:GQ 0/1:20,22:40:-69.86,-12.05,-71.88:99
-chr1 2762054 rs6694484 G A 356.15 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.79;MQ0=0;OQ=715.90;QD=13.26;SB=-315.29 GT:AD:DP:GL:GQ 0/1:29,25:51:-90.24,-15.37,-99.20:99
-chr1 2762207 rs6675221 C A 216.75 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.45;MQ0=0;OQ=527.73;QD=12.57;SB=-249.28 GT:AD:DP:GL:GQ 0/1:21,20:39:-67.80,-11.75,-71.40:99
-chr1 2762658 rs12727394 T C 169.21 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=383.94;QD=11.63;SB=-133.29 GT:AD:DP:GL:GQ 0/1:17,15:29:-50.42,-8.74,-57.72:99
-chr1 2763115 rs12729596 C T 224.28 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.16;MQ0=0;OQ=609.66;QD=12.19;SB=-271.12 GT:AD:DP:GL:GQ 0/1:30,20:50:-79.31,-15.06,-107.78:99
-chr1 2763349 rs6660680 C G 206.84 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.16;MQ=59.65;MQ0=0;OQ=809.85;QD=15.28;SB=-407.93 GT:AD:DP:GL:GQ 0/1:28,25:49:-99.04,-14.78,-104.68:99
-chr1 2763426 rs6660759 C T 169.45 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.89;MQ0=0;OQ=778.20;QD=18.53;SB=-350.90 GT:AD:DP:GL:GQ 0/1:15,27:38:-92.57,-11.46,-40.16:99
-chr1 2763555 rs6674204 A G 358.56 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1244.75;QD=33.64;SB=-466.51 GT:AD:DP:GL:GQ 1/1:0,37:36:-128.07,-10.85,-0.01:99
-chr1 2763913 rs7529000 A G 539.75 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=590.27;QD=13.73;SB=-268.99 GT:AD:DP:GL:GQ 0/1:19,24:38:-73.77,-11.46,-59.16:99
-chr1 2765576 . A G 299.17 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.30;MQ0=1;OQ=708.87;QD=14.18;SB=-362.49 GT:AD:DP:GL:GQ 0/1:25,25:46:-88.03,-13.85,-86.85:99
-chr1 2765703 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=40;Dels=0.03;HRun=1;HaplotypeScore=65.65;MQ=34.06;MQ0=6;OQ=224.51;QD=5.61;SB=-69.85 GT:AD:DP:GL:GQ 0/1:16,18:20:-31.76,-6.02,-57.23:99
-chr1 2765716 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=45.86;MQ=31.67;MQ0=6;OQ=473.81;QD=11.56;SB=-227.60 GT:AD:DP:GL:GQ 0/1:7,34:22:-57.29,-6.63,-24.20:99
-chr1 2765718 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=49.51;MQ=31.73;MQ0=6;OQ=139.31;QD=3.48;SB=14.07 GT:AD:DP:GL:GQ 0/1:34,6:18:-22.64,-5.42,-43.65:99
-chr1 2765729 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=2;HaplotypeScore=101.24;MQ=39.70;MQ0=5;OQ=348.53;QD=8.30;SB=-73.03 GT:AD:DP:GL:GQ 0/1:25,16:29:-48.99,-10.85,-57.39:99
-chr1 2765740 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=21.54;MQ=47.97;MQ0=0;OQ=288.34;QD=9.94;SB=-104.59 GT:AD:DP:GL:GQ 0/1:16,13:26:-39.95,-7.84,-58.99:99
-chr1 2765813 . A G 11.29 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=51.84;MQ0=0;OQ=780.70;QD=15.61;SB=-390.27 GT:AD:DP:GL:GQ 0/1:21,28:48:-95.81,-14.46,-83.37:99
-chr1 2765894 . A C 0.06 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=11.31;MQ=45.14;MQ0=0;OQ=337.42;QD=9.37;SB=-140.89 GT:AD:DP:GL:GQ 0/1:21,15:33:-46.96,-9.94,-71.34:99
-chr1 2765910 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=53;Dels=0.02;HRun=1;HaplotypeScore=33.31;MQ=38.51;MQ0=0;OQ=588.92;QD=11.11;SB=23.11 GT:AD:DP:GL:GQ 0/1:28,24:46:-75.73,-13.55,-102.75:99
-chr1 2765957 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=2;HaplotypeScore=176.91;MQ=27.98;MQ0=17;OQ=352.77;QD=3.12;SB=2.45 GT:AD:DP:GL:GQ 0/1:85,28:53:-54.54,-15.98,-142.28:99
-chr1 2765968 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=118.45;MQ=28.99;MQ0=17;OQ=151.04;QD=1.26;SB=-15.93 GT:AD:DP:GL:GQ 0/1:95,25:59:-36.17,-17.78,-173.10:99
-chr1 2765995 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=52.19;MQ=34.85;MQ0=7;OQ=128.24;QD=1.78;SB=-51.69 GT:AD:DP:GL:GQ 0/1:61,11:54:-32.38,-16.27,-203.82:99
-chr1 2765996 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=51.72;MQ=35.05;MQ0=7;OQ=180.10;QD=2.54;SB=-41.96 GT:AD:DP:GL:GQ 0/1:59,12:54:-37.57,-16.27,-158.22:99
-chr1 2766902 rs34376289 C T 393.03 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.48;MQ0=0;OQ=811.67;QD=17.64;SB=-367.51 GT:AD:DP:GL:GQ 0/1:20,26:45:-98.01,-13.56,-71.88:99
-chr1 2768626 rs10909992 C T 335.77 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.57;MQ0=0;OQ=811.02;QD=12.48;SB=-416.42 GT:AD:DP:GL:GQ 0/1:35,29:62:-103.08,-18.70,-112.11:99
-chr1 2768752 rs12409918 A C 74.45 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.55;MQ=59.57;MQ0=0;OQ=965.61;QD=17.88;SB=-402.66 GT:AD:DP:GL:GQ 0/1:20,34:50:-114.91,-15.06,-60.43:99
-chr1 2768903 rs12409348 T C 172.05 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.28;MQ=60.00;MQ0=0;OQ=398.89;QD=10.50;SB=-78.75 GT:AD:DP:GL:GQ 0/1:20,17:35:-53.71,-10.54,-80.33:99
-chr1 2769019 rs10909995 C G 17.82 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=58.48;MQ0=0;OQ=1462.05;QD=36.55;SB=-653.43 GT:AD:DP:GL:GQ 1/1:0,40:35:-149.81,-10.55,-0.02:99
-chr1 2769620 rs28600853 C T 67.23 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.53;MQ0=0;OQ=1091.29;QD=28.72;SB=-540.63 GT:AD:DP:GL:GQ 0/1:4,33:36:-123.26,-10.85,-13.62:27.66
-chr1 2769674 rs4648542 G A 90.82 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=51.80;MQ0=1;OQ=271.91;QD=9.71;SB=-148.61 GT:AD:DP:GL:GQ 0/1:13,15:21:-36.80,-6.33,-39.42:99
-chr1 2769679 rs28367217 C G 36.02 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=51.80;MQ0=1;OQ=209.26;QD=8.37;SB=2.04 GT:AD:DP:GL:GQ 0/1:15,10:18:-29.64,-5.43,-44.14:99
-chr1 2769692 rs28478242 A G 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=4;HaplotypeScore=0.82;MQ=53.88;MQ0=1;OQ=89.42;QD=4.26;SB=5.05 GT:AD:DP:GL:GQ 0/1:15,6:17:-17.35,-5.12,-46.13:99
-chr1 2769752 rs7542593 T C 75.28 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.77;MQ0=0;OQ=136.56;QD=6.21;SB=-67.76 GT:AD:DP:GL:GQ 0/1:10,12:17:-22.07,-5.13,-38.52:99
-chr1 2769805 rs4648543 T G 0.02 FDRtranche1.00to2.00 AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=4;HaplotypeScore=2.68;MQ=55.12;MQ0=0;OQ=754.89;QD=29.03;SB=-110.69 GT:AD:DP:GL:GQ 1/1:0,26:23:-79.08,-6.93,-0.01:69.18
-chr1 2770855 rs729178 T G 35.70 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=57.97;MQ0=0;OQ=332.17;QD=14.44;SB=-62.09 GT:AD:DP:GL:GQ 0/1:7,16:18:-41.92,-5.42,-18.71:99
-chr1 2770856 rs729177 T C 47.89 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=57.97;MQ0=0;OQ=319.36;QD=13.89;SB=-53.86 GT:AD:DP:GL:GQ 0/1:7,16:20:-41.25,-6.03,-26.63:99
-chr1 2772453 rs12119163 G A 585.03 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1388.32;QD=37.52;SB=-625.84 GT:AD:DP:GL:GQ 1/1:0,37:36:-142.43,-10.85,-0.01:99
-chr1 2772603 rs7551868 T C 19.40 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=3.77;MQ=58.92;MQ0=0;OQ=1140.34;QD=29.24;SB=-578.97 GT:AD:DP:GL:GQ 1/1:0,39:37:-117.66,-11.16,-0.04:99
-chr1 2772900 rs4648402 T C 156.21 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.00;MQ0=0;OQ=994.66;QD=28.42;SB=-468.49 GT:AD:DP:GL:GQ 1/1:0,35:33:-103.09,-9.96,-0.03:99
-chr1 2773675 rs12752112 G C 9.49 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.95;MQ0=0;OQ=859.11;QD=39.05;SB=-325.45 GT:AD:DP:GL:GQ 1/1:0,22:21:-89.50,-6.33,-0.01:63.21
-chr1 2776554 rs1563470 T C 23.92 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=60.00;MQ0=0;OQ=1838.24;QD=33.42;SB=-908.03 GT:AD:DP:GL:GQ 1/1:0,55:52:-187.42,-15.66,-0.02:99
-chr1 2777013 rs897616 C G 7.16 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=1.07;MQ=58.26;MQ0=0;OQ=1193.61;QD=34.10;SB=-446.20 GT:AD:DP:GL:GQ 1/1:0,35:30:-122.96,-9.05,-0.02:90.29
-chr1 2777567 rs897620 C G 317.44 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1920.95;QD=42.69;SB=-716.92 GT:AD:DP:GL:GQ 1/1:0,45:44:-195.69,-13.26,-0.01:99
-chr1 2778573 rs56273341 A G 89.85 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=1164.73;QD=29.12;SB=-590.57 GT:AD:DP:GL:GQ 1/1:0,40:37:-120.09,-11.16,-0.03:99
-chr1 2779035 rs12569164 T C 119.85 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=49.75;MQ0=0;OQ=1623.80;QD=28.49;SB=-755.66 GT:AD:DP:GL:GQ 1/1:0,57:53:-166.02,-15.99,-0.06:99
-chr1 2779347 . T C 140.90 Indel AC=1;AF=0.50;AN=2;DP=70;Dels=0.03;HRun=0;HaplotypeScore=53.64;MQ=31.59;MQ0=1;QD=2.01;SB=-93.61 GT:AD:DP:GL:GQ 0/1:59,9:55:-33.34,-15.96,-177.98:99
-chr1 2779357 rs55740077 T C 137.39 Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=61.84;MQ=29.83;MQ0=1;QD=1.99;SB=-25.89 GT:AD:DP:GL:GQ 0/1:28,41:15:-21.54,-4.52,-37.07:99
-chr1 2779361 rs55927204 T C 380.25 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=52.10;MQ=29.71;MQ0=1;QD=5.51;SB=-184.74 GT:AD:DP:GL:GQ 0/1:7,62:16:-46.13,-4.82,-12.60:77.76
-chr1 2779365 . T C 528.78 SnpCluster AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=50.77;MQ=30.92;MQ0=1;QD=7.24;SB=-289.59 GT:AD:DP:GL:GQ 0/1:6,67:20:-62.19,-6.02,-12.60:65.71
-chr1 2779369 . T C 809.75 SnpCluster AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=40.71;MQ=31.11;MQ0=1;QD=10.52;SB=-337.36 GT:AD:DP:GL:GQ 0/1:9,68:31:-93.60,-9.34,-19.91:99
-chr1 2779373 rs56012041 T C 260.44 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=37.08;MQ=32.24;MQ0=1;QD=3.38;SB=-116.63 GT:AD:DP:GL:GQ 0/1:28,49:21:-35.65,-6.33,-44.87:99
-chr1 2779421 rs5023660 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=3;HaplotypeScore=23.36;MQ=40.90;MQ0=1;OQ=1397.64;QD=21.18;SB=-647.72 GT:AD:DP:GL:GQ 0/1:24,41:55:-159.31,-16.27,-52.10:99
-chr1 2779423 rs56155638 T C 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=0;HaplotypeScore=20.03;MQ=40.90;MQ0=1;OQ=1243.01;QD=18.83;SB=-541.02 GT:AD:DP:GL:GQ 0/1:23,42:56:-144.15,-16.57,-59.53:99
-chr1 2779766 rs2124661 C G 42.55 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=49.71;MQ0=0;OQ=2767.03;QD=41.92;SB=-1222.51 GT:AD:DP:GL:GQ 1/1:0,66:63:-280.30,-18.98,-0.02:99
-chr1 2779832 rs2168531 C T 260.48 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=50.55;MQ0=0;OQ=2553.68;QD=38.69;SB=-1139.52 GT:AD:DP:GL:GQ 1/1:0,66:66:-258.98,-19.89,-0.03:99
-chr1 2780005 . G C 32.52 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=15.63;MQ=58.92;MQ0=0;QD=0.76;SB=44.18 GT:AD:DP:GL:GQ 0/1:33,10:29:-15.29,-8.76,-103.60:65.36
-chr1 2781003 rs10910023 C T 121.93 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.11;MQ0=0;OQ=1930.80;QD=37.13;SB=-708.95 GT:AD:DP:GL:GQ 1/1:0,52:49:-196.68,-14.76,-0.01:99
-chr1 2781813 rs12131393 C T 195.76 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=701.85;QD=13.76;SB=-265.19 GT:AD:DP:GL:GQ 0/1:28,23:44:-86.73,-13.26,-75.43:99
-chr1 2781975 rs12131450 C T 0.88 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=915.40;QD=20.80;SB=-418.48 GT:AD:DP:GL:GQ 0/1:17,27:44:-108.08,-13.26,-61.20:99
-chr1 2784004 rs10909791 C T 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=18.57;MQ=55.20;MQ0=0;OQ=554.87;QD=8.95;SB=-141.63 GT:AD:DP:GL:GQ 0/1:38,21:51:-74.16,-15.38,-99.65:99
-chr1 2784009 rs6673503 T C 0.75 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=15.72;MQ=55.44;MQ0=0;OQ=828.36;QD=14.04;SB=-284.66 GT:AD:DP:GL:GQ 0/1:19,40:49:-100.91,-14.79,-59.84:99
-chr1 2784113 rs6658584 G A 324.36 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=573.55;QD=11.95;SB=-252.51 GT:AD:DP:GL:GQ 0/1:29,19:42:-73.29,-12.65,-86.05:99
-chr1 2784397 rs6668620 C T 83.28 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.97;MQ0=0;OQ=989.63;QD=21.99;SB=-434.99 GT:AD:DP:GL:GQ 0/1:12,32:41:-114.60,-12.35,-43.77:99
-chr1 2784411 rs10909793 G T 285.59 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=987.49;QD=22.44;SB=-485.97 GT:AD:DP:GL:GQ 0/1:11,33:43:-114.99,-12.95,-39.80:99
-chr1 2785397 rs6679954 T C 177.95 PASS AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=57.39;MQ0=0;OQ=162.89;QD=9.05;SB=-99.99 GT:AD:DP:GL:GQ 0/1:9,8:15:-24.09,-4.52,-32.21:99
-chr1 2785861 rs10797340 G C 110.31 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=2067.39;QD=39.01;SB=-1035.13 GT:AD:DP:GL:GQ 1/1:0,53:49:-210.35,-14.77,-0.02:99
-chr1 2786415 rs10752722 A G 154.88 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.07;MQ0=0;OQ=1517.85;QD=30.36;SB=-724.72 GT:AD:DP:GL:GQ 1/1:0,50:49:-155.42,-14.78,-0.05:99
-chr1 2786479 rs4648406 T C 92.49 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.34;MQ0=0;OQ=883.04;QD=25.23;SB=-376.38 GT:AD:DP:GL:GQ 1/1:0,35:29:-91.92,-8.75,-0.03:87.18
-chr1 2787126 rs6424057 T G 92.26 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.46;MQ0=0;OQ=1311.97;QD=30.51;SB=-464.84 GT:AD:DP:GL:GQ 1/1:0,43:41:-134.82,-12.36,-0.04:99
-chr1 2787716 rs10797342 C T 575.89 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=717.10;QD=14.63;SB=-344.49 GT:AD:DP:GL:GQ 0/1:27,22:49:-89.77,-14.77,-84.62:99
-chr1 2788065 rs2124662 G C 9.64 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=5.21;MQ=57.80;MQ0=0;OQ=437.50;QD=13.67;SB=-215.17 GT:AD:DP:GL:GQ 0/1:15,17:26:-54.88,-7.85,-48.57:99
-chr1 2788136 rs1563472 G A 261.94 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.38;MQ0=0;OQ=469.47;QD=12.69;SB=-131.12 GT:AD:DP:GL:GQ 0/1:19,18:28:-58.68,-8.45,-41.51:99
-chr1 2788195 rs1563473 T G 178.79 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=57.45;MQ0=0;OQ=577.74;QD=12.56;SB=-216.84 GT:AD:DP:GL:GQ 0/1:19,27:43:-74.02,-12.96,-66.19:99
-chr1 2788317 rs1563474 G A 94.33 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=3.84;MQ=58.45;MQ0=0;OQ=661.75;QD=14.71;SB=-298.81 GT:AD:DP:GL:GQ 0/1:21,24:41:-81.83,-12.37,-60.24:99
-chr1 2788572 rs4373707 T C 44.63 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.22;MQ=58.97;MQ0=0;OQ=526.05;QD=11.69;SB=-185.63 GT:AD:DP:GL:GQ 0/1:22,23:42:-68.55,-12.66,-84.21:99
-chr1 2788907 rs2377038 A G 118.41 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.81;MQ=59.09;MQ0=0;OQ=482.56;QD=10.49;SB=-194.43 GT:AD:DP:GL:GQ 0/1:24,21:41:-63.90,-12.36,-79.61:99
-chr1 2789039 rs729965 G C 149.04 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=2442.19;QD=42.11;SB=-956.71 GT:AD:DP:GL:GQ 1/1:0,58:57:-247.82,-17.18,-0.02:99
-chr1 2789321 rs897629 T C 12.44 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=3.68;MQ=58.87;MQ0=0;OQ=1220.90;QD=29.78;SB=-560.89 GT:AD:DP:GL:GQ 1/1:0,40:39:-125.71,-11.76,-0.03:99
-chr1 2789340 rs11580768 C T 285.25 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.21;MQ=58.92;MQ0=0;OQ=699.84;QD=16.28;SB=-316.84 GT:AD:DP:GL:GQ 0/1:20,23:40:-85.33,-12.06,-59.14:99
-chr1 2789623 rs729419 G T 32.76 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=56.89;MQ0=0;OQ=1157.82;QD=30.47;SB=-604.54 GT:AD:DP:GL:GQ 1/1:0,38:33:-119.38,-9.94,-0.01:99
-chr1 2789978 rs4233022 T C 8.90 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.32;MQ0=0;OQ=1306.00;QD=33.49;SB=-393.50 GT:AD:DP:GL:GQ 1/1:0,38:38:-137.49,-14.36,-3.31:99
-chr1 2790214 rs61763695 G T 159.83 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.41;MQ0=0;OQ=678.47;QD=17.40;SB=-357.12 GT:AD:DP:GL:GQ 0/1:15,24:37:-82.28,-11.15,-45.69:99
-chr1 2790614 rs2061229 A G 424.36 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=1321.60;QD=28.73;SB=-492.17 GT:AD:DP:GL:GQ 1/1:0,46:43:-135.79,-12.97,-0.04:99
-chr1 2791688 rs4648429 A G 0.41 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.02;HRun=3;HaplotypeScore=3.60;MQ=59.05;MQ0=0;OQ=1300.58;QD=29.56;SB=-615.14 GT:AD:DP:GL:GQ 1/1:0,43:39:-133.67,-11.76,-0.03:99
-chr1 2791895 rs10737188 A G 0.06 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=11.58;MQ=57.39;MQ0=0;OQ=1158.45;QD=32.18;SB=-423.17 GT:AD:DP:GL:GQ 1/1:0,36:33:-119.44,-9.94,-0.01:99
-chr1 2791912 rs12127835 C T 0.23 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=15.40;MQ=57.73;MQ0=0;OQ=440.23;QD=14.20;SB=-189.24 GT:AD:DP:GL:GQ 0/1:15,16:28:-55.74,-8.44,-48.73:99
-chr1 2791917 rs12124890 G A 0.74 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=56.96;MQ0=0;OQ=462.23;QD=14.91;SB=-204.21 GT:AD:DP:GL:GQ 0/1:14,16:28:-57.95,-8.44,-40.79:99
-chr1 2792072 rs10752725 T C 491.80 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=1748.59;QD=30.68;SB=-570.96 GT:AD:DP:GL:GQ 1/1:0,57:55:-178.49,-16.59,-0.05:99
-chr1 2792208 rs7552943 A G 158.94 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.00;MQ0=0;OQ=672.02;QD=16.00;SB=-219.52 GT:AD:DP:GL:GQ 0/1:13,29:36:-81.33,-10.85,-44.36:99
-chr1 2792422 . G A 42.68 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.28;MQ0=0;OQ=1176.82;QD=18.39;SB=-377.70 GT:AD:DP:GL:GQ 0/1:28,36:64:-140.25,-19.29,-99.03:99
-chr1 2793407 rs3001793 G A 9.14 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=57.81;MQ0=0;OQ=925.83;QD=30.86;SB=-281.35 GT:AD:DP:GL:GQ 1/1:0,30:25:-96.18,-7.54,-0.02:75.22
-chr1 2793666 rs2377039 C T 77.79 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=60.00;MQ0=0;OQ=452.51;QD=18.10;SB=-252.58 GT:AD:DP:GL:GQ 0/1:10,15:20:-54.56,-6.03,-20.77:99
-chr1 2794138 rs3001794 C G 65.67 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=352.40;QD=13.05;SB=-39.43 GT:AD:DP:GL:GQ 0/1:15,12:26:-46.37,-7.84,-60.81:99
-chr1 2800878 rs2842928 T C 235.55 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=901.11;QD=33.37;SB=-249.77 GT:AD:DP:GL:GQ 1/1:0,27:26:-93.71,-7.83,-0.01:78.23
-chr1 2802104 rs10909834 G C 0.87 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=3;HaplotypeScore=3.91;MQ=59.36;MQ0=0;OQ=721.69;QD=20.05;SB=-360.48 GT:AD:DP:GL:GQ 0/1:15,21:32:-85.11,-9.65,-46.55:99
-chr1 2803334 rs10909835 C A 282.86 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.29;MQ0=0;OQ=1113.78;QD=16.14;SB=-524.88 GT:AD:DP:GL:GQ 0/1:32,37:69:-135.44,-20.78,-115.35:99
-chr1 2809215 . C A 24.19 LowQual AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=33.87;MQ0=3;QD=0.67;SB=-3.99 GT:AD:DP:GL:GQ 0/1:32,3:16:-10.52,-4.82,-48.73:57.01
-chr1 2812608 rs12091184 T C 225.17 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.35;MQ0=0;OQ=707.81;QD=11.06;SB=-307.08 GT:AD:DP:GL:GQ 0/1:33,31:62:-92.76,-18.69,-131.04:99
-chr1 2813319 rs12035436 G T 336.68 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.54;MQ0=0;OQ=779.74;QD=15.59;SB=-317.29 GT:AD:DP:GL:GQ 0/1:23,27:47:-95.42,-14.16,-69.60:99
-chr1 2815014 rs880724 C T 302.73 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=894.47;QD=16.56;SB=-357.16 GT:AD:DP:GL:GQ 0/1:25,29:52:-108.41,-15.68,-73.43:99
-chr1 2816229 rs34114281 G A 56.60 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.49;MQ0=0;OQ=818.99;QD=18.20;SB=-240.71 GT:AD:DP:GL:GQ 0/1:20,25:44:-98.44,-13.25,-71.30:99
-chr1 2816447 rs12738063 G A 183.56 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=436.36;QD=11.79;SB=-199.90 GT:AD:DP:GL:GQ 0/1:21,16:33:-56.87,-9.95,-58.54:99
-chr1 2819411 rs1869970 A G 323.79 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=58.68;MQ0=0;OQ=562.16;QD=12.22;SB=-263.95 GT:AD:DP:GL:GQ 0/1:23,23:46:-73.37,-13.87,-93.65:99
-chr1 2819722 rs10797359 G A 80.30 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=58.97;MQ0=0;OQ=661.62;QD=14.70;SB=-329.32 GT:AD:DP:GL:GQ 0/1:24,21:45:-83.00,-13.56,-85.88:99
-chr1 2819782 rs10797360 T C 62.98 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=58.11;MQ0=0;OQ=276.31;QD=7.47;SB=-143.57 GT:AD:DP:GL:GQ 0/1:22,15:35:-41.46,-10.55,-86.74:99
-chr1 2821229 rs2606408 T C 106.74 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=3.39;MQ=59.56;MQ0=0;OQ=598.54;QD=11.51;SB=-201.20 GT:AD:DP:GL:GQ 0/1:29,23:50:-78.20,-15.07,-111.31:99
-chr1 2821448 rs1563475 G T 119.77 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=513.38;QD=12.83;SB=-112.67 GT:AD:DP:GL:GQ 0/1:19,21:38:-66.07,-11.45,-67.04:99
-chr1 2821650 rs11590100 A G 136.28 PASS AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.60;MQ0=0;OQ=943.28;QD=10.14;SB=-480.61 GT:AD:DP:GL:GQ 0/1:51,42:88:-124.13,-26.52,-198.52:99
-chr1 2822111 rs3001796 T C 212.38 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=55.14;MQ0=0;OQ=802.13;QD=11.80;SB=-349.06 GT:AD:DP:GL:GQ 0/1:33,34:64:-102.79,-19.29,-127.57:99
-chr1 2822273 rs3001797 G A 0.27 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=14.80;MQ=58.82;MQ0=1;OQ=1009.61;QD=19.42;SB=-317.35 GT:AD:DP:GL:GQ 0/1:22,30:49:-119.01,-14.77,-60.02:99
-chr1 2822628 rs6696129 C T 18.64 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.89;MQ=57.91;MQ0=1;OQ=832.22;QD=14.35;SB=-326.29 GT:AD:DP:GL:GQ 0/1:32,26:55:-103.07,-16.57,-105.26:99
-chr1 2823020 rs1869971 C T 374.03 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=57.94;MQ0=0;OQ=535.79;QD=14.48;SB=-291.84 GT:AD:DP:GL:GQ 0/1:19,18:35:-67.42,-10.56,-54.80:99
-chr1 2823154 rs7339944 G A 129.22 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.45;MQ0=0;OQ=957.99;QD=19.16;SB=-392.16 GT:AD:DP:GL:GQ 0/1:19,31:48:-113.55,-14.46,-66.11:99
-chr1 2823192 rs7340016 A G 29.60 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.35;MQ=59.34;MQ0=0;OQ=422.29;QD=10.05;SB=-179.53 GT:AD:DP:GL:GQ 0/1:21,21:36:-56.37,-10.85,-73.83:99
-chr1 2823287 rs2124663 C T 42.06 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.59;MQ0=0;OQ=634.70;QD=14.10;SB=-71.85 GT:AD:DP:GL:GQ 0/1:24,21:45:-80.32,-13.56,-82.96:99
-chr1 2823310 rs1563466 T C 23.75 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.63;MQ=58.92;MQ0=0;OQ=514.85;QD=13.20;SB=-114.69 GT:AD:DP:GL:GQ 0/1:19,20:38:-66.22,-11.45,-76.59:99
-chr1 2823513 rs11587665 C T 40.96 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=6.13;MQ=59.14;MQ0=0;OQ=737.31;QD=13.65;SB=-373.35 GT:AD:DP:GL:GQ 0/1:29,25:51:-92.39,-15.38,-90.11:99
-chr1 2823603 rs1563468 T C 458.79 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.00;MQ0=0;OQ=947.27;QD=14.14;SB=-372.60 GT:AD:DP:GL:GQ 0/1:28,39:64:-117.31,-19.30,-107.37:99
-chr1 2823870 rs11809099 C T 295.64 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.56;MQ0=0;OQ=690.45;QD=13.28;SB=-256.23 GT:AD:DP:GL:GQ 0/1:28,23:49:-87.09,-14.76,-98.54:99
-chr1 2823885 rs2842926 G A 181.65 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.53;MQ0=0;OQ=786.09;QD=16.04;SB=-320.86 GT:AD:DP:GL:GQ 0/1:23,26:46:-95.76,-13.86,-71.19:99
-chr1 2825347 rs897633 A C 527.30 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=683.77;QD=14.86;SB=-280.84 GT:AD:DP:GL:GQ 0/1:21,25:45:-85.22,-13.56,-75.45:99
-chr1 2825552 rs897634 T C 95.40 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1172.99;QD=30.08;SB=-560.88 GT:AD:DP:GL:GQ 1/1:0,39:37:-120.91,-11.16,-0.03:99
-chr1 2825769 rs2606409 A G 32.95 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=5.74;MQ=57.77;MQ0=0;OQ=329.46;QD=7.84;SB=-164.95 GT:AD:DP:GL:GQ 0/1:25,16:40:-48.29,-12.06,-98.69:99
-chr1 2825959 rs2606410 C T 311.17 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=59.57;MQ0=0;OQ=951.03;QD=17.61;SB=-434.47 GT:AD:DP:GL:GQ 0/1:25,29:51:-113.75,-15.36,-82.67:99
-chr1 2827304 rs55855166 G A 337.28 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=391.24;QD=9.10;SB=-201.88 GT:AD:DP:GL:GQ 0/1:27,16:41:-54.76,-12.35,-93.92:99
-chr1 2828084 rs35844499 A C 0.13 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=8.95;MQ=33.58;MQ0=13;OQ=215.00;QD=4.89;SB=-66.98 GT:AD:DP:GL:GQ 0/1:23,20:16:-29.61,-4.82,-23.59:99
-chr1 2831038 . C T 212.41 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=614.63;QD=14.29;SB=-239.55 GT:AD:DP:GL:GQ 0/1:23,20:43:-77.70,-12.96,-79.28:99
-chr1 2833249 . C T 39.44 LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.90;MQ=56.74;MQ0=0;QD=1.36;SB=-41.03 GT:AD:DP:GL:GQ 0/1:24,4:19:-12.96,-5.74,-47.17:72.28
-chr1 2833472 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=11.49;MQ=58.05;MQ0=0;OQ=54.69;QD=1.52;SB=-45.69 GT:AD:DP:GL:GQ 0/1:28,8:19:-14.49,-5.74,-59.79:87.52
-chr1 2837348 rs2606411 T C 351.83 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=583.14;QD=14.58;SB=-128.66 GT:AD:DP:GL:GQ 0/1:14,26:36:-72.45,-10.85,-55.84:99
-chr1 2838116 rs35880479 G A 202.84 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=58.64;MQ0=0;OQ=848.27;QD=13.05;SB=-379.33 GT:AD:DP:GL:GQ 0/1:37,28:62:-106.79,-18.68,-116.44:99
-chr1 2844321 rs12120163 C T 361.45 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.44;MQ0=0;OQ=1226.99;QD=16.58;SB=-528.52 GT:AD:DP:GL:GQ 0/1:36,38:72:-147.69,-21.70,-111.75:99
-chr1 2849584 rs2842909 C T 85.45 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=5.45;MQ=57.20;MQ0=0;OQ=445.80;QD=10.87;SB=-188.84 GT:AD:DP:GL:GQ 0/1:22,19:36:-58.71,-10.85,-74.85:99
-chr1 2850791 rs2925499 C T 367.47 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.73;MQ0=0;OQ=1163.55;QD=17.11;SB=-509.17 GT:AD:DP:GL:GQ 0/1:33,35:67:-139.83,-20.19,-105.50:99
-chr1 2856184 . C T 37.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=14.17;MQ0=11;QD=1.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,10:4:-8.24,-1.21,-6.09:48.87
-chr1 2856380 rs3010827 T C 18.54 LowQual AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=21.91;MQ0=3;QD=0.66;SB=-6.99 GT:AD:DP:GL:GQ 0/1:20,8:5:-6.64,-1.51,-11.98:51.31
-chr1 2865080 rs2788089 G A 618.40 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2745.57;QD=39.79;SB=-1234.70 GT:AD:DP:GL:GQ 1/1:0,69:69:-278.16,-20.78,-0.02:99
-chr1 2866385 rs10909845 T C 68.38 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=1.49;MQ=58.86;MQ0=0;OQ=1786.40;QD=31.34;SB=-680.16 GT:AD:DP:GL:GQ 1/1:0,57:53:-182.25,-15.97,-0.03:99
-chr1 2866462 rs6663830 A G 10.39 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.42;MQ=57.19;MQ0=0;OQ=455.20;QD=23.96;SB=-149.73 GT:AD:DP:GL:GQ 1/1:1,18:16:-49.13,-4.83,-0.02:48.09
-chr1 2866480 rs12132266 C G 0.75 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=2;HaplotypeScore=2.31;MQ=54.22;MQ0=2;OQ=483.83;QD=32.26;SB=-138.40 GT:AD:DP:GL:GQ 1/1:2,13:12:-51.97,-3.62,-0.01:36.12
-chr1 2866511 rs12129394 G A 181.92 PASS AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.76;MQ0=0;OQ=82.01;QD=27.34;SB=-47.56 GT:AD:DP:GL:GQ 1/1:0,3:3:-11.69,-0.90,-0.00:9.03
-chr1 2866552 rs11582761 G A 15.30 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=47.10;MQ0=0;OQ=87.13;QD=17.43;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,4:3:-12.20,-0.90,-0.00:9.03
-chr1 2868226 rs11583804 G A 591.81 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=1019.85;QD=15.45;SB=-422.44 GT:AD:DP:GL:GQ 0/1:35,31:65:-124.85,-19.58,-125.50:99
-chr1 2872997 rs10909848 G T 338.03 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=59.67;MQ0=0;OQ=904.50;QD=15.87;SB=-468.05 GT:AD:DP:GL:GQ 0/1:25,32:54:-110.00,-16.27,-78.02:99
-chr1 2873890 . G C 11.21 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=4;HaplotypeScore=5.27;MQ=55.45;MQ0=0;QD=0.59;SB=14.08 GT:AD:DP:GL:GQ 0/1:10,9:11:-7.69,-3.32,-38.19:43.71
-chr1 2874116 rs2993507 T C 16.38 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=58.76;MQ0=0;OQ=1405.38;QD=31.23;SB=-680.25 GT:AD:DP:GL:GQ 1/1:0,45:40:-144.14,-12.05,-0.01:99
-chr1 2876216 rs2842925 A G 411.29 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1144.93;QD=30.13;SB=-502.20 GT:AD:DP:GL:GQ 1/1:0,38:36:-118.11,-10.86,-0.03:99
-chr1 2876326 rs12752801 C T 372.85 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.51;MQ0=0;OQ=555.75;QD=11.82;SB=-279.71 GT:AD:DP:GL:GQ 0/1:29,18:46:-72.72,-13.86,-94.69:99
-chr1 2876664 rs1104934 C T 153.01 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.11;MQ0=0;OQ=873.37;QD=18.58;SB=-376.40 GT:AD:DP:GL:GQ 0/1:19,28:45:-104.19,-13.57,-58.40:99
-chr1 2876848 rs4072769 G A 397.29 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.29;MQ0=0;OQ=569.53;QD=13.56;SB=-264.25 GT:AD:DP:GL:GQ 0/1:22,20:41:-72.60,-12.36,-71.89:99
-chr1 2877278 rs12731895 T A 88.65 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.47;MQ0=0;OQ=1142.36;QD=32.64;SB=-433.66 GT:AD:DP:GL:GQ 1/1:0,35:33:-117.84,-9.95,-0.02:99
-chr1 2877329 rs12727338 A G 1.05 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=6.87;MQ=57.26;MQ0=0;OQ=1138.52;QD=25.30;SB=-341.40 GT:AD:DP:GL:GQ 1/1:0,45:36:-117.47,-10.86,-0.03:99
-chr1 2877535 rs4648443 G C 93.54 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.43;MQ0=0;OQ=1023.89;QD=31.03;SB=-246.78 GT:AD:DP:GL:GQ 1/1:0,33:28:-106.01,-8.47,-0.04:84.26
-chr1 2878321 rs10797371 T C 561.61 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1137.37;QD=29.16;SB=-576.99 GT:AD:DP:GL:GQ 1/1:0,39:37:-117.36,-11.16,-0.04:99
-chr1 2878374 rs10797372 A G 151.87 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.80;MQ0=0;OQ=958.51;QD=27.39;SB=-485.14 GT:AD:DP:GL:GQ 1/1:0,35:31:-99.47,-9.35,-0.03:93.21
-chr1 2878478 rs57027760 G T 756.85 Indel AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=16.93;MQ=60.84;MQ0=0;QD=20.46;SB=-136.60 GT:AD:DP:GL:GQ 0/1:7,30:29:-87.69,-8.74,-9.78:10.36
-chr1 2879008 rs56619891 G A 46.74 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.68;MQ0=0;OQ=1774.48;QD=38.58;SB=-601.31 GT:AD:DP:GL:GQ 1/1:0,46:45:-181.04,-13.56,-0.01:99
-chr1 2879409 rs2495273 T A 230.62 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=58.81;MQ0=0;OQ=1962.54;QD=35.68;SB=-1002.53 GT:AD:DP:GL:GQ 1/1:0,55:54:-199.86,-16.27,-0.02:99
-chr1 2879437 rs12044030 C T 157.06 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=58.72;MQ0=0;OQ=1987.31;QD=38.97;SB=-989.84 GT:AD:DP:GL:GQ 1/1:0,51:51:-202.33,-15.37,-0.02:99
-chr1 2880205 rs4648445 G A 0.49 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=7.53;MQ=59.36;MQ0=0;OQ=1380.04;QD=38.33;SB=-528.20 GT:AD:DP:GL:GQ 1/1:1,35:35:-141.60,-10.54,-0.01:99
-chr1 2880574 rs4648446 C T 93.96 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=58.80;MQ0=0;OQ=2154.57;QD=37.15;SB=-942.74 GT:AD:DP:GL:GQ 1/1:0,58:56:-219.07,-16.88,-0.03:99
-chr1 2880814 rs35060945 G T 115.68 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.36;MQ0=0;OQ=1511.10;QD=32.85;SB=-647.26 GT:AD:DP:GL:GQ 1/1:0,46:43:-154.71,-12.95,-0.02:99
-chr1 2880975 rs9661752 C T 171.39 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=57.35;MQ0=0;OQ=1967.63;QD=36.44;SB=-881.18 GT:AD:DP:GL:GQ 1/1:0,54:51:-200.37,-15.37,-0.02:99
-chr1 2880988 rs35377179 C A 115.57 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=57.03;MQ0=0;OQ=1298.02;QD=29.50;SB=-650.95 GT:AD:DP:GL:GQ 1/1:1,43:37:-133.40,-11.15,-0.01:99
-chr1 2881030 . C A 0.40 PASS AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=54.52;MQ0=1;OQ=214.49;QD=8.25;SB=26.09 GT:AD:DP:GL:GQ 0/1:17,8:22:-34.34,-9.60,-47.09:99
-chr1 2881446 rs12046122 C A 164.77 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=56.73;MQ0=0;OQ=1555.86;QD=34.57;SB=-803.87 GT:AD:DP:GL:GQ 1/1:0,45:44:-159.18,-13.25,-0.01:99
-chr1 2881573 rs12046158 C T 78.52 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1075.02;QD=38.39;SB=-495.01 GT:AD:DP:GL:GQ 1/1:0,28:28:-111.09,-8.43,-0.01:84.27
-chr1 2882784 rs12096719 A G 679.62 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;OQ=1529.67;QD=33.99;SB=-756.19 GT:AD:DP:GL:GQ 1/1:0,45:44:-156.57,-13.25,-0.01:99
-chr1 2883117 rs34709641 C A 0.13 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=10.20;MQ=27.00;MQ0=0;OQ=541.23;QD=24.60;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,21:16:-57.72,-4.82,-0.01:48.13
-chr1 2883336 . T C 0.07 PASS AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=28.41;MQ0=1;OQ=55.83;QD=2.15;SB=35.13 GT:AD:DP:GL:GQ 0/1:19,7:19:-14.60,-5.73,-55.04:88.67
-chr1 2883474 . C T 16.42 PASS AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=19.09;MQ0=3;OQ=91.28;QD=9.13;SB=-10.00 GT:AD:DP:GL:GQ 1/1:6,3:4:-15.26,-3.77,-2.60:11.70
-chr1 2883529 . A G 32.82 LowQual AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=16.58;MQ0=2;QD=4.69;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:2:-6.69,-0.60,-0.00:6.01
-chr1 2883801 . G C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.62;MQ=34.13;MQ0=1;OQ=549.05;QD=22.88;SB=-205.68 GT:AD:DP:GL:GQ 0/1:3,21:17:-63.31,-5.13,-9.19:40.68
-chr1 2883821 . C G 1.10 PASS AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=22.36;MQ0=5;OQ=186.32;QD=8.47;SB=-39.88 GT:AD:DP:GL:GQ 0/1:7,15:10:-24.93,-3.02,-15.34:99
-chr1 2883940 . C G 0.08 PASS AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=7.32;MQ=24.85;MQ0=3;OQ=119.37;QD=7.02;SB=-3.99 GT:AD:DP:GL:GQ 0/1:4,13:7:-17.34,-2.12,-7.20:50.86
-chr1 2883991 . G A 9.80 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=39.91;MQ0=4;OQ=393.88;QD=7.16;SB=-196.17 GT:AD:DP:GL:GQ 0/1:36,19:38:-54.13,-11.46,-77.08:99
-chr1 2884111 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=5.45;MQ=48.57;MQ0=0;OQ=67.53;QD=1.73;SB=-58.84 GT:AD:DP:GL:GQ 0/1:29,10:26:-17.87,-7.84,-79.49:99
-chr1 2884204 . C G 13.82 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=48;Dels=0.02;HRun=0;HaplotypeScore=10.52;MQ=37.87;MQ0=5;QD=0.29;SB=17.09 GT:AD:DP:GL:GQ 0/1:44,3:31:-13.69,-9.05,-110.48:46.47
-chr1 2884224 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=7.14;MQ=33.65;MQ0=6;OQ=99.62;QD=2.69;SB=-73.89 GT:AD:DP:GL:GQ 0/1:22,14:21:-19.58,-6.34,-62.85:99
-chr1 2884275 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=8.64;MQ=43.29;MQ0=0;OQ=54.38;QD=1.36;SB=23.10 GT:AD:DP:GL:GQ 0/1:34,6:34:-18.98,-10.26,-119.97:87.22
-chr1 2884325 . G C 41.80 PASS AC=2;AF=1.00;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=49.14;MQ0=0;OQ=1253.36;QD=33.87;SB=-646.42 GT:AD:DP:GL:GQ 1/1:0,37:34:-128.97,-10.28,-0.05:99
-chr1 2885060 rs63721360 G T 452.04 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1106.85;QD=29.13;SB=-549.16 GT:AD:DP:GL:GQ 1/1:0,38:32:-114.28,-9.64,-0.01:96.27
-chr1 2885413 rs34183832 C T 53.59 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1297.32;QD=37.07;SB=-499.18 GT:AD:DP:GL:GQ 1/1:0,35:34:-133.33,-10.25,-0.01:99
-chr1 2885666 rs12746525 C T 345.32 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.87;MQ0=0;OQ=771.21;QD=35.05;SB=-307.40 GT:AD:DP:GL:GQ 1/1:0,22:21:-80.72,-6.33,-0.01:63.20
-chr1 2885725 rs12731464 G A 43.96 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.36;MQ0=0;OQ=1296.44;QD=36.01;SB=-473.63 GT:AD:DP:GL:GQ 1/1:0,36:34:-133.24,-10.25,-0.01:99
-chr1 2885912 rs12746985 C T 116.03 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.54;MQ0=0;OQ=1570.34;QD=38.30;SB=-739.01 GT:AD:DP:GL:GQ 1/1:0,40:40:-160.63,-12.05,-0.01:99
-chr1 2886057 rs12747179 C G 228.04 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1558.47;QD=39.96;SB=-692.89 GT:AD:DP:GL:GQ 1/1:0,39:37:-159.45,-11.15,-0.01:99
-chr1 2886368 rs7519674 G T 104.99 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=58.92;MQ0=0;OQ=1251.61;QD=32.09;SB=-486.26 GT:AD:DP:GL:GQ 1/1:0,39:37:-128.76,-11.15,-0.02:99
-chr1 2886595 rs7533362 A G 145.09 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=2108.67;QD=35.74;SB=-1026.73 GT:AD:DP:GL:GQ 1/1:0,59:59:-214.47,-17.77,-0.02:99
-chr1 2886944 rs10909849 A G 437.20 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=1258.82;QD=27.97;SB=-649.76 GT:AD:DP:GL:GQ 1/1:0,45:41:-129.52,-12.37,-0.05:99
-chr1 2886953 rs2788088 G A 571.84 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=615.00;QD=13.67;SB=-320.48 GT:AD:DP:GL:GQ 0/1:23,22:41:-77.15,-12.37,-67.43:99
-chr1 2887315 rs3001801 T C 293.49 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.55;MQ0=0;OQ=285.37;QD=12.41;SB=-113.63 GT:AD:DP:GL:GQ 0/1:11,12:22:-38.45,-6.63,-44.08:99
-chr1 2887325 rs2495272 A G 0.48 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=3;HaplotypeScore=1.25;MQ=56.85;MQ0=0;OQ=451.51;QD=25.08;SB=-251.59 GT:AD:DP:GL:GQ 1/1:0,18:15:-48.75,-4.52,-0.01:45.11
-chr1 2887439 . A G 0.37 PASS AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=3.88;MQ=55.21;MQ0=0;OQ=257.68;QD=9.20;SB=-92.00 GT:AD:DP:GL:GQ 0/1:17,11:26:-36.89,-7.84,-61.45:99
-chr1 2887454 . A G 0.28 PASS AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=2;HaplotypeScore=5.31;MQ=55.54;MQ0=0;OQ=380.48;QD=12.68;SB=-84.99 GT:AD:DP:GL:GQ 0/1:15,15:27:-49.47,-8.14,-52.46:99
-chr1 2887461 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=56.64;MQ0=0;OQ=82.14;QD=2.65;SB=-24.50 GT:AD:DP:GL:GQ 0/1:26,5:30:-20.54,-9.04,-87.21:99
-chr1 2887469 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=10.99;MQ=56.64;MQ0=0;OQ=56.39;QD=1.82;SB=-10.59 GT:AD:DP:GL:GQ 0/1:26,5:30:-17.96,-9.04,-99.17:89.23
-chr1 2887476 rs61763639 G A 1.06 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=10.80;MQ=56.85;MQ0=0;OQ=400.87;QD=12.15;SB=-209.95 GT:AD:DP:GL:GQ 0/1:19,13:29:-55.44,-12.07,-58.42:99
-chr1 2887567 rs61763640 G C 352.27 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=547.00;QD=15.63;SB=-239.40 GT:AD:DP:GL:GQ 0/1:19,16:35:-68.53,-10.55,-82.14:99
-chr1 2887764 rs35529252 C G 80.76 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=1.06;MQ=57.39;MQ0=0;OQ=226.67;QD=8.40;SB=2.03 GT:AD:DP:GL:GQ 0/1:18,9:23:-32.89,-6.94,-62.31:99
-chr1 2887828 rs56335850 C G 110.15 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=58.45;MQ0=0;OQ=748.06;QD=17.40;SB=-393.99 GT:AD:DP:GL:GQ 0/1:21,22:42:-90.75,-12.66,-91.15:99
-chr1 2888083 rs56195961 C T 7.84 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=60.00;MQ0=0;OQ=1112.19;QD=20.22;SB=-391.16 GT:AD:DP:GL:GQ 0/1:22,33:55:-131.08,-16.58,-71.48:99
-chr1 2888354 rs17391563 T C 531.46 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=612.67;QD=11.56;SB=-261.21 GT:AD:DP:GL:GQ 0/1:27,26:52:-80.22,-15.67,-108.53:99
-chr1 2888416 rs6681331 C T 397.61 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.62;MQ0=0;OQ=831.46;QD=13.63;SB=-416.81 GT:AD:DP:GL:GQ 0/1:34,27:59:-104.22,-17.79,-102.21:99
-chr1 2888820 rs6681741 C T 399.97 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=909.46;QD=13.78;SB=-406.91 GT:AD:DP:GL:GQ 0/1:37,29:64:-113.53,-19.30,-110.49:99
-chr1 2889209 rs12043738 C T 43 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=2.99;MQ=59.70;MQ0=0;OQ=782.92;QD=12.63;SB=-392.82 GT:AD:DP:GL:GQ 0/1:36,26:56:-98.47,-16.89,-96.75:99
-chr1 2889348 rs12046140 T C 210.74 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=58.78;MQ0=0;OQ=758.51;QD=11.67;SB=-309.09 GT:AD:DP:GL:GQ 0/1:33,31:62:-97.83,-18.69,-124.67:99
-chr1 2891988 rs1572657 C T 224.13 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=58.69;MQ0=0;OQ=1966.14;QD=39.32;SB=-982.30 GT:AD:DP:GL:GQ 1/1:0,50:49:-200.21,-14.76,-0.01:99
-chr1 2893019 rs16823303 A G 473.80 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1016.72;QD=15.17;SB=-513.96 GT:AD:DP:GL:GQ 0/1:31,36:67:-125.14,-20.19,-125.83:99
-chr1 2893437 rs4350139 T C 494.03 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=627.58;QD=13.35;SB=-219.43 GT:AD:DP:GL:GQ 0/1:23,24:46:-79.90,-13.86,-93.15:99
-chr1 2893916 rs10797373 G A 257.26 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.18;MQ=59.61;MQ0=0;OQ=845.53;QD=14.33;SB=-302.29 GT:AD:DP:GL:GQ 0/1:31,28:56:-104.72,-16.88,-95.11:99
-chr1 2895465 rs10909852 T C 196.72 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=59.46;MQ0=0;OQ=1273.07;QD=16.32;SB=-516.27 GT:AD:DP:GL:GQ 0/1:36,42:76:-153.48,-22.89,-141.76:99
-chr1 2897295 rs7546695 C A 472.44 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.44;MQ0=0;OQ=1069.83;QD=15.97;SB=-543.65 GT:AD:DP:GL:GQ 0/1:30,37:66:-130.15,-19.88,-106.29:99
-chr1 2897527 rs12411019 T C 97.34 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.42;MQ0=0;OQ=164.92;QD=5.15;SB=-60.30 GT:AD:DP:GL:GQ 0/1:21,11:29:-28.52,-8.74,-78.99:99
-chr1 2897840 rs58882615 A T 78.36 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.81;MQ0=0;OQ=696.78;QD=12.67;SB=-96.85 GT:AD:DP:GL:GQ 0/1:28,27:52:-88.62,-15.66,-107.99:99
-chr1 2897930 rs10909854 A G 302.68 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=59.44;MQ0=0;OQ=922.43;QD=11.25;SB=-327.10 GT:AD:DP:GL:GQ 0/1:45,37:81:-119.94,-24.41,-179.92:99
-chr1 2898248 rs10909855 C T 438.64 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.39;MQ0=0;OQ=1131.76;QD=16.40;SB=-432.83 GT:AD:DP:GL:GQ 0/1:34,35:68:-136.95,-20.49,-112.64:99
-chr1 2898666 . G A 72.98 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=60.00;MQ0=0;OQ=1136.24;QD=18.33;SB=-578.42 GT:AD:DP:GL:GQ 0/1:27,35:58:-134.38,-17.48,-83.03:99
-chr1 2898708 rs56000855 G T 262.99 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=393.56;QD=10.09;SB=-213.51 GT:AD:DP:GL:GQ 0/1:23,16:38:-54.09,-11.45,-79.61:99
-chr1 2899110 rs16823315 A G 251.56 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.58;MQ=58.82;MQ0=0;OQ=851.48;QD=14.43;SB=-403.32 GT:AD:DP:GL:GQ 0/1:28,31:58:-105.90,-17.47,-115.59:99
-chr1 2899231 rs17391750 G A 437.47 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=1161.97;QD=13.51;SB=-467.04 GT:AD:DP:GL:GQ 0/1:50,36:85:-145.10,-25.62,-160.28:99
-chr1 2899576 rs4335321 A G 105.18 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.00;MQ0=0;OQ=946.55;QD=13.52;SB=-144.87 GT:AD:DP:GL:GQ 0/1:37,33:68:-118.42,-20.48,-143.93:99
-chr1 2899597 . A T 1.69 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.60;MQ=57.30;MQ0=0;OQ=711.73;QD=11.67;SB=-108.79 GT:AD:DP:GL:GQ 0/1:34,27:58:-91.93,-17.47,-124.49:99
-chr1 2899698 . C A 3.06 PASS AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=964.27;QD=14.39;SB=-495.28 GT:AD:DP:GL:GQ 0/1:34,33:65:-119.29,-19.58,-112.82:99
-chr1 2899893 . T C 127.63 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.77;MQ=59.43;MQ0=0;OQ=700.47;QD=10.61;SB=-280.59 GT:AD:DP:GL:GQ 0/1:36,30:65:-92.92,-19.59,-144.88:99
-chr1 2900185 rs57720952 A G 235.22 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.13;MQ0=0;OQ=624.52;QD=11.78;SB=-194.60 GT:AD:DP:GL:GQ 0/1:27,26:53:-81.72,-15.98,-107.90:99
-chr1 2900204 rs58538272 A G 481.46 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=755.97;QD=13.50;SB=-350.98 GT:AD:DP:GL:GQ 0/1:26,30:55:-95.46,-16.58,-99.09:99
-chr1 2900256 rs60017523 T C 269.60 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.37;MQ0=0;OQ=740.61;QD=11.22;SB=-378.62 GT:AD:DP:GL:GQ 0/1:33,33:62:-96.04,-18.69,-126.33:99
-chr1 2901217 rs58445466 T C 331.41 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=47.93;MQ0=0;OQ=860.37;QD=15.36;SB=-212.50 GT:AD:DP:GL:GQ 0/1:26,30:54:-105.58,-16.26,-101.98:99
-chr1 2901454 rs56337009 G A 18.57 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.33;MQ0=1;OQ=975.13;QD=34.83;SB=-240.32 GT:AD:DP:GL:GQ 1/1:2,26:25:-101.11,-7.53,-0.01:75.24
-chr1 2902060 rs12022594 C T 230.71 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=53.29;MQ0=0;OQ=1320.21;QD=14.67;SB=-682.37 GT:AD:DP:GL:GQ 0/1:48,42:84:-160.62,-25.31,-148.07:99
-chr1 2902087 rs12059864 C T 220.44 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=55.08;MQ0=0;OQ=1120.96;QD=14.95;SB=-477.46 GT:AD:DP:GL:GQ 0/1:41,34:69:-136.16,-20.78,-131.24:99
-chr1 2902707 rs10909856 T C 237.57 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.08;MQ0=0;OQ=1121.38;QD=13.04;SB=-473.58 GT:AD:DP:GL:GQ 0/1:47,39:85:-141.02,-25.60,-190.53:99
-chr1 2902862 rs12401989 C A 536.26 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=929.32;QD=11.47;SB=-426.42 GT:AD:DP:GL:GQ 0/1:49,32:81:-120.61,-24.40,-176.66:99
-chr1 2903095 rs60435231 A G 179.93 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=59.67;MQ0=0;OQ=920.63;QD=13.15;SB=-378.56 GT:AD:DP:GL:GQ 0/1:39,31:70:-116.43,-21.08,-161.00:99
-chr1 2903159 rs59407673 T C 419.08 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=752.64;QD=11.07;SB=-260.51 GT:AD:DP:GL:GQ 0/1:41,27:66:-98.43,-19.88,-155.58:99
-chr1 2903756 . C T 100.01 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.38;MQ0=0;OQ=1160.57;QD=15.47;SB=-488.46 GT:AD:DP:GL:GQ 0/1:41,34:75:-141.93,-22.59,-152.72:99
-chr1 2903757 . C T 97.23 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.38;MQ0=0;OQ=1040.83;QD=14.07;SB=-405.37 GT:AD:DP:GL:GQ 0/1:41,33:72:-129.05,-21.68,-151.62:99
-chr1 2903785 . C T 13.14 PASS AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.97;MQ=59.68;MQ0=0;OQ=1201.38;QD=16.69;SB=-623.18 GT:AD:DP:GL:GQ 0/1:36,36:71:-144.81,-21.39,-125.25:99
-chr1 2904148 rs34909435 G C 261.36 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.06;MQ0=0;OQ=923.50;QD=16.20;SB=-375.83 GT:AD:DP:GL:GQ 0/1:30,27:56:-112.51,-16.88,-128.89:99
-chr1 2904478 rs34453862 G T 153.72 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.73;MQ=59.34;MQ0=0;OQ=843.87;QD=14.80;SB=-424.19 GT:AD:DP:GL:GQ 0/1:29,28:55:-104.24,-16.57,-85.73:99
-chr1 2904922 . G A 6.65 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=986.03;QD=18.26;SB=-298.76 GT:AD:DP:GL:GQ 0/1:24,30:53:-117.86,-15.97,-81.07:99
-chr1 2904988 . G T 192.75 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.69;MQ0=0;OQ=850.19;QD=14.17;SB=-430.19 GT:AD:DP:GL:GQ 0/1:30,30:56:-105.17,-16.87,-90.14:99
-chr1 2905123 rs12049173 C A 190.89 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.62;MQ0=0;OQ=810.47;QD=14.22;SB=-367.40 GT:AD:DP:GL:GQ 0/1:30,27:57:-101.50,-17.17,-107.52:99
-chr1 2905133 rs12046411 G A 347.03 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.57;MQ0=0;OQ=1037.17;QD=16.73;SB=-437.83 GT:AD:DP:GL:GQ 0/1:30,32:59:-124.78,-17.78,-92.83:99
-chr1 2905422 rs12049274 C T 603.53 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.95;MQ0=0;OQ=930.71;QD=16.05;SB=-490.47 GT:AD:DP:GL:GQ 0/1:30,28:58:-113.82,-17.47,-110.72:99
-chr1 2905744 . G A 180.07 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=873.90;QD=13.87;SB=-441.80 GT:AD:DP:GL:GQ 0/1:36,27:62:-109.35,-18.68,-126.71:99
-chr1 2905997 rs12239064 T G 232.27 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=59.60;MQ0=0;OQ=846.38;QD=14.85;SB=-338.82 GT:AD:DP:GL:GQ 0/1:27,30:56:-104.79,-16.87,-99.38:99
-chr1 2906020 rs12240128 G A 259.44 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=59.61;MQ0=0;OQ=950.01;QD=16.10;SB=-410.72 GT:AD:DP:GL:GQ 0/1:30,29:59:-116.06,-17.77,-109.83:99
-chr1 2906205 . C T 60.99 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=59.51;MQ0=0;OQ=509.22;QD=13.40;SB=-258.23 GT:AD:DP:GL:GQ 0/1:18,20:34:-64.46,-10.25,-58.74:99
-chr1 2906216 rs59653178 T C 119.56 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.26;MQ=59.54;MQ0=0;OQ=444.86;QD=10.85;SB=-210.25 GT:AD:DP:GL:GQ 0/1:22,19:37:-58.92,-11.15,-79.90:99
-chr1 2906318 . G C 294.79 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=687.54;QD=14.03;SB=-349.42 GT:AD:DP:GL:GQ 0/1:28,21:48:-86.50,-14.46,-122.06:99
-chr1 2906331 . T C 64.13 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=486.38;QD=9.01;SB=-239.89 GT:AD:DP:GL:GQ 0/1:34,20:53:-67.89,-15.97,-133.79:99
-chr1 2906530 rs16823325 A G 170.42 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=627.60;QD=14.26;SB=-219.26 GT:AD:DP:GL:GQ 0/1:22,22:44:-79.30,-13.26,-90.47:99
-chr1 2906541 rs57711454 A G 139.66 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.54;MQ0=0;OQ=394.78;QD=7.90;SB=-84.54 GT:AD:DP:GL:GQ 0/1:29,20:47:-56.93,-14.17,-116.48:99
-chr1 2906996 rs10909857 T C 66.55 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.62;MQ=57.79;MQ0=0;OQ=652.62;QD=12.31;SB=-287.16 GT:AD:DP:GL:GQ 0/1:27,26:51:-83.92,-15.38,-97.87:99
-chr1 2907051 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=17;HaplotypeScore=24.33;MQ=55.91;MQ0=0;OQ=72.31;QD=0.98;SB=54.68 GT:AD:DP:GL:GQ 0/1:56,17:51:-25.89,-15.37,-146.19:99
-chr1 2907237 rs12025260 T C 432.13 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.22;MQ0=0;OQ=586.66;QD=11.73;SB=-318.24 GT:AD:DP:GL:GQ 0/1:25,25:46:-75.82,-13.87,-89.45:99
-chr1 2907320 rs10797374 C G 183.78 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=56.79;MQ0=0;OQ=866.79;QD=16.35;SB=-401.99 GT:AD:DP:GL:GQ 0/1:26,27:47:-104.13,-14.17,-96.80:99
-chr1 2907323 rs10797375 C T 107.89 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=56.36;MQ0=0;OQ=897.14;QD=16.31;SB=-320.30 GT:AD:DP:GL:GQ 0/1:27,28:53:-108.97,-15.97,-91.39:99
-chr1 2907332 rs10797376 A G 569.46 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.97;MQ0=0;OQ=769.31;QD=13.26;SB=-314.20 GT:AD:DP:GL:GQ 0/1:28,30:54:-96.49,-16.28,-97.60:99
-chr1 2907425 rs17389607 C T 13.36 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=8.86;MQ=57.83;MQ0=0;OQ=822.69;QD=15.82;SB=-373.37 GT:AD:DP:GL:GQ 0/1:24,28:48:-100.02,-14.47,-70.94:99
-chr1 2907558 rs10909859 C T 467.69 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=759.55;QD=17.26;SB=-317.87 GT:AD:DP:GL:GQ 0/1:21,23:40:-91.30,-12.06,-54.32:99
-chr1 2907881 rs56008028 A G 101.20 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=60.00;MQ0=0;OQ=314.58;QD=9.83;SB=-73.78 GT:AD:DP:GL:GQ 0/1:16,16:27:-42.88,-8.14,-52.46:99
-chr1 2908045 rs12562237 C T 38.60 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=57.73;MQ0=0;OQ=402.69;QD=12.99;SB=-180.26 GT:AD:DP:GL:GQ 0/1:14,17:26:-51.39,-7.84,-42.83:99
-chr1 2908055 rs3924055 G A 76.12 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=57.57;MQ0=0;OQ=483.15;QD=16.66;SB=-242.76 GT:AD:DP:GL:GQ 0/1:13,16:26:-59.44,-7.84,-34.72:99
-chr1 2908089 rs16823330 C T 124.82 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.14;MQ0=0;OQ=508.46;QD=18.83;SB=-215.91 GT:AD:DP:GL:GQ 0/1:11,16:27:-62.27,-8.14,-34.10:99
-chr1 2908371 . G A 74.23 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.57;MQ0=0;OQ=788.94;QD=18.35;SB=-397.93 GT:AD:DP:GL:GQ 0/1:18,24:36:-93.03,-10.85,-43.26:99
-chr1 2908432 . T C 8.81 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=56.92;MQ0=0;OQ=358.32;QD=15.58;SB=-114.66 GT:AD:DP:GL:GQ 0/1:9,14:19:-44.84,-5.73,-23.69:99
-chr1 2908471 . G A 46.40 LowQual AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=4.79;MQ=51.77;MQ0=0;QD=1.93;SB=-32.97 GT:AD:DP:GL:GQ 0/1:20,4:22:-14.55,-6.63,-62.87:79.23
-chr1 2908486 . G A 26.78 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=53.95;MQ0=0;QD=1.12;SB=-23.58 GT:AD:DP:GL:GQ 0/1:21,3:20:-11.99,-6.02,-60.39:59.60
-chr1 2908487 . G A 23.81 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=53.95;MQ0=0;QD=0.99;SB=-23.59 GT:AD:DP:GL:GQ 0/1:21,3:20:-11.69,-6.03,-57.69:56.63
-chr1 2908489 rs7413322 A G 127.27 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=7.20;MQ=53.67;MQ0=0;QD=5.53;SB=-41.81 GT:AD:DP:GL:GQ 0/1:15,7:21:-22.34,-6.33,-53.28:99
-chr1 2908502 . G A 0.58 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.89;MQ=54.56;MQ0=0;OQ=132.59;QD=4.28;SB=-84.55 GT:AD:DP:GL:GQ 0/1:22,9:26:-24.37,-7.83,-71.82:99
-chr1 2908503 . G A 2.61 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.89;MQ=54.56;MQ0=0;OQ=189.68;QD=6.12;SB=-101.89 GT:AD:DP:GL:GQ 0/1:22,9:28:-30.69,-8.44,-70.32:99
-chr1 2908532 . T C 3.50 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.76;MQ=54.67;MQ0=0;OQ=250.55;QD=6.77;SB=-66.91 GT:AD:DP:GL:GQ 0/1:24,13:35:-38.89,-10.55,-92.28:99
-chr1 2908533 . G A 0.93 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.66;MQ=54.15;MQ0=0;OQ=217.08;QD=5.71;SB=-54.22 GT:AD:DP:GL:GQ 0/1:25,13:33:-34.93,-9.94,-84.25:99
-chr1 2908644 . G A 90.84 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.24;MQ=55.47;MQ0=0;OQ=799.27;QD=15.67;SB=-377.10 GT:AD:DP:GL:GQ 0/1:25,26:51:-98.58,-15.37,-88.82:99
-chr1 2908650 . T C 65.40 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=55.56;MQ0=0;OQ=744.55;QD=14.32;SB=-322.26 GT:AD:DP:GL:GQ 0/1:26,26:52:-93.41,-15.67,-101.68:99
-chr1 2908671 . T C 96.67 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=55.57;MQ0=0;OQ=663.38;QD=13.01;SB=-328.92 GT:AD:DP:GL:GQ 0/1:26,25:50:-84.69,-15.07,-101.18:99
-chr1 2908691 rs7524813 A G 287.06 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.53;MQ0=0;OQ=655.21;QD=13.10;SB=-352.07 GT:AD:DP:GL:GQ 0/1:22,28:47:-82.98,-14.17,-84.04:99
-chr1 2908767 . C T 11.79 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=50.29;MQ0=0;OQ=630.57;QD=18.02;SB=-203.89 GT:AD:DP:GL:GQ 0/1:14,21:32:-75.99,-9.65,-40.87:99
-chr1 2908798 rs7520336 C T 363.17 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=53.82;MQ0=0;OQ=459.08;QD=13.12;SB=-219.69 GT:AD:DP:GL:GQ 0/1:20,15:31:-58.54,-9.34,-53.07:99
-chr1 2909329 rs6424067 A G 0.51 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=3.24;MQ=54.59;MQ0=0;OQ=434.74;QD=9.88;SB=-243.29 GT:AD:DP:GL:GQ 0/1:26,18:41:-59.12,-12.36,-92.44:99
-chr1 2909490 rs12025062 C T 390.05 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.85;MQ0=0;OQ=616.92;QD=11.64;SB=-324.31 GT:AD:DP:GL:GQ 0/1:32,21:52:-80.64,-15.67,-112.78:99
-chr1 2909802 rs12022429 G A 318.87 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=605.69;QD=12.36;SB=-271.15 GT:AD:DP:GL:GQ 0/1:27,22:47:-78.02,-14.16,-93.88:99
-chr1 2909879 rs12025167 C T 200.91 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=58.32;MQ0=0;OQ=594.51;QD=15.24;SB=-283.81 GT:AD:DP:GL:GQ 0/1:20,19:35:-73.29,-10.56,-48.45:99
-chr1 2909902 rs12022456 G A 164.15 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.51;MQ=58.51;MQ0=0;OQ=722.60;QD=16.42;SB=-335.48 GT:AD:DP:GL:GQ 0/1:20,24:41:-87.91,-12.37,-56.64:99
-chr1 2910018 rs16823332 C T 243.36 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=942.08;QD=19.23;SB=-418.46 GT:AD:DP:GL:GQ 0/1:20,28:45:-111.06,-13.56,-54.54:99
-chr1 2910291 rs12066017 A G 366.01 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=575.67;QD=14.76;SB=-270.53 GT:AD:DP:GL:GQ 0/1:19,20:38:-72.30,-11.45,-69.20:99
-chr1 2911142 . G A 41.67 PASS AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.51;MQ=59.36;MQ0=0;OQ=1099.50;QD=16.92;SB=-501.68 GT:AD:DP:GL:GQ 0/1:32,33:61:-131.61,-18.38,-102.89:99
-chr1 2911277 . C G 44.53 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.86;MQ=58.95;MQ0=0;OQ=436.44;QD=10.91;SB=-233.06 GT:AD:DP:GL:GQ 0/1:26,14:40:-58.99,-12.06,-109.38:99
-chr1 2911306 . G C 234.71 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.10;MQ0=0;OQ=519.44;QD=14.04;SB=-251.08 GT:AD:DP:GL:GQ 0/1:21,16:36:-66.08,-10.85,-90.14:99
-chr1 2911720 rs16823335 G A 261.73 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.20;MQ0=0;OQ=681.92;QD=11.76;SB=-297.82 GT:AD:DP:GL:GQ 0/1:33,24:53:-87.45,-15.98,-100.90:99
-chr1 2912187 rs12028094 C T 355.65 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.31;MQ0=0;OQ=839.47;QD=15.55;SB=-427.81 GT:AD:DP:GL:GQ 0/1:28,26:51:-102.60,-15.37,-81.01:99
-chr1 2912604 rs10797377 G A 324.39 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=59.31;MQ0=0;OQ=1121.19;QD=18.38;SB=-566.38 GT:AD:DP:GL:GQ 0/1:27,34:59:-133.18,-17.78,-89.26:99
-chr1 2913061 . G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=14.44;MQ=58.67;MQ0=0;OQ=1557.84;QD=18.11;SB=-803.34 GT:AD:DP:GL:GQ 0/1:39,47:82:-183.77,-24.70,-131.16:99
-chr1 2913244 rs12063869 T A 356.59 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.21;MQ0=0;OQ=1259.24;QD=16.35;SB=-327.01 GT:AD:DP:GL:GQ 0/1:37,40:76:-152.10,-22.89,-141.13:99
-chr1 2913685 . T A 78.15 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=72;Dels=0.01;HRun=7;HaplotypeScore=10.99;MQ=58.04;MQ0=0;QD=1.09;SB=89.27 GT:AD:DP:GL:GQ 0/1:54,17:56:-27.67,-16.57,-168.58:99
-chr1 2914586 rs2889476 T C 86.82 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.50;MQ0=0;OQ=1018.41;QD=13.58;SB=-348.57 GT:AD:DP:GL:GQ 0/1:38,37:73:-127.11,-21.99,-156.39:99
-chr1 2915216 . C A 133.06 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=840.99;QD=15.57;SB=-328.03 GT:AD:DP:GL:GQ 0/1:26,28:54:-103.65,-16.27,-91.36:99
-chr1 2915282 rs946175 A G 382.87 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.34;MQ0=0;OQ=951.27;QD=13.59;SB=-404.30 GT:AD:DP:GL:GQ 0/1:37,33:69:-119.20,-20.78,-144.79:99
-chr1 2915357 rs946176 C T 193.41 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=60.00;MQ0=0;OQ=877.87;QD=15.14;SB=-352.31 GT:AD:DP:GL:GQ 0/1:30,28:58:-108.55,-17.48,-106.40:99
-chr1 2915382 rs946177 A G 311.86 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=696.00;QD=12.21;SB=-254.19 GT:AD:DP:GL:GQ 0/1:29,28:55:-89.46,-16.58,-112.38:99
-chr1 2916239 rs2027262 T C 443.46 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=530.92;QD=9.65;SB=-168.92 GT:AD:DP:GL:GQ 0/1:28,27:51:-71.75,-15.38,-111.87:99
-chr1 2916397 rs2027263 A G 6.58 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=4.33;MQ=58.92;MQ0=0;OQ=1007.60;QD=17.99;SB=-520.31 GT:AD:DP:GL:GQ 0/1:22,34:54:-120.31,-16.27,-82.47:99
-chr1 2916415 rs2027264 G A 412.83 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=890.12;QD=17.45;SB=-464.45 GT:AD:DP:GL:GQ 0/1:23,27:49:-107.06,-14.77,-75.59:99
-chr1 2916645 . C T 34.34 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=56.98;MQ0=0;OQ=878.75;QD=16.90;SB=-242.23 GT:AD:DP:GL:GQ 0/1:24,28:50:-106.23,-15.07,-83.70:99
-chr1 2916833 rs11802804 T G 172.47 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=53.08;MQ0=1;OQ=929.71;QD=12.91;SB=-466.74 GT:AD:DP:GL:GQ 0/1:38,34:69:-117.04,-20.78,-128.73:99
-chr1 2916871 . T G 0.62 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=5.93;MQ=46.04;MQ0=1;OQ=612.93;QD=10.57;SB=-101.87 GT:AD:DP:GL:GQ 0/1:33,25:54:-80.84,-16.27,-108.92:99
-chr1 2916874 . G A 4.25 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.93;MQ=45.85;MQ0=1;OQ=812.26;QD=13.32;SB=-234.49 GT:AD:DP:GL:GQ 0/1:33,28:56:-101.38,-16.87,-110.18:99
-chr1 2917035 rs12028439 A G 6.74 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=4.28;MQ=54.23;MQ0=0;OQ=1040.90;QD=18.93;SB=-369.97 GT:AD:DP:GL:GQ 0/1:20,35:53:-123.34,-15.97,-76.66:99
-chr1 2917114 rs12024879 G A 187.61 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=55.08;MQ0=0;OQ=934.32;QD=17.30;SB=-362.51 GT:AD:DP:GL:GQ 0/1:25,29:52:-112.38,-15.67,-83.45:99
-chr1 2917331 rs12027818 C T 143.12 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=58.15;MQ0=1;OQ=1252.97;QD=20.21;SB=-536.07 GT:AD:DP:GL:GQ 0/1:25,37:61:-146.97,-18.38,-79.78:99
-chr1 2917538 rs12027883 C T 346.92 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=58.55;MQ0=0;OQ=1081.24;QD=14.42;SB=-345.82 GT:AD:DP:GL:GQ 0/1:42,33:74:-133.70,-22.29,-151.25:99
-chr1 2918836 rs6681651 C T 64.93 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=454.13;QD=15.66;SB=-29.51 GT:AD:DP:GL:GQ 0/1:13,16:27:-56.83,-8.14,-47.37:99
-chr1 2921187 rs6691208 C A 92.06 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=715.52;QD=11.36;SB=-355.27 GT:AD:DP:GL:GQ 0/1:37,26:61:-93.21,-18.38,-116.36:99
-chr1 2921274 rs4357486 G C 320.40 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=59.45;MQ0=0;OQ=673.44;QD=16.03;SB=-361.79 GT:AD:DP:GL:GQ 0/1:20,22:41:-83.00,-12.37,-84.03:99
-chr1 2921300 rs4486390 C T 182.10 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.96;MQ=59.45;MQ0=0;OQ=737.41;QD=17.56;SB=-360.43 GT:AD:DP:GL:GQ 0/1:18,24:38:-88.48,-11.46,-48.81:99
-chr1 2922007 rs59869348 T C 59.62 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.22;MQ=59.22;MQ0=0;OQ=864.59;QD=16.01;SB=-414.28 GT:AD:DP:GL:GQ 0/1:23,31:52:-105.41,-15.67,-90.49:99
-chr1 2922076 rs59041920 C T 58.92 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=4.59;MQ=59.36;MQ0=0;OQ=1222.53;QD=18.81;SB=-446.93 GT:AD:DP:GL:GQ 0/1:26,38:58:-143.01,-17.47,-78.18:99
-chr1 2922420 . C T 142.55 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.20;MQ0=0;OQ=828.62;QD=13.81;SB=-355.45 GT:AD:DP:GL:GQ 0/1:34,26:58:-103.62,-17.47,-119.28:99
-chr1 2922927 . A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=1;HaplotypeScore=3.70;MQ=45.44;MQ0=1;OQ=81.65;QD=2.92;SB=-41.94 GT:AD:DP:GL:GQ 0/1:20,8:20:-17.47,-6.02,-59.35:99
-chr1 2923073 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=21;Dels=0.05;HRun=1;HaplotypeScore=30.97;MQ=45.34;MQ0=0;OQ=111.92;QD=5.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,8:13:-18.39,-3.92,-26.21:99
-chr1 2923110 . A C 47.42 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=28.91;MQ=36.30;MQ0=0;QD=3.65;SB=5.05 GT:AD:DP:GL:GQ 0/1:6,4:10:-13.77,-5.74,-26.81:80.25
-chr1 2923762 rs6680573 C G 6.28 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=60.00;MQ0=0;OQ=313.93;QD=10.46;SB=-109.66 GT:AD:DP:GL:GQ 0/1:20,10:28:-43.13,-8.46,-67.50:99
-chr1 2924595 rs56200661 C T 138.23 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.81;MQ0=0;OQ=702.85;QD=18.02;SB=-315.84 GT:AD:DP:GL:GQ 0/1:17,22:37:-84.72,-11.16,-50.65:99
-chr1 2924706 . G A 66.14 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.09;MQ0=0;OQ=681.79;QD=16.63;SB=-295.78 GT:AD:DP:GL:GQ 0/1:19,22:39:-83.22,-11.75,-60.51:99
-chr1 2926246 rs12564456 C G 10.43 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=2.61;MQ=58.69;MQ0=0;OQ=646.12;QD=12.92;SB=-206.63 GT:AD:DP:GL:GQ 0/1:26,24:45:-81.49,-13.60,-94.41:99
-chr1 2926340 rs10752732 T C 133.80 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=58.78;MQ0=0;OQ=1282.63;QD=33.75;SB=-620.25 GT:AD:DP:GL:GQ 1/1:0,38:38:-131.87,-11.45,-0.02:99
-chr1 2926606 rs55949537 A T 46.15 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=59.67;MQ0=0;OQ=1017.41;QD=14.13;SB=-469.52 GT:AD:DP:GL:GQ 0/1:36,35:69:-125.81,-20.79,-130.04:99
-chr1 2926614 rs55784203 G T 254.87 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=59.65;MQ0=0;OQ=972.92;QD=14.31;SB=-412.15 GT:AD:DP:GL:GQ 0/1:33,35:66:-120.46,-19.89,-108.03:99
-chr1 2926663 rs56091202 A G 268.72 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=59.60;MQ0=0;OQ=738.64;QD=12.74;SB=-307.21 GT:AD:DP:GL:GQ 0/1:29,29:57:-94.32,-17.18,-112.23:99
-chr1 2926891 . A G 0.34 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=3;HaplotypeScore=3.44;MQ=59.42;MQ0=0;OQ=538.71;QD=11.22;SB=-143.63 GT:AD:DP:GL:GQ 0/1:27,21:47:-71.31,-14.16,-109.92:99
-chr1 2927088 rs61266721 G A 167.43 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=59.23;MQ0=0;OQ=1016.77;QD=16.95;SB=-453.45 GT:AD:DP:GL:GQ 0/1:30,30:57:-122.14,-17.18,-86.53:99
-chr1 2927410 rs12033927 A G 358.86 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.13;MQ0=0;OQ=706.05;QD=14.71;SB=-368.25 GT:AD:DP:GL:GQ 0/1:23,25:48:-88.35,-14.46,-94.54:99
-chr1 2927411 rs12034794 T G 337.44 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.15;MQ0=0;OQ=614.57;QD=12.54;SB=-294.80 GT:AD:DP:GL:GQ 0/1:24,25:47:-78.90,-14.16,-89.23:99
-chr1 2928125 rs4576609 C T 277.54 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=57.60;MQ0=0;OQ=875.52;QD=14.35;SB=-423.82 GT:AD:DP:GL:GQ 0/1:31,30:59:-108.62,-17.78,-98.44:99
-chr1 2928429 rs35806103 C T 10.78 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=59.80;MQ0=0;OQ=886.08;QD=19.69;SB=-315.84 GT:AD:DP:GL:GQ 0/1:17,27:42:-104.54,-12.65,-59.38:99
-chr1 2928557 rs3795262 T G 88 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.78;MQ0=0;OQ=296.95;QD=7.81;SB=-58.83 GT:AD:DP:GL:GQ 0/1:21,17:33:-42.92,-9.94,-74.02:99
-chr1 2928784 . T G 4.50 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.61;MQ=58.98;MQ0=0;OQ=615.11;QD=15.00;SB=-301.85 GT:AD:DP:GL:GQ 0/1:17,24:38:-76.24,-11.45,-59.09:99
-chr1 2929872 rs55873718 A G 218.87 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.73;MQ0=0;OQ=845.74;QD=10.07;SB=-404.66 GT:AD:DP:GL:GQ 0/1:48,36:83:-112.88,-25.02,-189.40:99
-chr1 2930858 rs56176404 A G 226.80 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.44;MQ0=0;OQ=1022.49;QD=13.82;SB=-491.10 GT:AD:DP:GL:GQ 0/1:38,36:73:-127.52,-21.99,-154.69:99
-chr1 2932289 rs55885250 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.04;HRun=0;HaplotypeScore=32.21;MQ=45.88;MQ0=1;OQ=148.06;QD=1.90;SB=104.37 GT:AD:DP:GL:GQ 0/1:58,16:68:-38.29,-20.20,-216.63:99
-chr1 2932299 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=92;Dels=0.02;HRun=0;HaplotypeScore=97.52;MQ=43.85;MQ0=0;OQ=59.90;QD=0.65;SB=104.31 GT:AD:DP:GL:GQ 0/1:78,12:69:-29.77,-20.49,-208.32:92.74
-chr1 2932325 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=91;Dels=0.02;HRun=1;HaplotypeScore=195.32;MQ=42.40;MQ0=0;OQ=612.63;QD=6.73;SB=-162.19 GT:AD:DP:GL:GQ 0/1:51,38:73:-86.24,-21.70,-183.14:99
-chr1 2932341 . A G 250.48 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=1;HaplotypeScore=40.55;MQ=40.81;MQ0=0;QD=2.04;SB=89.32 GT:AD:DP:GL:GQ 0/1:96,27:107:-60.57,-32.24,-364.33:99
-chr1 2932343 . G A 487.06 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=123;Dels=0.01;HRun=0;HaplotypeScore=44.00;MQ=40.81;MQ0=0;QD=3.96;SB=58.75 GT:AD:DP:GL:GQ 0/1:99,23:108:-84.22,-32.23,-314.56:99
-chr1 2932349 . G A 708.07 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=1;HaplotypeScore=35.72;MQ=40.62;MQ0=0;QD=5.80;SB=89.29 GT:AD:DP:GL:GQ 0/1:95,27:119:-109.94,-35.84,-335.64:99
-chr1 2932354 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=77.99;MQ=40.25;MQ0=0;OQ=691.65;QD=5.49;SB=86.28 GT:AD:DP:GL:GQ 0/1:97,29:123:-109.51,-37.06,-349.27:99
-chr1 2932376 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=2;HaplotypeScore=11.36;MQ=39.42;MQ0=0;OQ=679.31;QD=5.27;SB=92.31 GT:AD:DP:GL:GQ 0/1:96,32:117:-106.47,-35.26,-303.35:99
-chr1 2932379 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=125;Dels=0.01;HRun=1;HaplotypeScore=36.27;MQ=39.15;MQ0=0;OQ=716.76;QD=5.73;SB=92.27 GT:AD:DP:GL:GQ 0/1:94,28:121:-111.11,-36.16,-333.12:99
-chr1 2932387 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=36.67;MQ=38.20;MQ0=0;OQ=140.95;QD=1.25;SB=77.24 GT:AD:DP:GL:GQ 0/1:93,19:101:-47.83,-30.45,-304.67:99
-chr1 2932417 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=80.35;MQ=36.74;MQ0=0;OQ=291.45;QD=2.83;SB=86.26 GT:AD:DP:GL:GQ 0/1:76,27:77:-55.63,-23.21,-217.09:99
-chr1 2932437 . G A 14.74 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=80.96;MQ=35.05;MQ0=0;QD=0.16;SB=80.26 GT:AD:DP:GL:GQ 0/1:79,12:67:-24.93,-20.19,-214.14:47.43
-chr1 2932441 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=78.31;MQ=34.28;MQ0=0;OQ=251.61;QD=2.83;SB=77.24 GT:AD:DP:GL:GQ 0/1:70,19:66:-48.33,-19.89,-185.59:99
-chr1 2932450 rs55992205 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=52.98;MQ=32.53;MQ0=0;OQ=616.18;QD=7.16;SB=92.26 GT:AD:DP:GL:GQ 0/1:64,22:76:-87.80,-22.90,-186.06:99
-chr1 2932474 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=98;Dels=0.05;HRun=0;HaplotypeScore=121.87;MQ=31.47;MQ0=0;OQ=770.86;QD=7.87;SB=104.31 GT:AD:DP:GL:GQ 0/1:66,27:80:-104.48,-24.11,-189.46:99
-chr1 2932495 . A G 458.76 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=1;HaplotypeScore=104.10;MQ=35.05;MQ0=0;QD=4.59;SB=98.32 GT:AD:DP:GL:GQ 0/1:77,23:78:-72.67,-23.51,-220.09:99
-chr1 2932498 . G A 771.99 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=85.95;MQ=35.28;MQ0=0;QD=8.04;SB=59.63 GT:AD:DP:GL:GQ 0/1:70,26:76:-103.38,-22.90,-174.72:99
-chr1 2932501 . G A 15.55 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=78.10;MQ=36.15;MQ0=0;QD=0.16;SB=-7.88 GT:AD:DP:GL:GQ 0/1:82,13:64:-24.12,-19.29,-198.59:48.26
-chr1 2932516 . A G 437.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=2;HaplotypeScore=90.55;MQ=38.01;MQ0=0;QD=4.37;SB=68.24 GT:AD:DP:GL:GQ 0/1:78,20:76:-69.30,-22.30,-207.20:99
-chr1 2932519 . A G 420.64 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=1;HaplotypeScore=127.72;MQ=37.64;MQ0=1;QD=3.72;SB=86.29 GT:AD:DP:GL:GQ 0/1:90,23:88:-71.87,-26.52,-261.50:99
-chr1 2932522 . A G 354.05 SnpCluster AC=1;AF=0.50;AN=2;DP=116;Dels=0.02;HRun=1;HaplotypeScore=155.74;MQ=37.22;MQ0=2;QD=3.05;SB=-178.30 GT:AD:DP:GL:GQ 0/1:89,24:100:-68.22,-29.53,-308.19:99
-chr1 2932531 . G A 40.28 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=127;Dels=0.02;HRun=0;HaplotypeScore=95.96;MQ=37.07;MQ0=3;QD=0.32;SB=-35.75 GT:AD:DP:GL:GQ 0/1:114,11:85:-32.32,-25.01,-255.84:73.11
-chr1 2932543 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=0;HaplotypeScore=90.42;MQ=36.51;MQ0=3;OQ=448.17;QD=3.59;SB=-29.75 GT:AD:DP:GL:GQ 0/1:94,23:99:-91.60,-43.50,-272.82:99
-chr1 2932549 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=106.24;MQ=36.58;MQ0=3;OQ=776.41;QD=6.81;SB=20.21 GT:AD:DP:GL:GQ 0/1:80,34:91:-108.36,-27.43,-223.52:99
-chr1 2932558 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=87.01;MQ=36.91;MQ0=2;OQ=55.94;QD=0.53;SB=50.16 GT:AD:DP:GL:GQ 0/1:89,16:77:-32.08,-23.20,-238.58:88.78
-chr1 2932594 . A G 95.90 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=101;Dels=0.01;HRun=2;HaplotypeScore=79.79;MQ=37.41;MQ0=0;QD=0.95;SB=41.16 GT:AD:DP:GL:GQ 0/1:85,15:78:-36.37,-23.50,-267.93:99
-chr1 2932595 . G T 858.77 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.01;HRun=0;HaplotypeScore=92.92;MQ=37.56;MQ0=0;QD=8.67;SB=50.17 GT:AD:DP:GL:GQ 0/1:57,41:82:-113.86,-24.70,-181.24:99
-chr1 2932597 . A G 613.75 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=100;Dels=0.01;HRun=2;HaplotypeScore=83.48;MQ=37.85;MQ0=0;QD=6.14;SB=53.19 GT:AD:DP:GL:GQ 0/1:69,29:84:-89.97,-25.31,-224.02:99
-chr1 2932647 . A G 424.25 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=36.34;MQ=40.26;MQ0=1;QD=3.82;SB=65.23 GT:AD:DP:GL:GQ 0/1:87,24:95:-74.33,-28.62,-285.65:99
-chr1 2932650 . G A 15.47 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=0;HaplotypeScore=35.26;MQ=39.92;MQ0=1;QD=0.13;SB=83.21 GT:AD:DP:GL:GQ 0/1:106,9:104:-36.16,-31.34,-318.46:48.18
-chr1 2932656 . G A 597.61 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=0;HaplotypeScore=41.23;MQ=39.70;MQ0=1;QD=5.24;SB=83.24 GT:AD:DP:GL:GQ 0/1:85,29:104:-94.39,-31.34,-268.84:99
-chr1 2932671 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=1;HaplotypeScore=55.64;MQ=38.11;MQ0=1;OQ=790.23;QD=6.17;SB=74.25 GT:AD:DP:GL:GQ 0/1:94,34:113:-116.34,-34.04,-292.03:99
-chr1 2932680 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=32.69;MQ=37.68;MQ0=1;OQ=1237.37;QD=9.67;SB=74.20 GT:AD:DP:GL:GQ 0/1:85,43:122:-163.79,-36.76,-270.86:99
-chr1 2932682 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=0;HaplotypeScore=26.80;MQ=37.61;MQ0=1;OQ=704.94;QD=5.42;SB=71.27 GT:AD:DP:GL:GQ 0/1:103,27:122:-110.54,-36.77,-411.49:99
-chr1 2932721 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=0;HaplotypeScore=36.50;MQ=39.93;MQ0=0;OQ=181.45;QD=1.51;SB=92.30 GT:AD:DP:GL:GQ 0/1:93,27:104:-52.76,-31.33,-321.47:99
-chr1 2932727 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=27.86;MQ=40.16;MQ0=0;OQ=588.52;QD=5.35;SB=83.30 GT:AD:DP:GL:GQ 0/1:83,27:109:-94.97,-32.83,-329.92:99
-chr1 2932738 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=1;HaplotypeScore=39.11;MQ=39.53;MQ0=0;OQ=873.00;QD=7.94;SB=74.25 GT:AD:DP:GL:GQ 0/1:74,36:108:-123.12,-32.54,-289.99:99
-chr1 2932769 . G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=7.13;MQ=40.78;MQ0=0;OQ=619.13;QD=6.59;SB=56.17 GT:AD:DP:GL:GQ 0/1:71,23:91:-92.61,-27.42,-231.77:99
-chr1 2933043 rs7412983 A C 563.74 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=861.61;QD=12.67;SB=-438.69 GT:AD:DP:GL:GQ 0/1:37,31:65:-109.02,-19.58,-126.93:99
-chr1 2933258 rs58265521 C A 261.91 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.67;MQ0=0;OQ=928.26;QD=16.29;SB=-439.21 GT:AD:DP:GL:GQ 0/1:24,33:53:-112.08,-15.97,-65.68:99
-chr1 2933528 rs60287244 A G 23.05 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=7.04;MQ=58.03;MQ0=0;OQ=739.69;QD=12.98;SB=-372.23 GT:AD:DP:GL:GQ 0/1:30,27:55:-93.82,-16.57,-116.71:99
-chr1 2933898 rs12034766 A G 35.30 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=1.69;MQ=58.27;MQ0=0;OQ=600.73;QD=11.12;SB=-275.56 GT:AD:DP:GL:GQ 0/1:26,28:51:-78.73,-15.38,-104.98:99
-chr1 2933946 rs12033401 C T 155.60 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.82;MQ=57.46;MQ0=0;OQ=525.20;QD=14.19;SB=-282.22 GT:AD:DP:GL:GQ 0/1:16,21:31:-65.15,-9.35,-44.32:99
-chr1 2934531 rs57893585 T A 124.36 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.24;MQ0=0;OQ=372.99;QD=15.54;SB=-168.83 GT:AD:DP:GL:GQ 0/1:10,14:21:-46.91,-6.33,-28.06:99
-chr1 2935764 rs12035292 C T 0.26 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=43.51;MQ0=2;OQ=248.84;QD=4.70;SB=-149.59 GT:AD:DP:GL:GQ 0/1:30,23:31:-37.51,-9.34,-74.68:99
-chr1 2935800 rs6693975 G A 0.65 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.49;MQ=45.50;MQ0=1;OQ=189.85;QD=4.75;SB=-111.56 GT:AD:DP:GL:GQ 0/1:24,16:23:-29.21,-6.94,-45.54:99
-chr1 2935836 rs6693982 G A 38.33 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.48;MQ=49.72;MQ0=2;OQ=286.18;QD=6.36;SB=-139.13 GT:AD:DP:GL:GQ 0/1:25,20:29:-40.65,-8.75,-58.79:99
-chr1 2936586 rs12038530 T A 386.33 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=538.23;QD=11.21;SB=-193.51 GT:AD:DP:GL:GQ 0/1:29,19:46:-70.96,-13.86,-104.56:99
-chr1 2937616 rs12037307 C A 453.51 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=785.06;QD=15.10;SB=-326.01 GT:AD:DP:GL:GQ 0/1:25,27:52:-97.46,-15.67,-88.48:99
-chr1 2937769 rs12039548 T C 374.78 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.69;MQ=59.62;MQ0=0;OQ=1018.45;QD=16.97;SB=-485.32 GT:AD:DP:GL:GQ 0/1:25,35:58:-122.60,-17.48,-90.45:99
-chr1 2937880 rs12034573 G A 539.50 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=601.18;QD=13.36;SB=-263.26 GT:AD:DP:GL:GQ 0/1:25,20:44:-76.67,-13.27,-77.09:99
-chr1 2938038 rs10909864 T C 31.93 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=3.17;MQ=58.15;MQ0=0;OQ=603.85;QD=12.58;SB=-301.61 GT:AD:DP:GL:GQ 0/1:20,28:44:-76.94,-13.27,-79.42:99
-chr1 2938888 rs1890338 C T 331.53 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=59.50;MQ0=0;OQ=622.92;QD=13.54;SB=-315.86 GT:AD:DP:GL:GQ 0/1:22,23:40:-77.64,-12.06,-61.98:99
-chr1 2939215 rs12039132 C T 18.71 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=58.67;MQ0=0;OQ=590.59;QD=16.87;SB=-94.60 GT:AD:DP:GL:GQ 0/1:16,19:32:-71.99,-9.65,-41.59:99
-chr1 2939467 rs7514166 G C 161.11 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=58.11;MQ0=0;OQ=380.76;QD=10.29;SB=-57.73 GT:AD:DP:GL:GQ 0/1:23,14:34:-51.61,-10.25,-87.39:99
-chr1 2939859 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=9;HaplotypeScore=3.75;MQ=51.46;MQ0=0;OQ=333.21;QD=11.49;SB=-54.83 GT:AD:DP:GL:GQ 0/1:17,12:25:-44.15,-7.55,-58.82:99
-chr1 2939927 rs34408665 T C 431.23 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.91;MQ0=0;OQ=752.79;QD=11.76;SB=-348.05 GT:AD:DP:GL:GQ 0/1:32,32:61:-96.95,-18.39,-123.70:99
-chr1 2939954 rs58052947 T C 258.56 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=58.84;MQ0=0;OQ=891.02;QD=13.92;SB=-428.88 GT:AD:DP:GL:GQ 0/1:28,36:63:-111.38,-19.00,-108.25:99
-chr1 2940097 rs56398543 G A 185.44 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=57.77;MQ0=0;OQ=622.10;QD=14.81;SB=-266.78 GT:AD:DP:GL:GQ 0/1:21,21:40:-77.55,-12.06,-68.06:99
-chr1 2940194 rs6661908 G A 424.22 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.03;MQ0=0;OQ=1140.17;QD=20.00;SB=-442.95 GT:AD:DP:GL:GQ 0/1:24,33:57:-134.47,-17.17,-86.30:99
-chr1 2940230 rs41334845 G T 113.62 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=1373.67;QD=21.13;SB=-590.07 GT:AD:DP:GL:GQ 0/1:21,44:63:-159.63,-18.98,-64.63:99
-chr1 2940454 rs6679678 T C 216.89 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=522.35;QD=9.16;SB=-250.32 GT:AD:DP:GL:GQ 0/1:31,26:48:-69.99,-14.47,-101.54:99
-chr1 2940732 rs12042403 T C 312.83 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=888.06;QD=12.51;SB=-433.91 GT:AD:DP:GL:GQ 0/1:39,32:70:-113.18,-21.09,-157.81:99
-chr1 2940746 rs12041583 A G 452.19 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=809.95;QD=12.27;SB=-418.24 GT:AD:DP:GL:GQ 0/1:35,31:63:-103.26,-18.98,-134.35:99
-chr1 2940894 rs12041634 A T 208.26 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=886.35;QD=14.77;SB=-371.51 GT:AD:DP:GL:GQ 0/1:30,30:60:-110.00,-18.08,-114.34:99
-chr1 2940901 rs12040299 C T 487.76 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=953.57;QD=15.63;SB=-409.79 GT:AD:DP:GL:GQ 0/1:31,30:60:-116.73,-18.09,-97.56:99
-chr1 2941104 rs10489589 T C 232.05 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.67;MQ0=0;OQ=498.13;QD=8.90;SB=-202.46 GT:AD:DP:GL:GQ 0/1:33,23:54:-69.37,-16.27,-132.36:99
-chr1 2941207 . G A 104.13 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.25;MQ0=0;OQ=904.38;QD=16.15;SB=-378.12 GT:AD:DP:GL:GQ 0/1:27,29:55:-110.29,-16.57,-94.24:99
-chr1 2941209 . T C 102.69 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.25;MQ0=0;OQ=663.66;QD=11.85;SB=-280.62 GT:AD:DP:GL:GQ 0/1:26,30:53:-85.63,-15.98,-103.85:99
-chr1 2941371 rs12408197 C T 428.36 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=717.16;QD=12.36;SB=-246.23 GT:AD:DP:GL:GQ 0/1:33,25:52:-90.68,-15.68,-91.34:99
-chr1 2941666 . T C 142.44 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.70;MQ0=0;OQ=433.61;QD=8.50;SB=-223.24 GT:AD:DP:GL:GQ 0/1:30,21:49:-61.42,-14.77,-117.95:99
-chr1 2941694 rs10489588 G A 184.48 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.01;MQ=58.17;MQ0=0;OQ=458.21;QD=8.98;SB=-152.21 GT:AD:DP:GL:GQ 0/1:34,17:47:-63.28,-14.17,-98.47:99
-chr1 2941849 . C T 36.18 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=59.44;MQ0=0;OQ=1385.60;QD=18.72;SB=-578.48 GT:AD:DP:GL:GQ 0/1:29,44:70:-162.94,-21.10,-91.88:99
-chr1 2942163 rs2017600 A C 566.08 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2376.48;QD=32.55;SB=-930.21 GT:AD:DP:GL:GQ 1/1:0,72:69:-241.26,-20.78,-0.03:99
-chr1 2942474 rs1005471 T C 5.22 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=441.09;QD=10.02;SB=-191.58 GT:AD:DP:GL:GQ 0/1:27,17:44:-60.65,-13.26,-106.56:99
-chr1 2942683 rs9660819 C T 0.66 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=5.17;MQ=58.20;MQ0=0;OQ=155.13;QD=5.97;SB=-65.81 GT:AD:DP:GL:GQ 0/1:19,7:24:-26.03,-7.23,-63.04:99
-chr1 2942700 rs9661525 T G 36.57 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.11;MQ0=0;OQ=126.09;QD=4.85;SB=-19.97 GT:AD:DP:GL:GQ 0/1:19,7:25:-23.42,-7.53,-64.66:99
-chr1 2943003 . G A 0.16 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.14;MQ0=0;OQ=556.71;QD=20.62;SB=-180.72 GT:AD:DP:GL:GQ 0/1:10,17:27:-67.10,-8.14,-31.23:99
-chr1 2943693 rs16823392 C G 180.70 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.22;MQ=57.09;MQ0=0;OQ=626.82;QD=16.07;SB=-312.19 GT:AD:DP:GL:GQ 0/1:21,18:38:-77.42,-11.46,-83.70:99
-chr1 2943891 . A G 12.02 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=54.82;MQ0=0;OQ=422.22;QD=8.28;SB=-205.52 GT:AD:DP:GL:GQ 0/1:33,18:49:-60.27,-14.76,-127.83:99
-chr1 2943911 . C T 10.41 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=52.84;MQ0=0;QD=0.25;SB=11.05 GT:AD:DP:GL:GQ 0/1:24,17:24:-11.53,-7.24,-65.03:42.84
-chr1 2943915 . A G 396.79 SnpCluster AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=1.74;MQ=53.20;MQ0=0;QD=9.23;SB=-114.71 GT:AD:DP:GL:GQ 0/1:25,18:39:-54.71,-11.75,-89.79:99
-chr1 2943921 . G A 412.53 SnpCluster AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.30;MQ0=0;QD=10.31;SB=-110.52 GT:AD:DP:GL:GQ 0/1:23,17:37:-55.69,-11.15,-76.61:99
-chr1 2943983 . T C 18.12 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.49;MQ=57.65;MQ0=0;OQ=359.40;QD=9.46;SB=-125.65 GT:AD:DP:GL:GQ 0/1:21,17:36:-50.07,-10.85,-82.05:99
-chr1 2944025 . C T 103.45 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.94;MQ0=0;OQ=634.89;QD=13.23;SB=-327.90 GT:AD:DP:GL:GQ 0/1:27,21:45:-80.34,-13.56,-81.81:99
-chr1 2944063 . C T 0.51 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=4;HaplotypeScore=2.62;MQ=59.46;MQ0=0;OQ=776.27;QD=15.22;SB=-389.17 GT:AD:DP:GL:GQ 0/1:26,25:47:-95.07,-14.16,-76.30:99
-chr1 2944068 . G A 119.57 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=59.46;MQ0=0;OQ=782.48;QD=15.34;SB=-373.90 GT:AD:DP:GL:GQ 0/1:25,26:49:-96.29,-14.76,-89.91:99
-chr1 2944090 . T C 3.70 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.56;MQ=59.48;MQ0=0;OQ=656.17;QD=12.38;SB=-215.36 GT:AD:DP:GL:GQ 0/1:27,26:49:-83.67,-14.77,-97.10:99
-chr1 2944157 . T C 29.83 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.30;MQ0=0;OQ=936.38;QD=15.61;SB=-205.50 GT:AD:DP:GL:GQ 0/1:27,33:58:-114.40,-17.47,-101.34:99
-chr1 2944208 rs4996810 A C 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=56.26;MQ0=1;OQ=219.14;QD=3.48;SB=-132.81 GT:AD:DP:GL:GQ 0/1:47,15:56:-42.07,-16.87,-150.42:99
-chr1 2944226 . G A 136.97 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.40;MQ0=1;OQ=501.67;QD=8.36;SB=-261.69 GT:AD:DP:GL:GQ 0/1:41,19:55:-70.03,-16.58,-122.86:99
-chr1 2944238 . T C 5.54 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=54.51;MQ0=0;OQ=327.91;QD=6.43;SB=-156.50 GT:AD:DP:GL:GQ 0/1:37,14:48:-50.53,-14.46,-136.22:99
-chr1 2944239 . T C 1.08 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=4.23;MQ=54.83;MQ0=0;OQ=279.86;QD=5.18;SB=-104.43 GT:AD:DP:GL:GQ 0/1:40,14:49:-46.04,-14.77,-139.11:99
-chr1 2945018 rs12036378 G A 163.77 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.58;MQ0=0;OQ=895.36;QD=16.28;SB=-275.78 GT:AD:DP:GL:GQ 0/1:27,28:53:-108.80,-15.98,-79.65:99
-chr1 2945105 rs55863899 C G 134.28 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.52;MQ0=0;OQ=868.77;QD=18.10;SB=-284.96 GT:AD:DP:GL:GQ 0/1:21,27:46:-104.04,-13.88,-85.12:99
-chr1 2945790 . A G 4.08 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=57.28;MQ0=0;OQ=318.97;QD=15.19;SB=-83.80 GT:AD:DP:GL:GQ 0/1:8,13:20:-41.21,-6.03,-32.48:99
-chr1 2946023 rs10909865 A G 147.02 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.15;MQ=60.00;MQ0=0;OQ=547.73;QD=10.74;SB=-195.64 GT:AD:DP:GL:GQ 0/1:24,27:47:-72.23,-14.17,-93.16:99
-chr1 2946442 . A G 66.31 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=798.37;QD=10.79;SB=-385.01 GT:AD:DP:GL:GQ 0/1:39,35:70:-104.22,-21.10,-152.02:99
-chr1 2946526 rs2993510 T C 256.19 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.44;MQ0=0;OQ=807.53;QD=9.73;SB=-328.89 GT:AD:DP:GL:GQ 0/1:47,36:81:-108.45,-24.41,-191.18:99
-chr1 2946859 rs12567620 T G 251.94 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.22;MQ0=0;OQ=588.28;QD=9.97;SB=-221.33 GT:AD:DP:GL:GQ 0/1:35,23:57:-79.28,-17.17,-127.60:99
-chr1 2947460 rs12409277 T C 554.91 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1261.63;QD=14.67;SB=-598.55 GT:AD:DP:GL:GQ 0/1:39,47:86:-155.36,-25.92,-158.90:99
-chr1 2948421 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=83;Dels=0.02;HRun=17;HaplotypeScore=13.52;MQ=50.26;MQ0=0;OQ=57.24;QD=0.69;SB=67.75 GT:AD:DP:GL:GQ 0/1:69,12:60:-26.49,-17.48,-170.55:90.07
-chr1 2948568 rs12044162 A G 115.23 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.63;MQ0=0;OQ=498.67;QD=9.23;SB=-105.58 GT:AD:DP:GL:GQ 0/1:33,21:52:-68.82,-15.67,-126.86:99
-chr1 2949062 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=21.05;MQ=49.42;MQ0=0;OQ=103.70;QD=2.53;SB=-31.97 GT:AD:DP:GL:GQ 0/1:35,6:34:-23.91,-10.25,-88.62:99
-chr1 2949076 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=103.01;MQ=49.60;MQ0=0;OQ=345.15;QD=7.50;SB=-146.53 GT:AD:DP:GL:GQ 0/1:33,13:40:-49.87,-12.07,-111.45:99
-chr1 2949080 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=47.15;MQ=49.74;MQ0=0;OQ=115.37;QD=2.35;SB=-79.50 GT:AD:DP:GL:GQ 0/1:37,11:45:-31.37,-16.54,-140.93:99
-chr1 2949088 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=39.37;MQ=50.39;MQ0=0;OQ=395.27;QD=7.60;SB=-176.85 GT:AD:DP:GL:GQ 0/1:38,14:46:-56.68,-13.87,-100.52:99
-chr1 2949107 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.13;MQ=51.92;MQ0=0;OQ=58.43;QD=0.96;SB=-33.78 GT:AD:DP:GL:GQ 0/1:53,8:55:-25.70,-16.57,-188.08:91.26
-chr1 2949470 rs6692292 T C 310.38 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=58.36;MQ0=0;OQ=1146.89;QD=15.93;SB=-322.30 GT:AD:DP:GL:GQ 0/1:33,39:71:-139.36,-21.39,-132.11:99
-chr1 2949881 rs56213325 G A 8.56 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=3.87;MQ=58.97;MQ0=0;OQ=1032.99;QD=16.40;SB=-387.12 GT:AD:DP:GL:GQ 0/1:30,33:61:-124.96,-18.37,-109.42:99
-chr1 2950052 rs12045368 A G 278.87 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=53.32;MQ0=0;OQ=936.38;QD=14.41;SB=-275.26 GT:AD:DP:GL:GQ 0/1:28,37:62:-115.61,-18.69,-106.66:99
-chr1 2950232 rs10909866 C T 182.72 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.68;MQ0=0;OQ=969.99;QD=15.90;SB=-309.81 GT:AD:DP:GL:GQ 0/1:32,29:61:-118.67,-18.38,-109.12:99
-chr1 2950468 rs12046233 A G 39.17 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.71;MQ=59.23;MQ0=0;OQ=754.54;QD=12.58;SB=-279.44 GT:AD:DP:GL:GQ 0/1:30,30:55:-95.31,-16.57,-110.00:99
-chr1 2950650 rs12044848 C T 194.31 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.52;MQ0=0;OQ=784.81;QD=16.35;SB=-285.29 GT:AD:DP:GL:GQ 0/1:24,24:47:-95.92,-14.16,-84.23:99
-chr1 2950883 . C A 3.38 PASS AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=60.00;MQ0=0;OQ=1395.15;QD=16.81;SB=-283.26 GT:AD:DP:GL:GQ 0/1:36,46:82:-170.17,-27.37,-127.09:99
-chr1 2951230 rs56088946 T C 7.58 PASS AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.61;MQ0=0;OQ=1944.95;QD=16.34;SB=-964.49 GT:AD:DP:GL:GQ 0/1:53,66:118:-233.32,-35.54,-213.54:99
-chr1 2951262 rs10909867 G T 333.68 PASS AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.76;MQ0=0;OQ=1581.91;QD=16.48;SB=-612.08 GT:AD:DP:GL:GQ 0/1:44,52:95:-190.09,-28.61,-155.75:99
-chr1 2952067 rs10909868 A C 183.71 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=60.00;MQ0=0;OQ=929.11;QD=14.75;SB=-149.21 GT:AD:DP:GL:GQ 0/1:29,34:62:-114.87,-18.67,-108.28:99
-chr1 2952085 rs12048975 T C 158.31 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=956.32;QD=14.94;SB=-180.58 GT:AD:DP:GL:GQ 0/1:30,34:62:-117.59,-18.68,-121.18:99
-chr1 2952452 rs2981859 G A 525.66 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2597.04;QD=39.95;SB=-874.18 GT:AD:DP:GL:GQ 1/1:0,65:65:-263.30,-19.58,-0.02:99
-chr1 2953353 rs7339938 G C 184.28 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1644.05;QD=21.35;SB=-832.89 GT:AD:DP:GL:GQ 0/1:34,43:75:-190.30,-22.61,-128.08:99
-chr1 2954257 rs12044831 A C 328.96 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.75;MQ0=0;OQ=969.03;QD=12.75;SB=-480.26 GT:AD:DP:GL:GQ 0/1:35,41:74:-122.48,-22.29,-132.71:99
-chr1 2956899 rs2993479 A T 39.42 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=7.90;MQ=58.88;MQ0=0;OQ=639.75;QD=11.85;SB=-334.02 GT:AD:DP:GL:GQ 0/1:32,22:53:-83.22,-15.96,-119.83:99
-chr1 2958839 . C T 167.01 PASS AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.03;MQ0=0;OQ=1118.18;QD=16.69;SB=-463.99 GT:AD:DP:GL:GQ 0/1:31,36:62:-133.80,-18.70,-86.01:99
-chr1 2958843 . G C 98.75 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=58.98;MQ0=0;OQ=1122.63;QD=17.54;SB=-409.32 GT:AD:DP:GL:GQ 0/1:29,34:58:-133.03,-17.49,-113.54:99
-chr1 2960143 rs56298939 A T 308.60 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.67;MQ0=0;OQ=788.46;QD=14.08;SB=-295.64 GT:AD:DP:GL:GQ 0/1:29,27:56:-99.00,-16.87,-109.64:99
-chr1 2960324 rs717795 T C 9.89 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=2.74;MQ=59.13;MQ0=0;OQ=443.35;QD=8.37;SB=-240.88 GT:AD:DP:GL:GQ 0/1:32,21:49:-62.39,-14.77,-120.82:99
-chr1 2961312 rs56069604 T C 18.15 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.73;MQ=58.64;MQ0=0;OQ=450.45;QD=14.53;SB=-212.67 GT:AD:DP:GL:GQ 0/1:13,18:29:-57.07,-8.74,-51.18:99
-chr1 2961381 rs2981857 T C 166.54 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=60.00;MQ0=0;OQ=428.10;QD=15.29;SB=-207.68 GT:AD:DP:GL:GQ 0/1:10,18:28:-54.54,-8.45,-38.77:99
-chr1 2962384 rs2981856 T C 282.12 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=862.73;QD=12.32;SB=-362.96 GT:AD:DP:GL:GQ 0/1:34,36:67:-109.75,-20.19,-134.76:99
-chr1 2963182 rs2993480 C T 393.42 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=959.18;QD=15.72;SB=-400.92 GT:AD:DP:GL:GQ 0/1:31,30:60:-117.29,-18.09,-96.43:99
-chr1 2963293 rs2993481 A T 141.58 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.01;MQ=59.62;MQ0=0;OQ=743.23;QD=12.39;SB=-349.56 GT:AD:DP:GL:GQ 0/1:34,26:58:-95.08,-17.48,-119.69:99
-chr1 2963436 rs1109251 G A 197.81 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=1.34;MQ=60.00;MQ0=0;OQ=932.59;QD=15.04;SB=-469.42 GT:AD:DP:GL:GQ 0/1:34,28:62:-115.22,-18.68,-120.45:99
-chr1 2963924 . A G 132.32 PASS AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.54;MQ0=0;OQ=1229.61;QD=13.51;SB=-579.93 GT:AD:DP:GL:GQ 0/1:47,44:90:-153.35,-27.11,-189.83:99
-chr1 2964602 rs1125017 A C 413.02 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=773.70;QD=11.90;SB=-364.77 GT:AD:DP:GL:GQ 0/1:35,30:63:-99.63,-18.98,-121.64:99
-chr1 2964712 rs2376821 T C 458.38 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2329.60;QD=30.25;SB=-1071.67 GT:AD:DP:GL:GQ 1/1:0,77:75:-236.63,-22.63,-0.08:99
-chr1 2964979 rs55775305 C G 191.90 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.60;MQ0=0;OQ=1095.41;QD=18.89;SB=-526.68 GT:AD:DP:GL:GQ 0/1:27,31:56:-129.70,-16.87,-112.36:99
-chr1 2966676 rs1138513 T C 342.07 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=60.00;MQ0=0;OQ=1004.23;QD=15.45;SB=-395.31 GT:AD:DP:GL:GQ 0/1:29,36:64:-122.99,-19.29,-112.84:99
-chr1 2967377 rs2981855 A G 110.32 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.78;MQ0=0;OQ=2017.68;QD=35.40;SB=-766.96 GT:AD:DP:GL:GQ 1/1:0,57:57:-205.37,-17.17,-0.02:99
-chr1 2967903 rs2075969 G C 175.65 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.42;MQ0=0;OQ=486.84;QD=12.17;SB=-253.09 GT:AD:DP:GL:GQ 0/1:21,19:36:-62.83,-10.86,-80.92:99
-chr1 2969034 rs41315262 C T 141.67 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=432.24;QD=14.90;SB=-163.20 GT:AD:DP:GL:GQ 0/1:14,15:28:-54.95,-8.44,-49.21:99
-chr1 2970137 rs2072732 T C 36.95 LowQual AC=1;AF=0.50;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.39;MQ0=0;QD=4.11;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,4:7:-9.09,-2.11,-16.67:69.79
-chr1 2970438 . C T 1.69 PASS AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=3.02;MQ=60.00;MQ0=0;OQ=106.79;QD=5.62;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,5:16:-18.78,-4.82,-35.96:99
-chr1 2973178 rs2788091 T C 354.06 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.56;MQ0=0;OQ=657.96;QD=12.65;SB=-286.58 GT:AD:DP:GL:GQ 0/1:29,23:52:-84.74,-15.66,-115.27:99
-chr1 2973823 rs2297828 G A 18.50 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=95.21;QD=3.97;SB=-16.50 GT:AD:DP:GL:GQ 0/1:18,6:22:-19.43,-6.63,-57.66:99
-chr1 2975672 . C G 0.31 PASS AC=2;AF=1.00;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=6.00;MQ=60.00;MQ0=0;OQ=69.47;QD=7.72;SB=-10.00 GT:AD:DP:GL:GQ 1/1:3,6:3:-10.44,-0.91,-0.01:9.02
-chr1 2977743 rs909510 G C 79.39 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.73;MQ0=0;OQ=593.38;QD=17.98;SB=-309.99 GT:AD:DP:GL:GQ 0/1:15,18:31:-71.97,-9.35,-58.08:99
-chr1 2979403 rs1572656 T G 132.71 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.39;MQ0=0;OQ=227.87;QD=7.86;SB=-74.87 GT:AD:DP:GL:GQ 0/1:16,12:27:-34.21,-8.14,-59.65:99
-chr1 2982894 rs2981889 T C 0.49 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=3.40;MQ=59.07;MQ0=0;OQ=530.79;QD=10.62;SB=-197.61 GT:AD:DP:GL:GQ 0/1:25,25:44:-69.63,-13.27,-84.86:99
-chr1 2983498 rs2993486 G A 189.84 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.11;MQ0=0;OQ=2009.66;QD=38.65;SB=-804.34 GT:AD:DP:GL:GQ 1/1:0,52:51:-204.56,-15.36,-0.01:99
-chr1 2983667 rs2981888 C G 249.66 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=760.63;QD=16.54;SB=-378.87 GT:AD:DP:GL:GQ 0/1:20,26:44:-92.63,-13.28,-85.11:99
-chr1 2984196 rs4648359 G C 304.72 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=59.62;MQ0=0;OQ=739.36;QD=15.09;SB=-327.39 GT:AD:DP:GL:GQ 0/1:26,23:45:-90.79,-13.57,-98.24:99
-chr1 2984400 rs2788092 C G 25.02 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.57;MQ0=0;OQ=997.66;QD=18.48;SB=-280.54 GT:AD:DP:GL:GQ 0/1:23,31:51:-118.43,-15.38,-97.87:99
-chr1 2985122 rs2742689 T G 341.54 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.79;MQ0=0;OQ=737.00;QD=13.65;SB=-353.07 GT:AD:DP:GL:GQ 0/1:26,28:52:-92.65,-15.66,-91.92:99
-chr1 2985309 rs7515436 G A 254.33 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.36;MQ0=0;OQ=1107.59;QD=17.04;SB=-525.74 GT:AD:DP:GL:GQ 0/1:30,35:61:-132.42,-18.38,-99.41:99
-chr1 2985493 rs2788093 C T 164.52 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=52.54;MQ0=0;OQ=672.12;QD=14.61;SB=-188.18 GT:AD:DP:GL:GQ 0/1:25,21:45:-84.06,-13.57,-76.74:99
-chr1 2985947 . G A 42.58 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=59.42;MQ0=0;QD=1.06;SB=86.29 GT:AD:DP:GL:GQ 0/1:35,5:38:-18.99,-11.45,-122.25:75.41
-chr1 2986056 rs7525173 C G 198.19 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=57.11;MQ0=0;OQ=1235.82;QD=21.68;SB=-610.55 GT:AD:DP:GL:GQ 0/1:22,35:54:-143.14,-16.27,-91.10:99
-chr1 2986416 rs1569420 C G 131.69 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.22;MQ0=0;OQ=1047.24;QD=19.39;SB=-356.09 GT:AD:DP:GL:GQ 0/1:24,30:53:-123.98,-15.97,-102.98:99
-chr1 2986462 rs1569419 T C 443.07 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1686.91;QD=29.59;SB=-810.28 GT:AD:DP:GL:GQ 1/1:0,57:54:-172.33,-16.29,-0.05:99
-chr1 2988794 rs2742686 T C 110.98 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.81;MQ=59.55;MQ0=0;OQ=633.23;QD=12.42;SB=-265.98 GT:AD:DP:GL:GQ 0/1:26,25:48:-81.08,-14.47,-95.70:99
-chr1 2988858 rs10909873 C G 203.72 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.25;MQ=59.51;MQ0=0;OQ=629.03;QD=13.38;SB=-304.03 GT:AD:DP:GL:GQ 0/1:24,23:43:-79.16,-12.98,-98.92:99
-chr1 2988928 rs2981886 T G 27.89 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=713.08;QD=17.39;SB=-342.06 GT:AD:DP:GL:GQ 0/1:16,25:41:-86.94,-12.35,-58.67:99
-chr1 2989062 rs2742685 T C 91.91 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=59.38;MQ0=0;OQ=332.13;QD=8.98;SB=-168.61 GT:AD:DP:GL:GQ 0/1:21,16:36:-47.35,-10.86,-77.27:99
-chr1 2989275 rs760570 T C 183.83 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=60.00;MQ0=0;OQ=452.99;QD=11.62;SB=-195.61 GT:AD:DP:GL:GQ 0/1:18,21:37:-59.74,-11.16,-71.21:99
-chr1 2989352 rs11580403 C T 17.69 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=6.35;MQ=58.51;MQ0=0;OQ=786.31;QD=16.73;SB=-390.18 GT:AD:DP:GL:GQ 0/1:22,25:44:-95.18,-13.26,-64.65:99
-chr1 2989378 rs11581212 A G 26.01 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=4.12;MQ=58.01;MQ0=0;OQ=610.70;QD=12.99;SB=-220.27 GT:AD:DP:GL:GQ 0/1:23,24:41:-76.70,-12.35,-80.42:99
-chr1 2989575 rs6674036 G T 86.25 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=295.75;QD=8.45;SB=-112.67 GT:AD:DP:GL:GQ 0/1:22,13:32:-42.50,-9.64,-70.40:99
-chr1 2989750 rs6683976 C G 152.72 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=58.25;MQ0=0;OQ=588.86;QD=14.72;SB=-197.30 GT:AD:DP:GL:GQ 0/1:21,19:38:-73.63,-11.46,-80.42:99
-chr1 2989984 rs760569 A G 0.34 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=3;HaplotypeScore=3.04;MQ=55.35;MQ0=1;OQ=203.26;QD=6.78;SB=-13.61 GT:AD:DP:GL:GQ 0/1:16,14:25:-31.15,-7.54,-61.01:99
-chr1 2990301 rs760568 A G 305.79 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=56.76;MQ0=0;OQ=713.37;QD=13.99;SB=-336.34 GT:AD:DP:GL:GQ 0/1:22,29:50:-89.69,-15.07,-88.33:99
-chr1 2990325 rs760567 A G 357.24 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=57.34;MQ0=0;OQ=769.95;QD=14.53;SB=-388.67 GT:AD:DP:GL:GQ 0/1:25,28:52:-95.94,-15.67,-100.59:99
-chr1 2990784 rs6695131 T C 278.73 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.69;MQ0=0;OQ=1038.17;QD=17.02;SB=-324.30 GT:AD:DP:GL:GQ 0/1:25,36:59:-124.87,-17.77,-99.97:99
-chr1 2991113 rs760566 T C 528.98 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1563.77;QD=31.91;SB=-755.58 GT:AD:DP:GL:GQ 1/1:0,49:46:-159.99,-13.86,-0.02:99
-chr1 2991563 rs6690540 C T 182.97 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=58.34;MQ0=0;OQ=662.57;QD=14.72;SB=-343.52 GT:AD:DP:GL:GQ 0/1:23,22:42:-82.21,-12.67,-65.85:99
-chr1 2991617 rs2742682 T C 232.59 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.38;MQ0=0;OQ=410.76;QD=11.10;SB=-215.29 GT:AD:DP:GL:GQ 0/1:16,19:33:-54.32,-9.96,-57.14:99
-chr1 2991708 rs2742681 T G 14.52 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=58.98;MQ0=0;OQ=365.17;QD=8.91;SB=-102.16 GT:AD:DP:GL:GQ 0/1:24,17:38:-51.25,-11.45,-78.22:99
-chr1 2992174 rs2742680 C G 300.14 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=58.66;MQ0=0;OQ=934.85;QD=17.98;SB=-447.39 GT:AD:DP:GL:GQ 0/1:22,30:49:-111.56,-14.79,-83.87:99
-chr1 2992195 rs2742679 C T 269.04 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=58.13;MQ0=0;OQ=860.87;QD=17.22;SB=-384.13 GT:AD:DP:GL:GQ 0/1:23,27:48:-103.84,-14.47,-74.36:99
-chr1 2992210 rs2742678 G A 296.42 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=57.39;MQ0=0;OQ=701.27;QD=15.58;SB=-336.35 GT:AD:DP:GL:GQ 0/1:23,22:43:-86.37,-12.96,-74.58:99
-chr1 2993392 rs11801109 G A 5.62 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.59;MQ0=0;OQ=759.83;QD=16.52;SB=-91.91 GT:AD:DP:GL:GQ 0/1:23,23:45:-92.82,-13.56,-77.23:99
-chr1 2993874 rs2981883 T C 12.34 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=58.95;MQ0=0;OQ=1316.25;QD=29.91;SB=-475.45 GT:AD:DP:GL:GQ 1/1:0,44:39:-135.23,-11.75,-0.02:99
-chr1 2994092 rs2981882 A G 168.83 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.63;MQ0=0;OQ=1897.54;QD=30.61;SB=-828.34 GT:AD:DP:GL:GQ 1/1:0,62:61:-193.40,-18.40,-0.06:99
-chr1 2994217 rs2981881 T C 270.84 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=58.88;MQ0=0;OQ=1946.57;QD=31.40;SB=-838.62 GT:AD:DP:GL:GQ 1/1:1,61:56:-198.26,-16.87,-0.02:99
-chr1 2994648 rs2981880 T C 6.41 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=4.30;MQ=56.36;MQ0=0;OQ=1597.03;QD=34.72;SB=-433.18 GT:AD:DP:GL:GQ 1/1:0,45:44:-163.30,-13.25,-0.01:99
-chr1 2994734 rs2981879 T C 43.37 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.75;MQ0=0;OQ=1057.22;QD=35.24;SB=-208.08 GT:AD:DP:GL:GQ 1/1:0,30:30:-109.32,-9.04,-0.01:90.26
-chr1 2994945 rs34014659 G A 271.04 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.59;MQ0=1;OQ=187.11;QD=9.85;SB=-73.30 GT:AD:DP:GL:GQ 0/1:11,8:17:-27.12,-5.12,-33.00:99
-chr1 2995445 rs2981878 A G 132.19 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=56.06;MQ0=1;OQ=382.82;QD=11.96;SB=-131.28 GT:AD:DP:GL:GQ 0/1:16,16:31:-50.91,-9.34,-62.42:99
-chr1 2995487 rs6676479 G A 196.19 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=57.97;MQ0=1;OQ=534.41;QD=14.06;SB=-244.76 GT:AD:DP:GL:GQ 0/1:21,17:34:-66.98,-10.25,-53.48:99
-chr1 2995498 rs34884268 C T 260.47 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=626.01;QD=14.90;SB=-317.32 GT:AD:DP:GL:GQ 0/1:22,20:41:-78.24,-12.36,-68.94:99
-chr1 2995610 rs34782467 G A 183.72 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=857.05;QD=16.48;SB=-325.85 GT:AD:DP:GL:GQ 0/1:26,26:50:-104.07,-15.08,-74.92:99
-chr1 2995991 rs926246 T C 314.46 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=57.39;MQ0=0;OQ=671.24;QD=12.43;SB=-260.51 GT:AD:DP:GL:GQ 0/1:30,24:53:-86.37,-15.96,-115.93:99
-chr1 2996058 rs926245 C A 105.01 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=53.36;MQ0=0;OQ=705.06;QD=12.82;SB=-99.80 GT:AD:DP:GL:GQ 0/1:29,26:52:-89.45,-15.66,-93.51:99
-chr1 2996143 rs926244 A G 215.10 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=58.61;MQ0=0;OQ=1978.79;QD=31.92;SB=-947.90 GT:AD:DP:GL:GQ 1/1:0,60:58:-201.49,-17.47,-0.03:99
-chr1 2996175 rs926243 T G 426.34 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=690.75;QD=11.32;SB=-265.78 GT:AD:DP:GL:GQ 0/1:31,30:58:-89.83,-17.48,-108.47:99
-chr1 2996487 rs55932943 C T 3.20 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=10.54;MQ=58.03;MQ0=1;OQ=1021.25;QD=14.80;SB=-443.45 GT:AD:DP:GL:GQ 0/1:37,31:63:-124.40,-18.99,-104.76:99
-chr1 2996899 rs2817165 A G 93.99 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.80;MQ0=0;OQ=288.71;QD=8.25;SB=-166.95 GT:AD:DP:GL:GQ 0/1:21,13:29:-40.90,-8.74,-67.04:99
-chr1 2997535 rs34300623 G A 185.66 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.69;MQ0=0;OQ=968.84;QD=15.88;SB=-326.31 GT:AD:DP:GL:GQ 0/1:32,29:60:-118.25,-18.08,-106.92:99
-chr1 2997956 rs6693385 C T 247.24 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=59.55;MQ0=0;OQ=876.50;QD=17.19;SB=-364.90 GT:AD:DP:GL:GQ 0/1:22,29:45:-104.50,-13.57,-57.88:99
-chr1 2998547 rs2376820 C G 2318.28 Indel AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=17.39;MQ=51.50;MQ0=0;QD=40.67;SB=-1149.31 GT:AD:DP:GL:GQ 1/1:0,55:56:-238.28,-19.61,-2.86:99
-chr1 3000177 rs760565 A T 219.18 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=60.00;MQ0=0;OQ=708.84;QD=15.75;SB=-333.07 GT:AD:DP:GL:GQ 0/1:21,24:41:-86.52,-12.35,-66.91:99
-chr1 3001189 rs2981873 T C 24.60 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=57.66;MQ0=0;OQ=381.92;QD=12.73;SB=-154.31 GT:AD:DP:GL:GQ 0/1:16,14:30:-50.52,-9.04,-62.50:99
-chr1 3002186 rs12135325 T C 1.38 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=4.32;MQ=58.67;MQ0=0;OQ=210.96;QD=6.03;SB=-111.21 GT:AD:DP:GL:GQ 0/1:22,13:32:-34.02,-9.64,-84.87:99
-chr1 3002840 rs6666748 A G 255.15 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=60.00;MQ0=0;OQ=801.41;QD=14.84;SB=-400.31 GT:AD:DP:GL:GQ 0/1:21,33:50:-98.50,-15.08,-74.39:99
-chr1 3003005 rs2788097 A C 59.19 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.07;MQ=59.05;MQ0=0;OQ=463.07;QD=10.52;SB=-200.91 GT:AD:DP:GL:GQ 0/1:25,19:39:-61.34,-11.75,-74.66:99
-chr1 3005383 rs2981870 G A 337.06 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.45;MQ0=0;OQ=532.89;QD=12.69;SB=-258.26 GT:AD:DP:GL:GQ 0/1:23,19:40:-68.63,-12.06,-71.78:99
-chr1 3005452 rs55674255 C T 63.22 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.20;MQ=60.00;MQ0=0;OQ=640.76;QD=14.56;SB=-293.19 GT:AD:DP:GL:GQ 0/1:24,20:44:-80.62,-13.26,-82.30:99
-chr1 3005702 rs55784774 G A 50.92 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.79;MQ=59.56;MQ0=0;OQ=701.05;QD=13.23;SB=-358.53 GT:AD:DP:GL:GQ 0/1:30,23:49:-88.16,-14.77,-89.46:99
-chr1 3005947 . C T 228.82 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.77;MQ0=0;OQ=514.40;QD=13.54;SB=-233.73 GT:AD:DP:GL:GQ 0/1:21,17:37:-65.88,-11.16,-63.18:99
-chr1 3005977 . G A 25.43 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=57.94;MQ0=0;OQ=561.32;QD=13.69;SB=-151.18 GT:AD:DP:GL:GQ 0/1:21,20:37:-70.56,-11.15,-69.03:99
-chr1 3006143 rs2981869 C T 155.48 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.84;MQ0=0;OQ=588.68;QD=14.72;SB=-230.75 GT:AD:DP:GL:GQ 0/1:19,21:38:-73.61,-11.45,-64.86:99
-chr1 3007018 . G A 13.33 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=4.77;MQ=59.05;MQ0=0;OQ=465.01;QD=10.57;SB=-225.50 GT:AD:DP:GL:GQ 0/1:25,18:41:-64.52,-14.73,-86.50:99
-chr1 3008086 rs2993492 G A 197.87 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.53;MQ0=0;OQ=913.42;QD=18.64;SB=-406.43 GT:AD:DP:GL:GQ 0/1:20,29:46:-108.49,-13.86,-62.00:99
-chr1 3009487 rs12131890 G A 77.41 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.17;MQ0=0;OQ=935.16;QD=20.78;SB=-364.90 GT:AD:DP:GL:GQ 0/1:15,30:42:-109.46,-12.66,-48.94:99
-chr1 3010048 rs56029998 T C 182.76 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.92;MQ=59.24;MQ0=0;OQ=609.91;QD=11.09;SB=-261.57 GT:AD:DP:GL:GQ 0/1:31,24:54:-80.54,-16.27,-125.83:99
-chr1 3010106 rs2993493 C A 285.53 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=59.63;MQ0=0;OQ=789.70;QD=15.48;SB=-315.68 GT:AD:DP:GL:GQ 0/1:25,26:51:-97.62,-15.36,-86.35:99
-chr1 3010923 rs2993494 G A 362.80 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=449.17;QD=13.21;SB=-177.14 GT:AD:DP:GL:GQ 0/1:18,16:33:-58.15,-9.95,-61.38:99
-chr1 3011156 rs55898371 A C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=5;HaplotypeScore=4.00;MQ=58.74;MQ0=0;OQ=420.03;QD=11.35;SB=-193.92 GT:AD:DP:GL:GQ 0/1:18,19:33:-55.23,-9.95,-57.05:99
-chr1 3011412 rs12133978 G A 162.16 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=59.34;MQ0=0;OQ=429.68;QD=12.28;SB=-187.26 GT:AD:DP:GL:GQ 0/1:20,15:33:-56.20,-9.95,-61.55:99
-chr1 3011547 rs11808136 C T 5.88 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=59.52;MQ0=0;OQ=731.81;QD=18.76;SB=-195.18 GT:AD:DP:GL:GQ 0/1:16,23:36:-87.31,-10.85,-49.60:99
-chr1 3012571 rs2993495 A G 13.64 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=549.01;QD=28.90;SB=-194.71 GT:AD:DP:GL:GQ 1/1:0,19:18:-58.50,-5.43,-0.01:54.13
-chr1 3012575 rs2993496 T C 83.64 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=58.78;MQ0=0;OQ=196.75;QD=10.36;SB=-98.00 GT:AD:DP:GL:GQ 0/1:9,10:18:-28.39,-5.43,-32.68:99
-chr1 3012992 rs2993497 G A 7 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.90;MQ=59.59;MQ0=0;OQ=932.60;QD=20.72;SB=-424.82 GT:AD:DP:GL:GQ 0/1:16,29:42:-109.20,-12.66,-48.01:99
-chr1 3013111 rs56363358 C A 42.53 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.28;MQ0=0;OQ=749.52;QD=19.72;SB=-289.38 GT:AD:DP:GL:GQ 0/1:12,26:36:-89.08,-10.85,-37.10:99
-chr1 3013255 rs2993498 T C 497.69 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=1211.16;QD=31.87;SB=-545.88 GT:AD:DP:GL:GQ 1/1:0,38:36:-124.72,-10.85,-0.02:99
-chr1 3013565 rs6667850 A C 171.48 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.41;MQ0=0;OQ=400.63;QD=10.27;SB=-101.88 GT:AD:DP:GL:GQ 0/1:20,19:37:-54.50,-11.15,-69.04:99
-chr1 3013819 rs1890337 A G 45.08 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=58.49;MQ0=0;OQ=1788.78;QD=31.38;SB=-712.22 GT:AD:DP:GL:GQ 1/1:0,56:52:-182.49,-15.67,-0.02:99
-chr1 3014125 rs1890336 A C 168.89 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.71;MQ0=0;OQ=1775.96;QD=32.89;SB=-886.08 GT:AD:DP:GL:GQ 1/1:0,54:51:-181.20,-15.36,-0.02:99
-chr1 3014227 rs2993499 T C 143.46 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.04;MQ=59.50;MQ0=0;OQ=1217.03;QD=32.89;SB=-587.31 GT:AD:DP:GL:GQ 1/1:0,37:36:-125.31,-10.85,-0.02:99
-chr1 3014565 rs2993500 C T 15.68 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=4.44;MQ=59.65;MQ0=0;OQ=1234.24;QD=18.99;SB=-544.80 GT:AD:DP:GL:GQ 0/1:29,36:64:-145.99,-19.28,-92.77:99
-chr1 3015706 rs12137954 T A 122.03 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.40;MQ0=0;OQ=345.66;QD=6.91;SB=-177.77 GT:AD:DP:GL:GQ 0/1:35,15:48:-52.31,-14.46,-129.85:99
-chr1 3015846 rs2993501 A C 217.20 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=57.44;MQ0=0;OQ=1649.50;QD=29.99;SB=-596.80 GT:AD:DP:GL:GQ 1/1:0,55:53:-168.59,-15.98,-0.05:99
-chr1 3015960 rs12135664 C T 346.44 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=60.00;MQ0=0;OQ=1146.10;QD=16.85;SB=-550.79 GT:AD:DP:GL:GQ 0/1:34,34:67:-138.08,-20.19,-108.20:99
-chr1 3016120 rs2981868 T A 119.84 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=4.10;MQ=59.44;MQ0=0;OQ=1114.65;QD=15.06;SB=-570.99 GT:AD:DP:GL:GQ 0/1:37,36:67:-134.93,-20.18,-118.55:99
-chr1 3016369 rs59909070 G A 353.97 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=434.09;QD=10.10;SB=-171.10 GT:AD:DP:GL:GQ 0/1:27,16:42:-59.35,-12.65,-95.52:99
-chr1 3016502 . T C 0.18 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=2;HaplotypeScore=5.91;MQ=44.72;MQ0=3;OQ=351.94;QD=7.65;SB=-166.48 GT:AD:DP:GL:GQ 0/1:25,21:36:-49.33,-10.85,-81.52:99
-chr1 3016606 . A C 15.74 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.75;MQ=48.95;MQ0=1;OQ=373.22;QD=9.82;SB=-133.20 GT:AD:DP:GL:GQ 0/1:18,17:27:-48.74,-8.13,-43.17:99
-chr1 3016839 rs56010213 A T 12.71 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=38.33;MQ0=7;QD=0.33;SB=20.09 GT:AD:DP:GL:GQ 0/1:34,5:23:-11.46,-6.93,-70.69:45.31
-chr1 3017201 rs2993502 C T 589.72 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.38;MQ0=0;OQ=2029.57;QD=38.29;SB=-936.75 GT:AD:DP:GL:GQ 1/1:0,53:51:-206.56,-15.36,-0.01:99
-chr1 3017765 . T C 156.29 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=257.37;QD=12.26;SB=-133.69 GT:AD:DP:GL:GQ 0/1:7,14:18:-34.45,-5.43,-28.78:99
-chr1 3017780 . C T 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=2.01;MQ=59.03;MQ0=0;OQ=567.81;QD=23.66;SB=-154.18 GT:AD:DP:GL:GQ 0/1:6,18:22:-66.70,-6.63,-18.59:99
-chr1 3018779 rs11808946 C T 272.66 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=781.20;QD=16.62;SB=-355.56 GT:AD:DP:GL:GQ 0/1:22,25:44:-94.67,-13.26,-66.92:99
-chr1 3018847 rs2993503 A G 82.10 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=59.16;MQ0=0;OQ=1494.14;QD=27.17;SB=-767.73 GT:AD:DP:GL:GQ 1/1:0,55:49:-153.05,-14.78,-0.05:99
-chr1 3018941 rs2072733 C T 12.61 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=59.46;MQ0=0;OQ=605.93;QD=14.09;SB=-165.23 GT:AD:DP:GL:GQ 0/1:22,21:41:-76.24,-12.36,-69.17:99
-chr1 3019072 rs10909875 C T 272.35 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.03;MQ0=0;OQ=534.00;QD=11.12;SB=-208.44 GT:AD:DP:GL:GQ 0/1:28,20:45:-70.25,-13.56,-92.78:99
-chr1 3019517 rs12136745 G A 248.92 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=59.62;MQ0=0;OQ=984.07;QD=16.40;SB=-470.51 GT:AD:DP:GL:GQ 0/1:28,32:55:-118.26,-16.57,-87.88:99
-chr1 3019842 rs58968988 G A 56.19 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=4.37;MQ=58.92;MQ0=0;OQ=590.92;QD=13.74;SB=-159.22 GT:AD:DP:GL:GQ 0/1:22,21:39:-74.13,-11.75,-67.01:99
-chr1 3020484 rs2981867 G C 387.41 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=547.74;QD=12.17;SB=-190.58 GT:AD:DP:GL:GQ 0/1:29,16:44:-71.32,-13.26,-119.60:99
-chr1 3020597 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=37.34;MQ=39.25;MQ0=1;OQ=144.44;QD=4.25;SB=-87.67 GT:AD:DP:GL:GQ 0/1:24,10:27:-25.87,-8.14,-74.17:99
-chr1 3020599 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=45.49;MQ=39.25;MQ0=1;OQ=360.48;QD=10.60;SB=-127.10 GT:AD:DP:GL:GQ 0/1:21,13:31:-48.68,-9.35,-60.35:99
-chr1 3020611 . A G 19.24 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=21.97;MQ=37.81;MQ0=1;QD=0.62;SB=-30.78 GT:AD:DP:GL:GQ 0/1:24,7:24:-12.43,-7.23,-80.13:52.02
-chr1 3020613 rs6691894 A G 41.97 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=22.61;MQ=37.81;MQ0=1;QD=1.35;SB=-10.86 GT:AD:DP:GL:GQ 0/1:24,7:20:-13.51,-6.02,-64.69:74.80
-chr1 3020615 rs6691895 A G 400.54 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=24.36;MQ=38.97;MQ0=1;QD=12.92;SB=-173.99 GT:AD:DP:GL:GQ 0/1:14,17:24:-50.58,-7.24,-30.30:99
-chr1 3020629 . A G 22.23 LowQual AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=19.42;MQ=38.02;MQ0=1;QD=0.85;SB=-32.78 GT:AD:DP:GL:GQ 0/1:21,5:22:-12.14,-6.63,-70.51:55.04
-chr1 3020688 rs6691996 A G 381.91 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.90;MQ0=0;OQ=370.45;QD=11.58;SB=-184.01 GT:AD:DP:GL:GQ 0/1:14,18:30:-49.38,-9.05,-56.94:99
-chr1 3020691 rs6695017 T C 343.03 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.28;MQ0=0;OQ=495.78;QD=14.58;SB=-192.66 GT:AD:DP:GL:GQ 0/1:16,18:34:-63.11,-10.25,-58.83:99
-chr1 3020744 rs6687292 C T 95.65 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=56.56;MQ0=0;OQ=522.71;QD=9.33;SB=-137.11 GT:AD:DP:GL:GQ 0/1:34,22:53:-71.53,-15.97,-120.29:99
-chr1 3020924 rs2981866 G A 33.28 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.17;MQ0=0;OQ=1933.34;QD=38.67;SB=-489.14 GT:AD:DP:GL:GQ 1/1:0,50:49:-196.94,-14.76,-0.02:99
-chr1 3020982 rs10909876 A G 347.22 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.47;MQ0=0;OQ=796.80;QD=13.06;SB=-340.94 GT:AD:DP:GL:GQ 0/1:29,32:61:-101.36,-18.40,-112.11:99
-chr1 3020998 rs10909877 T A 2173.88 Indel AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=54.79;MQ0=0;QD=36.23;SB=-1033.22 GT:AD:DP:GL:GQ 1/1:0,60:59:-220.99,-17.77,-0.02:99
-chr1 3021182 . G A 53.76 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.25;MQ0=0;OQ=405.03;QD=13.07;SB=-180.66 GT:AD:DP:GL:GQ 0/1:18,13:30:-52.83,-9.04,-54.54:99
-chr1 3022425 rs2981865 G C 1.40 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.81;MQ0=0;OQ=743.56;QD=24.79;SB=-346.46 GT:AD:DP:GL:GQ 0/1:9,21:29:-86.39,-8.75,-34.33:99
-chr1 3024466 rs10909878 A G 299.96 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=58.18;MQ0=0;OQ=619.53;QD=13.18;SB=-324.31 GT:AD:DP:GL:GQ 0/1:20,27:45:-78.81,-13.57,-80.16:99
-chr1 3024530 rs12141827 T C 99.60 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=53.26;MQ0=0;OQ=329.91;QD=8.25;SB=-169.50 GT:AD:DP:GL:GQ 0/1:24,16:37:-47.43,-11.15,-87.85:99
-chr1 3025087 rs6690373 A G 254.01 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=819.31;QD=14.63;SB=-343.19 GT:AD:DP:GL:GQ 0/1:23,33:54:-101.49,-16.28,-89.82:99
-chr1 3025597 rs2981864 A G 2.03 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=59.23;MQ0=0;OQ=762.15;QD=25.41;SB=-232.49 GT:AD:DP:GL:GQ 1/1:0,28:25:-82.46,-10.02,-2.66:73.60
-chr1 3025622 rs12409836 A G 68.57 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.74;MQ0=0;OQ=225.89;QD=6.11;SB=-44.83 GT:AD:DP:GL:GQ 0/1:23,14:30:-34.92,-9.04,-72.62:99
-chr1 3025639 rs2472822 C G 79.91 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=1446.74;QD=36.17;SB=-602.98 GT:AD:DP:GL:GQ 1/1:0,40:36:-148.28,-10.86,-0.02:99
-chr1 3027473 rs876740 C T 271.81 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=2215.19;QD=38.19;SB=-1128.00 GT:AD:DP:GL:GQ 1/1:0,58:56:-225.12,-16.87,-0.02:99
-chr1 3028483 rs2742672 A G 23.82 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.51;MQ0=0;OQ=1087.23;QD=28.61;SB=-502.17 GT:AD:DP:GL:GQ 1/1:0,38:36:-112.35,-10.86,-0.04:99
-chr1 3029008 rs2817171 C A 191.92 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.65;MQ0=0;OQ=733.04;QD=13.57;SB=-391.11 GT:AD:DP:GL:GQ 0/1:29,25:54:-92.85,-16.26,-102.92:99
-chr1 3030045 rs2981863 G C 66.05 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.63;MQ0=0;OQ=889.03;QD=17.78;SB=-256.52 GT:AD:DP:GL:GQ 0/1:23,27:46:-106.06,-13.87,-86.32:99
-chr1 3030624 rs2012731 G A 16.06 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=4.70;MQ=59.61;MQ0=0;OQ=1536.02;QD=32.00;SB=-433.32 GT:AD:DP:GL:GQ 1/1:0,48:41:-157.21,-12.36,-0.02:99
-chr1 3031379 rs2817172 T C 144.04 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1381.66;QD=30.70;SB=-636.88 GT:AD:DP:GL:GQ 1/1:0,45:44:-141.79,-13.27,-0.04:99
-chr1 3032241 rs2472820 G A 108.60 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.74;MQ0=0;OQ=572.26;QD=15.47;SB=-176.66 GT:AD:DP:GL:GQ 0/1:19,18:36:-71.36,-10.85,-60.89:99
-chr1 3032694 . C T 55.78 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=546.49;QD=14.77;SB=-205.90 GT:AD:DP:GL:GQ 0/1:19,18:36:-68.78,-10.85,-58.80:99
-chr1 3033426 rs12410830 A G 6.05 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=3.60;MQ=59.16;MQ0=0;OQ=614.56;QD=12.29;SB=-235.29 GT:AD:DP:GL:GQ 0/1:27,23:49:-79.50,-14.76,-107.00:99
-chr1 3034041 rs2817174 T C 277.92 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.38;MQ0=0;OQ=1499.60;QD=26.78;SB=-664.93 GT:AD:DP:GL:GQ 1/1:0,56:48:-153.59,-14.48,-0.05:99
-chr1 3034512 rs35529420 C T 72.11 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.41;MQ=59.18;MQ0=0;OQ=899.04;QD=15.77;SB=-264.19 GT:AD:DP:GL:GQ 0/1:27,29:53:-109.16,-15.97,-86.82:99
-chr1 3034731 rs35951269 T C 58.31 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.40;MQ=58.97;MQ0=0;OQ=780.41;QD=12.39;SB=-339.30 GT:AD:DP:GL:GQ 0/1:36,27:63:-100.30,-18.98,-146.89:99
-chr1 3035225 rs2742670 A G 75.82 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=60.00;MQ0=0;OQ=1811.56;QD=33.55;SB=-920.03 GT:AD:DP:GL:GQ 1/1:0,54:51:-184.76,-15.36,-0.02:99
-chr1 3035475 rs2817175 T C 135.77 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=57.17;MQ0=0;OQ=1487.18;QD=29.74;SB=-663.57 GT:AD:DP:GL:GQ 1/1:0,50:49:-152.36,-14.79,-0.06:99
-chr1 3035871 rs2817176 A G 10.06 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=58.80;MQ0=0;OQ=1642.91;QD=28.33;SB=-799.47 GT:AD:DP:GL:GQ 1/1:0,58:54:-167.94,-16.30,-0.07:99
-chr1 3036323 rs2817177 T C 492.31 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1385.60;QD=34.64;SB=-536.41 GT:AD:DP:GL:GQ 1/1:0,40:39:-142.16,-11.75,-0.01:99
-chr1 3036571 rs35625823 T G 1.28 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.02;HRun=1;HaplotypeScore=8.04;MQ=58.17;MQ0=0;OQ=682.10;QD=13.37;SB=-105.91 GT:AD:DP:GL:GQ 0/1:25,25:50:-86.26,-14.76,-86.59:99
-chr1 3036686 rs35201154 G T 212.09 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.64;MQ0=0;OQ=542.18;QD=11.30;SB=-157.49 GT:AD:DP:GL:GQ 0/1:27,21:48:-71.97,-14.46,-93.11:99
-chr1 3037032 rs2788086 A G 87.83 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.14;MQ0=0;OQ=1440.07;QD=26.67;SB=-745.96 GT:AD:DP:GL:GQ 1/1:1,53:49:-151.81,-14.78,-4.21:99
-chr1 3037112 rs2817178 T C 138.65 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.50;MQ=59.01;MQ0=0;OQ=1783.83;QD=33.66;SB=-780.99 GT:AD:DP:GL:GQ 1/1:0,53:51:-182.00,-15.37,-0.03:99
-chr1 3037307 rs10797378 T C 263.69 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=57.77;MQ0=0;OQ=673.03;QD=12.02;SB=-270.24 GT:AD:DP:GL:GQ 0/1:24,31:50:-85.66,-15.07,-91.32:99
-chr1 3037312 rs2788087 A G 5.84 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=4.61;MQ=57.43;MQ0=0;OQ=719.26;QD=12.40;SB=-323.12 GT:AD:DP:GL:GQ 0/1:28,30:54:-91.49,-16.28,-101.63:99
-chr1 3037323 rs10909881 G A 169.28 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.31;MQ=57.69;MQ0=0;OQ=859.60;QD=14.57;SB=-445.45 GT:AD:DP:GL:GQ 0/1:30,29:55:-105.83,-16.59,-85.38:99
-chr1 3038158 rs2817180 T C 101.32 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1662.63;QD=29.17;SB=-686.71 GT:AD:DP:GL:GQ 1/1:0,57:52:-169.90,-15.69,-0.05:99
-chr1 3038602 rs35360783 A G 220.53 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.65;MQ0=0;OQ=463.18;QD=8.74;SB=-235.89 GT:AD:DP:GL:GQ 0/1:32,21:53:-65.58,-15.98,-127.69:99
-chr1 3039222 rs12024620 C T 40.79 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.42;MQ=59.20;MQ0=0;OQ=839.66;QD=14.48;SB=-156.21 GT:AD:DP:GL:GQ 0/1:32,26:56:-104.13,-16.88,-98.69:99
-chr1 3039241 rs12021948 G C 56.36 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=946.79;QD=17.86;SB=-223.20 GT:AD:DP:GL:GQ 0/1:25,28:53:-113.94,-15.98,-109.97:99
-chr1 3039433 rs12740389 C T 216.94 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=1244.61;QD=19.15;SB=-628.67 GT:AD:DP:GL:GQ 0/1:28,37:63:-146.73,-18.98,-86.83:99
-chr1 3039715 rs35999894 C T 445.61 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1131.40;QD=18.86;SB=-581.12 GT:AD:DP:GL:GQ 0/1:26,34:58:-133.91,-17.48,-78.73:99
-chr1 3039945 rs34733164 A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=4;HaplotypeScore=2.38;MQ=59.17;MQ0=0;OQ=103.23;QD=3.69;SB=-48.95 GT:AD:DP:GL:GQ 0/1:18,10:23:-20.53,-6.93,-62.39:99
-chr1 3040081 rs12022170 G A 254.38 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.17;MQ0=0;OQ=717.02;QD=15.93;SB=-327.88 GT:AD:DP:GL:GQ 0/1:23,22:43:-87.95,-12.96,-65.92:99
-chr1 3040191 rs12028027 T C 223.73 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.03;MQ0=0;OQ=428.68;QD=8.93;SB=-212.28 GT:AD:DP:GL:GQ 0/1:28,20:45:-59.72,-13.57,-97.74:99
-chr1 3040222 rs12027117 A G 229.27 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.46;MQ0=0;OQ=557.56;QD=12.97;SB=-281.47 GT:AD:DP:GL:GQ 0/1:21,22:42:-71.69,-12.65,-82.66:99
-chr1 3040357 rs10909883 A G 344.92 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.62;MQ0=0;OQ=754.58;QD=12.37;SB=-348.58 GT:AD:DP:GL:GQ 0/1:28,33:59:-96.53,-17.79,-109.54:99
-chr1 3040454 rs12120879 C G 45.73 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.33;MQ=58.92;MQ0=0;OQ=1009.80;QD=18.03;SB=-357.43 GT:AD:DP:GL:GQ 0/1:27,29:53:-120.25,-15.98,-106.43:99
-chr1 3040798 rs35848773 T C 267.80 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.65;MQ0=0;OQ=685.07;QD=12.69;SB=-277.27 GT:AD:DP:GL:GQ 0/1:21,33:48:-86.26,-14.47,-82.32:99
-chr1 3040900 rs12731315 G C 3.75 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=3;HaplotypeScore=3.13;MQ=60.00;MQ0=0;OQ=656.27;QD=17.74;SB=-310.23 GT:AD:DP:GL:GQ 0/1:18,19:37:-80.07,-11.16,-76.94:99
-chr1 3041210 rs12724921 T A 454.48 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=611.82;QD=12.00;SB=-313.55 GT:AD:DP:GL:GQ 0/1:28,23:48:-78.92,-14.46,-101.94:99
-chr1 3041481 rs909509 A G 48.89 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.12;MQ=59.51;MQ0=0;OQ=373.32;QD=7.94;SB=-138.54 GT:AD:DP:GL:GQ 0/1:28,18:38:-52.08,-11.46,-81.04:99
-chr1 3041609 rs12725529 T C 111.43 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=58.62;MQ0=0;OQ=287.04;QD=7.76;SB=-113.62 GT:AD:DP:GL:GQ 0/1:21,16:34:-42.24,-10.25,-81.99:99
-chr1 3042125 rs7535865 A C 10.52 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=7.89;MQ=58.97;MQ0=0;OQ=623.66;QD=13.86;SB=-308.90 GT:AD:DP:GL:GQ 0/1:18,27:40:-77.70,-12.05,-63.90:99
-chr1 3042361 rs4648363 C T 227.69 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.42;MQ0=0;OQ=413.64;QD=10.34;SB=-159.64 GT:AD:DP:GL:GQ 0/1:26,14:37:-55.80,-11.16,-73.37:99
-chr1 3043023 rs35794895 G A 293.61 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=58.64;MQ0=0;OQ=693.50;QD=14.45;SB=-320.87 GT:AD:DP:GL:GQ 0/1:21,26:42:-85.30,-12.67,-60.57:99
-chr1 3043817 rs12741594 A T 497.03 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=877.02;QD=14.62;SB=-406.56 GT:AD:DP:GL:GQ 0/1:31,29:60:-109.06,-18.07,-115.07:99
-chr1 3043966 rs2235176 T C 337.32 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=677.48;QD=12.55;SB=-208.33 GT:AD:DP:GL:GQ 0/1:27,27:53:-87.00,-15.97,-104.05:99
-chr1 3044349 rs35877876 C T 270.74 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.61;MQ0=0;OQ=969.79;QD=16.44;SB=-358.48 GT:AD:DP:GL:GQ 0/1:30,29:59:-118.04,-17.77,-107.71:99
-chr1 3045481 rs10797379 T C 126.05 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.62;MQ0=0;OQ=1290.17;QD=29.32;SB=-604.23 GT:AD:DP:GL:GQ 1/1:0,44:42:-132.64,-12.67,-0.04:99
-chr1 3045736 rs10797380 A G 12.13 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=4.39;MQ=59.03;MQ0=0;OQ=1384.53;QD=28.84;SB=-697.60 GT:AD:DP:GL:GQ 1/1:0,48:44:-142.08,-13.27,-0.04:99
-chr1 3046509 rs7354964 C G 181.06 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.06;MQ0=0;OQ=756.10;QD=18.90;SB=-387.98 GT:AD:DP:GL:GQ 0/1:19,21:40:-90.95,-12.05,-80.97:99
-chr1 3047001 rs2817181 A G 378.95 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=2402.64;QD=34.32;SB=-979.90 GT:AD:DP:GL:GQ 1/1:0,70:68:-243.87,-20.48,-0.03:99
-chr1 3047521 rs7538096 T C 291.96 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.64;MQ0=0;OQ=861.01;QD=13.45;SB=-250.18 GT:AD:DP:GL:GQ 0/1:31,33:64:-108.67,-19.29,-124.47:99
-chr1 3048093 rs2742666 T C 36.97 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=6.22;MQ=57.02;MQ0=0;OQ=594.94;QD=12.93;SB=-209.63 GT:AD:DP:GL:GQ 0/1:23,23:42:-75.43,-12.65,-85.93:99
-chr1 3048098 rs2742665 A C 100.54 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=57.17;MQ0=0;OQ=617.42;QD=15.44;SB=-256.42 GT:AD:DP:GL:GQ 0/1:17,23:38:-76.47,-11.45,-58.49:99
-chr1 3048109 rs2817183 A G 380.39 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.05;MQ0=0;OQ=578.38;QD=14.46;SB=-222.56 GT:AD:DP:GL:GQ 0/1:19,21:39:-72.87,-11.75,-75.47:99
-chr1 3048230 rs2817184 G A 543.37 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=743.48;QD=15.82;SB=-334.86 GT:AD:DP:GL:GQ 0/1:23,24:46:-91.50,-13.86,-76.30:99
-chr1 3050041 rs6684093 C T 40.49 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=5.68;MQ=58.71;MQ0=0;OQ=937.27;QD=17.36;SB=-475.05 GT:AD:DP:GL:GQ 0/1:24,30:51:-112.38,-15.37,-76.51:99
-chr1 3051143 rs1875449 C A 6.39 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=5.78;MQ=59.44;MQ0=0;OQ=367.51;QD=8.96;SB=-206.89 GT:AD:DP:GL:GQ 0/1:23,18:37:-51.19,-11.15,-77.66:99
-chr1 3052735 rs2817187 G T 176.34 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.61;MQ0=0;OQ=2057.17;QD=34.87;SB=-1041.53 GT:AD:DP:GL:GQ 1/1:0,59:58:-209.32,-17.47,-0.02:99
-chr1 3066300 . C T 85.23 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.28;MQ0=0;OQ=957.84;QD=16.51;SB=-344.34 GT:AD:DP:GL:GQ 0/1:29,29:58:-116.54,-17.47,-102.34:99
-chr1 3068821 . G A 12.77 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.86;MQ=59.41;MQ0=0;OQ=492.51;QD=12.63;SB=-226.54 GT:AD:DP:GL:GQ 0/1:19,20:34:-62.79,-10.25,-59.33:99
-chr1 3069601 rs34175350 G C 4.56 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=15.60;MQ0=24;OQ=307.57;QD=4.16;SB=-10.00 GT:AD:DP:GL:GQ 0/1:61,13:26:-41.87,-7.83,-71.98:99
-chr1 3071991 . T C 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=7.33;MQ=54.00;MQ0=2;OQ=261.16;QD=5.02;SB=-67.51 GT:AD:DP:GL:GQ 0/1:33,19:40:-41.45,-12.05,-111.58:99
-chr1 3072015 . C T 17.95 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=6.27;MQ=51.72;MQ0=4;QD=0.46;SB=-17.49 GT:AD:DP:GL:GQ 0/1:29,10:20:-11.10,-6.03,-56.69:50.72
-chr1 3077233 rs10909887 A T 53.28 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=59.65;MQ0=0;OQ=1671.94;QD=31.55;SB=-810.23 GT:AD:DP:GL:GQ 1/1:0,53:48:-170.81,-14.47,-0.03:99
-chr1 3078302 rs2817127 C G 3.71 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=58.92;MQ0=0;OQ=1590.78;QD=40.79;SB=-669.44 GT:AD:DP:GL:GQ 1/1:0,39:38:-162.68,-11.46,-0.02:99
-chr1 3078602 rs2651936 C T 556.62 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1763.78;QD=38.34;SB=-617.01 GT:AD:DP:GL:GQ 1/1:0,46:45:-179.97,-13.55,-0.01:99
-chr1 3078803 rs2817128 T C 41.66 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=0.92;MQ=58.79;MQ0=0;OQ=1700.76;QD=31.50;SB=-627.85 GT:AD:DP:GL:GQ 1/1:0,54:53:-173.71,-15.98,-0.05:99
-chr1 3078920 rs2817129 G C 420.84 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2270.90;QD=42.85;SB=-927.24 GT:AD:DP:GL:GQ 1/1:0,53:53:-230.70,-15.98,-0.02:99
-chr1 3079836 rs3795268 G A 518.97 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2012.53;QD=38.70;SB=-765.66 GT:AD:DP:GL:GQ 1/1:0,52:51:-204.85,-15.36,-0.01:99
-chr1 3082486 rs61759169 A T 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=17.96;MQ=49.98;MQ0=1;OQ=467.66;QD=5.85;SB=-63.76 GT:AD:DP:GL:GQ 0/1:57,23:74:-72.34,-22.29,-212.74:99
-chr1 3082576 rs59307218 T C 89.31 Indel AC=1;AF=0.50;AN=2;DB;DP=106;Dels=0.00;HRun=1;HaplotypeScore=16.28;MQ=58.32;MQ0=0;QD=0.84;SB=-6.84 GT:AD:DP:GL:GQ 0/1:94,12:100:-42.34,-30.13,-353.31:99
-chr1 3082715 rs61759170 T C 0.15 PASS AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=1;HaplotypeScore=13.70;MQ=54.13;MQ0=0;OQ=433.59;QD=4.61;SB=-120.39 GT:AD:DP:GL:GQ 0/1:66,28:84:-71.95,-25.31,-255.13:99
-chr1 3082724 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=20.17;MQ=53.56;MQ0=0;OQ=265.77;QD=3.09;SB=-1.90 GT:AD:DP:GL:GQ 0/1:64,21:77:-55.36,-25.50,-226.03:99
-chr1 3082730 rs61759171 A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=25.02;MQ=53.60;MQ0=0;OQ=115.19;QD=1.46;SB=35.65 GT:AD:DP:GL:GQ 0/1:62,16:69:-35.59,-20.79,-209.49:99
-chr1 3083610 rs2817131 T C 1.92 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=7.31;MQ=58.76;MQ0=0;OQ=2679.05;QD=35.25;SB=-1269.49 GT:AD:DP:GL:GQ 1/1:0,76:75:-271.51,-22.59,-0.03:99
-chr1 3086215 rs868718 G A 224.01 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.60;MQ0=0;OQ=2257.57;QD=38.92;SB=-929.74 GT:AD:DP:GL:GQ 1/1:0,58:57:-229.36,-17.17,-0.02:99
-chr1 3086338 rs2817132 T C 256.47 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1749.39;QD=34.30;SB=-792.14 GT:AD:DP:GL:GQ 1/1:0,51:49:-178.54,-14.76,-0.01:99
-chr1 3086971 . G A 6.54 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.63;MQ0=0;OQ=869.92;QD=17.06;SB=-366.15 GT:AD:DP:GL:GQ 0/1:23,28:49:-105.05,-14.78,-70.17:99
-chr1 3087284 rs28576654 G A 0.62 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=8.45;MQ=55.21;MQ0=0;OQ=1827.21;QD=37.29;SB=-761.03 GT:AD:DP:GL:GQ 1/1:1,48:47:-186.32,-14.16,-0.02:99
-chr1 3087324 rs36042320 A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=36.16;MQ=53.71;MQ0=0;OQ=1199.13;QD=20.32;SB=-596.19 GT:AD:DP:GL:GQ 1/1:10,49:47:-136.03,-14.18,-12.56:16.27
-chr1 3087368 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=62.15;MQ=52.02;MQ0=2;OQ=84.05;QD=0.99;SB=68.22 GT:AD:DP:GL:GQ 0/1:64,20:65:-31.27,-19.58,-199.12:99
-chr1 3087405 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=113.18;MQ=45.62;MQ0=12;OQ=152.20;QD=1.23;SB=83.17 GT:AD:DP:GL:GQ 0/1:93,25:100:-54.91,-36.41,-286.94:99
-chr1 3087421 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=108;Dels=0.01;HRun=1;HaplotypeScore=157.91;MQ=45.44;MQ0=13;OQ=317.87;QD=2.94;SB=62.22 GT:AD:DP:GL:GQ 0/1:65,42:72:-56.46,-21.39,-222.98:99
-chr1 3087430 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.09;HRun=0;HaplotypeScore=131.45;MQ=45.35;MQ0=13;OQ=71.40;QD=0.71;SB=68.23 GT:AD:DP:GL:GQ 0/1:57,34:61:-28.82,-18.40,-174.57:99
-chr1 3087432 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=0;HaplotypeScore=125.43;MQ=44.68;MQ0=16;OQ=349.00;QD=3.39;SB=68.23 GT:AD:DP:GL:GQ 0/1:85,18:67:-58.39,-20.20,-173.08:99
-chr1 3087446 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=34.86;MQ=42.41;MQ0=15;OQ=253.15;QD=2.81;SB=53.16 GT:AD:DP:GL:GQ 0/1:47,43:54:-44.89,-16.29,-135.66:99
-chr1 3087456 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=33.91;MQ=40.94;MQ0=15;OQ=574.41;QD=6.38;SB=41.15 GT:AD:DP:GL:GQ 0/1:47,43:59:-78.52,-17.79,-127.78:99
-chr1 3087469 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=37.75;MQ=38.93;MQ0=14;OQ=420.06;QD=4.94;SB=41.09 GT:AD:DP:GL:GQ 0/1:56,29:63:-64.29,-19.00,-146.93:99
-chr1 3087482 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=75.90;MQ=37.38;MQ0=13;OQ=93.48;QD=1.23;SB=56.14 GT:AD:DP:GL:GQ 0/1:55,21:54:-28.92,-16.29,-150.91:99
-chr1 3087484 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=59.86;MQ=36.69;MQ0=13;OQ=224.49;QD=2.95;SB=47.15 GT:AD:DP:GL:GQ 0/1:64,12:51:-41.12,-15.38,-130.32:99
-chr1 3087496 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.18;HRun=0;HaplotypeScore=92.35;MQ=35.16;MQ0=7;OQ=80.55;QD=1.41;SB=-35.75 GT:AD:DP:GL:GQ 0/1:30,16:29:-20.09,-8.75,-100.50:99
-chr1 3087498 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=70.78;MQ=33.76;MQ0=7;OQ=147.15;QD=2.58;SB=-95.04 GT:AD:DP:GL:GQ 0/1:41,16:33:-27.95,-9.95,-82.07:99
-chr1 3087509 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.05;HRun=0;HaplotypeScore=74.81;MQ=32.58;MQ0=5;OQ=64.70;QD=1.06;SB=56.11 GT:AD:DP:GL:GQ 0/1:52,6:35:-20.32,-10.56,-93.36:97.54
-chr1 3087512 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=54.96;MQ=31.97;MQ0=5;OQ=503.11;QD=8.11;SB=-236.10 GT:AD:DP:GL:GQ 0/1:31,31:45:-67.16,-13.57,-94.41:99
-chr1 3087536 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=33.03;MQ=32.40;MQ0=3;OQ=59.37;QD=0.74;SB=89.25 GT:AD:DP:GL:GQ 0/1:72,7:63:-28.22,-18.99,-181.57:92.21
-chr1 3087538 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=37.44;MQ=32.40;MQ0=3;OQ=247.27;QD=3.09;SB=80.25 GT:AD:DP:GL:GQ 0/1:65,15:63:-46.99,-18.98,-180.33:99
-chr1 3087608 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.01;HRun=0;HaplotypeScore=54.40;MQ=37.28;MQ0=13;OQ=1887.72;QD=11.24;SB=-729.24 GT:AD:DP:GL:GQ 0/1:104,63:145:-235.47,-43.42,-271.37:99
-chr1 3087617 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=0;HaplotypeScore=53.68;MQ=37.94;MQ0=15;OQ=1635.04;QD=8.84;SB=-493.28 GT:AD:DP:GL:GQ 0/1:114,71:160:-215.01,-48.22,-344.93:99
-chr1 3087664 . A G 18.84 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=189;Dels=0.01;HRun=0;HaplotypeScore=131.51;MQ=40.84;MQ0=15;QD=0.10;SB=241.96 GT:AD:DP:GL:GQ 0/1:170,18:163:-53.97,-48.81,-580.79:51.62
-chr1 3087667 . C T 165.92 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=188;Dels=0.01;HRun=0;HaplotypeScore=132.64;MQ=41.11;MQ0=15;QD=0.88;SB=179.60 GT:AD:DP:GL:GQ 0/1:167,20:158:-67.18,-47.30,-486.26:99
-chr1 3087668 . A G 310.08 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=187;Dels=0.01;HRun=1;HaplotypeScore=124.54;MQ=41.17;MQ0=15;QD=1.66;SB=124.04 GT:AD:DP:GL:GQ 0/1:158,28:160:-82.20,-47.90,-540.31:99
-chr1 3087734 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=114;Dels=0.00;HRun=1;HaplotypeScore=13.23;MQ=44.53;MQ0=2;OQ=55.34;QD=0.49;SB=-14.90 GT:AD:DP:GL:GQ 0/1:101,11:104:-40.16,-31.34,-369.37:88.18
-chr1 3087747 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=0;HaplotypeScore=23.95;MQ=43.49;MQ0=2;OQ=1649.29;QD=15.71;SB=-709.98 GT:AD:DP:GL:GQ 0/1:48,57:100:-198.34,-30.13,-180.84:99
-chr1 3087772 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=133;Dels=0.00;HRun=0;HaplotypeScore=99.40;MQ=37.75;MQ0=7;OQ=762.57;QD=5.73;SB=-239.63 GT:AD:DP:GL:GQ 0/1:102,30:117:-114.83,-35.29,-281.68:99
-chr1 3087833 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=1;HaplotypeScore=261.50;MQ=29.30;MQ0=7;OQ=1486.23;QD=9.78;SB=-676.51 GT:AD:DP:GL:GQ 0/1:100,52:130:-191.07,-39.17,-253.74:99
-chr1 3087850 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=106.63;MQ=29.08;MQ0=7;OQ=1055.92;QD=7.23;SB=-459.23 GT:AD:DP:GL:GQ 0/1:100,46:125:-146.56,-37.68,-289.33:99
-chr1 3087853 . C A 11.81 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=148;Dels=0.00;HRun=0;HaplotypeScore=84.96;MQ=29.13;MQ0=6;QD=0.08;SB=22.69 GT:AD:DP:GL:GQ 0/1:134,14:133:-44.49,-40.06,-434.86:44.36
-chr1 3087861 . A C 168.29 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=135;Dels=0.00;HRun=0;HaplotypeScore=23.28;MQ=29.00;MQ0=4;QD=1.25;SB=-17.42 GT:AD:DP:GL:GQ 0/1:115,20:120:-56.26,-36.15,-379.05:99
-chr1 3087900 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=22.94;MQ=28.28;MQ0=1;OQ=423.78;QD=5.81;SB=-214.40 GT:AD:DP:GL:GQ 0/1:51,22:68:-66.15,-20.49,-189.92:99
-chr1 3087911 . C T 880.08 SnpCluster AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=0;HaplotypeScore=32.89;MQ=28.46;MQ0=0;QD=12.75;SB=-315.83 GT:AD:DP:GL:GQ 0/1:40,27:49:-105.45,-14.16,-69.50:99
-chr1 3087912 . A G 1267.81 SnpCluster AC=1;AF=0.50;AN=2;DP=68;Dels=0.03;HRun=1;HaplotypeScore=32.88;MQ=28.45;MQ0=0;QD=18.64;SB=-474.20 GT:AD:DP:GL:GQ 0/1:22,44:48:-143.92,-13.86,-20.32:64.59
-chr1 3087920 . G A 574.31 SnpCluster AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=0;HaplotypeScore=182.60;MQ=28.60;MQ0=0;QD=7.76;SB=-289.69 GT:AD:DP:GL:GQ 0/1:50,21:71:-81.21,-20.50,-157.25:99
-chr1 3087952 . G A 1075.62 Indel AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=58.78;MQ=31.99;MQ0=0;QD=13.62;SB=-555.39 GT:AD:DP:GL:GQ 0/1:45,34:75:-133.45,-22.61,-136.49:99
-chr1 3087978 . A G 38.22 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=109;Dels=0.02;HRun=1;HaplotypeScore=54.40;MQ=36.04;MQ0=0;QD=0.35;SB=94.63 GT:AD:DP:GL:GQ 0/1:93,14:103:-37.54,-30.43,-360.90:71.06
-chr1 3088004 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=0;HaplotypeScore=30.72;MQ=40.10;MQ0=2;OQ=423.13;QD=3.00;SB=9.29 GT:AD:DP:GL:GQ 0/1:121,20:123:-82.68,-37.08,-335.63:99
-chr1 3088013 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.03;HRun=0;HaplotypeScore=47.98;MQ=41.19;MQ0=4;OQ=426.97;QD=3.01;SB=-54.18 GT:AD:DP:GL:GQ 0/1:112,26:133:-84.85,-38.87,-412.97:99
-chr1 3088015 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=145;Dels=0.00;HRun=0;HaplotypeScore=42.51;MQ=41.21;MQ0=4;OQ=465.21;QD=3.21;SB=-60.11 GT:AD:DP:GL:GQ 0/1:116,29:131:-89.28,-39.48,-409.01:99
-chr1 3088100 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=132;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=40.45;MQ0=11;OQ=130.52;QD=0.99;SB=-31.41 GT:AD:DP:GL:GQ 0/1:119,13:106:-48.30,-31.97,-302.63:99
-chr1 3088101 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=40.49;MQ0=10;OQ=71.07;QD=0.55;SB=-5.78 GT:AD:DP:GL:GQ 0/1:117,11:111:-47.37,-36.98,-326.83:99
-chr1 3088217 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=80;Dels=0.01;HRun=0;HaplotypeScore=17.08;MQ=42.86;MQ0=1;OQ=126.54;QD=1.58;SB=-85.23 GT:AD:DP:GL:GQ 0/1:66,13:74:-37.94,-22.00,-241.16:99
-chr1 3088220 rs34886760 A G 0.65 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.01;HRun=1;HaplotypeScore=12.97;MQ=43.96;MQ0=1;OQ=1584.16;QD=20.84;SB=-521.89 GT:AD:DP:GL:GQ 0/1:11,64:65:-181.29,-19.59,-39.63:99
-chr1 3088304 rs61759175 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=118;Dels=0.08;HRun=0;HaplotypeScore=55.59;MQ=46.00;MQ0=11;OQ=251.71;QD=2.13;SB=81.71 GT:AD:DP:GL:GQ 0/1:90,18:102:-58.89,-30.43,-301.97:99
-chr1 3088575 rs2817134 T C 3.03 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=5.64;MQ=59.45;MQ0=0;OQ=1472.39;QD=35.06;SB=-604.20 GT:AD:DP:GL:GQ 1/1:0,42:42:-150.84,-12.65,-0.02:99
-chr1 3088745 rs2651931 C T 32.64 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=59.44;MQ0=0;OQ=1502.67;QD=36.65;SB=-632.85 GT:AD:DP:GL:GQ 1/1:0,40:38:-153.86,-11.45,-0.01:99
-chr1 3088761 rs2817135 T C 98.95 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.39;MQ0=0;OQ=1114.54;QD=29.33;SB=-484.51 GT:AD:DP:GL:GQ 1/1:0,38:36:-115.07,-10.86,-0.04:99
-chr1 3089054 rs950200 A G 135.40 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.38;MQ0=0;OQ=1494.35;QD=33.21;SB=-586.20 GT:AD:DP:GL:GQ 1/1:0,45:43:-153.04,-12.95,-0.02:99
-chr1 3091593 rs9660914 G A 174.18 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.63;MQ0=0;OQ=2157.13;QD=34.24;SB=-1073.97 GT:AD:DP:GL:GQ 1/1:0,63:58:-219.33,-17.49,-0.04:99
-chr1 3093686 rs4233024 C T 199.19 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.75;MQ0=0;OQ=1964.65;QD=37.78;SB=-829.97 GT:AD:DP:GL:GQ 1/1:0,52:51:-200.08,-15.37,-0.03:99
-chr1 3094490 rs10752733 A G 125.27 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1561.08;QD=30.61;SB=-635.88 GT:AD:DP:GL:GQ 1/1:0,51:49:-159.74,-14.78,-0.04:99
-chr1 3094942 rs2817136 G A 89.99 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1690.06;QD=36.74;SB=-568.32 GT:AD:DP:GL:GQ 1/1:0,46:44:-172.61,-13.26,-0.02:99
-chr1 3095136 rs2817138 T G 4.52 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=58.92;MQ0=0;OQ=1072.43;QD=24.94;SB=-511.45 GT:AD:DP:GL:GQ 1/1:0,43:37:-110.87,-11.16,-0.04:99
-chr1 3095423 rs2651919 G T 722.39 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2110.88;QD=35.78;SB=-952.39 GT:AD:DP:GL:GQ 1/1:0,59:58:-214.69,-17.47,-0.02:99
-chr1 3095697 rs2651918 T C 14.21 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=3.68;MQ=59.20;MQ0=0;OQ=1955.56;QD=33.72;SB=-956.98 GT:AD:DP:GL:GQ 1/1:0,58:55:-199.16,-16.57,-0.02:99
-chr1 3095769 rs2817139 A G 514.86 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=1684.86;QD=27.18;SB=-755.66 GT:AD:DP:GL:GQ 1/1:0,62:53:-172.12,-15.99,-0.05:99
-chr1 3095922 rs7530075 G A 526.13 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1784.81;QD=39.66;SB=-851.64 GT:AD:DP:GL:GQ 1/1:0,45:45:-182.08,-13.55,-0.01:99
-chr1 3096128 rs2651917 C G 97.32 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.80;MQ0=0;OQ=1717.27;QD=36.54;SB=-542.46 GT:AD:DP:GL:GQ 1/1:0,47:42:-175.34,-12.67,-0.03:99
-chr1 3096165 rs7545798 A G 335.50 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=1218.45;QD=30.46;SB=-546.04 GT:AD:DP:GL:GQ 1/1:0,40:39:-125.47,-11.76,-0.04:99
-chr1 3096243 rs7545871 A G 179.87 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1274.76;QD=30.35;SB=-481.26 GT:AD:DP:GL:GQ 1/1:0,42:39:-131.09,-11.76,-0.02:99
-chr1 3096257 rs2651916 C T 670.34 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1810.18;QD=36.20;SB=-763.02 GT:AD:DP:GL:GQ 1/1:0,50:47:-184.62,-14.16,-0.02:99
-chr1 3096476 rs2817140 A G 6.35 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1038.30;QD=28.84;SB=-515.16 GT:AD:DP:GL:GQ 1/1:0,36:34:-107.45,-10.26,-0.04:99
-chr1 3096661 rs61759179 G A 1.83 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.55;MQ=53.62;MQ0=2;OQ=1172.74;QD=30.07;SB=-520.65 GT:AD:DP:GL:GQ 1/1:8,31:31:-120.87,-9.34,-0.01:93.29
-chr1 3096814 rs2817141 T C 22.79 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=1.30;MQ=59.19;MQ0=0;OQ=1269.17;QD=27.59;SB=-620.79 GT:AD:DP:GL:GQ 1/1:0,46:42:-130.56,-12.68,-0.06:99
-chr1 3097140 rs1875451 C T 277.41 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.63;MQ0=0;OQ=1807.86;QD=35.45;SB=-805.30 GT:AD:DP:GL:GQ 1/1:0,51:46:-184.39,-13.86,-0.02:99
-chr1 3098276 rs2651914 T G 143.53 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=2148.66;QD=35.22;SB=-1029.38 GT:AD:DP:GL:GQ 1/1:0,61:61:-218.47,-18.37,-0.02:99
-chr1 3098356 rs10737190 G A 615.19 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=3298.92;QD=39.75;SB=-1410.68 GT:AD:DP:GL:GQ 1/1:0,83:81:-328.89,-24.40,-0.02:99
-chr1 3098377 rs6685614 G A 280.84 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.78;MQ0=0;OQ=3233.06;QD=38.95;SB=-1261.68 GT:AD:DP:GL:GQ 1/1:0,83:82:-327.11,-24.71,-0.03:99
-chr1 3099011 rs7539775 G A 230.88 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.47;MQ0=0;OQ=1818.76;QD=34.98;SB=-678.01 GT:AD:DP:GL:GQ 1/1:1,51:49:-188.18,-14.77,-2.72:99
-chr1 3100277 rs2651913 C G 465.83 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1755.38;QD=41.79;SB=-899.81 GT:AD:DP:GL:GQ 1/1:0,42:41:-179.13,-12.35,-0.01:99
-chr1 3100595 rs2651912 T C 68.37 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=4.22;MQ=58.95;MQ0=0;OQ=646.58;QD=10.43;SB=-279.12 GT:AD:DP:GL:GQ 0/1:33,29:56:-84.82,-16.88,-119.30:99
-chr1 3104232 . G A 37.52 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=60.00;MQ0=0;OQ=572.60;QD=16.36;SB=-260.57 GT:AD:DP:GL:GQ 0/1:16,19:33:-70.49,-9.94,-51.89:99
-chr1 3105581 rs950449 C G 114.98 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=352.20;QD=14.09;SB=-136.76 GT:AD:DP:GL:GQ 0/1:14,11:24:-45.74,-7.23,-56.39:99
-chr1 3106518 rs2651923 T C 555.63 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=1262.70;QD=28.70;SB=-607.93 GT:AD:DP:GL:GQ 1/1:0,44:40:-129.89,-12.07,-0.04:99
-chr1 3110061 rs2817142 T C 84.27 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=58.76;MQ0=0;OQ=950.22;QD=27.95;SB=-463.20 GT:AD:DP:GL:GQ 1/1:1,33:31:-98.64,-9.35,-0.03:93.20
-chr1 3113619 rs2817143 T C 475.54 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1485.25;QD=30.31;SB=-541.01 GT:AD:DP:GL:GQ 1/1:0,49:46:-152.15,-13.87,-0.04:99
-chr1 3119305 . C T 6.85 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=482.22;QD=12.06;SB=-197.28 GT:AD:DP:GL:GQ 0/1:23,17:38:-62.96,-11.45,-76.10:99
-chr1 3119433 rs60892783 T A 341.04 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.85;MQ0=0;OQ=778.15;QD=15.26;SB=-381.44 GT:AD:DP:GL:GQ 0/1:26,25:51:-96.46,-15.36,-96.60:99
-chr1 3124191 rs12124147 C T 18.37 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=1.41;MQ=60.00;MQ0=0;OQ=2106.36;QD=38.30;SB=-923.21 GT:AD:DP:GL:GQ 1/1:0,55:54:-214.24,-16.27,-0.02:99
-chr1 3125697 . G A 48.02 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=59.58;MQ0=0;OQ=894.40;QD=16.26;SB=-426.44 GT:AD:DP:GL:GQ 0/1:28,27:53:-108.70,-15.98,-81.48:99
-chr1 3133804 rs10737191 T C 216.08 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.05;MQ0=0;OQ=1310.90;QD=29.79;SB=-629.85 GT:AD:DP:GL:GQ 1/1:0,44:43:-134.73,-12.98,-0.05:99
-chr1 3137939 rs2651921 T C 31.09 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.62;MQ=57.88;MQ0=0;OQ=1318.12;QD=31.38;SB=-539.87 GT:AD:DP:GL:GQ 1/1:0,42:38:-135.41,-11.45,-0.01:99
-chr1 3139859 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=4;HaplotypeScore=1.59;MQ=58.84;MQ0=0;OQ=177.35;QD=4.43;SB=56.21 GT:AD:DP:GL:GQ 0/1:24,16:34:-31.27,-10.25,-94.47:99
-chr1 3140395 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=11.19;MQ=58.95;MQ0=0;OQ=93.28;QD=2.12;SB=71.27 GT:AD:DP:GL:GQ 0/1:31,13:33:-22.56,-9.95,-125.01:99
-chr1 3146326 rs2455112 A G 135.43 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=60.00;MQ0=0;OQ=1096.93;QD=16.88;SB=-503.18 GT:AD:DP:GL:GQ 0/1:28,37:65:-132.56,-19.58,-110.95:99
-chr1 3151094 . T G 27.85 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=10.51;MQ=58.72;MQ0=0;QD=0.55;SB=62.22 GT:AD:DP:GL:GQ 0/1:29,22:34:-16.31,-10.24,-101.82:60.68
-chr1 3154977 . C T 20.55 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.05;MQ0=0;OQ=960.26;QD=19.60;SB=-359.36 GT:AD:DP:GL:GQ 0/1:20,29:48:-113.77,-14.46,-73.03:99
-chr1 3155966 rs1105111 C A 740.08 Indel AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=6;HaplotypeScore=0.00;MQ=60.39;MQ0=0;QD=13.46;SB=-187.60 GT:AD:DP:GL:GQ 0/1:28,27:54:-93.56,-16.26,-102.62:99
-chr1 3156860 . C A 1.29 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=2.70;MQ=59.41;MQ0=0;OQ=714.68;QD=18.33;SB=-335.33 GT:AD:DP:GL:GQ 0/1:15,24:39:-86.50,-11.75,-50.10:99
-chr1 3157063 rs60443258 C G 197.93 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.43;MQ0=0;OQ=467.30;QD=14.16;SB=-190.23 GT:AD:DP:GL:GQ 0/1:18,15:33:-59.97,-9.95,-75.73:99
-chr1 3158034 rs11589327 C T 221.90 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=55.82;MQ0=0;OQ=602.02;QD=14.68;SB=-226.92 GT:AD:DP:GL:GQ 0/1:22,19:39:-75.24,-11.75,-65.81:99
-chr1 3158063 rs61759183 G A 105.26 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.23;MQ=54.25;MQ0=0;OQ=859.64;QD=18.29;SB=-349.39 GT:AD:DP:GL:GQ 0/1:17,30:44:-102.53,-13.28,-49.01:99
-chr1 3158107 rs55987640 G A 184.91 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=55.61;MQ0=0;OQ=836.43;QD=16.73;SB=-292.80 GT:AD:DP:GL:GQ 0/1:21,29:42:-99.58,-12.65,-57.74:99
-chr1 3158110 rs10909910 G C 37.93 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=55.78;MQ0=0;OQ=2043.92;QD=39.31;SB=-983.24 GT:AD:DP:GL:GQ 1/1:0,52:49:-208.00,-14.77,-0.02:99
-chr1 3158140 rs10797386 A G 147.32 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=58.66;MQ0=0;OQ=1752.75;QD=33.71;SB=-820.65 GT:AD:DP:GL:GQ 1/1:0,52:49:-178.87,-14.76,-0.02:99
-chr1 3158322 rs12143201 C T 107.15 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=58.81;MQ0=0;OQ=1087.80;QD=19.78;SB=-426.85 GT:AD:DP:GL:GQ 0/1:23,32:54:-128.34,-16.28,-69.54:99
-chr1 3158948 rs7539489 G A 212.35 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.64;MQ=59.50;MQ0=0;OQ=701.66;QD=15.25;SB=-203.89 GT:AD:DP:GL:GQ 0/1:22,24:42:-86.11,-12.66,-64.73:99
-chr1 3160428 rs56015432 C G 319.35 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=42.71;MQ0=18;OQ=1056.37;QD=11.61;SB=-361.10 GT:AD:DP:GL:GQ 0/1:52,38:68:-131.78,-22.86,-160.18:99
-chr1 3160647 rs2376494 T C 490.07 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.54;MQ0=5;OQ=1049.98;QD=13.46;SB=-449.81 GT:AD:DP:GL:GQ 0/1:34,44:69:-129.08,-20.80,-121.01:99
-chr1 3160969 rs61691507 T C 83.17 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=3;HaplotypeScore=0.96;MQ=48.88;MQ0=0;OQ=936.08;QD=14.18;SB=-414.90 GT:AD:DP:GL:GQ 0/1:32,34:63:-115.87,-18.98,-126.60:99
-chr1 3161244 rs28883366 T C 328.67 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=20.07;MQ0=44;OQ=827.10;QD=11.18;SB=-204.07 GT:AD:DP:GL:GQ 1/1:25,49:28:-86.33,-8.45,-0.03:84.18
-chr1 3161789 rs4648464 G A 197.91 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=53.22;MQ0=0;OQ=1078.68;QD=20.35;SB=-414.45 GT:AD:DP:GL:GQ 0/1:21,32:51:-126.53,-15.37,-60.62:99
-chr1 3161922 rs4648465 G A 93.86 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=50.73;MQ0=0;OQ=1117.60;QD=22.35;SB=-454.98 GT:AD:DP:GL:GQ 0/1:18,32:50:-130.11,-15.06,-59.43:99
-chr1 3162133 rs2455100 T C 1.91 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=58.24;MQ0=0;OQ=1353.88;QD=28.21;SB=-366.45 GT:AD:DP:GL:GQ 1/1:0,48:45:-139.02,-13.58,-0.05:99
-chr1 3162911 rs6699624 G C 272.84 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.50;MQ0=0;OQ=1093.08;QD=16.07;SB=-449.43 GT:AD:DP:GL:GQ 0/1:32,35:63:-131.59,-19.00,-134.16:99
-chr1 3163088 rs1971330 C T 114.07 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=49.78;MQ0=0;OQ=900.72;QD=19.58;SB=-445.49 GT:AD:DP:GL:GQ 0/1:19,27:44:-106.61,-13.25,-68.73:99
-chr1 3163142 rs1971331 A G 155.18 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=39.25;MQ0=0;OQ=1400.23;QD=30.44;SB=-715.29 GT:AD:DP:GL:GQ 1/1:0,46:45:-143.65,-13.57,-0.04:99
-chr1 3165231 rs10909912 T G 383.69 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.06;MQ0=0;OQ=430.36;QD=10.76;SB=-234.78 GT:AD:DP:GL:GQ 0/1:20,20:39:-58.07,-11.75,-73.52:99
-chr1 3165588 rs2455101 A G 194.31 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.36;MQ0=0;OQ=514.34;QD=12.86;SB=-185.55 GT:AD:DP:GL:GQ 0/1:18,22:37:-65.87,-11.15,-65.63:99
-chr1 3165783 . C T 13.80 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=427.64;QD=9.30;SB=-160.18 GT:AD:DP:GL:GQ 0/1:30,16:42:-58.70,-12.66,-94.89:99
-chr1 3166230 . C G 139.63 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=825.87;QD=15.88;SB=-367.51 GT:AD:DP:GL:GQ 0/1:23,29:49:-100.65,-14.78,-100.14:99
-chr1 3167106 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=181.43;MQ=36.47;MQ0=0;OQ=530.53;QD=4.31;SB=-209.32 GT:AD:DP:GL:GQ 0/1:66,39:92:-95.27,-38.93,-253.94:99
-chr1 3167116 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=174;Dels=0.01;HRun=1;HaplotypeScore=260.94;MQ=34.61;MQ0=0;OQ=942.41;QD=5.42;SB=-369.43 GT:AD:DP:GL:GQ 0/1:66,57:123:-208.12,-110.59,-323.19:99
-chr1 3167119 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=191;Dels=0.00;HRun=1;HaplotypeScore=217.51;MQ=34.08;MQ0=0;OQ=198.48;QD=1.04;SB=93.36 GT:AD:DP:GL:GQ 0/1:148,42:118:-61.70,-38.57,-398.62:99
-chr1 3167131 . G A 38.92 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=216;Dels=0.00;HRun=0;HaplotypeScore=418.78;MQ=33.67;MQ0=0;QD=0.18;SB=-15.26 GT:AD:DP:GL:GQ 0/1:171,44:118:-42.73,-35.55,-373.47:71.75
-chr1 3167160 . G A 609.50 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=190;Dels=0.00;HRun=0;HaplotypeScore=319.28;MQ=32.32;MQ0=1;QD=3.21;SB=-149.32 GT:AD:DP:GL:GQ 0/1:134,56:72:-85.93,-21.70,-173.92:99
-chr1 3167161 . T C 245.51 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=188;Dels=0.00;HRun=0;HaplotypeScore=318.96;MQ=32.30;MQ0=1;QD=1.31;SB=53.20 GT:AD:DP:GL:GQ 0/1:174,14:59:-45.63,-17.79,-171.10:99
-chr1 3167162 . G A 200.87 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=187;Dels=0.00;HRun=0;HaplotypeScore=336.60;MQ=32.32;MQ0=1;QD=1.07;SB=56.18 GT:AD:DP:GL:GQ 0/1:174,10:62:-51.08,-27.71,-180.52:99
-chr1 3167163 . G A 107.11 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=184;Dels=0.00;HRun=0;HaplotypeScore=325.93;MQ=32.20;MQ0=1;QD=0.58;SB=-62.93 GT:AD:DP:GL:GQ 0/1:163,18:64:-33.28,-19.29,-195.22:99
-chr1 3167166 . A G 243.37 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=314.12;MQ=31.98;MQ0=1;QD=1.36;SB=56.35 GT:AD:DP:GL:GQ 0/1:138,41:62:-46.30,-18.68,-187.52:99
-chr1 3167169 . A G 120.84 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=185;Dels=0.00;HRun=1;HaplotypeScore=387.92;MQ=32.13;MQ0=1;QD=0.65;SB=76.41 GT:AD:DP:GL:GQ 0/1:141,44:79:-39.18,-23.81,-262.75:99
-chr1 3167180 rs57179041 G A 114.65 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=141;Dels=0.00;HRun=1;HaplotypeScore=408.58;MQ=31.71;MQ0=1;QD=0.81;SB=86.30 GT:AD:DP:GL:GQ 0/1:118,23:43:-27.70,-12.95,-132.25:99
-chr1 3167181 . A G 38.85 DPFilter;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=419.93;MQ=31.63;MQ0=1;QD=0.28;SB=86.30 GT:AD:DP:GL:GQ 0/1:108,33:42:-19.82,-12.66,-143.77:71.68
-chr1 3167187 . T C 11.48 DPFilter;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=120;Dels=0.41;HRun=0;HaplotypeScore=330.20;MQ=31.90;MQ0=1;QD=0.10;SB=5.04 GT:AD:DP:GL:GQ 0/1:52,5:44:-17.05,-12.65,-148.02:44
-chr1 3167189 . G A 33.08 DPFilter;Indel;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=123;Dels=0.12;HRun=1;HaplotypeScore=208.65;MQ=32.18;MQ0=1;QD=0.27;SB=8.05 GT:AD:DP:GL:GQ 0/1:103,5:46:-20.45,-13.86,-154.58:65.91
-chr1 3167200 rs57648616 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=119;Dels=0.00;HRun=0;HaplotypeScore=125.27;MQ=33.30;MQ0=1;OQ=406.22;QD=3.41;SB=39.53 GT:AD:DP:GL:GQ 0/1:44,74:56:-63.73,-19.82,-152.72:99
-chr1 3167205 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=115;Dels=0.00;HRun=1;HaplotypeScore=95.81;MQ=33.44;MQ0=1;OQ=560.09;QD=4.87;SB=72.41 GT:AD:DP:GL:GQ 0/1:70,45:71:-80.68,-21.39,-190.32:99
-chr1 3167222 rs57879698 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=105.67;MQ=36.94;MQ0=1;OQ=371.38;QD=4.08;SB=65.41 GT:AD:DP:GL:GQ 0/1:54,36:67:-60.61,-20.18,-198.91:99
-chr1 3167226 . A G 25.97 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=94.17;MQ=37.02;MQ0=1;QD=0.29;SB=104.36 GT:AD:DP:GL:GQ 0/1:77,13:68:-26.37,-20.49,-239.07:58.80
-chr1 3167247 . A G 94.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=9.30;MQ=43.30;MQ0=0;QD=1.30;SB=66.40 GT:AD:DP:GL:GQ 0/1:60,13:64:-32.03,-19.29,-213.53:99
-chr1 3167248 rs61151413 C T 166.25 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=15.29;MQ=43.46;MQ0=0;QD=2.31;SB=80.73 GT:AD:DP:GL:GQ 0/1:59,13:65:-39.51,-19.60,-174.44:99
-chr1 3167253 . A G 43.60 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=1;HaplotypeScore=18.65;MQ=43.75;MQ0=0;QD=0.56;SB=110.39 GT:AD:DP:GL:GQ 0/1:68,10:69:-28.43,-20.79,-243.20:76.44
-chr1 3167258 . G A 29.42 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=1;HaplotypeScore=29.46;MQ=43.75;MQ0=0;QD=0.38;SB=107.33 GT:AD:DP:GL:GQ 0/1:71,7:70:-27.32,-21.09,-225.20:62.25
-chr1 3167340 rs3002685 A G 235.56 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=44.86;MQ0=0;OQ=812.94;QD=11.29;SB=-432.88 GT:AD:DP:GL:GQ 0/1:35,37:64:-103.87,-19.29,-131.86:99
-chr1 3167551 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=15;HaplotypeScore=12.64;MQ=52.48;MQ0=0;OQ=368.96;QD=5.95;SB=77.28 GT:AD:DP:GL:GQ 0/1:44,18:52:-55.84,-15.67,-137.44:99
-chr1 3168576 . C T 188.74 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.69;MQ0=0;OQ=823.49;QD=13.72;SB=-404.84 GT:AD:DP:GL:GQ 0/1:34,26:58:-103.11,-17.48,-109.21:99
-chr1 3169081 . C T 79.34 PASS AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.66;MQ0=0;OQ=1096.77;QD=16.37;SB=-547.56 GT:AD:DP:GL:GQ 0/1:32,35:63:-131.94,-18.98,-108.41:99
-chr1 3169567 rs1501611 G A 10.13 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=8.26;MQ=58.29;MQ0=0;OQ=520.16;QD=12.69;SB=-281.22 GT:AD:DP:GL:GQ 0/1:21,20:36:-66.15,-10.85,-62.40:99
-chr1 3169746 rs2455106 G C 285.96 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1036.68;QD=23.56;SB=-535.79 GT:AD:DP:GL:GQ 0/1:15,29:43:-119.91,-12.96,-65.17:99
-chr1 3170018 rs2455107 T G 277.10 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.50;MQ0=0;OQ=669.75;QD=14.56;SB=-280.87 GT:AD:DP:GL:GQ 0/1:21,25:42:-82.91,-12.65,-66.12:99
-chr1 3170493 rs2455102 A G 356.81 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.62;MQ0=0;OQ=653.73;QD=10.21;SB=-205.32 GT:AD:DP:GL:GQ 0/1:37,27:63:-87.64,-18.99,-144.47:99
-chr1 3170958 . C T 1.10 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.86;MQ=59.55;MQ0=0;OQ=1035.67;QD=20.31;SB=-528.11 GT:AD:DP:GL:GQ 0/1:20,31:50:-121.92,-15.07,-64.72:99
-chr1 3171559 rs2500250 T C 389.53 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=559.12;QD=10.55;SB=-252.33 GT:AD:DP:GL:GQ 0/1:30,23:52:-74.86,-15.66,-123.43:99
-chr1 3171782 rs10909913 A G 116.69 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=2.90;MQ=59.63;MQ0=0;OQ=1003.48;QD=15.93;SB=-509.29 GT:AD:DP:GL:GQ 0/1:27,35:61:-122.01,-18.38,-106.15:99
-chr1 3172391 rs2455096 A C 43.29 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=287.98;QD=8.47;SB=-120.97 GT:AD:DP:GL:GQ 0/1:18,16:31:-41.43,-9.34,-63.22:99
-chr1 3172429 rs56042628 C T 96.48 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=280.31;QD=9.34;SB=-80.59 GT:AD:DP:GL:GQ 0/1:19,11:28:-39.76,-8.44,-58.47:99
-chr1 3173020 rs2455094 G A 166.70 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=59.53;MQ0=0;OQ=444.07;QD=11.10;SB=-203.69 GT:AD:DP:GL:GQ 0/1:22,17:34:-57.94,-10.25,-64.34:99
-chr1 3173727 rs2455093 A G 256.03 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=832.24;QD=16.98;SB=-357.94 GT:AD:DP:GL:GQ 0/1:20,29:47:-100.67,-14.16,-75.12:99
-chr1 3174715 rs2455119 G T 285.04 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.49;MQ0=0;OQ=576.42;QD=12.81;SB=-209.45 GT:AD:DP:GL:GQ 0/1:23,22:42:-73.58,-12.65,-77.54:99
-chr1 3176001 . C T 83.35 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.70;MQ0=0;OQ=696.01;QD=13.92;SB=-293.84 GT:AD:DP:GL:GQ 0/1:26,23:46:-86.76,-13.88,-73.45:99
-chr1 3176267 . T G 76.55 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=60.00;MQ0=0;OQ=841.56;QD=14.76;SB=-394.65 GT:AD:DP:GL:GQ 0/1:27,30:56:-104.31,-16.87,-93.27:99
-chr1 3177045 rs3002687 T G 225.19 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=59.59;MQ0=0;OQ=571.62;QD=12.43;SB=-258.88 GT:AD:DP:GL:GQ 0/1:24,22:45:-74.00,-13.56,-84.05:99
-chr1 3177468 . C T 3.04 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.42;MQ0=0;OQ=538.59;QD=16.83;SB=-100.92 GT:AD:DP:GL:GQ 0/1:14,18:31:-66.48,-9.34,-49.83:99
-chr1 3177939 rs2500308 A G 95.88 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=59.39;MQ0=0;OQ=763.00;QD=10.04;SB=-332.88 GT:AD:DP:GL:GQ 0/1:45,31:71:-100.98,-21.39,-171.46:99
-chr1 3178661 . G A 33.39 PASS AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=60.00;MQ0=0;OQ=796.34;QD=18.96;SB=-401.21 GT:AD:DP:GL:GQ 0/1:18,24:42:-95.58,-12.66,-58.00:99
-chr1 3178998 rs2455127 A G 173.30 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=58.67;MQ0=0;OQ=507.17;QD=14.49;SB=-257.35 GT:AD:DP:GL:GQ 0/1:11,24:30:-63.05,-9.05,-41.23:99
-chr1 3179379 . A G 65.56 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=58.32;MQ0=0;OQ=481.41;QD=12.34;SB=-241.93 GT:AD:DP:GL:GQ 0/1:18,21:37:-62.58,-11.16,-65.22:99
-chr1 3179574 rs2455128 A G 108.65 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.62;MQ0=0;OQ=838.70;QD=13.98;SB=-378.24 GT:AD:DP:GL:GQ 0/1:31,29:59:-104.93,-17.77,-121.27:99
-chr1 3179592 rs2500307 T A 726.45 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2101.50;QD=36.23;SB=-987.86 GT:AD:DP:GL:GQ 1/1:0,58:58:-213.75,-17.47,-0.02:99
-chr1 3182386 rs2500304 T C 246 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.51;MQ0=0;OQ=550.86;QD=11.72;SB=-174.37 GT:AD:DP:GL:GQ 0/1:23,24:45:-71.94,-13.57,-90.75:99
-chr1 3182819 rs2455131 A G 160.52 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=53.72;MQ0=0;OQ=380.67;QD=9.28;SB=-185.58 GT:AD:DP:GL:GQ 0/1:26,15:41:-53.71,-12.35,-99.70:99
-chr1 3183091 . T G 31.12 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.54;MQ=48.96;MQ0=0;QD=0.80;SB=16.16 GT:AD:DP:GL:GQ 0/1:34,5:37:-17.54,-11.14,-116.34:63.95
-chr1 3183092 . C A 30.14 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=9.54;MQ=48.87;MQ0=0;QD=0.74;SB=14.77 GT:AD:DP:GL:GQ 0/1:36,5:37:-17.45,-11.16,-100.79:62.97
-chr1 3183861 rs55923982 G C 139.29 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.45;MQ0=0;OQ=542.30;QD=11.79;SB=-148.38 GT:AD:DP:GL:GQ 0/1:27,19:44:-70.78,-13.27,-111.52:99
-chr1 3184193 rs2455115 A G 314.03 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=53.52;MQ0=0;OQ=598.87;QD=12.22;SB=-281.59 GT:AD:DP:GL:GQ 0/1:25,24:48:-77.64,-14.47,-94.87:99
-chr1 3185401 . G T 101.68 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.51;MQ0=0;OQ=440.43;QD=11.59;SB=-233.97 GT:AD:DP:GL:GQ 0/1:19,19:33:-57.27,-9.94,-56.75:99
-chr1 3187015 . G A 77.56 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=59.67;MQ0=0;OQ=971.62;QD=17.05;SB=-421.44 GT:AD:DP:GL:GQ 0/1:28,29:55:-117.01,-16.57,-95.93:99
-chr1 3188693 rs905137 A G 186.40 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=484.36;QD=10.09;SB=-266.22 GT:AD:DP:GL:GQ 0/1:25,23:44:-64.98,-13.26,-96.26:99
-chr1 3189244 rs905136 A G 4.18 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=4;HaplotypeScore=2.03;MQ=60.00;MQ0=0;OQ=654.87;QD=15.97;SB=-328.31 GT:AD:DP:GL:GQ 0/1:18,23:38:-80.22,-11.45,-60.36:99
-chr1 3189344 rs905135 A C 1.64 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=6.41;MQ=59.54;MQ0=0;OQ=215.02;QD=4.30;SB=-100.13 GT:AD:DP:GL:GQ 0/1:35,15:44:-38.04,-13.26,-114.24:99
-chr1 3189859 rs2500302 T C 241.97 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.92;MQ0=0;OQ=339.74;QD=8.71;SB=-144.67 GT:AD:DP:GL:GQ 0/1:23,16:37:-48.41,-11.15,-86.58:99
-chr1 3190143 rs56004439 G A 2.42 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=8.41;MQ=57.37;MQ0=0;OQ=401.65;QD=8.37;SB=-155.21 GT:AD:DP:GL:GQ 0/1:33,15:46:-57.32,-13.87,-99.82:99
-chr1 3190754 . G A 32.75 PASS AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1225.08;QD=18.85;SB=-426.92 GT:AD:DP:GL:GQ 0/1:29,36:64:-145.07,-19.28,-99.09:99
-chr1 3190930 rs6685398 C A 88.85 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=4.12;MQ=60.00;MQ0=0;OQ=531.21;QD=13.28;SB=-273.35 GT:AD:DP:GL:GQ 0/1:21,19:39:-68.15,-11.75,-68.57:99
-chr1 3190993 rs6690217 A C 128.36 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1454.60;QD=28.52;SB=-648.68 GT:AD:DP:GL:GQ 1/1:0,51:48:-149.09,-14.47,-0.05:99
-chr1 3192051 . C T 11.01 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.25;MQ0=0;OQ=927.90;QD=18.56;SB=-215.90 GT:AD:DP:GL:GQ 0/1:20,30:48:-110.53,-14.46,-70.14:99
-chr1 3192870 rs10797387 A C 142.29 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.89;MQ=59.80;MQ0=0;OQ=775.82;QD=12.93;SB=-322.85 GT:AD:DP:GL:GQ 0/1:30,30:54:-97.13,-16.27,-96.18:99
-chr1 3193262 . A G 27.47 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=435.09;QD=14.04;SB=-158.61 GT:AD:DP:GL:GQ 0/1:13,18:29:-55.53,-8.74,-48.24:99
-chr1 3193691 rs12024838 G C 0.85 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=9.20;MQ=52.13;MQ0=0;OQ=313.95;QD=12.08;SB=-105.65 GT:AD:DP:GL:GQ 0/1:16,10:19:-40.41,-5.73,-35.18:99
-chr1 3193692 rs61759191 C T 0.47 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=9.20;MQ=52.13;MQ0=0;OQ=179.56;QD=6.91;SB=-26.50 GT:AD:DP:GL:GQ 0/1:18,8:19:-26.97,-5.73,-38.66:99
-chr1 3193738 rs10909916 C G 2.42 PASS AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=6.33;MQ=40.46;MQ0=4;OQ=154.87;QD=11.06;SB=-44.90 GT:AD:DP:GL:GQ 0/1:9,5:7:-20.88,-2.11,-8.99:68.77
-chr1 3194086 rs6687930 T C 3.78 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=48.01;MQ0=1;OQ=344.21;QD=18.12;SB=-6.99 GT:AD:DP:GL:GQ 0/1:2,17:14:-41.92,-4.22,-8.13:39.10
-chr1 3194355 rs2134119 C G 59.27 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.23;MQ=54.23;MQ0=0;OQ=781.76;QD=15.95;SB=-353.76 GT:AD:DP:GL:GQ 0/1:22,27:44:-94.74,-13.28,-81.77:99
-chr1 3194394 rs2455117 T A 339.54 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.31;MQ0=0;OQ=679.10;QD=15.43;SB=-276.72 GT:AD:DP:GL:GQ 0/1:22,22:42:-83.84,-12.65,-73.08:99
-chr1 3197040 rs2250291 C T 260.09 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.34;MQ0=0;OQ=469.67;QD=13.42;SB=-216.70 GT:AD:DP:GL:GQ 0/1:18,17:34:-60.50,-10.25,-62.96:99
-chr1 3197640 rs55866132 G A 241.93 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=60.00;MQ0=0;OQ=793.46;QD=13.45;SB=-307.77 GT:AD:DP:GL:GQ 0/1:34,25:59:-100.40,-17.77,-123.91:99
-chr1 3197902 rs2500297 C T 238.37 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=60.00;MQ0=0;OQ=756.06;QD=14.00;SB=-170.24 GT:AD:DP:GL:GQ 0/1:30,24:49:-93.65,-14.77,-87.43:99
-chr1 3198235 rs10909918 A G 238.34 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=490.49;QD=8.92;SB=-208.46 GT:AD:DP:GL:GQ 0/1:32,23:51:-67.70,-15.37,-121.94:99
-chr1 3198466 . G A 262.64 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=604.73;QD=12.34;SB=-281.22 GT:AD:DP:GL:GQ 0/1:28,21:46:-77.62,-13.87,-86.11:99
-chr1 3199356 rs2500295 T C 571.16 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.75;MQ0=0;OQ=1482.44;QD=28.51;SB=-763.58 GT:AD:DP:GL:GQ 1/1:0,52:48:-151.88,-14.48,-0.05:99
-chr1 3199491 rs4648376 G A 14.27 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=4.90;MQ=58.90;MQ0=0;OQ=2231.72;QD=37.83;SB=-1015.37 GT:AD:DP:GL:GQ 1/1:0,59:58:-226.79,-17.49,-0.03:99
-chr1 3199627 rs2500294 C T 622.47 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=2326.22;QD=38.77;SB=-1091.37 GT:AD:DP:GL:GQ 1/1:0,60:58:-236.22,-17.47,-0.02:99
-chr1 3199783 rs1553291 A G 564.79 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=1581.83;QD=29.29;SB=-575.98 GT:AD:DP:GL:GQ 1/1:0,54:51:-161.82,-15.38,-0.05:99
-chr1 3200187 . C T 35.88 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.26;MQ=59.60;MQ0=0;OQ=491.30;QD=10.45;SB=-217.71 GT:AD:DP:GL:GQ 0/1:29,18:43:-65.37,-12.96,-91.60:99
-chr1 3200810 rs4648468 A G 447.48 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1398.57;QD=30.40;SB=-596.06 GT:AD:DP:GL:GQ 1/1:0,46:43:-143.47,-12.96,-0.03:99
-chr1 3201105 rs10047257 C T 220.48 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=596.34;QD=15.29;SB=-318.86 GT:AD:DP:GL:GQ 0/1:20,19:38:-74.37,-11.45,-63.70:99
-chr1 3201318 rs4648377 A C 538.98 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1615.09;QD=33.65;SB=-661.05 GT:AD:DP:GL:GQ 1/1:0,48:47:-165.11,-14.16,-0.02:99
-chr1 3201410 rs4648469 A G 202.17 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1230.36;QD=30.76;SB=-513.23 GT:AD:DP:GL:GQ 1/1:0,39:38:-126.64,-11.45,-0.02:99
-chr1 3201613 rs4648470 C T 79.16 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1081.89;QD=24.59;SB=-515.59 GT:AD:DP:GL:GQ 0/1:12,32:43:-124.44,-12.96,-36.35:99
-chr1 3202053 rs2500292 A G 471 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1432.25;QD=32.55;SB=-511.16 GT:AD:DP:GL:GQ 1/1:0,44:41:-146.83,-12.35,-0.02:99
-chr1 3202174 rs2500291 C T 728.69 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2429.46;QD=38.56;SB=-1207.61 GT:AD:DP:GL:GQ 1/1:1,62:61:-246.55,-18.37,-0.01:99
-chr1 3202451 rs2500290 G C 18.43 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=58.98;MQ0=0;OQ=1616.44;QD=39.43;SB=-797.54 GT:AD:DP:GL:GQ 1/1:0,41:39:-165.25,-11.76,-0.02:99
-chr1 3202782 rs1875452 C G 157.50 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.36;MQ=59.54;MQ0=0;OQ=2035.33;QD=40.71;SB=-884.21 GT:AD:DP:GL:GQ 1/1:0,50:48:-207.14,-14.47,-0.02:99
-chr1 3202806 rs2500289 A G 260.23 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.19;MQ0=0;OQ=1923.10;QD=33.74;SB=-724.29 GT:AD:DP:GL:GQ 1/1:0,57:54:-195.91,-16.27,-0.02:99
-chr1 3203962 rs2500288 T C 186.16 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.58;MQ0=0;OQ=1801.36;QD=32.75;SB=-828.32 GT:AD:DP:GL:GQ 1/1:0,55:51:-183.74,-15.36,-0.02:99
-chr1 3204030 rs7553849 T C 226.01 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=56.20;MQ0=0;OQ=1684.70;QD=29.05;SB=-851.52 GT:AD:DP:GL:GQ 1/1:0,58:53:-172.10,-15.99,-0.05:99
-chr1 3204380 rs10442593 A G 67.15 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=958.98;QD=29.97;SB=-369.57 GT:AD:DP:GL:GQ 1/1:0,32:28:-99.49,-8.43,-0.01:84.24
-chr1 3204592 rs2455144 A G 617.75 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2332.51;QD=29.90;SB=-1027.75 GT:AD:DP:GL:GQ 1/1:0,78:74:-236.91,-22.33,-0.08:99
-chr1 3204835 . G A 53.06 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.06;MQ=60.00;MQ0=0;OQ=892.55;QD=15.13;SB=-296.23 GT:AD:DP:GL:GQ 0/1:30,29:55:-109.11,-16.57,-93.52:99
-chr1 3204852 rs2500287 G T 86 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=2470.97;QD=33.85;SB=-613.02 GT:AD:DP:GL:GQ 1/1:1,71:71:-250.71,-21.39,-0.03:99
-chr1 3205054 . A G 35.05 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=60.00;MQ0=0;OQ=563.88;QD=10.44;SB=-299.62 GT:AD:DP:GL:GQ 0/1:29,25:52:-75.34,-15.67,-118.24:99
-chr1 3205180 rs2455143 A T 124.60 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=58.71;MQ0=0;OQ=2383.23;QD=36.67;SB=-1091.65 GT:AD:DP:GL:GQ 1/1:0,65:64:-241.93,-19.28,-0.02:99
-chr1 3205492 rs2455142 T G 512.17 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.74;MQ0=0;OQ=2083.81;QD=29.77;SB=-759.91 GT:AD:DP:GL:GQ 1/1:0,70:70:-212.03,-21.10,-0.07:99
-chr1 3205734 rs2455141 A C 27.67 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=40.69;MQ0=0;OQ=504.37;QD=19.40;SB=-155.27 GT:AD:DP:GL:GQ 1/1:2,24:21:-57.94,-6.33,-3.92:24.11
-chr1 3205761 rs2455140 T G 0.29 PASS AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=2.39;MQ=22.97;MQ0=1;OQ=235.32;QD=18.10;SB=-39.00 GT:AD:DP:GL:GQ 0/1:2,10:9:-29.50,-2.71,-3.64:9.30
-chr1 3205805 rs12728296 T C 26.83 LowQual AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=13.68;MQ0=0;QD=1.79;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:2:-6.09,-0.60,-0.00:6.01
-chr1 3205846 . G A 232.99 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.36;MQ0=0;OQ=538.85;QD=13.47;SB=-237.77 GT:AD:DP:GL:GQ 0/1:19,21:21:-63.50,-6.33,-16.25:99
-chr1 3206300 rs12036713 A G 35.28 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=14.04;MQ0=4;QD=5.04;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,7:2:-6.94,-0.60,-0.00:6.02
-chr1 3206493 . T G 46.28 PASS AC=2;AF=1.00;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=17.34;MQ0=4;OQ=70.14;QD=6.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,10:3:-10.50,-0.90,-0.00:9.03
-chr1 3206505 . T C 3.40 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=18.66;MQ0=4;OQ=95.85;QD=6.85;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,9:5:-14.37,-1.51,-4.06:25.51
-chr1 3206506 . A G 5.49 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=18.66;MQ0=4;OQ=74.94;QD=5.35;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,9:5:-12.29,-1.51,-3.97:24.63
-chr1 3206538 . G A 1.11 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=18.43;MQ0=3;OQ=73.15;QD=5.23;SB=-10.00 GT:AD:DP:GL:GQ 0/1:7,7:4:-11.80,-1.21,-3.10:18.92
-chr1 3206554 rs56276321 T G 10.51 LowQual AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=19.60;MQ0=3;QD=0.53;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,5:8:-6.70,-2.41,-21.47:42.94
-chr1 3206566 . T C 28.09 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=22.53;MQ0=2;OQ=145.15;QD=6.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,9:12:-21.41,-3.62,-22.84:99
-chr1 3206567 . A G 6.01 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.53;MQ0=2;OQ=85.83;QD=4.09;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,9:11:-15.19,-3.32,-21.71:99
-chr1 3206577 . C T 7.20 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=22.19;MQ0=2;OQ=218.94;QD=10.43;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,11:11:-28.49,-3.31,-13.17:98.62
-chr1 3206588 . A C 10.65 LowQual AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=2.88;MQ=22.98;MQ0=0;QD=0.59;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,6:7:-6.42,-2.11,-14.50:43.09
-chr1 3206599 . G A 2.11 PASS AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=22.00;MQ0=0;OQ=65.71;QD=4.11;SB=-10.00 GT:AD:DP:GL:GQ 0/1:7,9:7:-11.98,-2.12,-8.40:62.78
-chr1 3206700 . A G 0.69 PASS AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.64;MQ0=1;OQ=276.82;QD=18.45;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,14:12:-34.36,-3.62,-3.48:2.36
-chr1 3206761 . A G 22.65 LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=26.60;MQ0=1;QD=0.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,10:32:-15.20,-9.65,-103.92:55.47
-chr1 3206926 rs61759194 A G 113.52 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.49;MQ=46.00;MQ0=0;OQ=649.36;QD=10.82;SB=-346.23 GT:AD:DP:GL:GQ 0/1:29,31:46:-82.08,-13.86,-88.11:99
-chr1 3207011 rs2455137 C T 379.46 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=48.62;MQ0=0;OQ=1983.22;QD=35.41;SB=-860.00 GT:AD:DP:GL:GQ 1/1:0,56:50:-201.92,-15.06,-0.01:99
-chr1 3207294 rs2500284 G A 102.13 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=58.88;MQ0=0;OQ=2616.26;QD=39.05;SB=-1335.76 GT:AD:DP:GL:GQ 1/1:1,66:66:-265.23,-19.89,-0.02:99
-chr1 3208189 rs2455136 A T 142.28 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=59.12;MQ0=0;OQ=2529.01;QD=36.65;SB=-1261.52 GT:AD:DP:GL:GQ 1/1:0,69:68:-256.50,-20.48,-0.02:99
-chr1 3208783 rs2500283 G C 612.26 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2831.75;QD=42.91;SB=-1184.48 GT:AD:DP:GL:GQ 1/1:0,66:66:-286.78,-19.89,-0.02:99
-chr1 3209357 rs2500282 A G 594.44 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1981.22;QD=32.48;SB=-526.13 GT:AD:DP:GL:GQ 1/1:0,61:61:-201.75,-18.39,-0.04:99
-chr1 3209761 rs2455135 A G 63.74 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1623.95;QD=30.64;SB=-619.36 GT:AD:DP:GL:GQ 1/1:0,53:46:-165.99,-13.85,-0.01:99
-chr1 3210242 rs2500281 G A 563.38 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.01;MQ0=0;OQ=1613.10;QD=35.07;SB=-716.96 GT:AD:DP:GL:GQ 1/1:0,46:42:-164.91,-12.65,-0.01:99
-chr1 3210275 rs2455134 A G 102.15 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.21;MQ0=0;OQ=983.95;QD=25.89;SB=-399.50 GT:AD:DP:GL:GQ 1/1:0,38:28:-101.99,-8.43,-0.01:84.26
-chr1 3210353 rs2455133 C G 65.09 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=35.62;MQ0=2;OQ=1518.72;QD=29.78;SB=-723.73 GT:AD:DP:GL:GQ 1/1:4,47:41:-164.26,-12.36,-8.80:35.57
-chr1 3210943 rs2455132 T C 34.33 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=58.65;MQ0=0;OQ=1292.96;QD=28.73;SB=-546.03 GT:AD:DP:GL:GQ 1/1:1,44:43:-137.07,-12.97,-4.19:87.75
-chr1 3211298 rs56357655 G T 236.14 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=570.69;QD=13.59;SB=-286.33 GT:AD:DP:GL:GQ 0/1:20,22:39:-72.10,-11.75,-66.92:99
-chr1 3211481 rs4648378 A T 264.07 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1968.99;QD=35.80;SB=-994.60 GT:AD:DP:GL:GQ 1/1:0,55:54:-200.50,-16.27,-0.02:99
-chr1 3212566 rs3923081 A G 604.08 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1445.27;QD=30.75;SB=-602.58 GT:AD:DP:GL:GQ 1/1:0,47:46:-148.15,-13.87,-0.04:99
-chr1 3213090 rs4648471 A G 181.27 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=58.96;MQ0=0;OQ=1176.67;QD=14.53;SB=-570.90 GT:AD:DP:GL:GQ 0/1:40,41:78:-144.45,-23.50,-149.52:99
-chr1 3213140 rs4233025 C T 288.86 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.52;MQ0=0;OQ=3371.29;QD=38.75;SB=-1393.36 GT:AD:DP:GL:GQ 1/1:0,86:84:-336.13,-25.31,-0.03:99
-chr1 3213393 rs4648472 G A 290.65 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=58.95;MQ0=0;OQ=2168.73;QD=34.98;SB=-915.32 GT:AD:DP:GL:GQ 1/1:0,61:56:-220.48,-16.87,-0.02:99
-chr1 3213624 rs4648473 A G 299.83 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=2351.35;QD=35.09;SB=-1180.73 GT:AD:DP:GL:GQ 1/1:0,67:67:-238.75,-20.18,-0.03:99
-chr1 3213815 rs4145901 A G 578.32 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1913.13;QD=34.78;SB=-765.19 GT:AD:DP:GL:GQ 1/1:0,55:55:-194.92,-16.57,-0.02:99
-chr1 3214070 rs4145900 C T 633.07 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=2312.37;QD=39.87;SB=-883.19 GT:AD:DP:GL:GQ 1/1:0,58:58:-234.84,-17.47,-0.01:99
-chr1 3214663 rs2483258 A G 141.81 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.74;MQ=58.20;MQ0=0;OQ=1545.60;QD=32.89;SB=-781.14 GT:AD:DP:GL:GQ 1/1:0,47:45:-158.16,-13.56,-0.02:99
-chr1 3215654 rs2500279 A G 10.26 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1630.84;QD=29.65;SB=-792.65 GT:AD:DP:GL:GQ 1/1:0,55:51:-166.71,-15.38,-0.04:99
-chr1 3215800 rs2500278 C T 196.13 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.49;MQ=60.00;MQ0=0;OQ=2097.43;QD=35.55;SB=-1034.29 GT:AD:DP:GL:GQ 1/1:1,57:55:-213.35,-16.58,-0.03:99
-chr1 3216399 rs59127130 T A 71.30 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=59.01;MQ0=0;OQ=500.47;QD=10.65;SB=-267.66 GT:AD:DP:GL:GQ 0/1:27,19:45:-66.90,-13.56,-91.26:99
-chr1 3218505 . G T 13.88 PASS AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=59.42;MQ0=0;OQ=562.03;QD=14.05;SB=-143.82 GT:AD:DP:GL:GQ 0/1:17,23:34:-69.73,-10.24,-51.47:99
-chr1 3223491 rs2500277 T C 605.12 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1039.56;QD=14.85;SB=-437.57 GT:AD:DP:GL:GQ 0/1:34,36:70:-128.33,-21.09,-137.20:99
-chr1 3227069 rs2500274 G A 733.97 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2547.84;QD=38.03;SB=-1230.64 GT:AD:DP:GL:GQ 1/1:0,67:65:-258.39,-19.58,-0.02:99
-chr1 3231689 rs2500271 A G 65.84 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=6.09;MQ=58.05;MQ0=0;OQ=618.77;QD=12.89;SB=-326.13 GT:AD:DP:GL:GQ 0/1:22,25:43:-80.91,-15.74,-76.88:99
-chr1 3232314 rs2500270 C T 276.80 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=58.93;MQ0=0;OQ=890.12;QD=13.69;SB=-466.96 GT:AD:DP:GL:GQ 0/1:37,28:63:-111.27,-18.97,-132.21:99
-chr1 3232391 rs7521865 T C 80.12 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.46;MQ0=0;OQ=581.07;QD=12.11;SB=-302.66 GT:AD:DP:GL:GQ 0/1:25,23:45:-74.95,-13.56,-94.63:99
-chr1 3232424 rs11576578 C T 337.83 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=583.63;QD=16.21;SB=-245.53 GT:AD:DP:GL:GQ 0/1:18,18:35:-72.19,-10.55,-57.05:99
-chr1 3232513 rs2500268 C T 2.29 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.10;MQ0=0;OQ=81.92;QD=2.64;SB=-51.23 GT:AD:DP:GL:GQ 0/1:26,5:28:-19.91,-8.44,-80.68:99
-chr1 3232545 rs7550743 G C 135.04 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=204.00;QD=6.18;SB=-89.25 GT:AD:DP:GL:GQ 0/1:25,8:26:-31.53,-7.85,-72.48:99
-chr1 3233210 rs2483268 C T 55.97 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.45;MQ0=0;OQ=685.34;QD=20.16;SB=-292.33 GT:AD:DP:GL:GQ 0/1:13,21:31:-81.16,-9.34,-34.58:99
-chr1 3233282 rs2483269 C T 150.37 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.51;MQ0=0;OQ=931.05;QD=19.81;SB=-450.84 GT:AD:DP:GL:GQ 0/1:20,27:46:-110.24,-13.86,-67.60:99
-chr1 3234117 rs2483270 T C 92.91 PASS AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=54.48;MQ0=0;OQ=186.80;QD=8.90;SB=-89.99 GT:AD:DP:GL:GQ 0/1:13,8:21:-28.30,-6.33,-49.94:99
-chr1 3235659 rs56368529 T G 3.22 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=4.81;MQ=58.01;MQ0=0;OQ=299.04;QD=9.06;SB=-59.90 GT:AD:DP:GL:GQ 0/1:16,17:27:-41.32,-8.14,-54.29:99
-chr1 3236031 rs55929121 A G 111.89 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.44;MQ0=0;OQ=382.21;QD=9.32;SB=-138.40 GT:AD:DP:GL:GQ 0/1:24,17:41:-53.86,-12.36,-96.85:99
-chr1 3237249 rs2483272 T C 227.71 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=58.89;MQ0=0;OQ=695.19;QD=16.55;SB=-364.39 GT:AD:DP:GL:GQ 0/1:17,25:40:-84.86,-12.05,-61.97:99
-chr1 3237696 rs11577229 A C 60.92 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=59.46;MQ0=0;OQ=605.90;QD=14.09;SB=-151.87 GT:AD:DP:GL:GQ 0/1:20,23:42:-76.53,-12.66,-70.16:99
-chr1 3237725 rs2483273 C T 273.62 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=458.56;QD=11.46;SB=-253.26 GT:AD:DP:GL:GQ 0/1:23,17:37:-60.29,-11.15,-74.02:99
-chr1 3237958 rs2483274 A G 334.60 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=489.91;QD=10.42;SB=-162.48 GT:AD:DP:GL:GQ 0/1:24,23:45:-65.84,-13.57,-92.79:99
-chr1 3238582 rs56033677 T C 21.15 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.43;MQ0=0;OQ=296.91;QD=9.00;SB=-160.33 GT:AD:DP:GL:GQ 0/1:18,15:30:-42.02,-9.04,-67.71:99
-chr1 3238892 rs55807399 G T 41.07 PASS AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=58.83;MQ0=0;OQ=103.10;QD=6.44;SB=-69.87 GT:AD:DP:GL:GQ 0/1:10,6:13:-17.51,-3.92,-27.55:99
-chr1 3239158 . C T 1.04 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.48;MQ0=0;OQ=666.04;QD=18.50;SB=-35.64 GT:AD:DP:GL:GQ 0/1:16,20:35:-80.44,-10.55,-47.82:99
-chr1 3239323 . G A 79.22 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=885.68;QD=16.10;SB=-289.76 GT:AD:DP:GL:GQ 0/1:28,27:52:-107.52,-15.67,-84.40:99
-chr1 3240283 rs1889121 A G 183.83 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.44;MQ0=0;OQ=423.56;QD=10.86;SB=-163.96 GT:AD:DP:GL:GQ 0/1:18,20:36:-60.24,-14.60,-67.49:99
-chr1 3241019 rs1110307 T C 317.91 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.03;MQ0=0;OQ=790.39;QD=11.80;SB=-362.96 GT:AD:DP:GL:GQ 0/1:34,33:66:-102.22,-19.90,-132.82:99
-chr1 3241835 rs4648477 G A 340.85 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.63;MQ0=0;OQ=880.63;QD=17.27;SB=-457.99 GT:AD:DP:GL:GQ 0/1:24,27:48:-105.81,-14.46,-75.34:99
-chr1 3241867 rs4648478 C T 165.67 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.81;MQ=58.72;MQ0=0;OQ=927.39;QD=18.18;SB=-291.79 GT:AD:DP:GL:GQ 0/1:22,29:49:-110.80,-14.77,-66.95:99
-chr1 3241964 rs2483278 C T 199.87 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=4.49;MQ=58.47;MQ0=0;OQ=815.99;QD=11.33;SB=-270.80 GT:AD:DP:GL:GQ 0/1:44,28:65:-104.47,-19.59,-130.43:99
-chr1 3242641 rs10797388 C T 87.31 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.66;MQ0=0;OQ=1468.23;QD=21.91;SB=-716.28 GT:AD:DP:GL:GQ 0/1:24,43:63:-169.09,-18.98,-69.99:99
-chr1 3243022 rs4648479 C G 270.01 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.32;MQ0=0;OQ=1259.62;QD=18.52;SB=-604.54 GT:AD:DP:GL:GQ 0/1:33,35:68:-149.74,-20.49,-145.47:99
-chr1 3243475 rs2500264 A G 371.99 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=57.70;MQ0=0;OQ=965.24;QD=13.04;SB=-435.59 GT:AD:DP:GL:GQ 0/1:35,39:72:-121.52,-21.71,-132.46:99
-chr1 3243538 rs2500263 C T 449.25 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=59.43;MQ0=0;OQ=1163.15;QD=14.36;SB=-551.30 GT:AD:DP:GL:GQ 0/1:44,37:79:-143.40,-23.80,-157.59:99
-chr1 3243563 rs10909933 A T 21.76 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=5.38;MQ=58.82;MQ0=0;OQ=1256.33;QD=15.90;SB=-624.35 GT:AD:DP:GL:GQ 0/1:39,40:77:-152.11,-23.19,-142.90:99
-chr1 3243699 rs7516137 C G 384.73 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.95;MQ0=1;OQ=1414.58;QD=19.38;SB=-612.10 GT:AD:DP:GL:GQ 0/1:31,42:71:-166.15,-21.41,-133.01:99
-chr1 3243749 rs7516150 C T 110.03 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.27;MQ=59.28;MQ0=0;OQ=1059.88;QD=16.56;SB=-511.08 GT:AD:DP:GL:GQ 0/1:31,33:63:-128.25,-18.98,-110.55:99
-chr1 3243801 rs7552331 G A 50.88 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=59.68;MQ0=0;OQ=1395.05;QD=19.38;SB=-586.45 GT:AD:DP:GL:GQ 0/1:31,41:71:-164.18,-21.39,-100.20:99
-chr1 3244201 rs1572038 G A 223.38 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=60.00;MQ0=0;OQ=849.89;QD=14.40;SB=-320.28 GT:AD:DP:GL:GQ 0/1:33,26:58:-105.75,-17.48,-105.23:99
-chr1 3244229 rs1572037 T C 103.02 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=1.14;MQ=59.74;MQ0=0;OQ=759.65;QD=10.70;SB=-211.19 GT:AD:DP:GL:GQ 0/1:40,31:70:-100.34,-21.09,-160.53:99
-chr1 3245634 . G A 2.67 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=5.38;MQ=59.21;MQ0=0;OQ=768.53;QD=14.50;SB=-362.88 GT:AD:DP:GL:GQ 0/1:27,25:49:-94.91,-14.77,-78.82:99
-chr1 3245968 rs1999527 C A 270.72 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.55;MQ0=0;OQ=832.76;QD=16.33;SB=-309.70 GT:AD:DP:GL:GQ 0/1:20,31:46:-100.42,-13.86,-57.62:99
-chr1 3246110 rs1999526 G A 145.25 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.11;MQ=60.00;MQ0=0;OQ=722.36;QD=13.89;SB=-206.02 GT:AD:DP:GL:GQ 0/1:25,26:46:-91.77,-16.25,-79.35:99
-chr1 3247225 rs944819 T G 210.34 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.73;MQ0=0;OQ=1004.82;QD=11.68;SB=-427.67 GT:AD:DP:GL:GQ 0/1:50,36:86:-129.67,-25.90,-183.72:99
-chr1 3247599 rs2483281 C T 240.23 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=58.98;MQ0=0;OQ=504.82;QD=12.31;SB=-180.16 GT:AD:DP:GL:GQ 0/1:24,17:38:-65.21,-11.45,-77.36:99
-chr1 3251376 rs4648379 C T 354.38 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.76;MQ0=0;OQ=1302.21;QD=16.91;SB=-654.31 GT:AD:DP:GL:GQ 0/1:37,40:76:-156.40,-22.89,-133.27:99
-chr1 3251542 rs4415513 C T 583.60 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1033.27;QD=16.67;SB=-449.45 GT:AD:DP:GL:GQ 0/1:31,31:61:-125.00,-18.39,-98.88:99
-chr1 3252129 rs12564920 A G 258.43 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.38;MQ0=0;OQ=448.15;QD=9.96;SB=-222.39 GT:AD:DP:GL:GQ 0/1:23,22:39:-59.86,-11.76,-74.90:99
-chr1 3253722 . G A 5.82 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=951.14;QD=18.65;SB=-376.90 GT:AD:DP:GL:GQ 0/1:22,29:50:-113.46,-15.06,-78.22:99
-chr1 3254050 rs2483289 A C 189.02 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=800.56;QD=13.80;SB=-367.58 GT:AD:DP:GL:GQ 0/1:28,30:55:-99.91,-16.57,-92.54:99
-chr1 3254157 rs2500257 A G 11.73 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=3.42;MQ=59.13;MQ0=0;OQ=570.29;QD=13.26;SB=-176.97 GT:AD:DP:GL:GQ 0/1:21,22:40:-72.37,-12.05,-79.78:99
-chr1 3257948 . G C 98.91 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=35.14;MQ0=0;QD=7.07;SB=14.07 GT:AD:DP:GL:GQ 0/1:10,4:12:-16.79,-3.62,-31.08:99
-chr1 3257994 rs60920916 T C 0.33 PASS AC=1;AF=0.50;AN=2;DB;DP=17;Dels=0.00;HRun=2;HaplotypeScore=2.63;MQ=42.15;MQ0=0;OQ=77.87;QD=4.58;SB=20.08 GT:AD:DP:GL:GQ 0/1:13,4:15:-15.59,-4.52,-39.62:99
-chr1 3258005 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=6.10;MQ=42.12;MQ0=0;OQ=65.85;QD=3.29;SB=23.09 GT:AD:DP:GL:GQ 0/1:16,4:17:-15.00,-5.13,-47.65:98.69
-chr1 3258920 . C T 2.85 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=553.46;QD=12.87;SB=-213.92 GT:AD:DP:GL:GQ 0/1:24,19:40:-70.69,-12.06,-71.24:99
-chr1 3262401 rs7550526 G A 60.02 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=58.89;MQ0=0;OQ=1567.02;QD=37.31;SB=-629.85 GT:AD:DP:GL:GQ 1/1:0,42:40:-160.30,-12.05,-0.01:99
-chr1 3262685 rs946759 C A 62.68 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=-0.12;MQ=57.75;MQ0=0;OQ=630.41;QD=19.70;SB=-314.39 GT:AD:DP:GL:GQ 1/1:3,29:21:-69.14,-6.33,-2.51:38.17
-chr1 3262923 rs946758 G A 287.49 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=59.58;MQ0=0;OQ=2113.36;QD=38.42;SB=-1046.71 GT:AD:DP:GL:GQ 1/1:0,55:53:-214.93,-15.96,-0.01:99
-chr1 3263976 rs55805251 C T 94.04 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=58.59;MQ0=0;OQ=518.72;QD=15.72;SB=-142.59 GT:AD:DP:GL:GQ 0/1:15,18:30:-64.20,-9.04,-43.17:99
-chr1 3264566 rs2483265 T C 43.57 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=868.82;QD=26.33;SB=-460.17 GT:AD:DP:GL:GQ 1/1:0,33:29:-90.50,-8.75,-0.03:87.17
-chr1 3265009 rs12748963 C T 26.51 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.21;MQ=58.97;MQ0=0;OQ=826.30;QD=18.36;SB=-347.35 GT:AD:DP:GL:GQ 0/1:19,25:43:-98.87,-12.96,-59.86:99
-chr1 3266234 rs12073172 G A 592.78 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=1102.37;QD=35.56;SB=-562.26 GT:AD:DP:GL:GQ 1/1:0,31:30:-113.84,-9.05,-0.02:90.27
-chr1 3266600 rs2500280 G C 2.70 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=8.93;MQ=59.31;MQ0=0;OQ=2375.28;QD=38.94;SB=-992.26 GT:AD:DP:GL:GQ 1/1:0,60:56:-241.13,-16.87,-0.02:99
-chr1 3266936 . G A 52.38 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.54;MQ=59.62;MQ0=0;OQ=518.77;QD=10.59;SB=-162.22 GT:AD:DP:GL:GQ 0/1:32,17:48:-69.63,-14.47,-101.23:99
-chr1 3267606 rs884308 C T 94.95 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1579.42;QD=39.49;SB=-771.63 GT:AD:DP:GL:GQ 1/1:0,40:40:-161.54,-12.05,-0.01:99
-chr1 3268390 rs11583116 G A 130.53 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.33;MQ0=0;OQ=690.56;QD=13.81;SB=-242.25 GT:AD:DP:GL:GQ 0/1:26,24:43:-85.30,-12.96,-65.77:99
-chr1 3269184 rs7524171 A G 11.38 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=5.01;MQ=59.60;MQ0=0;OQ=1781.26;QD=30.71;SB=-880.26 GT:AD:DP:GL:GQ 1/1:0,58:53:-181.75,-15.98,-0.04:99
-chr1 3269881 rs2500262 T C 201.27 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.11;MQ0=0;OQ=1534.16;QD=29.50;SB=-546.01 GT:AD:DP:GL:GQ 1/1:0,52:49:-157.05,-14.78,-0.05:99
-chr1 3271322 . C T 58.72 PASS AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=59.40;MQ0=0;OQ=375.26;QD=12.11;SB=-208.89 GT:AD:DP:GL:GQ 0/1:17,14:28:-49.26,-8.45,-45.56:99
-chr1 3273388 rs4648485 G A 602.36 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2075.89;QD=37.74;SB=-912.72 GT:AD:DP:GL:GQ 1/1:0,55:53:-211.19,-15.97,-0.02:99
-chr1 3275010 rs4648486 C T 123.41 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=58.75;MQ0=0;OQ=2039.90;QD=39.23;SB=-914.69 GT:AD:DP:GL:GQ 1/1:0,52:51:-207.59,-15.36,-0.01:99
-chr1 3275164 rs4648487 T C 21.75 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=5.20;MQ=59.14;MQ0=0;OQ=1843.56;QD=34.14;SB=-799.67 GT:AD:DP:GL:GQ 1/1:0,54:53:-187.96,-15.97,-0.02:99
-chr1 3275488 rs6424073 G A 234.48 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2488.63;QD=39.50;SB=-1214.11 GT:AD:DP:GL:GQ 1/1:0,63:63:-252.47,-18.98,-0.02:99
-chr1 3277411 rs12138292 A G 1.83 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.96;MQ=56.17;MQ0=0;OQ=1416.27;QD=24.85;SB=-414.15 GT:AD:DP:GL:GQ 1/1:0,57:48:-145.28,-14.50,-0.07:99
-chr1 3279384 rs12135987 G A 273.93 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.39;MQ0=0;OQ=2572.74;QD=37.83;SB=-927.33 GT:AD:DP:GL:GQ 1/1:0,68:65:-260.88,-19.58,-0.02:99
-chr1 3279467 rs6688949 T C 3.82 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=57.66;MQ0=0;OQ=1297.10;QD=25.94;SB=-450.26 GT:AD:DP:GL:GQ 1/1:0,50:40:-133.33,-12.06,-0.03:99
-chr1 3279589 rs1333190 C T 668.27 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1807.78;QD=36.89;SB=-784.69 GT:AD:DP:GL:GQ 1/1:0,49:46:-184.37,-13.86,-0.01:99
-chr1 3279831 rs1333189 C T 229.74 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.13;MQ0=0;OQ=1483.34;QD=36.18;SB=-765.52 GT:AD:DP:GL:GQ 1/1:0,40:38:-151.93,-11.45,-0.01:99
-chr1 3280999 rs2249860 A C 81.57 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=57.93;MQ0=0;OQ=1454.60;QD=33.83;SB=-752.07 GT:AD:DP:GL:GQ 1/1:0,43:42:-149.06,-12.65,-0.01:99
-chr1 3281067 rs2368593 G T 64.28 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.86;MQ=58.09;MQ0=0;OQ=2257.03;QD=31.79;SB=-1064.90 GT:AD:DP:GL:GQ 1/1:0,70:66:-229.32,-19.89,-0.04:99
-chr1 3281249 . G A 160.30 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.53;MQ0=0;OQ=717.46;QD=13.54;SB=-318.84 GT:AD:DP:GL:GQ 0/1:27,26:46:-88.90,-13.87,-75.19:99
-chr1 3282736 rs4648488 C T 347.36 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.52;MQ0=0;OQ=841.46;QD=17.53;SB=-434.81 GT:AD:DP:GL:GQ 0/1:21,27:46:-101.29,-13.86,-70.83:99
-chr1 3283525 rs4648489 A G 474.54 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1662.64;QD=30.23;SB=-834.46 GT:AD:DP:GL:GQ 1/1:0,55:53:-169.90,-15.99,-0.06:99
-chr1 3284832 rs1538693 G A 695.45 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1980.96;QD=38.10;SB=-939.35 GT:AD:DP:GL:GQ 1/1:0,52:51:-201.70,-15.37,-0.02:99
-chr1 3285724 . G A 0.22 PASS AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=1;HaplotypeScore=6.56;MQ=21.51;MQ0=1;OQ=72.03;QD=9.00;SB=-40.54 GT:AD:DP:GL:GQ 0/1:2,5:4:-11.69,-1.21,-3.37:21.64
-chr1 3285990 . G A 25.35 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=5.35;MQ=15.41;MQ0=12;QD=0.85;SB=-32.52 GT:AD:DP:GL:GQ 0/1:21,9:5:-7.32,-1.51,-9.51:58.18
-chr1 3286144 . A G 36.06 LowQual AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=14.48;MQ0=3;QD=4.51;SB=-6.99 GT:AD:DP:GL:GQ 0/1:4,3:3:-7.79,-0.90,-4.06:31.52
-chr1 3286152 . A C 0.09 PASS AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=27.22;MQ0=3;OQ=114.38;QD=16.34;SB=-46.01 GT:AD:DP:GL:GQ 1/1:0,7:4:-14.97,-1.20,-0.00:12.04
-chr1 3286284 . G A 36.93 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=3.77;MQ=31.49;MQ0=4;QD=1.27;SB=-29.53 GT:AD:DP:GL:GQ 0/1:22,7:15:-11.50,-4.52,-41.17:69.76
-chr1 3286312 . G A 19.94 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=9.31;MQ=28.36;MQ0=5;QD=0.59;SB=-24.50 GT:AD:DP:GL:GQ 0/1:27,6:17:-10.40,-5.13,-47.64:52.73
-chr1 3286320 . C A 227.39 HARD_TO_VALIDATE;Indel AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=8.75;MQ=31.04;MQ0=4;QD=5.98;SB=-25.91 GT:AD:DP:GL:GQ 0/1:27,11:20:-32.05,-6.03,-35.21:99
-chr1 3286354 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=1;HaplotypeScore=6.21;MQ=33.14;MQ0=5;OQ=87.60;QD=2.92;SB=-62.36 GT:AD:DP:GL:GQ 0/1:22,7:14:-19.10,-7.05,-34.67:99
-chr1 3286558 rs61043152 G A 1.11 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=54.01;MQ0=1;OQ=487.76;QD=11.09;SB=-75.56 GT:AD:DP:GL:GQ 0/1:23,21:40:-64.12,-12.06,-79.70:99
-chr1 3286811 . T C 44.59 PASS AC=2;AF=1.00;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=60.00;MQ0=0;OQ=1964.33;QD=34.46;SB=-944.38 GT:AD:DP:GL:GQ 1/1:0,57:56:-200.04,-16.87,-0.02:99
-chr1 3287141 rs11584942 G A 391.20 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.82;MQ0=0;OQ=780.63;QD=15.31;SB=-324.32 GT:AD:DP:GL:GQ 0/1:25,26:47:-95.51,-14.16,-75.83:99
-chr1 3287246 rs11584967 G A 573.67 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=877.40;QD=15.67;SB=-384.91 GT:AD:DP:GL:GQ 0/1:28,28:54:-107.29,-16.27,-98.41:99
-chr1 3287659 rs4648490 A C 117.52 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=58.26;MQ0=0;OQ=1692.37;QD=33.18;SB=-840.06 GT:AD:DP:GL:GQ 1/1:0,51:50:-172.85,-15.06,-0.02:99
-chr1 3290667 rs868688 C T 279.51 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=58.44;MQ0=0;OQ=2018.08;QD=35.40;SB=-933.25 GT:AD:DP:GL:GQ 1/1:0,57:52:-205.41,-15.67,-0.02:99
-chr1 3290990 rs868689 T G 679.66 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1815.91;QD=31.86;SB=-898.65 GT:AD:DP:GL:GQ 1/1:0,57:52:-185.19,-15.66,-0.02:99
-chr1 3292591 rs11810266 C G 73.61 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.54;MQ0=0;OQ=822.36;QD=20.06;SB=-350.43 GT:AD:DP:GL:GQ 0/1:18,23:40:-97.58,-12.06,-74.61:99
-chr1 3293306 rs2245703 T C 622.87 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2385.34;QD=35.60;SB=-962.70 GT:AD:DP:GL:GQ 1/1:0,67:67:-242.14,-20.18,-0.02:99
-chr1 3293627 rs6676024 C T 186.96 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.97;MQ0=0;OQ=1016.67;QD=17.23;SB=-303.79 GT:AD:DP:GL:GQ 0/1:29,30:58:-122.43,-17.48,-92.51:99
-chr1 3293798 rs2065525 C G 62.72 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=58.34;MQ0=0;OQ=2298.73;QD=40.33;SB=-651.91 GT:AD:DP:GL:GQ 1/1:0,56:54:-233.47,-16.27,-0.01:99
-chr1 3294876 rs17399998 C T 445.68 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1142.20;QD=15.23;SB=-563.39 GT:AD:DP:GL:GQ 0/1:40,35:73:-139.51,-22.00,-126.39:99
-chr1 3295312 rs6687463 A G 1.44 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=5.24;MQ=59.03;MQ0=0;OQ=1175.21;QD=27.33;SB=-477.09 GT:AD:DP:GL:GQ 1/1:0,42:38:-121.14,-11.46,-0.04:99
-chr1 3295326 . C A 16.33 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=58.87;MQ0=0;OQ=469.13;QD=12.68;SB=-130.80 GT:AD:DP:GL:GQ 0/1:19,18:34:-60.44,-10.25,-57.03:99
-chr1 3295820 . C T 40.94 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=844.76;QD=17.60;SB=-369.85 GT:AD:DP:GL:GQ 0/1:21,27:46:-101.62,-13.86,-70.72:99
-chr1 3296384 rs6686140 C A 6.91 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=6.50;MQ=59.17;MQ0=0;OQ=324.87;QD=11.60;SB=-121.49 GT:AD:DP:GL:GQ 0/1:8,20:20:-41.81,-6.04,-18.74:99
-chr1 3296715 rs2151350 T G 0.13 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=4;HaplotypeScore=2.18;MQ=58.99;MQ0=0;OQ=1168.63;QD=25.41;SB=-611.86 GT:AD:DP:GL:GQ 1/1:0,46:39:-120.49,-11.76,-0.04:99
-chr1 3297308 rs2493281 A G 8.42 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.21;MQ=58.18;MQ0=1;OQ=1041.73;QD=26.04;SB=-499.54 GT:AD:DP:GL:GQ 1/1:1,39:33:-107.79,-9.95,-0.03:99
-chr1 3297606 rs2493278 T C 732.40 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.88;MQ0=0;OQ=2573.66;QD=35.26;SB=-1043.85 GT:AD:DP:GL:GQ 1/1:0,73:73:-260.97,-21.99,-0.02:99
-chr1 3298358 rs2493268 T C 154.09 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=58.22;MQ0=0;OQ=1688.23;QD=33.76;SB=-851.05 GT:AD:DP:GL:GQ 1/1:0,50:48:-172.42,-14.46,-0.02:99
-chr1 3298817 rs12139767 G C 583.17 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=898.96;QD=13.62;SB=-383.19 GT:AD:DP:GL:GQ 0/1:39,27:65:-112.80,-19.62,-153.47:99
-chr1 3299326 rs35864014 G A 497.53 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1037.02;QD=15.25;SB=-535.48 GT:AD:DP:GL:GQ 0/1:36,32:68:-127.47,-20.48,-131.88:99
-chr1 3301121 rs6702992 C T 313.10 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.53;MQ0=0;OQ=194.21;QD=10.22;SB=-113.94 GT:AD:DP:GL:GQ 0/1:12,7:19:-28.43,-5.72,-42.63:99
-chr1 3301284 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=11;HaplotypeScore=19.15;MQ=56.72;MQ0=0;OQ=88.35;QD=1.38;SB=59.21 GT:AD:DP:GL:GQ 0/1:53,11:56:-28.99,-16.87,-158.63:99
-chr1 3301891 rs883678 C G 91.33 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.56;MQ0=0;OQ=812.38;QD=19.34;SB=-299.58 GT:AD:DP:GL:GQ 0/1:20,22:42:-97.18,-12.66,-83.21:99
-chr1 3302116 rs17822575 T G 316.41 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.54;MQ0=0;OQ=510.49;QD=12.45;SB=-250.83 GT:AD:DP:GL:GQ 0/1:20,21:40:-66.39,-12.05,-67.05:99
-chr1 3302296 rs10909937 C T 502.18 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1321.67;QD=36.71;SB=-625.01 GT:AD:DP:GL:GQ 1/1:0,36:34:-135.76,-10.24,-0.01:99
-chr1 3302524 rs56378103 C T 103.94 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.71;MQ0=0;OQ=1572.33;QD=29.12;SB=-689.92 GT:AD:DP:GL:GQ 1/1:0,52:42:-160.84,-12.66,-0.02:99
-chr1 3302527 . C T 6.09 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=5.35;MQ=58.33;MQ0=0;OQ=1011.78;QD=18.07;SB=-471.49 GT:AD:DP:GL:GQ 0/1:25,31:52:-120.14,-15.67,-71.42:99
-chr1 3302823 rs12726710 C T 452.04 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=952.26;QD=17.31;SB=-305.83 GT:AD:DP:GL:GQ 0/1:25,30:55:-115.09,-16.58,-80.89:99
-chr1 3303142 rs7535965 G A 141.77 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.64;MQ0=0;OQ=1848.10;QD=38.50;SB=-836.62 GT:AD:DP:GL:GQ 1/1:0,48:47:-188.41,-14.16,-0.02:99
-chr1 3304456 rs17822581 A G 359.73 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=58.93;MQ0=0;OQ=1113.18;QD=17.13;SB=-574.04 GT:AD:DP:GL:GQ 0/1:27,38:62:-133.28,-18.68,-95.39:99
-chr1 3304922 rs57432749 C T 181.83 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=2.15;MQ=59.75;MQ0=0;OQ=993.31;QD=13.07;SB=-496.07 GT:AD:DP:GL:GQ 0/1:41,34:74:-127.49,-24.88,-150.46:99
-chr1 3305219 rs12144338 C T 131.32 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.67;MQ0=0;OQ=987.68;QD=17.33;SB=-284.79 GT:AD:DP:GL:GQ 0/1:26,31:53:-118.03,-15.98,-72.20:99
-chr1 3305551 . G A 103.37 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.39;MQ0=0;OQ=1099.92;QD=15.94;SB=-511.04 GT:AD:DP:GL:GQ 0/1:36,33:68:-133.77,-20.49,-112.10:99
-chr1 3305678 rs7542793 G A 440.42 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.35;MQ0=0;OQ=1064.35;QD=16.63;SB=-455.47 GT:AD:DP:GL:GQ 0/1:30,34:62:-128.41,-18.69,-93.40:99
-chr1 3305692 rs12737284 G A 493.84 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=901.95;QD=14.79;SB=-398.19 GT:AD:DP:GL:GQ 0/1:31,30:59:-111.27,-17.79,-96.32:99
-chr1 3305845 rs12117228 T C 284.95 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=60.00;MQ0=0;OQ=892.28;QD=11.74;SB=-260.21 GT:AD:DP:GL:GQ 0/1:38,38:73:-114.51,-22.00,-150.21:99
-chr1 3305873 rs7551733 C G 174.37 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.43;MQ=60.00;MQ0=0;OQ=1089.18;QD=17.02;SB=-530.69 GT:AD:DP:GL:GQ 0/1:32,32:62:-130.89,-18.69,-134.52:99
-chr1 3306535 rs10909939 T C 528.42 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=956.73;QD=17.08;SB=-375.64 GT:AD:DP:GL:GQ 0/1:23,33:55:-115.53,-16.57,-90.24:99
-chr1 3306616 rs10909940 G A 39.73 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=1181.64;QD=23.63;SB=-497.15 GT:AD:DP:GL:GQ 0/1:15,35:49:-136.22,-14.77,-45.61:99
-chr1 3306995 rs12743248 G A 92.64 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.54;MQ0=0;OQ=921.67;QD=15.36;SB=-465.48 GT:AD:DP:GL:GQ 0/1:29,31:55:-112.03,-16.58,-86.62:99
-chr1 3307093 rs12747145 G A 172.06 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.50;MQ0=0;OQ=526.33;QD=14.23;SB=-229.52 GT:AD:DP:GL:GQ 0/1:18,17:34:-69.44,-13.52,-51.06:99
-chr1 3307640 rs6424074 A G 354.64 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.52;MQ0=0;OQ=483.77;QD=10.08;SB=-196.29 GT:AD:DP:GL:GQ 0/1:28,20:48:-66.12,-14.46,-114.20:99
-chr1 3307747 rs6424075 G T 374.77 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.24;MQ0=0;OQ=884.55;QD=14.04;SB=-359.35 GT:AD:DP:GL:GQ 0/1:31,32:59:-109.52,-17.78,-88.61:99
-chr1 3308193 rs7551796 G A 363.24 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.69;MQ0=0;OQ=1293.28;QD=17.24;SB=-465.48 GT:AD:DP:GL:GQ 0/1:35,40:71:-154.00,-21.39,-119.84:99
-chr1 3308294 rs11576794 C T 278.53 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=57.73;MQ0=0;OQ=809.01;QD=14.19;SB=-410.42 GT:AD:DP:GL:GQ 0/1:31,26:56:-101.07,-16.88,-98.51:99
-chr1 3308295 rs11577526 A G 45.03 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.09;MQ=57.69;MQ0=0;OQ=1861.63;QD=33.24;SB=-741.99 GT:AD:DP:GL:GQ 1/1:0,56:55:-189.77,-16.57,-0.03:99
-chr1 3308392 rs11578011 T C 195.41 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.80;MQ0=0;OQ=1812.46;QD=30.21;SB=-790.65 GT:AD:DP:GL:GQ 1/1:0,59:59:-188.08,-20.60,-3.25:99
-chr1 3308574 rs5024246 G A 333.57 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=876.20;QD=19.47;SB=-325.85 GT:AD:DP:GL:GQ 0/1:19,26:45:-104.46,-13.56,-63.60:99
-chr1 3308629 rs10909942 C G 63.18 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.03;HRun=0;HaplotypeScore=2.61;MQ=58.12;MQ0=0;OQ=1384.57;QD=36.44;SB=-590.68 GT:AD:DP:GL:GQ 1/1:0,37:37:-142.07,-10.86,-0.03:99
-chr1 3308702 rs56148282 G A 636.18 Indel AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.59;MQ0=0;QD=19.28;SB=-248.56 GT:AD:DP:GL:GQ 0/1:12,21:30:-75.94,-9.04,-37.32:99
-chr1 3308921 rs1889124 A G 16.57 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.23;MQ=58.83;MQ0=0;OQ=1016.70;QD=28.24;SB=-485.51 GT:AD:DP:GL:GQ 1/1:0,36:33:-105.29,-9.95,-0.03:99
-chr1 3309492 rs4353034 G A 0.09 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=16.76;MQ=57.87;MQ0=0;OQ=200.25;QD=6.07;SB=-37.01 GT:AD:DP:GL:GQ 0/1:23,8:31:-40.02,-16.71,-79.20:99
-chr1 3309534 rs12562397 C T 380.45 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=1380.14;QD=38.34;SB=-494.65 GT:AD:DP:GL:GQ 1/1:0,36:35:-141.61,-10.54,-0.01:99
-chr1 3309541 rs12562399 C G 28.59 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.39;MQ0=0;OQ=1543.76;QD=40.63;SB=-639.90 GT:AD:DP:GL:GQ 1/1:0,38:37:-157.97,-11.15,-0.01:99
-chr1 3309637 rs4471209 G A 344.14 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.51;MQ0=0;OQ=382.91;QD=10.08;SB=-184.19 GT:AD:DP:GL:GQ 0/1:25,13:37:-52.73,-11.16,-73.72:99
-chr1 3309732 rs6664364 C T 134.87 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.91;MQ0=0;OQ=1699.09;QD=36.15;SB=-803.59 GT:AD:DP:GL:GQ 1/1:0,47:44:-173.51,-13.26,-0.01:99
-chr1 3309737 rs6664369 C T 130.20 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.53;MQ0=0;OQ=1859.42;QD=37.95;SB=-907.23 GT:AD:DP:GL:GQ 1/1:0,49:48:-189.54,-14.46,-0.02:99
-chr1 3309924 rs6669407 A G 328.05 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=995.86;QD=29.29;SB=-353.80 GT:AD:DP:GL:GQ 1/1:0,34:32:-103.20,-9.65,-0.03:96.22
-chr1 3310023 rs2493286 G C 420.47 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1672.06;QD=40.78;SB=-718.73 GT:AD:DP:GL:GQ 1/1:0,41:40:-170.80,-12.05,-0.01:99
-chr1 3310336 rs6657675 G A 148.97 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=58.38;MQ0=0;OQ=936.76;QD=20.36;SB=-332.89 GT:AD:DP:GL:GQ 0/1:17,29:43:-109.92,-12.96,-52.69:99
-chr1 3310582 rs55820208 C T 260.28 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=862.76;QD=19.61;SB=-355.48 GT:AD:DP:GL:GQ 0/1:19,25:43:-102.51,-12.95,-64.90:99
-chr1 3311027 rs41315264 C A 149.68 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.45;MQ0=0;OQ=411.02;QD=12.09;SB=-182.52 GT:AD:DP:GL:GQ 0/1:19,15:31:-53.72,-9.34,-57.20:99
-chr1 3311596 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=4;HaplotypeScore=11.58;MQ=54.22;MQ0=0;OQ=65.40;QD=1.42;SB=47.17 GT:AD:DP:GL:GQ 0/1:36,10:29:-18.61,-8.78,-88.90:98.24
-chr1 3312969 rs2483222 T C 325.01 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.04;MQ0=0;OQ=585.55;QD=11.71;SB=-306.07 GT:AD:DP:GL:GQ 0/1:25,25:48:-76.31,-14.47,-93.64:99
-chr1 3313057 rs2483223 T G 88.19 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.28;MQ0=0;OQ=1723.37;QD=26.93;SB=-826.52 GT:AD:DP:GL:GQ 1/1:0,64:57:-175.98,-17.18,-0.06:99
-chr1 3313337 rs2493304 A G 110.36 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=57.61;MQ0=0;OQ=687.56;QD=10.91;SB=-122.49 GT:AD:DP:GL:GQ 0/1:35,28:61:-90.42,-18.38,-140.37:99
-chr1 3313476 rs2483224 C T 77.82 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.15;MQ=58.48;MQ0=0;OQ=742.74;QD=16.15;SB=-389.41 GT:AD:DP:GL:GQ 0/1:21,25:42:-90.21,-12.66,-65.08:99
-chr1 3314069 rs2493303 G C 188.15 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=4.50;MQ=59.20;MQ0=0;OQ=943.60;QD=16.27;SB=-364.47 GT:AD:DP:GL:GQ 0/1:29,29:57:-114.83,-17.19,-120.69:99
-chr1 3314293 rs2493302 A T 133.12 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=59.50;MQ0=0;OQ=1593.32;QD=34.64;SB=-633.61 GT:AD:DP:GL:GQ 1/1:0,46:43:-162.93,-12.95,-0.01:99
-chr1 3314897 rs2483225 T C 612.21 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.62;MQ0=0;OQ=1899.06;QD=30.14;SB=-687.73 GT:AD:DP:GL:GQ 1/1:0,63:60:-193.54,-18.10,-0.05:99
-chr1 3315120 rs12063572 A G 188.23 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.59;MQ0=0;OQ=550.32;QD=9.83;SB=-278.26 GT:AD:DP:GL:GQ 0/1:32,24:53:-74.29,-15.98,-116.93:99
-chr1 3315180 rs12063579 A G 62.82 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.22;MQ=57.82;MQ0=1;OQ=599.80;QD=10.91;SB=-262.60 GT:AD:DP:GL:GQ 0/1:27,28:47:-77.44,-14.18,-83.26:99
-chr1 3315190 rs2493301 G C 0.26 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=15.61;MQ=57.11;MQ0=1;OQ=860.03;QD=14.83;SB=-355.44 GT:AD:DP:GL:GQ 0/1:31,27:50:-104.37,-15.08,-104.68:99
-chr1 3315194 rs12063613 A G 1.95 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=10.46;MQ=56.06;MQ0=1;OQ=577.86;QD=9.47;SB=-271.10 GT:AD:DP:GL:GQ 0/1:30,31:51:-76.46,-15.39,-99.42:99
-chr1 3315219 . C T 17.67 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=15.64;MQ=52.76;MQ0=1;QD=0.26;SB=34.67 GT:AD:DP:GL:GQ 0/1:62,6:62:-23.74,-18.70,-180.77:50.43
-chr1 3315354 rs12065021 T C 254.87 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=59.68;MQ0=0;OQ=519.08;QD=13.66;SB=-277.27 GT:AD:DP:GL:GQ 0/1:17,21:38:-66.65,-11.46,-65.47:99
-chr1 3315386 rs2493300 A G 19.22 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=1158.12;QD=28.95;SB=-549.05 GT:AD:DP:GL:GQ 1/1:0,40:37:-119.43,-11.16,-0.04:99
-chr1 3315441 rs2493299 A G 105.98 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=60.00;MQ0=0;OQ=1355.37;QD=28.24;SB=-603.93 GT:AD:DP:GL:GQ 1/1:0,48:44:-139.17,-13.27,-0.04:99
-chr1 3315528 rs55929648 C T 143.11 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=56.18;MQ0=0;OQ=1041.13;QD=18.59;SB=-362.91 GT:AD:DP:GL:GQ 0/1:25,31:52:-123.07,-15.67,-66.96:99
-chr1 3315772 rs2493298 C A 135.74 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=60.00;MQ0=0;OQ=850.76;QD=17.72;SB=-447.55 GT:AD:DP:GL:GQ 0/1:19,29:48:-102.82,-14.46,-64.75:99
-chr1 3315954 rs36070715 C G 3.94 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.72;MQ=51.04;MQ0=0;OQ=1102.41;QD=21.62;SB=-424.97 GT:AD:DP:GL:GQ 0/1:21,30:46:-127.39,-13.87,-69.58:99
-chr1 3316002 rs60965010 G A 53.41 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=53.52;MQ0=0;OQ=683.65;QD=15.19;SB=-341.33 GT:AD:DP:GL:GQ 0/1:23,22:41:-84.00,-12.35,-71.37:99
-chr1 3316048 rs59831144 A G 16.76 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=6.55;MQ=58.48;MQ0=0;OQ=584.41;QD=12.70;SB=-233.93 GT:AD:DP:GL:GQ 0/1:24,22:41:-74.08,-12.36,-76.23:99
-chr1 3316091 rs2493297 G A 148.61 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.53;MQ0=0;OQ=1649.32;QD=33.66;SB=-643.25 GT:AD:DP:GL:GQ 1/1:0,49:44:-168.54,-13.26,-0.02:99
-chr1 3316251 . G A 182.76 SnpCluster AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=43.92;MQ0=0;QD=3.10;SB=-111.51 GT:AD:DP:GL:GQ 0/1:47,12:54:-37.83,-16.27,-156.64:99
-chr1 3316256 . T C 219.54 SnpCluster AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=43.18;MQ0=0;QD=3.66;SB=-32.48 GT:AD:DP:GL:GQ 0/1:44,16:55:-41.82,-16.58,-163.02:99
-chr1 3316258 rs7364679 G T 370 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=43.51;MQ0=0;QD=6.07;SB=-108.68 GT:AD:DP:GL:GQ 0/1:43,18:56:-57.15,-16.87,-140.13:99
-chr1 3316271 . G T 44.21 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=42.99;MQ0=0;OQ=836.87;QD=13.72;SB=-249.23 GT:AD:DP:GL:GQ 0/1:29,32:52:-102.65,-15.68,-71.94:99
-chr1 3316274 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=55.35;MQ=42.03;MQ0=0;OQ=122.20;QD=2.07;SB=-76.97 GT:AD:DP:GL:GQ 0/1:47,12:53:-31.48,-15.98,-148.32:99
-chr1 3316287 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=56;Dels=0.04;HRun=0;HaplotypeScore=28.34;MQ=46.39;MQ0=0;OQ=249.44;QD=4.45;SB=13.22 GT:AD:DP:GL:GQ 0/1:42,12:52:-43.29,-15.07,-133.82:99
-chr1 3316288 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=24.35;MQ=46.92;MQ0=0;OQ=241.94;QD=4.17;SB=40.21 GT:AD:DP:GL:GQ 0/1:44,14:54:-43.75,-16.27,-150.33:99
-chr1 3316304 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=2;HaplotypeScore=31.71;MQ=50.98;MQ0=0;OQ=105.86;QD=1.79;SB=47.12 GT:AD:DP:GL:GQ 0/1:51,8:50:-28.93,-15.06,-145.13:99
-chr1 3316355 . A G 40.11 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=6.42;MQ=53.40;MQ0=0;QD=0.79;SB=24.53 GT:AD:DP:GL:GQ 0/1:42,9:48:-21.76,-14.47,-159.00:72.94
-chr1 3316370 . G A 1.13 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=7.87;MQ=52.81;MQ0=0;OQ=530.25;QD=10.40;SB=-291.29 GT:AD:DP:GL:GQ 0/1:31,20:45:-69.88,-13.57,-88.85:99
-chr1 3316500 rs4648494 A G 396.15 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.41;MQ0=0;OQ=1411.68;QD=27.15;SB=-591.87 GT:AD:DP:GL:GQ 1/1:0,52:46:-144.80,-13.88,-0.05:99
-chr1 3316656 rs6670123 C G 292.55 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=56.33;MQ0=0;OQ=1404.84;QD=19.79;SB=-673.50 GT:AD:DP:GL:GQ 0/1:33,38:68:-164.26,-20.49,-128.05:99
-chr1 3316892 rs2493296 C T 338.29 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.07;MQ0=0;OQ=702.09;QD=14.04;SB=-332.51 GT:AD:DP:GL:GQ 0/1:27,23:46:-87.37,-13.87,-76.76:99
-chr1 3317409 rs1106270 A G 118.06 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=1192.84;QD=30.59;SB=-537.44 GT:AD:DP:GL:GQ 1/1:0,39:35:-122.88,-10.54,-0.02:99
-chr1 3317462 rs1106271 T G 1.72 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=1.32;MQ=56.98;MQ0=0;OQ=1224.22;QD=31.39;SB=-406.92 GT:AD:DP:GL:GQ 1/1:0,39:38:-126.04,-11.45,-0.03:99
-chr1 3317665 rs57382922 C T 121.84 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=57.50;MQ0=0;OQ=526.20;QD=15.48;SB=-279.22 GT:AD:DP:GL:GQ 0/1:15,19:32:-65.55,-9.65,-47.15:99
-chr1 3318218 rs870124 T C 46.45 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=58.35;MQ0=0;OQ=987.47;QD=31.85;SB=-495.44 GT:AD:DP:GL:GQ 1/1:0,30:29:-102.35,-8.74,-0.01:87.24
-chr1 3318519 rs2493292 C T 35.55 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=5.38;MQ=58.81;MQ0=0;OQ=410.88;QD=10.54;SB=-213.48 GT:AD:DP:GL:GQ 0/1:22,17:36:-55.22,-10.85,-74.55:99
-chr1 3319244 rs2493291 C T 128.26 PASS AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=57.07;MQ0=0;OQ=113.91;QD=8.76;SB=-36.64 GT:AD:DP:GL:GQ 0/1:8,5:13:-18.59,-3.92,-28.88:99
-chr1 3319441 . G A 108.40 PASS AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=283.86;QD=13.52;SB=-108.97 GT:AD:DP:GL:GQ 0/1:11,10:21:-38.00,-6.33,-35.64:99
-chr1 3320120 . C T 102.17 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=709.62;QD=14.78;SB=-362.53 GT:AD:DP:GL:GQ 0/1:24,23:45:-87.81,-13.57,-69.77:99
-chr1 3320537 rs2493290 G A 97.62 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.41;MQ=59.54;MQ0=0;OQ=872.79;QD=17.46;SB=-392.92 GT:AD:DP:GL:GQ 0/1:24,26:48:-105.02,-14.46,-80.60:99
-chr1 3320607 rs11578951 G A 205.49 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=56.45;MQ0=0;OQ=183.21;QD=9.16;SB=-114.08 GT:AD:DP:GL:GQ 0/1:13,7:17:-26.73,-5.12,-34.52:99
-chr1 3320622 rs2493289 A G 29.59 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=56.62;MQ0=0;OQ=591.39;QD=28.16;SB=-179.75 GT:AD:DP:GL:GQ 1/1:0,20:19:-62.74,-5.73,-0.02:57.13
-chr1 3320744 rs2493288 G A 319.17 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.00;MQ0=0;OQ=558.26;QD=13.29;SB=-286.76 GT:AD:DP:GL:GQ 0/1:23,19:41:-71.47,-12.36,-76.00:99
-chr1 3321412 rs60973157 G C 340.30 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.61;MQ0=0;OQ=1008.01;QD=17.08;SB=-510.27 GT:AD:DP:GL:GQ 0/1:31,28:58:-121.57,-17.48,-125.42:99
-chr1 3321593 rs2483228 T C 57.78 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=59.17;MQ0=0;OQ=862.49;QD=30.80;SB=-342.44 GT:AD:DP:GL:GQ 1/1:0,28:27:-89.85,-8.14,-0.02:81.21
-chr1 3321759 rs1999528 A G 88.85 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1263.70;QD=30.82;SB=-424.24 GT:AD:DP:GL:GQ 1/1:0,41:41:-129.99,-12.37,-0.04:99
-chr1 3322543 rs2483229 T C 158.61 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.98;MQ0=0;OQ=401.83;QD=7.31;SB=-190.61 GT:AD:DP:GL:GQ 0/1:33,22:50:-58.54,-15.08,-123.40:99
-chr1 3322811 rs1889123 T C 57.71 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=1553.51;QD=34.52;SB=-743.30 GT:AD:DP:GL:GQ 1/1:0,45:44:-158.95,-13.25,-0.01:99
-chr1 3323101 rs55713431 A G 0.68 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=1.93;MQ=59.65;MQ0=0;OQ=422.62;QD=7.97;SB=-123.50 GT:AD:DP:GL:GQ 0/1:32,21:47:-59.71,-14.17,-112.42:99
-chr1 3323323 rs2068354 A G 160.11 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=738.34;QD=11.36;SB=-391.91 GT:AD:DP:GL:GQ 0/1:34,31:64:-96.41,-19.29,-135.43:99
-chr1 3324752 rs2483230 A G 139.58 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=59.42;MQ0=0;OQ=1229.51;QD=30.74;SB=-406.34 GT:AD:DP:GL:GQ 1/1:0,40:38:-126.56,-11.45,-0.03:99
-chr1 3326060 rs1984069 C T 66.93 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=2062.28;QD=37.50;SB=-721.47 GT:AD:DP:GL:GQ 1/1:0,55:53:-209.83,-15.97,-0.02:99
-chr1 3327403 rs1572040 A G 479.17 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1561.86;QD=33.95;SB=-803.63 GT:AD:DP:GL:GQ 1/1:0,46:45:-159.79,-13.56,-0.02:99
-chr1 3327481 . A G 13.29 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.51;MQ=58.78;MQ0=0;OQ=805.84;QD=11.68;SB=-333.16 GT:AD:DP:GL:GQ 0/1:35,34:66:-103.76,-19.89,-136.42:99
-chr1 3327496 rs11579873 G A 76.54 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=5.52;MQ=59.07;MQ0=0;OQ=1231.78;QD=17.60;SB=-403.19 GT:AD:DP:GL:GQ 0/1:34,36:67:-146.65,-20.19,-102.53:99
-chr1 3328305 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=2;HaplotypeScore=9.54;MQ=57.05;MQ0=0;OQ=81.44;QD=1.66;SB=56.21 GT:AD:DP:GL:GQ 0/1:35,13:31:-20.79,-9.36,-100.83:99
-chr1 3328931 rs2483231 A G 0.45 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=57.64;MQ0=0;OQ=961.69;QD=26.71;SB=-96.83 GT:AD:DP:GL:GQ 1/1:0,35:29:-99.77,-8.74,-0.01:87.24
-chr1 3329199 rs10492937 C A 94.15 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=591.17;QD=15.16;SB=-220.88 GT:AD:DP:GL:GQ 0/1:18,21:38:-73.85,-11.45,-60.07:99
-chr1 3329740 . G T 6.44 PASS AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=1;HaplotypeScore=3.49;MQ=59.36;MQ0=0;OQ=539.79;QD=14.99;SB=-294.29 GT:AD:DP:GL:GQ 0/1:15,21:33:-67.21,-9.94,-47.46:99
-chr1 3329976 rs2483232 A G 146.59 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.83;MQ=59.54;MQ0=0;OQ=1387.79;QD=27.76;SB=-682.70 GT:AD:DP:GL:GQ 1/1:0,49:45:-142.42,-13.58,-0.05:99
-chr1 3330129 rs4648385 C T 62.27 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.51;MQ0=0;OQ=1421.02;QD=37.40;SB=-712.36 GT:AD:DP:GL:GQ 1/1:0,38:36:-145.70,-10.84,-0.01:99
-chr1 3330207 rs2483233 A G 536.88 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1265.03;QD=33.29;SB=-631.30 GT:AD:DP:GL:GQ 1/1:0,38:37:-130.10,-11.15,-0.02:99
-chr1 3330527 rs2483234 A G 229.57 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1088.75;QD=27.92;SB=-544.02 GT:AD:DP:GL:GQ 1/1:0,38:35:-112.49,-10.56,-0.04:99
-chr1 3330619 rs2483235 A G 461.47 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=1699.01;QD=28.80;SB=-626.83 GT:AD:DP:GL:GQ 1/1:0,59:55:-173.55,-16.59,-0.06:99
-chr1 3330715 rs4648500 A C 461.04 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.69;MQ0=0;OQ=953.20;QD=15.63;SB=-476.30 GT:AD:DP:GL:GQ 0/1:28,33:61:-116.98,-18.37,-104.31:99
-chr1 3331400 rs2483236 C T 56.26 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=55.81;MQ0=0;OQ=1168.69;QD=36.52;SB=-534.21 GT:AD:DP:GL:GQ 1/1:0,31:30:-120.46,-9.04,-0.01:90.29
-chr1 3331651 rs1970118 A G 69.34 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=50.87;MQ0=0;OQ=938.62;QD=27.61;SB=-452.46 GT:AD:DP:GL:GQ 1/1:0,34:32:-97.49,-9.66,-0.04:96.17
-chr1 3331969 rs41303861 G T 165.88 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=56.82;MQ0=0;OQ=610.74;QD=12.99;SB=-193.66 GT:AD:DP:GL:GQ 0/1:23,24:44:-77.62,-13.26,-67.40:99
-chr1 3332390 rs2244013 G A 343.87 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.76;MQ=59.53;MQ0=0;OQ=624.83;QD=12.75;SB=-319.81 GT:AD:DP:GL:GQ 0/1:27,22:47:-79.93,-14.16,-96.24:99
-chr1 3332664 rs870171 G T 453.17 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=726.05;QD=12.10;SB=-151.13 GT:AD:DP:GL:GQ 0/1:34,26:59:-93.67,-17.78,-105.77:99
-chr1 3333105 rs7549050 A G 414.31 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=796.44;QD=10.62;SB=-292.01 GT:AD:DP:GL:GQ 0/1:42,33:74:-105.23,-22.30,-168.30:99
-chr1 3333795 rs55833861 T C 103.98 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=2.59;MQ=58.97;MQ0=0;OQ=717.11;QD=11.38;SB=-232.86 GT:AD:DP:GL:GQ 0/1:36,27:59:-92.78,-17.78,-129.42:99
-chr1 3333920 rs56196310 G T 246.95 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.56;MQ0=0;OQ=564.40;QD=10.65;SB=-293.98 GT:AD:DP:GL:GQ 0/1:32,21:49:-74.48,-14.76,-99.79:99
-chr1 3334336 rs61759212 A G 99.75 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.13;MQ0=0;OQ=418.37;QD=9.73;SB=-116.62 GT:AD:DP:GL:GQ 0/1:23,20:40:-57.18,-12.06,-85.13:99
-chr1 3334647 rs2483240 A G 15.04 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=55.38;MQ0=1;OQ=79.23;QD=3.96;SB=-53.29 GT:AD:DP:GL:GQ 0/1:13,7:16:-16.03,-4.82,-44.27:99
-chr1 3335005 rs2483242 A T 508.54 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.64;MQ0=0;OQ=469.82;QD=13.82;SB=-232.91 GT:AD:DP:GL:GQ 0/1:18,16:34:-60.51,-10.24,-69.68:99
-chr1 3335714 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=9.36;MQ=57.49;MQ0=0;OQ=205.84;QD=4.57;SB=56.19 GT:AD:DP:GL:GQ 0/1:25,20:36:-34.71,-10.85,-86.86:99
-chr1 3336208 rs2493277 C G 559.81 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=642.22;QD=14.94;SB=-326.21 GT:AD:DP:GL:GQ 0/1:23,20:42:-80.17,-12.66,-97.68:99
-chr1 3336263 rs11583353 C T 94.14 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.90;MQ0=0;OQ=708.85;QD=18.65;SB=-324.84 GT:AD:DP:GL:GQ 0/1:17,21:37:-85.32,-11.15,-51.45:99
-chr1 3339994 rs10752734 T C 155.05 PASS AC=2;AF=1.00;AN=2;DB;DP=17;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=27.27;MQ0=2;OQ=107.39;QD=6.32;SB=-10.00 GT:AD:DP:GL:GQ 1/1:8,9:4:-14.27,-1.20,-0.00:12.04
-chr1 3342087 rs1537406 T C 266.84 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.23;MQ0=0;OQ=2135.99;QD=33.90;SB=-825.32 GT:AD:DP:GL:GQ 1/1:0,63:60:-217.21,-18.07,-0.02:99
-chr1 3342088 rs12735779 G C 80.32 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.25;MQ0=0;OQ=2678.31;QD=41.20;SB=-987.13 GT:AD:DP:GL:GQ 1/1:0,65:62:-271.44,-18.68,-0.02:99
-chr1 3342207 rs1537405 T C 92.45 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=1223.31;QD=28.45;SB=-485.50 GT:AD:DP:GL:GQ 1/1:0,43:40:-125.96,-12.07,-0.04:99
-chr1 3342363 rs1537404 G C 0.18 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=2.53;MQ=57.71;MQ0=0;OQ=1605.19;QD=37.33;SB=-574.94 GT:AD:DP:GL:GQ 1/1:0,43:39:-164.12,-11.76,-0.02:99
-chr1 3342401 rs1065247 T C 218.93 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=58.89;MQ0=0;OQ=523.80;QD=12.47;SB=-250.33 GT:AD:DP:GL:GQ 0/1:20,21:38:-67.12,-11.46,-67.07:99
-chr1 3342439 rs1537402 T C 329.15 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=1390.94;QD=29.59;SB=-663.80 GT:AD:DP:GL:GQ 1/1:0,47:44:-142.72,-13.27,-0.04:99
-chr1 3342644 rs2493267 A G 426.47 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1871.16;QD=31.71;SB=-785.23 GT:AD:DP:GL:GQ 1/1:0,59:54:-190.73,-16.27,-0.03:99
-chr1 3342725 rs35015571 C T 160.86 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.43;MQ0=0;OQ=266.00;QD=8.06;SB=-157.61 GT:AD:DP:GL:GQ 0/1:23,10:28:-38.32,-8.44,-61.48:99
-chr1 3342732 rs2236518 A C 16.29 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=2.32;MQ=59.45;MQ0=0;OQ=611.30;QD=17.98;SB=-246.93 GT:AD:DP:GL:GQ 0/1:10,24:30:-73.45,-9.04,-31.78:99
-chr1 3343497 rs35837267 G A 179.26 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=1.81;MQ=58.20;MQ0=0;OQ=412.37;QD=12.13;SB=-230.72 GT:AD:DP:GL:GQ 0/1:20,14:34:-54.77,-10.25,-72.54:99
-chr1 3343750 rs2493265 A G 92.52 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.09;MQ0=0;OQ=1343.75;QD=27.42;SB=-616.98 GT:AD:DP:GL:GQ 1/1:0,49:43:-138.00,-12.97,-0.04:99
-chr1 3343809 rs2493264 A G 123.80 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.40;MQ=58.91;MQ0=0;OQ=1865.11;QD=29.14;SB=-622.24 GT:AD:DP:GL:GQ 1/1:0,64:61:-190.17,-18.41,-0.07:99
-chr1 3344455 rs2483249 T C 577.76 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2266.24;QD=31.92;SB=-1078.24 GT:AD:DP:GL:GQ 1/1:0,71:70:-230.26,-21.11,-0.05:99
-chr1 3344475 rs2493263 T C 726.67 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2858.56;QD=35.29;SB=-1249.13 GT:AD:DP:GL:GQ 1/1:0,81:80:-289.47,-24.10,-0.03:99
-chr1 3345122 rs55729137 G A 38.39 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.48;MQ0=0;OQ=807.80;QD=18.36;SB=-199.91 GT:AD:DP:GL:GQ 0/1:20,24:42:-96.73,-12.66,-57.09:99
-chr1 3346265 rs2483250 A C 12.02 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=59.52;MQ0=0;OQ=1256.35;QD=32.21;SB=-315.07 GT:AD:DP:GL:GQ 1/1:0,39:37:-129.23,-11.15,-0.01:99
-chr1 3346495 rs2483251 T C 2.80 PASS AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=1.13;MQ=60.00;MQ0=0;OQ=525.69;QD=27.67;SB=-225.75 GT:AD:DP:GL:GQ 1/1:0,19:16:-56.16,-4.82,-0.01:48.13
-chr1 3346655 rs2493262 C G 18.99 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=59.17;MQ0=0;OQ=878.66;QD=31.38;SB=-427.67 GT:AD:DP:GL:GQ 1/1:0,27:23:-91.47,-6.94,-0.02:69.23
-chr1 3346875 rs12745100 C T 10.66 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=496.33;QD=18.38;SB=-39.63 GT:AD:DP:GL:GQ 0/1:12,15:27:-61.05,-8.13,-42.91:99
-chr1 3347097 rs55892133 A G 803.11 Indel AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.17;MQ=58.79;MQ0=0;QD=12.55;SB=-200.20 GT:AD:DP:GL:GQ 0/1:34,30:60:-101.69,-18.09,-118.87:99
-chr1 3347896 rs10797392 T G 467.03 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=1;OQ=720.09;QD=12.20;SB=-372.76 GT:AD:DP:GL:GQ 0/1:27,32:54:-91.57,-16.27,-88.57:99
-chr1 3348782 rs2483252 G C 20.05 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=1.07;MQ=58.41;MQ0=0;OQ=1754.48;QD=39.87;SB=-676.45 GT:AD:DP:GL:GQ 1/1:0,43:42:-179.05,-12.66,-0.02:99
-chr1 3348792 rs35536718 C G 187.57 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.60;MQ0=0;OQ=722.68;QD=14.45;SB=-275.28 GT:AD:DP:GL:GQ 0/1:28,22:46:-89.42,-13.87,-106.46:99
-chr1 3349040 rs2493261 C G 241.62 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=2328.68;QD=40.85;SB=-454.11 GT:AD:DP:GL:GQ 1/1:0,57:55:-236.48,-16.59,-0.03:99
-chr1 3349142 rs56009352 G T 195.97 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=58.75;MQ0=0;OQ=381.64;QD=9.09;SB=-161.15 GT:AD:DP:GL:GQ 0/1:24,18:38:-52.90,-11.45,-81.46:99
-chr1 3349843 rs11588737 T C 126.31 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.70;MQ0=0;OQ=680.83;QD=8.96;SB=-348.93 GT:AD:DP:GL:GQ 0/1:44,32:72:-93.07,-21.70,-169.44:99
-chr1 3349896 rs9424295 C A 298.32 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.90;MQ0=0;OQ=883.58;QD=12.27;SB=-371.71 GT:AD:DP:GL:GQ 0/1:40,32:69:-112.42,-20.78,-136.87:99
-chr1 3350654 . A G 19.67 PASS AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=58.94;MQ0=0;OQ=752.06;QD=11.22;SB=-353.94 GT:AD:DP:GL:GQ 0/1:36,30:64:-97.78,-19.29,-134.25:99
-chr1 3350874 rs2493260 A T 152.74 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1881.55;QD=33.01;SB=-813.90 GT:AD:DP:GL:GQ 1/1:0,54:52:-191.76,-15.67,-0.02:99
-chr1 3351164 rs2483254 G A 165.18 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.02;MQ=57.99;MQ0=0;OQ=1923.46;QD=34.35;SB=-708.45 GT:AD:DP:GL:GQ 1/1:0,56:52:-195.97,-15.68,-0.04:99
-chr1 3351668 rs61759222 T C 292.32 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.16;MQ0=0;OQ=649.71;QD=12.99;SB=-320.27 GT:AD:DP:GL:GQ 0/1:27,23:50:-83.32,-15.07,-104.64:99
-chr1 3351675 rs61759223 T C 215.70 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.56;MQ0=0;OQ=453.74;QD=8.73;SB=-214.35 GT:AD:DP:GL:GQ 0/1:31,21:51:-64.03,-15.38,-121.39:99
-chr1 3351951 rs61759224 A G 132.94 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.69;MQ0=0;OQ=462.74;QD=9.25;SB=-204.32 GT:AD:DP:GL:GQ 0/1:29,21:49:-64.32,-14.77,-119.90:99
-chr1 3352116 rs867814 C T 338.36 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.66;MQ0=0;OQ=1015.19;QD=15.15;SB=-259.14 GT:AD:DP:GL:GQ 0/1:34,33:66:-124.69,-19.89,-112.54:99
-chr1 3352233 rs55781247 C T 0.43 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=12.27;MQ=55.55;MQ0=1;OQ=438.31;QD=8.59;SB=-227.00 GT:AD:DP:GL:GQ 0/1:27,22:35:-60.74,-13.63,-60.12:99
-chr1 3352662 . G C 94.32 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.30;MQ0=0;OQ=750.60;QD=12.94;SB=-224.33 GT:AD:DP:GL:GQ 0/1:34,23:56:-95.22,-16.87,-149.91:99
-chr1 3353096 rs11808277 C G 337.37 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.63;MQ0=0;OQ=1053.89;QD=17.00;SB=-489.21 GT:AD:DP:GL:GQ 0/1:30,32:59:-126.45,-17.78,-131.54:99
-chr1 3353132 . G A 167.12 PASS AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=1096.75;QD=16.13;SB=-431.84 GT:AD:DP:GL:GQ 0/1:34,34:67:-133.15,-20.19,-109.37:99
-chr1 3353327 rs10158332 A T 108.69 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.82;MQ0=0;OQ=1002.21;QD=14.12;SB=-515.47 GT:AD:DP:GL:GQ 0/1:38,33:71:-124.89,-21.39,-148.24:99
-chr1 3353449 rs10157570 G A 490.96 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=905.02;QD=15.88;SB=-430.82 GT:AD:DP:GL:GQ 0/1:30,27:56:-110.66,-16.88,-93.98:99
-chr1 3353662 rs2483255 A T 46.49 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=59.30;MQ0=0;OQ=2470.87;QD=37.44;SB=-912.35 GT:AD:DP:GL:GQ 1/1:0,66:64:-250.68,-19.27,-0.01:99
-chr1 3353786 rs2493258 A G 307.10 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.56;MQ0=0;OQ=1182.18;QD=13.91;SB=-595.40 GT:AD:DP:GL:GQ 0/1:39,46:85:-147.12,-25.62,-159.37:99
-chr1 3354380 rs61759225 T C 235.67 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=921.81;QD=12.29;SB=-424.06 GT:AD:DP:GL:GQ 0/1:42,33:74:-117.76,-22.29,-166.03:99
-chr1 3354597 rs2263010 T C 533.81 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2222.94;QD=35.85;SB=-1114.11 GT:AD:DP:GL:GQ 1/1:0,62:62:-225.90,-18.68,-0.02:99
-chr1 3354829 rs61759226 A T 251.14 PASS AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.16;MQ0=0;OQ=1748.33;QD=17.48;SB=-874.02 GT:AD:DP:GL:GQ 0/1:46,54:99:-207.93,-29.81,-176.30:99
-chr1 3355107 rs4648386 A G 12.08 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=59.31;MQ0=0;OQ=1773.45;QD=34.77;SB=-505.48 GT:AD:DP:GL:GQ 1/1:0,51:51:-180.95,-15.36,-0.02:99
-chr1 3355113 rs61759227 G A 0.86 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=6.85;MQ=58.80;MQ0=0;OQ=911.32;QD=18.60;SB=-216.88 GT:AD:DP:GL:GQ 0/1:22,27:48:-108.87,-14.46,-75.78:99
-chr1 3355993 rs55913848 G T 115.65 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=58.15;MQ0=0;OQ=1046.84;QD=16.62;SB=-492.93 GT:AD:DP:GL:GQ 0/1:29,34:61:-126.34,-18.38,-91.26:99
-chr1 3356353 rs2096102 C A 344.49 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=61.19;MQ0=0;OQ=1204.86;QD=17.21;SB=-565.00 GT:AD:DP:GL:GQ 0/1:30,40:67:-143.95,-20.18,-94.79:99
-chr1 3356461 . G A 34.92 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=63.59;MQ=46.78;MQ0=1;QD=0.83;SB=-40.97 GT:AD:DP:GL:GQ 0/1:36,6:34:-17.03,-10.25,-100.31:67.76
-chr1 3356464 . T G 27.11 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=13.28;MQ=49.36;MQ0=1;QD=0.85;SB=-38.91 GT:AD:DP:GL:GQ 0/1:28,4:29:-14.73,-8.74,-84.74:59.94
-chr1 3356466 . G T 324.76 SnpCluster AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=10.60;MQ=48.57;MQ0=1;QD=10.83;SB=-127.64 GT:AD:DP:GL:GQ 0/1:15,15:26:-43.60,-7.84,-42.90:99
-chr1 3357640 rs2487679 A G 123.35 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=59.32;MQ0=0;OQ=2260.98;QD=33.25;SB=-697.21 GT:AD:DP:GL:GQ 1/1:0,68:67:-229.71,-20.18,-0.03:99
-chr1 3357895 rs6697669 T C 43.42 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.03;HRun=0;HaplotypeScore=3.79;MQ=57.15;MQ0=0;OQ=335.02;QD=10.15;SB=-38.93 GT:AD:DP:GL:GQ 0/1:18,13:30:-45.82,-9.04,-67.57:99
-chr1 3357991 rs4648501 G A 122.29 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.97;MQ0=0;OQ=545.72;QD=10.70;SB=-291.79 GT:AD:DP:GL:GQ 0/1:33,18:50:-72.92,-15.06,-113.74:99
-chr1 3358003 rs2487670 G A 120.25 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.77;MQ0=0;OQ=1144.78;QD=22.01;SB=-472.53 GT:AD:DP:GL:GQ 0/1:18,34:50:-132.83,-15.07,-51.40:99
-chr1 3358201 rs55902179 A G 118.16 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=60.00;MQ0=0;OQ=620.71;QD=14.78;SB=-241.29 GT:AD:DP:GL:GQ 0/1:20,22:41:-77.71,-12.35,-78.03:99
-chr1 3359613 rs2487668 G A 227.96 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.61;MQ0=0;OQ=985.10;QD=16.70;SB=-425.79 GT:AD:DP:GL:GQ 0/1:26,32:57:-118.97,-17.18,-94.23:99
-chr1 3359684 rs34681041 A G 13.72 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=1.71;MQ=60.00;MQ0=0;OQ=330.72;QD=8.70;SB=-110.60 GT:AD:DP:GL:GQ 0/1:21,17:34:-46.60,-10.25,-79.14:99
-chr1 3361330 . G C 0.29 PASS AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=68.48;QD=6.85;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,4:9:-12.85,-2.72,-22.16:99
-chr1 3361841 rs55858614 G C 94.38 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.70;MQ0=0;OQ=503.58;QD=17.36;SB=-238.39 GT:AD:DP:GL:GQ 0/1:14,15:29:-62.38,-8.74,-58.19:99
-chr1 3362331 rs10909946 A C 12.50 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=2.71;MQ=58.18;MQ0=0;OQ=655.84;QD=12.15;SB=-228.89 GT:AD:DP:GL:GQ 0/1:26,28:47:-83.03,-14.16,-81.70:99
-chr1 3362529 rs61759232 T C 1.77 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=3.67;MQ=58.99;MQ0=0;OQ=549.81;QD=11.95;SB=-107.61 GT:AD:DP:GL:GQ 0/1:22,24:42:-70.93,-12.66,-83.77:99
-chr1 3362717 . A G 41.71 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.65;MQ0=0;OQ=773.42;QD=14.59;SB=-374.28 GT:AD:DP:GL:GQ 0/1:23,30:49:-95.39,-14.76,-86.55:99
-chr1 3363471 rs56365322 C G 249.90 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.24;MQ0=0;OQ=638.66;QD=11.61;SB=-240.06 GT:AD:DP:GL:GQ 0/1:30,25:50:-82.23,-15.08,-125.58:99
-chr1 3363827 rs2493256 A G 265.69 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.48;MQ0=0;OQ=531.11;QD=12.35;SB=-221.59 GT:AD:DP:GL:GQ 0/1:23,19:42:-71.22,-14.82,-89.22:99
-chr1 3364220 rs12745860 C T 264.50 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=58.78;MQ0=0;OQ=718.26;QD=12.60;SB=-212.70 GT:AD:DP:GL:GQ 0/1:33,24:53:-91.09,-15.98,-94.23:99
-chr1 3364244 rs12758368 T A 250.46 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.27;MQ0=0;OQ=910.80;QD=14.46;SB=-359.58 GT:AD:DP:GL:GQ 0/1:33,30:62:-113.04,-18.68,-119.17:99
-chr1 3364803 rs56242281 A G 70.18 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.36;MQ=59.30;MQ0=0;OQ=300.82;QD=9.12;SB=-84.67 GT:AD:DP:GL:GQ 0/1:18,14:30:-42.41,-9.04,-64.59:99
-chr1 3365228 rs61759235 A G 136.44 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=58.63;MQ0=0;OQ=478.85;QD=9.39;SB=-239.48 GT:AD:DP:GL:GQ 0/1:30,21:48:-65.63,-14.46,-116.95:99
-chr1 3365583 rs61759236 C G 131.55 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=835.90;QD=18.58;SB=-383.86 GT:AD:DP:GL:GQ 0/1:22,23:43:-99.85,-12.97,-77.78:99
-chr1 3366053 rs61759237 C T 131.92 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=735.43;QD=17.10;SB=-313.83 GT:AD:DP:GL:GQ 0/1:21,22:42:-89.48,-12.65,-70.75:99
-chr1 3366393 rs12059504 T C 302.48 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=60.00;MQ0=0;OQ=609.78;QD=12.70;SB=-240.29 GT:AD:DP:GL:GQ 0/1:24,24:48:-78.73,-14.47,-96.53:99
-chr1 3366983 rs59183260 C T 199.73 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.76;MQ=59.56;MQ0=0;OQ=586.61;QD=13.97;SB=-272.28 GT:AD:DP:GL:GQ 0/1:22,20:39:-73.71,-11.76,-62.95:99
-chr1 3367203 rs2487681 T C 222.79 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=60.00;MQ0=0;OQ=351.40;QD=8.79;SB=-154.93 GT:AD:DP:GL:GQ 0/1:22,18:38:-49.88,-11.46,-85.17:99
-chr1 3372040 rs10909947 G T 39.70 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.75;MQ0=0;OQ=1667.04;QD=35.47;SB=-355.84 GT:AD:DP:GL:GQ 1/1:0,47:46:-170.30,-13.86,-0.01:99
-chr1 3372773 . T G 28.89 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=4.07;MQ=59.49;MQ0=0;QD=0.64;SB=56.17 GT:AD:DP:GL:GQ 0/1:32,13:34:-16.42,-10.24,-99.13:61.72
-chr1 3372898 rs947351 G A 372.12 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.19;MQ0=0;OQ=649.44;QD=12.49;SB=-216.21 GT:AD:DP:GL:GQ 0/1:28,24:49:-83.00,-14.77,-93.12:99
-chr1 3373453 rs3893316 G T 349.34 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=441.10;QD=14.70;SB=-201.58 GT:AD:DP:GL:GQ 0/1:13,17:29:-56.13,-8.74,-43.76:99
-chr1 3373525 rs7550948 G A 64.51 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=1066.26;QD=21.76;SB=-418.80 GT:AD:DP:GL:GQ 0/1:18,31:47:-124.08,-14.17,-50.84:99
-chr1 3373758 rs6424078 A G 63.51 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.45;MQ0=0;OQ=303.09;QD=10.10;SB=-109.62 GT:AD:DP:GL:GQ 0/1:15,15:29:-42.34,-8.75,-57.35:99
-chr1 3373912 rs45512802 C T 115.92 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.77;MQ=58.81;MQ0=0;OQ=487.90;QD=12.51;SB=-154.65 GT:AD:DP:GL:GQ 0/1:21,18:37:-63.22,-11.15,-77.33:99
-chr1 3374091 rs6667361 A G 15.86 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=1.91;MQ=58.45;MQ0=0;OQ=441.93;QD=9.82;SB=-196.52 GT:AD:DP:GL:GQ 0/1:26,19:43:-60.43,-12.96,-100.55:99
-chr1 3374466 rs7522513 A G 114.35 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.36;MQ0=0;OQ=449.01;QD=11.23;SB=-195.64 GT:AD:DP:GL:GQ 0/1:20,20:37:-59.34,-11.16,-69.75:99
-chr1 3374989 rs2493250 G A 285.91 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.52;MQ0=0;OQ=823.07;QD=17.15;SB=-412.42 GT:AD:DP:GL:GQ 0/1:23,25:48:-100.06,-14.47,-73.79:99
-chr1 3374999 rs2487673 G T 438.47 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=759.07;QD=16.87;SB=-384.82 GT:AD:DP:GL:GQ 0/1:19,26:45:-92.75,-13.56,-63.83:99
-chr1 3375110 rs1417897 C A 224.44 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=57.71;MQ0=0;OQ=613.48;QD=15.73;SB=-271.51 GT:AD:DP:GL:GQ 0/1:18,21:37:-75.78,-11.15,-51.34:99
-chr1 3375116 rs1891143 A G 122.77 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=57.71;MQ0=0;OQ=346.85;QD=8.89;SB=-128.27 GT:AD:DP:GL:GQ 0/1:22,17:35:-48.52,-10.55,-81.11:99
-chr1 3375190 rs2493249 T C 0.27 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=3;HaplotypeScore=2.59;MQ=59.45;MQ0=0;OQ=889.42;QD=26.16;SB=-381.39 GT:AD:DP:GL:GQ 1/1:0,34:28:-92.55,-8.44,-0.02:84.20
-chr1 3377520 . G A 54.48 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=60.00;MQ0=0;OQ=404.10;QD=10.92;SB=-123.57 GT:AD:DP:GL:GQ 0/1:21,16:32:-53.34,-9.65,-57.04:99
-chr1 3379133 rs2298082 T C 273.90 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.53;MQ=58.32;MQ0=0;OQ=528.06;QD=13.20;SB=-222.68 GT:AD:DP:GL:GQ 0/1:19,21:37:-67.24,-11.15,-73.98:99
-chr1 3379181 rs2487687 C T 16.32 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=60.00;MQ0=0;OQ=545.94;QD=21.00;SB=-232.27 GT:AD:DP:GL:GQ 0/1:9,17:25:-65.41,-7.53,-31.41:99
-chr1 3379587 rs2185639 C T 119.32 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=58.13;MQ0=0;OQ=232.01;QD=9.28;SB=-26.61 GT:AD:DP:GL:GQ 0/1:14,10:22:-33.12,-6.63,-45.28:99
-chr1 3380098 rs2493323 T A 210.96 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1873.41;QD=38.23;SB=-364.88 GT:AD:DP:GL:GQ 1/1:0,49:49:-190.94,-14.76,-0.01:99
-chr1 3380882 rs2493322 G A 155.52 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=666.25;QD=12.34;SB=-269.17 GT:AD:DP:GL:GQ 0/1:33,21:52:-85.58,-15.67,-103.39:99
-chr1 3381466 . A G 34.09 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.23;MQ=18.93;MQ0=48;QD=0.47;SB=2.04 GT:AD:DP:GL:GQ 0/1:58,15:13:-10.61,-3.92,-40.00:66.92
-chr1 3381536 rs2493320 G A 66.96 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=9.35;MQ0=30;OQ=163.18;QD=3.98;SB=-10.00 GT:AD:DP:GL:GQ 1/1:12,29:5:-19.88,-1.51,-0.00:15.05
-chr1 3381776 rs56863381 G A 0.39 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=12.80;MQ0=34;OQ=57.75;QD=1.03;SB=5.02 GT:AD:DP:GL:GQ 0/1:40,16:11:-12.38,-3.32,-24.49:90.59
-chr1 3382016 . A G 35.80 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=12.28;MQ0=39;QD=0.55;SB=-10.00 GT:AD:DP:GL:GQ 0/1:54,11:16:-11.69,-4.82,-49.41:68.63
-chr1 3382186 rs2493318 A G 275.57 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=47.26;MQ0=1;OQ=747.71;QD=13.35;SB=-372.26 GT:AD:DP:GL:GQ 0/1:27,29:52:-93.72,-15.67,-105.01:99
-chr1 3382897 rs12124163 G T 198.71 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.56;MQ0=0;OQ=598.86;QD=14.26;SB=-222.53 GT:AD:DP:GL:GQ 0/1:21,21:41:-75.52,-12.35,-66.44:99
-chr1 3383727 rs10797394 G A 171.07 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=49.26;MQ0=0;QD=13.16;SB=8.03 GT:AD:DP:GL:GQ 0/1:7,6:12:-24.01,-3.62,-19.11:99
-chr1 3383981 rs56341824 G T 14.44 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=1.70;MQ=59.25;MQ0=0;OQ=147.62;QD=5.90;SB=-6.99 GT:AD:DP:GL:GQ 0/1:17,8:23:-24.98,-6.93,-50.77:99
-chr1 3384110 rs10909948 C T 220.05 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=54.75;MQ0=0;OQ=493.02;QD=17.00;SB=-263.55 GT:AD:DP:GL:GQ 0/1:13,16:28:-61.02,-8.44,-45.99:99
-chr1 3384316 rs4638054 T C 12.90 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.07;MQ0=0;OQ=1239.78;QD=27.55;SB=-421.16 GT:AD:DP:GL:GQ 1/1:0,45:41:-127.61,-12.37,-0.05:99
-chr1 3384500 rs4422946 A G 10.27 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=60.00;MQ0=0;OQ=259.70;QD=9.27;SB=-73.94 GT:AD:DP:GL:GQ 0/1:16,12:25:-36.79,-7.54,-56.39:99
-chr1 3384534 rs4534324 T C 47.15 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.99;MQ0=0;OQ=674.08;QD=29.31;SB=-343.44 GT:AD:DP:GL:GQ 1/1:0,23:22:-71.01,-6.63,-0.02:66.16
-chr1 3384899 rs10797395 G A 51.14 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=4.52;MQ=59.38;MQ0=0;OQ=712.83;QD=19.27;SB=-338.87 GT:AD:DP:GL:GQ 0/1:16,21:35:-85.11,-10.54,-50.14:99
-chr1 3385089 rs4553117 T C 310.38 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=892.31;QD=26.24;SB=-387.26 GT:AD:DP:GL:GQ 1/1:0,34:29:-92.85,-8.75,-0.03:87.19
-chr1 3385248 rs28568519 C G 124.68 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=59.45;MQ0=0;OQ=725.71;QD=17.28;SB=-286.30 GT:AD:DP:GL:GQ 0/1:20,22:38:-87.31,-11.46,-71.37:99
-chr1 3386469 rs881978 C T 144.12 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.64;MQ=59.25;MQ0=0;OQ=1109.69;QD=19.82;SB=-578.43 GT:AD:DP:GL:GQ 0/1:23,33:55:-130.82,-16.57,-79.57:99
-chr1 3386922 rs56309807 G A 10.71 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=6.20;MQ=58.23;MQ0=0;OQ=434.23;QD=11.74;SB=-179.25 GT:AD:DP:GL:GQ 0/1:20,16:31:-56.05,-9.34,-54.39:99
-chr1 3387048 rs2487677 T C 22.85 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.93;MQ=58.11;MQ0=0;OQ=1498.47;QD=31.88;SB=-723.23 GT:AD:DP:GL:GQ 1/1:0,46:43:-153.45,-12.96,-0.02:99
-chr1 3387315 rs1051515 G A 124.17 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=59.55;MQ0=0;OQ=661.19;QD=15.03;SB=-242.52 GT:AD:DP:GL:GQ 0/1:21,23:41:-81.76,-12.36,-69.63:99
-chr1 3387424 rs1051517 C T 185.79 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.57;MQ0=0;OQ=722.32;QD=16.80;SB=-358.40 GT:AD:DP:GL:GQ 0/1:21,22:42:-88.17,-12.66,-71.34:99
-chr1 3387765 rs2487676 G C 0.92 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.56;MQ0=0;OQ=985.55;QD=23.47;SB=-402.96 GT:AD:DP:GL:GQ 0/1:13,29:39:-113.61,-11.77,-48.31:99
-chr1 3387785 rs10797396 G A 343.20 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=869.16;QD=19.75;SB=-452.50 GT:AD:DP:GL:GQ 0/1:15,29:41:-102.56,-12.36,-46.08:99
-chr1 3388739 . G C 3.92 PASS AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=47.12;MQ0=0;OQ=99.91;QD=7.14;SB=-0.98 GT:AD:DP:GL:GQ 0/1:10,4:13:-17.20,-3.93,-33.90:99
-chr1 3388844 rs11579276 C T 89.01 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=228.92;QD=8.80;SB=-0.98 GT:AD:DP:GL:GQ 0/1:16,10:21:-32.51,-6.33,-40.91:99
-chr1 3389315 rs2493316 T C 332.07 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=364.79;QD=11.40;SB=-143.65 GT:AD:DP:GL:GQ 0/1:18,14:32:-49.41,-9.65,-68.22:99
-chr1 3390585 rs12124659 C T 210.63 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.96;MQ0=0;OQ=1350.80;QD=37.52;SB=-227.30 GT:AD:DP:GL:GQ 1/1:0,36:35:-138.68,-10.55,-0.01:99
-chr1 3391131 rs2487674 A G 49.46 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=2482.25;QD=31.82;SB=-1068.16 GT:AD:DP:GL:GQ 1/1:0,78:76:-251.87,-22.92,-0.06:99
-chr1 3392093 rs4648504 C T 77.49 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=53.45;MQ0=1;OQ=1952.99;QD=36.17;SB=-850.15 GT:AD:DP:GL:GQ 1/1:1,53:50:-198.90,-15.06,-0.02:99
-chr1 3394087 rs2821041 C T 330.28 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=59.75;MQ0=0;OQ=1098.32;QD=14.64;SB=-325.80 GT:AD:DP:GL:GQ 0/1:41,34:73:-135.10,-21.99,-140.04:99
-chr1 3394997 rs61759244 C G 135 PASS AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=59.37;MQ0=0;OQ=1716.91;QD=17.88;SB=-792.82 GT:AD:DP:GL:GQ 0/1:43,53:93:-203.04,-28.07,-171.23:99
-chr1 3395156 rs4648505 T C 309 PASS AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.51;MQ0=0;OQ=921.20;QD=9.70;SB=-319.80 GT:AD:DP:GL:GQ 0/1:57,38:95:-124.03,-28.62,-233.81:99
-chr1 3401826 rs2821034 T C 25.42 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=5.69;MQ=57.22;MQ0=0;OQ=336.60;QD=15.30;SB=-157.73 GT:AD:DP:GL:GQ 1/1:0,21:12:-37.26,-3.62,-0.02:36.06
-chr1 3406983 . G A 147.34 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=493.27;QD=14.51;SB=-172.20 GT:AD:DP:GL:GQ 0/1:17,17:33:-62.55,-9.94,-60.75:99
-chr1 3408031 rs7516662 A G 45.84 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=59.41;MQ0=0;OQ=599.81;QD=15.38;SB=-119.66 GT:AD:DP:GL:GQ 0/1:18,21:37:-74.41,-11.15,-64.16:99
-chr1 3408425 rs2821030 T C 291.53 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=44.95;MQ0=0;OQ=775.65;QD=13.61;SB=-335.17 GT:AD:DP:GL:GQ 0/1:17,40:43:-93.82,-12.97,-49.21:99
-chr1 3408438 rs56284135 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=5;HaplotypeScore=43.60;MQ=44.49;MQ0=0;OQ=630.57;QD=9.70;SB=-139.40 GT:AD:DP:GL:GQ 0/1:28,36:49:-81.11,-14.77,-94.33:99
-chr1 3408476 rs57408931 G C 181.30 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=164;Dels=0.03;HRun=1;HaplotypeScore=218.91;MQ=41.51;MQ0=3;QD=1.11;SB=-63.16 GT:AD:DP:GL:GQ 0/1:117,24:115:-89.58,-68.17,-379.21:99
-chr1 3408478 rs57082253 G A 513.03 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=0;HaplotypeScore=193.59;MQ=41.21;MQ0=2;QD=2.85;SB=-274.73 GT:AD:DP:GL:GQ 0/1:134,38:129:-95.85,-41.26,-324.12:99
-chr1 3408517 rs7368034 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=115;Dels=0.00;HRun=0;HaplotypeScore=120.54;MQ=42.22;MQ0=3;OQ=514.65;QD=4.48;SB=-116.36 GT:AD:DP:GL:GQ 0/1:73,33:82:-88.72,-33.97,-192.96:99
-chr1 3411446 rs6669870 C T 607.77 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.14;MQ0=0;OQ=1485.27;QD=36.23;SB=-614.81 GT:AD:DP:GL:GQ 1/1:0,41:39:-152.13,-11.76,-0.02:99
-chr1 3411518 rs2821009 A T 529.19 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.77;MQ0=0;OQ=1252.41;QD=34.79;SB=-623.61 GT:AD:DP:GL:GQ 1/1:0,36:35:-128.84,-10.55,-0.01:99
-chr1 3411757 rs2821008 A G 31.18 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.41;MQ0=0;OQ=238.32;QD=6.11;SB=-110.60 GT:AD:DP:GL:GQ 0/1:25,14:37:-38.27,-11.15,-99.52:99
-chr1 3413327 rs947344 C T 169.75 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.94;MQ=58.66;MQ0=0;OQ=1006.19;QD=19.35;SB=-478.56 GT:AD:DP:GL:GQ 0/1:21,31:45:-117.47,-13.57,-45.94:99
-chr1 3413493 rs2821006 A G 514.34 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1416.92;QD=30.15;SB=-704.80 GT:AD:DP:GL:GQ 1/1:0,47:45:-145.32,-13.57,-0.04:99
-chr1 3413602 rs10797397 C A 230.35 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=59.11;MQ0=0;OQ=969.58;QD=16.43;SB=-386.82 GT:AD:DP:GL:GQ 0/1:25,34:55:-116.81,-16.57,-75.73:99
-chr1 3414248 rs947345 G A 253.45 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.28;MQ=59.23;MQ0=0;OQ=855.83;QD=14.26;SB=-381.90 GT:AD:DP:GL:GQ 0/1:31,29:53:-104.84,-15.98,-85.70:99
-chr1 3415290 rs2794358 A G 117.33 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1082.49;QD=30.93;SB=-492.45 GT:AD:DP:GL:GQ 1/1:0,35:32:-111.85,-9.64,-0.02:96.25
-chr1 3416927 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=20.42;MQ=57.31;MQ0=0;OQ=341.32;QD=7.11;SB=-84.89 GT:AD:DP:GL:GQ 0/1:26,19:38:-51.91,-14.49,-87.40:99
-chr1 3416981 rs56310990 G C 2.17 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.26;MQ0=0;OQ=93.69;QD=3.02;SB=-14.81 GT:AD:DP:GL:GQ 0/1:25,6:25:-20.20,-7.54,-81.40:99
-chr1 3416998 . C T 35.62 PASS AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=49.93;MQ0=0;OQ=473.15;QD=15.77;SB=-230.75 GT:AD:DP:GL:GQ 0/1:10,20:24:-57.83,-7.23,-29.03:99
-chr1 3418020 rs2820999 T G 23.07 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=1.35;MQ=59.30;MQ0=0;OQ=1099.49;QD=33.32;SB=-419.27 GT:AD:DP:GL:GQ 1/1:0,32:32:-113.54,-9.64,-0.01:96.28
-chr1 3418284 rs4648391 G T 480.48 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1326.40;QD=33.16;SB=-497.29 GT:AD:DP:GL:GQ 1/1:0,40:39:-136.24,-11.75,-0.02:99
-chr1 3418288 rs4648514 C T 298.40 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=1504.64;QD=38.58;SB=-514.18 GT:AD:DP:GL:GQ 1/1:0,39:39:-154.07,-11.75,-0.02:99
-chr1 3418468 rs11585362 G A 504.11 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1061.06;QD=36.59;SB=-446.58 GT:AD:DP:GL:GQ 1/1:0,29:29:-109.71,-8.74,-0.02:87.27
-chr1 3419555 rs11587354 C A 388.99 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=2174.38;QD=35.07;SB=-358.82 GT:AD:DP:GL:GQ 1/1:0,62:58:-221.04,-17.47,-0.02:99
-chr1 3420506 . T A 214.92 PASS AC=2;AF=1.00;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1094.09;QD=36.47;SB=-408.28 GT:AD:DP:GL:GQ 1/1:0,30:30:-113.00,-9.04,-0.01:90.28
-chr1 3422067 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=4;HaplotypeScore=5.56;MQ=56.93;MQ0=0;OQ=142.54;QD=3.85;SB=26.11 GT:AD:DP:GL:GQ 0/1:17,20:22:-24.18,-6.64,-53.52:99
-chr1 3422138 rs12045137 C G 147.05 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1703.92;QD=40.57;SB=-765.63 GT:AD:DP:GL:GQ 1/1:0,42:41:-174.00,-12.36,-0.02:99
-chr1 3422853 rs11587498 G A 175.29 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=60.00;MQ0=0;OQ=415.52;QD=12.22;SB=-203.18 GT:AD:DP:GL:GQ 0/1:20,14:31:-54.19,-9.35,-54.52:99
-chr1 3424377 rs2820995 A G 162.79 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=58.66;MQ0=0;OQ=1805.64;QD=27.36;SB=-525.83 GT:AD:DP:GL:GQ 1/1:0,66:60:-184.23,-18.11,-0.08:99
-chr1 3424844 rs2794362 G C 500.34 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1899.04;QD=42.20;SB=-801.86 GT:AD:DP:GL:GQ 1/1:0,45:44:-193.50,-13.26,-0.01:99
-chr1 3427795 rs2794365 T C 272.59 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.56;MQ0=0;OQ=540.74;QD=12.87;SB=-223.28 GT:AD:DP:GL:GQ 0/1:22,20:39:-69.11,-11.75,-73.06:99
-chr1 3428053 rs11587384 G A 58.66 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=58.59;MQ0=0;OQ=656.10;QD=19.88;SB=-350.39 GT:AD:DP:GL:GQ 0/1:13,20:30:-77.94,-9.05,-31.18:99
-chr1 3428530 rs10909958 C T 169.55 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=60.00;MQ0=0;OQ=649.49;QD=10.31;SB=-164.81 GT:AD:DP:GL:GQ 0/1:40,23:61:-86.62,-18.39,-128.91:99
-chr1 3429888 rs10797398 G C 1.63 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=0.26;MQ=58.87;MQ0=0;OQ=1501.66;QD=40.59;SB=-598.80 GT:AD:DP:GL:GQ 1/1:0,37:37:-153.77,-11.16,-0.02:99
-chr1 3430507 rs2794322 T C 118.81 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=864.34;QD=26.19;SB=-416.15 GT:AD:DP:GL:GQ 1/1:0,33:29:-90.06,-8.75,-0.04:87.16
-chr1 3430803 rs12049449 A C 10.61 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=3;HaplotypeScore=1.13;MQ=59.39;MQ0=0;OQ=1279.24;QD=33.66;SB=-506.06 GT:AD:DP:GL:GQ 1/1:0,38:37:-131.52,-11.15,-0.02:99
-chr1 3431124 rs12093117 G A 200.25 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.17;MQ=59.61;MQ0=0;OQ=828.18;QD=17.25;SB=-263.28 GT:AD:DP:GL:GQ 0/1:20,28:45:-99.67,-13.57,-58.69:99
-chr1 3432615 rs11589895 G A 209.87 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.89;MQ0=0;OQ=771.91;QD=18.38;SB=-386.90 GT:AD:DP:GL:GQ 0/1:19,23:42:-93.13,-12.66,-62.18:99
-chr1 3433053 . C T 70.11 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=58.26;MQ0=0;OQ=707.05;QD=13.86;SB=-362.49 GT:AD:DP:GL:GQ 0/1:26,25:48:-88.45,-14.46,-91.49:99
-chr1 3435213 rs2821068 G C 38.82 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.11;MQ0=0;OQ=1371.97;QD=37.08;SB=-540.03 GT:AD:DP:GL:GQ 1/1:0,36:33:-140.79,-9.95,-0.01:99
-chr1 3435771 rs883427 G A 416.41 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.00;MQ0=0;OQ=1899.02;QD=38.76;SB=-741.50 GT:AD:DP:GL:GQ 1/1:0,49:48:-193.50,-14.46,-0.01:99
-chr1 3436171 rs11589175 G A 118.39 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=494.22;QD=9.88;SB=-114.31 GT:AD:DP:GL:GQ 0/1:32,17:48:-69.83,-17.13,-113.83:99
-chr1 3436855 rs11811714 C T 197.39 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.93;MQ0=0;OQ=2210.05;QD=36.23;SB=-988.23 GT:AD:DP:GL:GQ 1/1:0,61:58:-224.62,-17.49,-0.03:99
-chr1 3436977 rs56103034 G C 151.47 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=60.00;MQ0=0;OQ=361.61;QD=12.91;SB=-169.18 GT:AD:DP:GL:GQ 0/1:15,13:27:-47.59,-8.14,-66.07:99
-chr1 3437069 . A C 13.05 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=2;HaplotypeScore=6.13;MQ=58.68;MQ0=0;QD=0.25;SB=74.24 GT:AD:DP:GL:GQ 0/1:37,15:37:-15.71,-11.15,-109.98:45.67
-chr1 3438669 rs61762171 G A 197.19 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.08;MQ=59.50;MQ0=0;OQ=831.35;QD=18.07;SB=-356.42 GT:AD:DP:GL:GQ 0/1:21,25:43:-99.38,-12.97,-55.25:99
-chr1 3438727 rs55762450 C A 163.97 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.39;MQ=59.54;MQ0=0;OQ=660.37;QD=13.21;SB=-236.28 GT:AD:DP:GL:GQ 0/1:20,30:45:-82.89,-13.57,-69.96:99
-chr1 3440115 rs2493313 T C 297.46 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=56.74;MQ0=0;OQ=1008.77;QD=34.79;SB=-528.20 GT:AD:DP:GL:GQ 1/1:0,29:29:-104.47,-8.74,-0.01:87.25
-chr1 3444452 rs9970944 G T 111.06 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=58.11;MQ0=0;OQ=1564.30;QD=32.59;SB=-784.47 GT:AD:DP:GL:GQ 1/1:1,47:45:-160.04,-13.56,-0.02:99
-chr1 3445102 rs12049456 G A 432 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.32;MQ0=0;OQ=1256.64;QD=36.96;SB=-508.18 GT:AD:DP:GL:GQ 1/1:0,34:33:-129.26,-9.95,-0.01:99
-chr1 3445120 . C G 39.08 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=55.59;MQ0=2;QD=0.85;SB=59.22 GT:AD:DP:GL:GQ 0/1:40,6:41:-19.55,-12.36,-150.78:71.92
-chr1 3448511 rs2821064 A T 100.60 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.44;MQ=58.81;MQ0=0;OQ=526.36;QD=13.50;SB=-238.77 GT:AD:DP:GL:GQ 0/1:20,19:39:-67.67,-11.75,-70.26:99
-chr1 3448541 rs2794331 G C 111.94 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=58.71;MQ0=0;OQ=556.37;QD=15.45;SB=-245.10 GT:AD:DP:GL:GQ 0/1:19,17:32:-68.58,-9.65,-62.08:99
-chr1 3448992 rs12065874 C T 177.16 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.46;MQ0=0;OQ=793.34;QD=18.45;SB=-374.15 GT:AD:DP:GL:GQ 0/1:19,24:39:-94.38,-11.76,-47.24:99
-chr1 3452764 rs10797401 T C 166.54 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=59.52;MQ0=0;OQ=647.76;QD=16.61;SB=-319.33 GT:AD:DP:GL:GQ 0/1:16,23:38:-79.51,-11.45,-58.06:99
-chr1 3453088 rs28479691 G A 97.36 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=55.43;MQ0=1;OQ=249.39;QD=11.34;SB=-131.56 GT:AD:DP:GL:GQ 0/1:11,11:18:-33.65,-5.43,-32.56:99
-chr1 3453209 rs13374309 C G 5.21 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=3.14;MQ=57.20;MQ0=0;OQ=292.98;QD=15.42;SB=-154.58 GT:AD:DP:GL:GQ 0/1:9,10:17:-37.71,-5.13,-33.06:99
-chr1 3455556 rs7539836 A G 113.09 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=359.37;QD=13.82;SB=-189.55 GT:AD:DP:GL:GQ 0/1:12,14:25:-46.76,-7.53,-43.20:99
-chr1 3458010 rs7533321 G A 155.67 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.46;MQ0=0;OQ=810.48;QD=18.85;SB=-428.48 GT:AD:DP:GL:GQ 0/1:17,25:39:-96.09,-11.75,-47.40:99
-chr1 3458818 rs6413780 A C 146.27 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=401.98;QD=8.20;SB=-115.74 GT:AD:DP:GL:GQ 0/1:29,20:47:-57.64,-14.16,-107.92:99
-chr1 3458949 rs7355038 G A 151.46 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.19;MQ0=0;OQ=998.13;QD=19.19;SB=-471.50 GT:AD:DP:GL:GQ 0/1:22,30:52:-118.77,-15.67,-71.64:99
-chr1 3460223 rs10909965 T G 23.16 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=1;HaplotypeScore=2.59;MQ=58.78;MQ0=0;OQ=201.44;QD=10.60;SB=-54.94 GT:AD:DP:GL:GQ 0/1:10,9:17:-28.55,-5.12,-30.64:99
-chr1 3460241 rs12078542 T C 57.79 PASS AC=1;AF=0.50;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.39;MQ0=0;OQ=207.08;QD=7.14;SB=-117.62 GT:AD:DP:GL:GQ 0/1:17,12:22:-30.63,-6.64,-46.05:99
-chr1 3460729 rs1557089 T G 340.61 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.05;MQ0=0;OQ=311.87;QD=12.99;SB=-162.75 GT:AD:DP:GL:GQ 0/1:12,12:20:-40.49,-6.02,-30.26:99
-chr1 3462253 rs7516641 A G 481.67 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=514.29;QD=11.96;SB=-180.52 GT:AD:DP:GL:GQ 0/1:23,20:43:-67.67,-12.96,-92.19:99
-chr1 3466443 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=45;Dels=0.02;HRun=17;HaplotypeScore=21.57;MQ=53.85;MQ0=0;OQ=205.19;QD=4.56;SB=-78.83 GT:AD:DP:GL:GQ 0/1:24,20:32:-33.15,-9.34,-78.96:99
-chr1 3466697 . C G 64.69 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.96;MQ0=0;OQ=671.74;QD=12.44;SB=-259.12 GT:AD:DP:GL:GQ 0/1:31,23:50:-85.55,-15.09,-116.59:99
-chr1 3474782 rs56410789 G A 184.63 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=59.61;MQ0=0;OQ=703.19;QD=14.65;SB=-349.63 GT:AD:DP:GL:GQ 0/1:25,22:45:-89.80,-16.20,-75.19:99
-chr1 3480873 . T C 0.25 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=1.82;MQ=59.06;MQ0=0;OQ=234.33;QD=11.72;SB=-33.65 GT:AD:DP:GL:GQ 0/1:10,10:19:-32.44,-5.72,-41.44:99
-chr1 3480967 rs4431782 T C 9.06 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=2.79;MQ=59.14;MQ0=0;OQ=141.27;QD=5.23;SB=-37.66 GT:AD:DP:GL:GQ 0/1:16,11:24:-24.65,-7.24,-64.66:99
-chr1 3482056 rs2821057 A G 50.28 Indel AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.04;HRun=0;HaplotypeScore=40.06;MQ=43.76;MQ0=3;QD=0.93;SB=-23.61 GT:AD:DP:GL:GQ 0/1:44,8:48:-22.18,-13.87,-154.71:83.12
-chr1 3483124 rs2821056 A T 583.97 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.89;MQ0=0;OQ=1839.69;QD=37.54;SB=-868.96 GT:AD:DP:GL:GQ 1/1:0,49:49:-187.56,-14.76,-0.01:99
-chr1 3483560 rs2821055 T C 111.86 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=57.13;MQ0=0;OQ=1375.27;QD=31.98;SB=-687.18 GT:AD:DP:GL:GQ 1/1:0,43:41:-141.13,-12.35,-0.02:99
-chr1 3483710 rs2821054 G T 266.86 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.07;MQ0=0;OQ=1733.58;QD=34.67;SB=-747.08 GT:AD:DP:GL:GQ 1/1:0,50:50:-176.97,-15.07,-0.02:99
-chr1 3484389 rs2794348 A G 1.13 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=6.39;MQ=58.05;MQ0=0;OQ=1127.20;QD=31.31;SB=-545.88 GT:AD:DP:GL:GQ 1/1:0,36:34:-116.33,-10.25,-0.02:99
-chr1 3484478 rs2794347 G C 132.33 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=1529.91;QD=34.77;SB=-715.91 GT:AD:DP:GL:GQ 1/1:0,44:40:-156.62,-12.09,-0.05:99
-chr1 3484580 rs2794346 G A 64.20 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=980.89;QD=28.85;SB=-342.41 GT:AD:DP:GL:GQ 1/1:1,32:27:-101.70,-8.14,-0.02:81.23
-chr1 3485237 rs2794344 G A 227.50 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=58.20;MQ0=0;OQ=1135.92;QD=18.03;SB=-434.44 GT:AD:DP:GL:GQ 0/1:26,37:58:-134.36,-17.49,-77.46:99
-chr1 3485276 rs2794343 G T 262.44 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=58.14;MQ0=0;OQ=635.86;QD=12.00;SB=-319.27 GT:AD:DP:GL:GQ 0/1:28,25:50:-81.94,-15.07,-81.25:99
-chr1 3485297 rs2794342 T C 164.76 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.19;MQ=55.76;MQ0=0;OQ=873.19;QD=16.17;SB=-382.03 GT:AD:DP:GL:GQ 0/1:20,34:51:-105.98,-15.38,-70.34:99
-chr1 3485317 . C T 0.61 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=55.51;MQ0=0;OQ=217.69;QD=4.03;SB=-62.86 GT:AD:DP:GL:GQ 0/1:42,11:46:-38.92,-13.87,-116.02:99
-chr1 3485320 . C T 0.57 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=55.81;MQ0=0;OQ=186.10;QD=3.58;SB=-62.80 GT:AD:DP:GL:GQ 0/1:41,10:44:-35.15,-13.26,-125.21:99
-chr1 3485329 rs56044258 C G 8.19 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=4.19;MQ=55.35;MQ0=0;OQ=1813.27;QD=38.58;SB=-922.42 GT:AD:DP:GL:GQ 1/1:0,47:43:-184.93,-12.96,-0.02:99
-chr1 3485401 rs2821053 T C 608.29 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.09;MQ0=0;OQ=2115.06;QD=34.11;SB=-1060.08 GT:AD:DP:GL:GQ 1/1:0,62:60:-215.11,-18.07,-0.02:99
-chr1 3485841 rs2794341 T C 133.27 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=59.57;MQ0=0;OQ=1280.08;QD=29.77;SB=-579.98 GT:AD:DP:GL:GQ 1/1:0,43:41:-131.63,-12.37,-0.04:99
-chr1 3485914 rs2821052 G C 139.61 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.60;MQ0=0;OQ=1918.65;QD=40.82;SB=-901.42 GT:AD:DP:GL:GQ 1/1:0,47:46:-195.47,-13.86,-0.02:99
-chr1 3486188 rs2821051 T C 180.06 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.51;MQ0=0;OQ=1502.08;QD=31.96;SB=-651.24 GT:AD:DP:GL:GQ 1/1:0,47:44:-153.81,-13.26,-0.02:99
-chr1 3486339 rs2794340 T C 195.59 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=747.54;QD=27.69;SB=-185.41 GT:AD:DP:GL:GQ 1/1:0,27:25:-78.37,-7.54,-0.03:75.17
-chr1 3486805 rs2794339 G A 3.01 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=790.02;QD=34.35;SB=-39.54 GT:AD:DP:GL:GQ 1/1:0,23:21:-82.60,-6.33,-0.01:63.20
-chr1 3486898 . C G 23.94 LowQual AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=60.00;MQ0=0;QD=2.18;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,7:5:-7.19,-1.52,-10.35:56.76
-chr1 3486969 rs2821050 A G 170.61 PASS AC=2;AF=1.00;AN=2;DB;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.66;MQ0=0;OQ=230.85;QD=23.09;SB=-101.03 GT:AD:DP:GL:GQ 1/1:0,10:9:-26.68,-2.72,-0.01:27.04
-chr1 3487085 rs2821049 G A 44.18 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.41;MQ0=1;OQ=1103.43;QD=35.59;SB=-441.32 GT:AD:DP:GL:GQ 1/1:0,31:29:-113.94,-8.74,-0.01:87.28
-chr1 3487785 rs2821048 T C 3.27 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.07;MQ0=0;OQ=795.96;QD=29.48;SB=-323.61 GT:AD:DP:GL:GQ 1/1:0,26:24:-83.19,-7.23,-0.01:72.20
-chr1 3488346 rs2821047 A C 41.05 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.50;MQ0=0;OQ=1833.45;QD=33.34;SB=-923.21 GT:AD:DP:GL:GQ 1/1:0,55:53:-186.95,-15.96,-0.02:99
-chr1 3488543 rs2794338 G A 5.07 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=2.25;MQ=59.38;MQ0=0;OQ=1108.21;QD=36.94;SB=-425.07 GT:AD:DP:GL:GQ 1/1:0,30:29:-114.42,-8.74,-0.01:87.27
-chr1 3488600 rs2821046 T C 153.98 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.16;MQ0=0;OQ=1640.68;QD=29.83;SB=-825.95 GT:AD:DP:GL:GQ 1/1:0,55:53:-167.70,-15.99,-0.05:99
-chr1 3488885 rs2794337 T G 92.94 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.67;MQ0=0;OQ=1036.65;QD=29.62;SB=-469.86 GT:AD:DP:GL:GQ 1/1:0,35:34:-107.28,-10.25,-0.03:99
-chr1 3488911 rs2794336 C A 491.72 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1159.72;QD=31.34;SB=-543.79 GT:AD:DP:GL:GQ 1/1:0,37:35:-119.58,-10.55,-0.02:99
-chr1 3489106 rs2821045 A G 0.45 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=15.70;MQ=58.09;MQ0=0;OQ=1342.02;QD=27.39;SB=-607.24 GT:AD:DP:GL:GQ 1/1:1,48:44:-137.83,-13.27,-0.05:99
-chr1 3489389 rs2794335 C G 104.49 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.91;MQ0=0;OQ=2044.98;QD=41.73;SB=-1038.63 GT:AD:DP:GL:GQ 1/1:0,49:48:-208.10,-14.46,-0.02:99
-chr1 3489541 rs2821044 A G 154.02 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=51.93;MQ0=0;OQ=1856.46;QD=32.01;SB=-939.38 GT:AD:DP:GL:GQ 1/1:0,58:53:-189.25,-15.96,-0.02:99
-chr1 3489730 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=5.70;MQ=38.46;MQ0=13;OQ=219.88;QD=2.71;SB=-20.96 GT:AD:DP:GL:GQ 0/1:65,15:58:-42.77,-17.50,-145.53:99
-chr1 3489856 rs61762194 A G 22.79 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=13.90;MQ=6.46;MQ0=57;QD=0.35;SB=-34.94 GT:AD:DP:GL:GQ 0/1:19,46:3:-6.46,-0.90,-4.17:32.64
-chr1 3490108 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=122;Dels=0.00;HRun=0;HaplotypeScore=22.57;MQ=11.21;MQ0=79;OQ=52.09;QD=0.43;SB=2.03 GT:AD:DP:GL:GQ 0/1:64,55:12:-12.11,-3.62,-27.46:84.92
-chr1 3490124 . G C 37.51 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=28.89;MQ=9.24;MQ0=69;QD=0.40;SB=-36.43 GT:AD:DP:GL:GQ 0/1:52,37:3:-7.94,-0.91,-4.59:36.89
-chr1 3490204 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=9.07;MQ=18.33;MQ0=40;OQ=221.10;QD=2.91;SB=-48.02 GT:AD:DP:GL:GQ 0/1:38,34:16:-30.22,-4.83,-23.80:99
-chr1 3490220 . G C 14.47 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=1;HaplotypeScore=18.26;MQ=21.29;MQ0=44;QD=0.14;SB=5.04 GT:AD:DP:GL:GQ 0/1:89,13:27:-12.87,-8.16,-91.89:47.15
-chr1 3490238 . G C 29.48 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=1;HaplotypeScore=19.99;MQ=24.83;MQ0=54;QD=0.24;SB=65.23 GT:AD:DP:GL:GQ 0/1:92,32:39:-18.02,-11.79,-132.68:62.32
-chr1 3490274 rs61762197 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=195;Dels=0.00;HRun=0;HaplotypeScore=31.55;MQ=26.52;MQ0=97;OQ=140.78;QD=0.72;SB=53.20 GT:AD:DP:GL:GQ 0/1:172,21:60:-35.47,-18.11,-209.36:99
-chr1 3490294 rs61762198 G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=144;Dels=0.00;HRun=0;HaplotypeScore=18.88;MQ=30.38;MQ0=61;OQ=410.69;QD=2.85;SB=-6.44 GT:AD:DP:GL:GQ 0/1:110,32:48:-58.84,-14.49,-102.11:99
-chr1 3490309 rs61762199 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=126;Dels=0.00;HRun=0;HaplotypeScore=43.37;MQ=33.08;MQ0=48;OQ=683.06;QD=5.42;SB=-30.63 GT:AD:DP:GL:GQ 0/1:101,25:47:-85.76,-14.17,-79.46:99
-chr1 3490312 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=46.24;MQ=34.26;MQ0=40;OQ=200.77;QD=1.72;SB=-32.50 GT:AD:DP:GL:GQ 0/1:85,31:40:-35.43,-12.07,-95.25:99
-chr1 3490435 rs2995009 G A 597.77 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.35;MQ0=0;OQ=1467.09;QD=38.61;SB=-711.36 GT:AD:DP:GL:GQ 1/1:0,38:38:-150.31,-11.45,-0.01:99
-chr1 3491040 rs2995008 T C 284.33 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1828.19;QD=32.07;SB=-897.29 GT:AD:DP:GL:GQ 1/1:0,57:55:-186.44,-16.58,-0.04:99
-chr1 3492147 . G A 23.72 PASS AC=2;AF=1.00;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=55.26;MQ0=1;OQ=1679.66;QD=32.93;SB=-585.96 GT:AD:DP:GL:GQ 1/1:1,50:45:-171.57,-13.56,-0.02:99
-chr1 3492404 rs2487682 G A 109.67 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=55.97;MQ0=0;OQ=1664.54;QD=34.68;SB=-566.34 GT:AD:DP:GL:GQ 1/1:2,46:43:-170.05,-12.95,-0.01:99
-chr1 3493214 rs10909977 C T 290.65 PASS AC=2;AF=1.00;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=982.44;QD=37.79;SB=-341.35 GT:AD:DP:GL:GQ 1/1:0,26:26:-101.84,-7.83,-0.01:78.25
-chr1 3493427 rs12133810 G A 0.43 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=6.10;MQ=60.00;MQ0=0;OQ=1731.58;QD=36.07;SB=-586.35 GT:AD:DP:GL:GQ 1/1:0,47:45:-176.76,-13.56,-0.02:99
-chr1 3493933 rs12139206 T C 718.86 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.76;MQ0=0;OQ=2133.52;QD=33.87;SB=-1000.69 GT:AD:DP:GL:GQ 1/1:0,63:61:-216.96,-18.38,-0.03:99
-chr1 3494278 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=29.95;MQ=39.18;MQ0=0;OQ=57.06;QD=1.00;SB=32.12 GT:AD:DP:GL:GQ 0/1:51,6:50:-24.05,-15.06,-154.00:89.90
-chr1 3494280 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=31.95;MQ=39.34;MQ0=0;OQ=98.32;QD=1.76;SB=29.10 GT:AD:DP:GL:GQ 0/1:46,10:49:-27.88,-14.76,-138.47:99
-chr1 3494307 . T G 201.76 SnpCluster AC=1;AF=0.50;AN=2;DP=58;Dels=0.10;HRun=2;HaplotypeScore=112.88;MQ=32.38;MQ0=0;QD=3.48;SB=-117.62 GT:AD:DP:GL:GQ 0/1:34,18:28:-31.59,-8.13,-64.60:99
-chr1 3494310 rs61762200 C A 192.29 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=121.85;MQ=30.79;MQ0=0;QD=3.43;SB=-60.75 GT:AD:DP:GL:GQ 0/1:36,18:28:-30.95,-8.43,-66.22:99
-chr1 3494317 . G T 32.47 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=81.33;MQ=29.05;MQ0=0;QD=0.60;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,11:25:-14.06,-7.53,-79.10:65.31
-chr1 3494320 . G A 676.99 SnpCluster AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=53.82;MQ=29.06;MQ0=0;QD=13.02;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,41:24:-78.21,-7.23,-14.28:70.50
-chr1 3494331 . C T 224.74 SnpCluster AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=74.35;MQ=28.87;MQ0=0;QD=4.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:29,19:11:-29.07,-3.31,-14.19:99
-chr1 3494338 . G A 223.95 SnpCluster AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=78.36;MQ=28.88;MQ0=0;QD=4.76;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,22:10:-28.69,-3.01,-9.91:68.95
-chr1 3494340 . G A 250.50 SnpCluster AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=74.35;MQ=28.88;MQ0=0;QD=5.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,38:10:-31.35,-3.01,-6.64:36.27
-chr1 3494344 . G A 85.25 SnpCluster AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=1;HaplotypeScore=68.88;MQ=28.67;MQ0=0;QD=1.85;SB=-10.00 GT:AD:DP:GL:GQ 0/1:41,5:14:-16.03,-4.22,-34.38:99
-chr1 3494347 . A T 143.02 SnpCluster AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=0;HaplotypeScore=69.92;MQ=28.59;MQ0=0;QD=3.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,19:7:-19.69,-2.11,-6.98:48.71
-chr1 3494357 . G T 24.90 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=73.10;MQ=28.56;MQ0=0;QD=0.73;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,15:5:-7.28,-1.51,-10.87:57.73
-chr1 3494360 . G A 23.23 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=81.86;MQ=28.53;MQ0=0;QD=0.73;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,11:6:-7.41,-1.81,-14.17:56.05
-chr1 3494364 . G A 65.76 SnpCluster AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=67.04;MQ=28.12;MQ0=1;QD=1.93;SB=-10.00 GT:AD:DP:GL:GQ 0/1:29,5:7:-11.97,-2.11,-13.57:98.60
-chr1 3494367 . G T 116.01 SnpCluster AC=1;AF=0.50;AN=2;DP=34;Dels=0.03;HRun=0;HaplotypeScore=76.86;MQ=28.12;MQ0=1;QD=3.41;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,19:9:-17.59,-2.71,-15.13:99
-chr1 3494370 . G C 77.61 SnpCluster AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=1;HaplotypeScore=62.98;MQ=28.25;MQ0=1;QD=2.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,7:9:-20.69,-9.65,-24.68:99
-chr1 3494377 . G T 26.91 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=64.80;MQ=28.23;MQ0=1;QD=1.03;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,4:4:-7.18,-1.20,-7.71:59.73
-chr1 3494378 . G A 98.30 SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=59.24;MQ=28.44;MQ0=1;QD=3.78;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,11:7:-15.22,-2.11,-10.61:84.98
-chr1 3494380 . G A 43.51 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=65.22;MQ=28.44;MQ0=1;QD=1.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,15:4:-12.40,-4.77,-6.87:20.98
-chr1 3494384 . G A 26.23 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=1;HaplotypeScore=51.99;MQ=28.44;MQ0=1;QD=1.01;SB=-10.00 GT:AD:DP:GL:GQ 0/1:20,6:7:-8.02,-2.11,-15.94:59.06
-chr1 3494390 . G A 130.87 SnpCluster AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=39.84;MQ=28.27;MQ0=1;QD=6.54;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,12:6:-18.18,-1.81,-3.67:18.63
-chr1 3494414 . G A 19.25 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=1;HaplotypeScore=22.06;MQ=28.20;MQ0=1;QD=1.13;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,2:8:-7.61,-2.41,-20.11:52.04
-chr1 3494416 . G C 113.75 SnpCluster AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=18.24;MQ=27.40;MQ0=1;QD=6.32;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,4:8:-17.07,-2.41,-16.09:99
-chr1 3494417 . A T 24.41 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=25.18;MQ=27.40;MQ0=1;QD=1.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,5:8:-14.34,-8.61,-21.17:57.23
-chr1 3494420 . C A 17.09 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=28.79;MQ=27.40;MQ0=1;QD=0.95;SB=-10.00 GT:AD:DP:GL:GQ 0/1:7,11:6:-6.79,-1.81,-13.20:49.84
-chr1 3494428 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=21.58;MQ=27.57;MQ0=1;OQ=101.33;QD=5.07;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,6:9:-16.13,-2.71,-15.44:99
-chr1 3494440 . A G 20.51 LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=4;HaplotypeScore=16.99;MQ=27.20;MQ0=1;QD=1.28;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,2:6:-7.14,-1.81,-14.72:53.31
-chr1 3494450 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=19.98;MQ=27.07;MQ0=1;OQ=136.86;QD=9.12;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,11:7:-19.08,-2.11,-6.94:48.30
-chr1 3494456 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=17;Dels=0.12;HRun=1;HaplotypeScore=13.10;MQ=27.31;MQ0=1;OQ=95.30;QD=5.61;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,5:11:-16.13,-3.31,-22.08:99
-chr1 3494463 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=15.99;MQ=27.75;MQ0=0;OQ=76.78;QD=6.98;SB=-10.00 GT:AD:DP:GL:GQ 0/1:8,3:5:-12.47,-1.51,-7.14:56.32
-chr1 3494470 . G A 37.25 LowQual AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=9.99;MQ=29.00;MQ0=0;QD=4.66;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,6:3:-7.91,-0.90,-3.57:26.65
-chr1 3494476 . C G 10.99 LowQual AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=6.99;MQ=29.00;MQ0=0;QD=1.83;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,3:1:-4.35,-0.30,-0.00:1.76
-chr1 3494500 . C A 20.04 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=24.21;MQ=29.00;MQ0=0;QD=1.43;SB=-10.00 GT:AD:DP:GL:GQ 0/1:6,8:6:-7.09,-1.81,-14.10:52.83
-chr1 3494506 . G A 17.29 LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.05;HRun=1;HaplotypeScore=32.64;MQ=29.00;MQ0=0;QD=0.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,4:10:-8.02,-3.01,-25.65:50.04
-chr1 3494513 . G A 25.23 LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=41.45;MQ=31.40;MQ0=0;QD=1.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,4:6:-7.61,-1.81,-13.27:58.06
-chr1 3494520 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=37.55;MQ=33.42;MQ0=0;OQ=64.77;QD=3.24;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,13:7:-11.87,-2.11,-12.97:97.60
-chr1 3494524 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=1;HaplotypeScore=27.25;MQ=33.22;MQ0=0;OQ=65.77;QD=3.13;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,3:5:-11.37,-1.51,-6.04:45.31
-chr1 3494544 . G A 102.31 SnpCluster AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=1;HaplotypeScore=60.62;MQ=32.58;MQ0=0;QD=4.09;SB=-10.00 GT:AD:DP:GL:GQ 0/1:21,4:9:-16.23,-2.71,-16.04:99
-chr1 3494547 . G T 87.64 SnpCluster AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=65.61;MQ=32.58;MQ0=0;QD=3.51;SB=-10.00 GT:AD:DP:GL:GQ 0/1:19,5:8:-14.46,-2.41,-14.43:99
-chr1 3494550 . A C 79.94 SnpCluster AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=55.04;MQ=32.72;MQ0=0;QD=3.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,6:8:-16.58,-5.30,-13.73:84.35
-chr1 3494557 . G T 60.29 SnpCluster AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=39.81;MQ=31.18;MQ0=0;QD=2.87;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,8:4:-10.52,-1.20,-3.86:26.53
-chr1 3494560 . G A 91.28 SnpCluster AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=38.65;MQ=31.18;MQ0=0;QD=4.35;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,11:4:-16.06,-4.57,-3.40:11.70
-chr1 3494564 . G A 29.24 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=1;HaplotypeScore=32.50;MQ=31.29;MQ0=0;QD=1.46;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,2:6:-8.02,-1.81,-12.47:62.07
-chr1 3494574 . A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=26.98;MQ=29.00;MQ0=0;OQ=69.17;QD=4.94;SB=-10.00 GT:AD:DP:GL:GQ 1/1:6,8:3:-10.41,-0.90,-0.00:9.03
-chr1 3494590 . G A 142.91 SnpCluster AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=22.40;MQ=29.00;MQ0=0;QD=9.53;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,8:6:-19.38,-1.81,-3.57:17.63
-chr1 3494597 . G T 106.99 SnpCluster AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=25.38;MQ=29.00;MQ0=0;QD=7.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,5:11:-17.30,-3.31,-21.74:99
-chr1 3494600 . G A 30.23 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=29.00;MQ0=0;QD=3.02;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,6:5:-7.81,-1.51,-10.71:63.06
-chr1 3494624 . A G 3.02 PASS AC=1;AF=0.50;AN=2;DP=6;Dels=0.00;HRun=1;HaplotypeScore=2.14;MQ=23.68;MQ0=1;OQ=61.17;QD=10.20;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,5:4:-10.61,-1.20,-4.06:28.52
-chr1 3494941 rs3122612 T C 27.60 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.13;MQ0=0;OQ=190.96;QD=21.22;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,9:7:-22.68,-2.11,-0.00:21.05
-chr1 3496357 rs2794320 A G 629.67 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.59;MQ0=0;OQ=2197.16;QD=34.88;SB=-1063.87 GT:AD:DP:GL:GQ 1/1:0,63:62:-223.32,-18.67,-0.02:99
-chr1 3497672 rs12138013 G A 514.21 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1894.53;QD=36.43;SB=-916.70 GT:AD:DP:GL:GQ 1/1:0,52:50:-193.07,-15.07,-0.03:99
-chr1 3497721 rs4648527 G A 5.98 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=5.91;MQ=58.60;MQ0=0;OQ=1808.59;QD=36.17;SB=-904.68 GT:AD:DP:GL:GQ 1/1:0,50:47:-184.46,-14.16,-0.02:99
-chr1 3497811 rs4233026 A G 453.03 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=985.33;QD=29.86;SB=-500.18 GT:AD:DP:GL:GQ 1/1:0,33:33:-102.16,-9.96,-0.04:99
-chr1 3499530 rs10909980 C T 12.32 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.36;MQ0=0;OQ=831.01;QD=36.13;SB=-270.86 GT:AD:DP:GL:GQ 1/1:0,23:22:-86.69,-6.63,-0.01:66.21
-chr1 3501794 rs7513275 A G 98.91 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=60.00;MQ0=0;OQ=215.59;QD=10.78;SB=-81.80 GT:AD:DP:GL:GQ 0/1:7,13:17:-29.97,-5.13,-27.54:99
-chr1 3502201 rs2794327 C T 251.06 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=1770.81;QD=37.68;SB=-842.63 GT:AD:DP:GL:GQ 1/1:0,47:45:-180.68,-13.55,-0.01:99
-chr1 3502376 rs2821025 T C 189.36 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.06;MQ0=0;OQ=1399.30;QD=34.13;SB=-531.22 GT:AD:DP:GL:GQ 1/1:1,40:40:-143.53,-12.05,-0.02:99
-chr1 3502406 rs2821024 G A 10.93 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.84;MQ=59.12;MQ0=0;OQ=1381.75;QD=37.34;SB=-602.98 GT:AD:DP:GL:GQ 1/1:0,37:36:-141.77,-10.85,-0.01:99
-chr1 3502660 rs2821023 T C 164.14 PASS AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.31;MQ0=0;OQ=631.91;QD=27.47;SB=-134.71 GT:AD:DP:GL:GQ 1/1:0,23:22:-66.81,-6.64,-0.03:66.13
-chr1 3503040 rs3001104 T C 11.75 LowQual AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=53.43;MQ0=0;QD=0.90;SB=-7.00 GT:AD:DP:GL:GQ 0/1:11,2:9:-7.15,-2.72,-25.40:44.29
-chr1 3503107 rs6697282 T C 2.87 PASS AC=2;AF=1.00;AN=2;DB;DP=11;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.92;MQ0=0;OQ=303.24;QD=27.57;SB=-40.95 GT:AD:DP:GL:GQ 1/1:0,11:10:-33.91,-3.01,-0.00:30.08
-chr1 3503479 rs55936822 G A 66.02 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=385.29;QD=13.76;SB=-81.58 GT:AD:DP:GL:GQ 0/1:14,14:27:-49.96,-8.15,-41.31:99
-chr1 3504130 rs3001107 A T 92.54 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=60.00;MQ0=0;OQ=1158.27;QD=35.10;SB=-515.45 GT:AD:DP:GL:GQ 1/1:0,33:32:-119.42,-9.64,-0.01:96.30
-chr1 3504221 rs2995006 A G 438.56 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1363.50;QD=34.96;SB=-648.28 GT:AD:DP:GL:GQ 1/1:0,39:39:-139.95,-11.75,-0.02:99
-chr1 3504611 rs6701230 T C 61.10 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=1071.54;QD=26.79;SB=-482.12 GT:AD:DP:GL:GQ 1/1:0,40:34:-110.77,-10.26,-0.03:99
-chr1 3505152 . C G 6.95 PASS AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=54.64;MQ0=0;OQ=215.54;QD=15.40;SB=-56.93 GT:AD:DP:GL:GQ 1/1:2,12:6:-25.13,-1.81,-0.00:18.06
-chr1 3505256 rs2794328 C A 31.98 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.33;MQ0=0;OQ=824.44;QD=29.44;SB=-191.27 GT:AD:DP:GL:GQ 1/1:1,27:24:-86.04,-7.23,-0.01:72.19
-chr1 3505590 rs2821011 T C 3.95 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=1307.30;QD=29.71;SB=-329.39 GT:AD:DP:GL:GQ 1/1:0,44:40:-134.34,-12.06,-0.03:99
-chr1 3506096 rs4648395 G A 428.92 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.73;MQ0=0;OQ=1105.43;QD=35.66;SB=-453.34 GT:AD:DP:GL:GQ 1/1:0,31:29:-114.14,-8.74,-0.01:87.28
-chr1 3506280 rs7552280 C T 597.55 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1498.57;QD=38.42;SB=-699.42 GT:AD:DP:GL:GQ 1/1:0,39:38:-153.45,-11.45,-0.01:99
-chr1 3506640 rs4018202 C T 591.66 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1796.97;QD=36.67;SB=-852.00 GT:AD:DP:GL:GQ 1/1:0,49:46:-183.30,-13.86,-0.02:99
-chr1 3507139 rs4648528 C T 150.35 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.89;MQ0=0;OQ=1470.55;QD=35.01;SB=-673.24 GT:AD:DP:GL:GQ 1/1:0,42:39:-150.66,-11.76,-0.02:99
-chr1 3507337 rs61373700 C G 106.29 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.76;MQ=57.26;MQ0=0;OQ=1716.27;QD=39.91;SB=-832.44 GT:AD:DP:GL:GQ 1/1:1,42:42:-175.24,-12.66,-0.02:99
-chr1 3507396 rs6693958 G A 63.42 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=58.29;MQ0=0;OQ=1559.78;QD=38.04;SB=-721.97 GT:AD:DP:GL:GQ 1/1:0,41:40:-159.58,-12.05,-0.01:99
-chr1 3507433 rs59013990 G C 40.65 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.41;MQ0=0;OQ=1114.70;QD=28.58;SB=-265.33 GT:AD:DP:GL:GQ 1/1:0,38:29:-115.08,-8.75,-0.02:87.28
-chr1 3508244 rs2821012 T C 433.71 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=981.44;QD=28.87;SB=-510.19 GT:AD:DP:GL:GQ 1/1:0,34:32:-101.76,-9.65,-0.03:96.21
-chr1 3508275 rs12410528 G A 77.57 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.32;MQ0=0;OQ=639.66;QD=18.81;SB=-281.31 GT:AD:DP:GL:GQ 0/1:14,20:31:-76.59,-9.34,-39.32:99
-chr1 3508279 rs12401505 C T 12.42 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=59.32;MQ0=0;OQ=621.28;QD=18.27;SB=-279.19 GT:AD:DP:GL:GQ 0/1:14,19:31:-74.75,-9.34,-43.77:99
-chr1 3508347 rs56770023 C T 305.75 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=1098.04;QD=36.60;SB=-308.27 GT:AD:DP:GL:GQ 1/1:0,30:29:-113.40,-8.74,-0.01:87.27
-chr1 3508348 rs60957843 A G 332.32 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=996.70;QD=34.37;SB=-270.42 GT:AD:DP:GL:GQ 1/1:0,29:29:-103.27,-8.74,-0.01:87.25
-chr1 3508499 rs2821013 C A 29.08 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=59.05;MQ0=0;OQ=1719.86;QD=35.10;SB=-757.10 GT:AD:DP:GL:GQ 1/1:0,49:47:-175.58,-14.15,-0.01:99
-chr1 3508603 rs7514061 C T 105.49 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.33;MQ0=0;OQ=1426.84;QD=33.97;SB=-607.00 GT:AD:DP:GL:GQ 1/1:0,42:38:-146.28,-11.45,-0.02:99
-chr1 3508717 rs2821014 A C 0.35 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=3;HaplotypeScore=1.13;MQ=59.42;MQ0=0;OQ=907.74;QD=22.69;SB=-295.54 GT:AD:DP:GL:GQ 1/1:0,37:28:-94.37,-8.43,-0.01:84.22
-chr1 3508804 rs7521546 T C 5.12 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=2;HaplotypeScore=1.42;MQ=57.17;MQ0=0;OQ=713.23;QD=28.53;SB=-330.78 GT:AD:DP:GL:GQ 1/1:0,25:24:-74.93,-7.24,-0.02:72.16
-chr1 3509294 rs12024499 A G 18.02 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=58.37;MQ0=0;OQ=1073.16;QD=24.96;SB=-338.38 GT:AD:DP:GL:GQ 1/1:0,43:37:-110.95,-11.17,-0.05:99
-chr1 3509463 rs12025426 T C 57.07 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.00;MQ0=0;OQ=1068.56;QD=25.44;SB=-559.52 GT:AD:DP:GL:GQ 1/1:0,42:36:-110.49,-10.87,-0.05:99
-chr1 3509651 rs56328010 C G 123.58 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=1.54;MQ=58.84;MQ0=0;OQ=608.86;QD=15.22;SB=-231.35 GT:AD:DP:GL:GQ 0/1:21,19:38:-75.63,-11.46,-87.10:99
-chr1 3509894 rs10752738 A G 106.20 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=57.39;MQ0=0;OQ=1124.20;QD=31.23;SB=-480.45 GT:AD:DP:GL:GQ 1/1:0,36:33:-116.02,-9.94,-0.01:99
-chr1 3509987 rs2821015 T C 88.77 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.95;MQ0=0;OQ=1023.67;QD=31.99;SB=-513.41 GT:AD:DP:GL:GQ 1/1:0,31:32:-108.71,-12.22,-2.76:94.68
-chr1 3510191 rs2794356 C A 66.82 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=58.63;MQ0=0;OQ=1082.36;QD=31.83;SB=-352.40 GT:AD:DP:GL:GQ 1/1:0,34:33:-111.84,-9.95,-0.02:99
-chr1 3510399 rs2794355 C T 148.33 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.22;MQ0=0;OQ=1723.81;QD=37.47;SB=-800.07 GT:AD:DP:GL:GQ 1/1:0,46:45:-175.99,-13.56,-0.02:99
-chr1 3510532 rs2821016 A C 65.43 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=868.96;QD=27.16;SB=-409.86 GT:AD:DP:GL:GQ 1/1:0,32:29:-90.51,-8.74,-0.03:87.13
-chr1 3511971 rs56140438 T C 2680.91 Indel AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.68;MQ0=0;QD=34.82;SB=-1364.21 GT:AD:DP:GL:GQ 1/1:0,77:76:-271.70,-22.89,-0.02:99
-chr1 3513689 rs2794354 T C 23.29 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=1332.54;QD=30.29;SB=-459.40 GT:AD:DP:GL:GQ 1/1:0,44:41:-136.87,-12.36,-0.03:99
-chr1 3513757 rs2821018 T C 1.28 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=52.28;MQ0=0;OQ=1127.31;QD=32.21;SB=-555.88 GT:AD:DP:GL:GQ 1/1:0,35:33:-116.33,-9.94,-0.01:99
-chr1 3513776 rs2821019 A C 16.58 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=3.24;MQ=52.84;MQ0=0;OQ=1256.82;QD=30.65;SB=-634.67 GT:AD:DP:GL:GQ 1/1:0,41:37:-129.29,-11.15,-0.02:99
-chr1 3513778 rs2821020 G A 39.72 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=4.08;MQ=53.03;MQ0=0;OQ=1497.87;QD=35.66;SB=-772.68 GT:AD:DP:GL:GQ 1/1:0,42:39:-153.39,-11.75,-0.01:99
-chr1 3515181 rs2794353 G C 0.02 FDRtranche1.00to2.00 AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=5;HaplotypeScore=0.32;MQ=58.30;MQ0=0;OQ=1440.93;QD=40.03;SB=-600.98 GT:AD:DP:GL:GQ 1/1:0,36:34:-147.69,-10.24,-0.01:99
-chr1 3515467 rs36031771 G A 114.23 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1598.59;QD=36.33;SB=-811.32 GT:AD:DP:GL:GQ 1/1:0,44:42:-163.46,-12.66,-0.02:99
-chr1 3515500 rs34852522 G A 546.80 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1591.31;QD=37.01;SB=-737.47 GT:AD:DP:GL:GQ 1/1:1,42:41:-162.73,-12.35,-0.01:99
-chr1 3515696 rs10909986 G A 566.50 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1907.24;QD=38.92;SB=-905.69 GT:AD:DP:GL:GQ 1/1:0,49:48:-194.32,-14.46,-0.01:99
-chr1 3516250 rs12121341 A G 86.74 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1093.76;QD=29.56;SB=-543.02 GT:AD:DP:GL:GQ 1/1:0,37:35:-112.99,-10.56,-0.03:99
-chr1 3518397 rs57902798 C A 88.78 PASS AC=2;AF=1.00;AN=2;DB;DP=25;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.13;MQ0=0;OQ=809.40;QD=32.38;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,25:24:-84.53,-7.23,-0.01:72.21
-chr1 3518534 rs1539126 G A 66.93 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=60.00;MQ0=0;OQ=1266.77;QD=36.19;SB=-476.64 GT:AD:DP:GL:GQ 1/1:0,34:33:-130.27,-9.94,-0.01:99
-chr1 3518701 rs2794326 T C 149.57 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.07;MQ0=0;OQ=1658.37;QD=33.17;SB=-790.25 GT:AD:DP:GL:GQ 1/1:0,50:49:-169.45,-14.76,-0.03:99
-chr1 3519249 rs10909987 G C 637.70 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1866.21;QD=40.57;SB=-960.72 GT:AD:DP:GL:GQ 1/1:0,45:44:-190.22,-13.26,-0.01:99
-chr1 3521082 rs4648396 C T 0.76 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=5;HaplotypeScore=1.32;MQ=59.36;MQ0=0;OQ=2285.23;QD=39.40;SB=-1043.37 GT:AD:DP:GL:GQ 1/1:0,58:57:-232.12,-17.17,-0.02:99
-chr1 3521301 rs4648397 T C 39.86 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.20;MQ0=0;OQ=1821.49;QD=31.41;SB=-869.61 GT:AD:DP:GL:GQ 1/1:0,58:57:-185.78,-17.19,-0.04:99
-chr1 3521455 rs4648398 C T 121.83 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=58.90;MQ0=0;OQ=2021.45;QD=34.26;SB=-686.93 GT:AD:DP:GL:GQ 1/1:0,59:53:-205.75,-15.97,-0.02:99
-chr1 3522563 rs6693192 A G 270.85 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=513.63;QD=9.88;SB=-275.26 GT:AD:DP:GL:GQ 0/1:30,22:52:-70.32,-15.67,-121.33:99
-chr1 3522569 rs6678958 G A 350.18 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=670.10;QD=13.14;SB=-343.79 GT:AD:DP:GL:GQ 0/1:29,22:51:-85.67,-15.38,-96.37:99
-chr1 3523424 rs55728961 C A 42.05 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=240.49;QD=10.46;SB=-10.00 GT:AD:DP:GL:GQ 0/1:14,9:23:-34.26,-6.93,-47.21:99
-chr1 3523484 rs56385042 T C 1.74 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=309.24;QD=11.89;SB=-6.99 GT:AD:DP:GL:GQ 0/1:12,14:26:-42.05,-7.84,-46.91:99
-chr1 3523847 rs10797404 T C 200.70 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=602.56;QD=14.01;SB=-77.79 GT:AD:DP:GL:GQ 0/1:21,22:42:-76.19,-12.65,-81.56:99
-chr1 3524383 rs4648532 A G 19.20 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=2;HaplotypeScore=2.34;MQ=56.80;MQ0=0;OQ=354.98;QD=11.45;SB=-152.32 GT:AD:DP:GL:GQ 0/1:16,15:28:-47.22,-8.44,-59.85:99
-chr1 3524566 rs10909988 A G 146.87 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=60.00;MQ0=0;OQ=306.09;QD=9.28;SB=-127.66 GT:AD:DP:GL:GQ 0/1:17,15:30:-42.93,-9.04,-69.22:99
-chr1 3524652 rs7522500 G C 8.99 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=6.16;MQ=57.13;MQ0=0;OQ=583.92;QD=14.24;SB=-274.31 GT:AD:DP:GL:GQ 0/1:21,20:34:-71.93,-10.26,-66.25:99
-chr1 3524668 rs7522507 G A 205.38 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.19;MQ=57.92;MQ0=0;OQ=639.63;QD=14.21;SB=-315.32 GT:AD:DP:GL:GQ 0/1:22,23:42:-79.91,-12.67,-66.98:99
-chr1 3525324 rs7538707 A G 23.09 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=845.73;QD=19.67;SB=-223.67 GT:AD:DP:GL:GQ 0/1:16,27:42:-100.51,-12.65,-58.85:99
-chr1 3526188 rs4648533 G A 210.95 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=59.62;MQ0=0;OQ=1070.40;QD=17.55;SB=-483.49 GT:AD:DP:GL:GQ 0/1:29,32:60:-128.41,-18.08,-91.39:99
-chr1 3526260 rs4648534 T C 399.13 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.82;MQ0=0;OQ=652.36;QD=10.19;SB=-312.36 GT:AD:DP:GL:GQ 0/1:38,26:63:-87.50,-18.98,-151.40:99
-chr1 3526320 rs4648535 C A 306.52 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=54.45;MQ0=1;OQ=780.07;QD=10.99;SB=-371.06 GT:AD:DP:GL:GQ 0/1:40,31:67:-101.47,-20.18,-141.37:99
-chr1 3526422 rs4648399 A G 309.90 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.19;MQ0=0;OQ=1278.95;QD=17.52;SB=-632.97 GT:AD:DP:GL:GQ 0/1:30,43:71:-152.57,-21.39,-116.57:99
-chr1 3527222 rs4648400 A G 9.46 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=7.73;MQ=57.63;MQ0=0;OQ=603.16;QD=10.40;SB=-310.07 GT:AD:DP:GL:GQ 0/1:32,26:56:-80.48,-16.88,-126.15:99
-chr1 3527718 rs4648401 A G 74.64 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=2;HaplotypeScore=1.41;MQ=56.19;MQ0=0;OQ=587.94;QD=13.67;SB=-299.61 GT:AD:DP:GL:GQ 0/1:18,25:41:-74.44,-12.36,-73.19:99
-chr1 3528340 rs4400556 A T 87.37 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.12;MQ0=0;OQ=994.97;QD=12.59;SB=-457.52 GT:AD:DP:GL:GQ 0/1:45,34:78:-126.28,-23.49,-166.80:99
-chr1 3528361 rs4364818 C T 460.83 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.38;MQ0=0;OQ=945.91;QD=13.14;SB=-450.44 GT:AD:DP:GL:GQ 0/1:42,30:72:-119.57,-21.70,-148.80:99
-chr1 3528695 rs6424087 G C 115.88 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=59.24;MQ0=0;OQ=909.93;QD=16.54;SB=-215.65 GT:AD:DP:GL:GQ 0/1:28,26:51:-109.65,-15.37,-108.54:99
-chr1 3528942 rs10909989 A G 309.85 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.12;MQ=59.00;MQ0=0;OQ=981.47;QD=13.82;SB=-369.60 GT:AD:DP:GL:GQ 0/1:36,35:70:-122.52,-21.09,-148.98:99
-chr1 3529341 rs10909990 A G 374.60 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=58.19;MQ0=0;OQ=916.10;QD=14.78;SB=-423.95 GT:AD:DP:GL:GQ 0/1:29,33:61:-113.27,-18.38,-114.82:99
-chr1 3529884 rs12757620 T G 87.41 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=2.04;MQ=59.45;MQ0=0;OQ=798.71;QD=11.75;SB=-349.72 GT:AD:DP:GL:GQ 0/1:29,39:61:-101.54,-18.38,-103.90:99
-chr1 3532172 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=4.52;MQ=58.17;MQ0=0;OQ=111.86;QD=2.19;SB=68.21 GT:AD:DP:GL:GQ 0/1:30,21:37:-25.62,-11.15,-96.21:99
-chr1 3535452 rs41315304 G A 150.86 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=58.25;MQ0=0;OQ=1069.05;QD=16.70;SB=-525.75 GT:AD:DP:GL:GQ 0/1:32,32:63:-129.18,-18.99,-99.29:99
-chr1 3536795 rs2821007 G A 330.18 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.23;MQ0=0;OQ=1047.23;QD=17.45;SB=-508.04 GT:AD:DP:GL:GQ 0/1:27,33:59:-125.78,-17.78,-94.59:99
-chr1 3537996 rs2760321 T C 53.51 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=58.11;MQ0=0;OQ=916.84;QD=24.78;SB=-335.79 GT:AD:DP:GL:GQ 1/1:0,37:31:-95.30,-9.36,-0.04:93.19
-chr1 3538692 rs2760320 G C 208.41 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.15;MQ0=0;OQ=946.49;QD=15.02;SB=-485.84 GT:AD:DP:GL:GQ 0/1:35,28:62:-116.63,-18.70,-140.41:99
-chr1 3540707 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=4;HaplotypeScore=6.24;MQ=58.05;MQ0=0;OQ=310.07;QD=8.61;SB=35.15 GT:AD:DP:GL:GQ 0/1:20,16:27:-42.43,-8.14,-74.49:99
-chr1 3542640 rs2821061 A G 174.99 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=519.03;QD=10.38;SB=-253.57 GT:AD:DP:GL:GQ 0/1:27,23:48:-69.65,-14.47,-105.26:99
-chr1 3543649 rs2821058 T C 578.48 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=1559.49;QD=29.42;SB=-616.98 GT:AD:DP:GL:GQ 1/1:0,53:50:-159.58,-15.08,-0.04:99
-chr1 3545730 rs2760318 T G 276.33 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=500.47;QD=13.53;SB=-245.40 GT:AD:DP:GL:GQ 0/1:16,21:34:-63.58,-10.25,-53.36:99
-chr1 3546316 rs2760317 T C 74.82 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=59.23;MQ0=0;OQ=365.54;QD=12.18;SB=-82.96 GT:AD:DP:GL:GQ 0/1:16,13:27:-47.97,-8.14,-53.97:99
-chr1 3546766 rs2821032 A G 15.17 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.71;MQ=58.45;MQ0=0;OQ=501.73;QD=10.45;SB=-117.63 GT:AD:DP:GL:GQ 0/1:27,21:44:-66.72,-13.26,-92.65:99
-chr1 3546958 . G C 33.36 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=52.99;MQ0=1;OQ=414.27;QD=15.34;SB=-224.70 GT:AD:DP:GL:GQ 0/1:11,16:20:-50.74,-6.03,-33.52:99
-chr1 3550868 rs12408890 C T 50.15 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=714.51;QD=21.65;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,22:31:-84.07,-9.34,-33.99:99
-chr1 3556431 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=2;HaplotypeScore=3.37;MQ=56.43;MQ0=0;OQ=64.63;QD=2.69;SB=26.11 GT:AD:DP:GL:GQ 0/1:20,4:17:-14.89,-5.14,-48.86:97.47
-chr1 3556566 rs2251098 G A 89.65 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.00;MQ0=0;OQ=575.61;QD=16.45;SB=-81.09 GT:AD:DP:GL:GQ 0/1:16,19:34:-71.09,-10.24,-59.62:99
-chr1 3560743 rs6697769 C T 108.18 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=59.11;MQ0=0;OQ=591.49;QD=14.08;SB=-304.84 GT:AD:DP:GL:GQ 0/1:21,21:39:-74.19,-11.76,-62.78:99
-chr1 3562592 rs10752739 A G 278.74 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=56.42;MQ0=0;OQ=804.83;QD=14.63;SB=-300.66 GT:AD:DP:GL:GQ 0/1:25,30:50:-98.83,-15.07,-88.55:99
-chr1 3562634 rs2181484 A G 237.08 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=59.09;MQ0=0;OQ=421.19;QD=9.16;SB=-138.88 GT:AD:DP:GL:GQ 0/1:25,21:41:-57.77,-12.36,-88.24:99
-chr1 3564279 rs9662739 T A 199.17 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=58.99;MQ0=0;OQ=516.88;QD=11.24;SB=-252.67 GT:AD:DP:GL:GQ 0/1:26,19:44:-68.23,-13.26,-93.50:99
-chr1 3564280 rs9662052 C A 196.24 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=58.99;MQ0=0;OQ=511.23;QD=11.11;SB=-234.91 GT:AD:DP:GL:GQ 0/1:27,19:44:-67.66,-13.26,-88.90:99
-chr1 3565050 rs2368543 T C 86.26 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=57.97;MQ0=0;OQ=928.11;QD=12.89;SB=-445.02 GT:AD:DP:GL:GQ 0/1:38,33:71:-117.49,-21.39,-151.96:99
-chr1 3565471 rs4648544 C T 133.93 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=3;HaplotypeScore=1.75;MQ=59.57;MQ0=0;OQ=791.33;QD=14.65;SB=-418.72 GT:AD:DP:GL:GQ 0/1:30,24:54:-98.68,-16.27,-109.24:99
-chr1 3565693 rs2208993 C G 156.42 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.21;MQ0=0;OQ=372.36;QD=11.28;SB=-74.78 GT:AD:DP:GL:GQ 0/1:21,12:29:-49.27,-8.75,-66.40:99
-chr1 3565739 rs2208992 C T 135.51 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=555.57;QD=16.34;SB=-208.21 GT:AD:DP:GL:GQ 0/1:17,17:34:-69.09,-10.25,-52.42:99
-chr1 3565920 rs2224718 T C 463.85 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.60;MQ0=0;OQ=705.17;QD=14.10;SB=-316.42 GT:AD:DP:GL:GQ 0/1:24,26:48:-88.27,-14.47,-84.73:99
-chr1 3567181 rs4648545 A G 559.92 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1256.11;QD=14.78;SB=-595.27 GT:AD:DP:GL:GQ 0/1:42,43:84:-154.20,-25.30,-171.31:99
-chr1 3568175 rs1885863 C T 33.02 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.95;MQ0=0;OQ=503.58;QD=17.98;SB=-117.62 GT:AD:DP:GL:GQ 0/1:13,15:28:-62.07,-8.43,-48.10:99
-chr1 3569688 rs1885861 A T 263.95 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=805.05;QD=14.38;SB=-228.60 GT:AD:DP:GL:GQ 0/1:30,26:55:-100.35,-16.57,-108.86:99
-chr1 3572104 rs6679556 T A 168.01 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.18;MQ0=0;OQ=534.82;QD=14.07;SB=-147.78 GT:AD:DP:GL:GQ 0/1:19,19:35:-67.31,-10.54,-60.93:99
-chr1 3572105 rs6679560 T G 310.70 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.18;MQ0=0;OQ=483.25;QD=12.72;SB=-122.88 GT:AD:DP:GL:GQ 0/1:19,19:35:-62.15,-10.55,-61.28:99
-chr1 3572847 rs1885860 T C 202.44 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=55.65;MQ0=0;OQ=1537.12;QD=28.47;SB=-796.29 GT:AD:DP:GL:GQ 1/1:0,54:50:-157.34,-15.08,-0.05:99
-chr1 3573552 rs1885859 G C 126.04 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=931.27;QD=19.81;SB=-452.38 GT:AD:DP:GL:GQ 0/1:21,26:45:-109.97,-13.56,-87.15:99
-chr1 3575442 rs3765694 G A 29.42 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=58.20;MQ0=0;OQ=1425.18;QD=36.54;SB=-559.30 GT:AD:DP:GL:GQ 1/1:0,39:37:-146.12,-11.15,-0.01:99
-chr1 3575611 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=3;HaplotypeScore=1.74;MQ=57.17;MQ0=0;OQ=76.89;QD=3.08;SB=14.07 GT:AD:DP:GL:GQ 0/1:14,11:13:-14.90,-3.93,-34.07:99
-chr1 3576288 rs1009345 G A 91.26 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.80;MQ0=0;OQ=1800.40;QD=39.14;SB=-661.66 GT:AD:DP:GL:GQ 1/1:0,46:46:-183.64,-13.86,-0.02:99
-chr1 3576560 rs6657895 G A 60.54 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=59.27;MQ0=0;OQ=1276.11;QD=33.58;SB=-586.96 GT:AD:DP:GL:GQ 1/1:1,37:35:-131.22,-10.55,-0.02:99
-chr1 3577406 rs3765697 C T 0.76 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.64;MQ=56.35;MQ0=0;OQ=1305.04;QD=33.46;SB=-441.58 GT:AD:DP:GL:GQ 1/1:0,39:35:-134.11,-10.55,-0.02:99
-chr1 3578761 rs3765700 G C 611.89 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=1985.98;QD=38.19;SB=-981.19 GT:AD:DP:GL:GQ 1/1:0,52:47:-202.21,-14.17,-0.02:99
-chr1 3578861 rs3765701 T A 287.36 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.60;MQ0=0;OQ=1646.63;QD=35.03;SB=-839.93 GT:AD:DP:GL:GQ 1/1:0,47:46:-168.27,-13.86,-0.02:99
-chr1 3579831 rs56255778 C A 326.05 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=59.60;MQ0=0;OQ=723.70;QD=12.70;SB=-343.37 GT:AD:DP:GL:GQ 0/1:30,27:51:-91.02,-15.37,-85.23:99
-chr1 3580285 rs6671482 G A 126.17 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=1575.76;QD=35.81;SB=-662.31 GT:AD:DP:GL:GQ 1/1:1,43:41:-161.17,-12.35,-0.01:99
-chr1 3587189 . C T 94.68 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.81;MQ0=0;OQ=415.33;QD=10.65;SB=-200.88 GT:AD:DP:GL:GQ 0/1:25,14:37:-55.97,-11.16,-70.24:99
-chr1 3594672 rs12562573 G A 160.10 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.53;MQ0=0;OQ=1829.37;QD=37.33;SB=-900.21 GT:AD:DP:GL:GQ 1/1:0,49:48:-186.54,-14.47,-0.02:99
-chr1 3594957 rs1885872 G A 83.22 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.18;MQ=59.07;MQ0=0;OQ=1704.97;QD=37.89;SB=-859.63 GT:AD:DP:GL:GQ 1/1:0,45:44:-174.10,-13.26,-0.02:99
-chr1 3595447 rs1885870 G C 563.54 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.58;MQ0=0;OQ=1514.49;QD=32.92;SB=-721.32 GT:AD:DP:GL:GQ 1/1:1,45:40:-155.08,-12.08,-0.04:99
-chr1 3596410 rs3765725 C T 84.63 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.54;MQ0=0;OQ=1239.60;QD=30.23;SB=-472.10 GT:AD:DP:GL:GQ 1/1:0,41:33:-127.56,-9.95,-0.02:99
-chr1 3596486 rs3765727 G A 208.84 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.62;MQ0=0;OQ=883.29;QD=18.03;SB=-364.54 GT:AD:DP:GL:GQ 0/1:22,27:47:-105.77,-14.16,-69.54:99
-chr1 3596710 rs3765728 G A 119.20 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.63;MQ0=0;OQ=1974.23;QD=38.71;SB=-814.08 GT:AD:DP:GL:GQ 1/1:0,51:50:-201.02,-15.06,-0.01:99
-chr1 3597380 rs3765730 G A 180.45 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.40;MQ0=0;OQ=530.99;QD=17.13;SB=-202.91 GT:AD:DP:GL:GQ 0/1:13,18:30:-65.42,-9.04,-41.88:99
-chr1 3597871 rs10732965 C T 75.34 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=57.81;MQ0=0;OQ=940.44;QD=33.59;SB=-454.61 GT:AD:DP:GL:GQ 1/1:0,27:25:-97.64,-7.53,-0.01:75.24
-chr1 3598087 rs34868661 A G 136.79 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.05;MQ0=0;OQ=432.49;QD=9.83;SB=-227.39 GT:AD:DP:GL:GQ 0/1:23,20:41:-58.89,-12.36,-89.12:99
-chr1 3598141 rs12126706 C T 141.99 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.13;MQ0=0;OQ=455.42;QD=13.01;SB=-109.06 GT:AD:DP:GL:GQ 0/1:19,16:32:-58.47,-9.65,-57.68:99
-chr1 3598905 rs1078687 G A 163.20 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.42;MQ0=0;OQ=1623.93;QD=33.83;SB=-687.95 GT:AD:DP:GL:GQ 1/1:0,47:43:-166.00,-12.96,-0.02:99
-chr1 3599033 rs879622 G A 151.46 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.44;MQ0=0;OQ=684.79;QD=16.70;SB=-307.82 GT:AD:DP:GL:GQ 0/1:19,22:37:-82.91,-11.15,-57.20:99
-chr1 3599257 rs879621 C A 346.01 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.17;MQ0=0;OQ=766.56;QD=13.69;SB=-343.33 GT:AD:DP:GL:GQ 0/1:29,27:55:-96.51,-16.57,-104.71:99
-chr1 3599783 rs2146660 A G 32.89 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=57.85;MQ0=0;OQ=1704.59;QD=34.79;SB=-814.09 GT:AD:DP:GL:GQ 1/1:0,49:49:-174.06,-14.76,-0.02:99
-chr1 3600146 . T C 37.22 LowQual AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=40.64;MQ0=2;QD=1.16;SB=-35.23 GT:AD:DP:GL:GQ 0/1:25,6:25:-14.54,-7.54,-78.76:70.05
-chr1 3600159 rs34095686 C A 8.52 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=38.58;MQ0=3;OQ=139.88;QD=4.37;SB=-64.01 GT:AD:DP:GL:GQ 0/1:23,9:27:-25.41,-8.14,-69.86:99
-chr1 3600191 . C G 0.30 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=5.79;MQ=36.62;MQ0=7;OQ=200.47;QD=5.90;SB=-62.84 GT:AD:DP:GL:GQ 0/1:21,13:22:-29.96,-6.63,-63.33:99
-chr1 3600194 rs34612797 A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=3;HaplotypeScore=5.12;MQ=34.72;MQ0=8;OQ=74.27;QD=2.12;SB=-16.93 GT:AD:DP:GL:GQ 0/1:24,11:20:-16.74,-6.03,-51.18:99
-chr1 3600242 . C T 27.02 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=31.01;MQ0=9;QD=0.82;SB=14.05 GT:AD:DP:GL:GQ 0/1:28,5:16:-10.81,-4.82,-45.03:59.85
-chr1 3600252 . G A 0.25 PASS AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=0;HaplotypeScore=5.21;MQ=33.15;MQ0=7;OQ=119.84;QD=4.99;SB=-7.00 GT:AD:DP:GL:GQ 0/1:19,5:10:-18.28,-3.02,-16.17:99
-chr1 3600264 rs61762234 A C 2.70 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=2;HaplotypeScore=2.09;MQ=34.74;MQ0=5;OQ=244.22;QD=13.57;SB=-10.00 GT:AD:DP:GL:GQ 1/1:4,14:8:-28.01,-2.41,-0.00:24.07
-chr1 3600309 . C A 44.81 LowQual AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=28.74;MQ0=1;QD=8.96;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:2:-7.89,-0.60,-0.00:6.02
-chr1 3600350 . C T 27.34 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=4.81;MQ=17.75;MQ0=4;QD=2.28;SB=-31.62 GT:AD:DP:GL:GQ 0/1:8,4:3:-6.92,-0.91,-3.40:24.94
-chr1 3600367 rs35012159 G C 33.49 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=10.16;MQ=14.95;MQ0=16;QD=0.93;SB=-40.88 GT:AD:DP:GL:GQ 0/1:29,7:6:-8.44,-1.81,-16.03:66.33
-chr1 3600427 . C T 85.30 DPFilter;HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=22.31;MQ=14.22;MQ0=48;QD=0.87;SB=11.05 GT:AD:DP:GL:GQ 0/1:88,10:24:-19.05,-7.24,-63.74:99
-chr1 3600428 . G A 105.38 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=94;Dels=0.00;HRun=0;HaplotypeScore=22.15;MQ=14.50;MQ0=46;QD=1.12;SB=-26.63 GT:AD:DP:GL:GQ 0/1:84,9:25:-21.36,-7.54,-60.74:99
-chr1 3600437 . G C 161.98 HARD_TO_VALIDATE;SnpCluster AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=28.11;MQ=14.54;MQ0=44;QD=1.78;SB=-27.40 GT:AD:DP:GL:GQ 0/1:81,9:25:-27.02,-7.53,-80.42:99
-chr1 3600440 . A C 23.09 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=2;HaplotypeScore=12.59;MQ=14.51;MQ0=44;QD=0.25;SB=-17.83 GT:AD:DP:GL:GQ 0/1:72,19:25:-13.12,-7.53,-77.67:55.91
-chr1 3600470 . C T 26.44 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=13.21;MQ=11.80;MQ0=28;QD=0.61;SB=2.03 GT:AD:DP:GL:GQ 0/1:41,2:8:-8.34,-2.41,-20.77:59.27
-chr1 3600475 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=2;HaplotypeScore=2.58;MQ=10.93;MQ0=23;OQ=89.38;QD=2.48;SB=-3.98 GT:AD:DP:GL:GQ 0/1:21,15:6:-14.03,-1.81,-7.79:59.84
-chr1 3600532 . C T 45.13 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=11.72;MQ0=9;QD=2.65;SB=-47.67 GT:AD:DP:GL:GQ 1/1:12,5:2:-7.92,-0.60,-0.00:6.02
-chr1 3600545 . A C 20.73 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=18.85;MQ0=10;QD=0.80;SB=-32.99 GT:AD:DP:GL:GQ 0/1:14,12:4:-6.56,-1.20,-7.53:53.53
-chr1 3600575 . C T 0.06 PASS AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=7.34;MQ=23.21;MQ0=9;OQ=164.83;QD=5.49;SB=-77.08 GT:AD:DP:GL:GQ 0/1:24,6:9:-22.48,-2.71,-11.26:85.52
-chr1 3600578 . C T 0.49 PASS AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=23.98;MQ0=9;OQ=197.36;QD=6.81;SB=-112.62 GT:AD:DP:GL:GQ 0/1:22,7:11:-26.34,-3.32,-14.46:99
-chr1 3600596 . C T 0.28 PASS AC=2;AF=1.00;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=33.58;MQ0=0;OQ=353.36;QD=25.24;SB=-175.22 GT:AD:DP:GL:GQ 1/1:0,14:10:-38.92,-3.01,-0.01:30.09
-chr1 3600667 . C T 19.38 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=18;Dels=0.00;HRun=1;HaplotypeScore=14.09;MQ=16.96;MQ0=7;QD=1.08;SB=-29.64 GT:AD:DP:GL:GQ 0/1:14,4:7:-7.33,-2.11,-16.23:52.17
-chr1 3600709 . C T 32.48 PASS AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=3.31;MQ=14.75;MQ0=16;OQ=271.94;QD=8.77;SB=-129.00 GT:AD:DP:GL:GQ 1/1:10,20:8:-30.78,-2.41,-0.00:24.07
-chr1 3600734 . C A 11.22 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=17.16;MQ0=10;QD=0.59;SB=-7.00 GT:AD:DP:GL:GQ 0/1:17,2:6:-6.18,-1.81,-13.77:43.72
-chr1 3600738 . C T 23.24 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=5.72;MQ=17.16;MQ0=10;QD=1.22;SB=-6.99 GT:AD:DP:GL:GQ 0/1:14,5:6:-7.41,-1.81,-13.10:56.06
-chr1 3600746 . G A 0.90 PASS AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=5.14;MQ=19.46;MQ0=10;OQ=147.44;QD=6.70;SB=-47.55 GT:AD:DP:GL:GQ 0/1:6,16:6:-19.82,-1.81,-3.10:12.90
-chr1 3600943 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=10.81;MQ0=18;OQ=79.37;QD=2.27;SB=-10.00 GT:AD:DP:GL:GQ 0/1:27,8:5:-12.73,-1.51,-3.55:20.36
-chr1 3600944 . G A 31.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=10.97;MQ0=17;QD=0.93;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,2:5:-7.94,-1.51,-9.29:64.30
-chr1 3600955 . C T 29.25 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=3.80;MQ=11.72;MQ0=17;QD=0.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,7:6:-8.02,-1.81,-11.97:62.08
-chr1 3600968 . A C 27.28 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=2;HaplotypeScore=4.96;MQ=11.75;MQ0=20;QD=0.80;SB=-10.00 GT:AD:DP:GL:GQ 0/1:18,16:5:-7.52,-1.51,-9.32:60.10
-chr1 3601000 . G C 23.03 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=12.60;MQ=11.01;MQ0=30;QD=0.46;SB=-6.99 GT:AD:DP:GL:GQ 0/1:44,6:9:-8.30,-2.71,-30.70:55.84
-chr1 3601003 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=2;HaplotypeScore=15.11;MQ=12.05;MQ0=28;OQ=191.04;QD=3.75;SB=-6.99 GT:AD:DP:GL:GQ 0/1:28,23:11:-25.70,-3.31,-14.21:99
-chr1 3601025 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=13.71;MQ=14.27;MQ0=33;OQ=53.75;QD=0.96;SB=-3.99 GT:AD:DP:GL:GQ 0/1:46,9:10:-11.67,-3.01,-22.44:86.59
-chr1 3601070 rs36156048 C G 0.13 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=10.95;MQ=20.17;MQ0=10;OQ=79.41;QD=3.18;SB=-46.45 GT:AD:DP:GL:GQ 0/1:14,11:6:-13.03,-1.81,-11.69:98.78
-chr1 3601096 . G A 20.37 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=8.03;MQ=17.90;MQ0=5;QD=1.20;SB=-27.52 GT:AD:DP:GL:GQ 0/1:13,3:5:-6.83,-1.51,-8.44:53.16
-chr1 3601143 . A C 0.18 PASS AC=1;AF=0.50;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=20.37;MQ0=7;OQ=150.35;QD=6.54;SB=-72.98 GT:AD:DP:GL:GQ 0/1:14,9:10:-21.33,-3.01,-13.91:99
-chr1 3601165 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=30;Dels=0.00;HRun=0;HaplotypeScore=11.69;MQ=24.21;MQ0=10;OQ=173.39;QD=5.78;SB=-3.99 GT:AD:DP:GL:GQ 0/1:22,8:11:-23.94,-3.31,-15.90:99
-chr1 3601175 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=2;HaplotypeScore=35.74;MQ=29.63;MQ0=10;OQ=194.57;QD=4.75;SB=-123.70 GT:AD:DP:GL:GQ 0/1:27,14:21:-29.07,-6.33,-61.55:99
-chr1 3601178 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=2;HaplotypeScore=14.60;MQ=30.57;MQ0=8;OQ=427.34;QD=9.94;SB=-58.96 GT:AD:DP:GL:GQ 0/1:21,22:25:-53.55,-7.53,-34.82:99
-chr1 3601218 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=2;HaplotypeScore=16.31;MQ=41.71;MQ0=5;OQ=182.10;QD=2.43;SB=-33.64 GT:AD:DP:GL:GQ 0/1:61,14:63:-40.49,-19.00,-224.09:99
-chr1 3601225 rs12722819 A C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=3;HaplotypeScore=15.63;MQ=42.30;MQ0=5;OQ=524.29;QD=6.32;SB=-141.88 GT:AD:DP:GL:GQ 0/1:52,30:59:-73.50,-17.79,-124.07:99
-chr1 3601229 rs12727450 T C 0.93 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=3;HaplotypeScore=5.92;MQ=43.45;MQ0=6;OQ=762.30;QD=9.07;SB=-332.31 GT:AD:DP:GL:GQ 0/1:49,35:67:-99.71,-20.19,-147.26:99
-chr1 3601341 rs12239528 C T 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.01;HRun=0;HaplotypeScore=14.56;MQ=44.93;MQ0=17;OQ=62.54;QD=0.70;SB=44.13 GT:AD:DP:GL:GQ 0/1:79,8:62:-27.92,-18.38,-184.40:95.37
-chr1 3601342 rs11581562 G A 0.21 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.01;HRun=0;HaplotypeScore=14.40;MQ=44.68;MQ0=18;OQ=819.35;QD=9.10;SB=-177.16 GT:AD:DP:GL:GQ 0/1:53,33:59:-102.70,-17.49,-103.40:99
-chr1 3601389 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=2;HaplotypeScore=7.82;MQ=44.29;MQ0=18;OQ=186.02;QD=2.30;SB=-61.02 GT:AD:DP:GL:GQ 0/1:62,19:52:-37.55,-15.67,-142.29:99
-chr1 3601457 rs10910012 A G 122.78 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=54.59;MQ0=0;OQ=1506.74;QD=29.54;SB=-756.93 GT:AD:DP:GL:GQ 1/1:0,51:48:-154.31,-14.48,-0.05:99
-chr1 3601752 rs3765731 G A 361.77 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=59.28;MQ0=0;OQ=1001.62;QD=15.65;SB=-488.04 GT:AD:DP:GL:GQ 0/1:31,33:59:-121.23,-17.79,-88.90:99
-chr1 3601820 rs3765732 G A 2.96 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=59.03;MQ0=0;OQ=1613.11;QD=33.61;SB=-476.00 GT:AD:DP:GL:GQ 1/1:0,46:44:-167.13,-15.44,-2.23:99
-chr1 3602293 rs1885869 T C 376.91 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1214.50;QD=32.82;SB=-519.18 GT:AD:DP:GL:GQ 1/1:0,37:35:-125.05,-10.54,-0.02:99
-chr1 3603630 rs10910013 C T 111.93 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.47;MQ0=0;OQ=534.95;QD=15.28;SB=-205.85 GT:AD:DP:GL:GQ 0/1:18,17:34:-67.02,-10.25,-59.55:99
-chr1 3603781 rs35837097 A G 62.33 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.60;MQ=59.60;MQ0=0;OQ=546.71;QD=11.63;SB=-279.27 GT:AD:DP:GL:GQ 0/1:23,24:43:-70.92,-12.96,-83.70:99
-chr1 3605288 rs11580811 G A 73.23 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=59.17;MQ0=0;OQ=263.75;QD=9.42;SB=-51.00 GT:AD:DP:GL:GQ 0/1:17,11:22:-36.29,-6.63,-43.95:99
-chr1 3606461 rs3765736 C T 194.21 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=57.38;MQ0=0;OQ=406.81;QD=15.07;SB=-214.90 GT:AD:DP:GL:GQ 0/1:13,14:23:-50.90,-6.93,-35.03:99
-chr1 3606652 rs3765737 A G 468.77 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=799.22;QD=12.89;SB=-323.13 GT:AD:DP:GL:GQ 0/1:30,32:60:-101.29,-18.08,-117.49:99
-chr1 3606658 rs3765738 G A 253.54 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.79;MQ0=0;OQ=935.05;QD=15.08;SB=-404.78 GT:AD:DP:GL:GQ 0/1:33,29:61:-115.17,-18.38,-103.51:99
-chr1 3606835 rs4610947 C A 292.86 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.39;MQ0=0;OQ=957.03;QD=17.09;SB=-493.95 GT:AD:DP:GL:GQ 0/1:24,31:55:-115.55,-16.56,-86.20:99
-chr1 3606979 rs4378145 G A 258.79 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=57.58;MQ0=5;OQ=1287.24;QD=16.29;SB=-484.49 GT:AD:DP:GL:GQ 0/1:40,39:72:-153.70,-21.69,-124.59:99
-chr1 3607481 rs3765739 A G 35.10 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=56.52;MQ0=0;OQ=316.46;QD=9.31;SB=-99.71 GT:AD:DP:GL:GQ 0/1:16,18:27:-43.07,-8.14,-49.38:99
-chr1 3608425 rs3819959 T C 21.46 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.02;MQ=53.67;MQ0=0;OQ=372.33;QD=9.08;SB=-195.61 GT:AD:DP:GL:GQ 0/1:23,18:34:-50.76,-10.24,-80.92:99
-chr1 3608574 rs3765740 T G 43.97 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=2;HaplotypeScore=1.03;MQ=59.11;MQ0=0;OQ=373.92;QD=14.38;SB=-208.83 GT:AD:DP:GL:GQ 0/1:12,14:26:-48.51,-7.83,-42.30:99
-chr1 3608643 rs3765741 A G 139.94 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.25;MQ0=0;OQ=277.44;QD=11.10;SB=-3.99 GT:AD:DP:GL:GQ 0/1:13,12:23:-37.96,-6.93,-45.69:99
-chr1 3608686 rs3765742 G A 11.54 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=299.52;QD=14.98;SB=-7.00 GT:AD:DP:GL:GQ 0/1:9,11:19:-38.96,-5.72,-31.25:99
-chr1 3608969 rs3765743 C T 17.24 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=315.53;QD=15.78;SB=-3.99 GT:AD:DP:GL:GQ 0/1:10,10:19:-40.56,-5.72,-31.07:99
-chr1 3609567 rs4648550 T A 206.11 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1535.78;QD=37.46;SB=-673.01 GT:AD:DP:GL:GQ 1/1:0,41:41:-157.17,-12.35,-0.01:99
-chr1 3609807 rs34881405 T C 7.83 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.49;MQ=57.54;MQ0=0;OQ=345.64;QD=7.86;SB=-128.25 GT:AD:DP:GL:GQ 0/1:24,20:40:-49.91,-12.06,-96.00:99
-chr1 3610040 rs17379833 A T 163.16 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.52;MQ0=0;OQ=999.11;QD=20.81;SB=-480.53 GT:AD:DP:GL:GQ 0/1:16,32:47:-117.35,-14.16,-58.41:99
-chr1 3610295 rs12742969 A G 136.51 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=514.16;QD=10.49;SB=-277.41 GT:AD:DP:GL:GQ 0/1:28,21:47:-68.86,-14.16,-115.22:99
-chr1 3610320 rs12735439 C A 230.39 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=801.03;QD=16.35;SB=-378.77 GT:AD:DP:GL:GQ 0/1:22,27:48:-97.85,-14.46,-70.21:99
-chr1 3611339 rs3765749 A T 129.18 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=60.00;MQ0=0;OQ=640.71;QD=17.32;SB=-252.96 GT:AD:DP:GL:GQ 0/1:16,21:36:-78.20,-10.84,-56.57:99
-chr1 3612044 rs3765751 A G 0.64 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=6.05;MQ=58.84;MQ0=0;OQ=1141.41;QD=28.54;SB=-361.32 GT:AD:DP:GL:GQ 1/1:0,39:37:-117.76,-11.16,-0.04:99
-chr1 3612141 rs3765752 G A 98.32 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.42;MQ0=0;OQ=790.33;QD=19.76;SB=-403.21 GT:AD:DP:GL:GQ 0/1:16,24:40:-94.37,-12.05,-52.81:99
-chr1 3612166 rs3765753 T G 307.87 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=1135.84;QD=31.55;SB=-218.90 GT:AD:DP:GL:GQ 1/1:0,36:34:-117.19,-10.25,-0.02:99
-chr1 3612496 rs12086279 A T 144.33 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.76;MQ0=0;OQ=264.24;QD=12.01;SB=-145.87 GT:AD:DP:GL:GQ 0/1:12,10:20:-35.73,-6.03,-37.15:99
-chr1 3612742 rs56124535 A G 117.78 PASS AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=57.14;MQ0=0;OQ=143.16;QD=7.53;SB=-61.32 GT:AD:DP:GL:GQ 0/1:9,9:16:-22.43,-4.83,-33.66:99
-chr1 3612752 rs55976062 T C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=19;Dels=0.00;HRun=2;HaplotypeScore=16.88;MQ=55.46;MQ0=1;OQ=130.66;QD=6.88;SB=-60.86 GT:AD:DP:GL:GQ 0/1:11,8:16:-21.17,-4.82,-37.90:99
-chr1 3612857 rs10910014 T C 4.06 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=2.85;MQ=45.10;MQ0=1;OQ=122.28;QD=3.82;SB=-65.87 GT:AD:DP:GL:GQ 0/1:18,14:19:-21.24,-5.73,-45.71:99
-chr1 3612894 rs58140697 A G 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=4;HaplotypeScore=5.46;MQ=58.05;MQ0=0;OQ=210.19;QD=8.76;SB=-118.71 GT:AD:DP:GL:GQ 0/1:15,9:22:-30.93,-6.63,-52.73:99
-chr1 3612902 rs60071664 T C 130.61 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=57.06;MQ0=0;OQ=194.42;QD=7.48;SB=-106.60 GT:AD:DP:GL:GQ 0/1:16,10:25:-30.26,-7.53,-62.36:99
-chr1 3613185 rs12564843 G C 7.11 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=53.89;MQ0=0;OQ=1382.10;QD=38.39;SB=-571.48 GT:AD:DP:GL:GQ 1/1:0,36:33:-141.81,-9.95,-0.02:99
-chr1 3613274 rs9786966 A G 67.74 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.62;MQ=57.45;MQ0=0;OQ=414.03;QD=10.62;SB=-167.59 GT:AD:DP:GL:GQ 0/1:21,18:36:-55.53,-10.85,-77.07:99
-chr1 3613481 rs55657548 C T 77.12 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=58.92;MQ0=0;OQ=252.32;QD=6.47;SB=-105.49 GT:AD:DP:GL:GQ 0/1:27,11:38:-39.97,-11.45,-93.41:99
-chr1 3614769 rs10910016 G A 258.29 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=59.57;MQ0=0;OQ=815.07;QD=15.09;SB=-428.45 GT:AD:DP:GL:GQ 0/1:27,26:50:-99.87,-15.07,-79.93:99
-chr1 3615542 rs3765755 G C 6.35 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=3.76;MQ=57.56;MQ0=0;OQ=289.35;QD=10.72;SB=-124.51 GT:AD:DP:GL:GQ 0/1:17,10:20:-38.26,-6.05,-38.86:99
-chr1 3615628 rs2368540 G A 45.74 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.64;MQ0=0;OQ=1334.80;QD=39.26;SB=-676.69 GT:AD:DP:GL:GQ 1/1:0,34:34:-137.07,-10.24,-0.01:99
-chr1 3615736 rs2368539 G A 82.76 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.19;MQ=58.99;MQ0=0;OQ=1720.73;QD=37.41;SB=-824.61 GT:AD:DP:GL:GQ 1/1:0,46:45:-175.68,-13.56,-0.02:99
-chr1 3616028 rs12130809 G A 272.35 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=838.34;QD=17.11;SB=-389.14 GT:AD:DP:GL:GQ 0/1:23,26:48:-101.58,-14.46,-75.57:99
-chr1 3616588 rs3753208 C T 1.11 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=1;HaplotypeScore=2.44;MQ=57.64;MQ0=0;OQ=539.82;QD=20.76;SB=-254.78 GT:AD:DP:GL:GQ 0/1:9,17:24:-64.50,-7.23,-25.72:99
-chr1 3616624 rs3753209 G A 11.81 PASS AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=58.89;MQ0=0;OQ=522.74;QD=24.89;SB=-281.33 GT:AD:DP:GL:GQ 0/1:4,17:19:-61.28,-5.73,-9.34:36.13
-chr1 3618071 rs3819961 T C 130.28 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=59.30;MQ0=0;OQ=302.64;QD=9.17;SB=-168.93 GT:AD:DP:GL:GQ 0/1:19,14:29:-42.29,-8.74,-60.25:99
-chr1 3618163 rs3819962 C T 161.54 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.36;MQ0=0;OQ=457.21;QD=12.70;SB=-166.18 GT:AD:DP:GL:GQ 0/1:20,16:35:-59.55,-10.55,-68.25:99
-chr1 3618201 rs3819963 C T 122.91 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=60.00;MQ0=0;OQ=469.25;QD=9.98;SB=-160.23 GT:AD:DP:GL:GQ 0/1:28,19:40:-62.27,-12.06,-77.68:99
-chr1 3618523 rs6424089 A G 234.40 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=515.26;QD=10.10;SB=-135.54 GT:AD:DP:GL:GQ 0/1:28,23:50:-69.88,-15.07,-112.69:99
-chr1 3618537 rs6424090 A G 547.53 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.83;MQ0=0;OQ=1664.50;QD=30.82;SB=-446.16 GT:AD:DP:GL:GQ 1/1:0,54:52:-170.07,-15.68,-0.04:99
-chr1 3619132 rs61568045 A T 75.76 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=702.41;QD=14.05;SB=-308.70 GT:AD:DP:GL:GQ 0/1:27,23:49:-88.29,-14.76,-94.54:99
-chr1 3619452 rs3765758 A G 47.37 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.30;MQ0=0;OQ=878.57;QD=26.62;SB=-355.42 GT:AD:DP:GL:GQ 1/1:0,33:30:-91.48,-9.06,-0.04:90.16
-chr1 3620336 rs3765761 C T 430.43 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.64;MQ0=0;OQ=893.13;QD=17.18;SB=-472.49 GT:AD:DP:GL:GQ 0/1:25,27:51:-107.96,-15.36,-81.84:99
-chr1 3620975 rs3765763 C A 252.43 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.39;MQ0=0;OQ=502.24;QD=13.22;SB=-232.36 GT:AD:DP:GL:GQ 0/1:20,18:37:-64.65,-11.14,-68.16:99
-chr1 3621759 rs61759267 C T 206.85 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=58.40;MQ0=0;OQ=667.68;QD=16.28;SB=-326.34 GT:AD:DP:GL:GQ 0/1:19,22:40:-82.11,-12.06,-61.46:99
-chr1 3622468 rs3753211 T C 35.06 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=6.67;MQ=58.45;MQ0=0;OQ=511.74;QD=11.37;SB=-197.62 GT:AD:DP:GL:GQ 0/1:23,22:42:-67.14,-12.68,-73.45:99
-chr1 3622590 rs4648551 G A 13.99 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=8.04;MQ=59.11;MQ0=0;OQ=881.37;QD=14.94;SB=-385.40 GT:AD:DP:GL:GQ 0/1:30,29:55:-108.00,-16.58,-90.70:99
-chr1 3623397 rs3765764 G A 5.20 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.59;MQ0=0;OQ=1699.76;QD=37.77;SB=-349.25 GT:AD:DP:GL:GQ 1/1:0,44:44:-176.03,-15.59,-2.47:99
-chr1 3624319 rs3765765 C A 38.07 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=752.18;QD=20.33;SB=-184.22 GT:AD:DP:GL:GQ 0/1:13,24:36:-89.34,-10.84,-42.24:99
-chr1 3624520 rs3765766 T C 10.08 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=2;HaplotypeScore=2.32;MQ=58.08;MQ0=0;OQ=679.70;QD=30.90;SB=-324.14 GT:AD:DP:GL:GQ 1/1:0,22:21:-71.57,-6.33,-0.02:63.16
-chr1 3625325 rs3765767 G C 128.03 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.30;MQ0=0;OQ=648.42;QD=19.65;SB=-303.36 GT:AD:DP:GL:GQ 0/1:15,18:33:-78.07,-9.95,-65.85:99
-chr1 3625451 rs3765768 C T 99.15 PASS AC=1;AF=0.50;AN=2;DB;DP=22;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=57.87;MQ0=0;OQ=372.64;QD=16.94;SB=-111.62 GT:AD:DP:GL:GQ 0/1:9,13:20:-46.58,-6.03,-24.55:99
-chr1 3625480 rs3819968 G T 164.17 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.32;MQ0=0;OQ=519.45;QD=15.28;SB=-228.94 GT:AD:DP:GL:GQ 0/1:15,19:32:-64.87,-9.64,-47.62:99
-chr1 3627107 rs3765771 G C 208.39 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=1861.37;QD=37.99;SB=-769.21 GT:AD:DP:GL:GQ 1/1:0,49:48:-189.76,-14.49,-0.04:99
-chr1 3627319 rs12731705 C T 198.62 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.16;MQ0=0;OQ=1887.80;QD=37.76;SB=-826.61 GT:AD:DP:GL:GQ 1/1:0,50:48:-192.38,-14.46,-0.01:99
-chr1 3627473 rs2146658 T G 374.11 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.91;MQ0=0;OQ=603.03;QD=10.05;SB=-295.81 GT:AD:DP:GL:GQ 0/1:35,25:58:-81.06,-17.47,-122.08:99
-chr1 3627672 rs2181487 C A 40.28 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.14;MQ=58.10;MQ0=0;OQ=433.83;QD=7.35;SB=-156.52 GT:AD:DP:GL:GQ 0/1:34,22:49:-61.43,-14.77,-105.52:99
-chr1 3628534 rs1801174 C T 158.46 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.66;MQ0=0;OQ=2550.78;QD=38.07;SB=-965.29 GT:AD:DP:GL:GQ 1/1:0,67:65:-258.68,-19.58,-0.02:99
-chr1 3628694 rs12737840 C T 176.16 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.52;MQ=58.05;MQ0=0;OQ=694.01;QD=14.46;SB=-295.84 GT:AD:DP:GL:GQ 0/1:22,26:42:-85.35,-12.67,-62.54:99
-chr1 3629503 rs4648552 T C 338.68 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1294.39;QD=30.10;SB=-605.94 GT:AD:DP:GL:GQ 1/1:0,43:41:-133.06,-12.37,-0.04:99
-chr1 3629584 rs7537335 G A 0.43 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=58.30;MQ0=0;OQ=677.32;QD=21.85;SB=-284.30 GT:AD:DP:GL:GQ 0/1:10,21:29:-79.75,-8.74,-30.01:99
-chr1 3629945 rs6424091 C G 0.03 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=5;HaplotypeScore=2.31;MQ=58.54;MQ0=0;OQ=1470.54;QD=38.70;SB=-622.99 GT:AD:DP:GL:GQ 1/1:0,38:35:-150.65,-10.55,-0.01:99
-chr1 3630886 rs6687491 G A 255.56 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=58.48;MQ0=0;OQ=516.42;QD=12.91;SB=-227.77 GT:AD:DP:GL:GQ 0/1:22,18:36:-65.79,-10.86,-57.81:99
-chr1 3630983 rs6701784 A C 437.82 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.55;MQ0=0;OQ=1276.86;QD=28.37;SB=-579.85 GT:AD:DP:GL:GQ 1/1:0,45:42:-131.31,-12.66,-0.04:99
-chr1 3632013 rs34178965 G C 41.74 LowQual AC=2;AF=1.00;AN=2;DB;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;QD=13.91;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-7.58,-0.60,-0.00:6.02
-chr1 3632108 . A G 92.54 PASS AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.46;MQ0=0;OQ=246.19;QD=30.77;SB=-85.92 GT:AD:DP:GL:GQ 1/1:0,8:8:-28.20,-2.41,-0.00:24.07
-chr1 3633787 rs2296031 A G 6.14 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=452.89;QD=19.69;SB=-150.34 GT:AD:DP:GL:GQ 0/1:6,16:22:-55.20,-6.63,-22.30:99
-chr1 3634209 rs2181486 A G 1.25 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=4;HaplotypeScore=1.69;MQ=58.39;MQ0=0;OQ=887.40;QD=30.60;SB=-422.16 GT:AD:DP:GL:GQ 1/1:0,29:29:-92.36,-8.75,-0.03:87.19
-chr1 3634234 rs2146657 A G 3.11 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=2.86;MQ=58.55;MQ0=0;OQ=912.28;QD=28.51;SB=-446.82 GT:AD:DP:GL:GQ 1/1:0,32:28:-94.83,-8.44,-0.02:84.21
-chr1 3634529 rs2236367 C T 14.74 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=-0.18;MQ=58.05;MQ0=0;OQ=381.45;QD=15.89;SB=-87.90 GT:AD:DP:GL:GQ 0/1:11,13:23:-48.37,-6.94,-31.96:99
-chr1 3634665 rs2236366 A G 76.17 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=58.92;MQ0=0;OQ=536.64;QD=13.76;SB=-250.32 GT:AD:DP:GL:GQ 0/1:16,23:35:-67.50,-10.56,-54.78:99
-chr1 3634718 rs2236365 G C 250.46 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=58.69;MQ0=0;OQ=951.80;QD=19.04;SB=-496.24 GT:AD:DP:GL:GQ 0/1:20,30:47:-112.65,-14.19,-78.43:99
-chr1 3634912 rs12095248 A G 50.60 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=529.65;QD=10.81;SB=-225.29 GT:AD:DP:GL:GQ 0/1:29,20:49:-71.01,-14.76,-117.85:99
-chr1 3635695 rs2254530 C A 234.40 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=56.85;MQ0=0;OQ=701.30;QD=15.58;SB=-270.34 GT:AD:DP:GL:GQ 0/1:17,28:43:-86.38,-12.96,-55.17:99
-chr1 3635704 rs2096224 G A 61.81 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.39;MQ0=0;OQ=843.06;QD=18.33;SB=-255.19 GT:AD:DP:GL:GQ 0/1:18,27:42:-100.25,-12.66,-49.65:99
-chr1 3635997 rs11589885 C T 153.88 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.19;MQ=58.55;MQ0=0;OQ=582.90;QD=18.22;SB=-289.86 GT:AD:DP:GL:GQ 0/1:14,18:32:-71.22,-9.65,-43.73:99
-chr1 3636052 rs1885867 G A 143.16 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.44;MQ0=0;OQ=1392.32;QD=33.96;SB=-648.62 GT:AD:DP:GL:GQ 1/1:1,40:37:-142.84,-11.16,-0.02:99
-chr1 3636074 rs1885866 T C 394.04 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1194.73;QD=27.15;SB=-580.01 GT:AD:DP:GL:GQ 1/1:0,44:39:-123.10,-11.76,-0.04:99
-chr1 3636151 rs1885865 G A 33.35 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.03;MQ0=0;OQ=1851.65;QD=38.58;SB=-906.66 GT:AD:DP:GL:GQ 1/1:0,48:47:-188.76,-14.16,-0.01:99
-chr1 3637822 rs1745813 T C 55.74 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.13;MQ=58.97;MQ0=0;OQ=680.74;QD=15.13;SB=-289.66 GT:AD:DP:GL:GQ 0/1:18,27:43:-84.33,-12.97,-62.63:99
-chr1 3638114 rs34661835 G A 68.90 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=3.56;MQ=59.01;MQ0=0;OQ=1063.39;QD=15.19;SB=-366.89 GT:AD:DP:GL:GQ 0/1:37,33:66:-129.52,-19.90,-102.17:99
-chr1 3638739 rs4648553 G A 223.38 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.68;MQ=58.64;MQ0=0;OQ=511.89;QD=10.66;SB=-215.18 GT:AD:DP:GL:GQ 0/1:26,22:40:-66.54,-12.07,-70.14:99
-chr1 3640958 rs1181869 C T 138.76 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=782.45;QD=20.06;SB=-285.16 GT:AD:DP:GL:GQ 0/1:16,23:38:-92.98,-11.45,-54.47:99
-chr1 3640986 rs1181868 G T 357.91 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.51;MQ0=0;OQ=742.19;QD=14.55;SB=-306.02 GT:AD:DP:GL:GQ 0/1:23,27:47:-91.66,-14.16,-72.26:99
-chr1 3641178 rs1181867 A G 3.60 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=11.13;MQ=59.11;MQ0=0;OQ=463.08;QD=9.85;SB=-239.29 GT:AD:DP:GL:GQ 0/1:24,23:43:-62.56,-12.97,-88.46:99
-chr1 3642477 rs1047928 G C 24.63 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.25;MQ0=0;OQ=1110.64;QD=19.83;SB=-354.44 GT:AD:DP:GL:GQ 0/1:25,31:54:-130.64,-16.30,-94.09:99
-chr1 3642678 rs61759293 G A 143.34 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=59.59;MQ0=0;OQ=746.17;QD=16.22;SB=-262.29 GT:AD:DP:GL:GQ 0/1:23,23:46:-91.76,-13.86,-82.87:99
-chr1 3642682 rs9800 C G 193.80 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=59.59;MQ0=0;OQ=608.81;QD=13.23;SB=-238.07 GT:AD:DP:GL:GQ 0/1:25,21:45:-77.74,-13.57,-107.75:99
-chr1 3643272 rs1181866 A C 242.81 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1714.13;QD=34.28;SB=-732.08 GT:AD:DP:GL:GQ 1/1:0,50:49:-175.01,-14.76,-0.02:99
-chr1 3643286 rs1181865 T C 423.19 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1563.43;QD=32.57;SB=-664.24 GT:AD:DP:GL:GQ 1/1:0,48:46:-159.95,-13.86,-0.02:99
-chr1 3644050 rs1181864 A G 156.69 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=57.94;MQ0=0;OQ=704.72;QD=10.36;SB=-357.09 GT:AD:DP:GL:GQ 0/1:38,30:68:-94.25,-20.50,-152.69:99
-chr1 3644355 rs41315308 C T 206.84 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=57.86;MQ0=0;OQ=957.61;QD=14.96;SB=-405.80 GT:AD:DP:GL:GQ 0/1:34,30:63:-118.03,-18.99,-105.73:99
-chr1 3646184 rs1181863 T C 89.60 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.04;MQ0=1;OQ=1725.96;QD=27.84;SB=-738.77 GT:AD:DP:GL:GQ 1/1:0,62:55:-176.23,-16.59,-0.05:99
-chr1 3647330 rs61339658 C T 216.66 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.48;MQ0=0;OQ=622.56;QD=14.15;SB=-204.90 GT:AD:DP:GL:GQ 0/1:24,20:43:-78.50,-12.96,-75.30:99
-chr1 3647619 rs12117836 G A 258.44 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.76;MQ0=0;OQ=3087.35;QD=39.58;SB=-1142.52 GT:AD:DP:GL:GQ 1/1:0,78:77:-312.34,-23.20,-0.02:99
-chr1 3647643 rs55704710 C T 372.37 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1117.31;QD=14.14;SB=-441.41 GT:AD:DP:GL:GQ 0/1:44,35:79:-138.82,-23.81,-145.27:99
-chr1 3648097 rs10797409 G A 267.01 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.27;MQ0=0;OQ=783.87;QD=15.37;SB=-396.73 GT:AD:DP:GL:GQ 0/1:26,25:51:-97.04,-15.37,-93.66:99
-chr1 3648630 rs12068191 T C 36.85 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=59.42;MQ0=0;OQ=210.22;QD=6.57;SB=-113.63 GT:AD:DP:GL:GQ 0/1:20,12:30:-33.36,-9.05,-73.41:99
-chr1 3649517 rs2298222 G A 272.39 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=58.64;MQ0=0;OQ=639.47;QD=13.32;SB=-210.21 GT:AD:DP:GL:GQ 0/1:28,20:45:-80.80,-13.57,-77.92:99
-chr1 3650201 rs10910020 A G 239.62 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=60.00;MQ0=0;OQ=830.62;QD=14.32;SB=-256.96 GT:AD:DP:GL:GQ 0/1:22,36:55:-102.93,-16.58,-89.31:99
-chr1 3650655 rs61759295 C T 319.94 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=56.32;MQ0=0;OQ=1049.42;QD=17.20;SB=-513.15 GT:AD:DP:GL:GQ 0/1:29,32:58:-125.70,-17.48,-89.86:99
-chr1 3650715 . C T 1.43 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=1;HaplotypeScore=2.94;MQ=58.05;MQ0=0;OQ=1053.29;QD=21.50;SB=-546.76 GT:AD:DP:GL:GQ 0/1:18,30:49:-126.44,-17.83,-68.95:99
-chr1 3650833 rs61759296 C T 365.26 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=780.11;QD=18.14;SB=-365.90 GT:AD:DP:GL:GQ 0/1:18,25:43:-94.25,-12.96,-66.61:99
-chr1 3650834 rs61759297 A G 444.30 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=732.78;QD=16.65;SB=-378.33 GT:AD:DP:GL:GQ 0/1:18,26:44:-89.82,-13.26,-70.47:99
-chr1 3651042 . A G 50.56 PASS AC=2;AF=1.00;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.01;MQ0=0;OQ=2317.73;QD=30.50;SB=-942.03 GT:AD:DP:GL:GQ 1/1:0,76:75:-235.44,-22.63,-0.08:99
-chr1 3651109 . A G 1.79 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=56.71;MQ0=0;OQ=273.27;QD=7.01;SB=-125.50 GT:AD:DP:GL:GQ 0/1:24,15:37:-41.77,-11.16,-93.00:99
-chr1 3651611 rs61759298 C T 14.44 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=6.20;MQ=59.36;MQ0=0;OQ=487.25;QD=13.53;SB=-201.22 GT:AD:DP:GL:GQ 0/1:19,17:31:-61.35,-9.34,-53.39:99
-chr1 3651666 rs61759299 G A 290.38 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=58.58;MQ0=0;OQ=537.51;QD=11.69;SB=-229.48 GT:AD:DP:GL:GQ 0/1:28,18:45:-70.60,-13.56,-93.90:99
-chr1 3652705 rs3737589 A G 232.40 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1820.89;QD=33.11;SB=-644.31 GT:AD:DP:GL:GQ 1/1:0,55:53:-185.70,-15.97,-0.02:99
-chr1 3652806 . C A 30.45 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=2;HaplotypeScore=18.21;MQ=58.71;MQ0=0;QD=0.56;SB=77.26 GT:AD:DP:GL:GQ 0/1:38,16:41:-18.69,-12.36,-124.87:63.28
-chr1 3652917 rs3737590 A T 248.79 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=534.27;QD=11.87;SB=-180.50 GT:AD:DP:GL:GQ 0/1:25,20:43:-69.67,-12.96,-88.74:99
-chr1 3652988 rs3737591 G A 355.22 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=743.37;QD=18.13;SB=-354.36 GT:AD:DP:GL:GQ 0/1:19,22:40:-89.67,-12.05,-59.56:99
-chr1 3653501 . C T 1.63 PASS AC=1;AF=0.50;AN=2;DP=24;Dels=0.00;HRun=1;HaplotypeScore=4.19;MQ=56.43;MQ0=0;OQ=295.19;QD=12.30;SB=-147.16 GT:AD:DP:GL:GQ 0/1:12,11:20:-38.83,-6.03,-35.51:99
-chr1 3654278 rs61759300 C T 319.11 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.50;MQ0=0;OQ=838.34;QD=14.71;SB=-382.16 GT:AD:DP:GL:GQ 0/1:29,28:55:-103.70,-16.58,-94.60:99
-chr1 3654412 . G A 1.87 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.14;MQ=59.58;MQ0=0;OQ=1116.86;QD=20.31;SB=-482.46 GT:AD:DP:GL:GQ 0/1:23,32:54:-131.23,-16.26,-80.42:99
-chr1 3655727 rs12120656 G T 277.67 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.16;MQ0=0;OQ=2493.88;QD=34.64;SB=-1022.51 GT:AD:DP:GL:GQ 1/1:0,71:69:-252.99,-20.78,-0.02:99
-chr1 3657359 rs61759301 C A 268.48 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.56;MQ0=0;OQ=858.70;QD=16.20;SB=-443.00 GT:AD:DP:GL:GQ 0/1:24,29:52:-104.82,-15.66,-81.51:99
-chr1 3657864 rs4648554 T C 343.27 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.67;MQ0=0;OQ=2306.57;QD=35.49;SB=-875.99 GT:AD:DP:GL:GQ 1/1:0,65:64:-234.26,-19.28,-0.02:99
-chr1 3658613 rs12128253 A C 493.82 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=800.32;QD=17.40;SB=-351.83 GT:AD:DP:GL:GQ 0/1:19,27:46:-97.17,-13.85,-71.32:99
-chr1 3658641 rs12123850 G T 445.21 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1182.07;QD=31.95;SB=-471.02 GT:AD:DP:GL:GQ 1/1:0,37:33:-121.80,-9.94,-0.01:99
-chr1 3659032 rs41315312 C T 393.31 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=747.09;QD=16.24;SB=-297.79 GT:AD:DP:GL:GQ 0/1:23,23:45:-91.55,-13.56,-71.39:99
-chr1 3659061 rs10797410 A G 617.38 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1286.97;QD=30.64;SB=-659.94 GT:AD:DP:GL:GQ 1/1:0,42:41:-132.32,-12.36,-0.04:99
-chr1 3659065 rs10910021 C G 483.45 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1547.05;QD=38.68;SB=-689.48 GT:AD:DP:GL:GQ 1/1:0,40:36:-158.30,-10.85,-0.01:99
-chr1 3659480 rs10797411 T C 0.77 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=7.27;MQ=57.71;MQ0=0;OQ=1720.61;QD=33.09;SB=-601.34 GT:AD:DP:GL:GQ 1/1:0,51:50:-175.67,-15.06,-0.02:99
-chr1 3659744 . C T 75.39 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=20;HaplotypeScore=21.91;MQ=50.61;MQ0=1;QD=1.13;SB=59.16 GT:AD:DP:GL:GQ 0/1:57,10:52:-26.50,-15.68,-150.70:99
-chr1 3659750 . T C 207.45 SnpCluster AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=50.10;MQ=49.95;MQ0=1;QD=3.05;SB=-120.43 GT:AD:DP:GL:GQ 0/1:53,15:58:-41.51,-17.48,-178.17:99
-chr1 3659751 . T C 331.47 SnpCluster AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=48.26;MQ=49.78;MQ0=1;QD=4.95;SB=-162.44 GT:AD:DP:GL:GQ 0/1:46,21:55:-53.00,-16.57,-149.72:99
-chr1 3660887 rs1181889 T C 275.60 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=59.11;MQ0=0;OQ=722.62;QD=13.90;SB=-328.30 GT:AD:DP:GL:GQ 0/1:24,28:49:-90.30,-14.76,-97.70:99
-chr1 3661651 rs1181888 A G 399.70 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=490.27;QD=11.14;SB=-251.93 GT:AD:DP:GL:GQ 0/1:22,22:42:-64.98,-12.67,-82.79:99
-chr1 3662016 rs4648555 C A 364.79 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=510.62;QD=9.46;SB=-259.25 GT:AD:DP:GL:GQ 0/1:34,20:53:-70.31,-15.96,-121.67:99
-chr1 3662783 rs12128087 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=13;HaplotypeScore=8.43;MQ=60.15;MQ0=0;OQ=558.18;QD=10.94;SB=-253.17 GT:AD:DP:GL:GQ 0/1:30,21:47:-73.27,-14.17,-94.61:99
-chr1 3663356 rs4648405 T G 117.92 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.45;MQ0=0;OQ=421.62;QD=10.04;SB=-89.84 GT:AD:DP:GL:GQ 0/1:24,18:40:-57.50,-12.05,-84.73:99
-chr1 3663862 rs1181887 T G 544.42 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1620.49;QD=34.48;SB=-656.23 GT:AD:DP:GL:GQ 1/1:0,47:47:-165.65,-14.16,-0.01:99
-chr1 3664012 rs7542464 C T 327.04 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.16;MQ0=0;OQ=1410.26;QD=37.11;SB=-358.47 GT:AD:DP:GL:GQ 1/1:0,38:38:-144.63,-11.46,-0.02:99
-chr1 3664166 . G A 2.11 PASS AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=3;HaplotypeScore=2.17;MQ=59.59;MQ0=0;OQ=801.46;QD=17.81;SB=-414.44 GT:AD:DP:GL:GQ 0/1:20,25:43:-96.39,-12.96,-61.16:99
-chr1 3664614 rs1181886 A T 88.61 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.65;MQ0=0;OQ=779.71;QD=14.44;SB=-332.65 GT:AD:DP:GL:GQ 0/1:28,26:52:-96.92,-15.66,-100.50:99
-chr1 3664618 rs9424312 T A 76.30 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=946.40;QD=17.53;SB=-254.96 GT:AD:DP:GL:GQ 0/1:24,30:54:-114.19,-16.27,-85.78:99
-chr1 3664638 rs59291549 A G 339.20 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=754.74;QD=11.44;SB=-151.30 GT:AD:DP:GL:GQ 0/1:31,35:62:-97.45,-18.69,-125.83:99
-chr1 3664862 rs6682863 G A 201.85 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.78;MQ0=0;OQ=631.54;QD=12.63;SB=-190.86 GT:AD:DP:GL:GQ 0/1:30,20:45:-80.00,-13.57,-81.03:99
-chr1 3665697 rs12128570 C G 270.19 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=50.42;MQ0=0;OQ=767.84;QD=13.01;SB=-344.88 GT:AD:DP:GL:GQ 0/1:34,25:56:-96.94,-16.88,-141.00:99
-chr1 3665819 rs12131045 T G 461.26 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.52;MQ0=0;OQ=642.50;QD=12.12;SB=-333.74 GT:AD:DP:GL:GQ 0/1:24,29:50:-82.60,-15.07,-87.60:99
-chr1 3665937 rs12128669 C T 521.09 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.12;MQ0=0;OQ=862.45;QD=14.37;SB=-269.15 GT:AD:DP:GL:GQ 0/1:32,28:59:-107.30,-17.77,-116.90:99
-chr1 3666427 rs1181885 C T 33.74 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.66;MQ0=0;OQ=1204.99;QD=21.91;SB=-603.11 GT:AD:DP:GL:GQ 0/1:19,36:52:-139.46,-15.68,-54.65:99
-chr1 3666458 rs1181884 T C 438.67 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=1123.89;QD=17.56;SB=-533.09 GT:AD:DP:GL:GQ 0/1:26,38:63:-134.65,-18.98,-101.24:99
-chr1 3666632 rs12406474 T C 126.45 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=1.53;MQ=58.86;MQ0=0;OQ=740.89;QD=13.00;SB=-344.59 GT:AD:DP:GL:GQ 0/1:29,28:56:-94.24,-16.87,-116.11:99
-chr1 3667793 rs1181883 T C 251.38 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=59.64;MQ0=0;OQ=2030.56;QD=31.73;SB=-682.90 GT:AD:DP:GL:GQ 1/1:0,64:64:-206.69,-19.29,-0.05:99
-chr1 3668081 rs1181882 G C 162.48 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=60.00;MQ0=0;OQ=1618.57;QD=31.13;SB=-715.93 GT:AD:DP:GL:GQ 1/1:0,52:43:-165.50,-13.00,-0.06:99
-chr1 3668091 rs7516756 A G 107.99 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=613.13;QD=11.57;SB=-116.72 GT:AD:DP:GL:GQ 0/1:27,26:49:-79.36,-14.77,-98.00:99
-chr1 3668371 rs7516968 A G 62.28 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=209.36;QD=9.10;SB=-37.93 GT:AD:DP:GL:GQ 0/1:13,10:22:-30.85,-6.63,-52.05:99
-chr1 3668596 . G A 15.65 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=57.44;MQ0=0;OQ=384.28;QD=10.98;SB=-65.05 GT:AD:DP:GL:GQ 0/1:22,13:35:-52.26,-10.55,-81.04:99
-chr1 3668758 rs1181881 A G 16.49 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=57.96;MQ0=0;OQ=916.82;QD=30.56;SB=-341.43 GT:AD:DP:GL:GQ 1/1:0,30:29:-95.29,-8.74,-0.02:87.21
-chr1 3668764 rs1181880 C T 45.57 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.66;MQ0=0;OQ=531.41;QD=18.98;SB=-213.73 GT:AD:DP:GL:GQ 0/1:11,17:28:-64.87,-8.45,-34.91:99
-chr1 3668999 rs1181879 T C 13.01 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.38;MQ=59.44;MQ0=0;OQ=1208.95;QD=29.49;SB=-449.15 GT:AD:DP:GL:GQ 1/1:0,41:38:-124.52,-11.46,-0.04:99
-chr1 3669006 rs4648556 G A 196.56 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.44;MQ0=0;OQ=524.36;QD=12.79;SB=-228.74 GT:AD:DP:GL:GQ 0/1:24,17:40:-67.77,-12.05,-80.81:99
-chr1 3669167 rs4648557 T C 163.44 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=60.00;MQ0=0;OQ=314.58;QD=10.15;SB=-171.98 GT:AD:DP:GL:GQ 0/1:15,16:28:-43.19,-8.45,-53.69:99
-chr1 3669321 rs4648558 A T 213.98 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=59.30;MQ0=0;OQ=430.63;QD=13.05;SB=-151.85 GT:AD:DP:GL:GQ 0/1:18,15:33:-56.29,-9.94,-66.61:99
-chr1 3669635 rs10910024 C T 223.39 PASS AC=1;AF=0.50;AN=2;DB;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=60.00;MQ0=0;OQ=261.53;QD=10.46;SB=-131.12 GT:AD:DP:GL:GQ 0/1:15,10:24:-36.67,-7.23,-47.59:99
-chr1 3669916 rs56079032 G A 49.43 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.11;MQ0=0;OQ=457.75;QD=17.61;SB=-143.18 GT:AD:DP:GL:GQ 0/1:10,16:25:-56.59,-7.54,-35.59:99
-chr1 3670503 rs1181878 G A 204.22 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=58.92;MQ0=0;OQ=593.13;QD=15.21;SB=-209.18 GT:AD:DP:GL:GQ 0/1:21,18:39:-74.34,-11.75,-76.92:99
-chr1 3670589 rs1181877 C T 442.14 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.71;MQ0=0;OQ=1051.46;QD=16.43;SB=-536.72 GT:AD:DP:GL:GQ 0/1:31,33:61:-126.81,-18.38,-107.46:99
-chr1 3670923 rs6669358 A G 271.22 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.35;MQ=59.49;MQ0=0;OQ=863.52;QD=11.83;SB=-442.10 GT:AD:DP:GL:GQ 0/1:40,33:71:-111.03,-21.40,-156.37:99
-chr1 3671541 rs1181876 A G 312.30 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.35;MQ0=0;OQ=557.92;QD=8.72;SB=-268.23 GT:AD:DP:GL:GQ 0/1:36,28:60:-77.16,-18.08,-144.69:99
-chr1 3671691 rs1181875 T C 354.44 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.69;MQ0=0;OQ=768.78;QD=12.60;SB=-310.35 GT:AD:DP:GL:GQ 0/1:32,29:59:-97.93,-17.77,-128.86:99
-chr1 3671930 rs1181874 C A 548.97 PASS AC=1;AF=0.50;AN=2;DB;DP=111;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1553.48;QD=14.00;SB=-588.81 GT:AD:DP:GL:GQ 0/1:58,53:110:-191.77,-33.14,-192.67:99
-chr1 3673550 rs1181873 A C 65.84 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=502.42;QD=12.88;SB=-249.39 GT:AD:DP:GL:GQ 0/1:20,19:38:-64.97,-11.45,-71.58:99
-chr1 3673967 rs1181872 T A 314.39 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.13;MQ0=0;OQ=665.69;QD=15.48;SB=-321.70 GT:AD:DP:GL:GQ 0/1:19,24:41:-82.21,-12.35,-69.45:99
-chr1 3674181 rs1181871 A G 201.06 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=52.16;MQ0=0;OQ=271.85;QD=7.55;SB=-59.74 GT:AD:DP:GL:GQ 0/1:21,15:32:-40.11,-9.65,-77.03:99
-chr1 3674814 rs1181870 C A 305.27 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=57.69;MQ0=0;OQ=866.35;QD=12.93;SB=-280.62 GT:AD:DP:GL:GQ 0/1:36,31:65:-109.50,-19.58,-123.19:99
-chr1 3677599 rs1175552 C A 135.06 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=60.00;MQ0=0;OQ=585.48;QD=10.09;SB=-188.53 GT:AD:DP:GL:GQ 0/1:34,24:53:-77.81,-15.97,-102.27:99
-chr1 3678505 rs1175551 T C 166.68 PASS AC=1;AF=0.50;AN=2;DB;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=58.20;MQ0=0;OQ=103.01;QD=7.92;SB=-65.87 GT:AD:DP:GL:GQ 0/1:7,6:12:-17.20,-3.62,-26.14:99
-chr1 3679407 . C G 26.93 LowQual AC=1;AF=0.50;AN=2;DP=11;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=48.93;MQ0=0;QD=2.45;SB=-6.99 GT:AD:DP:GL:GQ 0/1:3,8:4:-7.19,-1.21,-8.24:59.76
-chr1 3681100 rs1184341 C T 108.25 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=3.04;MQ=59.23;MQ0=0;OQ=426.67;QD=14.22;SB=-164.69 GT:AD:DP:GL:GQ 0/1:15,15:28:-54.39,-8.44,-49.07:99
-chr1 3681124 rs2797432 A G 199.77 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=396.40;QD=12.39;SB=-160.61 GT:AD:DP:GL:GQ 0/1:13,19:29:-51.67,-8.74,-51.47:99
-chr1 3681330 rs1181893 A C 235.23 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.61;MQ0=0;OQ=409.25;QD=27.28;SB=-143.01 GT:AD:DP:GL:GQ 1/1:0,15:13:-44.52,-3.92,-0.01:39.10
-chr1 3681388 rs1175550 A G 206.60 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.14;MQ0=0;OQ=268.33;QD=9.94;SB=-118.66 GT:AD:DP:GL:GQ 0/1:16,11:27:-38.26,-8.14,-61.45:99
-chr1 3681587 rs1175549 A C 56.97 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.28;MQ0=0;OQ=317.74;QD=9.93;SB=-135.67 GT:AD:DP:GL:GQ 0/1:18,14:31:-44.40,-9.34,-64.53:99
-chr1 3682892 rs1175548 A G 294.07 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.99;MQ0=0;OQ=521.21;QD=11.33;SB=-266.55 GT:AD:DP:GL:GQ 0/1:25,21:43:-68.36,-12.95,-93.71:99
-chr1 3683615 rs1175547 G T 106.09 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=58.25;MQ0=0;OQ=658.75;QD=16.47;SB=-219.58 GT:AD:DP:GL:GQ 0/1:18,22:39:-80.91,-11.75,-53.72:99
-chr1 3683769 rs1175546 C T 14.30 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=58.95;MQ0=0;OQ=845.89;QD=19.22;SB=-175.68 GT:AD:DP:GL:GQ 0/1:18,26:42:-100.52,-12.65,-61.88:99
-chr1 3684656 rs1891934 G A 75.40 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.58;MQ0=0;OQ=574.95;QD=13.07;SB=-268.25 GT:AD:DP:GL:GQ 0/1:26,18:41:-73.14,-12.36,-73.56:99
-chr1 3684836 . T G 29.95 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=2;HaplotypeScore=5.28;MQ=57.94;MQ0=0;QD=0.88;SB=50.17 GT:AD:DP:GL:GQ 0/1:20,14:25:-13.81,-7.53,-70.58:62.78
-chr1 3685860 rs2799182 T C 179.63 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=58.63;MQ0=0;OQ=681.56;QD=13.36;SB=-324.12 GT:AD:DP:GL:GQ 0/1:23,28:50:-86.51,-15.07,-94.22:99
-chr1 3686231 rs61759305 C T 280.07 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=512.50;QD=17.08;SB=-238.52 GT:AD:DP:GL:GQ 0/1:14,16:29:-63.27,-8.74,-47.74:99
-chr1 3686750 rs8379 A C 132.74 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.70;MQ0=0;OQ=512.51;QD=8.27;SB=-204.80 GT:AD:DP:GL:GQ 0/1:39,23:59:-72.31,-17.77,-139.60:99
-chr1 3687151 rs2996428 C T 323.10 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=59.68;MQ0=0;OQ=1332.10;QD=18.25;SB=-588.63 GT:AD:DP:GL:GQ 0/1:30,43:68:-156.98,-20.49,-102.01:99
-chr1 3688388 rs2799186 C G 198.40 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=1120.38;QD=14.55;SB=-296.13 GT:AD:DP:GL:GQ 0/1:44,32:77:-141.06,-25.73,-190.14:99
-chr1 3688807 rs12122058 C T 132.91 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=788.10;QD=15.16;SB=-353.46 GT:AD:DP:GL:GQ 0/1:27,25:50:-97.16,-15.07,-93.28:99
-chr1 3689428 rs2799185 G C 86.89 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.23;MQ0=0;OQ=644.64;QD=17.42;SB=-205.64 GT:AD:DP:GL:GQ 0/1:18,19:35:-78.30,-10.56,-70.47:99
-chr1 3689489 rs2799184 T G 198.26 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=4.30;MQ=56.35;MQ0=0;OQ=514.42;QD=13.19;SB=-238.40 GT:AD:DP:GL:GQ 0/1:19,20:37:-65.87,-11.14,-65.31:99
-chr1 3689844 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=16;HaplotypeScore=12.40;MQ=56.82;MQ0=0;OQ=207.53;QD=3.10;SB=47.88 GT:AD:DP:GL:GQ 0/1:50,16:53:-40.01,-15.97,-140.82:99
-chr1 3691351 rs2996426 A G 107.45 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.66;MQ=59.77;MQ0=0;OQ=576.97;QD=11.10;SB=-273.25 GT:AD:DP:GL:GQ 0/1:26,26:49:-75.76,-14.78,-98.82:99
-chr1 3693197 rs2368537 G C 138.15 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.55;MQ0=0;OQ=1805.49;QD=35.40;SB=-781.23 GT:AD:DP:GL:GQ 1/1:0,51:46:-184.17,-13.88,-0.03:99
-chr1 3693570 rs2253143 G A 60.94 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=3.58;MQ=58.41;MQ0=0;OQ=495.55;QD=11.26;SB=-141.61 GT:AD:DP:GL:GQ 0/1:26,18:41:-65.20,-12.37,-77.20:99
-chr1 3694312 rs12142183 T G 312.97 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=59.65;MQ0=0;OQ=615.52;QD=11.61;SB=-311.76 GT:AD:DP:GL:GQ 0/1:22,31:47:-79.00,-14.16,-79.12:99
-chr1 3694564 . G C 39.33 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=6.24;MQ=58.81;MQ0=0;QD=0.72;SB=44.18 GT:AD:DP:GL:GQ 0/1:42,12:37:-18.38,-11.17,-134.23:72.16
-chr1 3701498 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=71;Dels=0.03;HRun=20;HaplotypeScore=51.30;MQ=52.45;MQ0=0;OQ=259.27;QD=3.65;SB=80.25 GT:AD:DP:GL:GQ 0/1:46,23:54:-44.89,-15.68,-134.64:99
-chr1 3708347 rs6681383 G A 128.24 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.34;MQ0=0;OQ=1078.39;QD=18.92;SB=-322.85 GT:AD:DP:GL:GQ 0/1:24,33:53:-127.10,-15.97,-69.66:99
-chr1 3712148 rs2996425 A T 193.61 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.11;MQ=59.02;MQ0=0;OQ=2222.50;QD=35.85;SB=-1018.88 GT:AD:DP:GL:GQ 1/1:0,62:60:-225.85,-18.07,-0.02:99
-chr1 3714307 rs61759320 G A 326.68 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=53.55;MQ0=0;OQ=770.50;QD=14.01;SB=-354.84 GT:AD:DP:GL:GQ 0/1:29,25:53:-96.31,-15.97,-95.14:99
-chr1 3714663 . A C 15.04 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=8.17;MQ=57.66;MQ0=0;QD=0.38;SB=56.19 GT:AD:DP:GL:GQ 0/1:24,16:28:-13.21,-8.44,-81.36:47.74
-chr1 3727878 . C T 38.08 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=59.48;MQ0=0;OQ=1399.61;QD=17.28;SB=-662.18 GT:AD:DP:GL:GQ 0/1:40,41:81:-167.65,-24.40,-140.98:99
-chr1 3731503 . A G 18.90 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=3;HaplotypeScore=1.79;MQ=54.69;MQ0=0;QD=0.73;SB=5.04 GT:AD:DP:GL:GQ 0/1:21,5:21:-11.50,-6.33,-70.25:51.68
-chr1 3735976 rs1836 A G 124.85 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.74;MQ0=0;OQ=2210.40;QD=31.13;SB=-963.45 GT:AD:DP:GL:GQ 1/1:0,70:69:-227.21,-23.18,-2.59:99
-chr1 3736114 rs2275830 T C 634.35 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2088.07;QD=30.71;SB=-734.31 GT:AD:DP:GL:GQ 1/1:0,68:67:-212.46,-20.22,-0.07:99
-chr1 3736443 rs2275828 G T 17.64 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=3.28;MQ=59.05;MQ0=0;OQ=2655.56;QD=36.38;SB=-1342.28 GT:AD:DP:GL:GQ 1/1:0,73:72:-269.16,-21.68,-0.02:99
-chr1 3736449 rs2275826 C G 89.02 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.10;MQ0=0;OQ=3375.97;QD=43.84;SB=-1685.64 GT:AD:DP:GL:GQ 1/1:0,77:77:-336.60,-23.20,-0.02:99
-chr1 3737179 rs4648417 C T 55.97 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=58.05;MQ0=0;OQ=1230.92;QD=34.19;SB=-377.48 GT:AD:DP:GL:GQ 1/1:0,35:33:-126.70,-9.95,-0.02:99
-chr1 3737440 rs6424058 C T 106.25 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=3.83;MQ=56.84;MQ0=0;OQ=1463.09;QD=34.84;SB=-699.35 GT:AD:DP:GL:GQ 1/1:0,42:38:-149.91,-11.45,-0.01:99
-chr1 3737463 rs6413779 T C 36.87 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.40;MQ0=0;OQ=1023.14;QD=33.00;SB=-220.63 GT:AD:DP:GL:GQ 1/1:0,31:31:-105.92,-9.34,-0.02:93.25
-chr1 3737945 rs7522227 A G 230.87 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=2674.63;QD=34.29;SB=-1340.60 GT:AD:DP:GL:GQ 1/1:0,77:76:-271.07,-22.89,-0.02:99
-chr1 3738031 rs7524765 T C 717.11 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2886.44;QD=35.20;SB=-1305.64 GT:AD:DP:GL:GQ 1/1:0,82:82:-292.25,-24.70,-0.03:99
-chr1 3738548 rs17403836 A C 593.74 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.20;MQ0=0;OQ=3340.65;QD=35.92;SB=-1448.19 GT:AD:DP:GL:GQ 1/1:0,93:93:-333.07,-28.01,-0.02:99
-chr1 3738842 rs61768911 C G 310.36 PASS AC=2;AF=1.00;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.39;MQ0=2;OQ=606.83;QD=30.34;SB=-199.55 GT:AD:DP:GL:GQ 1/1:0,19:16:-64.28,-4.83,-0.01:48.16
-chr1 3738927 . T C 23.45 LowQual AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=5.48;MQ=47.67;MQ0=1;QD=0.60;SB=-5.57 GT:AD:DP:GL:GQ 0/1:32,7:31:-14.97,-9.34,-106.27:56.26
-chr1 3738930 . T C 7.68 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=48.29;MQ0=0;OQ=738.60;QD=19.44;SB=-353.38 GT:AD:DP:GL:GQ 0/1:6,32:31:-86.49,-9.35,-16.38:70.33
-chr1 3738954 rs61768912 T C 1249.83 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.18;MQ0=0;QD=28.41;SB=-561.89 GT:AD:DP:GL:GQ 1/1:0,43:40:-128.60,-12.06,-0.04:99
-chr1 3738962 rs61768913 A G 1521.07 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.09;MQ0=0;QD=28.17;SB=-501.21 GT:AD:DP:GL:GQ 1/1:0,54:48:-155.73,-14.47,-0.04:99
-chr1 3738964 rs61768914 A G 1823.57 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=53.35;MQ0=0;QD=32.56;SB=-678.27 GT:AD:DP:GL:GQ 1/1:0,56:52:-185.96,-15.66,-0.02:99
-chr1 3738975 rs61768915 T C 185.63 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=53.83;MQ0=0;OQ=2377.40;QD=34.96;SB=-853.97 GT:AD:DP:GL:GQ 1/1:0,68:67:-241.35,-20.18,-0.03:99
-chr1 3739217 rs6684560 G A 167.13 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=55.03;MQ0=0;OQ=2027.81;QD=36.87;SB=-859.02 GT:AD:DP:GL:GQ 1/1:1,54:53:-206.39,-15.97,-0.02:99
-chr1 3739448 rs6676260 T C 481.80 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1276.86;QD=30.40;SB=-555.08 GT:AD:DP:GL:GQ 1/1:0,42:41:-131.31,-12.36,-0.03:99
-chr1 3739507 rs10797344 C G 65.45 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.28;MQ0=0;OQ=2404.57;QD=37.57;SB=-1028.99 GT:AD:DP:GL:GQ 1/1:0,64:58:-244.08,-17.49,-0.04:99
-chr1 3739508 rs10797345 G A 56.93 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=59.28;MQ0=0;OQ=2416.64;QD=37.76;SB=-1154.54 GT:AD:DP:GL:GQ 1/1:0,64:63:-245.28,-18.99,-0.03:99
-chr1 3739554 rs6673716 A G 130.37 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=1461.81;QD=29.83;SB=-615.96 GT:AD:DP:GL:GQ 1/1:0,49:46:-149.80,-13.87,-0.04:99
-chr1 3739633 rs6673807 A G 581.92 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=2050.62;QD=35.36;SB=-778.99 GT:AD:DP:GL:GQ 1/1:0,58:58:-208.67,-17.47,-0.02:99
-chr1 3740027 rs2368533 G A 618.30 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2881.32;QD=38.94;SB=-1374.05 GT:AD:DP:GL:GQ 1/1:0,74:73:-291.74,-21.99,-0.02:99
-chr1 3740589 rs6677381 A G 634.61 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2780.11;QD=35.64;SB=-1088.76 GT:AD:DP:GL:GQ 1/1:0,78:77:-281.62,-23.19,-0.02:99
-chr1 3740591 rs6680017 T G 509.75 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=2637.83;QD=34.26;SB=-1082.49 GT:AD:DP:GL:GQ 1/1:0,77:75:-267.39,-22.59,-0.02:99
-chr1 3740758 . T A 7.56 PASS AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.28;MQ0=1;OQ=174.11;QD=4.71;SB=-20.31 GT:AD:DP:GL:GQ 0/1:28,9:34:-30.93,-10.24,-98.40:99
-chr1 3741138 rs2887273 C G 484.06 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2855.33;QD=43.26;SB=-1170.05 GT:AD:DP:GL:GQ 1/1:0,66:66:-289.13,-19.88,-0.02:99
-chr1 3741826 rs4648419 C G 552.08 PASS AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=3843.78;QD=42.24;SB=-1290.87 GT:AD:DP:GL:GQ 1/1:0,91:88:-383.38,-26.52,-0.03:99
-chr1 3742892 . G T 16.29 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=20;HaplotypeScore=18.89;MQ=55.03;MQ0=1;QD=0.28;SB=44.02 GT:AD:DP:GL:GQ 0/1:50,6:41:-19.70,-14.80,-98.51:49.02
-chr1 3742917 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.02;HRun=20;HaplotypeScore=34.21;MQ=57.45;MQ0=0;OQ=170.67;QD=3.28;SB=56.18 GT:AD:DP:GL:GQ 0/1:37,14:43:-33.01,-12.65,-114.45:99
-chr1 3742996 rs2275824 A T 710.47 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2009.53;QD=35.25;SB=-882.57 GT:AD:DP:GL:GQ 1/1:0,57:56:-204.56,-16.87,-0.02:99
-chr1 3744349 rs12409082 G C 531.14 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3059.06;QD=43.09;SB=-1422.83 GT:AD:DP:GL:GQ 1/1:0,71:71:-309.52,-21.40,-0.02:99
-chr1 3744456 rs6683827 G T 2.38 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=4.28;MQ=58.86;MQ0=0;OQ=2501.40;QD=35.73;SB=-1071.46 GT:AD:DP:GL:GQ 1/1:0,70:69:-253.75,-20.78,-0.02:99
-chr1 3745535 rs1891941 T C 731.33 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2479.06;QD=35.42;SB=-1217.69 GT:AD:DP:GL:GQ 1/1:0,70:69:-251.51,-20.78,-0.02:99
-chr1 3745729 rs1891940 T C 456.28 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=1634.49;QD=34.78;SB=-697.28 GT:AD:DP:GL:GQ 1/1:0,47:46:-167.05,-13.85,-0.01:99
-chr1 3745735 rs1891939 T G 249.79 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=1553.73;QD=33.78;SB=-800.51 GT:AD:DP:GL:GQ 1/1:0,46:45:-158.97,-13.55,-0.02:99
-chr1 3745980 rs1539649 A G 625.14 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=2553.81;QD=30.77;SB=-1180.11 GT:AD:DP:GL:GQ 1/1:0,83:80:-259.03,-24.12,-0.06:99
-chr1 3746353 rs7535887 T C 654.18 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1854.47;QD=30.91;SB=-854.01 GT:AD:DP:GL:GQ 1/1:0,60:59:-189.08,-17.79,-0.05:99
-chr1 3746392 rs10797346 T C 305.08 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2579.74;QD=35.83;SB=-1200.15 GT:AD:DP:GL:GQ 1/1:0,72:72:-261.58,-21.69,-0.02:99
-chr1 3747160 rs10909800 C T 207.27 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2281.73;QD=39.34;SB=-904.67 GT:AD:DP:GL:GQ 1/1:0,58:58:-231.78,-17.47,-0.02:99
-chr1 3748578 rs4381131 T C 118.61 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=57.58;MQ0=0;OQ=1302.81;QD=35.21;SB=-612.36 GT:AD:DP:GL:GQ 1/1:0,37:37:-133.88,-11.14,-0.01:99
-chr1 3748616 rs4411084 A G 124.66 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.91;MQ=57.27;MQ0=0;OQ=1453.01;QD=29.06;SB=-634.87 GT:AD:DP:GL:GQ 1/1:0,50:46:-148.93,-13.88,-0.04:99
-chr1 3749212 rs3765774 T A 197.18 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=2826.29;QD=36.71;SB=-1358.75 GT:AD:DP:GL:GQ 1/1:0,77:76:-286.23,-22.89,-0.02:99
-chr1 3749644 rs10797347 A G 265.86 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=59.07;MQ0=0;OQ=1626.88;QD=34.61;SB=-812.67 GT:AD:DP:GL:GQ 1/1:0,47:46:-166.29,-13.86,-0.01:99
-chr1 3749797 rs10909801 A G 1.04 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=13.74;MQ=53.38;MQ0=0;OQ=1309.63;QD=23.81;SB=-631.48 GT:AD:DP:GL:GQ 1/1:0,53:41:-134.59,-12.37,-0.04:99
-chr1 3749921 rs6701360 G A 575.83 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.91;MQ0=0;OQ=2426.40;QD=38.51;SB=-904.68 GT:AD:DP:GL:GQ 1/1:0,63:63:-246.25,-18.99,-0.03:99
-chr1 3749974 rs6690371 A G 48.27 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=58.34;MQ0=0;OQ=1681.22;QD=35.03;SB=-728.27 GT:AD:DP:GL:GQ 1/1:0,48:48:-171.73,-14.47,-0.03:99
-chr1 3749989 rs6678020 C T 441.08 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.59;MQ0=0;OQ=1518.29;QD=37.96;SB=-571.34 GT:AD:DP:GL:GQ 1/1:0,40:39:-155.43,-11.75,-0.01:99
-chr1 3750090 rs6680552 C T 728 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.60;MQ0=1;OQ=1998.34;QD=35.06;SB=-998.84 GT:AD:DP:GL:GQ 1/1:0,57:51:-203.43,-15.36,-0.01:99
-chr1 3750216 rs6695657 T C 130.02 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.67;MQ0=0;OQ=1753.47;QD=29.72;SB=-613.96 GT:AD:DP:GL:GQ 1/1:0,59:56:-178.99,-16.89,-0.06:99
-chr1 3750378 rs10752723 A G 15.88 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.50;MQ=56.80;MQ0=0;OQ=1482.59;QD=32.95;SB=-488.54 GT:AD:DP:GL:GQ 1/1:1,43:41:-151.86,-12.35,-0.01:99
-chr1 3751141 rs6698930 T A 637.91 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=7;HaplotypeScore=46.26;MQ=41.75;MQ0=0;QD=7.78;SB=8.51 GT:AD:DP:GL:GQ 0/1:49,33:69:-87.87,-20.79,-167.40:99
-chr1 3751339 rs2275822 C T 226.46 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.23;MQ0=0;OQ=2373.96;QD=39.57;SB=-964.37 GT:AD:DP:GL:GQ 1/1:0,60:60:-241.00,-18.08,-0.02:99
-chr1 3751510 rs2275821 A G 573.45 PASS AC=2;AF=1.00;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.31;MQ0=0;OQ=3500.46;QD=35.36;SB=-1716.03 GT:AD:DP:GL:GQ 1/1:0,99:96:-349.05,-28.91,-0.03:99
-chr1 3751936 rs6699784 T C 22.54 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1634.61;QD=34.05;SB=-680.60 GT:AD:DP:GL:GQ 1/1:0,48:47:-167.07,-14.16,-0.02:99
-chr1 3751940 rs6699785 T C 457.63 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1716.61;QD=35.76;SB=-707.61 GT:AD:DP:GL:GQ 1/1:0,48:48:-175.26,-14.46,-0.02:99
-chr1 3752276 rs6687498 C A 0.86 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=7.86;MQ=58.29;MQ0=1;OQ=1565.75;QD=34.79;SB=-714.95 GT:AD:DP:GL:GQ 1/1:1,44:44:-160.17,-13.25,-0.01:99
-chr1 3752464 rs4494088 C T 130.82 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.01;MQ0=0;OQ=2585.87;QD=39.18;SB=-1275.71 GT:AD:DP:GL:GQ 1/1:0,66:65:-262.19,-19.58,-0.02:99
-chr1 3752510 . C A 11.64 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=20;HaplotypeScore=16.03;MQ=54.71;MQ0=1;QD=0.16;SB=98.34 GT:AD:DP:GL:GQ 0/1:63,8:53:-20.38,-15.96,-171.47:44.17
-chr1 3752581 rs4534323 A T 713.95 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2157.31;QD=36.56;SB=-930.57 GT:AD:DP:GL:GQ 1/1:0,59:59:-219.34,-17.77,-0.02:99
-chr1 3753724 rs12047360 G A 108.34 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=59.36;MQ0=0;OQ=1255.98;QD=34.89;SB=-564.33 GT:AD:DP:GL:GQ 1/1:0,36:33:-129.19,-9.94,-0.01:99
-chr1 3754321 rs34401151 C T 220.62 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.55;MQ0=0;OQ=2357.19;QD=36.83;SB=-1184.12 GT:AD:DP:GL:GQ 1/1:0,63:62:-242.18,-21.42,-2.88:99
-chr1 3754471 rs55873991 T C 460.04 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=2216.85;QD=34.64;SB=-478.52 GT:AD:DP:GL:GQ 1/1:0,64:60:-225.28,-18.07,-0.01:99
-chr1 3755409 rs4648346 G A 377.30 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=56.94;MQ0=0;OQ=2718.34;QD=38.83;SB=-1289.71 GT:AD:DP:GL:GQ 1/1:0,70:68:-275.43,-20.48,-0.02:99
-chr1 3755538 rs4648423 C T 3.24 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=5.11;MQ=59.49;MQ0=0;OQ=1662.33;QD=36.94;SB=-681.30 GT:AD:DP:GL:GQ 1/1:0,44:44:-169.84,-13.26,-0.02:99
-chr1 3755615 rs4648347 T C 415.08 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.19;MQ0=0;OQ=2002.26;QD=34.52;SB=-940.97 GT:AD:DP:GL:GQ 1/1:0,58:56:-203.83,-16.87,-0.02:99
-chr1 3755919 rs12097923 G T 175.21 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=59.51;MQ0=0;OQ=2007.64;QD=34.03;SB=-971.58 GT:AD:DP:GL:GQ 1/1:0,58:57:-204.37,-17.17,-0.02:99
-chr1 3756146 rs17404435 G T 642.91 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1775.93;QD=34.82;SB=-654.09 GT:AD:DP:GL:GQ 1/1:0,51:50:-181.19,-15.06,-0.02:99
-chr1 3756301 rs6683156 C T 153.50 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=59.62;MQ0=0;OQ=3593.95;QD=38.64;SB=-1767.70 GT:AD:DP:GL:GQ 1/1:0,92:90:-358.39,-27.12,-0.03:99
-chr1 3757458 rs3765779 A G 312.92 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1547.17;QD=29.19;SB=-677.55 GT:AD:DP:GL:GQ 1/1:0,53:50:-158.35,-15.08,-0.05:99
-chr1 3757556 rs3765780 C T 73.74 PASS AC=2;AF=1.00;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1220.87;QD=37.00;SB=-540.71 GT:AD:DP:GL:GQ 1/1:0,33:32:-125.68,-9.64,-0.01:96.30
-chr1 3758579 rs1539647 T C 5.15 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=3.94;MQ=58.65;MQ0=1;OQ=2215.43;QD=29.94;SB=-922.78 GT:AD:DP:GL:GQ 1/1:1,73:71:-228.15,-21.41,-3.03:99
-chr1 3758589 rs1539648 T C 162.50 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.09;MQ0=0;OQ=2319.86;QD=30.52;SB=-925.48 GT:AD:DP:GL:GQ 1/1:0,76:73:-235.63,-22.01,-0.06:99
-chr1 3759091 rs6657021 A G 451.01 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.04;MQ0=0;OQ=2173.33;QD=30.19;SB=-1093.08 GT:AD:DP:GL:GQ 1/1:0,72:68:-220.98,-20.51,-0.06:99
-chr1 3759136 rs6668213 G C 44.87 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.72;MQ0=0;OQ=2874.30;QD=41.66;SB=-1253.95 GT:AD:DP:GL:GQ 1/1:0,69:66:-291.04,-19.89,-0.02:99
-chr1 3759146 rs6693152 C T 203.33 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.07;MQ0=0;OQ=2711.10;QD=38.73;SB=-1194.58 GT:AD:DP:GL:GQ 1/1:0,70:68:-274.71,-20.49,-0.02:99
-chr1 3759189 rs6657132 A G 408.69 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1707.03;QD=31.04;SB=-847.00 GT:AD:DP:GL:GQ 1/1:0,55:50:-174.32,-15.07,-0.03:99
-chr1 3759225 rs6668306 G C 258.29 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.53;MQ0=0;OQ=1917.17;QD=39.13;SB=-849.44 GT:AD:DP:GL:GQ 1/1:0,49:46:-195.32,-13.87,-0.02:99
-chr1 3759237 rs6693259 C T 255.19 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1813.57;QD=38.59;SB=-875.61 GT:AD:DP:GL:GQ 1/1:0,47:47:-184.96,-14.17,-0.02:99
-chr1 3759339 . T C 4.24 PASS AC=2;AF=1.00;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=37.66;MQ0=0;OQ=1291.89;QD=29.36;SB=-665.80 GT:AD:DP:GL:GQ 1/1:0,44:41:-132.82,-12.37,-0.04:99
-chr1 3759424 rs11576718 T C 18.88 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.78;MQ0=0;OQ=1915.98;QD=34.84;SB=-646.27 GT:AD:DP:GL:GQ 1/1:0,55:53:-195.20,-15.96,-0.02:99
-chr1 3759450 rs11578021 G C 393.67 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2482.73;QD=42.08;SB=-1009.18 GT:AD:DP:GL:GQ 1/1:0,59:57:-251.88,-17.18,-0.02:99
-chr1 3760255 rs4130539 C A 200.10 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=59.43;MQ0=0;OQ=2921.40;QD=36.07;SB=-1317.55 GT:AD:DP:GL:GQ 1/1:0,81:81:-295.75,-24.40,-0.03:99
-chr1 3760285 rs4233023 G A 128.17 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=2979.99;QD=37.25;SB=-1007.64 GT:AD:DP:GL:GQ 1/1:0,80:76:-301.61,-22.90,-0.03:99
-chr1 3760596 rs4582731 T C 194.06 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1740.97;QD=31.65;SB=-868.36 GT:AD:DP:GL:GQ 1/1:0,55:54:-177.73,-16.29,-0.05:99
-chr1 3760968 rs12023761 T C 207.14 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=57.12;MQ0=0;OQ=2651.31;QD=33.99;SB=-1110.83 GT:AD:DP:GL:GQ 1/1:0,78:75:-268.74,-22.59,-0.02:99
-chr1 3760980 rs12023762 T C 71.74 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=56.93;MQ0=0;OQ=2310.56;QD=34.49;SB=-1074.87 GT:AD:DP:GL:GQ 1/1:0,66:64:-234.66,-19.27,-0.02:99
-chr1 3761023 rs12026284 G A 45.52 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.92;MQ0=0;OQ=1613.24;QD=38.41;SB=-773.05 GT:AD:DP:GL:GQ 1/1:0,42:41:-164.92,-12.35,-0.01:99
-chr1 3761229 rs12024538 T C 108.72 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=57.43;MQ0=0;OQ=2622.46;QD=34.06;SB=-1093.09 GT:AD:DP:GL:GQ 1/1:0,77:74:-265.86,-22.29,-0.03:99
-chr1 3761407 rs7552678 C T 182.01 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=55.63;MQ0=0;OQ=2322.80;QD=37.46;SB=-1101.95 GT:AD:DP:GL:GQ 1/1:0,61:58:-235.88,-17.47,-0.01:99
-chr1 3761583 rs10909805 A T 36.48 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.39;MQ0=0;OQ=1183.25;QD=32.87;SB=-378.79 GT:AD:DP:GL:GQ 1/1:0,36:34:-121.93,-10.24,-0.02:99
-chr1 3762135 rs4648348 G T 313.87 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=2805.56;QD=36.44;SB=-1091.90 GT:AD:DP:GL:GQ 1/1:0,77:77:-284.17,-23.19,-0.03:99
-chr1 3762966 rs6424059 C T 50.97 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1794.59;QD=39.88;SB=-207.77 GT:AD:DP:GL:GQ 1/1:0,45:45:-183.06,-13.56,-0.01:99
-chr1 3763112 rs6424060 C A 1.11 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=57.94;MQ0=0;OQ=1225.37;QD=36.04;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,34:33:-126.13,-9.94,-0.01:99
-chr1 3763448 rs7542369 C G 0.46 PASS AC=2;AF=1.00;AN=2;DB;DP=15;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=407.00;QD=27.13;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,15:12:-44.31,-3.64,-0.03:36.11
-chr1 3763578 rs4648428 A G 5.56 PASS AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=286.53;QD=20.47;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:11:-32.26,-3.33,-0.02:33.05
-chr1 3764486 rs10909806 C A 23.23 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=58.37;MQ0=0;OQ=1559.40;QD=35.44;SB=-546.78 GT:AD:DP:GL:GQ 1/1:0,44:43:-159.54,-12.95,-0.01:99
-chr1 3765314 rs4376673 C G 417.23 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1404.99;QD=36.03;SB=-615.54 GT:AD:DP:GL:GQ 1/1:0,39:36:-144.12,-10.87,-0.03:99
-chr1 3765882 rs9786959 A G 29.68 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=1920.48;QD=30.48;SB=-862.57 GT:AD:DP:GL:GQ 1/1:0,63:60:-195.68,-18.09,-0.05:99
-chr1 3767471 rs11800725 A G 13.03 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=58.98;MQ0=0;OQ=1927.36;QD=30.11;SB=-765.33 GT:AD:DP:GL:GQ 1/1:0,64:61:-196.39,-18.41,-0.06:99
-chr1 3767577 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=17;HaplotypeScore=9.33;MQ=55.19;MQ0=0;OQ=73.00;QD=1.66;SB=10.79 GT:AD:DP:GL:GQ 0/1:33,10:33:-20.53,-9.94,-95.54:99
-chr1 3767595 . G A 13.29 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=17;HaplotypeScore=14.08;MQ=55.46;MQ0=0;QD=0.23;SB=74.24 GT:AD:DP:GL:GQ 0/1:47,10:46:-18.45,-13.86,-142.27:45.92
-chr1 3769011 rs4400555 C T 258.35 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.08;MQ0=0;OQ=2381.95;QD=39.05;SB=-1005.83 GT:AD:DP:GL:GQ 1/1:0,61:61:-241.80,-18.38,-0.02:99
-chr1 3769497 rs4573474 G C 208.99 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.06;MQ0=0;OQ=1909.70;QD=37.45;SB=-679.47 GT:AD:DP:GL:GQ 1/1:0,51:49:-194.60,-14.79,-0.05:99
-chr1 3769504 rs4475689 T C 437.54 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.81;MQ0=0;OQ=1544.26;QD=28.60;SB=-549.88 GT:AD:DP:GL:GQ 1/1:0,54:50:-158.07,-15.09,-0.05:99
-chr1 3769540 rs4393098 C T 134.88 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.73;MQ0=0;OQ=2714.04;QD=39.33;SB=-879.18 GT:AD:DP:GL:GQ 1/1:0,69:68:-275.01,-20.48,-0.02:99
-chr1 3770416 rs10909807 A G 70.24 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=59.66;MQ0=0;OQ=2327.40;QD=34.23;SB=-632.25 GT:AD:DP:GL:GQ 1/1:0,68:65:-236.35,-19.58,-0.03:99
-chr1 3770956 rs10797348 C A 725.50 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2194.69;QD=35.40;SB=-970.66 GT:AD:DP:GL:GQ 1/1:0,62:61:-223.07,-18.37,-0.02:99
-chr1 3770996 rs10752724 C G 36.73 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.68;MQ0=0;OQ=3059.04;QD=41.90;SB=-884.77 GT:AD:DP:GL:GQ 1/1:0,73:70:-309.51,-21.10,-0.03:99
-chr1 3772468 rs10909809 C T 66.95 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.41;MQ=58.92;MQ0=0;OQ=1387.22;QD=35.57;SB=-471.11 GT:AD:DP:GL:GQ 1/1:0,38:37:-142.33,-11.16,-0.02:99
-chr1 3773138 rs10909810 A C 280.94 PASS AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.04;MQ0=0;OQ=955.91;QD=32.96;SB=-323.98 GT:AD:DP:GL:GQ 1/1:0,29:29:-99.19,-8.74,-0.02:87.21
-chr1 3773433 rs10797349 C T 164.73 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=58.68;MQ0=0;OQ=1490.84;QD=33.88;SB=-752.63 GT:AD:DP:GL:GQ 1/1:0,44:39:-152.69,-11.75,-0.02:99
-chr1 3773480 rs10797350 T C 13.89 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=58.30;MQ0=0;OQ=1471.72;QD=30.66;SB=-684.88 GT:AD:DP:GL:GQ 1/1:0,48:45:-150.79,-13.57,-0.03:99
-chr1 3773523 rs10752726 T G 347.66 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1497.10;QD=33.27;SB=-446.81 GT:AD:DP:GL:GQ 1/1:0,45:43:-153.31,-12.95,-0.01:99
-chr1 3773611 rs12035912 C T 197.79 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.30;MQ0=0;OQ=2493.51;QD=37.78;SB=-1130.03 GT:AD:DP:GL:GQ 1/1:0,66:64:-252.96,-19.28,-0.02:99
-chr1 3775032 . T C 552.80 SnpCluster AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=33.42;MQ=46.78;MQ0=0;QD=6.28;SB=-111.60 GT:AD:DP:GL:GQ 0/1:60,28:83:-83.58,-25.02,-222.80:99
-chr1 3775037 . G T 197.57 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=0;HaplotypeScore=30.55;MQ=47.65;MQ0=0;QD=2.00;SB=65.19 GT:AD:DP:GL:GQ 0/1:82,15:90:-57.60,-34.56,-265.76:99
-chr1 3775038 rs11801559 A G 304.07 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=1;HaplotypeScore=31.22;MQ=47.58;MQ0=0;QD=3.07;SB=-149.93 GT:AD:DP:GL:GQ 0/1:75,24:82:-58.40,-24.71,-264.98:99
-chr1 3775067 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=168;Dels=0.00;HRun=0;HaplotypeScore=55.99;MQ=43.63;MQ0=2;OQ=741.54;QD=4.41;SB=-115.85 GT:AD:DP:GL:GQ 0/1:87,38:131:-206.86,-129.42,-352.70:99
-chr1 3775068 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=2;HaplotypeScore=57.14;MQ=43.69;MQ0=2;OQ=621.12;QD=3.63;SB=-22.34 GT:AD:DP:GL:GQ 0/1:130,41:133:-105.49,-40.09,-359.21:99
-chr1 3775097 . C T 202.73 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=156;Dels=0.02;HRun=0;HaplotypeScore=180.15;MQ=42.01;MQ0=2;QD=1.30;SB=-48.46 GT:AD:DP:GL:GQ 0/1:127,21:125:-62.81,-39.25,-356.59:99
-chr1 3775132 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=0;HaplotypeScore=17.94;MQ=41.24;MQ0=3;OQ=65.49;QD=0.68;SB=-47.12 GT:AD:DP:GL:GQ 0/1:77,9:78:-49.90,-40.06,-295.84:98.32
-chr1 3779522 rs11581471 A G 100.85 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.41;MQ0=0;OQ=1287.54;QD=29.26;SB=-667.82 GT:AD:DP:GL:GQ 1/1:0,44:42:-132.38,-12.67,-0.05:99
-chr1 3779990 rs12130391 G A 164 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.47;MQ0=0;OQ=2160.23;QD=35.41;SB=-916.74 GT:AD:DP:GL:GQ 1/1:0,60:57:-219.63,-17.18,-0.03:99
-chr1 3780767 . T C 4.63 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=30.96;MQ0=11;OQ=368.82;QD=6.36;SB=-104.61 GT:AD:DP:GL:GQ 0/1:34,24:38:-51.63,-11.46,-83.55:99
-chr1 3781074 rs10752727 C T 2.58 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=7.70;MQ=37.12;MQ0=12;OQ=1286.15;QD=21.08;SB=-457.95 GT:AD:DP:GL:GQ 1/1:3,58:36:-135.18,-10.85,-2.98:78.66
-chr1 3783772 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=19;HaplotypeScore=32.14;MQ=55.75;MQ0=0;OQ=200.26;QD=4.01;SB=53.19 GT:AD:DP:GL:GQ 0/1:32,18:38:-34.76,-11.45,-99.41:99
-chr1 3784133 rs12132240 C T 668.84 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.52;MQ0=0;OQ=2396.10;QD=39.93;SB=-998.03 GT:AD:DP:GL:GQ 1/1:0,60:60:-243.21,-18.07,-0.02:99
-chr1 3785251 rs10737189 T C 42.26 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=59.45;MQ0=0;OQ=2617.88;QD=31.17;SB=-945.37 GT:AD:DP:GL:GQ 1/1:0,84:80:-265.43,-24.12,-0.06:99
-chr1 3786402 rs12071660 G A 151.32 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2743.00;QD=38.63;SB=-1108.49 GT:AD:DP:GL:GQ 1/1:0,71:69:-277.90,-20.79,-0.02:99
-chr1 3787079 rs4074710 T C 1.91 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=9.84;MQ=58.78;MQ0=0;OQ=1684.95;QD=27.18;SB=-797.66 GT:AD:DP:GL:GQ 1/1:2,60:56:-176.09,-16.89,-4.01:99
-chr1 3787169 rs61768959 C T 435.29 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1824.58;QD=38.82;SB=-789.07 GT:AD:DP:GL:GQ 1/1:0,47:46:-186.05,-13.86,-0.01:99
-chr1 3787855 rs4073324 C T 458.35 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1383.49;QD=37.39;SB=-414.06 GT:AD:DP:GL:GQ 1/1:0,37:37:-141.95,-11.15,-0.02:99
-chr1 3787909 rs4073323 A G 2.22 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=3.99;MQ=59.35;MQ0=0;OQ=1345.64;QD=32.04;SB=-424.45 GT:AD:DP:GL:GQ 1/1:0,42:40:-138.17,-12.05,-0.02:99
-chr1 3788260 rs12084944 C T 298.99 PASS AC=2;AF=1.00;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=888.25;QD=37.01;SB=-436.08 GT:AD:DP:GL:GQ 1/1:0,24:23:-92.42,-6.93,-0.01:69.22
-chr1 3788534 rs12030906 T C 0.68 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.02;HRun=0;HaplotypeScore=9.00;MQ=56.58;MQ0=0;OQ=1607.45;QD=29.23;SB=-436.47 GT:AD:DP:GL:GQ 1/1:0,54:48:-164.35,-14.16,-0.02:99
-chr1 3789424 rs4382652 G A 2153.41 Indel AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.66;MQ=56.10;MQ0=0;QD=35.30;SB=-1010.66 GT:AD:DP:GL:GQ 1/1:0,61:57:-218.95,-17.18,-0.03:99
-chr1 3790102 rs3205087 A G 382.60 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.28;MQ0=0;OQ=1027.83;QD=26.35;SB=-300.09 GT:AD:DP:GL:GQ 1/1:0,39:35:-106.42,-10.57,-0.05:99
-chr1 3790340 rs7555538 G T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=8;HaplotypeScore=0.92;MQ=59.43;MQ0=0;OQ=2444.86;QD=33.49;SB=-1058.90 GT:AD:DP:GL:GQ 1/1:0,73:70:-248.10,-21.09,-0.03:99
-chr1 3791107 rs10909817 T G 151.89 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=57.75;MQ0=0;OQ=1681.31;QD=32.33;SB=-830.07 GT:AD:DP:GL:GQ 1/1:0,51:49:-171.73,-14.76,-0.02:99
-chr1 3792631 rs11584721 G C 5.17 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=5.57;MQ=57.48;MQ0=0;OQ=2243.27;QD=40.06;SB=-1057.19 GT:AD:DP:GL:GQ 1/1:1,55:53:-227.93,-15.97,-0.02:99
-chr1 3793561 rs12136187 C A 227.66 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.95;MQ0=0;OQ=1328.46;QD=34.06;SB=-683.01 GT:AD:DP:GL:GQ 1/1:0,39:37:-136.44,-11.15,-0.01:99
-chr1 3793615 rs7367066 T C 611.54 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.19;MQ0=0;OQ=1618.23;QD=29.97;SB=-707.63 GT:AD:DP:GL:GQ 1/1:0,53:51:-165.45,-15.38,-0.04:99
-chr1 3795300 rs6678851 C T 1.35 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=5.47;MQ=59.65;MQ0=0;OQ=2468.27;QD=37.97;SB=-809.33 GT:AD:DP:GL:GQ 1/1:0,65:63:-250.43,-18.98,-0.02:99
-chr1 3795934 rs4075974 G A 558.47 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.49;MQ0=0;OQ=2140.67;QD=39.64;SB=-940.34 GT:AD:DP:GL:GQ 1/1:0,54:54:-217.66,-16.27,-0.01:99
-chr1 3796218 rs10909819 T C 98.14 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.14;MQ0=0;OQ=2198.60;QD=32.33;SB=-948.97 GT:AD:DP:GL:GQ 1/1:0,68:64:-223.47,-19.28,-0.03:99
-chr1 3796503 rs4520357 T A 245.19 PASS AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.09;MQ0=0;OQ=3186.37;QD=35.40;SB=-1505.31 GT:AD:DP:GL:GQ 1/1:0,90:85:-322.25,-25.60,-0.02:99
-chr1 3797453 rs4274008 G C 114.81 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.18;MQ=59.65;MQ0=0;OQ=2739.80;QD=42.15;SB=-1186.93 GT:AD:DP:GL:GQ 1/1:0,65:64:-277.59,-19.29,-0.02:99
-chr1 3798031 rs6701422 T C 38.91 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=4.04;MQ=51.74;MQ0=0;OQ=1832.37;QD=30.04;SB=-733.76 GT:AD:DP:GL:GQ 1/1:0,60:57:-186.87,-17.19,-0.05:99
-chr1 3798222 rs4446914 G A 207.99 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=50.14;MQ0=0;OQ=2015.61;QD=38.03;SB=-988.99 GT:AD:DP:GL:GQ 1/1:0,53:52:-205.17,-15.67,-0.02:99
-chr1 3798375 . A G 51.46 PASS AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=16.12;MQ0=4;OQ=176.38;QD=13.57;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,13:6:-21.21,-1.81,-0.00:18.05
-chr1 3798911 rs12757258 A C 37.05 LowQual AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=30.57;MQ0=1;QD=7.41;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,3:2:-7.11,-0.60,-0.00:6.02
-chr1 3798957 rs12757292 A C 18.79 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.60;MQ0=1;OQ=75.37;QD=3.14;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,13:13:-14.74,-3.92,-26.95:99
-chr1 3799283 rs11807227 G A 605.39 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.57;MQ0=0;OQ=2371.97;QD=38.88;SB=-744.48 GT:AD:DP:GL:GQ 1/1:0,61:60:-240.80,-18.08,-0.02:99
-chr1 3800246 rs4568776 A G 199.91 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=2257.59;QD=31.80;SB=-934.52 GT:AD:DP:GL:GQ 1/1:0,71:68:-229.39,-20.50,-0.04:99
-chr1 3801063 rs7515869 A T 278.49 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=61.08;MQ0=0;OQ=1948.49;QD=33.03;SB=-981.77 GT:AD:DP:GL:GQ 1/1:0,57:54:-198.46,-16.27,-0.03:99
-chr1 3801228 rs6674160 G A 506.45 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.72;MQ0=0;OQ=1203.93;QD=37.62;SB=-496.15 GT:AD:DP:GL:GQ 1/1:0,32:32:-124.00,-9.65,-0.02:96.29
-chr1 3801965 rs10909822 A C 705.90 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=23;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=42.43;MQ0=0;QD=30.69;SB=-332.99 GT:AD:DP:GL:GQ 1/1:1,22:22:-74.19,-6.63,-0.02:66.14
-chr1 3801968 . T A 440.70 SnpCluster AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=38.89;MQ0=0;QD=11.60;SB=-170.81 GT:AD:DP:GL:GQ 0/1:21,17:32:-56.99,-9.64,-61.90:99
-chr1 3801971 . G T 508.15 SnpCluster AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=35.42;MQ0=0;QD=14.52;SB=-198.56 GT:AD:DP:GL:GQ 0/1:17,18:35:-64.64,-10.54,-61.42:99
-chr1 3801978 . G C 1059.09 Indel;SnpCluster AC=2;AF=1.00;AN=2;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.04;MQ0=0;QD=40.73;SB=-392.21 GT:AD:DP:GL:GQ 1/1:0,26:25:-109.50,-7.53,-0.01:75.25
-chr1 3802009 rs12133786 A C 321.15 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.45;MQ0=0;OQ=1401.55;QD=33.37;SB=-709.03 GT:AD:DP:GL:GQ 1/1:0,42:41:-143.76,-12.35,-0.02:99
-chr1 3802570 rs10797352 T C 148.57 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.68;MQ0=0;OQ=1740.38;QD=32.84;SB=-623.49 GT:AD:DP:GL:GQ 1/1:0,53:51:-177.65,-15.37,-0.03:99
-chr1 3802708 rs10797353 C G 720.59 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2712.05;QD=38.74;SB=-1379.38 GT:AD:DP:GL:GQ 1/1:0,69:70:-279.01,-24.65,-4.23:99
-chr1 3804150 rs10797354 T C 170.50 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.56;MQ0=0;OQ=1825.12;QD=32.59;SB=-712.23 GT:AD:DP:GL:GQ 1/1:0,56:54:-186.12,-16.27,-0.03:99
-chr1 3804602 rs6658198 T C 302.07 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.62;MQ0=0;OQ=2079.20;QD=34.65;SB=-977.94 GT:AD:DP:GL:GQ 1/1:0,60:60:-211.53,-18.07,-0.02:99
-chr1 3806368 rs35131135 T C 13.18 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=58.87;MQ0=0;OQ=1257.30;QD=30.67;SB=-415.16 GT:AD:DP:GL:GQ 1/1:0,40:36:-129.33,-10.85,-0.01:99
-chr1 3806714 rs61770363 G A 10.79 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.71;MQ0=0;OQ=641.87;QD=35.66;SB=-278.65 GT:AD:DP:GL:GQ 1/1:0,18:18:-67.78,-5.43,-0.01:54.17
-chr1 3806753 rs4072725 C T 77.05 PASS AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.52;MQ0=0;OQ=544.23;QD=34.01;SB=-280.66 GT:AD:DP:GL:GQ 1/1:0,16:15:-58.01,-4.52,-0.01:45.14
-chr1 3808604 rs10797355 T C 125.29 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=53.60;MQ0=1;OQ=2350.13;QD=34.56;SB=-914.68 GT:AD:DP:GL:GQ 1/1:0,68:66:-238.63,-19.89,-0.03:99
-chr1 3808731 rs10797356 G A 43.83 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.07;MQ=58.71;MQ0=0;OQ=2012.52;QD=37.27;SB=-776.06 GT:AD:DP:GL:GQ 1/1:0,54:52:-204.86,-15.67,-0.02:99
-chr1 3809184 rs6672335 A G 119.40 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.56;MQ0=0;OQ=1683.69;QD=31.77;SB=-530.84 GT:AD:DP:GL:GQ 1/1:0,53:48:-171.97,-14.46,-0.02:99
-chr1 3809865 rs10909828 G A 654.97 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=2184.41;QD=38.32;SB=-826.35 GT:AD:DP:GL:GQ 1/1:0,57:56:-222.04,-16.87,-0.02:99
-chr1 3809876 rs12139857 G C 137.16 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.22;MQ0=0;OQ=2518.12;QD=42.68;SB=-984.74 GT:AD:DP:GL:GQ 1/1:0,59:58:-255.41,-17.48,-0.02:99
-chr1 3811076 rs6687869 G A 107.90 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.45;MQ0=0;OQ=1628.97;QD=38.79;SB=-568.34 GT:AD:DP:GL:GQ 1/1:0,42:42:-166.50,-12.65,-0.01:99
-chr1 3811194 rs10797357 G A 521.93 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.15;MQ0=0;OQ=1858.19;QD=37.92;SB=-535.68 GT:AD:DP:GL:GQ 1/1:0,49:48:-189.42,-14.46,-0.01:99
-chr1 3812563 rs10909830 C T 206.83 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=58.81;MQ0=0;OQ=2305.91;QD=36.60;SB=-919.31 GT:AD:DP:GL:GQ 1/1:0,63:60:-234.20,-18.08,-0.02:99
-chr1 3812792 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=14.74;MQ=58.39;MQ0=0;OQ=154.04;QD=2.80;SB=80.30 GT:AD:DP:GL:GQ 0/1:43,12:42:-31.36,-12.67,-148.77:99
-chr1 3816486 rs35332894 A G 12.94 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.52;MQ=58.25;MQ0=1;OQ=1726.98;QD=27.41;SB=-682.71 GT:AD:DP:GL:GQ 1/1:0,63:54:-176.33,-16.29,-0.05:99
-chr1 3817341 rs61770379 C T 109.94 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.38;MQ0=0;OQ=1418.14;QD=38.33;SB=-728.97 GT:AD:DP:GL:GQ 1/1:0,37:36:-145.41,-10.84,-0.01:99
-chr1 3819020 rs34825671 C T 409.20 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1564.33;QD=39.11;SB=-750.02 GT:AD:DP:GL:GQ 1/1:0,40:40:-160.03,-12.05,-0.01:99
-chr1 3819278 rs35368826 T C 12.24 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=60.00;MQ0=0;OQ=1199.67;QD=27.90;SB=-424.22 GT:AD:DP:GL:GQ 1/1:0,43:38:-123.59,-11.46,-0.04:99
-chr1 3819474 rs35583447 A G 89.06 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.69;MQ0=0;OQ=1939.06;QD=31.79;SB=-974.91 GT:AD:DP:GL:GQ 1/1:0,61:57:-197.52,-17.18,-0.03:99
-chr1 3819901 rs34284135 A G 55.75 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=1296.25;QD=30.15;SB=-641.91 GT:AD:DP:GL:GQ 1/1:0,43:38:-133.23,-11.45,-0.02:99
-chr1 3820479 rs4073647 C A 185.05 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.55;MQ0=0;OQ=1638.97;QD=32.14;SB=-804.86 GT:AD:DP:GL:GQ 1/1:0,51:47:-167.50,-14.16,-0.02:99
-chr1 3820963 rs35355307 G A 127.74 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.69;MQ0=0;OQ=2262.75;QD=37.09;SB=-711.99 GT:AD:DP:GL:GQ 1/1:0,61:59:-229.89,-17.78,-0.03:99
-chr1 3821092 rs35241263 A G 89.02 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.63;MQ0=0;OQ=1378.97;QD=27.04;SB=-599.21 GT:AD:DP:GL:GQ 1/1:0,51:45:-141.53,-13.58,-0.05:99
-chr1 3821416 rs34803434 G A 80.51 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=58.07;MQ0=0;OQ=1633.32;QD=35.51;SB=-688.34 GT:AD:DP:GL:GQ 1/1:1,45:44:-166.94,-13.26,-0.02:99
-chr1 3823053 rs61770387 C T 609.64 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2714.99;QD=39.35;SB=-1139.68 GT:AD:DP:GL:GQ 1/1:0,69:68:-275.10,-20.48,-0.02:99
-chr1 3823181 rs61770388 T C 199.61 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.19;MQ0=0;OQ=1728.56;QD=33.24;SB=-864.04 GT:AD:DP:GL:GQ 1/1:0,52:50:-176.46,-15.06,-0.02:99
-chr1 3824979 rs61770390 T C 82.45 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=55.31;MQ0=0;OQ=486.55;QD=7.85;SB=-261.22 GT:AD:DP:GL:GQ 0/1:37,25:59:-69.72,-17.78,-147.85:99
-chr1 3824990 . C T 3.46 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=3.66;MQ=55.46;MQ0=0;OQ=1251.91;QD=19.56;SB=-545.38 GT:AD:DP:GL:GQ 0/1:27,37:61:-146.86,-18.39,-82.02:99
-chr1 3825051 . C A 3.22 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=2;HaplotypeScore=3.18;MQ=58.29;MQ0=0;OQ=820.60;QD=11.56;SB=-414.89 GT:AD:DP:GL:GQ 0/1:42,29:71:-106.73,-21.38,-145.16:99
-chr1 3825054 . T C 10.09 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.18;MQ=58.08;MQ0=0;OQ=722.16;QD=10.47;SB=-351.97 GT:AD:DP:GL:GQ 0/1:40,28:65:-95.08,-19.58,-155.89:99
-chr1 3825324 rs61770392 A T 88.32 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=57.20;MQ0=0;OQ=1894.97;QD=35.09;SB=-920.36 GT:AD:DP:GL:GQ 1/1:0,54:51:-193.10,-15.37,-0.02:99
-chr1 3827005 . C T 22.22 LowQual AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=43.17;MQ0=3;QD=1.48;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,3:9:-8.21,-2.71,-24.78:55.03
-chr1 3827011 . C T 25.21 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=2.11;MQ=38.99;MQ0=3;QD=1.80;SB=-10.00 GT:AD:DP:GL:GQ 0/1:12,2:8:-8.21,-2.41,-21.31:58.03
-chr1 3830505 rs35265992 A G 0.12 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=4;HaplotypeScore=5.22;MQ=58.50;MQ0=0;OQ=970.90;QD=17.34;SB=-315.39 GT:AD:DP:GL:GQ 0/1:20,36:52:-116.04,-15.67,-75.68:99
-chr1 3830738 rs35974482 G A 171.95 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=57.87;MQ0=0;OQ=551.40;QD=12.53;SB=-198.84 GT:AD:DP:GL:GQ 0/1:25,19:40:-70.48,-12.05,-78.52:99
-chr1 3830888 rs35314156 G C 209.73 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.07;MQ0=0;OQ=668.40;QD=13.37;SB=-257.46 GT:AD:DP:GL:GQ 0/1:30,20:50:-85.20,-15.08,-125.99:99
-chr1 3831972 rs34835780 T C 632.20 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.64;MQ0=0;OQ=2285.64;QD=35.16;SB=-1132.81 GT:AD:DP:GL:GQ 1/1:0,65:64:-232.17,-19.28,-0.02:99
-chr1 3833915 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=79;Dels=0.00;HRun=0;HaplotypeScore=17.15;MQ=47.19;MQ0=1;OQ=288.77;QD=3.66;SB=-113.05 GT:AD:DP:GL:GQ 0/1:64,15:78:-55.66,-23.49,-226.25:99
-chr1 3895148 . C A 18 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=35.10;MQ0=1;OQ=333.31;QD=9.80;SB=-100.81 GT:AD:DP:GL:GQ 0/1:15,18:23:-43.54,-6.93,-34.49:99
-chr1 3895632 . G A 3.06 PASS AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=4;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=959.16;QD=14.11;SB=-372.32 GT:AD:DP:GL:GQ 0/1:38,30:68:-119.69,-20.49,-137.83:99
-chr1 3895766 rs61770398 T C 202.83 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.65;MQ=59.18;MQ0=0;OQ=960.24;QD=12.98;SB=-389.21 GT:AD:DP:GL:GQ 0/1:40,34:73:-121.30,-21.99,-162.55:99
-chr1 3899769 . C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=8.09;MQ=59.49;MQ0=0;OQ=340.78;QD=7.57;SB=47.18 GT:AD:DP:GL:GQ 0/1:26,19:34:-47.63,-10.27,-85.91:99
-chr1 3902626 rs12073174 A G 196.76 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.14;MQ0=0;OQ=542.74;QD=11.31;SB=-148.64 GT:AD:DP:GL:GQ 0/1:27,21:46:-71.41,-13.85,-105.98:99
-chr1 3902680 rs61770400 C T 70.11 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=59.24;MQ0=0;OQ=954.92;QD=15.65;SB=-346.04 GT:AD:DP:GL:GQ 0/1:29,32:59:-116.56,-17.78,-99.06:99
-chr1 3903888 . C T 983.33 SnpCluster AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.15;MQ0=0;QD=17.88;SB=-501.10 GT:AD:DP:GL:GQ 0/1:24,31:52:-117.28,-15.67,-81.69:99
-chr1 3903897 rs12076404 C T 1044.63 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.20;MQ0=0;QD=18.01;SB=-538.06 GT:AD:DP:GL:GQ 0/1:25,33:54:-124.01,-16.27,-82.66:99
-chr1 3903898 . G A 621.65 SnpCluster AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.17;MQ0=0;QD=11.10;SB=-272.76 GT:AD:DP:GL:GQ 0/1:33,23:52:-81.12,-15.67,-110.15:99
-chr1 3904122 . C T 64.01 PASS AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=58.92;MQ0=0;OQ=1312.00;QD=16.00;SB=-449.98 GT:AD:DP:GL:GQ 0/1:43,39:81:-158.89,-24.40,-148.69:99
-chr1 3904123 rs7518198 G A 275.18 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.77;MQ=58.92;MQ0=0;OQ=1318.95;QD=16.08;SB=-404.76 GT:AD:DP:GL:GQ 0/1:38,44:78:-158.67,-23.50,-132.87:99
-chr1 3904259 rs55651676 C G 11.26 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=58.80;MQ0=0;OQ=719.49;QD=18.45;SB=-354.47 GT:AD:DP:GL:GQ 0/1:17,22:35:-85.79,-10.56,-59.36:99
-chr1 3904673 rs56300127 T C 189.23 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.07;MQ0=0;OQ=384.21;QD=11.30;SB=-194.60 GT:AD:DP:GL:GQ 0/1:17,17:31:-51.05,-9.34,-58.99:99
-chr1 3905021 rs10915614 A G 3.58 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=4;HaplotypeScore=1.21;MQ=59.48;MQ0=0;OQ=428.89;QD=9.75;SB=-152.44 GT:AD:DP:GL:GQ 0/1:24,19:41:-58.53,-12.36,-93.35:99
-chr1 3905038 . G A 50.50 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.41;MQ0=0;OQ=477.39;QD=12.24;SB=-188.87 GT:AD:DP:GL:GQ 0/1:22,17:37:-62.18,-11.16,-67.50:99
-chr1 3905246 . C T 93.17 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=58.57;MQ0=0;OQ=1011.86;QD=16.32;SB=-440.98 GT:AD:DP:GL:GQ 0/1:30,32:58:-121.96,-17.49,-85.78:99
-chr1 3905920 rs7548668 T C 26.57 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=6.64;MQ=59.57;MQ0=0;OQ=666.76;QD=12.35;SB=-179.62 GT:AD:DP:GL:GQ 0/1:27,27:46:-83.82,-13.86,-87.80:99
-chr1 3906227 rs9793287 T C 337.13 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.61;MQ0=0;OQ=444.12;QD=9.25;SB=-215.36 GT:AD:DP:GL:GQ 0/1:27,21:46:-61.57,-13.87,-101.57:99
-chr1 3906248 rs12562706 C A 152.11 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=59.59;MQ0=0;OQ=415.45;QD=9.23;SB=-231.91 GT:AD:DP:GL:GQ 0/1:25,20:41:-57.18,-12.35,-86.80:99
-chr1 3906531 rs7526903 G A 280.93 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=909.30;QD=17.83;SB=-442.97 GT:AD:DP:GL:GQ 0/1:23,27:47:-108.38,-14.16,-65.40:99
-chr1 3906648 rs7551771 C T 37.89 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=60.06;MQ0=0;OQ=776.93;QD=15.54;SB=-354.36 GT:AD:DP:GL:GQ 0/1:26,24:48:-95.43,-14.46,-92.96:99
-chr1 3906868 rs7519349 A G 578.45 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=764.11;QD=13.64;SB=-362.95 GT:AD:DP:GL:GQ 0/1:26,30:56:-96.58,-16.88,-105.57:99
-chr1 3906970 rs7519458 A G 232.59 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.80;MQ=60.00;MQ0=0;OQ=762.22;QD=13.14;SB=-199.60 GT:AD:DP:GL:GQ 0/1:26,31:57:-96.69,-17.19,-106.25:99
-chr1 3907888 rs10799162 T C 190.81 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=58.79;MQ0=0;OQ=719.58;QD=13.33;SB=-230.44 GT:AD:DP:GL:GQ 0/1:27,27:53:-91.22,-15.97,-102.46:99
-chr1 3907889 rs10799163 G T 86.43 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=58.79;MQ0=0;OQ=758.50;QD=14.05;SB=-193.54 GT:AD:DP:GL:GQ 0/1:27,26:51:-94.50,-15.37,-86.70:99
-chr1 3907912 rs10915345 G A 203.29 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=59.62;MQ0=0;OQ=1037.45;QD=17.01;SB=-258.26 GT:AD:DP:GL:GQ 0/1:29,32:57:-124.21,-17.18,-83.11:99
-chr1 3909896 rs6683165 G A 201.77 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=59.62;MQ0=0;OQ=837.44;QD=12.88;SB=-252.13 GT:AD:DP:GL:GQ 0/1:38,27:62:-105.71,-18.68,-120.77:99
-chr1 3910104 rs10799194 C T 90.26 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.69;MQ=60.00;MQ0=0;OQ=794.06;QD=13.23;SB=-418.44 GT:AD:DP:GL:GQ 0/1:34,26:57:-99.88,-17.19,-98.75:99
-chr1 3919557 rs9426474 A G 111.97 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.97;MQ0=0;OQ=1753.83;QD=29.73;SB=-828.62 GT:AD:DP:GL:GQ 1/1:0,59:55:-179.01,-16.59,-0.05:99
-chr1 3922104 rs9426475 T C 209.50 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=54.82;MQ0=0;OQ=1570.14;QD=28.55;SB=-720.64 GT:AD:DP:GL:GQ 1/1:0,55:50:-160.65,-15.09,-0.06:99
-chr1 3922325 rs10915469 T C 562.16 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1863.57;QD=28.24;SB=-798.65 GT:AD:DP:GL:GQ 1/1:0,66:58:-189.99,-17.49,-0.05:99
-chr1 3922572 rs7540846 C T 41.15 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.57;MQ=53.34;MQ0=0;OQ=2905.34;QD=34.59;SB=-1359.03 GT:AD:DP:GL:GQ 1/1:0,81:75:-294.15,-22.60,-0.03:99
-chr1 3922839 rs7516192 G C 540.09 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=2588.44;QD=42.43;SB=-1244.89 GT:AD:DP:GL:GQ 1/1:0,61:60:-262.44,-18.08,-0.02:99
-chr1 3922855 rs9426476 A G 185.57 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.74;MQ=58.63;MQ0=0;OQ=2064.09;QD=34.40;SB=-842.35 GT:AD:DP:GL:GQ 1/1:0,60:58:-210.01,-17.47,-0.02:99
-chr1 3922974 rs7541241 C A 552.27 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=1520.98;QD=33.80;SB=-673.30 GT:AD:DP:GL:GQ 1/1:0,45:44:-155.71,-13.26,-0.03:99
-chr1 3923246 rs9426498 T C 9.78 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=52.33;MQ0=0;OQ=1450.84;QD=25.91;SB=-720.70 GT:AD:DP:GL:GQ 1/1:0,56:46:-148.71,-13.88,-0.05:99
-chr1 3923458 rs9426499 A C 507.51 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1349.47;QD=30.67;SB=-364.89 GT:AD:DP:GL:GQ 1/1:0,44:42:-138.57,-12.66,-0.04:99
-chr1 3923596 rs9426477 A G 619.10 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2188.14;QD=34.73;SB=-945.36 GT:AD:DP:GL:GQ 1/1:0,63:61:-222.42,-18.37,-0.02:99
-chr1 3923941 rs6698811 T C 664.67 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2773.83;QD=33.83;SB=-1404.50 GT:AD:DP:GL:GQ 1/1:0,82:80:-281.00,-24.10,-0.03:99
-chr1 3936055 rs10753378 T C 376.82 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.51;MQ0=0;OQ=543.43;QD=11.56;SB=-218.27 GT:AD:DP:GL:GQ 0/1:23,24:45:-71.19,-13.57,-90.09:99
-chr1 3938219 . C T 61.19 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.45;MQ=59.60;MQ0=0;OQ=740.10;QD=12.76;SB=-319.83 GT:AD:DP:GL:GQ 0/1:30,28:53:-93.28,-15.99,-88.25:99
-chr1 3940015 rs4654525 C T 311.29 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.10;MQ0=0;OQ=1004.75;QD=15.00;SB=-479.00 GT:AD:DP:GL:GQ 0/1:36,31:66:-123.64,-19.88,-133.78:99
-chr1 3942839 rs60972376 A C 11.72 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=4.30;MQ=58.67;MQ0=0;OQ=585.81;QD=11.96;SB=-197.90 GT:AD:DP:GL:GQ 0/1:20,28:43:-74.82,-12.96,-73.58:99
-chr1 3942909 rs55887893 C T 197.25 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=60.00;MQ0=0;OQ=588.30;QD=11.77;SB=-314.85 GT:AD:DP:GL:GQ 0/1:29,21:47:-76.28,-14.17,-92.23:99
-chr1 3944651 rs59118111 G C 246.41 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=60.00;MQ0=0;OQ=1068.67;QD=16.44;SB=-449.44 GT:AD:DP:GL:GQ 0/1:32,33:64:-129.45,-19.30,-140.55:99
-chr1 3945187 rs4654538 G A 29.36 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.53;MQ=58.81;MQ0=0;OQ=1094.72;QD=19.90;SB=-430.80 GT:AD:DP:GL:GQ 0/1:23,32:55:-129.32,-16.57,-83.23:99
-chr1 3947137 rs4654543 T C 110.66 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=382.96;QD=9.82;SB=-135.53 GT:AD:DP:GL:GQ 0/1:21,18:38:-53.04,-11.46,-84.39:99
-chr1 3947479 rs10449244 C A 197.72 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=60.00;MQ0=0;OQ=744.81;QD=13.07;SB=-230.89 GT:AD:DP:GL:GQ 0/1:29,28:53:-93.73,-15.97,-94.52:99
-chr1 3948534 rs4654544 A G 534.93 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=551.19;QD=12.53;SB=-251.96 GT:AD:DP:GL:GQ 0/1:21,23:44:-71.67,-13.27,-84.12:99
-chr1 3949636 rs4654436 T C 195.22 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=59.16;MQ0=0;OQ=834.97;QD=11.60;SB=-298.88 GT:AD:DP:GL:GQ 0/1:38,34:66:-106.67,-19.89,-140.32:99
-chr1 3949646 rs6426416 A T 32.24 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=2.47;MQ=59.20;MQ0=0;OQ=1168.58;QD=15.38;SB=-401.17 GT:AD:DP:GL:GQ 0/1:38,38:72:-141.84,-21.70,-126.75:99
-chr1 3950380 . A G 266.35 PASS AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1356.42;QD=15.96;SB=-652.62 GT:AD:DP:GL:GQ 0/1:40,45:85:-164.53,-25.60,-164.89:99
-chr1 3950813 rs10737411 A G 175.98 PASS AC=1;AF=0.50;AN=2;DB;DP=108;Dels=0.00;HRun=1;HaplotypeScore=2.09;MQ=59.83;MQ0=0;OQ=1386.28;QD=12.84;SB=-502.53 GT:AD:DP:GL:GQ 0/1:55,53:107:-174.15,-32.24,-226.13:99
-chr1 3951883 rs6657331 G C 1.76 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=59.14;MQ0=0;OQ=976.24;QD=22.70;SB=-437.36 GT:AD:DP:GL:GQ 0/1:16,27:40:-112.97,-12.06,-59.28:99
-chr1 3951915 rs12145443 C T 0.21 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=58.72;MQ0=0;OQ=829.82;QD=21.84;SB=-313.85 GT:AD:DP:GL:GQ 0/1:13,25:37:-97.41,-11.15,-45.43:99
-chr1 3952816 rs10799236 A G 574.49 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=747.27;QD=14.10;SB=-330.89 GT:AD:DP:GL:GQ 0/1:27,26:52:-93.67,-15.66,-106.05:99
-chr1 3953295 rs12038964 T C 361.41 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.86;MQ0=0;OQ=750.82;QD=12.31;SB=-348.04 GT:AD:DP:GL:GQ 0/1:30,31:60:-96.45,-18.08,-120.40:99
-chr1 3953370 rs12040628 A G 147.24 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=59.55;MQ0=0;OQ=749.75;QD=14.70;SB=-277.27 GT:AD:DP:GL:GQ 0/1:21,30:49:-93.03,-14.77,-83.59:99
-chr1 3954832 rs9426500 A C 437.18 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=970.97;QD=16.46;SB=-363.09 GT:AD:DP:GL:GQ 0/1:25,34:59:-118.15,-17.77,-92.14:99
-chr1 3955140 rs7413013 G C 5.69 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=59.17;MQ0=0;OQ=1282.99;QD=22.91;SB=-362.10 GT:AD:DP:GL:GQ 0/1:21,35:56:-148.46,-16.87,-92.34:99
-chr1 3955487 rs9426501 T C 61.29 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=4.29;MQ=58.95;MQ0=0;OQ=1025.38;QD=16.54;SB=-268.62 GT:AD:DP:GL:GQ 0/1:26,36:60:-123.90,-18.08,-97.56:99
-chr1 3956324 rs28609919 G C 274.82 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.69;MQ0=0;OQ=890.13;QD=14.84;SB=-464.74 GT:AD:DP:GL:GQ 0/1:33,27:59:-110.08,-17.78,-139.21:99
-chr1 3957249 rs12756251 G A 25.08 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=3.32;MQ=59.14;MQ0=0;OQ=1510.62;QD=18.65;SB=-581.41 GT:AD:DP:GL:GQ 0/1:36,45:78:-177.84,-23.50,-121.43:99
-chr1 3957262 rs12733769 T A 184.98 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.13;MQ0=0;OQ=1410.63;QD=17.63;SB=-590.40 GT:AD:DP:GL:GQ 0/1:34,46:77:-167.55,-23.20,-118.80:99
-chr1 3957348 rs12135298 A G 336.09 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.25;MQ0=0;OQ=781.36;QD=12.21;SB=-403.89 GT:AD:DP:GL:GQ 0/1:34,30:63:-100.41,-18.99,-132.61:99
-chr1 3959579 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=7.87;MQ=33.13;MQ0=5;OQ=83.58;QD=1.58;SB=-67.89 GT:AD:DP:GL:GQ 0/1:44,9:38:-23.11,-11.47,-97.21:99
-chr1 3959589 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=8.30;MQ=33.13;MQ0=5;OQ=210.60;QD=3.76;SB=-42.01 GT:AD:DP:GL:GQ 0/1:42,14:42:-37.00,-12.66,-114.99:99
-chr1 3959610 rs4654559 T C 0.08 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=19.50;MQ=38.33;MQ0=4;OQ=745.10;QD=13.55;SB=-325.28 GT:AD:DP:GL:GQ 0/1:20,35:43:-90.76,-12.97,-56.11:99
-chr1 3959618 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=35.45;MQ=40.78;MQ0=4;OQ=377.28;QD=6.50;SB=-163.72 GT:AD:DP:GL:GQ 0/1:35,17:42:-66.15,-25.14,-90.45:99
-chr1 3959638 rs12137425 A G 6.15 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=49.20;MQ0=1;OQ=205.57;QD=4.28;SB=-109.83 GT:AD:DP:GL:GQ 0/1:33,15:40:-35.90,-12.06,-107.08:99
-chr1 3959766 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=1;HaplotypeScore=11.71;MQ=40.06;MQ0=2;OQ=205.60;QD=3.54;SB=-53.76 GT:AD:DP:GL:GQ 0/1:44,14:49:-38.61,-14.76,-139.54:99
-chr1 3959787 rs11807610 T C 0.34 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=13.45;MQ=43.41;MQ0=2;OQ=585.11;QD=10.45;SB=-259.35 GT:AD:DP:GL:GQ 0/1:22,34:43:-74.76,-12.96,-79.59:99
-chr1 3959815 rs10915563 A G 47.44 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=13.21;MQ=50.51;MQ0=1;QD=0.72;SB=62.23 GT:AD:DP:GL:GQ 0/1:56,10:52:-23.70,-15.67,-173.58:80.28
-chr1 3959825 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=18.02;MQ=51.36;MQ0=1;OQ=581.75;QD=8.19;SB=-258.36 GT:AD:DP:GL:GQ 0/1:43,28:61:-79.84,-18.38,-149.14:99
-chr1 3959826 . A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=1;HaplotypeScore=9.14;MQ=50.86;MQ0=1;OQ=291.12;QD=3.93;SB=-139.48 GT:AD:DP:GL:GQ 0/1:51,23:56:-49.27,-16.88,-163.75:99
-chr1 3959854 rs10799245 C A 521.83 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.17;MQ0=0;OQ=879.17;QD=14.65;SB=-268.32 GT:AD:DP:GL:GQ 0/1:29,31:55:-107.78,-16.58,-78.49:99
-chr1 3961215 rs6670453 G C 331.68 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=59.13;MQ0=0;OQ=833.59;QD=15.73;SB=-292.89 GT:AD:DP:GL:GQ 0/1:29,24:53:-102.62,-15.98,-127.58:99
-chr1 3961230 rs6672877 G T 118.38 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=59.07;MQ0=0;OQ=633.10;QD=12.66;SB=-213.34 GT:AD:DP:GL:GQ 0/1:27,23:49:-81.35,-14.76,-89.22:99
-chr1 3961237 rs12045715 G A 510.42 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=793.63;QD=15.56;SB=-285.83 GT:AD:DP:GL:GQ 0/1:26,25:51:-98.03,-15.38,-79.59:99
-chr1 3961468 rs12045781 G A 286.99 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=60.00;MQ0=0;OQ=606.20;QD=13.78;SB=-238.18 GT:AD:DP:GL:GQ 0/1:24,20:42:-76.57,-12.66,-72.65:99
-chr1 3961548 rs10799247 A G 169.43 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=58.33;MQ0=0;OQ=674.03;QD=12.04;SB=-151.92 GT:AD:DP:GL:GQ 0/1:31,24:52:-86.36,-15.67,-108.75:99
-chr1 3962010 rs4654565 G A 105.50 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=336.97;QD=12.96;SB=-103.61 GT:AD:DP:GL:GQ 0/1:14,12:25:-44.52,-7.54,-43.04:99
-chr1 3962589 rs4654447 A G 258.32 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.65;MQ0=0;OQ=712.70;QD=13.45;SB=-356.22 GT:AD:DP:GL:GQ 0/1:26,27:50:-89.62,-15.07,-95.62:99
-chr1 3962703 rs4654448 A C 265.60 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=756.85;QD=13.52;SB=-251.86 GT:AD:DP:GL:GQ 0/1:29,27:55:-95.53,-16.56,-103.20:99
-chr1 3962856 rs4654567 T C 95.03 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=59.17;MQ0=0;OQ=415.90;QD=9.24;SB=-159.46 GT:AD:DP:GL:GQ 0/1:25,20:42:-57.53,-12.66,-94.60:99
-chr1 3962899 rs4654449 G A 419.09 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=60.00;MQ0=0;OQ=648.86;QD=14.75;SB=-335.88 GT:AD:DP:GL:GQ 0/1:22,22:42:-80.82,-12.65,-78.42:99
-chr1 3963307 rs7520607 T C 230.94 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=3.28;MQ=58.42;MQ0=0;OQ=845.59;QD=14.58;SB=-424.34 GT:AD:DP:GL:GQ 0/1:26,32:53:-103.81,-15.97,-95.34:99
-chr1 3963607 rs4654568 T G 463.03 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.07;MQ0=0;OQ=931.94;QD=16.64;SB=-413.80 GT:AD:DP:GL:GQ 0/1:24,32:56:-113.34,-16.87,-88.78:99
-chr1 3963626 rs12027462 C T 248.09 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=57.57;MQ0=0;OQ=963.52;QD=17.21;SB=-429.93 GT:AD:DP:GL:GQ 0/1:26,30:55:-116.20,-16.57,-93.29:99
-chr1 3963784 rs4654451 G A 171.09 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.79;MQ0=0;OQ=912.02;QD=16.00;SB=-225.51 GT:AD:DP:GL:GQ 0/1:28,28:53:-110.46,-15.98,-78.09:99
-chr1 3964643 rs6426429 A G 60.66 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=1.27;MQ=59.56;MQ0=0;OQ=582.81;QD=11.00;SB=-285.59 GT:AD:DP:GL:GQ 0/1:28,25:51:-76.94,-15.38,-106.26:99
-chr1 3965132 rs4074993 C G 325.61 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.87;MQ=59.28;MQ0=0;OQ=814.87;QD=14.05;SB=-345.07 GT:AD:DP:GL:GQ 0/1:34,24:55:-101.37,-16.60,-121.74:99
-chr1 3965479 rs4074994 T C 268.09 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=52.28;MQ0=0;OQ=617.78;QD=12.36;SB=-300.36 GT:AD:DP:GL:GQ 0/1:25,25:49:-79.83,-14.77,-98.86:99
-chr1 3965536 rs57323923 T C 0.88 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=4;HaplotypeScore=2.11;MQ=50.55;MQ0=0;OQ=424.15;QD=8.48;SB=-173.38 GT:AD:DP:GL:GQ 0/1:29,21:47:-59.86,-14.17,-115.12:99
-chr1 3965975 . C G 7.70 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=58.67;MQ0=0;OQ=589.92;QD=12.04;SB=-25.38 GT:AD:DP:GL:GQ 0/1:32,17:46:-76.14,-13.87,-119.93:99
-chr1 3965977 . T C 0.69 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=2;HaplotypeScore=1.11;MQ=58.22;MQ0=0;OQ=427.57;QD=8.55;SB=-16.87 GT:AD:DP:GL:GQ 0/1:33,17:49:-60.80,-14.76,-127.29:99
-chr1 3966027 rs7414863 A C 144.45 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.13;MQ0=0;OQ=452.26;QD=9.42;SB=-62.85 GT:AD:DP:GL:GQ 0/1:27,21:45:-62.07,-13.56,-92.65:99
-chr1 3966540 rs3935559 C G 391.87 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=1031.71;QD=18.42;SB=-312.99 GT:AD:DP:GL:GQ 0/1:24,32:56:-123.36,-16.90,-103.47:99
-chr1 3966816 . G A 1.68 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=5.13;MQ=57.97;MQ0=0;OQ=1415.89;QD=20.52;SB=-484.12 GT:AD:DP:GL:GQ 0/1:24,45:61:-163.26,-18.38,-64.39:99
-chr1 3967294 rs12747294 C T 4.07 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=8.87;MQ=56.15;MQ0=1;OQ=813.80;QD=16.95;SB=-391.14 GT:AD:DP:GL:GQ 0/1:22,26:45:-98.22,-13.56,-71.93:99
-chr1 3967372 rs6702213 C T 194.14 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=34.49;MQ0=0;OQ=718.26;QD=12.17;SB=-239.54 GT:AD:DP:GL:GQ 0/1:33,26:54:-91.39,-16.28,-98.59:99
-chr1 3967404 rs6661264 T C 167.37 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=40.81;MQ0=0;OQ=475.36;QD=8.80;SB=-244.91 GT:AD:DP:GL:GQ 0/1:34,20:52:-66.49,-15.67,-131.05:99
-chr1 3967405 rs6675434 G A 377.49 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.63;MQ0=0;OQ=533.67;QD=9.70;SB=-290.77 GT:AD:DP:GL:GQ 0/1:34,21:52:-72.31,-15.66,-122.28:99
-chr1 3967434 rs12747604 C T 38.96 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=46.12;MQ0=0;OQ=331.44;QD=7.71;SB=-108.07 GT:AD:DP:GL:GQ 0/1:29,14:41:-48.79,-12.36,-91.55:99
-chr1 3967444 rs56081307 C A 64.62 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=45.65;MQ0=0;OQ=391.03;QD=8.32;SB=-188.48 GT:AD:DP:GL:GQ 0/1:31,16:44:-55.64,-13.25,-103.38:99
-chr1 3967458 rs6661363 T C 158.21 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=46.22;MQ0=0;OQ=383.22;QD=7.82;SB=-172.51 GT:AD:DP:GL:GQ 0/1:29,19:44:-54.87,-13.26,-104.62:99
-chr1 3967912 rs6675979 G A 278.83 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.51;MQ=58.64;MQ0=0;OQ=1206.49;QD=19.46;SB=-623.12 GT:AD:DP:GL:GQ 0/1:25,37:60:-142.02,-18.08,-76.63:99
-chr1 3968006 rs12731145 A G 28.60 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=5.76;MQ=59.49;MQ0=0;OQ=439.53;QD=9.77;SB=-228.43 GT:AD:DP:GL:GQ 0/1:27,18:43:-60.19,-12.95,-105.51:99
-chr1 3968073 rs6426431 G A 223.15 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=59.56;MQ0=0;OQ=482.88;QD=9.29;SB=-221.45 GT:AD:DP:GL:GQ 0/1:34,18:50:-66.64,-15.07,-119.13:99
-chr1 3968105 rs12744667 G A 365.59 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.56;MQ0=0;OQ=827.90;QD=15.62;SB=-433.93 GT:AD:DP:GL:GQ 0/1:27,26:51:-101.44,-15.36,-92.63:99
-chr1 3968106 rs55866108 A G 217.98 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=59.57;MQ0=0;OQ=738.88;QD=13.68;SB=-284.42 GT:AD:DP:GL:GQ 0/1:27,27:53:-93.14,-15.96,-108.96:99
-chr1 3968537 rs12753281 C G 269.93 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.90;MQ0=0;OQ=1244.08;QD=14.99;SB=-559.96 GT:AD:DP:GL:GQ 0/1:45,38:83:-152.72,-25.03,-193.42:99
-chr1 3968581 rs12736036 A G 78.01 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.15;MQ=57.56;MQ0=0;OQ=949.82;QD=11.58;SB=-430.05 GT:AD:DP:GL:GQ 0/1:44,38:77:-121.46,-23.19,-177.75:99
-chr1 3968726 rs34940664 G T 190.81 PASS AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.33;MQ0=0;OQ=1575.63;QD=16.24;SB=-709.50 GT:AD:DP:GL:GQ 0/1:45,52:96:-189.76,-28.91,-164.22:99
-chr1 3968753 rs35749996 A G 455.09 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1487.59;QD=17.92;SB=-656.99 GT:AD:DP:GL:GQ 0/1:35,48:83:-177.04,-25.00,-145.40:99
-chr1 3968768 rs12753644 C G 340.70 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=1876.77;QD=20.85;SB=-779.42 GT:AD:DP:GL:GQ 0/1:40,50:90:-218.08,-27.12,-169.27:99
-chr1 3968858 rs12045134 A C 23.52 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=5.51;MQ=58.42;MQ0=0;OQ=708.96;QD=8.54;SB=-321.59 GT:AD:DP:GL:GQ 0/1:52,31:81:-98.58,-24.40,-189.89:99
-chr1 3968949 rs12047590 G T 243.75 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.74;MQ0=0;OQ=980.09;QD=13.61;SB=-395.21 GT:AD:DP:GL:GQ 0/1:39,33:71:-122.68,-21.39,-124.97:99
-chr1 3969008 rs12027284 C T 226.70 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.68;MQ0=0;OQ=1351.13;QD=18.77;SB=-463.00 GT:AD:DP:GL:GQ 0/1:32,40:69:-159.19,-20.80,-95.94:99
-chr1 3969221 rs12045225 A G 0.63 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=9.56;MQ=58.22;MQ0=0;OQ=654.37;QD=13.09;SB=-95.63 GT:AD:DP:GL:GQ 0/1:21,29:44:-81.99,-13.27,-67.60:99
-chr1 3969391 rs12046014 A G 106.22 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.88;MQ=58.95;MQ0=0;OQ=580.96;QD=9.37;SB=-244.16 GT:AD:DP:GL:GQ 0/1:36,26:57:-78.56,-17.18,-134.21:99
-chr1 3969440 rs12044268 T C 521.33 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=58.87;MQ0=0;QD=12.72;SB=-263.94 GT:AD:DP:GL:GQ 0/1:19,21:40:-67.48,-12.06,-76.36:99
-chr1 3969444 rs12048464 G T 535.50 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.71;MQ0=0;QD=14.88;SB=-256.96 GT:AD:DP:GL:GQ 0/1:18,18:36:-67.68,-10.85,-54.15:99
-chr1 3969450 rs34283588 G A 563.46 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.55;MQ0=0;QD=17.61;SB=-257.77 GT:AD:DP:GL:GQ 0/1:15,17:30:-68.67,-9.04,-41.92:99
-chr1 3969504 rs12028147 C A 128.14 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.50;MQ0=0;OQ=1173.33;QD=18.92;SB=-401.82 GT:AD:DP:GL:GQ 0/1:25,37:62:-139.29,-18.67,-88.93:99
-chr1 3969731 rs35514116 C A 193.09 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=2.36;MQ=59.11;MQ0=0;OQ=1169.40;QD=14.99;SB=-425.64 GT:AD:DP:GL:GQ 0/1:38,39:78:-146.50,-26.28,-138.29:99
-chr1 3969738 rs35902612 G T 87.34 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.60;MQ=59.14;MQ0=0;OQ=1314.22;QD=16.22;SB=-492.89 GT:AD:DP:GL:GQ 0/1:38,43:80:-158.80,-24.09,-135.14:99
-chr1 3969835 rs34306433 G C 322.67 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=60.00;MQ0=0;OQ=1225.99;QD=18.03;SB=-578.33 GT:AD:DP:GL:GQ 0/1:31,36:68:-148.71,-22.83,-138.52:99
-chr1 3970192 rs34458454 T C 115.71 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=60.00;MQ0=0;OQ=393.81;QD=8.04;SB=-222.38 GT:AD:DP:GL:GQ 0/1:28,21:43:-55.63,-12.97,-98.60:99
-chr1 3970255 rs34994381 G A 356.92 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1045.77;QD=16.09;SB=-475.47 GT:AD:DP:GL:GQ 0/1:34,31:61:-126.25,-18.39,-98.09:99
-chr1 3970431 rs35579324 A T 318.12 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.56;MQ0=0;OQ=768.67;QD=14.78;SB=-345.07 GT:AD:DP:GL:GQ 0/1:26,26:52:-95.82,-15.67,-98.48:99
-chr1 3970448 rs35474759 C T 457.86 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=955.78;QD=18.03;SB=-501.52 GT:AD:DP:GL:GQ 0/1:25,28:52:-114.52,-15.66,-86.38:99
-chr1 3970842 rs12049555 G A 157.06 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=59.39;MQ0=0;OQ=384.99;QD=10.13;SB=-163.62 GT:AD:DP:GL:GQ 0/1:23,15:35:-52.33,-10.55,-71.59:99
-chr1 3970912 rs6664533 C T 146.77 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=3.51;MQ=58.67;MQ0=0;OQ=505.76;QD=14.45;SB=-247.75 GT:AD:DP:GL:GQ 0/1:19,16:34:-64.11,-10.25,-57.21:99
-chr1 3971010 rs6664655 C G 360.39 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=59.06;MQ0=0;OQ=1105.77;QD=14.94;SB=-455.72 GT:AD:DP:GL:GQ 0/1:42,32:74:-136.16,-22.30,-181.19:99
-chr1 3971024 rs6686502 G A 241.40 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=59.09;MQ0=0;OQ=1058.60;QD=13.93;SB=-346.09 GT:AD:DP:GL:GQ 0/1:42,34:75:-131.76,-22.62,-128.76:99
-chr1 3971052 rs6672264 T C 278.60 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.20;MQ0=0;OQ=887.02;QD=10.95;SB=-268.12 GT:AD:DP:GL:GQ 0/1:49,32:80:-116.09,-24.10,-192.61:99
-chr1 3971195 rs6686709 G C 441.55 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=533.40;QD=11.85;SB=-281.29 GT:AD:DP:GL:GQ 0/1:29,16:42:-69.28,-12.66,-112.85:99
-chr1 3971259 rs6680847 A G 343.35 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=805.68;QD=13.21;SB=-291.63 GT:AD:DP:GL:GQ 0/1:33,28:60:-101.92,-18.07,-129.04:99
-chr1 3971430 rs6675053 T C 59.44 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=57.14;MQ0=0;OQ=478.62;QD=6.74;SB=-133.24 GT:AD:DP:GL:GQ 0/1:48,23:70:-72.24,-21.10,-194.61:99
-chr1 3971753 . C A 69.39 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=12;HaplotypeScore=26.59;MQ=52.60;MQ0=0;QD=1.16;SB=62.22 GT:AD:DP:GL:GQ 0/1:50,10:49:-24.98,-14.76,-146.09:99
-chr1 3971766 rs12030209 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=12;HaplotypeScore=17.56;MQ=52.68;MQ0=0;OQ=817.96;QD=12.39;SB=-315.05 GT:AD:DP:GL:GQ 0/1:32,34:60:-103.15,-18.07,-109.51:99
-chr1 3972069 rs55798869 G T 4.80 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=5.71;MQ=56.04;MQ0=0;OQ=802.09;QD=13.37;SB=-418.83 GT:AD:DP:GL:GQ 0/1:32,28:52:-99.17,-15.67,-74.15:99
-chr1 3972136 rs55745368 T C 189.98 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.03;MQ0=0;OQ=1099.26;QD=12.08;SB=-445.57 GT:AD:DP:GL:GQ 0/1:52,39:91:-140.63,-27.42,-210.68:99
-chr1 3972189 rs7414301 T C 60.16 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=5.42;MQ=59.51;MQ0=0;OQ=1011.76;QD=11.76;SB=-466.68 GT:AD:DP:GL:GQ 0/1:46,40:86:-130.38,-25.92,-186.30:99
-chr1 3972623 . A C 192.74 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.77;MQ0=0;OQ=1230.69;QD=15.38;SB=-527.79 GT:AD:DP:GL:GQ 0/1:36,44:79:-150.15,-23.80,-134.39:99
-chr1 3972753 rs10915589 G A 130.98 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.30;MQ0=0;OQ=1165.16;QD=17.65;SB=-331.36 GT:AD:DP:GL:GQ 0/1:30,36:63:-138.78,-18.98,-103.29:99
-chr1 3972924 rs12023372 G C 321.94 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1325.91;QD=18.94;SB=-613.61 GT:AD:DP:GL:GQ 0/1:33,37:69:-156.66,-20.79,-145.10:99
-chr1 3973210 rs12023479 G A 281.53 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.70;MQ0=0;OQ=1046.55;QD=13.59;SB=-512.32 GT:AD:DP:GL:GQ 0/1:44,33:77:-131.15,-23.21,-144.02:99
-chr1 3973292 . A G 33.55 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=55.10;MQ0=0;OQ=633.05;QD=11.94;SB=-175.56 GT:AD:DP:GL:GQ 0/1:28,25:47:-80.75,-14.16,-95.41:99
-chr1 3973506 . G A 176.17 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.46;MQ0=0;OQ=876.83;QD=12.71;SB=-380.14 GT:AD:DP:GL:GQ 0/1:42,27:67:-111.16,-20.19,-131.21:99
-chr1 3973875 rs4654459 T A 52.35 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=58.55;MQ0=0;OQ=1176.09;QD=14.70;SB=-563.67 GT:AD:DP:GL:GQ 0/1:41,39:78:-144.39,-23.49,-149.95:99
-chr1 3973955 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=17;HaplotypeScore=22.03;MQ=54.06;MQ0=0;OQ=55.47;QD=1.03;SB=65.23 GT:AD:DP:GL:GQ 0/1:43,10:44:-22.08,-13.25,-133.74:88.31
-chr1 3974003 . A G 105.47 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.51;MQ0=0;OQ=461.72;QD=11.26;SB=-234.29 GT:AD:DP:GL:GQ 0/1:22,19:40:-61.51,-12.06,-83.11:99
-chr1 3974203 . T G 66.57 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.62;MQ0=0;OQ=954.85;QD=13.84;SB=-428.75 GT:AD:DP:GL:GQ 0/1:35,34:68:-119.25,-20.48,-128.89:99
-chr1 3974239 rs35998568 G A 463.07 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.48;MQ0=0;OQ=1184.56;QD=17.95;SB=-510.14 GT:AD:DP:GL:GQ 0/1:31,35:66:-141.63,-19.89,-102.39:99
-chr1 3974376 rs57696600 C T 6.14 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=4;HaplotypeScore=1.87;MQ=59.16;MQ0=0;OQ=1418.07;QD=19.70;SB=-722.06 GT:AD:DP:GL:GQ 0/1:30,42:71:-166.49,-21.40,-92.47:99
-chr1 3974614 rs4457544 A T 403.15 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=1649.20;QD=19.18;SB=-732.91 GT:AD:DP:GL:GQ 0/1:34,52:86:-194.11,-25.90,-133.63:99
-chr1 3974846 rs12025374 G A 466.59 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.31;MQ0=0;OQ=1051.59;QD=16.43;SB=-403.40 GT:AD:DP:GL:GQ 0/1:31,33:63:-127.44,-18.99,-100.16:99
-chr1 3975091 rs12049502 T C 199.42 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=58.55;MQ0=0;OQ=805.28;QD=16.78;SB=-288.47 GT:AD:DP:GL:GQ 0/1:19,29:47:-97.97,-14.16,-75.75:99
-chr1 3975721 rs34928897 A G 109.87 PASS AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=59.19;MQ0=1;OQ=1038.58;QD=10.93;SB=-532.63 GT:AD:DP:GL:GQ 0/1:53,42:94:-135.47,-28.33,-210.33:99
-chr1 3975829 rs12060834 A C 406.62 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1062.88;QD=14.56;SB=-251.81 GT:AD:DP:GL:GQ 0/1:37,36:73:-131.56,-21.98,-139.84:99
-chr1 3975904 rs12026411 G T 347.07 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=57.00;MQ0=0;OQ=1228.86;QD=14.99;SB=-454.51 GT:AD:DP:GL:GQ 0/1:42,40:82:-150.86,-24.69,-151.44:99
-chr1 3976117 rs12034312 C T 244.48 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=60.00;MQ0=0;OQ=1562.01;QD=18.38;SB=-442.95 GT:AD:DP:GL:GQ 0/1:40,45:84:-184.80,-25.32,-123.96:99
-chr1 3976389 rs35297022 T C 334.71 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=962.55;QD=13.95;SB=-357.60 GT:AD:DP:GL:GQ 0/1:35,34:68:-120.03,-20.49,-141.31:99
-chr1 3976394 rs35043594 A T 325.11 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=916.45;QD=13.68;SB=-308.03 GT:AD:DP:GL:GQ 0/1:36,31:67:-115.11,-20.18,-137.00:99
-chr1 3976477 rs4641284 A G 171.33 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=58.95;MQ0=0;OQ=487.70;QD=11.08;SB=-180.60 GT:AD:DP:GL:GQ 0/1:26,18:42:-64.71,-12.65,-94.45:99
-chr1 3976506 rs34448752 C T 57.24 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.85;MQ0=0;OQ=445.94;QD=14.86;SB=-105.62 GT:AD:DP:GL:GQ 0/1:16,14:29:-56.62,-8.74,-46.04:99
-chr1 3976567 . C T 0.32 PASS AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=0;HaplotypeScore=1.54;MQ=51.77;MQ0=0;OQ=226.37;QD=18.86;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,9:11:-29.24,-3.32,-8.40:50.74
-chr1 3976658 rs35326871 G T 11.99 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.52;MQ0=0;OQ=1096.88;QD=17.41;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,38:62:-131.64,-18.67,-93.14:99
-chr1 3977151 rs10915596 T G 1.14 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=3.48;MQ=59.09;MQ0=0;OQ=756.41;QD=14.83;SB=-45.56 GT:AD:DP:GL:GQ 0/1:22,29:48:-93.38,-14.46,-82.79:99
-chr1 3977453 rs4654599 G T 361.03 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.46;MQ0=0;OQ=1289.21;QD=16.74;SB=-567.82 GT:AD:DP:GL:GQ 0/1:35,42:77:-155.40,-23.19,-125.68:99
-chr1 3977541 rs4654600 T C 61.36 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=3.43;MQ=59.43;MQ0=0;OQ=838.26;QD=17.11;SB=-388.65 GT:AD:DP:GL:GQ 0/1:18,30:47:-103.58,-16.47,-75.42:99
-chr1 3977567 rs4654601 G A 272.32 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=1148.82;QD=18.83;SB=-426.81 GT:AD:DP:GL:GQ 0/1:26,35:60:-136.24,-18.08,-87.47:99
-chr1 3977950 rs4654604 T C 322.32 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.65;MQ0=0;OQ=975.26;QD=14.78;SB=-339.18 GT:AD:DP:GL:GQ 0/1:28,38:65:-120.40,-19.59,-110.65:99
-chr1 3978231 rs4129099 T C 330.29 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=60.00;MQ0=0;OQ=733.04;QD=11.64;SB=-345.90 GT:AD:DP:GL:GQ 0/1:32,31:62:-95.28,-18.69,-130.06:99
-chr1 3978308 rs4129100 G A 317.73 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1482.59;QD=16.85;SB=-689.02 GT:AD:DP:GL:GQ 0/1:42,46:86:-177.46,-25.92,-132.95:99
-chr1 3980624 rs4323679 C T 566.66 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=703.77;QD=12.13;SB=-349.85 GT:AD:DP:GL:GQ 0/1:35,23:57:-90.85,-17.19,-108.01:99
-chr1 3980746 rs35182639 G A 123.92 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.13;MQ=59.70;MQ0=0;OQ=1453.16;QD=18.63;SB=-621.68 GT:AD:DP:GL:GQ 0/1:35,43:76:-171.51,-22.91,-105.10:99
-chr1 3980982 rs12747944 G A 386.78 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=60.00;MQ0=0;OQ=715.67;QD=12.56;SB=-369.37 GT:AD:DP:GL:GQ 0/1:32,24:53:-90.82,-15.97,-105.07:99
-chr1 3981385 rs17404600 C T 307.96 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.06;MQ=59.56;MQ0=0;OQ=909.30;QD=17.16;SB=-459.01 GT:AD:DP:GL:GQ 0/1:26,27:49:-108.98,-14.77,-70.07:99
-chr1 3981945 . G C 7.35 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.62;MQ=59.25;MQ0=0;OQ=783.42;QD=13.99;SB=-334.02 GT:AD:DP:GL:GQ 0/1:33,23:54:-97.92,-16.29,-122.30:99
-chr1 3981947 rs10799260 C T 127.54 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=59.25;MQ0=0;OQ=721.41;QD=12.88;SB=-288.75 GT:AD:DP:GL:GQ 0/1:33,23:55:-91.99,-16.57,-116.30:99
-chr1 3982051 rs10753384 A G 287.89 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=59.62;MQ0=0;OQ=891.61;QD=14.62;SB=-286.59 GT:AD:DP:GL:GQ 0/1:30,31:60:-110.52,-18.08,-117.65:99
-chr1 3982227 rs10799261 T C 592.68 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=920.95;QD=13.35;SB=-433.27 GT:AD:DP:GL:GQ 0/1:35,34:67:-115.56,-20.18,-140.96:99
-chr1 3982891 rs12023925 T C 257.35 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.13;MQ0=0;OQ=486.42;QD=9.18;SB=-229.40 GT:AD:DP:GL:GQ 0/1:30,23:50:-67.00,-15.07,-113.54:99
-chr1 3984164 rs7418256 T G 46.90 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=4;HaplotypeScore=1.00;MQ=59.72;MQ0=0;OQ=1495.13;QD=18.23;SB=-531.78 GT:AD:DP:GL:GQ 0/1:33,49:80:-176.89,-24.10,-113.02:99
-chr1 3984958 rs6426436 A G 575.34 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=842.05;QD=12.95;SB=-332.89 GT:AD:DP:GL:GQ 0/1:35,30:64:-106.77,-19.28,-141.35:99
-chr1 3985143 rs5015188 T C 159.92 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=12.99;MQ=58.62;MQ0=0;QD=2.25;SB=-60.43 GT:AD:DP:GL:GQ 0/1:60,11:70:-40.36,-21.09,-240.05:99
-chr1 3985147 rs5015187 T C 314.93 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=67.96;MQ=58.31;MQ0=0;QD=4.37;SB=-165.46 GT:AD:DP:GL:GQ 0/1:57,15:70:-55.86,-21.08,-223.89:99
-chr1 3985151 rs5015186 T C 601.51 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.01;HRun=1;HaplotypeScore=11.99;MQ=58.34;MQ0=0;QD=8.24;SB=-304.19 GT:AD:DP:GL:GQ 0/1:49,23:71:-84.52,-21.09,-190.22:99
-chr1 3985364 rs4233266 A G 350.55 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=58.47;MQ0=0;OQ=817.82;QD=10.76;SB=-299.84 GT:AD:DP:GL:GQ 0/1:41,35:71:-106.46,-21.39,-162.85:99
-chr1 3985761 rs4654611 G C 378.30 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=59.78;MQ0=0;OQ=1274.73;QD=15.36;SB=-534.37 GT:AD:DP:GL:GQ 0/1:45,38:78:-154.27,-23.51,-187.35:99
-chr1 3985811 rs4654612 C T 99.80 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=4.68;MQ=59.17;MQ0=0;OQ=618.20;QD=11.04;SB=-273.28 GT:AD:DP:GL:GQ 0/1:30,25:47:-79.28,-14.18,-83.87:99
-chr1 3988267 rs3829818 C G 50.86 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.32;MQ0=0;OQ=1075.32;QD=19.55;SB=-391.87 GT:AD:DP:GL:GQ 0/1:26,29:54:-127.10,-16.29,-99.01:99
-chr1 3988626 rs34649702 A C 437.42 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=920.32;QD=18.41;SB=-485.28 GT:AD:DP:GL:GQ 0/1:20,30:49:-110.07,-14.76,-69.08:99
-chr1 3988704 rs55889146 T A 313.04 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=59.71;MQ0=0;OQ=1088.43;QD=16.75;SB=-492.44 GT:AD:DP:GL:GQ 0/1:29,36:65:-131.71,-19.58,-109.61:99
-chr1 3989745 rs35412083 G A 332.59 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.92;MQ0=0;OQ=1097.15;QD=11.93;SB=-405.76 GT:AD:DP:GL:GQ 0/1:55,36:89:-139.82,-26.82,-176.39:99
-chr1 3990405 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=94;Dels=0.03;HRun=18;HaplotypeScore=33.42;MQ=54.32;MQ0=1;OQ=80.49;QD=0.86;SB=90.81 GT:AD:DP:GL:GQ 0/1:76,15:73:-32.44,-21.10,-200.50:99
-chr1 3990446 rs34385055 G A 276.71 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.80;MQ=58.88;MQ0=0;OQ=865.10;QD=15.73;SB=-440.45 GT:AD:DP:GL:GQ 0/1:26,29:49:-104.56,-14.77,-74.37:99
-chr1 3990572 rs10915650 T C 322.59 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=53.91;MQ0=0;OQ=802.60;QD=15.43;SB=-363.11 GT:AD:DP:GL:GQ 0/1:19,33:50:-98.61,-15.07,-76.41:99
-chr1 3990932 rs4654614 C T 267.85 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1697.75;QD=19.97;SB=-727.98 GT:AD:DP:GL:GQ 0/1:36,49:85:-198.66,-25.60,-134.20:99
-chr1 3991939 . G T 133.26 Indel AC=1;AF=0.50;AN=2;DP=31;Dels=0.03;HRun=0;HaplotypeScore=37.12;MQ=55.25;MQ0=0;QD=4.30;SB=-33.93 GT:AD:DP:GL:GQ 0/1:22,8:23:-23.24,-6.63,-47.74:99
-chr1 3992866 rs34160796 A G 334.90 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=483.28;QD=9.29;SB=-177.56 GT:AD:DP:GL:GQ 0/1:33,19:51:-66.97,-15.36,-129.46:99
-chr1 3993123 rs10915661 A G 223.41 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.93;MQ=58.90;MQ0=0;OQ=752.89;QD=12.76;SB=-356.58 GT:AD:DP:GL:GQ 0/1:32,27:57:-95.74,-17.17,-122.04:99
-chr1 3993398 rs10799273 A G 39.64 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.69;MQ0=0;OQ=432.60;QD=13.52;SB=-183.96 GT:AD:DP:GL:GQ 0/1:16,16:30:-55.58,-9.04,-60.72:99
-chr1 3993415 rs55877711 T C 152.20 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.43;MQ0=0;OQ=474.94;QD=14.39;SB=-232.31 GT:AD:DP:GL:GQ 0/1:16,17:31:-60.12,-9.34,-57.39:99
-chr1 3993656 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=16;HaplotypeScore=11.17;MQ=56.96;MQ0=0;OQ=77.46;QD=1.25;SB=65.19 GT:AD:DP:GL:GQ 0/1:50,11:45:-24.60,-13.57,-123.37:99
-chr1 3994923 rs4654469 G A 168.23 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=59.68;MQ0=0;OQ=1491.96;QD=20.44;SB=-717.78 GT:AD:DP:GL:GQ 0/1:30,43:72:-174.18,-21.70,-94.37:99
-chr1 3995705 rs34085171 T G 1347.57 Indel AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.38;MQ0=0;QD=15.85;SB=-684.75 GT:AD:DP:GL:GQ 0/1:40,45:84:-163.34,-25.30,-143.02:99
-chr1 3997814 . A G 166.71 PASS AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.77;MQ0=0;OQ=1047.22;QD=13.09;SB=-493.22 GT:AD:DP:GL:GQ 0/1:44,36:80:-132.11,-24.10,-175.80:99
-chr1 3999521 rs7533488 A C 424.91 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.32;MQ0=0;OQ=1161.71;QD=14.17;SB=-423.73 GT:AD:DP:GL:GQ 0/1:41,40:80:-143.55,-24.09,-150.24:99
-chr1 4000164 rs10753345 T C 207.13 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=54.60;MQ0=3;OQ=972.02;QD=12.62;SB=-388.88 GT:AD:DP:GL:GQ 0/1:39,38:72:-122.18,-21.70,-141.20:99
-chr1 4000350 rs10915304 A G 90.68 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=49.42;MQ0=0;OQ=302.07;QD=8.39;SB=-112.62 GT:AD:DP:GL:GQ 0/1:20,15:32:-43.14,-9.65,-72.05:99
-chr1 4001557 rs35079847 T C 179.63 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=42.74;MQ0=4;OQ=737.26;QD=10.24;SB=-356.16 GT:AD:DP:GL:GQ 0/1:43,29:67:-97.19,-20.18,-162.42:99
-chr1 4002410 rs9792845 T A 39.80 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=2;HaplotypeScore=2.16;MQ=49.63;MQ0=6;OQ=1137.13;QD=12.92;SB=-561.60 GT:AD:DP:GL:GQ 0/1:48,40:80:-141.09,-24.09,-168.17:99
-chr1 4002600 . C T 9.93 PASS AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=34.65;MQ0=18;OQ=1297.58;QD=10.30;SB=-536.53 GT:AD:DP:GL:GQ 0/1:72,54:87:-159.25,-26.21,-171.14:99
-chr1 4003027 rs7539155 C T 270.27 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=49.52;MQ0=2;OQ=1241.45;QD=15.71;SB=-511.02 GT:AD:DP:GL:GQ 0/1:40,39:77:-150.62,-23.19,-144.23:99
-chr1 4003660 rs34911143 C G 406.63 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1137.88;QD=19.96;SB=-593.22 GT:AD:DP:GL:GQ 0/1:26,31:56:-133.94,-16.87,-107.70:99
-chr1 4003790 . T C 0.57 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.22;MQ=56.08;MQ0=0;OQ=469.98;QD=8.55;SB=-182.54 GT:AD:DP:GL:GQ 0/1:35,20:52:-65.94,-15.66,-138.69:99
-chr1 4003932 rs60522686 C T 104.95 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=60.00;MQ0=0;OQ=1130.00;QD=21.32;SB=-533.08 GT:AD:DP:GL:GQ 0/1:20,33:53:-132.25,-15.97,-67.95:99
-chr1 4004106 rs12036981 T A 126.81 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.38;MQ=56.22;MQ0=2;OQ=519.83;QD=10.19;SB=-138.13 GT:AD:DP:GL:GQ 0/1:29,21:47:-69.43,-14.17,-100.44:99
-chr1 4004617 rs12036953 A G 190.96 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.43;MQ0=0;OQ=561.78;QD=8.64;SB=-245.46 GT:AD:DP:GL:GQ 0/1:41,24:63:-78.44,-18.98,-164.76:99
-chr1 4005149 rs5018354 G T 769.64 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=5;HaplotypeScore=8.12;MQ=53.93;MQ0=0;QD=10.84;SB=-410.03 GT:AD:DP:GL:GQ 0/1:41,30:69:-101.03,-20.78,-142.34:99
-chr1 4005155 . A T 709.63 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=5;HaplotypeScore=11.69;MQ=54.09;MQ0=0;QD=10.28;SB=-304.00 GT:AD:DP:GL:GQ 0/1:43,26:65:-93.83,-19.58,-142.00:99
-chr1 4005156 . A T 576.66 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=13.11;MQ=54.00;MQ0=0;QD=8.48;SB=-291.97 GT:AD:DP:GL:GQ 0/1:44,24:63:-79.93,-18.98,-151.00:99
-chr1 4005449 rs34905442 A G 30.08 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=5.92;MQ=57.79;MQ0=0;OQ=842.19;QD=15.89;SB=-428.92 GT:AD:DP:GL:GQ 0/1:23,30:52:-103.18,-15.68,-83.89:99
-chr1 4010416 rs55645535 A G 3.25 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=58.64;MQ0=0;OQ=504.55;QD=16.28;SB=-163.34 GT:AD:DP:GL:GQ 0/1:10,21:29:-62.49,-8.75,-36.79:99
-chr1 4012539 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=20;HaplotypeScore=3.78;MQ=46.27;MQ0=3;OQ=496.42;QD=5.23;SB=131.33 GT:AD:DP:GL:GQ 0/1:70,25:77:-76.14,-23.22,-185.60:99
-chr1 4012545 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=7;HaplotypeScore=6.81;MQ=48.30;MQ0=1;OQ=296.48;QD=3.12;SB=125.35 GT:AD:DP:GL:GQ 0/1:68,26:74:-55.23,-22.30,-199.64:99
-chr1 4015436 rs10799171 T C 582.11 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.51;MQ0=0;OQ=1395.24;QD=29.69;SB=-603.59 GT:AD:DP:GL:GQ 1/1:0,47:45:-143.16,-13.58,-0.05:99
-chr1 4015788 rs6426377 G C 79.87 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=58.24;MQ0=0;OQ=2118.03;QD=39.96;SB=-1018.28 GT:AD:DP:GL:GQ 1/1:0,53:49:-215.40,-14.76,-0.01:99
-chr1 4016464 rs3856168 T C 206.69 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=58.60;MQ0=0;OQ=1420.67;QD=28.41;SB=-682.89 GT:AD:DP:GL:GQ 1/1:0,50:45:-145.69,-13.57,-0.04:99
-chr1 4017003 rs4654403 T C 46.24 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.69;MQ=59.61;MQ0=0;OQ=1716.77;QD=29.10;SB=-823.60 GT:AD:DP:GL:GQ 1/1:0,59:55:-175.31,-16.59,-0.05:99
-chr1 4017098 rs4654404 C T 8.35 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=4.56;MQ=58.64;MQ0=0;OQ=1853.34;QD=38.61;SB=-777.68 GT:AD:DP:GL:GQ 1/1:0,48:47:-188.93,-14.16,-0.01:99
-chr1 4018431 rs4654475 T C 39.68 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.54;MQ0=0;OQ=1443.50;QD=28.87;SB=-682.71 GT:AD:DP:GL:GQ 1/1:0,50:46:-147.99,-13.88,-0.05:99
-chr1 4018760 rs7419106 C G 402.81 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1082.64;QD=34.92;SB=-389.10 GT:AD:DP:GL:GQ 1/1:0,31:28:-111.87,-8.45,-0.02:84.27
-chr1 4018847 rs10799175 T C 20.86 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=0;HaplotypeScore=4.16;MQ=58.50;MQ0=0;OQ=814.89;QD=26.29;SB=-376.57 GT:AD:DP:GL:GQ 1/1:1,29:28:-88.39,-10.61,-3.32:72.94
-chr1 4019483 rs10799177 G A 473.58 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.36;MQ0=0;OQ=1615.08;QD=33.65;SB=-313.91 GT:AD:DP:GL:GQ 1/1:0,48:42:-165.11,-12.66,-0.02:99
-chr1 4019522 rs9792946 G A 281.35 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=54.50;MQ0=0;OQ=2603.69;QD=38.29;SB=-1110.00 GT:AD:DP:GL:GQ 1/1:0,68:66:-263.98,-19.89,-0.02:99
-chr1 4019590 rs7418034 G A 135.96 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=43.49;MQ0=0;OQ=1841.94;QD=30.70;SB=-845.46 GT:AD:DP:GL:GQ 1/1:0,59:50:-190.21,-17.45,-2.43:99
-chr1 4019593 rs7412152 A C 123.30 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=42.41;MQ0=0;OQ=1763.32;QD=29.89;SB=-853.08 GT:AD:DP:GL:GQ 1/1:0,59:51:-179.93,-15.36,-0.02:99
-chr1 4019614 rs7411249 C G 15.77 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=3.88;MQ=36.55;MQ0=1;OQ=1713.38;QD=32.33;SB=-801.51 GT:AD:DP:GL:GQ 1/1:0,53:41:-174.94,-12.36,-0.02:99
-chr1 4019841 rs7412217 A G 301.34 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=36.34;MQ0=0;OQ=1308.64;QD=29.08;SB=-633.25 GT:AD:DP:GL:GQ 1/1:0,45:37:-134.46,-11.14,-0.01:99
-chr1 4019863 rs4310408 A G 15.48 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=44.42;MQ0=0;OQ=1396.45;QD=30.36;SB=-620.23 GT:AD:DP:GL:GQ 1/1:0,46:40:-143.25,-12.05,-0.02:99
-chr1 4019987 rs10737398 C T 456.73 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.86;MQ0=6;OQ=1422.85;QD=30.93;SB=-467.35 GT:AD:DP:GL:GQ 1/1:0,46:37:-145.88,-11.15,-0.01:99
-chr1 4020055 rs7411353 C A 1052.58 Indel;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=9;HaplotypeScore=6.69;MQ=42.23;MQ0=1;QD=22.40;SB=-302.56 GT:AD:DP:GL:GQ 1/1:0,47:31:-108.85,-9.34,-0.01:93.27
-chr1 4020059 . T A 16.07 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=4;HaplotypeScore=6.64;MQ=40.62;MQ0=1;QD=0.41;SB=14.07 GT:AD:DP:GL:GQ 0/1:27,12:17:-10.01,-5.13,-48.93:48.79
-chr1 4020065 rs6426379 G C 834.47 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=40.47;MQ0=0;QD=30.91;SB=-369.17 GT:AD:DP:GL:GQ 1/1:1,26:20:-87.04,-6.03,-0.01:60.20
-chr1 4020216 rs6426380 C T 178.01 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=56.52;MQ0=0;OQ=2286.70;QD=38.76;SB=-938.24 GT:AD:DP:GL:GQ 1/1:0,59:59:-232.28,-17.78,-0.03:99
-chr1 4020359 rs4233255 T A 506.79 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.30;MQ0=1;OQ=1405.72;QD=30.56;SB=-629.64 GT:AD:DP:GL:GQ 1/1:0,46:40:-144.18,-12.05,-0.02:99
-chr1 4020451 rs4654476 A G 27.72 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.11;MQ0=0;OQ=1489.65;QD=28.65;SB=-689.96 GT:AD:DP:GL:GQ 1/1:0,52:47:-152.59,-14.18,-0.04:99
-chr1 4020454 rs4654477 T C 48.40 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=59.54;MQ0=0;OQ=1536.11;QD=30.72;SB=-613.94 GT:AD:DP:GL:GQ 1/1:0,50:48:-157.24,-14.48,-0.04:99
-chr1 4020656 rs4233256 A C 90.34 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.09;MQ0=0;OQ=1344.37;QD=29.23;SB=-633.78 GT:AD:DP:GL:GQ 1/1:0,46:45:-138.07,-13.57,-0.05:99
-chr1 4020738 rs4233257 G A 285.07 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=56.81;MQ0=0;OQ=1954.21;QD=35.53;SB=-857.02 GT:AD:DP:GL:GQ 1/1:0,55:50:-199.02,-15.06,-0.01:99
-chr1 4020758 rs4233258 T C 590.90 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.92;MQ0=0;OQ=1509.42;QD=29.03;SB=-773.63 GT:AD:DP:GL:GQ 1/1:0,52:49:-154.57,-14.78,-0.05:99
-chr1 4020965 rs10915373 A G 41.68 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=3.05;MQ=59.15;MQ0=0;OQ=2124.75;QD=32.19;SB=-981.05 GT:AD:DP:GL:GQ 1/1:0,66:61:-216.09,-18.38,-0.03:99
-chr1 4021209 rs12087801 A G 66.82 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=59.44;MQ0=0;OQ=1399.12;QD=34.12;SB=-653.32 GT:AD:DP:GL:GQ 1/1:0,41:40:-143.51,-12.05,-0.01:99
-chr1 4021244 rs7524590 A G 21.98 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.56;MQ0=0;OQ=1518.93;QD=29.21;SB=-554.05 GT:AD:DP:GL:GQ 1/1:0,52:47:-155.52,-14.17,-0.04:99
-chr1 4021467 rs6426381 T C 70.46 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.82;MQ0=0;OQ=1271.75;QD=29.58;SB=-623.00 GT:AD:DP:GL:GQ 1/1:0,43:40:-130.79,-12.06,-0.03:99
-chr1 4021470 rs6665286 C T 565.39 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.82;MQ0=0;OQ=1632.61;QD=37.97;SB=-837.35 GT:AD:DP:GL:GQ 1/1:0,43:42:-166.86,-12.66,-0.02:99
-chr1 4021576 rs10799179 C T 140.80 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.60;MQ0=0;OQ=2105.87;QD=36.95;SB=-1023.68 GT:AD:DP:GL:GQ 1/1:0,57:54:-214.19,-16.27,-0.02:99
-chr1 4022324 rs10799180 T C 96.83 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1478.38;QD=30.80;SB=-697.61 GT:AD:DP:GL:GQ 1/1:0,48:47:-151.47,-14.18,-0.04:99
-chr1 4023064 rs12044274 A T 27.33 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.00;MQ0=0;OQ=1175.00;QD=33.57;SB=-370.25 GT:AD:DP:GL:GQ 1/1:0,34:33:-121.10,-9.94,-0.02:99
-chr1 4023346 rs12728781 C T 64.59 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.67;MQ0=0;OQ=1081.51;QD=30.90;SB=-492.01 GT:AD:DP:GL:GQ 1/1:1,34:29:-111.75,-8.74,-0.01:87.27
-chr1 4023709 rs10915381 G C 0.23 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=3.44;MQ=58.92;MQ0=0;OQ=2348.10;QD=41.93;SB=-727.93 GT:AD:DP:GL:GQ 1/1:0,56:54:-238.42,-16.28,-0.02:99
-chr1 4024015 rs6672626 C T 663.95 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=46.30;MQ0=0;OQ=1764.84;QD=37.55;SB=-805.32 GT:AD:DP:GL:GQ 1/1:0,47:46:-180.09,-13.86,-0.02:99
-chr1 4024120 rs6672716 C T 182.48 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=36.16;MQ0=0;OQ=1966.97;QD=37.83;SB=-833.61 GT:AD:DP:GL:GQ 1/1:0,51:51:-203.16,-18.10,-2.88:99
-chr1 4024270 . T A 112.05 Indel AC=1;AF=0.50;AN=2;DP=33;Dels=0.03;HRun=0;HaplotypeScore=2.93;MQ=35.48;MQ0=0;QD=3.40;SB=-51.99 GT:AD:DP:GL:GQ 0/1:21,11:28:-22.63,-8.14,-76.45:99
-chr1 4024272 . A T 86.10 Indel AC=1;AF=0.50;AN=2;DP=34;Dels=0.03;HRun=0;HaplotypeScore=5.09;MQ=34.14;MQ0=0;QD=2.53;SB=-27.82 GT:AD:DP:GL:GQ 0/1:23,10:27:-19.73,-7.83,-71.54:99
-chr1 4024295 rs6683289 T C 432.26 Indel;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=27.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:16:-46.84,-4.84,-0.03:48.07
-chr1 4024297 rs6665849 G C 696.90 Indel;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=43.56;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,16:16:-73.28,-4.82,-0.00:48.16
-chr1 4024305 . T C 154.38 Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=7.02;SB=-40.68 GT:AD:DP:GL:GQ 0/1:15,7:22:-25.35,-6.63,-60.61:99
-chr1 4024357 . T G 116.82 Indel AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=28.57;MQ0=0;QD=4.67;SB=-30.96 GT:AD:DP:GL:GQ 0/1:17,8:23:-21.89,-6.93,-59.79:99
-chr1 4024403 . G T 1246.60 Indel AC=2;AF=1.00;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=28.45;MQ0=0;QD=33.69;SB=-622.14 GT:AD:DP:GL:GQ 1/1:0,37:35:-128.26,-10.54,-0.01:99
-chr1 4024413 . C T 38.79 Indel;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=32.72;MQ0=0;QD=0.90;SB=-26.14 GT:AD:DP:GL:GQ 0/1:37,6:40:-19.21,-12.05,-127.12:71.63
-chr1 4024463 . G C 836.03 Indel AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=5.63;MQ=36.44;MQ0=0;QD=16.39;SB=-259.21 GT:AD:DP:GL:GQ 0/1:27,24:51:-102.25,-15.37,-114.08:99
-chr1 4024467 . C T 697.56 Indel AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=4.47;MQ=36.57;MQ0=0;QD=13.95;SB=-194.79 GT:AD:DP:GL:GQ 0/1:28,22:49:-87.80,-14.76,-98.23:99
-chr1 4024517 rs28542205 C G 1129.16 Indel AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=18.36;MQ=32.35;MQ0=0;QD=26.26;SB=-522.33 GT:AD:DP:GL:GQ 0/1:8,31:35:-126.75,-10.55,-27.16:99
-chr1 4024521 . G C 975.12 Indel AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=18.89;MQ=30.36;MQ0=0;QD=23.78;SB=-491.19 GT:AD:DP:GL:GQ 0/1:9,27:35:-115.01,-14.21,-36.24:99
-chr1 4024603 . G C 2.26 PASS AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=24.41;MQ0=0;OQ=50.98;QD=5.66;SB=-6.99 GT:AD:DP:GL:GQ 0/1:1,8:3:-9.29,-0.90,-4.69:37.89
-chr1 4024673 . T C 8.19 PASS AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=30.71;MQ0=0;OQ=656.07;QD=31.24;SB=-288.45 GT:AD:DP:GL:GQ 1/1:0,21:20:-69.20,-6.03,-0.01:60.17
-chr1 4024788 . T C 850.29 Indel AC=2;AF=1.00;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.58;MQ0=0;QD=34.01;SB=-338.76 GT:AD:DP:GL:GQ 1/1:0,25:25:-88.63,-7.53,-0.01:75.20
-chr1 4024845 . T G 1.74 PASS AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=68.85;QD=17.21;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,3:4:-11.37,-1.20,-3.44:22.35
-chr1 4024894 . T C 62.45 Indel AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=29.00;MQ0=0;QD=12.49;SB=-41.94 GT:AD:DP:GL:GQ 0/1:2,3:4:-10.73,-1.20,-4.27:30.63
-chr1 4024923 . G A 22.24 Indel;LowQual AC=1;AF=0.50;AN=2;DP=8;Dels=0.25;HRun=0;HaplotypeScore=23.92;MQ=29.00;MQ0=0;QD=2.78;SB=-0.97 GT:AD:DP:GL:GQ 0/1:4,2:6:-7.31,-1.81,-14.76:55.05
-chr1 4024936 . T G 14.90 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=16;Dels=0.06;HRun=0;HaplotypeScore=31.98;MQ=29.00;MQ0=0;QD=0.93;SB=4.38 GT:AD:DP:GL:GQ 0/1:12,2:8:-11.00,-6.24,-20.74:47.59
-chr1 4024944 . C T 21.22 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=58.95;MQ=29.00;MQ0=0;QD=1.25;SB=8.05 GT:AD:DP:GL:GQ 0/1:15,2:9:-8.11,-2.71,-25.25:54.02
-chr1 4024945 . A T 15.01 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=58.95;MQ=29.00;MQ0=0;QD=0.88;SB=8.04 GT:AD:DP:GL:GQ 0/1:13,4:9:-7.48,-2.71,-24.43:47.70
-chr1 4024946 . C T 97.28 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=17;Dels=0.00;HRun=0;HaplotypeScore=64.95;MQ=29.00;MQ0=0;QD=5.72;SB=8.05 GT:AD:DP:GL:GQ 0/1:13,4:11:-16.32,-3.31,-25.25:99
-chr1 4024979 . C T 611.81 Indel;SnpCluster AC=2;AF=1.00;AN=2;DP=18;Dels=0.00;HRun=0;HaplotypeScore=6.71;MQ=29.00;MQ0=0;QD=33.99;SB=-293.67 GT:AD:DP:GL:GQ 1/1:0,16:16:-64.77,-4.82,-0.00:48.16
-chr1 4024982 . T G 173 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=11.86;MQ=29.00;MQ0=0;QD=9.11;SB=14.07 GT:AD:DP:GL:GQ 0/1:10,7:16:-25.40,-4.82,-33.30:99
-chr1 4024983 . C T 250.37 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=1;HaplotypeScore=11.86;MQ=29.00;MQ0=0;QD=13.18;SB=14.06 GT:AD:DP:GL:GQ 0/1:11,8:16:-33.14,-4.82,-27.15:99
-chr1 4025014 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=2;HaplotypeScore=18.19;MQ=29.00;MQ0=0;OQ=197.67;QD=9.88;SB=17.08 GT:AD:DP:GL:GQ 0/1:13,7:18:-28.47,-5.42,-39.21:99
-chr1 4025033 . G A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=9.30;MQ=27.51;MQ0=1;OQ=89.74;QD=8.97;SB=2.03 GT:AD:DP:GL:GQ 0/1:5,5:9:-14.97,-2.71,-16.97:99
-chr1 4025048 . C T 21.22 DPFilter;Indel;LowQual AC=1;AF=0.50;AN=2;DP=10;Dels=0.00;HRun=1;HaplotypeScore=32.62;MQ=27.51;MQ0=1;QD=2.12;SB=2.04 GT:AD:DP:GL:GQ 0/1:8,2:9:-8.11,-2.71,-25.19:54.03
-chr1 4025070 . G A 35.48 LowQual AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=1;HaplotypeScore=6.00;MQ=29.00;MQ0=0;QD=8.87;SB=-6.99 GT:AD:DP:GL:GQ 0/1:2,2:3:-7.73,-0.90,-3.47:25.65
-chr1 4025144 . C T 71.12 Indel AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=8.89;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,6:5:-11.90,-1.51,-7.69:61.87
-chr1 4025168 . G C 48.97 LowQual AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=29.00;MQ0=0;QD=7.00;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,5:4:-9.39,-1.21,-8.09:68.89
-chr1 4025186 . C T 0.12 PASS AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=78.13;QD=19.53;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,3:4:-12.30,-1.20,-3.90:26.92
-chr1 4025245 . C T 49.25 LowQual;SnpCluster AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,2:2:-8.33,-0.60,-0.00:6.02
-chr1 4025247 . G C 137.89 SnpCluster AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.94;MQ0=1;QD=27.58;SB=-52.47 GT:AD:DP:GL:GQ 1/1:1,4:4:-17.32,-1.21,-0.00:12.04
-chr1 4025253 . T C 341.02 SnpCluster AC=2;AF=1.00;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.68;MQ0=2;QD=26.23;SB=-182.78 GT:AD:DP:GL:GQ 1/1:1,12:11:-37.69,-3.31,-0.01:33.09
-chr1 4025355 . C T 528.21 SnpCluster AC=2;AF=1.00;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=33.01;SB=-144.72 GT:AD:DP:GL:GQ 1/1:1,15:16:-59.68,-4.82,-3.30:15.20
-chr1 4025359 . T C 305.09 SnpCluster AC=1;AF=0.50;AN=2;DP=13;Dels=0.00;HRun=0;HaplotypeScore=0.49;MQ=29.00;MQ0=0;QD=23.47;SB=-70.88 GT:AD:DP:GL:GQ 0/1:2,11:13:-37.71,-3.92,-7.64:37.23
-chr1 4025364 . T A 90.08 SnpCluster AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=29.00;MQ0=0;QD=18.02;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,3:3:-12.50,-0.90,-0.00:9.03
-chr1 4025431 . G C 10.49 LowQual AC=1;AF=0.50;AN=2;DP=1;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=10.49;SB=-10.00 GT:AD:DP:GL:GQ 0/1:0,1:1:-4.29,-0.30,-0.00:1.76
-chr1 4025466 . T C 25.23 LowQual AC=1;AF=0.50;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=29.00;MQ0=0;QD=8.41;SB=-10.00 GT:AD:DP:GL:GQ 0/1:0,2:3:-9.75,-4.24,-3.95:1.79
-chr1 4025523 . A C 21.19 LowQual AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=1;HaplotypeScore=4.30;MQ=29.00;MQ0=0;QD=4.24;SB=-10.00 GT:AD:DP:GL:GQ 0/1:3,2:3:-6.30,-0.90,-3.10:21.92
-chr1 4025542 . T C 37.83 LowQual AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=12.61;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,2:2:-7.19,-0.60,-0.00:6.02
-chr1 4025586 . G C 7.40 PASS AC=1;AF=0.50;AN=2;DP=5;Dels=0.20;HRun=0;HaplotypeScore=2.25;MQ=29.00;MQ0=0;OQ=51.98;QD=10.40;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,3:3:-9.39,-0.90,-3.95:30.43
-chr1 4025618 . C T 7.86 PASS AC=2;AF=1.00;AN=2;DP=7;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=29.00;MQ0=0;OQ=87.13;QD=12.45;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,5:3:-12.20,-0.90,-0.00:9.03
-chr1 4025642 . T C 158.22 Indel AC=2;AF=1.00;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=31.64;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,5:5:-19.38,-1.51,-0.00:15.05
-chr1 4025697 . A T 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=29.00;MQ0=0;OQ=113.07;QD=22.61;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,4:5:-16.09,-1.51,-3.64:21.34
-chr1 4025746 . T G 32.28 LowQual AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=3.93;MQ=23.71;MQ0=1;QD=6.46;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,2:3:-7.41,-0.90,-3.74:28.36
-chr1 4025760 . T C 33.23 LowQual AC=1;AF=0.50;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=3.00;MQ=26.51;MQ0=0;QD=8.31;SB=-10.00 GT:AD:DP:GL:GQ 0/1:1,2:3:-10.45,-4.14,-3.85:1.79
-chr1 4026171 . A T 209.87 Indel AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=25.28;MQ0=0;QD=14.99;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,9:8:-26.67,-2.41,-4.00:15.91
-chr1 4026180 . C G 33.92 Indel;LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=25.28;MQ0=0;QD=2.42;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,5:9:-9.39,-2.71,-29.13:66.75
-chr1 4026184 . C T 21.22 LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=25.28;MQ0=0;QD=1.52;SB=-10.00 GT:AD:DP:GL:GQ 0/1:9,5:9:-8.11,-2.71,-25.08:54.02
-chr1 4026206 . C G 51.98 Indel AC=1;AF=0.50;AN=2;DP=7;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.01;MQ0=1;QD=7.43;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,5:3:-9.39,-0.90,-4.15:32.44
-chr1 4026210 . G C 48.85 LowQual AC=2;AF=1.00;AN=2;DP=6;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=20.61;MQ0=1;QD=8.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,5:2:-8.29,-0.60,-0.00:6.02
-chr1 4026326 . G C 28.47 Indel;LowQual AC=1;AF=0.50;AN=2;DP=15;Dels=0.00;HRun=0;HaplotypeScore=22.92;MQ=30.24;MQ0=0;QD=1.90;SB=-27.39 GT:AD:DP:GL:GQ 0/1:8,6:9:-8.84,-2.71,-32.55:61.30
-chr1 4026330 . C T 15.30 Indel;LowQual AC=1;AF=0.50;AN=2;DP=16;Dels=0.00;HRun=1;HaplotypeScore=20.94;MQ=33.42;MQ0=0;QD=0.96;SB=-6.99 GT:AD:DP:GL:GQ 0/1:14,2:11:-8.11,-3.31,-31.44:48.01
-chr1 4026341 . A T 151.96 Indel AC=1;AF=0.50;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=32.82;MQ=37.84;MQ0=1;QD=7.24;SB=-45.98 GT:AD:DP:GL:GQ 0/1:14,7:14:-22.70,-4.22,-31.99:99
-chr1 4026383 . A G 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=27.11;MQ=37.86;MQ0=1;OQ=685.36;QD=14.58;SB=-116.05 GT:AD:DP:GL:GQ 1/1:7,40:26:-76.32,-7.85,-4.20:36.49
-chr1 4026434 . C G 29.02 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=0.81;SB=5.05 GT:AD:DP:GL:GQ 0/1:34,2:8:-8.60,-2.41,-25.63:61.85
-chr1 4026435 . A T 728.54 SnpCluster AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=20.24;SB=-50.99 GT:AD:DP:GL:GQ 1/1:2,34:20:-76.44,-6.02,-0.00:60.19
-chr1 4026437 . T A 762.24 SnpCluster AC=2;AF=1.00;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=38.33;MQ0=0;QD=21.17;SB=-46.39 GT:AD:DP:GL:GQ 1/1:2,34:20:-79.81,-6.02,-0.00:60.20
-chr1 4026440 . T G 564.23 SnpCluster AC=2;AF=1.00;AN=2;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.87;MQ0=0;QD=17.10;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,31:17:-60.01,-5.12,-0.00:51.15
-chr1 4026444 . C G 41.07 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=34.30;MQ0=1;QD=1.28;SB=-6.99 GT:AD:DP:GL:GQ 0/1:30,2:3:-8.29,-0.90,-4.25:33.44
-chr1 4026449 . A T 483.60 SnpCluster AC=2;AF=1.00;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=34.81;MQ0=1;QD=16.68;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,29:14:-51.95,-4.22,-0.00:42.13
-chr1 4026483 . G A 173.76 Indel AC=2;AF=1.00;AN=2;DP=7;Dels=0.14;HRun=0;HaplotypeScore=0.00;MQ=25.96;MQ0=0;QD=24.82;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,6:5:-20.94,-1.51,-0.00:15.05
-chr1 4026581 . T C 45.31 PASS AC=2;AF=1.00;AN=2;DP=4;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=26.51;MQ0=0;OQ=56.13;QD=14.03;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,4:3:-9.11,-0.91,-0.01:9
-chr1 4026636 . T A 64.25 PASS AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=32.75;MQ0=0;OQ=1092.89;QD=35.25;SB=-113.17 GT:AD:DP:GL:GQ 1/1:0,31:29:-112.88,-8.73,-0.01:87.28
-chr1 4026761 . T A 283.60 PASS AC=2;AF=1.00;AN=2;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.63;MQ0=0;OQ=910.42;QD=32.51;SB=-440.82 GT:AD:DP:GL:GQ 1/1:0,28:25:-94.63,-7.53,-0.01:75.24
-chr1 4026798 . G C 10.99 LowQual AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=0;HaplotypeScore=12.99;MQ=22.58;MQ0=0;QD=2.20;SB=-10.00 GT:AD:DP:GL:GQ 0/1:2,3:1:-4.35,-0.30,-0.00:1.76
-chr1 4026914 . T C 49.44 PASS AC=2;AF=1.00;AN=2;DP=10;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.57;MQ0=0;OQ=246.59;QD=24.66;SB=-150.73 GT:AD:DP:GL:GQ 1/1:0,10:9:-28.25,-2.72,-0.01:27.05
-chr1 4026927 . A T 206.91 PASS AC=2;AF=1.00;AN=2;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.61;MQ0=0;OQ=634.07;QD=30.19;SB=-308.12 GT:AD:DP:GL:GQ 1/1:0,21:18:-67.00,-5.42,-0.01:54.16
-chr1 4027026 . C T 64.95 Indel AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=32.20;MQ0=1;QD=1.71;SB=-49.74 GT:AD:DP:GL:GQ 0/1:32,6:37:-20.92,-11.15,-115.91:97.79
-chr1 4027042 . T C 614.97 Indel AC=2;AF=1.00;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=29.00;MQ0=0;QD=27.95;SB=-154.73 GT:AD:DP:GL:GQ 1/1:0,22:21:-65.11,-6.34,-0.03:63.13
-chr1 4027052 . T C 696.49 Indel AC=2;AF=1.00;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=29.00;MQ0=0;QD=34.82;SB=-114.05 GT:AD:DP:GL:GQ 1/1:0,20:20:-73.24,-6.03,-0.01:60.18
-chr1 4027210 . G C 19.50 Indel;LowQual AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=26.88;MQ0=0;QD=1.39;SB=-27.39 GT:AD:DP:GL:GQ 0/1:12,2:10:-8.24,-3.01,-36.19:52.28
-chr1 4027332 . C G 36.70 PASS AC=2;AF=1.00;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.49;MQ0=0;OQ=1976.71;QD=43.93;SB=-544.06 GT:AD:DP:GL:GQ 1/1:0,45:45:-201.27,-13.56,-0.01:99
-chr1 4027338 . T C 290.59 PASS AC=2;AF=1.00;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=36.34;MQ0=0;OQ=1625.12;QD=35.33;SB=-497.48 GT:AD:DP:GL:GQ 1/1:0,46:46:-166.11,-13.85,-0.01:99
-chr1 4027382 rs4654478 T C 529.46 Indel AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=8.99;MQ=33.88;MQ0=0;QD=11.77;SB=-150.80 GT:AD:DP:GL:GQ 0/1:25,20:45:-69.78,-13.55,-102.60:99
-chr1 4027391 . A T 124.12 Indel AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=29.00;MQ0=0;QD=3.18;SB=-45.98 GT:AD:DP:GL:GQ 0/1:32,7:37:-26.84,-11.14,-119.06:99
-chr1 4027395 . T A 21.79 Indel;LowQual AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=29.00;MQ0=0;QD=0.61;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,4:36:-16.30,-10.84,-120.25:54.60
-chr1 4027428 rs4654405 C A 54.82 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=29.00;MQ0=0;OQ=1067.75;QD=35.59;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,30:30:-110.36,-9.03,-0.00:90.28
-chr1 4027512 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=38;Dels=0.03;HRun=0;HaplotypeScore=41.12;MQ=30.70;MQ0=0;OQ=583.71;QD=15.36;SB=-96.83 GT:AD:DP:GL:GQ 0/1:11,26:29:-70.09,-8.44,-49.32:99
-chr1 4027516 . C G 4.55 PASS AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=0;HaplotypeScore=2.16;MQ=30.66;MQ0=0;OQ=294.17;QD=7.54;SB=2.04 GT:AD:DP:GL:GQ 0/1:30,9:29:-41.44,-8.74,-84.22:99
-chr1 4027660 rs4654407 G A 193.14 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=42.76;MQ0=0;OQ=2435.59;QD=39.28;SB=-760.64 GT:AD:DP:GL:GQ 1/1:0,62:62:-247.16,-18.68,-0.02:99
-chr1 4027721 rs4654408 C T 529.60 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.67;MQ0=0;OQ=1726.14;QD=39.23;SB=-623.32 GT:AD:DP:GL:GQ 1/1:0,44:43:-176.21,-12.95,-0.01:99
-chr1 4027907 rs4654409 G A 268.91 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.85;MQ0=0;OQ=2188.75;QD=36.48;SB=-1120.98 GT:AD:DP:GL:GQ 1/1:0,60:57:-222.49,-17.18,-0.03:99
-chr1 4028014 rs10915398 T C 85.36 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.65;MQ0=0;OQ=1826.56;QD=33.83;SB=-678.24 GT:AD:DP:GL:GQ 1/1:0,54:52:-186.26,-15.66,-0.02:99
-chr1 4028230 rs10753357 A C 280.70 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.61;MQ0=0;OQ=1933.90;QD=32.78;SB=-901.67 GT:AD:DP:GL:GQ 1/1:0,59:56:-196.99,-16.87,-0.02:99
-chr1 4028383 rs10753358 C A 101.29 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=0.96;MQ=59.50;MQ0=0;OQ=3292.23;QD=35.40;SB=-1450.96 GT:AD:DP:GL:GQ 1/1:0,93:90:-328.22,-27.11,-0.03:99
-chr1 4028555 rs10915400 C T 609.81 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2231.72;QD=39.15;SB=-1113.00 GT:AD:DP:GL:GQ 1/1:0,57:57:-226.78,-17.18,-0.02:99
-chr1 4028627 rs11586513 G A 570.71 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2205.25;QD=39.38;SB=-957.37 GT:AD:DP:GL:GQ 1/1:0,56:55:-224.12,-16.57,-0.01:99
-chr1 4029107 rs17404781 C A 590.07 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2642.82;QD=36.71;SB=-848.25 GT:AD:DP:GL:GQ 1/1:0,72:72:-267.88,-21.68,-0.02:99
-chr1 4029794 rs4603097 A G 153.18 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=2799.69;QD=36.36;SB=-819.68 GT:AD:DP:GL:GQ 1/1:1,76:76:-283.57,-22.89,-0.02:99
-chr1 4030208 rs4130940 A G 693.73 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3003.68;QD=34.53;SB=-1360.53 GT:AD:DP:GL:GQ 1/1:0,87:86:-303.98,-25.91,-0.03:99
-chr1 4030429 rs4130941 T C 169.61 PASS AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=60.00;MQ0=0;OQ=3432.78;QD=35.76;SB=-1689.36 GT:AD:DP:GL:GQ 1/1:0,96:95:-342.28,-28.61,-0.03:99
-chr1 4030544 rs4391636 T C 184.14 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2626.35;QD=31.27;SB=-1250.03 GT:AD:DP:GL:GQ 1/1:0,84:83:-266.29,-25.03,-0.07:99
-chr1 4030874 rs4262509 T C 686.40 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=2253.22;QD=36.34;SB=-816.67 GT:AD:DP:GL:GQ 1/1:0,62:62:-228.93,-18.68,-0.02:99
-chr1 4031041 rs4400586 C T 220 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=2740.70;QD=40.30;SB=-1397.85 GT:AD:DP:GL:GQ 1/1:0,68:68:-277.67,-20.48,-0.01:99
-chr1 4031109 rs7537141 A G 223.55 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.17;MQ=58.69;MQ0=0;OQ=2389.72;QD=33.66;SB=-1060.09 GT:AD:DP:GL:GQ 1/1:0,70:68:-242.58,-20.48,-0.02:99
-chr1 4031170 rs7537236 A G 284.86 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.42;MQ0=0;OQ=1865.29;QD=33.31;SB=-585.57 GT:AD:DP:GL:GQ 1/1:0,56:52:-190.13,-15.66,-0.02:99
-chr1 4031176 rs7537237 A G 151.85 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=58.47;MQ0=0;OQ=1912.22;QD=32.97;SB=-672.55 GT:AD:DP:GL:GQ 1/1:0,58:55:-194.84,-16.57,-0.03:99
-chr1 4031220 rs7532788 C T 294.77 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.01;MQ0=0;OQ=2323.83;QD=38.10;SB=-1060.94 GT:AD:DP:GL:GQ 1/1:0,60:59:-235.99,-17.78,-0.02:99
-chr1 4031586 rs3936238 A G 138.31 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.67;MQ=58.69;MQ0=0;OQ=2519.09;QD=35.48;SB=-1162.71 GT:AD:DP:GL:GQ 1/1:0,71:71:-255.52,-21.39,-0.03:99
-chr1 4031878 rs9628649 C T 644.41 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.66;MQ0=0;OQ=2284.52;QD=38.72;SB=-825.09 GT:AD:DP:GL:GQ 1/1:0,59:58:-232.06,-17.48,-0.02:99
-chr1 4031986 rs9628650 G T 130.41 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=59.09;MQ0=0;OQ=2689.72;QD=35.39;SB=-1301.17 GT:AD:DP:GL:GQ 1/1:0,75:74:-272.58,-22.29,-0.02:99
-chr1 4032433 rs7529548 G C 483.28 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=2621.92;QD=40.34;SB=-1086.06 GT:AD:DP:GL:GQ 1/1:0,65:62:-265.80,-18.69,-0.02:99
-chr1 4032637 rs7538658 C T 720.56 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2747.15;QD=39.25;SB=-1233.63 GT:AD:DP:GL:GQ 1/1:0,70:70:-278.33,-21.09,-0.03:99
-chr1 4032742 rs7529853 G C 195.26 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.01;HRun=0;HaplotypeScore=1.43;MQ=59.67;MQ0=0;OQ=2970.07;QD=42.43;SB=-1256.98 GT:AD:DP:GL:GQ 1/1:0,69:70:-300.61,-20.79,-0.02:99
-chr1 4032815 rs10157040 T G 55.91 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.79;MQ=60.00;MQ0=0;OQ=2073.63;QD=33.99;SB=-743.38 GT:AD:DP:GL:GQ 1/1:0,61:60:-210.97,-18.07,-0.02:99
-chr1 4032895 rs60405213 A G 332.98 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=1606.75;QD=29.75;SB=-645.91 GT:AD:DP:GL:GQ 1/1:0,54:50:-164.30,-15.08,-0.04:99
-chr1 4032956 rs10157057 T C 590.98 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=1852.28;QD=34.95;SB=-804.30 GT:AD:DP:GL:GQ 1/1:0,53:53:-188.83,-15.97,-0.02:99
-chr1 4033505 . A T 38.74 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=20;HaplotypeScore=16.08;MQ=50.01;MQ0=1;QD=0.73;SB=62.20 GT:AD:DP:GL:GQ 0/1:43,10:38:-18.61,-11.45,-119.32:71.58
-chr1 4035925 rs6686087 G A 676.98 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=1910.92;QD=36.06;SB=-777.68 GT:AD:DP:GL:GQ 1/1:0,53:52:-194.71,-15.68,-0.03:99
-chr1 4036210 rs7553013 A G 89.18 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=1455.02;QD=35.49;SB=-567.89 GT:AD:DP:GL:GQ 1/1:0,41:41:-149.10,-12.35,-0.01:99
-chr1 4037078 rs6671404 G A 595.18 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=49.26;MQ0=0;OQ=2338.43;QD=39.63;SB=-1084.95 GT:AD:DP:GL:GQ 1/1:0,59:59:-237.45,-17.77,-0.02:99
-chr1 4037233 . C T 0.09 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=10.47;MQ=23.53;MQ0=14;OQ=386.45;QD=7.43;SB=-174.70 GT:AD:DP:GL:GQ 0/1:24,28:16:-46.75,-4.82,-13.21:83.85
-chr1 4037300 rs12731949 G A 33.47 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=10.93;MQ=13.10;MQ0=15;QD=0.96;SB=-6.99 GT:AD:DP:GL:GQ 0/1:26,6:3:-7.53,-0.90,-3.57:26.65
-chr1 4037316 . A G 19.58 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=10.60;MQ0=15;QD=0.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,4:3:-6.14,-0.91,-2.76:18.51
-chr1 4037317 rs12747176 C T 33.48 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=4.32;MQ=10.78;MQ0=15;QD=1.20;SB=-10.00 GT:AD:DP:GL:GQ 0/1:25,3:3:-7.53,-0.90,-3.30:23.93
-chr1 4037349 rs55974954 C T 4.01 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=15.25;MQ0=10;OQ=78.13;QD=3.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:11,9:5:-12.60,-1.51,-5.79:42.85
-chr1 4037373 . C T 49.25 HARD_TO_VALIDATE;LowQual;SnpCluster AC=2;AF=1.00;AN=2;DP=23;Dels=0.09;HRun=0;HaplotypeScore=5.10;MQ=12.43;MQ0=14;QD=2.14;SB=-10.00 GT:AD:DP:GL:GQ 1/1:17,4:2:-8.33,-0.60,-0.00:6.02
-chr1 4037374 rs58910132 A G 67.17 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.10;HRun=0;HaplotypeScore=2.46;MQ=12.64;MQ0=13;QD=3.20;SB=-10.00 GT:AD:DP:GL:GQ 1/1:14,5:3:-10.21,-0.90,-0.00:9.03
-chr1 4037375 . C T 89.13 HARD_TO_VALIDATE;SnpCluster AC=2;AF=1.00;AN=2;DP=21;Dels=0.10;HRun=0;HaplotypeScore=2.62;MQ=12.64;MQ0=13;QD=4.24;SB=-10.00 GT:AD:DP:GL:GQ 1/1:14,5:3:-12.40,-0.90,-0.00:9.03
-chr1 4037523 . C T 36.25 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=8.14;MQ=8.07;MQ0=27;QD=0.91;SB=-10.00 GT:AD:DP:GL:GQ 0/1:35,5:3:-7.81,-0.90,-3.47:25.65
-chr1 4037532 . G A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=7.98;MQ=8.93;MQ0=30;OQ=75.12;QD=1.67;SB=-10.00 GT:AD:DP:GL:GQ 0/1:32,13:5:-12.30,-1.51,-6.19:46.86
-chr1 4037589 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=30.55;MQ=12.67;MQ0=42;OQ=141.32;QD=1.74;SB=-10.00 GT:AD:DP:GL:GQ 0/1:62,18:18:-22.84,-5.42,-40.02:99
-chr1 4037590 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=0;HaplotypeScore=31.66;MQ=13.12;MQ0=42;OQ=99.34;QD=1.18;SB=-10.00 GT:AD:DP:GL:GQ 0/1:65,14:18:-18.65,-5.43,-43.06:99
-chr1 4037755 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=10.80;MQ=28.57;MQ0=9;OQ=123.11;QD=4.25;SB=-10.00 GT:AD:DP:GL:GQ 0/1:16,13:15:-20.11,-4.52,-34.90:99
-chr1 4037764 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=27.02;MQ0=10;OQ=406.03;QD=10.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,21:18:-49.31,-5.43,-18.48:99
-chr1 4037797 . G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=82;Dels=0.00;HRun=1;HaplotypeScore=2.36;MQ=25.37;MQ0=16;OQ=242.41;QD=2.96;SB=-0.99 GT:AD:DP:GL:GQ 0/1:69,13:49:-42.29,-14.76,-143.27:99
-chr1 4037813 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=30.43;MQ=23.50;MQ0=19;OQ=796.43;QD=8.38;SB=2.04 GT:AD:DP:GL:GQ 0/1:48,46:55:-99.50,-16.57,-97.10:99
-chr1 4037822 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=126;Dels=0.00;HRun=0;HaplotypeScore=35.10;MQ=23.24;MQ0=31;OQ=606.69;QD=4.81;SB=-57.33 GT:AD:DP:GL:GQ 0/1:70,54:63:-82.95,-19.00,-147.74:99
-chr1 4037843 rs61768802 C A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=180;Dels=0.00;HRun=1;HaplotypeScore=17.92;MQ=21.78;MQ0=58;OQ=417.65;QD=2.32;SB=-34.91 GT:AD:DP:GL:GQ 0/1:148,32:87:-71.25,-26.21,-246.67:99
-chr1 4037880 rs61768803 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=196;Dels=0.00;HRun=0;HaplotypeScore=29.31;MQ=22.28;MQ0=61;OQ=120.84;QD=0.62;SB=11.02 GT:AD:DP:GL:GQ 0/1:165,26:69:-36.22,-20.85,-175.88:99
-chr1 4037929 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=2.77;MQ=21.90;MQ0=34;OQ=107.87;QD=1.14;SB=35.15 GT:AD:DP:GL:GQ 0/1:76,17:46:-27.95,-13.88,-137.64:99
-chr1 4037943 . C T 85.40 PASS AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=21.61;MQ0=16;OQ=809.30;QD=13.95;SB=-392.58 GT:AD:DP:GL:GQ 0/1:14,44:31:-93.56,-9.34,-20.82:99
-chr1 4037953 . T C 0.02 FDRtranche1.00to2.00 AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=3;HaplotypeScore=11.12;MQ=21.57;MQ0=12;OQ=534.72;QD=14.07;SB=-137.10 GT:AD:DP:GL:GQ 1/1:2,36:20:-60.44,-6.03,-3.38:26.46
-chr1 4037971 . G A 35.49 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=12;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=11.71;MQ0=7;QD=2.96;SB=-7.00 GT:AD:DP:GL:GQ 0/1:2,10:3:-7.73,-0.90,-2.97:20.65
-chr1 4038007 . C T 11.96 PASS AC=2;AF=1.00;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=24.37;MQ0=17;OQ=478.18;QD=12.58;SB=-0.67 GT:AD:DP:GL:GQ 1/1:9,29:15:-54.99,-4.52,-3.70:8.18
-chr1 4038085 . G A 6.73 PASS AC=2;AF=1.00;AN=2;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=25.54;MQ0=21;OQ=1434.12;QD=19.65;SB=-222.29 GT:AD:DP:GL:GQ 1/1:0,70:37:-147.01,-11.15,-0.01:99
-chr1 4038095 . A C 37.18 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=2;HaplotypeScore=5.05;MQ=31.28;MQ0=12;QD=0.48;SB=35.10 GT:AD:DP:GL:GQ 0/1:67,11:51:-22.37,-15.37,-153.89:70.01
-chr1 4038119 rs61768805 A G 52.49 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=34.39;MQ0=8;OQ=2201.59;QD=25.60;SB=-880.89 GT:AD:DP:GL:GQ 1/1:0,86:64:-223.78,-19.28,-0.04:99
-chr1 4038137 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=141;Dels=0.00;HRun=1;HaplotypeScore=16.06;MQ=35.46;MQ0=14;OQ=344.80;QD=2.45;SB=-97.28 GT:AD:DP:GL:GQ 0/1:105,36:95:-66.41,-28.65,-282.14:99
-chr1 4038181 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=266;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=35.03;MQ0=15;OQ=1093.66;QD=4.11;SB=-524.11 GT:AD:DP:GL:GQ 0/1:186,80:195:-171.41,-58.76,-524.00:99
-chr1 4038248 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=280;Dels=0.00;HRun=0;HaplotypeScore=30.85;MQ=29.46;MQ0=44;OQ=1065.01;QD=3.80;SB=-230.16 GT:AD:DP:GL:GQ 0/1:155,104:139:-156.85,-47.07,-312.49:99
-chr1 4038269 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=221;Dels=0.00;HRun=2;HaplotypeScore=13.90;MQ=27.15;MQ0=44;OQ=427.47;QD=1.93;SB=-154.75 GT:AD:DP:GL:GQ 0/1:158,62:110:-79.18,-33.15,-296.78:99
-chr1 4038306 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=30.95;MQ=24.15;MQ0=24;OQ=80.75;QD=0.71;SB=17.44 GT:AD:DP:GL:GQ 0/1:88,21:54:-27.64,-16.28,-152.20:99
-chr1 4038311 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=0;HaplotypeScore=30.17;MQ=23.18;MQ0=20;OQ=320.40;QD=3.56;SB=-113.10 GT:AD:DP:GL:GQ 0/1:60,30:46:-49.20,-13.87,-108.56:99
-chr1 4038321 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=3;HaplotypeScore=15.26;MQ=23.68;MQ0=14;OQ=766.53;QD=12.99;SB=-327.28 GT:AD:DP:GL:GQ 0/1:10,49:31:-89.28,-9.34,-16.69:73.43
-chr1 4038334 . G A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.69;MQ=25.40;MQ0=9;OQ=78.94;QD=1.49;SB=-27.72 GT:AD:DP:GL:GQ 0/1:40,11:25:-21.55,-10.37,-63.16:99
-chr1 4038397 . A G 17.54 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=29.53;MQ0=4;OQ=326.31;QD=7.42;SB=-58.84 GT:AD:DP:GL:GQ 0/1:24,20:28:-44.35,-8.44,-57.72:99
-chr1 4038422 rs61768806 G A 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=18.20;MQ=33.84;MQ0=4;OQ=183.71;QD=3.40;SB=-62.31 GT:AD:DP:GL:GQ 0/1:35,13:24:-31.46,-9.80,-50.09:99
-chr1 4038450 rs9426493 G A 0.12 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=7.50;MQ=40.53;MQ0=7;OQ=257.95;QD=3.31;SB=38.10 GT:AD:DP:GL:GQ 0/1:50,27:46:-42.95,-13.87,-108.04:99
-chr1 4038485 . T C 49.84 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=36.99;MQ=38.79;MQ0=13;QD=0.38;SB=-42.38 GT:AD:DP:GL:GQ 0/1:107,23:79:-32.08,-23.81,-273.26:82.67
-chr1 4038495 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=136;Dels=0.00;HRun=3;HaplotypeScore=26.37;MQ=38.36;MQ0=11;OQ=110.49;QD=0.81;SB=81.70 GT:AD:DP:GL:GQ 0/1:101,35:77:-37.55,-23.22,-250.69:99
-chr1 4038559 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=142;Dels=0.00;HRun=2;HaplotypeScore=4.40;MQ=37.40;MQ0=14;OQ=181.94;QD=1.28;SB=76.72 GT:AD:DP:GL:GQ 0/1:114,27:102:-52.21,-30.74,-302.69:99
-chr1 4038595 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=10.57;MQ=44.92;MQ0=10;OQ=118.91;QD=1.67;SB=44.58 GT:AD:DP:GL:GQ 0/1:49,22:52:-30.86,-15.68,-162.15:99
-chr1 4038920 rs12240075 G A 506.65 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.13;MQ0=0;OQ=3029.69;QD=39.35;SB=-1486.40 GT:AD:DP:GL:GQ 1/1:0,77:75:-306.57,-22.59,-0.02:99
-chr1 4039098 rs4073835 G A 496.74 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2305.48;QD=39.08;SB=-997.03 GT:AD:DP:GL:GQ 1/1:0,59:59:-234.15,-17.78,-0.02:99
-chr1 4039791 rs4639725 C T 236.18 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.86;MQ=59.67;MQ0=0;OQ=2672.94;QD=38.18;SB=-1315.36 GT:AD:DP:GL:GQ 1/1:0,70:69:-270.90,-20.79,-0.02:99
-chr1 4039890 rs4436359 C A 272.88 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=60.00;MQ0=0;OQ=1804.54;QD=34.70;SB=-797.85 GT:AD:DP:GL:GQ 1/1:1,51:51:-184.06,-15.36,-0.02:99
-chr1 4040736 rs6684922 G A 149.31 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=2464.15;QD=39.74;SB=-984.31 GT:AD:DP:GL:GQ 1/1:0,62:61:-250.01,-18.37,-0.01:99
-chr1 4041212 rs7418376 A G 9.41 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.36;MQ=59.69;MQ0=0;OQ=2587.00;QD=34.49;SB=-1318.64 GT:AD:DP:GL:GQ 1/1:0,75:71:-262.30,-21.38,-0.02:99
-chr1 4041774 rs6657076 T C 524.19 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=2268.81;QD=30.25;SB=-1070.20 GT:AD:DP:GL:GQ 1/1:0,75:71:-230.53,-21.41,-0.06:99
-chr1 4045735 rs10915422 A C 14.87 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=4.42;MQ=59.68;MQ0=0;OQ=2455.12;QD=33.63;SB=-728.83 GT:AD:DP:GL:GQ 1/1:0,73:71:-249.12,-21.38,-0.02:99
-chr1 4045888 rs10915423 A C 727.77 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2031.28;QD=35.02;SB=-998.12 GT:AD:DP:GL:GQ 1/1:0,58:58:-206.73,-17.47,-0.02:99
-chr1 4046948 rs10915425 T G 80.45 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=53.47;MQ0=0;OQ=1869.59;QD=31.69;SB=-736.37 GT:AD:DP:GL:GQ 1/1:0,59:55:-190.57,-16.57,-0.02:99
-chr1 4046996 rs55774050 C G 2240.61 Indel AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=9.46;MQ=51.11;MQ0=0;QD=43.09;SB=-978.74 GT:AD:DP:GL:GQ 1/1:0,52:52:-227.66,-15.67,-0.01:99
-chr1 4047821 rs11578552 T C 402.68 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=2100.45;QD=30.89;SB=-846.51 GT:AD:DP:GL:GQ 1/1:0,68:66:-213.69,-19.91,-0.06:99
-chr1 4047883 rs11577344 C T 490.32 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1935.40;QD=37.95;SB=-660.87 GT:AD:DP:GL:GQ 1/1:0,51:48:-197.13,-14.46,-0.01:99
-chr1 4049164 rs7411603 A G 3.63 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=6.69;MQ=58.71;MQ0=0;OQ=1270.28;QD=27.03;SB=-493.17 GT:AD:DP:GL:GQ 1/1:0,47:41:-130.65,-12.36,-0.04:99
-chr1 4050387 rs10753365 G A 99.83 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=58.61;MQ0=0;OQ=1534.51;QD=32.65;SB=-464.08 GT:AD:DP:GL:GQ 1/1:0,46:42:-157.07,-12.67,-0.03:99
-chr1 4051611 rs4548406 T C 78.22 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1346.57;QD=28.65;SB=-544.85 GT:AD:DP:GL:GQ 1/1:0,47:44:-138.29,-13.28,-0.05:99
-chr1 4051999 rs12123119 C T 624.91 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2169.89;QD=37.41;SB=-1044.39 GT:AD:DP:GL:GQ 1/1:0,58:55:-220.59,-16.57,-0.02:99
-chr1 4052066 rs4654410 C T 678.96 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=2087.99;QD=37.96;SB=-873.17 GT:AD:DP:GL:GQ 1/1:0,55:53:-212.40,-15.97,-0.02:99
-chr1 4052788 rs4481820 C A 313.17 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.81;MQ0=0;OQ=1188.08;QD=18.86;SB=-612.83 GT:AD:DP:GL:GQ 0/1:26,37:61:-140.47,-18.38,-73.47:99
-chr1 4052947 rs6676961 T G 272.74 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=1401.56;QD=15.75;SB=-713.67 GT:AD:DP:GL:GQ 0/1:39,50:87:-169.64,-26.20,-144.08:99
-chr1 4053067 rs12125719 A G 101.01 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.17;MQ0=0;OQ=1483.09;QD=29.08;SB=-606.95 GT:AD:DP:GL:GQ 1/1:0,51:48:-151.94,-14.48,-0.05:99
-chr1 4053090 rs12125725 A G 83.74 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.17;MQ0=0;OQ=1585.81;QD=31.09;SB=-493.18 GT:AD:DP:GL:GQ 1/1:0,51:49:-162.20,-14.77,-0.03:99
-chr1 4053122 rs12126649 T C 176.61 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.71;MQ=59.24;MQ0=0;OQ=907.97;QD=14.88;SB=-331.31 GT:AD:DP:GL:GQ 0/1:25,36:59:-111.87,-17.79,-96.53:99
-chr1 4055170 rs12033210 T C 0.60 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=28.53;MQ0=2;OQ=209.19;QD=4.65;SB=-102.57 GT:AD:DP:GL:GQ 0/1:32,13:39:-35.96,-11.75,-110.64:99
-chr1 4056038 rs10799198 G A 260.47 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.90;MQ=58.67;MQ0=0;OQ=782.28;QD=15.96;SB=-386.17 GT:AD:DP:GL:GQ 0/1:25,24:47:-95.68,-14.17,-75.73:99
-chr1 4057058 rs4600014 A G 442.87 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=917.69;QD=13.70;SB=-389.30 GT:AD:DP:GL:GQ 0/1:34,33:66:-114.93,-19.88,-136.81:99
-chr1 4057633 rs4361964 G C 120.54 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.73;MQ=59.22;MQ0=0;OQ=837.80;QD=15.51;SB=-437.88 GT:AD:DP:GL:GQ 0/1:29,25:53:-103.04,-15.97,-126.00:99
-chr1 4057702 rs4351611 C T 297.44 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.56;MQ0=0;OQ=594.05;QD=11.21;SB=-284.78 GT:AD:DP:GL:GQ 0/1:33,20:53:-78.67,-15.98,-105.42:99
-chr1 4057917 . A T 65.58 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.62;MQ0=0;OQ=752.30;QD=12.54;SB=-170.72 GT:AD:DP:GL:GQ 0/1:33,27:58:-95.98,-17.47,-122.23:99
-chr1 4058815 rs10915428 G T 369.02 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.39;MQ0=0;OQ=1224.65;QD=16.11;SB=-630.74 GT:AD:DP:GL:GQ 0/1:35,41:75:-148.34,-22.59,-115.71:99
-chr1 4059239 rs10799199 C T 251.96 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.66;MQ0=0;OQ=1243.57;QD=18.84;SB=-304.82 GT:AD:DP:GL:GQ 0/1:29,37:64:-146.92,-19.28,-100.42:99
-chr1 4059378 . C T 11.57 PASS AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=59.47;MQ0=0;OQ=1236.26;QD=14.72;SB=-551.55 GT:AD:DP:GL:GQ 0/1:45,38:82:-151.61,-24.70,-168.36:99
-chr1 4060338 rs10799200 T C 170.59 PASS AC=1;AF=0.50;AN=2;DB;DP=20;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=152.75;QD=7.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:13,7:19:-24.28,-5.72,-48.27:99
-chr1 4064782 rs61768818 G A 481.48 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.07;MQ0=0;OQ=848.15;QD=13.90;SB=-350.47 GT:AD:DP:GL:GQ 0/1:34,27:59:-105.87,-17.77,-118.54:99
-chr1 4066674 rs12032257 C T 294.19 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.36;MQ0=0;OQ=916.01;QD=14.09;SB=-410.80 GT:AD:DP:GL:GQ 0/1:35,30:64:-114.18,-19.29,-113.47:99
-chr1 4067283 . T C 0.61 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=2;HaplotypeScore=4.39;MQ=59.62;MQ0=0;OQ=557.04;QD=9.13;SB=-241.90 GT:AD:DP:GL:GQ 0/1:35,25:58:-76.48,-17.49,-133.72:99
-chr1 4067926 rs7542313 A G 387.57 PASS AC=1;AF=0.50;AN=2;DB;DP=21;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=220.94;QD=10.52;SB=-100.82 GT:AD:DP:GL:GQ 0/1:11,10:19:-31.10,-5.72,-40.90:99
-chr1 4075727 . C T 158.87 PASS AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.34;MQ=59.67;MQ0=0;OQ=1143.65;QD=16.34;SB=-503.75 GT:AD:DP:GL:GQ 0/1:35,35:66:-137.54,-19.89,-102.02:99
-chr1 4075966 rs6670920 T C 606.24 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=1104.32;QD=15.13;SB=-452.80 GT:AD:DP:GL:GQ 0/1:30,43:71:-135.11,-21.40,-121.92:99
-chr1 4077630 rs4654486 G A 691.51 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2711.47;QD=39.87;SB=-1087.95 GT:AD:DP:GL:GQ 1/1:0,68:68:-274.75,-20.48,-0.02:99
-chr1 4078163 rs10737402 T C 504.16 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=530.04;QD=10.82;SB=-231.26 GT:AD:DP:GL:GQ 0/1:26,23:49:-71.06,-14.78,-100.24:99
-chr1 4080498 rs12042946 T C 249.02 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=60.30;MQ0=0;OQ=891.53;QD=12.56;SB=-237.45 GT:AD:DP:GL:GQ 0/1:37,34:69:-113.22,-20.78,-148.64:99
-chr1 4080702 rs12040805 C T 139.94 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.60;MQ0=0;OQ=776.81;QD=15.54;SB=-108.61 GT:AD:DP:GL:GQ 0/1:26,24:46:-94.83,-13.87,-71.68:99
-chr1 4081256 rs10753367 T C 35.67 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=3;HaplotypeScore=2.04;MQ=59.74;MQ0=0;OQ=1167.96;QD=12.98;SB=-513.88 GT:AD:DP:GL:GQ 0/1:48,42:88:-146.59,-26.51,-188.24:99
-chr1 4081433 rs10799203 T G 17.84 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.59;MQ0=0;OQ=328.89;QD=7.15;SB=-123.86 GT:AD:DP:GL:GQ 0/1:29,17:43:-49.13,-12.95,-102.00:99
-chr1 4082645 rs4400585 G T 491.60 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=492.73;QD=10.71;SB=-210.53 GT:AD:DP:GL:GQ 0/1:27,19:44:-65.81,-13.26,-82.00:99
-chr1 4082866 rs10915437 A G 75.21 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=4.59;MQ=58.36;MQ0=0;OQ=891.90;QD=12.56;SB=-289.16 GT:AD:DP:GL:GQ 0/1:37,34:68:-112.97,-20.49,-138.67:99
-chr1 4083359 rs56090673 C T 320.01 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1009.69;QD=17.11;SB=-451.46 GT:AD:DP:GL:GQ 0/1:27,32:58:-121.73,-17.48,-93.77:99
-chr1 4083978 rs7531421 A G 116.24 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=57.42;MQ0=0;OQ=435.48;QD=7.02;SB=-215.25 GT:AD:DP:GL:GQ 0/1:41,21:60:-64.91,-18.08,-162.54:99
-chr1 4084862 rs6675734 C T 47.52 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.09;MQ=59.20;MQ0=0;OQ=1105.86;QD=19.07;SB=-554.64 GT:AD:DP:GL:GQ 0/1:25,33:57:-131.05,-17.18,-82.44:99
-chr1 4084986 rs10753368 A G 566.85 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1198.41;QD=14.10;SB=-565.61 GT:AD:DP:GL:GQ 0/1:44,41:83:-148.13,-25.00,-168.94:99
-chr1 4085630 rs6679136 C T 24.06 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=4.32;MQ=58.42;MQ0=0;OQ=804.43;QD=14.36;SB=-252.24 GT:AD:DP:GL:GQ 0/1:29,27:53:-99.70,-15.97,-99.87:99
-chr1 4085663 rs6669476 G A 136.10 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.26;MQ=57.81;MQ0=0;OQ=833.61;QD=13.89;SB=-171.20 GT:AD:DP:GL:GQ 0/1:32,27:56:-103.51,-16.87,-106.04:99
-chr1 4086169 rs6426389 C T 138.99 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.83;MQ=59.69;MQ0=0;OQ=1183.25;QD=19.72;SB=-609.44 GT:AD:DP:GL:GQ 0/1:26,34:60:-139.68,-18.07,-94.16:99
-chr1 4086333 rs6663976 C G 599.30 PASS AC=2;AF=1.00;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=3962.79;QD=44.03;SB=-1451.88 GT:AD:DP:GL:GQ 1/1:0,90:89:-395.28,-26.81,-0.02:99
-chr1 4087812 rs4654487 T C 259.04 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=59.52;MQ0=0;OQ=1480.85;QD=30.85;SB=-766.73 GT:AD:DP:GL:GQ 1/1:0,48:47:-151.71,-14.17,-0.04:99
-chr1 4089403 . G C 16.75 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.80;MQ=58.74;MQ0=0;QD=0.45;SB=53.21 GT:AD:DP:GL:GQ 0/1:27,10:26:-12.79,-7.84,-102.04:49.49
-chr1 4089489 rs7536041 T C 90.49 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=59.19;MQ0=0;OQ=812.10;QD=15.62;SB=-146.31 GT:AD:DP:GL:GQ 0/1:23,29:51:-99.86,-15.37,-93.49:99
-chr1 4090545 rs4282783 T G 725.47 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2332.11;QD=35.34;SB=-970.80 GT:AD:DP:GL:GQ 1/1:0,66:66:-236.81,-19.88,-0.02:99
-chr1 4091584 rs4654488 A T 219.84 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=2.30;MQ=60.00;MQ0=0;OQ=743.21;QD=16.52;SB=-370.44 GT:AD:DP:GL:GQ 0/1:20,25:44:-90.86,-13.25,-75.80:99
-chr1 4092168 rs10915441 C G 2.97 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=4;HaplotypeScore=3.62;MQ=59.69;MQ0=0;OQ=1389.48;QD=18.78;SB=-645.48 GT:AD:DP:GL:GQ 0/1:35,39:69:-163.06,-20.83,-116.77:99
-chr1 4092567 rs10915442 A G 394.78 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.42;MQ0=0;OQ=572.04;QD=14.30;SB=-311.22 GT:AD:DP:GL:GQ 0/1:18,22:39:-72.24,-11.76,-67.58:99
-chr1 4093270 rs10799206 C G 674.75 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.42;MQ0=0;OQ=2045.47;QD=38.59;SB=-902.40 GT:AD:DP:GL:GQ 1/1:0,52:50:-208.16,-15.07,-0.02:99
-chr1 4093286 rs12409803 G A 414.64 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=57.03;MQ0=0;OQ=773.71;QD=14.33;SB=-322.45 GT:AD:DP:GL:GQ 0/1:28,26:51:-96.03,-15.38,-79.04:99
-chr1 4093324 rs10915443 G C 254.64 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=58.02;MQ0=0;OQ=1430.72;QD=20.15;SB=-674.45 GT:AD:DP:GL:GQ 0/1:30,40:69:-167.15,-20.79,-134.28:99
-chr1 4093733 rs6693173 A G 464.34 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1381.36;QD=28.78;SB=-644.93 GT:AD:DP:GL:GQ 1/1:0,48:45:-141.76,-13.57,-0.04:99
-chr1 4094457 rs4131506 A C 340.66 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.60;MQ0=0;OQ=704.94;QD=12.15;SB=-316.99 GT:AD:DP:GL:GQ 0/1:32,26:58:-91.25,-17.47,-120.43:99
-chr1 4094660 rs4131508 A G 571.17 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=1332.71;QD=17.31;SB=-634.89 GT:AD:DP:GL:GQ 0/1:33,44:77:-159.75,-23.19,-134.55:99
-chr1 4094683 rs4630099 A G 443.98 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1288.63;QD=16.31;SB=-670.63 GT:AD:DP:GL:GQ 0/1:36,43:77:-155.34,-23.19,-143.15:99
-chr1 4095397 rs10915444 T C 1.76 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=8.82;MQ=58.53;MQ0=0;OQ=789.45;QD=10.25;SB=-380.13 GT:AD:DP:GL:GQ 0/1:49,28:72:-103.91,-21.68,-179.32:99
-chr1 4095558 rs35986531 G A 271.33 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.49;MQ=56.64;MQ0=0;OQ=1336.75;QD=16.71;SB=-522.69 GT:AD:DP:GL:GQ 0/1:36,44:75:-159.55,-22.59,-133.47:99
-chr1 4095815 rs12118815 A T 0.50 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=1;HaplotypeScore=13.10;MQ=57.70;MQ0=3;OQ=1249.48;QD=13.88;SB=-570.06 GT:AD:DP:GL:GQ 0/1:44,46:80:-152.33,-24.10,-146.70:99
-chr1 4095919 . A T 39.64 LowQual AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=51.56;MQ0=5;QD=0.50;SB=-37.91 GT:AD:DP:GL:GQ 0/1:71,9:66:-27.13,-19.88,-223.94:72.48
-chr1 4096225 . A G 48.26 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.44;MQ=52.24;MQ0=7;QD=0.68;SB=74.28 GT:AD:DP:GL:GQ 0/1:64,7:63:-27.09,-18.98,-229.53:81.10
-chr1 4096236 . T G 0.06 PASS AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=54.07;MQ0=3;OQ=91.64;QD=1.31;SB=86.24 GT:AD:DP:GL:GQ 0/1:61,9:66:-32.33,-19.88,-208.22:99
-chr1 4096240 . A T 0.08 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=53.91;MQ0=2;OQ=161.77;QD=2.16;SB=86.29 GT:AD:DP:GL:GQ 0/1:64,11:72:-41.14,-21.68,-231.71:99
-chr1 4096257 . A T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.00;MQ=53.32;MQ0=2;OQ=207.48;QD=2.56;SB=92.31 GT:AD:DP:GL:GQ 0/1:68,13:79:-47.82,-23.79,-251.49:99
-chr1 4096278 . A G 232.76 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=27.32;MQ=52.46;MQ0=1;QD=2.68;SB=98.35 GT:AD:DP:GL:GQ 0/1:72,15:85:-52.16,-25.60,-288.15:99
-chr1 4096286 . G A 106.04 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=90;Dels=0.00;HRun=1;HaplotypeScore=48.93;MQ=51.56;MQ0=1;QD=1.18;SB=98.32 GT:AD:DP:GL:GQ 0/1:78,12:85:-39.49,-25.60,-276.62:99
-chr1 4096288 rs34088827 G A 955.67 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=1;HaplotypeScore=48.46;MQ=51.26;MQ0=1;QD=10.62;SB=-379.33 GT:AD:DP:GL:GQ 0/1:57,33:88:-125.36,-26.51,-207.05:99
-chr1 4096294 . A T 86.31 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=1;HaplotypeScore=32.32;MQ=50.46;MQ0=1;QD=0.97;SB=89.30 GT:AD:DP:GL:GQ 0/1:73,16:80:-36.01,-24.10,-264.64:99
-chr1 4096606 rs28726337 A G 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=2;HaplotypeScore=13.44;MQ=43.57;MQ0=1;OQ=262.51;QD=2.76;SB=-123.92 GT:AD:DP:GL:GQ 0/1:75,20:86:-55.44,-25.91,-287.10:99
-chr1 4096617 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=1;HaplotypeScore=34.91;MQ=42.33;MQ0=1;OQ=1160.59;QD=10.01;SB=-606.06 GT:AD:DP:GL:GQ 0/1:70,46:109:-152.17,-32.83,-258.54:99
-chr1 4096620 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=123;Dels=0.01;HRun=0;HaplotypeScore=30.11;MQ=42.25;MQ0=1;OQ=989.14;QD=8.04;SB=-388.23 GT:AD:DP:GL:GQ 0/1:72,50:106:-134.12,-31.93,-263.47:99
-chr1 4096638 rs28412783 C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=181;Dels=0.02;HRun=0;HaplotypeScore=64.64;MQ=40.70;MQ0=1;OQ=1178.07;QD=6.51;SB=-446.63 GT:AD:DP:GL:GQ 0/1:123,47:169:-194.38,-73.29,-545.37:99
-chr1 4096655 rs61768832 A G 321.42 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=228;Dels=0.00;HRun=1;HaplotypeScore=261.82;MQ=41.93;MQ0=0;QD=1.41;SB=-157.54 GT:AD:DP:GL:GQ 0/1:199,29:224:-102.90,-67.48,-791.83:99
-chr1 4096678 . T G 1342.80 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=236;Dels=0.00;HRun=0;HaplotypeScore=216.99;MQ=43.01;MQ0=0;QD=5.69;SB=-512.77 GT:AD:DP:GL:GQ 0/1:166,63:218:-227.86,-90.30,-587.53:99
-chr1 4096685 . A G 1626.24 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=239;Dels=0.00;HRun=1;HaplotypeScore=162.66;MQ=41.97;MQ0=0;QD=6.80;SB=-808.35 GT:AD:DP:GL:GQ 0/1:167,72:225:-233.68,-67.78,-652.24:99
-chr1 4096698 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=228;Dels=0.00;HRun=0;HaplotypeScore=76.98;MQ=42.62;MQ0=0;OQ=2269.48;QD=9.95;SB=-1066.45 GT:AD:DP:GL:GQ 0/1:129,90:219:-325.16,-94.93,-493.11:99
-chr1 4096706 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=1;HaplotypeScore=79.95;MQ=43.15;MQ0=0;OQ=1034.27;QD=4.50;SB=-170.01 GT:AD:DP:GL:GQ 0/1:185,45:223:-173.88,-67.17,-658.24:99
-chr1 4096718 rs61768834 G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=216;Dels=0.00;HRun=0;HaplotypeScore=38.48;MQ=44.61;MQ0=0;OQ=645.34;QD=2.99;SB=-265.93 GT:AD:DP:GL:GQ 0/1:168,32:157:-165.70,-97.89,-554.00:99
-chr1 4096731 . G A 559.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=179;Dels=0.00;HRun=1;HaplotypeScore=83.54;MQ=45.39;MQ0=0;QD=3.13;SB=44.95 GT:AD:DP:GL:GQ 0/1:150,29:155:-105.94,-46.69,-468.61:99
-chr1 4096732 rs61768835 A G 2251.43 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=171;Dels=0.00;HRun=2;HaplotypeScore=115.12;MQ=45.31;MQ0=0;QD=13.17;SB=-1083.79 GT:AD:DP:GL:GQ 0/1:80,91:158:-276.04,-47.61,-312.72:99
-chr1 4096736 rs61768836 A G 2066.81 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.02;HRun=0;HaplotypeScore=91.40;MQ=45.63;MQ0=0;QD=12.23;SB=-1029.89 GT:AD:DP:GL:GQ 0/1:85,81:160:-257.27,-47.30,-336.21:99
-chr1 4096755 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=129;Dels=0.00;HRun=1;HaplotypeScore=46.33;MQ=46.26;MQ0=0;OQ=201.55;QD=1.56;SB=65.52 GT:AD:DP:GL:GQ 0/1:112,17:113:-57.49,-34.05,-383.82:99
-chr1 4096759 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=124;Dels=0.00;HRun=0;HaplotypeScore=42.17;MQ=46.84;MQ0=0;OQ=310.94;QD=2.51;SB=-151.81 GT:AD:DP:GL:GQ 0/1:106,18:122:-71.13,-36.75,-367.88:99
-chr1 4096775 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=113;Dels=0.00;HRun=0;HaplotypeScore=30.95;MQ=47.51;MQ0=0;OQ=647.24;QD=5.73;SB=52.09 GT:AD:DP:GL:GQ 0/1:87,26:107:-100.24,-32.23,-298.38:99
-chr1 4096805 . A G 20.07 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=109;Dels=0.00;HRun=1;HaplotypeScore=14.94;MQ=48.07;MQ0=0;QD=0.18;SB=107.37 GT:AD:DP:GL:GQ 0/1:94,15:99:-35.11,-29.83,-355.50:52.86
-chr1 4096811 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=105;Dels=0.00;HRun=1;HaplotypeScore=14.56;MQ=47.07;MQ0=0;OQ=301.49;QD=2.87;SB=92.31 GT:AD:DP:GL:GQ 0/1:85,20:99:-63.26,-29.83,-325.00:99
-chr1 4096845 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=27.21;MQ=46.78;MQ0=0;OQ=135.08;QD=1.34;SB=107.37 GT:AD:DP:GL:GQ 0/1:86,15:98:-46.31,-29.52,-344.47:99
-chr1 4096895 rs6702633 G A 282.98 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=48.03;MQ0=0;OQ=1209.14;QD=19.50;SB=-562.59 GT:AD:DP:GL:GQ 0/1:26,36:60:-142.27,-18.07,-91.55:99
-chr1 4097116 rs6663939 C T 575.23 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1353.52;QD=17.35;SB=-623.00 GT:AD:DP:GL:GQ 0/1:38,40:78:-162.13,-23.49,-140.27:99
-chr1 4097278 rs4408122 C T 90.17 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=3.55;MQ=60.00;MQ0=0;OQ=1285.61;QD=19.78;SB=-663.71 GT:AD:DP:GL:GQ 0/1:26,39:64:-151.13,-19.28,-94.25:99
-chr1 4097502 rs10915445 G A 15.47 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=4.76;MQ=58.14;MQ0=0;OQ=1551.73;QD=21.26;SB=-659.25 GT:AD:DP:GL:GQ 0/1:29,44:69:-179.24,-20.78,-91.34:99
-chr1 4097702 rs4233259 G A 393.71 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.88;MQ0=0;OQ=488.96;QD=11.64;SB=-238.49 GT:AD:DP:GL:GQ 0/1:23,19:39:-63.93,-11.75,-79.38:99
-chr1 4097847 rs4233260 A G 265.81 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=58.25;MQ0=0;OQ=841.80;QD=15.31;SB=-425.02 GT:AD:DP:GL:GQ 0/1:21,34:53:-103.45,-15.98,-81.47:99
-chr1 4098460 rs4654489 C T 575.94 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1233.62;QD=17.37;SB=-483.09 GT:AD:DP:GL:GQ 0/1:34,37:71:-148.05,-21.40,-108.91:99
-chr1 4098462 rs4654412 C G 408.58 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=1295.21;QD=18.24;SB=-423.31 GT:AD:DP:GL:GQ 0/1:36,35:70:-153.90,-21.10,-151.48:99
-chr1 4098561 rs4654490 T C 109.69 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=5.61;MQ=59.35;MQ0=0;OQ=707.20;QD=11.05;SB=-320.12 GT:AD:DP:GL:GQ 0/1:35,29:62:-92.69,-18.69,-135.70:99
-chr1 4098636 rs4654491 A T 298.65 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.55;MQ=58.32;MQ0=0;OQ=679.16;QD=12.81;SB=-348.54 GT:AD:DP:GL:GQ 0/1:28,25:51:-86.56,-15.36,-108.00:99
-chr1 4101675 rs4654492 C T 166.06 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=985.64;QD=17.92;SB=-310.22 GT:AD:DP:GL:GQ 0/1:24,31:53:-117.81,-15.96,-85.09:99
-chr1 4102203 rs10799207 G A 234.26 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=645.03;QD=15.36;SB=-340.37 GT:AD:DP:GL:GQ 0/1:22,20:41:-80.15,-12.36,-66.12:99
-chr1 4102678 rs7542208 A G 473.41 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.58;MQ0=0;OQ=945.73;QD=14.78;SB=-439.91 GT:AD:DP:GL:GQ 0/1:26,38:62:-116.54,-18.69,-104.23:99
-chr1 4102853 rs12143662 C T 77.17 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=2;HaplotypeScore=3.06;MQ=59.31;MQ0=0;OQ=653.08;QD=14.51;SB=-306.78 GT:AD:DP:GL:GQ 0/1:23,22:43:-81.54,-12.95,-84.16:99
-chr1 4103423 rs12096127 C T 146.81 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=3;HaplotypeScore=0.93;MQ=59.48;MQ0=0;OQ=1299.31;QD=16.24;SB=-452.94 GT:AD:DP:GL:GQ 0/1:42,38:79:-157.01,-23.79,-152.41:99
-chr1 4104350 . G A 39.75 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=0;HaplotypeScore=50.14;MQ=43.88;MQ0=0;QD=0.41;SB=41.13 GT:AD:DP:GL:GQ 0/1:55,43:59:-25.05,-17.79,-166.63:72.58
-chr1 4104372 . C A 158.64 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=134;Dels=0.00;HRun=1;HaplotypeScore=261.20;MQ=40.26;MQ0=0;QD=1.18;SB=50.16 GT:AD:DP:GL:GQ 0/1:118,16:102:-49.87,-30.72,-316.01:99
-chr1 4104378 . T C 1045.41 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=132;Dels=0.09;HRun=0;HaplotypeScore=252.28;MQ=39.40;MQ0=0;QD=7.92;SB=47.18 GT:AD:DP:GL:GQ 0/1:70,50:112:-140.05,-32.23,-268.85:99
-chr1 4104379 . G A 1387.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=131;Dels=0.09;HRun=0;HaplotypeScore=164.33;MQ=39.20;MQ0=0;QD=10.59;SB=44.10 GT:AD:DP:GL:GQ 0/1:65,54:109:-173.34,-31.33,-223.67:99
-chr1 4104399 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=192;Dels=0.00;HRun=0;HaplotypeScore=398.28;MQ=38.87;MQ0=2;OQ=296.43;QD=1.54;SB=-98.03 GT:AD:DP:GL:GQ 0/1:164,28:154:-79.31,-46.39,-472.12:99
-chr1 4104401 rs61768839 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=194;Dels=0.00;HRun=0;HaplotypeScore=419.03;MQ=39.00;MQ0=2;OQ=166.93;QD=0.86;SB=-91.09 GT:AD:DP:GL:GQ 0/1:156,37:153:-66.06,-46.09,-471.26:99
-chr1 4104420 rs56397723 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=252;Dels=0.01;HRun=1;HaplotypeScore=92.55;MQ=41.09;MQ0=3;OQ=4650.56;QD=18.45;SB=-702.42 GT:AD:DP:GL:GQ 0/1:91,159:212:-464.06,-63.56,-317.29:99
-chr1 4104448 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=303;Dels=0.00;HRun=1;HaplotypeScore=67.42;MQ=41.21;MQ0=8;OQ=4147.70;QD=13.69;SB=-263.14 GT:AD:DP:GL:GQ 0/1:172,131:260:-413.77,-78.32,-559.37:99
-chr1 4104453 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=303;Dels=0.00;HRun=0;HaplotypeScore=122.24;MQ=41.63;MQ0=7;OQ=1110.55;QD=3.67;SB=-37.03 GT:AD:DP:GL:GQ 0/1:232,70:246:-188.46,-74.12,-759.14:99
-chr1 4104461 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=296;Dels=0.01;HRun=1;HaplotypeScore=119.61;MQ=41.59;MQ0=7;OQ=214.27;QD=0.72;SB=-23.14 GT:AD:DP:GL:GQ 0/1:251,42:244:-97.34,-72.63,-828.00:99
-chr1 4104464 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=293;Dels=0.00;HRun=0;HaplotypeScore=47.37;MQ=41.56;MQ0=7;OQ=330.17;QD=1.13;SB=-9.81 GT:AD:DP:GL:GQ 0/1:251,41:246:-110.42,-74.12,-748.00:99
-chr1 4104493 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=213;Dels=0.00;HRun=1;HaplotypeScore=30.82;MQ=42.50;MQ0=6;OQ=2710.70;QD=12.73;SB=-739.33 GT:AD:DP:GL:GQ 0/1:93,120:174:-326.79,-52.44,-298.85:99
-chr1 4104517 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=157;Dels=0.00;HRun=0;HaplotypeScore=91.08;MQ=42.89;MQ0=5;OQ=579.51;QD=3.69;SB=-277.61 GT:AD:DP:GL:GQ 0/1:123,34:134:-101.62,-40.38,-368.83:99
-chr1 4104540 rs62641248 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=101.41;MQ=39.74;MQ0=1;OQ=311.08;QD=3.34;SB=-25.45 GT:AD:DP:GL:GQ 0/1:75,18:80:-58.50,-24.10,-250.10:99
-chr1 4104551 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=87.22;MQ=37.20;MQ0=4;OQ=331.14;QD=4.87;SB=-44.20 GT:AD:DP:GL:GQ 0/1:51,17:54:-52.67,-16.27,-140.50:99
-chr1 4104561 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=32.90;MQ=39.14;MQ0=4;OQ=99.56;QD=1.56;SB=92.30 GT:AD:DP:GL:GQ 0/1:53,11:58:-30.72,-17.48,-172.38:99
-chr1 4104601 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=204;Dels=0.00;HRun=0;HaplotypeScore=38.41;MQ=39.91;MQ0=6;OQ=155.34;QD=0.76;SB=68.34 GT:AD:DP:GL:GQ 0/1:183,21:180:-73.04,-54.23,-586.07:99
-chr1 4104605 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=211;Dels=0.00;HRun=1;HaplotypeScore=39.02;MQ=40.58;MQ0=6;OQ=226.77;QD=1.07;SB=164.51 GT:AD:DP:GL:GQ 0/1:188,23:190:-83.19,-57.23,-627.45:99
-chr1 4104633 rs56023565 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=168;Dels=0.00;HRun=0;HaplotypeScore=43.28;MQ=41.56;MQ0=5;OQ=1077.06;QD=6.41;SB=128.56 GT:AD:DP:GL:GQ 0/1:117,50:150:-156.17,-45.18,-408.43:99
-chr1 4104638 rs62641251 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=155;Dels=0.00;HRun=1;HaplotypeScore=82.61;MQ=42.16;MQ0=4;OQ=1017.44;QD=6.56;SB=-202.97 GT:AD:DP:GL:GQ 0/1:99,56:128:-143.60,-38.57,-325.85:99
-chr1 4104646 rs56328141 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=133;Dels=0.05;HRun=0;HaplotypeScore=83.44;MQ=42.94;MQ0=3;OQ=598.93;QD=4.50;SB=-113.26 GT:AD:DP:GL:GQ 0/1:76,33:104:-104.27,-41.10,-292.97:99
-chr1 4104661 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=114;Dels=0.03;HRun=0;HaplotypeScore=168.88;MQ=43.79;MQ0=2;OQ=339.54;QD=2.98;SB=-7.31 GT:AD:DP:GL:GQ 0/1:92,17:99:-69.57,-32.33,-280.39:99
-chr1 4104695 rs58865682 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=107;Dels=0.00;HRun=0;HaplotypeScore=26.95;MQ=46.39;MQ0=1;OQ=148.27;QD=1.39;SB=113.35 GT:AD:DP:GL:GQ 0/1:90,17:100:-48.23,-30.12,-318.63:99
-chr1 4104698 rs59763636 A C 13.51 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=104;Dels=0.00;HRun=0;HaplotypeScore=26.94;MQ=46.80;MQ0=1;QD=0.13;SB=110.36 GT:AD:DP:GL:GQ 0/1:87,17:97:-33.83,-29.22,-321.32:46.15
-chr1 4104799 rs56113813 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=1;HaplotypeScore=110.54;MQ=45.23;MQ0=4;OQ=195.94;QD=2.13;SB=86.31 GT:AD:DP:GL:GQ 0/1:78,14:77:-46.07,-23.20,-257.99:99
-chr1 4106070 rs9426471 T C 595.81 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=1098.91;QD=16.16;SB=-453.97 GT:AD:DP:GL:GQ 0/1:32,36:68:-133.66,-20.48,-129.09:99
-chr1 4106148 rs9426494 C T 344.56 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=60.00;MQ0=0;OQ=1566.25;QD=17.40;SB=-768.74 GT:AD:DP:GL:GQ 0/1:44,46:88:-186.42,-26.51,-142.07:99
-chr1 4107203 rs6680278 C T 328.94 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.92;MQ0=0;OQ=777.87;QD=13.89;SB=-285.17 GT:AD:DP:GL:GQ 0/1:32,24:55:-97.64,-16.57,-110.93:99
-chr1 4107258 rs6672998 G A 334.86 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=520.45;QD=13.01;SB=-193.18 GT:AD:DP:GL:GQ 0/1:23,17:40:-67.38,-12.05,-82.67:99
-chr1 4107272 rs17406305 C T 361.32 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=435.04;QD=9.89;SB=-220.70 GT:AD:DP:GL:GQ 0/1:26,18:41:-59.15,-12.36,-84.72:99
-chr1 4108156 rs7528351 G A 171.64 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=978.84;QD=16.88;SB=-340.32 GT:AD:DP:GL:GQ 0/1:29,29:58:-118.64,-17.47,-104.14:99
-chr1 4108402 rs7539733 C T 327.50 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=58.92;MQ0=0;OQ=799.67;QD=15.38;SB=-336.43 GT:AD:DP:GL:GQ 0/1:24,28:47:-97.41,-14.16,-80.03:99
-chr1 4108778 rs9426495 G A 284.61 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=3.59;MQ=59.34;MQ0=0;OQ=895.14;QD=14.21;SB=-321.33 GT:AD:DP:GL:GQ 0/1:34,29:62:-111.48,-18.68,-120.65:99
-chr1 4108797 rs9426472 G C 415.96 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.27;MQ0=0;OQ=1011.60;QD=17.75;SB=-519.74 GT:AD:DP:GL:GQ 0/1:27,30:53:-120.42,-15.97,-106.06:99
-chr1 4109900 . A G 31.51 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=2;HaplotypeScore=6.53;MQ=57.95;MQ0=0;QD=0.55;SB=59.23 GT:AD:DP:GL:GQ 0/1:35,22:36:-17.29,-10.85,-119.86:64.34
-chr1 4110024 rs6690263 C T 117.28 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=1118.91;QD=21.11;SB=-400.94 GT:AD:DP:GL:GQ 0/1:20,32:53:-134.68,-19.51,-68.02:99
-chr1 4110064 rs6695126 A G 708.48 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1770.58;QD=35.41;SB=-875.05 GT:AD:DP:GL:GQ 1/1:0,50:50:-180.66,-15.06,-0.02:99
-chr1 4110262 rs6683453 G A 435.74 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.65;MQ0=0;OQ=1205.59;QD=18.27;SB=-574.05 GT:AD:DP:GL:GQ 0/1:29,37:64:-143.13,-19.28,-100.61:99
-chr1 4110315 rs9426473 G A 464.67 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=896.46;QD=18.68;SB=-396.93 GT:AD:DP:GL:GQ 0/1:19,29:46:-106.79,-13.86,-67.55:99
-chr1 4110338 rs9426496 A G 430.77 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=545.25;QD=11.36;SB=-275.98 GT:AD:DP:GL:GQ 0/1:25,23:47:-71.97,-14.16,-100.50:99
-chr1 4111600 rs12752733 G A 194.11 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.12;MQ0=0;OQ=1088.74;QD=20.54;SB=-407.75 GT:AD:DP:GL:GQ 0/1:20,33:51:-127.52,-15.37,-66.14:99
-chr1 4111741 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=11;HaplotypeScore=4.85;MQ=55.91;MQ0=0;OQ=88.59;QD=2.16;SB=32.11 GT:AD:DP:GL:GQ 0/1:33,8:32:-21.79,-9.64,-86.81:99
-chr1 4112024 . C T 265.51 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.50;MQ0=0;OQ=941.42;QD=16.81;SB=-396.13 GT:AD:DP:GL:GQ 0/1:27,29:55:-113.99,-16.57,-97.04:99
-chr1 4112929 rs4654494 C G 169.07 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=2.42;MQ=60.00;MQ0=0;OQ=822.69;QD=13.27;SB=-341.77 GT:AD:DP:GL:GQ 0/1:34,28:54:-101.84,-16.28,-127.78:99
-chr1 4113201 rs55759139 G A 249.56 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.37;MQ=59.68;MQ0=0;OQ=761.01;QD=13.12;SB=-311.83 GT:AD:DP:GL:GQ 0/1:32,26:53:-95.35,-15.97,-100.34:99
-chr1 4113760 rs4498774 A C 130.48 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.50;MQ=58.71;MQ0=0;OQ=628.38;QD=9.67;SB=-313.59 GT:AD:DP:GL:GQ 0/1:36,29:64:-85.41,-19.28,-138.00:99
-chr1 4114825 rs7339911 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=10;HaplotypeScore=3.32;MQ=58.55;MQ0=0;OQ=757.63;QD=12.42;SB=-183.20 GT:AD:DP:GL:GQ 0/1:36,25:59:-96.82,-17.77,-126.07:99
-chr1 4116025 rs9988443 G A 336.18 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.45;MQ0=0;OQ=1567.78;QD=20.63;SB=-720.28 GT:AD:DP:GL:GQ 0/1:30,46:75:-182.67,-22.61,-94.32:99
-chr1 4116630 rs4336820 T C 72.02 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.26;MQ=59.52;MQ0=0;OQ=1667.19;QD=34.73;SB=-687.27 GT:AD:DP:GL:GQ 1/1:0,48:47:-170.32,-14.16,-0.01:99
-chr1 4116791 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=2;HaplotypeScore=12.66;MQ=58.95;MQ0=0;OQ=57.38;QD=1.43;SB=71.25 GT:AD:DP:GL:GQ 0/1:31,9:34:-19.31,-10.29,-109.30:90.22
-chr1 4117150 rs12062237 T C 0.56 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=3;HaplotypeScore=3.14;MQ=57.94;MQ0=0;OQ=1345.47;QD=32.82;SB=-624.25 GT:AD:DP:GL:GQ 1/1:0,41:39:-138.15,-11.75,-0.02:99
-chr1 4118916 rs3890798 A G 534.42 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=0;OQ=2055.84;QD=30.23;SB=-868.59 GT:AD:DP:GL:GQ 1/1:0,68:65:-209.23,-19.60,-0.06:99
-chr1 4119595 rs6426391 A T 243.50 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.16;MQ=59.73;MQ0=0;OQ=1272.79;QD=18.45;SB=-602.37 GT:AD:DP:GL:GQ 0/1:28,41:68:-151.04,-20.48,-104.90:99
-chr1 4119856 . G A 80.75 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=54.88;MQ0=1;OQ=952.98;QD=16.15;SB=-461.48 GT:AD:DP:GL:GQ 0/1:28,31:56:-115.46,-16.88,-95.51:99
-chr1 4120161 rs7549636 G A 106.14 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=3.96;MQ=59.21;MQ0=1;OQ=708.05;QD=15.39;SB=-359.50 GT:AD:DP:GL:GQ 0/1:23,23:43:-87.04,-12.95,-74.47:99
-chr1 4120271 rs6426392 T C 252.19 PASS AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.44;MQ0=0;OQ=208.98;QD=7.74;SB=-130.51 GT:AD:DP:GL:GQ 0/1:16,11:25:-31.72,-7.54,-55.62:99
-chr1 4121295 rs4414012 C T 109.52 PASS AC=1;AF=0.50;AN=2;DB;DP=15;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=243.26;QD=16.22;SB=-32.52 GT:AD:DP:GL:GQ 0/1:7,8:15:-32.13,-4.52,-23.19:99
-chr1 4121459 rs4614226 C T 3.52 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.33;MQ0=0;OQ=708.73;QD=25.31;SB=-192.72 GT:AD:DP:GL:GQ 0/1:8,20:25:-81.69,-7.53,-15.26:77.23
-chr1 4122266 rs4654495 C T 267.28 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.05;MQ0=0;OQ=844.66;QD=17.24;SB=-383.42 GT:AD:DP:GL:GQ 0/1:22,27:48:-102.21,-14.46,-81.80:99
-chr1 4122640 . C T 27.21 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=8;Dels=0.00;HRun=1;HaplotypeScore=9.85;MQ=48.82;MQ0=0;QD=3.40;SB=2.03 GT:AD:DP:GL:GQ 0/1:6,2:7:-8.11,-2.11,-18.35:60.04
-chr1 4122866 rs4654413 A G 16.01 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.58;MQ0=0;OQ=1224.52;QD=28.48;SB=-81.37 GT:AD:DP:GL:GQ 1/1:0,43:41:-126.09,-12.38,-0.05:99
-chr1 4122935 rs4654414 G A 17.67 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=53.29;MQ0=0;OQ=1666.36;QD=36.23;SB=-267.85 GT:AD:DP:GL:GQ 1/1:1,45:42:-170.23,-12.65,-0.01:99
-chr1 4123288 rs4233261 T C 17.26 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.16;MQ=58.63;MQ0=0;OQ=2395.13;QD=34.71;SB=-1054.42 GT:AD:DP:GL:GQ 1/1:0,69:66:-243.12,-19.88,-0.02:99
-chr1 4123748 rs6679293 T C 176.14 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.14;MQ0=0;OQ=1906.56;QD=31.26;SB=-831.63 GT:AD:DP:GL:GQ 1/1:0,61:59:-194.29,-17.79,-0.05:99
-chr1 4123963 rs4654496 C T 83.64 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=2067.60;QD=39.01;SB=-750.62 GT:AD:DP:GL:GQ 1/1:0,53:53:-210.36,-15.97,-0.02:99
-chr1 4124418 rs4654497 T C 597.93 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=1506.19;QD=30.74;SB=-582.98 GT:AD:DP:GL:GQ 1/1:0,49:47:-154.24,-14.17,-0.04:99
-chr1 4126306 rs4367764 C T 454.46 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2115.14;QD=39.17;SB=-864.64 GT:AD:DP:GL:GQ 1/1:0,54:53:-215.11,-15.97,-0.01:99
-chr1 4127324 rs12123330 C T 249.14 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1048.68;QD=17.77;SB=-496.03 GT:AD:DP:GL:GQ 0/1:27,32:56:-125.03,-16.88,-80.71:99
-chr1 4127494 rs4468133 G A 195.33 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=2.26;MQ=60.00;MQ0=0;OQ=1260.59;QD=18.01;SB=-425.95 GT:AD:DP:GL:GQ 0/1:31,38:68:-152.64,-23.30,-109.48:99
-chr1 4128172 rs4654498 A G 107.28 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.33;MQ=59.19;MQ0=0;OQ=2014.82;QD=35.35;SB=-1032.76 GT:AD:DP:GL:GQ 1/1:0,57:56:-205.08,-16.87,-0.01:99
-chr1 4128310 rs4654499 G T 305.85 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=983.44;QD=17.88;SB=-296.34 GT:AD:DP:GL:GQ 0/1:22,33:55:-118.19,-16.56,-78.95:99
-chr1 4130572 rs3890729 A T 141.84 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.07;MQ=59.18;MQ0=0;OQ=905.47;QD=17.75;SB=-227.90 GT:AD:DP:GL:GQ 0/1:23,28:51:-109.19,-15.36,-88.04:99
-chr1 4131311 rs10915460 G A 189.99 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=57.39;MQ0=0;OQ=480.50;QD=13.35;SB=-233.54 GT:AD:DP:GL:GQ 0/1:19,17:33:-61.28,-9.95,-54.49:99
-chr1 4131491 rs10915461 A G 151.47 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=51.87;MQ0=0;OQ=492.21;QD=9.65;SB=-268.94 GT:AD:DP:GL:GQ 0/1:28,23:49:-67.28,-14.77,-113.16:99
-chr1 4131545 rs10915462 T C 155.98 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.56;MQ0=0;OQ=299.94;QD=7.69;SB=-143.28 GT:AD:DP:GL:GQ 0/1:25,14:37:-44.43,-11.15,-99.76:99
-chr1 4131617 rs6688343 T C 208.72 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.31;MQ0=0;OQ=662.26;QD=13.25;SB=-230.45 GT:AD:DP:GL:GQ 0/1:25,25:48:-83.97,-14.46,-97.39:99
-chr1 4131656 rs6688428 T C 133.26 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=58.40;MQ0=0;OQ=444.13;QD=10.83;SB=-97.71 GT:AD:DP:GL:GQ 0/1:22,19:40:-59.75,-12.06,-84.80:99
-chr1 4131666 rs6688431 T C 70.94 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.40;MQ0=0;OQ=339.10;QD=8.27;SB=-98.71 GT:AD:DP:GL:GQ 0/1:23,18:37:-48.34,-11.15,-87.20:99
-chr1 4131704 . G A 41.43 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.69;MQ=58.60;MQ0=0;OQ=706.66;QD=14.13;SB=-238.75 GT:AD:DP:GL:GQ 0/1:28,22:49:-88.72,-14.77,-84.55:99
-chr1 4131824 rs12032295 C T 752.83 Indel AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=33.96;MQ0=0;QD=14.20;SB=-367.84 GT:AD:DP:GL:GQ 0/1:30,23:51:-93.93,-15.37,-94.00:99
-chr1 4132377 rs12405392 C T 226.32 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=4.69;MQ=59.66;MQ0=0;OQ=1021.86;QD=15.03;SB=-451.99 GT:AD:DP:GL:GQ 0/1:34,34:62:-124.15,-18.68,-109.47:99
-chr1 4132399 rs56827341 A G 272.74 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=59.66;MQ0=0;OQ=903.58;QD=13.29;SB=-319.89 GT:AD:DP:GL:GQ 0/1:32,36:65:-113.24,-19.60,-113.27:99
-chr1 4132555 rs11580927 G A 598.05 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=853.00;QD=13.76;SB=-450.44 GT:AD:DP:GL:GQ 0/1:34,28:61:-106.96,-18.38,-120.31:99
-chr1 4132654 rs11583685 T C 237.59 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.58;MQ=60.00;MQ0=0;OQ=809.75;QD=12.46;SB=-338.53 GT:AD:DP:GL:GQ 0/1:35,30:64:-103.54,-19.28,-136.81:99
-chr1 4134373 rs6690519 C T 596.27 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2577.92;QD=39.66;SB=-1051.40 GT:AD:DP:GL:GQ 1/1:0,65:64:-261.39,-19.28,-0.02:99
-chr1 4134652 rs12743431 G A 916.73 Indel AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=58.05;MQ0=0;QD=16.08;SB=-472.04 GT:AD:DP:GL:GQ 0/1:25,32:53:-110.92,-15.97,-91.04:99
-chr1 4134672 rs61037363 C T 207.69 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=58.34;MQ0=0;OQ=1244.96;QD=19.15;SB=-619.07 GT:AD:DP:GL:GQ 0/1:27,38:61:-146.16,-18.38,-83.21:99
-chr1 4135628 rs4654501 G A 449.34 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=800.03;QD=17.78;SB=-327.85 GT:AD:DP:GL:GQ 0/1:21,24:44:-96.54,-13.26,-71.19:99
-chr1 4136297 rs4531262 C T 292.38 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.55;MQ0=0;OQ=900.23;QD=17.65;SB=-443.97 GT:AD:DP:GL:GQ 0/1:23,28:50:-108.37,-15.06,-81.34:99
-chr1 4136842 rs4233262 C T 514.56 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1175.57;QD=19.27;SB=-513.00 GT:AD:DP:GL:GQ 0/1:27,34:61:-139.22,-18.38,-97.14:99
-chr1 4137022 rs12726068 G A 202.41 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1078.50;QD=19.97;SB=-346.48 GT:AD:DP:GL:GQ 0/1:22,32:54:-127.40,-16.27,-78.49:99
-chr1 4137146 rs12741551 C T 188.79 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=2.60;MQ=60.00;MQ0=0;OQ=744.97;QD=14.06;SB=-275.26 GT:AD:DP:GL:GQ 0/1:28,23:51:-95.75,-17.97,-99.94:99
-chr1 4137455 rs34927664 C T 374.06 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=672.79;QD=16.41;SB=-286.16 GT:AD:DP:GL:GQ 0/1:20,21:40:-82.61,-12.05,-71.71:99
-chr1 4137533 rs6687719 A G 359.14 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.55;MQ0=0;OQ=693.89;QD=13.61;SB=-371.11 GT:AD:DP:GL:GQ 0/1:24,27:51:-88.05,-15.37,-93.98:99
-chr1 4137942 rs4654415 A G 54.66 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=3;HaplotypeScore=0.52;MQ=59.28;MQ0=0;OQ=812.82;QD=15.63;SB=-375.38 GT:AD:DP:GL:GQ 0/1:23,29:51:-99.93,-15.36,-91.58:99
-chr1 4137964 rs4654416 T C 201.40 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=58.39;MQ0=0;OQ=863.33;QD=15.70;SB=-318.29 GT:AD:DP:GL:GQ 0/1:25,30:54:-105.89,-16.27,-96.91:99
-chr1 4138124 rs4654417 A G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.04;HRun=0;HaplotypeScore=22.45;MQ=53.05;MQ0=0;OQ=979.60;QD=14.62;SB=-425.14 GT:AD:DP:GL:GQ 0/1:30,34:67:-120.52,-19.28,-120.75:99
-chr1 4138539 rs10915465 C T 116.34 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=932.04;QD=16.95;SB=-231.54 GT:AD:DP:GL:GQ 0/1:26,28:51:-111.86,-15.37,-73.76:99
-chr1 4138848 rs4233263 T C 563.43 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.57;MQ0=0;OQ=1932.95;QD=31.18;SB=-950.38 GT:AD:DP:GL:GQ 1/1:0,61:61:-196.93,-18.40,-0.06:99
-chr1 4140038 rs4233264 T C 391.03 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.43;MQ0=0;OQ=1125.34;QD=13.89;SB=-437.57 GT:AD:DP:GL:GQ 0/1:41,40:80:-139.92,-24.10,-167.96:99
-chr1 4140287 rs4654502 A G 258.40 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=716.89;QD=12.36;SB=-328.15 GT:AD:DP:GL:GQ 0/1:28,30:57:-92.15,-17.18,-113.12:99
-chr1 4140357 rs4654503 A G 175.10 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.08;MQ=60.00;MQ0=0;OQ=528.96;QD=9.98;SB=-287.63 GT:AD:DP:GL:GQ 0/1:26,24:47:-70.35,-14.17,-96.77:99
-chr1 4140721 rs12074230 G C 441.98 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=1211.59;QD=19.54;SB=-432.34 GT:AD:DP:GL:GQ 0/1:29,33:61:-142.82,-18.38,-122.06:99
-chr1 4141214 rs61770887 T A 176.81 Indel AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=41.85;MQ0=5;QD=2.39;SB=-58.97 GT:AD:DP:GL:GQ 0/1:35,39:44:-34.22,-13.25,-135.84:99
-chr1 4141739 . C G 151.90 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.44;MQ0=0;OQ=861.28;QD=11.64;SB=-403.50 GT:AD:DP:GL:GQ 0/1:45,29:72:-111.12,-21.71,-193.89:99
-chr1 4143108 rs7544125 G A 98.23 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.58;MQ0=4;OQ=463.56;QD=6.62;SB=-223.67 GT:AD:DP:GL:GQ 0/1:38,32:54:-65.91,-16.27,-136.81:99
-chr1 4143110 rs7515133 T G 11.80 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=44.83;MQ0=4;OQ=280.65;QD=3.95;SB=-136.72 GT:AD:DP:GL:GQ 0/1:40,31:55:-47.92,-16.57,-148.31:99
-chr1 4143183 rs4408123 T C 60.26 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.41;MQ=54.71;MQ0=0;OQ=2012.85;QD=31.45;SB=-855.54 GT:AD:DP:GL:GQ 1/1:0,63:62:-204.92,-18.70,-0.05:99
-chr1 4143665 rs4654505 C T 14.05 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=7.02;MQ=58.52;MQ0=0;OQ=1278.62;QD=17.05;SB=-644.75 GT:AD:DP:GL:GQ 0/1:36,39:72:-152.84,-21.70,-110.95:99
-chr1 4143971 rs56322069 G A 219.93 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=58.68;MQ0=0;OQ=1179.12;QD=14.38;SB=-509.98 GT:AD:DP:GL:GQ 0/1:47,35:78:-144.69,-23.49,-153.28:99
-chr1 4144717 rs4654419 G T 409.69 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=53.48;MQ0=0;OQ=576.97;QD=11.10;SB=-278.60 GT:AD:DP:GL:GQ 0/1:31,21:52:-76.65,-15.66,-108.30:99
-chr1 4144899 rs4654506 A G 59.06 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.57;MQ=57.19;MQ0=0;OQ=798.47;QD=12.67;SB=-355.09 GT:AD:DP:GL:GQ 0/1:32,31:63:-102.12,-18.99,-128.03:99
-chr1 4145034 rs4654420 T C 208.27 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=57.63;MQ0=0;OQ=567.20;QD=9.30;SB=-299.19 GT:AD:DP:GL:GQ 0/1:35,26:59:-77.79,-17.78,-138.00:99
-chr1 4145265 rs10799210 A G 75.28 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=52.55;MQ0=0;OQ=2612.65;QD=35.79;SB=-1182.09 GT:AD:DP:GL:GQ 1/1:0,72:73:-267.51,-24.47,-2.66:99
-chr1 4146179 rs4354511 G A 19.37 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=3;HaplotypeScore=1.79;MQ=39.00;MQ0=1;OQ=2945.76;QD=39.28;SB=-1473.93 GT:AD:DP:GL:GQ 1/1:0,75:73:-298.18,-21.99,-0.02:99
-chr1 4146185 rs61770891 T G 349.70 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=40.44;MQ0=1;OQ=1123.38;QD=15.18;SB=-586.47 GT:AD:DP:GL:GQ 0/1:35,39:73:-137.61,-21.99,-124.99:99
-chr1 4146278 rs35969529 A C 46.41 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.80;MQ=52.18;MQ0=0;OQ=652.54;QD=12.55;SB=-341.77 GT:AD:DP:GL:GQ 0/1:27,25:52:-84.21,-15.67,-95.88:99
-chr1 4146315 rs34096100 G A 254.13 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.76;MQ0=0;OQ=657.20;QD=13.41;SB=-218.51 GT:AD:DP:GL:GQ 0/1:28,21:47:-83.18,-14.17,-82.42:99
-chr1 4146537 . C T 111.88 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.77;MQ=53.66;MQ0=1;OQ=1107.86;QD=16.06;SB=-448.39 GT:AD:DP:GL:GQ 0/1:34,35:67:-134.26,-20.19,-114.24:99
-chr1 4146953 rs4654421 T C 433.26 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.82;MQ0=0;OQ=2189.94;QD=31.74;SB=-1040.77 GT:AD:DP:GL:GQ 1/1:0,69:68:-222.64,-20.51,-0.06:99
-chr1 4147013 rs4654422 T A 163.99 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.20;MQ0=1;OQ=3024.40;QD=36.88;SB=-1331.44 GT:AD:DP:GL:GQ 1/1:1,80:81:-309.61,-27.75,-3.59:99
-chr1 4148323 rs35837871 C T 12.81 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=2.85;MQ=58.88;MQ0=0;OQ=689.43;QD=12.77;SB=-158.63 GT:AD:DP:GL:GQ 0/1:29,24:49:-86.99,-14.77,-93.34:99
-chr1 4148556 rs10753370 A G 191.60 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.30;MQ=57.40;MQ0=0;OQ=2083.85;QD=34.73;SB=-1040.92 GT:AD:DP:GL:GQ 1/1:0,60:59:-211.99,-17.77,-0.02:99
-chr1 4149011 rs12084286 A G 120.11 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=57.86;MQ0=0;OQ=472.12;QD=10.26;SB=-116.70 GT:AD:DP:GL:GQ 0/1:26,20:42:-63.15,-12.65,-98.66:99
-chr1 4149320 rs10733015 T C 59.23 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.72;MQ=56.65;MQ0=0;OQ=2004.37;QD=30.37;SB=-729.73 GT:AD:DP:GL:GQ 1/1:0,65:63:-204.08,-19.00,-0.06:99
-chr1 4149923 rs4654507 T C 369.93 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.77;MQ0=0;OQ=1162.12;QD=14.53;SB=-509.31 GT:AD:DP:GL:GQ 0/1:40,40:79:-143.29,-23.80,-162.73:99
-chr1 4150793 rs11808641 A G 288.49 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=1163.51;QD=16.62;SB=-493.62 GT:AD:DP:GL:GQ 0/1:32,38:70:-140.72,-21.09,-129.98:99
-chr1 4151258 rs35392680 C A 277.92 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=1.25;MQ=59.48;MQ0=0;OQ=1358.51;QD=16.77;SB=-581.67 GT:AD:DP:GL:GQ 0/1:37,44:80:-163.23,-24.09,-127.72:99
-chr1 4151486 rs35452955 A T 64.63 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1469.46;QD=19.34;SB=-729.32 GT:AD:DP:GL:GQ 0/1:30,45:74:-172.52,-22.29,-110.18:99
-chr1 4151668 rs6703301 G T 631.77 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3028.09;QD=37.38;SB=-1101.60 GT:AD:DP:GL:GQ 1/1:0,81:80:-306.41,-24.09,-0.01:99
-chr1 4151981 rs34414875 C T 365.71 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1305.64;QD=16.32;SB=-537.52 GT:AD:DP:GL:GQ 0/1:41,39:80:-157.95,-24.10,-144.69:99
-chr1 4152854 rs10915467 A T 474.45 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1268.93;QD=17.38;SB=-610.43 GT:AD:DP:GL:GQ 0/1:33,40:72:-151.86,-21.68,-124.21:99
-chr1 4153158 rs12722935 C T 465.33 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1317.34;QD=16.26;SB=-636.13 GT:AD:DP:GL:GQ 0/1:41,40:80:-159.12,-24.10,-137.48:99
-chr1 4153203 rs55974255 T G 492.94 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1277.21;QD=15.39;SB=-533.71 GT:AD:DP:GL:GQ 0/1:38,45:83:-156.01,-25.00,-142.96:99
-chr1 4153672 rs6679104 T C 519.73 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=1796.89;QD=30.98;SB=-648.94 GT:AD:DP:GL:GQ 1/1:0,58:56:-183.31,-16.88,-0.04:99
-chr1 4153751 rs12750830 G A 339.94 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=841.06;QD=12.19;SB=-424.91 GT:AD:DP:GL:GQ 0/1:41,27:67:-107.58,-20.19,-146.61:99
-chr1 4153835 rs12740143 T G 222.74 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=59.66;MQ0=0;OQ=767.69;QD=11.29;SB=-346.80 GT:AD:DP:GL:GQ 0/1:40,28:68:-100.53,-20.48,-145.06:99
-chr1 4154543 rs12143082 T C 171.80 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.61;MQ0=1;OQ=1104.97;QD=14.17;SB=-407.20 GT:AD:DP:GL:GQ 0/1:39,39:74:-136.07,-22.29,-143.19:99
-chr1 4154828 rs4578184 A T 236.18 PASS AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.74;MQ0=0;OQ=3286.63;QD=37.35;SB=-1618.09 GT:AD:DP:GL:GQ 1/1:0,87:86:-327.66,-25.90,-0.02:99
-chr1 4156046 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=80;Dels=0.01;HRun=20;HaplotypeScore=22.75;MQ=49.75;MQ0=0;OQ=501.86;QD=6.27;SB=92.27 GT:AD:DP:GL:GQ 0/1:48,31:64:-72.46,-18.99,-149.51:99
-chr1 4157196 rs4276878 C G 356.37 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1452.13;QD=15.78;SB=-539.06 GT:AD:DP:GL:GQ 0/1:47,45:92:-176.24,-27.75,-207.05:99
-chr1 4159822 rs34626829 T C 256.76 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=966.32;QD=13.24;SB=-369.17 GT:AD:DP:GL:GQ 0/1:40,33:72:-121.60,-21.69,-157.15:99
-chr1 4159905 rs4654509 T C 45.94 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.31;MQ=59.48;MQ0=0;OQ=2796.88;QD=34.96;SB=-1388.49 GT:AD:DP:GL:GQ 1/1:0,80:80:-283.30,-24.10,-0.03:99
-chr1 4160278 rs6667065 G A 347.06 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=1508.83;QD=20.12;SB=-751.28 GT:AD:DP:GL:GQ 0/1:32,43:74:-176.46,-22.30,-103.02:99
-chr1 4160487 rs6426401 C G 585.75 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2415.89;QD=43.14;SB=-1118.15 GT:AD:DP:GL:GQ 1/1:0,56:56:-245.19,-16.88,-0.02:99
-chr1 4163843 rs4654511 A G 129.93 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.90;MQ=59.46;MQ0=0;OQ=1014.81;QD=11.80;SB=-473.86 GT:AD:DP:GL:GQ 0/1:46,40:85:-130.38,-25.61,-186.22:99
-chr1 4163857 rs4654512 A G 307.08 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.37;MQ=59.44;MQ0=0;OQ=1070.59;QD=12.90;SB=-521.48 GT:AD:DP:GL:GQ 0/1:46,37:83:-135.34,-25.00,-185.85:99
-chr1 4164344 rs4529679 G C 272.38 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=59.36;MQ0=0;OQ=772.49;QD=10.73;SB=-392.69 GT:AD:DP:GL:GQ 0/1:46,26:70:-101.64,-21.10,-199.05:99
-chr1 4166949 rs16840901 T C 388.35 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.68;MQ0=0;OQ=1039.54;QD=14.24;SB=-434.53 GT:AD:DP:GL:GQ 0/1:37,36:73:-129.23,-21.99,-150.63:99
-chr1 4167749 rs10915471 T G 58.03 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=3.59;MQ=59.58;MQ0=0;OQ=744.43;QD=13.54;SB=-264.89 GT:AD:DP:GL:GQ 0/1:27,27:49:-92.49,-14.76,-80.31:99
-chr1 4168111 rs35122589 C T 228.78 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=59.26;MQ0=0;OQ=1364.57;QD=16.64;SB=-443.34 GT:AD:DP:GL:GQ 0/1:40,41:80:-163.84,-24.10,-142.82:99
-chr1 4168454 rs12095632 C G 92.77 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=2.95;MQ=59.32;MQ0=0;OQ=1054.00;QD=19.16;SB=-475.80 GT:AD:DP:GL:GQ 0/1:24,31:54:-124.96,-16.28,-104.73:99
-chr1 4168730 rs4130091 T C 180.54 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=1367.19;QD=28.48;SB=-696.78 GT:AD:DP:GL:GQ 1/1:0,48:44:-140.35,-13.27,-0.05:99
-chr1 4169351 rs6426402 G T 131.41 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=3.41;MQ=58.55;MQ0=0;OQ=809.13;QD=11.40;SB=-425.17 GT:AD:DP:GL:GQ 0/1:41,30:69:-104.98,-20.78,-138.71:99
-chr1 4169394 rs6426403 C G 338.24 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.89;MQ0=0;OQ=727.35;QD=12.99;SB=-274.92 GT:AD:DP:GL:GQ 0/1:33,23:54:-92.30,-16.28,-134.02:99
-chr1 4169498 rs6426404 G A 414.13 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.75;MQ0=0;OQ=1380.19;QD=18.40;SB=-605.61 GT:AD:DP:GL:GQ 0/1:34,41:72:-163.00,-21.69,-105.58:99
-chr1 4169658 rs60017975 A G 318.13 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.77;MQ0=0;OQ=1450.14;QD=18.13;SB=-530.63 GT:AD:DP:GL:GQ 0/1:31,49:79:-172.10,-23.80,-127.67:99
-chr1 4170881 rs7550659 A G 248.87 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.70;MQ0=0;OQ=2075.07;QD=30.97;SB=-804.69 GT:AD:DP:GL:GQ 1/1:0,66:63:-211.13,-18.99,-0.04:99
-chr1 4171135 rs10799212 A G 40.61 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.91;MQ=40.70;MQ0=1;OQ=2175.11;QD=31.07;SB=-612.96 GT:AD:DP:GL:GQ 1/1:1,69:67:-221.14,-20.20,-0.04:99
-chr1 4171182 rs12410442 G A 385.57 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=27.19;MQ0=4;OQ=361.27;QD=10.95;SB=-197.20 GT:AD:DP:GL:GQ 0/1:20,13:27:-47.55,-8.14,-48.20:99
-chr1 4171315 . C A 41.63 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=20;HaplotypeScore=7.30;MQ=33.40;MQ0=5;QD=0.97;SB=41.16 GT:AD:DP:GL:GQ 0/1:37,6:31:-16.79,-9.34,-90.98:74.46
-chr1 4171344 rs10799213 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.01;HRun=20;HaplotypeScore=28.32;MQ=47.02;MQ0=1;OQ=768.09;QD=11.30;SB=-343.49 GT:AD:DP:GL:GQ 0/1:35,32:53:-95.75,-15.66,-101.72:99
-chr1 4171386 rs12022636 C A 71.32 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=6.39;MQ=55.43;MQ0=0;OQ=1032.82;QD=16.66;SB=-507.94 GT:AD:DP:GL:GQ 0/1:28,34:59:-124.34,-17.77,-88.85:99
-chr1 4171443 rs10799214 T A 380.15 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.02;MQ=52.31;MQ0=0;OQ=893.79;QD=14.65;SB=-401.19 GT:AD:DP:GL:GQ 0/1:30,31:58:-110.14,-17.48,-102.42:99
-chr1 4171775 rs7553814 A G 404.78 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.01;MQ0=0;OQ=970.08;QD=12.93;SB=-503.90 GT:AD:DP:GL:GQ 0/1:40,35:74:-122.58,-22.29,-161.95:99
-chr1 4171833 rs7553919 A G 37.31 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=59.60;MQ0=0;OQ=2384.19;QD=34.55;SB=-1112.82 GT:AD:DP:GL:GQ 1/1:0,69:66:-242.02,-19.88,-0.02:99
-chr1 4171990 rs7554028 A G 628.72 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.32;MQ0=1;OQ=2341.28;QD=30.02;SB=-854.63 GT:AD:DP:GL:GQ 1/1:0,78:76:-237.79,-22.93,-0.08:99
-chr1 4173512 rs7517572 T A 699.45 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=2653.94;QD=34.47;SB=-1331.37 GT:AD:DP:GL:GQ 1/1:0,77:72:-269.00,-21.69,-0.02:99
-chr1 4173702 rs10753372 T C 483.13 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.88;MQ0=0;OQ=510.62;QD=9.82;SB=-265.21 GT:AD:DP:GL:GQ 0/1:30,22:52:-70.02,-15.68,-118.09:99
-chr1 4173822 rs10737404 T C 229.86 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1647.35;QD=29.95;SB=-655.93 GT:AD:DP:GL:GQ 1/1:0,55:53:-168.37,-15.99,-0.05:99
-chr1 4174045 rs10915473 C T 65.29 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=45.21;MQ0=0;OQ=1332.73;QD=36.02;SB=-585.26 GT:AD:DP:GL:GQ 1/1:0,37:35:-136.87,-10.55,-0.02:99
-chr1 4174057 . C T 1039.01 SnpCluster AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=42.84;MQ0=0;QD=33.52;SB=-399.52 GT:AD:DP:GL:GQ 1/1:2,29:27:-107.50,-8.14,-0.01:81.26
-chr1 4174060 . A C 853.72 SnpCluster AC=2;AF=1.00;AN=2;DP=31;Dels=0.00;HRun=2;HaplotypeScore=1.07;MQ=43.67;MQ0=0;QD=27.54;SB=-294.55 GT:AD:DP:GL:GQ 1/1:0,31:26:-88.97,-7.83,-0.01:78.20
-chr1 4174064 . A C 949.90 SnpCluster AC=2;AF=1.00;AN=2;DP=33;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=44.60;MQ0=0;QD=28.78;SB=-378.69 GT:AD:DP:GL:GQ 1/1:0,33:28:-98.58,-8.43,-0.01:84.24
-chr1 4174382 rs1908491 C T 0.38 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=6.22;MQ=54.65;MQ0=0;OQ=1883.08;QD=36.21;SB=-503.01 GT:AD:DP:GL:GQ 1/1:0,52:48:-191.91,-14.46,-0.01:99
-chr1 4174484 rs10915474 T A 225.63 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=55.68;MQ0=0;OQ=801.30;QD=15.41;SB=-299.67 GT:AD:DP:GL:GQ 0/1:26,26:51:-98.78,-15.36,-93.02:99
-chr1 4174489 rs1908492 C T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=7;HaplotypeScore=1.12;MQ=55.99;MQ0=0;OQ=1860.19;QD=37.20;SB=-932.70 GT:AD:DP:GL:GQ 1/1:0,50:48:-189.62,-14.46,-0.02:99
-chr1 4174597 rs1908493 C T 268.28 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.14;MQ=59.04;MQ0=0;OQ=2611.89;QD=38.41;SB=-1140.03 GT:AD:DP:GL:GQ 1/1:0,68:66:-264.79,-19.88,-0.02:99
-chr1 4174874 rs1495245 T A 732.53 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=2554.22;QD=37.56;SB=-1304.61 GT:AD:DP:GL:GQ 1/1:0,68:68:-259.02,-20.48,-0.02:99
-chr1 4174974 rs11578399 C A 12.83 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=3.61;MQ=59.22;MQ0=0;OQ=421.58;QD=7.81;SB=-139.06 GT:AD:DP:GL:GQ 0/1:37,17:52:-61.11,-15.67,-117.17:99
-chr1 4175032 rs1495246 C G 204.50 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=56.85;MQ0=0;OQ=2607.23;QD=39.50;SB=-1308.71 GT:AD:DP:GL:GQ 1/1:0,66:62:-264.33,-18.68,-0.02:99
-chr1 4175046 . T G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=2;HaplotypeScore=9.95;MQ=56.80;MQ0=0;OQ=180.72;QD=2.78;SB=92.29 GT:AD:DP:GL:GQ 0/1:40,25:50:-36.42,-15.06,-130.62:99
-chr1 4175151 rs10915476 G A 237.61 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.01;MQ0=0;OQ=567.09;QD=12.07;SB=-92.91 GT:AD:DP:GL:GQ 0/1:29,18:45:-73.55,-13.56,-90.83:99
-chr1 4175279 rs1495247 C T 209.45 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.34;MQ0=0;OQ=2597.96;QD=37.11;SB=-1279.76 GT:AD:DP:GL:GQ 1/1:0,70:67:-263.40,-20.19,-0.02:99
-chr1 4175302 rs7411802 C A 438.30 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=58.93;MQ0=0;OQ=2181.45;QD=35.76;SB=-1110.34 GT:AD:DP:GL:GQ 1/1:0,61:61:-221.75,-18.37,-0.02:99
-chr1 4175576 rs4326593 G A 325.64 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=55.58;MQ0=0;OQ=888.28;QD=16.76;SB=-433.95 GT:AD:DP:GL:GQ 0/1:25,28:48:-106.58,-14.47,-68.77:99
-chr1 4175736 rs4615813 G C 667.23 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.55;MQ0=0;OQ=2403.10;QD=41.43;SB=-1195.96 GT:AD:DP:GL:GQ 1/1:0,58:56:-243.91,-16.87,-0.02:99
-chr1 4175807 rs28600106 C T 6.13 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=7.59;MQ=48.39;MQ0=0;OQ=365.75;QD=9.89;SB=-206.69 GT:AD:DP:GL:GQ 0/1:22,15:31:-49.20,-9.35,-60.01:99
-chr1 4175944 rs2898790 T C 0.54 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.41;MQ=54.62;MQ0=0;OQ=1686.61;QD=30.67;SB=-329.61 GT:AD:DP:GL:GQ 1/1:0,55:50:-172.27,-15.06,-0.02:99
-chr1 4176053 rs2411737 G C 0.30 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=4.08;MQ=49.96;MQ0=0;OQ=907.29;QD=30.24;SB=-45.91 GT:AD:DP:GL:GQ 1/1:0,30:23:-94.32,-6.93,-0.01:69.23
-chr1 4176083 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=2;HaplotypeScore=5.12;MQ=50.79;MQ0=0;OQ=53.84;QD=1.17;SB=68.23 GT:AD:DP:GL:GQ 0/1:30,16:35:-19.21,-10.54,-99.51:86.68
-chr1 4176698 rs10915477 G A 75.54 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=1.92;MQ=55.80;MQ0=0;OQ=3415.18;QD=40.18;SB=-1433.92 GT:AD:DP:GL:GQ 1/1:0,85:84:-340.52,-25.30,-0.02:99
-chr1 4176748 rs12060660 A C 70.84 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=3.65;MQ=58.23;MQ0=0;OQ=2781.95;QD=35.21;SB=-941.32 GT:AD:DP:GL:GQ 1/1:0,78:78:-285.04,-25.98,-3.27:99
-chr1 4176763 rs10915478 T C 721.59 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.18;MQ0=0;OQ=2617.35;QD=33.99;SB=-1088.89 GT:AD:DP:GL:GQ 1/1:0,77:74:-265.34,-22.29,-0.02:99
-chr1 4176794 rs12060664 A G 585.06 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2362.72;QD=33.28;SB=-1094.09 GT:AD:DP:GL:GQ 1/1:0,71:67:-239.88,-20.19,-0.03:99
-chr1 4177795 rs4654423 T C 596.30 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1639.97;QD=29.29;SB=-739.78 GT:AD:DP:GL:GQ 1/1:0,56:52:-167.62,-15.68,-0.04:99
-chr1 4177808 rs10915479 T C 281.74 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.62;MQ0=0;OQ=507.44;QD=10.36;SB=-255.93 GT:AD:DP:GL:GQ 0/1:30,19:46:-67.89,-13.86,-108.27:99
-chr1 4179046 rs12116719 G A 182.10 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=2853.60;QD=39.09;SB=-1453.00 GT:AD:DP:GL:GQ 1/1:0,73:73:-288.97,-22.00,-0.02:99
-chr1 4179422 rs59176411 C T 132.99 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=3.16;MQ=56.41;MQ0=0;OQ=2598.61;QD=37.12;SB=-1098.00 GT:AD:DP:GL:GQ 1/1:1,69:68:-267.13,-20.49,-3.69:99
-chr1 4179485 rs10737405 A G 230.94 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=55.59;MQ0=0;OQ=1795.14;QD=34.52;SB=-680.95 GT:AD:DP:GL:GQ 1/1:1,51:52:-187.08,-15.66,-3.98:99
-chr1 4180030 rs6657617 C T 6.27 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.45;MQ=59.28;MQ0=0;OQ=2474.15;QD=38.66;SB=-836.62 GT:AD:DP:GL:GQ 1/1:0,64:62:-251.01,-18.68,-0.02:99
-chr1 4180081 rs6426405 G A 604.48 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2617.17;QD=39.06;SB=-1069.36 GT:AD:DP:GL:GQ 1/1:0,67:67:-265.32,-20.19,-0.02:99
-chr1 4180490 rs4592237 G A 306.85 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=1850.80;QD=34.92;SB=-947.36 GT:AD:DP:GL:GQ 1/1:0,53:49:-188.69,-14.77,-0.02:99
-chr1 4181020 rs10799216 G A 235.59 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.51;MQ=59.57;MQ0=0;OQ=3471.51;QD=40.37;SB=-1574.60 GT:AD:DP:GL:GQ 1/1:0,86:85:-346.15,-25.60,-0.02:99
-chr1 4181670 rs4233265 T C 517.98 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.29;MQ0=0;OQ=2065.74;QD=31.30;SB=-824.68 GT:AD:DP:GL:GQ 1/1:0,66:65:-210.21,-19.60,-0.06:99
-chr1 4182159 rs4654425 A G 260.71 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1828.94;QD=35.17;SB=-776.99 GT:AD:DP:GL:GQ 1/1:0,52:51:-186.50,-15.36,-0.02:99
-chr1 4182646 rs11579829 C T 305.04 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.69;MQ0=0;OQ=2773.62;QD=37.48;SB=-1347.81 GT:AD:DP:GL:GQ 1/1:0,74:71:-280.97,-21.39,-0.02:99
-chr1 4183175 rs2132177 C A 639.97 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2919.91;QD=36.50;SB=-1144.30 GT:AD:DP:GL:GQ 1/1:0,80:79:-295.60,-23.79,-0.02:99
-chr1 4184348 rs55978003 G A 105.51 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.52;MQ=59.27;MQ0=0;OQ=776.05;QD=15.22;SB=-305.78 GT:AD:DP:GL:GQ 0/1:27,23:48:-95.35,-14.46,-90.95:99
-chr1 4184779 rs7528938 C T 220.92 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.11;MQ0=0;OQ=1623.71;QD=34.55;SB=-657.89 GT:AD:DP:GL:GQ 1/1:1,44:43:-165.98,-12.96,-0.02:99
-chr1 4185286 rs17415519 A G 242.16 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=1.28;MQ=60.00;MQ0=0;OQ=1345.26;QD=33.63;SB=-658.93 GT:AD:DP:GL:GQ 1/1:0,40:39:-138.12,-11.75,-0.01:99
-chr1 4185339 . G T 41.06 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=12;HaplotypeScore=2.80;MQ=54.83;MQ0=0;QD=0.98;SB=22.81 GT:AD:DP:GL:GQ 0/1:35,7:35:-17.93,-10.54,-103.81:73.90
-chr1 4185557 rs4654516 G C 54.16 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=1.67;MQ=58.74;MQ0=0;OQ=2607.62;QD=37.25;SB=-842.00 GT:AD:DP:GL:GQ 1/1:1,69:66:-264.40,-19.92,-0.05:99
-chr1 4187570 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=2;HaplotypeScore=8.14;MQ=58.89;MQ0=0;OQ=68.10;QD=0.81;SB=131.41 GT:AD:DP:GL:GQ 0/1:59,24:60:-28.18,-18.09,-178.30:99
-chr1 4188372 rs1874267 T G 455.60 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=59.37;MQ0=0;OQ=1048.28;QD=15.88;SB=-524.40 GT:AD:DP:GL:GQ 0/1:29,37:66:-127.99,-19.88,-107.31:99
-chr1 4188412 rs1874266 A G 468.39 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.24;MQ0=0;OQ=798.75;QD=14.52;SB=-409.67 GT:AD:DP:GL:GQ 0/1:23,32:52:-98.84,-15.68,-83.89:99
-chr1 4188663 rs10915480 A G 337.33 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=59.23;MQ0=0;OQ=1153.25;QD=13.73;SB=-560.60 GT:AD:DP:GL:GQ 0/1:38,45:83:-146.27,-27.66,-153.88:99
-chr1 4188905 rs10753374 A G 386.21 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1195.33;QD=15.73;SB=-552.85 GT:AD:DP:GL:GQ 0/1:35,41:76:-145.71,-22.90,-141.29:99
-chr1 4189544 rs10753375 T G 601.10 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1995.47;QD=35.01;SB=-845.10 GT:AD:DP:GL:GQ 1/1:0,57:56:-203.15,-16.86,-0.01:99
-chr1 4189582 rs10799217 A G 68.61 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=59.39;MQ0=0;OQ=909.16;QD=14.90;SB=-461.96 GT:AD:DP:GL:GQ 0/1:30,31:61:-112.58,-18.38,-119.06:99
-chr1 4189759 rs10799218 T C 84.36 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=3;HaplotypeScore=1.76;MQ=58.80;MQ0=0;OQ=827.52;QD=11.18;SB=-285.14 GT:AD:DP:GL:GQ 0/1:41,32:73:-108.03,-22.00,-167.09:99
-chr1 4191122 rs6426406 T C 3.61 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=7.31;MQ=59.57;MQ0=0;OQ=717.35;QD=10.71;SB=-224.24 GT:AD:DP:GL:GQ 0/1:37,30:64:-94.30,-19.28,-145.85:99
-chr1 4191702 rs7541544 T C 425.11 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.70;MQ0=0;OQ=729.14;QD=11.76;SB=-343.04 GT:AD:DP:GL:GQ 0/1:32,30:60:-94.28,-18.09,-122.33:99
-chr1 4191813 rs7534461 C G 457.73 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.78;MQ0=0;OQ=1324.41;QD=15.96;SB=-593.50 GT:AD:DP:GL:GQ 0/1:46,37:83:-160.73,-25.00,-206.24:99
-chr1 4191898 rs7534558 C T 290.90 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=60.00;MQ0=0;OQ=1246.57;QD=14.17;SB=-621.73 GT:AD:DP:GL:GQ 0/1:50,38:86:-153.86,-25.92,-153.30:99
-chr1 4191985 rs10799219 G C 69.97 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=59.38;MQ0=0;OQ=1617.32;QD=21.86;SB=-548.71 GT:AD:DP:GL:GQ 0/1:32,42:72:-186.71,-21.70,-128.86:99
-chr1 4192218 rs10159168 A T 343.86 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1388.76;QD=16.94;SB=-472.56 GT:AD:DP:GL:GQ 0/1:39,43:82:-166.86,-24.70,-146.13:99
-chr1 4195817 rs1390135 T G 143.92 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=58.67;MQ0=0;OQ=705.86;QD=11.20;SB=-334.03 GT:AD:DP:GL:GQ 0/1:33,30:61:-92.25,-18.38,-113.54:99
-chr1 4197896 . G A 10.32 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.52;MQ0=0;OQ=1035.41;QD=21.57;SB=-410.45 GT:AD:DP:GL:GQ 0/1:18,30:48:-121.29,-14.46,-58.46:99
-chr1 4198535 rs1495242 A G 438.02 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1076.27;QD=12.97;SB=-544.21 GT:AD:DP:GL:GQ 0/1:44,39:81:-135.31,-24.40,-175.25:99
-chr1 4199191 rs12124378 C T 379.71 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=1302.45;QD=20.35;SB=-581.61 GT:AD:DP:GL:GQ 0/1:26,38:63:-152.50,-18.97,-95.47:99
-chr1 4199881 . G T 32.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=2;HaplotypeScore=5.28;MQ=57.83;MQ0=0;QD=0.74;SB=74.26 GT:AD:DP:GL:GQ 0/1:31,13:34:-16.78,-10.24,-105.31:65.40
-chr1 4200007 . G A 96.98 PASS AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.35;MQ0=0;OQ=1236.21;QD=18.45;SB=-537.73 GT:AD:DP:GL:GQ 0/1:28,39:63:-145.88,-18.98,-96.95:99
-chr1 4200165 rs6426407 A G 72.52 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.49;MQ0=0;OQ=1344.67;QD=18.17;SB=-519.96 GT:AD:DP:GL:GQ 0/1:29,44:72:-159.44,-21.69,-113.24:99
-chr1 4200817 rs4654518 G A 711.75 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2818.25;QD=39.69;SB=-1209.38 GT:AD:DP:GL:GQ 1/1:0,71:70:-285.42,-21.08,-0.01:99
-chr1 4202021 rs12124548 G A 209.11 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.70;MQ0=0;OQ=1241.05;QD=20.02;SB=-465.47 GT:AD:DP:GL:GQ 0/1:26,36:61:-145.77,-18.38,-85.04:99
-chr1 4202445 rs12405770 A G 576.59 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1249.87;QD=15.62;SB=-595.92 GT:AD:DP:GL:GQ 0/1:37,43:79:-152.07,-23.80,-148.48:99
-chr1 4202474 rs6426409 T G 405.59 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.78;MQ0=0;OQ=1102.86;QD=13.13;SB=-556.72 GT:AD:DP:GL:GQ 0/1:44,40:82:-138.27,-24.70,-157.66:99
-chr1 4204888 rs12132080 A T 242.23 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.72;MQ=45.12;MQ0=6;OQ=964.76;QD=12.69;SB=-408.56 GT:AD:DP:GL:GQ 0/1:34,42:65:-119.34,-19.58,-129.51:99
-chr1 4208143 rs6690300 T G 448.20 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.45;MQ0=0;OQ=967.38;QD=12.73;SB=-340.51 GT:AD:DP:GL:GQ 0/1:41,35:76:-122.91,-22.89,-152.81:99
-chr1 4208388 rs12239600 T C 466.70 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.66;MQ0=0;OQ=937.21;QD=13.78;SB=-484.77 GT:AD:DP:GL:GQ 0/1:32,36:68:-117.50,-20.50,-127.59:99
-chr1 4208894 rs12078298 T A 402.94 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.48;MQ0=0;OQ=1434.64;QD=16.12;SB=-624.40 GT:AD:DP:GL:GQ 0/1:43,46:88:-173.25,-26.51,-162.85:99
-chr1 4209813 rs6679489 G A 164.07 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=60.00;MQ0=0;OQ=1435.86;QD=16.89;SB=-638.14 GT:AD:DP:GL:GQ 0/1:41,44:83:-171.87,-25.00,-148.88:99
-chr1 4211295 rs4654519 C T 437.58 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.97;MQ0=0;OQ=1264.42;QD=19.76;SB=-439.80 GT:AD:DP:GL:GQ 0/1:26,38:62:-148.40,-18.68,-90.27:99
-chr1 4211773 rs10915487 T G 175.84 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.23;MQ0=0;OQ=638.07;QD=10.29;SB=-306.76 GT:AD:DP:GL:GQ 0/1:37,25:61:-85.47,-18.38,-128.27:99
-chr1 4212065 rs1908490 C T 369.52 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=57.82;MQ0=0;OQ=1109.73;QD=15.20;SB=-541.53 GT:AD:DP:GL:GQ 0/1:40,33:71:-135.64,-21.39,-134.48:99
-chr1 4213163 rs12741715 A T 578.55 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1267.51;QD=16.90;SB=-452.19 GT:AD:DP:GL:GQ 0/1:35,40:74:-152.32,-22.29,-133.91:99
-chr1 4215064 rs966321 G T 6.64 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=4;HaplotypeScore=2.95;MQ=59.70;MQ0=0;OQ=1037.52;QD=13.65;SB=-540.72 GT:AD:DP:GL:GQ 0/1:40,36:75:-129.62,-22.59,-142.94:99
-chr1 4215408 rs12691488 C T 601.59 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1073.26;QD=16.02;SB=-541.06 GT:AD:DP:GL:GQ 0/1:35,32:66:-130.50,-19.89,-109.64:99
-chr1 4216644 rs964715 T C 389.60 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=939.74;QD=14.46;SB=-445.57 GT:AD:DP:GL:GQ 0/1:32,33:65:-116.84,-19.58,-130.15:99
-chr1 4217111 rs1495250 T C 316.94 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=777.71;QD=11.44;SB=-393.04 GT:AD:DP:GL:GQ 0/1:36,32:67:-101.25,-20.19,-143.99:99
-chr1 4218910 rs11583756 G A 393.34 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=562.25;QD=10.41;SB=-300.82 GT:AD:DP:GL:GQ 0/1:33,21:51:-74.88,-15.38,-106.07:99
-chr1 4219107 rs7545415 G A 274.25 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.24;MQ0=0;OQ=794.53;QD=14.45;SB=-389.90 GT:AD:DP:GL:GQ 0/1:30,25:51:-98.11,-15.38,-85.30:99
-chr1 4221548 rs1826719 G A 1.65 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.02;HRun=1;HaplotypeScore=9.57;MQ=59.01;MQ0=0;OQ=1104.32;QD=16.73;SB=-370.86 GT:AD:DP:GL:GQ 0/1:31,34:63:-132.39,-18.68,-107.97:99
-chr1 4221834 rs1390137 T A 402.30 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.24;MQ0=0;OQ=1338.31;QD=14.71;SB=-600.22 GT:AD:DP:GL:GQ 0/1:48,43:91:-164.52,-27.41,-184.18:99
-chr1 4222993 rs7526339 A G 180.71 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=860.50;QD=13.04;SB=-424.26 GT:AD:DP:GL:GQ 0/1:36,30:65:-108.91,-19.58,-143.92:99
-chr1 4225449 rs9286982 A C 384.55 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.50;MQ0=0;OQ=1099.77;QD=14.66;SB=-338.80 GT:AD:DP:GL:GQ 0/1:38,37:74:-135.55,-22.29,-134.84:99
-chr1 4226228 rs2411738 G A 332.71 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=1328.38;QD=18.98;SB=-511.52 GT:AD:DP:GL:GQ 0/1:30,40:68:-156.63,-20.50,-89.85:99
-chr1 4227495 rs2101576 C T 457.85 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.43;MQ0=0;OQ=1111.42;QD=15.22;SB=-551.59 GT:AD:DP:GL:GQ 0/1:39,34:73:-136.43,-22.01,-124.07:99
-chr1 4227724 rs10915493 G A 108.64 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=60.00;MQ0=0;OQ=1106.23;QD=18.75;SB=-402.40 GT:AD:DP:GL:GQ 0/1:26,33:59:-131.68,-17.78,-92.93:99
-chr1 4228365 . G A 59.74 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=2.28;MQ=58.73;MQ0=0;OQ=1218.17;QD=16.69;SB=-516.71 GT:AD:DP:GL:GQ 0/1:36,37:71:-146.49,-21.39,-124.67:99
-chr1 4228440 rs11586171 G A 378.40 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.25;MQ0=0;OQ=793.38;QD=14.17;SB=-261.74 GT:AD:DP:GL:GQ 0/1:30,26:52:-98.30,-15.68,-86.01:99
-chr1 4228626 rs10799221 A G 244.66 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=59.55;MQ0=0;OQ=773.13;QD=15.16;SB=-359.35 GT:AD:DP:GL:GQ 0/1:24,27:50:-95.66,-15.07,-89.39:99
-chr1 4230147 rs6677984 A G 313.94 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.80;MQ0=0;OQ=752.97;QD=10.61;SB=-294.25 GT:AD:DP:GL:GQ 0/1:36,35:64:-97.88,-19.30,-127.54:99
-chr1 4231035 . G A 41.87 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=59.27;MQ0=0;OQ=1023.37;QD=17.95;SB=-471.06 GT:AD:DP:GL:GQ 0/1:23,34:54:-121.89,-16.27,-83.08:99
-chr1 4231643 rs4654426 A G 357.68 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.13;MQ0=0;OQ=804.91;QD=14.63;SB=-368.10 GT:AD:DP:GL:GQ 0/1:22,33:51:-99.15,-15.37,-84.11:99
-chr1 4232195 . G A 71.35 PASS AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=60.00;MQ0=0;OQ=896.42;QD=13.18;SB=-396.87 GT:AD:DP:GL:GQ 0/1:39,29:68:-113.42,-20.50,-128.87:99
-chr1 4232590 rs7527612 G A 196.65 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.22;MQ=59.61;MQ0=0;OQ=598.22;QD=12.46;SB=-285.21 GT:AD:DP:GL:GQ 0/1:26,20:44:-76.37,-13.26,-81.07:99
-chr1 4233150 rs10737406 C T 190.39 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1662.89;QD=19.34;SB=-750.79 GT:AD:DP:GL:GQ 0/1:38,48:86:-195.48,-25.90,-136.98:99
-chr1 4233365 rs10737407 T C 106.83 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.79;MQ0=0;OQ=829.78;QD=9.43;SB=-420.85 GT:AD:DP:GL:GQ 0/1:52,36:87:-112.48,-26.22,-211.16:99
-chr1 4233528 rs10737408 T C 490.54 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=1057.73;QD=14.90;SB=-414.29 GT:AD:DP:GL:GQ 0/1:30,41:71:-130.46,-21.40,-122.91:99
-chr1 4233635 rs10799223 G C 53.92 PASS AC=1;AF=0.50;AN=2;DB;DP=99;Dels=0.00;HRun=0;HaplotypeScore=4.97;MQ=59.34;MQ0=0;OQ=1650.26;QD=16.67;SB=-729.99 GT:AD:DP:GL:GQ 0/1:53,46:99:-198.14,-29.83,-227.12:99
-chr1 4234047 rs12095914 C T 0.73 PASS AC=1;AF=0.50;AN=2;DB;DP=14;Dels=0.00;HRun=0;HaplotypeScore=9.26;MQ=42.37;MQ0=0;OQ=137.29;QD=9.81;SB=-42.54 GT:AD:DP:GL:GQ 0/1:9,5:10:-20.03,-3.01,-17.15:99
-chr1 4234051 rs56077919 C T 1.78 PASS AC=1;AF=0.50;AN=2;DB;DP=12;Dels=0.00;HRun=0;HaplotypeScore=7.11;MQ=38.66;MQ0=0;OQ=106.65;QD=8.89;SB=-40.54 GT:AD:DP:GL:GQ 0/1:8,4:8:-16.36,-2.41,-14.46:99
-chr1 4234076 . T C 1.57 PASS AC=1;AF=0.50;AN=2;DP=9;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=36.23;MQ0=1;OQ=55.15;QD=6.13;SB=-6.99 GT:AD:DP:GL:GQ 0/1:6,3:7:-10.91,-2.11,-15.53:87.98
-chr1 4234095 rs12752111 C T 29.22 LowQual AC=1;AF=0.50;AN=2;DB;DP=8;Dels=0.00;HRun=1;HaplotypeScore=2.44;MQ=42.08;MQ0=1;QD=3.65;SB=-10.00 GT:AD:DP:GL:GQ 0/1:5,3:6:-8.01,-1.81,-14.07:62.05
-chr1 4234115 . T C 41.10 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=0;HaplotypeScore=27.16;MQ=46.57;MQ0=0;QD=2.94;SB=-6.99 GT:AD:DP:GL:GQ 0/1:10,4:11:-10.71,-3.31,-31.76:73.94
-chr1 4234119 . T C 26.07 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=19;Dels=0.00;HRun=0;HaplotypeScore=23.15;MQ=48.70;MQ0=0;QD=1.37;SB=-6.99 GT:AD:DP:GL:GQ 0/1:13,6:15:-10.41,-4.52,-48.38:58.90
-chr1 4234123 . T C 99.42 SnpCluster AC=1;AF=0.50;AN=2;DP=22;Dels=0.00;HRun=0;HaplotypeScore=15.26;MQ=47.83;MQ0=0;QD=4.52;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,7:16:-18.04,-4.82,-44.01:99
-chr1 4234141 . C T 11.93 LowQual AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=3;HaplotypeScore=2.90;MQ=45.82;MQ0=0;QD=0.38;SB=-10.00 GT:AD:DP:GL:GQ 0/1:27,4:24:-11.68,-7.23,-69.44:44.48
-chr1 4234162 rs55680202 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.02;HRun=14;HaplotypeScore=7.57;MQ=46.57;MQ0=0;OQ=162.83;QD=3.54;SB=-20.39 GT:AD:DP:GL:GQ 0/1:36,9:39:-31.01,-11.45,-100.16:99
-chr1 4234461 rs2898791 C A 324.76 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=54.58;MQ0=0;OQ=1440.90;QD=17.57;SB=-669.70 GT:AD:DP:GL:GQ 0/1:33,49:78:-170.87,-23.50,-98.97:99
-chr1 4235747 rs1495243 G A 21.65 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=2;HaplotypeScore=0.87;MQ=59.34;MQ0=0;OQ=727.40;QD=20.78;SB=-304.24 GT:AD:DP:GL:GQ 0/1:14,21:34:-86.27,-10.24,-44.00:99
-chr1 4235753 rs903541 A G 320.84 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=658.30;QD=17.79;SB=-304.49 GT:AD:DP:GL:GQ 0/1:15,22:36:-79.96,-10.84,-57.03:99
-chr1 4236215 rs2411739 T C 3.39 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=4;HaplotypeScore=1.73;MQ=54.14;MQ0=0;OQ=570.50;QD=9.84;SB=-308.25 GT:AD:DP:GL:GQ 0/1:27,31:50:-75.41,-15.07,-105.40:99
-chr1 4243198 rs6658727 T C 21.46 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=56.21;MQ0=0;OQ=1400.87;QD=30.45;SB=-402.32 GT:AD:DP:GL:GQ 1/1:0,46:43:-143.70,-12.96,-0.03:99
-chr1 4254604 rs1495248 G A 254.74 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.88;MQ0=0;OQ=575.96;QD=13.39;SB=-220.90 GT:AD:DP:GL:GQ 0/1:24,19:42:-73.53,-12.65,-79.75:99
-chr1 4255328 rs2130621 G A 47.37 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=4.28;MQ=59.31;MQ0=0;OQ=1064.10;QD=15.88;SB=-426.97 GT:AD:DP:GL:GQ 0/1:33,34:65:-129.28,-19.59,-111.47:99
-chr1 4255353 rs12123539 G C 316.52 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=1198.39;QD=17.89;SB=-531.27 GT:AD:DP:GL:GQ 0/1:31,36:67:-143.33,-20.20,-136.21:99
-chr1 4255453 rs2029490 A G 353.66 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.70;MQ0=0;OQ=1028.79;QD=13.19;SB=-497.67 GT:AD:DP:GL:GQ 0/1:34,44:74:-128.48,-22.32,-128.69:99
-chr1 4256070 rs61769407 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.03;HRun=0;HaplotypeScore=33.48;MQ=52.67;MQ0=1;OQ=340.13;QD=5.08;SB=-156.75 GT:AD:DP:GL:GQ 0/1:47,18:58:-54.18,-16.88,-142.71:99
-chr1 4256256 rs12563155 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=93.47;MQ=55.97;MQ0=0;OQ=536.64;QD=7.56;SB=-213.44 GT:AD:DP:GL:GQ 0/1:49,22:63:-75.92,-18.98,-150.16:99
-chr1 4256294 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=8.05;MQ=57.07;MQ0=1;OQ=87.19;QD=1.23;SB=41.60 GT:AD:DP:GL:GQ 0/1:61,10:65:-31.59,-19.59,-196.34:99
-chr1 4256295 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=7.58;MQ=57.07;MQ0=1;OQ=86.67;QD=1.22;SB=35.22 GT:AD:DP:GL:GQ 0/1:61,10:60:-30.03,-18.08,-181.58:99
-chr1 4256665 rs11487456 A C 56.20 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=2.90;MQ=57.92;MQ0=0;OQ=976.57;QD=11.10;SB=-464.71 GT:AD:DP:GL:GQ 0/1:50,38:85:-126.54,-25.60,-185.54:99
-chr1 4258667 rs10753377 G C 1.06 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=5;HaplotypeScore=1.15;MQ=59.53;MQ0=0;OQ=783.06;QD=15.98;SB=-363.09 GT:AD:DP:GL:GQ 0/1:26,23:47:-95.76,-14.17,-99.93:99
-chr1 4259991 rs592323 G T 282.55 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=1759.13;QD=36.65;SB=-870.26 GT:AD:DP:GL:GQ 1/1:0,48:48:-179.51,-14.45,-0.01:99
-chr1 4261395 rs513096 G A 177.19 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.21;MQ=58.45;MQ0=0;OQ=707.77;QD=15.73;SB=-231.55 GT:AD:DP:GL:GQ 0/1:23,22:44:-87.33,-13.26,-70.99:99
-chr1 4262899 . A G 18.25 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=43.81;MQ=48.38;MQ0=0;QD=0.33;SB=-10.00 GT:AD:DP:GL:GQ 0/1:50,5:40:-17.15,-12.05,-140.45:51.02
-chr1 4262904 rs28675202 G A 73.10 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=14.98;MQ=50.70;MQ0=0;QD=1.43;SB=-10.00 GT:AD:DP:GL:GQ 0/1:40,11:45:-24.15,-13.55,-132.97:99
-chr1 4262909 . G A 79.12 SnpCluster AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=5.00;MQ=50.76;MQ0=0;QD=1.65;SB=-10.00 GT:AD:DP:GL:GQ 0/1:37,11:43:-24.15,-12.95,-125.43:99
-chr1 4262914 rs629808 G A 33.56 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=52.89;MQ=50.96;MQ0=0;QD=0.68;SB=-10.00 GT:AD:DP:GL:GQ 0/1:39,10:44:-19.89,-13.25,-132.97:66.40
-chr1 4262923 . C T 231.89 SnpCluster AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=36.64;MQ=51.44;MQ0=0;QD=5.27;SB=-10.00 GT:AD:DP:GL:GQ 0/1:30,14:37:-37.63,-11.16,-89.50:99
-chr1 4262924 rs3124336 G A 119.70 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=42.63;MQ=51.44;MQ0=0;QD=2.72;SB=-10.00 GT:AD:DP:GL:GQ 0/1:30,14:37:-26.40,-11.15,-102.56:99
-chr1 4262928 . C T 227.91 SnpCluster AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=40.91;MQ=51.65;MQ0=0;QD=5.06;SB=-10.00 GT:AD:DP:GL:GQ 0/1:31,14:38:-37.54,-11.47,-89.09:99
-chr1 4262934 . G A 212.81 SnpCluster AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=38.78;MQ=51.84;MQ0=0;QD=4.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:35,11:39:-36.31,-11.75,-102.65:99
-chr1 4262955 . C T 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=37;Dels=0.00;HRun=1;HaplotypeScore=10.30;MQ=55.28;MQ0=0;OQ=119.85;QD=3.24;SB=-10.00 GT:AD:DP:GL:GQ 0/1:30,7:34:-25.51,-10.24,-106.69:99
-chr1 4262965 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=36;Dels=0.00;HRun=0;HaplotypeScore=4.99;MQ=55.83;MQ0=0;OQ=58.64;QD=1.63;SB=-10.00 GT:AD:DP:GL:GQ 0/1:31,5:33:-19.09,-9.94,-116.28:91.47
-chr1 4263200 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=16.50;MQ=29.51;MQ0=20;OQ=97.44;QD=2.38;SB=-10.00 GT:AD:DP:GL:GQ 0/1:35,5:14:-17.24,-4.22,-36.40:99
-chr1 4263205 rs12035244 T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=20.28;MQ=30.89;MQ0=18;OQ=95.43;QD=2.27;SB=-10.00 GT:AD:DP:GL:GQ 0/1:37,5:15:-17.34,-4.52,-40.16:99
-chr1 4263595 rs34429154 C A 184.54 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=59.01;MQ0=0;OQ=488.72;QD=10.40;SB=-267.26 GT:AD:DP:GL:GQ 0/1:29,18:46:-66.01,-13.86,-101.87:99
-chr1 4263832 rs584035 G A 216.29 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.61;MQ0=0;OQ=1091.44;QD=18.50;SB=-496.53 GT:AD:DP:GL:GQ 0/1:27,32:59:-130.21,-17.78,-86.40:99
-chr1 4263930 rs503536 G A 202.82 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.57;MQ0=0;OQ=661.52;QD=12.25;SB=-344.44 GT:AD:DP:GL:GQ 0/1:32,22:49:-84.20,-14.76,-96.54:99
-chr1 4264086 rs693734 C T 101.31 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=2.89;MQ=58.91;MQ0=0;OQ=1021.37;QD=17.02;SB=-501.11 GT:AD:DP:GL:GQ 0/1:29,31:59:-123.20,-17.78,-92.76:99
-chr1 4264332 rs1106307 A G 290.23 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.63;MQ=59.33;MQ0=0;OQ=913.45;QD=14.73;SB=-354.33 GT:AD:DP:GL:GQ 0/1:28,34:58:-112.10,-17.47,-104.59:99
-chr1 4264424 rs2132176 A G 368.22 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=613.38;QD=11.15;SB=-237.28 GT:AD:DP:GL:GQ 0/1:30,25:53:-80.60,-15.97,-111.46:99
-chr1 4264542 rs2132174 T A 221.74 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=52.27;MQ0=0;OQ=1008.56;QD=17.69;SB=-458.63 GT:AD:DP:GL:GQ 0/1:21,35:54:-122.63,-18.49,-81.00:99
-chr1 4264801 rs3007778 G C 66.30 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.47;MQ=58.11;MQ0=0;OQ=580.26;QD=12.35;SB=-271.29 GT:AD:DP:GL:GQ 0/1:28,19:44:-74.59,-13.28,-102.55:99
-chr1 4265009 rs3007777 C A 272.57 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.09;MQ0=0;OQ=812.00;QD=17.65;SB=-415.86 GT:AD:DP:GL:GQ 0/1:19,27:45:-98.04,-13.55,-64.20:99
-chr1 4265174 . G A 199.75 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=560.44;QD=13.67;SB=-202.85 GT:AD:DP:GL:GQ 0/1:23,18:41:-71.68,-12.35,-78.36:99
-chr1 4265866 rs56198562 A G 125.40 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=59.78;MQ0=0;OQ=979.47;QD=11.66;SB=-298.20 GT:AD:DP:GL:GQ 0/1:43,41:82:-125.95,-24.72,-170.33:99
-chr1 4266398 rs1495240 C T 180.37 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.09;MQ0=0;OQ=962.96;QD=18.88;SB=-480.01 GT:AD:DP:GL:GQ 0/1:23,28:47:-113.74,-14.16,-62.01:99
-chr1 4266494 rs1845634 G A 227.70 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1124.56;QD=17.85;SB=-553.73 GT:AD:DP:GL:GQ 0/1:30,33:63:-134.72,-18.98,-108.50:99
-chr1 4267183 rs1490413 G A 163.02 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=1.58;MQ=59.39;MQ0=0;OQ=1192.58;QD=17.54;SB=-578.10 GT:AD:DP:GL:GQ 0/1:31,37:66:-142.43,-19.88,-110.71:99
-chr1 4267249 rs16838591 G A 109.35 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.45;MQ0=0;OQ=560.73;QD=16.49;SB=-154.59 GT:AD:DP:GL:GQ 0/1:17,17:34:-69.60,-10.24,-59.00:99
-chr1 4267670 rs17448695 C T 256.61 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=2.17;MQ=59.11;MQ0=0;OQ=785.86;QD=16.72;SB=-406.95 GT:AD:DP:GL:GQ 0/1:22,24:45:-95.42,-13.55,-80.15:99
-chr1 4267782 rs1817914 T C 324.51 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.97;MQ0=0;OQ=827.52;QD=14.03;SB=-394.24 GT:AD:DP:GL:GQ 0/1:29,30:58:-103.51,-17.47,-117.96:99
-chr1 4267840 rs2934983 G A 322.55 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.36;MQ0=0;OQ=1060.38;QD=18.28;SB=-513.09 GT:AD:DP:GL:GQ 0/1:26,32:57:-126.49,-17.17,-95.38:99
-chr1 4267886 rs1817913 A G 440.55 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=738.48;QD=13.43;SB=-393.26 GT:AD:DP:GL:GQ 0/1:24,31:50:-92.21,-15.08,-81.77:99
-chr1 4268301 rs351622 A T 719.15 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.09;MQ0=0;OQ=1814.47;QD=35.58;SB=-930.73 GT:AD:DP:GL:GQ 1/1:0,51:49:-185.04,-14.76,-0.01:99
-chr1 4268579 rs351621 T C 72.96 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.25;MQ0=0;OQ=1364.91;QD=27.30;SB=-524.09 GT:AD:DP:GL:GQ 1/1:0,50:43:-140.11,-12.97,-0.04:99
-chr1 4268604 rs351620 C T 134.99 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.70;MQ=59.46;MQ0=0;OQ=1433.75;QD=33.34;SB=-736.64 GT:AD:DP:GL:GQ 1/1:0,43:39:-146.99,-11.76,-0.03:99
-chr1 4268679 rs351619 G A 84.28 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=1739.98;QD=37.83;SB=-519.64 GT:AD:DP:GL:GQ 1/1:0,46:44:-177.59,-13.26,-0.01:99
-chr1 4268802 rs351618 T C 98.42 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=1092.21;QD=26.64;SB=-356.42 GT:AD:DP:GL:GQ 1/1:0,41:37:-112.85,-11.17,-0.05:99
-chr1 4268811 rs351617 C T 143.28 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1491.48;QD=36.38;SB=-509.63 GT:AD:DP:GL:GQ 1/1:1,40:39:-152.75,-11.76,-0.02:99
-chr1 4268960 rs2087571 C T 152.24 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=53.63;MQ0=0;OQ=643.83;QD=17.40;SB=-299.23 GT:AD:DP:GL:GQ 0/1:15,22:34:-77.91,-10.25,-47.03:99
-chr1 4269767 rs351616 A G 168.33 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.39;MQ=58.87;MQ0=0;OQ=1214.77;QD=29.63;SB=-431.27 GT:AD:DP:GL:GQ 1/1:0,41:38:-125.09,-11.46,-0.03:99
-chr1 4270245 rs351615 G A 292.81 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=58.55;MQ0=0;OQ=1966.57;QD=35.76;SB=-975.01 GT:AD:DP:GL:GQ 1/1:0,54:52:-200.27,-15.67,-0.02:99
-chr1 4271723 rs351614 C T 601.68 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2473.56;QD=39.90;SB=-1111.03 GT:AD:DP:GL:GQ 1/1:0,62:62:-250.96,-18.68,-0.01:99
-chr1 4271809 rs12132314 C T 430.38 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.65;MQ0=0;OQ=1181.91;QD=18.18;SB=-613.64 GT:AD:DP:GL:GQ 0/1:30,35:65:-141.06,-19.59,-97.20:99
-chr1 4273032 rs171260 A C 300.19 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=870.08;QD=12.08;SB=-225.83 GT:AD:DP:GL:GQ 0/1:41,31:71:-111.68,-21.38,-150.14:99
-chr1 4274131 rs351613 A C 265.29 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.14;MQ0=0;OQ=2299.32;QD=35.37;SB=-1119.04 GT:AD:DP:GL:GQ 1/1:0,65:65:-233.54,-19.58,-0.02:99
-chr1 4277771 rs351596 C T 568.91 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=2579.09;QD=39.68;SB=-949.23 GT:AD:DP:GL:GQ 1/1:0,65:64:-261.51,-19.28,-0.02:99
-chr1 4279737 rs876273 C G 132.40 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.17;MQ=59.56;MQ0=0;OQ=768.76;QD=14.78;SB=-189.63 GT:AD:DP:GL:GQ 0/1:23,29:48:-94.65,-14.49,-97.38:99
-chr1 4279818 rs351598 A T 381.51 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.53;MQ=59.66;MQ0=0;OQ=991.33;QD=14.58;SB=-452.46 GT:AD:DP:GL:GQ 0/1:35,33:67:-122.60,-20.18,-130.61:99
-chr1 4280055 rs1874269 C T 619.47 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.78;MQ0=0;OQ=2766.74;QD=39.52;SB=-1179.55 GT:AD:DP:GL:GQ 1/1:0,70:69:-280.28,-20.79,-0.02:99
-chr1 4280204 rs2411741 C A 180.72 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=1.15;MQ=60.13;MQ0=0;OQ=1218.75;QD=14.51;SB=-564.82 GT:AD:DP:GL:GQ 0/1:42,42:82:-149.85,-24.70,-149.73:99
-chr1 4280489 rs351599 C T 413.51 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.72;MQ0=0;OQ=1071.03;QD=16.23;SB=-457.49 GT:AD:DP:GL:GQ 0/1:33,33:66:-130.29,-19.90,-102.77:99
-chr1 4285644 . A G 0.07 PASS AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=4;HaplotypeScore=2.54;MQ=57.79;MQ0=0;OQ=595.83;QD=12.16;SB=-120.71 GT:AD:DP:GL:GQ 0/1:26,23:47:-77.03,-14.16,-95.21:99
-chr1 4288221 . G A 0.84 PASS AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=1;HaplotypeScore=8.13;MQ=58.71;MQ0=0;OQ=1360.73;QD=16.39;SB=-394.38 GT:AD:DP:GL:GQ 0/1:43,40:81:-163.76,-24.40,-149.01:99
-chr1 4289709 . T G 46.86 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=16.54;MQ=56.55;MQ0=0;QD=0.98;SB=53.18 GT:AD:DP:GL:GQ 0/1:27,21:32:-17.62,-9.65,-87.21:79.70
-chr1 4292594 rs34245285 G C 0.05 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=3.96;MQ=50.65;MQ0=4;OQ=195.36;QD=3.15;SB=-102.43 GT:AD:DP:GL:GQ 0/1:47,15:34:-33.09,-10.27,-97.74:99
-chr1 4293081 rs34762254 C G 17.74 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=35.42;MQ0=7;QD=0.43;SB=11.07 GT:AD:DP:GL:GQ 0/1:35,5:26:-12.90,-7.85,-90.70:50.51
-chr1 4293374 . G A 3.97 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=44.45;MQ0=2;OQ=329.37;QD=6.59;SB=0.51 GT:AD:DP:GL:GQ 0/1:31,19:40:-48.28,-12.06,-89.72:99
-chr1 4296431 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.01;HRun=0;HaplotypeScore=166.11;MQ=33.71;MQ0=1;OQ=76.77;QD=0.64;SB=116.41 GT:AD:DP:GL:GQ 0/1:95,22:100:-40.80,-29.83,-343.52:99
-chr1 4296441 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=126;Dels=0.07;HRun=0;HaplotypeScore=204.38;MQ=34.16;MQ0=1;OQ=63.06;QD=0.50;SB=111.78 GT:AD:DP:GL:GQ 0/1:104,10:96:-43.83,-34.24,-290.54:95.89
-chr1 4296449 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=0;HaplotypeScore=184.01;MQ=35.76;MQ0=1;OQ=76.57;QD=0.81;SB=108.85 GT:AD:DP:GL:GQ 0/1:78,6:65:-53.79,-42.85,-256.56:99
-chr1 4296459 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=1;HaplotypeScore=225.82;MQ=37.43;MQ0=0;OQ=345.89;QD=3.98;SB=26.09 GT:AD:DP:GL:GQ 0/1:63,24:68:-58.36,-20.48,-198.46:99
-chr1 4296469 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=95;Dels=0.00;HRun=1;HaplotypeScore=189.98;MQ=37.41;MQ0=0;OQ=75.74;QD=0.80;SB=12.63 GT:AD:DP:GL:GQ 0/1:84,11:69:-31.64,-20.79,-221.92:99
-chr1 4296493 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=88.30;MQ=41.30;MQ0=0;OQ=474.04;QD=4.65;SB=-167.48 GT:AD:DP:GL:GQ 0/1:59,36:81:-93.85,-43.16,-272.31:99
-chr1 4296506 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=103;Dels=0.03;HRun=1;HaplotypeScore=78.61;MQ=43.01;MQ0=0;OQ=51.88;QD=0.50;SB=101.36 GT:AD:DP:GL:GQ 0/1:87,13:87:-34.09,-25.62,-299.11:84.72
-chr1 4296513 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=0;HaplotypeScore=60.45;MQ=43.56;MQ0=0;OQ=185.47;QD=1.85;SB=-3.86 GT:AD:DP:GL:GQ 0/1:80,18:74:-44.13,-22.29,-236.48:99
-chr1 4296520 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=111;Dels=0.00;HRun=1;HaplotypeScore=86.57;MQ=43.66;MQ0=0;OQ=90.49;QD=0.82;SB=69.81 GT:AD:DP:GL:GQ 0/1:99,12:95:-40.96,-28.62,-301.41:99
-chr1 4296571 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=100;Dels=0.02;HRun=0;HaplotypeScore=148.81;MQ=42.35;MQ0=0;OQ=149.13;QD=1.49;SB=56.28 GT:AD:DP:GL:GQ 0/1:64,20:79:-66.77,-48.58,-247.91:99
-chr1 4296587 . G A 55.07 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=113;Dels=0.02;HRun=0;HaplotypeScore=138.42;MQ=36.11;MQ0=2;QD=0.49;SB=3.46 GT:AD:DP:GL:GQ 0/1:83,28:77:-31.99,-23.20,-236.17:87.91
-chr1 4296590 . A G 63.20 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=113;Dels=0.01;HRun=1;HaplotypeScore=134.39;MQ=36.11;MQ0=2;QD=0.56;SB=44.15 GT:AD:DP:GL:GQ 0/1:101,11:84:-34.62,-25.01,-283.57:96.04
-chr1 4296596 . G A 133.96 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=123;Dels=0.00;HRun=0;HaplotypeScore=190.44;MQ=35.58;MQ0=2;QD=1.09;SB=41.12 GT:AD:DP:GL:GQ 0/1:107,16:99:-46.51,-29.83,-296.83:99
-chr1 4296607 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=125;Dels=0.00;HRun=1;HaplotypeScore=185.73;MQ=34.74;MQ0=2;OQ=309.12;QD=2.47;SB=41.15 GT:AD:DP:GL:GQ 0/1:106,19:100:-64.31,-30.12,-298.02:99
-chr1 4296636 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=128;Dels=0.00;HRun=0;HaplotypeScore=188.32;MQ=35.30;MQ0=3;OQ=116.48;QD=0.91;SB=56.18 GT:AD:DP:GL:GQ 0/1:110,17:102:-45.68,-30.75,-346.20:99
-chr1 4296642 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=130;Dels=0.00;HRun=1;HaplotypeScore=236.73;MQ=34.36;MQ0=5;OQ=253.36;QD=1.95;SB=47.15 GT:AD:DP:GL:GQ 0/1:113,17:102:-59.34,-30.72,-306.11:99
-chr1 4296665 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=107.40;MQ=33.96;MQ0=6;OQ=319.22;QD=2.73;SB=50.15 GT:AD:DP:GL:GQ 0/1:91,24:96:-64.13,-28.92,-272.83:99
-chr1 4296668 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=119;Dels=0.01;HRun=0;HaplotypeScore=114.24;MQ=34.12;MQ0=7;OQ=295.42;QD=2.48;SB=-19.17 GT:AD:DP:GL:GQ 0/1:99,19:98:-62.05,-29.23,-276.38:99
-chr1 4296677 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=110;Dels=0.03;HRun=0;HaplotypeScore=117.38;MQ=34.73;MQ0=5;OQ=320.24;QD=2.91;SB=47.14 GT:AD:DP:GL:GQ 0/1:86,21:91:-62.13,-26.82,-250.93:99
-chr1 4296686 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=0;HaplotypeScore=54.93;MQ=36.96;MQ0=5;OQ=147.08;QD=1.67;SB=50.15 GT:AD:DP:GL:GQ 0/1:78,10:74:-40.29,-22.30,-219.44:99
-chr1 4308180 . C T 161.22 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.53;MQ0=0;OQ=1282.15;QD=17.56;SB=-488.11 GT:AD:DP:GL:GQ 0/1:35,38:73:-153.50,-22.00,-116.62:99
-chr1 4309112 . A C 86.02 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.15;MQ=59.03;MQ0=0;OQ=562.66;QD=13.09;SB=-287.67 GT:AD:DP:GL:GQ 0/1:22,20:43:-74.67,-15.12,-82.44:99
-chr1 4310347 . C T 101.72 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.41;MQ0=0;OQ=1172.68;QD=16.52;SB=-579.36 GT:AD:DP:GL:GQ 0/1:36,35:70:-141.64,-21.08,-130.80:99
-chr1 4314528 . T C 249.50 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.71;QD=18.38;SB=-476.64 GT:AD:DP:GL:GQ 0/1:22,35:57:-125.23,-17.17,-90.17:99
-chr1 4316332 . T G 43.87 PASS AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.09;MQ=59.28;MQ0=0;OQ=471.43;QD=14.73;SB=-242.41 GT:AD:DP:GL:GQ 0/1:14,18:31:-59.77,-9.34,-47.32:99
-chr1 4316334 . C G 15.52 PASS AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.32;MQ0=0;OQ=676.22;QD=19.89;SB=-323.04 GT:AD:DP:GL:GQ 0/1:15,19:34:-81.16,-10.25,-60.88:99
-chr1 4318103 rs349395 A G 659.54 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=1716.14;QD=31.20;SB=-834.63 GT:AD:DP:GL:GQ 1/1:0,55:54:-175.24,-16.28,-0.05:99
-chr1 4319680 rs349393 A C 563.28 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=813.26;QD=15.95;SB=-376.77 GT:AD:DP:GL:GQ 0/1:23,28:51:-99.97,-15.36,-86.41:99
-chr1 4319765 rs102083 A T 361.40 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=55.80;MQ0=0;OQ=747.97;QD=14.96;SB=-385.65 GT:AD:DP:GL:GQ 0/1:24,26:48:-92.54,-14.46,-85.84:99
-chr1 4319782 rs28431405 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=20;HaplotypeScore=17.05;MQ=53.28;MQ0=0;OQ=875.22;QD=14.59;SB=-406.12 GT:AD:DP:GL:GQ 0/1:25,35:49:-105.57,-14.76,-69.63:99
-chr1 4319814 rs102085 G A 15.88 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=5.54;MQ=52.08;MQ0=0;OQ=929.67;QD=17.22;SB=-462.49 GT:AD:DP:GL:GQ 0/1:25,29:49:-111.01,-14.76,-74.46:99
-chr1 4319857 rs17410050 C T 91.63 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.83;MQ0=0;OQ=1009.89;QD=18.36;SB=-347.35 GT:AD:DP:GL:GQ 0/1:26,29:55:-120.84,-16.57,-94.75:99
-chr1 4320268 rs349392 G T 359.85 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.27;MQ=58.71;MQ0=0;OQ=818.84;QD=15.16;SB=-433.16 GT:AD:DP:GL:GQ 0/1:23,30:49:-99.94,-14.77,-68.96:99
-chr1 4320352 rs101287 A C 9.82 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.94;MQ=58.91;MQ0=0;OQ=686.61;QD=10.73;SB=-323.81 GT:AD:DP:GL:GQ 0/1:36,28:61:-90.33,-18.38,-119.68:99
-chr1 4321671 rs56216403 A T 13.76 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=7.66;MQ=57.98;MQ0=0;OQ=569.50;QD=12.94;SB=-290.67 GT:AD:DP:GL:GQ 0/1:24,20:41:-72.59,-12.36,-76.85:99
-chr1 4321865 rs349391 T C 61.74 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=58.51;MQ0=0;OQ=775.30;QD=16.50;SB=-140.34 GT:AD:DP:GL:GQ 0/1:20,26:42:-93.47,-12.66,-62.46:99
-chr1 4321866 rs56376431 G A 8.49 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.58;MQ=58.51;MQ0=0;OQ=873.71;QD=18.59;SB=-178.26 GT:AD:DP:GL:GQ 0/1:21,26:42:-103.31,-12.65,-56.39:99
-chr1 4322006 rs56162804 C T 116.80 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.53;MQ0=0;OQ=1021.04;QD=20.84;SB=-534.77 GT:AD:DP:GL:GQ 0/1:19,30:49:-120.16,-14.77,-59.62:99
-chr1 4322030 rs55838104 C T 52.16 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=1120.64;QD=21.14;SB=-534.76 GT:AD:DP:GL:GQ 0/1:20,33:52:-131.01,-15.67,-66.54:99
-chr1 4322090 rs16838800 A G 416.20 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=910.62;QD=19.80;SB=-423.34 GT:AD:DP:GL:GQ 0/1:16,30:46:-108.20,-13.86,-64.49:99
-chr1 4322538 rs12403556 C G 69.76 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.92;MQ=60.00;MQ0=0;OQ=1513.57;QD=24.81;SB=-525.74 GT:AD:DP:GL:GQ 0/1:20,41:61:-173.03,-18.39,-83.32:99
-chr1 4322543 rs12404034 A G 25.15 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=3.64;MQ=60.00;MQ0=0;OQ=1221.46;QD=20.02;SB=-417.22 GT:AD:DP:GL:GQ 0/1:20,41:60:-143.50,-18.07,-80.25:99
-chr1 4322609 rs12404038 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=5;HaplotypeScore=9.16;MQ=59.56;MQ0=0;OQ=664.61;QD=12.54;SB=-143.41 GT:AD:DP:GL:GQ 0/1:24,29:49:-84.51,-14.77,-94.35:99
-chr1 4322739 rs12404366 T C 226.21 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=432.95;QD=9.41;SB=-158.54 GT:AD:DP:GL:GQ 0/1:29,17:46:-60.44,-13.86,-115.98:99
-chr1 4322916 rs12402553 G A 357.39 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.62;MQ0=0;OQ=842.62;QD=13.81;SB=-393.36 GT:AD:DP:GL:GQ 0/1:35,26:59:-105.32,-17.77,-117.60:99
-chr1 4323438 rs16838810 A G 123.66 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.32;MQ=59.40;MQ0=0;OQ=808.90;QD=13.05;SB=-366.96 GT:AD:DP:GL:GQ 0/1:30,32:61:-102.56,-18.39,-119.19:99
-chr1 4323490 rs55944275 G A 62.78 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.36;MQ0=0;OQ=1153.53;QD=19.89;SB=-343.36 GT:AD:DP:GL:GQ 0/1:24,34:57:-135.81,-17.17,-85.54:99
-chr1 4323756 rs349390 T C 313.61 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.62;MQ0=0;OQ=671.97;QD=11.20;SB=-140.85 GT:AD:DP:GL:GQ 0/1:34,26:58:-87.95,-17.47,-136.36:99
-chr1 4323757 rs58351078 G A 132.53 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.61;MQ0=0;OQ=802.14;QD=13.60;SB=-181.76 GT:AD:DP:GL:GQ 0/1:34,25:59:-101.27,-17.77,-124.39:99
-chr1 4323928 rs61676533 C T 374.12 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.48;MQ0=0;OQ=1036.80;QD=14.40;SB=-477.00 GT:AD:DP:GL:GQ 0/1:40,32:72:-128.65,-21.69,-142.77:99
-chr1 4323975 rs16838812 A G 340.79 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.98;MQ=59.17;MQ0=0;OQ=822.30;QD=12.09;SB=-364.22 GT:AD:DP:GL:GQ 0/1:38,30:68:-106.00,-20.49,-150.74:99
-chr1 4324005 rs16838813 G A 586.02 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.08;MQ0=0;OQ=833.74;QD=14.13;SB=-356.82 GT:AD:DP:GL:GQ 0/1:33,26:58:-104.14,-17.48,-106.56:99
-chr1 4324062 rs56775247 A G 352.77 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.86;MQ0=0;OQ=755.78;QD=11.81;SB=-150.88 GT:AD:DP:GL:GQ 0/1:37,27:64:-98.14,-19.28,-148.79:99
-chr1 4324102 rs57599092 A T 199.13 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=53.27;MQ0=0;OQ=1008.31;QD=14.83;SB=-333.61 GT:AD:DP:GL:GQ 0/1:34,34:66:-123.99,-19.88,-127.49:99
-chr1 4324399 rs11804096 T C 269.49 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=45.70;MQ0=1;OQ=598.48;QD=11.29;SB=-306.38 GT:AD:DP:GL:GQ 0/1:28,25:48:-77.59,-14.46,-100.69:99
-chr1 4324626 rs11803736 A G 203.50 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=51.26;MQ0=1;OQ=569.48;QD=10.55;SB=-273.41 GT:AD:DP:GL:GQ 0/1:32,22:52:-75.89,-15.66,-126.39:99
-chr1 4324693 rs11801800 G A 371.17 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=50.70;MQ0=1;OQ=920.80;QD=14.85;SB=-460.99 GT:AD:DP:GL:GQ 0/1:32,30:59:-113.14,-17.77,-113.29:99
-chr1 4324939 rs12729994 C A 219.08 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=56.71;MQ0=0;OQ=746.98;QD=16.98;SB=-320.72 GT:AD:DP:GL:GQ 0/1:18,26:42:-90.63,-12.65,-55.46:99
-chr1 4325115 rs12742617 T G 433.06 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.56;MQ0=0;OQ=1013.88;QD=12.07;SB=-397.13 GT:AD:DP:GL:GQ 0/1:47,37:83:-129.67,-25.00,-173.24:99
-chr1 4325508 rs34012704 A G 166.42 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=59.63;MQ0=0;OQ=986.31;QD=19.34;SB=-504.18 GT:AD:DP:GL:GQ 0/1:17,34:49:-116.68,-14.77,-62.75:99
-chr1 4325583 . G A 54.73 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=60.00;MQ0=0;OQ=709.46;QD=16.50;SB=-303.82 GT:AD:DP:GL:GQ 0/1:18,25:41:-86.59,-12.36,-64.70:99
-chr1 4325707 rs12405082 A G 0.52 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=6.04;MQ=58.57;MQ0=0;OQ=521.78;QD=8.42;SB=-177.38 GT:AD:DP:GL:GQ 0/1:38,24:56:-72.34,-16.88,-134.28:99
-chr1 4325759 . C T 1.66 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=2;HaplotypeScore=2.89;MQ=58.50;MQ0=0;OQ=768.28;QD=12.39;SB=-160.15 GT:AD:DP:GL:GQ 0/1:32,29:57:-97.29,-17.18,-106.60:99
-chr1 4325887 rs12403671 G C 245.59 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.67;MQ0=0;OQ=1119.45;QD=19.64;SB=-552.71 GT:AD:DP:GL:GQ 0/1:24,33:54:-131.50,-16.27,-104.02:99
-chr1 4325945 rs12404619 C T 347.85 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.65;MQ0=0;OQ=874.85;QD=15.91;SB=-387.13 GT:AD:DP:GL:GQ 0/1:26,29:53:-106.74,-15.97,-91.70:99
-chr1 4326338 rs16838819 A C 229.78 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=4.02;MQ=58.63;MQ0=0;OQ=550.44;QD=10.79;SB=-296.79 GT:AD:DP:GL:GQ 0/1:29,22:49:-73.09,-14.76,-103.75:99
-chr1 4327728 rs34472761 G C 257.96 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.05;MQ0=0;OQ=1072.08;QD=16.75;SB=-550.71 GT:AD:DP:GL:GQ 0/1:32,32:62:-129.19,-18.70,-130.17:99
-chr1 4328031 rs56108323 G A 198.39 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=626.21;QD=12.28;SB=-249.12 GT:AD:DP:GL:GQ 0/1:27,24:48:-80.37,-14.46,-97.54:99
-chr1 4329322 rs483344 A G 283.35 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.34;MQ0=0;OQ=672.82;QD=9.61;SB=-273.11 GT:AD:DP:GL:GQ 0/1:41,29:68:-91.06,-20.50,-159.89:99
-chr1 4331124 rs572439 A C 450.24 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.73;MQ0=0;OQ=1069.67;QD=15.73;SB=-417.82 GT:AD:DP:GL:GQ 0/1:30,38:67:-130.43,-20.18,-110.75:99
-chr1 4331158 rs572343 G A 289.61 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.72;MQ0=0;OQ=1247.65;QD=18.62;SB=-597.10 GT:AD:DP:GL:GQ 0/1:31,36:64:-147.32,-19.27,-103.83:99
-chr1 4331483 rs12750862 T C 292.32 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=59.55;MQ0=0;OQ=752.94;QD=14.76;SB=-378.63 GT:AD:DP:GL:GQ 0/1:24,27:49:-93.35,-14.77,-86.37:99
-chr1 4331508 . C T 49.49 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=60.00;MQ0=0;OQ=892.12;QD=17.84;SB=-369.91 GT:AD:DP:GL:GQ 0/1:18,31:43:-105.46,-12.97,-47.94:99
-chr1 4333712 rs2926485 T C 268.41 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.56;MQ=59.83;MQ0=0;OQ=1004.92;QD=15.70;SB=-484.15 GT:AD:DP:GL:GQ 0/1:28,35:61:-122.15,-18.38,-108.51:99
-chr1 4334184 rs57575485 C T 360.52 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.70;MQ0=0;OQ=1292.51;QD=16.79;SB=-566.07 GT:AD:DP:GL:GQ 0/1:37,40:76:-155.43,-22.90,-133.07:99
-chr1 4334834 rs661536 A G 714.01 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1993.62;QD=34.98;SB=-900.02 GT:AD:DP:GL:GQ 1/1:0,57:57:-202.97,-17.17,-0.02:99
-chr1 4339520 rs902403 T C 449.51 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=846.06;QD=12.44;SB=-357.94 GT:AD:DP:GL:GQ 0/1:35,33:68:-108.38,-20.49,-140.89:99
-chr1 4339677 rs2926482 C G 218.76 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2219.96;QD=42.69;SB=-974.35 GT:AD:DP:GL:GQ 1/1:0,52:52:-225.60,-15.67,-0.01:99
-chr1 4340373 rs590798 A C 514.93 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2632.91;QD=34.64;SB=-1142.61 GT:AD:DP:GL:GQ 1/1:0,76:76:-266.90,-22.89,-0.03:99
-chr1 4344158 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=3;HaplotypeScore=3.49;MQ=60.00;MQ0=0;OQ=63.29;QD=1.07;SB=56.21 GT:AD:DP:GL:GQ 0/1:42,17:47:-23.79,-14.18,-151.98:96.13
-chr1 4344566 rs349413 C A 606.43 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1116.07;QD=14.69;SB=-454.53 GT:AD:DP:GL:GQ 0/1:39,37:76:-137.78,-22.89,-141.17:99
-chr1 4345038 rs164598 G A 482.03 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.02;MQ0=0;OQ=1164.61;QD=17.38;SB=-524.70 GT:AD:DP:GL:GQ 0/1:32,35:67:-139.93,-20.18,-113.85:99
-chr1 4347591 rs4654526 C T 500.86 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1310.21;QD=20.16;SB=-660.78 GT:AD:DP:GL:GQ 0/1:25,40:61:-152.69,-18.39,-71.94:99
-chr1 4351708 rs11585123 G T 52.90 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=1.96;MQ=59.43;MQ0=0;OQ=956.92;QD=13.11;SB=-391.99 GT:AD:DP:GL:GQ 0/1:39,34:73:-120.97,-21.99,-133.39:99
-chr1 4352257 rs627555 G A 556.89 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=1274.67;QD=14.01;SB=-577.49 GT:AD:DP:GL:GQ 0/1:53,38:91:-158.16,-27.41,-187.48:99
-chr1 4352698 . A C 145.09 PASS AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1251.00;QD=14.55;SB=-612.69 GT:AD:DP:GL:GQ 0/1:43,43:84:-153.68,-25.30,-154.64:99
-chr1 4353326 rs7523383 C T 223.33 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=1125.20;QD=18.75;SB=-322.36 GT:AD:DP:GL:GQ 0/1:24,35:55:-132.39,-16.58,-65.47:99
-chr1 4354986 rs55703746 G T 228.36 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=1494.65;QD=18.68;SB=-625.43 GT:AD:DP:GL:GQ 0/1:32,48:80:-176.84,-24.10,-112.47:99
-chr1 4358435 . C T 24.59 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=1;HaplotypeScore=3.25;MQ=55.69;MQ0=0;QD=0.61;SB=41.14 GT:AD:DP:GL:GQ 0/1:35,4:36:-16.60,-10.86,-102.91:57.41
-chr1 4358482 . C G 35.61 LowQual AC=1;AF=0.50;AN=2;DP=34;Dels=0.00;HRun=0;HaplotypeScore=3.12;MQ=54.32;MQ0=0;QD=1.05;SB=-23.70 GT:AD:DP:GL:GQ 0/1:30,4:32:-16.49,-9.64,-124.37:68.45
-chr1 4359549 rs6679220 T C 288.35 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=543.81;QD=10.66;SB=-272.37 GT:AD:DP:GL:GQ 0/1:30,21:50:-72.72,-15.06,-124.68:99
-chr1 4360825 rs56081339 G A 327.33 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.43;MQ0=0;OQ=993.85;QD=13.61;SB=-456.06 GT:AD:DP:GL:GQ 0/1:40,33:70:-123.78,-21.11,-120.70:99
-chr1 4363525 rs349402 G A 561.81 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.26;MQ0=0;OQ=1290.95;QD=16.99;SB=-425.80 GT:AD:DP:GL:GQ 0/1:36,40:74:-154.68,-22.30,-119.31:99
-chr1 4367389 rs4654429 G A 56.05 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=5.58;MQ=57.65;MQ0=0;OQ=1142.68;QD=16.80;SB=-522.78 GT:AD:DP:GL:GQ 0/1:32,36:64:-136.84,-19.29,-93.56:99
-chr1 4367566 rs4654430 T C 472.63 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=611.79;QD=10.92;SB=-199.58 GT:AD:DP:GL:GQ 0/1:34,22:55:-81.03,-16.57,-131.86:99
-chr1 4368744 rs547923 C A 335.14 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=58.91;MQ0=0;OQ=794.59;QD=12.42;SB=-343.21 GT:AD:DP:GL:GQ 0/1:34,30:61:-101.12,-18.38,-116.77:99
-chr1 4369295 rs6687224 C G 567.99 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1064.80;QD=17.75;SB=-495.28 GT:AD:DP:GL:GQ 0/1:29,31:59:-127.55,-17.78,-120.89:99
-chr1 4369728 rs733308 T G 295.33 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.39;MQ=59.19;MQ0=1;OQ=894.22;QD=10.65;SB=-355.63 GT:AD:DP:GL:GQ 0/1:48,36:83:-117.71,-25.00,-176.40:99
-chr1 4370735 rs2926477 A G 468.63 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=995.20;QD=15.31;SB=-357.26 GT:AD:DP:GL:GQ 0/1:29,36:64:-122.09,-19.28,-116.14:99
-chr1 4371593 rs505933 A G 376.41 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.99;MQ0=0;OQ=894.44;QD=10.78;SB=-423.73 GT:AD:DP:GL:GQ 0/1:45,38:82:-117.44,-24.72,-179.72:99
-chr1 4371867 rs693045 T C 492.95 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.26;MQ0=0;OQ=669.20;QD=9.99;SB=-303.21 GT:AD:DP:GL:GQ 0/1:37,30:64:-89.50,-19.29,-143.01:99
-chr1 4371873 rs10915529 G C 482.75 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.33;MQ0=0;OQ=903.58;QD=12.91;SB=-393.25 GT:AD:DP:GL:GQ 0/1:40,30:69:-114.44,-20.80,-177.40:99
-chr1 4371886 rs659514 T C 97.64 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=1.39;MQ=58.28;MQ0=0;OQ=683.73;QD=10.05;SB=-268.51 GT:AD:DP:GL:GQ 0/1:42,26:67:-91.84,-20.18,-171.36:99
-chr1 4372308 rs4654533 C G 209.19 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1490.53;QD=19.61;SB=-620.61 GT:AD:DP:GL:GQ 0/1:35,41:72:-174.05,-21.72,-126.16:99
-chr1 4375044 rs349405 A C 311.25 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=541.86;QD=10.62;SB=-270.89 GT:AD:DP:GL:GQ 0/1:31,20:51:-72.83,-15.36,-116.45:99
-chr1 4375626 rs349406 T C 212.51 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=2.99;MQ=59.38;MQ0=0;OQ=1112.63;QD=14.84;SB=-554.63 GT:AD:DP:GL:GQ 0/1:36,39:72:-136.23,-21.69,-140.85:99
-chr1 4375771 rs12562242 G T 432.17 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=59.23;MQ0=0;OQ=915.50;QD=12.54;SB=-381.76 GT:AD:DP:GL:GQ 0/1:39,34:71:-116.22,-21.39,-137.78:99
-chr1 4376133 rs349407 G A 305.49 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.03;MQ0=1;OQ=1382.00;QD=18.43;SB=-530.55 GT:AD:DP:GL:GQ 0/1:31,44:71:-162.87,-21.39,-107.28:99
-chr1 4376945 rs10915530 C T 589.94 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1129.31;QD=16.13;SB=-586.64 GT:AD:DP:GL:GQ 0/1:35,35:68:-136.71,-20.50,-105.26:99
-chr1 4377252 rs1490416 T A 34.72 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.01;HRun=1;HaplotypeScore=4.80;MQ=59.18;MQ0=0;OQ=1402.77;QD=16.50;SB=-436.53 GT:AD:DP:GL:GQ 0/1:39,45:80:-167.66,-24.10,-131.13:99
-chr1 4377771 rs349409 C T 337.62 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.02;MQ=59.15;MQ0=0;OQ=1097.95;QD=15.46;SB=-477.48 GT:AD:DP:GL:GQ 0/1:37,34:69:-133.86,-20.78,-131.05:99
-chr1 4377899 rs349410 C A 42.06 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=4.55;MQ=59.19;MQ0=0;OQ=1054.50;QD=18.50;SB=-399.14 GT:AD:DP:GL:GQ 0/1:22,35:56:-125.60,-16.87,-75.99:99
-chr1 4377949 rs349411 C T 2.69 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=11.72;MQ=58.87;MQ0=0;OQ=1481.01;QD=18.06;SB=-689.93 GT:AD:DP:GL:GQ 0/1:37,45:80:-175.49,-24.10,-130.86:99
-chr1 4377999 rs10915531 A G 391.37 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.24;MQ0=0;OQ=1298.04;QD=16.23;SB=-576.28 GT:AD:DP:GL:GQ 0/1:36,44:80:-157.19,-24.10,-146.95:99
-chr1 4380137 rs493178 G C 0.36 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.09;MQ=57.06;MQ0=0;OQ=874.81;QD=23.64;SB=-165.59 GT:AD:DP:GL:GQ 0/1:11,26:34:-101.01,-10.25,-40.96:99
-chr1 4380197 . G A 21.03 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=23.38;MQ=29.95;MQ0=2;QD=0.68;SB=41.12 GT:AD:DP:GL:GQ 0/1:26,5:22:-12.01,-6.63,-63.36:53.84
-chr1 4380201 rs59237016 A T 117.83 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=21.39;MQ=30.09;MQ0=2;QD=4.36;SB=-11.73 GT:AD:DP:GL:GQ 0/1:19,6:13:-24.36,-9.29,-27.60:99
-chr1 4380203 . A G 41.11 LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=25;Dels=0.00;HRun=0;HaplotypeScore=24.37;MQ=28.28;MQ0=2;QD=1.64;SB=-10.00 GT:AD:DP:GL:GQ 0/1:17,7:10:-10.41,-3.01,-27.49:73.95
-chr1 4380215 . G A 523.36 SnpCluster AC=2;AF=1.00;AN=2;DP=19;Dels=0.05;HRun=0;HaplotypeScore=13.20;MQ=29.01;MQ0=2;QD=27.55;SB=-164.67 GT:AD:DP:GL:GQ 1/1:1,17:14:-55.92,-4.22,-0.00:42.14
-chr1 4380217 rs60888156 G A 452.59 SnpCluster AC=2;AF=1.00;AN=2;DB;DP=19;Dels=0.05;HRun=0;HaplotypeScore=13.68;MQ=29.01;MQ0=2;QD=23.82;SB=-163.66 GT:AD:DP:GL:GQ 1/1:4,14:14:-51.77,-4.22,-2.97:12.46
-chr1 4380219 . G A 274.46 SnpCluster AC=1;AF=0.50;AN=2;DP=17;Dels=0.06;HRun=0;HaplotypeScore=11.89;MQ=29.85;MQ0=1;QD=16.14;SB=-148.61 GT:AD:DP:GL:GQ 0/1:5,11:13:-34.65,-3.92,-13.88:99
-chr1 4380249 . G A 49.25 LowQual AC=2;AF=1.00;AN=2;DP=3;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=23.68;MQ0=1;QD=16.42;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,3:2:-8.33,-0.60,-0.00:6.02
-chr1 4380271 rs6697112 G A 9.28 PASS AC=2;AF=1.00;AN=2;DB;DP=5;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=37.32;MQ0=0;OQ=124.22;QD=24.84;SB=-44.55 GT:AD:DP:GL:GQ 1/1:1,4:4:-15.96,-1.21,-0.00:12.04
-chr1 4380311 rs1309838 C A 157.04 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=54.85;MQ0=0;OQ=623.10;QD=14.84;SB=-208.87 GT:AD:DP:GL:GQ 0/1:19,23:41:-77.95,-12.35,-68.48:99
-chr1 4380330 rs1309839 C T 0.61 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=7.73;MQ=55.45;MQ0=0;OQ=843.65;QD=20.09;SB=-255.33 GT:AD:DP:GL:GQ 0/1:15,27:37:-98.80,-11.15,-35.58:99
-chr1 4380929 . T C 25.32 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=2;HaplotypeScore=5.44;MQ=59.32;MQ0=0;QD=0.37;SB=122.43 GT:AD:DP:GL:GQ 0/1:48,20:54:-22.08,-16.27,-188.06:58.14
-chr1 4380941 rs349386 C T 474.31 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.84;MQ0=0;OQ=1352.78;QD=17.80;SB=-554.75 GT:AD:DP:GL:GQ 0/1:36,40:74:-160.85,-22.29,-128.59:99
-chr1 4381075 rs4654432 C T 88.73 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=1.63;MQ=60.32;MQ0=0;OQ=870.11;QD=12.80;SB=-258.77 GT:AD:DP:GL:GQ 0/1:40,28:66:-110.19,-19.90,-123.57:99
-chr1 4381353 rs35799150 A G 389.01 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=820.10;QD=12.06;SB=-192.18 GT:AD:DP:GL:GQ 0/1:39,29:68:-105.78,-20.48,-159.19:99
-chr1 4381492 rs4654433 G A 604.36 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1070.93;QD=15.98;SB=-493.09 GT:AD:DP:GL:GQ 0/1:35,32:67:-130.57,-20.19,-112.83:99
-chr1 4382470 rs737324 G C 535.52 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1310.24;QD=17.47;SB=-409.80 GT:AD:DP:GL:GQ 0/1:38,37:74:-156.61,-22.31,-151.67:99
-chr1 4382624 rs349385 A G 200.13 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=56.49;MQ0=0;OQ=1553.01;QD=28.76;SB=-619.97 GT:AD:DP:GL:GQ 1/1:0,53:51:-158.94,-15.39,-0.06:99
-chr1 4383263 rs41266223 T C 212.32 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=57.69;MQ0=0;OQ=666.08;QD=11.29;SB=-355.38 GT:AD:DP:GL:GQ 0/1:32,27:53:-85.86,-15.97,-114.12:99
-chr1 4385955 rs4654537 A G 109.83 PASS AC=1;AF=0.50;AN=2;DB;DP=23;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=60.00;MQ0=0;OQ=187.72;QD=8.16;SB=-92.99 GT:AD:DP:GL:GQ 0/1:12,10:21:-28.39,-6.33,-46.97:99
-chr1 4386470 rs1762818 A G 620.72 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=2262.65;QD=34.81;SB=-1121.77 GT:AD:DP:GL:GQ 1/1:0,65:63:-229.87,-18.98,-0.02:99
-chr1 4386565 rs2035009 T C 346.94 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=58.05;MQ0=0;OQ=655.98;QD=10.93;SB=-329.97 GT:AD:DP:GL:GQ 0/1:30,30:56:-85.78,-16.89,-109.09:99
-chr1 4386918 rs2035008 T A 56.82 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=1.25;MQ=55.07;MQ0=0;OQ=728.43;QD=12.14;SB=-228.91 GT:AD:DP:GL:GQ 0/1:33,27:58:-93.60,-17.47,-122.91:99
-chr1 4387800 . G A 279.77 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1023.92;QD=16.25;SB=-391.36 GT:AD:DP:GL:GQ 0/1:32,31:61:-124.06,-18.39,-99.73:99
-chr1 4388151 rs4654542 C T 244.41 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.62;MQ=60.00;MQ0=0;OQ=1264.25;QD=16.63;SB=-528.76 GT:AD:DP:GL:GQ 0/1:37,39:75:-152.31,-22.60,-121.60:99
-chr1 4388316 rs4654434 G A 492.22 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.13;QD=14.54;SB=-490.97 GT:AD:DP:GL:GQ 0/1:40,32:72:-129.68,-21.69,-147.17:99
-chr1 4388691 rs6667927 C T 322.46 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.79;MQ0=0;OQ=1604.10;QD=18.23;SB=-806.38 GT:AD:DP:GL:GQ 0/1:41,47:88:-190.20,-26.51,-149.18:99
-chr1 4388839 rs6658372 G A 449.72 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.10;MQ0=0;OQ=954.40;QD=14.24;SB=-360.06 GT:AD:DP:GL:GQ 0/1:36,31:66:-118.61,-19.88,-128.27:99
-chr1 4389258 rs6678792 T C 469.97 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.45;MQ0=0;OQ=1167.87;QD=15.37;SB=-534.97 GT:AD:DP:GL:GQ 0/1:37,39:76:-142.96,-22.89,-149.63:99
-chr1 4389389 rs10915533 G A 316.56 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=59.63;MQ0=0;OQ=829.91;QD=13.39;SB=-417.75 GT:AD:DP:GL:GQ 0/1:33,29:58:-103.75,-17.48,-109.80:99
-chr1 4389459 rs995749 T C 99.11 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.02;MQ=59.19;MQ0=0;OQ=673.64;QD=11.82;SB=-297.62 GT:AD:DP:GL:GQ 0/1:29,28:55:-87.23,-16.58,-114.38:99
-chr1 4390198 rs6676603 A T 439.97 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.38;MQ0=0;OQ=1300.48;QD=17.57;SB=-634.13 GT:AD:DP:GL:GQ 0/1:32,42:73:-155.32,-21.99,-116.56:99
-chr1 4390481 rs12128251 T C 259.49 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=57.96;MQ0=0;OQ=632.69;QD=11.94;SB=-295.21 GT:AD:DP:GL:GQ 0/1:28,25:50:-81.62,-15.07,-105.90:99
-chr1 4391861 rs2007533 T A 193.95 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=57.74;MQ0=0;OQ=586.86;QD=11.51;SB=-140.76 GT:AD:DP:GL:GQ 0/1:30,21:48:-76.43,-14.46,-99.70:99
-chr1 4391958 rs1809702 T C 301.51 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1033.40;QD=12.45;SB=-514.71 GT:AD:DP:GL:GQ 0/1:39,44:81:-131.04,-24.42,-155.02:99
-chr1 4392226 rs736265 G A 87.76 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=4.07;MQ=59.56;MQ0=0;OQ=793.67;QD=14.97;SB=-313.81 GT:AD:DP:GL:GQ 0/1:27,26:51:-98.01,-15.36,-98.57:99
-chr1 4393075 rs1556691 A G 599.93 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.74;MQ0=0;OQ=937.52;QD=14.88;SB=-473.07 GT:AD:DP:GL:GQ 0/1:29,34:61:-115.41,-18.38,-116.29:99
-chr1 4393225 rs4654435 T C 403.94 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=60.00;MQ0=0;OQ=690.21;QD=11.50;SB=-328.14 GT:AD:DP:GL:GQ 0/1:28,31:55:-88.89,-16.58,-104.73:99
-chr1 4394358 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=18;HaplotypeScore=18.20;MQ=57.05;MQ0=0;OQ=138.13;QD=2.76;SB=68.21 GT:AD:DP:GL:GQ 0/1:39,11:43:-30.06,-12.96,-119.55:99
-chr1 4394377 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=18;HaplotypeScore=17.15;MQ=55.75;MQ0=0;OQ=145.86;QD=2.75;SB=25.24 GT:AD:DP:GL:GQ 0/1:40,13:43:-30.82,-12.95,-126.23:99
-chr1 4394834 rs12072315 G A 483.58 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=835.16;QD=15.47;SB=-392.90 GT:AD:DP:GL:GQ 0/1:29,25:53:-102.78,-15.98,-90.62:99
-chr1 4394951 rs7546444 A G 181.93 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.12;MQ0=0;OQ=846.04;QD=12.26;SB=-340.27 GT:AD:DP:GL:GQ 0/1:38,31:68:-108.38,-20.49,-147.54:99
-chr1 4395538 rs1591426 T C 726.29 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=2474.70;QD=34.37;SB=-1102.69 GT:AD:DP:GL:GQ 1/1:0,72:71:-251.09,-21.39,-0.04:99
-chr1 4395562 rs1591425 A G 113.89 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.25;MQ0=0;OQ=1914.52;QD=29.01;SB=-807.30 GT:AD:DP:GL:GQ 1/1:0,66:62:-195.10,-18.70,-0.06:99
-chr1 4396040 rs10915536 C T 108.05 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.40;MQ0=0;OQ=3075.21;QD=39.94;SB=-1236.02 GT:AD:DP:GL:GQ 1/1:0,77:77:-311.12,-23.19,-0.02:99
-chr1 4396189 rs1762813 C T 709.23 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.85;MQ0=0;OQ=1988.33;QD=37.52;SB=-957.81 GT:AD:DP:GL:GQ 1/1:0,52:51:-202.43,-15.36,-0.01:99
-chr1 4396377 rs1674876 G A 690.55 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=3414.62;QD=39.70;SB=-1526.04 GT:AD:DP:GL:GQ 1/1:0,86:85:-340.46,-25.61,-0.02:99
-chr1 4396770 rs1335365 G A 180.08 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=3218.44;QD=38.31;SB=-1546.06 GT:AD:DP:GL:GQ 1/1:0,84:82:-325.46,-24.71,-0.03:99
-chr1 4396978 rs6660514 C T 529.47 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2569.74;QD=40.15;SB=-881.18 GT:AD:DP:GL:GQ 1/1:0,64:63:-260.57,-18.97,-0.01:99
-chr1 4396990 rs1335363 G A 705.95 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=2655.20;QD=39.05;SB=-1068.35 GT:AD:DP:GL:GQ 1/1:0,68:67:-269.12,-20.18,-0.02:99
-chr1 4397408 rs35211041 C G 282.09 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.56;MQ0=0;OQ=845.74;QD=15.96;SB=-404.93 GT:AD:DP:GL:GQ 0/1:28,25:51:-103.22,-15.37,-116.49:99
-chr1 4397651 rs1234932 T C 32.13 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.62;MQ=59.08;MQ0=0;OQ=2038.22;QD=30.88;SB=-895.04 GT:AD:DP:GL:GQ 1/1:0,66:64:-207.46,-19.30,-0.06:99
-chr1 4399691 rs780572 T C 25.86 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=3.98;MQ=59.66;MQ0=0;OQ=2164.78;QD=32.31;SB=-610.95 GT:AD:DP:GL:GQ 1/1:0,67:65:-220.10,-19.59,-0.04:99
-chr1 4400105 rs12727067 C T 348.64 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=3168.12;QD=39.11;SB=-1535.71 GT:AD:DP:GL:GQ 1/1:0,81:79:-320.41,-23.80,-0.02:99
-chr1 4400296 rs12731060 C T 672.05 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2631.07;QD=38.69;SB=-901.20 GT:AD:DP:GL:GQ 1/1:0,68:67:-266.72,-20.19,-0.02:99
-chr1 4401014 rs6674190 C T 89.86 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.77;MQ0=0;OQ=3223.06;QD=39.79;SB=-1621.16 GT:AD:DP:GL:GQ 1/1:0,81:80:-325.90,-24.10,-0.02:99
-chr1 4401844 rs780573 A G 655.69 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2538.38;QD=30.96;SB=-1020.34 GT:AD:DP:GL:GQ 1/1:0,82:80:-257.49,-24.12,-0.07:99
-chr1 4403585 rs780581 T C 628.63 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=2729.37;QD=35.91;SB=-1251.85 GT:AD:DP:GL:GQ 1/1:0,76:75:-276.54,-22.59,-0.02:99
-chr1 4405826 rs780587 T C 579.37 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1799.99;QD=35.29;SB=-764.96 GT:AD:DP:GL:GQ 1/1:0,51:50:-183.60,-15.06,-0.02:99
-chr1 4406185 rs780588 T G 731.95 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=2276.92;QD=35.03;SB=-1150.64 GT:AD:DP:GL:GQ 1/1:0,65:65:-231.29,-19.58,-0.02:99
-chr1 4407102 rs780589 G T 206.11 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.17;MQ0=0;OQ=2615.53;QD=35.83;SB=-1329.09 GT:AD:DP:GL:GQ 1/1:0,73:72:-265.16,-21.68,-0.02:99
-chr1 4407119 rs12032561 A G 117.17 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.23;MQ0=0;OQ=2421.51;QD=30.65;SB=-1099.12 GT:AD:DP:GL:GQ 1/1:0,79:76:-245.80,-22.92,-0.06:99
-chr1 4407230 rs780590 C A 140.01 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=60.00;MQ0=0;OQ=2388.18;QD=35.64;SB=-981.59 GT:AD:DP:GL:GQ 1/1:0,67:66:-242.42,-19.88,-0.02:99
-chr1 4407326 rs780591 G C 50.40 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.66;MQ0=0;OQ=2352.09;QD=42.77;SB=-1101.12 GT:AD:DP:GL:GQ 1/1:0,54:54:-238.81,-16.27,-0.01:99
-chr1 4407520 rs780592 G A 361.64 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3300.47;QD=41.26;SB=-1496.40 GT:AD:DP:GL:GQ 1/1:0,80:80:-329.05,-24.10,-0.02:99
-chr1 4407623 rs780594 T C 139.31 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=2.07;MQ=59.52;MQ0=0;OQ=2627.95;QD=34.13;SB=-1058.85 GT:AD:DP:GL:GQ 1/1:0,77:75:-266.41,-22.59,-0.03:99
-chr1 4408032 rs705684 C T 627.36 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2940.63;QD=39.21;SB=-1334.78 GT:AD:DP:GL:GQ 1/1:0,75:74:-297.67,-22.29,-0.02:99
-chr1 4408272 rs780595 C G 8.91 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=58.81;MQ0=0;OQ=2333.53;QD=42.43;SB=-1051.66 GT:AD:DP:GL:GQ 1/1:0,55:54:-236.95,-16.27,-0.02:99
-chr1 4408429 rs2054268 A G 302.92 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.14;MQ0=0;OQ=2648.73;QD=34.85;SB=-1019.36 GT:AD:DP:GL:GQ 1/1:0,76:74:-268.49,-22.29,-0.03:99
-chr1 4408966 rs780596 C G 540.01 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=3023.42;QD=42.58;SB=-1306.69 GT:AD:DP:GL:GQ 1/1:0,71:71:-305.95,-21.40,-0.02:99
-chr1 4409197 rs2054269 G A 716.76 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=2812.55;QD=39.06;SB=-1393.37 GT:AD:DP:GL:GQ 1/1:0,72:71:-284.86,-21.39,-0.02:99
-chr1 4409239 rs2054270 C A 370.19 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=2523.69;QD=36.05;SB=-1226.28 GT:AD:DP:GL:GQ 1/1:0,70:69:-255.97,-20.78,-0.02:99
-chr1 4411281 rs922114 C T 206.92 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=60.00;MQ0=0;OQ=2458.23;QD=37.82;SB=-1122.24 GT:AD:DP:GL:GQ 1/1:0,65:63:-249.43,-18.99,-0.03:99
-chr1 4411941 rs56397589 A G 10.74 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=1.47;MQ=60.00;MQ0=0;OQ=772.90;QD=13.56;SB=-158.90 GT:AD:DP:GL:GQ 0/1:30,27:56:-97.44,-16.87,-122.46:99
-chr1 4412859 . G T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=17.52;MQ=58.30;MQ0=0;OQ=443.68;QD=5.55;SB=107.30 GT:AD:DP:GL:GQ 0/1:54,26:67:-67.84,-20.19,-156.44:99
-chr1 4413809 rs780599 T C 203.02 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=933.92;QD=15.06;SB=-130.24 GT:AD:DP:GL:GQ 0/1:31,31:62:-115.35,-18.67,-127.44:99
-chr1 4413942 rs1235308 A G 208.55 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.56;MQ0=0;OQ=574.66;QD=10.84;SB=-295.15 GT:AD:DP:GL:GQ 0/1:24,29:45:-74.32,-13.57,-86.44:99
-chr1 4413949 rs12135334 A G 227.02 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.57;MQ0=0;OQ=600.78;QD=11.13;SB=-278.65 GT:AD:DP:GL:GQ 0/1:25,29:50:-78.44,-15.07,-99.43:99
-chr1 4414313 rs11584026 G A 462.20 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.70;MQ0=0;OQ=1258.44;QD=16.56;SB=-579.09 GT:AD:DP:GL:GQ 0/1:37,39:74:-151.43,-22.31,-123.49:99
-chr1 4415137 rs1213919 T C 340.20 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.64;MQ0=0;OQ=1036.94;QD=16.20;SB=-428.11 GT:AD:DP:GL:GQ 0/1:27,37:63:-125.96,-18.98,-110.60:99
-chr1 4415275 rs6426411 G A 271.15 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.51;MQ=58.90;MQ0=0;OQ=891.44;QD=15.11;SB=-416.76 GT:AD:DP:GL:GQ 0/1:31,28:59:-110.20,-17.77,-112.97:99
-chr1 4415367 rs6663198 A C 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=21.51;MQ=59.22;MQ0=0;OQ=1036.43;QD=12.49;SB=-473.70 GT:AD:DP:GL:GQ 0/1:44,39:81:-131.33,-24.40,-153.13:99
-chr1 4416433 rs12131294 C T 93.74 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.89;MQ=59.15;MQ0=0;OQ=414.02;QD=9.20;SB=-113.50 GT:AD:DP:GL:GQ 0/1:24,20:37:-55.83,-11.15,-84.17:99
-chr1 4416884 . G A 3.05 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.94;MQ=57.87;MQ0=0;OQ=823.53;QD=14.97;SB=-276.27 GT:AD:DP:GL:GQ 0/1:30,25:53:-101.62,-15.98,-87.09:99
-chr1 4417194 rs7550318 A T 249.83 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.46;MQ=57.79;MQ0=0;OQ=1140.48;QD=17.28;SB=-502.48 GT:AD:DP:GL:GQ 0/1:29,37:65:-136.91,-19.58,-108.54:99
-chr1 4417494 . G A 25.73 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=20;HaplotypeScore=6.20;MQ=50.61;MQ0=1;QD=0.42;SB=98.27 GT:AD:DP:GL:GQ 0/1:53,9:50:-20.92,-15.07,-146.64:58.56
-chr1 4417741 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=39;Dels=0.00;HRun=20;HaplotypeScore=20.09;MQ=49.19;MQ0=1;OQ=84.58;QD=2.17;SB=26.11 GT:AD:DP:GL:GQ 0/1:26,12:27:-19.88,-8.14,-73.60:99
-chr1 4417905 rs642409 A G 618.44 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.41;MQ0=0;OQ=2544.54;QD=34.39;SB=-1201.82 GT:AD:DP:GL:GQ 1/1:0,74:71:-258.06,-21.38,-0.02:99
-chr1 4418004 rs10127576 A G 16.51 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=5.95;MQ=57.57;MQ0=1;OQ=493.53;QD=8.97;SB=-221.25 GT:AD:DP:GL:GQ 0/1:34,21:50:-67.70,-15.07,-117.20:99
-chr1 4420145 rs6426412 G T 345.35 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.50;MQ0=0;OQ=1296.90;QD=17.29;SB=-663.60 GT:AD:DP:GL:GQ 0/1:33,42:75:-155.57,-22.59,-114.39:99
-chr1 4420362 . C T 102.52 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=60.52;MQ0=0;OQ=920.19;QD=15.34;SB=-456.47 GT:AD:DP:GL:GQ 0/1:27,31:53:-111.28,-15.98,-79.42:99
-chr1 4421024 rs12137057 A C 291.19 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=701.05;QD=10.62;SB=-364.06 GT:AD:DP:GL:GQ 0/1:39,27:63:-92.36,-18.97,-137.12:99
-chr1 4421180 rs61771168 T G 222.08 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=1;HaplotypeScore=1.81;MQ=59.49;MQ0=0;OQ=588.51;QD=13.08;SB=-310.47 GT:AD:DP:GL:GQ 0/1:23,22:43:-75.09,-12.95,-79.35:99
-chr1 4421771 . C T 52.82 PASS AC=1;AF=0.50;AN=2;DP=35;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=58.00;MQ0=0;OQ=457.94;QD=13.08;SB=-230.51 GT:AD:DP:GL:GQ 0/1:18,17:32:-58.72,-9.64,-61.49:99
-chr1 4422658 . C T 17.02 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=3.11;MQ=59.25;MQ0=0;OQ=990.31;QD=15.97;SB=-404.43 GT:AD:DP:GL:GQ 0/1:32,30:60:-120.40,-18.09,-95.94:99
-chr1 4423184 . G A 28.31 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=59.25;MQ0=0;OQ=1264.58;QD=20.40;SB=-650.72 GT:AD:DP:GL:GQ 0/1:26,36:62:-148.42,-18.68,-94.18:99
-chr1 4423217 rs664520 C T 648.65 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1886.50;QD=38.50;SB=-821.33 GT:AD:DP:GL:GQ 1/1:0,49:49:-192.25,-14.76,-0.02:99
-chr1 4423270 rs17453664 G A 225.88 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=58.29;MQ0=0;OQ=839.10;QD=16.14;SB=-245.23 GT:AD:DP:GL:GQ 0/1:25,27:50:-102.26,-15.06,-88.51:99
-chr1 4424136 . C G 13.14 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=4.07;MQ=59.20;MQ0=0;OQ=717.79;QD=15.27;SB=-220.02 GT:AD:DP:GL:GQ 0/1:26,21:46:-88.93,-13.87,-108.02:99
-chr1 4424195 rs16839046 G A 266.41 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=59.35;MQ0=0;OQ=1078.45;QD=16.85;SB=-521.17 GT:AD:DP:GL:GQ 0/1:30,33:62:-129.81,-18.69,-96.72:99
-chr1 4424280 rs17419859 G A 351.26 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.18;MQ0=0;OQ=665.56;QD=13.05;SB=-350.50 GT:AD:DP:GL:GQ 0/1:25,26:46:-83.71,-13.87,-77.13:99
-chr1 4424589 rs681175 T C 281.02 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=1804.45;QD=35.38;SB=-864.37 GT:AD:DP:GL:GQ 1/1:0,51:50:-184.04,-15.06,-0.01:99
-chr1 4426611 rs16839061 C T 6.85 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=8.78;MQ=59.11;MQ0=0;OQ=724.58;QD=13.42;SB=-330.47 GT:AD:DP:GL:GQ 0/1:31,23:51:-91.11,-15.37,-92.01:99
-chr1 4427201 rs350167 T C 190.81 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.58;MQ=59.66;MQ0=0;OQ=925.11;QD=16.82;SB=-378.98 GT:AD:DP:GL:GQ 0/1:23,32:53:-111.76,-15.96,-93.83:99
-chr1 4427323 . G A 294.49 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=680.55;QD=13.09;SB=-356.53 GT:AD:DP:GL:GQ 0/1:28,24:44:-84.60,-13.26,-76.63:99
-chr1 4433698 . G A 123.19 PASS AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.52;MQ0=0;OQ=1403.52;QD=17.99;SB=-721.04 GT:AD:DP:GL:GQ 0/1:36,42:75:-166.24,-22.60,-109.14:99
-chr1 4433807 . T G 23.74 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=3;HaplotypeScore=5.51;MQ=60.00;MQ0=0;QD=0.37;SB=80.27 GT:AD:DP:GL:GQ 0/1:45,20:51:-21.03,-15.37,-149.91:56.55
-chr1 4434327 rs645724 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=38.18;MQ=55.12;MQ0=0;OQ=2008.88;QD=24.50;SB=-765.25 GT:AD:DP:GL:GQ 0/1:13,69:74:-226.47,-22.30,-33.80:99
-chr1 4434328 rs55641638 T A 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=5;HaplotypeScore=34.59;MQ=55.12;MQ0=0;OQ=2483.75;QD=30.29;SB=-1104.11 GT:AD:DP:GL:GQ 1/1:7,75:79:-274.28,-23.80,-22.35:14.43
-chr1 4434380 rs350168 C T 706.48 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=2402.65;QD=38.14;SB=-988.02 GT:AD:DP:GL:GQ 1/1:0,63:61:-243.87,-18.38,-0.02:99
-chr1 4434761 . C A 101.78 PASS AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.39;MQ0=0;OQ=1132.04;QD=16.65;SB=-530.30 GT:AD:DP:GL:GQ 0/1:30,38:67:-136.67,-20.18,-105.81:99
-chr1 4435588 rs350169 T A 602.50 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1092.18;QD=14.76;SB=-420.48 GT:AD:DP:GL:GQ 0/1:38,36:74:-134.79,-22.29,-147.43:99
-chr1 4439106 rs610189 T C 76.59 PASS AC=2;AF=1.00;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.49;MQ0=0;OQ=3044.46;QD=31.07;SB=-1448.66 GT:AD:DP:GL:GQ 1/1:0,98:95:-308.11,-28.64,-0.07:99
-chr1 4440903 rs13376654 C A 79.52 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=3.21;MQ=58.73;MQ0=0;OQ=748.18;QD=13.60;SB=-293.00 GT:AD:DP:GL:GQ 0/1:29,26:54:-94.37,-16.27,-89.76:99
-chr1 4440904 rs638289 A G 184.76 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.21;MQ=59.14;MQ0=0;OQ=1717.40;QD=31.80;SB=-743.85 GT:AD:DP:GL:GQ 1/1:0,54:53:-175.37,-15.98,-0.04:99
-chr1 4441250 rs11799990 A C 16.32 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.98;MQ=58.47;MQ0=0;OQ=285.71;QD=5.19;SB=-147.75 GT:AD:DP:GL:GQ 0/1:37,17:50:-46.92,-15.06,-127.84:99
-chr1 4441285 rs6426418 T C 92.05 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=4.50;MQ=58.52;MQ0=0;OQ=434.66;QD=7.63;SB=-199.21 GT:AD:DP:GL:GQ 0/1:38,19:55:-63.32,-16.57,-152.10:99
-chr1 4441304 rs16839089 G A 505.50 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=685.41;QD=10.71;SB=-336.42 GT:AD:DP:GL:GQ 0/1:40,24:63:-90.81,-18.98,-145.42:99
-chr1 4441520 . C T 159.13 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.36;MQ=59.58;MQ0=0;OQ=767.39;QD=13.95;SB=-405.80 GT:AD:DP:GL:GQ 0/1:29,25:52:-95.70,-15.68,-88.39:99
-chr1 4441584 rs28597953 G C 102.96 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.54;MQ0=0;OQ=377.89;QD=7.56;SB=-189.56 GT:AD:DP:GL:GQ 0/1:35,14:50:-59.58,-18.50,-155.34:99
-chr1 4441595 rs12057544 C T 296.32 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=442.52;QD=10.06;SB=-117.50 GT:AD:DP:GL:GQ 0/1:29,15:44:-60.79,-13.25,-105.58:99
-chr1 4441615 rs12094629 G A 446.77 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.36;MQ0=0;OQ=438.29;QD=12.17;SB=-145.60 GT:AD:DP:GL:GQ 0/1:21,15:35:-57.67,-10.56,-64.23:99
-chr1 4442760 rs705686 T G 190.01 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=58.65;MQ0=0;OQ=1305.06;QD=29.00;SB=-525.86 GT:AD:DP:GL:GQ 1/1:0,45:42:-134.13,-12.66,-0.04:99
-chr1 4443102 rs16839093 T A 368.23 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=60.00;MQ0=0;OQ=943.42;QD=16.85;SB=-414.85 GT:AD:DP:GL:GQ 0/1:25,31:55:-114.19,-16.57,-93.32:99
-chr1 4443523 rs6656245 A G 229.68 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=4.49;MQ=59.68;MQ0=0;OQ=985.54;QD=13.50;SB=-516.93 GT:AD:DP:GL:GQ 0/1:35,37:70:-125.21,-23.37,-142.93:99
-chr1 4444038 rs350170 T C 370.74 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=854.91;QD=14.49;SB=-264.93 GT:AD:DP:GL:GQ 0/1:30,29:59:-106.55,-17.78,-120.47:99
-chr1 4444166 . C T 124.24 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.74;MQ0=0;OQ=1098.39;QD=15.05;SB=-487.09 GT:AD:DP:GL:GQ 0/1:39,34:70:-134.21,-21.09,-126.03:99
-chr1 4446069 rs16839101 C T 439.86 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.34;MQ0=0;OQ=969.43;QD=15.39;SB=-381.11 GT:AD:DP:GL:GQ 0/1:31,32:61:-118.60,-18.38,-109.31:99
-chr1 4448313 rs705687 A G 587.11 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.53;MQ0=0;OQ=1218.14;QD=32.06;SB=-513.41 GT:AD:DP:GL:GQ 1/1:0,38:37:-125.42,-11.15,-0.02:99
-chr1 4448490 rs10799234 G A 167.56 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=924.80;QD=18.50;SB=-481.51 GT:AD:DP:GL:GQ 0/1:22,28:50:-110.83,-15.07,-72.35:99
-chr1 4449095 . G T 15.09 PASS AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.46;MQ0=0;OQ=820.94;QD=19.09;SB=-383.80 GT:AD:DP:GL:GQ 0/1:15,28:42:-98.03,-12.65,-50.79:99
-chr1 4449190 . G A 102.60 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=1775.95;QD=21.93;SB=-864.43 GT:AD:DP:GL:GQ 0/1:30,51:79:-204.67,-23.80,-104.40:99
-chr1 4449240 rs705690 G A 133.54 PASS AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.24;MQ0=0;OQ=3632.63;QD=39.92;SB=-1598.65 GT:AD:DP:GL:GQ 1/1:0,91:90:-362.26,-27.11,-0.03:99
-chr1 4449262 rs780606 A G 76.06 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=59.06;MQ0=0;OQ=718.78;QD=9.71;SB=-329.85 GT:AD:DP:GL:GQ 0/1:44,30:73:-97.16,-22.00,-175.35:99
-chr1 4449723 . G A 148.11 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.81;MQ=59.52;MQ0=0;OQ=713.60;QD=14.87;SB=-335.48 GT:AD:DP:GL:GQ 0/1:25,23:48:-89.11,-14.47,-81.14:99
-chr1 4449964 rs706145 G A 636.09 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2653.69;QD=37.38;SB=-1188.98 GT:AD:DP:GL:GQ 1/1:0,71:69:-268.98,-20.79,-0.03:99
-chr1 4452662 rs1878052 G A 714.61 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2298.20;QD=38.95;SB=-1111.02 GT:AD:DP:GL:GQ 1/1:0,59:59:-233.42,-17.78,-0.02:99
-chr1 4454614 . A C 20.74 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=601.74;QD=13.68;SB=-220.89 GT:AD:DP:GL:GQ 0/1:20,24:43:-76.41,-12.95,-71.27:99
-chr1 4455561 rs10737412 T A 735.37 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2244.31;QD=37.41;SB=-1132.68 GT:AD:DP:GL:GQ 1/1:0,60:60:-228.03,-18.07,-0.02:99
-chr1 4455707 rs4654547 C T 580.91 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=1;OQ=2435.91;QD=38.67;SB=-681.41 GT:AD:DP:GL:GQ 1/1:0,63:61:-247.19,-18.38,-0.02:99
-chr1 4456823 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=121.08;MQ=43.96;MQ0=0;OQ=445.21;QD=5.86;SB=-205.75 GT:AD:DP:GL:GQ 0/1:54,22:71:-69.19,-21.39,-207.74:99
-chr1 4456825 rs61765158 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=133.78;MQ=43.18;MQ0=0;OQ=324.30;QD=4.44;SB=-88.42 GT:AD:DP:GL:GQ 0/1:59,14:70:-56.80,-21.09,-201.65:99
-chr1 4456850 rs780601 T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=50.11;MQ=42.32;MQ0=0;OQ=775.14;QD=10.77;SB=-395.42 GT:AD:DP:GL:GQ 0/1:41,31:67:-100.98,-20.18,-144.33:99
-chr1 4457263 rs780603 T C 535.20 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=1544.09;QD=29.13;SB=-491.17 GT:AD:DP:GL:GQ 1/1:0,53:48:-158.03,-14.47,-0.03:99
-chr1 4457873 rs9659744 G A 216.40 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=4.18;MQ=58.81;MQ0=0;OQ=722.66;QD=13.14;SB=-250.79 GT:AD:DP:GL:GQ 0/1:29,25:52:-94.30,-18.75,-103.70:99
-chr1 4457887 rs12029583 T C 182.25 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.02;MQ=58.88;MQ0=0;OQ=815.22;QD=14.06;SB=-229.41 GT:AD:DP:GL:GQ 0/1:25,33:54:-101.08,-16.28,-89.40:99
-chr1 4458652 rs10915548 G A 313.44 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=58.63;MQ0=0;OQ=1202.04;QD=18.21;SB=-612.14 GT:AD:DP:GL:GQ 0/1:31,35:64:-142.78,-19.29,-94.64:99
-chr1 4458793 rs609506 T C 135.30 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2002.23;QD=32.82;SB=-965.38 GT:AD:DP:GL:GQ 1/1:0,61:57:-203.83,-17.17,-0.03:99
-chr1 4458832 rs13374152 G A 510.02 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.65;MQ0=0;OQ=1323.30;QD=19.75;SB=-559.77 GT:AD:DP:GL:GQ 0/1:28,39:65:-155.19,-19.58,-97.96:99
-chr1 4459077 rs10799235 G C 517.01 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2392.46;QD=41.97;SB=-1062.67 GT:AD:DP:GL:GQ 1/1:0,57:55:-242.85,-16.57,-0.02:99
-chr1 4459761 rs4654438 T C 731.30 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.40;MQ0=0;OQ=2338.83;QD=34.91;SB=-1062.10 GT:AD:DP:GL:GQ 1/1:0,67:66:-237.49,-19.88,-0.02:99
-chr1 4460253 . G A 71.25 PASS AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=54.34;MQ0=0;OQ=761.29;QD=16.20;SB=-383.16 GT:AD:DP:GL:GQ 0/1:23,24:45:-92.98,-13.56,-67.37:99
-chr1 4460265 rs9660574 G A 698.27 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.97;MQ0=0;OQ=1971.68;QD=38.66;SB=-993.84 GT:AD:DP:GL:GQ 1/1:0,51:50:-200.77,-15.06,-0.01:99
-chr1 4460731 rs675509 A G 75.44 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.19;MQ0=0;OQ=1733.09;QD=33.33;SB=-850.97 GT:AD:DP:GL:GQ 1/1:0,52:50:-176.92,-15.06,-0.02:99
-chr1 4460821 rs675641 C T 619.56 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2267.76;QD=39.10;SB=-1112.00 GT:AD:DP:GL:GQ 1/1:0,58:57:-230.38,-17.17,-0.02:99
-chr1 4462336 rs4654548 G A 293.32 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.55;MQ0=0;OQ=1820.62;QD=35.70;SB=-883.64 GT:AD:DP:GL:GQ 1/1:0,51:47:-185.66,-14.16,-0.02:99
-chr1 4462612 rs661886 C G 122.47 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1803.84;QD=41.95;SB=-867.51 GT:AD:DP:GL:GQ 1/1:0,43:43:-183.98,-12.96,-0.01:99
-chr1 4462757 rs597453 T C 1.51 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=2.36;MQ=60.00;MQ0=0;OQ=1873.91;QD=29.28;SB=-570.21 GT:AD:DP:GL:GQ 1/1:0,64:56:-191.00,-16.87,-0.03:99
-chr1 4463867 rs10799237 G A 181.35 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.13;MQ0=0;OQ=2001.42;QD=37.76;SB=-711.98 GT:AD:DP:GL:GQ 1/1:0,53:51:-203.74,-15.36,-0.01:99
-chr1 4464187 . T C 30.12 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.10;MQ=59.33;MQ0=0;OQ=552.68;QD=8.91;SB=-289.28 GT:AD:DP:GL:GQ 0/1:39,23:60:-76.63,-18.08,-155.34:99
-chr1 4465057 rs4654549 G A 100.14 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=3.11;MQ=59.46;MQ0=0;OQ=1572.23;QD=20.42;SB=-717.81 GT:AD:DP:GL:GQ 0/1:31,46:75:-183.10,-22.59,-108.27:99
-chr1 4465240 rs4654439 A G 186.31 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.65;MQ0=0;OQ=1824.70;QD=28.07;SB=-920.11 GT:AD:DP:GL:GQ 1/1:1,64:61:-189.47,-18.40,-3.41:99
-chr1 4465350 rs4654550 C T 464.58 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.14;MQ0=0;OQ=1183.55;QD=15.57;SB=-491.13 GT:AD:DP:GL:GQ 0/1:39,37:73:-143.65,-22.01,-117.80:99
-chr1 4465703 rs16839157 C G 292.75 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=2.96;MQ=59.46;MQ0=0;OQ=1332.22;QD=15.49;SB=-637.02 GT:AD:DP:GL:GQ 0/1:48,38:85:-162.12,-25.61,-205.23:99
-chr1 4465766 rs10753381 C T 668.70 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2452.18;QD=39.55;SB=-960.97 GT:AD:DP:GL:GQ 1/1:0,62:62:-248.82,-18.68,-0.02:99
-chr1 4465913 rs10753382 A C 344.57 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=42.45;MQ0=0;OQ=1152.30;QD=15.16;SB=-375.76 GT:AD:DP:GL:GQ 0/1:35,41:75:-141.10,-22.59,-129.43:99
-chr1 4465925 rs4654440 A G 314.62 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=45.24;MQ0=0;OQ=2545.78;QD=35.36;SB=-1008.34 GT:AD:DP:GL:GQ 1/1:0,72:72:-258.19,-21.69,-0.03:99
-chr1 4466035 rs4654551 T C 137.52 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.71;MQ0=0;OQ=2345.07;QD=29.31;SB=-919.32 GT:AD:DP:GL:GQ 1/1:0,80:75:-238.17,-22.62,-0.07:99
-chr1 4466375 rs4654441 A G 153.58 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=1.97;MQ=59.14;MQ0=0;OQ=1252.72;QD=16.48;SB=-599.98 GT:AD:DP:GL:GQ 0/1:32,44:75:-151.15,-22.60,-128.71:99
-chr1 4466539 . G C 13.68 PASS AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.10;MQ=60.00;MQ0=0;OQ=1133.87;QD=19.22;SB=-442.73 GT:AD:DP:GL:GQ 0/1:26,33:58:-134.16,-17.49,-113.78:99
-chr1 4466591 rs7537577 T C 558.12 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1692.69;QD=36.01;SB=-710.63 GT:AD:DP:GL:GQ 1/1:0,47:47:-172.87,-14.16,-0.01:99
-chr1 4466655 rs1870509 A G 172.47 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=58.79;MQ0=0;OQ=1784.46;QD=27.04;SB=-725.30 GT:AD:DP:GL:GQ 1/1:0,66:58:-182.10,-17.50,-0.07:99
-chr1 4467025 rs1018306 G A 522.41 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=2397.83;QD=37.47;SB=-678.32 GT:AD:DP:GL:GQ 1/1:0,64:61:-243.39,-18.38,-0.02:99
-chr1 4467405 . G A 173.51 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=1037.40;QD=16.73;SB=-505.13 GT:AD:DP:GL:GQ 0/1:31,31:60:-125.11,-18.08,-96.58:99
-chr1 4467882 rs10799238 G A 201.42 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=57.23;MQ0=0;OQ=2039.74;QD=37.09;SB=-730.98 GT:AD:DP:GL:GQ 1/1:0,54:52:-207.58,-15.67,-0.02:99
-chr1 4468054 rs10799239 G T 526.93 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.10;MQ0=0;OQ=2381.50;QD=35.54;SB=-1199.06 GT:AD:DP:GL:GQ 1/1:0,67:66:-241.76,-19.88,-0.02:99
-chr1 4468702 rs780570 T C 301.27 PASS AC=2;AF=1.00;AN=2;DB;DP=22;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=55.66;MQ0=0;OQ=692.07;QD=31.46;SB=-209.70 GT:AD:DP:GL:GQ 1/1:0,22:21:-72.80,-6.33,-0.01:63.17
-chr1 4468728 . G A 3.90 PASS AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=52.20;MQ0=0;OQ=192.92;QD=6.65;SB=-94.59 GT:AD:DP:GL:GQ 0/1:18,10:25:-30.11,-7.53,-60.00:99
-chr1 4468760 rs60725706 C T 2.79 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=2.68;MQ=47.80;MQ0=0;OQ=892.66;QD=25.50;SB=-420.32 GT:AD:DP:GL:GQ 1/1:1,34:26:-92.87,-7.84,-0.02:78.22
-chr1 4468793 . C T 155.10 SnpCluster AC=1;AF=0.50;AN=2;DP=45;Dels=0.00;HRun=2;HaplotypeScore=28.66;MQ=43.47;MQ0=0;QD=3.45;SB=-75.82 GT:AD:DP:GL:GQ 0/1:34,11:31:-28.13,-9.34,-89.19:99
-chr1 4468798 rs57105176 C T 210.28 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=33.72;MQ=43.23;MQ0=0;QD=4.38;SB=-105.47 GT:AD:DP:GL:GQ 0/1:33,15:33:-34.25,-9.94,-88.69:99
-chr1 4468800 . C T 23.55 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=49;Dels=0.00;HRun=2;HaplotypeScore=34.30;MQ=43.63;MQ0=0;QD=0.48;SB=32.09 GT:AD:DP:GL:GQ 0/1:44,5:35:-16.18,-10.54,-113.19:56.36
-chr1 4468801 . T C 10.10 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=1;HaplotypeScore=35.27;MQ=44.04;MQ0=0;QD=0.21;SB=32.13 GT:AD:DP:GL:GQ 0/1:43,5:35:-14.79,-10.54,-128.12:42.49
-chr1 4469243 rs12031045 G A 324.76 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=623.89;QD=15.22;SB=-230.72 GT:AD:DP:GL:GQ 0/1:20,21:41:-78.04,-12.36,-70.49:99
-chr1 4469296 rs780569 T A 228.26 PASS AC=2;AF=1.00;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.28;MQ0=0;OQ=1316.01;QD=34.63;SB=-627.73 GT:AD:DP:GL:GQ 1/1:0,38:37:-135.20,-11.15,-0.01:99
-chr1 4469318 rs12035160 A T 129.07 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=57.81;MQ0=0;OQ=613.76;QD=19.18;SB=-234.94 GT:AD:DP:GL:GQ 0/1:11,21:31:-74.00,-9.34,-42.52:99
-chr1 4469407 rs10799241 A G 224.26 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=57.87;MQ0=0;OQ=407.85;QD=8.87;SB=-207.21 GT:AD:DP:GL:GQ 0/1:29,17:45:-57.62,-13.55,-119.36:99
-chr1 4469520 rs16839168 G A 432.40 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=846.65;QD=16.28;SB=-413.43 GT:AD:DP:GL:GQ 0/1:26,26:51:-103.31,-15.37,-89.05:99
-chr1 4469555 rs16839171 G T 425.50 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=647.76;QD=12.70;SB=-289.64 GT:AD:DP:GL:GQ 0/1:27,24:51:-83.43,-15.37,-93.72:99
-chr1 4469694 rs780568 A G 87.34 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=2;HaplotypeScore=1.60;MQ=59.63;MQ0=0;OQ=1699.95;QD=33.33;SB=-755.94 GT:AD:DP:GL:GQ 1/1:0,51:49:-173.60,-14.76,-0.02:99
-chr1 4470136 rs16839175 T C 275.26 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.63;MQ0=0;OQ=746.25;QD=11.85;SB=-286.15 GT:AD:DP:GL:GQ 0/1:31,32:61:-96.29,-18.39,-125.52:99
-chr1 4470246 rs1612698 A G 417.84 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.34;MQ=60.15;MQ0=0;OQ=917.82;QD=12.40;SB=-358.93 GT:AD:DP:GL:GQ 0/1:42,32:74:-117.36,-22.29,-169.05:99
-chr1 4470842 rs4654552 C T 182.29 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.85;MQ=59.68;MQ0=0;OQ=1084.53;QD=15.28;SB=-349.06 GT:AD:DP:GL:GQ 0/1:37,34:71:-133.13,-21.39,-131.43:99
-chr1 4471600 rs1710415 A G 89.74 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=59.45;MQ0=0;OQ=1235.30;QD=29.41;SB=-309.47 GT:AD:DP:GL:GQ 1/1:0,42:39:-127.15,-11.76,-0.03:99
-chr1 4471806 rs1762825 T A 126.40 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.16;MQ0=0;OQ=1997.53;QD=36.32;SB=-643.98 GT:AD:DP:GL:GQ 1/1:0,55:54:-203.35,-16.27,-0.02:99
-chr1 4471883 rs10915549 G A 333.26 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.45;MQ0=0;OQ=443.28;QD=10.55;SB=-159.64 GT:AD:DP:GL:GQ 0/1:26,16:40:-59.67,-12.06,-79.56:99
-chr1 4472000 rs4654442 G A 195.09 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.37;MQ0=0;OQ=2467.21;QD=37.38;SB=-970.01 GT:AD:DP:GL:GQ 1/1:0,66:62:-250.32,-18.68,-0.02:99
-chr1 4472928 rs4568797 G T 198.75 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.61;MQ=59.01;MQ0=0;OQ=1306.78;QD=17.19;SB=-394.04 GT:AD:DP:GL:GQ 0/1:30,46:73:-155.95,-21.99,-98.20:99
-chr1 4472959 rs4480324 A G 92.82 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.63;MQ0=0;OQ=1914.93;QD=30.40;SB=-560.92 GT:AD:DP:GL:GQ 1/1:0,63:60:-195.13,-18.10,-0.06:99
-chr1 4472994 rs4323680 T C 685.55 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1931.20;QD=32.73;SB=-824.33 GT:AD:DP:GL:GQ 1/1:0,59:55:-196.72,-16.57,-0.02:99
-chr1 4473017 rs4437847 T C 44.80 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=1770.27;QD=28.55;SB=-781.74 GT:AD:DP:GL:GQ 1/1:0,62:55:-180.66,-16.58,-0.05:99
-chr1 4473102 rs4442344 T C 686.66 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1772.96;QD=35.46;SB=-792.00 GT:AD:DP:GL:GQ 1/1:0,50:50:-180.90,-15.06,-0.02:99
-chr1 4473320 rs1710418 A G 44.26 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1771.10;QD=32.20;SB=-713.21 GT:AD:DP:GL:GQ 1/1:0,54:51:-180.72,-15.36,-0.02:99
-chr1 4473327 rs1762828 G A 169.38 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.60;MQ0=0;OQ=2054.72;QD=36.05;SB=-823.34 GT:AD:DP:GL:GQ 1/1:0,57:53:-209.08,-15.97,-0.02:99
-chr1 4473546 rs1710419 C A 168.66 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=2.06;MQ=57.84;MQ0=0;OQ=1495.45;QD=32.51;SB=-770.46 GT:AD:DP:GL:GQ 1/1:0,46:43:-153.15,-12.95,-0.02:99
-chr1 4473664 rs1710420 C T 149.96 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=59.20;MQ0=0;OQ=902.97;QD=15.57;SB=-230.52 GT:AD:DP:GL:GQ 0/1:30,28:57:-110.76,-17.18,-94.35:99
-chr1 4473849 rs1710421 C T 247.57 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=2607.62;QD=37.79;SB=-1041.32 GT:AD:DP:GL:GQ 1/1:0,69:66:-264.37,-19.88,-0.02:99
-chr1 4473977 rs1710422 C T 77.88 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=58.90;MQ0=0;OQ=2084.84;QD=37.91;SB=-795.07 GT:AD:DP:GL:GQ 1/1:0,55:54:-212.09,-16.27,-0.02:99
-chr1 4473997 rs1710423 T C 135.26 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.07;MQ0=0;OQ=1147.64;QD=25.50;SB=-601.59 GT:AD:DP:GL:GQ 1/1:0,45:37:-118.39,-11.16,-0.04:99
-chr1 4474861 rs1710424 A G 675.73 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=2263.90;QD=31.89;SB=-1103.74 GT:AD:DP:GL:GQ 1/1:0,71:67:-230.02,-20.19,-0.04:99
-chr1 4475148 rs12036337 G A 158.77 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=3.64;MQ=56.87;MQ0=1;OQ=1002.66;QD=14.75;SB=-286.76 GT:AD:DP:GL:GQ 0/1:34,34:59:-121.33,-17.78,-94.02:99
-chr1 4475283 . G A 82.68 PASS AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.84;MQ=59.35;MQ0=0;OQ=845.94;QD=13.22;SB=-362.87 GT:AD:DP:GL:GQ 0/1:34,30:60:-105.97,-18.09,-111.99:99
-chr1 4475382 rs10915550 C T 345.50 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.10;MQ0=0;OQ=927.67;QD=14.96;SB=-380.90 GT:AD:DP:GL:GQ 0/1:33,29:62:-114.73,-18.68,-118.48:99
-chr1 4476131 rs10737413 C T 15.63 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.60;MQ0=0;OQ=1742.86;QD=37.08;SB=-655.67 GT:AD:DP:GL:GQ 1/1:0,47:45:-177.88,-13.56,-0.01:99
-chr1 4476657 rs1710430 C G 535.69 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=2311.95;QD=41.28;SB=-1026.21 GT:AD:DP:GL:GQ 1/1:0,56:54:-234.80,-16.27,-0.02:99
-chr1 4476980 rs4654443 C T 562.55 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1325.65;QD=15.60;SB=-630.22 GT:AD:DP:GL:GQ 0/1:45,40:85:-161.45,-25.60,-165.34:99
-chr1 4477487 rs12033789 G T 214.07 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=905.30;QD=15.34;SB=-363.43 GT:AD:DP:GL:GQ 0/1:29,30:59:-111.58,-17.77,-100.35:99
-chr1 4477488 rs12036603 C T 258.44 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=969.57;QD=16.16;SB=-419.81 GT:AD:DP:GL:GQ 0/1:30,30:59:-118.02,-17.78,-101.27:99
-chr1 4478406 rs596607 G A 55.59 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=59.40;MQ0=0;OQ=1761.44;QD=22.88;SB=-768.34 GT:AD:DP:GL:GQ 0/1:27,50:75:-202.03,-22.60,-83.51:99
-chr1 4478558 rs12039806 T A 70.60 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=6.67;MQ=59.12;MQ0=0;OQ=1156.91;QD=14.64;SB=-441.48 GT:AD:DP:GL:GQ 0/1:42,37:77:-142.17,-23.19,-150.58:99
-chr1 4478614 rs12039814 T C 10.71 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=7.09;MQ=59.66;MQ0=0;OQ=671.25;QD=10.02;SB=-294.21 GT:AD:DP:GL:GQ 0/1:37,30:64:-89.71,-19.30,-136.10:99
-chr1 4478650 rs12038994 A T 269.76 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=1147.45;QD=17.39;SB=-509.94 GT:AD:DP:GL:GQ 0/1:28,38:64:-137.31,-19.28,-105.10:99
-chr1 4478709 . A C 2.11 PASS AC=1;AF=0.50;AN=2;DP=73;Dels=0.00;HRun=1;HaplotypeScore=7.65;MQ=58.73;MQ0=0;OQ=1101.58;QD=15.09;SB=-425.69 GT:AD:DP:GL:GQ 0/1:30,42:69:-134.23,-20.79,-106.44:99
-chr1 4478753 rs16839198 G T 52.90 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=7.25;MQ=58.23;MQ0=0;OQ=906.23;QD=13.73;SB=-344.31 GT:AD:DP:GL:GQ 0/1:32,33:64:-113.20,-19.29,-98.09:99
-chr1 4478891 . A G 89.93 PASS AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.48;MQ=59.39;MQ0=0;OQ=917.93;QD=13.50;SB=-396.16 GT:AD:DP:GL:GQ 0/1:36,32:68:-115.57,-20.49,-141.62:99
-chr1 4478991 rs12039070 A G 301.10 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=3.59;MQ=59.71;MQ0=0;OQ=1280.19;QD=16.00;SB=-441.58 GT:AD:DP:GL:GQ 0/1:37,43:80:-155.40,-24.10,-149.81:99
-chr1 4479035 rs12034930 G A 326.95 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.45;MQ=59.68;MQ0=0;OQ=1133.14;QD=15.74;SB=-491.00 GT:AD:DP:GL:GQ 0/1:34,37:69:-137.39,-20.79,-119.61:99
-chr1 4479073 rs12039100 A G 27.26 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=3.20;MQ=58.95;MQ0=0;OQ=915.49;QD=13.87;SB=-279.55 GT:AD:DP:GL:GQ 0/1:35,31:66:-114.72,-19.89,-140.84:99
-chr1 4479099 rs12039101 A G 318.42 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.13;MQ=59.02;MQ0=0;OQ=1020.75;QD=14.38;SB=-348.94 GT:AD:DP:GL:GQ 0/1:36,35:70:-126.45,-21.09,-134.68:99
-chr1 4479118 rs1229148 A G 277.76 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.11;MQ0=0;OQ=784.46;QD=10.75;SB=-374.59 GT:AD:DP:GL:GQ 0/1:37,36:67:-101.94,-20.21,-133.99:99
-chr1 4479593 rs12035830 G A 298.83 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=3.09;MQ=59.59;MQ0=0;OQ=906.38;QD=16.19;SB=-375.12 GT:AD:DP:GL:GQ 0/1:28,28:56:-110.79,-16.87,-99.66:99
-chr1 4479841 rs13375249 G C 20.65 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=1.63;MQ=59.73;MQ0=0;OQ=1230.24;QD=17.57;SB=-290.56 GT:AD:DP:GL:GQ 0/1:33,37:66:-146.20,-19.90,-135.57:99
-chr1 4479995 rs13375764 T C 66.03 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=4.40;MQ=59.54;MQ0=0;OQ=574.33;QD=11.49;SB=-245.91 GT:AD:DP:GL:GQ 0/1:28,22:47:-74.88,-14.16,-104.49:99
-chr1 4480068 rs56226943 T C 40.29 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=59.62;MQ0=0;OQ=881.12;QD=14.44;SB=-433.94 GT:AD:DP:GL:GQ 0/1:29,32:60:-109.48,-18.08,-115.28:99
-chr1 4480417 . C T 49.35 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=55.69;MQ0=0;OQ=1159.90;QD=16.81;SB=-282.22 GT:AD:DP:GL:GQ 0/1:33,36:66:-139.16,-19.89,-99.45:99
-chr1 4480560 rs61765366 A G 285.70 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.94;MQ0=0;OQ=701.52;QD=11.89;SB=-268.60 GT:AD:DP:GL:GQ 0/1:29,30:57:-90.62,-17.18,-111.39:99
-chr1 4480691 rs61765367 A G 0.21 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.75;MQ=57.81;MQ0=0;OQ=122.26;QD=1.63;SB=-4.55 GT:AD:DP:GL:GQ 0/1:63,11:59:-33.30,-17.79,-184.25:99
-chr1 4480787 rs61765379 A G 0.06 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=7.68;MQ=56.41;MQ0=0;OQ=64.97;QD=0.82;SB=-50.25 GT:AD:DP:GL:GQ 0/1:64,12:67:-29.98,-20.20,-222.76:97.81
-chr1 4480849 rs549627 C T 251.36 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=56.04;MQ0=0;OQ=1162.07;QD=16.37;SB=-467.11 GT:AD:DP:GL:GQ 0/1:33,37:67:-139.69,-20.20,-99.87:99
-chr1 4480920 rs548786 G A 173 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.10;MQ=56.79;MQ0=1;OQ=670.11;QD=12.41;SB=-198.20 GT:AD:DP:GL:GQ 0/1:30,24:48:-84.77,-14.47,-84.01:99
-chr1 4481090 rs12039682 C T 474.84 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.78;MQ0=0;OQ=980.72;QD=14.21;SB=-480.03 GT:AD:DP:GL:GQ 0/1:39,30:68:-121.84,-20.48,-138.54:99
-chr1 4481198 rs12039710 C A 19.16 PASS AC=1;AF=0.50;AN=2;DB;DP=88;Dels=0.00;HRun=3;HaplotypeScore=2.99;MQ=59.79;MQ0=0;OQ=1468.40;QD=16.69;SB=-755.87 GT:AD:DP:GL:GQ 0/1:41,47:88:-176.63,-26.50,-144.72:99
-chr1 4481445 rs608203 T C 400.08 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=60.00;MQ0=0;OQ=763.64;QD=11.93;SB=-242.90 GT:AD:DP:GL:GQ 0/1:33,31:64:-98.94,-19.29,-134.86:99
-chr1 4481949 rs518456 T G 602.74 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1221.17;QD=15.26;SB=-525.73 GT:AD:DP:GL:GQ 0/1:37,43:77:-148.59,-23.19,-127.99:99
-chr1 4481956 rs57010025 C T 238.50 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.40;MQ0=0;OQ=1419.96;QD=18.44;SB=-598.08 GT:AD:DP:GL:GQ 0/1:35,42:76:-168.18,-22.90,-116.42:99
-chr1 4482059 rs10489135 T C 436.47 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.51;MQ0=0;OQ=1051.73;QD=13.84;SB=-549.55 GT:AD:DP:GL:GQ 0/1:39,37:73:-130.44,-21.99,-146.62:99
-chr1 4482139 rs57559146 A C 431.51 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=970.54;QD=17.33;SB=-397.86 GT:AD:DP:GL:GQ 0/1:23,33:54:-116.60,-16.26,-81.57:99
-chr1 4482422 rs60071491 T C 92.13 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=0.92;MQ=56.24;MQ0=0;OQ=1374.62;QD=16.76;SB=-668.88 GT:AD:DP:GL:GQ 0/1:37,45:82:-165.44,-24.69,-153.42:99
-chr1 4482693 rs4112336 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=102.81;MQ=56.77;MQ0=0;OQ=769.43;QD=9.27;SB=-197.80 GT:AD:DP:GL:GQ 0/1:55,28:82:-104.92,-24.70,-193.00:99
-chr1 4482708 . C A 39.18 Indel;LowQual AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=48.79;MQ=55.68;MQ0=0;QD=0.43;SB=-10.83 GT:AD:DP:GL:GQ 0/1:82,10:90:-34.30,-27.10,-291.82:72.01
-chr1 4482756 rs1229150 T G 280.23 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=57.57;MQ0=0;OQ=1600.43;QD=18.83;SB=-735.72 GT:AD:DP:GL:GQ 0/1:32,53:82:-188.02,-24.70,-112.53:99
-chr1 4482784 rs1229151 A G 1304.96 Indel AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=53.27;MQ0=0;QD=17.88;SB=-660.04 GT:AD:DP:GL:GQ 0/1:30,43:72:-155.47,-21.69,-120.71:99
-chr1 4482854 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=68;Dels=0.00;HRun=0;HaplotypeScore=78.29;MQ=48.56;MQ0=0;OQ=195.41;QD=2.87;SB=-84.58 GT:AD:DP:GL:GQ 0/1:55,13:66:-42.70,-19.88,-199.63:99
-chr1 4482959 rs2097536 C T 73.43 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.49;MQ0=0;OQ=999.17;QD=22.20;SB=-274.28 GT:AD:DP:GL:GQ 0/1:16,29:44:-116.46,-13.25,-55.39:99
-chr1 4486372 rs12040164 C T 326.57 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.99;MQ=59.42;MQ0=0;OQ=1051.54;QD=14.60;SB=-388.33 GT:AD:DP:GL:GQ 0/1:40,32:72:-130.14,-21.70,-132.54:99
-chr1 4487829 rs241237 C T 194.54 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.46;MQ0=0;OQ=801.99;QD=18.65;SB=-287.22 GT:AD:DP:GL:GQ 0/1:18,25:42:-96.14,-12.66,-58.53:99
-chr1 4488590 . G A 17.21 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1047.83;QD=22.78;SB=-295.25 GT:AD:DP:GL:GQ 0/1:15,31:44:-121.33,-13.26,-41.74:99
-chr1 4489266 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=19.48;MQ=53.94;MQ0=1;OQ=546.80;QD=8.68;SB=-157.24 GT:AD:DP:GL:GQ 0/1:31,26:42:-73.40,-15.44,-84.22:99
-chr1 4489270 rs241234 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=25.61;MQ=53.85;MQ0=1;OQ=785.85;QD=12.28;SB=-389.60 GT:AD:DP:GL:GQ 0/1:33,31:57:-99.04,-17.17,-115.38:99
-chr1 4490410 rs241233 T C 169.60 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.70;MQ=59.74;MQ0=0;OQ=1074.01;QD=14.92;SB=-553.96 GT:AD:DP:GL:GQ 0/1:36,36:72:-132.37,-21.68,-149.45:99
-chr1 4490829 rs241232 G A 84.32 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=59.60;MQ0=0;OQ=913.96;QD=19.45;SB=-389.16 GT:AD:DP:GL:GQ 0/1:20,27:47:-108.84,-14.16,-68.00:99
-chr1 4492019 . C T 107.27 PASS AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.07;MQ0=0;OQ=862.99;QD=13.28;SB=-457.42 GT:AD:DP:GL:GQ 0/1:38,27:64:-108.86,-19.28,-134.13:99
-chr1 4492104 rs241229 G A 148.93 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=59.63;MQ0=0;OQ=584.46;QD=9.28;SB=-212.39 GT:AD:DP:GL:GQ 0/1:43,20:63:-80.71,-18.98,-155.69:99
-chr1 4494463 rs537398 T C 597.93 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=930.45;QD=15.51;SB=-426.29 GT:AD:DP:GL:GQ 0/1:29,31:60:-114.40,-18.07,-118.90:99
-chr1 4494858 rs34231005 T G 11.27 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=4;HaplotypeScore=0.14;MQ=59.76;MQ0=0;OQ=881.39;QD=11.30;SB=-322.46 GT:AD:DP:GL:GQ 0/1:45,33:76:-114.31,-22.89,-158.76:99
-chr1 4495171 rs509960 T C 253.48 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=2.40;MQ=60.00;MQ0=0;OQ=1172.46;QD=18.04;SB=-611.00 GT:AD:DP:GL:GQ 0/1:27,38:65:-140.10,-19.58,-110.54:99
-chr1 4495869 . C T 861.60 Indel AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=1;HaplotypeScore=22.99;MQ=51.44;MQ0=0;QD=11.64;SB=-342.41 GT:AD:DP:GL:GQ 0/1:44,27:74:-110.83,-21.38,-161.62:99
-chr1 4495871 . C A 736.52 Indel AC=1;AF=0.50;AN=2;DP=74;Dels=0.04;HRun=0;HaplotypeScore=22.99;MQ=51.44;MQ0=0;QD=9.95;SB=-304.20 GT:AD:DP:GL:GQ 0/1:44,27:74:-98.32,-21.38,-161.31:99
-chr1 4496138 rs10915553 T C 458.40 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.54;MQ0=0;OQ=880.60;QD=11.90;SB=-349.17 GT:AD:DP:GL:GQ 0/1:42,32:72:-113.03,-21.69,-158.51:99
-chr1 4496148 rs10915554 G A 271.40 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=55.61;MQ0=0;OQ=1132.53;QD=15.10;SB=-504.97 GT:AD:DP:GL:GQ 0/1:40,35:73:-138.53,-22.00,-129.42:99
-chr1 4496394 rs12084169 C T 196.40 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=59.54;MQ0=0;OQ=1321.84;QD=16.12;SB=-685.73 GT:AD:DP:GL:GQ 0/1:41,41:80:-159.57,-24.10,-141.56:99
-chr1 4496424 rs12086217 A G 463.85 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.43;MQ0=0;OQ=859.99;QD=13.23;SB=-378.26 GT:AD:DP:GL:GQ 0/1:34,31:65:-108.86,-19.58,-137.17:99
-chr1 4496942 rs623217 G C 175.34 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=59.66;MQ0=0;OQ=1355.72;QD=19.94;SB=-471.80 GT:AD:DP:GL:GQ 0/1:31,37:66:-158.75,-19.89,-127.17:99
-chr1 4496949 rs472113 G A 230.42 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.66;MQ0=0;OQ=1272.49;QD=18.99;SB=-462.43 GT:AD:DP:GL:GQ 0/1:30,37:67:-150.71,-20.18,-109.30:99
-chr1 4497460 rs556890 A G 2.32 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=9.81;MQ=58.48;MQ0=0;OQ=661.76;QD=14.39;SB=-333.32 GT:AD:DP:GL:GQ 0/1:21,24:43:-82.42,-12.96,-78.26:99
-chr1 4497578 . G A 145.29 PASS AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.42;MQ=55.81;MQ0=2;OQ=939.73;QD=13.42;SB=-372.83 GT:AD:DP:GL:GQ 0/1:38,32:59:-115.04,-17.78,-100.90:99
-chr1 4497715 rs609304 T C 122.41 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.55;MQ0=0;OQ=597.13;QD=11.71;SB=-145.28 GT:AD:DP:GL:GQ 0/1:26,25:50:-78.07,-15.08,-99.80:99
-chr1 4497726 rs554335 A T 316.28 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=640.98;QD=12.57;SB=-272.29 GT:AD:DP:GL:GQ 0/1:29,22:51:-82.74,-15.36,-107.67:99
-chr1 4497802 rs16838465 A G 196.23 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.68;MQ0=0;OQ=953.26;QD=13.06;SB=-260.95 GT:AD:DP:GL:GQ 0/1:33,40:71:-120.01,-21.40,-135.23:99
-chr1 4497821 rs553435 A G 265.49 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=3.67;MQ=59.70;MQ0=0;OQ=1049.73;QD=13.63;SB=-281.63 GT:AD:DP:GL:GQ 0/1:34,43:75:-130.87,-22.61,-136.05:99
-chr1 4497861 rs608492 G C 466.90 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.05;MQ0=0;OQ=1478.41;QD=20.82;SB=-714.38 GT:AD:DP:GL:GQ 0/1:30,41:69:-171.91,-20.79,-131.74:99
-chr1 4497881 rs12726510 T C 431.64 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=56.08;MQ0=0;OQ=981.66;QD=11.69;SB=-387.89 GT:AD:DP:GL:GQ 0/1:41,43:78:-124.95,-23.50,-161.69:99
-chr1 4497887 rs12752601 C A 191.53 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=56.08;MQ0=0;OQ=1107.25;QD=13.18;SB=-552.73 GT:AD:DP:GL:GQ 0/1:44,40:81:-138.40,-24.39,-157.12:99
-chr1 4497950 rs12737521 G A 266.94 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.10;MQ0=0;OQ=874.33;QD=12.67;SB=-378.16 GT:AD:DP:GL:GQ 0/1:41,28:69:-111.51,-20.80,-136.23:99
-chr1 4498077 rs551359 A G 240.90 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=59.32;MQ0=0;OQ=1496.06;QD=16.81;SB=-547.59 GT:AD:DP:GL:GQ 0/1:39,50:88:-179.39,-26.50,-159.21:99
-chr1 4498168 rs495682 T C 312.82 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=1219.53;QD=14.52;SB=-615.78 GT:AD:DP:GL:GQ 0/1:41,43:83:-150.24,-25.00,-166.52:99
-chr1 4498170 rs596848 G A 305.85 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.72;MQ0=0;OQ=1391.50;QD=16.77;SB=-693.72 GT:AD:DP:GL:GQ 0/1:40,43:81:-166.83,-24.40,-145.63:99
-chr1 4498284 rs596360 G A 603.53 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=984.96;QD=14.92;SB=-509.05 GT:AD:DP:GL:GQ 0/1:36,30:66:-121.68,-19.90,-113.72:99
-chr1 4498314 rs494638 T C 459.72 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.34;MQ0=0;OQ=1145.34;QD=15.69;SB=-585.28 GT:AD:DP:GL:GQ 0/1:33,40:71:-139.20,-21.39,-128.86:99
-chr1 4498825 rs489371 A G 35.40 PASS AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=4.84;MQ=56.29;MQ0=0;OQ=1173.41;QD=12.62;SB=-564.58 GT:AD:DP:GL:GQ 0/1:51,42:90:-147.73,-27.11,-207.42:99
-chr1 4498854 rs489316 A G 383.07 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=53.44;MQ0=0;OQ=1022.72;QD=11.24;SB=-456.67 GT:AD:DP:GL:GQ 0/1:50,41:90:-132.68,-27.12,-202.80:99
-chr1 4499103 rs592726 C T 522.92 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=1251.74;QD=14.06;SB=-614.59 GT:AD:DP:GL:GQ 0/1:50,39:87:-154.68,-26.22,-160.76:99
-chr1 4499256 rs6673713 A T 601.23 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.46;MQ0=0;OQ=969.14;QD=15.38;SB=-478.55 GT:AD:DP:GL:GQ 0/1:32,31:63:-119.17,-18.97,-123.21:99
-chr1 4499545 rs6677142 T C 474.20 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=56.97;MQ0=0;OQ=1056.33;QD=15.77;SB=-489.28 GT:AD:DP:GL:GQ 0/1:31,36:67:-129.10,-20.18,-124.32:99
-chr1 4499557 rs10158638 A G 600.71 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.01;MQ0=0;OQ=954.47;QD=14.46;SB=-498.28 GT:AD:DP:GL:GQ 0/1:33,33:66:-118.61,-19.88,-133.94:99
-chr1 4499695 rs28694108 C T 122.88 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=60.16;MQ0=0;OQ=1387.28;QD=20.11;SB=-460.49 GT:AD:DP:GL:GQ 0/1:27,42:67:-162.21,-20.20,-83.84:99
-chr1 4499852 rs569392 T C 181.23 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.97;MQ=59.40;MQ0=0;OQ=1301.88;QD=15.50;SB=-652.84 GT:AD:DP:GL:GQ 0/1:40,44:84:-158.78,-25.30,-162.80:99
-chr1 4499866 rs638811 G A 371.51 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.47;MQ0=0;OQ=1161.22;QD=14.70;SB=-516.05 GT:AD:DP:GL:GQ 0/1:40,38:72:-141.11,-21.71,-113.94:99
-chr1 4500093 rs627374 C A 201.56 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=3.04;MQ=56.24;MQ0=0;OQ=1409.06;QD=17.18;SB=-575.67 GT:AD:DP:GL:GQ 0/1:36,45:77:-170.76,-26.57,-102.66:99
-chr1 4500144 rs1612095 G C 191.96 PASS AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=58.14;MQ0=0;OQ=1652.98;QD=16.87;SB=-714.30 GT:AD:DP:GL:GQ 0/1:51,47:96:-197.51,-28.93,-219.71:99
-chr1 4500181 rs1612008 C T 343.92 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.55;MQ0=0;OQ=1543.90;QD=16.78;SB=-630.74 GT:AD:DP:GL:GQ 0/1:42,49:86:-183.59,-25.91,-132.31:99
-chr1 4500274 rs544513 A G 399.63 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=703.77;QD=11.00;SB=-261.96 GT:AD:DP:GL:GQ 0/1:33,31:62:-92.35,-18.69,-134.62:99
-chr1 4500351 rs543653 T G 570.98 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=699.52;QD=12.27;SB=-362.58 GT:AD:DP:GL:GQ 0/1:31,26:56:-90.10,-16.87,-111.77:99
-chr1 4500481 rs542688 C G 360.13 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.76;MQ0=0;OQ=1267.59;QD=16.05;SB=-449.73 GT:AD:DP:GL:GQ 0/1:41,38:77:-153.25,-23.20,-181.78:99
-chr1 4500512 rs625627 C T 286.16 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.37;MQ=59.08;MQ0=0;OQ=914.91;QD=12.89;SB=-281.75 GT:AD:DP:GL:GQ 0/1:39,32:67:-114.97,-20.19,-123.19:99
-chr1 4500529 rs541929 A G 325.19 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.04;MQ=59.16;MQ0=0;OQ=945.37;QD=12.28;SB=-290.30 GT:AD:DP:GL:GQ 0/1:42,34:76:-120.71,-22.89,-170.67:99
-chr1 4500606 rs10915556 C T 355.71 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1316.31;QD=19.65;SB=-489.56 GT:AD:DP:GL:GQ 0/1:29,38:66:-154.80,-19.88,-102.91:99
-chr1 4500644 rs2051642 G T 498.30 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1142.97;QD=16.33;SB=-501.30 GT:AD:DP:GL:GQ 0/1:32,38:70:-138.67,-21.09,-110.82:99
-chr1 4500677 rs2051641 C T 126.58 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=2.61;MQ=60.00;MQ0=0;OQ=1424.93;QD=18.04;SB=-396.12 GT:AD:DP:GL:GQ 0/1:37,42:79:-169.57,-23.79,-134.20:99
-chr1 4500995 rs694361 G A 987.12 Indel AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=10;HaplotypeScore=19.73;MQ=59.67;MQ0=0;QD=14.31;SB=-451.85 GT:AD:DP:GL:GQ 0/1:36,33:64:-121.28,-19.29,-109.34:99
-chr1 4501161 rs10915557 A C 322.35 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.59;MQ0=0;OQ=772.74;QD=13.80;SB=-198.82 GT:AD:DP:GL:GQ 0/1:27,28:54:-96.83,-16.27,-94.26:99
-chr1 4501182 rs10915558 G T 398.28 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=829.24;QD=13.16;SB=-280.30 GT:AD:DP:GL:GQ 0/1:32,31:61:-104.58,-18.38,-107.72:99
-chr1 4501418 rs988089 G T 231.64 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.83;MQ0=0;OQ=785.83;QD=14.29;SB=-379.13 GT:AD:DP:GL:GQ 0/1:28,27:55:-98.43,-16.57,-95.26:99
-chr1 4501445 rs988088 G A 287.91 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.35;MQ0=0;OQ=635.25;QD=14.77;SB=-270.30 GT:AD:DP:GL:GQ 0/1:21,22:39:-78.57,-11.76,-58.80:99
-chr1 4501584 rs1988134 A T 372.09 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.72;MQ0=0;OQ=1235.61;QD=14.89;SB=-511.29 GT:AD:DP:GL:GQ 0/1:43,40:83:-151.84,-25.00,-162.60:99
-chr1 4501936 rs508056 T C 0.28 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.01;HRun=1;HaplotypeScore=15.97;MQ=59.84;MQ0=0;OQ=1145.11;QD=15.07;SB=-479.27 GT:AD:DP:GL:GQ 0/1:36,39:76:-140.39,-22.59,-147.97:99
-chr1 4501948 rs594535 A T 38.55 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.01;HRun=0;HaplotypeScore=7.00;MQ=59.51;MQ0=0;OQ=1283.54;QD=17.83;SB=-623.13 GT:AD:DP:GL:GQ 0/1:31,40:72:-153.02,-21.38,-116.42:99
-chr1 4502177 rs640624 T C 14.98 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=7.76;MQ=59.57;MQ0=0;OQ=1108.01;QD=16.29;SB=-573.02 GT:AD:DP:GL:GQ 0/1:30,38:66:-133.97,-19.88,-116.04:99
-chr1 4502677 . A G 145.65 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.30;MQ0=0;OQ=805.91;QD=12.21;SB=-395.14 GT:AD:DP:GL:GQ 0/1:37,29:66:-103.76,-19.88,-150.61:99
-chr1 4502871 rs2411775 C T 188.48 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.39;MQ0=0;OQ=1230.48;QD=17.83;SB=-330.32 GT:AD:DP:GL:GQ 0/1:32,36:67:-146.52,-20.19,-100.70:99
-chr1 4503184 rs694935 T A 28.68 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=2.73;MQ=59.33;MQ0=0;OQ=840.35;QD=13.55;SB=-222.90 GT:AD:DP:GL:GQ 0/1:31,31:58:-104.80,-17.48,-105.42:99
-chr1 4503230 rs694967 T G 352.39 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=57.78;MQ0=0;OQ=1098.27;QD=15.25;SB=-535.44 GT:AD:DP:GL:GQ 0/1:33,39:72:-134.80,-21.69,-119.88:99
-chr1 4503601 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=120;Dels=0.00;HRun=1;HaplotypeScore=106.52;MQ=39.06;MQ0=0;OQ=897.90;QD=7.48;SB=-269.21 GT:AD:DP:GL:GQ 0/1:86,34:118:-128.61,-35.54,-314.22:99
-chr1 4503616 . T C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=137;Dels=0.00;HRun=1;HaplotypeScore=12.83;MQ=37.47;MQ0=0;OQ=467.51;QD=3.41;SB=-122.22 GT:AD:DP:GL:GQ 0/1:111,26:134:-90.40,-40.36,-439.82:99
-chr1 4503623 rs241214 C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=148;Dels=0.00;HRun=0;HaplotypeScore=94.05;MQ=37.91;MQ0=0;OQ=4273.01;QD=28.87;SB=-1538.72 GT:AD:DP:GL:GQ 0/1:32,114:147:-426.30,-51.49,-123.04:99
-chr1 4503639 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=159;Dels=0.00;HRun=0;HaplotypeScore=260.99;MQ=37.36;MQ0=0;OQ=1166.38;QD=7.34;SB=-484.60 GT:AD:DP:GL:GQ 0/1:114,44:124:-157.27,-37.35,-295.16:99
-chr1 4503657 rs12754029 A C 1394.26 DPFilter;Indel AC=1;AF=0.50;AN=2;DB;DP=153;Dels=0.00;HRun=1;HaplotypeScore=166.14;MQ=39.29;MQ0=0;QD=9.11;SB=-599.12 GT:AD:DP:GL:GQ 0/1:73,77:122:-190.87,-48.16,-269.49:99
-chr1 4503674 rs61111938 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=147;Dels=0.00;HRun=0;HaplotypeScore=137.11;MQ=42.18;MQ0=0;OQ=392.40;QD=2.67;SB=-58.59 GT:AD:DP:GL:GQ 0/1:124,23:123:-79.58,-37.06,-405.54:99
-chr1 4503686 rs61202630 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=124;Dels=0.03;HRun=0;HaplotypeScore=163.66;MQ=45.68;MQ0=0;OQ=981.22;QD=7.91;SB=-498.66 GT:AD:DP:GL:GQ 0/1:79,40:116:-138.71,-37.31,-281.28:99
-chr1 4503715 . T C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=16.61;MQ=53.48;MQ0=0;OQ=158.20;QD=1.86;SB=-90.66 GT:AD:DP:GL:GQ 0/1:72,13:84:-44.41,-25.30,-293.89:99
-chr1 4503964 rs241215 T A 444.25 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=54.88;MQ0=0;OQ=1312.48;QD=17.50;SB=-618.08 GT:AD:DP:GL:GQ 0/1:34,41:75:-157.12,-22.59,-129.67:99
-chr1 4504029 rs241216 G A 155.80 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=4.03;MQ=59.43;MQ0=0;OQ=1251.65;QD=17.15;SB=-469.46 GT:AD:DP:GL:GQ 0/1:35,38:70:-149.55,-21.10,-107.16:99
-chr1 4504349 rs241217 C G 275.14 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1603.60;QD=22.59;SB=-778.42 GT:AD:DP:GL:GQ 0/1:29,42:71:-185.04,-21.39,-125.25:99
-chr1 4505282 rs241218 T C 43.78 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=7.22;MQ=59.15;MQ0=0;OQ=812.13;QD=11.44;SB=-395.26 GT:AD:DP:GL:GQ 0/1:37,34:67:-104.70,-20.20,-130.72:99
-chr1 4506052 rs241219 T C 334.21 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.94;MQ=59.17;MQ0=0;OQ=741.75;QD=13.25;SB=-389.65 GT:AD:DP:GL:GQ 0/1:27,29:55:-94.04,-16.58,-103.55:99
-chr1 4508064 rs241220 G A 334 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=60.00;MQ0=0;OQ=1163.49;QD=17.37;SB=-431.97 GT:AD:DP:GL:GQ 0/1:32,35:66:-139.53,-19.90,-98.33:99
-chr1 4508910 rs241221 T C 373.72 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.20;MQ0=0;OQ=874.89;QD=15.08;SB=-418.55 GT:AD:DP:GL:GQ 0/1:25,33:55:-107.34,-16.57,-97.13:99
-chr1 4509116 rs241222 G C 267.87 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=59.18;MQ0=0;OQ=1337.43;QD=18.07;SB=-676.08 GT:AD:DP:GL:GQ 0/1:37,37:72:-158.72,-21.69,-154.68:99
-chr1 4510110 rs241244 A T 180.09 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.78;MQ=60.38;MQ0=0;OQ=930.99;QD=16.33;SB=-387.46 GT:AD:DP:GL:GQ 0/1:27,30:57:-113.55,-17.17,-101.72:99
-chr1 4510493 rs241245 T C 361.78 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=851.20;QD=14.43;SB=-421.93 GT:AD:DP:GL:GQ 0/1:29,30:57:-105.58,-17.17,-107.45:99
-chr1 4510920 rs241246 T C 463.10 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.63;MQ0=0;OQ=864.46;QD=13.94;SB=-382.19 GT:AD:DP:GL:GQ 0/1:32,30:62:-108.40,-18.67,-129.80:99
-chr1 4510938 rs241247 G T 223.55 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=4.47;MQ=59.71;MQ0=0;OQ=1111.82;QD=14.07;SB=-561.61 GT:AD:DP:GL:GQ 0/1:42,37:78:-137.96,-23.49,-147.67:99
-chr1 4511101 rs241248 G A 90.66 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=4.65;MQ=58.90;MQ0=0;OQ=1137.70;QD=15.80;SB=-412.89 GT:AD:DP:GL:GQ 0/1:38,34:72:-138.74,-21.69,-139.14:99
-chr1 4512226 rs241249 C A 118.09 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=2704.76;QD=36.06;SB=-1203.75 GT:AD:DP:GL:GQ 1/1:0,75:73:-274.08,-21.98,-0.01:99
-chr1 4512612 rs12117466 C T 434.32 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1595.86;QD=21.57;SB=-705.78 GT:AD:DP:GL:GQ 0/1:28,46:74:-185.16,-22.29,-104.90:99
-chr1 4512789 rs2222050 C G 399.97 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=51.66;MQ0=0;OQ=560.26;QD=12.18;SB=-284.90 GT:AD:DP:GL:GQ 0/1:29,17:46:-73.17,-13.86,-129.73:99
-chr1 4512997 . G C 109.15 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.26;MQ0=0;OQ=1039.37;QD=14.64;SB=-540.64 GT:AD:DP:GL:GQ 0/1:41,30:70:-128.31,-21.09,-176.73:99
-chr1 4513093 rs241250 C T 592.78 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=2215.68;QD=40.29;SB=-1120.49 GT:AD:DP:GL:GQ 1/1:0,55:55:-225.17,-16.57,-0.01:99
-chr1 4513279 rs241251 T C 191.39 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=3.46;MQ=56.17;MQ0=0;OQ=859.05;QD=12.10;SB=-428.93 GT:AD:DP:GL:GQ 0/1:40,31:71:-110.57,-21.39,-162.21:99
-chr1 4513371 rs241252 G A 678.22 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2454.05;QD=39.58;SB=-997.85 GT:AD:DP:GL:GQ 1/1:0,61:61:-249.00,-18.37,-0.01:99
-chr1 4513556 rs56948682 G C 523.60 Indel AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=3.31;MQ=55.31;MQ0=0;QD=11.90;SB=-218.66 GT:AD:DP:GL:GQ 0/1:25,19:40:-67.72,-12.07,-92.30:99
-chr1 4513868 rs241254 G A 271.50 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=58.71;MQ0=0;OQ=649.43;QD=12.03;SB=-239.26 GT:AD:DP:GL:GQ 0/1:28,25:50:-83.30,-15.07,-98.60:99
-chr1 4513881 rs241255 G C 176.18 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=58.80;MQ0=0;OQ=2370.20;QD=40.87;SB=-1167.06 GT:AD:DP:GL:GQ 1/1:0,58:55:-240.62,-16.57,-0.01:99
-chr1 4514372 rs241256 C T 582.40 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=913.61;QD=13.44;SB=-345.84 GT:AD:DP:GL:GQ 0/1:39,29:68:-115.13,-20.48,-142.92:99
-chr1 4514476 rs6426419 T A 347.17 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.60;MQ0=0;OQ=541.18;QD=9.33;SB=-252.68 GT:AD:DP:GL:GQ 0/1:37,21:57:-74.57,-17.17,-137.52:99
-chr1 4514682 rs241257 C T 286.90 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2358.24;QD=39.97;SB=-1174.07 GT:AD:DP:GL:GQ 1/1:0,59:59:-239.42,-17.77,-0.01:99
-chr1 4514873 rs171319 C T 380.27 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.42;MQ0=0;OQ=1086.37;QD=13.58;SB=-534.53 GT:AD:DP:GL:GQ 0/1:46,34:78:-135.44,-23.52,-140.72:99
-chr1 4515369 rs241258 G A 48.68 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=2.13;MQ=47.21;MQ0=0;OQ=749.09;QD=17.42;SB=-181.27 GT:AD:DP:GL:GQ 0/1:20,23:42:-90.85,-12.66,-63.49:99
-chr1 4515444 rs241259 C G 22.32 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=50.43;MQ0=0;OQ=2118.85;QD=40.75;SB=-972.73 GT:AD:DP:GL:GQ 1/1:0,52:49:-215.48,-14.76,-0.01:99
-chr1 4515588 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=15;HaplotypeScore=4.97;MQ=51.27;MQ0=0;OQ=250.35;QD=4.47;SB=56.21 GT:AD:DP:GL:GQ 0/1:42,14:49:-43.09,-14.77,-129.95:99
-chr1 4515926 rs241260 C G 33.59 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=55.21;MQ0=0;OQ=3292.12;QD=42.21;SB=-1616.25 GT:AD:DP:GL:GQ 1/1:0,78:75:-328.21,-22.60,-0.02:99
-chr1 4515962 rs241261 T C 602.08 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.64;MQ0=0;OQ=2469.23;QD=29.75;SB=-1091.36 GT:AD:DP:GL:GQ 1/1:0,83:79:-250.58,-23.83,-0.08:99
-chr1 4516659 rs241262 T G 634.51 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2557.93;QD=35.53;SB=-1149.62 GT:AD:DP:GL:GQ 1/1:0,72:72:-259.40,-21.69,-0.02:99
-chr1 4517716 rs10799244 T C 405.95 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.15;MQ0=0;OQ=1346.22;QD=18.96;SB=-628.34 GT:AD:DP:GL:GQ 0/1:27,44:70:-158.99,-21.09,-107.87:99
-chr1 4518111 rs6685798 G A 309.27 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=59.32;MQ0=0;OQ=1238.56;QD=18.21;SB=-627.62 GT:AD:DP:GL:GQ 0/1:30,37:65:-146.72,-19.58,-98.24:99
-chr1 4518139 rs916408 T C 232.25 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.86;MQ=59.63;MQ0=0;OQ=609.90;QD=9.84;SB=-241.88 GT:AD:DP:GL:GQ 0/1:34,28:60:-82.36,-18.09,-138.61:99
-chr1 4518389 rs916407 C A 294.22 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=58.44;MQ0=0;OQ=593.42;QD=10.99;SB=-258.24 GT:AD:DP:GL:GQ 0/1:32,22:53:-78.59,-15.97,-110.59:99
-chr1 4518393 rs916406 T C 102.38 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.50;MQ0=0;OQ=426.60;QD=7.62;SB=-216.22 GT:AD:DP:GL:GQ 0/1:34,22:50:-61.02,-15.07,-122.30:99
-chr1 4518582 rs241263 T C 395.70 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2663.66;QD=36.49;SB=-1355.60 GT:AD:DP:GL:GQ 1/1:0,73:73:-269.97,-21.98,-0.02:99
-chr1 4518898 rs241264 C T 593.29 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=3315.63;QD=40.93;SB=-1267.69 GT:AD:DP:GL:GQ 1/1:0,81:81:-330.56,-24.40,-0.02:99
-chr1 4519253 rs241265 G T 396.78 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=442.53;QD=9.42;SB=-108.63 GT:AD:DP:GL:GQ 0/1:30,17:47:-61.69,-14.15,-109.08:99
-chr1 4520150 rs241266 G A 572.22 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1309.70;QD=16.79;SB=-634.24 GT:AD:DP:GL:GQ 0/1:38,40:77:-157.45,-23.20,-135.23:99
-chr1 4520783 rs10915560 T C 479.08 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=617.89;QD=10.13;SB=-279.12 GT:AD:DP:GL:GQ 0/1:36,25:60:-83.15,-18.08,-142.30:99
-chr1 4520856 rs12120353 C A 156.50 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=694.57;QD=12.19;SB=-303.22 GT:AD:DP:GL:GQ 0/1:32,25:54:-89.01,-16.27,-103.65:99
-chr1 4521323 rs241267 C T 378.46 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=59.60;MQ0=0;OQ=620.84;QD=13.21;SB=-243.25 GT:AD:DP:GL:GQ 0/1:25,22:45:-78.94,-13.58,-74.16:99
-chr1 4521646 rs12748186 C T 419.48 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=983.89;QD=18.92;SB=-364.52 GT:AD:DP:GL:GQ 0/1:23,29:52:-117.34,-15.67,-75.86:99
-chr1 4522500 rs241268 A G 490.54 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1548.29;QD=30.97;SB=-704.61 GT:AD:DP:GL:GQ 1/1:0,50:49:-158.46,-14.78,-0.04:99
-chr1 4523101 . G T 20.08 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=16;HaplotypeScore=10.17;MQ=50.32;MQ0=0;QD=0.35;SB=50.87 GT:AD:DP:GL:GQ 0/1:48,10:42:-17.95,-12.66,-121.78:52.87
-chr1 4523283 rs241269 C T 335.48 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=806.86;QD=12.81;SB=-308.31 GT:AD:DP:GL:GQ 0/1:36,27:61:-102.37,-18.40,-111.88:99
-chr1 4523749 rs55956326 C T 46.96 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=776.69;QD=17.65;SB=-140.14 GT:AD:DP:GL:GQ 0/1:21,23:44:-94.21,-13.26,-66.49:99
-chr1 4524365 rs497517 C A 203.92 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.25;MQ=57.23;MQ0=0;OQ=2311.84;QD=35.57;SB=-943.65 GT:AD:DP:GL:GQ 1/1:0,65:64:-234.79,-19.27,-0.02:99
-chr1 4524639 rs190250 T C 96.54 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=54.62;MQ0=1;OQ=1410.76;QD=28.22;SB=-520.24 GT:AD:DP:GL:GQ 1/1:1,49:43:-144.69,-12.96,-0.03:99
-chr1 4525049 rs241270 T A 128.22 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=57.31;MQ0=0;OQ=2756.56;QD=35.80;SB=-964.62 GT:AD:DP:GL:GQ 1/1:0,76:75:-279.26,-22.59,-0.02:99
-chr1 4525775 . C T 82.15 PASS AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=60.00;MQ0=0;OQ=631.76;QD=12.39;SB=-287.21 GT:AD:DP:GL:GQ 0/1:28,23:47:-80.62,-14.16,-88.43:99
-chr1 4526115 rs241271 T C 508.56 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1796.29;QD=29.45;SB=-877.68 GT:AD:DP:GL:GQ 1/1:0,61:57:-183.26,-17.19,-0.05:99
-chr1 4526127 rs241272 T G 620.21 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=2425.30;QD=34.16;SB=-1142.12 GT:AD:DP:GL:GQ 1/1:0,71:70:-246.14,-21.08,-0.02:99
-chr1 4526146 rs1515670 A G 180.27 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=3.98;MQ=58.96;MQ0=0;OQ=860.15;QD=12.84;SB=-436.91 GT:AD:DP:GL:GQ 0/1:37,30:66:-109.18,-19.88,-145.10:99
-chr1 4526937 rs241273 A C 421.62 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1105.42;QD=16.02;SB=-515.69 GT:AD:DP:GL:GQ 0/1:31,38:69:-134.61,-20.78,-114.90:99
-chr1 4527342 rs241274 A C 51.54 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1996.50;QD=32.20;SB=-821.03 GT:AD:DP:GL:GQ 1/1:0,62:58:-203.26,-17.47,-0.02:99
-chr1 4527839 rs241275 A G 555.63 PASS AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=2594.28;QD=29.48;SB=-1228.48 GT:AD:DP:GL:GQ 1/1:0,88:82:-263.09,-24.73,-0.08:99
-chr1 4528191 rs28665533 G A 434.73 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1407.19;QD=19.02;SB=-661.67 GT:AD:DP:GL:GQ 0/1:32,42:74:-166.29,-22.29,-115.61:99
-chr1 4528559 rs241276 C T 153.75 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=4.22;MQ=59.30;MQ0=0;OQ=909.72;QD=13.78;SB=-324.82 GT:AD:DP:GL:GQ 0/1:37,29:65:-113.86,-19.61,-110.36:99
-chr1 4529046 rs241277 A C 117.60 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=2.18;MQ=60.00;MQ0=0;OQ=2433.72;QD=33.34;SB=-1159.13 GT:AD:DP:GL:GQ 1/1:0,73:69:-246.98,-20.78,-0.02:99
-chr1 4529268 rs241278 T C 273.02 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.43;MQ=59.61;MQ0=0;OQ=2074.79;QD=35.17;SB=-848.12 GT:AD:DP:GL:GQ 1/1:0,59:58:-211.08,-17.47,-0.02:99
-chr1 4530244 rs7531281 A C 607.97 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2071.97;QD=33.42;SB=-943.11 GT:AD:DP:GL:GQ 1/1:0,62:60:-210.80,-18.07,-0.02:99
-chr1 4530343 rs7526879 C T 127.03 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.29;MQ0=0;OQ=2841.32;QD=39.46;SB=-1410.68 GT:AD:DP:GL:GQ 1/1:0,72:71:-287.74,-21.39,-0.02:99
-chr1 4531126 rs241212 G T 328.23 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=59.37;MQ0=0;OQ=847.33;QD=14.36;SB=-341.38 GT:AD:DP:GL:GQ 0/1:30,29:58:-105.49,-17.47,-104.18:99
-chr1 4531264 rs55850443 C A 105.26 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=3.29;MQ=59.66;MQ0=0;OQ=907.20;QD=13.54;SB=-364.99 GT:AD:DP:GL:GQ 0/1:34,33:65:-113.58,-19.58,-115.11:99
-chr1 4532420 rs980092 A G 568.56 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2136.98;QD=31.43;SB=-1016.73 GT:AD:DP:GL:GQ 1/1:0,68:67:-217.34,-20.21,-0.06:99
-chr1 4532678 rs34339970 T C 238.67 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=59.68;MQ0=0;OQ=686.96;QD=9.41;SB=-234.24 GT:AD:DP:GL:GQ 0/1:42,31:70:-93.08,-21.10,-159.73:99
-chr1 4532688 rs171317 C A 295.77 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.69;MQ0=0;OQ=2546.98;QD=34.42;SB=-1274.23 GT:AD:DP:GL:GQ 1/1:0,74:71:-258.31,-21.38,-0.02:99
-chr1 4532830 rs35748829 C T 224.19 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.37;MQ0=0;OQ=1280.71;QD=19.40;SB=-516.15 GT:AD:DP:GL:GQ 0/1:29,37:64:-150.64,-19.29,-86.56:99
-chr1 4532839 rs35106071 C T 30.34 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.47;MQ=59.31;MQ0=0;OQ=1092.68;QD=17.91;SB=-426.77 GT:AD:DP:GL:GQ 0/1:29,32:61:-130.92,-18.37,-105.58:99
-chr1 4533414 rs6673089 G A 59.57 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.78;MQ=59.66;MQ0=0;OQ=1175.25;QD=17.54;SB=-391.70 GT:AD:DP:GL:GQ 0/1:31,35:66:-140.69,-19.88,-114.80:99
-chr1 4533499 rs6426421 C T 279.59 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=56.21;MQ0=0;OQ=3052.51;QD=38.64;SB=-1294.73 GT:AD:DP:GL:GQ 1/1:0,79:78:-308.86,-23.50,-0.03:99
-chr1 4533545 rs7527742 G A 582.48 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.29;MQ0=0;OQ=1245.18;QD=15.19;SB=-388.08 GT:AD:DP:GL:GQ 0/1:45,37:81:-152.20,-24.40,-157.64:99
-chr1 4533745 rs241208 T C 151.85 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.23;MQ0=0;OQ=641.89;QD=11.07;SB=-289.57 GT:AD:DP:GL:GQ 0/1:35,23:57:-84.64,-17.17,-139.99:99
-chr1 4533782 rs17344823 A T 343.49 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=50.31;MQ0=0;OQ=1106.34;QD=17.56;SB=-567.72 GT:AD:DP:GL:GQ 0/1:26,37:60:-131.99,-18.07,-92.40:99
-chr1 4533944 rs241207 T G 366.15 PASS AC=2;AF=1.00;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.27;MQ0=0;OQ=1080.62;QD=29.21;SB=-322.00 GT:AD:DP:GL:GQ 1/1:0,37:32:-111.66,-9.64,-0.02:96.25
-chr1 4534250 rs11584033 T C 380.79 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=58.88;MQ0=0;OQ=947.57;QD=16.34;SB=-494.15 GT:AD:DP:GL:GQ 0/1:26,32:58:-115.51,-17.47,-106.56:99
-chr1 4534838 rs1541318 A G 459.08 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1096.76;QD=16.87;SB=-540.58 GT:AD:DP:GL:GQ 0/1:28,37:65:-132.54,-19.58,-112.37:99
-chr1 4535109 rs2411777 C T 151.18 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.69;MQ0=0;OQ=1491.80;QD=20.16;SB=-710.25 GT:AD:DP:GL:GQ 0/1:30,44:73:-174.45,-21.99,-106.04:99
-chr1 4536054 rs10799246 T A 279.36 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=56.28;MQ0=1;OQ=1123.37;QD=19.37;SB=-579.73 GT:AD:DP:GL:GQ 0/1:23,35:56:-132.49,-16.87,-78.58:99
-chr1 4536627 rs1157688 T C 729.05 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2286.18;QD=34.64;SB=-1059.42 GT:AD:DP:GL:GQ 1/1:1,65:64:-232.22,-19.28,-0.02:99
-chr1 4537253 rs12746043 A G 196.32 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.75;MQ=59.75;MQ0=0;OQ=742.34;QD=10.03;SB=-306.91 GT:AD:DP:GL:GQ 0/1:43,31:74:-99.82,-22.30,-175.74:99
-chr1 4537334 rs12073968 A T 357.38 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=1269.08;QD=15.67;SB=-567.67 GT:AD:DP:GL:GQ 0/1:40,41:80:-154.29,-24.09,-150.38:99
-chr1 4537921 rs12724503 G A 310.14 PASS AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=1.26;MQ=60.00;MQ0=0;OQ=1523.81;QD=15.09;SB=-617.07 GT:AD:DP:GL:GQ 0/1:55,46:100:-185.79,-30.12,-188.53:99
-chr1 4538097 rs4654561 G A 508.13 PASS AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=3756.30;QD=39.96;SB=-1777.79 GT:AD:DP:GL:GQ 1/1:0,92:93:-374.63,-34.91,-7.66:99
-chr1 4538181 rs4654562 G A 215.56 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=59.13;MQ0=0;OQ=1260.80;QD=15.19;SB=-602.60 GT:AD:DP:GL:GQ 0/1:45,38:82:-154.08,-24.71,-143.05:99
-chr1 4538603 rs4654563 G A 371.27 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1202.15;QD=16.03;SB=-528.76 GT:AD:DP:GL:GQ 0/1:39,36:74:-145.80,-22.30,-125.85:99
-chr1 4538973 rs7543382 T C 333.40 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=59.17;MQ0=0;OQ=1070.40;QD=14.66;SB=-356.54 GT:AD:DP:GL:GQ 0/1:37,36:73:-132.31,-21.99,-147.75:99
-chr1 4539030 rs7540656 A G 325.75 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.39;MQ0=0;OQ=796.84;QD=11.72;SB=-299.04 GT:AD:DP:GL:GQ 0/1:36,32:68:-103.46,-20.49,-144.09:99
-chr1 4540675 rs1963269 C G 227.56 PASS AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.54;MQ0=0;OQ=1695.02;QD=16.62;SB=-763.36 GT:AD:DP:GL:GQ 0/1:55,47:97:-202.01,-29.22,-223.35:99
-chr1 4540762 rs1024139 T C 542 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.15;MQ0=0;OQ=842.09;QD=11.70;SB=-437.91 GT:AD:DP:GL:GQ 0/1:42,30:72:-109.18,-21.69,-170.21:99
-chr1 4541602 rs241225 G A 260.13 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.63;MQ0=0;OQ=2333.57;QD=37.04;SB=-1016.38 GT:AD:DP:GL:GQ 1/1:0,63:59:-236.96,-17.77,-0.01:99
-chr1 4541659 rs241224 G T 284.32 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.28;MQ0=0;OQ=2085.58;QD=35.96;SB=-859.24 GT:AD:DP:GL:GQ 1/1:0,58:57:-212.16,-17.17,-0.02:99
-chr1 4541986 rs61765446 G A 358.57 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=942.30;QD=14.28;SB=-483.10 GT:AD:DP:GL:GQ 0/1:37,29:65:-117.11,-19.59,-114.27:99
-chr1 4542017 rs241223 C T 513.72 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2827.32;QD=39.82;SB=-1402.70 GT:AD:DP:GL:GQ 1/1:0,71:71:-286.34,-21.39,-0.02:99
-chr1 4542337 rs184781 C T 269.78 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=2680.27;QD=40.00;SB=-1072.41 GT:AD:DP:GL:GQ 1/1:0,67:66:-271.63,-19.88,-0.01:99
-chr1 4542995 . A T 0.76 PASS AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=53.06;MQ0=0;OQ=196.97;QD=3.28;SB=-90.71 GT:AD:DP:GL:GQ 0/1:48,11:53:-38.95,-15.97,-156.27:99
-chr1 4543292 rs2078573 A C 86.48 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=6.05;MQ=56.75;MQ0=0;OQ=1341.41;QD=16.77;SB=-537.82 GT:AD:DP:GL:GQ 0/1:31,48:77:-160.62,-23.19,-115.03:99
-chr1 4543548 rs515279 T C 17.62 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.93;MQ=59.29;MQ0=0;OQ=1923.64;QD=29.59;SB=-45.69 GT:AD:DP:GL:GQ 1/1:0,65:64:-196.03,-19.32,-0.08:99
-chr1 4543717 rs587108 T G 137.04 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.89;MQ0=0;OQ=716.08;QD=34.10;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,21:21:-75.20,-6.33,-0.01:63.19
-chr1 4543945 rs588347 C T 45.56 PASS AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=256.94;QD=10.71;SB=-10.00 GT:AD:DP:GL:GQ 0/1:15,9:24:-36.21,-7.23,-52.03:99
-chr1 4544067 rs588861 G A 43.71 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=54.12;MQ0=0;OQ=1783.57;QD=37.95;SB=-560.73 GT:AD:DP:GL:GQ 1/1:0,47:45:-181.96,-13.56,-0.01:99
-chr1 4544173 rs488684 T A 310.68 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.99;MQ0=0;OQ=2644.21;QD=36.73;SB=-1277.61 GT:AD:DP:GL:GQ 1/1:0,72:70:-268.02,-21.08,-0.01:99
-chr1 4545564 rs616180 T G 115.98 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.33;MQ=58.74;MQ0=0;OQ=2469.47;QD=35.28;SB=-1055.12 GT:AD:DP:GL:GQ 1/1:0,70:69:-250.55,-20.78,-0.02:99
-chr1 4545738 rs617046 T C 49.62 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=60.00;MQ0=0;OQ=1303.79;QD=31.80;SB=-288.55 GT:AD:DP:GL:GQ 1/1:0,41:40:-133.99,-12.05,-0.02:99
-chr1 4545788 rs57374319 C T 229.72 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=594.52;QD=13.51;SB=-275.28 GT:AD:DP:GL:GQ 0/1:24,20:43:-75.69,-12.95,-87.49:99
-chr1 4545807 rs563158 G C 408.48 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2250.93;QD=42.47;SB=-845.32 GT:AD:DP:GL:GQ 1/1:0,53:52:-228.70,-15.67,-0.02:99
-chr1 4545915 rs617610 A G 103.88 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=58.73;MQ0=0;OQ=1514.17;QD=27.53;SB=-766.72 GT:AD:DP:GL:GQ 1/1:0,55:49:-155.05,-14.78,-0.05:99
-chr1 4545933 rs561468 C A 155.56 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.22;MQ0=0;OQ=1902.16;QD=32.24;SB=-898.65 GT:AD:DP:GL:GQ 1/1:0,59:54:-193.82,-16.27,-0.02:99
-chr1 4546125 rs538655 G A 601.67 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.21;MQ0=0;OQ=2022.14;QD=38.15;SB=-935.74 GT:AD:DP:GL:GQ 1/1:0,53:52:-205.82,-15.67,-0.02:99
-chr1 4546239 rs619364 G A 445.90 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=837.24;QD=13.95;SB=-392.12 GT:AD:DP:GL:GQ 0/1:34,26:60:-105.08,-18.07,-121.77:99
-chr1 4546345 rs536749 A G 482 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=1853.11;QD=30.38;SB=-858.57 GT:AD:DP:GL:GQ 1/1:0,61:58:-188.95,-17.49,-0.05:99
-chr1 4546432 rs4654446 C T 238.01 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=2.88;MQ=59.28;MQ0=0;OQ=947.38;QD=16.33;SB=-474.49 GT:AD:DP:GL:GQ 0/1:28,30:56:-114.89,-16.87,-97.02:99
-chr1 4546657 rs562787 A G 229.14 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=1701.20;QD=30.38;SB=-810.66 GT:AD:DP:GL:GQ 1/1:0,56:54:-173.76,-16.29,-0.05:99
-chr1 4546823 rs532259 C T 169.24 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.40;MQ0=0;OQ=2521.38;QD=40.67;SB=-1140.51 GT:AD:DP:GL:GQ 1/1:0,62:62:-255.74,-18.67,-0.01:99
-chr1 4547018 rs559200 G C 1813.47 Indel AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.18;MQ0=0;QD=40.30;SB=-734.75 GT:AD:DP:GL:GQ 1/1:0,44:43:-184.95,-12.96,-0.01:99
-chr1 4547035 rs6691728 C T 1783.47 Indel AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=57.64;MQ0=0;QD=39.63;SB=-856.02 GT:AD:DP:GL:GQ 1/1:0,45:45:-181.94,-13.55,-0.01:99
-chr1 4547069 rs558411 G C 0.77 PASS AC=2;AF=1.00;AN=2;DB;DP=39;Dels=0.00;HRun=4;HaplotypeScore=0.63;MQ=58.20;MQ0=0;OQ=1617.71;QD=41.48;SB=-687.82 GT:AD:DP:GL:GQ 1/1:0,39:38:-165.37,-11.45,-0.01:99
-chr1 4547307 rs634075 C T 118.64 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=59.44;MQ0=0;OQ=1786.25;QD=34.35;SB=-705.43 GT:AD:DP:GL:GQ 1/1:0,51:47:-182.23,-14.17,-0.02:99
-chr1 4547329 rs644647 C A 608.94 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.55;MQ0=0;OQ=1779.42;QD=34.89;SB=-902.65 GT:AD:DP:GL:GQ 1/1:0,51:50:-181.54,-15.06,-0.02:99
-chr1 4547506 rs2674014 C T 604.69 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=3048.33;QD=39.08;SB=-1465.48 GT:AD:DP:GL:GQ 1/1:0,78:77:-308.44,-23.20,-0.02:99
-chr1 4548034 rs669252 A G 36.37 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=59.78;MQ0=0;OQ=2568.64;QD=30.58;SB=-1254.84 GT:AD:DP:GL:GQ 1/1:0,84:80:-260.52,-24.13,-0.08:99
-chr1 4548229 rs527146 C T 195.56 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.54;MQ0=0;OQ=2361.57;QD=37.49;SB=-975.04 GT:AD:DP:GL:GQ 1/1:2,61:63:-246.39,-18.98,-6.65:99
-chr1 4548230 rs553803 A G 202.91 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.54;MQ0=0;OQ=2093.62;QD=33.23;SB=-906.61 GT:AD:DP:GL:GQ 1/1:2,61:63:-221.00,-18.97,-8.05:99
-chr1 4548433 rs504274 C T 6.37 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=4;HaplotypeScore=2.30;MQ=59.56;MQ0=0;OQ=3385.81;QD=39.83;SB=-1431.01 GT:AD:DP:GL:GQ 1/1:0,85:84:-337.58,-25.30,-0.02:99
-chr1 4548537 rs916404 A G 176.85 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.01;MQ=59.60;MQ0=0;OQ=1563.60;QD=27.43;SB=-730.94 GT:AD:DP:GL:GQ 1/1:0,57:51:-160.00,-15.38,-0.05:99
-chr1 4548552 rs1811133 G A 623.08 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2054.70;QD=38.77;SB=-776.53 GT:AD:DP:GL:GQ 1/1:0,53:52:-209.07,-15.66,-0.01:99
-chr1 4548640 rs10915566 C T 338.58 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=59.67;MQ0=0;OQ=1058.12;QD=15.12;SB=-552.39 GT:AD:DP:GL:GQ 0/1:37,33:67:-129.29,-20.20,-113.66:99
-chr1 4548685 rs2176113 C T 467.66 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1206.49;QD=16.76;SB=-424.43 GT:AD:DP:GL:GQ 0/1:37,35:72:-145.62,-21.68,-138.53:99
-chr1 4548689 rs549918 C T 547.08 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2745.70;QD=39.22;SB=-872.18 GT:AD:DP:GL:GQ 1/1:0,70:69:-278.17,-20.79,-0.02:99
-chr1 4548722 rs549150 C T 597.32 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=3119.07;QD=40.51;SB=-1266.19 GT:AD:DP:GL:GQ 1/1:0,77:77:-315.51,-23.19,-0.01:99
-chr1 4548785 rs548958 A C 587.96 PASS AC=2;AF=1.00;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.52;MQ0=0;OQ=3225.28;QD=33.25;SB=-1553.11 GT:AD:DP:GL:GQ 1/1:0,97:93:-326.16,-28.01,-0.03:99
-chr1 4548901 rs683704 G A 493.67 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2363.22;QD=39.39;SB=-1015.37 GT:AD:DP:GL:GQ 1/1:0,60:60:-239.92,-18.08,-0.02:99
-chr1 4549335 rs572875 G A 610.19 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.57;MQ0=0;OQ=2583.49;QD=39.75;SB=-1223.62 GT:AD:DP:GL:GQ 1/1:0,65:64:-261.95,-19.28,-0.01:99
-chr1 4549598 rs520532 C T 634.82 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=1;OQ=2560.49;QD=37.65;SB=-1198.62 GT:AD:DP:GL:GQ 1/1:0,68:66:-259.66,-19.89,-0.02:99
-chr1 4550061 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=20;HaplotypeScore=23.52;MQ=43.78;MQ0=0;OQ=658.49;QD=6.86;SB=83.26 GT:AD:DP:GL:GQ 0/1:53,43:71:-90.53,-21.40,-163.68:99
-chr1 4550163 rs189538 T C 1.23 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=2;HaplotypeScore=4.99;MQ=53.64;MQ0=0;OQ=1059.98;QD=26.50;SB=-540.85 GT:AD:DP:GL:GQ 1/1:0,40:35:-109.62,-10.56,-0.04:99
-chr1 4550501 rs10915567 A T 204.42 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=58.86;MQ0=0;OQ=971.67;QD=17.35;SB=-337.66 GT:AD:DP:GL:GQ 0/1:25,31:54:-116.71,-16.26,-86.04:99
-chr1 4550640 rs241213 G A 356.42 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2857.67;QD=40.25;SB=-1367.83 GT:AD:DP:GL:GQ 1/1:0,71:71:-289.37,-21.39,-0.02:99
-chr1 4550851 rs164775 A G 34.10 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=5.34;MQ=59.24;MQ0=0;OQ=775.11;QD=14.09;SB=-373.36 GT:AD:DP:GL:GQ 0/1:28,27:55:-97.36,-16.57,-110.68:99
-chr1 4551064 rs12079284 G A 324.95 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=59.55;MQ0=0;OQ=1490.67;QD=17.96;SB=-575.98 GT:AD:DP:GL:GQ 0/1:39,44:83:-177.35,-25.00,-139.24:99
-chr1 4551090 rs164774 A C 75.23 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.47;MQ0=0;OQ=2365.79;QD=33.80;SB=-1092.51 GT:AD:DP:GL:GQ 1/1:0,70:67:-240.18,-20.18,-0.02:99
-chr1 4551865 rs10489134 G C 328.76 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=59.44;MQ0=0;OQ=1198.12;QD=16.19;SB=-348.77 GT:AD:DP:GL:GQ 0/1:36,38:72:-144.81,-21.71,-156.52:99
-chr1 4552887 rs7554766 G A 776.54 Indel AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.13;MQ0=0;QD=12.13;SB=-327.33 GT:AD:DP:GL:GQ 0/1:39,25:57:-98.11,-17.17,-116.23:99
-chr1 4552953 rs7518655 C T 177.07 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=2.86;MQ=58.99;MQ0=0;OQ=677.30;QD=14.72;SB=-320.35 GT:AD:DP:GL:GQ 0/1:23,23:43:-83.97,-12.96,-72.15:99
-chr1 4553124 rs7518781 C A 341.53 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.10;MQ=59.31;MQ0=0;OQ=849.36;QD=13.92;SB=-331.16 GT:AD:DP:GL:GQ 0/1:30,31:56:-105.09,-16.87,-90.31:99
-chr1 4553830 rs164770 A G 0.31 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=3;HaplotypeScore=7.02;MQ=59.30;MQ0=0;OQ=1972.78;QD=32.88;SB=-746.94 GT:AD:DP:GL:GQ 1/1:2,57:55:-200.88,-16.57,-0.02:99
-chr1 4554084 rs61767667 T A 362.66 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=502.84;QD=10.48;SB=-173.16 GT:AD:DP:GL:GQ 0/1:30,18:48:-68.02,-14.46,-113.49:99
-chr1 4554189 rs61767668 G A 492.83 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=958.92;QD=14.31;SB=-387.15 GT:AD:DP:GL:GQ 0/1:38,29:66:-119.06,-19.89,-123.05:99
-chr1 4555833 rs540572 C A 391.14 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=602.48;QD=12.30;SB=-99.63 GT:AD:DP:GL:GQ 0/1:24,25:46:-77.39,-13.85,-83.99:99
-chr1 4556007 rs6426423 C A 388.51 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.29;MQ0=0;OQ=809.24;QD=15.27;SB=-378.16 GT:AD:DP:GL:GQ 0/1:24,29:51:-99.57,-15.36,-78.05:99
-chr1 4556396 rs531363 C T 270.22 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=785.64;QD=14.03;SB=-358.40 GT:AD:DP:GL:GQ 0/1:30,26:54:-98.13,-16.29,-91.52:99
-chr1 4556558 rs129794 G A 506.73 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=510.17;QD=11.09;SB=-262.22 GT:AD:DP:GL:GQ 0/1:29,17:46:-68.16,-13.86,-103.52:99
-chr1 4556721 rs10799248 G A 151.65 PASS AC=1;AF=0.50;AN=2;DB;DP=32;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=483.34;QD=15.10;SB=-178.66 GT:AD:DP:GL:GQ 0/1:17,15:30:-60.66,-9.04,-48.95:99
-chr1 4556909 rs526695 T C 306.82 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=58.98;MQ0=0;OQ=2857.53;QD=34.85;SB=-1208.70 GT:AD:DP:GL:GQ 1/1:0,82:80:-289.36,-24.10,-0.02:99
-chr1 4556982 rs516947 G A 448.32 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=2681.00;QD=38.86;SB=-634.83 GT:AD:DP:GL:GQ 1/1:0,69:67:-271.71,-20.19,-0.02:99
-chr1 4556992 rs516977 A G 448.48 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.27;MQ0=0;OQ=1828.72;QD=29.03;SB=-545.85 GT:AD:DP:GL:GQ 1/1:0,63:60:-186.53,-18.11,-0.07:99
-chr1 4557030 rs517092 A C 349.51 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=1428.85;QD=26.46;SB=-498.86 GT:AD:DP:GL:GQ 1/1:0,54:46:-146.51,-13.87,-0.04:99
-chr1 4557056 rs524982 C T 158.92 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.64;MQ0=0;OQ=2000.95;QD=38.48;SB=-916.28 GT:AD:DP:GL:GQ 1/1:0,52:51:-203.70,-15.37,-0.02:99
-chr1 4557155 rs651695 A T 85.58 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=2.39;MQ=59.42;MQ0=0;OQ=1262.50;QD=15.98;SB=-615.05 GT:AD:DP:GL:GQ 0/1:40,39:78:-153.02,-23.49,-149.00:99
-chr1 4557694 rs653988 C T 110.63 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.82;MQ0=0;OQ=2793.65;QD=39.91;SB=-1109.49 GT:AD:DP:GL:GQ 1/1:0,70:70:-282.97,-21.09,-0.02:99
-chr1 4558171 rs549239 T C 727.04 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.17;MQ0=0;OQ=2944.97;QD=35.06;SB=-1221.82 GT:AD:DP:GL:GQ 1/1:0,84:83:-298.11,-25.00,-0.03:99
-chr1 4558199 rs12726702 T A 2233 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=6;HaplotypeScore=61.64;MQ=53.38;MQ0=0;QD=26.58;SB=-718.98 GT:AD:DP:GL:GQ 0/1:14,70:81:-250.99,-24.40,-50.82:99
-chr1 4558206 rs549087 T A 2870.37 Indel;SnpCluster AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.01;HRun=6;HaplotypeScore=46.58;MQ=52.93;MQ0=0;QD=35.88;SB=-1138.04 GT:AD:DP:GL:GQ 1/1:0,79:79:-290.65,-23.50,-0.03:99
-chr1 4558209 rs28687799 A T 819.27 Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=4;HaplotypeScore=29.81;MQ=52.84;MQ0=0;QD=10.37;SB=-175.59 GT:AD:DP:GL:GQ 0/1:49,30:77:-108.41,-23.20,-171.08:99
-chr1 4558214 rs59930628 A T 84.16 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.03;HRun=4;HaplotypeScore=38.67;MQ=53.63;MQ0=0;QD=1.09;SB=56.66 GT:AD:DP:GL:GQ 0/1:66,9:73:-33.09,-21.39,-235.05:99
-chr1 4558250 rs666799 A C 496.03 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.14;MQ0=0;OQ=2047.56;QD=34.70;SB=-847.08 GT:AD:DP:GL:GQ 1/1:0,59:58:-208.36,-17.47,-0.02:99
-chr1 4558398 rs12567277 C T 337.11 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.53;MQ0=0;OQ=912.06;QD=18.61;SB=-436.84 GT:AD:DP:GL:GQ 0/1:22,27:48:-108.95,-14.46,-68.62:99
-chr1 4558676 rs553691 C T 200.13 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.21;MQ0=0;OQ=1974.68;QD=37.26;SB=-1009.66 GT:AD:DP:GL:GQ 1/1:0,53:52:-201.08,-15.67,-0.02:99
-chr1 4560412 rs589176 A G 118.19 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=58.87;MQ0=0;OQ=545.72;QD=13.31;SB=-145.53 GT:AD:DP:GL:GQ 0/1:20,21:40:-69.91,-12.06,-74.33:99
-chr1 4561004 rs602244 T C 195.92 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=59.64;MQ0=0;OQ=1077.64;QD=16.84;SB=-452.16 GT:AD:DP:GL:GQ 0/1:26,38:63:-130.03,-18.98,-104.11:99
-chr1 4561499 rs604465 G A 250.02 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=59.13;MQ0=0;OQ=735.55;QD=15.32;SB=-280.30 GT:AD:DP:GL:GQ 0/1:25,23:45:-90.40,-13.56,-80.37:99
-chr1 4561737 rs563481 C T 22.90 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=3;HaplotypeScore=0.93;MQ=60.00;MQ0=0;OQ=747.56;QD=17.80;SB=-287.30 GT:AD:DP:GL:GQ 0/1:20,22:42:-90.69,-12.65,-73.13:99
-chr1 4562268 rs537761 C A 317.78 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=820.87;QD=16.75;SB=-394.13 GT:AD:DP:GL:GQ 0/1:21,28:48:-99.83,-14.46,-74.67:99
-chr1 4562392 rs618751 G A 349.01 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=60.00;MQ0=0;OQ=1032.44;QD=14.14;SB=-366.34 GT:AD:DP:GL:GQ 0/1:41,32:73:-128.52,-21.99,-148.49:99
-chr1 4562641 rs534159 C T 355.83 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=808.69;QD=13.71;SB=-376.39 GT:AD:DP:GL:GQ 0/1:33,26:58:-101.65,-17.50,-100.37:99
-chr1 4565129 rs241243 A G 370.62 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=694.01;QD=8.07;SB=-138.39 GT:AD:DP:GL:GQ 0/1:53,33:82:-97.39,-24.71,-212.58:99
-chr1 4565904 rs10915569 C A 242.27 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.39;MQ0=0;OQ=1490.43;QD=19.61;SB=-754.94 GT:AD:DP:GL:GQ 0/1:27,49:74:-174.61,-22.29,-94.95:99
-chr1 4566354 rs164780 C G 240.11 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=59.64;MQ0=0;OQ=2456.30;QD=38.38;SB=-1204.26 GT:AD:DP:GL:GQ 1/1:0,64:63:-249.27,-19.01,-0.05:99
-chr1 4566679 rs151716 A G 365.52 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=59.43;MQ0=0;OQ=771.72;QD=11.87;SB=-373.98 GT:AD:DP:GL:GQ 0/1:33,32:64:-99.75,-19.29,-131.65:99
-chr1 4567238 rs4654450 G A 244.97 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=59.42;MQ0=0;OQ=1219.09;QD=16.93;SB=-598.62 GT:AD:DP:GL:GQ 0/1:35,37:71:-146.59,-21.39,-121.89:99
-chr1 4567954 rs151715 A G 136 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.44;MQ0=0;OQ=821.52;QD=10.95;SB=-417.84 GT:AD:DP:GL:GQ 0/1:41,34:74:-107.74,-22.30,-168.10:99
-chr1 4568017 rs241242 G T 115.78 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.56;MQ=60.00;MQ0=0;OQ=1682.11;QD=33.64;SB=-638.02 GT:AD:DP:GL:GQ 1/1:0,49:48:-171.82,-14.46,-0.02:99
-chr1 4568283 rs11590266 A G 358.35 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=59.56;MQ0=0;OQ=565.36;QD=10.87;SB=-241.59 GT:AD:DP:GL:GQ 0/1:27,24:51:-77.60,-17.78,-112.88:99
-chr1 4571271 rs164779 C G 314.41 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.44;MQ0=0;OQ=1283.51;QD=17.11;SB=-664.28 GT:AD:DP:GL:GQ 0/1:38,37:72:-153.33,-21.69,-161.13:99
-chr1 4571572 . C T 90.66 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.84;MQ=59.56;MQ0=0;OQ=626.01;QD=12.04;SB=-331.33 GT:AD:DP:GL:GQ 0/1:32,20:47:-80.06,-14.17,-86.19:99
-chr1 4572354 rs164778 T C 225.65 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1559.84;QD=35.45;SB=-660.32 GT:AD:DP:GL:GQ 1/1:0,44:44:-159.58,-13.25,-0.01:99
-chr1 4572615 rs6703429 T C 577.31 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=862.43;QD=13.07;SB=-402.26 GT:AD:DP:GL:GQ 0/1:35,31:65:-109.11,-19.58,-142.67:99
-chr1 4574299 . C A 554.66 Indel AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.59;MQ0=0;QD=10.47;SB=-260.28 GT:AD:DP:GL:GQ 0/1:31,22:48:-73.21,-14.46,-96.27:99
-chr1 4576029 rs164776 C T 259.84 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.56;MQ0=0;OQ=893.05;QD=17.17;SB=-421.82 GT:AD:DP:GL:GQ 0/1:24,28:50:-107.66,-15.07,-72.44:99
-chr1 4576797 rs2411886 G C 186.46 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=59.03;MQ0=0;OQ=1978.62;QD=41.22;SB=-1006.27 GT:AD:DP:GL:GQ 1/1:0,47:46:-201.46,-13.86,-0.01:99
-chr1 4576947 rs2411887 C T 275.87 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=58.35;MQ0=0;OQ=1931.75;QD=37.88;SB=-945.28 GT:AD:DP:GL:GQ 1/1:0,51:50:-196.78,-15.07,-0.02:99
-chr1 4577395 rs4403602 C G 245.41 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.46;MQ0=0;OQ=1536.03;QD=35.72;SB=-775.22 GT:AD:DP:GL:GQ 1/1:0,43:41:-157.23,-12.38,-0.05:99
-chr1 4577589 rs7554628 T C 1.90 PASS AC=2;AF=1.00;AN=2;DB;DP=32;Dels=0.00;HRun=1;HaplotypeScore=1.47;MQ=57.95;MQ0=0;OQ=730.12;QD=22.82;SB=-185.76 GT:AD:DP:GL:GQ 1/1:0,31:25:-79.87,-10.17,-3.27:69.05
-chr1 4577983 rs7555011 T C 161.26 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.31;MQ=59.09;MQ0=0;OQ=1457.56;QD=28.58;SB=-435.18 GT:AD:DP:GL:GQ 1/1:0,51:47:-149.39,-14.18,-0.05:99
-chr1 4578231 rs35259920 T A 832.15 Indel AC=2;AF=1.00;AN=2;DB;DP=29;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;QD=28.69;SB=-10.00 GT:AD:DP:GL:GQ 1/1:1,28:26:-86.82,-7.84,-0.02:78.19
-chr1 4578361 rs7554792 A C 303.82 PASS AC=2;AF=1.00;AN=2;DB;DP=9;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.92;MQ0=0;OQ=236.46;QD=26.27;SB=-138.00 GT:AD:DP:GL:GQ 1/1:0,9:8:-27.23,-2.41,-0.00:24.06
-chr1 4578400 . A T 84.19 Indel AC=1;AF=0.50;AN=2;DP=14;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=46.65;MQ0=0;QD=6.01;SB=-42.96 GT:AD:DP:GL:GQ 0/1:10,4:13:-15.62,-3.92,-34.97:99
-chr1 4579811 rs1905304 C A 19.42 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=5;HaplotypeScore=0.00;MQ=58.10;MQ0=0;OQ=2321.72;QD=36.28;SB=-1110.43 GT:AD:DP:GL:GQ 1/1:0,64:63:-235.77,-18.97,-0.01:99
-chr1 4580559 rs56945522 G A 92.56 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=61.48;MQ0=0;OQ=2293.20;QD=38.87;SB=-907.71 GT:AD:DP:GL:GQ 1/1:0,59:58:-232.92,-17.48,-0.02:99
-chr1 4581964 rs6668002 T C 241.68 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=2274.26;QD=30.73;SB=-1092.12 GT:AD:DP:GL:GQ 1/1:0,73:71:-231.07,-21.41,-0.06:99
-chr1 4583570 rs1573748 A G 1957.91 Indel AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.66;MQ=60.10;MQ0=0;QD=31.08;SB=-816.28 GT:AD:DP:GL:GQ 1/1:0,63:58:-199.41,-17.48,-0.04:99
-chr1 4584109 rs6657421 G A 130.49 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.13;MQ0=0;OQ=1834.09;QD=38.21;SB=-703.35 GT:AD:DP:GL:GQ 1/1:0,48:47:-187.01,-14.16,-0.01:99
-chr1 4584165 rs6674936 T C 66.31 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.13;MQ=59.25;MQ0=0;OQ=1819.57;QD=32.49;SB=-925.04 GT:AD:DP:GL:GQ 1/1:0,56:51:-185.56,-15.36,-0.01:99
-chr1 4585082 rs1107467 G A 137.40 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=60.00;MQ0=0;OQ=1423.05;QD=35.58;SB=-452.60 GT:AD:DP:GL:GQ 1/1:0,39:38:-145.91,-11.45,-0.02:99
-chr1 4585332 rs1483199 A G 386.56 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2234.69;QD=31.04;SB=-675.88 GT:AD:DP:GL:GQ 1/1:0,72:67:-227.10,-20.19,-0.04:99
-chr1 4585508 rs875808 G A 162.26 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.39;MQ=60.00;MQ0=0;OQ=2216.84;QD=38.89;SB=-1106.64 GT:AD:DP:GL:GQ 1/1:0,57:57:-225.29,-17.17,-0.02:99
-chr1 4585532 rs875807 A G 300.51 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.66;MQ0=0;OQ=1870.43;QD=34.01;SB=-960.39 GT:AD:DP:GL:GQ 1/1:0,55:53:-190.65,-15.97,-0.02:99
-chr1 4585731 rs875806 G C 165.71 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2133.21;QD=42.66;SB=-847.32 GT:AD:DP:GL:GQ 1/1:0,50:49:-216.92,-14.76,-0.01:99
-chr1 4586501 rs56028718 G A 84.95 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=3.12;MQ=59.59;MQ0=0;OQ=1260.05;QD=18.53;SB=-634.67 GT:AD:DP:GL:GQ 0/1:31,37:66:-149.17,-19.88,-106.57:99
-chr1 4587142 rs2269620 C T 114.33 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.59;MQ0=0;OQ=2196.52;QD=39.22;SB=-630.34 GT:AD:DP:GL:GQ 1/1:0,56:56:-223.26,-16.87,-0.02:99
-chr1 4587674 rs4654576 A C 214.87 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=886.13;QD=32.82;SB=-420.04 GT:AD:DP:GL:GQ 1/1:0,27:26:-92.21,-7.83,-0.01:78.22
-chr1 4587807 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=2;HaplotypeScore=15.00;MQ=58.93;MQ0=0;OQ=113.78;QD=1.87;SB=74.25 GT:AD:DP:GL:GQ 0/1:34,27:42:-27.32,-12.66,-112.79:99
-chr1 4587893 rs6662425 C G 115.34 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.27;MQ=59.36;MQ0=0;OQ=2651.42;QD=40.79;SB=-1007.19 GT:AD:DP:GL:GQ 1/1:0,65:61:-268.75,-18.38,-0.02:99
-chr1 4588021 rs6426430 G T 639.03 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1436.10;QD=35.90;SB=-672.10 GT:AD:DP:GL:GQ 1/1:0,40:40:-147.21,-12.05,-0.01:99
-chr1 4590753 rs7527078 C T 465.85 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.20;MQ0=0;OQ=2043.97;QD=40.08;SB=-576.76 GT:AD:DP:GL:GQ 1/1:0,51:50:-207.99,-15.06,-0.01:99
-chr1 4591042 rs4654577 A G 251.52 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=58.37;MQ0=0;OQ=1466.76;QD=34.11;SB=-679.59 GT:AD:DP:GL:GQ 1/1:0,43:43:-150.28,-12.96,-0.02:99
-chr1 4592515 . G C 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.74;MQ=48.08;MQ0=6;OQ=54.55;QD=1.03;SB=38.38 GT:AD:DP:GL:GQ 0/1:45,8:39:-20.50,-11.76,-139.98:87.39
-chr1 4592571 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=14.42;MQ=41.26;MQ0=11;OQ=65.05;QD=1.07;SB=-23.62 GT:AD:DP:GL:GQ 0/1:49,12:36:-20.65,-10.86,-123.87:97.89
-chr1 4592585 . G C 20.06 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.14;MQ=40.25;MQ0=10;QD=0.33;SB=-5.33 GT:AD:DP:GL:GQ 0/1:54,7:37:-16.45,-11.17,-134.84:52.86
-chr1 4592620 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=1;HaplotypeScore=15.36;MQ=35.46;MQ0=10;OQ=92.00;QD=1.46;SB=0.26 GT:AD:DP:GL:GQ 0/1:54,9:42:-25.15,-12.66,-150.31:99
-chr1 4592627 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=16.06;MQ=35.72;MQ0=7;OQ=153.87;QD=2.75;SB=-54.16 GT:AD:DP:GL:GQ 0/1:46,10:37:-29.82,-11.15,-128.78:99
-chr1 4592634 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=17.36;MQ=35.58;MQ0=7;OQ=255.85;QD=4.57;SB=-124.48 GT:AD:DP:GL:GQ 0/1:41,15:33:-38.82,-9.95,-100.95:99
-chr1 4592642 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=1;HaplotypeScore=28.60;MQ=35.10;MQ0=5;OQ=106.45;QD=2.01;SB=3.57 GT:AD:DP:GL:GQ 0/1:41,12:38:-25.38,-11.45,-106.45:99
-chr1 4592649 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=27.47;MQ=35.61;MQ0=5;OQ=241.86;QD=4.65;SB=-127.53 GT:AD:DP:GL:GQ 0/1:36,16:37:-38.62,-11.15,-91.45:99
-chr1 4592656 . C A 10.05 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=32.68;MQ=34.61;MQ0=6;QD=0.18;SB=-22.79 GT:AD:DP:GL:GQ 0/1:46,10:31:-13.58,-9.34,-92.74:42.43
-chr1 4592670 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=26.44;MQ=31.55;MQ0=8;OQ=92.67;QD=1.54;SB=-36.78 GT:AD:DP:GL:GQ 0/1:47,13:38:-24.00,-11.45,-105.70:99
-chr1 4592691 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=0;HaplotypeScore=17.99;MQ=28.93;MQ0=15;OQ=182.04;QD=2.64;SB=-62.36 GT:AD:DP:GL:GQ 0/1:58,11:38:-32.95,-11.46,-95.16:99
-chr1 4592711 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=51;Dels=0.00;HRun=1;HaplotypeScore=17.40;MQ=30.26;MQ0=13;OQ=418.56;QD=8.21;SB=-184.24 GT:AD:DP:GL:GQ 0/1:21,29:22:-51.78,-6.64,-35.47:99
-chr1 4592725 rs7533445 C G 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=21.58;MQ=31.66;MQ0=7;OQ=325.36;QD=9.30;SB=-162.82 GT:AD:DP:GL:GQ 0/1:18,17:13:-39.75,-3.93,-11.50:75.69
-chr1 4592733 . C A 17.31 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=31;Dels=0.00;HRun=0;HaplotypeScore=13.87;MQ=30.28;MQ0=8;QD=0.56;SB=5.02 GT:AD:DP:GL:GQ 0/1:27,3:12:-8.63,-3.62,-27.94:50.06
-chr1 4592740 rs7537972 A C 0.16 PASS AC=1;AF=0.50;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=10.05;MQ=27.67;MQ0=11;OQ=104.80;QD=3.38;SB=-67.99 GT:AD:DP:GL:GQ 0/1:22,9:8:-16.18,-2.41,-9.32:69.09
-chr1 4592747 rs7537975 A C 18.33 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DB;DP=24;Dels=0.00;HRun=1;HaplotypeScore=8.21;MQ=28.35;MQ0=11;QD=0.76;SB=-7.00 GT:AD:DP:GL:GQ 0/1:17,7:4:-6.32,-1.21,-6.24:50.29
-chr1 4592767 rs7533530 C G 42.27 HARD_TO_VALIDATE;LowQual AC=2;AF=1.00;AN=2;DB;DP=14;Dels=0.00;HRun=1;HaplotypeScore=11.04;MQ=30.06;MQ0=7;QD=3.02;SB=-43.89 GT:AD:DP:GL:GQ 1/1:8,5:2:-7.64,-0.61,-0.00:6.02
-chr1 4592837 . C G 13.29 LowQual AC=1;AF=0.50;AN=2;DP=5;Dels=0.00;HRun=1;HaplotypeScore=4.96;MQ=12.04;MQ0=3;QD=2.66;SB=-10.00 GT:AD:DP:GL:GQ 0/1:4,1:1:-4.59,-0.30,-0.00:1.76
-chr1 4592901 . T C 5.07 PASS AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=42.32;MQ0=2;OQ=126.93;QD=6.35;SB=-77.93 GT:AD:DP:GL:GQ 0/1:9,11:15:-20.50,-4.52,-36.40:99
-chr1 4592906 . T C 0.11 PASS AC=2;AF=1.00;AN=2;DP=23;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=41.84;MQ0=3;OQ=578.85;QD=25.17;SB=-157.83 GT:AD:DP:GL:GQ 1/1:0,23:17:-61.47,-5.12,-0.00:51.15
-chr1 4592960 . G C 0.12 PASS AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.10;MQ=41.92;MQ0=6;OQ=217.66;QD=2.79;SB=-81.57 GT:AD:DP:GL:GQ 0/1:56,22:47:-39.23,-14.18,-153.65:99
-chr1 4592971 . T C 18.17 PASS AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=3.38;MQ=41.63;MQ0=7;OQ=666.60;QD=8.55;SB=-228.49 GT:AD:DP:GL:GQ 0/1:28,48:45:-83.52,-13.57,-69.37:99
-chr1 4592996 . A C 48.48 HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=4.82;MQ=40.87;MQ0=9;QD=0.70;SB=-26.49 GT:AD:DP:GL:GQ 0/1:54,15:47:-22.29,-14.16,-139.10:81.32
-chr1 4593024 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=14.22;MQ=41.13;MQ0=10;OQ=73.34;QD=1.41;SB=-39.79 GT:AD:DP:GL:GQ 0/1:35,17:30:-19.66,-9.04,-83.95:99
-chr1 4593037 . G C 11.64 DPFilter;HARD_TO_VALIDATE;LowQual AC=1;AF=0.50;AN=2;DP=41;Dels=0.02;HRun=0;HaplotypeScore=21.01;MQ=42.10;MQ0=8;QD=0.28;SB=26.12 GT:AD:DP:GL:GQ 0/1:33,7:20:-10.45,-6.03,-72.33:44.16
-chr1 4593066 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=43;Dels=0.00;HRun=0;HaplotypeScore=16.64;MQ=38.83;MQ0=9;OQ=95.97;QD=2.23;SB=-64.04 GT:AD:DP:GL:GQ 0/1:31,12:22:-19.51,-6.63,-53.44:99
-chr1 4593072 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=12.35;MQ=36.60;MQ0=11;OQ=58.68;QD=1.25;SB=-50.80 GT:AD:DP:GL:GQ 0/1:40,7:24:-16.40,-7.25,-78.79:91.52
-chr1 4593128 . G C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=47;Dels=0.00;HRun=0;HaplotypeScore=7.00;MQ=42.60;MQ0=10;OQ=87.22;QD=1.86;SB=11.06 GT:AD:DP:GL:GQ 0/1:39,8:24:-19.25,-7.24,-80.14:99
-chr1 4593184 . G C 48.23 LowQual AC=1;AF=0.50;AN=2;DP=32;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=50.03;MQ0=1;QD=1.51;SB=-24.84 GT:AD:DP:GL:GQ 0/1:27,5:22:-14.75,-6.64,-72.91:81.07
-chr1 4593205 . G C 35.18 LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.11;MQ=47.39;MQ0=4;QD=0.88;SB=-15.82 GT:AD:DP:GL:GQ 0/1:35,5:30:-15.86,-9.06,-106.35:68.02
-chr1 4593241 rs12752874 A C 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=2.83;MQ=43.47;MQ0=5;OQ=55.07;QD=1.28;SB=-27.98 GT:AD:DP:GL:GQ 0/1:30,13:26:-16.62,-7.83,-74.90:87.90
-chr1 4594330 rs34642555 G A 223.53 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.30;MQ=59.56;MQ0=0;OQ=741.34;QD=13.99;SB=-378.39 GT:AD:DP:GL:GQ 0/1:29,24:52:-93.10,-15.68,-88.17:99
-chr1 4599106 rs10753383 T G 347.62 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.01;MQ0=0;OQ=412.58;QD=12.50;SB=-151.92 GT:AD:DP:GL:GQ 0/1:17,16:32:-54.18,-9.64,-62.40:99
-chr1 4599463 rs7513957 G C 46.62 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=2;HaplotypeScore=1.18;MQ=57.56;MQ0=0;OQ=399.60;QD=12.11;SB=-196.33 GT:AD:DP:GL:GQ 0/1:20,13:31:-52.60,-9.35,-73.06:99
-chr1 4600658 rs12122002 G A 36.86 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=2.74;MQ=58.47;MQ0=0;OQ=1298.26;QD=21.28;SB=-656.75 GT:AD:DP:GL:GQ 0/1:24,37:59:-150.88,-17.77,-80.26:99
-chr1 4601609 rs55711858 A G 373.59 PASS AC=1;AF=0.50;AN=2;DB;DP=100;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.77;MQ0=0;OQ=1068.23;QD=10.68;SB=-465.77 GT:AD:DP:GL:GQ 0/1:56,44:100:-140.25,-30.14,-225.51:99
-chr1 4601750 rs2411891 G A 156.02 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1085.67;QD=16.96;SB=-561.13 GT:AD:DP:GL:GQ 0/1:31,33:63:-130.83,-18.98,-106.71:99
-chr1 4602156 rs61764994 A G 74.11 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=60.00;MQ0=0;OQ=509.21;QD=7.60;SB=-244.13 GT:AD:DP:GL:GQ 0/1:40,27:63:-73.19,-18.99,-161.05:99
-chr1 4602810 rs61764995 C T 382.37 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=850.22;QD=17.35;SB=-339.44 GT:AD:DP:GL:GQ 0/1:22,27:48:-102.77,-14.46,-79.78:99
-chr1 4602966 rs34993795 C T 235.21 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.72;MQ=59.03;MQ0=0;OQ=1118.32;QD=16.69;SB=-465.43 GT:AD:DP:GL:GQ 0/1:34,33:66:-135.00,-19.88,-119.08:99
-chr1 4604462 rs2035452 C G 271.67 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=397.56;QD=15.29;SB=-96.30 GT:AD:DP:GL:GQ 0/1:14,12:25:-50.58,-7.54,-52.60:99
-chr1 4606381 rs10915576 T C 220.72 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=882.56;QD=16.97;SB=-410.32 GT:AD:DP:GL:GQ 0/1:21,31:51:-106.90,-15.36,-86.72:99
-chr1 4606615 rs12125737 C T 418.26 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.71;MQ0=0;OQ=1209.07;QD=18.60;SB=-598.14 GT:AD:DP:GL:GQ 0/1:29,36:62:-142.87,-18.68,-88.99:99
-chr1 4607135 rs12122921 G A 2.76 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=10.90;MQ=57.40;MQ0=0;OQ=881.42;QD=13.16;SB=-408.91 GT:AD:DP:GL:GQ 0/1:36,31:56:-108.31,-16.88,-93.30:99
-chr1 4607451 rs28759408 G T 57.59 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=5.28;MQ=57.88;MQ0=1;OQ=710.71;QD=10.45;SB=-279.36 GT:AD:DP:GL:GQ 0/1:39,29:61:-92.73,-18.38,-123.60:99
-chr1 4608914 rs7535194 C A 224.06 PASS AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=57.78;MQ0=0;OQ=1544.72;QD=16.26;SB=-662.45 GT:AD:DP:GL:GQ 0/1:44,51:95:-186.37,-28.61,-160.23:99
-chr1 4609123 . C T 10.31 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=56.96;MQ0=2;QD=0.17;SB=19.65 GT:AD:DP:GL:GQ 0/1:53,6:55:-20.84,-16.57,-182.90:42.72
-chr1 4609208 rs7539862 A C 150.58 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=258.18;QD=5.87;SB=-149.80 GT:AD:DP:GL:GQ 0/1:32,12:43:-42.05,-12.95,-117.22:99
-chr1 4609234 . G A 18.35 LowQual AC=1;AF=0.50;AN=2;DP=40;Dels=0.00;HRun=0;HaplotypeScore=3.99;MQ=56.87;MQ0=1;QD=0.46;SB=-22.94 GT:AD:DP:GL:GQ 0/1:35,5:36:-15.96,-10.84,-114.15:51.13
-chr1 4609248 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=1;HaplotypeScore=35.67;MQ=56.49;MQ0=1;OQ=135.28;QD=2.42;SB=50.20 GT:AD:DP:GL:GQ 0/1:46,10:51:-32.18,-15.36,-170.39:99
-chr1 4609249 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=97.70;MQ=56.55;MQ0=1;OQ=82.36;QD=1.44;SB=50.16 GT:AD:DP:GL:GQ 0/1:47,10:52:-27.18,-15.66,-163.18:99
-chr1 4609260 rs61764999 C T 6.41 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=5.81;MQ=56.56;MQ0=1;OQ=641.66;QD=10.03;SB=-130.56 GT:AD:DP:GL:GQ 0/1:42,22:63:-86.43,-18.98,-148.93:99
-chr1 4609527 rs4654581 C G 33.46 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.03;MQ=59.43;MQ0=0;QD=0.67;SB=28.36 GT:AD:DP:GL:GQ 0/1:45,5:49:-21.39,-14.76,-192.44:66.29
-chr1 4610341 rs10799250 T C 191.96 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.62;MQ0=0;OQ=886.46;QD=10.43;SB=-400.18 GT:AD:DP:GL:GQ 0/1:51,34:83:-116.93,-25.00,-199.77:99
-chr1 4610346 rs10915577 A G 286.28 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.62;MQ0=0;OQ=927.42;QD=11.04;SB=-372.61 GT:AD:DP:GL:GQ 0/1:50,34:82:-120.73,-24.70,-201.64:99
-chr1 4611161 rs12405862 C T 55.82 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.70;MQ=59.65;MQ0=0;OQ=705.61;QD=13.31;SB=-372.08 GT:AD:DP:GL:GQ 0/1:30,23:53:-89.81,-15.97,-107.55:99
-chr1 4612905 rs1466520 A G 508.10 PASS AC=2;AF=1.00;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.49;MQ0=0;OQ=1092.36;QD=32.13;SB=-567.90 GT:AD:DP:GL:GQ 1/1:0,34:32:-112.83,-9.64,-0.01:96.28
-chr1 4613357 rs4144451 T C 2.82 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=4;HaplotypeScore=1.16;MQ=60.00;MQ0=0;OQ=378.96;QD=8.81;SB=-197.21 GT:AD:DP:GL:GQ 0/1:27,16:40:-53.24,-12.06,-95.58:99
-chr1 4616788 rs12127797 G C 214.89 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.57;MQ=59.39;MQ0=0;OQ=1251.84;QD=16.47;SB=-458.74 GT:AD:DP:GL:GQ 0/1:41,34:72:-150.17,-21.70,-159.82:99
-chr1 4619890 rs7544371 G A 283.12 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.45;MQ0=0;OQ=1234.26;QD=22.04;SB=-596.70 GT:AD:DP:GL:GQ 0/1:21,35:56:-143.59,-16.88,-63.94:99
-chr1 4621067 rs6426432 G C 375.69 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.65;MQ=60.00;MQ0=0;OQ=975.42;QD=15.73;SB=-398.88 GT:AD:DP:GL:GQ 0/1:35,27:62:-119.51,-18.68,-150.23:99
-chr1 4621285 rs6658403 C T 186.42 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.63;MQ0=0;OQ=651.01;QD=10.50;SB=-348.83 GT:AD:DP:GL:GQ 0/1:39,23:60:-86.46,-18.07,-139.05:99
-chr1 4622291 rs2035454 A G 361.79 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.59;MQ=59.15;MQ0=0;OQ=932.32;QD=13.13;SB=-403.21 GT:AD:DP:GL:GQ 0/1:39,32:70:-117.60,-21.09,-152.00:99
-chr1 4622303 rs1531830 T C 306.21 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.12;MQ0=0;OQ=753.21;QD=10.92;SB=-275.11 GT:AD:DP:GL:GQ 0/1:39,30:68:-99.09,-20.49,-155.18:99
-chr1 4623109 rs10799251 G A 463.40 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=863.86;QD=15.43;SB=-362.38 GT:AD:DP:GL:GQ 0/1:30,26:56:-106.54,-16.87,-110.57:99
-chr1 4623282 rs10799252 G C 114.19 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=53.79;MQ0=0;OQ=899.36;QD=20.92;SB=-445.94 GT:AD:DP:GL:GQ 0/1:17,26:42:-105.88,-12.66,-71.37:99
-chr1 4623298 rs10799253 T C 313.76 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=52.77;MQ0=0;OQ=616.14;QD=14.00;SB=-298.33 GT:AD:DP:GL:GQ 0/1:18,26:39:-76.66,-11.76,-55.81:99
-chr1 4623777 rs10915578 A G 84.84 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=0.82;MQ=58.86;MQ0=0;OQ=552.36;QD=9.69;SB=-296.32 GT:AD:DP:GL:GQ 0/1:35,22:57:-75.70,-17.18,-138.68:99
-chr1 4623873 rs10915579 T C 271.16 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=57.84;MQ0=0;OQ=661.07;QD=10.17;SB=-259.38 GT:AD:DP:GL:GQ 0/1:40,25:64:-88.68,-19.29,-154.96:99
-chr1 4624091 rs12135245 G C 41.47 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=1.89;MQ=59.70;MQ0=0;OQ=1186.96;QD=19.14;SB=-476.78 GT:AD:DP:GL:GQ 0/1:28,34:59:-139.77,-17.79,-108.63:99
-chr1 4624130 rs12140542 T C 140.19 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=2.13;MQ=59.74;MQ0=0;OQ=656.89;QD=9.12;SB=-348.92 GT:AD:DP:GL:GQ 0/1:43,29:71:-90.37,-21.40,-172.64:99
-chr1 4624492 rs2035455 C T 468.68 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=702.27;QD=12.54;SB=-335.31 GT:AD:DP:GL:GQ 0/1:34,22:55:-90.09,-16.58,-106.86:99
-chr1 4624817 rs17421247 C T 331.36 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.99;MQ=59.65;MQ0=0;OQ=1014.16;QD=15.37;SB=-402.77 GT:AD:DP:GL:GQ 0/1:35,31:64:-123.99,-19.29,-104.67:99
-chr1 4626224 rs10915580 G C 281.25 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.07;MQ0=0;OQ=1106.61;QD=18.14;SB=-348.42 GT:AD:DP:GL:GQ 0/1:31,30:61:-132.34,-18.40,-124.48:99
-chr1 4626314 rs12567266 T C 443.89 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.48;MQ0=0;OQ=855.53;QD=18.20;SB=-345.35 GT:AD:DP:GL:GQ 0/1:19,28:47:-102.99,-14.16,-75.71:99
-chr1 4626341 rs12752003 A G 152.30 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=47.43;MQ0=0;OQ=459.90;QD=12.10;SB=-75.78 GT:AD:DP:GL:GQ 0/1:17,21:35:-59.82,-10.55,-67.90:99
-chr1 4626392 rs12565906 G A 175.56 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=1.36;MQ=51.30;MQ0=0;OQ=647.78;QD=15.42;SB=-283.17 GT:AD:DP:GL:GQ 0/1:21,21:41:-80.41,-12.35,-73.25:99
-chr1 4626545 rs12137938 T C 1.78 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=2;HaplotypeScore=6.74;MQ=54.18;MQ0=1;OQ=220.73;QD=6.49;SB=-111.61 GT:AD:DP:GL:GQ 0/1:20,14:29:-34.11,-8.75,-66.24:99
-chr1 4626759 rs10799254 A G 12.84 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=1;HaplotypeScore=7.18;MQ=56.44;MQ0=0;OQ=516.47;QD=13.59;SB=-271.00 GT:AD:DP:GL:GQ 0/1:15,23:33:-64.88,-9.95,-53.03:99
-chr1 4626886 rs12137092 A G 70.84 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=50.68;MQ0=3;OQ=425.89;QD=8.19;SB=-166.49 GT:AD:DP:GL:GQ 0/1:30,22:47:-60.04,-14.17,-111.36:99
-chr1 4627103 rs6663166 A G 61.80 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.88;MQ0=0;OQ=507.83;QD=9.40;SB=-149.43 GT:AD:DP:GL:GQ 0/1:33,21:53:-70.04,-15.97,-130.76:99
-chr1 4627150 rs12138132 T C 261.25 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.66;MQ0=0;OQ=429.65;QD=7.81;SB=-213.21 GT:AD:DP:GL:GQ 0/1:37,18:55:-62.82,-16.57,-149.18:99
-chr1 4627390 rs12133670 G A 454.29 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.64;MQ0=0;OQ=810.38;QD=15.58;SB=-415.38 GT:AD:DP:GL:GQ 0/1:28,24:51:-99.69,-15.36,-91.80:99
-chr1 4628089 rs12133909 G T 196.70 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=59.88;MQ0=0;OQ=673.35;QD=10.52;SB=-318.02 GT:AD:DP:GL:GQ 0/1:40,24:62:-89.30,-18.68,-116.17:99
-chr1 4628258 rs6703379 G A 0.30 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=13.50;MQ=55.99;MQ0=1;OQ=611.30;QD=11.32;SB=-213.68 GT:AD:DP:GL:GQ 0/1:33,21:47:-78.59,-14.17,-86.02:99
-chr1 4628265 rs6672122 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.04;HRun=0;HaplotypeScore=25.47;MQ=56.13;MQ0=1;OQ=602.93;QD=10.77;SB=-162.48 GT:AD:DP:GL:GQ 0/1:29,25:52:-78.65,-15.07,-102.50:99
-chr1 4628677 rs6703802 G A 334.66 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=937.15;QD=18.02;SB=-393.92 GT:AD:DP:GL:GQ 0/1:24,28:51:-112.37,-15.37,-73.40:99
-chr1 4630143 rs4654582 T A 2.35 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=10.18;MQ=58.22;MQ0=0;OQ=526.78;QD=10.54;SB=-97.11 GT:AD:DP:GL:GQ 0/1:25,22:38:-67.41,-11.45,-72.86:99
-chr1 4630312 rs4654583 T C 361.82 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1108.52;QD=16.07;SB=-319.34 GT:AD:DP:GL:GQ 0/1:31,38:68:-134.62,-20.48,-127.03:99
-chr1 4630977 rs12141394 A G 593.81 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.47;MQ0=0;OQ=900.99;QD=13.45;SB=-440.92 GT:AD:DP:GL:GQ 0/1:31,36:65:-112.97,-19.59,-120.61:99
-chr1 4631016 rs12139858 C T 367.23 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=891.25;QD=15.37;SB=-441.97 GT:AD:DP:GL:GQ 0/1:31,27:57:-109.59,-17.18,-94.97:99
-chr1 4631110 rs12141432 A G 226.87 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=58.67;MQ0=0;OQ=787.70;QD=12.50;SB=-349.34 GT:AD:DP:GL:GQ 0/1:35,28:62:-100.73,-18.67,-138.62:99
-chr1 4631448 rs4144452 A G 502.74 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=648.74;QD=10.64;SB=-332.00 GT:AD:DP:GL:GQ 0/1:33,28:59:-85.94,-17.78,-131.20:99
-chr1 4631992 rs12138000 G A 396.61 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=1014.12;QD=15.85;SB=-413.79 GT:AD:DP:GL:GQ 0/1:32,32:63:-123.69,-18.99,-104.09:99
-chr1 4632333 rs1564667 A G 289.52 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.70;MQ0=0;OQ=656.79;QD=8.64;SB=-323.90 GT:AD:DP:GL:GQ 0/1:44,32:72:-90.67,-21.71,-171.92:99
-chr1 4633099 rs4654585 T C 336.77 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=1.88;MQ=59.60;MQ0=0;OQ=968.60;QD=16.70;SB=-498.14 GT:AD:DP:GL:GQ 0/1:26,32:58:-117.61,-17.47,-104.79:99
-chr1 4633208 rs4654586 T A 613.80 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2145.98;QD=37.00;SB=-956.61 GT:AD:DP:GL:GQ 1/1:0,58:58:-218.20,-17.47,-0.01:99
-chr1 4633215 rs4654455 T C 484.54 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1991.47;QD=34.94;SB=-790.66 GT:AD:DP:GL:GQ 1/1:0,57:56:-202.75,-16.87,-0.02:99
-chr1 4636316 rs10915584 G T 377.31 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.90;MQ=59.34;MQ0=0;OQ=844.77;QD=13.41;SB=-404.78 GT:AD:DP:GL:GQ 0/1:32,31:58:-105.23,-17.47,-102.72:99
-chr1 4637265 . T C 225.79 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=776.05;QD=14.64;SB=-255.94 GT:AD:DP:GL:GQ 0/1:26,27:53:-96.86,-15.97,-103.32:99
-chr1 4638345 . G A 67.79 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.29;MQ0=0;OQ=991.16;QD=18.70;SB=-412.80 GT:AD:DP:GL:GQ 0/1:24,29:51:-117.77,-15.37,-70.20:99
-chr1 4642883 rs2859392 C G 348.55 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.26;MQ=59.71;MQ0=0;OQ=833.93;QD=12.83;SB=-304.28 GT:AD:DP:GL:GQ 0/1:37,28:61:-105.07,-18.39,-160.99:99
-chr1 4643564 rs763238 C T 66.20 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.77;MQ0=0;OQ=1042.05;QD=19.66;SB=-208.90 GT:AD:DP:GL:GQ 0/1:21,32:50:-122.56,-15.07,-63.38:99
-chr1 4644154 rs4993529 C T 334.67 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=60.00;MQ0=0;OQ=1314.27;QD=19.62;SB=-670.69 GT:AD:DP:GL:GQ 0/1:27,40:65:-154.30,-19.59,-85.13:99
-chr1 4646074 rs242043 T C 1.61 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=13.28;MQ=59.47;MQ0=0;OQ=1026.27;QD=14.45;SB=-395.20 GT:AD:DP:GL:GQ 0/1:34,37:70:-127.00,-21.09,-134.39:99
-chr1 4646297 rs61765026 G A 183.35 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=1519.28;QD=17.87;SB=-749.72 GT:AD:DP:GL:GQ 0/1:39,46:84:-180.53,-25.32,-123.19:99
-chr1 4646496 rs10915587 C T 288.71 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=3.87;MQ=60.00;MQ0=0;OQ=1042.81;QD=16.04;SB=-490.54 GT:AD:DP:GL:GQ 0/1:32,33:64:-126.86,-19.30,-98.43:99
-chr1 4646880 rs17344953 G A 102.24 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=5.33;MQ=59.62;MQ0=0;OQ=1025.96;QD=17.10;SB=-396.44 GT:AD:DP:GL:GQ 0/1:26,33:55:-122.45,-16.57,-85.52:99
-chr1 4647597 rs12747700 G A 323.59 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=59.29;MQ0=0;OQ=999.88;QD=16.95;SB=-503.14 GT:AD:DP:GL:GQ 0/1:28,31:57:-120.45,-17.18,-86.54:99
-chr1 4648034 rs6684528 G T 259.70 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.52;MQ0=0;OQ=808.60;QD=16.85;SB=-296.69 GT:AD:DP:GL:GQ 0/1:20,28:48:-98.60,-14.46,-70.03:99
-chr1 4648165 rs1076944 G T 243.38 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=58.38;MQ0=0;OQ=602.15;QD=11.58;SB=-146.14 GT:AD:DP:GL:GQ 0/1:27,25:49:-78.26,-14.76,-94.92:99
-chr1 4648936 rs4092257 G A 283.88 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=57.56;MQ0=0;OQ=450.85;QD=13.66;SB=-204.90 GT:AD:DP:GL:GQ 0/1:17,16:32:-58.02,-9.65,-54.32:99
-chr1 4649873 rs187148 C G 93.57 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=0;HaplotypeScore=3.10;MQ=59.76;MQ0=0;OQ=296.24;QD=8.98;SB=-132.74 GT:AD:DP:GL:GQ 0/1:22,11:31:-42.26,-9.35,-85.65:99
-chr1 4651624 . C A 146.63 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=797.72;QD=17.34;SB=-280.69 GT:AD:DP:GL:GQ 0/1:17,29:42:-95.71,-12.66,-50.88:99
-chr1 4652138 rs171380 A G 10.05 PASS AC=1;AF=0.50;AN=2;DB;DP=30;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=58.45;MQ0=0;OQ=324.85;QD=10.83;SB=-162.34 GT:AD:DP:GL:GQ 0/1:14,16:28:-44.21,-8.45,-55.22:99
-chr1 4653917 rs7525374 A G 301.57 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=624.45;QD=13.58;SB=-244.30 GT:AD:DP:GL:GQ 0/1:21,25:46:-79.59,-13.86,-85.75:99
-chr1 4653963 rs7528195 T C 276.57 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.00;MQ0=0;OQ=479.46;QD=11.42;SB=-265.36 GT:AD:DP:GL:GQ 0/1:21,21:39:-62.99,-11.76,-78.32:99
-chr1 4654404 rs1076945 C T 142.94 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=4.82;MQ=58.13;MQ0=0;OQ=818.85;QD=13.65;SB=-233.53 GT:AD:DP:GL:GQ 0/1:33,27:59:-102.95,-17.78,-107.70:99
-chr1 4655581 . C T 85.40 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=59.44;MQ0=0;OQ=1224.61;QD=16.55;SB=-495.16 GT:AD:DP:GL:GQ 0/1:36,38:73:-147.75,-22.00,-119.12:99
-chr1 4656328 rs10915588 T C 75.83 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=629.83;QD=11.88;SB=-281.45 GT:AD:DP:GL:GQ 0/1:30,23:52:-81.93,-15.66,-115.22:99
-chr1 4656461 rs3886389 A G 234.27 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.53;MQ0=0;OQ=467.67;QD=9.54;SB=-232.27 GT:AD:DP:GL:GQ 0/1:28,21:49:-64.82,-14.77,-113.76:99
-chr1 4657736 rs6669203 T C 161.22 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=58.29;MQ0=0;OQ=397.97;QD=9.71;SB=-145.57 GT:AD:DP:GL:GQ 0/1:23,18:37:-54.24,-11.16,-78.29:99
-chr1 4658187 rs12121882 C T 363.11 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=849.30;QD=18.07;SB=-359.52 GT:AD:DP:GL:GQ 0/1:21,26:46:-102.08,-13.87,-62.23:99
-chr1 4659178 rs242054 A G 123.55 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=57.49;MQ0=0;OQ=1370.79;QD=30.46;SB=-653.90 GT:AD:DP:GL:GQ 1/1:0,45:44:-140.71,-13.27,-0.04:99
-chr1 4660176 rs61765031 A G 230.02 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.54;MQ=59.01;MQ0=0;OQ=811.95;QD=12.30;SB=-390.16 GT:AD:DP:GL:GQ 0/1:34,31:61:-102.85,-18.37,-129.51:99
-chr1 4663049 rs6686733 T C 216.77 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=4.72;MQ=59.04;MQ0=0;OQ=1082.32;QD=15.92;SB=-503.34 GT:AD:DP:GL:GQ 0/1:29,39:64:-130.80,-19.28,-107.21:99
-chr1 4663261 rs6681520 C T 227.08 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1006.77;QD=22.88;SB=-416.49 GT:AD:DP:GL:GQ 0/1:15,29:43:-116.92,-12.96,-47.72:99
-chr1 4665250 rs12131565 A G 49.08 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=2;HaplotypeScore=2.95;MQ=47.43;MQ0=2;OQ=1030.19;QD=13.38;SB=-443.10 GT:AD:DP:GL:GQ 0/1:41,36:75:-128.89,-22.59,-163.25:99
-chr1 4665448 rs10915590 T C 343.30 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.85;MQ0=0;OQ=469.57;QD=9.58;SB=-224.22 GT:AD:DP:GL:GQ 0/1:29,20:48:-64.71,-14.47,-110.90:99
-chr1 4665815 rs10915592 T C 6.94 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=940.71;QD=17.75;SB=-259.53 GT:AD:DP:GL:GQ 0/1:21,32:50:-112.42,-15.06,-71.48:99
-chr1 4667613 rs2101196 A G 254.46 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.34;MQ=56.97;MQ0=0;OQ=1013.81;QD=15.13;SB=-354.95 GT:AD:DP:GL:GQ 0/1:32,35:65:-124.25,-19.58,-123.74:99
-chr1 4667836 . T C 82.17 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=758.61;QD=12.24;SB=-402.64 GT:AD:DP:GL:GQ 0/1:31,31:61:-97.53,-18.39,-127.98:99
-chr1 4667882 rs2086718 C T 43.81 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.02;HRun=0;HaplotypeScore=5.21;MQ=57.79;MQ0=0;OQ=518.41;QD=9.43;SB=-229.72 GT:AD:DP:GL:GQ 0/1:31,22:40:-66.89,-11.76,-68.62:99
-chr1 4667894 . G T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=12;HaplotypeScore=6.56;MQ=55.45;MQ0=0;OQ=63.00;QD=0.98;SB=-8.73 GT:AD:DP:GL:GQ 0/1:54,10:56:-26.47,-16.89,-148.75:95.84
-chr1 4668291 rs6670802 G A 143.50 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=56.73;MQ0=0;OQ=372.96;QD=8.29;SB=-147.60 GT:AD:DP:GL:GQ 0/1:28,16:38:-52.04,-11.46,-80.12:99
-chr1 4668400 rs6688423 T C 371.01 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=710.41;QD=13.16;SB=-359.33 GT:AD:DP:GL:GQ 0/1:26,28:52:-89.99,-15.67,-104.81:99
-chr1 4668882 . T C 49.86 LowQual AC=1;AF=0.50;AN=2;DP=20;Dels=0.00;HRun=3;HaplotypeScore=9.17;MQ=57.66;MQ0=0;QD=2.49;SB=-0.98 GT:AD:DP:GL:GQ 0/1:11,9:11:-11.59,-3.32,-24.54:82.70
-chr1 4669925 rs12760917 T C 439.23 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.29;MQ0=0;OQ=917.38;QD=14.11;SB=-279.27 GT:AD:DP:GL:GQ 0/1:29,36:64:-114.31,-19.29,-115.57:99
-chr1 4670306 rs4654594 T C 240.89 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=58.06;MQ0=0;OQ=1070.08;QD=17.54;SB=-482.88 GT:AD:DP:GL:GQ 0/1:21,40:58:-127.77,-17.48,-76.71:99
-chr1 4670764 rs1483197 T C 225.25 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=4.25;MQ=58.29;MQ0=0;OQ=709.74;QD=13.65;SB=-285.29 GT:AD:DP:GL:GQ 0/1:22,29:49:-89.03,-14.77,-80.10:99
-chr1 4670879 . G T 21.82 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=1.85;MQ=60.00;MQ0=0;OQ=722.25;QD=15.70;SB=-186.19 GT:AD:DP:GL:GQ 0/1:22,24:42:-88.16,-12.65,-60.03:99
-chr1 4671525 rs989309 G C 65.26 PASS AC=1;AF=0.50;AN=2;DB;DP=33;Dels=0.00;HRun=1;HaplotypeScore=2.50;MQ=60.00;MQ0=0;OQ=327.78;QD=9.93;SB=-148.55 GT:AD:DP:GL:GQ 0/1:21,12:30:-45.12,-9.05,-74.66:99
-chr1 4671555 rs989310 G C 120.18 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=60.00;MQ0=0;OQ=521.90;QD=14.11;SB=-193.59 GT:AD:DP:GL:GQ 0/1:21,16:35:-66.02,-10.55,-86.58:99
-chr1 4671913 rs1061968 T C 32.96 PASS AC=1;AF=0.50;AN=2;DB;DP=16;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=58.55;MQ0=0;OQ=101.72;QD=6.36;SB=-10.00 GT:AD:DP:GL:GQ 0/1:10,6:16:-18.28,-4.82,-40.28:99
-chr1 4672577 rs242056 G A 47.38 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.45;MQ0=0;OQ=1114.83;QD=37.16;SB=-369.99 GT:AD:DP:GL:GQ 1/1:0,30:28:-115.07,-8.43,-0.01:84.28
-chr1 4673126 rs2071999 A C 360.34 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=60.00;MQ0=0;OQ=766.03;QD=12.77;SB=-408.20 GT:AD:DP:GL:GQ 0/1:27,33:59:-97.67,-17.78,-97.47:99
-chr1 4673232 rs56401224 C G 273.95 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.62;MQ=59.63;MQ0=0;OQ=825.52;QD=16.51;SB=-362.08 GT:AD:DP:GL:GQ 0/1:25,25:46:-99.70,-13.86,-96.30:99
-chr1 4673712 rs242057 G A 40.47 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=3;HaplotypeScore=2.46;MQ=59.65;MQ0=0;OQ=947.24;QD=14.35;SB=-485.02 GT:AD:DP:GL:GQ 0/1:36,30:63:-116.99,-18.98,-120.15:99
-chr1 4674298 rs242058 T C 345.93 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=778.59;QD=15.27;SB=-272.44 GT:AD:DP:GL:GQ 0/1:23,28:50:-96.21,-15.07,-89.60:99
-chr1 4676145 rs4654595 A C 407.01 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=2257.07;QD=35.83;SB=-1055.12 GT:AD:DP:GL:GQ 1/1:0,63:63:-229.31,-18.97,-0.02:99
-chr1 4676402 rs4654596 G A 207.21 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.44;MQ0=0;OQ=2768.52;QD=37.41;SB=-1042.40 GT:AD:DP:GL:GQ 1/1:0,74:71:-280.46,-21.39,-0.02:99
-chr1 4678092 rs3766959 C T 358.01 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.73;MQ0=0;OQ=1524.54;QD=23.10;SB=-743.34 GT:AD:DP:GL:GQ 0/1:22,44:65:-175.33,-19.59,-68.56:99
-chr1 4679148 rs242040 A G 228.84 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.49;MQ=60.00;MQ0=0;OQ=836.32;QD=13.07;SB=-312.23 GT:AD:DP:GL:GQ 0/1:34,30:63:-105.89,-18.98,-137.28:99
-chr1 4679557 rs242041 G C 23.06 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=1.52;MQ=58.81;MQ0=0;OQ=500.09;QD=9.81;SB=-250.11 GT:AD:DP:GL:GQ 0/1:32,19:47:-67.48,-14.18,-123.03:99
-chr1 4681011 rs3820251 C T 321.37 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.05;MQ0=0;OQ=1264.98;QD=15.06;SB=-599.08 GT:AD:DP:GL:GQ 0/1:45,39:83:-154.80,-25.02,-140.75:99
-chr1 4683002 rs12566272 G A 75.66 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=6.06;MQ=59.60;MQ0=0;OQ=811.79;QD=14.00;SB=-379.10 GT:AD:DP:GL:GQ 0/1:30,28:55:-101.04,-16.58,-98.62:99
-chr1 4683215 rs12085854 C T 250.87 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=58.71;MQ0=0;OQ=595.12;QD=16.53;SB=-237.77 GT:AD:DP:GL:GQ 0/1:12,24:28:-71.24,-8.44,-31.48:99
-chr1 4684416 rs3820252 C T 67.11 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.40;MQ=59.16;MQ0=0;OQ=1099.71;QD=21.99;SB=-407.20 GT:AD:DP:GL:GQ 0/1:18,32:50:-128.32,-15.07,-57.31:99
-chr1 4684710 rs4554693 C T 27.64 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.03;MQ=59.86;MQ0=0;OQ=1309.90;QD=22.98;SB=-464.01 GT:AD:DP:GL:GQ 0/1:20,37:57:-151.45,-17.18,-62.35:99
-chr1 4685955 rs11586740 G T 36.42 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=7.65;MQ=60.00;MQ0=0;OQ=1269.15;QD=17.39;SB=-560.71 GT:AD:DP:GL:GQ 0/1:30,43:69:-150.98,-20.79,-94.07:99
-chr1 4686129 . A G 0.31 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=58.20;MQ0=0;OQ=188.73;QD=3.63;SB=-3.68 GT:AD:DP:GL:GQ 0/1:41,11:52:-37.84,-15.68,-155.85:99
-chr1 4686130 . G C 4.40 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.20;MQ0=0;OQ=258.95;QD=4.98;SB=-16.68 GT:AD:DP:GL:GQ 0/1:42,10:52:-44.85,-15.67,-182.52:99
-chr1 4686979 rs242044 A G 24.21 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=59.56;MQ0=0;OQ=1479.37;QD=27.91;SB=-538.14 GT:AD:DP:GL:GQ 1/1:0,52:45:-151.55,-13.56,-0.03:99
-chr1 4687176 rs242045 T C 255.59 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1371.92;QD=34.30;SB=-697.63 GT:AD:DP:GL:GQ 1/1:0,40:40:-140.79,-12.05,-0.02:99
-chr1 4687868 rs242047 A C 103.52 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=2.65;MQ=59.62;MQ0=0;OQ=770.92;QD=12.85;SB=-248.85 GT:AD:DP:GL:GQ 0/1:32,28:59:-98.15,-17.77,-114.07:99
-chr1 4688746 rs242048 A G 112.68 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=1.71;MQ=59.36;MQ0=0;OQ=768.10;QD=21.34;SB=-331.78 GT:AD:DP:GL:GQ 1/1:0,36:26:-80.42,-7.84,-0.03:78.16
-chr1 4688889 rs242049 T G 239.30 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=60.00;MQ0=0;OQ=1481.34;QD=32.92;SB=-635.03 GT:AD:DP:GL:GQ 1/1:0,45:44:-151.74,-13.26,-0.02:99
-chr1 4695274 rs446529 T C 363.34 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=55.31;MQ0=0;OQ=516.35;QD=9.93;SB=-227.25 GT:AD:DP:GL:GQ 0/1:29,23:50:-69.99,-15.07,-114.97:99
-chr1 4695606 rs648712 C T 1.54 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=10.04;MQ=47.15;MQ0=0;OQ=816.40;QD=17.01;SB=-434.45 GT:AD:DP:GL:GQ 0/1:23,25:46:-98.78,-13.86,-79.74:99
-chr1 4695607 . T G 0.18 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=11.01;MQ=47.15;MQ0=0;OQ=688.64;QD=14.35;SB=-357.86 GT:AD:DP:GL:GQ 0/1:23,25:47:-86.31,-14.16,-83.32:99
-chr1 4695638 rs432330 T A 460.16 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=51.80;MQ0=0;OQ=772.11;QD=15.14;SB=-337.40 GT:AD:DP:GL:GQ 0/1:24,27:50:-95.56,-15.06,-90.18:99
-chr1 4695654 rs449261 T C 245.99 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.57;MQ=53.57;MQ0=0;OQ=702.97;QD=13.52;SB=-345.62 GT:AD:DP:GL:GQ 0/1:26,26:49:-88.35,-14.77,-92.65:99
-chr1 4695676 rs435239 G C 185.06 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=2.08;MQ=57.17;MQ0=0;OQ=826.31;QD=16.53;SB=-414.36 GT:AD:DP:GL:GQ 0/1:24,26:47:-100.09,-14.18,-90.75:99
-chr1 4695734 rs416953 T C 152.01 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=59.13;MQ0=0;OQ=882.63;QD=16.65;SB=-283.45 GT:AD:DP:GL:GQ 0/1:22,31:50:-106.61,-15.06,-78.94:99
-chr1 4696083 rs383650 C G 345.55 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.53;MQ=59.10;MQ0=0;OQ=1382.15;QD=17.95;SB=-715.96 GT:AD:DP:GL:GQ 0/1:38,39:75:-164.11,-22.61,-152.21:99
-chr1 4696156 rs436132 G C 8.37 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=1112.40;QD=19.86;SB=-564.68 GT:AD:DP:GL:GQ 0/1:25,31:56:-131.40,-16.88,-111.00:99
-chr1 4696361 . A C 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=2;HaplotypeScore=10.18;MQ=60.26;MQ0=0;OQ=143.73;QD=2.08;SB=104.31 GT:AD:DP:GL:GQ 0/1:45,24:52:-33.32,-15.67,-137.68:99
-chr1 4696418 rs392630 A G 270.27 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.71;MQ0=0;OQ=1265.58;QD=13.76;SB=-582.79 GT:AD:DP:GL:GQ 0/1:45,47:87:-156.05,-26.21,-176.07:99
-chr1 4697358 rs544738 C A 298.87 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.61;MQ=59.01;MQ0=0;OQ=538.34;QD=14.17;SB=-233.94 GT:AD:DP:GL:GQ 0/1:19,19:37:-68.26,-11.15,-60.83:99
-chr1 4697618 rs445060 G A 155.17 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=59.60;MQ0=0;OQ=740.87;QD=12.77;SB=-313.26 GT:AD:DP:GL:GQ 0/1:32,26:54:-93.63,-16.26,-111.70:99
-chr1 4698713 rs578528 A G 87.54 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.36;MQ0=0;OQ=385.70;QD=10.71;SB=-193.63 GT:AD:DP:GL:GQ 0/1:21,15:36:-52.70,-10.85,-81.97:99
-chr1 4699130 rs449181 G A 397.02 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.84;MQ=59.67;MQ0=0;OQ=927.44;QD=16.56;SB=-380.14 GT:AD:DP:GL:GQ 0/1:27,29:54:-112.30,-16.28,-85.10:99
-chr1 4700289 rs13376290 T G 0.41 PASS AC=1;AF=0.50;AN=2;DB;DP=26;Dels=0.00;HRun=4;HaplotypeScore=0.10;MQ=48.01;MQ0=0;OQ=193.53;QD=7.44;SB=-0.43 GT:AD:DP:GL:GQ 0/1:15,11:24:-29.87,-7.23,-54.19:99
-chr1 4700426 . C G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=26;Dels=0.00;HRun=2;HaplotypeScore=11.52;MQ=48.42;MQ0=0;OQ=136.63;QD=5.25;SB=-6.99 GT:AD:DP:GL:GQ 0/1:7,19:10:-19.97,-3.02,-19.59:99
-chr1 4700705 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=20;HaplotypeScore=32.92;MQ=48.95;MQ0=0;OQ=199.23;QD=3.83;SB=71.25 GT:AD:DP:GL:GQ 0/1:35,17:41:-35.56,-12.35,-113.25:99
-chr1 4700881 rs529853 G C 174.83 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=3.66;MQ=53.91;MQ0=0;OQ=810.63;QD=16.54;SB=-402.70 GT:AD:DP:GL:GQ 0/1:22,27:47:-98.53,-14.18,-93.65:99
-chr1 4701141 rs381339 T C 9.53 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=2.72;MQ=59.22;MQ0=0;OQ=750.05;QD=11.54;SB=-112.61 GT:AD:DP:GL:GQ 0/1:29,33:53:-94.27,-15.98,-96.69:99
-chr1 4701497 rs382623 T C 282.35 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.48;MQ0=0;OQ=1093.69;QD=13.50;SB=-513.56 GT:AD:DP:GL:GQ 0/1:38,43:80:-136.77,-24.11,-153.00:99
-chr1 4701516 rs382646 T C 490.40 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1091.01;QD=14.36;SB=-413.27 GT:AD:DP:GL:GQ 0/1:38,38:75:-134.98,-22.59,-157.29:99
-chr1 4701783 rs392620 C T 260.56 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.19;MQ=59.38;MQ0=0;OQ=1111.05;QD=15.01;SB=-420.88 GT:AD:DP:GL:GQ 0/1:41,33:73:-136.38,-21.99,-143.11:99
-chr1 4702373 rs448741 C T 315.12 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=1161.48;QD=16.83;SB=-516.10 GT:AD:DP:GL:GQ 0/1:33,36:68:-139.92,-20.49,-116.50:99
-chr1 4702588 rs431966 C G 301.89 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.74;MQ0=0;OQ=1167.37;QD=16.21;SB=-392.89 GT:AD:DP:GL:GQ 0/1:35,37:71:-141.44,-21.42,-151.57:99
-chr1 4703125 rs367673 G C 285.90 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.24;MQ0=0;OQ=1282.03;QD=21.02;SB=-602.59 GT:AD:DP:GL:GQ 0/1:26,35:61:-149.87,-18.38,-114.22:99
-chr1 4703446 rs540299 A G 321.95 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.50;MQ=59.10;MQ0=0;OQ=1141.42;QD=14.82;SB=-449.59 GT:AD:DP:GL:GQ 0/1:36,41:75:-140.02,-22.60,-142.02:99
-chr1 4703496 rs648346 G A 131.26 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.29;MQ0=0;OQ=1435.37;QD=17.50;SB=-321.28 GT:AD:DP:GL:GQ 0/1:40,42:79:-170.63,-23.81,-120.02:99
-chr1 4703694 rs393976 G A 298.73 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=59.30;MQ0=0;OQ=1022.50;QD=17.04;SB=-396.14 GT:AD:DP:GL:GQ 0/1:30,30:58:-123.01,-17.47,-100.86:99
-chr1 4704145 rs375781 T C 253.06 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=57.53;MQ0=0;OQ=380.91;QD=10.02;SB=-211.48 GT:AD:DP:GL:GQ 0/1:19,19:35:-51.92,-10.55,-74.06:99
-chr1 4704212 rs406065 A T 598.24 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.74;MQ0=0;OQ=1026.86;QD=14.88;SB=-405.55 GT:AD:DP:GL:GQ 0/1:35,34:69:-126.75,-20.78,-135.77:99
-chr1 4704412 rs396199 G A 86.73 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=1.14;MQ=59.62;MQ0=0;OQ=915.71;QD=18.69;SB=-324.82 GT:AD:DP:GL:GQ 0/1:21,28:47:-109.02,-14.16,-69.65:99
-chr1 4704606 rs413178 A G 154.93 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=56.43;MQ0=0;OQ=958.14;QD=15.45;SB=-233.27 GT:AD:DP:GL:GQ 0/1:25,37:59:-116.89,-17.79,-90.61:99
-chr1 4704966 rs414176 A C 426.79 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=751.31;QD=11.93;SB=-297.47 GT:AD:DP:GL:GQ 0/1:31,32:62:-97.10,-18.68,-109.53:99
-chr1 4705294 rs371605 A G 188.84 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=59.55;MQ0=0;OQ=418.07;QD=8.20;SB=-210.35 GT:AD:DP:GL:GQ 0/1:28,23:46:-58.96,-13.87,-104.25:99
-chr1 4705534 rs409048 T C 345.87 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.05;MQ=59.35;MQ0=0;OQ=802.66;QD=12.54;SB=-363.20 GT:AD:DP:GL:GQ 0/1:35,29:64:-102.83,-19.28,-139.39:99
-chr1 4706241 rs368808 A G 17.45 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=4.09;MQ=59.49;MQ0=0;OQ=756.36;QD=9.22;SB=-230.86 GT:AD:DP:GL:GQ 0/1:48,34:80:-103.04,-24.12,-189.26:99
-chr1 4707706 rs368940 A G 105.39 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=599.08;QD=17.12;SB=-212.56 GT:AD:DP:GL:GQ 0/1:14,21:35:-73.73,-10.54,-57.28:99
-chr1 4707911 . C A 31.90 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=13;HaplotypeScore=26.77;MQ=58.47;MQ0=0;QD=0.52;SB=52.91 GT:AD:DP:GL:GQ 0/1:52,9:48:-20.93,-14.46,-146.08:64.73
-chr1 4708314 rs2802721 G A 450.84 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=56.44;MQ0=0;OQ=981.54;QD=15.34;SB=-489.03 GT:AD:DP:GL:GQ 0/1:28,36:59:-119.22,-17.78,-99.55:99
-chr1 4708405 rs394808 C A 233.49 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=56.69;MQ0=0;OQ=782.76;QD=14.77;SB=-324.34 GT:AD:DP:GL:GQ 0/1:26,27:51:-96.92,-15.37,-78.87:99
-chr1 4708536 rs395145 C T 383.51 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1269.10;QD=19.83;SB=-521.54 GT:AD:DP:GL:GQ 0/1:25,39:63:-149.18,-18.98,-84.36:99
-chr1 4708674 rs4654602 A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=69.80;MQ=46.48;MQ0=0;OQ=293.59;QD=4.19;SB=-93.14 GT:AD:DP:GL:GQ 0/1:56,14:66:-52.53,-19.89,-198.60:99
-chr1 4708678 rs406913 A G 32.76 DPFilter;LowQual AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=20.07;MQ=45.13;MQ0=0;QD=0.48;SB=9.87 GT:AD:DP:GL:GQ 0/1:59,9:58:-24.04,-17.48,-194.48:65.59
-chr1 4708830 rs433427 A G 13.73 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=6.55;MQ=59.08;MQ0=0;OQ=748.71;QD=10.55;SB=-350.04 GT:AD:DP:GL:GQ 0/1:40,31:70:-99.25,-21.09,-163.31:99
-chr1 4708980 rs2802720 C T 373.55 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=55.41;MQ0=0;OQ=1008.97;QD=15.29;SB=-359.05 GT:AD:DP:GL:GQ 0/1:35,31:66:-124.06,-19.88,-124.56:99
-chr1 4710412 rs364642 C T 180.53 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=3.52;MQ=58.91;MQ0=0;OQ=814.43;QD=13.57;SB=-402.86 GT:AD:DP:GL:GQ 0/1:32,28:58:-102.20,-17.48,-113.74:99
-chr1 4712675 rs381240 A G 265.51 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=57.93;MQ0=0;OQ=805.26;QD=10.19;SB=-382.86 GT:AD:DP:GL:GQ 0/1:44,35:76:-106.72,-22.91,-172.59:99
-chr1 4712931 rs448221 T C 105.17 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=56.15;MQ0=0;OQ=384.09;QD=10.38;SB=-115.63 GT:AD:DP:GL:GQ 0/1:18,19:34:-51.95,-10.25,-67.62:99
-chr1 4712934 rs431884 C T 132.31 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=56.04;MQ0=0;OQ=441.73;QD=12.27;SB=-157.22 GT:AD:DP:GL:GQ 0/1:18,18:33:-57.41,-9.95,-59.19:99
-chr1 4712975 rs380239 A G 454.99 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=55.78;MQ0=0;OQ=728.95;QD=12.57;SB=-369.58 GT:AD:DP:GL:GQ 0/1:31,26:56:-93.05,-16.87,-121.44:99
-chr1 4713977 rs434474 A T 435.77 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.38;MQ0=0;OQ=788.95;QD=11.78;SB=-384.44 GT:AD:DP:GL:GQ 0/1:40,27:64:-101.46,-19.28,-136.23:99
-chr1 4714260 rs428001 G A 188.72 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=394.17;QD=7.58;SB=-208.83 GT:AD:DP:GL:GQ 0/1:37,15:47:-56.86,-14.16,-117.42:99
-chr1 4714368 rs413383 G C 359.15 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=902.57;QD=15.56;SB=-389.66 GT:AD:DP:GL:GQ 0/1:30,28:56:-110.43,-16.89,-123.48:99
-chr1 4714807 rs401110 C T 341.51 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=642.13;QD=13.96;SB=-230.50 GT:AD:DP:GL:GQ 0/1:24,21:44:-80.76,-13.26,-78.68:99
-chr1 4715337 rs434504 G A 250 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.39;MQ0=0;OQ=582.19;QD=15.32;SB=-195.19 GT:AD:DP:GL:GQ 0/1:19,19:36:-72.35,-10.85,-57.76:99
-chr1 4718265 rs423796 G A 245.56 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.32;MQ=58.44;MQ0=0;OQ=1032.37;QD=16.92;SB=-496.08 GT:AD:DP:GL:GQ 0/1:28,33:59:-124.29,-17.77,-98.91:99
-chr1 4718977 rs41511844 A C 15.67 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=3;HaplotypeScore=0.79;MQ=59.53;MQ0=0;OQ=807.51;QD=16.48;SB=-276.90 GT:AD:DP:GL:GQ 0/1:21,28:49:-98.80,-14.76,-77.17:99
-chr1 4719527 rs523141 G A 331.15 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.63;MQ0=1;OQ=362.25;QD=9.29;SB=-60.24 GT:AD:DP:GL:GQ 0/1:25,14:36:-50.35,-10.84,-83.10:99
-chr1 4719663 rs368420 T C 450.85 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=60.00;MQ0=0;OQ=1132.30;QD=16.90;SB=-528.33 GT:AD:DP:GL:GQ 0/1:29,38:66:-136.39,-19.88,-119.33:99
-chr1 4720200 rs34125417 T A 155.86 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=3.33;MQ=59.59;MQ0=0;OQ=796.97;QD=13.51;SB=-224.76 GT:AD:DP:GL:GQ 0/1:29,29:54:-99.25,-16.27,-103.01:99
-chr1 4720659 rs397559 C T 380.37 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.71;MQ0=0;OQ=1207.74;QD=18.87;SB=-534.79 GT:AD:DP:GL:GQ 0/1:27,37:63:-143.05,-18.99,-86.17:99
-chr1 4721157 rs443850 C T 216.92 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=4.76;MQ=59.51;MQ0=0;OQ=1138.02;QD=14.97;SB=-525.69 GT:AD:DP:GL:GQ 0/1:42,34:73:-139.07,-21.99,-142.33:99
-chr1 4721448 rs9426481 G T 366.43 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=988.26;QD=14.53;SB=-519.87 GT:AD:DP:GL:GQ 0/1:35,33:67:-122.29,-20.18,-120.50:99
-chr1 4722600 rs742245 A C 591.38 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1064.86;QD=15.00;SB=-554.90 GT:AD:DP:GL:GQ 0/1:34,37:68:-130.25,-20.48,-117.18:99
-chr1 4722971 rs760815 C A 224.06 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.29;MQ0=0;OQ=950.16;QD=16.10;SB=-349.23 GT:AD:DP:GL:GQ 0/1:26,33:58:-115.77,-17.47,-92.37:99
-chr1 4723061 rs2743978 G A 259.98 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=60.00;MQ0=0;OQ=829.12;QD=15.07;SB=-390.87 GT:AD:DP:GL:GQ 0/1:28,27:53:-102.17,-15.97,-92.75:99
-chr1 4723683 rs411832 G C 0.53 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.02;HRun=0;HaplotypeScore=12.73;MQ=59.54;MQ0=0;OQ=809.82;QD=16.20;SB=-394.90 GT:AD:DP:GL:GQ 0/1:25,24:48:-98.44,-14.17,-99.99:99
-chr1 4723923 rs425005 C A 167.26 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=59.70;MQ0=0;OQ=997.52;QD=16.09;SB=-361.25 GT:AD:DP:GL:GQ 0/1:28,34:61:-121.41,-18.38,-98.67:99
-chr1 4724602 rs424723 C T 274.96 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.39;MQ0=0;OQ=1215.08;QD=19.92;SB=-584.11 GT:AD:DP:GL:GQ 0/1:24,36:58:-142.27,-17.47,-75.15:99
-chr1 4725012 rs2743979 G A 336.31 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.68;MQ0=0;OQ=1008.07;QD=17.38;SB=-481.48 GT:AD:DP:GL:GQ 0/1:28,30:57:-121.27,-17.17,-91.06:99
-chr1 4725752 rs57646199 C T 319.32 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1002.06;QD=17.89;SB=-467.46 GT:AD:DP:GL:GQ 0/1:26,30:56:-120.36,-16.87,-93.54:99
-chr1 4725910 rs2802717 C T 220.45 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=59.68;MQ0=0;OQ=1230.52;QD=17.09;SB=-300.80 GT:AD:DP:GL:GQ 0/1:35,36:70:-147.42,-21.09,-124.52:99
-chr1 4725964 rs2802716 C A 41.54 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=0.93;MQ=59.48;MQ0=0;OQ=1484.28;QD=18.55;SB=-734.49 GT:AD:DP:GL:GQ 0/1:32,48:80:-175.81,-24.10,-113.80:99
-chr1 4726365 rs9426502 G A 127.06 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.67;MQ0=0;OQ=1140.71;QD=16.53;SB=-410.70 GT:AD:DP:GL:GQ 0/1:35,34:69:-138.14,-20.78,-128.81:99
-chr1 4726520 rs2743980 G A 355.47 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=1.45;MQ=59.68;MQ0=0;OQ=913.23;QD=12.68;SB=-432.39 GT:AD:DP:GL:GQ 0/1:43,29:72:-116.30,-21.69,-156.11:99
-chr1 4726900 rs7548728 G A 477.89 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=780.16;QD=13.69;SB=-340.47 GT:AD:DP:GL:GQ 0/1:32,25:55:-97.88,-16.58,-97.83:99
-chr1 4727923 rs426095 G A 378.93 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.64;MQ0=0;OQ=878.95;QD=13.73;SB=-378.83 GT:AD:DP:GL:GQ 0/1:36,28:61:-109.56,-18.38,-120.39:99
-chr1 4728243 rs396629 C T 353.19 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.62;MQ0=0;OQ=1145.27;QD=18.77;SB=-564.43 GT:AD:DP:GL:GQ 0/1:27,34:61:-136.20,-18.39,-85.13:99
-chr1 4728440 . G A 47.68 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.39;MQ=58.84;MQ0=0;OQ=1100.89;QD=19.66;SB=-554.66 GT:AD:DP:GL:GQ 0/1:23,33:56:-130.25,-16.88,-72.13:99
-chr1 4730266 rs410413 T C 266.24 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=57.84;MQ0=0;OQ=500.27;QD=10.01;SB=-265.95 GT:AD:DP:GL:GQ 0/1:25,25:45:-66.88,-13.57,-94.91:99
-chr1 4730269 rs410414 T C 250.89 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=57.08;MQ0=0;OQ=462.87;QD=9.85;SB=-198.61 GT:AD:DP:GL:GQ 0/1:25,22:45:-63.14,-13.57,-96.77:99
-chr1 4730645 rs395467 A G 11.96 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=4.91;MQ=52.28;MQ0=0;OQ=653.20;QD=9.90;SB=-279.13 GT:AD:DP:GL:GQ 0/1:38,27:64:-87.89,-19.29,-148.52:99
-chr1 4730689 rs9426503 G C 129.77 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.89;MQ=56.81;MQ0=0;OQ=1027.62;QD=14.27;SB=-322.37 GT:AD:DP:GL:GQ 0/1:41,31:67:-126.24,-20.20,-160.02:99
-chr1 4730760 rs9426483 C T 334.33 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.53;MQ=58.90;MQ0=0;OQ=750.53;QD=13.65;SB=-332.36 GT:AD:DP:GL:GQ 0/1:31,24:54:-94.60,-16.27,-107.97:99
-chr1 4730936 rs423285 C T 421.63 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=56.95;MQ0=0;OQ=670.76;QD=11.37;SB=-300.79 GT:AD:DP:GL:GQ 0/1:33,25:55:-86.95,-16.59,-101.75:99
-chr1 4730990 rs395508 G A 57.05 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.76;MQ=59.27;MQ0=0;OQ=529.54;QD=9.29;SB=-260.10 GT:AD:DP:GL:GQ 0/1:38,19:53:-72.20,-15.97,-127.10:99
-chr1 4731053 rs418045 T C 525.89 PASS AC=1;AF=0.50;AN=2;DB;DP=46;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=529.19;QD=11.50;SB=-290.44 GT:AD:DP:GL:GQ 0/1:26,20:45:-69.76,-13.55,-105.89:99
-chr1 4731180 rs396112 G A 318.68 PASS AC=1;AF=0.50;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=740.76;QD=17.64;SB=-379.17 GT:AD:DP:GL:GQ 0/1:19,23:39:-89.12,-11.76,-51.25:99
-chr1 4731341 rs406847 A G 411.20 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.80;MQ0=0;OQ=513.60;QD=14.67;SB=-259.91 GT:AD:DP:GL:GQ 0/1:17,18:35:-65.19,-10.54,-67.57:99
-chr1 4731471 rs428580 C T 186.08 PASS AC=1;AF=0.50;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=867.64;QD=20.18;SB=-459.01 GT:AD:DP:GL:GQ 0/1:17,26:42:-102.70,-12.65,-55.85:99
-chr1 4731684 rs407301 C T 107.33 PASS AC=1;AF=0.50;AN=2;DB;DP=34;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=57.23;MQ0=0;OQ=697.47;QD=20.51;SB=-327.88 GT:AD:DP:GL:GQ 0/1:12,22:33:-82.98,-9.95,-39.91:99
-chr1 4732014 . T A 875.95 Indel AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=12.12;MQ=51.16;MQ0=0;QD=14.13;SB=-350.44 GT:AD:DP:GL:GQ 0/1:31,31:60:-108.95,-18.08,-110.80:99
-chr1 4732015 . T A 970.99 Indel AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=9;HaplotypeScore=12.28;MQ=51.00;MQ0=0;QD=15.92;SB=-364.45 GT:AD:DP:GL:GQ 0/1:29,32:58:-117.85,-17.47,-98.32:99
-chr1 4733241 rs414434 G C 239.58 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1334.69;QD=20.22;SB=-556.62 GT:AD:DP:GL:GQ 0/1:28,38:63:-155.75,-19.00,-107.17:99
-chr1 4734056 rs9426504 G A 5.32 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=4;HaplotypeScore=2.44;MQ=58.18;MQ0=0;OQ=895.74;QD=16.59;SB=-312.82 GT:AD:DP:GL:GQ 0/1:25,29:51:-108.23,-15.38,-75.31:99
-chr1 4734062 rs451162 G C 249.29 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.31;MQ=58.57;MQ0=0;OQ=977.80;QD=18.80;SB=-417.05 GT:AD:DP:GL:GQ 0/1:24,28:49:-115.83,-14.77,-93.28:99
-chr1 4734089 rs388631 T C 200.06 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.48;MQ=59.01;MQ0=0;OQ=598.20;QD=12.73;SB=-188.41 GT:AD:DP:GL:GQ 0/1:21,25:44:-76.37,-13.27,-78.74:99
-chr1 4734466 rs389959 T C 132.65 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.40;MQ=60.00;MQ0=0;OQ=323.31;QD=6.22;SB=-138.87 GT:AD:DP:GL:GQ 0/1:33,18:48:-50.08,-14.47,-128.38:99
-chr1 4734711 rs397852 T C 337.97 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=1.07;MQ=60.00;MQ0=0;OQ=458.03;QD=9.35;SB=-228.25 GT:AD:DP:GL:GQ 0/1:29,20:49:-63.86,-14.77,-115.16:99
-chr1 4735235 rs399377 T C 222.18 PASS AC=1;AF=0.50;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=339.75;QD=9.71;SB=-124.62 GT:AD:DP:GL:GQ 0/1:21,14:33:-47.20,-9.94,-76.89:99
-chr1 4735981 rs394594 A G 305.79 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=773.72;QD=10.46;SB=-332.92 GT:AD:DP:GL:GQ 0/1:41,33:73:-102.66,-22.01,-163.48:99
-chr1 4738101 rs414909 C T 441.62 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1084.42;QD=16.19;SB=-452.94 GT:AD:DP:GL:GQ 0/1:35,32:67:-131.91,-20.18,-129.56:99
-chr1 4738908 rs381304 A G 65.84 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=2.37;MQ=58.77;MQ0=0;OQ=1458.03;QD=16.76;SB=-529.55 GT:AD:DP:GL:GQ 0/1:36,51:84:-174.40,-25.31,-140.93:99
-chr1 4739028 rs392984 T C 105.21 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=5.08;MQ=58.80;MQ0=0;OQ=588.16;QD=10.14;SB=-181.39 GT:AD:DP:GL:GQ 0/1:30,28:53:-78.07,-15.97,-115.29:99
-chr1 4739512 rs2802719 A G 384.48 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.81;MQ0=0;OQ=757.23;QD=14.85;SB=-244.45 GT:AD:DP:GL:GQ 0/1:23,28:48:-93.47,-14.47,-78.98:99
-chr1 4739710 rs2802718 G C 11.18 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=3;HaplotypeScore=0.83;MQ=56.67;MQ0=0;OQ=1199.49;QD=18.74;SB=-370.48 GT:AD:DP:GL:GQ 0/1:31,33:60:-141.32,-18.09,-113.09:99
-chr1 4740018 rs7544523 T C 161.93 PASS AC=1;AF=0.50;AN=2;DB;DP=36;Dels=0.00;HRun=0;HaplotypeScore=2.09;MQ=58.16;MQ0=0;OQ=429.98;QD=11.94;SB=-175.51 GT:AD:DP:GL:GQ 0/1:18,18:35:-56.83,-10.55,-68.38:99
-chr1 4744236 rs9426506 C T 327.10 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.29;MQ=58.57;MQ0=0;OQ=856.13;QD=13.81;SB=-428.92 GT:AD:DP:GL:GQ 0/1:35,27:62:-107.57,-18.68,-125.85:99
-chr1 4744972 rs9426484 G A 347.64 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.65;MQ0=0;OQ=799.48;QD=12.30;SB=-407.88 GT:AD:DP:GL:GQ 0/1:38,27:60:-101.32,-18.09,-111.41:99
-chr1 4745752 rs6426434 G A 271.15 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=60.00;MQ0=0;OQ=1169.68;QD=19.49;SB=-538.80 GT:AD:DP:GL:GQ 0/1:24,36:57:-137.43,-17.18,-72.34:99
-chr1 4747705 rs4654460 G A 332.93 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=755.91;QD=18.90;SB=-379.91 GT:AD:DP:GL:GQ 0/1:17,23:38:-90.34,-11.46,-46.09:99
-chr1 4748668 rs12133924 A G 455.19 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1019.13;QD=13.07;SB=-468.04 GT:AD:DP:GL:GQ 0/1:42,36:77:-128.39,-23.20,-162.75:99
-chr1 4748969 rs6701069 A G 376.11 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.72;MQ0=0;OQ=1003.27;QD=12.39;SB=-469.20 GT:AD:DP:GL:GQ 0/1:46,35:80:-127.71,-24.10,-182.44:99
-chr1 4749244 rs2235438 T C 581.54 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=891.88;QD=13.12;SB=-467.00 GT:AD:DP:GL:GQ 0/1:32,36:65:-112.06,-19.59,-124.79:99
-chr1 4750683 rs909757 T C 410.80 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.22;MQ0=0;OQ=683.00;QD=11.78;SB=-347.56 GT:AD:DP:GL:GQ 0/1:31,27:55:-88.15,-16.57,-119.32:99
-chr1 4751405 rs17345239 T G 179.05 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=774.24;QD=13.12;SB=-344.85 GT:AD:DP:GL:GQ 0/1:30,29:56:-97.57,-16.87,-106.85:99
-chr1 4753272 rs742246 A C 355.98 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=617.26;QD=14.03;SB=-196.34 GT:AD:DP:GL:GQ 0/1:21,23:43:-77.96,-12.95,-77.17:99
-chr1 4753548 rs932350 T C 408.09 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.22;MQ0=0;OQ=924.37;QD=14.22;SB=-295.30 GT:AD:DP:GL:GQ 0/1:29,36:64:-115.01,-19.29,-116.32:99
-chr1 4753607 rs12082538 G C 138.47 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=3.84;MQ=60.48;MQ0=0;OQ=606.35;QD=13.47;SB=-132.52 GT:AD:DP:GL:GQ 0/1:25,20:43:-76.88,-12.96,-107.57:99
-chr1 4753770 rs7519688 C T 2.09 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=3;HaplotypeScore=5.33;MQ=59.09;MQ0=0;OQ=802.41;QD=15.73;SB=-282.79 GT:AD:DP:GL:GQ 0/1:25,26:48:-97.99,-14.47,-73.03:99
-chr1 4755384 rs727906 C T 371.77 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.67;MQ=60.00;MQ0=0;OQ=954.50;QD=12.40;SB=-422.82 GT:AD:DP:GL:GQ 0/1:47,30:76:-121.64,-22.91,-153.23:99
-chr1 4756029 rs2411946 T A 426.26 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.59;MQ0=0;OQ=610.43;QD=13.57;SB=-308.69 GT:AD:DP:GL:GQ 0/1:23,22:44:-77.58,-13.26,-87.22:99
-chr1 4756791 rs760816 A G 307.58 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=2.08;MQ=60.00;MQ0=0;OQ=644.43;QD=11.51;SB=-270.35 GT:AD:DP:GL:GQ 0/1:29,27:54:-84.00,-16.27,-113.95:99
-chr1 4758251 . A G 4.99 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=3;HaplotypeScore=0.95;MQ=59.34;MQ0=1;OQ=796.90;QD=10.77;SB=-383.18 GT:AD:DP:GL:GQ 0/1:42,32:64:-102.26,-19.28,-139.02:99
-chr1 4758268 rs4654606 T G 84.96 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.06;MQ=59.35;MQ0=0;OQ=681.65;QD=10.65;SB=-311.85 GT:AD:DP:GL:GQ 0/1:38,26:61:-89.83,-18.38,-124.54:99
-chr1 4759471 rs2142949 C T 488.93 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=986.38;QD=17.01;SB=-326.41 GT:AD:DP:GL:GQ 0/1:27,31:57:-119.09,-17.17,-96.06:99
-chr1 4761020 rs4654607 C T 187.79 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=1317.32;QD=16.67;SB=-650.17 GT:AD:DP:GL:GQ 0/1:40,39:77:-158.21,-23.19,-137.71:99
-chr1 4763236 rs2064168 C T 278.30 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1185.65;QD=19.12;SB=-513.73 GT:AD:DP:GL:GQ 0/1:25,37:60:-139.92,-18.08,-90.33:99
-chr1 4763773 rs760817 T C 455.12 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.94;MQ=59.11;MQ0=0;OQ=932.67;QD=12.78;SB=-440.55 GT:AD:DP:GL:GQ 0/1:40,33:73:-118.54,-21.99,-163.26:99
-chr1 4764845 rs10915606 A G 585.97 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1075.05;QD=14.15;SB=-528.93 GT:AD:DP:GL:GQ 0/1:37,39:74:-133.08,-22.29,-148.56:99
-chr1 4765718 rs10429868 G A 452.05 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1155.78;QD=15.62;SB=-602.60 GT:AD:DP:GL:GQ 0/1:39,35:74:-141.15,-22.29,-141.78:99
-chr1 4766001 rs12022466 T A 597.92 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1259.06;QD=15.94;SB=-558.66 GT:AD:DP:GL:GQ 0/1:39,40:79:-152.98,-23.79,-151.51:99
-chr1 4766045 . G A 13.96 PASS AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1207.52;QD=14.55;SB=-582.08 GT:AD:DP:GL:GQ 0/1:47,36:81:-148.43,-24.40,-164.42:99
-chr1 4766280 rs12752806 G T 477.99 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.50;MQ0=0;OQ=1250.24;QD=15.06;SB=-480.84 GT:AD:DP:GL:GQ 0/1:42,41:81:-152.70,-24.39,-146.62:99
-chr1 4767409 rs7534770 A T 437.84 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1042.20;QD=14.28;SB=-531.39 GT:AD:DP:GL:GQ 0/1:39,34:72:-129.19,-21.69,-145.29:99
-chr1 4767544 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=6;HaplotypeScore=47.32;MQ=56.17;MQ0=2;OQ=190.67;QD=2.98;SB=86.31 GT:AD:DP:GL:GQ 0/1:48,16:57:-39.52,-17.17,-173.24:99
-chr1 4769118 rs10915610 A C 208.85 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=4.78;MQ=58.87;MQ0=0;OQ=1164.63;QD=14.93;SB=-551.67 GT:AD:DP:GL:GQ 0/1:37,39:77:-145.10,-25.36,-142.76:99
-chr1 4770972 . C A 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=59;Dels=0.00;HRun=2;HaplotypeScore=8.28;MQ=56.35;MQ0=0;OQ=111.37;QD=1.89;SB=65.23 GT:AD:DP:GL:GQ 0/1:35,24:40:-26.47,-12.05,-113.84:99
-chr1 4771531 rs1118009 A G 323.35 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=56.74;MQ0=0;OQ=1333.25;QD=15.32;SB=-605.42 GT:AD:DP:GL:GQ 0/1:38,49:86:-162.53,-25.92,-151.96:99
-chr1 4771617 rs1118010 C T 407.70 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=60.00;MQ0=0;OQ=1431.00;QD=18.58;SB=-550.33 GT:AD:DP:GL:GQ 0/1:34,43:77:-169.58,-23.20,-123.43:99
-chr1 4772431 rs10799262 G A 68.65 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=0.32;MQ=59.76;MQ0=0;OQ=1610.76;QD=20.65;SB=-755.30 GT:AD:DP:GL:GQ 0/1:32,46:78:-187.86,-23.50,-115.14:99
-chr1 4772511 rs10915611 C T 585.75 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1219.72;QD=17.42;SB=-547.54 GT:AD:DP:GL:GQ 0/1:34,36:70:-146.34,-21.08,-121.82:99
-chr1 4772916 rs10915612 A G 195.17 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=58.68;MQ0=0;OQ=1058.43;QD=15.80;SB=-539.98 GT:AD:DP:GL:GQ 0/1:30,37:67:-129.31,-20.19,-122.36:99
-chr1 4773270 rs7540367 G A 242.80 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.44;MQ0=0;OQ=792.22;QD=13.66;SB=-213.92 GT:AD:DP:GL:GQ 0/1:33,25:57:-99.68,-17.18,-105.56:99
-chr1 4773658 . G A 112.25 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.50;MQ0=0;OQ=985.30;QD=17.59;SB=-495.06 GT:AD:DP:GL:GQ 0/1:26,30:55:-118.38,-16.57,-94.83:99
-chr1 4773754 rs12120205 T A 372.54 PASS AC=1;AF=0.50;AN=2;DB;DP=98;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1585.82;QD=16.18;SB=-556.42 GT:AD:DP:GL:GQ 0/1:49,49:98:-191.38,-29.51,-188.67:99
-chr1 4774287 rs10799263 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=7;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1045.47;QD=15.84;SB=-449.52 GT:AD:DP:GL:GQ 0/1:30,36:65:-127.41,-19.58,-109.32:99
-chr1 4774365 rs10915613 G A 361.24 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1223.17;QD=16.31;SB=-630.64 GT:AD:DP:GL:GQ 0/1:38,37:73:-147.61,-22.01,-118.37:99
-chr1 4776755 rs12145180 C G 356.13 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=2.24;MQ=59.64;MQ0=0;OQ=975.57;QD=15.24;SB=-415.28 GT:AD:DP:GL:GQ 0/1:32,32:62:-119.54,-18.70,-139.99:99
-chr1 4776903 rs10915615 C A 330.11 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=59.69;MQ0=0;OQ=909.18;QD=12.12;SB=-404.10 GT:AD:DP:GL:GQ 0/1:43,32:72:-115.90,-21.70,-128.82:99
-chr1 4777460 rs12118812 T G 167.49 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=842.15;QD=11.86;SB=-431.75 GT:AD:DP:GL:GQ 0/1:41,30:70:-108.58,-21.08,-144.58:99
-chr1 4777525 rs12118818 T G 101.66 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=1.33;MQ=59.72;MQ0=0;OQ=940.16;QD=13.63;SB=-473.22 GT:AD:DP:GL:GQ 0/1:36,33:67:-117.48,-20.18,-125.31:99
-chr1 4777535 rs12143219 G T 70.17 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=4;HaplotypeScore=0.27;MQ=60.00;MQ0=0;OQ=1005.40;QD=15.47;SB=-447.46 GT:AD:DP:GL:GQ 0/1:32,33:65:-123.40,-19.58,-114.32:99
-chr1 4778731 rs1120120 C T 347.86 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=59.78;MQ0=0;OQ=1277.01;QD=15.02;SB=-471.94 GT:AD:DP:GL:GQ 0/1:47,38:84:-156.28,-25.30,-171.76:99
-chr1 4780340 rs10915616 C T 196.28 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=881.43;QD=16.95;SB=-113.96 GT:AD:DP:GL:GQ 0/1:26,26:52:-107.09,-15.66,-92.07:99
-chr1 4780435 rs12121890 T C 347.71 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.79;MQ=59.73;MQ0=0;OQ=1105.50;QD=16.26;SB=-426.60 GT:AD:DP:GL:GQ 0/1:30,38:67:-134.02,-20.18,-117.11:99
-chr1 4781127 rs12122126 T C 314.12 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.69;MQ0=0;OQ=674.99;QD=13.50;SB=-298.62 GT:AD:DP:GL:GQ 0/1:26,24:49:-85.54,-14.76,-106.72:99
-chr1 4781899 rs12117810 G A 242.85 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=58.88;MQ0=0;OQ=1031.36;QD=17.78;SB=-437.45 GT:AD:DP:GL:GQ 0/1:28,30:56:-123.30,-16.88,-83.86:99
-chr1 4782182 rs10915619 A T 438.63 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=58.65;MQ0=0;OQ=1009.97;QD=12.47;SB=-431.43 GT:AD:DP:GL:GQ 0/1:47,34:80:-128.38,-24.10,-172.98:99
-chr1 4782516 rs1883345 G A 146.28 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.45;MQ0=0;OQ=906.47;QD=11.93;SB=-338.27 GT:AD:DP:GL:GQ 0/1:44,32:71:-115.32,-21.39,-152.63:99
-chr1 4782885 rs1883346 T A 397.96 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.70;MQ=58.75;MQ0=0;OQ=1064.02;QD=14.99;SB=-456.50 GT:AD:DP:GL:GQ 0/1:37,34:70:-130.77,-21.08,-141.61:99
-chr1 4782955 rs1883347 T C 221.56 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=4.24;MQ=59.50;MQ0=0;OQ=856.09;QD=11.57;SB=-450.96 GT:AD:DP:GL:GQ 0/1:43,30:73:-110.88,-21.99,-176.74:99
-chr1 4783491 rs4654610 T C 960.35 Indel AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=11.46;MQ=47.61;MQ0=0;QD=14.12;SB=-407.25 GT:AD:DP:GL:GQ 0/1:31,37:63:-118.30,-18.98,-112.03:99
-chr1 4793106 rs61766789 G A 240.39 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.34;MQ=58.98;MQ0=1;OQ=1230.74;QD=17.33;SB=-554.58 GT:AD:DP:GL:GQ 0/1:35,36:69:-147.14,-20.78,-120.71:99
-chr1 4794663 . C T 274.23 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.43;MQ0=0;OQ=833.44;QD=12.63;SB=-440.37 GT:AD:DP:GL:GQ 0/1:40,26:66:-106.51,-19.88,-144.25:99
-chr1 4794952 rs12074481 C A 271.91 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=57.82;MQ0=0;OQ=1066.30;QD=15.02;SB=-452.97 GT:AD:DP:GL:GQ 0/1:33,38:69:-130.70,-20.79,-110.83:99
-chr1 4798693 rs7522386 A G 341.25 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.98;MQ=58.39;MQ0=0;OQ=1056.56;QD=15.77;SB=-495.12 GT:AD:DP:GL:GQ 0/1:31,36:65:-128.52,-19.58,-122.92:99
-chr1 4801597 rs7527319 C A 582.07 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=923.07;QD=13.78;SB=-344.17 GT:AD:DP:GL:GQ 0/1:34,33:66:-115.47,-19.88,-121.89:99
-chr1 4806096 rs7547779 T C 457.63 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.53;MQ0=0;OQ=897.02;QD=13.39;SB=-364.21 GT:AD:DP:GL:GQ 0/1:34,33:65:-112.57,-19.58,-135.93:99
-chr1 4807563 rs11582327 T C 467.91 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.73;MQ0=0;OQ=911.00;QD=13.40;SB=-422.86 GT:AD:DP:GL:GQ 0/1:32,36:67:-114.58,-20.19,-127.73:99
-chr1 4807672 rs7536960 T C 326.99 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=60.00;MQ0=0;OQ=720.71;QD=12.64;SB=-286.29 GT:AD:DP:GL:GQ 0/1:27,30:55:-91.93,-16.58,-105.91:99
-chr1 4808516 rs6669130 G A 323.43 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=59.98;MQ0=0;OQ=1529.46;QD=17.58;SB=-724.76 GT:AD:DP:GL:GQ 0/1:42,45:83:-181.23,-25.00,-146.35:99
-chr1 4808719 . T G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=2;HaplotypeScore=4.69;MQ=58.91;MQ0=0;OQ=57.76;QD=0.90;SB=95.29 GT:AD:DP:GL:GQ 0/1:40,24:48:-23.52,-14.46,-139.84:90.60
-chr1 4808761 rs6683849 A G 156.55 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=737.58;QD=13.17;SB=-272.54 GT:AD:DP:GL:GQ 0/1:30,26:56:-93.91,-16.87,-119.65:99
-chr1 4808953 rs12725011 G A 96.81 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=3;HaplotypeScore=1.25;MQ=59.67;MQ0=0;OQ=1362.18;QD=19.46;SB=-645.68 GT:AD:DP:GL:GQ 0/1:29,41:69:-160.29,-20.79,-101.64:99
-chr1 4808976 rs11582462 A G 74 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=3.61;MQ=59.32;MQ0=0;OQ=923.86;QD=13.59;SB=-481.59 GT:AD:DP:GL:GQ 0/1:33,35:64:-114.94,-19.28,-135.51:99
-chr1 4809567 rs11582936 A C 302.66 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.32;MQ=59.67;MQ0=0;OQ=605.80;QD=10.63;SB=-281.94 GT:AD:DP:GL:GQ 0/1:26,30:52:-79.53,-15.67,-97.13:99
-chr1 4809668 rs7543326 T C 173.23 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=1.68;MQ=59.71;MQ0=0;OQ=1092.10;QD=13.82;SB=-474.60 GT:AD:DP:GL:GQ 0/1:37,42:79:-136.31,-23.81,-148.02:99
-chr1 4811032 rs6693945 T C 292.95 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=59.41;MQ0=0;OQ=916.53;QD=14.55;SB=-321.25 GT:AD:DP:GL:GQ 0/1:30,31:62:-117.13,-22.19,-125.33:99
-chr1 4811983 rs2209167 G A 414.43 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=59.70;MQ0=0;OQ=1021.76;QD=13.10;SB=-414.40 GT:AD:DP:GL:GQ 0/1:45,33:75:-128.08,-22.62,-135.03:99
-chr1 4813003 rs6426439 C T 133.12 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=3.37;MQ=59.50;MQ0=0;OQ=1367.37;QD=18.48;SB=-705.27 GT:AD:DP:GL:GQ 0/1:34,40:72:-161.71,-21.69,-122.06:99
-chr1 4813419 rs1886113 T G 294.59 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=612.34;QD=12.76;SB=-248.40 GT:AD:DP:GL:GQ 0/1:25,23:47:-78.67,-14.15,-95.57:99
-chr1 4813733 rs10915628 T C 146.41 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=870.49;QD=12.26;SB=-270.52 GT:AD:DP:GL:GQ 0/1:41,30:71:-111.72,-21.39,-167.00:99
-chr1 4813800 rs10915631 C T 467.08 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=60.00;MQ0=0;OQ=1109.44;QD=15.20;SB=-509.01 GT:AD:DP:GL:GQ 0/1:39,34:73:-136.22,-21.99,-139.36:99
-chr1 4813826 rs10799266 A G 440.81 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=1025.69;QD=13.50;SB=-528.56 GT:AD:DP:GL:GQ 0/1:40,36:76:-128.75,-22.90,-159.57:99
-chr1 4814770 rs6426440 C A 361.03 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=964.05;QD=12.68;SB=-378.13 GT:AD:DP:GL:GQ 0/1:42,34:76:-122.59,-22.91,-131.06:99
-chr1 4814802 rs6426441 A T 191.96 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=5.04;MQ=59.57;MQ0=0;OQ=882.35;QD=13.17;SB=-416.80 GT:AD:DP:GL:GQ 0/1:37,30:65:-111.10,-19.58,-134.21:99
-chr1 4815146 rs2411949 G T 0.34 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=15.15;MQ=59.31;MQ0=0;OQ=1233.12;QD=16.23;SB=-582.79 GT:AD:DP:GL:GQ 0/1:35,40:72:-148.29,-21.69,-101.37:99
-chr1 4815330 rs6658680 A G 154.72 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=57.17;MQ0=0;OQ=454.29;QD=9.09;SB=-126.50 GT:AD:DP:GL:GQ 0/1:29,21:47:-62.88,-14.17,-108.85:99
-chr1 4815340 rs6692964 G T 169.92 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=56.50;MQ0=0;OQ=607.11;QD=11.90;SB=-203.41 GT:AD:DP:GL:GQ 0/1:29,22:51:-79.35,-15.36,-103.70:99
-chr1 4815344 rs6692966 G A 446.58 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.57;MQ0=0;OQ=669.90;QD=12.88;SB=-297.81 GT:AD:DP:GL:GQ 0/1:28,24:50:-85.35,-15.08,-90.67:99
-chr1 4815634 rs2147028 C A 82.12 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=1.79;MQ=59.43;MQ0=0;OQ=1001.39;QD=15.41;SB=-277.32 GT:AD:DP:GL:GQ 0/1:32,33:62:-122.10,-18.67,-102.09:99
-chr1 4815904 rs2209166 G A 117.08 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=60.00;MQ0=0;OQ=1754.50;QD=22.21;SB=-892.01 GT:AD:DP:GL:GQ 0/1:28,51:79:-202.53,-23.80,-99.82:99
-chr1 4816064 rs6693706 G T 446.40 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.64;MQ0=0;OQ=733.52;QD=14.11;SB=-350.37 GT:AD:DP:GL:GQ 0/1:26,26:52:-92.30,-15.67,-93.55:99
-chr1 4816465 rs1535736 C T 112.29 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=1112.33;QD=17.38;SB=-338.80 GT:AD:DP:GL:GQ 0/1:31,33:64:-133.80,-19.28,-110.54:99
-chr1 4816766 rs1535734 A G 420.29 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=908.64;QD=12.62;SB=-359.52 GT:AD:DP:GL:GQ 0/1:39,33:70:-115.23,-21.09,-156.36:99
-chr1 4817101 rs6693352 A G 227.39 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.08;MQ=59.68;MQ0=0;OQ=949.71;QD=13.19;SB=-443.55 GT:AD:DP:GL:GQ 0/1:38,34:70:-119.35,-21.09,-147.05:99
-chr1 4817128 rs2898848 G A 216.99 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=1195.65;QD=16.61;SB=-558.57 GT:AD:DP:GL:GQ 0/1:36,36:72:-144.54,-21.69,-131.83:99
-chr1 4817320 rs2209165 C T 145.82 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.39;MQ0=0;OQ=1415.52;QD=20.82;SB=-731.10 GT:AD:DP:GL:GQ 0/1:27,41:68:-165.32,-20.49,-90.68:99
-chr1 4817405 rs2209164 A G 118.02 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.63;MQ0=0;OQ=527.84;QD=8.51;SB=-187.44 GT:AD:DP:GL:GQ 0/1:40,22:60:-74.14,-18.07,-157.62:99
-chr1 4817514 rs2209163 G A 238.41 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.72;MQ0=0;OQ=933.49;QD=13.93;SB=-217.50 GT:AD:DP:GL:GQ 0/1:38,29:66:-116.53,-19.90,-117.09:99
-chr1 4817749 rs3938469 A G 107.60 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=486.41;QD=8.11;SB=-117.18 GT:AD:DP:GL:GQ 0/1:41,19:60:-70.00,-18.07,-168.54:99
-chr1 4817969 rs2093769 G A 229.16 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.14;MQ=59.44;MQ0=0;OQ=1190.09;QD=14.51;SB=-381.33 GT:AD:DP:GL:GQ 0/1:44,38:79:-146.09,-23.80,-153.77:99
-chr1 4818044 rs2093768 A G 314.22 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.33;MQ0=0;OQ=811.36;QD=13.09;SB=-280.55 GT:AD:DP:GL:GQ 0/1:29,33:61:-102.81,-18.39,-114.06:99
-chr1 4818509 rs10159142 G A 308.93 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.55;MQ=58.95;MQ0=0;OQ=899.59;QD=15.51;SB=-448.42 GT:AD:DP:GL:GQ 0/1:30,28:58:-110.72,-17.47,-107.08:99
-chr1 4818666 rs10799268 T C 278.30 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.42;MQ0=0;OQ=887.47;QD=13.87;SB=-404.24 GT:AD:DP:GL:GQ 0/1:33,31:62:-110.70,-18.67,-130.15:99
-chr1 4818872 rs10753387 T C 88.47 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.63;MQ=55.54;MQ0=0;OQ=718.25;QD=13.30;SB=-324.13 GT:AD:DP:GL:GQ 0/1:25,29:53:-91.08,-15.98,-99.45:99
-chr1 4819100 rs10753388 G A 0.17 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=17.64;MQ=55.33;MQ0=0;OQ=1324.27;QD=17.66;SB=-679.33 GT:AD:DP:GL:GQ 0/1:36,39:70:-156.80,-21.09,-111.06:99
-chr1 4819163 rs10753389 A G 70.61 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=49.63;MQ0=1;OQ=764.05;QD=12.53;SB=-256.89 GT:AD:DP:GL:GQ 0/1:33,28:59:-97.46,-17.77,-133.52:99
-chr1 4819348 rs10915632 G A 8.54 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=2;HaplotypeScore=6.46;MQ=58.48;MQ0=0;OQ=1415.77;QD=15.91;SB=-658.28 GT:AD:DP:GL:GQ 0/1:47,42:87:-171.06,-26.20,-164.95:99
-chr1 4819622 rs10799269 C G 347.45 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=59.05;MQ0=0;OQ=934.79;QD=12.98;SB=-429.59 GT:AD:DP:GL:GQ 0/1:41,31:69:-117.56,-20.80,-181.53:99
-chr1 4819655 rs10799270 G A 353.44 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.56;MQ0=0;OQ=1064.88;QD=14.39;SB=-436.38 GT:AD:DP:GL:GQ 0/1:41,33:74:-132.06,-22.29,-148.73:99
-chr1 4819737 rs2147027 T C 200.63 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.22;MQ=55.94;MQ0=0;OQ=778.52;QD=14.69;SB=-321.29 GT:AD:DP:GL:GQ 0/1:25,28:51:-96.50,-15.36,-95.69:99
-chr1 4820060 rs2181701 T C 0.91 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=11.39;MQ=52.25;MQ0=0;OQ=485.51;QD=9.52;SB=-244.48 GT:AD:DP:GL:GQ 0/1:29,22:49:-66.61,-14.77,-110.48:99
-chr1 4820091 rs4265399 G A 243.46 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=50.14;MQ0=0;OQ=512.92;QD=10.06;SB=-45.99 GT:AD:DP:GL:GQ 0/1:32,19:48:-69.05,-14.48,-96.83:99
-chr1 4820096 rs2181700 T G 75.96 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=50.99;MQ0=0;OQ=433.90;QD=8.34;SB=-40.01 GT:AD:DP:GL:GQ 0/1:33,19:51:-62.03,-15.36,-122.01:99
-chr1 4820154 rs9725470 C T 281.54 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=47.90;MQ0=2;OQ=495.62;QD=9.01;SB=-102.52 GT:AD:DP:GL:GQ 0/1:37,18:51:-68.22,-15.38,-108.69:99
-chr1 4820216 rs9726479 T G 79.72 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=1.15;MQ=45.62;MQ0=0;OQ=697.41;QD=12.24;SB=-299.44 GT:AD:DP:GL:GQ 0/1:30,27:55:-89.59,-16.56,-110.14:99
-chr1 4820227 rs9725796 C A 40.52 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=3;HaplotypeScore=0.33;MQ=47.59;MQ0=0;OQ=717.90;QD=11.58;SB=-300.16 GT:AD:DP:GL:GQ 0/1:34,28:59:-92.84,-17.77,-118.69:99
-chr1 4820388 rs9726805 T C 201.46 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=2.98;MQ=51.02;MQ0=0;OQ=985.45;QD=12.17;SB=-457.03 GT:AD:DP:GL:GQ 0/1:42,39:76:-124.72,-22.89,-168.04:99
-chr1 4820748 . A G 1.13 PASS AC=1;AF=0.50;AN=2;DP=50;Dels=0.00;HRun=0;HaplotypeScore=3.54;MQ=35.53;MQ0=6;OQ=268.28;QD=5.37;SB=-1.83 GT:AD:DP:GL:GQ 0/1:28,21:34:-40.35,-10.24,-88.65:99
-chr1 4820850 . T C 0.21 PASS AC=1;AF=0.50;AN=2;DP=27;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=43.66;MQ0=1;OQ=84.14;QD=3.12;SB=-53.32 GT:AD:DP:GL:GQ 0/1:14,12:16:-16.52,-4.83,-39.77:99
-chr1 4820858 . G A 0.93 PASS AC=1;AF=0.50;AN=2;DP=29;Dels=0.00;HRun=0;HaplotypeScore=4.23;MQ=41.11;MQ0=1;OQ=153.45;QD=5.29;SB=-40.65 GT:AD:DP:GL:GQ 0/1:13,15:17:-23.75,-5.12,-38.01:99
-chr1 4820952 rs61766808 C T 152.82 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=38.70;MQ0=1;OQ=409.25;QD=9.09;SB=-225.93 GT:AD:DP:GL:GQ 0/1:30,15:42:-56.86,-12.66,-95.36:99
-chr1 4821240 rs9726227 C T 470.14 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=37.63;MQ0=1;OQ=887.90;QD=12.87;SB=-408.68 GT:AD:DP:GL:GQ 0/1:36,33:62:-110.75,-18.67,-130.57:99
-chr1 4821376 rs9726241 C A 8.68 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=39.07;MQ0=5;OQ=305.92;QD=4.86;SB=-1.55 GT:AD:DP:GL:GQ 0/1:37,26:47:-48.04,-14.16,-121.88:99
-chr1 4821609 rs9726885 A C 47.17 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=36.89;MQ0=14;OQ=448.17;QD=5.67;SB=-207.28 GT:AD:DP:GL:GQ 0/1:47,32:61:-66.47,-18.37,-159.23:99
-chr1 4821773 rs9726925 A G 101.03 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=38.22;MQ0=2;OQ=859.75;QD=9.35;SB=-417.48 GT:AD:DP:GL:GQ 0/1:47,45:74:-111.55,-22.29,-173.37:99
-chr1 4821818 rs12135318 C A 320.75 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=44.85;MQ0=0;OQ=1111.50;QD=12.21;SB=-470.83 GT:AD:DP:GL:GQ 0/1:41,50:79:-138.22,-23.79,-149.34:99
-chr1 4821875 rs10915634 A G 55.48 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=46.72;MQ0=5;OQ=657.16;QD=7.64;SB=-166.48 GT:AD:DP:GL:GQ 0/1:46,40:75:-91.61,-22.61,-188.45:99
-chr1 4822060 rs7411909 A G 472.44 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.58;MQ0=0;OQ=844.08;QD=14.07;SB=-331.93 GT:AD:DP:GL:GQ 0/1:31,29:60:-105.77,-18.08,-125.13:99
-chr1 4822115 rs4617370 G A 221.57 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=59.00;MQ0=0;OQ=1387.37;QD=17.13;SB=-675.38 GT:AD:DP:GL:GQ 0/1:40,41:81:-166.44,-24.42,-127.76:99
-chr1 4822681 rs6660173 C T 0.10 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.01;HRun=3;HaplotypeScore=10.96;MQ=52.45;MQ0=0;OQ=1014.70;QD=13.71;SB=-426.92 GT:AD:DP:GL:GQ 0/1:42,31:73:-126.44,-21.69,-150.88:99
-chr1 4822687 rs6660177 C A 163.11 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=4.00;MQ=52.56;MQ0=0;OQ=900.97;QD=12.01;SB=-430.11 GT:AD:DP:GL:GQ 0/1:44,31:74:-115.67,-22.28,-156.45:99
-chr1 4822710 rs6668068 T C 72.65 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=2.96;MQ=50.82;MQ0=0;OQ=906.69;QD=11.78;SB=-477.93 GT:AD:DP:GL:GQ 0/1:44,33:75:-116.54,-22.59,-176.01:99
-chr1 4822958 rs6665282 A G 464.18 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.16;MQ0=0;OQ=785.44;QD=13.78;SB=-331.28 GT:AD:DP:GL:GQ 0/1:30,27:57:-99.00,-17.17,-122.67:99
-chr1 4823049 rs6665388 A G 56.61 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=2.47;MQ=55.61;MQ0=0;OQ=907.22;QD=12.60;SB=-445.14 GT:AD:DP:GL:GQ 0/1:36,36:67:-114.19,-20.18,-139.94:99
-chr1 4823137 rs12087020 A G 358.36 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=54.38;MQ0=0;OQ=1125.73;QD=15.86;SB=-588.93 GT:AD:DP:GL:GQ 0/1:32,39:69:-136.64,-20.78,-130.19:99
-chr1 4823207 rs10915638 C T 285.22 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=57.74;MQ0=0;OQ=1338.14;QD=15.93;SB=-487.03 GT:AD:DP:GL:GQ 0/1:44,40:82:-161.79,-24.70,-152.84:99
-chr1 4823247 rs10915639 C T 70.93 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=3;HaplotypeScore=1.40;MQ=59.24;MQ0=0;OQ=1272.31;QD=17.19;SB=-602.12 GT:AD:DP:GL:GQ 0/1:37,37:73:-152.51,-22.00,-119.03:99
-chr1 4823334 rs10915640 G T 485.36 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.40;MQ0=0;OQ=978.54;QD=13.05;SB=-397.99 GT:AD:DP:GL:GQ 0/1:40,35:71:-122.52,-21.38,-136.84:99
-chr1 4823422 rs10915641 G A 453.84 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=45.14;MQ0=3;OQ=955.26;QD=11.79;SB=-332.42 GT:AD:DP:GL:GQ 0/1:46,35:73:-120.80,-21.99,-150.35:99
-chr1 4824006 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=60;Dels=0.03;HRun=20;HaplotypeScore=17.44;MQ=44.47;MQ0=0;OQ=216.45;QD=3.61;SB=56.16 GT:AD:DP:GL:GQ 0/1:34,24:43:-37.29,-12.36,-108.08:99
-chr1 4824255 rs6656943 G A 241.34 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=48.13;MQ0=0;OQ=486.99;QD=9.37;SB=-207.48 GT:AD:DP:GL:GQ 0/1:29,22:45:-65.55,-13.57,-87.60:99
-chr1 4824523 rs6674586 T A 163.54 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=48.28;MQ0=0;OQ=656.95;QD=12.17;SB=-109.40 GT:AD:DP:GL:GQ 0/1:27,27:47:-83.14,-14.16,-95.96:99
-chr1 4824573 rs6674680 T C 13.56 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=52.32;MQ0=0;OQ=270.57;QD=5.11;SB=-156.88 GT:AD:DP:GL:GQ 0/1:35,18:46:-44.20,-13.86,-137.80:99
-chr1 4824574 . G A 7.24 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=52.42;MQ0=0;OQ=361.86;QD=6.83;SB=-143.57 GT:AD:DP:GL:GQ 0/1:34,19:46:-53.32,-13.85,-117.68:99
-chr1 4824682 rs12135493 G A 249.33 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=51.42;MQ0=1;OQ=988.12;QD=12.83;SB=-444.35 GT:AD:DP:GL:GQ 0/1:44,32:73:-124.08,-21.99,-153.59:99
-chr1 4824703 rs6671779 A G 149.25 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=3.56;MQ=45.45;MQ0=6;OQ=857.95;QD=10.46;SB=-366.21 GT:AD:DP:GL:GQ 0/1:48,33:70:-110.16,-21.08,-158.61:99
-chr1 4824716 rs6674795 T A 84.16 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=5.06;MQ=43.80;MQ0=7;OQ=985.67;QD=11.60;SB=-441.50 GT:AD:DP:GL:GQ 0/1:51,34:73:-123.84,-21.98,-157.76:99
-chr1 4824850 rs36062377 G T 24.04 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=3;HaplotypeScore=2.62;MQ=51.81;MQ0=1;OQ=1235.06;QD=17.15;SB=-475.54 GT:AD:DP:GL:GQ 0/1:30,42:67:-146.97,-20.18,-98.26:99
-chr1 4825033 rs7529540 T C 245.46 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=39.74;MQ0=8;OQ=558.43;QD=7.55;SB=-301.05 GT:AD:DP:GL:GQ 0/1:47,27:63:-78.11,-18.99,-158.23:99
-chr1 4825352 rs4559467 G A 108.52 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=5.62;MQ=48.67;MQ0=0;OQ=560.80;QD=11.22;SB=-300.78 GT:AD:DP:GL:GQ 0/1:27,20:40:-71.42,-12.05,-75.01:99
-chr1 4825513 rs4638087 G C 326.19 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=1176.04;QD=19.60;SB=-421.03 GT:AD:DP:GL:GQ 0/1:27,33:59:-138.66,-17.78,-117.95:99
-chr1 4825553 rs4551566 C G 30.76 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.33;MQ0=0;OQ=1250.51;QD=22.33;SB=-448.38 GT:AD:DP:GL:GQ 0/1:22,34:55:-144.91,-16.57,-96.90:99
-chr1 4826034 rs7529926 A G 223.14 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=2.45;MQ=57.60;MQ0=0;OQ=1139.50;QD=13.57;SB=-533.50 GT:AD:DP:GL:GQ 0/1:44,39:83:-142.23,-25.00,-178.33:99
-chr1 4826162 rs7525613 C T 13.44 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=2;HaplotypeScore=3.45;MQ=59.36;MQ0=1;OQ=993.15;QD=10.80;SB=-409.28 GT:AD:DP:GL:GQ 0/1:59,33:90:-129.72,-27.12,-195.16:99
-chr1 4826345 rs2104305 G T 184.73 PASS AC=1;AF=0.50;AN=2;DB;DP=40;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=57.85;MQ0=1;OQ=505.67;QD=12.64;SB=-209.45 GT:AD:DP:GL:GQ 0/1:21,19:39:-65.60,-11.75,-75.98:99
-chr1 4826423 rs2093767 G A 138.65 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=58.83;MQ0=0;OQ=815.33;QD=15.68;SB=-288.73 GT:AD:DP:GL:GQ 0/1:27,25:52:-100.48,-15.67,-95.85:99
-chr1 4826585 rs2093766 C T 86.86 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=59.52;MQ0=0;OQ=705.53;QD=13.07;SB=-332.40 GT:AD:DP:GL:GQ 0/1:31,23:54:-90.10,-16.27,-110.86:99
-chr1 4826810 rs10915643 T G 203.85 PASS AC=1;AF=0.50;AN=2;DB;DP=44;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=57.12;MQ0=0;OQ=525.52;QD=11.94;SB=-258.86 GT:AD:DP:GL:GQ 0/1:23,21:42:-68.49,-12.65,-82.71:99
-chr1 4827586 rs55916988 A T 25.36 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=889.58;QD=14.35;SB=-432.48 GT:AD:DP:GL:GQ 0/1:33,29:62:-110.92,-18.68,-123.75:99
-chr1 4827658 rs10915644 C T 105.99 PASS AC=1;AF=0.50;AN=2;DB;DP=104;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=60.00;MQ0=0;OQ=1865.95;QD=17.94;SB=-912.01 GT:AD:DP:GL:GQ 0/1:46,58:101:-220.30,-30.43,-168.62:99
-chr1 4828047 rs10915645 G T 162.71 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.35;MQ0=0;OQ=1117.38;QD=13.97;SB=-570.65 GT:AD:DP:GL:GQ 0/1:41,39:77:-138.21,-23.19,-142.58:99
-chr1 4828218 rs10915646 T C 280.72 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=1.03;MQ=59.65;MQ0=0;OQ=827.35;QD=15.32;SB=-429.21 GT:AD:DP:GL:GQ 0/1:26,28:54:-102.28,-16.26,-103.92:99
-chr1 4829521 rs7525315 A G 34.89 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=2;HaplotypeScore=1.86;MQ=60.00;MQ0=0;OQ=437.24;QD=11.82;SB=-193.62 GT:AD:DP:GL:GQ 0/1:19,18:35:-57.55,-10.55,-75.26:99
-chr1 4829549 rs7511935 G C 92.43 PASS AC=1;AF=0.50;AN=2;DB;DP=37;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=60.00;MQ0=0;OQ=512.56;QD=13.85;SB=-232.38 GT:AD:DP:GL:GQ 0/1:19,18:33:-64.49,-9.95,-73.26:99
-chr1 4829662 rs7512035 G A 4.93 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=9.93;MQ=58.76;MQ0=0;OQ=838.03;QD=17.10;SB=-374.88 GT:AD:DP:GL:GQ 0/1:21,27:46:-104.45,-17.36,-74.24:99
-chr1 4830041 rs1886112 T C 323.11 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.65;MQ=58.39;MQ0=0;OQ=754.42;QD=11.79;SB=-313.28 GT:AD:DP:GL:GQ 0/1:35,29:61:-97.11,-18.38,-135.74:99
-chr1 4830111 rs2411950 A G 299.57 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=2.97;MQ=59.44;MQ0=0;OQ=788.01;QD=11.76;SB=-302.20 GT:AD:DP:GL:GQ 0/1:34,33:66:-101.98,-19.90,-134.57:99
-chr1 4831214 rs11588518 A G 386.42 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=58.39;MQ0=0;OQ=816.62;QD=14.85;SB=-422.33 GT:AD:DP:GL:GQ 0/1:26,29:53:-100.91,-15.96,-102.18:99
-chr1 4832304 rs10915647 T G 357.62 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.96;MQ=59.21;MQ0=0;OQ=992.87;QD=12.89;SB=-411.65 GT:AD:DP:GL:GQ 0/1:36,41:75:-125.17,-22.60,-131.25:99
-chr1 4833095 rs10489136 G A 381.62 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.25;MQ0=0;OQ=597.16;QD=11.94;SB=-271.12 GT:AD:DP:GL:GQ 0/1:30,20:49:-77.76,-14.76,-108.40:99
-chr1 4833385 rs11809159 G A 313.41 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.57;MQ0=0;OQ=671.57;QD=12.44;SB=-350.34 GT:AD:DP:GL:GQ 0/1:33,21:52:-86.11,-15.67,-111.35:99
-chr1 4834568 rs12691490 G A 57.53 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=59.19;MQ0=0;OQ=1072.80;QD=14.30;SB=-179.14 GT:AD:DP:GL:GQ 0/1:41,34:74:-132.86,-22.29,-148.17:99
-chr1 4834712 rs11810903 C T 299.28 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=59.50;MQ0=0;OQ=847.25;QD=15.99;SB=-334.31 GT:AD:DP:GL:GQ 0/1:27,26:50:-103.07,-15.06,-90.22:99
-chr1 4835505 . G A 70.11 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=57.18;MQ0=2;OQ=1406.02;QD=19.00;SB=-566.58 GT:AD:DP:GL:GQ 0/1:33,41:71:-165.27,-21.39,-109.48:99
-chr1 4835574 rs60862815 A G 389.11 PASS AC=1;AF=0.50;AN=2;DB;DP=96;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=52.44;MQ0=0;OQ=1406.97;QD=14.66;SB=-683.24 GT:AD:DP:GL:GQ 0/1:48,48:95:-172.59,-28.61,-196.25:99
-chr1 4835660 . A G 23.51 PASS AC=1;AF=0.50;AN=2;DP=96;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=53.01;MQ0=0;OQ=1833.96;QD=19.10;SB=-522.87 GT:AD:DP:GL:GQ 0/1:39,57:96:-215.59,-28.91,-159.74:99
-chr1 4837550 rs35283465 T G 356.52 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1133.74;QD=16.67;SB=-504.82 GT:AD:DP:GL:GQ 0/1:30,38:68:-137.14,-20.48,-110.12:99
-chr1 4837913 rs10753390 T C 137.37 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=2.60;MQ=60.00;MQ0=0;OQ=941.83;QD=14.72;SB=-459.61 GT:AD:DP:GL:GQ 0/1:30,34:62:-116.15,-18.68,-119.75:99
-chr1 4839426 rs942248 G A 447.55 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.57;MQ=60.00;MQ0=0;OQ=1139.23;QD=16.75;SB=-553.39 GT:AD:DP:GL:GQ 0/1:34,34:68:-137.70,-20.50,-108.59:99
-chr1 4841270 rs10915651 A G 240.97 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=57.66;MQ0=0;OQ=816.55;QD=11.66;SB=-378.12 GT:AD:DP:GL:GQ 0/1:39,31:68:-105.42,-20.48,-155.28:99
-chr1 4841714 rs4654463 A C 478.61 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=555.94;QD=9.75;SB=-254.73 GT:AD:DP:GL:GQ 0/1:35,22:56:-75.74,-16.86,-132.35:99
-chr1 4844074 rs10733017 T C 2.18 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=11.82;MQ=59.63;MQ0=0;OQ=699.51;QD=11.10;SB=-327.09 GT:AD:DP:GL:GQ 0/1:36,27:62:-91.91,-18.68,-144.88:99
-chr1 4844167 rs11576728 C A 571.03 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.76;MQ0=0;OQ=1050.49;QD=13.64;SB=-532.68 GT:AD:DP:GL:GQ 0/1:42,35:77:-131.52,-23.19,-153.03:99
-chr1 4844702 rs7543026 G A 584.71 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.93;MQ0=0;OQ=948.11;QD=15.54;SB=-391.87 GT:AD:DP:GL:GQ 0/1:33,28:60:-116.18,-18.08,-104.09:99
-chr1 4845341 rs6658585 A C 76.93 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.00;MQ=59.18;MQ0=0;OQ=1071.52;QD=16.74;SB=-367.56 GT:AD:DP:GL:GQ 0/1:26,38:62:-129.11,-18.67,-97.88:99
-chr1 4845498 rs12057393 G A 364.71 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=12;HaplotypeScore=3.79;MQ=47.74;MQ0=0;QD=4.19;SB=-24.81 GT:AD:DP:GL:GQ 0/1:67,20:77:-62.95,-23.20,-211.18:99
-chr1 4845501 . G A 272.57 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=2;HaplotypeScore=5.43;MQ=47.58;MQ0=0;QD=3.17;SB=59.32 GT:AD:DP:GL:GQ 0/1:69,17:79:-54.34,-23.80,-226.78:99
-chr1 4845504 . G A 237.01 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=2;HaplotypeScore=5.58;MQ=47.42;MQ0=0;QD=2.79;SB=100.89 GT:AD:DP:GL:GQ 0/1:69,16:79:-50.79,-23.80,-233.92:99
-chr1 4846112 rs34320332 A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=25.56;MQ=59.10;MQ0=1;OQ=980.42;QD=12.41;SB=-508.92 GT:AD:DP:GL:GQ 0/1:43,36:73:-123.31,-21.99,-148.19:99
-chr1 4846138 rs4141866 T G 321.22 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1084.74;QD=12.91;SB=-515.88 GT:AD:DP:GL:GQ 0/1:44,39:81:-136.16,-24.40,-149.14:99
-chr1 4846537 rs2224810 C T 118.17 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=2.15;MQ=60.00;MQ0=0;OQ=819.69;QD=11.71;SB=-407.37 GT:AD:DP:GL:GQ 0/1:43,26:69:-109.19,-23.93,-141.50:99
-chr1 4846628 rs2209160 C T 102.30 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=6.02;MQ=59.71;MQ0=0;OQ=1103.05;QD=13.96;SB=-498.70 GT:AD:DP:GL:GQ 0/1:45,34:78:-137.10,-23.51,-139.74:99
-chr1 4847013 rs4654617 G A 341.44 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.65;MQ=60.12;MQ0=0;OQ=1328.73;QD=14.44;SB=-558.05 GT:AD:DP:GL:GQ 0/1:51,41:91:-163.57,-27.42,-178.46:99
-chr1 4847234 rs4654618 G A 257.57 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.79;MQ0=0;OQ=1473.23;QD=16.93;SB=-644.65 GT:AD:DP:GL:GQ 0/1:44,43:86:-176.51,-25.90,-155.83:99
-chr1 4847304 rs11576619 A C 410.62 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1115.68;QD=12.54;SB=-555.85 GT:AD:DP:GL:GQ 0/1:50,39:89:-141.65,-26.80,-188.69:99
-chr1 4848245 rs10915655 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.04;HRun=13;HaplotypeScore=40.55;MQ=53.84;MQ0=0;OQ=783.98;QD=11.53;SB=-399.49 GT:AD:DP:GL:GQ 0/1:35,30:57:-98.55,-16.87,-112.34:99
-chr1 4848259 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=13;HaplotypeScore=8.75;MQ=53.39;MQ0=0;OQ=145.61;QD=2.24;SB=43.71 GT:AD:DP:GL:GQ 0/1:50,15:51:-33.22,-15.38,-143.27:99
-chr1 4848272 rs59534952 C T 83.18 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=1;HaplotypeScore=2.85;MQ=55.61;MQ0=0;OQ=567.99;QD=11.83;SB=-226.73 GT:AD:DP:GL:GQ 0/1:29,19:46:-73.94,-13.86,-98.14:99
-chr1 4849613 rs2224809 G T 40.55 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=5.98;MQ=59.05;MQ0=0;OQ=753.24;QD=11.77;SB=-371.10 GT:AD:DP:GL:GQ 0/1:36,28:62:-97.28,-18.68,-118.15:99
-chr1 4851425 rs4654464 C A 99.04 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=3;HaplotypeScore=1.30;MQ=59.74;MQ0=0;OQ=1201.43;QD=13.50;SB=-585.67 GT:AD:DP:GL:GQ 0/1:47,42:87:-149.63,-26.21,-164.62:99
-chr1 4851649 rs1544062 A C 506.42 PASS AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.80;MQ0=0;OQ=1031.53;QD=11.21;SB=-464.74 GT:AD:DP:GL:GQ 0/1:52,40:90:-133.54,-27.11,-194.44:99
-chr1 4852648 rs6664880 A G 404.16 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=757.37;QD=15.15;SB=-338.35 GT:AD:DP:GL:GQ 0/1:21,29:49:-93.79,-14.77,-78.78:99
-chr1 4853388 rs16839786 G T 224.38 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=53.58;MQ0=0;OQ=920.28;QD=16.43;SB=-211.55 GT:AD:DP:GL:GQ 0/1:26,30:55:-111.88,-16.57,-81.39:99
-chr1 4853673 rs61764897 T A 731.06 Indel AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.62;MQ0=0;QD=11.25;SB=-257.66 GT:AD:DP:GL:GQ 0/1:39,26:64:-95.67,-19.28,-148.40:99
-chr1 4854729 rs11578197 G A 258.41 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.18;MQ=59.65;MQ0=0;OQ=1050.33;QD=16.16;SB=-476.48 GT:AD:DP:GL:GQ 0/1:33,32:63:-127.30,-18.99,-107.48:99
-chr1 4855018 rs16839789 C T 363.83 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=59.33;MQ0=0;OQ=1117.05;QD=14.70;SB=-538.76 GT:AD:DP:GL:GQ 0/1:39,37:73:-136.99,-22.00,-128.05:99
-chr1 4855722 rs6426446 C T 346.09 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.43;MQ0=0;OQ=1302.13;QD=17.84;SB=-634.73 GT:AD:DP:GL:GQ 0/1:34,39:71:-154.89,-21.40,-105.41:99
-chr1 4855930 rs6426447 T C 166.41 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=57.78;MQ0=0;OQ=489.14;QD=8.58;SB=-219.87 GT:AD:DP:GL:GQ 0/1:31,26:53:-68.18,-15.98,-120.90:99
-chr1 4856415 rs7547152 G C 495.16 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=942.12;QD=15.20;SB=-441.90 GT:AD:DP:GL:GQ 0/1:35,27:61:-115.88,-18.38,-149.41:99
-chr1 4857229 rs58851741 C T 459.60 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=966.78;QD=16.67;SB=-403.91 GT:AD:DP:GL:GQ 0/1:27,31:57:-117.15,-17.19,-83.93:99
-chr1 4857438 rs6663654 A G 150.02 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.74;MQ=59.66;MQ0=0;OQ=1188.14;QD=17.73;SB=-597.99 GT:AD:DP:GL:GQ 0/1:26,41:63:-141.07,-18.98,-97.28:99
-chr1 4857938 rs4654466 T G 14.09 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=3;HaplotypeScore=2.02;MQ=60.00;MQ0=0;OQ=2439.19;QD=33.41;SB=-1032.90 GT:AD:DP:GL:GQ 1/1:0,73:72:-247.54,-21.70,-0.04:99
-chr1 4857962 rs4654620 T C 617.25 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2216.51;QD=34.63;SB=-1013.85 GT:AD:DP:GL:GQ 1/1:0,64:63:-225.26,-18.98,-0.03:99
-chr1 4858133 rs12026056 C T 160.83 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.48;MQ0=0;OQ=1391.17;QD=19.32;SB=-472.46 GT:AD:DP:GL:GQ 0/1:31,41:70:-163.49,-21.09,-105.37:99
-chr1 4858331 rs2411952 T G 714.78 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2714.55;QD=33.93;SB=-941.23 GT:AD:DP:GL:GQ 1/1:0,80:78:-275.06,-23.49,-0.02:99
-chr1 4858799 rs10915656 A G 325.06 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=541.63;QD=8.88;SB=-253.33 GT:AD:DP:GL:GQ 0/1:37,24:61:-75.83,-18.39,-146.51:99
-chr1 4859646 rs2031246 A G 219.32 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.68;MQ0=0;OQ=1950.88;QD=29.12;SB=-966.30 GT:AD:DP:GL:GQ 1/1:0,67:62:-198.73,-18.70,-0.06:99
-chr1 4859671 . T C 13.11 PASS AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=1;HaplotypeScore=3.64;MQ=59.06;MQ0=0;OQ=883.63;QD=12.81;SB=-329.17 GT:AD:DP:GL:GQ 0/1:37,32:67:-111.83,-20.19,-139.59:99
-chr1 4859954 rs34895557 G T 206.38 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.25;MQ=59.24;MQ0=0;OQ=744.21;QD=13.53;SB=-251.43 GT:AD:DP:GL:GQ 0/1:28,27:52:-93.37,-15.67,-91.09:99
-chr1 4860771 rs1998542 A G 287.69 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=1092.68;QD=14.57;SB=-569.57 GT:AD:DP:GL:GQ 0/1:37,38:74:-134.84,-22.29,-148.74:99
-chr1 4861394 rs12564397 A T 437.24 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=1000.40;QD=17.86;SB=-441.86 GT:AD:DP:GL:GQ 0/1:25,31:56:-120.19,-16.87,-93.72:99
-chr1 4861557 rs35411636 G A 169.15 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=1.73;MQ=59.72;MQ0=0;OQ=1208.45;QD=18.04;SB=-440.97 GT:AD:DP:GL:GQ 0/1:30,37:64:-143.41,-19.28,-105.19:99
-chr1 4863429 . C T 229.25 PASS AC=1;AF=0.50;AN=2;DP=86;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.78;MQ0=0;OQ=1493.09;QD=17.36;SB=-728.57 GT:AD:DP:GL:GQ 0/1:41,45:85:-178.20,-25.60,-151.88:99
-chr1 4863497 rs7524606 G A 427.14 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=0;HaplotypeScore=1.18;MQ=60.00;MQ0=0;OQ=1511.71;QD=17.58;SB=-634.67 GT:AD:DP:GL:GQ 0/1:42,44:85:-180.06,-25.60,-147.35:99
-chr1 4863865 rs1980722 C T 503.84 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3056.08;QD=40.21;SB=-645.86 GT:AD:DP:GL:GQ 1/1:0,76:76:-309.21,-22.89,-0.02:99
-chr1 4864428 rs11580747 G C 245.21 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.79;MQ=59.63;MQ0=0;OQ=942.97;QD=14.97;SB=-334.34 GT:AD:DP:GL:GQ 0/1:36,27:61:-115.96,-18.38,-154.60:99
-chr1 4865012 rs17345545 A C 595.58 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1349.09;QD=16.06;SB=-446.78 GT:AD:DP:GL:GQ 0/1:36,48:82:-162.89,-24.70,-132.81:99
-chr1 4865105 rs57839229 A T 93.37 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=1.14;MQ=59.34;MQ0=0;OQ=1132.50;QD=17.98;SB=-522.98 GT:AD:DP:GL:GQ 0/1:27,36:62:-135.21,-18.67,-99.92:99
-chr1 4865351 rs4654467 A G 16.96 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.01;HRun=0;HaplotypeScore=4.70;MQ=59.78;MQ0=0;OQ=2675.08;QD=31.11;SB=-1049.26 GT:AD:DP:GL:GQ 1/1:0,84:83:-271.15,-24.72,-0.06:99
-chr1 4866087 rs10915662 A T 363.81 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.38;MQ0=0;OQ=1323.19;QD=19.75;SB=-593.71 GT:AD:DP:GL:GQ 0/1:27,40:67:-155.78,-20.18,-103.30:99
-chr1 4866400 rs12064982 G A 103.40 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=3.34;MQ=60.00;MQ0=0;OQ=973.54;QD=18.03;SB=-247.54 GT:AD:DP:GL:GQ 0/1:25,29:53:-116.61,-15.97,-79.83:99
-chr1 4866918 rs12031154 A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=24.82;MQ=54.18;MQ0=0;OQ=935.81;QD=11.27;SB=-380.06 GT:AD:DP:GL:GQ 0/1:43,40:73:-118.86,-22.00,-142.88:99
-chr1 4866921 rs12026933 G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.03;HRun=18;HaplotypeScore=19.70;MQ=54.46;MQ0=0;OQ=1554.81;QD=17.87;SB=-743.33 GT:AD:DP:GL:GQ 0/1:33,51:81:-182.28,-23.51,-100.13:99
-chr1 4867019 rs11803696 A G 583.39 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1173.47;QD=12.90;SB=-430.96 GT:AD:DP:GL:GQ 0/1:48,43:89:-147.44,-26.81,-193.48:99
-chr1 4867070 rs6672145 C T 154.08 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.79;MQ=58.49;MQ0=0;OQ=2949.30;QD=37.81;SB=-1148.66 GT:AD:DP:GL:GQ 1/1:0,78:74:-298.53,-22.29,-0.02:99
-chr1 4867333 rs10737414 C T 577.78 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=3774.90;QD=40.59;SB=-1090.96 GT:AD:DP:GL:GQ 1/1:0,93:91:-376.49,-27.41,-0.02:99
-chr1 4867363 rs7533707 A T 409.29 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.50;MQ0=0;OQ=3186.97;QD=36.63;SB=-1277.61 GT:AD:DP:GL:GQ 1/1:0,87:84:-322.30,-25.30,-0.02:99
-chr1 4867599 rs7520488 G C 176.88 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=3.17;MQ=58.98;MQ0=0;OQ=1260.85;QD=19.70;SB=-431.87 GT:AD:DP:GL:GQ 0/1:29,35:63:-148.35,-18.98,-119.77:99
-chr1 4867836 rs10753391 C T 252.04 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.73;MQ=58.82;MQ0=0;OQ=2192.96;QD=37.17;SB=-1090.48 GT:AD:DP:GL:GQ 1/1:0,58:57:-222.90,-17.17,-0.02:99
-chr1 4869610 rs10753392 A G 2.94 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=12.66;MQ=58.15;MQ0=0;OQ=2566.56;QD=33.77;SB=-1061.07 GT:AD:DP:GL:GQ 1/1:1,75:72:-260.27,-21.69,-0.02:99
-chr1 4869715 rs10753393 A G 57.47 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.94;MQ=55.52;MQ0=0;OQ=2164.34;QD=32.79;SB=-1098.81 GT:AD:DP:GL:GQ 1/1:0,66:62:-220.05,-18.68,-0.03:99
-chr1 4869773 rs10737415 G A 79.07 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.29;MQ=59.56;MQ0=0;OQ=867.20;QD=16.36;SB=-154.19 GT:AD:DP:GL:GQ 0/1:24,29:51:-105.37,-15.37,-83.26:99
-chr1 4869802 rs10753394 T C 256.85 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.38;MQ=60.00;MQ0=0;OQ=1715.99;QD=30.64;SB=-772.60 GT:AD:DP:GL:GQ 1/1:0,56:56:-175.25,-16.90,-0.06:99
-chr1 4869982 rs10915666 G A 210.38 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.64;MQ=58.75;MQ0=0;OQ=1883.17;QD=36.21;SB=-696.34 GT:AD:DP:GL:GQ 1/1:0,50:49:-191.92,-14.76,-0.02:99
-chr1 4870346 rs6675549 G A 170.55 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=4.29;MQ=57.91;MQ0=0;OQ=1211.32;QD=19.23;SB=-547.10 GT:AD:DP:GL:GQ 0/1:28,35:62:-143.11,-18.69,-84.61:99
-chr1 4870866 rs60530383 A G 40.28 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=2;HaplotypeScore=2.54;MQ=60.00;MQ0=0;OQ=824.16;QD=14.46;SB=-305.38 GT:AD:DP:GL:GQ 0/1:28,29:56:-102.57,-16.87,-109.85:99
-chr1 4871367 rs12034557 C T 506.72 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.67;MQ0=0;OQ=1054.17;QD=18.82;SB=-458.82 GT:AD:DP:GL:GQ 0/1:25,31:55:-125.27,-16.57,-85.80:99
-chr1 4871442 rs11584441 T G 5.72 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=1.95;MQ=57.60;MQ0=1;OQ=392.05;QD=7.00;SB=-149.17 GT:AD:DP:GL:GQ 0/1:35,21:54:-58.76,-16.27,-123.74:99
-chr1 4871485 rs12034590 C T 165.34 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.35;MQ0=0;OQ=1273.44;QD=19.90;SB=-540.59 GT:AD:DP:GL:GQ 0/1:26,38:62:-149.30,-18.68,-91.11:99
-chr1 4871683 rs10915667 G A 252.09 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=1.13;MQ=59.56;MQ0=0;OQ=868.47;QD=16.70;SB=-440.82 GT:AD:DP:GL:GQ 0/1:26,26:50:-105.19,-15.06,-84.43:99
-chr1 4872046 rs41524347 T G 240.01 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=531.74;QD=7.28;SB=-248.55 GT:AD:DP:GL:GQ 0/1:47,26:72:-78.15,-21.69,-181.81:99
-chr1 4872269 rs7549400 A G 96.19 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=1.52;MQ=58.82;MQ0=1;OQ=894.68;QD=13.76;SB=-387.61 GT:AD:DP:GL:GQ 0/1:34,31:64:-112.04,-19.29,-126.05:99
-chr1 4872967 rs11805753 C T 385.01 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.56;MQ=59.68;MQ0=0;OQ=1214.98;QD=17.11;SB=-484.47 GT:AD:DP:GL:GQ 0/1:35,36:70:-145.88,-21.10,-111.38:99
-chr1 4873161 rs10915668 C T 676.89 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2872.25;QD=39.89;SB=-1024.38 GT:AD:DP:GL:GQ 1/1:0,72:72:-290.83,-21.69,-0.02:99
-chr1 4874423 rs10915669 T C 15.37 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.47;MQ=59.06;MQ0=0;OQ=1979.91;QD=28.69;SB=-648.94 GT:AD:DP:GL:GQ 1/1:0,69:62:-201.63,-18.69,-0.05:99
-chr1 4875425 rs10157835 A G 332.29 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.11;MQ0=0;OQ=1038.14;QD=16.48;SB=-539.00 GT:AD:DP:GL:GQ 0/1:28,35:63:-126.07,-18.98,-114.44:99
-chr1 4877097 rs12565275 C G 395.93 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.57;MQ0=0;OQ=611.15;QD=11.32;SB=-239.42 GT:AD:DP:GL:GQ 0/1:33,21:54:-80.69,-16.29,-144.98:99
-chr1 4877956 rs2898849 G C 124.47 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.58;MQ=59.05;MQ0=0;OQ=3110.04;QD=42.60;SB=-1016.57 GT:AD:DP:GL:GQ 1/1:0,72:72:-314.62,-21.70,-0.03:99
-chr1 4878047 rs12564793 G C 328.95 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.70;MQ0=0;OQ=765.57;QD=12.15;SB=-303.80 GT:AD:DP:GL:GQ 0/1:37,26:61:-98.24,-18.40,-159.57:99
-chr1 4880219 rs11585512 A G 134.50 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=3.24;MQ=59.43;MQ0=0;OQ=632.04;QD=9.58;SB=-314.90 GT:AD:DP:GL:GQ 0/1:35,31:61:-84.88,-18.39,-132.31:99
-chr1 4880279 rs11583660 G A 590.60 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.47;MQ0=0;OQ=976.49;QD=13.95;SB=-412.71 GT:AD:DP:GL:GQ 0/1:40,30:69:-121.72,-20.78,-142.93:99
-chr1 4880552 rs12035499 G A 202.58 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.63;MQ0=0;OQ=1072.23;QD=21.02;SB=-458.86 GT:AD:DP:GL:GQ 0/1:20,31:50:-125.57,-15.06,-66.05:99
-chr1 4881363 rs942245 A G 135.80 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2549.24;QD=35.41;SB=-1267.52 GT:AD:DP:GL:GQ 1/1:0,72:71:-258.53,-21.38,-0.02:99
-chr1 4882246 rs6698453 G A 17.37 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=3;HaplotypeScore=2.99;MQ=60.00;MQ0=0;OQ=1152.61;QD=20.22;SB=-564.76 GT:AD:DP:GL:GQ 0/1:24,33:57:-135.71,-17.17,-88.68:99
-chr1 4883339 rs12043326 T C 559.70 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=840.35;QD=11.84;SB=-378.86 GT:AD:DP:GL:GQ 0/1:36,35:67:-107.51,-20.19,-138.68:99
-chr1 4883603 rs10915672 C A 302.35 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=917.14;QD=15.81;SB=-477.86 GT:AD:DP:GL:GQ 0/1:28,30:58:-112.47,-17.47,-92.34:99
-chr1 4883658 rs4141867 T C 369.29 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=1888.75;QD=33.14;SB=-779.12 GT:AD:DP:GL:GQ 1/1:0,57:54:-192.48,-16.27,-0.02:99
-chr1 4883885 rs6702564 G A 362.71 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=1074.71;QD=17.62;SB=-363.86 GT:AD:DP:GL:GQ 0/1:29,32:61:-129.13,-18.37,-105.65:99
-chr1 4884232 rs1535733 T C 178.47 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.73;MQ=59.20;MQ0=1;OQ=1010.15;QD=15.08;SB=-514.02 GT:AD:DP:GL:GQ 0/1:32,35:66:-124.18,-19.88,-130.89:99
-chr1 4884527 rs6666792 C A 73.74 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=3;HaplotypeScore=1.81;MQ=60.00;MQ0=0;OQ=1017.13;QD=16.14;SB=-354.42 GT:AD:DP:GL:GQ 0/1:29,34:62:-123.67,-18.68,-100.25:99
-chr1 4884742 rs2093765 A G 735.50 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2661.52;QD=35.97;SB=-1066.10 GT:AD:DP:GL:GQ 1/1:0,74:74:-269.76,-22.29,-0.02:99
-chr1 4885223 rs6667433 C T 727.08 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=1991.58;QD=36.21;SB=-991.61 GT:AD:DP:GL:GQ 1/1:1,54:54:-205.04,-16.28,-2.29:99
-chr1 4885428 rs10753395 A C 505.64 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.54;MQ0=0;OQ=2504.61;QD=34.79;SB=-1254.33 GT:AD:DP:GL:GQ 1/1:0,72:71:-254.07,-21.38,-0.02:99
-chr1 4885629 rs10915675 C T 373.73 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=59.20;MQ0=0;OQ=841.96;QD=14.52;SB=-410.79 GT:AD:DP:GL:GQ 0/1:31,27:56:-104.36,-16.88,-95.31:99
-chr1 4886330 rs2411956 G T 352.27 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.52;MQ=59.33;MQ0=0;OQ=915.03;QD=14.76;SB=-419.13 GT:AD:DP:GL:GQ 0/1:29,33:59:-112.57,-17.78,-93.60:99
-chr1 4886464 rs2898852 G A 427.35 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.13;MQ=59.69;MQ0=0;OQ=1311.14;QD=17.48;SB=-649.71 GT:AD:DP:GL:GQ 0/1:36,39:74:-156.69,-22.29,-124.22:99
-chr1 4887284 rs6666453 T G 591.26 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.63;MQ0=0;OQ=819.61;QD=13.22;SB=-407.64 GT:AD:DP:GL:GQ 0/1:31,31:61:-103.62,-18.37,-115.39:99
-chr1 4887891 rs61271613 G A 361.07 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=59.32;MQ0=0;OQ=1029.14;QD=15.13;SB=-413.79 GT:AD:DP:GL:GQ 0/1:37,31:68:-126.69,-20.50,-120.37:99
-chr1 4887923 rs12567162 A C 597.28 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1047.19;QD=16.36;SB=-475.28 GT:AD:DP:GL:GQ 0/1:27,37:63:-126.98,-18.97,-102.36:99
-chr1 4888122 rs11584727 G A 343.84 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=58.62;MQ0=0;OQ=960.03;QD=15.74;SB=-414.74 GT:AD:DP:GL:GQ 0/1:31,30:58:-116.76,-17.47,-107.44:99
-chr1 4888166 rs10799275 T C 449.24 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=759.70;QD=14.07;SB=-405.31 GT:AD:DP:GL:GQ 0/1:28,26:54:-95.52,-16.26,-116.08:99
-chr1 4888741 rs6667349 A G 162.92 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=2;HaplotypeScore=1.54;MQ=60.00;MQ0=0;OQ=906.44;QD=15.63;SB=-403.28 GT:AD:DP:GL:GQ 0/1:26,32:57:-111.10,-17.17,-105.01:99
-chr1 4891078 rs10915677 A C 501.83 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=791.64;QD=10.84;SB=-393.76 GT:AD:DP:GL:GQ 0/1:42,31:72:-104.14,-21.69,-153.97:99
-chr1 4891278 rs10753396 A G 48.68 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.33;MQ=59.27;MQ0=0;OQ=705.13;QD=13.83;SB=-249.29 GT:AD:DP:GL:GQ 0/1:25,26:49:-88.56,-14.77,-92.96:99
-chr1 4892541 rs6675977 C T 304.31 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.24;MQ0=0;OQ=854.23;QD=15.53;SB=-341.48 GT:AD:DP:GL:GQ 0/1:29,26:53:-104.68,-15.97,-89.47:99
-chr1 4893597 rs9426511 G A 254.52 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.65;MQ=59.63;MQ0=0;OQ=950.24;QD=15.08;SB=-473.01 GT:AD:DP:GL:GQ 0/1:32,31:60:-116.38,-18.07,-112.58:99
-chr1 4894312 rs12409253 G A 317.80 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.37;MQ0=0;OQ=1178.40;QD=17.85;SB=-478.44 GT:AD:DP:GL:GQ 0/1:31,35:66:-141.01,-19.88,-111.62:99
-chr1 4894801 rs12044092 G A 352.37 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=2.41;MQ=58.46;MQ0=0;OQ=1019.91;QD=14.36;SB=-390.41 GT:AD:DP:GL:GQ 0/1:36,34:67:-125.46,-20.19,-124.85:99
-chr1 4894886 rs12049256 T C 300.25 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.80;MQ=59.40;MQ0=0;OQ=829.82;QD=11.85;SB=-433.52 GT:AD:DP:GL:GQ 0/1:40,30:69:-107.05,-20.79,-158.76:99
-chr1 4895006 rs11588368 G A 587.49 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=820.91;QD=16.10;SB=-424.82 GT:AD:DP:GL:GQ 0/1:26,25:51:-100.74,-15.37,-86.84:99
-chr1 4895035 rs11591047 T C 208.88 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=60.00;MQ0=0;OQ=456.13;QD=9.70;SB=-221.38 GT:AD:DP:GL:GQ 0/1:26,21:45:-62.46,-13.57,-101.40:99
-chr1 4895453 rs10915681 C A 168.48 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=1;HaplotypeScore=1.78;MQ=58.81;MQ0=0;OQ=612.66;QD=11.14;SB=-214.30 GT:AD:DP:GL:GQ 0/1:31,24:51:-79.91,-15.36,-100.29:99
-chr1 4895802 rs10915682 G C 444.70 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.75;MQ0=0;OQ=770.78;QD=14.82;SB=-369.80 GT:AD:DP:GL:GQ 0/1:29,22:52:-98.80,-18.44,-131.37:99
-chr1 4896045 rs10915683 A G 284.67 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=59.68;MQ0=0;OQ=528.33;QD=8.95;SB=-128.57 GT:AD:DP:GL:GQ 0/1:38,21:56:-72.98,-16.87,-140.47:99
-chr1 4896086 rs4654470 A G 55.66 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=5.44;MQ=59.62;MQ0=0;OQ=494.74;QD=8.11;SB=-214.66 GT:AD:DP:GL:GQ 0/1:40,20:59:-73.24,-20.48,-157.99:99
-chr1 4896521 rs12037632 T C 412.13 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.62;MQ0=0;OQ=681.99;QD=11.18;SB=-282.28 GT:AD:DP:GL:GQ 0/1:32,29:59:-89.26,-17.78,-128.31:99
-chr1 4896528 . C T 86.04 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.85;MQ=59.65;MQ0=0;OQ=946.41;QD=14.34;SB=-376.12 GT:AD:DP:GL:GQ 0/1:36,30:66:-117.81,-19.89,-127.23:99
-chr1 4896632 rs12040043 G A 26.46 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=5.45;MQ=59.30;MQ0=0;OQ=1274.10;QD=19.30;SB=-654.71 GT:AD:DP:GL:GQ 0/1:28,38:65:-150.27,-19.58,-99.74:99
-chr1 4897223 rs9426467 A G 376.87 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=60.00;MQ0=0;OQ=1052.07;QD=15.47;SB=-512.94 GT:AD:DP:GL:GQ 0/1:31,37:66:-128.37,-19.88,-120.24:99
-chr1 4897430 . C G 135.89 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1675.35;QD=20.68;SB=-845.32 GT:AD:DP:GL:GQ 0/1:35,46:79:-194.65,-23.83,-135.28:99
-chr1 4898245 rs9426468 A G 643.42 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=1735.77;QD=32.14;SB=-669.84 GT:AD:DP:GL:GQ 1/1:0,54:54:-177.21,-16.28,-0.04:99
-chr1 4899159 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=3;HaplotypeScore=6.05;MQ=46.85;MQ0=0;OQ=120.33;QD=2.27;SB=65.24 GT:AD:DP:GL:GQ 0/1:32,21:41:-27.68,-12.36,-128.17:99
-chr1 4899332 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=18.81;MQ=41.26;MQ0=0;OQ=75.19;QD=0.84;SB=83.30 GT:AD:DP:GL:GQ 0/1:74,15:82:-35.50,-24.70,-289.36:99
-chr1 4899338 rs61764934 T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=103;Dels=0.00;HRun=1;HaplotypeScore=53.72;MQ=39.00;MQ0=0;OQ=98.84;QD=0.96;SB=80.29 GT:AD:DP:GL:GQ 0/1:81,22:86:-39.08,-25.91,-300.72:99
-chr1 4899353 . A G 53.98 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=1;HaplotypeScore=114.06;MQ=38.02;MQ0=0;QD=0.50;SB=80.29 GT:AD:DP:GL:GQ 0/1:92,15:73:-30.68,-22.00,-253.39:86.82
-chr1 4899362 . C T 241.59 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=82.55;MQ=36.98;MQ0=0;QD=2.20;SB=83.28 GT:AD:DP:GL:GQ 0/1:96,14:84:-52.74,-25.30,-256.82:99
-chr1 4899363 . A G 254.83 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=107;Dels=0.00;HRun=0;HaplotypeScore=89.52;MQ=36.48;MQ0=0;QD=2.38;SB=77.27 GT:AD:DP:GL:GQ 0/1:93,14:79:-52.57,-23.80,-259.03:99
-chr1 4899383 . A G 183.41 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=106;Dels=0.00;HRun=0;HaplotypeScore=35.87;MQ=33.65;MQ0=0;QD=1.73;SB=12.92 GT:AD:DP:GL:GQ 0/1:63,43:62:-40.31,-18.69,-193.47:99
-chr1 4899387 . G A 263.62 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.00;HRun=1;HaplotypeScore=43.90;MQ=33.13;MQ0=0;QD=2.66;SB=77.22 GT:AD:DP:GL:GQ 0/1:87,12:64:-48.92,-19.28,-184.60:99
-chr1 4899389 . C T 535.44 SnpCluster AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=33.38;MQ0=0;QD=5.76;SB=-42.73 GT:AD:DP:GL:GQ 0/1:50,43:64:-76.11,-19.28,-160.16:99
-chr1 4899390 . A G 274.25 SnpCluster AC=1;AF=0.50;AN=2;DP=92;Dels=0.00;HRun=0;HaplotypeScore=29.97;MQ=32.97;MQ0=0;QD=2.98;SB=-22.76 GT:AD:DP:GL:GQ 0/1:49,43:57:-47.88,-17.17,-174.44:99
-chr1 4899396 . A G 365.84 SnpCluster AC=1;AF=0.50;AN=2;DP=91;Dels=0.00;HRun=0;HaplotypeScore=37.97;MQ=32.55;MQ0=0;QD=4.02;SB=-65.46 GT:AD:DP:GL:GQ 0/1:57,34:58:-57.34,-17.48,-166.05:99
-chr1 4899406 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=33.13;MQ=34.08;MQ0=0;OQ=385.33;QD=4.76;SB=65.23 GT:AD:DP:GL:GQ 0/1:64,17:63:-60.79,-18.98,-180.67:99
-chr1 4899410 . A G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=77;Dels=0.00;HRun=0;HaplotypeScore=33.12;MQ=33.37;MQ0=0;OQ=280.21;QD=3.64;SB=-127.85 GT:AD:DP:GL:GQ 0/1:61,16:68:-51.79,-20.49,-213.95:99
-chr1 4899418 rs61764937 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=24.96;MQ=35.60;MQ0=0;OQ=416.78;QD=5.56;SB=-32.80 GT:AD:DP:GL:GQ 0/1:58,17:68:-65.44,-20.48,-183.51:99
-chr1 4899454 . A G 399.94 SnpCluster AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=32.10;MQ=40.74;MQ0=0;QD=4.49;SB=-98.78 GT:AD:DP:GL:GQ 0/1:68,21:81:-67.68,-24.40,-246.97:99
-chr1 4899458 . A G 39.06 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=97;Dels=0.00;HRun=0;HaplotypeScore=68.26;MQ=40.42;MQ0=0;QD=0.40;SB=83.30 GT:AD:DP:GL:GQ 0/1:88,9:79:-30.98,-23.79,-291.61:71.90
-chr1 4899460 . A G 118.03 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=100;Dels=0.00;HRun=0;HaplotypeScore=72.96;MQ=40.46;MQ0=0;QD=1.18;SB=77.27 GT:AD:DP:GL:GQ 0/1:89,11:76:-37.98,-22.90,-265.09:99
-chr1 4899462 . C T 72.49 SnpCluster AC=1;AF=0.50;AN=2;DP=103;Dels=0.00;HRun=1;HaplotypeScore=75.80;MQ=40.64;MQ0=0;QD=0.70;SB=-1.28 GT:AD:DP:GL:GQ 0/1:95,8:73:-32.52,-21.98,-238.14:99
-chr1 4899467 . A G 135.65 SnpCluster AC=1;AF=0.50;AN=2;DP=110;Dels=0.00;HRun=0;HaplotypeScore=98.40;MQ=41.18;MQ0=0;QD=1.23;SB=-29.35 GT:AD:DP:GL:GQ 0/1:96,14:86:-42.76,-25.91,-295.60:99
-chr1 4899468 rs12745382 A T 958.03 SnpCluster AC=1;AF=0.50;AN=2;DB;DP=110;Dels=0.00;HRun=0;HaplotypeScore=107.35;MQ=41.23;MQ0=0;QD=8.71;SB=-316.45 GT:AD:DP:GL:GQ 0/1:64,46:95:-127.70,-28.61,-236.36:99
-chr1 4899487 rs12745394 A G 720.77 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=218;Dels=0.00;HRun=0;HaplotypeScore=160.10;MQ=38.29;MQ0=1;QD=3.31;SB=-244.39 GT:AD:DP:GL:GQ 0/1:161,57:163:-124.48,-49.12,-501.88:99
-chr1 4899493 . T C 260.40 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=248;Dels=0.00;HRun=0;HaplotypeScore=303.17;MQ=38.85;MQ0=1;QD=1.05;SB=56.79 GT:AD:DP:GL:GQ 0/1:215,32:203:-90.48,-61.15,-713.61:99
-chr1 4899494 . G A 174.70 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=310.33;MQ=39.06;MQ0=1;QD=0.69;SB=21.87 GT:AD:DP:GL:GQ 0/1:226,26:203:-81.91,-61.15,-646.58:99
-chr1 4899498 . A G 872.52 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=250.40;MQ=38.78;MQ0=1;QD=3.46;SB=78.26 GT:AD:DP:GL:GQ 0/1:199,53:211:-154.09,-63.56,-686.66:99
-chr1 4899500 rs12724550 G A 2189.95 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=250;Dels=0.00;HRun=0;HaplotypeScore=245.89;MQ=38.85;MQ0=1;QD=8.76;SB=-1087.26 GT:AD:DP:GL:GQ 0/1:149,76:205:-341.91,-119.63,-478.96:99
-chr1 4899501 . T G 179.31 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=1;HaplotypeScore=255.20;MQ=39.12;MQ0=1;QD=0.71;SB=215.88 GT:AD:DP:GL:GQ 0/1:226,25:204:-82.66,-61.45,-660.80:99
-chr1 4899507 . A G 466.12 DPFilter;Indel;SnpCluster AC=1;AF=0.50;AN=2;DP=254;Dels=0.00;HRun=0;HaplotypeScore=236.48;MQ=39.39;MQ0=1;QD=1.84;SB=155.66 GT:AD:DP:GL:GQ 0/1:206,47:211:-113.47,-63.57,-712.04:99
-chr1 4899538 . A G 1219.52 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=258;Dels=0.00;HRun=0;HaplotypeScore=176.47;MQ=39.21;MQ0=0;QD=4.73;SB=-218.54 GT:AD:DP:GL:GQ 0/1:190,68:212:-189.10,-63.86,-642.45:99
-chr1 4899540 . A G 894.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=255;Dels=0.00;HRun=0;HaplotypeScore=176.74;MQ=39.03;MQ0=0;QD=3.51;SB=-184.63 GT:AD:DP:GL:GQ 0/1:181,72:195:-154.12,-61.41,-609.10:99
-chr1 4899547 rs61764939 G A 1318.72 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DB;DP=260;Dels=0.00;HRun=0;HaplotypeScore=220.06;MQ=39.48;MQ0=0;QD=5.07;SB=-35.22 GT:AD:DP:GL:GQ 0/1:180,80:174:-187.61,-52.45,-416.57:99
-chr1 4899554 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=252;Dels=0.00;HRun=0;HaplotypeScore=215.32;MQ=39.44;MQ0=0;OQ=71.48;QD=0.28;SB=245.79 GT:AD:DP:GL:GQ 0/1:233,19:178:-64.05,-53.62,-575.35:99
-chr1 4899560 . A G 527.43 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=244;Dels=0.00;HRun=0;HaplotypeScore=182.32;MQ=39.84;MQ0=0;QD=2.16;SB=62.05 GT:AD:DP:GL:GQ 0/1:191,43:207:-132.12,-76.10,-688.26:99
-chr1 4899566 . C T 228.85 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=230;Dels=0.00;HRun=0;HaplotypeScore=151.86;MQ=39.79;MQ0=0;QD=0.99;SB=29.83 GT:AD:DP:GL:GQ 0/1:207,23:173:-78.29,-52.12,-551.64:99
-chr1 4899567 . A G 591.79 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=224;Dels=0.00;HRun=0;HaplotypeScore=146.70;MQ=39.85;MQ0=0;QD=2.64;SB=-287.04 GT:AD:DP:GL:GQ 0/1:172,52:165:-112.16,-49.70,-538.18:99
-chr1 4899578 . G A 586.91 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=167;Dels=0.00;HRun=1;HaplotypeScore=122.95;MQ=41.57;MQ0=0;QD=3.51;SB=-235.54 GT:AD:DP:GL:GQ 0/1:137,30:123:-99.03,-37.05,-345.51:99
-chr1 4899580 . G A 442.86 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=161;Dels=0.00;HRun=0;HaplotypeScore=120.46;MQ=41.82;MQ0=0;QD=2.75;SB=-225.49 GT:AD:DP:GL:GQ 0/1:135,26:120:-83.72,-36.15,-349.19:99
-chr1 4899586 . T C 690.02 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=149;Dels=0.00;HRun=1;HaplotypeScore=129.55;MQ=42.82;MQ0=0;QD=4.63;SB=-75.61 GT:AD:DP:GL:GQ 0/1:103,46:129:-111.14,-38.86,-403.04:99
-chr1 4899587 . G A 484.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=146;Dels=0.00;HRun=0;HaplotypeScore=116.82;MQ=42.67;MQ0=0;QD=3.32;SB=137.44 GT:AD:DP:GL:GQ 0/1:119,26:124:-89.06,-37.35,-358.44:99
-chr1 4899593 . C T 11.57 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=117;Dels=0.00;HRun=0;HaplotypeScore=60.92;MQ=43.18;MQ0=0;QD=0.10;SB=158.52 GT:AD:DP:GL:GQ 0/1:100,17:99:-34.23,-29.82,-323.42:44.09
-chr1 4899594 . A G 11.09 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=116;Dels=0.00;HRun=0;HaplotypeScore=60.92;MQ=43.00;MQ0=0;QD=0.10;SB=173.58 GT:AD:DP:GL:GQ 0/1:99,17:103:-35.39,-31.03,-369.44:43.58
-chr1 4899610 . C T 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=0;HaplotypeScore=9.15;MQ=43.55;MQ0=0;OQ=197.17;QD=2.22;SB=-29.37 GT:AD:DP:GL:GQ 0/1:75,14:86:-48.93,-25.93,-238.79:99
-chr1 4899946 rs4654471 T C 43.86 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=5.91;MQ=59.14;MQ0=0;OQ=975.13;QD=18.06;SB=-440.01 GT:AD:DP:GL:GQ 0/1:20,34:52:-116.46,-15.67,-76.61:99
-chr1 4902227 rs7555212 C T 596.69 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=2926.83;QD=40.65;SB=-1218.62 GT:AD:DP:GL:GQ 1/1:0,72:72:-296.28,-21.69,-0.02:99
-chr1 4902317 rs6426367 G T 224.74 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=59.74;MQ0=0;OQ=3145.50;QD=36.16;SB=-1581.61 GT:AD:DP:GL:GQ 1/1:0,87:85:-318.15,-25.60,-0.02:99
-chr1 4902486 rs6426368 C T 717.48 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2201.20;QD=38.62;SB=-1092.00 GT:AD:DP:GL:GQ 1/1:0,57:56:-223.72,-16.87,-0.02:99
-chr1 4902573 rs6669905 T C 700.95 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.30;MQ0=0;OQ=2165.11;QD=36.09;SB=-859.36 GT:AD:DP:GL:GQ 1/1:0,60:59:-220.11,-17.77,-0.01:99
-chr1 4903007 rs6678838 G T 279.14 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=56.35;MQ0=0;OQ=1768.51;QD=34.01;SB=-813.84 GT:AD:DP:GL:GQ 1/1:0,52:50:-180.45,-15.06,-0.02:99
-chr1 4903027 rs12142452 G T 0 FDRtranche2.00to10.00+ AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.05;HRun=16;HaplotypeScore=13.19;MQ=49.10;MQ0=0;OQ=2384.03;QD=31.37;SB=-1040.48 GT:AD:DP:GL:GQ 1/1:0,72:70:-242.01,-20.48,-0.02:99
-chr1 4903364 rs9286971 G A 258.61 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=52.70;MQ0=0;OQ=2159.66;QD=37.89;SB=-926.32 GT:AD:DP:GL:GQ 1/1:0,57:54:-219.56,-16.27,-0.01:99
-chr1 4904108 rs10799141 A G 488.42 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.61;MQ0=0;OQ=2393.63;QD=33.71;SB=-1173.70 GT:AD:DP:GL:GQ 1/1:0,71:69:-242.98,-20.79,-0.03:99
-chr1 4904115 rs10753341 C T 707.52 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.70;MQ0=0;OQ=2995.63;QD=39.42;SB=-1442.45 GT:AD:DP:GL:GQ 1/1:0,76:76:-303.17,-22.90,-0.02:99
-chr1 4904188 rs10753342 G A 611.86 PASS AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3529.10;QD=39.65;SB=-1221.14 GT:AD:DP:GL:GQ 1/1:0,89:89:-351.91,-26.82,-0.03:99
-chr1 4905340 rs7531490 A G 249.81 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.93;MQ0=0;OQ=2004.17;QD=30.83;SB=-867.03 GT:AD:DP:GL:GQ 1/1:0,65:64:-204.06,-19.31,-0.06:99
-chr1 4905635 rs7534281 T C 82.15 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=2.19;MQ=59.65;MQ0=0;OQ=2315.03;QD=35.08;SB=-1175.74 GT:AD:DP:GL:GQ 1/1:0,66:65:-235.11,-19.58,-0.02:99
-chr1 4905656 rs7542048 G A 139.59 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.78;MQ=59.63;MQ0=0;OQ=2472.89;QD=39.25;SB=-1234.03 GT:AD:DP:GL:GQ 1/1:0,62:62:-250.89,-18.68,-0.02:99
-chr1 4906196 rs6426371 T C 169.21 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=58.85;MQ0=0;OQ=1914.58;QD=30.88;SB=-835.64 GT:AD:DP:GL:GQ 1/1:0,62:59:-195.09,-17.79,-0.04:99
-chr1 4906502 rs6426372 G C 538.03 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=3170.49;QD=42.84;SB=-1473.31 GT:AD:DP:GL:GQ 1/1:0,73:73:-320.65,-21.99,-0.02:99
-chr1 4907095 rs10915296 T C 149.48 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=1;HaplotypeScore=1.07;MQ=58.97;MQ0=0;OQ=3030.02;QD=34.83;SB=-1495.63 GT:AD:DP:GL:GQ 1/1:0,87:84:-306.61,-25.30,-0.03:99
-chr1 4907407 rs6702058 C T 201.43 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.82;MQ=59.72;MQ0=0;OQ=3144.08;QD=38.34;SB=-1502.68 GT:AD:DP:GL:GQ 1/1:0,81:79:-318.01,-23.80,-0.02:99
-chr1 4907813 rs6677619 G T 634.30 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2646.47;QD=36.25;SB=-1071.58 GT:AD:DP:GL:GQ 1/1:0,73:72:-268.25,-21.68,-0.02:99
-chr1 4909109 rs7413385 A G 73.69 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.58;MQ=58.33;MQ0=0;OQ=950.25;QD=33.94;SB=-350.81 GT:AD:DP:GL:GQ 1/1:0,28:27:-98.62,-8.13,-0.01:81.24
-chr1 4909713 rs7413847 A G 78.92 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.66;MQ=58.99;MQ0=0;OQ=2491.44;QD=34.13;SB=-1130.80 GT:AD:DP:GL:GQ 1/1:0,72:69:-252.75,-20.78,-0.02:99
-chr1 4909933 rs7411727 C T 614.98 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2836.35;QD=38.85;SB=-1407.70 GT:AD:DP:GL:GQ 1/1:0,73:71:-287.24,-21.39,-0.02:99
-chr1 4910002 rs10915297 T C 288.13 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.37;MQ0=0;OQ=2563.56;QD=35.12;SB=-1064.10 GT:AD:DP:GL:GQ 1/1:0,73:72:-259.97,-21.69,-0.02:99
-chr1 4910067 rs10799142 G A 129.23 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=2.67;MQ=58.55;MQ0=0;OQ=2372.23;QD=38.89;SB=-1035.39 GT:AD:DP:GL:GQ 1/1:0,61:60:-240.82,-18.08,-0.02:99
-chr1 4910738 rs6426373 T C 29.48 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=4;HaplotypeScore=1.33;MQ=59.62;MQ0=0;OQ=2095.65;QD=34.35;SB=-1007.72 GT:AD:DP:GL:GQ 1/1:0,61:59:-213.17,-17.77,-0.02:99
-chr1 4910848 rs6664358 C T 341.96 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=2577.25;QD=39.65;SB=-933.73 GT:AD:DP:GL:GQ 1/1:0,65:64:-261.33,-19.28,-0.02:99
-chr1 4911242 rs9426489 G T 99.79 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.42;MQ=59.58;MQ0=0;OQ=1563.55;QD=28.43;SB=-641.98 GT:AD:DP:GL:GQ 1/1:2,53:45:-159.96,-13.56,-0.02:99
-chr1 4911262 rs9426490 A G 133.69 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=1.03;MQ=60.00;MQ0=0;OQ=2076.79;QD=34.05;SB=-972.82 GT:AD:DP:GL:GQ 1/1:0,61:59:-211.29,-17.77,-0.02:99
-chr1 4911898 rs7522655 C T 592.58 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2724.61;QD=40.67;SB=-1189.07 GT:AD:DP:GL:GQ 1/1:0,67:67:-276.06,-20.18,-0.01:99
-chr1 4911961 rs7544541 G A 150.94 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=59.39;MQ0=0;OQ=2947.98;QD=38.79;SB=-1404.70 GT:AD:DP:GL:GQ 1/1:1,75:74:-298.40,-22.29,-0.02:99
-chr1 4911968 rs7544542 G A 170.72 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.82;MQ=59.72;MQ0=0;OQ=3112.64;QD=37.96;SB=-1553.08 GT:AD:DP:GL:GQ 1/1:0,82:78:-314.87,-23.50,-0.02:99
-chr1 4912150 rs9426469 G A 193 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.69;MQ0=0;OQ=2864.62;QD=38.19;SB=-1302.32 GT:AD:DP:GL:GQ 1/1:0,75:72:-290.07,-21.69,-0.02:99
-chr1 4913505 rs9426491 A G 394.38 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.04;MQ0=0;OQ=3121.73;QD=35.88;SB=-1295.55 GT:AD:DP:GL:GQ 1/1:0,87:85:-315.78,-25.60,-0.02:99
-chr1 4914443 rs6692780 T C 192.39 PASS AC=2;AF=1.00;AN=2;DB;DP=103;Dels=0.00;HRun=0;HaplotypeScore=2.33;MQ=59.62;MQ0=0;OQ=3691.18;QD=35.84;SB=-1586.36 GT:AD:DP:GL:GQ 1/1:1,102:102:-368.12,-30.72,-0.04:99
-chr1 4914588 rs6701289 G A 24.03 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=1.20;MQ=58.58;MQ0=0;OQ=3206.41;QD=40.08;SB=-1396.85 GT:AD:DP:GL:GQ 1/1:0,80:78:-324.24,-23.49,-0.01:99
-chr1 4915327 rs6693486 A T 79.70 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=0.67;MQ=59.04;MQ0=0;OQ=2495.92;QD=36.70;SB=-983.49 GT:AD:DP:GL:GQ 1/1:0,68:67:-253.20,-20.19,-0.02:99
-chr1 4915704 rs6656223 G A 492.16 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1843.82;QD=39.23;SB=-720.96 GT:AD:DP:GL:GQ 1/1:0,47:46:-187.98,-13.86,-0.01:99
-chr1 4917206 rs12098076 G A 321.24 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.82;MQ=59.37;MQ0=0;OQ=1024.17;QD=17.36;SB=-411.74 GT:AD:DP:GL:GQ 0/1:27,32:58:-123.18,-17.47,-93.16:99
-chr1 4918178 rs9426470 C A 210.31 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2272.14;QD=33.41;SB=-999.37 GT:AD:DP:GL:GQ 1/1:0,68:66:-230.83,-19.89,-0.03:99
-chr1 4918637 rs6696925 G C 480.06 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.39;MQ0=0;OQ=1020.90;QD=16.74;SB=-452.39 GT:AD:DP:GL:GQ 0/1:33,28:59:-123.15,-17.78,-134.82:99
-chr1 4920934 rs7546019 A G 7.79 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=3.94;MQ=55.17;MQ0=0;OQ=1312.69;QD=25.74;SB=-576.91 GT:AD:DP:GL:GQ 1/1:0,51:42:-134.90,-12.67,-0.04:99
-chr1 4920939 rs10799143 A G 1.06 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=9.55;MQ=55.37;MQ0=0;OQ=685.84;QD=14.29;SB=-109.82 GT:AD:DP:GL:GQ 1/1:0,38:24:-75.74,-10.17,-3.57:66.02
-chr1 4920972 rs10753343 C T 150.22 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=58.67;MQ0=0;OQ=1219.60;QD=34.85;SB=-488.14 GT:AD:DP:GL:GQ 1/1:0,34:33:-125.56,-9.95,-0.02:99
-chr1 4921030 rs10799144 A G 161.31 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=1;HaplotypeScore=1.20;MQ=58.57;MQ0=0;OQ=1984.77;QD=33.64;SB=-769.10 GT:AD:DP:GL:GQ 1/1:0,59:57:-202.08,-17.17,-0.02:99
-chr1 4921060 rs10799145 T G 245.52 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.09;MQ=58.90;MQ0=0;OQ=1759.60;QD=29.82;SB=-867.69 GT:AD:DP:GL:GQ 1/1:0,59:58:-179.61,-17.49,-0.06:99
-chr1 4921319 . C T 71.66 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=56.87;MQ0=0;OQ=1537.50;QD=20.78;SB=-754.34 GT:AD:DP:GL:GQ 0/1:29,45:71:-178.43,-21.40,-86.91:99
-chr1 4921542 . G A 297.10 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.57;MQ0=0;OQ=827.15;QD=15.32;SB=-385.90 GT:AD:DP:GL:GQ 0/1:29,25:54:-102.27,-16.28,-92.99:99
-chr1 4921651 . A G 14.60 PASS AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=3;HaplotypeScore=0.89;MQ=59.42;MQ0=0;OQ=1167.54;QD=16.22;SB=-587.69 GT:AD:DP:GL:GQ 0/1:31,41:71:-141.43,-21.39,-125.09:99
-chr1 4921748 . T C 1.07 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=7.77;MQ=59.39;MQ0=0;OQ=610.60;QD=12.72;SB=-231.30 GT:AD:DP:GL:GQ 0/1:26,22:47:-78.51,-14.17,-96.88:99
-chr1 4921801 . A G 290.73 PASS AC=1;AF=0.50;AN=2;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=740.93;QD=13.98;SB=-339.17 GT:AD:DP:GL:GQ 0/1:24,29:53:-93.36,-15.98,-94.97:99
-chr1 4921915 rs12118118 A G 141.47 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.35;MQ=59.65;MQ0=0;OQ=641.25;QD=9.87;SB=-176.55 GT:AD:DP:GL:GQ 0/1:39,26:63:-86.39,-18.98,-152.81:99
-chr1 4922627 rs12119864 T C 423.73 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=58.63;MQ0=0;OQ=1289.06;QD=15.17;SB=-556.56 GT:AD:DP:GL:GQ 0/1:33,52:81:-156.60,-24.41,-132.69:99
-chr1 4923016 rs6426374 A G 591.79 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.54;MQ0=0;OQ=2408.23;QD=29.37;SB=-1057.43 GT:AD:DP:GL:GQ 1/1:0,82:76:-244.48,-22.92,-0.07:99
-chr1 4923151 . C T 132.84 PASS AC=1;AF=0.50;AN=2;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.33;MQ0=0;OQ=908.76;QD=16.23;SB=-453.45 GT:AD:DP:GL:GQ 0/1:28,28:56:-111.04,-16.88,-89.80:99
-chr1 4923249 . A G 76.65 PASS AC=1;AF=0.50;AN=2;DP=44;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=58.95;MQ0=0;OQ=491.85;QD=11.18;SB=-227.32 GT:AD:DP:GL:GQ 0/1:25,19:38:-63.92,-11.45,-77.07:99
-chr1 4923272 . A G 41.93 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=2.77;MQ=59.16;MQ0=0;OQ=549.57;QD=9.99;SB=-300.17 GT:AD:DP:GL:GQ 0/1:32,23:55:-74.82,-16.58,-127.48:99
-chr1 4923290 rs6702660 A G 624.31 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1543.54;QD=30.27;SB=-737.76 GT:AD:DP:GL:GQ 1/1:0,51:50:-157.99,-15.08,-0.05:99
-chr1 4923916 . G A 53.20 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=57.14;MQ0=0;OQ=1330.08;QD=17.97;SB=-412.89 GT:AD:DP:GL:GQ 0/1:35,39:72:-157.99,-21.70,-107.79:99
-chr1 4923977 . T C 92.93 PASS AC=1;AF=0.50;AN=2;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.60;MQ=56.31;MQ0=0;OQ=878.08;QD=13.94;SB=-397.92 GT:AD:DP:GL:GQ 0/1:29,34:62:-109.78,-18.69,-109.67:99
-chr1 4924245 rs7523398 G T 624.90 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.01;HRun=0;HaplotypeScore=0.00;MQ=52.50;MQ0=0;OQ=2976.14;QD=35.01;SB=-1222.44 GT:AD:DP:GL:GQ 1/1:0,84:82:-301.22,-24.40,-0.02:99
-chr1 4924289 . C T 145.80 Indel AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=20.35;MQ=47.42;MQ0=2;QD=1.80;SB=-17.33 GT:AD:DP:GL:GQ 0/1:69,12:76:-40.75,-22.89,-240.21:99
-chr1 4924318 . A G 303.69 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.53;MQ0=0;OQ=1150.10;QD=15.13;SB=-395.92 GT:AD:DP:GL:GQ 0/1:29,47:72:-140.00,-21.70,-115.03:99
-chr1 4924353 . A G 6.39 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=1;HaplotypeScore=4.52;MQ=59.31;MQ0=0;OQ=1199.85;QD=16.00;SB=-524.06 GT:AD:DP:GL:GQ 0/1:32,42:73:-145.26,-21.99,-127.06:99
-chr1 4924370 . T G 76.39 PASS AC=1;AF=0.50;AN=2;DP=78;Dels=0.00;HRun=0;HaplotypeScore=1.99;MQ=60.52;MQ0=0;OQ=1415.60;QD=18.15;SB=-500.81 GT:AD:DP:GL:GQ 0/1:31,47:78:-168.34,-23.49,-113.39:99
-chr1 4924651 rs140619 A C 98.30 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=1.45;MQ=58.44;MQ0=0;OQ=1008.29;QD=14.00;SB=-504.32 GT:AD:DP:GL:GQ 0/1:36,36:69:-124.90,-20.78,-122.36:99
-chr1 4924659 rs140620 C G 66.97 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=2;HaplotypeScore=3.55;MQ=58.47;MQ0=0;OQ=1278.05;QD=17.51;SB=-626.38 GT:AD:DP:GL:GQ 0/1:37,36:72:-152.80,-21.71,-149.62:99
-chr1 4924842 rs3101217 G A 427.04 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.23;MQ=60.00;MQ0=0;OQ=946.64;QD=12.46;SB=-438.36 GT:AD:DP:GL:GQ 0/1:44,31:68:-118.44,-20.49,-128.20:99
-chr1 4924889 rs3101218 G C 576.23 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1334.27;QD=16.68;SB=-624.99 GT:AD:DP:GL:GQ 0/1:41,39:77:-159.91,-23.20,-177.20:99
-chr1 4924920 rs3101219 T C 593.97 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1041.98;QD=16.28;SB=-455.18 GT:AD:DP:GL:GQ 0/1:28,36:64:-126.76,-19.28,-110.51:99
-chr1 4924999 rs3101220 G C 298.13 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.20;MQ0=0;OQ=811.79;QD=14.00;SB=-233.01 GT:AD:DP:GL:GQ 0/1:32,26:57:-101.64,-17.18,-138.57:99
-chr1 4925039 rs3128678 A G 0.26 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=4;HaplotypeScore=3.38;MQ=59.22;MQ0=0;OQ=1744.26;QD=32.30;SB=-816.04 GT:AD:DP:GL:GQ 1/1:0,54:50:-178.03,-15.06,-0.02:99
-chr1 4925077 rs3101221 C A 25.14 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.44;MQ=58.58;MQ0=0;OQ=647.61;QD=11.56;SB=-325.00 GT:AD:DP:GL:GQ 0/1:30,26:49:-82.82,-14.77,-78.79:99
-chr1 4925169 rs3128679 A G 107.98 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.44;MQ=60.00;MQ0=0;OQ=535.15;QD=8.92;SB=-144.42 GT:AD:DP:GL:GQ 0/1:36,24:59:-74.58,-17.78,-140.21:99
-chr1 4925429 rs3128680 G A 469.33 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=766.43;QD=14.46;SB=-348.86 GT:AD:DP:GL:GQ 0/1:29,24:53:-95.89,-15.97,-104.44:99
-chr1 4925430 rs3101222 C G 427.23 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=771.83;QD=15.13;SB=-299.97 GT:AD:DP:GL:GQ 0/1:28,23:50:-95.55,-15.08,-110.57:99
-chr1 4925635 rs3101223 A G 252.82 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=59.74;MQ0=0;OQ=1091.51;QD=12.26;SB=-378.11 GT:AD:DP:GL:GQ 0/1:48,41:87:-138.64,-26.21,-194.64:99
-chr1 4926101 rs3128681 G A 350.75 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.95;MQ=59.68;MQ0=0;OQ=1174.87;QD=16.55;SB=-610.10 GT:AD:DP:GL:GQ 0/1:35,35:70:-141.86,-21.09,-114.49:99
-chr1 4926299 rs1017724 C T 190.62 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1174.58;QD=15.06;SB=-383.10 GT:AD:DP:GL:GQ 0/1:41,37:77:-143.94,-23.19,-149.98:99
-chr1 4926372 rs1017726 A G 298.07 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=887.74;QD=17.07;SB=-423.28 GT:AD:DP:GL:GQ 0/1:22,30:52:-107.72,-15.67,-84.02:99
-chr1 4926476 rs3128682 A G 470.65 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=981.70;QD=13.27;SB=-502.91 GT:AD:DP:GL:GQ 0/1:33,41:71:-122.87,-21.41,-123.57:99
-chr1 4926532 rs3128683 G T 372.36 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.69;MQ0=0;OQ=1069.82;QD=14.26;SB=-471.94 GT:AD:DP:GL:GQ 0/1:37,38:72:-131.95,-21.69,-128.03:99
-chr1 4926586 rs34841047 T C 307.90 PASS AC=1;AF=0.50;AN=2;DB;DP=90;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.74;MQ0=0;OQ=1407.30;QD=15.64;SB=-662.64 GT:AD:DP:GL:GQ 0/1:42,48:89:-170.82,-26.81,-167.25:99
-chr1 4926613 rs7547938 A C 101.18 PASS AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=59.79;MQ0=0;OQ=2670.20;QD=30.00;SB=-1246.34 GT:AD:DP:GL:GQ 1/1:1,88:87:-270.68,-26.22,-0.07:99
-chr1 4926617 . G A 38.65 PASS AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=1;HaplotypeScore=1.60;MQ=59.78;MQ0=0;OQ=1691.34;QD=19.90;SB=-782.69 GT:AD:DP:GL:GQ 0/1:36,49:84:-197.72,-25.30,-133.23:99
-chr1 4926705 rs10799146 C G 149.65 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=59.64;MQ0=0;OQ=2201.93;QD=42.34;SB=-980.37 GT:AD:DP:GL:GQ 1/1:0,52:52:-223.80,-15.67,-0.02:99
-chr1 4926719 . T C 99.55 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.78;MQ=59.60;MQ0=0;OQ=721.00;QD=12.65;SB=-331.93 GT:AD:DP:GL:GQ 0/1:26,31:55:-91.96,-16.58,-103.71:99
-chr1 4926770 . T G 92.62 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.63;MQ=58.93;MQ0=0;OQ=842.91;QD=13.82;SB=-346.83 GT:AD:DP:GL:GQ 0/1:28,33:58:-105.05,-17.47,-101.93:99
-chr1 4926781 rs10915300 G A 186.83 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=58.91;MQ0=0;OQ=2257.64;QD=37.63;SB=-1055.32 GT:AD:DP:GL:GQ 1/1:0,60:57:-229.37,-17.17,-0.02:99
-chr1 4927339 rs6426375 C A 293.44 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.63;MQ0=0;OQ=1104.83;QD=17.54;SB=-437.22 GT:AD:DP:GL:GQ 0/1:25,38:59:-131.54,-17.77,-79.77:99
-chr1 4927361 rs12122012 G C 449.67 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=855.62;QD=14.50;SB=-302.94 GT:AD:DP:GL:GQ 0/1:34,25:57:-106.02,-17.18,-140.73:99
-chr1 4927449 rs12129823 C A 265.42 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.57;MQ=58.95;MQ0=0;OQ=867.88;QD=14.00;SB=-380.76 GT:AD:DP:GL:GQ 0/1:32,30:60:-108.15,-18.08,-97.33:99
-chr1 4927847 rs12122183 G A 490.19 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=1239.90;QD=16.31;SB=-577.98 GT:AD:DP:GL:GQ 0/1:38,38:75:-149.87,-22.60,-137.70:99
-chr1 4928324 rs10799147 T G 316.36 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.64;MQ0=0;OQ=672.70;QD=12.94;SB=-277.80 GT:AD:DP:GL:GQ 0/1:27,25:51:-85.91,-15.36,-101.41:99
-chr1 4928782 . A T 20.70 PASS AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=58.98;MQ0=0;OQ=748.61;QD=18.26;SB=-256.98 GT:AD:DP:GL:GQ 0/1:17,24:41:-90.49,-12.35,-66.37:99
-chr1 4930115 rs10799148 T G 517.72 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.72;MQ0=0;OQ=2291.16;QD=34.71;SB=-1027.09 GT:AD:DP:GL:GQ 1/1:0,66:65:-232.72,-19.58,-0.02:99
-chr1 4930427 rs34645017 G C 291.45 PASS AC=1;AF=0.50;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=722.42;QD=16.05;SB=-202.61 GT:AD:DP:GL:GQ 0/1:25,20:45:-89.08,-13.56,-109.77:99
-chr1 4930735 rs11578909 A G 280.08 PASS AC=1;AF=0.50;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=59.36;MQ0=0;OQ=698.77;QD=12.05;SB=-374.99 GT:AD:DP:GL:GQ 0/1:29,28:57:-90.34,-17.18,-117.72:99
-chr1 4931239 rs10799149 G A 641.63 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.08;MQ0=0;OQ=2438.74;QD=39.98;SB=-916.20 GT:AD:DP:GL:GQ 1/1:0,61:60:-247.47,-18.07,-0.01:99
-chr1 4931421 rs7518523 A G 261.63 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.88;MQ0=0;OQ=2083.34;QD=31.09;SB=-1042.40 GT:AD:DP:GL:GQ 1/1:0,67:65:-211.96,-19.60,-0.05:99
-chr1 4931997 rs10753344 T C 618.70 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2888.62;QD=33.98;SB=-1001.71 GT:AD:DP:GL:GQ 1/1:0,85:82:-292.48,-24.71,-0.04:99
-chr1 4932316 rs12127329 G A 183.50 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=60.00;MQ0=0;OQ=2411.54;QD=39.53;SB=-1136.02 GT:AD:DP:GL:GQ 1/1:0,61:61:-244.76,-18.38,-0.02:99
-chr1 4932881 rs11585724 C T 291.52 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.68;MQ=59.24;MQ0=0;OQ=985.86;QD=16.16;SB=-484.11 GT:AD:DP:GL:GQ 0/1:30,31:59:-119.65,-17.78,-92.67:99
-chr1 4932899 rs56016205 G C 205.73 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.90;MQ=58.78;MQ0=0;OQ=942.89;QD=16.54;SB=-283.52 GT:AD:DP:GL:GQ 0/1:30,27:56:-114.45,-16.88,-128.26:99
-chr1 4933102 rs56190527 G A 17.84 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=7.39;MQ=59.07;MQ0=0;OQ=754.79;QD=15.10;SB=-398.92 GT:AD:DP:GL:GQ 0/1:26,24:48:-93.22,-14.46,-90.86:99
-chr1 4933190 rs56216708 T C 104.26 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=1;HaplotypeScore=0.32;MQ=59.13;MQ0=0;OQ=1884.00;QD=35.55;SB=-879.00 GT:AD:DP:GL:GQ 1/1:0,53:53:-192.00,-15.97,-0.02:99
-chr1 4933296 . G A 768.22 SnpCluster AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.45;MQ0=0;QD=12.59;SB=-376.12 GT:AD:DP:GL:GQ 0/1:35,26:58:-97.59,-17.48,-110.76:99
-chr1 4933297 . C T 815.45 SnpCluster AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.45;MQ0=0;QD=13.37;SB=-431.91 GT:AD:DP:GL:GQ 0/1:35,26:61:-103.20,-18.37,-126.35:99
-chr1 4933303 . G A 803.12 SnpCluster AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.37;MQ0=0;QD=13.39;SB=-365.85 GT:AD:DP:GL:GQ 0/1:35,25:58:-101.08,-17.48,-105.94:99
-chr1 4933521 rs7535462 G A 371.82 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.07;MQ0=0;OQ=1957.02;QD=39.14;SB=-986.02 GT:AD:DP:GL:GQ 1/1:0,50:49:-199.30,-14.76,-0.01:99
-chr1 4933673 . C G 6.69 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=58.23;MQ0=0;OQ=1494.10;QD=22.64;SB=-505.26 GT:AD:DP:GL:GQ 0/1:26,40:63:-171.68,-18.99,-100.63:99
-chr1 4934014 rs12128545 G A 43.64 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.66;MQ0=0;OQ=1421.27;QD=20.90;SB=-664.71 GT:AD:DP:GL:GQ 0/1:27,41:67:-165.59,-20.18,-95.71:99
-chr1 4934078 rs12136209 C G 149.50 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.61;MQ=60.00;MQ0=0;OQ=1636.42;QD=21.82;SB=-832.32 GT:AD:DP:GL:GQ 0/1:31,44:75:-189.53,-22.60,-132.33:99
-chr1 4934416 rs12126894 T G 441.68 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=56.57;MQ0=0;OQ=586.00;QD=11.49;SB=-304.83 GT:AD:DP:GL:GQ 0/1:29,22:51:-77.25,-15.36,-105.02:99
-chr1 4935048 rs10915303 A G 334.36 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.69;MQ=51.50;MQ0=0;OQ=770.15;QD=12.84;SB=-364.97 GT:AD:DP:GL:GQ 0/1:27,33:52:-95.98,-15.68,-87.76:99
-chr1 4935474 rs34001007 G A 343.02 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=962.36;QD=16.88;SB=-495.13 GT:AD:DP:GL:GQ 0/1:27,30:56:-116.40,-16.88,-86.00:99
-chr1 4935789 rs12128035 T C 226.01 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.43;MQ=58.94;MQ0=0;OQ=796.37;QD=12.64;SB=-306.28 GT:AD:DP:GL:GQ 0/1:34,29:62:-101.60,-18.68,-137.85:99
-chr1 4936034 rs6689050 G C 388.76 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1874.06;QD=42.59;SB=-652.91 GT:AD:DP:GL:GQ 1/1:0,44:44:-191.00,-13.26,-0.01:99
-chr1 4936094 rs12757902 G A 302.17 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=59.62;MQ0=0;OQ=578.28;QD=11.80;SB=-268.20 GT:AD:DP:GL:GQ 0/1:27,21:43:-74.09,-12.98,-70.80:99
-chr1 4936362 rs12126016 G T 367.30 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.41;MQ0=0;OQ=1064.42;QD=14.99;SB=-543.63 GT:AD:DP:GL:GQ 0/1:34,37:71:-131.11,-21.39,-120.19:99
-chr1 4936409 rs11581023 G A 329.13 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=2.47;MQ=58.70;MQ0=0;OQ=1088.63;QD=16.49;SB=-413.38 GT:AD:DP:GL:GQ 0/1:32,34:63:-131.13,-18.99,-102.39:99
-chr1 4936482 rs12122541 A G 353.13 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=58.04;MQ0=0;OQ=684.77;QD=12.45;SB=-247.32 GT:AD:DP:GL:GQ 0/1:27,28:52:-87.43,-15.67,-100.04:99
-chr1 4936602 rs11584985 C T 191.63 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.33;MQ=59.29;MQ0=0;OQ=1088.30;QD=18.45;SB=-387.41 GT:AD:DP:GL:GQ 0/1:25,34:57:-129.30,-17.18,-77.34:99
-chr1 4936637 rs898335 T G 589.23 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2347.69;QD=35.57;SB=-808.10 GT:AD:DP:GL:GQ 1/1:0,66:66:-238.37,-19.88,-0.02:99
-chr1 4937911 rs12739724 G A 135.48 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=59.34;MQ0=0;OQ=1173.07;QD=20.58;SB=-518.55 GT:AD:DP:GL:GQ 0/1:24,33:57:-137.76,-17.17,-89.96:99
-chr1 4937953 rs6666618 A C 126.74 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=60.00;MQ0=0;OQ=1008.55;QD=15.28;SB=-391.76 GT:AD:DP:GL:GQ 0/1:30,36:65:-123.72,-19.58,-111.64:99
-chr1 4939240 rs1841241 A G 358.83 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.81;MQ=59.68;MQ0=0;OQ=900.69;QD=12.34;SB=-390.90 GT:AD:DP:GL:GQ 0/1:37,36:72:-115.05,-21.70,-146.81:99
-chr1 4939654 rs6660626 C G 245.03 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.55;MQ0=0;OQ=1495.04;QD=18.01;SB=-651.03 GT:AD:DP:GL:GQ 0/1:41,42:81:-177.21,-24.42,-163.44:99
-chr1 4940611 . A G 75.27 PASS AC=1;AF=0.50;AN=2;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.50;MQ0=0;OQ=761.25;QD=16.55;SB=-322.41 GT:AD:DP:GL:GQ 0/1:18,28:44:-92.67,-13.26,-69.31:99
-chr1 4941180 rs12138041 C G 147.56 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=59.43;MQ0=0;OQ=1446.36;QD=22.25;SB=-675.09 GT:AD:DP:GL:GQ 0/1:27,38:64:-167.20,-19.28,-114.12:99
-chr1 4941754 rs6426376 A C 0.05 FDRtranche0.10to1.00 AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=6;HaplotypeScore=1.65;MQ=58.89;MQ0=0;OQ=2125.54;QD=33.74;SB=-942.08 GT:AD:DP:GL:GQ 1/1:0,63:61:-216.16,-18.37,-0.02:99
-chr1 4942581 . C G 69.18 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.19;MQ0=0;OQ=1081.86;QD=18.98;SB=-432.32 GT:AD:DP:GL:GQ 0/1:28,29:57:-128.65,-17.18,-121.65:99
-chr1 4942801 rs12132419 G A 594.05 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.75;MQ0=0;OQ=1256.99;QD=16.76;SB=-497.49 GT:AD:DP:GL:GQ 0/1:35,40:73:-150.98,-21.99,-126.45:99
-chr1 4943594 rs1563791 C A 403.62 PASS AC=1;AF=0.50;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.16;MQ=58.68;MQ0=0;OQ=828.65;QD=15.63;SB=-357.20 GT:AD:DP:GL:GQ 0/1:25,28:53:-102.11,-15.96,-89.65:99
-chr1 4943942 rs10737391 T A 518.14 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.47;MQ0=0;OQ=2837.87;QD=37.84;SB=-993.50 GT:AD:DP:GL:GQ 1/1:0,75:74:-287.39,-22.29,-0.02:99
-chr1 4943949 rs6674570 C G 129.66 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.29;MQ0=0;OQ=3029.36;QD=43.28;SB=-1059.65 GT:AD:DP:GL:GQ 1/1:0,70:69:-306.54,-20.79,-0.02:99
-chr1 4943976 rs6689766 T C 365.66 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=56.77;MQ0=0;OQ=827.54;QD=14.03;SB=-391.26 GT:AD:DP:GL:GQ 0/1:29,30:57:-103.21,-17.17,-110.62:99
-chr1 4943997 rs6698166 G T 369.44 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.73;MQ0=0;OQ=860.15;QD=13.87;SB=-411.14 GT:AD:DP:GL:GQ 0/1:31,31:60:-107.37,-18.08,-104.72:99
-chr1 4943998 rs6698167 G A 353.24 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.73;MQ0=0;OQ=1051.24;QD=16.96;SB=-519.06 GT:AD:DP:GL:GQ 0/1:30,32:61:-126.79,-18.38,-103.11:99
-chr1 4944360 rs12131010 A G 342.06 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=58.85;MQ0=0;OQ=760.68;QD=9.88;SB=-317.87 GT:AD:DP:GL:GQ 0/1:43,34:75:-101.96,-22.60,-172.57:99
-chr1 4944890 rs1106586 G A 276.08 PASS AC=1;AF=0.50;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=1.40;MQ=59.59;MQ0=0;OQ=802.40;QD=14.33;SB=-392.78 GT:AD:DP:GL:GQ 0/1:30,26:55:-100.10,-16.58,-95.63:99
-chr1 4945646 rs898336 G C 25.91 PASS AC=2;AF=1.00;AN=2;DB;DP=96;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=56.72;MQ0=0;OQ=4154.41;QD=43.28;SB=-1921.01 GT:AD:DP:GL:GQ 1/1:0,96:94:-414.44,-28.32,-0.03:99
-chr1 4945654 rs7417805 T C 207.20 PASS AC=2;AF=1.00;AN=2;DB;DP=101;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=56.30;MQ0=0;OQ=3685.03;QD=36.49;SB=-1843.78 GT:AD:DP:GL:GQ 1/1:0,101:100:-367.50,-30.12,-0.02:99
-chr1 4946090 rs12046931 C T 231 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=2.55;MQ=56.28;MQ0=0;OQ=1030.23;QD=13.56;SB=-511.04 GT:AD:DP:GL:GQ 0/1:44,32:74:-128.62,-22.31,-131.20:99
-chr1 4946898 rs6679312 A G 627.33 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.42;MQ0=0;OQ=2846.93;QD=36.04;SB=-1277.52 GT:AD:DP:GL:GQ 1/1:0,79:79:-288.30,-23.79,-0.02:99
-chr1 4947277 . A C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=64;Dels=0.00;HRun=1;HaplotypeScore=4.31;MQ=58.55;MQ0=0;OQ=58.76;QD=0.92;SB=83.26 GT:AD:DP:GL:GQ 0/1:39,25:47:-23.33,-14.17,-133.19:91.60
-chr1 4947969 rs716671 G T 362.39 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=0.74;MQ=59.37;MQ0=0;OQ=959.61;QD=14.54;SB=-385.78 GT:AD:DP:GL:GQ 0/1:32,34:63:-118.22,-18.98,-106.13:99
-chr1 4948484 rs7541612 T C 301.06 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.16;MQ0=0;OQ=2459.32;QD=34.16;SB=-1006.88 GT:AD:DP:GL:GQ 1/1:0,72:70:-249.54,-21.08,-0.02:99
-chr1 4948794 rs10737392 A C 185.94 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2094.20;QD=29.50;SB=-992.36 GT:AD:DP:GL:GQ 1/1:0,71:69:-213.07,-20.80,-0.07:99
-chr1 4951092 rs12725971 A G 439.70 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.52;MQ0=0;OQ=1026.84;QD=13.16;SB=-423.90 GT:AD:DP:GL:GQ 0/1:43,35:78:-129.46,-23.49,-174.67:99
-chr1 4951570 rs6683624 C T 353.86 PASS AC=1;AF=0.50;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=2.63;MQ=59.06;MQ0=0;OQ=1065.83;QD=15.45;SB=-486.02 GT:AD:DP:GL:GQ 0/1:35,34:67:-130.05,-20.19,-121.88:99
-chr1 4953123 rs7418901 T C 620.55 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=2650.80;QD=31.56;SB=-1309.87 GT:AD:DP:GL:GQ 1/1:0,84:83:-268.73,-25.03,-0.06:99
-chr1 4955464 rs1459754 T C 197.18 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.56;MQ0=0;OQ=2710.14;QD=31.88;SB=-1351.75 GT:AD:DP:GL:GQ 1/1:0,85:84:-274.67,-25.33,-0.07:99
-chr1 4956424 rs12566071 T C 456.39 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.68;MQ0=0;OQ=1092.05;QD=27.30;SB=-412.16 GT:AD:DP:GL:GQ 1/1:0,40:36:-112.83,-10.86,-0.04:99
-chr1 4956725 rs12047194 C T 71.14 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.61;MQ=60.00;MQ0=0;OQ=1049.88;QD=16.93;SB=-178.21 GT:AD:DP:GL:GQ 0/1:29,33:61:-126.65,-18.37,-103.04:99
-chr1 4957085 . G A 6.71 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.62;MQ0=0;OQ=1318.00;QD=21.61;SB=-441.83 GT:AD:DP:GL:GQ 0/1:23,38:60:-153.16,-18.08,-75.01:99
-chr1 4957708 rs9701766 C T 287.33 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=59.24;MQ0=0;OQ=1921.26;QD=34.93;SB=-917.67 GT:AD:DP:GL:GQ 1/1:0,55:50:-195.73,-15.07,-0.02:99
-chr1 4957732 rs12134477 T G 328.37 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.88;MQ=59.35;MQ0=0;OQ=737.05;QD=11.52;SB=-389.76 GT:AD:DP:GL:GQ 0/1:34,30:62:-95.67,-18.68,-123.44:99
-chr1 4960336 rs9286972 T C 80.40 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=3;HaplotypeScore=0.87;MQ=59.38;MQ0=0;OQ=2352.51;QD=35.11;SB=-877.01 GT:AD:DP:GL:GQ 1/1:0,67:65:-238.86,-19.58,-0.02:99
-chr1 4960363 rs9286973 A G 217.69 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.91;MQ=58.74;MQ0=0;OQ=2328.65;QD=33.27;SB=-776.20 GT:AD:DP:GL:GQ 1/1:0,68:66:-236.47,-19.88,-0.02:99
-chr1 4960544 rs10158116 T C 435.93 PASS AC=2;AF=1.00;AN=2;DB;DP=28;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.17;MQ0=0;OQ=930.68;QD=33.24;SB=-423.17 GT:AD:DP:GL:GQ 1/1:0,28:27:-96.66,-8.13,-0.01:81.23
-chr1 4961077 rs1380469 C T 600.30 PASS AC=2;AF=1.00;AN=2;DB;DP=88;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3571.25;QD=40.58;SB=-1432.72 GT:AD:DP:GL:GQ 1/1:0,88:87:-356.13,-26.20,-0.02:99
-chr1 4961379 rs10158288 T C 503.56 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=2541.28;QD=30.99;SB=-793.00 GT:AD:DP:GL:GQ 1/1:0,82:80:-257.79,-24.13,-0.07:99
-chr1 4963153 rs10915307 G A 69.93 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=1.45;MQ=59.07;MQ0=0;OQ=713.61;QD=14.27;SB=-252.29 GT:AD:DP:GL:GQ 0/1:25,25:45:-88.21,-13.57,-68.76:99
-chr1 4964065 rs10737393 G C 566.31 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1749.68;QD=40.69;SB=-797.25 GT:AD:DP:GL:GQ 1/1:0,43:42:-178.57,-12.66,-0.02:99
-chr1 4964532 rs28667637 T C 501.28 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1316.20;QD=16.05;SB=-509.69 GT:AD:DP:GL:GQ 0/1:33,49:82:-159.62,-24.71,-131.78:99
-chr1 4964976 rs12027167 C T 376.96 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.50;MQ0=0;OQ=1085.57;QD=14.47;SB=-544.31 GT:AD:DP:GL:GQ 0/1:42,33:75:-134.44,-22.60,-148.57:99
-chr1 4965052 rs28444318 G A 401.64 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=1204.51;QD=18.82;SB=-457.96 GT:AD:DP:GL:GQ 0/1:28,36:62:-142.42,-18.68,-88.92:99
-chr1 4965449 rs10915308 C T 686.42 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=2543.15;QD=38.53;SB=-937.28 GT:AD:DP:GL:GQ 1/1:0,66:64:-257.91,-19.28,-0.02:99
-chr1 4965556 rs12123277 C A 350.21 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=60.00;MQ0=0;OQ=722.36;QD=9.63;SB=-338.31 GT:AD:DP:GL:GQ 0/1:48,27:74:-97.81,-22.29,-174.39:99
-chr1 4965577 rs1380470 A G 738.02 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2392.77;QD=36.25;SB=-1196.76 GT:AD:DP:GL:GQ 1/1:0,66:66:-242.88,-19.88,-0.01:99
-chr1 4965710 rs10915309 G A 204.24 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.87;MQ=59.60;MQ0=0;OQ=2319.12;QD=39.98;SB=-986.30 GT:AD:DP:GL:GQ 1/1:0,58:58:-235.51,-17.47,-0.02:99
-chr1 4968070 rs10915310 A G 390.05 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.97;MQ=59.15;MQ0=0;OQ=1179.59;QD=14.39;SB=-449.76 GT:AD:DP:GL:GQ 0/1:38,44:81:-145.65,-24.41,-157.59:99
-chr1 4968105 rs10799151 A G 154.91 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=3.73;MQ=58.89;MQ0=0;OQ=1031.60;QD=12.74;SB=-406.80 GT:AD:DP:GL:GQ 0/1:40,41:78:-129.95,-23.51,-157.15:99
-chr1 4968710 . C G 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=41;Dels=0.00;HRun=0;HaplotypeScore=1.90;MQ=53.48;MQ0=0;OQ=64.03;QD=1.56;SB=-49.12 GT:AD:DP:GL:GQ 0/1:36,5:37:-20.84,-11.15,-143.24:96.86
-chr1 4968815 rs10915311 A C 217.55 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.03;MQ0=0;OQ=2004.53;QD=29.92;SB=-920.78 GT:AD:DP:GL:GQ 1/1:0,66:64:-204.09,-19.29,-0.06:99
-chr1 4969030 rs34951087 G T 218.41 PASS AC=1;AF=0.50;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=59.09;MQ0=0;OQ=572.86;QD=11.23;SB=-277.34 GT:AD:DP:GL:GQ 0/1:30,21:51:-75.93,-15.36,-106.99:99
-chr1 4970267 rs10915312 A G 154.58 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=2;HaplotypeScore=1.56;MQ=58.90;MQ0=0;OQ=985.64;QD=12.32;SB=-409.96 GT:AD:DP:GL:GQ 0/1:41,39:79:-125.65,-23.81,-166.76:99
-chr1 4970523 rs12045336 A G 132 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.57;MQ=59.62;MQ0=0;OQ=1080.57;QD=17.71;SB=-383.65 GT:AD:DP:GL:GQ 0/1:25,36:60:-129.41,-18.07,-101.07:99
-chr1 4971344 . A C 49.60 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=0;HaplotypeScore=45.73;MQ=55.38;MQ0=0;QD=0.57;SB=95.30 GT:AD:DP:GL:GQ 0/1:77,10:78:-31.75,-23.50,-240.44:82.44
-chr1 4972155 rs1870516 C T 119.50 PASS AC=1;AF=0.50;AN=2;DB;DP=95;Dels=0.00;HRun=2;HaplotypeScore=2.64;MQ=59.76;MQ0=0;OQ=1584.03;QD=16.67;SB=-599.54 GT:AD:DP:GL:GQ 0/1:49,46:91:-189.10,-27.42,-151.90:99
-chr1 4972838 rs1459756 T C 570.91 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=978.37;QD=13.22;SB=-505.27 GT:AD:DP:GL:GQ 0/1:38,36:72:-122.81,-21.69,-153.16:99
-chr1 4972952 rs9286975 G A 397.79 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2673.75;QD=39.91;SB=-1305.72 GT:AD:DP:GL:GQ 1/1:0,67:67:-270.98,-20.18,-0.02:99
-chr1 4973015 rs9662653 T A 589.24 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=1272.49;QD=16.74;SB=-576.01 GT:AD:DP:GL:GQ 0/1:36,40:76:-153.42,-22.89,-135.61:99
-chr1 4973096 rs9701780 T C 360.62 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.34;MQ0=0;OQ=907.74;QD=12.97;SB=-427.52 GT:AD:DP:GL:GQ 0/1:38,32:70:-115.14,-21.08,-154.90:99
-chr1 4973099 rs1459757 A G 435.82 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.36;MQ0=0;OQ=906.72;QD=12.59;SB=-477.95 GT:AD:DP:GL:GQ 0/1:40,32:72:-115.64,-21.69,-161.61:99
-chr1 4973396 rs10753346 T C 325.42 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.65;MQ0=0;OQ=745.38;QD=11.29;SB=-293.22 GT:AD:DP:GL:GQ 0/1:39,27:65:-97.40,-19.58,-152.44:99
-chr1 4973518 rs10799152 A C 461.39 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.77;MQ0=0;OQ=1062.89;QD=13.29;SB=-461.68 GT:AD:DP:GL:GQ 0/1:43,37:80:-133.67,-24.09,-159.84:99
-chr1 4974497 rs35292186 A G 69.66 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.78;MQ0=0;OQ=1148.97;QD=13.84;SB=-573.87 GT:AD:DP:GL:GQ 0/1:43,40:81:-142.58,-24.40,-174.12:99
-chr1 4976182 rs10915314 G C 291.75 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.96;MQ=60.00;MQ0=0;OQ=1306.22;QD=17.65;SB=-415.30 GT:AD:DP:GL:GQ 0/1:38,36:73:-155.90,-22.00,-163.97:99
-chr1 4977412 rs12047764 T C 324.11 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.73;MQ=59.63;MQ0=0;OQ=712.65;QD=11.49;SB=-368.84 GT:AD:DP:GL:GQ 0/1:33,29:62:-93.24,-18.69,-135.85:99
-chr1 4978209 rs10915315 A G 314.02 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.17;MQ0=0;OQ=593.55;QD=8.73;SB=-263.22 GT:AD:DP:GL:GQ 0/1:42,26:67:-82.83,-20.19,-168.85:99
-chr1 4978799 rs10915316 T C 253.84 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=3.42;MQ=59.03;MQ0=0;OQ=793.88;QD=11.03;SB=-421.21 GT:AD:DP:GL:GQ 0/1:40,31:69:-103.46,-20.78,-159.70:99
-chr1 4980236 . G A 100.41 PASS AC=1;AF=0.50;AN=2;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.79;MQ0=0;OQ=1786.33;QD=21.02;SB=-886.64 GT:AD:DP:GL:GQ 0/1:34,51:83:-206.92,-25.00,-119.27:99
-chr1 4980926 rs10915317 T C 438.47 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.93;MQ=59.66;MQ0=0;OQ=838.53;QD=12.33;SB=-314.09 GT:AD:DP:GL:GQ 0/1:34,34:67:-107.33,-20.19,-138.42:99
-chr1 4981033 rs898337 G A 348.85 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.70;MQ0=0;OQ=1302.29;QD=16.91;SB=-502.50 GT:AD:DP:GL:GQ 0/1:36,41:75:-156.11,-22.60,-126.45:99
-chr1 4981597 rs7516703 C T 165.71 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=1.76;MQ=60.19;MQ0=0;OQ=561.42;QD=9.85;SB=-184.86 GT:AD:DP:GL:GQ 0/1:36,21:54:-75.71,-16.28,-112.37:99
-chr1 4982000 rs10799153 A G 596.01 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.94;MQ0=0;OQ=1157.46;QD=16.30;SB=-464.59 GT:AD:DP:GL:GQ 0/1:32,39:71:-140.42,-21.40,-120.74:99
-chr1 4983908 . G A 17.79 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=67;Dels=0.00;HRun=16;HaplotypeScore=7.18;MQ=55.71;MQ0=0;QD=0.27;SB=86.25 GT:AD:DP:GL:GQ 0/1:51,16:49:-19.83,-14.77,-145.36:50.55
-chr1 4985809 rs9439574 C T 11.86 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=4;HaplotypeScore=0.16;MQ=58.95;MQ0=0;OQ=1576.28;QD=19.70;SB=-625.03 GT:AD:DP:GL:GQ 0/1:34,46:79:-184.71,-23.79,-124.63:99
-chr1 4985815 rs9439575 A G 487 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.98;MQ0=0;OQ=1410.52;QD=17.20;SB=-545.94 GT:AD:DP:GL:GQ 0/1:36,46:82:-169.04,-24.70,-144.72:99
-chr1 4986567 rs10218468 A C 245.59 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=789.54;QD=11.78;SB=-394.67 GT:AD:DP:GL:GQ 0/1:34,33:66:-102.12,-19.88,-128.07:99
-chr1 4987124 rs10442625 A G 373.16 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.11;MQ=59.63;MQ0=0;OQ=720.29;QD=11.43;SB=-219.26 GT:AD:DP:GL:GQ 0/1:37,26:62:-93.99,-18.68,-145.68:99
-chr1 4988477 rs2169089 A G 373.87 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=1.63;MQ=59.69;MQ0=0;OQ=1114.19;QD=14.86;SB=-356.97 GT:AD:DP:GL:GQ 0/1:29,45:72:-136.41,-21.71,-118.67:99
-chr1 4988875 rs716112 A G 453.40 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=842.62;QD=12.58;SB=-426.87 GT:AD:DP:GL:GQ 0/1:33,34:66:-107.44,-19.90,-129.75:99
-chr1 4990575 rs1459764 C T 573.83 PASS AC=1;AF=0.50;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.71;MQ0=0;OQ=1234.93;QD=15.63;SB=-612.07 GT:AD:DP:GL:GQ 0/1:42,37:78:-150.28,-23.50,-132.81:99
-chr1 4990857 rs9439507 A G 285 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.35;MQ0=0;OQ=2461.09;QD=34.66;SB=-1130.69 GT:AD:DP:GL:GQ 1/1:0,71:71:-249.72,-21.39,-0.03:99
-chr1 4991092 rs10442626 G C 211.49 PASS AC=1;AF=0.50;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=59.60;MQ0=0;OQ=718.97;QD=12.61;SB=-159.21 GT:AD:DP:GL:GQ 0/1:31,26:54:-91.46,-16.28,-132.88:99
-chr1 4991687 rs4949164 A G 470.49 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=60.00;MQ0=0;OQ=1103.70;QD=13.80;SB=-401.93 GT:AD:DP:GL:GQ 0/1:38,42:79:-137.46,-23.80,-155.83:99
-chr1 4993546 rs7533014 T C 526.25 PASS AC=1;AF=0.50;AN=2;DB;DP=91;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1036.32;QD=11.39;SB=-442.91 GT:AD:DP:GL:GQ 0/1:49,42:90:-134.04,-27.12,-197.59:99
-chr1 4993852 rs11580542 A G 170.64 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.73;MQ0=0;OQ=650.23;QD=9.56;SB=-317.81 GT:AD:DP:GL:GQ 0/1:43,25:66:-88.19,-19.88,-168.41:99
-chr1 4994065 . C T 20.53 PASS AC=1;AF=0.50;AN=2;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1330.95;QD=18.75;SB=-592.09 GT:AD:DP:GL:GQ 0/1:33,38:71:-157.76,-21.38,-120.30:99
-chr1 4994295 rs6693990 G A 335.33 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.95;MQ=57.88;MQ0=0;OQ=1019.69;QD=16.19;SB=-465.42 GT:AD:DP:GL:GQ 0/1:31,32:60:-123.32,-18.07,-111.15:99
-chr1 4994563 rs1459763 A G 13.43 PASS AC=1;AF=0.50;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=5.21;MQ=58.04;MQ0=0;OQ=377.66;QD=9.21;SB=-181.57 GT:AD:DP:GL:GQ 0/1:25,16:38:-52.50,-11.45,-93.25:99
-chr1 4995722 rs1459762 C T 513.24 PASS AC=1;AF=0.50;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=1249.58;QD=19.22;SB=-511.06 GT:AD:DP:GL:GQ 0/1:27,38:64:-147.53,-19.29,-84.78:99
-chr1 4996533 . T G 102.56 PASS AC=1;AF=0.50;AN=2;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.96;MQ=59.08;MQ0=0;OQ=597.86;QD=9.80;SB=-320.69 GT:AD:DP:GL:GQ 0/1:35,26:61:-81.45,-18.38,-132.05:99
-chr1 4999697 . C G 5.71 PASS AC=1;AF=0.50;AN=2;DP=88;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=59.53;MQ0=0;OQ=2076.06;QD=23.59;SB=-758.01 GT:AD:DP:GL:GQ 0/1:34,54:87:-237.12,-26.23,-133.95:99
-chr1 4999785 . A G 153.89 PASS AC=1;AF=0.50;AN=2;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.27;MQ=59.42;MQ0=0;OQ=950.41;QD=13.20;SB=-485.20 GT:AD:DP:GL:GQ 0/1:39,33:71:-119.71,-21.39,-153.18:99
-chr1 5000124 rs35565495 A G 217.11 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.82;MQ=57.68;MQ0=0;OQ=905.68;QD=12.41;SB=-443.62 GT:AD:DP:GL:GQ 0/1:40,33:73:-115.85,-22.00,-156.82:99
-chr1 5000551 rs1459761 A G 316.71 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=2.15;MQ=59.68;MQ0=0;OQ=1082.64;QD=18.35;SB=-522.18 GT:AD:DP:GL:GQ 0/1:24,35:59:-129.32,-17.77,-97.53:99
-chr1 5002004 rs12403444 A G 454.86 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.14;MQ=59.69;MQ0=0;OQ=1008.17;QD=13.62;SB=-385.25 GT:AD:DP:GL:GQ 0/1:38,36:71:-125.49,-21.39,-141.83:99
-chr1 5002384 rs12403749 A G 334.10 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.18;MQ0=0;OQ=762.42;QD=12.92;SB=-306.27 GT:AD:DP:GL:GQ 0/1:32,27:59:-97.30,-17.77,-132.93:99
-chr1 5002965 rs55998096 C T 265.85 PASS AC=1;AF=0.50;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1237.12;QD=16.95;SB=-623.66 GT:AD:DP:GL:GQ 0/1:35,38:72:-148.68,-21.69,-128.69:99
-chr1 5003908 rs1459759 T G 287.81 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.68;MQ0=0;OQ=1018.83;QD=14.15;SB=-495.74 GT:AD:DP:GL:GQ 0/1:34,38:70:-126.25,-21.08,-125.30:99
-chr1 5004548 . C T 0.18 PASS AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=4;HaplotypeScore=0.97;MQ=55.65;MQ0=0;OQ=1952.83;QD=19.15;SB=-933.54 GT:AD:DP:GL:GQ 0/1:44,58:102:-229.30,-30.73,-156.88:99
-chr1 5004874 rs55883351 G A 211.60 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=41.17;MQ0=0;OQ=1434.24;QD=17.49;SB=-707.75 GT:AD:DP:GL:GQ 0/1:39,43:79:-170.52,-23.81,-118.83:99
-chr1 5005796 . T G 22.56 PASS AC=1;AF=0.50;AN=2;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.97;MQ=52.68;MQ0=0;OQ=1101.12;QD=15.73;SB=-417.74 GT:AD:DP:GL:GQ 0/1:29,41:66:-133.27,-19.88,-106.95:99
-chr1 5005889 rs10737394 A G 342.71 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=55.43;MQ0=0;OQ=434.38;QD=9.05;SB=-233.28 GT:AD:DP:GL:GQ 0/1:27,21:46:-60.59,-13.87,-106.69:99
-chr1 5006532 rs10799156 G C 195.83 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=38.14;MQ0=9;OQ=508.53;QD=10.38;SB=-226.35 GT:AD:DP:GL:GQ 0/1:19,30:34:-64.39,-10.25,-81.21:99
-chr1 5007005 rs6603829 T C 0.07 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=16.12;MQ=27.87;MQ0=17;OQ=171.08;QD=2.19;SB=-108.70 GT:AD:DP:GL:GQ 0/1:51,27:35:-30.94,-10.55,-97.26:99
-chr1 5007006 rs6603830 G A 0.04 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=18.32;MQ=27.85;MQ0=18;OQ=165.82;QD=2.13;SB=-81.55 GT:AD:DP:GL:GQ 0/1:59,19:36:-30.72,-10.85,-97.29:99
-chr1 5007287 . C G 0.46 PASS AC=1;AF=0.50;AN=2;DP=52;Dels=0.00;HRun=1;HaplotypeScore=8.19;MQ=48.27;MQ0=4;OQ=754.87;QD=14.52;SB=-244.08 GT:AD:DP:GL:GQ 0/1:26,25:44:-92.04,-13.27,-89.64:99
-chr1 5007421 . A G 0.01 FDRtranche2.00to10.00 AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=1;HaplotypeScore=5.43;MQ=22.24;MQ0=26;OQ=110.20;QD=1.12;SB=7.49 GT:AD:DP:GL:GQ 0/1:85,12:42:-26.95,-12.65,-140.65:99
-chr1 5007424 . G C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=2;HaplotypeScore=3.53;MQ=23.00;MQ0=24;OQ=143.47;QD=1.54;SB=3.27 GT:AD:DP:GL:GQ 0/1:81,12:42:-30.29,-12.66,-152.47:99
-chr1 5011084 . C G 46.29 PASS AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=45.50;MQ0=2;OQ=1885.25;QD=20.27;SB=-717.97 GT:AD:DP:GL:GQ 0/1:41,52:88:-218.32,-26.51,-163.98:99
-chr1 5011731 . C T 18.24 PASS AC=1;AF=0.50;AN=2;DP=87;Dels=0.00;HRun=2;HaplotypeScore=0.79;MQ=54.65;MQ0=1;OQ=1577.37;QD=18.13;SB=-623.62 GT:AD:DP:GL:GQ 0/1:41,46:86:-186.92,-25.90,-147.64:99
-chr1 5012084 rs10915327 C T 347.57 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=48.94;MQ0=2;OQ=1240.99;QD=17.24;SB=-606.09 GT:AD:DP:GL:GQ 0/1:32,40:68:-147.88,-20.49,-101.20:99
-chr1 5012508 . G A 165.62 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=0;HaplotypeScore=0.74;MQ=34.81;MQ0=2;OQ=954.73;QD=16.75;SB=-470.48 GT:AD:DP:GL:GQ 0/1:23,33:48:-113.23,-14.48,-57.23:99
-chr1 5014453 . C A 65.76 PASS AC=1;AF=0.50;AN=2;DP=89;Dels=0.00;HRun=1;HaplotypeScore=0.92;MQ=59.79;MQ0=0;OQ=1613.72;QD=18.13;SB=-734.55 GT:AD:DP:GL:GQ 0/1:38,51:88:-191.16,-26.50,-131.97:99
-chr1 5016018 . T G 165.96 PASS AC=1;AF=0.50;AN=2;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=1295.09;QD=17.50;SB=-624.73 GT:AD:DP:GL:GQ 0/1:31,43:74:-155.08,-22.29,-116.52:99
-chr1 5018516 rs4262591 A T 76.12 PASS AC=1;AF=0.50;AN=2;DB;DP=89;Dels=0.00;HRun=2;HaplotypeScore=0.94;MQ=59.27;MQ0=0;OQ=1137.62;QD=12.78;SB=-520.24 GT:AD:DP:GL:GQ 0/1:50,39:87:-143.25,-26.20,-190.22:99
-chr1 5020923 rs970119 A C 493.82 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=718.78;QD=10.27;SB=-241.77 GT:AD:DP:GL:GQ 0/1:40,30:69:-95.95,-20.78,-149.31:99
-chr1 5023267 . C G 91.77 PASS AC=1;AF=0.50;AN=2;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.92;MQ0=0;OQ=800.92;QD=19.07;SB=-315.01 GT:AD:DP:GL:GQ 0/1:20,22:41:-95.73,-12.36,-81.61:99
-chr1 5024719 rs1563792 G A 196.62 PASS AC=1;AF=0.50;AN=2;DB;DP=82;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=59.54;MQ0=0;OQ=1348.55;QD=16.45;SB=-599.05 GT:AD:DP:GL:GQ 0/1:42,40:80:-162.25,-24.11,-132.60:99
-chr1 5027451 rs56184292 G T 6.36 PASS AC=1;AF=0.50;AN=2;DB;DP=94;Dels=0.00;HRun=4;HaplotypeScore=0.58;MQ=60.00;MQ0=0;OQ=1415.10;QD=15.05;SB=-721.57 GT:AD:DP:GL:GQ 0/1:44,49:93:-172.81,-28.02,-154.91:99
-chr1 5029434 rs2061494 T A 49.68 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.72;MQ0=0;OQ=1567.79;QD=19.36;SB=-635.43 GT:AD:DP:GL:GQ 0/1:33,47:79:-183.86,-23.79,-122.93:99
-chr1 5029438 rs2061493 T A 66.27 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=1.72;MQ=59.72;MQ0=0;OQ=1477.11;QD=18.24;SB=-663.80 GT:AD:DP:GL:GQ 0/1:33,48:80:-175.09,-24.10,-128.48:99
-chr1 5029774 rs55724572 C A 223.76 PASS AC=1;AF=0.50;AN=2;DB;DP=101;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.17;MQ0=0;OQ=1394.44;QD=13.81;SB=-671.07 GT:AD:DP:GL:GQ 0/1:55,46:101:-173.14,-30.41,-200.20:99
-chr1 5029802 rs56297253 G A 420.62 PASS AC=1;AF=0.50;AN=2;DB;DP=102;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.18;MQ0=0;OQ=1452.74;QD=14.24;SB=-632.72 GT:AD:DP:GL:GQ 0/1:58,44:100:-178.69,-30.14,-182.65:99
-chr1 5030141 rs1459758 C G 545.16 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2835.80;QD=42.33;SB=-1264.90 GT:AD:DP:GL:GQ 1/1:0,67:65:-287.18,-19.58,-0.01:99
-chr1 5032542 rs977665 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=92;Dels=0.00;HRun=14;HaplotypeScore=4.90;MQ=58.74;MQ0=0;OQ=53.47;QD=0.58;SB=128.44 GT:AD:DP:GL:GQ 0/1:77,15:69:-29.43,-20.80,-218.90:86.30
-chr1 5036504 rs922123 T C 526.95 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.12;MQ0=0;OQ=805.20;QD=10.88;SB=-361.22 GT:AD:DP:GL:GQ 0/1:44,30:74:-106.10,-22.29,-176.34:99
-chr1 5036703 rs55875722 T A 259.30 PASS AC=1;AF=0.50;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.65;MQ0=0;OQ=1241.65;QD=18.81;SB=-625.13 GT:AD:DP:GL:GQ 0/1:28,38:64:-146.72,-19.28,-96.42:99
-chr1 5036704 rs922124 T A 61.83 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.67;MQ0=0;OQ=2561.19;QD=37.12;SB=-1099.66 GT:AD:DP:GL:GQ 1/1:0,69:68:-259.72,-20.48,-0.02:99
-chr1 5036974 rs56077964 G A 617 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2268.61;QD=38.45;SB=-1080.42 GT:AD:DP:GL:GQ 1/1:0,59:56:-230.46,-16.87,-0.01:99
-chr1 5039060 rs56186517 C T 567.90 PASS AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.53;MQ0=0;OQ=3555.73;QD=39.95;SB=-1607.16 GT:AD:DP:GL:GQ 1/1:0,89:87:-354.57,-26.20,-0.02:99
-chr1 5039732 rs56347558 T C 203.59 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.44;MQ=59.06;MQ0=0;OQ=2530.73;QD=34.20;SB=-928.36 GT:AD:DP:GL:GQ 1/1:0,73:71:-256.68,-21.39,-0.02:99
-chr1 5040152 rs3128686 G T 232.26 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.70;MQ0=0;OQ=2534.37;QD=32.49;SB=-1255.28 GT:AD:DP:GL:GQ 1/1:1,77:71:-257.05,-21.39,-0.03:99
-chr1 5040933 rs12045197 A T 91.33 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=2.81;MQ=44.79;MQ0=0;OQ=1582.06;QD=35.96;SB=-689.38 GT:AD:DP:GL:GQ 1/1:0,44:44:-161.81,-13.26,-0.02:99
-chr1 5041153 rs3128687 G T 199.02 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=55.94;MQ0=0;OQ=2861.17;QD=36.22;SB=-1432.06 GT:AD:DP:GL:GQ 1/1:0,79:77:-289.72,-23.19,-0.02:99
-chr1 5041314 rs3128688 A T 418.75 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.72;MQ0=0;OQ=2724.95;QD=37.85;SB=-1190.46 GT:AD:DP:GL:GQ 1/1:0,72:72:-276.10,-21.69,-0.02:99
-chr1 5041500 rs3128689 C A 313.60 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.24;MQ=59.77;MQ0=0;OQ=2974.21;QD=36.27;SB=-1175.38 GT:AD:DP:GL:GQ 1/1:0,82:81:-301.03,-24.39,-0.02:99
-chr1 5042266 rs10915339 G A 611.24 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.20;MQ0=0;OQ=2730.95;QD=39.01;SB=-1105.02 GT:AD:DP:GL:GQ 1/1:0,70:70:-276.70,-21.09,-0.02:99
-chr1 5042286 rs10915340 T C 619.37 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.86;MQ0=0;OQ=2323.00;QD=35.20;SB=-939.39 GT:AD:DP:GL:GQ 1/1:0,65:65:-235.90,-19.58,-0.02:99
-chr1 5042412 rs10915341 T G 227.06 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.39;MQ0=0;OQ=2175.06;QD=35.66;SB=-984.12 GT:AD:DP:GL:GQ 1/1:0,61:61:-221.11,-18.37,-0.01:99
-chr1 5042489 rs12029437 C G 85.77 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=2.70;MQ=59.16;MQ0=0;OQ=2913.26;QD=40.46;SB=-1456.73 GT:AD:DP:GL:GQ 1/1:0,72:69:-294.94,-20.80,-0.03:99
-chr1 5042644 rs12047111 A G 505.22 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=1237.53;QD=28.78;SB=-430.81 GT:AD:DP:GL:GQ 1/1:0,43:41:-127.38,-12.37,-0.05:99
-chr1 5042678 rs2334263 T C 624.61 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=1911.69;QD=29.87;SB=-888.47 GT:AD:DP:GL:GQ 1/1:0,64:60:-194.81,-18.10,-0.06:99
-chr1 5043104 rs10799159 C A 257.58 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=59.14;MQ0=0;OQ=3046.41;QD=35.84;SB=-1505.91 GT:AD:DP:GL:GQ 1/1:0,85:84:-308.25,-25.30,-0.02:99
-chr1 5043177 rs10799160 G A 205.89 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=1.49;MQ=59.29;MQ0=0;OQ=2756.78;QD=37.25;SB=-1155.91 GT:AD:DP:GL:GQ 1/1:1,72:71:-282.75,-21.39,-3.49:99
-chr1 5043218 rs10799161 A C 127.41 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.10;MQ0=0;OQ=2285.87;QD=29.69;SB=-810.83 GT:AD:DP:GL:GQ 1/1:0,77:71:-232.22,-21.39,-0.05:99
-chr1 5048318 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=69;Dels=0.00;HRun=4;HaplotypeScore=11.35;MQ=48.17;MQ0=0;OQ=57.54;QD=0.83;SB=77.27 GT:AD:DP:GL:GQ 0/1:47,22:47:-23.20,-14.17,-150.00:90.38
-chr1 5048545 rs10915343 T C 699.40 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.89;MQ0=0;OQ=1690.53;QD=34.50;SB=-831.35 GT:AD:DP:GL:GQ 1/1:0,49:48:-172.65,-14.46,-0.01:99
-chr1 5050626 rs3101213 A G 203.57 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=59.71;MQ0=0;OQ=2864.75;QD=36.26;SB=-1335.60 GT:AD:DP:GL:GQ 1/1:0,79:79:-290.08,-23.79,-0.02:99
-chr1 5051336 rs2199215 T C 701.57 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2974.37;QD=35.84;SB=-1419.92 GT:AD:DP:GL:GQ 1/1:0,83:83:-301.05,-25.00,-0.02:99
-chr1 5052019 rs12121092 G T 639.83 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2775.75;QD=36.52;SB=-1128.45 GT:AD:DP:GL:GQ 1/1:0,76:76:-281.18,-22.89,-0.02:99
-chr1 5057740 rs55852005 G A 37.87 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=3;HaplotypeScore=1.46;MQ=59.22;MQ0=0;OQ=1090.29;QD=18.48;SB=-513.03 GT:AD:DP:GL:GQ 0/1:26,33:57:-129.48,-17.17,-87.67:99
-chr1 5058085 rs4949171 C T 168.96 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=1.62;MQ=59.33;MQ0=0;OQ=2116.23;QD=37.79;SB=-957.98 GT:AD:DP:GL:GQ 1/1:0,56:55:-215.23,-16.58,-0.02:99
-chr1 5058717 rs9803863 G A 206.60 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=59.13;MQ0=0;OQ=2766.44;QD=39.52;SB=-1272.71 GT:AD:DP:GL:GQ 1/1:0,69:70:-283.01,-23.72,-2.78:99
-chr1 5059210 rs982156 T C 60.22 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.49;MQ=59.24;MQ0=0;OQ=1823.01;QD=33.15;SB=-568.39 GT:AD:DP:GL:GQ 1/1:0,55:54:-185.91,-16.27,-0.03:99
-chr1 5060220 rs992597 C T 157.27 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.89;MQ=59.01;MQ0=0;OQ=2915.53;QD=38.36;SB=-981.32 GT:AD:DP:GL:GQ 1/1:0,76:74:-295.16,-22.30,-0.02:99
-chr1 5060522 rs2242157 G T 298.92 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.45;MQ0=0;OQ=2405.81;QD=35.38;SB=-942.03 GT:AD:DP:GL:GQ 1/1:0,68:68:-244.19,-20.49,-0.03:99
-chr1 5060591 rs1459766 T G 395.54 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.24;MQ0=0;OQ=2600.59;QD=35.14;SB=-1143.14 GT:AD:DP:GL:GQ 1/1:0,74:73:-263.67,-21.99,-0.02:99
-chr1 5061734 rs9439532 C T 112.42 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=2.81;MQ=59.34;MQ0=0;OQ=2118.20;QD=37.16;SB=-1042.39 GT:AD:DP:GL:GQ 1/1:0,57:54:-215.42,-16.27,-0.02:99
-chr1 5062366 rs6683881 C T 35.99 PASS AC=2;AF=1.00;AN=2;DB;DP=91;Dels=0.00;HRun=1;HaplotypeScore=1.70;MQ=59.80;MQ0=0;OQ=3619.28;QD=39.77;SB=-1734.02 GT:AD:DP:GL:GQ 1/1:0,91:89:-360.93,-26.81,-0.02:99
-chr1 5062541 rs4949170 A G 156.11 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=0;HaplotypeScore=1.86;MQ=59.71;MQ0=0;OQ=2632.93;QD=33.33;SB=-1332.58 GT:AD:DP:GL:GQ 1/1:0,79:75:-266.90,-22.59,-0.03:99
-chr1 5062567 rs4949169 A T 172.52 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.83;MQ=59.68;MQ0=0;OQ=2759.54;QD=37.80;SB=-995.13 GT:AD:DP:GL:GQ 1/1:0,73:72:-279.55,-21.68,-0.01:99
-chr1 5063485 rs9439576 C G 98.90 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.17;MQ0=0;OQ=3111.26;QD=39.89;SB=-1145.60 GT:AD:DP:GL:GQ 1/1:0,77:71:-314.73,-21.39,-0.02:99
-chr1 5063671 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=60;Dels=0.00;HRun=2;HaplotypeScore=26.54;MQ=57.06;MQ0=0;OQ=128.17;QD=2.14;SB=77.28 GT:AD:DP:GL:GQ 0/1:38,22:39:-27.89,-11.79,-122.93:99
-chr1 5064284 rs2169090 T C 707.36 PASS AC=2;AF=1.00;AN=2;DB;DP=89;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.41;MQ0=0;OQ=3152.45;QD=35.42;SB=-1370.23 GT:AD:DP:GL:GQ 1/1:0,89:88:-318.85,-26.50,-0.02:99
-chr1 5066340 rs57000660 A G 484.39 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=766.60;QD=12.99;SB=-402.18 GT:AD:DP:GL:GQ 0/1:32,27:59:-97.71,-17.77,-131.87:99
-chr1 5066393 rs1037809 C T 706.58 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3074.28;QD=39.41;SB=-1449.38 GT:AD:DP:GL:GQ 1/1:0,78:78:-311.04,-23.50,-0.02:99
-chr1 5068397 rs6659363 G C 337.44 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.22;MQ0=0;OQ=768.71;QD=14.24;SB=-229.04 GT:AD:DP:GL:GQ 0/1:31,23:53:-96.12,-15.97,-137.34:99
-chr1 5068500 rs12124337 A C 365.74 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=60.00;MQ0=0;OQ=1243.29;QD=15.94;SB=-471.71 GT:AD:DP:GL:GQ 0/1:35,43:77:-150.81,-23.19,-127.77:99
-chr1 5068523 rs10733013 C T 471.58 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=1107.71;QD=14.39;SB=-422.79 GT:AD:DP:GL:GQ 0/1:43,34:75:-136.66,-22.60,-133.09:99
-chr1 5069554 rs2722789 G A 592.26 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1009.56;QD=14.02;SB=-503.00 GT:AD:DP:GL:GQ 0/1:41,31:72:-125.95,-21.71,-131.55:99
-chr1 5070551 rs4949160 A T 476.97 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.42;MQ0=0;OQ=1068.05;QD=14.83;SB=-488.53 GT:AD:DP:GL:GQ 0/1:37,35:71:-131.47,-21.38,-142.74:99
-chr1 5071819 . G A 258.71 PASS AC=1;AF=0.50;AN=2;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=1213.24;QD=16.18;SB=-353.81 GT:AD:DP:GL:GQ 0/1:39,36:75:-147.20,-22.59,-142.20:99
-chr1 5071854 . T A 81.17 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.95;MQ=60.00;MQ0=0;OQ=1149.23;QD=14.19;SB=-304.96 GT:AD:DP:GL:GQ 0/1:43,38:80:-142.31,-24.10,-164.66:99
-chr1 5072229 . G A 304.80 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=81;Dels=0.01;HRun=0;HaplotypeScore=64.90;MQ=44.02;MQ0=0;QD=3.76;SB=86.27 GT:AD:DP:GL:GQ 0/1:66,14:79:-57.26,-23.50,-230.57:99
-chr1 5072230 . C G 37.37 DPFilter;LowQual;SnpCluster AC=1;AF=0.50;AN=2;DP=83;Dels=0.01;HRun=2;HaplotypeScore=55.89;MQ=43.72;MQ0=0;QD=0.45;SB=80.30 GT:AD:DP:GL:GQ 0/1:67,6:72:-38.59,-31.57,-277.78:70.20
-chr1 5072236 . A G 214.30 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=80;Dels=0.08;HRun=2;HaplotypeScore=77.80;MQ=44.49;MQ0=0;QD=2.68;SB=83.29 GT:AD:DP:GL:GQ 0/1:56,12:72:-66.82,-42.10,-235.08:99
-chr1 5072261 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=81;Dels=0.05;HRun=0;HaplotypeScore=73.45;MQ=43.15;MQ0=0;OQ=399.38;QD=4.93;SB=83.29 GT:AD:DP:GL:GQ 0/1:51,25:67:-62.51,-19.29,-172.53:99
-chr1 5072278 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=86;Dels=0.01;HRun=1;HaplotypeScore=43.28;MQ=42.83;MQ0=0;OQ=260.49;QD=3.03;SB=63.28 GT:AD:DP:GL:GQ 0/1:59,19:75:-74.72,-45.39,-204.92:99
-chr1 5072305 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=82;Dels=0.04;HRun=0;HaplotypeScore=77.14;MQ=40.79;MQ0=0;OQ=744.26;QD=9.08;SB=-270.19 GT:AD:DP:GL:GQ 0/1:44,35:70:-97.91,-20.20,-140.23:99
-chr1 5072314 . C A 26.92 LowQual AC=1;AF=0.50;AN=2;DP=80;Dels=0.00;HRun=1;HaplotypeScore=53.92;MQ=40.19;MQ0=0;QD=0.34;SB=-28.60 GT:AD:DP:GL:GQ 0/1:60,11:56:-29.71,-23.73,-169.35:59.74
-chr1 5072329 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=71;Dels=0.01;HRun=0;HaplotypeScore=74.94;MQ=38.44;MQ0=0;OQ=775.14;QD=10.92;SB=-292.22 GT:AD:DP:GL:GQ 0/1:41,28:64:-99.78,-18.98,-129.83:99
-chr1 5072338 . C G 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=63;Dels=0.02;HRun=2;HaplotypeScore=51.40;MQ=37.08;MQ0=0;OQ=162.47;QD=2.58;SB=101.36 GT:AD:DP:GL:GQ 0/1:48,8:57:-50.13,-30.60,-201.42:99
-chr1 5072354 . A G 70.72 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=68;Dels=0.01;HRun=3;HaplotypeScore=80.87;MQ=34.07;MQ0=1;QD=1.04;SB=50.19 GT:AD:DP:GL:GQ 0/1:55,12:60:-28.14,-17.78,-195.72:99
-chr1 5072357 . A G 633.36 SnpCluster AC=1;AF=0.50;AN=2;DP=67;Dels=0.01;HRun=1;HaplotypeScore=71.93;MQ=33.53;MQ0=1;QD=9.45;SB=-235.45 GT:AD:DP:GL:GQ 0/1:28,25:61:-115.70,-49.08,-135.16:99
-chr1 5072359 . A C 486.53 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=69;Dels=0.03;HRun=0;HaplotypeScore=52.12;MQ=33.41;MQ0=1;QD=7.05;SB=62.18 GT:AD:DP:GL:GQ 0/1:42,24:63:-73.40,-21.46,-136.62:99
-chr1 5072383 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=101;Dels=0.00;HRun=1;HaplotypeScore=82.78;MQ=35.86;MQ0=1;OQ=50.85;QD=0.50;SB=43.30 GT:AD:DP:GL:GQ 0/1:88,10:72:-37.48,-29.11,-217.86:83.68
-chr1 5072395 . C A 570.19 SnpCluster AC=1;AF=0.50;AN=2;DP=99;Dels=0.02;HRun=1;HaplotypeScore=88.86;MQ=38.13;MQ0=1;QD=5.76;SB=-12.89 GT:AD:DP:GL:GQ 0/1:64,28:75:-96.04,-35.74,-177.41:99
-chr1 5072402 . A G 56.63 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=98;Dels=0.00;HRun=3;HaplotypeScore=106.83;MQ=38.72;MQ0=1;QD=0.58;SB=77.28 GT:AD:DP:GL:GQ 0/1:88,10:70:-30.04,-21.10,-237.13:89.47
-chr1 5072405 . G T 211.27 DPFilter;SnpCluster AC=1;AF=0.50;AN=2;DP=95;Dels=0.03;HRun=0;HaplotypeScore=106.15;MQ=39.10;MQ0=1;QD=2.22;SB=86.26 GT:AD:DP:GL:GQ 0/1:74,17:80:-48.52,-24.11,-223.42:99
-chr1 5072419 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=93;Dels=0.00;HRun=1;HaplotypeScore=52.76;MQ=39.26;MQ0=1;OQ=413.09;QD=4.44;SB=8.43 GT:AD:DP:GL:GQ 0/1:71,20:77:-71.28,-26.69,-194.57:99
-chr1 5072442 . A G 31.37 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=65;Dels=0.00;HRun=2;HaplotypeScore=72.31;MQ=41.30;MQ0=0;QD=0.48;SB=47.17 GT:AD:DP:GL:GQ 0/1:57,8:62:-25.11,-18.69,-212.28:64.20
-chr1 5073664 rs2611423 C A 218.42 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=2432.37;QD=35.25;SB=-1208.34 GT:AD:DP:GL:GQ 1/1:0,69:67:-246.84,-20.18,-0.02:99
-chr1 5073938 rs2611424 A G 134.32 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.25;MQ0=0;OQ=2912.91;QD=35.96;SB=-1287.55 GT:AD:DP:GL:GQ 1/1:0,81:80:-294.90,-24.09,-0.02:99
-chr1 5074030 rs2611425 C T 598.88 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=57.51;MQ0=0;OQ=2372.22;QD=38.89;SB=-1023.68 GT:AD:DP:GL:GQ 1/1:0,61:60:-240.82,-18.07,-0.01:99
-chr1 5074510 rs9439534 C T 637.40 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.93;MQ0=0;OQ=2321.21;QD=36.27;SB=-1159.05 GT:AD:DP:GL:GQ 1/1:0,64:59:-235.72,-17.77,-0.02:99
-chr1 5074638 rs57003830 G C 372.48 PASS AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.83;MQ=43.54;MQ0=4;OQ=1370.10;QD=15.75;SB=-494.22 GT:AD:DP:GL:GQ 0/1:45,42:79:-164.10,-23.81,-179.75:99
-chr1 5075049 rs9439577 C T 95.46 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=2.23;MQ=38.28;MQ0=7;OQ=1971.59;QD=31.30;SB=-484.14 GT:AD:DP:GL:GQ 1/1:0,62:51:-200.77,-15.37,-0.03:99
-chr1 5075121 rs9439535 A G 238.22 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=43.82;MQ0=4;OQ=1529.43;QD=28.32;SB=-495.19 GT:AD:DP:GL:GQ 1/1:0,54:47:-156.56,-14.17,-0.03:99
-chr1 5075150 rs9439578 T G 135.05 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=2.71;MQ=50.05;MQ0=3;OQ=2063.78;QD=31.75;SB=-748.06 GT:AD:DP:GL:GQ 1/1:0,65:60:-209.99,-18.08,-0.02:99
-chr1 5075197 rs10915347 C T 55.81 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=2.29;MQ=47.56;MQ0=6;OQ=2171.81;QD=32.91;SB=-915.72 GT:AD:DP:GL:GQ 1/1:0,65:56:-220.79,-16.88,-0.02:99
-chr1 5075319 rs28828787 G A 102.87 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=26.02;MQ0=15;OQ=432.78;QD=8.32;SB=-48.66 GT:AD:DP:GL:GQ 0/1:29,23:28:-55.00,-8.44,-46.26:99
-chr1 5075370 rs10799164 C T 16.89 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=0;HaplotypeScore=0.63;MQ=20.22;MQ0=13;OQ=746.84;QD=17.78;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,40:19:-78.27,-5.72,-0.00:57.19
-chr1 5075558 rs10799165 C T 9.35 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=9.90;MQ=22.74;MQ0=30;OQ=955.91;QD=12.58;SB=-324.43 GT:AD:DP:GL:GQ 1/1:31,45:25:-99.18,-7.53,-0.01:75.24
-chr1 5075601 rs10753349 C T 1.18 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=10.53;MQ=14.77;MQ0=51;OQ=525.81;QD=6.49;SB=-249.33 GT:AD:DP:GL:GQ 1/1:43,38:14:-56.17,-4.22,-0.00:42.14
-chr1 5075696 rs4949168 A G 0.23 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=5.94;MQ=11.29;MQ0=39;OQ=183.21;QD=2.91;SB=-118.05 GT:AD:DP:GL:GQ 1/1:33,30:6:-21.89,-1.81,-0.00:18.06
-chr1 5075699 rs10799166 G C 0.14 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=5.78;MQ=10.86;MQ0=38;OQ=173.64;QD=2.85;SB=-103.85 GT:AD:DP:GL:GQ 1/1:32,29:5:-20.93,-1.51,-0.00:15.05
-chr1 5075751 rs4949159 C A 0.57 PASS AC=2;AF=1.00;AN=2;DB;DP=36;Dels=0.00;HRun=1;HaplotypeScore=9.84;MQ=21.77;MQ0=1;OQ=523.96;QD=14.55;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,33:15:-55.98,-4.52,-0.00:45.14
-chr1 5075757 rs4949167 T C 1.62 PASS AC=2;AF=1.00;AN=2;DB;DP=42;Dels=0.00;HRun=1;HaplotypeScore=5.17;MQ=21.64;MQ0=3;OQ=605.43;QD=14.41;SB=-10.00 GT:AD:DP:GL:GQ 1/1:7,35:18:-64.13,-5.42,-0.00:54.16
-chr1 5076314 rs9439579 C G 74.36 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.92;MQ=43.71;MQ0=2;OQ=2095.83;QD=33.80;SB=-956.72 GT:AD:DP:GL:GQ 1/1:3,59:49:-213.18,-14.76,-0.01:99
-chr1 5076393 rs10915349 G A 1.75 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=6.65;MQ=47.36;MQ0=1;OQ=1988.87;QD=34.29;SB=-955.74 GT:AD:DP:GL:GQ 1/1:1,57:52:-202.50,-15.68,-0.03:99
-chr1 5076841 rs10799167 C T 211.34 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=45.50;MQ0=4;OQ=2210.86;QD=35.66;SB=-962.98 GT:AD:DP:GL:GQ 1/1:1,61:56:-224.69,-16.87,-0.02:99
-chr1 5077036 rs10799168 A G 167.61 PASS AC=2;AF=1.00;AN=2;DB;DP=27;Dels=0.00;HRun=1;HaplotypeScore=0.93;MQ=21.14;MQ0=7;OQ=400.64;QD=14.84;SB=-196.71 GT:AD:DP:GL:GQ 1/1:8,19:13:-43.66,-3.92,-0.01:39.11
-chr1 5077055 rs7414866 A G 123.85 PASS AC=2;AF=1.00;AN=2;DB;DP=21;Dels=0.00;HRun=0;HaplotypeScore=0.73;MQ=21.33;MQ0=4;OQ=281.43;QD=13.40;SB=-64.87 GT:AD:DP:GL:GQ 1/1:4,17:10:-31.74,-3.02,-0.01:30.04
-chr1 5077077 rs7412613 C T 3.36 PASS AC=2;AF=1.00;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=1.37;MQ=22.40;MQ0=3;OQ=333.18;QD=18.51;SB=-10.00 GT:AD:DP:GL:GQ 1/1:2,15:9:-36.90,-2.71,-0.00:27.09
-chr1 5077090 . C A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=28;Dels=0.00;HRun=2;HaplotypeScore=4.92;MQ=29.30;MQ0=3;OQ=51.83;QD=1.85;SB=-3.99 GT:AD:DP:GL:GQ 0/1:19,9:11:-11.79,-3.32,-22.43:84.66
-chr1 5077136 rs55919453 T G 371.05 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=38.18;MQ0=2;OQ=1590.74;QD=31.81;SB=-546.07 GT:AD:DP:GL:GQ 1/1:0,50:44:-162.67,-13.25,-0.01:99
-chr1 5077346 rs28778348 C A 55.21 PASS AC=2;AF=1.00;AN=2;DB;DP=30;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.70;MQ0=2;OQ=838.40;QD=27.95;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,29:24:-87.43,-7.23,-0.01:72.21
-chr1 5077349 rs28898289 T G 16.95 PASS AC=2;AF=1.00;AN=2;DB;DP=31;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=26.06;MQ0=2;OQ=780.24;QD=25.17;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,31:23:-81.62,-6.93,-0.01:69.20
-chr1 5077435 rs7415381 A T 121.52 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.10;MQ=26.22;MQ0=5;OQ=1349.62;QD=28.72;SB=-637.67 GT:AD:DP:GL:GQ 1/1:0,47:37:-138.56,-11.15,-0.01:99
-chr1 5077528 rs56184987 T C 231.69 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=24.13;MQ0=2;OQ=814.91;QD=18.95;SB=-252.77 GT:AD:DP:GL:GQ 1/1:0,43:27:-85.10,-8.15,-0.03:81.19
-chr1 5077549 rs55934905 G A 0.24 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=3;HaplotypeScore=0.98;MQ=23.80;MQ0=7;OQ=1118.88;QD=22.38;SB=-246.01 GT:AD:DP:GL:GQ 1/1:0,50:29:-115.48,-8.74,-0.01:87.28
-chr1 5077770 rs60669416 C A 584.28 Indel AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=10;HaplotypeScore=19.78;MQ=46.83;MQ0=2;QD=11.69;SB=-270.35 GT:AD:DP:GL:GQ 0/1:25,24:45:-75.27,-13.56,-79.00:99
-chr1 5077806 rs2334261 C T 3.91 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.02;HRun=2;HaplotypeScore=6.33;MQ=31.47;MQ0=13;OQ=1098.90;QD=20.35;SB=-473.36 GT:AD:DP:GL:GQ 1/1:5,48:29:-113.48,-8.43,-0.01:84.27
-chr1 5077915 rs11582268 A T 437.65 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=22.80;MQ0=5;OQ=869.48;QD=19.32;SB=-460.68 GT:AD:DP:GL:GQ 1/1:0,44:25:-90.55,-7.54,-0.02:75.21
-chr1 5078308 rs12043988 C A 291.59 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=47.74;MQ0=0;OQ=2467.70;QD=37.39;SB=-935.67 GT:AD:DP:GL:GQ 1/1:0,66:65:-250.36,-19.57,-0.01:99
-chr1 5078509 rs9439503 T C 20.38 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=4.15;MQ=38.39;MQ0=4;OQ=1877.97;QD=28.03;SB=-657.32 GT:AD:DP:GL:GQ 1/1:1,66:53:-191.40,-15.96,-0.02:99
-chr1 5078532 rs9439504 C G 494.66 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=35.41;MQ0=3;OQ=2205.88;QD=36.16;SB=-588.53 GT:AD:DP:GL:GQ 1/1:0,61:50:-224.18,-15.06,-0.01:99
-chr1 5078612 rs10915350 C T 169.93 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=47.49;MQ0=1;OQ=2196.12;QD=36.60;SB=-847.62 GT:AD:DP:GL:GQ 1/1:1,58:57:-223.22,-17.18,-0.02:99
-chr1 5079390 rs10799170 A C 350.19 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=57.35;MQ0=0;OQ=2787.95;QD=35.29;SB=-1421.63 GT:AD:DP:GL:GQ 1/1:0,79:78:-282.40,-23.49,-0.02:99
-chr1 5079434 rs10915352 G T 571.75 PASS AC=2;AF=1.00;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.02;MQ0=0;OQ=3162.32;QD=36.77;SB=-1557.78 GT:AD:DP:GL:GQ 1/1:0,86:86:-319.84,-25.90,-0.02:99
-chr1 5079595 rs10915353 G C 43.37 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.36;MQ0=0;OQ=2638.35;QD=40.59;SB=-999.16 GT:AD:DP:GL:GQ 1/1:0,65:61:-267.45,-18.39,-0.03:99
-chr1 5079666 rs6701939 T C 563.06 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2172.86;QD=35.05;SB=-713.27 GT:AD:DP:GL:GQ 1/1:0,62:60:-220.89,-18.07,-0.02:99
-chr1 5080376 . C T 202.08 PASS AC=1;AF=0.50;AN=2;DP=38;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.09;MQ0=0;OQ=426.51;QD=11.22;SB=-188.16 GT:AD:DP:GL:GQ 0/1:24,14:37:-57.08,-11.15,-81.03:99
-chr1 5080399 . C A 264.12 DPFilter;Indel AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=20;HaplotypeScore=11.69;MQ=57.12;MQ0=0;QD=4.63;SB=53.19 GT:AD:DP:GL:GQ 0/1:38,19:40:-41.75,-12.05,-100.11:99
-chr1 5080680 rs10753350 A G 105.81 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=2.00;MQ=58.32;MQ0=0;OQ=1525.28;QD=28.25;SB=-610.83 GT:AD:DP:GL:GQ 1/1:0,54:51:-156.18,-15.39,-0.07:99
-chr1 5080690 rs10753351 A C 1.11 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=3;HaplotypeScore=2.95;MQ=55.25;MQ0=0;OQ=2140.46;QD=31.48;SB=-1004.07 GT:AD:DP:GL:GQ 1/1:0,68:63:-217.66,-18.98,-0.03:99
-chr1 5081475 rs10737396 T C 76.32 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=3;HaplotypeScore=0.91;MQ=60.00;MQ0=0;OQ=2367.06;QD=33.34;SB=-935.73 GT:AD:DP:GL:GQ 1/1:0,71:67:-240.32,-20.19,-0.03:99
-chr1 5081878 rs2722794 T G 569.46 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.93;MQ0=0;OQ=2825.92;QD=34.89;SB=-1425.62 GT:AD:DP:GL:GQ 1/1:0,81:79:-286.20,-23.79,-0.02:99
-chr1 5081972 rs2611426 T A 81.80 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=1;HaplotypeScore=1.88;MQ=59.18;MQ0=0;OQ=2310.37;QD=35.01;SB=-624.95 GT:AD:DP:GL:GQ 1/1:0,66:62:-234.64,-18.68,-0.02:99
-chr1 5083407 rs2045587 A G 34.52 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=1821.48;QD=33.73;SB=-913.93 GT:AD:DP:GL:GQ 1/1:0,54:52:-185.75,-15.67,-0.02:99
-chr1 5083733 rs4313443 C T 652.84 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2295.78;QD=39.58;SB=-913.70 GT:AD:DP:GL:GQ 1/1:0,58:58:-233.18,-17.47,-0.01:99
-chr1 5083785 rs4356099 G A 29.40 PASS AC=2;AF=1.00;AN=2;DB;DP=43;Dels=0.00;HRun=1;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=1676.22;QD=38.98;SB=-527.70 GT:AD:DP:GL:GQ 1/1:0,43:43:-171.22,-12.96,-0.02:99
-chr1 5083937 rs2722793 G T 729.18 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.44;MQ0=0;OQ=2771.95;QD=36.96;SB=-1328.90 GT:AD:DP:GL:GQ 1/1:0,75:75:-280.80,-22.59,-0.02:99
-chr1 5084549 rs10753352 G C 80.52 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.74;MQ0=0;OQ=3116.41;QD=42.69;SB=-1439.29 GT:AD:DP:GL:GQ 1/1:0,73:73:-315.25,-22.00,-0.03:99
-chr1 5085006 rs2722792 C A 486.51 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.46;MQ0=0;OQ=3029.86;QD=36.95;SB=-1518.84 GT:AD:DP:GL:GQ 1/1:0,82:81:-306.59,-24.39,-0.02:99
-chr1 5085686 rs2611419 A C 735.40 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2513.45;QD=35.40;SB=-1104.10 GT:AD:DP:GL:GQ 1/1:0,71:71:-254.95,-21.38,-0.02:99
-chr1 5087139 rs2611420 C G 615.49 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3365.59;QD=43.15;SB=-1251.98 GT:AD:DP:GL:GQ 1/1:0,78:76:-335.56,-22.90,-0.03:99
-chr1 5087240 rs2611421 C T 489.75 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=3117.95;QD=41.03;SB=-1433.39 GT:AD:DP:GL:GQ 1/1:0,76:76:-315.39,-22.89,-0.01:99
-chr1 5087511 rs2722791 G A 190.82 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=2.68;MQ=59.73;MQ0=0;OQ=3174.39;QD=37.35;SB=-1593.03 GT:AD:DP:GL:GQ 1/1:0,85:81:-321.05,-24.40,-0.02:99
-chr1 5088299 rs2611422 C T 24.96 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.01;HRun=4;HaplotypeScore=1.63;MQ=59.49;MQ0=0;OQ=3139.82;QD=38.29;SB=-1155.06 GT:AD:DP:GL:GQ 1/1:0,81:82:-317.60,-24.41,-0.03:99
-chr1 5088851 rs898338 G T 586.23 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1967.21;QD=32.25;SB=-901.77 GT:AD:DP:GL:GQ 1/1:0,61:55:-200.32,-16.57,-0.02:99
-chr1 5091688 rs11588537 G C 0.39 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=2;HaplotypeScore=2.02;MQ=59.44;MQ0=0;OQ=1667.23;QD=40.66;SB=-503.13 GT:AD:DP:GL:GQ 1/1:0,41:41:-170.32,-12.36,-0.02:99
-chr1 5092085 rs4245628 G A 151.82 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.46;MQ=59.41;MQ0=0;OQ=3066.13;QD=39.31;SB=-1187.61 GT:AD:DP:GL:GQ 1/1:0,78:77:-310.22,-23.19,-0.02:99
-chr1 5092563 rs6671889 C A 625.41 PASS AC=2;AF=1.00;AN=2;DB;DP=83;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=3060.89;QD=36.88;SB=-1358.20 GT:AD:DP:GL:GQ 1/1:0,83:82:-309.69,-24.69,-0.01:99
-chr1 5092609 rs4949165 G C 633.91 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=3087.67;QD=42.88;SB=-1533.25 GT:AD:DP:GL:GQ 1/1:0,72:72:-312.37,-21.69,-0.02:99
-chr1 5092886 rs10492923 A G 560.12 PASS AC=1;AF=0.50;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=897.90;QD=12.47;SB=-469.86 GT:AD:DP:GL:GQ 0/1:34,38:69:-113.87,-20.80,-132.03:99
-chr1 5093533 rs9439505 C T 206.84 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=2.29;MQ=59.13;MQ0=0;OQ=1236.94;QD=16.49;SB=-238.14 GT:AD:DP:GL:GQ 0/1:38,37:73:-148.98,-22.00,-117.20:99
-chr1 5093841 rs12143009 G A 1328.69 Indel AC=1;AF=0.50;AN=2;DB;DP=87;Dels=0.00;HRun=3;HaplotypeScore=2.85;MQ=59.81;MQ0=1;QD=15.27;SB=-676.33 GT:AD:DP:GL:GQ 0/1:46,41:84:-161.46,-25.31,-156.05:99
-chr1 5094064 rs16840020 C T 380.84 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=1.11;MQ=59.40;MQ0=0;OQ=843.58;QD=13.61;SB=-387.37 GT:AD:DP:GL:GQ 0/1:36,26:61:-106.01,-18.37,-128.57:99
-chr1 5094308 rs9439536 C G 94.57 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=-0.06;MQ=57.94;MQ0=0;OQ=2369.61;QD=43.08;SB=-1192.92 GT:AD:DP:GL:GQ 1/1:0,55:55:-240.56,-16.57,-0.02:99
-chr1 5094675 rs9439537 G A 205.12 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=56.69;MQ0=0;OQ=2327.54;QD=36.95;SB=-997.02 GT:AD:DP:GL:GQ 1/1:0,63:59:-236.35,-17.77,-0.02:99
-chr1 5095027 rs10737397 A C 379.35 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.02;HRun=2;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1853.36;QD=34.97;SB=-880.10 GT:AD:DP:GL:GQ 1/1:0,52:52:-188.93,-15.66,-0.01:99
-chr1 5095151 rs10915359 A G 343.67 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=60.00;MQ0=0;OQ=1130.12;QD=15.92;SB=-404.21 GT:AD:DP:GL:GQ 0/1:33,38:69:-137.08,-20.78,-130.21:99
-chr1 5095177 rs12122020 C T 430.32 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1196.16;QD=13.91;SB=-341.80 GT:AD:DP:GL:GQ 0/1:49,37:84:-148.20,-25.30,-177.14:99
-chr1 5095231 rs10492925 T C 590.40 PASS AC=1;AF=0.50;AN=2;DB;DP=85;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1272.89;QD=14.98;SB=-556.65 GT:AD:DP:GL:GQ 0/1:35,50:83:-155.59,-25.02,-138.70:99
-chr1 5095242 rs12045223 A T 548.90 PASS AC=1;AF=0.50;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.56;MQ0=0;OQ=1555.76;QD=18.52;SB=-658.48 GT:AD:DP:GL:GQ 0/1:35,49:82:-183.56,-24.70,-128.89:99
-chr1 5096599 rs9439506 A G 501.16 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=607.79;QD=10.30;SB=-265.38 GT:AD:DP:GL:GQ 0/1:36,23:58:-81.54,-17.47,-140.55:99
-chr1 5097069 . C T 27.83 PASS AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=280.61;QD=35.08;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:8:-31.64,-2.41,-0.00:24.08
-chr1 5097076 . C A 58.51 PASS AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=53.95;MQ0=0;OQ=242.27;QD=30.28;SB=-10.00 GT:AD:DP:GL:GQ 1/1:0,8:8:-27.81,-2.41,-0.00:24.07
-chr1 5097414 rs34593428 C T 209.20 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=1.12;MQ=60.00;MQ0=0;OQ=915.00;QD=14.52;SB=-282.17 GT:AD:DP:GL:GQ 0/1:34,29:62:-113.46,-18.67,-123.11:99
-chr1 5097811 rs10799172 T C 730.17 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2361.85;QD=34.73;SB=-1109.84 GT:AD:DP:GL:GQ 1/1:0,68:67:-239.79,-20.18,-0.02:99
-chr1 5097837 rs10799173 C T 610.42 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=2894.02;QD=39.64;SB=-1458.48 GT:AD:DP:GL:GQ 1/1:0,73:72:-293.00,-21.69,-0.02:99
-chr1 5098649 rs16840051 C T 466.71 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.76;MQ0=0;OQ=1115.98;QD=14.31;SB=-521.66 GT:AD:DP:GL:GQ 0/1:43,35:76:-137.77,-22.89,-150.84:99
-chr1 5099594 rs61576661 T C 2.98 PASS AC=1;AF=0.50;AN=2;DB;DP=54;Dels=0.02;HRun=0;HaplotypeScore=9.91;MQ=59.43;MQ0=0;OQ=660.15;QD=12.23;SB=-250.93 GT:AD:DP:GL:GQ 0/1:29,24:54:-85.27,-15.97,-115.92:99
-chr1 5100592 rs6681359 C T 709.39 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.69;MQ0=0;OQ=3001.23;QD=40.02;SB=-1288.71 GT:AD:DP:GL:GQ 1/1:0,75:75:-303.72,-22.59,-0.02:99
-chr1 5102008 rs7543139 A C 24.50 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=8.00;MQ=58.40;MQ0=0;OQ=1023.25;QD=14.62;SB=-311.81 GT:AD:DP:GL:GQ 0/1:35,35:67:-125.80,-20.19,-114.71:99
-chr1 5102179 rs16840055 A G 103.26 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.48;MQ=59.41;MQ0=0;OQ=1029.92;QD=14.51;SB=-438.97 GT:AD:DP:GL:GQ 0/1:36,35:69:-127.06,-20.79,-136.54:99
-chr1 5103146 rs4484964 T C 669.95 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.67;MQ0=0;OQ=2031.10;QD=32.24;SB=-774.73 GT:AD:DP:GL:GQ 1/1:0,63:62:-206.74,-18.69,-0.04:99
-chr1 5103788 . G T 167.53 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.70;MQ0=0;OQ=1064.37;QD=14.00;SB=-541.64 GT:AD:DP:GL:GQ 0/1:38,38:74:-132.01,-22.29,-131.40:99
-chr1 5106305 rs9439509 G A 600.29 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.19;MQ0=0;OQ=2218.17;QD=38.92;SB=-991.33 GT:AD:DP:GL:GQ 1/1:0,57:57:-225.42,-17.18,-0.02:99
-chr1 5106499 rs4345839 A G 149.68 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=1.56;MQ=59.43;MQ0=0;OQ=2177.60;QD=33.50;SB=-1108.75 GT:AD:DP:GL:GQ 1/1:0,64:62:-221.38,-18.68,-0.03:99
-chr1 5107407 rs4584438 T G 105.42 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=2390.91;QD=33.67;SB=-961.60 GT:AD:DP:GL:GQ 1/1:0,70:70:-246.35,-24.25,-3.68:99
-chr1 5107616 rs4543848 T C 111.63 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=2.89;MQ=59.72;MQ0=0;OQ=2325.30;QD=34.71;SB=-962.92 GT:AD:DP:GL:GQ 1/1:0,67:66:-236.14,-19.88,-0.02:99
-chr1 5107713 . A C 103.40 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=1;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=1036.38;QD=12.79;SB=-351.52 GT:AD:DP:GL:GQ 0/1:44,37:81:-131.32,-24.40,-159.14:99
-chr1 5109104 rs12025231 C T 369.55 PASS AC=1;AF=0.50;AN=2;DB;DP=97;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=60.00;MQ0=0;OQ=1428.81;QD=14.73;SB=-339.81 GT:AD:DP:GL:GQ 0/1:53,44:96:-175.10,-28.94,-171.50:99
-chr1 5109781 rs9439510 C G 474.11 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3322.39;QD=44.30;SB=-1477.33 GT:AD:DP:GL:GQ 1/1:0,75:75:-331.24,-22.59,-0.02:99
-chr1 5109984 rs12121369 C A 599.91 PASS AC=1;AF=0.50;AN=2;DB;DP=86;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=1366.71;QD=15.89;SB=-516.80 GT:AD:DP:GL:GQ 0/1:40,46:85:-165.55,-25.60,-144.36:99
-chr1 5110261 rs7538704 G C 501.84 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1089.65;QD=15.35;SB=-449.75 GT:AD:DP:GL:GQ 0/1:33,38:67:-132.47,-20.22,-140.33:99
-chr1 5110586 rs4462197 C T 256.57 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.00;MQ0=0;OQ=2327.86;QD=37.55;SB=-1085.00 GT:AD:DP:GL:GQ 1/1:0,62:59:-236.39,-17.78,-0.02:99
-chr1 5110994 rs10753353 T C 229.27 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.87;MQ=59.74;MQ0=0;OQ=2543.07;QD=35.32;SB=-1168.48 GT:AD:DP:GL:GQ 1/1:0,72:71:-257.91,-21.39,-0.02:99
-chr1 5111198 rs12027352 C T 56.90 PASS AC=1;AF=0.50;AN=2;DB;DP=93;Dels=0.00;HRun=2;HaplotypeScore=3.00;MQ=59.50;MQ0=0;OQ=1422.29;QD=15.29;SB=-680.29 GT:AD:DP:GL:GQ 0/1:47,46:88:-172.02,-26.51,-161.50:99
-chr1 5111405 rs4314925 G A 196.97 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=59.36;MQ0=0;OQ=2517.06;QD=38.72;SB=-1234.63 GT:AD:DP:GL:GQ 1/1:0,65:64:-255.31,-19.28,-0.02:99
-chr1 5112055 rs12145645 G A 578.52 PASS AC=1;AF=0.50;AN=2;DB;DP=74;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.38;MQ0=0;OQ=1010.93;QD=13.66;SB=-362.83 GT:AD:DP:GL:GQ 0/1:42,32:72:-126.06,-21.69,-149.75:99
-chr1 5112088 rs61762208 G A 38.27 PASS AC=1;AF=0.50;AN=2;DB;DP=83;Dels=0.00;HRun=2;HaplotypeScore=1.85;MQ=59.44;MQ0=0;OQ=1643.08;QD=19.80;SB=-651.68 GT:AD:DP:GL:GQ 0/1:37,46:82:-192.29,-24.70,-131.13:99
-chr1 5112135 rs12741116 A G 713.71 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2397.16;QD=35.25;SB=-898.68 GT:AD:DP:GL:GQ 1/1:0,68:67:-243.32,-20.18,-0.02:99
-chr1 5113244 rs4600091 T C 489.07 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2494.81;QD=29.70;SB=-1138.12 GT:AD:DP:GL:GQ 1/1:0,84:79:-253.13,-23.82,-0.07:99
-chr1 5113507 rs10753354 C G 401.42 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2295.20;QD=42.50;SB=-1097.09 GT:AD:DP:GL:GQ 1/1:0,54:54:-233.13,-16.28,-0.02:99
-chr1 5113815 rs6698288 G A 330.13 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2134.65;QD=39.53;SB=-887.16 GT:AD:DP:GL:GQ 1/1:0,54:54:-217.07,-16.27,-0.02:99
-chr1 5114383 rs7517431 C G 606.11 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.11;MQ0=0;OQ=920.14;QD=14.61;SB=-463.75 GT:AD:DP:GL:GQ 0/1:36,27:62:-113.98,-18.68,-155.27:99
-chr1 5114445 rs7517449 C T 297.77 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.63;MQ0=0;OQ=2115.05;QD=38.46;SB=-1037.87 GT:AD:DP:GL:GQ 1/1:0,55:54:-215.11,-16.27,-0.02:99
-chr1 5114723 rs10915361 C T 120.85 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=3.02;MQ=58.20;MQ0=0;OQ=931.19;QD=19.81;SB=-478.50 GT:AD:DP:GL:GQ 0/1:19,28:46:-110.26,-13.86,-62.96:99
-chr1 5115596 rs9439538 T C 593.80 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1568.48;QD=30.16;SB=-606.93 GT:AD:DP:GL:GQ 1/1:0,52:50:-160.48,-15.08,-0.04:99
-chr1 5115679 rs12021698 A T 372.77 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.37;MQ0=0;OQ=887.17;QD=15.04;SB=-310.70 GT:AD:DP:GL:GQ 0/1:30,29:59:-109.77,-17.77,-114.78:99
-chr1 5115822 rs56173770 C G 132.01 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1600.81;QD=26.68;SB=-808.51 GT:AD:DP:GL:GQ 0/1:19,41:59:-181.14,-17.77,-78.42:99
-chr1 5115851 rs9439539 T A 636.93 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2566.28;QD=37.74;SB=-1304.50 GT:AD:DP:GL:GQ 1/1:0,68:67:-260.22,-20.18,-0.01:99
-chr1 5117179 rs5009987 A G 1517.20 Indel AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=20.42;MQ=58.93;MQ0=0;QD=27.59;SB=-603.23 GT:AD:DP:GL:GQ 1/1:2,53:53:-162.87,-15.98,-7.57:84.15
-chr1 5117504 rs10799174 G A 14.48 PASS AC=1;AF=0.50;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=8.52;MQ=58.73;MQ0=0;OQ=1003.11;QD=18.24;SB=-483.50 GT:AD:DP:GL:GQ 0/1:24,31:52:-119.27,-15.67,-72.69:99
-chr1 5117533 rs6672724 C T 186.08 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.58;MQ=58.63;MQ0=0;OQ=1901.56;QD=37.29;SB=-943.75 GT:AD:DP:GL:GQ 1/1:0,51:50:-193.77,-15.07,-0.02:99
-chr1 5118461 rs9439511 C T 378.94 PASS AC=1;AF=0.50;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.83;MQ=58.91;MQ0=0;OQ=1153.56;QD=14.98;SB=-536.73 GT:AD:DP:GL:GQ 0/1:42,35:77:-141.84,-23.20,-148.03:99
-chr1 5119340 rs12401983 G A 186.94 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=1;HaplotypeScore=2.35;MQ=52.79;MQ0=0;OQ=1320.64;QD=16.93;SB=-541.57 GT:AD:DP:GL:GQ 0/1:37,40:76:-158.24,-22.89,-135.98:99
-chr1 5119644 rs55835407 G A 140.46 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.47;MQ=42.95;MQ0=4;OQ=797.21;QD=12.86;SB=-199.88 GT:AD:DP:GL:GQ 0/1:35,27:56:-99.88,-16.88,-103.36:99
-chr1 5119704 rs56293801 T C 75.11 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.00;MQ=42.91;MQ0=1;OQ=434.63;QD=8.36;SB=-212.22 GT:AD:DP:GL:GQ 0/1:32,20:46:-60.61,-13.87,-109.45:99
-chr1 5119914 rs12097824 T C 114 PASS AC=1;AF=0.50;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=3.43;MQ=39.01;MQ0=0;OQ=589.79;QD=9.51;SB=-187.41 GT:AD:DP:GL:GQ 0/1:33,29:57:-79.44,-17.18,-127.34:99
-chr1 5120013 rs56126017 C G 210.02 PASS AC=1;AF=0.50;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.93;MQ=35.32;MQ0=0;OQ=1020.64;QD=14.38;SB=-272.51 GT:AD:DP:GL:GQ 0/1:43,28:70:-126.44,-21.09,-178.51:99
-chr1 5120085 . G A 0.02 FDRtranche1.00to2.00 AC=1;AF=0.50;AN=2;DP=101;Dels=0.01;HRun=0;HaplotypeScore=11.89;MQ=34.93;MQ0=0;OQ=541.17;QD=5.36;SB=13.62 GT:AD:DP:GL:GQ 0/1:77,23:97:-86.32,-28.91,-276.66:99
-chr1 5120089 . T A 0.03 FDRtranche0.10to1.00 AC=1;AF=0.50;AN=2;DP=102;Dels=0.00;HRun=0;HaplotypeScore=10.97;MQ=34.87;MQ0=0;OQ=894.55;QD=8.77;SB=-13.59 GT:AD:DP:GL:GQ 0/1:68,34:99:-122.56,-29.82,-255.26:99
-chr1 5120116 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=117;Dels=0.02;HRun=0;HaplotypeScore=143.29;MQ=34.92;MQ0=0;OQ=962.81;QD=8.23;SB=-91.05 GT:AD:DP:GL:GQ 0/1:76,37:114:-138.10,-38.53,-297.11:99
-chr1 5120146 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=141;Dels=0.01;HRun=0;HaplotypeScore=240.33;MQ=33.11;MQ0=0;OQ=492.54;QD=3.49;SB=14.98 GT:AD:DP:GL:GQ 0/1:116,23:120:-88.08,-35.54,-336.13:99
-chr1 5120150 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=150;Dels=0.03;HRun=0;HaplotypeScore=253.70;MQ=32.31;MQ0=0;OQ=526.30;QD=3.51;SB=-209.96 GT:AD:DP:GL:GQ 0/1:122,23:125:-96.24,-40.33,-348.30:99
-chr1 5120166 rs61762214 C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DB;DP=169;Dels=0.02;HRun=0;HaplotypeScore=340.16;MQ=31.74;MQ0=0;OQ=707.91;QD=4.19;SB=-238.38 GT:AD:DP:GL:GQ 0/1:128,38:158:-120.76,-46.69,-441.60:99
-chr1 5120182 . T C 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=171;Dels=0.00;HRun=0;HaplotypeScore=247.34;MQ=30.32;MQ0=1;OQ=181.12;QD=1.06;SB=99.79 GT:AD:DP:GL:GQ 0/1:146,25:160:-69.62,-48.22,-544.70:99
-chr1 5120218 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=186;Dels=0.00;HRun=0;HaplotypeScore=296.87;MQ=30.08;MQ0=1;OQ=467.02;QD=2.51;SB=-243.49 GT:AD:DP:GL:GQ 0/1:160,26:175:-102.70,-52.71,-541.07:99
-chr1 5120238 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=187;Dels=0.01;HRun=0;HaplotypeScore=156.33;MQ=31.62;MQ0=1;OQ=98.86;QD=0.53;SB=35.37 GT:AD:DP:GL:GQ 0/1:164,15:172:-86.49,-73.32,-562.87:99
-chr1 5120240 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=184;Dels=0.01;HRun=0;HaplotypeScore=148.66;MQ=31.61;MQ0=1;OQ=319.23;QD=1.73;SB=30.34 GT:AD:DP:GL:GQ 0/1:160,22:170:-85.81,-50.61,-526.60:99
-chr1 5120250 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=164;Dels=0.00;HRun=0;HaplotypeScore=149.91;MQ=33.54;MQ0=1;OQ=262.42;QD=1.60;SB=170.48 GT:AD:DP:GL:GQ 0/1:144,20:159:-77.42,-47.90,-500.91:99
-chr1 5120252 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=152;Dels=0.00;HRun=0;HaplotypeScore=134.92;MQ=34.14;MQ0=1;OQ=1590.07;QD=10.46;SB=-170.99 GT:AD:DP:GL:GQ 0/1:98,53:143:-208.80,-46.51,-329.18:99
-chr1 5121185 . T C 32.44 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.07;MQ=59.52;MQ0=0;OQ=529.93;QD=11.04;SB=-169.50 GT:AD:DP:GL:GQ 0/1:26,22:46:-70.14,-13.86,-100.33:99
-chr1 5122129 rs10915363 G C 183.28 PASS AC=1;AF=0.50;AN=2;DB;DP=70;Dels=0.00;HRun=2;HaplotypeScore=0.73;MQ=59.47;MQ0=0;OQ=1248.82;QD=17.84;SB=-543.72 GT:AD:DP:GL:GQ 0/1:31,39:66:-148.06,-19.89,-135.32:99
-chr1 5122156 rs10915364 G C 495.83 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=1017.04;QD=16.14;SB=-464.81 GT:AD:DP:GL:GQ 0/1:31,32:62:-123.68,-18.70,-134.13:99
-chr1 5122248 rs11804873 C T 62.77 PASS AC=1;AF=0.50;AN=2;DB;DP=38;Dels=0.00;HRun=0;HaplotypeScore=1.32;MQ=59.39;MQ0=0;OQ=700.13;QD=18.42;SB=-213.90 GT:AD:DP:GL:GQ 0/1:16,22:37:-84.44,-11.15,-55.54:99
-chr1 5122456 rs10915365 C T 167.44 PASS AC=1;AF=0.50;AN=2;DB;DP=39;Dels=0.00;HRun=1;HaplotypeScore=2.45;MQ=59.52;MQ0=0;OQ=504.80;QD=12.94;SB=-201.18 GT:AD:DP:GL:GQ 0/1:22,17:38:-65.21,-11.45,-78.02:99
-chr1 5122978 rs12024162 T C 1.83 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=6.85;MQ=58.05;MQ0=0;OQ=2287.65;QD=35.19;SB=-898.04 GT:AD:DP:GL:GQ 1/1:1,64:63:-232.37,-18.97,-0.02:99
-chr1 5123042 rs12026730 G A 134.42 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=56.89;MQ0=0;OQ=1205.15;QD=19.76;SB=-414.94 GT:AD:DP:GL:GQ 0/1:25,36:58:-141.29,-17.49,-70.06:99
-chr1 5123330 rs9439540 C A 63.17 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=60.37;MQ0=0;OQ=975.37;QD=16.53;SB=-180.54 GT:AD:DP:GL:GQ 0/1:27,32:57:-117.99,-17.17,-89.17:99
-chr1 5124476 rs17366543 A G 248.41 PASS AC=1;AF=0.50;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.31;MQ=60.00;MQ0=0;OQ=919.81;QD=12.26;SB=-428.10 GT:AD:DP:GL:GQ 0/1:42,33:74:-117.56,-22.29,-166.31:99
-chr1 5126548 rs6690311 A G 73.75 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=3.31;MQ=60.00;MQ0=0;OQ=1952.07;QD=34.25;SB=-789.11 GT:AD:DP:GL:GQ 1/1:0,56:56:-198.81,-16.87,-0.02:99
-chr1 5126612 rs6675995 G A 137.58 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=1;HaplotypeScore=2.05;MQ=59.06;MQ0=0;OQ=2638.82;QD=38.24;SB=-1319.37 GT:AD:DP:GL:GQ 1/1:0,69:67:-267.49,-20.19,-0.02:99
-chr1 5126665 rs10799176 G A 160.71 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.11;MQ0=0;OQ=2842.19;QD=38.93;SB=-1393.38 GT:AD:DP:GL:GQ 1/1:0,73:72:-287.83,-21.69,-0.02:99
-chr1 5126844 rs6685929 C T 627.62 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2295.72;QD=37.63;SB=-1082.35 GT:AD:DP:GL:GQ 1/1:0,61:59:-233.18,-17.78,-0.02:99
-chr1 5126974 . G T 128.27 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.02;MQ0=0;OQ=1169.78;QD=18.87;SB=-560.81 GT:AD:DP:GL:GQ 0/1:24,38:60:-138.33,-18.07,-79.90:99
-chr1 5129269 rs11583683 C T 146.33 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=4;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2126.34;QD=37.30;SB=-795.34 GT:AD:DP:GL:GQ 1/1:0,57:56:-216.24,-16.88,-0.02:99
-chr1 5129679 rs6603817 A G 112.83 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=3;HaplotypeScore=0.00;MQ=58.96;MQ0=0;OQ=1509.76;QD=32.82;SB=-474.53 GT:AD:DP:GL:GQ 1/1:0,46:43:-154.58,-12.95,-0.01:99
-chr1 5130606 rs4076635 G A 636.22 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2562.75;QD=38.25;SB=-1303.24 GT:AD:DP:GL:GQ 1/1:0,67:65:-259.88,-19.58,-0.02:99
-chr1 5131752 rs4394703 C A 307.05 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.37;MQ=58.90;MQ0=0;OQ=2017.11;QD=34.19;SB=-1012.79 GT:AD:DP:GL:GQ 1/1:0,58:57:-208.21,-19.84,-2.91:99
-chr1 5132477 rs6692740 A G 667.43 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.74;MQ0=0;OQ=2294.64;QD=31.43;SB=-1053.29 GT:AD:DP:GL:GQ 1/1:0,73:71:-233.10,-21.41,-0.05:99
-chr1 5133851 rs10492928 G T 624.11 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=2734.91;QD=36.47;SB=-1337.92 GT:AD:DP:GL:GQ 1/1:0,75:75:-277.10,-22.59,-0.02:99
-chr1 5134195 rs7545119 C A 288.26 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=2.20;MQ=59.11;MQ0=0;OQ=2691.33;QD=34.50;SB=-1000.80 GT:AD:DP:GL:GQ 1/1:0,78:75:-272.75,-22.59,-0.03:99
-chr1 5135504 rs10915369 C T 488.43 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.87;MQ0=0;OQ=1900.03;QD=39.58;SB=-759.52 GT:AD:DP:GL:GQ 1/1:0,48:48:-193.60,-14.46,-0.01:99
-chr1 5135682 rs11583044 G A 156.17 PASS AC=2;AF=1.00;AN=2;DB;DP=44;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=56.88;MQ0=0;OQ=1535.65;QD=34.90;SB=-689.33 GT:AD:DP:GL:GQ 1/1:0,44:41:-157.17,-12.36,-0.02:99
-chr1 5135692 rs10915370 C T 137.61 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=56.35;MQ0=0;OQ=2137.06;QD=38.16;SB=-962.28 GT:AD:DP:GL:GQ 1/1:0,56:55:-217.31,-16.57,-0.02:99
-chr1 5138733 rs10915371 G A 186.78 PASS AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=0;HaplotypeScore=1.52;MQ=58.20;MQ0=0;OQ=3762.30;QD=40.02;SB=-1754.36 GT:AD:DP:GL:GQ 1/1:0,94:93:-375.23,-28.01,-0.02:99
-chr1 5139307 rs9439541 A T 634.34 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3003.64;QD=37.55;SB=-1255.20 GT:AD:DP:GL:GQ 1/1:0,80:79:-303.97,-23.79,-0.02:99
-chr1 5139791 rs6603818 C T 714.35 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.73;MQ0=0;OQ=2781.44;QD=39.73;SB=-1291.72 GT:AD:DP:GL:GQ 1/1:0,70:70:-281.75,-21.09,-0.02:99
-chr1 5140071 rs7547229 C T 724.83 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3128.00;QD=38.62;SB=-1344.39 GT:AD:DP:GL:GQ 1/1:0,81:78:-316.40,-23.49,-0.02:99
-chr1 5140234 . A C 162.19 PASS AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=60.00;MQ0=0;OQ=858.81;QD=15.61;SB=-394.78 GT:AD:DP:GL:GQ 0/1:24,31:53:-105.13,-15.96,-88.06:99
-chr1 5141171 rs6688418 G A 695.26 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2832.24;QD=40.46;SB=-1208.37 GT:AD:DP:GL:GQ 1/1:0,70:70:-286.82,-21.08,-0.01:99
-chr1 5141665 . C T 43.31 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.98;MQ=59.95;MQ0=0;OQ=985.11;QD=18.24;SB=-409.92 GT:AD:DP:GL:GQ 0/1:25,29:53:-117.76,-15.96,-94.79:99
-chr1 5141935 rs6701052 C T 100.43 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=1;HaplotypeScore=0.66;MQ=49.80;MQ0=8;OQ=1859.57;QD=32.06;SB=-869.02 GT:AD:DP:GL:GQ 1/1:8,50:47:-189.55,-14.16,-0.01:99
-chr1 5142041 rs12072516 A T 329.01 PASS AC=1;AF=0.50;AN=2;DB;DP=28;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=43.00;MQ0=0;OQ=266.78;QD=9.53;SB=-152.82 GT:AD:DP:GL:GQ 0/1:16,12:25:-37.49,-7.53,-57.93:99
-chr1 5142287 rs9286978 G A 22.41 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=23.68;MQ0=8;OQ=873.11;QD=24.95;SB=-85.33 GT:AD:DP:GL:GQ 1/1:3,32:23:-90.90,-6.93,-0.01:69.22
-chr1 5143205 rs6664086 T C 86.23 PASS AC=2;AF=1.00;AN=2;DB;DP=81;Dels=0.00;HRun=0;HaplotypeScore=3.60;MQ=58.49;MQ0=0;OQ=2734.43;QD=33.76;SB=-1255.67 GT:AD:DP:GL:GQ 1/1:1,80:78:-277.05,-23.49,-0.03:99
-chr1 5144621 rs6603819 C A 635.83 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2574.32;QD=36.78;SB=-1238.13 GT:AD:DP:GL:GQ 1/1:0,70:70:-261.03,-21.08,-0.02:99
-chr1 5146701 rs6669501 C T 700.51 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.28;MQ0=0;OQ=3011.38;QD=38.61;SB=-1500.64 GT:AD:DP:GL:GQ 1/1:0,78:76:-304.75,-22.90,-0.03:99
-chr1 5146942 rs10492930 A G 610.29 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2413.30;QD=30.17;SB=-1138.47 GT:AD:DP:GL:GQ 1/1:0,79:77:-244.99,-23.23,-0.08:99
-chr1 5147215 rs10492931 G A 723.45 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.22;MQ0=0;OQ=2807.87;QD=39.00;SB=-1216.01 GT:AD:DP:GL:GQ 1/1:0,72:71:-284.39,-21.39,-0.02:99
-chr1 5148161 . G A 24.17 PASS AC=1;AF=0.50;AN=2;DP=76;Dels=0.00;HRun=1;HaplotypeScore=1.43;MQ=59.39;MQ0=0;OQ=1450.62;QD=19.09;SB=-417.73 GT:AD:DP:GL:GQ 0/1:33,43:74:-170.64,-22.29,-112.74:99
-chr1 5148401 rs6665697 T C 269.23 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=59.48;MQ0=0;OQ=2231.09;QD=30.99;SB=-952.42 GT:AD:DP:GL:GQ 1/1:0,72:70:-226.75,-21.11,-0.06:99
-chr1 5150357 rs10915375 A G 529.20 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.37;MQ0=0;OQ=1555.45;QD=31.74;SB=-790.64 GT:AD:DP:GL:GQ 1/1:0,49:49:-159.17,-14.78,-0.04:99
-chr1 5150590 . G T 11.56 DPFilter;LowQual AC=1;AF=0.50;AN=2;DP=69;Dels=0.01;HRun=20;HaplotypeScore=36.67;MQ=54.55;MQ0=0;QD=0.17;SB=69.39 GT:AD:DP:GL:GQ 0/1:49,15:42:-26.08,-21.67,-128.29:44.08
-chr1 5150765 rs9439543 T C 624.17 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.33;MQ0=0;OQ=2519.73;QD=35.49;SB=-971.41 GT:AD:DP:GL:GQ 1/1:0,71:70:-255.58,-21.09,-0.03:99
-chr1 5150768 rs9439544 C T 629.96 PASS AC=2;AF=1.00;AN=2;DB;DP=74;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.35;MQ0=0;OQ=2827.18;QD=38.21;SB=-1183.08 GT:AD:DP:GL:GQ 1/1:0,74:71:-286.33,-21.39,-0.02:99
-chr1 5150948 rs11583754 A G 125.55 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=1.95;MQ=56.88;MQ0=0;OQ=1724.72;QD=34.49;SB=-813.67 GT:AD:DP:GL:GQ 1/1:0,50:49:-176.07,-14.76,-0.02:99
-chr1 5153524 rs7536712 T C 117.29 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=1.92;MQ=59.77;MQ0=0;OQ=2818.40;QD=35.23;SB=-1399.67 GT:AD:DP:GL:GQ 1/1:1,78:79:-289.59,-27.33,-4.17:99
-chr1 5155164 rs2722780 G T 611.46 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2724.16;QD=35.38;SB=-1305.24 GT:AD:DP:GL:GQ 1/1:0,77:77:-276.03,-23.20,-0.03:99
-chr1 5155635 rs2018394 C G 496.66 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.82;MQ0=0;OQ=3565.75;QD=43.48;SB=-1230.53 GT:AD:DP:GL:GQ 1/1:0,82:80:-355.57,-24.10,-0.02:99
-chr1 5156126 rs2679215 G C 570.08 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2670.60;QD=41.73;SB=-1328.91 GT:AD:DP:GL:GQ 1/1:0,64:63:-270.67,-18.98,-0.02:99
-chr1 5156634 rs1320179 T A 161.58 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.72;MQ=59.60;MQ0=0;OQ=1611.01;QD=34.28;SB=-497.40 GT:AD:DP:GL:GQ 1/1:0,47:44:-164.71,-13.26,-0.02:99
-chr1 5157054 . G A 104.21 PASS AC=1;AF=0.50;AN=2;DP=57;Dels=0.00;HRun=1;HaplotypeScore=1.46;MQ=58.03;MQ0=0;OQ=746.35;QD=13.09;SB=-370.87 GT:AD:DP:GL:GQ 0/1:33,24:57:-95.09,-17.17,-121.22:99
-chr1 5157089 rs2722781 C T 248.95 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=58.68;MQ0=0;OQ=2013.78;QD=38.00;SB=-852.01 GT:AD:DP:GL:GQ 1/1:0,53:51:-204.98,-15.36,-0.01:99
-chr1 5158014 rs2679216 A G 582.56 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.03;MQ0=0;OQ=2870.64;QD=35.01;SB=-1392.56 GT:AD:DP:GL:GQ 1/1:0,82:80:-290.67,-24.10,-0.03:99
-chr1 5158416 rs2722782 T C 292.12 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=1.91;MQ=59.74;MQ0=0;OQ=2481.35;QD=34.95;SB=-1226.71 GT:AD:DP:GL:GQ 1/1:0,71:71:-251.75,-21.39,-0.03:99
-chr1 5158842 rs2679217 A C 278.49 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2099.17;QD=33.86;SB=-765.90 GT:AD:DP:GL:GQ 1/1:0,62:61:-213.53,-18.38,-0.03:99
-chr1 5160232 rs2722783 T C 124.50 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.02;MQ0=0;OQ=2420.10;QD=34.09;SB=-1200.16 GT:AD:DP:GL:GQ 1/1:1,69:68:-249.06,-23.31,-3.46:99
-chr1 5162761 rs2679218 T C 309.92 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.92;MQ=59.65;MQ0=0;OQ=2240.61;QD=34.47;SB=-957.91 GT:AD:DP:GL:GQ 1/1:0,65:65:-227.67,-19.58,-0.02:99
-chr1 5164088 rs2722786 A G 678.85 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2134.58;QD=34.99;SB=-757.97 GT:AD:DP:GL:GQ 1/1:0,61:60:-217.06,-18.07,-0.02:99
-chr1 5164377 rs2722787 T C 664.30 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1994.32;QD=31.16;SB=-946.38 GT:AD:DP:GL:GQ 1/1:0,64:63:-203.07,-19.00,-0.06:99
-chr1 5164508 . G A 21.64 PASS AC=1;AF=0.50;AN=2;DP=66;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=60.00;MQ0=0;OQ=1023.93;QD=15.51;SB=-404.39 GT:AD:DP:GL:GQ 0/1:35,31:64:-124.97,-19.29,-108.14:99
-chr1 5165252 rs2679219 A G 545.13 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2430.87;QD=31.16;SB=-1145.16 GT:AD:DP:GL:GQ 1/1:0,78:76:-246.73,-22.91,-0.06:99
-chr1 5165298 rs2722788 C T 111.92 PASS AC=2;AF=1.00;AN=2;DB;DP=87;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.52;MQ0=0;OQ=3387.05;QD=38.93;SB=-1669.69 GT:AD:DP:GL:GQ 1/1:0,87:85:-337.71,-25.61,-0.03:99
-chr1 5166378 rs2722790 C T 150.34 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=2.57;MQ=59.01;MQ0=0;OQ=2739.21;QD=39.13;SB=-1381.68 GT:AD:DP:GL:GQ 1/1:0,70:69:-277.52,-20.79,-0.02:99
-chr1 5170379 . C T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=83;Dels=0.00;HRun=20;HaplotypeScore=3.49;MQ=51.63;MQ0=1;OQ=52.88;QD=0.64;SB=122.38 GT:AD:DP:GL:GQ 0/1:61,22:64:-27.86,-19.28,-197.27:85.72
-chr1 5172063 rs56164612 G A 177.93 PASS AC=1;AF=0.50;AN=2;DB;DP=50;Dels=0.00;HRun=0;HaplotypeScore=2.36;MQ=59.16;MQ0=0;OQ=776.89;QD=15.54;SB=-274.16 GT:AD:DP:GL:GQ 0/1:24,26:48:-95.43,-14.46,-86.73:99
-chr1 5191577 rs471824 A G 242.55 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=1721.79;QD=27.77;SB=-749.45 GT:AD:DP:GL:GQ 1/1:1,61:57:-179.88,-17.20,-4.11:99
-chr1 5191739 rs632051 C A 18.10 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=2;HaplotypeScore=4.23;MQ=58.83;MQ0=0;OQ=3137.26;QD=37.35;SB=-891.27 GT:AD:DP:GL:GQ 1/1:0,84:83:-317.33,-25.00,-0.02:99
-chr1 5193545 rs566114 T G 200.45 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=-0.06;MQ=60.00;MQ0=0;OQ=2400.30;QD=34.29;SB=-1100.14 GT:AD:DP:GL:GQ 1/1:0,70:68:-243.64,-20.48,-0.02:99
-chr1 5194097 rs56295354 C T 367.36 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.98;MQ0=0;OQ=896.66;QD=14.01;SB=-471.46 GT:AD:DP:GL:GQ 0/1:34,30:62:-111.63,-18.68,-121.51:99
-chr1 5195036 rs677735 A G 310.10 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=59.68;MQ0=0;OQ=2493.12;QD=34.15;SB=-981.71 GT:AD:DP:GL:GQ 1/1:0,73:71:-252.92,-21.39,-0.03:99
-chr1 5195467 rs2986186 T A 311.13 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.45;MQ0=0;OQ=2846.52;QD=37.45;SB=-1332.00 GT:AD:DP:GL:GQ 1/1:0,76:75:-288.25,-22.59,-0.02:99
-chr1 5196704 rs2353169 T C 724.90 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=2499.39;QD=34.71;SB=-983.95 GT:AD:DP:GL:GQ 1/1:0,72:72:-253.55,-21.69,-0.02:99
-chr1 5197705 rs473104 A G 598.18 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2654.56;QD=34.93;SB=-1319.89 GT:AD:DP:GL:GQ 1/1:0,76:74:-269.06,-22.29,-0.02:99
-chr1 5197747 rs586165 T C 721.60 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2710.69;QD=35.20;SB=-1278.13 GT:AD:DP:GL:GQ 1/1:0,77:76:-274.68,-22.89,-0.03:99
-chr1 5198145 rs584402 C T 717.83 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2714.09;QD=39.33;SB=-1353.02 GT:AD:DP:GL:GQ 1/1:0,69:69:-275.01,-20.79,-0.02:99
-chr1 5198627 rs679712 T A 207.32 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=1.59;MQ=59.36;MQ0=0;OQ=2332.10;QD=35.88;SB=-1044.59 GT:AD:DP:GL:GQ 1/1:0,65:63:-236.81,-18.97,-0.02:99
-chr1 5198919 rs551536 T C 66.98 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=2;HaplotypeScore=0.47;MQ=59.68;MQ0=0;OQ=2254.50;QD=31.75;SB=-1121.22 GT:AD:DP:GL:GQ 1/1:0,71:70:-229.09,-21.11,-0.06:99
-chr1 5198972 rs551376 G A 527.51 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2736.21;QD=38.54;SB=-1372.67 GT:AD:DP:GL:GQ 1/1:0,71:69:-277.22,-20.79,-0.02:99
-chr1 5199041 rs550558 G A 271.08 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.75;MQ0=0;OQ=2982.88;QD=39.25;SB=-1518.69 GT:AD:DP:GL:GQ 1/1:0,75:75:-301.89,-22.59,-0.02:99
-chr1 5199083 rs549773 C A 400.22 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2265.19;QD=35.39;SB=-1149.37 GT:AD:DP:GL:GQ 1/1:0,64:63:-230.13,-18.98,-0.02:99
-chr1 5199801 rs663998 C G 667.78 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.24;MQ0=1;OQ=2933.78;QD=41.91;SB=-1382.38 GT:AD:DP:GL:GQ 1/1:0,70:68:-296.98,-20.49,-0.02:99
-chr1 5199984 rs663142 G T 300.03 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.95;MQ=57.88;MQ0=0;OQ=2524.52;QD=34.58;SB=-1263.12 GT:AD:DP:GL:GQ 1/1:0,73:71:-256.06,-21.39,-0.02:99
-chr1 5200020 rs663106 T C 288.64 PASS AC=2;AF=1.00;AN=2;DB;DP=80;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=57.94;MQ0=0;OQ=2324.56;QD=29.06;SB=-1068.20 GT:AD:DP:GL:GQ 1/1:0,80:72:-236.10,-21.71,-0.06:99
-chr1 5201096 rs35339923 C T 25.91 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=2;HaplotypeScore=0.74;MQ=59.27;MQ0=0;OQ=2513.57;QD=39.90;SB=-919.70 GT:AD:DP:GL:GQ 1/1:0,63:63:-254.96,-18.98,-0.02:99
-chr1 5201932 rs611422 T C 369.89 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.65;MQ0=0;OQ=2205.79;QD=33.94;SB=-980.06 GT:AD:DP:GL:GQ 1/1:0,65:62:-224.19,-18.68,-0.02:99
-chr1 5201978 rs534321 A C 83.24 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.68;MQ0=0;OQ=2498.46;QD=34.23;SB=-901.19 GT:AD:DP:GL:GQ 1/1:0,73:73:-253.46,-21.99,-0.03:99
-chr1 5202029 rs534188 C T 644.23 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.84;MQ0=0;OQ=2223.00;QD=39.70;SB=-899.19 GT:AD:DP:GL:GQ 1/1:0,56:56:-225.90,-16.87,-0.02:99
-chr1 5202175 rs12125575 G A 578.75 PASS AC=2;AF=1.00;AN=2;DB;DP=47;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=51.13;MQ0=0;OQ=1740.25;QD=37.03;SB=-800.07 GT:AD:DP:GL:GQ 1/1:0,47:44:-177.62,-13.25,-0.01:99
-chr1 5202200 rs610133 T C 141.51 PASS AC=2;AF=1.00;AN=2;DB;DP=46;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=49.73;MQ0=0;OQ=1399.83;QD=30.43;SB=-711.63 GT:AD:DP:GL:GQ 1/1:0,46:41:-143.59,-12.36,-0.02:99
-chr1 5202222 rs511282 G T 609.56 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=50.02;MQ0=0;OQ=2299.71;QD=34.32;SB=-1138.31 GT:AD:DP:GL:GQ 1/1:0,67:64:-233.58,-19.28,-0.02:99
-chr1 5202265 rs599481 G T 595.11 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=49.58;MQ0=0;OQ=2113.87;QD=33.55;SB=-993.43 GT:AD:DP:GL:GQ 1/1:0,63:58:-214.99,-17.47,-0.02:99
-chr1 5202388 rs12066405 A G 127.75 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=51.98;MQ0=0;OQ=2322.85;QD=33.66;SB=-1080.10 GT:AD:DP:GL:GQ 1/1:0,69:65:-235.89,-19.58,-0.02:99
-chr1 5202422 . T G 419.39 Indel AC=1;AF=0.50;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=66.39;MQ=43.53;MQ0=0;QD=7.23;SB=-202.77 GT:AD:DP:GL:GQ 0/1:38,20:51:-60.59,-15.36,-121.07:99
-chr1 5202441 rs12071111 G A 97.09 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=3.61;MQ=40.65;MQ0=0;OQ=1838.51;QD=34.69;SB=-927.74 GT:AD:DP:GL:GQ 1/1:1,52:48:-187.45,-14.46,-0.02:99
-chr1 5202467 rs12067585 T G 27.99 PASS AC=2;AF=1.00;AN=2;DB;DP=35;Dels=0.00;HRun=1;HaplotypeScore=0.10;MQ=52.14;MQ0=0;OQ=1141.50;QD=32.61;SB=-417.26 GT:AD:DP:GL:GQ 1/1:0,35:33:-117.74,-9.94,-0.01:99
-chr1 5202510 rs10915390 T C 6.38 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=0.16;MQ=45.77;MQ0=0;OQ=1492.54;QD=28.70;SB=-582.99 GT:AD:DP:GL:GQ 1/1:0,52:46:-152.88,-13.87,-0.04:99
-chr1 5202536 rs10915391 A G 576.79 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=40.09;MQ0=0;OQ=1719.08;QD=33.06;SB=-769.98 GT:AD:DP:GL:GQ 1/1:0,52:48:-175.51,-14.46,-0.01:99
-chr1 5202563 . A G 1303.98 SnpCluster AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=5.87;MQ=34.10;MQ0=0;QD=25.08;SB=-434.46 GT:AD:DP:GL:GQ 1/1:0,52:39:-134.00,-11.75,-0.02:99
-chr1 5202564 . T C 1560.70 SnpCluster AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=2;HaplotypeScore=5.87;MQ=34.10;MQ0=0;QD=30.01;SB=-450.83 GT:AD:DP:GL:GQ 1/1:1,51:44:-159.67,-13.26,-0.02:99
-chr1 5202566 . C T 1713.62 SnpCluster AC=2;AF=1.00;AN=2;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.22;MQ=34.87;MQ0=0;QD=32.95;SB=-454.10 GT:AD:DP:GL:GQ 1/1:0,51:43:-174.96,-12.95,-0.01:99
-chr1 5202576 rs12134110 C T 0.75 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=6.13;MQ=37.89;MQ0=0;OQ=1873.93;QD=33.46;SB=-544.73 GT:AD:DP:GL:GQ 1/1:1,55:47:-190.99,-14.16,-0.01:99
-chr1 5202767 rs2986185 A G 288.60 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=54.20;MQ0=0;OQ=2264.33;QD=34.84;SB=-1153.44 GT:AD:DP:GL:GQ 1/1:0,65:64:-230.04,-19.28,-0.02:99
-chr1 5202796 rs2945617 T C 352.06 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=54.10;MQ0=0;OQ=1791.40;QD=27.99;SB=-839.97 GT:AD:DP:GL:GQ 1/1:0,64:58:-182.79,-17.50,-0.06:99
-chr1 5202844 rs2986184 C G 260.78 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=52.86;MQ0=0;OQ=2380.85;QD=40.35;SB=-1080.09 GT:AD:DP:GL:GQ 1/1:0,59:56:-241.69,-16.88,-0.02:99
-chr1 5202908 . C T 49.09 PASS AC=2;AF=1.00;AN=2;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=56.41;MQ0=0;OQ=1679.71;QD=37.33;SB=-834.36 GT:AD:DP:GL:GQ 1/1:0,45:42:-171.56,-12.65,-0.01:99
-chr1 5203231 rs480807 G A 112.83 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=1.65;MQ=59.13;MQ0=0;OQ=2991.96;QD=39.89;SB=-1079.44 GT:AD:DP:GL:GQ 1/1:0,75:75:-302.81,-22.60,-0.03:99
-chr1 5203306 rs6687834 C T 621.90 PASS AC=2;AF=1.00;AN=2;DB;DP=77;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3055.40;QD=39.68;SB=-1315.34 GT:AD:DP:GL:GQ 1/1:0,77:77:-309.15,-23.20,-0.02:99
-chr1 5203354 rs584498 C T 147.71 PASS AC=2;AF=1.00;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.38;MQ0=0;OQ=2983.67;QD=38.25;SB=-1435.37 GT:AD:DP:GL:GQ 1/1:0,78:75:-301.97,-22.59,-0.02:99
-chr1 5203671 rs582779 C A 167.92 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=60.00;MQ0=0;OQ=2146.95;QD=35.78;SB=-804.85 GT:AD:DP:GL:GQ 1/1:0,60:60:-218.30,-18.08,-0.02:99
-chr1 5203886 rs474456 G C 148.15 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=0;HaplotypeScore=3.48;MQ=58.03;MQ0=0;OQ=2254.35;QD=39.55;SB=-1087.49 GT:AD:DP:GL:GQ 1/1:0,57:55:-229.05,-16.59,-0.04:99
-chr1 5203943 rs473685 T C 568.01 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.84;MQ0=0;OQ=1941.75;QD=35.30;SB=-734.93 GT:AD:DP:GL:GQ 1/1:0,55:55:-197.78,-16.57,-0.02:99
-chr1 5204037 rs472768 C A 257.84 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=1.57;MQ=53.49;MQ0=0;OQ=2116.13;QD=35.87;SB=-808.86 GT:AD:DP:GL:GQ 1/1:0,59:58:-215.21,-17.47,-0.01:99
-chr1 5204179 rs561169 C T 180.12 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.48;MQ=59.63;MQ0=0;OQ=1666.79;QD=32.68;SB=-839.97 GT:AD:DP:GL:GQ 1/1:0,51:44:-170.29,-13.26,-0.02:99
-chr1 5204268 rs677650 G C 32.68 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.58;MQ=41.36;MQ0=0;OQ=1911.63;QD=39.01;SB=-915.40 GT:AD:DP:GL:GQ 1/1:0,49:46:-194.77,-13.87,-0.02:99
-chr1 5204556 rs676589 T A 738.91 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=54.27;MQ0=0;OQ=2559.35;QD=36.56;SB=-1189.80 GT:AD:DP:GL:GQ 1/1:0,70:69:-259.54,-20.78,-0.02:99
-chr1 5204733 rs675738 T C 27.97 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=2;HaplotypeScore=2.20;MQ=59.17;MQ0=0;OQ=1658.38;QD=29.61;SB=-662.81 GT:AD:DP:GL:GQ 1/1:0,56:52:-169.47,-15.68,-0.05:99
-chr1 5204883 rs9439546 G A 532.03 PASS AC=2;AF=1.00;AN=2;DB;DP=76;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.70;MQ0=0;OQ=2940.91;QD=38.70;SB=-1192.36 GT:AD:DP:GL:GQ 1/1:0,76:75:-297.70,-22.60,-0.03:99
-chr1 5204955 rs674820 A G 79.68 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=1;HaplotypeScore=1.76;MQ=59.62;MQ0=0;OQ=2113.60;QD=34.65;SB=-990.71 GT:AD:DP:GL:GQ 1/1:0,61:60:-214.97,-18.07,-0.02:99
-chr1 5204998 rs674421 C T 11.79 PASS AC=2;AF=1.00;AN=2;DB;DP=57;Dels=0.00;HRun=1;HaplotypeScore=4.18;MQ=59.19;MQ0=0;OQ=2200.64;QD=38.61;SB=-746.99 GT:AD:DP:GL:GQ 1/1:0,57:55:-223.66,-16.57,-0.01:99
-chr1 5205224 rs673451 T G 405.18 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=1733.87;QD=28.90;SB=-756.83 GT:AD:DP:GL:GQ 1/1:0,60:55:-177.02,-16.58,-0.05:99
-chr1 5206120 rs56397638 C T 43.03 Indel;LowQual AC=1;AF=0.50;AN=2;DB;DP=18;Dels=0.00;HRun=1;HaplotypeScore=3.09;MQ=48.93;MQ0=0;QD=2.39;SB=-0.99 GT:AD:DP:GL:GQ 0/1:15,3:17:-12.71,-5.12,-48.36:75.87
-chr1 5206410 . T C 0.40 PASS AC=2;AF=1.00;AN=2;DP=39;Dels=0.00;HRun=2;HaplotypeScore=1.63;MQ=56.77;MQ0=0;OQ=1364.10;QD=34.98;SB=-316.12 GT:AD:DP:GL:GQ 1/1:0,39:38:-140.01,-11.45,-0.01:99
-chr1 5206681 rs12121640 A C 71.98 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=1.00;MQ=58.51;MQ0=0;OQ=1679.67;QD=32.93;SB=-387.04 GT:AD:DP:GL:GQ 1/1:0,51:47:-171.57,-14.16,-0.01:99
-chr1 5206700 rs12125074 G A 98.48 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.05;MQ=58.12;MQ0=0;OQ=2000.17;QD=37.74;SB=-489.65 GT:AD:DP:GL:GQ 1/1:0,53:50:-203.61,-15.06,-0.01:99
-chr1 5208394 rs7549686 T C 327.06 PASS AC=2;AF=1.00;AN=2;DB;DP=94;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3436.97;QD=36.56;SB=-1599.67 GT:AD:DP:GL:GQ 1/1:0,94:93:-342.70,-28.01,-0.02:99
-chr1 5209527 rs12135834 C T 124.99 PASS AC=2;AF=1.00;AN=2;DB;DP=69;Dels=0.00;HRun=2;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=2736.25;QD=39.66;SB=-1253.04 GT:AD:DP:GL:GQ 1/1:0,69:68:-277.22,-20.48,-0.01:99
-chr1 5209757 rs12128282 G A 708.74 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2355.65;QD=38.62;SB=-1039.67 GT:AD:DP:GL:GQ 1/1:0,61:59:-239.17,-17.77,-0.02:99
-chr1 5210118 rs4465222 T C 132.90 PASS AC=2;AF=1.00;AN=2;DB;DP=45;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=58.97;MQ0=0;OQ=1268.12;QD=28.18;SB=-489.53 GT:AD:DP:GL:GQ 1/1:0,45:42:-130.45,-12.68,-0.06:99
-chr1 5210152 rs4465223 T C 176.23 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.16;MQ0=0;OQ=1621.75;QD=29.49;SB=-654.28 GT:AD:DP:GL:GQ 1/1:0,55:51:-165.81,-15.38,-0.05:99
-chr1 5210469 rs6686714 G T 712.77 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.59;MQ0=0;OQ=1971.04;QD=35.20;SB=-893.62 GT:AD:DP:GL:GQ 1/1:0,56:56:-200.71,-16.87,-0.02:99
-chr1 5211244 rs6603825 T C 594.56 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=2173.03;QD=35.62;SB=-828.31 GT:AD:DP:GL:GQ 1/1:0,61:60:-220.91,-18.07,-0.02:99
-chr1 5211435 . C T 25.65 PASS AC=1;AF=0.50;AN=2;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.22;MQ=59.65;MQ0=0;OQ=960.07;QD=17.78;SB=-418.78 GT:AD:DP:GL:GQ 0/1:25,29:53:-115.26,-15.97,-85.03:99
-chr1 5212025 rs4475768 T G 354.90 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.37;MQ0=0;OQ=695.32;QD=14.19;SB=-234.36 GT:AD:DP:GL:GQ 0/1:24,25:49:-87.57,-14.76,-89.97:99
-chr1 5212226 rs494046 T C 148.80 PASS AC=2;AF=1.00;AN=2;DB;DP=93;Dels=0.00;HRun=0;HaplotypeScore=0.79;MQ=60.00;MQ0=0;OQ=2779.20;QD=29.88;SB=-1328.52 GT:AD:DP:GL:GQ 1/1:0,93:88:-281.58,-26.54,-0.08:99
-chr1 5213428 . A G 11.97 PASS AC=1;AF=0.50;AN=2;DP=48;Dels=0.00;HRun=0;HaplotypeScore=3.03;MQ=58.55;MQ0=0;OQ=408.80;QD=8.52;SB=-93.78 GT:AD:DP:GL:GQ 0/1:27,21:44:-57.43,-13.27,-96.36:99
-chr1 5213524 . T A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=55;Dels=0.00;HRun=0;HaplotypeScore=71.93;MQ=50.54;MQ0=0;OQ=502.87;QD=9.14;SB=-189.21 GT:AD:DP:GL:GQ 0/1:37,18:47:-67.73,-14.16,-102.82:99
-chr1 5213770 rs6658152 C T 45.87 PASS AC=2;AF=1.00;AN=2;DB;DP=41;Dels=0.00;HRun=0;HaplotypeScore=0.33;MQ=60.00;MQ0=0;OQ=1572.39;QD=38.35;SB=-554.31 GT:AD:DP:GL:GQ 1/1:0,41:41:-160.84,-12.35,-0.02:99
-chr1 5215271 . A G 38.30 PASS AC=2;AF=1.00;AN=2;DP=58;Dels=0.00;HRun=0;HaplotypeScore=1.20;MQ=59.60;MQ0=0;OQ=1692.08;QD=29.17;SB=-770.59 GT:AD:DP:GL:GQ 1/1:0,57:55:-172.85,-16.59,-0.06:99
-chr1 5217813 . G C 1.18 PASS AC=1;AF=0.50;AN=2;DP=81;Dels=0.00;HRun=0;HaplotypeScore=9.11;MQ=58.35;MQ0=1;OQ=1164.43;QD=14.38;SB=-426.29 GT:AD:DP:GL:GQ 0/1:49,32:77:-142.93,-23.20,-194.98:99
-chr1 5217931 rs4847582 C G 145.68 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.89;MQ=59.66;MQ0=0;OQ=1509.42;QD=22.20;SB=-480.86 GT:AD:DP:GL:GQ 0/1:26,42:66:-174.11,-19.89,-110.01:99
-chr1 5218042 rs4847581 A T 229.68 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.16;MQ=59.31;MQ0=0;OQ=560.70;QD=9.19;SB=-151.08 GT:AD:DP:GL:GQ 0/1:39,22:59:-77.12,-17.77,-150.88:99
-chr1 5218412 rs12089315 C T 695.85 PASS AC=2;AF=1.00;AN=2;DB;DP=66;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2655.40;QD=40.23;SB=-1167.53 GT:AD:DP:GL:GQ 1/1:0,66:65:-269.14,-19.58,-0.01:99
-chr1 5218922 rs55929300 C T 250.89 PASS AC=1;AF=0.50;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=2.25;MQ=58.35;MQ0=0;OQ=749.84;QD=14.42;SB=-372.87 GT:AD:DP:GL:GQ 0/1:29,23:51:-93.64,-15.37,-91.04:99
-chr1 5218923 rs2945619 A G 55.86 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=2.25;MQ=58.42;MQ0=0;OQ=1817.82;QD=33.66;SB=-828.90 GT:AD:DP:GL:GQ 1/1:0,54:53:-185.39,-15.97,-0.03:99
-chr1 5219162 . C T 26.36 PASS AC=1;AF=0.50;AN=2;DP=84;Dels=0.00;HRun=2;HaplotypeScore=0.93;MQ=59.78;MQ0=0;OQ=1260.89;QD=15.01;SB=-475.42 GT:AD:DP:GL:GQ 0/1:46,38:84:-154.67,-25.30,-167.04:99
-chr1 5220394 rs632798 A G 319.28 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=1931.82;QD=32.74;SB=-775.98 GT:AD:DP:GL:GQ 1/1:0,59:54:-196.78,-16.27,-0.02:99
-chr1 5221239 rs11584035 A G 510.42 PASS AC=2;AF=1.00;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2162.59;QD=34.33;SB=-1003.74 GT:AD:DP:GL:GQ 1/1:0,63:61:-219.86,-18.37,-0.02:99
-chr1 5221301 rs11585734 G C 28.93 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=58.47;MQ0=0;OQ=2416.76;QD=43.16;SB=-843.33 GT:AD:DP:GL:GQ 1/1:0,56:55:-245.27,-16.57,-0.01:99
-chr1 5221482 rs34835703 A T 2939.50 Indel AC=2;AF=1.00;AN=2;DB;DP=92;Dels=0.00;HRun=0;HaplotypeScore=3.98;MQ=58.65;MQ0=0;QD=31.95;SB=-1078.25 GT:AD:DP:GL:GQ 1/1:2,89:87:-306.96,-29.45,-9.42:99
-chr1 5221725 . G A 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=60;Dels=0.03;HRun=18;HaplotypeScore=39.80;MQ=52.31;MQ0=0;OQ=152.15;QD=2.54;SB=47.14 GT:AD:DP:GL:GQ 0/1:40,18:43:-30.85,-12.35,-114.35:99
-chr1 5222078 rs972257 T A 639.98 PASS AC=2;AF=1.00;AN=2;DB;DP=85;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=56.18;MQ0=0;OQ=3168.88;QD=37.28;SB=-1120.55 GT:AD:DP:GL:GQ 1/1:0,85:85:-320.49,-25.60,-0.02:99
-chr1 5222126 rs972256 A G 626.95 PASS AC=2;AF=1.00;AN=2;DB;DP=75;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.13;MQ0=0;OQ=2639.54;QD=35.19;SB=-1126.78 GT:AD:DP:GL:GQ 1/1:0,75:75:-267.56,-22.59,-0.03:99
-chr1 5224091 rs499416 T C 297.77 PASS AC=2;AF=1.00;AN=2;DB;DP=82;Dels=0.00;HRun=0;HaplotypeScore=1.73;MQ=59.44;MQ0=0;OQ=2957.76;QD=36.07;SB=-1259.50 GT:AD:DP:GL:GQ 1/1:0,82:82:-299.39,-24.70,-0.03:99
-chr1 5224457 rs681122 A G 116.50 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=58.67;MQ0=0;OQ=2663.18;QD=31.70;SB=-1024.35 GT:AD:DP:GL:GQ 1/1:0,84:81:-269.96,-24.42,-0.06:99
-chr1 5224547 rs503246 T C 2.42 PASS AC=2;AF=1.00;AN=2;DB;DP=70;Dels=0.00;HRun=1;HaplotypeScore=6.13;MQ=59.67;MQ0=0;OQ=2425.86;QD=34.66;SB=-1136.77 GT:AD:DP:GL:GQ 1/1:0,69:69:-249.69,-23.90,-3.52:99
-chr1 5224600 rs504015 G A 107.71 PASS AC=2;AF=1.00;AN=2;DB;DP=95;Dels=0.00;HRun=0;HaplotypeScore=1.41;MQ=59.36;MQ0=0;OQ=3623.40;QD=38.14;SB=-1734.33 GT:AD:DP:GL:GQ 1/1:1,94:92:-361.34,-27.72,-0.04:99
-chr1 5225244 rs34916930 A G 210.97 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=2.75;MQ=59.23;MQ0=0;OQ=766.73;QD=12.78;SB=-281.64 GT:AD:DP:GL:GQ 0/1:31,29:57:-97.13,-17.17,-122.94:99
-chr1 5225286 rs1614164 A G 116.44 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=59.11;MQ0=0;OQ=1503.00;QD=28.90;SB=-584.52 GT:AD:DP:GL:GQ 1/1:0,52:49:-153.94,-14.79,-0.06:99
-chr1 5225305 rs531507 T C 127.86 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=1;HaplotypeScore=0.63;MQ=59.05;MQ0=0;OQ=1485.28;QD=30.31;SB=-700.80 GT:AD:DP:GL:GQ 1/1:0,49:47:-152.15,-14.18,-0.04:99
-chr1 5225319 rs531541 G A 341.76 PASS AC=1;AF=0.50;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.47;MQ=59.53;MQ0=0;OQ=776.62;QD=15.85;SB=-311.30 GT:AD:DP:GL:GQ 0/1:25,24:46:-94.81,-13.86,-73.71:99
-chr1 5225584 rs12139398 G T 64.15 PASS AC=1;AF=0.50;AN=2;DB;DP=76;Dels=0.00;HRun=3;HaplotypeScore=2.68;MQ=59.09;MQ0=0;OQ=1255.53;QD=16.52;SB=-636.75 GT:AD:DP:GL:GQ 0/1:35,41:76:-151.73,-22.89,-120.82:99
-chr1 5225784 rs648378 G A 217.93 PASS AC=2;AF=1.00;AN=2;DB;DP=79;Dels=0.00;HRun=1;HaplotypeScore=0.67;MQ=60.00;MQ0=0;OQ=3051.49;QD=38.63;SB=-1366.03 GT:AD:DP:GL:GQ 1/1:0,79:77:-308.76,-23.20,-0.02:99
-chr1 5225910 rs536995 T C 659.19 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2238.13;QD=31.52;SB=-1141.80 GT:AD:DP:GL:GQ 1/1:0,71:69:-227.45,-20.80,-0.05:99
-chr1 5226194 rs646542 C A 53.96 PASS AC=1;AF=0.50;AN=2;DB;DP=48;Dels=0.00;HRun=2;HaplotypeScore=2.51;MQ=59.52;MQ0=0;OQ=616.21;QD=12.84;SB=-186.21 GT:AD:DP:GL:GQ 0/1:25,23:46:-78.77,-13.86,-80.93:99
-chr1 5227007 rs17422703 C T 447.59 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=0.99;MQ=60.00;MQ0=0;OQ=653.00;QD=13.89;SB=-346.50 GT:AD:DP:GL:GQ 0/1:27,20:47:-82.75,-14.17,-88.07:99
-chr1 5227141 rs479689 T C 634.35 PASS AC=2;AF=1.00;AN=2;DB;DP=72;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.68;MQ0=0;OQ=2577.54;QD=35.80;SB=-1149.80 GT:AD:DP:GL:GQ 1/1:0,72:72:-261.36,-21.69,-0.02:99
-chr1 5227198 rs631837 T G 470.17 PASS AC=1;AF=0.50;AN=2;DB;DP=80;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.48;MQ0=0;OQ=1038.21;QD=12.98;SB=-481.28 GT:AD:DP:GL:GQ 0/1:42,38:78:-130.60,-23.49,-142.85:99
-chr1 5227509 rs2945620 A G 463.41 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.71;MQ0=0;OQ=1887.53;QD=34.95;SB=-718.20 GT:AD:DP:GL:GQ 1/1:0,54:53:-192.35,-15.96,-0.02:99
-chr1 5227512 rs2986190 C G 581.25 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.76;MQ0=0;OQ=2178.35;QD=38.90;SB=-696.39 GT:AD:DP:GL:GQ 1/1:0,56:54:-221.45,-16.29,-0.03:99
-chr1 5227592 rs484203 C G 505.04 PASS AC=2;AF=1.00;AN=2;DB;DP=48;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.30;MQ0=0;OQ=1740.53;QD=36.26;SB=-435.04 GT:AD:DP:GL:GQ 1/1:0,48:44:-177.67,-13.27,-0.03:99
-chr1 5227620 rs2945621 C T 184.65 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.15;MQ=58.52;MQ0=0;OQ=2108.36;QD=38.33;SB=-729.97 GT:AD:DP:GL:GQ 1/1:0,54:54:-216.99,-18.70,-2.57:99
-chr1 5228455 rs605572 G A 158.70 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.32;MQ=59.08;MQ0=0;OQ=2364.59;QD=38.76;SB=-1049.40 GT:AD:DP:GL:GQ 1/1:0,61:59:-240.06,-17.77,-0.01:99
-chr1 5228485 rs547366 A G 151.91 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=1.43;MQ=59.32;MQ0=0;OQ=1644.48;QD=29.90;SB=-746.94 GT:AD:DP:GL:GQ 1/1:0,55:53:-168.09,-15.99,-0.05:99
-chr1 5228494 rs547375 T C 432.28 PASS AC=2;AF=1.00;AN=2;DB;DP=40;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.06;MQ0=0;OQ=1148.89;QD=28.72;SB=-518.83 GT:AD:DP:GL:GQ 1/1:0,40:38:-118.51,-11.46,-0.04:99
-chr1 5228675 rs549178 A C 608.96 PASS AC=2;AF=1.00;AN=2;DB;DP=54;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1844.59;QD=34.16;SB=-895.07 GT:AD:DP:GL:GQ 1/1:0,54:53:-188.06,-15.96,-0.02:99
-chr1 5229041 rs552154 A G 144.86 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=2;HaplotypeScore=1.05;MQ=58.33;MQ0=0;OQ=2394.34;QD=35.74;SB=-1030.76 GT:AD:DP:GL:GQ 1/1:0,67:67:-243.04,-20.18,-0.02:99
-chr1 5229075 rs694316 A G 16.95 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=2;HaplotypeScore=2.71;MQ=58.29;MQ0=0;OQ=1696.38;QD=32.62;SB=-808.31 GT:AD:DP:GL:GQ 1/1:0,52:49:-173.25,-14.76,-0.02:99
-chr1 5229079 rs574063 A C 47.22 PASS AC=2;AF=1.00;AN=2;DB;DP=52;Dels=0.00;HRun=1;HaplotypeScore=2.27;MQ=58.29;MQ0=0;OQ=1690.52;QD=32.51;SB=-775.03 GT:AD:DP:GL:GQ 1/1:0,52:50:-172.66,-15.06,-0.02:99
-chr1 5229195 rs2986189 T C 594.24 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1695.13;QD=33.24;SB=-849.99 GT:AD:DP:GL:GQ 1/1:0,50:49:-173.12,-14.76,-0.02:99
-chr1 5229410 rs590229 A G 533.32 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=58.69;MQ0=0;OQ=1626.39;QD=32.53;SB=-702.18 GT:AD:DP:GL:GQ 1/1:0,50:47:-166.24,-14.16,-0.02:99
-chr1 5229454 rs576935 T C 291.30 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2227.88;QD=34.81;SB=-1091.09 GT:AD:DP:GL:GQ 1/1:0,64:63:-226.40,-18.98,-0.03:99
-chr1 5229643 rs589314 C T 702.68 PASS AC=2;AF=1.00;AN=2;DB;DP=84;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=3349.31;QD=39.87;SB=-1157.05 GT:AD:DP:GL:GQ 1/1:0,84:83:-333.93,-25.00,-0.02:99
-chr1 5229725 rs579467 T C 242.79 PASS AC=2;AF=1.00;AN=2;DB;DP=53;Dels=0.00;HRun=0;HaplotypeScore=1.46;MQ=59.13;MQ0=0;OQ=1575.01;QD=29.72;SB=-809.29 GT:AD:DP:GL:GQ 1/1:0,53:51:-161.14,-15.39,-0.05:99
-chr1 5229840 rs580404 G A 618.34 PASS AC=2;AF=1.00;AN=2;DB;DP=73;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.49;MQ0=0;OQ=2841.67;QD=38.93;SB=-1151.68 GT:AD:DP:GL:GQ 1/1:0,73:73:-287.78,-22.00,-0.03:99
-chr1 5229963 rs587619 A G 627.90 PASS AC=2;AF=1.00;AN=2;DB;DP=49;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.05;MQ0=0;OQ=1527.65;QD=31.18;SB=-661.80 GT:AD:DP:GL:GQ 1/1:0,49:48:-156.40,-14.48,-0.05:99
-chr1 5230068 rs684796 A G 654.33 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1910.04;QD=31.31;SB=-776.75 GT:AD:DP:GL:GQ 1/1:0,61:59:-194.63,-17.79,-0.04:99
-chr1 5230099 rs493993 T C 52.25 PASS AC=2;AF=1.00;AN=2;DB;DP=51;Dels=0.00;HRun=1;HaplotypeScore=2.40;MQ=60.00;MQ0=0;OQ=1531.39;QD=30.03;SB=-555.88 GT:AD:DP:GL:GQ 1/1:0,51:49:-156.77,-14.78,-0.05:99
-chr1 5230146 rs494138 C T 565.44 PASS AC=2;AF=1.00;AN=2;DB;DP=50;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1901.52;QD=38.03;SB=-812.08 GT:AD:DP:GL:GQ 1/1:0,50:49:-193.76,-14.77,-0.02:99
-chr1 5230400 rs683361 C T 576.16 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2445.96;QD=38.22;SB=-885.63 GT:AD:DP:GL:GQ 1/1:0,64:64:-248.21,-19.29,-0.03:99
-chr1 5230419 rs683326 A C 444.54 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=2097.81;QD=32.78;SB=-733.04 GT:AD:DP:GL:GQ 1/1:0,64:59:-213.39,-17.77,-0.02:99
-chr1 5230522 rs497780 C T 280.11 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.26;MQ=59.44;MQ0=0;OQ=2456.36;QD=36.66;SB=-1135.53 GT:AD:DP:GL:GQ 1/1:0,66:64:-249.25,-19.29,-0.03:99
-chr1 5230617 rs682425 A C 128.19 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=1.82;MQ=60.00;MQ0=0;OQ=2329.64;QD=34.26;SB=-803.08 GT:AD:DP:GL:GQ 1/1:1,67:66:-236.57,-19.88,-0.02:99
-chr1 5230727 rs499639 G A 152.07 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=1.94;MQ=59.28;MQ0=0;OQ=1710.74;QD=26.73;SB=-582.87 GT:AD:DP:GL:GQ 1/1:0,37:64:-256.74,-99.73,-82.08:99
-chr1 5230993 rs17423021 C T 275.08 PASS AC=1;AF=0.50;AN=2;DB;DP=47;Dels=0.00;HRun=0;HaplotypeScore=1.66;MQ=60.00;MQ0=0;OQ=870.39;QD=18.52;SB=-403.16 GT:AD:DP:GL:GQ 0/1:21,26:47:-104.48,-14.16,-73.19:99
-chr1 5231281 rs695100 T C 614.40 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=1962.66;QD=33.84;SB=-961.65 GT:AD:DP:GL:GQ 1/1:0,58:57:-199.88,-17.17,-0.03:99
-chr1 5231434 rs2860250 T G 608.99 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=1940.74;QD=34.66;SB=-919.09 GT:AD:DP:GL:GQ 1/1:0,56:55:-197.68,-16.57,-0.02:99
-chr1 5231440 rs2353173 G T 713.73 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2174.12;QD=33.45;SB=-1013.52 GT:AD:DP:GL:GQ 1/1:0,65:62:-221.02,-18.68,-0.02:99
-chr1 5231533 rs4290073 G A 106.58 PASS AC=1;AF=0.50;AN=2;DB;DP=81;Dels=0.00;HRun=3;HaplotypeScore=0.16;MQ=59.20;MQ0=0;OQ=1041.27;QD=12.86;SB=-342.41 GT:AD:DP:GL:GQ 0/1:49,32:81:-131.81,-24.39,-179.39:99
-chr1 5231729 rs2945622 G A 619.13 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2286.02;QD=38.75;SB=-1132.51 GT:AD:DP:GL:GQ 1/1:0,59:57:-232.20,-17.17,-0.01:99
-chr1 5231775 rs4633300 T C 80.14 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=2.27;MQ=58.86;MQ0=0;OQ=2147.74;QD=35.21;SB=-1067.79 GT:AD:DP:GL:GQ 1/1:0,61:61:-218.38,-18.38,-0.02:99
-chr1 5231808 rs10799186 T C 608.79 PASS AC=2;AF=1.00;AN=2;DB;DP=62;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.88;MQ0=0;OQ=2059.90;QD=33.22;SB=-1027.00 GT:AD:DP:GL:GQ 1/1:0,62:60:-209.61,-18.08,-0.04:99
-chr1 5231809 rs10799187 G C 596.93 PASS AC=2;AF=1.00;AN=2;DB;DP=64;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=58.91;MQ0=0;OQ=2598.74;QD=40.61;SB=-1318.71 GT:AD:DP:GL:GQ 1/1:0,64:61:-263.48,-18.38,-0.02:99
-chr1 5231833 rs530731 G C 494.40 PASS AC=2;AF=1.00;AN=2;DB;DP=58;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.60;MQ0=0;OQ=2447.16;QD=42.19;SB=-1018.28 GT:AD:DP:GL:GQ 1/1:0,58:58:-248.32,-17.48,-0.02:99
-chr1 5231988 rs614111 C A 590.46 PASS AC=2;AF=1.00;AN=2;DB;DP=55;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.58;MQ0=0;OQ=1949.76;QD=35.45;SB=-809.87 GT:AD:DP:GL:GQ 1/1:0,55:54:-198.57,-16.26,-0.01:99
-chr1 5231995 rs614102 A G 590.99 PASS AC=2;AF=1.00;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.61;MQ0=0;OQ=2129.07;QD=36.09;SB=-828.32 GT:AD:DP:GL:GQ 1/1:0,59:59:-216.51,-17.77,-0.02:99
-chr1 5232537 rs558175 T A 537.54 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2470.42;QD=36.33;SB=-1158.53 GT:AD:DP:GL:GQ 1/1:0,68:67:-250.65,-20.18,-0.02:99
-chr1 5232779 rs560794 T A 637.12 PASS AC=2;AF=1.00;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.66;MQ0=0;OQ=2459.58;QD=36.17;SB=-1165.07 GT:AD:DP:GL:GQ 1/1:0,68:66:-249.56,-19.88,-0.02:99
-chr1 5232782 rs600322 G A 160.84 PASS AC=2;AF=1.00;AN=2;DB;DP=65;Dels=0.00;HRun=1;HaplotypeScore=0.16;MQ=59.65;MQ0=0;OQ=2495.29;QD=38.39;SB=-1228.15 GT:AD:DP:GL:GQ 1/1:0,65:64:-253.13,-19.28,-0.02:99
-chr1 5232864 rs599884 A G 212.34 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.98;MQ=59.42;MQ0=0;OQ=2139.99;QD=35.08;SB=-951.99 GT:AD:DP:GL:GQ 1/1:0,61:60:-217.60,-18.07,-0.02:99
-chr1 5233339 rs598031 G A 300.26 PASS AC=2;AF=1.00;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=0.87;MQ=59.38;MQ0=0;OQ=2603.20;QD=38.85;SB=-1265.68 GT:AD:DP:GL:GQ 1/1:0,66:66:-263.92,-19.88,-0.02:99
-chr1 5233376 rs587228 C T 292.53 PASS AC=2;AF=1.00;AN=2;DB;DP=60;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=58.99;MQ0=0;OQ=2392.78;QD=39.88;SB=-1196.59 GT:AD:DP:GL:GQ 1/1:0,60:60:-242.88,-18.07,-0.02:99
-chr1 5233377 rs476866 A G 630.33 PASS AC=2;AF=1.00;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=59.01;MQ0=0;OQ=2129.35;QD=34.91;SB=-1082.46 GT:AD:DP:GL:GQ 1/1:0,61:60:-216.54,-18.07,-0.02:99
-chr1 5233422 rs476993 T C 95.16 PASS AC=2;AF=1.00;AN=2;DB;DP=56;Dels=0.00;HRun=1;HaplotypeScore=0.89;MQ=58.92;MQ0=0;OQ=1891.61;QD=33.78;SB=-702.84 GT:AD:DP:GL:GQ 1/1:1,55:55:-192.78,-16.58,-0.03:99
-chr1 5233779 rs56260836 C T 250.27 PASS AC=1;AF=0.50;AN=2;DB;DP=60;Dels=0.00;HRun=0;HaplotypeScore=1.97;MQ=59.69;MQ0=0;OQ=907.86;QD=15.13;SB=-369.08 GT:AD:DP:GL:GQ 0/1:31,29:57:-111.25,-17.18,-100.79:99
-chr1 5234072 rs504647 G A 600.46 PASS AC=2;AF=1.00;AN=2;DB;DP=71;Dels=0.00;HRun=0;HaplotypeScore=0.00;MQ=60.00;MQ0=0;OQ=2853.54;QD=40.19;SB=-1415.37 GT:AD:DP:GL:GQ 1/1:0,71:71:-288.96,-21.39,-0.02:99
-chr1 5234128 rs7551166 T C 37.81 PASS AC=1;AF=0.50;AN=2;DB;DP=63;Dels=0.00;HRun=1;HaplotypeScore=4.51;MQ=60.00;MQ0=0;OQ=837.05;QD=13.29;SB=-326.85 GT:AD:DP:GL:GQ 0/1:34,29:63:-105.96,-18.97,-138.54:99
-chr1 5234274 rs583170 C A 510.70 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.00;MQ=59.64;MQ0=0;OQ=1124.36;QD=17.57;SB=-381.75 GT:AD:DP:GL:GQ 0/1:28,36:64:-134.99,-19.28,-100.59:99
-chr1 5234483 rs12746195 G T 448 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=1.30;MQ=60.00;MQ0=0;OQ=907.18;QD=14.87;SB=-443.17 GT:AD:DP:GL:GQ 0/1:30,31:60:-112.07,-18.07,-106.20:99
-chr1 5234497 rs12732868 T G 365.79 PASS AC=1;AF=0.50;AN=2;DB;DP=64;Dels=0.00;HRun=1;HaplotypeScore=0.80;MQ=60.00;MQ0=0;OQ=834.65;QD=13.04;SB=-431.76 GT:AD:DP:GL:GQ 0/1:33,31:62:-105.43,-18.68,-118.96:99
-chr1 5234595 rs12747559 C T 411.30 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=0;HaplotypeScore=1.47;MQ=59.66;MQ0=0;OQ=1103.55;QD=16.23;SB=-461.98 GT:AD:DP:GL:GQ 0/1:32,36:64:-132.93,-19.29,-98.65:99
-chr1 5234628 rs12746515 G A 395.10 PASS AC=1;AF=0.50;AN=2;DB;DP=78;Dels=0.00;HRun=0;HaplotypeScore=0.97;MQ=59.70;MQ0=0;OQ=1407.50;QD=18.04;SB=-722.08 GT:AD:DP:GL:GQ 0/1:37,41:75:-166.64,-22.60,-112.02:99
-chr1 5234751 rs12747870 C T 314.20 PASS AC=1;AF=0.50;AN=2;DB;DP=68;Dels=0.00;HRun=1;HaplotypeScore=2.20;MQ=59.17;MQ0=0;OQ=991.08;QD=14.57;SB=-434.89 GT:AD:DP:GL:GQ 0/1:38,30:67:-122.57,-20.18,-136.08:99
-chr1 5234796 rs12729227 A T 285.02 PASS AC=1;AF=0.50;AN=2;DB;DP=67;Dels=0.00;HRun=0;HaplotypeScore=1.60;MQ=58.68;MQ0=0;OQ=635.81;QD=9.49;SB=-240.21 GT:AD:DP:GL:GQ 0/1:44,23:66:-86.75,-19.88,-161.14:99
-chr1 5234855 rs12746867 G A 137.48 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=3;HaplotypeScore=0.48;MQ=58.86;MQ0=0;OQ=803.94;QD=13.18;SB=-392.38 GT:AD:DP:GL:GQ 0/1:35,26:59:-101.45,-17.77,-122.51:99
-chr1 5234867 rs12729373 A G 399.72 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=2;HaplotypeScore=0.00;MQ=59.62;MQ0=0;OQ=739.47;QD=12.12;SB=-312.22 GT:AD:DP:GL:GQ 0/1:35,26:61:-95.60,-18.37,-142.14:99
-chr1 5235030 rs55729623 C G 87.40 PASS AC=1;AF=0.50;AN=2;DB;DP=59;Dels=0.00;HRun=0;HaplotypeScore=4.84;MQ=59.98;MQ0=0;OQ=961.43;QD=16.30;SB=-383.64 GT:AD:DP:GL:GQ 0/1:26,33:53:-115.42,-16.00,-99.45:99
-chr1 5235034 . G A 5.72 PASS AC=1;AF=0.50;AN=2;DP=62;Dels=0.00;HRun=0;HaplotypeScore=5.25;MQ=59.98;MQ0=0;OQ=618.09;QD=9.97;SB=-190.00 GT:AD:DP:GL:GQ 0/1:34,27:51:-82.91,-17.82,-96.99:99
-chr1 5235136 rs17457156 T C 138.33 PASS AC=1;AF=0.50;AN=2;DB;DP=61;Dels=0.00;HRun=0;HaplotypeScore=3.41;MQ=59.24;MQ0=0;OQ=556.94;QD=9.13;SB=-82.80 GT:AD:DP:GL:GQ 0/1:34,26:58:-79.46,-20.48,-139.05:99
diff --git a/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf b/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf
deleted file mode 100644
index b96f648..0000000
--- a/src/test/resources/htsjdk/variant/ILLUMINA.wex.broad_phase2_baseline.20111114.both.exome.genotypes.1000.vcf
+++ /dev/null
@@ -1,249 +0,0 @@
-##fileformat=VCFv4.1
-##FILTER=<ID=TruthSensitivityTranche98.50to98.80,Description="Truth sensitivity tranche level at VSQ Lod: -0.1106 <= x < 0.6654">
-##FILTER=<ID=TruthSensitivityTranche98.80to98.90,Description="Truth sensitivity tranche level at VSQ Lod: -0.4426 <= x < -0.1106">
-##FILTER=<ID=TruthSensitivityTranche98.90to99.00,Description="Truth sensitivity tranche level at VSQ Lod: -0.8793 <= x < -0.4426">
-##FILTER=<ID=TruthSensitivityTranche99.00to99.30,Description="Truth sensitivity tranche level at VSQ Lod: -2.6664 <= x < -0.8793">
-##FILTER=<ID=TruthSensitivityTranche99.30to99.50,Description="Truth sensitivity tranche level at VSQ Lod: -5.2612 <= x < -2.6664">
-##FILTER=<ID=TruthSensitivityTranche99.50to99.90,Description="Truth sensitivity tranche level at VSQ Lod: -65.3589 <= x < -5.2612">
-##FILTER=<ID=TruthSensitivityTranche99.90to100.00+,Description="Truth sensitivity tranche level at VQS Lod < -6678.5611">
-##FILTER=<ID=TruthSensitivityTranche99.90to100.00,Description="Truth sensitivity tranche level at VSQ Lod: -6678.5611 <= x < -65.3589">
-##FILTER=<ID=Indel_QD,Description="x">
-##FILTER=<ID=Indel_FS,Description="x">
-##FILTER=<ID=Indel_ReadPosRankSum,Description="x">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HM3,Number=0,Type=Flag,Description="HM3 Membership">
-##INFO=<ID=GS,Number=0,Type=Flag,Description="In gold-standard indel set">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=NDA,Number=1,Type=Integer,Description="Number of alternate alleles discovered (but not necessarily genotyped) at this site">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00096 HG00100 HG00101 HG00102 HG00103 HG00107 HG00108 HG00109 HG00110 HG00111 HG00113 HG00114 HG00116 HG00117 HG00119 HG00120 HG00121 HG00123 HG00124 HG00125 HG00127 HG00131 HG00133 HG00136 HG00137 HG00138 HG00139 HG00140 HG00145 HG00146 HG00154 HG00155 HG00157 HG00158 HG00159 HG00160 HG00171 HG00174 HG00176 HG00178 HG00181 HG00182 HG00183 HG00185 HG00186 HG00187 HG00188 HG00189 HG00190 HG00232 HG00233 HG00236 HG00237 HG00238 HG00239 HG0024 [...]
-1 30548 . T G 134.71 TruthSensitivityTranche99.50to99.90 AC=14;AF=0.583;AN=24;BaseQRankSum=-2.141;DP=128;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1517;InbreedingCoeff=0.3252;MQ=3.02;MQ0=1125;MQRankSum=0.529;NDA=2;QD=2.07;ReadPosRankSum=0.244;SB=33.48;VQSLOD=-7.1701;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. . [...]
-1 69270 . A G 12343.52 TruthSensitivityTranche99.30to99.50 AC=311;AF=0.7199;AN=432;BaseQRankSum=-14.987;DP=9872;DS;Dels=0.00;FS=9.231;HRun=0;HaplotypeScore=0.0867;InbreedingCoeff=0.2338;MQ=6.11;MQ0=13219;MQRankSum=15.096;NDA=1;QD=1.38;ReadPosRankSum=3.099;SB=-194.48;VQSLOD=-5.1809;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. 1/1:0,1:6:17.92:136,18,0 ./. ./. ./. ./. ./. ./. 1/1:43,17:60:2.99:24,3,0 ./. ./. ./. ./. ./. ./. 1/1:46,14:60:3:29,3,0 ./ [...]
-1 69428 rs140739101 T G 1587.10 TruthSensitivityTranche99.30to99.50 AC=30;AF=0.0333;AN=902;BaseQRankSum=3.267;DB;DP=50533;DS;Dels=0.00;FS=98.109;HRun=0;HaplotypeScore=0.1382;InbreedingCoeff=0.1235;MQ=17.74;MQ0=2178;MQRankSum=0.762;NDA=2;QD=1.07;ReadPosRankSum=1.621;SB=-348.91;VQSLOD=-4.2588;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:92:99:0,276,2454 ./. 0/0:1,0:100:99:0,300,2568 0/0:1,0:127:99:0,379,2880 ./. ./. ./. ./. 0/0:1,0:90:99:0,269,2131 ./ [...]
-1 69453 rs142004627 G A 917.27 TruthSensitivityTranche99.50to99.90 AC=11;AF=0.0127;AN=868;BaseQRankSum=4.298;DB;DP=51456;DS;Dels=0.00;FS=8.058;HRun=2;HaplotypeScore=0.2298;InbreedingCoeff=0.2958;MQ=21.21;MQ0=143;MQRankSum=5.921;NDA=2;QD=3.03;ReadPosRankSum=2.490;SB=-5.66;VQSLOD=-5.8496;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:117:99:0,351,3121 ./. 0/0:1,0:110:99:0,330,2825 0/0:1,0:127:99:0,379,2880 ./. ./. ./. ./. 0/0:1,0:111:99:0,332,2629 ./. . [...]
-1 69486 . C T 411.09 PASS AC=1;AF=0.0011;AN=870;BaseQRankSum=3.271;DP=47045;DS;Dels=0.00;FS=18.777;HRun=0;HaplotypeScore=0.1619;InbreedingCoeff=-0.0068;MQ=18.73;MQ0=630;MQRankSum=3.678;NDA=2;QD=6.85;ReadPosRankSum=-0.995;SB=-160.62;VQSLOD=4.1085;culprit=MQ;set=variant GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:72:99:0,216,1921 ./. 0/0:1,0:79:99:0,237,2029 0/0:1,0:125:99:0,373,2834 ./. ./. ./. ./. 0/0:1,0:69:99:0,206,1634 ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:51:99:0,153,1208 ./ [...]
-1 69496 rs150690004 G A 770.17 TruthSensitivityTranche99.30to99.50 AC=4;AF=0.0046;AN=866;BaseQRankSum=7.303;DB;DP=45079;DS;Dels=0.00;FS=43.681;HRun=0;HaplotypeScore=0.3031;InbreedingCoeff=0.0441;MQ=18.29;MQ0=527;MQRankSum=6.120;NDA=2;QD=3.63;ReadPosRankSum=-1.444;SB=-136.96;VQSLOD=-3.7330;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:75:99:0,225,2001 ./. 0/0:1,0:68:99:0,204,1746 0/0:1,0:122:99:0,364,2766 ./. ./. ./. ./. 0/0:1,0:72:99:0,215,1705 ./. . [...]
-1 69511 rs75062661 A G 625265.62 TruthSensitivityTranche99.30to99.50 AC=856;AF=0.8753;AN=978;BaseQRankSum=13.271;DB;DP=32369;DS;Dels=0.00;FS=45.494;HRun=0;HaplotypeScore=1.1421;InbreedingCoeff=0.5380;MQ=26.49;MQ0=1627;MQRankSum=-18.719;NDA=1;QD=19.82;ReadPosRankSum=-20.606;SB=-54909.34;VQSLOD=-3.2503;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. 1/1:0,40:40:65.91:557,66,0 ./. ./. ./. ./. ./. ./. 1/1:0,1:43:99:1147,129,0 ./. 1/1:0,1:45:99:1156,135,0 1/1:0,1:106:99:2404,317,0 ./. ./. 1/1 [...]
-1 69534 rs190717287 T C 1060.12 PASS AC=1;AF=0.0012;AN=854;BaseQRankSum=-0.841;DB;DP=43078;DS;Dels=0.00;FS=13.161;HRun=0;HaplotypeScore=0.3320;InbreedingCoeff=0.0940;MQ=27.32;MQ0=107;MQRankSum=3.045;NDA=1;QD=9.14;ReadPosRankSum=-2.118;SB=-601.36;VQSLOD=1.3414;culprit=MQ;set=variant GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:1:3:0,3,25 0/0:1,0:87:99:0,261,2321 ./. 0/0:1,0:84:99:0,252,2157 0/0:1,0:127:99:0,379,2880 ./. ./. 0/0:1,0:92:99:0,275,2086 ./. 0/0:1,0:69:99:0,206,1634 ./. . [...]
-1 69541 . A G 578.88 PASS AC=1;AF=0.0012;AN=842;BaseQRankSum=1.875;DP=44707;DS;Dels=0.00;FS=9.702;HRun=1;HaplotypeScore=0.5109;InbreedingCoeff=-0.0048;MQ=28.52;MQ0=97;MQRankSum=4.954;NDA=1;QD=9.65;ReadPosRankSum=-1.290;SB=-236.37;VQSLOD=1.9979;culprit=MQ;set=variant GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:1:3:0,3,25 0/0:1,0:104:99:0,312,2774 ./. 0/0:1,0:93:99:0,279,2388 0/0:1,0:127:99:0,379,2880 ./. ./. 0/0:1,0:100:99:0,299,2267 ./. 0/0:1,0:74:99:0,221,1752 ./. ./. ./. ./. 0/0 [...]
-1 69552 rs55874132 G C 263.21 TruthSensitivityTranche99.50to99.90 AC=6;AF=0.0071;AN=850;BaseQRankSum=8.467;DB;DP=46741;DS;Dels=0.00;FS=10.412;HRun=1;HaplotypeScore=0.4375;InbreedingCoeff=0.2845;MQ=29.45;MQ0=385;MQRankSum=-5.514;NDA=3;QD=0.76;ReadPosRankSum=2.727;SB=-97.77;VQSLOD=-6.2296;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:126:99:0,378,3361 ./. 0/0:1,0:108:99:0,324,2774 0/0:1,0:127:99:0,379,2880 ./. ./. 0/0:1,0:121:99:0,361,2744 ./. 0/0:1,0: [...]
-1 69590 rs141776804 T A 1446.08 PASS AC=2;AF=0.0025;AN=812;BaseQRankSum=7.910;DB;DP=46586;DS;Dels=0.00;FS=21.176;HRun=0;HaplotypeScore=0.1456;InbreedingCoeff=-0.0051;MQ=23.73;MQ0=398;MQRankSum=8.485;NDA=2;QD=12.05;ReadPosRankSum=-0.293;SB=-322.53;VQSLOD=4.4644;culprit=MQ;set=variant GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:127:99:0,381,3388 ./. 0/0:1,0:113:99:0,339,2902 0/0:1,0:127:99:0,379,2880 ./. ./. 0/0:1,0:115:99:0,343,2608 ./. 0/0:1,0:102:99:0,305,2416 ./. ./. ./. ./. [...]
-1 69610 . C T 5334.77 TruthSensitivityTranche98.50to98.80 AC=8;AF=0.0100;AN=798;BaseQRankSum=7.126;DP=42498;DS;Dels=0.00;FS=113.646;HRun=2;HaplotypeScore=0.2518;InbreedingCoeff=0.1087;MQ=18.02;MQ0=795;MQRankSum=9.147;NDA=2;QD=10.95;ReadPosRankSum=0.353;SB=-1272.01;VQSLOD=0.5990;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:126:99:0,378,3361 ./. 0/0:1,0:71:99:0,213,1823 0/0:1,0:127:99:0,379,2880 ./. ./. 0/0:1,0:60:99:0,179,1360 ./. 0/0:1,0:79:99:0,236 [...]
-1 69635 . G C 436.15 TruthSensitivityTranche99.00to99.30 AC=2;AF=0.0025;AN=786;BaseQRankSum=4.897;DP=29728;DS;Dels=0.00;FS=33.653;HRun=0;HaplotypeScore=0.1175;InbreedingCoeff=-0.0021;MQ=14.85;MQ0=1329;MQRankSum=4.000;NDA=2;QD=3.63;ReadPosRankSum=-1.651;SB=-67.21;VQSLOD=-1.5278;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. 0/0:1,0:78:99:0,234,2081 ./. 0/0:1,0:46:99:0,138,1181 0/0:1,0:84:99:0,251,1905 ./. ./. 0/0:1,0:27:80.65:0,81,612 ./. 0/0:1,0:44:99:0,132,1 [...]
-1 69761 . A T 1569.63 TruthSensitivityTranche99.50to99.90 AC=27;AF=0.0456;AN=592;BaseQRankSum=7.371;DP=12118;DS;Dels=0.00;FS=3.078;HRun=1;HaplotypeScore=0.1168;InbreedingCoeff=0.2584;MQ=7.44;MQ0=9258;MQRankSum=1.639;NDA=1;QD=1.32;ReadPosRankSum=-0.593;SB=-284.93;VQSLOD=-6.9729;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. 0/0:60,0:60:3.01:0,3,33 ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. 0/0:59,0:59:3.01:0,3,35 ./. ./. ./. ./. ./. ./. ./. ./ [...]
-1 69768 . G A 35.11 TruthSensitivityTranche99.50to99.90 AC=1;AF=0.0018;AN=542;BaseQRankSum=-0.998;DP=10681;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1003;InbreedingCoeff=-0.0401;MQ=7.20;MQ0=8425;MQRankSum=1.077;NDA=2;QD=0.59;ReadPosRankSum=0.705;SB=6.12;VQSLOD=-5.9391;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. 0/0:56,0:58:3.01:0,3,33 ./. 0/0:60,0:60:5.98:0,6,47 ./. ./. ./. ./. ./. ./. ./. 0/0:57,0:57:2.99:0,3,24 ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. [...]
-1 69897 . T C 7903.18 TruthSensitivityTranche99.50to99.90 AC=286;AF=0.7814;AN=366;BaseQRankSum=-9.712;DP=10240;DS;Dels=0.00;FS=25.753;HRun=1;HaplotypeScore=0.0844;InbreedingCoeff=0.2102;MQ=4.12;MQ0=18120;MQRankSum=0.310;NDA=2;QD=0.92;ReadPosRankSum=-1.611;SB=-1453.42;VQSLOD=-6.8807;culprit=MQ;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. 1/1:47,13:60:6.01:61,6,0 ./. ./. ./. ./. 1/1:47,11:60:6.02:67,6,0 ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. 0/1:50,10:60:17.70:18,0 [...]
-1 69968 . A G 791.92 TruthSensitivityTranche99.30to99.50 AC=1;AF=0.017;AN=60;BaseQRankSum=-11.568;DP=1640;DS;Dels=0.00;FS=34.482;HRun=1;HaplotypeScore=1.1879;InbreedingCoeff=0.0932;MQ=5.09;MQ0=5066;MQRankSum=6.823;NDA=1;QD=2.10;ReadPosRankSum=-2.491;SB=9.08;VQSLOD=-5.0926;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. [...]
-1 861275 . C T 712.37 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-6.156;DP=66811;DS;Dels=0.00;FS=1.596;HRun=0;HaplotypeScore=0.0247;InbreedingCoeff=-0.0020;MQ=99.25;MQ0=0;MQRankSum=-0.645;NDA=2;QD=11.87;ReadPosRankSum=0.200;SB=-29.28;VQSLOD=9.3500;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:16:48.16:0,48,617 0/0:1,0:47:99:0,141,1738 0/0:1,0:24:72.24:0,72,976 0/0:1,0:23:69.23:0,69,904 0/0:1,0:26:78.25:0,78,1022 0/0:1,0:15:45.15:0,45,579 0/0:1,0:54:99:0,163,2123 0/0:1,0:39:99:0,117,1504 0 [...]
-1 861292 rs191719684 C G 2773.34 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=9.193;DB;DP=77017;DS;Dels=0.00;FS=29.431;HRun=0;HaplotypeScore=0.0441;InbreedingCoeff=-0.0075;MQ=99.59;MQ0=0;MQRankSum=-2.334;NDA=1;QD=17.78;ReadPosRankSum=-7.928;SB=-762.60;VQSLOD=7.8330;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:15:45.15:0,45,626 0/0:1,0:52:99:0,156,1965 0/0:1,0:30:90.29:0,90,1179 0/0:1,0:22:66.21:0,66,832 0/0:1,0:23:69.23:0,69,948 0/0:1,0:17:51.17:0,51,668 0/0:1,0:61:99:0,184,2353 0/0:1,0:47 [...]
-1 861315 . G A 804.13 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-3.203;DP=93850;DS;Dels=0.00;FS=2.143;HRun=2;HaplotypeScore=0.0258;InbreedingCoeff=0.0526;MQ=106.02;MQ0=0;MQRankSum=-0.749;NDA=2;QD=11.83;ReadPosRankSum=-5.734;SB=-124.66;VQSLOD=8.0060;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:23:69.23:0,69,948 0/0:1,0:71:99:0,214,2739 0/0:1,0:34:99:0,102,1402 0/0:1,0:27:81.27:0,81,1080 0/0:1,0:32:96.32:0,96,1319 0/0:1,0:22:66.22:0,66,907 0/0:1,0:69:99:0,208,2713 0/0:1,0:79:99:0,238,3160 [...]
-1 865488 . A G 73.43 PASS AC=1;AF=0.00044;AN=2280;BaseQRankSum=-4.715;DP=7112;Dels=0.00;FS=10.595;HRun=0;HaplotypeScore=0.1452;InbreedingCoeff=-0.0539;MQ=56.39;MQ0=9;MQRankSum=2.252;NDA=3;QD=4.08;ReadPosRankSum=2.565;SB=167.99;VQSLOD=1.5041;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,113 0/0:1,0:5:15.05:0,15,176 0/0:1,0:1:3.01:0,3,32 0/0:1,0:1:3.01:0,3,43 ./. 0/0:1,0:6:18.06:0,18,236 0/0:1,0:11:33.09:0,33,368 0/0:1,0:5:15.05:0,15,176 0/0:1,0:10:30.09:0,30,344 0/0:15,0:16:45. [...]
-1 865545 . G A 1164.45 PASS AC=8;AF=0.00345;AN=2320;BaseQRankSum=4.406;DP=10672;Dels=0.01;FS=1.961;HRun=0;HaplotypeScore=0.3451;InbreedingCoeff=0.0083;MQ=60.80;MQ0=0;MQRankSum=3.214;NDA=3;QD=10.21;ReadPosRankSum=1.571;SB=-334.48;VQSLOD=5.0597;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,44 0/0:1,0:7:21.06:0,21,234 0/0:1,0:2:6.02:0,6,65 ./. 0/0:1,0:2:6.02:0,6,74 0/0:1,0:5:15.05:0,15,181 0/0:1,0:9:27.07:0,27,284 0/0:10,0:10:30.07:0,30,316 0/0:20,0:20:54.10:0,54,548 0/0:1,0:22:6 [...]
-1 865555 . CAA C 306.78 PASS AC=1;AF=0.00044;AN=2284;BaseQRankSum=2.577;DP=11180;FS=1.510;HRun=2;HaplotypeScore=2.5729;InbreedingCoeff=-0.0068;MQ=59.09;MQ0=0;MQRankSum=-0.815;NDA=1;QD=12.78;ReadPosRankSum=2.203;SB=-142.21;set=variant2 GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,35 0/0:1,0:1:30.10:0,30,554 0/0:1,0:1:12.04:0,12,222 ./. 0/0:1,0:1:6.02:0,6,111 0/0:1,0:1:9.03:0,9,105 0/0:1,0:1:33.11:0,33,610 0/0:13,0:13:39.13:0,39,714 0/0:16,0:17:48.09:0,48,477 0/0:1,0:1:72.21:0,72,841 0/0:1,0:1:36.12: [...]
-1 865584 rs148711625 G A 1556.12 PASS AC=23;AF=0.00981;AN=2344;BaseQRankSum=6.903;DB;DP=13266;Dels=0.00;FS=7.807;HRun=0;HaplotypeScore=0.2911;InbreedingCoeff=0.0420;MQ=85.22;MQ0=0;MQRankSum=-2.022;NDA=2;QD=7.20;ReadPosRankSum=0.021;SB=-697.54;VQSLOD=6.6472;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,151 0/0:1,0:11:33.10:0,33,378 0/0:1,0:4:12.03:0,12,137 0/0:1,0:1:3.01:0,3,34 0/0:1,0:3:9.01:0,9,86 0/0:1,0:2:6.02:0,6,81 0/0:15,0:15:45.09:0,45,465 0/0:1,0:20:60.11:0,60,592 0/ [...]
-1 865590 . TGAA T 420.06 PASS AC=8;AF=0.00371;AN=2154;BaseQRankSum=4.148;DP=14777;FS=4.898;HRun=0;HaplotypeScore=1.3770;InbreedingCoeff=0.1502;MQ=59.07;MQ0=0;MQRankSum=-1.698;NDA=1;QD=4.88;ReadPosRankSum=1.330;SB=-207.49;set=variant2 GT:AD:DP:GQ:PL 0/0:1,0:1:12.04:0,12,234 0/0:13,0:14:38.96:0,39,714 0/0:1,0:1:18.06:0,18,351 0/0:1,0:1:6.02:0,6,117 0/0:1,0:1:6.02:0,6,117 0/0:1,0:1:12.04:0,12,234 0/0:1,0:1:48.16:0,48,935 0/0:1,0:1:66.23:0,66,1286 0/0:1,0:1:51.17:0,51,994 0/0:1,0:1:93.32:0,9 [...]
-1 865628 rs41285790 G A 712.88 PASS AC=5;AF=0.00212;AN=2364;BaseQRankSum=-6.081;DB;DP=19203;Dels=0.00;FS=8.074;HRun=0;HaplotypeScore=0.1985;InbreedingCoeff=-0.0157;MQ=80.97;MQ0=0;MQRankSum=0.054;NDA=3;QD=9.77;ReadPosRankSum=1.468;SB=-453.03;VQSLOD=7.7994;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:5:15.05:0,15,211 0/0:1,0:12:36.12:0,36,472 0/0:1,0:10:30.10:0,30,418 0/0:1,0:4:12.04:0,12,167 0/0:1,0:5:15.05:0,15,211 0/0:1,0:6:18.06:0,18,240 0/0:1,0:19:57.19:0,57,747 0/0:1,0: [...]
-1 865662 rs140751899 G A 266.89 PASS AC=1;AF=0.00042;AN=2360;BaseQRankSum=1.888;DB;DP=18955;Dels=0.00;FS=0.901;HRun=0;HaplotypeScore=0.3354;InbreedingCoeff=-0.0112;MQ=87.09;MQ0=0;MQRankSum=-0.394;NDA=2;QD=15.70;ReadPosRankSum=1.293;SB=-178.31;VQSLOD=5.8247;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:2:6.02:0,6,79 0/0:10,0:10:27.08:0,27,329 0/0:1,0:9:27.08:0,27,325 0/0:1,0:4:12.04:0,12,167 0/0:1,0:5:15.05:0,15,185 0/0:1,0:10:30.10:0,30,393 0/0:1,0:17:51.13:0,51,552 0/0:21,0:21:54.13:0,5 [...]
-1 865694 rs9988179 C T 37822.02 PASS AC=163;AF=0.06907;AN=2360;BaseQRankSum=-24.328;DB;DP=17686;Dels=0.00;FS=7.432;HRun=0;HaplotypeScore=0.3198;InbreedingCoeff=0.1408;MQ=96.52;MQ0=0;MQRankSum=-19.190;NDA=2;QD=14.08;ReadPosRankSum=12.504;SB=-16300.11;VQSLOD=4.8864;culprit=MQRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,43 0/0:10,0:10:30.09:0,30,383 0/0:1,0:9:27.09:0,27,354 0/0:1,0:2:6.02:0,6,82 0/0:1,0:5:15.05:0,15,200 0/0:1,0:10:30.10:0,30,400 0/0:15,0:15:45.14:0,45,581 0/0:21,0: [...]
-1 865700 rs116730894 C T 481.79 PASS AC=6;AF=0.00254;AN=2362;BaseQRankSum=4.072;DB;DP=18291;Dels=0.00;FS=9.754;HRun=0;HaplotypeScore=0.3041;InbreedingCoeff=-0.0084;MQ=98.45;MQ0=0;MQRankSum=-1.215;NDA=2;QD=5.35;ReadPosRankSum=4.084;SB=-203.52;VQSLOD=5.3964;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,42 0/0:1,0:11:33.09:0,33,357 0/0:1,0:9:27.09:0,27,340 0/0:1,0:2:6.01:0,6,63 0/0:1,0:6:18.05:0,18,195 0/0:1,0:9:27.08:0,27,325 0/0:1,0:16:48.10:0,48,489 0/0:19,1:20:20.99:0,21,517 [...]
-1 865703 . A G 163.63 PASS AC=1;AF=0.00042;AN=2362;BaseQRankSum=1.433;DP=18039;Dels=0.00;FS=7.294;HRun=0;HaplotypeScore=0.2834;InbreedingCoeff=-0.0062;MQ=101.88;MQ0=0;MQRankSum=-2.745;NDA=2;QD=7.44;ReadPosRankSum=1.383;SB=-11.29;VQSLOD=6.5947;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,44 0/0:1,0:10:30.09:0,30,361 0/0:1,0:7:21.07:0,21,270 0/0:1,0:3:9.03:0,9,118 0/0:1,0:5:15.05:0,15,189 0/0:1,0:8:24.08:0,24,315 0/0:1,0:16:48.14:0,48,550 0/0:20,0:20:57.16:0,57,659 0/0:1,0:21:6 [...]
-1 865705 rs146331776 C T 702.79 PASS AC=3;AF=0.00127;AN=2362;BaseQRankSum=-1.590;DB;DP=18114;Dels=0.00;FS=1.450;HRun=1;HaplotypeScore=0.1918;InbreedingCoeff=-0.0069;MQ=114.11;MQ0=0;MQRankSum=-2.223;NDA=1;QD=12.12;ReadPosRankSum=2.604;SB=-274.99;VQSLOD=10.4126;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,44 0/0:1,0:9:27.09:0,27,354 0/0:1,0:8:24.07:0,24,289 0/0:1,0:3:9.03:0,9,130 0/0:1,0:5:15.05:0,15,193 0/0:1,0:7:21.07:0,21,280 0/0:1,0:16:48.16:0,48,640 0/0:20,0:20:60.20:0,60, [...]
-1 865734 . G A 169.67 PASS AC=3;AF=0.00127;AN=2358;BaseQRankSum=0.374;DP=14856;Dels=0.00;FS=7.082;HRun=0;HaplotypeScore=0.4461;InbreedingCoeff=-0.0084;MQ=111.38;MQ0=0;MQRankSum=-3.095;NDA=2;QD=4.35;ReadPosRankSum=0.739;SB=-81.83;VQSLOD=2.8904;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,116 0/0:1,0:6:18.06:0,18,222 0/0:1,0:6:18.06:0,18,236 0/0:1,0:2:6.02:0,6,76 0/0:4,0:4:12.04:0,12,161 0/0:1,0:8:24.08:0,24,315 0/0:1,0:12:36.11:0,36,423 0/0:1,0:17:51.15:0,51,599 0/0:1,0:14:42. [...]
-1 865738 rs139570490 A G 759.55 PASS AC=7;AF=0.00297;AN=2358;BaseQRankSum=-6.135;DB;DP=14584;Dels=0.00;FS=1.427;HRun=2;HaplotypeScore=0.5151;InbreedingCoeff=-0.0114;MQ=107.81;MQ0=0;MQRankSum=-1.690;NDA=2;QD=5.17;ReadPosRankSum=1.621;SB=-116.80;VQSLOD=4.7433;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:2:6.02:0,6,86 0/0:1,0:5:15.05:0,15,197 0/0:1,0:8:24.08:0,24,309 0/0:1,0:2:6.02:0,6,80 0/0:4,0:4:12.03:0,12,159 0/0:1,0:8:24.08:0,24,330 0/0:1,0:13:39.12:0,39,470 0/0:1,0:16:48.15:0,48,605 [...]
-1 866371 . G A 754.09 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-4.668;DP=56995;DS;Dels=0.00;FS=1.962;HRun=0;HaplotypeScore=0.0603;InbreedingCoeff=0.0004;MQ=107.06;MQ0=0;MQRankSum=0.276;NDA=1;QD=12.57;ReadPosRankSum=1.709;SB=-179.27;VQSLOD=9.8408;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:16:48.16:0,48,640 0/0:1,0:58:99:0,175,2145 0/0:1,0:34:99:0,102,1337 0/0:1,0:22:66.22:0,66,894 0/0:1,0:22:66.22:0,66,907 0/0:1,0:19:57.18:0,57,733 0/0:1,0:35:99:0,105,1350 0/0:1,0:35:99:0,105,1350 0/0 [...]
-1 866422 rs139210662 C T 4684.05 PASS AC=9;AF=0.00381;AN=2364;BaseQRankSum=-2.726;DB;DP=71761;DS;Dels=0.00;FS=14.683;HRun=1;HaplotypeScore=0.0292;InbreedingCoeff=-0.0036;MQ=110.95;MQ0=0;MQRankSum=0.583;NDA=1;QD=11.05;ReadPosRankSum=-12.658;SB=-1793.78;VQSLOD=9.8690;culprit=HaplotypeScore;set=variant GT:AD:DP:GQ:PL 0/0:1,0:23:69.23:0,69,960 0/0:1,0:72:99:0,217,2662 0/0:1,0:41:99:0,123,1666 0/0:1,0:30:90.29:0,90,1179 0/0:1,0:29:87.29:0,87,1211 0/0:1,0:32:96.32:0,96,1301 0/0:1,0:42:99:0,126 [...]
-1 866511 . C T 17440.60 TruthSensitivityTranche99.50to99.90 AC=345;AF=0.14594;AN=2364;BaseQRankSum=-48.478;DP=36139;DS;Dels=0.00;FS=176.546;HRun=1;HaplotypeScore=8.8600;InbreedingCoeff=-0.1516;MQ=61.44;MQ0=0;MQRankSum=45.670;NDA=1;QD=1.68;ReadPosRankSum=-3.663;SB=-4951.45;VQSLOD=-8.9666;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/1:8,1:9:2.54:3,0,297 0/0:13,1:14:5.68:0,6,398 0/1:16,3:19:24.70:25,0,488 0/0:14,0:14:42.12:0,42,537 0/1:8,2:10:12.74:13,0,265 0/1:7,1:8:12.90:13,0,258 0/1:31, [...]
-1 866517 rs181051588 C G 1192.57 TruthSensitivityTranche99.50to99.90 AC=2;AF=0.00085;AN=2364;BaseQRankSum=0.101;DB;DP=34481;DS;Dels=0.00;FS=14.537;HRun=0;HaplotypeScore=7.9209;InbreedingCoeff=-0.0076;MQ=61.58;MQ0=0;MQRankSum=3.405;NDA=3;QD=17.28;ReadPosRankSum=1.770;SB=-56.16;VQSLOD=-7.8406;culprit=HaplotypeScore;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:7,0:7:21.07:0,21,272 0/0:16,0:16:45.11:0,45,510 0/0:16,0:16:45.14:0,45,594 0/0:11,0:11:33.08:0,33,407 0/0:7,0:7:18.04:0,18,232 0/0:8,0:8:18. [...]
-1 871129 . C T 2363.53 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=1.324;DP=88230;DS;Dels=0.00;FS=133.740;HRun=4;HaplotypeScore=0.1585;InbreedingCoeff=-0.0070;MQ=121.02;MQ0=0;MQRankSum=-4.492;NDA=2;QD=10.55;ReadPosRankSum=-5.079;SB=-1103.64;VQSLOD=4.1810;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:29:87.29:0,87,1196 0/0:1,0:101:99:0,304,3735 0/0:1,0:65:99:0,196,2404 0/0:1,0:48:99:0,144,1852 0/0:1,0:57:99:0,172,2199 0/0:1,0:42:99:0,126,1620 0/0:1,0:42:99:0,126,1587 0/0:1,0:33:99:0,99,1192 [...]
-1 871171 . A G 688.12 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-4.336;DP=86111;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0614;InbreedingCoeff=-0.0005;MQ=140.67;MQ0=0;MQRankSum=-4.594;NDA=1;QD=11.86;ReadPosRankSum=-2.707;SB=-280.00;VQSLOD=10.0930;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:34:99:0,102,1312 0/0:1,0:84:99:0,253,2886 0/0:1,0:68:99:0,205,2457 0/0:1,0:34:99:0,102,1285 0/0:1,0:56:99:0,169,2160 0/0:1,0:44:99:0,132,1590 0/0:1,0:53:99:0,159,1722 0/0:1,0:42:99:0,126,1443 0/0 [...]
-1 871173 rs141982349 C T 380.08 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=1.317;DB;DP=94636;DS;Dels=0.00;FS=14.305;HRun=0;HaplotypeScore=0.0522;InbreedingCoeff=-0.0006;MQ=140.91;MQ0=0;MQRankSum=-3.379;NDA=1;QD=8.09;ReadPosRankSum=-0.692;SB=-152.07;VQSLOD=8.2214;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:37:99:0,111,1545 0/0:1,0:101:99:0,304,3735 0/0:1,0:76:99:0,229,2932 0/0:1,0:34:99:0,102,1382 0/0:1,0:63:99:0,190,2598 0/0:1,0:51:99:0,154,2040 0/0:1,0:60:99:0,181,2168 0/0:1,0:46:99:0, [...]
-1 871176 . C T 806.96 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-2.225;DP=94503;DS;Dels=0.00;FS=48.943;HRun=1;HaplotypeScore=0.0532;InbreedingCoeff=0.0054;MQ=138.21;MQ0=0;MQRankSum=-3.509;NDA=1;QD=13.45;ReadPosRankSum=-1.802;SB=-219.67;VQSLOD=7.9297;culprit=MQ;set=variant GT:AD:DP:GQ:PL 0/0:1,0:36:99:0,108,1503 0/0:1,0:98:99:0,295,3781 0/0:1,0:76:99:0,229,2988 0/0:1,0:35:99:0,105,1423 0/0:1,0:60:99:0,181,2474 0/0:1,0:52:99:0,157,2114 0/0:1,0:58:99:0,175,2237 0/0:1,0:46:99:0,138,1739 0/0: [...]
-1 871193 . G C 517.25 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=6.508;DP=88429;Dels=0.00;FS=19.613;HRun=2;HaplotypeScore=0.0196;InbreedingCoeff=-0.0023;MQ=115.20;MQ0=0;MQRankSum=0.185;NDA=2;QD=12.93;ReadPosRankSum=-4.480;SB=-44.96;VQSLOD=9.6679;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:31:93.30:0,93,1196 0/0:1,0:76:99:0,229,2611 0/0:1,0:59:99:0,178,2230 0/0:1,0:28:84.27:0,84,1080 0/0:1,0:50:99:0,150,1890 0/0:1,0:48:99:0,144,1814 0/0:1,0:76:99:0,229,2470 0/0:1,0:53:99:0,159,1722 0/0:1 [...]
-1 871215 rs28419423 C T,G 147999.05 PASS AC=1,167;AF=0.00042,0.07064;AN=2364;BaseQRankSum=31.541;DB;DP=81904;DS;Dels=0.00;FS=22.522;HaplotypeScore=0.2500;InbreedingCoeff=0.1555;MQ=77.03;MQ0=0;MQRankSum=-0.797;NDA=2;QD=17.13;ReadPosRankSum=-12.413;SB=-59334.05;VQSLOD=6.2098;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0,0:29:87.27:0,87,1072,87,1072,1072 0/0:1,0,0:68:99:0,205,2274,205,2274,2274 0/0:1,0,0:54:99:0,162,1904,162,1904,1904 0/0:1,0,0:25:75.23:0,75,903,75,903,903 0/0:1,0,0:43:99:0 [...]
-1 871219 . C T 658.03 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-8.262;DP=79865;DS;Dels=0.00;FS=5.928;HRun=0;HaplotypeScore=0.2739;InbreedingCoeff=0.0029;MQ=79.21;MQ0=0;MQRankSum=0.013;NDA=2;QD=12.19;ReadPosRankSum=3.190;SB=-201.44;VQSLOD=6.5830;culprit=ReadPosRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:25:75.25:0,75,1044 0/0:1,0:62:99:0,187,2392 0/0:1,0:57:99:0,172,2317 0/0:1,0:31:93.31:0,93,1240 0/0:1,0:45:99:0,135,1829 0/0:1,0:35:99:0,105,1423 0/0:1,0:74:99:0,223,2855 0/0:1,0:50:99:0,1 [...]
-1 871229 rs149944086 G C 2312.78 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=7.026;DB;DP=74122;DS;Dels=0.00;FS=13.320;HRun=2;HaplotypeScore=0.0998;InbreedingCoeff=0.0017;MQ=121.47;MQ0=0;MQRankSum=-1.538;NDA=1;QD=16.17;ReadPosRankSum=-5.261;SB=-80.66;VQSLOD=9.8454;culprit=ReadPosRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:19:57.19:0,57,817 0/0:1,0:52:99:0,156,1965 0/0:1,0:54:99:0,163,2083 0/0:1,0:27:81.26:0,81,1020 0/0:1,0:40:99:0,120,1573 0/0:1,0:37:99:0,111,1398 0/0:1,0:69:99:0,208,2493 0/ [...]
-1 871239 rs147616064 C T 1622.57 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=-1.538;DB;DP=64080;DS;Dels=0.00;FS=8.450;HRun=2;HaplotypeScore=0.0688;InbreedingCoeff=-0.0023;MQ=123.57;MQ0=0;MQRankSum=-3.198;NDA=1;QD=12.20;ReadPosRankSum=-6.659;SB=-61.38;VQSLOD=10.3368;culprit=ReadPosRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:17:51.17:0,51,741 0/0:1,0:49:99:0,147,1852 0/0:1,0:44:99:0,132,1814 0/0:1,0:28:84.27:0,84,1101 0/0:1,0:41:99:0,123,1690 0/0:1,0:34:99:0,102,1402 0/0:1,0:60:99:0,181,2268 [...]
-1 871269 . A C 891.84 TruthSensitivityTranche98.90to99.00 AC=125;AF=0.05288;AN=2364;BaseQRankSum=-18.250;DP=18591;DS;Dels=0.00;FS=167.133;HRun=3;HaplotypeScore=0.5054;InbreedingCoeff=-0.0534;MQ=78.80;MQ0=1;MQRankSum=-7.666;NDA=2;QD=0.38;ReadPosRankSum=-8.894;SB=259.41;VQSLOD=-0.6803;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:4:12.03:0,12,134 0/1:12,6:19:0.08:0,0,313 0/0:1,0:20:60.15:0,60,631 0/0:1,0:12:36.09:0,36,379 0/0:1,0:14:42.11:0,42,455 0/0:1,0:20:60.16:0,60,650 0/0:1,0:14 [...]
-1 874402 . C G 370.61 PASS AC=2;AF=0.00085;AN=2360;BaseQRankSum=1.038;DP=17471;Dels=0.00;FS=7.836;HRun=0;HaplotypeScore=0.2022;InbreedingCoeff=-0.0141;MQ=90.39;MQ0=0;MQRankSum=-1.296;NDA=2;QD=13.24;ReadPosRankSum=1.474;SB=-203.51;VQSLOD=7.7578;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,129 0/0:1,0:5:15.05:0,15,189 0/0:1,0:5:15.05:0,15,189 0/0:1,0:3:9.03:0,9,120 0/0:1,0:4:12.04:0,12,165 0/0:1,0:4:12.04:0,12,165 0/0:24,0:24:63.20:0,63,834 0/0:1,0:26:78.25:0,78,96 [...]
-1 874455 . C T 174.37 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-1.679;DP=25006;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1837;InbreedingCoeff=0.1880;MQ=80.95;MQ0=0;MQRankSum=0.149;NDA=2;QD=7.93;ReadPosRankSum=0.492;SB=-20.23;VQSLOD=2.7845;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,169 0/0:1,0:12:36.11:0,36,423 0/0:1,0:6:18.06:0,18,236 0/0:1,0:3:9.03:0,9,124 0/0:1,0:4:12.04:0,12,154 0/0:1,0:9:27.07:0,27,292 0/0:1,0:27:81.20:0,81,852 0/0:1,0:27:81.18:0,81,826 0/0:1,0:26:7 [...]
-1 874456 rs149677938 G A 109.49 PASS AC=5;AF=0.00212;AN=2364;BaseQRankSum=-2.689;DB;DP=23505;Dels=0.00;FS=7.650;HRun=0;HaplotypeScore=0.1763;InbreedingCoeff=-0.0082;MQ=81.74;MQ0=0;MQRankSum=0.806;NDA=2;QD=2.81;ReadPosRankSum=-0.807;SB=-63.07;VQSLOD=3.1368;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,148 0/0:1,0:9:27.09:0,27,340 0/0:1,0:6:18.05:0,18,201 0/0:1,0:3:9.03:0,9,108 0/0:1,0:4:12.03:0,12,126 0/0:1,0:8:24.07:0,24,267 0/0:1,0:22:66.21:0,66,814 0/0:1,0:27:81.26:0,81,10 [...]
-1 874497 . G A 382.09 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-0.925;DP=20918;Dels=0.00;FS=1.007;HRun=2;HaplotypeScore=0.1533;InbreedingCoeff=0.0337;MQ=84.31;MQ0=0;MQRankSum=0.187;NDA=1;QD=10.61;ReadPosRankSum=0.632;SB=-103.25;VQSLOD=6.2214;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:7:21.07:0,21,265 0/0:11,0:11:30.09:0,30,374 0/0:1,0:6:18.06:0,18,236 0/0:1,0:6:18.06:0,18,217 0/0:1,0:5:15.04:0,15,167 0/0:10,0:10:30.08:0,30,366 0/0:1,0:12:36.11:0,36,434 0/0:1,0:29:87.27:0,87,1048 0/0: [...]
-1 874528 rs72902595 C T 306.67 PASS AC=3;AF=0.00128;AN=2350;BaseQRankSum=3.514;DB;DP=14636;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.1887;InbreedingCoeff=0.0081;MQ=90.63;MQ0=0;MQRankSum=2.214;NDA=3;QD=6.81;ReadPosRankSum=0.056;SB=13.52;VQSLOD=6.5618;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,340 0/0:1,0:7:21.06:0,21,227 0/0:1,0:4:12.04:0,12,141 0/0:1,0:7:21.07:0,21,259 0/0:1,0:5:15.05:0,15,197 0/0:1,0:8:24.08:0,24,302 0/0:1,0:12:36.10:0,36,401 0/0:1,0:15:45.13:0,45,515 0 [...]
-1 874550 . G C 934.68 PASS AC=2;AF=0.00085;AN=2346;BaseQRankSum=-5.107;DP=12802;Dels=0.00;FS=1.439;HRun=0;HaplotypeScore=0.3224;InbreedingCoeff=0.0260;MQ=92.33;MQ0=0;MQRankSum=-2.528;NDA=2;QD=13.55;ReadPosRankSum=1.865;SB=-312.37;VQSLOD=6.0299;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:8:24.08:0,24,330 0/0:1,0:6:18.06:0,18,222 0/0:1,0:6:18.06:0,18,227 0/0:1,0:9:27.09:0,27,366 0/0:1,0:4:12.04:0,12,157 0/0:1,0:9:27.09:0,27,366 0/0:1,0:9:27.09:0,27,347 0/0:1,0:12:36.11:0,36,444 0/0:1,0:1 [...]
-1 874553 . G T 129.66 PASS AC=2;AF=0.00085;AN=2354;BaseQRankSum=-4.133;DP=12404;Dels=0.00;FS=1.033;HRun=0;HaplotypeScore=0.2865;InbreedingCoeff=-0.0172;MQ=93.26;MQ0=0;MQRankSum=-2.976;NDA=2;QD=4.80;ReadPosRankSum=0.626;SB=-59.70;VQSLOD=5.4149;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,366 0/0:1,0:4:12.04:0,12,151 0/0:1,0:4:12.04:0,12,151 0/0:1,0:9:27.09:0,27,366 0/0:1,0:5:15.05:0,15,197 0/0:1,0:11:33.11:0,33,432 0/0:1,0:11:33.10:0,33,397 0/0:1,0:11:33.10:0,33,397 0/0:1,0: [...]
-1 874657 . G A 70.31 PASS AC=4;AF=0.00169;AN=2362;BaseQRankSum=-0.218;DP=15640;Dels=0.00;FS=14.687;HRun=0;HaplotypeScore=0.2464;InbreedingCoeff=-0.0179;MQ=67.20;MQ0=0;MQRankSum=1.359;NDA=2;QD=3.06;ReadPosRankSum=0.088;SB=-35.40;VQSLOD=1.7943;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,169 0/0:1,0:7:21.07:0,21,265 0/0:1,0:5:15.05:0,15,193 0/0:1,0:11:33.11:0,33,416 0/0:1,0:8:24.08:0,24,302 0/0:1,0:15:45.15:0,45,579 0/0:17,0:17:45.14:0,45,580 0/0:11,0:11:33.09:0,33,410 0/0:16 [...]
-1 874665 rs74047413 G A 5723.97 PASS AC=34;AF=0.01438;AN=2364;BaseQRankSum=-11.637;DB;DP=16240;Dels=0.00;FS=4.664;HRun=0;HaplotypeScore=0.2594;InbreedingCoeff=0.0425;MQ=63.94;MQ0=0;MQRankSum=5.366;NDA=3;QD=13.34;ReadPosRankSum=4.040;SB=-1184.77;VQSLOD=6.6070;culprit=MQRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:7:21.07:0,21,275 0/0:1,0:10:30.09:0,30,370 0/0:1,0:5:15.05:0,15,200 0/0:1,0:9:27.09:0,27,354 0/0:1,0:9:27.09:0,27,376 0/0:1,0:10:30.10:0,30,400 0/0:18,0:18:54.17:0,54,684 0/0:1,0:1 [...]
-1 874671 rs148995812 G T 143.17 TruthSensitivityTranche98.50to98.80 AC=6;AF=0.00254;AN=2364;BaseQRankSum=3.015;DB;DP=17331;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.2863;InbreedingCoeff=0.0404;MQ=62.93;MQ0=0;MQRankSum=2.341;NDA=2;QD=2.98;ReadPosRankSum=1.335;SB=-77.93;VQSLOD=0.5677;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:7:21.06:0,21,253 0/0:1,0:11:33.10:0,33,378 0/0:1,0:4:12.03:0,12,137 0/0:1,0:10:30.09:0,30,344 0/0:1,0:11:33.10:0,33,407 0/0:1,0:9:27.07:0,27,301 0/0:21,0:21 [...]
-1 874697 . C G 101.09 PASS AC=1;AF=0.00042;AN=2362;BaseQRankSum=-3.035;DP=22197;Dels=0.00;FS=1.736;HRun=2;HaplotypeScore=0.2393;InbreedingCoeff=-0.0038;MQ=69.05;MQ0=0;MQRankSum=1.459;NDA=3;QD=7.78;ReadPosRankSum=-0.481;SB=9.66;VQSLOD=6.3479;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:11:33.11:0,33,440 0/0:1,0:15:45.14:0,45,542 0/0:1,0:5:15.05:0,15,203 0/0:1,0:12:36.12:0,36,463 0/0:11,0:12:33.09:0,33,421 0/0:1,0:14:42.14:0,42,560 0/0:1,0:17:51.13:0,51,552 0/0:1,0:13:39.11:0,39,435 0/0:1 [...]
-1 874706 . A G 221.68 PASS AC=1;AF=0.00042;AN=2362;BaseQRankSum=-3.691;DP=23040;Dels=0.00;FS=1.035;HRun=0;HaplotypeScore=0.2004;InbreedingCoeff=-0.0039;MQ=72.95;MQ0=0;MQRankSum=2.395;NDA=3;QD=7.39;ReadPosRankSum=0.700;SB=-109.35;VQSLOD=6.6840;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,371 0/0:1,0:18:54.16:0,54,618 0/0:1,0:7:21.07:0,21,285 0/0:12,0:12:30.10:0,30,407 0/0:12,0:12:36.11:0,36,474 0/0:1,0:13:39.13:0,39,528 0/0:1,0:19:57.17:0,57,653 0/0:15,0:15:45.12:0,45,501 0/ [...]
-1 874714 . C T 172.67 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=0.061;DP=25875;Dels=0.00;FS=16.702;HRun=0;HaplotypeScore=0.1731;InbreedingCoeff=0.0793;MQ=74.76;MQ0=0;MQRankSum=1.555;NDA=2;QD=4.43;ReadPosRankSum=0.171;SB=-21.70;VQSLOD=1.9941;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,371 0/0:1,0:18:54.17:0,54,650 0/0:1,0:8:24.08:0,24,325 0/0:12,0:12:27.09:0,27,381 0/0:1,0:11:33.11:0,33,447 0/0:1,0:19:57.19:0,57,760 0/0:1,0:25:75.20:0,75,812 0/0:17,0:17:51.13:0,51,574 0/0:1 [...]
-1 874731 . G A 145.27 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=0.058;DP=24162;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.1869;InbreedingCoeff=-0.0043;MQ=75.55;MQ0=0;MQRankSum=2.984;NDA=2;QD=10.38;ReadPosRankSum=-0.451;SB=-101.06;VQSLOD=7.0812;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,380 0/0:1,0:12:36.12:0,36,472 0/0:1,0:8:24.08:0,24,320 0/0:1,0:12:36.12:0,36,472 0/0:1,0:10:30.10:0,30,393 0/0:1,0:21:63.21:0,63,840 0/0:1,0:20:60.19:0,60,772 0/0:1,0:14:42.13:0,42,529 0/0: [...]
-1 874734 rs145967298 C T 2081.74 PASS AC=8;AF=0.00338;AN=2364;BaseQRankSum=-1.345;DB;DP=23140;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.2038;InbreedingCoeff=-0.0083;MQ=76.87;MQ0=0;MQRankSum=5.345;NDA=2;QD=9.51;ReadPosRankSum=4.296;SB=-1122.28;VQSLOD=7.9095;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,354 0/0:1,0:10:30.09:0,30,353 0/0:1,0:7:21.07:0,21,265 0/0:1,0:11:33.11:0,33,432 0/0:1,0:8:24.07:0,24,282 0/0:1,0:18:54.17:0,54,650 0/0:1,0:17:51.13:0,51,552 0/0:1,0:10:30.07: [...]
-1 874762 rs139437968 C T 651.40 PASS AC=8;AF=0.00338;AN=2364;BaseQRankSum=-0.183;DB;DP=25970;Dels=0.00;FS=2.823;HRun=0;HaplotypeScore=0.2432;InbreedingCoeff=-0.0132;MQ=87.02;MQ0=0;MQRankSum=1.762;NDA=3;QD=5.62;ReadPosRankSum=0.858;SB=-307.51;VQSLOD=6.1742;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:12:36.12:0,36,501 0/0:1,0:12:36.11:0,36,444 0/0:1,0:15:45.15:0,45,579 0/0:1,0:19:57.19:0,57,772 0/0:1,0:11:33.11:0,33,424 0/0:1,0:25:75.24:0,75,964 0/0:1,0:18:54.16:0,54,635 0/0:1,0:13:39.11 [...]
-1 874779 rs141207077 C T 277.66 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=-2.449;DB;DP=26201;DS;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.5481;InbreedingCoeff=0.0139;MQ=74.98;MQ0=2;MQRankSum=-2.236;NDA=2;QD=7.93;ReadPosRankSum=0.678;SB=-141.68;VQSLOD=5.2534;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:13:39.13:0,39,528 0/0:1,0:12:36.11:0,36,444 0/0:1,0:21:63.21:0,63,840 0/0:1,0:23:69.23:0,69,920 0/0:1,0:15:45.15:0,45,618 0/0:1,0:28:84.28:0,84,1120 0/0:1,0:17:51.16:0,51,629 0/0:1,0:10:3 [...]
-1 874809 . G C 241.96 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=-4.215;DP=29065;DS;Dels=0.00;FS=2.562;HRun=1;HaplotypeScore=0.7328;InbreedingCoeff=-0.0131;MQ=59.07;MQ0=7;MQRankSum=1.382;NDA=3;QD=8.07;ReadPosRankSum=-1.689;SB=-71.04;VQSLOD=4.3569;culprit=HaplotypeScore;set=variant GT:AD:DP:GQ:PL 0/0:1,0:18:54.18:0,54,732 0/0:1,0:16:48.16:0,48,629 0/0:1,0:29:87.29:0,87,1160 0/0:1,0:27:81.27:0,81,1113 0/0:1,0:21:63.21:0,63,866 0/0:1,0:27:81.27:0,81,1097 0/0:1,0:14:42.13:0,42,518 0/0:1,0:8:2 [...]
-1 874816 . C CT 13059.48 PASS AC=80;AF=0.03393;AN=2358;BaseQRankSum=-0.835;DP=28085;FS=73.108;GS;HRun=1;HaplotypeScore=4.8051;InbreedingCoeff=0.0220;MQ=55.70;MQ0=12;MQRankSum=3.256;NDA=1;QD=8.23;ReadPosRankSum=17.642;SB=-5804.39;set=variant2 GT:AD:DP:GQ:PL 0/0:1,0:1:57.19:0,57,845 0/0:1,0:1:57.19:0,57,845 0/0:1,0:1:87.29:0,87,1289 0/0:1,0:1:78.26:0,78,1156 0/0:1,0:1:66.22:0,66,978 0/0:1,0:1:87.29:0,87,1289 0/0:1,0:1:42.14:0,42,622 0/0:1,0:1:18.06:0,18,267 0/0:1,0:1:30.08:0,30,336 0/0:1,0 [...]
-1 874826 . A C 73.70 TruthSensitivityTranche99.00to99.30 AC=42;AF=0.01780;AN=2360;BaseQRankSum=-24.430;DP=21024;DS;Dels=0.00;FS=339.345;HRun=2;HaplotypeScore=0.9175;InbreedingCoeff=-0.0037;MQ=55.96;MQ0=9;MQRankSum=-2.079;NDA=2;QD=0.11;ReadPosRankSum=-6.577;SB=-243.62;VQSLOD=-1.9473;culprit=HaplotypeScore;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:21:63.20:0,63,810 0/0:1,0:16:48.13:0,48,535 0/0:1,0:26:78.25:0,78,983 0/0:1,0:20:60.20:0,60,800 0/0:1,0:21:63.21:0,63,854 0/0:1,0:31:93.30:0,93,1 [...]
-1 874829 . T C 182.51 TruthSensitivityTranche99.30to99.50 AC=71;AF=0.03003;AN=2364;BaseQRankSum=-21.015;DP=23962;DS;Dels=0.00;FS=486.019;HRun=4;HaplotypeScore=0.8899;InbreedingCoeff=-0.0423;MQ=55.61;MQ0=12;MQRankSum=4.332;NDA=1;QD=0.24;ReadPosRankSum=-19.215;SB=-390.43;VQSLOD=-3.1119;culprit=HaplotypeScore;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:21:63.21:0,63,826 0/0:1,0:14:42.13:0,42,518 0/0:1,0:27:81.26:0,81,1061 0/0:1,0:22:66.22:0,66,894 0/0:1,0:23:69.23:0,69,904 0/0:1,0:32:96.31:0,9 [...]
-1 874840 . G A 76.39 TruthSensitivityTranche99.30to99.50 AC=4;AF=0.00169;AN=2364;BaseQRankSum=0.194;DP=25677;DS;Dels=0.00;FS=36.775;HRun=0;HaplotypeScore=0.4616;InbreedingCoeff=0.0506;MQ=54.52;MQ0=17;MQRankSum=1.004;NDA=3;QD=1.41;ReadPosRankSum=-4.415;SB=-198.08;VQSLOD=-4.2627;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:16:48.15:0,48,605 0/0:20,0:20:54.15:0,54,656 0/0:1,0:27:81.25:0,81,998 0/0:1,0:22:66.20:0,66,795 0/0:1,0:22:66.21:0,66,832 0/0:1,0:29:87.28:0,87,1119 0/0:1,0:12:3 [...]
-1 874864 rs141512630 CT C 14962.48 PASS AC=120;AF=0.05376;AN=2232;BaseQRankSum=7.876;DB;DP=19575;DS;FS=29.806;HRun=1;HaplotypeScore=3.1953;InbreedingCoeff=-0.0547;MQ=55.23;MQ0=13;MQRankSum=3.370;NDA=1;QD=5.75;ReadPosRankSum=8.496;SB=-5595.81;set=variant2 GT:AD:DP:GQ:PL 0/0:1,0:1:42.14:0,42,636 0/0:1,0:1:27.09:0,27,409 0/0:1,0:1:54.18:0,54,818 0/0:1,0:1:48.16:0,48,727 0/0:1,0:1:48.16:0,48,727 0/0:1,0:1:75.25:0,75,1136 0/0:1,0:1:27.04:0,27,260 0/0:1,0:1:24.05:0,24,239 0/0:1,0:1:27.06:0,27, [...]
-1 874875 . A C 125.15 TruthSensitivityTranche99.00to99.30 AC=62;AF=0.02654;AN=2336;BaseQRankSum=-25.364;DP=13447;DS;Dels=0.00;FS=290.321;HRun=2;HaplotypeScore=0.9392;InbreedingCoeff=-0.0357;MQ=62.88;MQ0=9;MQRankSum=-2.359;NDA=3;QD=0.20;ReadPosRankSum=-3.012;SB=-138.79;VQSLOD=-1.6402;culprit=HaplotypeScore;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:13:39.12:0,39,470 0/0:1,0:3:9.03:0,9,111 0/0:1,0:14:42.13:0,42,494 0/0:1,0:13:39.12:0,39,470 0/0:1,0:12:36.12:0,36,472 0/0:1,0:18:54.17:0,54,694 [...]
-1 874878 . T C 2347.07 TruthSensitivityTranche99.50to99.90 AC=177;AF=0.07526;AN=2352;BaseQRankSum=-27.911;DP=15608;DS;Dels=0.00;FS=812.634;HRun=4;HaplotypeScore=0.4553;InbreedingCoeff=-0.0682;MQ=62.83;MQ0=10;MQRankSum=-1.551;NDA=3;QD=1.03;ReadPosRankSum=-24.080;SB=275.16;VQSLOD=-5.8489;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:14:42.13:0,42,506 0/0:1,0:2:6.02:0,6,76 0/0:1,0:15:45.14:0,45,567 0/0:1,0:12:36.11:0,36,454 0/0:1,0:15:45.14:0,45,567 0/0:1,0:19:57.18:0,57,718 0/1:8,1:9 [...]
-1 874880 . C T 106.84 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=-1.422;DP=21057;DS;Dels=0.00;FS=3.970;HRun=0;HaplotypeScore=0.4635;InbreedingCoeff=-0.0128;MQ=62.21;MQ0=9;MQRankSum=0.305;NDA=2;QD=3.96;ReadPosRankSum=1.493;SB=-59.85;VQSLOD=2.2323;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:15:45.15:0,45,610 0/0:1,0:9:27.09:0,27,347 0/0:1,0:18:54.18:0,54,720 0/0:1,0:15:45.15:0,45,626 0/0:1,0:19:57.19:0,57,802 0/0:1,0:23:69.23:0,69,960 0/0:11,0:11:33.10:0,33,407 0/0:12,0:12:36.12:0,36,467 [...]
-1 876484 rs118109273 C T 4116.34 PASS AC=42;AF=0.01825;AN=2302;BaseQRankSum=-4.436;DB;DP=8391;Dels=0.00;FS=33.016;HRun=0;HaplotypeScore=0.2452;InbreedingCoeff=0.0391;MQ=62.83;MQ0=0;MQRankSum=7.010;NDA=2;QD=13.50;ReadPosRankSum=2.029;SB=-1128.61;VQSLOD=5.1912;culprit=MQRankSum;set=variant GT:AD:DP:GQ:PL ./. 0/0:1,0:3:9.02:0,9,92 0/0:1,0:3:9.02:0,9,100 0/0:1,0:5:15.05:0,15,197 0/0:1,0:5:15.05:0,15,200 0/0:1,0:3:9.03:0,9,120 0/0:1,0:4:12.04:0,12,154 0/0:11,0:11:27.08:0,27,323 0/0:4,0:4:12.0 [...]
-1 876499 rs4372192 A G 305633.12 PASS AC=2123;AF=0.91667;AN=2316;BaseQRankSum=22.009;DB;DP=9687;Dels=0.01;FS=13.883;HRun=6;HaplotypeScore=0.3271;InbreedingCoeff=0.0020;MQ=62.35;MQ0=0;MQRankSum=-2.556;NDA=3;QD=31.33;ReadPosRankSum=-0.328;SB=-23736.25;VQSLOD=4.8712;culprit=MQ;set=variant GT:AD:DP:GQ:PL 1/1:0,1:1:3.01:38,3,0 1/1:0,1:6:18.06:227,18,0 1/1:0,1:3:9.03:116,9,0 1/1:0,1:5:15.05:189,15,0 1/1:0,1:4:12.04:171,12,0 1/1:0,1:2:6.02:81,6,0 1/1:0,1:7:21.07:270,21,0 1/1:0,12:12:36.08:436,3 [...]
-1 876659 . C T 66.95 PASS AC=1;AF=0.00043;AN=2322;BaseQRankSum=-0.742;DP=8862;Dels=0.00;FS=9.438;HRun=0;HaplotypeScore=0.1758;InbreedingCoeff=-0.0314;MQ=60.48;MQ0=0;MQRankSum=2.146;NDA=2;QD=9.56;ReadPosRankSum=-0.520;SB=7.07;VQSLOD=5.9783;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,41 0/0:8,0:8:18.03:0,18,209 0/0:1,0:2:6.02:0,6,84 0/0:6,0:6:18.06:0,18,237 0/0:1,0:3:9.03:0,9,118 0/0:1,0:2:6.02:0,6,84 0/0:8,0:8:24.08:0,24,307 0/0:1,0:4:12.04:0,12,145 0/0:1,0:5:15. [...]
-1 876698 . G C 162.37 TruthSensitivityTranche99.00to99.30 AC=54;AF=0.02432;AN=2220;BaseQRankSum=-14.750;DP=5641;Dels=0.00;FS=79.866;HRun=1;HaplotypeScore=0.2141;InbreedingCoeff=-0.0605;MQ=65.04;MQ0=0;MQRankSum=0.487;NDA=3;QD=0.51;ReadPosRankSum=-10.460;SB=485.51;VQSLOD=-1.5866;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,41 0/0:1,0:2:6.02:0,6,79 ./. 0/0:1,0:3:9.03:0,9,124 0/0:1,0:1:3.01:0,3,42 0/0:1,0:1:3.01:0,3,32 0/0:6,0:6:15.03:0,15,163 0/0:1,0:3:9.03:0,9,108 0/0:1,0 [...]
-1 877498 . T C 103.49 PASS AC=2;AF=0.00100;AN=1992;BaseQRankSum=2.365;DP=3395;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0945;InbreedingCoeff=-0.0948;MQ=67.96;MQ0=0;MQRankSum=0.630;NDA=1;QD=6.09;ReadPosRankSum=-0.641;SB=-3.03;VQSLOD=4.2876;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,41 0/0:1,0:3:9.03:0,9,106 0/0:1,0:4:12.04:0,12,154 0/0:1,0:1:3.01:0,3,41 ./. 0/0:1,0:5:15.05:0,15,203 0/0:3,0:3:9.02:0,9,94 ./. 0/0:1,0:1:3.01:0,3,34 0/0:1,0:5:15.04:0,15,158 0/0:2,0:2:6.01:0,6,6 [...]
-1 877583 . C T 209.17 PASS AC=2;AF=0.00090;AN=2230;BaseQRankSum=-2.524;DP=7189;Dels=0.00;FS=2.392;HRun=1;HaplotypeScore=0.1395;InbreedingCoeff=-0.0604;MQ=69.85;MQ0=0;MQRankSum=0.660;NDA=2;QD=6.34;ReadPosRankSum=-0.548;SB=-111.73;VQSLOD=4.9268;culprit=FS;set=variant GT:AD:DP:GQ:PL ./. 0/0:1,0:5:15.05:0,15,193 0/0:1,0:2:6.02:0,6,84 0/0:1,0:3:9.03:0,9,125 ./. 0/0:1,0:6:18.06:0,18,236 0/0:1,0:1:3:0,3,28 0/0:1,0:3:9.03:0,9,113 0/0:2,0:2:6.02:0,6,79 0/0:1,0:9:27.09:0,27,354 0/0:3,0:3:9.03:0,9, [...]
-1 877608 . C G 100.84 PASS AC=3;AF=0.00138;AN=2176;BaseQRankSum=-1.905;DP=5927;Dels=0.00;FS=4.496;HRun=0;HaplotypeScore=0.1522;InbreedingCoeff=-0.0542;MQ=64.62;MQ0=0;MQRankSum=0.399;NDA=2;QD=6.72;ReadPosRankSum=-0.563;SB=-42.63;VQSLOD=4.7731;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:1:3.01:0,3,31 0/0:1,0:3:9.03:0,9,113 0/0:1,0:1:3.01:0,3,44 0/0:1,0:3:9.03:0,9,116 ./. 0/0:1,0:5:15.05:0,15,197 ./. 0/0:1,0:1:3.01:0,3,37 0/0:2,0:2:6.02:0,6,75 0/0:1,0:6:18.06:0,18,217 0/0:1,0:3:9.02:0,9,1 [...]
-1 877677 . G C 349.09 TruthSensitivityTranche99.00to99.30 AC=69;AF=0.03770;AN=1830;BaseQRankSum=-9.318;DP=2433;Dels=0.00;FS=448.822;HRun=1;HaplotypeScore=0.0879;InbreedingCoeff=-0.0760;MQ=59.92;MQ0=0;MQRankSum=0.100;NDA=3;QD=1.71;ReadPosRankSum=-8.632;SB=-143.52;VQSLOD=-1.8166;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL ./. ./. 0/0:1,0:2:6.02:0,6,86 0/0:1,0:1:3.01:0,3,35 ./. 0/0:1,0:2:6.02:0,6,77 0/0:1,0:1:3.01:0,3,39 0/0:1,0:1:2.99:0,3,23 ./. 0/0:1,0:1:3.01:0,3,39 0/0:1,0:2:6.02:0,6,72 [...]
-1 877782 rs79037098 C G 4781.10 PASS AC=124;AF=0.07159;AN=1732;BaseQRankSum=-4.447;DB;DP=2110;Dels=0.00;FS=3.255;HRun=0;HaplotypeScore=0.0938;InbreedingCoeff=0.0287;MQ=60.89;MQ0=0;MQRankSum=2.952;NDA=2;QD=17.45;ReadPosRankSum=-3.028;SB=-1408.28;VQSLOD=6.6300;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,120 ./. 0/0:1,0:2:6.02:0,6,76 ./. 0/0:1,0:2:6.02:0,6,88 0/0:1,0:1:3.01:0,3,36 0/0:1,0:1:3.01:0,3,36 0/0:1,0:1:3.01:0,3,37 0/0:1,0:1:3.01:0,3,38 0/0:1,0:1:3.01:0,3,40 0/0:1,0:1: [...]
-1 877822 . A T 78.78 PASS AC=1;AF=0.00055;AN=1804;BaseQRankSum=-0.199;DP=2323;Dels=0.00;FS=2.331;HRun=1;HaplotypeScore=0.0436;InbreedingCoeff=-0.1067;MQ=58.62;MQ0=0;MQRankSum=2.403;NDA=1;QD=8.75;ReadPosRankSum=-2.072;SB=13.26;VQSLOD=3.3162;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:2:6.02:0,6,80 ./. 0/0:1,0:1:3.01:0,3,36 ./. 0/0:1,0:1:3.01:0,3,41 ./. 0/0:1,0:3:9.02:0,9,92 ./. 0/0:1,0:3:9.02:0,9,100 0/0:1,0:1:3.01:0,3,32 0/0:1,0:1:3.01:0,3,30 ./. 0/0:1,0:3:9.02:0,9,100 0/0:1,0:1:3.01:0 [...]
-1 877831 rs6672356 T C 82507.77 PASS AC=1802;AF=1.00000;AN=1802;BaseQRankSum=-0.472;DB;DP=2494;Dels=0.00;FS=0.000;HRun=2;HaplotypeScore=0.0398;InbreedingCoeff=-0.0821;MQ=58.21;MQ0=0;MQRankSum=2.333;NDA=2;QD=33.07;ReadPosRankSum=1.161;SB=-3183.71;VQSLOD=1.4957;culprit=FS;set=variant GT:AD:DP:GQ:PL 1/1:0,1:2:6.02:69,6,0 ./. 1/1:0,1:1:3.01:30,3,0 ./. 1/1:0,1:1:3.01:44,3,0 ./. 1/1:0,1:3:9.02:100,9,0 ./. 1/1:0,1:3:9.02:92,9,0 1/1:0,1:2:6.01:61,6,0 1/1:0,1:2:6.01:55,6,0 ./. 1/1:0,1:4:12.04:148 [...]
-1 878008 . C T 138.93 PASS AC=5;AF=0.0063;AN=792;BaseQRankSum=0.007;DP=887;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.0558;InbreedingCoeff=-0.0914;MQ=58.35;MQ0=0;MQRankSum=1.574;NDA=2;QD=11.58;ReadPosRankSum=-1.392;SB=5.36;VQSLOD=3.3594;culprit=FS;set=variant GT:AD:DP:GQ:PL ./. ./. ./. ./. 0/0:1,0:1:3.01:0,3,42 ./. 0/0:1,0:1:3.01:0,3,31 ./. ./. ./. ./. ./. ./. 0/0:1,0:1:3.01:0,3,39 0/0:1,0:1:3.01:0,3,33 0/0:1,0:1:3.01:0,3,32 ./. 0/0:1,0:3:9.02:0,9,100 0/0:1,0:1:3.01:0,3,32 ./. ./. 0/0:1, [...]
-1 878254 . C T 85.52 PASS AC=8;AF=0.00352;AN=2272;BaseQRankSum=-5.177;DP=5745;Dels=0.00;FS=5.964;HRun=1;HaplotypeScore=0.1128;InbreedingCoeff=-0.0572;MQ=80.88;MQ0=0;MQRankSum=1.091;NDA=1;QD=1.50;ReadPosRankSum=-0.781;SB=-70.68;VQSLOD=1.6977;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,129 0/0:1,0:8:24.08:0,24,309 0/0:1,0:3:9.03:0,9,124 0/0:1,0:1:3.01:0,3,33 0/0:1,0:5:15.05:0,15,206 0/0:1,0:4:12.04:0,12,145 0/0:1,0:5:15.05:0,15,200 0/0:1,0:2:6.02:0,6,81 0/0:1,0:6:18.06:0,18,22 [...]
-1 878296 rs72902601 C G 223.90 PASS AC=5;AF=0.00217;AN=2306;BaseQRankSum=0.013;DB;DP=6410;Dels=0.00;FS=2.317;HRun=1;HaplotypeScore=0.1647;InbreedingCoeff=-0.0498;MQ=84.45;MQ0=1;MQRankSum=-1.556;NDA=3;QD=7.72;ReadPosRankSum=-0.819;SB=29.78;VQSLOD=6.1512;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:2:6.02:0,6,85 0/0:1,0:7:21.06:0,21,240 0/0:1,0:3:9.03:0,9,122 0/0:1,0:3:9.03:0,9,130 0/0:1,0:4:12.04:0,12,154 0/0:6,0:6:18.06:0,18,225 0/0:1,0:7:21.06:0,21,240 0/0:1,0:4:12.03:0,12,130 0/0:7,0: [...]
-1 878310 . T C 230.22 PASS AC=6;AF=0.00259;AN=2314;BaseQRankSum=2.438;DP=6355;Dels=0.00;FS=7.487;HRun=0;HaplotypeScore=0.2096;InbreedingCoeff=-0.0279;MQ=75.89;MQ0=1;MQRankSum=-0.662;NDA=3;QD=6.40;ReadPosRankSum=0.464;SB=24.62;VQSLOD=6.3399;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:2:6.02:0,6,77 0/0:1,0:4:12.04:0,12,148 0/0:1,0:4:12.04:0,12,148 0/0:1,0:3:9.03:0,9,122 0/0:1,0:2:6.02:0,6,80 0/0:1,0:5:15.05:0,15,193 0/0:6,0:6:18.04:0,18,193 0/0:1,0:5:15.04:0,15,167 0/0:7,0:8 [...]
-1 878314 rs142558220 G C 6737.16 PASS AC=100;AF=0.04314;AN=2318;BaseQRankSum=4.429;DB;DP=6404;Dels=0.00;FS=33.002;HRun=0;HaplotypeScore=0.2219;InbreedingCoeff=0.0422;MQ=74.44;MQ0=0;MQRankSum=1.067;NDA=3;QD=14.58;ReadPosRankSum=-0.369;SB=-1736.03;VQSLOD=6.0058;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,120 0/0:1,0:3:9.03:0,9,113 0/0:1,0:4:12.04:0,12,151 0/0:1,0:3:9.03:0,9,127 0/0:1,0:2:6.02:0,6,86 0/0:1,0:7:21.07:0,21,280 0/1:5,1:6:21.95:22,0,170 0/0:1,0:5:15.05:0,15,193 0/0 [...]
-1 878325 rs114478480 C T 1290.92 PASS AC=22;AF=0.00954;AN=2306;BaseQRankSum=0.807;DB;DP=6480;Dels=0.00;FS=8.079;HRun=0;HaplotypeScore=0.2133;InbreedingCoeff=0.0090;MQ=69.57;MQ0=1;MQRankSum=1.550;NDA=3;QD=12.29;ReadPosRankSum=-0.505;SB=-430.52;VQSLOD=8.1094;culprit=ReadPosRankSum;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,175 0/0:1,0:5:15.05:0,15,185 0/0:1,0:3:9.02:0,9,100 0/0:1,0:3:9.03:0,9,103 0/0:1,0:2:6.02:0,6,82 0/0:1,0:9:27.09:0,27,347 0/0:6,0:6:18.05:0,18,217 0/0:1,0:5:15.05:0 [...]
-1 878331 rs148327885 C T 903.80 PASS AC=21;AF=0.00898;AN=2338;BaseQRankSum=-0.474;DB;DP=6742;Dels=0.00;FS=1.328;HRun=0;HaplotypeScore=0.1838;InbreedingCoeff=0.0444;MQ=66.59;MQ0=1;MQRankSum=2.307;NDA=2;QD=9.22;ReadPosRankSum=-0.761;SB=-342.88;VQSLOD=6.5208;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,172 0/0:1,0:6:18.05:0,18,201 0/0:1,0:4:12.03:0,12,122 0/0:1,0:4:12.04:0,12,160 0/0:1,0:1:3.01:0,3,42 0/0:1,0:8:24.08:0,24,315 0/0:1,0:7:21.06:0,21,234 0/0:1,0:7:21.06:0,21,247 0 [...]
-1 878408 rs190069697 C T 254.67 PASS AC=1;AF=0.00043;AN=2350;BaseQRankSum=0.190;DB;DP=11638;Dels=0.00;FS=1.390;HRun=0;HaplotypeScore=0.1533;InbreedingCoeff=-0.0243;MQ=73.35;MQ0=0;MQRankSum=0.575;NDA=2;QD=18.19;ReadPosRankSum=-0.629;SB=-67.06;VQSLOD=6.0781;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:8:24.08:0,24,341 0/0:1,0:11:33.10:0,33,407 0/0:1,0:7:21.07:0,21,275 0/0:1,0:7:21.07:0,21,285 0/0:1,0:5:15.05:0,15,217 0/0:1,0:4:12.04:0,12,154 0/0:1,0:5:15.04:0,15,167 0/0:1,0:4 [...]
-1 878425 . C T 197.84 PASS AC=2;AF=0.00085;AN=2356;BaseQRankSum=-0.512;DP=14003;Dels=0.00;FS=6.800;HRun=1;HaplotypeScore=0.1841;InbreedingCoeff=-0.0220;MQ=72.36;MQ0=0;MQRankSum=1.181;NDA=1;QD=6.00;ReadPosRankSum=-0.215;SB=-124.40;VQSLOD=6.3903;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:10:30.10:0,30,426 0/0:1,0:16:48.15:0,48,605 0/0:1,0:9:27.09:0,27,354 0/0:1,0:7:21.07:0,21,296 0/0:1,0:7:21.07:0,21,292 0/0:1,0:4:12.04:0,12,157 0/0:1,0:4:12.04:0,12,151 0/0:1,0:5:15.05:0,15 [...]
-1 878474 rs183873661 C T 444.43 PASS AC=3;AF=0.00127;AN=2362;BaseQRankSum=-5.768;DB;DP=14280;Dels=0.00;FS=0.762;HRun=0;HaplotypeScore=0.1971;InbreedingCoeff=-0.0172;MQ=70.51;MQ0=0;MQRankSum=0.190;NDA=2;QD=8.55;ReadPosRankSum=-0.720;SB=-178.80;VQSLOD=6.7250;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:14:42.14:0,42,585 0/0:1,0:12:36.12:0,36,472 0/0:1,0:12:36.11:0,36,454 0/0:1,0:8:24.08:0,24,338 0/0:1,0:12:36.12:0,36,501 0/0:1,0:3:9.03:0,9,120 0/0:10,0:10:27.09:0,27,350 0/0:1,0:7:21.07:0, [...]
-1 878644 . G A 226.03 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=-0.122;DP=25048;Dels=0.00;FS=35.316;HRun=0;HaplotypeScore=0.2952;InbreedingCoeff=-0.0072;MQ=95.60;MQ0=0;MQRankSum=-1.258;NDA=3;QD=5.95;ReadPosRankSum=-0.227;SB=-12.93;VQSLOD=4.1589;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:10:30.10:0,30,393 0/0:19,0:19:51.15:0,51,625 0/0:1,0:14:42.14:0,42,550 0/0:1,0:10:30.10:0,30,400 0/0:1,0:7:21.07:0,21,289 0/0:1,0:5:15.05:0,15,200 0/0:1,0:21:63.19:0,63,759 0/0:15,0:15:45.13:0,45,541 0 [...]
-1 878653 rs112422281 A G 1095.87 PASS AC=3;AF=0.00127;AN=2364;BaseQRankSum=4.441;DB;DP=24856;Dels=0.00;FS=13.604;HRun=0;HaplotypeScore=0.3227;InbreedingCoeff=-0.0071;MQ=93.11;MQ0=0;MQRankSum=-1.791;NDA=3;QD=14.81;ReadPosRankSum=0.465;SB=-472.43;VQSLOD=6.0957;culprit=MQ;set=variant GT:AD:DP:GQ:PL 0/0:1,0:10:30.10:0,30,386 0/0:16,0:16:45.12:0,45,527 0/0:1,0:13:39.13:0,39,501 0/0:1,0:11:33.11:0,33,432 0/0:1,0:8:24.08:0,24,330 0/0:6,0:6:18.06:0,18,236 0/0:1,0:23:69.18:0,69,747 0/0:15,0:15:45 [...]
-1 878656 . G T 144.02 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-2.854;DP=25563;Dels=0.00;FS=13.254;HRun=0;HaplotypeScore=0.3242;InbreedingCoeff=-0.0067;MQ=92.49;MQ0=0;MQRankSum=-1.134;NDA=2;QD=11.08;ReadPosRankSum=0.196;SB=-122.31;VQSLOD=6.2398;culprit=MQ;set=variant GT:AD:DP:GQ:PL 0/0:1,0:12:36.12:0,36,488 0/0:14,0:14:42.13:0,42,529 0/0:1,0:13:39.13:0,39,501 0/0:1,0:12:36.12:0,36,472 0/0:1,0:6:18.06:0,18,256 0/0:6,0:6:18.06:0,18,241 0/0:1,0:24:72.23:0,72,887 0/0:1,0:17:51.16:0,51,629 0 [...]
-1 878667 . G T 1244.61 PASS AC=7;AF=0.00296;AN=2364;BaseQRankSum=-5.435;DP=24575;DS;Dels=0.00;FS=6.041;HRun=0;HaplotypeScore=0.4616;InbreedingCoeff=-0.0092;MQ=80.88;MQ0=0;MQRankSum=-0.829;NDA=2;QD=7.83;ReadPosRankSum=1.618;SB=-336.26;VQSLOD=5.6715;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:13:39.13:0,39,520 0/0:1,0:6:18.06:0,18,227 0/0:1,0:13:39.12:0,39,491 0/0:1,0:11:33.10:0,33,407 0/0:1,0:8:24.08:0,24,325 0/0:1,0:7:21.07:0,21,270 0/0:1,0:22:66.20:0,66,795 0/0:1,0:14:42.13:0,42,506 0 [...]
-1 878676 . C T 261.55 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-0.205;DP=28225;DS;Dels=0.00;FS=16.457;HRun=0;HaplotypeScore=0.7222;InbreedingCoeff=0.0256;MQ=64.88;MQ0=0;MQRankSum=0.709;NDA=3;QD=6.38;ReadPosRankSum=1.287;SB=6.14;VQSLOD=4.2567;culprit=HaplotypeScore;set=variant GT:AD:DP:GQ:PL 0/0:1,0:9:27.09:0,27,376 0/0:1,0:15:45.14:0,45,555 0/0:1,0:13:39.13:0,39,501 0/0:1,0:8:24.08:0,24,325 0/0:1,0:10:30.10:0,30,400 0/0:1,0:7:21.07:0,21,292 0/0:1,0:27:81.25:0,81,975 0/0:1,0:16:48.15:0,4 [...]
-1 878709 rs144453653 C T 1463.13 PASS AC=4;AF=0.00169;AN=2364;BaseQRankSum=4.545;DB;DP=30772;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.3157;InbreedingCoeff=0.0230;MQ=67.14;MQ0=0;MQRankSum=-0.925;NDA=2;QD=12.51;ReadPosRankSum=1.283;SB=-583.42;VQSLOD=5.4027;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:12,0:12:36.10:0,36,450 0/0:1,0:21:63.19:0,63,759 0/0:1,0:12:36.11:0,36,434 0/0:1,0:11:33.11:0,33,432 0/0:10,0:10:30.08:0,30,361 0/0:1,0:6:18.06:0,18,222 0/0:1,0:20:60.13:0,60,612 0/0:1,0:12:36. [...]
-1 878733 . G C 722.67 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=1.196;DP=32483;DS;Dels=0.00;FS=34.785;HRun=0;HaplotypeScore=0.2590;InbreedingCoeff=-0.0142;MQ=69.62;MQ0=0;MQRankSum=0.581;NDA=3;QD=12.04;ReadPosRankSum=0.190;SB=-171.66;VQSLOD=5.0944;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:15:45.15:0,45,626 0/0:1,0:28:84.27:0,84,1058 0/0:1,0:15:45.15:0,45,626 0/0:1,0:11:33.11:0,33,469 0/0:1,0:12:36.12:0,36,512 0/0:1,0:7:21.07:0,21,292 0/0:12,0:12:36.06:0,36,424 0/0:7,0:7:1 [...]
-1 878744 rs138897766 G C 2107.39 PASS AC=12;AF=0.00508;AN=2364;BaseQRankSum=3.699;DB;DP=30261;Dels=0.00;FS=16.835;HRun=0;HaplotypeScore=0.2378;InbreedingCoeff=-0.0201;MQ=72.93;MQ0=0;MQRankSum=0.368;NDA=3;QD=11.33;ReadPosRankSum=2.206;SB=-927.16;VQSLOD=6.3975;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:14:42.14:0,42,569 0/0:1,0:29:87.26:0,87,1022 0/0:1,0:16:48.16:0,48,640 0/0:1,0:10:30.10:0,30,422 0/0:1,0:15:45.15:0,45,618 0/0:1,0:6:18.06:0,18,236 0/0:10,0:10:30.09:0,30,374 [...]
-1 878745 rs72902602 A C 541.13 PASS AC=4;AF=0.00169;AN=2364;BaseQRankSum=-1.730;DB;DP=29217;Dels=0.00;FS=10.700;HRun=0;HaplotypeScore=0.2345;InbreedingCoeff=-0.0177;MQ=73.36;MQ0=0;MQRankSum=0.644;NDA=2;QD=6.85;ReadPosRankSum=0.092;SB=-308.42;VQSLOD=6.3536;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:14:42.14:0,42,577 0/0:1,0:25:75.23:0,75,903 0/0:1,0:14:42.14:0,42,560 0/0:1,0:10:30.10:0,30,418 0/0:1,0:15:45.15:0,45,618 0/0:1,0:5:15.05:0,15,189 0/0:10,0:10:30.06:0,30,350 0/0 [...]
-1 878761 rs35755565 A AG 448.05 Indel_QD AC=31;AF=0.01414;AN=2192;BaseQRankSum=3.442;DB;DP=27061;FS=7.246;HRun=7;HaplotypeScore=1.4391;InbreedingCoeff=0.3349;MQ=58.25;MQ0=0;MQRankSum=6.157;NDA=1;QD=1.23;ReadPosRankSum=-1.898;SB=-185.86;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:1:30.08:0,30,337 0/0:1,0:1:60.17:0,60,674 0/0:1,0:1:48.14:0,48,539 0/0:1,0:1:27.08:0,27,303 0/0:1,0:1:39.11:0,39,438 0/0:1,0:1:9.03:0,9,101 0/0:1,0:1:36.10:0,36,404 0/0:3,0:4:11.62:0,12,111 0/0:1,0:1:9.03:0,9,101 0/ [...]
-1 878764 rs180779437 G C 570.53 PASS AC=3;AF=0.00127;AN=2362;BaseQRankSum=-1.458;DB;DP=27180;DS;Dels=0.00;FS=0.795;HRun=0;HaplotypeScore=0.3066;InbreedingCoeff=-0.0155;MQ=77.01;MQ0=0;MQRankSum=0.624;NDA=2;QD=11.64;ReadPosRankSum=-0.346;SB=-233.86;VQSLOD=6.0170;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:13:39.13:0,39,528 0/0:1,0:23:69.22:0,69,869 0/0:1,0:15:45.15:0,45,610 0/0:1,0:11:33.11:0,33,447 0/0:1,0:12:36.12:0,36,507 0/0:1,0:5:15.05:0,15,193 0/0:1,0:12:36.11:0,36,423 0/0:4,0:4:12 [...]
-1 878769 . C G 669.72 PASS AC=7;AF=0.00297;AN=2360;BaseQRankSum=-0.891;DP=22087;DS;Dels=0.00;FS=10.150;HRun=7;HaplotypeScore=0.3096;InbreedingCoeff=-0.0231;MQ=78.30;MQ0=0;MQRankSum=0.594;NDA=2;QD=4.59;ReadPosRankSum=-2.948;SB=-264.19;VQSLOD=4.1677;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:11:33.11:0,33,432 0/0:1,0:18:54.17:0,54,666 0/0:1,0:14:42.14:0,42,560 0/0:1,0:10:30.09:0,30,370 0/0:1,0:12:36.12:0,36,501 0/0:1,0:5:15.05:0,15,189 0/0:1,0:9:27.09:0,27,340 0/0:4,0:4:12. [...]
-1 878784 rs142929357 C G 2333.96 PASS AC=19;AF=0.00806;AN=2358;BaseQRankSum=7.682;DB;DP=21995;Dels=0.00;FS=26.129;HRun=4;HaplotypeScore=0.2483;InbreedingCoeff=0.0072;MQ=77.12;MQ0=0;MQRankSum=-0.127;NDA=3;QD=11.06;ReadPosRankSum=-5.854;SB=-1081.78;VQSLOD=6.0573;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:8:24.07:0,24,275 0/0:1,0:13:39.11:0,39,447 0/0:1,0:13:39.12:0,39,458 0/0:1,0:7:21.06:0,21,240 0/0:1,0:11:33.11:0,33,424 0/0:1,0:5:15.05:0,15,185 0/0:1,0:8:24.04:0,24,237 0/0:2,0:2:6.01: [...]
-1 878785 rs187587205 G A 154.05 PASS AC=5;AF=0.00212;AN=2358;BaseQRankSum=1.056;DB;DP=22546;Dels=0.00;FS=1.420;HRun=0;HaplotypeScore=0.2441;InbreedingCoeff=-0.0016;MQ=76.46;MQ0=0;MQRankSum=1.130;NDA=3;QD=2.80;ReadPosRankSum=-0.329;SB=9.86;VQSLOD=2.3244;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:10:30.10:0,30,386 0/0:1,0:15:45.14:0,45,567 0/0:1,0:15:45.15:0,45,600 0/0:1,0:9:27.09:0,27,340 0/0:1,0:12:36.12:0,36,472 0/0:1,0:6:18.06:0,18,253 0/0:1,0:9:27.08:0,27,309 0/0:2,0:2:6.02:0,6,74 [...]
-1 878809 rs191952374 C T 2379.47 PASS AC=12;AF=0.00509;AN=2358;BaseQRankSum=-7.158;DB;DP=18026;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.0596;InbreedingCoeff=-0.0001;MQ=83.71;MQ0=0;MQRankSum=5.459;NDA=1;QD=13.22;ReadPosRankSum=1.015;SB=-226.93;VQSLOD=8.2616;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:7:21.07:0,21,301 0/0:1,0:15:45.14:0,45,567 0/0:1,0:14:42.13:0,42,529 0/0:1,0:9:27.09:0,27,354 0/0:1,0:9:27.09:0,27,354 0/0:1,0:8:24.08:0,24,341 0/0:1,0:6:18.06:0,18,231 0/0:4,0:4:12.03:0, [...]
-1 879045 . C T 310.80 PASS AC=10;AF=0.00423;AN=2362;BaseQRankSum=1.692;DP=12971;Dels=0.00;FS=0.000;HRun=0;HaplotypeScore=0.3476;InbreedingCoeff=-0.0250;MQ=70.55;MQ0=0;MQRankSum=-0.063;NDA=3;QD=2.66;ReadPosRankSum=0.103;SB=-95.32;VQSLOD=1.6109;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:8:24.08:0,24,320 0/0:1,0:5:15.05:0,15,189 0/0:1,0:7:21.07:0,21,259 0/0:1,0:8:24.08:0,24,302 0/0:11,0:11:33.11:0,33,476 0/0:1,0:7:21.07:0,21,275 0/0:1,0:15:45.14:0,45,529 0/0:8,0:8:24.06:0,24,287 0/0:1,0: [...]
-1 879060 rs186768085 C T 178.33 PASS AC=2;AF=0.00085;AN=2362;BaseQRankSum=-2.758;DB;DP=14742;Dels=0.00;FS=16.111;HRun=0;HaplotypeScore=0.3498;InbreedingCoeff=-0.0180;MQ=70.61;MQ0=0;MQRankSum=0.836;NDA=2;QD=3.72;ReadPosRankSum=0.265;SB=-103.55;VQSLOD=2.0271;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:7:21.07:0,21,275 0/0:1,0:4:12.04:0,12,148 0/0:1,0:6:18.06:0,18,253 0/0:1,0:7:21.07:0,21,280 0/0:13,0:13:39.13:0,39,549 0/0:1,0:10:30.10:0,30,412 0/0:1,0:12:36.11:0,36,434 0/0:1 [...]
-1 879090 . C A 1219.01 TruthSensitivityTranche99.30to99.50 AC=2;AF=0.00085;AN=2364;BaseQRankSum=-27.199;DP=18527;Dels=0.02;FS=56.628;HRun=1;HaplotypeScore=0.8406;InbreedingCoeff=0.1134;MQ=61.65;MQ0=0;MQRankSum=11.240;NDA=3;QD=1.39;ReadPosRankSum=1.781;SB=-327.63;VQSLOD=-4.1026;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:3:9.03:0,9,131 0/0:11,0:11:30.08:0,30,368 0/0:1,0:11:33.11:0,33,416 0/0:1,0:7:21.07:0,21,292 0/0:1,0:14:42.14:0,42,560 0/0:1,0:12:36.12:0,36,472 0/0:1,0:6:18.06:0 [...]
-1 879095 . G A 231.79 TruthSensitivityTranche98.50to98.80 AC=3;AF=0.00127;AN=2364;BaseQRankSum=-9.250;DP=19365;Dels=0.00;FS=0.000;HRun=1;HaplotypeScore=0.8663;InbreedingCoeff=-0.0143;MQ=60.09;MQ0=0;MQRankSum=1.310;NDA=3;QD=2.90;ReadPosRankSum=-0.443;SB=-73.14;VQSLOD=0.1700;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:4:12.04:0,12,172 0/0:13,0:13:36.11:0,36,451 0/0:1,0:11:33.11:0,33,454 0/0:1,0:8:24.08:0,24,320 0/0:1,0:14:42.14:0,42,591 0/0:1,0:15:45.15:0,45,600 0/0:1,0:6:18.06:0,1 [...]
-1 879108 . A C 2045.21 TruthSensitivityTranche99.50to99.90 AC=174;AF=0.07360;AN=2364;BaseQRankSum=-22.465;DP=20020;Dels=0.00;FS=3200.000;HRun=3;HaplotypeScore=0.6535;InbreedingCoeff=-0.0715;MQ=59.51;MQ0=2;MQRankSum=2.710;NDA=2;QD=0.79;ReadPosRankSum=-21.990;SB=-568.80;VQSLOD=-65.2733;culprit=FS;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:7:21.07:0,21,285 0/0:1,0:9:27.08:0,27,309 0/0:1,0:12:36.11:0,36,454 0/0:1,0:7:21.07:0,21,285 0/0:1,0:15:45.14:0,45,567 0/0:1,0:13:39.12:0,39,481 0/1:5,2:7: [...]
-1 879115 . C G 98.78 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=0.335;DP=28840;DS;Dels=0.00;FS=1.686;HRun=0;HaplotypeScore=0.4535;InbreedingCoeff=-0.0059;MQ=59.65;MQ0=2;MQRankSum=-1.112;NDA=2;QD=5.81;ReadPosRankSum=1.173;SB=-52.08;VQSLOD=4.2445;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:11:33.11:0,33,459 0/0:1,0:20:60.19:0,60,740 0/0:15,0:15:45.15:0,45,613 0/0:1,0:7:21.07:0,21,289 0/0:1,0:14:42.14:0,42,577 0/0:1,0:17:51.17:0,51,701 0/0:9,0:9:27.08:0,27,336 0/0:1,0:10:30.10:0,30,386 0/0 [...]
-1 879135 rs149790558 C T 710.99 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=1.067;DB;DP=33389;Dels=0.00;FS=4.041;HRun=1;HaplotypeScore=0.2819;InbreedingCoeff=-0.0065;MQ=65.56;MQ0=0;MQRankSum=-0.395;NDA=2;QD=9.61;ReadPosRankSum=0.089;SB=-349.93;VQSLOD=6.0187;culprit=MQ;set=variant GT:AD:DP:GQ:PL 0/0:1,0:17:51.17:0,51,731 0/0:1,0:24:72.23:0,72,907 0/0:1,0:16:48.16:0,48,650 0/0:1,0:10:30.10:0,30,393 0/0:1,0:15:45.15:0,45,618 0/0:1,0:20:60.20:0,60,835 0/0:1,0:15:45.15:0,45,590 0/0:15,0:15:42.1 [...]
-1 879142 rs148506094 C G 986.92 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=5.008;DB;DP=34146;Dels=0.00;FS=52.989;HRun=0;HaplotypeScore=0.2258;InbreedingCoeff=0.0374;MQ=69.31;MQ0=0;MQRankSum=-1.263;NDA=1;QD=13.71;ReadPosRankSum=1.568;SB=-27.67;VQSLOD=4.0467;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:17:51.17:0,51,718 0/0:1,0:22:66.21:0,66,849 0/0:1,0:18:54.18:0,54,708 0/0:1,0:11:33.11:0,33,459 0/0:1,0:18:54.18:0,54,708 0/0:1,0:19:57.19:0,57,783 0/0:1,0:17:51.16:0,51,656 0/0:16,0:16:48.1 [...]
-1 879145 rs146548754 A C 921.44 PASS AC=2;AF=0.00085;AN=2364;BaseQRankSum=4.040;DB;DP=35077;Dels=0.00;FS=79.622;HRun=1;HaplotypeScore=0.2058;InbreedingCoeff=0.0239;MQ=71.45;MQ0=0;MQRankSum=-0.552;NDA=2;QD=12.80;ReadPosRankSum=1.074;SB=4.65;VQSLOD=3.8967;culprit=FS;set=variant GT:AD:DP:GQ:PL 0/0:1,0:20:60.20:0,60,835 0/0:1,0:27:81.25:0,81,998 0/0:1,0:19:57.19:0,57,793 0/0:1,0:12:36.12:0,36,501 0/0:1,0:17:51.17:0,51,691 0/0:1,0:22:66.22:0,66,907 0/0:1,0:19:57.17:0,57,653 0/0:1,0:16:48.14:0 [...]
-1 879203 . A C 100.14 PASS AC=1;AF=0.00042;AN=2364;BaseQRankSum=-1.334;DP=34081;Dels=0.00;FS=11.356;HRun=0;HaplotypeScore=0.2129;InbreedingCoeff=-0.0083;MQ=77.56;MQ0=0;MQRankSum=-0.721;NDA=1;QD=6.26;ReadPosRankSum=0.498;SB=-58.31;VQSLOD=6.5553;culprit=QD;set=variant GT:AD:DP:GQ:PL 0/0:1,0:13:39.13:0,39,511 0/0:1,0:34:99:0,102,1199 0/0:1,0:29:87.28:0,87,1119 0/0:1,0:14:42.14:0,42,585 0/0:1,0:24:72.24:0,72,990 0/0:1,0:26:78.25:0,78,983 0/0:1,0:17:51.15:0,51,599 0/0:1,0:9:27.09:0,27,340 0/0 [...]
-1 879257 . C T 66.87 TruthSensitivityTranche98.50to98.80 AC=4;AF=0.00169;AN=2364;BaseQRankSum=-0.888;DP=41699;Dels=0.00;FS=1.728;HRun=0;HaplotypeScore=0.2694;InbreedingCoeff=0.0216;MQ=68.26;MQ0=0;MQRankSum=3.451;NDA=3;QD=1.39;ReadPosRankSum=0.465;SB=-95.37;VQSLOD=0.1895;culprit=QD;set=FilteredInAll GT:AD:DP:GQ:PL 0/0:1,0:34:99:0,102,1312 0/0:1,0:36:99:0,108,1204 0/0:1,0:40:99:0,120,1479 0/0:1,0:23:69.22:0,69,887 0/0:1,0:29:87.28:0,87,1140 0/0:1,0:31:93.30:0,93,1172 0/0:1,0:5:15.05:0,15,1 [...]
-1 879276 rs115454328 A G 5560.08 PASS AC=15;AF=0.00635;AN=2364;BaseQRankSum=5.676;DB;DP=43812;DS;Dels=0.00;FS=9.312;HRun=0;HaplotypeScore=0.1675;InbreedingCoeff=-0.0144;MQ=62.93;MQ0=0;MQRankSum=3.476;NDA=1;QD=11.91;ReadPosRankSum=-1.874;SB=-2673.29;VQSLOD=6.6274;culprit=InbreedingCoeff;set=variant GT:AD:DP:GQ:PL 0/0:1,0:36:99:0,108,1463 0/0:1,0:41:99:0,123,1445 0/0:1,0:37:99:0,111,1480 0/0:1,0:25:75.25:0,75,1044 0/0:1,0:35:99:0,105,1462 0/0:1,0:29:87.28:0,87,1119 0/0:7,0:7:21.06:0,21,241 [...]
-1 879317 rs7523549 C T 82570.47 PASS AC=186;AF=0.07868;AN=2364;BaseQRankSum=2.488;DB;DP=36267;DS;Dels=0.00;FS=14.862;HM3;HRun=0;HaplotypeScore=0.3150;InbreedingCoeff=0.1203;MQ=61.86;MQ0=0;MQRankSum=7.931;NDA=2;QD=17.21;ReadPosRankSum=3.682;SB=-25054.87;VQSLOD=6.5687;culprit=MQRankSum;set=variant GT:AD:DP:GQ:PL 0/1:19,17:36:99:558,0,622 0/0:1,0:30:90.27:0,90,1058 0/0:1,0:35:99:0,105,1350 0/0:1,0:26:78.25:0,78,983 0/0:1,0:23:69.22:0,69,887 0/0:1,0:28:84.27:0,84,1080 0/0:1,0:12:36.11:0,36,4 [...]
diff --git a/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf b/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf
deleted file mode 100644
index 9af0cb3..0000000
--- a/src/test/resources/htsjdk/variant/VCF4HeaderTest.vcf
+++ /dev/null
@@ -1,42 +0,0 @@
-##fileformat=VCFv4.0
-##FILTER=<ID=ABFilter,Description="AB 0.75 && DP 40">
-##FILTER=<ID=DPFilter,Description="DP 120 || SB -0.10">
-##FILTER=<ID=FDRtranche0.00to0.10,Description="FDR tranche level at qual 0.06">
-##FILTER=<ID=FDRtranche0.10to1.00,Description="FDR tranche level at qual 0.03">
-##FILTER=<ID=FDRtranche1.00to2.00,Description="FDR tranche level at qual 0.02">
-##FILTER=<ID=FDRtranche2.00to10.00+,Description="FDR tranche level at qual > 0.06">
-##FILTER=<ID=FDRtranche2.00to10.00,Description="FDR tranche level at qual unknown">
-##FILTER=<ID=HARD_TO_VALIDATE,Description="MQ0 = 4 && ((MQ0 / (1.0 * DP)) 0.1)">
-##FILTER=<ID=Indel,Description="Overlaps a user-input mask">
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=LowQual,Description="QUAL 50.0">
-##FILTER=<ID=ANNOTATION,Description="ANNOTATION != \"NA\" || ANNOTATION <= 0.01">
-##FILTER=<ID=ANNOTATION2,Description="ANNOTATION with quote \" that is unmatched but escaped">
-##FILTER=<ID=SnpCluster,Description="SNPs found in clusters">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth (only filtered reads used for calling)">
-##FORMAT=<ID=GL,Number=3,Type=Float,Description="Log-scaled likelihoods for AA,AB,BB genotypes where A=ref and B=alt; not applicable if site is not biallelic">
-##FORMAT=<ID=GQ,Number=1,Type=Float,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##INFO=<ID=AC,Number=.,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=HRun,Number=1,Type=Integer,Description="Largest Contiguous Homopolymer Run of Variant Allele In Either Direction">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with two (and only two) segregating haplotypes">
-##INFO=<ID=EscapingQuote,Number=1,Type=Float,Description="This description has an escaped \" quote in it">
-##INFO=<ID=EscapingBackslash,Number=1,Type=Float,Description="This description has an escaped \\ backslash in it">
-##INFO=<ID=EscapingNonQuoteOrBackslash,Number=1,Type=Float,Description="This other value has a \n newline in it">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=OQ,Number=1,Type=Float,Description="The original variant quality score">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-23/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-24/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessingPapers/scriptsToMakeBams/Q-2970 at gsa2-1-temp-5/NA12878.HiSeq.WGS.bwa.cleaned.recal.bam, /humgen/1kg/analysis/bamsForDataProcessi [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf, mask,Bed,wgs.v9/HiSeq.WGS.cleaned.indels.10.mask] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.in [...]
-##VariantFiltration="analysis_type=VariantFiltration input_file=[] read_buffer_size=null read_filter=[] intervals=null excludeIntervals=[chrM, chrY] reference_sequence=/seq/references/Homo_sapiens_assembly18/v0/Homo_sapiens_assembly18.fasta rodBind=[variant,VCF,wgs.v9/HiSeq.WGS.cleaned.ug.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null hapmap=null hapmap_chip=null out=wgs.v9/HiSeq.WGS.cleaned.ug.snpfiltered.vcf err=null outerr=null filterZeroMappingQualityReads=false dow [...]
-##source=VariantOptimizer
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878
-chr1 109 . A T 0 FDRtranche2.00to10.00+ AC=1;AF=0.50;AN=2;DP=1019;Dels=0.00;HRun=0;HaplotypeScore=686.65;MQ=19.20;MQ0=288;OQ=2175.54;QD=2.13;SB=-1042.18 GT:AD:DP:GL:GQ 0/1:610,327:308:-316.30,-95.47,-803.03:99
diff --git a/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal b/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal
deleted file mode 100644
index 37b8274..0000000
--- a/src/test/resources/htsjdk/variant/VQSR.mixedTest.recal
+++ /dev/null
@@ -1,32 +0,0 @@
-##fileformat=VCFv4.1
-##INFO=<ID=END,Number=1,Type=Integer,Description="x">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-#CHROM POS ID REF ALT QUAL FILTER INFO
-20 1000177 . N <VQSR> . . END=1000177;VQSLOD=-1.2345;culprit=FS
-20 1000177 . N <VQSR> . . END=1000178;VQSLOD=-1.2377;culprit=HaplotypeScore
-20 1000382 . N <VQSR> . . END=1000386;VQSLOD=-0.5534;culprit=HaplotypeScore
-20 1000382 . N <VQSR> . . END=1000382;VQSLOD=-0.5678;culprit=FS
-20 1000442 . N <VQSR> . . END=1000446;VQSLOD=3.5923;culprit=QD
diff --git a/src/test/resources/htsjdk/variant/breakpoint.vcf b/src/test/resources/htsjdk/variant/breakpoint.vcf
deleted file mode 100644
index ced1e3e..0000000
--- a/src/test/resources/htsjdk/variant/breakpoint.vcf
+++ /dev/null
@@ -1,6 +0,0 @@
-##fileformat=VCFv4.1
-##INFO=<ID=SVTYPE,Number=1,Type=String,Description="Type of structural variant">
-##contig=<ID=chr12,length=133851895>
-#CHROM POS ID REF ALT QUAL FILTER INFO
-chr12 203475 . T t[chr12:203540[ 36 . SVTYPE=BND
-chr12 203475 . T T[chr12:203540[ 36 . SVTYPE=BND
diff --git a/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf b/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf
deleted file mode 100644
index 948e8a3..0000000
--- a/src/test/resources/htsjdk/variant/dbsnp_135.b37.1000.vcf
+++ /dev/null
@@ -1,249 +0,0 @@
-##fileformat=VCFv4.1
-##FILTER=<ID=NC,Description="Inconsistent Genotype Submission For At Least One Sample">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=ASP,Number=0,Type=Flag,Description="Is Assembly specific. This is set if the variant only maps to one assembly">
-##INFO=<ID=ASS,Number=0,Type=Flag,Description="In acceptor splice site FxnCode = 73">
-##INFO=<ID=CDA,Number=0,Type=Flag,Description="Variation is interrogated in a clinical diagnostic assay">
-##INFO=<ID=CFL,Number=0,Type=Flag,Description="Has Assembly conflict. This is for weight 1 and 2 variant that maps to different chromosomes on different assemblies.">
-##INFO=<ID=CLN,Number=0,Type=Flag,Description="Variant is Clinical(LSDB,OMIM,TPA,Diagnostic)">
-##INFO=<ID=DSS,Number=0,Type=Flag,Description="In donor splice-site FxnCode = 75">
-##INFO=<ID=G5,Number=0,Type=Flag,Description=">5% minor allele frequency in 1+ populations">
-##INFO=<ID=G5A,Number=0,Type=Flag,Description=">5% minor allele frequency in each and all populations">
-##INFO=<ID=GCF,Number=0,Type=Flag,Description="Has Genotype Conflict Same (rs, ind), different genotype. N/N is not included.">
-##INFO=<ID=GENEINFO,Number=1,Type=String,Description="Pairs each of gene symbol:gene id. The gene symbol and id are delimited by a colon (:) and each pair is delimited by a vertical bar (|)">
-##INFO=<ID=GMAF,Number=1,Type=Float,Description="Global Minor Allele Frequency [0, 0.5]; global population is 1000GenomesProject phase 1 genotype data from 629 individuals, released in the 08-04-2010 dataset">
-##INFO=<ID=GNO,Number=0,Type=Flag,Description="Genotypes available. The variant has individual genotype (in SubInd table).">
-##INFO=<ID=HD,Number=0,Type=Flag,Description="Marker is on high density genotyping kit (50K density or greater). The variant may have phenotype associations present in dbGaP.">
-##INFO=<ID=INT,Number=0,Type=Flag,Description="In Intron FxnCode = 6">
-##INFO=<ID=KGPROD,Number=0,Type=Flag,Description="1000 Genome production phase">
-##INFO=<ID=KGPilot1,Number=0,Type=Flag,Description="1000 Genome discovery(pilot1) 2009">
-##INFO=<ID=KGPilot123,Number=0,Type=Flag,Description="1000 Genome discovery all pilots 2010(1,2,3)">
-##INFO=<ID=KGVAL,Number=0,Type=Flag,Description="1000 Genome validated by second method">
-##INFO=<ID=LSD,Number=0,Type=Flag,Description="Submitted from a locus-specific database">
-##INFO=<ID=MTP,Number=0,Type=Flag,Description="Microattribution/third-party annotation(TPA:GWAS,PAGE)">
-##INFO=<ID=MUT,Number=0,Type=Flag,Description="Is mutation (journal citation, explicit fact): a low frequency variation that is cited in journal and other reputable sources">
-##INFO=<ID=NOC,Number=0,Type=Flag,Description="Contig allele not present in variant allele list. The reference sequence allele at the mapped position is not present in the variant allele list, adjusted for orientation.">
-##INFO=<ID=NOV,Number=0,Type=Flag,Description="Rs cluster has non-overlapping allele sets. True when rs set has more than 2 alleles from different submissions and these sets share no alleles in common.">
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=NSF,Number=0,Type=Flag,Description="Has non-synonymous frameshift A coding region variation where one allele in the set changes all downstream amino acids. FxnClass = 44">
-##INFO=<ID=NSM,Number=0,Type=Flag,Description="Has non-synonymous missense A coding region variation where one allele in the set changes protein peptide. FxnClass = 42">
-##INFO=<ID=NSN,Number=0,Type=Flag,Description="Has non-synonymous nonsense A coding region variation where one allele in the set changes to STOP codon (TER). FxnClass = 41">
-##INFO=<ID=OM,Number=0,Type=Flag,Description="Has OMIM/OMIA">
-##INFO=<ID=OTH,Number=0,Type=Flag,Description="Has other variant with exactly the same set of mapped positions on NCBI refernce assembly.">
-##INFO=<ID=PH1,Number=0,Type=Flag,Description="Phase 1 genotyped: filtered, non-redundant">
-##INFO=<ID=PH2,Number=0,Type=Flag,Description="Phase 2 genotyped: filtered, non-redundant">
-##INFO=<ID=PH3,Number=0,Type=Flag,Description="Phase 3 genotyped: filtered, non-redundant">
-##INFO=<ID=PM,Number=0,Type=Flag,Description="Variant is Precious(Clinical,Pubmed Cited)">
-##INFO=<ID=PMC,Number=0,Type=Flag,Description="Links exist to PubMed Central article">
-##INFO=<ID=R3,Number=0,Type=Flag,Description="In 3' gene region FxnCode = 13">
-##INFO=<ID=R5,Number=0,Type=Flag,Description="In 5' gene region FxnCode = 15">
-##INFO=<ID=REF,Number=0,Type=Flag,Description="Has reference A coding region variation where one allele in the set is identical to the reference sequence. FxnCode = 8">
-##INFO=<ID=RSPOS,Number=1,Type=Integer,Description="Chr position reported in dbSNP">
-##INFO=<ID=RV,Number=0,Type=Flag,Description="RS orientation is reversed">
-##INFO=<ID=S3D,Number=0,Type=Flag,Description="Has 3D structure - SNP3D table">
-##INFO=<ID=SAO,Number=1,Type=Integer,Description="Variant Allele Origin: 0 - unspecified, 1 - Germline, 2 - Somatic, 3 - Both">
-##INFO=<ID=SCS,Number=1,Type=Integer,Description="Variant Clinical Significance, 0 - unknown, 1 - untested, 2 - non-pathogenic, 3 - probable-non-pathogenic, 4 - probable-pathogenic, 5 - pathogenic, 6 - drug-response, 7 - histocompatibility, 255 - other">
-##INFO=<ID=SLO,Number=0,Type=Flag,Description="Has SubmitterLinkOut - From SNP->SubSNP->Batch.link_out">
-##INFO=<ID=SSR,Number=1,Type=Integer,Description="Variant Suspect Reason Code, 0 - unspecified, 1 - Paralog, 2 - byEST, 3 - Para_EST, 4 - oldAlign, 5 - other">
-##INFO=<ID=SYN,Number=0,Type=Flag,Description="Has synonymous A coding region variation where one allele in the set does not change the encoded amino acid. FxnCode = 3">
-##INFO=<ID=TPA,Number=0,Type=Flag,Description="Provisional Third Party Annotation(TPA) (currently rs from PHARMGKB who will give phenotype data)">
-##INFO=<ID=U3,Number=0,Type=Flag,Description="In 3' UTR Location is in an untranslated region (UTR). FxnCode = 53">
-##INFO=<ID=U5,Number=0,Type=Flag,Description="In 5' UTR Location is in an untranslated region (UTR). FxnCode = 55">
-##INFO=<ID=VC,Number=1,Type=String,Description="Variation Class">
-##INFO=<ID=VLD,Number=0,Type=Flag,Description="Is Validated. This bit is set if the variant has 2+ minor allele count based on frequency or genotype data.">
-##INFO=<ID=VP,Number=1,Type=String,Description="Variation Property">
-##INFO=<ID=WGT,Number=1,Type=Integer,Description="Weight, 00 - unmapped, 1 - weight 1, 2 - weight 2, 3 - weight 3 or more">
-##INFO=<ID=WTD,Number=0,Type=Flag,Description="Is Withdrawn by submitter If one member ss is withdrawn by submitter, then this bit is set. If all member ss' are withdrawn, then the rs is deleted to SNPHistory">
-##INFO=<ID=dbSNPBuildID,Number=1,Type=Integer,Description="First dbSNP Build for RS">
-##LeftAlignVariants="analysis_type=LeftAlignVariants input_file=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta rodBind=[] nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities= [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##dbSNP_BUILD_ID=135
-##fileDate=20111104
-##phasing=partial
-##reference=GRCh37.3
-##reference=file:///humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta
-##source=dbSNP
-##variationPropertyDocumentationUrl=ftp://ftp.ncbi.nlm.nih.gov/snp/specs/dbSNP_BitField_latest.pdf
-#CHROM POS ID REF ALT QUAL FILTER INFO
-1 10144 rs144773400 TA T . PASS ASP;RSPOS=10145;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10228 rs143255646 TA T . PASS ASP;RSPOS=10229;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10234 rs145599635 C T . PASS ASP;RSPOS=10234;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 10248 rs148908337 A T . PASS ASP;RSPOS=10248;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 10254 rs140194106 TA T . PASS ASP;RSPOS=10255;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10291 rs145427775 C T . PASS ASP;RSPOS=10291;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 10327 rs112750067 T C . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10327;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=132
-1 10329 rs150969722 AC A . PASS ASP;RSPOS=10330;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10351 rs145072688 CTA C,CA . PASS ASP;RSPOS=10352;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10382 rs147093981 AAC A,AC . PASS ASP;RSPOS=10383;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10433 rs56289060 A AC . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10433;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=129
-1 10439 rs112766696 AC A . PASS ASP;GENEINFO=LOC100652771:100652771;GNO;RSPOS=10440;SAO=0;SLO;SSR=0;VC=DIV;VP=050100000004000100000200;WGT=0;dbSNPBuildID=132
-1 10439 rs138941843 AC A . PASS ASP;RSPOS=10440;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=134
-1 10440 rs112155239 C A . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10440;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=132
-1 10492 rs55998931 C T . PASS ASP;GENEINFO=LOC100652771:100652771;GMAF=0.0617001828153565;RSPOS=10492;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040000000100;WGT=0;dbSNPBuildID=129
-1 10519 rs62636508 G C . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10519;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=129
-1 10583 rs58108140 G A . PASS ASP;GENEINFO=LOC100652771:100652771;GMAF=0.270566727605119;KGPilot123;RSPOS=10583;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040010000100;WGT=0;dbSNPBuildID=129
-1 10611 rs189107123 C G . PASS KGPilot123;RSPOS=10611;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 10828 rs10218492 G A . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10828;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=119
-1 10904 rs10218493 G A . PASS ASP;GENEINFO=LOC100652771:100652771;GNO;RSPOS=10904;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=119
-1 10927 rs10218527 A G . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10927;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=119
-1 10938 rs28853987 G A . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=10938;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1 11014 rs28484712 G A . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=11014;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1 11022 rs28775022 G A . PASS ASP;GENEINFO=LOC100652771:100652771;RSPOS=11022;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=125
-1 11081 rs10218495 G T . PASS CFL;GENEINFO=LOC100652771:100652771;GNO;RSPOS=11081;SAO=0;SSR=0;VC=SNV;VP=050000000008000100000100;WGT=0;dbSNPBuildID=119
-1 11863 rs187669455 C A . PASS RSPOS=11863;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=135
-1 13302 rs180734498 C T . PASS KGPilot123;RSPOS=13302;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 13327 rs144762171 G C . PASS ASP;KGPilot123;RSPOS=13327;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 13684 rs71260404 C T . PASS GENEINFO=LOC100652771:100652771;GNO;RSPOS=13684;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1 13980 rs151276478 T C . PASS ASP;KGPilot123;RSPOS=13980;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 14889 rs142444908 G A . PASS ASP;RSPOS=14889;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 14907 rs79585140 A G . PASS GNO;RSPOS=14907;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1 14930 rs75454623 A G . PASS GNO;RSPOS=14930;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1 14976 rs71252251 G A . PASS ASP;GNO;RSPOS=14976;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000004000100000100;WGT=0;dbSNPBuildID=130
-1 15061 rs71268703 T TG . PASS ASP;GNO;RSPOS=15061;RV;SAO=0;SLO;SSR=0;VC=DIV;VP=050100000004000100000200;WGT=0;dbSNPBuildID=130
-1 15118 rs71252250 A G . PASS ASP;GNO;RSPOS=15118;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000004000100000100;WGT=0;dbSNPBuildID=130
-1 15211 rs144718396 T G . PASS ASP;RSPOS=15211;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 15211 rs78601809 T G . PASS ASP;GNO;RSPOS=15211;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1 16257 rs78588380 G C . PASS ASP;GNO;RSPOS=16257;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=131
-1 16378 rs148220436 T C . PASS ASP;RSPOS=16378;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 16495 rs141130360 G C . PASS ASP;RSPOS=16495;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 16497 rs150723783 A G . PASS ASP;RSPOS=16497;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 17519 rs192890528 G T . PASS RSPOS=17519;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=135
-1 19226 rs138930629 T A . PASS ASP;RSPOS=19226;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 20141 rs56336884 G A . PASS HD;RSPOS=20141;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000400000100;WGT=0;dbSNPBuildID=129
-1 20144 rs143346096 G A . PASS ASP;RSPOS=20144;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 20206 rs71262675 C T . PASS GNO;RSPOS=20206;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1 20245 rs71262674 G A . PASS GMAF=0.256398537477148;GNO;RSPOS=20245;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1 20304 rs71262673 G C . PASS GMAF=0.338208409506399;GNO;RSPOS=20304;RV;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000000100000100;WGT=0;dbSNPBuildID=130
-1 26999 rs147506580 A G . PASS ASP;RSPOS=26999;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 29436 rs2462493 G A . PASS GNO;RSPOS=29436;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=100
-1 30923 rs140337953 G T . PASS ASP;KGPilot123;RSPOS=30923;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 33487 rs77459554 C T . PASS ASP;GNO;RSPOS=33487;SAO=0;SSR=0;VC=SNV;VP=050000000004000100000100;WGT=0;dbSNPBuildID=131
-1 33495 rs75468675 C T . PASS ASP;GNO;RSPOS=33495;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1 33505 rs75627161 T C . PASS ASP;GNO;RSPOS=33505;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1 33508 rs75609629 A T . PASS ASP;GNO;RSPOS=33508;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040100000100;WGT=0;dbSNPBuildID=131
-1 33521 rs76098219 T A . PASS GNO;RSPOS=33521;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040100000100;WGT=0;dbSNPBuildID=131
-1 33593 rs557585 G A . PASS RSPOS=33593;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=83
-1 33648 rs62028204 G T . PASS RSPOS=33648;RV;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=129
-1 33656 rs113821789 T C . PASS RSPOS=33656;RV;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=132
-1 51476 rs187298206 T C . PASS KGPilot123;RSPOS=51476;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 51479 rs116400033 T A . PASS ASP;G5;G5A;GMAF=0.113802559414991;KGPilot123;RSPOS=51479;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004070010000100;WGT=0;dbSNPBuildID=132
-1 51803 rs62637812 T C . PASS GMAF=0.468921389396709;RSPOS=51803;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000000040000000100;WGT=0;dbSNPBuildID=129
-1 51898 rs76402894 C A . PASS GMAF=0.0731261425959781;GNO;RSPOS=51898;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=131
-1 51914 rs190452223 T G . PASS KGPilot123;RSPOS=51914;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 51928 rs78732933 G A . PASS GNO;RSPOS=51928;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=131
-1 51935 rs181754315 C T . PASS KGPilot123;RSPOS=51935;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 51954 rs185832753 G C . PASS KGPilot123;RSPOS=51954;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 52058 rs62637813 G C . PASS GMAF=0.0342778793418647;KGPilot123;RSPOS=52058;SAO=0;SSR=1;VC=SNV;VLD;VP=050000000000040010000140;WGT=0;dbSNPBuildID=129
-1 52144 rs190291950 T A . PASS KGPilot123;RSPOS=52144;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 52238 rs150021059 T G . PASS ASP;KGPilot123;RSPOS=52238;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 54353 rs140052487 C A . PASS ASP;KGPilot123;RSPOS=54353;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 54421 rs146477069 A G . PASS ASP;KGPilot123;RSPOS=54421;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 54490 rs141149254 G A . PASS ASP;KGPilot123;RSPOS=54490;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 54676 rs2462492 C T . PASS ASP;GMAF=0.191956124314442;GNO;HD;KGPilot123;RSPOS=54676;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004040510000100;WGT=0;dbSNPBuildID=100
-1 54753 rs143174675 T G . PASS ASP;KGPilot123;RSPOS=54753;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 54788 rs59861892 CC C,CCT . PASS ASP;RSPOS=54789;SAO=0;SSR=0;VC=DIV;VP=050000000004000000000200;WGT=0;dbSNPBuildID=129
-1 54795 rs58014817 T A . PASS ASP;RSPOS=54795;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=129
-1 55164 rs3091274 C A . PASS G5;G5A;GMAF=0.145338208409506;GNO;KGPilot123;RSPOS=55164;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000030110000100;WGT=0;dbSNPBuildID=103
-1 55299 rs10399749 C T . PASS G5;G5A;GMAF=0.278793418647166;GNO;KGPilot123;PH2;RSPOS=55299;SAO=0;SLO;SSR=0;VC=SNV;VP=050100000000030112000100;WGT=0;dbSNPBuildID=119
-1 55302 rs3091273 C T . PASS RSPOS=55302;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=103
-1 55313 rs182462964 A T . PASS KGPilot123;RSPOS=55313;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55322 rs3107974 C T . PASS RSPOS=55322;SAO=0;SSR=0;VC=SNV;VP=050000000000000000000100;WGT=0;dbSNPBuildID=103
-1 55326 rs3107975 T C . PASS GNO;HD;KGPilot123;RSPOS=55326;SAO=0;SSR=0;VC=SNV;VP=050000000000000510000100;WGT=0;dbSNPBuildID=103
-1 55330 rs185215913 G A . PASS KGPilot123;RSPOS=55330;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55367 rs190850374 G A . PASS KGPilot123;RSPOS=55367;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55388 rs182711216 C T . PASS KGPilot123;RSPOS=55388;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55394 rs2949420 T A . PASS GNO;KGPilot123;PH2;RSPOS=55394;SAO=0;SSR=0;VC=SNV;VP=050000000000000112000100;WGT=0;dbSNPBuildID=101
-1 55416 rs193242050 G A . PASS KGPilot123;RSPOS=55416;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55427 rs183189405 T C . PASS KGPilot123;RSPOS=55427;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55545 rs28396308 C T . PASS GNO;RSPOS=55545;SAO=0;SSR=0;VC=SNV;VP=050000000000000100000100;WGT=0;dbSNPBuildID=125
-1 55816 rs187434873 G A . PASS KGPilot123;RSPOS=55816;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55850 rs191890754 C G . PASS KGPilot123;RSPOS=55850;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 55852 rs184233019 G C . PASS KGPilot123;RSPOS=55852;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 56644 rs143342222 A C . PASS ASP;KGPilot123;RSPOS=56644;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
-1 57952 rs189727433 A C . PASS KGPilot123;RSPOS=57952;SAO=0;SSR=0;VC=SNV;VP=050000000000000010000100;WGT=0;dbSNPBuildID=135
-1 58771 rs140128481 T C . PASS ASP;RSPOS=58771;SAO=0;SSR=0;VC=SNV;VP=050000000004000000000100;WGT=0;dbSNPBuildID=134
-1 58814 rs114420996 G A . PASS ASP;G5;GMAF=0.0982632541133455;KGPilot123;RSPOS=58814;SAO=0;SSR=0;VC=SNV;VLD;VP=050000000004050010000100;WGT=0;dbSNPBuildID=132
-1 59040 rs149755937 T C . PASS ASP;KGPilot123;RSPOS=59040;SAO=0;SSR=0;VC=SNV;VP=050000000004000010000100;WGT=0;dbSNPBuildID=134
diff --git a/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf b/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf
deleted file mode 100644
index fbe8d1e..0000000
--- a/src/test/resources/htsjdk/variant/diagnosis_targets_testfile.vcf
+++ /dev/null
@@ -1,117 +0,0 @@
-##fileformat=VCFv4.1
-##DiagnoseTargets="analysis_type=DiagnoseTargets input_file=[/humgen/gsa-hpprojects/GATK/data/Validation_Data/CEUTrio.HiSeq.b37.chr20.10_11mb.bam] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/humgen/gsa-hpprojects/GATK/data/Validation_Data/DT-itest.interval_list] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/1kg [...]
-##FILTER=<ID=BAD_MATE,Description="the reads are not properly mated, suggesting mapping errors">
-##FILTER=<ID=COVERAGE_GAPS,Description="absolutely no coverage was observed at a locus, regardless of the filtering parameters">
-##FILTER=<ID=EXCESSIVE_COVERAGE,Description="more than -maxDepth read at the locus, indicating some sort of mapping problem">
-##FILTER=<ID=LOW_COVERAGE,Description="there were less than min. depth bases at the locus, after applying filters">
-##FILTER=<ID=LOW_MEDIAN_DEPTH,Description="interval has insufficient median depth across samples">
-##FILTER=<ID=NO_READS,Description="there are no reads contained in the interval">
-##FILTER=<ID=PASS,Description="the base satisfied the min. depth for calling but had less than maxDepth to avoid having EXCESSIVE_COVERAGE">
-##FILTER=<ID=POOR_QUALITY,Description="more than --maxFractionOfReadsWithLowMAPQ at the locus, indicating a poor mapping quality of the reads">
-##FILTER=<ID=REF_N,Description="the reference base was an N, which is not considered callable the GATK">
-##FORMAT=<ID=AVG_INTERVAL_DP,Number=1,Type=Float,Description="Average depth across the interval. Sum of the depth in a loci divided by interval size.">
-##FORMAT=<ID=FT,Number=1,Type=String,Description="Genotype-level filter">
-##FORMAT=<ID=MED,Number=1,Type=Float,Description="Median of depth distribution.">
-##FORMAT=<ID=Q1,Number=1,Type=Float,Description="Lower Quartile of depth distribution.">
-##FORMAT=<ID=Q3,Number=1,Type=Float,Description="Upper Quartile of depth Distribution.">
-##INFO=<ID="Diagnose Targets",Number=0,Type=Flag,Description="DiagnoseTargets mode">
-##INFO=<ID=AVG_INTERVAL_DP,Number=1,Type=Float,Description="Average depth across the interval. Sum of the depth in a loci divided by interval size.">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-##contig=<ID=4,length=191154276,assembly=b37>
-##contig=<ID=5,length=180915260,assembly=b37>
-##contig=<ID=6,length=171115067,assembly=b37>
-##contig=<ID=7,length=159138663,assembly=b37>
-##contig=<ID=8,length=146364022,assembly=b37>
-##contig=<ID=9,length=141213431,assembly=b37>
-##contig=<ID=10,length=135534747,assembly=b37>
-##contig=<ID=11,length=135006516,assembly=b37>
-##contig=<ID=12,length=133851895,assembly=b37>
-##contig=<ID=13,length=115169878,assembly=b37>
-##contig=<ID=14,length=107349540,assembly=b37>
-##contig=<ID=15,length=102531392,assembly=b37>
-##contig=<ID=16,length=90354753,assembly=b37>
-##contig=<ID=17,length=81195210,assembly=b37>
-##contig=<ID=18,length=78077248,assembly=b37>
-##contig=<ID=19,length=59128983,assembly=b37>
-##contig=<ID=20,length=63025520,assembly=b37>
-##contig=<ID=21,length=48129895,assembly=b37>
-##contig=<ID=22,length=51304566,assembly=b37>
-##contig=<ID=X,length=155270560,assembly=b37>
-##contig=<ID=Y,length=59373566,assembly=b37>
-##contig=<ID=MT,length=16569,assembly=b37>
-##contig=<ID=GL000207.1,length=4262,assembly=b37>
-##contig=<ID=GL000226.1,length=15008,assembly=b37>
-##contig=<ID=GL000229.1,length=19913,assembly=b37>
-##contig=<ID=GL000231.1,length=27386,assembly=b37>
-##contig=<ID=GL000210.1,length=27682,assembly=b37>
-##contig=<ID=GL000239.1,length=33824,assembly=b37>
-##contig=<ID=GL000235.1,length=34474,assembly=b37>
-##contig=<ID=GL000201.1,length=36148,assembly=b37>
-##contig=<ID=GL000247.1,length=36422,assembly=b37>
-##contig=<ID=GL000245.1,length=36651,assembly=b37>
-##contig=<ID=GL000197.1,length=37175,assembly=b37>
-##contig=<ID=GL000203.1,length=37498,assembly=b37>
-##contig=<ID=GL000246.1,length=38154,assembly=b37>
-##contig=<ID=GL000249.1,length=38502,assembly=b37>
-##contig=<ID=GL000196.1,length=38914,assembly=b37>
-##contig=<ID=GL000248.1,length=39786,assembly=b37>
-##contig=<ID=GL000244.1,length=39929,assembly=b37>
-##contig=<ID=GL000238.1,length=39939,assembly=b37>
-##contig=<ID=GL000202.1,length=40103,assembly=b37>
-##contig=<ID=GL000234.1,length=40531,assembly=b37>
-##contig=<ID=GL000232.1,length=40652,assembly=b37>
-##contig=<ID=GL000206.1,length=41001,assembly=b37>
-##contig=<ID=GL000240.1,length=41933,assembly=b37>
-##contig=<ID=GL000236.1,length=41934,assembly=b37>
-##contig=<ID=GL000241.1,length=42152,assembly=b37>
-##contig=<ID=GL000243.1,length=43341,assembly=b37>
-##contig=<ID=GL000242.1,length=43523,assembly=b37>
-##contig=<ID=GL000230.1,length=43691,assembly=b37>
-##contig=<ID=GL000237.1,length=45867,assembly=b37>
-##contig=<ID=GL000233.1,length=45941,assembly=b37>
-##contig=<ID=GL000204.1,length=81310,assembly=b37>
-##contig=<ID=GL000198.1,length=90085,assembly=b37>
-##contig=<ID=GL000208.1,length=92689,assembly=b37>
-##contig=<ID=GL000191.1,length=106433,assembly=b37>
-##contig=<ID=GL000227.1,length=128374,assembly=b37>
-##contig=<ID=GL000228.1,length=129120,assembly=b37>
-##contig=<ID=GL000214.1,length=137718,assembly=b37>
-##contig=<ID=GL000221.1,length=155397,assembly=b37>
-##contig=<ID=GL000209.1,length=159169,assembly=b37>
-##contig=<ID=GL000218.1,length=161147,assembly=b37>
-##contig=<ID=GL000220.1,length=161802,assembly=b37>
-##contig=<ID=GL000213.1,length=164239,assembly=b37>
-##contig=<ID=GL000211.1,length=166566,assembly=b37>
-##contig=<ID=GL000199.1,length=169874,assembly=b37>
-##contig=<ID=GL000217.1,length=172149,assembly=b37>
-##contig=<ID=GL000216.1,length=172294,assembly=b37>
-##contig=<ID=GL000215.1,length=172545,assembly=b37>
-##contig=<ID=GL000205.1,length=174588,assembly=b37>
-##contig=<ID=GL000219.1,length=179198,assembly=b37>
-##contig=<ID=GL000224.1,length=179693,assembly=b37>
-##contig=<ID=GL000223.1,length=180455,assembly=b37>
-##contig=<ID=GL000195.1,length=182896,assembly=b37>
-##contig=<ID=GL000212.1,length=186858,assembly=b37>
-##contig=<ID=GL000222.1,length=186861,assembly=b37>
-##contig=<ID=GL000200.1,length=187035,assembly=b37>
-##contig=<ID=GL000193.1,length=189789,assembly=b37>
-##contig=<ID=GL000194.1,length=191469,assembly=b37>
-##contig=<ID=GL000225.1,length=211173,assembly=b37>
-##contig=<ID=GL000192.1,length=547496,assembly=b37>
-##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 NA12891 NA12892
-20 10000023 . T <DT> . PASS AVG_INTERVAL_DP=206.11;END=10001189 AVG_INTERVAL_DP:MED:Q1:Q3 68.95:69.00:57.50:80.00 67.11:69.00:54.00:80.00 70.05:74.00:58.00:81.00
-20 10002751 . T <DT> . PASS AVG_INTERVAL_DP=198.60;END=10021423 AVG_INTERVAL_DP:MED:Q1:Q3 69.75:74.00:61.00:81.00 64.78:69.00:56.00:78.00 64.07:66.00:56.00:77.00
-20 10094508 . A <DT> . PASS AVG_INTERVAL_DP=217.07;END=10096841 AVG_INTERVAL_DP:MED:Q1:Q3 76.65:75.00:69.00:83.00 71.52:73.00:65.00:80.00 68.90:69.00:63.00:75.00
-20 10098364 . G <DT> . LOW_COVERAGE;LOW_MEDIAN_DEPTH AVG_INTERVAL_DP=5.49;END=10098654 AVG_INTERVAL_DP:FT:MED:Q1:Q3 0.766:LOW_COVERAGE:1.00:1.00:1.00 0.880:COVERAGE_GAPS;LOW_COVERAGE:1.00:0.00:1.00 3.85:LOW_COVERAGE:2.00:2.00:6.00
-20 10153007 . G <DT> . PASS AVG_INTERVAL_DP=61.42;END=10153151 AVG_INTERVAL_DP:MED:Q1:Q3 25.07:24.00:19.00:29.00 16.37:15.00:11.00:25.00 19.99:17.00:14.00:27.00
-20 10199324 . T <DT> . LOW_COVERAGE;LOW_MEDIAN_DEPTH AVG_INTERVAL_DP=28.87;END=10199468 AVG_INTERVAL_DP:FT:MED:Q1:Q3 5.12:LOW_COVERAGE:3.00:1.00:7.00 9.19:LOW_COVERAGE:9.00:4.00:13.00 14.56:PASS:14.00:10.00:19.00
-20 10267798 . T <DT> . PASS AVG_INTERVAL_DP=79.25;END=10268380 AVG_INTERVAL_DP:MED:Q1:Q3 32.66:29.00:20.00:50.00 22.02:19.00:11.00:37.00 24.57:21.00:10.00:39.00
-20 10375592 . G <DT> . LOW_MEDIAN_DEPTH AVG_INTERVAL_DP=18.73;END=10376174 AVG_INTERVAL_DP:FT:MED:Q1:Q3 8.29:PASS:8.00:2.00:14.00 5.42:PASS:5.00:3.00:7.00 5.02:POOR_QUALITY:4.00:2.00:7.00
-20 10528943 . T <DT> . PASS AVG_INTERVAL_DP=206.86;END=10566288 AVG_INTERVAL_DP:MED:Q1:Q3 72.22:72.00:64.00:81.00 66.76:68.00:59.00:76.00 67.89:69.00:59.00:78.00
-20 10655065 . T <DT> . LOW_COVERAGE;LOW_MEDIAN_DEPTH AVG_INTERVAL_DP=9.86;END=10655136 AVG_INTERVAL_DP:FT:MED:Q1:Q3 0.931:COVERAGE_GAPS;LOW_COVERAGE:1.00:0.00:1.00 3.01:LOW_COVERAGE:3.00:2.00:3.50 5.92:PASS:6.00:5.00:7.00
-20 10958482 . C <DT> . PASS AVG_INTERVAL_DP=93.29;END=10958626 AVG_INTERVAL_DP:MED:Q1:Q3 22.12:19.00:15.00:28.00 32.63:34.00:28.00:37.00 38.53:37.00:34.00:41.00
-20 10999884 . A <DT> . COVERAGE_GAPS AVG_INTERVAL_DP=125.93;END=11000174 AVG_INTERVAL_DP:FT:MED:Q1:Q3 44.32:COVERAGE_GAPS:61.00:0.00:74.00 41.63:COVERAGE_GAPS:47.00:0.00:68.00 39.98:COVERAGE_GAPS:48.00:0.00:70.00
diff --git a/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi b/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi
deleted file mode 100755
index 722375b..0000000
Binary files a/src/test/resources/htsjdk/variant/ex2.bgzf.bcf.csi and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/ex2.vcf b/src/test/resources/htsjdk/variant/ex2.vcf
deleted file mode 100644
index 17b1896..0000000
--- a/src/test/resources/htsjdk/variant/ex2.vcf
+++ /dev/null
@@ -1,23 +0,0 @@
-##fileformat=VCFv4.1
-##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta
-##contig=<ID=20,length=62435964,assembly=B36,md5=f126cdf8a6e0c7f379d618ff66beb2da,species="Homo sapiens">
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##INFO=<ID=HOMSEQ,Number=.,Type=String>
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-##FORMAT=<ID=CNL,Number=.,Type=Integer>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-20 14370 rs6054257 G A 29.1 . NS=3;DP=14;AF=0.5;HOMSEQ;DB GT:GQ:DP:HQ:CNL 0|0:48:1:25,30:10,20 1|0:48:8:49,51:. ./.:43:5:.,.:1
-20 17330 . T A . q10;s50 NS=3;DP=11;AF=0.017;H2 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3:4,5
-20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4:10,20
-20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 ./.
-20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
diff --git a/src/test/resources/htsjdk/variant/serialization_test.bcf b/src/test/resources/htsjdk/variant/serialization_test.bcf
deleted file mode 100644
index 8c84efb..0000000
Binary files a/src/test/resources/htsjdk/variant/serialization_test.bcf and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/serialization_test.bcf.idx b/src/test/resources/htsjdk/variant/serialization_test.bcf.idx
deleted file mode 100644
index 4d6699e..0000000
Binary files a/src/test/resources/htsjdk/variant/serialization_test.bcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/structuralvariants.vcf b/src/test/resources/htsjdk/variant/structuralvariants.vcf
deleted file mode 100644
index 5ffad2f..0000000
--- a/src/test/resources/htsjdk/variant/structuralvariants.vcf
+++ /dev/null
@@ -1,22 +0,0 @@
-##fileformat=VCFv4.2
-##INFO=<ID=END,Number=1,Type=Integer,Description="End position of the variant described in this record">
-##INFO=<ID=END_CHR,Number=A,Type=String,Description="End chromosome of the variant described in this record">
-##INFO=<ID=IMPRECISE,Number=0,Type=Flag,Description="Imprecise structural variation">
-##INFO=<ID=SVLEN,Number=A,Type=Integer,Description="Difference in length between REF and ALT alleles">
-##INFO=<ID=SVTYPE,Number=A,Type=String,Description="Type of structural variant">
-##INFO=<ID=STRAND_1,Number=1,Type=String,Description="Strand Orientation of SV Start">
-##INFO=<ID=STRAND_2,Number=1,Type=String,Description="Strand Orientation of SV End">
-##INFO=<ID=METHOD,Number=1,Type=String,Description="SV Caller used to predict">
-##INFO=<ID=DP,Number=1,Type=String,Description="combined depth across samples">
-##ALT=<ID=DEL,Description="Deletion">
-##ALT=<ID=DUP,Description="Duplication">
-##ALT=<ID=INS,Description="Insertion of novel sequence">
-##ALT=<ID=INV,Description="Inversion">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=AO,Number=1,Type=Integer,Description="Alternate Allele Observations">
-##contig=<ID=1,length=14640000>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1
-1 20 . N <DUP> 1 . IMPRECISE;SVTYPE=DUP;END=4641652;END_CHR=1;STRAND_1=-;STRAND_2=+;SVLEN=4641632;METHOD=LUMPY;DP=90 GT:AO 1/1:90
-1 33 . N <DUP> 1 . IMPRECISE;SVTYPE=DUP;END=2640388;END_CHR=1;STRAND_1=-;STRAND_2=+;SVLEN=2640355;METHOD=LUMPY;DP=3 GT:AO 1/1:3
-1 70 . N <DEL> 1 . IMPRECISE;SVTYPE=DEL;END=4641583;END_CHR=1;STRAND_1=+;STRAND_2=-;SVLEN=-4641513;METHOD=LUMPY;DP=1 GT:AO 1/1:1
-1 101 . N <INV> 1 . IMPRECISE;SVTYPE=INV;END=1988714;END_CHR=1;STRAND_1=-;STRAND_2=-;SVLEN=1988613;METHOD=LUMPY;DP=2 GT:AO 1/1:2
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict
deleted file mode 100644
index 8dd3e5b..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at HD VN:1.0 SO:unsorted
- at SQ SN:chrM LN:16571 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ SN:chr20 LN:1000000 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:b4eac854d70893986ac578c53c2324f1
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta
deleted file mode 100644
index 9b75d10..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta
+++ /dev/null
@@ -1,16946 +0,0 @@
->chrM
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTT
-CGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTC
-GCAGTATCTGTCTTTGATTCCTGCCTCATTCTATTATTTATCGCACCTACGTTCAATATT
-ACAGGCGAACATACCTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATA
-ACAATTGAATGTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
-AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCAAACCCCAA
-AAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTAGGCGGTATGC
-ACTTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTA
-ATCTCATCAATACAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCA
-TACCCCGAACCAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCA
-AAGCAATACACTGAAAATGTTTAGACGGGCTCACATCACCCCATAAACAAATAGGTTTGG
-TCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAAGCATCCCCGTTCCAGTGA
-GTTCACCCTCTAAATCACCACGATCAAAAGGGACAAGCATCAAGCACGCAGCAATGCAGC
-TCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAAT
-AAACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACC
-GCGGTCACACGATTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCC
-CCTCCCCAATAAAGCTAAAACTCACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAG
-ACTACGAAAGTGGCTTTAACATATCTGAACACACAATAGCTAAGACCCAAACTGGGATTA
-GATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATCAACAAAACTGCTCGCCAG
-AACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATCCCTCTAGA
-GGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATA
-TACCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAA
-AGACGTTAGGTCAAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCC
-AGAAAACTACGATAGCCCTTATGAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTG
-AGAGTAGAGTGCTTAGTTGAACAGGGCCCTGAAGCGCGTACACACCGCCCGTCACCCTCC
-TCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCATTTATATAGAGGAGACAA
-GTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTAGCTTAACA
-CAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACC
-TAGCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAAT
-AAAGTATAGGCGATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGA
-TGAAAAATTATAACCAAGCATAATATAGCAAGGACTAACCCCTATACCTTCTGCATAATG
-AATTAACTAGAAATAACTTTGCAAGGAGAGCCAAAGCTAAGACCCCCGAAACCAGACGAG
-CTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCAAAATAGTGGGAAGATTTA
-TAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGATAGAATCTT
-AGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAG
-TCCAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATT
-TAACACCCATAGTAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACC
-CACTACCTAAAAAATCCCAAACATATAACTGAACTCCTCACACCCAATTGGACCAATCTA
-TCACCCTATAGAAGAACTAATGTTAGTATAAGTAACATGAAAACATTCTCCTCCGCATAA
-GCCTGCGTCAGATCAAAACACTGAACTGACAATTAACAGCCCAATATCTACAATCAACCA
-ACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGAAAGGTTAA
-AAAAAGTAAAAGGAACTCGGCAAACCTTACCCCGCCTGTTTACCAAAAACATCACCTCTA
-GCATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACC
-CTAACCGTGCAaaggtagcataatcacttgttccttaaatagggacctgtatgaatggct
-ccacgagggttcagctgtctcttacttttaaccagtgaaattgacctgcccgtgaagagg
-cgggcatgacacagcaagacgagaagaccctatggagctttaatttaTTAATGCAAACAG
-TACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATTAAAAATTTCGGTTGGGGC
-GACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAGTCAAAGCG
-AACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAA
-CAGCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGAT
-CAGGACATCCCGATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCT
-ACGTGATCTGAGTTCAGACCGGAGTAATCCAGGTCGGTTTCTATCTACTTCAAATTCCTC
-CCTGTACGAAAGGACAAGAGAAATAAGGCCTACTTCACAAAGCGCCTTCCCCCGTAAATG
-ATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGAACAGGGTTTgttaagatgg
-cagagcccggtaatcgcataaaacttaaaactttacagtcagaggttcaattcctcttct
-taacaacaTACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGC
-ATTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAA
-CGTTGTAGGCCCCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAA
-AGAGCCCCTAAAACCCGCCACATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGC
-TCTCACCATCGCTCTTCTACTATGAACCCCCCTCCCCATACCCAACCCCCTGGTCAACCT
-CAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAGCCGTTTACTCAATCCTCTG
-ATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGCAGTAGCCCA
-AACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGG
-CTCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATC
-ATGACCCTTGGCCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTT
-CGACCTTGCCGAAGGGGAGTCCGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGG
-CCCCTTCGCCCTATTCTTCATAGCCGAATACACAAACATTATTATAATAAACACCCTCAC
-CACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCCCTGAACTCTACACAACATA
-TTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAACAGCATACCC
-CCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCT
-AGCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAAC
-CTAAGAAATATGTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACC
-CCCTTATTTctaggactatgagaatcgaacccatccctgagaatccaaaattctccgtgc
-cacctatcacaccccatcctaAAGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCC
-GAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCTGGCCCAACCCGTCATCTAC
-TCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTTTTTACCTGA
-GTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCT
-CGTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTT
-CTAATAGCTATCCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACC
-AATCAATACTCATCATTAATAATCATAATGGCTATAGCAATAAAACTAGGAATAGCCCCC
-TTTCACTTCTGAGTCCCAGAGGTTACCCAAGGCACCCCTCTGACATCCGGCCTGCTTCTT
-CTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCAAATCTCTCCCTCACTAAAC
-GTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGAGGTGGATTA
-AACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATA
-ATAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATC
-CTAACTACTACCGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTA
-TCTCGCACCTGAAACAAGCTAACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCC
-CTAGGAGGCCTGCCCCCGCTAACCGGCTTTTTGCCCAAATGGGCCATTATCGAAGAATTC
-ACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCACCATCACCCTCCTTAACCTC
-TACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATATCTAACAAC
-GTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATC
-GCCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTT
-AGGTTAAATACAGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTG
-CAACAGCTAAGGACTGCAAAACCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTA
-ATTAAGCTAAGCCCTTACTAGACCAATGGGACTTAAACCCACAAACACTTAGTTAACAGC
-TAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCCGCCGGGAAAAAAGGCGGGA
-GAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGAAAATCACCT
-CGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTC
-AGCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCAC
-AAAGACATTGGAACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCT
-CTAAGCCTCCTTATTCGAGCCGAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCAC
-ATCTACAACGTTATCGTCACAGCCCATGCATTTGTAATAATCTTCTTCATAGTAATACCC
-ATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAATAATCGGTGCCCCCGATATG
-GCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTCCTACTCCTG
-CTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTA
-GCAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTA
-GCAGGTGTCTCCTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAA
-CCCCCTGCCATAACCCAATACCAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCA
-GTCCTACTTCTCCTATCTCTCCCAGTCCTAGCTGCTGGCATCACTATACTACTAACAGAC
-CGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGGAGACCCCATTCTATACCAA
-CACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCAGGCTTCGGA
-ATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGT
-ATGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATA
-TTTACAGTAGGAATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATC
-GCTATCCCCACCGGCGTCAAAGTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATG
-AAATGATCTGCTGCAGTGCTCTGAGCCCTAGGATTCATCTTTCTTTTCACCGTAGGTGGC
-CTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGTACTACACGACACGTACTAC
-GTTGTAGCTCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATCATAGGAGGC
-TTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATC
-CATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGC
-CTATCCGGAATGCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATC
-CTATCATCTGTAGGCTCATTCATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATT
-TGAGAAGCCTTCGCTTCGAAGCGAAAAGTCCTAATAGTAGAAGAACCCTCCATAAACCTG
-GAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGAAGAACCCGTATACATAAAA
-TCTAGACAaaaaaggaaggaatcgaaccccccaaagctggtttcaagccaaccccatggc
-ctccatgactttttcAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAA
-TTATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACG
-CTACTTCCCCTATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTT
-TCCTTATCTGCTTCCTAGTCCTGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTA
-ATACTAACATCTCAGACGCTCAGGAAATAGAAACCGTCTGAACTATCCTGCCCGCCATCA
-TCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTACATAACAGACGAGGTCAACG
-ATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACGAGTACACCG
-ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCG
-ACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTA
-TAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAA
-CAGATGCAATTCCCGGACGTCTAAACCAAACCACTTTCACCGCTACACGACCGGGGGTAT
-ACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAG
-AATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCT
-ACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTTAAAGATTAA
-GAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCA
-TAATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAA
-ACTACCACCTACCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAG
-AACCAAAATGAACGAAAATCTGTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACC
-CGCCGCAGTACTGATCATTCTATTTCCCCCTCTATTGATCCCCACCTCCAAATATCTCAT
-CAACAACCGACTAATCACCACCCAACAATGACTAATCAAACTAACCTCAAAACAAATGAT
-AGCCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTTAATCATTTT
-TATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACT
-ATCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCGCAGTGATTATAGGCTTTCG
-CTCTAAGATTAAAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTAT
-CCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGT
-ACGCCTAACCGCTAACATTACTGCAGGCCACCTACTCATGCACCTAATTGGAAGCGCCAC
-CCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCATCTTCACAATTCTAATTCT
-ACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCACACTTCTAGT
-AAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTA
-AAACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTA
-GCCATGTGATTTCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACA
-CTAACCATATACCAATGGTGGCGCGATGTAACACGAGAAAGCACATACCAAGGCCACCAC
-ACACCACCTGTCCAAAAAGGCCTTCGATACGGGATAATCCTATTTATTACCTCAGAAGTT
-TTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACCCCCCAA
-CTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAAGTCCCACTC
-CTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTA
-ATAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTC
-TATTTTACCCTCCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGC
-ATCTACGGCTCAACATTTTTTGTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGC
-TCAACTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACAT
-CACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGTAGATGTGGTTTGACTATTT
-CTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGTACCGTTAAC
-TTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTA
-ATAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTC
-AACGGCTACATAGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCC
-CGCGTCCCTTTCTCCATAAAATTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTA
-GAAATTGCCCTCCTTTTACCCCTACCATGAGCCCTACAAACAACTAACCTGCCACTAATA
-GTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAGTCTGGCCTATGAGTGACTA
-CAAAAAGGATTAGACTGAGCCGAATTGGTATATAGTTTAAACAAAACGAATGATTTCGAC
-TCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTA
-GCATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTA
-CTATGCCTAGAAGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAAC
-ACCCACTCCCTCTTAGCCAATATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAA
-GCAGCGGTGGGCCTAGCCCTACTAGTCTCAATCTCCAACACATATGGCCTAGACTACGTA
-CATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCAACAATTATATTACTACCAC
-TGACATGACTTTCCAAAAAGCACATAATTTGAATCAACACAACCACCCACAGCCTAATTA
-TTAGCATCATCCCCCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCC
-CAACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTAC
-CCCTCACAATCATGGCAAGCCAACGCCACTTATCCAGCGAACCACTATCACGAAAAAAAC
-TCTACCTCTCTATACTAATCTCCCTACAAATCTCCTTAATTATAACATTCACAGCCACAG
-AACTAATCATATTTTATATCTTCTTCGAAACCACACTTATCCCCACCTTGGCTATCATCA
-CCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACATACTTCCTATTCTACACCC
-TAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCCTAGGCTCAC
-TAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACT
-TAATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACT
-TATGACTCCCTAAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAG
-TACTCTTAAAACTAGGCGGCTATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGA
-CAAAACACATAGCCTACCCCTTCCTTGTACTATCCCTATGAGGCATAATTATAACAAGCT
-CCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCATACTCTTCAATCAGCCACA
-TAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCGGCGCAGTCA
-TTCTCATAATCGCCCACGGACTCACATCCTCATTACTATTCTGCCTAGCAAACTCAAACT
-ACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCAC
-TAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTA
-ACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCC
-TACTTACAGGACTCAACATACTAGTCACAGCCCTATACTCCCTCTACATATTTACCACAA
-CACAATGGGGCTCACTCACCCACCACATTAACAACATAAAACCCTCATTCACACGAGAAA
-ACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACCCCGACATCA
-TTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACA
-ACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCC
-CCATGTCTAACAACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTA
-GGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATAACCATGCACACTACTATAAC
-CACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACCACCCTCGTTAACCCTAACAA
-AAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCATCCACCTTTATTATCAGTCT
-CTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAACTGACACTG
-AGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAAT
-ATTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATAT
-AAACTCAGACCCAAACATTAATCAGTTCTTCAAATATCTACTCATTTTCCTAATTACCAT
-ACTAATCTTAGTTACCGCTAACAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGG
-AATTATATCCTTCTTGCTCATCAGTTGATGATACGCCCGAGCAGATGCCAACACAGCAGC
-CATTCAAGCAGTCCTATACAACCGTATCGGCGATATCGGTTTCATCCTCGCCTTAGCATG
-ATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAACGCTAATCC
-AAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGG
-TCTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCA
-CTCAAGCACTATAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGA
-AAATAGCCCACTAATCCAAACTCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGC
-AGCAGTCTGCGCCCTTACACAAAATGACATCAAAAAAATCGTAGCCTTCTCCACTTCAAG
-TCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAACCACACCTAGCATTCCTGCA
-CATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTCCATCATCCA
-CAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCT
-CACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGG
-TTTCTACTCCAAAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGC
-CCTATCTATTACTCTCATCGCTACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCT
-TCTCACCCTAACAGGTCAACCTCGCTTCCCCACCCTTACTAACATTAACGAAAATAACCC
-CACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCCTATTCGCAGGATTTCTCAT
-TACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTACCTAAAACT
-CACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAAC
-CAACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATT
-CTACCCTAGCATCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCT
-GCCCCTACTCCTCCTAGACCTAACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACA
-GCACCAAATCTCCACCTCCATCATCACCTCAACCCAAAAAGGCATAATTAAACTTTACTT
-CCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAATCACATAACCTATTCCCCC
-GAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAACCACTACTA
-ATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTG
-ACCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCA
-CCCCATCATACTCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAA
-CACTCACCAAGACCTCAACCCCTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCG
-CTGTAGTATATCCAAAGACAACCATCATTCCCCCTAAATAAATTAAAAAAACTATTAAAC
-CCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCGACCACACCGCTAACAATCA
-GTACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACCCCATTACTA
-AACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGA
-CCAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATAC
-GCAAAATTAACCCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCAT
-CCAACATCTCCGCATGATGAAACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAA
-TCACCACAGGACTATTCCTAGCCATACACTACTCACCAGACGCCTCAACCGCCTTTTCAT
-CAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATCATCCGCTACCTTCACGCCA
-ATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCCTATATTACG
-GATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAG
-CAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAG
-TAATTACAAACTTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCT
-GAGGAGGCTACTCAGTAGACAGTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCT
-TACCCTTCATTATTGCAGCCCTAGCAGCACTCCACCTCCTATTCTTGCACGAAACGGGAT
-CAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATCACCTTCCACCCTTACTACA
-CAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACATTAACACTAT
-TCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCC
-CTCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCC
-CTAACAAACTAGGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCC
-CCATCCTCCATATATCCAAACAACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTT
-ATTGACTCCTAGCCGCAGACCTCCTCATTCTAACCTGAATCGGAGGACAACCAGTAAGCT
-ACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATACTTCACAACAATCCTAATCC
-TAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTCCTTGTAGTA
-TAAACTAATACACCAGTCTTGTAAACCGGAGACGAAAACCTTTTTCCAAGGACAAATCAG
-AGAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTC
-TCTGTTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAAC
-AACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAA
-TACTTGACCACCTGTAGTACATAAAAACCCAACCCACATCAAACCCCCCCCCCCCATGCT
-TACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCA
-CCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAA
-GTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCC
-CCTCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTG
-CTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGAC
-ATCTGGTTCCTACTTCAGGGCCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAG
-ACATCACGATG
->chr20
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-NNNNNNNNNNNNNNNNNNNNGATCCAgaggtggaagaggaaggaagcttggaaccctata
-gagttgctgagtgccaggaccagatcctggccctaaacaggtggtaaggaaggagagagt
-gaaggaactgccaggtgacacactcccaccatggacctctgggatcctagctttaagaga
-tcccatcacccacatgaacgtttgaattgacagggggagctgcctggagagtaggcagat
-gcagagctcaagcctgtgcagagcccaggttttgtgagtgggacagttgcagcaaaacac
-aaccataggtgcccatccaccaaggcaggctctccatcttgctcagagtggctctagccc
-ttgctgactgctgggcagggagagagcagagctaacttcctcatgggacctgggtgtgtc
-tgatctgtgcacaccactatccaaccgatcccgaggctccaccctggccactcttgtgtg
-cacacagcacagcctctactgctacacctgagtactttgccagtggcctggaagcacttt
-gtcccccctggcacaaatggtgctggaccacgaggggccagagaacaaagccttgggcgt
-ggtcccaactcccaaatgtttgaacacacaagttggaatattgggctgagatctgtggcc
-agggcctgagtaggggagaagctcccactctcagaacactgagaaaagtgaggcatgggt
-ttctgggctggtacaggagctcgatgtgcttctctctacaagactggtgagggaaaggtg
-taacctgtttgtcagccacaacatcttcctaagggagccttgtgtccgggaaaaactgac
-agaccagtgatctgggtgcagaaggcttgagacaaaactagctggttgggccagctatgg
-ggcaaatgctggaaagaaacctggtcagggagcctgagctgagtggtccccacagtcatc
-tgcttggcaagaaaccctaggtcgcaggtgctagaccagctgcacacccacagcaacact
-gccatgcccaggatcctctgcccttgatcctgaatcaacagaccacttgcagatatactt
-cacagcccacgctgactctgccaagcacagacaaccactgggccccaggggagctgcagg
-tctcctggtcacctaatcttttttttttttatactttaagttttggggtacatgtgcaca
-acgtgcaggttacatatgtatacatgtgccatgttcatgtgctgcacccattaactcgtc
-atttaacattaggtatatctcctaatgctatccctcccccctccccccaccccacaacag
-gccctggtgccatggaatactatgcagccataaaaaatgatgagttcatgccctttgcag
-ggacatggatgaagctggaaaccatcattctcagcaaactatcaaactatcacaaggaca
-aaaaaccaaacactgcatgttttcactcataggtgggaattgaataatgagaacacatgg
-acacaggaaggggaacatcacacatcgggacctaatcttaagctaagtgtggctaagagc
-ctatctgctggcctttactattaagcactgcccactggattgcagcctgaattacaccgc
-caaacaaatactgtttcagcatacattaccagtgaaacccaatgcaggaacatagtcaaa
-aataaacacctggcatagagacttggccctctgaaaacacccagaaaaaagccagctata
-ttcaacatacatcactgtcaaaatatcaaggaaaatgaagaagaataaaacaaaaagtca
-aaaccaaatgataggaacttcaaaaagataaagtaacaccagctgtcttagatgagaaag
-aatcagcacacattcttgcaattcaaaaagtcagaatgtctccttacctccaaacaatca
-tactagctctcatcagattgaaatggctgaaatgacagacatagaattcatgatctggaa
-ggtaaggaagctcaagaacattcaggagaaagttgaaacccagtccaaggaagccagtaa
-agcaatccaagagtacagagataacatagccattttaagaaagaaccaaaagaaacttct
-gcaattgacaaattcattataggaattttgtaatacattcagaagcattaacaacagaat
-agatcaagttgaggaaagaatctcagagctcaaagatcagtcctttgaatcaacacagtc
-agacaaaactaaagaaaaaaatttaaaaataaaacctctaaaaaaatatggaattatgta
-aagataccaaacttacaacttatgggcattcctgaaagaggagaaagaataagtaacttg
-gaaaacatatttgaggatagtccatgaaaatttccccaatctccctagagaggctgacat
-gcaaattcaagaaatgcaaataacccctgtgagataactacaagataactatccccaaga
-cacatagtcataagattctccaaggtcaacgtgaaagaaaaaaatcttaagggcagctag
-agaaaagcctgaggtcacttatgaagggaagctcatcagactaacagcagacttctcagc
-agaaaccttacaaaccaagcaagattaggggcctatttttagcatccttaaagaaaagaa
-atttcagtgaagaattccatatcctgcaaaactaagcttcataaaagaaggagaaatagg
-ctgggcatggtggctcacacctgtaataccagcattttgggaggctcaggcaggaggatt
-gcttgagctcaagagtttgagaccagcctgggcaacatggcaaaaccctgtctcttctaa
-aaatacaaaaattacctgggcAAGACTCCATCACAAACAAACTAACAAACCAAAActatc
-aggtactatgctcactacctgggtgacaaaatcatttttacaccaaacccagtgacaagc
-aatttacccatgtaacaaacctgcatgtgtatcccctgaacctaaaataaaagttaaaaa
-aaaaagaaCTTTCATCAACatttcttgcagtgaaggtatgttagtgatgaacattctctg
-cttttattgcctgaaaatatctttattttgtattcatatttgacatatattctcactggg
-cataaaaattctaaattacaagtttttccccttttttgtattaaaaatttcattccaata
-tcttTCATATTGCCTTATTTGTAATGATGCCTTCTATCCTTCTTATCTTTGTTCCATTTA
-TAAGAAGTGTTCCCCAACCCCAGACTGATTAAAACCATTTTTTTAATTAAAAAAGCAAAA
-GAAAGAAACATTTTTATCTGAAGCTGTCTCAGACTCAGACACCACCCAATCTTCAGATTT
-CAAATAGCTTATACTCAAACATTTGGTAATATCAGCCCCTTAATGGTCTTCCTGGAGGGC
-AGATGCATTCTAGAGATGAGAACACGATCATGATTACGAATGCTACCACCACTACGAACG
-CACAAAAGTCACTGGTGTGATCCTTTCTCAGAACACTGTGGTAACTTCTGGACATTCTCT
-GCTGTTATCATTGCTTCTTCCTTCTGGGTTTTTTTCCCCCTTATATGGGCAGATAATTTT
-CTCCATTGGAATGAAAAAGTCTTGCTTCATGCTCTTtaactgtgtgaccttgggcgtatt
-actttactttggggcaaaccattttccttcttgaggaccaaatgtgctcttttataaaac
-gagcagttagaattagattgtctctctggacacggcttatgttgacaacctggatcacAT
-TAGAGGATCAcactgagacctttatgtcggcctcagttcctccatctgtaaagtagaggt
-tgggcttagattatAGATGATAAAGACACCAACTTTCctggaaaggattctggaaaggat
-tctgAACTTAGGCTCAGCCTCAGTAAGAAGGAGTTCTGTGATTAAACAGGGATGCCCACA
-CATCAGCAACAGAAATGGGCAGGTCAACCATGTATGCTGTGCCTCAGTGAAGATTTTATG
-CTATGCTGTGCATTTGATATCCATTCTCTATATTTGATATCCAATCTAAGATTATCTAGA
-AGGTCCTTTCCAAGACACTGATGAGATACATCTGTATAAATATATAACTCAGGATGAAAG
-CAACTTTTAACATTTAGCGTGTGCCTCTGCCTCTGATCTGATTACAGCCCACAGAGAAAT
-ATAAACAATACACAATACAGGCTAATGAAGAAGGGTGATAAGAtttttttttttttttga
-gacggaatttcactcttgtcacccaggctggagtgcaatggtgcaatcttggctcactgc
-aaccttcgcctcccggttcaagcgattctcctgcctcagcctcctgagtagatgggattg
-gaggtgcccaccaccacgcccggctaatttttgtattttttagtagagacagggtttcac
-catgttgtccacgctggtctcgaactcctgacctcaggtgatccgccagcctcagcctcc
-caaagtgctaggattacaggtgtgagccactgcaaccggccAAGGGTGATAAGattttaa
-aaatttatttaaaataCAGAAATTTCAAAAAGAGAGAAGTGCAGTGATAGCAAAATTGAT
-GCAAACTGTGCAAGCATGAAATCTATTTTATAGCTGAATCTACTTTTCTTGGTCCCAAGA
-TTCTATTTCCATTGGTTTTCAAATAGTTAATTCTATTGTTTTTTCAGGGAGATTACTAAA
-ATCACTAATAATTATTTTCCTACTGACACAAAATCTAAAAAGCACCATATAGACCTTCTC
-TCTCCATCTCCCCTTATCCTTATGTCACCTTACCCTACCCCAATACTCCAATGGCAGAGT
-ATCTACCCATGGCAGAGTAGAGAATATGTACACTAACAAAACCAGATGCACAGAGGTGGG
-GTATCCATCTCTGACTTGGCTGAGCTAGTCTAAGGAAGGAAGGCTCTGTGGCCATTGTCC
-TTGGAAGTCATTCTCACAGGTTGGTGGTATTCTCAAGTAGGTGGTGCTTGAGTGGCCCAA
-GAGCACCCACATGCTGCTATGCATTTTTCTGACAACCTCTTTATGATCTCTGACTTTGGC
-AGATCATCTTGCATCTCTCAATTGGAGAGTCACTTTTCTTATCTCCACAGAAAATTCTTA
-ATCAAGCTCCTGGTTTTCCTTTATAGCTTCTACTTTTTAAACTCACTTCTCCAACTTCAC
-CGCTACATCTCTGACAGATGAGAACATTAGAGATTCCCTGTTTTTCAAAAACAAAACAAA
-ACTCAGCAAAACTATAAATATACTAAGGGTAAGTCTGTATTATCTCCTGCCAAAATACAC
-CACCCTGCATTTTTTTAAATttttatcttttgtaggtacatagtaggtgtctatatttgt
-ggggtacatgagatgttttgatacaagcatgcaatgcataataaccacatcatggaaaat
-ggggtatccatcccctcaagcatttatcctttgtgttacaaattatctaattatacttta
-ttattttaaaatgtacaattaaattatttttgactatagtcacctcgttatgctattaaa
-taccaggtcttattcattctttctaactattttttgtacccagtaaccatcctcaccttc
-ccacacacgcccaccacctttcccagcctctgataaccatccttctactctctatctccc
-ttgaattcagtagttttgatttttagatttcacaaataagtgagaacatgcaatatttgt
-ctttatgttcctggcttatttcacttagcataatggcctccagttccatccatgttattg
-caaatgacagcatctctttcttttttatggctgaataatactccactgtgtataagttcc
-acattttctttatccactcatttgttgattgacacttacgttgcttctaaatcttggcta
-ttgtgaatagtgctgcaacaagcacaggtgtgcagatatctattcaatattcttatttcc
-ttttggaggggagtgtgtacctagcagtgggattgctggattgtatggtaactctatttt
-cagtttttttaggaacctccaaactgttctccatagtggttgtactatcttacgttcaca
-ccagtagcatacaagggtttccctttctccaaatccttgccagcatttgctattgcctgt
-cttttggataaaagccattttaactggagtgagatgatattccattgtagcttgattttc
-atttctctgatgatcagtgattttgagcaccttttcatctgcctgtttgccatttgtatg
-tcttcttttgagaatatctattcagatactttgcccatttttaagttggatcattagatt
-tttttcctatagaattgtttgagctctttgtatttcctgttattaatcccttgtcagaag
-ggtcgtttgcaaatattttctcccattctgtgggttgtcttttcactttgttgattgtgt
-gctttgctgtgcagaagctttttaacttgatgtgatcccatttgtccatttttgcttcga
-ttgcctttgtttgtgggttgctactcaagaaatttttgtccaaacatcctggagagattc
-cccagtttcttatagtagtttcatagtttgagatcttagctttaagtctttaatccattt
-gacttaatgttttgtatatggtgaaagacaggggtctagtttcattattctgcatatgga
-tatccagttttcccagcaccattttttaaagagactgtttttcccccaaagtatgttctt
-ggcaactttgtcaaaaatgagtttactgtagatgtgtggacttgtttctgtgttctctat
-tcttttccattgctctatgtgtctgtttttatactagtaccatgctgttttggttactat
-agctttgtagtataatttgaagtgaggtaatgtgattcctctagttttgttctttttgct
-taggatggctttggccatcctgcatttttAAcccttttcccattttcacccagaatactc
-gctggtggcacttgcagctgcagggtttaccctgagataactttgccacaaaatatctcg
-cctttattattattttcacatcgttctaatatatcgactttgaaaacacaaatcatcatt
-ctatttatagcatcttgttgttagcagtggtatttccatttacaaaatatagaaattctt
-gatcgctgaaaatgtcaaattctagaaagcatagcattcccatgttaacattgttctcaa
-acagttttgggccaaagagtcatttaatgaatccggttttttccaaaatagatgattctg
-attattcagatgattctgatgttagttctgtttaaaaataattccaagaacagtttgtat
-attttattttcacactgaacatcagtcagcctccagagcatgttaatgtaaaattaaatg
-aacatgggcagtgagctgcagttttttttctaaacagTGCAGCTGTTTAGAAAATTTTTT
-TAAAATTTTCCTGATTTCCTTGGTATTAAACATATGTGGGAGAAATACAGCTCAGCAAAC
-TCTTCCAGGAGATAAAATGCTGATCACTCCTACTGGGCAATTTCACAAATGTCTCCTATA
-TTTTTCTCCTTTGGTAGTGGGGATGGGGGGCATAATGTTACATTGGGCctctctcctctc
-tctctttctctctccctctcCTTTTAAAATGTTTCCTCTCTCTCAATATTTCATTTCTTA
-TTTGTATTTCTGAATGAGGGAAAAGAGTTGATGGGACAGCGGAACGGGAAAAAGAAGAGC
-ACCAATAAAACCTGTTTTCCTGTTTTCACTATTTTCATTCCAAATTCCTTCTGTCTCATA
-ATTGATGGAATCTTATGAACTTATTAGTTAAAAAGTGTCTTTCTTGTTTCACAGGAATTC
-ATATCGGGGTGATCACTCAGAAGAAAAGGTGAATACCGGATGTTGTAAGCTATTGAACTG
-CCACAAGTGATATCTTTACACACCATTCTGCTGTCATTGGGTATGTACAAAGTGCTGCAT
-ACAGACAGAGGAGAAGGACAATTGAGCCCATCTAAAGTTAACAAAAACTTCCTCTTGGGG
-CTGTTTCTTTCCATCAGACCTTACAGTTCTACGGGATAATAGCTTATCTCATAAGGCCTC
-AGCTTTCTTTAATAATTTCTAGAAGCAGACGTTATTGTGTCATGCACACTCAGTGTTGCA
-AATTAATGGTCTGGTGATCTGGGTGGCATGGCATTTTCCCCTTCTCTGGTTCATCACCCA
-TGATAGACCAGTAAAGGTGACCACTTAAATTCCTTGCTGTGCAGTGTTCTGTATTCCTCA
-GGACACAGAGCTTCCTCTCTCCCAGGAGCCATGAATATCCTGATGCTGACCTTCATTATC
-TGTGGGTTGCTAACTCGGGTGACCAAAGGTAATGGAACCCTATAAAGCAGAGATGATGAC
-TAGGATGAGTTGTTGCCCTTGGGCTCCCCTGGTATCATGATGGGAAGAGAGGGAATCTGC
-AGGAAAAATCTGGGCCAACAAAGAGCAGCAGAATGCTCTTATTTTGGCAGCTCCATGCCC
-CTAGTCTCTGAGAATCTTTCTGTTAGGGGCATCTAGCAAGCTGGGATGTCCTCTGAGGCA
-TTTCTCCAAAGACAAGAATTTCCTTAATGCTCTGAGCCACCCTATCTGTCTCTCTACATA
-ACTATCCAATGTTAGTTCAGCCTCACTTCACTTCCATTTCGATTATTCTGTTGTATCTAT
-TTCATTGTTGTGTCCTATTAGTTCTCCTACCATCTTGAATTCTTCTTTGCCCGGAGGGTA
-CCTTCAGAGGGAGGCCCTCACTTTCATGTTCTTAGATATGGTGAACAAGTCCATTGACAG
-TTTGTAGATTCTGTAGCACTATCATATGGAAGAGACAATATATATGTTTGGGGTAGAAGT
-GGAAATAAGTGGAGTGAAGACAGGATAGACAGACTAGTGACCAATGGGGAGCTTCTAATT
-TTAGATGAATAGGAACAGTCTGTTTCCACTATTTAATAATGCTACTTTTGAAAATTGTTA
-ACTTTTTATTAAAAAATAATACTTGCAATTGACTTATGTATCAAGCAATCGATGGATTTA
-TAGGGTTTAAGGAAAAGAAAAATGTTTGTCTGTCCAAGAATACCAGTTCTTCAGTCTTCC
-CCTTCAGAATCAATCAATGTTACCAATTTCTTATATATCCTAGCAAATACAAATATATTT
-ATATTTGCATGTGTATACCTTTTAGATTTTTAAAAAATGCAATTGCAAATGCACCATGTG
-AATTGTTCTGCAATGTACTAGCAATATATTAGAGACATCTTATCCATACATAAACCTAGT
-TCATTATTTTTAATCGATAAGTAAAACTTTGAGGAGGAGCAGATGAATTGCCTCACATTA
-ATTACTCCGCTACTGATGAAAAATAGGTCTTTAATTATCAAAAACAATTCAGCAAGAAAA
-ATTTGTAAACAAATGTATGTCTTTTCATTTATGACTGGACACGTGGacacacacacacac
-acacacacacacacagtcaaaccacctaccagaaaagctgaactattcttctctcctatc
-accagttgcaagagtgtcagcttcccacaccctcatcagtcctttttgttttttctacta
-cattcagttttctactacattcagttttacagtctaatatgtgaaaatgatgtcctgatg
-tttgaattcatgacactttagttataaatgagtttgaacatccagtccattagatttcta
-aactttcttAATTATCTTTATATACTAAGAAATTTGGCTTTTGTTAAATTTGGAGGTGTT
-ATATGTTGCCTAGAAAGATGCTATTCATGTCTATTAAATGGTTATAACTGTGCCTATGAT
-CTGTTATGTCTTGATTCACATGTTGATGTAATGTGAGTTACAGAATTAATATCTACATTC
-ATTTCTGATTATAAACTGCTGTATTTGTTGAAAATTTGGAAATTTTGAAATTGTAAAGAA
-GTAAAAAAATTGTAAAGAAGTTAAAAGAGACAAAATATTTTTGATCTATTGTTCTTCCTC
-AGTTTTCTTATTTGAATAAAAATGTATAGCATACTTATAAATTTTCTATTATACTATTAG
-TATTTTCCCATTTACTATTTTCAAAAACTGTATTTCCAATGACTGTATAAATTTTATAGA
-ATGGATACTGTTTAAATTACTTAGCCAAATTGTTTTTGCATAAATAAGTGCATTTACATT
-TTATAGACAAGGATGGCTAGTATAACCTTTCTTATACATAAATCATTCAGCATAAAATTC
-CTGGAGATGTACTTTTTTCTGTCTGCTTCATGTGTTATCAATTTTTGAATACTTGCCAAG
-TCCtaaaaatgaaatattatatataaatatttaatttttatttatGTCTGTGAGTAATGG
-GGAAGTCGAACTTCAAATACATGCTTAATGTATATTTAACTTTTCTACAAATTGTCTATG
-TCTCTCTTTCTCTTTTATTTTGGAGAGGTAGTTTTCATTTCTTTTGATTTAGAGATTTTC
-ATTTTTGTGTTCTCTTATAGGTTTTGTTTTGAAATTTAGCTATTTAGTCTCTCTGGGCTT
-TATATTATGTGTTTTCAAGTGAGATAGCACCTGATGGCTTGTGAAGCAACTTTTTACCAA
-GCCAAGCTATCAGTGGACTGGTATCCATAGATATATtttaagttgatgctagctgattat
-atatctggtatgttttagaaagaactccacacatgggataatgttttggctagatggctc
-cCCTACTTAGAAACATACAATTGCTAGTCATATTTCTAATTTTAGGATTTCGAGATACTG
-GTGATGAAGATCACATGTCCTAACAACATAATAGTTCCAGACTGAAGTTCTTTGAAAAAA
-ATGACTGTTGTCACTTTAGAAAAAAAAAATTATGAATTATTCCcaattgccatcattcta
-ctgctaaaaccaaattcttggaattatctatgatttttctatatcctatgacactcatat
-ctatcaggaagtctattacatctgcctgcaaattatatccagaatgcaattattctcgcc
-acctccattgctgccactctgattctagtcaccatcatctctcacctgtgttattgccat
-agcttcctcatgagatctgtccttctgctcttccctgccaccatcttgtgaagacacata
-gtgcatgatccgcttacactggaagtcagatcatgtacttttgctcaaaactctgctatg
-gccccctctatactcagagcggtaacaagagtccatacagtggctcacctggccctgcag
-gatctggcccttatgacctctctcacctcatctcctactattatagtccttgttcactcc
-actacagccacacaagccccagtgctcttccccaaacatatcagacttactcaacccata
-gagctttgtttgtttcctctgcctagaatgtacttgcctcagatactggtgtgactaatt
-cctttacctccttcaagctgtttaatcatcaccttgttacacaggcttgtgcaactcctg
-tttatgaatcttctattacccttaaatctattctcccttctttctgcaaaccatttgtca
-ccttttcatctacaaaataatgtacttttttattAAGGTAAAATATACATTTAAAAATTA
-CCATCCTTACCATGTTTTTACCATatttttatgtatacctgatggctgtttgtatgtctt
-ctgttgagaaatgtctattcaaatcttttgcctgttttaaaatcagattatttgtttttg
-tttgctatggagttttttgagctccttatattaatatactttttgttgttaattcctcgt
-cagatggatagcttgcaaatattttctcctactctgtgggctacatcttcactttgttga
-ttatttcctttgctgtgcacaagctttttagtttgatgtaatcctaattgcctatttttg
-ctttggttgcccgtgcttttgaggtcttacccaagaaatctttgccaagaccaacgtcct
-gaagtgtttccctaatgtttttttcaggtagttccatagtttcaggtcttagatttaagt
-ctgtaaAACCATACAGTCTAGCAGGGAGTGCatttactttttattatctgtctccctctg
-ctagaaagtcagctccatgtgatttttgtctgtttagttcacagatgtacctcaagggcc
-caggatagtgcctgtgccatagtaggggcccaaaactttgatgactgtgtgaCTATAGCC
-TAATTTAAGAATGGAGGGGATAATTTAAAAGCAGTAGGAAGGAATGTAAGTGAGAAACAA
-TTTTGAAGAATAATTGACAGAACAAGGCGATTCAAAGACAAAGGAGAAGAAGAGAGCCAA
-GATGACATATTTCAAGTATGGATAATGCTGGAGGAAAAAAATTAAGATATAAATCTTTGT
-AGATGTGAGGAACGAAGAAGCAAGGTTAGAGTCTGTCTTGCACAAAAGAAGTGGAAGGTC
-TAGACTTGAAACTTATAGAAAATTCCACGAAGTACAAAGTAAAATCGAGCCAGTAAAATA
-ACAAAGATAGAATAAATGACTCTAGAGGAGTGAAGGTAGAATAAATAATTGGTGAAGCTG
-GACTAGAGCCAACATTTCCCAGAGGATAAAATATAAACCAAATTATTGTGAGCCTAatat
-atacatacatacatacatctatatatgttttatatatatTATCACATTAAGTTCAAATAA
-GGTTGTTTAGAAAATTActtgctcttctgcacatataccaggcttcctcctccatagagc
-cttatctctagctgcttcctctgcctagaatacacttATCTAGGTACTCCTTGGGCAATT
-GTCTTGAGAAAGATGATCATGCCGTTTACTgcttgataaatgaacatacaatgcagcaca
-ctagtttccctttagatttatatcctcacccctcaaatgagtagtcacactgcttggaaa
-tcctactgcatttctcttgtaaatgaaccttccttcttttttttttttttttgagacaga
-gtctttctctgtcaccaggctggactgcagtggcccaatctcggctcattgcaaccgcca
-actccctggttcaagtgattctcctgcctcagcctcccgagtagctgggatcacaggcat
-gtgccaccacatccagctaatttttatatttttagtagagacaggttttcaccaggttgg
-ccaggatggtctcgatctcctgaccctgtgatccaccctcctcggcttcccaaagtgctg
-ggattacaggtttgtaccaccacacccagccatcttccctcttttttagacaactatttt
-gtcctgacctttatttgtcttttattttcctgctcctctcctctacatggctctccccct
-cagtttatcccatgccccatttatttaaacaattcaaataggaagttttcactcatttcc
-tctgtcccctttgccataaatggagaaacgtgtcttctccatctaaagatcagtctgctc
-tgtgtgaatttgtgactatgcccttctgtcatctcatcaccctattctatattaatctct
-ccttttctgcttttttttttttttttttgagatggagtcttgctcttgttgcccaggctg
-gaatgcagtggcacaatcttggcttactgcaaccttcgcctcccaggttcaagtgattct
-cctgcctcagcatcctgagtagctgggactacaggtgctcgccaccatgcccagctaatt
-tttgtattttttagtagagacagggtttcaccatggccaggctggtctcgaactcctgaa
-ctcaggtgatctgcccgcctcgatctcccaaagtgctgggattacatgtgtgagccactg
-cgcccagactgcttgtctcttttctcattgcttgcaagcaccatttggtatttctcgttc
-ttcaaaacaaacctgaaagctttcccttaaccttacattgctctctaacaagttatttat
-ttctctgcttttctttggatctaaacttcttaagagtttcatctacaggtcctgcattca
-cttctctctcattcacattttgaccaactgcaatttggtttcttttttcataccactcgg
-aagctgctctcctcagtatgaagttaccttcatactactaaaagcatggacattttcctg
-ccttcatcatttttttttaacctctcagcagtatttgactacaaaatgaccactctgtcc
-tttaagaaacagtctcctctcctgCTTAATGTAGTCACATCTGATACAACTTTCCCCATA
-ACCTTTTATGCATTTTCTGTTTTCATGCATATCAGCCCAACTTGCAATTGTCAGTATCTC
-CAGTCTTTCAACAACTGCTTGTGAAATACCCCTGTACAGGGCAATCCAGAAATGCCAGAA
-AATTATCAGCTGTCTCTGGATCATCTGTCAACTATGGGGGAAGCTGGATAAATAGTCCAG
-GTCCTTTGAGCCTCATGTAGAATAACTTTGAGGCTTGGTAATATTTTTTTTTTCCTGTGG
-TAATTCCCTTATTTGCAGTTCAAGGCTATTATGGGAAGAAAACATAAATGGATGTTAGTT
-CTTCAAGGTTTTTACTGTAACTGTGCACCCTTTCATTCTTCAAGGTTTTTCTGTAACACT
-GCACCTTCAGGACCTGATGCCCAATTAAACATTTTTTTAAGTTTTTTGGTTTTTTTTTAA
-TAAAAACTAAATGCTATTTTTTCttctacttttagttgatgtgtaataattgttcatatt
-tagaagatgcagagtgatattttgatacatgtatacaatgtgtaatgatcaaatcagggt
-aattagcatatctatcacctcaaacatttgtcatttttttatattgggaacattcagaat
-cgtctcttctagctatttgaaaatatacagtaaatgattgttaactaccgtcaccctaca
-gtgctatagaacagtggaccccttttggcaccagggaccagttttgtggaagacagtttt
-ttcgacgaggtgaaggtggtggtggggatggtttcaggatgaaactgttccacctcaggt
-catcaggcattagagtctcacaaggaacacacatcctagatccctcacatgcacagttca
-caatagggttcatgctcctatgagactctaatgccttggctgatctgacaagagatggag
-ctcaggtggtgatgcttgcacacctgctgttcaccttttgctgtgcagcctggttcctaa
-caggccatggaccagtacccattggctgcccaggggttggggacccctgctataggatgc
-tggaactttttcctcctatctaggtgtaattttctatctgttaaccaacctctctctatc
-ctcctttcccttcccagcctctagtaatcattattctacagtctacttctatgaactcaa
-cttttttagctcctgcttatgaatgaaaacatgtggtatttatctttttgtgtctatttc
-acataacggaatgtaacatgtcccccaggctcatccatgAGTCTGAGGCTTATTTGTAGC
-CTGGCTGCTGGGCTTCCCTGTGGGATTGTCCTCTGAGCAAACAGAACACAGCCATCCTGC
-TGGCCAGCAGTTGATAGATGATCTCATGATAATAACAGGTTATAACTCACCTTTTCTTGG
-ATTTCTTGCTTTCCTGATTTCTACATTTCTCCACTGATTTTTTTTAAGGAGGAATTGTCT
-CTCAACTAAACTATTATATTCAAATCTTTGCTGGAGCTCTGCTCTGCTGGGGGTCTGCTT
-TAAGACTCTAGAGTCTTattctcctgttttgatctgacttatcttattggtccttttaag
-tcgtttcctcttatctgatctcttatctcttaatattgaaactcactagaatttaattct
-agtcctctttttttctcatattattccaacccaccatggtttaccaatttctgtacttta
-aatgctatccataagcaatcacatttattgatttgcatatgtcgaaccaaccttgcattc
-caaggataaaggctacttgatcgtagtggataagctttttgatgtgctgctggattcagt
-ttgctactattttgttcaggatttttgcactgatgttcatcaaggatactggcctgaaat
-tttttttttcttgtgtctctgctaggttttggtctcaggatgatgctggcctcatagaat
-aagttaaagcggagtcctgccttctcaattttgggtgaatagtttcagtaggaatgatac
-cagctcttctttgtatatctggtagaattcagctgtgaatccatctggtcctgggctttt
-CATTTTCATCCTTTCTTTCTAGGTTTCGTATCAGTCTCAGTATGctctctctctctccgt
-ccctctctttttctacatttctccttttctcCATACAACTTCTTTGATGGCACATAGCAC
-AATTTTAATATACACTTTTTGTTCTCCTGTTTGTCTCTTACAATGGCTTTTTGTATTTGA
-CATCATATTAGTCTAGATGTCAGTCAGTGTAAATTTTTGAATGAATGAAAAGTTGTTATG
-TTGATGCCAGAGTTAAAAATTTGACCTATATTTTATTCTCTACAGGTAGCTTTGAACCCC
-AAAAATGTTGGAAGAATAATGTAGGACATTGCAGAAGACGATGTTTAGATACTGAAAGGT
-ACATACTTCTTTGTAGGAACAAGCTATCATGCTGCATTTCTATAATATCACATGAATATA
-CTCGACGACCAGCATTTCCTGTGATTCACCTAGAGGATATAACATTGGATTATAGTGATG
-TGGACTCTTTTACTGGTTCCCCAGTATCTATGTTGAATGATCTGATAACATTTGACACAA
-CTAAATTTGGAGAAACCATGACACCTGAGACCAATACTCCTGAGACTACTATGCCACCAT
-CTGAGGCCACTACTCCCGAGACTACTATGCCACCATCTGAGACTGCTACTTCCGAGACTA
-TGCCACCACCTTCTCAGACAGCTCTTACTCATAATTAATTAACATTTACTTCTGGTATGG
-AACAACTAGAAATACTGCTGGAAATAATATCCAAAGAGCTGATTCTACCAATCCAATTTC
-ACCAGGAAAATTCCATCAGGGATTGGATGACCATGGGGATGGACATAATTGCTACTACCA
-ACACAACAGCCAAGAGAGTTGCCTTACAATTAGAAATGTGTAGACAGAAATGTATAGAAG
-ATACAAGGATTCTCTTAATTGGACTTAAATTCTTTATCTGTCTTCCTCCGATGTACTCAA
-ATATATGAGCTAATTTTTGTCTTAAGTGAACATTTGTATATCTATGTATTTTTCCATGCC
-AAAAACAAAAACGAAGACCATTGTTTGGAGCTGCCTCTTATGACTAAGACAAGAATTTTT
-ACTTTAACAGTGCCTGGCCCACTACTATCGTATATAGGAGAACATATAAAAGCATATAGA
-AAGTTCCAGATGAATGTTCCCTTCTCTACCCTCCACCTTTTATTGTAAGTTCTGACCCTA
-AATACTTTTCTGTGTCATGACGTCAAATTTTGTTTAAGGTTCTAGCTGGTAACTAACAGA
-GTCAGAAGCTAATTCTTTCATTCAACACAAGCACTGATCTAACTGGATAGAGATAAAAGT
-GGGACTTGCCTTGAGAGTACATCATATTAAATTAAAAGCTGCATCTCAAATTCTACTTAT
-CTTTCCAATCTTCTTTCCACTTAGAATTCCAACTTCCAAGTATGGCAGCCTCATAACATG
-CCTCTTCAGGTCTCTGTGTTGTCCATGAATGTTAGTTGTGTGCAGTGTTTCTATGCTTTG
-TATGGCTGTACGCATGTGACTGCTGTTTGTATGGCAACAGGTGGGTCAGTAAGTGTCTTC
-TATGATACTACAGAGAAGCGGTTATTAACTATAAAGTTGATTAGGttttttttttttttt
-gagacagagtctagctctgtcgcccaagctggagtgcagtggcatgatctcggctcactg
-caagctctgcctcctgggttaacgccattctcctgcctcaggctcccgagtaactgggac
-tacaggcacccactaccacacctggctaattttttgtatttttagtagagaggggtttca
-ccatgttagccaggatggtctcgatctcctaacctcatgatccatccgccttggcctccc
-aaaatgctgggattacaggtgtgagctactgtgcccggctGATTAttattttttttaagt
-tccaggatagaagtgtagaacatgtaggtttgttacataggtatacatgtgccatgatgg
-tttgctgcacctatcaacgcatcatctaggttttaagtcccgcatgcattagctatttgt
-cttaatgctctgcctccccttccccacacaccctgactggcccccatgtgtcacgttccc
-ctccctgtgtccatgtgttcttattgttcaattcccacttatgagtgagaacacgtggtg
-tttggttttctgttcctgtgttagtttactgaagatgatggcttcgagcttcatccatgt
-ccctgcaaagagcatgatctcattcctttttatggctgcatagtattccatggtgtatat
-gtaccacattttctttatgcagtctatcattgatgggcatttgggttggttccatgtctt
-tgctattgtaaatagtgctgcagtaaacatacgtgtgcatgtgtctttataatagaatga
-tttatattcctttggatatatacccagtaatgggattgctgggtcaaatggtatttctgg
-ttctacatccttgaggaatcgccacactgtcttccacaatggttgaactaatttacattc
-ccaccaacagtgtaaaagtattcttatttctccacagccttgccagcatctattgtttct
-tgactttttaataattgccattctgactggcatgagatagtatctcattgtggttttgat
-ttgcatttctctaatgatcagtgatgttgagcttcctttcatacgtttgttggctgcata
-aatgtcttcttttgagaagtgtctgttcatatcctttgcccactttttgatgtttttttt
-ttcttgtaaatttaagttcttgtagattctggatattagacctttgttagctgggtagat
-tgcaaagcgttcctcccattctgtaggctgcatgttcaccctgatgatagttttttttgc
-tgtgcagaagctctttcatttaattagatcccatttgacaattttggcttttgttgcaat
-tgcttttggtattttcttcatgaagtctttgcccatgcctatgtcctaaatggtattgcc
-taggttttcttctagggtttttatggttttgggtattacatttaagtctttaatccatct
-tgagttaatttttgtataaggtgtaaagaaggggtcccgattcagttttctccatatggc
-tagccagttttctcagcaccatttattaaatatggatcaaattcacacataacactatta
-accttaaatgtaaatgggctaaatgccccaattaaaagacacagactggcaaattggata
-gagtcaagacccattggtgtgctgtattcaggagacccatcacacatgcaaagacacaca
-taggctcaaaataaagggatggaggaaaatttaccaagcagatagaaagaacaaaatagc
-aggggttgcaatcccagtctctgacaaaacagactttaaaccaacaaagatcaaaaaaga
-caagagcattacataacggtaaagtgatcaattcaacaactagagctaactatcctaata
-tatatgcacccaatacaggagcactcagattcataaaacaagttcttagaggcctacaaa
-gagacttagactcccacacaataatagttggagactttaacactcagtgtcaatattaga
-cagatcaatgagacagaaaattaacaaggatattgaggacttgaactcagctctggatca
-agtggacctaatagacatctacagaactctccaccccaaatcaacagaatgtacattcgt
-ctcagtgccacatgacacttattctaaaatcgaccacataattggaagtaaaacactcct
-caggaaatgcaaaagaactgaTTAGTTATTAATAAATTGGGCTGAGGCTTGGGCGCTACT
-GAAAGCCACAATATCAGATGCCAGAATGTCTCAAAATCAAAAAGGTTTTTTCCTCTAATT
-ATTTTTTATGTGATCCAAGCCAAGCTGCCAGTGACTATGGCTGTAGTTTGGATGTTGACC
-ATCAGACCACTGACCTTTCAGTAGACCTCATATTCTAATAGGTCTTAGACCACCAGTtag
-ggtgtccatcattcagatttgattgggactgaggggcttcccagaacatgggaattagag
-agctaaaatcaagaaaatccagagtaaattgggacaagttgatcaccctCACTTCAGTGT
-ACTTCTGTCTAGCAAGCTATTTTTCCATTTTTCATGGCTATACCTCATCACATAGGTCAT
-ACATTGGCTTTTCACAGAATCAGTCTAGGGTGCTCTTTTTCCATATTTTTGCCTCAACTG
-TCATTTCCTGAAACACACTCCTTGAGCATGCAGAACACCTTCCATTCTACTTTGTATTAT
-TTTCTTCCCATCATTTGAACTCTGAAATCATTTTGAGTATTTACTCTCTCTCTGATTTTT
-TTTACTAACTTATGGCCTAACACCCCTGCTATAATGTACATATAGTCCTCATCTCTTGgt
-cttgttgacctatgtgatccaaactgcaagaacagtgcgtcacacatgagaaatgctcaa
-taaaaatttgAGAACAAATTATTCAGGCAGTTATCTTAATATATATGAGAAGGTTATATA
-ATATAAAAcagtagtcttcaaactgcaatactggttacaaaaagatttttcaagctatac
-atattgatagtttaaaggaataaaatttcagaccctcaagttccaaatttcttatgatgt
-tttggagcattcttaacaggctcttcttttataactccaatttctcaattttccttctcc
-cactctgaaaagaaaacttacctctcacccaccctttatctgacaatcatggattgccct
-gagtgaacaaacctccagtggacaattgaaatactagtgctggTattcagaaagtgaata
-atcatagactttgaataaaaatcctttggaaataaaagtgtttttaatttttttgtttac
-aaaagcaatgatggggtgtcaatcaagttgatggttaatattaaatagatctttgaagat
-aaactttaataatagcctactatgaaattttttagcatatcacttggaagaggttaaaag
-aactgtgtaaacattagagtcttatgttcaaagagatttcacaataagctacaatgtatg
-tctatgttttgtcacagagaaatgtgatagaatgattaataaaagacttgcaaacacaaa
-aatatagtacattaggatcaaattttgcagagaagtttgaataaaaactaaagttttaaa
-aagaaaaaagatacaatgttcccaattgctaaaaaagagcttctttgcatatttattaaa
-tgaattattgtgattagcaaattgtcatgcattcatattccattggatgtatttagtatt
-tagttgttacatgtcaatatttgtaatatgctattagttatctttttatgattaaaattt
-aagatgaaatagtttatttcccaattttaaattgtattgggaaaatacacactttATTTT
-TATACCTAGCATAGACTTTTTGTTCCTTCTAATTGGAAAAAGGCTTTGCAATTTGCAATT
-GGTATATGTGTGACTTCTAGAAATGTGGTGTTCTttttttgttttttgtttttttgtttt
-ttttgagatggagtctcactctgtcgcccaggctggagtgcagtggcgccatctcggctc
-actgcaagctctgcctcccgggttcacgccattctcctgcctcagcctccctagcagctg
-ggactacaggagcacgccgccatgcccggctaatttttgtatttttagtagagacggggt
-ttcaccctgttagccaggatggtctagatctcctgacctcgtgatccgcccaccttggcc
-tcccaaagtgctgggattacaggtgtgagccaccgcgcccggccCAGGAATGCTCTTAAC
-CACTTCATCAAGCATCAAGGTTGGCACTGTCTAGATGTTGGTTTTGATTGCCAACCTACA
-AAAGAAAAGGGAAATTATAAAAGAGAAAATTAACAAGTGAGTACAGTTTCAAAATCTGTC
-CTGCAAATGTGTTTTAAACCAAAGAAATCATCTTTGGCATGGGCTATTTGCTTTATAGTC
-ATTCAGAATTGCTTGGTCTCTGTCTCCTGAAGACTGTGGCTAGGATTATTCCTGATGAAT
-GAGAAAGTTACCATAAATCAAAAATAAAATGAATAGAAAACTTAACAGTTGACTCTCAGA
-AGAAGGTATCTTCCCTCACTTTGCACTGGTtatatatatatatatacacacacatacata
-taATTGTATAATATGTATTAttttataaattgatttagaaggtacaagtgttgttttctt
-atatgcatatattacatagtggtgaagtctgggcttttagtttagccatcacccaaatag
-tgtacattgtacccattaagtaatttctcatttcttagcccccttctacccttccaagtt
-tccagtgtctattacccactccttatgtccatgtgtatacttagtttccacttgtgagaa
-catgtagtatttgactttctgtttctgagttatttcacttcagataatgAAAACATTCAC
-TTCAGATAATGAAAACACACTTTTCAAAATTCAAAGAGGTTTGAAAAGCTCATGGCCTAA
-TACCCCCACTATAAATTTTATTTTTAAACTGTTCATACTCCTAGAATGAACAGAGGCTTC
-AAACACTATCTGGTATAAACTGATGATGATTCTTCTACTACTGTGATCATTCTGTTTTTC
-TATGATTCCTGGATTTTCCTTTTCCATGAATGTGGGCTTTGCAGCATAACTTCTAGTTTG
-TTTATATCATTGCCCTTTAGGATCTCCTGTAGGCTCAGTAATCTATCACTTCCCTATATG
-GGACTGACCTCCAAATTACTGACTTTATATGTTCTCTCTCTCTCTCTCTCtgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTTAGTATTTGCATTTTG
-CCACATTCTTATATAGTTTCCAGCTCAAGTCTGAAATTCTCTACCtctttatctatgctg
-tccatattaggtatatgatttgataagttagacatgtgacatatatttcccccattctct
-gggttgttttttcattatatcaatggtgtcttttgaagtagagcagtttttaattttgat
-gaagttctcttttttaaaaacacttttctttttggtgtcatatctaagaaatcattccct
-aatttaaggtcataaaggcttattcttgtgttttcttctaagggttttagctttcacatt
-tagctgtacgatcctttttaatttaatttttttgtatgatgtaaggtaggggtccaaatt
-cattcttttgcatgtggctctccagtttctccaacactatttgataaaaagactatttac
-ccactgaattgtctggacacccttatagaaaatcaattaataataaatgtGataatttgg
-gcagatctttggagagaaagcaccaagagtggatggagaggcaacactgacaccaaagct
-gaagagagaggaagctggaatctctgcatgaggtgcctgaacattagggctagttcctga
-ccctgagtggctcctggggaaggggtaagtaaggggactaaggaacatcccgcttttgcc
-atggacctctgggatcatagctacagggtaccccatgtccctcatggatttgtaggctag
-cagggagcaggcagagacagggcttcagccagtgtgaagcccaggagcttttgtgcatgg
-ggcagctctggcagcgcatgaccgcaggtgcccatccccaagggctccccatcttcttct
-gagaggctgtagccccagctgactgctggacctggagagagtggcgccagctttgccatg
-ggactggggtgcatctgttctgcaggctctcctgcctgccagcccctcccatggcccctg
-cctagccaccctgcaggagcatgagcacagcacagcctccaccactaagccggagtgctt
-tgctccacctgagtacattcccagtaacctgggagcacttcagatccctcagtgcagctg
-gagcttgaccccaagccacagatcatccccgtgccccagggctgcagcacacagcttggg
-agcatgcagctgagatctgtggctgacaggcaagtagaggagaggcccccaatatcagaa
-cataaagggggcaagatgtgtgggttcatgggccagcttgggagcaaggtgtgcctccct
-ctgcagggttggtctggaaagggtgtggcccatctccctgccatggcctctgcccaagga
-agccccacagcctggaacacctaacgaaacacagaaatgatgccagtgatcagggtgggg
-tccctaaaggcccaagagcagatctggtgaggagttttctctcccactccactcaccata
-gaacatgcctgcaaatggaaggacatgcaaaagagctgagtaacagcctatgtaccagtc
-actacttaagcatcaatgactagatctcagccccaactacagcaccaaaaatgattctgc
-taatatacacccctgtgaaaccaagtgcaagactttgcccatacataaagatcctgtaca
-gagccacggacctctgaaaacatccagaaatgaactcaactgactatattcaacttacac
-cacatttaaaagaaaaccagcccccctcccaccagaagagaaagaatcaatgcaagaacc
-ccagcagttcaaaaagccagggtgtccccttacctcaaaatcagcccactatctccccag
-cagtggtccttaaccagactgaaatgacagacatagaattcagaatccaaatggcaagaa
-gctcattgagatttaggagaaagttaaaatccaatccaaggaatccagtaaaatgattca
-agagctgaaagatgaaatagccattttaagaaggaaccaaactaaacttctagaactgaa
-aaatttgctacaataatttcataatatgacagtataacagtattaacagaatagaccaag
-ctgaggaaagaatctcagagctcaaaggctggtccttcaaatgaacaaagtcagaaagaa
-aaaatctttaaaactgaacaaaaccaccaagaaatatgagattatgtacagaaacaaaac
-ttctgacacactagcattcccgagaggagggaaagagagtgaacagcttggaaaatatat
-ttgaggatatactccatgaaaatttccctaatctcactagagaggttgacatgcaaattc
-aagaaatacagagaaccccagctagataaaatacaacatgaccatcccaagaaacatagt
-catcagatttgccaaggtcagcatgaaggaaaaaaaatcttaaagccagctagaaagaag
-ggtcatgtcatatgtaaagagaaccccatcaggctaacaccagacctctcagcagaaacc
-tgacaaaccagaagagattaggggcctttttcagaatccttaaagaaaagaaattctaac
-caagaatttcaaatcccatcaaactaagcttaataaacaaagaggaaataaaatatttct
-cagacaagcaaatgctgaggaaattcatcacaaccagatatgcctccttacaagagattc
-ttaagggagctctaaacctacaatcaaaagaacaacacctgctacaaaaaaaaaaaaaaa
-aacatacttatgcacataaagacactataaagcaactacactatcaagtctacataataa
-ccagctaacaacacaatgacaggataaaaatctcgcatatcaatactaaccatgaatgta
-aatggactaaacaacccacttaaaggacacagtgtagcaagattgataaaaagacaagac
-ccaactatctgctgtctttaagagacctacctcacatgtaactacacccacaggctcaga
-gtaaagggataaagaaagatctgtcacacaaatggaaaacaaaaaagagcatgagttgtt
-attcttatatcagataaaacagactttaaatcaacaactatgaagagggacaaagaaggg
-cattacataataataaaggatacaattcagtgagaagacttaactgttgggcctggagag
-agtgggaccacctttgccatgggactggggtgcatctgttctgcaggccctcctacctgt
-agcccctccgaaggcccctgcctagccaccctgcagaagcatgtgcacagtgcagcctcc
-actgccaagcctgagtgctttgctccacctgaatatgtttatattctaaacatatatgtt
-cccaacattgaggcacccagattcataaaacaagttcttcttaacctataaaaagatgta
-gatagccatgcaataatagtgggagacttcaacaccctactgagagtgttagacaaatca
-ctgaggcagaaaattaaccaaaaaatcctggacttcaactcaacgtttgaccaactagac
-ctaacagacacctacaaaatattccacccaacaacaacagaatataacttccttcttctc
-tttggcacgtggaacatattccaagattgaccacatgctcagtcataaagcaagtctcaa
-taaatttaaaaaagtcatgctgagcccattctcaggccacagtttaataaaaatagaaat
-gaatatcaagaagatctcttaaaattacacaaatacatagaaatgctcctgatacctggg
-taaacatcaaattacagcagaaaattaaaaaattatctgaattttttattaaaataggga
-cacaatttaccgaaatatctgtgatacagccaaagcagtgttaagggaaatttatagtgc
-taaacgtcatcatcaagaagttagaaagatctcagattaaccatcaaagtttgcacctag
-aactagaaagaaaagaacaaaccaaccccaaagctagcagaagaaaaaaaaattactaaa
-attagaaaagaactgaaaaaaattgagatgcaaaattccatagaaaggaccaataaagcc
-aaaaggtggttttttgaaagaataaaaaaggttgatagactgctagctacataaccatga
-agaaaaaagaagaccaaaataaatacaataaaaaatgaagaagatgacattacaatgaat
-cccacagaaatacaaaagatactcagagatcattttgaacaactctatgcacacaaattg
-gaaaatctagaggaaatggataaattcctggaaatataaaacctcccaatattaaagcca
-aaggaacatgaaaacctgaacaatcaataaacaagttcctaaactgaatcaataataaaa
-acctaccagcccaaaaaaaccctggaagagatggattcacagcctaattctaccagacat
-aaaaagaactggtatcaattctactgaaactattccaaaaaaatctaggaggagaggctc
-ttccctaactcagtctatgaagccagcatcagccagataccaaaatctgtcagagacaca
-aataaagaaaacctcagaccaatatccctgattaacatagatgcaaaaattttcaacaaa
-atactaggaaaccaatcccagcaacagatcaaaaaattaatacatcagaatcaagtaggc
-tttattcctgggatgcaaggctggctcaatatatgcaaatcaataaatgtgattcaccac
-ataatcagaattaaaagcaaaaaaatatgatcatctcaatagatgcagaaaaggatttga
-aaacaatccaacgcaccttaatgataaaaacccacaacagactaggcactgaaggaacat
-accgtaaaataatgagccatctatgacaaacccatagccacgatcattctgaactggtaa
-aagccggaaccattccctttcagaactgcaacaagacaaggatgcccactctcaccatgc
-ctattcaacatagtactggaagtgctactagagcaatcaggcaagaaaaagaaataaaag
-gcatccaaataggaaaagaagaagtcaaactatccctcattgctgatgatatgattctac
-acctggaaaaccccaaatactctggcaagaggcttataatactgatgaacaacttctgta
-aagtctcaggatacaatatcaatgtcaatgtacatttctatacacaataaccttcaacct
-gagagtccaatcaagaacacaatcccatttataatagccataaaaaatgaaaatccctag
-gaatacagctaaccaaggaagtgaaaggtctccacaaggagaactacaaaatacttctgc
-aagaaatcagagatgacacaaataaatataaacaattccatactcatatatcaaaaagat
-caatgtcatttaaatggctatacattccaaagcaatctacagattcaatgctatttctat
-caaactacaaaaactgcttttcacagaattataaaaaaactattctacaattcatatgga
-atccaaaaagtacccaaatcaccaaagcaatcctaagcaaaaggaacaaagccagaggca
-tcacattatctgacttcaaactatattataaacccacagtaaccaaaacagctgatactg
-gtacaaaaataaacatatcactaatggaacagaatagacaacccagaaatgaagccacac
-acctacagacatctgatctttgataaagacaacaaaaataagcacagggaaaagaccccc
-tattcaataaacggtgcttgggtagctggctaaccatatgcagaagaatgaaagtggacc
-cctgcccttcaccatatataaaaattaactccacaaggattaaatatttaaatgtaagat
-cttaaactataagaatcctggaagaaaacctggaaatacccttctcaacatccacgttgg
-taaagaattcttggctaagtctccaaaagcaattgcaacaaaaacaaaaattggcaagtg
-ggacctaattaaactaaagagcttctacacagcaaaagaaactctcaacagagtaaacag
-acaacctacagaatgggagaaaatattcgcaaactatacatccaataaaggtctaatatc
-cagaatctataaggaaattaattcaataagcaaaaaaaaatcccattaaaaatgggcaaa
-agttataaacagacacttctcaaaagacatacaagtggccaaaaaacatgaagaattctc
-atcatcactaatcatcaaagaaaggcaaatcaaagcaattagataccatctcataccagt
-cagaatggccattattcaaaagtcaaataatagcagaagctagtgaagctgtagagaaaa
-ggaaacacatacactcttggtgggaacaaaaactagttctgccagtttggaaagcagttt
-ggagatttcttaaggaacttaaaaatagagctaccatttgacccagaaatctcattagtg
-ggtatctatgcaaaagaaaacaaatcattctaccaaaaagacacatgcagccctatgttc
-atcgcagcactattcccaatagtaaagacatgaaatcaacctatgtgctcatcaatcatc
-aatggtggattggataaagacaatgtgttacatattcaacatgaaatactatgcatccat
-aaaaaagaatgaaatcatgttttctgcagcaacatggatgcagctggagaccataattct
-aagcaaattaatgcaggaacagaaaaccaaatactgtatgttctcacttataagtaggag
-caaaacattgtgtagtcatcaacataaagaaggaaacaatagacaatgtggattactaga
-gggaggagggaggaaggggggcatgggctgataaactaactattgggtactatgctcact
-acccaagtgaaaggaaacataacccaaacgacagcatcacacaatatacccatgtaacaa
-acctgtacttgtatcccatgtatctaaaataaaagttgaagttataaagaaaaataagtg
-ttagagtttatttcttggctcacaattctactccattgttatatatgtttaGCTGTACTG
-Aggggtctccaagatcaccctcaagtttgatgactcactagaaaaactcaccagacctat
-aaaaacgattatactcatggttacagcttaatacagttaggagatacagattaaagtcag
-caaaggtaaaaggtgcacagagtgatgcctaggaaaaaacaggtatgagctttcagttgt
-actcttcctccagaatcacacgaatagaactcaattcttccaaccataaggtatgacaat
-aagtgcaaaatggtgccagccattttcagtgggagtcaatcacataagcatgaagcatcc
-ccaagactgaatttagctactcaatcttcagcccctaaccttaggagtcaagctaatacc
-gcttggcctgaagccccagtcatagaaaaaaatatatgatttattcaccataaatcacat
-tgttagcataaactatttggcatgggccaagtctcaggtatacaaagacactttatcagg
-caggataattaaagggctcagagattatctgccaggacctttgaaatatgcagggttagg
-acaaccccaaatcttctgagttaaccctttattacacaGTCCACCCCATACCCCTTAGCC
-TAGGCTGTCTTTCAGCAAAACAATTCTATATTTCTGAGCATCTACATTTAGTATAGCATT
-TATATAACAGATCTAGAAATAGTATCAGTATGAAGAAAGATCTCTAGTTATAGTAGATAA
-AATATAGCAGTGGAAGGCCCAGCATACCATGGTTGTGCTATGCTCAAAAACATTTGGAGG
-AGCTAGTGTGGGGTAGGGATAAAGATTTTAAAAACAACTAATCTATCTCATAAAGCCATT
-ACATACATTTTCATATTTTTGTACTGATTTGTTACTTGTTTCTCCCCTTGATCTACCACT
-TTAATCTTACAGCTGCAGAATTATTTAGCCTAGAAATTAGTTTATGGTTAACTAAATCCA
-ATTCTTCCTTAGGCTAGTCATTTTCCATTGGTAATACATCCTGAGGAGGCTTAACTCAAT
-CTCTCAATACATTTGATCATCAGTATCAGTACCATCCTATGACTTATTTAATAAGGTGGC
-TGAATCTTACCAACAATAATAGTGTCACACTGTATAGCAATATAGTCATGGAACAATTTA
-GTTTCATTCATAGAACAAATTAGTAAGGCTTACGTAAGTTTTGCTATGCCTTCCCAACAG
-AAACAGTCCTTGCTTATATACAAGATATACTTATGGACAAGCATTGTTATAATTGTTAGA
-ATGATTTGATTATTTCTGGCTTCCATGTCAACGGAGGACAAAGACAGCCACCCCGTTTTA
-GTTTTCAAGCTTGGACAGAGACTGGTTTCCATTGTGTGATTTTCTACAGCAGGACCTCCC
-CACCCTCCTATGGGAGGTCACAGGTGATATTCAGATAGCTTCAGTCCCTACTAACTGTAC
-TGCAGAATATGTCTTATTCTGAAGCTCTAATGGGGCAAGAATAATTTGTAGTGCATCAAT
-GCACATTTACAAATGCCCTGAGAGGTCTTTCATAAGTTTGAAGGCCCATGAGATTCCCAT
-AAGTGTGTCCCTTTTTCCTCAGCAACTAGGATGTAGTGCTATTTCCCCATGGTTACTTTG
-ACCTTCATCTGTAATTAAAACAGTCAAAAGGCACTGTTGGGTCAGGGTACAAGCCCTTTC
-CCAACGTTGGATCTTAGCATTATCTAGCATTATTTTTGAGTCTACTTGTTTCATTTTAAT
-AAAGCCTCATCACTTTCTCAGGATGACCCTCATCTTTTGCCTTCCTCCTAGAAAAGAATT
-CTCTCCAATCTGCTCATTTTAGTTCAGTAATATTTCCTCTAGACTTCACTAAAAGGGAAT
-TCAGCTTGTCCCATGATGCCTGAACTGACACCTAATGCCCCTAAAAAGTCTGTTTTATGC
-ACAAATGTAGTTTAATTCACCATGCATGTTGTTGGCATTGTATACTTATGGCCCAAGTGC
-AGTTAGCATATGTGGTTTTTACCCCAAAATGCGGGTTCTTCATATATAGATTAGATGAAT
-TGTAGTCAAACTAGATCTAATTTAGTTTTTAGTATGTTTTAATGCCTTTCATAATCTTTT
-TTGTCTCAGGGTGGGGCCATTACCCCAGGGGAATTCAAGTCACCGTGTAATGGCTACTGC
-TTTAATCCCATCATGTATTAATTGCCATTCTCTCttttttcaactttcattttagattca
-ggggatacatgtgcaagtttgttacctgggtatattgcatgatgctgaggtttgggatat
-gaatgattttgtcacacaggtctgagcatagtacccagtagttagtttatcaaaccttgt
-ccaccgcctacccagtagtacccagtgtctattgttttcatctttatgtccatcagtact
-caatgttcagcctccacttacaacatatggtgtttggttttctgttcctgtgttaattca
-cttagtattacaacatccagctgcatccatgttgctgcaaagagcataatttcattcttt
-attatggctgcatagtatttgatggtgtatatataacacattgtctttatccaatccacc
-atagatgggcatgtaggttgatttcatgtctttgctattgtgaatagtgctgtgatgagc
-tataactgcatctgtcattttggtggaatgatttgttttcttttgcatagatacccagta
-atgagattgctgggttgaatggtagctctatcattaagttccttaagaaatctccaaact
-gctttcaaactggctgaactaatttacattcccaccaagagtgtaaaaatgttcagtttt
-ctctgcaacctcaccaacatctgtttatttgtttttcatgtttgagtaatagtcattctg
-actgttgtgaaatggtatccagtcatggttttgatttgcattgctctgatgattagtgat
-gatgagcatttttttcatatgtttgttgagcacttatatgtcttcctttgagaagtgtct
-gtttgtgtcctttgcccattttttccatgagtttttttttcttattgaattgtttaattg
-ccttatagattctggatattagatctttgttggatgcatagtctgtaaatattttcttcc
-attctataggttatctgtttactctgttgagagttttgtggtgcagaagtttaattaagt
-cccactttccaatttttggtttttgtttttttcaattgcttttgagaacttagtcataaa
-ttattttccaaggtgatgttgagaatggtgttttctaggttttcttctaggattcttttt
-tctttcttttttttttttttttttttttttgagatggagtctcactctgttgcccaggct
-ggagtgcagtggcgtgatcttagatcactgcaacctccacctcctgggttcaagctgttc
-tcctgcctcaacctcctgagtagctgggattactggtgcatgccaccacacctggctaat
-ttttgtatttttactggagaccagatttcaccatgttggtcaggctggtctcaaactcct
-gacctcatgatccgcccacctcagcctcccaaagtgctgggattacaggtgtgagccgct
-gcgcccagctcttctaggattcttaaagttttggatcttacatttaaatctctaatcgaa
-cttgagtcaatttttatacatggtgaagggcaggggtccatttcattcttctgcatatgg
-ctagccagctatccaagcaccattactgaattattgaatagaattattgaatagggagtc
-ctttctccatgataatttttgttgtctttgttgaagatcaaatggctgcaggtttgtggc
-tttatttccaggttctccattctgttccattggtttatgagtctgtttttgtaccagtat
-catgctgttttggttactgttggcttatagtttgaagttaggtcatgtgatgcctccagc
-tttgttccttttgcttaagtttgctttgactattggggctcttttttggtttcatatgaa
-ttgtagaatagattttctaattctgtgaaaaatgataatggcagtttgatagaaatagtg
-ttgaatctatagactgcattgggcagtttggccatttaaatgatattgattcttccaatc
-catgagcatgggatattttttcatttgcttatattatttattatttcttttagcagtgtt
-ttgtagttctcccggtagaaatctttcacctccttggctaaatatttgcaatgtatttta
-tttttcatgtggctgtcatgaatgggattgtgttttgagactttgctgaagttgtttatt
-aaatctggaagtcttttggtggaatcattagggttttctaggcgcatagaatcacattgt
-cagcttagagagctaatttgactttctcttttcctatttagacaccttttatttccttgt
-cttgcctgattgtttgggctaggatctccaattctaacagctttcagtggagtctaggtt
-tttctaaatataagattatgctgtctgtaaacagggataatttttttcttttactgttaa
-ttttcagagttttatattttatttattatgtgtagtctgcaaatacattctgtaaggtta
-ttgcttgtctttttattttcttaacagggtcttttgcagagcaaattttaagactttgat
-gaagttaaatttgtcaattactttttatggattgggctttttgtgtcatgtctaaaacct
-cataaccaagcattaagctccatagattttctcctatgttttcttttaaaagctttatgg
-ttttacatcttacatgtgattctatgaccaattttgagggcttttttttcatgtatgtgg
-ggtgtttaggtaagttaattttttttaacctgtggatatgcaactgttccatcacctata
-tttaaaaagattattcttccttcatttaattggttttatatctttgtaaaaaaaatcaat
-tggctatactagtatggttctacttccggattctgtattcttttccattcatgtatgtgt
-ccattcctctgctaatacaaatcttggttactgaagctatacaacaactttcataattgg
-gtagaattaatttctccgactttattctattttttcaagattgactaatccattctagct
-attttgcctttccatataaattacagaataatctgtgtatatttagaaatatcttgatgg
-cagtttcaagatggctgactagaagcagctagcgtgtgctactctcacggagaggaaaca
-aagtagcgagtaaatagtggcttttcaagtggatcgtctgggagaccacatcaggattca
-ccaaggaagtgagggaatcctcagagagcagagagtgaagcctggcagcagccgctcacc
-cgggaccagtgtggagcaagagaaattccctaacatggggaaagggtgagtaagtgagag
-tcctcaggggatccacatggatctttgcaatcctgtgcacaggagaaccccttggcccct
-ataggcctctagatcgacacaacatcctggagtttgtgtagacgcactgctaagggccat
-gtggagccccacaggccctggatccctgatcaacctggtgccagctgccatagccctgat
-aggggctgcagtcatggtgctgaggagtggtcagactgccctgctcctcctcaccaggca
-aggctcggctttggcttccagtgcaacagtctgcctccacctgaactctgcatgtgggca
-cactctacactcccctgggaaccactcagatggcggattgtgtgactcccattcccctgc
-tgctccgagccaggcaaggctagctggtttgggcttcaacacagcacctctgcccctacc
-tgaacactgtagtgggttgcagctttccattcccctggggcaaaactcacagaggtaaca
-gatAATGCCTGGCACCTTTGTGTGTTGCTAATAGTGAAGTTCAACATTATTGGATAGGAG
-GGAGGTGCAAGCATGCCAGGCATTCCACAGCTTCCAGTCTCCATTGCCCCAGCTAAGGGA
-TGGCATGCTCTCCAGTTAAAGGCCCACAGCACAACTGTCCTGCCCCTGCCTGAACATTTC
-ACCTGCGACCCAGAGCCTTTCCGAAAACCCACCCACCACAGGCCTGTGATATTCTTCTGG
-GTTCCCACCACCCAAGAATCCCACcttcccctgcctgagagtttggctggtgacccaggg
-accagcctgaaccccacccccaccccattacagtcagcacctgaaatctgggatagataa
-ccccagtccagccccttcagggccatgcacactgtccagcaggccttctggaggcctgtc
-agctgagaaactatcaatacccttccagtgctgttggcacctgaccaatttcctcagggc
-ctgaggttgggcctacccaaccagcaaacaccaccatgaccaacaccgacctgcacggac
-cCAAAGGTGGAGACCTTCCTTCTCAAAAAGCAGCAGTAATGCCCCATCATagaataagtg
-agccttaaagctatctgtatcaggttgagtgatgaggttataccctgaacaactctcatg
-gagaatcataaaacaagtgttccctgtggccctcaaccacattgcagtccagagatagac
-tatagtgtgcatctgaactaggagtcatgagccctgaaacagggtgtgataaggaaacag
-atcacatttctacctacctaggatggggagctggtgcagtcttctcgcccacaagcccct
-acagagacctcagtgcaggagttgctcccagccacgctcatcagagctggtgcctgtgct
-tgccattggtatactaatgggcaagccaggggcaccagctcttctcagctctgtcccacc
-atccccacagaacaagaagctcagtacatcaggcacccccactgtccagcccttcacctg
-aaacaactgagagcccctaatagtaaaaaaagatcagatctatacccatctgtttatggg
-acagctggctgttacttgcaaatgtcatctaccagtctataggtcaaactggacagccca
-tcaaaaaacctgctggtagaagtgtgtaggactatagaaacaaagccaaaagccctaccc
-aacacaatcccctccagataagaaggaactagtataagaattctgctgtcatgaaaaatc
-tgaatgtgtgacaccaacaaggttcactctagctctccaggagtggtcctagccaaaata
-gaagctgagagatgacagatggagaattcaaagcatagattgcaggaaaattctttgaga
-ttcaagataaggttgaaaatcaacacaaagaaacctgtaaagcaatccagagaataaagg
-aagaggtaaactcttaaaaataaatctatcagagctactgaaagtgaaaaactcacttaa
-gacattccgaaattcaatgaaaagttttatcaatagactagatgtagcagaagaaagaat
-ttcagagcttgaagatcagtctttcaaactaacccagtcagacaaaataaagaaaaagtt
-attttgaaaaatgaaccaaatcttcaagaaatatgggattatgtaaagtgaccaaaccta
-tgaattactggcattctcaagagagaaagaggaaaaagtaaacaacctagaaagcatatt
-tgagggaataattcaagaaaatttcctttatcttgctagagaggtagacatccagataca
-ataaattcacagaacacctgcaagatgctatacaaagtgaacatcatcaagacatagggt
-catcagacagtctaaggtcaattctaaagaaaaaatcttgaaggcagcctagagaaaagt
-gtcagatgagttacaaaggtgagcccatctggctaacagcagacttatcagcagaaaccc
-tacaatcccaaagagactgggggcctatttaaagaattctcaaagaaaagaaactccaag
-caagaatttcataccctgccaaactaagctttataagtgaaggagaaataagatcttttt
-cagacaagcaatcactaaggcaatttattgccactagaccagccttacaagagatcctta
-agggagttggagttctaaacataaagatggaagaacaatatctgccaccacaaaaccaca
-cctaagtacatagcacatagaccctttaaagctattacacaataggaactataaagcaac
-cagcttacaatttcatgacaggatcaaaatctcacatatcaatattaaccttgaatgtaa
-atggtcttaacaccccacttaaaggcacagagtggcaagttggatcataaaataagaccc
-atccatctgttgtgttcaagagacccatctcacatgtaatgacTACTACACTAATTTTAT
-CGGGTTTTTTTCCCCATTGCTTATAAGTTTCATTTTATGGTATGTTATTTTGATTGTATG
-CCAAACATTGGGTAAATGGGTTTTGGAGACTCCAAGTGATGTTATCTTCAAACATAAAAG
-GTCCTCCCTTTCTCCAGATAGCAAAGAGATAAGGACATGACTAATTCAATATAACAAGGC
-ATTAAGCTGGTTCAGGGCTGGGTTTCAGTATTAGTAATGATTCCAACCACATCTAGTTTG
-GTCCTGTTTCTCAGGAATAGCCCTCCAGGCTTTTTCTTCAGGGTCTGTTTGGTCTCAGTA
-TCTTCAGCCCAAAAAAACAATGAGGGAATTCTAGCTCTGTTCTTTATGGTTTTCAAACAT
-TGCTCTTCAGCCTCCTGATTCAGGCACTTCTGTAATGTCTCAAGGGGGAGACTATCTGTG
-TGCTTGAGGTAGGCTCCATATCACTATCATATCTGTTTCCTAAGCACTACAAGAGTACAA
-GAAATCTCTTACTGCCTTTCGGAAGTTTCAGCTGAGCTTTCCAACCTCTCACAAAGCTCT
-ACTTTTCCAATGCTCCATTGGGGGGACTAAAATTTGGGGCACCTGAAATTCCAATTTGTA
-ATTCCTAGAATCTCTGCTACTTCTGCTGATTCAATTACCTCCCAGAAAGCCTTTCTTTCT
-GGGCCAAGCCTGATTTCCCGTCTGTCCCAAACTGACAAAGGCACCCATGGGGGAAATGGC
-TGGCAATTATTGACCTACTCCAGAAACAGAAAGCCTGTTCTGTTCTCTCTTTAGAATATC
-AACTCTTCTAGTACCAGTAATTTCTCTGGTTCTCTAATGCCTTGGaaatattattttaat
-aaaaatCAAGCTTTTCTAGGTTTTGTATCAAAGGCATTGCTTTTCTGTGATTTACTGATT
-TCTCCCCAAGAACAGAACTTCTCAGgcccatttaatcttaacttaattgctgttatgttt
-ggctttaaattggccattgtttaacgtgatttacattttcctgagttttctatatttctc
-ttttttctcctttcttttaatctttctgtataaaccagatgttctttaattccattttcc
-tccccactagtttttaatgtattctccttttctattcatcatcactctagaaatgaagac
-atacattcttaacctatcaatatctaatattaaccaaaaatgtgtatttctcctcagaca
-atgcatggaatacaactccatttcacctgcctccagtttatattctattgctttatttta
-ctttcatataatactaagacaatattattgcatgcgtgacaattataggtagttctattt
-tctgggtgactccaacaagttatcattataaagtaacccattttcctctaagataatttt
-tgccttaaatactattttgttcaatactaagaagtaagataacttccttttgttggtatt
-tgcatgttaagtttttttcccatatttccactttcaatcttctccgtatcttgtttttac
-atttatctgttgtaaatagcatctaatttttcatccagtctagcaactagagttaatcca
-taaatttaccaatctctgaataatatatggaacatagaccactttaattctatttaacgc
-tcccaattgattctattttcagaattttgatatttaattatgtttttaatcttataaaac
-atctttatttaattctGCCAGTTTAATCCACTtttatccctttttttgttgcttcttcat
-cacatactttccatgtgtggtcatttttttaaactaaagaacatcctttagaatttcctt
-tcatgagatctgctatctctatctgaaaaggttgtatttatattttcttcttaaaatatt
-tttgtggatatggatttctaggatgacatttactttgaaaaatacgttgaagagctcagt
-ccattggattatggcttctattgtttgtggtgaaaaatcacctgtcagtgtaacaattac
-tctatcaaaagtatggtttctgtttttccctctgactgtttcccacttttctctttgtcA
-TTTTATCTAGATGACAATTCTTATTTATTTTCTAGAATAGTATTTCTTAGATTATTTCTG
-AAAAAAAAGAAGATTTATTATCTTTTCAAATTTATGTAGCtttttgtaattctttttctt
-taattttctttctccttctctttgaaaatcttattaatcagatattggctctcctggatt
-gacactctgtgtcttatatattttgctcatactttccacttgtttttagacttcaaagat
-tttctcactttatcttcaaatgtgcctgctaaacaatcatttttctaatttccaaaagtt
-tactacttctccttacatagcatgatattattgctttatggatggaataCACTCTTGAAA
-CTCCAGCCCCTAAATAATAGTTATTCTAATGTGCCTTTCTTCATTTATTTTCAGTCATGT
-TAAAGATTTTCTCAAATAGATAGCCAGCCTAGATTGTTTATTCATATTTTACATATATAC
-TGAGCCATTTTATGTGTGCAAACTTGTCCACAGCTTTTGTTTTAAAATGCTTGaactgtg
-aagatagaaaagacatgtttgctggaatgcataatactgaagtttacttctcatagtctt
-tctttagaagttatcgcctaggcagaaaaagaaagtaactaaaaaaaaagaaaacacaat
-ttccaggtatatctgtgccaactcaggtgactagtaaaacaaaattctaagatgacatct
-gtatagcctacataggaagcaaccagttcacattatagaaggaagaatgaatgttccagA
-GACAAAATATAGTTACAATACACCCTCATCTATTGTAGTAAAAAAAAAAAAAAGCTGAAG
-TCTAAATTACACAAATGTAGCAGCATAATACTATTAAATAATAAGTAATTTAATATTCTA
-TTTCATGGCATTATTTTACAGGAGCACTATTTGATCATCTTCTCTTTATCACACATACTT
-CTTCCATTTATCTTACAGTATCTTTACATAAACACTAAAATAGTTATACTCAGATTGTAC
-ACTTTTGAAGGGAGTTAGCCTATTTGTGTCAATTATTTACTAAAACAAAGCTAAATAACA
-GCAACAAAAAAGCCTTGTTGGAACAGGGACCAGGGGAATGATCAGAGCAATAAGTAGCTT
-GCATGAAAATATTATTAACTCTGAATACTTTCTCATTAACATTAACAGTGTGTCCTGCCT
-GTATATTTAATCCATTTAGAATTAAACTATTAATATATTGTGTCCTAGGATGGCAGAGTT
-ATTAAGCAGCCCCTGTATGCTCCAGGGGATATAGGTTGATATTCTTCAGCTGTCAAAATT
-CTTCAGCTGTCAAAATTCTTCAGCTGACTTAAATCAGCAGTAGTGGCGTTTATCACCAGT
-CAACAAAGTTCTTCTATCCTTCACTTCTTTAGCCTACTCATCTAATGGATGTTGGCACGA
-ACATGAAGTTTCTCTCCTAAATATCTATGATGTTCCACAAATCATGGGATATGCCTGCAG
-GCTGCCAGCACAATCAGATCTTCATGTTCCAAGAAAGGGATCATTAGTTTGGCCCTGCAA
-GATGTGCCACCTTTCTTGGAGAACTGAGTGTGCCACATGCAATCTGCTGAGGCATGAACG
-TGCTCTTGGCATTTCTGTTTATTTGCTCCTTATTACACTATATTGTGTCAGAATGATGGT
-TTGGGTTCAACAGTATGCTCACGTAAGCCACTATTCCAAACTTCCTAAACGCACAGTTGT
-GGAATGTGACACAATTGTTGGCAATGATATTTAAACAGGATATGTGTTTTTGGTGGGGTC
-TCTGGGAAAAATTACTAAAGGGAGGGGTGGAGTGATCCAAATATTCAAGTGGTAGACACC
-CACTTGACTTTGGccttccacttcctcctgtttggaatatggtcataatgctggaggtaa
-tgctgccatctataacaatgaagcaaaaacactggataacagtatgtgaacagaagagta
-gagggtgactagcatggtgaagctgttatataatttctggactTTATGTTATGTAAGAAA
-AATAAAACCTGAATTTGTAATAAATGAACAAAATGCCTTTTTCATGTTTTTCTGTTTCAT
-ATTACAGCCTATTATACTTTCTAACTGGCACATCATGGATTATAGATAGAATGTGATTTA
-GGATTAAACTCTCTTAAGTTTAAAATGTGTAGTTTTCTTCTCTCTTGTTCATTCTCTTAC
-TGCCTCCAGTTCATTTCAGAGCATATGAAAAGAGACAATAAGGGACTTTTAGCTGGAAGT
-TTACACTACATTACTGAGTAGGAGGAAAGTAGCTTAATAGTTCTATAAAGAGTATCATTA
-CAATTTTAAAAATAAACAAAAACATAAATTATATACCTGTAGTCTATCCTGAAAATATTT
-CCTGAAGTCACAGATTTGGAGTATTGTCAACTTGTGCAtaaacttcatgagaccatggac
-tattgtttttctcactgctttattcctagctccttgatcagaacaggcagagagaagatg
-cacaataaatgaataaatataataaatgaatGTATCCTTTATTACCTACGCAAACACATG
-CACACAAACACATCTATGAAGTTTTACATGATAGTATAAACACTGCTTTGGTGGAGGAAG
-TTACTGATTTTCTTTTAGCTTGTTTTCCACTTTATTTTTCTTTACCAAATAAGTTTCACT
-TTTGCTATTAGAATATAATAAATAACAGAAACCACAAGAACAAAGTAGCAGCTGAAAAAA
-AGAAATGGAAAATTCTTAATTCATATATGATTGCCTCTGTGAAACAAtgaaaagtggtca
-tccaatttcagtttgaacacttTTTTCCTCATAAAGTCATCCTATACCTTTACTCAAATT
-TAGTTTTAGGTGCATTAGGAGTTAAAAATAAAACATAAACCCATTTAAGAACCAAGAGAA
-TTAGTAAGGTAAATTACTTTGGTAAAATGCCCAAGTTCCAGGCTCTGCTGAAGAGAAATT
-ATTGATTCAACCTTAAAATatttgaagtctctggtaaggtgactttagctaaagctgcaa
-ccagctcaactacaaatcagactgactcactactctagcaacttgacagaagaacaatac
-tagacagaatattaattaccttttggaggtaattatttattgaaaactctactgaacttc
-tatatgtctggcataaaataaaggttatgacatatttttaaaaagaaagaagacataact
-cattgtccagagaggaaatgatcaacacccagccaatggaattatcaaccagaaactcaa
-agtaactctgatagaaatatgctagagaatatagtgggaaaataaacagtactggtgttt
-actgataaaatagagaattttatctatgagccaaaacaaagtaatacaaattaaaaattc
-aatatcagaaatggataattcattcaatgggctgaacagcagactgggagaagcaaagaa
-aacaatcacttcacttgaaactcaaatgaacatttgaatagaaatttcccaaatgaacac
-aaacacaaaaaagtaaagaaaaattgaatacaacatcagagagatgtgagatattatcaa
-ataattcaacatggatttaattggctcccaagaagaagggaaggagagaatgaagcagaa
-gaaataagagctaatagcctcctacatagcaaaattgatccaagaacttcagcaaggtct
-aattaggacaaattcaaagaaaatttctagacatagtggatttcaaactgctgaaaatca
-aagacagagaacaaatcttaaaagtagccagagaaaaaggacatgttatctaggaaggaa
-caatgacacaaatGATGCTGAGCTATTTCCAGAAAAATAAAAACAGCgggtgacatcagc
-aagatggcagaataggaagtcccagatctcatttccacatggaaacaccagtttaacaat
-agatgaacaaaaatatctttattagaattccagaaGAGAAggaaagaaattcaaagattt
-ctcataagaaacttcgaagggcaggaggaagtggcacaatatttttaaagtgcttcaata
-gtaagtctcaatccagatatctatgtccaagaaaatatccttcaagaataaggaccaaat
-aaacacattctcaaatgaaggaaaactgaaaaaaaaagggggggtcactagtaggtatac
-ctaaaagaacagctaaaggaagtcctccacagtgaaagaaattatttttttttttttttg
-agaaaggagtcttggaacataaggaaaaaagaagagagaaaacaaaaacatcagaaatgc
-aataaactttttacctactttttagttttctaaattatttttgacagtaacagcaaaaat
-tatccctctatagtgattctcagcataggtagaaaaaatatttaagtcaatgatattaga
-aatggggggttatcatagagatataaagggagataaaatctttatctgatgtggttaaat
-gatgtaccagtagactgtaataagttatggatatataatgtagcacagacaacaatcact
-acaaaagctatacaaagagatacacttgaaaacactatagatgaatgaaaatggaattct
-aaattatggaaaaatatctcacaaaatggcaggaaaaataagacaaagaagcaaaaagga
-aacaaaaacaaaatgaaagatttaagcattaatatatcaataatttaattaaatttaaat
-gatctaaacacacaaatttaaagatgaatattggcaaagtatgtttttagatgacccagt
-aatatgctatatacaagaaactcacatcaaatataatgatataaataggttataagtaaa
-agaatggaaaaagatataccatacaaatattaataaaaagtttgcaggagtgactatatt
-aatgtcagataaagtagacttcagaacatcaaaaaaattaggatgattttttgtcacctt
-tacatagtgacaaaaggtccaatacaccaaaaagatgtggcaaacttaaatttgtgtgct
-ccaaaacacaaagctgcaaaatatgtgaagcaataacagagagttaaaagagagaaataa
-gcaaaaacacagtcgggatatcaccacccacttctttccagaattgatagaacaacaaga
-aagaaaatcagcaacagcaatagaagagctcaacaacattaactacaggatccacgtggc
-atttaaggagcatttccactcaactagagcagagtaaatattcctttcgagctcagagag
-tgtatactaagatagactatatcctaggcaaaaaaaaaaagaagaagaagaaaaaaggat
-attcaactaattaaaaagaatttaaactgcacaaagtttattctctatatgattgacaca
-gtgaaatcaaactaggaatcaataccagaaataaaacacaaaaatctccaaacacctgga
-aattacacaacatgcttccaagtcaaagagaagtctcaataagaataaaatatacataga
-attaaataaaaatgaacatataacatattcataatttgtgctaaagcagtgccaagagag
-aaatttagaacaacaaatgcttatattacaaaagaagaaaaatgtcaaatcaataatctt
-agctctcacctgaattagaaaaataagagcaaattaaatgcaaagtaagcagaagaaaga
-acataataaagataacagcacaaatcaatgaaattggaaacagaaaaacaatagagaaaa
-tcagtgaaatgaaaagctgcttctttgaaaagatcaataacattgacacacttttagcaa
-gactgacaaagaaagacacaaatttccagcatgcggaataaaacaaagaatatcactaaa
-gaccctatggaaataaaaatgataataagggaatacgataacctttttttttttttttga
-gacagagtcttcctctattgcccaggctggagtgcagtggcacaatctcagctcactgca
-acctctgcctcctgggttcaagagattctcctgcctcggcctcccaagtagctgggacta
-caggcatgggccaccatgcccagccagtttttgtatttttagtagagatggggtttcacc
-acactggccaggctggtctcgaactcctgacctcatgatctgctcgcctgggcctcccaa
-agtgctgggattacaggcatgagccaccgcgcccagccaactaactctctatacattgat
-ttacttttttattttaaaatatccttgcattcccagtagaaaccctagttggtAAAAAAa
-aattattgtttgtaaacccttcttctttgatgttacgcatctacagctaaagatttcccc
-ttaagcaaggcaggagctgcatttcacactttataaaatgttgtattttactatcttgcc
-gttcaaaatacatattaattattcctataattttatctttaacacatggcttttacataa
-ttttaaatagtactttttaaattttaaattaaattttaaatacttttaaataataaaagt
-atgctagttaatttcaaaatattatgtttcttaacatcttatttttattggtttccaact
-taatactgatgtttttctagatatcacatttttaattgattgctattttgcaattatttc
-tgcaatattttagtgttttgacatttatagggacttctttaaagaatcaacactgtccat
-ctcagtgagcattccatgtgcatgtgaaaaaaaaacgggtattctgtaattattggaggt
-agtgttctatacatgttaattggattgaggtggttattcagatttgctacattctttttt
-ttttttttcgagacagagtcttgctctgtcaccaaccaggctggagtgcagtggcacgat
-cttgggtcactgcaacctccacctcccgggttcaagtgattcccttgcattagcctcccg
-agtagctgggactacaggtgcgcgccaccatgcccggctaattttttgtattttagtaga
-gacgggatttcaccatgttggccaggctggtcttgaactcctgacctcgtgatctgcctg
-cctcggcctcccaaagtgctgggattacaggcatgagccaccacgcctggccatttgcta
-cattcttactaaatgtttggtctagttatgctatcaataaccaacagtgaatgataaaat
-ttccaactgattgaagatttttctgttttcaagttacttttgtccatctttacttcatgt
-atttttaagttatattattagatacatcatgtctttctaatgaattgaccctttcatcat
-tatgaaatggccttcattatctctagtaaatactgcttgccttggagtcaaatacatcag
-atattaatataatcacTCCACAATTAACAAAGCCATCAAAAGTAGCTTGTATATCCAACT
-TATTCTCTGTATCGATTTCTTTCACTTTTGGCCTGAAAAATCTTTACTCactgaaaagca
-aagaatataaagaaaaaaaaaaggtaaagaatccaaggactgtgggaaaactgcaaaagg
-tgtaacctacatgtaatgggaataccagaaggagaagaaagagaaaggaacagaaaaaaa
-tatttaaaacaacaattgaaaatcttcagtgggagtataattagttcaaccattgtggaa
-gacagtgtggtgattcctcaaggatctagaaccagaaatacctttgacccagcaatctta
-ttactgggtatatacccaaagaattataaattgttctactataaagacacatgcacacat
-atgtttactgcagcactatttacaatagcaaagacttggaaccaacccaaatgcccacca
-atgatagattggataaagaaaatgtggcacatatacaccatggaatactatgcattcata
-aaaaagaatgagttcatgtcctttgcagagacatggatgaagctggaaaccatcattctc
-agcaaactaacacaggaacagaaaaccaaacaccgcatgttctcactcataagtgggagt
-tgaacaatgagaacacatggacacagggaagggaatgtaacacactggggcctgccaggg
-gtgggggggcaatgagaaagcattaggacaaataatgcacgtggggcttaaaacctagat
-ggcaggtttataggtgcagcaaaccaccatggcacatgcatacctatgtaacaaacctgc
-acgttctgcacatgtatcccagaacttaaagtaaaataaaaagaaagaaaaaaaaacttg
-agtaaaatgaaaaagaaaaagaaaattttccccaaattaatatcaaacatcaaaccacag
-atccaagaagctcagagaatactaagtaggataaatgcaaaaaaaaaaaaaaaaaaaacc
-taatcatgtcatattcaagctccatgaaacaaaatataaagaaagaatcctgaaagaaga
-caaaggaaaaaaTCTTATcataataatagtgctcatttctccaacaagacataacaatcc
-ttaatgtgtatgtgtctaaaaacagagtcaaaCAATgttttgatttgcatttccctgttg
-actagtgatactgagcatttttccatgtatatgttgaccatttgcatgtcttttgagaat
-gtctatttttgttctttgctcatttttcaaggatatcatttgtttttgtttctgtttttt
-ttgctttcagttgagtcccttgtttattctagtttgatacagtcccatttgtctgttctt
-ggttttgttgcctgtgcttttaaggtcttaaaatatttgcctagaccaaagtcctggagt
-gtttcccctatgtcttcttctagtagttttatggttttgggtcttaggtttaagtctcta
-atctattttgagttgacttttgtatatgatgatagataggggtctagtttcatttttctg
-catataaatatccagttcccagcaccatttattgaagagtgtgtcctttccccagtggat
-gttcttggtgcctttgttgaaaatcagttggctgtaaatatgtgaatttatttctggatt
-ctttattctgttccattgatctatatgttcatttttataccaacaccatattgttttgct
-ataagtactatagccttgtaatatattatgaaggcaggtagtgtgatgccacaaactttg
-ttcttttgtctcagaattgctttggctattttggctcttttttggtttcatacacatttt
-aggattgatttttctatttatgtggaaaatgtcattggtattttgataagaattgaattg
-aatctgtagattgttttaggaaatatggtcattttaacaaaattgattgttccttttcat
-gagcatgggaggcatttccatttgtttgtgtcgtcttccattcctttcatccgtgtcttg
-gggtattccttgttgacatctttctcctccttggttaaatttattcttaggtattttttg
-tagctattgtaaatggaattgccttcttgatttcttttttggctagttcattattggcat
-ataaaaatgctactgattttttagcattgattttgcattctgcaactttactgaatttgt
-ttatcaattctaagaggtttttggtggagtcgttaggtttctttaaataaaattatgtca
-tctgcaaagagggataagttagtttcctgtttcccatttagatactgtttatttcttttt
-ttgtctaattgctctatctagcacttccagtactatgttgaatgggaatgatgaaagtgg
-acatcttcttgtcttattccagttcttaaaggaaaggcGACTCTTgggggaggagccaag
-atggccgaataggaacagctccggtctacagctcccagcgtgagcagaagacggcgattt
-ctgcatttccatctgaggtaccgggttcatctcactagggagtgccagacagtgggcgca
-ggccagtgggtgcgcgcaccggcaccgtgcgcgagccgaagcagggcgaggcattgcctc
-acctgggaagcgcaaggggtcagggtgttccctttccgagtcaaagaaagaggtgacgga
-cacacctggaaaatcgggtcactcccacccgaatattgcgcttttcagaccggcttaaaa
-aacggcgcaccacgagactatatcccgcacctggctcggagggtcctacgcccacggaat
-ctcgctgattgctagcacagcagtctgagatcaaactgcaaggcggcagcgaggctgggg
-gaggggcgcccgccattgcccaggcttgcttaggtaaacaaagcagccgggaagctcgaa
-ctgggtggagcccaccacagctcaaggaggcctgcctgcctctgtaggctccacctctgg
-gggcagggcacagacaaacaaaaagacagcagtaacctctgcagacttaaatgtccctgt
-ctgacagctttgaagagagcagtggttctcccagcacgcagctggagatctgagaatggg
-cagactgcctcctcaggtgggtccctgacccctgacccccgagcagcctaactgggaggc
-accccccagcaggggcacactgacacctcacacggcagggtattccaacagacctgcagc
-tgagggtgctgtctgttagaaggaaaactaacaaacagaaaggacatccacaccgaaaac
-ccatctgtacatcaccatcatcaaagaccaaaagtagataaaaccacaaagatggggaaa
-aaacagaacagaaaaacgggaaactctaaaacgcagagcgcctctcctcctccaaaggaa
-cgcagttcctcaccagcaacggaacaaagctggatggagaatgactttgacgagctgaga
-gaagaaggcttcagatgatcaaattactctgagctatgggaggacattcaaaccaaaggc
-aaagaagttgaaaactttgaaaaaaatttagaagaatgtataactagaataaccaataca
-gagaagtgcttaaaggagctgatggagctgaaaaccaaggctcgagaactacgtgaagaa
-tgcagaagcctcaggagccaatgcgatcaactggaagaaagggtatcagcaatggaagat
-gaaatgaatgaaatgaagcgagaagggaagtttagagaaaaaagaataaaaagaaatgag
-caaagcctccaagaaatatgggactatgtgaaaagaccaaatctacgtctgattggtgta
-cctgaaagtgatgcggagaatggaaccaagttggaaaacactctacaggatattatccag
-gagaacttccccaatctagcaaggcaggccaacgttcagattcaggaaatacagagaacg
-ccacaaagatactcctcgagaagagcaactcaaagacacataattgtcagattcaccaaa
-gttgaaatgaaggaaaaaatgttaagggcagccagagagaaaggtcgggttaccctcaaa
-gggaagcccatcagactaacagcggatctctcggcagaaaccctacaaaccagaagagag
-tgggggccaatattcaacattcttaaagaaaagaattttcaacccagaatttcatatcca
-gccaaactaagcttcataagtgaaggagaaataaaatactttacagacaagcaaatgctg
-agagattttgtcaccaccaggcctgccctaaaagagctcctgaaggaagcgctaaacatg
-gaaaggaacaactggtaccagccgctgcaaaatcatgccaaaatgtaaagaccatcgaga
-ctaggaagaaactgcatcaactaacgagcaaaatcaccagctaacatcataatgacagga
-tcaaattcacacataacaatattaactttaaatgttaatggactaaattctccaattaaa
-agacacagactggcaagttggataaagagtcaagacccatcagtgtgctgtattcaggaa
-acccatgtcacgtgcagagacacacataggctcaaaataaaaggatggaggaagatctac
-caagcaaatggaaaacaaaaaaaggcaggggttgcaatcctagtctctgataaaacagac
-tttaaaccaacaaagatcaaaagagacaaaggcggccattacataatggtaaagggatca
-attcaacaagaggagctaactatcctaaatatatatgcacccaatacaggagcacccaga
-ttcataaagcaagtcctgagtgacctacaaagagacttagactcccacacattaataatg
-ggagactttaacaccccactgtcaacattagacagatcaacaagacagaaagtcaacaag
-gatacccaggaattgaactcagctctgcaccaagtggacctaatagacatctacagaact
-ctccaccccaaatcaacagaatatacatttttttcagcaccacacaacacctattccaaa
-attgaccacatagttggaagtaaagctctcctcagcaaatgtaaaagaacagaaattata
-acaaactatctctcagaccacagtgcaatcaaactagaactcagaattaagaatctcact
-caaagccactcaactacatggaaactgaacaacctgctcctgaatgactactgggtacat
-aaggaaatgaaggcagaaataaagatgttctttgaaaccaacaagaacaaagacacaaca
-taccagaatctctgggacgcattcaaagcagtgtgtagagggaaatttatagcactaaat
-gcccacaagacaaagcaggaaagatccaaaattgacaccctaacatcacaattaaaagaa
-ctagaaaagcaagagcaaacacattcaaaagctagcagaaggcaagaaataactaaaatc
-agagcagaactgaaggaactagagacacaaaaacccttcaaaaaatcaatgaatccagga
-gctggttttttgaaaggaccaacaaaattgatagaccgctagcaagactaataaagaaaa
-aaagagagaagaatcaaatagacacaataaaaaatgataaaggggatatcaccactgatc
-ccacagaaatacaaactaccatcagagaatactacaaacacctctacgcaaataaactag
-aaaatctagaagaaatggatacattcctcgacacatacactctgccaagactaaaccagg
-aagaagttgaatctctgaatagaccaataacaggagctgaaattgtggcaataatcaata
-gtttaccaaccaaaaagagtccaggaccagatggattcacagccgaattctaccagaggt
-acaaggaggaactggtaccattccttctgaaactattccaatcaatagaaaaagagggaa
-tcctccctaactcattttatgaggccagcatcattctgataccaaagccgggcagagaca
-caaccaaaaaagagaattttagaccaatatccttgatgaacattgatgcaaaaatcctca
-ataaaatactggcaaaccgaatccagcagcacatcaaaaagcttatccaccatgatcaag
-tgggcttcatccctgggatgcaaggctggttcaatatacacaaatcaataaatgtaatcc
-cgcatataaacagagccaaagacaaaaaccacatgattatctcaatagatgcagaaaaag
-cctttgacaaaattcaacaacccttcatgctaaaaactctcaataaattaggtattgatg
-ggacgtatttcaaaataataagagctatctatgacaaacccacagccaatatcatactga
-atgggcaaaaactggaagcattccctttgaaaactggcacaagacagggatgccctctct
-caccactcctattcaacatagtgttggaagttctggccagggcaatcaggcaggagaagg
-aaataaagggtattcaattaggaaaagaggaagtcaaattgtccctgtttgcagacgaca
-tgattgtttatctagaaaaccccatcgtctcagcccaaaatctccttaagctgataagca
-acttcagcaaagtctcaggatacaaaatcaatgtacaaaaatcacaagcattcttataca
-ccaacaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaa
-agagaataaaatacctaggaatccaacttacaagggatgtgaaggacctcttcaaggaga
-actacaaaccactgctcaaggaaataaaagaggatacaaacaaatggaagaacattccat
-gctcatgggtaggaagaatcaatatcgtgaaaatggccatactgcccaaggtaatttaca
-gattcaatgccatccccatcaagctaccaatgactttcttcacagaattggaaaaaacta
-ctttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaa
-agaacaaagctggaggcatcacactacctgacttcaaactatactacaaggctacagtaa
-ccaaaacagcatggtactggtaccaaaacagagatgtagatcaatggaacagaacagagc
-cctcagaaataacgcccatacctacaactatctgatctttgacaaacctgagaaaaacaa
-gcaatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgt
-agaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatt
-aaagatttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacc
-attcaggacataggcgtgggcaaggacttcatgtccaaaacaccaaaagcaatggcaaca
-aaagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaa
-actaccatcagagtgaacaggcaacctacaacatgggagaaaattttcgcaacctactca
-tctgacaaagggctaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaa
-acaaacaaccccatcaaaaagtgggcgaaggacatgaacagacacttctcaaaagaagac
-atttatgcagccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatg
-caaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaag
-tcaggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttgg
-tgggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatcta
-gaactagaaataccatttgacccagccatcctattactgggtatatacccaaatgactat
-aaatcatgctgctataaagacacatgcacatgtatgtttattgcggcattattcacaata
-gcaaagacttggaaccaacccaaatgtccaacaataatagactggattaagaaaatgtgg
-cacatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgta
-gggacatggatgaaactggaaatcatcattctcagtaaactatcgcaagaacaaaaaacc
-aaacaccgcatattctcactcataggtgggaattgaacaatgagatcacatggacacatg
-aaggggaatatcacactctggggactgtggtggggtgtggggaggggggagggatagcac
-tgggagatatacctaaggctagatgacgagttagtgggtgcagcgcaccagcatggcaca
-tgtatacatatgtaactaacctgcacaatgtgcacatgtaccctaaaacttaaagtataa
-taaaaaataaataaataaataaataaataaaaaaggaaaggctttcagcttttcttcatt
-caatatgatgttagctgtgtgtttgtcacatatatgacctttatttattttatttatttt
-atttttttgagacggagttttgctcttgttgcccagggtgtagtgcagtggcacgacctc
-agctcactgcaacctctgccttctagtttcaagtgagtctcctgcctcagcctctcgagt
-agctgggattacaggggcccaccaccacacctggctaattttttttgtatttttagtaga
-gacagggtttcatcatgttggtcaggctggtctcgaactcctgacctcgtgatccgcctg
-cctcagcctcccaaagcgctgggattacaggcgtgagccactgcgcctggccatatgacc
-tttattatgttgaggtatgttccttctgtgcctagtttgttgagtttttaatcatgaagt
-ggtgttgaattttatcaaatgccttttcctgcatctattgagatggtcatattgtttatg
-tccttcattttgttgatgtgtcatgtttatcaactggcatatgttgaatcatttttgctt
-ctctgggataaatgccatttgattatgatatattacctttttgatgtgctgttggatttg
-acttgctagtattttgttcaggatttctgcaggatttcatcagggatattggcctgtagc
-ttctttcgttttgttgtgttcttgtcaggttttggtatctgagtaatgctggcctttaga
-atgctatagggagaattccttcttcaattttttggaacagtttgaggaggattcatgtta
-gttatttatacatttggtagaacttggtaaaccagtgaatccttctgatcctgggctttt
-cttcagagattttttattacgaattcaatcttatcacacattattggtctgttcaggatt
-tctgtttctttttgatttaatgttggtggctggtatgtgtgtgggaatttaccttttccc
-ctagattttcctgtcagtgtatacttgttcataatagtctctgatgatcttttgtattct
-gtgatatcatgtgtgatgtctccttttttcttttctgattttaacacacaaaagtataaa
-tcactggtacagcaaatgcataaatgaggaaaagacccaaatgttaccactacagaaaac
-cactaaaccataattataaataagagagaaaaaaaaggctatacaaaacaaccaaaaact
-aattaccaaaacgacaagaaaaagtcctcatatataaatagtaagtttgactgttaagtg
-gattaaatattccacttaaaacatataggctgtctgaatgaattttttaaaaaagtgacc
-cagtaatgtaatgcctacaagaaactcacttcaactgttaagacacatagactgataata
-aagggatagaaaaagatatctcatgcacacagaaaccaaaagcgagcaAAGAGACGATGG
-CAGTACGTTCAGGTAGgagataagcttccatgacctcagctgccaccattccccacaatg
-ccccagctacccaagagaccctgagcccactcaactagtacattacttgtacaagtagta
-cgttactactatagctggcatttgagagagccactacagtaaagctatttgcaaccaagg
-aaatcataaaaagtctacataactcctcgacacgcccatcagggctaatgattgtggttg
-ccattgggaaacctgagggcaagcctgccccatcgagctgtgcccaactttgcccccact
-ttggggctgagaatggagcccatgccactgtgcattccacagacagaccatttcctgaga
-caatactgtttctcccagtaaacaaagatcaaatataaactccctgctatcaccgcatcc
-agctcttaactgcaagtgccacctactggcctggaggtcaaactgcacaacccgatagaa
-gtgttgacataagcgtacagtgctcgagaaaaagataagcgtctcaggacctctgccact
-caagatctgcaggagactgtgagcctcatcacatgcctagtacatcactactacaactgg
-catttgagaaagtcaccgcatgaaggctatttataaccaaggaattcatacagagTATAT
-GCCATTCTCCCCATCATTACCACAAgtgctggtgtttgtgcctgccaatgagctatttga
-aggaaagtttgacagtttagctccacccagctttatcctccccttaggggctgagcaggg
-agctcaggccagtgtatattccatagactgtcccttgcctgaggcaacagagagcttctc
-cccgtaaacaaagatcaagcatacacccacctgcttctgcccagattttattcataagca
-ccacatagtagcctggaggtctaactacacaacccagtaaaaaactggcttacacaagtg
-cacagcacggggaaacaagttaagcttcctaagacttctgcactctagccctgcaggagg
-cagtgagcctagcccagcacatcactactacaaccagcatttgagaaagccaccacacaa
-aggctatctataatcaagaaactcatacagactctttgccactgaaagcacccagaacca
-aggccaaataaccctacacaatgtatattataatcacatcctcaagggggaaaaagtcct
-gaccaaatgaaagtaaatttaaaaataagaacagatagttgatccaaatgagaaggaacc
-caagaaacaattctggaagtataaaaaaaagagtgttacaacaccccaaaggattgcact
-aactcttccacaatgaaccctaaccaaaatgaaatctttgaaataccaaagaattcaaaa
-tattaattttaaagaatctcagtaaggtccaagagaaagtaaaaaatcaatacaaatcag
-aaatataactcaggatatgaatgaaaaatctactaaagagatggattttttaaaatagtt
-tttttgttgtttgtttgtttgtttgttgttgttgttgttgttgttgttgagatggagtct
-tgttctgttgcccaagccagagtgcagtggtgcgatctcggctcactgcaaactctgcct
-ccagggttcaagtgattctcctgcctcagcctactgagtagctggaattacaggtgtgtg
-ccactacgcccagataatttttttttttatttttagtagagacaaggtttcaccctgttg
-gccaggctggttttgaactcctgacctcaagtgatctgcccaccttggcctcccaaaatg
-ctgggattacaggtgtgagcccactgtgcccagcctaaatagttttttcaaatgaacttc
-tgtaattgaaaaattcatttaagaaattacaaaatatagttgaaagctctaacaatagac
-taaaccaagcagaagaaagaggttcagaacttgaagacaagtctcttatgaattaaccca
-gtcagacaaaaataaagaaaaaaattttaaaaatgaacagagctttcaagaagtatgaga
-ttatgtaaagtaactgaacctatgagtcacaggtattcctgaggaaaaagaaaaagtgag
-aagtttggaaaaactatttgaggaagtaattggggaaaacctctttagtcttgctagaga
-tttagacatctaaatgaaagaggctcaaagaatgccaggaagatacattgcaagacagac
-ttcatcaagatatgtagtcatcagactatctaaagtcaacatgaaggaaaaaaattctaa
-aatcagcaagagaaaagcatacagtcatctataaaggaaatcccatcagaataacaatgg
-gcttctcagcagaaaccttacaagccagaagagattggatctaatttttggacttcttaa
-agaaaaaaaaacctgtcaaacacgaatgttatgccctgctaaactaagcatcataaatga
-aggggaaataaagtcaagtctttcctgacaagcaaatgctaagataattcatcatcacta
-aaccagtcctataagaaatgctcaaaagaattgtaaaagtcaaaattaaagttcaatact
-caccatcataaatacacacaaaagtacaaaactcacaggttttataaaacaattgagact
-acagagcaactaggtaaaaaattaacattacaacaggaacaaaacctcatatatcaatat
-taactttgaataaaaagggattaaattcccccacttaagagatatagattggcagaacag
-atttaaaaacatgaactaactatatgctgtttacaagaaactcattaataaagacatgag
-ttcaggtaaaggggtggaaaaagatgttctacgcaaacagaaaccaaatgagagaaggag
-tagctatacttatatcagataaagcacactttaaatcaacaacagtaaaataaaacaaag
-gaggtcatcatacaatgataaaaagatcaattcagcaagaagatataaccatcctactaa
-atacatatgcacctaacacaagactacccagattcataaaacaaatactactagacctaa
-gagggatgagaaattacctaattggtacaatgtacaatattctgatgatggttacactaa
-aagcccatactttactgctactcaatatatccatgtaacaaatctgcgcttgtacttcta
-aatctataaaaaAATTAAAATTTAACAAAAGTAAATAAAACACatagctaaaactaaaaa
-agcaaaaacaaaaactatgctaagtattggtaaagatgtggggaaaaaagtaaactctca
-aatattgctagtgggagtataaattgttttccactttggaaaacaatttggtaatttcGt
-ttttttttttttcttttctcttttttttttttttttttttGCATGCCAGAAAAAAATATT
-TACAGTAACTATGGAACACAAAGGTTTATTACATCCATAATTAACATGGAACATTTACTT
-ATCAGTTTGACAAGGACAACACTGAGACCTCTTAGGACAGAGAGAAAGGGCAATTTTCAA
-AGGAAAAAAGCATAGTATATGCATATttaataagtaaaacatacacataccctgtgactc
-agccattgtacatctagctgtttatccaagagaaatgacagcatatggctacacaaagag
-ttgcacacaaattttcaatggcagttttatttgtaatagctaacatctgaaaacaatcat
-aatgttcattagggggtaaatggataaatgatcatatatgcataaaaagtaatacaagca
-ataaaaaggaatgaactattggtacacgaaacatatatgattcaaaataattgccttgga
-tggaaaaagacaagcggaaaagtatacatgctatattacttcatttatgtaatattcaag
-agaatgccaagaaagctacaagaacaaatagcaggtcagtcgttgcctgggtatcatgga
-ggtagagggagggaagggaagaggaaagagtggatgccaaagaggaatgagaaacatttt
-gagagtgaaggatatatacattatgttgattaaggtaatggtttcaccagtgcatctttt
-gccaagttcatcaaattatacactctaaataatgcagtttaatgtacatcaattatatct
-caataaTTTGGAATGAAAAAAAAAAACTCCTCACAAAGAACAAAACCTCTAGGACCTGAT
-AGCTTTCAGTCACAATATAGTCAGGCACTCAAAAAAAAACTTTAACACAATAAAATTCTC
-TTTGAATGCCACCTTAAACTCAATCCCATCCAGAGAAAACAACTTTTATTAGAATGACAT
-GTGATTTGCATTTTTAGTTCATGCATTTACTTATATACACATAAATATAGCTTTTTCACA
-TAAATTAGAATCATTGCTATGCATGTTGTTCTAAAATGTTGCTTTTTCACTCAAAAAATG
-TTTAGTAAGATAAAATCTGCTGCACTCTTTTTAACAGAAGCACAGAATTAAATCATATGG
-ATGCACTTCGTTTTATGCTACTCTACAGAGTGACAAGACTTCTTTGTGCATTTATCTTTG
-AGCACTTATTTATTTCTTTGTAAAAGGCTTTCTAAATTTCCAGATCATCAACAAAGCATT
-AATTTGGTCAGTTAAAAAACAATTGCTTATATCCTTCTCTGAAAAGAATGATGTACAGAA
-AAGAATTATATATATATATGAATAATACATCATAAGTGTTCAGAAAGACATTGTATTTTA
-GGTGGAGAGACAGGCAGGTGACCAGACTGCTACATGCAGTAAGATGAACCCTGATAGAAC
-TAACACTGGAGGCTGTGAAAAAACTGCTAGGAGCACCCAGCCTTGGTAGAGCAGCATAAT
-TTCTTCCTGTAATTCTTTCTCTCCAAATTGCCATACACTTCAGCAGAGTTTGCAACTTCT
-CTTCTAAGTCTTTATCCTTCCCCCAAGGCATGCCTAGCACAGGACTCTTGAACAGTGATG
-CCTCAATTAGAGTTGCTAGCCAATAGATTGAAGCTATGTTGGCACAATATCCTACATCCT
-CCCGATCTACTGGCTGAGCCCAACCCCACCTAAGAAGGACAATAAAGATCTGTGTTCAGA
-GTCATACTGAATAGAGACTTCTGGACTCTATAGAACCCACTGCCTCCTGATGAAGTCCCT
-ACTGTTCACCCTTGCAGTTTTTATGCTCCTGGCCCAATTGGTCTCAGGTAAACAGAATCT
-TGGGGAAGAAGAAACACTGGCCTGGAACAGGGTCCTGCACATGGAGTCCCTGTTTCTAAG
-TGGTCTGTGGAAATGGGGTCTGGCTTCTCACTGGGAGCAGGGCTGAGATTTGTCCTACTT
-CTTCAGACCACCTCTGTTCTAAGAAACTTGAAGGCTCTCAGGATAGAGCAGGATCTGTGA
-TCGGAGCTGGGGAGGAGGGTAAGGCAAATCCCATACAGTTGCCTCCAAAGGTAGAAATGA
-TCTTGAAATCCCAAACTTCTATCCTGTCACTTCGGGTCAGTCCAGTCAAGCCCTGCCTCA
-TTTCACTTTTGTTTTTTTTGCTGCCGATATTCCCTCCTGAGGTAACAATTATATAATATT
-ACTTCCCCCAGTTTTCTTGGTCTTACAGAGAGGTCTCTGATTTTTTGTTTGTTTGTTTGT
-TCTTGGATGTGGTTAACAGAACAGGAAAGGCTGTTTCTATATATGTATAGGACTGTAAAA
-TGGAAAATGAAAAAAAAAATTCTGTGTGGGAACTATTGGAAGTCTATATCAGATTTCAGC
-TCTGTTTGTGTAAGCATTTCTTATTTTTAATTTATTCTGTAGCTTATATTTACAAAACCA
-AGACAAGAACACTGAAAGTTATTTAGAAATAAATTGGCCACATTTCATCACTGCTTGCAT
-TTTTTCACTTGTAACCAactgatatatgagcttataacctgctttatttttttacctacg
-attctatcaggaaaattttcacaggtcttgaatattccttgaaaatacaatttgcagtag
-atgcttataattctgtcatatttttgtaccaatattaacttggaaagtccttaattgtgt
-gtcatttggattattttttctaatgtgtgagtactgtaaataacattgtacaaccttatt
-aatatatcattgtgagattctctgtttgtataggtaaattttagaagttccattgcttgg
-tacaagggtattatttcttctaagttaactggcacatattgccaaTGGTTACTATTGGAG
-TATTTGTATTTTTAACATTTGTATTTCATATTTCTTGCAAATATTTTCAAACATATTGGT
-TGCTTCTAAAATGCATTATTTATTTGAGACACATAATTTTCATTTTCATGTCAAATCTAT
-TGGTGTTTTCTTTGCATTCTTCCACTAACTTAGTAAGTCCTTCTCCGTGTTGAGAACAGT
-TATTCACCTATGATTTTGTTTTTTACACCGGACTCAATCCCACCTTTTTACATAAGGCAC
-AATGAAATAAACTAATATTCTTTAGTATAATTTCCTAATGGGTTATATAATAACTCCATA
-GCCCGCCTCTAGAGATAGTAGTTTATATTCCCTAATTTGCAGAAATGTTCAAATTGATAG
-TGGATAAGAGGAAATTATAATGCTCTCATGGTTGTCTCAAAAGATGTTTCAGGCCTATTG
-CATCCTTGAAATTCTATGAGTTTAAATTGCCTGATTTCTCCCTCTGTCTCTGGAACATTA
-GTGACATACATCGACATACATCACATACTTGTATGTTGTCCTTTTTCTACACTTTGTGTG
-TGTGTATATATATTCTAACATATACATATATATAATGTTAAAAACTCAATCATCAGAGGA
-GGATTAAACAGCTGATAAGGGATAATAGTAGTGGTAATAGCATTCAAAAACGTTTGCTCT
-GTTCACTTACTGTCAAttacctcatatttctttcatttattgtacttatcacaatctgta
-gttattttgtttattcatttacttgtttattttctttctccccctctccaatgtaaggtc
-ctcaaatcatgtctttctgttcattgttttattccctgcatcttgcagaattcttgacat
-ggtaggcactcatcatatacttgttgattaagtACAGTAATGAGTTAAGCAAGGTAAGAA
-AGAGCTCCAGCGTCACTCTAGGGCCTCTATGTGTTAAACCATGTGATGAGATATTTTCAT
-ATGTATATAATATGTACACATATATAGGCAAACCCTGCAGAATGTCTCCCTAATGAATAT
-ATTCCTAATGGAATGGCTTTTTTTATTCTCAAAATTTTGTAAAATGTACTTATATCTCAA
-TATCATATAGGTATATAGGTATAGATGAAAATTTTTTATTTATCTTTCCATAACTTGACA
-TGACATTTTTAACCAGATAATATGTAAGATAAGCCTAGAGTTATCTTCTAAATATAATTT
-TTAGGATCTCAGAAACATGTAAGGGACATTTTGAAAATCTCACCAATTGGCAACAAAAGC
-CATATGTGTTTCAGTAATGGTGAGAAAGATGACAGCAATTATTTTAGCATTTCTTATTTT
-TGAAATGATAGTTTTTACTTCTGTTTAGGTGTTTGTGTTTTAGCTACATTTTAGGAAATT
-GCTTGGGGATTTTGTGTTCATGTATAACAACATGCTATATATTTTCCCATTTAAAATCAT
-GGGGAATTGGCCCCTGGTAAGTGTTTGTATACAGAATTCTGATTTCAGAAATGAGAATCT
-CATACATATCTAAAGAATTCTATGTGTGTTTATAAAATTTCACTTAATCCTCAAAGTAGG
-TATTTATGATTAGGAAAAACATGCTAAAGCAACTGGAAAGGCACTTGAATAAACAGTGCT
-CAAAAACTATTGCTATTTTTTATCCTCCTGTGATAAATACTTAGGCTTAATAATCTATAT
-AATTCCTTTATTCAGGTAATTGGTATGTGAAAAAGTGTCTAAACGACGTTGGAATTTGCA
-AGAAGAAGTGCAAACCTGAAGAGATGCATGTAAAGAATGGTTGGGCAATGTGCGGCAAAC
-AAAGGGACTGCTGTGTTCCAGCTGACAGACGTGCTAATTATCCTGTTTTCTGTGTCCAGA
-CAAAGACTACAAGAATTTcaacagtaacagcaacaacagcaacaacaacTTTGATGATGA
-CTACTGCTTCGATGTCTTCGATGGCTCCTACCCCCGTTTCTCCCACTGGTTGAACATTCC
-AGCCTCTGTCTCCTGCTCTAGGATCCCCGACTCATTAAAGCAAAGAGGCTTATTCTGGTG
-TCAGTTTTCTCTCTACAGCCCCCTTCCCACTTTCCCTCCATTCAACAGTGTCTGGAAGGG
-CACCACAATTTCACTGCACTCGCATTTCTATGGTAGAAATGCAAATAAGATAGGGGCCAG
-GAACAAGGGAGGGTTAGTCCAAAACACCCACTCAGGAATGATAGATAGTAGCAATGTCCT
-CCTTGAAGACAGTTCTAGGCCCACAGCTTGCCATAGCAATTATCAtcaaacttcatgtac
-atcagaaacacctggagagatggctaaagcacagatttctagggctcacttttagtttcc
-aattctgcaggggagcttgagaatttgcactgctcacaagttcccaggtgatgctagggc
-tgctggtccaggcaccacactgtgagaacAATTAGCTTATAATATGAAAGGATTGAAAGC
-CGACTGTGAATGTGATTTTCTACAGATTGAAGGCTGCATTTCCTATGTAGTTTTGGAGTA
-GATAGTAATACAAAatcatcctacagaatcctccgacaacaacctgagaatgtaggtatt
-ataacctcactttagagaataggaaactTGATTTCTAAGCATTAGAAGACTGGGACAGAC
-TAAATTGACTACTGAGAACATTCTGTCACTGCACCATGAGGTTGCCCAATTTTCTTCTCA
-CCCTGGAAATCCTCATTCATAGCTTCCAACTTAAATATGATGAAAGGGAGATCAAGAGCT
-CTATAATGTGTCCTGAATGTTAGGACAGGCACTCATCCCAAGCAATAGAATGTTTTCCGT
-ACATTACATTACATTGATGCTCTGCCTGCACCAATAAGAGAATATGACTGGGTGTATCAT
-AGTCATCCATCCATGCCTCAGGCCCACTTCCCTGATAGTTGGACAGGGAGAATAGGGAAT
-GCAGATGCCTTCGCTTTCTGGACACTTACAGTAGCTGTGTTTGTCTTTGTCATCTCAGTT
-TGCTCACTTATGAAATGCTAGCGTTTTACTCAGTATCTTTCTCCCCACCCCTGTCATAGT
-ACATCTTTCTGATTCTGAAGATATAAGATTGGCTTATGTTTTGTGGGGTCAACTTCACCT
-TTGACCCCATAAGATCCTAGAGATTTAATGTAGATATATAAAAGTTGGAGAAAACATTGG
-TGGAAGGGTTTTCTCCACTATAGACACAAATCCATGAGTGTCATCACAGACTCCTTTTCC
-TTCTTCACTTGATTCCAGTGAAGATCCATGTTCAttctaccacctccaatatgtaccatg
-acctctatctccagctgctgctaggatgattgcaatagccttcccattgattgccctgca
-ttcctttcacactcacgcctaactatcctccacaatgagagccagaatcatttttctgaa
-acacagatctaatcattagactcccctctggcatcttttcccatagcatcctaagacaac
-tcttcagagcagccttcatcactcttggcattcagaacctgccttgcgtttccagtttta
-cctccaaagcactgtcacagggcatcttgctatcccaccaacatacctcttcgtgattgg
-tttgaactcactggattgcttctggttttgagtttttgtacatacttttctgtctCCATT
-TATAACTGCCTGGAAAAAAATCTTTATTTTCTTCTGGAGGACTTTGATAACCACACTGTT
-CTACCCACAATAGAACTACTGCCACCATTTGTGCTCCACTGTTATGACTTACCCAGAATT
-TTAAGTCATCATGTCACATGCCTCACTCTGAATATCTGCTTATGTCTTCTCCCCTACTGG
-ACTTTGAAATTTTATTTAGGAACAGGAACCATCTTATCTTCTCTTTCTCCTACCATCCCC
-TAACAAGATTCTATATTAATTCTTGTTGAATAAGTAAGAGGGATTCTCGAAGGCCAGAAA
-GATCTTTGGATGTTACTGAAATCTCATTTTTATTTATTTTAGATCTTCTCCAGGAAACAG
-GCTTCTGTCTCCTTTAGAAGACATATCTATGATCTATGTCATTACATAGTAGAGGAGTTT
-TGAGAGGTGGCTTGTCCCATGTGGTAGGACATCATTGCCTCTTACACCCATGCTTATCTT
-TGCAGGCAGAACTCATGAACTCACACAAGAAGGTGGGCAGATGGAAGCAAGTTACTTCAg
-cagaggagaatagtaggaaaaaaacataactttagagctggatgtatctgaggtcattca
-tgatcccaccatatatccactcttggaccacagacaaatgatttcccatcttcgagcctg
-ttactgaatttgaagaacagagaaaatactcactcccactcaaggtactttgagggttgc
-cagagtaatctattaaaatgttaatcataTCATAGGGATTCAGCTGTAACAGGTTGTTCC
-CTGGATAAGAAACAGTACAGCACATTTCCCCAGGGCCCTGCCCACTGGGCCTTGGCTGTC
-TTGCCTGAGTATGGGTGATTATAGCCTATGTTTCACCTGGGGGAAGACGCATTAGGCTGA
-GAAGAGTGTAACAGAGTTGAGGGTCATGGGATCTCTTTGAACAGCCAGATGAGATTTTAA
-AGGTTCTAGTAGAACTTGCTGTGCTTACTTTTCAATAATCACCTTGATCACTACCTTGGA
-AACATCTTAGAGCTATTATCACATTGATTCTAGACGATGAATATAATCTCAGTGCTGCAG
-CCTGAAACATTGTCCTCCTGTCCTCTTGCCTTATATCTCATCCGTCCTTCACGCAGTGCT
-GGAACTTAGGTGGCAAATATTCTTTTCCCACTTTGGAGTTGACTAATGGCATTAGGAGGC
-CAAGGGAAAAGGAATCTTTATGGTGAGAGAAACTGCAATGTGCCAAGCACATTAATACAC
-AATTTCTTAAACAAAAGCATTGTATGATAATtatgacaacatgattaaagctgaggaacc
-tggagtaaaatgtatctagggttacatctaggtttgttccttactacttttactcatcat
-gtggtctctatatcaatttcttcatttgcaagacaggtataatcatgcatctacctctta
-gaatcactctaaaaattaaaatagataaggcatataggtcaccgtgatctctagcaccaa
-tgaaattctaagaaatgtagatttTAAAAGGCATATGAGATATAGGTTATTCTGGTTTAA
-AATATGAAACGTTTAAAAAATAAAATATGTAAGTCCTGAGTTTCCGGGAGAAAAAGGGTC
-TTGCACAAGAACAACCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCCGCATCTCTA
-CCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTTCTCAAGGCC
-GCATCTCTACCCCATCTCATGCGAATCCTGACCCATATTTGGGAGGCAATTTTACCTGTT
-CTCAAGGCCGCATCTCTACCCCATCTCATGCGAATCCTGACGACGTCCTCAAAGCTGAAT
-AAATTTTTGCCTTAAATAAATTAAACGAGATTTAGATTTCACCAGTCACTGATACTCAAT
-CCCAATTGGATATTCATTCAAAAGTCTGACTTCTCTCCTGAGGTGAGAGTAAGATTCCTG
-GGCACTTTTTCATAATACTTACCTTAACCTAGCTAAACACAATGGACACTCTTCTTTGAG
-gtgtcagtggaaattaagaggagagtctgaactcttacctcccacatggggcttgcagac
-aggtgaagatggcgctcctcccctttgttggtaatggagacctagaagaaaggctgggca
-tccagctcccacgcagtcatatgaagcagcccagagcaacattccccttcactgcctgtg
-cggtggcagtagagacctagcAGTAGAGACCTAGCTGGGAGTCAGATCTCCCATCCCTCA
-ACCAGTGGTAGTGATTGGCCTGGGgaggaatcccttccctgctggtgccatgtcagtgaa
-aactgaggggagactgaaattgcccttccttccaatagtataaaaggcctgaagcagact
-tcccttcccagccagtacattaccattgaagaccaaggggtggtctcaacttcaatccct
-aGGGAGCCGTGGCTGGCATCAACCCTCCTTCCAGTCAGTGAGGATAGAGGATAGGAGGGT
-GCTGGAAAATAGGTGTCTTTAAAACTGAATAATGTTGTTTTTACCACAATTTTAAAAACT
-GAATAAGAAGACATGGCAGACCCCTGAAACTGGATAACTACACACGGAACTAACCAGAAT
-TAACATGCAGAAGGTTTGAGAATAGAACTGCAGTGGGGAATACCACCTAGATTTTTAaaa
-taacaacttgtatatatttaaggatatatgcaatatgatgttttgatatacatagacata
-gtaaaatgattgctataatcaaattaacatatccttctcttcacatagttatcatttttt
-gaggagacagcacctgaaatccatcttcttagcaaatttctagtatacaacaccatatta
-ttaactagagtccccatactgccctttagctctctagactttatcctacacaacttcaac
-tttgtacccttcgacgagcatccccccatttcctccaccacccgccccacccctgataat
-cactggtctacactcttctatgtatttgaatttttaaattccatgtataagtgagatcat
-gctgtactttttttctgtgtctgtcttatttcacttagcataatgtcctctgggttcatc
-catgttgttctgaatggcaagctctcctttgtcaaggctgaataatatgccattgtatat
-atatacaatttatttagtgtgttcatctatcgatgtcgatagatgataatgtcttcatct
-atcagcttaggttgatttcatatcttggctattgtgaataatgctgagcacagatatctc
-tacatggtgccgatttcatttctttttggtatataccaagacgagggattgatggctcat
-atactagttctgtttttatttttttgagaagcctccatactgttttacatcattgttgta
-ctaatttacatttccaccaacagtgcgcaaaagttccctttacattctcaccaatacttg
-tgatctcttgtctttgtgataatagtcatcctaacaagtgtgaagtgatttctcattgtg
-cttttgatttgcatttccctgatgattagtgatgttgagcacctttccatacacttgtta
-gccacttttatttcttctccagaaatatttctgttcatgtctttgcccaattttcaagtg
-ggctctttgttttttgctactgagttgtgtatgtttcttatatgttttttatattaacct
-tatgtgatatatggtgggcaagtattttcctcccatcccataaactgccttctcactctg
-ttgactgtttcctttgctgtgcaAcaaatgatcttcaatgataatacaaagaatatgcaa
-tacagaaatgatagtcacttcaacagatggtgttgggaaaactggatttccacaggcaga
-acaaatgaaatggatccttatcttacaccacacacacacacacaaactcaaaatggattt
-aaagacttaaatgtgagcctggcaaacttaaaactcctaaaataaaacagaagggaatat
-ctttatgactttggtctaggcaacagttgcttgaatatgacatcaaaaccacaagcaaca
-aaagcaaaaatatattagtgggactatggatacatttgaaacaaactacaaactagtaaa
-atctcagcaaagaaatagaagatataggccaggcacggtggctcacgcctgtaatcccag
-cattttgggaggccgaagagggcggatcacgaggtcaggagatcgagaccatcctggcta
-acatgataaaaccccgtctctactaaaaaaaaaaatacaaaaaattagtggggcatggtg
-acaggcacctgtagtcccagctgcttgggaggttgaggcaggaggatggcgtgaacctgg
-caggcggaggttacagtgagccaagatcatgccactgcactccagcctgggtgacagagc
-gagactccatctcaaaaaaagaaaaacagaaaaaagaaaaagaaatagaagatatgaaaa
-taatcaaatggaaattataaatttatgaaatgtaatcaaagtaaaaaagaaaaagtcact
-gtataggctcaatagtagatggaacatgacagaggaaaaaataagacagatctatagaat
-tacccaatctaaaaacagagaaaaatagactgataaaaatgaacagagccacagatacct
-gtgggacataaaaagatctaatgttcatgtcatcagagtcctcaaggagagggagagtgt
-ggaactgaaaaaaatatttgaaggaataatgcctgaaaaatatcccaagtgtggcagaat
-acatacatctgtaattcaagatcttgaattaacccaaaacaagataaacccaaagaaatc
-catgccaagataaagtataatcaaactaaaactaatagctagagacagaaaaaaatcaag
-cgagcattcagaaacaatacaccacccatggtaaaacaatggtttgattgatgggatttg
-tcatctgaaaccatggaagcaaaaaagaaatgtcatcacatgtttcaaatgccaaaataa
-agaactatcaaatccaaatcctatatctagcaaaaaaaaaaaaaaaaaagttctctagga
-ataaacagggaaagaaaaacattctcaaacaagaaactattaagggaatttgtcactagc
-agccctatcctaaaaatatagtcaaagaaagttctctaaaccaaaatgataaccgggggc
-ttggaacttcagaaaggaagaagtcgaagtcaatagaatgggtaaaatgggaggtgaata
-taatagactatgcttttttttttgctttattttttttttatgctttcttttcttgagata
-gtgtctggctctgtcgcccggacaggagtgcagtggtacaatctcagctcactgcagcct
-cgacctcctgggatcaaaggatcttccctcctgagcccagtgagtagctgggaccacagg
-agccggctaatttttatatttttttgtagagacagggtttcactgtgttgcccaggctgg
-tctcgaactcttagactcaagcaatctgctgcctcggcctcccaaagtgagactatcttt
-ttattaaagagttttgaaatcatgtttggtagattgaagcaaaaattgtaacattgtctg
-atgtggttctaaatagatgtagaggaagtacttaaacattataagctgggtaaggcaaag
-aaatttaaagtgaggtaagtttttatacttcattcaaacttgtaaaactttgacaccgta
-gactgtgataagttaggtacagcaaccactaaaaaaaataaataaatacaataagaaatt
-atagctaaattatagtggaattctaaGgaacaaatagaaaacaaaatataaaatggtaac
-ttaatccctaacatgtatcaaaaagataccccatacaaatattaatcataagaaagtagg
-aatggctatattaacatcagttaaagcagacttcagagcaaaacaaattatcaaggacag
-agagggaaattatataatgccaaaagggtcaatcaaccaagaagacatggcagccctgat
-cgtccacaaactgaaaaccagagtttcaaaatacctgaagcaaaaactgataaaactaag
-aggagaaataaatttacaatatcaggccaggcgtggtgactcatccctgtaattccagca
-ctttgggaggctgaggcaggcaaatcacttgagcttgggagtttgagatcacctgaggca
-acatagtgagacccccctctctataaaagatacaaaaactaaggtgtggtggcccacgcc
-tgttgtcccagctactcaggaggctgacatggaaggcttgagcccaggacatcgaggctg
-ccgtgagctgtgcactccagcctgggtgacagagcgagaccccgtctcaaaaaaaaaaaa
-aaaaaaaaaattacaatatcaacttcaacagttgatagataggacaactagacataaaat
-ccacaagggtgtagaagaatttaaaaataccacaaagcaacaggatctaatagacattta
-taaaacatttcatccaacaacaatggaatacactccttggtgtttatgccaaggaaatga
-aagtgtttttctccacaactcccgggcaggaatatcaatggtagtgttatttataatagc
-ccaaaagagtaaacaaccaaaacgtcattcaacaggtgaatgactaacatagggtggtac
-atccatacaatggaatacttctcagcagtaaaaaaaaaaaaaaaaatgaattattgatac
-atgcaacagcttatatagattataagagcattatgctgagtgatgaaaaaagacaaaggg
-tcacatagtgtgtgactatattcacataacattgtctaaaaattatgaaatgtagaacaa
-attagtgctttccaggggttatgaatagtcaggagagggagggaaatatgccagtaagac
-aataagagagggagatcttttcataatgaataattctgtattttgatttgttgatggtta
-aatgaatctaAGAAGGATCTGATAATCTAGTATTAGACGCATAGTACAGTAGTGAACTTT
-CAGCCTCTAGAGAagtgctctccaatagaagtaactaaaaagatggaaatgttctaaatc
-tgtactatacaatatgttagccactggtcatgtggttgtaaagcacttgatatgtgCTCT
-ATAATattttgagcaagtttcttatgttttctgtgcctttgagtttctcatttgtagaat
-ggagataataatatctacctcaaagtgttgctgtaaaggtaaatgagtttatgtatgtaa
-gacaccgacaggagtgccagcacatagaaagtgttatacaagggttagccattTGTTATT
-GTCATTGTTGTGTTTTGTTCTCTTTCTAATGTCTGGACCTTCAAAtgattcagactcatg
-ggaccatacttcattctgtttttataactttaacctgtaagattctcattttaattggaa
-tttcatatttaggaattcttgggtgccttggatatatgaagaaaagattcacatctgctt
-ccactaaacaactagcgaattaacaactgagatttcttataattaaattatttacttgat
-ttttttaatccatataaatagcttgaacttaggttgaaacccatgagaatttgtggctac
-agttcatagggttaatatttaccttctccatccagagccaaggttaaTGCTGACAAAATA
-CAATCTAATACAGATTAATCTGTGTGTGTGTGTATGTATACACTCGTGTCAGAGAGAGAG
-ATTTCATTCTTCCTTAGGCTGAGATTGTTGCCTTTGAATCTCAGGTTTATATAAGGGTAT
-CAATTATATGTCTTCCCTAGGACTAGATCTTAGCTTTATACATCTCACATAGCCATCAAA
-ATAATGTTCAACTTATCTTTCAGGGTTTGCAATCTTAGTTTTTGGCCTGTGCAGATTCCT
-TTCATTTTTGACGGTTTCTCAATGCAGTAATTTCCTTTTTACATTTACCCAACTTTTTTG
-GTTATTTTCACCAGATACATTGTTCAATATATCTATTCTACTATATTCTATTAATAACAG
-TCTACTATATATGTGTCTTATTGTCTAatattgctgaaatctttttttaatccaataatg
-aatctctgtcatctaatcagtgagtttaagccatgtgaatgtattataactactgatcta
-ttaggacttttttctgccCTCCAGTTGTGACTTATCTATTCCTCATTTTTTTTAGTTTCT
-GTTGGATGGATCATATGTTCTTCTGCTAATATGaatattataattttatttttatttgtt
-ttattaaaaatttGTCCTTGCTCTTAGGACCCATTCCTATCCTTATATTTATTATTACTA
-ATTTAACATCCAGCTTCAGAAATACAACTTTAATAGGAAGGCTTTTTGTATTTCTCCTGA
-CTGCTCAGACTTAGGGTCTTTATTTGATGCTCCACCACCAAGTCACCTATAAGGAAAGTT
-TGCATTCACAGGAAGACTATAAATAATAAAACCAATCCCTTGACTAGGACTTAAACCATG
-TAAAAGCTGGTGGCAAAAGTAAAGGGAGGTGACCCTTGAGACCTCTGAGGTAACTGCTCT
-TAAATTTACATTTGCCTCTAAAAAGGATTTCTTATATGTCAACATCTCTCTGTTTAAACA
-TATTCTTGTGTAAAACCACTACGTGACCTGAATAATGGCCATAGGGCTCATCTCTAAGCC
-AACTGGCTTATTTATTTAATGCATCTCAGTGGTTAACAGGGTTGAAATTTTTTGAAAACT
-GCAATCAATGATCAAAGAATGATCTAGGTAAACATCGATTCCTTGTGGCAACATTTTAAT
-ATTTTCAAAGACAAGGTACAACTGGTAGAAAAAAAATACCCTCATGCATCTTTttcttct
-aattgtggtaaaatatatgacataacattggccattttagccatttttCCttttattttt
-agttgacacataattgtacttatttataggatacaaagtgatatttcaatacatgcatat
-aatgtgtaatgatcaaaccagggtaattagcatatccgtcacctcaaacatttatcattt
-gtattgggaacattcaaaatcctctcttctagccttttaaaagtatacaataaattgtag
-ttaaccatattcaccttacagtgctacaacaccagaagtcattcctcctatctataattt
-tgcatccattagccaatctctctccatcctcccctctccctaatcattaccagcctctaa
-tattaatatctgcaacactactctctacttccatgtgctcaacttttttagctcccatat
-ataaataggaacatgtggtaatctttctgtgcctgacatttcacataacataatgtcctc
-caggctatccatgttgttgcaaaggacagaatttcattatttttatgggtgaatagtatt
-ccattgtgtGTGTGTGTGTATATATATATATATATATTCCATTGTGTGTTATGTATGTAT
-AGTATTCCATTGTGTGCatatatatgtatatatgtgtgtacatatatatatacataatat
-atattcttctgcacatggaaatccagtttctccagcatgatttattgaagagggtatcct
-ttccccagtgtatgttcttggtgcttttataaaaaatcaggtgacCTCAGATCAGACCCA
-ACTACATCATACCTTCTTTCGAAATGTGCAAGAAACCTACTAGAAATTCTTATTGTTAGA
-GTTTCAGATTTATGTCCTGGTTTATACTGCCACATTCATTCTTGGAGGTGAGTACATTTC
-GATCTTGGTCCGGCTGCGCAGAGAGTCAAAGCAGGAAAATCACAGATTCTTCCCAGCAGT
-CTACAGCCTACACAGCGGCATTTGGTGCGATGGGATGGAACATGCTGTATCTCTATTCCA
-TGTGGGGGTAAAGTGGGTGGCCTGAAATTTCCTGTGTCTGCCTGCATGATGCAAAGCTCA
-CAGTTCAGAAGCTTAAGGACACACTTCATATCATCCCATCTGTTCTGGTTCAGTGCATAA
-GAATCTAAGTCTCTGAGGAAGGTAGCATAGTGTGCAGTTCACTGGACCAAAAGCTTTGGC
-TGCACCTCTTCTGGAAAGCCTGGCCATGGGGCTCTTCATGATCATTGCAATTCTGCTGTT
-CCAGAAACCCACAGGTAAACCAAACCAGAAGCTCACTCAAATCAACAGTGGGATGGAGCA
-TTTTCAGGAGCCAAAGGGAACTTCATAATCCACACTAAAGGGAAATAGAGCCCCCAAAGA
-TGGCTAAAGTTTATCCAACATCATCAGAAATTTCCTCTTTCTGGAGCCTTATTCCATGTT
-ACTATCCTTAAAGAGGAGTACTCACTGAGCTAAAAAGAGGTCATAATTTCTTCTGGGAAA
-GATGTGTTGTTATAGAAAGGAATGATGCCAATATCTAGGGATACCTTTATGTCTTTGGAT
-ATGGTTTTTACTCTGATGCTCAGCTATATTTCCTTTTACTCAAATATATATAtgtgtgtg
-tgtgtgtgtgtgtgtgtgtgtgtgCATGAatagaggaagaagcaaattttggagttaggt
-ttaagaaacatgccttcaatatctactagtttgtcaactttaagtagtgaagactctagg
-agcctcagtttcctcatctatggagataatgacacctggttaacaggggttttattaaat
-gatataacctatgtgaagcttggcacatactgagaactcaaaaatTAGAGTTTCCTTTCC
-TCTTTCAAAACCAGATTTCTTACATGTGTCCCTTATTATAAGAATAGTAATGGCCTATTC
-CTGACCCTCTACATTCCTAAGACCCAATAGACTACTACCTTACTGGATAACATGAAAGTC
-ATTCTTGACCCTGATAGTGGGTTTGAACTCAGGAGAACAGTTTGATTCAGACATAAACAC
-ATAGTAACAATACATTGTTCTCTGGGCATCAGAGGAGGTGCAGTAGAAGGTAGTGCTCTG
-GGAGCATTCAGGATGCAGGCAGATTTGCTGAGGTTCCTATGTAGAGCATAGTTCCATAGC
-CTAGAATCAAGGGTTCAGCTCCTTTATTTTCTCAGATAAGATCTTATGTTCTTGGCAGAG
-TCTATCAGATGTTAAGGGAGGCCTAAAACCTCACAGGACCTAAATATAAGTGATCCAGTT
-AAATACAAACACTGAGGTTGACCTTGTCGGAAAATCCTCTTCAGAATATATGAGGGTCTG
-CCTTGTGGATACCCCATACCCCTAATTCCTACAAGCCTCCTCTGTCTTCCCCAAAACCAA
-CGTGCCTTCAGTCTCAAACACTGATATTGTTCTATTGCTCCTTTCTGTGTATAGTAACCG
-AACAACTTAAGAAGTGCTGGAATAACTATGTACAAGGACATTGCAGGAAAATCTGCAGAG
-TAAATGAAGTGCCTGAGGCACTATGTGAAAATGGGAGATACTGTTGCCTCAATATCAAGG
-AACTGGAAGCATGTAAAAAAATTACAAAGCCACCTCGTCCAAAGCCAGCAACACTTGCAC
-TGACTCTTCAAGACTATGTTACAATAATAGAAAATTTCCCAAGCCTGAAGACACAGTCTA
-CATAAATCAAATACAATTTCGTTTTCACTTGCTTCTCAACCTAGTCTAATAAACTAAGGT
-GATGAGATATACATCTTCTTCCTTTTGGTTTCTTGATCCTTAAAATGACCTTCGAGCATA
-TTCTAATAAAGTGCATTGCCAGTTTTCTGTCTCATTTTGTTCTTTAACCAGGGGTTGAAC
-ACTCATTATATACTAGGTAATGAATTGATAAGAACTCAGAACCTCTCCTTGAAAAGGGGA
-TATGACAAGTACACTAAAAAAAAAAAGTCCTATAGTGTGGAAGTCTGGAATAAGAAACTC
-AGAAACACTGACATGTAATTTAGGAGAGGGAAAGGTGAAGCAAATATTCAGGGGAAATTC
-ATGAGTAAGTTTAGGAATAAAGCAGTGTCTTGTAGTAAATAAGTAAATAGTAAAGCAGTA
-AATAAGTAGGATTTCCATGGATGAGGTTTGGTAGGGAAGGCAATTTGAGTGAACAGAATG
-GGAGGAAATTGGAAAAGACAGAACATTTCAAGACACTATACATGCACTTTGTTTGGATGA
-AGAACAGAGCACTCAAAGTTGAACTATGGGGGAAGTCTGATTTCCTAAGCTCCTGTGTAC
-CAGCAGTGAACTGGGAAGACGGAGATAAATAAGATTCCACTGTTGTGGAGCTCAACAGTG
-GAGCTCAACGCTTCCTCTATGAAGTGGAGAAGACCTAAGTAAATAACTCCAACACAAAAG
-TTTTTAGGTTTTTGCTttgttgttgttgttgttgttgatgtGTTCATCTTTTTTGTTATT
-GGGGCCCTGTGGAGTTTAGGGGAAATGTAAAAGATCTAGGAATTGGTCCAAATTGTAGTG
-CTTTCATTGTCTTGATATGCAAGAAGAATAATCCATGTACATACTCTGCTGAATTCTTAA
-AGATGTACCTTCTGAATATGATTAACATGGAAAGTTTCTTCTTCAACTACATTTCAAAGT
-CATTTGCTAGTTTTGTTTCTTATATCATTTCACCATAACAATTACAAGCATTTTAAAGAT
-TTAGTTCATCCACTATAACATTTACCACTAATGTGTGGCATGTGTTCTCTTAATCTCTCT
-CTTTCTGGTGttctagggctggtatagggagcacctaaaacaagcctaaaatatcttgtg
-gtgccagaaagtaagcaattgcttaataatcaaaggatagggtctgcaaacacggacaat
-ttgacttcctcttttcctaattgaataccctttatttccttctcctgcctgattgccctg
-gcgagaacttccaacactatgttgaataggagtggtgagagagggcatccctgtcttgtg
-ccagttttcaaagggaatgcttccagtttttgcccattcagtatgatactggctgtgggt
-ttgtcatagatagctcttattattttgaaatacgtcccatcaatacctaatttattgaga
-gtttttagcatgaagggttgttgaattttgtcaaaggctttttctgcatctattgagata
-atcatgtggtttttgtctttggctctgtttatatgctgcattacatttattgatttgcgt
-atattgaaccagccttgcatcccagggatgaagcccacttgatcatggtggataagcttt
-ttgatgtgctgctggattcggtttgccagtattttattgaggatttttgcatcaatgttc
-atcaaggatattggtctaaaattctctttttcggttgtgtctctgcccggctttggtatc
-agaatgatgctggcctcataaaatgagttagggaggattccctctttttctattgattgg
-aatagtttcagaaggaatggtaccagttcctccttgtacctctggtagaattcggctgtg
-aatccatctagtcctggactctttttggttggtaagctattgattattgccacaatttca
-gatcctgttattggtctattcagagatgcaacttcttcctagtttagtcttgggagagtg
-tatgtgtcgaggaatttatccatttcttctagattttctagtttatttgtgtagaggtgt
-ttgtagtattctctgatggtagtttgtatttctgtgggatcggtggtgatatccccttta
-ttgtatatgtagaaaaccccattgtctcagcccaaaatctccttaagctgataagcaact
-ttagcaaagtctcaggatacaaaatcaatttaccaaaatcataagcattcttatacacca
-acaacagacaaacagagagccaaatcatgagtgaactaccattcacaattgcttcaaaga
-gaataaaatacctaggaatccaacttgcaagggatgtgaaggacctcttcaaggagaact
-acaaaccactgctcaaggaagtaaaagaggatacaaacaaatggaagaacattccatgct
-catgggtaggaagaatcaatatcgtgaaaatcgccatactgcccaaggtaatttacagat
-tcaatgccatccccatcaagctaccaatgcctttcttcacagaattggaaaaaaactact
-ttaaagttcatatggaaccaaaaaagagcccgcatcgccaagtcaatcttaagccaaaag
-aacaaagctggaggcatcacactacctgacttcaaactctactacaaggctacagtaacc
-aaaacagcatggtactagtaccaaaacagagatgtagatcaatggaacagaacagagccc
-tcagaaataacgccgcatatctacaactatctgatctttgacaaacctgagaaaaacaag
-caatggggaaaggattccctatttaataaatggtgctgggaaaactggtagccatatgta
-gaaagctgaaactggatcccttccttacaccttatacaaaaatcaattcaagatggatta
-aagacttaaacgttagacctaaaaccataaaaaccctagaagaaaacctaggcattacca
-ttcaggacataggcatgggcaaggacttcatgtctaaaacaccaaaagcaatggcaacaa
-aagacaaaattgacaaatgggatctaattaaactaaagagcttctgcacagcaaaagaaa
-ctaccatcagagtgaacaggcaacctacaaaatgcgagaaaattttcgcaacctactcat
-ctgacaaagggttaatatccagaatctacaatgaactcaaacaaatttacaagaaaaaaa
-caaacaaccccatcaaaaagtgggtgaaggacatgaacagacacttctcaaaagaagaca
-tttatgcaaccaaaaaacacatgaaaaaatgctcatcatcactggccatcagagaaatgc
-aaatcaaaaccacaatgagatatcatctcacaccagttagaatggcaatcattaaaaagt
-caggaaacaacaggtgctggagaggatgtggagaaataggaacacttttacactgttggt
-gggactgtaaactagttcaaccattgtggaagtcagtgtggcgattcctcagggatctag
-aactagaaataccatttgacccagccatcccattactgggtatatacccaaatgactata
-aatcatgctgctataaagacacatgcacacgtatgtttattgcggcattattcacaatag
-caaagacttggaactaacccaaatgtccaacaataatagactggattaagaaaatgtggc
-acatatacaccatggaatactatgcagccataaaaaatgatgagttcatgtcctttgtag
-ggacatggatgaaataggaaatcatcattctcagtaaactatcgcaagaacaaaaaacca
-aacaccgcatatcctcactcataggtgggaattgaacgagatcacatggacacaggaagg
-ggaatatcacactctggggactgttgtggggtggggggaggggggagggatagcactggg
-agatatacctaaggctagatgacgagttagtgggtgcagcacaccaacatggcacatgta
-tacatatgtaactcacctgcacaatgtgcacatgtaccctaaaacttaaagtatttaaaa
-aaaaaaaaaaggatagggtcatattaaaagaacacaggagtcggtctaaaagagcttcaa
-atgaccaaagctgcgacaatttgagcaataaaataaataagatagcattggattataata
-caacatataataaatatctatgagtccatgatgatatgaataaataattgaataaattgg
-aaaattggtgagaacagatgtgccatatagaataattcccaataattcatacagatactc
-cctgctgaagaaggtggagcttgacctccctctcccttgagcatgggctgtatttagcta
-cttgtttccaaagagaagtgtgtggaaaggagttaaaaaataatttcacctggataaacc
-tgataaggtcatgtttcagattttatggagaaatcatattgataacatgaacctgtgata
-tgatctgatgagaatggcacttcacttctgttttcttcctcccaaaaccctgcgacccaa
-gacaaacaatgaaaaacatcagaaaaactcaaattcagtggcattctaaacaatatttga
-ccagtatttctaaaaactgtcaaatttatcaaaaaggaagaaattctgagccacagtcaa
-agaccagagaagcctaaagagacaggacaactaaaggtaatgtggtatcctggatggact
-cttggaacaggaaaagaacattaaggaaaaactagtggtgataatagtaataataataag
-tgtagagtcatttagtagcaatgtatttagctgtgatggctgcattgtggtaatataaga
-tgttaacaatagcagaaactgggtgaatatttgggagctctctgtattatctttgcaaca
-tttctataaatctaaaactattctaaaactgaaaatgtatttAAATTTTAGAAAACTGAC
-CACAAAATCAATTTGGCACATTCCTTTTCTTCTTATTTACGAAAGAGCTTCTCatttctt
-cattgaatgcttggtagaatctaatggtaaattcaactggaacggaactctttacaggaa
-gtattgttatagattaagtttattgcaggttaaaaggcaattcagttttctatgccttct
-agtcaactgttgtatttggcatatatacttttcccatgttctaagatttttatacttgct
-atcctaaaactcttgtaatatcttctttttatcttattaatgcctgtaagatatgtaatg
-acaccttctttttcatttttgacatctattatttgttttattttctcttttttcttgata
-agtctcacattcacttattaatttgatttatctttacagaaaacaaattttcttcattaa
-ttttAGTTTAGTTTCCATTTCTTAGACtgtgacttgcattgcccaattgaaagtgattga
-aagtgacaggttcacttccaagtggaaacttaagagccagtgtgtccatgtgcagtggct
-cacacctgtaatctcagcactttgggatgctgaggcgggcagatcacctgaggtcaggag
-tttgagaccagcctggccatggtggtgaagccctgtctctactaaaaacacaaaaattag
-ccaggcatggtggcagggcctgtaatcccagctatttgggaggctaaggaaggagaatca
-cttgagcccagaaggcggaggttgcaatgagctgagatcatgcctctgcactctagccta
-ggtgacagagccagactctttctcaaaagaaaaaaaaaaagagccagtgtgcagtttaac
-cgtctctcatctctctgccaaggtgattgtggaagcactgttgacatagagcctctgtca
-gcctgaagccccgagtgaccatgaaagcagggtcattcttttgacctaaaatagacatct
-agcactgccagaaataaccttttgggaagttactctatgagagctgaggtttgtttttta
-ttTTGttttatatatattttttaaatCAGGAATAACTTAGACCAGGGTGAACAAACTACT
-GCTGTCAGGGCAAATCCAGCCCATAGCCTGCTTTTGGAAATAAATTTGTATTAGAacaca
-cacacacacacacacacacacacacacacacacacatacacacatacacacaAATATATC
-TTCACTAATGTTCTTTTTTTCTTGTTTTTCAAAAACTtttacataccataaaattcacct
-gttttaagtgcacaatttagtgTCATTTCTATTTTTTATTTTCGgtatgcttttcttttt
-gtaactttgttaggtgcatgtttatctttataaaagaaaagccttccttcttttcaaata
-tgagagtttaaagttgtaagtttctctctatacacagcctgagcaccatcccacaaattt
-tcaatatagagtatgttcattgttacattataaaccttctcatttctcttAAACCATGAG
-CATATAAATAACATATAGATTATATAAAGACTATGGATACAAATGTTAATCATGCAATTT
-TGTCAACTAGTTATAATTACATATACAGTAACATTACTTTGGTGATATGTAAACCAAAAT
-GTAAACAAAACTTGAAAGCAAACAGAAAATATCATATGCAAAAACTTGTACACACTTGTT
-CTTCATACAGTTTGTTTTCAAATATGATCTTCTATCTTGTTATAGGTTTTCTATGGCTTT
-AAACTGACATTTATTTTTCATTTATATTGTCCTCTGTTATGATTCTTCCAGTCCTGAACT
-TCCTGCATCAGTAATTTTTAAAGATATTTTTGGTTTACAGAAGTTTACCAATTATTACCA
-TAATTTATCATCAATTTATTAACTCTCACCATCATTTCAAAAGTGAAAGAAATTTCACTA
-CCTAAAAATATGTATGTATGACATTTTAGAAGAAAACAGACTTTTAACTAAATGCATTCA
-TGTCTCTTAAAATTTAGTTCTATCATTTTAATTTTTTTCATTTTATTACAGACCAGTTTA
-AACTTTGTCAGAACCCCATTAGGGCCCATGTATCCATTTAACAACAAAATTCTGTAATTC
-TTAAATTCTCAAATTCATAATTTATATAACCACTGATACCCAATTGGTAGTAGTCTTCTG
-AGGAATGTTTCTATTCCATTATTCCTTGTCTTCTCTAATCACTCTCTGAATCTAAACTTC
-TCTTTAGTTTTTTTTCCCTATAATTAGATGTTGAGGTGTTTGGCTTACTTATCTTCTTTA
-TTAGAATAAATAATATGTATCCCATCCCTAATGATTAGCACTTTGTCAATTTTTATATGT
-TTATGACAGGTGGACTCACTCTTATTCTAAACTCTGATATTAGTGATATCCAATGCCCCA
-TTCAGAGACCATTAAATTAAAAATGCACTTATTACTTCTGGGACTTTCTAGACAATTTCC
-TTCATCTTTAAAAGATCTGGGACAAACACCACAAGCTTTGTCCCACATGAAAGTTCTCTG
-CCCAAGTAATGAAGCATCTAAAAATGCTAGTAaagatattagattttaatataacacatc
-aataattatatttaatataaatgatctaaatcaggggtccccaccccccaggccatggac
-cggtataggtttgtggcctgttaggaactgggccacagagcaggaggtgagcagcagtgg
-gagtgagcattaccacctgagctctgcctcctgtcagatcagctgtggcattagattctc
-ataggagtttgaaccttattgtgaactgcacatgcaaaggatctttgcgtgctccttatg
-agaatctaatgcctgatgatccaaagtggaacagtttcatcctgaaaccatcttcccatc
-cctgccagtttatggaaaaattgactgcattaaaccggtccctggtgccaaaaaggctgg
-ggaccactgatctaaatacaccaataaaaagaaaaagattgtaagattggattttaaaag
-acctgactctatactgaccacaaaaaaAAACCCTCACTTTATTCTTTattgcatatattt
-atggtgtacaacatgatgttttgatacatgttgtgaaatggttaatatagtcaggcaaat
-caacacgttcatcatctcacatagtttccctttgtgtgtgtgtcgcaagagcacactact
-tttttaacaaaaattccaagtaaaatataatattatcatagacctcacgttgtacattag
-acctctagacttttttaatcttacgtatctgcaattttttatcctttgacctacatctct
-ccatttccttcccctccaaccacacccctggtaacgaccacattattctctatctccttg
-tattcagctttccttttttttcttttaagattccatgtataagtgaaatagtgcagtatt
-tttctttctgtgtcagtttatttcatttagcataatgttcttcatgttcattcatgcctt
-ggcaaatggcaggatctcctttttgaagagtaaataatattccattgtgtgtgtgtgtca
-cagtttatccattcatctatcaacagttcacttgtttcaaaattttgactattgtgaata
-atgctgcaataaatatgaaagtacagatacctctatgaagttaagtggtgatttcatttc
-atttttttttttaaagacagggtgtcacagtgttactctgtagcccaggctggaatgcag
-tggtgcaatcatagctcactgtaaatctcaaactcctaggctcaaggaatcctgcctcag
-tctcctgagtagctgggactacagacacacaccatgcttagtcaatgttttttaggtaca
-gggtcttgctgtgtagcccaggctgggctcaaagtcctgacctcaagcaatcctcctgct
-ttgacttcccaaattaccgggattacaagcatgaaccacctcactcagcctggtagttct
-atttctaattcctttagaagccttcatactgactccacaatggctacatctgtctacatt
-cccaccaagaatgtacaaaggttcccttttctccacaccctcattaacaattgttatatc
-ttgtctttttggtaatagttatactaacaggcatgaggtgatgtctcattgtggttttga
-tttacatttccctaatgattagtgattttgagccccttttcacatacttcttggccattg
-ttatgtcttctttggagaaatgtcttttcaagtctttgtccatttttttaattgggtttg
-gtttttttttactgctactgagctgtatgagttctttatatattttatatattaatccct
-tatcagatatatttaatataaaGACAAAGAAAAGCTATAAGACTTTATATCTTAAaaagc
-tggagtggctatattaatattgaacaaaatagatttcaaaacaagaaatactaccaggga
-tcaagacgcacagaaagaagtcaattcaccatgaaaatataacaatactaaatgtgcatg
-caactaacaatagaacttcaaaataaaagcttgtagaactaaaaaagagaaatagagaaa
-tcttcacctacaactggagatttTTAgactgacattagcaagatggcagaataggaggtt
-ccaagcatccctcctctcaacagaaaattcaactggcagatatccatgacaagagcactt
-tggtaaaaatcccaaaacttggaaataagccaaagacacccatgttgaccacagaactga
-ataaaaaccacattagaagggggaagagaaaaggtctcactttgaccaggccacccctcc
-tccactccctcgcccaagttggcacaccactatgcagacaggattgccctaggcctacag
-tttctccagtgggaaaagaaaactaaagatgaacattcagcttccttagccattcctgga
-atattctcagaaagcccatttcagtctcagttcacagggaaagcaggggataacggtgtg
-gttagatcacctgggttcagatagaaaaaaagaaaagggggcattgctcacagtgaccag
-tatgaagatactgttggtagctctgtgtcactgccagcagaggtaccagccaacagcata
-agccacctgcaaagccaagctggtcactcccagaagcacagtggaaatttccatctggct
-tgagtccctagatggccagcctccacagccagcctcaaatccctccccaaggccccacgc
-agaaatggagatacctgcaacaaagcatttcaaacaaaagaaacaactgagacttgtgcc
-ccagggcatttaaacagtggctcagactcaaagctcactcaaggagggagatgcccacca
-cagcacctttcagcaaagcccagaggctggactagccacacccagaagtataaatggtgg
-ctcacctcagcctcaaagcccaccccaagtctctgcctaggcaagggggcaagcctcaac
-catgcatttcaacaaagcatagcagctggtcccaactaccctgaacaaaacctatctaac
-ctcaggacccaaacagtggtagtgcccggccGGGGAAAATACCATGTCTGTTAAGGGTTC
-TTACCATGATTTTAAAAAAGAAAGaaaacctatacacagacattcccaacagctttattc
-ataattgccagaaattgaatacaatctgaatatccttcactgtgtggcttttaaaaaatc
-gcatttatagtacatccatagcatggaatattacttagcaataaaaagaaacaaagtatt
-catacaagttggagggatcttcaaggaacactaagagtaaaaatgccaatttaaaaagat
-tacatatctatgattccatttatatggcattcttgaaatgacaaaattatagagctagag
-aacagattcctgtttacccagggttagggaaggagggagaaggctctcactggaaaaggg
-tagcacaaggagtctatgtgataaactgttttgtgtcttgactgtaatggtggtcacaaa
-aatcaaagcatgtcataaaattgtgtaaaactaaatacatacctacatgcacacacacaa
-acaaatgactacatacatgtaaaactgatgacatctgattaagaccaatggagtatatca
-atgtcaatttcctgattatagttaaacaagatgtaaccattggagggaaaaggtatatgg
-gatttctctgcatgtaggtaagtctaaacatatctcaaaatTATTTTAAATGTCAACTTT
-TAGGAACAGCTGATATTTTCTCTGTATTTATCCTAAATCACTAAGGCTTTCACAAGATCT
-CTGCTCCAAAGACCACCATATTTCTTTTTAAATGACATATCTATTGTGAAATGCATTTAT
-GATAGTCAGTATTCTCATGCTGTGGAAATATACTTTAAAAAGAATATAGTCTTTATCCTA
-TACTGAAGCTCTTGTCCCATCCTGTCCTTTTCAAACACTCAGCAGTTCAATTGAGCTTTA
-CAACTTCCATGCACTTCACAAAAAGAAATAAAATAGTGGAGGCTACGCTGATCTCAGCTG
-GTTTTCATATATTTGGGGGTCAGAtggctatagactgatataagctagcctctgctggga
-caactgggttcttctccaaaatgtctctcttgtccttcctgcagactagactggtcttgt
-tcacctgactgaggcagggttccaatggagaaggcaaaggcacacaggccttttgaggca
-taggcttggaaatagcacaatttcatttgtgccatattctCTCTTTTTATGACTTTATTA
-TTTGAATTTGTATATTGCACAAGACTTCCTATTGTTCAGATTTCATTTGCTTTCTTTCTC
-TTGTATTTTAACATCCTTCACAATTCTCACATCATTATTAAAAGTTGCACTTAACCTAGT
-AATAGATAAGCATTAGCTGAAATTAGTAATTGCTTAACTTCTATCCTACACTACTTTATC
-ACATACTAGTGTGTCATGTTTCATAGTATAGGAACAAAGTAATCTTGCACGATGATATCT
-CTGATGCATACCACTATATTTTTGCTCATGGAATGACAGCAAAATTAATTTTTCTGCTGC
-CAAACTAATATTCAGCCAATCTTTTATTCATCAAATCTAACTACTTAGACCAGGGGCAGT
-TTCCTTTAGAGTTAGACTGTAATTTGTGTACTAATTTTTTTTTGGTTTTTTGTTTGTTTG
-CTTGTTTTGCTAAGGGAAAAATTTATTTTCCTGATGTAtttattattttttagcttttat
-tttagttttagttttaggaatacatgtgcaagtttgttatataggtaaattgcatgtcat
-gggtgtttggtgttcacattcttttgtcagccagataaCCATATTCTCTCTTTTAACGCC
-TATTTaaaattatatatttttaagctatacaatgtgatgttttgatatacatatgcatAT
-TTAAGCTATACAATGTCATGTTTTGTTGTACATATGCATATTTAAGCTATACAATGTCAT
-GTTTTGATGTACATATGCatatttaagctatacaatgtcatgttttgatgtacatatgca
-tcttgaaatgaatactatagtcaggctaattaacatatcagtctcttcacgtagttacca
-ttgtgtgtgtgacaagaatgcttaagatctactctgatagtaaatttcaactatataata
-cagtattatCTCTTTTTTAttttttacttttatttgtttatttttttgagacagagtctc
-tctgtgtctcccaggctggagtgcggtggcgccatctcggctcactgcaagctctggctc
-ccaggttcacgccattctcctgcctcagcctcctgagcagctgggactacaggtgcccac
-caccacgcctggctagtttttttgtatttttagtagagacggggtttcactgtgttagcc
-aggatggtctcgatctcctgacctcgtgatccgcccacctcggcctcccaaagtgctggg
-attacaggcgtgagccaccacgcccagcctttatttatttatttattttgagatagagtc
-tcgctctgtggcccaggctggagtgcagtggcagcatctcagctcactgaaatctctgcc
-tcccaggttcaagcaattctcctgcctcaacctcccaagtagctgggactacaggcaccc
-tccaccacacccagctaatttttttatttttcatagagacggggttttgccatgtcggcc
-aggctggtcttgaactcctgacctgaagtgatccacctgcctcggcctcccaaagtgctg
-ggattacaggcatgtgccaccatgcctggctGatttttgtatttttagtagagacggggt
-ttcaccatgttggacaggctggtctcgaactcctgacctcaagtgatctgcttgcctcag
-cctcccaaagtcctgggattacaggcgtgaaccactgcttccggccacagtattatcaac
-tgaggtccccatgctgtgcattagatctcaaaaacttaatcatcctacaatactggaacg
-tactctttgaccaacatcttttgattctgccaccattgcttctgataatcactattctct
-ctccttctatgaatttgacttttcaagattctacatgtaagtgatatcatgcagtatttt
-tcttcctgtgcctggcttattttacttagtataatgtcctccaggttcatgcacattgca
-caaacgacaggatttctttgttttaagactgaataatatttcatATtggatacaacctaa
-gtgttcaacagatgaatggataaacaaattgtggtatatacCACCTGTTCTCCCTTGTAA
-GTGGAAGCTAAAtgtcaggcctctgagccgaagctaagccatcacatcccttgtgacctg
-cacctatacgcctacatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggcc
-tgttcttgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgc
-cttaactgatgacattaccttgtgaaatcccttttcctggctcatcttggctcaaaaagc
-tcccccactgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttga
-ctgtaattttcctttacctacccaaatcttataaaacggccccacctctatctcccttca
-ctgactctgttttcggactcagcctgcctgcacccaggtgaaataaacagccttgttgct
-cacacaaagcctgtttggtggtctcttcacacggacgcgagtgaAATtttggtgccgtga
-ctcggatcaggggacctcccttgagagatcaatcccctgtcctcctgctctttgctccct
-gagaaagatccacctacgacctcaggtcctcagactgaccagcccaaggaacatgacacc
-aattttaaatcaggtaagcggcctttttgtactctcttcttcaatctcactatccctcaa
-cctctttctcctttcaatcttggcgccacacttcaatctctcccttctcttaatttcagt
-tcctttccttttctcctagggacaggagacgcattttatccgtgaacccaaaactccggc
-gtgggtcacggactcagcaaggcagacttcccttggtgtttaatcattgcgggaatgcct
-ctctgaatattcacccacatttcagaggtgtctgaccacatggggacgcctgccttggtc
-cttcacccttagcagcaagtaccgcttttctagggagcaaacaccccccaccccttctct
-ccatgtctctactctctcttttctctgggcttgcctccttcactatgggcagccttccac
-cctccattcctccttcttctcccttagcctgtgttttcaagaacttaaaacctcttcaac
-tcacacctgacctaaacctaaatgccttattttcttctacaatgccgcttgacctcagta
-caaactcgacagtggttccaaatagccagaaaacagcacttttggtttttccatcctaca
-agatctagataattcttttcataaaataggcaaacggtcggaggtgtttgacatccaggc
-attcttttacacattgttccctccctagtctctgttcccaatgtgtctcgtcccacatcc
-tccttctttccctcccacctgtcctctcagtcccaatcccaagcattgctgagtctttct
-aatcttcgttttctgcagacccctctgacctcttacctcctccccaggctgctcctcgcc
-aggccgagccaggtcccaattcttcctcagcctctgctcctccaccctataatcctttta
-tcacctcccctcctcacacctgctagccctaccccacttgcccagcaatttcctcttaaa
-aaggtggttggagctaaaggcatagtcatggttaatgctcctttttctctatccgaactc
-tcccaaaatcagttagcgtttaggttctttttcatcaaatatgaaaaacccagcccagtt
-catggctcattcggcagcaaccctgagatgctttacagccctagaccctaaaaggtcaaa
-aggccgtcttatcctcaatatacattttattgcccaatctgccccgacattaaataaaac
-tccaaaaagtaaattccagccctcaaaccccacaacaggacttaattaacctcgccttca
-aggtgtacaataatagagtagaggcagccaagtagcaatgtatttctgagttgcaattcc
-ttgcctccactgtgagacaatccccagccacatctccagcacacaagaactccaaacgcc
-tgaaccgcagctgccaggagttcctccagaacctcctcccccaaagtccgtccccttctt
-aatcaatacggaagctacccactccacattaccttcttttcaagggcttgtttcccttgc
-ctccataactgttgtaggtattgacggccaggcttctaaacctcttaaaaactccccaac
-tctggtgccaacttagacaacattcttttatgcactcttttttagttatgcccatctgcc
-gaattctcttattaggccaagatattttaagtaaattatctgcttccctgactgttcctg
-gactacagccacacctcattgctgcccttttccccagttcaaagcctccttcgcatcctc
-ctctcatatccccccaccttacccacaagtataagatacctctactccctccttggtgac
-tgatcatgcaccccttaccatcccattaaaacctaatcacccttaccccattcaatgcca
-atatcccatcccacagcacgctttaaaaagattaaagcctgttatcacttgcctgttaca
-gcatggccttttaaagcctataaactctccttacaattcccccattttacctgtcctaaa
-accggacaaggcttacaggttagttcaggatctgcaccttatccaccaaattattttgcc
-tatccaccccgtggtgccaaacccatatactctcctatcctcaatacctccctccacaac
-ccattattctgttctggatctcaaacatgctttctttactattcctttgcaccctacatc
-ccagcctctcttcgctttcacttggactgaccctgacacccattaggctcagcaaattac
-ctgggctgtactgccgcaagccttcacagacagcccccattacttcagtcaagcccaaat
-ttcatcctcatctgttacccatctcggcataattctcataaaaacacaggtgctctccct
-gctgatcgtgtccgactaatctcccaaaccccaatcccttctacaaaacaacaactccct
-tccttctaggcatggttagtgcagtcagaattcttacacaagagccaggaacatgccctg
-tagcctttctgtccaaacaacttgaccttactcttttagcctggctctcatgtctgcgtg
-cagcggctgccgccgccctaatacttttagaggccctcaaaatcacaaactatgctcaac
-tcactctctacagttctcataacttccaaaatctattttcttcctcatacctgacacata
-tactttctgctccccagctccttcagctgtactcactcttttttgagtctcccacaatta
-cccttgttcctggctcagacttcaatccggcctcccacgttattctggataccacacctg
-accctcatgactgtatctctctgatccacctgacgtacaccgcatttcccccattatttc
-cctcttccctgttcctcaccctgatcacatttagtttattgatggcagttccactaggcc
-taatcgctacacaccagcaaaggcaggctatgctatAGtacaagccaccagcccacctct
-tagaacctctcatttcctttccatcatggaaatctgtcctcaaggaaataacttctcagt
-gttccatctgctattctactactcctcagggattattcaggccccctcccttccctacac
-atcaagctcagggattttcccctgcccaggactggcaactcttaactccctcttagagtg
-gatagatgctctttgctggcaggggaccctccaatcttttcaccctgatgaagttctatt
-ctttacttttatactcactcttattctcattcccattcttatgccaccctctacctctcc
-ccagctatctccaccacactatcaaccttacccattctctcctagccgtttctaatccct
-ccttagtgaacaaccgctggctttgcatttccctttcttccagcacctacacagttgtcc
-ccaccttacatgcagactaggcaacatctcctatctccttacacctccaaacttccttta
-acagccctcacctttaccctcctgaagaactcatttactttctagacaggtccagcaaca
-cctcctgagacatctcacatcagcaagctgccgccctcctccgcacttaattaaaaaacc
-tttctccttatatcaactctactcccccaatatttggacctctcacaacacaaactacta
-ttcctgtggccgctcctttatgtatctctcggcaaagacccactggaattcccctaggta
-acctttcaccttctcgatgttcctttattcttcatctccaaagcccaactacacacatca
-ctgaaacaataggagccttccagctacatattacagacaagccctctatcaatactggca
-aacttaaaaacattagctgtaattattgcttaggaagacacttaccctgtatttcactcc
-atctttggctgccttccccttgctcatcagactctcctcccaggccctcttcttgtttac
-ttatacccagccctgtaaataacagtgaaagtttgcttgtagacacttgacgttttctca
-tacaccatgaaaatcaaacctccccctctatgcagttaccccatcagtccccattacaac
-ctctgatggctgccaccccagctggatccctaagagtctaggtacaagacactcctttca
-gcattccttctcatctttttactttgcatctccggttttgcctcacacaaggtctcttct
-tcctctgtggatcctctacctacatgtgtctacctgctaattggacaggcacatgcacac
-tagttttccttactcccaaaattcaatttgcaaatgggaccgaagagctccctgttcccc
-tcacgacactgacacgacaaaaaagagttattccactaattcccttgcttgtcggtttag
-gactttctgcctccactattgctctcagtactagaatagcaggcatttcaacctctgtca
-cgaccttccatagcctgtctaatgacttctctgctagcaccacagacatatcacaaactt
-tatcagtcctccaggcccaagttgactctttagctgcagttgtcctccaaaaccaccgag
-gccttgacttactcactgctgaaaaaggaggactctgtatattcttaaatgaagagtgtt
-gtttttatgtaaatcaatctggcctggtatatgacaacataaaaaaactcaagaatagag
-cccaaaaacttgccagccaagcaagtaattacactgaacccccttgggcactctctaatt
-agacgtcctgggtcctcccaattcttagtcctttaatacctatttttctccttcttttat
-tcagaccttgtatcttccatttagtttctcagttcatccaaaaccgtatccaggccctca
-ccaatcattctatacgacaaatgtttcttctaacaaccccacaatatcaccccttaccac
-aaaatcttccttcagctcaatctctcccactctaggttccatgacccaatcctgctcaaa
-gcagccctgagaaacatcacccattatctctccatgccagccccccaccaaaaatatttt
-tttcgctgccccaacacttcaatactattttatgttatttttcttattaatataagaagg
-caggaatgtcagacctctgagccgaagctaaaccatcgcatcccctgtgacctgcatgta
-tatgcccagatggcctgaagtaactgaagaatcaccaaagaagtgaaagtggcctgttaa
-tgccttaactgatgacattccaccacaaaagaagtgaaaatggctggtccttgccttaac
-tgatgacattaccttgtgaaatcctttctcctggctcatcctggctcaaaaagctccccc
-actgagcaccttgtgacccccactcctgcctgccagagaacaactcccctttgactgtaa
-ttttcctttacctacccaaatcttataaaatggccccacccctatctcccttcactgact
-ctcttttcggactcagcccgcctgcacccaggtgaaatagccttgttgctcacacaaagc
-ctgtttggtggtctcttcacatggatgtgagtgaAATTaatattaggtacacacagacat
-aaagatgggaaaaatagacagtgaagattttaaaggggataaggaagggagaggagcaaa
-tgttgaaaaactatctattctgtactatgtttgctacttgggtgacagggtcattagaag
-cccaaacctcagcatcacacaataagcccatgtaacaaatctgtacatttatcccctgaa
-tctaGATTTTAAAATAAggctgggtgtggtggctcacacctgtaatccaaacactttggg
-aggctgaggcaggaggattgcttgagcccaggagttcaagaccagcctgggcaacataga
-ccttgtctctacaaaaaataaacaaaatcagcaaaatgtggaggtgcgcctgtagtccca
-gctgctcaggagactgaggcaggaagattacttgagcccaggagctcaaggttgcagtga
-gctgagatcgtgccactgtactccagcctaggctaccaagtgagattttgtctcaaagaa
-aataagataaaaTTTTTTCTTACATTGTGATATATATGCACAATGGaattttcaaatata
-tagtatattatcactaactgtagccaccatgatgtaaatagagctcttgaattttttttt
-tcttcttttgaaaacagagttttgctcttgttgctctggccagagtccaatggtgcgatc
-ttggctcattgcaacctctgcctccccagttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattacaggcacatgccaccacgcctggctaatttttgcatttttagtcaag
-gcggggtttcaccatgttggccagactggtcccaaactcctgacctcaggtgatctgcct
-gcctcagtgtcccaaagtgctaggattataagcatgagccaccgtgcctgaactctcttg
-agcttatttttcctgtctaagtgatttccccacccctagcctctgataactaccatttta
-ctctttgtttctatgaattcaacttttttacactctacatagaagtgagatcatgtcttt
-ctgtgcctggtttatttcatttagcttactgtcctccaggttcatccatgttgttgcaaa
-tgacagaatttacttcttttttaaagctgaaaagtattccattgtgattatgtaccacca
-ttttctttattaattcatctattaatgggcacttaagttgattccatgccttggttattg
-tgaataatgctgaaattaacatgaaagtgcagatatcttttcaacatgctgattttattt
-ccattagctatatacccagtaatgggattgctggatcatatagtagttttcattttaatt
-ttttaaggaacttccatacagttttccataatagctatactaatttttattcccaccaac
-agtgtgcaagggttcccatttctccacatcctttccaacacttattctctttcatagtat
-attttgaagtcaggtagtgtgatgccttcagctttgttctttttgctcaagattgttttg
-gctattcaaaatcttttgtggttcaatccaaattttaagatttttttctgtttcagtaaa
-aaatgtctttggaattttgatagggattgcattaaatctatagaccactttgggtactac
-agatattttaacaatattaattttttactttcatgaacatgggatatctttccatctgtg
-tcttcttcaatttcttccatcaaagttttatacattttagtgtagaggccttttacctct
-ttgttaaatttattcctaagtatttttgtagctattgtaaaaggatcatttacttgattc
-acttctcaggtgttcttgttagtattcagaaaagctgctgatttttgtatgttgaattta
-tatcctgccactttactgaattcatttattagttctaatagttatttggcaaagtcttca
-ggattttctgtatatacgattatgtcatctgcaaaaagaaacaatttcacttcttccttc
-ccattttaatgctctttttattgcattttcttgcctaattaatctggctagaatttccag
-tactacattgatagaagtggcaaaagtgggcattattttgttctttatcttaaagaaaaa
-gcttttgactgttcaccattgagtatgatgttaaatggggcttgtcatatatgatcttta
-ttgtgttgagatcattctttctgtatctaatttgttgagttttatcacaaaaggacgctg
-aatgttgtcaagtgttttttctgcatctgttgagatgatcatatggtttttacccatcac
-tctgttaatgtagataaatctcacttgatcatggtgaataatccatttaaagtattgttg
-aattcaatttgctagtattttcttgaggtttttgtatctctgttctagggacatcgacct
-ataacttttttttcttgtatgcccttgctctggctttattataagggtactgctACccca
-gcatgatttccaaatggctatgaaccagtgactgctgtgtacaaccaacttttcctcctt
-tcaaatgggagtgttgtggttatAACATTATAAAACAAATCTTGCAAagttagatagaag
-gcatcagttctagtgtttgatagcacagcagagtggctattgttaacaacaatttattgt
-atatttcaaaatagctaaaagagaagttttgaaatgttcccaacacaaagaaaggacaaa
-tgtccaaggtgctggatatcctaaataatctgacttgattattacacattatatgcatgt
-atcaaaatatcacatgtgcccagaaatatgtacaaatactatgtatcaataaaaaaGttt
-ttaaaaaataaatattacatataatatatgaattatataataaaactagaatataatata
-aaaaggaaaaaatatatgtaaaataaatCTTCATaataaaataaaataaaataaTTTGAA
-AGAGTCTATGAATAAGATTTTGGAGACTACTCTAAGACAGATGCAAGAGCAGGTACCAAT
-AATTCTGTCTGTACCAAAAGAGTGAATAATAAAAATATACAATTTCAACTTAATTTTGCA
-TAAAAAAAAGTGAACAAATAAACATGCATCTAACAATACTGACCACATCCACGTCTTCTA
-TGAGTATGGAGGGGATAAAAGAATAAAAGAAAAAAGTCAAAGCGAAGATTAGATCCCCCC
-AGTCAGAGCAGAATTCAAGGGTTAATTTATCTGTTCAATTAAGTATATCCCTCACCCCCA
-ACTCAGAAGACACTTCTCTGATTTATCTGACACTAAGCCAAAATGGATTCTCTTATCTAA
-TTTATCAGTAGAATCATATAGAGTAGAGGACACATGTAGATTAAAGACAGTGAGCCAGAC
-CCATCTTCACTGTCACAGTGACAGAATGGACCCTCCTTTAAAATACCCCTGGTGACATTG
-TAATGAAAGACTAAAAAAGAAAGGGGCTTATAAAGTGCTGCAGTGAAAAAAAGGGCTTCT
-TATGTGAGCCTTACTTTTAAAGTTCCCTAAGAATTAGGTTGAAAAAGGTCATACATTGAC
-TTTCATAGTGCTGAAATCATCAACAAAAATTTCTAAAATTCTGCAAAGTCCAGTCACTGT
-TACCTGTGCACTTCTCCAGAATTTTCAAAAGCCAAACTACTAAAAGGAAGGTTCTTGTAT
-GCTCTTGAAACTTTAATATATCCAGCTAAATATTTTTCTCCTTCCTCCCCCTGAAACAAG
-GTGGTGAGCTGCTCATGGAGTAATAAGGTTCATTGATTTCTTTATCTCACATGAGTAAAT
-ATTAGCTCTACAAAAGTTATTTATGACCAGTGCCTTAAATTAAGCAGCATCAACAAATGT
-CACCACAAAATTTCTCTTCTGTTCATCTGGACAGCATTTTCTACCATCATGACCTACTAC
-AATTTCATCTATCTCATGAGGAGCTTCTTAAGTACGTCCCCCTCATTTATAAGACTTTAA
-ATTTCATACTGAAACAAATGATATGCAATGCTTTTAGAGATCTTAAGATAATCTTTGTCT
-AAAAATTCTGTCAACTAGATGTTCAAATTGCTACTGAAAATGGAGATGGAACACATACAT
-TAAATGATTCAAATGATATATCGGAATTACCAGTAGCTGTCATGTTTGCCCATCAGATCT
-GCCCTCAAAAAAGTGTTATGAAAATATTCAAACATTTTTTCTCCCTCTAACTAATTCCTA
-GCTGTTAGCAGAACCCTCTGTacacacacacacacacacacGGCATTCAGATCTAATTAG
-ACAAAAGAAATTTCATTTGTGAAACAGGAGAAATACCTGAAATTCTGTGAAATATTGTCT
-CGCATAGAAAATGGAGTTGttacaagccaggagagattgggtgcctattttcaaccttct
-taaagacaagaaattccaaccaagaatttcatatcctgtcaaattaagattaataaatga
-aagagaaataaaatcttttccagacactccagtactaagagaaatccttattattaaagg
-cagtcttacaagagacccttcagggagttctaaatatggaaacaaaggaacgatatttgc
-atttacaaaaacatacttaagtacgtggcccacagaccctaataagcaaccacacaatag
-aaactacaaagcaaccagctaacaactccatgataggatcaaaacctcacatattaacat
-taaccttgaatatgaacactctaaatgctccacttaagaggcacagagtagcaagttgga
-aaagaaaagaaaagaaaagaaaagaaaactcatctgtctgcagtcttcaagagaccaata
-tcacatatatgacacccataggctcaaagtaaatggttggagaaagatctaccacataaa
-caaaaaacagaaaaagaggaggggtcattattcttagataaaacaaactttaaaccaaca
-actacttagaaagataaaaaagggcattacgtgacaataaagggttaaattcaataagaa
-gacttaactatcctaaatatatatgcacccaatattggagcatctagattcattaaaaaa
-actacttctagacctatgaaaagacttagccacatgattatattgggggacttcaacacc
-ccactgacagcattagatagatgattgaggcagaaaactaacaaagaaatcctggactta
-aacttgacacttgaccaattcaacttaatagacatctacagaatattccatccatcaacc
-acagaatatatattcttcacatctgcacatggaacagactccaagattgaccacatgcta
-ggccatggaataactatcaacaaattcaaaataccaaaataatgccaaccaaactctcag
-accacactggaaaaaaatagaaatcaataccaagaaccttcaaaaccacacaattacatg
-aaaattaaacaacttgctcctaaaccacttttggataaacaacaaaatgaaggcagaaat
-ttaaaaattcattgaaataaatgaaaacagagacatagcataccaaaatatctgggatgc
-agtgaaaacagtgttagaaagaaagtttatagcactaaacactgaccttgaaaagctaga
-aagatctcaaattaatgatattacgtcacacctacaggaactagaaaaacagaaacaaac
-taaccaccaagctagcagaagaaaaaaaataactaaaatcagtgtagaactgaatgaaat
-tgaggctcaaaaatccatacaaagacacagtgacattacaagtttgtttttttaagggat
-aaacgagatcaatagaccactattttttgttagtagattaacaaaagaagtgagaagatc
-caaataagcacaaatagaaacaacaaaagtgacattacaacagatcccacagaaatatga
-aagagactattatgagcacctctatgcacacaaactagaaaatctagaggaagtggataa
-attcctggaaacatacaatctcccaagattaaaccagaaagaaactgaaaccctgaacag
-accaataacaggttccaaaattgagtcatcaattaaaaacctattaactaaaaaaggccc
-tgaaccagatggattcacagcccaattttactagacataccaattctactaaaactattt
-caaaaaagcaagaagaaagatacctccctaactcattctacaaagtaggcatcaccctgg
-taccaaaacctggcaaagacacaacaaaaaaagaaaactacaggccaatatccctgatga
-aaaaaatgcagaaatccttaagaaatactagcaaactgaatcaaagaatactaaaaaaag
-acagttaattcgccatgagcaaacagacctccctcttgggatgcaaggttggttcaacat
-atgcaaatgaacaagtgtgattcaccatataaacagaattaaaaacaaaaaccatatgat
-catctcaataaatgcagcaaaccttttgataaacccaacatcccttcatttaaaaacccc
-tcaacaaactaggcatcgtaggagcatactcaaaaataataagagcccctatgacaaacc
-cacagccagcatcatgctgaatgggcaaaaactgaaagcatttcccttgagaactgggaa
-tgctttctggaacattccagttttctggaacattcccaggaatgcccactctcaccactc
-agattcagcctattactggaagtgcttgccagagcaatcaggcaagaggaagaaataaaa
-ggcatccaaataggaaaagaagaagtcaagctatctttcttcattgacagcagattatat
-gcctagaaaaccttaaagcctccaccaaaagactcctggaactgataaacgacttcagta
-aagtgtcaggatacaaaagtcaaagtataaaaattaacagcatttctatacaccaataat
-gttcaagctgagagtcaaatcaagaatgcaatcccattttcaataaccacacactcaaaa
-aaaaagcctaggatttttttctaactaagaaggtgaaagatctcttcagattcagggaga
-attataaaacattgctttaaaaaattatagatgtcacaagcaaatggaaaaacattccat
-gcccatgggttggaaaaatcaatatcatttcaacagtcattctgcccaaagcaatctaca
-gattcaatgttattcctatcaaactaccaaagccatttttcacagaattagaaacaacta
-tcctgagttcttatggagccaaaaaaagagcctgaataggcaaaacaattctaagcaaaa
-agaacaaagccagaggcatctaattacccatctcaaactacacgataaggttacagtaac
-tgaaacagcataatactgatacaaaaacagacatatagaccactggaacagaataaagaa
-tccaaaaataaagctgcatgcctacagccatctgatctttgacaaagtcaacaaaaatac
-gcaatgggaaaagggctccttattcaataaatggtgctgggatagctggcaagccacata
-tagaagaataaaactggacccctcctctcaccatataaaaaattaactcaagctggatta
-aagatagaaatgtaagaactcaaattacaagaatcctagaagacaacctagaaacaccat
-tctggacataggtcttgggaaataatttatgactaagtcctcaaatcaattgcaacaaaa
-acaaaaattgacaagtgggacctagttaaactaaagagcttctgcacagcaaaagaaact
-atcaacagagtaaaaagacaacatacaatggtagaaaatatcacaaactatgcctctgac
-aaaggtctaatatcaagcatctataaggaacttaattcaacaagcaaaaagaaaatagcc
-ccattaaaaagtgcgcacaagacatgaacagacacctctaaaaagaacacgtacaagtgg
-gcaacaaatatatgaaaaaatgttcagcatcactgaacaccagagcaatgcaaatcaaaa
-tcacaatgagataacctctttacaccacttagagtagctattactaaaaaatcaaaaaac
-aacagatgctggcaaggccgcagagaaaagggaatgcttatacactgttagtggaaatgt
-aaatttgttcagccactatggaaagatgtttggagacttctcaaagaacttaaaacataa
-ttaccattcaactcagcaatcccattactgggtatatatccaaaagaaaataaattgttc
-taccaaaaagatgtatgcacgtgtatgttgatcgcagcactattcataatagcaaagaca
-tggaatcaacctaggttcccatcaacagtggattggataaagaaaacgtggtacatatac
-acaatggaataccatgctgccataaaaaaataaaattacctcttttgcagcaacatggat
-gcagctggaggccattatcctaagcgaattaacacaggaataggaaacctaataccatat
-gttctcactaataagtgggagctaaacattgggtacacattgacataacgatgggaacaa
-tagacactggggactaatagaagagggaaggaggagaggagaaagggttgaaaaactaac
-tgttgggtactatattcaggacctgagtgatgggatcagttgtaccccaaacctcaacaa
-cacacagtacaccaatgtaacaaatctgcacatgtacccctgaggctaaaataaaagttg
-aaaTTATTTTCTTAAAAATGGAAAGGCTAAATTCCACCTCTACCAATATGTTTACTTAAT
-TTTTATATCCCCCATCTTACTGGTATAAAACCAGGAACATGGCAACCATTCATTTATGTT
-TGAAGTGTTCAAAAAATGAGTGACTACATCAATAAATGTACTCAGAGGAAAGCACAGGAC
-TTTATTATGTGGGGAATCAAGTTCACAGAAGGAAGCAGATGAATCTTTTGCTGCAGGCTG
-CTGGATTAGGCAGCACTTTTTATTTAGGAAGAGTGGAGACCAGCGAGACAAGGGCTAGAT
-TTAGGATTAGACTGTGAAAATGGTGATGGTGGGTAAGATGATGTAATCCTGCAGCACACT
-CAGCTTCTCACCAGAATGTTGATGTGGCTTCTTAAATGACACATGTTTTTTCTCTTCTTC
-ATCATTAGCACAACATAATTTCCCACTTAGACATCCTATTTCATATCTTTCTCCTACCTT
-GCATTTCTTCCTGCAATAGCCTGTTACTTTATTGAAGCATTTTTTGAGTCTTGCCCCGTC
-TGTGCATAGGAAACAACATTGAACCAAGGTTAGTGCGTAAGGAAGAGCAGAAGAGGTAGG
-TATGTGGTTCCCCACAAGTCATGGCCTCCTATGGTCCCAAGTGAACATTATGCTGATAAA
-AGGAAACTCAGAGGCCCCTCCTTGAAAAATATCCCAAATTAAGGACATTCAAAAGCCCAG
-GCTCTCAGCCAATGTCCAGTTGCCTCTGAGAACATTAGAACTGATATGACAAAAGAGAAG
-AGAGAACTCAATTCCTGGTTATCAACCAGAGCCAAGTCCCACCCCTAGGACCATGGCAAA
-GCTGACTCTCTCCACCAAGCTCCAAAGTCAGCACTCTCTCAGCTCCATCTCAGTCTCATG
-TCCCCAGAGACGGCTAACATGTCACCATGTGCACAAGACATGTCACCATTGGCACAACTC
-AGCCAAAGCAACTTTTGAAAGAACATCACAAACAAGACTTTTTAACTTAATTCGGTTTCA
-CACTCACTGATATGGGCAACAGAAATCTCCCTTTGACAAGATCTCATGGGTCTCAGCAAC
-AGGTGCTATTGAGAACTCCTTCCCTTAACCTGGCTCCTCCTGTCTGTCACTCATCACACT
-CCCCTTGATCTCAGATAAATGTGTTGCCCAGGGATCAAATTCAATTCCATGAATTTGGCT
-CTAGAGAGCTACATTGTCACCTTCTCAGAGTAATGCACTGAAATTCTAAGTCTCTTGTTT
-CTAATCCTTATTTGCCCCTCTACCCAAAATTTGAACAAGCCCAAAGAATAAGGTTGGAGA
-AGAGAGACATACTCTCCCTATCCTAAACTTCAGAATCAGGGAACATCTTTGAGGGTTAGA
-GGAGTATATTTTGGGGCCATAAAAATACAATATGCCTTCTTCCTAGCAAGAGAGAAGGTA
-ACTCTCACTGACAGGGCTTCTACGATGAACTTTgtgcttcgtgcttgtaagttcatgtaa
-cctgtacatcaaatagaatcatgaaatatagtaattatactccttcacagatgagaaaat
-tgagattaaaaggaaataatgtgcttaattcatacaacccgtcaatgatgaagacatatt
-ttaacctcacattgacatgactccaaaatgtgtgctattttaattactgtTGTAGTACAG
-GCTGAAAATGAATTTGAATGGAAAAGGGAATGGCCAGGCTCTCAGGTGAAAACTGTGTCC
-AGCATTATAAAGATAATTCTAGATGATGAGTTCATGGATACTTTTGAAAAGGACTCCTGA
-GAGTCCACTATAGCCCTGACCTCCTCTTACCTCCTTGGGTGCCTCTCTTCTAAGGCATAG
-ACTCAAGTCAGGCAACCAGGAGAATGGGTACTTTTTTATGATTTTGGCCAAATATAAATA
-ATCTTGAAAGTCCTGTTCCCACTCTTACAAATAGTAATATCTCTTAGGATGTTATAGTAC
-ATTTGGACAAGTTACCTGTGAGTACCTCAAACAGCAGAATAATGAGAACCAGAAACAGCT
-TCATATTTACAGACTTCCCAAGAGAAAGAGGCAGCAGAACTTTGTCCAGTGGTCTGTGTG
-CCACAGGTCTTTAAAGATGATCCAGAGTTTTGAGAGCTATCAGCGCTCGGAGCTCTCATT
-TTAACCCACACAGACAGAGAGGAATTCCAAGTCCACCCCCGTAACACACACACCTACATC
-CCCAAATATGGAGCTCACAGTCCCAGAATGTTCCACCATATCATCCCTCCTCCCCCTTCC
-TCAGGATATGCGCCCCTAGAGAGCAGGAACTATGACTTTCCGTCTGAGCTTCCAACCCAT
-TTGGGTCAAGGTTGGTTGGTCGTGGGCCTTGGGTTGTGTGGGATAATCCTGTCTTATTCC
-TATTGTTCCAATGTTCCATCCGGCTACTGCTGCCTCTAACAAAACTAACCCAGTTTGGAA
-GATAAATTAAGTCATTAGTCGACACAGAAGCATATTCAACAATAATTTTTTTAATGTATA
-AAGCTTCCAGATAGTCATTCTAGGAGTAAGATTGCTTTTAGGTTTGGCTAGATAAATTGA
-TATTATTTGAGAGTTTCCCATAAAGACTTGTCCATCTAGTAGAGCAAAATTCAACAACTG
-AAAGTTTTCAAAAGATCAAATCTCCTTAGCACAGCACTCAACTTATTATAAACTGGTCTC
-TGCTCTCCTCTCTTGGGACATTTTATGGAACCATCTATGTTTCTCCCAAACTAGTGGGTA
-CACCTTCCTGAACTTTTACTTCCTTAATCTGTTTCTTTTCACATTTAAATCCCTCCTTAC
-AGATTATATTACACTCCCCATCCCCTCCATATAATTGGTGCTAGTGAACTCCTGGTTTTC
-CTTCAAAACCAAGTTCAATCATCTCTATATAAGTGAAAGTTTCCCTGACCCAACTAAACA
-GAGCTGCAAACTCTCTTCTTCGCACCATCACTGTATTTGTACATATTTTTGTTGATGGTC
-ACACTATGTCATGTTCCAATTATTTGTTTATCTGCAATAGTCTGCAGACCCATAAAGGGC
-AGGTCTCTGGTCTTATTAGACTTGGAGttctttttctttttttttttttttttgcagttg
-caagatttaatagagtgaaaatggagctcccatacaaagggaggggacccaaagaggtta
-gccgttgccggctcgaatgcctgggtttatatcccaatcattgtccctcctgctgtgctc
-tcaggcaatagatgattggctatttctttacctcctgtttttgcctaattaccattttag
-tgagctctctttcctacctgattggtcacatgtgagctaagttgcaagccccgtgtttaa
-aggtggatgcggtcaccttcccagctaggcttagggattcttagtcggcctaggaaatcc
-agctagccctgtctctcagtaccccctctcaacaggaaaacccaagtgctgttggggagg
-ttggccgacgaccgctctaactgcttcctcctgaattggggcatagtaggggttgtgcag
-ttgagatttcctcaggaggggtgccttcgatgtcattaacattggagcatgggctagcag
-gccggtccaatggtccacggtagctcttagtcatggacggcatctgtggctccatttgaa
-gaatgatttgtagttttacagctttgattctggaaaagacaaacttaacaaggaggttaa
-agatacagggattgaaatgtatggcctgcagtgcaggggattatttctttggcacacttt
-acaggccctgactatctatttgatagttttgaaaaggcctggtccagtaaataataattt
-agccatctgatagttgctatcaatgcctaagtgaaaggtttggtaaagggttttaagtaa
-tttcaattggttagctgcaggcaaaagtattttttcttctttggtggctagccatcctga
-ggggaggaaagtatgtcctcttgaggttctccattctatttcttctgctgagtactgggg
-cttggtttcctggagggggttaccccacactaggggtccttctataagcatttctaatgg
-agggtcctgtcttgtggctcttttggcttcaacatctgcttggcagttcccttctacttc
-cctttccttttttttttttttttttatgaccccggcagtgtaagactgccacctctttag
-gtttctgtacagccaataataatatcctaatggcttcttgatgtttgataggtgttccct
-tggaagttaggaattccctttctctccatattgctgcatgggcatggagaactaggtaag
-catacttagagcctgtatatatatttaccctttttccttctcctaattctagtgccctag
-tgagggctattagttctgccagctgaacactagttcctggagtgaggggattactttcaa
-gtattccattatcactgaccactgcataccccacttttcgaagtcctttttctacaaagg
-aacttccatcagtacataaggtgaggtcaggatcagtcaagggaacctctaaaggatccc
-cttgagcagcgtaggtttgaacaattacttgctgacagttatgttctatcttttctttat
-tgtctggaagaaatgtggctgggttaagagttgcacaagtgcacagtcgcagcactggcc
-cttcaagtaatagagcctgatatttaagtaaatggttgtctgacagccacaagtctcctt
-tagcagtgagtatgccattcacatcatgagatgtccacacagtaagatctcttccctgta
-ttagtttaactgcttcagatactaagactactactgctgccactacccgtaaacaatgag
-gccaaccctttgccattacatcgatttccttacttaggtatgccacgggttacaagctca
-tccctcagacctgtgtaaggactcctagagctattcctgtttttttctgtgacttataaa
-gaaaagtcttgcccctttgacaagcttaacactggggcttgggttagggccttctttagg
-gcctggaaagctgcttctgcttcaggtatccatcttactaatgggtatttgctttctgag
-tttccttaattgtgtatataatggtctggctatttcgccatacctgggaatccatattct
-gcagaaacctgttacgccaaggaagcttttagttgctttagggttttgggatgaggatca
-gccagtataggctggatatgttcctcactgagggccctggtgcctttggataatttgagc
-cctaagtatttaacctgctgtgagcagagctgagcctttggtttggaaaccttatagcca
-caggtggcgaggaaatttaagagtgcttgggtggcttgattgcacaaggtttctgaacgg
-gcagctaaaattaaatcatccatgtaccaaaggacaagagtgtccaggtatgagaactgg
-ctcaagtcttaggctaatgcctggccaaatagatgggggttatccctgaacccttggggt
-aaaacagtccgggtgagttgagatgttgggttcgaaggatcttcaaaggtaaacaagaat
-tgaaggtcaggatgtacagggatgcagaaaaaggcatccttaatgtccaggactataaac
-cactctgcttcctctggtgtttgggaaagcagagtatacgggttaggtataggtgggtat
-ggagcgacaatggcctcattgataatcctgagatcttgcactaacctccactgtccgctg
-agtttctgtactcctaaaattggagtattgcaggggctattgcatggttttactaggcct
-tgggcttttaggtccttaaaaatattttagagtccttgttgggccttgggtgtaaggggg
-tactgcctttggtagggaaaggaggtgaaatcctttagtttaactcaaacagaatgggca
-ttctttgctcgtccatgttgtccttctgttgcccagacttcaggattaattccttcctca
-agcagggggacaataaacgggtgttctttctcctatgttcaggtgtataatggcccctgc
-tttcgctagaatgtctctccctaacaagggagtggggctttcaggcataattagaaaagc
-atgtgaaaagtataaagttccccagtcacaacttagtggctgggagaagtatctagtgac
-tggctgtcctaggaccccttggatagtgacagatctggaggacagttgtccgggacagga
-cagtaagactgagaaggctgcgccagtgtccaggagacagttagcctcctggctctcaat
-ggtcaagcatacccgggactctgtgagggtgatggcatgggctggagcttgccctgggca
-ccctcagtccttctgctggatcatctggttagtggcttctgactcagaggaccttcgtcc
-cctggggcagtgggccttccagtgattcccttgacataaggggcatggatgagagggtgg
-cttatttctacttggacaatcttttttaaagtgtccttgtagaccgcactggaagcaagc
-cctattaggcattcgatttgcccagtttttcccttttccaaagcctccTCGACTAGGAGT
-TCTTAACTCATAGCACAAAATTCATGCTATATGCTCAATACATAATCACTGAATGGCTGA
-AAAGTACTGAACAAATTACTGCTAGATAAAATACTCCAACACAGCAATAAAGTTAATTAT
-GGCATTTCCTTTAAAAATGCTGTTTACCACTTTTTGCAATTTCTAGGCACCTAATTATAG
-TAATGAGGTCCCATCTAATCCAAATATCTTTCTGTGACAGTATCTGGAAGAATGTTGGAA
-TTTCTGAAAGCTGTAGAAGTAGCCGTTGATGATTAAACTCTTATCACAACATAGTCAGGG
-AAAGAGTAAGGTTAGGAATTAGTATTGTATATAGCTTACTATGGATACCAGTAACCAGAG
-CCCTTATCCCCCTCAGTTAGTAGCTGTATACCTTGTAATCCTGGAGTGGCACAGAAAATA
-AAGATTGGTGAGGCTTACAGAATCTCATCAAATCATATTTATCATATGAAGACAGCTAAG
-TTAATGGGTGCAGGAAATTTAGCCGCACGAAGATCAGATGTGTGAATATTTATTAAGGGC
-TAGGTGCagtggctgggattacaggcgtgcaccatcatgcccagctaatttttgtatttt
-tagtagagatggggtttcaccacgttggccagtctggtcttgaactcctgacctcaggag
-atccacccacctcaacctcccaaagtgctgggattacaggcatgagccaccacgcctggc
-tTGTTtttttgtttttgtttttgttttAATTTTCTAAGTCTTTCTTGCTGAGGGTCTGTG
-GATCAAGGAAATACTTATTCAAAAAACAGGTATTAAGTTCCTGTTAATAAATACAAGAAG
-AAAAGTGCTAACTGAATCACCTGTGGGTTTAAAGACCACCATCAAAGCTACAATTTTGGA
-GGACAGCCAACTGCTCCCTTGTTCTGTAATTCAATTTTACTCATTGCTGTAAGGGAGTTG
-GTTCCATTTCTAAATAAATTAAACAGAGATAACCCAAGGATTAGATGAATATAAGTCCAG
-CTATGCAGGAAATCGTTTGCCACCTTAGTGCACAATAAGAACTAAGAAGTTGGACTCCAG
-ATTAGTGTATGGGATTTCTTTTAGCTTTTTCTAACTAGAATCAAGAAAGATGAGATATTT
-GACTGTTCTAAACCTTTACTTCAGCCAAGTATGGTGCTCTGGAAGCTTCTCAACCCCACT
-CCCACTGCCTCCATGTTCAAGACCATCAAATAAGAGGGAATTTCCTCTCCAAGTAGATGT
-CCATCTTCTACAACATTTTTTCCTACGTCTGATAGATACACTCTAGCAGAACTCCAGTAG
-CATATTTCACCCAGGATACAAAGGTGTATTTGTCAGCACCAGTCCTGCTGATGTTTTTCC
-TCAAATTCTGCATTGTTTCTTTCCAAATCTCAAAACCTCCCAGAaaatccttcttgtctt
-ttaaggctcagataaaaataagacctcctctgtgatgtcttcctaactcctctgatagac
-ttgattaattactattttgaacccccacagctctttccATTTGTATTTGTAACACTAATC
-CCATTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtctgtgtatgAAttttt
-ttagcttttattttaggttcaggagaacatgtgcaggttagtcacataggtaaattgtat
-gtcacagggatttggtgtacaggttatttcatcacccaggtaataagcatagtacctgat
-aggtagtttgttgattcccaccctcctcctacctcaagtaggccccggtgtttgtttcct
-tttttgtgtccaggtggactcaatgtttagctcccattataagtgagaacacgtggtatt
-tggttttctgttcctgtgttaactcacttgggatacaggcctccagctccatccatgtcc
-ctgcaaaaaacatgatttcattttttatggctgtgtagtattcgatggtgtatatgtacc
-atattttatttatccagtgtaccattgatgggcatttaggttgattccgtgtctttgcca
-ttgtgaatagtgctgcaatgaacatacacgtgcatgtgtctttatggtggaatgatttat
-attcctttggctatatacccaataatggaattgctgggtcgtatggtaattctgttttaa
-gttctttgagaaattgccaaactgttttccacaatggctgaactaatttacactcccacc
-agcagtctaaaagcattcccttttctccacaacctcgccagcatctgttattttttcact
-ttttaataatagctattctgactggtgtgagatagtatctcattgtggttttgatttgca
-tttctctaatgataagtgatgttgatctttttttttctttcaaatgcttcttagccgagt
-atatatcttgttttgaaaagcgttccccattgcttgtttttgtcaggtttgtcaaagatc
-acatagttgtaggtgtacagtcttatttctgggatctctattctgttccactgatctatg
-tgtctgttcttgtaccagtgtcatgctgttttggttactgtggccctgtagtacagtttg
-aagttgggtagtgtggtgtctccaactttgttctttttgcttagaattgccttggttatt
-caggctcctttttggttccatataaattttaacatagatttttctacttctgcaaagaat
-gtcagtggtagttaaatgggaatagcattgagtctataaattgctttgggcagtatggcc
-attttagtgatattgattcttcctaccaatgagcatggaatgttttttcatttgtttgtg
-tcatctctggtttctttgagcagcactttttagttccccttgtaggtagaaatctttcac
-ttcccttgtaagctgtattcctatgtattttattctttttgtggcaattgtgactgggag
-ttccttcatgatttggctcttgtgttgaaggttataggtgtataagaatgctagtgattt
-ttgcacattgattttgtatcctgcgactttgctgaagttgtttatcagattaagaagttg
-cctagccatgtgcagaaaattgaaactggaccccttcattacaccatataatacaaaaat
-taactcgagatggattaaagacttaaatgtaaaacccaaaagtataaaaaacctggaaga
-caacctagataataccattcaggacacaggcacgggcgaagattttagggtaaagatgcc
-aaaagcaattgcaacaaaagcaaaaatggacaaatgggatctaattaaactaaagagctt
-ttgcacagcaaaagaaactatcaacagagtaaacagacaacctacaggatgggagaaaat
-ttttgcaaattatgcatccaacaaaggtctaactaatatccagcatctataaggaactta
-aacaaatttacaataaaaacaaacaaccccattaaaaagtaggcaaagaaaacatgaacg
-gacacttctcaaaaaaagacatacatgcagccaacagtcatatgaaaaaaagctcaacat
-cactgaccattagagaaatgtgaattaaaaccacaatgagataccatctcccaccagtca
-gaatggctattaccaaaaagtcaaaaataacagatgctggccaggtacagtggctaacac
-ctgtaatcccaccactttgggaggcctaggcaggcagatgacctgaggtcaggagtttga
-taccagcctggccaacatggcgagaccccgtctctactaaaaatacaaaaattaatcagt
-catggtggtgggcacctgtaatcccagctacttaggaggctgaggcaggagaatcactgg
-aacccaggaggcggaggttgcagtgagccaaggctgcaccattgcactccagcctgggca
-acaagagcgaaactcccatctcaaaaaaataaataaataaaaataacagatgctggcaag
-gttgtgaagaaaaaaggaatgcttatacactattggtgtaaattagttcaatcattgtgg
-aagacagtgtggaaactcctaaagacctaaagacagaactaccatttgacccagcaatcc
-cattactgggtctatacccaaaagaatataaatcattccattataaagacacatacatgc
-ccatgttcattgcagcattatttacaataacaaagacttggaatcaattcaagtgcctgt
-caataatagactggataaagaaaatgtggtaaatatatgtcatggaatactatgcagcca
-caaaaaagaatgagatcacgtcctttgcagggacatgaatggagctggaagctattatcc
-ttagcaaactagcacaggaatagaaaaccaaataccacatgttctcatttacaagtggga
-gctaacttatgggaacacacagaaacacagaggggaaaaaccacacactggggcctcttg
-gagggtggagggtggggggagggagagaagcagaaaaaataactaatagacactaggctt
-aatatctgggtgatgaggggcgggcacagtggctcatgcctgtaatcccagaactttgga
-aggctgaagcaggcagatcgcttgaggtcaggagttcgagaccagcctggccaatatggt
-gaaacctcatctctactaaaaatacaaaaattagccaagtgtggtggcatgtgcctgtaa
-tcccagcttctcgggaggctgaggcacaagaatcacttaaaccagggaggtggaatttgc
-catgagccaagatggcgccactgcactccagcctgggtgacagaacaagactctgtctca
-aaaaataataataataataaatctgagtgatgaaataacctgtacaaccaacccccatgt
-cacacatttacctatgtaacaaacctgtaccccctgcacacataacctttgatcttaaaa
-taaaagtgaaaaaaaAAAGTGTCTGTTCATGATCTTTGCCtttttttttttttttttttt
-tttgacagagttttgctcttgttgcccagcctggaatgcaatggcatgatcttggctaac
-tgcaacctccacctcctggattcaagcaattctcctgcctcagcctcccaaatacctggg
-attacaggtgcccaccaccTCAAAGtaaatttctttgagtttcctcaacacagctattgt
-gaattatctgtcagaaaagtcacatatctctgtctctctggaatggcccctcctgcctta
-tttagtccatttggtgaggtcatattttcctggatggtgttgatgctagtagatgttctt
-cagtgtctgggcattgaagagtagggtatttattgcagccttcactgtctgagcttgttt
-gtacctgtccttcttgggaagtctttccgaatattcaaaaggtcttgagtgttgtgatct
-aagctatatctgctttagggggtaccccaaacccagtaatactgtggttcttgcagactc
-ttagagataccaccttgatggtcttagacaagatctgagaaaattctctggattaccagg
-cagaggttcttgttctcttcccttgctttctcccaaacaaacggagtcagtctctctctc
-tctctctcttttctgagctacctaaagctgaggatggagtgacataagcatccctgtggc
-caccaacactatgactgcactgggtcagacctgaagccagcacagccctaggtctcaccc
-aaggcctgctgcaaccactccctggctacttctcaaggccctgaggctctacaatcagca
-agtggcgaagccagccaggactgtgtccttcctttcagatcataaaggtaccccaggccc
-aggatggatacagaggttcccatggggactccgagactagagtaacaaaccttagaaatc
-tacctggtgttctattgtactgcagctgagcttgtactcaaaccacaagactcagtcctc
-cccactcttccctctcctttccaaaagcagaggagccttacttcgtggccaccaaaacca
-caggccacaaggaatactgccaggctactgctgatgttccctttaagccccaagggttct
-tacgtcagcttgtggtgaatgctgcctggcctgggactaatccttcaagaaggtaggctc
-ccctctggcccatgacaggtccagaaatattcaagagtcaagtcctagaatcgaggaccc
-caagagcccacctgatgctctacctccttgtggccaagctggtacctaaggtgtaagaca
-aagttcccttcattttttctctgcttttctcaagcagaaggagttctgccctatagccac
-cacagatggggatgtgttgagtgtcacctgaagccagaaagtctcatgggttcacccaag
-gccatcagtgtggaacctggttatcactgctggttattcagggcacaagggctctttagt
-tagcaggtgattaatgctgccaggactgggtccttcccttcaaggcagtgggttcccttc
-tggcccagggtgtgtctagagatgtttttcaggagctacgtcctggaagagggtctgtca
-actatctggtgcctgatcctgctgtggctgagctggtatccaagatgcaagacaatgttc
-ttcctactcttctctctcttctcctcaagtggaaggaaatggtctcttttggagctatga
-gttgcgcagcctggggttaggggaggatgatgttagaactcccttagctgccctagctac
-tgttttagtaggtcatgtgccccccagtccactgtctctaggcccagttcagcactagga
-cttgcctaagagttgcagtccttggggtttagactgcctttcaagtttgcttagagaccc
-aaagcccacagtggaaagctttgcatgtattcaagttccgaccactgagatcagcaattc
-ccctctggttagggctggtttaaatgcttcctctgtgggtgggcctcagctgcatttggt
-ccagttttcctttctgctctaactgggcagcactgagttcactgcctcacaattgccgag
-ttttccatccctcctccagcacccagagattatctttgcatgctgctaccgacagggcag
-tgggagtggggagtgcagggtggcagctgtgattgaggactgtgttttctatttcttcag
-tgcctcattcagtggtaggaactaaaatcaagtgctatgattcttattcttatgaaggtg
-ttttttgtgtagatagttgttaaattggtgcctttgcataggggagggaggacgatcagc
-ggagccttccattcaggcatcttgctctgcctcctttttccataaataatttttgggagt
-ctagtatgttccaggaactctttcaggtcctgaaaattagacatgcattcatggagcata
-cattcaaaagtgggaagcagataaaaaatcatatgaataaatatatagtatgtcagatgg
-tgacagggctctggagcaaaagaagatatagaaagaagatgacaaggccaggcacggtgg
-ctcacacctgtaatcccagcactttgggaggctgaggcgggcggatcacctgaggtcagt
-agtccaaggccagcctggccaacatggcgaaacaaaatacaaaaattatccaggaatgat
-ggcgggtccctgtaatcctggctacacaggaggctgaggtggaagaatcacttgaaccca
-gaggtggaagttgcagtgagccaagatcatgccattgcactccagcctaggcaaaagagg
-gagactccatctcaaaaaaaaaaaaaaaaaaaagtgctgagcaaaaaagagtacagtttt
-aaatgaggtatctgtgaaaagactccttgaggcagtgacatttcaggaaggatgtaaaag
-ttatctggggcaagagagtgtcaggcaatgagaagagcaagtgcaaaggccctgaggtgg
-gaccatgcccagtgtgttcaagaagtagcaagaagaccacatggataatgtgaagcaatg
-aggaaagagaaaaaggggattatatcagaaaagtaatgggggtgcacatttggggttaca
-ataaagaattagacttttcctctaagatggaggttattggacagtgctgacatgatctga
-tgtattttcaaaagatgcctctggcttctgtggtcaaaacagattgagagggagggaaag
-tataaaagtggaaaacctgttgcatgggcattacaaaatctaagtgacagctaatagggc
-ttagatagagagcatcagagaagagggtgggaaatggtcagactcttacatacctattga
-aaatacagtcactcgtagattgaagagaaaggaagaagtcaagataacatcacagtttta
-gtctgagtaactgaaagaatgaagttgtcactgacagagatggatataacaggagaaagt
-tcagattggtctttttgcttgagggaggataaaaacctttgtttgggatacgtttgcttt
-ggagtgctatagacatctaagtggaattgtcttgtaaacaggagagatttttaagccatg
-agactgaatgggattgtcaaggctatgactgcagaaaagagcctaatgcctgagacctag
-aactccccaatgttgatgaataagaagcagcaaaggacactgagaaggttcattccagtg
-aggtcggaggaaaaccaagagaacatgatgctctgggagcttaattaaattaagttcatc
-aaggaggataaagcaccaaatgctgctgatacatcaagatgaggcatgagaattgatcag
-tggCCTACCAGAATCCCAGCTCCAtgacctcttaccagatgccaagtagatgacaaatgc
-atttcaaatgcattgcttactttaatcatcacaagaacactatgaagcagaaattaatat
-acctcaatttttaaaactggaaaactacaatttagggagctaataatgtgcccaatgtca
-cacagccaataaggaattaactgggatcaacacaggtctgcatgaacctaaaattaaagg
-ccttagccactatgctaagctgcctctcCAGCTGCCTTCCATGGGTCAATTCTAGGGAGA
-CTGAAGACAAAGTATTCAAATAAAAGATGTTGCTTTATTCAAAAAATGTATTGGCCATGT
-GCTTGGCTGGACATTCTTCCATGACCTACTCCTTTATACTCTATTCATCACTTACAGGGC
-AGCCTGTTTTAAGAGAATTCATATTTCTTATTTCTGAAGATGACATTATTACATCCTGGA
-AGAAATATTGATTGCCCATTTCAGTATATTCCTAAGTCTTTTTGTTCCTCTGTGTCAATT
-Ctttttcttttattattatactttaagttctagggtacatgtgcacaaagtgcaggtttg
-ttacataggtatgcatgtgccatgttggtgtgctgcacccgttaactcatcgtttacatt
-aagtatttctcctaatgttatccctcccccctcccaccaccccacaacaggtcccggtgt
-gtgatgttccccacctgtgtccaagtgttttcattgtttaattcccacctatgagtgaga
-acatgcagtgtttggttttctgtccttgcgataatttgctcagaatgatggtttccagcg
-tcatccatgtccctacaaaggacatgaactcatccttttttatggttgcatagtattcca
-tagtgtatatgtgctacattttcttaatccagtctatcattgatggacatttgggttggt
-tcgaggaagtcaaattgtccctgtttgcagatgacatgattgtatatttagaaaacccca
-tcatctcagcccaaaacctccttaagctaaccaacttcagcaaagtctcaggaaacaaaa
-tcaatgtgcaaaaatcacaagcattcctatataccagtaacaaacagagagccaaatcat
-gagtgaactctcattcacaattgcttcaaagagaataaaatacctaggaattcaacttac
-aagggatatgaaggacctcttcaaggagaactacaaaccactgctcaacgaaataaaaga
-ggacacaaacaaatggaagaacgttccatgctcatggataggaagaatcaatatcgtgaa
-aatggccatactgcccaaggtaatttatagattcaatgccatccccatcaagctagcaat
-gactttcttcacagaattggaaaaaactactttaaagttcatatggaaccaaaaaagagc
-ccgcatcgccaagtcaatcctaagccaaaagaaaaaagctggaggcgtcaATTCTTTAAT
-GTCAAGCAGCCTTTATGCAATCTTGGATTGGGCACAAGAAGCACACAATCTCCTCATTTT
-CAAAGCCCTTCATGGCTAAGCAATAGAGTTCCTCTTGAGTAGGCTGGAACAGATAATGAA
-ATGTTGCTTTTTAGATGTGGTCAGTTAAAAATAAAATCACCTATCAACATTTGTTACTGT
-ACCTCCAGCTGTGATCAATAGTACAAATTGCTTTTAATATCTTACTTATAAATAGACTTT
-AAGTATGTTTCATTTCTGAGAAATGTTCTCTGAATTCTACTTAAGATGTTATCTTTCCAA
-ACTGCTGGACGGGCTGAATCCAGGCAAGAAATGGGATTGCAAATTCCCTTGCACGAAGAC
-TTGATGGGTGAGTCAAAGCAAGATTCCCTTGCCATTCTTTGTTTAGAGGTGAGAGGAAGG
-TTAACTAGCATTTTATGCTATAAAAATCAGACACAAAGATAAGCAAAAAGAATACAACAG
-AAGCCACTCATTATTTCAGCTCTCTGTTAACACTTTGATGTTCACTTCTAAATATGCTTC
-CTCAAAGTAATTTCTTTTCACAACTGGGTAGGAGATAAGATAAAGCAAAGTGAGCTTGCT
-TGCTTTTCATCCACTCAGTTAAAAACAGTCTTCCAGTTGACACTCCCTGATACATGCACA
-CTCAGGCACACACAAAAGTCTGCACTCATCCATTAACCTCAAGAAAGAGACCTGTTGACA
-AAATAGACATACACCAGTTCAGAGGAACCTATGTCACCTGTCCCTAGTAATCTACTTTTA
-AGCCTAAATATATCAACAGTCAATTTCAGGAAAATTAACATTAAAAAAATTTAGATGAAC
-AATAGGAATGAATGAACTTAAAGGAAAAGAAGCTAATATCAAGGACAGAAGATAATTATT
-TAAAATGATGAGTGACAAACTTGACTAAAATGCACAACCTCTTCATAACAAAAAGCATGC
-AGGAGAAGGTACAAGTCAGCACAAGgttaaaagacaatcagagtagaacaaaaattctat
-gtgcatgataccacaaaaagattgctatccataatctatatgaagaataactacaaatca
-ataagaaaatgacaaatgacccagaggaaaataggcaaaCAATAGTATAGCAGCAAAACA
-TTGTAAGCACTCGTTTCAGAAGGTTGATATAGATTCAGAAATATGATATTCCCTTTAAGA
-GAATCTGCTTTTAATCCATAAATTGTCTTACAAACTAGTTTTATTAGTTTAATATTAAAG
-GAcccattagtgggtatatatccagaggaatataaatcattgtattataaagacacacac
-ctgaaaatgttcattgcagtactattcacaatagcaaagacaaggaatcaacctaaataa
-ccatcaatgacaggttggataaagaaaatgtggtatgtatacaccatggaatactgtgta
-gccataaaaaagaacaagatcgcatcttttgtgggaatatggatggaactgcagaccatt
-atccttagcaaactaacgcaggaacagaaagccaaataccacatgctgtcacttataaat
-gagagctaaatgatgagaactcgtgaacacaaagacgggaacaagagacactggggtatc
-cttgagggtggagggcgggaggagggagaggagcagaaaagacaacaaacctctgtgaca
-caagttttcctatgtaaccaaccttcttatgtcctcccaaacctaaaacaaaagttaaaa
-aaaaaAAAAAGACCCAATTGGAGTTGCAATTTGCTCTTTCCCATTCTACTGCATTTCTGA
-AACCCAAAGTGTACAAAGAATGTGTCTTATGTTTTATGAAATGTACATTTGGGCCCCCAT
-TTTTTTATTTGTATAACAATTGTAAAACACTATCTAAAGGCATAAAATGGCTAGGATGAG
-AATTACTATTGGTTCATAATTATATTTGCTTAATTACTGAAGATGTAACTGTACTCGCTT
-TAAGTATGCCATTTGACTATTGCCCTTCTTTTTGTCCAGAGCCATCAAAAGATTAAAGTA
-TTTGAAATGAATAATGTAATGGTTTTGTCTTCCTGCTACAGTGTGTTTCAGGTTATTTTC
-TAAAATCATAATGAACCCTGTTTTTTTGTTGTTTTTATTATTTTTTGATAAGTAAATAAT
-GCCACGATTGGTAGATCTAAAACTGAAGAAGGAGACCCTATGGCCTCAATCCAGAATGCC
-ATAGCATGCTAAAATGAGAACTTCCTCCAGGTGTGTATGTGTGTGTTCAGGGCCACCTAT
-GTATGCCCGATACGTCCAGTCTTCGTTGATGAAAATTGTTAGAGGTCAGTATTACAGAAG
-ATAAAACAGAAAGGCCATATGTTAATAATGAGAAATAAGTGGTTAATTCATAATTAGTGA
-ATCTGGTTTCAGCACTTTGGCCTTCGAGGTGGTCAAAACAGGTCTCCAATATGAACTAAG
-GATTGAAAAGattaaaattatttttttaacaaaaattaaGCTCAAAGAGTCTTGGATGCT
-TCAGATTGACTCTGCTTCTGGCATAACTTGAATAGAAAATCATATAAGGGTCTATGATGG
-GCACCATGCCCAGAGCTAGTTGGTTTAAATGTCATTCTATTTTGGACCCTAAAGATAAAC
-ATGGCCTACTGTGATTCCGTCCTGCGTGGCTGTTCTCTGGAGCAGTAGTCATTAATCTTT
-GCCTGCCTTCTCTCCCACCTAGGTGTGTGCCACCACCCCATGGTGACATGAGCTTCatta
-attaaaaaaaaaaaaaaCtttttctctcttttcttaatagaaatgaccttggaaaatttc
-tattggtctgtcttcaagttcatttctctttccatatcatatctacatggctgttaagtc
-caaagtttattatttaaataaataaataaaattgataaaactctagccagttgatcaaga
-aaaaagagacaattaccaaattttcaatatcaggtataaaaagaggacatcattacatta
-aaagttttgtgagagatgattctatatgccaaaatttttgacaacctatatgaaatggat
-aagtttcttaaaagatacaaattaccaaaactgacctaagaggaaacataaagtttaaac
-gatgctgtatcaattggagaaattgaatccatagtttagtcttctcacaaagaaactttc
-atgccttgatggcttcactggtgaagtataccaagaaataataatggcaattctacacta
-actctttcagaaaataaaggaggagacacttctcaaatcattcttcgaggccaatattac
-cttggttccaaaaatatgcaaagatatcacaagaaaagagaactatgagccaatatcctc
-atgaacataatttcagaaatctataataaaatattagcaaattgaatgcggtgaagaata
-gaaaggatcatagaacaggacaatatgatgtttatccccagaatgcaaagttgatgtaac
-atcaaaaaatgaatcaacgtaattcaccatattgatggactaaaggggaaaaacatatga
-ttatttcaataaatgcaagaaaagcatttgacaaaattcaaagccctttaaaaaaaactc
-atcaaactaggagagatggtaacttcaagctgaataatgctagctacaaaaaagtaacta
-cagataacatcacctttaacttagaaggctcatgtctttctactttaattaggaacaaat
-ggtaagttgaccacaaccacttttacttaacgtcatactgaaggtcttagctactccaaa
-aaggctagaaataggaataaaatgcatgcatttagaaaaggaagatacagcagattctat
-ttttagtttttaatttttataggtacatagtagatgtatacatttatggggtacaaagtt
-attttgatacaggcatacaatgtgtaataatcatattagggtaaatggggtatccatcac
-ctcaaacatttatcttttctttgtgttatcaacattctaattatactcttttagttatat
-ttaaatgtagaataaattaattttgactgtagtcaccctgttgtgctattgaatactaca
-ttttattcattctgtcttactatattttcatacccattgaccatcccctcctcccagacc
-cccctactacccttcccagactctgatcatcatcattctactttccgtcttcatgagctc
-aattagtaaaactttccttttttgcagataacatgatcatgtacataggaaaccctaaag
-aatccttggaaaagctattacatctaataaatgaatttagcaaagttttgaatgaaagtc
-tgtatacaaaaatatatatgtgcatattttagcaaaaaattagaaaaagaaattttgaca
-aaaactaccctttccataatagcatcaaaaatgaaatatttaggGGCCGGGCATGATGGC
-TCACCAATCTTGTACCCCAACAACCAGAATGATTATTTTTTATAGTTTTATGTATAGTCT
-ATTTTGGTTTTAAAATGGCAAAATACTATATGATTTTATATAAAAACTAAACTAACTTAG
-AAGTATGCAGTAAGAACGTGAAGGTCAAACACGCTGTCCATAACACTTAGGAAAATGAGA
-TCAACAGTAAATAGAAGACTGGTTACTCATCCTACAAGAAATGGTGATGAATAGGCCTGC
-AAAATATCCTGTAACTCCTCTAGAGGGTGCTCACTAGCAGGACATTCACATGCTACTCCA
-TGTGATGTTAGATTATTGTAAAGCATTATGTTCCTATAAAGGGTGGCGTGACAGTCCATT
-ACCAAGCACGAGACCCTCTGCTGATCTGTCCTAACAAGTGGAATTATGATATGCAGCAAC
-ACAGGAACCAGGCTTACGCTAGCCACATTGCAGAGAGACATTGCCAGAATCTCACTTGTA
-GAGGCCACCATCATATACATCAGTAAGCCTCTCTCCCTGGATCCACATCTCCCTCTATAA
-GGAGCCCTGTTAACCCCATCATTTAAGGGCTTCATACATTTGCCTTATATTTCTCTCATA
-AACAAATCAATGAGTTCCAGACTTTTGGTACAAATGTATGAAGACAGAAGAAATCATATT
-TCAGtcttaaaagcctaatcccagaagtgacacccatcacttcacattccattgccaaga
-gcaaatcacatgaccacacagatgcaaggggaatgagacattggcaaccacttcccagtg
-aCCATTATATATTATAGAAGGGGGGCATGCATGTAAGAGGAAAGTTGGTCTTCTCTGACA
-GAGACGTAGAATTCTACAAACATAGGGGAGGACGTTAAAAGGTGCTGAGCAGATAAAGGT
-CAAATGTCTGTTACAGAAGGACACAGGCACCAAAAGATAAAGagatactcctcaatttat
-gagggagttatgtcccaataaactcaccataaattgaaaatatcatacgtcaaaacttca
-tttaatacaactaacctacctaacatcatagcttagccaagcctgccttaaatgtgctca
-gaatatttatttgagcacatagttgggcaaaatcatctaataaaaagactattttataat
-aaagggttgaatatttcctgtaatttattgaatactgtattgaaagtgaaagatggaatg
-gttgtatgggtacttgaagtatggtttctactgaatgcatatggctttcacaccatcgta
-gagtcaagaaatcatgtcaaccatcataaataggggactatctgTATGACAGTAAAAACC
-ATTTTGTTACACAAATAGCAATCATCAAAAAAGAAAACACAGCAATTTCTGTTGCATATA
-TCCAAGCATTCAACAACAAAAGACCTTTCATTTTAATCAtttttttaagacacacggtct
-gactctgttgcccaggctggagtgcaatggtacaatcatagctaactgcagccccgacct
-cctgagctcaagcgatcctcctgcctcagtctcttgagtagctgggactacaggtgcgca
-tcactatgcctggctagttttttctagaggcagagtcttgctatgttcctcagactggtc
-tcaaactcttggcctcaagtgatcctcccaccttggcttcccaaagtgctagaattacag
-aggtgagccacagcacctggccAAGAATAGACATTTTATATCAAAGTAATTCAAGTATCT
-ATATGAACAAGTAATCGTGCAACTAGGTAATCAGGGCTTTGACCAATTTTGAATTACACA
-ATTAAAGTGCTAATATGTATTGTATTATACTGTATTTGCTGTAGCAATGCAAAAACTTCA
-TTGTTCTTTGTCCCCAAATACAACTGTCACTTATATTTCACTGTTTATGCTGCTAGTACA
-TAGCTTTATAAATTAATCTATCTTGTTTCTGACACTTATACATATTTCATCCTCTGGGGA
-CCTGGAGGAGCATATTCTTTGCCCCACCTCACAATTACCTATGCATATTTCTCAGTAACA
-GGCATAAGGCACGCTGCACAATCTTAGCTGATGAGATAAGAAGTCTCTCCTAAGGCTTTA
-CTCGCTGGACCATGGCAGAAATGTGGACAAGAGTGGTTGCAGAACATGCTGTGCCTGGGG
-CAAGGACCCTCTAATAGAACTAGAAGAGATAAGTCACAGGTACAAGGAGTGTGCAATCGG
-TCTGTTCAGCCACAGTTGCTATTAGAGGCCCCTGAAGAATTTGTTGTACTTTCCACGCTA
-GGCTACCTCGATCACAGAAATCAGCCTAGAGTCATATAACCCAAAGGGGGAGCTGACATT
-GCTGCTAAGCCCTCCTCCTGAGGGCCTTTTATCATCTCGTCCTGTAACCTACCTTTGCCA
-AGACAATTCCTTCAATCTTTGCTTTGTTTCAGGGAACAGTAATCCTACTAAGACTCTAAC
-AGTAGGGACGAGAGAAAGGGATGGAACAAAGGAGTGAGGCAAGGAGGCATCAGATGAAAG
-TGAGCTAATAATCTGTTGGCACCCATCACAtgctgagtacttccacttacattatcacac
-ttaagatgcacaatactttgggcatgatgtcactgccagcaaatctgaaattaggaaact
-caggcccagaagatatgaagtgacttttccggggtatcattaatgcaccagcagtgtaag
-ctaaattgaatccattctgcctgacaccaaaatcgtattcctttcCTTCCCTCCCACAAT
-TGTTTCCATTGGTGTATAAAACCTCTAAAGATCAAGATGTGGCTTCCTTCTTTAAAGAAA
-TAAAGCTGAGGCTAGGTAGTGACAGGTGGGGGCAAGTATGACCATCTATGAATGTTAAAT
-CTCACCCTCAATCCCACCTTGTAGTTTACCATCTATAGACTTGGCCTTCTTTAGATGAAG
-CAGTGTTGTAGGGgcctttctcaactggtgttcctcattcgaaccacagaacacagaaaa
-tgacttaggtgactattttcccaattcttccaaagatgatacatatgaataccattctag
-gtgcttagaagaaaggttaatccaaacacaatggatgtgtttggttgttaggatttaatt
-tgcttgcagaaacccaattgagacatgctgGTAGGGAATCTCTAACATTGGTCCACTGTA
-GAAGACAGAGGAGACGATCAATTTATTTTGTCTATCAACCTGCAGAAATAAAGAGTTTTG
-GTGGAACTGTAGGTAGAGAAAGAAGGAGGTACCTTCCCATGGCCTTGATGAGCCTGAGTC
-TTTCTAAATGCCAGGAAGGAAAACTACTCAAATTAGCTGTAACAGGGAGTTATCACAACA
-ATTTTTATTCTCTTGGGAAGTGCTAAAACAAATATATATGGAAATCTTACAGCCAACAGA
-AACGAatttcccactgctttcctccctcccaaactttcccactgtccctaattgaaaccc
-cattggaaggtaactaaatcctgtacaaccagaatctcctcatctaacttttcatttctc
-cctgtgttaaattaatcctgtttctccctcatggattcaccatcaacttgtactctcaag
-ctgatgctgttcattttcccacttttcatgactcaaggccaaaaggttggtatggcagct
-tcctcccttcccaatgttattttgaaaacattgcttctgtagtgtaaaatccccaactag
-tcaagactcaagtcagctcttttcaatgcctcttcaaccatctttattgttatattttaa
-aaagcagccccccatttattgaggactttggcactttgtttagaatgtatctattctgat
-tattgcctttattattggtgacttcagcatccatatggaaacactatccagttctacaaa
-tgttcagttatttgtcctccttaatgtcaataatttacctgctattctactcctgatttc
-tggccatagagctgtccacgtcatcatcaatgaccactccacacatgaactctgaactcc
-taccaccttctctgatcacacccaggcaccttttcagctccctcattttattatagaaca
-tgcatccgccagacgcttcctccttcacttttctattttttttttttttttttttttttg
-agatggagtcttgctctgtcgcccaggctggagtgcagtggctcgatctcggctcactgc
-aagctccacctcccgggttcacgccattctcctgcctcagtctcccaagtagctgggact
-acaggtgcccaccaccacgtctggctaatttttttgtatttttagtagagatggggattc
-accgtgttagccaggatggtctcgatctcctgactttgtgatccacccgcctcagcctcc
-caaagcctccttcacttttctttattagcctcaaccccatgattcaccactccaagtact
-cccttgccagcatcctcaaatcccaataccatttttaaaattttttaaagaatttctgca
-cccacctgtgtgaaaagttcaacccccagatccttttaactgtttgtcttctccacagac
-aaattcaggctgatgagcagtgctggaaaaagtgcacagctgcgcagattagtggcacct
-gcattcatgatctccagttttcacaaagccctcaGCAGCAGCCACTTGGTTCCCTGTGTG
-CAGCGTTCAGTGGAaaactccatgagggcaagaacaatatctgcttttactcattatttt
-aacccacttgaatgttaagctccatgatgacagggactttctgcggtatagattattacc
-ggcccctaagacagtttctggcacataatagacgctcaataaatactcagtgaaggaata
-aaATAAATAGGAGGTTAAAATTAAGTGATCAACAGTAGTCCAGGGTATTAAAGagactcc
-ccttaaaagctgcaattaagcagagtcatgagaggtgagtaggagctagcctgagaggaa
-atggaaaagacagtattaaaggcaggttgaacagcGCCTCTGTGATCCCTCCCTCATGCT
-TTACACACAATCGTTCTGAGTATTCTGTACTCAAAGCCCTTCCATTCTCTCCAGTTCCAC
-TGCCGCTCCTATGCACCCTCAGATGCAGCCTCTGTATTTCAGCCAGAATGGTAGCTCTAA
-AAGGTAATTCTGCTCATTATTTTCAGCTTCTATTTGGAACTCCTCTCAGAGCTCTCTAAA
-TTTCCTCAAGATATCTATCAGTTAAATGTGTTCACCcagtggtcttccatgtggtttgta
-tatgccaaggtatccccaaaaccctttgaaggagtctgcaaggtcaaaattattttcata
-acaatatttttaaaataactagtttcataataatattttgccttttcacaaaattgacat
-tggctctgaaaatgcaaactgaagcagataaaatagctagtgcctcaccacaaatcaaag
-caggggcacaagtctataattagaagttggattctttatcaccaagcacttgtaattttt
-ttaaatgccactcttaagaatatacttgacaaagtataaaaatttttaattttattgaat
-cccttgagtaGATTTTGTTCTAAGgttaaagtaaattaaagtggaaaccaggcctggaga
-atccatgagcagacaaggcctcttaagtgctcataacttttcttgatttgcaaacgtaag
-caaaacttaattggagctatttcttgtaaatgcctatattaaagaaaaatagaacttaat
-ctcaaccaatcaaaagcagctaactaactcgtaattatataagaaggtacttcccagcag
-gatagaccaaataagacaaaatttgtaactataaccaatcaaatattttatttgtattat
-ttccacacttactgcataaaagcgtgttccttacCACttttttttttttcttgagacagg
-gcctcactctttcacccaggctggagtgcagcggcatggtaatggctcattgcagcctcg
-aactccggggctcaagcaatcctcccacctcagccttctgagtagctgggaccacaggca
-cccaccatcatgcctggctaatAtttttttttttttttttgagatggagtctggctttgt
-cacccaggctggagtgcagtggcgcaatctcggctcattgcaagctccacctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacaggcacccgccactacg
-cccatgcccggctaatttttttttcttttttttcttttttggtagagagaagggtgtcac
-catgttgctcaggctggtttcaaactcctaggctcaagcaatcctcccaccttggcctcc
-caaggtgctgggattactggcaggagccaccatgtccagctTccttaccacttcttaagt
-gaagaccccgaaccacttctggtttggagttgcccaattcatgcattgctgtttgctcaa
-ataaactcttttaaaaatttttattatgcctcagtttaccttttGACACTatgttctgag
-taatacaaggaaaagtacatataaagcacttctgcagtataacaagctatgatggttgtc
-gccagaaaaatcacttaaataactatttggattttaaactgaactaggcacttttttatg
-aaacatcatttttatttgaaagaatgatggaaaaagtatggttattcagacttacatact
-tggcagaaattttctcaaaaattaacaaagtgaacttgtcatttcaaagaaaatagctag
-caatattagttaccaatctattcttataatgtgtggctgacaacaagaagtgaagtcact
-gctccctttccttgaacctgggaagatctttgtaaccaacctgaccagtacaatgcagtg
-gaagaaatatcaggtgatttccaaggcagaacagcttctgactggccctctgtctccagc
-caccatgttagaaggaagttcaggccacatggagacagcaaggcctctagctcacagtca
-gcatcaactgccagacatgtaagtgaatgggcctccagatgattccagtccccagtcttt
-gaggcttcccagctgacgtcactgacattaccatgcagagacaagccatctctgctaagc
-cttaatttttaacccatagagaccatgaaagaataacaaatgatgattgttttgaagcca
-ctacattttggggtaattcattatgcagcaatgggtaaGTAATCCTGGCATCACATGTTT
-TTCAAGAATGGGAATATGTCTTTTTCTTCCTGTCTTTCATGTCTAAGCCCTCTATCAGTG
-GTGCTTGTTGTGTGGAGTTTGGAGCCCAGGAGTAGTCAGAAAAGACTTTGATGACACAGG
-GTTGCTTGTAGAACATCTAATATGAGCAACTCCTACCTTGTGCTCACTGACCAGGCCCAC
-AGAAAAGTCAACAAGGGCAAAAGTTCTTTGCCTCACAGCACAGAACTGCTCCTTCCTCTC
-TGGTGCCTCTCCAACCACAAAATTCCTTGTCCCTGTCTTTGCCAGTCTCATGTTAAGAAA
-CCCCATAGACCCAGGTATTCTCCAATCTTGATGATAGAAGGGGAAACTGAGGAAGAGGTC
-CAGCTCACAACATTCTTACCAGCCCAGGGGGAAGGCCAAGATCTCCACAGAGTCATAAAC
-TCTAGGCCAAGACTATGCCTCTCCCAGGAATATCCAAGTTGGATATACCATATATTTTAT
-GCAgataaaatagctagtgccttaccacaaatcaaagcaggggcacaaatctgtaactag
-aagttggattctttatcaccaagcacttgtaattttttaaaatgccacttttaagaatat
-acttgacaaagtataaaaattattaattttattgaatcccttgagtaGATTTTGTTCTAA
-Ggttaaagtaaattaaagtggaaaccaggcctggagaatccatgaaaagacaaggcctct
-taagtgaTAAAACCTGTATTATTCCTACAGAGTCTCCTCTAATGTCAGCAACTGTCCTGG
-TGTCTCAACCTGTCTTTACCACCTTGATTTAGCCATCATGAAAGATCAGCCAACTCTATG
-TTATTGTATTTTTATTTCCATCTCTACTTTTTATTACAACAAAGGTCCTACTTCGTTGAA
-TTTTCCCTTGCTTTTAAAAAAACGGAAGGTCTTTAACTTGTTCTGAAGAAACCTCCTGTG
-AATTTCAAAAGGGCTCCCTATCTGTTGCATGTGGGGAAGGGCCACGCACATCCACATTCC
-CTTCGTTCCAGGGCACTGGATTTTCAAATATTGAGTTCTTGCTGTCTTCAGTCTTTGAAT
-AAAGCTCACGTGGACAACTATGAAGTTTAAAAGCATAGGTTGAGTTTGGGGTATAGTCAT
-GAGAATAGAGAGGAAAGAGCAGAAGTACAGCTCATTGCAGAGGACAAGCATCATGATATT
-CAGAACATTTGATATGGAGTGATATGGGGTAAGAGTGAGCTGGGTTTTATTCTGGGAAAT
-CACCCAGccctgaaaaagctatttatattcttttgttcactttccttatctgtaacacag
-agaccgttatgccaggtttcctagctactttagttgttgtgaagCAGCATATTATAAATA
-TCATAAAAGATTATCCAGTgctaggtgccatggtgcacagctgtaatcccagctacttgg
-gaggcagagtcaggaggatcacttaagcccaagagttcaaggctgtactgcactgtgttc
-acacctgtgaatagccactgcactccaacctgagcaacacagtgCCTCTTAAATAtgtat
-atgtatatatatatatatgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtATAT
-ATATATATATATACTCTTTTAAATTTACTCTGTTTTAAATATTTTGAGGCAGAAGCAAGA
-CGTTTTGATACAGAAAGCCAGCAGGTTGCTGAATTACAAGACTGAAGCTGAGGAAACTGT
-GTTTATCAATAGAGATGCACCGCTCATTCTTATAGAGGGAAGAtacaaagtaactctatt
-aagtcaagaatttctatatgttttatttactgcaatatcctcagtacatagacagcagtt
-gacatatagtattgatcatagtatctaatgttcaatagatatctgctgaatgaactgaaA
-AATTAATAATGTTGAGCAATAACAGGTAATCACTGTAAGATAACATTCTGAGGAGACTAA
-AATTTGAAGAATGCCTACAAGAGAGGGAGATGCAAAGGGAAAACATATCCTAAAAAATGA
-AATGAAATTATCCTTAAGAGAAAAAAGAAACACCAGTATGATCAAAGATTGCAAGAGGTA
-GAAGACAAAACTGCATAAAGTAAAACAAAATGCTGAACTCTTGAAATGCAAAAATCCAAA
-AATCCTGTTGCCTGTtttttttttgtttgtttgtttgttttttttgagatagagtttcac
-tcttgttgcccaggctgaagtgcaatggcaccatctcggctcactgcaacctccacctcc
-ttggttcaagtgattctcctgcttcagcctcccaagtagctgggattacaggcgcccacc
-accatgcccagctaattttttgtatttttagtagagacgggtttcatcatgttggccagg
-ctggtctcgaactcctgacctcaggtgatccacccatcttggcctcccaaagtgctggga
-ttacaggcatgagccactgcactcggctGTATTTTTTTTTTTCACTTATTTAGAAGGCTG
-ATTTATTATCACCTCCTGCCAGTCACGGGAATGAGACAGAATCACCTTGAGAGTATCTAC
-AGGGAGAATCTGGAGTCCAAATCCCTTCTTAATCAAGAAATGCTCTTTAATCAACTCCCT
-ATATATAGGGAGGTTGATGCTGGGACAAGAGGGGCTGAATAACTTGGGGTTCTAGTCTTG
-GATATGGAATGGGGGCAAGTGTGTACAATCTCTTTGATTTTCCCCAGGGCTTCCATCAAT
-ATTCCAAAAGACTAGAAATTCTGGACAGCAGCTTTTCCCTTCTCTCCCTTTCACACTTCA
-GTGACTTCTGTCTTCATCTTAAGACACTAATCTACACCCAATTTTCTCTCCTTCCTTTTT
-GCAGGAATGCTATTCATTCAAAAATGCTGGGATGAAAGAGCAAACTTGCAAGGATATCTG
-CTACAATAATTAAAGAGAAATAGATGCCTATAATTAAAAACATTGCTGCTTGTCTCTGAA
-ATTATTTGAACACTGTATACATCATAATGTACATAATCAGTTTCCATCTGATATCCCAGA
-CATCTAATCCTGGAAACAACGTCTAATATCTCTACCCCAAAGCAATAGAATTAGAGCTGG
-AAGGGGCAGGTAAGCAACAGTGTGGACCTTTctcagcagcagtgaacttggggtgctcac
-aacctgtgcaaaaccagctgtggtggctaaggattgcctatgtcacctctcccccaactc
-taggcaatgcagcttggggatagactccttccacttgggggaagaagagggaagagtaca
-gagggctttgccttgcaacttgggtaccagctcagccacagtaaagtaaagtatcAAAAG
-TTacccagcatggtgccagctgtggtggccactggacttgcccttcccccaactccaagc
-agcctggcacagagagagagactccttttgtttgggggtaaatgagggaagagaagaaga
-aactctgcctggtaacccagggaatttggccaaatttaaaccccagcccactaaggtggt
-tcctctaggactcagcgagagttgcagtgtttctgagcttagggcaccctctagtgctga
-tatagtttcaataatcacaggctcaaatcacaacactcaatctccttcaaatacctgaaa
-agccttcccaagaaggatgggtgcaaacaagcccagattgtgaaggctacaatatgtatc
-taactcttcaatgcccagacatcaacaaccatcttcaagagttaagaacatccagggaaa
-tatgacctcatcaaatgaactaaataaggcatcagtgaccaatctgagaatgatggagat
-atgtgactttttagacaaataattcaaaatagctgtcttgatgaagctcaacaaacttca
-agacaacacagagaaagaattcagaattacatcagagaagtttcacaaagaaattgaagt
-aatttctaaaaaatcaagcagaaattctggcactgaaaagtttgattgtcaaagtgaaaa
-atgcataagagtctttcaacggcagaattgatcaagcagaaggaactggtgagaactggc
-tatccaaatatacacgaagccaaaaaaagaattaaaaaagaataaagtatgcctacaaaa
-tgtagaaaatagtctcaaaagggtaaatccaagagttattggtcttaaagaggatgtaga
-gggagagaaaagggtaaatagagagatcttttcctcagcacatggaacattttgagagat
-cagggtagaaaggtcagagaaataaaaacaaacaaccttccaaacctcaagaaagatata
-aacatccaggtacaaaaaggtcaaaaaacaccaagcagattcaacccaaataagactacc
-tcaaggcttataataatcaaactttcaaagatcaaagataaagaaaggatcctaaaagca
-ccaagagaaaagaggcaaataacatataaaggaactccaatacatctagcagcagacttt
-tcaacagcaactttacaggccaggagggagtgggaaaacatatgaaaactgctgaaggaa
-aaccaaccttcaacctagaatattatctccagcaaaattatcctctaaacatgaaggaaa
-aatagtctcccagacaaacaaaagctgaggaatttcatcaataccagatctgtcttacaa
-gaaatgcccatgggagttctccaacctgaaataaaaggacattaactaacaacaagaaat
-cgtctgaaggtataaactcactggtgatagtaagtacacagacaaatacaaataccctaa
-cactgtaattctggcatatgaaccgttcatatctttagtagaaagactaaaagacaaacc
-aatcaaaaataataatgacaacaactttttaagagattgtataaaaagatacagagacaa
-taaaaatcaaaaagagtgtagagtgtagagtggttgtctctttgcttgttagtctgtttt
-tcttttctttttaatcaggattaagttgtcatcagtttaaaataagtggttataagatgt
-tatttgcaagcttcatggtaagtacaaaacaaaaacctgtaacaaatatgcaagaaatta
-aaacatactaccacacaaagtcaactttacacaaagaaagatggaaggaagggagggagg
-gagggagggagcagggaagggaaggaagggagggaagggagggaatggagggaaggagga
-aaggagggaaggagtgagggagggagggaaggagtgagggagggagggaaggagagagga
-gaaaaggagggagagaggagaaaaggagggagagaggagggagggaggaaagggagggaa
-ggagggaggaagggagggaaggaaggaaggagggaaggaaggaaggaaggaaggaaggaa
-ggaaggaaggaaggaaggaaggaaaaagaggaccgatgaagcaaccagaagataaatttt
-taaatggcagttgtaagtccttatctattaataagaacattgaatgtaaatggactgaag
-tctccaatcaaaagacatagagtggttgaatggataaaagagcaagacccaactacatgc
-tgcctatgagaaactcacttcacctataaagaaactcatagactgaatataaaggaatga
-aaaaagaaattctatgcaaatagaaaccaaaaaagaagttattatacttatatcagataa
-aaatatctttcaagacaaaactgtaaaaagagacgaaggtcgttgtttaataataaagga
-gtcaatttttgcaagaggatataacaattataaatatatatgcacccaacactagggaac
-acagatatataaagcaaaaattattagttctaaagagagaggtagaccccaaaacaataa
-tagttagggacactaacaccccactttcagcattggacagatcatcaagacataaaatcc
-acaaagaaatatcagacttagtctgcactataaaccaaatggacctaacagacatttata
-gaacatttcatccaacagccatggaatacacattattttcctcaccatatgaacattctc
-aaagataaaccacttgttaggccacaaaacaggtctcaaaagaatctaaataattaaaac
-catatcaagtatcttttatgaccacagtggaataaaagtagaaatcaataacaagaggaa
-ctttgaacactatacaaacacatggaaattaaaaaacataatcctgaatgaccgttgggt
-cattgaagaaattaagacagaaattttaaaatttcttgaaacaaatgaaaatggaaatac
-aacattccaaaacctatgggatacagcaaaagcagtactaagagggaattttatagcaat
-aaatgtgtatatcaaaaaagtagaaaaaatgatcaataaagcagtctCAGTATCAAAAAT
-TATGCCATATGTCATTCCCTTCCCCAATATAGAAATTATTTAGAAATCAATAAcaaaaag
-ttcaagaaaatgtatattatgaaaaaaatcatgtaagaatttcaaaatgttttgcaccaa
-aataaactaatactaactggttataaaatgtttgaacaagatctagtttcagacactaaa
-aaagataagacatcagtctgaaaagagcccctatcagagcaacatgaattctgctaaaat
-tgaagcaagaacaaacatcaaatgtacagtgaagcttgggtagaagaatgatgaaatcat
-tgatgctttacaaaaagtctatgggacgatgccccaaggaagtcagcagtttgcaaatgg
-ataactcattttaataagggatgagataatattgaagatgaagccaccagcagcagacca
-cccacatcagtttgggaggaaaaaattaatcttgttcatgccccagttgaaaaggactga
-taattaacagtaaaaacaattgtcaacatcatagacttctcagttggttcagttaatgga
-aatctgactaaaaaattaaagaagaacaaactttccacttgatgggcgccaaaaccattg
-tgccaaaatcagctacaaacaagagcacagctttcaatgaaactttaaacaagtgggatc
-aagatcctgaagcatttattcaaagcactgtaacaaaagttggaatctggctttaccagt
-atgaccctgaagacaaagcaaaatcaaagcaaagagatggaagtgatccagtccaagcaa
-aagctgaccagttaagaacaaaagtcatgtcaacaatttttgggggtgcacaaggcattt
-tgcttgttgactttctggagggccaaagaacaataacatctgcttattatgagagtgttt
-tgagaaagttagccaaagctttagctgaaaaatacccaggaaaacttcaccagagagtcc
-ttctccaacatgacaatgctcctgctcattcccctagtcaaacaagggcaatttttcaag
-cgttttgatggaaagtcattaggcatccacattgccatcctgacatggctccttttgact
-tctttttatctcctaatcttaaaaaaaaatctttaaaggacaccaatttttcttcagtta
-ataatgtaaaagaacactgatgtggttaaattcccaggaagctcagtccttcagggatag
-actaagtggctggtaccattgcttacaaaagtgtcttgaacttgatggagcttatgttga
-gaaataaagtttatatctttatatttttatattttaatgtcatcttccacaaactgtttg
-aagttccctcataactaaaatgtccccacatgctcagataagaaacacatttctcaacca
-atgtttctcagatattaaagtacatacaaatcacctgaggatcttcctaatacgcagatt
-ttgattgactcattctgagatgaattgaaatcctgcatttctgacaagctctccggaagt
-gttgatgcttctggtctttccaccacactgtgaatagcaaggttcaaactaattcatatg
-tcagaaaagatgacacagtggaaattgaagtgtttatttttaagtgaatgattatgataa
-caaaacactgcaaataaaaacttatgaagtccagctaaagctgcatataaagggaaaatt
-agagtcttacccacttggttatactgaagaaaagctgaaaatgtatgagataacaacaca
-aataataagttagaaaacaataacagaataaaatgaaattttattcaaagaagttcaaag
-aaaggaagataaagctgagaggagaaaataattaaatattttttaattttcataatattt
-aaaataaaatataattaaataaaaatcaaacatagaatcaacaaaaccaaaagctgattt
-tgaaaagaccaattaattaattcactataggaataacaaagaaaaaattgaaaacacatt
-acccatatgaagaataaaacacgtagccatcactacaaactctatagatagtaaagagat
-caaaggacatattgtgagtgaccttatgccaaaaatgaaatttagaagaaataaacatta
-cttgatgtgacccaagaagaaattgaaaatttgacagttctaaattgttagggaaattaa
-atctTAAATCTTTAAACTCAGTTGAGTTTTTCTGCTACATTCCAATGTCTGATCCCTAGC
-TCTATGGGTTTCAACAGACAGTTGTAGAAGCAGCAGAAAAATATCCTTGCTCTTATATTA
-CAGCTACCGTGGTGTGTTCTTGAAGTCCAGCATGTCTAATCATGGGATCCTGTCACCCTA
-CTTTCCTGACTATGAAAGAACTAGCAGATTCTCTGCTGGGCCAGTTTGTTGGAATGTTCT
-GGAAGTCATTCTGGGAGACCAAGCCCACAGTCAGCTTCTGTAGAGAGTTTATAAGCACAT
-AATTCTGAGTATTAAAAATATTTCTGTTGAAAATAGCTAGTGTTTTTCATTTCCCAACTG
-ATACACATAAATGCAACACTTTGCACATGTGAATAATTTGTCTTTTTACAAAATTATGCT
-ACACTGTTGATAGATTCATTCCATATATACATGCAACATACTTAATTTTTCATAACTTTC
-CAATTCTTATTAACTCAACTTTTTGTTCCATAATAACTGTGCTTCTCTTTGTACCAGTAC
-TTTCCATATTCTTATTGCTTTGGGACTAGCAAGACACAATGAGGTGAATAATGTTATTTC
-AATGCATCTTAAAACACCAGAAACCAATTAATATGCGATATTCAGGATTAACTGATTCCA
-AAGGGCTGTTAATTCCATCTCTTGATATTGACAAGTAGTAAGTAAATATGCCTAAGCTTG
-ATTATTTTTGTTCATAGAAGTAAAATATACATTTCATAAAGTGAAAGTTCATAAGATTTG
-CTTTTATTGTTTTAAAAAATAACAGTTAATTTAAACAAAACTGAGGAGTCATTGGATACT
-ATAGTAGCTAATGAAATCCTAAGAAGACATGAATTTCAGGAAGGCGAGGAACCAGGGAAA
-CTCTTGAAACTTGAACAATTAATAATATTCAGAGCCAATGAGCTTCAATATCTGAGTTTC
-TTAGGAAATGTCCCAAATTAGCAGGGGAAAGCATCTGATTGGTAGGCTTGGTTCTATTGT
-TACACCTGGATCAATCAGCTACGACCAAGGAATCTGAGCAGTACACTATAAAAATTGCTG
-CTTTTaattatttcaaccattgtggaagatagtgtggcaatccctcaaaaacctaaagtc
-agaaataccatttgacctagcaatcctattactgggtatatgcccaaaggaatataaatg
-gttctattataaagacacatgcatgcatatgttcactgcagcgctattcacaataacaaa
-gacatagaatcaacccaaatgcccatcatttggccatttggataaagaatggataaagaa
-aatgtggtacatatataccacggaatactatgcagccataaaaaagaatgagatcgtgtc
-ctttgcagggacatggatggagctggaggccattatccttagcaaatgaaggcagaaaca
-gaaaaccaaatactgcatgttctcacttataggtgggagcaaaatgatgagaacacatgg
-acacacagaggggaacaacacacactggagcttactggagagtggaaggtgggaggaggg
-agaggatgaggaaaaataactaatggacactaggcttaatagctgggtgatgaaataatc
-tatacaaccaacccccatgacacacattacctatgtaacaaaccagcacatcctgcacat
-atacccgcgaagttaaaaaagttTTTTTTTAGTTGCTACTTTAAAAGGATGTGGGAATCA
-TTGTAAACTCAAAAGTTAAAGATGTGCCAAGAGCTGTCTCCCACGAACTTGTTTAACAAA
-CGTACTGACTTTGTATGTTGATCCAATACCCATGCTGGCCACTGGACATACCAGTACAAA
-CAAGGCAGAATCTTCACTCTCCTCTAGCTCTTCTAATTCTCATGCACTAAGTGCCAACCT
-TAGCATAACTGGGCTGACAATCAGTGAATCAAATATCTAACTCTTATCCTACTCCAACGT
-TAAGAAAGAGACATGCgactgggtgcggtggctcatgcctggaaccccagcactttggga
-ggccaaggtgggcggatcacttgaggtcaggagtttgagaccagcctggccaacatggtg
-aaaccccgtctctactgaaaatacaaaagttagctgggcatggtggtgcatgcctgtagt
-cccagatactctacttgggaggctgaggcaggaggattgcctgaacctgggaggcggagg
-ttgcagtgagtcgagatcacgccactgcactccagcctgggcaacagagtgagactccat
-ctcaaaaaagcaaaaGAGAGACACATGCAAAGGGCTTGCTCTTTCTTTCTCATCTTACCT
-ATCTTATGTTTTCCTCCAGGATCAAGAGCAAGGAATTTGTTGCATAGAGGTGTTCAAGAA
-AGGGTGTTTTCAAACAGAGTCAGAAAAAACACAACTATACTGCGAGCAGCATACAAACCT
-GCTTTGGCTGCACTTCACTGCTCATGGCATAAGGCCACGAAGAGGCCAATAAAGGCTGGA
-GCTCAGGAGCATCAACCCAGATTCAAGGCTTCCTCTCTGGCACCCAACCATGAAGCTCCT
-TTTTCCTATCTTTGCCAGCCTCATGCTACAGTACCAGGTGAACACAGGTAATGTGGATTC
-CCAAGTTTAAGATGGGTAGATGAGAGGAACCAAGGATTTGGCTGCCCATGACAATGGAAA
-CCCAAAGAGAGGAGACTGAAAGATTAGCTGTTCAAAAAGATGGCTAAAGAGCTTACCTAT
-TGTATCAGTCATGCACTGATACATTCTCATAGGCCCCAACTGCCAGATTGTGTCCAGTGG
-AAACACCCAGGAAGCTACAGAGAAAGCAGGGTATTTTTTGTCTATTCAGAAACTATCCAA
-AATATAATGCTGCCTTCCTGCCCTGTATATGTCTATCATGCTAAGACTAAGCCCAGGTCT
-ACCTCCTTTTAGCTCTATTTCTATCTTAAAAGCCCTTTTTTTTTAAAAAaagtcctgggg
-tacttgtgcaggatgtgcggtttgttacataggtaaatgtgtgtcatggttatttgctgc
-acctaccaacccatcgcccaggtattaagcccaggatgcattagctatttttcctgatgc
-tctccctccacccaacaggccccagtgtgtgttgttccccttcctgtgAAACCACCTCTT
-GAAGCAAAGTTTCCTATCAGTTTGTGCTTGGTGTAGAAAGGAGGAAGTTCTTCCCTCATG
-CTCAAAAAAAAACCCTTTCAAGATCAAGTAAACAGGCCTGTGTTCTCCATCTTGAATTCT
-TTCAGGTTTTCCAGAGCCTTTATCGCTTCTCTCAGACTTTGTCTTCCTGAAAACCCCCAA
-ACTACCATAAGGGCATCTAGGAATGCATTATAGCAAAAGGCTAAGCCAGGGGATTAACCA
-TTGTTTTTGGAAAAGAAAGGAGAAGCACTGAGATTTGTTTCAGAATACAAGAATCATCCA
-GCTATTTGAAAAAATTAGCAAAGGGTTTCGGGGCAGGGAAAGTGGAAGTGTCAAAGATGC
-TTCTAATGTTTTTATCTTCTAATGTTTTTATCTTGGGACCCTAGGAAAAGGGTAGTACCA
-TAAGCAAGTAtggctgtgtcatcttgggtaaagtcacttaaccactttgaacttcaattt
-cacatgagtataatggggttaatcaatgcAGCTGATTCCAATATAAGAATTTTTCTGTTT
-CCCGTTTGATGAGAAAACAATGTGGAAATGTATGCAAATATGCTTTGAAAATTAGCAGAT
-GCTACATAAATCTCTTGTAATTTAGGGAAAATCATTGGGTTATTAAGATGAACAAGGGAG
-AAAAGCTTTCTTGATTCAGAAAAAAGAAACACGAGACATTAGGATGGAAAAGTCATTCAG
-CAGATAAAGATAAGGTACTAAGCCGAGCAGGAAATTTAGAATTATAGATAACAATACAGA
-AGTTACCTTGGTGGATATGAGGTTAAGGCTAGGATAATGAATGAGACTTCTGAGAGATAG
-AGTGTCCAAAGAGGCTAGAAGAGATAGAACACCATGCTTCAGGAATCACAGATCTAGTGA
-TTGTTGAGAAGAGAGAAGTCATGGGCTACTGAGTTTGGTGAAAAGATAAGACTCCTGAAA
-ATTCTATTGATTCTCTTTTGAACTTCTTTCTTAAATTAGTTTTATGATGGACTTGGCTCT
-CATTGGTATTTCCCAAGATTATGGAGATGGGATAGTGATGTCTGACAAGTACCTAAGATG
-CTAAGTTGAAGGTCTAAAATTCCATCCTAAAAGCAAATAATTACTCTATCATCTACGTGC
-CCTTTGCTTCTTAAAGTTACTCAAGGAAGGCAGACTAAACAGGAAATTTACTTTGGATTC
-AAGAGGGGCATAGAGACGCTCTCAGCCTGCCCATTTGCCTTCATCAACATTCCTAAACAC
-TGGGCTTAAAATGTAGTATGAGTAAACTCTCTCTTAGTCTATCCATCTCCCACTAGCAGT
-TTTAACATCATCTCTAGTTATTAACCTTGGCTCAATGGCTTTCTCTTTTTTTATACAGAA
-TTTATTGGCTTGAGACGCTGTTTAATGGGTTTGGGGAGATGCAGGGATCACTGCAATGTG
-GATGAAAAAGAGATACAGAAATGCAAGATGAAAAAATGTTGTGTTGGACCAAAAGTGGTT
-AAATTGATTAAAAACTACCTGCAATATGGAACACCAAATGTACTTAATGAAGACGTCCAA
-GAAATGCTAAAACCTGCCAAGAATTCTAGTGCTGTGATACAAAGAAAACATATTTTATCT
-GTTCTCCCCCAAATCAAAAGCACTAGCTTTTTTGCTAATACCAACTTTGTCATCATTCCA
-AATGCCACCCCTATGAACTCTGCCACCATCAGCACTATGACCCCAGGACAGATCACATAC
-ACTGCTACTTCTACCAAGAGTAACACCAAAGAAAGCAGAGATTCTGCCACTGCCTCGCCA
-CCACCAGCACCACCTCCACCAAACATACTGCCAACACCATCACTGGAGCTAGAGGAAGCA
-GAAGAGCAGTAATGTGGATCTTTCCCTTAAAACTCCAAGTTCCTCTCTATTTTTGCTATC
-TATAAAATGACATAGAACTGTTTCCTCTGTCATCAGTCATTCAATAAACACTGTTTGAGC
-ACCTACAGTTTATGTAATATTATCATTCTCACAAGAGCCTCACAGAGGGGGTAGAGCTAG
-GGAGGGATGGAATTGTTTAAGTTTAGATGCCCAGGAGAAAGTAAGCCTCAGGAGGGTGAC
-TACAGCATCGAGTTTGTCCCAAGCATGGCCTAGATTAGGCCTCTGTAGCAAGCATTTATG
-TCTCTCATATGGTGTGTTTTTCCTGGAGCAACAGTAAGGAAAGCATCAGGAGATGTATTT
-TCTTTTCTCATGTATTTGGGAGGAAAGGCCCAAATGCAAAATAGAATATGTAGGAATCag
-aaaaaggttaaattaattgtaataatatatttttgtttcgttttgttttgagacggagtc
-tcactcagttgcccaggctggagtgcagtggtgtgatctcagctcactgcaactccacct
-cccgggttcaagcaattctcctgcctcagcctcctgagtaaccgagattacaggcgcaca
-ccaccacacccagctaatttttgtatttttagtagagacggggtttcaccatgttggtca
-ggctggtctcgaactcctgacctcgtgatccgcctgcctcggtctcccaaaatgctggga
-ttacaggcatgagccaccacacccaaccaataatgtgttttattgaatgcaatatatcca
-aaacatgatcatgttgacatgtaatcaatgtaaaaattatttatgagagagtttaccttt
-tttggactacatctttgaaatctcatatgtgtaattacacatagagcacatttctattca
-tactagccacatctcaagtgctcatagtcatatatgaatagaggatttcatagcatattg
-aacagcAACAAGGCTAGAGAGTTTTAGGGCACAAGTAATTATAGTGACTCTTAGGCATAG
-GGGATGCCCCTAATCCAGAGGAGACAGGCATATTTCTGAGGGCtgtggcatataatttaa
-gagtatagaaattcaggtctgatatgcccggactagcatcctagattctggcacttttta
-gctgtgtggtcttgaacaaatcatttatccacacataagcatcagtttatttattcataa
-aatggagatGTGAACATTATATTATATCCCAGAAATCAGCAATCTCAGATCACTCTTCCT
-CTTATTGCCCAAATTACAATGGCACAGCCACCTATTCTAGttttttaatagctttattga
-agcataattgatatacagagaattgaacatatttaatgtgaataatggcatgagtttggg
-catatgcaaaatcctgtgatactatcaccacaatcaaggtgatagacgtatacatcacct
-cccaaagtAacatgaccatatttgtagaaaaccctgaaaacttcacgaacacacacacaa
-aaatgtagaactaagaaatagattcaaaaaagtcaacatacaaatatcagtggcatttct
-atacacttaacaatgaaccattccaaaagaaaatcaaggaaacaatctatttacaaaagc
-aacaaaaagaataacataggaataaacttaaccaaagaagtgaaagaggtacattaaaaa
-cttaaaaatattgatgaaaaaatcaaaggaaacacaaataaatggaaagatattccatgt
-ttaggtattgaaagacttaacattgttaaactgttcattctgtctaaagcaatctacaga
-tataatacatctccccccttccaaatcccaatggcattttttaaagaaatggaaaaaaca
-atcctaaaattcacagggtaccataaaagacccagaatagcaaaatcaatcttgagtaaa
-aagaacaaagctgaaggcatcacactttcttatttcaaaatatattacaaaggtatagta
-attaggccaggcgcagggactcacgcctgtaatccagcactttgggaggccgaggcgggc
-ggatcatgaggtcaggatatcgagaccatcctggctaacacggtgaaacctcgtctctac
-taaaaacacaaaaaacaaaaaatagccgggcgtggtggcgggcgcctgtagtcccagcta
-cttgggaggctgaggcaggagaatggcgcgaacccgggaggcggagcttgcagtgagccg
-agattgggccactgcactccagcctgggcgacagagccagactctgtttcagaaaaataa
-ataaataaataaataaataaataaataaataaataatggtgttgggaaaactggctaccc
-acatgcagaagaatgaaattggatccttatctcaccccatataaaagaaatcaactcaaa
-acggattaacgacttaaacataagacctaaaactgtaaaactactagaagaaaacacagt
-actgttctgtatttaagctccatgacatcgttctgggcaatgatttcttgcatatgaccc
-caaagcacaggcaacaaaagtgaaaataggtaactgCATCCAGATTTTTTAACATATTCT
-TCTCTGCTACATATCACCTACCTCCATTCAAAGGTCACCTTTCCCCATCCTACTCATTTT
-TTAATACAGTGTCACTCTAAGAAAGACAAAGATTTTTCATGATGCCCCACAGTGATTCTA
-GAATATAACTAAAAAATATTTTCCTGGAAGTTTTTGCACAACAGAAAGGAGTTGCAATAC
-AAAGCATAAGTTTAACACCTGCTAGATATGTGTTCTCTGAGGAACCCCAAGCCTACCTGA
-TGGGTGTCAGATTCTCTCCCTGCTACAGCTATTTGTCAAACTCTTGAAAGTCCAGCTTTC
-CTTCCCATGGAAGGAAAATTCCCACGGAATGCTCTCTTCCGTGTTTACCCACAGAAAGGA
-GAGAAAGGTTCTTTCTCACACAAGTCTAAGGCCTTCCTCTAAGTCACCTTTTCCTATCAT
-AGAACTCACCCAGCACTTCTCAGGATAAATGATACTGCAGAATATGAGTTTGCTTCAGGG
-AAATCCCATACCCACTGTGAAAAATATGGTAACTctccaatatcagttctccccctttgc
-taagtaatagaaccctccaaatattaggttgacacaaagccgaccagagaaaaggctgaa
-tttcccaTCTAGAACTGGTCATTCTTCAATTCAGACCAGCCATAACTGGACACTTTTGCA
-AATATTCATTAATAGTCTTGGTGAAAACCTCAGATTTCCATTTTGCCAAAGTTTCCAAAG
-GAAAAGAGGGCCTTTTTCTAAGCCCTGAGAGCCCCACAGTGACAGTAAGTTCTCCCTTGG
-AATTCACCCTGGCATACCTCGGTGCTACCCCAGATCCTTTCCCTCAGGGGCTATGAGATT
-AGGTTTCATggccgaatgtgacggttcatgcctttaatcccaacactttgggaggccgag
-gcaggaggatggcttgagcccaggagtttgagaccagtctgggcaacatcatgagactct
-gtctatgtaaaaaataaaaattaaccaggtgtcatggtacataactccagtccctgctac
-tgtggggcaggggctgtgggggctgaggagggaggattgcttgagcccagaaggttgagg
-ctgcagtgagctgtggtcgtaccactgcactccagcctgggcaacagagcaagaccctgc
-cttttaaagaaaaagagaaaGGAggttgggcatggtggctcatgcctataatcccaccac
-tttgggaggccgaggcaggtggatcacctgaggtcaggagttcgagaccagactggacaa
-catggtgaaaccccatttctactaaaaatacataaattagctgggtgtggtggcgggcac
-atgtaatcccagctactcaggaggctgaggcaggagaattgcttgaacctgggaggcgaa
-ggttgcagtgagtcgagattgtgccactgcactccagcctgggtgacaaaagcaaaactc
-catctctaaataaataaataaaaataaaaaaGAGAGAGAGTGAGATTAGGACTCACCCTG
-GCCATCCCAGGTCCTGCCACTCCAGGTCCTGCCACTCAGGGACTGTGTGACTCTATATTT
-TTTTTAACTTCTCAGGCCAATATTAGAACCCAATCTGATCAAATTAGAAACCTATGAACA
-TTCCACTTACTAGCAGTGCATTCATGGAGCACTTCACAGGGAGTCACCAAAGTATCAATC
-AATCAATAAACTACTACCCTACCCTGAACTAttaggttggtgcaaagtaattgcagtttt
-tgcattgttggaatttgctgtttgatattagaatgcgttcttaaataaatgtggttatgt
-tacactttttttttttttttttttgagatggagtttcgctcttgttgcccaggctggagt
-gcaatggtgtgatcttggctcaccgtaacctcctcctcccgggttcaagctattctcctg
-cctcagcctccctagaagctgggattacaggcctgtgccaccatgactgactaattttgt
-atttttagtagagacggggtttctccatgttgatcaggctggtctctaactcctgacctc
-aggtgatgcacccgcctcagcctcccaaagtgctgggattacaggcatgagtcactgctc
-ccggcctatacatcattttaataggcatttctcactttatgttttttgataatgacttat
-tacttgctgttgattttatgtttattttagactatggaaatgatgtcagacaaaaagaaa
-attcaagcgattttcttattcaagttcaaaatgggtcgtaaagcagcagagacaacttgc
-aacatcgactgcgcatctggtccaggaactgctaacgaacgtacagtgcagtcgtggttc
-aaaaagttttgcaaaggagaggagaacctcgaagatgaggaatgtagtggccggccgttg
-gaagttgacaaccaccaattgagagcaatcattgaagctgatcctcttacaactatacaa
-gaagttgctgaagaactcaaccttgaccattctatggtcgtttggcatttgaagcaaatt
-ggaaagatgaaaaagctcgataagtgggtgcctcatgagctgagcaaaaatcaaatcatc
-attttgaagtgtcgtcatctcttattctacgcaacaatgaaccatttctcaattggattg
-ggacatggcaatgaaaagtgtattgtatgtgacaacctgctacaagcagctcagtggttg
-gaccaggaagctgcaaagcacttctcaaagccaaatttgcaccaaaaaaaaaggtcatgg
-tcactgtttggcactgtgatccactacagctttctgaatcccagcgaaaccattacctct
-gataagcatgctcagaaaatgagatggaaatgagatgcaccgaaaactgcaatgcctgca
-gccggcactggtcaacagaaagggcccagttctttacgacaaggcctgacctcatgttgc
-acaaccgacacttcaaaagttgaatgaattgggctacgaagttttgcctcatctgccata
-ttcacctgacctctcgccgatcgactaccacttcttccaactttttgcagggaaaatgtt
-tccacaatcagcaggatgccgaaaatgcttccaagggtttgttgaatcccaaagcacaga
-tttttacactacaggaataaacaaatttattcctcattggcaaaaatgtgttgattgtaa
-tggttcctaatttgagtaatcaagatgtgtttgagcctagttatagtgatttaaaattca
-cggtctgaaatcgcaattacttttgcaccaacctaaTATGTATGCAGGTGAATTCTGTCT
-GTCTTTGCTAAGCAGTGAGGTGATCCCGTGCTTAATGATGTTACTGCAAGCATGACAGCG
-GATAGAAGCGGGGAGGGCCAGTGATGAAGATAACTATTAGAGAGGGCATCCCAGTTGATT
-AGAAGCCCATCCCTAACTAACTACATCACTTCTAAAGGCCTGATTTCCAGTCCAGAACTA
-CTTTGAAAATGTTGTTTATGAACTCAAATTGTTAGTTGTAAAAATTATGAAATGAAAGAC
-TATTATGAGCATATATAAAATAAATTAGCCAGTAAATAACCTAAGATGATGAAGAAAAGA
-GCACTAAATAAAACCATAAATAAAAAGTTGGGAGCTTGGTAATGTCCAGAAAAAAATATA
-TATTTACTGTAACAAAGCAAAGGCCTTTTGTTAGTACATGAGACTCAGAATGCCTTAAGG
-AATGTGCTGGGCTCTAGAGGGCAGGGCAGGCACACAGCAGCTGGCACTGTTTGTCCAGAC
-TCCTGCCTGGACAAGTTGAATTAGAAAAATCCAAGCAAGAAACAGTGTCACTACTGGCTT
-CCCTGCTCTCTACTCATCTGCTCAGAGAGCTGCATGCTAGTTTGGCCTGTCCTGCACCCG
-TAGAGGACAATAGGTTATCTACATCCTTCACCACTAAGTGAGCCAatgggctgaactgtg
-ttcccctcaaaattcatatgctaaagccataacccacaatgtcactgtatttggaggtaa
-agcctttaaagaggtaattaaggttaaaagaggtcatatgagcaggatcctatccaacat
-aattggtatctttgcgagaagaggaaaagataccaaggatatgcatacacaaagaaaagg
-tcatgttagggcacagcaagaggtcagccatctgcaagccaaggaaggaggtctcaggag
-aaaccaaacctgccagcaccttgatcttggacttctcgtcttcaggactgagagaaaatg
-agtatctgctgtttaagccacacaggctgtggtattctgcgatagcagccctagactaat
-acaGGCCATAAAAAAGATAATATCCTTTCTTCCTTCTTTCTGAGCTCTGGGTAAATGGAG
-GTCAGATAAAgccaggtgtgatggcacatgcctgtattacccgctactcaggaggctgag
-acaggaggattgcttgagcccagtagttctaggctgtagtacactgtgattatacctgtg
-aatagccattgcactccagcctgggcaacatagtgagaccctgtcccctccccaaccaaa
-aaaaaaaaaagaaaGGAGGAGGGGGAGGAATGAGGTAGGAACAATAGGAACAACAGATGC
-tttttttttttttttttttttgagacagagttttgctcttttcacccaggctggagtgca
-atggcgtaatctcggctcactgcagcctccgcctcccaggttcaaacgattctcctgctt
-cagcctcccgagtagccaggattacaggcacccaccaccatgcctgactgatttttgtat
-ttttagtagagatggggtttcaccatgttggccaggctggtctcaaacacctgacatcag
-gtgatccacctgcctcagccttccaaagtgctgggattacaggcgcgagccaccgtgccc
-ggccAACAGATGCCTCTTAAAACACCCTGAGCCTCTGCCTTTATTCTAAATTTGTCAGTC
-ACAGGCCCGGGAGAAAGCTGAGCAACTTCAATAGGATTTTTAACTCAAATCTAAGACAGA
-AGTTTATATAAAGTTGTAGTCAGACTCGGCTGTGTTCAGAAAGTATATTTCTTCCATTGC
-TCAGCAATTATTTATTAGCATCTATTCTGGTCTCTGGGCAAACATTAAGGACTAAGAAAT
-GAATGAACTCTAATCATTTTCATTCTTTAAAAATTGTGCAGCCAAGAAAGAGAAATAAAT
-AGGCAAATGACCACATAACAGCAAGACATGTATAGTGAAAGTCATGCTCACTGCAATAAA
-AAGAACCTCTAGCTCTGAGTGAGGAAGGGGGAGTGGGTGCTGAGGTTGTGGGAAAGAGGA
-AGCGTGGGTAGAGTGAGGCAGACTGCTGTGGAGTGGAGCTGTGGGAGTGGCTTAGAGCTT
-GCAGGAGTAAGGGAATGAGGTGAGAGTGGAGGAACGGCAGAGTGCATATTCTCAGTTGCC
-AGAGATTCTGGGCAGCTTCTTTCGATCTTTGAGGATTTGGGCAGGAAAGGGTGAGAAAGG
-CCCATCTAACAATCCTGCGCTTCATAATCCCCTGAATCCTTGAAATTATTACTAAAGCTT
-AATGCTGGGAAAGATCTCTGATTCCCCTGAATCTGATTTGGCAAGCCAATCAATCATTTG
-TGTTAATTGGGAAAGAAATCAAATATTTCTGTGTGAATATACTCATCTCAAAACATTTTC
-AAGATAAAGTGTTTTACAAACTATGCTTCTGAGTCAATAGGATTCAGCTGTTTCGTTTTC
-ATTTCAGCAACTTAGAGGAAGTTTATCTTCAGAAAAAATTGCTATAAGAcacttcctata
-agccagccctgtgccaaattatttacatgaatcaccttctctagtctttaaacagcccta
-ttatgaatggacaattatctcaatttgacagatgatgaaactgaggcttgaagagattaa
-gttacctaagatcacacaATATGCCTCCAAAATTCGAAGAGGGCCGAAGGTTGTAATTGT
-GCAAGAAGAAGCAAATTTTCTATCTCTTTGAACCATAGACTGTGGATCCACTGCAACCTT
-GCTGAAATGGAAGTCTTTGTTGTTTCATGGGGGTTTTGCTGAATCTTCTGGCTTGTAGCA
-AGAAACTACTTTATCTTCACCAGATCTTATCAGCACATTGTATACCTGTGTGATACTCTG
-TGTGCTAATAAAATTATCAAGCTTCCTGTGGGTCCAAATTATGGCAAAAACGTAAGACAA
-AATGAtaatcccagcactttgggaggccgaggtgggtggaacacaaggtcaggagttcaa
-gaccagcctggccaacatggtgagacccccgtctctactaaaaatacaaaaattagctag
-gtgtggtggtgcgcacctgtagtcccagctactcaggaggttgaggcaggagaatcgctt
-gaacatgggaggcggaggttgcagtgagctgagatcacaccactgcactctagcctgggt
-gacagagctagactccatctcaaaagaaaaaaaaaaagaaaaaGCACACGACTAGTTATC
-ATAGATACTGTTGGCTACTGTTTCCTCTCTGTTGTGTGGGTCTGAGCAAAGAGAGGGAAT
-GGGATGCACCGTGCTTTCAGCTCTCTATAGTCTCTTCTGGATTTCAGTGTTTCAGCACAG
-CCCTAAAAACTACCACATGATTATGCCCCACGTAACAGTCAGATCACCTTGTCTCTAGAG
-AGACCACGCATCCATAACGAAGAACCTCTTATAACCATGGGTTCCACATCTTTACGGCTT
-AATCACTGATGCTCTCAGTGAACCTGAAAATTGATCCTGCTGAACAAGATCAATAAACAG
-AGTTTTGATTCAAAGGCAGCCCAATGAGTTAATAAGTGCTCCATGACAATGCCAAAGAGG
-ATTAAGGAAAGAATAGCAACCTGGAGGAAGATGTATAGAAAAGCAGAccaggtgcggtgg
-catgcgcctgtagtcccagctacccaggaggctgaggcaggtgaatcatttgaacctggg
-aggtggaagttacagtgagccgagatcacgccactgcactccagcctgggagacaaaacg
-agactctgtcaaaaacaacaacaaaaaaaaaCCAATATTAATAATGCAAATATTTGAGtt
-acagggcatttttaagagccagatacagtactgggaaccttgagtatattatctcattta
-gtccttaaaacaaccccatagactttatataaataatacaactgaaagtttaacttaagt
-tgctgaagttcacagataagcagtagaatcaggattggaacccatgtctcatcatatcag
-agaccctacgcttaagtgctatgctTCCTTGACTCTCACTGGCAACAGCTTTGGTGCATG
-TACCTAATGCCAGTTATATCATAAAGGATCTACATGGATAAGCTTATTTCATACTCTTAG
-AAATGGTTTGGAAGAggccaggcgtggcggctcacacctgtaatcccagcactttgggag
-gcctaggcaggcagatcacgaggtcaggagatcgagaccatcctggctaacatggtgaaa
-ccccatctctactaaaaatacaaaaaattagccaggcatggtggcatgcacctgtaatcc
-cagctactcaggaggctgaggcaggagaattgcttgaacctgagaagcagaggttgcagt
-gagccaagatcacgccactgcactccagcctgggtgacagagtgagacttcgtctcaaaa
-aaaaaaaaaaaaGTTTGGAAGAAGCTATAGAAGTCTCGATATTACTGGTGACCCAGTATA
-AGGAGGAGTGGTGAATATCCCTATTCTAAAGGATTTCCTAATCCTGAAGGATTTGGACAG
-CTCCTGCAATTGCCAAATGTAAGCGGCCTGAAAAGTTCACACTTAGATTATTGCCTTTAT
-TTTTGGCTCCCACACTGTAAAAGAAATTAGAATTAGAGCACAGATACAAAAGCTATGATA
-ATGAAAGTCCTAAAAAAAATTCCATTAAGAAACACACACATATAAGTCAGAAATTCATTG
-GGAATACCTTTGCATTTTAAGAGATGAGAAGGAAAGAGTTAACAGTAGTCCTGAAATCAA
-TTCTCTCCCTTTAACAGGAGATACTTCTGGCAGGAAAGAAAAAAAAAAAAAAAAAACTTG
-ACTCTGACTCTGTCAGATCTCCTTATAACATGCTAATAAGAGACCTTCTGGTAAATATGC
-TAATGATATTCACTAGCAGAGGGGTCTTTATGTAGCAGAATGCATCTGCTCAGTCCTCAA
-TTGCTTCTGGTAAACAAACTTAGAGTCTATGAATTTACAGGGCATGGCTCCTTGAAAAAT
-GTCATGTGTTTGTAATGCTAAGTAATTGCCAGAGAATAAAATGGAGATGTTTCTAGCTAA
-AATAGCCCCTTTGGGTAGCTGATGGGCACCCATGCATCACAGACATCACTTAGAGATCTT
-TCATGTTAAACCTATCCCATGGCTTATTTTCATGAGGCAAGAAAGGACCTGGGAAGTGGT
-GTGGACATCCCAGACTTTTGCATTTTTACCTGCTTCGTAATTACCCGTATCCTTGAAATT
-ATTACTAAAGCTTAATGCTGGGAAAGATCTCTGATTCCCCTGATTCTGATTTGGCAAGCC
-AATCAATCTTTTGTATTAATCAGGAAAGAAAGCCAATATTTCTATATGAATATACTCATC
-TCAAAACTTTTCAGAAAAGATATTTTCCATACATGGAAATAGCTTAATTAACtttttctg
-attatgaggttacttatagtcattttgaacactcagacaaaacagaaaactttatggaag
-ataaaataagaataacaaaatctttcccaaagagaaagaccattaaatttttgtatatat
-ccttccagagaatacacaaattatatgtatatatattttacatgtatacatatataacaa
-agactagcttatactacccacgctttcctgtcatttttcttttctacctaagatatcact
-gacagtcttttatataataaggatagtcctcaattatcatcattgtttaaatggaattct
-aatgtgttaagtgccataaattagcagattctctattgatagacatttagcttacttttc
-acattctcactatgagtaatgctAAGAAGGCAATATAGTTCTTGCACCTTCATGAACATA
-TTCTTTTATGCTATGTGCATTATTTTGGGTCAAAGGGCAAGCAGAGTTTCATTTAATTTT
-GTTTTAGACATGGGCTATATATTGACAAATTGCCCTCCCAGGAACAGTACACAGTTTTTC
-TTATGTTGCCTCACCCATGCCAGCAGTAGCTAGAAAATGCATTTCCAAAGACTGGTGCTA
-ATTTTCTGTGCATTCTGTGAGTGCTCAGTCAATTTAAGCAATAACCACTTAGAGTAACAA
-AATCTATTCACCCTAATAGCAGAGATTTCTACTTCATCCCTGGCTCACTGCCCAACTTTT
-GATCTCATCTAAGGCCAATAAATGTAGCTCCAGACAAGTGACACAGGTAGCTCTGTCCCC
-ATCCAATCTACCCAGCTACTTCTCTTAAGGCACGTTCTGATCCTTCAAGCATGAAGTTCT
-TGCCTCTGGCTTTTGTTTCTCTCTTGTTTCTGGCTTCAGTGACCTTGAGTACCCTGGAAT
-CTTCCATATTGAGAAAGAAATGATAGAGGGGAGGGGACATGGAAAAAAGAATTAAATATA
-TCTATTTTTAAAAAGAAAGAAAATTTTAGAATGGACATGTCTagaaggaggaggaaacag
-aggagggggacaggtataaaaactggacttctctgaatatactctgctttgaaggtttga
-ctttggaatcatctacatattttatctaatacaagaatatcgaaacttaaatggcaatcc
-caaaaatctaaaaggaatagaaatcaaattagcctctgtaataaatgggttgtataacca
-cacaaaggACTATTTGAAATGACTTTCAAAGAGTAATTTGAGAATACTTCCTTATTGGAA
-TATAACCTAAAAACAGAAGAATTGCAAACTGTTTTCAATGTTTTCAGTAATCATATTGAG
-ACTTTAATACATATATTGTGGGATAAAGGAAATGAATGTTGGTGTCACTGATAGAGATAA
-GAAATAAAAGTTCAGGTAAAAATTCTGTAAATCCTAAATTTGAATTGGAATTTTATATTT
-TATTTTTaaaatacctttttctacccccatccactgaaaagccctagaaatattggccaa
-cctagtagaaatgatttccctctcacccgggatattatctctaaatataatttaccaaag
-tcttattgaagaaattgctgtttctgagcttgaagcaactatacaaatgtacctggaaga
-ttttaccatactggaaaaaagcagcttgacaaagactactgaagtcatgtcaaaaaaaac
-aaagaagtcaacttgaaggggctttctcttggcaaagatgggaaaatgtgaaccttgata
-aaaaataattgcatgcattattcacagtaaccaagatatgtaatccacctaggtgtctat
-ggatggataaatatataaagaaaatgtgatatacacaatgaaatattattcagcctttaa
-aaagaaagaaatcctgccatttgtgacaacacagatgaacctggaggacattatgctaag
-tgaaataagccagacacaggcagacaaatactgaatgatctcacctatgtgtggaatctt
-aaaatgtcaaactcatggacacagagagtaggatggtggttaccaagggagttgagggaa
-atgaagaagtactagtcaaagggtacaaagtttccgttatgcagggtgaataagttcggg
-agcttactgcatagcacagtgactacagttaataatactgtgttgtatacttgaaatttg
-ctaagagtagatcttaaatattgttaccacagaaaaaaatggtgactatgagaggtgatg
-aatatgttaattagcttgatagtggtaatcatgtcacaatgtatatgtctatcaaaacat
-cacattgtacgtcttaaatatgtacaattattatttgtcaattatacctcaataaagctg
-gaaacataaaaataaaataactacaattaattgaaacatatcaaacatgtccaaaactga
-taaagaaaggtaaagaatttggcctggcacagcggctcacacctgcaatctcagcagttt
-gggatgccaaggcaggcggatcacctgaggtcaggagtttgagaccagcctggccaatat
-agcaaaaccccatctctactaaaaatacaaaaattagctaggcgtggtagcgggcatctg
-tagttccagctactactcaggaggctgagatagagaatcacttgaacccagaggtggagg
-ttgcagtgagccgagatcacgccactatactccagcctgggtgacaaagtgagactctgt
-ctcaaaaaaaaaaaaaaaagaaagaaagaaaagtgaagaatttatcctggcttttctgta
-aaaactgcacctcagaagaaccaaattattgataaggaattttgctctttagaaatattt
-ccagctaataaatgaaggaataatagcattgagacaaatcgccattttgtaatctcaggt
-gaatttacggatctaggcaatgatcattaatggctgagaaaatcacaacaaaaagaacaa
-ttagacatttgtgcctcctgatagaagtatacaatatcaccttcaaagctattttgccaa
-aaaagaaaaaaaaaatcaacccaaatctaatcaaggctcccactctaactcccaagctct
-aggatataccaaggacaaaggaagatcatgaaataccaccatggggattcaatcagcaaa
-ttcTGAAATGCAACATTATCCTTCACCCTGCTTGGCCTAAAAGTACAAAATAACACGAGG
-AAAAATTAGTTTCCAGAGCCTGTTATATTTTGAAAAATCATCAGAAAACTGAGAATCAAG
-GATAGAATTTCTAGAAAGTTCCTTCCCCTAAAGCTTTCACACTTGCCTCAGTGTATATAT
-GTGGCTATACCACTGACAGGCCGCCAGTCATTAAATTCAAGCTCCAAGAGACAAACTCTT
-GAAAAAAAGGCAGCCTAGGAGAAAGCAACATGATTTTTCACATATTTTAACTTGGTTTTT
-CTCATAAAATGGTTTCTGAATGTTTCTTAGCTTTCAATGGGCAATAAATAACTTTTAGGG
-AAATAGATGTGAGCCAATCTGAGGAAGTATTTGAGATGAAGAGAAGGCTTTGCTGTCTAT
-GAGGAGTGCATTAGAATAGAATCGCTCCAGGAAAAGGTCACCTGTGTTGATTGCCTTTAT
-GAGGTGACATTTAAATAAAAGTACTCGTTCAGTTTTCATTGAAAAACATTAAAAGACATC
-TCCAAAAATTTTTTTGGGAATGTGAGAAACTCTGCTGCACAAATGATCATGTTTTGTCAA
-ATAAGATGAAAAGAAAAAAAACACACACAAAAATgaaaaaacagatggaggggtaacata
-aattaagaaactcagaagacacatctacaaattacaatttatggatcatatttgaatgct
-gattctaaaaatttgaaaaaatatgcatttgagaaaatgaatgctgacttcatagtttat
-aatatgaagTCatattataaaatataataagaatgaaatattaataatttatCAGGTATG
-ATAATGGTTTTAAGGATGTGttttttgtttgtttgttttttgagacagagtctcattctg
-ttgcccaggctagactgcagtggcgcgatctcggctcactgcaacctctgcctcttgggt
-tcaagcgattctcatgcctcagcctctcgagtagctgggattacaggcatgcaccaccat
-acctggctgatttttgtatttttttattagtagagatgggcttttgccatgttggccagg
-ctggtctggaacttctggcctcagttgatccacctgcctcggcctcccaaagtgctagga
-ttataggcatgagccaccacgcccagccTAAGAATGTGTTTTTTaactgtatatatttaa
-ggtgtgcaacatgatgtgtgtatgtatatatatatatatatatatatatatatagagaga
-gagagagagagagagagagagaaataatttctgtggtcatgcaaattaacatatccatca
-tctcacagctacaatttttgtgtatgtgtggcaagagcacctaaaatctactcttagcaa
-aaatcctgaatacaatacgatattattaactattgtacattagacctctagacttgtttc
-tcttacatatctgcaactttgtgtcctttgacctacatttccccatttcctacccctcca
-ccacaccccagtaataaccactttattctctatctctgcattcaactttgttttttctag
-tttttaaactctgcatataagtgagatcatgcagaatttctctttctgtgtctggtttat
-ttcacttagtacaatgtcctccagattcactcacgttgccccatatggcagaatctcctt
-cttttttaaggctgaaaaatattccattgtatatataccatagtttctttgcccatttat
-ccttcaatgaatacttcagttgtttccacacctcggctattgtgaataatgctacaatga
-acgtaggagtacagatattttatgaggtgatgatttcacttcctctaggtatatacccag
-aggaggaattgctgggtcctatggtagtgctatttttaatttatttaggaaccttcatac
-tgttttccttaatggctccactaatctacattcccaccaaaagagtatacaggttccttA
-AGGGTGTATTTTTCAAAAGGGTCGCCGagagatacctattaaaatatatacaagagaaat
-cttataatatcagggatttgcttcaaaggaggggaaatccaagaaggggaaagtaaattg
-ggttatataagaaacaagattggccatgagttaatgttgaatttggatgatgaatacatg
-ggggctcattatattattgcttgacttttacacacatttaaattgttcAATAGTAtgtat
-tagtccattctcacactatataaagacatacctgaaattgggtactttataaaggaaaga
-ggtttaattgtctcacagttctgcagggctgtagaggcctcaggaaacttacaatcatgg
-tggaaggggaagcaaacacatccttcttcacatggtggcagcaagaaaaaatgcagcaca
-aaagggggaaaagccccttataaaaccatcagatcttgtgagaactcacacactatcacg
-agaacaggatggggaaaccactccgtgattcaattatctccacctggtccctcccacaaa
-acgtggggattatgggaactacaattcaagatgagatttcggtggtgacgcagcaaaatc
-atatcaAGTAATAAGCTGAAAATACCCTTTATATAAATAATGATAACACTGCATGGAAAT
-AAAGAAAAATCTTTAGGATGCAGCCTAACTGGTATTTACGATTTTTTAAACCCTGGATTA
-AACGCATCTTTTTATAAATGGAAATAATTAATGAAGAACTGAGATGGAATCAAAATAGCA
-AATCATGcacacacacacacacacacaAATTCTGTTTAGAGAACTAAAACAATATGTCAG
-AAACGTTGAAGAGTTCATGtgcatcagttagttcctgccatgtaacaaaccacaccaaaa
-tttagtagcttaaagcaaaatcatttatgtatgtcataattctatgagttacaaattgag
-gctgggctcagctgagaggttcttctcttcacttttgggctcatgcatgtgaggattaat
-gggagctggcaggtctagggtggactccactggaatagtctgtctctgttccaaaaggtt
-agctgaagcttgttttcctggcaacagagcagagttctgagagagcgtgagtatgcaagg
-cctcttgaggcccaagcctaggttcagaacaggaatcacttctgatatactctattggcc
-aaagttagtcccaagtccagatccagGCTTGCTCAAAACAGTGGCCCATCTCTCTGGCCC
-CAATCTCCATAGTTCTGGTAAACaaaaaaaaaagaaaaagaaaaagaaaaagaaagaaag
-gaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggaaggCTGAGATAACA
-TTGGGTTTTTCCAATGATAAAACCTAGAATTAATGAAGAGCTAAAATTAGTAAATTTTCA
-AAAATAcaaaacacataaaatgtaaaactgctgaaaagataagaagaaatgaataaatct
-ataattaagacggaaatctttaataggccataggcctcaggagtcctcaaagtaaacaaa
-aaatgcacaagcatgcttatcttaaaggattaaataggtatttttaaaatattgatttaa
-tacacatgtagaactattaagtaacaaaatagatacatacaattttaaagcatagctaaa
-aaatggctaaaaattgattattataatacatgtgtatttcaaatattccaaaagaagtca
-gtccactcatataaactaaccacaatataacaacattagaacttccaaaaaaggtatgtg
-tatatgaggtggggttttttcaaccttctaaataattgtgggttaaaaaaacataaaaac
-tacaagattttggaaatgaatcaaaatgagagttctacatataaaatcttcatgaaaatg
-gttaaagtggaaattagatgaaagatttaaaggcatttactagaaaacaagaaaTTTTAC
-ATTTTTAAATTAAAAGCTAATTAAACTCAAAGTTAAATTTAGTTAATTAAACTCAAAAAG
-CTAACAGACCTGAACTTGCTCAGCAGCCTTACCTAAGAATCATCTATTTTACCGATCTTT
-TCAAAGAAATGTTTTGTTTTTATTGATCAATGCCTCCatatttttgaaatttttatagtt
-ttcatttattatattgacaaatttttttaaattattaatGTGGCGCTGGCAATACACTTG
-TGAAGCATTTAGTTATTTATCCTTAAAATATATTAGTACTTggcggagtgcagtggctca
-cgcctgtaatcccagcactttgggaggctgaggtgggcaggtcacaaggtcaagagatgg
-agaccatcctggccaacatggcgaaaccccgcctctactaaaaatacaaaaaatagctgg
-gcgtggtagtacacacctataatcccagctactcaggaggctgaagcaggagaatcactt
-gaacctgggaggcggaggttgtagtgagccaagattgggccactgcactccagcctggat
-gacagagcaagaccctgtctcaaaaaaaaaaaaaaaTTAATCCATGTGCACAAAGAGGCA
-TAATCAGAAATAATCATTTCCAATTTTggctgggcgcagtggctcatgcctgtaatccca
-gcaatttgggaggctgaggcgggtgaatcacctgaggtcaggagttcgagaccagcctgg
-ccaacatggtgaaaccccgtctctacttaaaataccaaaactagcctggagtggtggtag
-gcacctgtaatcccagctactcggggggctaaggcaggagaattgcttgaacctgggagg
-tggaggttgcagtgagccgagatggtgctatcacactccagcctggggaacaagagtgag
-atgtcatctcaaaaaaaaaaaaaTCATTTTTATTTTGTTTTTAAAAAGAAAAAATGggcc
-gggcgcggtggctcatgcctgtaatcccagcactttgggaggccaaggcgggtggattac
-ctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccacgcctctactaaaa
-atacaaaaattagccagaagtagtggcacgtgtctgtaatcccagctactcaggaggctg
-aagcaggagaatcgcttgaacctgggaagcagagtttccagtgagccgagattatgccat
-tgcactccagcctgggtgacagagcaagactccatctcataaaaaaaaaaaaaggaaaaa
-TTGGAAAAATAAAGTACATGCAGTTTATTTGACAGAGGGATGTTTAACTGAACCACACTA
-CATCCATATATATGAAGTTATGCAGCAATAGAAAAGAATAATGGACATTTATATTTTTAG
-ATATAAAAAGAGCTGTTGAACCTATCATTGAAATTTTAAAAGGAAGCTGAAGAACAAGTA
-CAGTGTAATAAATTATTTGTTTTTtacaatttaattatagagtaaatgtgatctttcttg
-gtatatagttctatagattttaataaatatttggattcatgtaaccaccaccacaaatag
-gacacacaacagtttcatcaccctaagaaaagttcccggatgctcacccctctgtagcca
-aaccgtcaccccacccataatccctggcaaccactgatctattttccatcactataattt
-tgccttttccaagaatgtgacataaatggaatcatgtagtatttaacgttttgagaccag
-cttctctcagcatgtgatatggtatgtacctgtgtctccacctaaatctcacgttgaatt
-gtaatccccgatgttggaggtagagcctagtgagaggcgattggatcatggggacagatt
-tctcatgaatggttcggtatcatccccttggtactgtcctaaggatagtgagtgagttct
-gcagagacctggtttaagcgtggagcacctccccactctcttgctcctgctctggctatg
-ccatgtgcctgctcacccttaaccttccaccatgattgtaagtttcccgaagcctccccg
-gaagccaagcagatgccagcatcatgcttcctatatagcctgctgaacagtgagacaact
-aaacctcttttttttttagcaaatgacccagtcccaggtatatctctataacaatgtgag
-aacgacctagtaacagcatgtctttgagattcatccaagtttctaccagtatcaataact
-cattcctttttactgctgagtatgattgtattctatggatgtggtacatctgtttatcca
-ttcattcattgaagggcatttgggttgttttcagcttttggctatcacaaataaagtttc
-taagatggccaggcatgatggctcacgtctctaaccccaacactttgggaggctgagatg
-ggcgttgaggtcaagagtttgggaccagcctggccaacatggtgaaaccctgtctctact
-aaaaatacaaaaattagctaggtgtggtggcacacacctgtaatcccagctactcaggag
-gctgaggcaggagaatcacttgaacctgggaggtggaggttgcagtgagccaagattaca
-ccactgcactccagcctaggcaatagagagagactctgtctcaaaaacaaataaataaat
-aaataaagttgatatgagcagtttttacagatgtttgtgtgaccgtaagttttcgtttca
-ctagggtaaataccaggttcaggattgctaggtcctgaggtacgtgtatgtttacctttc
-aaataaactgacaaaccattttctagagtgactgcaatttccagttgttctgcaacctca
-ccagcaattggtgttgtcagaaactttttattttcataattcttatcaatgtgCACAATT
-GTTTTTAAAATTCACAGAATTAAAGGAAAATATATTGTGCACTATTTGTGTAATTaaagc
-aaaacacaaacacataaacggaagacaaaaataagaaactaattcaagaaactaaagaaa
-gaaaaacaaaaTTAACTTTTTAAAATTAGAATAAAGGCATATATATGTAATAGGGATAGT
-TTGAAACACTCCCAAACATCTGCTCTGAGCCAACAACAATCGGATAGCgtgagggcagat
-acaaattaaatatgagacttaactctccccgttaaaaataaggaaagagacttacccaac
-acccctcccccccgcccttctctttctctgtctctttgaaatgtatgtaaatctttttaa
-aatgtaaataggcctctagccagttttacaacccaggaatatctttgtcaaatacctagg
-agccatctctttgaaatgtaagcatccagaaaggtagtgctcctatctctgaatttatat
-gagtgggtaggtctctaactttggcaagttccttgcttcaagttgcaaagccacttcctg
-tcacaaggatgtgagaattttgtttttcctttggttaaagccaaccagcgaacacagatg
-gccactccaattatcaggtgaatctaggatgaactatgtgtatgtcaaatggtacttcta
-agttctcctatttgagaaccagttattgtttgtcttgagagcatatctgtaatgggtttt
-atcttcttcaggatataaacaagtaggatttctttctgtctttgcaaactctttgtgaat
-tgcctgtgatgtgtctcacattctggttcaatgcttattcaatggcaattgttttctttc
-tcttctacctttgtggagaggttttctaggttgagagaagattttgtttttaattatatt
-tcccccacaATAGCAAACACATCCCCAACcacatacacacacacacacacacacacacac
-acacacacacacaacaggtaattagacaggcctgagcagggcaggagagggctcttcccc
-cacccactacgaatgtcagtgatggttccaaaattatcacattgcctctctaaaagtgat
-aaattggGCAgcgcagtggctcatgcctgtaatcccagcactttgggaggctgaggtgga
-cagatcacttgaggtctggagttcaaaaccagcctggccaacatggtgaaaccccatctc
-tactaaaaatacaaaaaatagctgagcatggtagtggacacctgtaatcccagctactca
-ggaggctgaggcaggagaatcgcttgaacccagaaggttcaggtttcagcgagccaacat
-tgccccactgcactccagcctgggcaacagagtgagactccatctcaaaataaataaata
-aataaaataagtgagaacatatggtacttatctttctgtgtctgacttgcttcacttaag
-ataatggcctccagttatatccatgttgctgcaaaagacatgatttttgtggagggattg
-tattccattgtatatatagaccataatttctttatccaatcatctgttgatggacactca
-gttgattccatacctttgccatcatgaatcatgttgtaataaacatacaagtgcaggtat
-cttttgatgtgattatttcttttcctttgggtagatacctagtagtgggattgctggatc
-aaaAtggcaggtgcctgtaatcccagctactccagagactgaggcaggggaatcgcttga
-aactgggaggtggaggtttcagtgagccaagatcatcccactgcactccagcctgggtga
-cagagcaagactctgtctcaagaaaaaaaaaaaaaTgctgtgtgattacccttatatggg
-tttcctggatgagccatttgttaaattaatttttgttggaaatttccccgcagagctgtt
-gcacattgtggggggttaatccccagacactcccatgaggccccagtcacccaggggtgc
-ctttggctgggaggagcaagtgccctttctcctaggagctgaaaaactcagtctcttatt
-tatctatgaaaacaacagttcagtttctcacataaatgtgtacagataaaccgaatttag
-acagattttaggagaaaaagcaattgagaattccttttagaatgcatctcccaactagaa
-ttaggatccttaaacaaccacttcttaggagaaaaccagctcagaataaatcaaggacca
-tcaaccaaagggaggtctggggctcaggaggacttaccagttccaccagaggagaagctc
-gaagcttcaatgggcccctgctggcaccttagctctggttttgggcaactcctttagggt
-cctgagtcttccctgaggcctcacgtgtttgggcaccaaattattgttgacgaaaagagc
-caaactctgtaaaatattttaagagatttattctgagccaaatatgagtgaccatggccc
-gtgacacagccctcaggaagtcctgagaacatgtgcccaaggtggtcggggtgcagcttg
-gttttgtgtattttaggaaggcatgaaacatcaatcaaatacatttaagaaacacactgg
-ttacttggaagtccccgcggggctgggggcgggtatcaatggaaaggaatgttcaggtta
-acataaaggattgtggagaccaagttttattgtgaaaagaaatctctcagatagcagact
-tcagagagagagcagattgtaaaatgtttcttatcagacctaaaagggtgcctggctctt
-agttgattatctcctggatctggaaaggaaggggaaaaagggggtgggtgggtgtggggg
-tatagaatgtggatctttttccaccaaagattttgtaaggcaatttcaaagtatggcaag
-gcaatatattttgtgataaaacattgtgattttttttttttttttgtgagacagagtctc
-actaggtcccccaggctggagtgcagtggcgccatctcagctcactgcaaccttcgcctc
-ccgggttcacgccattcttctgcctcagcctcccgagtagctgggactacaggcgcccgc
-caccacgcccggctaactttttgtatttttactagagacagggttttactgtgttagcca
-ggatggtctcgatctcctgacctcatggtccgcccgcctcagcctcccaaagtgctggga
-ttacaggcgtgagccactgcacctggccaaaacattgtgattttcttccttgttatgcca
-gagtcagattgaaaagtaagtcacaatatacagggtcaaataaaacccatcttgtaagaa
-tttatggtttgtagggcataactccctagaccccttaggtaggaatttgggcaagataaa
-aaatcagagtttagtcctcaattccttaagataaatctctttctctatatatatctctct
-ctatctcatatctccatcctattctctggaaaactctgactaatgcaAGAAATTAAAGAG
-ACAAAACACATAATACAATATCTtaaacaacaaaatactattcagccataaaaaagaatg
-aaatcctgtcattcatggcaacatggatgagctagagcagtggtccccaacctttttggc
-accaggcactggtatagtggaagacaatttttccatggtcggaagggggtgggaggatgg
-ttttgggaagaaactgttccatctcagaccatcaggcagtagttagattctcataaggag
-tgtgcaacctggatcccttgcatgcgcagttcataatagggtttgtgcttccatgagaat
-ctaatgcttctgcacatctgacaggagatggagctccggggtaatgctcacctgccactc
-acctcttgctgtgctcccagttcctaacaggccatggtccccataccaatctatagccca
-ggggttggggacccctggcctagaggacattatgttaagtgaaataagtcaggcacagaa
-acataaatgctgcacattctcacttatatgtgggaactaaaaaagttgagcttacaggcc
-cggctcggtggctcacacctgtaatcccaacattttgagaggccaaggcgggtggatcac
-ctgaggccaggagtttgagaccagcctggccaacatggtgaaatcccatctctactaaaa
-atacaaaaattagccgggtgtggtggcgggtgcctgtaatcccagctgctcaggaggctg
-aggcaggagaatcgcttgaacctgggagacagagttgcagtgcaccaagattgcaccact
-gcactccagcctgggagacagggtgagactccatctcaaaaaaaaaaaaaaaagttgagc
-tttcagaagtagagagtaaaataatgtagcaggtagaagaggatacggagaggttggttt
-taacaaatacaaaatcacagctagataggaggaataagttctagggttccatagctctgt
-agggtgactgtagccaacaatcacttattgcatattttcaaatagctagaagagaggatt
-ttgaatgttctcgcacaaagaaatgagaaatgtttgaggtaccctgatttgatcattaca
-cattgtgtacacgtattgaaatatcactctgtatcccataaatatgtataattattatgt
-caattaaaaataaaattttaatttaaaaatacattttaaaaatCAATACAATATCTGACC
-TGACACTGCAATCTCAACTCAAGGAGGAAATGAAtgctgtaaaaggcattattaggtcaa
-ttggcaaattggaatacagatatatatatatatatatatatatatatggatagatgatag
-actagataaaagtggtgtccatttaaatttatggagttagtaactatactgtcatacagg
-agaatatccctattcttaggaaatacacactgaattatttgggagtaaaaggccacgata
-atataaggccatgaacatataacttatgctcaatagattcaaagaagaaaatatacaaat
-atagagagactaatatagATATATATATATCCATAGATAGAGAGAGGTGGGGCAAATGCT
-AAAGCAAGAAAGATAAAATGTCAACAATAGGCAAATCTCAGGGGAGCTGGGGAAAAGGTA
-TCGTACAATTTGTATTTTGCAGCCGGTATGttttaaattatttttaaatgaaaagatttt
-ttaatGGGTTGAGGAAATTGGAGTGACTTATATTTATGACATCCAATGGACTGTGCATGC
-TGTATGGAAACAAGGAGAAAATAAATGTCATCATTGCTTAACAAGTGAAGGGTAAAAAGA
-CAATTAACTCACTGAAGACTACGCACAGAAACACAAAAGCCTTTGCTTCTGTGGTTATAG
-GTTTACCAAAGGCACAAAGGGATTTGTATTTATTTTAGGATTATAATTTACATCACTTAG
-TTGGAAAAATTACAGATTTTAAGATATTTTTACAAATCTGAGTGACTGTAAAGACTGCTA
-AAGTCTTGGGACATATTCTTACCAAGTCCCAGATCttttgttttgttttgttttgtGCCT
-GAAATCAAACCAGGTTTTTTAGACCAGGAAAACGTGAGAAGCTAGAGCTGCTCTACTCAG
-TTGGCCCAAACCAGGACTCCGGAGATTATTCCCTTATACAGCAGGCACCACATTAGAGAA
-AGGATTCTGGAAAAGTGAGCTGGAACAGAAAAGAACTGTCTCAATGGGAAACAGACTCCA
-AAGGACGCTATTGGGGGGAGGAAAACACAAAATATTTCTTGAGAAGAATGTGGAAATGGC
-AAAGTCTCTAGCCTCCAGAAACCTTAAACTCTAGGGAAAGAAAGCAAAAATTTAGAGGTA
-AGAGTGTTCATATTAAAATTCAAACAATAAGTAGTTTTTCTATAAACTCTCTTTTTTTCT
-AATCATGAAAGTACACATAATCATTCTCTCCAAACTCAGACATTTtagacagatagatag
-atagatgacagatagatagatagatagatagatagatagatagatagatagataCacatg
-catacatactacatacatatatacctacataTGTTGGCACATAGATGTTCCTTTACCACA
-GATTAAGTTATTCTAGATGCATATCTTGTAGCCTACATTTTTATACATTTTcatcatttt
-aataactgcatactgctctattatattctgtattttctatattagattagatccatgttt
-tatcaccatttaggtagcttttggttttctgttactgtaatgttgagataaacgtcttta
-tgtacttgttcaattattcccattaaacaaaagcccaaggtacaaagtttctgagtaaaa
-aaataggcacattttaaggcttctgatatatattgccaaattgtgctacaaaagaaaaac
-tgtaccaattaacactcccagcaacaacgccaagagaatgctagtttccccacatctcac
-caacactgtctaGAACGCATAGTTTTAGAGATGAACGCTGGGAACCGACGCACTGTTTGC
-TCTACCTCTCCCCCTCCTAACAGTCTAGAACACAGGCGCTCAATAAATCAATCCAGGCTC
-CAGTCCAGTAGACATTCTGATCTAATCTGACTGCTCTGGGTAACAGAAAAGTCTCCCTTG
-GTTCACTGCCCAGTATCCTGGCATCATGTGGATCCTATAAAGGCAGTAGCTCCAAGCACA
-TTACAGAGGGACCCAACTCCATTAAACCACCACCAGCTCCCCAAGCCACCCCTTCAGCCA
-TGAAGTTCCTGCTCCTGGTCTTGGCAGCCCTCGGATTCCTGACCCAGGTGATCCCAGGTA
-AACTGGATAAATAGGAGGAAAGGAAAACTGGGAACGAGGAACACTAGCATATCTGGTTGC
-TCTGGTGATAGATGAGCCAGGTTGGGTGGAGGCAGGGCTCACCCCACTGAGTTCCAGTCT
-AAGGTAGAGATCTCCTAACAACCACCACTAGCCTTGATATCCCACACCCAAACACCACCC
-TATATAACCTTTACAAAAATTTGTTTTCTATTCTAAAATGATAGTCACCCTCAACCTAAA
-CCAAAATATCTTCTTTCACTTTATGTGAGCTCCTTATATCTAACCTCCTAAGACACACTG
-AAGGCTTCTGTCATCACCATGTGCATCCATTGAGATCAGCCCGGGTTGGAGCTCAAAGGA
-GATTTTGAGCCTAGAAGGAAGAGATTGAGGTTCCCATCCCTATGCTCAACAGACAGCTGG
-CAGGTGGGGGATGGAAGCAGACCTCTTAGAGGGCTAGTTCCCACAGGATGGTAAGCAATG
-GGTTCAGCTCAAACCCTGGGGCTAGGAGATAATGCAGGGTCagaaagagagagagacaga
-cacacagagagcagggagagagagagaTCAGAGGAGGGCCAGGCAACGGATGTGAAGAAA
-GCCAAAGAGGCTTGAGGGTGCTCCGAAGAGGCCCCTGCTGTGAGCCAATGGCAGACACAG
-AGCACTGAGGCAAACAGATTTCAGCAGATGGTGAAATGGTGCACAGCACTGGGTGAATGC
-AAAAATGCCCTGTCACTGGCAACCGTTATTTTCTTTTTAATGATTTTGGAGAAAGATTTG
-ACTCCTCCCACTTTGCCCCAGGTTGACTCATATTTACAGTTTTAGAGTCTATGAAAACAA
-GTAAGGTAGAAACACCTTAAAAGGGAGCCTGTGGGGTGAGTGAGACTAGCCCCATTTCTC
-CCTTTTGAGTATCCAAGCTCCTCCCTGACCGTGAAGACCAGGCTCCCCACCCCTGTTTTT
-ACCCATACATCCTATTCTGTAGTATCAAATTTAGCAAAAAGCTTCAAAGATGCAGATACT
-GGCAAAGAAGAAGAGCTCGTCAGACAGAGTTCCCCAAGGCCATCAATCCAGGAAGATTTT
-TGTCTCCTCATCACTGGCTTTCCCAAGTCTCATTTGCACAACATCCTAAGGATACACCTC
-AGAACAAAAAGCCAAACACTCCCATCTGGCGCTGACGCTTTAGTAGCCCTGTGCTGCTTC
-TAACCATGACTTCTCTGTCTTGTCCTCTCCCATACAGCCAGTGCAGGTGGGTCAAAATGT
-GTGAGTAACACCCCAGGATACTGCAGGACATGTTGCCACTGGGGGGAGACAGCATTGTTC
-ATGTGCAACGCTTCCAGAAAATGCTGCATCAGCTACTCCTTCCTGCCGAAGCCTGACCTA
-CCACAGCTCATCGGTAACCACTGGCAATCAAGGAGAAGAAACACACAAAGGAAAGACAAG
-AAGCAACAAACGACCGTAACATCATAATAACCACTGCTATCGCCTCCACCAACTCAGAGA
-AATATCATTTCCACAGTTCCAATTCCTCCTACATTGCTGAGTACTAGCCAAGGCTCCTCT
-TTATGGGGCAGATATCTATAGCCAACCCCAAAACTTCTGTCTTCTATCATTCTGTCATTC
-ATCTAGTAACTAATTTGGAGTTTGTATCTATCTTACGAGAACAATCATCATGCAGATTCG
-TCCACAGGGGATCtgtcagtttgggtcctccaaatgaaaaatgtcaagacagaattggac
-atgcaaaagattgactgggagaacacacctctgatggacaaaggtgagacagagcagcca
-caggcagggagagccttcagactgcaacgctggcctgatacgtgtcaaaggagagaggga
-tagaggaggattgaatagaaggagactaagactgcagctctaagaaagtctcagccaaac
-agatggggaggcccaaagcaaggcttgcccctcagaggagctcacgcagggcaggaatag
-ccaggttctcatatcccaggggttcagactttggctgagaacagcccctggagaacatgg
-ggtgactgctaccataggtctggaagtatgaggctgtccaccaactatccccttgaagca
-agttctcttgaaaggaaatctaaacagtgcacccccatggctgccacGGAGTATAAGGAG
-GGAGAGAAAGGAGCTGAAAGTCTAGGTTTGGCCAGCTAGGTAGACTGACTTGTGAGGTAT
-TTATTTATTCATTTGAGTAACAAAGCAGACAGAATACATAGCCACCATTGGTAGTACACC
-CCAAAAGCAAGGATGGCATGATGCTGGTGACTCAAACGTGCCTACTCATGGTGTCAAATT
-GGCATAATCCTCTTGGGAAGCTGTGTGGAAATAAGCACAGAGAAGCAGAACTCTAATTGC
-TTAATCCACTAAACATTACTTCTGGGAATTGGCTCATCATAAATTATCCAAGAGAAGCAC
-AAAGTTATGGGCACAAAGGTTTTCCATATAATATTATTTAAAATGCTGAGAAAATGAAAA
-AATCTAAATGGTGAAATATATACTAATGCCATCTATAAATACAAACAAATAGAATGTTTA
-TAGAATAATGGAACATAATAACATTATTCAAAATTGCATTTATGCTATAGTTGTCAAAAT
-TGTCTCCTTATATGATACAAAACTCATGAAAATTATGACTTTTTTGTTTGGTTGGAAAGC
-AGAATTATGCATAAATTTCCTCTTACAGTTCGATGCCCATTAGTTTTATATAACATTTAT
-TTGACACGTACTGACTTCTATCTGAGAAGAACAAACCAAAACACTCAGGCCTAAATAATT
-AAAAACGGTCCTAAAAACTAGCAAAccagataagaaaagatgttaatgcccattccctaa
-cttatgtcttagaccaaaattaattctagatggttttaaaatgacagtgtaaaagtaaag
-tattaaaagattgtgtggtcaaatattcaatttaagagcaaggaaattcttataaatata
-acaatagaggcagaactcatgtaagaataaattgattaggtggtattaaatattaagttc
-ttatgtatgtcaaaagatatcattttgaaattcatccatcttattgggtattgcaggagt
-tcattcctttttgtttataaatactcttccgtcatatgaatagtattcatttgtatactg
-gtttgttgatggacatttgggttgttcccagtttatggctattacaaataaagcttctat
-gaacatttatgtacaaatctttgtatggatgtatgctttcatttccctaaggtaaatacc
-taggagtagaacgtctgaatcatatggtaggtgaatgtttagcttttttgtttgtttgtt
-tgtttgtttgtttgtttgtttgttttttgagatagagtttcgctcttgttgcccgggctg
-gagtgcaatggtgcgatctcagctcactgcaacctccgcctcctgggttcaagcaattgt
-ccttcctcggcctcctgagtagctgggattacaggcacgcaccaccccccgaccccggct
-aatttttgtatttttagtagagacggggtttctccatgttggtcaggctggcctcgaact
-cctgacctcaggtgatccgcccgccttggcctcccaaaatgctgagattacaggcatgag
-aatgtttagcttttaaaggaaatacaaaattgttttccaaaatggttgtgccagtggatg
-tgcccatcagcaggatgtgaaagttccagccgttcctcatcctcaccagcatgtgatatg
-gtcagtcttttgcattttcatcattctaatagatgtgtagtggtatttcattatgctttc
-aatttgcatttttttaataactagttatcaaaaaagtatattctgtatgattctatttac
-ataaagttcttTAAATTCTTTTAAAATTGCATAcaattatttaaaatagaaagtaagaat
-ctaacgacagaaagcagatcactggttgtcaggggatgtgaaaggtgcatggagagggct
-gaaagaatgtaaagggacctgaggacactttgaggggtgatcagtcaagacacattcata
-ggccgggcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggtgga
-tcacgaggtcaggagatcaagaccatcctggctaacacggtgaaaccccgtctctactaa
-atatgcaaaaaattagccgggtgtggtggtgggcgcctgtattcctagctactcgggagg
-ctgaggcaggagaatggcgtgaacccaggaggtggagcttgcagtgagccaagatcgcgc
-cactgcactccagcctgggcgacagggcgagactgtctcaaaaaaaaaaaaaaaaaaaga
-tacattcataatcttgattgaggtaatggcttaatgggggtgtacataagtcaaaaaatt
-acaaaatggtaaactttaaatgtgttcagtttattgtatgtcaatttaaacttccaaaaa
-aGCtattattttaataaaataaataaatCTCACAGTGAAACAGAAATATTAAAGTATCAT
-AAATAGTTTAAAGACGTATGACAAACTGAGACATGTGATGAAGTATCGATACCAATAAAA
-TATAACAAGTTAACATGAAGcaacagggaaaacatgaaacccctagcagaaaatgaaaaa
-gtaacatgaactagctttttaactctataaacggcctgaaaaatgggaaaaaatctgtgt
-gactgtgatcaaataaatgcagattaaaactacaatgagatcttgttttttacctatcgg
-attgtcagagaattaacaaacccaagtctgacaaggcataaatagaaataagtctcatca
-tcagatgctccggtttataactaaatatgtccattctggaagacatttatctatacagct
-ttcaaaacccttaaaaatgttcatgttctgtggctcagagactctacttttagggatata
-ttctggggaaataattagagttcatatcaaaaagattaatgtatatacagcacaatcata
-gcagcatagtttaaagtagtgaagaggcagtggggtaagatggctgaacagaagcctcca
-ctgatcatcctccccactagaacaccaaatttgacaactatctacacaaaaaagcacctt
-cataagaataaaaaatgaggtgagtgatcacagtacctagctttaacttcatatcaccta
-aagaggcactgagaaggtaggaaagacagtcctgaattgctgacaccgcctctccccagt
-cctcaggcagcagctgtgtggtgtgcagagacaatatgtgtacttgcaggagggagagca
-cagtgattgtgggatttcacattggaactcagtgctgctagcaccaggcagaacccagca
-ggtgcctaaaagggatcatttagaccatccctagccagggggacatcacccatcccagag
-gtcggaactccagtttccgcaagcctcaccaccgtgggctaaagagctctggggtcctaa
-ataaacttgaaaggccgtataggccacaagaactgcaattcctaggcaactgctagtgct
-gtgctgggctcagaggcagtagatttagggaccactcaacctagtgagacaccagctggg
-gtgtgtgtgtgtgtgtgtgtgtgtgcgtgtgtgtgtgtgtgtgtgattctcgtgcctcag
-cctcccaagtagctggtgatggcagtggcagcccatctggagtggacgctgccatcaagc
-cagctgcagcagggagggacagctggggctgcacattccacagagctgcagagctgggga
-caatgagagccccacaccttccaagctggtgcagcaggagctccccaggtgcaactgcag
-ccactcaagtcacggctgtgaaccccggcctccctgtgttcttgtgggtgctgggagcag
-gcaggggtcctgcacttttgggtgcagctgcaggcgcccaaaccatggctgcggaaccag
-acatctctacactcttgagggtcagggaagtccccactgccctcacaagcttagaagtgc
-ctgctcccacagcctggcgcctccctgctgtcggtgcccgctctaatcttggagcaaagt
-tgaggccaagcccaggtgctgtcatagcctgttgggtgtgcacacgcttggggcagtgct
-gacataccagccccctgccgcctcggacccctacagacctcgggtgctgacgagcatagg
-aggaaagccgaggtggggctgagggcagctcggcacctacagcctgggtgccatgaatgg
-cagtaggagTCTTCTCAGTTCTGTCTCCCTCCCTTCAGTGTGGATGAAGGGGTAGAAATG
-AGGTACAGCATCCTGTCTTTCCCAGGGGTCGTGTTGCATCCTTTAATAGTTTACCACTGA
-CAGCACTACCAACGATTTGGGGATTGTGTCTCGAGGAAGCAATTGACCTAAATTTCATGT
-ATCAATGAAACTGTTTTTCCTTATGGttttaattatttatttattttataaaataaaata
-aataGGCTTTTAATATATAATGAAAGCCTTTTAATGTTAACATGCAAGGACTGAAAGAAT
-ACCTGTTGGACTGCAAGATGGCTGCTCCCTCTACCCTCAGCTTCAACTGGCCTGTCAGCC
-AAGCTTTGATTTCCTAGGCAGAATATAAAAGAATTCCTCTCTGTGGTGGTCCAGGAGACC
-AAGGGAATTTGGGGAGGTGATAGAACTGCACCCTGATCATGCTGGTGGTGAAAACTCGTG
-CAACCGTACACCCAAATGTCATCTTTTTTACTGTATGTTAATTTTAGAAATCAGAAAGTA
-AAAGATGCAATCACAAAAATATCATTTGGTAGGACAAACTTATTCAGTATATGAAGATAA
-TAGAGAACTTTTATACAAAAGTGGCTCTTACaaaatattaatataaaatattaaaatata
-aattCTCAAGAGCTATAACTTAAACTTCTATGTTAATTTAGGTAAGCAATTCTCCTATGA
-AAAGACTTAACGAATTCTTTCCTTTTCTTTTCCTCTTGTCTTTTCATTTTGCTGCAAGGA
-GCAGCCTTAAAGCTGACTGAAACAGTTATTGTGACCAGCATGTAATGCTTGAAAAGATGA
-AAATCCAGCTTTAAATATGCTCAATCTCAATAACttttttggtttttttttttttttttt
-tttttgagacggagtcttgccttgtcacccaggctggagtgcaatggcacgatctcggtt
-cactgcaactttcgactcccagattcaaatgattctcctgcctcagcctcttgagtagct
-gggattacaggcaccggccaccatgcccagctattgtttgtatttttagtagagatgggg
-tttcaccatgttggcaaggctggtctcgaactcctgacctcattatctgccgccttggcc
-tcccaaagtactgggattacaggtgtgagccaccgcgcctggccTCAATAACTTTTTAAT
-AGGTATATGCTTAGTTTATTCATGTTTCTTTGCTAGTTTTTTTTCCCTGCAAAGAAGAAG
-AAGAAAAATAATTTTAAATCTTATTTGAAGGATGATTGTACACTGTGTTATTGGCCTTGG
-AAAGGAGAGAAGGAGGAAAAGGAGTAGGAAAAGGGAAAATATCTTAAGAGGTTGTACTGT
-TAATCTACTTCCAGGCAGATTTTAACCACTAAAGCTAAAATGCTATTATGAAATTGAATA
-TTTCAATTGAATATTGAAAATGGTATAATGATgccgggtacggtggctcatgcctgtaat
-ggtagcactttgggaggccaaggtgggtgcatcacttgaggtcaggagttcgagactagc
-ctggccaacatggtgaaactctacctctactaaaaataccaaaaaaatagccggaaattg
-cttgaacctgagaggcagaggttgcaatgagctgagatcatgccactgcacttcagcctg
-ggcaagagagcaagactccatcttaaataaataaataaataaatgaaAATGGTATAGtgg
-cttgaagatgcaggggcccatgaggaagaacatggatggcccctagaagctgaaagcagc
-ccccaggtggcagccagcaaggaagtggggtcttcaattctacacgtgcaaggaactgaa
-ttctatcaacaacctgaatgagcttggaagctgattcttccccagaagccgcagataaga
-gctcagccTGCTAGGGGCTTGAGAAAGGGGAAAGTGACTTTAAAAATGTAACTCGAGGGA
-GTTCCAAAAGGCTAAGCGATTCGGTGAATCTAATAAACATGTTAAAATGCATAAAGTTCG
-GGTGTGGGGGAAAGGGAAGGGAGAGCATTAGGACAAATAGgttcttttctgagttctggc
-caggaggcttcttgatcagttcaaattgttacaaagttcagctggaggtttccttctccc
-tgtggccgctctgggcctctggcagccctcctcaaggagcaatccgtttccttcagaggg
-tctgtgggttctcctggcttccctaatgcgttcctgcagtccttctgaagcaaaacttaa
-tgatgcgagcctccacacgctgctctgaccgtccgagtgggagctgcaatctagtcctgc
-ctcccgtctgtcatgatcccTGGTGGTTTTTGACTACagctcaattgttttagattccat
-gtgtaagtgagaacatgaagtatttgtctttctgtgtttgactcatttcacctagcagaa
-tgtGTaataaacattaacaaaatgaatgtgtaaaatcaggtagtgatcacagctacaaag
-aaaataaaacagagtgatagatggaaagtgatggggaggaagaacctggttagaaatggt
-ggtcaggcaggacctctctaagaagggaaaagagctgtgactgcacgataagccggccac
-gtgaagaccttgaggacaacatgcaaagctgatgacccaccggccctgcaaagaccgggc
-gggagataagcttggctggcgcgaagaaagaaggctggagggagtagaaatggggacagg
-agctgaacgctgggagagggggctcaaagCCAGCTCGCGTAGGCAGGGACTGGGCACTCG
-CAATGCGCGCAGAACAAAGGCCTCTCTCTCTCTTTCGCCACACTAAGGGCCAACATGGTC
-ATCTCCAGGTGCGGATTCTGCCGTAAAATGCGCCCCTGGCGACTCACGACCAGGACGCAT
-TCCGCACCGCTCCCCCACGCCCCGCAGCCCGCCCTCGAGGCTGATTGATTTGTGCCAGTC
-TCTACCGCCATCTGCCGGCAGCACTCGGTACACCCGCGCCCTGGAGGTCGCACGCGCTGG
-CCAAACGGGCGCACCAGACACTTTTcagggccctgccaaagacctcccaatgtctactgg
-cgtcccagacacaagagatccaggccaagactcacacttcacaagatacacagacacggg
-ccttagggaacaggaaattccatgaaacttccatttacccaattagccggactcactgag
-ccccagaatagggttttcaaccaactcctactaaaattAAAAAGTAATGTGTGGtataga
-ttggaataatagacattggaggctacaaacgatgggaggcggagaggggtgagggttgaa
-aaattacctattgggtgcaacattcactatccgggtaatggggcactagaagcccactcc
-accactatgcaatatatgtatttgtaccccgtaaatctataaaaataaaaaCTACATTAA
-AAATAATAATAATGTCTGGTCATCTAAATAGTACCTCTACAGCTTATTAAGTGCTCTGGA
-GACGTCCCAGTTGCCTGTCCTTCCCATTAAAGGTGATATCCAGTGCTGATTTCCCCTTCA
-ACCTCGGGTTCCCATAAACCTCTTCTTTCTCACTCCTGCTGCCCTCCGGTACTCCAATAA
-AGAATGATAGATGggccgggagcagtggctcacgcctgtaatcccagcactttgggaggc
-caaggcggatggatcacctgaggtcaggagttggagaccagcctggtcaacatggtgaaa
-ccccgtttctactaaaatacaaaaattagctgggcatggtggcgggcctcagtaatccca
-gctactcaggaggctgaggcaggagaatcgcttgaacccgggggcagaagttgcagtgag
-cagagattgtgccactgcactccaacctgggcgacagagcaagactccgtctcaaaaaag
-aaaaaaagaaaagaaaCAGTCCCAGTATGCATCCATGTGCATGTGCATGCAGGTGTATCT
-GCCTGTGAGAGCTGCGCACGCGGCTCTGAGTACCTGGGAAGACACCCATGTACAGATGCT
-GTACATGTGCGGGGTCACTCTCTGGCGCATTCGGAGGCATGAGGGCTACGTGCAATGCGA
-GGGAACCTATGTCCAGGCTTCCTTTCTTGGTTTTCCTCCTCTGAACTCATGCATCCCTTC
-ACAAACagtccagctcctggctaaaaacctatgtgtgatttttcagcccaaacacaggca
-atgacaggttttacctggcaggcctcacagctgagtcgtgcacagctgatgcgttgcagt
-ctttaaagacagttgcagacacagactcaggcctcctggacagtcgacctctcacacaca
-tctccgctcccaacccaagtcttcattcagacacgtcttcattgcagtggggtaggcctt
-cggccaggacctccttatcttggggagtggagaatccttgaagacactttcctccatgct
-gactcagaagttttcccactctcccttccccaccccatccctggcccccaggtccgtaca
-acttcaggagcctttttgttggaagcttttctgcagtgagaccaaccccacacctgtgct
-catccacccgaccccagttggcatcattctatgaggaaattagaacaggtggatctgtgt
-tctacaaaataaaacaaaccaggttctctggtttagcctctttcttgtactgtaataata
-agagatttggggcttggctattacttgctttgactttttttgttttgagacagggtttcg
-ctctgtcacccaggctggagtgcagtggtgcgatctcggctcactgcaacctccgcctcc
-tgggctcaagcaatcctcccacctcagtctccctagtagctaggactacaggtgcacacc
-atcatgcccagctaatttttatattttttatagagatggggtttcaccatgttgtccagt
-ctggtctcaaattcctgagatcaagcaacccactggcctcagcctcccaaagtgtgagga
-ttacaggcctgagccaccatgccgggccatcattaatcagctactccagcacttagcagt
-tcagctctctcctgctcagctgagctcctgaTTGTACAGTGGTTAAGAGCAAActgcctc
-tgccacttagtaacctggtgacttgaaaaatcactttgccttttcatcctttggtttctt
-catctgtaaaatgaaaataacaataaacaatacctacttcacagggtggttgttgtgagg
-gtgtagtgagttgatgtatgtaaagcATAACGTAGGTTCCATTGAAGTGTTTGCTATTGT
-GTTCAACAGGGTCCATTTCTGCTTGGAGATCCACATGGCTCTGGGGAGTACCTGTTGGCT
-CAGCCTAGGTCACGTGTTCCACCTTAACCatcccttccctgctccaaggtagagcccgtg
-acctgaactaaaccagcaggcacgctccacctccaacaccggctcaaggtgggcgtgtaa
-tataagctggttcaattagaatgaatcttttttttttttttttaaagacggagtctcatc
-ccccatcacccagactggagagcagtggcacaatctcagctcactgcaacctctgcctcc
-caggttcaagcaattatcctgcttcagcctcctgagtagctgggattacaggtgcctgct
-gccacgcccagctcatttttgtatttttagtagacacagggtgttgccatgttggccagg
-atggtctcgaactcctgacctcaagtgatccacccacctcggcctcccaaagtgctagga
-ttacaggcgtgaaccactgtgcccagcccaattacagtgaatcttaatacactggctgaa
-aattctgggacacagccagtctctctctttccaacaggacatgtacaaggacctgtacaa
-ccctgggagatgctggcatattggggccacaagcagtgctgacctgaagaaaagggcaac
-acctcagaaaacaaagtagataaatagaaaccaagtccttggtgccatcacttgatttct
-ggacaaagcctcacctaagctatttattgacctgagcccttcatagtttaggccaatGTG
-ATTTGGTTGTTTTGTTACCTGTAACCAAGTATCTTAACACAAAGTGGATCTGTGAGTGAC
-CAGAGCCTCTTGGGGGTTGTAGCAATCTAGTAgttggcccagaaaggccaactctgagat
-ggagtgtagggtgcagaatgttgagtaatgagtgctcttggaatcaacaactgaggaaga
-cagaaatatgcaggattgggcacagggagaagttcagctgcagtgcaggcccaagggtag
-ttgcagctgagccttcaggaagttctggagccagagtagcccttctgagttgttccaagC
-ACTGAAGGCCTAGCAAGTTCCAGGGGTATTAAAATCAATAAGCCTGTCAGCCCCGACAAT
-GCCCTCAATAGGTCTGGGCACAGATTGGAGAGAAGCTGGGCTCCCACTGCACCAGGAGGG
-AGTGGCCCAGAGCCACTGAGCCATGGAGACTCAGGCAGGGGGTTGCTCCAGCACTTCTTC
-TGGAGAAGTTTTGAGCCCCAGATGCAGTTAGCACAGTTGCCCGCCCCTTATCATAAGACG
-AAGTCCGTTCCCACCACATCTTCTGCAAGACCTAGCTGGGGACCCCGAGACACTGGCAAA
-AAAGCAAATGTAAATCCAGCTTTATTGGTAAAAAAGGAATAGCAGATTTAATCAGAAATT
-CCCACCTGGCCCAGCAGCACCAACCAGAAAGAAGGGAAGAAGAGAGGAAAAAACCACAgg
-aagaaagaaaggagggagggagggagaggaggaaggaaggaggagggaagggaagggggg
-aagaagggagggagggagggagggaaagaaagagggaggaagggCAGAGGGAGCAGGGAG
-ACTGTAGATCAGGGTCTGAATGGAGATCCGGTCCTGGAAGTAAATGATCCAAGGCTCCAG
-GTGCTGGGAAGAGAGCAGGAGGGGAGGGCGGCCCATGGCACTGCCATCTAGAAGGGTAGT
-GGCTCTTCCACAGGAATGTTGAGGATGACATCCATGTCTGGGGTGCACCTGGTGGGAGGC
-AGCACAGAAGGCCATGAGAGACCAGAGGTGGCGGTGTGGGAGCACCCACTCAGAGGAGCC
-CTGCTCTTTAGAACTCTGGTACGTACTTGGGTTGGGGGGCAATCCCAAAATACAATCTGT
-GATCTATCTGTGACCTCAAAGCCCAACTGTGcatacacaagcatacacacacacacacac
-acacacacacacacacacacatacacacacaTCAAAAATGGAAAAGAAATGAGTTTGGCA
-GGACAAATGTTCCCCTGACAAGTCTGAGGTCAAGAGGGAGCAGGAACTCAGCTCTGAAAT
-GCTGAGGGCCCTCAAGATgatcactggctttggagtgaggatgacaggtttgataacttt
-gacctgtgtcaccttgagcaagctatttctactctcccagcctcactccttcagttgGCA
-CTTAAGTGAAAAGCACTCATTAAGTCCCAGACCCCAAGtgagcctcagtttcctcatctg
-tcaaatgggtttaatattctaacctcagtcattggtggaaagattaaatgagaccatgcc
-agcaggtaataagtgctcagtaaatgacaggcaTTATTATTTCCATGAAAGTAGCAAGAG
-AGATGGATTCCCATCAGCAATATATTCCCCATTGCAGGGACCAGCACAAATATTTAAGAG
-GCTGAAGGATTACATTCTGTTTCACTCTCTTTTCTCTCTTCCAAGGAGACCATCCTCTCT
-CATGGTTTCAATAATCTGCTGATACACATGAAGTATTTAGGCAGGAAATGTCAGGATACT
-TGCAATTTACAAATACTATTAAAAAAATGAACatgaaaccaacatagaaaaaaaaaaaat
-ttctaaatctagatgggcaaaactggctattcattatatcattctctcttctttatattt
-gaaatttttcataataatagtaaaaaaaaaaaGTTcatctctatgctggcaacacctaaa
-tttctacttccagccaatatctgtcctctgaggtctacactcatcttgtcaattgcccac
-ccaatgactccaccttggcacctcatataaatcaaacttactgtccaagtcaactgtatg
-gtttttgttttgttttgttttgtttgagacatggtctcactcggtcacccaggctggaat
-gcagtggtgcaatcacagctcactgcagcctggaactcctcaatcgatcctcctgcctcc
-caaatagctgggaccacaggcacgtgccaccacatctggctaattttttaattttttgta
-gagatggaggtctcactatgttgtccccctggtctcgaactcccagcctcaagcgatcct
-tcttcctcatcctcctaaagcactgggattacaggtgtgagccaccatgcctgcctccaa
-ataaactttttgactgtgcctacatacacatccctcaccccgccccagccttcccaatct
-ctgcatttgacatcaccaccaccccattataaaagtcaggaacccaggggttattcttga
-tacctccctttcctgtacttcccaagtcatgcaagtccttcttactttcctaaatatttc
-tccaatctatctatttctcccatttcttctgccacactcttggccaggccacttcccatg
-ttcccctggacaactgccctcacacccactagaattccagctgccattctggctccttgc
-caatctcatccccatgctcttttcttttcttttaagaaagagtcttgctctattaagcag
-gctggaaggcagtagcaccatcttggctcactacaacctctgtctctagggctcaagcaa
-tcctcctgccttagccttcactgcagctgggactacaggcgcacgccaccacgcctggct
-aacttttgtattttttgtagagatggggtttcaccatgttgcccaagctggtcttgaact
-cctgggctcaagcaatcctcccaccttggcctcccaaaacgctgagattacaggcatgag
-ccaccacacccagcccaccatgctcttttcaaactgacttttttggaatacaaatctgat
-catgtggcttaagatcctttgcttctgggatcaggcagaacatctgggcctacagggcac
-tgcatggaggtccctaggggctgagttgccctgctcccttcccgccactctccctgtcac
-tctgcattccaaccactctggcctcactcagctccgtgtcaatgccaagttccttccaac
-catagctccttcacaGCTCAAGGCTCAACATGTGGTtggttcatagagcagtaacataag
-catcaccgggtagcttcttagaaatgcagaatcAggctgggcatggtggttcacacctgt
-aatcccagcactttgggaggccaaggcaggcagatcacttgaggtcaggagtttgagacc
-agcctggccaacatggcaaaaccccgtttctactaaaaaacataaaaattagccaggcat
-ggtggtgcacacctgtaatcccagctactcgggaggctgagacaagagaatcacttgaac
-ccaggaggcggaggttgcagtgagctgagatggtgccagtgcactccagcctgggagaca
-gagctagactctgtctcaagaagaaggaaggaagaaaggaaggaagggagggagggaggg
-agggagggagggagggaggggaaagaaagaaagaaggaagaaagaaaaagaaagaaaaga
-gaaagacagagagagaaagaaagaaagaaaaagaaaagagagaaaggaaggaatgaagga
-aggaaagaaagaaaagaaaagaaaaaagaaatgtagattcatgagccccactgagaccta
-ctgacttggaatctgctttttaacgcgatctccaggtgtttcctgggcatgttccagttg
-gagaggcTCTGCTTAACAGTGTGCCATTTCTACTTTTTAGGAGGGAAAATGTGCTTCCTT
-GCTCCTGGTGTTCCCTTCCACGTGGAAGGGCATCCATGAGTGTATTGCTCCTGGCCTCTC
-TCTGCCCCCTTAAATTCTGCTTTTGGAAAGGGGGTATGACCACCAGAATGGTGAGTGTGA
-GGAGAGGAAGGGGACACAGGGAGCCCAGTCCCTTTCTCTCTCAGCAGCAAGAAACCCGAA
-AGGACTCCACTCTTCTCTGCCCCAAGGCCTGGCTCCACGTGGGTCCAGCTCCACCATGAT
-CGGGTGGTTCAATTTGCCTAATTCTGGGTTCACTATTCAGAGGCCAACACAGTCTCTAAA
-ATCAGCTTTACCAGAATAAAGGTGATAACCTGGCCCACATGCACCTTACCCCTTTCAGTC
-TCATTCACTGTGTTCAGAGTTCAGGTAAAGACAAGTGACTATTTATTACGTCCCCCGGAG
-ACCCTGGCAccaccgcctagaattgctcttccttcagctcccccatcagtctctttcacc
-tagtgaatttctatgcatccttcaagcctcagttcaaatgtcacatcctcaggaaaacct
-tccttgactgcccagacTTGCTGTCCTAACAGTTGCtttcttttttcttttttttttaat
-taaaaaaaaatttttttttagatggagtctcgctctgtcacccagactggaatgcagtgg
-cacaatctcggctgaccgcaacctccgccttccaggttcaagcaattctctgcctcagcc
-tcccgagtagctgggattacaggcacccgccaccatgcccagctagtttttgtattttta
-gtagagacagggtttcatcatcttggccaggctggtcttgaactcctgacctcgtgatcc
-accggccttggcctcccaaattgctgggattacaggcgtgagccactgcacccagctCCT
-AAGAGTCACTTTTGCAGTGGCATGTACTCTACTCAGCAGCTCTGGGCTCTGCTGCAACTC
-CACATTTATTTGTGGCTCATTATCGACTCATGTCCAGTTCCCTCTTTAGTTCCATGAGGG
-CGGGACCAAGGACTGTTCTCATTCACATGGTGCCTGGCATTCAGAGGCACTTCATAAATC
-CAATAGTATTTTGTTTTGGGGGCGGGGGGCGGTTTagaaatagaagaaaaggaagaaatg
-gcgataggagaggagaaggaaggaaaacgacaggagggagagacagatgaagaagaaaaa
-TTAAAGAATTTGCAAATGCTAGGCTCTGCCACACATGGTCCTGTGGTGTCATCAAGGAGA
-GGTAAGCCTGGGGGACCCCCAACCCAACCGCAGAGGGCTTGCCCCAAGGAAGGGCAGGCA
-AAGAATTGGTTTCTGGGGCCCAGAAACCTGCCAAGTGAACAGGACAGACTTCTCTCCTTG
-TAGAGTGTCTTCCAGGCTATTCTTCCCTGAAGCCAACCACCCCACTCAACTCTGCCTTCC
-TCAAAAACCCAGAAGTGGAAGGCTGTACCCACTTGGTTGACAcatgggatctgggaacta
-gaagggcccttagagattacaccacccagcctgctgtgtacagatgggaattggaggcct
-ttgcagagatgggaaaggtcacatctgcccctggtcagtggcagatccaaggtggaaacc
-caggaccgcccctccctccctgtacagggttctgccatccacACCAGGCTGCCTTCCCCA
-AGAACAGAGAGCCTCCGTGAGCTCAGAGTGTGACTGGTTTAAGAGGCAGTGGCAAAAAGA
-TCACATACTTGGGTCTCCGAAGCAGAACATCCTCAAATATGACCTCTCGGGGTTCCCGGG
-TCTGGGCTTGGAGCTCTTCCACCTCGGCCCTTAATACAGGCATGTTCTCCTCAAACTGGT
-CAATAATCTGAGAGGAAAGGCACAGCAGGGGAGAAGGGAGAGGCAAATGGCCCCCAACCA
-AAGGGAGAAAGGCCAAAATGAACGAGGAGCAAAGCTATCTGGGGAAATGGTATGGGTTCT
-GTCACTGGGACTTGCTGGACTCCAGGGAGGGGACTTCCCCATGCAAGGTGCGGCTGGCTT
-CCAAGTTAGTGACAATATTCAGTGGTGCTGAAACAGGTGAGGGATCATGGAGAATGGAGA
-CAGGTTACAAAGTGGCGGGGAATGCTCAATCATGGGAATGAATGGAGGCTGGCAGAGATA
-GTGAAGGGCATACACATTAAAAACCAGTGAAGAGGCAAGATAATGAAAATTAATTCAAGA
-AGGCAGTGATGGTGAAGTTCATTAACACTGATAATGGGTGGTGGGCAGTAACAAGAATCA
-AGGGGTAAAGATGCACGGTGGTTAATGGCTGAATAGGTGATGTTTGGTGATGGTTGTAAA
-TGGGTCATTAGCCAGCATTGCTGGCTAATGAGGCAAGGCCTAGGTCAGTGCCAATCGCCT
-TCCCAGATGAAAGACAAGTGACAGTAATGGCACCGGCAAGGAGGGAGGCCAACACCAGAG
-TCAGAGACCTCCTGAGCGCCAGATCAGGAGAAGCCTGACTCATTCCCACAGGCCGTGGGG
-ACTGCCCATCCACTGCTTCCCTACAGGGACCACCACCTTCCTTGCCCACGCACTTCTCTG
-AACCTTTGCATGCATTTCAGGAAGTCCTGGCTTTCCCACATCTTCTGTAGGAGAGCCTCT
-TCATAGGGACGCTGGGTTTCCTGTGGAGGAAGAAGAGGTCTGGCCCCCAGGTGCCTCTTC
-CTGGGCAGCAGAACATGGTAGAGACCGATGGGGCTGCAGTGGGCCTGGAGGCAGAGGATG
-GGGAAGAGGGCGGGGTGGGGGTGAGACCTGGATCCCCGCTCCCACACAGCAACTGGCTAC
-TCACCGCCACCACAGAACTCAGAATTTTTTTCTTCTTCTTCTGAATCTTGTCAGACAAGG
-ATTCCAGGACCTTTCTGCGCATCTCACCGAGGTCATCCAGCTCATCCTGGGAGCCAGCAG
-AAGGGTGTTGGTCACCAGTCCTGCCTCCCACACAGTCTGGTGGGAGAGGGGCAGGGGCTC
-CCCTACCTGCTGGCTGTCCTTAACCTGCTGCAGCTGGCGCATAAGAGTGGAGATCTGGAC
-AGACTTGATGGAATACTCATGGTCCATGTAAGTGCTCAGGAAGTTCACTTCCTCCTGGGT
-CTTCTCAATCTTGGCATTCAGCTGCTCTGCCTGCTGCTCAAGATCTGGGGAGGGGTTAGG
-GAGGTCAGCAGGGACAGGAGGCAAGACCTTCCCTCAAGCACCTGGGCCCCAGGAGGCCCA
-GGAGGCAAGGTCTCCTTGGCCAGTAACTGGGGTCTGGGCTGAGGTGAGCTCACACAGGGC
-TGGGAGGTGGTTAAAAGTTAAGGCTCTAGACGGTTTTCCACCCCTGCAGGAGAAGAGGCA
-ATgctgggtaggaaaaaggaagggaattggtgcatgatccctagactagtccccactctg
-ccactgacttgccgggtggctctcgccaagactgtccctctccagacttcagtctcctca
-GAGACACACTCAAGGAAGTGAGACCAGGCAGATGGGGTGACAGTGGCTCCCAAGACACAA
-CCCATGGCAGGATTAAGACAAAGTCTATCCTGTCTTCCTCCAGAGAGACCCCCAATGTCT
-GGGGTTGACTGATCCACCACCCCTCTGCTCAGCAGGTGTGTAGTCTGCTCAGGGAAAAGG
-AACCACAGGCCAGGCAGGAtggaagccaggagacccaggttctagcccagccactgactc
-ccagaaggaccttggCAGGAAACAgagccaggctaggattggattctggctcctagctat
-ataaccttccacaagctactgcacctctcttagcctcggtttcctcatctgtaaaatggg
-aggacagcttccctgcctccaagtagttgcaatgactgagtgtgtgcctgtaaCAATGCA
-GACATTGGTAGAGACCCAGATACGGGGCCTGGAAAGAGCTAAGTGTTGGGTAACTATGCT
-ATTCGCTCTGTATCTTAGCATTCCCATCTGCCAAGAAGAGAGCCAATGGGGCTGAGGGTT
-TCTGAATGGCAAGTACAAGGTGAATGCTCTGCTGCTGACCTCCCCAAGGTGCCAGGGGGG
-AGGGTCAAGGAATTTGCCAGGGATTCTTACAGCTCATCTTGCATTTCTTCTTTTCTTCCC
-ACTCCTGAAGCTCAGATTTCAATTGCTGCAGCCTCTTCTTGTTTGAGTACTCCAAGATGT
-CGATGATGGTCTGCGGGAGGGGTGGAGTCAACTCACCCACAGGCTCTGCTGGCTCTCAGA
-GGCGGCCACCCAGCACTTCCTCAGAGGAGTCCCCAGTCCCAACCTCACTCCCAGAAACCT
-GACCAGAGGCTaatcgggacagtaacagtgtccacccatagggttgttgtaaggactata
-taaagacatacagatcgcttGCTATTACACGTAGAGGTGTTTGCAAATGCTGTTGGTGGT
-AGCAGCGACCTCTGTCGCACCGGTACAGTATGTGCCCGGTGAACCCCCTCTGGGACGGGT
-GCTATGGTGCCGCATTTCACAGAGCTCGGGGAGGCAAAGTTAACTAAAAGTCTCCCGGCC
-AGTGAGTGCTGGCGCGCTGGGATGAAACCCATCTCGGTCCTCTTGCAAAGCCCAGGTGAG
-GGGAGTGAAGGGTGAAGAAATGCGTCTTCCAGGTGGAGGAAGCACCACGTGCAGTGGGCG
-GGGAAAGGCAGGAGAGGGCGCGCGAGTGCGcggagggagggcgggacggagggagggagg
-gcgggacggagggagggagggagggacggagggcgggacggcgggagggcgggacggagg
-gacggagggagggcgggacggagggcgggagggcgggacggagggagggagggagggagg
-gacggagggcgggacggagggacggagggagggagggagggacggaggttgggacggagg
-gacggagggCGGGCGGATGCCGCGGGTCTCACCGCCAGGGTGTCCTGCTGCTGCAGCAGG
-GCCCGCACGTGCAGGGTCGTGCTGTTCTCCATCTCCTGGATGGTCTCGATCAGCTCCCGG
-TTGAGCTTGCTGAGGAAGTTCTCACGGCTTCGGAGCTCTCGCAGAGCGGCCCTCCCGCTC
-CTGAGCGAGGTCTGCGGGCGGAGGGAAGAGCAGAGAGGCGGCGCTGCGCCCTGCCCGGCC
-TGAGCCCCCGAAAGCCCGTGGAcccgccgccccggccccgccagacgcccgcccccgTGC
-GGCCTCCTGCTGGTAAACGCGGCCCAAGCTGGGCGGTTCCCCATTGTCTGCGCCGCCCGG
-GAGCTCCGGGACtctcatccgttcggaaacgcacgtgtacccatcatctcacatccctga
-ggtgcgggtgcatctacagttggtggcgtgtcaccaactaatcaacaaatatattattag
-tgggtaaataaagatgtgccttcatatcaatggcttctcagaatcaatgaaatatagAAA
-TAATAGTAAGggccgggcggggtggctcacgtctataatcccagcactttgggaggccaa
-ggtgggccgatcacgaggtcaagagttcgagaccagcctgaccaacatggtgaaaccccg
-tctccactaaaaatacaaaaattagccgagcgtggtggcgcgtgcctgtaatgccagcta
-ctggggaggctgaggcaggagaatcgcttgaacctgggaggcggaggttgcagtgagcga
-gatggcgccactgctctccagcctgggcgacagaggaagattccTGTCCCaataataata
-ataataataaACGCCCCAGGTAGGTTAAGAAGGTGGCAGAGCGACCGCCATGTCTGGAGG
-AGAAGCAGGGGAGGCAAAATGGATGATAAACGTCAGCATTTCCGGGCAGGCCGCGGAGTC
-AATGAGTACTCTCATTTCACACAACAGCCCCCAGTGGAACAAGgagggtctgagggttaa
-gtgactcgcctaaggttacacccagcaggtgcataaaaccTACAGTAACAACAACAACAA
-CAATTGTACTTCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAATAACA
-ACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTAACAAT
-AACAACAACAATTGTACTCCCCTAAGGTTACACCCAGCAGGTGCATAAAACCTACAGTaa
-caataacaacaacaattgctgagggccctctacatgccaggccaggtgctgtgccttgct
-ctgcaggtggcacatggtatctgttcaccctccaacagctttatgtttactaactctatt
-ttgctgataaatggaggctcagagagtttaatgacttgcccagtgtcacacagtcaagaa
-gtggcagggctggaactggaaagccagacttctgaatcccaatgtctgtctttccgttat
-gctaAAACAAGAACTGAGTAGCCTTAAAACTGCAAGGCATGGCTGAACCAcgtagtgact
-aagacttggatgttgaacctagacacaccttggttcaaatcccagctcagccacttacca
-tctaagagaatctgggcaagttagttaatgtctcagagcctccttatactcattctaaag
-gtaaggaaactagtatctgttttagagaactgccgtaaaatataaatgagATTggacagg
-tgcggtgactcacgcctgtaatcccaacactttgcgaggcccagatgggaggatcactca
-aggccaggagttcaagaccagcctgggcaacatagtgagacctcatttctacaaaaagta
-aacaaaattcgctgggtgtggtggtgtacacctacagtcctagctactcaggagtctgag
-gtgggaggaatgtttgagcccagaagatcgaggctgcagtaagtcaagattatgccacca
-cactccagcccgggtaacacagcaagaacttgtctctaaaagtaaataaataaataaata
-aataCAATTTTaaaaaattaaaatgttcgctgggcatggtggtgtgcacctatagtccta
-gctacttgggaggctgaggcaggaggatctcttgagcccaggagtttacggctgcagtga
-gctatgattatgccatttcactttagcctgggtgacagagcaagaccctgtctttaaaTT
-CACAATCAAGCCACTTAGTGAGAGTGCACTCATGTGCACTCAGTGAACAATAGCTGATAC
-TACTGTCTCTGGCTCTAACCCTCTACCCCTGCCATAAATATTTGCTCTTTCATTTGTTCC
-TGTACTTCCTCATTTCTCCGTCCTTTACTAAAAACGACCCCTTCCTAGCCCTCAGCTCCT
-TTATTTCTCATATaacagtaatcatgctgatgtgctgagtgcttgccatgtggctgatac
-tgtactaagcacttcatgcgcactgcagcacatcaccctcacagcaagactaagagatgg
-gcactattattaggccaactttataaaagtggacagcagtcgggcacagtggttcacacc
-tgtaatcccagcactttggaagagcaaggtggaaggactacttgagcccaggagttagag
-ccctgggcaacaaagggagatcccatctctacgaaaattagctgggcatgatagtgcatg
-tctatagtcccaactactccgagaggctgaggtgggaggatcacctgggctcggaaggtc
-caggctgcagtgagccatgatcatgccactgcgctccagcctggatgacacagcgagacc
-ctgtctcaatcagtcaatgtggacagcaaggattaaattcagtaacttattcaaggtcac
-acatagcagagctgTCATCCTTGAAGTCTTGCCTCCTAGCCACTCCACTACCTTGTCTCC
-ACATCTCCAGACCAAAATACCCAGAAGTATCTTGTGAAAAATGTTATTCTCCAAGTCCTG
-GGCCCACTGAAACAGCAGCACTAGggtttcagttcaaatgtcacccaccttagcagcctc
-tcgttagcacctaaacaattactgccacactctcctccgtgcctccagccccctaacctt
-attcttaggcttctctttagctcttatcatcatttcaaatatctttctcttgttgattgt
-cagtctcccccatccaatagaatggaagtcccctaagatcagaggtcacattactggtga
-accctcatactcagaatagaacctggcacatggtaggtgctcaatcaatatttgttgatt
-cattaaatgaatGAAAGATTGCAAGAGACAGTATTAAGAACTGGACtggttaggagcaca
-agttttagagccaaattgtccacgttcAGCTTCTACATCAATCAAAAACACCTAAACCCC
-TCTAAAGTTAGGATAAAAATAACAGAAATggctggaagcggtggctcacacctataatcc
-cagcactttgggaggccaaggcgggcagatcacctaaggtcaggagttggagaccagcct
-ggccaatatggtgaaaccccatctctactaacaatacaaaaaattagctgggcgtggtgg
-tgggcgcctgtaatcccaggtactcaggaggctgaggcaggagactcactcaaacctggg
-aggtggaggttgcagtgacctgagatcttgccactgcactccagcctgggtgacggagtg
-aaactctgtctcaaaaaaaaaTTTTTTTAAAAACTAAGAGAAATATGAGTTCCTCCTTTA
-AGAATACTGGGCTACCTCTAAACCATTTTGCAAGATAAAAGGTTAAAGGGGAAAAAAAGG
-TTTCAAAGCAAATTATATTTTCCCTTGTTCTTTATATAGTAGTCATTGTTCATTGAGCTA
-TTAAAAATTTTCTTGAAGAATTATTCTATAGTATTTTGTAGTCTTTATAATACTTAGTAT
-TTTACTTTCTGCTATGTATGCTAAGGACTTGTCTTCCTTTAGGCATTTCAAATACTTTGA
-GACATTGTTCAGATAATTACAGAAGCCATAAAACAATGTATAGCGAGGAAATTAATTACC
-TACAATTGTAGCGATTGATGTGAAAATTTTCATTGTCAGTTTCTAAGGCTTGCTTCAAAG
-TACACTGTAAGAAAATTTAATTTACTGGAAttttttttttttgagatgaagtctcactct
-gtctcccaggctggagtgcagtggcaccatctcagctcactgcaacctctgcctcccagg
-ttcaagccggtctcctgcctcagcctcccgagtagctgggactacaggtgcgtgctacca
-cacccagctaatttttgtagtttgagtagaaacggggtttcaccacgttggccaggctgg
-tctcgaactcctgacgtcaaatgatccacccacctagacctcccaaagtgctgggattat
-aggcatgagccaccacacccggccAAGTTGCTGCAAATTTTAAGATAAATAAGCCACTAG
-ATCGTGTTCCTAATGCAACAAAATAACAAGCAATTCTGATTATTTCTTGAGTCTTAAACA
-GAACAGCAAACGCTTTGTTTAActggctttgacccctgatcctgccatttcctggctgtg
-tgacctggtgcatgtcatttatctccctgcgcctcagtttcccggtttgtaaaataggaa
-caaggataagcgtgctcacacagttcctgtgaggaagaaatgagtcaagtctggcaccca
-caaagttctcagcacatgtttgctacaGCCATCATCCCCGTCCCTGTCCTGGGCCCAGTG
-TCCAGGGAAGATGTGCCTCATACCTTCATTAACCAGATTTTGGCATGCATCTTCCCAGGG
-TCCAACTTCCGCCTTCTATGTAGTTCTCTTGGATTCTTCGGCTGGCAGCTTGTCACCACC
-GTAGTGGGCTTGAAGTGAAACACTAGGGGTAGACAGGAAAGGACAGGGAGAGAGTGAGGG
-TCCCGGAAGGCCTGAGGCCAGGTTCCCGGGAGTGCACCATTAATGAGAGGAGGGCCAGAC
-CCCAGCTCCACCCTCTGACTGCCTTATAATGTGACACTAGACCGAGGGTGAAATTCACAC
-CCTTCACTAAGCTCCCAGGACAGACTCTGGGCCTCAATATGAGGGAGGGACAAGCCCAGG
-TGAAAGCAGTAACTATGGACATGGACAGAGGGGAGGGCAGGGCAGCCAGGAACCCCGCTC
-TCAAATGTCCAGTCAGAAAGAGAGTCGGGAACTCCCACTCCTTGTGTCTTTCCAGTAGCT
-ACTgcagcacaggacagcagaaagaccagagtctggcaggcctgaatccaaatccctgct
-gtcccaccaacctggctgGCAGAAGGCCTGatggggtaggggttaagagcaagaactaat
-gagccagacagtccaagtttaaatccaggctctTggccaggcatggcggctcacgcctgt
-aatctcaacactttgggaggccaaggcgggcggatcacctgtggtcaacagttcaagatc
-agcctggccaacatggtgaaaccctgtctctattaaaaatacaaaaaatgagatggacat
-gatgatgggcgcctgtaatcccagctacttgggaggctgaggcaagagaatcgtttgaac
-tcgggaggcggaggttgcagtggtgcgagatcccgccactgcactccagcctgggtgaca
-gagactctatctcaaaaaatatatataatcataaaaataaatttttaaaaattccaggtt
-ctgccttctactagctgcgtgaccttgagcaagtcaaatgacctctgtgtccctccattc
-gtccacctataaaatgggaataatcatcacgcccacctcatagagtcttcctgaagatga
-aagaagttactataccttaaaggtgtttggaatagtgcctgatgcatattcagtgctgga
-tacacattaccagttgttactCTTACTTCTAGTGACCTGAGAAGTGGGACCACAACACCA
-GACGAAGGCACAGCAGCCACGCAAAACTCCAACTGGCTGTCTCTGAAACACTCTAAGGGC
-TGTGGTTCTGCCAGATAAGAGTACAGGCATTTGGGGGGCATATTCTCAGAATCCCTGTTT
-CCTCTCTGCCTGTCGTGCAATGACATGGGACAAATCGCCCAGGTGGATCCAGCTGTACTC
-TCAGTCCTCACCAAAATCCCTGCTTCAGGTACAACCCAGCTCATCTGGGAGAGATACTAA
-TCTCTTTAATAGATCAATGTCCTTCATCCTGAGAAATGCTGGCATTAACTATGGAGATGA
-TTAAGTAAATTAATTTTGTGTTTAATTTATAAATTACCTGTATATATCCGGTTTTTAGTT
-GTATTGTATAAGAGATAGAATGATTAATAGGTTAATCTTGTGATTCTAATTTTAAAAGTG
-TAAGTGGGATTTTGATTTAGATTTAAGTTGAAAGGTTTAATACACTCTTATTAGCTCCgt
-tgcccaggctggtgttcaatggcgagatctcggctcactgctacttctgcctcccagatt
-caagcaattctcctgcctcagcctcctgaatagctgggataacaggtgcccgccaccaca
-cccagctaattttttaatttttagtagagatgcggttttgccatgttggccaggctggtc
-ctgacctcaggggatccacctgcctcagcctcccaaagtgctgggattacaggtgtgagc
-caccgcgcccggccAGATTACCCATATTTAGAAGTTTAAGTATTAGATATACAAGAATTA
-TGTAAATACCCAATGGTTTTTGTTAATCAGACAAGTGAACCATTTGAAAATGAAAATGAA
-TACGTTAAAATTTAAGATGTGGCTTAAAAGGTTTAGGAGAATTTAATTAACCAAGTTCCA
-AAACCCCCTTACAAGTGTTTATAAAAATTGTAAGATTCTTAAGTTGAATTTAAATGCTTA
-AGGAAGATTTGCAGTTTTAATAATGAGGATTTATTTTCATTATTGGTAGTAGCCCTAATT
-TATCtttttttaaattaaatcttttattacaagatagttcagattcacaagcagttttaa
-gaaataatacggagGggctggccgtggtggctcacgcctgtaatcccagcactttgggag
-gctgaggcatgtggatcacctgaggttaggagttcaagatcagcctggcgaacatggtga
-aaccccatctctactaaaaatacaaaatttagccaggtgtggtggtgcacgcctgtaatc
-ccagctacttgggaggctgaggcaggggaatcgcttgaacccgggagttggaggttacag
-tgagctgagatcacaccactgtactccagcctgggtaagagagacagagagagagagaga
-ctctgtctgaaaaaaaggaaaggaaaggagaggagaggagaggggaggggaagggagggg
-agaggaAAAGGAAAAGAAAAAGAAAAAGAaaaagaaaggaaagaaaaggaaacagaggta
-gtctatgtaccctttacccagtttctcccagtggcaacatcctgcaaaagtacggtacaa
-tatcacaaccaggatattgacattaagatgagcaagatataggactttcccataaccaca
-aggatcctgcctgtcgccttctacaaccacacccacttccctccccttaccaccctcctc
-acaactctgtccctaacccctgcaatcactaatctgctctccatttctataattttgtga
-tccccagaaggttatataaatggaatcatccagtatgtaactgtggggattggctttttt
-ttacttggcataattctctggagattcatccaagttgttgaatatatcaatagttctttc
-ctgtttatcgctgtatagttttccacggtggggatacaccataggttgtttaaacattca
-cccactgagggacttcaaggttgtttccagttttgaggaattatgaacgaggctgctatg
-aacattcacatactggcttttgtgtgaatataagttttcatttctctggaataaatgccc
-aagagtaaaactgctgggtcggattactaggaagtgcatgtttcatgttgttagaaatgg
-ccacacttgtttccagagaggctgcatcattttaccttcccaccagcaattgcgcacaat
-ctgacgtctcctctttgctagcatttggtgttatcactatttttttattttagccatttc
-gataggtgtgcagtgatatctcactgtggcttaatttgcattgccccaatggctaatgat
-gttgaacatctttttaatgtgcttatctgacatctgtatatctgctttggtgaaatgtct
-cttcatgtctttttcccattgcctaactgaattgtctgtttcactgttgagtttttactg
-ttactgatatattctacatagtagtcctttgtcagatacatggtttgcaaatattttctc
-caagtctatagcttgtcttttcatcctcctaaaaaggtctttcataaggccaggtgcagt
-ggctctcacctataatcccagcactttgggaggctgaggcgggcagattacttgaggtca
-caagttcgagaccagcctgtctctactaaaaatacaaaaattagccaggcatggtggcac
-acgccttcagtcccagctactcgggaggctaaggcaggagaatcgcttgaacccgggaga
-cagagtttgcagtgagctgagatcgcaccactgcaccctggcctgagcaacaaagcgaga
-ctccttctcaaaaaaaaaaaaaaaaaaaaaagtctttcacagaacaaaatttttaatttt
-gatgcagtccaattcatctatttttcttttatgggtcaagcttttggtgtgatacctaag
-aactcttcacttggccctaggccccaaagatttttctctcctgttttcttctaaaagttt
-ttcagtttcacattttacatttaatttctattttattttatctttgagctaatttttata
-ttcgttgttaaatcatttctttctttttctttttctttttttttttttttttttttttgc
-ctatgggtgtccaattgctccagcgccacccatggaaaaggctttcttcctccactgaat
-tgtttttccactttctgaaaaacccattgggaatattggtatggatttattccCTTTTCC
-TCACTGGGAAGTGTTGGCAGTGTCCAGCAGGTAGCTGATCCTTCATTCCCTGCTTGGTGG
-TGCTGATTccccaactgggatagtgctggcagggatgagtggggaggtcatcttctaacc
-cccacctggcagaagacagtgctctgactctctctctagggtagtgtcaacagagtctag
-cagtgacaagatttcatgaagtgtcatgaggtgggactcatcacctctgggcttcactcc
-cctcccccagcctacctatgtcagtagagcctggtgggagcctgagcctctatccccacc
-cagcatcagtgaggtAAAATAAGGTAGTGAGATGCAGGGCAACTTGGCATTCTACTCTCC
-CATCTCCTTTCTGTGTTTCAGTGTTGCCCACAGGGGAGCTGATCTAACATTACTTACTCA
-GAGGCAATGAGGTGGTATGAGTGATTTTATACATAGAtgtatacataagtatgctagatt
-gtctatgaagttcatttcaggataccaaagaaatattacaaaatatttgttattaattct
-cacaacaatcctaggtggtattagtgtccccatttcacaaatgagaaaaccaaggctcag
-agagatgaatgatttttccaagtgagtaaatggcagagccaaaatctgaccccatgtctg
-cctgagcctgacccaaggccTCGGAACTCCCCTGTAAAGCATGATAATGAtgtggcagag
-tttattctacgatttcaccaaaccttgttttcttttcctcctggaaaaacagatggacta
-catttcccaccttcccttgtggttagcagaggtcatgtggctaaattatggcccctgaaa
-catgagtaggagtaacatttgtcacttcaaatctggaccccccccaaaaaaaatgcccac
-ataattgtccatgttcttgttctctctcttccctctatgccagctggatgcaaaagtatc
-cagcagaagacttcaagaccttacaaaatatcagacccacaaggtcaaaggaacctggat
-ccctgaatgaccatgtggaacagaatccctccttcctcagatccacaaatgtactgtggc
-ataaatgagatataaacttctatatcaatacttgcaatttgggcattgtttattacatca
-gttagcctaccctaaTATAAGTGGTGTCACCAAGAGCCAAAAGCAGCCACTCTATCCTGT
-CTCCAACCCCCACACCAGCTCCCAGGTGCCTCCGCCCACCTGGTTGGACCCTAGTCAAAG
-TCTTCATTTTGCTTGTATGAAGGCTGTTGGCTTGTTGGACTGGAGGCAGAGTAGATGGCT
-TGGTTTCCTGCTTGGACTGCTGCCATGGAACATAATCCTACAAAATATACAATCagtcac
-atagcaccatgagtttatatcccagctctacccttttcagatatctgtgaccccaagcaa
-gtgacttgacctctcctgagcctcaatcttctcatctgtaaagtggatctaataataaaa
-cctacttctgtggattggcgcaagaattctgagagatatttatgaagcatgtggtaagtg
-ctccataaatgttagctatcactTTTTTAAATCAGCCAGCCAGAATTTACTAAGCACATC
-CAGGCTGTGAGGTGCTAAGAACTGTGAGAAACAGAAGGCATGGAAAAGACGCAGACATCC
-ACCCTCAGGAAACCAGAGCAGCAATCAGATGAATAAGAGAGCAGCATAATATACCCTTAC
-ATTCTGATAAGACAGTGagaggagaaaaatgaggttctgaggcttgctctgggtcccaca
-gcaaagtgtgacccggctgggactggaattcgggtctccagcctATATCCGCGGAGCAGT
-CACGACCGTGAGAGTGGAGAGCAGGTGGACTGCAGGGCCAGCGAGCCTCCCACCCCAGCC
-CTAGTCCCCCAAGACTCACCGGAACCTGGAACTCCTGGACTATGGAGTGAGTCCCAGAGT
-GCTTGGGTCTGGAAAGAGTTGGGAAGGGAAAGAACTTCCATTATCCCCAGCCCAAGGGGC
-AGCAAGCAGCAATTCGAAACAGGATTGGAGTCTCGAACCAGAAACTGCAGTTTACCGGGG
-ACAATAGCCCCGCGGGAGTGGGGCGGGGCCAAGGAGATGTGGGCGGGGAGAGGACGGGGG
-TCAGAAGACCGAGGGCGACCTCGAGGCGAGGGCGGGACAGCGGCGGGGTGTGAAGTACGC
-ATGCGTATTCCGCCTTTCTTCCAAtttttttttttttttttttttACCTACTTTTGTAAG
-ACATGCGCCATTGGGGAAAATGGAAGAGAAGTTGCGAGTCTGTGAGACCCTGATCTTCTG
-GTATAACTACTCGGCTTTTCCAACTTCCTTGTCTCAGTGTAGATCGCGCGGTAACCCAGG
-CCACTCAGAAGTCCCGAGACCCGATGCTTTCGCCAGCGTCTCGGTCTCCAAGGAAACGCG
-ACGCCGCCTACCGAGCGCCTAAAGGGACTAACCTCTCAAGGCAAAATCTAGTTCGGCCCG
-CTTTTCAATTTTCAAAttcccttcagtttgctctgcccataatcctaaaatatgatatca
-tatttctccactctcatcaaacttccaccatttccttcgccatcttcactcttggctaat
-gagtttgcttccaattttactaagaaaattgtgggaatcagtaaacccacaagttcatgg
-catcatttactcgcctacttgcctccctcccgtaactacgtataaactgcctactaagac
-caattcctacatttatgcaccgaatcctatcctctcacgttttctcaaagatattggccg
-agcagttctccccgttttttcctcctcttttctctctcctttgtatcatcagtataccaa
-cgtatttttaaatttcttctatttaaaaagattgtccacagccggacacggtggctcatg
-catataagcatgagagcactttgggaggccagaggtgggaagatcgcttgagccagaaag
-gtccagtctgcagtgagccacgatccagccactgcattccagcctggttgacagagcaag
-accctatctctaaataaataaacaaaccacttcccctccagccagctcccatttctgctt
-cattttaaagcaaaactcctagagaggtttgcctactctgtttcccatttttttccctcc
-tctcaatcaggctttcactccccactgaaactgccctcgtcaacatcattggtgacctcc
-actttgctaaaccccatggtcacttctaggtcctccctttatttggcctgtctgcagcat
-ttgacacaacagatcactccctcccctgaaacactttcttaacttagtatccaggaaacc
-actcttgagttgcttcctgcctccttttcagtctcctttgctggttcctcctcttctccc
-tttatcattgtagtatcccaggactcagtcccagccccctcccttccagtctcatggttt
-tgaataccatccgtacccagatgcctctcagactcacgtctccatcctccccctgaattc
-cagccatgtacatccaactgcctgcttgggccccttataagcaactctaatgtgcaatat
-ttttccagaaacatttttcccgaacttaaaatagggcatctctcttcttggaatcatcct
-taactcatctcttatcccacatccatcagcagatcctgttgcaataacttcaacgtatat
-ctggaataggaccacACATACACACACACACACCCCTCTTTCCTTTTGTACCCCAACTAA
-AGTACTAGTTCCCACCCTTGCCCTACACCAATTCTCTCTCTACACACCAGATTTGCTAGA
-TAGAGCACGGATTTAAAAGAGAATTCCAGTTTAAAAGATAATTGGGCGGGAGCAATAATT
-TTAAATCACTTAAACTTCAATAGGGGAACATTGCTATAGAATACCATGTCAGAGCTCCCA
-ACCTTTTCTGCCTCTTAAAAATCACAGGAGAATGTGTTTAAATGCACTGTGGTAAATAGA
-AGCAGCTGCTAGGATAAAAAGCAATTAGCCCAGGTACTCTGGCTATTCAGGCCCCTCCTG
-GCTGACCCTAGAGCTGAGGGAATCACTGTGTTGGGTACCCTCATTTGCAGAGCACACCAT
-ATGACAGCACTCTTGCTGGGCAACTCTGTACCAGGAAACCATTAAAAAGTAAAAGATAAA
-ggccgggcacggtggctcacgcctgtaatctcagcactttgggaggccgaggcagatgga
-tcacctgaggtcagaagttcgagaccagcctggccaacatgatgaaaccccatctctact
-aaaaatacaaaataggattagccaggcgtggtggcgggtgcctgtaatcccagctacttg
-ggaggctgaggcaggagaattacttgaagcagggaggctgatgttgcagtgagccaagat
-cacgccactgcactccaacctggacaacaataatgaaactccatctcaaaaaaaaaaaaa
-agtaaaaGATAGGAATACAtgacagatccaggtagtgacttactcaacagccattcctcc
-ccatcatcgcaactattggatcctgatcttgtccatgtatgcacttgccttaatggaggc
-aggccccaggtccagccctagtcctagtcccagctccaatagtcatgactgtctgaggct
-ggacttggtgagccaatttccctttccagttagaggtctagtcatagatacatgatgaaa
-gtctggctaagaagacaggatgagaaatctactcaaaggcttttgggaaaggttttcatc
-acacttttaaaaaaaggcattgcagaaaaacattccttcatctgctggtagacattgtca
-tatctgtgtgggattcctggaatcgcggaactgtgaggggagttggccaaagaggatata
-cagtgaatggtagagaggaaaatgtaaaaaccttcttccttgatagcactgttgagccat
-taaattaaccaaccctagcctggcacaatagtatgtgcctgtaataccagctacttggga
-agctgacgcaggagcatcgcttgaggccaggcatttgagatcagtctgggcaacatagtg
-agaccacatctcagaaaaaaaaaattttgttttaattagccagatgtgatgatgtgcacc
-tgtagtctcagctacttgggaggctgtggtgggaggattgcttgagcccatgagtttgag
-actgcagtgagctatgattgtgccactgcacgccagtctgggcaacagagtaagattctg
-tctctaaaagaaattaattaattaaattaacctttcacctatctagaaaatacttgagat
-taaataagaaatcacattactgggtgagcaaatttgagttgagttttctggtacttgcag
-accaaaagcattttactgaACCCTACGTCtggaggaacaacaagatagaaggaacctggg
-tgggtccctgacaaccttgcaggagaaagtcacctacctgtccttactgcctgccaaatt
-ccgagctgcttcatcaaagagaaataaacctccaccttgtctgagaccctgtatttgaga
-gtccctttgttacagtagcttaacctgtaccttgattaatacaAAGAAGAGCTTGGCCAC
-TGTCAGACAGCCTTCCTCATCAGACATGCTGACCCAGCATGGACACCCACTGAGAGCTGC
-CTGTGCCCCACATCTCAGGTACTTAACCAGTAATATTACTGCCTCCCACTTCAAtttttt
-tttgtttttgagacagagtttcgctcttgttgcccagactggagtgcaatggcatgatct
-tggctcaccacaacctctgcctcccgggttcaagtgattctcctgcctcagcctctcgag
-tagctgggactacaggcatgcgccaccacaaccggctaattttgtatttttagttgagac
-ggggtttctctatgttgctcaagctggtctcgaactcctaacttcaggtgacccgcccgc
-cttggcctcccaaagtgctgggattacaggtgtgagccaccgcacctggccCCACTTCAA
-ATTTTTAAAAAAAATACATAAAAACATTTGCAAAAATGCTGCCATCTTAATCAAAGCCAA
-AACACACTTGAGGGGCCACTGACAATCACCTGTAACAAAGCTGTTGGAACTGGGATTGAA
-TCAGATGGGGTCCATTTGCACTTACACCTGTTCAGGTGGCATTTCTGTGTTCACGAACAC
-CTGATGGAACTTCCTGCCCCCAGGATAGGTGGGCAAGATGAGCTGGCCTTTCCTCCCTGC
-ACATGTGAGGTGATAAATGTGATAGAGGGCCTCTCAGGCCTGCTTGGCTCCAGGCTCAGC
-AATGGCAACCTGGGCTCTGATTCCATCAACATCTTGCTGAGAGGTGGACTAGGCTGAGCA
-GGCAGTCTCGGGCTTCCATCCATGTCATTTGATGTGCTGGCTTTGTGGCAAATGTGCACA
-GCATCCTAAACCCACAATCCCTACTGTTGTCACTGGGTAAGATGCCGTGGTTCTTGTGGA
-GACACCTGCTATACTCGACATAACAAGATCCTAGACATTCCTTCTTATCATCTGCACAGC
-CCTCCAGAGCTGCTCTCTCCATACGGCCTCAGTGCCCATCCGGACTGCTCTCCTTGCAGG
-GTACCTGCCTGGCCCCTGTAGCTCCTGATGTAATAATCTCTGCAAAATTTGACCTGGAAA
-AAATGAAACTGACCAAAAGGATGGCCCTACACATACCAATGAAATTGTACAACAGAAGAA
-GATATGATTAGCAAAATTGGACATGGAGCCAGAACCTAATCCACAAGTCAAATATTTTCA
-AAATACAGACAGATGCCTTTAAAGTCCAACACAAAACAAAAATGCTCAAAATACGTTGat
-tatatgagagttcctgactagtgcagtaagacaagaaaaagtataagatttgaaaaaaga
-gacaaaaccttcattattcacagacgatatgattggcaatacagaaaagtaaagagattc
-caaaaaccactggaaattttttaaggtttcaactttgttgccagatatggggtcagtaca
-caaaattcaatcgtgtttcctctaacggacaccaacaaaccatatgtaacttctgattta
-caataatttcacttacaatagcagtcaaaccacgtggtactttggaataaatccccaaaa
-gtatgtaagacctttatgaagaaaactataatattttattgaaattcataaaataaggcc
-taaataagtgagaaatcaagtggggtcattgatggaaagactccgtgttataaagtggta
-attctgtacaaatgcagtgcaacgccaattaagatctcatagtttcctggaacttagtag
-gcaggttgtgaaatttatatggaggttccaaatatagctgagaccatcttaaagaagacg
-aaAGAGAGAGAAGAATGtttcccataaaagaagaaactggagttcagatttctctttgga
-aactgaaagatccccccacagtggaccctcacttctggagaggaatattcagctacagtt
-gactagcagttgccccttcagatagaatattcgatctccagttcacccagtatatcttct
-acttaaggcacctgcctgacccttgcagatatttgattatgtgaTAGTTACCTGGAGTGA
-GGGCTTAAGATAAGAGGAATGGAAGAGATTGTTTAAAATACATCTATTGTTTGGTTGTGT
-AAGTATTCTCCTCATGGTGAAACTTGACCAGGCAAGTAGAAAGAATAACAGAGAAGTATG
-TGAATCTAagacattgatgtttctggtaatggtgaagttccgagtatgatcacgggaatg
-cgtggctgagaagggataaaggaaatggtgcctgaggatataaagtgagaggactggaaa
-gTGCAAACGGCCCAAGTCAGTGGCTCCCCTGAGACCAATACCAGCAGTTGGGATGAAGGG
-AATCTGCCTGTTAACAAGGTTTCCTAGGATCTGATGCACAGTTCTTGATCCACGGCGTCA
-GAAATAAAGTGGTTAAATAAATATAAGCTACCggccgggcgcggtggctcacgcctgtaa
-ccccagcactttgggaggccgaggcgggcgatcacgaggtcaggagatcgagaccatcct
-ggctaacacggtgaaatcccgtctctactaaaaatacaaaaaattagccaggcgtggtgg
-cgggcgcctgtagtcccagctactcaggaggccgaggcaggagaatggcgtgaacccggg
-aggcggagcctgcagtgagccgagattgagccactgcactccagcctgggcgacagacca
-agagtccgtctcaaaaaagaaagaaagaaagaaaTATAAGCTACCTATACGTGGGGCTGC
-CTATTAACTCCGCcaagtgacttaactcctgcctctttatctgtaaaatgggcataatta
-cagcattgtttttggaagattccatgtaataaagtctgaagtgtgcttaacacagtactg
-ggaacttaagcagcactcaCACTTCATCCTAAATACGACGAAAGTCTTTTCAAAAAAATA
-AAAATTAATGCAATATGACTTACTTGGAAATGTATCAAAAAATAAAGACCGATGAATGGA
-TCGAGGCGTAGTGTGACAGAGTAAAATTTTAATGATAAAAAGTTAATGGTAAAATGTTCA
-CTGTAAAACTTTCAACTTTTCTTCTTGAAAACGTGCATAATCCGACGTGGGAAAAAAAAT
-AACGCATTGCAGTCAGTTCTGGGGAAACGGAAAGCTAAGTTTTAATTTTGCTATTGCTTT
-TGCTTTTTTAACAGAAAAGGTACAAAAAAGAAAAAATGGGAGAGATGTTGCCGAACTCCG
-TCCCGCCTGTGGGCTGTGGGCCGTTAGCAAAGCTGCTAGCATGAAATCGTCGAGCACCGC
-TTGCGAAACGCCAAATCCTCGAGAGCGAGGCCGGAGGCTGCCAAACCCGCGCTGGGGAAA
-GGGCCGCCTCCGGGCGCCCCATCCCGCTGCGGACGGAGGTGAGGTTGGAGCGAGCGCTGG
-CGGAAGAGAGGCTCAGCGCAGGGGGCGCAGAGCCGGCGCTGGCCAATATGCGCCGCATGT
-GATACCTTTGAGGGCGCGGCGGGGGAGGGTAGCGTCAAATTTCAAAAAAAAAAAAAAACC
-AAACCCACACAgccccggcgggcgggcgcgcgcgATGGGCGCCCTTTGGCTGCGGGAGCG
-AGTGGAGGATGCTGGGAAGGAGGTAAAATGGCCACCGGCGGCGGCGCGGAGGAAGAGAGG
-AAACGGGGGCGGCCGCAGCTTCTgccccccgcgcggcccgcggcccggggcgAGGAGGCC
-GACGGCGGCCGCGAGAAGATGGGCTGGGCCCAGGTGGTGAAGAATCTAGCCGAGAAGAAG
-GGCGAATTCCGCGAGCCGCGGCCGCCGCGGCGGGAGGAGGAAAGCGGCGGCGGTGGAGGG
-AgcgccgggctcggcggccccgcgggcctggcggcgccggACCTCGGCGACTTCCCACCG
-GCTGGCCGCGGGGATCCGAAGGGCCGTCGGAGAGATCCGGCCGGCGAGGCGGTGGACCCC
-CGCAAAAAGAAGGGCGCTGCGGAGGCGGGCAGGAGGAAGAAGGCCGAGGCGGCGGCGGCC
-GCCATGGCGACCCCGGCCAGGCCCGGCGAGGCCGAGGACGCGGCCGAGCGGCCCCTCCAG
-GATGAgccggcggcggcggcggcaggcccgggcAAGGGTCGCTTCCTCGTCCGCATCTGT
-TTCCAGGGAGACGAGGGCGCCTGCCCGACCCGGGACTTCGTGGTAGGAGCGCTTATCCTG
-CGCTCCATCGGCATGGACCCGAGCGACATCTACGCGGTCATCCAGATCCCGGGCAGCCGC
-GAATTCGACGTGAGCTTCCGCTCAGCGGAGAAGCTGGCCCTGTTCCTACGCGTCTACGAG
-GAGAAGCGGGAGCAGGAGGACTGCTGGGAGAACTTTGTGGTGCTGGGGCGGAGCAAGTCC
-AGCTTGAAGACGCTCTTCATCCTCTTCCGGAACGAGACGGTGGACGTGGAGGACATTGTG
-ACTTGGCTCAAGCGCCACTGCGACGTGCTGGCCGTGCCGGTGAAAGTGACCGACAGGTTT
-GGGATCTGGACCGGGGAGTACAAATGCGAGATCGAGCTGCGCCAGGGGGAGGGCGGGGTC
-AGGCACTTGCCAGGGGCCTTCTTCCTGGGGGCCGAGAGGGGCTACAGCTGGTACAAGGGG
-CAGCCCAAGACATGCTTTAAATGTGGTTCCCGGACCCACATGAGCGGCAGCTGCACGCAG
-GACAGGTGCTTCAGGTGCGGGGAGGAGGGGCACCTGAGCCCTTACTGCCGGAAGGGCATC
-GTGTGCAACCTCTGTGGCAAGCGAGGACACGCCTTTGCCCAGTGTCCCAAAGCAGTGCAC
-AATTCCGTGGCAGCTCAGCTAACCGGCGTGGCCGGGCACTAAACACCCGCCTGCCTGCCA
-GGGTGAACACACAGCCAGCTTATCCCTCTTAAGTGCCAAAACTTTTTTTTAAACCATTTT
-TTATCGTTTTTGAAGGAGATCTTTTTAAAACCTACAAGAGACATCTCTCTATGCCTTCTT
-AAACCGAGTTTACTCCATTTCAGCCTGTTCTGAATTGGTGACTCTGTCACCAATAACGAC
-TGCGGAGAACTGTAGCGTGCAGATGTGTTGCCCCTCCCTTTTAAAATTTTATTTTCGTTT
-TTCTATTGGGTATTTGTTTTGTTTCTTGTACTTTTTCTCTCTCTCCTTGCCCCCCTCCCG
-CCCTCCCCGCCCCATACCTTTTCTTCCCCTGGATTTTCACCCTTTGGGctgccttgctca
-tctttatgccccagcactaggtacggggcccaacacgtggtaggcactccatcagtgttt
-gctgaatTGAAAACATTGTTGACTGTGGCTTCTATCAGAGTGTCTACCTTTTGCAGCTCT
-TCCCCTCCCTCATTTAATTTGCTGCTTTTAATCTACGTGGTCTGAGAATTTGTGAAACCA
-GTGTTGTTAGAAGTGTATATAATCTGAATCAATAAGCTCTGAATGGTGGCCAAGGGCCTC
-TCTTATGGCACAAAGATGCATGGACTTCATGACAGCTCTTTTGGTGGCTCAGAAGCCATT
-TTTTATAgaatcatggaatctagaatattcctgctggaaagaacctgagagttggtttgg
-accaattccctggttttccagcagatgaaacaggcccaaagaggttaaatgactgggtga
-aaatcacatagctgtctggtgccagagccagcctatagtagagtcccctgaccccaagcc
-cggtgctcattccactACCTCTCACACTTCACAACAATTTCCTCAACACTTGAGGGCCCA
-GAAAGTCTGATCTCTCCAGAATGATCAGCCCAGAGGAATGCTGAGAAATCACCTGGAGGA
-GGGAGCAGAAAGAGAAGGTTTTTAAGGAGGGGCTTCTGAATACTTGGGAGATACGGAACG
-GACCAAGGACCACACTCCAGGGTGCATTCGTTGCTCCCTGGGGCACCACTTCTGGATTAC
-AGTGTGCCAGGTCCTTTGGAGGCCCTACCCCTTCCCCATTCATTGCCACCAGTGAGAAAT
-GGGGGTGCCCCTGTGTAAAGAAACCTACCAAAGGTTTACATTTGCACCTTAGCCTCAATA
-GCTACGAACCCTAGAGAAGCAGCTAGCTGGAGCTCATGTGCAACTCCTGATTCTCAGGAG
-AAAGATGGATTTTAACCCAAAATTATGAGTGAGCTGTTAACTCTAAAATGTACTTGGGAG
-ATAGGCCAAGCGAGAGGTCATGGGCCAACTAAGTGTTATCCAGTAGAAAAGACAGTACAC
-TGCTTTTCTTTTAGTGTTTGCTTTTCCTTTGCTATATGTTTTGCTATTTCCTTGTGGCTT
-AGAATGTAAAATTGATTGTTAAAAGTTTTGTTCTGAATAAATATTTATCTTTTGTATTGC
-TAAAACTGGTGCACTATTTCCTTTCAAAGTGTTAGATGCACAGTTACCCAGCTCCAGACC
-GTATTTCAATCCCACTTCCCCTACACTCCATTTGTTTACCTTGCTAAATACATTTCCCAC
-CCCTGCAGGCAACACTTAGCACCTACTACGTTGTGCCGGTCCCTTTGCATCACAATCAGC
-ACACTGTTAAAACGGGTTTTaagtcctaacacagttccaataaatcagaatcactgttag
-aggaagtgaaacattttagttaatcatcctcaagcaattctgatgggcagccaggtttga
-gaCCAGAGTATAAGATGTGTGAGCTGAAccctgccctcagggagattacagacctgtggg
-aaagagagGTGGTTTGCCAGCTTCCTCGTCTTTCTGTTACTGTAAGCGCGCGCTGTGGAT
-GGGATGCAAAATATTCTTGGGTTCTGGGAAAATGCCATTTCTTCCAGCTGTTGAAAAAGC
-GGGATCCAGGGAGCTGACTTCTCCAAGTTAGCCCCCACTGGAGACTGGGCCTGCAGGCAG
-AATAGGGTCAAGGTCCCTGGACTTCAGGTCCAATACCCTGCAGACCCCAGATACAACTCT
-CTGAAGGATTTTCCAGCTGGTGATGCTAGGATGATCTGATCCTGAGAGTTAAACGTTCCC
-AGTATATTGACTCTGACTCAGTGATTTGAGGATATTTCCAGAGCTGATCTGGAGTTGGGA
-CCTGGTAGGCTCTTGGGAATCCTGTCTTTCAGAGCCAGTTCAACCCCTCTCCTTGTCTCC
-CAAAGCAAGCAGACTCTCCCCTCCCTCCCATCCCTCTTTCCCGTCTTTGCCAGCGGTTTC
-CCTCCCTCTCACAGAGCTGGAGGCCAGGGGCCAGGAGAAAGCCTGCATTCACCATACTCT
-CCACTCCGTTCCTCAAAGCAGGCACTGTGCCAGGGAGCCTCCTTGAAGGAACCTTCCCTC
-TCCTGGCCCCATCCCCCCACTCTCCAGGAGGGAGGAGAGGAAGAAACTGTTTCCCTGCCC
-ATCCCCCACAGGATCTGCTTCAAGGCCTCCTGCCTGGTGGCCCAGGGACAGCCAGGGGCT
-GGAGCTGAACAAACCTCCCCCAGCTTCCTTTCCTGATCAAGCAGCCCTCAAATTACAATT
-CTTCACTGTTTTTGGGCTCCTGGAAAGTGTGCAGAGATGCCCGGACTGAGGCTGGTTGAC
-TAGGGGACATTGattcattccacttcaacaaatacggagggcattagagctgggccccat
-gcaaggccctctgcataggctgccttgaacaagacagTGCACTTGCAATGGAAGGTACAG
-ATAAGTAACAGTAGGCAATGTTTACAATCATATATTTAACAAtttttttttgagacagag
-tctcactctgttgcccaggctggagtgcagtggcatgatcttggctcactgcaacctcca
-cctcccggattcaagcgattcatgtgcctgagccttccaagtagctgggattacaggcac
-gtgccaccacgcccggctaatttttgtatttttagtggagatggggtttcagcatgttgg
-ccaggctggtctcgaactcctgacctcaggtgatccacctgcctcagcctctgaaagtgc
-tgggattacaggcgtgagacaccgcacccagccAACATTTGTCCTGTatagaattgtctg
-aagtaaaggtttccctagaagagaaaacgtcctgactgaaacctgcaagatgagtaagaa
-ccaggctaagagtgaagagacagccaagcagcagaaatagcagatgtagaggcctggagg
-ccagagagcacacagcgtgttcggactggccaagagtcaggggaagatgtggctgggaga
-aaacgccgagaagagGTGTCACAGGGCTTACCAGCCATATTTAAAAACGTGGATTTTGTC
-CTCAGAGCCTCCAATCAGGCCTCCTCCATTCCattcattctttcaacacatgcctgttaa
-gcgccaactctataggggccttttctaagcgatggaacacagcatggagcaggataatca
-agtccctgaagctcagattctagagtcacacaagtacataattacagacgatgatgcact
-aaaagaaacatacagggtgagatccctgtttaacaagcaaagctgatccagtcttaagga
-tcagagaaaatgtttgaactgagatggaaaagacataaaaggagttaatcgagagatggg
-gctggggattaagggatggcaagggtattaacctaggcaagagggatagcaagtaaaaca
-accctatagtgggaggaggcatgaccacttctagagacTAAATGAATCAGTCTAAGTTTA
-GAAACAGAAACCACTCTTGCTGTTGAAGAAAATGCTGGTCCCTGGGCTGGGTATTAGGAA
-TGACTCCTAGAACACCATAGAACTGCCAGGGGAGTTACTACCTCTCACAGTCAGAAAGAC
-AGAAGCCAGGAGGCCACCACTGGAAAGGCTGAGCATGAGGACACAATGGTGAAGCTGCCA
-CCCAAAGACAGGATCCTGGGATCAGAAAGTCACTGCCAATGCCACTGGCAGGACAGTGAA
-ATGCCAAGTCCTTTCCCTGCCTCTACAAAGCCAGGGACTGTGCACTACTGTCTCCGCAAC
-CATTTACAGGTAAAAACAGCCCAAACTGTCTGGCTTACTTATGCCTCCCTTCCATCTTTT
-ATGCAAATACATCTAAGTGCTAGAGCCCTAGCTGCAAGGGAGTTGGGAGATGTTTTAGCT
-TTCCAGCATCCGCAACATAGGAAGGCACATAGAATGGGGATGGGTGCTGTCTGTCAAAAG
-ACAATATCCAGCACAAAAAATGTGACTGCAGTGCAGAGAAGAGGAGCTCGTGGGagcatc
-tggtaggccatgttaagaatgtgggtctaagaacgatgtgccattgaaggacttgcaagc
-aagagagtaacatgattagattggttatgttttacaagcatcattcaggatagttggtgg
-agactgggtcagaggagagcccaaggggaaatacagtatagttcacccaggtctctcgag
-agatgaggacatcttaggcatggaaggcggagatgtacagagagaaacagccgagtaaag
-aaatctttcagagtttaagtcaacaagatttggagctatatttgacatgggctgggagaa
-agttaagtaccaaggatgttgcccaggtttctagcttctgcagttggatggatggtgggg
-cttttccctgagatgcgaaacagaagagaaaatccaagtttagggtgaagggcttgaatt
-tgattttggatatattgagtttaaggtctccgtagaggatatctaagaggagatgtggag
-taggcggttggatacacacagatcttacattcctaggagaattctggccctgagaaataa
-acacaggagttgtacagcTgtggctttcaaactgttttaccacatcccacagtaagatat
-atattttacattgcagccatcatacatatgcatgtgtgtatttatatctaaatctgaaat
-aagcttcctcaaacaatatttgccctgtgcatgatgcaccttgacactttctattccatt
-gcttcatccttttgtcaatgcttatatgacgtgttaaactgatttcacactctcctaatg
-gTCAAGAGAGAAAGCAGAAGGAAAGATTATACCAACTAAGATTGTGCCTCAAGCAACTTT
-GACACAGTTTTCCCTGATGgaaaaggagatggtgaaaaactaataagggacagccagaaa
-gggagaaggaaaaccagaacgtgcagaaacacataaaccaagggaggacatttcaggtgg
-taggggttaacaattgtgtcaagggctgcaagaaatcaagtaaaatcagctctaagaaat
-gtcaattgAggccgggcgcggtggctcatgcctgaaatcccagcactttgggaggccgag
-gcgggcggatcatgaggtcaggagattgagaccatcctggctaacacagtgaaaccccgt
-ctctactaaaaatacaaaaaattagttgggcgtggtggcgggcgcctgtaatcccagcta
-ctcgggaggctgaggcaggagaatggcgtgaacccaggaggcggagcttgcagtgagctg
-agattgagccactgcactccagcctgggcgacagagcgagacgccgtcaaaaaaaaaaaa
-aaaaTgtcaattgagatcagaactgaagagtgccctaggattgagtagtgtggaggttat
-caataagggccttttagaggaaagtgatgggggcagaTTAAGGAGCAAATGATCTTTCTA
-AGATGTCAATCTGGCACGCTGACCATTTTATTCCCATGTCACGTCCTCTGGGACTCCCTT
-GTGCACTTGGAACCCAGCCTGGTACCCGATCCCTTTCACAAGAGGCTCCTGGACTCCTTT
-CCAACCTTACTCTCAGCCAGATTGCCCATTACATCCCTTTATGTCAACTCCAGTTACGGC
-TGACAAACAGCAACCAGAAAGAATTTTGGAGTATGGAGTGGTACAAGACCAAGCTAAGGg
-gccaggtgcaatggttcatgcctgtaatcctagcactttgggaggcctaggcaagtggat
-cgcttgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctgtctctacta
-aaaatacaaaaaaaaatagccatgtatggtggcatgcacctgtagtcccagctactcagg
-aggctgaggcaggagaactgcttgaacctggTGATACAGGAAGGGAAGTGCTGGGAAGGG
-AAGGGCACAGTCCCTTTAAATGACATGGAAGGGAGAAagggcgtggtccctggctagggc
-tccaccccagcctgtgcccatggacctaggtgaggacaggcatttttgttttcctgccca
-aatgttgcatttcccaagaccaccctggccggccacgcccccatcctgtgcctataaaaa
-ccctagcaggcagacacacaggtaactggacggctagaggagcacatcagtggaggaaca
-cacaagcggctggacgtcgagaggaacgcaccgacaggcactgacaaaccagcacaccac
-aggccatcgaccaacagaactatgcagagtttggctggggcagtcggaggggagcctggg
-ccactgaacagtccaactccaggggaaaaccttctcactccatccccttctggcttcctc
-catctgctgagagatacctccactcaataaaaccttgcactaattcttcaagcccaggtg
-tgatccaattcttctggtacaccaaggcaagaacccaggatacagaaagccctctgtcct
-tgcaacaaggtagagtgtctaattgagctggttaacacaagccacctatagatggcaaaa
-ctaagagcatacggtagcataagcccattggggcttcaggagctgtaaacatccaccact
-agacactcgtggggtcggagccccacaacctgcccatctgtatgctcccctagaggtttg
-agcagcgggacactgaagaagtgagccactccccttgtcacacgccctgggacggggaca
-agggaacttttcccgtttcaGTgggaggcagaggttgcagtgagccgagattgtgccaca
-ctgcactctagcctgggcaacagagcgagactccatctctaaataaataaataaaaGGAC
-CAAGCTAAGGGTGAGGAGACGTCAGATCATGCTGAGTTGAGGGTGGGGGCGCCACAGGAG
-TGCACCAAACGTGTACAAAGGCACTGATACATACAGCCCCATTTGCTGGCTTGTCAATGT
-GACTAAGATTTGGGGTAGGACATAGTAAAAGAAAATAAACACAGATATATTATGGAAAAG
-AATGTAAACTTTGCAGAGTTTTAAATAAAATATGACtttttttttttttgaggcagggtc
-tcactttgttaaccaggctggagtgcagtggctcactgcgtggctcgctacagcctacaa
-ctcctgggctcaagcaatacttctgccccagcctcctgtgtaactgagactacaggcaca
-caccaccacacccagctaatttttTCTttctttctttttttttttttttttttttttgag
-acggagtctcactctgttgcccaggctggagtgcagtggcacaatctcggctcactgcaa
-cctctgcctcccgggttcactgtggatatatcccctcccgggatatatccatcactgtgc
-ctggcacagctgcagcctcccaagtagctgggactacaggcacccgccaccacgcccggc
-taattttttgtatttttagtagagatggggtttcaccgcattagccaggatggtctcaat
-ctcctgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgag
-ccaccactcccagcctctctctttctttctcctctttcttctctttctttcttttctttt
-tcttttcttttctttcttccttccttcctcctttccttcctttccttccctttctctctc
-tccttccttctttccttccttccttccttcttctttctttctctttcttttctttcttca
-gggtctcaatatgttggccaggctggtcttgaactcctgccctcaagtgatccttccacc
-ttggcttctcagagtggtaggattacaggtgtaagccaccacacccagcccaagaaagat
-tttattttatttttttatacagacagggtcttgctatgttgcccaggctagactcaaact
-cctggacaacatagcaatcttcctgcctcagcctcccTAGTAGCCAGGTGTGCACGGAAC
-AAATTAtatgtattaatatggaacaatctctaagacacattattaaatgaaaaaaagcaa
-gatatggtatcctacagtttacattttttaatgttggaataaatacatacataccctcag
-caccataggaaagattttaaaaaagaaaaaatatatatacatatgcttatttttgtacaa
-atatgtaacactggaaggatattaatgaaattcgtaatttgtaACTTTGGAGAACTGGAT
-ATTTGGGGTTTGGGATAAAAGGAAAGTTTATTTTCCACTGTGTATCCCTGCTTTTAAAAA
-AATATTTCATCTATTATCTCTAACAACAACAAAAACAACTTTTAACAACAAAAATAAATG
-CAAAACACAAGACTTCAACGAAATTCCTATAGACTTTAGAGAGACAGGAGTCCATCTCCT
-CTATCTTTAAAAGTAAAggccgggcttagtggctcatgcctgtaattccaacactttggg
-aagccaaggcaggaggactgcttgagcccaggagtttgaggccagctgaggcaacacagg
-gatatcctgtctctacaaaaaaaaaacaaatcgttgggtgtggtggtacatgcctgtggt
-cccagctacttgggaggctgaaacaggaggatcacttgaggttgaggctgcagtgagccg
-tgatggcaccactgcactccagcctgggccgcagagtgagaccctgtctctaaaaataaa
-ataaaataaaataaaaataaaaAATAAGAACTTTGATGGAAGAGTTTAAGAAATTCTATA
-GCAGACAACACATTGGTCTCCCTGCTTCCAGGCTCCCTCTCCTTCCAACCATGGAATCCA
-CCCCAAAACAAAACTTGATCACATTTCTCCCCCGCTTAAAGAACTTCAAAGATTTTGCGT
-CCTCCCTGGTGTTCACCAGGGCCTGCCTGACCAGCCCTGCCTCCTCTGGGCCTCCTCTCT
-TGTCGGGCCTCCCCCTCTTACCCTGGCTTGGCTTCCCcttctgctccagctggtcattcc
-tggaagcagatctcttcctcccctacccatggttaatccttacctgcctggggcactcag
-ctctaatgctgcttcctaactagagcctaccctaacatcctgtatcagaccctcttacac
-cgtccgttacctccctggcctctccttcagcagttactcgggtgcaatgatatacttatt
-tgtgccatggtttgattgatatctgcctctgcctctccactttgagctccctgagggcag
-gaaccagtctcttttggctcacggttatagcttgagcaattagcactatgcctggcacag
-agtaaagcctaataaatatttattgcatgcatgaTCTAGAATCACTTGGCTGAGGTTACA
-GATTAAGACACGTGTCTACTTGTCCTTCTTTAATATACTTAACATACCTTAGCACTCTGT
-CATTGACACATACTGAACAAGGGCTTATTCATTCATCTTTTAAAAGCTAACTCACTCTTT
-TAGTTTTCCCACCTTTGATAAGGGAGGATAGGACCTGGGAGGTCAGGCCCTCGGTTTACT
-AGCTCATCCTCCTCTATTTCTCTGAGAGCATAAAATCACTGGAAGTCAGCCAGCATGCCC
-CATGGCACTGTGAGGCACAGGGGAGAAGCACCAGGCTCCTGGATTCTGAATGCGTGGCTT
-TGAAGCCTGGCAAGAGTGGCCCCTTCCCTGAGTCCCCCACCAcccctccccttggggcga
-ggattctgcaggcatgagaagtgcccacccagagtctgtgcctatgccttctagaacacg
-ctctgatacccgataattcccttccaaaatgtcactaagttaattcacagggctctttgt
-gggcctcatccctggcttcatctcacctgagggcaaactatactgcctgatgcacatctt
-atagacctgagccttgggcctcaagatagctgtttgcaggtgacagctaggtgttgaccc
-atgcatgctagctccatcactgatgggatgagaggtagctggataagggatggatacagg
-ttccaggggacaggtctccttgggcctacacattctggcacataactccaagggtcttag
-aattctaatttgaacatggccttccaggttgttagaggatatatccatcaaggaagaaaa
-cagaacatatttcatttaacacttgctggactgttgtataatttctaactatagagacat
-atggtatatgggcctccaactctactcttgttctgagccccacaaatgCCCATTtggttc
-tgtcatttctttgcatagacaagctacataacctctctgaacttcagtttcctgagcagg
-aaaatgggtctatggtaataactacattatcagggctggtgagaaaatgaaataaaataa
-tccatgtcaagggcttgagaagaatgccCTCTGGCTGTCGTCTCCTATGACTTCCTGTAT
-GATCTCCAAACTGCTCTCTTTGCAGGGTTTCAACACGGCTGCTCCCTCCTGCCTCCTTAC
-CCACAGCCAATAACCTCCCCATTCTCTCCACCTAGTCAAATCCCACCGTCTTCAATTGTG
-ataatagctggttgattgcacgtttactacgtttcaggcattgtattaagaactttccat
-gcattaactcagttctgacaccaactcgatgaagcaggcactgtttattattccccaaac
-acaaagacacagggatctggagactggaagcactggcggctgcaagtggcagggctggcg
-gggtgtgaagccggagaggagtctttctgcagTCAGGCCTCCCAAATCCCGGGATGGAAT
-CAAGGAGCCTTTGGCTGTCCCACCCCTCCTCCTCCAAGCCCCCAAATCCAAGTCTGTTAT
-ATCCCGTCAGCTCTGCGGGCCTGCCTGTGACTTTCAGCCCAAGGGGGCGGGCACTTCGTG
-TCACGCCACGTTGTCCACATCATCGAccctccctccccttctccccttccttccttccct
-ccctctcttcctcccATTGAGTGCCAGTTCTGTGCCAAGCTTTGCTGTTCAAAATGTTAC
-GAGTGGAGAAGTCAGGGAAGGATGGAATTATAGGTGTTTCTTCTTCATACCTTTCTGTTT
-GGCTGATTTTTTTTCAAATGAGCACGCAGGCCCGGTTCCTCAAACCCACTTCCAATGTGG
-CATTGCTGGGTTGGTTTGGTCCAAGGAAAGCCCTGTCTCCTTAACTCCCAGCCCCCACGC
-CTCCTCCGCCGGCCCCCAAATCCAGGCCGCCCTGCCCCCTCCGGAAAGGGGAGTTGGGGG
-CGAGCGCCGAAATCTGAGTGGCTCTTTCAAGCCTCCGTTGCCATAGAAACCGGCCGCACA
-GGCCGATGCTGTCCATTACACCATCCTCTAGCCTCGCAGCCAATGGACTCCGAGCTCCAT
-CGCCAGAGGCCCCGCCCCCCAGCTCTGGGGAGTCCACCAATCAGCAGGTCCCGTGACTTA
-GAGCCCTGCCCTCGGCCCAGGGACACCACCAATGCGCTTCGACCCTGCCCTCCTTCTCTT
-CGGTGTAACAAGAAGACTCGatatttttttttttttttttaGGAATTCTCCAGATCAGAA
-GGAATTGGCAGTAAGGCCTCTGTCAGCTGCACCCTGAATAATCTTTGGCTGCTATTTTAT
-TTAAGGAGAGCAAAACTGTTTCAATTACGCAACAATATATACCATTCTCTACTAAAACAA
-TTTTAGGAAATGAAAATGTAGGCAATGGGATGATATAGTCTGCTCTATATGAATGTCTTT
-CATTATAGGTATTTTAATTTAACTTAAAATGATCAAGGAACTAGTCATCTTTCCTTTGTA
-TTTCAAATGCATACAAAATTAAAGATACCGAGTTTTTTGATGCAGAGTTCATGAGACATT
-GACTTAATTAGTTGGTAGGCAACTTTTACTGAACCATCTAATTCCTGGTTCAGAACATTA
-CAACTGGAGGATAAATGAATATTTCTCTTAATCCATGGAAGAAATTCTGTTTTTGAGGCG
-GGCTGCGTAAATGGCTCTGACACTCTGGAGTCTAAATAAACCAAATGTGTTTTTAAAACC
-CGTTTGCCATTACAAaaaaaaaacttcaattttttagaacacttttagatttacagaaaa
-attgtgaatataaagttcccgtctaccccagccacccaCCCTGtttctttcattattatt
-attattattgagacagggtcccgctctttcacccaggctggagtgcagtggcgcgatctc
-ggctcactgcaacctccgcctcccaggctcaggcgatcctcccacctcagcctcccaagt
-agcagagactacaggggcatgccaccaagcccagctgatttttgcatttttcatagagat
-gaagtctcgccatgttgctcaggctggtgtttctgctattaacatcacatatggtattgc
-agacgcatggtatatttgttccaattaataaaccaataatgatacattatttattaatta
-gagttcacagtttattcagatttccttcgtttttacccaacgttctttttctactccatc
-tttttctactccaggatccatccagcatgcctcatcgcactagctgtcgtgtctctctgg
-gctcctcttggctggggcggtttctcaCATAGCAACATGACatcactgttggtgctgcgt
-caggtttctctactggaaagtcagtcttcttttgccccttttcatactgtactctttgga
-aggaagtcactatgctcgggccacacttaagtgaggagttatgctctatctccttaaggt
-tggaatagctacatagattatttgggatttttctacactgaagatttgtctcatttattc
-agtaatttatttatatcagtatggattcacagataattatttaatactttaggttataat
-ccaatactatttgattttgttgctcaagttgttccagctttggcttttgggagctctttc
-ggttggctcccgtctccctttgacacacccctatttttgtggggttttctcgttgccgtc
-aagcacttccttactttctggcactacaagatgcctcaggctcatctttcgtatttcctg
-ccccagtcctcaaatcagccatttcgcaagagctttgattgtttcggagaagggtattta
-ttagaaaccaagaactgggcgctaggtgcactcattgctactagggtgtcatttattTcc
-ttcctccctccctccctccctcccttcctttttgagacagagtctcactccatcacccac
-actggagtgcaCACTCATGGCTACAGCCACGTAGCCATGGTAATGAAGCCATAACCTCAC
-GAAGCTTCCAGTTTACACAATTAGAGGGTTAATTACCAAGTTGCCCAGCACTCTGCAGTG
-TGCTgtgtaggcaatgcgggggtaaattatctgaagagaatttaaagacaataaAAactg
-cagcctagacctcctgggctcaagtgatcctccctccttagcctcctgagtagctaggac
-cacaggtgtgtgccaccacactcagctaattttaattttcaatttttttttttgtagaga
-taaggtcttgccatgttgcccagactgatacaactcccggcctcaagccatcctcctgcc
-ttggcctcccaaagtgttgggattacaggcgtgagccaccacacctggccTtggggtatc
-atttcttttaagccttctcaactgacagaacaaagaaatatatctgtatataccaatgtg
-tatatatatacacacatatctatatttccatttgtaaccatctgtatatatattaagcta
-aacatgagttcctgtttatatttaccacttgaatccagggatcatttggcttgcttcctg
-cttgcttatctctaaattcccactccaataacgggaaacctggttcccatcatccacatc
-caccatccatttacttaattgttcaagtccagtatacatgtgtaggattatcaaaattgt
-taacccatacccctgtgggaaactttatcaagtagagtacattcttctgaacactttctt
-ttgcctttagtgttccagcagactccacttgtttcttttttctttttctttttttttttt
-ttttgagacagagcctcactctgttgcccaggttggagtgctggagtgcagcggggccat
-cacagctcacagcagccttgacttcccagtcttaagtgatcctcctgcctcagcctccca
-agtagctgggactacaggcatgcgccactacacccatctaattttttaaaatttttgtag
-agatgggatctcactatgttgcctaggcttgtctccaactcctgggctccagtgatcctc
-ccgcctcagcctcccaaagtcctgggattaaaggcatgagccaccacgcctggcccactc
-atttctaaagttacttaggtcagcacgttttcctctatcctcttcatgaggtcatttcac
-acatttgtaatacggtgaagatgtttgtcatattctgcatgacattttggaattatctaa
-atgtcctaagtgatttttttaactttgcatgcattaaggttcactttttgtgctattaag
-tttaatggatatcaaccaatgcacagtcatatacccacatttcttcaccctaaaaaaccc
-cctgtgctcacttattgaaccctctccccgccaaacactggcaaccacacatccgtttac
-tgtatctatggttttgcctttttgtgccattattaaaaaaaagaaagacgcacaatattt
-ttgttgttgctcttgtcacAGCTGCCacccattgaatccttactatgtcccaggtccaga
-attacactgtcccattttgaagatgaggaaacagatgcaaatgagttgaagtactcccta
-gagactcataacaataagcaaagtttgacttcTATGATTAACTTCTGAGTCACCTCTGGG
-AATATTTGTAATATGTCTAATAGCCACACttcttttgtttgttttgatacaggggtcttg
-ctgttgcctaggctggagtacagtggctactcacaggtgcaatcatagggcactacagcc
-ttgaactcctgggctcaagcaatcctcctgcctcaacctcaaaagtggctgggactacaa
-tgtgtgccactgtgcccagcTATattagccacatttcaagtactcaatagccgctgtgca
-gtttatactattatattggTTTCTGAGttttgtttttgagactgcgtcttgctctgtcac
-caggctggagtgcaatggcacaatctcggctcactgcaacctccaccacctgggttcaag
-cgattctcctgcctcagcctcccaaatagctgagactacaggtacgtatcaccaagacca
-gctaacttttgtatttttagtagagacatggtttcaccatgttggccaggatggtctcga
-tctcttgacctcgtgatctgcccgcctcggcctcccaaagtgttgggattacaggtgtga
-gccaccgtgcctagctATATTGTTTTTTAAAAGATCTCTTATTATTTAGTGAAAAGAAAG
-GAcctgtagtctcagttactcaggaggctgaggtgggaagatcatttgagccccagagtt
-tgaggtagcagtgagctatgatgatgccactgcactccagcctgggcaacagagggagat
-gccatctcacacacatacaaaagaaaagagaCCTTGTAATGCACACACTATCATAATCTC
-TGAtttttctttttttttttttttttttgagacactgtcttgctctgttgcccaggctgg
-agtgcagtggggtgatcactgctcactgcagcctcaacctcctgggctcaagtgatcctc
-ccacctcagcctccccagtggttgggaccacaaatgtgcaccaccacaactggtaaattt
-tttatttattgtagagatgtgggtctcaatattttgcccaggctggtctcaaactcctag
-gctcaagctagcctcccaaagtgctgggattataggtatgagccactgGCTttttttgtt
-tgtttgtttgtttttgtttttgatatggagttttgctcttgttgcccaggctggagtgca
-atggcgctatcttggctcactgcaacctctgcctcccaggttcaagtaattctcctccct
-cagccttctgagtagctgggattacaggcatgcgccaacacctccagttaattttgtatt
-tttagtagagacggggtttctccatgttggtcagactggtctcaaactcctgaccgcagg
-tgatctgcctgcctcagcctccaaaagtgctgggattacaggtgcgagccactgcccctg
-gccTGACTTTTTTAAAATCAGGAAATTTAGATGAATCAAAAAAGAAATTACCTTGTCCCT
-ATTGTTCTCTTCTCATTATGAATGTCTTTGAGGACCATGCCAGTTGGCAAATAGGTATTT
-TGGAGCTAGACACAGTTAGGGTGAGTGGAGTAACACGACAGTACCTACAACAGCCACACC
-CACACCTGAGTTGGCTTCATCCTGCCTTCAGGTATCATTAAGAATAGGtattattattat
-tattattattattattattttgagaccgagtctcactctgtcgcccaggctggagtgcag
-tggcacaatctccgctcattgcaacctctgcctcccaggttcaagcgattctcctgcctc
-agccttctgggactacaggcccgtgccaccacgcccggctaattttttgtatttttagta
-gagatgggtttcatcgtgttagccaggatggtttccatctcctgacctcatgatcctcct
-gcctcagccttccaaagtgctgggattacagatgtgagccaccacacctggccATATATA
-TAtttttttctttgagacagttccactctgtcacccaggctggagtgcagtggtgtgatc
-atggctcactgcagcctggaactcccaggctcaagagatcctcctgactcagtctcccaa
-gtaactaggactataggcacacaccaccaggcccagttaatttttctatttttagagacg
-gggtctcactatgttgcccagactcgtctcgaactcctgggctcaagcaatccttccaac
-ctctacttcccaaagtgttgggattgtaggcatgagacaccacatctggcctataatgga
-atattatttggcaataaaaaggaagttctgatacatgctacaacatagatgaacctagaa
-atcatgatgctaagtgaaagaagccaggcacaaaaggccacatgttgtatgattctcttt
-acatgaactgtccagaagagacaaatccatggatacagaagcagattaatggtggcctag
-ggctggggattagagggaaggcagagcagatgggagagtgactgctaatgagtactgatg
-ctaatggtttcttttggggatgatgaaaatagtctaaaatccattgtggcaacagttaca
-caactctgtgaatgcactgaaagccactgaattgtaaactataaatgactgaatagtgtg
-gtatgtgaattacatctcaacaaagctgttTTTTTTTTTTTTTAATGTTCTGGAAGAATC
-AGGATAGACATTACCTCAGGTGAAGGAAGGCAGGAGATGGGATGGTAAAGGAATTCATTG
-GGGAAAACAGGTTATCAATGTTCCAGTTCTTGTGTCAGATTGCTGACTCCACAGATTTTT
-ATTATGTTATGTAAAAATAAATACACACAGggccaggcatggtggctcacacctgtatcc
-cagcactttgggaggctgtggtgggaaaatcgcttgagcccaggagttcaagaccagcct
-aggaaacatagtgagaacctgcctctacaaaaaaaatttttcgaaattagccagccatgg
-tggcatgcatctgtagtcctaactacttgggaggctgaggcaggaggatcacttgggccc
-agaagttccaggatgcagtgagctatgatcgcaccactgtactccagcccaggcaacaga
-gcaagaccaggtctctaaaaaaaaCCCACACAAGCATAAAGTGAGGGAATCACAGGCAAC
-AATGAGAATGTGTCGCAGATGAAGCGATTCTGTATACCTGAGACAGAGGGAGATGAACGG
-GAAACGGCAGagagtggtcaggacagtcctctctggggagcccgtttgagccgaagctag
-gatgagtagatgctccagcccatgtggggatgggggtgaaaagagttccagacaaaggag
-acagcatgaatgagggccctgaggtaggcccaagcctgttgtgtttgggggacagccagT
-TTAAATGTCTGTTCTGTTATATTGTGGAGTCTCTGTGtatgaatttttcctaaagaaata
-acagacaggccgggtgcagtggctcacgcctgtcatcccagcacttcgggaggctgaggc
-aggcagatcatgaggtcaggagatcgagaccatcctggccaacatggtgaaaccccatct
-ctattaaaaatacaggtcgggcacggtggctcacgcctgtaatcccagcactttgggagg
-ccaaggcaggcagatcacaaggtgaggagatcgagaccatcctggctaacacggtgaaaa
-cccagctctactaaaaatacaaaaaaaaaaaaattagccgggcatggtggcgggcgcctg
-tagtcccagctactcgggaggctgagacaggagaatggtgtgaacccgggaggcagagct
-tgcagtgagccgacatcaagccactgcactccagcctgggtgacaaagcgagaatccgtc
-tcaaaaaaaaataaaaattagctgggtgtggtagcgcacacttgtaatcccagctactca
-ggaggctgaggaaagagaatcgcttgaacccaggaggtggagattacagtgagccaagat
-tgcgccactgcactccagcctggcgacagagcgagactccatctctaaataaataagtgg
-ccaaaaacatacatacaaaggtgttcactgccatattgtttataatagcaaaaaggggta
-aaacaatcaaaatgtctttcaagaaggaactgattcactttgggaggccgaggtgggcag
-atcacctgaggtcaggagttcgagaccagcctgaccaacatggtgaaaccccatctctaa
-taagaacacaaaattagccaggcgtggtgatgcacgcctgtaattccagctacttggaag
-gctgaggcagcagagtcatttgaacccaggaggcagagtttgcagtaatccgagatcacg
-ccattgcactccagcccaggcaaaaagagtgaaactccgtctctaaaaaaaaaagaactg
-attaaatgaattacaatataCTCGGCAGACCTGGACGAGAACCTACGCACTACATGGAAA
-GAGAAAAGAGATGTGAAAAAAGCAGGTTACTAGAAATTACATATAGTAACATTCCACTTG
-TGTAAAAAAAACTATGTGTGCATGTGATTATAAGCATTTAAGTTTCTGGATggccaggtg
-aagtggctcatgcctgtaatcccagcactttgggaggccaaggtgggcagaccgcttaag
-cccaggaatttgagaccagctcgggcaacgtggcaaaactcagtctctataaaaaataca
-aaaaattagccctgtgtggtggtacgcgtctgtagtcccagctacctgggacactgacgt
-gggaagatcacttgagcccaagaggttgaggctgcagtgagctgtgattgcgccactgca
-ccccatcctgggtgacagggagagaccttgtcgaaaaaaaaaaaaggccgggcacggtgg
-ctcacgcttataatcccagcactttaggaggccaaggcgggcagatcacaaggtcaggag
-ttccagaccagcctggccgatatggcgaaaccccgtctctattaaaaatacaaaaattag
-tcgggcgcagtggtgggcggctgtagtcccagctacttgggaggctgaggcaggagaatc
-gcttgaacgtgggaggcagaggttgcggtgagccaggatcgcgtcactgcactccagcct
-gggcaacagagtgagactccgtcccgtctcaaaaaaaaaaaaTTCTGGAAAATTACATTA
-AAATTTAAAATTTACTCATTATAATGCCATTTTTCTAGATTACAGGAGACGTTCACTTTT
-CGCCTTATATAATTCAGTATAAggccgggcgcagtggctcatgcctgtaatcccaaaact
-ttgggaggccgaggcgggcggatcacttgaggtcaggaattcgaggccagcctgaccaac
-atggcgaaactccgtctctactaaaaatacaaaaattagccaggcgtggtggcacgcacc
-tgtagttccagctactcaggaggctgaggcaggagaatcgcttgaacctgggaggaggaa
-gttgcagtgagctgagatcacgccactgcactccagcctggtgacagagcgagactccac
-acacacacacacacacacacacacacacacacaaacacaaacacCATATATATACATATA
-TAACTTTTGTAATAATAAAAAACATACTTCTACTTAAAGAGAATATCAATAAGCCCTAAA
-GTTTTTCATAGTGAAAGCCCTTCAAAATTGCTTGACAAATAAATTCTAAGTATACTAACT
-ATGGGAAAAATGTATGCTTGCGAAGACTTTGTTAGACACATTTTCTTAAATGCTGAAGCT
-ATAATTTAAAAATGAAGATTTCAGGAGACAAAATAAAGTCAGCTGGATAAAAAATGTGCA
-GAGAGAAAAAATATACCAAAATGTTAAGAGTGAGTGTCTCggccgggcgcagtggctcat
-gcctgtaatcccggcactttgggaggctgatgcgggcggatcacggggtcaagagtttga
-gatcagccggccaacatagtgaaaccccgtctctactaaaaatacaaaaattagccgggc
-atggtgatgcatgcctgtagtcccagccacttgggaggcttagggaggagaatcacttga
-acccgggaggcagaggttgtggtgagctgagatcgtgccactgcccttcagcctgggcaa
-cagagcaggactctgtctcaaaaaaaaaaaaagaGTGGGTGTCTCTTGGCACTGAGACAA
-TGAATCCCAACAAATTCCCAACAAATGATATTTTTTCCTTAAATTTCAGAATTTTTGAAG
-TTTTACACAATGAATATTTTGTGATCTGAAAATTTTTTCTTCCCCTCCTCTTCCAATTCA
-ACAGCTGAATAATAATCTtgtgttcattgtctgctactgcttaagacattctttccagac
-ttagaggcttaacaaagcaaacagctaccatctcacagtttctgtgggtcatgaatccac
-gcagagtttagttgcatggttctggctcagggtcattcacgaggttgcagttgagatgct
-ggtcagggctgcagtcatctgaagacttgactggggctggaggatctgattccaggatgg
-atcgatcactcagatggctgttggaagtaggtctcagttccttgttggtgttggcaggag
-gcttcagtttctcaccacgtagagctttccacagggctgcttgagtgccctcgcatgaca
-gctgacttctcccagaataaatgatacaaaataagacagccaggaggaaaacatagagct
-ttctatgtccaatcttagatatcacaaaccatcacttctgccatattctattagttagag
-gcaagttcacacttaactgggaaggggaggaggaattaggctcttccttttgaaggaagg
-aacattaaagaatttgtgaaGggccgggcgcagtggctcatgcctgtaatcccagcactt
-tgggaggctgaggggggcggatcatgaggtcaggagattgagaccatcctggctaaaacg
-gtgaaaccctgtctctactaaaaaaatacaacaaaaattagcagggcgtggtggcaggcg
-cctgtagtcccagctactggggaggctgaggcaggagaatggcgtgaacccgggaggcgg
-agcttgcagtgagccgagatggcgccaccgcactccagcctgggtgacagagcaagactc
-catctcaaaaagaaaaaaaaaaaaagaaTTTGTGAACATGTTTTTGAAACACAAGAAAAT
-ttccagctgatctttccccccaaatttccctcctccaatccaactacaacacatgaaact
-ccttaatcttgctgaagcgtacctctgatcatgtcatcctgcaataaaaaaactgtccct
-ggctccccacaacccagggaactccataacttggcttctgaggaccaactaccgtattgc
-ccttcagctccagctcaacataaacgcatcgtattcctcatgtacactcccccatctctg
-gtcttggcacctatccatgccctctcaatacctcgtcccagtctccttcccatctccagt
-cccttgcacttgctgtttcctctgcctggaatgttttacatggatggttcttcgtcatct
-tgagatctaaactctcccccatctctatcatcccccgtcccagtcactcactctctcatt
-accttgttttcttttcattgtcgtttgagacagggtctcactctgtcccacaggctgggg
-tgcagtggtacgatcacagctcactgcagcctcaacttcccgggctcaaacgatcttcct
-gcctcagcctcccaagtagctaggactaaaggcacaggccatcacacctggctgttttgt
-attttttgtagagacaggcttttgccatgttgcctaggctggtcttgaacttctaggctc
-aagcatctgcccacctcagcctctcaaagcgctgggatttcagatgtgagccaccttgcc
-cagcccctccctcccttctttccatcacccagtctggggtgcagtggcaccatcatagct
-cactacagcctcaaaatctctggcttaagcgttttcccacctcagcctccccagaagctg
-agatgacaggtgcttgctaccatgcccggctaatttttgaatttttgtggaggtgggatt
-tctctatgttacccaggctggtctgaaactcctgggctcaagcgattctcccgccttggc
-atcccaaagtgcagggattacaggcgtgaaccaccacacccagcccagctttattttctt
-tatagcagtcacaactatctgaaattatcttatttgtttacctgctcttttctgttgccc
-tcacttgctccttaagaacagggacctctgtcttggtcactgctgtaacccagtagcccc
-agttccaagttcactgcctggtgcacagtaggtggccaataaattgttgaattaaATGTC
-CTCTCTTCCAGGGAGTTGTTTTAGAAAGAATCACACACTGCATAAATGTCTGTTGAGGAA
-GAAAATGAAAAAAACAAAAGTGAAGACATTATCTTCTCGGCTGAACTTCCCACACCATCT
-TCTCTGTCATTAATAAGTCCTGGTGTCTACACTGGGGAAGGCAGTCCAAGGTTCTTCCAG
-GGCCTAGGTTCAGCCAGACTTTAACCATCTCTAGCTCCTCAGAGTCCGTCAAAGGGCCTA
-AGGAATGGTAAGTATTAATAATGtttgtttatgtatttatttatttatttattttgagat
-aaagtctctgtctcccaggccggagtgcagaggtacaatcattacaacttccacctttcc
-ggctcaagcaatcctcctgcctcagcctgccaagtagctaggactacaggcaggcaccac
-cctgcccagctaatttttgtacttttttttgtagagtaagggtttcaccatgttgcccag
-gctggtcttgaactcctggccttaagtgatctgcctgcctcagcctcccaaagtgctaag
-actacagctgtgaaccactgtgcAGGGTCAAATGTTTATTAATGGATGCATGCATGGATG
-GAAGAAGGAAAGGAGGCAGGTGTGAATAATGAATGCAGCATTTTCACTGCTGAGAATAAA
-GAGTGAAATCCTGGTCCAAATCAGTTTGGCAGTGAGTAAGGTTAGGAACTATTCACATAC
-ATTGGAATAATAATAGCAGCAGCAGCTACAGGGTCAGAGACAGATCTTTGAGAGGCCATA
-AGCATTGAAAAGATTGTGGTACCTATCACACACCGTCTAAAATAAAACAAATATTTTATT
-TATGGGAAAAGTGTTAAGGTGTTGATAATTCCAAGAAAGCTTTTATTTGTCCTACAATCA
-TTACTTTGATACCTTTTCTGAAATCCTAGAGCTGTCCCCACTCTGCCCATTTTTTTTTCT
-CATTATGGTGATGTCTCTGGGTTGCTGGTGACCTGCGTAACTATTGGGAAATCTAGTTTC
-TCAAAACttttagtttttttttagacagggtctcactctgtcactcaggctggagtgcag
-cggctcactgcaacatccgcctcctaggttcaagcgattctcatacctcagtctcctgag
-tagctgggattacaggtacgcgtcaccaagcctgactcattattttgtacttttagtaga
-gacaaggtttcaccatatcggccaggcggatctcgaacttctgacctcaaatgatccgcc
-cgccttggcttcccaaagtgctgggattacaggtgtgagccaccgcgtccCGTCTATCAT
-AAGTtttattgaacattgcctaggtatcaggatgtgtttacatgcattatctcatttaat
-ctgtaaaaccaccatgtgagggagaaactgaattatccccattttcaggataaggaaaag
-gaggGACTGGGAATGTGAACTCAGGAAGTGTGACTCCATCGGGTAGACTGCTCAGGCTGC
-AGATGTAAAGGTTTTACACGTAGGCTTTTCCAGATCTCAGCTTCTGAAAGGCGGAGGGAC
-CGTTTGGACGGGAGCAGGGCCTCCTCTTCCAAGCACCCTGTGCCTTTAAGAGTCGCCCCC
-TCCCTCCAGGGATGCTCCAATTTCTTTCTCCCCACCACCCCCACCCCGCCCCCCGCGCCG
-CGGAGCCGCACCTCGGTCCTTCCTCCCCGCCCCACACCCTCAAGCTCGGCTCTTGGCCTT
-CGCTCGTCCAGAAGTGGGTGAGCTGTACCGCCAGAGGCGCATTCTCCTAGCCCCAAACCA
-TGCCCGCTACGCCCCAGCGGAATGCCACCTTAAAGACCCTAATCCGGGCACCTCCCAGCT
-CCTGCTTCCCAAGGGCGAGGCCTCAGCGCCCCCTCCCATCGCCCATGCTCACGACGCCGT
-GAAGGTGACCTCCCCCAGGGGCGGCACACGCCCAGTGGTGCCCGAACTGGCTCACACGTG
-GTGAGCCGGGAGCGCGCGGCCCCTCCCCGCCACGCGCCTCGTGCCGGCCACCCGGCCACG
-CCCCCAGGACTGGCTCCGCCCCGTGCCCCTGCACGCTTCTCCAGGCTTGGGTGGGGCGAC
-GCGCCCAAGTCGGGCACCGGGCAGGCTACGGGGTGGGGTAGGACCTGGGAATGGCGCACC
-CACGCATCCTCGAATGTCGCCTGCGGTTTGTGAAAAGCGGGAAGTCCGCCCAGCTCAGGA
-CCTTTGGCTGGCAGGCGAGGTGCCCCGCGGCCCTTGGTGCTGAGCAGGGGAGAGACAGCT
-GGGACCGCGAGCCTGGGAATCGAATCCTAGTCTGCGTGTCCTCGGTGCTTCCTATTTGGA
-AACTGGGCATCATATTATCATATTCCCTTCTCCCTCCGGATTCTTATGGAGCTTCGAACG
-AGATTAAATATACATATATATGAGAAAGGGATTTGTTCACTAGGTCCAAAAGCATTTGCT
-GGTCCCATATGTGGTCGGACCCTGTGTGTAGTAGGCGGGGGGCAACATCTACGACAACCT
-GAGTTCGTCCCCTTAAGAAGCTTTCCTGAGTCTTGGGCCCCCCAAATTCTCTTCTGGGAT
-GGTCCGAAAAGACGTCCCTGAAAGAGGAAAGGGCGGAAATCCTACCTGACGGCAGGTGTC
-TCGGAATGAGCTAAAATTTAAAAGGCAACGCGGGGCAGGGACAAGCGTCCAGCGTCAGAT
-GGAAGCAGGCTCGCGTCCCCTACCCTTCCTCCAACCCCTAACCTAAGAAAAGAAACCGAT
-CTCGCCGGTCTCCCCCAATCCTAGCCGCGAGACCGCCCAGCCCCGCAGCCCGAGCCCCGC
-CCCGCTCCGGCGGCCAGCGATTGGGAGATGCAAATACCGGCTTCTCTGCCCAGCAACGGG
-TGACGCGGCGCCCGAGCGCGAGGCGGGGCCCGGCCGCAGCCCAAGCGGGCACCTCGGTGT
-TTACAcggggcggccccgcgcgcgccgcagcggcccgcagacggcgagggggaggggtgg
-tgcgcgcgccggcggggccgcgcggggAGAAAGACACTGAAAGGCGTcggcggccgggcg
-gggagcggcgcgcgcgggccgcggcggAGCCAGAGGCTGCAGGAAGAGCCCGCGGGGGCC
-CGGAGGGTGCGATTCCTCGGCCCCCGCAAAACAATGTGTGTTGTGAGCCAGGACGCAACT
-TGCCGGAGGCGGCGGGGGCGCGCCGAGCCCGCCTGAGACCGCGCTGACCTTCTCCCCCCG
-CCGTCCGTTGGGCCCGAGCGCCCAGCTCCTCGCTCCCCAGTTcgcgggggccgggccgag
-ccgcggggcggggccgccccTCCGTCGCCGCTGCCTCCTCCCCCACCCCCAGCCGCGGAG
-GATGCGGACGGCCCCCGGCGGCGTCTAGCGGCCCCGGGCCCAGGCGCGATGGTGCAGCAG
-CGGGGCGCGAGGGCCAAGCGGGAcggcgggccgccgcccccgggacccgggccggccgag
-gagggggcgcgcgagcccggcTGGTGCAAGACCCCGAGCGGCCACATCAAGAGGCCGATG
-AACGCATTCATGGTGTGGTCGCAGCACGAACGGCGGAAGATCATGGACCAGTGGCCCGAC
-ATGCACAACGCCGAGATCTCCAAGCGCCTGGGCCGCCGCTGGCAGCTGCTGCAGGACTCG
-GAGAAGATCCCGTTCGTGCGGGAGGCGGAGCGGCTGCGGCTCAAGCACATGGCGGATTAC
-CCGGACTACAAGTACCGGCCGCGCAAAAAGAGCAAgggggcgcccgccaaggcgcggccc
-cgcccccccggTGGTAGCGGTGGCGGCAGCCGGCTCAAGCCCGGGCCGCAGCTGCCTGGC
-CGCGGGGGCCGCCGAGCAGCGGGAGGGCCTTTggggggcggggcggcggcgcccgAGGAC
-GACGATGAAGACGACGACGAGGAGCTGCTGGAAGTGCGCCTGGTCGAGACCCCGGGGCGG
-GAGCTGTGGAGGATGGTCCCGGCGGGACGGGCCGCTCGGGGACAAGCGGAGCGCGCCCAA
-GGGCCGTCGGGCGAgggggcggccgccgccgccgccgccTCCCCGACACCGTCggaggac
-gaggagccggaggaagaggaggaggaggCGGCAGCGGCTGAGGAAGGTGAAGAGGAGACG
-GTGGCGTCGGGGGAGGAGTCGCTGGGCTTTCTGTCCAGGCTGCCCCCTGGCCCGGCCGGC
-CTGGACTGCAGCGCCCTGGATCGCGACCCGGACCTGCAGCCTCCCTCGGGCACGTCGCAC
-TTCGAGTTCCCGGACTACTGCACCCCCGAGGTTACCGAGATGATCGCGGGGGACTGGCGC
-CCGTCTAGCATCGCAGACCTGGTTTTCACCTACTGAGCCCACCGTCAGCGGGGCGCGCAC
-GCCCCCAAACCAGCTGTTTACATACAGGAATCAGGTATTGGGGCCCCTCGGAGGCCGAGG
-CTGGCACCCCATCTCCCGCGCAGCCTGCCCCCTCCTGGACGTGCCCATCCCCCCTCAGAT
-CCAGACATGCCCCTCCCCCGCAGACACACCCCAAGGCAGCCCAACCCCCACCCCTTCCCC
-GACACCCAAGCCCCTCCCCACGTCGCCCCCTCCTGCACAGCCACCAGCAGCCAGCCCCCT
-CCGATACACCTCCCGTCCTCTCCTACAGACCTGCACCCCTCCCCCCTTTTGCACACGCCC
-CTCCTCGTGGCCGGAGGACCCGCCCCCTCCTTTGCTCCGGAATCTCTCCTCCCTCGCCCG
-GCCCGCCTTCTCTGGGTTAGGGGGGCGATGCGGCCGGGTGGCAACGCACGCGCCTCCTGC
-GCCCCTCCCTTCCCTGGGGGGAGGGGCGCACCCCTTTTATCCCCGGAGCGCTAGGGCCCG
-CCCCTCCGCTGGGGCCCACCCCCTTCGTGCGCATGCTTAATGCTTCTGGGGAGGAGGGGG
-CTGGTCCCAGCGGAGCCGCACTCTTCGCCCGCTCCGGGCAAAAGCGGGGGCGAGTGTAGA
-GCGATCCTGGGAAATCCTTTGATCCGGGAGCCCTAGGTTTCCTCTCCAGCCAACGGGGCG
-TCGCTGCCTTAATGGGAGGAGCACTCGGAAGGGTTGGTTTGGGCCTGAAACTCTCCCAAG
-TGGCATAGCCCCTTTTCCGGTATGGGGTCTCCTACACCCACGCGCACCACCTCTCCGGTC
-GCGTGGCTGCCTCTACAGCCTACCTATACGTCCCTTTTTCCCCCCAACTGGGAATTGAGA
-GGTAAGGTCTTTCTCTGGAAATCCAGCAGTAGAGGAAGGGACCACCCAAGAAAACTAAAA
-ACCAAGGCACCTTACCAGTCTGTCTGGGGACAGGATCCCTGCTGCACCTTCCCCACCCCC
-TCCTGGGAAGTGCCCCCTCACCTCAGGGCACCCGCAACCTGGGCTCCTCCCTGAGCGCAC
-CGGCCCTTCCTGTCACCCAGGTCCACCCTCAGTACTCAAGCTGCAGTATACAGCGGGAAA
-AACTGAGGCACTTTGGTGCTAGGGGTTTGGGACTGAGGCGTGGAGAGCAGATGTGATGGC
-AGGAAGACTCTCGCTTTTAAACATCTGGTTTGGGAGAGACCATCGACTTGGCCAGTGAGA
-CTGAGAATGGATTCCGAGTAGTGATGGGCCGTTTGCACCTCGGTTTTTCCACGTGAGAAA
-TGGGGAGAACGCTGCTGTTAGGAGGAAGTTGTGTCCAGTTCAGGGTGCCCTCGGGAGCCC
-TGTCCCTGTTGCTGTGGCCCCTCTCACGCCGCCATCTCTCTGCCCCGCCCCGCCCCTCCG
-GCCTCCCCACACCCCCCTTGCCCTCACTACCTGTATCTCACCGGCGTGTGTTCACCCTCC
-CGGGTGGCTCACACACTCTCATTCACACACACAAATCTCAGGAACAAACGGTCCCAGAGT
-CCTCCGGACCCCTGCCCAGGGTCTCTGCAGGTCTCTGCCCCACGCGTTCCCGTCGCTGAC
-AAAGCCACCAGCTGCCTCCTTTAAGCTTGGTGCTCCGGCTCTGGGCCTTTCTTGCGCTCT
-AttttttttttttttttttttAAGAAAAACAACAACAACAAAAAAAGACAATGAAAAAAA
-AAACGTCATGTGAGTGAAGAGATGTCACTGTCTGTGGTCTTGGAGAACTAGTCTCGTAGC
-TGAGGGGTGGGGTCCCTCTGTCTGGGGCACTGGCACCCACAGCAGGACTCCGCCAGTCTG
-ATGCCAGGACTGAATAAAGTGTATTTGCCCCGACCTTGCCCTGTGGTTCTGCATGTCTGT
-GCTCTTCCTCAACCCTCCCTAAACAGTTTGCCAGATTCAAGTCCGTGTGATTTGGGCCCG
-AGCTGGGTGTCCCAGGGCAAGCCACCTTGCCTGTCTAGGCCTCTATGTCAGGACTCCCTG
-GCCTTCATGaagaatagcaaactcatccctgtagggaccaggcaggtaacatagacgagt
-gactctgggtggacagtggtgtcatgacccacttcaaggggcctacctcctgccagttgt
-gaccctgtgggaatgcagtccacagtggccaggtggccagatttttcaagaaaagctgga
-tggatgtttctgagtcatcttaatttcaaaatgagactcatattttaaaatttctgtggg
-ccaaatgaaacaagtatgcaggcaggtctggtccgagggGGCTGGCTTGGCCATGCCTTT
-CTGTGCCTTTAATGAGgactaagaagcaagattgggccacactgtctggactcaaagccc
-agctccaccactgagcacccgtgtgactctttccatatgtataacgtggggataataata
-atagctgcttcacaggatGAAATGAAGTTTGAGGTGAGAAGCATTCACCATGGTGCCCAT
-CGTGTTACTCCATTGTCAGAGGAGGAAACGGGGTCAGGCAGGAAAGCAACTTAAAGGAGG
-GCCTGCAAGCAGCCAGGGTCAGAGACAGGGCTTGGTTCTGCTTCCTGGTGAAGCATGGCT
-TCGGGGTGCTGCCTCTCCCTCCCTGTTTGAATCTGCAGATTGTGTTAGGCCCCCAGCTGA
-GGGCCTGGAGTGGTGGGATTGGTCCCAGTGCCTGGCGCACATTGGCCTGCAGAGTAGATT
-AACTGAATGACCAAAGAGCAACAGAAGTCTAGTGATTCTTGTCTTTGAGGTTCTGACTGG
-TGTTTTACAACTGAGTCCAAGGCTTTTCCCTCCTTTGTCCCTCTGACACCCCTCCCCCTA
-ATTCTCATCTGTCAGATCCAGTGTATTCCTAAGCTGGGACAAAGCCTCTGTTTTCCCAGT
-AGGAGCCAGGGCTGAGTGTGGAAATTACAGTGACTGCTTCTTCTCAGCTTCTCTGGTTGA
-AAGCAAGCTGGCGAAGTAAGAGGAGGTAGAGTTGAGAAGGTGTGGAAGATAGGGACAGCT
-GCCCCCAGAACTCCCTTCAAGGGAGGACTTccccagctatgggaagtgccatcagggtgg
-ccgcagctgcagagagccacttcacctgagaccacgcccttcctggggcagcctgtatct
-ggtgtctgagtgaggcatggtataaacacctggtcatttcaatccaacatgggacggaca
-ctgacagacagtactcccagcaggcccaggccagccagggcttcgtcaggcctgcagcac
-aatttgacttcctatgcccaggcctgcttcctcttcttcctcttcttttcacaggtgctt
-attcctaataaacatcttgcaacccaaactcagtctcattgtctgtttctagagaaaccc
-agtctacaacaGAGGGTTCAAGAGACTGGACAAAGGGAATTGGGTCAGTGGCCCAGCAAC
-TGCAGCTAGGCCGGTCGGATGTATCCTAATGTCAAGAGTCTGTTCACCGATGCCATCAGC
-ACCAAACTAGGGGCTGCACACTTTCCTAGTCTGCACACCAGTCACGTCAATTAGAGACTC
-CAGCCTCAGCCCGAAGGCCTTCCAGGGCCCCCTGCTGATGCCATTCTCACTGCCAGTCCG
-TCCCCTGGTAAAAGCAGGTGGGAGGGAGGTCGTCATCTGAGTTTGTCTTACAGAATAGCC
-TGGAATGGGGTGCACGGTAAAATGCCTGACCGGAGATAATGCTAGAgctgtggaaccttg
-ggcaagcctcttcccctttgtgggcTGTACTGGGAGTCGGTAATAGGACTAGAAGAGGGA
-CCATCTCATTTTGGTTCCTTCCATTTCAGATGCTGACCTGAAAGGTCGGGGAGACAGCTC
-CTTATGGGGTCTCTGGGGCCACCTAGTGGCTAAGAGGAGTAGAACCAAGGTTCTGTGCAG
-TTGGGAGGTGGGAGTCGGGGTGTGTCCCAGGCCAAGGAACTGAGTCCCACTCGAGTCTCA
-CTCCATTCATGCATTGACTCATTGCTGGGTCATGCCCCTTGCCTGGGTGGTGTGAGCCAC
-CCTGCTTCCAAGGCTTTCAAAACACCATACGCTGAtgtattgtttctcatctattgctgc
-gtaacaaattgccacaagcttagcagtgtaaaacaacatgcatttgttatttcagtctcc
-atgcatcaggagtccagcatgccttagctgggtctctgctcaggatctcacaaggcagca
-gctggggtgctggtggcccgcattccttcttggagctcagcagccttttccaagctctca
-cggtagtgggcagaattcagttctttgtgcttataggacagagatccctgttctattgct
-ggctgtcagttagtaccactcttgattactacaagctgctcagtttcttgccacatggcc
-cccacagggcctccccagccttctcacaatattgcaacttattttgtcaaggccagagga
-gaatttttctgctgcttggagtcacttggctcagggaaggtttaagctctcttttaaaag
-cctctcctggctgggcatggtgtgttcatgcctgtaatcccagcactttgggaggccaag
-gtgggtggatcacctgaggtcagcagttcgagaccagcctggccaaatggtgaaacccct
-tctctactaaaaatacaaaaattagcctggcgtggtggcagtcgcctgtaatcccagcta
-cttgggaggctgaggcaggagaatcactcgaacctgggaggcggaggttgcagtgagcca
-agaccaagccactgcacttcagcctgggcgacagagcaagactctgtctcaaaaaaaaaa
-aaagaaaaaaaaggaaaaagagagagagaaaaaaaaagccttccctaattaggtcagact
-cacccaggaaaatctcctttttgattaggcatcaactaatgtgggattttatatctgcaa
-aaaatcccttcacctttgcagtatattgtagccttataagagtgacagctgtcatactag
-atttgcccacactcaaaagggaggaggctgtctagggcagctacaccagagactgggaat
-cttgggggccatcttagaattctgcttatcacacacctgtaatcccagcacttcgggagg
-ccaaggtgggaggatttcttgagtccaggagttcaagaccaacctggccaacatagcaag
-acctaatctctagtaaagttttttttaaaaaaattagccaggcacggtggtacacacctg
-tagtctcagctacttgggaagctgaagtaTCATAgctgagaattctcaggtctacatctc
-catcccagacatgactagactagctgccttcttgtcatctccactgatatatctaattgg
-cacctcaaactggacatgccaaaaaatgaactgtttccacagtgctcccaagcctgcttc
-cacagaccacatctgcacagctgatgtgaaatgaaaggctaaagcctctcagttatcctt
-gatgcctcttttcctcccagcgccatctcccttataccctgttggctctaccttcaaaat
-atgccctgtgtcttgtcacttctcacatcttccatggcctctgggtccaggatataaggg
-catacgaagggctccttgcgttttcctttgccccactcatagtcttattgtccacacagc
-agccggagtgatctggttaaactgtaaatcccagcacaccctgccactgttcaaaattct
-ccaaagactctcattcagtagaagccagagtcctcagcatggcctgcaaagccccataag
-aagtagcctgtggctcagcctcggcttcatcttctactttttctgtttctcacatgccca
-gtcacactggtcttgctgttcctcaaaagtgccaatcacacttccgcctgaaggcttttg
-cacatgcttttccctctgcttaagatacccttcctccggctgggcgaggtggctcacgct
-tctaatcctagcactttgggaggtccaggtgggtggatcacctgaagtcaggagttcgag
-accagcctggccaacatggcgaaaccccttctctactaaaaatacaaaattagctgggcg
-tggtgacacatgcctgcagtcccagttactcaggaggctgagacaggagaatcacttgaa
-tccaggaagcagaggctgcagtgagctgagatcgcatcactgcactccagcctgggcaag
-acaaagcgagacttcacctcaaaaaacaaacaaaaaaatacccttcctccagatagccac
-atgtcttacttccttcaggtctcagctcccagggcgccctagagtaggcacagggagtac
-ctcacagtgtcctccctgaccatccatataaagtaacatcctccataaactatcctgtta
-ctttgctttatttttctgaatagcatttatcactatctggcatttatcacctgtagtttt
-tactttttgtctctctctctctaatttgtatgtaagcttcataaggaaggaatgactctg
-GACTGGACTCCATGCCTCAGCACATTCACCCACCCATTCAACAAACATTCTTAAGGGTCT
-Aggctgggcatggtggctcatgcctgtaatcccagcactatgggaggccgaggtgggagg
-atcacttgaagccaggagtttgagaccagcctgggcaaggaaacaagaccctgcctctaa
-aaaatacaatttaaaaaagtatccaggcacagtggcgtgagcctatagtcccagctactc
-gggaggctgagctgggaagatctcttgtgcccaggagttcaaggctgcagtgagccatgg
-tcatgccactacactccagcctgggtgacagagttagaccctgcctgtaaaaaaaaaaaG
-GTGGGGGGCAGGGTGGGgaaggtttgccttgaccaggccgcgtgctaggtgccgggcata
-caaaagtgaaaaacgtgatttgtcctcagtgagctcacaggtctgaggagacacataaac
-ccaggaatggaaatgctttgctggcgatggacagtgagtctgggagaacattgaggagat
-gtttaacccagacaatggagtggggtgtggtcaggtcattccctggaggaggtgatgttt
-aagctgtggcatgaaacctcagtaggatgtgatgaccttagaacatggctacacgttctt
-tgacattcctcctttaaattaccttccctttgaatctgggctgggccttcatgatccatt
-tgtaaccaacaggacacagcagacatggtgctgcaggatttccaaggctaagtcacgctg
-aaccgccatgttgaaaggccaacagccaagactgccatgtggagaagcagcccgggccac
-gtgggaagaccatgtgtaggtagctgctccagttgacagctgagcccaggcaccagactt
-atgagttgagaagcttccaggggattccagcccctcataattcaactcactcccagctgt
-tggagggccttcccagcagaggcccagccatcacagagcagagacaagccatcccttcta
-tatcctgtctgaattcctgacccagagtccacgaacataatgagatggcagttgtccaca
-ctattaggttttggggcagtttgttatgaaggaataactggaacaataggataaggaaga
-gtgaggtgaaggaaaggactttacagatgccagcaacagtacatgggaagacctggtaag
-agtggctgacacagaagctaaccagcttgcggggaaggtgtggagagaggagggtgacag
-gcaagagtgagaaggaCCTTGAAGGTATTTGGACTTTATCCCGAGTCTTCACACTGCAGC
-CCAAGGGGTCAAGGAGTCtttttttttgtatggtaaacatggggtcttgctatgttgccc
-aggctggtcacaaactcctggcctccagagatcctcctgccttggcctcctaaagtgctg
-aaattacaggtgtgagacactgtgcccagccTCCAAGGGGtcttctcttttttttgagac
-cgcgtctcgctctattgcccaggctggagtgcaatggcgcaatctcagctcactgcaatc
-tccgcctcctaggttcaagcgattctcctgcctcagcctcctgagtagctgggactacag
-gcatatgccaccacacctggataatttttgtatttttagtagagacagggttttaccatg
-ttggtcaggctggtcttgaactccttacctcatatgatctgcccacctcatcctcccaaa
-gtgctgggattacaggcgtgagccaccatgcccagccGGggtcctttgaaaacacaaacc
-tgaccactgctgtaaacctttcgatggccccttactaccctcaggataaaCTCTTGAAAT
-TCAAGGCATTTTGCAGTTGACTCCCTCACTCTTTTATAGATTTATCTTCGGTCACTTTAT
-CCTCAGCTACGCCAGGCCACTCTCCAGTGACAATGCTTCCCGCCTCACCCATGCTATTTA
-TCTTTGCTCATGTGGAGGAATTAgtgggactttgggctaatcaccttgcctttcgaggcc
-tcagtttccccatctgtatgattaggtggttggactagaagtttttgttttgttttgttt
-ttgtttttgtttttttgagaccgagtttcactctgtcgcccaggctggagtgcagtgctg
-tgatctcggctcactgcaacctctgcctcccgggttcaagtgatttttctgcctcagcct
-cccaagtgactgggattacaggcatgcaccaccaggcccaggtaatttttttgcattttt
-agtagaaacagggtttcaccatgttggccaggctggtcttgaactcctgacctcaagtga
-tccacctgcctcggcctctcaaagtgctgggattacaggtgtgagccacgacacccagcc
-ttagatgtctcttaagagcatatctagcctggcattctaggagtctatgaAAAGGAGGGA
-GAAAGGTGTCTGTAGCCAAACCTGCCTGTCTGGCTTCTTCTAGGTTGCCTAGCAATGGAT
-GCCAACCCTCTCCCCCATCCTTGGGGGTTTCTTAGCAACCCAGTTTCTCACCCTCTGCTG
-TTTTCAGGGTTTCCTTTTAACTAAATGTCAAGTTTTGCTCTTTCTCCTCCAGAAAACCTG
-AGGCCAAGGGTCTCTGTGTAGAGCTGGATACAACCCAGAATACACAGAGACCTGGGTTTG
-AGGTCAGTGGAGGATTTGCTGTGTGACTTGGAGGTCTTTGACCTCTCTGGCTTTCATTTC
-AGACTGTGATTCCCTGTCATATGCTCCTCAGAGttcttcttcttttcttcttcttcttct
-ttcctcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttcttc
-ttcttcttctcttcttctttcttcttcttcttctttcttttcttcttcttcctcttcctc
-ttcttcttcttcttcttctcctcctcctcctcctcctcctcctcctccttctccttcctt
-ctttcttcttcttcttcttcttttgttttttgagacctagtctcactctgtcgcccaggc
-tggagtgcagtggggcgatcccggctcactgcaacctccgcctccctggtacaagcagtt
-ctcctgcctcagcctcccaagtagctgggattacaggtgcacgccaccatgcccagctaa
-ttttgtatttttagtagacacagggtttcactatgttagccaggctgatctcgaactccc
-aaactttgggattacaagcatgagccactgtgcccagccTGttcttttctattttttgag
-atggagtctcactctgtcacttaggctggagtacagtggcacaatctcagctcactgcaa
-catccacctcccaagttcaaacgatttttctgcctcagccaccaaagtaagctgggatta
-taggtgaacaccaccacaccgggctaattttttgtattatttggtagagacgggttttca
-ccgtgttacccaggctggtctcagactcctgacctcaagtgatccgccagcatcagcctc
-ccaaagtgctgggattacaggcatgagccactgtgcccagccctctgtattgttctgatt
-ttagtatatgtgtgctgaaatgagcacTTCCCTCTTCTCTTGTATGCGTTTGGTTTGACT
-ACCAAATTTattcacttttgcaataaaccgtcactgagcacctactatgttccaggcact
-gtcttaaggactggggattcgtcagtgaataaagcagacatagtcccttccctcacagag
-cttatactctagtagatggaaacgtataatgaataaacagataagtgcacataatgatat
-catgcagtgaAGGGGACAAAGTGTAAGGAAGGGCTACTATTTTAGATGAGGAGGTTGTAT
-CAGTCAAGATGGGCTAGGGaagtcagagatggttgggaagaaaaagcctggcttccccct
-ttctccctccaacttcctgtgggtgcctcaccttgggtgacctcagctagaggccagctg
-acaaaggaggctgagtagcttccaggggtcagctctgcaaagcaggaaagagcaaggaat
-ccactggaagcaagaaggcCCAAAAGTACCTTGGGAGGTACGCCGCTTTTTCAGCTCACT
-CACTGCCTGTAAACTGTCAGGGACCCTAGGATCATTAAAAAATATTTTGAGggccgggcg
-tggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggatcacttgag
-gtcgggagatcgagaccagcctgaccaacatggagaaaccccatctctactaaaaataca
-aaattagccaggcgtggtggtgtgtgcctgtaatcccagctactcgggaggctgaggcag
-gagaatcacttgaacccaggagacagaggttgcagtgagctgagatcacaccattgcact
-ccaccctgggcaacaggagcgaaactctgtctcTCTCTCTCTCTCTCTCTCTATCTATAT
-ATATATAGATAGAGAGAGAGAGAGAGAgtagtaaaatacagatagcataacatttaccat
-cttaaccatctttaggtgtacaactcactggatattaagtatagtcacattgttgtgcaa
-ccatcaccatcatccatcttgagaactcttcatcgtgcaaaactgaagttctggatccac
-tatgcactaactctccatttccccctccccctagctcttagcaaccaccattctgctttc
-tatatgtatgaatttgactatggtatatgtctcatataagcagaatcatacagtgtttac
-ttttcgtgactggtctatttcacttcacatcatgtcctcaaggtttatccattgcagcat
-gtatcagaatttccttctttttaaagctgagtaatattctattgcatgtgtatatcacat
-cttgcttatccattcatctgttgatagacacttgggttgcttccaccttttagctattga
-gaataatgttgctatgaaaatgggtttggaaatttctcttcaagatacactgctttcagt
-tcttttttttttctctctgagacagtctcactctattgcccaggctggagtgcagtggca
-caatctccgctcactgcaacctccacttcctgggtccaagcaattctcctgcctcagcct
-cccgagtagctgggattacaggctcacaccaccgcacctgatgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtctgtgtgtgtttagtagggatgaggctttgccatgtttgtca
-ggctgctctcaaattcctgatctcaggtgatccgcctgcctttgcctcccaaagtgctgg
-gattacaggagtgagccaccacccctggcttcagttctttggggtatataactagaagta
-aaattgccagatcatgtggtaattctatttttactttttcaaggaatcactatgtgtttt
-ccatagcatctgcaccatttttcattgttatcaacaattcacagggttccagtttccccc
-tatccttgccaaaacttgttattctgttttgttttatggtagtcatcctaatgggtatga
-agtgACTAGGATCATTTTGAGACCCAAACAGTCACAGGCTTTTTTGTTGTtgttgcccag
-gctggagtgcagtggtgcaatcatagttgaccgcagcctcaacctccttgggctcaggtg
-aacctcccacctcaggctcccaaggagctgggactacaggcacacaccaccacatccagc
-taatttttgtgtattttgtagagacagggttttgccatgttgaccaggctagtcttgaat
-tcctgggctcaagcaatccacctgcctccagcctcccaaagtgctaggattataggcACC
-CAGCTTCATAGGctttttagcccaggcttgtgatttctttgtcagtataattctctgaaa
-aacttaggtttctggcagggggcagtggctcacgcctgtaatcccagcactttgggaggc
-cgaggcggacggatcacctaaggttagaagttcgacaccagcctgaccaacagggtgaaa
-ccccatctctaccaaatacaaaaaattagccaggcatggtagcatatgcctgtaatccca
-gctacttgggaggcggaagcaggagaatcacttgaacccaggaggtggaggttgcagtga
-gccaagattgtgccattgcactctagcctgggcaacaagagtgaaactccatctcaaaaa
-aaatcttaggtttcttatcgatttgactgtagttaatggtactaaaaccatacccacaat
-acttttcaatataTTGTCCTCAAGTCTGCTTTTTCCCTTTGCTTTCTATCCTAAAGCTGT
-CACTCTCAATGTAATGGCAATTAGCAAGAATAACAGGTGGCAGAGTTGCACCTCTAAAGT
-GATCTTGGCTCTGAGAGTTTTTACAGGACATTTTTCACTCAAAGCCTTTTAAAAATCCAA
-TCTCATACTTTAGTTGATTCTAGCCTTGAAGTACTTTAATTGATAAAAAAGAAAGTTCAT
-AAGGTCATTGGGAAGATTAATTATCCCAGCATATAGTAAATGCTCTATAAATGATACCCA
-TCTTTGTCACttttttttttttttttgagacggagtctcactctgtcgccaggctggagt
-ggcacaatcttgtattactgcaacctccgcctcctgggttcaagcaattctcctgcctca
-gcctcccaagcgagtagctgggactacaggcagcatgctgccactcccggctaatttttt
-ttttttttttttttcagtagagctggggtttcaccatattttctttctttctttctttct
-tttctttctttctttctttctctttcttttcttttcttttctttttctttctttcttttc
-ttctcagagtctctctctgtcacccaggctggagtgcagtggcatgatcttggctcactg
-caacctctacttcaagtgattctcctgcctcagcctcaagagtagctgggactacaggca
-tgtaccaccatgtccagataatttttgtatttttagtagagacagagtttcaccacgttg
-gccaggctggtctcaaactcctgacctcaagtgatccacccacctcagcctcccaaagtg
-ctgggatcacaggtgtgagccaccatgcctggACAAATTTTCCTATTTCTTAATAGATAA
-TCCATCTTGTTTTTCTCAAAAGTAGACAGTTTATCAGGTGTCGTGTCTCTCACCTTCCCA
-CCCTACTCACCTATAAACTAATATAACAATAACAGTaacaataaccataatttgctgagt
-tctaattttgttccaggtactttggataagtgtcttatatgcacatctcatttcactctt
-tcaacccctctgagaggcaagtacttaaattatcttcattttacagtcagggaaactgag
-gcacagagtgtttaaatcatgtaagcagtaagtagtggagctaagattcaaacgcagatc
-tgctggactccagagttcAACTTACAGACACTACATTGTGGCTCTTCTTGGTGGCCCCCT
-CCCCTCCTCCCCAGGCTCTCAGAGGATACAGGATCCCTCCTTTGCTAGTCAAGGCCAGCC
-CATCCCCCTGTATATTTGACTTCATCTCTTCCCACTGCCCCAGGATTTCATCCACCCCTG
-CTCTGATATCAGGGGCCCCCTCCCCTTCTGTCCATGGTGTGGGGCTTTTTGCACTTcaca
-cacacacacacacaggtgcacatacatacacacCCCTTCTCCAAACCACTCCACAAAGGG
-CCCCTGCCTCCTCActttcttgccttccacatcacaccctaaattctcctggccaaggtt
-cccactgacctccttgttgccaaacctaagtcctgttgtcccgctgtgtgtctcttatgc
-acttggcaaggctgagcaggtccttcttggaaatgtgtttctttggtttctatgacacAA
-TGCACCCCCACTCCAAAACACACATACACACATCCCAGATTCTTGCCCCCACCCACCACC
-ACCCGCTATCTCTCTAGATGCTTCTGTGGTTCTTTCTCCTCCTCTGACCTCTTCAAATGT
-AGtatggtggttttaaaacatgtccataatttttttttttttttttgagatagagtctca
-ctttgttgcccgagctggatacagtggtgcgatcaggtgcgtgccaccatgctcagctaa
-ttttttttaacttttaagttttttggagagataggggctccctgtgttgaccaagctggt
-ctcgagctcctgggctcaagcgatcctcccatcttggcctcccaaagtgctaggattaca
-gacttcagccatcgtgcccaaccatgtctataaattctttaagactcctcccactgagta
-acagagtctgtttcttccccttgaatctgagccaaacttagtgactcagactacagtaga
-aatgattctatggtgacttgtgaggctgggtcataaaggcaatgtggcctgactcatggg
-agtcctgagctacagtgtaagaggtgtcaacactctcagctgccatgctgtgaggaagcc
-caactggctcatgcagagagacaacatggagaggccttgaggctatatgaagagagatgc
-ttggccagctcccagctgctccagctccccagtgctccggcttccactgtaaccacaaaa
-gagacaccaaggcagaaccacccagatgagcccttcccaaattcctgacccacagaaatt
-gtgaaagatgataaaaatcattggatttggagtggtctgttatgcagccatagacagcca
-aACAGAGGCAtcttaatctgcttgggctactataacaatttagcatggagcaggtggctt
-gacaacacacatttattcctcaggtctgcagggtgaagagtctaagatcaaggtgctggc
-aaattccattctgctggcaaccaagggcctgacttctggtgtacagacgaccatcctatt
-gtagccccaaatggcacagagaagaagcaagctctcaagtctcctcttatcaggctgtaa
-tccctcccaaaggcccacttccaaataacatcaccttaggacttcaacatatgaatatga
-gggagatacaaacattcagtctgcagcaGAGGGCTTCGTTAGAGCTCTGACCTGAGCACG
-CTTCATCTCAATGTCAttgtttttgccagctctacatccactgccctttttttttttttt
-tttttttttttttttttttgagacagagtctcactcttatcacccaggctacggtgcagt
-ggcacgatcttggctcactgcaacctccgcctcccagcttcaagtgattctcctgcctca
-gcctccggagtagctgggactacaggtgcatgccaccacacccggctgatttttgtattt
-ttagtagagacagggtttcaccatgttggtcaggctggtctcaaactcctgaccttgtga
-tccacctgcctcagcctcccaaagtgctgggattacaggcatgagccactgggcctggcc
-ccactgccctttcttacagtaacagtatttcaatttccctttagggaagctcttcaagca
-ggttctcagtccaagaggtttctctgggttaagcactgccagccacccaaagggtgagca
-agtaaccagccaatcagagacactccagtgggttcagtaaatgacatattatctaactgg
-ggtgaggggaatcaacatcagggcttttcctgagactataaggagaaacagattcttttc
-ccagcagttaaatttgaagtctgtggccattttgctaccatatagggaaaatctgcctga
-cattgaagccaacacagatgagggaagagccaagagataaagagaaagatcctgagcatc
-tggatacagccatgcctgaagccagtatcccttgacttctcaattatgtgagcctttata
-ttccctttgtttaaagccagttcaagttTAAAACTGCCATTTCCAGTGAGAACAATTCCC
-TATGTTGTATCTAAGGCCAAGACCTTGCCCCTGACTCTAGGCCAGAATGTCCTGTACAGT
-GCCATTCAACTCTGCCAAAAGCAAAGGGCATCAACTTCTCCACAACCTGGCTTTCCCTCA
-TCTATTTTACATCTCTGTTAATGGGAGCATCACCCACCTGACCTATAAACATAAAAGTCA
-GCCTCTATCctctctgtctctctccctctctctgtctctctctctctctctcAATCCCTG
-TCACTTCCCTTACTTCTTAGTAACCAAGTTCTGCCAACTTAACTTTATGGACATTTTTCA
-CACCTGCACCCTCCTTTCCATTTTTCCTGCCCACTCCAATTCTTCATCATTTCTCACCTA
-AATTTTTACAAAATCAATAGATAACTAACATAGAGGTGTATAGTAAAAAGTGAATTTCgg
-ccgggcacagtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcagatc
-atgaggtcaggagatagagaccatcctggccaacatggtgaaacctcatctgtactaaaa
-atacaaaaaaaaattagctgggcatggtggcatgtgcttgtagtcccagctactggggag
-gctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagctgagatcgca
-ccactgccctccagcctggtgacagagcgagactccatctcaaaaaaaaaaaaaaaaaGT
-GAATTTCATTCCCACCCTTGCCATCAGTTACCCTCCCCCAAGGCATCTACTGTTACCTCT
-TTCTTGTCTATTTTCCCAGAAGTTCTCTATATGTGCCATCTTTTTGAGAATTTcaaatgg
-aggcatactatcaagacttttcagaacactgcatccttcttcacttgaagtgtgattaat
-ataaataattatagactaatttcttctttctaatggatgcatagtattccacaaagacat
-ataatgtacataactcgtcttccattgatggatatttaagtggtgtcccagttatctgtt
-agcacagaacaaaaccccccaaacctagtggtataacacaataaccacttgaatatgctt
-gtgggttctgtgtgtcaggaattcaggcaggacacagtgaggccagcttgtttctactct
-gcaatgtttgagtcttcagctaggaagatttgaagatttgaaggctgaagctgattcaaa
-tggctggccactggaatcatcttgttcttccccttccccttcgccttctacagtgcaatg
-gcatgatgtcggctcactgcaacctctgcctcccgggttcaagcaattctcctgcctcat
-cctccctagtagctgggattacaggtgcacgccaccatgcccggctatttttgtattttt
-agtagagacggggttttgccatgtggccaggctggtctcgaactcctgaactcagggtat
-ccacccgccttggcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggcct
-catctggttcttcttcactcacttcttttatgcttgaactgggatgactcaaagctaagc
-ttagctgggactgtggtgccttcatgtgtcctctcctgatggtcttggcatcctgacagc
-atggcagcctctaagcagacatggagccctaggtaggcatggtgcctcaggctccaagag
-ctagagttctagcagaagttgcctgtacttttatgtctggaccttagaagtcagagtgtt
-acttccaccgtactccattggttgaagcagtcatcagctcacccaagattcagagagggt
-acaaggatcccacctctctacagaggagtgctaaagaatttgtagctatattttaaaacc
-accacaggttgtttccaatctgtagctattcctgtagttcattttacaggctaacatctc
-ttgaatgtcttcatttctctgcaccaggccaagacactgtcatctctgatctctttgctg
-atctcttgctgtcactcttgtgctcaacatgctgttctcttgacagcagccagaggtctt
-ttcagaatgaaaatcagatcacatcccacccctcttcataacccttccatggctccccac
-tacccttgggctgaagctcaaactccttaccttggcttatgaggccccacaaggtctcac
-ttctgcctgcctctccaatgccatctcctgtcacCATTTGGGGCCTTTAGTTTTGAGCTG
-CAAGAGTTCCTCCCATcacacacacacacatacacacacacacacacacttaaatgagta
-agtaaatagaacatacaaaacgcttaaacactttgcacatagtgagcataataagtttgc
-tactattATTAGACTGTCttcagtaaatatttactgggctgcctactcagtgccaagcac
-tatgggaggctcacagatacaacacgaacaagaAATATGTGGCCTTggccagacgcggtg
-gctcacgcttacaatcccagcactttgggaggccgaggcaggtggatcacttgagctcag
-gagttcaagaccagcctgggcatcatggcaaaaccctgtctctattaaaaatacaaaaaa
-ttagctaggcatggtagtgcgtgcctgtagtcccagctcctcaggcgactgaggtgggag
-gatcacctgagccttgggagatcgaggctgcagtgagccgtgatcatgccaccgcactcc
-agcctggacaacagagtgagacgctgtctcaaaaaaataaaaattaaaaaaaaagaaaaa
-GAAAAACTAAAAAGGAAGATGTGGCCCTATCTTGccgagctcattcttctgtgtgtcccc
-agcccctagcacaaggagaaacagaatagatgctcaaGACACAAAGGCATGTCTGTGCAA
-GGGTGCTTGAtgacggttggaggggcacaatgactttcccaagatcacacagcaaatgtg
-ggacaaaatcaagGCTGACAGCTCATGACAGGGTGGGAGGCAGATGCAGCTGCCTGGCAC
-AGGCTGGCTCTCCAGGGAGATGGGCAGTGGGCACGCATTGCCCAGGGCAGAACTGGGGCT
-AGGGGAGGAAACAACAAGGGAGGCTGTCATTAGCTCCTTCCAAAGTGGAGGTCACTTCTC
-TCCCAACCCCGAGTCCTCCACCCAAACTCCCTTCTCAAGGTACAAGGGCTGATCCCGTAC
-CAGGGATGGGTAGGGACTCAAAGAGGAAAAGAGGATGAAAAGAGGATGGGGACTGAGTGA
-GATGTGAGGACTCCAGAGGGATTAGCGGCTCTCAAGGCAAGTGGGAGGGGACTTCCCGGT
-AGGAGCCCGGAGACAGATGGGAGCCTGTGAAGAGGGCGGGGGCCCGGCGAGGAGAAGCGG
-TTTCTACGCTGGGGTGGGGCTCCATGAGGGGGATGGAGACCTGGAAAAGGGACTGACGGT
-GCAGCGAGGAGAGGAAGGCTCGGTTAAGGGATGGGTCTTCCACGGGAGGGGTGGGGAACT
-GCGGGAGTGACGGCAGCTTCGGTGAGGAGTCTGAGGGGCTGCGTGAGGGGCTGGGGCCCA
-GGGAGTCCGAGGGGTCTCTGTGAGGGCGCTGGGGTGTCCGAGCGAGCAGGGAACTCTGGA
-AGGGGACAGGAGCCGGGGGAGCTGCAGGCGGCCGCCGTCTGCAGAGCCAGGCCCTGAggc
-gggccggcgccccctcccccgccccgAACTGCGGCGCAGGCGCGAACCGGACCCGCCTTT
-GCTCGGCGGAGACAGCAGGCAGAGAGGTGAGCTTAGCCCTGCCCCACGCGCGGCCAGGCC
-CCAGCCCCAGCCCCTGGAGAACCCCCGCGCTCTGCCCGCATCCTCAGCCCGGGCCGTGTC
-CCGCCAGGGCCGGGACCTTTGCGCCTGAGCCTCGGCTTTGGGAGGTGGGGGTCCCAGGGA
-AGCAGCAGGGGCGGGAGACAGAAACAGCCCCATCGCCCCTCGACGCCTCAGGGTTGATAG
-GCTGGGTAGAGGCTTCAAAGGACACCCCCACCCCCGCCAACACTTCAAAAACCCATTCCT
-ACCCCTCTCTGCCTCAGTTTCTCTCTAGGGAAAAGGACGCAGTTGGTGTGGAGCAGGGCA
-TCGGTGGTCCTGTCAGGAAGAGTGGCGCGGGTGCCGGTGGGGAAGGGAGGCGGGAAATGG
-CCTGATTTCCCCGGCCGACACCCCCTACCCATCCCCCCCGGGAGGGCGCCCCTTCTCCCC
-CGCCCGGGCAGCGCTGGACGCTGTAGTGGGCGAGTCTGAGGGTCTGGGAAGGACACAACT
-GAATGAGGCTGTGCAGAGGCGACAGATTCCGTCCATCTTCGGGCCCTGGCTTCCGTCACT
-TCCGCCCGTGCCTGCCGCCCCTCGCCTCCTCCCTCCGCCGCAGTCTCCCCACGTCGGACA
-GCGCAGCCCCCTCCGCCTCCCGCTCCCCTCCCACCGAGCTCCTCCCGGCTCCCGGGCTGG
-GGACGCCTCCCTAGCGGTTCCCATGGCAACCCTCGTCCCGGGTGCCTgcgccccgccccc
-cgcccgccAGACCTACTCCGTGCAGCCCTGAAACGCCAGGCGGAGGGGCCAGGCCGAGCG
-GGAGGCAGCGTCAAGGTCACCTTCCCTCTCCAGTAGCAGCAGGACTGAGTGATTCCATCT
-ATTTGGAGTCGCGGAAGCGGTGAATTGGAGGGGAGGAGCTGACCCAGGTCAACAGCCCCG
-AAGCCCCCTCCACACCTCCTCACCTGTGGCCTTGAACAGTGGTCTCCGCACGGAGGCTCC
-TACCGTCCCCCAGGCCCCATTTCTTCTCCCCACCCGGGCCTCCCCAGCGCCTCGCCGGGG
-CGGGTACCGCGCTGGCCGCACCCTCCGCACAGCCCGCCCCGCCCGCCTCCTCCGGCGAGC
-CCTCCTCTCCAGACCTCTCGCCCTCCTCCTCCGACGGTCCTTCGCTTTCAGTCTCTGCCT
-TTTCCCGTTCTCTGTCGTGGCTTTTGTTGTTGTTGTTTTTCCTCCTTTCCTTCCCCGCTC
-TTCTTTTCCCTGAATTGTAAGTGAGGAGGGTGTACAGCCACTATTTATGGACAGGCTTTC
-TTGACAGCAATCTTGTGTGCCGTGTGACTCCAAGCAGAACCTCCAACCgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtCGTACCTATCTGGGTATGTCTCTGTATG
-CTTTGTGAGTATGTCTGTGTGTTTCTCTGTGCTGTTTCGGTGAGTTTCTCTATGCAGGGA
-TTTGAGGACCACATCTGATTGGAAGTGAGGGGCAGCTGTCAGGACCTTTATCTTACCCTT
-TGGAACAAGCACATTGTTTCATTTTGCAGGAGGCTGCTAATTAAGGCTGAGGGCCATCAT
-GGAGACTGGGGTAGAAGCCCAGTCCTCCCCCAACACCTCCTGGCTTTGGTTCGGGCCAAA
-CCTGTATATGGATATACAAGTACCTTCCATTCCCAAGATCCGTGTCCACTTTTGTGGAAA
-AAAAAAAAAAGGTTATTTGATAGGTTTCTCTGGAAATCTAACAGCCCTTAAGCCTAAGAG
-TCTTTAATCCTGAGGGACCCTGACTTTCACTTCCAATGGAGTCAAAATTCATTGGAATCT
-GGAGGCTTTCAGGGGCAGTCCTGGGGAGGACCTTTTTATAGCCTTGCAGCTTGGGAACTC
-CAGCCCAAGTGTCAGCCATGACAATTACCCCCAGGAGGGGGTCTGAAGGGGAGCGGAGGG
-TGAGGCTCTCTCATTCCAGATATGGAGACTAAAAAGTTCAAGATGGAAGTAATAGCAAAA
-AAATTACAGTACTAATCACAACAGCTACCATTTCTCAGCATTAGAcacagtaactgtatg
-aaagaagtatgattattaggtctgttttacagatgaggaaactgagacccagaaaggtgg
-aagcacttgtctaaggtcacgcctccaggaagcagtgtgtccacgactccagtccaagtg
-gtcaggctccagagcccacagtcccaggtactGGGTGGCCTCCAGAGTAAACATGCAcat
-ttattgacacctccaattgccaggcactgggctaaggccttcagtgcattggctcattCG
-CAGTGTGCTTTGGGAAGGACAGGCTGGGATTCCAAAAGGCCAGACTGTGCTATGCGTGTA
-GGGTGTCTCGAGTGGGAGGAGAAGCGGGTGGGGCACAAAGATTTAGGGGGCTTATGAAGG
-TCACCATGAGCAGCTCCCACTAATCCCTCCCTCCGTCAGCTGCACCTTACCTGCTCCCCA
-GGGGTCCATGATGCCGAGCTGCAATCGTTCCTGCAGCTGCAGCCGCGGCCCCAGCGTGGA
-GGATGGCAAGTGGTATGGGGTCCGCTCCTACCTGCACCTCTTCTATGAGGACTGTGCAGG
-CACTGCTCTCAGCGACGACCCTGAGGGACCTCCGGTCCTGTGCCCCCGCCGGCCCTGGCC
-CTCACTGTGTTGGAAGGTAAGGCCAGATGAGCACCTCCCATGATTCCTCTGCCTTGATGG
-AGGAAATGAGTCTGAATTTGAGGCTCAGAGGAAAAAAGAAGAGATAGCgtagtagttagg
-agtcttgcacagtcaagcaacagaaaacccaattcaaatgggtttaaataatgaagggag
-ccttcattgTATTTGTATTTACAtacaaattatttacataattatttacatatttattGT
-ATGTAAATAATggtggctcatgcctgtaatcccagcactttgggaggctgaggtgggcag
-atcacctgaggtctggagttcaacacctgctctgtcagcatggcgaaaccctttctctac
-taaaaatacaaaaatggaccgggtgcggtagttcacgcctgtaatcccagcactttggta
-ggcggaggctgaggctggtggatctcgaggtcaggagttggagaccagcctggccaacat
-agtgaaaccctgtctgtactaaaaatacaaaaattagctgggtgtggtggcgggcgcctg
-taatcccggctactcgggaggctgaggcaggagaatcacttgaaaccaaaaggtggaggt
-tgcagtgagctgagatcaatccattgcactccagcctgggtgaaagagcgaaactccctc
-taaaaaaaaaaaaaaaaaaaaatgagccgggcgtggtggcaggcgcctgtaatcccagtt
-acttaggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtgagcc
-aagtttgcaccattgcactccagctgggcgacagaacaagactctgtctcaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaagaaaaaaGAAGGGAAAATGTTGCTCATTTTTTAGAAGAGA
-CCCAAGGTCCAAGGTTGCATACTTTCAGGCAAAGTTTGATCCAGCAGTTCAACCCTTTAT
-ACCAAGGACTTTGCAAGTTTTCTTAGTCTTCAGCCTCCTCATGGTGCCCCTACCCTGGTA
-GCCTGTTAGCTTCAGACTCTCCCCACATGTTCCCCAAATGGCCACTACTGTGTGGACTCT
-CAGGTCTTCACTCCACACCATCTAAGGGAAGTCAGCATTTCCTGTGGTATTTCCTTCAGA
-AAAGAAAATAgcctgtaatcccatcattttgggaggccaaggtgggtggatcacctgagg
-tcaggagttcgagaccagcttagccaacgtggtgaaacctcatctctactagaaatacaa
-aaattagctgggtgtggtgatgggcgcctataatcccagctactctggaggctgaggcag
-gataatcactagaacccgggagacagcagttgcagtgagcagagatcgtgccgttgcact
-ccagcctgcacaacaagagtgaaactctgtcttaaaaaaacaaacaaacaaaaaaTGGCC
-ACAGGTACtggcttacacctgtaatcccagcactttgagaggctgaagcaggaggattgc
-ttgagcccaggaattcaagatcagcctgggcaacatagtgagacttcatctctactaaaa
-ataaaaaattagctggatgtagtggcgcgggcctgtgatgcctactactcaagaggctga
-gccaggaggatcgtttgagcccaggaggttgaagctgcagtgagccatgattgtgccact
-gcactccagcctgggcaacagagtgagactctgtcaagaaaagaaaagagagaagaaagg
-aagaGAGAAAGCAAAATAGTAAgatattaaaaacatgttaccatttaccttagcaccaaa
-gaagagagaaatacttaggtgtaaatctaacaaaatatctgtaatatgagaagaactaca
-aaactcaaaagatatcaaataactaaataaatggagaaatagttcatattcgtggattgg
-aatagtcaagatgttagttcttcccaacctgatctttgattcaatgcaatgccaatcaaa
-accccagcacgttattttgtggacgtcaaAATGTCACCTCCTCAGGGAGGAGATCCCTGG
-ACTGAGTCGGGTCCCTTGCTTTACTCTGGGCAAACTCTGTGCCCATTCATTCTTCAATAC
-ACTTACCACTTTGCACACTTGTAGTTTATATGGAGAGGTAAAAGATTCAGAAATTTAAAA
-ATCATTTATAagaaacaatgcttttaattcccagaagtcctgacaagcattgtgttggct
-ctcattgggtcacttgccagccttgaactaattactatggttaagagatggactatgctg
-actggcAGGAAGTGAGGTTCATCTCACTTAAATCTTACTGTGGTTTCTCAATGGTAGACT
-GGAGTACCTTGCCAGGGCAGAGAAAAAATGTGAAGAATTGATGTCTTTAACAGCCAAGGA
-GACTAGTCGGCCAGGGTGCACCAATGGGTCAAGGTGTAGAGGTGGCAATGAGCTGAGTGC
-CTGCTATGGGCATAGCTCTTTGCTAAATATTCTCGGGAGACTGAGGCAGAGGGTCCCTTC
-TTTTGCTTTCAAAGGACTTCACTCTAGTGAGGAGGTAAGGTGCCAACCTCTGCAGAGAGG
-CCAACTTACATAACTTCAGGTCAGGTCTGTAGGGAACACCAGGAGAGGAAATGATCAAGG
-AAGACTTCCAAGGAAAGGTTAGTGTGTATTTaaaatttttaagcatcttcttattgcgag
-gcactgtgctaggctcttgggaacacagaatttaagacatgaggtccctgtcttcgagga
-actcTTTTAGCTGTGGTTTatttaatcattcagcaaacatttattcagcctttgctctgt
-gccggcacgtgctaggcacagaagactcctagtgagccaaaacaggcacagtctgctctc
-atggagctctcagtactgcgggagaggcagacgtcacttacatagcaaccaaaatacatg
-tccaagtgtgcacaatggtaagtgtattgaagaatgaatgggcacagtttgcccagagta
-aagcaagagacctgactcagtccaggggtcttctccctgaggaggtgaggtttgagatga
-gatctgatggtgcataggagttaacccaacagagacaggaaggtagaaaggATAAAGAGA
-TGAGTTGGGATGGAGGGAAACACAGGGTTGGCCGGAGAAACCCACTGCTAGGTGGGAGCT
-GGGAAGGAAATTAAGAGGCCTCAGGATTCCAAATAAAACATGACAGTTTATGCCTCCTGT
-CAGTTAGACCCCAGCAAGTGTGTTCTGTGATTCCCATCTCCTGAGGATGGATCAAGGGGT
-TACCCTTAAGTCTGGTGAGGATCCAAGGTGATCCCTTGGCCAGGGGCCCCTGGCTGACCC
-TGACTGCTTCCTGGTCTGTCTGCTTCTCCCTAGATCAGCCTGTCCTCGGGGACCCTGCTT
-CTGCTGCTGGGTGTGGCGGCTCTGACCACTGGCTATGCAGTGCCCCCCAAGCTGGAGGGC
-ATCGGTGAGGGTGAGTTCCTGGTGTTGGATCAGCGGGCAGCCGACTACAACCAGGCCCTG
-GGCACCTGTCGCCTGGCAGGCACAGCGCTCTGTGTGGCAGCTGGAGTTCTGCTCGCCATC
-TGCCTCTTCTGGGCCATGATAGGCTGGCTGAGCCAGGACACCAAGGCAGAGCCCTTGGAC
-CCCGAAGCCGACAGCCACGTGGAGGTCTTCGGGGATGAGCCAGAGCAGCAGTTGTCACCC
-ATTTTCCGCAATGCCAGTGGCCAGTCATGGTTCTCGCCACCCGCCAGCCCCTTTGGGCAA
-TCTTCTGTGCAGACTATCCAGCCCAAGAGGGACTCCTGAGCTGCCCACATGGCCTAAGAT
-GTGGGTCCTGGATCCTTCCCCCCTTCTCACCATAACCCCCTCTCAGTGTTTCCCCAACTT
-CTCCCTTTTAGCAGGGTCCCTTTAGAGCCCAACTCCAGGTCAAATCTGGAGCTCAAATCC
-CAGTGCTCCCTCCCCAGGAGTGGGGCCCCAACTCTTCCAAGATACCAGCATTCCTCAAGT
-CCTCCCAAAACTTCCTACCCACACCCTCTTCCCAAGGCCCTCAGGGGCAGAAAACATCTC
-CTTCAACCCGTCCCCACTCCTTCCTctgcatgaccttgggcaaacccttgccctttcaag
-ccatcagctcctgcctctctgccatgagggctttggatcagatTCCTCTTCTCGCCAGGA
-TGAGGACACGCACTGCCCTCCATAGACACAGATGAAGGGGTGGGGGTCATTCAGCTCGAA
-TGGGTCCCAGATGCTCACTTGGCCTTTCCCTGCAGGATGAGTGAAGACGTTTGCCTCTCA
-CAGTGTGTCTtctacctgcattttggcatcagagccccccagcccacccaccacaggcaa
-ttactagccctagttgataggtgaggtgggtgaagaaggctggaggtgacatgtccgagg
-tcacacaacaaagcagcatgcaggaactagaaacacatcttcagcctccTCCTGGGCCAG
-CTCTTGTGCTACAGGTGGGGCGGAGCCAGCCCCTCACCTTCCTGGTTCCCTGAGGGTCCT
-CAGGGTGGAGGACAGGTTTGGCCCAGAAAGACTAGCCAGAGGCCTGATGGTCCCAGGTGG
-CTCTGGATATACTTTGGATATGGATTTAAATGGTCTCTAAGAGCCGGGGGTAGGGGGCAG
-GAAAAGTGGGTTGTCTTTGCCCCTCAAAGTCCACCTACCTAGAAACCAAGCCCACGGTCT
-TGGCCGTGACCCTGATAATAAATGGGCTCTCTCAGAGGCGCCAGCCCCTCCCTCCCCAGC
-CGGAGGCGTCATCTCTCTTCTGTACCACTAGAGGGAGCTCTGATGCAGCTGGAGAGCAGC
-GCTCAAGGCTCTCGCCCCTCCCCTCCCTAACCCTTACCTTCAGTCTCCACCAGCCTGAAG
-GGCCTCCTAGGGGATCCTCAGGCGGCCCCCACCAGGGCACACCCTACTGTCCTTGTGCCT
-CACGCCCCCTCCTCATCCTGCACCCCTTCCATCCCACCTTCCCTTTCAATAAACAGCTGG
-GATGGATACTGACTTTGTTTCCTTTCTCCCTGGCCACTGGGGCGTGGGGAGGAGAAAGAC
-ACAGACTCAGgagcacctactgtgtgctgggcacgacccattatttctcattcgctcctc
-aggataacctgttgagaaaggaattattgtcttcttttttttttttttaagatgttgtct
-cgctctgtcgcccaggctggaatgcagtggggcgatcttggctcactgcaacctctgcct
-cctgggttcaaccaattctcctgcctcagcctcccaagtagctgatattacaggtgcacg
-ccaccacgcctggctaatttttgtatttatagtggagacggggttttaccatgttggcca
-ggctggtcttgaactcctgacctcaaatgatccgcctgcctcggcctcccaaagtgctgg
-gattaccgggtgagccaccttacccagacttattgtcttcattttacagatgcggtaact
-gatgatcagagaggtgagtgatttATTTTTTAtttttatttttaattcttttttattttt
-ttcgagacggagtctggctctgtcacccaggctggagtgcagtggcacgagctcagctca
-ctgcaagctccgcctcccgggttcatgccagtctcctgcctcagcctcccaagtagctgg
-gactatgagtagctgggactacaggtgcctgccaacacacccagctaattttttgtattt
-ttagtagagacagagtttcaccatgttagccagcatggtctcaaatctcctgacctcgtg
-atccgcccgcctcggcctcccaaagtgctgggattacaggcgtgagccaccgcgcccggc
-cTATTTTTAATtctttttatttcagtagcctttggggtcaaagtgggttttggttacatg
-aattagttctatagtgattctgagattttagtacacctatcacctgagcagtgtatactg
-tacccaatacgcagttttttatccctcatcccctcccaacctccctggactcagtcccca
-aagttcgttatatcactctgtatgcctatgcatcctcatagcttagcttccgcttatata
-agtgagaacctaccgtatctggatttccgttcctgagttacttcacttaggataatggcc
-tccagctccacccaagtcctgcaGTGGATTTAAATGCTCAGCCTAGGGCCTGGAGGGGTG
-GCTGggccaggcgaggtggctcacgcctgtaatcccaggactttgggaggccgaggtggg
-tggatcacctgaggtcaggagttcaagaccagcctggccaacatggtaaaaccccataac
-tactaaaaatacaaaaattagctgagcatggtggtgcatgcctgtaatcccagctactcg
-ggagactgaggcaggagaattgcttgaacccgggtggtggaggttgcagtgaaccaagtt
-cacaccattgcactccagcctgggcaacagagcaagcctctgtctcaaaaaaaaaaaaaa
-aaaGTGCTTAGCCTGATTGGCCTATTGCCTGAGTGTGGAGCTCCTGTCTTTGGGTGGGAA
-GGAGATTTCTCAGCCACCTTGAGAACACACTTCCTCTAGTTCTGAAAGGAATGTGAGGGC
-CAGGGTGTGGGAGAGGGGGCTGAAGCCAAAGGTAAGATCTTTTCCAGGCCTGGaagagta
-attaaccccttttggcactcaccaggggctgggccttgttcttagtgccttacagaattc
-gggaattcatttaaccaggacgacaacctctgaggtggcggctattattctcaaacctag
-tttttcctaaactccaggcttgcgttcccatctgcattcacctggatgttgaatttaaac
-tcaactatctcaaactgttctccttgttaccacccctccctgaccaaacctgcctctact
-atgctgcccacgtcttagagagtagcgtccccattcttctggctgctccagccaaaacct
-cctctctttcctcacaccctgtatccaatccatcagcaagtcctgtcaactcaaccttgg
-aaatatatcctgtacccaactacacctcgacatccccgtggctgattccatggtctgaac
-caccagcgaccagcgcctcgatctggatcattgcaccagcttcccccggtctcctggctt
-ctgagttttgaaccccaccctactccacgccttgactccccaagtctaattactacacag
-tagccagacagatcttgttagaacataaactaggtcatgttcctcctccgctccaaacct
-tcccatggctcccacctaactcagagtagccaaaaccctccctgtggcctccaaggccct
-acacaatttgctgatttccactccccccgcactttcctctgtaaccccaactcccaccac
-tctccaggttcctgtgtcctctccagccaggatcctgactcagggcctttgcctcactgt
-tccctctgctggggtactcctccccagttgacgacatgggcagttccttcaagtcgttgc
-tcaaacatcaccttctcagcaaggccttccctgagcagcctattagaattgcaACCAggc
-caggcgcagtggctcaagccagtaatcccagcactttgggaggccgaagcaggtggatct
-cctaaggttgggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaa
-aatacaaaatcacccaggcatggtggcacatgcctgtaatcccagctactcgggaggctg
-aggcaggagaatcacttgaacctgggaggcggagattgtggtgagctgagatcgcaccat
-tgcactccagcctgggcaacaagagcgaaaccccatctcaaaaacaggaaaaacaaaaaa
-caaaaaaaTGCAACCATGCCggccaggtggagtggctcacacctgtaatcccagcacttt
-gggaggccaacgtgggcagatcacctgaggtcaggagttggagaccagcctgggcaacat
-ggtgaaaccctatctctactgaaaatacaaaaattacccaggcatggtggcacgtgtctg
-taatcccagctacttgagaggctgaggcatgacaatcacttgaactcgggaggtggaggt
-tgcagtgagccaagatcgcgccattgcattccagcttgggcgacagagcgaaactccatc
-tcaaaaaaataaaaggaaGCTAACACAGAGTATAAATGGTGCAggcagtttgacaatatc
-aaaatagaaaatacacatgccctttgatttctccctcttatgcaggtggatctatagatt
-caactctacatgttggaacactatagtattatttgtaattaaagcatttggaaacaacct
-aaatgctcatggtaggggactattaataaaatacggtaAggctgagtgcagtggctcacg
-cctgtcatcccagtactttgggaggccaacgcaggaggatcacttgaggccaggagttca
-agaccaacctgggcaacatagggcaacatagcaaggccccatctctacaaaaaattaaaa
-attagctgggcatggtggcacacgcctgtagtctcagctattaatatttgggaggctgag
-gcaggaggatcacaccactgcactttagcctgaatactgagtaacaaagcaaaaccctgt
-ctctcttaaaaaaaaaaTTGGGGGGAAGGACAAGTCTTttttcttttcttttcttttctt
-ttctttttttttttttttttgagatggaatttcactcttgttgcccaggctggagtgcaa
-tggtgtgatctcggctcacggcaacctccgcctcctgggttcaagcaattctgcttcagc
-ctcccgagtggctgggattatagtcatgcgccaccacacctggctaattttgtattttag
-gtagagacggggtttctccatgttggtcaggctggtcttgaactcccaactcctggcctc
-ggcctcccaaagtgctgggattagaggtgtgagccaccgtgcccagccAGGacaagtctt
-cttacagaagaattccaattagtaaatgtagaaggattgagagaaattgaaaaatcatca
-ttagaacaccggaataataattgctgcaggcaacatctaccaatgaacaataaaatgagt
-gggtgaaactttaaggagaaacaaggttttttttttagaaacgggatcttactacattgt
-ccaggctggtctggaactcctaggctcaatgggatcctcccacctcatgctccccagtag
-ctgctactacaggcacataccaccccaccaggcttgaaacaaaatatttgcatagcctca
-aagtatctatccccaaatatgtattaattagtatggtggttttaacatatgcatacatgt
-tctttgatgctctgccatctaggaaatggagcttaatttttctcctcttgagtgtgggct
-ggactcagcaacttgcttctaacaagtagaatgtggaaaggcaaaaacagtgacttcaca
-gtggaaaaatctggcagacaccaccttaaccaaatgaaggctggcaccaccagtcaaaag
-tcttgttgatatcacagcctctgaaatgatgtggtgagaagggcacttggcctgagtggc
-attcttcccccaaatccgtaacgtcagcctaatcatgagaagacccattctacaaaagat
-ctgaccagcactcttcaaatgtgtccaggtcacgaaagacaaggaaaggacaagaaacgg
-tctcaggttggaggagactaaggagacgtggctgaaggatacacaggatctccctgtact
-gtccatgtaactcttcaataaatctacaattatttcaaaatagcaaaaaatacgattGCT
-ggccgggcacagtggctcacgcttgtaatcccagcactttgggaggccaagaagggcaga
-ttacttgaggtcaggagtttgagatcagcctggccaacatggtgaaaccctgtctctact
-aaaaatgcaaaaattagctgggcgtggtggcatgtgtctgtaattccagctgctcgagta
-gctgaggcaggagaatggcgtgaacccgggaggcggagcttgcagtgagccgagattgcg
-ccactgcactcccgcctgggccacagagcgagactccgtctcaaaaaaaaaaaaaaaaaa
-aTTACTGTGGTCAAGATGGAATAACAGGGATCTGGTTTAACACACCCCAAAAAGGACCTA
-AGAAAGGACCATTCCCTCTCCTCTCTGAGGTGGGAAGATCTGGGAAGGAGAGGAGGCTGA
-CCAGTGGGGTCTACCTTCTGCTCCACCCCTCTTCTATCCAAGAGTCTGAGCACCCAACCC
-CCACACCACCCTGGAGGCTCCCGCCCTCGTGCTGAGTCTGGCATGCCCTCCCCATCCCTA
-CTGGCCCAGGGGACTAGGTTAGCTCAGAGAAGCCCTTCTAACTCACCCACAACTGGACCA
-AAGAAGGATTGATCTGGGGCCACTGCCTGGTCCCTGGGAGCACTGTGCTAGGGCAGGGGG
-CTGAGATGCCCCAGGGTAAGAGACAGAACAGTGAtttttttttttctaagacagagtttc
-gctcttattgcccaggctggagtgcaatgcgcgatcttggctcaccgcaatctccgcctc
-ccaggttcgagcgattctcctgcctcagcctcccgagtagctgggattacaggcatgtgt
-caccacgccccccggctaattttgtacttttagtagacacagggcttctccatgttggtc
-aggctagtctcaaactcctgacctcaggtgatcctcccaccttggcctcccaaagtgctg
-ggattacaggcatgtgccaccgcacccggccAAAAACAGTGATATTCATATAGATGGGGG
-AGGGATTAATGGGGGTGGAGTGAGAGAGAGCCTGCTGGAGCAGTCCGAAAGGCAGGCATT
-CCTTCTGTTCAGCAACATTCCTGCCCCCACAATCTCCTCCCACAACTTATATCTAGTgca
-ggctgagagtgaatctgtctgccagtgttcaagccactgtgtgaacctgagtttcttaac
-cgttctgagtgtcaggagtttttttcatctccaaaataggagcaacaaggataccaatcc
-cttgagattgtatgaagcttaatgcacttaacacagcacctggcacgtagacatgctccc
-taaatgccagctgttattatGAAAGAGAGAAGTCTGAGGTTCAGAACTAGCAGGCAACAC
-ATAATCtataatgatggatggctcagacagggtcctgtcctatagggactcacagtctag
-tggaaaggacagtcctgtggacagcaaatggcaaTATACCTGGGTAAGTACTGTAATAGA
-ATAACAAAGTAATATCCTATCACGGGGCAGTCACGGGGGCAGTGAGAGACAagcgcttgt
-ccatgccaggctctgtactcagtccatcacatacattaggtcttgcagtcctcataccac
-cataaggtggttaccattatctccaattcacagaaaagcaaacagtatggagtgtttaag
-cgtcctgtccgagatggcatagctagtggagctgaaatttgaacccaagtaatccaggtc
-cagaatGCCCCGGATGCAGAAATGACCACACAGATTCTACCAATGAACTAACCTGATAAG
-GTTGGAGGTCATACTCATAACCCCTCACACAGGTCCACACAGACACAGGCAAGCACACCC
-ATGTCTATTCAGATACACACCAATTCCTGTCTATGACGAGCGCTCAGAAAATCCTCCACA
-ACACCACACCAGGAATGATGTGCATTTTGAGAAAAAAAAAAATCAGCTCTGAAGACCTCA
-CAGACACATGCAGTGAAATGTAAATGGAGGGACCCACCCAAGTTCTTGAATAGCACATTA
-CATGCCTGGATGCACATCAGCGGGCATGTAAATGATGACGAGGAGGTCTGCAGACACTGA
-CACGCTGCATTTGCACTCACTCTGCTACTGAATTTTTTAGCagctacatttactgagcac
-ctactgtatgtaaggAAAGATAAAGCagccgggagctgtggctcacgcctgtaatctcag
-cgctttgggaggccaaggcaggtggatcacctgagctcaggagaccagcctggccaacat
-ggtaaaaccttgtctctactaaaaataatacaaaaattagctgagtgtggtggcatgcac
-ctgtaatcccagctactcaggaggctgaggcaggagaatcgcttgaacccaggaggtgga
-ggttgcagtgagccaagatcacgccattgcactccagcctgggtgacagaatgaaactct
-gtctcaaagaaaaaaaaaaaaaaaagtaaaaaagataaagctcagagaagtgaagtggct
-tgcccaaagtcaaatggctgagattcaaaccctggccctataatattaggcaacggtgtc
-tccctccaccactgtgcAGATGCATCCATGAGTGAAGAGATGTGCTATGGCTGGATTCCC
-TCATTGACATTCCCTGTGACCTTGGACATGGCATGGCCTTGTCTGGCCCACATTCTCATG
-TTGAGTCCATTCACAGGTGTGCTCCATGGATGTGCATGGATGGGACCGGCAACCCTGGCC
-TTGCTCTGAGTCTCAGCTTGGCTTGGTGTCACCAGGGCTGTGAGCTTCCAATCCCAGCCT
-TGCCATGTCCCAGAGCACATGGCTCAAAACCAAGCTCTGGGCATCAGGCCAGCAGGGCCC
-CTGTGATGGAAGAACTGACAGGATTTCATAAGCATCCGGCCCGGGACACGTGGTCAGGGC
-AGGGAGAAGGGAGATAAACAGGATGTCCACCAGGGTGTGCACCTGGGCAGGGTCCATGGA
-CCAGGTGTGGCAGGGGAAGAGCTGTCAGGACTTGGCATCTGATGGGCACTCAGCAGATAT
-AGGCTGTGTGAGGGGAGGAGTTTGTGGGGAGGCAGGGCTGCAGCTTTGCTTCCATCCTGG
-AGGCCAGGAATGAGGGAGTAAGTGAGCCATTGACTCaatgaatgaatgaatgagcgagtg
-agtgaaggaaggaaggggtaagtaaataagtgaagaatgGAATGGGGGAGGGAGTGAatt
-tatttatttatttatttatttattttgagacagggtcttgctctgttgcccaggctggag
-tgcagtctcagctcactgcaacctctacctctcaggctcaagggattctcccacctcagc
-ccccagcatagctgggactacaggcgcatgccgccacatcccgctaatttttgtattttc
-tgtagagatggggtttcgctatgtcggccaggctggtctcaaactcctgggctcaagcga
-tctgcctgcctcagcctctgcagtgctgagattacaggtgtgagccaccgtgcTGAGCTG
-TGAatttattttttacacaaatctgagtgctcactctgtgctggccctggacgggtctct
-gtggatgtctggtgagcaggatggacacagcccggtcattgcaacgctaaaagCTTGAAT
-GACACCAGTCAGGCTGGGGAACTGGGAGGGCCCTTGACATGCAGAGTGACTCAGCCAGTG
-TGAGCAGGGGTTGTCAGCATGCCTAGGGGAGCAAGAGACTGTGAGAGAtgtgtgtgtata
-cttgtgtgcctgtgtgtgtccgtgtgtacacatgtgtgcgCCGACACAGCCAGGTGTTGG
-CCAATGCAGGTGTGGTGTCCTCAAGAGCACAGTGCATCCTGATTCTTCACCCTCCCAGGC
-CTCCCCTGCCCCTGTTGTGTGCCAGCTGGGCCTGCCCCATGTTATGCCTGACGCCCACGC
-AAAAGCTGCTTCTTCCAGTCACAGGACAAAGGCATCCTCAGCCCAGACCCTGTACCCCAG
-GGGTAAAGACCTCTCAGACCCCTAGTGCTCCTCAGCATGGACCTCTCCACCAGGAGCCTC
-AGAGTTGTGAGAAGCACAGGCACCCAAAGCCCACCGCCCTGTGTCCATGTGCATGGAGTG
-TGCCCAGGTACACGCAAGGGCTGGAGATGCCCCAGGGCGGTCCAGACAGACGTGCAGATG
-ACACATTGGCCACTGAGTTTCCACAGACACTGAGCTAAGTGCTTTCGAGACACActgggt
-gaccttaggcgtatcaccctctctgagcctcagtttctaatctaaaagtagggtaattat
-actcacttccagtcttgttagaataactcaatgCATGATCAGCTCAACACATCATGATTA
-TTTTTCCTGAGTTCCTGCCTTCCCAGCTATATTGTCTATTCCTCAACAGTACCCACTGAG
-TCTTATATCCCCGTTTCTCCTATGATACTCCATTACACAGGACTCAAATAACTACCTGCT
-CTAAGAATTGCTGAGTGACATGTAGTCCTCATAAATAGCAATAATAGTCACTAACATTTA
-TATAACaacaagagccagcaattttgattttttattgtgtcaggcattgtgctgaacact
-ttacattccttcattcatttgacaaacattcactgaacacctggtaggtgctgggctctg
-tgctagacctgcagatgcagcatctctgccctcaaggttcttacattctgatggggaaga
-agagacagacaaaagacagtttggcggggcacagtggctcacgcctgtaatcccagcact
-ttggtaagccgaggcaggcagatcacttgaggtcaggagtttgagaccagcctggtcaac
-atggtgaaacccctgtctctactgaaaaaatacaaaaattagccaagtgtggaggtaggc
-atctgtaatcccagctactcgggaggctgaggcacaagaatgacttgaacctagaaggtg
-gaggttgtagtgagcagagatcgagccactgcactccagcctgggcgacagagcgagatt
-cagcctcaaaaaaaaaaaaaagataatttaatacataaatgggataatttcaaaccttga
-caagtgctacaaataaaataaggaagagttatggattagagacaaactgcagggattagg
-tggggcatgatgcttgatgagtgatcagggagggcctctctgaggagcaaatatttgatc
-tgagacctgaagaagaaggaagagcctggaaagatacaggaaaagttccaggcagatggc
-atagcaagggcaaaggccctggggcaggaagaacttggtaggttcgaggactaggagaaa
-gggaccatagctggagGATGATTCAGCAAACCTGGCAGGTCTGTCCTGGATGACTCAGCA
-AGCCTTGCAGGTCTGTTCTGGTTTCAGAACCCAGGCATTTTGTCCTTCACTCCAGGCTGC
-CTCAGAGACATGCATCCCTGCCATACACAACAATGTGTGCACGCTGGCACACATGCACAT
-GCATGCACACACACACTCTGCATGCTGACACACAACTAAGGGCCGGACCAGCCATGATAG
-TCTAAGACACTAACATTTTTCTCTAGTGTCTTGTGGGGCCAAGTAGAAGGGCCAGATGTC
-ACCTTTGCCCAGCCTTCCAGAAGTTCTGGGCCAAAGAAAGATTAAATGGCAGGAAGAGAA
-AAATGGCTTAATAAGGAGGTGACGGGGAACTCGGGTGGCCTGTGGGGGTGCGGAGATGGG
-GGGAGATGATAGAGATGTGAGAGCCCATGGGCACATCCCCTCTGGGGAAGTGAGGGAGCA
-CCGAGAACAGAGAAGCAGAGGGAGTGGAGACGGTTCTCAGAAGCACAGGGCCTCCACACT
-CACCACAGCCCCTACTCAGCCGACATGCCTTGCTTCCTCTCACCTCCCCTGGTTCACCTC
-AGAGATGGGACACTCATTGCCCACCAGGGCAGCCTGGGTGGTGCCAACTGTGAGAGAGCT
-CCCCTTCCACATCTGCCTTTGTGGCTGTAAAATGTGGAAAGaataagagaaatacctatg
-aaatctgcaggaagatactttcttttttttttttttttttttttgagatggagtttagtt
-cttgtcgcccaggctggagtgcagtggagcgatctcagctcactgcaacctccgcctccc
-aggttcaagcaattctcctgcctcagtctcccgagtagctgggattacaggtgctcgcca
-tcacacccagctaatttttttgtatttttagtagagatggggtttcgccatgttgggcaa
-gctggtctcgaactcctaacctcaggtgatccacccacctcagcctcccaaaggaggctg
-ggattacatttttctaaatcagttcggtaaaaatcaaaaattttgagaacacctggtgtt
-gtagttctgggaagcaggtactcacatgctttgctggcaggaggtagattgataacaatc
-tctatagaggaggagccagagatctctcttaaaagtgcaaatgcacaaacttttgactta
-gaaattctgcttctgggCAGGGCGCGGTGGCTCACGCCTGTGATCCCTGCCTCCCaggcc
-aaggttgcagtgagctgagatcgcaccattgcactccagcctgggcaacaagagcgaaac
-tctgtctcaaaaaagaaagaaagaaagaaagaaaaattctacttctaggaaattagctca
-gaacttctctccacacccccatgtatgaacactgcagcattttttgttatagcaaaagac
-tggaaataattaactgttcattgacaagggatggtttaaataaaccagtacattcctaac
-catggaataggaccaagctgtaaaaactgaccaggcaggtctttctggactgacacggaa
-gagtccccaagataaattgttaaataggaaggaaaaaggcaatctgaaggacatggagtg
-tgctcccatctgtgtaaaaaagtgacaaTAAATCCTCATATTTTATGTCTTGAAGGAAAC
-ACGAGAAAATGGCTTGACCCCAGGAAGATGAACTAGGAGCTGGGGATAGGAGTGGGAGGG
-AGACTTCTCAAGTATTACTCTTCTGTGCCTTTGAATTTTGAGCTAAAATATTTAaataaa
-atattaatataattaatataatacaattaataattaatattgaataaaataaaatatCTA
-AAAATCTGCTCCccgggtgcggtggcccacgcctataatcccagcactttgggaggccaa
-ggctggtggatcacctgaggtcgagagttagagaccagcctgaccaacatggagaaaccc
-cggctctactaaaaatacaaaataattagccgggagaggtggcgcatgcttgtaatccca
-gctactcagcaggctgaggcagaagaatcgcttgaacccggaagacggaggttgcagtga
-gccaagatcgcaccattgcactccagcctgggcaacagaagcaaaactccgtctccaaaa
-acaaacaaaaaaacaaaacaaacaaacaaacaaaacCACAACTGTCTGCTCAAAAGTGCC
-ATCCTCCTACACACTCCTTGCCCTCAGCTAAGTTCTGTCCCCATGGAACTCTCCCTGGAA
-GAGACAATCTGTCTCCCAAGAGAgcaggcctatgtgtgagtcctggttccatcactgacc
-ctaagtgtgacctcaggcaagacactCCCACCCCTGACTTGTACTAGACAGTTCTCCCCA
-GCACTGACATTCTGTCTCTCCTGCTGGAGGGGCAGGAGGGCAGGCACAGTGTCTTCTTGC
-TCTGTGATTCATTCAGTTCACTTAAACTGAGTTACCTACTCCAGGCCAGAGTTTGGGTTC
-ATCCATTTCTTGCCCTCCATGCCCACCCCAGGGTCTGGCATGGGAGTTGGTACCCTATAG
-GAGTTCTGAACAGACTCAGCTTACGGATGAGGAACAGACGGTGGGTCAGATGCGCGGTAA
-GGAGGGTCAGGTACACGGCCCATGGGATCGAATAGATTCATGGGTGGGtctttaagacaa
-ccgccttcactcaatcctaagccctccccacagctaccaccctattttttctcccctttg
-cagaaaagggctttgagaaaattgtctatcctcgctgtttttaattagtcttctctctct
-ctctccctctgagacaggatctgctctctcacccaagctggagtgcagtggcgtgatcat
-ggctcactgcagcctcaacctcctgggctcaaacgatcttcccacctcagcctcctgagt
-agctgggactacaggtgtgcactaccatgcctggctaatttttgtattttttgtagagac
-tgggttttgccatgttgcccaggctggttttgaactcccaggctcaagtgatccatccac
-ctcagcctcccaaagtgctgggactgcaggtgtgagccaccacacctggccctcttgtct
-cttaagtccatttaatcatgcttctacctgtcacttccctagttgaaactgctcttgtca
-atttcaacacattgctaaatccaatgtgttcagttctcattcttcatctttttttttttt
-tttttttgagacagagtcttgctctgtcacccaggctggaatacagtggcacgatcttgg
-cccactgcaacctctgcctcctgggttcaagcgattctcctgcctcagcctcccgagtag
-ttgggactacaggcacaagccaccaaacccagctaatttttgtatttttagttgagacgg
-catttcaccatgttggccaggatggtctcaatctcttgacctcgtgatccgcccaccttg
-gcctccaaaagtgctgggattacaggtgtgagccaccgcacccggcccattcttcatctt
-cttaactgatcaacagtttgacacagctgaccactccctgctctttgatgtacttctttt
-cacttggtggccaggcctccactctctgctggttttcctccttctcaggctccctgcttc
-tcccattcctgttggagcagtgaggacttggtccctggagctctcatccagtctcacgtc
-tatgactcccaacactgtatcctcagcccagacctctcccctgaactccagcccatacat
-tcaaatacctacctgatgtctctttgaggatgtcaaaagacatgacagactccacagaac
-caaagctgaacctgggcttcccccaaacacctcgctccatgtcatttgatggcagttcca
-tacctgtcaccgttcaggccaagaaaccttggaagcaccttgacacctccttttccctca
-aactccacatctagaccatcagcaatcctgttggctccacctttaaaatatacccagaat
-ccagtcacagctcacctctagcatggccactgccctgctctgagccactggagtttaaga
-gaattattgcaacacctgctcccttgtcttcctgtccttgcctcattcagtctattccaa
-gtacagatccctaaatgattttattttaaaagtaagtcaaggctgggcatggtagctcat
-gcctgtaatcctagcgcttgaggaggccgaggaaggaggatcacttgggtgtaggagttt
-gagacccacctgggcaatgtggcaaaaccctgtctgtacttaaaaaaaagaaaaaaaATg
-gctgggcatggtggctcaccctgtaatcttagcactttgggaggctgaggcgggtgaatc
-acctgaggtcaggagttcgagaccagcctggccaacatgatgaaaccccatctctactaa
-aaatacaaaaattagccgggcaaggtgatgcacgcctgtagtcccagctactcaggaggc
-taaggaagaagaatcactggaacccaggaggtggaggttgcagtgagccaagatcgcgcc
-actgcactccagcctgcatgacaggagcgagactccatctcaaaaaaaaaaaaaaaaaaa
-aaaaggtaagtgagatcacttccctcctctccttaaaccctcccctgcctccccatgact
-cctcagcgtcctttcaaaggcctccaaagctccagattatctgaaccccctttacctctc
-tgacctcatctcccaccgcctccctgtcactggctgcactccagccacattgaccttctc
-cgatggcacaccagtcagctagtcagcttccttttggagcttttgcatgagctgttcctc
-ttcctgaagaatttgcccttcggatagtctcagggcatccactgaacactccactcaata
-cagccactgcctgcccacccaacactcctcatctctgtacttactctttttttcccttgc
-attcgtcaccccctaacatgtgctacaatgtacttattatggtaattatttcttgcatgt
-ttctttctttttttttttgagacagggtctcactctgttgcccagtctggagtgcagcag
-catgatctcagctcactgaaatcttggcctacctggctcaggccatcctccctcctctgc
-ctcctgagtagctgggactacaggcactcaccaccatgcctggctagttgttgtactttt
-ttgtagagatgaggtttcaccatgttgcctaagctagtctaaaactcctaggctcaagtg
-atcctcccgcctcagcctcccgaagtactgggattgcgggtgtgagccgctgtgcctggc
-tgcacttttccttctaatggaatgtaagcgccacttttgtctgttattttcactgtagta
-tccctagcctttggaatgttgcctggcaagtagtaggtactcagtaaatatttgttgaag
-aaacggatGATTCTATAAATAGCATGGATTGATATGGGAAAGCTATGTAGGTGGATGGAT
-GGATGCTTGTCGGATGGAGGGTAGATGAAAGAACAGCGAGAAATTCGAATGGCTAGATGG
-TGGGGATGCATTATAAAATAATAATTCATAGATGGAAAAGGAATGAATAGATGGGTGGAG
-GGATttaatctcttcaactactatttactgaccacttgccgtgtgccaggcactgtatga
-ggtgctagagacactggtgagccacacaggcaaggtgcctgtcctaagggagcctgtagt
-tcagtgggtgaggcagacactaaacaaataacaaatacatacataattccaattatagtt
-aagtgttctggtggaaaagaaCAGGATGCTCTGGGAGAGAATAATATGGATAAGTGATGG
-AAAAATGGACAATAAATGGGTAGATGGAGATGGATAGGATCGGGGTTATTTGCCTTAAAG
-GGCCTGGCTTCAGGACTGGAGCTGCTTTACCTTAAAGGGCCTGTCGGACCACATGTACCA
-TCCCACATCCCAGACCAGCTCTGCACTCAGAGACTGTCCCTCTCTCCCTGCCCTGACTCA
-GCACCTGCCTGGCCTATCCCCAGTGGTCCTGCCTGACTCTACCTCCAGCTCCCACCCTGC
-TGAGTCACAGTCAGGCTGGTCAGGGGGCTGTCCCATGTTCAGTCCAGCCCCTCAGCCTTC
-CTCGACCTGGGGGGGTATGGGGAGCAGCCCAGAGGGGAGGGGAGCAGGTGCCAAGCTCTT
-GATTCCTGTGCCTGAGCACTGCCCTGTTGAGACCAGAGAGAGAATCTATGGCTAGGGTAT
-CTGGGGCTACAGTTGGGGTTTATCTGGGGCCTGGGGTCACACATGATGGATTAGAGCTAA
-ATCTATCTCCAGGGTTATAACTCAATCAGGAGCTAGAATTCAAATTCAGTTTATGGATCA
-TGTGGGGAAAAAGTGACCAAGACACCGTTCAGTTTGGGACCTGTGTCGGCGTTAGCTGTG
-GCTACGGCCCAGGGCTTAGTGATCACAGGTCAGACCATGTTCAAGGTTTCAGGCCAGAGT
-GCAGTTGAAGTGCAAAGTCAGGCAATAGGGTTCACCCTAGGACCACAGTCAAGGATCTGG
-GTCAGTTAGTGTCCAGGGCACTGGCCTTGTCTCCTCTTCTTTGGGAGAGAAGCCAGGTGG
-ATGAGTTGGATCTAAATGTCCTGAGGAGCAACTTCCAGCTCAAGTTCCTTCACCCAGGCG
-GCCTAAGCCCTCTCAGCACTGGCCCCAAAGCCTTCCTTCATCCCTCAACTTCCTCCATCA
-CTCCCTGACAGCCTGGCCTTGCTCAGTGTCCCTCGCAAGGCTGAACAGTCCTCATTCTGG
-CACCTCAGGGGACAGGGTAGGGGTGGGGACTATGGGACAGGGCTCAGTGCTGGACCCAGG
-AGGGCGCCTTGCGCAAGGTTTTCTGATGCAACTGGCTGAGTGCTTCAGCATTCCACCCCC
-ACCCCCCAAGCTTTTCTCAGAAAGGCAAGGCCTGGGCAGTTATCCAGACTGAACATATAA
-TCCCCTTCCTTCTCTGGCCTTTGATGGCTTCAGGACCTGCAGGCAAaaggaaggcaggaa
-ggcaggcaggaaggaaggaaggTCAGGTGACTCAGCAATGCGTCCAGCACTGGGAGCTGG
-CAGATCTGGGGCTCCCTCATCCTCCAGCTGAGAGGCGAGAAAGAGAATCAGGATCCCTGG
-AAGTTTGGAGATCCTAACCCCTTATACATACAAAGCAGCAATTATGTGCCTAAGCCCAGG
-GAGAGACCTGTAGCTGCCCAAGGTCAGAGGCAAGGTCAGAACCAGACCAGCTGTCTTCAG
-CCCATGGCTATGATCTAGCTATTTCCACTACACAGAAAGAGAGAACCCTTCACCCTTGAG
-GAGGACACGGGACTTCCCCAGGAACCTCCCGTCAATCCTGTTGAGGCTCCTGAAATGgtg
-gaatgacgtggactttggaaccacgcagacctgggtttaaatcccaggccaggcacggtg
-gctcatgactgtaatcccaacactttgggaggctgaggcaggcagatcacttgtggtcag
-gagtttgagaccagcctggccaacatggtaaaaccccatctctactaaaaatacaaaaac
-tagccaggcgtggtggcacacgcctgtaatcccagctactcaggaggcagaagcgtgaga
-atcgcttgaacccgggaggcggaggttgcagtgggctgagatcatgccaccgcactccta
-ggtgagagtgagactccgtctcaaaaagccacactggctagctgtgtaacgctgggcagg
-ttactttcactctttgacactggatttgctcacttgcaaagtgggcgtaaatgcatcctt
-agctcacagggctgtggtgaggctgacatgaggaagcactggaaggcacagcttagGCTC
-CACATGGGCCACTCTCAGGAAGTGTGTCCCCACCTCCCCCTTTATCCTCAGCTCTCACTG
-GGTGTGTTTGCTGGGGAAGGAGGTGCAGCAGCCCTGGGGCCTTGGAaataataatagcca
-ctcaccctccagtgcttaccatgtgctgggaactctcctaagcgtgaacttaacctgtat
-tagcccatttaaccctcCATTTAATCCAATAACAGTTCCCAGgccaggcatggtggtgca
-tgcccatagtcccagctactcaggaagctgaggcgggagtatcgcttgagcctgggaggt
-tgaggctacagtgagtcatgatcaccctactgcactgcagcctgggcaacagagtgagat
-cttctctcaaaagaaaagaaaagaaaagaGggaaggaaggaaggaagggagggaggGAAA
-TCCCAATGACAATAAGCAGTTcaataaccctacaggaaaacactgtcatcaatcccactt
-tatagatagggctgtgggtctgagtagctaagtgactttgtccaagacagtggacaagag
-accacacggattttgagccaggccagctggctctgaatcccactgtctcctccctcctta
-aactagtgatgtcactgctctgagccctggtttcctcatctgtctccagggataaaaata
-gcagcttcatggggaagtttgaggatgacacaagatgacgtaagggaggtccccacacag
-ggctccacccacagGCATGAGAAGAGCCTTTCTCAGGAAGAATCCCAGGCCGCCCCTGGG
-GCAACCGCCGGGCTGGCCTTCCTGCCTCTCCTTAGGCCCAGCCTAGCGTGATCTGGATGG
-TGAGAGATTTCTGCAAAGCCCCCAGGGGCCTCCAGAGAAGGGAGGTGCCCGGTCTCCTAG
-ATAAGGGCTCCCAGAGAGGATCACAGCCCTGGAGTTGCCATTCTTGAATCACCCACTGTC
-TTCCCCAAGTTGATTGGTCTGAATCCATGTACTTATTTTTTAtattagttccataatgtc
-ttccttccaaccagctcatcttttacttatttatttatttatttattttatttatttttt
-tatacagagtcttgctctgtcacccaggctgaagtgcagtggtatgatctcggctcacgg
-caatctctgcctcctgggttcaagcgactctcatgcctcagcctcccaagtagctgggac
-tacaggtgcatgccaccacgtccagctaatttttgtatttttagcggagataggtttttg
-ccatgttggccaggctggtctcaaactcctgacctcaggtgatccactcacctctgcctc
-ccaaagtgctgggattacaagcatggaccactgtgcttgaccacaaccacctcattttaa
-aaaacttatctaaatttatttaacatggaaattttaaatcactgacctcaaatagaaaac
-tactatgatttgccataaagaagaggtaagcatacaattacatacaaaaaaagcagaacc
-aggttattccattccagctaaatcctgtttcttgctgaaggctccaagctgaactctgct
-gtctcattcttaacaagagaggtgttaaaaacatagaagctgtgaggccgggcacggtgg
-ctcatgcctgtaatcccagcactttgggaggccgagcgagtggatcacgaggtcaggaga
-tcgagaccatcctggctagcacggtgaaaccccgtctctactaaaaacaataacaacaac
-aacaacaatcagccgggcgtggtggcgggcgcctgtagtcccagctgcttgggaggctga
-ggcaggagaatcgcttgaacccgggaggcagagattgcagtgagctgagatcataccact
-gcatttcagcctgggtgacagagcaagagcaagactccgtctcaaaaacaaacaaaacaa
-caacaacaaaaaaaaaaaccatacaagctgttggccgggcgcggtggctcacacctgtaa
-tcccagcactctgggaggccaaggtgggtggatcacgtggtcaggagatcaagaccatcc
-tggccaacatggtgaaaccctgtctctagcaaaaatacaaaaattagctgggtgtggtgg
-cacacgcccatattcccagctactggggaggctgaggcaggaggatggcgtgaacccggg
-aggcggagcttgcagtgagctgagatcacgccagtgcactctagcctgggtgacagagcg
-agactccgtctcaaagaaaaagaaaaaaaaaaaaagaagctgttaaatgagactttctcc
-ctgagtctttggagaaacagcaagaaaactgaaagggtttaagtgtatcacaattatgat
-tcaaagttatgtcatacggtatctggagaccctaaaaccctctggcactcagccattgtt
-gtacatggtatatttcagaaaacactgACCTCACTGacctactccaactttctcttctta
-ttttacagataagaaatttgaagcccccgcaaagggaggtgacttgtccacaatctcaca
-ggctcagtggcttcagccagacttggaacgcaACCAGAAGTTCTAAGGCATCATGTCACT
-TTTGTGGGGGAAATGTATGAAGATGAAAAGTTTCAAGGACACCTATGGTGGAATTTTAGG
-CATATGGCAATCACTAGGGACACCCATGTGGAAGGAAAGGAGGCAGGCATGGCTCATGTC
-ATTGCTGTGGGCCCCACATCAGTGCTGGGGGTCAGAGACGGAACTCATCAGAACTATAGC
-AAAGAggccgggcacagtggctcacgcctataatcccagcagtttaggaggccaaggtgg
-gcggatcatttaaggtcaggagttcgagaccagcgtggccaacttggtgaaaccccgtct
-ctactaaaaatacaaaaacattagccaggtgtggtagtccacacctgtaatgccagctac
-tcagggagctgaggcaggagaattgcttgaacccgggaggcagaggttgcagtgagccaa
-gatcacatgccacttccctccagcctgggcagcagagcgagacactgcctcaaaaaaaca
-aacaaacaaacaaaaaaCCAAACCTATAGGAAAGAGAAAAGCAGCCTTCTGGGCTCAGAA
-ATCTGAGTAGAAAGATGTTCTGAGCCTGGAGAAAGAAATTCATAAAAGCCTGACTCTCTC
-TCCAGAAAAGAGTACATTTCTGCATTTAATTTTGGGAGGTTGGTCACCATTCTTTTCCTC
-GCTTCTAAATAAATGCTTATATAGCATTTAtattccagtcactttacaaatattgtcatt
-taattctcatgcaaaccaacgaggtaggaactattgttatccccattttacagatgggga
-aactgaagtacaaagagctgaagtaacttttccaaaatAGATGTGGTTTTGAACCCAAGA
-AATGTGATACAACTATGACATGAGGCAGTCCCAATGcattgaatccttatgactgcaatg
-caagggaggtataattaactgcattttatagatgcagaaactgaggcttgaggctatttg
-gtgtttctggtgtagatctaggagccaaactccagcctacctagactctttgcctctgct
-gtacccctggaccatgTGTTAGGAATTCTTGGTACAGGGTGGTAGTGCTCAATATGGTAG
-TGgttttagtctgttttctgttgcttataacagaatgtctgaaactgaacaattttgaaa
-gaaaaggaatttattccttacagctatggaggataggaagtccaagattgagggggcact
-tctggtgagggccttattcctggtctctgaagtgtctggaggtggcacagggtatagcgt
-ggagaggggactgggcatgctgacatgctatgctttggtctctcttcctcttcttataaa
-gccaccagttctcctcctgtgaaaacccacaaatccattaatccatgagtgggttagtcc
-attcataagggcagaggcttcatgatccaatcacttcttaaaagtcccaaccgctcagta
-ctgccacattgggggattaagtttccagcacatgacatttgggggacacatttaaaccat
-agcagtagccatttgccacatgtggttattgagcacttcaagtatggctaatgtggctag
-tgtgactgagaattttttattttattgaatattttaatttttttttttttttttgagatg
-gagtctcactctgtcgcccaggtcagagtgcagtgtcatgatctcggctcactgcaacct
-ccgcctcccggggtcaagtgattctcctgcctcaacatcccgagtagctgggattacagg
-tgtgtgccaccatgcccggcaaatttttgtatttttagtagagacagggtttcactgtgt
-tagccaggacgatcttgatcttctgacctcatgatccacccacctccgcctcccaaagtg
-ctgggattacaggcatgagccactgcgcccagcctcacattatatttctattggaacaca
-gaaTGGTCTAGAGAATTGGGATTTGACAAACCCAGCTGTGACAAGTCACCAAAATTTGGG
-GGCCATACCCAGGGTGCCGTTCCTGTCACGATACCCATAGGTCCATGTGGAGGCTGCAGG
-GATACAAAGCTCGTGAAATATCCCAGGATGgcatgggcactggagtcagctgccccaagt
-tcaaatctgaaatcagtctttttgttttttttttttttttgagatgcagtttcactcttg
-ttgcccaagctggaatgcagtggcgcaattggctcactgcaacctccgcctcctgggttc
-aagcgattctcctgtctcagcctcccgagtagctgggattacaggtacatgccatcacgc
-ccggctaaatttttgtattcttagcagaaaccgggtttcaccaccttagccaggctggtc
-tccatctcctgacttcaggtgatccgcctgcctcagcctcccaaagtgttgggattacag
-gcgtgagccaccgcgcccagcctgaaatcagtcttatacgaccagctgggtggtcttggg
-taggtcccttaccttaactcttcttgtctgcagaatggaggtgacttactgtttttctct
-gtctccctttcacatctttgcactcttcaccccttctcttccctcagcttttagtttaaa
-catcacctttctgataagccctgctgaaaatggccaccctcagtcatgacggagaacaag
-tctttcctattttattcaagaaaatgcatgatgcaatctattttaaatgatcatggtttt
-aattttattttcctgataatggtctatctctccactgatttataagatttgtaagagcag
-gggtggatcattctggtcactgctgagtccccagcatttagaacaggggctgacacaGCA
-CAAAACAACGTTAGTTGGGAATGTACAAGCAAACCCAGCACACCTTCAGAGGGGTGCTCA
-GGAAACAGCCCTCCCAcctttcttcacccctcacagctgtgggatcttcctaaccatttc
-ggtgtcccaggatagaggatgagtttattcacccctccccagcaggggagttgccaggat
-taaatgagatCCCAGAATGCCCTGGTATACCCTGAAGGCTCTGGGACACAGGTGAGCTGG
-TCCCCAGGGATTTGGAAACAGGAAAACAAATATGACTCCACCCTGCCTCCCATCCAGCCT
-CTGCCTAGAGGAGTTATtttattttattttactttttttttttttttgagacggagtctt
-gctctgtcgcccaggctggagtgcaatggcgcaatctcagctcattgcaactcctgcctc
-ctgggttcaagcgattctcctgcctcagcctcccgagtagctgggactacaggtgtgttt
-tttgtatttttagtaattttttgtacttttagtagaaacgggtttcaccgtgttagccag
-gatggtcttgatctcccgacctcgtgatccacctgcctcagcctcccaaagtgctgggat
-tacaggcataagccaccacgcccagccTCTAGAGGAGttattttacttacttacttattt
-atttattacacaggatctcactctgtcacccaacctggagtgcagtggcacaatcacgtt
-tcactgtaacctgaactcctgggctcaagtgatcctcctacctcagcttcctaagtagct
-gggaccacaagctcgtaccaccatgcccgctatctttttctctttgtaaagacagggtct
-tactatgtcatccaggctgttctcaaactcctggcctcaagcaatcctcccgtcttggcc
-tcccaaagtgctaggattacagacatgagccagctcacccagctGAGGAGTTATTTTTTG
-ACACTGGTGAATTCAGATCAAAAGGGATTTCTAAGAAAGGTGCTGGACCCAggccgggcg
-cggtggctcatgcctgtaatctcagcactttgggaggccgaggcaggtggattatctgag
-gtcaggagttcgagaccagcctgaccaacatggagaaaccctgtctctactaaaaataca
-aaattagccaggcatagtagcgcatgcctgtaatcccagctacttgggaggctgaggcag
-gagaatcgcttgaacccgggaggtggaggttgcagtgagccgagatcgtgccatcgcact
-caatcctgggcaacgagtgaaactctgcctcaaaaaaagaaaaaaaaagaaaGGTGCTGG
-ACGCCTAGGACGCAGAGGGGTGTTTCACCCCAAATCAAGTAGCACCAAGCCCTCCCAGGC
-CTTGGGTGCAAGCATATTAAAGGCCTCTTTCCCTCTCTGTCTCCATTGTTTACACTCCac
-tgagcatccgcaatgtgccacacactgttctaagcgtcttacacatattaaattatttaa
-tcctcacaacaactttatgaagtgagcgcaattatgagcccattttatggagcaggaagt
-tgaggcagggttttaggtagcttttctggggtagcactgtgggttggagcggaggtggag
-tgcactcttaggccagctggctctaggggctcttcaccactaggccgcactgCCTCTAGC
-AAAGGGACGCGGGGAAGCTCAGCAGACCTTAGGCCTCCCAAGGGCGCCACGGTGGTTCCT
-TTGAGCCCAGAGTCAGCTCTTAAGTCCATAGGCCTTCCTGAAGCTTCTGAACCACTTGCC
-CATAGCTGGGCCTCAGGCTGGCTCTCAGTAGAATGTGGAGAATGGAGATTCCCGCATGTC
-CACTTCTCCTAAAGGTTTTATAAGGCAGTGCTGGGAATGTGCTTTATAAAAAAGGGGAAG
-CACCCCGACAACAGTCACTGTTTGctcttttaagcaccatcctgagaaggaggaatgttc
-ttcccatttcataggtggggaaaccgaggctcagaagagcaaatttttggccgggcgcgg
-tggctcacgcctgtaatcccagcactttgggaggccgaggcgggtggatcacgaggtcag
-gagatcgagaccatcctggctaacaaggtgaaaccccgtctctactaaaaatacaaaaaa
-ttagccgggcgtggtgcgggcgcctgtagtcccagctactcgggaggctgaggcaggaga
-atggcgtgaacccgggaggcggagcttgcagtgagccgagatcgcgccaccgccctccag
-cctgggcgacagagcaagactctgtctcaaaaaaaaaaaaaaaaagagcaaatttttttt
-ccaaggtgatagggagagtccgtggctgaTGTCTGCACTGACCAGACGCCCCTAGGGGGC
-CAGCGAGGGCGGGTCCCAGGTGCAGCGGATGCAGAGGAGAGAggcccgggcgcggcgcgg
-gggATGGTGCGATCCCGGGCCCGAGGGCATCAGACGGCGGCTGATTAGCTCCGGTTTGCA
-TCACCCGGACCGGGGGATTAGCTCCGGTTTGCATCACCCGGACCGGGGGATTAGCTCCGG
-TTTGCATCACCCGGACCGGGGGCCGGGCGCGCACGAGACTCGCAGCGGAAGTGGAGGCGG
-CTCCGCGCGCGTCCGCTGCTAGGACCCGGGCAGGGCTGGAGCTGGGCTGGGATCCCGAGC
-TCGGCAGCAGCGCAGCGGGCCGGCCCACCTGCTGGTGCCCTGGAGGCTCTGAgccccggc
-ggcgcccgggcccACGCGGAACGACGGGGCGAGGTACTCGGCGGGGTGCGGCCTGCGGAC
-TcgcccggaggccggggggcgggagggggcggccggggAAGGGGGCGCCGGAAGCCTCTG
-GGCGTCTGCGTGTTGCCGCGTGTTACACGCACGCACGCCCCTTACACACCTTTTCACAGA
-CCCCGCCGTCGGGGCGCGGCCAGGTCAGATCCCTTTTGATCCGGGCCTGGGCTGAGTGCT
-CCCCCCGGGCTTCAGGTGACGCGGCCCCGCGGAGCGTGGGGTCGCCCGAGTTGGGCTGGG
-GAAGCCAGGGACGGAGGTGTCCGGCCGTCACCCCTAGAGGAGGGCGTGCGGGGGTCTGTT
-TTGCGTGAGTGCGGGATAGGGGAGTCGTGTGGTGCGGTGAGGGGCTTGTGGGGGGCACTG
-GAGGACTCTGGGGGTGGCGGGGGATCCGAGGGGGTCCTCGTGAACCCGCAGGGGAGAGTC
-CTGGGTGAGGGTGGGTCCCGAGCACCTGTGTCTCAGGAGATGGTGAGAGCTGTCTGGAGG
-GCTGGGCACTTGGTGGCAGGGGTTGGCGGTGCAGGGGACACCGCCGGGACAGGGCTGGGG
-TGCCCTGGAGCGGGGGAGCCGAGGGAGTGGGAGCGGGGGCGCAGCGCGCGATCTCTGGCC
-CGGCAGGGCCGCTGGTTCTCCCCAGTGCGCGGCTCCGGGTTTGCAGGTGGACGGTGCGCG
-CGTGTCTGCGGTGTGTGCTGTGCCTGCAGACCGGGGAGGGCGGGGGACGACAGCCACCTC
-CTTCCCTCTGCCTCACCCCCCTCCTGTCCCAGGGCCGCGCTTCAATTTCCGCTGAAACTT
-CTGACTCGGACACCCGCCGCCTTTCGCTTGGGCTCCCACGGGAGGGGCCTGGCTGCGGGG
-GGCGGGGCGGGGTGGGGGTGCGGCCTTGCTCGGGTAGACCATGGGTGTGACAGCTGGGAG
-GGCtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgtgCGCGCGCGCGCTTGCGCTTGATGTA
-ACCCGCCCTCATTTCCCTGGGTCCCGAGTGTGGCAGGGAACAGCAAGAGGTAGATATTAG
-GGGCTGCTTTCATTCCACATCACAGATTCTATTCTGCAGTGTGGTCTGCAAAATGCCTTG
-CCCAAGATGTATAGACTCAGTTACCGCATCTGTCCCCATCTGGGTGGAGCTTATCCCAGG
-CCCCAACAGGCTCTGAGGGATGGCCGGGGCCAAGGCAGCCTGGACTACTGATGTGGCACA
-GGCCAGAGGGACTCCAGGCAGTCTCCTGCTGCACAGGGCACAAAGCATGTGCACAGCCAG
-GTATCATCCTGCGTGACTCAGAACAGCCTTGAGATGTAAGGAGTGTCATCCCAGCCTCGA
-ACCTGGGGAGCTTTCTAAGACTCCCAAGGATGGTACTTATGCATCTTGCTGTGAAGAATA
-ACAGGATGAGTGCtaataatgaccatttcctgacacctacctggcaacaggtccataagc
-tctacatgcttcatttgtgttttcatttcatcatcacgaaaaacctgtaagctttgcatc
-ctgttcccactttacaggaactgaggctcagaaagcttgaggaacttgaccaggggtacc
-ccccagctagaaagggtttgagacaggattagaacccaggaatatctgactacagccact
-ccttactgcaTTCTTACCAAGCCAAAGTCATGACCTTTCACTCATGTGGGGAGGCCTTCC
-CTTCCAAGGCAGCTCTTCCATTTGGGAGCAGCGTACTTGGAGAGGTGGGCCTCTGTCTGG
-TAACTGACTCATGTTGCCTTGTTAATCCTGCCTTGAACTGTTGGGAAGGTCTTTAACCAG
-GCTGAGGTCTCTCGCACCAATGCCCATACCTGGGCATGCACCTCCTTGGAATGGAGTTTA
-AGTGGGTGGGCAGATGGGTTCTAGAGAGAACCCGTCTGCCCTGACCATGCCCTACTGCCC
-TCTCCTTCAGCCACCACACACACAGTCACACAGCTGCGTGAATGGTGgctttcctttcac
-ttaacagttcactctggagatccttccaattaccctataaagagcatcctcaacctttta
-aatggctgcacattgttccgttgtgtggatgaagtataatttatgtaaccagccctgtaa
-ttatagacagccaattatttctgtcaaaagggctgcaggaataactgtgtatttgcatgc
-ttacacacacacacctctacagaataaattcttagcaatgggattaattgctgaatcaaa
-gctcacacgcttttcatcgttgtttttgttttgttttgttttgctttgttttgagacagt
-ctcactttgttgcacaggctagagttcctgaccatggctcactgaagcctttaccttctg
-ggctcaagtgattcccctacttcaacctcctgcatggctgggactacagctgtgtgccat
-catgaccagataattttttttttcttagggacagggtctcgctacgttgcctaggctggt
-cttgaactcctgggctcaagtgatcttcctgcttcagcctcccaaagtactgggattaca
-ggcatgaagcactgcacccagcctgtttttcattttgatattgtcaaaatgcactcctca
-gaggtggtaccttttatcctcccactagcactgtCTTCATTGTTAGTGGCTGCACTGCCA
-CTATTCCACAGTATAAACCCACTTTTCATGACACTGCCAAGACATAAGGGTCTGAAATAC
-TTAACAGTTTTCTTCCACAGTCCCCAAAATACAGGCTtctcccccagctcaggacatgaa
-gccatcatccctcctcattgcaggagccaaaggctggacctcacctcgattccaccctct
-ccttcacccctcacatccaatccatccagtccatccagtctgccactgagtcctcttgat
-cttcctcctatgagcccttaacttcgcgtctccatctagcaccccctagtccaggtcacc
-ttctcctgcctggactcgtgcttgtgtgggcctcctagctagtctcactgccccgtcttg
-tactttcaaatccaccctaaaagcatgatgttcccctgctgaaatccttcagtggctccc
-cactgcctttggataattccaaatcctattgtgtgttaattaggattaggctcagctgta
-atatagaaacagccacttaatagctaaaatgaaatagacgtttttttcttctttttctct
-ttttttgagacagagtcttgctctgtccccaggctggagtgcagtggcgagatctcagct
-cactacaacctctgcctcccaggctcaagtgattctcctgcctcagcctcccgagtagct
-gggactacaggcatgcaccaccatgcccacctaatttttgtatgtttagtagagatgggg
-tttcaccatgttggccaagatggtctcgatctcctgaccttgtgatctgcctgcctcggc
-ctcccaaagtgctgggattacaggcatgagccactgcgcccagccttcaatagatgttta
-tttctctcctgtgtaaaaaacctggaggtctggcctgacaactccatgtgtcagggacct
-aggctcctctcttgctctactgtatgtggtacttctgaagccaaggtagatgctggagct
-ccagcagttaggtccacattccagcatacaggaaaggaggaaatgaggaagttgggccct
-ccctttaagaacactgtcctgggcattgtacacaacacttccacttgtgtcctactagcc
-atatgctgatacaaggatacaagggagacaggaaatgcagtttattctaggtgtccttgt
-gctcagctgaaaatctcaggttctaatcctatgtaaggaggggagacctgaaactgggga
-ccactaaccacctctgccatatgatgctcgtagagcccttcacaatagggcctctactaa
-cctcaccttatttttatttatttatttatttttgagacggagtttcactcttgtcgccca
-ggccggagtgcaatgacactatctcagctcaccgcaacctttgcctcctgggttcaagca
-actctcctgcctcagactcctgagtagctgggattacaggcgtgtgccaccacgcccggc
-taatttttgtagttttagtagagacggggtttcaccatgttggtcaggctggtctcaaac
-tcctgacctcaggtgacctgcctgcctcggcctcccaaagtgctgggattacaggtgtga
-gccaccacgcccggcctattttttttttttttttaacttttcacttttttttgcagtcac
-gctcattctccaccgtgttcttggggaacatgcagcatgttcttttgcctcTTCCCTCAC
-CCCAGAACAGGggttactggacagcggcatcaacttcacctgggaactggatagaaatgc
-agattcagaccttctgaatgagctactttgggagtagggcccagcaatgtatgttgaaac
-aggcctccagatgatctcaatgcttgctcaagtttgagaaccactgAACCGCAGTATGAC
-TCTCCGTGTCAcctggctaactctgcctcactttcaggtctcagtgtagacaccacctct
-tctaggaagacctctcttgacccaccagcccaggagagaggcctctctgggttcctagag
-gcccatgcttctctgTATAGTAGGGCTGATCACACTGTATGTGAtttttttttttttttt
-tgagagagtctttactctgtcaccaggctggagtgcagtggcacaaacatggctcactga
-agcctcaacctcccaggctcaagcaatcttcccacctcagcctcccaagtagctgggact
-acaggcatccaccaccacacccagctaattaaaaaaaaatttttttttgtagagacaggg
-tctcactatgttgcccaagctggtcttgaacttttgggttcaagcagtcttcccaccatg
-gccttccaaagtgctaggattacaggtgtgggccactgcacctagccTTGGACGTGATTT
-TATTACTCATCTGCCCTCCAAATTGACTGGAAGATCCTGACGGCAAGACTGCTGTCTAAC
-CTACTTCTCTTCCTAGCACCCAGTGTTAAGTGAATGAACAAGATCATATCTCTCATCTGT
-GAATGTACGAGAGCCATGGATTATGAGATTAGTTGATTTTCTTAACTATAATTTTTAGAA
-ACAAGCTGTGTTTTTAAGCAGGTATTTATTTCCTTAAATGTACATTTCTGATTACAAAAT
-ACttttttttgagacagagtcttgctctgtcacccaggctggagtgtagtggcacaatct
-cggctcattacaacctctgcctcctgggttcaagcgattctcctgcctcagccttcccag
-tagctgggattacaggtatgcaccaccacgcccggctaattttttttttctcccgtgacg
-gagtcttgttctgttggccaggctgaagtgcagtggtgtgatctcagctcactgcaacct
-ccacctcccgggttcaagtgattctcctgtctcagcctcccaagtagctgggattacagg
-cccacgccaccacgcctggctaatttttctatttttagtagagatggggtttcaccatgt
-tggccaggctggtctcaaactcctgacctcatgatccaccaccttggcctcccaaagtgc
-tgccgtgggctgcactttggcattgccttggtcacgtgctgctacctgggattacaggca
-taagccactgcgcctggcctaatttttgtattttttagtagagacagggtttcaccatgt
-tggccaggctggtcttgaactcccagcctcatgattcgcccaccttggcctcccaaagtg
-ctgggattacaggcgtgagccaccacgcctggccAGGAAATACATTTACATGGCTCAAAT
-TCAAAACTATAAAAGTCggccaaacatggtgactcacatctgtaatcctaacactttggg
-aggctgaggcaggaggattgcttgagctcaggtgagaccagcctaggcaatgtagggaga
-cccccatctctacaaagaataaaaaaaaattagtcaggcatcatagtgcacacctgtagt
-cccagctacttgggaggctgaggtggaagaatcacctgaaccctgaggtcgaggctgcaa
-gtgaactgtaatAGTAAGAGTCTCCTCCTAATCTTGTGCATCCTTTCAGAGAGAGAGATG
-atagatattcaaacaaatacatacatatatataacatatttatatatattctttttaaca
-taaaagtatagccaggtgtggtggttcactactagagtcccagctacttaggaagctgag
-gtgggaggttcacttgaggccacgagtttgagaccagcgtgggcaacatctcttggggaa
-aaaaaaaaaaaaacccaccataaaagcattctataacacgtaattctgtgtttgtctttc
-ttctcttaatacatcttggagatcagtacgcatcagtatatagagagcttccttgtcctt
-tttcagggctgtgtagtattctgctgtatggctataccatgatgttttcactagctttct
-actgcctgacatttgggatatttcctgcttttgctattggacacaaggctctgatgaaca
-gcctttactatatttaatttttttgtgagaagtttaactggaagataaattcccagaagt
-ggggcacccagttaaggatatgtgactttgtcattttaacacacactgccagatcacccc
-ctataaatgttgtgccacgtatcctcccaccagcaGGGGAAAGGAGGGGCCACCAAGCAG
-TCTCACTTTAGTGCTTTTCTCTCCTTTTTACCAGATGCGAGCCACCCCTCTGGCTGCTCC
-TGCGGGTTCCCTGTCCAGGAAGAAGCGGTTGGAGTTGGATGACAACTTAGATACCGAGCG
-TCCCGTCCAGAAACGAGCTCGAAGTGGGCCCCAGCCCAGACTGCCCCCCTGCCTGTTGCC
-CCTGAGCCCACCTACTGCTCCAGATCGTGCAACTGCTGTGGCCACTGCCTCCCGTCTTGG
-GCCCTATGTCCTCCTGGAGCCCGAGGAGGGCGGGCGGGCCTACCAGGCCCTGCACTGCCC
-TACAGGCACTGAGTATACCTGCAAGGTACGTGCCCATGGGCGGCTGTCCCCCAGCACCAC
-AGGAGGCCTGGGAAGGAGGCCTCCAAAGGATTGCCAGGGTGCAGAGGGGTCCTTATGTTC
-ATTCATTCTTGTGTTTGTTTAGTGGGGAAGCATCCAGGGAGCCCCTGCTGGACTGATACT
-AGAGAGGTAAACCAGAGGTCGTCCCAGTCCTGGGGGAGTTCACAGCTTAGGCCCTACAGT
-GTGATAAATGCTGCAGGGGTAGAACTTAGGGATCATGGGCGCAGAAaaggccgagcagaa
-gttagccaggtagaagtgggagatgggagttgcaggcagggggaacagctgttcaaaggc
-ctagaaaagtgaggggatagcactttagagaatgaaaaggacttctctgtggccagagtg
-gagaggatgtgcagaaaggggcaggagatgaagGTTGGCAGCAGCTGGTCATGAAGGTGT
-TAACAAGGGGCCTCCACTGGGCTGTGCGGAGCTACTGAAGATGTTTGCACAAGAGAAGGG
-TAGGGCATGGTAGACATCAAAACTCCTgggacctcggaggtgatcgagcctaacctgggg
-ccattttacagataggaagactgagatgaagacaggagaagggccatgcgtgaagtcaca
-tagcACTGGGCCTGGCTCCTGGGGTAAACTAAGGGGTAGAAAAGTCTGAGGATTCCTGGC
-AGAAACCAGGAAATGGACAGGGTCAAGGCCCCTGAGGGTCAGCCCATGCAGGACACTGAC
-AAGTGACAGTCCAAGAAGACAGAGATGAGAATAAAAAGTGTAACAAtaggtattcactgt
-gcaccaggtactatgatgattgcttagtgtgcacaatctcttttaatcttgacacaacca
-atgaggtggtttctatcattgtgccccttttatagatagaggacactgagactcagaaag
-ccatggttacttgccacatgacagagccaggtggtatcagagctgggattgggcccagga
-ggctgagcccagagagtcctgtgcccGTGCTAGGATAAGCGTTTCACACAATCAGGGCAG
-GCTGCCCTGGCAGGCAAGCATAAGGAAGATAAGGGGGACCTGGAAACCCAAGGGAGAGTA
-GCGGGGGCCTGGGTCCCTTGGGAATGCACAGAGAAGCAGAAGGACTTAAGCCTCCTCCTG
-GGGCAGCAGCAGAGCTTTGCTCTGTTGACGGAGATGCAGTGAACAGCGGGGCAGATCCAG
-ACAGGGTCCAGCCCCTAGCTTCACCTGGCCTCTTGTGCACAGATCTCCAGCGCCCTTACC
-AGGTGCCCTAAGGAGCCCAGAACTCTGGGTCCCCTTCCTGCAGCATCACAGGCTCTTTTC
-CACTCCCGCTGGGGAGGTGAGTCCATGATAAGAGGAATAACCCAAGCAGGCTCAGGAGAG
-AAGCGCCATGCGTTCACAGGGCCCTGATTCTCAAGAAACATTTGGGAAAATCCACTGGAA
-CATACTCACCCCTATGCCAATGTGCACCATGGGTGCTGAATGGTCATTTCCACACTTCCT
-CAGCTTTTCTGGTCAGTGTGTAGAAAGATCAAAATCTTGTCTTTGTAAATGATCAACTTa
-ttcattaattcaacacaacttcattgagcacccgtatttgccatgtaccatgctgtggtt
-aaaaaacaaagttctgttctcatcaagctgacgttctagtgggagatacagacactaaac
-aagcgaataagtaaaatacgtgtcaggtggccgggcgcggtggctcacacctgtaatccc
-agcactttgggaggccgaggtaggcagatcacctgaagtcaggagttcgagactatcctg
-gccaacatggtgaaaccttgtttctattaaaaatacaaaaaattagccgggcatggtggc
-aggggcctgtaatcccagctactcgagaggctgaggcaggagaatctcttgaacctggga
-ggtggaggttgcagtgagccgagatcacaccactgcactccagcctgggcaacaagagca
-aaactccgtctcaaaaaaacaaaaaacaaacaggaaaaCCCTTATTCCAGCATCTTTCTT
-GGTTCCTTTGCAATGCTTATCAGCATTTGTCAATATTTGGTTTCTGGGCATGTTTGCATG
-GCCTCCCAGTGGGCACCGGAGAGCAGAGCCCATGGCTGTCAGTCTAGCTGGACATGTGGC
-TGGCCCGTGCAGGCCCAGGGCCAGCATACTGAATGAATGAAAGCGTGGGTGGGCAAAGAG
-GACGGGAGCTGTGACGGTGATGAGCATCAGGTGCCTTCTGCATCATCCGCCCTTCCGGAT
-TCCTCCTGCTTTGTGGGTTATTTTTCTGTTTGGGTGACCTGTTACTTTTCAGTTATCCGA
-TGTTTGAGGCCAtatagcgtagcagttaagagcacagacaaaaggccgggtgcagtggct
-cacacctgtaatcccagccctttggaaggctgaggcgggaggatcacctgaggtcaggag
-ttcgagaccagcttagccaacatgatgaaaccccatctctactaaaaatacaaaaattag
-ctaggtgcggtggcacatgcctgtaatcccagctacactgggggctgaagcgggagaatc
-acttgaatccaggaggcggagtttgcagtgagctgagattgcgccagtgtgctccagcct
-gggtgacagagcgagactccgtctcaaaaaaaaaaaaaaaaaaaaaaagcacagacagtg
-gagtgcatacgtgcaaatctcagccgtgctgtttgctggctgtgtggcctctcagcttcg
-ttaaccgtaaaatggagcaagtcatcctaccttataggaccatggtcagggctgagtgac
-tcggtcagtgaagcgcttggtgcgatgcctagcacatggtagtgtctaataGGTCAGCTG
-TGACTGTTTGCAATGCCAGCCTCAGCTCCCGGGAGTCCCCAGCTGTGCTAACACCATGCT
-CTGCCCACAGGTGTACCCCGTCCAGGAAGCCCTGGCCGTGCTGGAGCCCTATGCGCGGCT
-GCCCCCGCACAAGCATGTGGCTCGGCCCACTGAGGTCCTGGCTGGTACCCAGCTCCTCTA
-CGCCTTTTTCACTCGGACCCATGGGGACATGCACAGCCTGGTGCGAAGCCGCCACCGTAT
-CCCTGAGCCTGAGGCTGCCGTGCTCTTCCGCCAGATGGCCACCGCCCTGGCGCACTGTCA
-CCAGCACGGTCTGGTCCTGCGTGATCTCAAGCTGTGTCGCTTTGTCTTCGCTGACCGTGA
-GAGGTGAGTGTGGTCTCAGAGACCCCAGCCACAGACACACCCAGGGGGTGGGCCATGATG
-GAGAGAAACCGAGGCCCAGGAAGGCAAGGTAACTTAGGCAAGAAGTGGGAGAAACTGAAG
-TAACCAGCAGCCCCTGTTTAGTTCCCTGAGAAGAGTTGACTCAggccaggtgcagtggct
-cacgcctttaatcccagcactttgggaggccgaggtgggtgaatcacttgaagtcaggag
-ttcgagaccagcctggccaacatggtgaaactccgtctctactaaaaatacaaaaattag
-cctagtgtggtggcgcacacctgtaatcccagctactctgaaggctgaggcaggagaact
-gcttgaacctgggaggcggaagttgcagtgagccaagatcacgccactgcactccagcct
-cggcaacagagtgagattccatctcaaaaaaaaaaaaaagaGTTGACTCAGTCCTCTTGG
-GAGCCCCTTGGGATTCTGGGATGGAGCACTGAGATGTGAAAGTCATAGTAGCCGACAGTG
-ACGAAAGCATCGCCACATTATCTAACGTGGTCttccatccttacaaacacgaggcaggta
-ctgttattatccccatatgatcaaggaaactgaggcccagagagctcaagtaacttgccc
-aagatcccatagcagaataaatggtagagctgggatttgaacctagatctgactccagag
-cctgggtcttaaTTCAATCTGAGCTTGAGAGGCAGGGGcctggctgggcttaccaactga
-ctttgggtgacctagtgtctctgagcctcagtttctccgttggtaaggaaaagggctgga
-ttGTTAGGGTGTTTTCAGGATTCCAAGACCACAGCCAAAATAGGGTCTGAGGTTCCCCAC
-ACGGGAACGTTTTCTGTGAAACTGAGAATTAGCACTTTTTGGTTAAAAGAATCTTCCTTC
-TCTAGGTTGGGATGCTAAGAAtttttttttttttaattgagacagagtctcactctgtca
-cccaggctggaatgcaatggcgcgatcttggctcactgcaacctctgctgcctgggttca
-agtgatacgcctgcctcagcctcccgaatagctgggactacaggcatgcgccaccatgcc
-tggctcattttttctatgtttagtagaaacggggttttgccatgttggccaggctggtct
-tgaactcttgaccttaggtgatccgcctgcctcggcctcccaaagtgctgggattacagg
-tgtgaggtactgcacccagccTAGACGCTAAGAAAAATTTTTAAAAGATAATTCTGGGGA
-GAAGGGCAGAGAGACTCGCCTCCTGTTCCCTCTCCAGATTCCTGGGGGCAGTCAAGATGT
-GTCAGGGAGTGCACTAAGCTGCCAGTTACACAGGAGTTTTCTGTGGAGAAAGGAGTGTGA
-CCCCATGGCATTTTAAAAAACtttttatcttgaaataattttagacttttagaaaaccta
-caaaaatagttcaaagagtttctgcatatcctttaaccagtgctctccaatgttaacacc
-tgacgtagctatggtacaattacccaaactattaactaagccacagattgattcccactt
-cccgagtttcccactaacaccccttgctgtgcaggatccagtgaggatcccaatttagtc
-atcagtggtttccttggtctcttccaatctgagacagttcctcagtctttccctgtcttt
-gaagacccatgaccttgacacttttttttttttgagacagggtctcactctgtcacccag
-gctggagtgcagtggtgtgatcacagctcactgcagcctcaacctcccgggctcaagtga
-tcctcccacctcagcctcctgagtagttggttctacaggtgtgtgccaccccacctggct
-aattgagatggggtcttgctatgttgcccaggctggtctcagactcctgagctcaagcaa
-tctgcctgcctcagcctcccaaaatcctgggattataggcgtgagccactgctcctggcc
-ataaccttgagacttttgaagagtactgatcagttactttgtatgtccctcaatttggat
-ttgattgatgttttctcacagttagattgcagttatgtatttttggcaagaacaacacag
-aatcgataggcccctctccacatcatatcaagagatacttgagctgatagtcattcctat
-gtcgtgaccttgatcacttggttagggcaggacctaccaggtttctctactgtaaggtcc
-taatttaccctttgtaattgacaaataccttgggggaggtaagctaggcatataaatatc
-ctgtttttcctcaactttcacccactaattttagcagccatccatcttgcctatagcagt
-tattattgtggtgcttgcctaagtctaattttctttttcttttttttctttctttctttt
-ttttttttttttgagacagagtctcgctctgttgcccaggttggagtgcagtggcacgat
-ctcggctcactgcaacctccacctcccgggttcaagtgattctcgtgcctcagcctcttg
-agcagctgggattacaggcacacaccaccacacttggctaatttttgtatttttagtaga
-gatggggttttgccatgttggccaggctggtctcgaaatccgcctgccttggcctcccaa
-agtgctgggattataggcatgggccgctgcgcccagccCCCAAGGCTGATTTTCTGTTAA
-TATTTCCTTCTACATTTTATATTAGAACAAGCATGCCTTTTTTAAAGAAGTAACATTTAT
-AATGATGTTTAAGCTAGTACATAACTTCAAACACATTTTAGGCTTAGGGTAGATACAACT
-ACCCCGGACCTCCTGGAGGAGACAGCGTGCTTCCTGCTCTTTTCAAGAAGTCACTTgatg
-gcccacacctgttatcccagtgcttcgggaagccaaagtaggaggactgcttgagcccag
-gagttcgaggccagcctaggcaacacagaaaaccccatctgtacaaaaaatttataaaaa
-ttagccaggtgtggtgatgcacacctgtgatcccagctacttgggaggctgaggcaggag
-gattgcttgagcccagaagtttgaggctgcagtgaactaggattgcaccactgcactcca
-gcctgggtggcagagtgagaccctatctctaaagaaaaaaaagaaaaaaaaaaagaaaaA
-TCACATGagagtcattggtagaagagggaccgtgagttagatagacctgtgtttaaatcc
-tgggttctgcttcttacctgctttttggccctgagcaaatgacttcacctgcctgagcct
-ttgtttcttcatctgtaaaatgggctaataatgctgacACCCCTTGTCCCCCAATACTGT
-GATTCATAGGATTGGTCAGTATTTGTGAAATGCCACTGGACACCCAGGAAGTAATGCCAT
-AAAGAAGAAACTAATAGCAGTGGTAATAGAATGATTACTATTAAAGTCATCTTTGAGTGC
-TCAGTGGAAGTTGTTTAAAGTAGAAATTGCAAATGGCAGGACACACtttttttttttttt
-tgagacagggtctcactctgtcacccaggccggagtgcagtggcgcgatctcagctcact
-gcaaccgccacctcctgggctcaagtcatatccttctgcctcagcctcccaagtagctgg
-gactacaggtgcgaatcaccatgcctgctaattttcgtattttttgtagagataggtttt
-taccgtgttgcccaggctggtcttgaactcctgaactcaagtgatccccctacctcggcc
-tcccaaagtgctaggattaccggcatgagccaccgcgcccagccTTACACACTTTTTTTT
-TTGCCCTGCTTACCTGTTTGTGTTTTTTATATAAACTGGTTGCCAATATTTTTTAAATGG
-GGACCTTTTCATTAAAATACAATTCCTGGCTTCTCTTGGGGAAAACAATGGGAATGTGGG
-GCCATCTTGGGAACTGCGAGGGTGGGTCACAGCACTGGCTCTGAGTATCTGCCAGCCAGC
-GTTCCCATCCCAGGCCCATGCtctacagctgtaaaatggtgtcttccttgcaggctgtag
-cctagatagaatgaggtgagccaggtaatgagctgggtcaagggccaggaacacagcagg
-cacttggtaaaCCCTAGAATGCGTTGTGTACCCTTTTTAGGTAGCGCTTGTGCTGAGATG
-TCAGGCACACTTCCTGTTTCTCTCATCTTATTACCTGCCTGGACCCTAAGTTTGTAGCTG
-GTTTAAGAGAGGCTTAACCCTCTCAGCCCCATCAGCCCCCTCCCCAAGGGACTCTGTTGA
-AAAATGTATTCCTTTCAgaattttagtttaaatttaattgctctgtggccttaaatgact
-taacctctctgagcctgggcttgggtatctgtaaaacaggATCAGACATCACAGGACTGG
-CTTGTGTCTGTCAAAGGCCAGCAGGCACTTGGAAAGTGGGTGCCACAAGGGTGATAGCAT
-GGGGTGGTGGCATGGGGGTTCTGGGTAGGACCTGACCCTTCTGTTTCTCCCCATGTCCCA
-GGAAGAAGCTGGTGCTGGAGAACCTGGAGGACTCCTGCGTGCTGACTGGGCCAGATGATT
-CCCTGTGGGACAAGCACGCGTGCCCAGCCTACGTGGGACCTGAGATACTCAGCTCACGGG
-CCTCATACTCGGGCAAGGCAGCCGATGTCTGGAGCCTGGGCGTGGCGCTCTTCACCATGC
-TGGCCGGCCACTACCCCTTCCAGGACTCGGAGCCTGTCCTGCTCTTCGGCAAGATCCGCC
-GCGGGGCCTACGCCTTGCCTGCAGGCCTCTCGGCCCCTGCCCGCTGTCTGGTTCGCTGCC
-TCCTTCGTCGGGAGCCAGCTGAACGGCTCACAGCCACAGGCATCCTCCTGCACCCCTGGC
-TGCGACAGGACCCGATGCCCTTAGCCCCAACCCGATCCCATCTCTGGGAGGCTGCCCAGG
-TGGTCCCTGATGGACTGGGGCTGGACGAAGCCAGGGAAGAGGAGGGAGACAGAGAAGTGG
-TTCTGTATGGCTAGGACCACCCTACTACACGCTCAGCTGCCAACAGTGGATTGAGTTTGG
-GGGTAGCTCCAAGCCTTCTCCTGCCTCTGAACTGAGCCAAACCTTCAGTGCCTTCCAGAA
-GGGAGAAAGGCAGAAGCCTGTGTGGAGTGTGCTGTGTACACATCTGCtttgttccacaca
-catgcagttcctgcttgggtgcttatcaggtgccaagccctgttctcggtgctgggagta
-cagcagtgagcaaaggagacaatattccctgctcacagagatgacaAACTGGCATCCTTG
-AGCTGACAACACTTTTCCATGACCATAGGTCACTGTCTACACTGGGTACACTTTGTACCA
-GTGTCGGCCTCCACTGATGCTGGTGCTCAGGCACCTCTGTCCAAGGACAATCCCTTTCAC
-AAACAAACCAGCTGCCTTTGTATCTTGTACCTTTTCAGAGAAAGGGAGGTATCCCTGTGC
-CAAAGGCTCCAGGCCTCTCCCCTGCAACTCAGGACCCAAGCCCAGCTCACTCTGGGAACT
-GTGTTCCCAGCATCTCTGTCCTCTTGATTAAGAGATTCTCCTTCCAGGCCTAAGCCTGGG
-ATTTGGGCCAGAGATAAGAATCCAAACTATGAGGCTAGTTCTTGTCTAACTCAAGACTGT
-TCTGGAATGAGGGTCCAGGCCTGTCAACCATGGGGCTTCTGACCTGAGCACCAAGGTTGA
-GGGACAGGATTAGGCAGGGTCTGTCCTGTGGCCACCTGGAAAGTCCCAGGTGGGACTCTT
-CTGGGGACACTTGGGGTCCACAATCCCAGGTCCATACTCTAGGTTTTGGATACCATGAGT
-ATGTATGTTTACCTGTGCCTAATAAAGGAGAATTATGAAATAATTTTATTTTTCTCTGCA
-ATTTCTTCCATCCTTTCCAACGATCTCTTACCAGTTTTTCCTGCCTTCAAAACTGGCCCC
-CATGGTGAAAGGCCGTAGAGTTGTGTCTTAACCTGGGCTGAGTGGTTTGTGAGAACAGAT
-TACCTGGAGCCCAGTGGGTCTTCCTGCACTCCTTCTGTTTCTTCTGGCAGCAGCAGTGTC
-TCTATTAGGGTACTTTCTGAGTCaaaatggcttcaacaagatggaaatatgtttcacaca
-aaacaagaagtcagcagatagggtgggcttcagtgctggtccattcaactcccaaagctg
-cgcacagggaccccggctctccaggctccttctgtctctTGGCTGTATTGTCTCGAGACT
-GCTGGCCCAATGGCTACAGCAGGTGTCACATTAAAGAGGTCCATGACCAGAGGAAGAAGC
-CAGGGGTCATTGtagtacctgagaactcagaactctggagtcaggctgcctggaattaaa
-tcctggctccagcactcaatagctgtttgacccttggcaagtttcttaaccactctatgc
-ctcagattcttcatctgtgaaatgggggacaatgatagtacctaacttatgagaactaaa
-tgacttattttgtataaagcaattagaacaagcagcgcctggcataataagcccacaata
-aaagttACTCCCggctgggcacggtggctcacgcctgtaatcccagcactttgggaggcc
-gaggtgggcagatcacaaggtcaggagttcaagaccaacctgaccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaatttttagtagagacggggcgtggtggtgcgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaattgcttgaacccgggaggtggacgtt
-gcagtgagccaagatcccgccactgcactcagcctgggcaagagagcgagactccgtctc
-gaaaaaaaaaaaaaTGGTGCTCCCACATTTCTTTCTTGGGATGGAGGaagctttcccaga
-agcgctcctgaccgactttcccacacatctcactggtcagaactgcatcacttgccgttt
-ctgaccaatcaccagcTTACATTCATGGGGCACGTGCTTACACTAACCATGGCACTCCTC
-GAGCTAAGTGGAGCTCATGCGTCATATGGAGGGGTAGTGACTCCTGAGCAAAACCAGGTT
-CAAAGAGGGAGGGGATCGTAGGGAAAAGAATGTGCGGAAGTgcggaggcccagccaacag
-cctgctaactgcagatactcgagagcggccaccctagatcatctgacccaggctggccca
-cgctagaattgcccagtgacccgcaaggtcatgagctaattgagctaaataaaatcattg
-tgtttttttgtttgtttgttttgtttttgttgttttgttttttgagacagagtctcactc
-tgtcacccaggctggagtgcagtggtgcgatcttggctcactgcaacctctgcctcccgg
-gttttcaaacgattcttctgcttctgcctcagcctcccgagtagctgggattacaggcac
-gcgccactacacccggctaatttttatatttttagtagagacgggggtttcgccatgttg
-gccaggctggtctccaactcctgacctcaggtgataggcccacctcggccacccaaagtg
-ctggtattacaggcgtgagccgccgcacccggccaatcattgtggttttaagtcactaag
-tttgaggctattttgttttacagcaaaagctaactgatgcaGACAGGGACAAGTCAGTCT
-CATCTCTGTGCACCCAGCATTGCCCAGAACAGGGCCTAGTTGTGTCTAGGGTCTCATGGG
-GCAGCCCCTGACCTCTATCTTGCCCCTCCCAGCTTCCAACAGACCCTGTCCCAGCTCCCT
-CCAAGCTGAGTGTTGGCCTGATACCTACCAGTGGAGCGAGGGGAACACGAGGACTGCCAA
-GGGcaggtaccgtgccaacccttcactccattccacaaagagactcatttactcctcatg
-acaatccagtgaggcagatgttcctgtcactttacagataagacaaatgagctttagaga
-gagcagaagactcatccaagacctcacaacAGAGAAAAAGACTCCTCTGGTTTTTGCCTT
-GGAGCAGGAACTTTTGACAAGGCTGCGCAGATGCAGCCACATGAAAACCGCCCATTAAAA
-ATGTAATATCggcccggagcgggggctcacgcctgtaatcccagcactttgggaggccga
-ggcaggcagatcacttgaggtcaggagttgaagaccagcctggccaacatggtgaaaccc
-cgtctctactaaaaatacaaaaaatagccaggcgtggtggcatgggcctgtaatcccagc
-tactcgggaggctgaggcaggagaatcacttgaacccaggaggcagagattgcagtgagt
-caagattgcaccactgcactccagcctgagcgacagagcaagactctgtctcaaaataat
-aataaaaTGTAATATTCACTCTTATCAAATAATGGATGTCACCACACCCCGACCCTAATT
-AGTGAGGACTTTCATGTTCTACTTGTCTTCATTTAATCATCATTGTATAAGAGTTTTACA
-ATATCAAATTAGTAGATGTATATTACTGAAAGGGAAGGACTGTTAGAAATTTACTTGAGG
-AATGTCTGCCACTGGGGGCTGAACACAAAAGATCCTATTGTGACCTGCCAGATTATTCat
-tcacttagcaattcaacaaccatcgctgaatgcctactataggccaggtgccatgcaaga
-cagatgtgctcccaccctcaagggttcacagtctaatagaggagagagatgttaaacaga
-taactgtacagatggcaTAGCTAATTATATTCGTGGAAGTTCGTTGTGGCAAAGACAGGC
-ATCTCAATATTTCAGGAGCTCCCctatattttctagcctcccttacagtcacatgactag
-ttctgaccagtggggtgtgtgtaggagtgGCAGGCTGAAGCAATGGAGAGCTGGTGAGCC
-TCATCCCTCTCTTCCCCTGCCACAGCCACCTTGCGCCCACAAGTtcccttagctacaagc
-tggaggagagccaccagatccaccttagatttcactgagcaagaaataaagcttcttgtg
-ttaagtctttcagatttggagtttgtctggtagatagtgttaattaccatgactaaGGAA
-AATTTGCCATTAGTGAAGGGAGGAAAAATATTCTCCACCAGTAACAAGGCCATGTCAGTC
-TGCTGCATTATAAACCCCAAACAGtagtttatgatcctctgggctggcaatttgggctga
-attcagctgggtcactcctgcagctgcaggcagcaagcagctcgaatgtctaccttgcca
-ggaaggctcttctctgctccacatggcctcgtcctccaataggcatagcctactccttcc
-tatggtggtctcagggtttcagaaagcaacaagagaggacaaattccagtgttcaagctg
-cactagtgtcaaagcatatcaaatagcatgtcaaattccacatcaaattcaggatgcagg
-caaattgattctttctcttgatgggaagagctgaaaaTAATGTGTGGTCTTGTTTTTCAA
-TGTAcagtggtcccatttatccaggggggatacattccaagacccccagtggatgcctga
-aaccacagatagtacagaattctgtatataccatgttttttactatacatacatacctac
-gataaggtttaatttgtaaattaaactcttacaaattaagagttaacaacagctgggcac
-agtggctcacgcctgtaatcccagcactttgggaggccgaggtgggcggatcacgaggtc
-aagagatcgagaccatcatgaccaacatggtgaaactccgtctctactaaaaatacaaaa
-attatctgggtgtagtggcgcatgcctgtaatcccagctacttgggaggctgaggcagga
-gaatcatttgaacccgggaggcggaggttgcagtgagctgagatcgcgccactgcactcc
-agcctggtgacagagcgagactccacctcaaaaaaaaaaaaaaaacaaaaaaaacaaaca
-gttaacaataaatagaacagttataacagtatgttgtaataaaagttatgcgaatgtggt
-ctctccctcaaaatgtcctattgtactgtactcacccttcttgtgatgatgggagataat
-aaaatgcctacatgatgagatgaaggtaaatgaatgacatgggcattgtgatctagcgtt
-agactactactcacctgatgatacgtcagaaggagaatcatctcctttgggtgatccagg
-atcatgaagccgtgacaatgtccatgattggatgtcaggagcagatgatgttaatgatta
-accgtgggtaatgtctacaatatggatacagtgcaaaagggatgattcacatcctacgtg
-gaatagtgcaggattgcatgagatttcatcatgtggttggctgcaggtaactgacattgc
-agaaagcaaaaccacagatcatgggggTGGGGGTGGGGAACTACTGTACAACATGAGATA
-TATTTGATCAAATAAGATGAGGTGCACCTAAAACTTTCCCTACAGGTTGTATGCCCCTGA
-GTAAATTGCTTGGTGTCTCTGGATCTCCAGCTGTTCCCCTTCTCTCTGCATGGCTAAGCC
-CTGTCCGTCACTTGGGGCTGGACCTAGAGCCCTGCCTGGCCACTAAGCCCTCAGAACAGG
-GTTTCTTTTTTAAAAAAGACAGGGTcgggaggtggaggttgcaatgagccaaggtcgcac
-cattgcactccagcctgggtgacaagagtgaaactccatctcaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaagacagggtctcactctgtcacccaggctggagtacagtggt
-gtgatcatggctcgctgcagccttgaacacctgggctcaagctgtcccccaacctcagct
-tcctgagtagctgggagtgccaccacgcctagctagttttttaaaaaattgttttgtaga
-gacaggggcctcactattttgcccaggctggtcttgaatgcctggcctcaaatgatcctc
-ctgccttggcctcccaaagcactggggttacaggtatgaccacTACCCACAACCAGAACA
-Tttctcaaatgtgattggttgatctcctgcatccatccctggggtgcttgtttaaaatgc
-agagccctggatcctcccccaacctagagagtcagaacatctgggcttctgcatcttaac
-aagctccctgggtgatgctgctgggcctccaagttggagaacctctgTATTTGAAGAAAT
-CCGGACTCCTTGGGGACTCAAATCTTATTTCAGCTCTTCTCTGGACTAGTTTGACTTTAG
-CCTTGGTGTAAAATGGGTATACATTTTACACGCCTGTGACGCCAGGATGCGCTCACAGGG
-GAGGGAGGGCTTTATCAGAGGTCAGAATCTAAGCCACCACTACAGTTGTACTAGATCCAA
-GGAGAAAGACTCCCAGGCCTCATttcctcatcgttctctcttctcttacctggctttatg
-gttcttcatagcactgagcaccaccaggcagtgtattttatgttttttttgagctttata
-atgccagggactatgttttgtttataactgttcacccagttcctagaacagtgcctggta
-cacaggagtgctcaataaatgtttgtggaatgactgaatAAAAGTTGTTCCTGTACAGAT
-TCCACCTGCCTAGAGCAAAGCCAGGACACTGATTGGGAtgaacacatagcacatgccaga
-catggctttgagtgctttacctggatcatctcactttatatgtgacagccaaatggtccc
-cagtgaccttcaccagctgctattcacgcctttgtacagtttcctcccatcctaagctgg
-gctgaccagtgtaatgaatacaatattgtgaaatgagaaagtatgacttttaagattagg
-tcataaaatatgttatggcttctgccttgctcttctggatcatctgctctggggacagcc
-agctgccatgttgcgaggacactcaattacccctgtggaaacttacatgtggtgaggatc
-gtaggcattctgcaaataaccagcaccacccaggcacataaaagagctttcttgagtcaa
-tcctccagccccagtcaagccttcagatgactgcagccccagccgacatcttaactacaa
-cctcatgagtgaccctgagccagaaccatctatgtagctgctccccagttcctaacccac
-agaaactatgtgatagcatacatgttgattgcttttttaagcaattaattttgggaaatt
-tgccacatatcaataattaataacttgtacagattctcacaacagcctatgtgggaggag
-ccatcataattaccattgaacagagaaagaaactgaggcccagatagggggaatctttgt
-ccagggtcacacagatagtgaactgtagcactgagattggaacccaagtttgaatgacta
-gagtcTACCCACTGAGGTGAAGGTGTTCAAGTTGAATGCCAGCTCTTCCCCTGAAGGGCC
-AAGGCTGAGACCAGAAAACCTGAAACAATATAGCTGCACCCaatataaatatatgcaggt
-aactcagggctgatggtacatgaccataataaatcagcagggtcatcaggagaaaacaag
-acaacaggagcgaaaacagatagaaacaaatatgcccagagtttgtatatcagtattatc
-agacgcagattataaaacaaaatgttggccgggcacgggggctcatgcctgtaatcccag
-cactttgggaggccaaggcgcatggatcacctgaggtcaagagttcaagaccagcctgac
-caacatggggaaaccccgtctcaaataaaaatacaaaaaaattagctgggcctggtggca
-ggctcctgtaatcccaggtacttcaggaggctgaggtaggagaatcgcttgtacccggga
-gggagaggttgcagtgagctgagatcgcaccatctcactccagcctgggcaacaagagcg
-aaactctgtctaaaaaaaaaaaaagtttactgcgtttaaataaataaataacctagaaac
-attgccaaagtatagaaaattatatcacatgacaacaaattttaaaataacctaacagaa
-cttctaaaataaaataatacaataatcaaaatttttaggccaggcacagtggctcacacc
-tgtaatcccagcactttgggaagccgaagtgggtggatcacttgaggtcaggagttcgag
-accagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaaattagccagg
-agtggtggcagacacctgtaatcccagctactcaggaggctgaggcaggagaatcacctg
-aacccgggaggcagaggttgcagtgagctaagatcgtgccatttgcactccagcctgggc
-aacaagagtgaaactctgtcacacacacacacacacacacacacacacacaaattaaatt
-taaaagatgggctaaacagcaaactagatatggctaaagagggaattagtgagacagaaa
-tcagaCaccaatcacagattcaagaaactccataaattttacacatagacacatcatagt
-aaaagtgcaaaaagccaaagattttttttaaaaaactcttaaaagcactcagaggaaaag
-aatcagagattctaaaaacaaaaaacaaaACAAAACAAAAAAACCCCAAAACAACAACAA
-CAaaaaacaaacaaaaaaccagtactacaacatggataaacctcaaaaacgttatgtcaa
-gaaaaaccccaaagttatgccaagtgaaagaagccagtcacaaaggttcacatattgtca
-aaatctaattttctttttgagacagggtctcactctgtcacccaggctggagtgcagtgg
-gacgatcactgctctacaggtgcacgccatcacactcggctaatttttgtattttttgta
-gagatggggtttcaccatgttgcccaggctggtcttgaattcctgggctcaagcgatcca
-cctggcttggcctccccaagtgctgggattactggcatgagccactgtggcccatcagta
-agatctaatttctataaaatatcaagaagaggaaagtctatagagacataaagtatatta
-gtgctgtcagttggaggatgggaaacagggaatgtctgctaatgagtacaggtctatttt
-ggggtgataagaatgttctttctttctttttttttttttggtctgagacagagtctcgct
-ctatcacgcaggctggagtacaacggtgcgatctcagctcactgcaacctctgcctccca
-ggttcaagccattctcatgcctcaggctctgcagtagctaggattacagatgtccgccac
-cacacctggctaatttttgtatttttagtagagacagggtttcaccatgttggccaggct
-ggtctcgaactcctgacctcaagtgatccgcccacctcggcctctcaaagtgctgggatt
-gtaggtgtgagccaccatgctcagccaaaaatgtcctaaaatttgattgtgatgatgggt
-gtacaattctgtaaatgttactaaaaactattgaattgtatattttaggtgggtggattt
-tatggcatataaattatatctcaataaagctgtttataaaaaGAACAGCAGTTAGATTGA
-CAGGTGATGATATCTCAATAAAGCTGTTTATAAAAAGAACAGCAGTTAGATTGACAGGTG
-ATGATATCTCAACAGCAACCATTtcccagcattttgggaggccgaggtgggcagatcatt
-tgagcccaggagttcaagaccagcctgggcaacatgaccaaaccctgtctctacaaaaat
-tagccagctgtggtggcacgtgcccgtggtttgcagctactcgggaagctgagcccagga
-gttggaggctgtagtgagccatgatcacgccactgcactccagcctgggcaacaagagtg
-aaactccatctcaaaaaaaaaaaaaaaaaaaaaaaaGGCTtccccaggccattcaaatgt
-acagccaaagttaagaaacattgtctaaagggatgtgtttccggcaaaagaaaaattatc
-ccagatgaaggtctgaggttcattccttcattcaacatatggagcctccattatgtgttt
-ggaactgttctagacaccaggaacacagcagtgagcaaaacaaaccaaagtccctgccct
-ctaggagaggaaaacagacccagaataacataaataagtaaaacatgctccgttagacag
-taatagatgctgagaagaaaaaatgaagccaggaaagcggatgtgaaatgctggatacgt
-gtgtctgtgaaatttcagatggagtaactagggaagatttttgggtaaagaccaaaataa
-agggaaggagggagccatgcagacgtttgggttatggcaggtgcaaaggccttagggcgg
-gagtgtgtctgacttactccaggacccagcaggtcaatgggacttgagtggaatgaggca
-ggggcagggcagtcagctacgaagacagagatcgggaggcaatttgcgagccctgggaca
-gatctcggattttgctttaagtgagatgggagtacttgggtcggggagtggcatgggttt
-gatttacattttaacaggactctccggcagctaggtggaaatggacggtagggggcaaaa
-agagaagcaaggaggcccaggaggaggctggttcaagacccctgagatgatggagcactg
-atggagctggagcgggatggggccggaggaggtgagggatgagattctgcaagtggagcc
-cgcaggatctgctgatcgatgggacgaggaacgggagaaaaaTTAAAGCGGCGCATGAGG
-CAGACGAATGCAAACTTCACCAATAGCTCAACGAAAAGACAGACGGTGACCGCTgagagg
-cagcgtcggatctgggtaagggcgggttcctgagcctgccaggcctggattcaaacctcg
-gctgagtggccttggacaggtcatcaacaaacagagccttcgtttattcatgtgcaaacg
-gggccaaggaccgggcctgccccgaggtatgcctgaggcttgggtgagCAGGCGCCGGGC
-TCGCAGGGCGCGCTCCTAACCCGTCCCCAGCGGCTCGACGCTGTGGATCCCGCCGCCCTC
-CAGCCCCGGCTCCGGCGCCGACTCCTGCTCAGgctcctgctcctgcccccggccccgccc
-ccggccccggccccggcccccggcccaccccggccccgcccccagcccccggcccccccg
-gccccgcccccggccccgccccggccccgCCCACCCCGCCTGCGGCCCAGCTCCTTCCCG
-CGGCTCTGCGATGCGGCCCGCAGGGTGACCCGGGCGGGAGTCCGGGGACCCGCGATCAGC
-CCCGGAGGACGGGGTGGGGTCGCCCCAAACAGGAGCGCCGGGACCGCTGGGACCCCGCAC
-TCGGCGTCCGCCGCCGCCGGGTAGCCGGGCAGTGGAGGTCCCGGATGAGGCGACAATTTT
-TCCGGCCCCCCCTCCCAGTCCCGCCCCACTTCCGGGGCCGCCACTTTCACTTTCTCTTCC
-GCCGAAGCCGCTCCCCTTGCGAAGAACTGGGGCCTCCCGGGAGGAGAGAGGGCTTTGCCT
-TGAAACCCGGGACGCCAGGGGCGCTCCCGCAAGTGGGGGTCCTCCGGGACTTGGAACGCC
-CCGGCTGGGTGGTGTCCGGGCGTCCTTTCCCCGCTTCTTCCCACCTCGGCTGGTCCCGTT
-TCCTCCTGCGCCCAGTGCGGACCTGTCTCGGCGCCCGCTGCCCTCTCACCGCCCCACGCA
-GGATCCCGGCCTGGTCACCGGGCAGTGTGATGCTTCCCGACTGCCGCGGGGACAGCGAGG
-CACACACAGGGCTTGGGCCGCGCCGGAGGCCACACGGCCTGGCTGAGTTGCTCCTGGTCT
-CCCGCCTCTCCCAGGCGACCCGGAGGTAGCATTTCCCAGGAGGCACGGTCCCCCCCAGGG
-GGATGGGCACAGCCACGCCAGATGGACGAGAAGACCAAGAAAGGTGGGCACAGGCTGGAG
-GTGGCTGGGGAACTTCCGGTGGGAAGTGGGCCCCGCAGGACCTGGCCTTGCCCCTGGCCA
-GAAGGGCCTTGGAGAGGGGGCTTTAGCCTGCCCTCCCTCTACCCTCCTCCCCATCAGTTT
-CCTCCTTTGGTACCTGCTGGCTTCCAGAGCCATCTTGGGGCCCTGAGAACTCCTTGGGCT
-GGCTCTGTGCTGAGATGGGGCTAGGGGACTCGCAGAGGACACAGGGCATTGAACTTGGAG
-ACCTCCTGGGCTGGTGGGAGACAGACGTCAGTTGACCTGAGAAGCAGGGGTACTTGCCTC
-TTCTCTTGTCCCCTGCACCTAGGGttgtagaacggaagtcagtcactgccttgctggaaa
-ccctcccatgcccctctgtgttctccaaacaaaacccagaggccctgggtggcccacagg
-atatctgtcctcagtcaccccgccatgctcactctactggagccccactggcttccttcg
-gttctcatccaaccattttttggccaaggcccttactcttccttccacctggaccactct
-tccccactggagcttgacacgtgcagcttctcctccttcaggtcttagcttcagtgttac
-cccctcccagaggcctcccctggtctccttaacctgtttatttccctgccagcaaggatc
-gcaatctgactttttttttttttcttgttaaacttgttcattgtctccccactgggcagg
-gagatccataaggagaggggccctgtttataaatctctgtgggattccagttcctgggac
-agtgggtggcacacagtagaagctcaataactgcttgttggataaatgaatAGAAATATG
-AGGGACCCTGGGAATGGGAAGGACAAACAACCAAATGAGCCTAGTGTGAGGAGGAGTGgg
-gaatattagagaacccctcccggagaaagggacttttagtctgggtgctgaaggatacgt
-aggagttcaccaggaagacagagaaagCAGCACACACAAAGGATCGCCTCCTTTCCTACC
-CCATTACTCTCAGCTCCTGAAAATAAACCCTGTGCTAACTGGCTCCTGCTGTACTGGCTT
-TCAGCAGAGGAAATGGCCCTGAGCCTCACCCGAGCAGTGGCGGGCGGGGATGAACAGGTG
-GCAATGAAGTGTGCCATCTGGCTGGCAGAGCAACGGGTGCCCCTGAGTGTGCAACTGAAG
-CCTGAGGTCTCCCCAACGCAGGACATCAGGTGAGGAGTGCATGGCTGGCCTGAACCCAAG
-GGACAGCAGGACAGGATATTCTTGCCTGTAGAACAGTTCTTCCtaatggcacgttctggc
-ttcaggaggcctggcttctaaccctagttatgtcattaatcaactgtgaaatacagagca
-ggtcacttcacctctcagtgtgtcctcattttaaaaatcagaccgtaacagtagctatct
-catagggttgttaggaggTGTACTGTATTAGGATGTTAGGCCTTATACAACAGAAGAAAA
-CGGAACAGTGacgtaaacaaatttgatggcagggagtccagatagggaggttctgctccc
-gacagtcctcagaggctcatattgtttctctcaccattctgccattcattcccagattcc
-tcatggtgcaaaatggccattccagctccatccagccatcacatcacaggaggaagggaa
-gaaagacacccctccacactcttctaaagagcatagctcaaaaattgtacacacttcttc
-cgttaattcctgtggaccagaactgattcccacagctacagttcagcttgaggggagact
-gtatagccaagatattcagctagaattcaggggttcgcttggtaagggaagggaagagaa
-tggatactgTCGGTCTGTGCTCCAGgagacttaaactcaatgctgaaacactttgcacaa
-tgcctggcgtgttatgcactcaataaTAAACATTAGTGTCTATCGTTATTTTTTGACTGC
-TTTTTCATTACTGGATAGTAAGGCAATAGTTTTATGGTTTCTGATTTTTGGTTCTCTTGG
-TGGGTCCCATTTGGTTTttcttaaaacagttttatttatttatttatccttacagttcga
-ccatttaaagtatacagttcaatggcttttagtatattcaaggttgtgcaaccattgcca
-caatcaattttagaacattttcatcatcctgtaaagaaacctggtactcattagcagcca
-gtcctcatctctctaccttttccctaactccccaaccttaggcaaccactaatctacttt
-ttatctctagggatctaccttctggaaattccatataagttgaatcatgcaatatgtggc
-cttttgtatctggcttctttcacttaggatcgttttcgagattcatccatgttgtagcat
-gtctaacaacttcattcccctttttttttttgacatggggtctcttgtctaggttgaagt
-gcagtggtgccatcatcgctcactacagcctcaacttcctggattcaagcagtcctcctg
-ccttggcctcccaggtagctgggactactggcatgtaccaccacacccggctaatttttt
-ttttctttgagatgggagtctcactctgtcccccaggctggagtgcagtggcgcgatctc
-agctcactgcaagctccacctcccaggttcacgccattctcctgcctcagcttcccgagt
-agctgggactacaggcgcccgccaccacgcccagctaattttttgtatttttagtagaga
-cggggtttcgccgtgttaaccaggatggtctccatctcctgacctcgtgatccgcccgcc
-tatgcctcccaatgtgctgggactacaggcgtgagccaccacacccagccacacctggct
-aatttttagaaagtctgtagagataaggtcttgctttgttgtctgggctggtcttgaact
-tctggcttaagcagtcttcccacctcagcctctcaaagtgctgggattacaggtgtgagc
-caccatgcccaaccagaactttattcctttttattgccaaataataatctattgtataga
-catatctcattatctttactcattaaatcagttgatggacatttgggtgtttctattttt
-tggctattataaacaatgctgccgtgaacatttgtgtccaactttttgtgtggacacgtt
-ttcatttctcttggatacacactagcagtggaattgctgggtcatacagtaactctatgt
-tactttttgaagaaatgccagacagttttccaaagtggctgcaccattttacattcccac
-cagcatatatgagggttctagtttctccacatcatctctaatacttgttgttgtttatct
-ttttgattatagccatcctagtaagtttgaagaggtatctcactgtggttttgatttgca
-atttcctaaccatttgatgacaaatgatgttaagcatcttttcatgcacatattttcttt
-ggaggtttgcctattcaggtcttttgcccattttaaaattgggtttatcttttttttttt
-ttgagatggagtctcgctctgtcacccaagcaggagtgcaatggtgcaatctcggctcac
-tgcaacctccgcctcccaggttcaagtgattctcctgccccagcctcctgagtagctgga
-ttacaggtgcccaccactacactggctaatttttgtatttttagtagagacgggtcttac
-catgttggccaggctggtcttgaactcctgacctcaggtgatccacccaccttggccttt
-ccaaagtgttgggattacaggcatgagccactgcacccggctgggtttatgtttttatat
-tgagttgtaggagtactttattcattttagctagaagtactttattcattttagcttatc
-agctacatgatttgcaaaaattttctctcattctgtggattgtcttctcactttgttgat
-ggtatcctttgaaccacaaaagttttaaattttgatgatgtccagttagtctatgtttta
-ttttgttgtttgtgcttttggtgtcatatctaagaaatcgttgcctcatccaaggtcatg
-aagatttacctctatattttcttctaaagattttatggttttagctcttacatttaggtc
-tttggtccattttgatttaatttttatataaggtgtgaggtaagggtccagcttcattct
-tttgcacgtggatattgagttgtgccggcactatttgttaaggctgttttcctctgttta
-atcatcttaaccctttttggaaattaattgaccataaatgtgagtgcttatttctggact
-ctcatttctataccattgaactataatatatatctgcccttacgccagtaccacactaat
-tactatagcttcatagtatttgaaatcaggaaatacaagttctccaacttttgttctttt
-tcaatattgttttggttattgcaagtctcttgaatttccatataaattttacgatcagct
-tgtctgtttctgcaaaaaaaaaacaacaacaactgggaattttggtagggatttcattga
-atctgtagatcattggccacttgattttaaacaaaatattgagatatctacttcttgaaA
-TGATTGCttgagacagtacctgtgtactccttgctatgaaaaatgaggaagttaacatac
-tcatcttccacctttccttttccttactttttttgttGAAGTATCATTGTGGACACTTTC
-CCAGTTGACTTCCACTTGATCCCCTGAATTAACTAACTGGCACTGGCGTTTCCTTTGTAA
-AATGTACAATGTCAGCCACCATCTtgctactaaagtgtggcctgtggaccacaacatggg
-gggaatctcaggtctcacctcagacttgctgggtcagaacctgagttttgagaggctcTG
-GGCAACCGGCACCTCTCAGACCTGCTGTTGGGTTCTCATCGATGGACCCGATGCTTCCTA
-GCAAATGATACCTGTTGTATGTGTTATTGGTAATAACATAGTTTACTTAGCTATTACATT
-AATTAATAAAACATGAGCGCTGAAAGAGTTGTTTCTGTGAAAATAAGCTGATTGCTTTAA
-AAAGATAAGAGACAAATCACCAAAAAAAAAAAAAAAAAAGATTAACACTTTTGGGTGAGA
-CAGTAGTAAGGAAATACAGTAAAAATCCAGAAGGGCTCTGTGCTCTGATGCTTCAGGAGT
-GTGTCTAAGTTCTTGCTCGCTTTAAAGAAGCTGCTACTAGAAATTATAGATCATGATTAT
-CGATGTGGTTCATACAAAAAAAAAAAAGAAAAATCCCTGGGAAACTCCAATGAGCAGGTA
-TAAACTCACgctgggcatggcggctcagcactttggaaggctcaggcaggagaatggctt
-gaactcgagtttaagaccagcctgggcaacatagtgagaccttgtctctgcaaaaaataa
-aaaaaattagccaggctgggtggcacacacctgtagtcccagctatttgagaggctgaga
-tgagaggattattagaccctgggtggttgaggttgcagtgagccatgatcatgcctgagt
-gacaaggtgaaaccctgtctcaaagaaagaaagagagaaaaGCCATTGGCTGTACACCTA
-GAGACTGGCCAGTGAATATGCATTTATAGTATGTAAGTTAAAATTAAGTGTTTAAGCTTT
-GTCTGCAGCTGTTTTTGTGATTCTCTGCTGTTCACCAGCGATCCTGATGTCACATTGGAT
-GAGAGAGCTCCAGCTGTATTTTTTTGTTGATAGTGTTAAGATTATAGCTTTAAAAAATTT
-TGTTTTCTAACATAATTAAGGCCTTTATGCTTTGCCTCTAGGTTGATTCTAAAAGTGTAA
-CACTACTAGAAAGGATTTATAGTATTTTGATTATGGAAATATTATTCACTATAGAATAAC
-TAGTGCAGTTGAAACCATATGCACTTTTATGTTTCAAAACCCTTATTGCTGGAAGAACAT
-TTTGGGGTTAAGATCCAGTCCTTTTCATTTTTTACTTTTCTTCTATTCTCCTGTATCAGA
-CTCATCTATTTTTGTTTTTCAAGAACTTTTCACGTGGAAAATGTggtaaacttttagagt
-ctttgcatgtttaaaaatttctatattttgctctgtcaattcattgatagttgactgggt
-attcaaattgtttacctgaagaattttgagagcattttctggactgcttttaaataaatt
-tcagatattattttatccttaaatactttagtatgtgtcttcaaaaaattaggacttggc
-ggggcacgatggatgatgcttgtaatcctagcactttgggaggctgaggcaggtggactg
-cttgaacccatgagttcaaaaccagcctgggcaacatagtgaaaccttgtctctacaaaa
-cattagctaggcatggtggtgcgcccatctagtcccagctacccaggaggctgaggtggg
-agggtcacctcagtccaggagattgaagctgcagtgagccaagatcatgccactacactc
-catcctgggtgacagaagtgagaccctgtctcaaaaaaaacaaaaacaaacaaaacccct
-caatactattatcacaccttagaaaaggaataagaattccttaaaatccgctaatgccct
-gtttatattcacattttcctatttcattagtgctttttacaattggtttcttcaaatcag
-gagccaaacaagatctacatgtagcatttcttactatgtcttaagtcccttttactctcc
-tctatttttatgccactagttttttttttaagaaacctggtcttttgacctctagaattt
-tccccatattctggatctatccattacctcttcatggtatgtattagaccactctagcat
-tgctacaaagaaatatctgagactgggtaatttgtaaagaaaagaggtttaattgactca
-gttctgcaggtggtgtaggaagcatggtcctgacatttgcttggcttctggggaggcctc
-agtgaacttttactgaagcgggagcaggcacttcacatggtgagagagggagcaagagag
-agagttggtggggaggtgccacactttacaacagccagatctcacgaggactcactatgg
-cgagaagtcactacagtgagcgcagcaccaggctgtgagggagctgcccctatgacccaa
-acacctcccaccaggcctcaccttcaacactgaggattacagttcaaggtaagatttggg
-cagggacaaatacccagactatcatggtgtcatttactatctcccgtttttcctgtaact
-ggtagttagagataaagtttcaattagtcagCAGTCACtttttttttttttttttttgag
-acagagtttcactctgttgcccaggctggagtgcggtggcgcaatcttggctcactgcac
-ggtccgcctcccgggttcacaccattctcctgcctcaatctcctgagtagctgggactac
-aggcgcccgccaccgtgcctggctaatttttttttttgtatttttagtagagacgggttt
-tcaccgtgttagccaggatggtctcgatctcctgacctcgtgatccacccacctcggcct
-cccaaagtgctgggattCAGCAGTCacttttaatgtgcaggaactcttcctcattttttg
-gttgcttcatgcctttccttgctttctgaatgcagtgttttcccaaatctctctgaaggt
-actagttagacttcactgttgcttattgttccataccctaaatgatctctgtttcctttg
-gggtcggttctgttttttcatcttttcatgcttttgattttccaaacatgttggaggatc
-ctcaAGAAAGTTAAAACCACTTTCTCTGGAATAATACCATGTAGATTTAAATCCTGCCTC
-Tggctgaacacagtggcttactcctgtaatcccacttcgggaggccaaggcaggaggatc
-acttgaggccaagagttcaagaccagctttggcaacatagtgagaccctgtctctacaaa
-aacttaaaaaattagccaggcatggtggcatgagcctgtggtcccagctacttgggaggc
-tgagatgggaagagcccaggaggttgatactgcagtgagccaaggtagcactactgcact
-ccagcctgggccacagaaagagagcctgtgtcttaaaaTTAAATCAAGACATACAAATga
-atcctgcctctaacagttattagttgcttagtttggcagagtcactggaacctatctgtg
-cctcacatttttatctgtaaaacagggatacagcagtacctgtctgatgggttggttgag
-aggattaaatgagttaatacacatgaagtgcattaaatagtcttagcacgtagttaacaa
-caacttctggtggttTCACTAAGgagcaggggagagaagacagaagaggttggagaggtc
-agggaggtgccagatcatggaggccctcgtgtgctgccacgagttgattctaagagtagc
-gtggagccattggagggGCCTAACTGGTGGGTTCTAATAAAGGAAGAAGCATGGGTGGGG
-CCTACCCCAGACTGGGGTTtgtgtgtgtgtgtgtgtgtgtgtgtgtgCATGGCCATGTGC
-CTGTGTGCAAATATGTACATGTCTGTAGCCGGTGGCTGAGGCTGGACCCCTGGCCAGAGC
-CCATGCTGAGCCCCTGCTGTTCTCTGCAGGCTGTGGGTGAGCGTGGAGGATGCTCAGATG
-CACACCGTCACCATCTGGCTCACAGTGCGCCCTGATATGACAGTGGCGTCTCTCAAGGAC
-ATGGTGAGTGAGGAGGCGGAGGGCGACACTGGGGTGAAGGctctccctttcactcctgct
-tcctctctctcctctggccctcccttcccactctccctctctttgccccCACCAGGTTTT
-TCTGGACTATGGCTTCCCACCAGTCTTGCAGCAGTGGGTGATTGGGCAGCGGCTGGCACG
-AGACCAGGAGACCCTGCACTCCCATGGGGTGCGGCAGAATGGGGACAGTGCCTACCTCTA
-TCTGCTGTCAGCCCGCAACACCTCCCTCAACCCTCAGGAGCTGCAGCGGGAGCGGCAGCT
-GCGGATGCTGGAAGGTGAGGCTCTGCCCTGAGCACCGCCGGACCCAGCGGGGGCCCTGGA
-CTCACTTGAGGGCATAGGGCAAGCAGGGGCAGAGCCCCTGGGTTTTTAGTCAGGGACTCA
-CCCAGAGGACCCTATCCAAGTGGGGAAGAGAGGACCTAAGACACATGGGAGGGAGCATTT
-CAGGGACCCATCATGAGAACAGCTGGCACGGGGAGGGGTGGACTCCGtccaggctccggc
-attcccagctgtgtgaccttgggcaaggttgctcctatctgctgcccagtttgctaaaat
-cataaattgggtatgacagtgatCGTGATAACTAGTGTTTATTCTTAAtttttaacttct
-gaaatgtttcagacctacagaaaagttgctaaattttacaaagtagtacataaagaattc
-ccatgtacctttcatgtgggttttaccacatgtgctttctttttttttttgagacggagt
-ctcgctctgtcgcccaggctggagtgcagtggcacaatctcggctcactgcaagctccga
-ctcccgggttcacgccattctcctgcctcagcctccggagtagctgggactacaggcgcc
-cgccaccacgcccggctaattttttatatttttagtagagacggggtttcaccgtgttag
-ccaggatggtctcgatctcctgactttgtgatccgcccgcctcggcctcccaaagtgctg
-ggattacaggcgtgagccaccacgcccaacccacatttgctttcttttatcattctcttt
-ctatataaaattattttttttctgaaccattttgagagtaagttgcagacatgatgtctc
-tttcccctaaataattcagtgtgcatttccttgaaaagaaaggtcattttcttacattac
-tgggtataacaatccaactcaggaaactaacgctgatacagtactggtatccagtctaca
-gatcttactcagattttaccagttgtcccactattgtcatttatagcaaaagacttggca
-ttctgctgtcatgtctcagtccctttcaaagagtccaggccagtttcttttttttggcgg
-gggttgggggctgatgtttcctccggagtggatcaagtcactgttttggcaggaccgcct
-cagcggtgctcttgggtccctcttggtgcatccttcaggaggcacGGAAGGGCTGGTGTT
-GTGCTGGGTTTTGAAGCTCAAAGGACATAGAAGCATTTATCGGTGGAATAGGGACCCTGA
-CCCTGGGGGAGCCAGGATGCCCACTTGGCCAGATGGAAGCTGGAGGTACCCCCAGGGAGG
-AGGGAGAGGATAGGGGGAGGGTCTGCCTGGCTGGCTCAGGGAGACCCACCCCCATGGGTG
-TGGACCAAGTGGGCCGCGTGGAACCACCACCCTTTAACCCTCCTCCACAGATCTGGGCTT
-CAAGGACCTCACGCTGCAGCCGCGGGGCCCTCTGGAGCCAGGCCCCCCAAAGCCCGGGGT
-CCCCCAGGAACCCGGACGGGGGCAGCCAGATGCAGTGCCTGAGCCCCCACCGGTAAGCTG
-TCCTTGGCCTCAGTATCCTCTTCTGTGCCCCTCCCTTGCCTCACCCTGCCCAGTCGGGCT
-CACAGCACCCTCTGCTCCCAGGTGGGCTGGCAGTGCCCCGGGTGCACCTTCATCAACAAG
-CCCACGCGGCCTGGCTGTGAGATGTGCTGCCGGGCGCGCCCCGAGGCCTACCAGGTCCCC
-GCCTCATACCAGCCCGACGAGGAGGAGCGAGCGCGCCTGGCGGGCGAGGAGGAGGCGCTG
-CGTCAGTACCAGCAGGTGGGCGGGAAAGTCCCTGGACAGACACCTGCAGACCGCACGGGG
-GAGGTGTAGGCCAGGAAGGGAGACACCTGCGCACTGCCGCGCCTCTCCGTTACTGCCTTG
-CCCCTCCCAACCATGCTGCTGGCAGTGACCCTGCACCTGGCTGTGACCCTGCACCTGGCT
-GTGACCTGCCCTCTCTCAAAGGTCACCCTGTGGCTGAGACCCGCTCCCTGGCTGTGGCGC
-ACATCCAGGTTCACATGCCCCACTCCCACGTGGGCTGTGGCTCCATCCCCAGCTTTGACA
-CACCACACGAGTATGGCTGGCCATGACCCCAGCACCCTAGCCATGACCCCAGCACCCTAG
-CCATGACCACACCTCAGCTCGGACCTCACCCCCACCCGTCTGTGACCTAAGCCTGCTCCA
-CCTCGCCGTGACCTCACCCTGGACTCTCCTACTCCTGACCTCTTCCCTCTCGGGCTGGGC
-CCACCCCTGACTTCCTGAGAGCCTGGCCTGGACCCTCGCTGCGCCCTAGGGGGATGACCC
-CCGACCCCGGTCCTACGCCTTAGCCCTACCCCGCCCCCATCGTGACACACGCACTAATGA
-CACAGACATTGATCCCCGAGTGCTCCCCATTCTGATCTCACCCCTGGCCCCACCTGCATT
-CCCCTTGGACCCGGTGCTGCCCCTGGCCACCCCACTCCTGTTCCCGTCTCAGCTCCTCGG
-CTTCGTCACTTCCCCACCCCTGACGTTGAGTGGCTCCACCAGCCCTGGCCCGGGCCCTGC
-CCTGCTACCTGACTCACCACTCAGACCCCGGCCCCCTTCCTTACCTTGCTGCCATTGCTG
-TCTCACCTGGCGCCTTCCGTGGCTACCTGGCCGGCCTCCCCTCCCTTGGCTTCCCCACCT
-CCACCTGGCCTCACTCCCAGCCCCGCCCCTCCCAACCTGCCTGCTCCTGcccatccccca
-ccccccaccccccatcccccagccccacccccatcccccacccccgtcccccatccccca
-tccctacTGGCTCCCAGCTTTGCCTGTGGCTGGTCTGACCCAGCCCTGACCACGCCCCCT
-GGCCCTTCCCCCTTCGGGGTCTGACCCGCCCCCGAGGCCCTGACCCGCCCCGTGGCCCCG
-CCCCGTGTGCCCAGCGGAAGCAGCAGCAGCAGGAGGGGAACTACCTGCAGCACGTCCAGC
-TGGACCAGAGGAGCCTGGTGCTGAACACGGAGCCCGCCGAGTGCCCCGTGTGCTACTCGG
-TGCTGGCGCCCGGCGAGGCCGTGGTGCTGCGTGAGTGTCTGCACACCTTCTGCAGGTGCG
-GCCCCCAGTCCCACCCCCGGCAATGCAGCTtaatcaaagccgccaattacgcagggctgg
-acgtgggtggggccctgtgctctgatacctcattggacgcccgcgaaaacctacgaggta
-ggctccgtctccccatgttgcggacgaggaacctgagggaaagagaggcccagcgcctta
-ccccaggcccacggctcatgagagaagcagcctagacgtgagcgcaggCGTGGGGGGAGA
-CTCCCTTCCCCTCTACCTTTCGCCGCCCGGGCTCCTGCAGCCACGCTGCTCTCAGCCTCG
-CTGTGGGCATCTGCCAGTTTCTGAGTCTCCTGTCATGGCCCCCCCACCCCTGAATGTGGG
-GAACACAGACCCGCTCACCACAGCGGACCCTTGTGGAGCCGCCCCTGGGTGacaggctcc
-gtgcctgcctcctgcagcttacattccagcagagaggctgatgagaatcggataatcgct
-ggttgatgtctttgtgaattgtgtcaaatgctacatacagtacattaagagacaacagga
-gtccttcccagagagggtggtctggaagcttccaaggaggtagccccagagcagggaccg
-gaaggcctgctgtaggtgtggggtgtgggcctggcctgttggaggagactgaggaggtct
-cttggtggctggagcagagggatgaagggggtaatcagagcaggatagagaggtgttggg
-tacgtgagcagcagtgaggagttgggatttgttctgggtaggatgggagtcactggggag
-acatggctgctgttctgagatagactctaggggccagatggatgcagggagcccagcgag
-gaggctcctggagtcacccaggtgggggatgtggggcctggaccagagaatcagagcggc
-agtatggaggcagggtggagGCCTTGGTGATGGGTTGGTGAGAGGGATGGGAAGGAAGGA
-GATATTGAGGAGAAGTCCACCTGGGGTGACTGAGTGAGGCCCCTGGGGTCAGGCCTTGCC
-ATGTGAGGGATGGAGTCCCCAGTGAAGGGGGTTCCTATGATCCTAACTCTTTTCCCCTCC
-CCTCCCCTAGGGAGTGCCTGCAGGGCACCATCCGCAACAGCCAGGAGGCGGAGGTCTCCT
-GCCCCTTCATTGACAACACCTACTCGTGCTCGGGCAAGCTGCTGGAGAGGGAGATCAAGG
-CGGTAAGGCCTCAGGGTGGGAGACATACCCCAAGTCCCAACTCCTAAGGAACTGGGCCCT
-GAGCAGGCAGCAGACATCtttcttttctttcttttttttttttggagatggggtctcact
-atgttgtccaagctggtctcaaactcctgggcttaagcgatcattcatcctcagcccccc
-agaCATTTTTCAAGAGCTTTGTCCATGTGGGGTGTTGAGACCCCAAGCAGAAAAAGAATT
-GAGGGGAGTAGCTAGTCAAGAAACCACATCTATGAAGGAaggacagcagagttgttaaga
-atcagggactcggctgggcgtggcagctcacacctgtaatcccagcactttgggaggatg
-aagtgggcagattgcttgaacccatgagttccagaccaacctgggcaacatggcaaaaaa
-tattcaaaaaatagccaggcgcgggggcatgcgcctgtagtcctagctacttgggtgggg
-tctgggatgagtgggctgaggtgggaggattgcttgagcctaggaagtaaggttgcagtg
-agctgtgattgtgccactgcactccagcctgggcaacagagtgagaccttgcctcaaaaa
-aagaaaaaaaaaattagtcagggaactctggagcctggtggcctgggtgtgtgaccacaa
-gtcagatatttaacctctctatgcctctatctcatctctgttagagtcagagttacagct
-tctatttccaggattgcaaagattacagtagaggatatgtgtatagaattcatagtagta
-cATccaggcgcagtggctcattcctgtaatcccagcgctttgggaggccaaggcgggtgg
-atcacctgaggtcgggaattcgagatcagcctgactaacatggagaaaccccatctctac
-taaaaatagaaaattagccgggtgtggtggcgcatgcctgtaatcccagctactcaggag
-gctgaggcaggggaatcgcttgaaccccggaggcggaggttgtggtgaactgagatcgcg
-ccattgcactccagcctgggcaaccagagcgaaactccgtctgaaaaTATATATATATAT
-ATTTAGAGTAGTGCTTGTCACATAGTAAGCCTTtgttgttgttagcgcttactgtgtaac
-aaatcactgcaggctcaaaacaacagtcatttattcagctcataaatctgcaagttagga
-cagttggccctctgtatctgtgggtaccacactggagaattcagcaacggtggatagaac
-atattcttacaaaaaaaattacaataaaaaacaaatttaaaaaacaatacagcataaact
-atttgtataacatttatgttatattaggtattataaataatctacagatgatttaaagtg
-tatgggaggatgttggtaggttgtatgcaaatactgcactattttatataaggggtttga
-gcatccatggatttgggtatctgcaggggtcttggaaccaattctctggataccgaggga
-tgactataatttgggctggacttacctggatggttcttctggtctgggcagggcctcgct
-gatttcacctgggcctggctggtgggtcagccgcggtggcctggtttataatggtctcat
-ctgtgatgactgggatgactggggcctccttccacttcaatgtctcacccaccagcaggc
-tgcccgggccttctcatgtcatggtggtctcaaggttccaagagcagccatggggagccc
-cagtgcatgtgtactttctaagtctgctcatttctcacttgacactgtcccattggccaa
-agcaagtcccatgctcaagcacagagtccattgggaagggaccacccaaaagtgtggaat
-cggggagacagaaacaaattggagtcaccaCTCCGCCAGTCTGTCACAGCGTTATGTGTG
-TCTGCATACGTGTGTGCTTGCCGCTGGCGCTCTTCATGAATTCGTTAGCAGGTTctctgc
-ctggctgctggtgatctcgagcaagttgtttcccttctgtgggactccatttccttatct
-gaaaagtggacagttgggcttgatTCATGGTTTTCAAACTGCTGGGAAATGACCTTCCCA
-GACTTGGGCACTGTGGGTTCCCAGGCCAAAACATGGCAGCCGAGGCCCAAATGGGAGATC
-CCCACAAAACACATACACAGACCTCCTCTTTATTTCTGTCCCCCCTGCCTCTCTCCTATG
-CCCCTATTTCTCCTGAGAATGCTCCCAACTTCACCAAGTGTTTATGGAGCCCAAGAGGTT
-CTGCCCCTGGGGAAAAGGGGGAGGCAGAAGAGGTAGAACTTTGGGAGTTCACAGCTCTGA
-TATCAGGAGCAGCCCCATTTTTCTCTGTTGTCTCTGGGTGGTTGCTGAGGCTCCTTCGCT
-CTGGCCTGGAGAGACCTCATGACCAGTCATTCCATATGTCCCCAGCACCCATAGCCATTT
-GCTTAGAGGTTTCCCTGTGGAGTCCACCCCAGCCAAGGGGCATTATGCTGGGGCCAGGTT
-CATGCCAAAGGGCTGCATGAACTTCCCTGGAGCCCACTGGAGTTGATGTGAGTCTCAGAA
-AATGGTCAAGTGTGACAGAGAGAAGGAGGCAGGGATCAGCCAAGTAATGTAGTGGAGGTT
-GTTTTTACAAAAACAGAAAAATATGCCTCACCACATAGAACCAGAGCAGAAATCAGAGAG
-AAAATCACCCACAAACCCAGGAAATCCTCCAATTGCATTTTATCTTATTTCCTTCAGTAT
-CTCTGGGCAAAttttttttttttttcctttttgagatgaagtctcactctgtcatccagg
-ctggagtgcaatggcgcgatctcagcccactgcaagctccgcctcccgggttcacgccat
-tctcctgcctcagcctcccaagtagctgggactagaggcgcacaccgccatgcccagcta
-atttttgtattttcagtacagacgagttttcaccatgttggccaggctggtcttgaactc
-ctgacctcaggtgatccacccacctcggcctcccaaagtgctaggattacaggcgtgagc
-caccgtgcccagccAGATATGATTTTTTAAGTCAACtttacttaagtatactttgcacac
-aataaaatgtactcattgtaagtatgcagtcaggtaaattttaacaaatgtaactctcgt
-aaccaccaaccactgttacatataacatAGGCATGATTTCTGCCTCATTGTAACCAGCAT
-GGATACAATCGCTTTAGCTTTTGTTATTTTGCTATAGAATTTTTCTAAAGATTATTACAA
-ATCTCAATAGCACATATACTGTTTATACCTCTTAGTTCTAGTTTCTCAGTTTGTAATACT
-CCTTCAAGGAATGTTTTGCATGGTGTAttcttttttttttttttttttgagacgaagtct
-cactctgttgcctaagctggagtacattggtgtgatcttggctcactgcaacctccacct
-cccgggttcaaacgattctcctgcctcagcctcccgagtagctgggactacaggcagatg
-ccaccacacccagctaatttttgtatttttagtagagatggggtttcactatgttggcca
-agctagtcttaaactcctgacctcgtgatgcgcccgcctcggcctcccagagtgttcaga
-ttacaggcgtgatccatcattcctggctGGTGCATCTTATATattattttcttgggataa
-agttaaagaagtgggatgggtaccaaagggtcagaaaagtttgggatggttgaaacgtta
-ttgccacattgctttctcagtgctacgtactagcttactagtttgtttaatttttatttt
-ttatttttgcgggtacatagttggtgtatatatttctggggtacatgaaatactttgata
-caggcatgcaatgcgtaataatcacatcatggagaatggggaatccatcccctcaagcat
-ttatcctttgtgttacagacaatccagttaacctctcttagttattataaaatgtacaat
-taaattattggctacagtctgttgtgctatcaaatactaggtcttactctatttttttgt
-accaatttgccatccccactcccctgccacgcctcactaccctttgcagcctctggtaag
-catccttttactgtctgtcctcattagttcagttgtttcgatttttagcacctgcaaata
-agtgagaacatgtaatgtttgtttgtctgtgcctggcttatttcatttaacataatgacc
-tccagttcttccatgttgctgtaaatggcaggattgcattcttttttgtggccgaatagt
-actccattgtatatatgtgccacgttttctttataggatactagtttaatcatgtctttc
-ccaacattgcttattatttATGTTCttttctttattgtgagaaaatagacataacattta
-ccattttaaccagtttttagtatacagttcagtggcattaagtacattcacactgttgtg
-caaccatcaccaccatccacctccagaacttttAGAAATTCCCCCCACTTTCTTTCACTT
-TCTTTTTACTTTTCTTTTCCttttttttttttttttttttttttttttagctaggatttc
-attctgtcacccaggttggagtgcagtgcatcagtcatggctcactgcatccttgacctt
-ctgggctcaagcgatcctcacaacccagcctcccaagcagctgggactacaggtgtgagc
-accacacctggttattttattttttaaaaaaattttttggtagagatgaggtctcactgt
-atttctcaggctggtctgaaactcttggcctcaaggaatcctcctgccttgactgacctc
-ccaaagtgctgggattacaagtgtaagccaccacacctggccTAAAATCCACTCTTTGAA
-TGGAGTTTTTCAACACTATGAGGATTACATGAAGAAAAGAGCCTGGGGCTGGGTTGGAGT
-TTCTGGGCTGGGGGCTTTCTGGAGGGTATTTAGTGGTCAAGGGTCATATGTCAGGTGTTC
-TGAATCCTGAGCAGCAAGGACATGGTGTGTTGGCAGCTCCTGACCCCTGAGGATTACCAG
-CGATTTCTAGACCTGGGCATCTCCATTGCTGAAAACCGCAGTGCCTTCAGCTACCATTGC
-AAGACCCCAGATTGCAAGGGATGGTGCTTCTTTGAGGATGATGTCAATGAGTTCACCTGC
-CCTGTGTGTTTCCACGTCAACTGCCTGCTCTGCAAGGTGGGGCCTGCAGGGACTCCCCCC
-ACCTAGTCACTGTCATCTTGCCTGGAGCTCACCACACTGCAGTGCGTGTTCTCCTGGGAA
-GGGAGCTGTGACACTGGCCTGCTGGTCATGACTTAGAGCTACATGTCAGTGGGAGAGTGT
-GGCTTGAGCCTGAACTGagccctggccccacagacggagtcccagccccagccccagatg
-gagcctcaaacctaggcagccctggttcacaatggagccccgaccctgggccagtctgac
-cccagtcacagactgaatcccagtcccacattgagccctgatcccatccAAGTCCATAGA
-CTTGGCCTCTGACCAAACCTGACCCTGCACTTGTCACTTAAGGTGGTCCCATATTCAGCT
-CAGACCCTGAACCGAGCTCTGACCCTGGCTTCTGACTGAATCTGTGACAGACTAAGGCCT
-GACCCTGGCCCTATACCACGTCTCCACCCGTGTCCTCAACTGAGTGCTGACCCCAAACCT
-AGACAGCCCTACCTGATCCTTCCCCCAGGCCTGTCCCCGCCGCTTCATCTCAAAAGTTGA
-AGGTGAGGAGCCGGTAAACAGGTCTGGAGCCTGGTCTCAGACTCAGCCTGAGCAAGCTCA
-GTCTGGGGTCATTGGGCCTGTAACCCCGGGCAGGCCCTTGTTAGGGATGCAGGGTCTCAC
-CCTAGGGGTATAAGGGATTTCTGTGCCCATCAGAACTTaaataagctgggtgtggcagca
-catgtcagtggtcccagctactcaggaggctgaggtaTATTTTGCTGTTAGCATAtgtga
-tgaccttgacttcacctccctggcgccaatatcctcttctgtaaaatgGCTTATGCATTA
-CAAAGTGAGGTCCTGCCAGTGACTACACCTAGAGGCATTAAGTGCCTTTGTGGACTCCTG
-CCCTGCACCTCACCTCTCCCAGCTTCTTAACCCCCTGAGGAACCTTCTTACCTTGAGTCC
-CTCACCCGCTACAGGCCATCCATGAGCAGATGAACTGCAAGGAGTATCAGGAGGACCTGG
-CCCTGCGGGCTCAGAACGATGTGGCTGCCCGGCAGACGACAGAGATGCTGAAGGTGAGGC
-TGGGACAGGGCCGAGGCCTAGGGATTTTAAGTTCTGGGATCCAGGTGGGGGCTGGGGGCT
-TCCCAGTAAGGGCTGTGCTCACACATCCCTGGAGGCTCTGACCTCCCTTCTGGCTGTCAC
-TCCCATCCGGAGGTGGGACTTAGGCCGAATGGTCATGTCAGGAAGAGCGTCTGGGTGGAG
-GGTGGAGACCACAGGAATGAAGAGGGGGTTGCTGGATGGAGCCTGGCCTGGCAGAGCCAC
-ACAGGAGAGACTCCACAGCTCTAGAGGGTCACCACCTTCTCCCTGCCATGGGGAGGGGCC
-AGGCTGGGTGACTGCCCCAGCCCCGCCCCAGGGCCAGCACCTGCCCCACTCCAGGTGATG
-CTGCAGCAGGGCGAGGCCATGCGCTGCCCCCAGTGCCAGATCGTGGTACAGAAGAAGGAC
-GGCTGCGACTGGATCCGCTGCACCGTCTGCCACACCGAGATCTGCTGGGTCACCAAGGGC
-CCACGCTGGGGCCCTGGGGTGAGTCTTTGCTCGTGGTGGTGTGGAGAGGGTGCCCTTGTG
-GGCTTTGCCTTAGAGGagggctgggaaaactacagcccatgggccatatccaacccagca
-cctgaatttgtacagctcccgaggtaagaatttttttttttttttttgaaacggagtttc
-actcttgttgcccaggctggagtgcaatagcacaatctcagctcactgcaacctctgcct
-tccgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcatgcg
-ccaccacgcccggctagttttgtatttttaggagagacggggtttctccatgttggtcag
-actggtctcaaattcccgaccgcaggtgatccacctgcctcggcctcccaaagtgctagg
-attacaggcgtgagccaccgggccgcaagaatgttctttacatctttaaatggttgaaaa
-aataccagaagatgactattttgtgacgtgaaaattacatgaaatccacgtttcagtgtc
-cgtaggtaaagtgctttggagcacagccgtgttcattcattcacatgttggctgtggttg
-cttttacactacagaggcagaggccgtatggctgcccggcccaaaatgactggccctttg
-cagaaaaggtttgcccactcctgCCCtagaggacagcaagtaaaggttcgatctggagtc
-agaggtggattggcccctggctctggcacatactgactgtgtgattaggctgcctgccac
-tcacctctgtcagccccatttcctctgtgaaatggagatgatagctgggcttatctcagg
-cttgttgtcagaatcaagtggaaaaattgcaagagaagtgcttagagagcctgtcacttg
-gtgagcacccttgcagatggtagctgtcgttattAGGGGTGTGCTCTGGAATTGGGGGCC
-TGTTGCTACGTTCAGGTAGACTTTCAGACAGGTGGAGGCAGAGGAAACTGCCCTCTCGCA
-TGCTGACATGTCTAGAATATGCAGAGTGGTCAGATCCTCTCCCTGGCCTGTTCCCGGATC
-TAGGCGTGGGTAGACTGAGTGCTGTGGGAGCCCAGAAAAGGCCTCAGTGACTCTCCATCA
-GGTAGCTGAGGCTGACCAGGCCATTCTTGCAGGAGGACCTGCAGAGGCAAAGGCCCGGGG
-TGGGAGAGCGCTCGGCTGTGGGGGCAGTCTCTGCACTGCGCTGACATTCTCTTCTCTTCC
-TCCCATCCTCTAGGGCCCAGGAGACACCAGCGGGGGCTGCCGCTGCAGGGTAAATGGGAT
-TCCTTGCCACCCAAGCTGTCAGAACTGCCACTGAGCTAAAGATGGTGGGGCCACATGCTG
-ACCCAGCCCCACATCCACATTCTGTTAGAATGTAGCTCAGGGAGCTTCGTGGACGGCCTT
-GCTTGCTGTAGCGTTGTAGGGGCCCTGCCTGCACTGCGGTTGTCCACGGTCACATCTGCC
-CCAGTGCCTTTGTCCTTCCCTTGGGGCTTGCCGGCCAGACTTCTCTCCCCTGCGGCTCCC
-ACCTCTGCCTGACCCCAGCCTTAAACATAGCCCCTGGCCAGAGGCCTTGCTGGGTGGAGC
-CTCTGTGTGACTCCATACTCCTCCCACCACAACACTCATCTGTCAAACACCAAGCACTCT
-CAGCCTCCCCGCCTTCAGCTGTCAGCTTTCTGGGGCTAACTTCTCTGCCTTTGTGGTTGG
-AGGCCTGAGGCCTCTTGGAACTCTTGCTAACCTGTTCAGAGCCAGGAAGGAGACTGCACA
-GTTTTGAAAGCACAGCCCGTCAGGTCCGGCTCTGCGTCTCCCTCTCTGCAGCCTGTGTAA
-GCTATTATAATTAAAATGGTTTTCCGGGAAGGGATGAGTGTGATGTCCTTGAGAGGAAAT
-GAATGTCCTGGCCTGGGACTCTACACACAGGCAGGATCCTGAGGTCTCTGGGAACTGCAT
-CAGAAAGTTGACTTGTCAGTCCATCTGTGGTAGAATGAGGCTGTGACTGAGCACTGGGAC
-CTTTCTACCAGATGTGGACCCCATGCCCAGCCTCAGGGGCAAGGATGCTCTTGGGTCACC
-GTCAGCCAGGACAGGTGGAGTGTGCAGTGTGTCAAGTCTGCAGAGAAGGATGGGCTTAGG
-GGCGGGAGGGGAAGTCTTGCCACTCCTGCTCCCTTTTGACCTCTCAGCAGGCATCTAGGG
-TTGGCAGGTAGATAGTTCAAGAAGGAACGAAGCTGCTGCAGTTGAGGGGTGGGGTTGTCC
-ATCCTATTTTCTCGTCTCAAGCAAGATGGCACAGTATCGATTCAGCAGTATTTACTAGAA
-CCCACTCTGTGCTGGTCGGAGGTTACTAAGACAGGGTCCTGGGATGTTCATTCTCTAAGT
-CTTTCCTCCGCTCTGTGACCCACCCTCCTTCCCCTTTTGAGATCTGGTATTTGATGCCCA
-ACACATTGTCCACGCTGTGACGTGACCATCATCATAGCAGGCAGAGGGCGCCTCTGCTGC
-TGAAGGCCTGTGATTTTGTGGGGAAGGGCCTGTTCTAGCAACTGGAAAGGCACTGCCACC
-TGCCGTTGGATGCCAGGACTCAAGAGCTGGCCCCAGTCACTGTGCGCAGAGCTGTCTGAG
-AATGTGTGAGTGGACTGGGTCCTTCGGCACTGCCTGCATTGGCTCAGGGCAGTCAACCGT
-CGCAGAGGATGAGGGGCACACTCAGGCAGCCTCCCCGGCCCTGGAGGCAGAAAGGCCCAG
-GCAGAACCACTGACTGGGAGGAAACAGAAAAAGCAGAGGAGAGCCAGGCTGCAGGCGTGT
-GGATGGGACCAGCTCAGGCAGACGCTGTCTCATACCCACTCTCCCCTCTCTTGCCAGGGC
-CTGGCCTGGTGTCTCTCAGGAGCCTGGGCATGAGACAAAAGCAGAGATTGTTCTCTTGTG
-GTACCACAGGCTGTAACCAgtccacccagtgttgttttagaaatttaaatcggttgccca
-tctttttaaattggcaacatcgtttaccacattaaaatctagatgccctgcttctcttga
-aaatgtcaaagcttggtaatgccaggtcctcacttctacctggggggaatggagtcacag
-agatgtcaaatctcttcatggggtgtacaccctccagtttgccacagtcctcaccACCCC
-AGGACTCACGCCGAGGCCTTTCCAGTGCCCTTGCACCATCCTTTTTCTCGTAAGAGGAAG
-ATGAAGTGGGGCTCTACGCGCGGCGTATCACAGGTGAGGGCGAGACCAGCAGAGAGGGCT
-GTGCTGGCTGTGGCTTTGCTCGGCCTGCCCCATCCATGCTGCAGTGGTGCGGAGGAGCAG
-GGAGCTGTGTAGGGCCAACCCCGGTTCCTGCCTCAGCTCCACCCGCCTTGCACCTGCAAG
-TGAAAGGTCTTAAGACGAGCAGGCCCAGGGCACCCTCTACTGCAGGGTCAGGTGGAGGTG
-CCTCCACCTCCCAAGGCTCACCCATGCCAGGGGCCCAGAACTTGAGAGGCCAGCACCAAC
-TCTCCAGGGCCGAACGAAAACCAAACCCCAGGGCTTTGGACTCAAACCATCGAGAGGAAG
-CAGCAAGAGGTCCCAAAGGTACTTGAGTGACACAATGATCATCATTCTCTCCTCAGGGGC
-AGGACAGGGGCAGGGGAAGGTGAGTGGAAGCCCATTGCTCAGATAAAGAGCAGCTGCCAC
-GGAGGGTAGCCCGTCGGCCTATGCCGGCGCTCACTGGTGTCTTCCTCTAGTGCTTGGGGC
-TGGCATGGAATCTGCTCAAATGCAGGCAGCTGAAGGTGAGCCCGCAGCCTGGTGATCCCA
-AGTGCCAACCATGAGGAAGTCTGGAGAAAAGACCAGGGAGCAGGGGCCCTCGTGAGGAGC
-AGGAATTGGCAGCAGGGGCCACCAGCAGAACACCAGAGGGGACAGTGGCAGGGGGAGGAA
-GATACAGCCAGGCTGGGTCTCAGCCCCAGCTGAGGGTCTCACCTCTTAGCTGGTGAAGGC
-TCCGGCCTGTTCCTGCTTTCGGTCACCACTTCATCCCTGGGTGATCGTGGGCCCGGTGCA
-GGGCTGGCTACAAGTGTTTGTTGATTGGTAACTGCTCATGAAAATGGCAACAGCACTAGC
-ACAGCTTCACAAATAGAAACACATTTCACCAACACCCTTGCAGGAAGCCCTCCAGGAGGG
-CCAAGACCATCCCTGCTTTACTGTTATGGACGTGAGCCTCCGAGAGGCAGTGACTTAGAT
-GCTCACCCAGCCAGGAAGGAAGGAACACACTCGACCCTCAGTCTAAGACCCCATCAGGCC
-ACTAATAATTCTCCCTCCAAACCCAGCTCAGGTCAAGGCCTATCTTCACCCCCAAATCAT
-CCCTAAGGCAGCCTCAACTCTCCACAGCACTACAGCCATCCTGCCCGGCCCCAGTGCTCC
-ACAGACCCTAAACCCGAGCCCTCCCGGGCTTTGTTGGCCCCAAACCACCTACACTTGTTA
-CGTGTTATTTTTACACTGGCGTTTCCCCTCAGCCTTGCATACTGTGTGGTGTTGTCTGAC
-ACCACTTTTCCAGCTCtctgacaccaactggggctagtgtcaggttccacagattaaagg
-gctcagtcccacacttccgatggagtcacagatggggtgcccaggctacccacacttcct
-gggctacccacacttcctgggctacccacacttcctggccaactacacattcaggggttc
-ccatgactccaccccctcaggttcaataatttgcctgagtgactcagaactgaagatcac
-cctgccctgacgcttcctggtgtggtgtcctcaaggatgcagtgtgggcaggaacagcca
-cgcttgagatgaacagggttagggatgggagCGACTGGCAGCCACTGCAATCTCAAGTTT
-TGGGGttttttttgttttttttttgagacggagttttgctctgttgcccaggctggagtg
-caggggtgcagtcttggctcactgcaacctccgcctcccaagttcaagtaattctcctgc
-ctcagcctcccgagtagctgggattacaggcacccgccatcatgcccggctaatttttgt
-attttagtagagacggggtttcaccatgttggccaggctggtctcgaactcctgacctca
-ggtgatccacctgcctcggcctcccaaagtgctggaattataggcgtgagccaccgcgcc
-cagccCTGAATCTCAAGTTTGTAAAGTGCTCCACCTCTGTCACTCCAACTCCCAGGAGTC
-ACTGCTtgggattgaaagtttccgccctcgaatcacctggtctttctggtgcaggagcaa
-ccccgaggcaatctaggggccctgctctaacgaattcattagcatgaactcaaatgggct
-ggaaaggggttatgaataacaaaagacactcaccactcacgaaattccaagggttgtagg
-agacccgtgttaggaacccaggagaaagaccaaatatttcttagtatcccacaCATACCC
-TTCCTTTAGTTCTCCAATTATCATAATTCTATTCATCCTTCACATTCCACCCTCACCTTC
-TATGAAAGTGCCCTGAATTTGCTGCAGGATAGATTGCTCCTGGAGTGCAGCTCTGGTGTG
-AGCTTTCAGAGGCAGCGCAGTGCCCTGGGCAGCCTGCGTAATCCACGACTGTCAGATCAA
-AGGGCAGTGTGACCCTGGCCCACAGTGGCAGGAGCTGAGTGCCACTGGCTTGGCCCCGGG
-AACCTGCGCATCTCCCCTCTGAGCCAAGGAAACAAACAACACAGACAACAGTGTCTCCCC
-GATGGCCCCATCCCCAGGGTGGAGGCCCTGCACCGGGCACTGCTCTGCGCGCGCGCTCCC
-CAGCAGCCAGCAGTGTCTGGAGGATACTGGAAAGCTTGGCAAGAGTAGGCTGAGCAGCTC
-CTCTGTGGACAGAAAGGGCATGTGGAGAAGCGGCACATCAAGCTCTGGTTAGGATCCAAA
-ACCAAATGCCAGCTCCTAGGATCCCCAGACCAGGGTGTGAAACACACCAAGAGCACCCCA
-GACCCGCACCAGTTGTGTCGACTGTGACAGTACCCAGAGTGGAAAAAACATGAActcaaa
-ctgtgttttcctccactgctctctcaataccaacagacatctgtggccaaatgtgttggg
-gatttctcccctgacaccaagcaagcaagcaattctgcagcctacatcagctgggtatcc
-tccaattcaattcagtgctcaccctacctatagtatctggaaatggaatccacaggttca
-aggctctgtcccacaagaccgccgcctctgccacaacattggactgaccaccctctttgg
-gtggcatgatttgccaagagtggctcacagaactcagggaaacttatgtttaccagttta
-ttacaaacattattagaaaaggatacaaataagtaaacagccagatgaagatacacacag
-ggtgaggtctggacgggtcctgggcaaatgctggagcttctgtccccatggagtgggggt
-gcgccaccctcttggcacatggacaagttctcgttcccctccctccacatgttcagctct
-tcagaagctcccgtgttcctgggccttttatggagacgtcattggataggcatggctgaa
-gcatggcagctgtgttgagatgaaactggacaaaaagcataaggtctaaacccagcaagg
-cctgtctgtccagatgcttcttggcctctctgtgcagcgttcctccttccgggtatgggg
-cagcaccctctctggaatgagggtcttatgagctacagtcagattaaagtctggtgttga
-gcaagtgaaatggggcaggagaaggtcacagacagagattccgttttctgaggcctgcag
-tgtcccaacattataacaaagggttatgggagtgatgaaccaggaactgtggacaaaaac
-atctacacacgtataaaatatcacaGTGCCCTGGGCTGCAGCTGGAGTGTGTGGGTCATA
-ATtcttgcagatgaaacagaaacagcaagactgtaggtactgcccaaggtctcctagcca
-gtcaaggctgaccaggagtcCACAGACCATGGCACAGTTCTGGGCCTGACATGGAAGGTG
-GGAGCATCCAGATCAGAGACCATTCCCACTGAGCGGTGGCCAAGGACGGAATGACAGAAG
-AGGTGATTAGTAACCACATATGGCTGTTTATTTGATACAGGGCTCTGTACAAAATATTTA
-CACATATTCTTTACAGAATAAGTAAACCACCTGAAGGTAATTAGATAATGCTTTCTTCTC
-AATGACAGGGAGAATCCTGGTGTCAGCAAAGTTAGAAAACAGATAAACATTCTCCTTCCG
-AGGCCACAACTCAAGCAAATGCCACTTGCTTCCTAGGATCTGAAAAGCTGTGGCCTTGGG
-ACCCTGGTCACATGCACCTCCTTTCCTCAACCCCATCAATTCCTTCAGTATTTACAAACA
-GGCTTGAGTACTTGTGGAAGGAGGGGCAGCTGGTGCCGCCCACTGAGAGGATGACAAGAG
-GGCCAGCTTGCTTTGGGAGAGCACTGGGAATATCTGCCGCATCATCACCTCTGGAAGAAT
-TTCCTTTGCCCTGATGAATACACCACTGTCTAAATTAATCCATCGACATCACACTTACCC
-CACAGTGGGGCTCCTGAGCCATGGACAATGATCCATCCCTTTGAGCTTTTTTTGGTTTTA
-AAGTGCGTAGTGGTggctgggcgtggtggctcacacctgtaatcccagcactttgggagg
-acgagacgggcagatcacctgaggtcaggagttcgagaccagcctggccaacgtggcgaa
-accccatctctactaaaaatacaaaaattagtcaggcgtggtagcaggtgcctgtagtcc
-cagctactcgggaggctgaggcagcgagaattgcctgaacttgggaggcggaggttgcag
-tgagctgagactgcaccactgcactccagcctgggcaacagagtgagactccatctcaga
-aaaaagaaaataataataaaataaaTAAAAATAAAGTGCTTAGTGTAACTCAGCGGACAG
-GGCTCCCAGCTGCTCTGGCACGTGGGACACCCTCCACCCTGCACACAACAGGCATGCAAA
-GAGGACTGGATATGGTGGGGTAGAGTGCTTCTGGTGTGTTCACTTTAAGAAAACATCTGC
-CAAGAGAGAAGAGTGCCCAGGAAAGACCAGGAAAATACAAGTACATGGCTGCTTCATACC
-ATATACCCCAATTCTTTAAAGCAGCAAAAGGCACTTTTTTTTTCAGGCCAGAGTGAATCT
-AAAACAAACCTGGCTTTGCTTACAGGGAAGCTGTCCCAGAAGGACTGAGTGATGCCTCTT
-GTTCCCTAAGGTCTGGAGAGTCTTTGCAAGTTTCCAACGACATTTCCAACCAGGTGGGAG
-AGACCAGCAGTTGACGAGTCAAGTCAGACCCAAAAAACGACGCCAAGGTAGTGAGTGGGT
-GCCTATTTGGGAGTAGGATGATTTGAGGAAAACAGGAAGAAAAACCGGTCAGAAAGTGGC
-ACTTTGGAAGTGGAAAGCTGTTTGCAAATAGCAACTCTGGCTAAAGCGAAAATGTTAATC
-AAGTAGAAAGTAAAATTCAGGATCTTAGAAGCTCATCCTTCTGATGAGAACTATTTTTTT
-TTCCGTGAAGGAACTATTATTACTTTAAAAGTGAGGGTAATTTACATATGGGGTGTATAT
-ATTCTAAAAATAGTAATAAAAGTACCTTTTATAAGCAATGTTGTGTGGCTTGTAGAAGAA
-AGCAGGGAGGAAAAAAAGGCAGGCAAAACTAGTCTAGGTCTAGGCCCTAAAAATGAGCTT
-CCTTCCCACTTGACTGGAAACGCCCATGTGATTTCTAGGCTGAAAATAGGTAGGATTTAA
-CGAGTAACCTAGTTCCCTTCTGTCTCTGATTTCTGATCAGCTGATGGAGCTGCTAGTAAG
-AGGGGCCGATCATGCTCCCAGACGAGTCCTTTGGCCTCTTGCTCTCCATCCCAAGCCTGA
-CTCCTTCAGCAGCAGCCCCCTCCTTCTGTGTCCATCTGATGCAGGCAAGCAGGAGCAGTA
-AGAGGGCATCCCATGTTCCAGTTCACCTTCTATGGGGTGACTAGGAGGTTCCCGGTAACT
-AGGGCAGCCCAGGCCCAGCAGGTTGCAAAAGCAGCTGCAAGCTTCAGAAACCCACTTCCT
-CCAACACCAGGGAGGTGGCAGAGAGCCCATCCAAAAGCCCACTGGGAGAGGCATAAGATT
-CTGTGCCAGGCCCCCAGGTCCCCTCTGTGTCAGGTAGGCTCTGCTACTGGCCTCTGAAGT
-AAAGGCAAACACAAACGGGCAGGGCAGGGTGGCAGGAATAAAAAACTCTGGACAGAAACC
-CTTTTAATAAAGGAAATTCCACCCCTCCCAATCCTTCCATGGAAGGGTGAGACCTTAATG
-TGATGTAAGAGGAAGGTCTTCTCTGGCTTTCAGGGAAACAGCTGCAGCTGAAACTTAGGG
-GCCCATTCCAGGGCACTTTTCACCACAGCCAGTGCAGCCGCTCCAAGTGCCACTGTCAGC
-CCCATCACTGCCAATTTCACAAAGCGGTTGGTCCTTGGCTTGGTCAGGACATCTTTTGTT
-CGATCTTCAGGCCGCAGAAGTCCCCGAAACCGCTGCCGCAGCACCATATCAGGCCTCTGC
-TGGGCTGATGCCAGCTCAAAGTCTTTGAAAGTAGAGGCTGCCGTCCTGCAGGGGAAAGAG
-ACGGAAGGAAGGAAGTGGTATGAAAGAGGAGGAGGAAAGCAAAACTACACCACATAGGCT
-GCGGGCAGAGCCTTTCATTGCTGGGAAAGCTCTTTATGATAAAGACCCATATGTCTACAG
-TGGGGATTCCACTGGCCTAAGCTCAGATCTCTGGAAACATGCCCCAACCCTATCCCACCA
-GACACAAACCTTCCCTCGCTTCTGCTCATTTACAGCCACCCCCATTCAACCAGTGTCCCA
-GCCTTGCTCACCTCTCAGCTTGCTGTTGGGCAGCGGCCTCCCGAGCAAGTTCGGATGGGG
-GAAACTGAACAAAAAGGTCTCCTGCTCTGCTGATCAGTGTCTCATAGGGCAAGTCCTGAG
-GGATCTGGGACAACAGGTGGTGGACCGAGGCCATGTCACAGTCACAGTCCAGGACTTCCT
-GCTCGCGATACAACACAATCTGTGGGGAGGTAGTAAAGCCTTGCAGTCAGAGGCCAGACA
-CACAGGGCCTGGGCCACCTGCACTCCATTATCCTTGCAGATGAATTTAAACTGGTAACAG
-ACAGGACTCAGCCCAAATGTTGAGCAAACTCTTGTATCCATCAAGGAAGTAATAACATAT
-ATACGCTCAGTGCTACTCCTACTCTCTGGCCCTTCCTGCAAACTTCCACCACATGACATG
-AAAGGCTGACCAGTTACAATCTAAGTCCTTCGGGCATGCTGGGCTGCTCAGGTGTCCCTT
-TAAGTCTTGAAAGAAATGAAGGAGATTCTTTTAGGAGAAAGTAGGAGAATTATTGGGAGA
-TTCCTGGAGCTCCAGCATAGAAGAAATGGTTCAAAACAGTAGAAAGAACAGTCTTGCTCC
-CTTTAAGCATCTTCCTTCTGACTGTTGGTCCACAAATCCACAGATGCTCAAGGGACCAGT
-GGTCATTGAAGGACTTCCCTGAATTCCCATCTCCACCCCATCCCTCAAGACCCTTCTACT
-AACTGAAGCCCCTACCCTCCACCGCAAGCCGCCTCCCTTGTCTGTCATGACACCAGATCT
-CTTCTTTTCTTAAATCTGGAGTTGACAGCTTACGCTACTATTTCCCTAATTGTGTTCATC
-AGCTGAACATATATTCCAGACAATGTCAACAGGAACCCTGACAattcacaatgcagatta
-gcattttaaaggttcagaagtgtcatgcagcaaaaaaaatctgattttgtttatacccag
-catttcccaacttactATTTTTTGTGTGTGACACCCCCATTAATACTGCACAGAATGGTG
-TCCAGGGACACCAGCCTGGGAAGTGCTGTCTTTTGCATCTTTCCATAATCCCCAGGTTTC
-CCTTCAGGGAAAATGACCACAGTGGGATGGGTGATGGTGAACCCAGCTGCTGGCTCGTGG
-CCTGTACCTACCACGGCTGCAAAGTAAATCGGCATCAGTGGGTGGCAGGCCAGGAAGAAG
-TCATATAACCGCACGACGTGCCTGAAGTCAGACAGGACATGCCCAAACCAGGTGATGAGC
-CAGCTGAGGGCAAAGATGGTCCCTACCTCAGCACTAGAAACAAAGGAAAGGCAGGTGTCA
-GGTCCTGTGGGCCATCCCTTCCCTCTCTCTGGGCCTTATAGCGCTGGTGAGAAGGAAGCA
-TTTAGGAATAAGATTTCTGGAAAATTCAGTTACCTAGGAATTCAGCATCTTCTCCTTACA
-AAATATTTAATACAAAGTCTTTAAGGTGTACCACAACACTAACACCACAACAGGGTCCTG
-GCTGCTTTATCTCACTGGGTGCTCGCCTACTGGCCAACAAATGTCAACTACAGGAACGAG
-AAGCAGTTGTTTTCAGAGAACTACGCCATGATTCTCCTTCTGACTAAGTCTTACCCTTCT
-GGGGGGCACAGGTACATATTCCCAAGCCTGAAAACATGACTGCATTAATTTTTCTGTTAA
-CATGAGACAACTGAAATATCTTAAGATGTAGCTgccagacacggtgagtcacgcctataa
-tctcagcactttgggaggccaaagcgggcggatcacctgacatcgggagctcgagaccag
-cctgaccaacatggagaaaccctgtctctactaaaaatacaaaattagccgagcgtggtg
-gcgcatgcctgtaatcccagctacttgaggctgaggcagaagaatcgcttgaacccggaa
-gatagaggttgcagtgagccaagatcatgccattgcactccagcctgggcaacaagagaa
-aatactccatctcaaaaaaaaagaaGGCATAGCCATTACCttttaaaaaattttaaaaaa
-aGAGGCATTGGCCAAGAACACATTTCCAACTAAACAGAGAAGAAACAAAACATCACATGG
-GATTTGCAAAAAAATATTTCTTCTCTTTGGTACTTGGGAAATAAAACAACCCATTGTTGG
-CCTTCCCCTTCTCGCCACTGGATCCCACAGGACTTTGTGTTTCTCTTGTGGCAATAACCT
-CAACATCTTACCTTGGCATACATACCTTATCCACCTCTCCCCACTAGATGTAAACTCAAG
-GGATGGGCTATGTCCCCCAAAGAGCACAGTCCCCAAAAATGCTCCAAGAACTGAATTACC
-CAGATTGCTGGTGACTGGAACAACTGGGGAGAACTTAACAAATCCACCCAAGACAATGAG
-GAAACTGCGCTCGGCTTGTGAGGAGTGTTTCAGGTGTGGGGGGGTGTGGGCGTGTGTATG
-CATGCACACAGAAATGCAGACACATATGTACCTCTGCATGAAGTCATGGAGCTCTGGATT
-CACCTGGTCAATGATGGGCATCAGATAGTTTAATATATGCTTGGTGTTGTCCATTGTTGG
-ATCCATAAAATCCCTGGAGGGAGACAATTCAATAAGCCTGGTTACCAAACACTTAGATCA
-GGGCTCAGGGTGGCGAGGGCTCAAACTCCTAAAAAAGCTGACCAGAAAACAGGCCAGTGA
-GTTATCCCCAGGACGGCTGAGGAGTGATGCCCGTCGTCTTGTGTTCCTCTCTACTGGTAC
-CTGAGGTGGTGGGTAGATAATTTTTCTACCAGGGATGTTGCCAGCCTCTCGCCTACCACC
-AGCAGAAATGTGACCACAATGTCATGGTAGCCCTGGTAGTAGTGCAGCTGAGGGTTGCGC
-TCCAAGATGAGGAGGATGATGTCAATCAGTTCTTCCTGGAGCCCTTCTCTCTGTTCCTCT
-GGCATGCCTGGGGACAGGAACAGAGATGCCTTTGAACATACCAAGCAGCCTAGTTAACAA
-GGAGGTCGAAGAAGGCCAGCAATGAATTTTCAGAGAAAAAAGGAAAATGAATTACAAATA
-ATTTGGCAACGCATATCAAGATCCACTGTTGATACCACCTGGCATACAGGAAAAGGCAGC
-TGCtagctttccagtaggggaagctgcagatgccaccctaaccaagttgctgcagttaat
-actgctgggacacagtatttaactgcagaatttcaactatgggagccacagacggcctct
-gcctcccgaggtgatgcactgacagagctcagcatcatgtctgcaggatttctatcaaca
-gcgcacagacctcaatctcacaatgaagaaatacccaatatccccaaaggaagagaaatt
-taactctcatacaatacaaaggaactgttccagattaaaaatggctaaagatataggaca
-acagcatgagaaacgcataaatctatatttccttttccagtgaagcacattactcgaaga
-aatggtgaaatgtgaataaaatctgtggattaattagttaactatttttcagtgttgtta
-ctgatgttgctcagtgtactgtgattacatgagagccttatatttaggaaatatgtcctg
-aaacacttggggtaaaaagatgtcatgtttgcaacttactcttaaatagttcagagaaaa
-agtgtatgtctatgtgtaaagcgaaggaaagacagaaagcagctaaaaaagcaaatgtag
-gccaggcgcggtggctcacgcctgtaatcccagcactttgggaggcagaggcaggtggat
-cacgaggtcaggagatcgagaccatcctggctaatatggtgaaaaaccccgtctctaata
-aaaaatacaaaaaattagctgggcgtggtggcaggcgcctgtagtcccagctacttggga
-ggctgaggcaggagaatggcatgaacccaggaaccagagcttgcagtgagctgagatcgt
-gccactgcactgcagcccgggcgagagagcaagactccgtctccaagaaaaaaaaagcaa
-atgtagtaaaatgtgaaaacaaaaggaaatctgggtaaaaggtatctggggaattctttg
-tcctatttttacaacctttcagtaagtatgaaattatataaaaataaaaaAATTTTAAAG
-TTACACGGTCCCCTTTAAACCAAAGCAAACGTTACAGGAAAAACTGATCCTCTTGATCCA
-AAGATGTATTATAGCTGGAAATAGGGAAGCCTGTCTCAGGAGTTCTTTCAGGGAGTTCTT
-TTACTGCTGGAGCTAGTGCTGCCAGCAGTAAAAATGCCTTGGCCTTATGAGCCAGGTTAG
-AAGAATGGCACATGCACAGCTTCTCCACACCATTAGCTTTCAGTTACAAACACATACTCA
-GAGAGAGAAAGCAGCTAATGTAAGGGCCCAAACTAAACCGGACAAAGGATTGCAGGTAAG
-AGCAAAACTCACCTCTTGCCCATATTTACCCCACCCCTTCTCAAATAAAAAGCATACCCT
-AAAAGATAAATAAGGAAACGAAGCAAACCCAGGGCTGCTGATAGGTGAAGCAGTGAAAGG
-AGTGAGAGTAAAAATTAAACCCTGTGTGAATTTTCAGCAGAAAAGCAGTGAGCCAAGCCC
-AGAAGACCATGAATGGAAAAAGAATATGAAGCCACACTGTAAGTTCAGCCTACAGAAAGC
-GTATCACAGATATTACATCAATGGAAGAGGAATAAAGGGTTCAGAGGGAAAACAGGTTAC
-CTAGGAAAAAATGGGggtggctcttgcctgtaatcccagcactttgggaggctgaggtac
-gtgcatcacctgaggtcaggagttcgagagcagcctggccaacatggtgaaaccccatct
-ctattaaaaacacacacacacaaaattagctgggcgtggtggcgggcacctgtaatccca
-gctacttgggaggctgaggcaggagaactgcctgaacctgggaggcggaggttgtagtga
-gctgagacagtgccattgcactccagcctgcaacaagagtgaaactctgtctttaaaaaa
-aaaaaaaaaaGGGAGGCATCTGTCCTATATGATCTCATCCAAACCAGCAGGCTAGGAAAA
-GGGAATGGACCGTGGGCATGTGCTTTTATCAAAACCACGCTGGCAGGCTACTGCTACCTG
-GGTATTGCAAGAATCTGTCCAGGGAGCAAGAATGCCAGCAGGAAAGCAGCCCCTTCAACA
-ACAAAAGCCAGGCCAGAGCACAGTGCAGAAGAGGGAGGCAGCCAGCTTAGAGGCTCCTGT
-TCCCTTTAGCAATTCTCCTCTCTTCATGACCTAAAGGTGGAGTTGCCAGAGGAAGAAAAA
-TAGGTCATCCATGTGAGGTTTGTTGCCCAGTTCCCTTCACTGTGAAAATTGAGACAACGG
-TCCTTCTTTTCTTTCTTCCTGAAATAAAGAGGTAATTTTAGGAATACATTCTTTtttgtt
-tgtttgttttgtttttatttatttatttttttatctattGCTGCTTAATTTGTTAATTAA
-GGAATATACTCTTACACAAACAGGGAATGGCCTCTCTTCCCTCTAAGGAATCTTACATAT
-GTATGCGCAAGGTACCATCGTTTTTAAACCTAATTAAGATATTACTCATTCTTGTTGGTG
-CCCAATTCCACACCAATCTGCTCTTTAATGCCAGACTGATGGCTCTAACAATCCTTATTA
-ACTCCTTTTTGTGGCTTCAAGGAAAAACAAAAACCTCTTCTCTCATTCACCACCTCTAGG
-CCAGGAGAAATTATTTTTGGTTCAGGCTTTCACAGTGGGGGTCTGAAAGTGACCAGTCAA
-GAAAAGGATGACTCAGCAAAAGGAGAGCTCTGAAGGTCCCTGAGGCGGCAGGGTCCAGCA
-TATTAGGTCACATGGTATGACCTGGAACAGATACAGTCTTTCCAAATGTGGCAGGACCGG
-GAGAGCTTCTCACCAGGAGGGAACCGCCGCAATGACCGCCGGACGTCCAGCAACACTTGT
-TGGTAGTCCTTGCTCATCTGCCGTAGGTTCTTCCCTATTGAAGGAAAAGGCACGTTATTG
-CAGGAATGCCTGAGAAGCCAGACCAGAAGCAAAACATTCTGGGATGACACAAAAGGCCTA
-GAGGGCACATGTCAGCTTCTCCTGAAGAGGATGATATGACTCAAGATACAACATTTGGCA
-GGGAATCCCTAGTTTGGTTCCAAACATTATGTTTCCTGCAAGTCACAATGACCCTAAGAG
-AAGGGAGCACAGACTGCCCAGGAGACAATACAGCAGGGTGGGAAGGAGAGCAAAGACGTA
-AGGAGGCCAGGCGCCTCGTGCAGAAGGCCACTGTGCATCACTGGGAACTGCTCTGAATTT
-CAAAGTCCACAGCTACAAAATGAGGATATTCCAAGGATCAAATAAAATCATGAATGTGGG
-AACAACAGACCACTGAAAAAAACCCTAACGCCTATAAAGTTGTGGGAGCACTAAGCTGTT
-TAGAAAGGTATATTGAGACTCACATAAAGAACCACCTAACAACTCTTGACCCAGCAATTC
-TAAAACTAAAGAGCTGCAAAGAGGAGACAGTCCTTGTGTTCAGCTGCTAAGTCCAATACA
-GCATGAAAGGAGGCAGTCTCTAGCCATTATACATATAACAAGTGTACATTTCCTCCAACC
-AAACCAAGTGCTGTATAATAAGCGTACATTTCTCTCACAACCCAAATCCAAAGCTAGTAA
-GGCTGGGCAACACTTCCTCACACGTAGGCTTCACGGTATAAAAAGATGAGGGAAGTTTGG
-AACCTGATAGAAGAACATCATCTCAGGATTCAGGGTGTGAACATGGCACTGCCTTAGCCT
-TCCAACAAAAAGCTGACTGCTCTGAAGCAGCCAATTCCAAGGATAATAACAAGTGGCAAC
-TCAACACCTACTGGGTGACATCATGACGCTGTGAACTTTTTGGTGGCAGAAGTCCTGTTT
-CAATCATCTCCAGTACCTGGCAATCATAGCACAACTAATATTTGCCAACTGAAAGAATCC
-TCAGCACTTGGCATTTTGCCATGATGGCAGGAAAGCTACAAGGTGAGTGCACTGAGTGAA
-TGAGCAGCAGAGTGGATTCACTGTTCTACAGGACTTTTACTATTTTGAACTTCATTCCAA
-GGAACTCTTTTCACCACATGGGCCTTGCACATTAGTTAGGTAACTCTTTTCACAGAATTA
-CAGGATTTTAGAACTCCAAAGGATTTCAGTATTTCCCAATAAAAAGAGGGTGttttcttt
-ttttttgagtatctcactctgtcgcccaggctggagtatactggcgcaatctcggctcat
-tgcaacttccgcctcctcggttcaagcgattctcctgcctcagcttccctagtagctgga
-attacaggtgtgtgccaccatactcagctaatttttgtatttttagtagagatggggttt
-caccatgttggccgggctggtctcgaactcctgacctcaagtgattcacctgcctcagcc
-tcccaaaatgctaggattacaggcgtgagccactgtgcccggACAAAAGAGGGTGTTTTT
-GTGTGTGTTTAAttttactttacttttagagattggatcttgccatgttgcccaggctgg
-cctcaaactcctgggctcaagtaatcctgcctcatcctcccaagcagctaagactacagc
-cgtgcaccaccatgtctggctagtttttaaatttttgtagagacagggtttcgcaatgtt
-gcccatgctggcctcaaacttccagtctcaagtgaccctcctgcctcagcctccgaaagt
-gctggaattacaggtgtgagtcacctcgcccagccACAAAATACGCAttttttttttttt
-tttttttttttgagacggagtctcactctgtcacccaggctggaggacagtggtgcaatc
-tctgctcactgcaacctccaccttccaggttcaagcaattctctgctgcagcctcctgcg
-tagctgggattacaggcacctgccaccatacctggctaatgttcgtattttttttttttt
-tttttagtagagatggggtttcaccatcttggccaggctggtcttgaacttctgacctca
-agatccacctgcctcagcctcccaaagtgctgggattacaggcgtgagccaccacacccg
-gccCAAAATATGCATTTTTAAAAAACACTTGCCAAGCAAGTATGCAGAACAAAGCATATG
-CATTTTTAATAAATTCACTTGCCTAGCCAATATTTTAATCCCTAATAAAAAAAGAACTTG
-Cctgggcgtggtagctcatgcctgtaatcccagcactttgggaggccgaagcaggctgat
-cacttgaggtcaggaattcgagaccagcctggtcaacatggcaaaaccccatctctacta
-aaaatacaaaaattagccaggcatggtagcgcatgtctgtaatcccagctactaggaagg
-ctgaggcaggaaaattgcttgaacccagggggcagaggttgcagtgagctgagattgtgc
-caccgcactccagcctgggtgacagagcaagactccgtctcaaaaataaataaaataaaa
-acaagtaaaaaaaGAACTCATTCCACTTTTGAATAAAATTCTACTTATCGGTTTGGCCTT
-ATTTTCAGAGTGGGCCCAAGCATTTCCCAAAACACCCTAGATTTATTCATATACCCTTGG
-TTTGAAAGGACCATAAAAATTAAAGATCCTGGAATTCTTTTCCCCCTGTCTCCTAGATAA
-GCTCCCCTCACAGCCTCCCCCACTCCCCTTACCTGATATAGGAGGTGGGTCATTGGCATT
-GACATTGAGGAGCTTGGGCCACACTTTTCGTCTGATCTCATCAGTCAGGAGCCCTCCTTC
-ACTGATAGCCATGCGTCTAAGGGCAGCCACATCAGTGGGATCACTGTTCAGAGCCTGGTG
-TATCTCTGCCACTTTCTTTTTCCTTTTGGCGTTAAAGTCTGAAGATAAGGATAGGGAAGA
-ATTAGGCGCACATTCAGCACGTGCATATTTTCTGCCTAGGACTCAAGCTCCTTTTTGATA
-TGAGGTACAGGTAAGTATCTCCTCTTAGCTCTAAGACTGCCTGCTGGCATAAAGTCTCAC
-AGCCAGATGCACTATTCATTTCGGGCCCAGTCTACTGGACCTCATGGTGGGAGGCTTGGA
-GAGCCCACTATAAAACAGATTTTAAATCACCGATTTTTAAAAAGATAGTCTCTTTTTATA
-GGTCTGAACCAAAAATCATAGGCACAGACTGGAAATAATTATTAGTTGTTGTTGTTTTTA
-AGAGACAGTGTCggctgggtgtggtggctcatgcctgtaatcccagcactttgggaggcc
-gaggtgggcggatcacaagttcaggaattcgagaccagcctggccaatatggtgaacccc
-cgtctctcctaaaaatacaaaaattagctgggcatcgtggtgctcgcctgtagtcccagc
-tactcaggaggctgaggcagaagaatcacttaaacctgggaggcggaggttgcagtgagc
-cgagatcgtgccactgcactccagccaggatgacagagcgagactccgtcttgaaaaaaa
-aaaaaaaaaagagacattgtctctctaagttgcccaggctggcctcaaactcctaggcaa
-aaccgatcctcccacctcagccttccaaacagctgggactacaggtgcatgccaccatgc
-ctggTCCAGAAATAATTACACGTACttttttttttttttttttttgagacggagtctcgg
-tctgtagcccaggctggagtgcagtggcgcaatctcagctcactgcaacctccgcctccc
-gggtcccggttcaagcaattctgcctcagcctcccaagtagctgggatttcaggcacgca
-ccaccatgcccagctatatttttgtatttttagcagagatagcgttcacaacgttggcca
-gggtggtcatgaactcctgacgtcgtgatcctcctgcctcggtctcccaaagtgctagga
-ttacaggtgtgagccaccacgcccagccTATATGTACttttttttttttttttttgagaa
-ggactcttgctctgtcgccaggctggagtgcagtggcacgatctcggctcactgcaacct
-ctgcctcccgggttcaagtgattctcctgtctcagcctcccaaTACATTaaaaaaaaaaa
-aaaaaaaaaGGTAAGTGAggctgggcacggtggctcatgcctgtaatcccagcactttgg
-gaggccgaagtgggcagataatgaggtcaggagttcgagaccagcctggccaacatggca
-aaacctcatctctactaaaaatacaaaaattagccaggcgtggtggcatgcacctgtaat
-cccagctactcgggaggctgaggcaggagagtcgcttgaaacccaggaggctgaagttgc
-agtgagccaagatcgtgccactgcactccagcctgggcgacaaagtgagactccgtctca
-aaaaaaatgataagtgaaaaaagaaaTGTGttaaaatcagacagatcttggttcaaatcc
-tggctctgccacttatctgatccataatcttggacagatgacttccctgctctgggcctc
-TGGACTGACACCCTCTTGTCAGGATAGTTACCATGGTACACAGTAGATACTTACTAAATA
-TTAGCTCCCCTCCTCACTCTGAAACAACATGTATTTTACAAATCAACCTACAGATATTTA
-ATTAGTACGTAATATGCAAAGCACTAAGGAGATATACTGTGTAAGTAACAAGCAAGGAAT
-TACAACTATAATAAACGCTCAGTAAATTCAGGCATATCTAGCAGTTAGTGTCAATGTTTT
-CATACAAGAATGTCCATTCTTAATTCCCAAACTTCACAGAGCATATACATCTCTTACTGT
-AACAATTTTTTCCTGTTGTTTAAATAGGAAAAATGCATGTCACCAAAACTCGATACTACA
-TTGAAAACATAACCACATGAAAAGGTCTCCTGTTACACGCTACTACAACTGGTAAAAACA
-TTAGAATCACATAGAGAtttttttttttttttgagatggagtctcactgtcgcccaggct
-ggagtgtaatggcgcgatctcagctcactgcaacctccctgtcccaggttcaagtgattt
-tcctgcctcagcctcctgagtagctgggattacaggcatgcaccaccacgctttgctaat
-ttttttttttttttagacagggtttcaccatgttggccaggctggtctcgaactcctgac
-ctcaagtgatccacctgcctcagcctcccaaagtgctgagattacaagcgtgagccacca
-cgcctggccAACACAGAGATGTTTTCAAAACCAGTGTCAAAGGGTACTTGGGTTTCCAGT
-GTGGCTGGTGACACTGCCACCAGACACTGCCACAGAGAGGCTGTGACACTGCATACAAAG
-GAACTGTTTCTTAAAAACCATAGTAAGTAATGTTTTAAGCATCTTACATCCTTATGTGAT
-AGTCTGTTATTCATAGACATTTTGCCATGTTTAAATTACTTTTTAGgactggtccctgag
-tggtgctatttacaactcattgattacaatcagttagatttctttgttccttttccacgc
-ccactgcttcacttgactagccttCAAATAAATAAATAAATAACTTTTTTGGGAAATTGG
-TTGGGAATTTGTGGTTAGTAGCTATCATATCATTTTTCTATGTGAAATAACAGAGTATTG
-CTTTTTGGCCTTTGGCTGAGATCAGGGGAGATAAAGGAGTAAAAGGCTCTGAAAGTTTGC
-ATGCAGAATGTCTGCTTTTAGGGATGGCTTGTGGAAGTTAAATGGATGATGCCTGTATTT
-CAGTTCTTTCTAGTTGCCAGTACCATTGAGAAAATATGTCAAAAACACAAGAAATGTTAC
-ACAAGACAACACCAAACGTCACAAGGCAGTAGACTATAATTGTCAAAAAAGGTGCATGCA
-GACAATAATGGCCAAGAGCTCAAAGAGACTGCAGTGGGTCAGGGCCAAGCTAACCTGAGA
-AGTGTACCTTAAAAAGGAAGAGGAGCAAAACTCTCTTGACATGCTTAATTGTGATGTTTA
-ATGAACATCCTTGCAGTGTAAGACGACCTTTTTAAAATACATTCTTggccggggacggtg
-gctcacgtctgtaatcccagcactttgggaggccaaggcaggcagatcacctgaggtcag
-gagttcgagaccagcctggccaacatggtgaaaccctgtctctactttaaaaatacaaaa
-aactagccgggcatggtggcaggcgcttgtggtcccagctactcaggaggctgaggcagg
-agaatcgcttgaacctgcaaggtggaggttatagtgagccgagatagcgtcactgcactc
-tagcctggacgtcagagcaagactctgtctcaaaagaaaaataaataaataaataaatTC
-TCTCGGCTTCAGACCTACCTATCTTTGGTGTCTCAAGTTAAACCCAAAGCAGCACCCATC
-ACATCTGCCTTTTCTTTACTTTTGTCTCCTATTGCTTCCAGATACCTTCTTCCTTTTCCT
-GCAAAGCCCATTCTGCTGGAGTGGAAAAGTCCAATGCCttgatgccagggtcttgttcag
-tcactcaagatggagtgtagtggcacagtcatggctcactgcagcctcaaccATATATAT
-ATAGTTTAAATAAATCAATAAACCAATAAATTCTCTCTTAATGATGGTTTGAGCCTCACC
-ACTTGATTAGGACAATCAGCATAACCTGTAGAATCTTATTTGGAATTGAATTCTGTATTG
-TAATTTTGTTCCTGTTCATTTTTAAATTTTATTTTTCTTTCACTGTAAAGATGATACTCT
-GCTTTAAATGTTAAAAGTGTACAAGCAAAAggccgggcacagtggttcacacctgtaatc
-ccagcactttgggaggctgaggcaggcagatcacgaggtcaggtgttcgagaccagcctg
-accaacatgaggaaaccccgtctctactaaaaatacaaaagttagcctggcctggtggcg
-cacgcctgtaatcccagctactcatgaggctgaaagaggagaattgcttgaaccccggtg
-gcagaggctggagtgagccaagatcgcacaactgcactccagcctgggcgcgacatagcg
-agactccatctcaaaaacaaacaaacaaaaaaaaGTGTACAAGTTAAGGAagccaggtac
-aatggctcacacctgtaatcccagtgctgtggagggccaaggtgtgagaatcacttgagt
-ccacaaaatcgagaacagcctgggcaacaaagtgagaccctgtctctacaaaaagtacga
-aaagttagccaggcatggtggtcccagctactcaggaggctggggcgagaggatcacttg
-agcccaggagtataaggctgtggtgagctatgatagcaccactgcacttcagcctaggtg
-acagagcaataccctatTATCAAGGCACTGGACTTTTCCACTCCAGCAGAATTCTAAATT
-TTATTTAAACTATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATGTGAAGTGGAAG
-ATATCACCAGAAGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTA
-GAAGGGACACCAAGCATCTTCCCCAGCAATGTTCTAGTCTGAGGAAAAGGAGGAAGGTGT
-CCTGGTGACCTGTCTCTAAAAACAAAAACAAggctgggcacggtggttcatgcctgtgat
-cccagcattttgggaggccgaggcgggcagaccacctgagattgcgagtttgagaccagc
-ctgaccaacacggagaaaccccatctctactaaaaatacaaaattagccgggcgtggtgg
-cacaggccggtaatgccagctactcaggaggctgaagcagaatcgcttgaacccaggggg
-cggagattgaggtaagctgagattgcagatcgcgccattgcactccagcctgggcaacaa
-gagcgaaactccgtttcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCAggctgg
-gcgcagtggctcacgcctgtaatcctcgcactttgggaggccgaagtgggcagatcatct
-gaggtcaggagttcgagaccagcctgaccaacatggagaaaccccgtctctactaaaaat
-acaaaaaattagccgggcgtggcggcgcatgcctgtaatcccagctactcgggaggctga
-ggcaggagaattgcttgaacctgggaggcagaggttgcagtgagccgagatcatgctata
-tgccactgcactctagcctgggcgacaagagcgaaactccgtctcaaaaacaacaacaac
-aaCGACAGCAACCACGGAcggtggctcgtgcctgtaatccagcatttttttttttttttt
-tttttttgagacggagtctcgccctattgcccagactggagtgcagaggcgcaatctcgg
-cttactgcaacctccacctcccaggttcaagtgattctcctgcctcagtctcctgagtag
-ctgggattacgggcacgtgccaccatgcctggctaatttttttttttgtatttttagtag
-agacagggtttcaccatgttggtcaggctagtctcaaactcctgacctcgtgacccgcca
-gtctcagcctcccaaagtactgagattacaggcgtgagccaccacacctggcctatccca
-gcactttgggaggccgaggtggatggatcactgaggtcaggagattgagacgagcctggc
-caacatggtgaaactccatctctattaaaaatacaataattaggccaggtgcggtggctc
-acgcctgcaattccagcagtttgggaggccgaggtgggcagatcatgaggtcaggagatc
-gagaccatcttggctaacacggtgaaaccctgtctttactaaaaaaatacaaaaaaatta
-gccaggcgtggtggcgggcgcctgtagtcccagctactcgagaggctgaggcaggagaat
-gaggtgaacctgggaggcggagcttgcagtgagctgagatcacaccactgcactctagcc
-tgggtgacaagttctgtctcaaaaaaaaaaaaaaaaggcagaaagaaCATGGATTCACCT
-GCTTATACAAGAAAAAAGGAAAAAAAAAAGTGTACGAGTTGCCTTGTTACAATAAAACTA
-AATGTGTATACACACAAAGGAAATGGAGGACATTCAGGGGCTGGGATGAAGGGTACAGAA
-GAAAGGCCAGGAGATACGGCCCTTCCATTTGACAGTAAATAGACTAATTAAAAAATATTT
-ATGTAGTATATATTAGGTGCAAGGCACCAGAGTTCATTTGAAGTGGAAGATATCACCAGA
-AGGTAGGGCAGATTTTAGAAATAACTAACAGAAGGTACATTAGGTTTTAGAAGGGACACC
-AAGCATCTTCCCCAGCAATGTTCTAGTCTGAGACCATTGTGAGTCTACAAACTGTTTCTA
-TGACAAAGCTGTACattattattattattattattattttatttttattttttgagacag
-agtcttgctttgtctcccaggctggagtgcagtgaagcaatcttggctcactggaacctc
-tgtctcttgggttcaaaccattctcgggcctcagcctcccaggtagccaggattacaggc
-gcatgctgccaccacacctagctaattttttgtatttttagtagagacagggtttcacca
-tgccaggctggtctcgaactcctgacctgaagtgatctgcctgcctcaggctcccaaagt
-gctgggattataggcatgagccatcaggtctggccCATTATTAACATAAATTAAAGTTGG
-TACTAATAAGTCACAGGTGAGCTACCTATGAGACCTGAAACGTAAAACCCACATAAACAG
-AGGCACTAGCTGGTTTGGAGCCATGTGCAATTGGAAGTGCGACAGAAAGATAATAGGAGT
-AACTTTTCACCTCGGTAAACCTGTCCTCCTGGCTTGACTGCTGTTTCCTGGTAACCTAGt
-agggtgaccatttgtcctcatctgtctgagatcttcctggtttatacctagagtcctggc
-acaattgttcacagcaaaccctttctgctccctgtattctcaaatatgtcccagtttgga
-agccaaattaaatggttaccTACCTAGAAATCATTAAAAATAAAACCCCTTCTGGGcaca
-cctataatcccagtactttgggaggccaaggtgggcagattacctgaagtcaggagatcg
-agaccagcctgaccaacatggtgaaaccctgtctctactaaaaatataaaaattagccgg
-gtgtggtggtgcacgcttgtagtcccatctactcaggaggatgaggcaggagaatcgctt
-gaacccgggaggcggaggttacagtgtgccgagatcatgccactgtactccagactgggc
-aacagagtgacactctgtctcataaaataaataaataaaaaataaaataaaATAggccag
-gcgtggtggctcatgcctgtaatcccagcactttgggaagtcgaggcgagcggatcacct
-gaggtcaggcgttcgagaccagcctgaccaacatggcgaaaccccgtctccactaaaaat
-acaaaattagccaggcgtggtggcaggtgcctgtaatcctagttacttgggaggctgagg
-caggagaatcacttgaacccaagaggcggaggttacagtgagctgagatcacgccactgc
-actccagcctgggcaacgagagcaaaactccgtctcaaaaaaataaacaaaataaaaata
-aaaaTATAATAAAATAAAAACCACTGCCGGGCATGGTTTTTAGTCCAGACgtggctcatg
-cttataatcccagcactttaggaagccgacgtgggcagattgcttgaccccaggatttgg
-agagcaaccagcctgcacaacatggcaaaaccttgtctctacaaaaaataggtgggcgtg
-acggcgtgcacctgtaattccagctgcttaggaggcagaggcgggttgtagtgaggcatg
-attgtgccactgcactccagcctgggtgatagagtaagactctgtctcaaaaacaaaaaa
-aaaTCTCCAATTTCTTCTGTCAGCATAACACCTAGTCAATTGTTCATGAGATGTGTCAAG
-CTCTTGACTCAGGTGTGTCCTttcatccattcatccattcatccattcatccGCCTGCCC
-ATTTGtccagtcattcatcagtctgtcacttaatgggtgtctacttgtactaagcactgt
-actggggataaaaagatgaattactccctcccagcccttgaagggctcacagtagggaca
-caaacaattattatatataatagaatctgagggattatgaaaatccagaggaaagaatga
-ctttttttcttcttctttttttttgagacggagttacgctctttgttgcccaggctggag
-cgcagtgttgcgatctcagctcactgcaacctccacctcctgggtttgagcagttctcct
-gcctcagcctcccgagtagctgggattacaggcattcaccaccacgcctggctaattttt
-tgtatttttagtggagacggggttttgccatgttggccaggctggtcttgaaatcctgat
-ctcaggtgatctgcctgcctcggcctcccaaagtgctgggattacaggagtgagccacca
-cacctggccaagaatgactacttctaaagcagtcaggaaaggcttcaccaagaatatatt
-ctggatccttcttttaattttttttttttttttttttgagacagagtttcactcttgttg
-cccaggatggagtgcaacggcacgatctcagctcaccgcaacctccacctcccaggttca
-agcaattctcctgcctcagcctcccgagtagctgggattacaggcatgcaccaccatgcc
-tggctaattttgtatttttagtagagacagggtttttccatgttggtcaggctggtctcg
-aactccccacctcaggtgatccgcccaccttggcctcccaaagtgctaggattacaggca
-tgagccaccgcatctggccCttctttttaatttttatttatttatttagacagggtctca
-ctctgttgccttggctggagtgcagtggcacaatcatagctcactgcagcctcaacctct
-agggctcaagcgatccttccacctcagccttctatgccaccatgcctaattttaaaaaaa
-ttttttgtagaggtggggtctcattatgttgcccagactgatcttgaactcctgggctca
-agcaatcctcttgcctcaacctcccaaagtgctaggatcgcagatgtgagccaccacact
-gggctctggtacgttcttaaagaaaattttgccacagggaagagtgtgttaaggggaaag
-tactccaggcagaagagttatgtgcaaagaccttgtcacatgaaagaaacaccatgtcca
-ggaaacaaagagttctatgaagctgaagtgccaggtaaagggagagAACAGAAGCAGGTA
-GCACCGCAGTAAAAGAGGCTGGGCTGGATTCATCCCGCAAAGGAGTCTGGGTTTATCCTG
-TACTCAGGAGGAAGACAGGGAGGGATTTTACTTTGGGCCTGAGGGCCATCCTTTGGAAGA
-CCAGGCTGTACGTTTTCAAGAGGGGTCAAAAACATGCAGGAAACAGAGAAGCCTTTTTAT
-ATAACATCGGTGGAGGCAAACCATGAGAAGAATTTAATTTCCAACAAAGAGAAAAAACCT
-AACATATTTAATTTTTTTTTAACTTGGGAGTACCCCTGCACTTTCCACACATCACAAATT
-GACAGCACTTGAGTGGCAATACTGAATACTGCTTGAGGGAAGCTGATATTCAGAAGTCTT
-GTTAACCTATTTGCTAAGAGTATGATAATTTTTCTTCAGTTTGTTTAGACATACATCCAC
-CCCATCTCTCTTTCTAAATAAGCTATTCGGCAATCTGGGAGAAAGGAAATCTTGTATCTT
-GGGGAAAAAAACCACTATGCAGTCAACTGAATTTCCATGAGGTTTTGGCAAACCATTTGC
-CAGAATGTTACTTAATTCTGAACTCAAATCCTCAAATCATACCTCCCATAACTCATTTCT
-CTTAAGACTCTGTTCCAAttttttttttttttttagagacagggtcttactctgtcaccc
-aggctggagaatagtggcacgatcatggctcactgcagcctcaaccttctgggctcaagt
-gatcctcctgccttagcctcccaggtagctgggaccacagacaagctccactggcccagc
-taatttttgcgtatatatattttgtagagaaaaaaagtgttgcccaggctgatctcaaac
-tcctgggctctagtgatccacccacctcgacctcccaaagtgctgggattacaggcgttg
-agccaccatacctggccTCCAATTCTACTTTTAATCCTGCATTTCAAAATTTACTTACTA
-TTTCAAAATTTTTGGCACTCTGTGGGAACGCAACAAATACGTGCAGAATATAGTAAGTGA
-TTTAGTTTAGTTATTGTTCCTCTGGAAAAAACTGGCTTGCAGTAAATGACATTATTTTTC
-CCATACTGTTAAGGTGATGCTCACTGCAGAACTCTCTAAACAGATCTGCAGACTCTTTGG
-CCTGTTTCTAACACTACCGGTGTTTCCCAGAGGAGGATGCTGTCCCAACGTGGATTTCGG
-CTGCTGTTTTTTTCAGGCCCCAACACCACCCTCCTCAACCCCACAGCCTAGTGATTAAAT
-GTCAGTGGCAGATGGAGAAAGCACTCCCACGTGTGCCACTCTGACAAATACTTTATTCCA
-ACTAAATGTATAGGCTCTCACTGTGACATAAAAAGGGAAGAGGAAACAGAAAATTCAAGT
-GAGCTAAAGATGTATGAATTACAGAGTGAGATCAACTGCTAGACGACACAGGGAGGGAGT
-TAGCAGCGTCTCCACTGAAAGACAAATTCACAGACATCCTGTTTATTTCCGAAAGAGAAA
-CATCATAGAGCTATTCTTGGGATGTTCAGGAAAAGATTAAAATAAATGCCTATTATCTAT
-TGTATTTCGAGATAAACTTTATAGATTTAGAGCAGGACACACATTTCTGGACTTGAGAAC
-GCTGTATCTGGCTTGGAATAAAAGCCCACATTTCATCTAGAGGTAGAATGTATGTCATTC
-TAATCTCCCTCAATCCTTTCTTCTCCAATTTCTTTATTGCCCCACTTACAAGATAGTGCA
-CTATTATTCCAAAGCTGATACCTTCCAAATTCCTTTATAGTAGAGGTCTTGGCTATCATA
-ACCATGATGGAACGAATGACCGTCCTACAGCTGGCTGCAAAATATAAGACTGCTATAAAT
-AAATCCCTGATGCCTGAAAAGTAATTCATTCAACAAAGGAAGATAGGTATGACTTTGGCC
-TACTCTTCATTAGAACGCTTATTtttatttatttatttatttatttataaagagggcaaa
-gcagactttatttgaggggcaccacagcaataggtatagcaacaactgcaacagggtttt
-gtagtcagggagggagatcagactcaactccCTAAAATGCTAATTTTAACAATGGGACAC
-TTCATCTGAACTGTGGTTCTTAATGGTTCAGATAAAGATGACACAACCCACTATTGGCTT
-AAACTTCTCCCAACTCTGGCTACAGAATCCAGGTAAAGATTTCTGCCCCCTCAGAGTAAT
-AGGCATGTCCAAAATCACCTGGATTAGGGCACTTAATACACTGGGAAGGGACGATAACAA
-CTAAAGATGACCACTATCCATGCCTCCTCTAAAAGTTTTTTCATATATTTTTTCATATCA
-CCAAAACAAATACTAACTTGGATCAACTAATTTATATAATGGAATCTCGTGTGAGCGTAC
-AAAATTCCATACTGATTATTTGGTTTAAGCCTGCATTATCATAAAGGCTTTACAGTCTTT
-AAACTGAAATTAAGCTCAAATTAAGAAATGCTAGTCTTAAAACAATGGAAGGGGGGGGCC
-GTTTTGTGTGGAGGGAGGGAGACAGACATACCCCTACACCCACCCACAACTACTGATATT
-GACATTGGAAATTAACTTGAAAATTTATgcctgtagtcccagctactcaggaggctgagg
-tgggaggagcacttaagtccaggagttgggagatgacagtgagctttgactgtgacactg
-cactccaacccgggtgacagggcaagatcccatctctcaaaaaaaaaaaaaaaaaaTGCT
-TTAACTCCACGTCTGTACCAGAAGACCACAGCAGGAGAGGAAAACCTTATTTCAGTCTGG
-GTAAGAGTTCTATTAAACACAAAATAAAACAAACTAGCCTCTGTTTCTGGAGGTCTTCAT
-TAGTAGTTTCTACAAAACAGTATCCAAATTAGCAAAGATTCTGTTAACTACCTGGAAAAA
-GCAGGTACCAAGAAAGAATGTTTCACTACAATGGAAAAAAACAGTCTAGTAAGTAAACCA
-ATCTGACTATAAACGCTACAAAAGAGGGATTCTAGCATTAGTAACTTTGCCAACAATACT
-CTGATATGATTAAAAAACAAAACAATAACAAAAACAAAAAACCTCATCTTTAAATTTGTC
-CCATTCATCCAGAGAAGCAAAATCAAGGAAACTAGAGGGGGTAAAGTCTTGCAACAGATA
-CACAGCTGCACTGCCAACAGGTCACAAGACCCATGCTGCCTAGGGCATTGACTGTTATGC
-CATGAGGACAGACATCACACAAACACCAGTAATTAAAGGGTTACGGTGCCAAAGGGTTCA
-GAGCTCCACTTCCATTCAGTATCAGAACATAAGAAAAAGGGAAAAACAGAAAATGAGCCC
-aaataaaatataaaataaaatataGATACCAGGAGCTTCCTCAAAATATGTGGGTTGTAT
-TAATAACGTGTTTGGCTCTGTTACGGGCACCATCCATCAGAGGACTGGAAATAGGGAAAG
-TCACCTTAGTCTTCCTCAAGGAAAAAAGATTATTTAACTTGGTTCACGGTGTACATTCAT
-AATTTTAACTGTCATGTATTTATTGAATGAAAAACATTTGAGAACATCATGTGCAACAAA
-AACATGATTTCACAGAAATTGTCCAAACTAAAAGAGTATAAAAATAGAAGCGCTTTTTAT
-ACAAttatttacttattattattattgagatagggtctccatctgtcacccaggccggag
-tgcagtggcgcaatcatagagtagcctctaagtcctgggctcaagcgatcctcctgcctc
-agcctccagagtcgttgggatcacaggctcgagcctccacacccgactaacttttaaaaa
-ctttttgtagagatgaggcctcgctgtgtttcccagcctgatctcgaaatcctggcctca
-atcgatcctccaaccatggcctcccaaagcgctgggattacaggcgcgagccatggtgcc
-cggccGCTTTTACACAATTGAATAACATTAAAATAGGTGGCAGAAGACagacagaaagtc
-gattcgtggttgccaggcgtcgtgaataccggggaacgcggagtgcctattaatgggtaa
-gggtttcgttttggaatcagacagcggcgatggctgcacaactttgtgaattttctaaga
-atcactgaactgtgcaccttaaaggaagaactgtgtggtaattacatcGGCGGTACGCGG
-GCAGCGCGTCAATCAAGCCGGCGACGGTGAATGCAGTTCGGGAGAGCTGATACCCCTCGG
-GGAGGCGGCTCCGGGAGCCTGCGGACGTGGCGGACGCCTGGGACGGGGTGGGCCTGGCCT
-CCGCGCTCGAGGAGTCCCAGTCCTCTCCAGATGGAAGAAAGCCGGGGCGCGAAGCCGCCG
-CCCGCTCTTCTGCCTGGGGACGCGACTCTGCCGCCAGGCTCCCTCGGGTCAGCTCGGCAC
-CCGCCCGAGCCCCCCCAGTTCCAGGCCCTCTCCTCATCAGACGTGCCCTGGGCCCTCAGC
-CTGTTCCTCTCGccgcccggaaccccgcagcagccccgggtccccagcccgcgcccctcc
-ggcgccgcctccgccagctgcccctgccccccgggccgccctcgcaggccgctcccggcg
-ccccggtcggcttccgtacctgccttctccgcgccgccgtcccAGTGGCCGGAGGTGGGG
-CCGTCGCCCTGCGCACTCCGGAGGGCCATgccccggggccccgggcccccACCCGAGCCC
-CGGCTGGTGGCGGAGCCGGGAGAAGACGCGGCTCCGACCGCGGGACGTAGCACCCGCTCG
-GCATCGGCAGGCTCCCCTCCGTCGGCCAgcggcgcgcaggcgcgcaggcgccccgctggc
-cccgccccgcgccggcACGTGACCCTGCGCTACGCCCGGCCGGCGGCGGGGGAGGCTGCG
-GAAAGAGCGCGGTGAGCGCTCTGAGGAGTTGGCTTCGTCTGCGCTGTAGACTCTACGGTG
-TAGAgtgtggcgctcttgagcgagtgtgctcgagaccagctgtcgtttcctttgcttctt
-tcatctgtaaaatagtattgatgataataaaaatattgaactcacaaggttattgagagt
-gtttagaacatcaccaagcatatagtaaatactccacaattatGACCAATTTTTGCTTAC
-CAAGGATTATTTTTTTACCTCCTGTCTCGTCTCCCCACACGAACTCCTGTCATCAGTTCT
-TGGGTACTTGGGGATCTAGCAGGTTCATGTCAtacgggtccgcaggttatgcactgcaca
-aggcctgggagcgccatttacgtagacgttcacgtgaaccgtgcccccttaagttgtgcG
-AAATAGTGGCCACTCATCTAAAGCAGCGctctggcttatcaggtctgatttccttctcgt
-cttcagtgatattcctttctttccaattagacatccattcccttggttatatccctgata
-ttgtgattgtggcctcccgaatttctagtgctaggtcttcatgctgaagttcccataatt
-ccagttgcttgatgactctcttccacctcccacccccaaccacaacagttctttattatc
-ctgagacctccagcccatGAaactcctgacctcgtgatccgcccgcctcagcctctcaaa
-gtgctgggattacaggcgtgagccaccgcgcacagcCAAGTTTTACAGTTCTATTCATAA
-ATCTAGTAAATTATATCAGTTATTTGGTCCCATTAATAAACTAAGCTAATTAAAATCCTT
-TGAACATTTGAAACTGCATTTATAAATTCAATTCGTTTTTCTAAGTATCACAGGTTTCTA
-ACAAAGCCTTTCAAGTCCTTGTGTAATTCTTGTAAATGTAATACATTTATAAGAATACTG
-AGTCATGAGTGCTTTCAAATGTGTCAATACAAACGAGATTTCATCTTAAAATCAAAAGTC
-TAAATCTATTCAAATACATATTTGTAATTAGTACAAGAATAATCTGTTAGAATTCTCAAA
-Attatcttttttttttttttgagacagagtctcactctatcacccagactggagtgcaat
-agcgatcatagctcactgcagcctcaagctcctgggctcaagctagcctcctgttgcagc
-ctcccgagtagctgagactgtaggtacacactaccatgcctggctagtttttttagtttt
-tatagagggggtggggaatctccctatgttgcccaggccggtctcaaactgccttcgcct
-cccaaagctctgggattacaggcgtgaatcacagtgccAAGCTCTTGAAATTATCTTGAA
-CATTATAGGAATTTAAAGTATCACATTTACACAGATGCCTTAATGCAAAATTATTAATAC
-TAGAAGTTTGAAAACATTTCTAGTCTTTGTTCTAAATCATCTGTGAggctcatgcctgta
-atcccagcactttgggaggtgaagggctgcagatcacttgaggtcaggagttcaagacca
-gcctcaccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcatgg
-tggtgcctgcctgtaatcccagctacttgggaggctgaggcaggagaattgcttgaacct
-gggaggcagaggttgcagtgagccaagattgcgccactgcactccagcctaagagacgga
-gtgagactccatctcaaaaaataaataaataaaatgaaataaaTCATCATTGAGGTTAAA
-AGATGCTTAGTGCCCACTGAAGGAAGATTTAAGTCATCCCAGTTTAAGAGTAACGTGCTC
-AAGCAATTTGAGATATTTATTCCCTTCTCAGTTTACTGCGCTGGTCATCCAGCCAGCTGG
-ATTCTTGCTTTTGGTAGTGATGGAACAGTGACCCCCACCCCATTCCCACCACCACAACTC
-TAGGACTAAACAGTTGTGTGGTCGTTGTGAAGCTTGGGCcagaatttactttcaaaaaat
-gtcccgcttcatgtataatataaagaccttacaataaattcccatttcttccctcctgtt
-cttcttgctgttgtcctacattttactttttaaaatcccttccttctcttgctttctccc
-ctctacccaccaaccacttgcaaacaaccactgatctacatcctgtcactatagattggt
-tttcattttctggaattttttatggacggaatcatatagtatgtagtcttttttgtctgg
-cttcttttactcagcgtaattattttataagcaatcatgttgcattaatcaatagttcat
-ttgtttttgttgttaagtagaatttcatcttagaaatataccacgattcattttatcaGT
-ATTTTAAATTTTTGCATGTGCTGCAAGTACACAATTCATTGCTAATATGCTTGCCTTAGA
-CCAGGCGGTTAGCAAAAAAGATGGTCTGCCCAcctgcaagccaaaaccactctactgcct
-gattttgcacggctcatgaactaagaatggcttttaccttgataaatgttgaaaaatcac
-aacttaattgtagcacattaaaactatatggaatttaaatctcagtgtccataaaccttt
-actgaaacagagtcacgctcattcatttacctactgtctatggctgttttcatgctgcaa
-cggtagagttcagtggttgcaacagagatatggcctacaaaacctaaaatatttattatc
-tgctcctttatgtatttatttattttatgtgtgtatgtatgtatgtatttttttgagatg
-gagtttcactcttgttgcccaggctggagtgcaatggcgcaatcgcagctcactgcaacc
-tccgcctcccaggtccacgtgattctcctgcctcagcctcccgagtagctgggattagcc
-cgccaccatgcctggctaatttttttgtatttttagtagagacggggttttgccatgttg
-gtcaggctggtctcaaactcccgacctcaggtgatccgcccgcctcagcctcccaaagtg
-cctgggattacaggcatgagccaccgcacccggccTATCTGCTCCTTTATAGAAAAAGAT
-Tggcaggacgtggtggctcacacctgtaatcccagcactttgggaggccgaggcaggcag
-attacatgaggccaggagttcgagaccagcttggccaaagtggtgaaaccccgtctttac
-taaacatacaaaaattagccaggcatagtggcacaggtctgtaatcccagctactcagga
-ggctgaggcaggagaatcacttgaacccaggaggcggagactgcagtgagccgagatcac
-accattgcactccagcctgggtgacagagtgagactccacataaaaaaaaaaaaaaaaaa
-aaaaaaGTTTTGTGACCCTCTAttgtagagatggaggtattggggctgttgcccaggctg
-gccttcaactcctggcctcaagggatcctcctgcttcagcctcccaaaaatgatgggatt
-tcaagtttgagccccatgcccagctCACTTCAGTTATTTCTAAGGTAATTTAAaaaagat
-tttaattgtacttaccttcattcaatttccagtgctcttaatttcattgtgtagacccag
-gtttttttctggtatcatattccttttgcctgaaaaacttcctttagtatcttgtagaag
-gagcaatgaattccgtttttctttatctgaaacagggtttatttctcctttattttgaaa
-gacactttcatttgggtataggattccggaattttgggtgagcagtttttgtgtgtgtat
-gtgtttttcccctatcagcatcagcaataaggtcactccattggcttctagcttgcatag
-tttctgacgtctccataattcttagcttcctctgtatgcaatgtcttctttttccttgct
-gcctttaagattttcttttgttttagcatttcgagtatatctaattttatatgtgtgtgt
-gtatatatatatatatatatatatatatatatatatatatgagtttattctgcatgttct
-ctgagcttcttggattttgtggtttgctctgtccttaatgttgaaaagttctcagccttt
-aattcttcaaatgtttcttttcctgttctctctcctttcttctgggaatctaactataat
-atgtttgagtgtttgatattgtcccacaactcttggatgttctcttttgacggttttttt
-tcccttcaccctttttccccagtgtttcagtttgaataatttctcttgacctatctttga
-gttcattcattctctccttggctgtgtcaaatccactgacgagctccatgaggcactctt
-catctctgcatctctgttagtgtgtttcttttttttttttttttttgagacagagtctcg
-ctctgtcctccaggcgtgcagtggcgcaatctcggctcactgcaagctctgcctcccggg
-ttcacaccattctcctgcctcagcctcctgagtaggtgggactacaggctcccgccacca
-tgcccggctgattttttgtatttttagtagagacggggtttcaccgcgttagccaggatg
-gtctcaatctcctgacctcgtgatctgcccgcctcggcctcccaaagtgctggaattaca
-ggcgtgagccaccgcacctggccattagtgtgtttcttattttgaccagttccatttggt
-tctcatagcttccatctctctactgagattgcacttttgatcttgcatattgtctacttt
-tactgttagaccttttaccatattagttatttgaaattctgtatcacatagctctgacat
-ctgtgtttggttctgaagattgctttgtctcttgggagtatgtcatttatctcttgcttc
-ataagtgttggtgaaagttggacatcttgtgtaggatagtagaggcccagggaaatgggt
-tttgtgtagaaatgggcacacttttccttctgttaggtctttagcgtgggggtttgaatt
-aacctagttaggagttgTGATAggctgggtgggtggctcatgcctgtattcccagcactt
-tgggaggccaaggcaggaagattgcttgaacacaggagtttgagatcagcctggacaaca
-tagtgaaaccccatctctacaaaaaaaataaaaattatctaggcatttttggtgcatgcc
-tgttgtcctagctactgggaaggcttgccgagtctgtcctgcagactctgcccaagcgac
-ggatgaaaggagtactcagatacagatatccagtgaaagagcaggataggggactgccag
-cactaggggccgaagagaattagcagttcccctaagccggcagccctcgcatttgtttgg
-tacagatttaatgacaaaggcttggagcaaacacaatttgtgggtaataaacattgttga
-ccccccgagtagagagcagtcctgcatgcaaatgattaaaggttggtttctggagacagg
-agtagacaaatttatctagataagtttctttacattcccttgttatctgccctttgctct
-caggctccagatgagacaatttggctgccttcagccataatttccttccaaagcttttgt
-aaaacctcctggcctttcaagaaggtttgtgtctttactataatttctcccaccaccctg
-accaatctcctacatctcccccttttctgttttttgcatcagcttttgttaattgaagag
-tacagatgtgcagcaacaggtttttcaggtgtagtggtcactgcttgtatttcggctttg
-catcctagaattagtaaataacataagataaacgtgaatataatcagtaacattcttttc
-caatcaaggagtgacatgtagtgttacttgccacctcagttcagtgtgtgcccttactaa
-ggaaccccactgggggtatgttaaccccttccagccaagcagttacgttattagaggctg
-ggaagggggtgtccacccaggtaatagggtggaagaaaagcagatttagaagatgggccc
-aatagagtgtagcaggtactggttgcaggcagagtgagggaattaaacaaggttaataaa
-gcatagtaaggaataaattatctggagtgaatggtgtttgtgtccagagcaggattcgtt
-cagcctcctgagttgtcttcttcagcatcccccaggtaatgtctggggcttgtgtcgtct
-gaggaagctgcatcatccagggctgtgggtcctgcagggacatttccttcatttctggta
-ccaggttgggtcctagccacaccatgttaaggtttgatgcgttgtgctggaatccaaaga
-ggacctgaggtgatgtgaacacaaccatatcctcttccccatgttggcaactcatttgga
-ccacaccatacattactgtttacatctttccataaaactgtgggttttatgtcttgagag
-gttttagcaaagtgcttttctatagctgattgaaatttatcatttaaatttaagaaatta
-agggtaaataaggcttttgctagtagtgttgcagggtccttactcatactcccccttttt
-tgttttttgagcatatttttaagagtggacacgttctactatggcctgtccttgggggtt
-atacgggatgcctgtggaatgctggatgttccacgtgtgacaaaattgttgaaattgtga
-gctggcatgagccagaccattatcagttttaatttttgtgggccgccccataaatgcaaa
-agttaagagaagagtttaataacatatcaggtggactttccaggaagagcattgtgctaa
-ttaggtgagaataggtatcaatggatacttgtacatatcttagttttccaaattcaggga
-cgtgagtaacatctgtttgccataactgattaggttctagtcctctagggttaacgcctg
-ttgaaggaggggacatgcctgtgagctggcaatccgggcattgcaggataatttgtttag
-ctagtctttgggtaagttgaaattgttcagttaagttccttcaattttggtggaaaaatt
-gacgcaactgcatggcttggtgaagcagtgacatcataacttgcaggtctgcttgttcat
-tgccataagccagtgggccaggcagtgagctgtgggctcgaatatgtgtgataaaaatag
-gatgtgtacgttgatccagcaattgctgaagttgaagaaaaagtgcacacagggtgagct
-tgagagtggacttaatgagggctgttttaaggttttgcaataaataaacagagtaagcag
-agtcactaatattgataggcagagtggaaaagttctccaggggcaatattaaggctccaa
-cctcagctctctgagtgctagtaaatccagaatgagtgaggaaattatgcagtctccacc
-aaacaggcgcttttctgtttttaccagagccatcagtaaaaagtgttaaagtgttggggt
-atgggggagtgaactacttttgtaggcacaactacaggagtacgagataagaactgaatt
-acgttgtcagcaggaagggcatgctctatatggcctgtgtaatcagagattgctatctga
-agatctagagataggggcaatactgatccaaattgccttttactcaaaggaattcttatg
-acatcataacctagcaactgattgcactatctgcggcctgtatagatgactttactaact
-agctggatataggaagatagtgttttagtctcggtatgtgagcaaaaaacccattctagg
-aagcgtagtcctggggtcatctctcctattaatactgttggggaatgtttagtaggaaaa
-acaaacaattgaactgactatcggggtgtctatgtgatatagttgcctctgagaaatagc
-ttgctctatttcctcaatttccctttttgctgcaggagtcaaatacctgggagagtctag
-ggctgtattgccctttaggatagaaaacagttttgtaacttatcagtagttatgcccaac
-gtggggtgaagtcaattaatattgcccagtaacttttgataatcatttaaggtgtgtaaa
-tcgctagtatttaaccttttgaggtcttactgaccagaagttagtatgtatccaagatat
-ttccaattgtactttttcaggtgctatgattaaacctcttaactgtgtattctttatgac
-agaggcatataaacttaaaagcactggctctgttggggctgctaggaaaatatcatccat
-aaaatgaataatcttgcaactaggaaattcttttctactggggagcaaagcctgatttac
-atgatactgacacatggtaggactgaacagcatcccttgaggaagtactttccaatgaaa
-tcagcgagctggcctctcattactgataactggtattgtaaatgccaatttttctctgtc
-ctgttctacaaggggaatagtataaaagcagtcctttaagtcaataatgactataggcca
-atcttgaggaatcgcctcaaaggggaagggaggtcccgttgaaggggccccataggttgc
-aaattagcattgatagcctgtaagtcatgcaaaagtctccatttgccagaccttttggga
-atgatgaaaatgggcgaattccaagggctgtttgacagttctatatggccagcttttaat
-tgttcttccactaattcatgggctttttgtaatttctctctctttaaaggctactgtttt
-acccaaataggattttgagagagccatgtcaggggtaggggaggaataacagtggccatt
-attagaaaggtttgctgttcacacaatttatcaaattctgccctccagaggaggtactga
-ctggcctttaaagttgttttagctagcactgaccagtcccatggggtgatatggaagttg
-tctgctatggtttcaattattccttttgtaaatgggctagtggctccgtttaatgctttt
-tcttaccactttataagcgtcaaaagaagttgtctgctatggcttcaattattcctttca
-taaatgggctagcagctccattttctttaacgtttttttcttatctctttataagcgtca
-aaagaaatgggttcatatacctgatcgccttgtcgatcttgcattactgggcaggctaag
-agctccccttctgatgccgcttggctaagacagggtcccaaagctgtagtgtatcccttg
-tctttttccaatttattggaggagggggctcaggcaaaacctctgtttcctctttgttat
-ttttgcctgttaatggctgggctgagggagaaggaggagacggtagggtaggtgacggtt
-ccatctcccttacttttttaggcttttctgtgtagagtgggaccaaagcagtcctaacta
-aagcccataacgttaaagatgttactgagacccattgcccttgctcatgatgttaaaatt
-tcttcccagagctctacgtctagtgtaccttcttccgagagccatgggttatgggaaaca
-acagtttgcattaggtcccataattgagcctgtctgaggctctgctaactttcagcattt
-gttttactacttttatatactgttgctgttgagctgacaactgttgtcccatgatgacaa
-ctgtcatcccatgatgatcgtccctagcttgagcaattcctttgaacttggaaatgctga
-acaggcaccaatgacttactgactgcgcagtctcttcaccttcattttcgagggttccgt
-cgtgatctgttgcagcattcctcacacagggaatcacctgccgagtctgtcccacagact
-ttggccgagtgacagatgaaaggagtactcagacacagatattcagtgagagagcaggct
-aggggactgccagcactaggggccgaagagagttagcagtccccttaagctggtggccct
-cacatttatttagcacaaatttaatgacaaaggcttggagcaaacacaatttgtgggcaa
-taaacattgtcaacatcccaagtagacagcagtcctgtgtgtgaatgatcaaaggttggt
-ttctggacacaggaataaacaaatttatctaggtaagttcctatacaactcccctgttat
-ctgccctttgctctcaggcttcagataagaatttggctgccttcagccataatttctttc
-tgaagcttttgcaaaacctctcggccttccaagaaggtttgtgtctttcctataatttct
-cccaccaccctgaccaatctcctacaAaggctgaagcaggaggattgcttgagcccagga
-gtttgaggctgcagtgagctgcgatcacaccactgcacttcagcctgggcaacagagcaa
-gaccttgtctctaaaaagtaaataaaaaaaagagttgggctaggtttgaggtttattgtt
-gctatggttacccccaatgcagcagcttccagttcctccaatgacaccttggactgaggg
-tgcaggctggcctgccagagggattttctccttccatgtgtgctccctgctcagctttag
-gtcctccctttgtgaccctcagaaagggtcttcttcccatactcttgtctctctcctgta
-acatttttacttctaactcaaggcttgtcagcttaccattggcaggtgggggaggaggga
-attctctgttctgatcaagtctcagtctctgtcaggccctttgtgtctctgattttgggg
-ttatgtcctccttagtgctcctgttcctcccccAGTTCTGGGCCCAGTGTGTATTCCTGC
-CCCTGCCCAGGGAAAGTTTTGTTTTGTTCCTGTTTCATTCCCCCAGATGCAAGGGAGCTT
-CATCCAAGGGGGTGACAGGATTTGGTGTCCTTCCCTCCACAGACTAAGGCTTTTGTCCGG
-TAGGGGATACAGGGAAGGGTCTGGGTGGAGCACTGTGATCCTTTCACAGTAGCTGCCATT
-GTCTTCTTCCAGATCTTGAGACATTTTATTAAAACTTTCTCCAATCTTCTGTGTGCTCCC
-AGTGGGGTTCATGGTGAAAAACGCTGAAAAGGGTAAAGACTACTGCAGTCTCCATGACCC
-AGTCCCTCACCAGTGTCCACTTGTGTTTACCAGGTAACCAGTGCCCATGTCATCTCTTCC
-ATTTTGTGCCTGTCTCTCCTTAGATTTGAAGCCAGTTGATTGTCTTCTGATCTCAGCTCT
-CCAGAAGACCTTTTCCAGAAGACCTCTCCCTGTGTATCCACTTCTAAACCAGTCACAACT
-GCCCGAGTCTCACAGCAGCATGGTGGATATCCCGCTGTCCCTCAAACTGGGGCTCTGTCA
-ACAAAGAGGAAGGGAGGAATGACTCCCTTGGGAGGAGACAACAACATTGCAAGTGATCTa
-gtctttgaaaggcttttaagcaagggactgagataaaatttatttattatttttaagaga
-gaggttctcactctgtcagccaggtctcactgagagcaatgtgatcatagctcactgcag
-cctccaactcctgggctcaacgtatcctcccacccagcctccccagtagctagcactata
-gtcacacaccaccacactagttaatgttttcattttttgtagaacagaggactcgctgtg
-ttacccaggcctcaagtgatcatcgggccttggcctcccaaaatgctggggttatagata
-tgagtcactgtgcctggactagaatatttatttttgaaagatctttggttgcaggtgtca
-gatgaatcaggaattgagacgagatgggaaggcatcaagaccagttatctgctatgatac
-tccaagcaagagaggatggtggctgggatgaggaatttggcaacgggaatgggaggaagt
-ggatgcattcaagataaatATCCATTTATTAAAAGTAGTTGCTTTTTCACCAGAGTAATA
-CATAAATATAGTTTTAAAAGTAAATACTGCTACTATCTTAACAATAATTTAAAAAatctc
-aaaataacatgcaactgtttgatttttcagttttaggcattagttccccttataaatgat
-gagagtttagagcttagaccgcttgtcctgttaccaacaccaccacacatgccagcattt
-cccatcactcctctttccattgtcatcatactgtaatcctggttagaccagtattcagtg
-tttccattatgactacgtaaattctaatcacagctgaaccagcagtatgatatttagttt
-tccctcctttcataacttttcccattcctgctgagttaatacttttttggcttgtcttac
-tctgctcagttttcATTTTGTAAActtttaaacatttgaactctagcaaatatactgaga
-agtgccccaaacgtaaatggagagtttaacaaataattatagagcaaatacaacatttag
-gtaccaccccaataaacacaacaccgaggacccccagaagcaccctgtgtATAGTGGAAT
-GTTGTGTTGTTTCTGGCCATGGAGTCTCAAAGACTGATTCTCAATTTTTGTTGCTTGAAA
-ACAAGTAAACAAGTATTCTCagccgggcacggtggctcacgcctataatctcagcacttt
-tggaggccgaggcaggcagattacttgatgtcaggagttccagaccagcctggccaacat
-ggtgaaaccctgttgttttgtaaaaatacaaaaactatctgggtgtggtggcatgtgcct
-ataatcccaactacttgggaggctgaggcaggagaatcgcttgaacctgggaggtggagg
-ttgcagtgggctgagatcatgccaccgcactccagcctgggtgacagagttaagactctg
-actcaaaaaaaaaaaaaaaaaGTTGGTGTAATCCTTTCCACACACACATATATATATACA
-TAGATGTTATATGTGGTTGCCTTCTGTTCCTACTGATATATATGAATAGTATGGCTGATT
-GCATTATTGGTTTGTTTCTTCATTCCCCTGTAATAAGACTAAACatacacaccctttgcc
-atataacctcataaagttttcccaacacaggctctatgcttccctactgcactgatgttg
-ggcttggctatgtgatttgctttcgccaatgggatgatggtgcttgtgacacagcagagg
-cttgaaatgtgcttgtgtgattccatttggtctcttCTAAGTTTCTGTGATTCATGAGAA
-GAGCACGCCCTGAGTAGCTGCTGCAACTTCTGCCACATTGGGCAAACCTGAATCCAATTC
-ACATGGAGGTGTCCAGCCCAGCCGACCCACAACCTGAAAAACAGCTGCTTGGGCTGAACT
-TGATCTAGATCAGCTGAACTACATACAGTTGCCTTAGAAATTTGTGAGACTAAGACTAGA
-CAGAGAACAAAAGCAAAAGAAAGAAAAAATTTGTCTGCAATGACTGGCTAGGAACCTGGA
-CAGATTCCTGGCAACATAGCTGTGCAAAAGCAGCCCCACAAGCAAAATTGAGCCAGGAGA
-CAGGGTTCTGATCCCAGGCATGGGCCTTGGCAGCTGAAACTTGTTAGGCTGGGCCTCTCC
-CTCGCCAGTTCAGGCAGCCCCTCCTCTGAGGCCTCATGGACCATTCTCTCTTCTCCAAGA
-CTTCAAGATTCCTTCCTAGTGAGtttttcttttttacttttagatggagtctggctctgt
-cacccaggctggagtacactgacgtgatctcagctcactgtaaccgccacctcccaggct
-caagcaattctcctgcctcagcctcccaagtagctgggactgcaggcacacgtcaccaag
-cccagctaatttttgtattttttagtagaaacagggtgtcaccatgttgttcagtctggt
-ttcaaactcctgacctcaggtgatccactcgccttggtctcccaaagtgttggattacag
-gcgtgagccaccatgcccggcACCTAGTGAGtttttctgttacttttttttttggaggcg
-gggtctccctatgttgcacaggctggagtgcagtggtgaaatcatggctcactgcagcct
-caacctcctgggctcaattgattcctccatctcagcctcccaagtagctgggactacagg
-catgcaccaccatgcccagctaatctgtgtattttttgtagagagggtttcatcatgttt
-cccagaccggccttgaattcctgagctcaagtgagtcgcccgcctccacctctcaaagtg
-ctgagattacaggtgtgagccactgcacccagccTGTTAAATCTTTTTTTCAATTAATAA
-CAACttcttttacagacagggtctcactctgttgctcagtctggggtgcagtggcactat
-catagctcactgcagccttgaacccctgggctcaagtgatcctcctgcctcagcctccag
-agtagctagcactacaggcatgtgccaccacatccagctaatttttaattttggtagaga
-cagggtctccctatgttgcccaggctggtctccaactcgtggcctcaagcaatcctcctg
-cctcagcctcccaaagagctgagattacaggcatgagccaccacgcccagctTCTGTGAC
-TTTAAAAAAATCtttttagacagggtcttgctctgtcacttgggcttgagtactgtggca
-caatcacacctcactgcagccttgacttcttgggctcaggcaattaattctcgtcctttg
-gcctccccagtagctaggacacaggcgcacaccaccacactcagctaatctattttttgt
-agaggtgggttttcgccatgttgtccaggctggtctgggactcccggctcccaaagtgtt
-ccAACCACAGGTGTGTGGGCCTTCCGTGGTATCTTAACCTCATCACCCAGAGGCAACAAC
-AGCTAGTATTCTTCTAGTTTTTACCACCCCCACCACCTCAATCCTGCCCCTGTAGCCTTT
-CCAAGTGCCACAGCATTGTTTCAGTTTCTATCTTAGAAAGCCCGGGAGTCTGTGTCCTAT
-CTCCCTGGGGGCATTCAAACCCTAGTCCATAGCCTGAGGCCCACCTATACCCAGACCCAG
-TGTCTTGGAAGCACTGACTTTAATACCCACTTAggctgggcgcagtggctcacgcctgta
-atcccaccactttgggaggcttgggcgggcggatcacctgaggtcgggagttcgagacca
-gcctgaccaacatggagaaaccccgtctctactaaaaatacaaaattagctgggcgtggt
-ggtgcatgtaatcccaTGCCTGTCTCAaaaacaaaacaaacaaacaaaacaaaacaaaac
-aaaaAAACCCCAGTTACATTCAGGATGAATTCTGCCTTCCTTTTTGCCACCTTGGGATTT
-CCATTTCTTTCTCTGAAATAGGCATTTGCATTTTTCCTAGGATTTTTTTTTTAAAACAGT
-TGGAATTATCCCATATACACAATTTTTTCACTTTTCTAATTAACATACATTTCCCCATGG
-Gcttgtgtctcacctctcaatccccagtgtatagcaaagaccaggctcaggggcacttac
-aaatgtttgttgaaACCAAAGACATCCTATATTACAGAAATGAACTTTGGAAAGACCAGT
-CAGCGTGGGTGGGTGAGGAATGCCAGAGACGGGAGAACAAAATGAGGTATACCGTCAGGT
-TTGAAGGGTTGAGGGTTATGGAGGGTTCTTCATAGGAAGTTCACCATGGAGTTCTTGGAA
-CTGTTCAACACACAGAAGCAAGGTCCTCTCCTTCTAGGTATGGCTAGAAATGTTTATCAA
-TAGCTGAGACTCTGATTCCCAGGGTGGGATCAGGAAGCCAGCCCCAGCTGCTGCAGCATT
-TTTTTCCCTTTTTCTCATTACAGGAGCCAAGAAAACTGTCAAAGCAGATGATGCAAGAGT
-GAAGCTGACTCAGAAATACTCAATCCCCCCAGGAACTTCTCTAAGAAATGGACTGACCAT
-CCTGTAAGCTTCCATCTGGAGGTACCTGGGGAAGGGCTTCTCACATTGAGGCCAATAAGA
-ATCCCTAGTGggccaggtgtggtggctcatgcctctaatctcagcactttgggaggccaa
-ggcgggtagactgttgagctcaggagttcaagaccagcctgggcaacacggcaaaacttc
-atctctaccaaaaaaaaaaaaaaaaaaattagccaagcatgatggctcgtgcctgtagtc
-cctggaaggctgagttgggaggatcacctgagcctgggaggttgaggctgcagtgagctg
-tgatggcgctactgcactctagcctgggtaacagagcaagacccgtatcaaaaaacaaaa
-caaacaaaaaaCTTCTAGTGAGTAGAGCGACAGGGAGACAAATCCAGTTTGTAATTTGCT
-ACAGTGCAAAATATCTGGCTTTCCATAGAGGGAGTGGGAACAAGGCAATGCTGGCCTTCA
-TTCAATCAGAAACTTGACTTGTACCCGTTGAAAACCTGTCATGTTTAATGCTTGGATATT
-TTTTCTTCTAGTAaagacactttactgccacctgctggaaaagagtcagaaattttccaa
-atgcaaacatctatggcctccctataatgtagcatccttttactgtacatagtctgcaca
-actgtacaATTTAGAAGAGAAACCAACATTTGGTGTAACTCTACCATATACCAGGCATCT
-GTCATAGAATCTGAACAACCGCTCTATGAAATCAGTACTTATACCCCAATTTAACAGATA
-GGAAATATTGGGacctctggggaagggaggaagaagagggtatcaccaaaaaagggcaaa
-aagggggcttggtctgtattggcaatggaaattcaacttgggtggtaggattatggatgt
-gttacagctttctttataattTGGTACATGCCTAAAATGTTTTACAATAACAATTTAAAT
-CACCTGTGAAGAAAAGATTCAGAGAGGTTAACTGATCAAAAAAATCACACTGCCAGACAG
-AACTCTGTTAGAGGTAGACCACTTGCAGTAACATTACATTGCTTCTCTAATGGTTAAATT
-TAGCACAGAATCAAAGGAGAGCTATAAAGTCTAGGAAGTACTTATTTACATAGGATTGAG
-TCCAGAACATCTTGTGACACCATCTACATATGTTTTACTTGGAGAATAGTCTGAATTTCG
-TATTAcacgttgagcatttctaatttgaaaatacaaaatcctcaaaaatctgaaattttt
-taagcatcaacatgatgcctaaagtaaatgctatttggaatatttcaaatttcagattag
-gaatattgaactggtatgtattccgcaaatattccaaaaatccaaaaaaattcaaaacac
-ttctggtcccaaccattttggataggggatattcaacctATATTACACACAGGTAATACA
-GCAGGGGAAAAGCAGGGAGACTGCAGCATCTAAGTCTACTAAATTGGCCAGGATCATTCC
-TTAGTCTTCAGATACCTATTTATCAGGGTCTCATTAAATAAAGTTACTTGTCATGTTAGT
-TCAGTCTGGCCTGTGGCTTGTAATTATAGCTGCAAACTCAAGGGCAAAGTTCTTAGGATT
-TTGAGATGCTCTTTATGCAACAATACTTCCATTTACTTtgtgtgtgtgtgtgtgtgtgtg
-tgggtgggtgggtgtgtgtgtgtAGGGAGAGAAAGGGGGCAATGGAGTGGAGagtggaac
-tacaatttattaagcacctattattacaagccaagtagggtgttaaatattttcctcgtg
-ccattccattcaatactcTTCGATCCTGAGGGAAAACGAACCCACTTAAAAAAAAAAACA
-AAAGGTTTTAATGAGGATTGCATAAGACATGCAAGGTCACCAGGGAGTTTACATGCAAGT
-GGGGAGATACAAAATAATACAACAAAAGTTCAGGTGTTCTGAGGAAAAAGAAGGGCAAGG
-GTAAGTGATGACAGTGGGGGAAGTCGGATTCAGGATAAACCAATTTTAGACTCATTTTTT
-GAGGAAGGAACTGAGCATGACCTTACCACACAGCCTTTTTAGTTAAGTGTTTCTTTAACT
-AGGAAAAGGCCCTGGGAAGACAGGCTCTCTACTATGCAAACCCAATTCCAGTCTTGGGAG
-AGAATTTGCTGGTGGGACAAAATCAGGTTTTTCAAGAGATGCTTAAATGGTCAATTCTAA
-TTATAACCATACTTGTCAAAAGGTGAAGCAAAGATGAAAGTTAAAAACTAAGAAGAAATT
-AAAATTCCCAAATCTGTCAACCAATCTCTAATTTTCTCTGCTACTTTAGGACTATAGTAA
-TTAGCCATACCCTGAGGATCTACTTTACAAGATATATTCCTCTGACAGTCCCACTCTAAC
-AATTTAATCTATCTTATGTAAGCTGGACAGGCATTTCAAGTACAAGAAACAGAATTCAAA
-ACGTGAAAACGGAGCCATCTATCACACACGGTGTCGGTTGGAGAAGCATATTGCTCAGGC
-TGCAGGGACATTTCatttatttaaatgtttttattaaaaaaaattaaaGACCTTCATGGC
-ACAACTTCTTCCCAGCACAGTTATGGTTTAGTCATACCAATTACAATACAATTACAACCA
-ATAAAGCAAGGTGGGGAGGGCCTTCTGGCTTCAAACTTAAAAAAAAGCAGAGGAAGAGGG
-GAGGGACCACTTCAAACAAAGTTTAAAAATACTTTAAAAAATCTTTCAGAGTAATTGCCA
-ACATAACCTTTCATGTTGGCCATTCCATTTCCTGCCATCTAAGCAATGCAGACACAGGTA
-GTGCTGAGAAATAGTGTCCCAATACAAGGTATACAGATGAGGTAATTTACAACAACACGT
-AAGTTGTTACTCTGTAAACCCTTGCCTCCCCCCCACCCCCCACCCAATTGGGTCTTTTTT
-TTTTTTCTCTCTCTCCATGCTTCTGCAGTGACTCTTAAGTAGCATTTTTAAAAACTTCTA
-TTTATTTTAAAAGGCTCTTGGGTGGCACCTCAGAGTCCTCTGCATTCACCTTCGGTTTAT
-TCCAAGGTCTGATGGGTGTAAGGAGGTCCAGCTGTCTGCAGCTCTCCGCATCAGCCTAAG
-CTACACCTCAATTTCCGAGCTACAAGGATAGGGTATGAAGTCTTGATTTACAACCCTCTC
-CCCACCTCAAAAGAAAGAACTCATTAGTTATAAGTGTCCTGTTCAAATCACAATCCAGTG
-CAAACATAATCACAAATTGCATCTCTGGCACATCTGGTGCTTTTAGCTTCTGCACAAATT
-CAACATGGTAACCCTCACAGCATTCTAGGGCATAAAAGGGTCAAGTACAATAAATATCCA
-CTGTAAGTGGTCATAAGGAAGAAAATCACCCTGCCACACAGTCAGAATGTTTTCCCTTCA
-GCTCTCCCTACCGTTGAGAAGCGCTATAAAAGGAGGCTTTAGCGTCCTCTAAAGTTTACC
-ATTATATTCACTAAAGCCACCACCTTGATAAAGTTACTAAAGCCAAGATGGGTTACAAAG
-TTAGATAAGTTCATTAAATTCAACTCCCCAAACAATTACGTTTATCTATGATGCCTAGGC
-GAGAAAGGCCTGTGAATCTATAAGGTAGGAGAATGGGGAACTAAGATTTTAGGCCTTAAA
-ATATGTTGGAAGAATTTTTCCTAGTTCCCACAAGCAGCTACTGTAATGAAATAACAGGAG
-AAAATACAGAGCTGATGGTTTTGCTATTGTGCTTAAAAAACTAGGCTTCCTCAGTGAAGC
-ACCTGATAAACTTAGGTGGTTGGATTACAGTGGAAAGTCCACTTTACACACACACACAAA
-CACACAAAAACTGGCGACTTTTTCCATCCCCAATCCCTGCACTGCTGAGACACAAAATGA
-GTTTTATGGCAAAGGATCCTTAATCCCCAGAGACGCTTTGGCTTGTGGTGCTTTTTTTTT
-AAGGCCTCTCTGCTCTGCCCGGTACCATGGGTCGAACGAGGGGTGTATAAAATGGGGGCC
-TTGGGAAGCCTCCACGGTACAGGGCTGCAGGCCCCTCAGATGTGAACATGAGACACCCAC
-CCAGCAAGACCTTTACACAGGGAACTTAAATCTAACCTTGATAAATAAAACCAAACGTTT
-ATTTACACCAAAGAATTCCAACACTGGATCTTTCACATATGAAGGACAAAGTATTATATA
-TATACACACAGCAAGGGGTGGCGGGGCTGTAACAAGAGAGTTTATAGTTTTCCCACAATT
-ACAGGTCTACCATTTCAGCTTCAATGGAGATAGTGGCTCTGCTCCTACCTCTCAAGATAC
-ATTTACAAGACTGAGGAGCAGGTCTTCTCACTGGATGGCATGTGAGGGAAGGGGACGGTC
-GGAGGAAAAGAAGGTAGAAAGCTTAAAATGGAAGTCAGTGTGGCCACATCTCCCATTAGC
-TCTAGCATGAAACCTGTACAGACAATGTTTGTTTCTTTTGTAAAAAGCAGTAAGTTATGC
-CCAGTAACTAAATGAATTCAAAATGGCCAAGACAAAGAAAACTAAGAAAGATTTTGCCTT
-CCCTCTCCTACCAGCTATGGAGCACAGCATGTTGGGAGATGAACAGGGAAAAGACCAAGG
-TAAGGAGCCTGGGAGGGAAGGTATCAACATTTTAAACTGAACTAAAAATAAAAGTATAAA
-TGAGTTGGATTTAGGGTTAGATCAGTAAGACATGATTCTTACTGAACAGAAGTTTTTAGT
-ATCTGTCTGCATTTTGGGTAGATTTTCAACATCTTGATGTAACTAAGACACACTTCCACA
-AGAGCCACTAGGATAACCCCACTGAAGCGCTTATGGAGTAAAGTGATGTAAGCGACCAGC
-AAGCAGTCCACTGCTCCTATAGATTGGGtcctcccttccttctttccttccttcctttct
-tcctgcctcccCTGAGAAGCTACATTTTTGTAATCTCTGGAGAAGAGCACGAGATACCAA
-CCCCCTAAAGTGTGGGACGGTGGAGGAACAATGGTGGGAATGGGAAGAAGTCTCCACCTA
-AATGCAGCAGCCGGGATTGAGGCTGGTTTATCTTTGTTCTTTTGTGATGAGGAACTAAAT
-TTGGGAGGGGAGAAAAAAAAATTTGTCCATGAAATATTCCACCTGCAGGTAATTTTTCAG
-GGAATCCCCTGAGTTATGAAAAGTTCGAGTTAAAAAAAAAAAGAAAAAAGAAAATCAGCC
-TATTATAATTTTTTTTTTATGACTGAACTACTATAAATCCACAAGCAACGGTTCAGACAC
-GGTGCTTCTGAAGTGTTTCACCCCTCCCCGCCAGGCGCAAGCTGCATCAAGGAGAGGGTG
-GACTCCCCCACCTCTGCTCAGGCATCAGGAGACAGATAGGGCCGTTACTGCTGAGCGCCA
-GCGGCAGCTGGAACAGGCATCCCAAGGGGGTTGGCAGCAGCAATCACTGGTGAGCCTGCC
-AGAGGTCCAAGGGGTGAAGGGGTTGGCACTGAAGAAATCCCTGAAAGAAAAGAGCTGTCA
-GTGAGCCAAAGACACCAACCATGGCAATCTTACCAGTTTCTCATAGCACTCACTGCAAAA
-GGAACACAATAATTCTTTACTGAAGACTTCCTCTTAGCTGGATTtttacatatacttcaa
-gtctgaccctcacaaattcaagttaaagtggcaagtcctaatcaatttaagagacaggta
-aagaaatctaggcttggacaatttaaggagtttgtccaaagtacacgattaagcaagtgg
-caaccatggttggattctaacccaggcctgtctagGGCAGAGATGTCCACCCTGGTGACc
-agtagccaaccacatgtggctgctgagcacttgaaatatggctagtgcaactgaggaact
-acattttaaattttattcaattgtaattaaatagcctcacgtggctagtcactaccatac
-tgaacagcacaTGACTGCAGTCAAAGCTCATGTGCTCTTACACCATGCTGTCTTGATAGC
-TGGCAGCTTTCAAAATTACTGAAAGTCAATTTGAATGGGGAAAGAGCATTTTCTAAGATA
-AAATTGTGTTTTGGAATTTATTTCCATTTGATTTCTTCCACCTCTCTAATCATGTTTTtg
-tgtgtgtgtgtgtgtgtgtgtgtgtgtgtACACACAGGTAATACATTCACATGGTTCAAA
-ATACAAAAGGTTCAAAAAAGTATACAAAggccaggtgcagtgtctcacgcctgtaatgcc
-agcactttgggaggccaagttgggcggatcacctgaggtcaggagttcaagaccagcctg
-gccaacatggtgaaaccccatctctactaaaaatacaaaaattagctgggcgtcatggcg
-ggcgcctgtagtcccagctacctgggaggttgaggtgggagaatcgcttgaacccgggag
-gcggaggctgcagcagctgagattgtgccactgcactccagccttggccacagagcaaga
-ccttgtctccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatatata
-tatatatatatatatatatatGAGAACATTATTATACATTCTTCTCCACTCCTCTTAGAC
-ATGGCTCTGCATCTCACtttttcttttgagacagagtctcactctcacccaggctggagg
-gcaacggtgcgatctcggctcactgcaacctctgcctcccaagttcaagcgattatcttg
-ccttagcctccaagtagctgggattaaaggcgccgccgccacgcccagctaattttttgt
-atttccagtagagacagggtttcgccatgctggccaggctggtctcgaactcctgacctc
-aagtgacccacccgcctcagcctcccaaagtgctgggattacaggcatgagccactgcac
-ctggccctgcatcttgcgttttaaatttcacattattatattggagttggagatctaaca
-gaacatgaaactcttattctactggctgcaccacattccattaaatggatataccataac
-tgatttaaccagtttcctactgatagctattctcaatgttttgttattacaaataaggct
-acaagtaagtttggatatacattactctgtacagaggtaggatactcaaggggtaaattc
-tagaagGCAGTTAGTTCTTTTCTTAAAAAAGAGGAGGGCAACAGCAATTATTTGAGGATA
-TGTAAGTAAATGCCTTCACTACCAGATATGCACCCACTTGGATGTTGCCTATATGTATAA
-TTCTTATGCTATGTGCCTGTAGTTCCTTTGGAATAACTGGGTACTCTATAAAAATTCACT
-GTGCGTCACAATGATCCAATAATGGAAAACCATTTTACTTATGTTTTTACAACTGATAGG
-CACTCTATAGTTGCTCTGGCACATGTCACGGAACTGTCCTTGTACACATACACACCTATG
-TATAAACCCCACCTCTATACCCCATTTCTTAACATTGTTTCTAAGGGCCATGTAACTACT
-GTCATTTCAAACTATAAGATGAAATGGTGTATTTTTCCTTTTCATGGCTTGGCACTTTCA
-AGCCCCTATGCCAAAAATTTTCAGCCAGGAATGCTGAGATTCTAGCCTAGAAGGGGATAC
-CCTACTCAAGACAGTATCACTAAAGTATACCAAATGTCAAGCATGCTGAAACCTGGTTAA
-AAAAAAGTCACAAGGCCACCAGTACGGAGAAGAGAAGGTATACAAGAAATCAGACCACAA
-AGCTAAGAACAGTAATTGACTTCCACATTTTTTTAAAGAAAATTTACCAATGAACTGACC
-TGACATCATATTGGCGCTGCTGACGGGCGTACTGCCCCCTGGCATGCTAGATGAACCCAT
-TCGAGCCTGGTCCTTCACAACAGTGTCTAGAAAAGAGACAAAAAGGCTAGGTTCTGTTTT
-GCTTGAAAGATTAAACTAATGGTCTGGAAGCCTGAAAGCAGCCAGCTTCATTCTTTGCAA
-TTTATATATACTCTACATTATTCCCCAAAGAACTTAAGGTGGCAATTGCCTTCACCATGA
-ATTAGACAAGTGGTAAAAAGCAGAAATAGCTTTCCTATCAAACTGTGGTAAAAGCTAACC
-TTTCAATCAAATGGTAGAAAGATGAGGTAATTATTTATAGCAGAGCGAATTTAATGAAGC
-CCTGGTCCTGTTGAGGTTTAATGGAGACAAGACACTGTAACTCGGCAAAGACGGTAATAT
-ATTACCAGTGTGTCCACAGCCCAGTACCAAGTAGGCCAAAGCTATAGGTCCATGTAGCTT
-AGGGCTATGACCACATTCTCTATCCCAATCAGCCTATCTATCTGCTTCAGGTATTGGGCA
-AAAGTATAAATGATTCAGTACAAAACCATCACACCGAAGGAAAAATGTCATGTTGCAGCT
-AACATCACAGTGCAGATGGGGTGGGTCTCAGTGGTATTTTCACTTAGGATGGCACAGGTG
-GCTATACTCACAAATCTAAGTCAAGGTGTTCATACAATTTTAAGATTTGTAAGCCTCATT
-AGCTCTTTCCAACGAATGATTACTAGGGACAGGAAAGATACAGGGCTGTGTATTCTAATT
-CAACCATTCCAGACTGAGGCACTGAGAAGTGTCATCCTCACAGTATGAAAAGAGTTTATT
-TAGGAATGCTCTTGTGTCATGTATTCTGTTACAGAAGaattcttccagtaattctgcaat
-gtagttgccatcactatccccactggaagaatctgaggctcagtgtgggtgaattaactt
-TGCAGCAAGCTGACAGGAGCTGGGATTACGACTCTGTTCTATAGGACTCTGCGCCTGCAC
-AAACTCTGTGGGCTAGATATCTGGACTCACAGAAATAGGGGTGCTCCATTGCCTCTCTTG
-CAGTAAGCCGTGACTGGTGGTCATATCGCAGCAGTTTGTCCAGGAAATCCAAGGCCTCAG
-GGCTGACAAGGTGCTGATTTTCACTGTGGACAAAGCGTTCCCATCGCTTTCGAGAGTGTC
-TGCAGGACCAAAAGAGGGCATGAGAAATGGGCCACGTGGGCACAGAAGCCCAACATTTCA
-TTCCTACATTTTTCTTAGTGGCTAACAGCCCAGACAAAAGCAAAGAGGGATCCAAACTCA
-AGAGGGTAGTCTTGCACCGCTCTGCCACTGAGTGGGACAACAAAGCTAACTGGAGACTGG
-AAACAACATAGCTAGAGTGAAAAAAGACATCTGAGTCCTCTCAATTTTAAGAAACATAAT
-TCAGGTTACTTGACAGGACGTGACCGCTTCTGTGTAGCAAGGAGGGTCAGGTGGCTGAGC
-TCACCAGGCCTATTTCCCATCCCCACACATATTCCTGGCATCTCTGCCAATTGGCCAGCA
-AAAGCCTTTGCATCAGGAAAGTCCATCTCCTCCTGTTGAGTGGTTAAGTGTATAAGTACT
-ATATCTAGTCACTACTGTTAAGAGTCGGTTGTCTGCATATAGCCtttttttttttttttt
-tggagacagggtctcactctgttgcccagactggagcgcagccacatgttcattgctctc
-tgtagcattccctcctgggctcaagggaagctcctgcctcagcttcctagtagtctggac
-tactgccacacatcaccatgcatggagtcgagggtctcattatgttgtccaggctggtct
-ccaactcctgggctcaagtgatcctcctaaagttctgggattacagatatgagccaccgt
-gcccagccTGCACATCAGTCTTAAAGCATGCATTTTCTACTTCAATTTCTTTCTCTTGGA
-GAGAGGTTTTTCACTTAAAGAAGCAAGGTAAATTTTGATTTTTGCCTCAACTGTAACCCT
-TCTACTAGAATCTACATTCATTTTGTAGGAATCCTCTAGCTATAACCCCTCCATCAGACT
-CCTGTAAGTTAATTTGAATAAAGGGCCATTCAATCCAATGCCTTTATCAGAGGCCTGCTC
-AATGCAGCATCCTGTGGCACTGGACCACTGACATCCTGACAGTGCTGGCAAAGAAAACAT
-AACTATTTTGAAGATCCTAAGTGCCAGTTCACTCTCAAAGTGCTTAAGCCACAGATGCAC
-ATATTTTGTTTCATGACTTACCTGCCCAAGATATCATTGAAACGTGGATCTAATTCAATG
-TTGTATTTGTCAATATAGTCATATAAATCTTCTGTCCCCAGAACCTTGGCTATCCTCACC
-AACTAGTATTAAAGAAAGACAAAAACCCATATCACAAGCATATTATATTAACAAATCAAC
-AATTAACAATGATTGAATTTACATAAACGGGTCATCATGTCTACAGGTATGAATGCTACC
-TCCTAACAGTTTAGACTTCAACTCAATGTGATAGTGTTAGAAAAAGCAAACTACTTTATA
-AACTGGTTTCTTCCTCTTGAAATGtcaccctggtgaacccttatttttctcccctcaaaa
-cccaattgaagatgtcacttcttttgggaagctcccattgcacactcaaactactcacca
-ctactgccttttgtgccttgtccacatttctactctgaagttatgactgtaacctatttt
-gttgtatgtttgactcccttacaagatcagctatgaactatctgaggggaagaaaactat
-tctttcttttttctgtattcctcagtactgcatgcacttgatacagagTTATTGACTTTA
-ATGGAATTCAGGTTGTATTCTTTGACTCATTAAAATTGGACATGGTGCTCAAAGGGAACA
-AGACAATGGTACCTTCCACAAGGTCCTAGAATCATTCCAGGTTCTTGTGAATGAAAGAGC
-CCTTTGATCTTCAAGGGGGAAGTGGAGTTAGTTTAAGAAACATCTGTAACTCAACCCATA
-TAAAGAGCCAAAAGGATCACAGAAATACCACATATGGGCTCACATATTGGAGAAAACACC
-ATATTGGAGATAAGGGTTTATTAGGAGAATTCTAAGGTAATGTCCTATTTTAAAAATCTG
-GATGACAATTTATATGTATTCTTCACAATAAAATAAGCAATGCAAATGACAAAGACTAGG
-GGGGAATGTCTGATTTCAAAAGGCTAAGCTGGTAGCTCCCGAAACATCAATCTAAGGATC
-AATATCGGGGTGGCTGAATAAACAGTGAACTGAAAGTTACAGGCAGTGCTGGCTATCATT
-GCATTAGGCCAGTACATTTTTCAATGGGTATAACATATATTACCTGATCATAATTGTCAT
-GTCCATGGAAAAATGGCTCCTTCCGAAAGATCATACTTGCCAGCATACAACCCAAACTCC
-ACATATCCAAACTATAATCGTACATCTGCATAAAAGTAAACTCACTGTTATTATCTGTGA
-ATCCTCAGGCTTGTCACTTCaaaataaaaaattaatttttaaaattaaaaaaaaatCACT
-CCACTGACTCAAAATCAAAACACTAATAACATCTTCATATAtttctttttagtctttctt
-ttttttttttttggagacagagtctcactctgctgcccatgctggagtgcagtggcgcaa
-tcttggctcaccacaacctccgcctcccgggttcaagcaattctcctgcctcagcctcct
-gactagctgggactacaggcgcgtgccaccatgcctggctaattttgtatttttagtaga
-gacggggtttcactacgttggccagtggtctcaaactcctgacctcatgatctgctcgcc
-tcaggttcccaaagtgctaggattacaggcatgacccaccgtgcctggctAGttttttct
-tttttttttttttttagttttttttttagttttttcttttATGCATCTTTCACTCGGTTT
-TAAAACAAtttttactttttttttttttttttgagacagagtcttgctctgtcgcccagg
-ctgcaggggtgtgatcttggctcattgcaactcagcttcccaggttcaagcaattctctg
-cctcagcctcctgagtagctgggattacaagcgcccaccaccgcgcctggctaatttttt
-tgtatttttagtagagacagggtttcaccatcttggccaggctggtcttgagctcctgac
-cttgtgatccacttgccttggcctttccaagtgctgggattataggcgtgagccactgtg
-cctggctCttttttttttttttttaaagacacagggtcttgctctgttgcccaggctgga
-gtgtagtggcgtgatcatagctcactgcagcctccaactcctgggcttaggcctcctgag
-taggtaggattacaggcatacaccactatgctcagctaatATACATACTATTTTGAATTG
-TTTTCTTCACTTACATGAAAAAAAAAAAAAAAAAACCTCCAAATTGTTAGCCCATGGAGA
-CCATCTAATGTGTATCATTAGTATTTTATTACATAAATGTTTCAGAATTCAATCTTTAAT
-TTTCCTATAATAGGACAGTGTTCTGTTTTTCACAATTATTAGTAATACTGTAAAAACTAT
-TTTTATGCATAAAATGCTTTTTGAACTCAGGGCTATAGCCTTAAGACCCCAAGAAAGAAA
-TTCCTACAAGAACAAAAAGTCTGAAACTTTTAAAATCAACTGATAATAACCTGGAAAGAC
-TGGGCATAAAAGATACTCCCAAGAAAACTTCAGATTTTTAAACACTTGGCAAATCTATTA
-TTAATTTGGTTCCTTTCTCCTTTTTCTGTGAGGAGAAAGAAGGCTTTTTGGGGGAGCTGG
-GGAGAAGACCTTTTTATTTAGTATACAATTCAGAAGAACAAGAAAACATTCTTGAATTTA
-CTCTGAAGATTGGTTAAACTTAGTTACAGGATgggcatggtggctcatgcctgtaatctc
-agcactttggggagccaaggtgtgaggatgggttgtgcccaggagtttgagatcagcctg
-ggcaacatagtgagactttctctctacacacaaaaaaattaaaaattagctgggtgtggt
-agtgcacgcctgtagtcccagctactcaggaggctaagctggaaggatcacttgagccca
-gaagttcggggctgcagtcagctatgatcatggcattgcactccagcctgggcaacagag
-caaaaccctgcctcagaaaacaaacaaaaggccgggcgtggtggctcacgagggcaggag
-atcgagaccatcctggctaacacagtgaaacccagtctctactaaaaatacaagaaaaat
-tagctggggtggtggtgggtgcctgtagtcccagctacttgggaggctgaggcaggagaa
-aggtgtgaacctgggaggcggagcttgcagtgagccgagatcatgccactgcactgcagc
-ctgggcgacagagtgagactccgtctcaaaacaaaaacaaaaacaaaaacaaaaCAGCTT
-ACAATTCAAAACAGTTCTGGAACTGCTGATTATAGAACATATCTTTGGCTACTTTCCCTC
-AAGTCAGGATCAAATGCAAACCTATTCATATTCTACCGACATTATGACAATAAAAGTAAT
-GTAAGTCATGGTACATGAATTAAGGTGATTTATATTTTACATTTCATATAAAAAGGACAG
-CTGTGAATGTGCATTAAGTGGCCTACCTAAATGCACAAAATGATACTTTTTTTTTTTTGG
-TAAATTATGTGCGAAATAAACACAGGATCAAAACTGTGCCTGCCCTTCTGTTCTTACCTG
-ATAGTCTACAAGTAGCTCAGGACCTTTGAAGTATCGGGAAGCAACTCGGACATTATATTC
-TTGGCCAGGATGATAAAACTCAGCCAAACCCCAGTCTATTAGTCGTAGCTGAAAAAGAAT
-AAACCATGAGCAATCTTATCTTTCTCTAAGCTACCCACACTGTGCCATTAGCATACTCTT
-GAtaaaatataccagacacgtcactctttactgaaacccctccactgactacttatagcc
-tttagaatgaaaataaaacttcttagcttgacaaacctctttctccatgattttgttccT
-GGAAGACACAATCTCACCTGTGCTTTTACAAATTTCTTAAACTGCTCAATGACTAAAATG
-TCCCTACTACCCAGCCTATAATCCTATTGGTAAGCATTTCCTTAACTTTTGGAATATTTA
-AGTCAGCTTCTCAATGAAGTCTGATCATTGCCTTCAGCCCCCTGAATTTTAGATATATTT
-CTTTAACAGAACCTAAACTCTTTATGTTTTCTACCTTtctttttcaatatggacgacaag
-ctccttaggggtagggactgttttattcacctttgtaattttcagaattcaacataatgc
-ctggtatacaggagaaaaatgaataaatatttgctggatagatgaaATAACAGAAAAGTC
-ATACAATACAGCTTTTACCAAAATGCATCCTAAACATGGAAAAAGGGGTAAGAGGCAAGC
-TTATCTGCCCACTGTGCATAGCATGACCATGATCTGAAGTGCCAGCAGTAGGCCCTGAGG
-AAAAACATCGGACTGCTCTGGCACTAAGTTTACTGCCTGTATCTcaaaactaaacctttg
-attactccctgcaaaagcacctccactcagtctccccctgttcggttaaaggtgatactc
-atcctgtcatacaagccaaaacttaagattcaccctggattcttgattccctcagacctc
-acatttaatctgtcaaaaaattctgaaggttctatcatattgtgaccattatcatcacct
-ccactgccactgccccgatccaagccaccaccacctcttgtttgatatattgccatagcc
-ccttctcctaactggtctcactgctttcactcttgccctctagtctaAACAGtttaataa
-atactaaatagtttaatagttattttaaaaataattaaatatttaaaaataaatataaaC
-AGCTTTTTAAAAGGATTGTTCAGGTTGCTATGGAGAGattatagattcacaggaaattgc
-caaagtagtagagattctctgcaccctttacccagtttcccctaatagtaacatcttaca
-taactacagtacaatatcaaaatcaagaaactgacactggcacaattcagaaagatctta
-ttcaggtttcaccagttttacatgcacgcatgtgtttgtgtgtgtgtttctatgcaattt
-catcacatatgtaagttgatataatctcctcaacaagatatagaactgttccatcaccac
-acacatgtcctgtgtgttagcccaacccctggcaacccctctgctctttatctctatcat
-tttgagaatgctacaaaaatggagtcattggcatataactttttttgagactgccttttt
-tcactaagcatgagatccatccaagttgttgcatgtgtcatacttctttcctttttattg
-ctgagaaatactacttcataataatattatatggtatggatatgccagtttgtttaacca
-ttccctcattgaagggcacttttccccatttttttttttttttttttttgagacgcagtc
-tcgctctgtcacccaggctggagcacagtggcacgatctcggctcactgcaacctccgcc
-tccggggttcaagcaattctcctgcctcagcctcctgagtagctgggattacaggtgcat
-gccaccaggcccggctaatttttgtatttttttagtagagacagggtttcaccatgttgg
-ccaggctggtcttgaactcctgaactcgtcatctgcctgccttggcctcccaaaatgatt
-acaggtgtgagccactgcacccagcttttccccccaattttaagctattacaaatatagt
-tgcattcatatataggcttttgtgtggacctaagattttgttgctctgagataaatgcca
-ctgcaggattgtatggtaagcatatgtttagcttttcaagaaaccaaccaactataaaac
-aatagttaagcattttccaaaatgccaaactttgcattcctaccagcaatgtatgagaga
-tcaagtttcttcacatttttgccagcacttggtaccatcactattttttattttagctgt
-tctaataaatgtgtagtTAActtttaaatttcaagtgagaacatgctaaagcttagaata
-tgcaaaagctctctatcttcagagaaaaggcctaacaatgaccaataaggttttacatga
-tttggttttacctctttgatttcatttcctccttctttccccgcattcattctgtcccag
-ctttatccttgctgctgctcttccaacatgccaaacatatccttacctgaagggcttttg
-tacttgctatttactctgccttgggacatgtttcttcataagactgcatggctgggtccc
-tcccagtgctctctaaaatgtcacctttccaatgaaaccttcccttataactggtttaaa
-actgcaaataccctcttgccattccctattcgttttttcttctacatcaaaataactttc
-tatcccaccagcctccctaaatgtagctcctaaaagacaagcatttattgtatgttgagt
-tcacttacatatccccagccctagggtggtgcctctgacatggtgtgtgtctaaaagtaa
-ttcagttgcataaataaatCACCTGCCTCCCCAGAGACCACAACAGGCAAGTCATCACAG
-CTTGTCACCTTAAAAAACTGAAATGCTAAAGCATGTGGCCATTACAGCTCTCATGTAAAA
-GCATTTGCAGACAACAGGGCCCTTATGACATCCAATAAACAGAAACAGCATTTTCTGTAT
-ATCTCGTCCACTTAACTGTGCAcatttaattctcacgaatacctagtcgcctgcagggct
-attattacccacactgtacacgtaagaaaaagaaggcaaatggagagaaagtagtttCTC
-AGGAAACCAGTTACTCAATAAATAAGGCGAGAAGCCACGTTTCCGGGCTTAGAAGATGAA
-CATTTTGCCCACTTTACTCATGTTTCCTTCTTGGGAATATTCTTAGGAATATAAATAATG
-GTTCAAACATGTTGACTTGTAAATTCGTAcattcattcaccaaatatttctcaactgccg
-aataggtactagggcctgtgacaacacaagggataaagtgttgaaGATGGGCAATTAGCT
-ACATCATGTAGATAAATAACACTTGTCAGCCTATCACTTTACCTTTCTGTGCTCATGATC
-AATCATGACATTATGGGGCTTGACATCTCTGTGCATAATTCCCATGCTGTGACAATAATC
-CAGGGCCTGTGGGATGAACGGGTCAGAAAGGAGTTAGCCTGAATAATACGTAAGAGTCCT
-TTACTTTTCCCTCCATGTAAATTTTCCTTTTAGCCTCACAATACCCCTGGGATTCAAGCT
-GAGGACACAGTCACTTCCACAGCAATGCTTCAGAGACTTGTTCATGATCTCACAGTCAAG
-CAAACTCAGCTCTCTGAGCTTAGAGATCTTTTTCTGACACAGTTGTTTCAACATGTTTTC
-TGTCCTAAAAGACCCAAAGTATACCCAAATTGCACCACTTCAAATTTTTCTGTCTTGTCC
-AGATCCTAGATTATTTCCACAGACCCCTCAAAGAAAGAAAACAGATCTTTACTACAAACC
-TCTTATTCTAAGAACAGTAATTCTTTAGCCATTAAGAGTCTGTAAcagaggttggcagac
-cacaggccaaatttggcctgatgtctgcttttgtaaataatgttttattgcaacatagcc
-atgcctatttgtttgcatattgtttatggttgctcttgtgcaacaacagcagacttgaat
-agtgtgacaaacactacatggcccacaaagcctaaaatatttactatttggccctttaaa
-gaagtttgccaatgcctgATTTAGGTCATCAAATCCAATCTGAAATGTTTCCAACCTCAA
-ACTAAAGGGAACTGAGTAGTATAATCTTTGGGGTTTGTTAATCCCAGCCTTTCAGTCAGC
-CGACGTTGTTGGCCAAATTCTTGTCCTTCCTGAAGGGCAACTTGGGTTCCTACAGTTCCC
-AGGGCTGGGCAATCATATCTGTAACTTTCTAAAGCCTTGCTTGCCACAAACTGCATGAGC
-CAATGGAAAGATCAAGTATCTCTGCTGGCACAATCTCCTCAGGGGATTTCTAAGGCTCCA
-ACAGCAGGCTTTATGTCAACTCTTGTTTAGTAAGAAAGCTTAGCCAACTTTTAGCAATTC
-TCTCTTCTAGGAAGCTGATCTTGTGGCTACTGGGAACAAGATATTTGGTGACCCCACTTT
-AGAAATGTAAGTAAATTTTCAATTAGCATCTATAAGCAGAAATTTACACAATCCTTAGGA
-CAATTACCCTTTGAGAACTGAGTTAAAGTTTACTGTTTTATTTGCTGACTCTTAAGTGAG
-ATAAAGTATACCAGAAGCTAGCACGTCAGGTGTTTTCACGAGTTTTGAAAATTTAATATT
-AACTTACATAGGGGCCACAGAAATTACAAATATTTGTTAAGGGGTCAGTCCCAGCTATCT
-TACAAATACCCTTTTTCAAATTGTTCTAAATTATACTCCCACTAGACCCCATTCCATAAC
-CCTTAGCACAAGGGTTCTGATACTATTATTATTAAtttttatttatttatgtatttagag
-acagggtcttactctgtgctactgcactccagcctgtgcaacaatcatagctcactgctg
-cctcaaattcctgagatcctcctgtcacagcctcccaagtagctggaattacaagcataa
-gccaccatacccagctaatttttaaattttttgtagagacagggtctcactatgttgctc
-aggctggtcttgatctcctggcctcaagcaatcctcctgccttggcctcccaagtagctg
-ggacttacaggtgcacaccaccatgcccagGTAATTAAACAAtttttttttgtagagatg
-gggatctcactatgtcacccaggctggtcttttgatctcctggcctcaagcaatcctcct
-gcctcagccttccaaagtgctgggattacaggtatgaTACTATTAACTTATTAAAAACTT
-ATATAGAGGTCCCTTCTTTCAACATACTTTACAAAGTTAATCTGCTGGCTTTTCTACCAT
-CAATTGACTATTTAACAAAAAGAAGACCAATTTAAAAAATATTTAGTATTCAAGGTTCAC
-TTACCTTCAGAATCTCATACATGTAAAATCGAATATCATAGTCTGTTAACGTCTGGTACA
-ATTGCTGTTAAAGACAAATGTTTGAGCCATGAAATAATGCTGACAGAAAGGCATTTTTCA
-CCCTCACTCACAGTAATTCAAACCAAGACTTGGCTCATTTACCGTTGTTCCAAGATCTGT
-CCATTCACTGCCCTCTATTTCTCCAACATTACATTAACTTTAAAGAGATACTTTGGGTCT
-TCAACTCTTAAAAATGAAGAATTACTTAAACATATATTGCGGAAGCTATAATCCACTGTC
-AGAAACATACTGATCTAGATACGTTAATATGCACTGACACCCACCTATAATTTAGTTTGC
-TTTTCATGTATCTTCAGACCTTCTCAAAAGAGGCATTTTGGCAAATATACTGCCTCCTTA
-GTAGGGAACTAACTCATCTTTGCCTTACATAGTTGGCCCTGCAGATCACCAGTGGGTATG
-CAGATGGCATGATACCAAACCTGTTGAGTCAATTTAACAAAACTATTCTTGTTCCAATTG
-GAAAGTAAACTCTGAACAACTGTTATGTATCCTTTCCAGTTTCCAAAGAGTTGCAGAATG
-TTTTTTACATGGACATATCttttttttttttttttttttttgagacagggtcctcactct
-gctgcccaggctggagtgccgtgctgcaatcataactcactgcaacctcaaactcctggg
-ctcaagcgatcctcctacctcagcttccccagtagctaggactacaggcgaaagccacca
-tgcccagcCACAGGTACGTCTCTTTAATGGTTAGCAACGTCTTCTGACAAAGTTTTTCTT
-GAAATTATCATTCTGACTCTAAAGCAGTTCCTCTTCCTTTCTCCCTATCTCTGCAACAGA
-ATTCACTAATTTATTAATATATAACATTCTGGATACTGGACTGGTGGAAAGGCAAATCGA
-AGATTTTTACTTTTACTCCAAAAGAGTAGCTATATTCTTCTGTAAAATTGGAACTGTGTG
-AAATAAGTAGGCCACTGGATAGACTGGAATTCTGAGATATCTCTTATAGAGGTTTGTGTT
-ATGGCAGAATTTGACATTATCCTTCCTCGATCCCTGCCTTTTAAGATCTATAGCCCACAG
-TTTATGAGGAATCCTAAGAAATAAGCAGTCCCTACTTTTATACATACAATATATTTCTTC
-CTGAACACTATTGTTTAAAGCGAATTGCCATATGGCCAGATCCTAAGTGAACGTGTGTTA
-CTGCCTTCATTAGGTTGGACATCAGCAGAAACTGTCAACTAAGTAGTGAGAAGTCAATGT
-GTTGGTCATTAAAAAGAACATTAAACAAATGGGCAAAATATCAAGATGCAGAAAGTGGGC
-ACTGCTTATATAGGAGTTCTTCTATCTTAAAATTTGCACTGTAAGGATGAAAAGCTTTTT
-AAAAACAAATGCGAAGCAAGCTCTTCTAACAGCATCATCCCCAAAGGCTATGTGGTCTAA
-AAACCCACTAGCCCGAAACAGTTGGTTATATATTATACCTTGAAGTCTGTGTTGTTTACG
-TGTTCAAAAACCAAGGCGGGGGTTCGTGACTAGGGGAAAAGAACAAAAACAAAAACACAC
-ATTAGCAATAGCCCTGACAGCTTTAATGGGGACAATGTTTGCGGATGCTGCGTGGTGAAA
-TTTGGCAGTCCTCGCCTCAGTAGTAAGAAACCCTCTATTGCTACAAGCCCTCCCCGCTCT
-GATCATCACCGCACTTAGGTCATTTTTGGGATGGATTTCAAACAGAAGACATGGAGCTGA
-AGTCTCACCAGGCTCTAGGCAGCCCGACAATGCGCCCATCGCCCATCGGCATCGGACCTG
-AGTTTGCAAAATGGATTAACACATTTCAGTTTCCAGTGCTATCAGTCTCTTAGCCTAGAA
-GAATAAGAAATAGTCTGTGGGTGGAGGTCTCTTTGAAAGAAAGACCCAAGCTAGTTAAAT
-GGTATATCTGATTAAGCACTTTCAAAGCAGGACTTAATGATGAGGGTTGGGGGAGGGAAC
-AAAAAGAGGCCAGTTGTGCTCCAGGTCAAACACCATCTCAGCTCTGGCGGGCCTTGCTAA
-CACCTACTATACTCACCACAGGGTCTTTTACAATGTCTGCCAGTGTGATGATGTTGGGAC
-CTCCTCTCAAATTCTCCAAAATCTTTATTTCACGCTTAATTTTCTTCTTTTTTACTGGCT
-GAAAGGGGAAAAGTACATCAGCaaaaaaaaaaaaaaaaaattttttCAGAGTATTTCAAC
-ACGTAGTGTAATACATAAATGATAAATGGCTTACTtatgagcacaccttgaaggaagaaa
-atgtgtcacattcgtctctgaatccttctcctagcactgtgccaggtattctgcaggtac
-ttacaaatgttgaattgaaagaaAAAAAGATTTCTATTCCAAAGACCAGACACTTCTGCA
-GAATTAGCATTTCAATCATCAGTCTTGATGTTAATGTTTTAAAACATGTTAAACATGTTA
-ATGTCTTAAAACCTTACAAAGTAGCAATTTAAATCGTTAGTAATACTAAAGTATATCAAA
-CTTTTTATCAATTAGGATGAAACATGGGCCCTTTCCATTTCTTCCTCTAATTAGGGCCAA
-CAACAAGGATGGCCAAAACATCTTTGTgtagcacaaccctgagggtaaagggtgagtctt
-ggagtcacaatgcccaatgtgaaacctacctttactacctgctggctgttaatggcaaac
-tacataacctctctaagcctttcattaagtgtaaaatgagtaacaagagtacccatctca
-taagattgttgcaagaatcaaatgaggtaTTCGAAAGATTTCGGAATATGGCTGAAACAT
-AACATAATAATAACTGTCTAGCCTGATCACCAATGCTCtttttttttttttttttttttt
-gagacagagtcttgctctgtcacccaggctggagtgcagtggtgcaatcttggctcactg
-caacctccgcctcctgggttcacgccattctcttgcctcagcctcccgagtagctgggac
-tacaggcacccgccaccaggccaggctaatttttgtatttttagtagagacggggtttca
-ccgtgttagccaggatggtctcgatctcctgacctcgtgatctgcctgcctcggcctccc
-aaagtgcCAATACTCTTATAAATGAACCCCTCCATTCTAAAGAGTATTCTGCAGAGCATA
-TCTTAAACATTCCTTTGTCCTTACCCATTCTTTCCACATCTGTTCTAGTATGGAATCCTT
-TTCATTTTTTTCTGAGGAGGGCCTTGGTCCCACTGCACCTCCTTTATAAAGCCttttttt
-ttttttgagacagagtcttgctctgtcgcccaggctggagtgtagtagcatgatctcagc
-tcactgcaacttccgcctcccgggttcaagcaattctcctgcctcagcctcccgagtagc
-tgggattacaggcgccagccaccatgcccagctaatttttgtatttttagtagagacagg
-gtttcatcatgttggtcaggatcgtctcgaactcctgacctcatgatccgcctgccttgg
-ccttccaaagtgctgggattataggcatgagccactgtgcctggGCTTATATTATAAAGC
-CTTCTCCTGAATAGTCTAAAAcagtgctggcccaaaggaaatataatacaaaccacatgt
-gtaattttaaatgtgttagtagccacatcaagaaaattttaaaaaggacaaaattaatgt
-actttattaatctaaaatcttaacatataaatcaatataaaaattattaatctattttac
-ctttttttgtattaaacccttgaaatctaatgtattttactcttacagcatatctcaatt
-cagcccagccatatttcaagtgcttaacagcctcatgtggcctgcgtgcctgctgtactg
-gactgtgcagGTCTTTTCCTAGGGTGTTGGTCACCTCAGACTAGATGCACTGCATATAAC
-TCTTAGAAGTTAAGTACATCTCATCTCTTCATTAACAAGATTGgtggttactaaagtttg
-atgaccaacaatcacctggatttttttaatatacagactcacagaacccaccaagattca
-ctaaatcaaaatcttgagagggaaacgggggatttatttttagatactttccaggctgat
-GATCCAGGTCCAGAAACTACCAAATAATACTATAAATTCTTTTAACTTTGTCTTAAGCCT
-CAAGCACATGATAGCAGAAAGCAAGCAGATTTTGGAAACATTGACAGTTCTCAAAACCTG
-GCTTTGTGGTTGTGCAGTGTTCAGAAAAGCATTTAAATGTTTCTCACTGCTGAAAGGGAC
-TATACTCGCCTGTTAGTGATTTACATACCACAGTTAGAACAGGTCCAATGCAAAGTGGTA
-CCCAATAAACAGAAGCTATTTTACTAATGACTTCCATGTAGTCCATTGAATTCAACCCAC
-GACCTCTTACCCAATACAATATCTACCTAAGAAACAAGATAATATAAGTCTTCTCTTCCT
-GCTTCAACTATTCAGATCTTTATAAACTGTTATATTATCTGGGAGATCTTTCCACCCTGC
-AGAGACTAACCCAACAACTTACCTCCTGTTTTCCATTAACCCAACTGCTGGTTTTTTAGT
-GGAAAAAAAAAGCTTCTGGTTGACAAAACTACTCTACAGAATGCTTCAAATCTATAAACT
-TAAAAAGCTGGTTTGTGACAGACCAGGCAGCTGACTCAGGCCCGAATTTAATGCGATCAA
-TGCAACTTTTGTCTTATTAAATAGGGGAGATTAAAAATTTTAAATATGGTTTACAAAGGA
-AATTCATCTATACTTACACCACCTACCCACAGTTACAGTAAAATATACAATACAGTTAGA
-AAGACTGAGCTGAAAAAAATCTTTCTAAATCACCCTTCATTCAAAATCATCAAGGGCTCA
-CAATTACCTAGAAGAGATAGTCATATAATTTTAAGACTGCAAGGAAATGCAGAGATTATT
-TTTTCCAGGCCTTCGCCAACTTAATCTCTCTTTCCAAGTTCAACTCCTATGTATGGTCAC
-ATAACATCTTTCACATGAAATATTTCTCTCACTTTTCCCTCCTCCTCTTTTCTTATCTTG
-GTGCACTCTACAGCCTGCTTCCCTTCACCACTTCCACCCAACACCTATCCAAATCCTCCT
-CCCATTCAGCCTGAAGACAGCTCCTGGGAGCTTTTCCTAACTACTACCCTCTTCTGAACT
-GTAGACCCACTATGCATGCTTTTCATGTGGCTCTAAATAATAATATATCACCTCATTCTA
-TCATATACCTTTCCATATGAATATCACCATACAATCACAAAGAACTCCAGTCTCCAACGT
-ATGTATATATACACACAATTTTGTGTTTGATCCtttttgttttttgagacagggtctcat
-tctcatcgcccaggctggagtgcagtggtttgatcatagatccgtgcaaccttcaacttc
-caggctcaagcgatcctcccactttagcccctcgaggacctgcgactaaaggcacatgcc
-accatgctcagccaaCATTCTTTTTAATAGATGGATAAACATGTCCTAGGTTAAAAGGAC
-TACTATGGCTAGTCACCCACATGTTTTGATTTCCAACCTAGTTCTCTTTCTACATATTTC
-AAGACAGATATAAATACTTAAACTCTCTGGTTCTCAAAGGGCATGTgaagcaccccagca
-atgcacaggaatactgtggaacactttacatttttgaggaagacacatcaacccatcgtt
-gaatctgccagacactgggtgcactgccagcttgaggtggttcgtagtttcaacattaga
-ttgtgttacactcctcgtgatggattgtgttatactcctcgcgatggcatatttttgtga
-agctgggtttgcagtagttgctgtggtaaaaagcaagtactgcacaaaaatcaatgacag
-gaaatgagggtggtggtgtccaaccaatgacaacatttgaaaagctatgcagcaacaggt
-ctacataacccaacagtaacaaattatagttatataagaacaaatttaacttttttcttt
-taatttatgtgaataactttttaaatggctaccaagttgctaagatataaatacttagcg
-ggcaggcgcagtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcggat
-cacctgaggtcaggagtttgagaccagcctgaccaatatggtgaaaccccgtctctatta
-aaattacaaaaattagccgggcattgctggcgtgcatctgtagtcccagctacttgggag
-gctaaggcaggagaatcgcttgaacccaggaggcggaggttgcagtgagccgagatcgcg
-ccactgcactccagcctgggcgacagagcgagactccttctcaaaacaaaaacaaaaaca
-ataaaaaaaacaaaacttacttagctatttggaccttgctacttaatacagagaactatg
-aggtatttcttgacttaggagtaccgtgaaaaattaaagacagtataagtgttataaatt
-gagaaagtttggaaacttctACTTTTCAGTGTCAAATATGAAAAAGTTCCTGTGGTAAGG
-AACTATATGCTAAGTTCCCAATATATGACAGTGCACAGCATAGTTATAACTAAATTAAAA
-GTTGTATATTGGTCTCCCAGAGGCCAAATCtggcctgtgcattgtttttttaaaatcttg
-agccaacacttaaaagtcaggaaaattcatatacaaatataaatttctggcttttatttg
-caaaacagagtatcaagcaacaatggacttgcattactgcagggcaatcatcagcttcag
-ctgagaagcagctaactccttttgaagaggcatgtgtttcccagtttgtttcagtcccta
-ccactcacatcacCTAAGCAAGGGCAATTACACCCGACTAGCTGCACTAATATCATCTGT
-CTGTCCCCCTCGAGTCCTGTGACTCCTCATCTTTACAAAGTAGAGGCAATGATTTATTTA
-TTGAAAACAAAAGCCTCATTATATAATGAAAAGTAAAGGAAATAAGTATTAGgcaataac
-tgggagagaagagactgtacctttgctcccttactctgccacaacctagctatatgagtc
-aactcaaatcacttctcttgcttcagtttcccgatctgtcaaataagcagaacttgttct
-attgagttcataggatACAATAAAATTTTATTTATTTGCTTTGGCACCAAAAACCTTTTA
-AATGCTGTTTTAAAAAAGTCTTCAAAACTACTTTTAAAAATCTATATTCCAAATACCTCT
-GAAATTATCTCTTGTACTCACCTTGAGAATTTTAACAACAACTTTTTCATTATTTGTGAT
-GTTGATGGCTTCAAATACTTCACTGTATTTACCTCGGCCTAATTTTCGAACCAGCTGGTA
-GTCATCTTGATTTCTGTGGACACAAACAAAATGACTTATAAACGGTCAAATTATCAGCAT
-CAATTCAAATTACAGGAATCTATTACCAGCAGCTGTAATAGAAATAAGAAGTATTTCAAA
-CAATTCCCAAATAGGtttttttttttttttttttttttttggagatggagtctcactctg
-tcgcccaggctagagtgcagtggcgcgatctctgctgactgccagctccacctcccgggt
-tcacaccattctcctgcctcagcctcccgagcagctgggaccacaggcgcctgccaccat
-gcccggctaattttttgaatttttagtagagacggcgggtcctcaccgtgttaaccagga
-tggtctcgatctcctgacctcgtgattcgtccgcctcggcctcccaaagtgctgggatta
-caggcgtgagccaccgcgcctggccCATTGtattttttttttttttaaattaGGCCAATT
-AAAATACGTGTGTTTCAAATCCTAGAATTAGAAAAACTTATACCTTTCAATTATTCTTTC
-TAATCCCAAACTGTTTACATCTTTATTGGCACATGACATGGAGCTGGCTTGTATTAAGGT
-TTGTTCTAAATACGTTTGTCTCCAACAAGAGACAGCTTTCCCCAAGAGAATAAttttttt
-ttttttttttttttttgagacggagtcttgctctgtcgcccaggctggagtgcagtggcg
-tgatctcggctcgctgcaagccccgcctcccaggttcacgccattctcctgcctcagcct
-cccctagtagctgggactacaggcgcccaccaccacgcccggctaatttttttgtatttt
-tagtaaagacggggtttcaccgtgttagccaggatggtctcgatctcctgaccttgtgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgcacccggccG
-GAGAATAATTTTTATATATTCTTGTCCCTTAGTGCTTGGTCCAGTGTTGGCACTTAGCAG
-GAACTAAAAACATTTTGCAAGACTGTTTCAATCTAGCCACACTTTGGCAGCAGCTGATTT
-TTAACAGGCCTCTTTGAAGGTAAATGGCTTTCAAATGTATAGGCTTAATCTATTTGCCCT
-CCAGGGCAAGCTCTGGGGATAGTCCATGCGTAGTACGAAGCACATTATAGATTGTAAACT
-ATAATCAGCGATCCCCTCCTCTACATATACCCATATTCTGTGACCAATAAGCAACATCAG
-AGGTAATAAACAGAGGTAGAATAAGGGAAATGCCAACATTTTCCTCCTGCCCCTGCCTGC
-TTCCAATGTAGAGCGCTTTGCTCTGAAGAATGACAAACACAGTTCCAATAAGGCCTAAAT
-TCTATCCTACTGGATAGAATCCTCTGGACCTACTAAGTATCCAATATGAACCAAATCAAC
-CACCTCAACCATTCATTTTCCTCAAGTAGCTAAAAAGAAAGTGAATGAAAAGACAAAAGG
-TACTAAAAACAATGGACAACATAATAATCATGGCAGGTGTAGGGGAAGAATGCTCCTACT
-TCTGGTTGAGTTCTCTTCCTATGGGAGGGCATACAAAACAAATGCCAGCAAGCAAACAGA
-ACCATGCCAAAAGCCCAAAAGGGCTCTTTAGTGCCATTTAAGCAGAACCAAGTGCAAAGC
-ACTCAATTTGAAGATAGCGGCTGAAATTCCTATAGTAAACACAGTGTCACCTAGAGTCCA
-AAGCCTGTGACATAAGAGGAGAATTGTTAGATTATCAGTAATAACAACATTTATTGGTAC
-TAAACCACACTGGCATTTAATGGTGTCTTTACAGCATACAGTGCCTCTGTATTCAGAGGC
-AATGTATTTACTGTTAAGAATCATGGCATACTCaaattagctgggtagggtggaaggtgc
-ctgtaatcccagctactcgagaggctgaggtgggagaatcacgtgaacccaggaggcgga
-ggctgcagtgagccgagatcacaccactgcactgcagccagggcaacagagcaagactcA
-TTTCCACACACACACATACACAAATTCATGGCATACTCAAGATTAAAAATACGCCCTATG
-ACAATTTAGGGAAGCCATCCACTAACCACTTACAGGTTACAGAAATCACATGCAGTCAGA
-TATAAAATACAGCATACAGGAGCTGTAGCTTTAGTTTTCAAATTGCTTTCTTTTGCACTT
-GAATGTCAAAATGCTTTTATCACAAAAGTATGATCTGAACAATTAAATGTCTACCACATT
-GGGACAGGAAATGCAAACATCCAAATGAGTCTGCACAGAGAATTAGGAGGGCAAACACAG
-CTGTTCAGGCAGACTACAACTGTTCAAGATAGAATTTGGGCTGAATTCCATGCTAAGACA
-TGCCTAGTCTCAGGATAAGGGCAAATGTTTAAGAATTTAATTGTTTCTCATCAGAAAGAA
-GTTACCTCTTTGGAGAACTGTTTCGTCCTCCTGTATTAACACGAAACAACATTCTCTACC
-TCAAAAATACTTTATATAAGACTTTGGTGTTTTCAAAGTCTCTCAAGTATCACTTCTCAC
-TGATCTGCAATGCCCTTGGCTTGATAAGCAAGCTGATAGGTAACTTTTTGTTGCCAGGTG
-CCCATACAGAATACCgtcatgcgttatttaatgacattctgagaaatgtgttaaacatca
-gagtgtttacacaaacctacatggtatggcatattacatacctagggtatggcctacggc
-tcctaggatacaaatgtgtaccgtaataaatactttaggcaattgtaacacaatggtatt
-tgtgtatctaaacgtagaaaaggtaatgaatgcactgttgatgttacgatgacatcacta
-ggccacagacatttttcagctctcttataatcttatggaaccactgtcctacatgtggtc
-tgtcattaattcaaactttgttatgtggtgcacgactgCATATACATCATAGAAAAGGAT
-AAGAAACTAAAATGATTTTTAAATGGTAAGCCCATTAAAATTGTTCACTTGCCAAAGCAA
-CTCTGCTTCCTCACTGCAAAACCAAATTTTCAGCTCAAAAGAAAACACAAATTGGGCTTT
-GATCCTGAGGTATACACATACAGAGTCACGGAGGTTTTCTGACAAAAACTACTCAACAGA
-TCCACAAGATTCAGCCCTTTGAGTGAGTATAATGAAGTCAACAAAAACAATTACCCCCAT
-TCCACCACATGTGACTCGTAATCCCAGTATTCTCGAGGTCTGTGTGTATTAACATCTGTG
-TAAACTCTGGCCCTGCTTGGCACGGGTCCCGACATGTCAGACAGGTTGGCGGACAAAGCT
-GGACTTGATGTTTGGAGATCTGGCAGTCACTGTGTTCAGAAGCAGCTGGGGGTAAGACCT
-TGTTTCAGACCTGTTTTCTTCAAACTGCAGAAACAAAATGCACAAAGTCCAAGGAATCAT
-TTACAGAAGGTATATGGGAAGGAAATAATCTTACAAATAATAATGGCCTGAAATATACCT
-CTGGCTCTCCTACCTACAGCCAATAAATATAGCTCAACTGTGTTAACCAGTGCTTCCTAT
-AACATGAGAAGAAAAATCCCAAGAAATACAGTAAACTGATATTTGCTTTAATCATATTTT
-GCCAAATATCCTGTTACCTCTGCAGGCAAAATTTGAATGATTTTTGTAAGACAGCCTGGA
-AGAGAAAAATGGCATTGAGGATAGATACATCAGCATTACCACTAGTTATATATTCTACAA
-AAGGTATTGGCAAGAAAAATACTTTCTTTTCAGCAGCTTTCTGTAACTTAAGTAGGGGTG
-CTAAAAGGTTCTAGAATGGCGGCAAAGCTAAGAGTACAACTTGCCATTCTGACTCATATT
-TGATGAAACCAGGAAGAGAATAAAGGCTTGTTCTCATACATCAAAGCTCCATGTCATCTT
-ATACCAATCCAAATCTTTTGGGGGAACCTTAAGGTAATAATCAGTAGAACCTTGATCACC
-ATTTGAAAGACACACTTGGTTTCATTAAATTTAAAAACAGAAATCAGTAATATTCTCTTT
-ATATTTAATACAGGAGCTTAAAAACTGGTATAAAACAGTAATACAGATTAGCTGAGCTAA
-TGCAAAATTTGACACCGGGGGAAAATAAGTAAGATGTTAGAAATATGCTATCAAATCAGG
-TTCCTTTCCAATGATGTCTTCCCTATCTCCTACAGCATGTGCTGATTCCCCTCATTATGC
-ATTTAGATGAAATTGTATTGAGTCTCCAGATTGTGATAACGTGAGAAGGATATAACACGT
-ATGCAAGTCTCCTGGCTGAGACAGCATAACTTCAATTTGTATGTGTGTATGTGttttaag
-acagggtcttattccactgcccagactggaatgcagtggtgtgatcatggctcactgaag
-cctcaacttcctggactccggtgattctttcacctcagcctcccaggtagctgagactac
-aggcacgcaccaccaccctcagctaattttctgtattttcagtagagacggtgtttcacc
-atgttgcccaggctggtcttgaactcccaggctcaagcaatcctcccacctcagcctccc
-aaagtgctgagatcacagatgtgagccaccgcacccagccATAACTTCAATTCAATTACC
-AGGAAACATTCAGAAAAAGAGGAAGTGTCTATTTAAAAAGGGGGAAGGGGTACTATACTT
-CTAAAACATGTCCACAGCATAAAAGACAAATGGAGGCTAAAGAGACATTGCATAAATGCA
-ATACTCTAGACTGTATCCCATACTGCAGGAGGTGGAGGGGGAtgctataaaaaacaatat
-cgacagaactggaattcagagggtattaaattattgtatcaatgtaaatttgtgaagttg
-gtacataatcacaatagttaagagaatatacctattcttttttttttttttttgagatgg
-agtttcgctcttgttgctcaggctggagtgcaatggcgtgatcttggctcaccacaacct
-ctgccgcctcccaggttcatgtgattctcctgcctcagcctcccgagtagctgggattac
-aggcatgcgccaccatgcctggctaattttgtatttttagtagagatagggtttctctat
-gttggtcaggctggtctcaaactcccgacctcaggtgatccgccctcctcggcctcccaa
-agtgctaggattacaggcgtgagccacctcgcccagcccaagaatatgtctattgttaag
-aaattttcctgaagtaattagaagtaaacagccatgatgcatataatctaccctaaaatg
-attcaggaaaaaaatgtgcccacacgtttacatgtgtatatatatagcacacatgactgc
-acactcacaaatgataaaacaagctgggtaaaatattacaataggtaaacgtgcgtaaag
-ggaatagagatgccctttgtactatttttatttactttttgttgaaatcttcttatttga
-aacaaggtctccctctgtaggccaggctagagtacagtggtctgatcacagctcactgca
-gccttgacctcccaggctcaatcaatcctcccacctctgcctcccaagtagttgggacca
-caggcgtgggctaccacagctggctaattaaataaattttttttttgtaaagatggggtt
-tccctatgttgcccaggctggtctcaaactcctgggttcaagtgatgctcccaccacagc
-ctcccaaagtactgtgattataggagtgatccaccatacccagctTGTTGAAACACtttt
-ttaaattgtggtaaaatatacataacataaactttatggccaggcacagtggctcacttt
-gggaggcttaagagggtggatcgcttgaacccaggagttcgcaaccagtctgggcaacat
-ggtaaaaccccatctctactgaaaatacaaaaaattagccaggtgtgatggtgtctgcct
-gcagtcccagctacttgggaggctgaggcaggagaatcaccagagaccaggaagtcgagg
-ctacagtgagctgtgattgcaccactgcactccagcctgggtgacaggagagagacctca
-tctaaaaaaaataaaaactgccattttatccacatttaaacctaaagctcagttgcatta
-agtatattcacattcttgtgcagtaatcaccagatcatccatttctacaaatttttacca
-tcccaaatgaaaactatgtatccactaaacactaattttccctcccccaactctttgcaa
-ccactattctattttctgcctgagctggctattctaggaacctcatataagtggaatcag
-acaatatttgtcctttgttttgtttatttaatttagcataatgtcttcaaggctgatcca
-tgttgtagcatgtgttagaattccaatccttttaaaggctgaatgatattgcactgtgta
-tatatatacacacacacacacacacacacacacaccacattttgcttatccatttatctg
-ctgatggacacttgagttgcttccacagcttggctattgtaaataatgctgctatgaaca
-taggtgtacaaacatctgtttgagacctcgctttcaaatcttttatgtatatatccagaa
-gtggaactgctgaaccatgtagtaattctatgttaattttttgaagaaccagcatattgt
-ttcaacaagctgggcacggtggctcactcctatacagcaactgtatcattttacactccc
-aggaacagtgcaaaggctacaacttctctacatccttactaacacttgttattttctgtt
-ttttGCTTGtttttatagagacaggggtcttgcttatgcccaggctggtcttgagctcct
-ggcctcaagggatcctcccacctcggcctcccaaagtgctCTCAAAATAGACTGTGCCTG
-GCCTATTTTTTGGTTTTCTTTTCTTCTTCTTCTTttttttttttcagtaacagccctcct
-aatgagtatgaagttgtatctcattgactgtgattttaatttgcatttccctaatgatta
-atgatgttgagcatctttttacatgcttattggccatttgtatatttgttttggagaatg
-tctattcaaagctgttgtccattttttgattgggttgttttgtttgttGACGATGCATTT
-GTTAACTATACTGTTTTTTTGTTGCTTACAAGCTGCTCATCTTTCCAAGGTAAGCTGTAA
-CTTAGCTACCACACCCAAAGAGAAGCCAGAAGAGATACCTCCTTATGCCCATGGTGTCGG
-CAGCTAAAGGCTTTCAGAAGAATAGCAAGACTGGGATGGAGATTAATTCTCTATTCCTTA
-ACCGTGACAAACACAATTAATGACATTCCACTCCAAATATATGAGATCAAAAGATTCACA
-TGCTGACTTATGAATTCTCCCACCCAAAAAACTGCTGTAACTTGCCTCTGTTCAACTCAA
-ACCTTCTGAGGTTCCATAAATGTACTAAATGACCAGAAAACAACAAAGTAATTCAAGTAC
-CAAAAGTCTTTAAAATTATTTCTATTTCTTTGATTTTGTAAAACCTGGGTGACATTAATC
-TATCTTCACTTAATATCAGTTAAAACTGTAAACGCACACACACACAAACACATCAAACAT
-GCAAAAACCAGATGTTTTCTTGTAATTTTTCTTCTTCCCAAAGAAATAAGGTCATCTATG
-TTGTAGGATTGGTGACTCTGTGACTACTATGCCTGCCTTGACAGCAATGAAAGACACTAG
-GAAAACCGTAGAGAAAGGTGTAGGTGTGAATATGGCCAAAATAGTAGAAACAGCAGCATG
-AACCCAACAGAAATGCTGTCCCCAGAAATTTATTACTTTTAATATACTAAACTTTTAAAT
-TCTCAGCCTCTCCTCTGACAGGAAACAGTATCTTTCTCTACATAACCTTTACAGCCACTT
-TACTCTTCTGGTTAACATTTTATACGTGTAAGACAGCCTTCGTCTGTGGATCTCAAAGCC
-CTTTTCCTATGCTTAAAAGTGATCTCTCTGTTGGGCTTTTCCCAGCTTTGGTTCATCACT
-TATAAAACCTGTCTAACTGTGCTTGCAGACTGAAGGGAAGATGAAGTGAGATGATCTTCC
-AGAAAGGGCTTAGAAACATGAAATGCATGTAAATTTGTATTAAGTAATTACTATCCCCTA
-GCTCCTTAGTGAAAGCTAATAAGCAGAAACCTATCTTTACAGGCTGGAACCTTCATTCTT
-TAAAATACAAAAATTATAGTAGCCGTGGTTAATTCCCGGCCACTGAGGGCTAACTCCCAA
-GTATACATGACATTACAAAATGAGTCCTCATTTCTCCCTGGAAACCATCTGACATATGGA
-GAATAGCCAACTCCTATTACTAGTCATGTACATTCTCATCACCCAGTCTTCTTCTGCTGT
-TTCAAGGCCCTGGCATCCTCTGTGAGGAGTGGGAAAAGACTAATAACTAATGAAACTCTT
-GAGATTCTCCAGTACTTGTCTGAATGACCCTTGAAGCTTTGGGGCTCATCAACTGGGACC
-TAATTTATGAACTAGCAGATCTGATTCTCCACTGGGAAGACAACAAGCTAACTATTTTTG
-CAGTACCCCCAAAGAGGTGCTTCACCTTACTGTCACGCATACCAAATAATCTGCTTATAG
-TAAGAAAGGTATTCACATGAATTTCAAATGGCTGGCCTTCATTAATTATACGGGAAAATA
-AAACAGAGGATTCTTCAACTGTGACTCTGTAATCTCAGATAGATAAAAGGGTACTAAGAG
-ATTGGGGGTTAAGGGATGGTGATAAAAAGGGGATGTGAagcccagtgtggtggctcatac
-ctataatcccagcactctggcaggatcacttgagcccaggagtttgagaccaccctgggc
-aacacagcgagacctcctctctacaaataacataaaaatgagctgggtgtagtggagtac
-aactgtggtcccaggtacttggtaggctgagatggaaggatcacttgagcctgggaggtc
-aaggttgcagtgagccatgatctcaccactgcactccaacctgggtgacagagcaagacc
-ctgtctcaaaaacaaacaaacaaacaaacaaaaaacaaaAACAAGAGGGGATGTGAAAAG
-ACAGAAAAGGGAGGTCAAAGACCAAATATTATCATTATTATTTTTTTGAGACAGgagaca
-gggtcttgcgctgtcacccaggctggagtgcagtggtgcaatctcgctcggctcactgaa
-acctccacctcatctcctgggcttgagcaatcctcccacctcagcctcctgagtagttgg
-gactatagctatgcgccatcaggcccagctaatatttgtattttttgtagagacaaggtt
-ttgtcatgatgcccaggctggtctcaaactcctggactcaagtgatccaccagcctcagc
-ctcccgaagtgctgagattacaggtgtgagccaccatgcccaaccAAGATAAACATTATC
-TTATTTAGAAATAGTATTTCACTTATACCTCTGCAAATGCATATGTATATCACATGTAAG
-CTAACAGGAAGAAAACACACAGCCTACATTTCTCAATTTTTGGTTTGATTCTTCCCTACA
-TTCCTGATTTTGTCCATCCCTTAAATAGAtaaccatctactatgaaaaagtactatccta
-ggccttaggaatataagtgagcaaggcagaACAGGGGTGAGACAAgtatgccattgaaga
-ttttacctatggactaagggtaacagaaattcattgaaaagttttaagcagaaaagtgac
-ccatacatattgtttttaaaatttttactctggctgagtgtgggacaggacttagggaga
-aggctgttaacagtagcacacgtgagagaaatgatgacctaaggtggtggcatgtggaga
-tcagtggactaatatgaggaacaaaatttatggtgtaaaatcaatagctctgagtgaact
-ggaaaatgctgtatgaagtgggaggtgactcttggatttcttgcttgacagactgttggt
-gccattcatggagataagagtgcacaagataggttttggacttaaggttaaaatggcttt
-gaatcattcaaacgaagattctgaataggcagttagatattacaagtctggaactaagag
-tttctcagctttaagtatctaactcttccaacaactctacgaggcaagcattagtttctc
-taatctacaaataagaacagcctaagttcagtagcttgaccaagaatatccaatacagtt
-acagctgggattcaaagacagtgagttggcctccaaggttcaagtcttctcactCCTACA
-GAACACAATCACTTTCTACTGCACATTCACACACACACACACCAGTCTTCAAATCTTAAT
-ttctcaattggaccctaagttctacaaagttaagaaccatgtttaatttacctttttaat
-ttatagtacctagcctaaggcttgcattttgtagcacgttcagtaaacactatttggtga
-tcaaattaatCTTGGTTTATTTTTTAAAAATGAAATGAAAATGAAGTTGCATCCAAAGTA
-TAGGGTGTTCCTAAATACTTCAGGTCATCTGGTACGCAACTAGGAGAACTGGAAAACCAA
-GTCAAAGGTTCTTGAGTAATTGTTCCCTTCCCTCTCTCTCTTTCCCAATACTACAGCTTC
-TATTAAATCACAGGACTACAACTAGGATTTGTCTTTTTCCCCTCGATAATTCAAATTAAG
-AGAATACTGAAGAAACTTGATTTTACCAATTTTTATAGCAGCTTATTTGGAAGATGGAAA
-AAGTGCCTGAGTCCTAGATATTTGGAAGATCAATTCTCCTCTCCACTGTTCATAATACTA
-GTATATCTTAAGGCAATCTAACAAAATGCACTGCCTTTCTTATTAAGTTCCATTTTAAAT
-TGTCTTACTTAGTGCTTACTGTTCTCATGTAATTGCATAAAAGGAGGTGTAACTTTAGTG
-GCTAACCATTTCAGACCACTACATCTACCTTAACACCGTCAGAATGACTTTGAAGACATG
-GCTAGGTCTTGTATGCTCAACGTTTAGCCTAACAGAAGCCAATTAATCAGCTACGAAAAA
-AGTATCATGTCAATGAATTTTTCCCGACTGAAGTAAGATCACATCGAAGCCAACTGCATG
-GGTCTGCATGACCTATTCTTTAATAAAGTATAAGTAAATAAAAAGAAAATGCCATTAAAC
-CATAAGGAAAAATTGTCCATTGCCAAAATCATAAGTTTACTGATATACACTGAATACAGC
-AGAATTAATTTCAATAAAAACTCCTCTTGCCCTTAGCTAGTCCCTCCTTCTAATCTCTTA
-TGTTCAGTTGTTATTTTTCAATTTGGCAACTAAAAAGAAAACTAGAGGCTTAGTAACAGT
-CCAATACCAGAAAACTATACAAACAAGTTTGCTTAGTCATTTCTGCTAATGTATTTTTAT
-TGATGAATTTCCTAGTATCAGAAATGGAAAAGATCATTCTAGAACTTTAAGTCAATTTTT
-GAACTGTAATATAATTAGTTCTTTTTAACCCTAATGTTTATTAGTCTCCATCTTAAAAGG
-AAAAAAAAAATCTCCTTCTCATCCCTAAATGAACCATAGCAAATGAACAAGATCTCATCA
-TCATCCCGACAGGACAAAGATTTCTATAGCAAAGAATGAGGAATGTGCTTAGATTGCACT
-GACTGCATGGTTTAGGACTGCTTGTTTAGAGGAAAAGCAGCTATACAGGAAGACACCTTT
-TATGCACTGCTGCAGAGAATGAACTCTTTTTCCAAGCAATCAGGCAACATAAACTGGTAA
-GAGACAAACAAGACTTGTGGAACTCAGCGAGACCTTAAATATGTATACTTTTCTACCTTG
-CTACAGAAGCAAAGAGAAAAATTCAGTCAAACTTGCCCATTTCCCTTTACAAAAGGGGCA
-CTGATTAGAAGGCCAACTTAATACAAAAAAGCACAAGTAGCTAATGTTACCTGAATTACT
-TATTTCAAATGTCCATACTTAACCTTAATTTCTTTCTTCCTTTCCAATCAAGAGCAGAAT
-GCTCATACATCAAGcatttactgaacgtttactatgtaccaggaaatgtgtgcctgactg
-ccagaaaggcattctttctcttggtcctGGAGAAAGTATCTCTGCCCTCAGACAAAGAAA
-ACAGACCATTACAATCTCAAGTGATCAGTGCTTGAAACAATTAAGTCATGGTGGTGTACA
-GACGTTGAAGGGTATTTAAACTATCACCAACCCAtcattcattcaacaaatatttatgga
-gtacctaAAATGGGGAAAAACTGTAAGAGAAAAAAAAAACTGCACTTAAAGTACGCACAG
-GAATTATTCAGATGGAAAACATTAAAACAAGAAATTGCAAAGCGTAACACTTTAAAGCAA
-GTTAAGAATTTTAAAGACCTATAATTTTGCACCCTAAAATGACCAAAGGCTGGCACATTT
-TGTTATCTTCTATAAGAAACACATCATTGGATGCCACATGCAACGTGGCATCAGGTGTAA
-AAAAGCACCTGATGTGCTTTTTTTGCACATCAGGTCAGCAACCTTTTTATATCTGATTTG
-GAGACTATTAGTTTACTCGACTGTTACCATTTTGTGCTTAAAACAAACAGTATCATTAAT
-TCACAAGCTTTGGAATTCTTTCTCTTTATTTTCTTTTCTCTACTTCCAACACTAATCAGT
-TCCTtgttgcccaagctggagtgcagtggcacaatcgtagctcactgccacttcaaattc
-ctgggctcaagtaatcctcccacctcagcctcccaagtaactgaggctacaggcatgtgt
-caccacacctggcCCACTCATCTTTAAATAAGACAGAGAAGTAATTATAGCCAAAAGGGA
-ATAGAAAATGCAAACCCAGAGATATAAGCAAGCAAGGAAGCCTGGAAAGCCTTTGTTGAT
-CCTGAAAATTAGAATTTTGTTCTCACATAAACCAAAGCCCAGGGCTCTCACAAGACAAAA
-AGTCTAATAGGAGGCCCTCTTCATAAGGTGGGACTTCAGAGGCATACTTCCTAATGGTGA
-GAGTGACTAGGGAGTGGAAGATCCAGGGAGGAATTAAAGCCCTACTGAAGGGAATATCAT
-ATCTTAAGCTTGTTTTAAGGTGGTCTCTGGATTAGTGCCCATGCATACCTGATATAAGCA
-AGCTCTCCATGGAGGAAAGTACCTTACTGTGGGCCTCAAATGATCACTACAAATATCTAt
-ttttatttttattattttttatttttttgagacagagtctcgctctgtcacccaggctgg
-agtacagtggcctgatctcagctcactgcaagctctgcttcctgggttcacgccattctc
-ctgcctcagcctcccgagtagctgggactacaggagtccgccaccacgcccggctaattt
-tttttttttttttttttttaagtaaagacggggtttcaccgtgttagccaggacggtctc
-gatctcctgacctcgtgatccacccgccttggcctcccaaagtgctgggattacaggtgt
-gagccaccgcacccagccAATTATTTATTTTTAAATACAATGTCCTAGCAGATCTCAAAA
-AACAAGAGGAAAAATATAGTGAAATCGTTGGATATACttttttttttttttttttttgcc
-acaaagtcttgttctgccacccaggttagagtgcagtggcacgatctcagttcattgcaa
-cctctgcctcccaggttcaagtgattctcctgcctcagcctccagagtagctgggactac
-aggtgcatgccaccatgcccggctaatttttgtatttttagtagtgagggggttttgcca
-tgttttggccaggctggtcttgaacttctgacctcaagtgacccgcccatcttggcctcc
-caaagtgctgtgattataggcgtaagccaccgtgcccagccAGTTTGATATACTTTTAAT
-TGGTACTAGCAGAAAAGAGAATGGGATAAAGGCAGTAACTGAAGACAGTTGAAAATATCC
-CAGAAGCAATCAGACACAATCAAATTCCAGAAGCAAACAATTTccaaacaagatcaataa
-aaagaaatccaaaaccaaacatataattacaaaatagcaggaaaaaacaaagatgagttg
-ggtgtaatggcacaggcctatagtcccagctatttgggaggctgatacaggaagattgct
-tgtgcccaggagttggaggccagcctgggcaaaacagcaagaccttgtctcaaacaaaaa
-caaaaaactaaagacaagcaagtacagaaaaaggcagattatattcaaagagcaacatta
-gaacagctgatttttcaaaaccaacaatgaagccaagtagtttaatacctgcagtgtgct
-gaaaaaaataaatagccgccaaattaaaattctgttatcaagcaaatgtctctaaagaaa
-aaagaaaaataatcccattttggaaggtctgagttgaaagaaaaaataaagagcaaaaaa
-gaggaaaatttacagacagctccaaacaaacactgattatacaaaagaataacaatacct
-tgaggagctttaaaacatagaatacataacaataaaaacacagtgtattgaggagatttc
-aaagtattctttctaaaggtcttttattatatgaaaagaagataaaattataatatcagg
-ttttgctaagttatagctgcaagtcacaagatgtatgacaactaattacagaataaaaat
-agcatatatttccaaaccagaaagagggaaaagtaaaatcataaaaagaatccaaaagaa
-tgttaagaagggagaagaaaaaaatctagaacataagaagcataggggaagaaagttgaa
-ttggaatatgattaattatattaaatataagtggaataaattatccaggtaaaagacaaa
-gactatcatatcagactggattaaaaaagaaatccaaatgaaccagaataatccaaacaa
-ttctgaaaaataataaagctggaagaattatactaactgatcttaaacttattacaaagc
-tatagttgtcaaaacagtgtattggcaaaaggataatacatagatcaagggaacagaata
-aagagtacagaaatacactcacacaaacaaggccaattaatttttgacaaaggtacaaag
-gcagttcaatggagaaaggacatatatacatatatatataaatatattatgtattttttt
-cgagatagggtctgcctctggtgcccacgctggagtgcaggggcatgatctcaactcact
-gcaacctccgcctcctgggttcaagtgattctcctgcctcagcctccaaagtagctagga
-ccacaggagtgtgtcactatgccctgctaatttttgtatttttagtagagacagggtttc
-accatattgcctaggctggtctcaaatttctgagctcaactgatccacctgccttggcct
-cccaaagtgctgggattacaggcataataatcttttctataaattgttttggaagacttg
-gagatcaatatgcaaaatcataaactttaatctaaatctcacactttatataaagataat
-tcataatgaatcacagatatcaatgtaaaacttgggtcagatgcggtggctcatgactgt
-ataatcccaggctgggtgacaaggcaagactctacctctgggggggaaaaaaaaagatat
-aaatgtaaaattatcaaaccttcttgcaaccaggggttaggcagagtttgaagacatgac
-actaaaagcatgggctgtaaaactgataaactgaacttcatcaacgttaaaatatttctg
-ctctgtgaaagacactattaagaaaataagccagacacaagaagaatgtatttgcaaatc
-acaaatcgaataaagaacttgtatctgtaacattaaaaaactcaataagaaaacagctca
-atttaaaaatgggcaaaagacgtgaacatacacaccacaaaagaagatatacacataagt
-atatgaaaagatacacaacactgccagacagcagggaaaatgaaattaaatcatacaact
-accactacagatttattaaaatggctaaaatttaaaaaaacagaaaacaaaactatacca
-aaagctggtgtggatgcagagtaacagtaactaatacattcctggtaggaatgcaaaatg
-gttttggaaaacagtttggcagtttcttatagagttaaacatgtacttaagcatacaacc
-agcattcccactcctaggtatttactcaagagaaacggaaacccgtatctacacaaaaac
-ttatacacaaacatttaaggcagctttattcataattgtgaaaaaacagaaacaaccaag
-gtgtccaacagttacatgaacaaacaaatggtttgccatgtgatgcttagcaataaaaag
-gaacaaattactgatttgtgcaacaaaatggatgaatcGtttttctttttttggtagaga
-cagggtctcgctttgttgcccaggctggtctcaaacgtctagcctcaagtaatcctttgg
-cttcagtctcccaaagtgctaggattacaggtgtgagctgctacacctgaccaacatggt
-gaatcttaaaagtgaagaagccagaaacaaaagcctacatattgtatacttccatttata
-tcaggggtccccaatccccgggccatgggcctgtaccagttcatggcctgttaggaacca
-ggctacacagcaggaggtgagcagcgggagtcactcgcattactgcccgagctctgcctc
-ctgtcccatcagcaacagcattagattctcataggagaaccctattgtgaactgcacatg
-tgaggaatctaggAGGTGGAGCTCAATTTTTCTCCTTTAAGGAAAGGAAATAAGTAAGCA
-TGGAAAGAGAGCCTAAATTTCTCCCTTTCCATGCTTATTCATTACAAGGGTATTCCTAAG
-TCCAATGGGCTtggaaagggagaaatagcaactctacagtagaaaaacctggcagacttt
-actgaaatatcactagtgttaagtcactttgacatcatatgcccctgatataatgtgatg
-agaagggcacttcacctctgtggtagtcttctcaaaaatccataaccacaatttaatctt
-gagaaaacatcaaacctgtattgaaggacattctataacatacatcaccagtcttcttca
-aaagtttccaagtaatgaaaattaaagacagactaagaagcttcacagactggaggatac
-taaggagacatgatgactaaattaatgtggtatcctggactggctccttgaacagaaaaa
-ggatacaactggtaaaatccaaacaaagcctgtagtttagttaatagtattataccgatg
-ttaatttcttaattattttatttatttatttatttttagagatggggtctcactttgtca
-cccaggctggagtgcaatggtgtgatcctagctctcccagttcacagcagcctcaaactc
-ctgggctcaagcgatcctcctgccccagcctcctaagtagctaggactacaggcacatgc
-caccatgcccacctaacttctgagaaccaggttggtctcaaacgcctggcctcaagcaat
-cctccccaccacggcctccagagttactgggataacaggtgtgagccaccatgactggcc
-cagtttcttagtgttgatgacatatcacggttatggcaagatgtgaacattaggatatac
-tgagggaagcatatatggagattctatctgtaacttctgtaaacctaaaattttcaacat
-tacaagttAAATACTGCCAATATTTAACTTGAAATGCTAAAGAGGATGAGAtgctagaga
-agatgaggaaaaactgaaactcatacattgctagtgtgaacgcaaaatagtactgtatag
-ccattctagaaaacagtttggcaacttctttataaataagttaaatgtacatttttcata
-tgacccagcaatccaactcacagttatttaccctagaaaaatgaaaacttaggtccacaa
-aagcctataatgttatgttcacagcaactgtattcataatcaccaaagaatgaaaaccaa
-aatgtccttcaaggagtgaatggataaaaataactatagtctatccataaatggaatact
-actcagtaataaaaaggaactaaccatttacacacacaataactttgatgaatctcagag
-gcagtatgctgaatgaaataagccagtctcaaaatattacataatgtttgatttcattta
-tatgacattcacgaaaagataaaactgtagtgaggttgggcacggtggctcacgcctgta
-atcccagcactttgggaggccgaagcggatggatcacaaggtcaggagatcgagaccatc
-ctggctaacacggtgaaaccccgtctctactaaaaatataaaaaattagccgggagcggt
-ggtgggcgcctgtagtcccaactactcgggaggctgagcttgcagtgagctgagatcacg
-ccaatgcactccagcctgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaaa
-aaaaactgtagtaactcagaacagaacagtggttgctagagattaggggtgggaggctag
-gtatgttaccaagggtaacatgcagaaggtgatataactattctatgtcccagttgtgat
-ggtagttacttgaatctatgtatgtattaaaattcatagaacagtatacacaaaaaggag
-tcaattttactgtgtattaatttaaaaaaaaATTTAAAAAAAGGAAAAAAATTCTATCAC
-ATGCTGTCTAAAAGAGATACATCTAggccgggtgcagctgctcacgcctgtaatcccagc
-actttgggaggctgaggtgggcagatcacctgaggtcaggagctcaaaaccaccctggcc
-agtacagtgaaacccatctctactaaaaatacaaaaatgagctgggtgtggtggtgcgtg
-cctgtagtcccagctgctcttagaggctgaggcaggggaatcgcttgaaactctcgagag
-gcgaaggttgtagcaagataacgccattgcattccagcctgggagacagagggaggctcc
-ttctcaaaaaaaaaaaaaaaaaaaTTAATAAACAAATAAATAAAAGAGATACATCTaggc
-caggtgtggtggctcacttgaggtcaggagtttgagaccagcctggccaacacagcgaaa
-cctcatctctacttaaaaacaacaacaacaacaaaacacaaaaattagctgggtgtggtg
-gcgggtgcctataatcccagctactcaggaggctgaggctggagaatcgcttgaacctag
-gaggtggaggttgcagtgggcactccagcatgggtgacggagactccatctcaaaaaaaa
-aaaaaaaaaaaaaaGAGATACATCTAAAACATGGGGTATATATTATAtacacgatgtata
-catgcactgaaacatcacaatatatcccataaatatgtacaattatgtatcaattagaaa
-tTAAGAGCTGGGCACAGCTCAGGGGtccctgcactttgggagactgaagaggaaagatgg
-cttgaggctgagttcgtgaccagcctgggcaacacagcaagactaccatctctacagaaa
-aatttaaaagttagctaagtatggtgcatgcacctgtgtcctagctactcagaaggctga
-agtgatcatgtgaacctaggagtttgaggcttcagtgagctatgatcacagtgttgcact
-ccaacctggctgacagacactctgcctcaaaaTCAATCAATCaataaattttaaataaaa
-aaaaaCATAGGCTATAGAGAGTTTGTTCataaaaatacgatatttcaaaacgtgggatac
-aattaaagcaggacttagaaatttataaacttaggccaggtgtggttgctcatgcctgta
-atcccagcactttgggaggctgaggtgagtggattacttgaatctaggagttcgagacca
-gcctgggcaacatggcgagacctcgcctctataaaaataaaaattTTAAAAATCggctgg
-gcgcagtggctcacgcctgtaatcccagcactgtgggaggctgaggcgggcggatcacga
-ggtcagaagatcgagaccaccctggctaacatggtgaaaccccgtctctactaaaaatac
-aaaaattagctgggcatggtggcgggcgcctgtaatcccagctactcaggaggctgaggc
-aagagaatggcgtgaacccgggaggcagagcttgcagtgagccgagatcgtgccactgca
-ctccagcctgggcgacagagcgagactccatctcaaaaaaaaaaaaaaaaagaaaaaaaa
-aaTAATAATAATTAggctgtgcacagtggctaatgcctgtaatcccaacactttgggagg
-ctgaggccaaggtgtgaggattgcttgagctcaggagtttggagaccagcctaggcaaca
-tagtgagaccctgtctctatttttttaacttaaaactattaaaaaaaaaaaaaaaaaaaa
-aaagccaggtgtggtggcatgcacctgtggtccaactattcaggagtctgagatgggagg
-aacacttgagcctaggaggtggaggctgcagtgagctgtgattatgccactgcactctag
-cctgggcgacatagcaaggccctgattcgaaaataaaaaTTCATAAACTTGAACttagaa
-aagcaaactaaaaattaagaacttacacatatctcaataaatttgaaaacagaagcccag
-agaaactagaaggaaaaaaacgggaaaagcagcaatcaaagaaatatgaaacaaagaGGA
-TCCACAATACCAATTGAGTCTTTAAAAATGCTCGTgctgagcccgtggctcatgcctgta
-atcccaacactttgaaaggccaaggcaaaggattgtctgagtccaggagtttgagatcag
-cctgggcaacagagtgcaacccccaatctctacaaaaataatttaaaaattaggccaggc
-atggtggctcatgactgtaatcccaatacttaggaaggctgaagcgggaagactgcttga
-gcccaggagtttgagaccagcctgggcaatacagtgagactccatctcaaaaaaattgtt
-tttaataataaaaacaatggaaaaaattagctgagtcccagctactcaggaggctaaggc
-aggaagatcacttgagcccaggagtttgaggctgcagtgagctatgatcatgtcactgca
-ctctagccagggcgacagagaaagaccctgcctcTGCAGGTGGGGGGGAAGAAATTAAAA
-ATGTAAGTGTGCTTGATTTAAGAAAAAAAAAAAGAAGggccaggtgtgatggctcatacc
-tgtaatcccagcactttgggaggctgaagcaggcggatcacaaggtcaggagctcgagac
-cagtctggccaatatggtgaaaccccatctctactaaaaatataaaaaattagctgggtg
-tggtgccacacgcctgtagtcccagcaggaggataaggcaggagaatcgcttgaacccgg
-gaggcggcagaggttgcagtgagctgagatcatgccactgcactccagcctggcgacagt
-gagactctgtctcaaaaaaagaaagaaagaatgagagagagagagagaaagagagagaga
-cagacagagagagagagagagagagagagagagagagagagagagagaATGAATATTAGG
-GTAAATGTCCAATATCAAGAATGGAAATGAGGGAGTGAGGGATGAATTAGGGTAAATGTc
-cagtatcaagaatggaaatgatacatcactacagatcctacagatggtaaaaagataaga
-caatatcacgaacaactttgtgcccacaaacttgaaattcccagaagaaaaataatttat
-caaaactgatacaagaTCCCAGTCTGATTCTCAGGGAGAAAAAACAAAAACTGACACAAA
-AAATGAAAACCATAAATAGTCCCATAACCAATAAATTCAATCAGTATTGTTTCAACCTGT
-TCTATTCTAATGTCTTTGAACTGCACAGATTAACATTTTCAAAACATTTGTTTAAACTGA
-CTGAACTTGCTTCCCACTCCTCTCCAGGTCTCTGTGCTTTTATACATTGATTATGCCTTC
-CAATAGTGCTTGCTAGGGGAAATCCTACTCACCCTTCAAGAATCAGCAAACTTTACATCC
-ACTATGAAGCACACTATGAAGCATTCCCATCTTTCTCCAAAACAGGCCAAGTACCTCTTC
-TACAGGGCCAAAGCAACCCCATATACTCTCTGACATTGTCACACTGAATGTGTTTTGTTT
-ACATACACCTCTCTCCTCAGATTATGAATTCAAGTACTTGGACTTTGATTTATTTCTCTT
-GGTGGATGCCCCGTgtttcaccacactgcccaggctggtctcaaactcctgacctcaggt
-gatccaactgtttcagcctcccaaagtgctagggttacaggcatgagccactgtgcccgg
-ccTGTGGTTTTTAAAATGCTCCTCAGTCTTACCTATAAATGTTATTGCATCCATCCTTTT
-TAAACCAGGGGAAAAAGGTTTCCTACTATCACTTACCAAAGAGATGTGAAACTAGTCAGT
-ATGGGTGAATGATGTTTCTTGGAGATTTTATGAGGTTCCACGCTGCATGATTTACCATGT
-GATGAGCACACTGCTTGACAAGCCTTGATAGAGCTACAAAAACAGTTCAGTACTCCGTTA
-CTGAAAGGATCTTGGATTTAAAAGACATCATAAGGTTGCAGAAAGAATAAGTACACTAGA
-ACCACTACAACCTACATCTGATGTTGGATATGTTATTTAACCTACCTGATTAAAGTGAGA
-AAACTGCAGAATATAAGGATTATCACCCTTCCCCCACTCCCTTCTTTACTGCCATGGTGG
-CAGGTTACATAGCAGACAACCATCATCTCCGCAGGTGATCAATAACCAACAGCTAATAAG
-GTAGGTTGTCCTAAAACTGACAAAAATAGAATAGGCTGGAAGTAAGGGCAGTAAAAACTG
-GTTGCCTTTCAATTCTGAAGATATTATGTGAATGCCTATGTCAGTCACTGATTCTTGGGA
-TTTATCAtttttgtgtgtgtaacagggtcttgctctgtcacccagggtgggtgactgcag
-ccttgacctcccaggctcaagcaatcctcctccttcagcttccttagtagctgggaccat
-aggcatacactactgtcccctgctaattaaattttttcttttttttctttctttcttttg
-tttttttttctgagatgtcttttgtttttgttctgaggtcttgttatgttacccaggctg
-gtctggaagtcctaagctcaagcaatcctcctaccttggcctcccaacgtgctgggatta
-taggcatgagccaccatgcccagccAGATTTATCACTGTTAAACCAGCAAGTCCATGACC
-TAAGTAATGTCTTTCTCATTTTACAGAAGGCAAAACTGCATAACCTTCCCAATGTCAGAG
-GTAGTGATTGGAAAACATTCGTCTAGATTCACAGCCTATTCTTCTGTTCTACAGCAAGGG
-ACTGTAAACTGGTGACCACAAACACAGCCAACCCCCATACccatggtttcagttacccgc
-agtcaactgcagtctgaaaatattaaatggaaaattccagaaataaataagtcataagtt
-ttattttccatgtttgtttttagagacgaggattcactcagtcacccaggctggagtgca
-gtggtgcaaccgtagctcactgtagcagcctctacctcccatctcagcctcccttgtagc
-tgggaccacgggcatgcaccaccactcctggctattttttttttttttttgtaaagaagg
-tttctcactatgttgcccgggctagtcttgaactcctgggctcaagcaatcctcccgcct
-taccctcccaaagtgctgggattacaggcatgagccattgcacccagccatgttttaaat
-tgtacatggttctgagtaatgtgatgaaatcttgcaccatctagtaccatccagccctgg
-atgtgaatcatccctttgtccagctgtatatgccacctgctcattagtcacttggtagcc
-ttcttggttacttgaatgttgcagtattgcagtgcttgtcttcaagttacccttatttta
-cttaagaaatgccccaaagtgcaagagtagcgatgctgagaatctggaaatgccaatgtg
-aagctgtaaagtgcttcctttaagtaaaaaggtaaaagttcttgacttaatatggaaaaa
-aaaatcatatgtggaaattgctaagatctatggtaagaacaaatcttctatcagtgataa
-tgtgaagagggaaaaataaattcacatttgttttgctgttgtacctcaaactgcaaaagt
-tatgaccgcagtatgtgataaatgcttagttaaaatggaaaaggcattaaatttgtgggt
-agaagacatcaacagaaaactgtgttccaactgatgataatcaggtttggtattatctgt
-ggtttcaggcatccactggggatcttggaatatatttcccacagatggctgggaacagga
-ctactCTGTGTGTATATCTCCTATTTGGCTCACATATTACTTTTAAAAattgagataaaa
-tccatgtaacataaaactcatcattttagggtacaatcagtaccctaaaatggtgtgttt
-tcgtatattcacaatgctgtggaaccatcaccactatctgattccagaacacttcatcgc
-cccaaaaagaaacccagtacctcagaggattaactcccaatagcctcttcctacaatcct
-ctggcaaccaataatctgctttctgtcttcatgtatttgcctattatggacatttcacat
-aaatggaatcatgcaatatgtggcctcttccacttagcaaaatgtctacaagtttatcca
-cgttgttgcaagtatcagtaattcatttccttttacagctgaattcactgtataaataca
-tcacattctggttgtccattcactgacagatatttggactgtctccactttttggctact
-atgaaataatgtcgctaggtgcatatgtgtacaagtttttCACtttttttcctttttttt
-tttttttttagagtcaggaccttgctctgtcacccaggctggagtgcaatggcatgatca
-tagttcacttcactgcagcctcacactcctgagctcaagtgatcctcctacctcagtctt
-ccaagtagctgggactatgggtgtgcgccaccacgcccagttaattttctgcatttttag
-tagagacagggtttcgccatgttgcccaggctggtctcgaactcctggattcaagcgatc
-atcccatcttagccttccaaagtgttgggactacagtatgagccacagtgcccagccTTC
-ACACTGTTTTTAAAAAGTAAATCAGGggccaggcatagtggctcacacctgtaaccccac
-cagtttgggaggctgaggcaggcggattacctgaggtcaggagttcatgacagccttggc
-caacatgatgaaaccccatttgtactaaaaatacaaaattagccaggtgtggtggtgggc
-acctgtaatctcagctacttgggagcctgagacaggagaatcacttgaacctgggaggca
-gaggttacagtgagctgagatcgcgccattgcactccagcctgggtgaaaagagtgaaat
-tccgtctcaaaaaacaaaagaaaaGGTATTAAGGTGAATTATGTATTAAAATTTTTCACA
-ATTAATATTTTTCAAAGTGACAGTTACCAAAATTAAAAAAAAATTTAACTTTCTATTTCT
-TAAAAGAAATAAAGCAGGAGGGAGGGCAGGTAGGTCTGTCTGTCTGGTAACAATGACTCT
-TCATTCCTGCACTGACAAAAACCTGCTGGATATGCTAAGCTGTGACTGTCCAACAACTGG
-CTCTTTTAACAGACACCCAATGGAGATACCACACGTAAACCTGGACAACTCTTCATTTAC
-CTTATTGACTCGACTCCTGAAGGCATTTGAGCAATCAATCCCTGGTTTATACTAAATATA
-TAAATTTACAAATAATAAGATGGGGGAACTCTTATTTAGACTACACAAATTTTGGAACTG
-AAAATGCAGCTCAACAATGAGATCAGTGGCCATGAACTCTCTGGTAAATGTATATAAAGC
-AGCATGTACATGTACATTTTTTTTTGAAGAAAAAAATTATTACAGGCTCAGGAAATCTGT
-AAACTCCAGCAAAATTAATAATTCCTGAGTTAGACAAACAGAAACTCATCTAAGAAGGCT
-AACTTGGTGATTTACATAAATATTAAAAAATTAAACTGCTCAAACTAAGTATATGCCATT
-CTTTCCTGAAGGAAGACAAGAAGACAATGTATCCTAGGCTTCAGAGTATGAGACCCAAGC
-TTGATGAATGATTAACAAAATGTCAGCCTCAGAAAAGATACAGTAGCATTCAGAGTTAGT
-CAGGTAGAGATAACAGTTTTACAAAAGGGAACTTTACTTCTGCCTCACATTACTGCTTAG
-AAAATAAGAACTTGAATTTCTTCACTACTGTCCAACCTTAAATTGTTCACAGTCTTGTAT
-TTTAAAGCATATCCTTTGAATCATGTGTCCAAAGAGAATTACTTGTGGGTCAGAGAGGTA
-CCTTAAAATGGCTTTAAAAACTTAAAACCAAGATTATTTTCAGATTGTTTACCCCCTTGA
-ATCTTAAAACTGTTCAGATATCCAATTACTGAGCTTTCTAAATTAGTGCTCCCAGTTTTT
-CTAAACTTTTAACtttttttttttttgagatggagtctcgctctgtcgccaggcctggag
-tgcagtggcacgctctcggcttactgcaacctccgcctcctgggttcaagcgattccccc
-gcctcagcctcctgagtatctggactacaggcaagcgccaccatgcccggctaatttttt
-tttttttttttttttgtattttagtagagacagggtttcaccatgttggccaggatggtc
-ttgaactcctgatcttgtgatctgcccgcctcggcctcccaaagtgctgggattacaggt
-gtgagccactgctcccagtcTTTTTTACAGTCAAGACAGAAAATAATATTTGTATGGCAC
-AATGGGGTAAATGATCAAGACTGCTCTGGATCTGAGGTCATTAGTTTGGATGCTGTATCC
-AAACTATATTCTGCATGAATGGCCAGAGGTGTGAGGGGACCAGTATCTCAACACATCTGT
-AACGCACCCTAACACAATACACTGGTTGAGAAATTCTAGTTTAAATAACTTGTGGAGATC
-ACGACCTGAATAGTCAAAATCCATGCAGCAGGTTGAGAAAACTATTTCACAATTCCTCTT
-ATTTCAAGAGATACGCAATCACCTTTTGCAGCTTTCAAGTATAGACCAGATGTACTAACA
-GGCAACCATTTCGTCTGGAAGATCATCTATTTGGAGGTCACTGACACAAAAAAACAAAAA
-CAACAAAGACAAAACAAGCCTCCTTACCCTAGCTCAGAAGGATAAGCCAAAAGAAAACAG
-GTTAACGGTAAAAATGTATGATTAAATGAAGTTATTGTTTTTTTTCCTCCACTTCATATT
-GATTCTCTTTTCCCATGTCAATTTAAGGTGGTAACCATGGCCAACAACATTCTCTCTCAC
-CTATCATACTAATGCCATATAAGTAGTAGTGTTTTTGTTTTTTCAAGTGGGGAAATATAT
-ACAGCTCAAAAAAACAAAAAAATATCTAGCAACTAACTCCTTGGCAGTTCCCTTGACTCT
-CTGACCTTTAAGTCCCAAGGTTCTAAGTATACAATGAATAAGAAAACTACCTGTTCAAAC
-CCAACAGAATATGTTTTTTTCTGGTTTGATTAAGGCTTCGAATTTGGAACATAAATACTC
-TCAGTAATACTTAGTAATTCATGAAGTTACTGCTTGTGTAAACTTGCAGAATATTTAACT
-TTAGGAGATTATAAATCCTAACATGCCCCTAGGGGCCTTCTGCTTTTATTCCTACATACA
-AAACATACAACATGTTTGTTTTTAAAAACAATGCACATAGgccaggtgtggtggcacaca
-cctgtagtcccagctacttgggaggctgaggcagaagcatcacttgaacccaggaggcag
-aggttgcaatgagccgagatcatgtcactgcactccagcctgggtgacagagcgagacgc
-tgtctcaaaataaaTACATACATACATACAAAAAAATTAAACCAATACACGGAAGTATTA
-CTTCCATAAAACAAACCAGGAAGTACAGTAAAACAGAAAACATTAGCATTTGGGCCTTTT
-GTGTGAATTACATTTCTCCACCTTCAACCCAGAAAAGGGATCTGAGTGTCAATGTGACAT
-AAATGACATAGCAACAGTGTGAGGTCTCCCAATGAAGGGAGGTATTAGAAGAAAATCCAA
-GCAGTTTGATTTGGATTAATAGTTCTACCCCAAACACCTAAGAGAAATCGGAATTCCAGT
-ACTGTCTCTTACAATATAGTCATCATCTATACACCTTTTTACCACGCCATATAAGCAAAA
-TAAAGTCACAATGTGAAACTTTACTCCACTGGCTATTACCCTCTGGAACCAAAAGATGGA
-AAACTTCATTTGGGATATACAGTAATCTAAAGAAAAATTCAGCACTTATGAATGTAATAA
-CTACTGTTACCATTTGAATGCCTCTTACAAACCAGGCACAGTATCAGATGCAtattctga
-ttttagaaataaacagattcagaggttaaataatctgccaaaaacaacaggattactaag
-tggtggaagccagatctgtttaggatccaaagcctaaataggttcttttcactAAATTTA
-ATACTATTTCCTTAGTTCTCCAAACTGATTTATTAACAGCCTATCCAAAACACTATAATA
-AAATGAACTGCTTTAAATTTGGAGGCAAGGTAGGGGTGGGATACTGAGTTTCAATAATCA
-GGTTTCTTCATTATTCTTTTACCTGAATGGGCTGGCCACCAGGCCACAATTGTATAAAAA
-TCAGATTTTAAATGATGGAAAAGCTTTTCTGTGTGGCTACTGAAGGGAGAAAGGAAGACA
-ACTGAGACATGCCCCACCTTGCTGGCTGGGGGCTGGTGACATCTGTGGGCCTCAGTGTTG
-GACTCCAGATGCAACAAAGCCTAAAGTTTTGAATATGTATGAAGGTCAATGTGATGTTTT
-CCAAAAACAGTCATAAAAGATGGCTGTGAAAAACCCCCTAGTATAACAACTGTATGTAAC
-AAGAGCATATAGGTAGCTGCAGATGAATGCTCAGGTCCTTAGCTGTGGTGTTTAAAAATT
-CTTCAGACCAggctgggtgcagtggctcacacctgcaatcccagcactttgggaggccga
-gatgggtggattgcctgagctcaggtgttagagaccagcctgggaaacacagtgaaaccc
-catctctactaaaatacaaaaaaaaaaaaaagccaggcgtggcagcgtgcgcctgtagtc
-ccagctacttgggaggctgaggcaggagaattgcttgaacccgggaggtggaggttgcag
-tgagccaaggtcgtgccactgcactccagcctggcaacagagtgagatgctatctcccaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTTTCTTCGGACCAgtgtggtggctcatgag
-tgtaatctcagcactttgggaggctgagttaagaggactgcttgagcccaggagtttgag
-accagcctgggcaacatggtgagaccttgtctctacaaaaaaAATTaacaactacccaca
-aagaaaaccctagctcaagatggcttcactggAAGGAAAAATGAACTGGTCAGGAAGACA
-GACAAATAGAAGCAAATAATGAAAGCATTTTATTTGACATTGATAACCTTCTCACAATAA
-ATTATGTGGCAAAATACATGCTTGAATACTTAATTGCTAGGCAATAGTCTATTTTCATTT
-TTTCACAAAAGGTAGACAACTCCAAAGCAGATGGCCATTTGTAGCCATTCTATATAATCA
-TAAATACACAAAACACTggccgggcgcggtggctcacgcctgtaaccccagcactttggg
-aggctgaggcgggtggatcacctgaggtcaggagtttgaggccagcgtggccaacatggc
-gacaccccgcctctactaaaaatacaaaaattagcccggtggggtggcatgcacctgtaa
-tcccagttacttaggaggctgagagaggagaatcacttgaacccaggaggcagagattgc
-gccactgcactccagcttgggcgacagagcaagactccatctcaaaaaaaaaaaaaaaaa
-aaGTTTTAAAGTGCCGATAAATACAAGTTCCTGGTCTGCCTACAGTTTATCACTTAATAA
-TACAAAGCAAACAAGAAAGCAAGTTAGTGGATTACCTGAGAGAGCAAGACATAGAGAAGA
-TGTTAATGCAGGGAGCTGGCCTTCTCCAAACATATCCCTAACACACAATATTCAAGCAAT
-TCCCAAACTGTGATCAGAGAACCACTGGGAGTAAGACCTCTGATCTATATTTACAAGTCT
-ATAGGTGAGCAAAGGTAGACCTTTTCCTGAGTCTGAGATGGGAATATTACCTTCTCTATC
-TAGAAGCAAAAGAATCCTAGACTCACCAGGACTAGGTAATAGACACTGTACACGAGTAAT
-TGAGGTAATCTACACTGGGCGTGACTTACATACTGATCCACCCCTAGGCAGCAATTCATA
-CCTCACCCACCCAACAGGCTACATTAGAAACAAGGAAGTACAGGTCAAAAGTCTCATTAA
-AAAAATAAGAACTCTTGGCAGCAGAAAATGAAAATAAAGAATGAAGAATGACAGCACTGG
-CAATAAACACATTCTTTTCTCCGAAAGGGAAGGGAAAGAACTAATGTTGGGCACCCACAT
-GCCAGACATTTTATCAATTTTCTCCTTTAATCCTCAATAATCCTGAGATAATACTAGCTA
-GTACTCTAGTTAttaatcctcacaaaaatcctgaggtaggtactactaattcccatgtta
-caggtgaagaaaccaaaagttagtaagttgcccaaggtAGttgttatccgaactgtagag
-acaagaactcccagacttgaagaggttaagtaaacttccccaaactcaAAGTGGGAGTTC
-TTTCCCACTAACCTATTGCCTTCCCCTCCCTACCCGCAATCTCAATTAATTCTCTATTCT
-ACCCCCTTCTCATTTCTGCAGCTGTTTCAAAAACTACACCTAAGATACAAAGCAAATAGG
-AGTTATTATAAGAAAACACCTCCAAAATCTACTAAGTTGTGGTATGATATGCCTGTTATC
-AGAAAACGTCACTCAATTTTGAGCTTGGAGGGCAGTGACAGTTTGGAGATCTTtagcaca
-acgcctgccagaaacgtggcaggcgctcaggatctgctgaatgaaCAACATCTTCTGAGT
-GGTTATGAATTCAATAACCCAAAATGACCATCTCGTATTTCTGGATATGACATGATACCA
-TTTTTTGGAAAATAATTTACCCATTCATTTTAAACAGGGTAGCTTTCTTAAAATTTATAG
-AACATTGATGAGATAGCTAAACTGAGAAATGCCCATTAAAGCATTAGTCATAACTTCAGG
-AAAATTTCAAATGTTCACTTTTCCAAGCAAATTAAAATGTTTCAGCTAATAAAAACCTGT
-CAGAAAAACCCACAAGACAAGAAAGTATAAAAAGAAAAGAGCAGCCAATATAAGGGCATT
-TAAGATGTCACACATAAAAAATTATAAAACATTAATCTAACTTGTACCTTGGTATTTAAC
-CCTAAAACTGTCACCTCAGATAACACAATATTTTCTATGCAAGAAAACATTATCACCACG
-AATGTAAAGAAGCTTGCCGACCATAGCAACTGTTGCTACGTAGGGTTTTTTAATGTCTAA
-GACTGAAAGACAGAATTTGTAGAAACCAGTTAAAATGCCACTCTTAGCAGTATCTTGTGA
-TACTGTGAATGCTTTCACCTTAAACTTTTTAAAAGACTCAATCTTTGACTTCTACATGTG
-AAAAAAAAAAAGTACATCTGGGAGCACTCAACGTAAGAAAACTACCAATTGTCTATAACC
-CAATGAAAATACATCCTTTGTTACAATGACAGCAGCTACTTTTCCTTAATAATCCTAGAG
-GAATTTCTTCATTTGAAAAGCTGGCTGGCCTAGATTTCTCTATAAACTAAATGACATGCT
-ACTTTCGAAATTATCCATTTCAGAAGTTCAAAGAAATTCAGGTATAAGAACACATTAATA
-CTCTCATGAAACAAACCTTATCCAGGTTACCCACGAATTGTGACAGATCAAAACCCAGTT
-TCTCATTTCAAATCAAGTATCACATTATTTATTACCTTAAAATACTAAGCCCTTACCTAA
-TTCAATGGCAAATCATATTGGTTTTCAGTTTCTGAACTTGTACAAATCATACTGTAATAT
-TTATGCAAAAGTTGTCATATAGTTGAATATTATAGACAGTTAACATCttttttttttttt
-tttgagacggagtcttgctctgtcccccaggctggagtgcagtggcgtgatcttgactca
-ctgcaaccaacctccgtctcccaggttcaagtgattctcagcctcctgagtagctgggac
-cacaggcacgcacctccacactcagctaattttagtagagatggggttttaccatgttgg
-ccaggctggtcttgtcctgacctcaagtcatctgcccacctcggcctctcaaagaactgg
-gattacaggtgtgagccaccatgcccggccAACAGTAGAAAAGGGTACTCAGGGAACATA
-GTTCAAAAGTCATGATTCTCTATTGGCTGGACCAGGATTCTAGACTAGCTCTAGGGCTGA
-GATATCTTAGTAGACCAGTTAACATTCATGTGGCCCAATTTCCCTTACTCTAAACCCAAA
-GTCAAACATAACCTCTAAAGTCTTTCATACCCTGAAATGCTAATCTTGTAATCATCTTTC
-TATTCAGGTAATAACTCAAAAGAAATGGTCTCACTTCCTTCATCCTCTGACTAAAGTTTA
-GTTAGTCCATATTTTATGAATCCAATTAATAGGATACTTTAAAGAACAAAAAGAAAAGAC
-TTTTCTTAAAAGCTAGAAACTCCATTCTGTAGTGATGATTCCCAGATCTGACTCTTAAAC
-TCAACAACCTCAACAGACAATGACAGGGAGAAAAGATCTTACAAGTTTGAGCTGAGCTGG
-GGTGGGGTGGGAGGTGTGAGAGAACAGAGAGACAGTTACAAATTCACAAAAATGTATCAC
-CCATTTCCATCTCCTCTAAAAAAATATGAAATAAGCCTTAAAAGGCTGTCATAGAAACCC
-ATTATTAAGCCAATAAAAACTAATGAAGAAATTATGTCATTTATCCAAGATATGGAAGAA
-CCACCTATTTACAGAAATCCTACCAATGTCCTAGACCTTCAGAAACTACATCTCACTAAG
-CTGACCATCAAGCCCCTTCAAACTGCATCTAAGGACAATAATAATATTCAAACATCAAGA
-AACAGGCACAGGTTCCACTCAACACCATTATTCCGTGGAGTCTTCCAGGACTAAATTGTT
-TTATAGAATCTTTGCTATCTTTGTTCTCTAGAAAATGATATCCCAAAGACTCTAAAATAA
-AACCAGCAAAACCCCtgtatttgttttccattgtgtcataacaaattatcacaaacaaaa
-caacacaaatggattatcttacagaagtcagtgggcttgactgggtctcacaagggctaa
-atgagggtatccagtgggtgggttccctgctggaaactctggggaaaatttgcttccaca
-ttcattcaagctattggctgaatttagttccttgcagctgtaggactgagttcccacttc
-cttgctggttgtcagctgggactggcctttcctactagaggctgcctgcattccccgtct
-cacactttcaatctggtcccctccagtaacggcaggctgagtccttctcatgcttcaaat
-ttgacttccccttctgcctcatctctgacaccagccagaaaaagttctctgcttttaagt
-gcttatgtgagtagaataaacccacccagaaaatccaagataatctacctaagatcctta
-actttaattaaatctacttaacatattcatgttccagggtttatagtatggaaatcgtag
-gggagccattctgcttaccgcagtctgccttctggtttccaaggattcatctctctctca
-aatgcaaaatacatccatcccatcccaaggtcccaaaggtttcccatctaaagcttatca
-tttcagaagtcccaaatctcattcatctattcaggtgtggatgaggttctggggacaaaa
-cagtaagtccaattcctggggcacaattcctaaagaaacaagttctctactcccaacata
-ccactgtgagacatgtagagaataacagttagacattccagttcaaatgggcaaaatgta
-aaagaaaacagagcctccggtccaaagcagtttcaaaatctagggaatctccattccatt
-tcaaagcctgggaaaaatcctctccagcttttagctccacccctctgggctctcctatct
-ccgtctgagtcaccctgattcttttatgaaaagcaacacattcacatgtgagtagtttta
-tcagcctgcttcctatcagtagaatttggggggtccaacagccctattactttctgtctc
-tttcaatccaaactagaactgtttatgttggcataaaattctcaagaacctaatgggctg
-tggaagtattccacatgggtccactccattaaagttcacattcacaaataaaccaggctg
-cacatttaatactttgcttggaaatctcagctaaatatacaagttcatcacttgcaaatt
-tggctttccatataaccataggatacaattctgctaaacttagttgctactatgtaacaa
-ggatcccctttctgccagtttccaataagaaagacctcacttctgtctgggccctcacta
-gcagagtcattaacatccatattgctactaaaagtatgtccTAGGCCttttcttttttga
-cagggtctcactctgccacccaggctggagtgcagtggtgccattaccgctcactgcagc
-cttgacttcctgggctcaagcgatcctcctgTGTtccaggccttttctatcatgcccctc
-aaaacaattctaacctttatctactgccactttcatttttaggtaatagtaccccactcc
-tggtaccaaaatctatactagtgttctactgctgccataacaaattaccacaaatgtagt
-agctaaaaataacacaaatttgttatctcacagttattgtaggtcagaagttgggtgggc
-ttggctagctaggtcttttgcttagggtctcacgaggccaaaaatcaaggtgtctcaagg
-ttgcattccttggtggaaactgggaaattcacttccaagctcaatcaggttgttgaccaa
-attcaggttccttctggttgcacaactgaggtccccatttctttctggttgtcagccagg
-gactggtctttgccactagaggctgcccacattccttctgataaactttccatgtggtcc
-tctctagcaaaggcaaatggagtccttctcatgcttcaaatctctgatttccttttctgc
-ccatttctctgatcccagttggagaaagttctctgcttttaaggacttaagtgactagat
-tcggcccacccagaaaatccaggataatttttctattttaagattcttaaccttaattac
-acctgccaagttccttttgccatgtaacacaggatagctacagattctggggatcaaggt
-atggcaccttgggaagagggagatgtaattctgcctactacaAATCCAAGTCCTATGGAA
-GGGTTTAAACTCACTTCCTAAAGAAAATCATCCCTTTCTTTAACAGAGTGTGAAGTAAAG
-ATGTATATATTTTACTTATGTGAAGTAAAGTATATATACATACATACATATGTCTTTACT
-TATGTGACACAAAGATGTATGTTCAGAGATAGAGACAATAGTAAAAACAAGGACTCACTC
-TGGATGAGTGAGTAGGAAAAGGACGCGCAGTATGGAAAAGGAGTTGCCACCTGTTTCATC
-CTCAAATTGCAAGGCACTTCACCCATAACTACTTAGAAACTAACCCATGCTCCTCCTTAA
-ATGTGTATTTCTCTTCTCTGTATTCCACAAAGGAGTACATAACTAGGCTTTTTTTTATTT
-TTAAAGAAAAGTCACCTCACGGGGACCTAACTGTATAATCAGTTGATTAATCAATCTAAG
-CAAATTTCCAATCTTGCATTCTTTCTTCAAGTCATACACCCTCCCGCAATAGCAAACCAA
-AGCCAAGTATTTCAAAGTCACAGAAGGACAAAAACATGCCCTGCTAAGACTGCAGGTGAA
-CTTTTGAGAATACCACGGAGGAGAACTAGTATTGGTACTGGACTTTCAGCCCCAGGTCCA
-CCAAGCCAGTAAAGCCAAATGACTTACAACAAAACCCTACAACAACTACAAAGATACTAC
-TCTAAAGCCCTGTCTACAGTCAAATTCTTGACTATAAATTTTACTTAGAACAGAAGAGCC
-CCAAATATACCAGCTAGTCCCTTTACAGTGACAGGTAAAAGCTACTTACTAcacttacta
-cctgccagacactgtagtaagcacttgacacaaattgtcttatttactcttctccgtaaa
-ctcacaagctagaaaataccatcatcccccttttacagacgggaaaactgaggcttagag
-agtttaggtcacacagctaagtagcaatggccctgatatttgagaacctaggcagtctgg
-tttttaaccactgggcctacactgCACTCCTCAGATGGAATGAAGTCTCCAATTCTTGGA
-AAAATCTTCCCTTCTTAGttttcttttttctttttgaggcggagtctcgctctgtcgccc
-aggctggagtgcagtggcggatctcagctcactgccacctccgcctcccaggttcaagcg
-attctcctgccttagcctcccgagtagctgggattacaggcgcgcgccaccaagcccggc
-tgatatttgcatttttagtacagacggggtttcaccgtgttggtcaggctggtctcgaac
-tcctgacctcgtgatccacccgcctcggcctcccagagtgctgggattacaggcgtgagc
-cacacgcccggccTCTCTTCTTAGTTTTCATTTCCTCTCCCCATGTCCCATTCTCGTAGA
-ATTAAACAGCTGAAAAGTAATCAAGTCTTCCCAAATAATTTGCCACCTTCTTTTCAAAAC
-TCTTTCCTCCACACAAAGCAATAGCCAAGATGCAACTTCTCCTGACCCTGACTCTGCTTC
-CCCAAAACAAACTACAGAAGCTCCACCCATCACCTGCTTAATCTAGCAATGTTCCAACAC
-TGCAAAAAACACACAACGAAAAACAAAATTGAAAAGTCCTACTCTTTCAAAAGGTCACCA
-ACATATGTATACCCTTAGCCAAGCTTTCTCTCCATACCTCTTTTTCTATCCAGGCTCCTA
-ACTAGTCCTTAACTCCAACTCCAGACGTTCTGCCCCACGTCTTGGTCCCTTCCCCCTTTC
-GCCCCAGCAACCCCGCCTGGGGTTCTCTCCACCTCGCACCCACTCTGCAGGTGGGAAGCT
-CAGCCCCGCCCAGAGGGACCCTAAGAAGGCCCCTACTCCAGCTGCCCAGTTTCGCGGGAG
-GGTTCACTGCACACTACCCAGCAGGCACCACTCCCTCCGCACCCTCCCCCAGCACCCCCC
-TGCGGCCCCACCCCTCAAGTTCCCTTCCCCCTCTGACGACCCCCTCCTCCAAGTTGTCCC
-CTAGTCCCCACCCAGTTCAGTCCTCTCCTCTGCAATAAGCTGGACTCCGGCAGCCGGTTC
-CCACCCTCACATCGGCCTCTGCCCCCAAACCTCGCCCTCCGCCCTGAGGGGTGGCCCCTG
-GGCCTCCCCGATGGGCTGCAGGGGCCTCGCTTGGTTTATGTGTGAAGGTGGGGGCAGGGG
-AAGGCGACGGGCCGCTCAGGAGTCTGCTGGAAGCGTGAGGGTCGGCCGCGCTCCGCTGCC
-CTATCCTGGGCCCACCCCACCCGCCAACGACCTCGCCTGGCTGCTCCCTAGGTACCTGTG
-GTGGAAGCGGCAGCGGCGGCGGCCGCTCTCCCCTCTGCTCACACAGACAATATGGCGGCG
-ATGGAGGAGGAGACACACGGCTCGGCCGCCAGCCGCAGGGACCAGAGCGAGGCTGCAGCC
-GCTGCTGCCGGAAGCGGAAACCCCCTCCTACCAGGAGGCGGGGCGAGACAGCTTCCGACT
-CCGCCCCCAGAGGAATCTCTCTGAATGCGGCCATGCTGGGATGTCCTATTGTAACCTTAG
-GGATTCAGTTCTGGCCTAGGGTGCAAAATGGAAGGAATCCCCAACGCAAAGCAGAATAAG
-GAGACTTGCAATAGTTAAGCGCATTTTATTTCAATAGTGTTAACAAGTGACAACAGAGAG
-AACACGAACCTCCCATTAGGTGAACAGTTGGTTTGACCCAAGTTAAGATGGCGGTACCCA
-GGTTTCCCACACTTCACCCAGCTGGCCCCCCTTTCTTGAAAAGAACCATGCGCGACCTGC
-AGAGCTGTAGAGCCAAGCATTCTGGGAGCTGAAGTCTCTTTTGCTCTGACCCCTCGTTTT
-AAATTAGGGTTTCAGCAACACTTTCTATTCAAACTTGGAGTTCGGAAGAAGTGAATGAAA
-GTTGGACCCTAGGAAGGGCATGGCGCAGGAGTCTGAGAAGTGAGGATACTAGCTCTCAAG
-AGACCAAGGCCCAATTCCTTCCTCCTACAGGAGTCCTGCCAAGAGCTGTGCGTCCAAAAT
-ACAGTGTTTTTTTTTCCTtctatctgcctcccacccctgctctccttgcccgagctacct
-ccccaaaacagccacaaagcactttctaccatgcagagctcatcatggtctccctatggt
-caaaaatctcccatggacctctttatgcaccaaagatagcccaaactcttcacttgacat
-tcagagtcctccataatttggccaaaccctcctttccagcctcctattctgccactctct
-tctcaaattccggaagattccacccacaagactgcaaacaattcctggaacttagctgtg
-ttgcctccctccctttacactggcagttacttctCTTACTGTCACCTCATGGACTGGATA
-ATTTCTGTATGCCGATTGAACTAAttcagggatcctttcctctaggggtctcctctctgt
-ttaactccctccaacccagacactatcagtcagtaacctgaggacctcagtctgtctcct
-ccatcagactgggagcccccagtggacagggctccatctgATGATCAACCTCTCCTTTGC
-AGGCCCTGATAAAAGCTGAAGCGTCTAAGAGTTGCTGAAAGGAGTTCAAGTATTAGTCTC
-ACCTCTGGTGGGACAGAGGTGTGAGCACTGGAACGAGGGTGAGGAGGCCAGGTTCTTTCA
-GTACCAACCATTATCCCTAACTGTCTCAGAATAGCTGGTTGTCTCAGGAATGGGCCTCTC
-CACCCTCCACAGCCCTGCCTTCACAGTTTGTCAGCTGACTAGCACCTCTGCTCCCAAAGA
-GGCACCTCTTCCCCATGTGGGGTTAGGGCTGGTGGTGGCTGCAGACTTATAGTGATGGCC
-TCAGGGAGGTGGCTGTGGCCTTCTCTGGACCTCATCTGCTAGACAGCTTGTGACATCTGA
-TCCCAATTGCCTGGGAACCCACAACAGTTTTTCTCTCAGTGTCCTGTAActgggcctcaa
-tttccccacttgtggactgaggaggttatacaagataatcccaaagtttctGGGAAGCCA
-TCTTCCAGGAAATGATACCCTTCTACCTACCTCTCGAACGTATCTTTTTGGCTCTTGTGG
-CTTTGTTTTTCCCAACTGTATTCAcatttgtttaactcacaacaattcatcatttgctat
-gagccagacactgtgctaggtactggggatgtgttatgaggaagacatacaccagttgct
-cactggtggagcttaccttctaaagtgagaagcaagtaatgcacaggtaaacaaatgcat
-aaacaaagtaatttcaggtagcaataagtgctacgaaaggaaaagataagtagctgtgaa
-gtatagagctttagcttgagtggttcagaaggtccctttgagaaggaaacagtaagtgca
-aacgtcccaaggcaggaaagagcatcacaagtttgaagaaggaggccatggtggctgaag
-cactgcaaataaagggaagaagaggaagaaatatggtgggagaggtgggcagggcattca
-ggtcatgataaggaagctgggttttcatctgagtgtagtgaggaTATTTCCCATTGCTTA
-GCCTTCATGCCTTTCCAATCTCAGCCTCTCTCACAGCATTAGTTCTTCATTCTTCTTCCT
-AGTTCTGGCCTCTATCCATGACTTCATTCAGAGGGCTCACCTGGGCACACATATACAACC
-CTCATACTCATGCAGGACATAATTGAAACCCAACTCCTGCCGTCTACTACGCCAGCCTCA
-TGTAGGTCTCCGGTCTCAAGAGGCTTCCCATCCCAAGTGTTCACCTAGTTGTAGACTTAA
-CATTTATCCTTAACTCTTACTGTCTCTGATCCCCCACATCACACCTCTCAGGCTAGTCTT
-TCTGCAAACAACAGCAGCAGAAGCAAGAGTTAAGATGTTGAGAGTACTTgcactgtgcca
-cacactgaatgttcatcatctcacttaatcctcatgtcaacctgatgaggtagaaaccaa
-aagtatctcaccgtacagatgaggagactcaggttcacagagatcacaggccatgcccaa
-ggtcacatgccggagatggagcttgcatttcaacctgggccATTAGAGTGActctctctc
-tctctctctcttttgagacaggatcttgctctgttgtccaggctggagtgcagtggcatg
-atcacagctcattataaccttgaactcctgtgcttaagcgatcctcccaccttagcctcc
-tgagtagctaggactacagacatgcaccaccatgcctggctcatttttaatttagtagta
-ttattattactattattattattgtacagatggggtcttgctatgttgccagggctggtc
-ttgaactcctaggctcaagcagttcccctgccttggcctcccaaagtgctagaattacag
-gcAAAAGTTTTAATCATGCACTAAGAACCTAAGtgtatttgctttctattgctgcttaac
-aaaatcaccccacaatatagtggcttaaaacaacaatattttatgtttgtgtggattggc
-agtttggacatgtctcagccaggacagctcttttctgctccaagtggtctttcctggctt
-actcttacgtttgctgtcagtgaacaggccagcaaactggttagaactccatggcctcat
-tcacatgtctggcagttggttggggttgttggcttgagtgccttggttctcctccatgtt
-gcttcttcagtaagctaactcaggcttacttacatgacggcccccagaagaaagaaaaca
-aaagcagcaagatctcttcagatctaggcttagaaatgatatagcatcattttcactgta
-ttatatcgatcaaaggcagtcatatggccagctcagattcaaggagagtagaaatagatt
-ccatctcttcatgagaaaaacatcaaatcatactgcaaggagtcatgtgtataaggaggg
-tggaattgttgtggccacctttgcaaacattatatcacaTAAGTAATCGTAGGCATggaa
-ctggttaaagaaattatggtacagccagacatggggctattcacagcaatgagaactaac
-atttttgagcacttaatatgtgtcagacactgtacaagatgctttacatctattaactca
-tttaatcctcacaacagctctctgtggccagtacatttttaatccccattttagagatta
-agaacaccaagtctcagagaggttaaacaactagtccaatgtcacacagcaagtgacaaa
-gccATTGAAAAGAATGAAGACAGTATTATGTCCTGACATAGAAATCTGGCCCTGACATTC
-TGTTATACGATACAAAGCAAGAGACAAACAGTAGTTTGATCAGAAAACATTTAAAAAGCA
-CATTTAAATAATTAGGAGATGTGTGTCttttttttttctgagatggagtttcactcttgt
-tgcccagggtggagtccaatgatgccatcttggctcactgcaacctccgccttctgggtt
-caagcgattctcctgcctcaacctcccgagtagctgggattacaggtgcccaccatgccc
-agctaatttttgtatttttagtagagatgggatttcaccatgttggccaggctggtcttg
-aactcctgacctcaggtgattgcctgtcttggcctcccaaagtcctgggattacaggcat
-gagccactgcgttcagctGGAGATGTATGTCTTATAAAAATTAGTAGAATAAAAATTTTT
-ATGTCTTATAAAAATTAGTAggccgggcgcggtggctgatgcctgtaatcccagcacttt
-gggaggccaaggcgggtggatcacaaggtcaggagatcgagaccaccctggctaacacgg
-tgaaaacttgtctctactaaaaatacaaaaattagccgggcatggtggtgggtgcctgta
-gtcccagctactcaggaggctgaggcaggagaatggcgtgaacccgggaggcagagcttg
-cagtgagctgagattgcaccactgcactccagcctgggcaacagagcgcgactctgtctc
-aaaaaaaataaataaatacaataaaTTAGTAGATCTATATGTCTTATAGTTTTAGATAAA
-TTCAGGAAGAATTTACTACAAACTATTAATGGAGCTTATCTTTGAAGAGGAGAAAAGGAG
-AAAACTTTTATTTAAACACCTCTGTTTGTGTTGCTTGAATAttttttttttttttttttt
-ttttttgagacagattcttgctctgttgcccaggctgaagtgcagtggcaatggtcacag
-cttgctgcagcctcaacctccagggctcaagtagtccttgcacctcagtctcccaagtag
-ttgagaccacaagtgtgtgccatcatgcctggctaatttatttttatgttttgtagagat
-agggtctccccatgctggccatgctggtcacaaactcctgggttcaagtgatcctcccgc
-cttggcctcgcaaagtgctggaattacaggcACAAAGCCTGGCCTTCTTTGAATTTTTTT
-ATAGCAATCATAAATTTTTATTTCAATACCTTATAAAGAAGAAAATGCTTTTAAAATGTC
-CTTCAACTTGGCTCCCACCTATGTCtttttctatttggttttatttttattgttttttgt
-tttcttttttgATACCACCCCAGCCCAACCCCTTATCAATTCTGACCCGAAGTTTTGTGG
-CTACCTTGAGGGCCCCTCCTCTCTCCCTCTGTAGTTCATCCTGCCTGCTGCTGGGGGAAA
-GCTCATTAACCATCATGTTCCATTTTTGTCTAAGAGTTTTCAATGGTATTGCATTGTCTA
-CACAGAAAGTCCAAACCCTTTGGCCTTGTACATTGGGTGTTTGTAAGTTTGACTCCAact
-tggttggattccagctctgtcacttactagcagcatatagttggataagttattagatct
-ctctgagcctcaatttccacatctttttttaaaaaaatgaaagAAAAgaccaggtgtggt
-ggctcatgcctgtaattccagcactttgggaggctgaggtgggtggatcacctgaggtca
-ggagtttgagaccagcctggccaacacagagaaaccctgtctctagtaaaaatacaaaaa
-ttagccgggcatggtggcacatggctgtaatcccagctactcgggaggctgaggcaggga
-gaattgcttgaacctggaaagtggaggttgcagtgagccgagattgtgccactgcactcc
-agctgagtgacagagcaaaactctgtctcaaaggaaagaaagaaagaaataaagaaagaa
-agaaagaaagaaagaaagaaaaaggaagagagagagagaaagaaaaagagaaaagaaaga
-aaAGGATATAGCATTACATATTTTGTGGCAAATTAGATTACTGTTCAGTGACTGTTCACT
-TTCTCACCCAGCCAGGGGCAATTAAtattttcctgccccattaatattaggcttggccat
-atggtttgctttggctagtggaatatacatatcagttacaatgtgcaaattccagcctag
-gccttaagaggtctCTCTTGTTTTCAATTGGCTGTCTTAGAATTTTCACCTCTTCCTTGA
-AGGGCGAGCTGTCATTGGTGCCTTACATCTTTTGAAACAGACTTCCAATCAAGGCTGTAG
-TAGGCAAGTCTGAGATAAGAATAGTTCTTTACTCTTTAGTTTTAGTTTGCattaattaaa
-ttataatttataGTTTTTCGTGAACTCCATATTTTTGAATGAGCGGAAGCTAAAGAGGTG
-GGAAGAGAATGCTCTGTCTCAATTTGGGAAAGCAGTAGCTTCTGTCCAATCCTCCAGCAT
-CAAACAGGCTAGTCCTAGAAGAATAAAGGACACACATAGTAGATCTGAAATTGAGTCAAC
-CCCAGCAGAACCCAGCCAAGATCAGCCAAACCCAAATGACTACATATGAGAGAGGGAGAA
-ATCAATGTTTGCTTCTGTCAGCACAGAGTCTTGGGGCAGTTTGATATGCAACATTATTat
-aggaatagccaactaacagattcacatcatagggcttttttcagggttaaataaatgaat
-acaggaaacgccttaaaaatacactggcatatagcaagggtgtaatgcatgagaactact
-attATtgggggtgcaactgtgaacaaaacaagcccctgttctcaaggatcttatgttctg
-cggagagatgtatggaatggcagctggtgatgagtgttatggaagaaaataaagcaggga
-aggagagggagtgctgaggtaaaatttcaaatgtgatcatcaacaaaacttcaacggaag
-gtgaaacttgaccaaatccaagaggaagtgaggcggggagccagaaagtatgtgggagaa
-gattgtcccaagcagagagaattcggatgggcaaagaccgtgaagtaggctcatgcctgg
-tgaatttcaggaatggtcagtagatagggcagctgagccgagggagtgGCTGATCTCGTC
-TCGGCTCTGCTGGGGTTGACTCAAATTCAGGTCTACTGCATGTGTCTTTTGTTCTTCTGG
-GACCAGCCTGTTTGATGCAGGAGGTTTGGACAGAAGggggacaatgtctcagaggttcac
-aaggtactggattgtgcacagccatgtagggctatcgtgaggacttgcttctgctctgaa
-tgaggtggggagctatgggagggttttgaccaggtggagagcaggctctgctatgcattt
-ttataggatttgtccagctgctaagtgtggactagatggaccgggaatgagggctgaagc
-agggagaaaagataagaagctactaccacaagccagacaagagatggtgttgctttgaac
-caaagttggactccgaggttcttttcaaagtaaaatcaaaagaatttactgataggtgtg
-gtatggggtgtttgaggaaaaaaagaattgaggatgactccaaggcttctggcctgagga
-actgaaagaaggaatttgccagtaactgagatgaagaaggctatagaagagaacttcttg
-gggcagggggagaaagagaggaggaattagcagttccatttgcgacttgttaaatttaag
-tgagctatgagacttccaagtgcagatgactaatcagaagttagatgtatgaatctgagc
-ccaggagagaggtccaagctggagacgtaatttttgggagttactatgtactaaattttg
-tcctccccaaatttatatattgaaaccctaacacccaatgtgacactatttggagacagg
-gtctttaaaggaggttaaaagagatcatagagtgggccctaattcaacaggactattgtc
-cttacaggaagatgagatatcagagctcattctctccccatgcaggtgctcagaggaaat
-gctgtgtgaggacacagcaagaaggcagccatttacaagccaggcagagagccttcacca
-gaaaccctccctgacagcaccttgatctcagatttccagcctctcagtgagaggctgaac
-tgtgagaaaataaatttctgttgtttaatcctctcagtctgtggcattttgttatggtag
-tttgagcagactactactgagtcatcaacagagaaatggtttttaaagccatgaggggcc
-aggcatggtggctcacacctgtaatcccagcactttgggaggctgaggtaggcagatcac
-ttgaagtcaggagtctgagaccagcctggccaacatggtaaaaccccgtctctattaaaa
-atacaaaaattagctgggtgtggcggtgtgtgcctgtaatcccagctacccaggaggctg
-aggcaggagaattgcttgaacccgggaggcggaggttgcagtgagctgagatcgagccac
-tgcactccagcctgggcgacaaggaagaaactgtctcaaaaataaataaataagtaaata
-gccataaggctgggtgaaattgcccagggaatgagtgtagacagagaaggaggaccaagg
-actgcgccctggggcatccaacagtaagagacaagcaaccagcaaaggagcctgagaagg
-agcagccagtggggtaagtgtcctggggaccaagtgaaaaacgtgtttcatggaaggagt
-gttgatcccctgatcccctgtgtcagatgctgctgaggggtcagaaaagaaaagaacaaa
-gagctgatttacaaagtggaggacattgttttgacaggagagagtgtaggtaggttggtg
-ggaacaaaagtctgattggagtgggattaagagagaataggagaaaatataaatatagac
-aTagaaaggaaggaaaaaaggaaggaaggaaggaaggagggCTCtttttttttttttctt
-tttgagatgggttctcactctgtcgcccaggttggagtgcagtggtgtgatctcagctca
-ctgcaacctccgcctcccaggttcaagcgattctcctgcctcagcctcccgagtagctgg
-gattacaggtgcgtgccaccacgtctggctaatttttgtatttttagtagagatggggtt
-ttgccatgttggccaggctagtctcaaactcctgacatcaggtgatctgcctgcctcagc
-ctcccaaagtgctgggattagaggtgtgagccaccacacctggccTggagagctcttttt
-aagagtagaaagctgggccaggcgcagtggctcatgcctgtaatcccagcactttgggag
-gccgaggcaggcggatcacctgagatcaggagtttgagaccagccgggccaacatggtga
-aacccagtctctactaaaaatacaaaaagttagccaggtgtggtggtgcatgcctgtaat
-cccagctcctcaggagactgagctaggacaattgcttgaacctgggaggtggaggttgca
-gtgagctgagatagtgccattgcactccagcccgggcaatgagagtgaaactctgtctca
-aaaaaaaaaaaaaaaaaaagtaggaagcaaatgactaaatgtagaagaataggagttggc
-aaccaccataggagacaatcattaatggacactgcagtagtggattaaagtttgatgaga
-aatagggcatttgcacagtctgagaatatctccccccaagatacttattaattacaaagg
-gtaaaatagtaactttacatggagaaacacagccaacaccacttgaccaagtgataaagt
-gaacatcaccagtagcagggcaaattgacatcatgtggcttccgggatgatgcactgagt
-gggacgtcgcgtcacgtcagtgatatttctgccaaagaggcataattgactcatgaggaa
-gcattagaaaagcccaaagtggccaggcacagtgactcacacctgtaatcccagcacttt
-gggaggctgaggtgggcagatcacgaggtcaggagttcgagacaagcctgaccaacatgg
-tgaaaccctgtttctactaaaaatacaaaaattagctgggcatggtggcgtgcgcctgta
-gtcccaactactcaggaggctgaggcaagaaaatcgcttgaacccaggaggcagaggttg
-cagtgagccgagattgcaccactgcactctagcctgggcaacagagcaagactccgtcta
-aaaaaaaaaaaatgtccaaagtgaggatatctttgcaagagaaccttactctttaaaaat
-gttgaagtggtaaaagacaaaggaagactgaggaatagttttagatgaaggagaataaag
-taattacaactactgaatgcaatgtgagatcctagattaagaaaaaatcattttcactta
-ctacaaaatatattaactagatgagtggtgaaatttgaataagatctgtagattagataa
-tggttttgcatcagtgtaaaacgtcccgattttggttattataagagaatgtccttcctt
-ttaggaaatgtgtactggtttttaggcctgtaacttaccataaaagagttcagggttgga
-ggaaagaaaaataaatgataaagcaaagatggtaaaatctgggtaatgggtatttggcta
-ttctgtttttgtttttgagacagggtctcactctgttacccaggctggagtgcagtggtg
-tgatcatagctcactgcagcctcaacctcccaggctcaagcaatgctcccacctcaacct
-cctgagtagctgggaccacagttgcgcaccaccacacctgactcatttttaaatattttt
-tagagatggggtctccctgtgttgcccaggctggtctcaaattctaggctcaagcaatcc
-tcccatctcagccttccaaaatgctgagattttaggtgttagccattgtggctggtgaga
-tttgagtgttctttgtactactttgtaacttttctgtaagtgacattatgtcaaaataaa
-TTCTAACaagagagaatagaaggaaaggaagtagagacatggaggcagtgagtccaggta
-actttttgaggagttttgctatagaactgaggacaggtggcaggtggagagcaaaatggg
-gtcaagataagttgttcaaaggcagaaattgtagcatgtttttatgctgatgagagagat
-tcagtagattggaaaaaaaagtaataatgcagacagagagagagaagagagtggctagaa
-tggtgtctctggagagaaggatgggatctagtatacaaatgggggctttgaccttggagc
-acagatggctcatccatggtcacagaagggagggcagagtatttgggtaccagattggta
-ggtaggtagctgtgcagtggaaatgtgtggaaatgctttctgattgctaccattttccct
-gtgaaataggaagcaaggtccttggctaagagtgagaatgggggagaaggtgatggaggt
-ttgaaaagataggaaggaagtgtgtagggaaaatgaatggatctactgtgattgtcaggc
-agaacaaaagacaccactgaagctatcatcattcaagtaaagtgaggccagtctacatgg
-tggtgtgtttttctccagccacattccactgcagggggacaaacacagagggatgtggag
-ttggcaccaactaacaggtgtttagtcagagagggtcagggggatcttgggagtatgcag
-cacagtggggataaagttatatcatggctgtaatccacaaagaaggaagtgaggacaagg
-aaacaccaaggttcagagaggtttagtgacttacccaagcttgcacagctagtgaataat
-gagttggtctctgcatccaggcagtgtggctcaaagcttattctctcaccaacccagtat
-acacaggctgtccccagggtgtagcatagcatttggcacatgtagCCTCTGCTAACAAGT
-GAATTAAATTGTACCTGGGGTTCTCTCTGCCTTTCATTCTATGCCTCCGAAGAATACTaa
-ataaaataaaataaaacaacaacaacataaaaACCTAGCTTCTTCCTTGCCTTCAAGCTG
-TCTTTGATGTCTTAGTGTGCACGATGAAGGAGATGTACCATCAGTCTCCTTTGGGTGGCC
-ATTGGTTCATGCCTGCAGTCTGGCTttcagcaggtcattctcagcacatactctggggca
-gacactttctcaggttctcagtacacagcgggaaacaagtcagtattcctggcctggtgg
-agctcagtcaagtggggagaagataagcagacaaatctagcattgcaaactgggattatc
-gccaggagagacaagtgggcggggtatgagagtgcatgagagtaaagccgacctagtgga
-gggcgggaagaagagtttacccaaggaaggtcaggaggggtggcccatggggctgactga
-agaggagaaacagcatgggcaaaggtcctaagataggaacatgcctgttaatggcatatc
-aaggaggccaatgtggtccagacgtatatggagagggtggagggtgggagggaacatagt
-gggaaatgagatgggagaggttggcaggatccactacaccctgtagaggaatctgattta
-agaacaatagggtttaagcaggggaatgatttcgtaaggttttacatttatcagccaggt
-gcggtggctcacgcctgtagtcccagcactttggaaggctgagatgggcggattgcttga
-gctcaggagttcaacatggggaaaccccatctgtaaaaaaatatacaaaaattaggctgg
-gcgtggtggctcatgcctgtaatcccagcactttgggaggctgaggagggcagattatga
-ggtcaggagatggagaccatcctggctagtagtgaaacccctggctagatggtgaaaccc
-catctctactaaaaatacagaaaaattagccgggcgtggtggcaggcgcctgtagtccca
-gctactcgggaggctgaggcaggagaatggtgtgaactgggagatggaacttgaagtgag
-ctgagatcatgccactgcactccagcctgggtgacagagcgagactccgtctcaaaaaaa
-aaaaaatatatatatatatatataaaatacaaaaattagcagggcgtggcatcatgcacc
-tgtattcccagctacttgggggctgaggcaggaggattgcatgaacccaaggagttgagg
-ctgcagtgagccgagatcaccccactgtgctctagcctcaatgacaaagtgagatcctgt
-ctcaacaacaacaaaaaaaattttttttatttataaaagacctctttggctgctgggcca
-ggagcagggaggacaggaggcaggggtaggagtggaggtgtgggaggagaggaagcagga
-gaggagtggaggtgtgggggcaggggaggcagtgggtgggccaggagagaggtgatgtgg
-catgggctaagatggaagcagtgcagataaagagaggtggattgacttgggacatatttt
-ggagctggagttcacCACAGGGAAACTGAGGCCCAGTGCTTCCAAGGATAGCGCTCCAGC
-TCTCCCAGCCCAATGGAAGCTTTTAGATACTTCTGCACTGTGGGGGTCACTTGTGGGTGG
-TTGCATTGGGGGACGAGTGGCCAGGACAGGTGACCTCTGACTTTTGTCTGGTGATGCGTG
-AGTCTCAGATTGGGCTTTGAAGGAGCCATGGGTACCTTGCTGGGCAGGTGGAGCATGTCC
-TTAGAGGATCATCCCACCATCCTCACgtaaccctgcaggtctcttctctctgagtcatag
-ttctcacacttgtaacatgaagagggacagtacccacttAGGCGACATCACCCCCTTCTT
-ACAGATGAGACAACTAggccaggtacagtagctcatgcctgtaatcccagcactgtggga
-ggctgaggcaggcagatcgcttgagcccacacatttgagaccagcctgggcaacatggca
-aaactctgaatctacagaaaatacaaagattagctgtgtgtggtggcatgcgcctgtagt
-cccagctacttgggagactgaggtaggaggatcacttgagcccaggaggtggaggttaca
-gtgagctgagatccaccactatactccagcctgggagacagattgagactttgtctcaaa
-aaacaaaaacaaaaacaaaaCCACCACCACCACCACAACAAAAAAACCCAAAAGAAAaca
-gatgagacaactgagcctcagtgaagggaagtggctctttagggtcatacaggagtaaag
-acacagccaagactagcacccaggctagagcctgggctgttgacctttctgcttcatcat
-ttgccTCCCATACCTTTCCTGGGCTCGTCAGTCCTGGGGATGCTCAACTCACCCAACACT
-GTGTTTCAAGCCCAGGGAATCCAGGATCGGTtagttcagtggttaggggtatgggctgct
-tggattctatttccagcgccaccaaggggccttattctgtctgaaccttggttttctcct
-ctgcaaaatggggctaacagtgcatacccttgtagcactgttacaaggtaggggaactgt
-acagatgtaaTGATTTGTGTATGTGAGTCATTTACAAGCCTTTGGAGTGGCTGGCACCCA
-TCATTGTTTGCTGTTGCTGTGATTATCATGCCATTGGACTgtggcttgaaaccctacagg
-cccaaggctccctttaatagtagttataatgcttcttttctaaaataaaatacatgaata
-acataacctgctgacgcacataattttttttttttgagaccgagtctcactctgtcatcc
-aggctggagtgcagcggcacaatctcggctcactgcaacctccgcctcctgggttcaagt
-gattatcctgcctcagcctcccgaataggtaagattacaggcgcatgccaccatgcccag
-ctaatttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcgat
-ctcttgacctcgtgatccttccgccttggcctcccaaagtgctgggattacaggagtgag
-ccaccgcgcccggccatgcatagttttaaacataaataatgtcctagttgtaatttaaaa
-gaaaataaagtgaaaataatttagaataaattaatatgtaaatgttccaggacaatgtgt
-agaaaccatcacaaagtagttgggtgggctctgctctgggtggaatcattgagaatctgc
-aggctgaattggtaacgccgcactggcggcacatgcactgtgactgcatggctgtgatag
-tctgaaatgtgagcagtctaggtaaagttctgaaccaaacacaatccattctgttcccaa
-tcgctacagactaaatgtttgtctcccccaaaatcttacgtcaaagcctaatccccagcg
-tgatggtattaggagatggggccttttggaggtgattaggttatgagtgcagagccctca
-tgagtgggattagtgcccttataaaagaggccccagagagctctgctgccccttctacca
-tgtgaggacacggtgagaagccatctatgaaccaggaagcggtcttcaccagacatggaa
-tctgccagctcctggatgttggacttgccaggcttcggatctgtaagaaataaatttctg
-ttgcttataagccaccagtctgtgtaatttgttacagtggcctgaactgactaagacacc
-aatttatgtgaaggttgctttcctggcagagtcgctgttattaaaaccaagcaaaCACac
-attgtactggaaaaggcaaaactatagagacaatgaaaagatcagtggttgccagggctc
-aggggaggggagagagggatgcacaggtggagcacagggcatttttagggcaggggacct
-cttctgtatgatgctgtaatggtagataaaggatgtatgtacttgtcaaaacccagcatg
-ggccgggcgcggtggctcacgcctgtaatcccagcactttgggaggccgaggcgggcgga
-ttgcctgagctcaggagtttgcaaccagcctggcgctacagaaatcctgcttcaaatcca
-gaaaccccgtctctactaaaaaacacagaaaattagctgcgcgtggcggcatgtgcctgt
-agtcccagctactcgggaggctgaggcaggagaatttcttgaacccgggaggtggagggt
-gcagtgagccgagatcgtgccactgcactccagcctgggtgacagagcgagactctgtct
-caaaaacaaaaaacaagcaaacaaaaaaacaaaaaaaaacaaaaaatccccagcatggta
-gaactgtgcaacacaaagagtgaactgtaaggtaactgtggatttcagttaataattgtg
-tgtcaaaattggtttatcaattgtaacagatgcaccatgcatttgcactaatgcaaaatg
-ttaataacaggagaaactgcatgtttggagaaggagtacaagggaactgtctatgatttc
-tgtgtcatttttctttttcttttctgagagagggtcttgctctgtcccccaggctaaagt
-acagtggcacgattagagtccactgcagcctcaaactcctaggttcaagcaatcctttag
-cctcagcctcccaagtagctaggaccacacacatgtgccaccatgctagggaaattaaaa
-aaaaaaattgtggagacaggttcttgctatcttgctcaggctggtctcaaactcttggcc
-tcaagcaatctccccatctcggcctcccaaagcactgggattacaggcgtgagccagtgt
-gcccagtctctgcacagttttgctctaagtctaaaacttctctaaaaaagtagtctatta
-aACATAAAAAACAAAATGAAAACCCCCacacattgtgtttatatgtaaaatagaattcgg
-tccttggctcagataattaaaaacaaggtttttacctacactaattaccaaagggagatt
-tgaaaatcatgACTTGAGATGCACTGCAGGATGTCTGCACCCTTGCTCCCCTCCTGCATG
-GCCGGGGCACCCCCTGGTCACTGGGAACTCTCCAACACTCTTGGTGACATTGCCCCCTTG
-AGGATCTCTGCACTGGATCTTTGCTCCCTCTCCTGCAGAACCCACAACTGCTGACTTACT
-GATCTTGGGTGATGTCTGATTAAAAAGTCTCCCCAGGCTTAGGAAACTCAAGGTGCCACT
-GTGGACACAGCTCCCACATTTCAGCTTccagaaatcctgcttcaaatccagatcccagca
-ctccctcattatgtggacttgaatgagtcacatcaatttattgagcttcagtttccccat
-tgatgggaaaaagggtgattgataatacctgccatactttatattcataatgaatataat
-gagtatattcattaactcagtaaatatatattgaacacctactgtctgtgctgagaattc
-aacagcgagcagaacaaacatctctgccttattggagcttatggtctcgtgatggggaca
-gacaaaaatcaaacaaatatatgagataatgtcagtgataaataaaaataaggcagagtc
-acagatggaaagagggtagggcaagggatccttggtaagtgtcgtcctggatggcttccc
-agaggagatggcatttgaacagggctgggaatgaagtgaaggaacgtgccacgaaagtct
-cagggcgaagaggcaacagcaaacaccaaaaccctgaggtgggaatgtgcttggtgaatt
-cgagaaacagcaaggaggccagtgaggccggtggggagtaagagggaagagaaagtgagg
-acagagagatctggagaagccagactctgtaAGGAATTGGGGGTTTATCCCAAGTGCAGC
-AGGGAGAAAACTTGAAGAGTTATTTACTGGGGAAGGCTTCCTGTGTTGTGTGCCCTTGCA
-GGTGAGAAAAGGTGATGAGCCCACTCTAAAGCCAACTCTATGGCCCATGACCGTGGTCTG
-GGACACTTTGAGCAGAAAGCGTCCTGTTCTCCTTGGAGTCAAAGGATTGGTGACAGTGTC
-TGCCATGCTGTAGTTTCCACAAAATACCACCAGGTGACGACTCTGGGTCACGCTTCTAAC
-TTGTGGGTTCTTGATTcctggagggcttttgctaaaacacagactgctcctggccccagc
-cttccaaagcgctggattacaggtgtgagccaccacacctggccTGACAGCCATGTTTTT
-AGCTTTTAAAAGCAAAACTTTGGCATTAGCACTATctctgtgagaggggccgatcattcc
-tgttttccagatgggtctatgaggctcagagaggagaaatcattgtctccatgagcaaaa
-gtgataaaactggcactcggcccccatgtctgcctgacttcaaggcccccaatccttcAG
-GGATGCCACACccatgtgcccagtgaggctctgggaattttaaaaactcatccaatttaa
-tccttacaactgaacaaatcccatgcaacgttaatgtctccattttagagatgagaaaac
-tgaggactagaactgagaaataagtcacctgatgtcgctgagctGTTCTAAGGCTGACAT
-catgcattttggagtcagagagacctgaatctcaactctagctcacactctccctagcta
-tgttcacctgatttctctgagccacagtttaagatgggaataagagcccctcctgcttgg
-tagctgtTGGTAATATTTATGAACAAATCTAGGCCTGGGGCCTCTTAGGCTTACAGTGGC
-ACCAGCCTCTTCTGTTCTGGAATCAGGAGGGAAAGTGATTGACCCGGCATTGGCCATCCC
-TGGCCTGGCTGGGATCAGAAGGGTCCTGGAAGGATAGGCAGTACCCGGCAAAGACTGGGG
-AGGGAGCTTGCTTAGCAGAGGTGTGAGGGACCTCACAGGAGTCCCCACAGGGTGTCCAGG
-TAGGCATAGGTATGGACGGCTGGACAGGGACTCCAGTTGGCCAACCAAGAACAGGGATAG
-AGCTTGGGCTTTGGGGTCAGGCAGCTTGAAGctctgggttccagctcccagatctgtaaa
-gtggaacagtaatgactcttccctgttttggattattgagaggaCCCCGGGGAACAGTGG
-GCTCAGCTGGAGGGATGACATTCTAAAGTGTTCTCTGGGACCTTAACCCCAGTCTCACAG
-GAGATGGGCCTTTGACTGTGGCCTTTCTGAAACCTGAGAATGTTAATGGTCACATAACGT
-TAGTAACAGTGATGGCAGATAACATCTGTCATGGATTAGAGGCCACTGGGAGGTTCTCCC
-TCACAGTTCTGGGTTCTTTGGATCAGAAACATGGCACAAACACACAGCCAAGGGTGGTTT
-AGGGCCTTGCAACTTACAAAGTCCTTCCATAGCATTGCACTGCACCCTGTGTTAAGATAA
-ATTCTCCAAGCTTTaagcactctgctaagtgcttgacaggccttattttattcttccaaa
-acactttgaagtgggtgttgccttgacccccattcttcagctgaggaaatgggaggcata
-gtgaggtcaagtgacttgcctaaggctactcagctggaacgtagagcgcctcatcccatg
-cttgactctgaGTAGAGCAAGGGTTGCACAGCAAGTCAGAGGCTGAGAGGGCCTTGGAAG
-GACCCGAGGCTCCCCTAGCCACTCCTGCCTGGCACCGATTCCTCCAATCCCACCTGGAAG
-TGGCTGGAAGTGAGAGGGAGAGGCGGTAGGGGTGCTGAGCCTGAAGGGAGGTTTCAGGAC
-TCAGGCTAGGAAGGCAGAGAAGGAGAGGAGGGACGGAAGTGCCCCTTCCCCCTAGAGCCA
-CTGAGGGGAGAGATAAAGGCATGAGGAGATGTAGCTGGGGCCAAGACAAGGAGGAAGAGA
-AGAGCTCAGGAGCTAGAAGGAACAACTATCTGGGGAGGAAGCCCCGTTCCAAGAGAGAAG
-GCCAGGGATGGGAAGGGGTGGGCCAGGCCCTTGGGCTGGGGTCCTGGGTCCCAGTTTTAG
-CAGGTAGCAAGACCCCGAACTGGATAGAGGGTTGCCTTCAGTAGATACCCTATCATTCCT
-GTGTTATGAGAGGTTGGGGCCACTTGAGGTGAGCCCAGGATTCAGCCTTCGAGGCTCAAC
-ACACTTGAGTCCAGCTGAATGACAGAATGAGCCATAGGACACTGTCCCAGGCCTGACttc
-cttccttcaacaaatatctatggaggattcaccaagggccaggctgggctcccagcagga
-aacaaagtccctctgaagagagactaacaccttcgttaaggagcccccaatctcatagga
-gagatggacaaaaagcagaaaatgaattggtatccagtatcacttttggctgtaaaggtg
-atcaggggaaaatgaatggattggagtctacctattttgtgatggcggtcagggagggcc
-cctctgagaaggtgtcatctgcacagaggcctgaaggagatgaggcagtagctatgaatc
-tgggggaagagcatttcaggcaagcgcaaaggccagggcaaaggccttgaggcaagaaga
-tgctgctgtggaggaaggagggcaccaagcaaggaggccagtgtggctgctggtgagaga
-taagagagtgaaggaagatgagggtagagtccggggggcagatcacatagggcctcaaag
-gccactctatggattttagctgcatctcatgtgacatggacattgaaggaTTTTTATGTG
-TGTGTGTTTGTTTGTTTGTTTGTTTttgagagggattctcgctctgtcacccaggctgga
-gtgcagtggcacatctcggctcactgcaacctccacctcccacattcaagcgattctctt
-gcctcagcctcccaagtagctgggattacaggtgtgtaccaccacgcttggctaattttt
-gtatttttagtagagacagggtttcaccatgttggccaagctggtcttgaactcctgacc
-tcaactgatccacctgcctcggcctcccaaagtgctgggactacaggtgtaggccactgt
-ggcctgtgacattggaaggttttgagcagaggtatgtgttgtgacctgactcaggtttta
-ccagaatccccctgagagatgttctggccaccactgaagaagactggagggtagagcagg
-caagggctgatgcagggagcccagtgaggaggctGGTCAATGAGCACAGCAGTTTGGCCA
-ACGATCTGGGGTGCTAAATATCAACAGAAACAAAaatatttattgcatgctttctgtggg
-tcacaaactattctaagtggttgcttgacatggaatgcttttaatcttcagtacagattt
-taggtagatcatatttttgtACATTTATGTCTATTTGTCTCTGGACTGATTtttttttaa
-ttgagatgaaattcacataatataaatcaaccatttgaaagtatacatctcagcggcatt
-tagtatattcacgacattgtacagccacacttctgtctagttccaaaatattttcaacac
-cccccccaaagaaactttgtacccatcaaagatagatgatatttttatcctaattttaca
-gatgaacaagcagaggcgtggacaagcagagtcacgtgccccaggtcacacagccaggaa
-atggaacaagctggCCACAGGTGTTGGGAGGAACATGTTGACAAGCTGCCCAGGATGGCC
-TGGAGGCCCCTTCGGGGTCCCCCAGGTAATAGCACCAAACTGCCttttatttttatttat
-ttattttgagacagaattttgttcttgtcacccaggttggagtgcaatagtgcaatcttg
-gctcactgcaacctccgcctcccgggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgtgccaccatgcctggctaattttttgtatttagtaaagacag
-ggtttcatcacgttggtcaggctggtctcgaactcctgacctcaggtaatccaccgcctc
-tgcctgccaaagtgctgggattacaggcgtgaaccatcatgtccagccCAAATTGCCTTT
-TAAGAAGGGCATGTCagccgggcgcggtggcttacacctgtaatcccagcattttgggag
-gctgaggcgggcggatcacctgacgtggtgagtttgagaccagcctgaacaacatggaga
-aacccgtctctactgaaaatacaagattagccgggcatggtggtttatgcctgtaatccc
-agctacttgggaggctgaggcaagagaatcacttgaacctgggaggtggaggaggttgcg
-gtgagccgagatcacgccattgcactccagtctgggcaacaagagtgaaacaatgtctca
-aaaaaaataaaaataaaaataaaaataaaaataaaaaAAAGAAGGACATGTCCTCACTTC
-TGGGCTTTTGTTTTGTGGAAGGGGTGGGATACATTTGAGGCCAGAAAACAGAAAGCACTG
-GGAAGGCTGAACAGTGGCCCCTGCACCCTCTCTcaggatggtgcacagaggagaatgggg
-actctggagccaggctgttgagttcaattcccttctcccacctttcttccatgttgtgaa
-gttgggataataagagcaccaatctcatcagtgttgggggaaagtgaatttcccatcagt
-agagctcagcactgcccgtagtatttgctcaatcaaCAGCAGCCTGCATTCTCTTTGCTG
-CCCTCTCCACTCCAGGAAATAAGTTAAGCAGGTACCTAAATGCAATCTCAGTGTTGGGCC
-TCGTAAAACATCTGGGACAAGACATCCTCCATTACCAGAAAAAATGCAGTCATAAAAATC
-TCAAGGTTGACAGGATAGTGCCCAtttttatttatttattattattattattattttgag
-agaaagcctcactctgtggcccaggctggaatgcagtggcacgatcttggctcactgcaa
-cctccacctcccaggttcaagcgattctcctggctcagcctcccgagtagctgggattac
-aggcacctgccaccacgcctggctaatttttgtatttttaggagagacagggtttcacta
-tgttggccaggctggtctcgagctcctgacctctagtgatctgcccgcctcggccaccca
-aagtgctgggattatagatgtgagccaccgcacccggccCTGATACCCATTTTTAAAAAT
-CACATACAATCAAAATTCAGGATATAATTTACATAAAAACAAAAGCACTCATTTTGTCCA
-TCCCTTGCTTTGGGTTTATCTACCGGTCTTGTTGACTCCATTGCTAATATACATCCAGGT
-CCCATCCCATCTTCCCAACCTTTCCCAGTCTTTCATCCTTCAGCTGCACCTCTATGGCAA
-GGAGCCACCTCATGAACATCAGTTTCAGACTTGACAGCTGATGGCCGGGGGTGCAcatgg
-gcttgtggagacacggtcagggagccctgggtctacacctgagtctgcctgggccgctgt
-ccgttgtgtaatcttcatcaggccacatcctctctctgagtctcagttttcttttcctta
-aattggagatgaaaaagtctgtctcacttggcagtcaagaaggtccaacaggataaCTTC
-ATCCATGGTGAGAGAGTGGAGGAGAGGCCCCCAGGAGGAGGCAGGGATCTCATTCTGCGG
-GTACTGTACTTGGTTCTGGGAGTGGGATGGCAGACAAGCGTGTCACTGTCTTTGTTCTCA
-GAGCTTTGGTTGTGGAACGGGAATGGGAAGGTAAGGGAGGGTACCCCTGGCAGGGGCACA
-GCATAAACCAGGGTGTGGAGATGGGATGGCGAGGCAGGACTGCCCCAGAACTCTGTCCCC
-AGGGGCTGGCAGTGCTGAGAGGGACAGAGGGAGAAGCGATTGTTTATTCTCAGCCTCAGG
-AGGACGCAGGAGAATCTCAGGCATCAAATTTAGTGCAGCACACCTGCCTAGGCAAAACTG
-GACAGCTCCACCTCAACTTTGTAGAGGGGCAGAGAAAGCTGTGGGGAACCACCTTCCTGC
-TCTTGTCATGAAGTCCTCCTCAACTGGAAGCCCAAGCTTCAGGCCAGGAACTTCCCCAGC
-AGAGGCAGCCTTCCCCAGGGGGCCAAGACCTTGGCAGAATGTCTGGGGTGCTCATGGCAG
-CGCCTCTCACCTGGCCCCTGCCAAATCAGTTTCTGCTTGGCCTCTGCAGGATCTGACCTC
-GTTGAGTCCCCAGGGCCCAGTTCTCTGCCTCTGAGGCTAAAAGTGAGATCGTTTCCTGGT
-TGAGGAGTGACTAAAAGACTTCTGTGTgtagagactgggttttgctgtgttggccaggct
-ggtctcgaactcctgaccccaagtgattcaccTTAAGGTGAATGTGTGGCTGTGTACGCG
-CACGTGCAGAGCAGAACCATCACTCTGCTTGGGCTAGGCAGCTGGACTAATCGTCCATTT
-CCCCCCGCCCGGAGGCCTCTTCCAGGCCCCCAGCTGCCCTGATGGGCCAGGTCAGCCCCC
-CCCACAGGAGCCCCCAGCCGCTCCCCATTCGGCTTTCCTTGTATTGTGCGCTGCCTGGTT
-TCTCGAGGAAATGGGGCGGCTGCTGGGTGCGGGGGCGGCCGCCAGCAGCCCCACCCCCTT
-CCCCCCATTGTCACTCCTGGCTTCTGCCCCTAGCCCCTGCTGCTGACACTAAAAATAGAC
-CTGTTCACAGGGAGACGGCCCCACCCCTGAGCGGGGCCCCAGGCTCAGTGTCAGGTTGGG
-TTTGCCAAGACAGAGCTGCCCTGGGGACTGAGGTGGCTCAGCTGAAAGACCGGGGTCGAA
-ACACGTTAGGgctgtgtgaccttaggtccccttttctcctctctgagcctcaatttcctc
-acctttaaaatggggtaaggctacctacctgctaaggttgctCTTGACAATGAACAGAAG
-CTGGGTGAGTCACAAGCGCACTTCGTTCTCGTCCTGCCCGTGGTTTGGTGCTGCCTGAGC
-GGCTTGAGAACCTGGAGGACAGATGGCATAACACACGCCTTCATCTTCAATCTGCCTTGA
-ATGATTGCCAAGGACTTCCAAATCCCCCTAAACAGAGGAGCTGGAAGAGCCCACTTGGGA
-ATCCAAAAGTGTCCGCAGCTCTGCTGTGTGAGCCCGGGTAGGTGCCTCCTCTCTGGCATC
-CATGagctcacacgtgaagtatgcagccaggctgggactcgaacctgtgtctgcagcctc
-tgaagactgttttttccgctttaaggggctgcctcCATGCTGATGACTCCAAGGACTTCC
-TGGCTGGGATAACCCTGCCTTTTCGTCTACAAACACATGATTCATGGTGAAGGAAGATGC
-TGGGCGGTGGGCATGGAAGCCTGAGCTGGGGGCTGGGTAGTTCCCCTTGAGCCCATGCAG
-ATGGGCAGCTGTCCTCAGATGCCACCCGCAGCCATTGGGTTGGGCCCTGCAAAGGAGATA
-CTGGCATGTGTCTGTCTACCAGGCTCTTTTTTGTTGTTGTTCCTTTGTCCTTTTTTTTAA
-ACCATGGAATATTTCAAATATGGGTCTTTCATATACATTCAAAACCTTGAACTCTTAGAA
-TTACTTTTGTCACAGTTGCAATTTTTTTTTAAAtttttatttcatttgtctatttatttt
-ttgagacggagtctcgctctgttacccaggttagagtgcagtgacctgatcttggctcac
-tgcaaccttcgcctcccaggttcaagcaattctcctgcctcagccttccaagtagctggg
-attacaggcacgcaccaccatgcccagctaatttttgtatttttagtagagacagggttt
-taccatgttggccaggctggtcttgaactcctaacctcaggtgatcggtccaccttggcc
-tcccaaagcgctgggattacaggtgtgagccagcgtgcctggccTGCAATTTGATATATG
-TCTATGTAATTACCTATCTCCCATTAATCCTGGGCCCTAGAACAGGGACTGAGACTTTAT
-TATTAATCCATGTATTCCCCCCCAAAACAAATACAGTACTGTTATTCTCCCACACAGACC
-CTGAGAGCAAGCAGACTTGTCTCTATTGTTTGTGTTTTGGGATTTGTGGGGACACCTTGT
-GACCCAGTTTTGTTGTAAATCTTGTCCATGGGGTTTTGGTTTTGCTACCTAATTGCTTTG
-CCAATTTTTATGTGGGGATTTAGAAAGATTTAAAAGCTGAGTTTTCCACTGCAGACATAC
-CCATATTCCCGAATCTTGACTCTTTCTAAATACATATGTACATGAGAAAAAAAAAATCAG
-CACTCAAGGTATTCAGTGACAGGTTTCTCTCAGAACCTGGAAATGCTGGAAATGACCACT
-GTTGCTTAGTCGGGGCTCCtttctttcttttttttttttttttgaggcagagtcttgctc
-tgtcgcctaggctggagcgcagtggcgcaatcttggctcactgcaacctctgcctcccgg
-gttcaaggaattctgcccaagcctcctgagtagctgggattacaggtgcatgccatgact
-cccggctaattttcgtatttttagtagagatggtgtttcaccatgttggccaggctggtc
-tcgaactcctgacctagtgatctgcccacctcggcctcccaaagtgctgggattacaggc
-gtgagccaccgcacccagccTGAGGCTCCTTTCTTATATTTTATGTGTATCAAGCAAACT
-TAGGTACCTGGTCTAGTTCTTACACAAAGAGTGTACTTCCCCACTTAAAAACGGCTACAT
-TGggctgggtgtggtggctcatgcctgtaatcccagcattttgggaggctgaggcgggtg
-gatcatttgaggtcagaagttcgagaccagcctggccaacatggtgaaaccctatctcta
-ctaaaaatacaaaaacattagcccggtgtggtggcagatgcctgtaatcccagctactct
-ggaggctgaggtgagagagtctctcgaacccaggaagcggaggttgcagtaagctgagat
-cacagcactgcactccagcctgggtgacagagcaagactctatctcaaataaataaataa
-ataaataaataaataaataaaataaaATGGCTACATTAAAAGTAggatttttagcttttg
-ttccatagacctcttcggcatatggtgaagtggggatggaccccttctcaaaatgtggtt
-tttttttaattagtctttttttttttttttttcaatagaggtggcgtctgactatgatgc
-ctagcctggtctccaactcctgggctcaagtgatcctcctgccttagccttccagacagc
-agggattacaggcatgagctactgcacctggatttttttttaatgttttataaatgcata
-aaataaaatgcacgatattacaaaggaaaccaattatactgaaatgctattactgcaata
-taaacaagggtttgtgatgcagtgatgaggtgaacttctttattagtacattaaataaca
-agatggggaagcaggttgcaggtcaccatgaacgtaaacaatatgtaatgttatctgcaa
-ccactgtgatatgaaatgaaagtatctttgacttctgttgtaacagtcactgctaaccct
-accatgcttcttgatccacattcatacttgaaggaaatgctgcatttcaattagaggtta
-gtgaatataaagttattttttcccacctaagttcatgaagtttctgagttctagatcagg
-taaagaacccctgCTAAAAATTGTGGCTGTCCCTCACTTGATTCAACCAGTCTCTTATTG
-AAAAGTCACCCCacctcagcatttcttcaaatctcatccttatgcagttggggaaactga
-ggcccaggctggagaacaaacttgggtcattctgccctggggggattgcagaatccagtg
-tcctgattcccggctcaggttattttccagctcctcccctaccagGCGGGTGGCAGGGAC
-CCCCCCTCGGCCCCACCTCCCTGCTCGCCAGGAGCAGCTGGCGTCCTGTCCCGAGAGTGA
-CCCAGCCCCGCCCCGCCCTCGCCCCACCCTGGCCGGCCAGCTGTGGATGTGACAGGAGGC
-TTGGCTCTGGCTCACTCCGGCACATTCCTGGCCCAGCCACTGTTTTCCTCTTCTTCTTTT
-TTTTTTTGGTGGTGACTTTTTCTCCCATACCCCTCCCACTCCTTTTCCTCAAAAATGCTG
-TGTCTTTCCCCAGAGGGTCCCTCTGGGCGGCTCCGGGAGGGAAATGTGGCCTGGATTTCC
-TGGAACGCGTGGAGCTGGAGTCTCAGCGCTGGGAGGAGGGAAGCTGTTGGCAGCAGGGCA
-CCCCCCCAACATAACTGGGCCTCCCTGGAGAAAGAGGGTGAGCGGAGCCTCAATATTCCC
-TTTGCACTGGGCCCTCTGAGCAGTGGCACCCGCAGCTGCAGCGAGTGGGCTGCTGCCTCG
-GGGATAGTGAGACGCCTCTAGGAAACCGCGgctctgtgatcttggggaagctgggcattc
-tctctgagcttgggtttccttgctccttagaactgaggatgtgatctggatctgccacag
-ctggtgggacagtccagtgaggcgatggctgtaCATGGTCCCTTTCCAAACAGGGAACAA
-GAAGCGAGGTGTTGGGGGCATCTGGGGATGCAGGTTTGGGGGCTGCATTTGGGGCAGCAG
-GGGTGGAACAGAGAATTTCCATCCTTCCTTCTTACCTTCATTCATTCATGAGACAAACGT
-GTATCAGACAATTACCATTGTGCCTCTCGGGGCTCacaataagagacaagtaaatgtctc
-ctgtaggggcaggtgcagatgagtgctctaagaaaaagtgaagcagggtGCAGGGATAGA
-GTTTCTGAGGGTGCTGGGGGGAGCTGCTCTGCTGGGGCACCACATGAGCccaggcagagg
-gagcagtgggtgctgaaggctctgaggtgggagcaagcaaggaagggaagagaaggcaag
-gtttgtgtggagtgggggagacagcagagagggctgtggggacttctgggtgaggcgagg
-actttggctcgattcatgggaagctacgaagggctttgagcctgcagtgacacagtctgT
-AAAGGACCCACGGGGCTCTACAGGAGGTgcgcacgtggaggagtgacttggaggccaagc
-agctggggtcctggcttcagctcctccctggctctgtgagcgtggacaggatgcttctcc
-ttgagcctcattttcctcctcagtagagtgggctcatggagctctgaagactaagaggaa
-gggTCATCAAAGTGATGACCCTTTGCCATCACTTTGCCTGTGAGCTACAGGTCTCTATAA
-GTGGGAGCTGTTTTTTTCTATGAGCCTCTGAGGATTGGAGCCACTTGCTTAGGGGGAGGC
-TTTGGGGACAGAGCCAAAGGCTGGTTCCGAGCCCAGGTAGAGCAGTGGCTGCTCAGATTT
-TGGGGACATGTGGTGTCATGATCTGGGAGGGGGATATTCTTGAGTTGTCTGCAGCCCTTT
-TCCCCTTATGGGTACGTGGCTGGATTTAGGGAACCCTAGGGCAAGGGAAGAAGGGCTAGG
-AGCTGCCCCTGAGATCTGTGAGATGGGAGGTGGCCGGGTGTTCAGAGGTTCTCTGAGGTT
-GCAGAATGCCCTGTCAACCACTCTCCCATACCCAGAGGGGGCTGGACGCATCCCTCTCtc
-ccttgtcctcagtctcgattttctcatctgtgaggtgggcacaacaagtcctaatcctgg
-cagTGATAGGAACGTTTGGGGAAGCAGTGATTTGTCATGCATGATGCGGTCGGACAGGAC
-CCTGCCCTTAAGAAGGAGGGAGCCCACCTGCCCAGGCACTGTGCTGAGCTTCTGTGCATT
-AGCTGAAAGTGGACAGGATGACGTCACTTCACTGGAACTTTCTGTGGCTTCTCTTTGCTC
-TCCTATGGAGGTTCCATGGGAGGTAGGAGCTGGGGGCTAAccctgcataccttataaacc
-tcaactctcacatcctcctggctttctgtgtccaggttcacaggcctcctgaatctccct
-ccttaatgcccacgttgttctggcctctgagacattgtgttactccctgaattccttcct
-cttgccctagtaaactctccctccctgctcagctcagtttaactatctcttcctagagga
-agcccaccctgtcctgtagactaggctgagtctcacattgcggcatcttaaggtgctgcc
-tcctctcctggtaacacctgtcgctgttgtaatttcacaggtgttgctgcaattacctgg
-ttgctgactctccccacattaggactgtgtgttccatgagggcagggacgttttctcgat
-cacagccatatccccaacagtaatagcaaattgcagatgctcaataaatgctttctggat
-aaatggaGGGGTGAaatcattttgacaatcagaagaagaaggtgccccccttttacagat
-aaggaaccaaaggtacagagagattaagtaacatgccccgaggtcacacagccagaatca
-gatggTGTCTGTCTGGGAATGTGTCCCTGCAAGCCAGGCCTAGAAGGTGGGCAGATGGGG
-TTACGCAGAGAGGAGCTAGGACCATCTGGATAAGGGAGGGTTGTGGGGGCAAGCCCCACC
-CATCCTTGTTTTCTCCATTCGAATAGTGGTTTGTGGCTGTTTTCCTCAAGGGCGACTCAG
-GTGACCTTCAGGTTGGGGCCTCCTGGGTCCCAGGGGCCTGCTGGGTGGAGGGCCCGGTCT
-GGCTGGGCTGCTTTTCTCGCCCCTTTGCCGGCCCGCTGGCTTCACGCACAGATTACAACT
-TCCCCTCTTCGGCCGTCTTACGCAGGCCACCTCCGGCTCGCCATTGTCTCATTGTTTGCT
-GAGGGAAGCTCCAGGAGGAAATCAACCTGCTGCTCACCCCAAGCAGGGAGTTTCACCCCC
-AGCCCCCACCCAGGGAATGCCTGGGGGGAGGGCAGGAGGGGTGGGGGCAGGTAGCAGGCa
-atgcaacaggcagccttgaagggagtgagctccctggccgggaagtatgcaagcagaagc
-tacatTCACAGCACCTATTTACTAGGTCCTCTCCCAGGCTGCACGTCAGGCAGCTGGAGA
-CACAGATGCTAGAAAAGGGTCTTGTCCTTAAAGACCCTGTAGCCTAGAAGAGATGCTGGG
-CAGGGCCTCAAAGCCAAATGCCTTAGGGGCCAGACAGGTGACAGAAATCTGTAGGCCTGC
-GAGCAATGCTGAGTGGTCGGGACGTTAAATGAAAACTATGGTGCGAAGGAAGGCTTTTAG
-ATTCCAATTTTATTTTAACATGTTGCTAATCAAACAAATGAGTCCTCCAGCCTGATGTAG
-ACTGCGGAACCCCAGCCTAGCCCTTTAGAAAGGAATTCTTGTTCTGGGGTGAAATTGGAT
-CAATAGTTATTGGTGTCTGCCCCTATGCCTTTAGCTATAGCTGTGATGGGCAGTTCCCAG
-CACACTGACAGCATCCCTTTTCAAACACCCAGCAGTCATTTGGCTTCTCTGAAGACTTGG
-GAACTCTCTCAGGGACCTGGgaggagttgatgccactaggggcacccctcagtcaatggg
-gaatgggagttagtgggtaaatgccccatcctcttatccattggaagttcctggtcactc
-aaaggtctgcagtgagttgggggcactggttgcccatactggaaactggctcaataactc
-actttttatccgtttcccctcttcgctgtcactctcccagatccctctggcttcctgggc
-taccggctcccaaattcttgtctcaggctctgcttttaggggaacccaaactaaaacaGT
-CTCTAATATTCTTTCCAAATAGCTTATGATTGTACACTTAGGTGATTCTAATATCCAATG
-ACTTTAACTCTGTGATTATAAGTTTTCATAAGTAAACCCAACTGTGATTCCAGAATGATG
-TCATTCTAATATGGCCGAGATACACCTATCAGAACTGGAATGCTCCATTTTGTACAACTG
-AATTTTGCTTCTCTTGAGCTCCTATTTTTTTTTTCCGATGCCAGAAAATGCAAACTTCAA
-AAAAATCTAGACAAAAACCAATTATTTCAGATTTGAACTCAGTTGGGTGAATCAAGCTTT
-CCCTGGCATCCCTTTTTTCCCGGATTCATTTAAGTCCTGGAAGGGTAGAGGCATCTTGGC
-ATTGGTTGAGGGAAGAAGGGGTCTGTGACTGGTGTTTCTCAAGCTATACCAACCCATCTG
-GCTCTCCAGCATGCTTCTGCCCCCTTGGCATTCACTGGAGATGACCCACTCATGTTGATG
-CTTTGATCTCTAGGGTCAAAGAAGCATAGCTTTCTCCTCCTGGACCATACACTGTAAGAG
-TCACGTCCACTCCATTCAGTCATCTGAAAAGATGTGTTCACTTTTTACACCTCACAAGGC
-CCTGTATACAAACTCGtcattcaatcaaatgtacttgctgagtatccggcatgtgttggc
-attgagccaggcactgaggatacaaagatgaaaagacaggtccctttcctcaagtcattt
-gcaagccaaataatgtataaatattttcaacttacatattgtgatgtccattatgaagga
-accaaatagggtaggcagagaaagcctctttgaagagctgtcattggagccaaagtctaa
-agtcaggggaagccacaaaaaggtttagcaagaaagaCATGTCTGATTATATCTGTAACT
-GTAAAACATTTTCtttttctctttctttcttttattattattttttggagacagggtctc
-actttgtcacacaggccagagggcactggtgcgattttggttcactgcagcctcaaccta
-cggggctcaagcgatctccttcctcagccccccaagtagctgggattctaggcacatgcc
-accatgcccagttaatttttttgtattttttgtagagatagggtttcaccatgttgccca
-ggctggtctcgaactcctgagctcaagtgatatgcccaccttggcctgccaaagcattag
-gattagaggtgtgagccatcacgtttggccGGTAACTGTAAAACTTTTTGTAATACTGAA
-GGCATCTCCTGCATTTTTTCATACATTTTACTTTTCCCCTATTTATTGGTGGCCTCCATC
-ACCTTAGAGATTCACGTCTCAAAGGACAAGAGTCATGGAAATTTAGTCAAAGCCCTGAGT
-AATTTGAGAGTGTACAATTTATGCCATAAATAATAGATTGAGAAGAATAGATGAGTCAAA
-TTGGTTTTCCTCTTTAGGAAACGAGATAAAGATTATCGGGAGGTGGGGAGAAGGGAAGtg
-tagcagagatgtccagctgtcatgcaattacccgacttccccttcttctatagctgcaga
-tggccatgtatctacactgcatttcgctgtctcccttgcagtttaggcgtggccacgtga
-ccaggctctggcaaaggatatgtgaaccgaatggtgtgtgcaacttctgggtcatgcatt
-gaaagaaaaaaaggggcatcctcttcccacacctcttcttcccttcctgccagctagaat
-ttggcatggtggcaggagcagtagcagccgtcttagaccacaagactgaagccacacgtt
-gaggatgtcagaacaacaaaatggaaggatcccaggtatctgacgtcatgggactcatag
-cggcctagactgcttgccccctactggttagtgagagagaaatcaaTAGCTGAGTTAGCA
-TCCCAAGTAATACAGAGGGTCAGAAATATAGGAAATTagcctgttgctgtggctcacgcc
-tctaatccctgcactttgggaggctgagttgggcagatcacttgaggtcaggttttgaga
-ccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaactagctgcggc
-atggtaggacatgtgcctgtaatcccagctactcaggaggctgaggctggagaattgctt
-gaacccgggaggcagaggttgcagtgagctgagattgtgccactgcactccagcatgggt
-gacagagcaaggctctgtctcaaaaaaaaaaaaaaaaagaaaggaaagaaaTATAGGAAA
-TTAGTGTGCATAGACACTGGTGTAACCCTGAAAAAAGAATAGAAACTTCGTGTGGTCTTG
-AGGGGTCTAAGGTCTGGGCCCAGAGCCTTAATTCTGGGTAGAACCCAAGGAAGCCATGAA
-CCTAACTGCCTGAGTGTGTGTGCAGGCACCTGGAGCAGGACACTTCAGGGGAAGGGAGGT
-GAACTGAGGGGAAAAAGCAAAAGAAGACACCCAGAATTGACCAAGATTAAGTTTCTCCTA
-CCTAGTGGAATGGAGGCTATTTATTTTGGGTGTGAGCTGAGAGTTGTACCTGCTTCCCAT
-TTTATTATTATTGTATTATTATTCCTGGATCCCAGCCCAGCAGTTAACAGGAACCTGAGT
-GGAGGCTGAGTTTTATCAATAAATTTTTGCTGAGCACCAaggcccaggctcaggtcccag
-cctagctccctacttgctgggtggccttgagcatgttacttctcttttctgagccttggt
-gatctcattgggaacataaaggggttgaactccaggatgctcaaggtggctctttttgca
-ttgatgtcctgtggttttTCTCTGGGTCTGGCAATGAGGGCAGTTCAGGAAAAGTGTGAT
-AAAATAGCTCTACTTTAGTTCATAGAGGGACAAGACACAGTCACATGGGcacacatgtac
-acacacacacacacacacacacacacacacaAATGTGATTAACCAAACATCATGGTAGCC
-AAGAAGATATGTAGCATTAAGGTTTagaatacaggctttgaagtcaaacagaccagagtt
-aacaacctcattttgtttttattTTCTTTTTTAAAAtttttttaaaattatactttaagt
-tctagggtacatgtgcacaacgtgcaggtttgttacatatgtatacatgtgccatgttgg
-tgtgctgcacccattaactggacatttacattaggtatatctgctaatgctatccctccc
-tcctccccttaccccacaacaggccccggtgtgtgatgttccccttcctgtgtccaagtg
-ttctcattgttcagttcccacctatgagtgagaacatgcggtgtttggttttttgtcctt
-gcgatagtttgctgagaatgatggcttccagcttcatccatgtctctacaaaggacatga
-acacatccttttttatggctgcatagtattccatggtgtatatgtgccacattttcttaa
-tccagtctatcaatgatggacatttgggttgcttccaagtctttgctattgtgaatagcg
-ccgcaataaacatacatgtgcatgtgtctttatagcagcatgatttataatcctttgggt
-atatacccagtaatgggatggctgggtcaaatggtatttctagttctagatccctgagga
-attgccacactgtcttccacaatggttgaactagtttacagtcccaccaacagtgtaaaa
-gcattcctttctccacatcctctctagcacctgttgtttcctgactttttaacgatcgcc
-attcttactggtgtgagatggtatctcattgtggttttgatttgcatttctctgatggcc
-agtgatgatgagcattttttcatatgtctgttggctgcataaatgtcttcttttgagaag
-tgtctgttcatatccttcgcccacttgttgatggggttgtttgtttttttcttgtaaatt
-tgtttgagttctttgtagattctggatattagccctttgtcagatgagtagattgcaaaa
-attttctcccattctgtaggttgcctgtttactctgatggtagtttcttttgctgtgcag
-aagctctttagtttaattagatcccatttgtcaattttggcttttgttgccattgctttt
-agtgttttagtcatgaagtccttgcccatgcctatgtcctgaatggcattgcctaggttt
-tcttctagggtttttatggttttaggtctaacatttaagtctttaatccatcttgagtta
-atttttgtattaggtgtaaggaagggatccagtttcagctttctacatatggctagccag
-ttttcccagcaccatttgctaaatagggaatcctttccccatttcttgtttttgtcaggt
-ttgtcaaagatcaggtggAGCaaccccattttcatcactaactagctggtgaccttggat
-aagtcactttatttctctgagtcttgggtttctcccatttaaaaggaggatgataatacc
-tatatttagggctttcatgtaataaaataaggtaatttatgtgcagctccaagatcacgc
-tgggcacgttacagatactcagtaaatggtggttattCTGATGAGGATTGTGAGCCATGG
-TGAGAATCAAGTGAAAGGTGGAGAAGGGCAGAGCTGGTGGGTCTTGAGTATGGACTAGGA
-AGATCCATGAAGTCCAGGGTGTAGGGAGGCTCTTGGAGAAGGCAGGACATGAGCAGTGCA
-GGGATGTGTAAAAGCGTGACCAGATGGGATGAAATACCCTTTTAGGAGAAGGAGAAAATA
-GACCCAGAAGCGAGGTAGAGCCAGGcttgagaaaattacttcctctttctgagccttatt
-tttcctcttggtaaagcgagtgtaacaatatctgccttgcaatgttgttatagcgattat
-tgagatgttagaagtcaagctcccattaagatgcctggctcatgtaaggcatcaaatatt
-agtttcattCCTTTCCCAAGAGAGGGTACTCACAAAATATCATCAGGGCTAgtaacacag
-aggataaatatttgaggggatggatacctcattctccatgatgtgattatgtcacattgc
-atacctatatcaaaacatctcatgtaccccataaatatatacaccgaatatgtaccccaa
-aaattaaaaATAAACAATTTTTAAAAAAATCCCCCAAAACAAAAACAAATGAACAAACAA
-AGACAAAATGTCAGGGCTAGAGTGACCCTCAACGCCTTTCTATGGTAACATACACATCTA
-TTCATGAACTGTTCACACAtcattcatcaatctatacagctatcacttatgcatttttca
-tatatccattcaaacaccaacaattcattcatcacccattgttcattcatctagccaaaa
-gtccattcatccttcactcaccatctatccttatccatcatcatgcattcatcagcaacc
-ttccatctgtctacctatcatctattctatattcatccttcatcaatctatttcatatcc
-atacacccattcagccagctactcaagcagccatcattctttcatctgtctatccattta
-tcatttatccatcatccacctatccacctgccattagttagccatcaccatctctcatga
-atttatttgttcctcaactatccattcttcatgcatctatccatctatttatcactcaat
-gatccatccatccattatttcattcatCATTTATGCACCCACCATTTTTCACGCATGAAA
-TATTCATCCAAAATCTATTCTTCATTTCTTCATAGCTATCATTTACAAGCCAAACATCAA
-CCCACCAATTTACTCTTCCTCCCTTCCTCTTCCATGCATCATCCATCCTTCATTCACTCT
-TTCACTAAACATCTGTCATCTATTAGCCATGCCTATCATCATCTATGTATCTTCCATCGA
-CATAACCACCTACGATCTATGTAATTTCATCATCCATCTGTATATGTTTatccagtcatt
-cattcatttatgtttcatcttccatattgcctgtcaggtaacatacaccagagatacaga
-ctaaataagctacaacctgtcctccagttgttcagagtctagtggagaaagataaataag
-cctatgatagctgctgtaccagaggaatgactgtaccaagcaccccaggggagaccacac
-aggagagagccacagactctgagggaactggggaaggactcacaaaggaggtggcagttc
-attaaactgggtctcgaagaatgattagaagGTCCACTGttttttttttttttttttttt
-ttttgagacagagtctcactctgtcccccaggctggagtgcagtggcatgatcgtggctc
-actgcaacctctgccttccaggttcaagcaattctcgtgcctcagcctcccgagtagcta
-ggactacaggtgcccgccaccaggcctggctaattttttgtatttttagtagagatgggg
-ttttaccgtgttggccaggctggtctcgaactcctgacctcaagtgatctgctcctgacc
-tcaagtgatctgcgcgacttggcctcccaaagtgctgggattacaggcgtgagtgagcca
-ctgtgcccagccCAAAGGTCCCCTGGTATttttatggggggaaatgagtcctaagagggg
-aagtgactgtgcataatcatactaagagttaattaacaggacagagacttgtaaccaagt
-ctctagcctactatactagttctgtttccactTCTTATGGGAAACAGTAAGTTACTCAAG
-GGAAGACAAGTAAGCAAAGAAAACCTGCCTCGAAGCACCAGAAGGCTGCTGTTTTAGGAT
-CTGGTTGTAGATGGGGTGGAGAAGGGGATTTTCCTAGACCTCAGCTTCTCATTCAGGGAG
-AGGTAACAGCAGAAGCCCCAGGAATATTTGACAAAGGGCAGGAAAGAAGGAGGAGGAGAG
-ACAGAGCACAGTGAGGTGAGGAGAAAAACAggtcaggcacagtggggctcatacctgtaa
-tcccagtgttttgagagatcgaggtgggaggatcacttgaggccaggacttggagaccag
-cctgggaaactccatctctaccaaaaaaaattaaccgggtgtggtagcatgtgcctgtag
-tcctggctgaggcaggaggatccccttgagcccaggagtttgaggctggctgcagtgagc
-taagatcgtgcctctgcactccagcctgggtgacagagcgagcccctgcttcaaaaggaa
-ataatataataataaaaaaaCCCCACCTACTATTTTCTTGTTACCTTTACTTGGGTAATT
-AATAATAATATTGTTACTGCTTggcacggtggcttatgccagcaatcccagcactttggg
-aggccgaggtgggtgggtcatttgaggtcgggagtttgagaccagcctggccaacatggt
-gaaaccgtctctactaaaaatatgcaaattaaccaggtatggttacacatgcctgtagtc
-ctagctacttgggaggctgaggcaggagaatcacttgaatccaggaggtggaggttgcag
-cgagccgagatcatgccattgcactccagcctgggcaacagagcgagagtccatgtcaaa
-aataaaaataataataaTGTTGTTAATATTCTAGCagccatgttttattgagcacagact
-acgtgctgaacagtgtgctatagatttttcatgcatcataccattttatacctcaccctc
-agcagccccaagaagcagttattactcttgtccccattttgtgaatgaggaaactaagtt
-cctgagaaggtaagctaggatttaaatatggtctgtgtgactacaaattccatgtccttt
-ccactcctctttgctgcctctctCATCGTTCTTTGGGTATGGTATATAATAAGTGACTCA
-GACATACATGTGCATTCACTAAGATATATGCTTCATTTTACTGGAGATTTTCTCTGTATC
-CTCAGACTCTGAAATAGTGGACATAGTAGGAAAGAAAAAATTTGTTGAATTTTCATAGCT
-ATCATTTACAAGCCAAACATCAACCCACCAAGAAATATCTTCTATTTCTTGTTGAATTAT
-CTTGCAAAGAAAATGGATAATCAATTAGAATATAGGGTATACAGGTTTGTCTATTCTGAC
-ACAAGTCCAAAGttttttgttttttttttttgagataagagtcttgctctgttgcccagg
-ctggagtgagtgcaatggcacgatcttggctcactgcaacctccgcctcccaggttcaag
-cgattctcctgcctcagcctctcaagtagctgggattacagctgcctgccaccatgccag
-ctattgtttttttgtatttttagtagagatggggtttcaccatattggccaggctggtct
-cgcacttctgacctcaagtgatctgcttgccttggcctcccaaagtgctgggattacaga
-cgtgagccaccgtgcctggGCAAATCTGAAGTATTAATAGCATAAAGATATAATTATTTT
-TCTCCCAGGTCCAGGAGTAGgctgggcatggtagctcatgcctgtggtcccggctacaca
-ggaggctgaggtgggcggattgcttgagctcaggagttcgaggttgcagtgagctatgat
-tgtgctgctgcactccagcctgggtgacagagggagatgctatctcaaaataataataat
-aataaTCCAGGacaagcttgtttgggtcccaggcttcttctgtcatgcagctctgccacc
-cccagggtgttgccctagtccccgtggtctcagatgccacccacatatctacaccacagg
-cagtaggcagtggaaaaggcatgaggcaactatgacttgcaggttgctctccccacttct
-gttcacctaccactggtcagaatttagtcatgtgatagtaaccagctgcaagggaggctg
-ggcaatgtagtctttattctgagaggctatgtgttcaggtaaaagtgagaggttttattt
-ccacaggagaaggggaaaatgggtatgaggggcaagtaggggtctctgGCGTAGATGAGA
-AGAAGATGTATGGACACCAATATTCTCTATCATGTGAAGACTCCTAGGGTCAcatatcat
-ctctcccattagacagcaagctccctgagggcagggggctagattaatcaccctggtgtc
-cctgaaagcttctagctcagACTTAAGGAAGAAGACTTTTTCAGTCCCGGATAGAGGTCT
-AATGATCTGATGGAACCAGAGCAAGTAGGTTAGAGGCCTTTTGCCTGGTGACGACCAAAG
-TGGAGAGGCCAGGCGTCTGGGAGGCGGCCAGCAACAGTAGAGAGAGACGCAGGAAAGCGA
-CTTGCAAGGGGGCTGGAGTGGGTGAAAGGTCAGAGGAGAGTCTGGAAAGGAGGATGCAGT
-GTTGCAGGGCGGGCAGAGCTGGGGGAAGGAGGGGATAATTTAGTAATCACAGCTCTTCCC
-TCAATAGAATGCTCAAGGGCTCACAAAGCATCTTGGCCTCCATGTTCTCACTGGTGAGGA
-TAGATGGTACATGAAGTTAGGTGGCAGATGGGGGGGTGCTTCGGATTGCCACCAGCCCAT
-TCCTATCTAGAGAACTGTCACTGGTttccttcttcgtttcccatgtgcttcctttctcct
-tccctgtctcccttccttcttccttccttgatttctctcttcttcctCTGTATGTGTGGa
-tatacacatgtataacacacacacacacatagacatacatatatatgtatatctgaatgt
-atgtctctgtatgtacagatatacacatatacatatatgtatatgtgcatacacatatGT
-GATGACCAAAGTGGAGAGGGCTAAAAGATGAGGCCAGGTGTCTGGGAGGCAGCCAGCAAC
-AGTAGAGAGAGACGCAGGAAAGCGACTTGCAAGGGGACTGGAATGGGTGAAAGGTCAGAA
-AAGAAgtgtgtatatgtgtgtatgtatatgtgtgtatatgtatatgtacatatatgtgtg
-tacatatgtatgtgtgtgtgtgtgtgtgtgtatgtataatcacctactatgtgccaggag
-gtattgtgaaagttattgagaaacacactggtgagcaaaccagacaagatccttgccctc
-atggagcttatgcttaagagagagagatattacacaaataaatgcacaaatagctccata
-accgttaaatgtgaccaacgactagcgctatgcagaagtgcagaatgctgtgagaGCATA
-TTCGTTGTGTATTCCAGCATTTATTAAACAAATATTTAATAAAGCAAATTATATGTATTA
-GAGAtttgcttttttttttttttttttttgagatggagtcttgctctgttgcccaggctg
-gagtgcagtggcacgatcttggctcactgcaacctctgctgcccaggttcaagcgattct
-cctgcctcagcctcccgagtacctgggattacaggtatgtgccaccacgtctggctaatt
-cttgttttttagtagagacggggtttcagcatcttggccaggctggtcttgaactcctga
-cttcgtgatccacctgtcttggcctcccaaagtgctgggattataggcatgagccactgc
-gcctggccTAGAgataatttttagaaaggaataaaatcacgctcttgttcaaatataaaa
-tgaacatgtgtcaaagattttatttaactcattaatttatgaggtaaccaataaggtgtt
-aaaaaatagttcaaaggagaatccaaagagaagaggcatacataggtaatgaggattgct
-tacattaatttgctaaagatgcaaaactgttttcttccaagagtactggggggaatgaat
-tgcatctttattattattattttgagacagggtctctctctgttgccaaagggctagaat
-gcagtggtatgatcatggctcactgcagcctcaacctcctgggctcaagcgatcctccca
-cctcagcctcctgagtagttgggactatagacaagtgatatgtgacaccttgctagctaa
-tttttaaataattttttgtagagatggggtttctctctgttgcccaggctggtctcaaac
-tcctgggctcaagtgttcctgccacaggctcccaaagtgctgggattacaggcgcgagcc
-accgcatctggcctcaactgcatcttgagcagaagaaatttgtttgcatctctgtgacga
-gaattgtttttattatcatcaatcttgttacaacatattgaagtgtacgctagctcaaaa
-atgtgaaatgcgtcggcaaccatagaatcagctaacctgaaatgatgtaaagacaattca
-taCCATTCTGGAGGACTTCCAGTAATCTTTGTGGACTTTTTTTTTTCAGCTTCAAAGTAT
-TTTACAGTTTTTcctgatgtgagtcagatcggtactagatactaataatacagaggtaaa
-ccatacagacacaatttctccctcaaggaCAATATTCCCTTATGTTCTAACTGGGGTGGA
-GAGCCGGGGAACAGTTTTTGGAAGCCAAACTGAGTCTTTGCCATTTATAcagtcatatgt
-taattaacaacaggaatatgttctgagaaatgtgtcgtcaggtgatttcattcttgtgca
-aacgtagaatgtactgtcacaattctagatggtacaacctactaggcacctagtctctat
-tctataacctatttcttctaggttacaaatttgtacctcatgttactgtactgaatattg
-taggcaattgtaacacaatggtaagtatttttgtatctaagcatagataaatatagaaaa
-gatacagaaaaaatatgtagaaaagattttttttaaaaaagacacacttgtatctttact
-gtgaatggagcttgcaggactggaagttactcttggtgagttaggaagtggtgactggat
-gtgaaagtctaggacattactgcacactactgtagactttataaacactgtacacttagg
-ctatactaaatttatttttaaaatttgtttctttcttcaatagttaactttagcttactg
-taactgttttgttctataaacaaaaaaattttaaaaacactttttgtattattttgtaat
-aacacttagcttaaaataggaacacattgtacagctgtataaaaacattttctttcttta
-tatccttattctataagcctttttctacttttaaatgttttttccttaaattttgttgtt
-gttgttgttaaaaactaagacacaaacacacacattagcttcagcctacacaaggtcagg
-atcatcaatatcactgtcttccacctccacgtttcgttccactggaaggttttcagggca
-gtaacacctgtggggctatcatatcctgtgacaacaataccttcttttgaatacctcctg
-aaaaacctacctgaggctgttttacagttaacttatttttttttaataagtagaaggagc
-acactgtaaaataacaattaaaaagtatagtaaacatgtaaatcaataagttgtttattg
-tcattatcaagtattatgtactgaacattttttttttttttttttgagatggagtttcgc
-tctggttgcccaggctggagtgcaatggcacaatcttggctcactgcaacttctgtctcc
-caggttcaagcgattcttccgcctcagcctccggagtagctgggattacaggcatgcacc
-accacgccgggctaattttgtatttttagtagagatgggCACACCAactaaagaacatca
-aagcccagagcgagaaccttcctccctttcccattttccttcaacttgttattaaggaga
-aagtctctgttcaatgctggtgtgtttttaacacctctcttaacacttacttcccttttt
-aacagagaataggcctccagagcctttggcaggccaccggatctggctagaatgtgatga
-cattgttttgttttcattgtacttatttttatggctaccttctatttatggcacgagata
-ctggttttccatttagggagggccctaaactttccttttgacataatatatttatgtttt
-tagaagaaggaccatttaaagaaaaaatattatgtaatattaattacataatatttgcag
-cacaggtggtactgagacagggaaaaaattataaagaggtatgtaaTGTGCTGAAAAGGA
-GGACATGCTTCTCAGGCTAATGCCTCtcccagcccctacttaacagaagggaccactgag
-gcacagagaggagaagggactttgtcaaggtcacacTGATGATGTGGACTAAGAACTGAC
-AGCCTCTTGATAGCCCTGTGGTGGGGGATATCTTGTGTCAGATGGGGAGGGCAGAGGTCA
-GGGACTGTGTGCAGCCCCATTGGTCAGTCCAGTGCACTGATCCGCTAGTCAGACAGAGTC
-CTCCAAGGTTGACCAAGTCATGGACTGAAGGCAAAAAGGACCGGGGGACCTGGAGGGGAG
-GAGAGAAGAATGCTGGTGTTTATCACGCACTAACTATGCTAGATGCTCGGGTGCCGGACG
-TCACCCCTAGGGAATTCACAAATTTGGGGGCAGACACGTCCTACAAAAATAACTCAAGTT
-TCTGGCGAAAGTGTGGTAAGTGTTCCAGCAGAGGCCTCTCtagtgacatctaggtttttg
-tctgctcactggtcatttccccatattcttttgggaaaccacctcttcaccactcttgat
-tcttgtagctcagaccaggcaaaccccacacccacttcagaggtgggcacatgaccagac
-ctggccaattagaacactttatccctcttgccacagagactggcacatggttgggcgcgt
-gacccaaggcaggccagagggggccttccccaggaatttgctggaactactggagaaaaa
-tcccacttcatagggtttttaaaatggatacactgtaagccagagttgctggcagctatc
-tttgccaccaaaagagagaggttctctgaaaatgaagctgacaggaaagcagggatgaca
-gatggagagacagctagagtcctaatgctactgtatggtcacctcctggacccagccgtg
-aaatcagtgaccctgaacACAGTTCTATTTTGCTTTGTTACCCAGGCTGGAGCtttttat
-ttttgtaattaaattaaattaaattaaattttaatttttagagacaaggtctcgctttat
-cacctagactggagtgcgtggtgcaatcacagctcactgcagaatcagcctcctaggctc
-aagtgatcctcctgcctcagcctcccatgtagttgggactacagttgtgtgccaccacgt
-ctggctaatttttaatttttattattatttaatttaatttttaatttttattttttgtag
-acatgtggtctcactatgttacccaggctggtcttgaactcctggcctcaagtgatcctc
-ctacctttatctcccaaagttctgggattccaggtgtgagccattgtgcctggctCGttt
-ttatttttatagagatggggtctctctatgttgcccaggcttgaactcGGTTCTAGAAGG
-CAATAacacacacacacacacacacacacacatacaTAtttgcattagccactttgagat
-gggtttctgtctcttaaaaccaaaaagagacctgtctaatTCCAGGCAGAAACAATATCA
-TGGGAATGTTGGCAAGGGAGAGGGATTGGAGTGTGTGTAAAGATTTATCTGGGAGTCCTT
-CCTCGTGGAGGTAGGTTTTGAGCAGGGTTTTGAGAAATGGAGAGGATTTTGATATATAAA
-GAAGGTGAAGAAACAGTATTTCCAGGGAGGGGAACATCCTGGGCAAAGGCTTGGTGGTGG
-AAGAGGGCAGGGAAGTGGCGCCGTCCAGTGTGATTGGAGAGAGGATGGGGATAGAGAGGA
-GGTGGGAGAAGAGCTGGCAAGAAGGGATGTGCCCTAATCGTGCAGAGATCCAGTCTGCTC
-CTTCACCTGCATCCTCCTCCTCTGGAGGCGTGCCCTTCATCAGttaattcatccacagcc
-atttactgaacaccagcatgcgtcaggcactgtcaaagggctggcgagagagctgtgggc
-cacaccaccaagtccctgccctcttgtagcttcttttgtaggtgaaggacacaggtggta
-aacatgagcaagaaataaacaagtatcatagtgtcagggagcagtaactgttatctagaa
-aaattaagacgagtaaagggaatacagactagtggagaggTGTTTGGGAtgaaaacggat
-aatactgatggttgaccgacatcgtgagtgcactcaatgccactgaactggtaaaatggt
-taaaatgataaattttacattaggtatttttctgttctttatattatgtacattttacca
-caataaaaaaCAGGATTggcagaggggtgctattttagctagggtggtcagggcatgtct
-ctctaaggaggtgtcgtttgaacagaatggaggggaattagcaagccttgaagagattgg
-ggggaaggtattctgggtggagggaattgccaggacagatcctgtggggccagagtcggc
-ctggtgtgttctaaggacagcaagtgggcccctgtggctggagcccagagagcaaaggga
-gagggggaggaagatgagtacagggatcagcaggggcttgtatgccaggagagaactttg
-gatttggttgtatgagtgatgggaagccatcggagggctgagcagggaagggatatgaat
-cagagtttctgttCAATTCTCCCTCTGCCCACACTCAGTCCTGCTCTTAATCAGGTTGGT
-AATCTTGCCTCTGCTTCTGACTATCTCTCTCTCCTGGCTGCTACCCTCTTCTGCACATCT
-TCATGACCACTATCTTGCTGAGGTCATCttttttttttttttttgagacagagtctcact
-ctgtctcccagctgaagtgcagtggcacaatctcggctcgctacagcctctgcctcctgg
-gttcaagtcattctcatgcctcagcctcccgagtagctgggattcaggcgagcaccacca
-tacccagttaatttttgtatttgtagtaacgatggggttttgccatgttggccaggctgg
-tcttgaacacctggcctcaagtgatccacccaccttggcctcccaaagtgctgggattac
-aggtgtgaaccaccacacccagAGAGGTCATTGTTTTTATATGGCTGACCCAAATGGCCT
-CCAACTGGCCTCCCTGCCTCCTGCCGACCCAGCCTCCACCAGTCATCAGGGTCTCTTTCT
-ACCCGCAGCTCTGACCAGCCCTTGCCTTGGTGAGAGCCACAGCCTCCCAACTTCCAGTCC
-AGCCCCATCTATCTTCTTTTCTCCTCACCCCAAAGCCCACACTTAGTCACTCAGAGCCTC
-CATGGGGTTCCCCTGCTGCCTGCCGTAGGCTTGCCCTCCTCAAGGCTGGTGTATGGCTCT
-CTGCTCTACTCGGGTTCCTTTTCACCTAGACAGCCCCCTCCCATCCTTCAACAGCCTCCC
-AGCATCACTCCTCTGTGAAGCCTTCCTTGGCTGTCCCACCCGCAGGCTGGCTTAGCTAGC
-TCCTCTTCAGTGCTCCCTAAACCACTCACATCTTCCACTTTCAGAGCCCCGAGCATGTGG
-CATGCAAAGCACATTggtttggtttggttttgtacaaacctttccctttcctcagctccc
-tgaaccccccagttccctgttcatagtatgttcgcaacaaatgtttattgaataaatgaa
-tGAGTTTGGAATTTATCTTGCAGAAACAATACTCCCACCACCACTACCAGCACCTCCACC
-AACGAAaataatatccaacccaagttgatgacttgctatgcatcgggcactgtgctacac
-acttccaaatctggatctgatttctatttcataatattaggaggaaatcactgtgttagc
-cccactttagagatgagaaaactgaggcatggtgaaattaatcaattttcctaaggctac
-ataactcagaagcaggagagccgacagtccaaAGTGTGCAGCCCAAAGCCGTGGGCACCG
-CATGCAGCTGGAGGAGGTGTCTTGGCATTACTGCATCCACGGACGGGGTTTCCAGGAGTC
-CTGGAGTTCCATATGAAGATTGATTGTCCATGAACTTTTTGGGCATGGGGGCAGGTCCAT
-TACTTGTAttttttttttttttgacagggtcttgctttgttacccaggctggagtgcagt
-ggtatggtcatagctcactgcagcctccatctcctgggttcgagagatcctctcacctca
-gcttcccaagtagctgggaccacaggcatgcatcaccatgtctgcattatatatatatat
-atatatttttttttttttttaagagatggtgtctccctgtgttgtgcaggctggtctcga
-actcctgtgctcaagtgatcctcctgccttggcctcccaaagtgttgggagtacaggtgt
-gggccatcgtgcccagccGTGATCCATTACtttttttttttttttttttgagacggagtc
-atgctctatcacccaggctggagtgtagtagtgagatctcggctcactgcaacttctgcc
-tcctgggttcaagcgattcttctgcctcagcctcctgagtagctgggattacaggtgtgt
-gctacctcgcttgactaatttttgtttttttagtagagacagggtttcaccatgttgacc
-aggctggtctcgaactcctgacctcaagtgatccgcccacctcggcctcccaaagtgctg
-agattataggtgtgggccaccgcacccggctGGTCCATTACTTTTACCAGGGTCTTAGAG
-GGGCTCTTGATAATTCCTATATTTAAGATGCTCCTCTGCACATAAGGGGGAAAGATGGAG
-AGTTTTCGAGTATTGGACTGTTGCGGTTCAACCTATGCTTTAGAGAGATCACGTTggcta
-tccattgcagtgtaatgcagggagaagagattggaaatatccctaagattcaccaagagt
-ggatgtgttaatcatatcatggtacctccttccacagaagggaataatacgcagccataa
-agatgaatgaggagtctctttatgtaccaatgtgaaatgattcctaagatatttatgtca
-gagagagagagacagggtCTgggtctcactctgtctcccagactggagtgcagtagtgtg
-atctcggttcactacagcctccatctctgggggctcaagagatcctctcgcctcagcctc
-ctcagtagctaggactacaggcttgcaccaccacgcttggctaattaaaataaaattttt
-ttttggagagactaggtctcactatattgcccaggctggtctcaaacttctgggccaaag
-agattctcgcacctcagccttccaaagtgctgggattacaggcgtgagctaccctgcctg
-gccTtccaagacatagtttaagtaaatacagcaaggtgcaggccagcatgtataattagc
-ttctatgtatgttttttaggaagggaggggttaagattatagatctagatgtgcttctat
-atgcataaaaaaTCTTTGGCAATATTCACTGTTAAATAGTCAGTGGAAACcctacctcat
-agggtttttatgagggttacatgagttaatattagataattgcttagaagagtacctggc
-acacattaagcactacagaagattttatttaataAAATAAAAAAGAgtggcgggcgcctg
-tagtcccggttacttgggaggctgaggcaggggaatggcgtgaacccgggaggcggagct
-tgcagtgagatgagatcgcgccactgcactccagcctgggcgacagtgtgagactctgtc
-tcaaaaaaaaaaaaaaaaaaaaaaGAGGGTCCCTTAGGGGATGGAGACCAGGTGACTAAG
-GGGCAGGGAGAGAGACTTATTTTTCATCTGAGGCCTTAGACGCCTTTTGAATTTGGTACC
-ATGGGTAAAttttttttatttttatttattaatttatttttgagacagagtctcactctg
-tcacccaggctggagtgcagtggcacgatctcggctcactgcaacctccacctcccgggt
-tcaagtgattctcctgcctcagcctccctcgtagctgggattacagttgtgcgccaccac
-acctggctaatttttgtatttttagtagagttggattttcgccatgttggccagcctggt
-ctcgaactcttgacatcagatgatctgcctgcctcagccttccaaagtgctacgatgaca
-ggcgtgagccaccacgcccggccTATTTTTTTGAAGTTGAAATTCAGTGTATCTTggcca
-ggcgtggtggctcatgctgtaaccctagcactttgggaagctgaggcaggtggattgctt
-gagctcaggagtttgagagcagcctgggcaacatagtgagaccctatctctcaaaaaaat
-gcaaaaattagctgggtgtagtggcgtgcacctgtagtcccagctacttggggggctgag
-gtgggaggattgcttgagcccaggaggcataggttgcagtgagccgagctcacaccactg
-cactccagcctggacgacggtgagaccctgtctcaaaaaagaaaacaaaaaacaaaaaac
-aaaaaaaaaaaaAGAGAAAGAAAGAAATTCAGCATATCTAGATAGCTAAGAGATCATCTG
-AGGGGGTCAGGGCCTGGAAGGAGATCCCACCCAGAATCCCCGGGAATTCGCTGTAATTGG
-TCAAAGGCCACATTGTGTAGTGTGAGAAATCAGGACGTGAGGAAAAGGCGGACAGGAGAC
-ACCAAAACACCCACGCCCCAGGGCCCACTATAAAAAGCACATTTAAAAACACCAGACTGG
-AAAAGTTttattattattattattattTTTTAAATAGCAAAAGCGAGTCCCCCCAGGAGG
-CGCACTGCAGCTGCGGCTGTGGCGGTTCCCAGGTGATGTCAGTCCTGGCCAGGCGCCAGT
-CCCGGCCCCTTGGAGACGGTCTTGGTGGGTTCAGCTTGACTGTTTTTCCTTCCTGAGACT
-TGAGGACACCTTCCTGTCTCAAAGAAGGAAGCCTTTCCAGGGCTTTCTGAAAGCCAGGGG
-CAGGGGAGGCGGTGGGCCTGGGCTGCAAGGGCAGAGAGAGGCAGGGAAGGTGGGTGGGGG
-TGGGGAGGAGCGGGGGCTGCCTCTGGGAGGAGAGTGAGGGTGGAGAGAGCAGAAGACAAG
-CCTGGCTCCTGGGTGGCTCTTTAGCCCTCCCACCCGGGGGCGCGAGGGGGTCTGCTTCTT
-GGGAATCCAAGGCCCGCCTCCCTGGCCCCATTGCTTCTCAGCCCTGGCTGCTTCCTGGGG
-AGGCCCCTGGGTGGGGTGAGGTTGTGGGGTGAGAGAGGTTCCCACAGAGTTCCCAGTTGG
-TCAGTGTCTTTTCTCCCTCCCTGAGCCCTGGGCCCACCCTTTCTTCTCTATGGTTAAAGG
-CTCTTTGCCAATATCTTCCAggccaagcgcggtggctcacgcctgtaatcccagcacttc
-gggaggctgcagcaggcagatctcctgaggtcagaagtttgaggccagcctggtcaatat
-ggtgaaaccctgtctctactaaaaatacaaaaattagccaggtgtggtggcacgctcctg
-aatcccagctactctggaggccgaggcaggagaatcgcttgaacctgggagacggaggtt
-gcagtgagtcgaatcatgccactgcactccagcctgggtgatggagcgagactctgtctg
-aaaacaaaaacaaaaacaaaaacaaaacaaaacaaaacaaaacaCCCAAGATTCTGCCAA
-TATCTTCCAAACTGGGTTTTCTGCAGATGGGACGATCCAcagagctgggtttgaggtcca
-actctgcactcctagccgtgcgacctcaggctggtcactgcttttctttgagtgccacct
-ctgaaatggattaggttggccttacagggtggttatgcagagtgagtgagacaGAACAAT
-GCCTCTTGGTCCTTCCCGAGTATCTGCTAGGCACCCACAACGCGCCGGTGCCACCAGGCG
-CTCGGGATGCTCAGCATTTGGCACAGAGGcagcagagcagggaggtgaagagagtgggct
-ctggacccagcctcagtccacatcccggttctgtcctttgatggccgtgtgaggatagtg
-acagcctgtctcactgggtcgtagaggagtaaatgagttacaggccgtggaacagtgcct
-ggcactgaggcggtgctaggtaagtgtttgcttttattTTCGACTTCTGTCCAACCAGCC
-TTCTGTTGCTTTGACAGCTTCATGGGGCTGCTCTGGGCACTCAAAGGAGATATGTTGGGG
-ATTCAGGGGTTGTGTTTAGGGGAGACCCAGGTCCTGCAGGTGCCCCATCATTCATACTGA
-TGCAGGGGTGGCCTGGAAGCTGCAGAACCATTCACACTCGGCAAAGCCTTCTCTCACCTT
-GGAAGCATCATTCCTAATGACGACACAGGTCTCCCAGCCATGCGTTCCCACATAACTTAG
-AAGCACCCATCCCatttttattatttgctcagagcctgctttttcagtaggccgtaaact
-ccatgaggtcaggtactacatctggcttattctctgatcatccctagagccttgtgtggt
-tcatggagaagttcaaaacatgtttgttgaCGGACTTACTGACTGACAAAGTCTGCCAGC
-CTTATGTTGGTCTACAATGTTACACTCTATCCCATGCCTCCTGCTGAGTTTTACCCTCCT
-GCTGTGATGCAGGCTGTGGGAtctggagctagaccccctcagttggaatcctggctgtgc
-cattgcctagctgggtgcccttgggcttggttttctagtctgtgaaatggggatagcaac
-agtacctacctatgtggcttgttgcaagtgaggccatctctgtatgtcactcagagaagt
-gccttggattagtcagTTCCATCAACATCAGGACTAGGCACGCACCTGGTGAGGTCATGT
-GGGGGtggtggttgagagcccagtggggctctgcagctagaacatctgattcaaatccac
-cagccactgtgtcaccttggccaagttctttaacctccttgtgcctccgtttcctcatct
-ataaaatggagcaataataatacatatctaaccagcttttgagcaagctgtatgtatgta
-tgtatttatttatttagagacggggtcttactctattgcccaggctggagtgcagtggtg
-caatctcggctcactgcaacctccaactcctgggttgaagggattttcctgcctcggcct
-cctgagtagctgggattacaggcacgcaccaccatgcccagctaatttttgtatttttag
-cagagatggggtttggccatgttggccaggctggtcttgaactcctggcctcaagtgatc
-tgccctcctccgccttccaaagcactgtgattacaggcatgagccactgccccccgcgaa
-gctgtatttattttatgtaaagtgcatagcctaggcctgacacgtagtaggtcctcaaaa
-gagtcaggcatttttCCAAGCCATTCAGAAAAAAACAACTCCTAGATTTTATCAGCCTTC
-CCTCCCACAAGGCCAGTGTGTCCCAGCTGACAAAGTTGCTGGCCGTGCTGACGtgaggaa
-aagcaagggccagagagggccagacgcctaccctgggtcacacaggagcagtggccaacc
-tagaataggctaggtcttctgtctcgcagcctgtTCATCCTGAGTGCCTCCCTGGTTTCC
-AGGCCCTGCTGGCCTGCCCTCTGACCCTAGCCCCCTGGGAGCTCTATCCCAGGCCCATGG
-GGTCTGCAAATCTGGTCTGGATTAGACACGCTGAGAAGCAAACGCCAGCCCCCCCAGCCG
-GCTGCCCAGTGGGACCTGTGCTCACAGCTGCTGAGGCTCATAGGGACATAAATCATGGTG
-GCAGGAGACTCGGGGGATGGGACCACCTTAGCCTCCTAAGGGGCACAGGGGCCTGAGAGT
-CACGAGCAGAGGCACCTGGGTCTGCTGGGGATATTTTCCATCGTCTGTTGGACAAGCTAA
-AGCCAGGGTGCATCAGAGGGGGCCAGGACACCATTTGGCAGCCCTCGCATCACAGTAGGC
-CAAGATCCCAACTTCTTTTTAACttttcattttgcaatcatttacaacatgcagaaaagt
-gacaaaagtggtgcagagaactcccatataccctgtactcagattcaccacattttaagt
-ttgtcatatttactctatccttttctctcacacatatattatttctcttctgaaccattt
-gagagagcacgttacctacatcatacttctccttaatagtacttcaggatgtattttttt
-ttttttttttgagacggagtctcactctgtcacccaggctggagtgcaatggtgcgatct
-tggctcactgcaacctctgcctcccgggttcgagcagttctcctgcctcagcctcccgag
-tagctgggattacaggcgcctgccaccacagggtttcaccatgttggccaggctggtctc
-gaactcctgacctcaggtgatgcgcccacctcggcctcccaaagtgctgggattacaagc
-tgagccaccacgcccggcctaggatgtaattcttaagcacaaggatatcctctgacacaa
-tcagggtgctgttagcaaatacagaaaatttaactttgatgcaataccttaatctattgt
-tcatatcccaattttgtgtgaccatgtctcaaaaaaaaaaattgtcaactctaccaagaa
-ggtcccctgtcacattttcccctctgcagtacaggatccagttcaaagtcatgtatcgca
-tttacctgttcaggtctATACTTGATATCACAACTACACGAGGTAAAATATACAGTCGTA
-AGAGACACAGATGGGGTTGAACAAAGACATCCAACTTCATATGTACGTCCCATGAACCAA
-TGTTTCTATAAATCCTCTAATTATATGGTGTTCCACAATAATGCATCACGCTCCTGACTG
-TGTGGAGGTAGTTAAGAGTTAACTTGCCAggccaggcacagtggctcacacctgtaatcc
-cagcactttgggaggctgaggctggaggattgcttgagcccaggaatttgagactagcct
-gggcaacatggcgaaaccccctcaaaataaaaaattagctgggcatcatggtgcacacct
-gtagtcccagctactcaggaggctgaggcgctaggactacctgactccaggaggtggagg
-ctgcagtgagccatgatcgtgccacctgcactccagcctgggtgacagggtgtaaccgtg
-tctcaaagaaaaaaaaaaGTTAACTTACCAAATATGCCATAGTCTTCAGCACTCTCTTTT
-TGTAGTGCTTCATTTTTTAACCTAATAAAAGCCTCATAAAATGGGAGTGGCCTGGGACAA
-TGAGGGGAACCTGAAGTGCTGtgggtgcaagaggtcctgtgttctcagccctgctcagct
-ccagatgctgtgcaaccgtggcccatcaccgctcctctctgagcttcaggttGCCATGGG
-TGACCTCTGAGGCCTTCCTGCTCATAACTGTGGAGTCAGAGAAAACAGCCCTgcatggca
-aggagggagatttgtgttcttggtgtcccaacagggccaaggacctgctggggaacccca
-ggcaggttgccctctgtcttgtctcactttcttcattgtgaaatgaTGAACTCTGAGATT
-ATTCTTGTGCTGCTGCTTCATGTGTCAAGACTTGCAGGGAGAGTGTAACCCTTTGGGGTC
-CAAGGTGGCCTGGCTGAGTCGGTCATTCCAACCCCTTCAGTCCTGGATTTCTTCTCCCTG
-AGCAGCTTTACTCCTGTGGCCTCAAGTTGGCCTGGAGAAGCTTGGCTGGGCTGGACCATC
-CCGGAGGCGACAGGCATGCTGGGGGAGCGGACAATGTTACAAAATGTTCCCCAGAGGAGC
-TGCCTATATATGCAGACCACACCTGTGCTTCTCCCCGGTCACGTGTGTGGGCTGACCTTG
-CAGCTCACAAAGGCTCATGGGCATtaactgtccattaccaggaagatagcaagctgcaaa
-atatgcataatggagcactatgcagctatgaaaaggtgtgaaacagctctgtaagcaacc
-aagggtctccaagaagtacagttaagaaaaaaaaatccagtgcagagaggagtgtgtgaa
-atgctaccacttgtgtggaaaaacaatatctatgtaatttgcctatatatgcagaCCATC
-TCTGCCGGAATCCATAGGATCCTGGTTACCTTAACATAGCAATTGCCTCTGGGGACTGGA
-GCTGGTGGCTGGGAGAGAAGGAGACTTATTGTCAGTTTATTCTTTTTTGTGTCTCATTCA
-AAGGAAAGAACCGGTATGTGTAGATGTGcaagaggggctggctcctgggaagctgctaat
-tgcatttcttgatctccatgctgggtgtacaggtgtgctcagcttgtgaaaatccattga
-gctgtacccttacaccctgtgcactttcctgaatgtgtcttatacttccataaaaagtgt
-aaaCTTggccgggcgcagtaactcatgcctgtaatcccagcactttgggaggccaacatg
-ggtgggtcacctgaggtcaggagttcgagaccagccttgccaacatggtgaaaccccgtc
-tttactaaaaatacaaaaattagccaggcgtggtggtgcacgtctgtactcccagctact
-caggaggctgaggcaggagaatcgcttgaacccgggaggtggaggttgcagtgagccaag
-atcacgccactgcactccaacctgggtgacagagtgagatccatcttaaaaaaaaaaaaa
-aaGCGTAAACTTAGCATGGTTTAAATGATTTGTTAAGCGTATGTGTGCTAGTTTAACAAA
-AACGCTGCAGagctgggcgcagtggctcatgcctataatcccagcactttgggaggctga
-ggtggatcgcttgagcccaggagctggagaccagcctgcataacatagtaagaacctgtc
-tctacaaaataaacaaataaataaaattagccaggcctggtggtgtatgcccgtatttcc
-agctactccgcaggctgaggtgggaggatcacttgaggacaggaggttaagcctgcagcg
-agctatgactgtgccactgcactccagcctgggtgacagagtgagaccctatctcaaaca
-aaacaacaaaaaaTACTCGGTGGGATTATCGTCTTCACTGTGGCTGTCTCTGGGATAAGT
-GATATTTCTAGAGTCTTATAGCATTTTGAATTTGTTTTACAATGAAAGCACAGGCAGAGA
-AACCTATAAATATTTTTTCAGAAACAGTTATCAGTATAGAAGCTTTTTTGGAAGGACACT
-CAGGAAGCTGCCTCTGGGGAGGGGCCTGAGGAGGTCTGTACTTTTCACTGCATACCATTT
-GATACAACTTGGATTACTTACCAGTGCATACAGGGTCTATTAAAAACTATCTCACAAAGC
-AAAACAAATACTTATCTTTCTGTTCTAGCTGCTCTTACTAGTTAGAGACTGAGCCAGGga
-ggcccagaggggtcaagcaacatctctggggtcacccagcaaatctggtggcggagtggg
-cctccagccagagcacccaagtgtctgctctgcccccactcccaggcttcctgccattga
-caaggccacagtccttttcCTGTGGCTTTGCCAGAGGCTGGCTGTACCTGGGAGGGTAGG
-CGCAGGGGGAGCAATGTGCTTTCCTAATCAGCTCCCAAAGGGGGAAGCACAGCCACGCTG
-GGACACAGGATAAGCACGACCAGTGTTCCTGAAACAGCGGGGAAGTGAGGTAGAGGGTGC
-TTGGAAAGCTCTCCTGGGTGGGGGACCCCGGCCCCCTGGGGCCCTCCTTCCTCTACTTCT
-TACACCAAAGGAATTAAGCATGGTAATTTCATGGCCTGCTCCAGCCTAGGGACTGGCAAT
-TCCAcaactcccttgatctccctgggcctcggttttcatctgtgaggaagaccaggttgg
-tcgggctcattcctgtggcatctggcacagtgcctgccacacagagggtattgacaatct
-gtttgtcaaTTTGCAAAATCGGAGCCACAATTCAGGCTCAGATGGTCAAACGCAGGGGAG
-TGGGGTAGAGGCAGAACAGAGGGGATACGAACGTGGACTCTGGGGCCAGAGTGCAGTCAG
-TAAACATGAAATAgatcacttgagctcaggagtttgagaccagcctgggcaacatagtga
-gaccctgtctctaaaaaaataaaaataaaaGTGTTTGTTAAATAAATAAACTGTTGAAAT
-AGGCATATGAATGTACCTTGCTGAGGAGAGGGTGGCTGCCTGGCTGCCCTGGCCTTTCCC
-TGGCTCTCCCACCCTCGGGCCTCTCGAGCTTCTCTGATCCTGACCTCACAGGGACACAGC
-CCCAGCCCGAGAGCCAAGAACTCCTAGCTGCACTGATCAGCTGACGCATCGCTGTCTCTG
-CTGGGTCTGCAGTGGGGAAGACACCAGCTCTCACCTCCCAGGGCTCCTGGGAGTGTAATT
-GGGGTAACAGGTGCTGGCTTTCCACTTGGGGCATCTCCAGGGCAAGGAAGGAGCTGCTCT
-GGGCTTCAAAGGTGGACGGACCTCAGGGTGTCACCCTGCCACGTGCCTCTGGGTGTCATC
-GGTCTTCTAAAGCATTTCAGCTAACACAGGGGTAAGAATATTCCCCTTTAGCATGCACTC
-ATTTGCACTTGTGGAAAACCACATGGCTTGTTGGTGATCGcatcaaagagggatgggtta
-aaggatggcatgttcacaaaatggaataataagcagctcaggaagaaatgaaataccctt
-taggtactgacttgggatgataccaagctagattaaggaaaaaaagaaggagccaaaagt
-gtgtacgatgtgctgtcatttgtgtaTTTGCCTGATCATTCATAGTGAATGGGACATCAC
-AGGAAACTGGTGCCCTAGGCTGCTTGCAGAGAGGAGAGCTGGTGGCTGGAGGACAGGGGC
-ACGGAGACTTTTCAACACATACCCTCTGGTACCTTCTGAGTTTTGAACCATGTGAATGAA
-ATGAACACAGGCCTTATTCAAAAATAAGTAAAATTAAGATTTCTTTACCAACCATATCAG
-ACACCTAACAGTTGTTAAGAACATCTGATAAACAGCAGACTGAGGAAAGTTTGGTTATGG
-CGCCCGGAGAGGGGGCTCTGCCTGCCTTCCCCCGCCCCACCCCCACCCTTCCAGGGCTCA
-GGGCAGCCCCCAGAACATCTGTGCCTCTCTCTAGGTCCAGGGGAGGGCCCACCTCTGACC
-TCCGATGTCCACGGGACTCTCCTCAGCTCAGAACGACGTCTTTTATTTAAAAATAGCTTT
-TATTTTAAACTCACCAATTCTCTCTcacacacactcacactcacgcacagatacacacac
-acCCTGTCACCAACAGTCTTTGTTTTTCCAAAAGTTCTGCCTTGTCTCTGACCAGCCAGA
-GCTGGGCAGGCTGAATGGATCCTCACAGCTCTCCAGGATCGGGTGGAGATGTCCCGAGGG
-CCCTGCCCAGAGTGTCCCGGAACAGGCCATGGTCCCCCGGTCCCTACACAAAGAAGGGGT
-GGGCTTGGCTCCTGGGGTCTTCTTCCCTGTCCAGCCAGTGGCTGGCTCCTGGCCTCCTTC
-TCCAGGGTCCAGGCTCATCTCCGTGGCCCTCGAAGGGGGGCCACCCCCCTCACCTTCAAG
-CAGCTGCCCCCCAGGTCACGACGGCCACCCTGCAGAGGGGGAGAAAGAGTATAAAGAGGT
-TCGATTAGGCCAGTGTGaacactggaactaacctctgtatccctcaagagggatcctgat
-caataaatcacagttcagccacacgatcaagttctctgcaacagaaagcagaagaaaccc
-tttctggactgatacagactgctgccaaatgacaatgtttagggacaaaagcaaggggca
-gGCTGAATGCGCCTGTGTGCTGTGATTGCTGGGGAGAAGCACACACGGGAAATTGTGAGT
-GGGTTTCTTCAGAGAGGAATTTGATGATGGAGAGAGGATGGGAGGGAGGCTCTCTCATGC
-TATACTGttttttgagatggagtcttgctctgttgccaggctggaatgcagtggcacaat
-ctcagctcactgcaacctctgcctcccgggttcaagtgattctcctgcctcatcctcccg
-agtagcggggactacaggggcccaccgccacacccggctaatttttgtattCACGCTATA
-CTTTTTTACCTTTTCTACTTCTTTCCCATATGATCTGTTGCTTAAAAAAAATCCAATATA
-TTTTAAAGCATAATATTTTACACGGGCAAAACAAGCACACCCCACAGTGGTCCTCCCCCT
-GCCTGACTGCATGCCTAGCGGCTCACTCGTCCACCTTTAAAAGGGGACTCGGTTTCTGGC
-CTCCTTGACTTCCCTCAGGGCGTCCCCTTTCCCAGGAATGTGCTCTCAGGTCTTGTCTCC
-CTGGAAAGGTTTCTCTGTTCCTGAAATTGCCTAGCACTTCCTGCCTTTCTGGGGACATTC
-CATGGGGATGAATCTCAGAAGGACAAGGCAGGGTCTCTCCTTTGTCTCCCCATCTGGACT
-GGGATCTCAGGGAGTGGTAGGGAAAAGGAGTTCTTCACTCTGTGGTCCCATTTCCAGCCT
-GGGCTCTCTTGGCCCAGGACCTGACTTGGAGCAGGCACCAATCAAGGCCGCCTGAATTAA
-GTGGCAGCCATTGGAAGATGGGCTAATGGCGGCAGTCCCTGAAACCATCAGTCCTTACAG
-GGGCTGTCTCTACCAGCTCTTCTCATTGATATTTTCAGACTGGACACATGGGtttcatcc
-tcaccgtaagccagagaggtcacagatgttaaagcaccccctcttttgaggcctccagcc
-actgaatgactggcccagaggcacccagccagttgtaaaagagctgggctagaaatctat
-gttgtccaacaatctgtcctgtttccaGGACATGATAGTGTCTGAAATCCCACTGTAAAT
-GCTCATCACCCTGAGCCTGGCTAGATGATGGAGGAACAGGCAGCTTTCTCAGCCCACTTA
-GAGAAACAGCTGACCATCTGGGAGCTCTGTCCCCTGCCCCCTCCACCCCCAGGTCCAGGT
-TGGGGCAGATCCATCCAGATGCGAGCCCAGCCTCCCTCGAGGCTCTTGCAGCCCAGGGAC
-AGCATGTTCACTCACAGGCAGGGCTATTTTGAGGGCTGAGGCCACAGTCCCAGCAGAGCC
-TGGGGCTTGGGCTTCTCAGACAAACTCTGGCAGGAGTGGCTGAGAAGGGCAGATAGGGGA
-GGGGGTGCAATATTAAGGTTGAATTAGAAAACTGGCCTTCCTCTCTTTTACTCTGTAAGT
-GCTCAGGGACAGGGAGAGCCGCCCCCTCCCACCCCAAGTCTGGAGGTCAGCTGGAGACCT
-AGGGTCCCAGAAGAATGCTGGGACTGttcacctccctgaacctcagtttcttcatctatg
-aaatggggacaaaatgattttacttgccatctcaaggtGCAGTCGAATGTGAATGCAGCT
-GTGTAAGCTGCTAAGTGTACTTAGAAGAGGTCTTGACggccgggtatggtggcttatgcc
-tgtaatcccagcacttttgggaggccgaggcaggcggatcacctgaggccaggagttcga
-gaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaaattagccag
-gtgtggtggctggcacctgtaatcccagctacttgggaggctggggcaggagaactgctt
-gaacccgggaggcggaggctgcagtgagttgagatcgtgccactgtactccagcctgggc
-gacagagcgagactccatcgcaaaaaaaaaaaaaaaaaaGTCCTGACAAGACCCCAGTTT
-GTTTGTCCCTTAGGAACTCAGCACCAAGGGTCTTCGGGAagcaccatggttaggagttag
-gctcaagtgagacagacctaggcttcgatccctactttgccaagggccaactactggacc
-tcaggcaagtgatttcatctcactgagcctcagtttcccccccgtaaaggggaattactt
-tacaggatcacacaagctaatctaggtaaagccttggcacagtgttgggaacaaagtaaa
-tgttcaataaatgttcataagtattattatCAGCATCATCTATGGACAGTGCCTCCTGGT
-CCCAGCTACCCTCTGGGTATACCAACAGGGGAGAGCCTTACAAGATGATCCTGTCCAATC
-CTCACCCCCAGGTGACAAAGGGAAAACAGGGCAGAGACAAGAACCCCCTTTCCACCTCCC
-ACGTGCTAATTCTACCACAGAGGGCCACACCTAACCCCTCCTTCAACAGAAAGATGCTAC
-AGGAAACTGTTTCCACGGCAACCCCAACTCCAGACTGGCCAGGATGGGAGGGAGGTGGTG
-GCTCAGGGTAAAGGAACGGGGTCTTGGGTCTTAAAGCTCTTCTGGCCCACAAAGCTCAGA
-AGGGAGCAAGAGCTCCCCAAGCCAGCCAGTTTTCTTCCAGCAGAGTCTTCAAGGGGCCAT
-AGCTGGCCAGGATTGCCCCTCTCGCCTATTCCCAGAGGAGACCGTGGGGTTGAGAGCATG
-GTTTCTACAGCCAAATTTGGCTGAGTTCTTGGTCCCATAGACAGATCCCAGGGAAGCGGC
-CAGGCCCAGGGGAGGCCCCTGTGAGCTGTGGGACAGGCCTGAGACCTGCAGAGAAGTCCC
-CCAGCCTGCTTGCTATGGGGGTGGACACATGACAGTTACAGGGACTTCCCTCTGTAACCT
-ATCCCACGTCCCaaccaggcaggcctgagtttgaatcctggttccatcactgactgtgtg
-tctctgcgccactggcagcacctctaagcaagtggggataaccacagcgcctcattcctg
-gctgttgcaggattttaatgataaatcataaagagcgcttagcacagATCAGTGCTCATG
-AAGGCTGCTGTCACTGCTGTTATTGGCCATTGTGCTCCCCCTCTGCACTCCTGCCACTTT
-TAACCTCTTCCCTCTTCCTTCTCTAGGCCTGAGCTCTTGCTGTATGCCCCAATCCTAGAA
-CACCCTTTCCTACCCCTTCATCGGCCTGCCCCTGTTCTAAAGCATCCTTCAGAAATGAGA
-CACAGAAACCCTGTCAGCACTCACCCTGGGTTGGAGGCTTTCTCTGGGCTCTGAGAATCC
-CTTTGTGCTTCCCCTCCCCCACCATCAGACCACAGCATCCTCATCTTCATCTCCCTGCCC
-TGACCCTGGGGCTGTACTGTCAGGTCCTGACTGGTGGAAGGGTGGGGACCTACAACCTGC
-TTCTCTGGGGTTCTCAGAGCCAACAGAAGGCAGCTGTTGGGTAGCTAAGGGTTGCTAACT
-GGAATGAATGGGTGAAAGGCAGTCAGGGAGTATCCCTGAGAGCCCCTTCAGGCCCTCCCA
-TCCCAGGAAGCCTTAAAGGCCCACTCCTGGCTTCTCAGCCCAGCCTGGGGCACTGACAGG
-GGCCCACAGCTGGGAGCAGCAGGGACCCTGGAGAGGGCACAAGCCTGAGGCTAAGAAGAC
-CGACGATTCAGGGCAACTGAGGCAGCCAAGTGTTGAGCAACCAGGCTGGATATCTGATGA
-GCCAGACAGAGGGTGGTCTCAGGCCAAGATGCAGAGGCCTCCGCAGAACAGGGTGGAGCA
-AGGGACCAACGGCAGCTGTGAGAACCAAACAGCAGGGAGTCAGGGGCCTAACTCCAATTC
-CCCATGCCCTTCCACTTGGCCACCAAAAGTCAGTACTCTCTCAGCCTCAGTTTCCCCGGA
-TGTAAATGGTAGCTGCTGGAATACAAGTTGTTAGACAGGCTTCTTTACTGTAGGAAAAGC
-CCAGGCCAGAAAGGCACACGGTCGGGGGATGAAGCAGGTTCCTTGGAGCCTGGGCAAGGT
-TTCAGCCAAGAGGCCACCTCTGCTGCCACACAGCCCCCGCCCACCCCTACCAGCCTGATC
-CACTTTCTTGCCCAGGACACATTGCAGGAGCTGCACACCAGCTCCCTCCAGCTGACCCAA
-GAGTGCCCTCTCCCAACACCACGTCCTTTTGGGGGCTGGGGACTCTCAGAGGGCCCCTTC
-TTCACTCCTACTGCTCATCCGCTGGGTACCTCAGGCTCTCGGTTGGCGGTTTGTGGCCTC
-CTTTCTTCTCAGTCTCCTGCTCTTGGGTTAGATCTTAGGACAGGGGACAATTATTTCAAG
-GTGGGGGCAACACACACCGGGCAAGCCCAGGGCCAGCGCCCCGGcttcccagctgagtaa
-atgtgggcaggtgatcccatctctgatgctcagatcctcatcaggataaaatgggcagaa
-aaactacctgcctgaagggattcttgtgaaggcaaaaaagtggatgtggagcgcatcggc
-acagaggaagactccataaaagatgggtctttgttACTCAGTCCTCATGCCGTCTTCCCA
-GCAGGAAGGAAGTTCCAGCACACCTTTCGTTGGAGGGGATATCCCACACTGAGCAGTTAA
-ATCAGACCCGAACTCTGGGTTTTCCCGCATCCTTCTGTTTGGGGGCCTGGGCATTAAGTC
-AGTGGTTCTGGGCTTGGGGTGCCGCACCCAGCACGAATTCCACGTCGCTTCCCCCTGGCC
-TCGTTGGGGACCCCTGCACCTCTCCGGTTCCCGCAGAGGCGCTGCCCCCCGCCTACCCCG
-ACCTGGCGGCCGCAGCGAGGGACGCAGCACACTCACCCCCTTGCGCTGGTTGCTGAGGCA
-GAAGGTGCAGATGGAgcgcggctggcggccgccgtcggcggcggcggggacggcgcccTT
-GGCACTGCCCGCGGCACGGAAGCACGGCTGCCCGTCGTCGGCCGAGTCGCCCAGCAGCAG
-CACGTTGGCCAGGTGCGCGATGTAGCTGGACGCCAGGCGCACGGTCTCGATCTTGGACAG
-CTTGCGGTCCACCGGCTCGGTGGGGATGAGCGTGCGCAGCGCCGTGAAGGCCGTGTTCAC
-GCTCTGAGTGCGGTCCCGCTCCCGCGCGTTGgccgcctgccgctgtcgcaccaccaccac
-ggggcccgcgccgccgccgccgcccgcccgccgcccgcccccggggcccgggccgcgccg
-cgccgcctccgggccctcgcagcagccgAACGACTGGTCCGACGCGTCGCTCTCGCTGCG
-GTTCTCCTCGTCCTCGCTCAGCAGCCGCACGTCCGGGTACAGCACGTGCGCGCCGACGGG
-CCGCAGCAGCGCGAACGCCATGGGCGCCGGCCGCGTCCCTCCGTGCGCCGCGTCCCAGCG
-TcggccgcgccccgccgtgcgctcccgcgcgctcccacggccccgccggcccccgccTTA
-TAGGCGAGGGAGGGGCCAATGGCAAggccgccccggccgggggcggagggctccgcccgg
-ccAATGGGGAGGCGTCCGCCCGGCCAATGGGGAGGCGTCCGCCGCGCCCTGGCCAATGGC
-GACGCTCCCACCGCCTCCGTCCCCCAGGTTGAAAGCGGCCCGGGAGCCGGCGGCCCACCC
-CGAAGGCCCCCGTTCCCGGCTGGCTAGCCCGGCAGATGCTGGAGGTCTGGGAGGGTCGGC
-CGGggtgggcccagatccgaactttttgtctccagcctggaccacctgggagacgcgggc
-agatccctttctcctctctgggcctcagtttcctcgttcggaaCGTTCAGATTGCAGAGA
-AACAGCTAGTGTCTGCCTGCCCTCCAATTCTAATCCTgtagttctgcagctttcacgtgc
-gtaagaactggggaaggggcttttgctattacagagtcccaaattgctcccattctgatt
-gagcagttctggaacgggcccaggaacctacattttgtaacaagccattggtgatagtgg
-tggtgtccgtggagaacacttggagaaAAGCTATAATCTTTCCAAATGAGGATTCGACAG
-TGTCTTGTCCCTGAAGACAAACTTAAAAAGAAGAAGAAAAAAAAAAGCAAAACAAAACCA
-CAATACACAAACACCAGTAGTTCGttcgttttttcaacaaatattcgttgggtccctact
-atgtgtcagacatggttttaggtctgaggatacagccattaacaaaataaattcttcacc
-ctcacggaactgacgttttggttaaggaACTACTGTGTACCAGACTCGGTGCTATATACT
-CTATTGCGCCCAGCTGAGGCTGCAGGATGGCAGCCCTGAGTTACAGGTCAGAGAGCTCCG
-GCCTTCAGTCGTACAGGTGGGAGTGGCGGCGCTAGCTCCAGCCTGTCCGGTTTCACTACC
-TCTTGGAATCCTACCACCACCATCCCATCACACACACACGGGCTATCTTTCCTCAATGCC
-TGCTTGCCTTCTAGAAACCTTAGATTGTTCAGCCTGACGTGTCCTCTTCAGAGAATTGCT
-GAGCCAAAGGTGGTTGCCGGGGTCTCGATCTCACTCGTGCCTGCTGCTCAGCTCTCTCCA
-GGCACTAGCTAAACCAGCATCCACTTGGCCTTGAAAATAAGCCCGAGTGGCAGCCGGTGT
-AGCAGACAGAGCGCAGGGAGTGGAGTTGAAAGGCTTCTAGGTGCATTTTGGCTCCTCTGG
-GCGTCTGTTTTCCTGACGATGCCTGCAGCTCTGCCATGCTGTGCTTTCCTGGCTTCCCTG
-ATCCAGGCCAGAATTAGGGGAAGAAGAGGGAGCGAGGGATTTCCCATGACTGCCGGGGGA
-GGAGCCCCTTAGGACCCAGGGTCTGCGGGAGAGTCTGTTCCCACACCTGGATCCCCCCAC
-CGCCAGCATTTGACCGTGACCCCAGCCAGGCTGGGCTTTGGGGAGGAGGGAAACAGCCAG
-CATGGGCCCCCTCCCCGCAGGGCTGGTCCCACACACAGCCCCAGACCAGGCTGCTGCTTC
-CTGAGCCGATGAATTATTACCGGGAGATTTCCTTCCCTGTCTGCGCCTCCTCACAGGGGC
-TCCCAGCTCACTTCACTTTCGCTTTCTCCCCCTTCTCCCCCTCCTCTCTGCTTCTGACCC
-TCAGGCAGCTTGAAATTCCTCTGTCCAGCCCCCTCCCAATTCCACCTCCAACTGGAGATG
-CCAACCAAGGCGTGAACTGGGCCCGGAAGGCGAAGAGGGGCTTGCCTTGTAGGCTCATTC
-ATTTATTTGCTCCTTAGGCATATTTTGACACTTGGGACCCTGGGAGTAGAAGAAAACCAT
-GAATGAGACTGAGACAGGCCTTCTGCAGCCGAGAGGGGAAGGCGAGCTGTAAACAAAGGA
-TTTCAAGACAATGTGGTAGGAGCAAGCCAGGGTCTGGTATCAGAGAGACCCAGTTCCGGT
-TCCAAGGTTAGCTGcttcccagagtctcagttgcctgctctgaaaatgagataataatag
-tacccattcccagggctggtgatggttccatgagtttgtgccagtagagctgggcttggc
-acacaggagtgctcagtaCCTGAGAGGAGTTTGTGCTACTGTTTTTAGGGGCTGGCCCCA
-GCCAACTGCCTGGGAAAGGGCTGAGCAGCATTGACTTTTCTAGGTCTTGTCCCTGGGAGT
-GCGGAGGGGACTCCTACCACATTCTCAGCTCACCTACACAGGGgacctcagcttccccca
-ttctctgtccctcactctgctccagccacactggcctccccactaaatctggagcccact
-tcttcctggcccccctggcccctgatagtctcatagtttgttcactcatttccttcaaat
-cttcactcaaatcttatctcagggaggcccttcctgaccaccagcactaacagtaatggc
-ttctccaacctgccagcacccccagctctccctttccccttatcctgctttatttctttt
-tatagcatttgtcactgactttcattcattcacttattcattctacaaatattaactgag
-cacctgctatgtgctaggcacagttctgggtactgcggatacagcagtagaGacattaca
-tatttatttgtctaccacctgtctccctccactagagtataagctccatggggcaggtac
-tttgtgtattttgctcatctcacttccttcccaacacaaccttctgaggtaggtattgtc
-attattcccattttacagatgaagatacggaggttcaaagaggggaaagtgacttgcccg
-aggtcacacggtgggccaatgtgggagctgagattggtctgactccaaagccattgctcc
-ttccctaaccacatggcttctGAGGCAGCCTAGAGGCCTGTGAGGGCTGAGTAGGAGTCT
-GCCAGGTAAGAGGAGACAGGTGTCACAGGCTGAGAGGGTAGAGGCTGGTCCCTGCCTCCC
-TGACCATGGGCACCCTTCACTTCTACAAAAAGCATTTGTTTCTCAGAGGCACCTGCTGTG
-CACAACTCTGAGCCTGTGCTCCAGCTGTCCTTCCTGCTTGGAATGCTGCCCCTTTGGGTC
-TGACCAGACATCCCTAGTCCTCTGCCAGTGTTCAGAGTAGCAGATGGTGAAGGCCTCTTT
-GCCACTTTTTGCCAACCTTGCTGCAAAGTCTTGTTGTGTTCATCACACCATATTTTGACT
-TTTCTCCCTTCATCCCTGATTCTCACTTCCATTTCCCTCCCCTAACAGGGCACCCACTCC
-CATATCTTTGACGCATGCCTTTGGATATATGTGTGTCTTTATAAAATGTGCATGGCGTTG
-ATTTGTGTGTGGAGGTTTTTAATGTATATAAATAGTGGTTTCAATAGATCTGTGTCATAG
-GCTATTTTGTTTCCTCGACACTGCTCTGTGtgctgagtccagctcaagtcccttggttcc
-cactgctgctaagcatgcacggtgtgcgtgtgccaccatgcctccttttcccaccgcttt
-agtgatggatgctggctacctccagttcccacctccccaagcaaagctgtgatggacttg
-cagtgtgtgactctcatggactcccgtgtgtatttctctgggatgtacactcgggggcag
-gatccctggggtggagagaatacatacagttactgcactctatgacggctgcctcagtct
-acatgcccagcagcagggcatgagggaccactttctccacatgcaccctagcacttggaa
-ttatctgACTTCCCAATGATGGAGATATGGGTTGTTTTCCATCTCCTTGTGCTTGCCTCC
-ATCACGGTGTGGGCAATAATGAATACTTGTTgcactttgggtggccgaggcgggtggatc
-attgaggtcaggagtctgagaccatcctggccaacatggagaaaccccgtctctagtgaa
-aatacaaaaattagccaggcgtggtggtgtacctgtaatcccagctactcaggaggctga
-gtcaggagaatcgcttgaacctgggaggcagaggttgcagtgagccgagatcgcgccact
-gcactccagcctgggtgacagagcaagactccAtctctctctctctctctctctctctat
-atatatatatatatatatacatatatatatgtatatatatgtatatatatgtgtatatat
-gtgtatatatatgtatatatgtgtatatatatatgtatatatatatataATGAATACTTG
-TTGAACAAATGAATGAAAAGGCTAATACACAGCCTCCCACACCTACCTTGTACCAAACCT
-CAGTCTAGAAGGTGGCGGTATATGTGTGTATGTTTGTGTGTAGAGAGGGGAATATAAGAC
-AAAGTCTTATGCCTCAACCTGCTTAGAGAAAAAGACTaatgacagttagcatttattgag
-ggcttactttgtgtcaagaattCATAGGTGTATATTCACAACCTTAACTTCAGTGAGACA
-AGTAAAATGCATTTCTCTCTCATTCAAGGCCTTTGGAGGTAGGGCTGCTCTGGCATTCCA
-CAGtgtggtcgccagcttccaagattgccagcaatgatccttgcctcctagtattcatct
-gcgtgtgtagaaccctcccccattgaatcagatttgactcatgtgaccaaaagaatatga
-cagaagtgacggtatgtgacttctgaatgtagctcataaaggcattgagctcctgccttg
-ttctcttgagtcatttactctggggacagcagccaccatgccatgaggacactcaagccg
-tctgtggagagagaccaaggtccctagcctacagccatcaccaatttgccagccaagtga
-gtgagcctccttggatgtggatcctgaattcctgacctgcaggacctgtgaaaaagaaga
-aagataatacagaaagacaaagaaaaaagataataaataattattggctgggcgcagtgg
-ctcacacctgtaatcccaggacttcacaaggctgaggccaaaggatcgtttgaggccagg
-agtttgagaccagcctgggtaacatagtgagaccctgtctctaaaagaaaaaaaaggaaa
-agaaatttgctggatgctctggtgcatgcctgtgttcccagctactctggaggctgaggc
-aggagggtcgcttgagcccaggagtttgaggctgcagtgagccatgatcacaccactgca
-ctccagcctgggcaacagagcaagaccttgtctctaaaaacacaaaaattatcaatgttg
-taatcccgtaagtttagggtgttttgttatgcaacattagataactaaaacaGATGGTgc
-cggggacccaggctctgtctatctttttactgcaccatacatagctttcacttcctagtt
-ctcttacagagccacatggccacaggagccattctatctgcattccaactggcaaaaagg
-agaaagaggcagaaggaagagcatgctttaatctgtagaacaccaacctcactccgttca
-catcccgttggcaagatcttgtcatttgaccatacttaactgaaaaggaggctgagtata
-tagtcttttgcaggtaggtgtccgtgtgtgcagctgaacactgggtttctgttagtgagg
-aagaagggaagaatggctattgaaaacaactaacCATAGGTGTTATATACCATAGGTGTT
-AACTCTGGAGATAATAATGTCACAtggttaagtttgcacatttgggagcctgactgcctg
-gtttcagttctcagttaggccacttaccagatgtgtgatcttgggaaatttaccaaactt
-ttctgggcctcagtttcctcatctgtaaacagggctcacagtaaagcctgcctcataggg
-ttgttatgaggattaaatgagtcaatgtatgtagcgtttataacagtcctggcacatggt
-atgtgctGTGTGTTAGCTGTTTTCATTATATAATCCTTACAAGGGttttttttttttttt
-gacagagtttcacaattattgcccaggctggagtgcaatggtgcgatcgcagctcactgc
-aacctctgcctcccaggaggattctcctgcctcagcttcccatgtagctgggattacagg
-catgcaccagcatgcctggctgattttgtatttttagtagagactgggtttcaccacatt
-ggtcaggctggtcttgaactcctgacctcaagtgatccaccctctttggcctcgtaaagt
-gctgggattacaggcatgagccaccgcgcctggccACAAGGGGTTTTCTTAAGTTCTCAC
-AACCAGCAAGTGATGGAAGCAGAATTTGGCCCAAAAGCATTTTTTTCCACTTGCGTCATC
-CCATAGAAATTCGTAGAGTGCAAGATCAAGAcccagatcagtacaccgcacataatacgc
-atccagaaatatctgtcgaatgagtgagtTAAATAAACACGTAAACTGTCCTTACATAGA
-GATGCTAGGTTTTGTTTGGTTTTGTTTTATGTTCAGTTAATGAGAATGCTCCATTGACCC
-CATCTGGTTCCTCTAGTATGGGGCTGATGCCCTTGATACCATGCTAGAACTCAGTCCCTC
-CAGGGTCCCTCCAAGCCATCATTTTTAAGGGTGAATTCCTGGGAACACTTGTTCTTGCGG
-ATGCTCAGGATTCCATGATTTTTTttaaaaaaagtcagagaagctgcattttatatcccc
-ctcctagcgacctgcaacaacattagcatgttaaagagtcggagaaatcctgcaacaaaa
-aagcttgttgggcttcatttcaatctgcattttgttttcttatttttttgagacgaggtc
-ttactctgttgcccaggctggagtatagtgatgcaatcatggttcactgcagcctcgacc
-tcccaggctcaagcaatcctcccacctcagcctcccaaataactaggactacaggcatgt
-gacaaacccagttaatttttaatttttttgtagagatttaatttttttttttgtaggcaa
-ctatgttgcctaagctagtctctaattcctggactcaagcaatccttctgccttggcctc
-ccaaagtgctgagattacaaacatgagctaccgtgcctggtctcaatctgcattttctga
-gcttatttTAGGCTTACTTGATTAAAGACTCACTTCCTGCCCCCAACACCAGACACCTAA
-TAGAGAATACAGTTTAGCAGACATTTCTCCGGGCTGTTGCCACTGACATCTACCTCAGTG
-TGAGTGGGTATCCATTCTTTCTAGACAGCATGTTTGATAGGAGTGAAGTGGAAGTGAGCA
-GGTGGGTGCTGGTTACCAGGAAGAGACAGGGTAAGAGAGGGAACATACAGGCATATGTCC
-GAGCCCCACTTTCTAAGGGACATAAAAATATCATTGAAAATATAATAGGTGGAGAAAAGT
-GTATTTCGTGGTACTTCTTTCAGGGAAAATGCAATGTAAATTGAaataataatattattg
-aggggtaacaatatgccaggcactctgctaggaacttatttaatcctcacagcagtctca
-tgagctaagtactattaatattcccgttctataggtgagtagactaaagagcagaaaggt
-taagtaatttgcttaaggtcacatagctagggagtggacaggaattcTTTGATAAGTTGC
-TTGTGGTGAGGATAACAAGGGAAGACCCTCCCCCGGGGTAGTTTAAGCTCAGATGCTCAC
-AAAACTCTGCTCCAGGGAGAGTGAGCCTACTTGGTTGAAGAGCACTGATTTTGTTGAGTA
-GAGGATGCAAGTTTGGGCCAGAGTGGAATTGTTCAAGAATAGAGAGGAGGTTGGTGCTGC
-CATGGGTGCCCTCCTTCAGCTCCATCGCTTTAAGGAAAGGATGAGCTCATGTTTAAAGAC
-TTTTAAGTTGAAGGCAGTGCTAAATAATTTAGTGTGGTCAGGTACCCACCTGACTCAGGT
-TGACCCTGACACCAGTGCCAGGTGTGGCAGAATCACCAAAATGGTGTGGAAGATCAAGAT
-AATGCTAAAtgaaactaccatttaagtctgctttgaaaactcaaggagtttggagctcag
-agttgccaagaacaagttggaatggcctgaggctgccatgctatgaggaagcccaggcca
-catggagaggccacatgcttttgactggtcgttctggtctttcaattctcccagctccag
-gaacagacacatgagtgaagaggctttcatacaattccagccccagttatcgagtctttg
-ccattgaagcctcagacatcatggacagtgacaagtcttcactgctctacccattctgaa
-tcctgaactacagaatccgtgagcataaggaaatgcttaagacaccaaattgtggggtaa
-tttgTCACACAGCAACACTAATTGTGACTGTAGCTCACTAAAATGCCTCCCAAATATTAT
-CTTCACAACTAAAAGCACCAAAAAACCTGAAAGTAcagttgaatttcatgatttgctata
-attatattctagaaagtcactgcaaacactgaattagcaaatactgaaccactgctccta
-ggagaaatacaggcttaggttcctgtgaaccattctgttcccaacatgttcatcaactca
-tcaatacttaagcttgttttatgcatgtttctgttgaaagacaccatgtttaatacatat
-tgttgattcactcacattgcactcatggccaacagcactgtaactcacgcctgaatgaag
-cttatctaactcacatgatcttctctgtaaggcacatcaaagccttctggtgcttaggaa
-cattagacagcacctcagcaccatgcccggggccattgtcaacagtacaatcaccagcgg
-aagacacaaaaatttgtaaaatgtggcactgaatagactgaaaaggacagttgtttacag
-tgtgagagctgaaagaagaaggcagcgtgtcactttgtatgatctcacctggaaacatgc
-atcaagtgactcaaaaaaaattttttttttcgagacagggtctcactctgttgccaggct
-ggagtgcagtggtgggatctctgctcactgcaacctccgcctcccgggttcaagcagttc
-tcctgcctcagcctcccaagtagctgggactacaggcacacgccaccacacctggctgat
-ttttgtatttttagtagagacagggtttcaccatgttggccaggatggtctcaatcgctt
-gaccttgttatctgcccacctcggcctcccaaagtgctaggattacaggcgtgagccact
-gcgcccaactggcaactcaaatttttcatgactcctcaagtatccatcaatgaccatgag
-agctccagcgagtgttgattttgaggttacaaatttagtgagtagatgaatccacgactc
-cacaatcagtgactaataagaattgactgCATTATTTAATAAGTTCAGGGCTTGCCGTCG
-TGATTCACAATTGGAGAAAGCGAGGCATGGAGCAAGTCCAGGGGTGTTCCAAAAGGCCTC
-ACTTTTCTCCTTTGCAAACTGTGGCTGATGAGGGCCATCCTGCGGGGTTTGTGGAGAGAA
-GGGATAGTAACAACAGCTGCATTGTATGGTGCTAtgtgctgcacactttgcacacctgat
-catttaatactcacaatgatccctagcagatggatcctattaccaagttcattttacaga
-tgaggaagcttagacccagcaaggttaaggggctgtgctcaaggtcttaccttctaggag
-aggcagagctggatctgaagccatttctgttctcagcccctgctGTGTGCTTTCCTACCA
-TCCTCTCCAGACTCGCCCTGAGCCCAAGTTGCtgaggcatgtggcacggtgcctggcaca
-cagtaggctcacagtagtggctgctttGATGATGACCATAAACTGGGATCTGGGGTCCTT
-GAGATGATTCTACCAAGGGGACCCGGGGGAAGCTGAGCCCTGGGGCAAAGTGGGGGCCAG
-CACAGGAGCTGCTGGGGAAGGAACAGAGCCTGTGCGGTGGGAAGATAGGACATGGAGCAA
-AGAGGATCTTGAATCAGACCCCGTGGTCCCCTCCTACAGAGGGTTAAAGCAAGCCAGCCT
-CCTTCCGGCTGAGCGGAAATCAGATTTTGAGAGCTGAGCAGGGCTCTGGAGGGATGTTTT
-TCTTCTCCATTTGTCTGCTTGTGGCTGGCCCATAAAATCCACCGGAACTCCATGCTGGAC
-TGAGGAATTCCTGCTGAACAGGGACATGGAGAACGCAGGCTGGGAGGGGGCATAGTGTGG
-ATCCTTATCAGAGCAGAGACCACCCCATCTTCAAGGCCCCACCTCCAGGTTGGGTGATCC
-CCTCTGGAGGCCTCATAGGATTCCTGGGTAAGGGGAGGGACCAGGATCGACAGGGTGGGG
-GAAAGTCCAAGGAACAAGTGATACCCCCTCCCACCTTTTCAAAGTGAACTTGTGGGGTGA
-GGAATGAGAGGAGACAGGGAGGGTCAGGCTGTGGCAGGTCAGTGAAGTGtgatgcaggtt
-ccaccttctacgctgtgtgacattgggcaagtctctgcccgtttcctcatcattgcaacc
-agggggctggagctagatgaccaccatgtgtaattttctaatcagagctgacagtctgag
-gctctTTCTGTCTAGTTTGCACCTTGCATGCATGTCCTCCCCTGAAGGCAGTGCAattat
-tataacccctattttaaaggtaaataaaccaaggctcactgaggcaaggtgacctgagca
-attttgcccttgaagggctgggacaggatgcaaacctagacaattggtgccagaattcat
-ctctcaagcattcgctctcctgCCTCCCAACACGAGTTTCTACttctctttgccctggga
-tgacctctcctttgtctcttggcttgatgacctcatttttaaagattcggctcatgcatc
-acctcccccaagaagcctgtcctgactaactaagctcggttggggctcctctctgtctgc
-tcatgcctctgggaagtagctgtctcttttggtcactgggctgtgagccctggatgagca
-gagccacttctcattccttcctgtgcctcctgcatcAGCCAACATAAAAAGCTTTCAATT
-TTCCTTGAAGATTCTAAGTGCTTGTGGTGGTTTTAGAACATGGCTGCCTTAAGAAGTGGG
-GTCCATTggtagctcatgcctgtaatcccagcactttgggaggctgaggcaggaggattg
-cttgagcccaggaagctgaggccagcctgggcaacacagcaaaatcccgtctctacaaaa
-aatacaaaaattagccagatgtggcagcatgtgcctgtgggctcagccccttgggaggct
-gtggcaggaggatcacctgaacctggggaggtcaaggctgctgtgagctgtgattgcacc
-accgcactccagcctgggtgatagagggagaccctgtctcaaaaaaaaaatggggtttat
-gtctcctcctcttgagtctgggtgggctcgtaacagctttaaccaatagaatatgtcaga
-agtgactctgcgactactgagactgttcactggcactctgtttttggagccctgagctgc
-cgtagaagatgttcaaatactctgggactaccatgctgtggggtcacatgtaggccctcc
-tagtcttcaagtcatcctggtctggggactccagatgattccagttcttagttgtttcat
-atccagcctttgagtcctcccggctgaggaccaagacaccacggagcaaaaacaagccat
-ccccaccactcctggcccgaattcctaagcataataaaatggtggctgcttaaagccacg
-gagttttggggtagtttgttacacagaggtggtaacgggaacaGtgcgaccaccctgggc
-atgtcaccttcctctctggccagccagaaggtgcagcagccacaaagctctctgcctcct
-cccttccctcagcggtgtgctgctgacacagcagtcagagatgccccataaatgcttcaa
-acagaccatgtccctcctttgctcaaaaccgtctgttggctcccagctcactcagaggaa
-atgccagattcttaccatggcccacgggccctacatgatgggacccctctccagcccatg
-gcctctctgtcctgtctcccaccctctcccttctccagccacaccacctccttgctactc
-cttgaacaccacatacgccctgtctcagggcctttgcgcttgccaaggacagtgctccat
-tgcctggaacattctttctccaggtgttgcttggttcagtccctcatcttgttcatgtcc
-ctgctcagatgtcatcttctcagtgaggccctctcttcctactcccaaaccccttgactt
-gctctattttcctctcgccatggcccttagaactacctaacacactatgcactttactta
-ttgtgtttccccgcccaccccgtccaccctagaatgtcaataccacagggcaggaatctt
-ggttattctttaatgtctccccagtgcctgtaagagtacccaacactcacagtggtttgc
-tgaatgaatgaatGAATGAGCTGTAGGAGCCCAGAAGGGGTTCGTTGCCTTCCCTAGGAC
-TATGTATGTGGGGAAGCAGAGTGGGTGAGGAAAGGGCAGGATTGGAGTGACTGGGTTGAG
-CCAGTGTGGCCAGGGCTGGAGGACATTTCTTGGAAGTGACAACTCACTGCCCAGCTGGGG
-AATCCTGAGGATGGGAGAGTGCAGGGCAAGCCTTTGAAGATGCAAACATGGGTCGTCTCC
-GGGGCCTCCCTCCTTCCTGGTCTTGTGTGTCTCCGGCCCTGCCAGTAAACAGGATCTCTG
-GGCAACTGCCTGAGAACCCTGCCCAGTGCCCCAGAGGCCCTGACGTGCTCCTTCCTGAGC
-TATAAATCAGGTACCTTCCAGCTGTGTGACATCCTGGATTTGATGGGGAAGGCAGAGCAG
-ACAGATTTGTTGCAAAGAGCTGTGCActgcaccttgatttccttgttagcaaaataggaa
-ggataggagcgttgacttcaagctgtggctgtgaaatcgagtgagataatgcatgaaaTT
-CCTCTGTAAACAGAGATGCTTCAAGGACGCATTAGTGGGTGGAGGCACAGGgagcaaatc
-ccaactctgccgctgagctctgtgtcttcacctgtaaaatggggttaatgtgaatcacta
-acttcctagggctattgagggattcaaaaatggagagaaaagtcttagtacccaatgaac
-gtgcaatagatattagctgttattaATGGTAACTATTACCATAATGATAAAGAATCAGAT
-GTTATTGATAAGCCATTTGGGAGACCGAGAGTCTCAGTTCATACCCCAGAGGGGACCATG
-GACTTGGCACAGCACGATTTCAACCCTGTGCCTTTTGTGTATATTTCAATCTGGTCAGAG
-ACTATCTCCCACTCACAGGCCACCTCCTCCCCCTACCCCCAGAAAGGCTATACTTGTGAG
-CACACCACTTCCCTAAAATATGCCACAAGAGTCGACATCTagccaggcacagtggctcat
-gtctataatcccagcaatttgggaggccaaggtaggaggatagcttgaatccaggagttc
-gagaccagcctgggcaagatggtgaaaccatctctactaaataattttttaaaaattagc
-tgggtgtggtagtgtgcacctgtagtcccagctacttgggaggctaaagtgggaggattg
-cttgagcccagaaattcaaggctgcagtgagctgtggttgtaccattccacttcagcctg
-ggcaacagggcaagaccttgtctctaaaaaaatttaaaacaaacaaacaaacaaagaATA
-AATATCTAGCCTTGAAGCCAGCCTTGGGGGTGGGGTGGGAGGAGGACTATTTGTGtgcag
-gagttcaaacccaggccccatcactccccagatgtggaaacttagacatgttatttaatt
-gtcctatgcctcagttccctcaactgaaaaagagaataataatagtacccatctcttcta
-gttgcattgaggactgaatgagttaaAAAGTACCcaacacaccatatgagataatgctat
-tttcattctaccaatgggtaaactgaggctcagctaggagaaagaacttggttcaagCTA
-TCAGTCGTGTTGTTTATTGGCCCTAAGTTGTGACGAGTTTCATTATACCATTAGAAGCCC
-CCGAACAGTGAACTCATTGTTTGTGAGGTATCTCTATCTCTTAGTGATTTTTTAGTTAAA
-TGAGAGTCCATGCTAATCATTTATAAAAAATGGATAAGATAAAAACTTAACATTGAAACA
-TCCATGGGCTTCTTTCCATAAGAAATGGAGAAACTCTTGCTCCTAGTATTAAAAGGTCGT
-GGGTTCCAGTTTGAGATGCACCAAGCAAGGTAATAGGAAGTCCTTGAAGGTTCTTGAGCA
-GGGGGAAGCATGAACTTAAAGCATATGAACCATGTGTTTGGGTCAATTCAagttactgag
-acttagacattgctggtgggatgcaaattgctacaatctctgtggagggtgattgagttc
-cacaaatatttaagataaatgtaagagctcctaccAAAtgccaggtgctgttcaggtgct
-aaggatttgcagcaaataaatccaaccaagtccctctgcctggtgcttattttctggaga
-ggagacacacaatgaatgaatatacaacttagtatagcgtgCACTGGGGAAAGAAATAAG
-AGCATTTCTACAATAATGTTTACTGCAGTGTGAAGGGGGATCTGAAGAGGCTGGACAGAG
-CCAAGTATGGGTGAAGATGTGGAGATAGCGCTGGGGGTGTGTGGACTGGAGCTGCCATCT
-GGAGAGCAATCTGTCCAGTTAAATCTGTACATTGggtgcataaattatggccaccaatta
-tttgacattcctcccatctagatgtaggtctatgtatctgctctctgaatctgggctggc
-ctctgactgctttgacaaacaactatggtggaagtgatgatgtgtcagtttccaggccta
-ggctttaaaagattggcagcttctacttcctctttcttggaacaattacttgaggggaag
-ccagctgccatgaagaactccagccaccccaagactgccattctgtgaggaagtcccgcg
-aacaatggaaagaagtcctctaggatgagacaccatgtgatggagagagaggccaggaac
-atcaaggctgtagacatgagtgaagatgccatcttgaaagggaacctccagccgtagctg
-tttcagttgataccacaaggttcagaaaggagccacccagctgagtccttcctaaattcc
-tgactcacaaagtaatgaacaaagtggttgctttaagcctctaagttgagggtagtttat
-tgtagtgcaaaagataaccagaataGATatatccgatgacccagcaattatactcctggc
-tatatgtccagacaaaatTCTCTTATCAGCCCATAGAGGATATGGCCATATTGTTGTGGC
-AACAGAGAGTTAGAGGCCACTCAGGTATCCATTACTGGGGTGGTAGAAAGGAATACATGG
-TAGGTGCAAAGAGCTCTAGGCAGCAATCAGAAGTCACAGGTGAAGCCACACATACAAGTC
-TGTTATGTTCTACGTGAAGACTTATACACCACAGAATGCACAAAGAACCCATCAGAATCT
-ATGGAGGTGCAGAAAATATGAAGGGGAAATGGGATAAAAAGGAATAACTAGAGAGAGAGA
-AACAAAACCAAACAAAGGAGGGTGCACAGGGGTAAGTTATGATAATCTGCCATGAATTGA
-GGTCTTATTAAACTCAACGCTCTACATTTAAAATCTAAAAAgtaataacaaaggccaaca
-aaattaatgtgtgtgaatagggggttggttaaataaattgtagcacatccacatgaggga
-gtactgtaaagccataaaaaagagtggcagagcttgctatgtactaacatgtaagagtcc
-caaagtatgtcgaaaaggctataagaagggtattgaaaaggatgcataataggcttccat
-ttgGGGGGAGATACCAGTGTGTGTGGTTGTGGATATGTTTATAGACAAATGGTATATCTG
-TGGAAGGATGCTCCTGGGGAAAAGAGCCAGATGTCAGGGGAGAGGGGTGGATGGCACTTC
-AGAAGAGCAGGCACCCAGGAGCTGTGTTCAGAGAAGGAATTGCCACTAACACTGGGACCA
-CCTCCTCCAGGCCAGGATCACGCCAGGTGTGGGGGCTCAGAGTGGGCAGAGAGCCTCTGC
-TGCTTCCAAGATGCCCAGGGTCCTGACTGTGTCCATGATGCAACCTCAGCCAACAAGTTG
-GTTGGGCACTGCCCACTGCTGTGCCCTCATCAGCCACTGTCCTCACTTCATTGCCACTCA
-CCATCACCACTCTCCTTCATTCTGCCTGAAACACTCCTCCCCACTGCCCGTCTCCCTCTG
-TTACTTAATACTCAAACTAGTACAGAGAATAACAGAATAAAATCCCATGTACTCACTGCT
-CAGTTTAAGGAATAATACttttcttttcttttttgagatgaagtctcgctctgttgccca
-ggctggggtgcagcagcgtgatctcagctcactgcaacctccgcctcccagattcaagtg
-attcttctgcctcagcctcctgagtagctgggattacagggatacgccaccacacctggc
-taatttttgtatttttagtagagatgggatttcaccaagttggtcaggctggtctcaaac
-tcctgacctcgtgatctgcctgccccggcctcccaaaatgctgggattacaggcatgagc
-cactgcgcctggccTAAAACTTTTCAAAAAGAATTGAGAGTGAAtggttttaaatatgtc
-cacaaattcttggacactcctctcttcaaaaagtagagttacattctccttacctttgag
-tatgggctgagctcagcaactcatgtctaatgaagaggatgtggtgaatgaggatgggtc
-acaaaagggatacaacttctgcttaattgtccatctgtccgtctatctctccatgctcac
-ttttggaatccagccaccatgttgtgatagaacccaagatgcatgggcgggcccacatgg
-agaggaactgaggccctctcccctcttcccagtccctgatcaacaaccatcacaaatttg
-ctagccacccagatgaaccccctttggcttggcagcaaattctccagcttaccctccaac
-tccccaacccgataggccttcagatgactgcaggcccagctgacagctgaatttagcttc
-ctgaggaccagaaccacccagctaaaccatgcccatattcctgccttcagaaactgtgag
-atataaaaaatgactgttagtactttgaaaacattatgttttgggatgatttctaatgca
-ggatcgattgctaatacaGAGGGTCCCTGGTATCCCTCCCCACCATCCCCATCCACCCTC
-TTAGAAGCCACAATCCTGATGTTTATTATTTCCATGAATGTTTTACCTTTTACTACATAT
-AATAAATCCTTACCCAATACATAGGACTATAtttccttcttttttaaagaattttttctt
-tttgagatggagttttgctcttgttgctcaggctggggtgcaatggcgcgatctcggctc
-actgcaacctccgcttctcgagttcaagcgtcattctTAAAAATGtatagaagtgcatat
-atattgtatggattctgtgcatcctacctcgcatgctcttttccttgcacagtgtgcatt
-ggcgacccatctgcattgaggcaggcagctgccattcgttggcactgctgggcattcttc
-ccttatatgaatatgttaataccacgatatagtatctgaagtccatgttgatgaacattt
-ggatggtttttattttttgctattacaaacaacagcgctggtaacatccACTTGCCCTCT
-TCCCTCTTTCACATGGCACCTTCTTGTTCTTGGAGGTCTCAGCTCTAACAATGTAACCCC
-ACCAACCCCCCGCTCCAGCTAATGGGTTCTCTGTCCCCACATGTGCCTCCCAAGCTGGCT
-TTTGATGGTGctccctctgtttttccttctggcatctactccgtgtggtcaacattcagt
-tatcttttcctgtctggagctagagggtaagccccatgaaggcaggcagagtagtgggtt
-tttttccccagtcccctccatccctgatgctttgcacagggcctggcacacagtaggttc
-gcaagaaaaattgttggatcaggaatgGCTGAGAATTAGcttcctctctttgggcttcag
-ttttcccatctgcacagtgaaaactttagataatttcGGGGTGATTTTAGGTTTAGCCTT
-TGAGAGGTGCCTCAGTGGCCGCCACAAAATATCGGAAGACCCCAACTTTCAGCAGAGCTG
-GCCTTGTTTCCCTTGTGTCTTAGATTGGTCTCTATGGCAGATTATGTTTAAAaagaatag
-ccaccatttattgagcgctcactacgtgataggcatgctgtcagctggcagatgcatttc
-ctcattttggccactcattaaccctcagaagtagcactgttactatgctctttataaaga
-ggggtaaactgaggcaaagagaggtgaagtcacttgtcagaggactagcaaaggagggag
-ctgggatttgtagcacaagagactatcagagcccattcgccaaccctggtgcagccctgc
-cccactgGTACCACAGCTTTAAAGAAGTGGGGTGGGAGGCAGAGGAGGAGGACGGTGAAG
-GACAAGGGTGAAGAGAAATGTTTGGATAAGTTTGACAGCCACTCTTCTGAAGGGCTTTGC
-CAGCCGCAGCATTCGGGTGTCCCTAGTCACGGGGGCTCCGTCACTTCCCTATCCCCCTGT
-TTCCCGGCCCTGATgggtcttgctctgtcacccaggaggctggagtgcagtggcgtgatc
-acagctcactgcagcctggaactcccgggctcaagtgatgttccccatcagccttcctag
-tagctgcgactacaggcgtgcaccaccatgcccagctaagttttaaatgtttatatagac
-acagggtctcactatgttgcccaggctggtctcgaactcctggcctaaagcaatcctcct
-gtcttggcctctcagagcactgggattaaagtgtgagccactgtgcctggctGAGattta
-ttgatcacatagatacctatattattctaagtgtttttcaagtgacaactcatttaatct
-tcataactgtcctgtgacgtagatagtatcagttttatcagtattttatggagattaagt
-aacagaagcacagaaaggtcaagtaacttgcacagagtcacacagctggtaagatgtgga
-cccagctttgaatccaggcagtccagctccagaatccttgtgcttcacATCACCACACGC
-TGCCTTCACCATCACGTGTCAGTTCCACACAAGTGGATGCCCACAATGGTTGGGAGTAAG
-GGGAAAAGGAGTAGGGCTTGAGGAAAAAATAAAAGTGAAGCGTGTGATGATAATGAGCTA
-TGCTTGAGAAATGGGATTAACTCAGCTCTCTGTACTTGATAGAaaaaagaaggagaagga
-ggagaggaaagaagaagaaggaaaTATTTAACTGGACTCTCCGGGGCTTAATTATAACAA
-CTGTCTGGCACCTAAGGTCCTTCCCTAGCTGGGcttgctgcttctctaatctcatttccc
-tacgtttctcacggtgctccagtcactccaggccacacctgatcccagaaacctacttgt
-tcctactttgagcctttgcttgtgctgtttcttccattaagggtgccctttttgccaggt
-gcagtggctcatgcctataatcccagcactttgggaggccgaggtgggacaatcacctga
-ggtcaggagttcgagaccagcctggccaacatggtgaaaccccgtctctactaaaaacac
-aaaagttagccaggcgtggtggcaggtgcttgtaatcccaactacttgggcggctgaggt
-gggaggatcgcttgaacctgggaggcagaggttgcaatgagctgagatcatgtcgctaca
-ctccagcctgggcaacagagctagagactccgtcacaaaaaaaaaaaaaaaaaaaaaaaa
-agagtgctcctttccccattttaggaactcctacacatccatcaaaacctggcctaaagg
-ccctctcctcaatggaaccttttccagcctttcacttcttggggttcccacagcccttta
-catgtctctattctggttggctcacctgctagccagtgagctcctggaggacagggatgg
-gtctggctcatctctttaaccgccatgctgagcccagagcctggtaaatggtgggtgctc
-tataaGCTCGTGCCCAGTCACTCACCTTTACAGCTCcagtgtctggctgacagtgggtgc
-tcagtacatgtggttggacagatcaatGAGTGAATATTTGACGGAAGGGTGAATAATGAC
-ATCAAGGCTGCATTCCAATAACAGCACAATCCCAGTGCTGAGAAAACAATTCACAGCCCT
-GGATTCATATCATGGAATTCTGATTCCTAGGCCCCTTTGTTCCCAGAGCTATCCGATGAT
-GCTGAAGAAGAGTCCCTGGGCATCATCTGTTccagctgtgtgaccttgagcaagttgttt
-aaccaccttgtgccccaagattctcatctgcataaagaagagaaatagctacaccttcct
-catgggctagttacaaggatgaaatttgatcatatgtgccaagcacttaacacaacacat
-gaacatCACGGCATTGGCATGTCAGCTATGCCAATGACTCTATTTATACCTGAAttttta
-tttgaaataatttcagacttacagaaagtttgcaataataatacaaagaattcctacata
-ccatcacccagattccttaaatgttaacattttgcattctttgctttttcattctctctc
-agcatatatttttgtccagtgcctgaattgttggaaataagttgcagacatgttgactct
-ttacctctaagttaattatcccatgtatatttctaaaaacaagaatattctcttacaaaa
-tcgcaggacagatagaaaaatcaggacactgatacaatgctattgtctatcttatagacc
-tattgaaattttttcagttctactaatgtcctttgtagcaaataaacaaaaagatttcta
-cccccccaccccacccactcagtaaccagtccaggacacatgttgtatttaatgtttatg
-tctctttagtcttctttttagtcttatctggagcagtttcttttttttgagacagagtct
-tgctctgttgcccaggctggagtgcagtggtgccacctcggctcactgcaacctctgtct
-cccaggttgaagtgattctcctgcctcagtctcccgagtagcaggaattacaggcgcctg
-ccaccacgttcagctaatttttgtatttttttagttttaccacgttgaccaggttggtct
-cgaattcctggcctcaagtgatccacctgcctcggcctcccgaagtgctgggattacagg
-cgtgagccactgtacccagcgtggaacagtttctttggcttttatggctgacattatttg
-aagagtttaggccagttttttgttttgttttgttttggtttTTGAagatggagtttcact
-cttattgcccaggctggagtgcaatggcaccatcttggctcactgcaacctccgcctctg
-ggttcaagcgattctcctgcctcagcctcctgagtagctaggattacaggcgctcgccac
-tatgcctggctaattttttgtatttttagtagagacagggtttcaccatgttggccaggc
-tggtctcgaactcctgatctcaggtgatccatctgcctcggcctctcaaagtgctgggat
-tacaggtgtaagccactgtgcccagcctggaacagtttctttgacttttatgatcaacat
-tatttgaaaagtttagaccagttgttttgcagattgtccctctgtttggatttttgtgtt
-atttctttatgcttggattcagatcaggcacttgtggcaagaacaccgcatcagtgacgc
-tttgtccttcacagtgcgtcccatcagggggcccatgatgcctgccgacttgccccacta
-ttagcaatgttcactgtgatcatttggtgaaggtggtgtctgccagttttccctactgta
-aagttaccatttttctctttgtaattaacgaataccttataggaagatacactgatacta
-tgtaaatattctgtttctctttatatttcctgcccatatatttcctagcaggatgatcta
-ttttgcaatagatgcaattattatttgatAAAGGAATACATAAACATGGACCAATATTCC
-AACAGTATAAAAGAGTGTAAGGCAAATctcccacccactccgtccccagccaccccgatc
-ctctccccaagccatccctagtctcactgtttcttgtgtccttccagaaatgttctatgc
-atagacaagcgaatccactcatccatcttcttctcgagttatgtgcatgcagaaggtagc
-taaatagacacatgatctgcatcttgttttatttcatttaatattttggagaccatttca
-tatttgaacacaaagaGAGATCTCTTGCTGATTTTAGAAACTTATGTCCATCTGAGGTGC
-AATCCCAGGGtagtcaatctctttcaggttcacaaataaggaagctgagactcagagtgg
-ggaagggacaggtcccaatgtcagaggcaaaacagacTTGGAAACCAGCCTGGAACCCCT
-GAATAAGAGAGTTGACAGGTCTTACTATTGGGGAACCAGTCCTTCCAAGGGCCTTTTCAA
-CAAAATGCCAGACCCAGGCTCATGCCCCCGTTCTCAGCCTGGCTTCTCCCTCCTTCCCCC
-CTCCTCCCCTGGGTCCCTTCTTAACTCTCGTTAGGGACTCCCCTCCAGCTCCCTGCTGGG
-CCAGGCCTTGGGAGCCCCATTGATCCTCTGACAGCCCAAGACAGATTGGTGGGGAGTGTG
-TATTCAGGTGCAGGCGCCAGCACATGGAGGCCAGATGAGAATGGGGTGGAGGGGGTCAGG
-GGCCTGCTGGGGTGGGGGGATTGAGGATTGAGGAAGGCCAGGATAGTGCATCCCACAGAC
-ACCTGCCTCCCCTCTTTCTCCCCCACCAATTCCTGCCCTTCTTGGGGCTTCTGTTCCTCC
-CGCCTCCTCTTGCCAGGCGTGGGCAGGCCAGAGGGGCTGGGGCAGGGCCTGGGAGGCCTG
-GGggtgtagcagagagaagtcgggatggggagtgagccttgcttggtttgatctcagctc
-aggccctcttgtgagactcaggcagatgacatctcttgagcctccgtctcctcggggcaa
-taagaaggaaataaACTTCATACAGCGTCCAGCAGCCAGTGAGGCATGGCCAGTAAAGGT
-CTCCATGTCCTTCATTGGCCTCTTAAGGCTCCCACTGCATTGTTCCTGTCTGATTATGGA
-AGCCCCCAAGCCAAGGCGGCCCCTCGGCTCTGCCTGCGGAAAGTTTTCCCTTCACCTGCG
-CAGACCAGGCCGATGTGGCCTCCAGAATGGAGGGGTCAGCCTAGGTTGCCTGTGACAACT
-CTGAAAGGCCTTAGGAGGCACAGCATCTCAAGTGCACACCCGAGTATGGCGTGATCTGCA
-AGGGGAATAGGGGCTGGGGGGAGACATAGGCTTTGAAGATGAATCAGGCTGGAGCAGGGT
-GGAAGTGGGCTCAGGGAGATGGAGCAGGAGGGGTTGGTCAGGGAAGAGGGAGCTCAAGGG
-AGGAGACATAAGCGCAGAGAGTGAGATAGATAGGGACCCAGCAGCAAGTGGGCTCAGAGA
-GGGGCTGTGGTGCAGAGAGAATGAGACTCAGATGGGGGCTGTAGACTCAGAGAGAGAGAT
-GGGGACAAAAGGGGAGTGGGGGCTCAGGCAAAGGGATGAAGGCAGAGATGGGAAAATTGG
-GAGGGAGGGGAGCATCCGTTTTGGGAGGGAAGTGTCAGTTTTGAGCACACACAGTCCTCT
-GCAGCTTGAGGAGGAGGAAGGCTGGGTCTGTGGAGGGTGGGGAGCGGGTGGCACCAGAAC
-AAAGCCCCGGGGGTAGCAGCCTGGGCCCTGCAGCTCCTTCGCAGCTGACAGTCCCTGAGC
-TAATTACCATTAATGAGCAGCTGGGCCCAGTTTCCCGGGATTTGCATTCACTGTGCTAGT
-CAGCGCCACTGTGGATGGAAGCCAGCGCCAGCCTTCTGGGGTGGGGGTGACTCAGGGAGC
-CGAGGTAAGATCGCTGGCTTCATGTGGGGCTGAAGAAGGTGTGGCTTTGCCTTTCCTGCA
-GGTTAGGAGATGGCCGAGGTACAATCGTGCCTGGAGGCAGGGCACTGGCATCATCCACCT
-GTCCTCAGCCAGGGCCGGGGTAAGGGTCTTGGGGAAGGAACAGGTCTTGTGGCCCTCAGA
-AGCCCTCAGACATTTGGTTGCAGGGGCCCTCAGATTGTGCAGCCAGCTGTCCACTGCGGA
-GTTGAGGGAATAGACCACAGAGGAGCAACGTGCTGCTCAAACTCATACCAAGACAGCATT
-GCTCGTTAAGCGTGCCtgtgtcagacgctgtccaaagcactttactgaatcttcactacc
-aaccccatgtggtggctgttattagcaatcccattttacagatgaggaaactgaggcaca
-gagcggtcacacagccagggaccagcagggctggcatttgagcccagtcctcctgactGA
-TCCCTGCTGGGCAATAGGGCTGAGGAGCTCTCAGACCTGGGTTTTCCCTTGTGATGGGGG
-CTAACAGTGCCTCTCTCCCCCTAATTCCACTCTCTGCAGGGATGCCGGTATGTTTGGTGC
-CCCTGGCAGGGTTGGGAGGTGAGACTTAAGTACAAATAAATAAACAGGGAGCAGATGGTT
-GTGGGGGGAGTGGTGGTGCTGGGAGGGATAGGGCCAGGGCCTCCCACTTCTCCTTGGGAA
-AACATTTCTGGGCTGGAGCAAATGGATTCCAGACTCAGGACCTGGGAGCCCCTTCCCCAG
-GCCTGCCCTCCTGCCTGCTGGCCTCAGACCTGGCCCAGCCCTTGGgagaaatggtgggct
-ggggtcccgagtcttgggttctgcccatccctcatttctctctcttcttcctgtgtggcc
-ttgagcaagtccctttacctttctgtgcctctatttcctcatctgtcaaatgagtggaag
-gagaatgaactttatcaagtttctgttcaagggccacctcccctgggaagcctttcttga
-ttgctccaggcAGCTTCTGTTAGAGCAACAGCCTCGAGTATCAAGGAGAACATAGGTATT
-TGTGTTTTTCATTTCACAACAatccattcaacagatactttctcagggtcacctatgtgc
-ctggcacgatgccaCACTCCAGGCTGACTCGTAGTTTTTCTCTGTAGCTCcagtgctggc
-ccagagtagccactaataaacatgtgtcatgtgcatgaatGATGAGTGGGTGACTGAAAG
-GGAGCATGAGGAGCTGcagtgtttcccaaacgtggtacttgtatcttgggggtgggagtg
-gggagtggataaaagatgatacgggtgaacagcaacaagttattaaataacaataaatca
-acagtgaaaaagttattcctttttcattacctcccagtccttcttacaggccaaggagaa
-ggtctccgatgatgccaggaacgtgtttctagcacctgtggatctctctttctctctctc
-tctcccccaactcccgcaaaacccaccccaagaaggctggtcttgggctcagagcttcta
-cagacaacactatctagaatttgagaatgttgtttggtttccattttattcattttggtc
-agttaccttttatttgtgacaagggattttgatttttcctttgtTTGGACATGGCCAGTG
-GGAGTTGGAAGTGTTTGGCACTTTCTGATGAAGTGATCAGGACCAgggtggggaagaggg
-ctcgactgaaaaggggcacgagagcacttgtggggtgatggaaatgttctgtgttttgct
-tgtggtcgtagttacatggctgtgtacatttttcaaaatgcattgcacgataacacttaa
-aataggtgcattttattgtatgtaaattatacctcaaAGTTGATTTAGAAACACATATTG
-AGggctgggaatggtggcttacgcctgcaatcctagcactttgggaggccaaggtgggtg
-gatcacctgatgtcgggagttcgagaacagcctggccaacttagcaaaaccctatcttta
-ctaaaaatacaaaaaaattagccgggcgtggtggtgcatgcctgtaaccctggctactca
-ggaggccgaggcatgagaattcttgaatctgggagacagaggttgcagtgagctgagatt
-gcactactgcaccccagagcgagactctgtctcaaaaccaccaccaccaccagcaccacc
-accagcaccaccaccaccaccaccaccagcacATGTTGAGGatattaagtagataataat
-acagatggcatgtaggtgtggccaaagtcatgaaggtTGCCCACCACACGGTAAACTTTG
-TAGTCagtgaataaatggatagataggagatagaatggaggaatgcatgaatgggtaaat
-gagcaagcgaatgaatACCTATCTCatccattctacacagccccagcacattgggaggtt
-gtcctatctcaacttgcatagctcctagaatgggggaactcactaccttatgacatagcc
-ctttccacatctgaaccactaggagtgtgtaaaagacattttctcatattaagtttatct
-ttctggagatcctgtgctctctggggccccacagacacatctgcttccctgtctggggac
-agcccaaacacttgCCCTCCCCAGGCTGCCCTTCTCTGGGCCCTTCTGCCCAGATGCTTG
-GCTGCTGTGCCCACCaggtcctgcttgcacagagcttatatcctagtgggcggcaggaca
-aagaacaagcacacaggcacacaaacacaatgattccatgctatgaaggaaatgcagagt
-gagactgttgggaagagcatggcggggtgtggagaggcaaggggagtctctctaggaagg
-taatatttgagctgggacctgaagaatgcaacaaagccagaagaacaagagaaagggcat
-tccagatagaggcaagagcaagtgcaagagccctgagatcacagagcaattggaaactag
-gaagcagccagcctggctggaCATGGACATTTTGGGTATTGATGGTGAAGAGCCTGGAAT
-TGTTTTCTAAATTTGATCTCCAAACACTTTTAAGCAAGAGGTGATATGATATGACATATT
-TTAGCAGACAATGAATATTTCCTGAATTAAAATTGAAGACCCTTCTAGTTCCAATAGTTC
-CATGCTTCCCAAAGTGATACTGAAATGACTTCAGGAGAGAACAggctgggcgtggtagct
-cacatctgtaatcccaacgctttgggagggtaaggcaggaggattgctcgaggccaggag
-ttcaagaccagcattggcaacatagtgagatccccatctctacagaaataaaaataaaaa
-taaaaaaattaaggccgggcacagtggctcaagcctgtaatcccagcactttggaaggcc
-aaggtgggtggatcatgaggtcaggagttcgagaccagtctggccaacatggtgaaaccc
-catctctactaaaaatacaaaaaatttagctgggcatgttggcgtgtgcctgtaatccca
-actacttaggaggctgaggcaggagaatcacttgaacctgaaaggtggaggttgcagtga
-accgagatcacaccactgcactccagcctgggcgacagaatgagactctgttaaaaaaaa
-aaaaaaaaaaaagctggacatgatggaacatacctgtggtcctagctactcagggggctg
-aggcaggaggatcacatgagcccaggaggtcaaggctgcatgagctgtgatcttactact
-ccacctcagcctaggtgacacagccagaccttgcctcaaaaaaaaTTTTTTTTTAAAAGA
-AAAGAGACAATCATGtgatggttgccagaatggcctccagagagggcctccctaggctga
-atcctggctctgcctcatccttgccgtatgactctgggccaaggaccttgcctctttgag
-cctcagtttttacatctgcaaagtgggggtcataattgtccctgtcttattggcttgttg
-tgaggattaaatgactttatattggagaacagggcccagcatgtcaaaagtactTTCTGT
-TTGTTAAATACAATGAAAAAGGGTGAGGACATGCAGAAGCAAGATTAATCCTTTTTCAAT
-CTCTTCCAGTCCTGATTCCTGCAAGGAGAGTCAGGGTTGGTGGGGATGTGTATCTCTAAC
-ACCAGCCCAATCTGGAGGAAGTTAGTAACAAGGTTATATTTATGTTGTTTATATTTACAG
-CTACCTTTATTTGTGCCACATGATACAAtttttttttttttttgagatggagtctcactg
-tctccaggctggagggcaatggcacaatcttggctcactgaaacctccacctcctgggtt
-caagcagttctcctgcctcagccacccgagcagctgggattatgggtgctcatcaccatg
-cccggcttattctgtagttttagaagagacggggtttcaccgtgttggccaggctggtct
-tgaactcctgacctcaggtgatccacccatctcagcctcccaaagtgctgggattacagg
-cgtgagccaccgcgtctggccCAAATTTTCCATCTACCCTGGCTATTTCAAGTTTCCTTA
-TTTTTTTTTTTTAAAGTAAAACAAAAGCAAATAGATTTAGAAATTCAAGGGCCATGGTCC
-CTGAGGTAATGGCAAGCCCTCCTGTCCCAAATGGCCCAAATTGTGCAGGTGGTCATTGAG
-CCATTGATGGGACTTTAGGAAGCATGGttttatttttatttttattttttagatggagtc
-tcgctctgttgcccaagctggagtgcaatggtgcaatcttggctcactgcaaccttcacc
-tcctgggttcaagcaattctcctgcctcagcctcccaagtagctgggattacaggcgccc
-gccaccactcccggctgatttttgtatttttagtagagatgggatttcaccatcttggcc
-aagctggtcttgaactcctgaccttgtgatccacctgtcttggcctcccaaagtggtggg
-attacaggcatgagccaccgcgccccgccCAGAAACCTGTTTCTAAGCTCAGCACAGGGA
-ATAGCTCCTTTTTCAAGTTATGTCCTGATCCGGATCACTTCTTTCTACCCGTGTGCAATC
-CACCAAGCATCACCTGGGGCTCTGGTGACAGCAGCATCCCCTTCACCTTCTTTCTCTTCC
-TGCTCCACTCGGCAGCCAGagccagaccatgtccttcctctgctcaaagcctcacaaggc
-tcccagctcacttggagaaaaagccgaagtcctcacccagctatgaggcccctcccaagc
-tgatgaccctcacccctcctcacccctccagcctcgtcacctgcccagccacagcccttc
-tcccacctccactgaccccaccacactggcctccttgctgcttcttgaacactcactctg
-tgcaggctccagctcaggacttttgcatatgctgttccctctgcctggaacacatccctc
-tgacacccacagggcatttttcctctcattgcccaggtcaatgccccctctcagagaggc
-ccatccaccttacctaaatatttcctagctcattcttcctccctcccctgcttttccctc
-agagcatatatcactaccagacatcacattttacctttgatacatatgttgtgtgtgtca
-tcgcctgtctcccagagtggacttcaagaggacagaagtttgcgtctgttttgtactctg
-atggctccagtgcctggaatggtacTGATTTGCAGAATGAATGTCCAGGGGTGTGTGTGA
-AGGGTGGAGGGCAGTCACTCCCAGCCCTGCCCAGCCTCACTGTGGCCCCTCAGTCCCCTC
-TCCGGATATAGCTTTTCTCTCTGCCTGCCCCACCCTCTGACCCTCAAGGGCAGGCCAGGG
-CAGCAAGCTTGTCCCTTAGGAGGGAGGTTTCCAGCTGCAGGGCAGACCTTCCTCCTATAC
-CTCCATCCCAGGTAAGCCCAACTGGAGCTGCCCTCTCGTGGAGGGTACTCCAAGGATGAA
-GGGCCTTAGGGGAAGAGCCACCCTGAATGTCTCTGGGCAGCCAGGAACCTGCTCACAGCC
-TCCGCGACCTCATCGGGAAAGAGGCAAGACTCATGAGAGTGAATGGcccacggggagtta
-ctatgcttgtccccttttacagatgagaaaactgaggctcagagaggtgaaTCTGTCTCT
-AGGGCAGCTGGAgcctctgtcccctcctctgtaaaatgaggagaataactcctccctcct
-aaggttaccttgaggattaaatgagctaaataaagcctttaaacacagagctgtgtctgg
-cacataggaggtgctcaataaatgttgggtactcttGTTgttctgacaggtgaactaact
-ttccaaggtctcacagttagtaagtaacacaaacaaattcaaacccagatctgtctgaat
-ctaaagTGATTCCCAGAGGgggggcagtggctcacaccagcactttgggaggtcgaggca
-ggaggatcacttgtgcccaggggttcgggactagcctgggcaacgtgacaagacattgtt
-tgtctccgcaaaaaacttacaaaattagccaggcatggtggtacgtgcctgtggtcccag
-ttacttgggaggctgaggctggaggatggtttgagcctgggagttggagactgcaatgag
-ctgtgatcacaccactgcactccatcctgggtcagagagctagacctggtttcgaaaaaa
-agtcaaataaataaagaaaGTGACTCCTGTGCacaaccacaaaataataacaataacagc
-gacgacaacagcaacaacaCCTCCGAGCAGTAACAGCATTTTCCACTGCAGACGGCGGCG
-CTGAGGGTACAGGGATAAGATCATCCGGTGACAGGGATCATCATCCCTGCCTGGCATAGA
-AACCCGGACATCGGACCCTGCCCTCCCGCTGCTTCCGCAGGGACAGGGGGCAGCCAGCAG
-AGCCTCCCTCTGGGGGTGCCCCCCAATCTGGTTGCCTGGGACGGGGGCCCAGCGGGGGTG
-GAGTTGCCTGGGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGAGGCCCAGCGG
-GGGTGGAGTTGCCTGGGGGGGGGAGGCCCAGCGGGGGTGGAGTTGCCTGGGGGGGGGTGC
-CCAGCGGGGGTGGAGTTGCCTGGGGGGGGCCCAGCGGGGGTGGAGTTGCCTGTGGGGGGA
-GGCCCAGCGggggtggagttgcctggggggggcccagcgggggtggggttgcctgggggg
-ggaggcccagcgggggtggagttgcctgggggggggaggcccagcgggggtggagttgcc
-tgggggggggtgcccagcgggggtggagttgcctggggggggcccagcgggggtggagtt
-gcctgtggtggggggccagcgggggtgaagttgcctggggggggccagcgggggtggagt
-tgcctgggggggggccagcgggggtggagttgcctgtgggggggggccagcgggggtgga
-gttgcctggggggggccagcgggggtggagttgcctggggggggCCAGCGGGGGTGGAGC
-ACCCTGGACGGCCCCGCGGAGCCCCCTGCGGGAGGCGAGGGCGGCCCTCGGGCTCTGGAA
-GGGGCCGCGCGGCCTGGAAGACATTACACGGCTGTCGGGCGGGGGGCGGCGCTCGCAGTT
-CCGGAGGGGGGTCCCGGCGGCGGACGCGCGGGGTGAGGGGACCGCCCGGCCACAGAGCGC
-GCTTTGTTCTGCGCCGCCCCCGGGAGCTGGAACCAATGGATTGGCGGCAGCTGAGGTCAT
-CTGTCAGGCGGAGCCGGGGGGTCAGGCCCGGGGAAGGGGCCGCGAGGGAGGGCGGCGCGC
-GTGGGCCGGCGGGGTGCGGGTGGacgagccgggggccctgcggcaggtggctacgctgct
-tcggtcctcagtttacccgtctgtccaacaggaaagatcatttctgccctgtccacctct
-gggggctaatgtgagagttaaaGTAGGGGAGCTACAGTGATGATGATGATGACGACGGAG
-GATGACAGCCTTCCCCTAATCGCAGTCTCTACTTCGGGTACCATAGAAGTGCTAAGTCAG
-GGGCTGGACGCAAATGTGCTTTGTAGCCTATAGTGCGTGCCTGTGTGGGAAGCGGGATGG
-ATGTTTCACCCCACCCTCTTTCAGCCCAGGGAAGTCAGTGGCTCCCCCTGATTGCCTGCC
-TTGACCCTGGGTGCCAGGCTTGGTCTGCCTTCTCCAGGGGTGATAGGTGCAGCTGCCCAA
-GCCTGAGCCCAGGAACCCATTGCAGCCTGTCCTTGGAGCCTTCTGGTCCAGGGTAGGGCG
-GGACTGGAGTGACCCAGATAGGTGGGGTTTTTTTTTCTGACTGGGGGTAGGTCAGGGTCT
-CAAGGCTCTCCTTTGCCTCCTACAAAAGGACAGCCCTttctttcatcaattcactcattc
-attcattcaCACTGCCACCTGCCTGTGCCTCACAGTTCCCATCCATGAGATAATGAGGCT
-TCTAAACATTTGATACAGGGTCCCCCAGGGAAGGAGATCATCAAATACAGGGAGGCCCAG
-AAACGGCCCAAAATGCGTGTGTGTGTATTTTTGGGGAAAGGACTCATGGCTTTCTTGTGT
-TCTCAACCACGTTCATGATCCcaaacaaggctaagaagtactggttggagtgcagggaag
-gcaaataggctcccaaactccaccggagagggtggcacttggaacaaccactttggagag
-caatttgccagggtcttagaagatggaaatgggcgtatgcatcagccaggcagctccact
-cctgggtatacagttgaaagaGCAGGGTGATGGCGGGGGCCGTTCGCAGCCGCAAATAAC
-TGTAAGCCCCCATGCTTCCATGAACATGATCACGACTAACAAACGGCTACATTCACAGCC
-TGGAACACCACGCAGCGGTGAAAAAGAATGAGATAGACTCAGCTGGAatttattcatttg
-acagatattgattaacactactatcttttaggcactgttcttagcactgaacctacagtg
-ataaacaagacagattgagtcctgccttaagaacgtacatttggccaggcacggtggctc
-acacctgtaatcccagcactttgggaggccaatatgggaggactgcttgaggccgggagt
-tgaaaatcagcctgataaacattgtgagacctcatctctacaaaagaaaaataaaaaatt
-agctgggtgtggtgacacacacctgtaatcccagctactcaggaggctaagtgggaggat
-tgcttgaacccagaagttggaggctgcagtgagccacgatggtgccactgcatactccag
-cctgggtggtagagcaagatcctgtcttaaaaaaaaaaacaaaaaaagcagacacagaag
-aaaatttgggagagtgtgacaaatgccatgaagaaaataaaactggataaagggacggaa
-tgatgggggagggggctgttttagacgctatggttgggaaggcccctgaagaagtgacat
-ttgggcacagaccagaatgagggagactgggagacaggcacgCACGAATGGGATGGACGG
-CTGGGGCACAGTGCCAAGGGAGAAAAGCAATCCACAAAACAGCGCAAAAAAAGAAAACAT
-TTTTTACTTAAACGCACATTCATTACTATTAAATTAGATAAGAGTCTGGGAGGCTCTATG
-CCAAATTCATAAAGGTAACTGTCCCAAGAGGGCAAAGGAATAATCAGGACTAGGTTTTGT
-GGTGGGCTTCCGCTTGCCTCTAATACtttaaatttctaatatttaattatttaacatttt
-aatattttaatGTTTAAACGGTAAATATggctgaatgcagtggctcatgcctgtaatatc
-atactttgggaggccaaggcgggaggatcacttgaggccaggagttggagaccaaccacc
-ccaggcaacagagcaagacctggtctctataaaacgttaaaaacaaaattagctgggtgt
-ggtggtgcctgtagtcctagctactcgggaggctgaggcaggaggatggcttgagcccag
-gagtttgaggttgcagtgagctataatcagaacattgcgtgccagctttggtaacagagc
-aaaaccccatcacaaacaaacgaacaaaCACATTTTAAAAAGTAAATATACTTATATAAA
-ACTTGTGAAATggctgggcatggtggctcacacctgtaatcccagtgcctcgggaggccg
-aggcggacagatcacctgaggccaagagttcaaggtcagcctggccaacatggtgaaacc
-ccatttctactaaaacaacaacaaCAAAAAGCCTTGTGAAATGAAAACAAAAAAAAAAAA
-AAAAAGGAAATTTAAATCTACCACGGTCAAGTGGGTGGGTTCCAGGGCGGTGAAGGCACA
-TACTGCCTTTCACTGGAGCCAAGTTCCTGGGGGCAGAGGTTTTTTTGGGGAGGGACACTG
-TAGGTCATGGtagcccagccagtaggagcccagaagcttcttggaggaggtaccaccttt
-gctgagcctgaGATTCTCTGGCCCAGCACCCCCAGTATAGACAGGAATGGGTAGACATGT
-GCGCAAGGTTACAGAACAAGAGCTGATAAATAGAACCTGAACTCCAGACTCATCCCGGCT
-GAACCCGGGTTAACTATCCCGCCTCTTTCAGCCCTGCGCGTGCATCCAGCCCCTTCCCAC
-AGCTGTAGCTCTTGCAGGCCAGAGGGACGGCCCTGCCGCGGGGGCCGGAGAGCAGCGCCA
-CCTGCTGCTGTAAGAGGGAAACGCAACTTCCGGCTACCAGCAGGTTACACCCTTTAAAAC
-CCAGCTCCTCTTCCTTAAATGATCAAGCAGTACCCCTCTACTCCGAATCTGTTCTGCACC
-TCCTTCGCAGTGCCTGGCAGGGCCCTTAGCGCTGTCTGGTTGGGTCTTCTCTGCAAGAAG
-GAAAAGTTGTTTCAGGAGGGGGCGACCATCTTCACTCTCATTCCAGCCCAGCGGGCACAG
-GAGGAGTTTACTCACAGAAGACAGGGGcacctcaccttcgctacaaaccttaggggtaca
-caatccatttgacagcctggaagaagtccccagggaagggacagaaccgcccaaggtcac
-acagttaatgagtagacaagctgggGGGAATGAGTAGACTCATTCCACTGGGGATGGAAG
-TGGGGAAGTCACCGTATTTGAAAATAACTGACGCAGTTATTagcagctcttagcatgtgg
-tccctgaacagcagcatcagcaacatctgggaacttgttagaaaagcaaattatcaggcc
-ctgccccaactcgcctcaatcagaaactctggggggccgggggcagtggccatgtctgta
-atcccagcactttgggaagctgaggcgggagaatcgcttgtgcccaggagtttaggacca
-gcccagagaacacagcaaaaccctgtctctacaaaaaaatgagaagggcgcacctgtagt
-cccagctactcaggaggttgacgtgggaggatcacttaagccccgggaggtcaaggctgc
-agtgagtcatgatcgtgccactgcactccagcctgggtgacagggcatgaccctgtctca
-aaaaaaaaagaaagtgggggtggggcccagcaatctggtatttagcaaacAAGCTTGAGA
-CCCTGAACCATTGGTCTAAAGGAATTGCACACCCCCCCTTTTTTTTTTTAAAttaaataa
-acttttattttggaatgatactagatttacagagaagttgcagagatagtacaaagagtt
-cctgtatacccttcacccagcctaccccaaggtcaacatcttacatcaccatggtacatc
-tgtcaaaaccaagagactgaaattggtatattaactaaaattcagacttttttcagattt
-ccaattttcccactaatgtcctgtttttgttccaagacccaatccaggatgccacattgc
-actGAAGACACTCTCCCTTTTCAATTCTATTACTGGTCACCTCAGTCAACTTTCCCGGGG
-AAAGAGAATGCATGGGAAAAGCTCTTGTCCTTATTATTGAACTGGAGAAACTGAGGCTTA
-AAAGTGCCGAGTGACCAAGTTCCCTTAGAGGGCAGTGAGAACAAGGCCTGCCTTACTCTG
-TTCCCTTTCCCCAGGGACTCTTGGTTTTCAGAAGCCCCTCTGGAATGTCCTACCTGGCCT
-AACCCCATACCAGCAGTGCAGACAAGGAGGCACTCCTACTACAGTGGGTCCAGCCCATGG
-AGAGACTCACTTCCTGCCCCAACACCTCTTCCCCTAGACCCTGAGGGCCAGGACAATGTC
-TTAGTGCCTTCCAACTTGGCAGAGTGAGGCCCCATGAGACAGAGAGAAAGGGGGAAGAGG
-GAAATACCTTTATCCAAATAAATACCCATCCAAAATTATTTGTGATAGGTGAAAAATGGC
-CACAAGCTctttgtggttcccctcatcaagacatgtagtctgtttctcatcccttgaatc
-tgggtaaagccttgtgatttgctctgaccaaaagaacttagcagaagtgacactgtccta
-gtcccagttccaggccaagaactcaagaagtctttcagcttctactctcactctctttgg
-aatcctgaagccatcatgtgaataagcctgagctagcctgctggagaggccacatggagg
-agaaccaagcaattccagccaacagcctgtcacctgccaggcaagtgagtaaggctatcc
-tagaccatccaggcccagctgaggtaacagctgaccttagctccatgagggatcccaggt
-gtgagcagcagaactgccctgttgagcccagcccaaattgccaacccataggattgtggg
-aaaatacagggtttgtttctagctgccaagtttggggatggtttgttacacagcaaaagc
-taactggtacaCAattctgcatttctctcttggtaatgggatcccagttttattgcagga
-ggcagtgtgccagtctcagtagatggaacacgattggtctattcagccatgacaattctg
-ttccctgctgtcttagctttgtttgcagctagaggtgcaatggtagctggctcgggccaa
-gggcatctaagtgaagatatgcagagggagagagcaggaaacagacttctgacgaggttt
-tactttctgatagaaggtgacgggtccagctagtttggcccttcctcttcctccacccct
-ccttccttgaacgcagacatgattcttggggatacagcagccatcttgggaccatgaagt
-aacgagcactgagattaaggcaaaaggatccaagacgtgacccctaccttcgtggagttg
-ttgaaccaataccattagccacccatctccagaatccatgctatgtggaaaaacaatctt
-ctgtttgtttaaaccactgcaatcaaggttttcctttccttgcagctgaatgtagtccAT
-ATAAGAGGTTACATAGACAAAAATGCAGAGGGATCCTTGTCCTTGGGAATTTGGAGCCGG
-CAGCACGTGgctcttcaagcccatctctgttctccttctcggtaatgcttcaagggtaag
-gccatgatcctattgtcacagaggtgggaactggggctcccacactgtacagtgagtcca
-aggccttgtagctggtgagaggggtgcccagagtcagacccTCTCGCCAGGTGCAAAGAG
-AATGCACCCCTGCTATCCCTTCTGCATGGCCCAGCCTGCTGGAGGCCAGGTGTGTCTTCT
-GGGCTCTTGAAGGTGGCAGCAGGTGCCAAGGAGGCTGCTACTGCAAGTCTGGTGTGGATG
-CTCCCAGGTACACCCTTAGGTCTGAGAGAGTGGACTGGACAAGCTTGGCGGGGATGGTCT
-CTCGCTGCAGTTGCTGGTAGGCCGCGTAGCGGTGGCAGCCCCCAAAGGAGTAGAAGTAGT
-CACCTCCCTGGGCCCCTTTGATCCAGAGGACATCGATGGGGGGCACGCTGTCTGGGTCCT
-CCTGGGGAGAAGAGGCACAGAGTCAATGGACATGGTACAAGGCTTGAGAGTTTGTAAAGC
-AGACTTTGTCCACTTGTGCTGAGCTCCTTATAAGGTGATCACACTGGACTACTGTGAGAG
-ACAACTGTTAATTATCAGGAATTTTGTGAGCTGTTCgacatcaccttgtagcttgaaaat
-cagccatgggagagtatttacaccagagaaatggacagatgctacaaatcagggatttct
-cccacacatgtatcagcacaccacATGCACactatccagctggccctgttgtagaccctg
-ggaatacggtacagctggaatgtgactgaatcaggccctggcttcaaggggctccagtct
-agtggggcagatggaacaagaagtaaatattagagtgacaaatgctataatgacaataac
-acaggtgacaggacagagatgggGTCCACGAGGCCTCTCTGAGGTAAGAATGAAGCAGAG
-TACTTGGAAAGATAGAGAAGTGGggccgggcacggtggctcatgcctgtaatcccagaac
-tttgggaggccgaggcgggtggatcacctgaggtcaggagtttgagaccagcctggccaa
-aatggcacaaccctgtctctactaaaaatacaaaaattagctgggcatggtggtgtatgc
-ctgtaatcacagttactcaggaggctgaggcaggagaatcacttgaacccaggaggcgga
-ggttgcagtgagctgagatcgcaccattgcactccagcctcggcgatggaacgagaatcc
-atctcaaaaaaaaaaaaaaaagagagaaGTGGAATAGTTTCGATTAAgagctcaactgcc
-tgggttcaaatctagctctgctgcttaacagctatgtgatcttgggcaattcatcttttt
-gtgcctcagttgccccatctatcaaattggatggagataacagatccatctcatagaatt
-tttgggttaaatgggttaatatatataaagcacttcaaaccatgcttggcacacggaaag
-tgctcagtaatgtatgctgtgtatGACCTgagggaagaacgttccatgcaaagggaacag
-caaacgcaaaggacttgaaaccagagcacgttcactgtgtaggaggcacagcaaggagtt
-cactagagtggactccagggctccaggaatggtcagaaaggccagcaggagccagatggt
-gcaggtctgcttctgagagcagtgggtgggccctggagtgttggcaacaggggagggtga
-catgatctgatgcatgttctagaaagttgtcacaggagaacagacttggcagggtggaca
-gggcacagggctggaaggcagaggggaggcctctgcaggtattcagcagaagatgctggt
-ctggatgatggtgtggtggggacagggagaggtagacaggtttgggacacatttacgggg
-caggcccaaggggtctggcagaaggggtgaatccaagggcaagagaaaagggagaatcta
-agttgacttcctgttaggggcccacacagccaggtggagagtaggtcatcctctaaacag
-ggaaagtctggggcaggacgggtgcagggtagagCACTCTGGGGAGACCCCATTAAGTGT
-GAGCGGCGTGGAAGGCCTCCTGCTGCTGGTCCACGGGTTCTCTCTCATGATTCCACAAAT
-GATTATTCAgcagtaaggtgcagcagtcacaagcctgagctctggaacctggcacacctg
-actttggatctcagctcctctccacagcagctggggcacacagccctctgaacaccattc
-ctcacctgtaaactgggaataaaacatcctagagggctgctgatgaagagtcagtgagct
-gatgcCTACCGGGCATTAGTGGAGCACTAAGGAGGGCAGCCGTGCCAGGCAGGCCTTGTG
-CCGGGTACTGGAGGCACGATGGTGgatggccagaatgatggctcccaaagatgtccacgc
-ccgaatgcttctgaatgtgttaccttacatgggagaagggacttggcagacagaattaag
-gtaaggatcctgagatgcggaaattatccaaggttatctagatgggtcgaatgccattat
-cagggtccttaaaactggaagaggaagtagaggaagaggtcagagtgatgcgatgtgaga
-aggccttggcctgatgttgctggctttgaagacagaggaagaggccataagccaagcagt
-gtgggtggcgtctggaagctgggaaaggcgaggaaatggattctcccctagagcctacag
-aaagtagtgcagccctgcttggtgttagcccagtaagacccattttggacttctgaccat
-aaataaacctgtgttgttttaagccatcaactttgtggtaacttacagtggccccagaaa
-actaatacaGGTGTATGTAAGCAAAGGCAGAGCTGGTTCTGGCCCTCAGAGCCTACGGTT
-CTAGCACGGAAGGCAGGTGTCTAGACAGGACGTTAAAAGCCAGTGGGctgtaatcccagc
-actttgggaggccgaggtgggcagatcgcttgaggtctggagtttcagaccagcctggcc
-aacagggtgaaaccccatctctactaaaaatacaaaaattagccaggcgtggtggtgggc
-gcctgtaatcccagctacttgggaggctgaggcaggagaatggcttgaacccgggaggcg
-gaggttgcagtgagccaagatcgtgccactgcactccagccagggtgacagacccagaca
-acgtcttaaaaaaaaaaaaaaaaaGCCAGTGAGATCAGAGCTATGCAGGTGGGCACACAG
-GTGGCTGCAGGCCCACAGAAGCTCCTAACCCGGTAGGGATGGTCAGGGAAGATCCTGACA
-CTGAGACAGGAAGACCGAGAAAGAGTGAGAAACGACAAGGCAGAGATAGAAGAGGTTCTC
-AACGGGAGAAAAAGCCCAGTGGTGGGACAGGGCATGCATGGCAGATCCCTTCCCATCTCA
-gccaggcgccgtgctactattgtggcaacagataagatgggacgaggtcctcgcccttgt
-ggagtgcacgtgaggtcaggaagacagaaaataaaatgcaacacaaatagatgtataata
-taatttctggtggacataagtggtatcctgaaaaacatctcgggctaaggggagagctag
-agaggccagtgactctgaccaagggtgatcaaggaggcagagagctgaaccaggcagggg
-agcaggccctgtggttgtctggggaagtggctccaggcagtgaggacactagtgtaaaTA
-CTAGGACTGAAAGTTATCGGGGGTGGCTGTAGAGGTGCTGGGTGGGGCTTAGGGATCTCA
-TGTGCTCACCTTCCAAGGGTCGGGGGAAGGGGACACAACGTTATGTAGGCCTAACCTGAC
-ACCTGTTCTTGCGGGGCCCCCAAGTTCCTGCCAGAATCACTCCGGTATTCTTAACACCCT
-TCCTCAGTGGTGGAGCTGACCCTTGACCTCTCCCACTTCCCATTCAGACAAGGGCCTCCC
-AGCAGATATGACACACCTAGTCCCACTGTCACTGACTGTCACAGCCATGAGAGCCCACGG
-CTTATCTCCGGgtagtgcggtggccatgtgctgggcagtggggcccaggctgcctgggtg
-tgaattccagccgtgtcactttttaagcgcctgatcttagtcaagccgctgaaatcttcc
-ctgcctcagttctcgtctgcaaaagagccactatctacctcctagggttggcataggaaa
-ctgagggacttcctgcagttcctggaccactgcaagcactAGCGTTATAAGCGTTATCAT
-CACTactttaattatctcgcccaattccctccttgctcaagtgaggaaacagaggcccag
-agaggcccagctacttgctcaaggtcacacagcagaggctgagctccggctgggcccgga
-accagtccgtctcgcgtccaTCGCAGCGACCTCCCTCCTCCGGCAACCTCCCTCCTCCGA
-AGCCCTCCCTCCGGTTGGCTGGACTCCCCGAGGCCTCACCCGGATCGTGTCCACGAGGCT
-CTGCACCTTGGCGGGGTCCAACACGGACGGCAGCGGCCGGATGAGCACGCTCAGCGGCAC
-GTTGTGCACCGCGGCGATGCGGCCCGAGTGGATGCTgccgccctgcgcgccgccgctcgg
-cccgggcccctcgggcgccccccgacccgcgccggcccTGCCCAGCGTTCCTCCTGCACG
-CAGCCCCATCGTCGCCGCCGCCGCGGGACTCGCCGCCTCCCCCCGGCCTTAACTCCGGCC
-GGGCCATACCATTccgcgcggccgggggggggggcccgTGCCAGGGCAGCGCGCGTTTCT
-CCCCCGACCCCGCCGCGGTCCGGCCTCGACCCCGCGGTCCCCAGCCCGACTCCGGCTCCG
-CTCGCCAGGTGCCGCCAGACTCGCGCGGGGCTCAGGCTCTCCACCGGGGGGCGCCTCTCG
-CCTCCCCTGCGCCGCGCGGCGTCCGGGGAGTGGAAACGCCCGGGCGGGCTGACTCAGGGT
-GAGTTTGCAGGTCGCGGGGCGGGAGGGGCGCGGGTGACGCACCGGCCGGGCCGACTTAgg
-ccgcgggggcgggggcgggggAGAGCGCGGCGGACCTGCCCAGCCAGGGTGAGTCGGCAA
-AGCCCGCGGTGCGCTGCTGCCCCGCTGCTGGGGTTCCTAGCCAGCGAGGTTATGATCCCC
-ACCAGCGGTTCCACTTCCAGTCTGGCGCCGGCtgtgtctggagtcgttccgaacattttg
-cacgtgtattaacgtatctgaacctcaaaacaaccctgcaaggaaggtatgactgttatt
-cccattttacagaagaggagactgagacacaggtttaagtgatgtacccaagatcacgga
-actagtaagtggccgaatccgcgttcaaatccagacggtctggctccagagtccgccttc
-tACCCCACCGTTGGCTGCCTTGGTTCAGCAACAGTGACTGTCACACGGAGCCCTCAGGAG
-TCGCGCTGACAATGGGTGGGCCCTGCCTTCAAGTTCCACACTGTCTGTTTGTGTCATTAC
-AACACTACTGGAAGTAGGTGCAGTTATAGACCCGCTGTTCAAGGTCAGCTGAAATGAAAG
-TCAGGTCACACGAGTCCAAACTGTGGGGCCACTTAACCACCAACTCCAAGCAGGAAGGTG
-GACGATCCCAGACTCGGTCGAAGACAAGCATGTCTGGTTTGCTTGTCTTCCTTCTCAACC
-TGAATGGCACGAACATGGAGAAATGCATACTTACCCTGCCAGCTGGAGAAAACTGGAGAC
-GAAGGAGGGAGCCAGGAGTTTCTACTTTGccttccaccagttgctgacactttctgaacc
-ccgtctgtaaaatgaagtcatgctgcccatcactcaaagttgtgtgaattgagagagtgc
-tcatagtgctctgtgaattgcataacaTCCATTTTGCTGTTGAAGATCATTTATTTTGGG
-TTCTTAGTCTCTCACAAAACCTTAGAACACTGACACCAAGACTCCAGCCTTTCCCTTTCG
-AAACATAATTCCCGTGCGCACCTAAATGATACTTTATTTCAAGAAGTAGAACTGACACCC
-ACACCTCAGCCCCAGAATTATTCAGAATTAGAGAATTTCATCAAGAGGGAAGTTATCCCT
-TCTAAAACATCTTCCTCATTACAGGAAGTAAGAATGGCAGGATAACAGTTTCTAGAGTGG
-AAAAGTGGAGCTCTGGCCTGATTCTATCATCATGGTGTACCCAGGGAGGCCTCATTTCCT
-GGTATCAAATTCTCTGTGTTAAGATATCTATGGcccaattcaaaatggcttaagcaataa
-gaaggtttgttttctcacataataaaatgtttggaggtaggtatgtccaaggttggtaaa
-gaggcagttgaacaatgtgaccaaagactccagttctggctgggcccggtggctcacacc
-tgtaatcccagcactttggaaggctgaggcaggcgaatcacttgaggccaggagttcgag
-accagcctagccaacatagtgaaaccctgtctctaccaaaagtacaaaaattaggcaggc
-atggtggcgcgcgcctgtagtcccagttactccagaggctgagacaggagaattgcttga
-aaccgagaggcagaggttgcagtgagctgagatcatgccgttgcactacagcctgggtga
-gagagtgagactctctcagaaaaaaaagaccctggttctgtctatccttttgtgccatca
-tccttggtgttctgttatcctgcggtgtgcccctcatggtcccaagatggctactgtagc
-tcaaaacatcacatcattacatgcgaatgtccacaagtggaagttaggacatcccttcga
-gcctctttttaagagtgaagaaaccttcccTGGCTGGATGCAGTGGctcacaccttctga
-ccttccactcctcaagccccggagtcaactctagtcacactggcctccttgctgtgcctc
-ttccacagcgaatgtgtcctggcctcagaccctttacatttgctgttccctgtgcatgga
-acgctcttccctcaggtCATACatagcatacattactgagtgctctccatgtgcccagca
-tggtttgatgcgctttacatatattaactcatggaacctaacagctttatgagacgagtc
-tgttatctccatccccatttgatagatggggCATCCCTGTGGGAGCTCTGCCCATTCCAG
-AGGTGCCAGGCCATTCACTAATGGGGGCAGGAGCCGGTGAGTAAATGCCAGTCTTGTGCT
-GTCACAGGTGGACGATTCAGAGAGGTGTTCTAGACCATTCAGATCTTTCTGGAACCTTCT
-CAGAGACCAGAAGTACTCAGCCCTATTGCTACAACTGACTTCACTAACACACCctctgtc
-ccattcctcccaccccttacttctgcttccagggatcacctcccacataaacgacttaca
-ctcaagtctcagacttgctatcagggaaccaaaactaaaacaAAAGGGAAACTTGATACT
-GGGTCATCCCCTATAGTTCTGTACCTtgcctgggttaaaattgcactattttattagatg
-tgtgaccttgggccagtcacctgtctgtgcctgtttcctaatctgtaaaacggacataat
-gtcacctaattcacaggggtgttggaagagtgaagagagatggtgttaggtgaggtcctt
-aaaacagtgcacaacgcattataagtgctcaataaatgtttgctgttTGATTGCATTTTA
-AATTGTAACAGAGCTTGAACGTCTCTCCGTGTCTTCACTTTCAGACTAGGCTTGAtgtat
-tagtcaagacttttgtttgcaagtgacagaaagccaaagtgaattagcttaatgaaaatg
-gggatgcttggctattcccgtgactgaGGTGAAGCGGAGCCTCAGGGGAAAGTAAGTTGA
-GAGATTTCTTTTCTCTGCCCTCACTCAGCAGAGGGATTATCTCTACATGTCAGGAACATG
-ACTGTCAACAGCgatgatatttggctttaaataagggaaacctgacaacagagacttcat
-acaacttaaagtgtttcctctttaaaaaaaaaaacagtcgaggtaggaagtccatggctg
-ggatggctgctccatggtcactagtggcataggccctttctatcttgccgctccatcatt
-ttccagcagagttttcattctcagggtcacctcctattcaggattgctgctgaagtgcca
-gccgtctcatccaaattccaccctggaaagaggtggagaaatggaaaggcaaaggatatg
-acccctccccttttgaggatgctatctcagaagttttgtataacacttccccttgcatgt
-cattgactagaaattggtcacacggccacccctggctgcaagggcagctggatatgttgt
-cttcatccgtagcggtaatgtgctgagctaaaactggagttctcttactaaggaagaata
-gagattgataagtagctagcaatcggggccacaGCTCTCAAGTTACAGGCCTTATGGCAC
-AGAGACAGGGAGAGAGAGAAAATTTCCAAGTTCTAGTCAGATGCCTACATATGGACAAGC
-CAGCTATGGCATTGGGGGACACAGACTTTCTTAAAAGCATAAGCCACCATTATTTATTAT
-AATGACTTAAAGGTAAGGAGttcatttaaagataattactggtcacctgctattggctag
-gctagacccaggggatttagtgatcagcaaaaagacactaccaatctctgcattatgagg
-cttacagtgtagtggaggattcagataatgaccaaataatcacactggttaatggaaagt
-atacattggtagtgggtgctgcaaaagaaTGGCATGTGGTTCTGAGGAAGtgttttagtc
-ctttttggctgccatagcaataccatagactgggtggtttataaacaacagaactttgtc
-tcttacagttttaggggctgagaaatccaagatcaaggtgACtttgtatctccccaacat
-tcatatgttgaaatcccaacctccaggtgatggtgttgggaggtgggcctttgggaagtg
-attatgtcacggggttcatgggggtagagccctcatgaatgagattagtgtcctttttct
-ttcttttgagacagggtctcactttgtcacccaggctggagtgcagtagaactgtaaaga
-aaacttctaatttttaaaatcaggaacctgataataactaaggaatcctgaacagagtgt
-tggtagaaatacagatgaaaaaggccatttggatgaggaaatgaggaagatattattgga
-caatggaaaaaaggccatgttgttataaaatggcaaagaacttggctgaattatgtccac
-gttctagtgttttataggaggtagaacttgtgagcaatgaaacggaatatttagctaaag
-ctatttctaagcaaagtgttgaagctgtggcttggctcctcctgactgcttatagtaaaa
-tagaagcagaaagaaatgagttaaagatgtgacttttaagcgaataggaagcaaaacgta
-aagatttgaaaaattttcagcctatccatattgcaaagaatgagaaagaatgtttgggag
-aaaacaccaTAGTCTCCATAAGGAGACTGTAATGGTGATGAACGTAATCAGCCatcccag
-caggaaaactgccgtcttgaattgaaggggaaggagatgggaagggatgaggaaggaAAG
-CTGTCTGACTTCTTGGATTTTTCAGGACAAGACCAGAGTGCAAactcttcaagacaaggg
-aagaatgaccctgaaggcaattcagagatcatcaaggctatctcCTTGCTTTCAAAAGTC
-GGGAGCATTGCCTTGCATTCAGCAGGTTAGAGGGCCTCTGTCCAAAGCCATGGAGGAAGA
-GCTGCCCAGAGCTGTTGGTGTGGGGCTACCCAGAGCCCTGGGAACATGACTTCTGCGGGA
-TAGAGCTGGAGGGACAGGACCACCACCCCAGAGGGTACAGAGGGTGGGACCACCACCATT
-GTGGATCTGGAAGGCTGcctcagtgggcctggaagcagagcatttaatgaactaaaaatg
-atttttcttgagccttaagatctcatggagtttgccttgtagtttggatgtaatttggat
-ctgctattcctttcttctttcctatttctcccttttggaatggtctatcctatgcctgtc
-tcaccattgtattttggaagcagataacttgcttgatttcacaggctcaccgctggagaa
-caatttgccccaggatgcatcacaccttgagtctcagccatatctgacttagatgacact
-tagataataaaactttggattttagacttcagagttaatgctggaatgagttaaggcttt
-tggggctgttggaatgtaaggaatgaatgtattttgcatgtgagaaggatgtgaatttgg
-cggggGATGGGGACGGAGGCAGAAtgctatagactgaatgtttgtgttcctccaaaattc
-atgttaaaatcctaacccccagtatgatggtattaggaggtgggcttttgggaggCACGT
-TAAGGCCAGTTCATTTCATGGTCACAAGATGACATGCTTTTCTGTTCACACTGGAGGGGA
-AGAGGAACTGGACTTCCTTTCCTCTTAAGAAAAAGGAagcagcaaagttttccataccct
-tccagcaaccctctccttaagtctcattggccagaattgggtcatgtgcccatttctgaa
-cGATGGGAGATGTTAGTATTAGACCAGTAAAGACTACCTCTTAAGCTGATGTTCAGTCCC
-CAGATTGCGTGGTTGCTAATCCAGGAGAGAGGGGTGGGGTGGAATGGTTATTGGACCCAC
-ATAACTGGGCTGGATATGGCTGATGGAGACCCAGCATTCTTTCCCACCTCCCTCTAGGGT
-GCCTTCTAGATTGCCTAGTTGGAGAGTTAAAAACTCTATTTCTCAGATCTCTTTGCAGCA
-AAGATACTAACAGGGAATTAAGTTCTACCAGTTAGATGTACTTTCATGAGACATGGATGG
-CAGAGGTGGGCCGGGGCCATCTTCCATCTTTTGACTCTTGCTACTGTCAAGATTGTCTTG
-GAGGTGTTAAGATTTTCTGTAGCAGTGTTCCAGCATTGTGCCACCAGCACAGTGGGAGAC
-AGGAGATAGTTATAGAGGCAGTGGCAAGGGCCTGCTGATCCCTGGCTTGCACCTATGATG
-CGGTGTTCTGTATCTCAATAGTTCCAGGGCACCTTATTGACCACCACCAACCCCCACTCC
-GCACCCTCTCCCACCACTGACTGTGGAAGAGGCAGGTGCTGTCTCAGTGGCAGCAGTTCT
-GCAGTGGGGTTCTGGGGTCCAGCAGATGGCTCACTTCAGCCCTTACACAAATTTTGTCAG
-CAGCCAATTATTGAAGTATTAAATCCTTTCTCCTTCAAAGGAATTTAATACTTGTTTATA
-AAATCCTGTCTAGAGTGGTTTCTGTTCCTGGCACCTAAAACAAACATAATGGATCCAACA
-GCCAGTCACGGGCAGTGTATGTGGGTGGTTAAGGGATGCAGCAGATGCCTGGGTTTCTCA
-AAACCCCACTGGcgaggcgggcagatcacttgaggcaaggagttcgagaccagcctggcc
-aacatggcaaaaacctgtctctactaaaaatacaaaaattggctggacgcgggggctcac
-gcctgtaatcccagaacttggagaggccgaggcgcgcggatcacaaggtcaagagatcga
-gacaatcctggccaacatggtgaaaccctgtctctaccaaaaatagaaaaattagctggg
-catggtggcacatgcctgtagtcccagctacttgggaggctgaggcaggagaattgcctg
-aacccaggaggcggaggttgcagtgagccaagctcacaccactgcagcctggcaaggcag
-cgagactccatctcaaaaaaaaaaaaaaaaaaccaaaaacaaattagccgggcgtggtgg
-cacatgcctgtaattccagctacttgggaggctgaggcaggagaactgcttgaacccaga
-aggcagaagttgcagtgagctgagattgcgtcactgcactccagcctgggtgacacagca
-agactctgtctcaaaaaaaaaaacaacaagaaaCCACTGGAGATTTTGCAGAGTTGTGGG
-GAGGTTCCCACAACTGCTGCTGTCAAAAACAGCTAGCACATTGCTCAGGATGCAGCTGCT
-TGTCCAGAGGGGTGTGAAGGGAAGGCGGACAGGCACCAGGGAGGCAGTCTACAAACTGAG
-TGCACTGCTTACACAGGAGGAAACTGACAAAGAGGCCCCAGAGGAGGCAGATTCTAGCCT
-GCAGCTTCCCCATCCCTCAAAGCATGCAGGTTATGCTTCTTGGTAAGTCTGAGTTGAGGG
-TAGGTGGCAGGGGTTGGTGGTCCCCAGTGAAGTTTTTAGTAAGGTGAGACAGATTTGTAT
-CTTGAAGGATCACTAAGGCAGCTATCGAGGATGATGGATTGGTTGCcttgaacacttttg
-gtgacaggcagctcagaagctctaggggcaagtcactgtttttggacaactttccagctg
-agccaaagtcaacctttttgcctgcttccactcactgaATATGTGACCATATATGACTAG
-GCAGAGCAGTAGGGGGTGAACTGGGGAAGATTATAGGGGTTGTAAACTGGCTGTCAACAG
-ACACATGTGGACCACAGTTTTAACTGTTTGGTGGGTGTAGTTAATTTGAATCCTATTTCT
-CTAAGGTGAGACACTCTTTCCAATTAGTCACAGGCTTCACCTTCCCTAATGTCTTAAGGC
-AACTGGCTTCACTCACATGTTATTAATCTGGTTTTTAAACCCTTATTTGAGGAGTATTAA
-GGATTGAGGATGCCTGAGAACTTGTAAATGCCAAGGGACCCTTGGGGCTGTGTGACCCTT
-GGTGGCAGCTACAGGCTGGTCAGGCTACAGAGAGGAAAATGGAGTGGAAAAGTAGTATCT
-CTCAGATGCCCTCCCCTTCGTCTCATTCCCCCCCTTCATCCCCACCCCTTGCTCCAATCA
-GAAGGTCTAGAGGCGATGGTGAGTGGCCAAAGTCCCTTTAATATCCCTGAATTGCGTTAC
-AAGTAATACTGCTGGAGGTGGGGAAGGGATGGGGGTTTGGGGGTGAGTTGGGATAGGACG
-GAGGAGGAGCGCCAAGCGCTCATACAAAATATGGCCAAAAGGCTTAGCATGCATGGAAAA
-TTATTGCTGTCAGAAGTTGCTATTTACAGGGTCAACGCCTCCATAATTGCTTCTGCTACC
-CCTCTCCCTCCCACCATCCCTGCAGCCTCCCTTCCCGCTGGGCCTGGAGCTGAGCAAAGG
-CCCATTCACCCCTCTGGAGCCCTAGGGAAGTGCCCCTGCTGCAGGGGTGCCTCCAGTCTC
-CCCCCTCTTTTGTGGCTAAGAGGAGGGGAGAGGAGGATCTGAGAGTCCAGGACTCCTGCC
-CCCAAGCTGGCTGCAGAGCAATGGGGCAGAGGCGTGTGCTTAAAGCGGAGGGGGCCAGGG
-CCCGTGCGCGTGGAGGTGTGTGCTTCGGTCCTCGCCCGGGCATGCAAAAGCGCAGCGGAG
-GAGGTAGTGGCGGCCAACGGGCGGGTGGCTGGCAGCCCGGCCCCTCTGTCCGGGAGAGTT
-GCATAGACATGGCCGGGAGAGAGCGCCCCTCCCGGGGAGCAGGCCAGAGGCCCCAGCGGG
-TCCGGGGCTCAGTCGGTCCCTGGAACCTGGGGTCCCTCGGGAAGAAGAATAAACAGGAAA
-CAAATCGAAGAGGCTCCTCTCTCCGGGCCGCCTGGAGTGGCAGGGGAAGGTTCAGGAAGG
-TGGGGACCTGCCCCACGCCTGGACCTCCTGATGCTCCCTCACCCCCCCAGTTGAGGGTCA
-GCAAGCTGCCCCCCCATTCTCGAGTCCCCTTCCTTAGCGAGTGCAGGCTCTGAAGAGGGT
-GGGTTTCTCCCGAGACGCGGGGGTGTGTGTGGTGGGGGCAGCCCTCTGTGGCCTGTGCTG
-TCCCTCTCCTTGCCTGGCTTCCTGACCTCCCAGTCCAGCTGGGGAAGCCAGACGGTCCCT
-GGGTGAGGCCAAGAGATtaaatagaataataaatagataaataaataaatacacaaataa
-ataaCTGGAAGGACCCAGCCGGATGGGGGAAGGGCATTGGCGAGGTGCTCCAGACCTCCC
-CCCAACAAGTAAGGAAGGGGATCTGTGGCCCTGGGGATGGGGGAAAGTGCTCAGAGAATC
-TGGGGGTAGGGCAGCTCCAGACTGTGGAAGCCCAGGTTGTGCCGGGGTGAGAGAGGGGTT
-ACATTAGGGGGCAGGGCCCTGAAGTGCCCCTCAAGCCCCCTCCAGGTTAGGTAGACTCAG
-AGGGGTGAGAGCTGCTAGAGAGGTGAGGGCAGCTGGAGCTGGGGCTGGGAGTGGGTGATG
-AGATCCCCATGGACTGAAGACAGTAGGAACTGTGTGTGGGAGTGGGGTGTGGGGGTGTGT
-GTGTGTGTGAATGGCCAGACCTAAGGCCTGAGCATGGATGGGATCAGGGACAGATCGGAG
-ACTTCAAGAAGGGTGAAGATTAGATCCCCAGATGGACACACTCTGGGAGATTCAGCAGAG
-GCCAGAGGGATGGTCTGGGGTTGGACTGTGGTCTCAGGGCGGCAGGGCCTGCGTCCAGGT
-GTGGATGGGGAAACTGAGGCAGGTATGGGCGTCAAGGGTATAGGTTTGCGGCTTTCATTG
-GGGGCTCCAGTAGAGGAATGGTCAGAGAGATTCAGCTGAGAAGCGAGAGAAAAGATCTAG
-AAGTTAGAAGAGCAGCGCGGGGTCTGGGAGGGAGAAATTTCCGGCTCTGGGGCGCGGGAG
-AGGTGCGGACCTGGTGCCTGAGTTGGGAGCCTTGAAGGCGCGGACAGGGGGGTCAAGGTC
-CGAGGGATGGCCGGAAAGGATGAAGTGGGTCGGGGGACGCTGGGGAAGACGGTGTGGAAG
-TGAGTCGTGGGTTTGGGGGTTGGGGAGAAAAGTTCCGGGCCGGGCCGGGGGTCCCCACGA
-GAGGGTCATGGGCAGGGAAACGCAGCCGGGGCTGGGCGAGGGCGCTGCGGGCGCAGGTAG
-GGGGCCCGGGGCGCGTGGAGAGCGAGTTCCGGGCGCGAGGGCGAGGCGGAAGGCTCAGCT
-GGCCGGGCCGGCGGGGGTCGGCGGGGGTGGCTCGGCCGCCTTGGCGCAGGCCGCCTCGCA
-GTGCTTGTGGAGGTAGGACTTGAGCGCGAAGCTCTTGTCGCACTGGCGGCAGCGGTAGTG
-CTTGAAGGCCGAGTGCGTCTGCATGTGCGCGCGCAGGTTGGAGCGGTCGGCGAAGGCCTT
-GCCGCAGTGCGCGCAGCCGAACGGCTTTTCGCCGGTGTGCGAGCGCATGTGACCCTGCAG
-CAGCCAGGGCCGCGAGAAGGCCTTGCCGCAGACGCCGCACTTGTGGCGCAGGTTGTGCGT
-GAGCAGGTGCATGGCGAGCGCGGGCATGGACACGTAGGCCTTGCCGCACGTCGGGCATTT
-GCGCGCCAGCTGGCTGTCCAGGCTGCGGTGCGTCTGCTTGTGGCGGCTCAGGTTCGACGA
-CGTGGCGTAGGTCTTGCCGCACTCGGCGCACGCGTGCCGGTGcccgccgcccgcctgcgc
-ccccgcgcgccccgcgcgccccccggcgccccccgcgtctcccgagccccccgcgtcccc
-gccgcccccgccccgccgccgccGCGAGCGCCCGTCCGAGATGAAGAAGGCGTCCATGGA
-GTAGCTGTCGGTCACTGCCGCCTCCCCTCGGAAGTAGCGCGCCGACAGGCTCGACTGCGG
-GCTTTCGGGGTCGCTGTACTCCTCCGGCGCCGCCGGCGGGTACGCGGGCTCGGCCGGGGC
-CAGCTCCAGGCCCGGCTTCTGGTCCGCATCGTAGCTGCTCGGGGGCAGGCGGTGCGGGGC
-GTACCCTGGAGGGGGCGAGAAGTGGAGGGGCGGTGAGAGGAGGCGCCGAAGAGGGTTTCC
-CGCTTTGAGCGCGTCACCCTTTGCGCCTTCCAGCTTGGCGCCCCTGTGGCAGCTCCGACA
-GTGGTGGTCTCCGACCTGCACCTCAGCTCTTCCTGTCAGGCAGCCTGGGTTCAATTCCTT
-CCTCCATCGACGGCAGTGCAAATAGCCGCCACCCCAACCCACGGAGCATGGGGCCAGCAC
-GGTtgtacagagcgtaccttcactatccagtgctcacaaccgcggagtgatggtcttata
-atacccacgctacaggtagagaaactgaggcgcagagagatgcagcagtctaaccttaca
-gtcaggaagtgatggagcccttgccagtgtgaccctgaagcccatgctgtctctattcca
-acaacatgctgccGTTGCAGCCCTGtaacttctctggatctcagttttctcatctgcaaa
-atggagcttgtgattggacacctccttccagggtcgttggaaggactgagtaaagtgacg
-ataataagcgtgtgttaagctcttactgtttgccagactctgcctcggtgctttacgcat
-gttaactctaatcgtcacagacccaaggaagtcggcactattgtaatccccatttgatgt
-gtaaggaaatgaacaaagGTGGGGGAGCATACAGTAATTGCTATATAAATGTTAGCTATT
-ATAATTATGCTTTTTACTTGCTTGGAGATAGTTTCctcccccaccacactgtgagctccc
-catggttggatctgtgtgcccagcacatgcctggctcaaagtaggtgtgcgatgaataga
-tgttgcatgaaggaatCACAATCCAGTTAGACCCACCTGCCAGGGTTGCTGAAGCATTTA
-ACAGGGGTCAAGTGTGTGGCATGTAATAGGTGCTACAGAAAGGGGACTTCCTCGCACCTG
-CTCCCAAGCCTGCTCTAGAAGTCGTCGGAAGTCCGCAGTGAGAATTCCCCTCCCCCTCCT
-CCTCCCACTTAGCTGGAGTTGGACCAGGAATCCTGTCTGCCAAGGGTTTGAGTGATTGGT
-GGGTGGGCAGGCTGGGGTCTCCCTGGGGATTCCGTAGGGGATTCTCATGGGCAGGGGCCA
-TTCTGATTTGCCTCTGCCTCCCATGGCCTAGGCTGGTCCTAGCACCTTCCCTGAGACCCT
-GGGGGCTGGGCTCCCTGGAGAGTTTCTGGCAGACAAACTTTTCATCCTGGCACTTGATGG
-GCAAGTGATTCCATTGTTCTGTGATTCCACAGAACAATGAAGGTTAGGTCCGTTTGGGAG
-GTTTCCCACCTGGGGAGTGGGATTTGACCTTCTCCTGGTGACCCCTGAGACCTGTAACCA
-CTCCTCCTTCCCTCCTCCCCTAGCCTCCTTCACTGAAGTGAGCAGGTGGAGGAGGGTTTT
-GTAAGGGGAAACAGGGTTCAAGATGTTCAGACTTTTAGCTGGGTACTCTGGTCAGCTTTC
-GTTTCCCACACAGCCTGGCTGATTCAGCctccaggcctttgcctctcatctggagtttgg
-gatggacacagggtgaagtctgtgtgcccctgaaggcaagggtgtgcccttatttttacc
-tctgtcccttcagcagccagcacagggccctctgcacacagaagtcattgtggattatgg
-aagtggatgaCTCGGAAGCGGGGGGCTCTGTGGTTGGATGTAAAGGGGGATAGTGATAGT
-GGCAATTTTTTAATCTGGGGAGAGGAGATGCCCAGCCTCTCCGCACCCTATGTCTCCCGT
-CCCATCTGCCTGTGGTCTGGAGGTCCCCCTGCTTCCCACTCCGGGAACCAGGCCTGGTAC
-TCAGGTCCCAGAACATTCAGGAGTGTTGTTTCAGACTGAGTTAAATACCCGTCAGGCACT
-CCCAGACCCCCCTCCTTCTCCTTCTGTATTTCCTCACGTTGTAATTCCTGGTGATGataa
-taatagctaatattcactgagcacttactgtgtgcaccaggctctgtgctaagtgcttcg
-ctcccatcatctcactgaatcatcacaaaactactctcatcacagataaggaaactgagg
-gacagtgtggtgatggcacttgctccaggggtggagcaaggattggaatccactgccCCC
-TTGgtttcccacatactgggaggtcctccaggagggggctgtggctgagctgttcacctc
-ccattcccagggccctagctagtgggcacttaataagtatttgtggaatgagtgaTGATG
-ATTTGCGAGGCCAGCCTCACTCCCCAGCCTAGCAGGACCTGGTATAGACAGTCCTGTTCA
-CCTGGTCTCAGGGCAGGTCTGCATCTCATGTGTCTGGGGCCATGGAAGGGGAAGGGTGGT
-TTGGTTCTCCAACACAGATTCCAGCTGAGTGCCTTTGGGTGGGTTGTGCTTCAGGTCCTT
-TTTTTTTAAAATGGGATTTATCTGGAGGGGTGACTGATCACGTAACCAGTGCTTTGAGTT
-CTATTATTAAaggatgacatattggataagagtaaaactttggtgccagacggcctggat
-tgttttggctctaccattcccagcagtgtgaccttggccaaacgatttggcctctgtgtg
-actcTACCGTTTCAGTAAGGGGTCTGCCAGTAAACAGTATATAAACAaatgataaccagc
-actctcagagcactcctgtgtcaggcactcttacaagggctttccacacatgaaagcatt
-ctacccccatgacacacaaggtggtaggtacccttttatagaagaggaaaccaaggcaca
-aggaagctaagtaacaagcctaagattgtgcagctgataagttagagccaggattccagc
-tcagTGGCTGGCACATTTTAAATCCACCACGCATGTTGGCTGTTATTATGAACAATAATA
-ACAATCTCCCCAGATGGGTTTCTGTGCTGCAGCTTTCTTGGCATCTGCCCCAACACATCG
-TGCTGCTCCTCTCTGGGCCTCTGTTTCCTCACCCGGGATGTGTAATTTCTATTTCACGTT
-CTGATGGGAAAATATCTGGTGCATAGTAGGAGCTCCATCAGTGAACCAGAGCGTTCTCCA
-TGAGGTGCTCTGCCCATGGCGCCCTCTGCTGGTGGCCCTCAGCGCTGTTGACTTTCCTCC
-TGTTGCAAGGGGCTCTTTATGAAGAAATAGGGGTGCCTTCAACAAAGGCTGCTCATTTGC
-CTAGGGAGGGCTGCAGAAGTGTCTTCAGGATAGGAATTGTGAGCCCAGACCAGACACCCA
-GTCAGTGGATTTTGGCATGGGTTGAGAGCATCCTGTGAGAGTTTGTGTGGTCATGTTAGG
-AGGAGGTGGTTctaacttgctttgtgactgtggccaggttgcttaacctttctgggcgga
-atctatacatgacaaagatggactggaatggtctaaagaccctttctgcATCATGGCTGA
-ATCAGTCCCTCCATGATGCTCTTTGTCCCCTCCACTCCCAGCTCCTCCAATTCCACCCCG
-TTTTCCTCAGATTCACAGACATCTCCctaggcaaccttgggcaagttacttaacatcttt
-ctgccacacctgtataagggagttcataataaggctgaataaatgaatgcatgtaaagtg
-cttaggacaatgcctgacacataatagctgccctcttgagctgttattattGTTACTGGT
-AGTATTCCTGTGTTTCCTGGTGATATATCCTTCTAATCTGCCAGAGAGTAGGAGATACAC
-ATGGGTGTCTTAGGCTgctgtgtgaccttgagcaaaccacctcacctctctgagcctcaA
-CCCTGGAGACTCCTTTAGGACACTAAAAGCCATACTTTAACCTAATGCATGGAACCCAGA
-CAGGTACCTTCCTCTGCCCTAAGAGTGACTATAGAAGGCTGAGATACCTATCCTGCAACT
-GACAGGGTGAGACAGGACTCTTGTTTGGGTTCCCAcagagatagggatgagctgggattc
-agagaaaagagaatctcaggtgagatctctcatcctagcccttgaattcaggccgtagcc
-atgtgaccttgggtaagtcgcataacttatctgggctcaaatcctccatttgaggaatgt
-ggaccagaggcacccctgtcatgtagggatatggggaggGCCCAGAAATACTTTGGAGAT
-GTGCACATGTCACCTGGAAATGACTTTGGTTTTCCCTGCCCAAGAGTCTTGATATTTTAG
-ACTGAAGGTCCAGAATCTGTCTTTTTAAAAATCGGTACTCAAAGGAGTGGTGAAAGGGAA
-ATTTATGAGAACTAAGGTGCTGGGCCCTCTGCAGACACTGTCTCATTTAGCTGCCTGACC
-CCCTGCGGGGATGGAGGGGGATGTGTAACAAATACTGCTACTGCTACTGCTGGTGCTTCC
-AACTAGCACCAGCCTCCCTGTGAGCCAGACATTGCCCTGTGCCCAgaggcccagagaggg
-gagaggatttgcccaaggtcactgagagggaggcggcaggtttgaaaccctccaaggcct
-gtgttttttccaaaacaccaGAGAGGGCATGGAGACTTGCTGGGGAAGAGATCTTCAATT
-GGTAGGGGAAGGGGTGGTGCGTTTCCTCAAACACTCCCTAGTTAGCCTGTGGTGGGGTGG
-GTGGGGGCACGGGGTGGTGGGGGCATGGAGAAGCTGTTGTGGAAAATGCTTCAGCCTCTT
-GTAAGTATTTGTAAATCATACTTAATaacagtaatgcctatcacttactgagcacttact
-tggtgcaaggcatcctgctaaatgctttgtgcacattagctcatgtctaaggtcacttcc
-ctccatgcccttgttctgcagaagctgaagcccagacaaaggccttgacccacctcaggt
-cacaaaacaagttctcatcagagctgggttggcctccttttctttcctttttttcagtcc
-aggactcctttccccagtctctcccagACTCCCAAGGTGCCAAACTTTCTCCAGGGAATT
-CCTAGCCTCAGCCTCACCTCTCTGTCCTAAAATGGGCAGAAAAAGACAGGGGCCTGGTGG
-GGGGCCAGCTTCCCCGGCGGCCCACTTTCCTGAGGAGGGCTGGGCCCTGCTGGGTGGTAG
-GGGCTGGAGGAGCTGCTGTATGGGTATATTTAGAGCTGCTTCTTGCTGTGCCAGGGCCTC
-GGGCCTCGAGAATCAGCTCCAGCCAGCTGAGCAGAAAGCCAGGTCTGTCAGCAGCAAAGC
-GGGATAAAAATAGTTTCTCCTGTCTGCTCACAGAGCTGGGCAAAGGGGCTGGGTACCTCC
-CCCTCCCCTTATTATAGCATCTTTGTTAGCGGTTCCCTGGGCACTGGACCAGAAATGACA
-CCCACCTCCTCCAAAGGCCTGGCAGCTGGTACATCTGCCCACGGGGAGGAGGTCCCTGTG
-CCCAAATGAGCAGGGGACAGAGTGAGGTCTGGCCCAACATGACCAACGCTGCATGGCTTG
-GGGCTGATGCCCACTGACCCAGGCCCAAGGAACTTTGAGAGAATTTCAAGGCTTTTCCCC
-ACCACCCCCATCTCTTGGAATTCCCCACATTCTGGTCTTTCCTGACTGTGACCCAATTCC
-TGTGGCCTACAGGGAGGTCCAGAGCTCTGCAGGAATCAATAGGAAAGATTTTTCAGGGGG
-GTATGGAGATGAGAGTGAGTGGCTCAGGGTCTTCATTTGCCCAGCCTGGGTTCGTAGAGT
-TGCCTCCTGCTCCCTCGGGGGGGATCTCCAGTGGGCCCTTTCTGGGCCTCGTTCCGGAGA
-CTGGGTGTGTTGTGCAGTGCTCCACCTCTTCCCCCGGCCTCCTACTTTCTGCTCTGCCGC
-CTCTCTCTCTAGAAGGGTGCACTCAGAGGGCCCATTCCAAACCCCTCCCTATCCAAAGGC
-TGGCCTGGCAGTAGACGCTTCACTTCAGGGGAGTCCACAGCTGGGAAAGAGACCAAGAGG
-CCCGAGGGACCCCATCTCTCCCGGCAGAGGGCCTCCAGGCTGTGGGGGCCCCTAAAACCT
-GTGGATGTAGCACCCACTAGGGAGGTGTGACAGGGTGCACCGTTTATGCTCTtgtgactt
-tgggcaagtcacggcctctctgtgacctcagttttgcctctgtaggttggagtgaatCCT
-CCCCTGCCCCCCGCTGCCCTTTGCCCACTGTGGATTTGTGTGGCCAGAGAGTGCCTTTGG
-GATGTGTAGATTGCTGTACTGACATAAGGGACTTGGTGTACTCTCTGGCCCTCCTTCAGC
-AATCAAAGACTGAGACTATCTAAAGTGTGGAAGCTCAGCTCAGGACCCTCACGTCCCTCT
-CGTAACCCCAGGCTTTAGAGGAAATCAGGGGTTCCCAGATTCCATATCTCACATGGGCCT
-CATCATTCCACACTTCCACTGAGCCCTGTTAATTCACAGGAATATTAGATTTCTGGGTCC
-Ctagaaggtcaaagctgaaagagatcatattcaaccgtttgatattatgaaaggaaaaca
-gaggctgggaggagaggggagactaggccaaggccacacagaaggctaatggtgagtcta
-agacttgaactcagCCCAGCCTTGAGAGCGGATCTGGACAATGACCTTGGACTGGAAACT
-GGGCCTGAATCTTGATTCTGGACCCAGCACTTTGCCCTGGACCTGTTCATAGGTATTGAA
-ATTTGAAATTGGACATGGATTTGTCCTGGATAGCAGACCTGGACCTATAACCTCAGACAC
-TGACCTTGGACCTAGTCCTTGGACCTGGTCCTATACCTGAAGTTTGACGTAGGCATTGGA
-CTTGGACCTCAGATCTGTACTTGGATGTTGGACTGAATGTTGGACCTTGACCTAGACTTT
-GAACCTGGGCCTCTGACATGTCTTTAACCTGGACCTTGGACCTGGACCAAGGCCAAGTTA
-CCAGGGAAAGGGGTGGTTAGAGAAGACTCAGATGGGTCTGCTGTGTGTCCATGGGCACCT
-CCCCAGCCTTCTCTGTGCTTGCTCTTCCAAAAGACTGGGGAAGCCCTTTTGCATTGCTGC
-TCCCCAGAGGAGCTTTCTGAGGTGTGGAATGGATGTGTGGCAGCTGGGGACATTGGGCCG
-GGCTCCCGGGCTTGGCCTGGAGCGACTACCCGGCACCATCAGAGGGAGTGAGAGGAAGTG
-GGCGCTGGTTTAATGTGGTCAGCTAGATAAGCCCATGGGTAGAAGTAGGAGAGTTTCCTC
-AGCTTGCTGGGGGAGGCTTAATGTAGCTGCAGAGGGCAGACAACTGTGTTATTGGATTGG
-CATTGATCCCTCATCTGCCTGGGTTGGATGCACTCTGAGAGGGCAGGAGGGCAGGACAGG
-GCGGGGATGCAGAGGAAGGGGGGCCTGGCTCCAAGCTGGGGTTCGGAGTTAAGGTGGAGG
-GGAGGCAGACACTCCAGAAGATATTCTTGGCAGGGGCCCACAGAGACCACTGACATGCAT
-GTGGGTGGGCCACCTTCTTTGGGGTGGCTGAGAGTCCCAGTATCCTTCAGATGGGGGCCC
-CGGTCTGTGGGGAGGGCCTGGTGGAGTTGGAGGGTGAGGTTAGCAGAGGGTTAGGATGAT
-GTAAGTTGGCATCTCCCAGAAAGACTGAGTCTGTGCTCAGAATCACCCAGGGGAGAAGAG
-GGGAAGGGAAAGCAGTGGAGGAGCAAGAGAGGCATCTTACTTGAGGGGACAATGAAATTA
-GATCTATTCCCACTTATCAGGGAGCTCTGCAGAGAGACCTGGTGCTTTCTTCATTTGAGG
-GGCTCCCCTTCCCTGTTTAGGAGTTCTGTGGGCTTGGGGGGACCCTGGAGCACAGACAGA
-CTTGCTGCACCCTCTGTTCTGCCTGGCGGTAGAGGCTGAAAGGGAGTAGGAAGGCAAAGA
-AGAGCATTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgcgcgcgtgcgtgt
-gtgtgtatgGAGGAGGAGCAGGAGTCCTCCAGGAATTCTCCAGCATTCTCAGGCATTCCC
-AGAGCTGGGGTACACCTCTTTAATTTGGGGTTCTGCATCTTTATCAGCTAGGAGCTTGTG
-GTTTCTCTGACCTCCACATTCACAGGCTCCCCCAACCCCTGCTCCCCCGACCCAGGTTTC
-CCTCCCGCCAGCCTCATCCTGACCCTGCAGCCCGAGCTGCAGGAATGGCTTGTAAGAAGA
-TCTTTCTAATAACTGGAACTATCTCCAGCCCCAGGCCTCCcccgccctccctccctccct
-ctctccttccctccctcccttgcttctcctccctccctctcctcatcttccccccctccT
-CTCTTTCTCCTTGTTTACCCAGCACACTTACACACGCTGAGAGAGAAAAACGTCGGCTCA
-GCAATTTTTCACACTTCCCTCAAATGCTCAGCAAGGTTATTTCCGGCAGAGCGGAGACAA
-CGGGCCACCAGGAGCCGGCGGGCTCTCAGCAGACCCCCAGCACCCTCCACCCGCCCAGGG
-AATAAGGGATCCCTCACTGCCCAGTCTGGCCGCACCCCAGGGAGGGAAGAGGCCCCTGAA
-AACAAGACAAGGCAGACTTTGTATTTCCCAGTCATACCTAGGCTTGGTCTCTGGCACTGA
-CCGTCCACTGCAGACACTGCCAAGGTGGCCAGGCCAGGGTGCCTGTCCTCACTATGGGGT
-AGCCTACAGAGACCAAAGCCAAGAAAAGTGCCCGATCCCAGAAATGCCGCTACCCTCAGC
-CAGGTGGCGTATGTTCAGTGGAGCCCTAAGGAAACCCTGACAGTGGCCTCCCAGCATCCT
-GTTAGACCCCTGTGCAGGCATCTCCAGTGCCTGACATTCCATAGTTGACCTtcacagaag
-ctgagcttgtcaaagttggaaggatgcttagtttatgccatcaaaactctttcactgctg
-gggaggctgaggaccagagaagggaaggcacttgcccaaggtcacacagcatgtgagaga
-tctagagcccaggcctccaaatttcaggccaggtttctggctatcagcacagccTCAGGA
-TTCCTGAGAGGTGAGGGAGTTGGTCTGGAGACCCATGGGGAAGGGGACAAAGACAGAGGT
-GGTTCTAGGGTGTTAAACCCGGTGGAACCTCTGCAGAAACACCCTGCTGGTGGCTCTGCA
-CCCGCCCTGCTTCCCACTATTCACTCAGGGGCTCCTTTCAAAGCTTTTTTTTGGACTGAA
-TTCAAGGCAAGGCATTCTCTTGCCTCCCTCCTGAGGAACAGCCTGCAGTTTTGGCTGTGC
-ATGGGAAATTCTCTGGGCTTCTCTGGGTTTCCTCAGCTGGCCTGGGGACAGGACCAACGG
-GGCTTCAGGGGGTGGAATCCCAGAGCTTTGTGTCAGTGTCAGTCCCTTAAGAGATCCATA
-TCCCAAGCTTGCAGATATTTCAGTTTCTACCAGCTTTGAGCGCACACTCTCCAGCTTTGG
-CATGGCCCCAGGTCCACCCTCTGTCCTGCCAGCCCTCAGCCCTGCTCAGCCATGTCCCTG
-GGCTTCTGACCTCCACCTCAAGAGGCCCTGTGATCAAGAAAAGAGGACAGTAGAATAAGG
-GACATGTGGGCAGAGGAGAAGGGGTTTCTGTTAAGGGTCTGGGGGATGCCAGTGGATGAG
-GGGCTGTAGCTGTATCCCTGATCACTCTGTAACTTCTTTGACCTTGATGAGGTCACAAAG
-CCCTTTGCCCAGCACTCTCTCTCTCTCTACCTGGTGTGGCAGAGTGATGGAATGTGGGTG
-AAGTGCTTGGAAATCCCAGAGGTGGAAGCCCCCATCCTCCCAGGCTCCTGTCTTTGCCAT
-CTCAGTTCCCCCCTCATCCTCAGTCCTTTCTTTTCTCctctctcaatctccctctttctc
-tctctctctttccccacccccatctctctctctctctctctctcacacacacacacacac
-acacacacacacacacacacacacaACCCAAAGCTGCCACATGTGATGTCAGATCTCTCA
-CTACCAAAGGGACACCTCCTCTTCAGACACCTGCCCTGGTGGGGGCCATCAGGGGAGAAC
-CCCTTTGTGATCCCCTTGGTGGAGGATGGGATCCACAGAAGCAGTCTCCACTTTCCCCTG
-CCTTCCAGAGATCACCCCCTTCTGCACCTGAATGACTTCTCTTGTTCCTCAAACCCTTGT
-CCCTGCAGGAACTTGTTCTGAGAAGAGATGGAgtgtgtgtgtgtgtgtgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtatgtgtAGTGAGGAGGGGGCTTACGAGGAGCAGCAGGGTTGGTT
-CTGGAGGGGGTTGAGAAGCTGGGGATGGGGAAGGAGTGCAATCCAGGGGACCAGGAGCCA
-CTTTGGGGGAACCCCTCCCAGAAATCCTCTCTTTCTTGCAGTCCCCAGGACAGGCCCAGC
-CTTTGGCAGGCATGTGGCTGAGGGTAACAAAAGAGTTATTGAGAGAGGGGGTCTGAGAGC
-ACTTGTGTGACATCGGCAGGGGAGCAGGTTTGAAGGGAGGGAGGGCGCCCCCAGCCACCC
-CCAGGGAACCAACCCTGTCTCTCCAGGGACTGAACATCCAGGGCTCTTTACCTTCCCCCT
-TCCCGGGCAGCCAGCTTCTCTTCCTCAACGGGGGAGAGGGAACCCTCAAAGTGCCTTGTG
-CCTCAGTGCCCAGCGCTGGCCTTTCACGAGCAGCCCCGTCTGTGTTCTCTTGCCACCCCC
-TCACTCTAGCCCTATTTGAGGGCCACAACTTTCAAAGTCCCGGCTGGCGCGTGGCTGCGG
-GATGGGCCGACCCCGCGACTTTCCCTTTGTACGACCTAGCCCCTGCCCCGCCCGCACGGC
-CCTTGGAAAGCCCGGGAGGAGCCCACGGCCAGAGAGATCTCCTCCCGGGGGTTTCCTGTC
-GCACGCGCCCCTCCTCGTGGCCCAAGCTGGGGAGGGCCCCAGCTCCCCTCGCCTCTTCTC
-CCAACCCCCCGCCCCCGCCGGGTCCCACTCACCGTTGTCCCCGGGAGGCCCCCGGGCGCC
-AGGCAGCACGTAGGCTGTCTCCAAGGGGTGGTAGGTGGGGGCCGGCACCCCGCTGCACTG
-GAAGCCGTCCCCTTTGATCTTCTTTACCAGGAAGGAgcgcggcatggcgcggccggcgcg
-gggctcggtgcggggaggcggccggccgggcgcgATCGGCTGTGTCCGCGCGGGTTTTCA
-GCACTGGACAGCTCCCAGCGGGCTGGAGCGCGGGAGGCCGCTCGGAGCCGGCACCGGTGG
-CGGCGGCCCCGGCTCGGGCTCGGGCTTGGCGGCGGCGGCGCGCAGACAGGGGATCGCGGG
-AGCTGCGCTCAGCACTCCGGCTGCCGGCTTTATATGGGACGCAGGCTGGAGATCAGGTGG
-TCCCCTAGCAATGGAACCGCTCGGCGCTCTAATCCATCAAATGTCCCCCAGGACAATCGC
-TCCGCACACGTTCCCCTGAACCGGCGGCGGTGGGGGCAGGCCCGGAGCaggcaggagggg
-agaaagtgagggcgagaaaggcgcagagacagagagggacggagaaaggggagtgagggg
-ggcggggagaagaagagagactcggagaaagacagagacatacagggaaagagagacgca
-cacgctgagagaggtagaaatagaagcagagagaccaagataaggacaaaaagacacaag
-agagaaacagagagagaagaaagacagagaTGGAGAGAAGTAGCAACACACACACACCCA
-CGGGAGGAAAAGAGAAATCCAGGCACACAAAAAGGAAACCCCCCCAGGGATGCAAAGAAA
-GGGAAAGAAAAGTGCAAAAGAGAGGGGGAAGCCGAGGGGAACGGAGGGAAAGCGGTCCCG
-AGCAGGCGGGGTTCAGGCACATGGGGCCGCAGGGAAGGGGATGCAGAGGAAAGAGTGCGC
-ACTGGCCAGCGGCCACCCTCCCGCCTCCAGTCCTCTCCCTCTCCCCCAGTTCTGAAGTGG
-CCAGGGTGGACGCTCAGCTTTCACTAGAGTAAGTCTCCCCTCCCCCCTGCTCGGGCTCCC
-ACTGGAGCCCCCTGTTGGGTTTGGGGTTCAACTTTCTTCTTCCAGAACTGGTGGGGGGAG
-CAAGTCCCCCACGCCGATGCCTGGCCTTGCTCGGTTGGTCCTGTTCCGGTGCCTAGCTCA
-GGCGGGCGCTGCAAGAGGAAGTGAAAATCGTCCAGTAATTAATTTTCCTGCTGCCGGGGG
-GTGGTGGTTTTGACACATCCGAGGCAGTGTCTTTCCCTGAAGCGGGGAGCAGACAATAGA
-GACACGTGGACTgggaagggagaggggggaagggagggggagcgggGCTCCTGCTGGAAC
-TCTTTGCAGGTCAGCTCCTTTGTCTCTAAAAGGATCTGAGCAGACCCGCCACCCCCAGTC
-CGACCCAAACCTGGGGGAGCCCCCATATCTTGGCAGGACCAAGGAGCAGGAGAGCTCAGC
-CCCCTGCCCAGAGGGTGCTGGGCAAAGCCCCATGGTGGCGGACCTGCTTTAGCAAGTGTG
-GGATGGCCAGTGCACAAGAGTCCCAGAATCAGACTCTAGGAATTCCAGGCTCTCGCTGTC
-AATGGAATTCTGGTTATGAGATGCAAGGCTGGTGGAGTGGGGATGTCCTTTTGGGACTGG
-GTCATCCAATACCAGTTTGCAGGCTAAGACCTAGAGAGGGCTTGGAGGTGCTTGAGGTCA
-TGCAGTGAGTCAGCAGCAATTGCCAGAGACCTCAGTGGCCTCTGGGCACCACTGAATCAG
-GGCCTATCATGGTCCTTGAGGTGTAGCCCAGAAGTCTCAGAATAAAACTGGGGCCCCTcg
-tggtggttcaagcctgtaatcccagcattttgggaggctgaggcaggaggatcacttgag
-gtcaggagtttgagaccagcctgggcaacatagtgagaccttgtctctacaaatagttaa
-aaaaaaaaaaaaaattagccaggtgtggtggtgcacacatgtggccttagctacttggga
-ggatgtggtgggaggatcgcttgggcctgggagttcgaggctgcagtgagctgtaatggc
-accactgcgctccagcctggatgaaagagcgagaccctatctccaaaataataataataa
-taataataaGTTAGAGTTTCCAATGCAGGATCTGTTGGCCTTGAATATTTTCAAAAGACA
-TAAAGATGCAAGGATGTGGAAGCAGAAGGTTTGCCATTGAATTTGCCCTGTATGGTTTTA
-GATTGTTTTCCCTGACCGAAATAAGGAATTAAGGCAGTTTACTCCCTATATATAAACATT
-GAAAAACATTGCAGGTCCAAAACAATGGGGGCCCCTGATCTTGCCAAGGCCCTGCATGGT
-CTAGAGGTCCCCCACCATCTTTCCTGTTGCATTGCCTCATATCTTGCCCATGGGAAtttt
-ttttttttttgagatggagtttcgctctcgttgtccaggctggagtgcaatggcgcgatc
-acagcccactgcaacctccgcctcccaggttcaagtgattctcctgtctcagcctcctga
-atagctgggattacagggtgcgccaccatgcctggctaattttttgtctttttatcagag
-acggggtttcaccatgttgcccaTGGGACTTTTTTAAACCTCTGTCACTGAGAGTTGAAG
-TGACCACACCCTTGACTCATGGCACGcccatgcattctctgctccagccataggtgccta
-ctggtgctttgggcttgcagctctcttgacctgtataccatttccactgcccagagtcct
-tccctgcacttcaccctaggaaacccctacttgttctcaagactcagccgaggggtcact
-tcctccaggaggtgtccctgacttccatcattgcagactgggccaactcacccactggtc
-cctgagcttcatgaggacaaagactctgtcccatgtatggcttaacacACTCTTAACAGT
-GTGCATGAGGGTCttctagctcccctacttattagccataggtccttggacaagttactc
-aaccgctctgtgcctcaatttccccacttataaaatgggaataataattgtcactaccta
-agtgttgttgggagtgttagaagagttactacatataaagggcttggaatggtgactggc
-atatggtaggagttcaatGCTTGAGGGTTCTATATATGCAGTTTTGCCTGTAGCATGCAG
-CGCTCATTTGTTACATGTTAGTGGGATTctgtggaatgagtggtgaactaggcatctctg
-gtccctgctttcttgcagctgatcttgcagctgtccattcattgagtggatggacaccaa
-gcaagaaaatccttaaatcaacaatatattttcagatagttgaccagtgctgtgaggaac
-ataaaacagggtgagatgatggagagtgatggtgcctttaggcagggtgaccagcaaggg
-tctcctgggagaggtggcatgtgcacctagacttgagccagccatggaaggagcccagga
-aagagtgctccagccagaggcttcacaagttcaaaggctctgaggcaggaatgagcttga
-gcagctgaggacagcaagaaggGAAGGAAGATGAGTTCAACATGTTAGCAGGGCCAGACC
-CAGAGATTACTCCATAAATCCCAaatgaatgagtgaatgaaagaatgaatgaTTGTAGGG
-GTGAGATTCAGCCTATAACTATAGCTTACAACTGTGACTAAGTAGACCTATTGGTTGGAG
-AATAACTTTTCACTGTTTACATAGAGGAAGTTGCTTATTTGTTCAGTCATTGACAATTGT
-GGTATAGCCATATTTTTTAGTTTGTGCTGGGTACTTGGATCTCTGTCCTCTAGGGGTGCC
-TAGTTCACTGTGGGTAAATAAGGCAAGTGGGTGTCATCTAGCTCACCTCCACCTGCCTGA
-TGGTTCTACCTCTCCAACCTCACATCTAAGAGATGGCAAAACGGATCCCAGAGTCCTTAA
-AAAGGAATATAGGTCACAGCAACTTTTGACAGAGCTGGGACTGGACTGTTCTCACTGGGC
-AAGATAGTGATCCACCCCTTAACTGATCAAAGGAAGCCCCACAGAAATGGTGTATTAATA
-GGTCCTGCAGCCCACTAGTGTCGGGTTGAGGATAGAACCCCAGGTCTCTGACCACAGGTT
-GGAAGGTGGTGTGGGTGCATTTAGCATATGAGAAGAAGCCTTGAGCCCTGAAGATGAGGT
-TCCAAAATACCTTCAGAGGGGAGGAGGCCTTAAGTATGGATGAAATACACAATGGCCAGC
-AGAATTTCATCACTAGGACACCAGGAAGGGCCTTCTGTCCCCCAAACCTCCCCCCACCCC
-AGCTTACTGGTTTcaggaagttcactgtggggaattaatttctctaagtcacatgaaata
-aggaaataacttttattcccaaggatgttcgctgcagcatcagagatggtaataaaaacc
-ctgggttggagaaagcaaggagagggttgtgaagaagacgttcactccatgtagtattct
-gcagccattaaaaattctcatttggggagaaaagctcataaaatgtgttaagtgaggggt
-gcagaatacagaaacctctcacagcacgttcacaaccatgaaccaaaacaaaaataaaca
-cacacAAAAGAGTGAAATAAGGGTCTGGAACTATGGGGTTTCCCTCTCCCTTCTTTTTGT
-GTTTTCCAAAAAGATCATAAAATATTTCAGTTCagccaggtgcagtggctcacgcctgta
-atcccagtactttgggaggctgaggcgggtggatcacgaggtcaagagattgagaccatc
-ctggccaacattgtgaaaccccatctctactaaaaatacaaaaattagttgggcatggtg
-gcgcgcgactgtagtgtcagctactagggaggctgaggcaggagaatctcttgaacccag
-gaggtggaagttgcagtgagctgagatcgcgccactgcactccagccttgtgacagagca
-agactccatctcaggaaaaaaaaaaTAGTTCAACAAATATTTATCTTGAGCACTTGCTAA
-CTGTCACTTACTTCCAAATAGAAGAAATGCTGAAGTTTAGTAAACCATGTCAGGATATTC
-ACTATTCATTCTTCTGACTTTTGGGAAGTTGGCATTGTGAATTTCCCCAGTGGCAATAAT
-AATTATTAGTACATCGCCAGCAACATTACAGAGCCACCCCACAGGCCTGGCAGTGTGCTA
-AGCACTTTCCCTTTGAAGAAGGTGACCTTgcctggggctttagattgagggatttggagt
-cagcctattttcagtttaaattcctgctctgccatttcccgactgtgtaattctctgtgc
-ctccattttctcatctgtaaaatgggtgtataaattgggcctgtctcacaaggttgcagt
-gaggattaaatgataatataggcatcaagtgcttagagcagtgcctggcacacaataact
-tgataaatgttgacagttgctatttacatatcctcacttatctaagccttaccatggcct
-catgggagaaggtgctgttattGAAATGACTGGTTCATGGCTACATAGTCACTGTACAGA
-GGAGCTAAAGAGTGTCCCATGTCTTCATGGCCTACTGCCTTCCTGCCCAGGAGCCCCAGG
-TCTTGGCATAATAGGTCTAGCTGGCTGCAGGCTTAGCCCTCTCTGGCCTACCTCGTCTGC
-TCTGGCATCTTCCATATTTCAACTGTGCCCTGCCCATCAGGAAGAAGGGCAGTTCCCAGG
-GTCTAGGTGTGAGTCTCAGGGCTGTGTGACCCTAGGTGGCTGGCAGAGCCACCCTGGGCC
-TCACCCTGCACATCCATAAAGAGGGGTTGGGGCATCCTATGATTCACTGGCTTCACTCTA
-TGGGGTCAGgaaggagcactgacctgggagtcaggagcccagttccagccctgcttctgc
-tccctttgccctcccctttgggccccagctttcttgtctgtcaaatgggaatgggacaag
-atggtccctgagctgctgtccagACCCGGTAATGGAATTCTGTATGAATTCCAAGGAGGA
-GAGTAGCCACAAATGCATCCGCTCCACGCTGATGGGGCTCTCTCTCCGGTAAGCTTCACT
-TACTCTGCCATTTCTCCAGTGTATTTTATCAGACCCACCTCCTCTGAGCCAAAGAAAAGA
-GGGTAGGAGCAGGATGAAACAAACTCACAGCTCTGTTCATTCAGGCTCATCACAGAGATG
-ACTTGCCCAAGGGCATGTGGCAGGTCCTCTGAAATTTGAGGAAGGCTGTGTTTTCTTTtg
-tgtcactttggtcctccgggaagcagatgtgaaaatggaggtgtaagtgtaagagattta
-ttgagaaaacaccgtgagaaatggaggagagccttcagagagggatgcaggtctgatact
-gtgaaaggagaggtggaataaagaaagattggggaagaggagcctcaggccatggtgcag
-gtctaaggaagtcctagccaacccaacagggagctcctgtgcaaagatttcctgtagagg
-agtcccgtgctcgacagaagggcagaccctagtttcccaccatgctcagtcatcagccgg
-cctgtcctggaagagtggctgtgctgacaactatggcagattgcaaaggtgttgcagctg
-gaggctctcagtgactgtagtccagagaagatctgagtggcacctccctaaggctgccac
-aTGTTTTTCTTTATTCATTtaatagacacttacagaactctgggccatgtgccagttact
-gatctatgcactttacaaatattaccttagttaatccttaccctcgccttttgagacaga
-tggtatttttagccccattttatagagggagaaactgagcacaaagaggttaagtaagtt
-gcccaaggtttcacagccagtaggtgataagccacaaatccaacccaggcaagctgcttg
-gaggctctgctctgaccactccaccacactgCCTCCTCTCCAGCTGCAAATGCCTTGGTG
-GCAATTTCTGGGACCATTTCCATTTTCATTTTTCATTGGCTCAGGACCTCACAGCCTTAA
-CAGGAAGGGGCCTACTGTGGTGGCTGGGGGCATAGCAGGGTCCCAGCTCCCCCTGAAGCT
-TCTAccttgctccctcaaagacttccacctcaaagcctttgcatatattgttcccactgc
-ccagagcactcttccacccccttccttgcctaggtaacccctcctcCCATCGCTCCCTTG
-CCTGACCCCAGGATCTAGCCCAGGATAGGGGTGATATGTAGTGGAAAGGAGCTagttgac
-atttattgagcacttattatgtgctaggagccaagtccagccctttacatagattgcctc
-acttaaccatcataacaacctgtgagtgtggcccatggctatccccattttacagatgag
-gaaaccaaggctcacagatgcaaggtgacttgcccaaggagacccagctaggaatcagtg
-gtgtcagtatttaaaccaggctgcctggctacaaagtcctgatcttAAACCATGAGTCCT
-TCCCTCTAAGAGGGCAAAAGATACCAATGCTAGGGTGGGTAGGTGAGGGCCCTCCAAAGA
-ATGTCCCTCCCCTtccccctgccagggctgacagctccttgagtgggattccggatctgc
-tccattcattgccgcacctccatcgtctacccagagccgggtaaatagtaagtgctcagt
-aaatacatcaattgaatgaataaaCTAATGAGTGAAAAACCTTCTTGCGACCCGCAGTCA
-CCTTGGTCCCCTTTGACCAGAGCCAGGTTGACGTGTCAACCGTCAAGATATCCCTCTGTT
-TTGGGTGATAATTAGATTTCTATCTTGACTGTTACAGACATTGGTATTCCTCCATTAAAA
-TGTCTTTCTTTCAggccaggtccggtggctcacgcctgtaatcccaacactctggggggc
-cgaggcgggtggatcacctgagttcaggagttcgagaccagactggccaacatggtgaaa
-ccctgtctctactaaaaatacaaaaatcagctgggcatgatggggcgtgcctgtgatccc
-agctactcaggaggctgaggcatgagaatcgcttgaacctgggaggaggaggttgcagtg
-agccaagactgcgccactgcactccagcctaggtgatggagtgagactctgtcttaaaaa
-aaaaaaaaaaagaaagaaagaaaaGAAAAAAAGTCTTTCTTTCAAAGTTGGAGACATCCC
-TAAACATTCTAACTCCTGTCCCTGACAAGGTCCCATCTTAAGCAGGTCTCTGAAACCTCT
-GGAAGAAGGAATTGGCTATCAGGAGTCTGATCACCAGGCTGCCTGCGGGGTCAGGGTATT
-TGGGGTGGGCCTCTGGCATGGTTTAGCGGTGGGCTGGCCAAAAGCCCCTAGACAAGAGCC
-CACCATTCAAGCAAGTGGGATAACTCAGCGTTTGGGCCTGGGTCACCCTGAGCCAAGttt
-tattttttatttttattttgtagaggtagggtcttgctctcatccaggctgtagtgcagt
-gttgtgatcatggcttatggcagccttgaactcctggggtcaagtgatcctcctccctca
-gcctcctgagcagctgggactacaggtgcatgccaccatgccctggctaatttttaaact
-ctttgtagagatgggattttgctatacttcccagactggtctcaaactcttggcctcaag
-tgatcctcacgcctcggcctcctaaagtgctgggattatagatgtgagccactgtacctg
-gctgagccaaattttaatcctggctctgcctcttcaagctggttggccctgggcaagtta
-ctttgcctctttgcagctctatttcatctctgtaaacagaggccagtgggagcacctgct
-aagtagggctgtAGGGGGCTTCATGTATAGTCAGCCCTTGGTAAGTGGGAGCTCTActtg
-aagggcctttgagataacagcattgtctcctccccacccccatttgacagttgtggaacc
-tgaggcatgggacagggaaatgctttccctggaacattcaggctccctgccaagtcagga
-tgggcttcctcactccaaggtggcctctctTGCCTCCCTCTCTTCCCCACCAGCCGAGCT
-CAGAACCATGCCTGGGAGATGCTGAGGTGGCAATGGAGCTGCAGAGTTGGCATTTCCAGG
-CTCCCAGGACTCCTGGCACAGAGGAATCAACCCCTCTCAGCAGCCCCGGCTCTGCCTCCT
-GCTCCCTGCCTCTGCTCATATACCAGCTGGGACTCATCAGCTTCTAGAGAAAGCCAGGAG
-GTGGCCCAGGTGCATGGAGGCAGGGGGCTGTCAATATTGACCTGTGCTTGACCGCAGACT
-TTGCCAGTGGACAGGTTGCTAAGGAGTCAGAATGTCCACATGCCCCTAGTGCTCATCTTC
-CTAGCCTCCCATCTCACCTAGCTGCAGAGGGGGAGGGGgagcacaagagttgaaagcgtg
-gatgatctgggttcacttcggctgcttaccaacaagttacccagcctggggaagtttccc
-atcctctttttatctcagtttcttcaactgttacatgaggatgttgatactaatggctta
-tcttgaagggcagatggaagatgagtgaggtgtttgcacacagccagtgctcaataatat
-tggccattgttAATTCTGAGGCTATCCTCTTACAGTGACCTCTTGGGCCTTTCAGCCCCA
-AGGAGCCTCTCCTCTCTCTGACTCCTGTGGCTCTGTCAAGATCCTGCAATGAAATTCTTC
-TGGAACCCTATCCAGATGGTGAACTCTTCAAGGGCGGGGACCCCATACAGGTGCCCCATT
-ATAGGCCTGGTACACAACAGGTGCTCATGAAAAGGCCTGCTTGGCTGTGATACtacatga
-acttacagaaccctcacaactacttttggaggcatatgacatgattatccccttttataa
-aaagggggacagtgggtaacatcgaggtgaagaaattgcccaagcagctgggcgcgatgg
-ctcacgcctatagtcccaacactttgggaggctgaggtgggtggatcatttgaggccagg
-agttcaaggccagcctggccaacatggcgaaaccccatctctgctacaaatacaaataca
-aataataataataataataataataataataataataataataataatagccaggcatgc
-tggcatgcacctgtaatcccagctactgaggctgaggcatgagaatcatttgaaccggga
-ggcagaggtaagagggagccaagatcgggccactgcattccatcctgggtgacagagtaa
-gactctgtctcaagaaacaaacaaacaacaaacaaacaacaacaacaaagaaaaagaaag
-aaaaaaattgcccaggggctcacagctataaatctgcagatacttattgtgacctgccat
-gtgccagacactgtgctaagagctggggacacagcaatgaacaagacagagacctgctct
-catgtggcttacatcctgctgagccaagagtaggtagatatgccaatgtcctgtcataga
-aagcaccaggcagggaaatgggcaaagacagagagaggtggaggccgggcgcggtggctc
-acgcctgtaatcccagcactttgggaggccgaggcgggcggatcacgaggtcaggagatt
-gagaccatcctggctaacacggtgaaaccccgtctctactaaaaatacaaaaaatcagcc
-gggcgtggtagcaggcgcctgtaatctcagctactcgggaggctgaggcaggagaatggc
-gtgaacccgggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgg
-gcgacagagatagactccatctcaaaaaaaaaaaaaaaaagagaggtggagcgagagcca
-ttttagatagggtagtcaaggaagacctctctgaggaggtgacttttgtgtagagtccag
-aatgCAGCAAGTGCTGGGTGAAGCCTCAGGAAATCTGCTTTAGCATTGCTGTGGCAGATT
-CAGGGTGGAATCCAGGAGATCCCAGGACTGGTGGTGCCTAGAGCCCAGTTGGCTAGATCA
-ACTTCAGTGTGGATAAATGACTCCCCTGCCCCCGCGAACTTACCTTCCTGGAGCAGTTAA
-AAGAACGgggcacatgacctagattctctgagcttcacttttctcatctgtaaaatgggg
-attgaaaagcatagcttacaattctgagagctgagttgattaacagagatggtccatgta
-aaatgctgggctcagagctgggcTGACCAGATTCACCTAGTCCTTGGTGGCTGGAGTGGG
-CAGGTGACCTTCCTTTTGGCCGTCCAGCACCCTCCAACTCCTTGCTTCTGAGACCTCACC
-TCCCACTCATGGTATCATTGCTGGCCTTCCCAGCCCCGTCTTGGCCAGGGGGCAGTCAAG
-TGACCCAGATTAGCCTCGTGccattctgttgagggtgtggtggttgctacattgagtgtc
-cagaggtagcaaggactaaagtcctggtgtcagcatccagcgttggtgtcagcagcacga
-gctctgtcttggggacccgtggtgtcagcagtgaagtctccctcaggccagggctttggt
-ctgatttgagggcttttttcttttctggatatgaagcctgtaagccttctgaccctcctg
-gagatcctTCAGGCACGTCTGCAGCCATGGGTCCTGGATGATTTAGCAGCTCACGCCATT
-GTCTGGAAACTCCACTGGTACTATTTTTCTCATGTTCAGCTCTCTGTGCACAGACTCCAT
-CCTTCTGGCCCAGATGGCCCCTTGGGGATATGCACATACCAAGTTCTTTCCACTGTCCTC
-ACTTtgagggcaggggcctgggttgttcatttttgtgtccccagatcctagcacagagcg
-gctcagaggaaaggctcaatgcatgtccatggtgtcaacaaatCAGTGGcacaggataca
-gtttccacacatctccccatcctggttgcttccccgaaccattttccagtctgtcagtgt
-tcttctgaatatacaggatccagaactgagcacaaaactccagaaataggtgaatggagc
-tgagcagaatgaaactgtcacctcccttaccgtagataccggacttctaattacatgacc
-agacatttaataagcttgttttgTTTCCCTGGGTGGCATATATCAAGCTACTAGCAAGCG
-TTTTGTTTTCATGGTCCTCTACCCACATATTGTTGCAAAACCTCACTTTACTGCCCTTCT
-CCCTTAATTTCACGCTTATAATAGTATTGCCCCTCTCTCACTTCCcaggaatgccaagtc
-gattacagctcaagagcccaatcttgactggtccgtagcctggaacatggtgctgagata
-gatgctgtaactgagtttgggctcactgagaaagactgctgcaattgattaacgatgtct
-gccaAGCTGTGTAAAGTGAAGTAATGTCATTCCCTATCACAAGtcctaacctggggtcca
-tggaaagaatttagttggtctgtcattaacttggatagggaaagtattacatctttaatt
-tcattaacctctatctgaaacttatcattccttcaattatgaatgcaggcaacagaccac
-agtggtattagcaggacctgtgactttgtcaccaatagaaatcacagattttttaaaatg
-acattacagacgttccgcatatcttgaaatataatttacatgcactgtgacttggaaatg
-ataagttattTGCTAAGTactcatttacttactcacatttgtttagcgcctagtcaatag
-cctggtgacgtgccaggacctgggctgggtgctataggcaaaaggcagatgcgtaaggct
-cagtccttccctcaaaagagaaaagcagacagtgacaatggaaaggcttgatgctttgat
-gggggaagtacctgaggcccccaacccagcccagagggatcagggaaggcttcccagagg
-aagtggcctctcagatgagtaggaagtaaccagacccctgagtgctgagaaaaagtgttc
-agggagcagaaacagcatgagtaacgaagctaggaaagaaagagGACACAGGGCTTACAA
-AGTATTCCATGGCGGGGATGGGGAGGGGAGGAGAGAAGCGGGGAGATGGCTGGGGGGGTC
-AGGCAGGCCCCTGGAAGTCATGCTTGGCGGTACCCTGGTCGTGGGGGGGAAGGGGTGCTG
-GCGCTTGCTGCCCCATCTGTCTCAGTGGCATTGAGCTGTGACTTCAGTGGCCTGGGGAAG
-TTCAAGGTCACCTCTGGGGTGGAGGAGGTGGAGACATCTCACCAGGGCTGGCAAAGGCCA
-ACTGGGAAGCTGGGGCCGATACCTGCCCCTCACGGCAGCCACCACAAGGGGCCTTCTGCT
-CCGAAGGCCCAAGCACGCCCTGTTCCTTTATTTATGGGCCGTGTGAGCAATTTGCTGCTT
-GCTGGCCGGCTGGCTGGGTGTGCGATGCGGGGATTACTCACGCCCCAGTTGTGGTCCGGC
-CTCTGCAGGCTGCGGGGTAGTGAGTGAGGTAATTAAGTGTAAAAGATGGAGCAGGCAGGG
-GAGGGCTGAGGGCGGTGAGCAGTCACTGGTTCTTTTCAGGAGCAGGGGAGTGAGATAATG
-TAGGATAATAGCCTAGCCAAACCCTGCCCAGGCAGCCCGGCCTGTGCTGAGAGGTGCCCC
-CCAAACGGCCAAGACAATTCAGCCTTTTCAGGGAAAATGGGGGGGCTTGGGCAGGGCCTG
-GCTCCCAGGGACAGCTGTATGGAAATGACAGCTCCTCTCCTTCGTCCTGTCCTGTGTTGG
-CTCAGGGTAGGGGCAAGTGTAAGTGTCTTCAGCTGGGGATGAGGCCAGGGCAGGGGGCAG
-TAGATGGGACCAGGAAAGCTGGTGGGTGAGAGGAGGGATCCATGCGGGGCTGGGAGACTG
-ACCTGTGTATGTGGCACAGgcacagtggttcgtggcagcagactccagggcctgactcac
-ctggtggaaactgtggtgtggctttggctagctgtgtgacatcagcctagttgtggtcct
-tctctgagcctcaggactctcatctgtcaaatggggctgtcaaacaattcctacttcccg
-ggggtgtttggagaatGGTTCGTAGCGCCTGATGCACAGGGGCTACGAAATGCTTGACAT
-GGTGAAGTCCAGAATCAGAGTGCATTAGTCattcactcattcagtggataaatgtttatt
-gagtgcctaccatgttctaatggttcctgggaaagcagcagtgactagaacagagtccct
-ttcctcttggagatgacattctaagaggggagacagaccattaatcgtgaaacacataaG
-CATAAAAGGTCATAccagcaatcccacttctgaaaacttattctatagacatgtttgcat
-acatgtggaatgaatgcattcatggttatttattgcaattttgtttggcatagcaaaatc
-ttagtaatgatctaaatgcctgttacacatgggctgactgaagtatggaatattatatag
-ccattaaaaagggtgagaccatttctatTTCTgtttatttttatttactttttttagaga
-tgggatctcactatgttgaccaggctggtcttaaactcgtcactggtgaGACCATTTCTT
-ATGTACTGATATAGAAAGCTCCCTAAGATGTTTTGACAAATAAGAAAAGGAATGTGAAGG
-ATAGTTTCTGTAAAAGAGGAGACAATTTGAAAAATGTATTTCTATTAGCTTGTGTATATA
-TGAAACTAATAATAGTTGTTACCCAAGGAGAGGAGTAGGGTTGGAATGAGAGACAGGAAG
-GGGAGAGTTTCACTGTATACTTTTCTATAACTTTTATTTTTGTATGAAGTGAATGTATTA
-CTAGTTCAAAAAAGAGAAAATAAATATTCAGCTTCCTCTTTCCTCCTTTCCTTCCTCAGC
-ATTTGTTGGAGGTAGCTGTTGAGATTTGGGACTAAGCAACAAAGGCAGCTGAGTGAGGTG
-GTGGCTCAGTGTGCCTGGggattgaacaaacaggttcatatatcaaggataatgagagcc
-aggttgctcagcatcagagaagggaattacaagtatgaaaacaggaaaggctagaaagaa
-ccctgtggtgttagattggagttagaggaatcagtgtaaactcatagcttttgatatata
-tagttacataagcatgcatgcaagtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtg
-tgtgtgtgtgatgcatatgtgcatttcccagttctgtccaaaaagacagcaataatcaat
-acaccatgtagccacgaatacacctaacacctagatcttgggttttaaatactattctcc
-actgaaaggaactggggcttgggaaaatagtagatttgagggctggagcaggaaaagtgc
-cctgtgcctggtaccatggtacatgaaacatctagctgtgccatatgataggcaagtgct
-caagtaatgctgaggacatgtcaaaagaccaaggtgccaacttaaagggactcccaatgg
-ccaaatctgggacaacttgagtatcaaaataatgacagtaacagattataagccatgaaa
-tataaatagtcctgatatacagacacatacacgtattacatacacacatacatacataca
-cacatgtgcagaaagagaaagctctttcttacactagaatgcccaataataggtgtggaa
-ggaaggatgcaactagtatggtaataattgattcaaacaagaagcattactagatgctaa
-aactaaagccattgtgtgaaaatttgttgaggagtaggatatttacatagtcttaaagag
-tctttccacaagatacaatacctgcaaaaggaaggagagtgactttatagcgaagaaaca
-tggcagagactatcttagtcgagtgatcaaaggctgcatcactgttactggacaaactga
-catgaggctcctgatgggatgcacagggaagagtgaaaaatcacttctgtgatgttcctg
-ccagagatgcaaaactgaaatctaatcacgaggagccgtcacataaacccaatttgagga
-accttctacaaaacaactggcctgtaacctgggtaagtatcaaggtaatgaaaggcaaag
-aaaaactgagggaccgtcacagattagaggagactaaagagataagacaatgaaatacaa
-tgagtaattctggatggatctttttgtttattataaaggacattattattgagacaatgg
-acaatatttgactgggctctgaagattggatggtagtaatatatcaatgtcaatttcctg
-attttgatgattttattgtggttatgtaggagaatatacttgcttttaggaaatgtacac
-taaagtattccaggataacagggaatcaaattgacaatttactctcaaacaattcaaaga
-aaatctctctatatataaatctctaagagagaatgataaagcaaatatgtttaaatgtca
-atatttggggattctgggtaaacaatatatgagaattctttgtacaatgtttgcaactct
-tctgtaggtttaacattattttacaataaaGTTATTTACATGAAACTGaaaccatatgat
-gtcaagtaatgataagtgatatatagaaaaatcaagtgggcagaggaacagaaaatgagg
-gggtggtgctattctagatggtatggtccaggcaggcctctctaggggaggacctttgag
-cagagacctagtgggagggagggagtagctccatggatacttggggagagtctcaaaggc
-cgagggacccatctgagaaaaggcccagagtgggaccagcttggcctgtgtattagtgtc
-tattgctatgtaacaaatcatcaccaacttagtggcttcaaacaacagccatttagctca
-cagttctgtaagtcatcgtctggcacagagcaactgagttctttgctcaggatattacaa
-ggtagaaaccaaggtgtaggttgggcttagttcttatgtgaaggctctggggaaaaaatc
-cacttccaatttcattcttttcttttcttttttttctttttctttttttttttGTGCAGT
-TGCagagaggaaaggaggaaatttttcgatagaaaaatcttggagatcctgttgctgtca
-cccatcgggctgttggaagctggggttagtccagaagtcttcaggtaatgccagggtgtt
-gccctggccaggaactctcagttgcctctgaacttcttccagccccacatgatggctaag
-ctctccatgaaaggagaccagttggaaacaaagccaacattcccagcaccctgagggcac
-tgaaggattggctaagttctccccggcaagcctgttccctgagaaaatggaggacagagt
-ccttaaaatgaaagagctggggtctgtgcctatactcactctttcaatgaatctacgtcg
-gatcccaggcaggcccccacaatgaagtggtgttgttcaactgaggtaatacccaaggtt
-cgttgtctcatggccacagaaaactaggactcggacacaccagagtgaggttaagagcag
-aagtttaataggcaaaagaaagagaaaagctctctctgttgcagagagaggggtcctggc
-gaaaatgggttgcccccaagttcattcttgttgttcgcaatgttcagcgtcttgcggttg
-tgggactgaccgtaacagacgatttttttgttggctagaagccacctgcattccttgatg
-tgtggcccctccatcttcaagtgagcaatggtgttttgaatcctccttatgcttcatgtc
-tttgacttcctcttctgtgaccaaccgggaaaaactcactgctttaaaagggctcttagg
-attagatcaggtactgtgttagttcacttttgcattgctataaagaaatacctgaggctg
-ggtgatttataaagaaaagtggtttaattggctcatggctctgcaggctgtaccagcata
-gctctagcatctgcttctggtgaggcctcgggaagcttctaatcatggtagaaggtgaag
-ggagagcaagtggtgtcacatggtgagagccagagcaagagagagaaggggagggtgcca
-gattcttttattttttatttttgttttttgagacagagtcttgctctgttgcccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctccacctctcgggttcaagtgactcc
-catgcctcagcctcctgagcagctgggactacaggtgcacgccaccatgcccagctaatt
-tttttgcatttttgttagagatggagttttgccatgttgctcaggctggtctcgaactcc
-tgaactcaggcaatctgcccaccttggcctcccaaagtgctgggaattcaggcatgagac
-atggcgcctggccccagactcttttgaacaagcagatctgtgaactaaccgggtgagaac
-tcacttattaccaaggggatggtggtaaaccattcatgaggaatccgccccggtgatcca
-atacctcccgccaggcccacctccgacactgggaatcacatttcaacgtgagatttcaga
-agacacacatccaaaccgtatcaagcatacccagagattttccgtatcttaaggccattt
-atgccaaataacataagctgatcacaagagtaaacgccaccatattcacagcgcagggta
-ttttacaggacatgtacacaggatggggaggactgggctgaaatcctggaggccatctta
-gaatctgcctatcataGTtgccggggttgagaaacaagaaagccagtgtggctggagcac
-agtgaacaagggggtgcagggaggagagacagcagagTATCACAGGTGGAGAGACACATA
-TATACCACCTAGCCTGATGGGAGGCTGAAGGCCTGAAAGTCACCTTGTGCAATTTTGGTT
-CCTGAGGAAGGGGAGGGTCATGCGAGTTCCTCCATGGATTCACTTGCACTAAAAAGCACC
-CCTGGGGTGGGACCCAGTCGATGATGGAAGTCAATGGAATGCGTGTTGAAGAGTAGCCCT
-TGGAGAACCAGTGGGCTGCTGGGCATAGGTGATAAGTTCTGCTCTGTGCATTTGGCCCAG
-TAGGCACAATGCCAAGAAGCCATGGGCTCGTCAAGGATCCATGGAGAAGTCTGAAATCTA
-AAAAAGCTGGCTGGAAAAATATTTTAAAACTTTCCAAACTTGAAAGACTTAGTGAAGTGC
-CTACCAAGTAGCATTGTGTCAATGGGTCATGAGCAACGCCCAAGTCTCCTAATAGTTACA
-TATGCGTTCTATGTGATGTGACTGCATTTTGTTTCCATTTTAACATTATTGTATTTATTT
-TTTCGTAGTATCATGTGCAATGTACAAATAAAAAGGAACAAAAGGAGATGCCCTGAAAAG
-CAAGTCTCTCTCCCACCTCTGACCCCCAGCCACGCACCCTCTCCCCACTGAGGCGTttcc
-tgtactcaaaggtattttgtgcacatgctaatgaacatgtatatatacacctgactcctc
-cccttttcacaatggtggctgttctgcctgctttttttcttttttcttggcagtacatct
-tggagatgtttcctattggctcatgtggagctgcccattcttttgtacagcagcagagca
-gtctgttatttggatgaactgtcatttattaactagACATGCCCACAACCCTGCCACCTC
-TTTTCCTAACACACTGGGCAGTCTTGGCCTCTCCCAGGCTCCCTGGGAGGGTCACTACTT
-TCACAAAGATGATGCCCACTTCTGCCcatggaatctggcttgcccagtgactacctgaca
-gggttgagtgacaccacccagaagtgcaaagAAGGCAGTAAAGAAGAAAGAAGAATTTAT
-TAGGTGCCCGAGGAAGGGCTcaatcctgccagtctaaacattgttgtacatacctcctga
-tatgtttttctagaatgtctccaggaagggattgctgggaataagtgcaaaataatgccc
-aattgttctccagagtggttgtacaactgactcccttatcaccagtgtcaaggagtcctt
-gttccacataattgatcacatttggacttgtctagctttttaagttttgccaattgagta
-gacaggaaatgagcttttaatttggatttctctaattactcagaggttgagcatcttttc
-aaatgtttgttggctattcatgttttcgcttctctatgtctgtccaaatctttagtccat
-ttttctttttgattgtttgtccttgtcttattgaattgtaggggttctttatatatttgg
-gtgctaatctttgtcagttaaattgttacggacatcttctagcttgtgacttgtctttcc
-acttttaaaaaatggtgaactttgatgaacggtatcggttgtaatgtaactaatttatta
-atatatgcctttatggtttgtcctttctgtttcttgcttcaggaatcctttccaacccaa
-agccatCCCCATGtttctatgatgcacatgtatatatattatttatttatttattttttg
-agatggagtctcgttttgtcccccaggctggagtgcagtggcgcaatctcggctcactgc
-aagctccgcctcctgggttcacgccattctcctgcctcagcctccggagtagctgggact
-acaggcgcccgctaccatgcccggctattttttttgtattttttagtagagacagggttt
-caccatgttagccaggatggtctcgatctcctgacctcatgatctgcccacctcggcctc
-ccaaagttctgggattacaggcgtgagccaccacgcctggcacatgtatatatatatttt
-aaaaagatcatatgtgcatcctgttttgtagctacttttccacttacctaacatgaagga
-acattttttccatgtttaaatagtctacaacatctttggtaaatggttgcatagttttcc
-attgtatggaatatacagtctttatttactgaatcccctgtgatgaacatttaagttgct
-ttcagctttcatatgatcaataatgctgccaagaatatcctgaagctgttggggtccaca
-ttcatgatcatttctcttagataaagtcatagaaatgaaattgcccatagaatttaaggc
-ttcggatacatttgaccaaatttgccagaGGATCCACTTTTGATTCCTTTCCAAGAAGCA
-ATATGCCATTGTGTTCAATTGCCCTTCCCAAGAGTCTGGAATCAGCAAAGTAGGGGTCCT
-GGAGATGATGTTTTGAACTGGAGCTGTTAGCAGGCATGTTCTGTTGTGTGCAGAAATAGT
-TACTGTAGCAGTTAAAGATTTTCCCTGTCCTCTTCCTTCCTACCCTCTCCTGACTCCTGA
-CAGGTAAGATGCCATTATTAGTACTATTAAGAGAAAAGAGCCAAGAAATTAGGCCTGCTT
-TGGTAATGATTCTTGGCTAATTAATTGCATTTCCAATGGCCATAAGCTCCTGCTTCAACC
-AGCACCTCTATGTGTTGAAGGCAAGAAAAGGGGTCCACTACAGCTGCTACCTCCTGGGCT
-GGGCACATAACATTCTCATAAAAATGTTTGTCCAGTCAATGAAGGATTTCGGtttttttt
-aagagacagggtctcattctgttgcccaggctggagtgcagtgtcacgatcacggctcac
-gcagtcttgacctcctgggctcaaatgatcctcccacctcagcctcaaatgatcctccca
-cctcagcctcccgagtagctcggaccacgggcacatgccaccatgcctggctgatttttg
-tattttttgtagagatggggtttcgccatgttgatgaggctggtctcgaactcctggctc
-aagcaatccacgtgcctcggctttccaaaaagattacaggcatgagctaccgtgctcCCG
-GTCAGGAATCTTTTAAAAGTCTCCTGGGTTGTCTTGGATGAGAAAAATAAAAAGAAGTCT
-CCCAGAGAACTTGAAAGCCTTAGATCAGGATTCCCTTCCTTCAGAGGGGTAAGAGGTGGG
-TGCCAAGCATTTAATTCTTAAGCATTTATTTTAGCAAATATCAACATGTATAGTAATTGA
-TACTtttatagtaattgatattaattttcatgtatggcagcacaaagtttcccattagcg
-tgaactggctttttgtttttttaaatgaggctatttaaagaaaaatattaagtaaattgg
-tggaagatagcctgcagatgggggtggggaggaggtggtgtgattccgcccaaacttcga
-gaaacactgCTTCGGTGGAAACCGCTCCGTGAGGAAGGCCTTAAGCCAGGGCTGGGTTGG
-GTCAGGAGAAAGCAGGGCCTTGGGATTCCAGGCGGAGGGCACTGGGAGGCTCTGGAGGGT
-GCAGTGAGGCTGCCACAGTCAAAGGCCGGGCGGCTGGGAGGGGCTTTCGGAGCTCTTCCT
-GGTATTTAAATCATATTTAGGGATTATAAAGTGTGATCCTTCTCATTGTGtcatttgaca
-ctcacagcaactttgtggagtttcaggcaataaggagattgccttgtcagtttacagaag
-gaaacggaggcagagagagacgcagcaatttgcccagggtctcaggtgagtaaaaggcCT
-CAGTGGTGGGTGTGGGCAGCATGGCTGGAAGAAGCGGAATTTGGTGTGGAATTTGTGGAG
-ATGTGTCAGGAGTTGCACCTCTGGGACTAGGGCACTCACAGCCCTCTCCTAATAACaata
-acaaccaccattagcatttatggagtgctcgctgcgggctggctctgtgctgagcaactc
-tggctgtctcactgcacactttacactaacgcaatgggaggggaggtgtcattatccccC
-AGAAAGTGTCAAGGGCAGGAGTTATTGATTCATGgtgtctgctcttgtagaaatttgaat
-tccagtaagggagaggggagccagaaaataaccacgggaagacatcaatgaatgagataa
-tttcacataacgataaatgccagggagaaaaaacccacagggcaatgtgatatggcctct
-ggaggtggagaaggaactgctccagatgaggccatccgtgaaggcttctctgaggaggtg
-acattagagcCAGAGCCAGTAACGTCTGGACTTGAACCTGGGCTTGCGGCATGGGAGAGT
-CCTGCATCTGACTCCAAACTTCCCCTCCTCTGTCTCCTGTGGATCACAGAATGCTTTTGC
-CAGAGACTCAATCCCTTGTTAAGAATCATGGAGTTggccgggcacggtggttcatgcctg
-taatcctagcactttgggaggctgcggcgggtggatcacttgaggtcaggagttcaaaac
-cagcctggccaacatggtgaaaccccgtctctactaaaaatacaaaaaattagcagggca
-tgatggtgcgagcctgtaatcccagctgctcaggaggctgaggcaggagaattgcttgaa
-cctgggaggtggaggttgcagtgagccgagatcccaccactgcactccagcctgggtgac
-agagctagactctgtctcaaaaaaaaaaaaaaaaaaaaaaaaTCATGGAGTCCTGGCTTA
-GGGAACGGAGTGTCCAGGAACTAGGGATGAAAGGATGGTAAGATATCCAAGCTGGAGAGA
-CCTCACCTGTGGTGCTGCCTTGTCCAACTCCAGGAGCTTCATGCACTTGCCGACAGTGGA
-GTTATGCCACGTTAGGGGTCACTCTAGATGATTCCCCTGGCCAAAGGGAAACCAAGTCCC
-AGAGACGAGATGGGTCCTGCCAAAGGCTGTAGCTTACAGCTGTGCAAGTTGTGCTGGGCT
-CCAGGGAGCCCAACTGGAGGCTAAGGGGATgccttgcatcccaccagggggctgcaccag
-gaagaaagggtacctgtttctaattcacacaaaggaatgctatgggctaggggtggccct
-gAGCCTCGTGGAGGATGGGGGCAGAGGTGAGATCCCCACATCGTTGTGCCATCCTTTTTC
-CCACCTCTCCTGCTTCCTGCTTTGTTCCTGCCAGTCCCTGGAGGGCAGGCGGGTGAGCAT
-CTTCACCATTGAGGGATGCCCCCTCCTTAATTGTGGCAAGGGGGGCCCTTTGCAGCCCAG
-TGCAGGCCTTATGGGACAGTGAAGAGGAAAAGAAGCAAGCTGGCCAGGATTCCCTGGGGT
-TTTTGTGGAGCTGACAGGCTGAGGAGTGGTTGGTTCCGGGGGCGGGGGTGGCCCAGAAGT
-GCCTTATCTCCTCTGGGCCAGTGTCAGCTCCTGTCCCCAGCCTGCAGCACAGGCTGGAGC
-TGCCAGCCTGGGGACTGCAGCAAATTTGCATTTATATTGGAGACTTCTGTTTCCAGGGCT
-TGGGGGGAGGAGGGGTGGCCACCACCATCAGCTGAGCAGAGATGCAGGAGAGGAGGGGCC
-TGCAGCCCTGTCCTGCCAGGGGCACAGGAAGTGGCCGATGGGCCCAGTCTGCCTGGCTGA
-GGGAACAGTGGCACAGAAGGTTCTCTGGGCACGCGGCCGGCCCCGACAGCCTGCCTGTCC
-ACCCTCCCAGACGCTCGCCAACATCAGCTGGGAGTTGGCTCTGCCCCCAGGCCTGGGAGA
-AAGGTCAGAGGCCGGTGCCAGCAAGGGACTAAGCAAGGCCAAAGCACTCCTGTGACAGGG
-TGCAACTGCGTGTCACCCGGTCTCAGCCCCACAAAATTGTAAATTGttttagccaagaaa
-acggaggctcagaggggcttagccattagctcaaggtgatccagctTATCATCCATGCCC
-CATGAGCCTCCCAGGAACACCCGGGATACTCACACACCCTGGATGCCATCTATACTTAGG
-GGACAAAGAGGAGTTGACACCCCTTTTCCAGCTAAGTTCTGGAGGGTCAAGGGAAGTTAT
-TGCAGGCTCGTGACACTGTTAGGGCTGGTTTTGTGACAGCTTAGGAATCATGTTTCTTTC
-TCtcttttctttcttttttttttttttttttagagacagtctcactcagctgcccaggct
-gaagtgtagtgcagtcatggctcactgcagcctcagcctcccgggcttaagagatcctcc
-cacctcagcctcctgagtagctgggaccacaggagcatgccaccatgcctggctaatttt
-ttaattttttattattagtagagactgggtctcgctctattgcccaggctggactggaac
-tcctggcctcaagggatcctctcgtcttggcctcccaaagtgctggTGTAAGTCATGGCT
-CCTGGCCTCATGTTTCGTTTTATGGTGAAATCCATAAAATGGGTTTTTTTAGGGCCAGGT
-TCAGGCCAGGTTTCCCCTTGTCTTTGGAGAATGTAGCTTCTCCCATCTGTGAGGTTCCAT
-GTGaagaaggaatggaaggaaggagagaagacaagaagggaaggaggggggacaggagga
-gggagaaatagggagtgaagTATAGAATAAATAAATAGAAGAGGGGggccgggcatggtg
-gctcatgcctgtaatcccagcacttcgggaggccaaggtgggcggttcacctgaggtcgg
-gaccagcccgaccaacatggagaaaccctgtctctactaaaagtacaaaattagccaggt
-gtggtggtgcatgcctgtaatcccagttactctggaggctgaggcaggagaatcgcttga
-actcgggaggcggaggttgctctccagcctgggcaacaagaatgaaactctgtctcaatc
-aatcaatcaatcaatcaGTAGAAGAGGGGATAgaaggaaggagtggaaggagggaaggaa
-gggagAGGGAGTAGATGAGAAGAGAAGATAGAGTCATCCTGCACCCCGCCCCCCAGGTGT
-GCTTGTTGCTGCTGGAAGTGCCCCCTCTGTGCCCTTTCCCTGGCTGTTGTATGGAATGGT
-GGTCCTCTCCCCATCCTCCTCACCCTACAGCTGAGACCTCCTGACCTCCAGTAGCAGGTG
-AGCCCTGCTCCAGGTGGGGGACCAGTGACAAGCTGGTTGGGGCTCCAGGAAGCAGAAGTT
-GGGGCCCTGTTGTGATCCCTGGGCTTTATTTCCATCCTCAGGGCTCAGCTGCCTCTGGAG
-GGGGCTCTGCCTTGCTCTTTGGGTTCTCTCCACACACTCCCTCCCCCACTCTTCCAGACG
-GAGGTCTTGGCCCCATTCCCCCAGCCTGTGGCTGTAGGCTTGCAGCTGACAAACCTCCTG
-GTCCTGGCTCTCCGTCCAGCAGAACAAGCCCTCCCTGTCTGTCACCAAACAGTCAGGACG
-GCCTGTTCCACCTGGCAGGCTGGACTATTGCCcagcttagtcttgggaagtgaggaccag
-ggctgacaacccactgcctgagttcaaatctttgctgtgcctctttctggctgtgtggcc
-ttgggcaagacccgttacctctctgagcttctggcttctcatccgtcaatgggcataatg
-ttaggatctgcctcttggattactgtatgaatgatacgagatcgttcatggaaagtgctt
-ggcttggtgcctggcacCAAGACATTTCAGCTTATATTATCCTAGCTGTATCCTTCAGTG
-TCTGTCTGGCCTAGGTGGGATGTCAGGTTCCAGGGACCTGTCCCCATGCTTCCTCCATTA
-ACCCCTTTATGACTAGTGTCACCTGATATGACTATTTCAACACACATAGGATTGAACCCT
-GGTACTATTATACCATTACTACTTCTCCTAGTTGTTGTATAAGTGCTTATGGGATCAGGC
-ACTGTTCAAGCCAttttaaaatatgactccacattcctttaaattcctctaatcaagaag
-tggggcctatgtcccctctcttgattgctcccaggaataaaatatggttagaaatgacca
-tgctggctgcgtgcggtggctcacgcctgtaatcccagcactttgggaggctgaggtggg
-cggaccacccgagggcaggagtttgagaccagcctggccaaccaacatggtgaaacccca
-tctctactaaaaatacaaaaaaattagccgggcgtggtagctgtaatcccagctactcgg
-gaggctgaggcgggagaatcacttgaacccgggaggcagaggttgcagtcagcctagatc
-gtgccactgcactctagcctgggcaacagagtaagactccttctcaaaataaataaataa
-ataaataaTAAAAAAAAtgaccatgccacttctgcttgagtctctggggacactcactct
-tggaactgttggaacccagcctgcatgctaggaggaagcccaggacccacggagaggcca
-ggtgtggatgttctggcctgcagtctccactgtgccactcctaactgccacacatgtgag
-gggaagacaattctagatgattctagtcccctgccttcaactcttttcagctgaggcccc
-agatactgtagaacagaaggaagccacccccatgtgctctgtctgaatctgtgagcataa
-gaaaatggttaacagtactacacgttggggttgttatgccacagtaaatcaccagaaTCC
-Ctgtgctgactcatttaagcttcacaacttaggaagtagctgttcttatcatctccattt
-catagatgaggaaattaagacccaaaatgctttagcaagctacctgagtccacagatctt
-ctaagaggaagagctgggattcgtgcccaTGGGTTTGAGCATTGAAGAATCAAGCAGGGC
-CCATGTCCTACAGGGCCTAGTGGGCCACATAGGTGACTGGATGTCATCTTGAGGGCCTTG
-GAGGGCTGTGGGAAGACACTGATGTGTGGAATTCACGAGGTCGGGAGAGGGCACTAAGAA
-GCTTGCTTAGGTGCAACGTGGAGGGTGGGTGAGAAGGGGCTGGAAGTGGCCCACGAGGAT
-GGACAGTGCCACCCTGCCATGGTCCACCATCCTCTCCATGTCCTGCTCCTCAAAGTTACG
-AGGGCAGCAGCAGGAGGCCTGGTCTCAGGCCCTAATGAGCTCTGCACCTATCAGAGCTTG
-GCCTAGCCGGAGATCCCAGCCAATTCCTTTGGGCTGACTTAGGCTGTGCCCTTGGACGGA
-CAGAGCTGGGCAGTCAGGGCTGGGAGCCTGACAGTGTGAACAGGAAGTTGACGGCCCAGG
-AGCATCCTCTGTTCCCTGCACATCAAGGTGGGCCACATAGCTCCAAGATCATCTGTGCCA
-ACtggatctactgggtttggagttggctgagagtggaagggagcccacaagaagagtgac
-ctaaagaggacagacactgatttctttttcttattaccaatctggaagcaggcagtcccg
-ggctggtataatggctctttgatcctcagggacccagactccttctatcttgttgttcca
-ccctcaacacttcatagtccaaggtggccgctcattctctggccatcatgtccacattcc
-agccagagggaaagaggaagaggcaaagaatgctctggtctctttaaggacccctcaccc
-ccaccgctcagaagttgtactcggtactccgtttacctcttcatggcaggaatgcagaca
-catggccacccctaactgcaagagaggctgggaagcgtggtctctgttctgccatccatt
-cacccagctaTATCGGTGGGGAGGGGGTTCTCATACTGCGGGACATGGCAAATCGCTTGG
-AATGCCAGCCACACCTGGCACCTGGAagccagagtgagtgttttgaaacttgaatcattt
-aacttcgttgcttaaaatgatcctgtagcactcactgctcccatgataaaggccaaatcc
-tcatctgacccccagggctgcctgatctcaccgtggctcacctctccagcctcatgccct
-ggttcccccagccccatcctccccaactcaccctaacATTGAAATTAAACCATGCCCACT
-CCATCCTCACCTTGGGTCTCCCTTTGTGCTCTGATATTTGGGTTCTCTTCATGCCACAGC
-TCCACCCAATGTGTGCTCTGCTTCCTTAGCTGTAAAAGGAGCTCCCCATAGTACCCACTG
-GGCACATAATAGGGTCACTTGCTTGGGTACAACGTGGCGGGTGGGTGAGAAGGGGATGGA
-AGTGGTCCACAAATAATGATTTGGGAGAACACAAATAATCAGACATAAAGAGCCACAGAG
-GCACTTACTGACTCTAAGGACTGTGGTTATAAAGCCCCTGCAATGTGCCAGGTTGGTACT
-ATGGGGAGCTCCTTTTATAGATAAGGAAACAGTGCATGCTGGGCGGAGCTGTGGTGTGAG
-GTCCTGCTGCACTGCCTTGCTGATGAGAAAAAACACTTATGGGCAGAGCGCTTTACACTG
-AGCAACTCTGTGCCTGCCTTTGTCTCAGGCAGTCCTCTAGCCATTGTGCCCCCCCCtttt
-tttttctgagatggagttttgctcttattgcccaggctggagtgcaatcgtgcaatcttg
-gctcaccgcactctccacctcccaggttcaagtgattctcctgcctcagcctcccaagta
-gctgggattacaggcatgcaccatgacacctggctaattttgggtttttattagagacgg
-agtttctccatgttggtcaggctggtctcgaactcctgacctcaggtgatccacccactt
-cggcttcccaaagtgctgggattacaggtatgagccaccacacctggccCactgtgcccc
-ttttgcacatgaggaaatgggagagggactgtgattctgtaaggtcatatagccaggtag
-tagccatgccttgactggaacccagctctgcctgccccttccctgctggcagttgcatca
-cctgccttctctgGGGAGTGAATGAGGACAAGCCAcacttgaccttccatggtcctgtag
-cagagattttaaagtccagcttttagagaggaacgtgaaagcccagagaggaaggaactt
-gcccttggtcctatactccatcaagcacaatgctgggaagggactcaggtctcctgactc
-ccagtccagagctcttgcacactttgctccttcatgcaacaaatatttattgagcatcta
-ctgtgtaccagcacagtgctagcccttgagaacacagcagcaaacacaacagacacaaaa
-ccctggccctgtggagtggacattccagggctgggtggaggagTGGGAGACCAATACGGA
-CCAAGTAAGTCAGCTGCAGCACTGTCTTTCCTCTTATTTATTTCCGGAAACAAATAATTA
-TGGAGAACTTTATTGCTataagacagacatggtcctgactctcctacagtgagaatatag
-tgttggagacaggcactcaatgagagacacataaataagcaaagttcagattgtgatcat
-agctgagaagaaaacaaggttgaagtgctagagagtaatggggatgcggtactggtagtt
-aacttcagatggggtggccaggaaaagcctctccaggaagtgactcttgagctgagaccc
-aaagcatgcaatggggcccaacagtgttccaggtggagggaacagcaagtgccagggtgc
-agaagtaggacagagcttggtgggagaaaggaacagagagaaggccaaggtggctggagc
-agggcgagagggggaggttggcaagagggagggggctggagaAAGTCCAGAGTGTCGTGG
-ATAGACACTGAATAAAGAGAAGGGATGACTAGCCCCCTACAGTTCACCCCTGGGTGGGGG
-TTGGGTAGTCGTCTTTGCATCTGATAATTTCCCAGCTAGACCCCCAAGGGGTGGGGGCCA
-AACACCTGCTGGCCTGGCACTGCCTGTCTCTGCAGAGATAAAGTTCCCTGCCCCCCGTTC
-ACCAGGACCCCGCTCTGTGGTGCCTCCACCTGCACAGTCAGGCAGGGCATTGTGTGTTCC
-GGCCGGCACACCTGGCATTCACCAGCCTGCTGGTTGCCTGATTTAGGGGCTCATCCTGCC
-TGGCTCAGGGGTCTGTTCCCTGGAGTCTACCAGCTGGGACTAGGCTGGCTGAGGAGGAAG
-ACACAGGCGCTGGTGGTGGCCACAAAGAAGGCACCCTTTACCGTTGCACGCCCATTGGAC
-CATGTTTGAAACCCCAGGCCTCCCTTTTCCAGCCATCCTTCCCTGGGTGGCAGAGTCTGG
-GCTTGGGCAGAAAGGTTCAAGGGGCAGTTTCACTgctgtgcttagaaattttctctccct
-ctctgggcctgtttcctcatctgtgcaacggaagggttgacctggataaactcATGGTGT
-Agactctagagccagactgcctgggtttgaacctttaccacgtagtgaccatatgaattt
-agctaagttactcaacctttcgttctcagtttacctacatgtaaaatggaggtacaataa
-taacacctatttcaagggctgcgggaggattaagtgaattatatatgtctggtgcttcaa
-acagtgcctgctctatggtaagtgctatatattttaactctgatcattattATTAACGTC
-TTTGGAAAACATTGCACTGGAAAGACTCAGTGGAGAAATCTGAGTTCATTTGTTTGCAAA
-CTTTTTGGTCTTTGTTTTTAACAGAGAAGCTCTGCATTGGTCAGGAGAAATTTTACTCAG
-AGCCCCAGCTGTTAGCAGGGGATTGAAGGGGGGCGCCTGCCCCACCTGCTTCCCCGTCTC
-TGTGTCTGCAGCCCCCAAGAGGCCTActggagcataacttgaaaatccctgctcagttta
-tctccttcagctcacagtcagggaaactgagactcagagaggagcagggatctgcccagt
-gagtggcccagcctagactagaacccagatctcctATTTTTCTCAATACAAGACAAGGGG
-CAGGGGCTAAGAGAGAAGCTAAGACCAGAAGCCTCTTAGGGGACTGGGTGCATTGTGTCG
-TCAAGTCATTAGCATGCAAATGATATGCAAATGAATGCAAAACAGCATGTTTTATGCTAA
-TTTGCAGAGTCGAGAGCGACGACATTTTTGGTAATAGGGCGGCAGTCCTGGTCCCTGGGC
-ATTGCCGAACACGCGTCCTTTTTTTCTTTTCTTCTTTCATTATTATGATCGGGCCCATAA
-ATCTTGGTTTGGCTGTGACTCCGCCCCTTCTTGCTTGAAAGCCTGGCTCCTATCATTCTC
-AAGGGCTCCCTTGCCAGTCCTCTGGTCCGGCCTGGGCCCAGGGACAGGCCTGAGCAGTGG
-GTCAGAGAACCAGGACTCAGGAGCCACCAGTCAGAGCTAGAGGGTGACCCCAGCTCTGGC
-CTGGAAGCCACTTCTGAAGGAGGGGACCGTGGCACTTCCTCTGAGCTCCCACAGCCACTG
-TGGCTTCTGTGCCATTGTCTGTTTGGGGCTGGCTTGCTCCTTTTCTTGTCAGGGCGCCCA
-GTACCTGGAACACAGGTTCAGGATGTGTTTGGTGTTTGAAGACTGAATCCATATATGGAG
-AGCTGGTGgtgtaccctagtgatgagcctgcagtctctgaaaacatgcagcttgagttaa
-aaccctggcaccactactttctGAGAAAATAGTAGTATGTACTCACAGCTAACCttttgt
-ttttgttttgttttgagacagggtctcattctgtggctcaggcatgagtgtagtggcatg
-attgcagctcactgcagcctcagccttctgggctcaatccatcctcccacctcagcctcc
-tgagtagctggcactacaggtgcacactgctaccatgcccagctaatttttttttttttt
-tttttttgtagagatggggtcttgccatgttgtccaggcaggtctcgaactcctgggctc
-aagccatccttctgcctcggcctaccaaagtgcagggattacaggtaagagccatcacac
-caggccCATAGCTAattgagcacctaccatgttccagggctctgctttgtaattgttgtg
-aacgctgtcactgataagagtatcctagaaggtgagtatcgttatcattgctctcatttt
-acagagagggttaaatgatttgcctgaggtcacacTCCCCAGGGTAATGGTAAAGGGGTA
-TTTATATTTACTAAGGATGAGTGCTTCATCAGGCAGGGGCCTTTAAGGCACTCAGCAAAG
-CTTCTGTCACAGGGTACCAGGGTCTCCACCTGTGCTATCAAGCCACTCTTTtgacaatgt
-taaactttacctgagccctgtgctcctgaaaaacagcgatggtccagaaatccccccaac
-tttttgttttctgaagtctccctaccttttctgttcagggaaatggcttagcaaaacgag
-ccacccttccccatatgactcagataagacgtagtcccctctttctagtgtatcctgtaa
-gactggaggatgactcccttgctggcctgtgatctttccccttttgctggaacctgctga
-caaggccaaggccaaggaccctcccacttcccattctttgtctcatggttgattagctga
-gatgagaactgtgtgtcctctctgaaactagctagacacagagatgaacatttcctcttc
-aatggactgatggagatatcccctatttgtaagacaatccccactttaaatccctcctgc
-tgtaacctgtctcctcacccctacaaaagtcaaaggcaaatccatcctgtccagacactc
-tgattttgggatctgggatgctctccctgttgcaatagcatgaataataccatcaacccc
-aattcttccgtgtattttgtctttGACCCTTTCCACCGTGCTGTTTTCCACCTAAggctc
-tgagctaggtaagagccctgtgaccttggagtacttctcgggcttctctgtaccttaggt
-ttaaaacggatgcgcacaggcgttatgtcctcaggttgtgagataaaaggagacgacgcc
-agggaaacgctcggtcgcttggcactgtgcccagcagcgtgagtgctccagaaatgtcaa
-ccattgtGAGTCCAGGAGAGGAGAGTGGCGCTCAGAGAGGGAACGGGACCTGCCGGGAGA
-CTCACAGCGGGAGGAAGGGGGAGTAGGGCGCACGTCTGGTGACCTCCGCCCCCAGCTGTG
-GGAGTGTGCCCTGTGACCCCCTCATCCTGCCTTTGGATCACGAGCTGGGGTCGGGGGAGG
-GGATGGTGGGGGGGACACTGCTCGGTCCTCCACTCCGTGTGCCCTGTGACCCCCTCATCC
-TGCCTTTGGATCACGAGCTGGGGTCGGGGGAGGGGATGGTGGGGGGGACACTGCTCGGTC
-CTCCGCTCCCCTCCGCCCGCCTTTGATTGTGGTGAGCAGCGAGTCGCGGAGCAAATTAAC
-TTTTCGCACACTTCATTATGCGCCGTCCCGCGTcccccggggccgaggcccgcgcccccg
-ccccgcgccgACAACTTGATTGGGCAATTAATCTTCGCGCCCCCCACACCCCCTCCCGGC
-CCCGGGCCTTTGTGCGCCCGAGCGTGGGCCGTgggcgccccccgggccgcccggTCTGCT
-GGCGCAGATAAGGCGCCCCTCGCCGCGCGGCCCCGCCTTTGTCAGGGCGCCCGCAGGCCC
-GGCCGCCGCGCTGCCGTCTCGCACCCCATCCGCGCGCCCCCGCCCCTTGGCTCGGTCCAT
-CTGTTTGAGCTTCACAATCCTCCAGCGGCCGGGGGCTGGGGGCGGGGTCTCGCTCTTGGG
-CAGGCAGCCAGCACCCCCTCCCCCCGGCCCCCCCACCCAGCCCCCAGACACGCGCGCGCA
-CGCCCACTCGCACGCGGGGCCGCCCTGTCAAGCAGTGCGGTATTAATTAAGAAGGTGGGG
-GGGAAGCACAGCAGCAGTTTGAAGAATTGTGGGGCGGAGGGTTCCCAGCGGTGTCCAGAA
-AAGAGGGGGACCCTGCCACCCATCTCGTACCGCAGGTGCTTAACGCCTGGTTATTGGCTT
-GGGGATCTACAGGCTCCCATGGCTGGGGGTGGGGGTTAGGGGAGGTGGGAGGTGGGAGGG
-AGAGGCCTGGGAATTTGCCTGACAGTGTCTCTTTGTGCATTTTTCTGGGGTTTTGCCAGC
-AGTTGACCCAGCCTCAGAAAGGTAGCCTGTGATTCAGGTAGTGTTGAAAACCAGAGGCCC
-AAAGGCAGGATAAATCTGGGCCTATTTTAGAGGCCAATAGCGTGGTGGTTCAGAAAGGGG
-TTCCAACAGTTCTCCCTACTCGCCGTTGAGGATTTGCGTCAGGTAACCACCCTGCGCCCG
-GGGCGGTGGAGGTGATGGGCTGAGACCGTGTTGGCGCAGTGCTGGGTACACGGTGAGTGC
-TCACAAGTGCTGGTTCTTGCTGTTTTCTGTGATTTTCCTTGGAGGGGCACAGGGAAAACC
-AAAAATGGCTGGTGCTGGAAAGAGGCCCTTGAGTTTCATCTCACAGCTGGCGGTAGGGTG
-AAGCTTGGCAAAAAACCTGTGGTCTGTGCTGAGCTTGGGGCTGGgtgtgtgtgtgtgtgt
-gtgtgtgtCTATGGTCTTTGAGAAGTGTCTTCATCAGCATATGACTTGTGTGAGTTTTTG
-GGTAGAGAAGGCACAGCCTTCACTAGTTTCTACAAGAAGGGTGTGATCCAGTGTGCGAAG
-AATCCCTGTGTGCAGGGCTGGGAAATCAGCTTCATCTCTTCCATCCAAGAACAGCATGGC
-TGGCACGCTTATTGTGTGCGGAGTCCACGGTAGCGTCCCTAGGTGCTAGGGACAACCGTG
-AGCAGAGCAGAGTTCTTGGCTGCCTTCACAGACTCGCAGTCTCCTTCGGAAGATGAATGA
-GAAATAAAATAAACATGTAAGACATGAGGTAGGTCACTAGGTGACATGAGCTTTAGATAA
-AAACAAAGCAGGGCACCTGATTAGGAGGGTGGGCCCTACTTGCCAGACCCCTACCCTCAT
-CCCCAATACAGTGTGTATCATTGCCTGGGCAGGAAAGGGCCACACTCCTGGGTCTAGGGA
-ACTAGGTCCCTAAGTAGCCTCATGTCCCCACCCACTAGGACCCAGCCTCCAGCCAGTTCT
-GTTGCATGGGGCAGGGTCCCTGGGAAGATGGGCAGGCCTCAGACTGCTGCAACCTCTGCC
-CCTAGCCCTGAGGTGGTGGCAGTAGTGTTTCCCTCTGATAATGACATACTCCAGTCTTGC
-ATGACCACGATGCCTCATGAGCCCACAGTCCAGAAGGGGCCTGGTGAGCAGGAGCTGAAT
-TAAAATGGAAAATACGGCCTCCCTTCCCCCCTTCCTGTTCCTCCCCACTTACTCCCTTCA
-TTCCTGCTGCTCCTGAAGCCATGGGTGAATAGTTTCTCAGTCTCTTTGCCTTGCTGAGCT
-GGGTTAGTTGGGTTAGCAGGATGGACATCTCCTTATGGATACTAGAGTTAGGAGACACCC
-AGAACCAGCAGGTGGGATTTTAGAAAGTGCTGTTTGGCTCTGACCAACCCCTACTCCCAC
-CCCATGCATAGCAGGGTTAGTTTCCTCATCAACTCTGGTCTCTGATTCTGATGTTCTGCC
-CCTAAGCATCCTACATTCTAACATTGTATTCTTCTGACTTTTTAGAATTTTCCCATCCTA
-TGCATCTTACACGAATATGGTGAAGTTCTGATTTCCGCCCTTATGTTCTAGATTGAGTCT
-TCAGTATTAATTTTGTTGGGGTCTACCCATTCAAATAACAATAGAGAAAGACTATGTGCA
-GAGTCACATAATACTAGTCATGATAGTAGCAATTAACATCCTTTTGACCTTGGTTTTATT
-TAACAGTTTTTTTTTTTGAGAATTTTCTAAGCGCCAGACACCATTCTAGACATTATACaa
-ataaatagataaaaatgaataaataaataaatGTTATTTTAGAAGGTGCAATTGAAATTG
-AGAGTCAAGGCAGGACTCACTAAGAAAGTGACAATattttctttctgctttcagttatgg
-agatttgaaatctcagttgataaggtggatttatttctccttgcaggtcattcacttttt
-ccttcatgtattttgaatctctgctattgggggcataaatatttagaattgttatatgct
-catgattaactgaccttttttttttttttttagatggagagtcttgctctgtcgcccagg
-ctggagtgcagtggcgcaatctcgactcactgcaacctccgcctcctgggctcaagagat
-tctctggcctcagcctcctgagtagctgggattacgggtgtgcaccaccacgcccagtta
-atatttgtatttttagtagagatggggtttcaccatgttggtcaggctggtctcaaactc
-ctgaccttgtgatccacctgccttggcttcccaaagtgctgggattacaggcgtgagcca
-ccgcacccagccttgacctttttaatcattataaaatgaccttatctttcctggtaatat
-tctttgctctgaaacaaacattgtctgatatgaaactagctactcctccagtgttatttt
-gattactgttactttccatctttgtacttttaacttgtgtgtttacacttaaggtgtgcc
-gttttgaaggttgggtcttattttttttttttaaaaaaaacaatatttgggtcttatttt
-tttaaaaaaatccaatctaacaatctctgctttttaattgagggtatttagaccatttac
-atttgatgtgatcattgacgtggttagatttaagtctatcatcttgctatttgttttatt
-tttgtcccatctgttctttgcttcctttttcttctttttctgtcttcttttgtataagct
-cagttttttttactatttcattttaactcctccttttttattatatcgttttaccttctc
-tgttggtttattaactgtaatgttttgtttgttatcttagtagttacattaggccttata
-agcctgggtacggtggctcacacctgtaatcccagcactttgggaggctgaggtgggcgg
-atcacctgaggtcaggagtttgagaccagcttgccaatatagtgaacccctgtctctact
-aaaaatacaaaaattagccaggcatggtggtgcatgcttacagtcccagctactcgggag
-gctgaggcaggagaattgcttgaacctgggaggcagaggttgcagtgagctgagatagca
-ctactacactccagcctgggtgacagagcaagactcaaaaagaaaatcatgtaatagtat
-actttcatttccttcctggccttcttgctgttgttgtcatacatacatatgtgtgacaga
-ctccacaaaatgttattatttttgtttaaatgctaagttatctttttttaaattaaataa
-tcagaaaagattttatatatttaactcatgtagttaacacttctggtgacctccattccc
-ttatgtagatccagatttccatctggtatcattttccttctgcctgaaggatttccttta
-tcacttcttgcagtgcagatctgttggtgacaaatgcattcagcttttgtatgtctgaaa
-tcatctttatttcatcttcatttttaaaagatattttaactgggtatagaattctagatc
-ggcaggttttttctttcattagcttaaaagatgttgttgcttcactattttcttccttaa
-attgtgtccaacaagaaatctgccattatccttatctttgtttctctatactttacaagg
-cttttctttctctgactgtttttaatatttatctgtttgtcactggttttgagcaattcg
-ttcatggtgggtaatttccttcctgtttcttgtgcttgaggttcgttaagcttcttggat
-ctgtgagtttatagtttatatcagatatgaaatattctcagccattaattttctatttcc
-tctcctttggggacttcaaagacacatatattaggcttcttgaagttgttccatagctcc
-taatactcttggttttttggattctttctttttctctgagtcgtcgattttgggtagttt
-ctattgctacatcttaaaattctctaatcttttcttctgtcacatcagcatatttttcat
-ttcagacatgtagttatcatttctagaagttcagtttgggtcattttatatcttccaagt
-ctctccttaacctttgaacatgcagaccatgaaatacaatttgaatacttattttaatgc
-tcttatctcctacttctgtatcagttctgggtcagtttcaattgattgattattattctt
-gtatgggccatgttttcttgcttatttacgtgcatggtaaactttggatgccaggcattg
-tgaacattacccttgttgggtgctgtacacttttatatttctataaatctccttcagttt
-tgctctaagatgcaattaagttacttggaaacagttttatccttcctagtcttgctttta
-taatttgttgagtgggtccagagcagtgctatctgttgagggctaattatataccactgt
-tgagaaaagaccttcctgagcactctacccagtaccccagaaattatgagggttttttct
-gtttattaatatttctggttttgtgtgagtgctgagcactgttctctaatcttatcagat
-gattttcacccctacttcagtgtagttttatcatacaaaagcaccaaccagtactcagtc
-taatactcaagggggactttcttcatatctctggaatagtctctctgtgcaactctttcc
-tcccaatactgtgtcctgcaaactctgccctctttgtccttcctggactctcaactctat
-ttccttaactcaggaagcctcctgggtgctgcctgggttcctcctccctgcactaggttc
-tgaaaactctctccaagcggcaaactgaggccatgatagggttcatcttatttcccactt
-ctcagggatcatgatcctttattgcctgttgcctagagtcttaaaaattacagtttcatg
-tattttgcctggtttggtttgtttgtttgattgtttcaagcaggagagtaaattcagttt
-ctgatactccatcttgggtggaagcagaTAtgagaaggtgacatttgaacacaaacttga
-aggagttgatggagtgaaccaagaggatatgggagtggggagaggaaggagattctaggc
-agtgtgaacagcaagtacaatggtctcctgcgtgtatagctgagagtgcgggtagtgtgt
-ttgaggaaggaagggagcacgtatggctggagcagagagttatgtggggaaagtggggag
-agggagggatgaggtgtcagcttgtgtaggaccttgcaggccatggagaggattttggct
-tttacaccaaatgaaatgggagccatgggaggattttgagcagagggaggacatctttta
-caggatctctgaatcgattggattaactgaaagggataagagggcaagagagaaagccag
-agacttgctgggaaccagtgcactaagccaggtgaatgctagtgactcagacACATGAAA
-GGACACACTACCAagggggtgaataactaggagcggggatgaaggaggcttctggggtgc
-tgtcggtgtcttgtatcttgatctgagggaggttacatcatctgctcactgtgtgaagat
-tcattgagctggatgtacacgtctaaattgtgTTCACAATTGAATTGAATACATGAATAT
-ATTACTATATAAATATACTATATACATATAAAACTTAGAAAACAAAGTAgggagatgaag
-gtggcttggactagactgttatcagtggaggtgggaagaactgtatgcattctagatctc
-ttttatatgtagatccaataagatttgcaaacagatctaatgttagatgtgaagacagag
-aatagtccaggataatgtcaagttctctggctgagctacagcaaagactgaggacctgct
-gtgtaccagagcttgggctaagctctattaacttctttaatcttcatgacaattctagga
-agtaagtCTGGCAAGAGCTGCTTctgaggtttttgtggggctactgggagcctttccacc
-agaagtgtagtttgtgtgatggattccagaggtagtggtggccacctttgcctccatgag
-gttacaggctgcctgagagtgaggcctacaagaaagaaatcaaagccatgatagagagag
-agacaggatcctcacagtaacatgtcagcacctggattcagccataacagaagccagtgc
-cctgggcttctcagttatataaattaataattacttttttttttatttctttcacttcta
-actgaagagtccagactgatacaACTTCTTCATATGTGTCCCCTGTCTGCACCATCCAAT
-GGACCATCAACAGCAGCTACATCCTCTCCTTACCGTTGCTTGCTTGCtttttttgagaca
-aggtctctttctgttgatcagactggagtgcagtggcataatcacagctcactgcagcct
-tgacctcttgggctcaagcagtccttctgcctcagcctcctaagtagctgggtctatagg
-tgcttgccatcatgcccagctatttttttttttttcatagagacagggtctcactatgct
-gtctaggctggtcttgaactcctggactcaagaaatcttcctgccttggcctcccaaagt
-agtgggattacaggcgtgagccaccgtgtttggccGTCCTTACCATTTCTAATGCCTGCT
-CTGCACTTTCTCTCTCTGGACCTTTGCTCCTACAGGTCCTCCTTTCCAGAATGCCTTTCC
-TCCCTTACCTTCTGCCCTCACATCAAAACCAGCCCCCTACTCAAAGCCATCCTAACTCCA
-CCAGCTGAAGGATGGAGCTGGCAGAGTGCTTAGATATCAATCCATTTTACAGATGGGAAT
-ACCAAGGTCACTGTGAGACAGGGCAGATTTGTGGTCAGGACTCCCGCGTTCTGACTCTCT
-GAGACTCTTTCCATGATCCTCCAGGACAGCCTTTTCTGTGCCCTCCCTTGCGTGGGGTTG
-AACAGTACTTTTCACAACAATTTACActctcccataccccaacccttgcacgtgctgttt
-cctcagtctgggatgccctattccattctgtccttccggaaagggtgccacttgaacttg
-gagattcaactcaaggatcagacttccagaagccttctctttttcccagggtggctctgt
-gtcctgcctggtactcccACAGCTGCCTCTGGTACCTCCATGAACCCATTTATCCATTTG
-TTTTTTAGGTGTCTGTTTCTTGTTTGCCTCACCTGTTAGGTAGGGGAACTGAGGCAGACC
-TCCTGGCCAAAGAAGGCTCCCAACTGATGTTTGTGAATCAACATAGAGTGAGAAAGAGCC
-CCGTGGAGTGGGGCGGGGGgtggagagccagcgctgggcgtggaggcaggacgcctgggc
-tccagtccagccaccaccactctagtgtgtggcctcatgcaagtcatgtcctctccttga
-gcctcaggcttttttggcagtaaaaagggcagaacatcatagtagttaatacctcaggca
-gcctggatttgaatcttggctgtgtgactttaggcagtttactccagctctctgtgcctg
-tttcctcatttgcaaaatgggggcaataaacatatctgcatcatagggtatttgtgagca
-ttaaatgagttaatgtttacaaagctttcaaaccatgcttgcttggcacatcataTAAGC
-ATCCCAGAGTGAGAACCATTAAACAAAAGAAACCCTTCCCTTCCTGAGAGGAGAGGAGAG
-CTTGACAAACTCTAAAGTGGCGTGTGAGTGAACTATGGTCACTctcagggggtaagctgc
-ctggaaaaggctgactctgacactgactagtgtgtgtctttggagaaatcatgtcacctc
-tctgggactcagcttccccatctatcaaatggaggagttggtctagcgcagttggagtta
-aagtgctttgtctctttgagttttatgtccatgtcagtagagtgggctgagagctgcatg
-tctgtcatgcgctcctggtgagaatgaaatacgatgatgggccggacgcggtggctcatg
-cctgtaatcccagcactttgggaggctgaggcgggtggatcacttgaggtcaggagttcg
-tgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgg
-gtgtggtggcgggcgcctgtaatcccagctacttgggaggctgaggcaggagaatcgctt
-gaacccgggaggtggaggttgcagtggaaccaggattgagccactgcactccagcctggg
-caaaaaagtgagactctgtctcaaaacaaataaataaaataaaaaatataataataaata
-aataaatacaatgatgtctggagcacttgccagtcatgcctgccacatagcaagtaatcT
-GTCATAACTGTCACTGTTATTCTGGCCCTGACATTCCAGGGTTCCTTGAGGTGGGGCAGG
-ATGAGGGATGGGCTGGGCATCATGAAGGAAGGTGCTGATGTATCACCTACTGACAGTTTA
-GAAAAGGGAAGGCAGCCATGTGACCCACAGGCAGTGTCCCCCTGCCTGAGCCTTATTTGC
-AGGGCTGTGGCATCGGTGAGCAGGACAGGGACCACCACGCCCACTAGAGAAAGAAGCACG
-TGCTGCTTTTGTGAGTTCACAAAGGTCTTGGTTTTCCAGGGCCAACAGTGTCCCCGCCAC
-ACGTGACCACCTCAGAACCATCACCTGCCACCTGCCAGGGCCTGGGAGTTGGAATCTGAG
-Gtggaaggagagagcaggggccaactcctggctgctcccctctcttggtatgtgaccctg
-ggcaagcctctgcacctctgtcccctttgtcctctcttgtcacataatgaggttttgagt
-gtcttagatagggaggatgtcTCCCTATCTAAGGATAGGATAGGATagaaatggccaggc
-cctggtgcctctgctagctcagtctggctgggacgacctgggaagaacatggcctcagtt
-ccaaagccaaggcggctcctgggggagctgcagctggaggctgtcagcttgctgccctcc
-ttgctgctgaaggacaagctttttcttgaagataggatggataggatgtctcctatccat
-caGGAGATGCGATTATTGGCCTAGACTGGGCAGGGTCTCCACCTGGGCGACGGGTTGGGA
-GGCGGAAGTGAAGCTGGTGGCATGAACCATTCTCAGTGACCTTTCACCAGGGTGAGTGGG
-AAGTAGTTGGGAGCATCGAGGCCTCACTCTCCATCCTGAAGATGGAGCACAGACTGGCTG
-GCTGAGGCCGGGAGCTCATCACGGGATGGAGACAGATTGGCAGACAAAGAGGAGGCGGGC
-GGTTGGGGCTGGGTGCCCCTGGGGAGGAAGGCGGGGAGAGAGCGTAGGAGCAGGAGGAAA
-GAAGGCTGGGCTTATGTGCAGCCTCACAGACTGGGCCTGCAGAGTCTCCAGCTGGAGGTT
-GGGACTGGACCTTCCTCCTGAATGGGCAGGGAGGGAGGCTTGTTGGCCTAGCCCTCGGGG
-TTCTTGAAATAAATGAGGGAGGGCCTTGGGGGGTGGTAAATTGCTGAGGCTGTGATAAAC
-ATTCTCCCCTTCCCACAAAacacacacaggcacgtgtgcgtgcatacacatacacacaca
-cacCCTGGCCACACTGCTGTGCATATCTTACTGATTGTTGTCCTCTGTGAcagcagttct
-ccaagttgagtgcattggaaggatcagttaaaatgcagatttccaggcatttccatctct
-aaatgtagggtgtggcctgagaatgtgtatgtcttacaggatcctggttgatgctgatgc
-tgggggttctgggacacactttgagaaccactgCTCCATTGAGCAGCCtttcagtttggg
-tgcccctcggtgctggtgctgggagagagttaggagggcaagggggttagtgagggctgc
-tacctgtgaaacacaaagcaggagggaatggaattggccaggagagcctcagaccacagc
-ccgggcctgcagagtcaccctctaggggtctctggagtaaagattatccacagagaagcc
-ccacatggggcagaaatggccaggccctggtgcctctgctagctcagtctggctgggacg
-acctgggaagaacatggcctcagttccaaagccaaggcggctcctggaggagctgcagct
-ggaggctgtcaccttgctgccctccttgctgctgaaggacaagctttttcttgaagagag
-aCTGTGTCCCATCCACAACTGCCCCAGgcatctaccacatgccaggctctgtgcagagtg
-tttacctggatgaatgcagtttcagatcagagcaacctggccaagcaaatataatcgtcc
-ccatctaatagatggggaaaatgagggattaagtcatctgcccaGTGGTGGAGTCAAGAT
-TTATCCCCTCTTGTGCCTTAGcactcatccctgtcagcttccctgggtggtgaagaacat
-tagctccttttacacctgaggaatctgaggtgtggagaggtcagtgacttgcggtagagg
-tgggtagaggatccgggattccaaccctgctcatgccCCTCTTTTTAAATTTCAAGATGC
-TGTCCCTTGAGTACTTCTAGGGGGATGTAATGGCAGAAACTTGGGGCTGGAAGAAGCctc
-cctggcatttgacaggtgggtacactgaggcccagggaggcaaTCAGCCGTGCCTCAGTG
-CCTCTCTCTGCCCTGAAGGGGCTCCCTGTTGTGTGTGGGGTATAACCCCCCCGTAATTCA
-TGCATTCAGCACACACTGGTGGGCACCCATTGTGGGTCAGTCCCCCAAGCCAGAGTACTG
-TTGGTGAGTGGGAAGGCAGACGTGGGTGCAGAGGGTCTGTGCAGTGATTGGGGATGCACT
-GGGGATTGGAGGGGGCAGTTGACATGTGTGGGGTGCATGCAGGGAGGCTTCCTGGAGGAG
-ATAGTCTGAGAGAGGAGGAGGTGAGAAGGGTACTCAAGGATGAGAAAAGAACAGAAACAA
-AGGCTTGGAGGTGGGGGAAGTGATATTGCCTTTAGGAAATTGATAGAAAATCTGTAGCTG
-AGATAGTGTGGGGAAGGTATGGCCAGAAATGAGGTGGAAAGTGGAAGCTTGGCCTGGGGA
-AGTGGTGGAAAGCTCTGGACTTGAACCATGACCCTGGTTCTGTTCAAGGCAGGGCTACTC
-TCTGCAGGGCTCTGAATTCTCCAGATTTCCCTCTTACCTTTCCGAACTTCCTGCGGTGGC
-CAACCCCTAAAATAGCCCCCAGTAATCTTTGAGTCCTAAtaaccagtaggattttgtgga
-aatgacagagtgtgacttccaaggctggatcatagagtgtgttgcagcttctgccttggt
-ctctgggtttgatccccccggagaagccagctgccgggctgtgaagtcactcaagcagcc
-tgcagaaaggccacatggagagaaactgaggtcctgcctgcagccagcatggacttgcta
-gtcatatgactgagccaccttggaagtggatcctccagccccaggcaagccttcagatga
-cagcagcccagaatcacctagccaggcctgttctatattcctgacccagagaaactgaga
-cacactaaatgatcattgtgttgtacgtcactaagttttggggtcatttgccgtgcagca
-tcagataaTGAGGGCTTCTCTGTGCCCTTTCTTGGCTTCTTCTGTTGCTTCAGCTGCCAT
-CTGATGAAAGTCTGATGAAAACCAAAGGCCCTCCTCCAGAAAAGTTCAGGTACACCCAGA
-AAGAAATGGGGGTGCAATTTCAAAGGGATCACAGGCCATCTAAAACTAAACCTCAGACCT
-TCAGATCCCGGCCCCCAGTGGACATGGAACCTGAGTGAGGAATGAACAGTGTCTCAGTTG
-CTGAGCTGTGGGACATGGTGGCTGCTGCGGGGTCTTCAGCTTGGTCATGGCAGGGTGCCC
-ATGGCCTACATTCCTTTCTCCTCCTCTTCTCTGTGTCCTTGGCAGGCTGCCCCTGCAGAG
-GAGGACCGTGGGTGCCCAGACTGAGTAGGTAAGTTTAGCTCTAAGAGAACAGGTTGAGAG
-AGCCCATCGGTTGTGTACAGGCAACTTCTCAGCCAAGCTCTGCCAGTTGCTGGTGTTCAT
-ACTTGGCTGATGTCTCCACTTCAATACAGAGCCTGCAGGGGATGCAGGCTGTGAATGCAG
-TCCCTGGAACCAGACTGTGGGCTCagccatgagacctgggggatgtacttcaccttcctg
-acttgggcttttcaacttggaattggaggccagaagtccaccctgaagcgtggctgtggg
-gTGGAAACAGGCCCTCCAGCAGGGCAACAGCAGGGGCTCCTTGCCTGGCAGCCCCTCCGG
-TTCTTCAGCCCTTAGCCTCCCCTCTCTGGCTGTGGTCAGTGGCTGGCTCACCAGCCCCTC
-TTATGGCAGTCACTGCTCCAGAGTGCCAGGATTTCCCAGTATGGTGGCCAGGGCTGTCCG
-GAGCCCAGCACGCAGCTCAGGAAGCAGCTCAATGCAGGTGGGACGTCAGTGGGAGCAGAG
-GGCAGCCTCCCTCCCCAGACCCCTGAGGATGAGTCTGTCTCCCTCCTTGGTGCTAActtc
-tctctccttcttacatctccacttctttcttcttcctttatcttctctacctccttctct
-cttctaccttttcccttcttttccgctttttccttttttcatcttcattcttctcttttc
-tttcgtctttctcttcccctttcctcctctctttgtctagtccttcttccccctcacctc
-tccttttcctcctcttcCGTTTcataatgattaagagtatggcttctgatgtcagcctcc
-ctgggttcgaatccctgctgtgccacacactggctgcgtggcgttgggcaagccacttaa
-tttctctgtgctttggcttcctgagctgtacagtgggatgctaacagtgtctctcttgaa
-gggtGCCATGGGTGCCAGGTGAGCGTTAGCTGCTTATCATTCGTGTTCCTTCCTCCCCTC
-CTCTTCTTCTCCTCCTGGTCTTAGAAGTCTGTCTCCCTCCCTCTCTCCAAGCCCTGTGAC
-TCGCCTCTTACGTCTCTCTGCCCAGCATCTTGGGCCTGTCTCTGGCCCCTGCCCTGCTGC
-TTCATCCTCTCACTGCACGCACAGGAAGGAGAGCCCAGGCCTGGGGCCAGGTTGCCCCAT
-GAACAGTTGCTGAGCCAGGTGGCTGGAGCTCTTCCCTGGGGCCCCGCCCACGATGAGTTC
-AGGAGCTGCCTTTGTGCACCCGTGACAGCCTCTCCTGGCGCCTCATTTGGCAGAGCTGTG
-CATCTGGCCCAGTTACTGTGGTAGCCTTGGAAGGCAGAGTGCTCTGGGGCTTCCTTGTCA
-TCTACCTGCGTGACCCTGCATGAAGGGTATGCCCAGCCCTCAGCTGGACTGCCAGCCCCA
-CAGGCACCCTTGGTGCCCACCACACAGCAGGAGCTCATCCACAGATGGGCACAAATAGTG
-ATACCAGACAGTGCCTCtgagtccttgctgtgctaggcactgttctaagtgcaaattccg
-ttcatcttcacagcaacccttgcagtgggggctgttaaccccattttagagatgagcaaa
-ctgaaacacagaaaagcataggaaattgcccaaagttgaatgaatgaatgaatgaatACA
-ATGACAACTTAGGAAGGAAGGCATTTTACTGAAGagtgacaggcccacggtcacacagat
-agtaagtggaaaaaaatcagggctggaactcatgactccaaCATCACCTCCCACCTGTCC
-ATAAGCCCAGTGACAGCAAGGCTGGCACTCCCTCACACTTGGGGTTGAGGCCAGTAagag
-ctgcatttgtggaacactggccaaagcaaaccctctgtgctgagggcacttcagccagtg
-tctcaagcctgtctgcacttcttcttttttttttttttgagacagactctcactctgttg
-cccaggctggagtgcagtggcgcaatctcggctcactgaaacctctgcctccccggttca
-agccattctcctgcctcagcctcctgagtagctgggattacaggcacgtgccaccatgcc
-cggctaatttttgtatttttagtagagatggcattttgccatgttggccaggctggtctc
-aaactcctgacctcaggtgatctgcctgccttggcctcccaaagtgctgggattacaggc
-gtgagacaccatgcccagtcaactgaagttctttgagagtactgttcccattttccagat
-gaggagcctgaggcccagcgaaggcgagcaacatggccaaggtcacacagccagtaggtg
-TGATTCCAAAGTCCCACTTTCTGTCTTCCATCAGGTAGTACTATCTGCCTTCCACTATGG
-AGGGAATGTCCCATTGGGAGACGCCTAGGATGGGGGCTAAAGAAAGACAGGCAGGCCCGA
-CACCAGCCTCTCTCTCTTCTGTCTGCTGTCAACACTATATCTTGGTGCCATTCTGCCCAC
-TATTTGTAGAGAGGCCTGGGTACCAGCCTCTTCACTTTGTCCTGGAGGCCAGGCCAGGCA
-AGGATCACTGTACCCACTTttctttccttccttccttccctccctccctctctttctgcc
-ttTTTATTAAGGTATAAACCACACAAAATAAAGTACATAGagccaggtgtggtggctcac
-gcctgtaatcccagcactttgggaggccgaggGACCCCCCAGCCAAAGCCTGGAGCTCAG
-AACACAAATGCTCCCCTTGTTGAGAGTGGGGAAAAAAATCTCTTTTCAGGTGCCAGCCTT
-AAAAAGAAAGAACAAAAAAGGTAACTCACAGATGACCGTGATATGTGACGTGCATCTGAG
-CCCTTCACACAACCACAGAACTAACTGTCTGCAGCTGCCACAACAGCTGACCCCTCTGCC
-AGGCAGAGTTTGCTATCAACCAGTAACAGCTCCCAGAGGTTTTGTTATCCCTCTGTAGAA
-ATGGAGGCTTGAggccaggtgcagtggctcatgcctgtaatcccagtactttgggaggct
-gaggcaggcggataacctgaggtcgggagttcgagatcagcctgaccactatggagaaac
-cctgtttctactaaaaacaaaaaattagccaggcgtggtggcgcatgcctgtaatcccag
-ctaccagggaggctgaggcaggagaatcacttgaacctgggaggcggaggttgtggtgag
-ccgagatcgtgccattgcactccagcctgggcaacaagagcgaaagtccatctcaaaaaa
-aaaaaaaaaaaaaaaaaaagaaaTGAAGTCTTGATTGACTGAAGTAGGAGGAGCCAGCGC
-ACAGGCTTTGGAGGCAGAAGAGCTGGGACCAGCTCTGGAGGTTTGGGAACATGACTCCAC
-CTCCCCGAGCCTCGTACTGCTGACCAGATTGCTtttgcaagcattgtactacatcttcac
-acaatgctgggaggcagctgttaccaaccccatcttacagccggagaccctgaggctcag
-ggaggtaagggatgtgtgcagagacatgcaCAAAGTGGAAAAATGTGAAAACAGACCTCA
-TCGTGCAGTGTTATTGTGCAATTTGAATTGAATGAGGGATAAGAATGTGAATGGAtgcag
-tccacagtaggtgcttaagtcttgcatggggtctaatagccggtgagtggcaaaaggaga
-acttgtacccagatctgcctcaccccagagcccacctctgagcctctTCATCCATGGGAA
-GCCATCAtcagcatggtgcctggcaccgagtgagcctttgagaaagggtaactGGgtcaa
-aaattattttcagaaagttgaaaacatggatcttatacaaatgtatagtgagcacatgtc
-aaagtgttatttaactcattaaggatggaaccggtaggatggcaaagctgactcaaagga
-ggataaaatggcaaagttagctacgacataggttaatgtcttacagggcaccaaaaccat
-aagctttagcgttatttcttctacaggtcagaaatcatttgcaactcgtgcactttttac
-aagttaccaggtaactttgcttaggatcaggtgacccaggctcatcggacactgccttcg
-cttgatattgaaagggcacacagacaccctttttgtcttatttccaagttttggatattt
-tttctttaCAGTTATTATCATTCCACTTCTCTCTGACGAAAGGCTGTTCACAGGCCTCAC
-AGGTTCCCAGGAGCCCAGGGACACGCAGACCCCACCCCACCCATTCACACAAGGACTCAA
-GGACAGAGCCTCTACCCACAGATGAACTTGGGTGGTGCACAGGCACACGAGCTTGATGGC
-AGGGCACGCCCAGGCTGAAGGGGCCGGGTGGGAGCTAAAACGTGTGGTCTATGGTAGCCC
-AGCCTCTTTCCTCAGCAACCACGCCATGAAAAGATCCCTACATTATTTGTCAGGTAAAAT
-AAAGCGACCCGTAGCTAGTGGCGCGAGATTCTATCCAGCTTAATACGTGTGTATGTGCAG
-ACACATTTATGAGTGTGCATGCAGAGAAAACTCTCTGGGGAAATACCCCCTGAACTGACA
-GCCATGGGGAGTGAGGGTGAAGCGGAAACAATCTTGTAAAAGAAATTCAAAAACCGAAGC
-CCACTGCATTGTTTAAATTGGTTACGTCCAACTTGTTTTCCTGTGTTATCTGTCGCCTGT
-TAATACACACACACAAACACACACATAATAGAATGGGATAGAatatctatatatatctaa
-tatatataatatctaatatatataatatctaatatatataatatctaatatatataatat
-ctaatatatataatatatatatagagagagagagagagcgagagagagagagagagggag
-agacggagtttcgctcttgttgcccagactggagtgcaatggcgcgatctcggctcaccg
-caacctccgcctcccggcttcaagcgattctcctgcctcagcctcccgagtagctgggat
-tacaggcgtgcgccaccacgcctggctaaattttttttttttttttttaatttttagtag
-agacggggtttctccgtgttggccaggctggtctcgatctcccgacctcaggtgatccgc
-ccgcctcgacctcccaaagtgctgggattacaggcgggagccaccgcgcccggcGGGATA
-TTATATTTCCATAAGGCCCTCCGGGGGCCTGGGAACGGACTGGTGCTTGCGTGCGGGGCT
-TTTCCACTGGTTCCCTTCCGTACTCGGGCTTCCCCCGCTGTTGTTACTCCCTCAACGGGA
-ACACAACTCCACCGCCGCCTCCGGGACACACCCCCGCCGCGTGGGCCGGGGTCCGGGACG
-CGCGCTCAGCTCGGCCCCGCGGGGGCGGCGCAGGAGGGAAGGGGGTGCGGACCCCGGAGG
-CGCCGCAGGAAGCCCTCGCCCACCCTTCCCGGCCGGGCCGGGTCCGCAGCTGACGGTGGG
-GGTGGGGAGCAGACGGGCGGGGCGCCGGCCGGCTTGGGGGTCCCCTGGTCCCGTCCAGGG
-GGCTCGGGCCGACTCCGGGCCAGCTGCGGAGGCGGGGGAGGGGACCCCGCTTTCCATGGC
-AGTGCCGAGGCGGCGCGCACAAAGGCGCCGCGATCAGCGCTTCATCGGTTCGAGTCAATT
-ATCTGAGGCGCGGAGGCGGCGGGCGGGGCGAGGCGATTCCCCGGTGGGGCTGCGGAGCGC
-GGCGCCGAGACTCAGAGGAGGGGGCGCTGGGGAAGCGGCTTCTCCGTCTCCTGCTCCGCC
-CCGGGCTTCGTGGCGAGGCGCCGTCGCCCCCTGGTGGGGCCTCATCCATTCCTCGCTCAC
-TCGCTCGTTCACCTTTTTCTCAACCTTACAGCGGGTGGCTCTACGGTACGAGCTGAGGGT
-GAAGTGCTGAGAACAGGGCAAGCGGGCCGTACCTTTAAATGCCCTGTCGGGAGCTGGGCC
-CCTCTGAGTGGCCAACCTCACCAGGAAAGGGCGCTCAGCCTCGCGCTGCAGATGGACTTG
-GAAGCAGACCGTCAGAATGCAGCCCTCCCTGCACGTGATAGAGTAAGGGCCGCACAGGGG
-ATGAGGGCCCGGGGAGGCCCTTCGGGAGAGGAAGAGTCCCAGATGGCTCTCTGGAGGAAG
-TCTGGCCTAAGATGACCAGGTGAAGGGGTGGGGGTCCAGGGAGATGAGGGCGTTGCAGGT
-AGAGGTTTCAGCTATTGCAAAGGGGTTGCAGTACGGGCAAGTAAGGTGCACTCTGGGGAG
-AGTAACCTGTACTTACTGTGCGAGGGGAAGGGAGGTGATCAGTGAGGTAGGTAAGTGGGC
-CAGGGCCAGATGGCACAGGGCCACCTGCAAGCGTGGGCTGAGGGTGGGTTGTCAGGTCGT
-TTCATCATTTCCAGTTTATCCTTCTCCCCTTTAGATTTGGAGAGGATTTGGctgccctca
-cccttgtaagggtttaggcatcattcgcccttgactcctgtccagttgtctcactggtct
-ccctgtatcccttattttgcccttcaatctgcctgcacccatcctccaaaatgacctttt
-taaaagcaaagctcggtggcactacttttcaaaatcACAAATGCACAGGATCTGTAACCT
-GCTGGTTGCACATGACAGAAACCGCATAATAATCATGGGTTAggccgggtgtggtggctc
-aagcctgtaatcccagcactttgggagcctgaggcaagcggatcacttgagatcaggagt
-tcgagaccaggctggccaatatggtgaaaccctgtctctactaaaatacaaaactttgct
-gggcgtggtggtgtacaccagctactcaggaggctgaagcacgaggagaatcgcttgaac
-ccaggaggcagaggctgcagcgggctgagatcacaccactgcactccagcctaggtgaca
-gagcgaggctccttctaaaaaaaaaaagaaaataaaaaaaaaGTCCTGGTGTTAGAGGCA
-TTTTTCTTTtcctcctcctcctcctcctgctcctcctcctcctcctcttcttcttcttct
-tttctgagacagagtctccctttgtcacccaggctggagtgcaatggtgtgatcttggct
-cactgcaacctccacctcttgggttcaagcgattcttctgcctcagcctccagctaattt
-ttgtatttttagtagacatggggtttcaccatgttagccaggctggtcttgaactcctga
-cctcaggtgatccacccgccttggcctcccaaagtgctaggattacaggtgtgagccacc
-acactcagccAatagaggcatttttctgtcatgtaaataaagtctaaagcaggcagtcta
-aaactggcatggtgctctacggttcaggaacctaaactccttttgtcttattatgctacc
-ccctcagtacatggtttccacttcatggcccaacatggctgctcaaacagcagccctcac
-atctgcatccccagatggagagtctttttttttttttgagatggagtctccctctgtcac
-ccagcctggagtgcagtggcctgatcttcgctcactggaatctctgcctcccaggttcaa
-gtgattcccctgctcagcctcctgagtagctgggaccacaggcacgtgccaccacacctg
-gctaattttttgtatttttagtagagatggggtttcactgtgttagccaggatggtctcg
-atctcctgaccttgtgatccacccacctcggcctcccaaagtgctggggttacaggtgtg
-agccaccgcgcccagcccccagatggagagtcttttagtcattagaaaggagaaaggagc
-caaggagggagggaggttcccttaaagactctttcggaagtcacatacaatcttcttgtt
-gatgttccattggctaaacttgatcacatcactacactaagctacaaaggaggctgagaa
-atatgatctgtgttctaggcaccatgtgtccagatgaaaattgaggctcttatttcaaag
-aaaaagTTCAGTCCATggccaggcgtggtggctcatacctgtaatcccagcactttggga
-ggccgaggctagtggatcacctgaggtcaggagttcgagaccagcctgggtaacatggaa
-aaaccccgtctctactaaaaatacaaaaattagccgggtgtggtggcatgtgcctgtagt
-cccagctgctcaggaggctgaggcaggaaaattgcttgaatttgggaggcacaggttgca
-gtgagctgagatcacgccactgcactccagcctgggtgacagagcagaactctgtctcaa
-aaaaaaaaGTATCAGAAAAAGCGCAGTCTGGATATTGGGAAATGACCATCAGTCTATGCA
-TGctcaggagttccatgtctagcagtgtgtcctataggtttgcttaacccatgtgacatt
-tgacacgtttacaaggttattcactgcagcattgtgacagcaaaagactggaaacaacct
-aagtgtcctgtaataggggactggttaaacaaattatgggacatttatacaatggagaat
-gatggccacaaacacacatgaggaaactctcaatgcagtgatatgaaatggtatttaaga
-tgtTTcactttggaaaacagtttggcagtttcttatagagttaaacatacatctctccta
-tgacccagcaagttcacctctaggtttttgctcaaaataaaaatatatatgtatatatag
-ctccacaaggacttctatgcaaatgttcaacagagtttaacatgtgatagacaacaattg
-gaagtgacccaagatcgaacagccaatgaatggataaactggtgagtcaaatattacact
-ggagtttaaatgagtgatccaatgtctgcaaccacatggatgaatctcaaaacatgctga
-atgaaaacaagctggatacaaaaaatagcatgttgtaatgatgccgtttatatgaaattc
-tagaagaggcaaaacagaccaatctatgatgacagaaagcagagcagtggctgcctctgg
-ggtggagggatggactgggaaggagcataaaagaatttcttgggatgctggaaatgttct
-gtatcatgattggggtgttgattacacaggtgcatTTCACTGCATGTAAATTATACCTTG
-ATATTTTTAAAAAGCAGGGTGCAGAACAATGTTTAAATTATGGAATCCGGTATGTTTAAA
-AAGCAAGGAAATTTGCTTGTATCTGCATTGACTGTCTAGAAGAGACTTGTAATAGTGATT
-GTCGGTGGGAGAGGAACTGGGTAGCTGGGGGCTGGGGAAAAGGGACACTTTGGGCCATAC
-CCTGTTATACCTGTTGAATCTTAAACCAGTTGAATGTACTACCTAATTAAAAACTAAAAC
-TGAAAAGATCAGTTAGATGCACACGTGACATCACCACATTCATGTTTTAAATCTCCTAAT
-GGCTCTTCCCGGCAATCTGGACGAAGTTCAGACTCTGAGCTGTCCTGGCCTTATGTGGCC
-CCACTCAGGCAGCATCCTCTCCAACCACTTTTCTGTTCCCTGCAGAGACAGCTCAGTGCC
-TGGCTCCCTCTGGTTGGCCTAAGTGCATATGTGCCATTCCCTGAGTGCTCAGCTCCTCGG
-TGAATTCTCCCCAGCCCCCTGCCTGAGTTGGTCCCTCGGGTCTCACTGGACCTGCTGCAC
-TTTGCCTTCCCCCTTCCTCATCTATCAGATCAACACGTGTTTCCCAGAGCTCTCTGTGAG
-CTGGACCCCAGAGTCCTGGAGATGTGTGGGAGCCACTTTTATGGGGGAACCTGCTTCCTT
-GTTTCTGCTTCAGACAGCAGGCTTCTCCTGCCCTGAGACTCCCAGCAGCGTCTCCTCTTC
-CCAGGCCCAGATCTGGCCTGGGGTAGAAACTTTGATAAAATGTGCTGTCTTTAAGTTAAA
-TATGGCTCCATAAAGAATGCATTCCATGacaagaaccaacagagccctggtttcttagaa
-gatacagagaaaacacactgttgtgggagaattgtgtctgccaaaaagatacatcccagc
-tctaaccctgggacctgtgattgtgaccttatttggaaacagggtttaggcagatgtagt
-caggtcagggtgaggtaatactggattagagtgggctactccaatgactggtgcccttaa
-agagggaaacagacagaggagaacaccacgtgaccacagaggcgaagatgggagtgatgc
-atccacaagccaaagaaggccaaggaggcttgcagtcataaaagctggggagaagcgagg
-aagtgtcctcccttagggctttcagagagagcatggccttgccagcaccttgatttcaga
-cttttagcctccagcactgtgagaatacatttcagttgtcttaacctacctggtttgtgg
-ttatttgttctttttttaaattttttatttatttatttatttttgagacagagtctcact
-ctgtcacccaggctggagtgcaatggtgtgatcttggctcagtgtgacttccaccttctg
-agttcaagtgattctcctgcctcaggctctggagtagctgggattacaggcacctgccac
-cacacctggctaatttttgtattttcaatagagacgtggttccactgggttggccaggct
-ggttttgaactcctggtctcaactgatccgcctgtcttggcctcccaaagtgctgagatc
-acaggcatgagctaccgcacctggcctgtggttgttaactgtagtcccaggaaatgaata
-cacacacaaaaccagttaatacctaagacaattccagctagtggcaagtgctttggaaaa
-acaaaacaaaacaaaacaaaacaaaacaggtgagaagggcgtgggatagagagggactgg
-gaacggtgccacattagccagggtggtcagggaagccctcttggaggaggaggcatttca
-gtggagaGGAGAAGCCCAGCATGTGAGGACCAGGCAGAGGTGCTGGTGAGGGGGCACTTG
-GTGGGCGTGAAAGCTACTGGATGCAGCTCTGACGATGGAGGATACCTGACTGGGATTTTG
-GAGGAAGTCTCCAGGAATGAACCGGGAAGGGGCTATCCTCTCTTTGCCTCTGCAGGTCTC
-AGAACCTGCTGCATGGCTGCTGCAGGCTGTCCCTCGGCCTAGGCCGGCTGGCAGCCGATG
-AAGGAGGCCAGCCTCGCAGCTGACATGCTGCTCTCTAATTGTGATTAACTACCAAGTCCT
-CTCCTGCTCCGGCCTGAGGCCGCTGGTGTGACAGCTGCAGAGTGAATCAATGAGGCCAGG
-AAGGGGTTAATGGGCAGCCCCTCCATCTGAGCCCTTCAGACAATAAGGGGAGGTGGGGAG
-GCCTCTGGTGGGGGTGTGTGGCATCAGCTGGGGTGAGTGAATGGAGGGGACAGAGGCCTT
-GTCCCTGGGGACAGGGTGTGAGTGCTCTGTGGGGAGAGGGGTCAGACCCCCCTCCCATTA
-TTTTCATCCACCTCCATCGTCCTCTCCCCTCCCCCACCCAGCCAGAGCATCCCAGACAAC
-TGCCCTCTTGGCTCCAAAGTGTGCAGCATCTTCAGCCTTACGGAATTCTGAAGCAGAAAT
-TCTAAAAGCCAAAGAACTGCAGAATCGTGACATGTCACCGCTGTGGGAGAGTCCGTCTAG
-TCCTGTCATTCTGAAACTTTCTTTTGCAGTGGAACCCACAACTCCCACCCCAGCTCATTT
-CCCCCCAAAATAATAGTGCATTGATAACATTGAGAACAGACCCTGGTACCAGCCGGCCTC
-ATTCATCCTTCATTCAGCCCCGGTTCTACCACGTACAACTAGGGTAACTTGGGGGTATAA
-TGCATAGTTTATAGgtgtgtgtgtgtgtgtgtgtgtgtgtgtCTTCCCtagagacagagt
-cttgctatattgcccaggctggtcttgaactcctgggcacatgcagttctccagccttgg
-ccttctgagtggctggCTCACACCACCGTATTCAGTagttccgtaggttttgacaagttt
-gtaagttatgtaaccaccaccacaattaatatatagaacatttccatcgctgaaaaatgt
-tgcctcatgccccttgtagtcaatacccttcccTGTGTTACCTGATATGGTAGCATGAAT
-AAAGGTCATCTAGAGTTAGTGACTCTAggccgggcagggtggctcatacctataatccca
-gcattttgggacgccaaggtgggtggatcacttgaggccaggagtttgagaccagcctag
-ccaacatgacaaaaacccatctctactaaaaatacaaaaatgagccaggtgtggtgatgc
-acgcctataatcccagctactccggaggctgaggcaggagaattgcttgaacccaggagc
-tggaagttgcagtgatccgagatcacatgactgcactccagcctgggcaacagcaaggct
-ccgtctcaaaaaaataaaaaaaataaaaaaaTTAGTGAttctaatccttgaactgtgtaa
-atgttaccttatttggataaaggatctttgcagatgtaattaagaggcagaggttggagt
-gatgtggcccaaagcaaagaacaccaggaggctcccagaaccagaaggggcaaggaatgg
-attctgctctagagcctccagaggtagagtggctctgccaacaccttgatttcaaatgcc
-tggcttcagaactgaaagagaatacacttctgttgttttaagcctctcagtgtgtggtac
-ttttttacagtagtctttacaaacaaatatacctagcaaccaccatgccttgttttctat
-ctgtataagttttgcctttgcaaggatgttacatagacagaatcctgcagtatgaagctt
-ttgtgagtttggcttctttcactcagcataacacagttgagatgcatccatgctgttgca
-tgcatcagaagtctgttccttttggatgctgagtagtatttcactgctggatacaccaca
-gcttatccattcaccagttgaaaggcatttgggtcactcctaattgggagcattataaat
-aatgctgctatgaacatgtgtgtatagatctctgtgtggacatacactgtcatttctcca
-gagtagataccctggagtagaattactgggtcatattgtaagtgtatttataattttatc
-agaaattattacccgggcatggtggcatgcacctatagtgccagctacttgggaggctga
-ggcaggagaatcccttgaacccagtaggtggaggttgtagtgagccgagatcatgccact
-gcactccagcctgggcaacagagtaagactctgtctaaaaaaacccaaaaaaccaaagaa
-caaaaCTACAAAGAATCTGATgtggctcatgcctgtaatcccagcactttgggaggccga
-ggttggaggattgctggagctcaggagtctgagaccagcctgggcaacatggcaaaaccc
-gatctccactaaaagtacaaaaattagttgggcgtgatggtgagtgcctgtagtcccagg
-tacttgggaggctggggtaggaggatcacttgagggtgggaggcggaggttgcagtgagg
-tgagattgtgccaatgcactctagcctgggtgacaaagtgagaccctgcctaaaaaaaac
-cccaaaaaacagaaagaaactgacaaactgttttccagtgtagctataccattttgcatt
-ctctccagcaCTTAGTATTGTCAGGTTTTTAAAAATTTAGATATTTTAggccaggcgctg
-tggcttatgcctgtaatcccagcactttgggaggcagaggtgggcggatcacttgaggtc
-aggagttcgagacgagcttgaccaacagggagaaccagatacttgggaggttgaggcagg
-agaattgcttgaacctgggaggcagaggttgcagtgagctgagatcacaccattgcactc
-cagccctccagcctgggcatcaagagtgaaactctgtctcaaaaaaaaaaaaaaaTTAGA
-TATTTtaataggtatgtaacaatcatagggttattgtgagaatgaaatgaacatatctga
-gaatactgcctagcacatggCTCCTGGCTTGGAAGGGTAAGCTCCTCTTATTGCAATCAC
-TATGGGGTTATGTCCTGTCCAGGACAAAACCAGAGGTGAAAACTCAAAAAAAAACTCAGG
-TGGGCCAGGAGGAGGCTGTGGGGACCAGTGAGCTCATGTCCCATCttgaaggtcaaggtc
-ccgggaagcagctcctgagatggaaatctgcatgtgggtggttttccaggtagtgctctt
-aggatcttggaggagccagggaagcaggctcgggcagttgcaatagaggccttgaccagt
-cccatcaggagctgggccagcccttaggacatgtcacagcctgagacagggaggtcatgc
-ctctgtactctgcaagatcagactttggagtggttgcccacaggagagatgttattaata
-tcttgggtgaagcagcccttttaagctgGTGCCTTGATCCGGGTGATGGCTTTGAGGTgg
-aaaacaagcctgagtggtttcagctttcaacttttcaagagaagctatgtatctagattt
-tgatgttaactctccaaacttttttaaaatgctggaaattctagacttttcaaacctgct
-gtgaggggctcacatgccaggcacaagggctggagggggcctgaggctgcctgtCGATGC
-CCCTTGATATAAAACCAggctgggtgcagtgccttatgcctgtaatcccagcacttcggg
-aggccgaggtgggtggatcacttgaggtcaggagttcgagaccagcatggccaaagtggt
-aaaaccccgtctctactaaaaaatacaaaataataataataataataataataataataa
-taattagctgggtgtggtggctcacccctgtaatcccagctactcgggaggctgaagcag
-gagaattgcttgaacccgggaggcggaggttgcagtgagccgagatcgcgccattgcact
-ccagcctgggcaacaagagcaaaactctgtctcaaaaacaaaacaaaacaaaaacaaaaa
-caaaaaAGGAAAACCAAACAAAAAAACCCCCAAAACCTGCTGTGTCATCTGACATCACGC
-TAGTgtctggttgccgcactggagaggacaccccatggggcaggaatctttgggttttga
-tctccaccacatccccagcatgtagggcagggtccagGCCTGGATGCAGCACGAGAGAAG
-GAACGCAGGGCCCGAATGAGTAATTTGCCTCAGTGTGCAGGTCATTTAATTGCAAAGAGA
-GGAAAAACGACAACCAAaaacaaccaaatgaaaaaatgagcaaaggatttgaatagacat
-ttctccaaagatgtacaagtggccaataaacagaggaaaagatgctcagcgtcagtaatc
-attagggagatgcaaatcagaattgcaagcacgagataccgcttcacacctattaggatg
-cctattaaaaaacaaaaacaaaaaACAAAACAAAACAAAAAAATCAggcagagtgctgtg
-actcacacctgtaatcccagcactttgagaggctgaggtgggcggatcacctgaggcagg
-gagttcgagactagcctgaccaacatggagaaatcccgtctctactaaaagtacaaaatt
-agccgggcgtggtggcgcctgcctgtaatcccagctactcgggaggctgaggcaggagaa
-tcgcttgaacccaggaggtggaggttgcagtgagccgagaccacgccattgcactccagc
-ctgagcaacaagagcgaaactccgtctcaaaaaaaaaaaaaaaaaaaaaaaaaTCGCAGA
-Tctgactgtgtgaccttgggcaagttgcttgacctctcagtgcctccatttcctcctctg
-taacgtgagagtaaaaatactactcatacctacctcgtagggctgtcatgaggactgaat
-aagtgcataggtacagacatgcttaggacagtatcagcacatgcaggaattacatgggag
-ttggctgttaATATTATTACAGGAGTggatcaaatccatctctgccatggacttgctgtg
-tgacctagtgcaggtcactttgcctctcttggtccagttttctcacttgtaaaatgggac
-catactgccactctccatagggcaagtgtgcggattcgaggagctcatatgtgaaaggcC
-TCCTTCAGGCGCAAGGTTGGTCCTTGGTTATGCACGTATGTGAGCCTCTTGGCGTGCCTT
-CATATGTGGGGCATAGGCAAGCACTCAAGTGGCCTGGACTCCTATCTCGGCTCTCAATGT
-CCCCGCTTCCTGGCCTGGGATCAGCAGGACCTCAGTGGATCCACCATCCAGGCACATCCC
-TTTCTTTCCCTGCTTTTTTCCTGCTTCTTGGGCGGCACCACCACCTACTGGCCTAAAGCT
-ACATTGCAGCCAATGTGCACAGCGGGGCGGAGGGAAGGGAATATGGCCTTGGGCAGCTGC
-TGTGCGCAGAATATTTACCTCTGTACACGCTTAGGGTGCTGAGGCTTAGGGAGCTCACAC
-GGAGAGAGCCAGCTGTGAAGCTGGGGTTAGAATCCCTGTCTCCCTTTCACCTCACTCCAA
-ACACCCTCTTAGAATGGGAACTCAGTTCAGGTTCTGCCTTGGGCCCTAGACGATCCACCC
-CTCCCTTCTGAGCAGGGAGCCAGGAGCTGAAGTCCAGGGTCCTTGGAAGTATGTCAGGGT
-TGTCCCCCCAGGGTCCTGATTACAGAAGAAAGAACACTGGACTCAGAGTCCAGAGGTTGG
-GGGTCTAGCTTTGCCTTCCCTATCCCCAACTATCAGCAAAACAGCCTTTGGAAAATCCTC
-ACCCATTTATTCTAGCACTTGTCATTTCGAAATATATTTACTGTGGGAGAGCATTTAATG
-TGAGTGTTAGGTTCTAACGCAAGGAGAAAATTATAAAAATAAACAAAAACTTTTAAAGAA
-CTCCTAAAAATCCTTTAAGTCACTCATAAAGTATAATATGGGCAGTTTTCTAAATATAGT
-CCTTTGCAGCAATAAATGCACGGACCATAAAGAACAGCAGTATATGGTGGTGATTGCATG
-CATTTGCGAACTGTAATTTTAGGTTCTGTTCTCTCTCAGGGGTGTGTGGGATTCCGAGCT
-GTGGATCCACACCCCCACATCTCTCTCACAGCTGGGATCATGTCCAGGCAGAATCGCCCA
-CATTGTGTACATCATTCTCCCTTCTCTCTCTCTTTCTGAGCGCACATAGCTGCATTTCCG
-AAGTTACATAATaaaaacagctaacatttattgagctttcattatgtattaggcctgctc
-gcagccctttgctcacgcattaattcattaattcagataatcctcctaagaatgttatga
-ggtaggtatattattatctcttctctttacagatgaggaaactgaggcactgaatggtta
-agtaactagcccaaggtcaaatagTGTACCACCCAGCCCGAAGGCGTTCACCTTgttccc
-gggtaggatcgcagaactggttaagctaggttaccgatccgggtggtgtcagctgatccc
-tcagctgctgtagtgcaagatctgcaaaatatctcaagcactgatcttaggttttgcaat
-agtgacactgtccccaggaacaacttggggaggttcagacccttgctgtcagaggctgca
-cagcccctaaaccttgatttctaatcttgtagctaatttgttagtcttacaaaggcagac
-tggtccccgggcaagaagtggatcttttcaggaaagggctattgtcataatttcctcagt
-tacaatttttgcaaaggtggtttcaatagccagtgagtggtacagcctgaatttgaaggc
-aggaagtccgggacgagaacccacactcttgactggcatactTGCCACCTGAATGGAGGC
-TCCATAGAGCCACGCGTGCATGCTTGTGTACCTGTTGTCAGCCCGCAAGCTCCGTTAGGC
-AGGCTAGAACCTGATCCAGGTTAACTTTGCATCCTTAGTGCTGGTTCTTTCCATCCAGGG
-CCCCACTCAGGGTATATGCTCAGTGACTGTTGTACAAATGCATAAAGCTCAGTTTGCATA
-AAGCTCACTTCAGCTTCTGTATCTGTAAGACAAGAATCAGagccaggcacagtggttcat
-gcctataatcacagaactttgggaggctgaggcgggcggatcacgaggtcaggagttcca
-ggccagcctgtccaatatggtgaaaccccgtctgtagtaaaaatacaaaaattagccagg
-tgtggtggcacgcatctgtaatcccagatactcgggaggctgaggcagaagaatcacttg
-aacctgggaggcagagtttgcagtgagccgagatcatgccactgcactccagcctgggcg
-acagagcgagactccatctcaaaaaaaaaaaaaaaaaaagaaTCGAAATCAGCTCTTCAG
-ATTGCTGGAGGCTCCGACAAGCCCATTGGTGGGAAAATTCTCTTTAAAGACACTGATGTG
-ggctgggcacaatgactcatcctgtaatcccaacactttgggaggccaaggtggatggat
-cactagaggtcaggagtttgagaccagcctagccaacatggtgcaaccttgtctctacta
-aaaatacaaaaaattagccaggtgtggtgacatgaacccataatcccagctactcgggag
-gctgagatgggagaatcgcttgaacccaggaggcggaggttgcagtgagccaagattgca
-catctgcactccagcctgggcgacagagcaagactccatctgaaaacaaacaaacaaaca
-aaaCACtgatatagtttggatttgtttcccctcccaaatctcaggtggggttgtaatccc
-cagtgttggaaaaggggcctggtgggaggtgattggatcttgggggcaaacatccccctt
-gctgttcttgtgatagtgaatggattcttacgagatctgcttgtttaaaagtgtgtggca
-cctcctcctaccccgctccagccatgtagaacgtgcctgcctccccttcgccttctgcca
-tgattgtaagtttcctgaggcctccccagtcatgcttcctgtacagcctgcagaaccgtg
-agccaattaaacttctttttttaaatgaattacccagtctcagttcattataccaatgtg
-agaacaaacgaatacaGACACTAAATTCTCCTTTGCCCACCTCCTGCTTGGTCCCTTCTT
-GAATTTTCAAGCTGCTCAACCAAGTggcctgcaccagcttgggagagctaatcgtgtgta
-tctgtacccaactctacattcagtaacatcatgtttgtagctcgaaatcagcaatggtga
-gtatttacactatggcaattggcaaatgcttcaaacaggagttttcccctctagagatgt
-taaacgtttgccagGAGGAAATCAATCCTCTAATGGCCACCTTcaaggaggcaacacagt
-ggagtgatcatgcttgttggctctggagccagaacacctgggttcaaagtccagctctat
-cacttaccagctgtgtgaccttgttcagttacttaacctctctgagcctcattagtctca
-ttcatgaTTACGTATTTCATTGGGGACTCAATGCCATCTTCCATATAAGTGCTCTCTCAA
-TTAATGTTATATATTAATATTATCAATCAGCTTAAGAGGTGGGGAAACTTTCTTGTTTTC
-CATCCTAGGAAAGGGAGTGCTGAGGACAGGACTTGCAGTGTCAAAAAGGAACCTCAAAAA
-CGGCAATGTGTAACTGCAGGTCTGGGCCATTTTTGAGGGTCTCTTGAGCATTGGCAGACC
-AGATCTTTATGCCAACACAGGTTGTGCGTGTGGGGGTTAGAGGAGGAGAGGCCTTCTCAG
-TTCTTTGCAGGAAAGGCTACTGTTAGCTCTAGAGCCCAGAACAGATTTAGGGGGAGAGAT
-GATCTAACCAAACTTTCCCTCTGCCCTCGGCTTGCCAGTCTTCTCGCTAGTGAACACTCC
-CAGTGTGAGGTAGAGGGTTCCCTGTTCCACCTCCTTCCTCCCTCTGTAGAGGAGGTATGC
-ATTGGGGCAGGTGTGTGTAAGGCCCTCCTGGGGTACCCCTCCAGGGAATCTTCCCATCTT
-CTCCAGTACTGCCCCATCTGACATCCTGCCTGAAGCCACAGGTTTCCCTTGCAATCACTA
-AAGAAGCAGGAGGGAACCAGCAGAACTCCCTGCCCATGTGCACAGGAGGTGATCCAGAAA
-CTTCAAGGGGAAAAATCCTGCTCTCCACCCCAGCAGGCATTGATTTTTGGCTGCGAAGAT
-TACAGtctctctctctctctctctctctctctctctctctctctctctcacacacacaca
-cacacacacacacacacacTCCTGTGTGCCAGGAGGTTCCTAGAAGGTCCTCACTCCTCG
-CACTCAGGTGCTCCAGGGCTAGCCCACTCCTGGGAGGTGCCCACAACTGACCACGATGCC
-CACAAGACTGTGGGAAGGGTTGCCCCATGTGCCTTCGTGCCCCTCCCACTGGATCCCAAC
-gaaggctcttttcacaacaggaatcagagcatgtcactcccaacctgcctaaaccctcca
-atggctcccaccacttttgatcaagacctaaatcctttctgagtccaccccatccttaca
-gggtctaaccttgcttccatccctgtcttcaccccttattcctccctctgggctcctctt
-caggcccttgaggtgccaagctcactcctgccctgggcctttgctgctgctgtccccttg
-gcctggagcactcttcccTGTCCTTTTTGCCCATGTGAGGCTGAGAGGCAGACGGAATCA
-TGGTTGCTAGTGTAGAgaggccacactactggagtttgtatttcagttctgtcaccttga
-actgggtgacctcacccatctctgcctccctttcctccctctatacagtgggaaagataa
-tagcacctacatcttagggtgttgtgagactgattgagataatCTGTATGGTTTTtggca
-gtttctgaaatgcactgtaaactgtctggttctcctcccatcggaaggtgagaatctgac
-tgctccccttgactctgggtgagagggtagggcaacagcaatgctccatgatttcagagg
-ctgggtcataaaaacggtctgcaggggattcacttccagaacagtggagtgaggaacact
-gcagactgctttctggtgaaaacaactgatgatgatttctaaaaaacaatcatttgaagt
-ctctggaaattgtcctaagagcatacagcaagtgaagaaacacttattcaagaaaatcta
-ctaaatctaggtaagaacagtgagtttgtagaacttgagacacaatccactctctttctc
-ccctccattccattttactgttatggaaactcaactgtgagcagccagggccaagaagat
-gggagtcatttccccccaagctcctagtcgatggggtacagcatctccccaggaagggaa
-ggctgccagcatttgtcatcctcccaacagctatatcttacagaggctaaactccaggta
-ggtgtggctgggagactgggatcttccttcctctacccagtccccactcatagggtggtg
-gccacgccaagtgcagcaggctaaaaatattgaagccccagttgcttttgtcttagctta
-cttgttaaagcagaggttccatgcctggagatgcaagctgagaagaccagagactaagaa
-tactgccccaactcagccctgctcataaagcaagaaggttactctgggagaagtgaactg
-ttgtccctgcctccagctccagagcagtgtcacagatgctttgcccaagagagaggcagg
-tcataacaacacagatctttaaagttgtccataaaggaactgactttctttagaacagag
-tatgcagaaatttaagcctaagagtgccctcagaagcagtggcgattttggtagtgatca
-gggacccaaagttgctatactatatcatcttaaatgttcattttccagcaaagaatttca
-agacttgcaaagaaataaacacatgtgacccatacacagggaaagaccagtcaacagaaa
-ctacctgtgagagtgctcagaggtcagacttgcacggacttcaaagcaaccactgtaaat
-atgttcaaagaaataatggaagccatgcttaaagaataagggaaggtaggctgggtgcag
-tggctcatgcctgtaatccccgcactttgggaggccaagaggggtggatcacctgaggtc
-aggaatttgagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaa
-attagctgggcatggtggcaggtgcctgtagtcccagctactcgggaggctgaggcatga
-gaatcacttgaacccaggaggcggaggttgcagtgagctgagattgtgccactgcccttc
-agcctgggtgacagagagagactccatctcaaaaagaaaaacaaaaacgaaaatcaagaa
-taagggaagcggtgatgactgtgtctcatgaacagagaatgtaaacaagaagatactatt
-ttaaaaaacttaatggaaattctggagttgaaaagtgcaaaagaaaaattcactagaggg
-gctcaacagtagacttgagccagcagaaggaagattcagtgaatctgaagacagatcaat
-agagatttcgcagtctgaagaacagagagaaaaatatgaagaaaaatgaacaaagccttg
-gagaaatgtgggacacagctaggtgcaccaacatatgcacaataacatatataacagaag
-gagagcaaagagagaaaggaacagaaaaaaatgtgcaaaaataatcactgaagcctttgc
-aaatttgatgagaaacatgaattatgcattgaagaagcttaatgaactccgagtagaaca
-aatgcaaagtggtcaacaaccagatacataaaaggaaaatgttgaaacccaaagataaaa
-agaaaatcttgaaagcaacaagagaaacacagctcatcacatataagggaacaccaaata
-agaccgacagcagatttctcatgtgaaacgatggaggccctaaggcagtgggacaacata
-ttcaaaatgcataaacaaaaactaccaagcaagaatcttacatccagcaaaattatcttt
-caaaagtgatgatgaaagagatatttccagataaacataaactgagaatttgttgccagg
-aaacttaccttacaataaatactaaaggaagttcttcagacagtaatttgaatccacaca
-cacaaaagccaaagtgctctgggaaaggcaagtagatcgttatgaaaggcagtaagaatg
-catatttattcaccttctcttaacagatttttaaaaataatttgtatataattgtattgt
-ggggccaagacatatagaaatgtaatatattttgataataatagcacacaggaggtgagt
-gggagcagagctgtattggattaagaaagtgagaccagatgggaactggaatccacagga
-acaaatgaagagaaccagaaattataagtaagaaagttaataaaacaaagtcttttaata
-tatacttgctctcctttcttctctcagcttcttcaaaagacataaaactatataaagtaa
-taattataacaaagtactgttggttttgtaacatatgtagatgtaatacatataaaaaga
-atagtgcaaagaggaagaagagagaatagtgctatataggagtcaccgggcacggtggct
-cacaactttaatcccagcactttgggaggccgaggcaggccagtcacttggggccaggag
-ttcaagaccagcctggccatgtatctctacatataatagattgaaaccatgtatctctac
-gtataatacaaaaattagccaggtgtggtgtcatgtgctggtaatcctagctactgggga
-ggctgaggagaattgcttaaacccaggaggtggaggttgcagtgaaccaagatcacgcca
-ccacactccagcctgggcaatagcacaaaaatctgccaaaaaaaaaaagatagaaatata
-taggagtaatatttctatatatcactggaattaagttactgtaaatctgaagtcaattct
-gataagttaaaacctatatagtaagcctaaactggtcattaagacaaacaaacagaacag
-tgaaaaagctattaaagaaatttaaggctgggcacggtggctcacacctgtaatctcaac
-actttgggaggctgaggtaggtggatcacctgaggtcaggagttcgagaccagcctggcc
-aacatggtgaaaccccctccctactgaaaatacaaaaaattaggtgggtgtggtggcagg
-cacctataatcccagctacttgggaggctgaggcaggagaattgtttgaacctgggaggt
-ggaggttgtagtgagccgagatcatgccattgcactccagcctgggtgacagaatgagat
-tctgtctcaaaaacaaaaacaaaaacaaaacaaacaaaaaatccaaaaaacagaaattta
-aataatacactagaaaatattcgtttagtgtaaaagatgtcaaggaagaaaagaggaaca
-aaaaagacatgagacatatagaaaataaaaagtcaaatgacagacataaatccaacttct
-ctcaatgatagcattaaatgtgattggatcaagtcaaaagggagagatttcctgactaaa
-taaaaagccaagatcaactatatactgtgtgcagaagatacactcaagattcaaaggtta
-aaagtaggttgggcgttaaaggctgaacaaaatatatcacgcaaacagcaaccataagaa
-aacttgatttgctatattaatatcaggaaaaagactttaaaatgaaatatgttacaaaag
-ataaagaggaacattttataatggtaaaaggatcaatcgatccattgggaagacataaaa
-attatagacagatatgcccctaacaacaaagccccaacatgtgtgaagcaaaaacagaaa
-gaattgaaggggcaaatagacaattcaaaaataatatttggagacttcaaaaccccactt
-ttaataatgaatagaacaactaaacagaagactaaagaaggcaatagaggctgggcgtgg
-tggctcatgcctgtaatcccagcactttgggaggcccaggcgggcagatcacctgaggtc
-aggagttcgagaccagcctgaccaacatggagaaaccccgtctctactgaaaatacaaaa
-ttagccaggtgtggtggcgcatgcctgtaatcccagctactcaggaggctgaggcaggag
-aatcacttgaacctgggaggcagaggtttccgtgagcccagatcacaccactgcagtcca
-gcctgggcaacaagtgcaaaactccgtctcaaaaaaaaaaaaaaaaaaaagaaaaaaaaa
-agaaggcaatagaagacttgaacaacactaaaccaacaagacctaaaagacatctataga
-acatttcacacaacaacaagataatacacattcttctcaagagtacgtgaaaaattattt
-aggacagactatatgttagaccacaaaacaaacatcaatgatttttttatcttttatttt
-tttttttaatatggagtcttgctctgttgcccaggctgaagtgcagtggcatgatctcag
-ctcactgcaacttcagcctcccgggttcaagcaattctcgtgcctcagcttccagagtag
-ctgggattacaggcacccaccactatacccagctaatttttatatttttgtagagacagg
-gtttcaccatgttcgctaggctggtcttgaactcctgacctcaagttatctgcctaagtc
-ggcctcccagagtgctgggattacaggtgtgagcaaccgtacctggacaataaattttaa
-aagattgaaatcatacaaagtaccttctctgactaaaatggaatgaagctagaaatcaat
-agaagaaaaccaagataattcacgaatatgtgaaaattaaaaacacactcaaacaactaa
-tgtgtcaaaatagaaatcacaagggaaattggaaaacaccatgagggaatgagaataaaa
-atataacataccaaaacttacgtgattcagtgaaagcagaaaaatttatagctgtaaaga
-cctgcactaaaaagggagaaaggggccaggcgtggtagctcactcctgtaatcccagcat
-tttgcgaggctgaggcaggcggatcacttgaggtcaggagtttgagaccagcctggccaa
-catggtgaaaccccatctctactaaaatataaaaattagctgggtatggtggcacatgcc
-tgtaatcccagctacttaggaggctgaggcgggagaatcgcttgaacgcaggaggcagag
-gttgcagtgagccgagagcgtgccactgcactctaacctgggtgacagagtaacactccg
-tctcaaaaaaataaaaaataaataaaaaaatttttttaaaaaggagaaaagtctcaaaac
-aaccacctaactctacaccttaaagaactaCAGAaagaatacaaaaattagccgggcatg
-gtgatgggcacctgtaatcccagctactctggaggctgaggcagagaatggcatgaacct
-gggaggcagagcttgcagtgagctgagatcgtgccactgcattccagcctgggcaacaga
-gcgagactccgtctcaaaaaaataaataaataaataaaaaataaaaagaactagagaaag
-aagcacagactaaacccaaagctagcagaagaaagaaaataattaagattggagtggaag
-taaacaaaatagagtatagaaaaacagtggtaaaaaaatcactgaagctgggcatggtgc
-cacatgcctataatcccagcactttggaaggcagaggcaggtggatcacttgaggccagc
-agttcaagaccagcttggctaacatggtgaaaccccatctctactaaaaacacaaaaatt
-agctgagcctggtggtggacacctgtaatcccagctatgcgggaggctgaggcaggagaa
-tcacttgaacctgggaggcagaagttgcagtgaactgagatcatgccactgcactgcagc
-ctgggcaacagagcaagaccctgtctcaaaaaaataaaaaataaaaaaataataaatcaa
-agaaacaaaaaattgatcaatcaaattgacaaacctttagctaaactggctaagaaaaga
-agattcaaattactaaaatcagaaatggaagttcggacagtactactgaacttacagaaa
-taaaaataattataagaaaatactatgaacaattgtgtaccagcaaattggagaacctag
-atgaaacggacaaattctggccaggcgtggtggctcacgcctgtattcccagcactttgg
-gaggcaaaggcaggcagatcacaaggtcaggagattgagaccatcctggctaacatggtg
-aaaccccgtctgtactaaaaatacaaaaaattagcctggcatggatggcacgtgcctgta
-gtcccagctactcaggaggctgagacaggagaattgcttgaacctgagagatggaggttg
-cagtgagccgagattgtgccactggactccagcctgggtgacagagcaagattctgtcaa
-aaaaaaaaaaaaagaaagaaaggaaagaaagaaagggacaagggacagattcctagatac
-acatgatataccaaaactgagtcatgaagaatggaaatctttatagacctgtaatgaagc
-agtgatcaaaagccatccaaaaaagaaaaacctttgacaagtccctggtgaattctacca
-gacatttaaagaagaactaacatcaatctttctcaaactcttccaaaaaatttaagagga
-gggTCGGGGGGCTGGGAGATCCAACATGACctcatccacatgactggcaattggtgctga
-ttgtcagcaggaatgtctgtgttctcctccttgcggtcactcttgctctgttaggtcaga
-catcatcccttacatagaggcccaagggtccaacggtccaagtccaagactgaagctgca
-aggtctcttgaggcagaggctctgaaaaccacatgatgtcacttctgtcacacgctattg
-gtcaaagcaagtcacatgcctcactcagcttcaagtcagtggagaaacagactccacctt
-ggatgggaagaatagcagagtcacattgcaaaggggtgtggataagggttgggaggaatg
-tgtagccattaatttacaCCAGATAATGTGAGTGTTTGCACTTTACAAGGTCCACAGGTC
-CACtgatacagtttggctctgtgtccctacccacatctcaccttgaattgtaataatacc
-cacgtgtcatgggagggaccccatgggaggtaattgaattatggggcgggtttttcttgt
-gctgttctcgtgataatgaagacatctcaagagatctgatgtttttatcggggggagttc
-ccttgcctgccaccatggaagatgtcccttgactcttccttcatcttcagccatgattgt
-gaggcctctccagccatgtggaacagtgagtccactaaacttgtttcctttataaattac
-ccagtctcaggtatgtctttattttattttattttattttattttattttattttatttt
-attttatttttgagacagagtcttgctctgtcacccaggctgaagtgcaagggcaccatc
-tcggctcactgcaacctccgcctcccacgttcaagagattcccctgcctcagcctcctga
-gtagctgggactacagtgcacgcctccacacccggctaatttttgtattttagtagagac
-agggtttcactatgttggccaggctagtgtcgaacttctgatctcatgatccacctgcct
-cggcctcccaaagtgctgggattacaggcatgagccaccatgcccggcctcaggtatgtc
-tttattagagcgagagaatagactaatacaTCCACCAACCCTAGGAAGTCAGTGGAAGGG
-TATTTCCGTATTTCATATGGAAGTCATTTCCATATGAAAATTTAGCCAGAGGATTTCATG
-CTGGTTGTCTGAAAGCCAGGAGCTTCTAAAAAACTTTCAGGGTAGCTGTCTAAGCATGac
-ctcatgtcatcctgttgtgagtactaaattagttaattcaggggaggcactcagaaaagt
-gAAGAAAGGGAAATCTTTCTTATATAAATCTTAGAAATCTCATAGAAATCTTAGGAAAgt
-gcctggcgtgcagtaaacacgtgatacatttcagttgttattatcttcacaataattttt
-ttgggtcaggcttgttattttccctgttttacagattaaggggcagagactcagagatgc
-gcagtaagtcgcctgagggttacgcagcaaataagcagggaagccagatgagaacctaCA
-TGACAGAGTCACCCATGTGTGAGACTCCAAAGCCTCATTCAGGTGCACAGAGAGGCGGTT
-GTGAGGACGttcactgctgcgttgccttcagtagcttaacatcagaaacagcgcagatgt
-ccaccaacaggggccacccagtaaaccccagcatgcccagccaaggagtgctttgtgctg
-gttacaagaaatgaggtcacgctatacataggacatgggatcatctccaagacattctgt
-tcagtaaaaagaacaTCTGAAAAAAAAGTTCCATAACCCACAGAAAATACTGCCAAATAT
-TCCAAAAAATCTAAGTCCAAGTGTGTGTGTATGTGACCTCTGGAGGCTGATCTGAAGCAA
-ATGTAGGTGAATTAAACAATAGGATCTATTTATAGGACTCTTCTTTTCCTACTTTTCTTT
-ATTTTTGTTGGATTTTGAAACATGTTCAAAGAAAAATTCAGAGTACAATAAAGTACCagt
-cgggcatggtggctcacgcctgtaatcccagcactttgggaggctgaggtgggtggacca
-cctgaggtcaggagttcgagatcagcctggccaatatggtgaaaccctgtctctgctaaa
-aatacaaaaattaggtgggtgtggtggcaggcacctgtaatcccagctactcgggaggct
-gaggcaggagaattgcttgaacccaggaggcaaaggttgcagtgagctgattgtgccact
-gcactccagcctgggcgacaagagtgagactgtgtctcaataaataaatgaaagaaagaa
-agaagaaagaaagaaagaaagaagaaagaaagaaaagaaagaaagaaagaaagaaagaaa
-gaaagaaagaaagaaagaaagaaaaagaaaaagaaccaagaagaaaaaataaTCACCGGA
-GATTCCtcccctcccctagagctaactaggctaacattttggtatatatctttccagtcc
-ggatcctgtgtgactgagtgtgtatatgcatatgtattattttCAACTGTtggctttctc
-cttgtggtccaagacagctgctccagatttagccattacatctgtttcctgccagcaaga
-aagggaaaatgggaagtagagggccttttaagtatacaacctagaatttacacacattat
-tctttatcacatctcatttctctaaatgtagtcgcatggccatcctggccagaaggaagc
-ctgggaaatgtggtctttcctctgggctgccttgtgcccagtgaaaagtcaggggttcta
-tgactatgaaagaaacaggagaatggatattgtggcaactagcagtGCTATTCACCTTTA
-TTCTCTCAATGGTAATATTTTTCCCCATCAAGAGGGGAAAATTTGTGTCTTACATTCTAA
-CCACTGAACTCCGAGAGAAGACACTGGCCTGTGCCAttctcttgcgatggagtttcgctc
-tgtcgcccaggctggagtgcagtggggtgatctcagctcactgcaacctccacctcctgg
-attcaagcaattctcaggcctcagcctcccgagtagctggaattacaggcacctgccagc
-acacccctttttagaccacatagggtagcttccgactgttgccatggcatttgtgaattg
-tcatgtgctggtgggagtgtctcttagcatgctaatatattataattagcatatatatta
-taatgagcagtgaggaggaccagaggttgctttcatcaccatcttggttttggcgggatc
-tggccagcttctttactgcatcctgtttgttttatcaataaggtctttgtgacatgtacc
-ttgtgAAACCAGTCCTGCCTAAGGGAGCGGGGCTGGCGGTTGTTCAGAGTGAACAATTCA
-AAGTCAGGTCCTCCCTCTTGGAGCTCAGAGACTTGAAGAGCAAGGACCACTGTCAGGACA
-CAACCCCATTTGCAAGGCCGGGGACACACATACAGACCCACAGGCCATTGTAGAGAAAGT
-GTTAAAAGATGGAAGTCAAGCCACGGCCACTGGAAGTGGTGTGCCCTGAGAGGCAGAGGG
-TTCTCCCTAAGCCAGGGAAGGACAAGGCAGGGCAAGACAGAAACTGGGCCTGGGGCCAGG
-ATTCCTGAGCTGGGGCTAGATTTGCCCAAATCTAGGGCAGGGCTGACTGGGTCAAGCACA
-GCAGGGAGCCAGGGTGGGTCGATCCCCCTGCCACAGGCTTCACTCTTCTGGCTCTGGTTT
-CCAGGCAGTTCTAAAAGCCTCCCAGTggcccagtgcagtggctaacgcctgtattcccaa
-cgctttgagaggccttaggcgagcagatcacttaaggccaggagttcgagaccagcctga
-ccaacatgtcaaaaccccgtctctactaaaaatacaaaaattagccaagcgtggtggcag
-tgcctgtaatcccagctacttgggaggctgaggcaggagaacccaggaggtggaggttgc
-agtgagctgagattgtgccactgcactccagcctgggtgatagagcaagactgcatctca
-aataaaataaaataaaaaaaTCAAATCAAATAAAATGTCTCCCAGAATACACCACCCCAG
-CAAAATGGCAGGAGGGAGTGTCACCTGGGGACCTCCACTTTGGAGGTTTGAGTGGGCAGC
-TTTAAGCTGGAACAGTCACTCTTGCTGTGGGTTCTCAGGGCGGAGACTGAGCCCCCACCC
-TGCCTCCTCAAATGCATTTCCTCTCAGCTCCCACCTGCCAGCCCAGGAGAGAGGGAGGGC
-CATTCTGTCCTTTTCCTGCAGAGTCCCTTTGTTCAGTTGGTGACCAACATCCTGAAAAAC
-ATTCTCAGGAGATCAAAAAGAAGAACATTTTGGTCTATGTGGTAGGTTGGCCCAGTGCAC
-CACGCCCAGTGCAGGTCCCTCTTGAAACCACCTTTGGGAAATTATGACTGAgacaccacc
-tttgcaaaattatgactgagacaatgagagatctttttttttttcctttgagacagagtt
-tcgctcttgttgcccaggctggagtgcaatggtgtgttctcggctcactgcaacctccac
-ctcctgggtttaagcgattctcctgcctcagcctcccgagtagctgggattacaggcacg
-cgccaccatgcctggctaatttttgtatttttagtagagacaggtttctccgtgttggtc
-aggctggcctcgaactcccaacctcacacctgaggttgcctcagcctcccaaagtgctgg
-gattacaggcgtgagccaccacgcctggcccacagtaagaggtcgaacttaacctactct
-atcttgcttctaacctccaagctgtccttgttcattcctgggcataagctgaactaacct
-tgggagaaacttagtttatactttaaacagccctttcccaaagcagacctccttcttgcc
-tggggactaagctgcctttgtaggactaacattagccacaaaattagaaattttggttta
-ggagtcatgcagctggaggctacaagatcctgaccctccctaaactactcctgacatcag
-ggcttgagatatttttcagaccctgcacttgatggatcagctggcatcacccacgtcaat
-aaactggctcatctgatcttgtggcccccacccaggaattgattcagctcaggaagacag
-cttggactccctgtgatttcaaccctgaccaatcagcactcctggtgcactggcttctcc
-ccacccaccaagttatccttaaaaactcttctccccaaatgctcggagagacagatttga
-gtcataaaactccagtctcccacgcagctggctctgtgtgaattactctttctctattgc
-atttctcctgtcttgatgaatcggctcttgatgaataggcagcctgcaaggtgaacccct
-tgggcggttccaCTCTTTGCCCAGGGTGATGTTATTTCTCTCCAGGATGGCTGCAGCGGC
-TTCTGAGCCTGCTTGCATCTGGTGTGGTCCCTTTCAATGTCACGCAGGCCAAAGCAGCCC
-TCCATCTCTCCATGATCTTGGCTTCCAAGGTACTCTGTCTCTCTCTCTGGGTCGCCATAC
-TGGCTTCCATCAGGCCCTGGAATGCATCCTGCTGGTTCTATCCCTTGGCCTTCAAAAGTG
-CGGTTTCCTCCTGGAAGGCACCTTCTGCCTTACCTCACACTTCCTTCCCTCCTACCTGCC
-TTGAGATACCAGCTTGCAGGGGCATTCTTGGGAAAGCCGACCCCTTGGACTGAGTCTGGA
-GTTTTGATCTCTCTCTCTCttttttttttttttggagatggagtttcactcttgataccc
-aagctggaattcaatggcgtggtctcggcttaccacaacctctgcctcccaggttcaagt
-gattctcctgcctcagcctcccaagtagctgggattacaggcatgtaccaccatgcctgg
-ctaattttgtatttttagtaaagatggagtttctccatgttgatcaggctggtctcgaac
-tcccaacctcaggtgatctacctgccttggcctcccaaagtgctgggattacaggcatga
-gccaccgtgcctggccttttttttttttttttttttgagatggcatctcactttgtcacc
-caggctggagtgcagtggcaccatcatggctcactgcagcattgaactcctgggctccag
-caatcctcccacctcagcctcttgagtagctgggatcacaggcatgtgccaccatgccta
-gctaatttttgtatttttttttgtagagacagggtctcattatgttgcccaggctggtct
-caaactcctgggctcaagcaatcctcctgcctcaacctcccaaaatactgggattacacg
-tgtaaaccaccacatccagccCTGATCTCATTCTTCAGAGAATTTACCTAGCTGGTCACT
-TGGTGTCTGTAGGAGCATCGCCTCTCAGGCCTGCCTCAAAACTGCATTTCAGTTGGGAGT
-GGGGCGGGGGGAGGGAGAGTGTAGTTTGGGGACATCAAGCGTCTGTGGTGGATCTCCTCC
-CAAAGTGAGACTGCTTTTTAATGatatttattgagcacttactgtttgccactgcggtgc
-taagcactttgcacatactagctcagtgcatccttacagcaatcctgggagggaggtgct
-tttctcatccgcatgtgctgacaaggctgagAAGAGCTGGGTCTTGCACGGTACCTTAAG
-GGCTAAAGACCTGCAAGGATGGTGCATGAAAGCAAAACCAGAGAGGCGCCTTTTCCAAAT
-GCCAATGCGCCCTCCACCCAGTCCTTCACAAACCACATCAGCATGGATAGCACCACACTC
-CACAGGCTTTTCTGCATCTCCTTTGTGTGTGTGCACATGTGTAATTAATTCTGGGGCAAC
-TTCCTACATCAGTACAGAGAAACTCCTTGATCATTATCCACTCCAACATCCTTCCTGGGA
-GGGACTGACTGGAAACCCAAATGCCCTtgtaagggcaaatacaaaaactaaaataattct
-ccctggtgcagaaaaaggaaagaaacctcccgtttcctgttcttaaacactctagagcaa
-acactttagaaaacttctcaattatttctctgttcctttaagatgtgtctttttaaaagc
-caggtgagcctcctgccagttttacaagccagggatgttttcccaaggacctaggagcca
-tctctttggaaggtaaacatcaagattgcacccttctcatccagtctccatgggcagata
-ggagcctaacttcagtgcttggctccaagttgcaaaacaatccatcgtctatcataaaga
-tgtgagtttatattttctctggataaagacaattagctaacacagatggccactccaatt
-accaggtgaattcgggatgaaataagttgcaaattgtgttgtgcagtcatctgactcgag
-aactatttttttttttttgagacagagtctcgctctgttgtccagtctggagtacagtgg
-tacgatctcagctcgctgcaacctctgcctctcaggttcaaacaattctcctgcctcagc
-ttcccgagctgggattacaggcgtgcactaccacacctggctaatttttgtatttttagt
-agagatggggttttgccatgttggccaagctggtctcgaacttctgactttaagtgatct
-gcccaccttggcctcccaaagagttgggattacaagcatgagccaccaccccggccctag
-ttattatttgaggacatgtatgcaataggttatacctgcttggttatataggaggacgaa
-atgtatttctctttgtaatctcttttgtggattgcctgtgatgcccactgcagtctggtt
-taacgcttatttaataataaaactgttttctcttctacttttgtggaaaggttttctgga
-ttagATCTTTAATTTTGTCTCCAGCATCTTCaaatgtctttctacagagggttggttaaa
-taaatgtggcatctccacaaaagagaatactgcacagtcatggcaaaaaaacaaggagcc
-tgttttcgttgttgaatgaaaagtgcaaggtgcacaacagtttactactttttctgtaaa
-aaaagaggTCTGAGAAGGCTGTATTTGCCATTTGTATAATCTCTGGAAGGGTAAACAGCG
-ACTGATAAAAGTGCTCgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtTAAGAGAAAC
-TGGGCAGATGAGGGAGAGGAAAGGGATGAAAACCTTTCTCTGTACACCTTATATTTTCTG
-ATTTTTTGAAACACGTGACTGTATTACCTATTCACAGTAAGTTAACAGGGATGGGAAGCA
-TGGTGGTGGCAAGCAAACGAAACCTCTAAAAAGAAGTCCCAGGggccgggcgcagtggct
-aactcttatgatcttagcgctttgagaggccaaggtgggcagattgcctgaactcaggag
-ttcgagaccagcctgggcaacatggtgagacctcgtctctactgaaaatacaaaaaatat
-gccaggtgtggtagtgcgcacctgtagtcccagctactccggagactgagaggcaggaga
-gtcacttaaacctgggaggcagaggttgcagtgagccgggatcacaccactgcactccag
-cctgagcaacaggcaggactctgcttccaaaaaaaaaaaattagccaggtgtggtggtgg
-gcacctgtaatcctagctactcaggaggctgaggcaggagaatcacttgaacctgggagg
-cagaggttgcagtgacctgagattgcgccacggcactccagcctgggtgacagagcaaga
-ctccatctcaaaacaaaaaaaGCCCCAGAACCAGACATCCTTAAGCACTTGATTCTGTTC
-ATTTCTGAGCTCAGCCTTGAGCTTAGAACCAAGTGAAAACTAATTACACATTTTCGGAGT
-TCACATTAAACttcttctttttaaaattattatttttgagacagaatcttgctctgtcac
-ccaggctggagggcagtggcacgatctcagctcactgcagcctccacctctggggttcaa
-gcaattctcagtctcctgagtagctgggactacaagcatgtgccaccatgaccagcaatt
-ttttgtatttttagtagagatgggtttttgccatgttggccaggctgatctcaaactcct
-ggcctcaagtgatctgcccgccttggcctcccaaagtgctgggattacaggtgtgagcca
-ctgtgccATGCCTGAACTTCTCCTTTGAAGGAAGATCTGAGTGTAAAAGCAGGGAATGCC
-TTTATTTAAAAAAATGAAAAACAGAAACTAAAACAAAATAACAATCACCTCTGTTGCCTC
-CATTTGAGAGAATACTTCCAGGGGCTCTGCATGTCTGGTCCCCAACCTGGTCGGGGAGTT
-CACTTTCAGAGGCTCAGGGATGGGCCTTCCCCAGCCCCACCAGCAAATCATCTCTCCCGG
-CTTCCAGGAGGGTACTTACTCTCCAACTAGTGGGCTTTATGGGCCAGGAAGGATGACAGG
-AAGGGGTGTGTGGGGTACTACGTCCCTCCACACTGAGAATCCGAAAGCCAAGATGCCCAA
-GATTCTATCGTTATCTGCTTGTCTTGTAGAAGCCCCTCTGTGAGACTGAGGGGCAAAGGA
-GAGAGGGCAGGGGCGTGTCTCAACCCTTCTGGCCACTTCTAGGTTGTGCAGACTGCCACT
-CTTGTTACTACGATGGACTGTCAGATCAGCAGGTGGCCCAGGAGGGCTTGCTTGATGCGG
-GCTGCTTTTTCCTTTTGCCTCCGTGCCATGcctgtgaggtagttggtacttactggaatc
-cccactgcatgcatgaagaaacaggcacagagaagccaaatgactttcccaaggtcacac
-agcctgaagggacagccggctgtcccagctgtttcccttctaacacccttgggcctgcct
-ccagctagatgctgcAAATCAGTCCTCTCTTGAGAGTCAAAGCAAAGGAGATCTGAGCTG
-GTCGTCACAGGTAGTGTGACACAGAGTTGGGGATAGAGCCGCACCTTGCATTTCCAGGTG
-CCATCTTCCCCACAGTCCCCAGTGGGCACTTGCGTTCATGATTCAATTACTCAGGCTCTG
-TCTCTCTGTTCCTGCCCCTTGCTCTGTGACCTGGCCTCTCTGGACCCCAGTTCCGTCCGT
-GAGCGATGGGGGCGGGGTCGGCGGCCTGCCTAGGCTGGACAGTGCAGATTGCAGAAGTCC
-GCGGACGAGAAGAGCCGCAGCACGTTGACCAGAGGGAACATGAGCAGCGCTCCGAGCAGC
-GAGCCCAGCTGCACCGCCGCCCCGCACCACAAGAGGGCGCTGCGGCTGAGGTCGCGCAGG
-ACCACGCCCAGCATCACCTTGACGTAACTGAGGCAGCCGCTGAAAAGCACCCACGAGGCC
-ACCTGCGGGGCCGGGAGGGAAGAGGTGCAGAGTCACGGGGCTTGCGGGGCGAGCGCCGGA
-GCAAAGAACTCTCACAGGGCTCAGGGGAACCCACGGAATACTCTCTAGGTGCGAGGAGCG
-CCTTCTGGGAGTGAGCCTGCGGGGCCGACGGGTCCCATGAGTTGGCCGCCCGGGGGCGAA
-GGAGAATCCAGTGGCTTTTCTGGGTTCACGTGCCCATGATCAGGGCAAGGGCCCTTGAGA
-GAAGGCCCCTGCTGAGGTACACATGGTGGGAAGAGGCCTACCAGTCACCTCGATTCCCTA
-AGCCTCCACTCCCAAATGAGGAAGGGGCGCTTCCCCCACCTGGGGCTTCCCGGGAGGGTC
-CCACAGACCCCGCTCGCTGGAAAGGGCCGCGCCCAAGCTCTCCCAGGCCTTGGCTAGGGG
-TGAGGGGTACGCAGCGGGAGCAGCCCCACCGGCCGGATACTCACAATGAGGACTTCCCCA
-CCCCAGTGGCCCTGCAAGAGGGGGCAGGGGCTCATCACCGCCATGGCCATGTTGTAGCCC
-CCAAAGCAGGTCCCAAGCACGGAGAGGACCCCCAGGAACAGCAGAGACCTAGAGGAAAGT
-AGGGGAGGTGAGTGGAGGTGAGAAGCCTGACCTCTGACCCCCCCGCCCCACTGGGCGGCA
-TGTGGATGGCCAGTGTCTCCATAGTTAGTTTAGACCCATGTGGAAAATTCCAGGTTGCCT
-GGCTCAAGTGGGTCAGGGAGGCTCCTGAGCAGGCAGGGCTGGCCTGAGTCATCCCCAGCA
-TTAACGGCAGGGCCTGGCACCCCGgcaagaaaaacataatggactctggcaccggatggt
-cctggttcaaatcccagttctactgtttaagctgAGACTCGCCTCTGAGCCTCCAAATCG
-GAGTTTTGCAAGGCTGCATGACCTCCAGGAGCAGAGCATGCAGGCCTGGCGCCGCTGTGG
-GCCCACCTGGTGTTTACCTGCTGGCATTTCCTCCTGCAACACACCCTCAGCCTCAGCCAG
-GAAGCTGAGTTGAAGTGAAGATGGCTGGATCGGGCATTGGCACAGTAGGGTTTGCTGTGC
-CTCCTCAGGAGACCCCTCCCCTTCTGGCCTCAGCTACCTGCCTCTGCAATGTGGAGTGTG
-CTGATCTCCAGGGGTCCTGGCAGCTGGCTTGTTGCTGCTAGGAGCATCTCTCTACAGGTG
-GCCTTCCATGCAAACCTACATCTGGGACCACTGTCCTTCCTCACAGGTCCTTGTCCCTGG
-GGTCCCAATCTCTAGAACCCCAAGACTGGTCCACGCCCTGGGTAAGAACAGACAGAGGTC
-TGCCTATACCCTTAAAGACTCTTTCTGCTCCAAGATTCTTGGATTCCATGACTCAGATTC
-TGTAATTCTAACATTTGGGGTTTCTTGGATTTGCAGGTCTGAGCCTTTGGTCCTGCTTCC
-CTCAAATCCTCCATCCTCTTTCCAGTTTCTAGGTCCCAAGGTAGAAAATCCAGCTTCCTG
-GCAAGCTTTCTGTCAAGCTCTTCTGTCCTCACTGTCCTTCTTCTGGGCTGGGAGAGTGGG
-TGTAAGCAGGCCAGTGAGGACAGGCAGGCCAGCGTGGATACGAGGCTGTAGGACCCACCT
-CAAATGTCAAGATCCCAAGGTGGTAGTTCTCCTACAGGGGTCTGAAGCCCCTGCCTCAGA
-ACCGTCTGGTTTCCTTACTAAAAATTGAAATCCCAGGTCCCAGTCTAGGCTGGTTCAATC
-TGCATTTTATCAACTTGCCCAGCCATTCTTCTAGAACTGTGGCTCTAAGGGAACCAGCAG
-GAGGTTAGAGGCAGGAAGGCAGGGCCGAAATCCTGGGAATTAGACCAGGTCAAGCTCTTT
-CTCCAAGCCTCAGGGTTTCCCCTTATAAACGGGAACCTCAGTGGCTATCTGCTCCTCCTC
-ATGGACTGATGACaatgatggtcaacgcttaggctggacctgccacgtgccaggcaccgc
-tccaagagctttatagaatcagctcatatcatgcttccagcagtcctaggaggtggaatg
-ttacactcccattttccgataaatatccctgaggcacagagaactgaagtgacttgtctt
-acacacagctgacaggtggcagagctgggatttggaccagggtgctccccaaacatgttc
-ttaaccactaCATGTACAGCCCAGTAGGTGCGTTTGGAATTCTGGGTTCTGAAATGAAGT
-GTTCCCCCACTAGGATTCCCTAGGACCAGATGAGGGCACACCTGTTAGGCAGGAACATGG
-AGACCAACGAGGCAAGAGGGTTGGCCACAATGCTGAGGGTGGCAGCCAGGTGGTAGGCAA
-CTGGCCCATAGGACAGGCAGGAGTAGGTCTGCACAGAGGGCAGCATGCCGTTGGTGAGCG
-CGTTGACGAAGGCCACCAGGGTATAGATGAAGGCCAGGTGCGCCGGGCAGCAGGGGGCTG
-CTTTCTCCTCTAGATACCCCTGGCCCTGGCTGCTGTCCACCGTGCCTGCAGGGCCCAAGT
-CATTCTCTTCCCGCGGCCGGATGGAGTGGAGGGTGACCTGGTCATTGAGGAGGTCTTCCA
-CGGAAGCCTCCCAGCACCTGGGTTGACGCTGGAGGACAAAGAACGCCACGAGGCAGCAGG
-CCATCATGATGGATAGGAGGAGGAAGAAGACCAGGGGTGAGAAGTGGGCGGGAAGGTAGC
-GGCTCTCCAGGTGGGACAAGGGTGCTTCCATTCCGGGGAGGGCGGACACCAAAGCTCTGG
-GAACTCCCTGCAAAGGACAAGACAGATCCCTGGTCAGGGGAGGGGATCAGGCTGCAGAAC
-AACAATCATGACAGTGATAACAGAATACAGATCACCTGTTATTATTAATGGATAATGAAT
-AAATAAACATAACTAACAAGGTGGCAAtaatgactgctcatactgactgcccactgagca
-cgggcactgtgcatggataagcccctatgcctcctaacagggctgcacagtgggcaccat
-catcccccattttagagggaactgaggtatcagaatgcttcgtcccttacctgagggtca
-cagggagaatgtggcaaagccagactccacctggtgctttctgacttggaagctacacct
-tttatcaccccacAGCAGTGGCAACCACAAACATGTTCAGAGGAGGAGCTAGCTGGAGAC
-TGAGCAGTGGAGCCGCCCACCTAAGAGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACC
-TAAGGGGAGAGCCCCCACCTAAGGGGAGAATCCCCCACCTAAGGGGAGAGCCCCCACCTA
-AGGAAGAACACTGCTCCACCCATCGTCTAGGAAATAAGGGCCTTcaggacatgccatccc
-aaaatatgactgtaggaggccagaatatgccaccccaaaattgacctattggcatatttt
-ttatttctagctggttattttgaaaaattgcaggctaaggagtagctctgaaaagttgcc
-attttgtaagataaatttacatctaaaggaaatttttattagtaaagctatcttatctgt
-accaagaaaaggtatctgtaccacgaaggggtatctgaaccaggaagagaaaggtgatgg
-cctttatcacccgaggaacttttatctgcataacagtgcaatgtttattcaccataagtt
-tcctcccttcactctcccataatttgtctccaccatcctgcagtagcctcaagcccctat
-tcccttttgtagctcaggatgctatagaagctgaaatcatctggcccttttttgagtctc
-atattttttggggactcccatgcgtatgtatgtaagtaattaaaatgagtttcctgctgt
-tgatctgccttatgtcagtttaactcataggccgaccaaagaacctagaaggatggaggt
-gagcagtttttccctcccctacaTTTGTGATAAAGCCAAGTGCTGAGATGGCTCCGGGTG
-ATGCTGGGTACCTGTGCGATGTCAGTCTCCCTCGTGGGTACAGGGCTTGGTACGCTGTCT
-GATATCTCAGTGACATTGACGCAGGTAGTGAGACCGGAGCCCTGGGCAAGAGCCACCAGG
-GCGGGCAAGAGGCCGCTGAGTCCTTCACCCACAAAGAAGGTGGTGAGGTAGTAGGTGGGC
-AGCCGGCTCATGAACGGCAGGAAGGTCACTGAAGAGGTGCAGTCCACCAGGGCCAGGAAG
-AAGGTGAGGACCAAGAAGGCGATGCTGTGGTGGCCGTCCAGCACCCAGGAGGTCATATTC
-CAGAGGAAGGCAAAGATGATGCAGGTGACGGTTCCCACGCCCAGCAGGGTGAAGATGATG
-GGCACTTCGGAAAGGCAGCTGGGCCGGAAGTGATGGAGCAGGGTGACCAGGAGGGGCCCG
-ATGTTGGCCAGCTGGATGACCACCGTGAGGTAGGAGGGCAGGTACCAGCCCTCGGGCAGC
-TCCATCACCAGCAGGGGCAGCTCTACCCAGAGCCCATTGATGGTCACCCAGGAGCCCATT
-CCGAAGACGCAGACCAGCAGGTGCATCAGGAAGGCCATGGCGGTATCTGCCCTGGGCCAG
-AGGCTTTCTCAGATCAGCCTGCAGCGGGGCTGGCAGAGAAGGACACCAGGTGAGTAATTC
-CAGCTTCACCACCTAGCAAGATGCTGGGACCTGGGGCCCAGAGTTTTCTCTTATTACTCC
-CCTTCCTGTGAACAAGCTGGCttttttttttttcctttgagacatagtttcactctttta
-gtccaggctggagtgcaatgggatgatctcggctcagtgaccctctgcctcctgggctca
-agtgattctcctgcctcagtttcccaaatagctgggattacaggtgcatgccaccatgcc
-agctaattttgtatttttagtggaaacagggtttccccacgttggtcaggctggtctcga
-actcctggcctcaggtgatccgcctgcctcggcctcccaaagtgctgggattacagtgtg
-agccaccacgcctggccCAAGCTGTCTTTTTATTAGCAGAAAACAAGAGAAGCCTTTCCT
-AACCGTGATTCATGAAAGAAAAGTTCAATCCGACACACAAAAGCaaacaaagcagcttct
-gcaaaagataccaacagcaaggtcaaaagttaaatgaaaacacggggaaaacatttgcca
-cataaatcacagacaaagggctcatcttccttgtcaggcctctgagcccaagcctgcgcg
-tgtacatccagatggcctgaagtaactgaagaatcacaaaagaagtgaaaatggccggtt
-cctgccttaactgatgatattaccttgtgaaattccttctcctggctcagaagctcccct
-actgagcaccttgtgacccccacccctgcccgccagggaacaaccccctttgactgtaat
-tttccactacctacccaaatcctataaaactgccccacccctatctcccttcgctgactc
-tcttttcggactcagcccgcctgcacccaggtgaaataaacagccttgttgctcacacaa
-agcctgtttgatggtctcttcacatggacgcgcgtgacattcctaatatataaagagttt
-ttaaaaatcaagaacaaagagaccccatatagaagagggccaaggatatgaacaattcag
-agaaaaaggtacaaataagctttaaacacatgaaaatattatcaccttcattcacaatag
-gaaaactactccaggtgccatttctcaccatgagattgtcccaaagcctgacaaaatgac
-tcatgttcaaggttattatagattgcgatcttgttggtaatagcaagttatgggaaattt
-tctcctgggtggctaccaacagagagggggctaattaaagggacctgctggaataccaca
-tacctgtttaaaggaataagaaataaggaaagcagatcttggtgactgataaggaaaggt
-ctccaggctataataataatcttgaaacaaaatcaaggcaggtaaatggaaccaggaaaa
-agtgtactgccttttggtcatagaagaggaggaaaaacaTGTTTTCTTTGCTTGTACTTG
-CACAAAGCAACCCTTGAAGGACACACAGGGACTGCAGGGATGTTGGTGATGCCTCTGTAT
-ATCttttttttttttcttgtgacagagtcttactctgtcaccaggctggagtgaagtggc
-acaatctcagctcactgcaacctctacctcccgggttcaagtgattctcctgcctcagcc
-tcccaagtagctgggactacaggcgcccaccactacgcccagctaattttttgtattttt
-attagagatggggtttctccgtgttagccaggatggtctcaatctcctgatcttgtgatc
-caccctcctcagcctcccaaagtgctgggattacaggcatgagccaccgctcctggccCT
-GCCTCTGTATATCTTTTAATAAGAGTTTTGATTTGTGAACCATGTAAACATATTACCTGA
-TGCAAATATATGGTTACCTGAAATAAGATTTCAATCTGGCTTTTTTTCCTCCTGAAATTA
-TATCACTCTCTACGTGGCCTTTGGAGACCACTTCCTCTAGCCCTCCAGAGCCATTCTGCC
-ATCTGTTTACCCCTTTGTCAGCTACCAGTGGCAGCCCACCTGTGCTGTTACTAACAACTT
-TCTTCTATCTATCCTTAGTCTGAGCAGTAATATGGGAGATGCCAGGAGTGAggctctgga
-gccagctgtttgagtttgaccctggctctgctgcttacaatctgggtgaccctgggcaag
-tggctttgcctctctctgcctcatctcctcatctgtaagtaggggatagtgatagtatga
-actccgtggtttgttgtgagatataaggatgctggtgagtttatgctgtttccaacagtc
-ccagcatagggtaagcacctctaagggttactgatcattATCGTGAAATGGCAGGTTTGG
-TGACATCGTTATTTTTGTCTAATTCACATGAGAATTAATACATGACTATGAAAATTTAAA
-AAAGGAAAAGATTCCCCTACTAGGTATCAAGTGAACTCACCAGTGGTATATGCACCTTTT
-TGTAGAGACACGCTAACTGGGCCAATCTTCACGTTTTGTAGATGGGAGACGAGGTCCGAA
-GGGGCAGAGGGGCTCTCCTGGGATCTGGACTGGATCCTCTGCAGCAAGCGGCCTGTCCGG
-GACTCCTCAGTTCACGCTGCAGTCTTTAACTCCATACTTCTTCCTTCTAGTACAAAGCAG
-GAGTGTCCGTTGTGGCCACGCCTCACCCAGGAAACTCCTGAATCCTGGCAGCTCCTCCCC
-ACGGTTCCCACACACGGAATTCCCTCACAGGGCTGGGACTTCCTTCCTCATACCTTCACT
-GAGCGAACCCAATGCTCAGTGGCCTTTCTGGTCACCTCCTTTTCCTCTCTGGGAGGAGCC
-ACTCCTGGGGTGTAACGCAGTCAGATCCCCTAGCAGTCCCGCTCTGCCCCCTCCCTTCTG
-GGGGCCTCAGACTCCATTCCCTCCCTTAGGAAGCTGACTTGACTAATAGCACAGGTGAGG
-CCCACTCCAGGCGTGCCAAGAGGACCCAAGGAGGGAGGGGAAGCTCCCAGACAGCAGTGG
-CACAcctttgcctgtgctgtcctcccagcctggagcaccagccccctctgctgtccacat
-ccaagctttctacaagactccgtcctccaggagacctctggctgcctcaccttctcaggc
-gtcctcaccagggcccatgaccccttcatttcaggttgttcttgtgtgggtgcatgcagg
-cacataccttgagactgaagctttttgagggcaggggctgCTTGGGAATCTGACATTTTG
-AAGGTGGAAGGGCCTTTCTCAATGACTTAGCTTAGGATTTGTAAATTGTTAACTCACTGG
-CCACTGCCAGACAGCAGATATATTACTTTGGTTTGCCCAGTGTGTTTAACAATTTGTTAC
-TGTAATCAGCAGTGGAGGGGATGGCAAGCAACCTTCAGCATTTCTGGCTTCTCAGGAATA
-TTTTGGAAGAAGTGGCCCCCCACTTTGGCCTCTTTCTCTGTTCTAGACTCGGGCCATCTT
-GGAGCTCTCCCCTGCGGTAACAtctggaaccagttgcctgggttcaaatcccagcttcaa
-cccttacaagctgagcaagtgacctaacctcctgtgcttcagagtcttctcttgcaaaac
-agctataggctgtcagtaccaacatcagaactgttgctaggaacatgcactaaagtgcta
-aaactgtgcctgccacatagtgagggctcaatgaaCCATCATTATAAGATTACTATTTCA
-GCAAACGTATCAGTTGCATTCAAAAACATGTAGTTATTggccaggcgcggtggctcacgt
-ctgtaatcctagcactttgggaggatgaggcgggcggatcccttgaggtcatgagtccga
-gactggcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaattagcccag
-catggtggcgcacacctgtaatcccagctactcaggaggctgaggccggagaacggctcc
-aacctgggaggtggaggttgcagtgagccgagatcatgccactgcactccagcctgggca
-acagagcgagactccatcttaaaaaagaaaaaataaaaaaaaGGCGCAGtttttgttaga
-caaatggccactcaactaaaggactacatttcccagccttctttgtagctgcacatggcc
-atgtcatcaagcacaggccaatgaattcaaatgcgactttgagtagtctccttagcccgt
-ttcctgtttagaaaaaaaagtgcagctcgttgccagcactcatttaattttatgtaaacg
-tgctatttgaggctgaagcaaatctgattctgactgctgttttttttttttttcttttga
-gacagagtcttactgtgtagcccaggctggactacagtggcttgatctcggctcacagca
-acctccgcctcccgagttcaagcagttctcgtgcctcagtctccttagtagctgggatta
-caggcgtgcaccacaatgtccggctaattttttatatttcttagtagagacggggtttct
-ccatgttgccaggctggtctcgaactcctgggttcaagtgatccccacgcctcagcctcc
-cagagtgctgggattgcaggcgtgagccaccaagcccagccctaaatctgactgattttc
-aatgtgaaaataacatgtaaaaactgtttttgaagttatttctaaccagaactaacatca
-gactcatctatttcagaaaaactggattcatcaaacgaatctttggtcaacaactgttca
-agaacaatgttaacatcacacataggaatgctaggatttgctattttcagcgatcgagaa
-ttactttgttttgtaaatggaaataccacgactaaaaccagaatgctacaaatagagtga
-tgtcttttgtttccaaagtcaatatactagagcaaggcaaaaataataataaaagcgagg
-tattttgtggcaaagttatcttggggtaaacactgcagtcacaagtgggtattccttctg
-gcaaacagggaaagagttaacaataagggagtgtgcccttctgctcttcctccatttggc
-tgtctggaatcagatgtgatggccagaactccagcaacgattttgtgctatgaggcatgt
-ggtgggggttagatgcatactaggctcctttgggattttgtggcagagagcacccatacc
-agccctgttttgcctgtgttgaactgttttgtttgtttgtttaatgttgttgttaaattg
-taaaagaaacttctatgttgtttaagtcactcttattttATGTACAACAAAAGTACTCAG
-Aggctgggtgcagtggctcactcgtataattccagcactttgggaggctgatgttggcag
-atcacttgaggtcaggagttcaagaccagcctccaactggtcaacatggtaaaaccctgt
-ctttaccaaaaacacaaaaaattagccaggtatggtggtgggcacctgtaattctagcta
-ctcgggaggctgaagcaggagaattgcttgaactcgggatgtggaggttgtagtgagcca
-agagcacgccagtgcactctagcctcggcgacaaagcaagactcttgtctcaaaaaacta
-aaagaaacaaacagacaaaaaCTACTCCATACTAAGTGCACAGAGATACACATTCCAGGA
-TATATATTGAAAGATTATAGTAACCAAAAACTAATGAATACATTTATCTCCTTTACCACC
-TACTTTCTGACTCTGAAACTTAGGTCCTGTCCCAACCAGGATTTGATCAAAAATCAAAAT
-TTAACAAAAGTAGTTGTTTAGACCCTTGGGGGCAAATGTCTTGCAGAGATATGAAAAAAA
-AAAAAAAAAGGAGAAGAGAGAAAGAGGGAGGAACAGAGGAACACAGAACCCTCCATATAG
-CATTTGGTACCAAAAGTATAAATTGAGACCAAGAGTCATTTCATATATCAAAACTCTAAT
-TCATAAAGGAGTCAAAATTGTAGTGACTATCTGTATTCTGAATATTTCCTGAAATAGCCT
-CAGACATTCCAGGAGAAATGGACAGAAGCACAGTCCAGCAGTACAGGCCTGACTCACCCT
-TCCAGGTCAAGACAGCAGACGAAGGTGCAAAATAAACAAGGATATAGCAAAAGCAATAAA
-TGATATACCTAGTAAAGAGGGCTAAGTCAGTAGTTAAGGGGAGTAGGCGAATTTGCAGAT
-GATGGTGACCTTTGCCATATGAAAAGCTATTAAACTAATGAGAGTGTCCAGTTAAACATT
-TACAAACATCAGTAGCTTTCCCACAGAGGGCTGGATGGGGAGATGAGGGCAGACAGGGCA
-GAAGTAGCCTCACTTTCTTGTATGTTCGACAACTCCTAAGCTCTGAACGCCTAAATCCCT
-GCTCCCCACAAAGACGAATTCTCTGGTTTTGACCCAGGTGCTACCACGGCTGTGTCACTT
-GAGGGATGGGATTTGGCTCCGGGGGTCTGTTTCCTTGTCTGGAAACCAGGCACAGTGGGG
-GTGTGTCCCCACGTGACCCATCTGCCCTATGGCCCTGGCCCACTCCCAAATTATCTCCTT
-CCTCAAAAGTGAGGTGTGCTTTTGGACCTCGGGGACACAGTGAGGAACAGTCATTAATGT
-CAATGAAGGGGATGTCTTAGGCAGAGGGAACTACATGTGCAAAAAGGCCCCAGAGAAAAG
-GAGAGACTCAGAATGGCTGGTGTTCGGAATGTGTTGGGATACTTTTAAAAGATGCATATC
-TGTATtttctgttttttttttttttgttgttgttgtttgtttgtttattttACAGTGACC
-TTGCAGTTCTTatttattcattttaaccagtatttcttgggcaccaactgtgtgctcaac
-cacAATCCCTGCTCTCAGGAAGTTGGAGGAAGCATTCACGAAGCAGAATAAAAAACAGAA
-ACATAGAGCAGGTCAGATGGTGGCAAGGACTCCGGAGGAAAGCAAAGCTCCTGAATGGGG
-AATGTGCCGCTGTCAAGGAGAGgacatgaagggagtgtgggagtgagctgtctgcagaaa
-gcacggtccaggggagaaaacagcaagtgaaaaggccctggggtgcggccacacctgctc
-tgtcccagaagtggattttgctgttcaaaggacagctaggaggccagtgtggccgcagca
-gcgggagccaggttggaggggaggagacagggcaggtcccctgtggccctgtggtgacag
-cttgggtgttttctctagagcaaaaagctccgtgagtgggcagaagagaccagctctaat
-ctagtttttaacaggatcgtgctggctgttgtgaggagaaacatgaggcgccagggagga
-agcaggagtaaaccttcggagggttaggaagctgtagcaAAAGAGCTAACAATCACCATG
-ACAACAGTGACAACCATagctgccactcctcagctatttattgtgccagaccctgtgcta
-agctctttgaacacattacctgtcaaatcttgttccacaatcctgaggctggcattatga
-ttatctccattttacagatgaggaaactgaggtttaaaagggaaataaatttgcctaggg
-tcatacagctgggagctgagctttacatccaggcatgcttgactGTGGACCCAGCCCTGA
-GAAAGGCCTCAGGGTGAAGGGGTTCTGAAGGGGCCATGGGGGTCAAGCTGAGCAGGATCT
-CTTTCTGCTCACAGATGGCCTCCCAAGACTTGGGCCAGAGAAAGAGAGAAATGGGGTACA
-GGCTCAGGAGAAGCTGAGAGAGGCTCTGAGACATATCTGCTTCCCAAGGATCCAGGACCC
-CTTATGTGATCACCAGAGACCAGAAACCTAAGGCTTCGCATGAGACAGTTAAGATGCCCC
-ATAATGCGTGGGCGACAGATAGAGAAGCTAGAAGGATCAGTTCCAGGCAAAGGTTTCTCT
-TTTGCATTCTTGCATCAAAAGCTGTGAGCCCCCAGCCCAAGAAAGTGAAGAGAATTGGGA
-GTGGGGTTCTGACCAGGGCCAGTGCACCGTCATTGTGTGGGCTGGGCCATCTCCTCCAGG
-GAGCTCAGGCAGCTTCCATCCCACCCAATGTCCCCCGCCCCCCTCCACATTCTCCTGCCC
-TCTGTTTTCCTCCATCAAAGTATTACTGACACCAGCTCAGTTACGGGAGTTTATCTGTGT
-CTATCTGTTGAGCGCTGGTCTCTCCCATTGGAGTGTAATCTCCATGTGAGCGGGGGCTTG
-TCCTCTCCCCCAGTGCCCAGGTGACCATCTGGCTTGCCACGGGCTGGGCCACCTGAGCTC
-CTGGCACCATGGCTGGGTTCTCGCTCTGCAGGGATAATCTGCCAGCTGGTAGGCACCTAG
-CCCTGTGGGCCAGACTGGAGGAAACCCGCCTCAGCTATGAGGGTTGTGTTGGCCAGGGTG
-ACCCCTGGGGCAGTGCCAGGTGGCAGCCTGACACTGGATACATCTCACTCCTGGGCAAGG
-GTCTGAGCCAATTCTTTCCTGGGTTCCAGGCTCCTGGAGAACTTAGTGAGGCCTGTAGGC
-GTCTACTTAGGGCCTGGCCTCACCCTCATGAGAGTGGGTAGGAATGGACTGACTTTGAGC
-CCATGAAGAAGGGAGGCTGAGAGGTCAAACCACAAAACCCACagggagagatgggggaga
-tgaaggggagtgagagagaagagactgagacaaagagacagaaagaaccgaaagctagaa
-gcagaaatggggagaaaggacaacagaggcacagagacagggaaaaatgagaAGCTGCGG
-CTGAGAGGGAGGCAGGGAGGTGCCAGGAGGCAGGAGGCAGCTGGGGCGCTGGGAGCCTGG
-CCTCAGCCACCCTCACTGTTCACAGCCACATGTAGCAGAAGGCCATCTCTACCTCTTGTT
-GCTGGGACCTCAGAGTTCccctgaaactcatcccaactcaatgtccctattgcacaggtg
-gggaaaccaaggcccagagaggagatagtgcttccccgaACCCTGCCCCACCCCTGATCT
-CAGGCTGTGGCAGACattcaggcctgtgctcaccggctgtgcaacctcaggtcagctgct
-caccctctctaggccttggtttctccatctgtgaaagggTCTGGGAATGCCCAGCCTTTC
-TGGGCTCAGCAGACCAGGAAAAAGGGAATGAGATAACAGGCGCTCAGCCTGGCCAGTAGA
-AGCGGACAGTGAGTTCTCTTCCCCCTTCTCCTCCCTCCCAAGGCCAGGAAGGGCTTCAGG
-CCTCCCATGGGGCTGACCTTGGTGGAGCAGCCTCCCCCAGGCCAGTTCCCCTCCCCTCCA
-CGTCCATCCCAACTCCCAGCCTCCTTCCCAGGCTCCTGCGGCTTCAGCCTGGTCAAGTTG
-TTCCGAGATAGCATGGAGATGGCCCTGGGTAAAGTCAGTGGGGGCCCAGTCttttttttt
-tttttttttttttttaagacaggatgtcgctctgtcacccaggctgaagtgctgtggcat
-gatctgagctcactgcagcctcaaccttcctggctcatgcgattctcccacctcagcctc
-tgagtagctgggactattaacccatgccaccacgtccgacctgggtaatttttgtatttt
-ttgtatagatggagtttcgccacgttgcccaggctggtcttgaactccctgagctcaagc
-gattcacctgcctcagtctccagaagtgctgggattacaggcgtgagccatgacacccag
-cATGGGCCCAGCCTTTTGGTCTGGAGGCACCAGGGGTCTGGAATTCACCTGGATGGCTCA
-GCCTGTCCCGACTCCAACATGCCAGCTGAGGAGGAAACCTTTCTTCCCTCCTGTCCCTTT
-GATCTTTCACCTGGATGGCTCAGCCTGTCCTGACTCCACATGCCAGCTGAGGAGGAAACC
-TTTCTTCCCTCCTATCTCTTTGGACTCTCCCGACATGGCAGCCTGAAACTAGGGGAAAGG
-CCACGGGACACCTGCTGGCTCCAGATAAGTGCCCCTGCCATATCCTGGTCAGTGTCCCAT
-GCTCCTAGCTAGCAGGCAGCCTTGGTAGCTGCAGCTGCACCCTCACAGGCCTGAGCCGCC
-CCGCTTTGCCCACTTACCTGCTGGTCCAGTTCCCCAGCCGCTCTGCATGGGAGGGGCCAG
-AGGCAGCTCGTTTTGTATAAAGCTGTCCCCGCCCAGAGCTCGGGGAAAGGCAGGCGGAGG
-GTGGGTGTGGCTCCCGGCAAGACCAGGCGCCTACTATGTGTCTCTGATCTGCCCTACAGC
-CCAGCTAGGAGGAGGATCCAGATGGTAGAACTGTATAATAAAGGGCTTGCTTTATTGAGG
-CTCTCTGCCACCCAGATTTCATGAGGGTTGATCCCCAGTTGACAAAAGCTATGTGCAAAC
-AGTTGGTTCTGGCATCACCCTGAGATCTCCATAATTCCTTTCACACAGGAAGAGAGTTCC
-CTGGAGCAAAAACAGTTCAAATACTGgtgcttcagtaagtcatgtggaaagcggggataa
-taatagtgccctcttcataggACAGAAATCCTAACTGCCAGTGTGCACTGAgctgactca
-gtgtcaggcatgttcttggggcttgagagaaattaatgcatttaatcttcatggcctttt
-ggagagatgctattactatccctattttccagatgaagaaacaggcccagagaagtcgag
-agccttgtgtaggtcacacaccttgtatatggcagaactggTCTCTGATGCACACTGAGC
-TACCCTGACAAATACtgtaaccacctgaggggttctttctgcccactgcataaagaaaga
-ccatgaggctggccatgccacaggggaaatgagtttgttcccaaatcatcttcaaagctt
-gtaggtgaggggtttttcaaaggcagtataggggaagagttgggggtggccaggtaacag
-gtgcttgctgctgattggttggggtggagatgaaatcatagggggttgaagctgtgctcc
-tacaggctgaatcgcttttggggggggggccacaggagcagggttggcggtcctggtgga
-gacatcaggtttaggtggagccatgggtgtcaaatctgcaaaaaacctggaaagatggcg
-gggcgtggtgggtcatgcctgtaatcccagcactttgggaggccgaggcgggtggattac
-ctgaggtcaggaattcaggaccagcctgaccaaaatggcgaaaccctgtctccactaaaa
-atacaaaaattagccgggcatgatggcggacacctgtaatcccagctactggagagactg
-aggcaggagaattgcttgagcccgggaggcggaggttgcagtgagccgagatcgcgccgt
-tgcactccagcctggacaatagagcaagactctgtctcaataaaaCAAaaacaaacaaac
-aaacaaacaaaaaacaaaaaaaaaacaccaactggaaagatatctcaaaaggccaacctg
-caacagtggtgttatttgcaggagtaattggggaagttgcatatcttataacctccagaa
-taatggctggcaatcatttatgtctacaccttaggaggacccaggctcctcttctttccc
-cagcctgatggcctctcattaactttacaaaagtggttGCTCACAGTGCTACGGCCTGTA
-AGTGCAGGGCCAGGATGTGAATGCAGACTCAAATTGGTGCCTCCatggatgtaaaacata
-ttgcacagattctgacacctagtaaatgctcagtGCATATTGACTTCTACAAATAATTCT
-GGCCTGCCTGTTGTGTTATTTTCCAAGACATTCATTTACTTAACAAGCAATCAATCACTC
-TCCAGGCTAATGCTTGGGGCGAGAGGTGAGCAGGCACTAGGGAAGGGGCCAGACCCCTCG
-CTTAGCAGGCAGGTGTTCAGGAAGTGTTGCCACtgttggggctcaggacatacacacccc
-caaaatatgactctgggaaaccagaatgtgccacccccaaatacacctctttgacatact
-ttgagctggttattcagagaaactgcagacacaggagtagctctggaaagctattctttg
-gtaaaagaaatttacatctatcaaggaaatctacattagtaaaggtgcctgtatcaggaa
-aaaggctgctccagaagaattaccctagagactttcttttttttttttttttttaagata
-caatttcacttttttttgcccaggctggagtgcaatgctgcaatctcggctcactgcagc
-ctccgcctcccgggttcaagtgattctcctgccacagcctcccaagtaactgggattata
-ggcgcacgccaccatgcccagctaattttgtatttgtagtagagacaaggtttcaccatg
-ttggccaggctggtcccgaactcctgacctcaggtgatcttcttgcctctgcctcccaaa
-gtgctgggattacaggcttgagccactacactggccaccagacagacttttatctgcaca
-ggaagacaaccattatttaccatacaataattcttcccctcaccctcccataactgtgtc
-tccgccaatcccccaaagccctaagaccctattccttaaacttcaatcatctgacccttc
-tttgagtctcatattttgtgggatttccacgcacagatatgtaattaaatatggtttctc
-tcctgttactcagtttcatgtcaatttaattcatagcccagccaaagaaccatgaaaggt
-ggagggaagccatgtttcccttctctataGTACCAAATACTTTGGATCTGTtaaaaaaaa
-attgcaggactctaaatttatgatgccaagggagaagttaagccttgcagagtgTGAGTT
-ATGTGGCTTGCAGGATGGCCACTTTCTtcttctttttttttttttttgagacggagtctc
-actctgtcgcccaggctggagtgcagcggccaggctggtctcgaactcctgacctcaggt
-gatctgcctgccttggtctcccaaagtgctgggattacaggcatgagccactgtgcctgg
-cCAcaatttcatacttatctctgccaaatactataaggtgtcaaaatttggcatagaggg
-tacaaaactataactcaatccaaacagaataatctttgcttgtataattttttaataatg
-aaacatcaatattggtttaataaaggcagctatatcttgaactatttagttaaataccct
-aacttctaatcctgtggccttaggaagtctagtctacagacgtgaaggaagtttctttag
-ggaaaggacttatcatctttgatattaaagaaaagagaatttatataaaaataatcttat
-atggtaaattcttgttctaaagtaaatgaattggttgtttaaaaagaaggatgtttacaa
-cgagtcagaaagttgaggcatgtcagagattgtgtaaattgtaaaaattttataaaaggg
-aatttatgcaagaaatgttgtacagtttaaaagtgatgagggggccgggcacggtggctc
-acgcctgtaatcccagcactttgggaggccaacgcgggtggatcacctcaggtcaggagt
-tggagaccagcctggccaacaagatgaaaccctgtctctactaaaaatacaaaaaattgg
-ctgggcatggtggtgggtgcctgtaatcccagctactcgggaggctgaggcagaatagct
-tgaacccagaggcagaggttgcagtaagctgagattgcaccactgcactccaggctgggc
-gacaagagtgacattccatctaaagaaaacaaaaacaagagcgactaggcctcctgaatg
-ctttataaaatgccaccataactcttaactgtacaacttgcctgctttgtagctgggtaa
-gacctagcacacatggagttaaatgctggaataagtcagaccttatctgcacttctgtct
-aggtcctaggctctacatctagtacataattacaatctcaaactgactaacaaaagtaaa
-agttgctaaaagttaacagtgtaacatgtattgttccatagaaagaatctaagataagac
-tgtaaagctgaggctagccgtggaattgtaccattaaatacctatgagtttcctcttgag
-gttgcaagataacctagggttcccggcctctcagaaagggcattctttgcttaccacaga
-tcagaagccctatacagggactgtgtacacaaaatataaggccagtttccaagggctttc
-ttggcttcgtaaatcaagtttgattccttaaaggaaagcataccattccagtcaaggcct
-tggtaaaaaaaccagtttttccaattgtgtcctgttacaaaagaaaacagattcttatta
-cacttgtgcaaataactatatcgccataacttaagaatactcacagatagtttccaaatt
-ctggagaaaatcagggagagagaaacaagtatgctacaaattttgttcatgggagtatac
-taaattgttaaaagctgttaatagctcaaaagaaaaatttcgaggccggatgcagtggct
-catgcctgtaatcccagcactttgggaggccgaggcgggcggatcgcctgaggtcgggag
-ttagagaccagcctgaccaacatggagaaaccccatctctactaaaaatgcaaaattggc
-tgggtgtggtggtggcacatgcctgtaatcccagctactcaggaggctgaggcaggagaa
-tcgcttgaacccaggaggaggaggttgtggtgagccgagactgcaccattgcactctggc
-ctgggcaacaagagcgaaactccgtctaaaaataaaataaaataaagaaaagtttctttg
-actttgaaaagcaaaacaaagtattagcaatattttaagcaaaatatcaaaaagatcact
-ccagtctcctattagttcagttcgtgcagttaattcctgtcctgcttgatattaatgaac
-attttagctaagagtcctaaccatttttcctgtattctgatgtcacaatctccaaattta
-tcagaaacctgcattcaagaacacctgttagagctttatagctgagtataaaacccttct
-aaagaggatcaaaacaagacaacaattgtttatggatgaccaaaagttttagggtagcca
-tagttaaagacacaattgacaaggaaatctgttacttctgtggcacacaataattttaac
-ataacaattataattactactgataacacacactaagacatatcagaattataggagtct
-cccataactttggaacacataccaataacatatttatacaaatatggcccaaagaaagcc
-aaacattattttatatttgacaatgcttcctgtatgacttcataccaaataagccaaatt
-ttacctttatattagtgtgttattaatgttaaactcaattttaatgttttgatcataagg
-tcagattttcatggacccttttttttttttgagacagagtctcgctctgtcgtgggcgac
-agagtgcagtggagcaatcttggctcactgcaacctccacctcctgggttcaagctattc
-ttctgcctcagcctcctgagtagctgggactacaggtgcccaccaccatgcctggctaat
-tttttgtgtttttagtagagatggggtttcaccgtgttagccaggatggtcttcatctcc
-tgacctcgtgatccgcctgcctcggcctcccaaagtgctgggattacaggcgtgagccat
-tgcggctggcctatagaccatttttaaccctttataatttttgtcaaagagcaggttagt
-gctttaagaaaaacccattgtgcttttattttaatactcaatttacagaaaaactggatg
-atacacctttaactttagccaagatgtttacacacagtatttcctttacaattaaccttc
-caaaagttgcttaaaccttcatttttattttattcaacttaaaacaattctttaaccttt
-taatctaggtaaaaatccacattctcatgcctccttataatctttttaccaaaagtatat
-gtaaactgttttttcaatagtcttaaatacatgttacactgttaacttttTTTTTTAAGG
-CCTACGTAACAAATAATTATTCTTggctgggtgtggtggctcacgcctgtagtcccagca
-ctttgggaggccgaggcaggtagatcacctgaggtcaggagtttgagacaagccttgcca
-acatggcaaaaccctgtctctacaaaaatacaaaaattagctgggcgtggtggtgggtgc
-ttgcaatcccacctactcgggaggctgaggcaggagaatcacttgaacccgggaggcaga
-ggttgcggtgagcttagattgcaccactgcactccagcctgggtgacaagagcgagactc
-catctTGGGGGGGAaaaaatgggaaactggagagagaaaattacatttcagaaactataa
-cacacctgttattaaattccagtgttgcctaatgttgttcaatttttattactttaaatt
-aaattctaatttttctgactacgagtttccaaaataagctttgttttcttaaagccctat
-gaactgaaaactagacgtttcagcaggcactgcctctaaacgccccccagccatcacagg
-aggaaacctcttcactgctggagctgacaactaataactgagcgtgcctggaatcctttg
-cccccacatctaataagtccatggaacccagggtaattgagatggcatctcttacaagaa
-tcaacttctgggtcaggtgcggtggctcacgcctgtaatcccaacactttgggaggccaa
-ggtgagtggatcacttgaggtcaggagtctgagaccagcctggccaacatggtgaaaccc
-catctctaccaaaaatataaaaaagttagctgggcatggtggtgcatgcctgtaatccca
-gttattcgggaggctgaggcatgataatcacttgaacccaggaggtggaagttgtggtga
-gccgagatcgcgccattgcactccagactggcgacagagcgagactccatcttaaaaaac
-gaaacaaaacaaaaaaacaggaatcaacatctggatacattacactcgagtcaaagcctg
-gaaagctgaggaagcaacccctgatagccaaaggaacatcctaaatatcagtgtaaagaa
-ataggaaattttaagctcataaaaggtaagtaactgagtgagaactacttatcttactca
-gtctcacccctacctcaccaaatacttttagatgttcctacctctccttttaagacaaat
-attaaaactttttaatggaaattattcactacaccaccattgtgggaactgctttacaca
-ctctattatttgcagtgggactatgtactacagcaccctcaggatggaatatcagacaga
-gaatctcaattatggtaccattttgcttaattattatcctcatagcaggaataacagtta
-ctaacagcaaataacacatgggcctttccagacatgtgcctctgcctgtcattgggtgag
-gaatgttgtttctatatcaaccaattaggcctagtaagaggtgctgttgaaaaacttaag
-gaaagggctataccaaaacaaccaaatagattcttggtttaggaacaaaatcatagcatg
-ggtcatcccattcctgggacctttcctaataatatgcctaggactaatgttcttaccctg
-cctaattaacctttttcaaagatttttaactgacaggatcatggccatttcacagacaac
-tacccaaaaacatccacagacagcgttactgctacagttaatccaagaccagaaaactct
-gtcccctcatcagcaggaagtagccagaaagaacaccctgcctttcatcctttttataac
-tataaggtctggattgacagagcaggagcattgccatcttggacaagcactgccattcta
-aagttccccttgatcaaaaaccacctaaatccaaagggcatcagcctaatggctaaggtc
-agcatgaccataaaccacaaatgacatctctgaccagaaacattccaaccataagttaaa
-gccctccccgaccagagacgtgccagccccaagataacctcccctccaggtggagagatg
-tcagccccaagataccgtcccttccaaccagagacattccaaccctcaatagacttctcc
-cctacacaggaacattccaagcctgtgataagctctcttacccagaaaccagtaaatacc
-cttagtatgtaagagagagcattcctgactgaaattggacagaggcccctctcaggttta
-ttcttcaaaataaacctgtctttgactgttgagcctcttttcatgtttctttcctctttc
-ttgaactcttacaACACCTTTGTTAGGCGCAAATtttcagtgctgcaaaagaaatagcac
-tcgaacataaatttaattttctcagcaaggcaattttacttctatagaagggtgtgactt
-gtggatggaacaatggtgagagcacacctgaacaagggaggggaaggggtttttattcct
-gatgcaggtagcccctactgctgtgtggttcccctgttgactaggattggaccacacagt
-ctaagctaattccgattggctgttttaaagagagcaggggtacgagtcggagtagcggag
-tgagtagtttggcgggaaggacagttaggaacaggtgactaaaggtgactcaggtcagtg
-caggtgaccaggggtgactcaagaaggagcaggtgatcaggggaatagatgtgaactact
-gattagaactggtggaaaaggttgtttactgaaactaggggcaaggaggcaaagagaatg
-agaaagttaaactttaaaatggagaacaaagaacaggggacctgaatatactcatacatt
-ggttccttggagaggatctcagaactcattgtacttaacaATTTACAGGCTGAAACATTT
-GAAAAGGAATTTGTTATATCCTACAatttccccctttcaattttcatagtacttcctctt
-caaactttttaaacatgtcttggcttagctgctcgacttaatcctctaaaagaaaaagct
-tatctgaataaggtggaggtgagttaaggaagattttagtaagtgctgcttttataagtc
-tttgcactagcccacagatgcatggtatgacataacacctaacaagaatgagtacagcta
-ttacggctgcaagagaagtaagaattgaggctgtgatttctttccatttactgaaccccc
-tttctagccaccctgagaaagggttatcgactccagaattttagctagttcattggatag
-agtggtaagtctttataaggcccttgttatgttcccagtgtgggcagtgttatttgggat
-aaaggtacaacactgagttttaatcataatacaaacaccactttttctgctaatatcata
-tctggtgccattctgttttcccaggccatctggctagtgggccccaattgttctgctatc
-cctttgacagcatccctggtgtaattaataaactgctgctgattataatagatgtaattt
-atccagtctacatttttattaatcgtcacccatgaaaatattgacttaaatcctgcagct
-atttgatctcgggctttaaattcatctggtactcctagtggaactccagtaatgtttata
-taaacatgggggtcaaacgactcatgtaaggcacttcttttacaattttcttttttatca
-tgttgacggaatgctagagtgaaagggatggccaattggactagagcacgagtgctgctc
-taattgcttggcagagtatccagcaatagtgcccctcaatgccaccacacacctgctcag
-ggatgaacaagggcagactgatgggtaagctcttgaaaaggcttggtttcaccgcaccct
-gttaagtctccaaggaatgctaacttttccccctgccgtgaaagggacaggtgaacttaa
-catcaggggctggaggctggatggccctccgggctgacccacagggctcttgacctcggg
-gaagagcagtgaaagcgaacagcagtgaaagagttttgcctgactcattgccccggctgt
-ggggttctggaagagagctaccatacagctcatgccctgtccatgagaggaccactcgag
-gggaaaggggacaatttgggtctctggcctgcctgtcgcacaagcagtcacttttgttta
-gcatgcgaacagaatatttaatccatttcagccaagcatttacatcctggtactctgttt
-caattgctatagtttgttttaaatctataacttctacaacagctactttggttttatcat
-tgggtatataacgaaagaagatctggttagtggagaacttaggagtgggagaagggggtg
-caggagttgaggaggcaatgaagcacatttcaaaggatcctctggggtccttccctgaga
-cttctgctcctataccatagaaacggtactctggggagcagaggtggtaatctgtactgg
-attacattggttcatctgacaatggggtggtccatccttgctccttggtagtccataagc
-cattagaccagctaaaagttctgttctaggagggcaagattcctagttcatactgggacc
-atcatcaatatcttcccagactaactgatcccagttaacagattttcagtctgaggagag
-ccaggaaggacaaagatacttttctgaaggggagagttgcctctggtttggcagatctcc
-acaggtcatcccaaggcaagcatcaaaagtaatagtttggggcgaacttgttacataaag
-aacgagaagactagcaatagaaggggaaaagaaagagatggaatgtaagaggatcaaacc
-cgttttagctttagcttggttggagttggccctggaatagctgtccatgattctggaggg
-ggtggtgctcttttgacctaggtgtgatgagtccatcctctttctgctgtttgaactgtg
-gtctcggtggttagaagcaacaggtagggtccttcccaagccagttcgagtttcccttcc
-ctccaacttttgacaaggacacagtccttaagctgatgttggtgtactggaaactgtagg
-ggtggtacctgttctaaaagacctttagttctgagggaagagaaagtggaaaataaacca
-agtatataatttctgagaaactcatcttttgttttgaacataggaatgtcagcagtggag
-tgtaaacagggcaacctacacaacatttcataaggggataagccaacatctctctgagga
-gcagttcagactctcaagagggcaatgggagagcatctatccatggcaaccgagtctcta
-agactaatttggttaggtggccttttttttttttttttttttttttttgagagggagtct
-cgctctgtcgcccaggctggagtgcaatggtgccatctgagctcactgcaacctccacct
-cccgggttcaagtgattcttctgcctcagcctccctagtagctgggactacaggcacgcg
-ccaccatgcctggctaatttttgtatttttagtagagatggggtttcaccatattggcca
-ggctggtctcgaactcctgacctcgtgatccacccgccttggcctcccaaagggcttttt
-ttttttttttttgacagggtctctctccgtagcccaggctggagcgcagtggcgcgatct
-cggctcactgcaagcaccgcctcccgggttcacgccattctcctgccaaagggctttttt
-aaaaaatagtttggttcattctttccactcttcttgatgaaggtaggtgccagggagtat
-gatattcccatgttatatccagtatctgggctaatttcttaatgacatgtacagtgaaat
-gagtcttattatctgaatcaatgttttctattaatctaaacttgagtataagattttcaa
-ctaatgccctgtctatgttattatcagttgtacttgaaaaggaaatagcttctatccaat
-gagtaaggtgatctactatactaataaatacttcagatgatcagttggaggcatctctgt
-gtagtcagtctggatactttggaatggccttaagcctggactccttcccccaaggggtaa
-tgttttactaaacaactgtctgtaacctgtttggccagggtataaatcctatgcacccat
-aaactctgatgaatgtgtcacacgaggcttggggcctccaatgggtcctttaatgcagtt
-ggaataagacttccctcataaggggtttggataacatttctctctggtctagcaatatcc
-attttccttctgaattctctttagcacctatttttattagtttttaaaccaaagaaagcc
-aaacaccattttatatttgataatgcttcctgtgtgattttataccagataagctaaatt
-tcacctttatattagtgtgctattaatgttaaactcaattttaataaaatcttgtagaca
-tatttattcaattttaatgtctgaccataaggtaaaattgttatagactctttctaacgc
-ttcataatttttgttaaagagcaggttagtactttaagaaaaacctgttgtgcttttatt
-ttaatgtccagttcacagaaaaactggatgacacccctttaactttagccaatatgttta
-cacacagaaattcctttacaattaacatttcaaaacttgcttaaaccttcaaaacaattt
-tttaaccttttaatgtaggtaaaaatccacattcttatgccttcttataatccttttacc
-aaaagtatattttactttccttacacgccttgaacataaactgtttcttcaatagtttta
-cattcaggaggcctaattacttttaaattatacaacatttcttgcataaattccctttta
-taacattttccacgactttcacagaccatctttgacatgacttaaatttctgacttgtga
-acattcctttctttaaacaaccagttaatttattttaggatgagaatttaccgtataaga
-ttctttttacataaattctccTTTTTTCTTAATGTcaaagatgataattgttttttccca
-aagcaaacttccctcatgtctgtggactagactgcctaaggccacaagattagaagttag
-gataatacatgttacactgttaacttttagcaaattttacttctgttgaaaaccttgtaa
-gtttggaattttaattaaaggaaggcttttttggtgtccggggacatggacaatagttat
-ttttttggcaactgaaggttatttaatacttgggtgattaattcctcgtggaccgggtct
-tgacctttgctattaataagacctggttcagtccaaatttttccacatgcatgagccact
-ccaaaggcacactgaaaattggtatagatggttccttcctggttctgtaagtactttaag
-gcttggctgagtgcaaacagctcacacgtttgagcagaccaattattaggcaattttcct
-aactctatctctacACCTTTAACCATTGTTCCCTATTTCTCATTCAAACTTGGACATAAC
-GGTATgtgaaaaagagcctcttgtgactgttacctctttacaatggaatgttaagcaacc
-cctcagaaagtagggagtagcaaatcaaatctttgtaactacatttcagcctttgccggt
-tgaaatgtcagagccccggcatcagaaagtggtcaactcaagggctgataagaagaattt
-accaacaacagtataggtttgaaaagtaaagttttattagaaagaaagaacattgcagaa
-gagtgcagcgaggtgcctcagcaagaggggactgagagggctgtggtggatattccttag
-gcgcatatatgaaccttaaggcaaaagcttgagggtaatttggagcatactagccacgta
-ggttatgataaatggttacatttgtagttattttggtgccttaatgtcagcaaggattgc
-acagtgagtttcgcatagaaattctggttactacaaaatttttgaaagacccctggaacc
-agatgccaactttagatatgtcgatgaagagtcaaactctgtaaaatatttgaagagatt
-tattttgggcgaaatacgagtgaccatggcccatgacacagcacttaggagatcctgaga
-acatgtgcccaaggtggttcgggcgcagcttggttttatacattttagagaggcacgagg
-catcaatcaaatacatttaagaaacacattggtttggtccagaaaggtgggacaactcaa
-agtgggaacttccagactataggtaaatttaaacattttctggttgacaattggttgaat
-ttgtctaaagacctgggatcaataggagggaaatgtttaggttaagataaaacattgtgg
-agaccaaggttcttttgaagtcttatagtggctgtccttagagacaatagatgacaaatg
-tttcctattcagacttttaaaagctgctagactcaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaggctgccagactcttagttaatctcagagggcctggaagaaaaagatctagctatat
-taatagagattatttacagatgcagatttccccccacaaaggacagctttgcagggccat
-ttcaagatatggcaaagaaacatgtttttgggtaaaatatttttgctttcttctttgtca
-cataatgttatgccagagtcagattggaaagcaagtcagatatataggtttaaataaaac
-ccatctgatgagaatttatggtttgtagggcatgactccccagaccccttagataggaat
-ttcagcaaaataaaaagatcagagcttagtcctcataatcaagaaataaccataaaaatg
-ggcaaccctatggagtagccattcttttattcctttactttactaataaattttcttttg
-ctttgcactgtgaacttgccctggattctttcttgtgtgagatccaagaaccctcttgtg
-gggtctggattgggacccctttccggtaacGATTAtacttctaaattcctcagataagga
-gtttttgtctcgggctgcttcagggtcaccaggtgatttttgctctcctcaCCCCTTTGT
-TCAGCTTCTCTGTTTTTGCCTATGTACACAACTCTCAGATTTGGCCACtggggagagcaa
-agttatacctggtgaccatcaagcagaccattcagagacaaaactccttatcagaactcc
-ttattcagaagcaattagacttccctattatctaaagcaggcatctcattccaggcttct
-ttcccccaaatttataagtaactagaatttctatgcatctctggaatgcatgcatatcaa
-aactcacggtgcTgaaaatttgcatctgtaaagaatctctattaacatagctggatcttt
-ttcttccaggccctcccaatcctgaagagattaactaagagtctaacaccttttgatggt
-ctgaataggaaacatttgccatctgttgtctctaagggcagcgaacataagacttcaaaa
-gaaccttggtctccacaatcttttatcataacctgaacatGAGTCTCTTGCTGATATTAA
-GGCATTGAAACCACCTTTGCAAAATTATTACAGACAGcatcattgcaggaatccaggaca
-ctggagtagaggatgttccatacctttgggttacaagccacccccaggaccttgtcctca
-ttgcaaacaagagggtcattgtgatatggaaggggggcaggggagtgctgggtacagaaa
-tgcagggttcctggtgagggctccacccttgggcctgtgcccacagacctaagtaagaac
-aggcactcctgttttcatgcctgaatgttgtattttccaagaccactctggcccaccaca
-tccccttcctgtgtccataTtgttaaatatgaattctaaatttctcttcaaagaattaat
-atgtcagtatgttcaattctttgacttctgcttttaaatttaacttcctcgtaaagcaac
-ctttttcgattacctgctccaccctgactcattccgattacctgctccaccctgactctt
-gcaggttacttgctacctgctccaccctgactaattattctccaccctgcataaccattt
-ttttttcccgccaaagcactcatcctgtcacactctttaaatctgccaattggaattagt
-ttagcctgtgcagtctaaccctagccaataggggaacgacacagcagcaggagccttgtg
-cattagggataagaacccctttccctcccttgtccaggtgtacactcaccattgctctac
-ctgtgagggtgcacccttctatagaagtaccttgccttgctgagaattaaaaagaaaatt
-ttatattcgagtgctatttcttttgcggcactgaaactttatatgtaacaatttgggggc
-tcgccctgattacatttccctctggggcagtctctggttctctcttgtgaggagcgctcc
-gccccctgtggcggcctcagccgggagaaatcagaacccacccagtgcgaggaacaaccc
-gagctgtcagcaacaggggggaagaaaactggccggcaacctagcttaaagaatcctcac
-atactgcagcgacgactctgcgcacagagcaaggaaggagaagccgcgggagctggtaaa
-gtatttccttggtggtcgggaccaaggtaagaaagccacgggggtggtgggcggtgaagt
-actccttggtcagggtggcttagaggttaaaaagaggtgagacatccccattggcggaga
-ttgaacctcacacaaacctccagtagtagaaaaggcaagaaatttccagtggggaaattg
-agcctcaccccaaaaggtaagaaatttccagtaagggaaagtgaaccttgaaccttatcc
-caaaaccatcaagatgggaaatatcccaagcaagacagggagcaagggggataaacatgg
-taacaaagatatccctccagatggccccctaggtctcatgctaaaacactggaaggataa
-tgaaaggatacacataggaaaaagcaacaaatggtaaaatattgctgttttatttggagt
-cagggacccatcctcagtccctcaatcttctggtcaaagtttgggtcaaatgagaatgta
-atgtgtcagcttctaatccgatacgttaatgataaaagtccagtgtctcaagaagaacta
-ggctatgccctttgttggaggcaaggacctgccctcctatttctcttaaaaataaatagg
-gaagaacccaatctggcacctcaaaatgaaaagtcagaggagccagctctcatgcctaaa
-gactccagtgctgcatggtatcccctagaccatcttcccccactcagtgtccccaaactt
-tcccctcagacagccactgccacctcagatcaccactgccacctcagatcctgttccaaa
-ttccccctctactcacgctatccctcctccttataaccctgactgttgggaattaccatc
-ccaccagcctgttctctcccaacctaaagacccctctctaaaaagactccagcgtgaggt
-agaacaatgtaaaaaagatattcagaatttcctatttccctccgtacctaagaggtcagc
-ccctaccctcttccctttgaaagaggtaccacaagttgggggcgggggggggggcattga
-ctttgtaaatgctcccttaatcagttcagaagtccagaattttacaaaggagcttaaact
-gctgctggacgacccttacagagtggcagaccaaattgaccaattcttagaacctcagtt
-atacacttgggtcaagttaatgtccatcttgggcatcctcttttcagggtaagaaaggag
-tatgattcttaggtctgctatggtagtttgggaatgtgagcaccctcccaatgaaaacgt
-tcctaccacggaccagaaattccccgcccaggaccccccatgggaaaataacaatgcaga
-tcaccgggaaaatatgcaggacctaagggagataataaaaggaattcaggaatcagtacc
-ctgaacccaaaatctttctaaagcatttgatatacaacaggaaaaagatgaagggcctat
-gagattcctagacagactgagggagcaaatgaggcaatatgcaggcctcaatttggatga
-tccccttgggcaaggaatgttgaaactccaatttttcactaaaagttggccagacatttg
-aaaaaaaaagttacaaaagatagacaattgggaagaccatcccttaagtgagcttctcag
-ggaagctcagaaagtgtatgtgaaaagggacaaagtaaaacgaaacaaaagacaaaactt
-atgtttttcaccttccaacagatggctccaaacccaggtacttctagatagagtttccag
-ggagccagaaactataaagggtccgaatcctcttttaaagaaccccagcctccatctgga
-ggaccagggtccttgtctaccaagccccctaaagagtatgggggagaagggttaaagaat
-cccagaactaaggggaggaaggacaaaataggtgctatagatgtggaagagcagaccact
-tcaggagaggatgttctgaactaagaaaggagaaagaagccctttcactcatgactttca
-aggaagaatagcggggtcaggggctctgtctcttttatcttgagtcccaccaggagccct
-tgataaatttgggggtgggacctaaacatgagcttatcacctttttagttgattcggggg
-ctgctcgctcctctgtttccccccatctaatgttgtctccttcttagaggaacttttagt
-ctccagggtaaaaggtgtaggattaagagcaaaaattttagaaagcactgaagttagata
-ccaggatcgctcagcttatattcagttcttgtttatccctgaagcaggaactaatttact
-ggggaggaatttaatgttaaagttgggcataggtctacaagtcagcccaagaggattcct
-cacctcattaaacctactcaccaccgcagatgaaaaatatattaatcctcatgtcttgac
-caaagaaggaaaccaagggaaactctaagtccctccgatccacatcaagctaaaaaaccc
-aggggaagtagtaagaaggaagcaataccctattcccctagaaggtaggatagtgttgaa
-acctataattgaaggccttatttaggatgggcttcttgagccctgtatgtctccttataa
-catcccaatcaagaatcaagaaatcaagactgctaccagccagtcaagaaattagatggg
-tcataccagctagtacaggaccttagagctatcaaccaaatagtccagagtacccaccct
-gttgtcaccaatccttacaccattcttagcaagattccatataatcatcaatggtttact
-ataataaatttgaaggatgctttttgggcatgtcccctggctgaagatagctgagatata
-tttgcttttgagtgggaggatccatactcagggtggaaacaacaatatcgatggaccgtc
-ttgccccaagggttcacagactcccctaaactttttggccaaattttagaagaagtacta
-gaaaaagttgtcatcccagaacaaatatgccttcttcagtacctggatgacattcttata
-tctggtgaagatctagagaaggtaactgacttctctacacatattcttaaccatctgcag
-tttgaggggctatgagtctcaaaaagaaagcttcagtatgtagagcctgaagttaaatat
-ttaggccacttaataagtgtaggcaagcgaataatagggcctgaatgaattgagggaatc
-gtgtccctacccttgcctcaaactaaacaagaactcaggaaatttttagggtcagtcaga
-cactgtcgctaatggattgactcatatacactgccccgtaaactgttctatcaaaaactt
-gcccaggagaagcctaaccgtctcctgtggacttctgaggaagttgatcaaatcgagagg
-ttggaggaaaggctcataactgcccctgttttaggcttaccctccctagaaaagccattc
-cacctttttgctaatgtggacagtagggtaccttcgggagtgctgactcaagaacacaga
-ggccgccagcagcccgtagccttcccatcaaaggtcttagacccagtcacttgtggatgg
-cctcaacgcatccagtccatcgctgctatggcaatactaggtgaggaaagcagaaaatta
-accttcggaggaaaattgacattaaacacgcctcaccaagttagaactatcttaaaccag
-agagcagtgagatggcttactgacttgagaatcttaaagtgtgaggccattctgttagaa
-aaggatgatttaacattgaccactgataattcactcaacccagcaggtttcctaacaggg
-aatccacatctaaggagggaacacacatgtttagatttaattgattaccatacaaaggtt
-tgaccagacctgggagaaacccccttctggactggacggcacttactcatagatggttcc
-tcccaggtgattgagggaaaaagacacaatgggtattcagtgattgttggagaaactctt
-gtagaaataaagtcaggaaaattgcccaacagttgatctgctcaaacgtgtgagctgttt
-gcactcagccaagccttaaagtacttacagaaccacatctatacagattccaggtatgcc
-tttggagtggcccatacatttgggaaaatttggactgaacgaggtctcattaatagtaaa
-ggtcaagaccttgttcacaaggagctgttcacccaagcattgaataatcttcagttgccg
-gaagaaatagctattgtccatgttcccggacaccagaaaagcctttcttttgaaagttga
-ggaaataacctagcagatcaggtagccaagcaggctgctgtgtcttctgaaatgcgtgtt
-tttcacttaactccctacctccctcctcctaccataatccccattttctcttccaccgaa
-aaagagaaactaataaaaataggtgctaaagagaattcagaaggaaagtagatactgcca
-gaccagagagaaatgttgtctaaaccctttatgagggaagtcgtatcccaactacatcag
-gggacccattttgggccccaggccatgtgtgacgcagttctcagagtttatggttgtata
-ggaatttataccctggcaaaacaggttacagatagttgcttagtatgtaagaaaactaat
-agacatactataaaatgattacctctcaggggaaggaatccaggctaaaggccattccaa
-agtatctaagttgattacacagaaatgcctctgatagatcatctaaaatatttactagtg
-atagtaggccacctcactccctgggtcgaagctatccccttttcaaatgcaacagccagt
-aatgtagttgaggccctaattgaaaatatagtacccaggtttcgactaacggaaaatact
-gactcagacaatggaactcatttcaccacacacattattaaaaagctattccaaaatatt
-agacattagatgggaacaccatactccctggcacccaccctcatcagggagagtagaaag
-aatgaattagactctaaagaaccacttaaccaaattagtcttacagacttggttgccatg
-gaccaagtatcttcctatcaccctgctgagaatttgaactgcaccatggaaagacattgg
-tctttctccttatgagatgctctatggattaccttatttgcactccactgttgatattcc
-tacctttgaaacaaatgatcaattccttaaaaattatatacttggtctatgttctacttt
-ctcctctcttaaaactaaaggtctattagcacaggcaccacccttggagttcctggtgca
-tcaacattagcctggggatcacgtcctcatcaagagctggaaagaggagaagcttgagcc
-agcctgggaaggtccttacttggtgctcctaactactgaaaccgcagtccgcacagcaga
-gagaggatggactcaccacacccaagtcaagaaagcaccgccccctccagagtcgtgggc
-catagtcccaggggaaaaccctactaaactaaagctaagaagaatttaactccctttcat
-ctattctattactcttttttctttcctcactctattgctgaccatatagttattaacata
-accaagtcaatttcacctcaactattgcatttgatgcttgccttgttatatcctgtgggg
-atttgtcaagccaaagaaagctctctacttcagatacctctgtccctcctggctctcctc
-agactaggcattagtgaatcgggaccatttaatctggggagatttctataaagatcccag
-tggcaaccaggagtcttcccccagtgatgtagagcttttaagccatagttggtccaaagt
-tctgtggaccattaaagagcaaggatggattgccccaaccagtttttgtaatttcctaaa
-ttcatacattcgttttactaaagggacagtgcccactaactctcagctaaaccagtgcaa
-ccctatacaggttattattttgagcccacaaaattcttcctcttttctaagctggttccc
-ttctttaagccagttttatggtatgggggctgaagtttcagggacagaccctattggatt
-ctttgaaatgcacttctttgatcccctgctgtctgcacctgcctctgagcctttttccaa
-aacctctcacaacggaaccattgttcctcctctatctaacgacaaggccaagatagcgat
-ggtagaagttaaagacttaaaacaaactggcaattgagacaggataccaagatgtaaatg
-tttggttggaatggatcaaatatttcatccacacgttaaacaaaagcaattgttatgctt
-gtgcgcacagcaggccagaggcccagattgtcccctttccactagggtggtcctccagtt
-gaccgggcatgggctgcatggtagctcttttccaggattctatagcctggggtaagaagt
-tgtgccaagctctctctctgctatatcccgaagtttgacaccttgtgggtcagcccccaa
-gggccatccagcttccatctcccaacactaagtttacttcgtgtctctcatgacagggag
-gaaacttagtgttccttggagacctgaagggatgcagtgagcttaagaacttttggccag
-gcgcggtggctcatgcctgtaatcccagcactttgggaggccgaggcaggcggatcacaa
-ggtcaggaaatcgagaccatcctggctaacacgatgaaaccccatctctactaaaaatac
-aaaaaaaaaaaaaaaaattagccaggcgtggcgtcatgcgcctgtagtctcagctacttg
-ggaggctgaggcaggaggatggcgtgaacccaggaggtggagcttgcagtgagccgagat
-cgtgccactgcactccagcctgggcgacagagcgagactctctctcgaaaaaaaagaaaa
-agaactttcaaaagcttaccaatcagccagcccttgttcatcccctagcagaagtgtggt
-ggtattgtggtggacctttactggacactctgccgaataactggattggcacttgtgctt
-tagtccaactagctatccctttcaccctggcatttcatcaaccagaggaaggaaaaataa
-gacatcgtaaagtgagagaagccccttatgggtctttagactctcacttctgtttagacg
-caattggggtcccatggagaatacaagatcaatttaaagtctggaatcaaatagctgcag
-gatttgagtcaatatcttggtgggtgacaattaataaacatgtagattggataaactaca
-tctattacaaccaacagtgatttagtaactacactagagatactgttagaggaatagctg
-agcaagtaggggctacaggccagatggcttgggaaaataggacagccttagacatgatat
-tagcagaaagaggaggggtttgcatcgtgactaaaactcaatgttacaccttcatcccaa
-acaacattgcccctaatggaagtataacaaaggcattgcaaggtctcactgctctatcca
-gtgagttagccagcagctcaggggtaaatgatccctttacaggatggctagaaaaatggt
-tcggtaaatggaaaggaataatagcctcaattcttacctccctcgtagctgtaataggtg
-tacttattcttgtcgggtgctgtgtcataccatgcatccgtgggttggtgcagaggctcg
-tagaaacggcacttgctaaaacctcccttaactatcctccaccttatccagagaagcttc
-ttcttttggaaaatcaagcagaacaactaagtcaagacatgttaaataagtttgaagaga
-aagccgtaagaaaaatgcaagaggaggaagttgttaaatatgaattctaaatttctcttc
-aaagaattagtatgtctgtatgttcaattctttgccttctacttttaaacttaatttcct
-cataaagcaacctttttcgattacctgctccaccctgactcactccgattacctgctcca
-ccctgactcactccgattacctgctccaccctgactcactccgattacctgctccaccct
-gactcattccgattacctgctccaccctgactcattattctctgccctgcataaccatta
-ttttcccgccaaagcactcaccccatcactctctttaaattagccaatcggaattagttt
-agcctgtgtggtctaaccctagccaataggggaatgacatagcagcaggggccacatcct
-tcagggataagaacccctttccttcccttgtccagatgtgtgctcaccattgctccatct
-gtgaggttgcacccttttatagaagtaccttgccttgctgagaattgaacagaaaatttt
-atattcgagtgctatttattttgaggcacagaaactttatatataacaatataaacccga
-gaccttggcgggcacacacacaagcagctgaatgtcaagaggaGTGGAGGAACGGAGTGG
-CAGAGAATGGCAGAGAGCGCTGGAGAGTGGCAGAGCAGCATGGCAGAGAGGGAGGGAAGA
-GGCGTCTGAACTTtggaagacacctccactcctcaataaagtctccgcatgtatcacttt
-tcaaacagttcatgtgacctgattaatccaggatgccagacaagaatctgggGAAgttaa
-cattcaggcatccctggatggcaaggctaaaggagcacactgtaacatatgcccacttgg
-gctccagcacctgtccatctgtgtgttcccccttccctcaggggtttgagcagtggggtg
-accaaacagacgagccacaccccctgttgcatgtcctgcaaggagaatcagggaactctc
-ctgtttcaGttggaagagcaagtgtccctctctctctcgtggtggggagacatctcttcc
-ttctgggctgtcacagccccaacctcaccaacctacctgacaagggagtctggcagaaca
-agggcaagggcagggagaagcacctctaactctattcctggataataatcaagtctctaa
-aagtcatcctggagccgggcacagtggctcatgcctgtaatcccagcactttgggaggct
-gaggcgggtggatcacctgatgtcaggagttcgagaccagcctggccaacatggtgaaaa
-cctaactctactaaaatacaaaaaaaattagctaggcatggtggcaggtgcctgtaatcc
-cacctacttgggtggctgaggcaggagaatcacttgaacctgggaggcggaggtcgcaat
-gagctgagactgtgccactatgctccagcctgggtgacagagagagactctgcctcaaat
-aaataaataaataaataaataaataaataaataaataaataaataaagtcatcctctagg
-gctttgaggccgttcaagcccctattttttccatctctgtggatgagcctctgttaaatc
-tgattgtggctgaacaagagataatgttcctaatagatacagggaccagttattcagctt
-taagtgtttattacagcccaatgtgctagtcctccatttcattacgggtattgataaact
-tcagtgaggctgtttcacactgccactcccttataaaatgaaaggctattcctttaccca
-ctcttcagtcctgccaagctgccctgtttctttattaggtcacaatttgctcacaaaatt
-acaagcgaatttacagttaagacctcacattctagctgtaattaactcacacttcaccaa
-aaaagttgctgcagtctatagaacatcacattttaaaacaagtgccggccaggcgcagtg
-gctcacgcctgtaatcccagcactttgggaggccaaggcgggtggatcacttgaggtcag
-gagtttgagaccagcctggtcaatatggcgaaaccccatccctactaaaaatacaaaaat
-tagctgggcatggtggcacacacctgtaatcccagctactcaggaggctgaggcagggga
-atcacttgaacctcggaggtggagattgcagtgagccaagatagtgccattgcactccag
-ccctggcaacaagagtgaaacgctgtctcaaaaaaaaaaaaaTTGTTCTTTTGTTTGCTT
-TTCTTTCACCCTGATTCCTCCTTCCCCCTTTGCCGTCTTCAGTACCAAGCTACAAAGCTA
-GGGGTGGCTGAGGACAGTAAACAGAGTGTGGtcttagctggctttttccctcctgggaag
-ttgttgtttaggatcctaattctagttcagaggtgcattctaaatagtcttctccattgc
-ctttccccccaaaattaatctcacacgttggcttgtgtgtgcattcacgtgaggaactga
-actgtcattttcatagataaataagagactgagtttccttagctccaaagagaaagggca
-ttttgctcctcccagcagaaaggtacccgagtgactggggggccttgcgggagtgttggg
-gggttgagcccccagcgacatgaagtgattctgcagggaactcacaacaaaattagtttt
-aaaaaggctcgtccaggaagcacatataggaactggtcactctgagttttgagccctctt
-ggaggtgctagacctccggagaaaacactgagacacctaagagggtggtggcaaggattc
-agtggtgacacactgtggagtctcatctgcaaccattacacttcgacctactccacaaaa
-accctaggccacagctcagttactccttaaaagaaagtgggaaacaaataatctaagaat
-aaggaaaaacaaggtgttgacgaaaagagttaaactgtgtaaaatagttgaagatattta
-ttcagagcccaatatgagtgactatggcccgtgacatagcccttaggaggtcctgagaac
-acgtgcctaaggtggtcggggctcagcttggttttgtatattttaggaaggcatgagaca
-tcaatcaaatacatttaagaaacacattggtttgattcagaaaggcgggacaattcaaag
-caggggtcagggtgagggtggcttccaggctataggctataggtaaatcggtaaatttaa
-actttttgttttgttttgtttttttgttttgagacagagactcactcttccacccaggct
-ggagtgaagtggcacaatctcaactcactgcaacctccgcccccatgggtttcaagtaat
-tctcctgcctcagcctcctgagtagctgggattacaggcacccaccaccacgcctggcta
-atttttgtatttttagtagaggcagggtttccccatgttggccagagtgatcttgaactc
-ctgacttcaggtgatccaccggcctcggcctcccaaagtgctaggattatgggtgtgagc
-caccttgcctggtctaaatttaaacattttctgattgacaattggttgagtttgtctaaa
-gacccgggatcaatagaaagtaaatgtttaggttaagataaaagactgtggagtccaagg
-ttcttttgaggtcttatattggctgcccttagagacaataggtgacaaatgtttcttatt
-cagacctttgaaaatgtgctagactattagttaatctcttcaggattgggagggcctaaa
-ataaaaagatctagctatgctaatagagattctttacagttgcaaattttcccccacaaa
-gtacagtttggcaggaccatttcaaaatatggcaaagaaacatgttttggggtaaaacaa
-ttgactttcttcttggtcatgtaatgttatgccagagtcagattggaaagtagtcatcat
-atataatgttaaataaaatccatctgatgagaatttatgatttgtagggcatgactcccc
-agaccccttagataggaatttaggcaagatagaaaaaatcagagcttagtcttctcacaa
-gagaatgaccctcttttaggtaccccattgattttacggcatctctactttgcaagtgtt
-tgtgtaaatggacatattatggtctctttgtgcacaattatgtcaaagacaatttagagc
-ttgaaggttgacctccagctgtaaagttcctaagttctctatctctctgctttcttttct
-gcctgttttaagtctgctattatttttctttctttttttgagacagagtcttgctctgtg
-cccaggttggagtgcagtggtgcaatctcagctcactacaacctctgcctcccaggttca
-agcagtcctcccacctcagcctcctgaatagctgggactacaggcatgtgccaccactct
-tggctaatttttttttttttttgagacagagtcttgctctgttgcccaggctggagtgca
-atggcatgatctcagcaaaccaacgagtttctattaatatctcatggctagagttctgag
-ataatagctataggatctttggttgtatgagtatgtatgtgtgtgtttatgcatacatac
-acttatttcattgtgttttctagccacaggtactgaattggcttaaagttaaagaatatt
-cataaattaataagcctaaatgcttttcaagttcatgtgacttaagtaaaatctttaata
-agctagctttaaaattattggtaaagtaatattagaaatgtcttaaaaattgttagcata
-aatttttgtttgcatttattgatcaagggacttcatatactgccaaatactgtaaggtgt
-caaaatttggcatagggtttgtaaaactacaaaaccgttcaaaacagaatgatttttgct
-tttgtaatttttgataaataagacattgatattggtttaatgaaaacagctaaatcatga
-attatttagtgaaataacaatatatttaatcttaaggtttttacttagcaaacacctgaa
-attcacaggctatcaaatgtttgacagggaaataactttaaatgatgactatcacagttt
-tcataactaacctgggtaaactattaaaataaaatatttaggtaaatgtaatgggataaa
-tacttgtagacaaagttgtcataatttaggatctaaagttatgttaaattaaacaataga
-tatttcattaactgggtttttttaattaaaaaagatattgcaggaaatcattttttttct
-aaaaaatgtgttcttgttaaaaggaggataatttttgtctaattcaaagcttatttaaag
-gttatatataaaataaggtaaaaagaaacaagaaaatatataaagaagttatagaaataa
-aaaagaatttttggtaagaaagcttaaagaaaaataattttacatgagaaagaaccttgt
-atggtacatttttgtcctagaataaaatgactggttgtttaagaaagaggaatgttcata
-caaaccagaaagtccaagcatgtcgtgaatggtctgtttaagttataataagagcattta
-tggaaaaagacccacaaactttcatataatcaagttgtctataattaaagggaaattatt
-tataatgatcttttgagagattgggttttgatattaaaaaacatttatacactaaagaat
-tcattagaacaacattttcttaaggtattgatttacttttaataaattacaagactatat
-atataatatattttttcctgcaaagttcaacttttattgcatctcactgttttcagcttt
-ctctccccttttaaagtacctgaaataataactctatctttcaactcatttttagctcct
-gtaagtttttttattttctcctttgtgttctaactgttgtggcctgacgctaataaatgt
-tttatctttgtggtctaaaggaaacattccttccaacataatatttcctgtagggaacag
-cggttgaaatgcagaaggtgttttgttttccctttgggaaattggcctaataaacagagt
-ttatgctttattgaaataattcctatgtcattattactaagttttggtttgtttagaaaa
-aaacccgagattaaattttttttaattaagattattacatacatgtaaccctctgtatgt
-gcttttaaagtccttgtgccattaagttacagagctttgagtccttggtctaaaaagaac
-accaagtcctgctaaatattaaacactgacagcagttaaaacctcattttctgacctggt
-agaagatgccaatcaaaataaactgtgttcatgagacagaaggccggaaattaaaacgat
-tcaactcctcaaggtctggagactatcaaagaagaggtgggtgcatgagattgtaagggc
-cgattttgagagatcaaatgattataaggccaattttgagagataaaataattgagtttc
-tctataaattaaccattaatctcaaaggcacactgatgcaagactagcatatgggctgct
-gtgtcacgttaacaaggttttcttggagaattaacccactccttaataaaaggttataaa
-agaggttataaaggttataaaaaaggcttgtggaatttttatcttgtggtcaggatgatt
-aaaattttatagattgtttatacattttgaaaaacaaatttaattggcctcgtttttatt
-agggcttattgtttaggcaattaagtcttctctctcaaagaatcaaggtttttgcctttt
-ttttgaaatctttgagttatcaagttgagtaaatgaaagacttattttacaatgacttga
-tctgtgatcctattttgtgatatcaagcattttatttatttatttatttatttttgagat
-ggagtcttactctgttgcccaggctggagtgcagtgctatgatcttggctcactgcaacc
-tccacctcctgggttcaagcgattctcctgcctcagcctcccgagtagctgagattacag
-gtgcctgccaccacacccggctaatttttgtatttttcatagagacagcatttaccatgt
-tggccaggctggtctagaactcctgacctcaggcgatccacccaccttggcctcccaaag
-ttttgggattacaggtatgaaccactgtgcccagccaaatcaagcattttaaacttttta
-tttttatttttaaaattttaatattttgagatggagtctctctctgtcactcaggctgga
-gtgcagtggtgcaatcttggctcactgcaacctctgcctcccaggttcaagcaattctca
-tgcctcagcctcatgaatagctgggattacaggcacttgccaccacacccagctaatttt
-tctatttttagtagtgacagggtttcaccatgttggccaggctggtcttgaactcctaac
-ctcaggtgatccacttgccttggcctcccaaagtgctgagattacaggtgtgaaaggtgt
-ttaaaggccactgtgcctggcctttaaactttttatatttgacaaactttccaaagtcaa
-attctaacttggttcctcaatgattttttgatattagtcccctgaagtccaaaagagaca
-cagtcagcttatttggcataaaaatcatacaggaagcattgtcaaatatgtaatagtgtt
-tggctttctttgggctgtatttgtataaatatgttattggcatatgttccaaaattatgg
-gaaaatcctataattatgaatgacttagtatatgttattaatcattatcattattatgta
-aaattattgtatgctacagaagtaaccaagtttctttgtcaattgtgtctttaagtatga
-cttttctaaaacttttgtcatccacagttgttttacttttatccttttcaaaaggatgat
-tttacaatcagcataggactctgacagttgctgttgaatacaggttttggagatagtgac
-actaaaatagagaaaaaaaatccaacactcccatagagagctgaaatatacatgaatagc
-aagcagaagaggagttaactgcatggactgaactaatagaagactgaaataatccttcta
-tgactttttgcttaaaacattgctaatcctttctttgtttttcagagccaagaaaacatt
-tattttgagcttttaaaaaatttattattattattattattaacaaataaataatcttct
-ttctttttttcttttatctttctctgcagggcaagttctgtatttatagcttttaacaat
-tgaggaaattatactcctataaacaaaatttggagcatatttctctctatctggtttctc
-taaaatttggaaactagttgggagtattcttaacttatagcaatatagttatctgcacaa
-gtacaataagaatctgttttcttttgtaagaggacataattggggacagtggtgatttta
-ccaaggttttgactggaacaacatgctatcagatgcagactcctttaaggaatcaaagtt
-gacttacagagctaataaaagcatcttgggaaagctggcctcctatcttgtctacacagt
-ccctgtacaggttcctgacctgtggtaagtaaagagtgtcactttctaacaggcccagga
-gcccaaagtcttcctgaggtgaggaattcatccaattaatacaggtatttgcaggcacag
-gccgggcttaagacattaaagtcgaatgtgagattacttatggaataaagttccagcaaa
-gccaattaaaaaaaaaacaaggagcctatatggcaaataattattcttgatgattttatg
-caaatactccagccaaatataataagacagaaacttattttgcaaatgaattttgttcta
-taatttgtcctcagtgaaaggggactggagagagaaaaaattatgtttcaaaatcaccta
-tagtacacctgttgttagattttagtctcacttagtgtttttaaatttttattattttct
-atagtttggactaaactctaaaatttttcctggtcacaagtccccaaaataatttttttc
-attttttttcttttttcctttccttttccccccacattttttcctgattagaaatcacca
-aacattaaactgtgctttcctaaagccctgtgaactaaagctagacaatctatttacata
-cataagctactttcatacctgcctactggtgtatgaacttcagagtaatatggcctatat
-tgatttcccaggattattgttgttgttgttgtttttctcctttcctcccccattttctct
-taggacgtgagacttcacaacctgctaaagcgagctttcctaataatgtggaacctacct
-gtctatgaataaactgtcctagtcatgagagatcagacaaaacctgagaccagaggctaa
-ttttcttctaaaatgcttttaaaaagaaaaggggggaaAtgtgaaaggaaaataaacttg
-ggaccctcaaatcactaagccaaaacgaaaagtcaagctgggaacggcatcgggcaaacc
-tgcctcccattctaatgggatagctaaataagatagctacaaagattttaaaaagctaca
-tacctccctcacaattttcccacaaggaaattccttgtgtacctagaacagacagaactc
-aaagtcatccctctgctcatgggagacaaatgcacatctgatggcttcctttgccctatt
-gcttcgctaagccagactaaggcataagtgactattcctgcaagttgcatattcagtgga
-gggctaatcagaaactcaaaagaatgtaacaatttgtcctttatctacctatgacctgga
-aaacccctccccacttcaggttgtctcacctttctggatggaattgatgtacatcttacg
-tatttgctgactgatgtctcatgtctccctaaaatgtataaaacctagctgtgccccaac
-taccttgggcacatgttatcaggacctcctatggctgtgtcactggtgtgtccttgacct
-tggtagaataaattttctaaattgattgagacttgtctcagataactcttgatttgcagt
-aagtagcatttctaaacatctctggaatgcatgcatattgaaactcattatgcaaccctt
-gctgacatcaaggcaggaaaatgtctacaaatgtaatcatttagcgtgacctatgtggct
-aatgtggaccaaattatccttaagctcctgctttaaggtgcataaatgcccctgaggaaa
-aatccaccttggcactctccatcctatcttgctgagattcttgcctgcactcttctacag
-agttctttctttctaataaaactttccttttttcaaaccaatactattatccataaattc
-ttcttctttttttgtttttttgaaacggaatctcactttgttgcccaggctggagtgcag
-tagcatgatcttggctcactgcaacctccacctcctgggctcaagtgagtctcctgcctc
-agcctccagagtagctgggattacagacgtccaccaccacgtccagctaatttttgtatt
-tttagtagagatgaggtttcaccatgttggccaggctggttttgaactcctgacctcaaa
-tgatccacctgccttggcctcccaaagtgctgggattataggtatgagccaccatgccca
-gcagtaaattctccttactaatccacgagtggaccactttccaatgctgaggctctgaca
-cctcgctgggcaGCCACTTTTGATTATTTTGGGTTGTCAGGGCTCAGGGACACAAGAACT
-TGCTCCTTAGGGGAGCTGGAGGTCTAGTAGGGATTGCTTGTTCTCCATCAGGCCCCTAGT
-AGGGAGGCCTCTCCTGTCCCCAATCCCTGACTCCCAGGGATGCTCCCCTCCAAACCACAG
-caggaagttcctccttaggtcagacccacagccctgatgctgtggtctCACTGCAGGTCA
-TAGTCTCACAGGGGCCTCTTATAttattttaattttaattttaattaaattaaattaatt
-ttttttttttagatggagtctcgctcttatcgcccaggctggagtgcggtggtgtgatct
-tggctcactgcaacttctgcctcccaggttcaagtgattctcctgcctcagccacctgag
-tagctgggattacaggcatccgccaccatgcctggctaatttttgtatttttagtagaga
-cagggttttgccatgttgaccaggctggtctcgaaatcctggcctcaagtgttctgcctg
-cctcagcctcccaaagtgctgggattacaggtgtgagccaccgtgcctggtcttatatta
-ttttaattttaaatttaaGAATACATTCTTAATATCAACCTTCAAAGACTCCCTGTTGCT
-TACCAAGTTAAGAAAACTACTTAAACCTCACATATAATTCCTTTCTCAACTGGGACCAAT
-AAACCGTGACAGCTTTATtgaagggggccagccccttcacacctgtgggtatttctcgtc
-aggtgggatgagagactgagaaaagaaatagacacagggacaaagtacagagaaagaaca
-gtgggcccagggcactggcgctcagcatacgaaggacccgcaccggcgccagcctctgag
-ttccctcagtatttattgatcatgatctttactatcttagcaaggggagtgtagcagggc
-aacaggtggggagaaggtcagcagggaaacatgtgagcaaaggaatctgtatcatgagta
-agttcaaggaaagatactgtgcccggatgtgcacgaaggctagatttatgtttctcttta
-cccaagtatctcagtgtagcaaagagcaacagagcagtattgctgccagcatatctcgcc
-tccagccacagggcggttttctcctatctcagaatagaatgaatgggaatggtcggcttt
-acacagagacattccattcccagggatgagcagagaagccttcctcttatctcaactgca
-aagaggcctccctctttcactcctcctcctcagcacagaccctttatgggtgtcgggctg
-ggggatggtaaggtctttcctttcccatgaggccatatctcaggctgtctcagttggggg
-aaacgttggacaatacccaggctttcttgggcagaggtccctgtggctttccacagtgca
-ttgtgtccttggttaacagagaatggagaatggcgatgacttttaccaagcatactgcct
-gcaaacatattaacaaggcacatcctgcacagtcctaaatccattaaactttgatccaat
-acagcacatgtttctgtgagcacagggttggggataaagttacaagttaacagcatctca
-aagcagaaacaatttttcttaatacagatcaaaatggagtttcttatgtttccttttcta
-catagacacagtaacaatctgatttctctttcttttccccacaCTTTCTCACGTGttctt
-tctttctttctttcttttcttttttgagatggagtctcgctttgttgcccaggctggagt
-gcagtggcgtaatctcagctcactgcaaactctgcctcccaggttcaagtgattctcgtg
-cctcagcctcccgagcagctgggattacaggcatgcaccatgacgcccagctaatttttg
-tattttcagtagagacgggtttcaccatcttggccaggctggtctcgaactcctgacctc
-aagtgatccacctacctcagcctcccaaattactgggatcatatgaatgagccaccatgc
-ctggccCATGTTTTTCTTGTACTTTAGGCTTTGCTACTTACAACCAGAACTGCTTACCAT
-TCtgtcagaagccttccaaccagggcaactccatcttgaataggggctgggtaaaataag
-gctgagacccactgaactgctttcccagaaggtcagacattcttagtcacaggatgggat
-aggagtttggcaggactggtatcacaagtacaggtcacaaagaccctgctgataaaacag
-gatgcagtaaaagaagccggccaaaatccaccaaaactacgatggggatgaaagtgacct
-cgattcgtcctcactgctcattatataggaattataatgcattcgcatgctaaaagacac
-tcccaccagcaccatgagaatttaccaatgccatggcaacgtcaggaagttaccctacat
-ggtctaaaaaggggacgaaccctcagttctgggaattgcccatccctttcctggtaaaac
-aatgaataatccaccccttgtttagcatacgatcaaggagtaactataagtatgttcagc
-tgagcagcccatgccactgccctgcctatggagtagccattattttattcctttactttc
-ttaaataaacttgctttcactttactctatggattcaccccaaattccttcttgtgtgag
-gtccagaaaccctgtcttggggtctggtttggtacccctttctggtaataATTCTGTAAG
-TATTTGTAGTACGTCTGAGCCACCAAAATTTCcatactgatccttccattagaatatcct
-ttctgcctgtctctttctggcaggatctgatccatatttcaaagccagtctcaaatgcca
-ccttttccaaagaaacctatcctTATATCTTTATCTAATACAAACAGTATATATTGGGAG
-CCTAAGAAATGCTTGTTGCATACATCAATGAATGAACCCCAAACCAATGTATTTCTCCCT
-TCCTTGTAATCTCCAGAAATGTTTATAAACTTTGTTGTTGTTTAtttgtttgttttattt
-ttatttttattttgagatggagttttgttcttgtcacccaggcgggagtgtaatggcgcg
-atctcggctcaccacaacctctgcctcctgggttcaagtgattctcctgtctcagcctcc
-cgagtagctgggattacaggtgtgcactaccatgcccagctaatttttgtggttttagta
-gaaatggggtttcaccatgttggtcaggctggtctcaaactcctgacctcaggtgatcca
-cccgccttggcctcccaaagtgctgggattacaggcgtgagccaccgtgcccggccTGTT
-GCTATTTATTTAATATACTTTATTTTTTTGAGCGATTATAAGTTTATTtttatttattta
-tttatttatttatttatttttgagacagggtctcattgtcacctcttgcccaggctggag
-tgcagtggcacgatgttagctcactgcaacctctgcctcccagagtcaagtgatcctgcc
-acctcagcctcctgagtagttgggaccacagatgtgcaccaccacgctgggctactattt
-ttatatttttagtgcagatggggttttgccatgttgctcaggctgatcctgaactcctga
-gctcaagcaatctgcctgccttggcctcccaaagttctggaattacatgcgtgagctact
-gagcccggccTTAGGTTTACAGAACAGCATTCCACCCATGTTATTTATGCAGGGGAGCAC
-ACCACACACATCACTTTGCAGCTTCCTTTCTCCTCTTATATGTCTTACAGATCTTTCTGT
-GTTCTGTACATTGAGACACTCATTCATTGGCTTCACTCATTCATTTGAATTCattccttt
-gttcaacagatatttatcgtcagctctatgtcaggcactatgagaagtgcttgggatata
-aaactgaacaaaataaacaaagtcctttccattggagagatgacattctagtgtaaggag
-atagacaatagataataaatacaacaaataaataaatacatggtttagtatgttataaga
-tgctttctgtaggaaaaaagtgagagggacctggagtggagggaggaccgagtggggaca
-ggtgcagggtgggggcagccagtagagcccctctgaggaggAGTGGATCACAGGAGGATG
-ACTGGCAAGACCTAAAGGTGGCAAGCTGTCTCTGGTGCTGGCTCTGAGAGCAGGATAGCT
-GGAGTAGAGTGAGGGAAAGGCGAGGTCAGAGGTGAACCTGCAGGGCAGGTGGGGCTCCTT
-CCGCTAGCgcatggtgttccattatccagatgcaccaggacaaatgtcgcccactgccat
-tactaggtgcttaccatgtgccatcaagaacaataccgcaggccgggtgcggtggctcac
-gcctgtaatcccagcattttgggaggccaagatgggtggatcacttgaggtcaggagttc
-gagaccagcctggctaacatggtgaaacctggtctcgactagaaatctaaaattagccta
-gcgtggaggcgcactcctgtaaacccagctacttgggaggctgaggcaggagaatctatt
-gaacccaggaggcagaggttgcagtgagcctagatttcgccattgcactccaactgggca
-agagcaaaaatctgtctcaaaaaacaaacaaaaacaatactgcaataaacattctgtcag
-tctgtcattttgcccatggacagaatatctgcagaattaattcccggcagtgaacttgAG
-AGAGATCACCCAATTGCCTTCCAAAGGAGCTGTGCCTGGACCATGGGTTTCAGCACAAAG
-TGCTGCTCCCTCCAACTTGTAGACTCTTCTGGCAGGTCACGGTGGAGCTCACATTCTAGC
-GGGAGAGTGTCCAGGGCAGAGATATTCCATTCCGTGTCTTTTCTCCCAGGGCTCGCACAG
-AGAGGGTTCACGCGGTAGTCAGTAGGTGGGCAGTGCTTGGTGAAGGCATTGATGGGTGGA
-GGGATTGAAGGATGAATGAATGGATTAGGGGCTGACAGTGCCGCTGCAGTTACTCAAAGG
-AGCCACCAGGAGGCGCAGGGAGCCCACATTCTGGAGACAAACCTTTTAAAAAAAGCATCT
-GGTGACTTAACGACCTTTTCACCAATGGCTTGTGTGGGGCCTTAATGCTAGGGTGAGAAA
-AAGGTGGGAGATGGAAGAAAGGGGAGTGGGTAAAAGGACATGTGGGAGAAGAAGGCAGAG
-AGAGGGCCTTCTGAGGGGGCCTCCACGCCAGGTAAGGACCGTTTAGCTCCCCTAAGAGCC
-TGCAGCATTGATGCAGATCCCAGCAAAGCCAAAACCCCCTTATGCCCACAGTTGAGCCCA
-AAAGCCCAGAACAGAGGGGAAAAATAAATTTCAGGATAggccaggtgaagtggcttacgc
-ctgtaatcccaaaacttggcgaggtcaagtaatcccaagtactttgggaggctgacaggg
-gaaactctatctaaaaaaaaaaaataaGAAAAGGAATTTCCAGGATAAATATGTACAGTA
-TAATCCCATTTATGTGAAAAAAAAAATCTCCACAAATAAATTCCTTtgtgcgtgtgtgtg
-tgtgtgtgtgtgtgtgtgtttgtgtgtgacggagtctcagtctgtcgcccaggctgaagt
-gcagtggcacgttctcggctcactgcaacctccggctcccaggttcaagcaattctcctg
-cctcagcctcctgagtatctgggattacaggcgtgtgacaccacacccagctaatttttg
-tatttgtggtagagacggggtttcaccatgttggtcaggctggtctcgaactcctgacct
-cgtgatctgcccgcctcagcctcccaTAAATTCTACATATTAGTTTGGGGAGTGTGTATT
-TACCACATACACATCTACAGGGAAAATCTGGAAAGGTAAATGTCGAATTGACAACAGTGG
-TTACTTTTGTTATTGTGTGTGTAGAGAGGGGCAGGGGACAAAAAGGAAAATGAGGAGTGA
-TCAAAGGGGACTTTAATTTTCTTTTTTTTTTTTGAGACAGAGtctcagctcactgcaacc
-tctgtctcccaggttcaagtgattctcctgcctcagcctcccaggtagctgggattacag
-gcacccgccaccacgcctagctaatttttgtattttattttagtagagacagggtttcgg
-tttcaccatgttggccaggctggtctcaaactcctgacctcaggtgatctgcctgctgcg
-gcctcccaaagtgctgggattacaggcgtgagtcactgcaccgggccCCCAAAGGGGACT
-TTAGACTAAACTGAAACATTTTAACTTTCCAGGAATCTGTAACCCTGCTATTATATAACC
-ACAAATTAAAAATTACTTTaaaaaatgaaaaaaaaaaaaaaaaaaaaaaggctgggagcg
-gtggctcacacctgtaatcccagcactttgggaggctgaggcaggaggatcacgaggtca
-ggggtttgagaccagcctggccaaaacggtgaaaccctgcctctactaaaaagacaaaaa
-ttagcagagtgtggtggcacgtgcctgcagttccaactactcaggaggctgaggcaggag
-aatcgcttgaacttgggaggcagaggttgcagtgagcctagactgcgccattgcactcca
-gcctgggcaacagagcaagactccggctcaaagaaaaaaaaaaaaggaaaagagaaaaaA
-AAAGGAACAATAACAACAACaaaaattaaatgctatcttgtgttgcatcaatagaagtct
-tacgtgcagctcaagggaggtgacagccccctctgctctgctcagaccacacctgggacc
-tcctttcctcttcttggccctgtcccgtgagaagaataatgacagcctaaggcatgCTGG
-GGGTTGGAGATGGGGGGAGGCTGGGGCCATCTGCACATGATACAGATCCAGGAATAGTCC
-CTTTACCCAAGCGGGAGAAACTGGGCAGGTGAGCAGCTTCCAGGTGTGTGGATGGCAAAT
-GGATGCCAGACTTTAGGATAGGAATCCAGGGGTGCAGCGGATGGAAAGTCCAGCCCAGGA
-TGGGGCATAGTTTTCCCACCCAGCTAGGGAGGGAGGGTAGGGGCTACTCTGGGGTGTCAG
-GAGTGCCGAAGCCTGAGGTAGGCGCAAGCCAGGCAGCATGGCAGCATCCTTCCAGAGGGT
-GTTGTGCAGCTGTGGAAAACAATTGCTGGGAGGCCGGCAGGGGCAGTGGTGGAGGAGACC
-AGAGCTTAATTCTAGGTGAGTCACAATAGCCTCATCTGTAGAATGAGTGAGGGGTGGGGC
-GTAGTTTCAGAttttttttttttttttgacacgtagtttcgctcctgttgcccaggctgg
-agcgcaatggcgcaatctcggctcaccgcaacctccgcctcccgggttcaagcgactctc
-ctgcctcagcctcctgagtagctgggattacagccatgtgccaccatgcccggctaattt
-tgtatttttagtagagacggggtttctccatgttggtcaggctggtcttgaactcttgat
-ccgcccgccttggcctcccaaagtgctgggattacaggcgtcagccaccgtgcccCACCA
-GTTTCTGACTGAttttcttttttttttttttttgagacggagtcccgctctgtcgcccgg
-gcgaagtgcagtggcgcgatctcggctccctgcaagctccgcctcccgggttcacgccat
-tcccgggcctgggaccacaggcgccgccaccacgcccggctagtatctttttttattttt
-attttcaatagagacggggtttcaccgtgttagccaggacggtctcgatctcccgacctc
-gtgatccgcccgcctcggcctcccaaagtgccgggatcacaggcgtgagccaccgcgccg
-ggccCAGCTTCTGATTTTATGCAGCTGGCGGGATCTTGTTCTTGGTCCTTTAAGGCGACC
-GGAGGGATTGCAGTTTTAAAAACTCGCCAGCAGAGGTCGCCTTCTGACGGATTTGACCAA
-AAAATCCATTCCGGTGGGAAAGGGGAACCTGCGCCTGCGATtctctctctctccccctct
-ctccctctctctttctctccccccctctctctctctccctccctccctctctcctcctac
-tcctccctccctccctctctctgtctctccctccctccctcccgctctctcccccctccc
-cctctccccctccctccctcccttcctccctctctGtctctttctttgagacaaagtttc
-actctgtcacccaggctggagtgcagtggcacgatctccactcactgcaacctctgcctc
-ccggggttcgtgattctcatgcctcagcctcccgagtagctgggattacaggcgcccgcc
-accacgcccggctaatttttgtatttttagtagagacggggttttgccatgttggccagg
-ctggtctcaaactcctgacctcaagtgatctgcctgcctcggcctcccaaaCTAAGATTC
-ATTTGTTGACTAAGTGAATAAAAGGGGAGACATTGAAGAGGGGGACCCgactggatttgg
-gggtgaaggtggagttgagagtgactttgaggcttctgcttgagcaatgagtggagggtg
-cctctcctgagctggggaaactggggcagCACTGACGGAGGGGACACAGCTACAGAGGGG
-AGAACCCTCTCCTGCCGGGGCTGCGGGTTACAGCCTGCACTGCGATTCTCTGATCTCAGG
-GACCTCAGACTTCTGGGGCCCTGTCCCCTACCTCTGTGTATGACCCTAGCTGGCTGAGGG
-CTGAAGGCTTGCTGTTGGCTCTTTCTGCACCCTCAGCCTTCTCCTTCCTCTTCCCTCTGC
-AGGACTCTGTCCTGGGTCCTTAGGAAGAGTCCAGGCCCCAGGACAGGGAAGTTGGGTCAG
-GCCTGGACCTCACATTCCCTGCCTGTCCCATGAGGTGGACAGTGAGAGGACAAATGCCTG
-GACCCCTGGCCCCAAACCCAAGAGCAGATGTACCGGAGAAGAGCTTCTTAGAGCACCAGG
-TGCCAGGGCTGCGGTGGAGAATCAGGGGGGCCCAGGGGAAGGGGCTGCAGATGAGGGAGG
-AGATAGATACGGAGGGCCTGTGTGCCTCCCAGATACAGGGCTGGCTTTCCCAGCCCAGAA
-GGTTCTTTCTGCCTTTCCCAGTCTTCTTCCATTCTCATTTCATGTTCACACTTTTGGCCA
-TACCCAGGGTCAGCCATGAAGATTGTTCTCAGAATGTtttctttcttccttcctttctct
-ttcttttctttctttcttcctttctttctttcctttctttttctttcttctctttctttt
-tttcttttcttctttctctctctttctttctctctctctctctccttccttccttccttc
-ttttctttctttcttctttctttttttgaaacagagtctcactatgtcacccaggctgta
-gtgcattggcacgatcactgctcactgcagccttgacctcctgggctcaagtgatcctcc
-cgcctcagcctcctgagtagctgggaccacaggtatgcaccaccatgcccagctgatttt
-ttaattttttgtagagatgggggtctcactgtgttgctctggttggtcttaaactgctgg
-gctcaagtgatcctcccgccttggccttccagagtgttgggattacaagcaggagcagca
-cacctggccAATGTTTTATTTAAATCAACTCACTTAGGTTGAAttagaataattttagac
-acacagaagagtgtgtctatataattttgaattatatacccaacactcagatataacatt
-agcattttgccatatttgcttcatctatttctttctgaaatattttaatgtaaattacag
-atatcatgaattttcatccccaaatactttagtctgcatCAGTCAAAGATATCTAATATT
-TAATCCACAATGGATTTCCCCAGTGGCAATTCCCCTAAATTGTGTTTTACAGTTGACAGT
-GGatttattgtaaaaggaaactcgatataccaagtgacaagcaagttatcttctgttata
-aatagaaaggatccctggaaatggacacagtgtcaggcccagagctgtgggtggagacct
-gctctctgtttgacataaataggagatcagtggctactaaatctgaagacagggcagcag
-caaagaacattttctcacggatgtgatgagacttgaaagggactcagaaagggggtcact
-ttctccaggttggggtaactgttatttaagccagggttcatCTGCAGCGTGGGGAGCCAG
-AGGGTGACCCCTTCCCTAGGTGATGGAGGTGGCTGAGGCTCCAGAAGTTTCCAGAGAAAG
-ATCTGGTGTTCCTACAAGGCCAGTGGCAGGGGGAAGGGCACTAGACAGTGGGGCTGGAGG
-GTGTGGGCCTGTCCCTGCTCTGATTTTGGGCACTGCACTTTTGCCTGTAAGAAGGGGATA
-TGTGAGGCCAGGACAGGGTCTCCTACTCTGTCCCCACTCCCACGCCAAACAGGGCCTTGA
-GGACTCTCGCGACCTCCATGACCCAGCTTCCCTCCTACCCCAGCCCCAAGCCTGTTTTTG
-TTCCCCTCCCTCCctcctgcttgatctttgagcctcagccaggatgttacctcctcctag
-aagcctgccttggtccctggaatggattaagggactctctcctgggccccacagctgccc
-aggatcactcagcactgtagtgccctgttggcctttgcctccctccagctgtggacgtac
-aaagcagacagcgaatctgtcttgctcaccactgtacccccatcccctactgcagcacct
-ggcacatagcagtagtgcggcacacttgttgaatgaataaGGGATCATTACTACTACGCT
-TCCCACTCATAAATGTCTGCCTCTTCGGGGGGCTCAGAATGCACATTTGGTCCTTCATTA
-ACTCATTTACTCACAAttttttttttttttttttttttgagacggagtttcactcttgtc
-gcccaggctggagtgcaatggtgtgatctcggctcactgcaacctctgcctctcaggttc
-aagcgattctcctgcctcagcctcccgagtagctgggattacaggcgctagccaccatgc
-ctggctaatttttgtatttttagtagagatggggtttcaccatgttggccaggctggtct
-cgaactcctgacctctcaggtgattcacccacctcagcctcccaaagtgctgggattaca
-ggcatgagccaccgtgcctggctcatttactcacaaatatttactgagcacctactatgt
-cccaagcagtattctaggcactggaaatggggcaaggctgctgcctctgtggaacttata
-ctggggtgtgggaggcaaagaaaaacaagcaaacatacatatgaaataatttaagatgcc
-actcgtggtgggagggactgacaggagctgctgtggaagagagcattaggagggccttgc
-tgaggggtgactttatttcagctgagaggtggatgagaaggcacctgcaggggaagaaga
-accaggggaagggtgttcctgatggagcaacagcctgtgctaaggccccaaagtgagcac
-cagctgggcgctgagggacagaaccaggcacaggctcggttagaggaggtctgaggtccc
-agaggagacaagagaggggaaggatgggagggcaggcctgagccgcagaaggccagtgga
-aggttctgagtgggaagaggatgggataggagttatattctgaaaggtccgcctgtgctg
-ggtggaggatgggtggggacaggcaggagcagcccaggctctgatgcagcctccaggcag
-agatgGACCAGGGGAGCCCATTTCATATCCGGCCCCTGTGGAGGGTCTGAGGGTGTTGAG
-CAGACAGGCCCTGGCTTTGGAAGTCCTGGGTGTCTGGACCCGCCTGCCTGTGGGGCCCCA
-GCAGAGAGGAAGGGAGGCGGGGCTCCCAGTGCCTGTTGACTCATTTGCATCTGATTTGCA
-TGTGAAGCAGAGAGTCAGGTTGAAAGCTGGGAAGGCCTGTGCCAGCCCTGGGTAGAGGGT
-CTTGGGTGTTAGTTCCCACAAAGACTCTGTCCCAGGCCATGACCTTCCTGTTCAGGAGGG
-GCTCTGCCTTCCCTTGCCTCCAACGCCCCTCTGGCCTGGCCCTGCCATCTGGGGCTGGGC
-AGTGCCCACGGGGACAAGGTCGTTTCCTTTTAGGAGAGGTCTGCATGCTATGAGGACAAA
-GGCCAAATCCCCACCCTCGGGAACCTCCTTCCCCAGCAAAATCCCATCTGTCAGGCTCAG
-CCTCTGACCTTCGACCTCTCTGTCAGCACAGGCTGCAGTGTTGGGGAGGGGAGGGTCCCC
-ACCCCCAACCCTAGGGGAGACCCAAACCTCTCCCCCCAGCCTTCTCCATCTGTCCCCTTC
-GGCTtctgccacctgctccgtgtgatccaggccaggtcacctccgctttctgggccttgg
-ttcccccacgtgtccaatgtgggTTTCCCAAATACCAGTGACTTGTGTCAGTCCACTTTT
-GTAATTGTAGCCAACTCCacttactatttcttaagtgaacttactctccttcacttaaat
-agatttaatttaaaaagaaatgttataccagctctgtaaatggaaaaccagtttcatctg
-ccacaagtagaaacataataggaaaaaataatgaaatggaaataaaacaatgttactcta
-gtctagcCTCaagtgaaaaaagtcagacacaaaaggttacatttatatgattgtctagaa
-aatgcaaaactagagagaaagaaaacagaccactggttgccagggttggggagagggagc
-tgacaatatcaaggggtgcagaaactttttagggtgatccaaactgttttttgatgatga
-tggtggttacagattgtatacatttgccaaaaatcaccaaagtgtacattcaaagttggt
-gagttttattttatgtataaaccacctcaaaaagacaaaTTTTAGAGAAGAAAACAAAGA
-AAAATGCCGGTTTAGCCCCAAGTCTGAGGCTTCCTCTCTGTTAAACAAATTAGCAAATAG
-AAggccaggcatggtggctcatgcctgtaatcccagcactttgggaggctgaggcaggag
-gatcacttgaggtcaggagttcaagaccagccatggccaacatggtgaaatcctgtctct
-acaaaaaatacaaaaattagctgggcgtggtggcgcatgcttgtaattccagctactcag
-gaggctgaggcaggagaattgcttgaacctgggaggcggttgcagtgagccgagattgca
-ccaccgcactccaccctgagtaacagagcaagagactccatctcaaaaaacaaacaaaca
-aacaaggaagagaaAGAGGGATTTCTCTCTCTGTCTCTCACCAACTCTCTAACCCTCCCT
-AGTTCcatgcaccaaggaaaagctatgtgaggacataggagaaggtggccagccacaggc
-caagaagagagccttcaccagggactgaatcagctggcacctccatctggtacctctagg
-ctccagagctgtgagaaatagatgtgtgctgtttgagccacatagtctctgatattttgt
-tttggcagccggagcagactcatgcCCTCTGATCTCATCATTAGCATAATGCctgtttat
-agaaccatgctgtgggcaggctctgtgctaaaagctttgccagcatcatttcagagactt
-gatgtgacatcttacatcgtaggggaaattattgttcccattaaagatgggCCCACAGTG
-TGGCTAAGCCAGTGGGGCATGTCCTCAGACCTGGAGTGCTCCCATAGGAAGCTGGGCCCG
-ATTCTTTCTGAAGGTGTGAGCTGGAGGCAGTGATGGTGGTTTGAGAGGCACGGGCTGTGG
-GGAACTGGATACTGAGGGCAGTCCCTGTGTCCCAGGGGAAGCACTCTGTGCTTTCAAGGG
-GGGCACTGGCAGAGAAGGAAGTGTCCCTCATCACATCCTGGAGACCCACCCTCTGGAGAC
-AGTGTTTTCACGAtttcttttctttcttttttttttcagacagggtctcactctgtcacc
-caggctagagtgcagtggcacgatctcagctcactgcaacctctgccttctaggttcaag
-taattctcctacctcagcctcctgagtagctgggattacaggcacccgccaccacgccca
-gctcatttttatttttttatttttcgtagagacagggtttcaccacgttggccaggctgg
-tgtcaaactcctgacctcaaatgatctgcttgctttggcctcccaaagtgctgggattac
-aggcatgagccatcatgcctggccATGTTTTCACTATTTCTATGGACCGTTTCATAAGTG
-TTGTGTGGACATAGGgctccagggttaaatgtgtttgggaaatgtggtgtaagcaaagag
-aaagaagtttccactctaatacttctcagagactttaatgtggagataggcatggcgaat
-ctcTCACTGCGGGACAAgtgggcaagagaagtgtggatgctgccttctgggcactcacag
-ttggtggaggagacagccaacatgcaagcaggggccacaccacatgtctggaggttggaa
-cgctatgcagagagaccacaggaaccatgggggaagtggggagggatttcccagaggaga
-tgacatttgaacaaagatgcaaaggaagtgtggaaggaggtaagggagagctgtatgact
-gtctgggggaagagaaacccaagcagagggaacagcaagcacaaaggttctgaggctcaa
-ggttgcttggtgcatttgacaagcagaccagcgccattggctggagctagctgggccgag
-tgggagggtgataatggatgaggtTGACCACGGTCCGCTCCCAAAGGCCATGGAATTCAG
-AGCATACTGGAGAGCCCTTAGTGGGTTTGGACAGACAGTGATACCTTGGGACACACAGCC
-TCATGAGCTCATACTGACCAAACAAACCACCCAAAATAGCAGCAGAAACAACAGCCACAG
-GGTGCAGAGGGTCATTCAGGGTGcctctcacaagcctgggaagtaggcatgtgatatggt
-ttggctgtgtccccacccaaatctcatcttgttttgtaactgcttcaattcccatgtgtc
-gtgggaggaacccggtagggggtgattgaactgtgggggcaggtctttcctgcgctgttc
-ttgtgatagtgaaaatgggtctcacgagatctgatggttataaaaatcggagtttccctg
-cacaggctctcttttttgcctgccgccatccacgtaagatgtgacttactcctccttgcc
-ttcggtcatgattgtgaggcctccacagccttgtggaagtccattaaacttctttcattt
-gtaaattgcccagtctcgggtatgtttttatcaacagcgtgaaaacgaactaatacagca
-cggttaactcccattttacaggcgaggaagctgaagcttagaaagatgaaagaatttgcT
-TGTGACCCCGAACGTTCCCTCTGGCTGATGCATTGTTCCTACCTGCTCTGTTTCCTTGTT
-TATGAAGCTTGCAGGCTCCAtggtcctcaaccctggctgctacacactggaataacctgg
-ggtggcagactgtgtctccccaggatggccacaccaatacatctcacatcccacatgctt
-ggccaatagcatatgacagatgtgactgtgggttacttctaaagctaggccataatagcc
-atcgcaaccccaccgtgatctctgggattgctagttctgagggaagccagctgccatgtc
-ctgaggttactcaagaagccctgtggagtaggccatttggggagggactgaggcccccag
-gcaacatctgtcccaacttgccagtcatgttagtgaactacccttgtccagccttcagat
-gacACCTCATGAGAGGCCCTGAGAGAGTCTTATTGTCCCGTTCACCATTCCTGTTGCCCT
-GTGGCCAGCTAATCAGCTTGTGGTGGTTTTCATTTCTTTTTTCTTTTTGCCATTAATAGC
-AATGCCAggctgggctcagtggctcatgcctgtaatcccagcactttgggaggccgaggt
-gggtggatcacctgaggtcagaagtttgagacaagcctggctaacatggtgaaaccctgt
-ctctattaaaaatacaaaaattagccaggtgtgatggtgtgcgcctgtaatcctagctac
-ttctcccaagtagaagggcgtgattcttctcatgcctcatgctgaggcatgagaatcact
-tgaacccgggaggctgaggctgcagtgagcggtgtttgtgccactgcacttcagcctggg
-cgacagagtgagactatctcaaaaaaaaaaaaaaaaGTAGCAATGCCATAGTAAGTATTC
-TTCTAATTAAGCCCTTCTGAATCAGCTTAATTATTTGCTTAGGGTCAATTTCTAAATGCA
-CAGTTGCTGGATCAGAGTACAAGTCCACTGATACAGCATTTAATTTTTTCAAAGAATTGT
-GACTGggccgggcacggtggctcatgcctataatcccagcactttgggaggccaaggcgg
-gcggatcacctgaggttgggagttggagaccagtctgaccaacatggagaaaccccgtct
-ctactaaaaatacaaaattagctgggcatggtggtgcatgcgtgtaatcccagctacacg
-ggaggctgaggcaggagaattgcttgaacccgggaggcagaggttgcggtgagctgagag
-ggtgccagcttgggcaacaagagtgaaactccgtctcaaaaagaaaaaaaaaaaaaaaag
-aaTGTGACTATagctggccgtggtggctcatgcctgtaatcccagcactgtgggaggcaa
-gatggtcagattgcttgagtcaaggagtttcagaccagcctgggaaacatggcaaaaccc
-tgtctctacagaaaaattagctgcgcatgggggcagacacctgtagtcccagctacgtgg
-gaggctgaggtgggagcatcacctgagcctgggaagtcgaggctgtagtgagctgtgttt
-gcaccaccgcactccagcctgggcaacagagtgaggccttgtctcaaaaaaatttaaaaa
-ataaataaaTGTAACTATATTCTCCTTCAGTAGCAACATCTCAATTTACCTTCTCATGCA
-CAGTGTTTGGAAGGACATATTTTGGGATGAGTTTTCTTTTACTTCACTACCTTATTTTGT
-TCTTTCATAGAATGCCTTTAAAATGTTACTTTAAAAAAATAGATAATACCTTTACAAGGT
-ACAAAATCCAAAAGGTATAAAAATGttttctttttttttttggagacagagtttcgctct
-tgtcgcccaggctggagtgcaatggtgcgatcttggctcgctgaaacctccgcctcccgg
-gtttaggtgattctcctgcctcagcctcctgagtagctggaattacaggtgcccaccacc
-atgccctgctaatttttgtattattagtagagatggggtttcaccatgttggccaggctg
-gttttgacctcctgacttcaggtgatccacccaccttggcctcccaaagtactgggatca
-caggcataagccaccacgcccggccAAAAATATTTTATAAAAGTCTTTCCCCCACCCCTT
-TCCCCTCAGTCAGCACAAGTAGCCACCACTGGGACCAGTTTCTGGTGGATAAATCCAGAA
-AAGTTCAGGTGCAAGTAAACACACATAGAGAGAACACCCTTTAAATTAAATGAAACTAAA
-GAAAACAGAGCCATAGGTGCACAGGAGACAGAGAGCTGACATCTGGGGCTGATTGCATCT
-TGGTTTCGAGCTGAGTGGCAAAAATACTGCTAAGGTCAACGTTCTGAAGGAGGCAAAACC
-CACACGCAGAACCAGCCATAGGCCTGTCAACAAGGCGAGATGTTATCATTGCTCATGTGC
-TGGGTCAGGATAAGGCCATACAGACCGCCCAGTTCTCTCTGATCTGGGTGTAGTTAATGA
-CAGTTTATCCGCCTTTTTCTTCTCTCTCACCACTCCCCATGGTGGGGGAGGAGAAGGACT
-GGGAGGACTTGAATACTCTGAATTGGCACCAGGTGCTTAATATAGTCCTGAAAATAGAAG
-ACCAATATGCTGTTGGCACATAAAGATGCCCACAATTCTAGAATCTGAGTGCGCCCAGAT
-GATCTCTCTTTACATGGCCTAATTTGGGATCCTGACAAGTTCCTTCTGCCCTCTGCCTCA
-CTTTCTCAATCTAGGAATGGGCCTCTCGGTTTTTGTTTTGTCTAATTTTAAGCTCTCGGC
-TGTGCATGGCAGAGGCAAACTTGAAGACGCAAGGGTCAGTGAGCAGGGCCTTTATCCAGG
-TATCTCAAATATCTCCCAACCCTGATTAAAGTTACATATCTCAGAGAAGAATTTGGTCAA
-CACCATTGTTGTCATTCCTGGTTAATAACAGGGAAGTTGAGGTctgggaagcaccctagt
-gatgtgttcacatggccatgtgcttctgtaaaatttaccaatgtaaggcatcttaacctc
-attctgttaaaaccactatctcctttcattccaacttccctttgcatcagatgatgttgg
-ggttggtgtgagcagtttgggcatcttgctaaaaggaccttaacatttactttgggttta
-gtgggatatatttatattgtttccagtcacttttgtgaaaaattattactaactgacctg
-gtattgaaatggcttccaggaatatatccataccgagcatactgagctgactcaacttgt
-cgtggcatcaagattcaggatcagaggttatatctcaagatatatgaatggtcctacagc
-actcagttccacaagactgtgaaggagaggtttgaatgtatacacggagccagcagctag
-tttatggaaagtattacagatgtgtttgagacaggcagctaataaaaagaatgttatttt
-tctgcgttttgtaacgtttgtgcaatttctcttttttttttttttttttttggagacaag
-gtcttgctctgtcatctaggctggaatgcagtggtgaaatcatggcttactgcagcctca
-acctcctggtctcaagcaatcctccctctcagcctcctgagtagctgggactataggcac
-gtgccaccatgcctgactaatttcttttttccttttttttttttttttttgagacggagt
-ctcactgtcgtccagcttggagtgcagtggcacaatcttgactcactgcaacctctgcct
-cccagattcaagtgattctcctggctgagcctcccaagtagctgggattacaggtgccca
-ctaccacgtccagctaattttttgtatttttagtagagatgaggttctgccatgttgtct
-agattggtctcaaactcctgagctcaggtgatccaccagcctcggcctcccaaagtgcta
-ggattacaggtatgagccaccatgcctggccagctaatttctttttaaaatttttttgta
-gagctggggatctcgctttgttgcccaggctggtctgaagcccctgggctcaggcactcc
-ttccacctcgacctcccaaagtggtgggattacaggcatgagccaccttattgtggtttc
-ttgtctctttctaaccaaatcttcactttattacttaatttcatatctgtaattttttct
-taaagaggtctccctaGggctggacgtggtggctcacgcctgtaatcccagcactttggg
-aggccgaggtgggtggatcgcctgaggtcaggagttcaagaccagcctgaccaacatact
-gaaaccctgtctctactaaaaatacaaaaaattagcgggtatggtggcgggcacctgtaa
-tcccagctactcaggaggctaagacaggaaaatcacttgaacttgggaggcagaggttgc
-agggagctgagatcgtgccattgcattccagcctgggcgataagagtgaaactctgtctc
-aaaaaaaaaaaaaaaaaaaaaaaaagaaGTCTCCCTAGGCTGAAGCTACCTGCTCAATCT
-TCTCTTGTGTCTTATAGGATCACAGGATCCCCCTTGCCTTACCTCACTGTTACTCCCAAA
-CAGTTCTCACATGTTTACAAGGGAATGTAACAGAGTGGATCAGAGAATTCATTCTGGATC
-CAGACCGAccttagttttctcatctatataatgggaataatagcaggatctctcgcctta
-gatagtcatgaagtccaatgagatgatgtgtataaagccctaacacaatgTAGCAGAGGG
-CACAGGGCCAGGATTGATATTTAGCTGGTCCTCACGGATACAGCAGACTCCCTGTTTATG
-ACAGTGGTTGGCTCTGATTTGGTTGGTGTCCATGCCAGAGTGTACAATCATTATTAGCTA
-TTGATATATTATTAGCTCCCTCCCCTGCCCACCCAGGGGTTTACGCAGTAAGTTCTCAAT
-TATTGGCAATCCAAACAAAGAATAAAAGACACCAGCTGGAATGAAACAGAGAAGCTGGTT
-CCAAATTGAGCAATTCAGACTGACTGCTATAAAATTTCCTCACCTTAAAGGCCCTTAGAG
-TTAATTCATTCTAATCCCCCTAAAAATATACTTTTTTGACATGTTCAAGTATTGGAAATT
-TGGAAAATTCACAAAAACACAAAGAAGAAATTAACTGCTGTGATTATAGATGATTATACA
-CATATACATATGTATTTAATACATATTTATGCTGTACATAGTGTTTTGAAGCATACTGTA
-CTTCAAAAAAATTTGGGAGgggtgcattggcttatgcctgtaatcctagaaattcaggag
-gccaaagcaggaggatcacttgaggccaggagttctagactggcctggggcaacatagcg
-agacccgtagcttgacatggtgatgcgggcctgtagtcttagttactctggaggctgagg
-tgtgaggattgcttcaacctaggttacagtgagctatgattgcaccactgcactccaccc
-tgggcaacagagctagaccctgtctctaaaaaacataaataaaCCAATGTTTAATACTTA
-GCATTTCCCCCTATCTTTAAATATCTTCTAGCTACTTCACttttatttttatctttttga
-gatgatctcttgcccaggttggggtgcagtggcatgatctcagcttactgcatcccccac
-atcccaggttcaatctattctcctgcctcagcctcctgagtagctgggattacaggcatg
-tggcaccacgcctggctaatttttgtatttttagtagagacgaggtttcaccacgttggc
-caggctggtcttgaactcctgacttcaggtgatctggtcgcctcagcctcccaaagtgct
-gggattacaggtgtgagccactgctcctggTAGCTACTTCACTTTTAATGGCTGCATAAT
-ATTCCTCATCAGAAAGTGGGAAAAATTAggctaggtggcgtggctcatgcctgtaatcct
-agtactttgggaggctgagttggtagaattgctagagctcaggagtttaagatcagtctg
-ggcaacatggcaaaaccccatccctacaaaaaatacagaaaataccgggtgtggtggtgc
-acacctgtagtcccagctacttgggaggctgaggtgggaagattgcttgaccccaggaga
-ttgaggctgctgtgagctgagatcctgccactgcactccagcctgggcgacagagtgaga
-ctccatctcaaaaaaaaaaaaaaaaaaagaaaagaaaaaGATAAAGAAATAAATAAAGTG
-TTAATAATTAAAAGTACTTTTAGAGGGTTATGTCATAAGCCTTGACAAGACTTGTTCTGT
-AAAGCTACCCGGCATGCAAAAAGCTCAATTAAGTTAGCTCCTCCACAGGATGGAAttata
-taaccaatccctttcaagaggcattgaagttgtttccattattttgctatgatgaataag
-gctgagcaatattaatctttgctcatatctttggtcatttcctttgtaaatttcgggact
-gctgggtATGCACATTTTAAAATTAActcactcatcatcatgcagttaggagaacagaga
-aaggaaggggcttgcaccgggtcacatagggagttagcgtcaaagtcaggactaggaacc
-agccagggccctctaactGGAGCTCTTCCAGCTGGGGTCCTAGAGGAAGTCCCAGCTGGC
-CGCGGGAGGGAGGAGGAGGAAGGGAAAGAACCAGGCGCCGGGGCTGAAGCGGCGGCAGGA
-AGAAGGTGGGGCCGGCTGGGAGGAGCGGGCGGAGCTGCTGAGCAGCGCCTCTCCTTCGGG
-CGGGGGAAGCTAAGCGGTCGCCTGGCAACCCTGGCGGCGCGCCGTTCGAACGGAAGCGAG
-GAACCAATCAGGAAGTCCGGGGCGAACCATTCTGGTGTGAAGGGGGGCGGCGTGCTCACT
-TCCCCTTCCACGGCGCCCCAGGGACTTTCCCTGCGGTGGGGGCCTTCGACAGTGAGGGCC
-ACCCGCTCAGCTCGACCGCGGAGGGCAGCTCCAAAGGGGACCCCAAAGGTGCCCACGCGG
-GGCTGGGGCCTCCTGGGCGTCGTTGGGAGCGGCCACTACCGGCCCGGGTCCGAGCTGTCA
-GCCTCTCCAAAGCCTGCGCGAGAGGAGCCGGGACACGCCTAGCGCGGGCTCCAGGTGAGG
-GCGCGGGTGGGTCCGGGTGCGACCCCGGGTCTGGGGGCCCCGTTCCCCGAGCGTCTGCTG
-TCTGCTTTCTCCCCGCGTCGTACCTGCGTGTcatttcacagatgaggactctgaggctca
-gagaggcaagtgTCCCGGCCCGGCGAGCTCTGGCGGAGAATCCAGTTCAAGTCTTTCTGC
-CCCACCTCGCAGCCCCCTAGTCTAGTCACATCTGGACTTGCCTTGAGAGGCCCAGACGGG
-CAACTGGTAGTCATTTTCCCAGCGTTTTATCGGCAGGGACCTGTAGACCCCTGGCTGGAT
-CACATATCCCCGCGCCCCACACTGTCCTCGGGATACCCCCTTTGGGCGTCTGTCTTTCCT
-TCTCCGCAGTCCGGGGTTGGACTCGGCTCATTTGGCGCCTTTCTGTCTACGGGGACAGAG
-GACCACTCTTTGGGGATCGGACGGGACTGACATTTCTGGGCTGGATGCAGGGGCAGCAGA
-TTCTCCAGCCCCCAGAGCCGCTGCTGGCCTCTTGGGAATCATCCCCAGTTTGGGGAAGGG
-AATAGAGCCAGTCCCTAAACCAAAGCCACTAGTCACCAGAGACTTTGGAATTGGGAGTGG
-GGCCGGAATCCCCCCAGGTGGAGCAGCTGACCTAGGCCAGACCCTGCTGTGTCTCCtggg
-gacaccccctgccccctaggttgctattgtcagtctccttttgtaggtggggaaacggag
-gttctaagaagttaagccccttttcgaagtcacagtcagacaatgcagtggttagctcct
-agtccctctggcttcAATCTTAGAATCCTTGACACACAGAATCATGCATTTTGAGAGTCT
-TCAATCTCTTCATAAGGGAGTTACATATCCTCTCTCCTCTGGAGCCTGCCCCTGGCTTTG
-GGGGACAGGATCTCCGAGGACTCAGAAAGAAAACAAGGCTTTCTTTTATTCTTTCAACAA
-ATATTATTTATTGACTTCATAAGCCCTGCTCTGGTTCTTGCATGTTTTGGTTTTTTTACT
-TATTAGCAAATGTATCATCTTCTCCCACTGTGATGcaaggcaggggctgaggcaattgag
-ccagtgcaaaatttagggatgcccaaaacctcagtaatcaagaCTGAAACTAACGTTCAT
-GGACCATTTGTGTGTTCTGCAGGCAGGAGGTTAACTCACACAGCCTTCATGAAGTGCAGT
-CCTCCCAtctctctctctctctctctctctctctctctctctctatatatatatatacac
-acacacatatatacacacacacatatatgtatatatatgtatgtgtgtatatatgtatat
-atgtgtatatatatgcatatttataAATCATGAAACCACTgccctgtccctgagttgctc
-tgtgacattgagtaagtttcttcagtctctgggcTGAGCTAAGAAGTCATGATGGTGCAC
-TCAGGCCTGGGCAGAGGGCAGTCTAGGATAGGAAGTGGGCTTGGCTGTGGATCTGCCTCC
-CCCTCCCCTTTCTAATCctgcgtgccaggcccttccccaagaccttgcatgtgttatctt
-ccattctgtcctcactgcaaaatccttcatccccattttgcaacctcaagtgcagaccta
-ggcctagaagatcaaCTTGGTATCAGTGGGCCTAGATGTCCACATCCACACCCATTCCAC
-AGCCTACTCCCTTCTCCCTTCCTAATGTTAGTGCAAGGCCACCCTGAGCAAGGCTGACTC
-CTGGGCAGGCCAGGGCACCAGCGTCTGGGAGGCCTCCAGAAATAGCTCAGGGCCTGGTGT
-GGCTCTGGAGGTGGCCCAGCTGGGTGTCCCTGACCTGGACAGCTGGGCTGAAATTGAGCT
-GGGGCTGCCCTGCTGGCTGGCCCCTTGCCACTGCCTGGAGCCTTCCCAATCTCCTCTGGG
-GCAGGCAAGGGCCTCCCCAAATCTAGGCCAGGCTTCTGCTGAAGGGAAAGAAAGAAGCAG
-GTGGGAGGAAGGGGGCGGGTTGGGTGTAGAATGTCATGAAAATTATAACCTTTGGAAACC
-ACACCTCCCACCCCCTCACCAAAGAATaaaaatcactaacacctcttgagcatttactat
-gttctaagtactttacaagtatgaactcatttaattccctcaactctgtgatataaggta
-attactgctgttcttatttccatcttgcagaggggaaactgagcacaagagaggtttaat
-aatttgcataagataacctagaggtggagtttgaacccagagagtctggctctaaatttt
-acatttttTGGGGGGGGGGGTGGGGTGGGGCAGTGAATGAATtaaaatgtatataaaata
-aaatttaccattgtaaccacttttaagtatacagttcagtggcattaagtacattcccca
-ttgcctctccccccagtgcctggcaatcaccattctactttctgtttgagtgaatttgac
-tactttgggtacctctaggtattataaatggaatcataacagtatttgtcttgttgtgtc
-tggcttatttcacttagcataatgcctttaagtttcacccatgttgttgtatgtgttaga
-attttcttttttatggcggaataatctattctaatattctatgtatatgccacattctgt
-ttatccattcattccttgatggacacttggattgcttttggctgttgtgactaatgctgc
-tttgagcatgaatgtacaaatatctgtttgagttcctgtttttaattgttttgggtatac
-actcagaagtggaattgctgggtgatcctatggcaattctgtttaattttttgaggaact
-actttactgtgtttcacagtgactgcaccattttatgtgtccatcagcagtgcacaaagt
-gctaatttctcaacatcttcaccaacacttgttattttctgtttgtattttttttttggt
-aatggccatcttcaggggtgtgatgtggtgtctcattgtggttttaatttacatttccct
-aatgactaatggtgttgagcatcttttcctgtgcctgttggccatttgttatctttggag
-aaatgtctgttcaagtGACTCTGCAttgttttttttttttttttttttttttgagacaag
-agtttcgctctgtcgcccaggctggagtgcagtggcgccatctcggctcactgcaacctc
-tgtgtcccgggttcaaatgattctcctgcttcagcctcctgagtagctgggattataggc
-ccccgccaccatgctgggctaatttttatatttttagtagagacggggtttcatcatctt
-ggccagtctggtcttgaactcctgaccttgtgaaccacctgcctcagcctccaaagtgct
-gggattacaggcttgagccactgcacccagtcATGACTCTGCATTCTTAACCATTACCTG
-TGCTTCTCTTAGATTTGTAACCTCTGAGAATAGTGGATCAGCTTTCTGGGCTGATGAAGC
-CCTCCCTCAGGAGCTGGGCACTGGATGATCTATTTGGTTGAATAGTTATCATAGCCTGCA
-CTTTGGTGACATTTGTCATGCATGGACCTCATGCAGAgagggaggcactgttgtgagtcc
-tgttttgcagttagggaaactgagatatggagaagttgagtattttatccaaggtctcat
-agctaatcattggtggagctaggatttgaatgggttctggagtccatgctATACCTTACA
-GATAtggccagggggatggagtagtgaagaccactgcaggcagcagaaccagtgtgtgca
-gaggTTTGTATATGGTGGCTTTGGAGAAAGAACAGGACTTGGGTAGAAGTGGTCAGAGCC
-CAGCTTGAATGGGGGTGACTTGAAGTTGGAGGAAGAGTAGGACAGGTCTGGAAAGGCCAG
-GAGCACGGTGAGGGTTTGGGGAGGAGGCTTGGTGCTTAGGGACCCTGTCCTTTTTTTTTT
-TTCtcttctcacaagatatttattaattacaaagggaaaataataactgtacagtggaga
-aatttggcagatactgccttaaccaaggaattggctgatcactaagattaagacaaactg
-ttgttatgagtgggtgtggtaatgtacctatagtcccagccactcaggaggctgaggtgg
-caggattgcttcagcccatctatttgaggctgcagtgagctatggagtgcactccaacct
-gggcaacacagtgagacctcatttctaaaaaaagaaaaaagaagccttctgataccatgt
-actaagaaggacacaacatcacttttgtgttattcttgacagatatgtttaacttTCTCT
-CctttctttcttcctctctttctttcttctctctttcttACTGATATAAGAAAAAGCTTT
-ATACATTTAATATATACCTCTTGATGAGTGGCCTTGGCCTTTGAGGTGGGCTGGGTCCAG
-AACAGCCGGTTGTTCAACGGTATTTCCTCGTGTTTGGTCCCTGAAGGAAGAAAATTGGAA
-GGGTGTGATggagctcatggtccagtgggagagacaggaaacgagttatatttcctatcc
-tagataagagtatctaaaatgacaggatgtaatgagtgctcggaagggaataaaatgggt
-gaaattgctgagggggtctcttggaggagatgacatttgaaatgagatctgaagggggtg
-agggaagaggttccagacagagaacagctggtgcaaaagccctgaggcaggaaagacctt
-atgttcaggaacagcagggagggctttgtggccagagcaggaaagaggttggagataaga
-tgggagatttggacaaggactgagtcctggaaggcctgagggccaagtggggagcttggA
-ttttttttttttttttttttgagacagagtcttgctctgttgtccaggctggagtgcagt
-ggctcaatctcagctcactgcaggGAGCTTGGATTTTATTGTAAGGGAGCCACAGGAGGG
-TTTAAACACAGCAGTAATGAGACTTTATTTCTGCTGGGAAAACATtgccgttattgcccc
-cattttacagcagaggaaaccgagactcagaaccatgaccagggagtgcttcctaaggtG
-GTTTCTCCCTCTGGGGTCCAGCCGACGAGGCAGTAGATTCCTTGGGACTTCCTTGGGGGG
-CACATCTGGTGAGTGGCCAAAGCCCAACACTGAAAACACCGTCTCTTCCACCTCCCCTCC
-CCAGATGTGAgcctgggttccaatcctggctctaccattaatcagctgtgtaattttggg
-cacgtggccttacctcttggagcctcagttttctcatctgaaaatgggcataataatagt
-agccctcacagggtaggtgtgaggattaaattagttaacattttgtagagcttagaacag
-tgtctggtacaaagaaagtgctcagatgagatttgttcttTTCTTTTTTGGCTGTAAGTT
-TATTCAATGTGAAATAATCCTCTCCAATTTTATTGAGGTGGCTGACCACGTCCACGACCA
-CATCTGCCTCTAAACTGGAATTCGGTTGCTGACCCAGCCCCAGCCTCGGCTTTCTTGTCA
-GCACCAGGGGGCACAGAACACCGTCTGTAGGTATCTCTGTCAGCTTCCCGTCTTGTGAGT
-CTTGCAGGTCGCTTACCCTCCAGACCTTTAGGCCGAGGCCTGCCAGTCTCTGGACGGCTG
-CGGTGTAGGGTGGCAGGAACAATCTCCGGGGGCAGATGTAGGGTGGCAGGAACAATCTCT
-GGGGGCAGATGAAGGTAATCACGGAGATACTGGCTACCCTCATTGGTAAGGTACCAGTAG
-AAATGTCTCCAGGCAAACTGTTCCTTCACGCAGCCCCGGGACTTGAGAGACTGCATGGCC
-TTCATGACGTGAAGGTTGGGCACATTCTTGTCTGCCAGCTCCGGGTGCTTAGGCATGTGG
-ACATCCTTCTTGGCCACCATGACTCCCTCCTTAAAAAGGAGTTCATGAATGGCAATCCGG
-TTCTTCTTAGGCATCAGCATCTTGGCAGCTGTAGGGTCCGGGGCTGGGGCTGGAAAGGAA
-GGACTGTTCTTTTCTTTGCTATTACGAAAATCATTATTGTTGCTTTGCTGTTACTACTAT
-TAGCGCCTGAAGGAGCCTTCCCTCCCCATCCCCCATTTCTGCCTCCGTGGAGGGCTAGGC
-AGGGCTCAGCAGGCCATTTGGAGGATGAAGGACTTGTTGCCCCGTCCCCTGTAAAGTCAG
-GGACTGGAGGAGGCTGCAGTGCTGAGGGGGAAGGAAAGCTGATGTGCATCACTGCCGGTC
-TCCTCATGCCCTGTACCCTAGTCCTGGCCCAGCTCCCACAGGCACAGACATGGAACAGGA
-GCCTCTTCAGCCTGAGTGTGGCAGAGGGCTGGGGCTGAGGCCTGGGGGACAGCTCCTTCT
-CTGGGCCTCAGGATTCCCATGAAAAAATGGCCTATCAAATGTTCCTACCTGCAGTGAGTT
-ATAGGACTTGGGGTGGAAGAGGTGACAGTCACCTCCCTCTGGGAATTCCTTCCTGCAGGG
-CTGCAGTCTCATGGGATTAAATGAGGGGGCTCTGGGGATTTAAATGAGTATGGTGCCTGG
-CACCCCAAAATTCTAGTTATTGTTGTTACTATGACGGCTGTTGTTGCCGATGTTAACCGT
-TTTCACAAGGCAGCTGAGGCATGCTCAGGCTCAGCCTGTTCCAGAGGGATGGACTCTACA
-CGTGACAGCATGGAGCACCAGGAGGGTCCCGCAGCCTGGTCAGGGACACACAGCTAGAAA
-GTGGTGGCGTTAAGCCTTGGTCTGGAGGGAAAGTGCGCAGGCTGGACTCCCCAGAgtgat
-tttgggctagtgactcagcctctctcagcctcagtttaccattagtcaaatggggtaaca
-atagaactcaccagatagtgattgttgggaagattaaaatgggttacccgataccaagaa
-aaacactttcccgtgcctggcacaGTGAACATCACCTGGCGGTCGTTCTGAGTGTCAGGG
-AGCGGGGCTCAGTTTGTCCATCTCTAAGGTGGGTGCGCTTGCCTGCCAGAGCCACGGGGA
-CCCCGCGCGCCAGGTGTGCGGTGGGCGGGTCTCGGCTCCCGGAAGAACTTCCCTGGGTGG
-TCCTGGAGCGGGTCGGACCCAGTTCCTGAGCCAGGCCAGCTGCCGGCGGCCGGGGCTCGG
-GTTCTGGCCCCTGCCTGGCTTTCCTTACCCTTTTCGGGTAGTACCTGGACCAGCGGGTTC
-ACTTGCCCGCGGCCGCCGGAAGTTGCGCAAACTCAGCTTGCCGGAGCCCCAGGTGGGCCG
-GGCCGGAGGAGCGCAGGCCAGCGGCGCGGGCGCAGCCGGGTACGTGCGGACCGCGGCGGG
-GGGCGCCCAGCCGGGGTAGGGGGCGGCCCGAGCACCCCTCCACCCCAGGACGGCGGGAAC
-GGGGCAGGGATCTACCTTTCGGCTTCAAGAGGACCGCGGGGATGGTGCCGCTCTCTCCCT
-CATTTGAGAGCCAGGAGGGGCGGCGAGGGGCAAGGGTCACACAGCGCCCTGCTAGCCGAC
-CCCCCATCCCCCGCCACCGGGAGTCCTCAAGCTTTTCCGGAATTGAGGGAGAGCAAAAGC
-CAGCCTGGGGATCTGAGTTCCCCCCAGCCCTGCCCCGCGGCCTCTGGAGGCTGACGCTGG
-GGAGCTAGTGGGGAGGGGGCCAGGTGGGGATGCGCGCCCCCGGGATGCAAGCCAGAAGGG
-CCGGCGGTTGGGGGCATCCGTGGGAGGCATTTGAATCCGTGGGTGGGGCATTGGGCGGTG
-AGAGGAGGCCTCAGAGGGGACATTGAGTCGCGCTTGGGGACTTGGGACCCTGGCTTCACC
-TGGCGGGAGCCGCTGCACCTCCGTTTGCCCACCCGTGACGTGGGGCTGTTGAGGTCAGCT
-CACCGATCAGCCTCTGTCTTGGGCCTGCTTTGTCCGCGGTGTGGGCTGGGACAGACCCTC
-GTGGGGCTTGCTTAGAGACCCCTGCGTGGGGGTGGTCTGTGGACTTGGTTAGTCGAAATC
-TTCTTGAAGACCAGGAGCCTGGTTCGTGGCTCCGCctttttgccagatgccgaggaaagc
-cctcgacctgtttgatctctccatccttatcgtgacctggaggctcaggaaggtctattt
-ttaacctcgtttcacggataaggtaaccgagtctgtaaagaggcgaagctgcttgcgcaa
-ggcgcacagcgggcgggtgggcgagccGAAggccggcgggcccgcggcgccAAACCCGGG
-GTTGGCTCTCGCATCTGTCCCGGCCCCGCCAGAGGGGACCTCAGGGCCAGCAGATGGGGC
-CAGAGGGGCTGGGGGCCCGATCGGGGTCGTGCACGGGGTTTCTGCCCCGGCCCCGCCCGT
-CTGACCTCCTTCTCCCTCTTTATCCGGATGGTGCCCGCAAGGGAACTGCCACTGCGGACG
-GGTTGGACTGGTTTGGGAGGTGGCGGCCTGGGGGTGGGGCAGAGTTTGGCTGGCTCTGCT
-GTGCTCCTTTCCTGTCAGGTCCTTCCCACCTGAGGTCTCCTGGGGGTCGGCCCTGGTGGA
-GCGAGGCTTCCTTTCCCATCCACTCCATCTCTCCTGCCTTGGGAGCAGCACCCAAGGATC
-TATTCCCAACTCATGGCTGCTGCAGAGGTCTCCAGCTGGTGGTTGGGGGCCAGATGGAGG
-AGGAGGGGACAGATATGTTCGCAGACATATTTTGTTTGCTGTATATGCAATGTTTTAATC
-ATTATTATCGAATATGCTGACAGTTAAGAATCTAGAGTTTTTATGTACTCCTGGATTTCC
-AGCTTCCTGGAACAATACACCTACCACCTTGGACCCATATGCCTGCAGCAGGCAGGGTAC
-CTAGATGTCTAGTTCATCCCTGATCACCCAGTTCACATCTGGCTCCCATAAATATttcag
-ttcaataaatttttattgaatattctgccctagtatgtgtctagggcagtatcttgaaac
-tggggtatagtgaacaaaatagccaacccccgcccctacacacacacgcctgccctcatg
-gagctgatattttagggggatagagacaacaaagagtaaaacaaccatacacaaatagag
-tacttgtgcaggggataaggagaaaaggaatagtgccgggagggggtcaggagtgccggg
-gagaaacaggacgtggtattGAGATCAGTGCCTTatttatctattctgggacctgggaaa
-gccacttctctgagtctcagtttctccatctgcacaacgACCCACAGGCTTGTGGGAGGT
-TATAGGGAGGATGGCACCCAGCAGAGATCCCTGCCTCCCCACCCCAATCCAGACTCACTC
-CCTTCTGGATTTTTGGATGTCTAGGTGGGgctgtccaatgtagcttcctaccatggatgg
-aaatgctgtactctgtgctgccaaacacagtggcaactggccacatgtggctattgagaa
-cttgaaatgccactagtgtagctcaggaactgaattttatgtttttatttcatttaaatt
-taaagttaaggttgaatagccacatgtggctgctggctattgagctggacagcacggGTC
-TAGATGGCTTGAACTGTAAGCCTTCTTGGGGAACACCCAGATTAAGTACCCGCCCCCTCC
-ATTTTACAGATGAGAATGTTTGGGACTTGGTATGTGGGTTTTCTTCTGTCCCATCTCCAA
-GGGGCCTTGTGGGGTGACTCTGTGGGCTTGGCCCTTCCTTGGAAACAGGGTCAGGGTTGG
-CTTGATGTCTGGGGCATCAGGTCCTGACACTTGGGTGACCACGTAGACACTTGTGCATCC
-AGGTGTATGCCCTCCTCCCAGGTGAGTACCCATTCCATGGCTGCAGGCAGATCGAGGGTC
-TGCCGGATGCCTCCATGCAGGGCTGTGTGATTTTGGACATTTCCAGCTTCTCTCAGCACA
-GCATAGCTCAGGGCTGATGTTTCCACGTGACAGGCATTTGTGGATCACCGTGGGCCATCC
-AGTTCCATGCAGGAAGCTGACGGATGTCTGGACTCCACTGGGGCGCGGGTGGAGATTTTC
-TTTGCTCCTTCCCTATAAGCTCTGCCCTTTGCCTGGGGCCTGGCATGTCTAGGCGGGTGG
-ATGGCACAGGGCAGCTTCCTGCCTGGATGGGTGAGGGGTAGAGGTGGTACCAGGCTCCCT
-GTGGGGAGTCCAGGTGGGGTGTGGGGCTGGAGCCCTTTTTCTTGGTCATTTAACCCTACG
-CCCCGGTGCCAGCACCTTCCTTTTTGGTGGTCAGGGGCAGAgccacctactcgctgggtt
-aacttaagcaagttgtttgcctctctgggcttcagtttctccatccaaaaaacggggctg
-ttgagaggacctGAGGTTGAGTTGACTGGTGCGTAGCACAGAGCCTGGAGCCTCCCTTGC
-TCCCTTTAGCGCGTGCCTTGCCCTGTCTTTTCTGCTCAGGTTGCCCAGGTCGCCCAGGTC
-TTTTTTCTCTAGCACCTTTTTTCCTCTCTTGGTCTCAGCTGGGCCTGGTTCTCCCGGGGC
-AGGAGGGAGGGGGTGTGGGTGGGGCCTGAGGCCCCGCAGCTGCTGCCTTGTGCCTGCTGA
-TTGGCTCCTTGTGGAGGGGCGTGGTCTCTACCTTATAATAGGGAGGGCGTCTTATCCTCT
-CAGCCGCGGCTGAGCCTCTTTGTCTGAGCGCGCTCGGCTTTTTTTTTTTTTTCTCTCTCC
-TTCCCTGCAGCAGTGGCCGGTGTCCAGCTGCCTACTTTCTGCCCGGATCTCTGGCTCCTC
-ATCTCTCCGGTCTCCGCAGACTAAAGCCCTCGGGATATGCAGCAGCCATGCCTGTGCACA
-CGCTGAGCCCCGGAGCCCCGTCCGCCCCCGCCCTACCTTGCCGCCTGCGGACCAGGGTCC
-CTGGCTACCTGCTACGGGGGCCGGCAGATGGTGGAGCCCGGAAACCGAGCGCTGTGGAGC
-GCCTGGAGGCCGACAAGGCCAAGTACGTCAAGAGCCTGCACGTGGCCAACACCCGCCAGG
-AGCCTGTGCAGCCCCTGCTGTCCAAACAGCCGCTCTTTAGCCCTGAGACTCGCCGCACAG
-TGCTCACGCCCAGCCGCCGAGCCCTGCCTGGCCCCTGCCGACGGCCCCAGCTGGACCTGG
-ACATCCTCAGCAGCCTCATCGACTTGTGTGACAGCCCCGTGTCCCCTGCCGAGGCCAGCC
-GCACTCCTGGACGGGCCGAGGGAGCCGGCCGTCCTCCCCCAGCCACCCCTCCGCGACCGC
-CGCCCAGTACCTCTGCGGTCCGCCGGGTGGACGTccgccccctgcccgcctcgcctgccc
-ggccctgcccatcacccggccctgccgccgcctccagcccagcccggccGCCGGGTTTGC
-AACGCTCCAAGTCGGACTTGAGCGAGCGCTTTTCTAGGGCAGCCGCTGATCTCGAGCGCT
-TTTTTAACTTCTGCGGCCTGGACCCGGAGGAGGCGAGAGGGTTGGGTGTGGCCCACCTGG
-CACGGGCCAGCTCGGATATCGTGTCCCTGGCAGGGCCCAGTGCTGGGCCGGGCAGCTCTG
-AAGGGGGCTGCTCCCGCCGCAGCTCGGTGACTGTTGAGGAGCGGGCCCGGGAGCGCGTTC
-CCTATGGCGTGTCGGTGGTGGAGCGCAATGCCCGCGTGATCAAGTGGTTGTATGGGCTAA
-GGCAGGCTCGGGAGAGCCCAGCAGCTGAAGGCTAGGCGCCACTGGGCCTGGAATTCGCCA
-CAGGACGGATCTTACAGAGGCAAGTGGTCCCTGGACCTCTCTTGCATCCATTCTCTAGAC
-GGCCGTGTCAGAGGCTCCACCCTGTTGTGAACTTGGTATGGAGGCAAAGGCTTAGAGGCT
-GGACCAGCATTGTTGGGCAAGGACTGACTCTCCAAGGGTTTTGTTCTTGGCTTTGGACAC
-CTGAGAACCCCCTCCTCCCCTCCCCCAATACAAGGTTTTTGACATGAGTGTACTCCTGCT
-TAGTTCCTCTTGTGGGGCTGCATTTGCGGTGCTTTGCCCTCCCCACTGTGAGTGAGGGGC
-CAAGGGATCTCCTCAATCCTGTCTCCCCAGCGGCTCTGTTTCCTCCTTCCTTCCTTGGCC
-TCTGTCCTTTGCTGACTTCCTCTTCCTTACCCAGCAGAACTCACCCTGGGGTCGGGGCAG
-TGGGGAGGGGCCTATCCACTGCTCTTCCTAGTCCTTGGCAGCTGGCCTAGGTGGGCAGAC
-TATAGGAGGGACTGGTTAGGAGTCTGCATTGCTTTGACTTCCCTCTCCTTGGTTAATAAA
-CACAAATGCTTGTTTCTCAAGGGCTGGGCCTTCAGACTCTTCTGTGTTCACAAGAGAAAG
-GGTGAGAGAAGTCTTGGGGTGGGGCCATCAAAACAGTAATTGTTCACCCCGAGGTCTAGT
-GGTGGGGCATGATGATAGCGGCTGGCCTGGCTGGAGACATGTCCCCGTGGTGGGTTCTCA
-TAACTCTCCTGGAAGGCTAGCAGGCCTGCCTCATCGAGGAGGAAACTGAGATCCAGCCAT
-GAGTGAGCTGGAATAGAGCTGGGAGTAGGAATGGGGTCTTTCCCCTGCACCAGAAAGGGA
-GCCTGCAGGGGAAAGGCCGATGGGGTGCATAGACTCTCCCCAACCAGGAGTGTTCCATCC
-AAGCCCTGCCCAGTTCCCAAGGGGGCAGGAAGCTCGGAGAGGGCAAATCCTGAACTTGAG
-GTCACACAGACCATAGAGTGAGGATGAGAAGTGGGAGTTTTGGAGGAAGAGAGACTTGGG
-GTGGACGGCACAAAATGAGTGGCctccctggcgatcttggacaagccagtttccctctgg
-gcctcagtGGGAGAGTTAGGCAGCACAGTCCTCCTTGGGTTGGGGCACTGGTGCATTCTG
-GGCCCTTCATGCTATATTCCAATACCTGGGGAGAGGGGAAGGAAGGGGCTGGCACTGGGC
-TTCGAGGCCTCAGCTTCTTCCAGTCTCCCTCCAGGTCAGTTACCTACTAGGACACCCCAC
-CTTGGCTAGTGGAGCAGCTAGGGCTAGAGCTGGGCCTACAAAGGGCGAAAGCGGGGGTGG
-CCTCTCTGGTGCCCCACGGTGGGCGTGGAGAGGGGGTGGGTGGCGCTTCCTTTCACAGGC
-TGCCTTGGCTGCAGCACTCAGAAACAGGAAGCTCTAATGGGGGCCCTGGTGACAGGTTTG
-ATGTAGGTTTTATTTTAAGCATAAAGAGGAGATTTCCGTTGGACTGTTGACAAACATCCA
-CATCAGCCCAGCTGTCCATCTCTCTGTCTGTCTGCCTGTCTACAACTAGCCCCCAGGGGC
-CTGGGATGGGCCTGGGCAGTTTGGGGAAGGAAGGGAAAATTGGGTTCTAGAAGAAGATGG
-TGTTCCAGCTCATGAGACTGGAGCTCATGATACTGGTGGGGAGACAAGCATGAGGAGGGT
-GGTGACCTACCCACAACCCCCCATGGTGCCCAGCAGTTTTGACAATGCAGGAGCTGGGCC
-TCCAGGGTCCCCATGCTGAAGGAGTGATGGTGTCAGGAGAGAGAATCCAGGCAGGATCTG
-CAGACGTGGTGCCCTTTGAGGTGTCAAAGACTAGATTTCCTAGGCAACCCTGCTAGAATT
-CAGGGCTAGTCATTGCCCCTTGCTGTGACCTGGCAGcctccgagtaacccaagaaggtgg
-atgggctggctgcattttacatgtgaagaaattgaggttcagGTCACAGGACTGGTGGGT
-GACACCTTGTTTCTGAAGGAGGGTACAGTGCttgaatcctcaaggtagccttttgaggac
-cagatatattgtcagagcaggaggttgagctcagggaaggatagcgacttgtatactgtc
-acatagcaggtctgcaggacagcctggggtcacactcttgcctgccagacACATCGCAGT
-CTGGATTCCTGGTTCTCCCAGCATGTACCCCACCACTCTTCCTCATCTTGGCAGCCTTTT
-CTTCTGGTCACTTTATTACTGAGCATCTActgggtgcccagcagtggataagacagacat
-ggcccctgtcctagtctggagaagagaatgggcaactaaacattcagcacataaataatc
-atagaatgtAAAGCAGGTATACTTAGGGACTTCTGCCCTAAAACCAGAGCTGTTCCCAGG
-AGCTGGACCAGGGGATAGCTGAAAAGAGAACGCCTTTCCATAAATCCACTGGGAGGGTCT
-GTTGGGGAGAGAGCAGGGAGGGATTCTTGGAAGTGGGGAAGGTGCCAGATTGAGTCTTCT
-CCAATGGTTATGGCTTGGTCTTGGGAGGGCTCCCCCTGTTCCAGGATTCTGGAGCCTCCC
-GCCTTCCCTGCAGGCCTCTGTGGAGGGAGCAGGGCGGGGGGCTTTTGCACTCCTCCCTCC
-CCCAACCCTGCAGCCTTGGGGATCTGTGGAAACAGCCCCTCTATTGTTCTGCCTCCAGTT
-GGAGTGTGAGCCCTCGGAGGGCCTGCAGCTGCTGCCCTGTCTCCTGGGGCTGCCCAGCCC
-TCCGAAGCAGCTCCCCCAGGCCAGCCTGGCCCCAGCTGCCTAGCCCCTAATTAGGCAGAG
-ATGGGATCTGCTCTCTGATCCATTTCCCACCAGCTAATTATATACACGTGGATTtgggaa
-ccaggcaacctggctgctcacttctatcatgaaggtggatgggccctgggaaaggcagcc
-ccccccccacagacctcagtttacccttttggcagaggatggagtGTAGCTGCAGAGGCC
-TGTTCCCTGTCCTTGGTTAAATAGTTCTGTTCCTGCTACTGAAACATTTAAGGAGACCCC
-CCACCCCCATCTTACCTGATATCCTGTGTACAGGGGACCAGGAAAGGGTTGAGGAATTTG
-GCTATAGGTCCTTGACTCTAGGACCCCAGGGTAGGGTCATAGGATATAGATGAGAGCATG
-GCTGCAGCTGGCTGCCAATTAGATGTGCATATAGGAGGGCTTACAGTTGTGCTGGTCCAT
-CTGGGTGGCCTGAACACCCggccgggtgcggtggctcacgtctgtaatcccagcactttg
-ggaggccaaggcaggcggatcacttgaaaccaggagtttgagaccagcctggacaacgtg
-gtgaaatcccgtctctactaaaaatacaaaaattagctaggcatagtggcggacacctat
-aatcccagctacttgggaggctgaggcatgagattcgcttgaaccctggaggtggaggtt
-gcagtgagccaatatcatagcactgccctccagcctgggtgacaaagaaagactccctct
-caaaaaaaaaaaaaaaGGAGTGAACACCCCATCCAGGTTTTTAAAAaggtaatattggtt
-gatgggtacagcaaaccaccgtggcacatacatatctatgtaacaaacctgcacattctg
-cacatgtatctcagaacttaaagtagaataaaaataaaataaaaGGTAATATTATTTTTC
-AGATAATTCACTCATATATTTCTTCCAACAttttattaagaaaaatttcaaacatagagt
-tgaaagaattagacagtgaacattcatatacccacctactaatgcacacttgttaatatt
-tcactatatttgctctatcaggaatctacccatctctccatccATTAATACAACTTATTT
-TTTTAATACAACTTATTTTTTAATAAAGCTTTTCAAATTAAGTTGCATATATCAGTACAC
-TTCCCTTAAAGTCACTTTAGTGTGCATGCCATTAGCTAGAATTCAATATTTGTTTGTCTT
-GTTCCTCTCTaggtaacatttacatggaatgaaatgcacagatcttaaaggtgccatttg
-ctgaatttagacaaatgcatactgtaccccaaacccctatcagggtatcaagcattatca
-cctcagaaagtttccttgcatcgctctcctgccgattgctgcctgcccaCCATGGACATA
-TTTTTATATCCATATATATCAGTACTAACaagcagcatcccttgtcctttcctctacatc
-agcctcgctccccaaaagcaaccacttacaacttcttaaactatttcttctggtactttc
-ctccatatttttaaataacttgcttttcctgctgttttcttgatcaattttaggcataca
-cacacacacacacacacacacacacacacacacacacaTATATAtttattttttttttga
-gacagaatcttgctctgttgccccggctggagtgcagtggtgtgatcttggctcactgta
-acccctgcctcccaggttcaagcgattctcctgcctcagccacctaagtagctgggacta
-caggtgtgtgccaccacgcctggctaatttttgtattttttgtagagatggggtttcacc
-atgttgaccaggctggtcttgaattcctgacctcaagtgatccacccaccttggcttccc
-acagtgctgggattacaggcgtgagccagtgtgtctgaccAATTTTAGGCACATATTGAC
-TGACTTTCTGGTCTGATGTTttcatagtgtggcctccactgcctggctgcctggctttgg
-atcccagcccttcctctttctggctgtatgaccttgggcagtaacttaacctccttgggc
-ctcagttttctcatttgtaaaatgagggtgataataatagtgctgaggttattggattgt
-tatacggattcaagatgtaaaaggctgagaataatgaacatcacccagtgagtagtcaaA
-CTTTTTCTTCTCATAATCATTATTATCAAGAAAGATTTAGCTTTTGGTTCCCCCCTTTCA
-ATTGGCATTtatcacaattttttgtgaagtggattttagtgttatttatattatgactat
-gtaaatactgtttcctttcaagccaagtcatatattttggttacatttcctttcttgtac
-aactctttgttcttcctggagttactactcgctttgctttttttcatttgctgtttcctc
-ttaacccatccttaattcTCTTAATTCTTTGACACCCTCAGTCTCCCCATAGTTAACATT
-ACACATCCTGAAACTCTTCAAGTGCTTTTAAAGAAGCATCCCCATCCATTTAAAAAAAAC
-TGGAGCCAATTTTTAAAATAGAATCTCAAATACAATCTGTAAaataaagatttgtgagca
-tccactatgtgccaggagctgtgctaggcagagtgggaaggtagccaaataggggatatc
-cctgcccatgtggGTTTCCAAGAGGGATGAAAACTGAAGCTCCACACCCCCAGCCTCTGC
-ATTTACCGGGGAACACCTCAGCACCTCTAGGAATCTCAGGACCTCAGGGAGCCCAGATTT
-ACTTATTTGTAAAATGAGGATCATTTTGTCATTCTGCAATCACTCCTTAACCATGTTGTC
-TGGGGCTGTGTTGTGGCTGCTGGGTATAGAGCAATGATCTCCCCATCCCTTGAGGGGCTC
-ACAAGAGCTGTGGGATAGAGCGGAGGCTGTGGATTGCAGCGGAGCAATGGGAGCTGGGGA
-GCGGGTTTCCCAGAGGAAGTACCATAGGACGAAGAGGGTCTTGGTGGGTAAGGGCAGtaa
-acggctgttatgttccaagggctgtgcgaagaacttccatgtattgtcccatcaaatcct
-cccaaagacccattgaaaggggtcatatttttatcacaatttcatagatggggaaactaa
-ggccaggagagtccaaggccagggtcacacagctaataagcggcagaggcagtatttgaa
-cctatgcagttgggttcttaaccacacactgcactgtCTCTCACATCCAGATGCCCAGCT
-CCTGTCCCCACCTCATCCTGTATCTGCCTCGTCCTCTCCTGTCTACCCACTGGTGCTAAC
-CTCTGGCTCATTCCATGCCCTTCGCTTTATTCatccattcattcaacacaaatctactgg
-gcgccttttccacgcccaaccctgggctgggcagtgccagggacatagAGCTTGGGCAGT
-ATTGACTCACCCATTCCCAGATAGGCATTGACATTGACATGCAAGCGGCCAGGAAAGTTG
-TCTAAATAAAGGGGTGTTTGGGGTTGAGTGATGGCtgtgtgtatgtgtgtgtgtgtgtgG
-CCTGCAAGGGGTGTGTGTCAGTGTGGCAGCAACAGACTTTCTGTGGAGGCCATTTATGAA
-GGCATATCTGTGTACCCTTGAGAGTGTGTTGTCTGCAGAGGGTGTGTCCACCAGGTATGt
-ggatcagtgaggctctgctgcataacaaaccactctaagcccagaagcctaaaaccactt
-attagcctgtgtgaagtggcagtctggcctgggcttagctgggcagttctggttttacct
-gggttcacttgccttgctgcagtcagctgagggtgggggctctgggagggcttcactcac
-atgcttagcagttggcaggctgtttgctggggtgcctccatttgctttgatgaggctggc
-ttgggctcatgcttatggtgacctcagggttccacattcagcaagagaagataagctcca
-acgcacagtgcattttgagcctctacttgtgtcaagattataaatgtcctaatagcccaa
-gtgacatgtcaagtcagattcaaaggatggagaaatagactctctctctCTCTCTCTCGG
-TTGTGTTTTTGTTCTTTGAAAACAAGCCCGGCTTGCctggctccatcgcccaggctggag
-tgcagtggcgcgatcttggctcggtgcaacctccgcttcctggttcaagcaattctcctg
-cctcagcctcctgagtagttgggactacaggtgcgtgtcaccacgcccagctaatttttg
-tatttttagtagagatggggtttcaccatattggccagactggtctcgatctcttgacct
-catgatctgcccgccttggcctcccagagtgctgggattataggcatgaggcaccgcgcc
-tggctTAGAATCCATCTCTTagtcacattacacagggcatgagtacagatatggaggaat
-tattgtagctgattttcaaacaacttaccTGTGTGTGCAGGTAAAGAActagggacagtt
-ctcagttttggaaataaaaaaaactctgggctgcagtcctggctcttccgtccttgctgt
-ctgaccttagtcaagttgtctcattctctgagcttccgtaaattggataaaattgaatga
-aacgagatgatctttaTAAAGTGCTTGTGCTACTCATTTGTTTACAAACGcagcacatat
-ttattgaggcctcctatataccaactactggtcccaccccgaggatattgcagtgaacaa
-aatggaccaaaacacctgctcttgtgaagctcacagcctaggttgtagacagatgttaat
-tgatcatcctaataattgtatgaccattgagagtagattccggaaggagagattgctgac
-ctggccaggttgatctgagaagccaaagatatttaagctgagatgtgaagggtaggtagg
-agacaacgaggagaagaaagataggagtggaaaatgattctagatggagggcatgtgcaa
-aggccctgtggtgggaggagtagattccaggaacacagagaaggtgggtggggctggGCC
-TGAAGCACCAGGGCCAGATGGTGTGGGGCTGCTGGAGCCTTTGAACAATGTGAGGGTCTG
-TCTTGCCAGGCAGcctaaaataaaaccgaaaggcctaactgctccacaaggccctcatga
-tcggggaccttgttactcctccagtctcccctttacctactctgctgcagccatgctgcc
-tccttcctgttccaggaacaccctggacacattcccacctcagggcctttgcacttgcca
-ttgcctttactagtatcgaccctacccagatattctgatgactcattctgtcacttcatt
-tccatctctgcctcttcaaaggggccttccctaccaacccaccacaacccccctgcccct
-ccagctaagcagtcagcatccagcagtctctacttccctggcctggtttatttctcttcc
-tagcacatatcacctcctggcttatattaaccagaggccacattgtctgtttctcttctg
-gatctctcaccagagtgcagctcagcaggcagggacttggccttgctctaggctgtgtcc
-tcagcctcaggggaagagtaggcattccataaacatttgtgaataaagaaatGAGTGAAA
-ATGAGTGAGTGAATGCTGGAAAGAACTAGCTCctggaaattaggaggtctgggttcaagt
-tctagctGGGCGATCCTTTCTGTTCCTTGGTTTCTCCAGTTGAGCTGTGAGGCATTTGTG
-GTCTCTAGGGAGGTTCTAGGACAGGAAAGGAGTACTCCAGGCTGTGGAGGGGGCCTATGT
-AGGAAGAAGGGAGCTGGGGCCTTCCCTTTGGCCTTCTGGCGTTTGAAAATAGCCTAGCTC
-AGCCCCTAGCTTGGGCCCCTACCCTCCCTGGGGTGCCAAGCTGGAGCCAGGGGGCTCTGT
-CTGGAGCCTGCCAGCCTGGTGCCGGGCTGGGATCAAGGCCACCTGACAGCTGGGCCAGGC
-AGTCCTGGAAGGTTCTTAAGGGCAAACAGGGCATGCTGGATGTCCCAGACCTCCCTCCCC
-ACCTATTGTCCCTCCTCCCTCAGTGTCCACCGGCAGGATAAATCCCTTCATCCTCTACAG
-GCCTGCAGCCCTTGCAGCTTGCAAATCTTTTTCTTGGTTTGTTTCTAATTTCACCCCTGC
-TCAGTAGctactttactggtgaggacactgaggctcagagatgacaactgcctcactgag
-gttacgttgcagttatgattcaggcccaagtctTGCCCAGCCCTGTCCTGTCACCGCGTG
-CACgtgtgtgtgtttgtgtttgtgtgtgtgtgtgtgtgtgtgtgtgGTCTCACTATCAAA
-CAGTGCCCTCCCTTAACCACCAGTGCCCCGGGTCTCTGATAAGATGtgatgactatgagc
-acctggagccaggtggcctgggttcaaatcccacctttgctacttctatactgtgtgGAT
-TGCTGGGCCACCCCCACCTCAGTGTCTGCTAATAGGACAAATCCCTTAATCCTGGGCACT
-GGGGCACTATCAGGACTAGCATTGTATACATTGCACAGGTTTTAAAAAATGTAATCTGTA
-ggctgggcacagtggcttacacctgtaatcccagcattttgggaggcccaggtgggtgga
-tcatgaggtcaggagctcaagaccagcctggccaacatggtgaaaccccgtcactactaa
-aaatccaaaaattcaccaggcatggtggcgggcacctgtagtcccagctactcgggaggc
-tgaggcaggagaatcgcttgagcccagaagctgaggttgcactgagccgagattgtgcca
-ctgctctccagcctgggcaatagagcaagactccgtctcaaaaaaaaGGTAATTTGTTGT
-CAATATTTACACATCTAAACCATTGGAAGAATAATGTATATATAAACTAGCTAATGAACA
-CCTACCAAGCCCCAAGCACCAACTGTATGTCCAGTACAGAGCCAGCTGCTCCAGGGGAGT
-TCGTTCCTGGGAGGGGGCATCATGATGAAGTGGGCGTGGTTCCCATTTCCTCCAGCGTAG
-TCTCAGAAGCGGGAAGCCATGTGACTGAGGTTACAGCCAGGGAGGGCAGAGGCCCCCGGC
-ACTCACCCCTCTGGGGTCCAAGCCCCGCTGGCATGTGTTGTGTCCCTGGGTAGGTGTGTC
-ACTCCCTGTCTGTGTCTCCAGTGTTCCTGTTGGCAAATCAGGGGTGGGACGGAGGTAAAT
-GGAGAGGCCCTGCCCAGTCTGCTGTAATCCAGGATCTCGGACTTAGTGGGGCCAAAGCTT
-CCAAGTTCTCCTGATTAGTGAGGCTGCAAAAAATGTTTGGCATGTTATTCTCTCACCGTT
-TAAATGTGGGCAAGTAACAACTTACATGTAAAATTACCCCCATATACCAAGCATTTaagt
-tatttattatatcattgcttacaatagcaaataattggaaattatttgagaaatggctaa
-agaaactcaggcccaggtacgcaagggaatcctaggcagccctcaaaagatgtcctgcaa
-acacctgatgtggaatcacaagatacacaacacaggtcagtgaacaaaacaagttgtggc
-atgatacccacagtgtgctgctgcttgtggaagcaggaaCACATGTCCATGTACTCTTGT
-ACTGGCACAGAACCCTGGAGAATTATCCTGGGAACCCTGCATGCTGGCTGCCCCTGGGGA
-GGGGAACCCGAGGGTTGGGCTCAAGGGTGGGAGGCAAGACTCACTACTTTGCACACCTTT
-TGAATTTTGAATCATGTGAATGTGTTATCTGTGCAGAAAAAATAAAAATACATTTAAAGT
-AAAGTGAAAGTAGACAAGAAACCTGAAACAGAGACGGACAAGCAAGCCTGCAGGCCCAGC
-CAGCTACCGCCCCCGGGCAACCTCATGCCACACTGTGGGCTCTGCCCAGCTTGGTTTTGT
-GGCTCCACCCTCTACGGTCATATTTGGGTTTCCACACACACAGCACCCAAAGGAAATCCC
-AGCTAACGCACATCAGGTTCTGGGCTGGGCCACCCGCCAAGGTGGTTGGTGGGCATGACA
-CCGCCCCGGGAATGGCGTCGTCCAAATGCCTGAGCAATGACACGGCCTCAGATGGAATGA
-TGCCACTGCCCACAGTCTCACAGGCCCTCCCATCTCGCCTTTGTTCTGCAGCCTCCAGGT
-GGGTGTATGGACACTCCAAAACAGCCATCCCTGTCAATGAATCAGCCTGCAGGGACTGAA
-TTCattccttcattcatcaatatccattgagcacctactgtgtgccaaacactcttctag
-gaactgaagatgcaacagaaaacaaaacagataaaaatccctgccctcgaggagctgaca
-ttccagaggggacacagacaatacttgccagagtgaaaatgctaaggagaaaaatgaagc
-agggaaggatgggGAACTAGAGATTTTTTTTCCtttttttattgaggttgaattgataaa
-caataaaattggcccattttaggtgtacagttggatgcattttgacagttgtatggcact
-acagacaagtgctagaattcctgtatcatcccaccatgttccttcacgccccccacagtc
-agcccctgactcccacccgctcccacccgaagaaactacagatcagttttctttcactgt
-agatcagctttgtctttcccagagttcatgcaaatggaatctggcttctctcagtcagca
-tcatggacttggttgagattcgcccgtgttgctgagtgtatctgtagcttgttccttttt
-actgacgagtagtattccacagtgtggatgcactgtattttgtttattcatccaacttgt
-tgacggacatacaggttgttcccatttcttggctattacaaataaagctactataaacat
-ttgtgaacaactctttgtgtggatgcatattttcatttctcttgggtaactaccacggag
-tggaattgctggacctcgtggtaagggtagctttaTTAGAAGCAGATCTCATGCttttaa
-acaggatggtcagataaggtgtcaccggctcggtgatatttcaggagaggccagaaggag
-gtaaggggtgtctgcagggaagagtgttctgggctgaggaaacagagtcagtatgtgcct
-ggagtgtttgaggaacagcatggaggccatcaaggagggagtgaaggacgtgaggggaga
-gggctaggaggtgtgctccatgtggaatgaggctagatggtatagggtcacatacatcat
-ggtgaggacattggtatttttttcttttgacatggagtctcgctctgtcacccaggctgg
-agtgcagtgacacaatctcggctcactgcaacctccgcctcctgcattaaagtaattccc
-cggcttagcctcccaagtagctgggactacaggcacgtgcccccacgcccattttatatt
-tttgtagagatggggttttgccatgttgtccaggctggtctcaaatgcctgacgtcaggt
-gatccgcccacctcagcctcctgaagtgttgggattacaggtgagagccactgcacctgg
-ctgaggacattggtttttcctctgagaacccgtgggaggaatctgagcagaggtgggaca
-ggatcagacttgcattttaacaccttcccccatctccagctaccaagtggagaatgggct
-gcagggctgcagggaggaggctactgtaatagtcctggcaggagatgaaggagttggact
-ggggtggaggcggtgggggctgaggggtgtgggattctggatctttctggatctaccccg
-aatgtggagccaacaggggatgtattggacgtgggatgtggggaaagtagggacatgaaa
-gaaggctAGGACCCAAggtgacctctaggaactgagagtggccctccagctcccagctgg
-caaggaaacatgcatctcagaccggcaaccacaagaagttgaactgtgctgacaaccaaa
-ggaacttagagtggaccctgagccgcacaaaggatcacagcctagctgacacggtgattt
-cagcctggtgagacctaagcagagaagccaatcatttcatgccaggacttctgacctgca
-gaaactgtaagaaaataaatgggtgctaagtcactaagtttgtgataatttgttatgtag
-caatagatgactgatacGGGCATACtagaatcctacagtgtgagagctaaaagagtgctt
-agcaaccactaagcccaccccccccatgtacatatggggaaactgaggctcagagagcac
-agaggacttgAGGCGTGGTTCCTGAAGGGAGGCGACATCAGGCAGAAACTGTCCCAGCTC
-TGGAGGTGTCGCGAGTCCCAGCCTCTCCTCTCTTAGGAGGCTGTAGTACCTGCCCCTCTG
-CCAACCCCTGCTCATCAGGACTCCCAGAGAGCCAGCTCCTGGCTACCCACTATCTACCCT
-CGGCTCCCCAAGCAGCGAGTTCAGGCAGGCTCCCCACTGGTGCAGGCCCTCACCCCCACA
-GCAGAGCATGGGCCAAGGGTGCACGAGCCAGGCCTGAATCTGAGACCCCAGGGAAGagag
-gaaaaatcacaaccttgggcctggctagaatcccaactctgccactcaccagctatgtga
-ccctggttgagggactcccctttgctgagctgcagtgtccacatgtataagatgggagta
-gggatgctttcctccaatggtcaatgagctaatgaaggtgaaactcttggcGGGAGCACT
-GTAAATGCATGTATCCAACCTcttcctctgcatgggcctcagcttccccatctgctaaag
-ggtcttgtgttcttgatgtgtttgggggggcccttgcagctctaactatatgaggattca
-aattccggctctgcttctcactagctgtgtgaccttgaatatgttactcaagctctctga
-gtcccagttttctcacccataaaacggggctattaataatacctcctattacaggagaga
-tgcaggtcagatacctagtagagtgactgAGAAAATGTTAGCTAGTTGTGTTATCATCAT
-GATCACCATTTCTAGTGTGTGAGTTTGGTTGTGCCTGCTGGAAGGGGCAACAGGGCCGAG
-CCTCCCAGGGTGAGAAAGTTTGGTTTTCTTAGAGACAGACGTTTGTAGGCTGAGCAAGGC
-ATGCGTGCATTTCTGGGAAAACAAAATTAGTTCATTTCCCTCCAAATCCCTGCCTGTGCA
-ACCACCTAAAGCCAGGCTCTGAGTATCACAGTGCTTATAAGTGGTAAACCCACAGGCAGG
-TTTGTGAAAATGAAAATATGCATTTATTTCTGTTCCCAGTTCTGAGAACTACTTCCTGTT
-TCCCTCTAGAGGAAGGCAATGGCTTGTGCACATGCCTGGAGGTGGGAATGTGTGTCATGG
-ACACAAACTGGGGTGGTTATCACTGTGATGTTCCCACTGGCCATGTCTGAATTGTGCACG
-CAATCCTCTGACCATAGCTGATTCACTGGTGTTAACAGACACCTGACGGCAGGCTGGGCA
-CTCAACAGTCTCTATTGGAAATTTGAAACTTGAATGGGGCACACAGACAGAGAGTGGCTG
-GAGATGCATCATTCCTGGCCAGCACCCTAGAGAGGAAAGCCACAGGCCCTGCCCCTGAGC
-TCCCCAGAGATGCCTTTTCCTGTTCTTCCCACAAGAGTACTCGTTTTGGGGGTTTGCTCT
-TCCCTCATCCTGGAAATGCCTTTCAATAAATCCACTGCTGGGCTCCTTGGTTAGTCAGTT
-TTTCGGTGTTTGCCACCCAGTTCACCTTGGCCAATGTGGTGACTAGGGAGACAGCACTGC
-TGGGGGTTAAGGGGAGACTGTGCAATGGAGCAGTGGCCCTCTgtggagtagttctgggca
-gaaagagcactggacccagagtctggttcttcatgatgtactgccatgtgaccttgggca
-aatcacttaacttctctgTCTGGGATGGAACCAGGGGGCACCTTAGTAAGcagatgggga
-cactaaggatcagagagaggaaaggctttacttaaagccacacaacaggtttaggacaga
-cccgggagagctgggccctgcaaatcccagcccTCAGAGGGAAAATTTCCTGGGTTAGGA
-AGCTTATTTCTAATTATCACCAGGACCTGTTTACCCCAGGTGAACAGGGTCCCCAGGCAC
-TTGGCAGATCACAGATTTCTTTCCCAACCAATTGTCACATTTGGCCTTGGCAACAGCATC
-AATGGCCCAGGAGGGGGCtgagtaaactgagcccagagagggacagagtcttgtgcaggg
-tcataccacaagttcatggcagaactagagtctgggccagatctAAAAAAGTGTTGCTTT
-TTGCTCTAAATTTAAGGAGGGTGAATTGGGGGTAGTGGCTAATGAGTTCTCCAGAGGAAT
-TTTTAAACTGTTTGCTTTCATTTTGATGATAATCCTAAACATGTAACTCAAGCATATCAT
-GAATCATCTGCAGAGCCACAGGTAAGTCCTGCCTGAGCTTGCGTTTGGACTTGGGATCAC
-ACTGGCAGCAaataatagcatttgttgagaactaactatggcccaggcactacgctttgc
-attttttatctattttttaaaattttatttaatcctcacaacaaccctataagataaatg
-ccatcagcatccccatttcacagatcaggcagtcaaggtgcagagaggttaaggttaagt
-aacttgaagcaatgttaacagcgagCCTGTGATCTTGCCCACTACACTTTACCATTGTAA
-TCGGAGGAGAAAATGGCAGAGGTGGCTTTGATATGTAAAGATGAATTCCTGCTAAGTGAA
-GGCCAGTGATGCAGAAGTACAGGGTGGGGAGAAATTTCACCATGGGTGAAATGGTGCCAA
-ATGGTGGGAGAACAAAGCCATCATCAGCATGCAGAGTTGGGTGGAAGTGCGTGACAAACC
-CAAACAAAATGGCATCGCAATTGAGTGTCCCACATTCACACTGCTGGTGGCAACTCTGGT
-TTAGCAAAGCAACATCAACCATATCATTAATTAATTAATATTGTTGCATTGATGATATGG
-cagcatagcttaatgcttagggatgcaggcttaaaactcataatttctgacttcaaatgt
-gttttcctcttggcctagtcctcagactatgggcaaatcactcaacctctctaagcctca
-gttttgttcatctttaaaatggaattgtaatagcacctGATagactgctgattgcctatg
-caattcccttcttttcctgttttttgttgaccaaaccctgattttattcccgatggtgat
-atatctagctaagtaagactttattcccagcctctcttacagctactggtggccagcgag
-tggaagttattcagtgagagacttctgaggactatccctagagggggccaatgcatctgg
-gaggaaagcccatatactcttctttctccttcttcctatatggaactcaggcattatggc
-agcagccccagcagccatctaggatcaagaagtgaccttcaggatgaagacacatgataa
-ggatgaagcaacatgaggctggaaggaacctgaaacattgatgataccatagagactgca
-gcagccctgggctgactcttccctgacttttttttttttttttttttttttttaagtcag
-ccttttattttaggacaattttagatgtaagaatcattgcaaagatagtacagagagtgc
-ctgcataccccacacccagtttctcctattattaacatcttataggccaggcgaggtggc
-ttacacctgtaatcccagcactttgggagtccaaggtaggaggatcacttaaggccaaga
-gtttgagaccagcctgggcaacagagcaaggccctcttcctacaaaaataaaaataaaaa
-attgagctgggtgtcatggcataccagtagtcctagttactcaggaggctgaggtggaag
-gattacttgagcccaggagtttggggcttcagtgagctatgatcacaccactgtactcca
-gtgtgggtgacagagcaagaccctgtctgtaaaaaaacccgaaaaccaaaaccagaaaat
-cttatattagggtatgatacatattaaaaccaaaaaatcttatattagggcatggtacat
-atgtcacaatgaatgagccatactgtcattattaactgaaaagcccatacttcattcaga
-tttcctcagtttctccctaataccccttttctgttccaggatcccatccaggctcccaca
-ttacatttagttgtgtctccttaggctccacctggttgtgacggtttcaaagactttcct
-tgtttttgatgaacctcatagttttgaggacaactggtcaggtattttgtaacatgttcc
-tcaatagggatttttctggtgattttcttgtgattagacaggggtgatgtgtttagggag
-gaagaccgcagaggtgaagtgtcaatgtcatcgcttcagatggggggacattctatcaat
-acgacttctcactgtggatgttgaccttgattgctggcacgtttctccactgcaaaatca
-ctgtttctgtcctccattcaacgccatactctttggaagaaagtcactccatgcagcccg
-tgcttaaggagtgggagttatgttccacctcctggagggtgacgcacttaAGCTACTTAA
-GCTAATAAGTATTTTTTATGTAGCAAAAGCTAACAGATAAACAAACCCTTTTGTTTCGTA
-GATCTATGTTATTTGGGTTTTCTATTACATGCAGTCAAACCCAATTTTAAATGGATGCAG
-AATTTATTTCTCAGGGAGGTTGTGATAATTGAATCAGAGAGGCAGGGACAGTACCTACAG
-CAGTGTTTGGGTGAATAAACAGTAACAATAATCATCGTTggccaggtgtggtggctcatg
-cctataatcccagccctttgggaggccaaagccagtggactacttgagcccaggagtttg
-agaccagcctgggcaacttggcaaaaccctgtctctacaaaaaatacaaaagttacctgg
-gcatggtggcacatgtctctagtcccagctacttgggaggctgaggtgggaggatctatt
-gagcctggaaggcagaggttacagtgagctatgattgcatcactgcactccagcctgggt
-gacagagtgagaatctgtctcaaaaaaaaaaaTCATGattattaataacttaattataaa
-taataataattattattagttttataGTGCATTAGTATTTGATTGATAATTTTGTTTCAG
-TCTTTTTAGTTGTTTGGGAACTATAAGCCTAAGGAGTTGATAGCTCACTTCATGAATGCA
-CACAAATAAGTAGTTTACCgtcaatgccctcctaagggcctaagatcaacaggaatgcac
-ctgtagttaaacaagtggttctattactcactgggacaagaaagtgcacagcatggggaa
-ccttggaatgtcttagtgagagtgttagaaaaggcttattataggattggtctcgtgtta
-ggtgacttgaatagggtttgaggatgtggggtttttcttcagattggatgctctcaggaa
-gtgagggtaattatgcagttgcgatcttaacaagtcttgtctatagagaaggcagactct
-ggcaaggctaatgctgtcattgggaaagaagcagcggtcacttgtattagctgggactga
-ggggtgtttggtcattttcgtggcttggaaatgtgcatgatttgtctttgttcagacatg
-attacagagtgttccacttttcgtcttgattcatcaatcactgaggacctcatctgatgt
-tggtgttctggggaatcattaacattggacaggacataagctgttctctgtgcatgttgg
-gctgacttgcagcaacacccagtcctagctgatgactatccaggatggcccctggatgtc
-agggctgctttcctctttctcaATTTCAGTCAACATTAGTGGGTCTGAGAGGATCCCTTC
-CTCCTTTTAAAGCTCTCCATATATTAAGTTGGAGCAACAAGCTCATTCCTGCTCAAACTG
-GGCAGGCATTTTTAGATTCTTTTCTGCTCCCAGAAGTTTTCCTTTCCCATTATTTGGTCT
-TGAGCTGGTCTCAGGAAGAAGTAATGAAGGTGAGAGATCTGCAGTGGGATCCTGGGAAAG
-GTGGCACATGTGGATCACTGAGGCCTGGGCTCGGATGGTGAGGATTTGAAGATTCCCAAA
-GGCCACACCTAAGGGTCACCAGAGGGTgtccagcccccattatccagatgggggaactga
-gacccaggagggaagGGCTCTGTGTTGGGTCCCAAGGTGTGCCATTCCAATTATCAACTG
-CCCTCCCTTACCTGACTGGCAGAGTCCCTTTCTTCCAGTTTGACGGAAAATACTGTTTGG
-CTCTTTTTTTGTGGGATGGAGTGTAGAAATTGGGGAAAAGAAGAAAATATAAAATCTTAC
-ATTAAGCATCCTAAGCCAATTCATGTGGTCGAAGAagcagaaaagcagcagaaaagcagc
-agaaTGCGATGCCAAACACATCCTCTGTAGGCACGTGTGTTATACCAGGTTGCTGCGAGG
-GCCCAGAGGACACATCTGTTGTAGCTGAATAAGTTCCAGTGTTGAACCTCAGCACACACA
-TGCGCATCTGGGCACCTGTGCACAGAGCTTGTATGCACAGAGCAGGAACACATGCATGCT
-ACAAAAGGATCAAGAGTCAAACTCCAAACTGGCTGCCCTTATTGATAACTTCCAGCTGAT
-GGAAGGTGGAAAGGCGAAGGTAGATGTGTTTTGGATATAAAAGGTctgtcttctctgttt
-actgtctatgtgaccttgagcaaattgattgacctctctaagactcagttttctgcaata
-taatatggTTCTCTTCTCTCAGAGTAAGGATGGAGTTCAGTGAGGAAACAGAAATGTAAG
-CATtgcatcattcggaatgctctgggctgcaagtaacagaacaccaactccactggctta
-aatgaaaaagaaattgatcatctAGAGACAGGACTCAGGACCTCAATGATGTCAGTAAAG
-CTCCAGGCCCCTTCTGACCCTCCACTCAACCACTCACTCTCCCACCTCCCTGTCAGATTG
-GTCCCAAATGTGGTTCTCCTGGTGGTCCACACTGGAGTAGCATCCATGCTGTGTAGTGTC
-TTCTCCATCAACAGAAGAGAGAATCTTTGTttttcttttctttcttctttcttttttttt
-tagacagagtcttgctctgtcttctaggctggagtgcagtggtgcgatctcagctcacta
-taacctctgcctcctgtattcaagcaattcttgtgcttcagtctcccaagtagctgggat
-tatgggtgcctgccaccactcctggctgatttttgtatttttagtagagacagggtttca
-tcgtgttgaccaggctggtctcaaactcctgacctcaggtgatccacccgcctcagcctc
-ccaaagtgctgagattacaggcatgagccaccacgcccagccAGCAGAAGAGGTAACTTT
-TCTGTATCCCTGAAACGCTAAGTCTTCCTCTTTAGTATGAGTGAACTAATTGAAGTCACA
-TGACCAGCCCTGGCAGTAGGAACCATGGCCAGGGGAATATCATGTGCTGACTGGCTGCAG
-TTTTGGTCCCTGAACACATCAGTGGCTGGGGGACCCCTTCAGACTAAAGGACCTAGCCCT
-GCAGCTGGGGACTGATATTAGGAAGGGAAAGGGAAAGGGCATGATTCATGTCCCTCACTG
-CTCAGGGTCTTGCTGTGTAGCATCTCTTCTGAGATGTGGGTCAGACAGGGTGTTGGCCAT
-CGCTAGAAAGGACCCCTCCTACAAGGACAAGACTTGAACAGGGATCCTGAAGACTTCTGG
-GGTTTCTATCTAGAGTCCAAATGGGTCTCTAGAGTCAGCCTGTTGACAGGCTGAGTTGAG
-TGGCAGCATCTCTAGTGGATCTGGCTCTCTGCCTGTGACCACTTGTGTGCATGAGCAAGT
-GCCTCACAGACCTGCATGTGTACATGGAAGATGTATTTTTACCTCCATGTTTGCGTCTGT
-AGCAACAAGTATGAAATGCACATACATGTTCATGCACATGTCAATGTACGTGGCTACCAC
-ACAGTAGGTATACTGTACAGTGTAACCATACAGTGTTTCAAATAtgcatatatgttcata
-tatgtgcatatatgCAATATCTGGATAGATGTATATGGCATAATGGCATATTTATATATT
-AATAAATCAATCATTTTAGAGTATTAACTATATATGAGTTATATTATGCCTAAGATATAT
-Taataaaaacaatgtttgtcaagtacttgctatatgccaggtactattctaagcacatat
-gttctaaattaATATATGTATTACTTTAAGGATACATAACCTAGTGTCTTTTTGGGGTCC
-ATGGATGAAGTGTATCTTCACTCACCTTTAATTAAATTCGGTTGTTTCATTCTTCATTTG
-TGAATGTAGGGCATTCACAAATTCACaaattcattctttcaattgtgaatgtagggcaca
-agccacagtagtgtcaggagtgcctggaactttgtcaccattagaaatcatagctatttt
-tgtatcttgttataatgattatagatatctcaaaatattaacagtcatcatttgttttga
-cctaccactgatcttgttatttaatgtattagcaaagaagcatatatagtacaatatcaa
-aactgtgttctttaaAAAAAAAAAAAGTATATATATATATAtgtatatgtgtgtgtgtgt
-gtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgatgaagtcttgctatgttgcccaaggt
-ggccttgaccccctgggctcaagtgatcctctcacttcagcctcccaagtaactgggacC
-CAGCTTAAAATATTTTGATGACAGTATATATATAttttttgagacagagtctcgctctgt
-cacccaggctggagtgcagtggcacaatctcagttcactgcaagctctgcctcctgggtt
-catgccattctcctgcctcagcctcccgagtagctgggactacagttgcccgccaccatg
-cctggctaacctttttttgtatttttactagagacggggtttcaccgtgttagccaggat
-ggtctcgatctcctgacctcgtgatccgcccgcctcggtctcctaaattgctgggattat
-aggcgtgagccaccgcgcccggccAatgactgtgtttttaatataatttgtttcattcat
-aatccaatgcatttaattttattttaagcatgtgaagacaccattctgaggaggggtcca
-tggcttcaccagatgccaaagacgcccatgccacagcaaagAAAaattcattgatcaatc
-cttcaatgaccccatgaagcagcagtgttaccagtttgctacagaggggaacctgaggca
-cagggaggttgtgcaacttgtttaaggtcacatagatatcgagtggTTGTGCATTATTAT
-ATCTGTCAGTTGTTTTTATAGCCTATGGGCTGATGTGGGCTTGTCCTTTGTGTCACATCA
-GAAAGCAAGTCTGGTCAATTATTTTCTTTCTCAAGGTTAAGTGAGATCAAGAAAAATAAT
-ACACATATATTGCATGGATTATTTGTGGTCATCATTTGCTAATCCTTATACCTGTGCCAT
-GTTGGATTAATTATTACAGCTTTGTGAGCTGCTTTATTAAGGAGGGGAAGTAGAGTGAAC
-AAATCATGGCAAGTCACTTCACCTCATCTTCTCATTTAAGGATGCTGATACTGGTGTTGC
-CAAGGCGACGCTGTCAGCTTTCGGAAGCATCTTTAAATGGGAGAGGCGAAGGCCCACACA
-GATCGAGGCGGAGGAAAACTCAGAAAAAAGGCTCAAATCCCTCGGCCGCAGAGACAAACC
-ATCCTGGTGGGGACCATCCCTCACCCCCCGCACATGGCCACTTTCTACCTCACCTGTGGT
-GGTTGTCTCTGGGGTGTACTCAGGGAACTCTCTCCCCAGTGTGGAAACTGCCTTTGCTGG
-GAACAACGCAGAGATCTCAGAAATGATGGATCCATCAAGTGCCAGTGGGAGAGACTGAGT
-GGTCTTGGAGGCCTTTCCAGGAAGTTCCTCCTGCCCTTGGTACACGAGTTTGGTGGTAGA
-TGCCCAGATGCCCAGAGTGCTCTGGGAGAGGAAGGCAGCTCACAAATGCAAATGCGCTGG
-AGGTGGTGCTtggctgtgctgccttggatgagaccctttccctctctgagccctaatttc
-ttttttctttttctttttcttttttttttttttttttgagacagagtctggttctatcgc
-ccaggctggagtgcagtgacaagatgtcggctcagtgcaacctccgcctcccggttcaag
-caattcttctgcctcaggctcctgaggagctggggctacaggcatgtgtcaccatgccca
-gctagtttttgtatctttagtagagatggggtttcaccatgttgcccagggtggtcttga
-acttctgagctcaggcaacccaccagccttggcctcccaaagtgctaggattacagacta
-ggagccactgtgcccggTGCCTAATTTCTTCATCACTGAAATGGGAAGAAAACTAACCTG
-GTGCAGGGAGAGGTGACAAGTGTTTTCCATAGGAACCCGCAGATGCAGGTATCCTAGAGG
-CTGGCACCTATGAGCTGTGGCCCCCAGGAGACCCAGTCTAGGCTCGAGACCACACCAGCC
-GTGCCCTCTACAGTGCCTTGTGCTGCCCAGGATCCTCAGGTTGGTCTTGTCTGCAGCCAT
-TGTGAGTCAGCCTCACTGTCAGAAGGGCTTTCAGAGGTTGCTAGGTGCTCTGTCCATGGG
-AAACTGAGGTTCAGAGAGGGCCAGGGGCTCTGATCCAATGGCAGAGCCAGACTGATAACA
-GGGTCTAATATTCCTGGGCAGGACACAGCTGTGCCCTTGATAGTCAGAGGCAATCTGGGA
-TGAACTGGATCCTGGGGTCAGGACCTGGGGACAGGGAGGCCGAGAGAGGGCACAGAGGTG
-GAGAGAAGAGAGATGAGAGCCAGGGACAGGGAACGAGGGAAGGCTGCCTAGCATCCCTGT
-TTCCTGAAGTCAtgacttgggtgtcactgaccccactgctggtgccaggcatgatcatga
-gaccgaggtctggtcaagcagagtaagagtgataagcatagggatggacacaagaccaat
-cctggctgcagaaaatcattcctttactggaatcatggagacgagggagctccccgggtc
-agggatgctgagctgggaggacatgagcctggggctgccagagccttcttgtgaggaaag
-atcctggctgagaatgaagtcaacggggcagatggaggggctgagaggtggagctgacat
-catttgagcctctggatctaacctcacttgcctttacccttagactttccagttatgtga
-gtcaatttattccttAGGGCTAGAATTTCTATCCCTTATACCTGAGTCCTGGCATGGAAG
-AGGAAGGAAGGTAAGAAAGAAGGATGAATATTTAAGAACAGGTGTCTGAggctgggtatg
-gtggctcatgcctgtaatcccagcactttgggaggctgaggcaggtggatcacatgaggc
-caggagtttgagaccagcctggccaacatggtgaaaacccgtttctactaaaaatacaaa
-agttttccgggcgtggtggtaggcgtctgtaatcccattactcaggaggctgaggtagga
-gaatcacttgaaccaggaggcagagattgcagtgatctgagatcatgccactgcactcca
-gcctgggtgacagagtgagactctgtctcaaaaaaataaaataaaaTTACATAAAGAACA
-GGTGTCTGAGGATAACTCAAATCAGCTTCCTGCCCCCTTATAAAATGGGAGTAGAGAGGG
-ACTTGGGCCTTCAACCCACCCAGAGGAGTTCTGTCCCTGGGCCTCACAGCTTTGCCCTGT
-CTCCTCTCTAGCTTGCAGTCAGCCTAGAAACTACAATAGAAAAATAAATGATGTGGATAC
-AAAAATAAAATGCCTTTTCCTCACCTGAGTGCAGGAGAAGGGGCGGCATGTGCTGGGGAA
-TGCCTTCCTCACCCCATTCTCCTCTTTGaggacaaacatttattaggcacctgcttcatg
-ccaggctctattaagaagatgacatacatggtctcatttcctccttgccatagcccagcc
-aggaaggaatattatcatctccattttacagatgggaaaactgaggctttgatgatgtga
-agataactggtgccttgagaggctgagccactggaccaaagtgtcagagctggagcaggt
-ttgtccgactccaaagccctgcccaccacaccacactgcACACAGTAGAGGCTAAATAAA
-GGTCTGCTGGGCAAATGCTGCTTAAGGCGATTTGAGCTCTCTGGGCAGCAATCTGCCCCT
-AAAGATTTCCCATCATGCCTGAAATGCCACCATTAGCAACCATGTCCTTTGAGTCTTGAA
-GGGGAAGAGTGCTAATTCCCAGGAATGAGATCAAAGTCAGTCTGTGCTGGGTTTACTCAG
-GGATCGGCTGAGAGTGGGACTCAGGGCTGGGGCGAGCCAGGGGGATGAAGGGGTCCCATT
-CCCATTGGCTCAGTCTCATCCAGGAGAAAACCTTCTGAGGACAGAGGTGTATCCTGGCGG
-TAGGGCAGGTGGGCTCCTGGCTATGCCTGGGTGTTGGCTGATGACAACAGGGCAGACAGC
-ATGACACAGTGATGGGGGCAGGTGACAGAGTAGCTGTGGATCCTTTCTGACTCCATCCTC
-TGAAAGAAGCTATGAGGGCCCTGGTCTCCCAAACTCAGGCAGAGGCCTTATCTCCTCCCC
-TGCAGCTCCCCACCTACCACCACAGAGGCAGCATCACTGCTGGATGGGGAAGGGAGGGAG
-GCTAGGGGTTAGGGCTTGGAGGCAGAGAGGATCTGGACTTGGAGACAGATGTCCTGCCTA
-ACAGTCCCTGTAATTGAGCCTGGGGGAGTTGAGGTTACAGGGAGTCCTAAGGGAAGCCAC
-CCAGGTAGAGATCAGCTTCCTGGGACTTGAAGGAGCCTTGGAGGACATGAGCCTATAACA
-CAGACAGGGACCTAGTTCTAGACCCTTCTTCAGGGATGGTATCTGTTTTAACTGAAAGGT
-TATTTCCAGTTGTTTTTAGAGGTTGTTTGAGGCTGTCACTGTGGCCCTTGTAGCCAAAAA
-GGGTGAGTATAGCTGGGGTGGGGATGGGGTCGTAGGGCTCCTCCTTATGCCAGGGGAGCA
-CTAGCTTTGTCCAAGAGCATCTACAGTCCTGTGAGATGCTCTGGGACAAACCGAGCCCAT
-TTTCAAATaagtaaatttggagaaagctgcccactctagccccttcatgggtagtcacaa
-ggcacttggccatattaaaggctctgatcagtcctgcagtgaagagtgcctgttcacttt
-gacttaacctgctgtttccTTTTCTCATTGCTCATAGGTACTTTTAGAGACAAGCCATAG
-TTATTCCCTGTGACACATCCTCTAGGACATGCTGGAGGTGAAGGAGCATGTCCTTTTGGG
-TCTCCTAAAGACCCTGAGCTCCAAACATTGGAGCCTAGAAGTGGTGAAGTGGTAAAGCCT
-AGAAGTGGTGAAGTCTAAAGACCCTGAGATCTAGGGTCATTAGAACCTAGAAGTGGTGAA
-GTGTGAAGGGGAAATAATGATTAACCCACCCACTAAGGGGTGGATGCAGCCCCTTCAGAC
-TTGAAAAGAAAGTTCAAGGACATCTCAAGACTAGAAAATCTTGGAACAGGAGCTTAGAAT
-GGGAGATGGCCTTCTTGCCAATCCAAGGGAGAGAACCTGGGCCATCTGGGCAGCTTCCGA
-TGTGCAAATACATTCCCACCTGCCTGCAACCCCACCATTGGTCATGGGAATCAAGTTTGG
-TCTGTTCTCAGCCCATTCAAGGTACTGTGACCCTCAGGCAGGGAGCCCCTGAAGGGGGAG
-GGAGAGAAGAGGGGCGAGGACTACATCAGAGGGATGGGCCCCGAACACCCTCCATGTCAC
-AGACGGAGGGGAGTTGGGGGGCAGATGACCCTTCTGGACTTCTGGGTCAAGGAGGGCTGG
-CTCAGGAAGCCCAGGGTGTCAGGGAAGGCGGTGGCACAGTGTCTTGCATCTGGGTCCAGG
-TTGTCCAGGAGTGCCAAGTCCGAGCTTCTCCTGTGTGGTCCAGCCTCTGGCACAGCTGCT
-CGTTAGATGTCCAAAGGCCGTATCATCATGCGAGAGGCACGCAGTGAGTAGCTGGGGCCC
-TTGAAGTAGTGCCAGCGGATGCCGTCCATCTTGTACTTGTTGTCGGGAGCGTGGTAGTAG
-ACGCCGTTGAGGTTTGACAGGCCACAGGCGTCAAACCACCACCCTGGTGGAAGAGGGAGG
-ACAGGCGCTTGGTGGAGGTGGGAGCCCAGCCAGTGGCAAGAGGGCAGCCCCTGTGTCCCA
-AAGAGAACAAAGACTAATCGGGGCTGTTGCCTCCTCTGGGAAGCCAGCTggctggggatg
-gggctgggtgggagtgggggtggggTGGACAACAGACCCTCTGCTCAGCCGGGGCCTCTA
-GAGGGCAGCAAGGGGCTCTGGCCACTCCTCGAGCCCCCTTGCTCCTCCCGGCCTTCTCCC
-TGAGCCCTTGGCGTCCCTGTCTTCCTCCCTCACTGAACCTGTCTTTCCAGCTCCCCAACC
-TCCCCTCATCGCTCTGCTCACTGCTTTCTAGTGgtctctgtcactctctctgagtctctc
-actctccaggttcatctctttctctcttatggtctctgtgcgtgggtctgtctctgtgtg
-tcccattgtgttcatctttctctgatggtctttgtccctctctgcctttcgtgtctctgg
-ccctCCCTTCCTCTGGGCCCCCATCTTTCACATGCTGTGTTTGTCTCCCGGCCTCTCCTT
-GGGCTAAGTCTTTCTCCCCCATCTCCCTCTGTACTTCTCTGCCCCAGTATAGCTCTCCAT
-CTGCTGCTCAATGACTCTGACAGCCTTGGtgtctctctctttctccatctgtcctctgtg
-tctcagaaggtctctccccctgtctctgttcttcttactttgtctctgtctcCCATTCAC
-CCCACTTCCTGTTCTCTGACCTCTGTGCCTACCAAGGAACACTGCCTGAGCCACAGCTGG
-TGTGGAGCTGCCCCTCTGCCTCCCTCTGGTCTCCTGATCCTGGTTCGGCTTGCCTGGGGT
-TGGGACTGATAGGGTATAGGGTGCCTCCCCCCCGGGGCCCTGCACTCAGTGTTTCTTTAG
-CCTTGTCTCTGAGGAAAACTGGTGGTGCCAGCTTTAGGAGGAGGTGAGACCTGGAGGGGA
-CTTCAAGGACTCAATGGGGGAAGGCACCGAAGGGGCACAGCCAGGTGAGCTTATGGGTGG
-GCAAGGCCCAGACCTGCACCCATCCTCCTGACAGCACCTGGGCGCACAAGAACCTGGGGA
-GGGAATGGGAGTGTCAATCTGGGTGAGCCTGTGGGTGGGCGGAGCTTCACCCCACCCTGC
-ACCTACCTCCAGACATCACTTGGGCACACTTGCAGAGACAGTGGTCGTTGTCTGAGTCAA
-GGGTGCTAAAGCTGGTGTTCTGCAGGACCAGGCTGCTCTGGCGCCCTGCTGAGCCGCTGT
-ACCCGACCACAGAAAGCCTGGAGGCCACCCAGAGGTGGTGGTGGCAGAAGGGCCCAGAGT
-CAGGTTGGGGCTGTGTCGAGCAAGAACTTCCCCAGTGGCTTTGTCCCAGGCTGGGCTTCC
-CCTCCAGGTGTTCTTGGAGGGACAGCCCCAGCCTGGGTGGAGTGCTTGGGCTGTTTCCCT
-TCCTGGATTGCCTTCCCTGCCTGCTGCCTCCCAGGGACAAAGCACTTACTGTATGCCAGG
-CCTCCCCTATCTCACTGAACCTGAGTCTTGGAGAGAAGTGATAATGGTCACAATAATGAT
-AATAATGGCTAATACATATACAtttttttctttagagacagcaacttgctctgttgccag
-gctggagtgcagtggcacaatcacggctcattacaaccttgacctcttgggctcaagcaa
-tcctcccacctcagtctcctgagtaaatgggacaataggcacgggccaccatgcccagct
-aatgtttgtattttttgtaaaatacaaacatagggtctcactatgttgcccaggctggtc
-ttgaacacctgagctcaagcagtctgcctgccttggcctcccaaagcactgggattacag
-atgtgagccaccgtgcccggcAACGTTTCTTTTTCTTTCTTTTTTTTCTATTCTTTGCAT
-CTACTATGtgttcaaagtgctttgcataggttaactcattctcctttaatcctcacaaca
-ccctatttccattttacacatgcgaaaacagaaatcccaagagccaaagaaacctgctca
-agtctcagaatgaatgagggtcagagccacatgccagcctagtgtggcctgacttgggag
-tctacgtgcatttTGTTCCCCAGCTGATGATGATCTGGCAACCCCAGCCCCATCGCACCT
-CCTCACATTCACCCACCTCTTCCAAGAAGCCTTCCCTGACTACACCAGCCCCCATGGATC
-TGGGCTCCAGGGCACCCCAGCTCTGCAGCTTCGACATCTGCTGCCAGCCAGGTGAGGATT
-TCTATTTCTTTGCCAGGCTCTGTGGCCTTGGTGGGCATGTCCAAGCCTgcctggtgatga
-agaccatgagatctgggggcagaaagcctggattcaaattccagctctaccacttagagc
-tgcatggccttggaggattggctcaccccactgagcctcagtttcttcatctgttccagt
-ggtaatgatagtgaaattagcagtgctgccctcgtttattattgatttggtgatgtcagt
-gtgtgaagtgtgcagagcagtgtcacggggtgagtgctcaacattcagtgcttgttatta
-ttTGGCCCTTGGCAGATGGCTGGGCCTGGTTGGAGAGAATGCGGGGTGTTTGTATGGCAG
-GGTTGGGGGAGGCTGCACTGGCAGCTGAAGTAGGGAGCCAATTTGGGAGCAATTAAGAAG
-GTCCTGCTGAggctgggtagggtggctcacgcctgtaatccccgcactttgggaggctga
-ggcaggctgattgcttgagcccaggagttcgagatcagcctgggcaacatagggaaaccc
-tgtttctataaaaaatacaaaaattagctgggcatggtggtgcatgcctgtaattccagc
-tacttgggaggctgaggtgggaaggtcactggtcactggagcctgggaggtctgggaggt
-cagggctgcagtgagctgtgatcatgccactgcactccagcctgggcaacagagtaagcc
-ctgtctcaaaaaaaaaaaaaaaaaaaaagaaGGTCTTGCTGGGTGGAGGCAAGTGGGTGG
-CAGATGTGGCCAGGGCAGCTCAAGGAAGCTCTTGTACCCTCAGGGCAGGGCCTGAGAAAT
-TCCCCAGTGGGAATTCAGAGGGAATACAGAGCCTGGGTATATGGTTGGCTCAGTCCCCAC
-ACCTCCAGTCATAGATTGTGTCTGTCGCCAGGGAAATGAGACTTAATTATTCTCTGTGTA
-GAAAAGACTTGGGAGGCTCCCTCAGCTTCCTTTTAGGCACTTACTATGTCTGGGGATGGG
-AACAGCCGTGCTCCCAGAAAGCAGTCCAGTCAAGGGTGTGAAAGGCTGCCACGAGACAGT
-GATCGTAAtattgtttgctgagcgtttactacatgccaggcactgtgttaatgcttcatg
-tgcagtatctcattcaggcctcatcacaccctttttgaggtaggtatgcctaaagcaccc
-attctacagatgaaaccgtgaagggacttgctcagggtcactcagggaagtagggatgga
-gtcgggatttaagccTTTGCTTTAGTGGCCAGTGGCTTAAATGGGACTCAGCATAGTGTT
-GTAGCTACTCACTGGTCAGGTGTGAGGAGTAGGGGGACATCCAGGGAATTTTTCATTCAG
-CTCTGGACCTTGCATTATCAGGTTGGTATGGATCCCATAAGGAGGGATGTCAGaacctgg
-gcaacatagggaaaccctgtttctataaaaaatacaaaaatcagctgggcatggtagtgc
-atgcctgtaatcccagctacttgggaggctgaggtgggaaggtcactggagcctgggagg
-tctgggaggtcaaggctacagtgagctgtgatcatgccactgcactccagcctgggcaac
-agagtgagaccctgcctcaaaaaaGCCTTTGCTTTGGTGGCCAGTGGCTTAAATGGGACT
-CAGCTGGAGGAAACAGTGGGGGCATATCACTGAGAAGTTCCCAGAAGTGGAATCAGGCAT
-AAAGTTCAGGAGGACAGAGAGTCATTCAGAGATTccttgtggggaagcgaccttcccacc
-agtggaggtattccagcacggctggatgatgattgcaactatggagggaatctatgaaga
-accagatgacacgtgagattttttgcagccctgtgagtgtgaatcCTGGTTCAGAGATAG
-CCAGGACCCAGGCTTATCTAAAAGATCCTTAAATTTCTCTgagaggcaatatcatgttgt
-ggagacatcatgagttttgacagcagggagatctgagttcaaattccagctcatttaact
-tgtaactttgggcaggatacttaaacttggcatctcagtttccatattactaaagtaggt
-acagtaatgcctacttcaaagtgttgtggggaagattaaatggaataatggtgcctggaa
-cacagtaggtgctcaataaatgctagttcCTTTTCCCAAATATACCAAGAACCAGGCTGA
-GGAAGGGGTGAGAAACCTTGATgatcttacaagatcgtcatgtttaagctcatcctgcta
-ttgaagaagcagaagctcagagaagccagactgacttgtccaagttcccaaagcaagctg
-gagcaaggccacaatgagtgcaggaatttcaacttctggcccagggacccttccacccag
-ccCCAGGGCATAGGACAGGCTGGGCAAGTCACCTCCTTTTGCTTCTGGGTCTCTGTAAAA
-AGGCTGACTTGGGGTGACTGACCTTGGAAGACCCCTTCTTGCTCCTCGGATGGCAGCACC
-AATGACATTCTTTCCACTCCACCCAGTGGCTAGGACATGCTGAGTGCTAACCAGCCACCT
-CCAGATCCCATGACGTGCACCCAAATGGGGGACAGATGGTAGGAACAGGAGACACCCAGA
-GACTGACCGTTGGAGCAGACTCTGTAGACACTAGCCTGGGGACCCCAGCCCGCCCACTAG
-CTGAAGACCCCAGCCCCCACAACGGCCTGGGCCCCGAACCCACCTGTATAGCTGGTTCTC
-ACTGCCCAGGTGGAAATGTTCGTACTGGGCATAGGCCTCGTGGCCTTCCCAGTCTTGCAG
-CTCCACACGCAGAGAGTAGGCTGCCCTTCTGGTGAGCTGGTGCACCACTTCATTGCCCAG
-CCAGTGCTCCCCAGCTGGGTCTCCGAAGCCCTATAGGGAGGGGAGCGTGGGGTGAGACTC
-ATGCTGAGGAGGAGGCCATGTCCCTGGCTGAGGAGCTGGGCTGGGCCAGGCTCCAGGGCT
-ACTTATACAAAACCACTGTGCTTAATGATCGAGTTCATAAGTACAGTGTAGGCAGGACTG
-GGAGTAGGAGCCCTCCACCTGCTAGAGGGAAAAGACTAAGGCTTTTGTAAGTGTAAAAGC
-CTGTTAAAAGTTATTGAAATCAcattcctctgaagttcaagaacaggaaaaagtaatatt
-tggtgactacctttggtggagtattgactgggagggggcacaaagtgggcttctggggtg
-ctgggagtgttgtacatctagcactgaatggtggtcacgtggttaaatacatatctaaag
-gctcactgagccttacactttatttgtgcgcttagacacatgtacgttaaacctcaacaa
-aaaTTAAATAAAATATTTCAATCAGCTACATAAATAGTAGAGCAAACTTTGTTCAGTGAC
-AGCGCAGCCACTGCAAGATTTCAGCAACACAGAAATGTAAAACTGAGAGTGTGGGGAATG
-TCATGTCCCAATGCCCTTGGACAGAACAAGAATTCAGCACCAAGGACAGGGGCACACCCA
-AGGCCCGCTCCCCAATTTAGTCACGATGCAATGCGGGTTAGCCTGATGGTTAATATTCAG
-GGTTCTTTTGTGTATTTCTGCACCTGGACACCCTATTCCTCCTTGCCATTTTAATGGTTG
-TTTAAAGCCCAATTAGTTCAAAACACTCATAACTTAATTTGGTATTTATTTTTAAGTATT
-CCTTAAATGAACAGCAAGCAGACGCAAATAATAGAACTGCTGTATCACTTTGTGGGTATC
-TTTTTCTATTTCTTTGGCTTTGAAAACTTTAAGAGCTTTTAAGTATTTTAAGTCAGCTTG
-GCAAAAAATCCTTTATTCAAAACCTAATTAAAAAATTGGAAAACAATCGGGCTTCTCATC
-TGATAAAATACATGTGATCTTTGGGCCTGCAATTCCTCGTTAATGAATCTCTCCTGCAGA
-TATGATCATAGACGTATGAAAAGACAAGAAACTTCATTAAAGCAACGCAGTCAGGGTTGA
-CTGGGGGGATTTTTATTCTGTCTCCTCCTTTGTATTCtttaaaaaattagaaatgtatat
-gtatttttttaaaaaaaattaaaacaaaaataaaGCTAAACTTTTTTTCTTAGAACATAT
-GTCAGAACTTTCAGAAAGAACATTCAAATTCAGGTGATGGGGTCCCATAAAGCAGATGTG
-CACTGTCAGCTTTAGATGAGTTGATTTTTTCTGGGGGAGGAATGAGGGCAAAGCAGTCCC
-CTTCCAACAGCCCAGCCCCAGCCCCAGGTTTCAGAGCAGAATGGCCCCTCCCCAAGGCAG
-CAGGGCTACCTGTTTGTAATCCTTCCAGTTCCGCTGAAAATTCACGGTGCCATTCTCACG
-GCGCTGGATGAGGGTCCACCTGCCTCCACTGCTCTGCAGGTCACAGAACACCTGGAGGGG
-GTGGGCAAGGCACAGCTGGGAGCCCTTGGAGGTAGCCAGAGGCCAGGCCTGTGCTAGCCC
-AAATGTGGCTAAGCAGACAGACCCCCACAGAGCAACAGGTgagcctgggggtcctgggca
-tcagaaagatccaggcttaaattccccacccattgtcatcatttttctaaagtggtgggt
-aaggaatgacctctcagagccttcctctcatttgtaaaatggagattcataccttaacct
-ctttgtgcctcagtctctcatctaccaactggggttgtgaaaattaaacgagatgagtca
-cgtaaagtgtttagaacagtgcctggcagtactaggtaaacggaagctcGACCTCTTTTT
-GTTGAAAGGAGAGGTTAGCAGGTGTGTGAGAAGTGTAAAAGACAACCTGGAGACAAACAG
-AGGCATTCTCCTTAGTATATTAAGAGGGGGTGAAAGGAAATAGAGCAATGgtaatactag
-caatttgagggccgaggagggaggatcgcttgagctcaggagtttcagaccagcctggga
-aacacagggagactttgtccctacaaaatgtttaaaaatattagccaggccatggtggca
-tgtgtctgtggtcccagctacttgggaggctgaggcaggaggatcactcgagcccaggag
-gtcaaggctgcagtgagctgtgatcatgccattgcactccagcctgggcaccagagcaag
-accctgtctcaaaaaaaaaaaGGGAATTATGAAGTAGGAATCTGCTAGTTGTTTCCcttc
-taggcctggctctcagaccctccctcctgacatccgtgctcttctctgtcacccttctta
-tcggatgacttgaccttaaattttaggacaaccttgggagccactgattgaaaatggtgg
-cacctctattagccctggtttctaatttcccacatggagcagaaccccaactcctgcctt
-caactggactatatgtaaactagaaagaaacgtctttgggctaaggccctggaattttgg
-gggttgtttgtaatatcagctatcatcatcttaaccaacacTGAACTATTTTGTGCTGTT
-CCAGTTAAAGCACCTCTGAAGTGATGCTGGTTAAGGATGCACTTCCAACTTTGGGAACTT
-CTGCTTATCCCCACAATCTGATCCCTGACTGCTGGGAAGTCAAAGCCACCCCTACACCTC
-TGGTATTTCAGATACTGGACAAAGCCTGATCCCGATGGGGTGCGGGGTGTCTGTTTGGGA
-AGCCCTTGGCTCAGCACCCTCTAACAGCCACAGTTCCCAGGGAGCCCCCTAACCTTCCTG
-GGCTTCGTTGCATTGGACACCTGGATGGTGTAGACACCACTGGCACTGGCCCCAGAGCGC
-TGGATCTCTGCACAGTCCTGGAACACCTGCTCACCTGCCATTATGAAGGCTGCAAAGGGA
-CAACACAAAAGTCAGTTGGAGGTGGGCAAGGAAAGAGAGAAGGGGCCAAGTGGGCATGCC
-TGCCTGCTTTGTGCCAGGTTCTGGGTTGGGAGGTGCTGGGGACAGGGAGATGAGTCAGAC
-CTgggaagatttcgtagaggaggtgacagtaagctggaacctgtgtaatgagcaggagtt
-gcccagtggagaaggggaaggtgttccaggcggaagaaacagcatatgcaaaggccccaa
-ggtaggaagggccctagtgtgtgcagaggacagGGCATGGGGAGGGGAACTAAGGCTGAG
-GCCAAGGAGAGGAAATGACTCACACCGTGAGAGAGGAGTTGAGACCAGGGAGGCTGCTTG
-CTGTATGATGCAACTGAGAGGGTAGAACAAGGCTGGCACAGAGAAGGTGGGGAAGGAAAA
-GGAGAGACGAAGCTGAGATTTCAGCAGGGCCAAGTCAGCCGTGAGTGCCAGGCTGCGGAG
-CCCAGATTCTCTGGGCTGagaaagagcactctgtccagagtgtggaggggggcctggagg
-ggatgagactcaaagctgggaggccagagaggaggctgctagagttttctgggagagagt
-tactggggcctgaacTCCAGTGAGGCActtcccatttcacagaccaggaaactgaggccc
-aagagtgaggcaactggcccaagggcacacagccaggtaaggcagaacCTTCCTTCTTTG
-GAGCTCCCTTGGGTGGGAAGCTGTGGGCTCCCCTTCATAGCCCACCCTTTTGGCTGTATC
-TCCCTGCTGCCCTGGGCATATGCTCCCTTATTCTGTCCTCCCTTGAAGCTGACTGCTGGC
-CTTAAAGGGCCCCTGTTTCTTCCCTCTGGACTACATGAGATCGGGATAGTATTAATGACT
-AAAACCTACCAGGGGTTTCTAGGCCTGGCCTGGAAAAAGTGACTGTTGACAAACAAAGTG
-CAGAGATTTAAAATCTCCTCTGTCTCAATTAGTGGAATCCAGTTAGAGGTTTGAACTATG
-ATTCTACCAGAATCCAATCTCTCTGGGTAGCCAGGTACCCAGGATGGGGCTAAAATTCCA
-GATGGATAGGTTGTCAACACCAGTGAGGAACCAGGAGGCTACCACAGGGTGGGACTTCCT
-GGTTTGGCTTTACATCTGAACTTCAGGGATCCCAGATCCTGGATCTGGGGCACTTGTCCA
-GAGAAGGCTATTGCTCTCATGTCACAAATGAGATGACTAAGACCCCCAAATCAATTCCAG
-TTCACTCACAAGCATTTCCTGGGCAGTGGAGACCCCTGCCCCACCTGTTGGCACCCCCTC
-AGCTCCCCACAGGGAATTGGAGTCCAGCCAAGCATGAGGAGGCTGTTGGCCTCAAGGTGA
-GCAGGGATGGGCTGAACCTCACCCAGTAAGGCAAGGACAGAGCCAGGGTTGGCCTGAGAT
-TTCCAGCCACCCTTTCCAAGGCTCTGCTCACTGTTATTTTCCTTAGTCTacaacaatatc
-aataacaataacaacaataatatcaacaCAAAAAGTGAAATACTCACCATGTATTGTAGT
-GTTTCCAAGGTGTCATGTAATGCCAGGGGTAGTTTGGGGCCAGGAAAAATATTTTTGGGA
-GGCATAAGAATAGGATGGACTGATATTGATATGCAACAGTTTGATCTGGTCCTCCTCTGA
-ATATCTGGGCTGGTAATTTGTACCAGTTTCCCTCGCTTTtgtgcataggcactgtgctga
-acccttttgtatgcatgaactcatccgattctctgtgcaagaactctatgagattattat
-tcccgttttacaagtaagaaaaattgaggctctgagaagttaaataaatgacttgtatga
-agttccagtgctaattaataagtgaaggagccagggcttgaactccggcccatctgactg
-caaagccagtgcccttcctcctacacATCTTCCTTTGGATTTCCACCACTGAGCATATGT
-AAGGTTGGGCAAACAGCCTGCATGAACAATCGCTGCTTTTATATCATGCACAAGTTTGGT
-CTTTTCTGCCTGTGCCCATGTCCTTGTAACCTTCTGAACCAAACTCCCCAGTGCCTGGGA
-ACATCAGAAGACTTGACTCTCTTCTCCTTTCACTAGCCTCCACCTGACTGGGACAAAGCC
-ATGCAGAGAGCTAGTGCTCCCTTCCTGCTAGACTTCAAGGATGCCTGGTTCCTGTGCCCC
-ATCTCCATCCAGCCCTCTCTTCTACACCTGGTGACTGAGCCTCTCCTTCAGTTTCTCCAT
-CCAGAAGGGGGTGAAAGCAACTGCCTAGTGTCCTTCCCTGGTGATAGTGGAGCACGGGGG
-ACAGGGTGTTTGGGCAAAAGGTGCCCAAGGTGAGGTGCCCAACACAACCTCCTACTCAGA
-CGATTGAGCAGACATTCAGCCTCATCTGGGGACTGGGTTACCAGTGGGTTAGTGGGAGGC
-ATTGGGCCCAGGCCCTGTGCCTTGGGCTGAGCTACAAGAAACCCACACATGGGATGAATT
-CAGGCAGCTCAAGGCCAGGTCTGTGCATACGCCAGTAATAGGTTCAGGTTAATCCACATG
-TCGCGATTTGGAAGGTGTCTACTTTTCCTACCTGTAGCTTCCTTAGGCCTCAAACCCCTA
-CTCAGCTGGGTCTGCCAGACTGAGATGGAGCCAGGGTGGAATCTTCTGCCCTCAAATCCC
-TGTCAGCCCTGGTGGTGCCGGGAGCGCCATCACTATTGGGTCTTAAAGGCTTTCCAGCCT
-TCCACTATGGATCCAGGAGCAGCAGTAGCCCCTTTGGTCTTTCTCTCTCATCAGGACATC
-TCCACTCATGGTTCCAGTCAGAGCTTCTTGAAAGTAGTCCCACTCTGTTCAAAAGCCTCC
-CATGCCCCCTGCTAGCCTCAGGCTAAGAGCCCTTCTCCTTCGCACAGCCTTTGGACCTGT
-CTATTTTTATGGTCTGGAAACTTCAGGAACACTGATAGCTGAGCATCTGGCACATATTAT
-GCACTCAAAAACCATGTATTTCTTTCTCCTTCCCTTTGGGACCCGTAAACCAGGGactgg
-acatttttgcaagagacaggagctgtgactgtgcattcactgctgtatccccagcaccca
-gcactgggcctgccacacagtaagtgcttagtaaatgtttgttgactgagtgaTTGCAGC
-TGGGGCCAAGAATGCCTTGGACACCCCAAGTAGGCCGTGTTAGAAGGAGTCAGTGAGAGC
-CTGGGAGCCCAGCCCAGAATTGTTTTCTTGACCCAGAAGCCAGGGCCAGGGATGCCTCTT
-CACTTCTGTTTGGCCCTCTTGGGCTTAGGGGCAGGGGCATTAAGATGAgagaggtccttg
-gggtgcattgagtctaacctcccagttcctcccattctacagccaggaaaactgaggccc
-agggaggggtaggacaagcccaagAAAGTGGGGCTGGAGAATGAATCCTGGAGACCAAAC
-TTGTCAGTCTGGATTGCTGTTGCCCTCATCCTCGCCTCCAAAACCCatgggtaaactgag
-gccaagagaggggcaggggcatgcccaaggtcacccatggaatcaggggacagggcctgg
-attgggaTTGTTGTTGACGCCATTATTACTGTTTATTGTTGTTTCTATTTCACAGATGGT
-CGGGGAGGGTGGGGCCCGCAATGGCTCCCAGGCGCCCAGAGACCCTGGAGGGTGAGCAGG
-GTCTCCCCTCCCCTCTCCTGCCCGTCTTTAGCCACACTGGGGCGCACACCGCTCACTCAC
-CCGGGGCCGAGGCGTTAGCCCTTTCTTGCACCAGGTGCCGCAACAACACCAGCAGCTGGC
-GCAGGCTGTGCTGCTGGTCCTGCAGGAGGCTGGAGTTGTGCCTGACACCGCGCAGGCCGC
-GCTCGATGTTGGTGAGGGCGGCGCTCTGGCGGCTCAGCGTGTTCAGCAGCTTCGCCTTCT
-TGCTGAGGATGCTGGCCAGCTCCTCCTGCTGCTTGGTCTCCAGGGCCTGCAACCGCTTCT
-CGAGCGCGCTGCGGGGTAGGGGGCGCACAGAGGTGAGCCTGGCATCCTCGCGAAGCACGC
-ACCCCCGCGCGCCTCCCCGGCCCTGGAGTCCCTGCAGCCCGACGATGAGACTCAAGTGTG
-GTGGAACGTCCTGTGCCCACTGTAGGCACAGATTGAGGAGGGGAGAAAAGAGATACCCGG
-CCCTGGAGTAATATAGATTGAGGTTTAGTGGAAGAAAGAGGTGGTGTGGGAGGGACACCA
-GCAACTGGGTAGCTATTATCAAATCCCAACTGTGCTTGCTTTTTGACCCAGCAGTCTACT
-CTCAGGAGTTATCCTCTAGGGAGCATGGTCAAGAATGGCCCTGGGGACTTGCTTGTAATA
-GAAAAACAAACTAACCAACCAACCAAAAAAGATATAGCCTAGATGCCCAAAAGCCAGGAC
-TGGCTGAATCCGTTGCGTTTTGGCGTCCCTGGAAATGTTCCGCAGTCATGAAGGAGGAGG
-CATTTGCACAGAATTGGAAAGATGCCCAGGACTTGGGGCACATCAAGCCTAACCCCATGT
-GTGGCAAGAGAAGAAAGAAAGTATTAATGTAAATAAAGAGAAATGGGGTGAACATATAGG
-AGAAGGCTGGAAAGACCGCAGTGGTGCCTGTGTTTGGGAAGAATATGAAAGAAATTCCCT
-CAAGTGCTGTGACTTCTGCAGAGCAGGTTTGAGTGGATGAAGATGGAGAGGAGGAAGATG
-GGGGCAGGATGGAGGGCCCAACTTTCACTTTTATTTTGTACAGGTTCCTGTTGTCCGATG
-ATATTATAATAATCAAGAGACATTTTTTGTAATGGATTTAGAAGCAAAGAGGAGTTTTTC
-AAAAGAAAGCCTTAGACTCAGCTCTTTCTTTTTGGACATTTTATCCTCCagatttactca
-catgtgtgtgaaatgagatatggaaatgttactcatcgtatcactggttggattagtaaa
-aggctggaagcaacctcaatatccattaactggggactggaggaataaaagcagggacca
-catatggtggagcattataaaggtggagaaaaaaatgagcaagcatgtcATGCAGTTATA
-GAATCTTTCCAAGGTAACTGAATAATAATTTGTAGAAACAAGGTATAAACAAGTAGTAGG
-CTACATTTGGGCTTAAAAAGGATAAAAATGGGAATGTAcagatgctccaaaatgtatgat
-ggggctatgtcctaataaagccatcgtaagttgaaaatgtcctaagtcaaaaactcattt
-aatacacctaacctgctgaacatcctagcttagcctagaccatcttaaacatgcttagaa
-cacttacattagcctgtgattgggcacgatcatctagcacaaaacctattttataacaaa
-atgttgagtagcttatgtaaggtattgatattgtactgaaagagaaaaaccgaatggttg
-tatgggtactcaaagtacggtttctactgcatgtgtatcactttcataccactgttaagt
-cacaaaattgtaagcccaaccattgtaagttagcaatcttctgTATGTATGTGTTTGCAT
-ATTCATAAGAAACCCTGGAATGTCAGCTTAtaggatgtcagcttcacgaggacaggggct
-tttgtctctttgttcacttctgtatccacagtgtctacaatagtgcctgacacatgaaaa
-gagtttgaaaaataattgttggttgaatgaatGGAAGGATACACAAGAAACTAGGAACAG
-TGGCTACCTCTGGCTTGGGTGGGTGGCTGAGAGACAGGGCTGGGAGGGAGACATTTTACT
-GTATATCCACTTGTGCCAACTCATTCTGCAGACTAAGAAATTGAGTCCAGCTAGGGCAGA
-AGAAATTTCCTCTGGACTCCCAATTATGCTGCAGGAAAAGAGAGAATTGGGGCACACTGA
-AATTCTAGAATTCCTGCCCTGTCTTCATGGGCCAAGAGTTTACCGATGACATCCTCCATC
-CTCACTGATTTCTAGACACCTAGTGTTAATTTAGAGTCATTGAAAGTGTCCCAGTCCTTG
-CCACTGAGACCTTGGGTTGGGAGAATAAGAAGATGGGCAGATTGTCATTAATTGCACCCA
-GATTAGAGAGAGCTGGGGGATCTTATGGCCTTATCCTGAACCGGCATGTGAACAACAACA
-TCTTGCCTGATTCACAGGCCTGTGGCTTGTTCAGTGGGTAGATTTTGCCTTCTCCAGAAC
-CCTGACTTTGGCAGCTTTTTTTCTTCACTCAGCTTGAAACTGAGGTGAAATCAGCCTTAG
-CTGCCAGATTTTTCTGCTTTATCTAAACCTCATGACCGCttttttttttttttttttgta
-atttaaaGGGTGTTCCCCTGATGCCCATTTGCTTATAAATGCAAAGACTCTCTGATAGTG
-TGGACAAGAACCTGGTAACTGTGGTTGTTTCTGGGAAAGGAATCGTAGATAGCACCAGAT
-TTATTTATTTGCAAAGAAGTAAAGCCAATAAAGTTTACCggatgaatagtatggtgggtg
-aattagatctcaataaagctgttaaaaTTTACGAGATAAATAaaagaaggaggaaggaag
-gaaggaaggaaggaaagggaaagaaagaaTCAGGGTGTCCTGGGCCCCAGGAAGATGCCT
-ATCCCCTGTCCCACCCAGTGCAGGGGCCAGGCAATGTGTTTGCCTGGCTCCTAGcccagc
-cccgtatccactctcatttccagcctcagtctagactccaaccctggtttcagtccttcc
-ccagcaggggctattcccagctctagtttcagccctaactccCAGGATACCTccttgccc
-caatcctaatccaagctcctaggtctggctgcaggccctatcccagacaccagcccacgt
-ccagcttccggtcctggctccagccccagtcctagccctggctctggtgcctgccctagg
-tcctaaacttgactccagccccagcccctgtcctagtcTGGTGCCAGGTGCCACACCCAC
-CTGTTTTGGCCCTGAAGCTGCTGGAGCTTCTGCCTCTGTAGCAGCAGCTGGTTCTCCAGC
-TTGTTGGTGGACAGAAAGGTCTCTGGCATCTGGGCATCCATTCTTGATGTCTGGTTCAGG
-AGCTGCCCCAGCAAGCAGAAGCAGGTAGGGGGCTGCGTAAGCGCTACAGGAGCCCTGCCC
-AACCACCCACCTGCCCACAGGCCCTGCCACTCCAGAAACTTACCCATTTCCACTCTCCCA
-GTCGTAGTTCCTGTGGTTACTCACTCACAGGCCCTGACTTAAGCTTATTacctgcttcct
-aaatttgcctttctccatcactgcaatggcagctccattctccctgatgcttaggcccca
-ggagctgtcaaccctgtcccccacatccaactcatctgcaggtcctgtcagccttgcctt
-ccaggtggcccctgaccacctctctcctgctctgtggccctcactctggccctggactgc
-tccctcattgcttgcaatctattctctactcagtagcctggggctgcctcttaaaacatg
-tttgctctgttcaaaagcttcctgtggctcccatctcatgtagcggaaatgccccagttc
-tcaccatggcctgcaaggccctatggtgtgatctgtccctatcacttctccagctccttg
-cctgccactctcctcctggtcactccagcatagtggtctcctgatgttcttgaacctgcc
-agcacgtccatcctccctccgggcctttgcacatgctgcatcccttgtctggagcactct
-ctgcagtaagcctggctgcagccctaccttctccatggcccttcctggccttgctgtatg
-agcttgcagctctcatccccccccaccactcccaatgcaccccctctcttgctctctctt
-ccatgctattttctccttagcgctgtcactggctaacatatgcagacatgtgttgcttaa
-tgacggaaagatgttgtaagaaagtcgtcatcatgcaatttcgtcattgtgcaaacatca
-tagtgtgtacttacacaaatctagatggtatagccgcctgcatacctaggctatatgaga
-cagcctattgctcctaagctacaaatccatacagcatgtgactgcacccaatactgtagg
-cagttataacacagtgggaagtatttgtgtatgcatatctaaacacagaaaaggtacaat
-aaaaacagcatacgatactcttatgggactgctgttgtctatgtggcaagttgttgactg
-gaacattaagcagtgcataaccatatatgtcacttatcttttcattttcaggggaagctt
-cacaggagtaggaatgtatgcctgctttgtttcctgctgtatactagacaccagtcttct
-caagcagtgcctggcacaCGGGGGATCAAACAAACAAATGGGCACAAACTTGTGTCTATT
-TGTTATTCACTTTTTCATCCACTGACTTCCCTACCCTTCATTTATTCACTAGTTCCTTCC
-CTGCTCTTTGCTGCTCAGATACCTCTTCTCTCCAAGTCCTTGGCCCCAGAGGCCCAGTGA
-Attgtttcttatccatcttcccctggcacattgtaagtcctctgagggcaagggagctgt
-gctactatacccctcattccagtgcccagcacagacccaggcactgaagttacagaggca
-gaaaagccaagcccagcatccaccccccagggctcatagcttggagagagatagttttat
-gacaagttcatcagggaggagggacccggggggctacaggcccagaggaggccttgaccc
-tactcagggtcagagatcaaggtaagatgactggggCTACGAACCAGCCTGGCCAGCCAC
-AGGCCCTCAGTGCCCACTCAGTCACCCTCTGTTACCTGAGCCTCCATGTCGGTCAGCTTG
-CGGATCTGGGCAGTGGTCTGGTTCAGGAGGCTGGTGCCCAGCTCTAGCATGGGGGCCGTC
-TGATTCTGGGCCATTTGCTGCTGGACCTGCTCCAGCTTCGACCTCAAGATCGTCTTGATG
-GCCCTCTCTAGCTGTGGGAGACCATGGGCTGGGGTCACGGGGGAGGGGCGGGGGAAGCCC
-CCTGTCCCTCCCACGTGTCACCATGGGAGGGCACTGAGCAGCCACTTGAGGCCTCCCTGG
-CTCAGAACATGCCGGGccaggtcaggccaccattacgtcttgcctggactatcccagtag
-atttttccctgggagggatttatatgcctgttttgtctgcctctctgcttccatctttgt
-cccctgcacagtccatcccccactaggcagccagagggatcctgctaaacctaagtcaag
-tcacactcctcctttgctcaaaatctttccagggttcctatctcacgcagaggaaaagcc
-atgactgcaggttcctccgtgactgggcctgccaccacactctcattcctctcctattcc
-cctctccctcactcacttcaatcccgatgcaatggctccatgacatccctctaacgaagc
-aagcatgtgcccacagctgttccctcactgttccctctggaatcctcccccAACCCTGAT
-CCGCATCTGCGTGGCACAcctcctcatgctgtttcagctttcttcataccacttatcacc
-acctgactttttaaaatcactatctctctttttatctgtctgttgtctgtttctctctct
-agaatgtcaattccatgaagccagggacttggttttgctcactgccttgtttctatgttt
-agcacaatgcatggtgcacagtgagtgctcataaatgcgcgttcaatgaattgatGAAAA
-AGGGGAAACAGCAAGGGTCAGAGCACAGCGCCCAATCACATGCCCCTTCACCAGCTTCCT
-CAGGGTGAGTCAGCCAGCAGGGAGTGGGAATGCATCTCTCCCTTGTACAAAGAGTTTGCA
-GGTCCAttggccaagctgtgttttctatcttcagatcccctctatctgccaaatggggct
-ggactggccagtctccaagggttctcccagctctgatgttctgggatcccaCATGCAAAT
-GTTCATTTCTTTGACAGGGCTGCTCTCTTTCCCAAGGGCAGGAGAGCTGGTCTGGCATGA
-CACCAGTATGCTGTTGTAAAGGTGAACAGTGTGTTCTCAGGGCTCGGTGCCTGCAGGCAG
-AGAGCCAGCTCCCCTCCACCATTGCCTCTCCATTCGGCACACATGCTGGCCTCTCACCAT
-GCCCCCCACCCCTGTCCCTGGCTCCTTCCCTTGCCCTCTCACTCAGTCTTTCAGAAGCCA
-GCTGGACAGCTCTCAGGGTCCTTGGGAAGATGGGTGCTCCCCAGGAGAGGTGGTGACCTT
-GGCTCGGGCCAGGCTCCAGCCACTTCCTCCTTCATCTCTTCTCCCTTCTTCCATCTTGAC
-TGTTCACTCCCATCCCTTCCTCACCCTGGAGTGTTTCAAAGGGAGCAAGTTCCATTATCA
-CATCCTGGAGCGGGTGCTTGTGGGCGGTAGTAGTACTGGTTAGAGCTgtgtttctccaag
-tgtggttcttccgtcagcatcagctgagctcattaaaaatgtgaatttccaggtcccacc
-gcagacctcctgaaccagaaactcttaatggtgcccagccaactgtggttaacaacaccc
-ctggctgagtcagatgcctgctcaagtgtgagagcccttgATGCAGAGTAGCAGCAGGGA
-CTGAAGACCAGAGAGACCCCCCTCCTTCTTTCCCTGCATCATCAGCCCACCCCCTCCCTG
-CAGCACACAAACATGCGCTAACAGCTTCCATCTAAAAACTAACTCCACAGCCTCTCTGGC
-TGCTTCTCCAGTTTCTCTGATCTCATCAACACAAAACTTCTACAAGTTGTCTCCATTTTC
-TCACCTTCATACCCACCCTCACTTAAAAAACAACAACAACAACATAACGTTAATAATAAA
-ATGATGTTACGTTTCACACATACAAAAAAGCATAGAggccaggtgcggtggctcacacct
-ataatcccagtactttggaaggctaaggagagtggatcatttgagcccaggagtttgaga
-ccagcctgggcaacatggtgaaactccatctctactaaaaatacaaaaattagccagcca
-tggtggcataagcctgtggtcttagctacccaggagactgaggcaggaggatcgctggag
-cctgggaggtggaggttgcggtgagctgagatgcaccactgcactccagcctgggtaaca
-gagtgagaccgtgtctcaaaaaaaaaaaaaaaGTATAGAGAATAAATATAGCCCATAGTG
-CTCATCCTCCTGTATACCTCCAGTCATGTCTCTCCATCCTGGGAGGTCCCTTTGCCTTTT
-GGCgtctcactgttgcccaggctggagtgcagtgatgtgatcacggctcactgcagcctg
-aaactactggcttcaaacaatcctcccacctcccaaatagctgggacgacaggcgagcac
-caccacgcgcagttCCCCCCTTCGCTCTTTAATTCACCTTGTCATAGATAGCCCTCCTTG
-ACACTGCCCTCAAGGGACActccatcttgcttgacatctcaggagcaatcacctggatgg
-ccactccctgttgctggacgacttccccccaatcctggtttcctcctagcccctaaccac
-ccactctctgactcctcctttacagactcctacacggcagggcccccatggcccagtcct
-gggtccttgtctctatgtacattcactctctaggtcaggggtccttaatgaagaagccac
-aggctccatgaacttgagtgagaaaaaaagatcacattttttgtccactaatctgcaatt
-aaaatttggcatttccttcaattatgagcctaggtcacaaaccacagccatactagcagg
-tcctgagagtcattaccaatagaaatcccaaatattttcatatcacaacacactcttacg
-gtatcttaaaacattgtttttactcaccgggactttggaattatagacatcacacccacc
-actggataatgctatgcctgatcacagattttatttttcatattttgcttatgatttcca
-tattactgagtgttcttatgctttgattttatgcatttctgagaaaggattattaagctt
-caccaggaccagatgccaagaggTCTGAGGATCCAAATGCATCAGGGCCCTGCCCCAGGG
-GCTGAGATCGGTCTTTGGACTTCCACATCCctctgtgctaatggagccatcaccatctcc
-cacccagacttctcccctgcatgtccccaactcgccatctctgcatggtttccaatgagc
-atctcaagcccagtgtgaaactcttcattcctcagctcccatcgcccctgtccctgtaac
-tcccaccccatgcttcgaaatctttcccatctcaggaaatggctccacccagttctgaag
-ccccaaacccagacctcaatcttaacttctctttttcttagcggccacactcaacccact
-agtaagtactgcccactgtgatcccaatttggatttcaaatctgtttactcgccttattc
-tgggccaggctgccctcctctcCATGGGTCTGCCTTTTGTGCCTTCCTGTCTTTAACCCC
-TCTGTCAGCTCCCAGGAGATTCTTTTTTTTTTTtgcagttgcaagatttaatagcatgaa
-atagagtgaaaacagagctcccatacaaagggaggggacccaaagggggttgctgttgct
-ggctcgaatgcctgggtttatatgccaatccttgtctctcccactgtgctctcaggcaat
-agatgattggctatttctttacctcccatttttgcctaattagcattttagtgagctctc
-tgattggttgggtgtgagctaagttgcaagccccgtgtttaaaggtggatgcggtcacct
-tcccagctaggcttagggattctaagttggcctaggaaatccagctagccctgtctctca
-GTccccctctcaacaggaaaacccaagtgctgttggggaggtcagctgatgaccgcacta
-actgcttcctgctgaattagggagtagtaggggtggtgcagttgagatttcctcgggagg
-ggtgccttcgatgtcattaacatcagagcatgggctagcaggctggtccgggggtccgtg
-gtaaatcttagtcatggactgcatgtgagctccCAGGAGATTCTAATGTGTGGCTGGCTG
-GGCCCACCAGCATGGATGAGGACAAATATAGCTGTATCGAGTTTGGTCTCAGACTTTTTC
-ATGCATCATTGACCTCCTAGAACCTAAATTAAAAAGCAGACATCCAGGTACTGAGCACCT
-GCTCCAAGTAGTCAAACAGCATATTCATGCCTGAGGTGAGACTTTCCCAGGcatcttccc
-caagcttctcatttgcctgaacatagacaaactgaggcccagaagtcttgcccaaggtca
-ccatctggcaggCTAGGCTCTAAGACTCCTTGCCTGAGGGCTGCAGAGCTGAGCTGGTGA
-TTCAGGGCAGCTCAGGGTCCCCTCAAGTGACTGGAGCTCCCCAAGCACCTCACTGGTCCC
-CCACTTGTCCTGTGGTTGCAAGTGGCTGGGCAGGGCAAAGGTTACCCACAGCTGGATCCC
-ATCACCCAGTTTGCCACACCCGCCCACCAGCACAGGCCCTGGGATGGATAATCTGGGCCA
-GATGGGCTCAGTTAGGCTGGGCTGGGCTCTGGAGACTAATATTGGCCTGGGTGGTGGGAG
-CTAGGTCTGGCCCATGGCTGAGGCACCAGCTGGAAGGGCAGGGAATGGATCCCAGTGGAG
-GAACTCACCCAGCGTGGGATCTACTTCTCTTGTTTTTTTGGATCTACTTCTCTCTATGCC
-GTGCACCGACTCCAGGATTAGACCTGCCCCTTCTCCATCACTCTCAGGCTGCCGAATTCT
-CAGGCCTATGATGGGGTACAAAGGCCTGACCTTTTGTCACCCTTCCAGCTGGCAAAGAGA
-CTGAGTTTTGGTCCCTGGTCTACTGCCCCATCCCCTTGGCcctgggtttgagttctggct
-ctgccacactttcattgtgggcccttggagactactgtgtttctctgagccccactttac
-agatctgggtcatgggTCAGCACACCCTGCTCCTTGCTGGGGAGAGGGCATTTGCAAAGG
-GTCTTGAAGGAAAAGAAAGAAATTTTCACAGGCAGGGGCTGGGGGAGAGGGGGTGATTCA
-GACAAATAACAGGTGCAGATCCGTGGATGAGCAGCCTCCGTGGCCGAGGAGATCTGCTCA
-AGCCTGCTTCTCTCCTGCATTATTTATATAaaatggacatcaattggtgaatggagaaac
-tgcagtccatccatgcagtggactccattgagcaataaaaaggaaagaaccattgatgtg
-tgcaaacacacagatgaacttcagatggatcatgagtgaaaaatatgcaactccaatggt
-tccatactgtaggagtctatttgtatgactctctaaaaatgtcagaatctgtgattgcca
-gggcctgggtccggggagggggtggggattgattgttaaaggacacaggggagctttttg
-ggatattggcaatgttctatgtcatgattttgctggtggttacataactgtatatgtctg
-tcaaaactcatggaactatatgtgaaaagggtagattttgctgtacgtgggtcatacctc
-agtaaaaaaCAACGCCCCCAACACAAGGTTCTATAAAATGCCGCAGATATACATATGTAA
-CATTAAATAGATCTCCTCCAGTGAACCCCCTCACCCTCTCTGAGTTTCATTCATGTGttc
-attcaggaattatttcttgagcacctactatgtgctcatcctgtattaggtattagataa
-tcagaaatgagcaaaattcgtaaagtttctgattccagggcacttctactaaatatatca
-gttgcattgaaatcttgatgaatgctatgaagaaaataagacagggtaatatgtggggtt
-ggaggcaagtttagccagtatgatggagaaagccccaccagagagggccatctgggctga
-gaggctgagaagaagcaaggtctgggagagtcaggagggagggaattccaggcagaggaa
-aaggcaagtgcagaggccttgaagtgggagcgtgtctggtatttgaggatcaaaatgaag
-ATGGTAACAATGATATGCCCTGCAGCTATCTCTCTTCCATGGAAAATGGTGCATGAGGTT
-CCTGTTTGGGAAATGCATCTTGTCAACTGCAGATAAAAATCAATgcagagagagtagtgc
-tttgtatggatgaagctgtgtgtgaatcacagctcttagcttactggctgtgtgacctta
-ggctggggcctctactggtgtctgagccttttctctaaaatgaagataatcatagctcct
-tcccctgggttgtagggagcattcctgagataaCTCTGGTTGTAGTTACATAATGAACGC
-ATGATAAATTCTGGTATGTCTGGGCCATATCTTACTATGtgtcaggactctgagcccaag
-cctgcgcgtatacatccagatggcctgatgcaactggagaaccacaaaagaagtgaaaat
-ggctggttcctgccttaacggatgacattaccttgtgacattccttctcctggacaataa
-gtctccgtagctccccaccaagcaccttgtgacccctgcccctgcccgccagagaacaac
-cccctttaactgtaattttccactacctacccaaatcctataaaactgcccaccccatct
-cctttttcagactcagtccacctgcacccaggtgattaaaaagctttattgctcacacaa
-agcctgtttggttcacatggacgtgcatgatatttggtgctgaagacccgggacaggagg
-actccttcaggagaccggtcccctgtccttgccctcattccatgaggagatccacctatg
-acctccgatcctcagatcaaacagcccaaggaacatctcaccaatttcaaattgagtaaa
-cggtcttttcactctcttcttcagcctctctcactacccttcaatctccctgtccttcca
-attcgggttcctttttctctctagtagagacaaaggagacacattttatccatggaccca
-aaactgcagcaccggtcatggactcaggaagacagtcttcccttggtgtttaatcactgc
-agggatgcctgccctgatcattcacccacattccattggtgtctgatcaccggggggaca
-cctgccttggtcattcacccACATTCCCTTGGTGGCATGTCAATTGCAGGGACACCTGCT
-TTGGCTGCTCACCCATATTACAGCCCAGGGCTGCTCACCGcccgcttctccgtgtctcta
-gctttctctttaaacttacctcttcactgtggtcaaccttccaccctgcattcccccttc
-ttctcccttagcctgtgttctcaagaacttaaaacctcttcaactcacacctgaactaaa
-acctaaatgccttattttcttctgcaatactgctaggccccagtacaaactcgacaattg
-ttctaaatggccagaaaacagcacttttgatttctccatcttacaagacctggatgattt
-tttgtcaaaaaatgggcaaatggtctgaggtgcctgatgtccaggcattctttcacacat
-tggtccctccctagtctctgctcccaaagcgactcatcccaaatctttttttttctctcc
-tgtctgtttccttccatctccaccccaagctctgagtcctttgaatccttcttttctacg
-gactcatctgacctctcccctcctccctgacgctgctcctcgccaggctgagccaggtcc
-caattcttcctcagcatctgctcccctaccctataatccttctatcacctcccctgctca
-cacccagtctggcttacagtttcgttctgcaactagccctcctcacctgcccaaaaattt
-cctcttaaaaaggtggcttgagctgaaggcacagtcaaggttaatgctcctttttcttta
-tctgacctctcccagatcagttagcatttaggctctttttcatcaaatataaaaacccag
-ccccgttcatggcccacttagcagctaccattagatgcttcacagccctagacccagagg
-ggccagaaggccaccttatccttaatatgtattttattacccaatctgctcccaacatta
-gaaaaagctccaaaaatgagattccggccctcaaaccccacaacaggacttaatgaacct
-tgccttcaaggtgtacaataatagagaagaggcagccaagtggcaacatatttctgagtt
-gcaattactcgcctctgctgtaagagaaaccccagccacatccagcacacaagaacttca
-aaacgcctaagccgcagcagacagttgttcctccaggacctcctcccacaggatcttgct
-tcaagtgctggaaatctggccactgggccaagaaatgtccacagcctgggattcctccta
-agccgtgtcccatctttgcgggaccccactggaaatccaactgtcccactcgcccaccaa
-ccacacccagagcccctggaaatctggcccaaggctgtctgactgactccttcccagatc
-ttctcttcttagctgctgaagactgacactgcctgattgcctcagaagcctcctggacca
-tcacagatgctttaggtaactcttacagtggagggtaagtctgtcccctttttaatcaat
-acagaggctacccactccacattacctacttttcaagggcctgtttcccttgcctccata
-actgttgcgggtattgacggccaggctgctagactccttaaaactccccagctttggtgc
-caactgggacaaaattttttttttttttgagatggagtctctctctattgcccaggctgg
-agtgcagtggcgcgatctcggctcactgcaagctccatctcccaggttcatgccattctc
-ctgcctcagcctcccgagtagctgggactacaggtgcctgccaccacgcctagctaattt
-ttttgtattttttttttagtagagacggggtttcaccgtgttagccaggatattctcgat
-ttcctgacctcgtgatttgcccgcctcggcctcccaaagtgctgggattacaggcatgaa
-ccaccgcccccggcctgggacaacattcttttatgcactcttttttaattatccccacct
-gcccagtacccttattaggccaagacattttaacccggacaagtcttacaggctggtcca
-agatcttcgccttatcaaccaaattgtcttgcctatccaccctgtggtgccaaacccata
-tactctcctatcctcaatacgcccctccacaacccattaatctgttctggatctcaaaga
-tgctttctttactattcctttgcatccttcatcccagcctctcttcggtttcacttggac
-tgaccctgacacccatcagcctcagcaacttacctgggctgtactgccacaaggcttcag
-ggacagcccctattacttcagtcaagccctttctcatgatttactttctttccatcactc
-ccacctactctcccactgaaacttccacctatcaatctcttcccacacaaggcaaatggt
-tcttggactaaggaaaattcctccttccagcctcacaggcccattccattctatcgtcct
-ttcataacctcttctatgtgggttacaagccaccagcccacctcttaaaacctctcattt
-cctttaagacatttaccttgtatttcactccatccttggctaccttccccttgctcttca
-gactctcctcccaggccctcttcttgtttgcttatacccagccctgtaaataacagtgaa
-tggttgcttgtagatactcgacgttttttcatgcaccatgaaaattgaacctcctcctct
-aggaagttaccccatcagtctccattacaacctctgacggctgccaccctagctggatcc
-ctaggagtctgggtacaagaaacctttagtactccttctcatctttttactttgcatttc
-cagttttgcctcgcacaaggtctcttcttcctctgtggatcctctacctacatgtgtcta
-cctgctaattggacaggcacatgcacacaagttttccttactcccaaaattcaatttgca
-aatgagaccgaagagttccctgttcccctcatgacaccaacaGTTCACTACTATTTTGTT
-TTGTTTTTCTTATTATTAATATAAAAAGACAGGAATaggccttgacttactcactgctga
-aaaaggaggactctgaatatttccaaatgaagaaggttgttttcacctaaatcaatctgg
-cctggtatatgacaacataaaaaaactcaaggacagagcccaaaaacttgccagtcaagc
-aaataattacactgaacccccttggacactctctaattggatgtcctaggtcctctcaat
-tcttggtcctttaatacctgtttttctccttctcttattcggaccttgtgacttccattt
-agtttctcaattcacacaaaactgcatccaggccatcaccaatcattctatacgacaaat
-gctccttctaacaaccccacaatgtcaccctttaccccaaaatctttcttcagtttactc
-tctcccactctaggttccgacattgctcctaatcctgctcgaagaagccctgagaaacat
-cacccattatctctccataccacctccaaaaattttcgccaccccaacacttcacctcta
-ttttgttttgtcccaacacttcaccactattttgttttgtttttcttattaatataagaa
-gacaggaatgtcaggcctctgagcccaagcctgcacgtgtacatccagatggcctgatgc
-aactggagaaccacaaaagaagtgaaaatggctggttcctgccttaactgatgacattac
-cttgtgacattccttctcctggacaatgagtctcagaagctcccccactgagcaccttgt
-gacccctgcccctgcccacaagagaacaaccccctttaacgtaattttccattacctacc
-caaatcctataaaactgccccaccccatctccctttgctgactcctttttcggactcagt
-ccacctgcactcaggtgattaaaaagctttattgctcacacaaagcctgtttggtggtct
-cttcacacggacgcacgtgacaCTATGTAGCTGTTAAAAACAATGAGGTTGATggctggg
-catggtggctcacacctgtaatcccatgactttgggaggccaaggtgggtggatcgctta
-agctcaggatttggagaccagcctgggtaacatggtgaaaccttgtgtctactaaaatca
-gaacaaaattagctgaaggtggtggtgcatgcctctagtctcagctacttgcggggctga
-ggcaggaggatggctttagcctaggaggtggttgcagtgagctctgatcatgccactgct
-ctccagcctgggcgacagagcaaaaccctatcttaaaacaaaacaaacaaacaagcaaga
-aTGAGGTTGAGCTACATCAGATGCTGATCTGAAAAGATGTCCCTGTCATGCTTATGAGTA
-AAAAAAGAAACCAAGAGGCAGAACACTATATACAATGTGGATCCATTTGTGTGTAAGAAT
-GATCCAAATGATGTATTTTTATACAAAAACCGAGAAGATCAAACTATTAACAGTAGCGAT
-TTGCTTCAGGGGAGGGGGTTTCAATAGGGTGATGGTGATGGCGTTTTCTTTTTACATTAC
-CTATATTGAAATTGTTTGGATTTTAAAAGTAGAATGAGAGTGTATACAGGTATAATTAAT
-AGAATATTTAACAACTAGTATATAAACACTAGGAGTCCCTAACTGATGTCCTGGACCCcc
-agggatctgtgaatagaattcaaggaacctgtaaacttgcattaaaaaaaaaaggacatg
-cttttcccactagtctctaactgatattaacttttcctgtggtagtgagtatatgccaca
-ggctattacagtggtgatagcagggcctgcagctttgtcactagtagaaaccgcagatac
-tctaatatctcattgcagtgattgcggatatctacgacacattgtgtatactcacctcag
-cctcaaaattatggaaggtacttgacccaccactcagtcttgttattttgtgcattaata
-cagaaataatataggactatatcagaaacctgttttctgttatgttgacatttgcatctc
-aaggcaatttgtttcctttataaatctatgcatttaattttacatttcaaaaaaaaattt
-ttttttctgagagagggtcaccggatgccaaaggaccccaaggtacaggaaaggttaaga
-cccctgAAGGCCTGTCCCACACAAGGTTCCTCACTGGTGTccccagtaggctaccaactc
-tgagagtgcaaggactttgcctgccttCTGGGGCCTGGAAGACTGTCTGGATATTTgtag
-gctctgctgttgaccccaattatagatgggcaaatggaggttcaggctcagagtcacttc
-cctgaggtcacccatcaagttgcagatgctagattcctcctcatgtctactgatttggaa
-ggctgGGAGGTCAGGTCTTGTGGGTGTAAGAGGGTCAAGGCGGGGGCTGGGCGGGTGAAA
-GTGGTGCTTCCCTCACCCAGGGTACGACCCAGGCTTTAGCCTTGCAGCCAGTGAGCCCAG
-AGGATGGGGTGAACCCTGCTGCTGGCTTCTGCCTGTTGACCCAGTTCCTGGGTCTCTGCC
-CAGACTTGTTCCAGAACCAGACCCAAAGCACCAAGGTTTCTGTGAATGGGGGTGGCAtta
-aggaaacttacccttctagttggtcagacccagcctctcagagctgccctgctttccttt
-gtctctctcacatcctgcatccaatctgttgtctctaccctcgggcgcatgcagaatctg
-accacttctgcccaaccttgccacttccaccccagtcccagcccccattgtctctagcag
-ggatcaaagcttccttgatactgtcagcatctgtcattgctccctgggcccccaggctat
-gctccacacatagccagtgacgtcctggtcaacctgtcagattatgaccccctctgctct
-aaaccctgccttgggtcccgtgtggcttagagaggaccaggactccttgcagATTCCTTT
-AGTGAAGAACAAAATTCTTTGCTTTGGAAACAGGTAAAACAGTCCCCAGTGAACAGAGTC
-CAAACCAGGCTGTACTGGGATGGTGTGGGAATTGGGATGAAGCCTGTTCTAGGTCCTAGG
-CTGAACCAAAGCCCCATGGCTGGGGTGGTGCAGGGTGTGGAGATTTGAGCCCGGCCTGAC
-GGTAAAAGGAAACGGGCTTTAGCAGGGATGCCCCAGGGGTAGGAGCCCAGGCAGGGAGAC
-ATCTGGGGAGCAAAGACTTAGTGAGGGGGAGACCTAAATGATGCTCTCagggacctctca
-gctcccatcccctccatttcacagatgggaaaactgaggtcccaatcaggaaaataaagt
-gccagaggctgtacacaggagctaatggccagatctggTGCAGACGTATGAAAATCTGGA
-GGGTCAGATCTTACCTAGCTGTGTGTGTGTGTTTCAACTTAAATGTAAATCTTTGTAATT
-TTATTTTTCGAATGGGTGATATAAACACATTGTTCAAAATTCCAAGGAACAAAAAGGAGT
-GAAGTGAAAAACAAATTTTTCTGTCCCTGCCTCAACCCACAGTTCCCTCCCTACAGGCCA
-CTGAGGGAGGTTCCTGGGTTTCCTTCCAGAGAAACGCTATGCATACTTCTACATCTGCAG
-TAACTGTGTTTCCATCCCACCACCTGCCCTTCAGGCTACAAAAACCTCAGCTTGccattc
-cacacctggcttccttttgcttaacattgttcatagcatgttccacattcatccaggtag
-acttgcctcagcattgtaagctgcttgaaattccatctatgggcctccattgtttgctca
-tctagtcccctctagctgggcctgtaggatgtttccaggctttaacatcaaaaacagggc
-tgctacaaatatccttgtacacctgtcacttaacattcccacaagtctatgtggggaata
-aatcctctgaagtagaattgcttcaaagtagagtgaaatcacacgtttttttggtccttt
-gttttttgaggcagagtcttgctttatcacccaggctggagtgcaatggtgtgatcatgg
-ctcactgcagccttgaattcccaggctcaagcgatcttcccacctcagcctcccaagtat
-ctgggactataggcatgtgccaccaggcccagccaatttttcagtatttttttgtagaga
-ccagggtcttgctttgttgcctcaggctggtctcaaactcctgagctcgagtgatcctcc
-cacctcacctcagcctcccaaaacagttgtgattttgactatcgttaacaaactgccctt
-ggcagaggttatgccTAGTGGTTTCTGCCCCTTTGGAGGAGAGGCCCTAGGGTCTGCAGA
-GGTGGCCACAGGAGCCACAGAGTTGCTTATTGCACCCCCTCCCAATACGCATCCACACCT
-CCCAATCTCAGTAGCACCAAAGCATCTCCCACCAGCTtccttctgacttctaggtctccc
-tgaaaatgtcacctcctctgagaagcattccctgaccacccccactctactccacctgtt
-tatcacagtgtgcactctggcttctacacagtacttcatgccatctgaaatcactttagt
-catttgtcatttgtccaattcccccacgagaagagccccaggagtgcagaggtttgtctg
-ccctgttcatgagcacatcctctatgcctagaatagggctaggcatatgagaggtcctcg
-ataaatatttgtggaaagagcagatGGGTCAGTTTTGTGTAAGGGGCACGAGATTTCCAC
-TGAATAGTTGTTTGGCAGCTAGAAGCAAGTTAGGAGCCTCGAGCCCAGGCCCAGCCACTG
-CTGGAGCCTGTGAGAGGCAAAGGCAGTGGAGACCACAGAGACCAGAGAACAGAGAGCTAA
-CTGGTGCCAGGGCAGAAAGAAAGGGGAAGAAACACCAGCACAGAGATGGGAGGGGCAGGA
-AGGAGGGTTCCCAGGAGGGAGGCCCATGGCAAGGGAGGGAGTCAGCTTGGGGTATCTGCA
-GGAGGAATGTTCTAGAAATGAACAAGACATAGTCTTGGTGCTCATttccttcctccaacc
-aactcattcagatgtgccgagacctgggcatggtgctggggatagagcagctaccagaac
-aggccaggctctgcactGCTGCTGCGGTCTCCCAAGGAAGATATCTAAAGGGCtactctg
-tcccaggcatgaccccaaggccctacaaatacagctcatttagtccttggtgctcccatt
-gtcaccattttacagatgaggaaaggaaggcattgagaagatgagcatcttgcctaagtg
-gcaaagactggatttaaatataggcctttggtctccagagaccacacccttagccactCG
-GTGGGCTGCTtgtggcagctagccttcaggatgaccccagggatcctggtgctcatgccc
-ttgtgtagtcccctctctcaacaagtcaggactggctggcatgactaattagatattgta
-gaaacgttagtgtgacttccttggctaaaccattgcattgtgtcttctgtcttgccctct
-cttggaccacacgctttagaggaagtaggccactatggcctgaggacccttaagcagccc
-ttgggaggaagccatctggaggggaactgaggccttctactcacagccagcgccagctca
-ccagccacaggaggccgagccccagcccaggtcaagccttcagatgagtgcagccctagc
-tgatacctgagtgcaaccacatgaaaaaaaccccaagtcggaactaccttgttaagttgc
-ttcagaattcctgaccctcagaaactatgaaagataagaaatgtttgttgttattttaag
-ctgctaaatgttttagggtaatttgttatgccacaatagataactaatataCTGCTTTTC
-CAGAGCTTATAGAGGTTTAACCCTCTTGCTTCTCTTCTCTGCCATCCCCAGGCCTCAGTT
-TCCTCATTTTGACAATGGGCTGACTTGTGATTTATGAGGGTTGGCCCCTCCTCCTCTGCC
-TTGCTTCTGTCCCCTGGGCCTGCACCAGGCCCTCACCCTGTGGCTCAATGCAGACTGAAA
-TGGTTTGTCTTGTCCTGTCTGAGCAGCTGGGCCCAAGCCTTCCTCATTGTTTTCCTCTCT
-GCAAGACATACTATTGCTTTTCTTCTGGGTCAGGCTCTGGGCAAGCACAGCCAGTGGGCT
-GAGAGCCAGGGGTAGAGAGACTTGGGGACCAACGGGCTCTCACGGAGGGATGAGCTTCTC
-AACCCTAGCTCAACCCTCAATTCTTTGACACAGGCCCAGCGTCTCCAAACATCcagtgtg
-gtctgggcctggagcactgcactgagagtcagcaagcttgctcaatagctttgccatttc
-ctttctctgccagtgatgagtttctctgaacctcagtggcctcattgtttcctccttgca
-gagcgcctggaaggaatagggaaatggccactgggacctgtgttctgtggatctgggcta
-ggattcttgtctgtctggttcatgaggcctagcacagtgcctggcacacagtagtgcctc
-ccatatttgtggaatATTTGGGACTTCCCTGGCTCCTGAGCCTCACCTTTCATGGGGTGG
-CAGGTCCAGTGTTCATCCCAGGTGAAAGGCCACAAGGAGAAGATGAGGAGTGTGGCGGAA
-AGGGCTGCAGAGGGAGGGGAGCAGGGCCTGCCTCTGCCATCTGGACTTGGGAGGGGCTGC
-CAGGGTCCCTGCCTCCTCAGGCTCAGGTATGCCTTTGGTGGTCGTCTATATTTCAACCTT
-GATCTTGGGAGGTGTTTGCGATCGCTCACCTCCCTGACACTTGAAAGTCACAGAATGGAG
-AGGTGTGTCCATTTTGCTTGGcaacatgcttattgaacagttattatgtggtcagcactg
-ttctaaccactaggtatatgaagtccttgcagccaccctccaaggtaggacctgttatcg
-acctattttacagacgaggcacagagaggttaaacaacttgtccaaggacaggtagctct
-tcacaggtgtaaccaggCGGTGCTTCTGCAAGGCCTCTTGGCTAGAGTGATCATGTGACA
-GCGCCCCTGCCCACCCCCCAACCTCACCTCAACTTTGGGAAAATAGGGCAAAGTATGTTC
-TAGACACAGGGAGGCTTTGCTGGGGTATCTCCCCACGTGGCACCAGGCCTTTCTGCCTGT
-ACGACTCCAGTGTGTACCTCttctcttattggatccccagcagcctggaggaaaagggtg
-attgttccccacacaaatgagtaaactaaggcccacaaaggccgagcattactcacagct
-ggtaaaggaagaTTTTTAACTTAATGGCTGAGCTCTTTCTATGTGCCTGTCTTGCCTTCT
-TGGTGGCTGAGGCTGATCCTGCAGATGGGGTGACAGGGATAAGATTAGGGTCAGACAAAG
-ATGGTGGAAGCTGGCTCAGAGGTCCACAGTCTATCAGAGAATGATCCTCAGTGAGGACAG
-GACAGAAAAGTGGCCACATCTCTTCCCAGTCTCCATGGTCCTCCACGGAGAACAGGGTCA
-GGACCAGGGACATCTGtctggctcctggtgagcactccagtctcatcttggccatgctct
-cctcgctctctgcactgtagacacactgaatgccttttgcttttggcccattctaccccc
-agggcctttgcacttgctgtcccgtgtgcctggaatgcttttgcttcctttccctgtctc
-gccactgccaacccagcctttagatctcagctctgtccttcttcctagtgcctccctccc
-tcaaggtcaggcacccattatccacccctagcatctctcggtccctccttcatggcacat
-atcatgattgatcgttgcacatgggaaatcactaggttagttacacccactgctccaggg
-gcaagggggaaggatggtcttccttgctcactactaaatccttgtcacttgcatggcgcc
-tggcgcattgtaagccctcaataaacagtggtggaagggacaaTTAAATGAATGCAGGAA
-TGAATATTCTTACCTGACAAACTAAGTTCAGAGTTGTGTATACACATTTGTGTTTGTGTG
-TGGTGGGGGGCAGGAGTCGGGGGTTGCACATCTACACATAGTCCCAGAATTGAAAGGATG
-CATGATTTTTTCATGACATTTATGGCATGCTATGTATCTTGTTGCCTCTGGAGAGGAGAA
-ACAGGGGTCTCAGctgggtgtcaggaaccctgggttctgggccaactcctgccaccgacc
-cttgggtgaatgtgattgagtcactcccttgcccaggcttagtgttcccatctgtaaaTG
-GTGGGCACAGAGAGGTGGTCTgtgtagtggttaagactgtgggttctggagccagtctgc
-ccgggtacgaactcacctccctcacttcttagctgtgtaaactccctgggcctccgtttc
-cccgcaataaatggggatcataacagtccccaccttttaggatgccacgaggtttatgag
-tcaatgtttataagacacatataaagtgcctggcccagagaaagTCCCATATGTGAATTC
-ACCCCAGCAAAGCACTTATCCCAGAAGACAGAGGAaacaatagtagcatctcctggttct
-ctgtgctggagcagtgccaggcacatcccctgaccagccatttgagcctcacagcaaacc
-caggcgatgtgtgtatcatcacctcaattttatagattgaaaaactgaagctcaggtctt
-tctcatagttacacagctaataaTCTCACAGATGTAAAGTTGAGGGAACAAAAGGAAACT
-ATAGTAAGATATGGATGGTACGACAGGATTCCTTCCTTGCACCGTGAATCCTGGAGTCTT
-Gacgtttactgagcacttactctctgccaggccctgtactgagccccacatgtgcattgc
-ctcatttaatctcctcaataacctgcaaagtagcttctgttagtgtcctcacttcacaga
-taaggaaaccgagtcacagagtggaaaagcaatggtctgagaaggcacagccagtaagca
-gtggagctgggattcagactgagtcaactgggactcagggcctacactcGGCTTCTGTGG
-GATTTGCCCCCAGGCCCTGGGCCAAGAATGGGGTGTGTAATTGTGGGGACACCCAGACTG
-AGCTTCTGGAGCCCCTTAGCTTTTCAGAACGGCCACAGCTGCCTGAGGCCCTACCTGAAT
-CATCCCTGGCAGAAAAGCCCTAGGGAGCCTTGGGCCAAGGGTTCCTGGGGGAAGAAAAAT
-CTAGTAGCTATGGATCTCCCCTTTGGGGACCAGGGTCCTCTATATTTTCCAGGTCCCAGC
-TAATGCCCAGGGACCCATCCACCATGGACATGGCTTATTTATTGGACAGAAAACTGGCTT
-AAGTTCtgagataataggttccggcatcagatggctgaatctgactttgcccttcttggc
-tgtaagatcttgggcaagtcacctaatctcttggtgcctcagtttcctcatctgttagtg
-gacaagcaatcttacttcactgggtcatggtgagaattaaatgccgtaacataaagcacc
-taggacagtgtgtggcatacagtaaatgctcactaaatgagtgcttactcattACGTCAT
-AACTGCTTtttcatcctccactcattctgggaggcacgagtattttgagttccactttag
-agaggagccaattgatatatgtggcttccccgggttcccatagctttgagtggtacccct
-gggacttgacctcctgaccccaaCTTGGTCCTCCCCAGACCCCACAGCCAACTCTCAGGG
-TTCATTCCTGACATTTCAGAGCTGGCTCTGAGGTTATGCAAACAAACTGCGGCCAGAGTC
-TGACTGGAGGTGCAGGCTTAGGGGGCAGACCTGGGGCCCGTTTTCTAACATTTCCTGCCC
-AAGGAGAAGGAGAAGAAGGTCTGTGTACATCCCAGCCTGGCTGAGCTCTAAGGCCAGGGA
-GGAGAGAACTAGAAACATGTGGCCCTGCCCTCTGTGGGATGGCTGGCCAAGCCAGTTGAA
-CAAATAAACCCGTCCTTTTGGGGGAAGTCGTCAGGGGGTCTGCTGCTGCTGGTGCCTGCC
-CTGCACCCCCACCTCATCCCAGGCATGAGCCAGCTGGTCATCCCCAGGCCGAGGGTATCT
-GTGCCAGCTGTTTCCAGGCCCCCTTCTTGGAAAAATCATCCCATTCCTCTAAGAAGCAGA
-TGCTGTTTCCCCCATCCCCCAGTCCCAAACTGCTTAGAAAGGAGCCAGCAGTGAGGTTAG
-GAAATCAAACCCCAAGATATTTTGTTCGGCACCGAGACTCATTTCTTGTTTGGATAACTG
-AAGGCTGAAAATGCCAAGAATTTGTGGGCAGCCTGGGAAGGCTGGGGCAACTGGAACCCT
-GACTCCCAAACCAGGTCAGTTTGGGAGGGTCTCAGGCTGGGCAAGGACCCCACCCTGGGT
-TCCTCCTTGGTGCTCTCTTGACCCACACCCAGTTAGGCAGGGCCTCACAACTGCCAGGCC
-GAGGGGCCCAGTTATTCTGAGGTTTGATGTCAGAGACCTGGAGCAAACAGCAGAGGCTGG
-GGCAGTGCCAGGTTGGGAGGCCCCTGCCCAGCCCCTGACCCCTCTCTGCTTGGCTTTGGG
-TGCAGAGGAGGAAGAGAAAGAGGCCTCGGCTGAGCAGCCAGCTGCAGGGTGGGCATTGGT
-CATTTGGCAGATGTGCCCTGGGTCTTCAGTGTGGACACTCGGGGAGGTAGAGGTGGGAGG
-GATGGCCTTGGGGTGAGAAAAGGAGGAGCTGAGAAAGAGACAGGAAAAGATGCAGGGAGT
-CACTTTGATAGCCAACCAGGAGAGAGAATCAGAGACAGAGACACCCACAGAGTTAGCAAC
-AGTGAGTCAGGGCCACCGCGAGAGCCCCAGGAGAGATCCACAGAGGCAGAGAGACTCAGA
-AATAGAGACAGgctgaccacagtggctcgtgtccgccgtcccagctacttggaagactga
-ggcgggaggatcgcttgagctcaggagttcaaggctgcagtgagctgtgattgcaccatt
-gcaccccagtgtggttgagagagtcagaccttgtctttaggagagagacagagagaggga
-gagagggacagagagagggagagagagacagagagagggagaaagagacagagacagaca
-gagatagacagggagataggcagagagagGGCTGCCATGGACCCCAGGCCAGCAGCTGCT
-GGCTGCTCCCTAAAGGTGAGAAAGTAGTTCTCACCTGCAGTTTCCAGGTGGGGTCAGCCC
-TGCCTCTGGGAGCTCAGAGACTGGGGAAGATGTGCTGCCCTCAGGTGGTGGGGGTGGGCC
-AGAGAGGCTGGGGCTTGTGTCTGGCCCTGGTTTTcctcattctcctcatctgtataatgg
-atcattctgtggggccatgaagagaaggCAGAGTATGGCACTTCTTGGATGGGACACCTG
-GGGCAACTGGGGGAATGGCAGTCACACACGGGAGCCCttattgagcacctgctgtgtgca
-gaggctttctctgctctgcttctcttgaccccacatcaaaggtcaggggtaggtgctgtc
-attctcctcccagcctccggattaggcactgagAGGGAAGGGCCAGCACTGGGTCCTAGA
-GGGAGGGCATGGTGGACAGAGGAGGTCATGTGACTAGCCACTGAGCTGCCCAGCCCAGCT
-AGAGATGCCTGCACTGCAGCCGGCTCTGTCCCCCAACCTCCTCAATATTCCTGCCTGCAG
-CTTCTCATCCATATGAGCGGGGTGGAGCAGAGCCCAGAGCTGACGTGCAGCCCCAGGAGC
-TGGCTCCAGATGGGAGTTACTGGGGCAGGGGCTTTCCaggagcgaggaggaggagagaga
-gggaggcagaaggagggggagagcagggagaagaaagggaaggggagtgcaggggaggag
-gagagtatgaaagaggagagagagagaagaggtgaggCCGGGGCTCTCCCCATGCCTGAT
-GAGCACTGGCAGTAGGACACAGCAAGCTGTATGCTAGGAAAGAGTGCGTATCTGGGGACT
-TGGAAACTCTGCAGTAGAAGGGAGCACCAAGAGCATCCCATCCTCTCTAGATCTTGCTTC
-CCTTGCCTCCTTGACACCTTCCAgagtcaggaaaaagtacctgcagtttgtagtgagaat
-ccagattggctttcactgctacatggctctggcaagtcactttccctctctggcctgttt
-cctcacctgtacactgggggaacaggaGGGGAGTTGGGGGCACAGGCTGAGCAGATGATG
-GCTTCTGGGATTCGCGACAGGAAGGATCTCCCCTGTGTCTGTCTAGATGAACAGAATCTT
-GCTGAGAGCTTGTTCATCCCTAATGGCAatggtgatgatggtgatgatgatgctgatggt
-gCCATTAGATGAGTATTTTAAAACTCTTTTTTTAACTTTTCTGAGATGTTAGAGAAAAAG
-CCAAAAAAAGGCTTTGAGTTTCAGAAGATCTGAGATATGCCTGGACCAAGAGAAGAACCA
-GAGGAAGGTCACAGCCACAGCCACAGAAGGTAGCAAGCACTCCCCACTGGGGACCAGGAG
-TGTCAGAGGGGGCAGAGAGAAATTATTGTTTACATGAACCAAGGGAGACCGAAACCTGCT
-CATCTGTAGCCATTTGGTAAGGAAGTACCTGCAGCCAGGTCAGCTGAACTCCCATATCAG
-AGATCTTAGGCCCTACGGCACTCTACGGTGACCTGACTGACCCTAGCTCAGAATTTTCAG
-GCTAGGTGAATGGATGCCTGGAGAGGACATTCCACCCCAAGCTGAGGCACTGGACCAGGT
-GACCTTCTGATCCTGCAAGCCATCAGTTCAAGCCATCAGCTCTCAGCCAATGTTTCCCAA
-GCATCCGACACCCAGGGGATTCAAAGATGGATGAGAGTGAGAGGTGAGACTTGGGGTAGG
-AGGCCCAGTGGGAGGTGATGACAGCATCCTGGGAAAGATGACGAGGCCTAAGCCAGAAAG
-ATGGACCATGAGAGAAGCCTAGGCCACAGGATGGGCTGGGCCAGCTGCCTGGGGGATAGG
-TGGGAGCCACAGGAAGCCCCCAGGGCACAGCCTGTGGCTGGGTGGTGGTGTCACCCTAAA
-CAGAGACAGACAGGCAGGAGGAGGGTGTTTGGAGAAGAGCAGGGAGTCGTCTCAGGCAGC
-TTTGGAGTTGAGACACCCATGGACCCTCAGGGAGGTGTTGGGGGAGATCCAGGTCATGGG
-TTTTGGGCTCAGGATCCCATCAATGCCAATTTTGTGTCATCACGGAGCAGGATGGAGACC
-TGGGACCTGAGAGATTGGAAGGACATTTATGCATTCATGCattcactcatgctacagaca
-tttattgagtacctactgtgtgttcggcactattctaggccctgggaacccagaagtgag
-caaaagagacatggcgcctgccctctgggagctcacacaccaaaagaaatgtttttaaga
-acattaggtagggataagttctaagaaaaaaaaacacaacaaagccagcagagggacaaa
-gggtggaagaggaaggtggttatttcgtacggggaggacaaggagggcctctggggagat
-ggcgctggagaggataggaggctggggtaagcaaagtgggagtctgggagagggaactcc
-agggagtaagggttcttgcttttattcggatgcatggttagccctgggaggagggagagg
-atgtaacttaggttttgatggggattctttggtctgctgcatggagaacaggaggtgggg
-gccgagtgttagcagggagccaggggggcagccaggacagctatcctgcctggagccaga
-ggtggttGTCAAGCTTGTCTGCTGTTTAATACCTTCTAAAACTCCAGGAATTAGTTCGCA
-TCCTTCATTCCTCAGTCATCGCCCAGACTGTCTCCTGGGTCCCTCTCCCTTTCCTTGGTA
-GCTCTCACTTAGGGACTCTGAAGAGTCCCATCTCAGACCCCCCAGGATGTCTCCTGTACC
-CTCATGCCCCGCCAGGGCCAAGCCTGCTTTGCACACCTCTGTAGTCAGTGCTTCTCCGAG
-GGTACACAATAGGTGCTCACACTGCTGAAAGACGAAAGCATGACAGGGCATTCTACAGCA
-GCCCTGGTcttgggccaaaaccacagtggcatcctcagctccttgcttcctcccactccg
-catccaattcaccagcagagctgatgggctctacctccagaacccaccagaatcttactg
-gccacaccccctcctagccccgttctgctccaggcctccggtaccttgcacctgatggct
-gcagcggccacctctttgggcttcttccttccaccctgcctcctacagtctatgctgttg
-aaatcgaatcacgggtgtctgtctctgctcacaaccttgcagtggctcccatgacactca
-gaacaaaagctgaagtccttccagtggccccccccccagctgcatggcctgccctgctgt
-cacctctcagacctccccgcacccttgctccctctcctctgctccagctacacaggcctt
-cgccccatggttctccaggcacacaccgctgcggatgcattccctcctcacggtcaaaat
-acatgcagctccctttgcagaacgttccctcaaatacctgcctggcccactctatcattt
-cccttgttctctgggttcaaatgtcacctcctctgagaagtactctctaatgatctgacc
-tcaagcagccacccagggccgccacttgccctctttcttcttcattttgcttcaccatct
-gacatagtagattatctcttactgcctctttcccctactagtccagagggagacatacta
-tactgtcgtatccccagcacccaggaaggcttggtccgttcagcccttggtcagggctga
-atggatttctgttggatgaatgaaGGGACGGCAGTTAAAGAGCCAGGTTGCCAGCTGACA
-TTGCCCAATCTTGCTGTGTGGCCTCAGACCCACCCCTGCCCCTCTTTGTGCAGCTCAGAG
-ACAGCCCTCTGTGCTCAGGGAAGGCCTCTTGGATGGACACTCCACCTGCTGATTGTGACA
-GACCCCAAAGCCGCCCTCTGCCCCCTGCAAACCTCCCATGCCCCGTACCTTCTTCAGCCA
-CTGCGTGTTGTTCTGCAGTGCCTGCTCCAGCTGTTTCACCTGCTGGGTGGGCAACTTCCC
-CAGGTGCAGTGGGTTGGCCAGTGATTCTCTCTGGAGGGTGTTGGAGTCCCTGGAGACCTC
-AGGCCCCGGAGGGCAGGGCTCAGACTTGGGCAGCAAGAAGGTGTAGCTACAGTGGCCGTG
-CTGGACTACAAGTGTCTCGCAGCCCCTATCCGCCTCCTGCCTTGTCTGTTGAGCCACAGA
-CATGGTGGCAACCACAAGGAGGAGGCTGCCCTGCAGCATGGCTAGCTGGGAGAGCATCTG
-AAGATGTGTCAATGGCGAGGGATGTCTGCTCAGAGCCCTAGGGGCTGTGCCTGGGATGTC
-CTGCTGCAGCCAACAGTGGCCAGGCTTGCCTGCAGCTGCAGCTACAAACCTCTGTCTGGC
-CGAGCTCTGTCCAGGCAGCTATTTATACTTGCTCTGAATACCACGGCTGCTCTGCTTGCT
-TCCTCTCACCGCCTCCCTCCGGCCCCACCCGACACCCTCTCACCTCTATTCTTCACTCCT
-TCCCTTCCTCCTTCCTCAGTCTTGGTGGCACGTCGCCCTTACCCTAAGCGTGCACCAACC
-TTGCTCTGTCTGCCTCACCTCTGAGCCCTCTGATTATCCAGTGAGGCCTGGCTTCCCTGC
-TGGAGGGGAGGGAAGAAAACAGcacacagacacgcgcacacactcatgcacacactcacg
-agcacacactcacacgcacgctgacacgcacacacattcatgtacacacaAACGCCAAGC
-TCCAATGCTGCCCGCTTTGGAAAACCAAATGCAACTTAACTCTCCCTTCCTGTCTCTGTC
-TTGGTCTCCCTCTTTCCCTCCACCCCCATCCCCTGCCCCCCAAGTCTAAGATCTCAAGTT
-TCAGTCCCGCTGCCATCCCCTTCTCTCCCCGCTGCACCTTCCTCCCTCTGGTTCCATGTT
-AGCGCTTGGAGTACAAGTGACCCCCGGAGAGAGCAGAGGGAGGGGAGGAGGCAGAGGGGT
-GAGGCTGGGGAGGGCCCAGCGAATCCACTTTGCCTCTGGAGACACAGAAAATCCTTCCAA
-GGTGGGGCAAGTGAGCAACCCAGCTGGGAGTTGCTTCCTGTCCTCTCTTCTCCCTCAGGG
-CCAGGGGAAAGTGGTATGCCCCAGGATGGCCCTGGCTTGGTTGCTTGTAACAGTAATGAG
-AAGTTGTCATGTCCTGGGGCAGATTGTCCTGGGGCTGCTGGAGTGGGGATGTGGAGAGGA
-Ggcagtggggagaggaggttggagtgccaggaggctaaccctagatctcgctccccgaca
-gctggccacgagacctagggtgggcagctgtgcctctctgggcctccacaccctgatctg
-taaactgggtaaaccttatctcttgcaggAGGAATGCGTGTGAGTCCTCAGCATGGGGAT
-GGAGAAGTTTTCAGCTTctgggttcaaatcctggctctaccatctaccagctgtatgact
-ttgagtaagtcacttaacctctctgtgccttcatttcctcctgaatgaggaaaataatac
-cacctacttcacatggcatgaaaattaggtgagttagagcaaggttggcacagagcgagc
-actaaataaatattTTCCGTTGTCAATgttatagttgtcattgcacctcccctcccacga
-cccactggagcataaactcctctagggcagggatttgtcCCTGGGGGACATGGTCTCCAG
-GCAGAAGGTGCCCAGGAGTTGGTGGGGCCTTTCCTGCATGGGCTGCCTTTATGTTCTGCC
-AGCTGTTTGGGCTTTTCCTCTCTCCCTGCTTGTTTCCTCAGAGTAGGGGCCAGTCTGGCT
-GTTTAGTATTTTCCTTTTTGTTCTCTCAAATCCCGATAGAGTTTTGAATTGGGGCAGGCT
-GCTTCTGGGCAGCTGTGAACTGTGGTCTCATCTGGGGACTGAGAACATTATACCAGGTGT
-GGGGCTTTTGCAGGCAAAGGAAAAGCAGCTGGTTATCAGCCTCCAGCCTCCCCTGAGCCT
-TCCCACATGCTCTGAGCTCTGCGTGCCCCGCTTGGCCCCAGTTGCCTCAGCTGTAAATGG
-GGTCATAGCACCCTGACCATGTGAGAGTAATGTGGACTGATAGCTTATCACAGCTCTGGG
-TGCAGAGAAGGGCAGTGTGAATGGTGGTCGTCATTATGATTGTCTTGACTGAGCTGCTTG
-ATAATCCCAACGAGgcagttacaccaggccccaagcttagatgggccccatgcttggttt
-acactctgccagcactgtcttgaaattcttaatacatttggaacaaagtactcagcactt
-gcattcttcattgagttccacaaattaggtagcaggccctgCCTGGGAAACATGAGGCTT
-CCCTCATCCCTCACTCTGCTCCTGACCTTACCATCCAATCAGACCTGTTCTTCCAACATG
-ATCCTTTAGATATTTCCCCCTCTGTCACCTCTTCACTACTCAGAATGCtggagccagcac
-atctggatcggaatcttggctttcctgaccccctatttgtgtgccttttgccaagttgcc
-taacctgtctctcagtttcctcttctgtcaaaatagtgatgttacagtggctaaaagacc
-gattcctgcagtgaggttaacacagagcctttcacataatacatgctcaaccagtgacag
-ctgtcatcattACTCCCtgctatgatatgaatgtttgtgtgcccccaaattgatctattg
-aaacttagtcaacaaggtgatggtattagaaggtggggcctttgggagtgaatagctcgt
-gaggactctgccttgggaatgagattaacgctcctatcaaacatgtcctagacagctggc
-cttcccttttgctaggtgacgttgcagtaagaaagcaccgtctatgaagcagggagctct
-caccagacaccagatcggctggtgccttgatcttggaattcccagcctccagaactgtga
-gaaataagtttctgttgtttataagccccccagcttagtgcattttgttatagcaacctg
-aatgggctaagacaCCCCACCATCACTCTCTTAGACCGGGGTGCTTCCTCTCTTGTAGGG
-AGAACAACAGCCTCAGAAGTGAACTCTGGTTAATTGGCCTTTGCTATTGCAACCAGAGTG
-Accttccttccttccttccttccttttttctttctttctttccttcttctctttctttct
-ttctttctccttttttttgacagagtcttgctctgttgtccaggctatagtgcagtggca
-tgatcttggctcactgcaacctccatctccccggttcgcgtgattctcctgcctcagctt
-ccccagtagctgggattacaggcatacgccaccatgcccaactaatttttgtatttttag
-tagagacggtgtttcactatgttgcccaggctggtctcaaactcctgacctcaggtgatc
-cacgcacctcggcctcccaaagttctaggattgcaggtgtgagtcaccatgcccagccca
-gagtgatttttctaagacacaatccagccctgacttctttgtttaaaattcttcagtttt
-gaactccaactctttctgtggtttacaagcccctgccggatgtggcctccattctcatca
-ctgtttccctggcactttataccttatcattTGGAATTGGTTTTACTCCCCCGCATGCTT
-TCCGCCTTCTGAGGCCTCAGTGTCTATGCTCCTAGCAGGAAACTtctgcttaaaaacttc
-cccccacctgtattgtcccagcttcgttctgcctgtcttttgatcttatctcagggatca
-cctcctctgggaaggctttctgcatctgtccctcccacttcaatgggagtaggccttctg
-cctctgggagctcaaaggcccctgcctgcctgtccctcaccaaagcactcatcctgcatt
-agaaaggcttgtttgcaggccttggtcaccgtctagactgaacactcttctaggtttgct
-gtcacactttccatttctgtgtttgttgcctgtcctaaggttaggctcacagtgggtcct
-catgagtgttatgttgaatgaatAGGAGCTGCAGGCCCAAAGCAGAGAGGAAGGCAGTCC
-CCTTTCCTCTCCAGCAGGGGCAGCAGGAAGTTCTGTGTGAGTTGTTCTGAGTGTCTGGCC
-TCCAAATCCTAAAAACAAACCAACCCATGTTGATTTTCCCATTGTCTGCTGCTACCATGG
-AGGTAGAGAACGGAGAATAAACTTATATCCACCTGGATACTTTGGCTTTTGTtcaaatag
-cttgggtaaaaagggaatttattggccaatttaactgaaaattttaggggtatcgagctt
-caggcatggctggatccaggtgctcaaatgatattagattttttttttttcctccaactc
-caggctcttattttccttcatttccttattttcctttgggttcattctgtaagagttccc
-accataatcaccaccactactggcaacagcagctccaatctatcaactcagtaacctctt
-ttaagagtgcctctttcctaatagttcttggaaaagttccagcttgagccgtacagtcat
-tcctgaaccaactattatagccagaggaaggagctactgtggatggtcaggctggatcct
-gtgtccaggcctggagccttggagcaggtcaacctcacaggatcggaagggactaagggt
-ggggtacagtgacgctcaagaaaacctggagtagaatgatcaggaggcgggtggagttgt
-tgggcaTAAAGCACCTGCCTGCCTGCACCCTGACTCTCCATCCCGCCACCCACCAAGTGA
-ACCCACCTCCCGCtcagagctgatggactcttggagtaactagagatgccatggaccctt
-accttgcatttcactcatgaggaaactgatactcagagagggaggccacttgcccagtgt
-tacaTGCTGGAATCTATTTTCCTGGAAGAACAGAACTTCCTGCTCCTAGGAGTGAAGGGT
-GGGAAAACAGGGTCATTCCGGGAGGACCACTTGCCAATTTGGGGTCCTGAAGTACCTGGA
-TCCAAAAGAAGAAGACTGTCCCCAGTCTGAATCTCCCACTCTGGGGAGAGGGTCACTCCT
-GGGTTGTTCCCACAATCCAGCCCTTCTGCCAGCCCCTCCCTTGGCAACTCCTTGCATTTC
-AACACCCTGGATGATCATTGAGGGTTGCACGTGGGGCAGCTGAAACAGACCCCAGGCCTC
-TGGTCCTGTGCTGCTCATGCCCCTGAGGACACTGCCTGGGCATCTCCCAGAGCTACTGAT
-GGCAACATGGCAAGAGCCTGGTGGGAAGCTGTGGGGCCATCGACAACCCCGGGGGATGGT
-CTGTGTGTCCTCAGAAGGTCTGGTGGTGAATCTTGTGCAGCAGACATCATGGTGGCCCCG
-TGAGCCTTTCCACCCAAGACAGAAGTCGGTTGACTGCCCTCCTCCACTTTCTACCAACCC
-AGACCTAGAGCCAAACAGAATTCCTGGATCACAAGGGGCCTAGGGTGGGTTTTGAGGTCA
-CCCTGTGACCCAGGCCCAGCTGTTAAGAGCCCCACATTCCTGATGCTCAATCTTGACTTC
-CCTTCAGTAGAtgagactcagtttcctcatctataacatggagaaaataatccctcactg
-ggaaggcggtggtgGTGGGGTCttccagttactgatactgtgtaacaaagtatccccaca
-tctagtggtttaaagcagtggcaacatctactttactcacaaatctgcaattgtggccag
-gttccctgggaaaagctcaactgtgctccattccgtgtcagctggagcaacttgcaggct
-ggggtttgcatccaaaactcatccactcacatatctgaaacctcagctggggcactcagc
-aaggacaactgcatatggcctcttcatgtggctaggggcttcctcatggcatggtggctg
-cttcccagagcaagcatctcaggagagagatttgggcagaaggtaggtgatctttatgac
-ctagcctcatggatcatgcagggccaagtcctctgtatctagtcaaagaagcaaccacaa
-agtcccactcaagttccaggggaggaagaacagactctacctcttgatgaggaggatcaa
-ggtttcagaagaaggtataggatgggggatagtgttgtggccatttttatttatttattt
-tgtttatttttaaatttttatttatttatttatttttgagaaagagtctccctctgttgc
-ccaggctggagggcagtggtgtgatctcagctcactctaacctctgcctcccgggttcaa
-gcaatgcccgtgcctcagcctcccaagtagttgggattacaggcacatgccaccaagtct
-ggctaatttttgtatttttagtagagacagggtttcaccgcattggccaggctggtctcg
-aactcctgacctcaagtgatccacctgcctcggcctcccaaagtgctggggttacaggta
-tgagccatagtgaccggccTGTTATGGCCATTTTTAGAAAATACAACTGGCCATGGGAGG
-GTCGGATGAGAAAATGCCATTTAAGTGTTTAGCATGTAAGTGCTTGATAGTTGGTAGCTG
-TTATTATTATCTTTGCGATTATTGGAAAGACCCAGCATCTCTTTGCATAAAAATATCCTT
-CAGAACCTGTGAGAGCTAAAGGTGCAGGAGGAAGCAGGATAATTTCCATCAGGGCTGCTG
-GAGAAATTGGCCCAGAAACCCACTGGATTTGTCCCAAGTCACCCAGTGTATCAGCAGCAC
-CCAGTCTGAGCAAGACTGGCCTGGGACATAGCTGCTTCTTCTGTTAGTAACGCTGTTACT
-ACTTCCTGGGGTATCTTCCTTGGCCTCAGCTTCCTCTCTGAACCATGAGAGCATCCTGGC
-TCTGCCTCCTCAGAGGCTGAGGGGATAAGGGCGGAGGACATGCATTCTCTTGGCTGTGCC
-CAGTCTGGGCCACCAGCCATGCCTGTTCTTTCTCAGGCCTGGGGAGCTCGGTTGCCTCTG
-AACCCACATCTGGCACTCCCTCCAGGATATGAAGAATAAGCCTGCCAGGTCAGAGGGCAG
-ATCTATTTTGGAACCTGGGACCCCATAAAGACCCAGAGGACCCTGTGACCGAGAAAACCA
-ACAGGCCCCTCTGTGttttgttttcattaaacaagcacaacatgtccctcatagaaaagc
-cagaaaatacatattggcaagaaagcgaaaataaatgttgcctgtgctctcaccagccag
-aggcaaaaaccatagctaacattttggagttttttccccccaaataattttcctctgcat
-atagatgcatattttttttggtagattttctagcaaaAAAAAAAAAAAATCAACAAACAA
-AGGAATATTGTCTCAACAATTTTTTAATTTTCTTTTACTTACTTTGGATTTTTCTTCTGG
-AAAAAAATTTAGAgccaggcacggtggctcatgcttggaatcccagcactttgggaggcc
-gaggtgggaggatcgcttgagctcaggagttcgagaccattctggccaacatggcaaaac
-cctgtctcttaaaaaaaaaaTACTGAAATCTCCAGACTTCCAATTGGAATTTATGTTggc
-cgggtgtggtggctcatgtctgtaatcccagcactttgggaggccgaggcaggtggatct
-attgaagccaggagttcaagaccagcctggccaacatggtgcaaccctatctctactaaa
-aatacaaaattagccaggcttggtggtacacgcctataatcccagcgactcagaagactg
-agacacgagaaatgcttgagcccaggaggcggaggttgcagtgagccgagatcatgccat
-tgcactccagcctgggagacagagggaaactatttctcaaaaaaaaaaaaaaaaaaaTCA
-GACAAGTGCACAGGATAACAAAATACACCCCCATATAGTCATCACTCCAAGTGGGCCCAT
-GTTAACATTTTGCATATTTGTCTTCGATTGTTAAAACAATGAAATATTACAGGAAATGTC
-AGTATTCCTTATAACTCCTTCTTGGTCTCATTTTCTCTCCCACCCTGCCCataggttcat
-atctaggtatataaataatgtataatatttttgtgttctcaaaacttaagtatatgctgt
-tatactgaatgcgacgtcctgcttatattatattttccagattgatataaatgacacata
-tagatcttgtgaccaaggacattttcttttcactgctgtgcagcattgcattatgtaatt
-tttaactctttatccagtttttggcagatggatatttaaattaattcagttatcttgtta
-ttcctgacaatactgctattaccatcttatatgggaatacttgtgcttacaagcaagggc
-tcctctggggaactaatccaggcatgctcctcctgggtcgtggaatatatgtgctgccag
-cctgaggcagttgccaaattgtgctccaagtctctctgtcgagttaattccagtagggtg
-ccggggtctccatcgctccgcacccctgccatcccttgagatggtcatgctttacctttg
-ttccaatctgatggctgtgaaatcgtacatgtaattacatagcctgctttccctacttaa
-tagtatattacggaactattttcctgtgcagaatattgttctatatgtgggtgtttcaag
-gtggcataagctgaaagcctccattggggtgttgctgggattttcttaaccaattcccta
-ttgttggacaacagggtttgtttTtgtggtaggattgcaaaactgaccacagatgctacc
-cacccctataagcatgctcctttgcagtgtgactctgcagttctccctattaagaggcaa
-agttcacttctccactcccttaatgctgacttgggccatgtgacttgctttggccaatgg
-gacattttcaagcagaggcttgaaaagggcttgtgctctggggcttgctctcttgctgca
-cctggggccctgagaccaccatgtgaatgagtcctggctagcctgagggatgatgagaca
-cacttggccaagtcatcctgtcatcccagctgatactaaaccatccaccagatttgtgag
-tgaggccatcctagaccatctatctagcccagccaaactggtgcggaccagaagcaaagt
-ccagttggcctgcagagatgtgaaaaataaatgttttaagccactaaattttagaggtgg
-tctgttagacagcaagcctgatacaGTTCCACCCAGCATTTtctttgctcaaccagttac
-tggctgggaaccttgggcaagttgctgagccttagttttctcctcagtacaatgggggat
-tacatacgcactcctcaaagtcgttgtgaagattggatgagatggcacctgtCAGTATCA
-CATGGCGGGGACCCCATAACCAGGGGTTCCTCTTTCACATCACGGTGGTCTTAGATGTGA
-CCTGTGACCTTTCTTATTGCTTCTTGGTTCTCCCTGCTGCCTCTTTCTCAAAAATGTACT
-CATCCTTCCAAGTTTTCTGGAGAGTATCAACATGTAAGTGTAAATCACAATCCCTAGTGC
-TCTCCAAGACTTGCAGGTATCTCCTCCTTCCAGGGCCTTCCCTCTTGAAATTAGGCATAG
-Tggctgtgtgcagtggctcatgcctgtaatacaagcactttgggaggccgaagcaggccg
-atcccatgaggccaggagttggagatcagcctggccaacagggcgaaactttgtctctac
-taaaaatacaaaaattcaccgagcgtggtggtgcatgcctgtaatcccagctactcagga
-ggcggaggcatgagaatcgcttgagtctgggaggcggaggtttcagtgagccaagatggc
-accactgcactccacactccagcaagacccggtctcaaaaaaaaaaaaaaagtaaggaaa
-agaaaaAGAAAAGaaaaggagtctccatccagaccccaagagagggtttcgtggatcttg
-cacaggaaagaattcaaggtgagttgcagagtgcactgagaagagatagtttattgaaag
-ctactcagttacagagaaggatgtcctcagaaagcaagaggaagaacgcactgtctttgt
-tttaaactcttctaatgtaggagtcttatctaagtaaaagctaagttatgtctttgtgca
-gacagaccgacagtgtgacagaatccattaccgttgacttaaagaaagttatccttggca
-ttttagtaagtacatcagatcacgacagtaattgttttgaaagcataaattgttatgtga
-tattggaacatctgggcattttgctgtcgtaagagtttactcttgcaggcattattgagc
-agcttccttagccataaacatcttatgactgtgggctgtgattagcaaggaatgtgtctt
-gctagttttaagatagagttgattttaaaatggtgtcaccctagctctcctatgctcctg
-tttcccaaacaTAAtcccccctctacttaagagagaaccctaaatcttaaggggagatga
-aaggtgaaggtcatttttctgtaacttattcctgctgacagtggACGTTGTTGACCTTTG
-GGAGAGAGTTCTCTCATAAGAGTTTGCAGAGAGCCTTGTAGGGAGCCGGGGAAACTCTTC
-ACTTGAATGACATCCCGATGATTTGGTTTAGTAAGTGTAGGGGCAGATAAGCTGCCAGAC
-TATTttatctccgtaatcccatgcaataagtgcaacagaagtaaaaagcacaataaccaa
-tagcaataagtgtgacaacacgaagcatgctaaaaaggaatgccttccaagtgctgggga
-gctggccaaactgtgctgttatgacaggaagtcaattgctgaggtatgagtctctaggga
-gttcatggcctgagatatattatgagagtgaccaggaatatagacacagtgttcagtctt
-gatcaatgcacagattttcccagggctgctgttaatatgtttaaagccatatggctttgt
-aaggacatttgtcttattcgggacgtttcttctgtcagacgggtgatcaccagatgagtg
-ttgttgaaagccacagcagtatgttttgctagggctcccacctgcgattcaacgtctata
-gatgttgcttaaagacagaatatgggcacaggatataaccaccaaaaagtttgtttctgt
-tgcctatcacagaccttgactacttcccagttggtggagagggaatccagatgtgtaagg
-atacatcctagaaggtagggatgaccccaagtgcatcatccagtcaaattgtaaggtgag
-tatggccaactatgagacccacatgcccataaccattcccaaggggaaggatagtcacct
-aaccatagagattcattttgccatcccatccacatttggtcaattgaaaggagagtctga
-ttgcattgttggggtggcagccatccgatactatagatgttggtttgggggtggttactg
-ttgatgaaaagagtcgaactctgtaaaatatttgaagagacttattctgagccaaatatg
-agtgaccatggcctgtgacacagccgtcaggaggtcctgagaacatgtgcccaaggtggt
-tggggcacagcttgattttatacattttagggaggcatgagacatcaatcaaatacattt
-aagaagtacattgatttagttcagaaaggcgggacaactcaaagcggtggggggaaggag
-aggcttccaggctataggtgaacttaaacattttctggttgacaattggttgagtttgtc
-taaagacctacgatcaatagaaaggaaatgtttaggttaagataaaagattgtggagacc
-aaggttcttttgaagtctcatagtagctgccctcagggacaatagatgacaaatatttcc
-tatttagacctttaaaaaggtgctagactcttacttaacctcttcaggattgggagggcc
-tggaagaaaaagatgtagctatgttaatagagattctttacagatgcacatttgtcccca
-caaaggacagctttgcaagaccatttcaaaatatagcaaagaaacatgttttcgggtaaa
-atattttaattttcttccttgtctcataacattatgccagggtcaggtcggaaagtaagt
-cacaatatgtagggttaaataaaacccatctgaggagaatttatggtttgtagggcatga
-ctcccagaccccttagataggaatttggacaagaaaaaaaaaaatcagagcctagtcctc
-ataaccattatgccttccaaggcataagggtactttgcctgataactgaatttggatacc
-tgtcaaccaactgagtccatcatgtatggtatagcctaaggtagggatgctattaagtta
-tttGGGATTAAATGAAGAAGGAATTTCTTGGTTTCGGTGGAGGAAGGGAAGAAAGAGTGG
-TGTGTGTCCTTTTGGAAAAAGGAGAGTACATATTTTCTGTACTCAAATTAGCTGATTGGA
-TATGCCAAGGTAAGCCCGAGGTTGACAAAGTTTGTACCCATTCTGCAAACAGATATCCTC
-CAACTCTATAATAGAGCAAGCTCAACATTAAAACCAGTGGTCTTATTTTCAGAGCATCAC
-TTATCCACTGGATAgctttttctggaagagaagccgtagatccactattggctcacagga
-gtattctggaatggtgatccctgcaccagatgcctgtgggacttcatgagagacaggttt
-aacttgggataaatgtacccaaatatgtaatcccttaagtttaactgtagtaggagtgcc
-tggaagtacatggtagggctctttctattttggggaaagctgatctgcaggggatccctc
-cttccaaggtttcaatagcatgaaatctcctggTCAAacaggagagaatatttatgaaga
-tggtcctgacacatgtatactgaacaaacatgcatgtaacatatgactctgttcacctta
-aggtggagacttaatccttgccaggcatggtcttagatcctgtttataatttgaaatctt
-cttgctataaagtttctattctatcagtcttatgatctctgttttaatgttaatgctggt
-tggttgtgcccgaattccaagagggagaattgtacagcaaggtgtgtttgaccccccagt
-ccctcttcccatcatggccagaaccagttgttcaggatttttaaaaaattattatttcct
-tttgccaagagagaggtccattctgttgggtggcttaggatatttgtttatttattagtt
-taGTTTATGGTATcccattttgtcgaggtgccagaggcagtattgaaggctaagctttta
-ttgtgtcccatatcaatgctggggtggtgtcctacttgccctggtccattacctcccttg
-gtggaacacttatggtcaaggaacttagagtcaaaagacttatagccaatcaaatgttct
-aggccagatgggaatggaggtgagcaggcactcattaaccttaaagcctctttaagcaac
-ataagagccaaaaatcaaaagccagaaggcaaggtataaaattggcttatttagaaattc
-tatgcaagagctactataatcttggtttgtggcaattagctatacaaactcaagaattat
-gtttagctatttagggatctgtgtgcctgtccttgatttggagtgtcagaattaatttta
-ttcctcaaaactggcccttacaatctcatgtgatagtccctgggcatggaggaattgaat
-agtttcaAATTTTGGAGGTAAAACAAAACATAAGGCATTAACAACATTTTAAACAAAAGG
-TCATAAGCCCTGCCTAGTTTTGAGAGTGACAGGAAAGGAAGTTCACAGGTAGCTAAACAT
-TTAAATTATTTAGTATCAAGACATAGAATAAATTATATTATTTCAGATAAAGGCAAAATT
-ATTAAATGAGTCTTAATGTTTTTGAATACAGGActgcctctgtgtcttatggaagcagtt
-tattttgattgtcacttttgtctaggtctaaagatgagactttggtcaacttgagtttgg
-tgtcagatactggcagaagtcagtgccttcttcttttttgggacagagtctcactctgtc
-acccaggctggagtgcagtggcatgatcctggctcactgcaacctccacttaccagcttt
-aagcaattctcatgtctcagccacgcaagcagctgggattacagatgtgcacgtaccacc
-acacctggctgatttttgtatttttagtagaaatagggtttcaccacgttggccaggctg
-gtctcaaactcctggcctcaagtgatctgtctgcctcagcctcccaaagtgataggatta
-taggcatgagacactgtgcctggcagtcagtgccttccttagatgagatattggacccag
-aagtcaaagccctgtaacttaacagcacaaggattagttaatagCACCTGATAAGGATAC
-TTTTGAGGGGGATAGAGTGAGCCCTTTAATTGATGTTCTTCCAATATATGTAATTATCAG
-GCTGGAGGTGGTGATCCTGGAGTTCATGGTCTGACTGGAAGCTGTGAAGACTTACAATCT
-TCAGTGCTTAATTTTTATGGCTTTAGTAAGCCCCAGCAATATGACtaagtcagagactta
-atttaggattttgattttgaagatgtttgttaaagatgttaaaaggctcaaaacatttga
-tcaaaacagaagcacagatcatggtaaaatagcatttactcatttacccaaagtgatcat
-cgaaatactttaaaggcaatacagaaggttacatggatgtaaaaaccttaacccttttaa
-aatctcagtttctttagcaatgaaaaacctaataaagacagcatagaaattatcttgata
-atacataaaatctcagttttttaagccatctactaaaaaagcaaaaaagccctactgcat
-tgtgactacttttacttattggaagctcatttagataaccaggaagtcaaacttgatgaa
-aaaagtgcttgaatttaatcagacacaggaagactgttttcaaggttatgaatatagcag
-gggaatacacgactcctaggaacagcatgagaagttttctgattgcatcaaaaatttaga
-catatcaagaaaagccagtgtacagaatgcagttatactagaggaaaacattgcttttct
-agacctccaagatgcaatatgttagcatttggccataataacagttagaaccagagcagg
-gagaaagttatagaagctgacagaaaaattaaaggagagagttgttatctcaagcattct
-caaagggagaaacagctgaaagctgtttttttcaacagcacagcaacagttgaacttttg
-agatatgattctgagaagttttaaaaagaaaaaggttataaaattaaaggtaagatttcc
-tataatttatttaaagagcatatcaatatcttaagaaaaccttgttttgatgtaagggac
-caatttttagacaaattattataaataatttttttataactaatgatatgcaaaatccct
-tttacaaattcccctttatgacttacatagaccatctacgacatgcttggactctctgac
-ttgtcctgaacttccctctttgctaaacaatcagtcattttactttaggacaaaaattta
-ccatataagactctttttcatataaaattattctcttttctttataacctttcttaccat
-aaatacatcttcatatttataactttctttacatctctctctctcccctacctactggtc
-cctttctaccttgtttcataagtaaacattttcaagttcgtaatttgaattgaccttcaa
-ttcagataacttctgaattagacaaaattatttttttctcagtaatactagatcttGGCA
-GGCTTTTGGCCTCTAACATCACCCAGAGAGAAGCCAAATTAAACAACCTAAGAAGCAAAA
-ATCATCAAGACCAGAAGGAAAATGTTAAGTGTAAACTTCAAAGCATGTGAGCGTAGGGCG
-ACATGTGTCACTACTGAGGCACAGACAGCAAATATGTAGTCATCAAAAGGGACAAGGGGA
-TCAAGAAGCAGTAGGTGCTGGAAAATATCCCTCTGAGCCTCAAACAGTTTATGCATCAGG
-GTGACACTGCAACCCTGGGCCCCTAATGGCAGAAAAACGCCACACAACAGGGTGGCAGCT
-GACCAGAAGGATCCCACAACTCCAGGCTCCCTAGCAGACACAGCCCAAAGGATCCAACAA
-CTCTGAGTGGGGGGCTCCAACCCCTGGGCCCTGAGAATATAAAGGAACATGAGTGTCCCT
-GTGTCTCCTGGGGCTCAGAAGGCTAGGCTGAAAAGTGACAACAAAGGGAAGGGCACTCAC
-CTGCCTGTGAATCCaaaactggaaaaagcaagaaatcctgagctgtttgtcagatgttag
-cattttatagataaagccattctataattttagaaacatgctttcccatatcataaactt
-ttcttaattggaaataacccagacatctgatgagtaatctaaggaaagctgtggaccaaa
-attttgggtaaagtggtctttatggaagttaaaaaaaaaaagatttaaaaaaagatttaa
-agattttttttttaaaGCCTggctgggcatgatggctcctgcctgtaatcccagcacttt
-gggaggccgaggcaggtggatctcttgagaccaggaatttgagagcagtatggggaacat
-agtgagactctgtctctataaaaaattaaaaaaattagctgggtgtggtggtgtgcacct
-gtggtcccgaatacttgggaggctgaggtaggaggatcacttgagcccaggaggttgagg
-ctgcagtgagctgtgattgtgccaccgcattccagcttgggtgacaaagcaaaaccctgt
-ctaaaaaaaaagagaaataaagaataaataaaaGAATACATGAaattaaattttaaaaaa
-gccttttccactttttttccttcagtgtcaaatgaacttctaatgtttccatttcatcta
-gaactgactgaactgcgttaagaaaaataaaatctccaagtagacttgaattagtaatac
-ataaacagtgagtcttatctcaacaccagcagcttaataacagcagatttaaagcaggca
-gaaaagaaaagggagaaatagataagagagctttagaagCAATAATCAGAGGCAAGCATG
-GAAAGTGAAAGTAGCAAACTTCTGGGCTGGCCATACAGAGCTGTCATAAGCCTGCAGTAA
-AGCAAAGGTAACAAGCTGGGAAACGATGAGAATTACAGCATTCCCATACCTGGCAAAGGG
-GACAATATGGATTAGTTCATAGCAAACATCTTGCAAAGCTACTTCCATTTTTCCAAATAT
-ACCCCAGGGGCTCTAACCCCATGGGTCTTTGGGCCTCTGATCTGAGTATTATACCCCAGG
-GCCTCCAACCCTGTGAGTTGGGCCTCTGACTCCATGGGCCAGGCCTCTAGCCTGAGTTTC
-TAGGCAAGTGTCCTTGCCTAAGCCTGACATAGTACACCaagatggacctcacttaccaga
-agcggccaattggtgctgcagactgaatttcttttgcatagggtctcgtcttatgcttcc
-ttcatggtcgctaggaagatgttgccagaaaaggggccatgattcaaaccttaaaaaagg
-gttcttaggcctcacacaagatggaagtcaaggcgagtctcaaagtgcattgagaacaga
-tagtttattgaaagctactcagttacagagaagggtgttctcagaaagcaagaggaggaa
-cacattgtctttgttttaaactcttcttatatatgagtcttattcatgtaaaagctaagc
-tatttctatgtgagtggactgacagtgtgacaaaatccatgactctgttgatttaaagaa
-agttatccttggcattttaatgtgtaagtacaccaaagcatgactataattattttaaaa
-gcacacattgttatgtgacatggaaacatctggacattttgctgtctaggagtttgtcct
-tgcaggtattattaagtggcttccttagctgtgaatatcttatgatcatgggttgtgatt
-gggaaggaatgtgccttgctaactttaagatagagttgattttaaaatggcatcaccctg
-gctctcctatgcttctgtttccctaacaAAGGAATGCCCCTTCCCTCCACACCCCAAGCC
-CCAACCAGCGGGACCTGGAGGTAGGGAAGACAGCATGGGAAGCCCAGCCTGGATTGGAAG
-CAGCAAACATTTGACCATCCCAGCCACAGGGCATGCCTACCCTCTTCTCTCCCTGGACCC
-TGGCCTCGCCTACCGTGGCCATCCTGCTCCCACACTAATCAGAAACTTTCCCCTGGAAAC
-CCGTCCTGGGCCCAGCCTTTGTTTCAGGTCCTCCTCAAGCCAAAGACTTCCTGATGCAAG
-CGCTTCCTCCCTCCAGCCAGGGTGAATTCTGCCCTGTCCTTAGTTGGCTTTTCACATTCA
-CGTTTCCTTGTGATGCTGCTACTCCGGCTATCAGAGTCGGGGGCAGCAGTGCTGAGGCCT
-CCCACCCAACCCCAAGGTGGCAGCAACATCCTTCAAGTTCCCTCCTTCCAGGAAACCATC
-TCTGGCCCCTCACTTCACAGCGTCCTCCCTCCTGTTCTGCACCTGGCATTTAACACATAC
-TGCCCCAATCACTGAGGATGTTGTCACTGTTGGTAATACAAGGAATAACAGCACTGACAA
-CAATCACAGGGTCAACTATGGGAGAGCAAGAGGTTGAGAAAAACAGACTCTGCAGTGATT
-GGATCTGGCTCAtctgagcctgagttttctcacctgtgaaatggggtcagtgtagcatct
-accagccttgtgtagctgctggcagataaaattagatcaatatatatcaccatcagcact
-cagagggctcagtccctggGGACAATTGTGGTTATTATTATTATTATTGTTGCTGCTACT
-ACAGGGAACACTTGCCAAGGCCTTCCTGTGGGCCACTAACTGTGCCCCCACTCTTCCAGA
-TTCACACCCAAAGGAACAGggtgctatgatacccattttgtggttgagaaaaactgagtt
-ccatcaaagtgaggagatgggttcaaggtaccacagttgggacctgaaaagccagCAATG
-CACTAAAGATGTGGGTGACACAAGGCTTGGACCCTAACAGAGCAGACTCTGAGCCCTGAG
-GGTGGAGATCCCAGCCTAGTTCACACTGCTGCACAACCTGGCTGCAGGAGGACAGCCAGT
-CTTGgggctctggcctcggacaacctgggctaatccttccaccttctagctgagtgaacc
-cgggaacatcacttaaccttcttgagctcagtttttgcctttggaaggtgaaataatggt
-ctctaccatgcagggggtgggggaggattagatgggtaagtggatggaaagcttgagccc
-agagcctatgcacagtgggctgctcaggaaggtagAATCATGCAAGCCCAGGCCTAGAAA
-TTCTAAAGGGCAGGCACAGGTTCCCCACAAACATGACCTTGGCAGAATCCGTTTCTGAGA
-GTTGGCAGCAAGAAGAAGTTGTATGGATGACAGAAATTCTCAAATTTGCCTATTTTCTTA
-AAGTGGACATTTAAAAAATTCCACATTGGGGCGGAGGAATGTTCTTAGCCCAGGGATTGC
-TATACATAGGTTCATGCATTTACTATGCGTTGGTTCATCTAAGCccaacctcagggtctt
-tgtatttgctgctccctctgcctggatcactgtttccccagtgggtctcttcctaacatt
-ctagtctaggcttaactatttgcccttcaagagatcttccctgggcaccctataaaaatg
-catccttcacataaactctttctccttttccctactttgtttattcatgctgcttttact
-atctggcatcatattctaaatttatttgtttatctgtttgttgactgccttcttgtctta
-gcctattcaggttggtataacaaattgtcatgaactgggtagtatataaacaacagaaat
-ttgggctgggcacagtggctcaagcctgtaatcccagcactttgagaggacaaggcttga
-ggtcacgagtttgagaccagcctggccaacatggtgaaactctatctccactagaataca
-aaaattagccaggtgtagtggtgcacacctggggtcccagctacttgggagggtgaggca
-gttgaatggcttgaacccgggaggtggaggttgcagtgagccaagatcgagccactgcac
-tccagcctgggcaactgagcgagactccatctcaaaaaaaaaaatttaaaaataaattta
-ttttcacagttctggaagctggaaagtctaaatcaggtcatgggtagattagatgcctac
-tgagggcctgctttctggctctgggagacttttagctgtgtctgcatatggtggaatggg
-taaggggctgctctggggcctctttcataagggcactaattccattcatgagggctccac
-tcccatgacgtggttccctcccaaagtccccacatcctaacactatgacatgggaattaa
-gtttcaacatataaatgttgggaagacgcaaacattcagaacatagcactttcccattag
-attgtgaggataaggactatatctaagccattcacttctatatccctgttgcccactata
-tacctagcatacagtaggtgcttaataaatgtttgaaaaatgggtgaatGAAATATTGTA
-CTTTCTAATTcaagcattttctgagcacctactgtgcaccagggcctgtgctatgggctg
-tatatacagaaatacatcagtgagagtcctcagccctAAGGCCATTGGTCTGAAGAAAAA
-AGAGAAATTGCAACAAGTGCCATAGCAAACACAGCTGGGAAATTCACtgatgtagtttgg
-aggtgtgtctctgctcaaatcatatattgaaatgtaatctgcagtgttggaggtagggcc
-tggtgggaggtgattggataatggaggaggatttctTTTTTTATATCTATcaggaatgca
-aaattaatttaataatcgaaaattactataattcacagactaagacaagaaaagccatac
-gattctctcaccagttgcagaaaaagcatatgatagaattaaacatctttttatgatttt
-ttaaaattatactttaaattctgggatacatgtgcagaatgtgtaggtttgttacatagg
-tatacatgtgccatgttggtttgctgcacccatcaacttgtcatttacattaggtatttc
-tcctaatgctatccctcccccagccccccaccccctgacaggccccagtgtgtaatgttc
-ccctccctgtgtccatgtgttctcattgttcaactcccacttatgagtgagaacatgtgg
-tgtttggttttctgtccttgtgatagtttgctgagaatggtggtttccagcttcatccat
-gtccctgcaaaggacttgaactcatccctttttatggctgcatagtattccatggtgtat
-atgtgccacattttctttatccagtctattattgatggacatttgggttggttccaagtc
-tttgctattgtgaatagtgccacactaagcatatgtgtgcatgtgtctttatagtagcat
-gatttataatcctttgggtatatactcagtaatgggattgctgggtcaaatggtatttct
-agttctagatccttgaggatttgccacggtgtcttccacaatggttgaactaatttacac
-ccccaccaacagtgtaaaagcgttcctatttctcatggaggaggatttctaatgaatggt
-ttcacaccatctccttggtactgtccccatgatagggagggagttcttgtaaaagctggt
-catttaaaagtgtgaggcccccaccgcctctttctcttgctcctgcttcaccaggtgatg
-tgcctgttccccctctgccttccaccaggattggaaacttcctgagacctccccagaagc
-tgatgccaccatgtttgctgtgcagcctacagaaccgtgagccaattaaacctcttttct
-ttataaatgacccagtctcaggtatttctttctggcaatgcaagaacagcctaacacaTT
-CACCTCCAGCTACTGCAAGCATTCATGGGGATGAGTGAAAGGAAGGAGAGAGGTGGCTGC
-TGTGTCGAGGGTTTGCTCTACGACAGGATGGTGCACTTGCCACCTCTGGCTCGATCCACA
-CACTAGcccattttacagattaggcattgggaactcagagaggtgaagtgacttgaccaa
-aagcaaactcatggcagaatgaagactgggaccagggaggcctaattccaaacattgtgt
-gttacctcctctaccacaaggcctctctTGCCCAAGAGAAAGAATAAAGTCCAGCTAAAG
-TGAGCTCAAGCAAAGAAGATATAGATATGTAATTATTATCATTGTTATTACTATTTTTTT
-ctcatgtaacagatacatcaaaaagtagaagccttcaggcatggctggatctagggtctc
-aaacactatcactagaactgctccattcttagAGAGGCTCTCAAGTCAAAGTGACAAGAC
-GGCTGCCTGCCATGCCAGCCTCCCCTCCCCTACTCCCAAAAGACCAAGTCCAGAGGGAAA
-AAGAATGCCTCATAGCAGGCCGTTGAGGTTGGCTAATCTGGCACCCATTCCCATCAGCCT
-CTTCCTGCTACAAAGGCTGTGCAGCCAAACGTccacctttctgaccctcctgcagctggg
-tggccacaggacacagttctggtcaatgagacataagctgaagtttgtggtgagggagag
-cttttgctcctctgataacaggagcagttgtggccagagctgccccttcccatgttgcct
-tgatcacagacatgatatttgaagcacagaccatcttgcaaccaggaggaaaggctgaga
-aaaaaaaagtcctcactattttttagccatgacattgttaagttgctggactcctaactt
-cagacttcttcctaagagaaaaataaacttccaatgttcaagccactgcattaaattcct
-tgttacttgtagctgaaagcattcctgactaatacaACTCTCTGTCTCAGGTCCCTATAA
-AAACCCTGGGAAGGCATCATATTGGTTCTAATGGGGTCATGCTGTCATTCTGCAATGGAC
-TGTGGTGGCCAGCAGAGATGGGATGTGCCAATTGACCACTCCAGTGGCCACCCTTACCAC
-ATAGGCTTCGAGTGGGTAGGGTTGTTCTCCAGCACAAAAGTTAGTAGAGTAGGGAAGTGG
-TGGCTACACTCCCTATACCTCTGAATCAGTGGAGGCAATAAATTCCCTGTTCTTGGCTTA
-AAGTTTCTTCCATCGTTTCCAGGAACATGAAGATATTGACTTATTTATCCTCCAGGATTT
-TTATTTGGAATGTGAGGGGAGGATAATTCAGTGAACAGTCCAAATAGGGGATCTTCCTGG
-GAAAAAAGGACAAGTCATAAAAACTGCATTGAATGCCAGTGTGCACAATGTCCTTTCTGT
-GCCCCAAGACAGTCTCCCTgcatgagttcttgagccagacagacctgagttcaaacccgt
-ctccatcatgcaagtgcgtgggcagcctcgccatgtcacctcacctctctgcacctgcgt
-ctcTAGAACCGGGGGTGGAAGGACCCACTTCAAGGACCCAGTCTTCAAGAAAGAGTGGAC
-CAAGTGCCTCCCCCATGGTGGCCCTTTGACCAGCAGCAACACCCAGAGTGCTTTCTCTGT
-GAACCCTTCCCTGATAATCCCAGAGTCCCAGGGAGAAAATCTGCTCCCATCTGAAGCAGG
-AACCATCCAGCAGTGAGTGaacccactgccatttcctcctgccatgtggctaggccatat
-tccacagcctcccttgcagtcaggagtggccacgtgccttagttccaatccactgcactc
-cttcccctttgatgggtttgatgcacacaggtctgaagacctcagcagccacagtggaag
-atggcagagctgcaggacaccaggagcttgggtcctgaaatctttgtgcgctagagctgc
-tcacttaccaggggcacccatgttgggcttttggtgagtaaggaaaaaacctctttggta
-tttggtgcatggtgcctcttgggcttACGAACGTTACCCACATGCACCGCTTGGGGGGCA
-CCTGTAAAAGTCTGCAGGACGGTCAGCCCGGGAGGACATTCCATGTGGGCACCAGCAAAG
-GCAGAGGGTGGGAGGTGAGGAGGCCTGAAGAGCCAACGGCAGCCACACTGTGGTGTTGGA
-ACCAGATTGTCCTTCAGTCCTCCCGCCTTGACTGCCAGAGAGCAGCCCATGATCACCATC
-ACATCAAGCCTGCAGGCAGGGTAAGAGATTAATAACAATACTAACAACAGTaataatagg
-aggctctgccaatattcaagagaacttaccactcaccagctgcgggctggtttcttccta
-ggcctgatctcatttaatcctcaccatggcccagcaatgaaggccctactgatgtcagtc
-ccattttacagacaagaatacagaggcccatgaggcgtcggaggacattctccaaagGGC
-ATGTTCTTGAGCTCAGCTTCCTTCCAGCACAGCCTTTCATCAGGGCTTGGACCTTCATcc
-cattatatgtccagcattattcataggctgaggacacagaagtgaacaaagtagatagaa
-atctggacctcgaggggctgcgactctagtgggagaaaatgggcaataaacacacaaaca
-cgtaaatatacaaaaggagtttggtgaaggatgagtgacatgaagacagcaggtcaggat
-gctgcggtgggtgaagggaggaggtggtgctgtgcatcttgaggttggaggaaacctctc
-tgacatggagctgaaagtgctgcagcaaacgagtgagccacgtgaagatctggggcaggc
-tgttcctggcagagggaacagcaagtgcaaagtgcaagtgctacggccctgaggctggaa
-ggagcttgtcatgttcaggaacagaaaggagagagcagtgtggctggagtggagtgatgg
-ggggtggggagggatgaggctgcagagggagtgggttgggacaagTGGCAAGTTTTGGTG
-GGCAATGGTGGCAGGGGTAGATGATCCTCCAAAAAGACTCATCTGGATGCCAGCTCTGGG
-GGGTGCAAGGAGGGTATTCCAATGAGGAGAGGAGACAGGGGTTTCAGCCCAAATTTGCCT
-CCCCACTCTCCACTTGACTTAAGCTGCTCCCctctcccttcctttctctcattccctctc
-tctttttctctctctcCAAGTGGAAGCTGGATCCCTAGGGAGGATGAGGCCCGGGCTTGA
-GTCCAGGCACCAACAAGAGCGCGTTCCCACCCTCCCGAAGGTCTGATGTGGAGCAGAGGA
-AAAGAATGGTCCTGATATCACcggaaaaagggtcttatcccatatcgcaagagtgggttc
-ttggatctcacatgggaaagaattcagggtgagttgcagagcatagtgaagttaagatag
-gattagagactaatcaatgacagagtagggcatcctcagaaagcaagaggagaacgtacc
-catttcaagtaccagtgcttgcttatataggcagttaagagtagtgtactctgggctcac
-ccctgtaatcccagcatgttgagcggccaaggcgggcggatcacttgaggctaggagttt
-gggaccagcctgaccaacataatgaaaccctgtctctactaaaaatacaaaaaactagct
-gggcatggtggcctgagcctgtggtcttagctacccaggaggctgaggcaggaggatcgc
-tggagccccgaaggtccaggttgcagtgagatggtgccactgcactccagcctgggtgac
-agagtgagactctgtctcaaaaaaaaaaaaaaaaaaaagaagagtagtgtattctgttac
-aaaggcttatgatcagcttgtgacaggctactagtattgctactttcctatgttactatt
-gattttagcaagaatttatgagtgtactattatctttaaagcaaaacctaTTATTTTATT
-TTTATTTATTTATTTATTTATTTtttgagatggagtcttgctccatcacccaggctggag
-tgcagtggcgcgctctcggctcgctgcaagctccacctcccgggttcacgccattctcct
-gcctcagcctcccgagaagctgggactacaggcacctaccaccacacctggctagttttt
-tttgtatttttagtagagacggggtttcaccgtgttagccaggatgttctcgatctcccg
-acctcaccatctgcctgcctcggcctcccaaagtgctggaattacaggtgtgagccaccg
-cgtccggccgaaacctgttcttaaactaagaatttttttttgttcttaagatattgggac
-attttcataagttctgcgtctttaagtaacatcattaactcgttccctcaaccatgaaca
-tcttgtaaccaagcacgtccacgcccctggaaatgtaacccagcaggtttggcttttctg
-cctttattcaatatggagtcagtctggttaggatgcctttgTCCctgagagtcagtgccc
-tcacagcccctgcccggcctctaacttgctgtgtgacctggagctgatcattcgctctgg
-gcttcccttttctcctctgtttgaggagggagctggtctggtgccaccattttccagctg
-tctgtccttaggcaaattattcagcatccctgtacctcagtttcctcatccatgaaatga
-ggatggcccagttccaggcttacggtgaggattaaatgCACAGTGCCTGGTCTCAGTGGC
-TGCTGGGAATTACCATCATTACTGTTGTTTTGCCATTCTATTGCTATTGCCAGTGTTGCT
-ATTAGTATTCAAAATGCAGATTGGTggctgggtgcagtggctcatgcctgtaatctcagc
-actttgggaggcagaggttagaggatcgcccaggggttcaagaccagcctgggcaacacg
-gtgaaacctgatctctacaaaaaaaaaaatacaaaaattagccaggcatggtggcacgta
-cctgtagaccttacctgaactcaggggggttgaggctgtagtgagctgtgatcgtgccac
-tgcactacagcctgggggacagagtgagacgctgtttaaagaggtttattctgagccaaa
-tgtaagtgatcaagacccgtgacacagccctaagagatcctgagaaaatgtgcccaaggt
-ggttgggttatagcttggttttatacattttatgggtacagaagttacaggcagacatta
-atcaatccatgtagggtgtacattggttttgtcgggaaaggcaggaagcttgaaaagtgg
-gcggcttccaggttataggtgaattcaaagattttctgatcagcaattggttgaaagagt
-taagttattatctaaagacctggaatcaataaaaaggaatgtctgggttaagataagggg
-ttttggagaccaaagttcttattatgcaaatgaagtctgcaggtagcagccttcagagag
-aatagagggtaaaggtcccagactctttgttaaatctctcctgcatcaggaaaagacctg
-gaaagggaaaaggattctctacaggatgtagattttctctacaagagacagagttgtagg
-gccatttcaaaaatatgtcaaagaaatatattttggggtaaaatacttcaatttctttca
-ggtcctgctatctgttgtgtgatgctatatgaggaatttggtatcttattgctacaaaga
-gcatgctttgtcagtcttaagctctctctctctttttttttttttttttttttgagacag
-tgtctctctctgttgcccaggctggagtgcagtggcactaccttggctcactgcagcctc
-cgcctcccaggttccagtgatactcctgcctcagcctcctgagtagctgggattacaggc
-gtgtgccacctcgcctggctaatttgtgtatttttagtagagatggggtttcaccatgtt
-ggccaggctggtcttgaactccgaccttaggtgatctgccgccgtcttggccttccaggc
-gtgagccaccacgacctgccaagctctctgttttcatgataatgctggtcaactgtgcct
-gaattccaaagggaggagggtatgaggcatgcctgatccccactttccatcatggcctga
-actagattttcagggtttgttgggtcccgttggccgagagggaggtccattcagtcagtt
-agggggcttgtaattttatttttggtttacaGTTCTGAGGCCCCTTCTGGCTTTCAGACT
-GGCCTGGTTGCTTCCCATCTGGTCACCTCTCTGTCAGTGTTGGGGATCAGCATTCATCTA
-CCCCACGGATGTTCTGCCTGGAGTGGGGGTGGGAAATGGGACTGGACCTCTCGCCATGGG
-ATGCAGCCAGGCCCTCTCTGCTCAAGCCTTCCAGTGCTCCTCACCCAGACACCCTTCTGC
-AGGGACCCCAGTTTTACTCCCCTGAAAAAGAAAGTTTCCATCAGTAGGAGAAGACAGGAC
-CTGAAATTGTCCCTGAGCCTACATGTCTACTAGGGTAGATATTTTGAAAGCCGGAGAGAG
-GAGGAAGCAGACAGGAAGGAGACGAAACCCCAGGACTGTCTGCTAACTCCAGGAGGACTG
-GTCTTCAGAACCCAGGGGCCCTCCGCATTCCTTCTGCCTCCCTATCTCATCGTAGCTCCT
-GCCCCATCCCCCCACCACTTCTCTCCCCTTTCCTAACTGCGTGCCCTTCTCTCCTCCAGT
-CCAGCCCAGCCCTACTGAAGAACAGCAACTTGAGCTGGTCTTTCTGTGCTCCGCTTGATT
-AAAATGTAGAAGGCACCTCTATCCAGAAGACTTGGCTTGGCCCTAATCACTCCCAGCCCC
-CTTGGCTGAGTGGCCACCCGCTGCTGGCTGCTGTCATCCCACATTGGAAGTGACGGAGGA
-GCAGAAGAACGAGTGGGTCACCAGCCGGTCTTCAGGCTCCCGGGCCAGCATTCAGACTGG
-GCAGGAGGTTTGTGGGTGGAAGGTGAGTTGGGCAGCCCGTCAGCCACTCCTCAGGGCTGG
-ACGGAAatagtgattaggagcatggggtttgatgtcagatggcctggggttgcagcctaa
-ctttgttatttactatctgtgagttaagccctctgggtttcagtttctccatttgtaaaa
-tgggactgatattggaagatgtcctacttagaatggcgcctgagccatcgtaagccctca
-gtgaatCCACTGTAAGACTTCAGCCCCCAGACTCCCACTGTTCCCTTGCCCCAGCTTCCC
-TGCACCTCTCCTGCCACTTCCCTCAAAGTTGCTCTCAGTCAGGCCTTGGGAGCCACAATC
-TGGGAACGAGGACCCTGACATCCCTCTTCACAGCTGTACCCAGCACCAAACAAGTCATCA
-GAGGTTCAAAACACGGAGCCCCTACCATGTGCCAGGCACGGCATGGCATGCCTGCTCTCT
-TTCTAATTTTGATACCGCAATGATTAATTCTGTGAAAAAAGTTCTAGAAGGATATAAGGC
-AAAGAATTAGGTTGTGTTCCGTCCATTCACTCACGGCTCTGCTCCCACGCATGGCTGCGc
-tatgcacactgccctgcagcttcctttgtctgctgcacaatgggctctggacggagccct
-gttggcgcaatgagtgagccctacatcaagcttcgtcatcgctgcatcgctttgcaccgt
-gtggctgggccgccatcagtacagccaactgcctctgatggacatctgggctgcagccag
-attcctcctaacagggcttcagggaaagtcctcctcagcgcctctttgtgcgcatggcac
-atttctctaaggcaggtttctggacatgagactgacgggcagcatgtgctccttacattt
-gggggtcctgtcaatcccctcctctcccgcaggctgttctagactccagcccccatgtga
-gaggatgcctgttgcccTCACTCTTCCATCCTGGCAGTCCCCAGCCTCCTTGCCTCTCTT
-GTTTTCTTGTTCCGATCAGTTCCAGGTGGCCAGAGGGTCGAGACTCATCTCACAGCCGTG
-CAATAGATGCGTGTCTCTCAGTCGGTCAGCTCTGGCTGGGATCAGTGTTTATCTTCATGT
-CGGTGGACACCATCACAGGCACCCGCAAGAATCAGCGATCGACGGGGAAGAGGTTTGGGT
-GCATGGAGGagtgctttgcagtgagggctttggagccttgtgccctgattcaaatcctgg
-ctgtgtcccctgccggttgtgtgacttcggataaattacttgatgtctctgagcataagc
-tgggtcatcagaaaagccaagctagtaagagcacgtagctcagaaggctgctgtaaagtt
-cagatgagttgatatatgctcagtgctggaaagggtgctgggcacattagctgttggtat
-tattTGGGCACCTCCAGCCCAAATAATAATAAAGAGACTAGGAGGGATGTTGGGAGATAT
-CAGATGTTGCTCATTGGAGGCTGTACTGAGTGTGCAGAGAGCTTCAGGGAACCTGGAGCT
-TTGAGAGGTAAAGGAACGTGCCAACTGGAACTAGAAACCCACTGCCGCCTGCAGCTCTCT
-GGGCTGTTTCTCCACATGCACCGTGGGGTTGTTCGGGTCCCACTGGGGAGGGTGGCTGGT
-ATGAGGGTGGCCTGGCCTGGATGTGAAGTGGGATTTCCAAGGCTGGCACTCAGTCCAGAG
-CACGAGCCTTGATGAGGAACAGATGCACTCACAGTCTGGGGTCGCCGCCCTCCCCTCCTC
-CACAGCCCAGGGTTGGGGTGGCGATAGCTTCCAGATGGGCTTGGCTCTTAGTGGGGCCTT
-AAATGACTCCCTCTGAGTCCCTGAGAGGTGGGACTTAGGGCCTCTTCCTTGGTTCTCAAC
-CCCCCTGGCCCTGGGGGATACCTGAGGTAGCTGGGTTCAGGCCAGgtgaccttgggaatg
-ccagccctgctccgagcctcagtttccccatctgagaaacaggcattCTCCATCAAGCTG
-GCTTGGCAGAGCCACTGTGTCCTGTGATAGCTAAAGAGAAACATGAAGGAGGACCAGGAA
-CCCCCAGGAAAGTAGGGTTTCTTTGGTTTTATTTTCTTTTTGTATTTACTTTCTGAATGT
-ATAGTACATATCCATAGCATAAAATTTCAAAGGTACAAAAGGGGTCATAGGTAACAGTAA
-GCCTGTCTCCCACCCCTGCCCTCCAGACACCCAGACCCCTCTTCCCCGAGGCAAAAACCC
-TGTCACCAATTTCTTGAGAATCTGCCCAGAGATACGGTATGCACACATAGGAAtttttta
-cccagtgatgacaaacttcacacacagtatttcacactgtccttttgttactttaacaat
-accctttagagatcttcctatgtcactccataaagtgcttcttttttttttttGGATGCT
-TGGCGAAGATGGTTTCAGAATATTACACAACTTTCAACTGACCAATCAGGATGGGCCCGA
-GCAGTGCACAACCCTACAGTAGTATATGGCTGCTAGCTGGATGCCAGCTCTGTGTCTTTA
-TGGTTCACCATTGCATAGATGGGCCAATTGCAGGGAtgggtaatttataaaggaaagagt
-tttaattgactcacagttccttgtaactggggaggcctcaggaaacctacaatcatggca
-gaaggggaagcaggcacatcttacatggcagcaggcgagagagtgtgtgaagaagcaaag
-ggggaagagccccttaaccagtcttcaagagatgagcaggggctgtttccaacattttgc
-tctttaaaggaaggttgcaatacatacccattttgtacatttgtaggagaatatatgtag
-aataactttctagaagtgaaattgcATTTTacatccatatgtttaaaaaaatatcaattt
-ccaccccctgccatatacaagaattaacttgaaatctaccataaatctaaacgtaaaact
-taaaactgtaaaacttccagacagcaacatggaagggaaatctttgtgaccttgagttag
-gcaaagatttttttaggtactacacaaaaagcataaaccgtaaaagaaaaaaagataaat
-ttgacttaatcaaaattcaaaacttctgctcttcaaatgatgctatcaagaaaatgaaaa
-gacaagccacagattaggtgaagatatttgcaaaagtcatatctgataaaagactcatat
-ccagaatatatattgagtgctttcacaactcaataataagaacaaataatccaataacaa
-atgagaaaaaggtttaaaaagacatttcacccaaaaacagatattgatggcaaaaacaca
-catgaaaagatactcaatgttatcagtcatcagggaaacatatattaaaaccacaacggg
-ctaccactacatacctgttagaagactaacatgaaaaataactgataatacctggagagg
-gtatctaacaactggaacttagaaaaacagtttggtaatttcttataaaatgacccagct
-gtcctactcttaggtacaaagagtaatgcaagagaagtttgtgttttaaaaagaaaaact
-gtaggcaaatatttacagcagcttttctcataatcaccaaaaactggaaataacTGCtgt
-atgagtctagtctcacacagctataaagagactactcgagatgggctaatttataaagta
-aagaggtttaattgactcatagttctgcatggctgggggggcatcaagaagcttacaatc
-atggcagaagggggaagcaggggaagcaggcacgtcttacatggcagcaggtgagagagc
-gtgtgaaggaggtgaaggggaaagagtcccttttaaaaccatcagatcttgtgagaactc
-actcactatcttgagaatagcatggaggaaactgcctccatgatccaatcacctcccgcc
-aggttccacccttgacatgtgggaattatggggattacaatttgagatgagatttgggtg
-aggcaggaggatcacttgaacccaggaggcagaggttgcagtgagctgagatcgtgccac
-tactctgcagcctgcagacagagtgagactgtctcaaaagaaaaaaaaaagaGGTaaaca
-ggtaaagaaaataattttagatcatgataagagttaggaagaaaacattttcaaggcact
-aaatagagaatgatttggagggggtacgatatttaaagaaggttatcagggaaagcctct
-ctgaagaggtaacatttgaactgagatgtagagggagagaaggaactagccatgtggaga
-tctgggggaggagcattccaggcagaggggatagcaagtgcatctgaagaggtaacattt
-gaactgagatgtagagggagagaaggaactagccatgtggagatctgggggaggagcatt
-ccaggcagaggggatagcaagtgcaagggccctgaggccagaatgagtttggtgttttta
-atgaaagaaaaaggccagtgggtggggcaaggaggagagggcaggaggtaaggtcagaga
-aggaatggggaaAGTCTAGCTTGCACCAGCCCTGACATGGGACGAGACACCCTCTATGCC
-CTCGGTCCTGGCGGCTCCTGCTTCCTCCTTTGTGTCCACTCAACATGATGGGTGGGCTTG
-GCCATCCGCAGACCCCTCTTGATGCCCCAGTACCTTCCCTGCCCCGCCCGACAGTGAGGT
-CCAGCCTCCTGAACAGCTCCTCTTGCTTGTCATTGGATTAATGGGCAGGAATTGCTTCTG
-CTTTTTCAAAGCCATTGCCCCCTACCACAGTCCCCTAAGATCATGAAGGTGCgagcaatc
-atacttgaactgttggatgatgaatgcatcactgttgatgtggaggaggctccccagtgt
-gaggactcagagcagggtctcggcctctcacagacctggctgtgtgcttggctccacctc
-ctacgacctagggccctgagcctcagttgcctcacctgtaaaatgcggcaaacaagcaag
-caacaagatgctcaacctcagtagtagtcggagaaacaagagctaaatagcagtgaggca
-caccctttacctccattccctggattagcaaatagtagagtcaggaacttccaagtattc
-atgagggtgtgggcgatgggaattccatgttctgctgctgggtgtttggactggtttagt
-acctaagagcctaagaaagagtatatctgatgacccaggcattttcctcttgagtgtata
-ccccagagaaattctcctgcagctccagaagGAGCCCATTCGAGGTCATGGGTCACTGTG
-ATGGTGTTTGAGGATGTGAGCAGTAGGTGAGAATCCATGTAGATGCCAGGAAAAGCAAAC
-TGCAGGGGCCTCTAAAAAATACCAGATAAGGGATgagtgcggtggctcatgcctgaatcc
-cagcactttgggaggctgaggcaggtgcatcatttgaggtcaggaattcaagaccaacct
-ggccaacacgatgagacccaatttctactaaaaatacaaaaattagccaggtgtggtggt
-gcgcacctattatcccagctactgaggaggctgaggcaggagaattgcttgaatctggga
-gactgaggctgctgtgagccaagatcacaccactgcactccagcctgggcgacagagtga
-gactccatctcaaaaaaataataaaaataaataaataaataaatacaagaataaaatgaa
-taaaaaaccagatgaaaaagaaaaccaaaaagtaaaaataaaaaACACCAGGTGCATGAG
-AGAAAAAAAAAATAGAAGACGGGGAAATCTGTAGCACACGACCATTTCTGTGAttttttt
-tttttttttttttttttttttttttttttgcgacagagtctcactttttcgcccaggctg
-cagtgcagtggcgcaatctcggctcactgcaacctccgcctcctgggttcaagcgattct
-cctgcctcagcctccggagtagttgagattacaggcatgcaccaccacgcccagctaatg
-tttgtatttttagtaaaaacggggtttcgccatgttggccaggctgaactcgaactcccg
-acctccggtgatccacccgcctcagcctttcaaagtgctgggatgacaagcgtgagccac
-caggcccggccCATTTCTATGAATGAAAAAAACTCACAAGCTACAGAACATCCCTACACG
-CGTTAAAAGGATTCACACACATTCAAGCCCAGAGAACAGACTCACAGGAGCAGATGCCTG
-GGGGGAGGGGGAGGGGAAAGGGCAGAAGAGCATCAAGAGCGAAATCCAATTCAATCCAAC
-TGTGCAACAGACAGTTTGCAGAATTGATGAGGATGTTTAACCCAGGTCTTGGCACCCTAA
-GTCCAAGTAAAAAAATAAATACGATACAGCAGGTAAAATGGGGGATGATGGAAGGGtggc
-gatagtagtgcctttctcatggggaaccctcgaggctccgatgagcgaaaccatgcagag
-tgctcagccaggtgcctggcacgcagcaagGTGTCCGGTGCACAGCAGGGCCGCCCAGCT
-GTGAGCGGTGCGTGTATTCTCTCCAGCCTTGAATTCAGGCCTGGCTCCTTCTGCTTCCTG
-GTCAGTGCCGCTCTCTTGTGGCCCATACAGTGACAGGACTTAGACTGAATAGAGATCTGC
-CATGGTCCAAGGTATCTGATGGCGCTTCGGAGGAGGGAAGGGAGGGAGTCACATGGGGGA
-GATAGGATCACCAGAGGCAGATGGGATCACAGGAGGGAGATGGGGTCACAGGAGGAAGAG
-TGACTTCCGATTGGGGAAGAGATGGCGGATCAGATAAGGCCTCCTGGAGAAGGAATGTCT
-AGGCTGAAGGACAGATTCGACTGGGGGTCAAGGGGATTGATGAGCAAATGAAAGAATGaa
-tggagttagaatattgagcatgagcattacttagccctactgtgtgccaaggctttacat
-gcctcatatcatttcgtcctctaccacccctgggaaggcgacttattgcttctgtctcct
-ttgcagctgcaaaaagggaggctcagtgggttagcgactcatccaaagtcaagccgccag
-ctgcacatagagctctgatacacacccaggtcgtgtgactTGCTGGGGGACTCTATCTTC
-TCCACTTTGGGGTGGACTGAGGGACCCCAGTGAGCATAGGTACAGACCACCCCTGAGTCT
-GTCTGGACCATGTGTTAGCAGAAGTTTAATACTACACCTGTGCAGCAGGTGGAGATGGGT
-GGGACCTGTGTGGACGAGAGGAAGTGGATCTTGGGACAGCTACAGCATGCAGCGGCTCAC
-CCCAGGGCTGGACCCTCACTCTTTGGCAGGCAGCTGGGGCACCACACCCAGGGGTTAAAT
-GTGGAGACTCACTTCTTAAGCTAAAGGATGTGTCTGTCTTCAAGGCACTCTCCGAAAAAT
-GCCTCATTTTGGAATTTATGTCAAAGCCATTTAAATCCTTATTAAGAGTATTTAAAGATC
-AGTTTTCAAAATGTCTCCTAAGTATTTCATTTTTGTTTTTCTCGACTTGGTAGTATATTC
-CCATGGCTAAAAATTCAAAAGGGACCAAAGATAAAGGTAAGcctcctctctttccatcca
-ctctaacctctccccacccagagccatcactgttactggtttctagagtgttttgtcacc
-tgtaggttttgtgcattcatgaatcgtacacacgtgtattttccctccttcccgtccccc
-cgcgtgggggcttactatgcgcgctgttctgcaacttgcttttttcacttggcaattcgt
-ctcagggactgccccgtcattgtgtcaaatccttcctcgtggtgcttctcggccatgcgg
-tgttgcactgagtgctgtgacattgtatcgcaatgcctgtcctctagatatttaggatgt
-ttccagcattttgtgatcatacacaggactgcagggaacagctgtgtaagcaggtacact
-tgttctgcagcatgtgggccaggctaattgttatttatttatttatttatttttgagaca
-gaatctcactctttcgcctaggcgggagtgcagtggcgctatctcagctcactgcaagct
-ctgcctcccaggttcacgccattctcctgcgtcagccttctgagtagctgggactacagg
-tgcccgccaccgtgcccggctaatttttttgtattttttaataaagacggggtttcacca
-tgttagccaggatggtctcgatctcctgacctcgtgatccgcctgcctcggcctcccaaa
-gtgctgggattacaggcgtgagccactgcgcctggccctgggccaggctaattggaggat
-gaatccctagaggtggattgctgggtcaggggacatgtgcgctgtgatttgaatagatgt
-caactcaccttctgtagaggctgggtcaagtcaccctctcctgaggaaggtaggggaggg
-tggcggcttacccccacccagcccaggccctgtggtttcattttctttttttttcttttt
-tatggctcttagccaatcagataggtggaaaatggtagctctgtgtggctttattgtcat
-ctaatttgagtaagggtgTTTGGAGTTCCTTTTCTGGATGAGGCATTTTTGCCACACGGG
-GACAGCGCTGAGCCGACGACACGGCAGTGCCGCTCTGGACACGCTGATTCTCCCTGAGGC
-TCATCTTCTCAGGCTGAGTGGGACTGTGCCTGTGGATGCCCGCTCATGGAGTAGTCGCCT
-GGTGGAGGGCAAGGGTTTTGAGTTCCCATTCCACtacttactttctgagcctcggattcc
-ccctctgtaaaaagtggaaagaataatagaacccacttcagatggctctgaggaggatga
-atttaagtttttaatgtgaaatgcttggcacagttcctggctcagagttagtgcttagga
-aatgtttgttGAATGAAGAAATGAAAGAGATataatcatcttaaaaattgtattgagtac
-ttattatgaagcctttctcatgtattcacgtattttaacttcacagtgacaccaagaggg
-gtacttttattatccccctttaaagacaagaaaactgggccgggtgcggtggctcacgcc
-tgtaatcccagcactttgggaggccaaggcaggcgatcacgaggtcagattgagaccagt
-ctggctaacacggtgaaaccccgtctctaccaaaaaatagaaaaaattagccgggcgtgg
-tggtgggcacctgtagtcccagctactcgggaggctgaggcaggagaatggcatgaaccc
-gggaggcggagcttgcagtgagccgagatcgcgccactgcactccagcctgggcgacaga
-gcgagattccgtctcaaaaaaaaaaaaaaaaaaaaaaagaagatgagaaaactgaggcac
-agggagagatacaggatcttgcctaaaggctcatagctggcgtcactggcggcgacggga
-ttcgtgatcttctgtctgctcttacccacctcacttccctgcctcccactCTAGGAGAGA
-GGTGCCACCATAAACCCCAttccagctgtccattgcatgaaacaacctcctcaacctcag
-aggcataaacaaacaaccattttatcatgttcctgggttctgtggatcaggagttcaggc
-aggataaggtggacagcttctctctgctgggccttcgatgggaggactctgtggctggga
-gggttctgcagtggggggtaaggaggggcagcgggtaaaacagcaaggactagaagaccc
-acttgcgagaaggcttcttcagctacaagtctggCTGGAGGATCCATTCCACCTTGTGGA
-TGGTAGGTTGGCTATGGCTATGGGTGAGGGTGGGAGTCATGGGGGGCTGAGTGGGAGCCA
-TCAGACCCCAGGGCTGAGTCCACATGTTCCAGGATCTGACAGCTTAGGAGGCTTAGCAAT
-TCCAGGGCTGGCGCCCCCATGAATAGCTTctccaggattttgcaagtgctgtttcctccc
-cctccccacccatctcattaacacctcgcactctttaattctcagcttggctatctggtc
-ctggaggaggagctccctaacccctgtatgccttagacaggatatgctagatcctgtcct
-catggaaggtcttatcacattgttggaattgactgtctgcagactgaacgcttggaggac
-aaggcagggtctttatcaccagcacccaggacagtaccaggcacacagtaggcactttat
-gcatattcacggaatgaatgaatGGGTGAGACTGATGGATTTTGAATGACTTGAACTTGA
-GCCTCAGTTTTTCCTCCTAGAAGTTAGCTGGCAACGTAGCTGTGAAGGTGGCAGGAGATA
-GGTGGGAAATGCGAGGTTAGTAAGAGGAATTGGTAGAAAAATGGTAGTTATGATTTATGC
-TGAAGAGAGAAAAGCAAAGGaaattagatattgcacctgaaatgcttagctatgtttggt
-gcagaataggtgctccataaatATAAGATGACGTCATCATCCTCATCCTCATCATTACTA
-TTATTTGTATTATAAGAATGCACATTTCCTGAGTTAGAAGGTCCACATACGATGGCTTGA
-AATTTTCCTCTGggctgggtgcggtcgctcacacctgtcatcccagtactttgggagact
-gaggcaggaggatcgcttgagcccaggagttcaagaccagtctgggcaacatagcaagac
-tctttctctacagataattttaaacatagctgggtattgtggtgtgcatctgtagtccca
-gttacttgggaggctgaggtgggaggatcaactgatccctgcaggtcgaggctgcagtga
-gccgggatcatgtcaccgacctccagtctgggcgatagagctattacccatcttaaaaaa
-caaacaaacaaagacagaaaaaaGAAATTTTCTTCCAAGCGAAAATGGAGAGGTGTAATC
-CCCATAGGTCACCTGGGCCAGATGTCTGGGCAGGAGGTCATGCTCTGAGTCAGATTTCCC
-TTCTGTGCAAGGAAGGACCTGGGACAGGGACCTCTGAGTCTGACACTCTCTGCACAGCTG
-AGAAGGCCATTCAGCTGAAGTCCCCATTGCAACTGTTGTCCTTCAGCCTGAGGCAGTCAG
-TCCTTCGGTCTGAGGCAGCCTGTCCCTTGCCCTCGGCTACCCTCCACCCTGCTCCAGTCC
-TGCTAGGAGAGAACCGCAACACGACCCCGTTTCAGAAATGCGCTCCTTGACAAGCCTGGC
-TGCGACCTGTTCCTGGTTGACTGCCGTCATCCGGTGGCAGCATGTGGGAATGACATGCAG
-GGCTGTGGTGAGGATGAGGATGGAGTGAGCGGGTGGGGGGAACTGCAGAGAGGGCCCTAG
-TGTGGCCCAGTTGGAAGCGGTGACAGGAAGAACCCACCAGGGATTCCTCAGCTCTGGCCA
-AGGGGTTGTTCTCTCCCTCTGGCATAGCATCCAGAAGGCCAATAGCAGCGGAACCTCCCC
-CTGGGCTCTGCCCAGACTGCCTCTCTTTGGCTGTGTGACCTCACCCTGTTTCTGAGCTTC
-TCTGTGAACTTCTCCAAGCTTGGCTTGTAAGAAGGGAGTGGGCGATGCCCACCTGACAGC
-AGAGTCTCCTTCCCAGAGAGGCCCCTCAATCCTCCAGAGAATGTGGGAGAGGCTGGGATT
-TGAAAGGATTGGAGCTGGGGGCAGGGAACGTCTGAGATGGAAAGGTTATAGGAGGGGCTT
-AGGCCCTGAAGAAATTTCATCCTGTAATTTGAAAATATTAAAAAACCACCACAGCCCCCA
-GCTGAGGACAGAGGACCAGGCCCCCCAAGAAGAAAGAACATGGCCAGGGAATTGCAGTAC
-TGGAAACTTCTACCCTTATGTTGGTCTTTTAGAATTGTGAAAATTAGAACGTTCAGCATC
-CTAAAACTGGAATCTTAACAGAAAACACTATATAGtgtatgtatgtgtgtgtgtgtgtgt
-gtgtgtatatatatatatatttatatatatatttatttatataGGggctgggtacagtgg
-ctcatgcctgtaatcccagcactttgggaggctgaggtgggaggatcatttgaggccagg
-agttcaaaactagcctgggtaacatattgagacccccatctctacaaaaaataaaaaatt
-agctgggtgtggtggtgtacacctgtagtcccagctacttgggaggctgaggcaagagga
-ttgcttgaggccaggagtttgaggctgcagtgagttgtgatcgtaccactgcactccaac
-ctgggtgacagatcaagaccctgccaaaaaaaaaaaaaaattaaaaaGATacacacacat
-acacacacacatacaGACTAAACTCTGTAGAATCAGATCATTGAGCCTTGAGGTCAGAAT
-CAGAATTGCAGCTGCAAATCTAGACTCAGCCCTCTGAGCTGGAAGTCATCTGAGAGCCAC
-CTCTCCCCTCAGCTTGTCCTGGAAAGAATGTTTGCTCTCACTGCCTGCTCCTAAACTTGT
-TTGCAATGaatagatctgggggagggccccaaaacctgaatttctaaaaggctccccagg
-ggattctgttgtTGGGTCTTCCAGATTTCGGCAATAGATTTAATTTAGCCAGGCTTcctc
-ttcatcacattcatcacatgggaaaactgaggccccggaaggggaagtgacttgacctgg
-accccatcagatagctggtgacaggctggagctcccacctgtgcctcccaatgccaaggc
-cactctcaccagcagcccagggtgtttAGATGGCCCCGTGGGACTGTCAACCTCCTAGGT
-ACCCCTGGTCCCTGAGACATCTGGTTCGTGAAACTGCGAGGTTCTGGGGATCGAGGTGTC
-ACCCTCTTCTGCCTCTGGCTGAGTCTGCTTCTTGAGAGTAGCCTGGAGGGGCTGAGGGCC
-CCTCCTCTTTTATCAGCTCCCCCCAAGCTGAAACCCCACCCCAATCCCCAATACACTCTG
-ACCCCTCTCAGCCCCAAGCATTCCTGTGAAAACCACTCCACATGTTTTAAATTCTGCTAC
-TCCAAACTCAGCAGTATCATGGTTTTGCAACACCCTCTTGATGCTCAAGAAGCATTTACA
-AGTTTCTTTTCCCTTTATTAAGAAAGTTTTAAAAAAAAGTTAGGGTCTTGAAACAATAAC
-AACGGAGCATTTCAGAGGCACAAACGTTTGCAGAAGAGAAGCTGGTGGCCTGGCCAGGCG
-GAGGAGGGGGCTCTAGCTGTTCTCGGGGAGGTGAGAGCAGGGAAGTCAGAGAGAGGGTGG
-GCCTGCTGGGAGGGGGGGGTTCAGGCCAGGGCTCCCCAGCTGCCAGGTGGAGGGCAGGTC
-TGAGGGTGGGTGCTCTCTTGGGGTCGGGAATGTAATATTTCATCACCTAGAGCCTCTCCC
-CCAGCCTGCTGACCATCTTCCTTCCCCAGGCCACCCCTGGGCCCCTTGGAGCTCCGACTC
-TTGCTTCTCCTGCCCATTCCTGTCCCAGTCACGGAGCCCTACGTGTTCAGGCCAACCAGT
-CACGGCAAATACAAATCCCGTTTCTGAGGATTCCGGGGAGCAGAGCAGGAAGGGGGTGTT
-ATGATGGCAGAAGGATAGGCAGTGAGGACAGACTTGCTTCCAAGCTGGGTCTGACCTGGA
-GACTCCTCCCAGCGTCGTTCCTGCCTAGGGCGAGGGGCGTCACAGCGAAGCACAGATGCT
-CAAGTCACtggtggtgggtgtgggcgagtgtggtggtgggtgtgggggagtgtggtggtg
-ggtgtggggcagtgtggtggtgggtgtgggcgagtgcggtgatgggtgtgggcaagtgtg
-ggggtgggtgtcagcgtgtgggggtgggtgtcagcgagtgtggtggtgggtgtggACGAG
-TGCACGGATCTTCCCTTGCTCCCCACCCACAATTCCCTACATTTCCCCCCTCAAGTGACC
-CCCAAATTCTCCTCTCCACCGTGAATGTGCTGAGCAGAGCCATCAGGCAGAAGCAGAGCC
-TGAAGGCTTCctgtgtgaccctgggcaagccccttccttctcagacctgtttccccaCAT
-GGGCAGGAAGCGCTGAGGTGGGGAACAGAGCTGCTGGATAATCTCAGCTTTCCTTTCCGT
-TTCAGTGGCCTCTTCTGGGCTGGGCAGGTGGATCCCCCAGCAGTGACAGCTCACCTGATC
-CGGCTTGGGAAAAAGGGGCATGGAACCCATGAGAGGGAGGCCTGTGGGGGAGTGCCGATG
-AGGGTGGCAGGCAGCTTGCAGAGGATGCCCTCCAGGGCTGGCTGCCCACCCAGAGGCCAG
-GTTGTGACCCTCCACGGCCAGCTGGGGGAGGTGTCCAAGCCAGGCCTCTGGAAGCCCTGG
-AGCCTTGTCCAGCCAGCTCCTCGGGGTGGCTGGTGGCTGAAGGCTGTGGAAATGGCCTCT
-GGGGACTGTCCAGAGAACCAGGTGCTCACAGCTCAGGGTCCTGGAGCCTCCCCCAGAGCA
-GAAGCAGGGCCTTCAGGATTCACCTGTGCTGTGTCCCAGCTTTGCCCTCTGGAAACCCTT
-TCTCTGCAAAGATGGGGTCAGGGAAAGGCCTGGGAAAAGATGTTTGCTTTCTTTAAGTTG
-TAGATAGAGAAAGCTGCAGGGGAGGGCACAGGCTCATGGTCCCTCTTAAAGTGTGTGTga
-gagggagacaagaggagggagagagagaaggatgcggtgaaggacaggaagaaacacagg
-aagaaagaaaaggaaagataaaagataagtgagaaagaagaggaaggaagggaaggaggg
-agggagaaaggAGAGGAGAATGGAGGTggaagaaataaaggaaataaaaaagaaaaagaa
-agggaaggtagactgacagaaaaatgatagaagggtggaaagaaagagaggaCAAATGGA
-GAAGACAgaggagaaagagtaagaggagaggaggagaaggagcaggaggaggTGTGCAGG
-GGCCGAGGACTAGGACCAGAGAGTCGGGAGAGCCGGCGGTCAGGGCTGCAGGCCGGGCTG
-GCGCGGCCTCACGTCCAGCCTGCGGTCCAGCTTCCTGTCCTTGCGTGGGCGCCGGTCCTT
-CCTGCCCTTCTTCTGGCCGGGGCTCCTCTCTGCAATGAGAGGACAGAGCCCGGTGACCAA
-GGCTGCAGGGCCAGTTAGGTCCTGGGAGCCTCCTCAGTCCTGAAAGACAAGGGTGCCCCA
-CCCACTCCCCAACAACGGGGCTCAGAACATTTGGGCACTGACCTTGCAGTCCCTCCTGTT
-GAGAGTTTGGACCGTGGGCTAAGGTACCCCAAACTGAACCTTTCTCTCTAGGTCTTCAGG
-GAGTGGCGAGGGCCACTAACTTGTTCAGGGCCTTCTTGTGCTGGACATCTGGCTCGGCCA
-GGCCTGCAGGTTCACCTGGGGCCCCCCAATCAGCATGTCGGGTGGCCTCATGGGAGTCCC
-CATGGCTTTCCCCGGCACACTCCTTCCATAGCTGAGCAGGCTCTGTGCTGGACGCTGGAC
-ACCTTTCATCTGTGTCCCTGCACCAACTTCTGCATAACACTGTGGCaacaatacttcagc
-atttagcaagcgctcactgtatgcaggccacagccccaagtgctttatgtatacgaaact
-cacaacagccgagagaggcaggtaGGGTCTGAGCCACACCCAGTCCCGTCTTCTCCAATT
-GTCCTCTCTTTCTCTCCACCCTTCTATCATTTTTCTGTGCCAGGCTACCTTTCCTTTCTT
-TTTCTTCTTTATTTCCTTTATTCCTTCCACCTCCACTCTGGCTGTGCCCGCTGCCCAGGG
-AGTTCTTCTGAGCAGTTGCCTGTCATTGTTATGGACAGGTGAGAAGACCACAGCATGGTT
-GGGAGCAAGGCCAGCCCTAAGTTTCTGCTTTACAAAGTGTCTCCACACCCAGGACATTCT
-CCTACATTGCTTGGGCCCCATTCAGTTCCCCGCAAGGAGCTGTGTGTCCATTTGAACACG
-ATGAACCTGAGGCTCCATGAGTCACTTTCTGAAGGTGCGCAGCGAGGCTGTTAGAGACCC
-TCTGAGCCTAGTGGCAAGGGGAGGGCAGTTTTATTCCTTGGGTGTCAACTATGTGCCCGT
-CTCCCCAAGAGTCAGGGCTGTGGCTCCAGTCCTGGCTCCTTCCTCTGCAGAGCAGAGTCA
-AGGAGCTAAGACCAGGCTACCCACCTCTGGGGCTCCCCACGCCCACTCTGAGCTCTTGGG
-GAGCACTGAGGCCAACTCCCACTCTGAGCTGCAGAGCTGACTGTGCAGGCCTCAGGTAGG
-ACAGCATCTGGAGATGGGGTGTGGGTGCTGCCTGAGTGGCCCTGCCGGCTCTGATGTGGG
-GGTGTGGGGGCCAGTGGCTTTGTGTCCCTACCCCTTCCCTAGGCCTGCCTGCCAGCTGCT
-CATGTacccatccagtcacccacccatccctccacctatttacccacctacacactcacc
-cacctattcacccatctactcacccacctCCATACCCAATGacccatccatccacctagg
-cacccacccatcacctatccatccacctgttcacctatctacctacctacccacccacct
-aatcatccacctacctactcatccacccacctaccctcccatctaccctcctatccaccc
-atctacctacccactcacccaccTGTGCATTCAGCCATCCatccactcatccaacaaata
-ttaactggataccgactatgtgccagactgtgttagaggcactagagagacagctgtgaa
-caaggcagataaagcccttgccgtcactggagatcacactccagtaaggaaaacagacgc
-tgaacaagcaaacacgagaatgagaaggctcatttcagaagggtgcaagtgctaccatgt
-gatatgatggaaaatgactccggggagggggactcctgggaagcctctctgaggaggagc
-cactgcagccaagacctgggtgatgcagggagctacagcggggttgttgcgaggattaga
-gtcatgtttcacagcactaagcacagccagcacatggtagatgctttatgaatgtttgca
-gttattgtGATTATTATTATCCAGGGGAAAAGCTTTCCCCTCATGATTCCCCAACAGCCA
-TTCACCCCCAGCTCTTGGAGCCATGAGAGGTGCCATGTGGTAATGAGTGCAGAAGAACTG
-TCTGCCTCCTGTGTGAGTCCTGCTCTGGCTCTGGGGTCTCTTAGGTTCTCTGGTTCCACC
-TCAACCTCACTCTGTCCTCACCTGCCCAACATGACTCCCAAAGGCTCCTATCTCTGCTAG
-CTGCACTCCCAACCCAAATAGCACAAGTCCTTCTGAAAGAGGAGTGTCcctgagttcaaa
-tcctggctccactatgtcccagctgggtgccccgggtggcctggttccaggtccctcatc
-cttcatcatgactttagattcctctttgcaTGACGAGTTACgtttgaattctaggtctac
-agctccctggctttgtgacccttaggtgagtgactcaacctttctgggcctcagtcccct
-catctgtaaaatggggatagtgctaataacacctaccgcatagcatcactgcgaagatta
-catgagttaacgattatagagaattcggcacagtgcccagTCAACACTGCCAATACTACT
-CACCGTTCACATCTTACCAAGCACACCCTGTGGCCTCTCTTCTATGTAAATCAGTGGTCC
-TTCATAgcccccagaaacattttggaaatacgtgtagtggtcttgaatggcacagtgaag
-ggggttcctgtggcattcagtggacggcaatcgggatccagcgtgggacagtcccccgca
-aagacgagctgtccccctgttccatccagttctctcacatcgtgccccaccctcacgtag
-ctgaaaagtctgcttgctgggagctgaattctgtttgactcatgaataccaattggtttc
-gaacacttccattcactgaagattctagggcactgtgagtgtggtgtcaatcagagatca
-attgggttggaccttactaatcattggtcactgttgggaaatcgcatctctgatggcgat
-gTGGCCACGTACTTGGGGCGCTGACCACGGCCGCGGTCCTCACTGGGATTGTACTTCCCT
-AAGTGTCTGTTGGTATGTTGGGCCAAGCGCTTCCATCAAGAAAtttcttttctttctcct
-ctatattacagttaggacactatactgataaaaaaaaattacctttgcaagtaggccaca
-ttctccatgaacttcattaagaatgataaagagggtattcccaaatccttcttattaaaa
-ggggggtgttcagtttgagagggttgggaactcctgGCCAGCTCAATTTTCCTAATGTAT
-TTGGGACTGAACCCAGCAAGGAAGGCCCTCCTTTGAAAGGACACCAGGGAAGGTGATGTG
-TACTCCACATGATAGTATGGCTAATGGTGGCCTTTCAGGCAGTCTCATAGATACTATTTG
-TGGGGCAGTGATCTGAGTCCGCCCTGTCCCTGTGGGCCTTTCCCACCGCAGCCTCGTGTG
-CCTGTCCTGGGGCTCACCTCCTGGGCAGGGCCTCTGGATGGGACATTTCCTTGACTCAGA
-AAGCACCTGGCAGGTGGCTGCCTCCTCATGCCCAGCCCGGCCAGCCTCTCGTACCCGGCT
-CTCCAGGCCCCAAGCCGAGCCGCAGGTCTTTCCATTGTGTGTGCAGGGGCTCCAGCCGCC
-CCAGGGACCCAGTTCACACTCCCCTGTGGGGTGAAAGGAGagacagacagacagacagac
-agGGTCAGCCGGCAGTGAGGGTCCTTCAGATCCAAGGGCAGGGTTTGAGGGGTTCAGTCC
-TCTGAAGACTGAAGACACCACTTCCACCTGCTAGGAGCAGAGTTATTTATAAGAGCCTGG
-AATGAGAGCGAAACGAATGCATGCACAGACTAATATGGGCCTGAAGCCAGAGCGGCCGAC
-TGTCTAGCTTTAAaggaaaggcttcctggaggaggtgatgtatgagttaaagggagagag
-gggagctcgtcaggtgagaagaaggaagcccattccaggcaggtgtgcaaagccttggga
-gcccggcccaccatgtttgggagatggggcagcctgagttgggagtcaagtctcaggaag
-gcggggacaggagaggaggctggaaggttgcctgggaaGCCCTCAGGACCAGGACACAGG
-TTTTAAACTTGATCATGTGTCTTTGATCAACTTTGGAAGGAAGAAAAAGGAGGCCATGGA
-CATAAAAGTTCTTCATAGGGGGTAATAAAAatacatatatacatgtatatatatatatac
-acacacacacacatatatatatacacatatatatacacacacacacatatatatacacat
-atatatacacacacacacacatatatatatacacatatatacacacatacacacacacac
-acacacacacacacatatatatatatatataCTTTGATTATTTTAAAAGTCCATGAGAAG
-TAGGCACAGAATATGggtagctatgaatactcctattttgtagatttggacactgagacc
-tagagcagaggtttgctaagggaacgcagcaagaggctcacacagcagacacagcaagct
-caagacacagtgggacccagaccttgctAGatacacacatttgacaagtaaagactgagc
-acccagtgtatgccaggtgctattctgggtgctgagggagcagcagcagacaagacagcc
-cagggtctgcaggcctcctggaattcaccatctggacaccgccgtgatgagggaagtgca
-ggcaccgtgggagcccagaagcagcatgggttgggttgtaggggaggaaacccctggact
-gggtcttgaagtgggggtgggatggcggggaaggggagcctagccaggctcagggaggga
-cgggaggtgctccaagtgagggcataaccccagcagagtcccCAGGATGATTTGGCCTGG
-AACTGGGCAAGCCGGAGAATAAGCTCAAACTGAGGAGGAAAAAAATGATGGGGGTGGAAA
-GGCTGGCAGATGGGACAGATTGCCCAGGGCCTGGGTGGGCTCCGCCCAAGGGCAGTggga
-gccactgaagggtcctgggaggaaaagaaattgagcagactatcattgtgaaatactccc
-tctgctgttgagtggagactgggctggagggactgagaaccaaggcgggagacgggcagg
-agctgtggccagaaccctggcgataggcagggggtggcaagagggtgggaagagggcggC
-ACAGAGGACAGAAACAAATGGGTGGGGAGAAAGGGATGAGCTGAATGGTGTGGGTTTGGG
-AGCTTCGTGctgcttcattttcaccccaaagttcttcctaccacccaaaatattatgcat
-ttgttctcaggtgtcgcttctgtctctccactgaaatgtcatgtccttgagtgcagaggc
-tttgtctgttttgttctgtaatgtgtctccagcacctaggaaagtgcctggccatagcag
-atgctctagtagatattttcagagtgaataaatGAACAGATTGGATTGAATATAGGGTGA
-GGGAGAGAGAAGAGTCAACAGCGATGTCTGCATCTCGCGCATGCCACCCAGGGATCAGGG
-AGCTGGTTATTGAAACCCAGAGGAAACCCAGAGGGAGCGTTAGGTGGGGGATGGTGGCAG
-TGGGAGTGGAAAGAAGGCACCCAGAGGGCAGTGGAGGTGAGGATCAGCTGCTCAGGGAGG
-CTGGAGACACGGAGTCAGGGGCCATCAGCAGCTGGAATGACCATGAATGTGAGCCCGGAG
-GGAATGCGTGGGCAGAGAGGCACAGTGTAGATGAGAATGCCAAGGAGCAGCCTAGTGCAG
-GAACGGGAGGGCTCACAGGCAGGAGTGTGACAAGGAGCTGTTAGGAAATAATCAGAGCAG
-TAATAACACTGATactgacacgtactgagcatctactgtgtgctggctgctgtactgagc
-actttaaattgtactaattcactttatcctcataacaattcctccccatgaggtaggctc
-tatgttctattgtctttttttttttctaacgtttggagaaaccgaaggacagagagctga
-ggtggtttgcttaagatcactaaagggtaaggtttagagctaggattggaccccaggcct
-gtcctattccaaaatcagtgctcagccaggtgtggtggctcatacctatactcccaatgc
-tttgggaggctgaggtgggaagaccgcttgagcccaggggcagcctgggcaacatagcaa
-gagcctgtctttacaaaaacataaacgcatagccagctgttgtggtacatgcctgtggtc
-ccagttactcgggaggctgaggcgggaggattctctgagcctaggagtttgaggctgcag
-tgagctatgatcatgccactgcactccagctgggcaacagagtgagaccctatctcaaac
-aaaacaagcaaacaagcaaacaaacaaacaaataaacaTCAGCGCTCTTCTTCTGCACTC
-TGCTGATTCCCTTGGCATTAATAACAATGCCAGTGTTGGTTGTAGTAGTAATCATAGTAA
-TGGCGGTTATGTTGGCTCTAGTGTTTTGCAGTTACTATGTGGAGGTACCCAGTGTACCTG
-ACATGGTGGTGCTGGGCCTTCCCTCACCATATGGCATTCTACTGTAATTTCTTCCAGGGC
-CCCTAACATCTCTCACCAAGCCCCCGCTCCAGGGAGAGGGGAGGGGCAGGGGCAGGGCGG
-GGAGGTCCCCACTCACCCTGGCACTCCCGTGTGTTCTGGTGGGCCAAAGTGCCCGGCGGG
-CAGGTGGGCAGACACTTCCCCTTGTACAAGTAAAACTGCCTCTTGCACCGGATGCAGAAG
-TCCTGGCTGAAGCAGCTCTCACAAGTGGCCCCACATTCTGTAATAGAGCCAGGGACACCC
-CAGGTGAGGGAGACTGCCAAGGATGGGGCCCACTGGGTCTGCCCGAGGTGGAAGGCCCTC
-TGGGTAGCTCCAGGCTTGGTAGCATTTGGGTCAGGACTCAGTGTCTCCTTTGAAGCCCAG
-ACTTGGCCAAGGTCAAACTGGGCTGCATGTGAAGAGAACActccctttctcatttgaggg
-gaggctcagagagagcgagtgacttgcttgaagtcacccgcaaaccagggctggagtgag
-gactccctgcttcttttTCACCTCAGAAATAGTGATAATTTGCCCAAAGTTACAGCAAAA
-ATTAGAGCTTGGAATTAGGACTCCTTTTCCTATTTGagctaagaccagagaaggtgagtt
-acatgcctaaggccacaccacaaactagggtagaAGTGAAAGTTGCCTGTTCTATTAGTG
-CTAATTAAGGCTGAGAGCGGACTGACTTGCCTCGGGCTGCGGAGTCAGCCTGGACACAGG
-CAGGTATCTCAGAGTCTGGGCTTAGACATGCACCTACTTCCCCTCTGTCTGTGCTGGGGT
-GAAAGGGTGGGATCTAAGCCCATGGTGTCTAGGAGCCCAGCACTAGCATAGAACAAGGGA
-GAAGCCACGTACTTTTGCACCTGTTGACCTCCTGGCCGCGGATGCCGAAGTACCCAGGGG
-GACAGTCGTGCAGGCACTTGCCGTACTGGCGGATGCCTTCCCGGCGGATGAACAGGAAGA
-GCCTCTGCTGGCAGGTGGAACAGCCGTTCTCCTCTGAGCAGATGATACAGCCTGTGCAGT
-TGCCCCCCAGGCCAGTGCCCACTGCCCACAAGACCAGGGCAGAAGGAGGGGGAAAGGGAG
-AGAGAGATGGTCAAACCATATATGCGAGCAGCTGAGATGGTCTCATTGGGATAGtaactg
-ggcacatggccacccaaacaaaagactacatttcccaccttcccttacaactagatatgg
-tcatgtgaccaacatctggccaatcagatgtaaggtaaagcagcatgtgacacttcaaga
-aagctgccttaaagggcaggggtgtgccccttgtcgtcccctcatcctttctgttgggtg
-gaatgtgaacgatggctggagcacaagcagccatttcagatcatgaggtggaaactatgt
-cccgtgaggcggtggaaaaatcagataaaaagcacctgggtgcctgaggaaggcagaact
-gctgtaccagctctagcctgcctgtgtagactgttacatgagagagaaatcaacatctat
-cttgcttaaatcactgttatttgaagttttccatcactcacaagcaaacttaatctttac
-CAAAGTAATGTGAATTTTTGAGTGTGTGTGGGTGCACATGATGAGTGGGGTGGGGTGAGA
-CCCTCACCCTCCTGCTGGGTTCCTGAACAATACTCAGCAATACTCCATTTCTCACTGTCA
-CCATCAGCAAGGGCTCCCACCATCATCAGGAATAGCAATGGGAGAAATTTTTTTAAGGAG
-AAAATTTTTTGTTACCCCAGAATTGGCACCCAGGAGCCAAAGCTGGGGAAAAAAGAGGTG
-GAAAATGCTCTAGAATCTTAAGTGAGCCTCTCCCAGGCTCATAAGGAGTCTCTGTTACCC
-TGACCATCACCCCAGGACCCTGATTAAGCTGAACACTTGCAGGGAGGGACTCATGGGAGT
-TAGGGATTGTCAGCCTggccaggcacagtggctcatgcctgtcatcccagcattttggga
-ggccaagatgggagaattgcttgagtccaggagtttgagaccagcctggacaatatggcg
-aggccctgtctctacaaaaaatacaaaaattagccgggtatggtggcacacacctgtagt
-cccagctacttgggaggctaaggtgggaggatcgcctgagcggggaaggctgcagtgagc
-tgtgtttgtgccactgtactccagtcggagagacagagtgaagccatgtttccaataaag
-aagaaaataaaaagaaGTGGACAGCCTAGGGAAGTGAGTTGTGGTGCTGTGACTTTTCCT
-CTGTTCCCAACCCTGCCAACGAAGTGAGGAGATGCCAGAGAAACTCACAAAGACAGGGGG
-TGCCTGCAAGAAGGTGCCAGCATCTCATGCCCTGCTTGGACATAAACTCATGTCCATAGC
-CCTGCGAATCTGCCCCCTTCCCATTCCTCTTTGAACAGAGAAAGGAGACCAGGAGACAGA
-AGGGCAGAGCTGAGGGGAAGAGTGTGATAGAAGAGCCTGCACATCCTTCCCGGCACGTGT
-GAGGGAGTTCTCAGTGGTAAGGGGCACCTTGGGAGCAGCCAGGCTTAGGTGGTATTCCTG
-CTGCCTGGCACAAGAAGGCTGGTTGCTGGGAGGTGCCCCAGCAGTAAGAGGCAGCAGGGG
-AGACCACTGGGAGTAGGAGGTGGGGGAGAGTCAGAAAATGACCAGGTGTCACTAAGTGAC
-AGGAAAGGATAGGGCAGCTTTTGAGAGGCAGCAATTGGGGAAACAGTAAATGGTTTCATG
-TTTATATGTCATTAGGGTCAGACTGGTTAATAATCCGGTTATACACCTTGATTCACCTGA
-GCCCCAAGACCACCCGGCAGGAAACATTCTTGGCTCTCCAGCTCTCAGATGCTCCCCTCT
-TCCTATTGGTGCCCCATCTCCCTTTTAGAGGAATTCCCCATTGTGCAAGGTCCTGATGAA
-ACACATCCTGGCACCTTCCCCCTGGAACAGAAACCAAAAGAGTTCTGGCCCTCCTTTAAG
-TTGGCAGCAGGTGAGAGCTAACGAAAGCCCGGTCAGATACACATTCTGGTGACTCCAGTC
-CTGGGAGTGGGACACAAGAGTGAGGGTCACACAGAAATGGGGTTCATGGTGGAGGCAGGG
-CAGGCTCTCTGCCCAGCCCTGGCTGAGGcctttctctctcccttccatccctcagtccct
-ctgttccttcctccctGCTCCAGCTCTCGGATGAGTACTGCTACTTCCCCAGTCCTCACC
-TTCTGTTCCTTAGATTCGGTGAGGCCCCACATCCTGCTGATAACCCTCTTTCTGTTGCTT
-ATAACTCAGGAGGCTTACTGATCCAGGGTCGTACGGAAGCACACAGTAACTAAAGTGTAC
-CCTGGGATGCTGTTCCCAAGCAAAGTTGGCATTGCCCTCAATTTTCTTGCCCTGGGATAA
-GAAACTGCAACAGGAGAGCAGAATAAAGATTTTTGTGCCTCTGGAGCTGTATACCTGGCA
-GGGATCTGAGGGCAGAGAGCAAGTGTGATGTTGTAAGGGAGATTCCCAGAGCCAGAGAAA
-TAAGAACATCCACTGAGAATTTAGCAGAGTCCGGACTTCTCACTCAgcaaaagattcaga
-ttctgatactacccagagctggcaagaatgagaggaaaccttcgctttttcaccttagat
-aggagtgtaaacttcggggaaaaatctagcagtacctaataaatttggagatGTCTCTTT
-TCTTTTTGTGTTAAAAAGtttttttgtttgttttgttttgttaagacaggatcttgctct
-gtcacccaggctccagtgcagtggcatgatcctaagctcactgcagcctcaaattcctgg
-gctcaagcaatcctcctgcctcagcctcctaagtagctgggactacaggcatgtcccacc
-acaccaagataattttttaaaaacttttgtacagatggtctctctctgtttcccaggctg
-gtcttgaactctggcctcaagtgatcttcctgcctcagggtcccaaagtgttgggattat
-aggcatgagccaccacgactggccTGATGTCTCTTCTAAATGTAACAATTTAGCTTCTGG
-TATATACCCTAGAGcggcagttctcaaactctggcgcacaacagcagctcctagagagct
-tgttagaatataggtccctgggttccacccctggtacgtctgattcagtaggtctgagaa
-tttgtatttctaacaggttcccaggtgatgctgatgctgctggtccagggaccatgctct
-cagaaacactgAcctagagaaacccttgtatatgtgtagaaagagacaaagatatttatt
-gcagcattatttaatagcaaacaactgcaaaaagctaaccctctgccaaaggaatagata
-aatacattgtggtatattcatacaccacagccagataccacatacacaacccagccatga
-taaatgactgaggtagctacagttatcattgtgggcacagctcaaagacggggctgagag
-gaaaaaagcaaggtgcacgatgaatcatatagtaagagccatttatataaagttcaagga
-cctgcaaagcaatattttgtAGCATTTGTGACTTGTAAATATGCATTCAGAGCAGAAGAC
-ATGGGACTAACCAACACTGAATTCAGGATCATGGCACACAAATGtttattatattatttt
-aaattCTTGACTGTAGGTTTGAAATAGTTCACCCTAAAAATGCATAAAGAACAAAAGAAT
-TTAGCCTCTACTGTGTCCTGGGGCAGGAGGAGGCCTACATTCTTTCTTCTCCTTCTCCAC
-TAGCTCCCCTCCCAAGCCCTGTCCCATCCTCAAGCTGAGGTCTTGAGCAGGGGAAGGTGA
-CAAATTCTGAAGACGTGGGACCCGGGTTCCAAGAGCAGTGGAGACTCGTGCCTCTGCACA
-CTttgcccctcgtccactctcccctcatcctcagtagtggaatcctgatttttattttat
-tttttgaggcaaggtcttgctctgccccccaggctgaagtgcagtggcacgaccttggct
-cactgcagcctagacttcccgggctcaagcaatcctccctcctcagcctccctagtagct
-aggactacaggcgtgcaccaccatgcccagctaatctgtgtatttttttgtagagaaatg
-gtttcaccatgtttcccaggccggtctaaaactcctgggctcaagcaatcctcctgtctc
-agactcccaaagtgctgggattacaggcctgagccacagcgcccggctggaaccctgata
-ttaagcggagtttatgtcctctaagactatatttcccaggccctttgcagctatatgtgg
-tcatgtgcttatgccctgaccaatgggatatgagcgggcatgccctgtacagcCCCTTAG
-GAAACGCTGGCACTGTTCTCCTCCCATTTTCCCTTATGCCTGCAGGAGTGCAGGCTTAAG
-AGTGGAGCCATGGCAGATCCAGGAGGCAGAGGGATCTTATAGAAAgacagcttggcgtgg
-ctgtattaacccagggctgcccaccgccgagattctttcctggggaagggaggaaagcat
-tgcccatcttgtttaggtcactgGGCCTTTCTGACGCACACATTGACTGATGATGTCGGG
-TTTTCCGCCATGCAAGGCAGCACAGAGTCATATCAGTGGAGACCAAGTTGCCCTGCGCTG
-TGCCTTGGCGCTGTGTAAGCCCACTGGGCCTGAGAGGCGACCCCACTACCAAAGAGCAAG
-GGGACCCTCAGTTGACTTGTGGTGATCTTTATCACCTGGCAGAATAGGACTTCAAATTAC
-AAATTAATTTAAATTACAGAAAAACAAAGTAGCATTTCCTGAAaaacgaatctgtggaca
-cagactcacaccctgacatggcgttgctgcccattttgcagctgagaaaaaccgagaatc
-aaggaggtgaaacgacatgtccagggtcacacagaattggcaggggtggacccacatcac
-tctgccccacgctgccctctTAGAGCATCTGTCCAGGGCCTCCTGTGTCAGGCAGAGCCT
-GGGGCCATGGGGGTGAGCCACGCATGGCCCCTACCCCTATAGGACAAACAGCCTGGTGGG
-AGGAATTGAAGCCCACAGAAGTGACAGCAAAGCAGGATGAGATAAGGGGTCAAGATGGAG
-ACAAAGCAAAGCTCTTACCACTCTtagaagagcttagaggtcactcagcacaactcctgc
-agtttcactggggacactgaggccagaaggggtggagctttccccaaagtcaggcagcca
-actGCAAAGAAGCCTCAGTCCTCAGTTAGAGTTATAGCACTAtttgttttttgtttgttt
-tattgtttgtttgtttgtttgtttgtttgtttttgagatggagcctcactctgttgccca
-gactggagtgtagtggtgcgatctcagctcactgcaaactccgtctcccaggttcaaacg
-attctcgtgcctcagtctcccgagcagctgggattacaggcacccccaccaagcctagct
-aaatttttttgtatttttagtagagacggggtttcgccatgttggccaggctggtctcga
-cctcctgacctcaAAAAGCTACAGTATATGCTGAAGGCCAAAGAACCCAACAAGCCCCTC
-CCAGGCCTCATAGAGTGCTGGCCCACTGGATGGTGCTTAGCATCCTTCAATACCCTGGTC
-TTTGAAGGTCAATACCCTGGTCTTTGAAGGGTAGTGGCTGTTTCTGGCCTCATCCTCGAC
-CCTGGCAGTTGGCTAGGATGCCCTCTTGTGCCTCTATGTTGTAATGGCACCTCTTGCTTT
-TTGACTTCCGGTAGCCTGTCTGGTGTTTCGTCATGTCTCTGTAACTCATTAGAAAAAGCA
-GTGCTACTGCCTCTCTCTACCCCCTGCCCTAAAGTCACGGGTGCAGGCGCTTGAATGTTC
-ATTCTGTGAATCATCAGTGATGACAAGAGTCTGTAGAGTGCTGCTCTAGAAAGATCCAAA
-CTTGAAGGTTCTTAAACTTGACTGTGATAACAATCTCCAGAGAGGCTTGTAAAGCGTCTG
-CTGTGGGCCAGGAATGTGCACTTTAACAAGTCCAAAATAAATGTAACAGAATTTTGGAAG
-TGTCTTCCCTGTTCACAGTTTCCTTTCCCTGAGAACTGGCCCCAGTAATCCTGTTTGTAG
-GGCATGACTCTGACCCTAACCAATGGCTGTCTCTTCCAGGATGGGCCAATTAGACCATCT
-CTCTCTGGGCTGATGGACAATGGTCTGCGCTGGCCTTGACCTAAGGCGATCTGCAGGTGG
-GAGGGTAGCCTGTTCCAATGCACATGTGTGAGAAGCCTTGGTGGGCACTAGCTAACAGAG
-GCTCTGCTCCTCTGcactctctggcattgaggttcgtgtgctgccatatccacccagatg
-cacttaacctgggcttggccaatcagagcatcaggtccccttgactacagtggttgtagg
-ttcagacacaggctcacatccccacaagagctagtcttggggtttttgctgaggtcaatg
-gatgtgtgtggagatgtgtgtgttttcctttcctctctttggatctaggaggatatagat
-cagagctggtgggtgccacatgagggaagagcctctggagaatggaggccatacagcaga
-aacagagccaagagacacagacaaagaccaaaaagagtcatctgtgcatgtggatccacc
-ctggggatccataaattctctttttttctcaggtcacattgagttaggttttctgtcact
-tgcaaccagatgattcccgactaatacaGAAGTAGAGAGAGAAAAATAAATCAGATGCAG
-AGAGAGAAGCAGCAACCAGAACCTCACGGGCTCCTTGAGACAGAAAAAATTTCTGACTGC
-CTCCCAGTCCTTCCCAAAGCTTGGCTTGTCCCATAGCTCCAAATCCAGTGACTTTTTCAC
-TTGAGCTGGTTTTCTTCTGTCAAATTACAATAAAAATGGATGTAGCTCACTAGACAGCGA
-ACAGATCACGGTGGAGCAGCGCTGCTTTGGCGCGGATGAGGAACCTGGAGCACCACCTAT
-CCAACCTGATCACCCTGGTGCTCCAGGGGACACTGAGGTTCCAGGGAGCACACTTTGAAA
-CCCCCTGGGTCCTTCTACACATCTTGGCCTCTGTCGCTGTCCTCTCCCAGCTGAGATGCA
-CATTTTAAAAGCATTCAAGCTCTAGTTGCAACCTCCCCAAGTTTTCTTGGGCCATCACAG
-TGGATGGCAGGCACCCCATGTAACTTCCATTAACAACTGTCTCCCATAATCAAGACCATC
-CTCCCTCAGTCAAAACACCAGTAGGCCACAAAAGCATGGCCCTGTGTTGCTCCAGCAGCT
-GGAGAGGCTTAGAATGAAATCTGAGTCACTCCATGTTTCCCCAAGCACCCGAGGGATGAG
-TCCAGATTTGGATGTCCATTTTATGGAGAATGAGAGTGGAATCAAACACACCAGATTTGA
-CAGTTTGCAAAGTGATAAAGGCTTATGACAACTCTGAATGCGTGCATTAACCCAGGGTTG
-AGTGATCCATTCATTCATTCATCGACCcattcattcaacaattactgagcccctattctg
-ggtaaggtccagtgctaggACTCAATGGTTATGAGCTTTGGGGCagttgtgtgaccttgg
-gcaaggtactttacctctacaagcctcagtttttccagctgtaaatggggataataatgc
-ttatcttgcagggctgttgtgattaaaggagatggtacgtgaaaaactgttagctcagac
-cacctgcagcaggcatctgataaactgaagctaccattattATATTGAGAATGATGTGTT
-TTCTGCCCTCAAGGGACTTAAAAATCTAAAGACGTGTAACAATGCAGGTTcccaggttga
-tatcctggccccatcactcattgaatgagatccctcgtctctgtgggcctcagtttcccc
-atctgaaaaattgtggcagcaattcctacctccacgtgatttgttatgagggatgtgcaa
-accagcaagcactggcacacagtaggtgctcCTCTGTAAACCTAGGTTCCCTCCCTGTTC
-CCTCACCATCATGACACACAGTGGGACTGTCAACCAACATCTGGACCCTTGTCCTCTTTC
-CCAGGTGAGCAAACAAAAGCCAGAGATGTTGGTGAGGCTGGAAGGAGGCCAGCAGGGTCC
-AGGGACATGGTCTTTTGCCCTCTGGATGGTGAAGTGCTCAGGGCAGAGATACTAGCCAGC
-AGCTTTGGTCCTAGGTGAAGGGCAGGCTTATTCCTTCTTTTGGGAATAGGGAATAACCTG
-TGCCCTTCAAATAAGGGTCCCTAAGCTCAGGTTCACCCACATCCTGAGAACTGCCCCAAG
-CACCTTGTTTCAACAGGAGTCAACGGCTCAACATGTGCAAGTGATCGCTGTATTTTTTTT
-TTCCATTTCAGGGTTTTGAGTGAACTTAGGGTCATCTCTGCCATATCATGCCTTCCATCT
-GCCTTCACTCTGCAGAACTTCCCTGAGGGGTCAAAAATGCAGGGTGACATCTGGGACGCT
-GAAAATGTCATGTTCTCCTAGGCAAGCTCGTCTCCTCAGTAGCCCAGTGAATCTGTCATT
-GAAATTTCCTTAATACCCAAGCCAGAAAGCCTAGCCCCATACATTTTTTTTAAAAAAAAC
-AAGACTAAtttggatagatttctagcatttaaaaaatcaagagatttcacattaaaaagc
-tggaatttgaacttctctggaaaaagtcagaacatctaccaacactgggtctgctgtcac
-agggcagtgagtggttagagttacataaataaggcatatgttccccaggttactgcagac
-cctaccCCTCCCTATTGTATTTCAGATACTGAGGGAAAAGGTCAGCTGCCCTATGTTATC
-ATCCTTGAGCTACATCTTAACACCCACTTCACTCACTCACAATAGAAAACAATGTAGAGc
-aggggttctcaaacttgggcatgcatcagattcacctagagagcctgttaaaaacacagg
-ctgctgggccttaccctagagttgctgattcattaggtctgggcagggcctgagaatccg
-cattgctaacaggttcccaggtgatgctgacctttgctggtcctgggcccacactttgag
-aactactAGTGTGGAACAGGGTTAAgagccagactggttggattgaaatttcagctctgc
-cccttacctttgccatgtgaccttgacccagtgccttaacctcactgtgcttcagttttc
-tcatctgtaaaacaagaatcctcctggctgacctcacaggtgtgctgtggggGCCTGGCA
-GGGCTGACAGTCAAGCGGGTCTCCATGACATCACTGTTACTACCATTATTATCACCACCT
-GCCCTGCCTGTGTTGGCATTTGTGATCCTGGAACTGCTTTGACAATCAGTGCAGAGTTTT
-TGGTTTTGATGCCAACATTTTTGGGGGTAGAGTTTCTTCATAATTGGGGTGTGCCCTGGG
-AAGTGTGTCTTGCATGAGAACATCATGTCATGGTGAACTAAGGATTTAATACAGCTGTCC
-TGGAGGACTCCCCAGGGCTAAGAAGGATGGGGAAAGAGAGAAAGACACCACTGCCCCTGC
-TGAGGTCCCTGCTCTGTCCTTGGGGAGGACCCAGAACCATGCAGGAGGGCCCTACACAGA
-CAGTGCTGGGCAGCGCATCCTCCGATGCCCGCCTGGCAGTGCAGGACGCATGTCACCGAT
-GACCAAGGGAAATAAAAAACATCTGGGCACCCGCCTGCCCACTCAGGCCTCCACATATGG
-GAGGCAGTCGCCACTGCTGGAGGCTTGCTCAGAAGATCCCCCAGCACATTTCTGCCTAGG
-GGTAGATTGCACCATCTCTAGCAAGGGGGTGGGCCCTGGAGATGACTCCCAGCTTAGAGA
-CTCCCTGGGATCAGGGCTAGAGGTCGCTAGCCCACTGGACCCTTCTCAGCACTCAGGAGG
-TGGGGGGACCAGCAGGGCAGAACATTCAGCAGAATGTTGaggttgccttggctttggggc
-ctgacaaaccaccacttcctagctgggtgatattgggcaagtggctttactgttctgagc
-cttggtcttctcttctgtaaaatggggacgatagtagcaaccacctcccaggcagttgtg
-gggatgccatgaactcatctgcgcaaagtgcttagcacagctcacggcagatgaatgagc
-actccattactacttgattCATGAGAGATGCTCCTTTGAGGGCTGGGCCCAGCTTGGCTT
-GCTCACCTTTAAATCCCCACGGCCCTGCACATTGTAGGTGCCCACTGACTACCCATTTGT
-GATTATACCCATTATGCCCATTCATTATTTCTTAAATGAATGCATGAACGGTGGCTCAAT
-AAAGGTTCTCAAAAACTGCTCTCAGGGGGCTCACAGCCTATTTGGGAGGACCAGGCCCAT
-ACGAATGTGGAGAAAGCTGATGACCTCTGCCCAGCAGGGCTCAGAGACAAGTGAAGGACC
-CAGGCAAGGTGGGAGTGAAAGTCCAGAGACTGGAGACATCAGGGGTGGTTTTCTAGGGAG
-GCAGATGTGGGGACAGAAGCTGAGGCCAGGAGCAGGACTAGTTTGTGTAGATGGAAGAAA
-GGTTTCTAAGAGAGGTGAGTACAAGATGATATTGTACTCATTTGGTAGAAAGGGAGGGGC
-TTGAGCAAGGAGCAGATGGCAAATCCCCGCTAAGGTGCCAATACAGGACACCTAAGGGGC
-TAATGGATAAGACCCTCAAAATACAGTAAGAATAGGCacacatccaaaatggaaactttt
-catcctttgccctccaaacctgcttctcctgtccatttcagtcaatggctactccactca
-gggccaaagacttcagcggcatccttgtctcttctctctccctcatatcctactattggc
-ccatcaggaatccggtcagttccacttctgaaatatgtctgggaataatttctccacctt
-tcctgtccctaccccgttccctgctcctgccctgtttccccaccactcaccttccctggc
-catgctggcctcatcctccatgttccccatctgccaagaccactcccaccacaggacctt
-tgcacttgctcttccttttgtctggaatgcccttcccacattcacccgcaaggctccctc
-cctcaaatgtctccttgtggggacaagagtgattccttcttagatactaatttgccacgt
-caactcctgactaaccctgagtccagtaatgcctccaagatgtctagctgaagcattact
-ctctacgtagaaacacttatttgctgcgggtttcacttttcctccaaaacaaaccttgat
-gctgctgcaggaagcataggctatgacacccatagcacaatgtcagtcacctgtgcactc
-ctcccagagcacgcagacctttctccccaagatatgtaagccctgggtctggagagttac
-agcttggagatctacctatcttgaggctgcccaaatcttgctctgttcaaaagttcccca
-actaataaccctttaccaacaaattggaattggctgcctcattctttggtttcccagctc
-cttctgcatttggggtcgctttatgtatacggccctttcacagaacaccccttccctgtg
-atgcccccagacctcttgcctgcagcagcaccacacctacaccctattcctctcccacgt
-cgctatgttcttcatgccatttattcccacctgataggttctaaatttggcaagtgctgt
-tgtctctttcccaccagtgaaagatgagttccaggaaggcagggaTGAGCCACGGCACAC
-TGGACCTTCTCACTTATGCAGCACCTGCCTTCTCACTTAACCAATTCTTTGTTTTATAGC
-TGCTTACCATTCCGCATAGaggggctgcaaaactcatttaggtgctattatcacacccat
-ttcagaaaggaggaaactgaggttcagagcaatgatgctgcttgcccgaggtcacttaat
-aagtggagcagatattcaaacccaggcagtgtgactctgaacctgagggttatcctcagg
-ttgccacactgcAGCCTGGCTACTCAACATATCCCTGTGCGCCTCCTCAGTCCTCCATGC
-AGAGTCCCTTACCTACTGACGCCTTGCTAAGTTCCCAGTGCTGTGCTGAGGCCTTCTTCG
-GTGTCCGCTTGACCTCACCTGAGACAGGAAATTGGCCAAATGGTGGCAGTGCAGGCTGCC
-CCAGGACTGAACATGCCCCCTCTGCATTCCTCATCCATCCTCCCCTCACCCCCAGTAGAG
-AGTGAGCAGATCAATAGGTGTGTGTTCAATCAAGGGGTGAAATGCCCACTCCGTCTCTCA
-AATTCTCCAGGAGTGAGTCTCCTGCCTCGCAGCTGGGACTTGGGGAGGATGAAGAAAAAT
-TACCTGCTAAGTTGCAGCCTCTGCTGGACATTCTGGCCAGAATCCTTTTTAGACGTTGAC
-CTATATGGGCTGGTTGCAGGGGTGGAGAGGGTGGTGGTAAAACCGGGGTTCAAACTCACA
-TTTGTTGATTTCATGGCcagtggtgatctcagatttcaatccccatcagaatcacctgag
-gctgcttattaaaaACAAGAGGTGCTGTCGCCTCTCGACACATGCGGTTGTTTTAACGTT
-TATGGTGTGCCCAGGGTTGTACGTGCATGAACTCAGAGATCTTCAAAAACTGTCCTGTGA
-GATCAGCCAGGgcttcccaaactgtaatatgcacacaaagggatttaactcagggatctt
-gggttaaaatgtagattttgatgctaaagttctggaatggggccagaggtgctgGCCCGA
-GAACTCACTTTAAGAAGCGAGGCGGgagatgctgttatcattcctcattttacggttcag
-gaagtgaaggctcaaagaccaacaattataggtggtggcattagatttaaacccacagct
-gatgaaaccccagactcattctactgtgtcacactgccTTACCCTGTTGGTCTGATGATG
-AACGTGGAGCGGGAAAATGGGAGTGATACTCAAAAGGGGCAACCTggccaggcacagtgg
-ctcacgcctgtaatcccagcacttagggaggctgaggcaggtagatcataggaggcccgg
-agttcgagaccagcctggccaacatggcaaaaccccgtctctactaaaaatacaaaaatc
-agctgggcgtggtggtgcacacctgtaatcccagctactcaggtggctgaggcatgagaa
-acgcttgaatccaggatgcggaggttgcatgagccaagattgcaccactgcactccagcc
-tgggcgacagagtgagacgctgtctcaaaaaagataagatataaaataaaataaaataaa
-aataaaataTCAAATGGGCAACCTGACTCCTTTCGCCACTCATAGGAGGGGCATTTCCCC
-AAGCAGCCTGAGTTGGGGACAGTCCCTGCCAGGCCCAGCATGGCAGAAAAAGGAAGGGCT
-GGGTTCATGTGTGCCCGACATGTGTGTGTTTGGGGGACAGGGGCAGGTATGTGCCGACAC
-ACGAGACCCCTGTCTAAAGGATCTGCCTGTCCCCACATTAAAGCATAGAGAAGGCCTGAG
-CCCCTGCCCTATGCTGGTCCTGCAGGGCTCGGCTGGGGCCCAAATCAGGGGTTGACACAG
-TGAGAACAGGCTGCTGGTGCCTGGCATCCCCCACTTCCCACCCCACATCAACCAAATCTC
-TGCTTCCCCATTCTCCTGGACCTGCCCTGGACCACATCTATTCTGCCCTCCATTAGCTAC
-TCATTAAGAGAAGTTACATTTGTGTTTCTGGTGGGAGCCCTGGGGGTGCTGAGCAGCCCA
-GAGCAACCACTGGTGACCTTCAGAAAAATCATATTAAAGAAAAAAGGGTTGTTTTTGGAT
-TCCTCATCATTCGGCAAGCTGTGCTGGGGGTAGAGCAGCCAGATGAGTTCGGGACCGGGG
-CAGAGAGTCTACCCTCCAGCTGGCTTCTCCAGACCCACCTGCCCAGAGCTAGTGCCCTGT
-TAGCCAGGAACACAGAACTGTCACAAAGCTGTCCTGAGCATGAAACTGTTACCAACCAAT
-CTGTCCGTGGAGTTGTTACAAAACTGTCTTGTGTGTGAAGGTGTCACAATGTTGTCAAGT
-ATGTGACCTTGTATAAGAAATTGTCATGCAATTGTCCTATAGGTAAAACTGCCATGAAGT
-TGTCAAGCATATGCAGTTGCCACTCATTTGAAAAACTACTGGAGAAGAGTTTCTTTTCTT
-TTCATGTATGAGGGACAGGTTTGCTGTGTGGGTGACTTTGAAAAAGTTGCTGACAGGCAC
-TGTGCTTGGCTGCTGCTCCTGTAATAacagcgcccggcacccagtaggtgctcagtgagt
-acttgccgaatgTCTCCTCAGGGCTGCAAAGTAGACTCAGACAGGTTCTGGTTCTTTCAG
-GTGCTGGCTTTGTCCCGTAGTGGGCTGGTCTGATGTGACCTCGGGTAGGTCTGTTGCCTC
-TCGCATCCTCTCTGAGCCTACTTTGGTTGTTGTAAAGTGCCCTGAGGCCTGTGTATGACG
-TGCCCAGCAATACTGGGGACAATAAATGCTGGCTGCTAATTCCCTCTCCCTCTTGTCGGG
-GGTTTATGATTCCTCAGGGCTCTTGATGGTAGCAGAGGCCTCTCGTGGCTCTTTGGGAGG
-CTGTGGAAGCTTCAGCTTTGGCTGAGTAGGACGTCTGCAGTGGCAGGACACCTCCAGCCA
-ATCAGGATGCTCAGTGTCACAGGGATTGGGGGCAACGCCCACCGCTACAAACCCAGGAGG
-CCTCCTCTGGGGAGGATGTGAGCTCCAGGATTCCAGGAAGGGTGGGAGGAAACCTTCTAA
-GGGGAGCTGAAAGCTCGTTGATTCCTAAGATGAGCCCGAGTGAGAAAGGTACCAGGTTTT
-GAAGTTTGTTCTGCAAACGACCTTCTTCACTTTTTTGTGAAGTCCTGCaatcaacagagc
-tcagggctaggaattaggacctttgctcctgtcccaccttggactcagactcattgtatg
-acctttggcagagcacctggagcttcCAAGGGGTGGCAGAGAGTTGGGAATGCAGTTTCC
-TATCGGAAAAGCAGAGCCTTGGTCTTGATAAAGAACTTTTGAACTTTTTCTTAGCCAAGG
-GAGCCTTCCTTTTTGCAAGATGAAATGTGACATGAGAGATCGATTCCTAAAATGAATGAG
-TTGAGCTGCTTTGGCTGAGGCCAGGATGGGGGTGAGGGTGAGCATCTTGAGCTGTCTTTT
-TGGTTTCCTTTGCCTACTTCTAGAGGCAGCCTCTGAGAGCTTGGATACCCCCTAAGGAAC
-CTTTGAACCCCAGAGTTCCACAGTGCTAATGGCTGCAAGGCAGGTGATATAATTTTGTGG
-GACTCTGGAGCCTGGGTTCATTCCCACACtagcttctctgagcattggttttcccgtctg
-taaatggggataacgactatgctcacatgttgtgacagtgtggtaagctggttttgtgtg
-tggcatgccaaaacagggtttggctgacatggggtgcacagcaatgtgggAGCTGCTAGC
-AGTTGTGGATCTCTTCTTTCACAGGCCAGACTGCCTcaacaatcctgcaagatgggtagt
-attatctggtcttgcggacaaggaagctaaggcacagagaaggtaagtaagttgcccaga
-tcccatagctggtgagtggcaaactcaaagccaggcagtctTAGTAACAGATAGTTATTA
-TTATTTTAAGTACTGGGGAGAGTCTAGGCCCCAGAATAGGTCCAAAATAAATACCCTCCT
-CACCTTACATAATTAAGCTCTAAGAAAGCTTAGAAATAggccaggcacggtggttcacac
-ctgtaatcccagcactttgggaggctgaggcgggtggatcatgaggtcaggagttcaaga
-ccagcctgaccaagacggtgaaaccccgtctctactaaaaacacaaaacacctgcaccag
-gtgtggtggtgcgcacctgtaatcccagctacttgggaggctgaggcaggagaatcactt
-gaacctgggcagcagaggttgcagtgagccgagatcatgccactacactccaccctgggc
-gacagagtgagactctgtctcagaaaaaaagaaaGCTGAGAAATATAATCAGCTCCCAGT
-GCTGAGAAGACTTGGGGCCCCACTGCCAGTGAGCATCAGGAAAGGGGGCCAGGTCTAAAA
-GTCAGCGCTGACTGAGGCAGGTCCTTGGTCAGTGTGTCCCTGCCAGTGTTCCTGGGAAAG
-CCCCAGTTCTTCTCAGCCAGCACCCTGGGTACCTGGAGCTTCCAAGGGGTGGCAGAGAGT
-TGGGAATGCAGTTTGGGCCTCCAGCCCAATGCTCCATGCTCCTTGCCCAGTAATCACACC
-TGGCACAAAGTGAGCATCTTCAAGGACCCTATTCTGGGTCTGGTCTCTCCCCATGGGCCT
-TCTTCAACACTCAAATCCTAGTAGTACAAGGGAGAGAGCCCCAGATGTGGACTcttgtcc
-agttctgtgtgtcctcaggcaagtgtctccctgtctctgggcttcagtttctccatctgt
-caaatggatggttaaactcagtgtttctaaaggcccACTGTTCACccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccccatccatccatccatccatccatccatccacccacccacccatctatccatcca
-ctcacccacccatctatccatccatccatccacccatccatccatccaccaacccatcta
-tccatccaatcacccacccatctatccatccaccaacccatctatccatccactcaccca
-cccatctatccatccatccatccacccacccactcatctatccatccatccatccatcca
-tccacccacccacctacccatctgcccacccatctatccatccccatccatccatccatc
-catccacccacccatatatccatccactcacccacccatctatccatccatccacccacc
-cactcatctatccatccatccatccatctatccacccacccacccatcatccacccaacc
-atctatccgtccatccatccattcagcagatatttcttgaatatcatctatgtgccaggA
-TCCTTTATTTATTAAAGTTAAAAGACAAATCACAGACCTGTAGAAACATTTTAGAAAGAC
-ATACAAAATCATACTGGATTGGAAATGTAAATTTCCCCAGGACttttgttcaccagtgac
-tctccaatgccatgcatggggccacatgtctactaggtgctctgtaaaatgtttattgga
-tgtaagaatGAATAGGACATATTTTGCTGTTCTAAAGAGAGCTGCCTCCGAGTCTGAGAT
-TGGAGTCAGACATCCTCTCTAGGACTTATTGAGAGGGGGCCAACTATCTTTGTCACCCCC
-ATCCCTGACCTGCCCCACTGCCTCCCCAGCCCATATAAGCCAGTTTCTAAAGAGGATCTA
-AGGAGGATTGGCCAGCAGTGACTGGGGCAGGGTAGGGCACGGCATGCCCCCAACTCCCAA
-GCCCAGGTGGGCTCATGGTTTGGAGGGGAGAAGCTATGAACCAGAGGGAAACAGGCATTC
-CATCCCTTGATTGAACTCACTCTTGTTGATCTGCCCTGTGTCCATTGGGAGTGAGTGGAG
-AATGAATGAGAAATGCAAAAGGGGTGGGGTCTGGCAGAGGCAGCCTGCATTGCCACCATT
-TGACCAATTTCCTGTCAATTTCCTATATTTGGTCAAGTGGACATTGAAGGAGGCTCTTGA
-GCTTAATCTAAGCCATGGTTTTCCAGCCCAAAGGGGCATGAGGCTGTTGAAGTGGGGATG
-GGGTAGTGAGGAAGCTAGGGTGATCTGAAGAGGTCAAGCTCGTGCTCCTTGCTCAGTAAT
-CACACCTGTGTACCAATTAGGCACCTGCCACACGTGGGAGAAAGGGGAGGGCATGGATGG
-AGGCAGAGGAACATTTAGTCCCAGTCCCTCCCTGCTGCTCACTGGTGATGGCCCCAGAGT
-TTTCTAACACCGGGAATTGTGGAGGCCACAGCAGCATCAGGGTAGTGACAGCTGTCTCTA
-TCCCCATTCCTTCTTCTGCTCCCCAACATACAGGGGAGAAATCAACCCAGAGGGAGGAGA
-GAAGAGAATGAGACAGCATGACATATCTCCCTACAGGGCAAATCAGTGGAGTCAGAAGCT
-GAGTCAGGCAGTGATGGGGAAGCAGTGATGGGAAAGGAGAGCTTCAAATCAGACCTGTAT
-TTTAAAAATTCAGCACTGGACTAGGCTTTTTAATAGCTGAAAGTTACCAGAAAGCTTTGA
-GATCTGCCCAAAGTTATTAAGGATTGGAGTTTAAAAATACGACTGTGCATTGGGGGTGGG
-GGGTGGGGGGTGCATGGAAAGCATGCCATGTTTGTAACCCTCTGTTACAACTTCAGTATC
-ATCATTAAGCCAGTTACACACAAAGTAAGCCAAGAAtatccttaatacacaacgagctcc
-tataaatcaataagaaaaaggggaatgatccaagtgtgtggagggagaatgggcaaagac
-attacaaggaatttaaaaaagaaagacaaataggacaataaccatacgcaaagctgttct
-acttccctaagaattttcaaattgaagatgagaacaagaatgaaataccaccatgaccta
-caagatacggaaactgtaaaagactCCGGCACCCTCTTTTGAGAAGGCAATTAGGCAGAG
-TCTATTATCTGTAGCCTGAGGTAGTAACAGcattttacaggaagtgtcctgagttgagag
-aggggtaggcacttgttagaagccacacagtgagtcatgggaggggaggagctagaactc
-agacctctggaTGGGCACCTTTGATTCTTTATCTCCAGCCAGCTGGTCCTCTCTGTCTGG
-GCTAGTGCACAGCCTGGCCCCTGGCCCCTGTCTGGGTAGCCCAGGTCTGCTACATCCATT
-GCTGCACCCTGCTCTGGGCCTGAGGATGGTTGGGGCACTGCTATTCCAAATGACACATCT
-CTTATGATTACCCTGTCCTTCCTAGACAGGAAGCTTTCAATTAGTCCTGCTGGGCAGCAG
-CCTTAGAGGgtagaggtaggactccaaggtttgggatgagacaaacctgttctcaaatcc
-cagccccacctttactccctgggacagttacttaacctcagtttgctcatttgtaaaaGG
-AACACTGTccaggtgcggtggctcacacctgtaatcccagcactttgggaggctgaggtg
-ggaggattacttaaggccaggaatttgagaccagcctgggcaacatagtgagacccttat
-ctctatgaaaataaaaaaaaaaaattagccaggcatggtgatgcgtgcctatagtcccag
-ctactcaggaggctgaggtgggaggactgcttgagcccaagaggtcaaggctgcaatgag
-ctaagatcgtgctattgccctccagtctgggtgacagagagagaccctgtctcaaaaaca
-aacaagattaaaaTGGACACAATCACCCACCCACTGAAAAGCttgttccttccacagata
-tttattgagggcctactatgtgccaggcacttttcaaggcactgcagatacatcagtgaa
-tgagacagaccttcccctcatgaagtttacatcctaagtgggagagggagatcatttcag
-agaacgacagggaattgaatttgggtacacagagtggcaggagggagggcctgggctgcc
-tggaagggcatctctgagatacacaagaaagcactcttggcggagggaccagtgggtaca
-aaagcccagaagcggcaaagaacgtggtgtggaagagagcagcaaggccagagtgcagtg
-actgaggggagagtggtgggtggtgaggtctggaggcagaggggccagacccccaggaca
-catggatgagtttggatggtgctggattttcctggaagtgagttgggaagccactgtggg
-ttgcaagccgaggagtgtctgccaccttgaaagcttctctggtgctgaggggaatggact
-gtggggcaggagtagaagctgggagctcagggtgtatgggctgtggtcattctggtggcc
-tggacgaggctggcagctatgagaagtgggtggatccagggagggtggacagacaagctc
-tgctcatgggttATCATGAAGATTAAAGGGTAAGTGACTCAGTCCACAGTGCAGCACATA
-GCACATGCTAGACAGATCTTAGCTGttttatttatgtatttatttatttttgagacacag
-tcttgctctgtcactcaggctggagtgcagtggtgtgatctcgactcagtgcaacctctg
-cctcccaggttcaagcaattctcctgcctcagcttccctagtagctgggattacaggcac
-ccaccaccatgcctggctaatttttgtaattttagtagagatggggtttcaccatgttag
-tcaggctggtcttgaactcctgacctcaagtgatccacccgactcagcctcccaaagtgc
-tgggataacaggcgagagccactgcgcccagccAGATCTCAGCTTTTAAGAGGCCTAGAC
-CTAGAATCCCATGACTGTGTCTACCCCACAGCCTCCTCCATAAATGCCCCAAATCGCTTC
-TGCCTCTCCTGGTCATTGGTTCAAAATGTGATTCCTTGACCTCTTGTTGCCTCTTGACTT
-TTGCAGCTGCTGGGATGAAGTACTTGTTCTGAGTTCCTCTAGTTGCTATTTTAAGCAGAC
-TGCATACCCTCCGGCCCCCATCTCCCAAGCTGGTGTGAAACCCAAGGCAGTATCTGGGTG
-GCTCCCTAAGTCGTTTTCCAAGTTGAGAATAGGTAGTAGAGTCACCTATTCTCACAACCG
-TGACATTCCACCCAGTCCAGGCTCCCAGACTAACTGCCCAGCCCCTGGAagtagagagat
-gggaggcagcaccaggcagcagggaacccaggtttgagtcccagctctgccaccttgacc
-ctaggaaggccctttgacctctctgagtctctgcacctcttctgcaaaataggaatgatg
-atattaaagaattgcttgcagggtaaagtgaggtaataacctgcggagcacctggctgtg
-tgcccagctcatatggcaaacactcaccaggtaggagGATCCTAAGGTTGTGGGCaatgc
-atacaaagcctctggtgcattgtaggtgctcaataaatggtagGATGCCAGTAGGGAGGA
-GTTGAATGAGAAAAGGGGAAAGAGACCCAGTGCATGGTGGGGGTGGCAGGAACACAGGGA
-GTTGGGGGCTCCACCTTGGAAACCTCTCCTGGCCCTGGGGGCACTATCTCCACCAAACCC
-AAATCCAGGCAGCTAGAGGGACCTGGGCCTGCACAGGCATGGAAATTCTGCACTCACTGT
-TAGtgggcctcagtttcctcatccgcgaagtggaaaccataacccttcttaccCAGTTAT
-AACCTGGATTCTGGGCTGGAACCAAGATAAGCAGCTACAGGCTGTCCTACCCCACCCCCA
-GCTGGAGACGCGGGCCTCTGGGAGCTCTGGCCGATTTTCAAAGGGACCAGAACTGCAAAA
-AACAGAACTAGGCTAATGCTGGCtgagtgttcacagtgtgccaggacctgtgccacccag
-gtccttgtactaaatcattaaaacttgccataaccccacaaggtgggggctacacttact
-ccattggcagggatgagaaaactgaggctcggagaggtaaagggcttggcccaagcattc
-acaggaggagccaggaggaatgcaaaactgagcccagctcctaactACTGGAGAGGAGCC
-TGCCTTGTGGTCCGTCACCCCTCCCTGCCAACCCCTGCCAGCTGGGCTTCCAAAGGCCGA
-CAAATGCTATTTAAAGTCATACGTCTCTCAGGTCCCGAGGCACACCAGGGATGGACCCTA
-AACTGTTTGTGGGGGCAGACAGGAGTTATATCAGCCAAGTGAAGGCAGGAGGGGAAGGCT
-ACTCCAAGTGCCTTTAGTCTGGAACTGTTTGCATTGCAGGGATGGAGCCCTTAGTAGCAA
-CCTCCAGACAGTCAAAAAAGCTGGCTTTGCACACAAACATCCCAAGTGTATGTTttcctt
-cattctttctctttctcttttctttttccttccttccttccttctttccttccttccctc
-cttctttccttcctccctccctccctccttccttcctttctttttctttcttctttcttt
-cTCAGtctctctctctctttccctctctctcttcctGGGGTGGGGAGTTGTTGATGCAAG
-AGAATGAGATGATCCACAAACTGAACTGGTTCAGCCAAAGCAGCCCTCAGCCAGGGGCGA
-GCGGGAAGTGTAAGCTGTTGGCTGAGGATTCTCCTTGTGGGGGATTTTGAGCCCCTGTGG
-GGTGTTGTTCAAGCCAATGTCACTCGCCTCCAGGGGCAGGGAGTCTCCAGCTGATGTCTC
-TCTTAGAGGAAAATTCACTGCTGTTGAGCTTACTACCTCCATCAGAGTAGGGGAAAGGGG
-ACCCCAAGGACAGGGTCTGGCTAGCAGCACATGCTCCGCAGATGCGTGCCAACTGCAGGC
-TGTGATCCTAGGGCACAGTCAGGAAGGGGCGTGGACAGAGGAGCATTGTCGCAACTGAGC
-GTCCCACTAGCGTCCTCAGGAAGGCCCGAGGGCTGCTGCAGCAGCACTAACACTTGGAAG
-AATCCCTCGCGGGAAGGGTGGTCCAATGTTGAGGAGTAGCAGATCCAAGCTCACACTCTG
-GAGTGTGACtttgcttgtttattttaaaagaaggggtctcaccacattgcccgggctggc
-ctcgaactcctgggctcaagccatcctcccacctcagccccgtgagtagctgggatttca
-ggcgagagtcaatgcacctggcTCTGGGGTGACTTCTTGTAAGACCTTCTCATACAGACT
-TTTTAATAAGATCAGAAAACCCAGACCATAAGGCAGAACAAGCCCCCTCTCCCCACTCAA
-AAACCAATGGATTTGACCACACTGACAGCATGGTAAGCAATGATTTCTACTCTCCAAAGG
-TGaggactctacaaagtcagattaaaaaagattttttttgtgtcaaaatgaacatgggat
-tgatatctaggtaatacaaggaagccctacaaattgacaagaaaaattcaggaattccaa
-ttttaaaagtgggaaaaataaaaataaaatgtttaaaaagtgaaaaaataaaatttaaaa
-ttaaaaatcaggtgaataagaattacatgattaaaacaaatttaaacagttaaaataaca
-ttcaaaaacgaaattaagtaacaaaataaaaatttaaaaataaggtataaaaataaagtg
-taaaaatccattcaaataaaaaatacatttgtaaaataatttaaatacattaaaattaat
-aaaaacaaaaatgttaaaaataaaagtaaaatgtttaagtgaaataaaatttaaaaatgt
-aagaatacatgaaagaatttttacgagtaaaataaaaaatcagctatttttaacaatcta
-aagaataaagaaaAACTAATAGAAACATCAAAGGAGAGCAAGGTCTTGCTAGATGGATGC
-TGATGATGTGCTGTGAATTAAGGAGTCCGATTGGCTCAAATGCCTGCAGGGAGGCGGGGG
-AAGTGAATGACGGGGGTGGTGTAGGGAGTGAGAGGGGACGAGGAAGTAAAAGCATGCCCG
-CAGGCAGCATCTGATTCGGTTTTTCCAGCCCGCTGTGGGCAGAGGGCAGGAAGTCAGGCC
-CCATCATGGCTTCCCCCCAAAATAGCCATCACATCATTTATGCATTTGTAATGTGCTGGC
-AACATACGCACACGCACACGGATGCATGTTACATCATCCCATCCTCACTGCCCCATCCTC
-ACTGCTGTCCTCTGAGGTCCACTTTCttttttttttttttttttttgagacggagtttcg
-ctcttgttgcccaggctCTGAGGTCCACtttcatagaggagtgaacagagactcagagag
-ggtgggtcactgtgccacagtcacacagcACTTAGGACCACCCTATCCTCTGAATCTGGC
-ATGCTCAAAATGACCTTCTTTGGATGAGTTAGGTCTGCTGAGCACTTTCAAACAGAGGCA
-GGGCCATCTCTGACATCAGGCTCGAACGTTCTGTACACTAGGAAGAGCCCAACCTCTCCC
-CCCATGACGCATGACAGTTATCaccattaaagaaacactgactgtcttccaggggcgtca
-catgcatagtcatcttgaaaaccatatgaggtagatgctcttattgtccccattgtattg
-acagacaacatcgagattcaggagtcaaatactgtcacccaagcatggcagtaacagaac
-tgggagctgagcccaggactgtccacagcccaaatctcacactccctgcgtggcaccagg
-cCCTTTTAACCGTCATTGATGAGCACTCCCTATGTACCAGCAATGCGTTTGTCTATGTTT
-CATGcctcattttgcaaattagccaacgggggcacagaagggagagatgacctgcccaag
-gtcactcagccagtaagtggcagagccCACAGCCTTCGTGACAGCCTGCCAAGCCCCCAG
-TGCTCATCCGGGACTTGCTAGAGACAGCTGTGCCCACTGGCCAACCCCAGATCAGGCTCA
-GAAGGGCAACTGTGACATTCCTTCTCTTCATGTCTCCACCCTGGCGGATGTGGGCTCTGC
-CATCGGGCTCCAGGGAAAGTGGAGGCTTCCAGTGAAAGGGAGTGGTTTCCCCATGTGGCC
-TGGGTCCTCTGGGCTTGGGAATGCCTCTGTTTTGAGCTGGTGAAACAGAATTTCCCACCC
-CCTCCGCAATGGCACATCAGAGCCCCCACTATGGGCCACAGAGCAAGGGCCCTATGAATC
-ATGCTGCATTACTGCAAGAAATCATTCCAGGGCAGGCAGTGGCGGCCCAGCATGGGACAG
-CAGTGTCCGGGTGGAGTTGGCGTCACCCATCCGGAGATGGGAAGCAGACCATTCCCGAAG
-GGATCTGGAAGAATCTCCGAGGGCGGGGCTGAGGGCAAATGTGTCCTGGATGCTGCTGTT
-CCACCgggctaggaaaaaaagctccagcccacagagacctgggagcacatcacgaccttt
-ccccagcctggctgtgtgtccttggcaagttgattcccctccctgaatgtggaaggcctc
-atctgtagaagagggagaataatagggtcaagccacttcatggggctataatgtgggtAG
-CCTGGGAGGAGGGCtggcatggtggttatggactcaggctttggaatcaattgtctggat
-ggaatcctggtttttgccaaacttactctgccaagctgtgGggtagaaacatgaaattgc
-taatatttggctgtttatgacctagaaaaatggcaactgcatatacttcaaTGAATGTGC
-CTctcttttaactgcttcctcctctgtaaaatgtgggtaataacaggcccctcagagggg
-tgctgtgaggatgaaataagGCTgggaggcaattaagttcagtagttagagctgggctct
-ggggcaaggaaggatttgaaccttggctgagtggccttgggcaaagttacttaaccttcc
-tgtgcctcagttttcttgtctgtaaaataggaatgctactgcccactgcacaggtttatt
-aaggtaatttaatcaattaatacatacaaagtacatagaacagtgtctgAAATTGTTACA
-TAAAAGAATGCAGGTAACATCTGGCATCTCCTGCACCCTCATGTCTACTCACATAAATGC
-TCAACCACGAAACAAAATCCAAAGTGACTTTTGTAAACCTTTGATGCCAATGAAAGTTAA
-GTATTTTTAAAGAAAAAATATGTTTTGGGGAACATACATGTGTGTAGAGATGTAGGTGAG
-GAGTGTGCTCCCCAGGGTCCACCCCCAGGGCTGTTCTATGTCCTGATGGTGCCTATAGCC
-CAAGACTCTGAGGACAGGACTAGCCTTGAGGCCATGATGGCCCCGTGGCTTGGTCTCTTT
-CACAAAATCACACAGCCAAACCTCAGACCCTATGGAGAGGCTCCACTTGCCTAGGTAACT
-CTAGAGGCCCTTAAGAGGCACCCAGCCCTGGGCTGGCCTCTGATTATTAAGAAATTCCTG
-CAGACAGCCTTGGATGTGCGAAAGCCCTCCAGCTTCCATCCTGTCTTAAtttttttttag
-acgaagtcttgttctgtcacccaggctagagtgcagcagtgcaatctcagctcactgcaa
-cctttgctttccaggttcaagtgattctcatgcctcagcctcctgagtagttggtagttg
-ggattacaggtgtgcactaacacacccagctaatttttgtatttttagtagagatggggt
-ttcaccatgttggccaggctggtctcgaactcctggcctcaggtgatctgcctgcctcag
-ccttccaaagtgctgggattacaggcgtgagccactgcgcctggctCCATCCTGTCTTCT
-GACATTTGTCCCAGCCCTGGGAAAAAAGGCAAAGCACACTGAGCATTTCCAAGTCACGCG
-GGGGGAAACTGAGGCTCTGAGAGGCTCTCAACCTATCAGGCTCTGGAGCAGGCTGCCTTC
-CTCTACCAATTCAAGTTTTGCCTTCACCGCTAGTCTCCTgaaccctcacttctactcaca
-gctgggtgaccttgagtaaggtacttccctgcttgagtctccaattttacaaggattggt
-ctcaaaggtctcacttggcctttttggccttatcacttcattattctaGAACCCTTCTCC
-AGAATTTCAGAGAGAAAATGAAAGCTGAATTGCTCTGCAAACTATAAAGTGCTACACAAA
-CAAGAAGGTGGTTAATGGCAGCATTAGATGGGTTTTCAGAAGTCTACCGTAGGCAGGATT
-TGCTGTgggttttggaattaagaagacccagctcacacatgtatttgcgacgttactttg
-gataagccagttcccctctctgaaccaacttccctcttctgtaagctggcggtagaggca
-tatccaccaggcaggactggggtgaggaccaaaggaaaggagcgtgcaaTGTCTGCCACG
-CCCTGGCCGAGCAGAGGTGTTTGATGCAGGAGGAGATTTAGGGCCCCGACACATCATTCC
-ACCTTCCAGGAGCTAAAATCCACACACCTGGGGAATGATGTAGCTGTCAGATTCAGGGCG
-ATTAGAAACAAGCATCTGAACTAAGGCAATTGTTTGgagctccagagacagactctctgg
-gcttacatcccagcacccctgtctgttgctataccacccactgggcctcagtctcctcat
-ctataatataaagatcctcctggaatctgccccttacagctgtcaggagggcctccatta
-ggccatgactgaaaggggctgagcacagAAGATGGGCTCAGCTGGTCCAGCAGCCTCCAC
-ACTATTTTGACAATGGTATCAGTAGACACAGTAGTacacacgtgcacatgcatgcacaca
-ctcacatacatccacatatatgtgcatgcacactcacCCactcatacacccattcacata
-tatgtgtaaactgaaacacatttctcaaaataatagttttcacacttgcaatgcactctg
-atatattctaaaaaggaggttggcaaaaatcgcagcctctggaccaaatttggatgtttt
-tgtgttgcctgtgagctaagaagagtggagtacatgacagattgtatgtggtttgcaagg
-cctaaagtatttactatctgacccttcgcaaaaaatgtttgctgaccccactctatttta
-gtcagtgctattccattccgttctgttccgttccattccattccgttaccattccattcc
-atttcattagaaaatgctggctattgctaaatttattgtcctcacctgctgatgcattgt
-aaacctcagcttggaaaacTTTAAACTAATGGGAGCTTCAGTTTTTTCACCAGATGGGAG
-GATGGATGAACAAACCGTATCCATGTGACACCTTAGCCAAGCAACCTCCCCTCTTTGTCT
-TGGATTCCTCGGCTGAGGCTGAGACCACCACCACCAGCCTGCTCTCAAGGGTGTGTTGAG
-GTGCAGCCTCAGAGGTCTTGTCCATGATGTTCTCATTGACGGATCTCaagagcccaatag
-taaatactttaggctttttgcaccacatacgatctgttgcctattcCAGTATTCTTAGCT
-TGAAGGCCATACAAAAATAGTCCTGTGGCGGCAGAAATGGAGGAACACCCAtctctgctg
-tccttttcaatacccagcccagggcctggcccacaggaaggacccaataagtatttcttC
-ATGGTGATGGTGACTGGAGAGTGGCACCCAAGGCCCTCCATGACGGGACTCTGGCCCAAT
-CTGCAATCAGAACTTCACTTCCTTCGGCCACGCAGTCCCTTGTCCCCTCCACCTGGCCAC
-ACTCTCTCCTCATCCTGCAGAGGTCCTCACCTTACTGCCACCTCTGCCTGACAAAATCCT
-AAATCCTACTCCCCCCGATGGGGTTCCTCTCAGACACTTACACCTTGCAGCCCTGGCAAA
-TCACTGGCATGATTCATTTCTATATCTATTgcacgggcttcggagcctccaaaactctgg
-gtccaggtcctggctcagcagctgtgagctctttggcaggccattgatgctttctgagcc
-tcagttcccgtgtctgggaaataggcataacaCAAGGCAGTGGCAGAGTGAGGACGCGCA
-GCCCCACCTGCACAGCTCCTGGCACATGGCCCGCCTCCCTCCTTCCTCAGTGGCCTCAAT
-CTCAGTGGCCTGAATCTCCTTCAGTGGCTGGGCAGGGGGGTTGGATGGTTTCCGTCCACA
-GGAGAGGGAGGTGGGGCCCCCCGTGGTGGGGCAATGGGATGGAAAAGCAGCATCTCTTTT
-GCACCCAGGCTTGGCTTCAGAACGCTGAGTGGAAGAAGGATGGCAAATGGAGCTCAATTG
-ATTGACCACCTACTATCTGCCAAGCATTCAGATTTCCATTTCTCAACCAGCCCCTATGCT
-ATGAAGAAACCGAAGCCGAGAGACCCAAGGTTACATTCTATTAAGACTCAGCGCCATTCC
-CTCAGCCCTCAATGTCCAGTCATTACCCACCCCTGCCCTGTAGGAATCCCTTTCAGAACT
-ACCCCTGCATCTAAACCTGGCTTCACCTGGATGCCAGCACTCAGGGGACATACTTTGTTC
-GTGCCCAGCGATGGCGCCTGCTTGCCCAGGGCCTGGTGCATCTGTCTGTGTACAGGAGAC
-AGtgctgtctgcctggccctccacaaggggctttgcaatttaaacggaagcatcatattc
-actccacataacaggcctctggagtgggcactgccacagtcaatttacaataaagaaaaa
-caagctcagagagaggagaaggtttgctccggatgcaccacaagcaagaggcagaggtga
-gcttaacccacgtgagaccccactcccttccggtccagggcatgtctgctctgcTGTAAA
-ATGGGAAGGGAAAGTGGTCAAATCCttatgaagcccctactgtgtgcctttggccccctt
-ccctcttggactgcagtaaatcttcccaattgctcagagaggtaggtgtaagttttccca
-tttcacagatggggaagcacggacgggagaaggcatgtggcctgcttaatgtcacatatc
-tagggcaggagagggctcaaggtttgatcccagggctcttcactTTGCCCCTTGCTTGCT
-CAGGTCTAGAAAGATCCAGAAGCTCCATGTGAATGTGGGGGTCCCTCCCCAGAAGGCCTT
-GGATGTCAGGGAAAGTCAGTCACAGGCTGGCATCTCCTCCTTGCCCAAATGGACCTCCAG
-ATCTAGGGATGCGAACCAGGGCCCCCTCACTCTGCCCTACTGTCCCATTGCCAGGACacc
-ccagcatgtttcaaaaaaatgtccccatctggttctgattcatttacacttcattaatca
-acatgctgttttgtaagagacacttgagatccaagaatctttctcaagtcttttacttca
-ttctttcttagaaacagaaaaattgggcttcattaagaCGCAGTGACGCCGGAGCCTGAG
-GAAGGATGGGCCTGTGGGAACCAGGCCTCAAGCAGGCTCAGAGAGGGCAGATGCCAGCCC
-AGCACCTCATTCCTCGGGATTGTGCAGACCTGGCCAAACGCTAAGGCCAAAGACTCAGGC
-ATGGGGGAGGCTGGAGAAAGGTGGGAAAGGGTCATccctctatgttggcagctccccaag
-gacaggcccagggctgctcacctgggtatctccaaggtccccaacacagagcctggcaca
-gaggctgccctgtgaaatgaacaagtgaatgaatgaaGCACTGCCAATACCCAGGTGTTT
-TCAGGACACATTCTCCTGCCAAAGTTAGATAAGGTCAAAGCTGGTAGGACCCTGAGGGAT
-TGTGTACAGAATTTTCCAAGCAGATGCCTTATGAGAAATGGTCTCTGATGTGTAATATGT
-TTGGGAAAGGTCACTCTCTCTCGCtctctttttttttttttttttttgagacagggtctg
-ctctgtcgcccaggctggggtgcagtggcacaatcacggctcactgcagccttgatgtct
-ttcctgggctgaagcgatcctcccacttcggcttcctaagtagctgggactacaggtgtg
-caccaccaccaacatgcctggctattttttgtatttttttatagagacaaaaaatgtatt
-ttttgtagagttttgccatgttgcccaggctggtctcgaactcctgagctcaagctatcc
-tcccatcttggcctcccaaagtgccaggattataggcttgagccatcgcacctggGTTAC
-ACTGTCTGTCTCCACCTCTTCAGCATgctctgataagtctcacagccaagaaatctgcta
-aacccagcatttcccaatctatttgaccagaactCCTGTGGCTGCCTTGCAAAATATGCT
-ACAGGAAGGGTTTATCTAGCTCTGGTCCCCACTGCAGTGCCAGTGGGAAACTGAGGCTAT
-GGGCGGGGGACAGAGAAAATCCACTCACCCAAGGTCACATGATACAACTGGGTCAGGGGT
-GTGACTGAAATCCAAGGCTATCTCCATTGTACCCCAACAAATAAATGGAGCCCTAAGCCT
-CTTCTGAAGATGCTAGGCAGGTGTGTGTCCCAGAGGCAAGAGATCAGGTACTGGAGGAGG
-GATGCTGAGAGCCCCTCACCAAATTGCGGCCATATCCCTACCTCCTCACTGAGCTCCTGG
-GGAGGTGGTGGTGAGCTGTAGATGGGGCGGGGGGCAAAAGGGGCAGGATAGGAATTTTTC
-ATTTTTCTTTAATTTTTTTGTCTTTTTTgagctgagaagcatcttaaagtcttctaaacc
-agctcctttttgttgttgttgttgttgttgagacagagtctcactctgacacccaggctg
-gagtgcagtggcatgatctcggctcactgcaacctctgcctcctgggttcaagcgactct
-cctgcctcagcctcccaagtagctggaattacaggcgcccgccaccacacccagctaatc
-attgtatttttagtaaagacagggtttcatcatgttagccaggctggtctcaaactcctg
-atctcaaatgatccgcctgccttggcctcccaaagtgctggtattacaggcgtgagccac
-cacacctggcctaaaccagctcctctttagatgaggaaactgaggctctgagaagggaag
-ACCAGCACACCTCAGAAGATATCTTCTCAGCATTATgtcaggcagattgggattcgagcc
-tgctttgctactcacctgctgtgcgaccttggacaagtcagtttccttctctgaacctca
-gttccctcatccagaaaacaagcatCTCTCCCCTCCCTCCACTAAGCCACTGTGAGTAGC
-CAAAGACACAGTGGACAGGAAATGAGAATGATTAATACTTACGAGCACCCATTAGGAGCC
-TGTGTCCTTAGCTACTCATCTTGCCCACAATCCTCCTTATGAGCAGGATACTTAAGTAAA
-AGATGGGTTGATGAAGGGAAAGGGGGTTTGTTTGATTTTTTGGTATTGTttagaatggag
-aaagatctcagagatcttctaaaggaccctcagatgggtaaagtgaggattggacaggca
-aagtgacttatccaaagtcactcagttggtaactggggaagctgggatttgaactcagtt
-gacctggctccagagcccatgcccctaactactaAACAAAGGCCATTCACAAAGGAGTGT
-CCCCATAGAGTCCCAAACTCACCCCAGCTCAGCTGAAAACCACACGCCTCTCTAGTCCCT
-TGTCCCACTGTCACAGCAAGAACTGGAGCCTCTTGGGCCACAGTCTCCCCAACCCCATCC
-AATCCCACCTCCCAATTCTCCCACAGCCTCTGTCTGCTTCCTGCTCCGTTCCAGGAGTGA
-CTGTGTCGCTGTAGGGCTTTCACACAAATGGAAGGCCCCAGAGGGCAACCCATCCTCTCT
-CATTTTCCTTCCCCTTTATCCTTGCTCAGACCCGATGCCAGGGCTGGAAAGAGAGAAGAC
-accagctggacaattcagcagttatttaaaccagtctgagccttggaatcccaggcttta
-ttaaaactggacgacccctatgtcatgagcatatagttgggatttgatgagctaggacat
-gaaaaacccgtggcatagtggctggcaTTCGGCTGCTGATCTTAAGAGTGGCACCTGGAG
-GCCAAAGGGCTGCCCAGCTCAGGCAGGCGATTTGCTCACTTGCTCACCCGCTTACCCTTC
-TCTGAGGCACAGGCTCTACCAACTCCTGCTCTGCAGGGACAGCCTCCAACCCACCTTCTG
-AGGATGTTCTGACTCTCACAGCGAGGCTGTGGCATAGGACTCCCAGGTGAGAGCGCATGC
-GGCCCCTGGTACATTTATAATCTGAACCTTGGCTCATCTTCCTAGTGGCCTGAGAGGTGA
-agatggaaaagctgaggctctctgaggggctggacttcttctaggtcatcccctattaga
-ataagtgaacctgaactcaggtctcaggtctggctgaactcaaCATAGGGGGGCCATGGA
-GGATCACTGCCCTCTGGGAGGTGACACCAGGAGTCAGGGTGAGTGATGAGGCTGGGACTG
-GGGCCTCTGGACGCCCAGCCCAAGGCTCTCTATGTCACTTCCTGGCCGAGCATGGATGCT
-TGGAATGGCTTCTACGCCACTGAGTCTGTCTCCTAGTCCCTGTGCCCCGCAGGCTGGCTC
-TTGAGTCTTCTGTCTCTGCACGAAGCCATCCTCCTTTCTGCTGACCATGCGGCTACTACA
-GAGAGCCCTGCTACCCTCTCCCTTCTGGGTGAGTCTCCTTGGCCCACCCTACTCAATGGC
-TCGCTCACTGGGTGCCCTGGAGCCTCAATCTCCCCATCTTAAGTGAGGTTGAGACTCGTC
-TGGAGGAGCGAAGGACCCAGGGCGCCAGGCACCAGGCAGATGCCCCCAGAGCCGCCGCCC
-CCGGTCCTCCGGCCCCCGGTCTGCCCCGCAGCGCCTGCCCGGCCGCCCTGCCCAGCCACC
-CCTTGTACCTTGCTTCTTCCTTCGGTTCAGGGCGAGCATGTCCACGGCGTGGGCGACGAG
-CAGGAGCAGGCAGAGTGGCGCCCGCATCTGGGCAGCCGGATCCGGGCTGGCGCTCCCCAG
-GCGGCCCGACGGCCCAAGGGCCCCACGTcccggcggcggcacggcgggcgcgggggcTGC
-TGTGGGCGCGCCGGGCGCATCCGCCAGGCGCGGGTCGGTCCGGCCGCCAGGTCTAGTGAG
-GGCGTTGGCGGAGCCGGGGCACTGCCCTGGCGGGGAGGAgccggcgcggcgggggcggcg
-cgTTAACCAGCTcggggcccgggagcgcgcgcggggagggggcgggggTCACCCGGGTCG
-GGGCCCTCGAGTTCGATCTGTCCCGCAGCCGGCGGTCTTGCGTCTTTCCCGCCCCCAGCA
-CTGCCCCCGAGCACGTGCACGTGCCCACCGCCAGCCACAGGTACGCACGCGCGCGCAGGT
-ACAGATGCGCGGACACCCGGAGACCCGTACGGTCCCCCGCGCCCTCTCAGCGCCTGTGAT
-TTTCTTTCCCTCCCCCCAGTCCCCTTTCTCTGTCTGTTCCTCCTTCTGGCCCTTAAGGAC
-AACTCCTTGTCTCCTGCTTTCTCGGTCTTTCCGCGGCCCGCGCTCCCCTGCTCTGCCCCC
-GACCCTGCCTGGCTGTTCCTGCATCCTTTACTCTTGCCGGCCGTCTCTCTCTCAGGCTCA
-CTGTCTGTGTCCTCCTGGCTGGGCCTCTGGTTCTCCCTTTTCTCTGTCTCTCCCTTCAAC
-CCCATCTCTCCCCTTCTCCCCTCCTGCAGGGTGGGGTGTTTGCGGGGCTCCTGCTGCCTG
-GCTTTCTCTTTTTCTCTCTACTCTGTCTCATTCTTTTAACAGAGGCCTGAGCCCCTTCTG
-GCCACTAACCCTGAATGTTTCCTGTGCAGTCTGCGGGGATCATCTACTCCGACTCAAAGT
-GACCAGCACCTCATAAATCCACTTGTGACAGGGCTGGGGACCTGGACTGTGTTTCCTCCA
-ACCTTATCACCAGGACTGGGAGCAGCTGGTTCAAGTTTAACCCTTTCAGAGCAAAATTCC
-TCCTTCAACCCGACAGCATGCTCACCTCTCCTGTCACTATAACCACCAAAAACAACAACA
-ATCATGCTagctatcatttgtgaggcatatatggtgggcattgctaagaacttgacatat
-actagagtcttcaaaacaacccaatggtttgggtttgtattctgagtaattccacttttc
-tggggagcaaagggaagctcagagaggccaagtgacttgcccaaggccacacagcaggtc
-agtggcCATTCTGGTCCAGTGCCTGCCCCTCTTAGCCACTTCTCAGGCACAGACTCATCA
-GAATGGAAGAGGCCTTGGAGGGAGGCCTAGAGAAACTTACAGTTGACACTCTCTTGCTGA
-ACAATTGTCCTTCCtttttcttttcttttttttttcttttttttgagatgggttttcact
-ctgtcacccaggctggagtgcaatggcgccatctcggctcactgcaacctctgcctcctg
-ggttcaagtgattctcctgcctcagcctcccaagtagctgggattacaggcacctgccac
-cacacccagctaatttttgtagtttttagtagagacggggtttcaccatgttggccaggc
-tggtcttgaactcctgacctcaagtgatccacctgcctcagcctcccaaagtgctgggac
-tacagacgtgagccaccccacccagccTGTCCTCTTTTTTCCTACATGTGGAGCTTGCTC
-CAAAAGAAATGGAAGGTAAATGCTGGTATCTCCTCCAGCTCCTTCTCCCAGTGCAATGAG
-GGACACTTGAAGGCATGGCAGGGGCAGGGGAAACACACAGAGAGTGTGGCAGCTGAAGGT
-ACAGCCCTGGCCTGGCCATTCTTTCTGTGGGGCCCCAAGAACGCTGGCAGACAACACGGa
-gaacttggtggaatgtcagagacagcccacccaaagtgctccatttcacagatgaggcca
-ctgagccttcaggactggggggtgcctagattaggccacccagtgagtcaaggactgagc
-tgacatgggcatccaggtgtccCATTGTGgtcatcaccatggcctgcaaggacctcttgt
-tctgatatctctgatctcagtctttcccactgccccacccctctctctttagccttagag
-atttcagcccttgaatatttcacaaacaccacaggcctctcacacctctgagcttttcat
-gttgtggggcctctccatggaataccatcctatatcctacctccttcttcactgcctctg
-ctccaggaagccttccctgattctcaggccaggtccagtgcctcctctgggcatccacaa
-tctctttatcacagctctgatcacatcaggtggtaacaatggatgtgtctgttctccttc
-caaactgccatctctttcaagccagagccagacacacagcggtgctcagaatgtttgcat
-aatgagtgcataaataaatgaatggtgaatgaatgaatTCTCCAGATGCACAAGTCTCCC
-AGCCTGTACATGGAATGCAGGTACTTGGAGAAATGAGGTGACCCCAGAAGATCAAGCCTT
-AGGAAAGCGGAGGTCATTCCCTTCCCCACTACCCCCAGTACTGGAGTCTCCAAAGTCCAA
-AGGGGACAGCTTCCATGTGAGCAGGGCCAGAGAGGTCCAATGTGCATTGTGAATTGacag
-ccagccacacggctctgcaggatgaagctgcttaccccttcttgaattttttcccctatt
-tattccccactgcctctgctctagctagcctcgtgtttctcagactcttgtcactcatcc
-tgcggtttttgctgttctctctgcctggaaagtctttccccagatttggggcttgtctcc
-cctcgatgttgcctcctcagagaggccccctgtgaccactccagtaaaacgcaccaccat
-gcactttatcctcttgtcttgctttaccctccgtagtacctgttcatgtctgtcagttcc
-tgtttgcttgtttgtgagttccatgaggacaggaatcttctattttgtccctatgtgcct
-tacactgcagtgattaagacatacttgtggaatggatttttttaaaaaatgagtgaatga
-atAAGCACTCATTCATccatagattcattgtgggacctcaagtactttctgttctcttag
-gctcaatttccccagttgttcaatggcacagatgggattttgtgttctgtgagagcccct
-ttagtgcttccagaattggatatttctagggttcTAAGGCCCAGAACTCAGGGCCCTTCA
-TACCCCAAGATGCTCAGAGGGTGTTTGGTTCTCTAACTATGGGGGCTGTCTGGGCATCTT
-GGCCTGTTATCCAGTTCCCCTACCCCAATACAGGTGCCCAGGGAGGCTAGTGATGCTGAT
-GGCATGCTCTGGCGGGGGGCGGGGAGGGGTGCACCCAAGGGTGTCAGTTAAGGCACCATT
-GTCACAAATAGATGAAGACAGGTATAATGGCTGAAACACACTAAGCTCACAGCATGTGTT
-CCTGATCAGCAGATCCTTCTCTGTGGGATAGCAGGAACTCAGATTCCTTTCAGCTTGTGT
-TCTGCCCTGTTCAGTACCTGGTTTAAAGCTCACCGAGaagggcagggcttatgggaagta
-cagagcctgtctacctatgtcccattggccagaactcagacacacggccacacctacctg
-caagggtgactgggaaatgtagtccagccatgtgccagacaacacacaggaggaaaagca
-agaatttggtgaacatctggccCATTGACCAACGTTGGgccaccctcatttcttgcccca
-gtcatgcagtagctccttcctgtgtctgctctgacccctacaagctcttcttaagcagcc
-agagGACATGTATTATTCATCGGGTGAAGACCAAATTTCTCCTCAGAGATGCAAGGGCTA
-CGTGATGGCCCCTACTAGGGGGCCATCTGCtagggtgaccagctgtctggtttgccaggg
-attgaggggcttcctaggatgCAACGTTGACCTGTGTGTAGCCTTGtataatacaaccac
-aatcaagatatttaaacatacttaaacaagatactaaaacatcatcacaagactccttca
-tggtatccatttatggctccaccctccctctccacttccagtcctaatccctagcaaccg
-ctaatctgttctccatctctgtaatgttttattttttgagacagggtcttgctgtgtcac
-ccaggctgaagtgcagtggcacgatcatggctcactgcagccttgacctcctgggctaaa
-gcttctcctgcctcagctgtgtagcctggactacaggtgcatgccaccatggctggctaa
-ttttttattttttgcagaggtgaggtttcgccatatttcccaggctggtcttgaactcct
-gggctcaagtgattcttccacctcggcttcccaaagtgctgggattataggtgtgaatca
-ccacgcctggcctcccatctctataactgtttttacataaatattgtataatggagtcat
-gcagtatgcatctttttgagatttggctttcttcactcagcacaatttgtttggagattc
-attttagttttgcatgtattagttatttgctttttactgctgagtagtattccaccgtat
-gaatgtaatatagtttgtttaaccattcacccactgaaggacatttgggtattttctagt
-ttttcattattaagaataaaggtgccatgctcacttgtgtataggtttctgtgtatcctc
-tttggtgaaatgtctgtgcatatctttcacacattttaaattggatttttacattactat
-tgtgttttaagagttctatgtatatattctatatagaagttctttgttggttacgtgatt
-tgcaaagcgtgagatttatgtcaaggttcattttgtatttttgtttatttttttatgttt
-ttgtttgtttatttttatgttcgtttttaatttttgtttatttcgaggttcattttttat
-ttttcgtctgcggatgtccaattgctccagtatgctttgatgtaaaagctttatcaaaaa
-ttaattgggcatattggcatggatttattttggggctgtctcctgtattccatgggctat
-gtgtctttctgtctaccaatactacactgtactgattactgtaactatataataaatctt
-gaaattgggtagatggatccttcccactttattcttctttttcaaaattattttagctat
-tctagttcctctgccttttcatatatattttagaataatcttgtttatatctaccaagaa
-tcttgctgtgagtttgattagaattgcattaaacatgtatatgaatttgggaagaattca
-catctttactatattgagtctttcaatccaaaaacatagtatgtctctccatttgtttag
-atcttctttgacttttttaaataaatgttttgtcattttcagcatacaactcctgtgcat
-gttttgttagatttatacctatttccttttttctcccttagaaattatacatggtattct
-attttaaattttgctgtccgtgtgttcattgctagcagatagaaatacaactgatgttcg
-tgtgttgatcttgtatcctagcaccttgctgaactcatatattagttctaggagtatttt
-tgtagatttttttgggttttgcaacattgacaatcatatcaactgcaaatagcgacagtt
-ttctttccttctgatcttgtgccttttgtttcctttacctgctttatcaaacttgctaga
-acttccagccatatgccgagtaagtgtgatgagcatagacatccttgttctcaatcttgc
-ctggttcccaatcttagtgggaaagcattcagtcattcactatgacattagactgtagga
-cttttgtagacactctatatcaccttgaggaagatcctctctattgctacttttctgagc
-attttttaaaattatgaatggctgttgaattttgtcaaatgtttttcctgcacattggta
-taatcatttaatgtttattctttagtctactgatacgatgtattacattgattgattttt
-aagtataaaaccaacctttcttcaatggaataagccccacttggccatggtgtaccattc
-tccattatatactgctgaattctacctactaatattttgctgaggatttttgtgtctaaa
-tccattaagaatattggtctatatttctcttttttgttctgtctttgtctggttttggta
-gcagggtaatgccagccccagtagcaccagaagaacaaggcttactagaatagaattgca
-agggttccaggccaagtgcggtggcctatgcctgtaatcccagcattttgggaggctgag
-gtgggcggatcacttgaggtcaggagttcgagaccagcctggccaacatggtgaaacccc
-atctctattaaaaatacaaaaattagccacgtgtggtggtgcatgccagtaatcccagct
-acttgggaggctgaggcaggagaatcacttgagccctggaggcagaggttgcagtgagcc
-aagatcgtgccattgcactccagtctgggtgacaagagcaagactcctctcaaaaaaaaa
-aaataaataaataattgcaagggttccaacaagtttactgtcattggacctaaagcccac
-aaaagtaaacgagaactcacatgctacatttaaacagggaaactgctgcctgctaaacta
-aagtatgaaataagacctgaagttccaactgatgctaatactaaaatgactcagatgttg
-aaattgtctgacaaggattttaaagcagtcatcataaaaatgctttggcaaggaattatg
-aaatctcttgaaacaaatgaaaacagaaaatctcagcaaagaaatggaagttatataaaa
-ggatcaaacagaaattttagaaatgaaaaataccataactgggggaaaaaactttgctaa
-tggactcattagtacagtggagaagTTCAGtgatggacaaataccccaactctctattga
-atgggcaggatggccggacacataaaacatgccacgctgtctcctgccacaattccccag
-ccctgccatgctgacttcagagggactgagcttcagttgcccacggtgctgtctgggtaa
-cctgtccttcatgggctgcctgcccttcctgtttcactccttatgctccatgctatgctt
-cttgggatcaattctcaaatcaatttcttgaactcaaatccttgtctcagggttggcttc
-tggcaaccccaaaccaagacTAATTCTTACTAATTCTCATGACAACCTATAAGGTATTAC
-AGGTAAAACATGGAACAGCACCTAACCCAGAGTAAGTTCTCACTGGTAACTTTCATGATT
-GGTGCCTCAGTTTTGTTATGTATAAGACAGAGGCATCGAACCCCTCACCCTCTTCCTCTG
-GACTTCTTCTTGTTCTCCTCTTAAATCAAAATCTCTGCAAACCCACCTTTGTTCTTTGTT
-TTACCTGTTCTTTCCCAAGGGAAGGCAAACAGCCTTCTCCCTGTAGGATGCTCAGGCAGA
-CAAAGGAGCTGCTTCAAGCCAGCGCCCCTCCCTCACCAACCCCAGTGGAATCCCAGCCTC
-CACAGTCAGTTGGGTTGTTGTTTTTTATAATACCAGTGTGAAATAAATTGAAAAATTACC
-CATAAAATACAGGTTTTCAGCAGCTGGCCTGAAATTTCTTTCCATAAACAAACAAGTTTA
-AAGAGATGCCTGATGCCACCCGCCAATCCCAAACTTTTATGTCCCCATGTGGCAGTGGGG
-TCTGCCGGGAGATTTGGCCTCCTGGGCAAAGGCAGGCTGCTGGGGGCCACAAGTCACCCC
-TAGGTCTTTGGGGCTGACTTGTACTTCTCAACCGTATCTGTCTGCTCCATGAAGAATCCC
-CCAGACTCATCCCTCATCCCCCAGCTCCTACACTCagcatagacttgggagccaaactgc
-ctggatttgaatcagagatttccacttattcagtgtgacttcaagcaagttacttaatct
-atctctgcctcagtttccccaactgataatgctgataatagtagtacctacttcatagga
-ttgtttgtggattaaattagttaaatatacatgaagttcttaggacatggcacaagacca
-tgctgtataactgttagctattattAGTCGTCCAGGAGGAAGAAAAACTAGGATGGAAGC
-TACAGCAGGAGGCCTAGTGACATTTTGATTTTCCCACAATAAGCTTTCTCTGGAGTTTCC
-TTCAGGGTGTTTACATAAATGCCTGTCCAACACTCTgcagtttgcaaagcttgctacatc
-tgctatctcatttggatcaacatttaagccatggaaggagttaggacagaggttgtgatt
-atccccattacccctagtttacagaagaggaaactgaggcccagtaggtgaattgacttg
-ctcatgatctcaagaaggggtagagccaggaCCCCATTTCTGTAGCTTGAGGATCCGGGA
-CGCATCTTGATTCTTGTCACACACTGAAAGCAGGTCAGAGCCCTCCTGATCCTGCATCGC
-ACACTGAAGCTTGAACCTCATCCTAGACCACAACATAACCCTGGTCTCAGGTGGGGCTCT
-GACCCCATGCTTGACCACAGACTGAAGCCCAGATTAAGCCTCAGTATCGGTTTGAGTCAG
-AACTCTGAATCTCGCTTCACACTAGGCCCTGACTCCAGCCTCAGACTGATTCCTGATCTT
-TGTTATAGGCTGAGTCCTAATCCAGGTCCCATATTGACTCATGATCGTGATTCCACACTG
-TGCCCTAACTCTGGCCCCAGACTGAGCCCCCAGTGGGAGCCTCTAACTTGGAACTCCATC
-TCTAACCCCATCTTGAATCTTTTGTATAAATCCAATTGCCCATCTTCCCCAGGCTTTGGT
-CCATCTACCTGAAAAACAGAGTAGGGAAGAAAGTGCTCAGCACCCTTTGGAGAAGGCCCA
-GGCACCAGAGCAGAATTTACAATCCACCACAGGAAGCAAGACCCTCATCTCATCTCCTGT
-GTTTGCAACTTCCTCCAACTCCACCCCAGCTGGGACAGCCTCAAAGACCCCAGTCCTCCT
-GACGCCAGAACTCTGAGGAGTTCTATTGTTTAGGTGGTTTTCGGTTTTGATTATTTAATA
-CAGTCATTTCTGGTTTTATATTCACAGCTTTGGTCAGCTGGGATAGGGTTTTTCTTCTTC
-CTGTGGTTGAAGTTGTAACACTATTTCAAACAAAGGAAAAATTTTAAAAACAACAGTGAA
-AATATTTTCAAAATATGTTCACAATCAAGTTAATTTCTTGGTAATTGGCTGGGGAAGAGA
-AGGGAAGGACAAAGAGAGATTTTTCATAATGAAGGGACAGCAGTTCTCTGGTGGGCTGGG
-GGACAGCAGGGTGGGGGCCAGCCTTGGGTCTCAGTCTACACAAAGGTGGTAATGGGCTGG
-GGGAGATAGGGATTGGGAGCTGGACCCAGGACAGTGGATGAGAAAAGCCAAGGTCAGGCC
-TCTAAATGTCCCACTCTGGAGGGAGTTAGGACCCGGAGCCTATTTTTCTCTGTGTGCCct
-taattctgggcctcacttttttcatctgtgaaatggattcaataacacctgcccaaggag
-gactcttgaaattaaaagacaaggtggctgcaaagcacccagcacaaggcctgacactga
-ggtgtacaagtaatagtagttGATGCCATCATTATTATTTGTATTCATGGTTTGCCAGCC
-CAGAGGCTgtagaacctggtggtacagggaagcctgagtcagacaacctggattcaagcc
-ccagttgtgccacttactacttatgtgacctccggcaagttgctgagcctctctgacctt
-tggttttctcatccataaaatggggatagtaactgagttgttgtgaggatcgaatgcatg
-actgcatgcaaagcacttagaactgtgcctagtgcatagtcagtgccaagtgtcagctac
-tactATCTGCTCAAAAATATTTCATGCATACCTACTACTTGCAGGTTGTGAATTGATTGA
-TTCTTTTTTCATTACTAAGCACTAACTGTGTGCCAGAGAGCAGTGAGAACCGAAGACACA
-GTAGCTTCTATCAAGGCCCTCATCGCCTGGTGGGAGACTGAGAAGGAAAGAAGGCAATGA
-TGACAAGGTCAAGTAAGTTCTAAAATCCAGGCACAGGGGAGGAGCTGTGGGAGCCTAGGG
-GCAAGGCCAGAGAAGGGTTCACAGGAGTTAAACattcattcattcaacaagtatctactg
-agcactggcccaaggctgaggattcagccaccaccaccacaggtccacatctggccttcc
-tggagcttgcagcctagccggggagacaggaacaatgaagacacacacacttagataaca
-tgatggtggtgatggtgagtgccgcgatgaaaaccaaagccaggggaggggatagagaat
-gacagacatggtcaggggaggcttctctgcaaggtgagcagagatttggataaagtgggg
-gaacgagtcctgtggaggtctggggagggcattccaggtggaggggcagtaaatgcagag
-gcccagaggcctctccatgggctaacgagggaggcagagggagggagggagtggagggag
-caagggtatgtgtaggagggaagcagggcagGAGTGGGAGCACAGTGACTCGCCTGCATG
-TATTCCCAAGGAGATGGGAAGGAGAGGCGAGCAGAGGGGTAAAGGAGAGGAAGCAGGAGC
-TGCCACTTTTGAGAAGCACTGAGAAGAGAAGCAGAGGTGGGTGGGGAGGGGGATGCAGGG
-CCAGGACTGGTGGGCAGGGGCCCTGCAAGCCCTGCTTACTGGAACGGGAGAAGGCTGGGG
-GAGGTGTTCCAACCTTCACAAGCCACAGGCAACCACCGAGTGACATTAGACAGGGAAGGG
-ATGAGATCAGACCCTGGCATTAGAAAGGCTGGAGTTCTGGGTCCTTCATGCTCTCTCCCT
-TAATTCTTACAAGAAcccatttcacaggtggggaaaatagaggtcccagagaggttcagt
-gacttgctccaggtcactctgaaaggacacagatctggctgcctccagctccccctgctc
-cttgagttccctgctgtcttccctggcctctgcctctGGGCCCAAGAACTCCCAGCCCTC
-AGCATCCATGGCCTCCCCCTGGCCCACGAAGTCCTCAGCCACCTCCTTCCTGGAGGGCTC
-AGCCAAAATCAGACTGAGGAAGAAGTGGTGGGCACCCACCTTCTGGCCTTCCTCAGCCCC
-TTATTCCTAGGACCAGTCCCCATCTAGGGGTCCTCACTGCCTCCCTGCAGCCCCTTGAAA
-CTTCTGATCATTCAGCTCCTGGGATGTCCTGGGCAAAGTTATCCAGGCCCAGGTCCCTGG
-CTCGTGGCTCTCCTCTCATTCCCTCAGTGGGTGCCCTGCCCACACCAGGATTGCATTCAC
-CATCCAGGTGCTTGCTGACTCGGgggcaggctgagtgctgatgagttaatgccccccagg
-agcacccctgagtggatgaggatgggagttggtggaaaaacatttcagtcccctcgcccc
-ttgggtgggacagttctgttgccagagttcccagtgggagggatgcccagttgccaacTT
-GATCCTTATCACACCTGTGCTTGCTTCTTTGGGACTGGCTTCCAGGGAATCTATTTGGAC
-GGGAATTCTTGTTTCCAGGTCTGCCAAGATAACTGCCAAGCCTAGTCCATTCTACCTGCA
-AAATAGCTCTCCAACCCTTGCCTCTGTGACTGCCAGGTCTGCCGCAGCCTCCTGCATCTC
-TGTTTGTACTCGTGTAAAGGCCCCCCAAGCTGTCCTCTTGTTTTGCCCTTGCAGTCTACC
-CCTCCTCCCTCCCAAGGAGCCAAAGGGGTTGGGTTTTAAGGAAAACCTGACCATGGCTGC
-CTGCTGTTCTCAGGCTAAACAGCACCCCTGCAAGGCCCACAGGCAGCCCACCTAACCGTT
-TCTCTACATctctgccccaagccacactggtcaccttcccatttttcaaacacatctact
-tatcaccttctcagggcctttgcacttgctgtctcctctggatggaacactcccagtctc
-ccatggttagctcattccaggcttcagttcaaatgtcacctcctcaaagaggccttccct
-gaccatgcgatggaaactcccatccttcaccactacgcttggcttagccctcttagcttt
-gcttcctctcctttgaactgtttcccatgatctgaactagccttgtttgtttgttGTGAT
-GACGATTGAGCCCCCCAAAGCAGAGAACTTGTCTGCACACACTGGGCATCTGGCTGGCTG
-CGGGTGTTGAGCTGTGAGATCGGCTATGTTCTTGCCCTGCTGCAGTTGACCGTCTGGTTG
-GACAGGGGCTGGAGGGATGAACCAGTTGTGGAAAATGCCACAAAGGAAGAGGAGTAACCG
-GCTGCAGGGAGAGTGGGAGGGCACACTCACTTGGGTGGGTGGATTCTGTGTAAGAACAGG
-GACCTAccaaggtgggcagatcacttgaggtcaggagttcaagaccaccctggccaacat
-ggtgaaaccccgtctccactaaaactacaaaaacattagctaggcgtggtggggcacgcc
-tgtgatcccagctacacgggagactgaggcaggagaatcgcttgaacctagaaggcagag
-gttgcagtgagccgcgatcatgccgctgccctccagcctgggtgacaagagtgaaactct
-atctcaaataaataaataaataaataaataaataaataaataaataaaataaaGTGCGGC
-TGCATTTGCCTCCCAGGGCAGCCCAGGTGTAAGCTATACAGCTTGGTGGAATGTCTCCAT
-GGCTTCTAGGGGATGGCCCAAGAGAGTTCCAAACACATCATATTCCAGTGAATGGGactg
-gtcagcccacagccacatggccatgtccagctgcaagggaggctgggaaatgtaatattc
-tgcaggccacccatgtgctcagataaaaataaagagaatattattcaagagaaagggaga
-cagagtgtgggggatgactgatgatccttgccataAGCATCAGCAGGAAACCACCAGCCC
-CCACTTCCCTGTTTCTGCATGTCTGTTATTTGGTCCTTCCTGTGTGTGATGGAGGGAAAG
-ATGGCTGTGTGTGATGGAAAAAAAGATGGTCCTGAATGAGCCTGATTCCACTTCTGGGTT
-CCCACACCCTCTGGTAATTCCCTCCTTTCCCCCGTTTCTGCCCTGTATCTCCTACAGTGT
-CTCCAGCCCTCCTTCACTCCATTTCTCCCTCTCATCATAGACTGTCTTGGAAGTTCTGCC
-TACAAATGTGGCAGCTGCTGTCCCACTCTTCTCTCCATCCCCTCTGGAAGCCTGGCCTCT
-CCCCAACTTCCTGCTCTGTTCTGTAGCTCACTCAGCGAGGACCAGTCCCTCTCTGTCATG
-AGATCCACTTTTTCTCTCCAACCTCCCTGTGGGCCTCTGTCCTGTCAACATCCCTCCTGA
-CACTCTCTGTGACATTTGACCACCTGCTGGAATCAAAGAATGTGGGCTCTGCAATCAGGC
-AGGACAGAAATGaagatgcttcccctttctcagcctcaatgatctcatctgtaaaatggt
-gtgaagaatgtccacTAACTAATTGAAACAAATTTTTATTTGCAGCCATGACATACCATG
-CATTTAAGTAAGCCCATATGAGCACATCTGAAGGCAGTGATAATACAATCAATAATACTA
-CTGGGAGTGCCTAGCTCTTACTGAGTGCTAAGCTCTTCAGCACGTCAGCTCAGAAATGTG
-GCCCCTCCCATGGCCCCGCCTGCACTCTTTTCTCCTTTTTTGCTTAACTTCCCTTTTGTT
-GCTTCTTTCTTGAGTCCATTTTTGGCTCTGTTCTCTCCTCATCTCTGCAGCTTTCCCAAA
-TTCTTTTTTAAAtttttatttatttatgtatgtatttattttgagactgagtttcactct
-tgttgcccagactggagtgcaatagcatgatctcggctcactgaaacctccacctcttgg
-gttcaagtgattcttctgcctcagcctcccaagtagctgggattacaggcgcacaccacc
-ctgctcagctaattactgtatttttagtagagacagggtttcatcatgttggccaggctg
-gtctctaactcctaacctcaggtgatccactcgcctcagcttcccaaagtgctgggatta
-caggcatgagataccacatccagccAGCTCTcccaaatccttttcccagctctgacatgt
-tgccacacttcatctacctggctggacacctccacttgaagtcctgtggacatctcaaac
-ccagggtgtctaaaatagaactcagcctcttcccctgcaggcttCCAACTCTGGAAAGGG
-CCCAACCACCTACCCGCTGGGTCTGTGAGCCAGGccttcctctcaggcccctcctctctt
-cccctggccccagcctccttccccacttccccacccttccccaccccAATGCACATACAG
-TTGCTCAATTGCTAGTCCTCACATACTGCATTGTGTCACCCCACCTGGTCATTGTCCTGC
-CCATGTCCTCTCAGCACTCACCTTTCCATGTCCAAGGAGTCTTCTGCAAACATCTGCAAC
-TGTCTGaagccaaggtgctggagaactaagagagagtccccaagcagccctcagccaatg
-accgatgggaggtggtggataaataccagccccctgccctgagttgggagacctgaggtg
-tgctcttcactgtctcaagaggacctcaatggggctgagctcccgttgcccatattagca
-attcacttattatgcatcagtggcttcagtggtttactgcagtgtcttcattgtctcTGG
-GCCACATAATTTTATGGAAGTCACAGCCCTTCTCTCTAAAGTCCATCTATGAAGCCACTT
-TACCTCTGTTTGAGAAGCACTGGTCTCCAGGATGACATCTATACCCCTTACCTGGCATTC
-AAGGTCAACCTGCTGACTCCACCATGTGTCTACCCTTCCATGctttgctcatgctcttcc
-ctcctgcctgaaatattcatcactttgcttaatgcttgtctgagttgcacctatccttca
-agactcagctcaagttcacttcctccgggaagcctttcAGACCACATTAATCCTTCGAGT
-GTTCCCCACAGCCCCAAGAATCTGCTCCCCACATGTGGCACAAATAGTGCCTTGGGTCTT
-ACCTGGtttgttccttcagcaaaccaaggttaagttagcattttctctgtgcaaggccct
-gagagctgggagagctggagacatgaggtgagtcaacacagaccctgctctgaggtctgg
-gcagtccagtcgaaagacGTCCAGGACATGGGGTTGGGCATTCCAGGCAAGACCATCAAC
-TCTACGAGGAAAGGGATGATTTTAATTCACTATGAGAAATGAGTGAATCATTTATTTTCT
-TAGCTTAAAACAGGGGGTGGACAAGAGACTGACtctggcccaccatctgtttttataaat
-aaagttttattgaaacacaactatatttcttcatgtatcacctatggcctttacactaca
-atgtacgagtaattgtgaaagagaccacgtggaccacaaacactaaaatatttactgttt
-ggacccttatagaagttccctggccctggcttgaaacactaatacttgtttattatttca
-cacagtttctgaaggccagaaatttgggagtggtttagctgggtggttctggctgagggt
-gtctcaggaggttgcagtccgcagggctgtctgagtctcatcataacacagcagctggtt
-tccccAGTGAAGACTTccatgctaggcacctcacacacagcctcatttaatcctcataaa
-catccttaaaggacagctatgattattacctacatttctcagctgaggaaaccagagctc
-agagagaggaagttatttccctaaggcaaggacagacctaggactggagctcaggttcct
-ctgcctccaaagccccgctcctaaccactgggctgtccttctgAGCACCACGGGGTCCCA
-GCAAATGATCTGTGGCTGGGGATCCAGGATCATTGTGATTTGACTCAGATGTCCCTTTGC
-CAGGGATATGGTCCTACTCTCCCTCCAGTTACCTGCTCCACAGGTGGGGTCCACCTTCTT
-TCAGACCCTCTATCAAGTGAGTCAATGGTACTGTCCAATTCCTTCCCAATATCTTTGCCA
-TCCACCCCCACTCTTTTCCAGCCCCACTGCTTCGGTCTTACCTCTGGCCGTCTGGGCTCC
-CATCTAGAGACAAAGTCAGGGGAGGTGATGCTTTCTGCTGATATTCCTTGATTTTTTCCA
-CCTGATTCACTTTCAGCTCTCCTCTGCCCATCCTCTCAGAAGATGGATATGCAAAAAATG
-ACCCCAGAGCCATAGGAAGGCCCCAAATGCATCCCAAAGTACTGCAGATGATACCTCCTG
-ATCAAGCCCTGCTGCTAATCAATCAATAGAATTAATATAATTATACAATTTCATTTATTC
-AGCCTTCTACCTTCACaaatgcctggaccttggtttcaggtaaactggctcgagttcctg
-cttggtctttgccaacatgtgtccatgggcaggtcttagtctttcctttggcctcagcct
-cctcatctcaggattgctagagggggttaaaGGACATTGCATTGTAATTTGCTTGTTTTC
-ACACTTGGTACATAATACTTGCTAGAACCATGATGCAAAGAGCAGTCAGTCCGCATGCTT
-ATAAGGGAAGCAAAGATGTTCAGCATTATAGAATGCATGGCTAACATGGCCCCAAGATGG
-TCCAATGGAAAGCTCTTCTTCTAATCAAATAGTGAACAATCCAGGAATAACCAAAGAAAA
-AGTtcatcttattatttgttttcacagcagctccatgaggcagaattaattttgtgtgtt
-ttgcagatacgggaacagtaggtgagagcatgagtaactcagctcaggtcacacagcagg
-tgggagagaactggaacaagaacccagtgctctttctgctctacccactgacccATCCTC
-TCACGCATCATACACCCATACTCccatccacccaccttcccattcatgcattcacccatt
-cacccaccttccatccatctaccatccaCCACGTACCTACACTCCCATCTACCATCCAAC
-CACATTtccattcacccatcctcccatccatcaaccctccaatccaccacccacagacct
-tcccatccattcatttacccatccacatattcacccaccctcccatccatccatcTACTG
-TCTATCACCTACTCATTTTCCCATCTGCTATTCACCCCCACCCTCCTatccatccattca
-accatccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccat
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-accctccacccaccctcccatccaatcatccactgtcccaaccatccaccatctacccac
-ctatccaccactcaccctttctttcattcactcatcctcccatcctcccatccaccatcc
-acccTCCACCcatttatttgacagttgctgagagcctactaaccaccaatcactattcca
-ggcactgagatatgactttgagctagacaaagtcttgcttcatggagctcacattttggc
-tgtgaatggcagcaacagacaaataaatacgtagtttacgtgaggtactgcaaagaaaaa
-ataaagcaggggagtgatgtcaggagtaactaaggcaggatggtagtcagggaggtcgtc
-tctgaaacgggacatttgagcagaagcctgaaggaagtgagctccctgacaacttgggag
-aagagaatttcaggcagagagaacagttgtacaaaggcccagtggtaggaatagaaacag
-cttgatgggattaagaatcaacaaaaaggtcattatggatgaagcagaatgagggaggaa
-acccaagccagctcgggcttgatcatggcaggctttgtcagtcactgtgagtaaccagac
-tttatttcaagtgagttggCCAACAGTGTCTCCCCAGTAGTAGAGTGATTGCTCGTCTGC
-CAGAAAAGGGGCACAGAGCTCTGGACATCAATACTTGCCGATCTCTCCTTCATCAGCCAC
-CCAACCCTGGCAACAGTTTTCAATTACACCTGTGAAAACTTGTGGGTTAAACAGCTGAGA
-TCCATGCCTCAGCTTCTATAGGTGATAAGCCTGTCCTTCCTTAGGTAAAGAAAGGAAGGG
-GCGAACCGTCAGtgagcaccattcacataccttagccggttcagcttcaccaccctctga
-aggtgccatcagcagctcccttttgctgaagagtaagcggaggcccagagaggtcatgtg
-gtgtgtgcttgaggtcacatggctgagaggtggcaccagatttgcccaactctcaagtcc
-catagtctaacgtttcactccacTCAGATTCAACCTCCcaagaaattatttgtttgagta
-cctactaggcaccagactcagagtgagaggcagttgcagattcactcagggccagttttg
-gaggccagcttcacaatcacccagcacagcccatctttctacttgtgaggaaacagaggc
-tcagtgaaggaatgcctttcagatcacagagaggatgaagccaggatattcaaacccagc
-ttattttACTACAACTCTATATGGTAGGAAAGAGAAAAGCGCCCATACAATTTCAGTGGC
-TTGACGTGGAGCCTGGCAACAGATGTGTTCTTGGACTGTTGGCTATAAGACAAACCAGCT
-TTCCCCACTGACTGTCACCGTGTTTTGGGAGACAAAGCCTAGGACTTTGGTGTGTCCACC
-GTGGGTCAATAAATGCCCCCAAACAAGCATATCTTGCAAAAGTGGGGACTTATTAATTCA
-TTGATTCGTTTCTTGATTGATCAATTGATTTATATGTCCCTGTTGGACAAAGGGTTTGAG
-GCAGCCTGGGAAGGAAGTGAAGTGTGGAAACTGGTCATCTTCTGTGCTTCTTACATTCCA
-CTCATTGGGAACATCAAAAAATGAAAAAAAAATCCAGCTGCTACATAGCTGGGGAACAAA
-TTCTTGGTATGGAAGTAATTCTGCTAAGGCTAGCCTCCTCAGAGTAATTCCAAATGCTTT
-TCCTATTTTCAAATTTAATTAGGAGACATTTCTGTAGTGTGAGTCATCATTTAATAATGG
-GGGGTGTTTATTAGGGAATGagtggaaagagaacaggacagctggataattcaaatccca
-gttcttcaagtctctggctgtgtgatcttgggtgagccacttcacctctctgaacatcag
-ttttcttgtctttaaattgatatttacctggcaaggtttggggaaggtctcaactagatt
-atgtacataacaagcttgccagtgttagtacataataggtgtttaataaatattaactGC
-CTTCTCTTCCCATTTATTTTCTTATTTGGTCTTCTAAACAACCTTGGGGACCATGATAGG
-TATGTTGTTTGCTTTCTCTAGCATGAAAACAGCCTCCCAGAAACTACTCAGCCAATCCTC
-TGAAATGGTATTTCCGGTCAAATCTGATGCACCTTCTGAGACTTTTTTTTTTTTGTCTTT
-TCCAGTAAAGCCAAGCACATAGTCATTGTTAGTTTTAAAAAATGTATTTGGATGGGGTAT
-GAAGTTCAGAAGAGAAAGACATTCCTGGTTGGGTTATTCAAGCAAGGATCCCTGAAGAAG
-AGATGCTAGCATTTGGCTAGGTGATAGGAAGGGGACAGGAAACAGCAAAAGGCAGGATGT
-GGAGGCAGAATGAGTTGAAAGATGCTGTTATTGAAGGCGATGGTGGTAGTTTATCCCTGA
-AAGCCACCAAGAGCTCAAGAGCAGGAGGGAAGAAGATGAGTTTCTGTTGAAGAAAGACCA
-AAGTCACTCACTGGCTGATTTGTGCTTGGGAGGAGCATCTCTTTCCCCTGCTGATTGGGA
-GTCTTTTGTTTCCCTGGGACAATAGGCACTGGTCACTGAAGAGTGTGTCTGTCCTCCACA
-CTTTCCCATGTTCCTGTCTCTGGGGAACTCCTCCCTGACTCCGAGAGACAGGATGGAGTT
-GTCAATCAAGATGTCTGTCACTTTGCCTACCAGGGGAGAGCTTTCCAAGTGGGGCCCTGT
-TTTTCTGCTGGGGCTATAGGGGAGGGTCTCCATCTTCATGtgtcaggatgtagccttggg
-gctgctggtgtcatatttatgccacatggaatgaagctgtctgaagcaggaaaggatgat
-attaccaagcaaaaagagatgcaaagctgagtgtggacggaggcctgcttctgatcctgt
-ccatgtacttggatcaaaccatgcctgaactccatttggtttgcaccttatggggcaata
-agggaataagtaattctctttgtttattcaacaggatttctgtcacttggcaattctgat
-taatacaGACTTCTGATTAATACAGTTGGCAAATGAGAGACAAGTGATCTCTTcagaaat
-ggacagagcaggaaaggaacccaccaagcatggagaggttgaatgagagtctcttcttcc
-ccattgactcactgcagccctggatcaggttgctgcccttctctgggactcagttttatc
-atctgtgaaatgggCTGCAGTGAGTGGGAAACAAAAtcatttatttatgcccaaccttgt
-tgcaaaaatgatttaagacagcttacaaatgtattaaagccagagattaggaaaagaaag
-agataatgaaattgtgagaagggggagaaaaggtgaactcaaggatgaggttaggttatt
-gaatgcctgctgtaaagttctggacagttgctaaaggtgaacagacaagtttgttctgag
-attctttgtagccaaagcaagaaaaagaaaatgcagttacgtggatttgtaggaaaaaaa
-aaaaaaacaacccggttcctgagaagaagcccaacttttcttagaataaaagtctgaaac
-aattttccttgtggttccccatcaaaaggactttgtgaaataccatgagcaaATATAAAA
-ACCAGAcaggttgagtatcccttatctggaatgcttggaaccagaagtgtttcagataac
-agattcttttggattatggaatatttgcatatacagtcctacctcgggtataggacccaa
-gtctaaacacagaattcattcatgtttcgtgtataccttatacaagttacctgaaggtaa
-ttttatttttctgtgtgttgtgcacctgcattttgactgcaacctgtcacgtgaggtcag
-gtatagagttctctacttgtggcatcatgttggtactcaaaaattttggattttggagca
-ttttcaatttcagattttcaaattacaggtgctcaacATTTAacaggctggggtaaatag
-ttgcaacatatttaatagtcggaggattaaaatccacaataaaataagagctcccacaaa
-tcaataaggacaaaggaaaaaaacactccatcaataaaatgggcaaaaagggataagaac
-acaattcacaataggggaaatAGctatcaaattagaaaaaaatatcagaagaatgggtaa
-tatcagtgttggtcacagtgtggggaaataggcatgctcagacacCttaacttactttta
-gcgtttctcgtcacctgacacaccatatatatacgtctctacgtgttggggatctctctc
-tctgaccagattgcaagttccatgagagtaaggactacctcctcatcactgctgaattcc
-cagaacctagaacagtgtgcccagaacagagtagatccttgataaatatttatcaagtat
-gtgagtCAATAAATAAATGAGTGAATGAATGGACAGTGTGTAAACTGGGGTCATATAttt
-ggcaggcaatttggcaacatttattagaatgaaaatgcacaaacactgatgcagacattc
-ctcctttagccatacgctcgactgagacatacaaatattcaaaggaatgggtcaaagagt
-gtttttgtagtgctgtttaaatggcaaaagttggaaatgacctaaatgccaaacaatact
-acactaataaagttatggtttattctgactgtgaaatattgtgtgttcttctttaaaaaa
-atagtgttttcatactgatgtggtcagatctccaagatacattatcaaaagaaaatagca
-agtcacagaacaataatatgtaacatttacggtaaaaaCAAAACAAACTTTccaggcgca
-gtggctcacgcctgtaatcctaacactttgggaggctgaggcgggtggatcacgaggtca
-ggagattgagactatcctggctaacacggtgaaacctgtctctactaaaaacacagaata
-tcagccaagtgtggtggcacgcacctgtaatcccagctactcgggaggctgaggcaggaa
-aatcacttgaactcgggaggcggaggttgcagtgagtcgagatcacgccactgcacccca
-gcctgggcgacagagagagactccatctcaaacaaacaaacaaaaacaaacaaacaaaaa
-acaccacaaacaaacaaacTCAGTCTGTCTGGTTAGCTAGCTActatctatccatctatc
-tatccatccatccaCTCGCTTACATTGGTCAACCTATCAGTATAAACAAATAGAAACATA
-TCTAGAAGGAAATACCAAGCTGTTAACAGTTCTTCAGAACAAGGGAATAAAATGTGGAGG
-TTTACACAAAGGGCTATTTTTACTTTAAAAATAtatttcagtataatatgcacttaatgt
-gcatagataggttggcaaatgataaagctttacaaactgtatttatccctgtcagcatca
-ctcagatgaagaaagagatatgaccagcaccccagcagccctactgttatcctctcaagg
-aaaactatcactgcccttctattacttttatcaccctagactagttttgctaatttttgg
-actttatataaatagaatcaaaaagtggatacaattttgtatctttcatctttggtgcaa
-tattctgtttatgtgaATATTGCCAAATGGCCTGACACTCCAACCAGTGTGGCAGAAGGC
-CTGTTCCCCCCATGCAGCCACCcaatacattttaactaacctgtagtctgtattttgttc
-agtcccagtaatgtcctttacagctttttttctagtttgggattacatgttgcatgtagt
-tgtcatgtctctttagtatcctttaatctggaacagtttctcagcctttctttgtctttc
-atgatgttggcctttaagaaaaatataggttagttgttttatggaatgtcacatccctca
-ctttgggtttgtgtgatgtctcctcatgattagactgaggttatgcattttgggcaggaa
-tatcttgtaaatgatgctgtgttcttctcagtctatcacattaagaggtacacaatgtca
-atttgtccctttattagtgttaactgatcatttggttaaggtgacatccagtttctccac
-tgtaaagttgtttactttttcttttgtaattaaaaagtaattttaggaagctactttaat
-atctttatctattaaatatccttttccttgtcaaaGCCATGGTATGTTTAAAATGTGaat
-ttctttctaagttcaggggtacatgtgcagatttgttacacaggtaaacatgtgccatgg
-gggtttgttgtacagattatttcattgcccaggtattaagcctagtacccattagttatt
-tttcctgatcctctccctcatcccacgctccaccctccagtaggccccagtgtgtgtcat
-tctcctctgtgtgtccatgtgttctcataatttacctcccacttatgagtgagaacttgt
-ggtatttggttttctgttcctgcattagtttgctaaggataacggcctccagctccatcc
-atgtccctgcaaaggacaggatctccccttttttatggctgcatagtattccatggtgta
-tatgtaccacattttatttatctagtctatcattgatgggcatttaggttgattccatgt
-ctttgatattagtgctgcaatgaacatacagttgcatgtgtcttcatcatagaacaattt
-atatttcttctttttttttgtttgagacagagtcttgctctgttgcccaggctggagtgc
-aatggcacaatctcagctcactgcaacctctgcctcttgggttcaagtgattctcctgca
-ccaccctcccaagtagctgggattacaggtgcccaccagcacttccggctaatttttgta
-tttttagcagaaacggggtttcaccatgttggccaggctagtctcaaattcctaacctca
-agtgatctgcctgccttggcctcccaaagtgttaggattacaggcgtgagccaccgcacc
-tggcctttacattcctttgggtatatacctagtaatgggattgctgggtcgaatgatctt
-tctgtctttaggtctttgaggaatcgccacactgtcttccataatggttgaactaattta
-tactcccaccaacagtgtactgagcattcctttttcttcacaaccctgctagcatctgtt
-attatttgattttttaatagtaaccatcctgactggtgtgagatggtatctcattgtggt
-tttgatttgcatttctctaatgagcaatgatgttgagctttttttcatataattgttggc
-tgcatgtatgtcttcttttgaaaaatgtctgttcatcttctttgctcacttttttaatgg
-ggtagttttcttgtaaatttaagatcctcatagatgctgggtattagactgtggtcagat
-gcataatttgcaaaatttttctcccattctgtaggttgtcactttgttgatagtttcttt
-tgctatgcagaagctctttagtttaattatgtcccatttgtcaatttttgctttcattgc
-aactgcttttggtgtcttcatcatgaaatacttgcccgtgcctatgtcctgaatggtatt
-gcctaagttgttttccaggatttttatagtttgtgttttataAAATGTGAATTTCTTAAT
-TGAGAGTAATGGGAAGCATTTATTCCTGTGCTCCTGAGTCACCGGTTTTCCTTTTTGATG
-AATTTTGATAATCATTTTTTCTCACTAAAATTTAAAGGTTTAATTTTTAAAAACTGAATG
-GTTTAAGCTTAGCCCTATAGTTCTTGAACCATGATTTTAATAATAATGATTTTTTAATCT
-TCATTGCTCTAGCACCTTTAAGAAGGATTCGTTTGAAAATTCACCTGTGTCTCAACCCAG
-GAATAGGCTTGGCCTTCCTTCTCTGATGGCAGCCAGGGAGCTTCCTCCCATATACCGTGC
-CCACGGGAAGGAACAGAAATGCTTCCTGTCACTCCCAGGGGTCTCCAGCTGTCATAAGCT
-GCCAGCTGGAGGTGGTCCAAGCCAAGATTACAGCCGGCCTTTATCCTATAGTTATCACCC
-ACAAATCACCCCCTATCCCCAACCCAGGGGAGTCTCTCTGTCCATTCCATACCCCGGATA
-CTGAACTCAGCTCCAGAACCAGGGACCTCCTGCCCATTCACGATGGCCTTGAGCTCCCAG
-TGCTGTCCCCACCACTCAAGATTGTCCCATACCACCTTTCCCACCCAGCCCAAACCTCAC
-AAGCCAGGTGCATGTGGTGGCCTCTAGGGAAATGAGGTTTCAAGGTATTTTAGCCACAGA
-TCTCTTTGCTCAAATAAAGCCCTACACAGAACCCCAGCCCATTCAACATTTCAAGGTGGA
-GCTGAAATCCTTTGTGGGTTCTATTTTTCTCTCTTTGCAAAGCATTTCCAGCTTGTGGGC
-TGATTGTCATATAATCTAGACAAGTGTTAATTAAAGAAATCACTCAGAGCCTGTATATAC
-AAAAGGTAAAAATTTTAAAATCTTTACAGCTAAAAATATATTTAATGTGGTACATTTAAA
-AATATTTGATACAAGGTGGGGATCCCAAACAAAGAGTGCCAGGGGCCTATGGTGAGCCAA
-CCTCCCACACCTCCCAAATAAATCAGTCATCTGGCTTTGTCTATCTCTACGCTCTTCCTA
-TGAGTGTTATCACACTCAAATTGCATATTGATGGGATTAACCCTTTAAGGTCTCTTTCAC
-TCCACCATTGGCTTAGTGAGGCAATCTAGTCCATCATTGTCTCCCCAGCTCTGAGAAGCG
-AGCACTATCATAAAAGAAAAGAACTATTATACAAGAAAAGATTGCTACAGTGAACTAGAT
-TAATGTTAACAGGCTCCTTGAGGTAAGATGCTAAAAAGCATCAGAATGAATGAGTGAGTC
-GATAAATGAGTGAATCCACACTGTTGCTTATGAGGTCTGTGGGTGATGACGCCCCATGTG
-CATGGCAGTTTCAGAAGGGCTTTCAGGGTTTAGATTCTGGGGAAAGGAATCCACTTCACA
-GACCCTGCTGGTGCCGAGCCACTTCTAAGAGACCAAGGAGCCTGGAGCCACCCCATTCCT
-CCCAGGGGGTGGGGTTAGTTGATGCTGTCTGGTGAGTGACCAATCGCATCAGCACCTCTG
-CTGACCCCATGGGACTCCGCTACCTTCTCTCCTGGACTCCTAAAACTGCCATTTCTCTGA
-GAGGGGGAGGAGGGCTTCTTGCTTCCAAAAGGACTAAGCAGGGTTCTGGCAATGGGGACA
-GGATAGTCGTTCCCTGTGGCAGGCTGATGTACAATGGGATGGTCCTGGGGCCACATCTGG
-GCACAGACCCCCATTATCTTTAATGGTGCTCTTGCCAGGGGGACACTGCAGAGAGGAGTC
-TACCACGAGGAGACCTGCTCTCCCCTCCCAAGCACTGGAGCAACCTTGGCCCTGCCCAga
-aaaaggcagctgtagggaaatggagctgagtttaaatgcccactgggcacttagtagcca
-tgtgaccttgtgtaggtgactcctcctcttcctctctgggcctgagtttcctcctccata
-aaatgaggcagtcatctttgcagctctgcacccacaaagtgccattgtgagggtcaaata
-agtggatgtaaaagggcttgcagagaaccctgcagatggaaggtgGACCTTTATAAGGGA
-GAAATAAAATCTTATTAAGGAGAAAATAAATTCCCAAGAATGAGCTGCCCAGCATCTTTA
-AAAGAAGACTGCAGAGTGGACAGTGCTCAtacctgaaatgttttttttattcctctacca
-gtcagcctcctacacatcccagaggaggcagtgccttccccagaaagccctgccaggctg
-cactctgtcctcccatcctgctgcctccagcacaatgctcatatctgactgtctgtctac
-ctgacatctcccccactggtctggtgctcctttgggaaggaactgtatctgatgcaacca
-ggaatttcagctcttagggcagagtctggcgcatctgaggcacacatcaatattCTGAGC
-CAGACTGACTGGCTAGAGTAGAGCTAATGGTAGAATGTCGGGGGCTGGTGCCTAAGGTTG
-GGGTAACTAAAGACGCAGGCAAGCCTCACACTCCCTTCCTAGAACCTTATCTGATTACTT
-TCTCCATCTAGGTTTGAGACGAGGTCTAGCCGATCCTGCCTACAGGCTGAGTGAAAGCTC
-TTTAAGGTAGgggtgaccagcttttcctggtctgctcaggactttcctggtttgagttct
-aaaacgtcccatttcccaggtaaaccagggcagttggtcatgctaCCTTAGTTACTAATT
-GATTCTCATAGTAGACATTGTAATTACTCACTGATTGTATATTACGCTTCTCCTTCCTCC
-CCCTTTCCCAGGCTGGCAGAGcccatctcttaggacagaggctgaaaacggaagatagtt
-tcccagcctctcttgtggtgaggggttgccatgtgaccgagttttggccaatgagacaaa
-agggaaagtctgctgggaacttctgggaaggggttttttctctctatctaccttcacccc
-ctctttcttcctgctttcggtcgtgagaatgtgatgattagagctgtgacagccatcttg
-tgaccacaaggaaacatccttaccacactctgaggggtaaaacgaaggacagtaaaagct
-cgacactttgatgacattgttgatcctctgaaCGACCCTAGGACttgaacaacattaaaa
-tgttacatgttgtttatcaaaagacatcattagaataacaaaaaggcagcctctgtgctg
-ggagatgatatttgaaatctctccttgaaaaggactcgtatacagaatactcaatgatag
-ataactcagttgttaaaaattggggcaaaacttgaaaagaaactctagaaaagagaaaat
-taaaatggccaataagcaaagcacacaaaaaggtctgaacatcattattcatcagggaaa
-tgcaaattaaaactacagtggggcccgggcctgttggctcatgcctgtaataccagcact
-ttgggaggccgaagcaggcatatcacctgaggttgggagtttgagaccagcccgaccaac
-ttggagaaaccctgtctctactaaaaatacaaaattagctgggcgtggtggcacatgcct
-gtaatcccagctacttgggaggctgaggcaggggaatcacttgaactcgggaggcagagg
-ttgcagtgagctgagatctcaccattgcactccagcctgggtaacaagagcaaaactcca
-tctaaaaaaaaaaaatacaatgggatacaatctcacacttaccagagtggctaaaattaa
-aaacactgaaaatacaaagtgtcggtgaggatgtggagaaactggaactctcatactcta
-gtaatactaataataggagtgtaaatttggacagttgctttggaaaactgctaagcaata
-gctactaaaactaaacacagacttacctgatgaccaggtatttacccaagaaaaataaaa
-acatgtccacaagaagatgtgtatgtagatgatcatagcagctttattcagaacagcaaa
-acacaagaaacaccgccaacgcctgtcaacaaaagaacagaaaagtaagttgtgatatat
-ccatacaatggatgtatatgttattttatgaatatataaaatggatatattggaaatact
-acatggataaaatagttactttttaaactacatagcagtgaaaaagaataaactactgac
-acgtagcaatatggatgaatcttaaaattatattgtgcaaaagaagctagacacaaaaga
-gtacatacagcatgattcatttctatgaagtttaagaatgggcaaaaccattctatgctg
-ttagaagttggttagtggttaccctttgcaatggcaggtggagcagtggggagcagtagc
-tgggaaggaggtatggggatgccaaatgggatgtcaagaatgttctacatcttgatctag
-atcatatacttgcaaaaaattccttcagccattacagctcaagattcgtgtgctttattt
-atgcaatacagcaatctaaaaCATTAAAAAATGAATAATCTCTATGGTTTAAGGCACATT
-TAATCGAGTATTCTGTTACTTGTAGCGAAAAGCACTCTAACACTCCTCAACACAATTTGG
-CGACAGAGGATGTTTGTTGGGTGAGTGATGGTAATACCCGTGGAATAGCATTCTTACAGG
-GAACAGGGCACATTCACGCcattaacacctgtcactctcacttcagtcccaccagggagg
-gtttgttagtttcctctaacagatgaggaaactgaggtccagagaatcgcactgacctgc
-tcagagtcacacaacgagctttttttttttttttttttgagatggagtctcactgtgttg
-cccaggctggagtgcagtggcatgatcttggctcactgcagcctccgcctcccaggttca
-agcaattctctgcctcagcctcccaagtagctgggattacaggtgcccgccaccatgccc
-agctattttttttttcttagtagagagaggttttgccatgttggccaggctggtcttgaa
-ctcctgacctcaagcaatccacctgcctcggtctcccaaagtgctgggattataggcatg
-agccactgtgcccagcctacacagtgagcttttgaccaatctagaatttgggcccaagat
-tgtttaatcccaaacccagtgctctttccgctacacttctctcaccctGGGCACATCCAC
-CAACAACATTTGTTGAACTCCTATTCTGTATACTTCAGGGAAACTTTATCTGGTCTCTAC
-TTCCACTGAGCTTGTGGTCTAGGAGAAGAACAAGAGTTTTATCTAACAATAATAATTGTA
-TTTTTAAGTGCTTACGTTTATTAAATACTTACTATCTCCTAGACCAGCCTTTTTCagtgg
-agtccatgtattgcagagtatactccactgggttgcaagaaaaacaattagtaattctat
-ctgtatatttgatctcatcttttaaaaattttcattttgtgtatatcatataagatgata
-atatattgattgataatatattatgtttttactttgtaaatgtacatattaaatatattg
-ggggcaatgttcaCTGACAAGAATGGGACACCTAAATCTTTAAAGACCCATTGGTCGCCT
-GATCACATGATCCCATCTGGCCCTCATGACACTCCTGAGGACCAGAttttttttgttgtt
-tttagagacagagtttgctatgtcactcaggctgggatgcagtggtacagtgatggctca
-ctgcagccttgaactcctgggctcaaatgttcttcctgcctcagcctcccaaagctctgg
-gattacgggcatgagccaccatgcGTGACTGAGAACCCGATGTGTTGCCCCATGTTACAT
-ATGAAgatacatctttaaggtaatgaatatcccaatcacccagatttaattcttaagcgt
-tgtatacaggtatcaaaatatcacatataccccccaaatatggccaactattgcatgatt
-aaaaaataaaagaaaaaaGAAAAAGAAACCATCTTTAGCAATACCCTTTTAAAAAGTgct
-ttttgtttgtttagctttctttgaacatttgacccaagtcttccctcactcagaaaacca
-ctctgtaaaacatccctcaacatgatttcctcacagacaaacctgtctgataatttaatg
-ctgctgccatttttttttctggagctctgaactttgatgcctatctggactagttttgct
-ctagacttggggcacagataccattaggaattcctttGTCTCTCCTGTGTTGAAACCACA
-GACTGCTATATCTCAGTTCATCATAGAAAATTTACAAAATAAAAGCCACAGAGATTCATT
-Cccctgcctgtgtctaagctcttgtccaagcccctctcacattgactctgggcttggtca
-cgtgacttgctttggccaatggcataatggcaaacatgacacaagcagcagctggaaaat
-tacttgtgcatatgagcctttgccctttcagctctggggaaccctgtgaccacaaccagg
-ctggcagcaaacccaggctggtttgctgaagtataagagaccgatggctaaatcatctct
-gttaccccagctgtgccaagccaaccagcatatatatgtgagtgaggccattgacgacca
-gctgacggcagacacaggagagaagccagccaagaccacatggagcccagcccacgccac
-tactgggctataggttcataagggaataaatggtggccgttttcaggcaatttgttacac
-aggaaaagctCATGGttcctcttcttggtttagttcctctttttggtggagcacagcccc
-tggtagcATGGAAGttttaaaacatgtgcaccaatcctttgacacttgtcccatcagcag
-atagggttcatgacaccttcccttgcttgggcctgtaccttagtaatgcagcaaaagtga
-catggcataacttctgaagataagttagaaaaggccctacagtttccacctggttctcct
-gggacactcactccggggtaagccagccattgaggaagaggtatgagatcaccgtgctgg
-aaaagctacatgtcaacacaccactcaacaatccagtcgagacagccttccagccatctg
-ggccaaaggagccagactggtgagtgatgtcatcttgggccctccagaccagctcatcca
-ccagctgaagaccactaagtgagctccatcaacaccacgtggaacagaatcatcacccag
-ttgcaccctccctcagtttttaacccacaaaattaatccactaattttggtgatggtttg
-tcatgcaacaatagataaccagaTTCTATGCCATGATGGGAAGTTCTGCAGTTTCATTGG
-GAAGTGGCAGGCATTCTGGGACAGAAAAAACTTGGGGTCATTTGTGCAATCTACTGCAca
-gatttttaatctctggtttcttactctctgttccttccagagagcttcttgttcacattt
-tactgctgcaatatctttatcactcaagggatattaattgtaggatttattttaagtttt
-ctcttgttccctggattcttttcttgaagaccttttaccccgccctcatggtttgctttg
-atctctgcacttcatgatagaaatttctaatgatccttggctgtctactcacattaccac
-tctggctggaaactgggtggggagggtggactggtaggcttttgtgtagggtccatgcag
-ggtggttgcatagggctggtgcaaaggggctggttggctttttctgtgatgcactctcct
-cccacccccaattaccgtatctttaggtctttgtcctggaagtggttctccagataattt
-tctgcctggggttggacattctagaatgagacgggtgaagggggctgaagatctcACCTT
-CTctgggcctgatgtttctagttttggagtttctttgttgcctttttttcagagaataaa
-cctccctttgcttgcccagaagtgagtggggttactacctggctgggcaggatgggggtt
-ggggacgtggaggtcccatgctccttgtacagattgctttcaatccccacttcaccagca
-gctcctccaagacctagtagcttcaatttttgaggcctttaggCAAATTGGCTTGTTTCT
-CTATGCAGCAATCCACCCACACAGCAGTCACCTACCCCATCCATTTAGCTTTGACTTTCT
-TCCTCTCGGTTATGTCACTGGCCACTTCATCCATTTCCCTCCTTTGTAGTTCAGGGTTAC
-AAATGTCTCTCGATTTCCTCAAAGACAGAGTTTTTGTTTCTGCTCCTTATTCTTGTTTTG
-GGGAAGTTTTTTGTTTGTTTTTTTCTTTTTTAAGAAGAGAAAAGGAATAGAAATGTCTTT
-AGTCTACTATCTTAAAGCCACCATTTCATTAGAGTTTTAAATGGAAAAAGCACCCTCTTA
-TATTGGACAGAAGTGTGTCAGCAATGTGGGTTTTGTGACTCTTACTGGAGTAAGAGCCTA
-CATTATACGCCAAGGTGGCTTCATGTTCTAGTTTTACAAATGCATTTGATACAGTTAATA
-AAATAGCAAATTATGTATTAAGGAGAATACAGATAAGTCATTGCTGGCTTGGCAGAGAGT
-GGAGAGCAGCCTTGACCAAAAAGCTTAGAGGAGGAAAAGTGGGGTGGAGGCATGAGGTTG
-ACCTGTCCCTGCTAAGTGCCACTGTTTTCAgctcacccctttccacctgcaggtccctgc
-tcagatgccacctccttggaggatccccacccacctgtcactttctctctactaacttgt
-tttatgtctgactgcctgccaatggatttgattgacttatttatctttaggtttgtcgac
-cccactagatcatgggctccatgaccagggggagctttgctttttcacctccatacactc
-ggtgcctgtgagcacctggtacatcagtagatgctcaataaagagttgttgagtgaacaa
-atGAATGAGCCAGTGATTGCGTGGATCCATGTTTTCTATGAGAAGGCAGAGCTCTGAGGA
-CAGACAGAGGCCCAGTGTGCATGAGAAAGTCCTGCTGGCCCAGGCAGTGGCCTAAGAGCT
-GCCTACCATGGCGGTCACTGTTCTTGGGGAACCACAGATGTTTCCCCTCTAATCCCTCCA
-TGGGGACCAGGGGGGCATGAGAATGGGAGAGAACACAAAGTCCCTTTATTCAGGGGAGTG
-GATTCCATCTCAAGACAAATTGTTACCTCCAAGGCCACCAGCCGCCCAGCCGGCCCATCA
-CCATGGCCTCCCTCTTAAGGATGTGGGCACAGGCCCGGCCAGAGCTGAAATTGCCCTGGA
-AACTAGTCTCCCCTTTAATTAACAGGGAGGGCGACCAGGCCTGCTAACGGGGTGGGGTAT
-GGAGTCGGGGTGGGGTCAAGTTCATAAAGTCCCCAAAGAATCAAGGCCTCCTTGTTTATT
-TTCCCGAAAATGTTCCCCATTACCCAGAACAGCATAGGGGCCAAGCAGGCCGCAGGCAGG
-GAAAAAGCTTTAACCTCCCCGCTGCTCAGCTCAGCACATCACTATTTGACTTGCATTTTA
-AAAATAATTACAAACTTAATGAAAAAATAACCTAACCCCCAAACAGGCCAGGGACTCATG
-GCCAGCATTGGCAGGAGCAAGCCCCTGGCAGCTGTGAGGATGAGATGCAAAGGGTATAGA
-GGAACCACTGGAAGACAGGGGACACCCTTTAGATGGACACTCCCTCTCTCTAGCGCCAGC
-TTTGGCTCCCTATTGCCCTTTGTGTCATGCCCAAATGTCTCAGCCCATGTCTTAGAGCCA
-GTTTTACTCAGGCCCTATGTGGAAGACACTGGAACCCAAAGAGGAAAGGAAGTTGCTCAG
-GTTGTGCATTGTGTGGGACCTGATGCAGGTAGTGAGGCTGGTTGGGATGGGTTCTCGGGG
-AAAGAGTGGAGGAAAGTGAGAATGTGTCTCTGTTACCATCTGAGCCCTGGCTGGGTATGG
-CCAACATGCCAGGTAAGCAGCCTTGGGAAGCAGGCACGATGATTATCCATCTTTAATATC
-CCAGGACTTGAGTCCAGGTCTGTCGGGCTTTTAGCCACCACACTAAGTGCTGTAAAAGGA
-GCTGGAGGTAGAAATGAAGTAACAACAATAATaataataagcagctttcatggattgtag
-actatgtgccgtgcactgtgccaagctctttaccatctcttttaatctttgcaataactt
-tatctggtaggtagtgttattgacccattttacaaacgacgcccagagcattggttcaag
-gttgtgcagctgggaaatggcCTGTACTCTTCTACCCTGAGAATAATGCTCTACAGTGAG
-TCAGGGAGTCTtgtgaggtctcaagaacagggaccttgtctgtcttattcacttgtgtgt
-cctcagagcccagaagagagactggcatataatagatatttaatatctgtgttgtgaata
-agaatgaaCAAATGCACCTGGACCTAGAAGTAACTTCCGATGAACCATCCCAGTTCTCCC
-TTCCCCATTCCGGATTATCTTTACTTACCTGGAAGTGAACAAGATATTAAGGGGCTCCAA
-AAGAACTGAGAAATAGAACTTGGTTTGAAAGACAGTAGGGAGCCACAGCAGGTCCTTCAG
-GAATGGAGTTCCAAGCTAGGGGAGTGATGGTCTTCCTGTGTCTTTATGGATTCCAGGAGC
-TAGTCAAGGTCAATGAGCCTTTAGCCAGAAGGTCAAGTTATCCCCAGTGGTAAGTGTTGG
-GGGAAGAGGAGGGCACTTCTCAGGAGTTGAGGGTCCCAAACTTGTCATGCTCATTGGTTT
-TGTGGCTGAGAGTGGCAGGTTCAGGCTGGCCAGCCAGCCTCTTCAGCTTGCCCATGGTAA
-ATCCCATGATCCTGGGTCAAGGACGCCCAAACATGGTATGTCCATAGCCAGCTGACAGAA
-TTCGTATGTCATTGAATCTTTCAACAATGGATTCTTTGAAACTTACAACTCTGGGGCCTT
-TGAGGTCCATCTCAGATTCTGAGGCTGTAGAAACTGTTCATTTTAGAATAATGATAGGTA
-CAAaacatttactgagtacttactactccagacattgtttacaaatatcaacgcctttaa
-tcctcacaaccaccccagaaggtagtaacaatgtgaccccccacttcacagatgtgaaga
-cggaggcactgaaaggtgtaacttgcccagggtcacTGGCCGCCTGGCTCTAAAGCACAC
-AGCACTGCCTCACAGACACTTAAAGTCGTTGAGACTTACACTCTTCAAATTTTAGAATCG
-TAGAAAGTCACAAGGTCAGGATCTTCAAGCCACAGAGTCTTAAAATCATAGCACTTTAGA
-ACCTGCCATCATTGACTCATCAAATTCTGCCGTCATAAAATCTGGGCATGTTATAATCCT
-GGAATTCCAGATTCTTGGGGACTTTTAAGTCAGAGAAGTTTAGatcctgggatattaggc
-ttggattacagaccctagcccagtcctctcatatagcacagggaaactgaggcccacaga
-agtgaCAGAAGTCCAAGAGAGGCAGAGCCTGGTGGATTCAGTGTCATGTTTGGAGGGAGA
-AATCGGAGTGAACAAAGAAAGCCCCTGGGCAGGCAGGAATCTGTTTGTGATTAGCAGTGG
-GTTTTAGTGTTGCCGAGGAATGTACCCAACGTTACCGTTACCCCCGCAGGTTGCTGCCTC
-CTTTCTTCCCCCTCAGATGCCCTCCTCAGAGCCCATCCTGGCCAGACTCAATATCCTGTT
-TCTACCACCAGCAAATTGAATTTTCAGAAGTTGGCCTCCTAACGAAGCCAGCTTAATACG
-TTGGAGGTTTTCTTTGCCTGCATTGCTATTTCTTGGTAGGATGCCTGCTCTTCAGGAGCC
-CAGAGAGGTTTTGCACACTCAAATCACAACGCCAGGAGGGATGAGGGACAGGAACTATGG
-GACAGGTGGCTGGGGGCTTAGATAGACCCAGAGGTGGGaatagaaatggcgtgtctcaag
-ggggaggtgacaggtccacagggacctccgtactgctcaggccacacctgggaatttggg
-ggccttcagtctttcagaaacattaaccaaatggggtttgtttagaggagggatggggag
-agatgggtgggaatcccatgCTCTGGGAGACCTTGAGCGTGGACTAGATGGAAAGAAGCA
-TGAATTCTAAAGTTCAGCCTCTCAGCTACTGCCCCCTTGAAGACAGACATGGGTGGAGCC
-CTGGGGTATAGACCTAAGATTGAATGGTGGAAACTCCATGAAGATTTTGGTTTTATCAAA
-ATCAGTGGTTCTCAggctgggcatggtggctcacacctgtaatcctgaggcgggcaggtc
-acttgagatcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaa
-aaatacaaaaattagctgggtgtggcatcagacacctgtagtcccagctgctcaggaggc
-tgaggtaggagaattgcatgaacatgggaagcagaggttccagtgagccgagattgcacc
-actgcactccagcctgggcaatagagcaagagcctgtctaaaaaaaaaaaaaaaaaaaaa
-Gcaatggttctcaaagtacagtacagtccagaatctgtggggttcctgagaccattccag
-ggcatccacatggtcaaaactatattcacaacaacactaagacattatttgttcttctaa
-ccctcagtggggttgtccaaagttgatatgacatgtgatgccaccatcactctgatagca
-atgaaaaaaattaatgcaaaaacattcatgatgaacaaaatactaaaactgtaaataaag
-agaagactaatactactgatttttcctttcatctcaggcttcagtgtgaatttttcaaaa
-tattgcattaaaatgtcctaattactgatatttttggcacacaaattttaaacctgaggc
-aagtgcctcgtttaactcactctagtcctggcTGtggatataatccacatcaacagaagc
-ttgttggggtcctcaataatttttaaggatataaagtgtgctgagatgaaaacatttgag
-ggtcactgataaaagggataatgttccatcagctcaaactatccaacaatggaggggatt
-atattccaaggtactgagttcccatcacaaggtgtgtacaaatgggggGATTAAAGGATT
-GGGTGTGGGGAAGAGGCCTAATGTGCAGCATCTCTTGCCCAGGTGCCTCCTGTGGTCCCA
-CCTACCTGGCATCCAATagatcttctcattttcccacttgaaagcttgcaatggtacccc
-actgtgctctgagcaaaaacccacctcttctccatggcctaccaggctctatgtgtcctg
-gccctgtctcccactcttttgcccctagcttgctctgctatccccaacctagcctctttc
-tatttcttcagcatgccaaactctttcttacctagggattttgcacacgctgttccctct
-gcctggaacatcttcctcttcactcttctcatggctgttccttgtatcttctgagtttca
-acttgactgttgcctccaggaaggcttccctgatcaccctatagtaagtaggatttctct
-gacatcatctctcaacctcttttttgcttccttcatggaagtcatcactgcttttttata
-tttacttgttggcatggatggttctcatctattctctccatgagaccatgagctcctcca
-gggcaggaagcctgactgttcagacatggggcctcagcacctgacccagcacctggcatg
-gaggaggcccttgagaagtgtttgttaagcaaataaaCAAATCCTTTatgaattagtgaa
-tgaatgagtaaatgaatgaaAGATTAAACAGAAAAGGCCTCTGACTGCTGATGCTCAGGC
-ACTCACCAGGAAACCCAAAGTAACACAGGTTGTTACTTTGATGAAACATCAGTAACCATG
-GCTGGATAGTGTGTGATGAAGTATTAAGCAGTAAGTGTTTGCCCACTACCCATCAGCGCT
-GATCAAGTTGGAGGAGAGGGAGACTGGCCTGGCTGCAGAAATCTTGGATGAGTTGGGGCT
-TGAACACAAGCCTTCAGGGCTTTGCCAAGGCAGGTTCCCCTGCCTAGTTTCTCTGAAGAT
-TCACATTGTATTCACTGTGAGGGCTCGGCTCAAATAACCCTGCCTCCTATGGCTCTTCCC
-TGACTCTTCTTGGGTAGGGTCGGAACACACCATCCTTGTTCTGGGTGTTATTGTATTAGG
-ATAACCACCCTTGTCTATCACTGATTTGAAGACATTAGCTTATAGAAATGTCCCGACAGT
-ATAGATGTTATCCCAGTTTAGAGATGAGAAAAGTAAAGGTCCCAGAAGAACTTACATTCC
-AGTGGAGGAGACTCATCACGGGCAAAAAACCAAACCCACGTGTTGTGAGTGATAAGAGTT
-AAGGTGAAGAATGTTGCCGCGGAAGAGGAGTGGGGAGACCTCTCTGAGGGATCAAAGAGA
-TGTGGGTACAAATTCCATCTAATAGTGTCAGCTAAAGTTCAGTTAACTGTTACCACTAAC
-AATGAGTTAGCtgttgcttccaggatgtctgtttcacgaggacagggactatgttcactt
-ttctgtccccagcacctagaacagtgaacaacacatagtaggtgttccatgtatggtgtg
-aggtgaataaaGGCCTGCctgcatcaggcgttgtatatgaattattttatttaatctcca
-tggtcagagaggtaagggttatcatccccattttgtagataaggaaatgagggcacagtg
-aagttaaagtctaatgacttacccaagaacacccagatagtaaatggtggagcccgagtt
-ggattcgaatccagtccaatctgtctcgtatcttagccactctcctacacAGccttattc
-tgctcactcactgtgtgaccagggcatattgcctaacctctcatccactgaggatgtcat
-tttctttagcttttgaaataatacccatgtcatagggttactgtgaaagtttggttcagg
-tagagctcttagattcctgtctggcacacagtgaCACCTCTTTTCAGGTGACCCATTCTC
-GTTTGATATTGTCAGCCATTGTGAAATAAGAGGGTATAGAGCAAAGCTTTCCAAATGGAA
-AAACCTGCTATGATTTCTAGAAAGTCTTGGGAAACTTTCTAGATCAGTTATGGAGGTTGC
-AGAGCAGAAGGCCTCAAGGACGAGATGCAAAAACAGCACCCATGCAAGTTGACTTGTAAA
-CTGCTTTCTTCATCCTTTAGGAGGAATTGCCCAagaggcagcatttatggggcatgccca
-gggtctccaggcactgtgctgagggctctgtatcccgtctgtcaatttttcccaactcta
-ttatacagatggcaccactgaggctcagagaggtgaagggacttgcccaaggcctcatag
-tgcatcagaaacagtcaggactcagctcaagaaaaggccccaaagcaagcactcccaacc
-acatgatctaAGACCAGGGAACAAGGGGACAATGAGAGTGAGGGCAGGAAAAACGCTGGA
-AGATGTACCAGAGACTTAGCACTTGACTGATGGCATCTTTCCAGGCCAGTGCCCACCCCT
-CCTCTCCTGGCCTTCTCTTCCACCTCCCACCCTCCTGGGTTCCTGCACCATTTTCTCACT
-GGAGCTCCTGCCATGCCTGTTATCTTCTgttggttcttgggaaaagactctgagatggag
-attggcgtgcagtgggtttattggggagagtgctcaggagtaagaccaatgcaggagtga
-ggaaaacaggcctgggaggagtgaacagctggcacaatggagttacaacagaaatctcag
-tgatcccacaggagctctggagcagagatggcccttcggagctgaaggatcgggtcaggc
-attttttatcatacaccaaccactctttggccacaggctgcacctggaacgaacgtgtcc
-ttgggcagggcaagtccctacagctgagggccattcccggctgggaaatatcagcagctg
-gcagtcccatcagctgggAAGGGTGTCTGATGAGGGAATCCATGCTAGCCCCCAGCCTCC
-TTTCCACCTGTCCACTGTTATCTGACAATAGCGATCATGCCACACTAGCTCACACCGGCA
-GAGCACTGTCTACCTCTCAGGCTCCCTACCACGTCGTGTGGTGTGtggattccctcattc
-catcctcatgacaaccatgagagggggacactttccacatgaggaaacggaggctcagtg
-agatgaagagcttgcccagagtcccaaggtgcaagaatgctgtagctggtattctcaccc
-aagcagtGGGACCTATGGGTCCTATCTTGGTCCCTTATAGAAACTCCTTCCTTTAATCCA
-ACTCGGCACTGAGTCCCCTGGagtcaaagctcctgccctccaaaagttcatcatccagtg
-ggggaagtcaagacatatacactggaaagataagggctggtaagtgctgtgatgagaggt
-gacctgagggtgggtgacagggatgtcctgcccaggaaggcaggtgagacaaagtcagtg
-agttcagcctcagtggatgaggagagtgctgtgggaaggatcggggcagggtgggcttct
-aggcagtgggagcacaggtgcaaagacagagagggtgaaagagAGGGGCCCTCCAGAAAT
-AGGGAGTGGTCTCCTGAGATGACATAGGGGTTTGGGGGAAGGAAAACAAGGTCATCAAGG
-TGGAGGGGCTCCAGCCTCAGGGCCCTGCATGATACAGTCCCTGCCCTTCCGTGAATATTT
-GCTGAACGAATGAATGGTTGGATGGGTGAATGAATCGCTGCTGTGGAGGGTGGATTGGAG
-GTTACAGAGACGGGCAGGGAGACCAGTGGGGGGTCCACAGCAAATGTCCAGGTAAGAGGA
-AATGGGCCCAACTTTGCAGGGACCACAGGGGTGAAGCGATGAGAGAGAGAAAGAGAGAGA
-GGAGCGGAACGCCGCTGGGTGTGGTGACCTAGAGCTTCTGTGGCCCATCTCTCAGTCTCA
-CCCTGTTCCACCTCCATGCCCTGCACCATGCTGCATCCCCTGCCTGGCAGCTTTTTCCTC
-TCCCTCTGCATCTGCAAGTTGCACTGGCTGCCCAAGCTCTGCTTCCTCTAGGAAGTCTTA
-TTGACCAATGCAGCTCTCCCTTACCGTGCAAGGTCACTTCCCATCTCCCTCACAGTTTAA
-CCCTAGCAAACTCCATTTGCAGAGGCCGGTGTTCAAAATGCAATTCTCCAATTTTTGAAT
-GCCAGGCCAACAGGGAAGCATTTAATGCCCTTCAGCAGGGGTATGATGGGATAAGTGTGA
-ATCCATGTATCCCGTACAGGTAGGACCTCTCTGCCCCCATAGTGCCTGCTCGTTAGCCCT
-CTAAGGGAGGCATCTGGTAAATCTGGGCTTGGAGTTTGGAGGATCGGAAACAGGAACGAC
-CTCTCTGGGGACAGTTCTTAAGTTCTAATGGAGCAACTCTTCACAGAGGGACTTGCAAAG
-CTCTTAATTAAAGTTACCATCAGAACAAAGACTCTCTGAAGCAAGAATTTGGACCCCAAT
-GGAGTCCTGAATCCAGGCAACCAAGCTTGCATAAGTGTGCAACACAAAGGCAAATGAGTC
-CCCAAGGAAGAAGAGGCTCCATCCTCAGCTTGCTGCCCTTGTCTGAGGGAAGCACCATGC
-CCTACAGCTGACATTTACTGAGTTTGCATCCGTTgactcttttggttgcagaaaactggc
-tcagacaaaaaggggatttgctggactgaaaaggccaggctggagctatggtgcagcagg
-atctaagggcttaagtgatgtctttagggtggggtttctctccatttttttctgctcagc
-atccttcagaatccacttcattcccagAGTCTATGAAGGTGGGGTGCACAGAGAGAGTCT
-GTTGGACCAGTGTGGTCACACACACACCCTGAACCAAGGAGCACAACACCTGAGTGGCTG
-AGGCTGCAGGGCACGTCCCAGATTACACTGACCAAAGAGTAGGAAAATGTTCCCCATCAG
-AAATTGGTAGAACAGGGAATGGATTCTGGGGAAGTAAGCAATGAACATTATCCGTAAGGG
-CCTActatatggtaagcagctattaatcgctttgccaatttatagttgaggaaacagcct
-cagagaggtgaagtcactctgacagccaggaagtagggaaaagcaagcttggaacgcagc
-tctgtctggtaccagagcTGAGGGTCTGGGGAGCTCCACCATCCTGCTTTCCAGGCAACA
-TCTTTACCCATCTCTGTTTTGGTCCAAGGCACAAAGCTGGTGTCAGATGGCTCTTGGATA
-AGCCTGTGTGGGAAGGACAGATAGATGGGGGTGTGTatggatgaatggattggtgaatgg
-atgaacagcggggtggatggatgggtaggtagaagggtggatggattgctggctgtgtgg
-tttactggctaggtgggtgggtaaattggtatatggttaggtggaagggtggatgtatgg
-ataggtgggtggatgCTTGGGTGAATAAATGAAATGGCAACTGAAAGGACAGGTGGAAGG
-ATGTGTGGGTAACTAGATGGGAGGGTGAATAGAATAATGCTGACATAAGCATTAACAATT
-ATGTCTAGCCTCTTGCCCCTCTCTTCCCAACTGCCTTTTCCAGTGGAAAAATTGAAAATC
-ATGGACCCGGGGAACACATTCCCCTGTGGTCTGTTAATAGAGGCCCAGCAAGGCCAGCCG
-AGGCTGTCAACTCACCCCCCACTAGGACCCTGTCATTAGCCACACTCCCCCAACCCTGCC
-CTTGGGTGGAAGTATGATCTGGTGGGCACTGAGGGGCTGGGCCCATCCAGGCCCCTTATT
-AAGCCTTATTAAGCCCACAGACGGGGAGCAAAAAGGGGAGAAGAACTTTCTCCCAAAGGT
-CAGCTGTTGGAAAAAGAAGGTACAGATGTCTCTGGGGTGGTCGTCTACTCtcaggccaca
-aggaatgtgaaagtttgcctggcccaatctgctctgctgtcttcttgcaggctgggaaac
-tgaggcccatacaggagacaggagggacacacagaagtcgggacagagccagactcaaac
-ctcaggccggctcacagaccatAGCCCAGCCTTTCCCTGAAACAGCCTCAGCATCAACAA
-TGGGGAGGGAAAGGAATGGGCATGAATGGGGCTCCTGCTATATGCCAGGCCCTTGAGCAA
-AGCATTTTCTGTTCATGGAGCCACTGGTCTCCTCTGTATCCCCATGAGTAAAATGGAAGT
-TATGCCTGTCCTGTCACGGattgaacaagcatttgttaaacatctgttatactgtgggcc
-aagcactggtctaggtgccaggaatatggcattaactagccaaacaaggtttctgctttc
-agagagcttactttctagacagtgatagagacagacaaataagtaggtagataaaatgtg
-atatgaagaaaattgaggagtggtatgagatgtacaaggatggaagggacgttctttgga
-tgagatggttgggaagggcctctctgagaaggtgaTCATGGTCAAGGTCATtaattgtcc
-accaagtccattctcccctttgctagtatgtgggcaaagcccacaagtggctgtccaggc
-agggtcaacatttcccagccctatttgcatgcaggtgtggccatgtgactagctcttacc
-aatagaatgggagcagaagtgatgagtgccacatccaggcctagcttttgagaagtgagg
-gagcttcccccatgttcttgttacttttcccctggctgaattcaaatgatggcaagaccc
-caagatagaggagccacaagattagaagagcctggattcctgcatcaccacatggaggag
-agccactcattgccctggcacatccattgcatgagtgagaaataaacttCAGGTGAGACC
-CAAAAGACATGTGATGAACTGGTTaggacattgcaggcagaggaaatagcatgtgcaaaa
-ggctcaaggcagaaccaagcttggcatgttggcacagaaaggataccaatgtggccagaa
-taaatggcacaagaggaggaaatgaggtgaaccatgcaggcagtggcctcagtcaggagt
-ctgtatttcaagtggccccagtggaggtggcgccatcagcagggaagaaataccatgtgg
-ttcatacttggaaaagatccctctggccactgtgcagagatgagttggaaggaggcagga
-atggacacaccagagaggagctggtgcagtcatcctagcctggatgaggctggggacata
-agagtgagtgaacagagtgggtttggatatattttcaagggcttgctgatgggttgtttg
-tggaaggtgaaggaaaCCAAATAACCCACAAGCCATTAAACAAAATCTAATGCAGAAGCC
-AATATATATTAGTAAACACTTTAGGGGTCTCTGTCTAGCTTCTAATCTTCCTTCCCTGAG
-AACCTCCCACTTATGCCTATCTGATAACTCTACTTATCTGATAAACTGGCCCCTCCCCTG
-CCCTAGCTCATGGAGCTGGAGATCGGTCCCTGACTGGGGCTCAGCCAATCAGATCATCCC
-TGGCTGTCAGACCCCAGTGTGTGGCTGGATGGGGAATAGGCTGGGCCCTAGCACTCTCTC
-CTTGATAGAGATGATGGGGTAGGGGGAAGGTCAGCAGCCCAGAAGCTGAGGAAGAATGAA
-CTCTCCAAGGACCACCTACCCATCCCATAGCAGGCGAAACATAGCTGCAAGTGGACTCAA
-CCACCCTCAACCACAATTGGAGCTGCCACCAGCCAAGTGTGGAAAGGGTTGGTCTTTGCA
-GAGCCCTGGACTGGAAGAGGAGAGTGGGTCTCCCAGGGCAGAAAATGGGAGTGGCCAGCT
-CCAATTCTGTGCCTCAGGTTGGGAGACATGATCCTCTGGGTTCTTTCCATACCCTAGACA
-AGGATATTCCTTGTCTGAGCCTAGACAAGTTATTCCCCTGGGAAGGAGGGAGGTGCTTCT
-GTTTCTCCATCTGTCAGGTGGCTGAGtataacagatttcatttccaaaaatggccacagc
-cccctgctcctcatgaaccctgccactctccatcaagagggagagtttatttctcctccc
-ctggagactggcaggactttgtgactgccttgatgaatagaacgcagcagaggtgactgt
-gtaacttccaagggtgggtaagaaaagacaatacagcttctctctggctctttgtcttga
-gacactcaccctgggaaccagacgaccacggtgtaaggaagcccaggccccctggaaaag
-ccagaggtaaatgttctggccgacatttacccagctggggtcccagccaacagtcagcat
-caaccaccagacccatgagggaatcagtccagcccctggccatcaagtcttccatctgag
-gccccagacaccgtggagcacagacaaatctacccactgtgcccttctggattcctgccc
-cacacaatatgtgaatgcaatgaatgactgtttgatgccagtgtgttcaggggtgatggg
-taacgcagcactagatacccagaacGCTGACTCAGGCAGACTCTGCCTCCATGACACCCT
-CCGTGCTAAGCATCTGTTCCATTTCCCCACTGTCCTGAAATTTCCAGACACTCCTCTTTG
-ACAAGCCAGGCTTGGCTATGAGCTGGGGCCTCTCAGGGATCTTCCAAAGATCAGCCGTGG
-AACAAGCCCTGCGGGGAGTTCACTCCCTGGTCAAGAACCTTTGCTAACTCCCCATTTCCC
-CCCATATCAAATCTCAGCTCTTCTACTAGGCTTCCCAGGCCTGTCCTAATCTCCTCCATC
-CTCATGTCTCCCTGAAATGGGCCACAATTCCTCCCTCTGCAGTGTATTAAGAGTGAGAAT
-GTGGGGTTAGATGAGGTGAGGGGAATCGCAGGCTCTGGGAGAGCTTTGAGAGCTAGGCCT
-GAAGCTTTAGAAGGCAGTCttccctcatttagcaaatattgagtcctagtgtgcactacg
-ttctatttacagtgctgggaatacacagctgcacctgctagacataatccctgtcctaaa
-cccatgaggatcatattctcttccacctcagggcctttgcacctgccattctcctaacct
-aaaatctatttcggaagatttgtgtacacctcatcctttatccttccagtctcaccttag
-aagggcctgcctggccaccctctctagtcatccccattgctaattccctttattattatt
-attttttttttgagacagagtctcactctgtcactgaggctggagtgcaatggcacaatc
-ttggctcactgcaacctctgcctcctgggttcaagtgattctcctgtctcagcctcccaa
-gtagctgggattaccggcacatgctgccacacctagctaattttttgtattttagtagag
-acagggtttcaccgtgttcaaggctggtcttgaacttctgagctcaggcaatccacccac
-ctctgcctcccaaggtgctaggattacaggtgtgagccaccatgcctggcctaattccct
-ttactcttaattatatctccctgttcattttctccctaagtcttgaacaacagtatataa
-tctgtgatggctgatttacttgatgtttgtctgacttcccctactagaagtgtcagctcc
-ctgaggcagggactgtgtctgtctcattcactgctgtgtgccagggcatggcacagggcc
-tggcacccaggggtgctctatgactattAAATGTGTGCAGTGTGATGCTGGCTGCACAGT
-GCCTGCTTGCAGCTGGGAAGCTCGCAGTAAGGGGTGATCCTCTCTTTCTCTTCTGCCCTG
-TCTGTGGACATGCCCCATAAACACTCAACAGACTCCCCTCTGTGCCAGGTTCCATGTGGG
-CACCAGCAGCATGTAAGGGCTCAAACACAGTCGCTGGTACTGAAGCAGCTCCCAAATACT
-GGGGCAGGAGACAGATATCCAGCCTGTACTGGATATCTGGGGACATAGTGTAGCTGGTAG
-GGAGAGACGGCACAAAAGTCAGGGCACCAGAGGTCTGCAGTGCCAAATTAGAGTGGAGTA
-AGGACTCCATGCTGAGTAAGGAAAGAAGATCAGGCAGGCACTGGGGAGTACATTGAGGAT
-GGAAAGGAGGGCGATGGAGGCCATCTGGAAGGACGAAAGCGAGTGGTAGCAGGAGAGGCA
-TCTTAGgtatgaccccgggcatgacacgcaacctctctgaatctgtgtccCTGTTGgtat
-aacattctgtgaagcacacaggtcctggagccttcctgggttcaaatcccaccctctgat
-tactcatgaccctcaataagttctttcaacttggtttcttcatctgtaaaatggagatga
-caataatagcacctccccactattgtttcatcaggatcacatgagttaatgcattgaaaa
-cacttagatcggtgccaggcacatggtaagtggtcagtcaacgtGAGCTAGCACTGAAGC
-AGGAGTCACAGTTGCAAAGCACAGACCAGTGCCTGCACGCGCACACAGCAGGCACTCATC
-AGTGAGACGGACCTTCTATCTGCCTCTTACGCTGtaacacatatcaccacccaacatggt
-atttttttgcttatgtgattattgtcccttgcctccaccagaatgtgagctcaatgaggg
-caggggttctgtctcttttgttcccttgcattatccccagagcccagggcagtacttgac
-acatagtaggtgctcagtaagtagttgctgaatgaattcatttctaatttttagttttgt
-gcttggtgcacagcaaatgctcaacaaatgctggtcctcttCACCCCTACCAGCCTCTCC
-ATCCCGTTTCTACCTGCTCCAGGAAGCCCTCTTGGGCCTCGCAGCATCCACCAACCGTCC
-TTCATCCCAGGCTAAGTTCCCCACAGACCCCCTTGGCCCACCTCCCATCTGCTTTATCAT
-GCCTGTGGAGCCAAGGTTCACCTTGTTCCCCGGCACTCCCGCCAGCGTGAGTAAGCATCA
-GCCAGGACCTGGAGAGTAGAACCCACCCAGAGAAGAGCCCCTGCTTCTCTGCCCACCCCA
-GGCCAGAAGTGCTCTTGCCCCTGGACTGGTTTGTCCAGGGAGGTTTTCCAAGTCACTGAG
-AGCCCCATGATCAGATGTCACCAGATCCTCCCACCCCGGCTGCAGGGGCTGCAGTACCAC
-CAGGGCCAGAGCCATCCCCATGCGTGATTTCAACATCTGTAATACTTTCCCCTCTCCTTG
-TGGAATTCCCCCTCCAAATTCCTCCTGCTTCattattagtatatataaaaaataaaaaaa
-ttaaGCTGTCTTAATCATTTTCCATATTAGCTGACAGCCGGTTCCCATATGCCTGGGAGT
-GAGACCACACCTCCTGTTCCCCCCCCCTCCCCGCCCTCTCTGCTGTTCCAAAATGACTAG
-CCCCAAACAAGGCCCAGTTACTGAAAACCCTCTATCTTACAGACTCCGCAGCCCTGACTC
-CTTGGAGTCCTGTCTGGCTGGTGTGGCCCAAGCCAAAAGCAAAGCAGGAAGATTCTCTTA
-TGTCCCCAAAAAGTGCAGACCTCAGGGCTGGGCTGATCAAGGTGCAAATCTCAGTGTCAT
-CACCTACAAACTGGAACTCCACAAACTGCTTTGTCCTGTCCAAgaaagggcacaaattct
-gaagcagacggatctgagttccatctctggaactcagctctgtcaccttgggcgagccag
-ttcaccactctgagcctgagtttcgtcatctgtaaaacggcagaaacaacagcagttacc
-tctcagtgtcacagtgaaaatcaaggagaCTTTGataacagcagtgaacatccactgatc
-ccactgtgtgccaggcactgagccaagccctccctgcctccccctcattgcatctgcaca
-acaacctgctttgcagacagaaacaaagggaccgagatattaaaaatttctccaggacaa
-agaacagggaggtggaggagcaccctgacccaggcccgGCATTTTCAGTTCCACTCGAGA
-GCCTGACCCCCTGGAGATACTCCACAAGTCCTCACCCTTTTCCCCCAGTTTCACCTTGGT
-CTTTCCTCCTCTCATGGTCTTGAGCATGGGCATCAGGGATTGGCAGCACTGTTGTGTCCT
-GTCCCCACTGCCCAACCCCAGTGCCAGGGCTGTGAGCATCAGGAGGGTCGGTAGGAGCCC
-GTGGCCCATGCATGGCAGACTCAGGTGGCCCAGCACCTTGCGGCTGCTCCTAAAAGCACA
-GACACCTGTATTGAAGAGAGGGAAGTTCTGGGTTGAACTTGAACTGATTGAGAATTCCCA
-AGCCAGAGGAGATAGACAACTATGCCAGACCTCAAACTTGAAGATTGTTTTTGTTTTTAT
-TTAACTGAACCAAACTGATTTTTTTCTTCCCCCCGAATTACGAGTGAATCAGTTCATAAT
-AGAAGCCCCCATTATATCTCCTAGATTTTTAACCAAAATATCCAAAAAGAATTGGGCTAA
-CATAGCCACACCATCTTGGAATATGTATATTTATAGTGACATGTCATAAAGACTTCTAGT
-ATTTTGTCTCTACTCTTGATCCAAACTCCAGTGGTTCcggtttctctatattaagtattc
-acgtgctttgcatgtgtcacttttcatccttcagcccttagagggaagtatcattcatct
-tcaacttacagatgaggaaactgagactcaacgtagttaaatgatctgtaagacaaggtt
-ctgaatttgaacataggtctcagctgcagagccatgttattgctaacacagcctctgtat
-ggttctccagaaggcccctgatcCACTAAGAAACAAACCTGTCCCCCAATGCCAGCTGAC
-CCTATCCATGAACCCTCCTCCCTCCAGCCAGACAGGCCTCTGCCCGGAGAGGCAGCATCA
-TCTCCAGCTGcctgtactctcatcccagttcagccattcgccaagcatgacaactcggac
-aagacctttccctcctcagcctgtttcctcctgtgctgaggagaaataaaatcctccatc
-tcccacgctgttctgtgaaatgaagcaatcatgtacctaaagtgcgagcacaTagctggg
-catggtggctcacacctgtaatcccagcactttgggaggctgaggcaggcgtatcacttg
-agcttaggagttcaagaccagcctggtcaacatggcaaaaatccaccacttgagactagg
-atttcaagaccagccgggccaacatggcaaaaacccatacaaaattagctgggcgtggtg
-gcacacacctgtaatcccagctactcaggaggctgaggcacgagaatcacttcaacccac
-gaggcagagcttgcagtgagctgagatggcaccactgcattctggcctgggtgacagagc
-aagactgtctcaaaaaccaaaaacaacaataacaaaaaaaaGGGCTAGCACTTATTTTAC
-TTCTAAACTCTCCAGCCTCAACCCAACGTAAGTGAGGTGCATATAATAGGTGCTCAAGAA
-TTACTCATTGATGATAAAAGCAAGCCTGGAACAacaaaaataagagactgggcagaaata
-ttacaaaacatcagaagtagatccctctggggtggaattatgggtgattttattgtcttc
-ttggtgattttttttttctattttccaaactctcAGCTTGGAAGTATGTTATACTGTGTT
-TTCTAATTGTATGACACTATGAACTATACAATGCACTGTACACCTAATAGCAGTTTTTGA
-GAGGAAAGAACAAAACTACTTCATTGGATTGTAAGACTTGTTCTGATTTTGGTAAAGTTA
-AACTCTGCAGGGCAGGAAGAGTAGAGAGGTGTTTTAGAATCAAGGAAATACATTTGTAAT
-CAAGCAATCAAAGTGGTGGTCTTGGGGGGAGGAGGCTAATAAAATTATTATTGTTAATGT
-TATTATTAtttttgagatggagtctccctctgttgcccaggctggggtgcagtggcatga
-tcttggctcactgtaacctccacctcccgaattcaagcaattatcctgcctcagcctccc
-aagtagctgggactacaggcgcacgccaccatgcctggctaattttttgtattttaggag
-agactgggtttcaccgtgttgctcaagctggtctcaaactcctgagctcaggcaatccac
-ccgcctcggcctccgaaagtgctgggattacaggcatgagccactgaacctggccATAGC
-ATTACTTTTTAAAGGAGGAAGAGGATACAGGCAACTTTTCATTGCTTCCAGAACCTGGAA
-CATCAGCTTAACCTTGCCGGCACACCcagctcacctgggatatttgaaaataaacacaga
-tggccaggccctgtcctggtctgaatggccagcatctctaggctggggcctgggagtctg
-tgttttaaGTGGACACAGCAGATCCTGGGCACTGTATAGTAAATaaatctcctcatccac
-tttctgtctcatcttacagatgggaaatcagaagtccaaccaggggaggtgTTTAGCACT
-CTCCTGCCTGAATGGTGAGGGTGGCCAATCTCTTCCTTCACCCCAAGGGCCTTTCTCAGT
-CCCTGTCACCATCTTACCTCTCCCAGTCCTAGCCCCTTCCCCAGCCTTGCTCTGCCAGCC
-TGGAGCTGTTTCTTCCTTTTCTCCCTAAGGGAGTGTTCCCTGTTCTTAATTAGGGAGACT
-CTGGGTATTTTTGTCTCTTTGAGTACTGCGTTCTGTTGCCAGCAAATAACTTTAAATAGA
-AAAAATATGCCCAAAATTAAACTAGAAAACAGAAATAAATAGGAAGGGGGTGGGCTGAGT
-GTCAGCCTGCCCTTGGTGGAGAGGGTGGGctctgggcctcctttcctgcatctctgccat
-ggagaccatcacagtacccaccttctggggtgctgtgcacatcagacaagaagaggcaca
-cagtacactttgcacagggtgtctAAGTGTCCATTAATATCCAAAGTTACTGGGCACACT
-CGTTGCTTGGATTTTGAGATAATTATGTAGAGAAAATGTCAAGGGGCTCAAAGTCCCCCA
-GTTGACATTTCCCTACCAAGAGCTACTTTTATAACATGCTGCCGGATGTCATTTTCTTAA
-TAGGTACAATTTTAAGAGCAtctctccaccttcttccctaccctagtccaactgttcaca
-gctgaaagagtgaccttccaaaagcctaactcagatcatatgattctttgcctctgaaat
-ttttcaaagctctccattgtctacgaaatgccggcctcagagcctttcaggataggggcc
-atgaagggtctcaaatttcaaatttcatcttcctctaccatcctcctgtcaccctccagc
-cacacagacctgccccttggtccccaaaTGGATGCCCACTTCCTTTTTCCCTAATTGAAA
-GCCAGGGCAGAGTTAGGTTAATCACATGCCTTAGCTCCAGCCACACTTTTGGCACCAGAG
-TGAGACCCCTCCCTTATTTTATGTGTCCCTTTCATGCctcatccctactctcatcccacc
-tctcatccctccctcATGTGGATACCCCCCTAACGTGTTTGGCGTGTGTCTTTAAACATG
-CACGTGCCCTTGGAAAATGTGCAATGTTGTTGTCTGTGTGTATGATTTTAATTTACATAA
-ATGCTATTCATATTATGGCTTCTTACCTTTTTTCCTTGACACTGTCTTGAGATCTAGCCT
-GCATATGTGTGGAATCATCACTTCCAACTGCAGAAGAGTCAGCCACAGGGGGTGTCCTCT
-GTGCTTCCCTGCCCATCGTTCTGGTGCTGGTGGCCTAGGCTACCTCTGACTCCCCACAAC
-AAACCTCTGACTGCTTCTTATGTAAGAGAACACAACGACAGCTCCTGCTTTTTGCATAAC
-GAGCCGTTGTTTAGTAACAAGGGGCAGATGCCTCACTCAAGTGGATTTAGACACAGAGAC
-AAAGAAAGTGTAGATCTAGGTGTTCACTAACTCCTCAGGCAGCTGTCTTTCTCCATCTTA
-TCAATTCCAAGATCCCAGCCTCCCACCTTGGCAACTGCAGGGGAAAAGAAGCTCCCGAAA
-CAGTCCCAGGTGACTTTCTGGACCATAGCCTTTGTGCTGTTTCTTTGACGGTGGGATCTG
-GTTTTGTCCTGGCTTCAGCCTTCCCAGATCCATGTGTTTCAGAGGAAGTGAACTCCAGTC
-TCGGGGtgttatggactgaattcgaaattgtgttgaaaccctaaagcccaatgtggctat
-attagaagacatggtctgaagggaggtaattcaagttaaaggaggtcacgagggtggtat
-ccagtaggactggtgtccttataagaggaagagacatcagagctctctcttcacatagac
-acacagagcagatgccacatgaggacacagtgaggaggtggccatctacaggccagaaag
-gcctcaccagaaaccaaacctgatgacaccttgatcttgaacttccagcctccagaacca
-ggaggaaataaatttctgttgctgaagacacccagtctgcagtattttgttatggtagcc
-caagcagactaatacaGGGAATGAACTGTGATTGGTCTAAGGcaatatttctccattttt
-ttttcattattacccctcattattgacctcctgaagagttgttttaagaatttttttctc
-ctaagagtgcctcccacaaaatatatatatactacagacatatctatttatgtagtgtgg
-tttcttggagggtcacaaacggttgtcatatctaagattttgtcataccttaacctaagc
-taatttttacagccttaggagcaatattgccccattgagaatgcaCTGCCTAAGGCAATG
-TACTTGGTCTgtgattggttagaacatgggcatgtgaggctaatgtagaccatagatgtg
-agagccacagaggaagaaattgtcccttttcacctttggtctttattatggatggacata
-atgcctggatctgcggcagctattttgtgactatgaggacaggctgatatgctttaaatg
-gccaactagtagataaaacctaggccattgttcatatatatatatatatttgagatggaa
-tttcactcttgtcacccaggctgaagttcagtggctcgatctcagttcactgcaacctct
-gcctggttcaagctattcccctgccagagccttcagagtatctgggattacaggcaccca
-ccaccactcccagctaatttttgtatttttagtagagacgacgtttcaccatgttggtca
-ggttggtctcaaactcctgacctcaggtgatccacccacctcggcctcccaaagtgctgg
-gattacatgtgtgagccaccacacccggcccactgatcatatttttgagcaataaaagta
-accagccctgaaactgccctaccacaaactcctccttatgtgaaatgatgcattttcaca
-tttcagcctgttcagctgtgtagtttttgtaattgcagctgaagacattctaacagaTCC
-TGTtctttttcccgtaagttgtaccaaatgttctgaggcagactggcagtgatgggcctg
-gttagtccatgagttcatccccaaaccaatcttgtggccagacttgaatcctgtgcccac
-ccacctttgtagctcagggatgggaaggggtcaaccccacctggactgagaactgggggc
-tgttcctccgagggagatgagggagatacttcccaaagggattgtgaatgctgagagggc
-agaaatgacagctgGGTTTCACATTCACACCATCCCTTCTACATGAAATACCCCATCTCC
-AGCCCAATATACTCCCTCTAGTGCAGCTCAGCATCTCCCTCTTCTGAAAGGTCTCCCCAA
-GACCATGTTGAAATTATCTCTTCTCTTCCAGGTGATGCTCACTGGGGCATTTGTAGTCTA
-CCTCTGCCCTTAAGAGGCCAGTCTTCATGGCATGCAATCattcatgcatccatctaccct
-ccaatcttaattagcaccttctgtagccatccctaggccttggggtgctaagcaagaaaa
-aggcataatttccatcctcaaggatctcacagtccaggggaggaagcaaaactcataggc
-attcatTCGACACACATTTATTCTCTGTATAGATATGAGTAAAATATTGCATATCCTCAA
-GGAAAGGGGGAACTCCCCAGCTAATGGGACAGACAGATGAAGAACAAGTAAGTACAGTGT
-ATAATGAGGTGACAGAAGCCACCACTCATTGCTCTGACTAGGAGGAAACAACAAGATGCC
-TTAGACTCTTTTGGCCAAGGAAAGACACACTAGCTGTGTGAATGCCAGGTGAGCTGGCAT
-CATTTGTCTGGGATAGGGTGCAGTGGAGGCTGTTGAGGCCTGACAGCTTCCCCCTTCACC
-TTACTCCATTGTTTGCCAGGCTCATGCCTGGGAGAACCATATGCATAAGAAGACCTGGAT
-CTTATAGGAAGAAGAAGTGGAAAAGCCAATACCTGACCTCCAGGAATCAGAATTTGtgtt
-gcaggttgggttctatgcaggcagacacgaagacagagtttaggtgcaaggtgtttatta
-ggaatcaatatctggaaaagaaaggggcaggaatcagggttgaggaggaggagatactta
-actgcaatgtgacccagtaaagcgttggtcaacatggtgaggaagttgggagcaagaatt
-atccctcgatagacaccccgttctacatgatgtaattattatgaattacatgcctgtatc
-aaaacatctcatgtaccccataaatatatatatacctactatgtacccacaaaaattaaa
-attaaaaagagttacccctcagagaatcccaaaagatatcaaaatatccagacttttgtc
-tcagccccttcattttgatagttcactattcaccaaatacaggttgccccaggaagggca
-tggcctgggatgaagtggccctctcaagctgaggctaaccttgaaggggctgaagctgaa
-ggctctctgctgaccatgcttccCCCGCCTTCAGCTGTCAAGTCCTTCAGGGTCAGCTCA
-GTTCTGAGTGCCACTTTACTTGGGGTCACTTCTTTGATTCCAAGCAGTTTAACATAATGG
-CAACCACAGTTAGGGAGACCTGTCCTGGTGGATCAGGGTGGCCCAAGCTAAGGTCTGGAG
-GAAAGACGACCCTCAAGAAAAGATGTCTCCTCTGTCCCTCCACCCCATTCATACTAAGGG
-CCATGGGTTCATGGAGAGGGTTTCAGATGGGCACATTATAGGGCTGAGGCTAAAAGTCTC
-TTTGAACCAACTCACACTTGTACAGAAGTGATGCTGTGAGGACTAATGAAaacaagtagc
-atctactgcatgcttaacatacaccaggcactattccaaattttttacccacattagtca
-tttaattctcacattaccctatcagaggaacaatgatGAGCATGGGTATGTAGACCAGAA
-GGAGCTAAAACCCTAGAACACAAGCAGAGGACACCAGTGAGCCCAGGAAAGGCCCTGGGC
-CCCTGGAAGCAGTCTCCTCATCCGCCTGCATGGGCCAGGGTTCAACAGAGGCACCATGTG
-GCTGCAAGAGGCAGAAATGGCTGCAGACTGAGCTCTACTAGTTCCTTCCACTTGATGTTT
-GAATAAAGTCCCTGGAAAACTTGGGGAGATGGGATGAGTATCTCAGCTGGGAACACACCA
-AGACTTCTTAATAAGGCATGGAGAGGCTCAAGCAATTGATTGGAAAGAAAAAAAAAAAAC
-AAAACTAACTCAAGTTGGTAGATTTTACCTGCCATGAGATGTTTGTGAATAGCAGAGCAC
-AGGGTAGAGAGGTCACTGCCAAAGAGCAACTCCCAGTCACCCTTGACATGTGGCATCCCC
-TCTCATGCCTCCACGTCTGCATAAGCTTGGTAATCTTGTGCCCTCTGACACCATTCTCCC
-ACCTGTCACCCCACTCCATTCTGCCCATCAGGATAATGCTGCCACATCCTCCAGGAAGCC
-TTCTCTGGCTGTCCTTCTCCATGACGCTAGGCTCCCCTTCCATCTTCCCACAACTTCATG
-TACCTCCCTCTATCATTTTATTTATCAATCATTCTAGATTTTATGTGTTTATGACTGACT
-TTCCTCCTAGATTATGAGGCAGTATGATTATATTATTTACCTTTCCCACTGTCATGCATT
-CCCATTTATCTCACTCGGCGATTGTCACAACAatgctgcaaactaactaccactaagctc
-agtggcttaaaacaataacttcttctcactcatgggtctgtaggtcagctgggattctgg
-tggtctagactgggctgggctccaggcatgcatgcggatctgctccacgcgtctctcatc
-ctccttgacccacagaagacagctggaagcaggcaggacctcataggctttagctcagag
-ctggtgtgctgtcacttctgcccatgttccatcagccagagcaagtcacatggccaagct
-caacatcaattagatgtggagaaaattgatgagtcatgtggcaaagggcatggatatagg
-aaaaggtgaaaattAGGAATAGTATGATTTACTGTGACACAGATGCTTTCTGGTGAACAC
-CAacctctccaaactcatttcaagacccttcctcatcagcccagtgctcaaggtcaattc
-ctgcaaccttcagccctttgtagcctttcagtcttttgaacacactgtactttttgtctg
-acatacacctttcccatccctttcagatctcagctgagatgtcatctcctcaaagaTTTG
-CATGGCTGTAGGCTTTGCCACCAGGAGATAGTGACCCAACAAACAAGCTTGTATGGGTGA
-GTCCCTGAATCCAAACCCAACCCTGcctggccttgccactcactgctgtgaggccctaag
-aaaatcttatcttttttctactgctgttttcttatctgccaaaagtaaataaaaacaTCT
-TCCCAtatcagttagaaatgcttgcagctgcaagtagcagaacccctaatagtagctaaa
-acaataatatctcacaaactagatgcctggaagcaagaagctccagggctggtttattgg
-ctcagtgatgtaaggacTAAGTGCTCACTCATACCCTCTCATTTCTCCTCCTTCCCTTTC
-CCCATTCTACtaggttggtgcaaaagtaattgtggtttttgccattactttcaatggcaa
-aTTGtggtgcaaaagtagttgtggtttttgccattactttcaatggaaaaaacagcaatt
-acttttgcaccaacagcaaaaacagcaattacttttgcaccaacctTAATATTTCCACAG
-TGTCTTCCCTAAAGTCTCACAGAAGGTTCCCTTTACATTTTACTGGGCAGACATGGATCA
-TATGGCCACTCTAGCAGGAAAGTGAAGTGGGAATGCCAATATCAGGGTTTTGTTGTTGTT
-GTTGTTCAGCCTCCTTTGGGGGAAGCAGCAAACGAGAAGGGGGTAAGAATTGGCTGCTGT
-GTAATCAACTCACAATATCTACTCCTGATCTAACTTTCTACCTCACAGAATTTTTGTGAA
-AATTTGGATTGCCAGTAGCACTCTGAAGGCCACAAGCTTATAAAATAATAATCTACTTTT
-ATTATTATTCATGACTTATTAAGAAAAAATCAATATTGGAAGAGAATAATACTTCGCATT
-TGTTCAACAATGAACTTTCCGAAGGTGAAAGGAAAAGCAATTACTGTCTGAGCCCAGCCT
-GAGTCCCAAGTCCATGCCAAGCGCAAGCCTGCAAGACCATTTCCTCCTCCAGGGACTTGC
-TTCGATTGTGctaaaacagcttctgccaagccaaccaggattgcatgctgccaaatccag
-tactcattttcctgatcttattttatttgaattccctgagcattcaatccagttggcagc
-accctccttgatacatgatcctgtctgggcttctgtatgctcacagccctggttgttcct
-cagtctcctctgctggcttctccccatctacctggtttctagatgccagctgactcagga
-ctcacatgtgagctcctctcctccttcccaccccctatgctctttctgtctcaGGTttct
-caaaccttagcatgcatcaccgtcacagggagggcttgttaacacatagattgctgggtc
-tcactcccacagtgtctgatttcatcgctctagggtgaaacctgaacacttgcatttcta
-acaatttctaggtgatggtgatgatgctggtcctgggaccaccccttgagaacctctCAC
-TGCTCTatctcaaccagtgttgagagccttgtttctcagccttggctgcaaattggaatc
-acccggggtgctttaaaatatggacaccaggatctcatcccccagagattctgattttaa
-tggtctgcattatatcctgggtacctagagttaaaaacctcccccaggtgacttcaacat
-gcaggtaaagttgaaagcccctaatttagatactacttaactgctagtaacacctacatt
-tatttccctctcccagacttgtcctctgagttttagcccagtatgcccaattattcactc
-gatatctccacttacgtgactcacaagcatctgagagttaacacacccaaagtggaagtc
-tgaatcttcacttccaaattgctacttctctatcttccccatctcagcaaacagcaactc
-catccatgtgctgtagtttattggggtaaaaaccttggagttatctttggctcctctctc
-ccctccatgacccatatataatcctttgacatagtctatcggttccacctacaaaacata
-tccctaaattctcctctctgcctgaactgctaacacctacatcagaatatcatcaactct
-ttcctgggtggtctctgcagcatcctcacctccctacttctattctttactccctcgcca
-atgcatcctccaaacagcagccagaatggtctcttaaaatcataaaccagatcatgatac
-accccgatttaaagtcttgcaaaacttcctgtcaccttgggcataaaatctcagctcttg
-ctcatggccagtgagatcctgtcctcttctcaaccttgtctattccgctctctccctggc
-ttagatactccaaacacactggccttccttctgtcccttaaatacattcagttatttctt
-gcatttactatttcattaacctggatttctgttccctttggactctgcttggccagctac
-ctctcatctttcaggtctgcttaagtgtcactgccttaaagtgtctccctgacccgcctg
-ttatgttctatcataagactctatattcttcttagcgcctatcagagttggtgatcattt
-gatttgtaaatatattggtttattatttgtctctctcactagactgtgtgctttgtgagg
-gcaggaaccatgcctgttttggtcacggttgacacctcagtgcccagaagagtgaatgag
-acatagtgggtattcaaaacatacttagggagggagagaaaagaggaagaaaaaggaggg
-aggagaaaggaaggTCTAGTAATACTCAGAGCCCAGGAATTACACACCAGATACCCCTTG
-CTTCTACCCAAGAGGTGGTTCAGATTAGAGATTAGATTTCAAGGCTCCAGCTTGCTAGCT
-CATAACTGCTTCTACTCAAGACGGTCTATTCATGTAGCAAAGTCaaaatgtgaacatgct
-tttaagttccttgacgacaggaattgtggcttgtttactcttctacctggcatttgcaca
-gagcctgggcctgaatgaaagttcagtaaatggttcatgaatgaTTTGAATGGCATTTGC
-CTGAAGGAAATCTAAGAAAGTCTTGCCTTGGTTTCCCCATTAAATGGGGCAAGCAATTCT
-TATCTCCCCTTCCAGAGAGCTGCTGCCAACACAGGGAATCCATCCTGGAAGAAAAGATTG
-GTGGCCACCTGCACCATCAGGTGGAGGGCATCTCTCAGCTGCCCTTGCCACATCTGCAGC
-CCTAAGCTTCCAGGTGACCCCAGTGGACCAGTCTGCCCAGAGCATATCATTAGTTAGGGG
-CACTCTGCAGGAGGATGCCTGCCTTTGCTAGTGCATAGCTAATGTCCCAGGGGGCTTCCT
-CTAATTAAAACCCAAACTGCAATTATAGTTGTGCCAAAGCATGTGCACATGGCGCCACTT
-AAAAGGGACAGATTGACAAGGCGTTAACAACTCCAGAGGCAGCATTGTCCCAGCACCAGG
-TGCTACCAATCATCAAAATTAGAACCAAATGAGTCACTGGGGCTCAAGATACAGTATCCA
-GTGCAGACTAATGGGTGATTCCAAGAAACTTATGAGGATTATTTAAaacacactaactat
-gctccttctacagggcctttgcacttactagtccctgtacttcttcttgcctaactctat
-ttgatctctctcaattatcacctcttctgagacacctgctttgatcacatgaatctctac
-cctgctttatttttcttcttagtgtttattatcatctgatattatatatttgtttTGCGA
-TTGATAGCCCaaaatatgttttaatattgtataaatgtaaaacatatataaatacacaaa
-attttataattttCTGCAATACATATGTATCAAGAAGATACAGCATACACACTAAGGAGG
-GTGTCTTCTTGGGGTTGGGGGTGGTGAGGCAGGGGAATAGAAAGACTGATTCAGAAAGAA
-GAGAGGAACAATAAAAGAACAAATGAGAATATTTATATATCCTGATGACAATAGTGGGCC
-ATTATTTGAAGAGTATGATAAACTTGAATTTTCCTTCCTATCACTTGGTAAACTTGAATT
-ATTCCTCCCTGAAGTTCTGTACTCTGGGAAAAttttcttttttttttttttttggagaca
-gagtcttgctctgtcaccaggctggagtacagtggcacgatctcggctcactgcaacctc
-tgcctcctgggttcaagtgattctcatgcctcagcctcccaagtagctgggattataggc
-acatgccaccacacccagctaatttttgtatttttagtagagacagggtttcaccatgtt
-ggccaggatggtctcgatctcctgacctcatgatctgcccaccttggcctcccagagtgc
-tgggattacaggtgtgagccaccatgcctggccACTCTGGGATAATTTTATTTTGGTTTT
-TAGAAATAACTTTATTGAATATTTTAGTACCAGTAATCTTGCGATAAATTTCAGCCCTGG
-TTTGGTTGTTGTTgttgttgtttttggtctaaagccatcttgattttgcctttatttttg
-aagagtatttttactagatatagaattctaagttgtcaattatgtatattttttcagcac
-tttataaatgttatttcattgtcttctggctttcatcatttctgttgaaaagtctaccat
-cagtcttattgttgctcttctgtaggtaatgtcatttacctctgactacttttaagattt
-ttctctttatttttgtttttcagcagtcttactatgatgttcctatgtataattttctta
-gtatttaccctgcttgggattgtcagagcttcttgagtctgtgggttgatatcttttatc
-agttttgaaaaaattcttagctcttatttctgcaaatattgttaattttgtattcttatc
-ctcaccttctaggactccaaataaatgtatattttttttactaggtcccacatatctatg
-acacattcgtgtattttctattatttttctatgtatactttagtttggacacttttcatt
-tttttaagtgtgctaatcctatcttccactgtatcaaatctctgttaatcccatctgatg
-aatttttgatttcagatattatattttctcattctagaggtatcattttttcttttttat
-agacgctaattttctgatgaaattctccatcttttcaaatattttgtgcatatttttctg
-ttttttaaCATATTAATCTTAGCATGTCAAAGTCATTATCATATACCTGTTTCTATTGTC
-TATTTTATTCTGTTTGTTTTCAGATATGTCCTAGCTTTGGCATAACTAATAATGTTAATA
-GAATGCCACTTATTATACATAATGTAGAGACTCCAGATGATATATTCTTCTAGAGAAGAT
-TTACCCTCTGCTAGGCACAGAGTGGGGCTTATCATCATAAACCAGTCAGGGATTGTACTG
-AGTCAAGACTGTAAGGTAACCCCAGGAAGGTCAGTTTCCCTGTGCTTCAGTCAGTCATAC
-ACTGAACACCTCTTCTCAGAGGCTTTATGCCAAGGTTTATAGCCTCCTGCACCAGGTATC
-CCAGAATCCAGCAAGTGTCTTGAGGGATTAATGAGCCCTCAAGTCTGCCAAAGGCTCTGC
-TGGTTTCTTCCACACTAGTCCAGTGCTGCATAAAACTTGGATTCTCAGCATTCTGCTTTT
-GCCTAGAATTGGAAAATGGTCTGGGGTAAAGAAGCTATATAATTCAGCTTACTCCCCTGC
-TGTTCATTCCTTTCCAGAATTTTAGCAAGTAGTATATTTTTTTCCAATCCTatgatatct
-gacaatgctactatatttctctagtcaatttactcttccatttcctgggcaaccatttca
-ctttctcttatttcttcacatctttgacaccttctttctctcctcacttctaactgacgg
-cttacaaatgaaagcaagtggaatgacaataactttttataaaaacttctacactagtcc
-atcaacacgtctctctaatacttctccctccctctctttctctctctccctttctctctc
-tccatgtgtctgctggatcccatcattctcatctaatcaaggactttgctcctataatca
-tccctccatgaatcattttcctctctctgctaaattattcccataagtggacaaatatac
-cattagtctcccatcttctaaaaagtatataccctcccttgtctcaatatctctgtgcag
-ctacccccacattttgtttcttcccatttgaagcaaaactcctcaaaaattgtatatatt
-cactatcttcattttctttccttctatgccaaacaggttttcctccttcaaagctactct
-catcagggtcaccaaatacctctgcattgccaaatccagaggtcagttcacagacctcgc
-cttacctgattgctcagaagcatttgacactgttctctttgctggttcttcctcatgttc
-tcgacatctgagtgttggagacccccaaaatcagtcctaggactctttcttttccttcta
-tatattccttttacgtgctttccttattctctttgtatataatttaatacctctactggg
-taatttacaaagaaaacaaacttatttctcacagttctagaagctggaaagtccaagatc
-aaggcagcagcatgttcagacgtgtggtgagggctgccctctgcttcctagatggtgcct
-tgatgctgttgtcctccagaggagaggaaatctgtaaattcacatagtggaagatacgga
-attatgaaaaaggaacaaactccctccatcaagctcttttatcagtaccttgatccattc
-tgccctcatggcttaaacacctttcaaaaggccccacttcaacactgttgcattggcaat
-taagtttccaacacacacattttggggaacacattcagaccatagcaacccttttgttca
-gtctcatgattttaaatatcatttatattttatgactctcaaatgattctagccagaaat
-tatctcatgagctctagactctctctacatacccacattaacaGCAACGAAAGCACATTT
-AATCAATTTAACCCAAGGAAGTAATACGATGAGCTCAGGTAATACAGACTGAGACTTCAT
-CCAAGATCACAAGGATGGTATGTGCTAGACTCCAAAGAGATGCCCAAGATTTTGTAAATA
-CCCTTCCCTTCCACAAGAATAGAGTTGTTATTTGGTGTGATTTCTCAGGGAGTTGGGGAG
-ATCTCTTATCAAACTCCCAAATTGCTCTCCAATCTGCTCAAGTTTTCTGAAATGTTGTTG
-tttctgggtcatagcatatgcacatacttactttggttaagttcagccaaattatttctc
-cagaatggctgttccagtctacattctttccagccatgcctgtgggctcttatctccaca
-tctttgccaggtattactagccttttagtttttgcctggttaataaatgtaaagtgctaa
-ttctctgatgttttatttatcatattactaattaatttgagcatctctcacttacttgtt
-ggcttgtttctttttccataaattggtatccatttctcttgccagttttttattatggag
-tatatatatattgccaatttaaaggacttctttgaatattctagTGATTTGTCCCCTGTC
-AATTTTAGAAATTGCAAACATCTCCTAATTTGTCATTAGTCTATTATCTTTGTCTTTATG
-TCTGTCATTTAAGAGAAATCATTTTCCTGTAAATGTTTTAAAActttttattgtaaaata
-aaacacattaaaaatctcacacggcaaatgtttaacttagtaaattattataaactgaac
-cctttaaagtattactcaagtcaagaatataactttgccggccattcagaagcccctccg
-tatgttctatcccaattatagctccctctcccctccaaaagcaatattaccctgactttc
-atatcaatcactttcttgcttcttttatcatccaagtgtgcacccccagacactatggtt
-tagtcttgccATTTAAAAAAATgtttatatgtattttgagtctcttttaatctacaggct
-ccctttccatctcttctctttctttaatattcatctgttgaagaacccaggccatttgac
-ctgtacagagtcccatagtttggaatttgctgattgcaagtcttggtgaagttcaagatt
-cctctgtttaacgtctttactgtaaatggacagctggtccagaggcttcatcaggctcag
-acgctgtgttattttatcatgtggcacattcctatctgggtgcttctctttgagaaggca
-gtgacacttaaagattagatctattgattcattgcggattggaaaaaggggatgttctaa
-ttccattttttttttcattttttttaactggaataattttataaagagacacttttctca
-ctcgccattggttattgttacgaactgaattgtatccctccccaaattcattcattcgtt
-gaaacctagcccccaatgtcactgtacttggatatagggccgctagggaggtagttgagg
-ttaaatgaggtcagaagggtagggtactaatccaataagactggtacccttagcaaacaa
-agagactccagtggtctgtgtccttctctccatacctgcaaagaggaaaggccatatgaa
-gacacaatgagaagtcagccctctgtaagccaggaaggaagactcaccagaaaccacatt
-ttgtggcaccttgattttggacttcccagcctccagaactgtgagaaaataaatttctgt
-tgtttaagccacccattcggcggtattttattttggcagccctagcaaactaacaccatt
-acccaagtggtataattaatacataaaagagaagataactgcttgattctctttatttac
-caggtttcgagataatgaatttgttcctgttatcctccaaaggctaccatttaaattctt
-ttgttattattaaatcatggatttaagtatagtttgtggttttcaatccattgcattttt
-attctaattgacaatcaagttgttccatctttgaacagtaggaagctctttggcttggct
-cctgaggccttttgacttatctcccttagtccttgaagcttctttgtatcttgaatgaca
-aaatattccaggcttgtcctaccttcatatcctgctttaaacctagaatcagccatttct
-tcaaggagtcctgggtccttctaatgagaaattttatttcaagactataatatgaatgct
-agagatgttcactgctcctgggctgctcattaagtctaggcttcttgagtgggcaaagct
-aatatacatatatgtatgtgtgtgtgtgtgtatatatatatatataactcatgaattcat
-actggttcaatgagttcagttctaacttagaactcagattgttcacttaacttcttttac
-actatatttgaatcttttttcttacattctgagaattctggttcttaatatcACAGGGAG
-TGATATAATTAGGATGTCAATAGTCTTTAATTATTTAATTTATCCCATGTTGTACACACA
-ACAATACTACCAATCCTAATTACTGACAACAGTTTAAAAAGTTTTGCATATGCTATTCCA
-TTCCCTCCCCATTTTTATATTTACATAATCAAATAATAAAGCCTTTAATATATAGTCTCT
-ttctggtcttagttccgcaagtgggtatatataaaggctcaaaatcaatctttatattga
-catctctctacttatttgtgttgtctgatgctcatattgt
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai
deleted file mode 100644
index 04a438b..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/Homo_sapiens_assembly18.trimmed.fasta.fai
+++ /dev/null
@@ -1,2 +0,0 @@
-chrM 16571 6 60 61
-chr20 1000000 16861 60 61
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam
deleted file mode 100644
index daff721..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/ScreenSamReads.100.input.sam
+++ /dev/null
@@ -1,21 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:Pf3D7_01 LN:643292 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:6a7e6510bdae0ad38e8bc3aa1adf537f SP:Plasmodium falciparum
- at SQ SN:Pf3D7_02 LN:947102 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d34154a67b6b8e10d2d7aea3c83e09e7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_03 LN:1060087 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:468c14169020248f4e41799de3a4bef5 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_04 LN:1204112 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:9b74fcd8d379f3763a31050acf098f3a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_05 LN:1343552 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:3d84171954a6768f2a9d93796fe58d9a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_06 LN:1418244 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d2f87cf0c3570ae0da5dfd71bd4c506a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_07 LN:1501717 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:493245de8db9737efb5ce128e6b65661 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_08 LN:1419563 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:1878bd1367b051daff937555e44f41b7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_09 LN:1541723 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:87f4b581b5db461261b36b5344fe9df4 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_10 LN:1687655 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:a13945591ca5a84710655be93c75d623 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_11 LN:2038337 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:909466c6a0faec815f63b21047beea15 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_12 LN:2271478 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:c4427f71425a56c2e6325089b6bc2b7d SP:Plasmodium falciparum
- at SQ SN:Pf3D7_13 LN:2895605 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:5c761a4674f0363bb789b5a982952bfc SP:Plasmodium falciparum
- at SQ SN:Pf3D7_14 LN:3291871 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:03d21468ae712ffe4f1c62d54e4c2e2a SP:Plasmodium falciparum
- at SQ SN:M76611 LN:5967 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ae96d861208f8c5912393e1441319d64 SP:Plasmodium falciparum
- at SQ SN:PFC10_API_IRAB LN:34242 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ea11bbb35c7871b0b47bde08f4e62f59 SP:Plasmodium falciparum
- at RG ID:61PA6.3 PL:illumina PU:61PA6AAXX100630.3 LB:Solexa-32208 DT:2010-06-30T00:00:00-0400 SM:Pla HS 07560 CN:BI
- at PG ID:bwa PN:bwa VN:0.5.9-tpx CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-61PA6AAXX100630:3:100:10921:6024 589 * 0 0 * * 0 0 AATTCGCCAGACGAGGGGGCCTTTGTCTGTCTTATCGGCTACATGGGAGGCTGGGGCGGGATAGATGC #################################################################### RG:Z:61PA6.3
-61PA6AAXX100630:3:100:10921:6024 653 * 0 0 * * 0 0 GCAGCAGCATGGTCTTGGCTCACTGCATCCTATTTCTCCACGTTGCCAGCATTTCTCCAGCCTCAGCC ><//-?,-'=A*558 at -)A9A############################################### RG:Z:61PA6.3
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list
deleted file mode 100644
index 88411fa..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/empty.interval_list
+++ /dev/null
@@ -1,4 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 1 1 + empty
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict
deleted file mode 100644
index e30d415..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.dict
+++ /dev/null
@@ -1,3 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf
deleted file mode 100644
index 39bed22..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf
+++ /dev/null
@@ -1,53 +0,0 @@
-##fileformat=VCFv4.1
-##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null do [...]
-##CombineVariants="analysis_type=CombineVariants input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null use [...]
-##FILTER=<ID=LowQual,Description="Low quality">
-##FILTER=<ID=VQSRTrancheINDEL99.00to99.90,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -4.1718 <= x < -0.8611">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00+,Description="Truth sensitivity tranche level for INDEL model at VQS Lod < -727.2136">
-##FILTER=<ID=VQSRTrancheINDEL99.90to100.00,Description="Truth sensitivity tranche level for INDEL model at VQS Lod: -727.2136 <= x < -4.1718">
-##FILTER=<ID=VQSRTrancheSNP99.00to99.90,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -25.4561 <= x < 3.2489">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00+,Description="Truth sensitivity tranche level for SNP model at VQS Lod < -38672.7015">
-##FILTER=<ID=VQSRTrancheSNP99.90to100.00,Description="Truth sensitivity tranche level for SNP model at VQS Lod: -38672.7015 <= x < -25.4561">
-##FORMAT=<ID=AD,Number=.,Type=Integer,Description="Allelic depths for the ref and alt alleles in the order listed">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth (reads with MQ=255 or with bad mates are filtered)">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=PL,Number=G,Type=Integer,Description="Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification">
-##FORMAT=<ID=TP,Number=1,Type=Integer,Description="Phred score of the genotype combination and phase given that the genotypes are correct">
-##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes, for each ALT allele, in the same order as listed">
-##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency, for each ALT allele, in the same order as listed">
-##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">
-##INFO=<ID=BaseQRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt Vs. Ref base qualities">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP Membership">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Approximate read depth; some reads may have been filtered">
-##INFO=<ID=DS,Number=0,Type=Flag,Description="Were any of the samples downsampled?">
-##INFO=<ID=Dels,Number=1,Type=Float,Description="Fraction of Reads Containing Spanning Deletions">
-##INFO=<ID=END,Number=1,Type=Integer,Description="Stop position of the interval">
-##INFO=<ID=FS,Number=1,Type=Float,Description="Phred-scaled p-value using Fisher's exact test to detect strand bias">
-##INFO=<ID=HaplotypeScore,Number=1,Type=Float,Description="Consistency of the site with at most two segregating haplotypes">
-##INFO=<ID=InbreedingCoeff,Number=1,Type=Float,Description="Inbreeding coefficient as estimated from the genotype likelihoods per-sample when compared against the Hardy-Weinberg expectation">
-##INFO=<ID=MLEAC,Number=A,Type=Integer,Description="Maximum likelihood expectation (MLE) for the allele counts (not necessarily the same as the AC), for each ALT allele, in the same order as listed">
-##INFO=<ID=MLEAF,Number=A,Type=Float,Description="Maximum likelihood expectation (MLE) for the allele frequency (not necessarily the same as the AF), for each ALT allele, in the same order as listed">
-##INFO=<ID=MQ,Number=1,Type=Float,Description="RMS Mapping Quality">
-##INFO=<ID=MQ0,Number=1,Type=Integer,Description="Total Mapping Quality Zero Reads">
-##INFO=<ID=MQRankSum,Number=1,Type=Float,Description="Z-score From Wilcoxon rank sum test of Alt vs. Ref read mapping qualities">
-##INFO=<ID=QD,Number=1,Type=Float,Description="Variant Confidence/Quality by Depth">
-##INFO=<ID=RPA,Number=.,Type=Integer,Description="Number of times tandem repeat unit is repeated, for each allele (including reference)">
-##INFO=<ID=RU,Number=1,Type=String,Description="Tandem repeat unit (bases)">
-##INFO=<ID=ReadPosRankSum,Number=1,Type=Float,Description="Z-score from Wilcoxon rank sum test of Alt vs. Ref read position bias">
-##INFO=<ID=SB,Number=1,Type=Float,Description="Strand Bias">
-##INFO=<ID=STR,Number=0,Type=Flag,Description="Variant is a short tandem repeat">
-##INFO=<ID=VQSLOD,Number=1,Type=Float,Description="Log odds ratio of being a true variant versus being false under the trained gaussian mixture model">
-##INFO=<ID=culprit,Number=1,Type=String,Description="The annotation which was the worst performing in the Gaussian mixture model, likely the reason why the variant was filtered out">
-##INFO=<ID=set,Number=1,Type=String,Description="Source VCF for the merged record in CombineVariants">
-##PhaseByTransmission="analysis_type=PhaseByTransmission input_file=[] read_buffer_size=null phone_home=STANDARD gatk_key=null read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/humgen/gsa-hpprojects/GATK/bundle/current/b37/human_g1k_v37.fasta nonDeterministicRandomSeed=false downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 performanceLog= [...]
-##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/humgen/gsa-hpprojects/NA12878Collection/bams/CEUTrio.HiSeq.WGS.b37.list] read_buffer_size=null phone_home=NO_ET gatk_key=/humgen/gsa-hpprojects/GATK/data/gatk_user_keys/gsamembers_broadinstitute.org.key read_filter=[] intervals=[/broad/hptmp/ami/tmp/queueScatterGather/.qlog/CEUTrio.indelcall-sg/temp_020_of_300/scatter.intervals] excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_s [...]
-##contig=<ID=1,length=249250621,assembly=b37>
-##contig=<ID=2,length=243199373,assembly=b37>
-##contig=<ID=3,length=198022430,assembly=b37>
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA12878 NA12891 NA12892
-1 8216712 rs11121115 A G 1540.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=0.917;DB;DP=131;Dels=0.00;FS=11.67;HaplotypeScore=3.35;MLEAC=3;MLEAF=0.500;MQ=57.74;MQ0=1;MQRankSum=0.427;QD=11.76;ReadPosRankSum=-2.190e-01;SB=-9.390e+02;VQSLOD=5.53;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:23,28:51:99:681,0,668:127 0/1:16,18:34:99:338,0,244:127 0/1:24,22:46:99:560,0,323:127
-1 17032814 rs2773183 T C 2828.26 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-1 17032818 rs2773183 T C 2828.26 FILTER AC=3;AF=0.500;AN=6;BaseQRankSum=-3.879e+00;DB;DP=322;Dels=0.00;FS=2.43;HaplotypeScore=15.45;MLEAC=3;MLEAF=0.500;MQ=56.86;MQ0=0;MQRankSum=2.92;QD=8.78;ReadPosRankSum=-1.245e+00;SB=-1.943e+03;VQSLOD=-1.421e+00;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0/1:63,59:122:99:1434,0,1831:127 0/1:53,56:109:99:910,0,871:127 0/1:61,30:91:99:523,0,1257:127
-2 1143476 rs4998209 C T 1483.26 PASS AC=2;AF=0.333;AN=6;BaseQRankSum=-4.814e+00;DB;DP=189;Dels=0.00;FS=5.61;HaplotypeScore=0.324;MLEAC=2;MLEAF=0.333;MQ=58.36;MQ0=0;MQRankSum=1.58;QD=12.06;ReadPosRankSum=0.326;SB=-9.320e+02;VQSLOD=6.81;culprit=HaplotypeScore GT:AD:DP:GQ:PL:TP 0|0:66,0:66:99:0,178,2264:127 0|1:33,38:71:99:844,0,1024:127 0|1:26,26:52:99:678,0,719:127
-2 9240279 rs56249990 A G 3978.01 PASS AC=3;AF=0.500;AN=6;BaseQRankSum=1.70;DB;DP=213;Dels=0.00;FS=7.83;HaplotypeScore=1.19;MLEAC=3;MLEAF=0.500;MQ=59.40;MQ0=0;MQRankSum=0.143;QD=27.25;ReadPosRankSum=-9.700e-02;SB=-1.991e+03;VQSLOD=9.14;culprit=FS GT:AD:DP:GQ:PL:TP 0|1:33,42:75:99:1400,0,1031:127 0|0:67,0:67:99:0,178,2277:127 1|1:0,71:71:99:2578,199,0:127
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx
deleted file mode 100644
index f3ca0f9..0000000
Binary files a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1.vcf.idx and /dev/null differ
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list
deleted file mode 100644
index c482660..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test1_comp.interval_list
+++ /dev/null
@@ -1,8 +0,0 @@
- at SQ SN:1 LN:249250621
- at SQ SN:2 LN:243199373
- at SQ SN:3 LN:198022430
-1 1 1 + interval-1
-1 1 2 + interval-2
-1 3 300 + interval-3
-2 25 64 + interval-4
-3 10000000 10000001 + interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list
deleted file mode 100644
index b6106fb..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test2_comp.interval_list
+++ /dev/null
@@ -1,7 +0,0 @@
- at SQ SN:chrM LN:16571 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:d2ed829b8a1628d16cbeee88e88e39eb
- at SQ SN:chr20 LN:1000000 UR:file:/Users/mhanna/src/Sting/Homo_sapiens_assembly18.trimmed.fasta M5:b4eac854d70893986ac578c53c2324f1
-chr20 1 1 + interval-1
-chr20 1 2 + interval-2
-chr20 3 300 + interval-3
-chrM 25 64 + interval-4
-chrM 1000 1001 + interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list
deleted file mode 100644
index f2e4b6e..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test3_comp.interval_list
+++ /dev/null
@@ -1,24 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:Pf3D7_01 LN:643292 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:6a7e6510bdae0ad38e8bc3aa1adf537f SP:Plasmodium falciparum
- at SQ SN:Pf3D7_02 LN:947102 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d34154a67b6b8e10d2d7aea3c83e09e7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_03 LN:1060087 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:468c14169020248f4e41799de3a4bef5 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_04 LN:1204112 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:9b74fcd8d379f3763a31050acf098f3a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_05 LN:1343552 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:3d84171954a6768f2a9d93796fe58d9a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_06 LN:1418244 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d2f87cf0c3570ae0da5dfd71bd4c506a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_07 LN:1501717 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:493245de8db9737efb5ce128e6b65661 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_08 LN:1419563 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:1878bd1367b051daff937555e44f41b7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_09 LN:1541723 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:87f4b581b5db461261b36b5344fe9df4 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_10 LN:1687655 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:a13945591ca5a84710655be93c75d623 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_11 LN:2038337 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:909466c6a0faec815f63b21047beea15 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_12 LN:2271478 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:c4427f71425a56c2e6325089b6bc2b7d SP:Plasmodium falciparum
- at SQ SN:Pf3D7_13 LN:2895605 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:5c761a4674f0363bb789b5a982952bfc SP:Plasmodium falciparum
- at SQ SN:Pf3D7_14 LN:3291871 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:03d21468ae712ffe4f1c62d54e4c2e2a SP:Plasmodium falciparum
- at SQ SN:M76611 LN:5967 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ae96d861208f8c5912393e1441319d64 SP:Plasmodium falciparum
- at SQ SN:PFC10_API_IRAB LN:34242 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ea11bbb35c7871b0b47bde08f4e62f59 SP:Plasmodium falciparum
- at RG ID:61PA6.3 PL:illumina PU:61PA6AAXX100630.3 LB:Solexa-32208 DT:2010-06-30T00:00:00-0400 SM:Pla HS 07560 CN:BI
- at PG ID:bwa PN:bwa VN:0.5.9-tpx CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-Pf3D7_05 1 1 + interval-1
-Pf3D7_05 1 2 + interval-2
-Pf3D7_05 3 300 + interval-3
-Pf3D7_09 25 64 + interval-4
-Pf3D7_09 1000 1001 + interval-5
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list b/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list
deleted file mode 100644
index 6c13c83..0000000
--- a/src/test/resources/htsjdk/variant/utils/SamSequenceDictionaryExtractor/test4_comp.interval_list
+++ /dev/null
@@ -1,25 +0,0 @@
- at HD VN:1.0 SO:queryname
- at SQ SN:Pf3D7_01 LN:643292 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:6a7e6510bdae0ad38e8bc3aa1adf537f SP:Plasmodium falciparum
- at SQ SN:Pf3D7_02 LN:947102 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d34154a67b6b8e10d2d7aea3c83e09e7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_03 LN:1060087 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:468c14169020248f4e41799de3a4bef5 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_04 LN:1204112 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:9b74fcd8d379f3763a31050acf098f3a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_05 LN:1343552 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:3d84171954a6768f2a9d93796fe58d9a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_06 LN:1418244 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:d2f87cf0c3570ae0da5dfd71bd4c506a SP:Plasmodium falciparum
- at SQ SN:Pf3D7_07 LN:1501717 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:493245de8db9737efb5ce128e6b65661 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_08 LN:1419563 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:1878bd1367b051daff937555e44f41b7 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_09 LN:1541723 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:87f4b581b5db461261b36b5344fe9df4 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_10 LN:1687655 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:a13945591ca5a84710655be93c75d623 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_11 LN:2038337 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:909466c6a0faec815f63b21047beea15 SP:Plasmodium falciparum
- at SQ SN:Pf3D7_12 LN:2271478 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:c4427f71425a56c2e6325089b6bc2b7d SP:Plasmodium falciparum
- at SQ SN:Pf3D7_13 LN:2895605 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:5c761a4674f0363bb789b5a982952bfc SP:Plasmodium falciparum
- at SQ SN:Pf3D7_14 LN:3291871 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:03d21468ae712ffe4f1c62d54e4c2e2a SP:Plasmodium falciparum
- at SQ SN:M76611 LN:5967 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ae96d861208f8c5912393e1441319d64 SP:Plasmodium falciparum
- at SQ SN:PFC10_API_IRAB LN:34242 UR:/seq/references/Plasmodium_falciparum_3D7/v3/Plasmodium_falciparum_3D7.fasta AS:n/a M5:ea11bbb35c7871b0b47bde08f4e62f59 SP:Plasmodium falciparum
- at RG ID:61PA6.3 PL:illumina PU:61PA6AAXX100630.3 LB:Solexa-32208 DT:2010-06-30T00:00:00-0400 SM:Pla HS 07560 CN:BI
- at PG ID:bwa PN:bwa VN:0.5.9-tpx CL:bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falciparum_3D7.2.sai illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.2.fastq.gz; bwa aln Plasmodium_falciparum_3D7.fasta -q 5 -l 32 -k 2 -t $NSLOTS -o 1 -f illuminaReadGroupBamScreening.C342.61PA6AAXX100630.3.tagged_908.BI4502710.positive.Plasmodium_falc [...]
-Pf3D7_05 1 1 + interval-1
-Pf3D7_05 1 2 + interval-2
-Pf3D7_05 3 300 + interval-3
-Pf3D7_09 25 64 + interval-4
-Pf3D7_09 1000 1000 + interval-5
-Pf3D7_11 1 2038337 + interval-6
\ No newline at end of file
diff --git a/src/test/resources/htsjdk/variant/variantFilter01.js b/src/test/resources/htsjdk/variant/variantFilter01.js
deleted file mode 100644
index 0036477..0000000
--- a/src/test/resources/htsjdk/variant/variantFilter01.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/** get variant having position%2==0 */
-variant.getStart()%2 == 0;
diff --git a/src/test/resources/htsjdk/variant/variantFilter02.js b/src/test/resources/htsjdk/variant/variantFilter02.js
deleted file mode 100644
index c102d25..0000000
--- a/src/test/resources/htsjdk/variant/variantFilter02.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** prints a VARIATION if two samples at least have a DP>100 */
-function myfilterFunction(thevariant)
- {
- var samples=header.genotypeSamples;
- var countOkDp=0;
-
-
- for(var i=0; i< samples.size();++i)
- {
- var sampleName=samples.get(i);
- if(! variant.hasGenotype(sampleName)) continue;
- var genotype = thevariant.genotypes.get(sampleName);
- if( ! genotype.hasDP()) continue;
- var dp= genotype.getDP();
- if(dp > 100 ) countOkDp++;
- }
- return (countOkDp>2)
- }
-
-myfilterFunction(variant)
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl
deleted file mode 100755
index 03cee57..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl
deleted file mode 100755
index 44ba163..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl
deleted file mode 100755
index da640ff..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl
deleted file mode 100755
index 400a7ea..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl
deleted file mode 100755
index 963d78a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl
deleted file mode 100755
index 9f410af..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl
deleted file mode 100755
index 0250bba..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl
deleted file mode 100755
index 46d3ed8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl
deleted file mode 100755
index f5d00e9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl
deleted file mode 100755
index db03e1d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl
deleted file mode 100755
index 396e1df..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
deleted file mode 100755
index f21fc9f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl
deleted file mode 100755
index 4306d65..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl
deleted file mode 100755
index f6dc157..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl
deleted file mode 100755
index 4b98ef8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl
deleted file mode 100755
index f6b49fc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl
deleted file mode 100755
index 221e4b2..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl
deleted file mode 100755
index 6495d0f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl
deleted file mode 100755
index ef053f0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl
deleted file mode 100755
index 64e4b04..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl
deleted file mode 100755
index 88839a6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl
deleted file mode 100755
index 7cc94c6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl
deleted file mode 100755
index b57af2a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl
deleted file mode 100755
index 90346a3..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl
deleted file mode 100755
index 150eb2f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl
deleted file mode 100755
index 505eea4..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl
deleted file mode 100755
index 05d283f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl
deleted file mode 100755
index d2f8d41..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl
deleted file mode 100755
index 47f4750..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl
deleted file mode 100755
index 95dbd0b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl
deleted file mode 100755
index 15c69cb..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl
deleted file mode 100755
index 132eb40..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl
deleted file mode 100755
index 3e662d9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl
deleted file mode 100755
index 205eacc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl
deleted file mode 100755
index 48d48d5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl
deleted file mode 100755
index f8a314e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl
deleted file mode 100755
index 72eb66c..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl
deleted file mode 100755
index c590afb..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl
deleted file mode 100755
index bfd64e9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl
deleted file mode 100755
index 82d9967..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl
deleted file mode 100755
index 2daedc8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl
deleted file mode 100755
index 2d1d4c0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl
deleted file mode 100755
index 243835d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl
deleted file mode 100755
index 299ed20..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl
deleted file mode 100755
index 44b0539..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
deleted file mode 100755
index 15e1360..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
deleted file mode 100755
index 5602b08..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
deleted file mode 100755
index c009189..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
deleted file mode 100755
index 3f9112d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl
deleted file mode 100755
index 5292115..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl
deleted file mode 100755
index 3e5f293..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl
deleted file mode 100755
index fb99bc5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl
deleted file mode 100755
index befaf8f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl
deleted file mode 100755
index 473910d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl
deleted file mode 100755
index fac5bec..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl
deleted file mode 100755
index 7f15c76..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl
deleted file mode 100755
index 86e2353..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl
deleted file mode 100755
index 9831410..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl
deleted file mode 100755
index bad6be4..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl
deleted file mode 100755
index 3c2a372..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl
deleted file mode 100755
index a90bc53..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl
deleted file mode 100755
index 21b83c8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl
deleted file mode 100755
index 59c7d45..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl
deleted file mode 100755
index 80caafc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl
deleted file mode 100755
index 461909d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl
deleted file mode 100755
index 43b8d87..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter
deleted file mode 100755
index 6f939c0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/BaseCalls/L001/s_1_1101.filter and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs b/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs
deleted file mode 100755
index 7d39855..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/125T125T/Data/Intensities/L001/s_1_1101.clocs and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl
deleted file mode 100755
index 34c6790..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl
deleted file mode 100755
index ebd3bd6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl
deleted file mode 100755
index 30a011e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl
deleted file mode 100755
index c210e60..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl
deleted file mode 100755
index 545a11a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl
deleted file mode 100755
index 2fef451..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl
deleted file mode 100755
index dea83d8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl
deleted file mode 100755
index 87a0a75..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl
deleted file mode 100755
index fbc27ca..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl
deleted file mode 100755
index acb84a8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl
deleted file mode 100755
index c7a8aa6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
deleted file mode 100755
index 9c55e8e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl
deleted file mode 100755
index 16dc356..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl
deleted file mode 100755
index d79c014..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl
deleted file mode 100755
index b7acb77..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl
deleted file mode 100755
index c4a16a3..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl
deleted file mode 100755
index dffddf8..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl
deleted file mode 100755
index 33009f6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl
deleted file mode 100755
index e41df54..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl
deleted file mode 100755
index c1674bf..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl
deleted file mode 100755
index ddf2c63..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl
deleted file mode 100755
index 2e5753f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl
deleted file mode 100755
index 52f8f1f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl
deleted file mode 100755
index 096299b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl
deleted file mode 100755
index 154911e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl
deleted file mode 100755
index 2fadbf9..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl
deleted file mode 100755
index 26ffd9b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl
deleted file mode 100755
index 6bb899a..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl
deleted file mode 100755
index 9ef653f..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl
deleted file mode 100755
index e5dc298..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl
deleted file mode 100755
index 3a990cf..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl
deleted file mode 100755
index d4c7ec2..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl
deleted file mode 100755
index 5ae5305..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl
deleted file mode 100755
index 6ec1b8c..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl
deleted file mode 100755
index 1b3bc23..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl
deleted file mode 100755
index b91ab3d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl
deleted file mode 100755
index 72f026e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl
deleted file mode 100755
index f84ee35..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl
deleted file mode 100755
index 28af6d0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl
deleted file mode 100755
index c668327..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl
deleted file mode 100755
index 70827f0..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl
deleted file mode 100755
index bad8f53..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl
deleted file mode 100755
index ec3a7fa..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl
deleted file mode 100755
index 1820ae6..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl
deleted file mode 100755
index e20873b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
deleted file mode 100755
index a9d9fa5..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
deleted file mode 100755
index df8caba..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
deleted file mode 100755
index e5d4067..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
deleted file mode 100755
index c3f88ca..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl
deleted file mode 100755
index 35ca65b..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl
deleted file mode 100755
index dcc1994..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl
deleted file mode 100755
index 76d360e..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl
deleted file mode 100755
index c0b65db..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl
deleted file mode 100755
index 2458983..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl
deleted file mode 100755
index 6d5d107..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl
deleted file mode 100755
index f248e20..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl
deleted file mode 100755
index 7e21656..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl
deleted file mode 100755
index 359ff7d..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter
deleted file mode 100755
index 0ad05bc..0000000
Binary files a/src/test/resources/net/sf/picard/illumina/25T8B25T/Data/Intensities/BaseCalls/L001/s_1_1101.filter and /dev/null differ
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam
deleted file mode 100644
index f36c12a..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGGTAT.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.ACAGGTAT LB:LN_ACAGGTAT SM:SA_ACAGGTAT CN:BI
-HiMom:1:1101:1236:2121 77 * 0 0 * * 0 0 .GGTGCTTCATATCCCTCTAGAGGA #1=BDDFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1236:2121 141 * 0 0 * * 0 0 TTGCGCTTACTTTGTAGCCTTCATC CCCFFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1341:2116 77 * 0 0 * * 0 0 .AGAAGCCCCAGGAGGAAGACAGTC #1=DDFFFHHHHHHHJIIJJJJJGI RG:Z:HiMom.1
-HiMom:1:1201:1341:2116 141 * 0 0 * * 0 0 ATAACAGCGAGACTGGCAACTTAAA ######################### RG:Z:HiMom.1
-HiMom:1:2101:1063:2206 77 * 0 0 * * 0 0 TCCTATTCGCCTACACAATTCTCCG CCCFFFFFHHHHHJJJJJJJHJJJJ RG:Z:HiMom.1
-HiMom:1:2101:1063:2206 141 * 0 0 * * 0 0 .TGCTAGGATGAGGATGGATAGTAA #1=DDDFFHHHHHJHIIJHIIIHHJ RG:Z:HiMom.1
-HiMom:1:2101:1325:2083 77 * 0 0 * * 0 0 .CAGAAGAAAGGGCCTTGTCGGAGG #1=DDDDDHHFHDGI at EEHG:?FA8 RG:Z:HiMom.1
-HiMom:1:2101:1325:2083 141 * 0 0 * * 0 0 TGTGCTCTTCCGATCTGGAGAAAAA ######################### RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam
deleted file mode 100644
index e457cdd..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACAGTTGA.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.ACAGTTGA LB:LN_ACAGTTGA SM:SA_ACAGTTGA CN:BI
-HiMom:1:2101:1048:2238 77 * 0 0 * * 0 0 .CTGCCGTGTCCTGACTTCTGGAAT #1:B?ADDACF<DCG;EG<FHH at CE RG:Z:HiMom.1
-HiMom:1:2101:1048:2238 141 * 0 0 * * 0 0 .GTCACATCGTTGAAGCACTGGATC #11ADDDB<CFFHCHGDBHGIIIII RG:Z:HiMom.1
-HiMom:1:2101:1216:2193 77 * 0 0 * * 0 0 TTTTCTTGGCCTCTGTTTTTTTTTT BCCFDFFFHHFFHJIGIJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:2101:1216:2193 141 * 0 0 * * 0 0 AGGCATGACACTGCATTTTAAATAC @@@DDDDDHFFHHGGDFHFHIIHGG RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam
deleted file mode 100644
index 9b6932a..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ACTAAGAC.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.ACTAAGAC LB:LN_ACTAAGAC SM:SA_ACTAAGAC CN:BI
-HiMom:1:1101:1259:2152 77 * 0 0 * * 0 0 CACCTATAATCCCAGCTACTCCAGA CCCFFFFFHHHHHJJJJJJIJJJIJ RG:Z:HiMom.1
-HiMom:1:1101:1259:2152 141 * 0 0 * * 0 0 ATTTTTATATTTTTTTAGACATAGG CCCFFFFFGHHHHJJJJIGIIJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1261:2127 589 * 0 0 * * 0 0 .TGAAATCTGGATAGGCTGGAGTTA #0-@@@################### RG:Z:HiMom.1
-HiMom:1:1101:1261:2127 653 * 0 0 * * 0 0 TTTTTTTTTTTTTTTTTTTTTTTTT CCCFFFFFHGHHHJJIFDDDDDDDD RG:Z:HiMom.1
-HiMom:1:2101:1021:2209 77 * 0 0 * * 0 0 .GGCCCCACCCTCCTCCAGCACGTC #1=DDFFFHHHHHJJJJJJHIIHFH RG:Z:HiMom.1
-HiMom:1:2101:1021:2209 141 * 0 0 * * 0 0 ..GGAAGGCTGCTAGCTGGCCAGAG ##08@>??@@??@?????????>?@ RG:Z:HiMom.1
-HiMom:1:2101:1262:2128 589 * 0 0 * * 0 0 AGCAGAAGGGCAAAAGCTGGCTTGA 9;<@:@################### RG:Z:HiMom.1
-HiMom:1:2101:1262:2128 653 * 0 0 * * 0 0 TCTTGTGGTAACTTTTCTGACACCT -(---9@;@?:8>?4:>?@###### RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam
deleted file mode 100644
index 3797f98..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/AGGTCGCA.sam
+++ /dev/null
@@ -1,10 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.AGGTCGCA LB:LN_AGGTCGCA SM:SA_AGGTCGCA CN:BI
-HiMom:1:1101:1150:2228 77 * 0 0 * * 0 0 GCTACTCAGTAGACAGTCCCACCCT @@CADDDDFCFHHIIIIGGIIGGGI RG:Z:HiMom.1
-HiMom:1:1101:1150:2228 141 * 0 0 * * 0 0 ATGGGAGGCGATTCCTAGGGGGTTG 8?=DD8;@BH6DHD<FGGGEIGHIG RG:Z:HiMom.1
-HiMom:1:1101:1491:2120 77 * 0 0 * * 0 0 .GGCAGGTGCCCCCACTTGACTCTC #1?DFFFFGHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1491:2120 141 * 0 0 * * 0 0 GGCCAGGCTGAACTTCTGAGCTGCT CCCFFFFFHHHGHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1190:2194 77 * 0 0 * * 0 0 AACCTGGCGCTAAACCATTCGTAGA CCCFFFFFHHHHHJJJJJJJJIJJJ RG:Z:HiMom.1
-HiMom:1:1201:1190:2194 141 * 0 0 * * 0 0 ACAAACCCTTGTGTCGAGGGCTGAC CCCFFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:2101:1188:2195 77 * 0 0 * * 0 0 TTAGACCGTCGTGAGACAGGTTAGT @CCFFFFFHHHHHJJJJJIIEHIJH RG:Z:HiMom.1
-HiMom:1:2101:1188:2195 141 * 0 0 * * 0 0 GCACATACACCAAATGTCTGAACCT CCCFFFFFHHHHHJJJHIJJJJJJJ RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam
deleted file mode 100644
index 36d2d52..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/ATTATCAA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.ATTATCAA LB:LN_ATTATCAA SM:SA_ATTATCAA CN:BI
-HiMom:1:1101:1100:2207 77 * 0 0 * * 0 0 ACGACAGACGTTCTTTCTTTGCTGC CCCFFFFFHHFHHJIJJJJJHIJJH RG:Z:HiMom.1
-HiMom:1:1101:1100:2207 141 * 0 0 * * 0 0 AGGCT............G....... ######################### RG:Z:HiMom.1
-HiMom:1:1101:1157:2135 77 * 0 0 * * 0 0 .GGACATTGTAATCATTTCTTACAA #1=DD?DDHHHHHGGHIIIIIIIII RG:Z:HiMom.1
-HiMom:1:1101:1157:2135 141 * 0 0 * * 0 0 TTTAAAGTCTTAATCAAAGATGATA CCCFFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1269:2170 77 * 0 0 * * 0 0 ACAGTGTGGGAGGCAGACGAAGAGA @@@DDDDDFA:C at EGA?FD<FFHII RG:Z:HiMom.1
-HiMom:1:1101:1269:2170 141 * 0 0 * * 0 0 TTCCAAGCCTGTGCTTTAAGGAAAA @@<ADBDBDF8DDCFH at GIE@@GGH RG:Z:HiMom.1
-HiMom:1:1201:1018:2217 589 * 0 0 * * 0 0 .TTTCTCTGGGCGCAAAGATGTTCA #07;8=8<<99(:=@@/@7>>6=?> RG:Z:HiMom.1
-HiMom:1:1201:1018:2217 653 * 0 0 * * 0 0 ......................... ######################### RG:Z:HiMom.1 XN:i:1
-HiMom:1:1201:1118:2198 77 * 0 0 * * 0 0 CAAGTGTACAGGATTAGACTGGGTT BCCFDEBDHHHHHIJJJGIIIJJGH RG:Z:HiMom.1
-HiMom:1:1201:1118:2198 141 * 0 0 * * 0 0 AATAAACTTTATTAAAGCAGTTAAA C at CFFFFFHDHHHGIIIJJJIJJJJ RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam
deleted file mode 100644
index d598919..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAATAGTC.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.CAATAGTC LB:LN_CAATAGTC SM:SA_CAATAGTC CN:BI
-HiMom:1:1101:1316:2126 77 * 0 0 * * 0 0 .AAAAAAAAAAAAAAAAAAAAAAAA #1BDFFFFHHHHHJJJJFDDDDDDD RG:Z:HiMom.1 XN:i:1
-HiMom:1:1101:1316:2126 141 * 0 0 * * 0 0 TCTTTTTTTTTTTTTTTTTTTTTTT CCCFFFFFHHHHHJJJJHFDDDDDD RG:Z:HiMom.1
-HiMom:1:1101:1399:2128 77 * 0 0 * * 0 0 .TGCCCTTCGTCCTGGGAAACGGGG #1BDFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1399:2128 141 * 0 0 * * 0 0 ACAAACCCTTGTGTCGAGGGCTGAC CCCFFFFFHHHHHIJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1054:2151 77 * 0 0 * * 0 0 .TAGTGCTGGGCACTAAGTAATACC #4=DDDFFHHHHHJJJJJHIJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1054:2151 141 * 0 0 * * 0 0 GTCAGGCACTGAGAATATATGGGTG CBCFFFFFHHHHHJJJJJJJJJJEG RG:Z:HiMom.1
-HiMom:1:1201:1345:2181 77 * 0 0 * * 0 0 GGATAATCCTATTTATTACCTCAGA BBBDDFFFHHHHHJJJJJJJJJIJJ RG:Z:HiMom.1
-HiMom:1:1201:1345:2181 141 * 0 0 * * 0 0 ATACGGATGTGTTTAGGAGTGGGAC CCCFFFFFHHHHHIIJJHJFHIJIJ RG:Z:HiMom.1
-HiMom:1:1201:1392:2184 77 * 0 0 * * 0 0 TTTCAGATTGGTCATTGTTAGTGTA ??@BDDDEHBHADHHIIEHDHFHFF RG:Z:HiMom.1
-HiMom:1:1201:1392:2184 141 * 0 0 * * 0 0 ATCTTTATTCATTTGTATGATCTTA @@BFFFFFHFFHFHIHIIJIJJJJI RG:Z:HiMom.1
-HiMom:1:2101:1172:2152 589 * 0 0 * * 0 0 AACACGGACAAAGGAGTCTAACACG <<<??8@@################# RG:Z:HiMom.1
-HiMom:1:2101:1172:2152 653 * 0 0 * * 0 0 ATCGTTTCTGGGGACTAGTGAGGCG ######################### RG:Z:HiMom.1
-HiMom:1:2101:1491:2093 77 * 0 0 * * 0 0 .CTATGCCGATCGGGTGTCCGCACT #1=DDDDDHHFHHIIEHHHBGHGII RG:Z:HiMom.1
-HiMom:1:2101:1491:2093 141 * 0 0 * * 0 0 AGAGACGGGGTCTCGCTATGTTGCC BCCDFFFFHHHHHJIIJJJJIJIJJ RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam
deleted file mode 100644
index e42e715..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CAGCGGTA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.CAGCGGTA LB:LN_CAGCGGTA SM:SA_CAGCGGTA CN:BI
-HiMom:1:1101:1420:2213 77 * 0 0 * * 0 0 TACCTGGTTGATCCTGCCAGTAGCA @@CFFFFDDHHGHJGGHIJJIHGBH RG:Z:HiMom.1
-HiMom:1:1101:1420:2213 141 * 0 0 * * 0 0 TTCACTGTACCGGCCGTGCGTACTT @CCFFFFDHHHFGIJJJJJJGHIGG RG:Z:HiMom.1
-HiMom:1:1201:1364:2113 77 * 0 0 * * 0 0 .CACTCATTTTCTTATGTGGGATAT #1=DDFDFHHHHHIJJIFHIIHHHI RG:Z:HiMom.1
-HiMom:1:1201:1364:2113 141 * 0 0 * * 0 0 TAAAGAGAGCCAGTGGAGTTACGAC ######################### RG:Z:HiMom.1
-HiMom:1:2101:1072:2170 77 * 0 0 * * 0 0 ATCACCGCACTCATTTCCCGCTTCC CCCFFFFFHHHACEEGHIIBHIIII RG:Z:HiMom.1
-HiMom:1:2101:1072:2170 141 * 0 0 * * 0 0 .GGGGAGACAGAGAGGATCAGAAGT #4=BDDFDHHDFHEGFEGGIJIIIG RG:Z:HiMom.1
-HiMom:1:2101:1123:2095 77 * 0 0 * * 0 0 .TGGACAACATGTTCGAGAGCTACA #1=BBDDDFFFFDGFGIG?F;HHFI RG:Z:HiMom.1
-HiMom:1:2101:1123:2095 141 * 0 0 * * 0 0 TCCGCCTCCAGCTTCAGCTTCTCCT @@@FDDFFHHHHHJHGGJIJJJEHH RG:Z:HiMom.1
-HiMom:1:2101:1151:2236 589 * 0 0 * * 0 0 TTAAAGAGGTTCAGGGATGCAGAGT ######################### RG:Z:HiMom.1
-HiMom:1:2101:1151:2236 653 * 0 0 * * 0 0 TTTGAAGCCTCTTTATCCTTGGCAT ######################### RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam
deleted file mode 100644
index dc2b3bf..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CGCTATGT.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.CGCTATGT LB:LN_CGCTATGT SM:SA_CGCTATGT CN:BI
-HiMom:1:1101:1291:2150 77 * 0 0 * * 0 0 CGTGGGGAACCTGGCGCTAAACCAT @BBFFFFFHHHHHJJJJIJJJJJIJ RG:Z:HiMom.1
-HiMom:1:1101:1291:2150 141 * 0 0 * * 0 0 ACAAACCCTTGTGTCGAGGGCTGAC CCCFFFFFHHFHHIJJJIIIGIJIJ RG:Z:HiMom.1
-HiMom:1:1101:1314:2233 77 * 0 0 * * 0 0 GTTTATTGGGGCATTCCTTATCCCA @??DDDDBDHF>FCHGGGBFAAED9 RG:Z:HiMom.1
-HiMom:1:1101:1314:2233 141 * 0 0 * * 0 0 AGGAAAGTTGGGCTGACCTGACAGA @@<DDD;=FBFADBCGDEH?F;FCG RG:Z:HiMom.1
-HiMom:1:1101:1441:2148 77 * 0 0 * * 0 0 ACTTTCACCGCTACACGACCGGGGG CCCFFFFFHGFFHIIFIHJIGGII> RG:Z:HiMom.1
-HiMom:1:1101:1441:2148 141 * 0 0 * * 0 0 TTTTGGCTCTAGAGGGGGTAGAGGG CCCFFFFFHHDFBHIIJJ1?FGHIJ RG:Z:HiMom.1
-HiMom:1:1201:1043:2246 77 * 0 0 * * 0 0 .TTCTCGGCTGTCATGTGCAACATT #1=DDBDFHHHDFFBHGHGHIIJEH RG:Z:HiMom.1
-HiMom:1:1201:1043:2246 141 * 0 0 * * 0 0 .GCATCATTTC..GCTTCTCTCTGT #0;@@??@=@>##22=;@??><@?? RG:Z:HiMom.1
-HiMom:1:1201:1134:2144 77 * 0 0 * * 0 0 TGCCAGGAAGTGTTTTTTCTGGGTC @CCFFEFFHHFFFGIJJJJJJJJGH RG:Z:HiMom.1
-HiMom:1:1201:1134:2144 141 * 0 0 * * 0 0 AGTGTGAGTAATGGTTGAGAGGTGG B@?DDDFFFHHGHJHHGFIHHIFGI RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam
deleted file mode 100644
index 2ee594d..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/CTGTAATC.sam
+++ /dev/null
@@ -1,14 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.CTGTAATC LB:LN_CTGTAATC SM:SA_CTGTAATC CN:BI
-HiMom:1:1101:1403:2194 77 * 0 0 * * 0 0 CTAAACAGAGAGAAGGTTTCTCTTT CCCFFFFFHHHHHJJJFHIJJJJJJ RG:Z:HiMom.1
-HiMom:1:1101:1403:2194 141 * 0 0 * * 0 0 ACATGGTGAAACCCTGTCTCTACTA CCCFFFDDHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1045:2105 589 * 0 0 * * 0 0 .TAAAGAGAAATCAAGAATACTATT #-4@?(@)@@############### RG:Z:HiMom.1
-HiMom:1:1201:1045:2105 653 * 0 0 * * 0 0 .TTTTTTTTTT..TTTTTTTTTTTT #0;@@@@@@@?##0:????????=< RG:Z:HiMom.1
-HiMom:1:1201:1483:2126 589 * 0 0 * * 0 0 .TGATAAGGTGTTGCTATGTTACCC #1:D?DDDDA??2:<CC4:AEDF>? RG:Z:HiMom.1
-HiMom:1:1201:1483:2126 653 * 0 0 * * 0 0 GCATGCAGCTGGGTGCTGTGATGCA @@@DDDBB<DD8F<<CGG?AA?A<F RG:Z:HiMom.1
-HiMom:1:2101:1011:2102 77 * 0 0 * * 0 0 .AAACAAAACTGTAGAACTGTGTAT #1=DDFFFHHHHHJJIJJJIHHHJJ RG:Z:HiMom.1
-HiMom:1:2101:1011:2102 141 * 0 0 * * 0 0 .....TCACACATAATTTTAAAATT #####22@?@@??@@@@@??@@@@@ RG:Z:HiMom.1
-HiMom:1:2101:1245:2154 77 * 0 0 * * 0 0 TCGTTAAGTATATTCTTAGGTATTT CCCFFDFFFHFHHIIJJJJJFJJJI RG:Z:HiMom.1
-HiMom:1:2101:1245:2154 141 * 0 0 * * 0 0 ACCAATCAGTAGCACCACTATACAC CCCFFFFFHHHHHJJJJJJIJJJJJ RG:Z:HiMom.1
-HiMom:1:2101:1386:2105 77 * 0 0 * * 0 0 .TACTAAAGAAAAAGTTGAAGAACT #1=DDDFFHHHHHJJGHIJJJJIJJ RG:Z:HiMom.1
-HiMom:1:2101:1386:2105 141 * 0 0 * * 0 0 AGGAATTATTCTTCTGCCATAAGGT B@@DDFFFHGFHHIJJJJJGIGIJH RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam
deleted file mode 100644
index 7fbc0a2..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GACCAGGA.sam
+++ /dev/null
@@ -1,16 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.GACCAGGA LB:LN_GACCAGGA SM:SA_GACCAGGA CN:BI
-HiMom:1:1101:1089:2172 77 * 0 0 * * 0 0 TTCCAGCATGCGGTTTAAGTAGGAT @CCFDFDBDFBF:<CEBHAFHHICH RG:Z:HiMom.1
-HiMom:1:1101:1089:2172 141 * 0 0 * * 0 0 TCCGG.................... :<<??#################### RG:Z:HiMom.1
-HiMom:1:1101:1347:2149 77 * 0 0 * * 0 0 GAGCAGATCGGAAGAGCACAGATCG @@@FFDDDHHHHHIJJBGGHJIHEG RG:Z:HiMom.1
-HiMom:1:1101:1347:2149 141 * 0 0 * * 0 0 GCTCTTCCGATCTGTGCTCTTCCGA CCCFFFFFDFHHFIJDGIGGHGIGH RG:Z:HiMom.1
-HiMom:1:1201:1095:2146 77 * 0 0 * * 0 0 GCTGAGTCATGTAGTAAGCCTGTGC BB at FDDDFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1095:2146 141 * 0 0 * * 0 0 ACTGACAACACCAAATGCTGCTAAG CCCFFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1123:2161 589 * 0 0 * * 0 0 CACTAACTCCTGACCTCAAATAATC ?7?=DD?DD+CDBE>E at EEF@+<CF RG:Z:HiMom.1
-HiMom:1:1201:1123:2161 653 * 0 0 * * 0 0 CGTGTGCTCTTCCGATCTGCATACA ===AAAA8AAAA<AAA)@CBA9>A# RG:Z:HiMom.1
-HiMom:1:1201:1439:2156 77 * 0 0 * * 0 0 AGCCGCGAGGTGCTGGCGGACTTCC :;1BDDDAA88A<?<E1C:D##### RG:Z:HiMom.1
-HiMom:1:1201:1439:2156 141 * 0 0 * * 0 0 GGAGATTATTTGCCTTGAAGTAAGC -;(22<>>@>8@>8;@######### RG:Z:HiMom.1
-HiMom:1:2101:1207:2084 589 * 0 0 * * 0 0 .TAGATGACCAAAACTTGCAGGGCA #1:A<?@A+7A=?CBCCBCCBAAAA RG:Z:HiMom.1
-HiMom:1:2101:1207:2084 653 * 0 0 * * 0 0 TCACCACTCTTCTGGGCATCCCCTG @@@DDEDFHHHHHIJIHHGHGGJJJ RG:Z:HiMom.1
-HiMom:1:2101:1312:2105 77 * 0 0 * * 0 0 .TTCCCTCAGGATAGCTGGCGCTCT #1=DDFFFGHGHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:2101:1312:2105 141 * 0 0 * * 0 0 GTTGAGAATAGGTTGAGATCGTTTC @CCFFFDFHHFHDHIJJJJJJJIJJ RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam
deleted file mode 100644
index 60aa17e..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCGTCGA.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.GCCGTCGA LB:LN_GCCGTCGA SM:SA_GCCGTCGA CN:BI
-HiMom:1:1101:1111:2148 77 * 0 0 * * 0 0 GTGGAGACCACCTCCGAGGCCTTGT BBCFFFFFHHHHHJJJIJJJJJJJI RG:Z:HiMom.1
-HiMom:1:1101:1111:2148 141 * 0 0 * * 0 0 GCGAA.A..........GGACGAC. ######################### RG:Z:HiMom.1
-HiMom:1:1101:1221:2143 77 * 0 0 * * 0 0 TTTGGTGGAAATTTTTTGTTATGAT CCCFFBDBHFD?FBFHIIGGIC at EF RG:Z:HiMom.1
-HiMom:1:1101:1221:2143 141 * 0 0 * * 0 0 CAATTGAATGTCTGCACAGCCGCTT @@@FFFFDHHHHHJJJIIIJGHIJJ RG:Z:HiMom.1
-HiMom:1:1101:1327:2200 589 * 0 0 * * 0 0 AGGGGGATCCGCCGGGGGACCACAA ######################### RG:Z:HiMom.1
-HiMom:1:1101:1327:2200 653 * 0 0 * * 0 0 GTCATCTGGGCTGTCGACAGGTGTC @B at FFFFFHHHHGIJJJJJJIFHHI RG:Z:HiMom.1
-HiMom:1:2101:1122:2136 77 * 0 0 * * 0 0 GTAGGCGCTCAGCAAATACTTGTCG @@@DDDD8?<CACEHHBBHDAAFH@ RG:Z:HiMom.1
-HiMom:1:2101:1122:2136 141 * 0 0 * * 0 0 CTTGCCAGCCTGCAGGCCCCGCGGC ???BBAABDD?DDIID)A:3<EADD RG:Z:HiMom.1
-HiMom:1:2101:1459:2083 77 * 0 0 * * 0 0 .CACACGCCACACGGAGCACACTTT #4=DDFFFHHHHHJJJJJJJJIIJJ RG:Z:HiMom.1
-HiMom:1:2101:1459:2083 141 * 0 0 * * 0 0 ATTTCACCAAAATAATCAGAAGGCC CCCFFFFDBHGHHIGGIJFJJGGFH RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam
deleted file mode 100644
index 9cdc1b4..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/GCCTAGCC.sam
+++ /dev/null
@@ -1,12 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.GCCTAGCC LB:LN_GCCTAGCC SM:SA_GCCTAGCC CN:BI
-HiMom:1:1101:1165:2239 77 * 0 0 * * 0 0 GGCGGAGGCAGCATTTCAGCTGTGA CCCFFDFFHHHHHIJJIGHHHJHHF RG:Z:HiMom.1
-HiMom:1:1101:1165:2239 141 * 0 0 * * 0 0 ATGGAAGTCGAGACAGAAGTGAGAA ######################### RG:Z:HiMom.1
-HiMom:1:1101:1290:2225 77 * 0 0 * * 0 0 CTTGGGCGCATGGTGAGGGAGGGAG @@@FFDDFHDFH??CBEBHHIGDCD RG:Z:HiMom.1
-HiMom:1:1101:1290:2225 141 * 0 0 * * 0 0 TCAGTTCACTGGCAAAGACAGTCAC C@@FBEDDFHFHGIIICEHGDHBHE RG:Z:HiMom.1
-HiMom:1:1201:1280:2179 77 * 0 0 * * 0 0 TTCAAGGAATCGTCCTGCCTCAGCC BCCFFFFFHHHHHJJJJJJJJJJJJ RG:Z:HiMom.1
-HiMom:1:1201:1280:2179 141 * 0 0 * * 0 0 GAGGACTGCTTGAGTCCAGGAGTTC @@BFFDEFGHHHHIFGCHIJJJGGI RG:Z:HiMom.1
-HiMom:1:1201:1300:2137 77 * 0 0 * * 0 0 .TGTAATCCCAGCTCTCAGGGAGGC #1=ADDDDDDDBBA?@AE?E at FE8; RG:Z:HiMom.1
-HiMom:1:1201:1300:2137 141 * 0 0 * * 0 0 GCTCTTCCGATCTTTTTTTTAATTT @@?DDDDDFDHADEHGIGGED3?FD RG:Z:HiMom.1
-HiMom:1:2101:1023:2237 589 * 0 0 * * 0 0 .TAAACAGCTTCTGCACAGCCAAAG #00@@?>=39>9;<412@?###### RG:Z:HiMom.1
-HiMom:1:2101:1023:2237 653 * 0 0 * * 0 0 ..TTTGTTTGAGTTCCTTGTAGATT ##0:=@?>?@???@:>?@??>?;?< RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam
deleted file mode 100644
index 5cc7ccf..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/N.sam
+++ /dev/null
@@ -1,34 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.N LB:LN_N SM:SA_N CN:BI
-HiMom:1:1101:1031:2224 589 * 0 0 * * 0 0 .AATA............T....... #0;@@#################### BC:Z:NNNNNNNN RG:Z:HiMom.1
-HiMom:1:1101:1031:2224 653 * 0 0 * * 0 0 ......................... ######################### BC:Z:NNNNNNNN RG:Z:HiMom.1 XN:i:1
-HiMom:1:1101:1039:2147 589 * 0 0 * * 0 0 .CCAA.G..GG....ATGTAA.... #4;@@#4##2<####43@@@@#### BC:Z:NNNNNNNN RG:Z:HiMom.1
-HiMom:1:1101:1039:2147 653 * 0 0 * * 0 0 ......................... ######################### BC:Z:NNNNNNNN RG:Z:HiMom.1 XN:i:1
-HiMom:1:1101:1046:2175 589 * 0 0 * * 0 0 .TGCC.G.GTT.CG.GGTCTT.... #4;@@#################### BC:Z:NNNNNNNN RG:Z:HiMom.1
-HiMom:1:1101:1046:2175 653 * 0 0 * * 0 0 ..GGA.................... ######################### BC:Z:NNNNNNNN RG:Z:HiMom.1
-HiMom:1:1101:1047:2122 589 * 0 0 * * 0 0 .CTAA.G.ACT.TG.GTGTGC.... #0;@@#4#3@@#3@#2<@@@@#### BC:Z:NNNANNNN RG:Z:HiMom.1
-HiMom:1:1101:1047:2122 653 * 0 0 * * 0 0 ..TCA.................... ######################### BC:Z:NNNANNNN RG:Z:HiMom.1
-HiMom:1:1101:1048:2197 589 * 0 0 * * 0 0 .CTCC.G.TCA.CA.GTGGAG.... #0;?@#################### BC:Z:NNNCNNNN RG:Z:HiMom.1
-HiMom:1:1101:1048:2197 653 * 0 0 * * 0 0 ..GTG.................... ######################### BC:Z:NNNCNNNN RG:Z:HiMom.1
-HiMom:1:1101:1065:2193 77 * 0 0 * * 0 0 GAAGTACGCCCTGCCCCTGGTT.GC ?@@DAADAHHFHBEBEGGHG?#### BC:Z:GAACGATN RG:Z:HiMom.1
-HiMom:1:1101:1065:2193 141 * 0 0 * * 0 0 .CTTG.................... ######################### BC:Z:GAACGATN RG:Z:HiMom.1
-HiMom:1:1101:1162:2207 589 * 0 0 * * 0 0 ACCTTGAGGAGAACATAAGAGCAAA ######################### BC:Z:ACAAAATT RG:Z:HiMom.1
-HiMom:1:1101:1162:2207 653 * 0 0 * * 0 0 TAAAACTGGGGAAGTTAGAGGAATG ######################### BC:Z:ACAAAATT RG:Z:HiMom.1
-HiMom:1:1201:1159:2179 589 * 0 0 * * 0 0 GTTAGCACAGATATTGGATGAGTGA ######################### BC:Z:AAAAAAAA RG:Z:HiMom.1
-HiMom:1:1201:1159:2179 653 * 0 0 * * 0 0 TTTTTTTTTATTTTTCTAAATACTT ===AA#################### BC:Z:AAAAAAAA RG:Z:HiMom.1
-HiMom:1:1201:1414:2174 589 * 0 0 * * 0 0 GCCAAAAAAAAGAACCAGCCCAAGG ######################### BC:Z:AGAAAAGA RG:Z:HiMom.1
-HiMom:1:1201:1414:2174 653 * 0 0 * * 0 0 TTTTTTTTTTTTTTTTTTTTTTTTT @;@1BDADF????FFEB>B6=BBBB BC:Z:AGAAAAGA RG:Z:HiMom.1
-HiMom:1:2101:1040:2208 589 * 0 0 * * 0 0 .ATGCCCACCTCCCTCCTACGCACC ######################### BC:Z:ACGAAATC RG:Z:HiMom.1
-HiMom:1:2101:1040:2208 653 * 0 0 * * 0 0 .CTGATAGTCACTGAAATGAATTCA #-0=>(2 at .22@@############ BC:Z:ACGAAATC RG:Z:HiMom.1
-HiMom:1:2101:1059:2083 77 * 0 0 * * 0 0 .AAGAGGGGTCAAGAGTTAAACTTA #1=DDFFFHFHHGIGHGHJJJJJJI BC:Z:TACCGTCT RG:Z:HiMom.1
-HiMom:1:2101:1059:2083 141 * 0 0 * * 0 0 .GAATGTCTTAGAAGGATGCTTCTC #1=BDDDEHHGHHJJJJJIJJIIJJ BC:Z:TACCGTCT RG:Z:HiMom.1
-HiMom:1:2101:1143:2137 77 * 0 0 * * 0 0 ATGCAGCAGCTGCCACGGAGCACCA CC at FFDFDFHFHHGIDHEHIGJJJJ BC:Z:TCCGTCTA RG:Z:HiMom.1
-HiMom:1:2101:1143:2137 141 * 0 0 * * 0 0 GCTCTTCAGATCTAGGGGGAACAGC @@@DD?=DCAFFFHIIDG:EFHIII BC:Z:TCCGTCTA RG:Z:HiMom.1
-HiMom:1:2101:1151:2182 589 * 0 0 * * 0 0 TTGTTTTGGCTTATAATGACAAGAA ;;8-2).2())(<6=@8;?4??>>? BC:Z:GAAAAAAA RG:Z:HiMom.1
-HiMom:1:2101:1151:2182 653 * 0 0 * * 0 0 TTTTTTTTTTTTTTTTTTTTTTTTA 9<<?@?@;5=?############## BC:Z:GAAAAAAA RG:Z:HiMom.1
-HiMom:1:2101:1215:2110 77 * 0 0 * * 0 0 .AATATAATTTGGAGACCCTTTGTT #1=DDDDDEDDDDIDDBB3ABAB## BC:Z:AAAAGAAG RG:Z:HiMom.1
-HiMom:1:2101:1215:2110 141 * 0 0 * * 0 0 ATCTTTCCCCCATTAAGAACAGCAA ######################### BC:Z:AAAAGAAG RG:Z:HiMom.1
-HiMom:1:2101:1285:2105 589 * 0 0 * * 0 0 .GCGGGGAGCCGGGCGTGGAATGCG ######################### BC:Z:TATCTCGG RG:Z:HiMom.1
-HiMom:1:2101:1285:2105 653 * 0 0 * * 0 0 TGTCTATATCAACCAACACCTCTTC -(0(():94:9:???########## BC:Z:TATCTCGG RG:Z:HiMom.1
-HiMom:1:2101:1450:2134 77 * 0 0 * * 0 0 AGCACGCTGCCGCGGGACCTGCCCA ?@@AD at DDHFH?DGIIIIG at FGFBF BC:Z:ACCAGTTG RG:Z:HiMom.1
-HiMom:1:2101:1450:2134 141 * 0 0 * * 0 0 ACAAACCCTTGTGTCGAGGGCTGAC CC at FDFDFFDFHFGIIE1CGGHBGE BC:Z:ACCAGTTG RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam
deleted file mode 100644
index cf5b43d..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGCAAGTA.sam
+++ /dev/null
@@ -1,6 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.TGCAAGTA LB:LN_TGCAAGTA SM:SA_TGCAAGTA CN:BI
-HiMom:1:1101:1242:2170 77 * 0 0 * * 0 0 ATGGCAGGGCAGAGTTCTGATGAGT CCCFFFFFHHGGGIFHEIIGIIII? RG:Z:HiMom.1
-HiMom:1:1101:1242:2170 141 * 0 0 * * 0 0 GGAAGGAAAAGAAGCACAAGTACAT @@@DFDFFHHHGHHGIIGJJEHHIG RG:Z:HiMom.1
-HiMom:1:2101:1163:2222 77 * 0 0 * * 0 0 GAGCAGGCAAGGAGGACTTCTTGTT CCCFFFFFGHHHHJJHHIJJJJJIJ RG:Z:HiMom.1
-HiMom:1:2101:1163:2222 141 * 0 0 * * 0 0 GAGCGATAATGGTTCTTTTCCTCAC @@@DFFFFHHHHHJJJJJJJIJJJJ RG:Z:HiMom.1
diff --git a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam b/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam
deleted file mode 100644
index 5574342..0000000
--- a/src/test/resources/net/sf/picard/illumina/25T8B25T/sams/TGTAATCA.sam
+++ /dev/null
@@ -1,8 +0,0 @@
- at HD VN:1.5 SO:queryname
- at RG ID:HiMom.1 PL:illumina PU:HiMom.1.TGTAATCA LB:LN_TGTAATCA SM:SA_TGTAATCA CN:BI
-HiMom:1:1101:1419:2119 77 * 0 0 * * 0 0 .ATGACTATGGTAACTGAAAGAAAA #1:A1BDADBFFDFIIIEEHECACF RG:Z:HiMom.1
-HiMom:1:1101:1419:2119 141 * 0 0 * * 0 0 ACTTTCCTTTTTTGTTTTACTTTAA ######################### RG:Z:HiMom.1
-HiMom:1:1201:1208:2132 77 * 0 0 * * 0 0 .CCTCAATGAGCGGCACTATGGGGG #1=DDFFFHHHHGJJIJJGHIJGIJ RG:Z:HiMom.1
-HiMom:1:1201:1208:2132 141 * 0 0 * * 0 0 CTGTAGAAAGGATGGTCGGGCTCCA @@CDFFFFGHFHHJIJJGJIBHJJG RG:Z:HiMom.1
-HiMom:1:1201:1344:2147 77 * 0 0 * * 0 0 TATCCTCCCTACTATGCCTAGAAGG =?@DADEFHBHDFG>EFGDHGFGHD RG:Z:HiMom.1
-HiMom:1:1201:1344:2147 141 * 0 0 * * 0 0 ACGATTAGTTTTAGCATTGGAGTAG @<??DDDDFHHHFGGHHIIIGGAGH RG:Z:HiMom.1
diff --git a/src/test/resources/testng.xml b/src/test/resources/testng.xml
deleted file mode 100644
index 724ee35..0000000
--- a/src/test/resources/testng.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
-
-<suite name="HTSJDK" verbose="2" parallel="methods" thread-count="8" data-provider-thread-count="8">
-
- <test name="samtools">
- <packages>
- <package name="htsjdk.samtools"/>
- </packages>
- </test>
- <test name="tribble">
- <packages>
- <package name="htsjdk.tribble"/>
- </packages>
- </test>
- <test name="variant">
- <packages>
- <package name="htsjdk.variant"/>
- </packages>
- </test>
-</suite>
\ No newline at end of file
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..9f6464b
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,66 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+by_default: runtests
+
+TOP ?= $(abspath ..)
+MODULE = test
+
+include $(TOP)/build/Makefile.shell
+
+include $(TOP)/build/Makefile.config
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS = \
+ fastq-loader \
+ vcf-loader \
+ kget \
+ general-loader \
+ vschema \
+ align-info \
+ align-cache \
+ vdb-dump \
+ vdb-validate \
+ kar \
+ copycat \
+ fastdump \
+ vdb-copy \
+ qual-recalib-stat \
+ sra-pileup \
+ srapath \
+ fuse \
+
+# under construction
+# ngs-pileup \
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+$(SUBDIRS):
+ @ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS)
+
diff --git a/test/align-cache/CSRA_file b/test/align-cache/CSRA_file
new file mode 100644
index 0000000..18e06d2
Binary files /dev/null and b/test/align-cache/CSRA_file differ
diff --git a/test/align-cache/Makefile b/test/align-cache/Makefile
new file mode 100644
index 0000000..1b55d73
--- /dev/null
+++ b/test/align-cache/Makefile
@@ -0,0 +1,60 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/align-cache
+
+TEST_TOOLS = \
+
+ALL_TOOLS = \
+ $(TEST_TOOLS) \
+
+include $(TOP)/build/Makefile.env
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# align-cache tool tests
+#
+runtests: align-cache
+
+
+align-cache: $(BINDIR)/align-cache
+ @ rm -rf CSRA_file.cache
+ @ echo "vdb/schema/paths = \"$(VDB_INCDIR)\"" > tmp.kfg
+ @ export VDB_CONFIG=`pwd`; $(BINDIR)/align-cache -t 10 --min-cache-count 1 CSRA_file CSRA_file.cache
+ @ $(BINDIR)/vdb-validate CSRA_file.cache/ 2>&1 | grep --quiet "is consistent"
+ @ rm tmp.kfg
+ @ rm -rf CSRA_file.cache
+
+vg: $(BINDIR)/align-cache
+ valgrind --ncbi --suppressions=$(SRCDIR)/valgrind.suppress $(BINDIR)/align-cache -t 10 --min-cache-count 1 CSRA_file CSRA_file.cache
diff --git a/test/align-cache/valgrind.suppress b/test/align-cache/valgrind.suppress
new file mode 100644
index 0000000..002d332
--- /dev/null
+++ b/test/align-cache/valgrind.suppress
@@ -0,0 +1,6 @@
+{
+ vt_cache
+ Memcheck:Leak
+ fun:calloc
+ fun:_ZN3ngs7Resolve*
+}
diff --git a/test/align-info/Makefile b/test/align-info/Makefile
new file mode 100644
index 0000000..3266e05
--- /dev/null
+++ b/test/align-info/Makefile
@@ -0,0 +1,48 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/align-info
+
+TEST_TOOLS = \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# runtests
+runtests: cmdline
+
+cmdline:
+ # make sure -h does not crash
+ $(BINDIR)/align-info -h
\ No newline at end of file
diff --git a/test/copycat/Makefile b/test/copycat/Makefile
new file mode 100644
index 0000000..3f4ed99
--- /dev/null
+++ b/test/copycat/Makefile
@@ -0,0 +1,60 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/copycat
+
+TEST_TOOLS = \
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+ifeq (1,$(HAVE_MAGIC))
+runtests: copy
+else
+runtests:
+ @ echo "NOTE - copycat tests are skipped:" \
+ "copycat was not built"
+ @ echo "because it requires our internal library 'libkff'" \
+ "which requires 'libmagic' and its development headers."
+endif
+
+copy:
+ @ echo "Starting copycat tests..."
+ @ rm -rf actual
+ @ $(BINDIR)/copycat -h >/dev/null
+ @ export PATH=$(BINDIR):$$PATH; vdb-config | grep bin; copycat ./input/1.xml actual/ >/dev/null && diff ./input/1.xml actual/1.xml
+ @ rm -rf actual
diff --git a/test/copycat/input/1.xml b/test/copycat/input/1.xml
new file mode 100644
index 0000000..cc70b4f
--- /dev/null
+++ b/test/copycat/input/1.xml
@@ -0,0 +1,5 @@
+<ROOT version="2.6.2">
+ <archive id="1" path="1.tar" name="1.tar" size="10240" mtime="2016-04-07T21:06:20Z" filetype="Archive/TapeArchive" md5="41fbc9b272d12c815c8a4c301a354b95" crc32="d7b8fc09">
+ <file id="2" path="1.tar/1" name="1" size="25" lines="4" mtime="2016-04-07T19:47:13Z" filetype="Unknown/Unknown" md5="293363f5942f2ca7e4d0a1aa9ffda34f" offset="512"/>
+ </archive>
+</ROOT>
diff --git a/test/fastdump/Makefile b/test/fastdump/Makefile
new file mode 100644
index 0000000..ea3d1d0
--- /dev/null
+++ b/test/fastdump/Makefile
@@ -0,0 +1,53 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/fastdump
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+.PHONY: $(TEST_TOOLS)
+
+slowtests: fastdump1 fastdump2
+
+ACC = SRR341578
+SCRATCH = /tmp/$(shell whoami)/
+THREADS = 4
+
+fastdump1: prepare $(BINDIR)/fastdump $(BINDIR)/vdb-dump
+ @ mkdir -p $(SCRATCH)
+ @./test_no_1.sh $(ACC) $(SCRATCH) $(THREADS) $(BINDIR)
+
+fastdump2: $(BINDIR)/fastdump $(BINDIR)/vdb-dump
+ @ mkdir -p $(SCRATCH)
+ @./test_no_2.sh $(ACC) $(SCRATCH) $(THREADS) $(BINDIR)
+
+prepare:
+ @ export BINDIR=$(BINDIR) ; export VDB_INCDIR=$(VDB_INCDIR) ; \
+ ./copy-default-kfg.sh
diff --git a/test/fastdump/copy-default-kfg.sh b/test/fastdump/copy-default-kfg.sh
new file mode 100755
index 0000000..ad11d52
--- /dev/null
+++ b/test/fastdump/copy-default-kfg.sh
@@ -0,0 +1,12 @@
+# make sure we can find remote repository if site repository does not exist
+
+${BINDIR}/vdb-config -on repository/site/main/tracearc/root
+if [ "$?" != 0 ] ; then
+ if [ -f ${BINDIR}/../../../../../../../ncbi-vdb/libs/kfg/default.kfg ]
+ then
+ cp -v ${BINDIR}/../../../../../../../ncbi-vdb/libs/kfg/default.kfg \
+ ${BINDIR}/ncbi
+ else
+ cp -v ${VDB_INCDIR}/../libs/kfg/default.kfg ${BINDIR}/ncbi
+ fi
+fi
diff --git a/test/fastdump/test_no_1.sh b/test/fastdump/test_no_1.sh
new file mode 100755
index 0000000..25f5f12
--- /dev/null
+++ b/test/fastdump/test_no_1.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+ACC="$1"
+SCRATCH="$2"
+THREADS="$3"
+BINDIR="$4"
+
+echo ""
+echo "===== TESTING FASTDUMP: TEST #1 ( output-type = SPOT_ID,READ,SPOT_GROUP )=="
+echo "accession : $ACC"
+echo "scratch-space at: $SCRATCH"
+echo "parallel threads: $THREADS"
+echo "binaries in : $BINDIR"
+echo ""
+
+FASTDUMP_OUT="$SCRATCH$ACC.fastdump.txt"
+VDB_DUMP_OUT="$SCRATCH$ACC.vdb_dump.txt"
+
+clear_files()
+{
+ CMD="rm -rf $FASTDUMP_OUT $VDB_DUMP_OUT"
+ $CMD 2>&1 > /dev/null
+}
+
+clear_files
+
+#produce the output using the lookup-file
+CMD="$BINDIR/fastdump $ACC -t $SCRATCH -f special -o $FASTDUMP_OUT -e $THREADS -p"
+echo "$CMD"
+$CMD
+rc=$?; if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+
+#produce the same output using vdb-dump with internal schema-joins
+CMD="$BINDIR/vdb-dump $ACC -C SPOT_ID,READ,SPOT_GROUP -f tab"
+echo "$CMD"
+$CMD > $VDB_DUMP_OUT
+rc=$?; if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+
+#verify that the output of fastdump via vdb-dump
+CMD="diff $FASTDUMP_OUT $VDB_DUMP_OUT"
+echo "$CMD"
+$CMD 2>&1 > /dev/null
+rc=$?;
+if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+if [[ $rc == 0 ]]; then echo ">>>SUCCESS!"; fi
+
+clear_files
+
+exit $rc
diff --git a/test/fastdump/test_no_2.sh b/test/fastdump/test_no_2.sh
new file mode 100755
index 0000000..48495de
--- /dev/null
+++ b/test/fastdump/test_no_2.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+ACC="$1"
+SCRATCH="$2"
+THREADS="$3"
+BINDIR="$4"
+
+echo ""
+echo "===== TESTING FASTDUMP: TEST #2 ( output-type = FASTQ )===================="
+echo "accession : $ACC"
+echo "scratch-space at: $SCRATCH"
+echo "parallel threads: $THREADS"
+echo "binaries in : $BINDIR"
+echo ""
+
+FASTDUMP_OUT="$SCRATCH$ACC.fastdump.txt"
+VDB_DUMP_OUT="$SCRATCH$ACC.vdb_dump.txt"
+
+clear_files()
+{
+ CMD="rm -rf $FASTDUMP_OUT $VDB_DUMP_OUT"
+ $CMD 2>&1 > /dev/null
+}
+
+clear_files
+
+#produce the output using the lookup-file
+CMD="$BINDIR/fastdump $ACC -t $SCRATCH -f fastq -o $FASTDUMP_OUT -e $THREADS -p"
+echo "$CMD"
+$CMD
+rc=$?; if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+
+#produce the same output using vdb-dump with internal schema-joins
+CMD="$BINDIR/vdb-dump $ACC -f fastq"
+echo "$CMD"
+$CMD > $VDB_DUMP_OUT
+rc=$?; if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+
+#verify that the output of fastdump via vdb-dump
+CMD="diff $FASTDUMP_OUT $VDB_DUMP_OUT"
+echo "$CMD"
+$CMD 2>&1 > /dev/null
+rc=$?;
+if [[ $rc != 0 ]]; then echo "$CMD failed"; exit $rc; fi
+if [[ $rc == 0 ]]; then echo ">>>SUCCESS!"; fi
+
+clear_files
+
+exit $rc
diff --git a/test/fastq-loader/.gitignore b/test/fastq-loader/.gitignore
new file mode 100644
index 0000000..508061b
--- /dev/null
+++ b/test/fastq-loader/.gitignore
@@ -0,0 +1 @@
+actual
diff --git a/test/fastq-loader/Makefile b/test/fastq-loader/Makefile
new file mode 100644
index 0000000..2cbdd84
--- /dev/null
+++ b/test/fastq-loader/Makefile
@@ -0,0 +1,217 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#TODO: transfer slowtests/big_loads (see CVS)
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/fastq-loader
+
+TEST_TOOLS = \
+ wb-test-fastq \
+ test-fastq-loader
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
+FASTQ_TEST_SRC = \
+ wb-test-fastq
+
+FASTQ_TEST_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQ_TEST_SRC))
+
+FASTQ_TEST_LIB = \
+ -skapp \
+ -sktst \
+ -sfastqloader \
+ -sload \
+ -sncbi-wvdb \
+
+$(TEST_BINDIR)/wb-test-fastq: $(FASTQ_TEST_OBJ)
+ $(LP) --exe -o $@ $^ $(FASTQ_TEST_LIB)
+
+wb: wb-test-fastq
+ $(TEST_BINDIR)/wb-test-fastq 2>&1
+
+#-------------------------------------------------------------------------------
+# test-fastqtest-loader
+#
+FASTQTEST_LOADER_SRC = \
+ test-fastq-loader
+
+FASTQTEST_LOADER_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQTEST_LOADER_SRC))
+
+$(TEST_BINDIR)/test-fastq-loader: $(FASTQTEST_LOADER_OBJ)
+ $(LP) --exe -o $@ $^ $(FASTQ_TEST_LIB)
+
+tfl:
+ $(MAKE) -C $(OBJDIR) -f $(SRCDIR)/Makefile test-fastq-loader
+ $(TEST_BINDIR)/test-fastq-loader
+
+.PHONY: test-fastq-loader
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+runtests: set_schema smalltests
+ rm -v tmp.kfg
+
+set_schema:
+ echo "vdb/schema/paths = \"$(VDB_INCDIR)\"" > tmp.kfg
+
+SMALLRUN = @ export NCBI_SETTINGS=/ ; export VDB_CONFIG=`pwd` ; \
+ $(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)
+smalltests: $(TEST_TOOLS)
+ -rm -rf $(SRCDIR)/actual
+# Small tests
+# Input:
+# Quality encoding: phred/logodds, ascii/decimal
+# 1.1 phred 33
+ $(SMALLRUN) 1.1 0 $(SRCDIR)/input/1.1.fastq --quality PHRED_33
+# 1.2 phred 64
+ $(SMALLRUN) 1.2 0 $(SRCDIR)/input/1.2.fastq --quality PHRED_64
+# 1.3 phred 33, decimal qualities
+ $(SMALLRUN) 1.3 3 $(SRCDIR)/input/1.3.fastq --quality PHRED_33
+# 1.4 logodds 64
+ $(SMALLRUN) 1.4 0 $(SRCDIR)/input/1.4.fastq --quality LOGODDS
+#
+# Single input file
+# 2.1 reads only, basespace
+ $(SMALLRUN) 2.1 0 $(SRCDIR)/input/2.1.fastq --quality PHRED_33
+# 2.1.1 reads only, colorspace
+ $(SMALLRUN) 2.1.1 0 $(SRCDIR)/input/2.1.1.fastq --quality PHRED_33
+# 2.2 qualities only
+ @#-$(SMALLRUN) 2.2 0 $(SRCDIR)/input/2.2.fastq --quality PHRED_33
+# 2.3 reads+qualities, qualities before reads
+ @#-$(SMALLRUN) 2.3 0 $(SRCDIR)/input/2.3.fastq --quality PHRED_33
+# 2.4 reads+qualities, reads before qualities
+ @#-$(SMALLRUN) 2.4 0 $(SRCDIR)/input/2.4.fastq --quality PHRED_33
+# 2.5 reads+qualities, paired up
+ $(SMALLRUN) 2.5 0 $(SRCDIR)/input/2.5.fastq --quality PHRED_33
+# 2.6 spot assembly
+ $(SMALLRUN) 2.6 0 $(SRCDIR)/input/2.6.fastq --quality PHRED_33
+# 2.7 spot assembly, read numbers not specified
+ $(SMALLRUN) 2.7 0 $(SRCDIR)/input/2.7.fastq --quality PHRED_33
+# 2.8 handling of N in reads, ALTREAD is a static column
+# TODO; investigate intermittent failure (FIXED_SPOT_LEN == 0, not 3)
+ @#-$(SMALLRUN) 2.8 0 $(SRCDIR)/input/2.8.fastq --quality PHRED_33
+# 2.8.1 handling of N in reads, ALTREAD is a physical column
+ $(SMALLRUN) 2.8.1 0 $(SRCDIR)/input/2.8.1.fastq --quality PHRED_33
+# 2.9 mismatching length of sequence and quality (qualities shorter)
+ $(SMALLRUN) 2.9 3 $(SRCDIR)/input/2.9.fastq --quality PHRED_33
+# 2.9.1 mismatching length of sequence and quality (qualities longer)
+ $(SMALLRUN) 2.9.1 3 $(SRCDIR)/input/2.9.1.fastq --quality PHRED_33
+#
+# Multiple files
+# 3.1 reads+qualities together
+ $(SMALLRUN) 3.1 0 $(SRCDIR)/input/3.1a.fastq $(SRCDIR)/input/3.1b.fastq --quality PHRED_33
+# 3.2 qualities separately from reads, reads file comes first
+ @#-$(SMALLRUN) 3.2 0 $(SRCDIR)/input/3.2a.fastq $(SRCDIR)/input/3.2b.fastq --quality PHRED_33
+# 3.3 qualities separately from reads, qualities file comes first (reject?)
+ @#-$(SMALLRUN) 3.3 0 $(SRCDIR)/input/3.3a.fastq $(SRCDIR)/input/3.3b.fastq --quality PHRED_33
+# 3.4 default read number
+# $(SMALLRUN) 3.4 0 -r 1 $(SRCDIR)/input/3.4a.fastq -r 2 $(SRCDIR)/input/3.4b.fastq --quality PHRED_33
+#
+# Command line options:
+# 4.1 --tmpfs temporary files created at the specified location
+ @echo "running 4.1"; export NCBI_SETTINGS=/; export VDB_CONFIG=`pwd`; \
+ export LD_LIBRARY_PATH=$(LIBDIR);$(BINDIR)/latf-load \
+ $(SRCDIR)/input/4.fastq --tmpfs $(SRCDIR)/actual/ -v \
+ -o actual/4.1.obj --quality PHRED_33 \
+ | grep "Path for scratch files: $(SRCDIR)/actual/" >/dev/null
+# 4.2 --qual-quant quality values are quantized as specified
+ $(SMALLRUN) 4.2 0 $(SRCDIR)/input/4.fastq --qual-quant 1:10,10:20,20:30,30:- --quality PHRED_33
+# 4.3 --cache-size handled correctly
+ @echo "running 4.3"; export NCBI_SETTINGS=/; export VDB_CONFIG=`pwd`; \
+ export LD_LIBRARY_PATH=$(LIBDIR); \
+ $(BINDIR)/latf-load $(SRCDIR)/input/4.fastq --cache-size 10 -v \
+ -o actual/4.1.obj --quality PHRED_33 \
+ | grep "Cache size: 10M" >/dev/null
+# 4.3.1 --cache-size rejected if invalid
+ $(SMALLRUN) 4.3.1 3 $(SRCDIR)/input/4.fastq --cache-size BIG --quality PHRED_33
+# 4.4 --max-rec-count stops at the specified record #
+ $(SMALLRUN) 4.4 0 $(SRCDIR)/input/4.4.fastq --max-rec-count 3 --quality PHRED_33
+# 4.5 --max-err-count stops after the specified # of errors
+ $(SMALLRUN) 4.5 3 $(SRCDIR)/input/4.5.fastq --max-err-count 2 --quality PHRED_33
+# 4.5.1 --max-err-pct fails if % of error records is too high
+ $(SMALLRUN) 4.5.1 3 $(SRCDIR)/input/4.5.1.fastq --quality PHRED_33 --max-err-count 10 --max-err-pct 20
+# 4.6 --platform saves correct value in the PLATFORM column
+ $(SMALLRUN) 4.6 0 $(SRCDIR)/input/4.fastq -p LS454 --quality PHRED_33
+# 4.6.1 --platform rejects invalid values
+ $(SMALLRUN) 4.6.1 3 $(SRCDIR)/input/4.fastq -p SOMETHINGELSE --quality PHRED_33
+# 4.7 input file missing
+ $(SMALLRUN) 4.7 3 $(SRCDIR)/input/not_there --quality PHRED_33
+# Gzipped input
+ $(SMALLRUN) 5.0 0 $(SRCDIR)/input/5.0.fastq.gz --quality PHRED_33
+# Misparsed quality
+ $(SMALLRUN) 6.0 0 $(SRCDIR)/input/6.0.fastq --quality PHRED_33
+# PACBIO fastq
+ $(SMALLRUN) 7.1 0 $(SRCDIR)/input/7.1.fastq --platform=PACBIO --quality PHRED_33
+ $(SMALLRUN) 7.2 0 $(SRCDIR)/input/7.2.fastq --platform=PACBIO --quality PHRED_33
+ $(SMALLRUN) 7.3 0 $(SRCDIR)/input/7.3.fastq --platform=PACBIO --quality PHRED_33
+# secondary read numbers other than 3
+ $(SMALLRUN) 8.0 0 $(SRCDIR)/input/8.0.fastq --quality PHRED_33
+# reject inconsistent secondary read numbers
+ $(SMALLRUN) 8.1 3 $(SRCDIR)/input/8.1.fastq --quality PHRED_33
+# newest Illumina tag line variation ("_" instead of " /")
+ $(SMALLRUN) 9.0 0 $(SRCDIR)/input/9.0.fastq --quality PHRED_33
+# accepting ascii quality values up to 126
+ $(SMALLRUN) 10.0 0 $(SRCDIR)/input/10.0.fastq --quality PHRED_33
+ # 2-file fasta, tag line Run.Spot.Read
+ $(SMALLRUN) 11.0 0 $(SRCDIR)/input/11.0.1.fasta $(SRCDIR)/input/11.0.2.fasta --quality PHRED_33
+ # 2-file fastq, tag line Run.Spot.Read
+ $(SMALLRUN) 11.1 0 $(SRCDIR)/input/11.1.1.fastq $(SRCDIR)/input/11.1.2.fastq --quality PHRED_33
+ # Illumina, ignore barcodes
+ $(SMALLRUN) 12.0 0 $(SRCDIR)/input/12.0.fastq --quality PHRED_33 --ignore-illumina-tags
+ # Illumina, use barcodes as spotgroups
+ $(SMALLRUN) 12.1 0 $(SRCDIR)/input/12.1.fastq --quality PHRED_33
+ # Illumina, use barcodes as spotgroups, alternative format
+ $(SMALLRUN) 12.2 0 $(SRCDIR)/input/12.2.fastq --quality PHRED_33
+ # Consume our own dog food (13.0.fastq created by fastq-dump )
+ $(SMALLRUN) 13.0 0 $(SRCDIR)/input/13.0.fastq --quality PHRED_33
+ # Consume our own dog food (13.1.fastq created by fastq-dump -F )
+ $(SMALLRUN) 13.1 0 $(SRCDIR)/input/13.1.fastq --quality PHRED_33
+ # SRA-2932: 30 is the preferred value for qualities when reading FASTA
+ $(SMALLRUN) 14.0 0 $(SRCDIR)/input/14.0.fasta $(SRCDIR)/input/14.0.fasta --quality PHRED_33
+ rm -rf $(SRCDIR)/actual
+ # VDB-3154: buffer insufficient
+ $(SMALLRUN) 15.0 0 $(SRCDIR)/input/15.0.fastq --quality PHRED_33
+
+onetest:
+ rm -rf $(SRCDIR)/actual
+ # VDB-3154: buffer insufficient
+ $(SMALLRUN) 15.0 0 $(SRCDIR)/input/15.0.fastq --quality PHRED_33
+
diff --git a/test/fastq-loader/expected/1.1.stdout b/test/fastq-loader/expected/1.1.stdout
new file mode 100644
index 0000000..f4f8914
--- /dev/null
+++ b/test/fastq-loader/expected/1.1.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 5, 13, 27, 22, 22, 19, 22, 23, 23, 23, 24, 24, 24, 23, 22, 22, 21, 22, 22, 21, 25, 24, 24, 22, 24, 22, 19, 18, 20, 19, 22, 22, 19, 22, 22, 24
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/1.2.stdout b/test/fastq-loader/expected/1.2.stdout
new file mode 100644
index 0000000..f5940fb
--- /dev/null
+++ b/test/fastq-loader/expected/1.2.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 25, 25, 22, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/1.3.stderr b/test/fastq-loader/expected/1.3.stderr
new file mode 100644
index 0000000..a40494f
--- /dev/null
+++ b/test/fastq-loader/expected/1.3.stderr
@@ -0,0 +1,4 @@
+latf-load err: file="1.3.fastq"
+latf-load err:Invalid quality value (' '=32, position 2): for Phred33, valid range is from 33 to 126.
+latf-load err: format unsupported while parsing file - accession="obj" errors="1" status="failure"
+latf-load err: format unsupported while parsing file - load failed
diff --git a/test/fastq-loader/expected/1.3.stdout b/test/fastq-loader/expected/1.3.stdout
new file mode 100644
index 0000000..896a550
--- /dev/null
+++ b/test/fastq-loader/expected/1.3.stdout
@@ -0,0 +1,27 @@
+ ALIGNMENT_COUNT: 0, 0
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+ CMP_READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: TT
+ CS_NATIVE: false
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+PRIMARY_ALIGNMENT_ID: 0, 0
+ QUALITY: 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD, SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TMP_KEY_ID: 0
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/1.4.stdout b/test/fastq-loader/expected/1.4.stdout
new file mode 100755
index 0000000..d8883a4
--- /dev/null
+++ b/test/fastq-loader/expected/1.4.stdout
@@ -0,0 +1,90 @@
+ BASE_COUNT: 216
+ BIO_BASE_COUNT: 216
+ CMP_BASE_COUNT: 216
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 131033233331013023032230132132312301331032212003012030012223002013323212
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 72
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 34, 36, 40, 40, 40, 40, 40, 40, 5, 40, 8, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 33, 40, 40, 40, 40, 40, 40, 40, 13, 40, 40, 40, 12, 40, 40, 40, 40, 40, 1, 40, 40, 3, 40
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GCAATAGCGCGTTGCCTAATCTAACGACGATGATTGATGGCTCAGGGCCAGGCCCAGAGCCCTTGCGATCAG
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 36
+ READ_SEG: [0, 36], [36, 36]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 72
+ TRIM_LEN: 72
+ TRIM_START: 0
+
+ BASE_COUNT: 216
+ BIO_BASE_COUNT: 216
+ CMP_BASE_COUNT: 216
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 110003323031230312213200233330230230030231233302133312123321320321233203
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 72
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 27, 40, 40, 40, 40, 40, 14, 24, 40, 40, 9, 2, 4, 40, 32, 12, 40, 13, 3, 3, 2, 40, 4, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 34, 40, 11, 40, 40, 40, 40, 40, 40, 40, 5
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTTTTATCGGCAGCCGTCTGCTTTCGCGCCTAAGCCTAAGCAGCGCCTGCGCAGTCGCTGCTTAGTCGCTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 36
+ READ_SEG: [0, 36], [36, 36]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 72
+ TRIM_LEN: 72
+ TRIM_START: 0
+
+ BASE_COUNT: 216
+ BIO_BASE_COUNT: 216
+ CMP_BASE_COUNT: 216
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 122312131322312131021100002130102223101233212132311133020101010332200312
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 72
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 24, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 15, 21, 40, 40, 40, 40, 40, 40, 40, 10, 40, 27, 40
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GAGCAGTACGAGCAGTACCTGTTTTTCATTGGAGATGGTCGCTGACGATGTGCGGAACCAACCGCTCCCGTC
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 36
+ READ_SEG: [0, 36], [36, 36]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 3
+ SPOT_LEN: 72
+ TRIM_LEN: 72
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/10.0.stdout b/test/fastq-loader/expected/10.0.stdout
new file mode 100644
index 0000000..5b0db4e
--- /dev/null
+++ b/test/fastq-loader/expected/10.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 21
+ BIO_BASE_COUNT: 21
+ CMP_BASE_COUNT: 21
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 21
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 65, 65, 93, 68, 68, 68, 68, 68, 70, 70, 70, 66, 70, 72, 72, 71, 71, 66, 68, 70, 70
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 0
+ READ_SEG: [0, 21], [21, 0]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 21
+ TRIM_LEN: 21
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/11.0.stdout b/test/fastq-loader/expected/11.0.stdout
new file mode 100644
index 0000000..2ecc0d6
--- /dev/null
+++ b/test/fastq-loader/expected/11.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 152
+ BIO_BASE_COUNT: 152
+ CMP_BASE_COUNT: 152
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 12231033031122330010100000000000000000000000000203301033111000111011021301111301123113320231133000013123101102202202000000000000001300011000033112330033
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 152
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 3 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GAGCAATAATGTCTATTTGGTTTTTTTTTTTTTTTTTTTTTTTTTTTCCGCCAATACACCCCACAACAAGTAACACGCCACTACATAGGATGTATTTTTGCAGCAACAAGAAGAAGGGGGGGGGGGGGGGTAAAACAAAAATACAGCGGGCG
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 76, 76
+ READ_SEG: [0, 76], [76, 76]
+ READ_START: 0, 76
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 152
+ TRIM_LEN: 152
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/11.1.stdout b/test/fastq-loader/expected/11.1.stdout
new file mode 100644
index 0000000..bfaeb2a
--- /dev/null
+++ b/test/fastq-loader/expected/11.1.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 202
+ BIO_BASE_COUNT: 202
+ CMP_BASE_COUNT: 202
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 0300232002130023102002201303012112133111010333330332133032020333303000312301230003311300303300333003003002320021300231020022013030121121331110103333303321330320203333030003123012300033113003033003330030
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 202
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 34, 34, 34, 37, 37, 37, 37, 37, 39, 39, 38, 39, 38, 41, 41, 41, 41, 41, 41, 41, 40, 40, 41, 41, 38, 41, 41, 40, 41, 38, 40, 39, 39, 40, 41, 37, 33, 39, 38, 40, 40, 41, 38, 37, 36, 31, 33, 39, 40, 40, 36, 34, 36, 39, 40, 40, 38, 40, 38, 40, 39, 39, 40, 40, 41, 40, 40, 40, 41, 38, 36, 36, 34, 39, 39, 37, 31, 36, 38, 39, 38, 35, 39, 38, 36, 39, 37, 36, 36, 39, 39, 37, 37, 37, 35, 37, 37, 37, 36, 36, 31, 34, 34, 34, 37, 37, 37, 37, 37, 39, 39, 38, 39, 38, 41, 41, 41, 41, 4 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: TAAAGCTTTCATTTCGTTCCCTCCATTAACTGTCATACACCAATATATTATCATAATCCTTATATTAAAATGATTGATTTTATGTAAATTATTTATAAATTTAAAGCTTTCATTTCGTTCCCTCCATTAACTGTCATACACCAATATATTATCATAATCCTTATATTAAAATGATTGATTTTATGTAAATTATTTATAAATT
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 101, 101
+ READ_SEG: [0, 101], [101, 101]
+ READ_START: 0, 101
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 202
+ TRIM_LEN: 202
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/12.0.stdout b/test/fastq-loader/expected/12.0.stdout
new file mode 100644
index 0000000..9ac9d1f
--- /dev/null
+++ b/test/fastq-loader/expected/12.0.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 42
+ BIO_BASE_COUNT: 42
+ CMP_BASE_COUNT: 42
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 21
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 65, 65, 93, 68, 68, 68, 68, 68, 70, 70, 70, 66, 70, 72, 72, 71, 71, 66, 68, 70, 70
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 0
+ READ_SEG: [0, 21], [21, 0]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 21
+ TRIM_LEN: 21
+ TRIM_START: 0
+
+ BASE_COUNT: 42
+ BIO_BASE_COUNT: 42
+ CMP_BASE_COUNT: 42
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 21
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 65, 65, 93, 68, 68, 68, 68, 68, 70, 70, 70, 66, 70, 72, 72, 71, 71, 66, 68, 70, 70
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 0
+ READ_SEG: [0, 21], [21, 0]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 21
+ TRIM_LEN: 21
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/12.1.stdout b/test/fastq-loader/expected/12.1.stdout
new file mode 100644
index 0000000..37ace54
--- /dev/null
+++ b/test/fastq-loader/expected/12.1.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 42
+ BIO_BASE_COUNT: 42
+ CMP_BASE_COUNT: 42
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 21
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 65, 65, 93, 68, 68, 68, 68, 68, 70, 70, 70, 66, 70, 72, 72, 71, 71, 66, 68, 70, 70
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 0
+ READ_SEG: [0, 21], [21, 0]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP: SG1
+ SPOT_ID: 1
+ SPOT_LEN: 21
+ TRIM_LEN: 21
+ TRIM_START: 0
+
+ BASE_COUNT: 42
+ BIO_BASE_COUNT: 42
+ CMP_BASE_COUNT: 42
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 21
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 65, 65, 93, 68, 68, 68, 68, 68, 70, 70, 70, 66, 70, 72, 72, 71, 71, 66, 68, 70, 70
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 0
+ READ_SEG: [0, 21], [21, 0]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP: SG2
+ SPOT_ID: 2
+ SPOT_LEN: 21
+ TRIM_LEN: 21
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/12.2.stdout b/test/fastq-loader/expected/12.2.stdout
new file mode 100644
index 0000000..e3207c8
--- /dev/null
+++ b/test/fastq-loader/expected/12.2.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 42
+ BIO_BASE_COUNT: 42
+ CMP_BASE_COUNT: 42
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 202311120113300010103202311120113300010103
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 42
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CCTACACTTGTATTTTGGTTACCTACACTTGTATTTTGGTTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 21, 21
+ READ_SEG: [0, 21], [21, 21]
+ READ_START: 0, 21
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP: ATCACG
+ SPOT_ID: 1
+ SPOT_LEN: 42
+ TRIM_LEN: 42
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/13.0.stdout b/test/fastq-loader/expected/13.0.stdout
new file mode 100644
index 0000000..1f4dc2b
--- /dev/null
+++ b/test/fastq-loader/expected/13.0.stdout
@@ -0,0 +1,90 @@
+ BASE_COUNT: 798
+ BIO_BASE_COUNT: 798
+ CMP_BASE_COUNT: 798
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 02123011032113003322110220022200103231333121221313323333221121030210103010021013001013213022003000313012103130101022120231301120133013301021030022010303311212103020322101303323213222201312030133023222030132201031220213011122033133303021323002311003110321203331102202000203
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 28, 28, 28, 28, 36, 28, 28, 37, 29, 28, 28, 28, 27, 36, 30, 8, 27, 28, 26, 28, 26, 37, 28, 27, 39, 33, 13, 28, 24, 39, 33, 13, 33, 24, 22, 28, 27, 28, 28, 28, 26, 28, 28, 27, 26, 28, 28, 28, 28, 28, 28, 27, 27, 28, 28, 28, 28, 28, 27, 28, 27, 35, 26, 33, 26, 27, 31, 24, 35, 28, 33, 26, 34, 29, 9, 27, 31, 22, 27, 34, 30, 9, 33, 25, 25, 26, 25, 25, 34, 27, 26, 37, 33, 16, 38, 34, 22, 8, 24, 26, 33, 25, 27, 26, 35, 28, 26, 27, 34, 28, 34, 28, 33, 26, 27, 27, 27, 30, 21, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGCCACCGACATTTATCTGTTCTTTCTCCCAATCGTATACTGAGTACGCTATATCTGTCAATTCAACCGGTTTCAACGGGTTGCTGCCTCCCGGGGCATTGACCGTAACCAAGACTTCGTAACAGGTATTGCGGTTCAATTTCTTGGCCGCACTGACCGGAATCTGGTAATAGCTGCTCTCCATGAATTGCGGATCTCCGGTAGAACCGTCTTCATTGTGAGGCGTATAATTCATCGGGATGTTTACAATCAGGCGCACCTCCTTTTCCG
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 272
+ READ_SEG: [0, 272]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 272
+ TRIM_LEN: 272
+ TRIM_START: 0
+
+ BASE_COUNT: 798
+ BIO_BASE_COUNT: 798
+ CMP_BASE_COUNT: 798
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 0212133120302031103223023130302333331100230101211112020102102023030100111020031210320003031033121131131213113211032000132301322100113002211313331220312000132031302330330022331330202022022002211001010221301221321323012311302113311332101033223110202203011220212312
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 28, 28, 26, 26, 28, 28, 28, 26, 35, 26, 34, 25, 30, 20, 28, 25, 37, 29, 27, 28, 28, 37, 29, 27, 28, 28, 36, 27, 37, 29, 27, 27, 28, 28, 28, 28, 28, 41, 35, 16, 26, 37, 28, 36, 28, 26, 25, 27, 28, 28, 28, 36, 28, 36, 27, 36, 27, 27, 34, 24, 33, 23, 28, 31, 21, 37, 28, 40, 33, 14, 28, 25, 34, 27, 36, 31, 12, 25, 25, 25, 34, 27, 26, 37, 33, 20, 5, 33, 25, 21, 29, 21, 27, 27, 22, 25, 27, 28, 27, 28, 28, 28, 27, 27, 26, 26, 28, 28, 27, 27, 26, 34, 28, 28, 37, 34, 20, 6, 23, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGTATGAATTCCGTGGCTCGGATGCCGGATATATGTTTCGGTTGACACAGGAACCTGGAAGCCGGTTTGTGGAAATGACCGAAAATTACCGCAGTGCACGTCATGTAGTGGCTTTTGCTAACGAGTTTGTAAAGACATGCGCAGAATGAAAACGAATGCCTATTATTTCTATGCGGAAGGAGGAGGGAGTGGGTTGGAGTAACTCATCATCGGTCGTGCCTGTATGTATCAACCGCTCGTGGAAGAATTGTCTTCAGCAG
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 262
+ READ_SEG: [0, 262]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 262
+ TRIM_LEN: 262
+ TRIM_START: 0
+
+ BASE_COUNT: 798
+ BIO_BASE_COUNT: 798
+ CMP_BASE_COUNT: 798
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 021223230310323132313220212100222021223323122220130103132133332013121323122301300232301313201211100211212211223032322123003120303302023102030103111320011332210331020023130202021223113011030132013220123232330313100113321033223312011032123131023010313100003120312200
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 28, 28, 27, 28, 28, 26, 27, 37, 29, 28, 35, 26, 28, 26, 28, 20, 28, 28, 24, 27, 27, 27, 37, 29, 27, 28, 28, 41, 35, 16, 28, 28, 37, 28, 28, 28, 28, 28, 26, 27, 27, 27, 28, 28, 28, 28, 37, 29, 27, 37, 28, 37, 28, 27, 28, 28, 28, 28, 28, 27, 28, 28, 34, 27, 27, 27, 27, 27, 27, 26, 26, 27, 27, 26, 27, 34, 27, 26, 37, 33, 17, 27, 25, 27, 34, 27, 23, 27, 27, 27, 34, 27, 27, 26, 25, 28, 37, 33, 16, 27, 27, 27, 25, 27, 27, 27, 28, 26, 28, 27, 35, 28, 27, 28, 27, 27, 26, 28, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGATCGGCAATCGTAGCATCTTCAGTTTCTCCTGAGCGATGAGAGGTAACCGTAGTATATCCATGACGATGAGCCATTTCGATTGCATCCAGTGTTTCACTGAGTGAGCCGATCTGATTTACTTAATAAGGATGGAATTGGCACATCCCACGCTCAATACCTTTCGTAAGGAAGTCTACATTGTTAACGAACGAGGTCGATCGCCGTACCCACGCTGGCGAGCGTCCACCGACTACGTTCGGTTACGTTTTTACTTACTCCC
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 264
+ READ_SEG: [0, 264]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 3
+ SPOT_LEN: 264
+ TRIM_LEN: 264
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/13.1.stdout b/test/fastq-loader/expected/13.1.stdout
new file mode 100644
index 0000000..fda3e5c
--- /dev/null
+++ b/test/fastq-loader/expected/13.1.stdout
@@ -0,0 +1,90 @@
+ BASE_COUNT: 605
+ BIO_BASE_COUNT: 605
+ CMP_BASE_COUNT: 605
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 021210023002012331130011033133230233111022331010003110311021202310200113011320222330110103222021332332130211230321222111331011200023320310203112311200023320.
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 28, 27, 25, 22, 37, 30, 8, 24, 37, 30, 8, 29, 18, 27, 28, 27, 28, 28, 28, 37, 30, 9, 27, 35, 25, 27, 27, 27, 28, 27, 25, 37, 29, 28, 27, 28, 28, 25, 35, 26, 28, 28, 26, 28, 35, 26, 43, 36, 23, 11, 19, 24, 36, 27, 28, 28, 36, 28, 28, 26, 36, 28, 28, 28, 36, 27, 37, 31, 10, 28, 28, 36, 27, 28, 28, 27, 35, 28, 27, 23, 27, 28, 34, 26, 26, 32, 24, 31, 22, 26, 27, 24, 29, 21, 27, 27, 28, 28, 28, 27, 28, 27, 27, 32, 25, 23, 27, 25, 26, 34, 27, 27, 28, 27, 26, 27, 27, 27, 24, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGTTTCGGGAACTATGTAAACAATACGCTAAGCGTGTTCTATGGTTTTACAATGTTCAGGATGGAAACATTGTAGGAGATAACAACCGAGAAGTATCGCTGCCTGTCGGCTGAGACACGCAACAGGGGATAGGCAAGGCACTACAGGGGATAGGN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 157
+ READ_SEG: [0, 157]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 157
+ TRIM_LEN: 157
+ TRIM_START: 0
+
+ BASE_COUNT: 605
+ BIO_BASE_COUNT: 605
+ CMP_BASE_COUNT: 605
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 0212323113012102000312333011322331202002303323200230312320022301013000022123103113311011103312010311102202032031113210221021002200300012000033000001020130200232210123131000123113210202302102001012123321013310300302131332122130023313123321320021112313200221112022201330102030312122
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 27, 28, 19, 24, 28, 25, 28, 27, 28, 35, 26, 28, 28, 37, 28, 41, 34, 19, 4, 24, 28, 28, 28, 28, 36, 27, 28, 28, 27, 24, 28, 28, 28, 26, 36, 28, 39, 33, 13, 27, 35, 26, 28, 28, 28, 28, 36, 29, 7, 27, 35, 25, 27, 28, 27, 28, 37, 30, 9, 28, 27, 35, 26, 36, 27, 28, 44, 36, 24, 13, 3, 28, 27, 27, 26, 24, 33, 26, 25, 27, 27, 26, 26, 27, 31, 24, 26, 25, 31, 24, 28, 23, 28, 29, 20, 34, 28, 27, 25, 23, 34, 27, 28, 29, 21, 31, 23, 28, 28, 20, 27, 27, 27, 27, 28, 27, 35, 28, 27, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGCTACATTGACCTTTTACTATAACATCTATGAAGGGATTATCGAAAGCCGTCGAAAGATTGGTAAAAAGACTACCGTGCGTGGTGTTATGAACCGTGTTCTTCCGAATGTGCTGGAGTTCAAAGAAATTTTGAAAAATAAAAAACCTTGCCTTTCGAGTTGATGCAAAACTACATCAAGGATTCAAGGGTTGACTATCAACGCAATTTAAGTACGCTGAGTAAAGCGTACTATCATCCCTGTGATGCTTTCTGTGAAGAGGTATTGGAATTACTGAG
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 280
+ READ_SEG: [0, 280]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 280
+ TRIM_LEN: 280
+ TRIM_START: 0
+
+ BASE_COUNT: 605
+ BIO_BASE_COUNT: 605
+ CMP_BASE_COUNT: 605
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 02120000213300010201113302312032021013211123101211131013113313011230110302210130301112310031321011330113021333300113020302202122211133101120002332031020311111200023320.
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 28, 28, 27, 43, 36, 23, 12, 1, 28, 27, 24, 40, 34, 18, 1, 33, 23, 32, 22, 26, 28, 28, 28, 36, 27, 28, 28, 28, 36, 27, 27, 27, 16, 26, 29, 18, 26, 27, 27, 28, 28, 28, 28, 28, 36, 28, 28, 28, 28, 28, 28, 28, 36, 28, 28, 28, 28, 28, 28, 28, 28, 36, 27, 28, 28, 28, 35, 25, 28, 33, 26, 34, 27, 28, 28, 34, 27, 28, 34, 27, 34, 27, 27, 28, 28, 28, 27, 35, 30, 10, 27, 27, 28, 27, 33, 25, 27, 28, 27, 33, 25, 27, 28, 33, 26, 28, 27, 28, 27, 28, 35, 30, 11, 28, 27, 34, 26, 32, 25, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCAGGGGGACGCCCCAAGGTGTATTCGTCCGAAGTTGCTGTGATGGTCACATGGTACATACGGTGATTGTTAAGACCATTAACACTACCCGTAGTTGTATTGTAAGTATATTTGTAAGGCCTCCTGAGACACGCAACAGGGGATAGGCAAGGCACACAGGGGATAGGN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 168
+ READ_SEG: [0, 168]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 3
+ SPOT_LEN: 168
+ TRIM_LEN: 168
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/14.0.stdout b/test/fastq-loader/expected/14.0.stdout
new file mode 100755
index 0000000..822f5e1
--- /dev/null
+++ b/test/fastq-loader/expected/14.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 76
+ BIO_BASE_COUNT: 76
+ CMP_BASE_COUNT: 76
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 1223103303112233001010000000000000000000000000020330103311100011101102130111
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 76
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GAGCAATAATGTCTATTTGGTTTTTTTTTTTTTTTTTTTTTTTTTTTCCGCCAATACACCCCACAACAAGTAACAC
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 76, 0
+ READ_SEG: [0, 76], [76, 0]
+ READ_START: 0, 76
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 76
+ TRIM_LEN: 76
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/15.0.stderr b/test/fastq-loader/expected/15.0.stderr
new file mode 100644
index 0000000..1087173
--- /dev/null
+++ b/test/fastq-loader/expected/15.0.stderr
@@ -0,0 +1 @@
+2016-09-08T19:48:43 vdb-dump.2.7 int: libs/vdb/cast.c:127:cast_num: range excessive while type-casting type within virtual database module - VCursorCellData( col:READ_SEG at row #1 ) failed
diff --git a/test/fastq-loader/expected/15.0.stdout b/test/fastq-loader/expected/15.0.stdout
new file mode 100644
index 0000000..9c47605
--- /dev/null
+++ b/test/fastq-loader/expected/15.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 169455
+ BIO_BASE_COUNT: 169455
+ CMP_BASE_COUNT: 169455
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 12222001333333303313222232200300220131231220012123002222123332333312333100300130333312213233133331322220002333312213230013330222231233031312231233223333323002222233123122133330333312333333310132332201223333101213331233310001222222331222310030013331003002232200120222202333333132231101333302220133312212233331221323332333100132313221022222310131001333333122210131322322322322013233323333331233303333122221322102213333333100122223102333312213030333100133333330333312211001232 [...]
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 169455
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 7, 7, 8, 8, 7, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 7, 8, 5, 4, 4, 4, 5, 4, 4, 4, 6, 5, 4, 4, 5, 6, 6, 4, 5, 4, 5, 5, 6, 7, 7, 6, 4, 6, 4, 4, 5, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 5, 6, 5, 5, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 4, 4, 5, 4, 4, 4, 4, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 6, 5, 4, 5, 5, 4, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GAGAGGGTATATATAATACGAGAGCTCCCGGGAGGTACTACTCCCAGTCGGGAGAGTCGCGATATACTATACCCGGGTAATATACTCATCGCATATACGAGAGGGGATATACTCATCGGGTATAAGAGATGATAATGCAGATGATAGATATATCGGGAGAGATACTACTCATATAATATACTATATATACCATCGCTCCAGATATACCAGTATACTATACCCCAGAGAGATACTCTACCCGGGTATACCCGGGAGCTCCCAGGAGAGGATATATACGAGCACCATATAAGAGGTATACTCAGATATACTCATCGCGATATGGGTAGCATCTGGAGAGATGGTACCCATATATACTCTGGTACGAGCTCGAGCTCCATCGCGATATATACTATAATATACTCTCATCTGGAGTATATATACCCAGAGATGGATATACTCATTAATATGGGTATATATAATATACTCACCCAGCT [...]
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 169455
+ READ_SEG:
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 169455
+ TRIM_LEN: 169455
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.1.1.stdout b/test/fastq-loader/expected/2.1.1.stdout
new file mode 100644
index 0000000..a79501e
--- /dev/null
+++ b/test/fastq-loader/expected/2.1.1.stdout
@@ -0,0 +1,44 @@
+ BASE_COUNT: 12
+ BIO_BASE_COUNT: 12
+ CMP_BASE_COUNT: 12
+ CMP_CSREAD: 123123
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: TT
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0, 0, 0, 0, 0, 0
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 6, 0
+ READ_START: 0, 6
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
+ BASE_COUNT: 12
+ BIO_BASE_COUNT: 12
+ CMP_BASE_COUNT: 12
+ CMP_CSREAD: 123123
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: GT
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0, 0, 0, 0, 0, 0
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 6, 0
+ READ_START: 0, 6
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.1.stdout b/test/fastq-loader/expected/2.1.stdout
new file mode 100644
index 0000000..1d2f84a
--- /dev/null
+++ b/test/fastq-loader/expected/2.1.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 148
+ BIO_BASE_COUNT: 148
+ CMP_BASE_COUNT: 148
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 01020330101302022131302322022022032222311023120230220132002100031300203330
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 74
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: TGGAATAACCATTCCTCATGCCTAGAAGAAGAATCTCTACAAGCAGGATTCTTGCTTTCAAAATGCCCTTATAA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 74, 0
+ READ_SEG: [0, 74], [74, 0]
+ READ_START: 0, 74
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 74
+ TRIM_LEN: 74
+ TRIM_START: 0
+
+ BASE_COUNT: 148
+ BIO_BASE_COUNT: 148
+ CMP_BASE_COUNT: 148
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 00131012333231011230202133203233112022003112203010033321302212200030111213
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 74
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: TTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTA
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 74, 0
+ READ_SEG: [0, 74], [74, 0]
+ READ_START: 0, 74
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 74
+ TRIM_LEN: 74
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.5.stdout b/test/fastq-loader/expected/2.5.stdout
new file mode 100644
index 0000000..908eb8a
--- /dev/null
+++ b/test/fastq-loader/expected/2.5.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 66
+ BIO_BASE_COUNT: 66
+ CMP_BASE_COUNT: 66
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 301212321010213302323201331023331
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 33
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AACTGATCAACCTGCGGATCGAACGCAAGCGCA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 33
+ READ_SEG: [0, 33]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 33
+ TRIM_LEN: 33
+ TRIM_START: 0
+
+ BASE_COUNT: 66
+ BIO_BASE_COUNT: 66
+ CMP_BASE_COUNT: 66
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 311203221313213231002230003322030
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 33
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 33
+ READ_SEG: [0, 33]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 33
+ TRIM_LEN: 33
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.6.stdout b/test/fastq-loader/expected/2.6.stdout
new file mode 100644
index 0000000..44db5d1
--- /dev/null
+++ b/test/fastq-loader/expected/2.6.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 66
+ BIO_BASE_COUNT: 66
+ CMP_BASE_COUNT: 66
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 301212321010213302323201331023331311203221313213231002230003322030
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 66
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: AACTGATCAACCTGCGGATCGAACGCAAGCGCAACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 33, 33
+ READ_SEG: [0, 33], [33, 33]
+ READ_START: 0, 33
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 66
+ TRIM_LEN: 66
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.7.stdout b/test/fastq-loader/expected/2.7.stdout
new file mode 100644
index 0000000..d91d929
--- /dev/null
+++ b/test/fastq-loader/expected/2.7.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 33
+ BIO_BASE_COUNT: 33
+ CMP_BASE_COUNT: 33
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 301212321010213302323201331023331
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 33
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AACTGATCAACCTGCGGATCGAACGCAAGCGCA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 33
+ READ_SEG: [0, 33]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 33
+ TRIM_LEN: 33
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.8.1.stdout b/test/fastq-loader/expected/2.8.1.stdout
new file mode 100644
index 0000000..b35248d
--- /dev/null
+++ b/test/fastq-loader/expected/2.8.1.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 6
+ BIO_BASE_COUNT: 6
+ CMP_BASE_COUNT: 6
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: ..3
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 3
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: NTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 3
+ READ_SEG: [0, 3]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 3
+ TRIM_LEN: 3
+ TRIM_START: 0
+
+ BASE_COUNT: 6
+ BIO_BASE_COUNT: 6
+ CMP_BASE_COUNT: 6
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: ...
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 3
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: NNT
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 3
+ READ_SEG: [0, 3]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 3
+ TRIM_LEN: 3
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.8.stdout b/test/fastq-loader/expected/2.8.stdout
new file mode 100644
index 0000000..51253cd
--- /dev/null
+++ b/test/fastq-loader/expected/2.8.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 6
+ BIO_BASE_COUNT: 6
+ CMP_BASE_COUNT: 6
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: ..3
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 3
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: NTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 3
+ READ_SEG: [0, 3]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 3
+ TRIM_LEN: 3
+ TRIM_START: 0
+
+ BASE_COUNT: 6
+ BIO_BASE_COUNT: 6
+ CMP_BASE_COUNT: 6
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: ..3
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 3
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 30
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: NTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 3
+ READ_SEG: [0, 3]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 3
+ TRIM_LEN: 3
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/2.9.1.stderr b/test/fastq-loader/expected/2.9.1.stderr
new file mode 100644
index 0000000..59530c2
--- /dev/null
+++ b/test/fastq-loader/expected/2.9.1.stderr
@@ -0,0 +1,5 @@
+latf-load err: data inconsistent while reading data within alignment module - Spot 'BILLIEHOLIDAY': length of original quality does not match sequence
+latf-load err: data inconsistent while reading data within alignment module - ArchiveFile: SequenceGetQuality failed
+latf-load warn: The file contained no records that were processed.
+latf-load err: data empty while reading file within alignment module - accession="obj" errors="1" status="failure"
+latf-load err: data empty while reading file within alignment module - load failed
diff --git a/test/fastq-loader/expected/2.9.stderr b/test/fastq-loader/expected/2.9.stderr
new file mode 100644
index 0000000..59530c2
--- /dev/null
+++ b/test/fastq-loader/expected/2.9.stderr
@@ -0,0 +1,5 @@
+latf-load err: data inconsistent while reading data within alignment module - Spot 'BILLIEHOLIDAY': length of original quality does not match sequence
+latf-load err: data inconsistent while reading data within alignment module - ArchiveFile: SequenceGetQuality failed
+latf-load warn: The file contained no records that were processed.
+latf-load err: data empty while reading file within alignment module - accession="obj" errors="1" status="failure"
+latf-load err: data empty while reading file within alignment module - load failed
diff --git a/test/fastq-loader/expected/3.1.stdout b/test/fastq-loader/expected/3.1.stdout
new file mode 100644
index 0000000..fb87b02
--- /dev/null
+++ b/test/fastq-loader/expected/3.1.stdout
@@ -0,0 +1,120 @@
+ BASE_COUNT: 144
+ BIO_BASE_COUNT: 144
+ CMP_BASE_COUNT: 144
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 4
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 36
+ READ_SEG: [0, 36]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 4
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
+ BASE_COUNT: 144
+ BIO_BASE_COUNT: 144
+ CMP_BASE_COUNT: 144
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 122311322021001....32101321......2..
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 4
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GAGCACGAGGACCCANNNATCAACGACNANNNGANN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 36
+ READ_SEG: [0, 36]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 4
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
+ BASE_COUNT: 144
+ BIO_BASE_COUNT: 144
+ CMP_BASE_COUNT: 144
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 312102231132..2..00....12...........
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 4
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ACTGGAGCACGANAGNCCCNCNACTNANANCNGNNN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 36
+ READ_SEG: [0, 36]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 4
+ SPOT_GROUP:
+ SPOT_ID: 3
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
+ BASE_COUNT: 144
+ BIO_BASE_COUNT: 144
+ CMP_BASE_COUNT: 144
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 221022311322201....30030211......3..
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 4
+ MIN_SPOT_ID: 1
+ NAME: 4
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: CTGGAGCACGAGAACNCNGCCCGGACANANGNGCNN
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 36
+ READ_SEG: [0, 36]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 4
+ SPOT_GROUP:
+ SPOT_ID: 4
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/4.2.stdout b/test/fastq-loader/expected/4.2.stdout
new file mode 100644
index 0000000..b4814b9
--- /dev/null
+++ b/test/fastq-loader/expected/4.2.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 1, 10, 20, 20, 20, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 10, 10, 20, 10, 20, 20, 10, 20, 20, 20
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/4.3.1.stderr b/test/fastq-loader/expected/4.3.1.stderr
new file mode 100644
index 0000000..1268b1a
--- /dev/null
+++ b/test/fastq-loader/expected/4.3.1.stderr
@@ -0,0 +1,14 @@
+Usage:
+ latf-load [options] <fastq-file> ...
+
+Summary:
+ Load FASTQ formatted data files
+
+Example:
+ latf-load -p 454 -o SRZ123456 123456-1.fastq 123456-2.fastq
+
+
+Use option --help for more information.
+
+latf-load err: param incorrect while accessing argument list within application support module - accession="obj" errors="0" status="failure"
+latf-load err: param incorrect while accessing argument list within application support module - load failed
diff --git a/test/fastq-loader/expected/4.4.stdout b/test/fastq-loader/expected/4.4.stdout
new file mode 100644
index 0000000..94fbeb5
--- /dev/null
+++ b/test/fastq-loader/expected/4.4.stdout
@@ -0,0 +1,66 @@
+ BASE_COUNT: 105
+ BIO_BASE_COUNT: 105
+ CMP_BASE_COUNT: 105
+ CMP_CSREAD: 12312312312312312312312312312312312
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: GT
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 35, 0
+ READ_START: 0, 35
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
+ BASE_COUNT: 105
+ BIO_BASE_COUNT: 105
+ CMP_BASE_COUNT: 105
+ CMP_CSREAD: 12312312312312312312312312312312312
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: GT
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 35, 0
+ READ_START: 0, 35
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 2
+ TRIM_START: 0
+
+ BASE_COUNT: 105
+ BIO_BASE_COUNT: 105
+ CMP_BASE_COUNT: 105
+ CMP_CSREAD: 12312312312312312312312312312312312
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: GT
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 3
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 35, 0
+ READ_START: 0, 35
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SPOT_COUNT: 3
+ SPOT_GROUP:
+ SPOT_ID: 3
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/4.5.1.stderr b/test/fastq-loader/expected/4.5.1.stderr
new file mode 100644
index 0000000..0cb8caf
--- /dev/null
+++ b/test/fastq-loader/expected/4.5.1.stderr
@@ -0,0 +1,8 @@
+latf-load warn: file="4.5.1.fastq"
+latf-load warn:syntax error, unexpected fqASCQUAL, expecting fqBASESEQ or fqCOLORSEQ
+latf-load warn: file="4.5.1.fastq"
+latf-load warn:syntax error, unexpected fqASCQUAL, expecting fqBASESEQ or fqCOLORSEQ
+latf-load err: data invalid while closing table - Too many bad records: records: 5, bad records: 2, bad records percentage: 0.40, allowed percentage: 0.20
+latf-load warn: path not found while removing directory within database module - table CS_SEQUENCE failed to drop temporary column 'TMP_KEY_ID'
+latf-load err: data invalid while closing table - accession="obj" errors="2" status="failure"
+latf-load err: data invalid while closing table - load failed
diff --git a/test/fastq-loader/expected/4.5.stderr b/test/fastq-loader/expected/4.5.stderr
new file mode 100644
index 0000000..99a8e64
--- /dev/null
+++ b/test/fastq-loader/expected/4.5.stderr
@@ -0,0 +1,9 @@
+latf-load warn: file="4.5.fastq"
+latf-load warn:syntax error, unexpected fqASCQUAL, expecting fqBASESEQ or fqCOLORSEQ
+latf-load warn: file="4.5.fastq"
+latf-load warn:syntax error, unexpected fqASCQUAL, expecting fqBASESEQ or fqCOLORSEQ
+latf-load warn: file="4.5.fastq"
+latf-load warn:syntax error, unexpected fqASCQUAL, expecting fqBASESEQ or fqCOLORSEQ
+latf-load err: error excessive while reading file within alignment module - Number of errors 3 exceeds limit of 2: Exiting
+latf-load err: error excessive while reading file within alignment module - accession="obj" errors="3" status="failure"
+latf-load err: error excessive while reading file within alignment module - load failed
diff --git a/test/fastq-loader/expected/4.6.1.stderr b/test/fastq-loader/expected/4.6.1.stderr
new file mode 100644
index 0000000..1f17349
--- /dev/null
+++ b/test/fastq-loader/expected/4.6.1.stderr
@@ -0,0 +1,3 @@
+latf-load err: param incorrect while accessing argument list within application support module - Invalid platform SOMETHINGELSE
+latf-load err: param incorrect while accessing argument list within application support module - accession="obj" errors="0" status="failure"
+latf-load err: param incorrect while accessing argument list within application support module - load failed
diff --git a/test/fastq-loader/expected/4.6.stdout b/test/fastq-loader/expected/4.6.stdout
new file mode 100644
index 0000000..e23aa0e
--- /dev/null
+++ b/test/fastq-loader/expected/4.6.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_454
+ QUALITY: 5, 13, 27, 22, 22, 19, 22, 23, 23, 23, 24, 24, 24, 23, 22, 22, 21, 22, 22, 21, 25, 24, 24, 22, 24, 22, 19, 18, 20, 19, 22, 22, 19, 22, 22, 24
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/4.7.stderr b/test/fastq-loader/expected/4.7.stderr
new file mode 100644
index 0000000..e89fee5
--- /dev/null
+++ b/test/fastq-loader/expected/4.7.stderr
@@ -0,0 +1,2 @@
+latf-load err: path not found while accessing directory within file system module - accession="obj" errors="0" status="failure"
+latf-load err: path not found while accessing directory within file system module - load failed
diff --git a/test/fastq-loader/expected/5.0.stdout b/test/fastq-loader/expected/5.0.stdout
new file mode 100644
index 0000000..f4f8914
--- /dev/null
+++ b/test/fastq-loader/expected/5.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 36
+ BIO_BASE_COUNT: 36
+ CMP_BASE_COUNT: 36
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 112332022230202..1120022110..03..0..
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 36
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 5, 13, 27, 22, 22, 19, 22, 23, 23, 23, 24, 24, 24, 23, 22, 22, 21, 22, 22, 21, 25, 24, 24, 22, 24, 22, 19, 18, 20, 19, 22, 22, 19, 22, 22, 24
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 36, 0
+ READ_SEG: [0, 36], [36, 0]
+ READ_START: 0, 36
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 36
+ TRIM_LEN: 36
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/6.0.stdout b/test/fastq-loader/expected/6.0.stdout
new file mode 100644
index 0000000..f2a589b
--- /dev/null
+++ b/test/fastq-loader/expected/6.0.stdout
@@ -0,0 +1,390 @@
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 33333113001122113112313102030222133122230321033330003303123012303302102200033003011212211003120000330322030230111230023000331031322331013122211000001112132020113221212022310122001303300031130003321103303120130022220212122000003122200012300330033000311110001103033003330301230033021210033003
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 23, 24, 25, 39, 39, 32, 25, 14, 16, 16, 24, 17, 35, 34, 39, 39, 40, 40, 36, 40, 40, 40, 40, 38, 38, 38, 38, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 32, 24, 20, 20, 20, 18, 32, 23, 27, 36, 39, 39, 38, 40, 40, 40, 40, 38, 36, 36, 32, 39, 35, 26, 22, 16, 16, 16, 16, 26, 14, 14, 14, 32, 32, 35, 33, 38, 40, 40, 40, 40, 36, 35, 35, 34, 34, 25, 25, 25, 25, 25, 40, 22, 22, 35, 40, 39, 39, 40, 40, 40, 35, 35, 35, 38, 40, 35, 20, 20, 21, 28, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ATATACATTTGTCTGTACAGCATGGAATTCTCATACTCTAATCAATATAAAATAATGATTGATTATTCAAGAAAATAAATTGTCAGACAAATGAAAAATAATCTTAAGCCACAGCCCTAAAATACCGTAGATACCATGAGACAAAAAACACTGCTTCCACGAGTCAGGAGCAACTCCCATTATTTTACATTTTATCACCGCCGTCCATTTCTCTTCAGTCTTTTTTACTCTTTTGATTTATTTATTTTACACAAAACAATTATTTATAATTGATTTATTCAGTTTATTTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 290
+ READ_SEG: [0, 290]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 290
+ TRIM_LEN: 290
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 0120230102202301112310113213110012202220220222322023022130220320202112303211020022210222022022021121310130201332031103210011302222010211021210231301020303202212303210211330322111311122200220131133120121202301320220120112212332211222121001
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 37, 37, 36, 36, 36, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 39, 37, 26, 26, 26, 39, 39, 39, 39, 39, 39, 31, 31, 31, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 35, 37, 35, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 35, 35, 30, 25, 25, 24, 24, 33, 20, 21, 21, 25, 28, 32, 33, 35, 35, 35, 35, 35, 35, 30, 30, 30, 35, 35, 32, 28, 28, 25, 25, 25, 25, 25, 24, 27, 28, 28, 29, 29, 28, 30, 27, 1 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TGAAGCCAAGAAGCCACAGCAACATCATGTTTGAGGAGAAGAAGAGCTCCTAAGACGGAGGCTTCCTGTCGGCTGTTCCCTCTGGAGAAGAAGAAGTGACGTTGCCTTGCGAATGTTAGTTTGTAAGAGAACCTGTTCAGTTCGTAACCTTAATCCTCAGCCGACCTGTATTAGACACGTGTCTCCCTCCATGTATGAACTGAAGCCATCCTCCAGGTGAGTCGCTCACTCTGACCCA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 238
+ READ_SEG: [0, 238]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 238
+ TRIM_LEN: 238
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: .
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 3
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: N
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 1
+ READ_SEG: [0, 1]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 3
+ SPOT_LEN: 1
+ TRIM_LEN: 1
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 3233002222000311131011112200120012023120111002313221303322200232101021320113203131113033111022010111033201333100123131330333103123103222323120100123231
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 4
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 39, 40, 40, 28, 28, 28, 36, 33, 39, 29, 29, 29, 29, 36, 36, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 36, 33, 33, 32, 35, 38, 38, 38, 27, 27, 29, 32, 32, 32, 32, 32, 35, 35, 36, 36, 39, 39, 39, 39, 40, 40, 40, 36, 35, 37, 37, 40, 40, 40, 36, 36, 3 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AGCGGGAGAGGGGCACATGGTGTGAGGGTCCCAGGATGAACACCCTACGAGTAATAGAGGGATCAACCTGCTTGTAGGCATGTGCCGCACAAGAACCACAATAGGTATACCCAGCATGCGGCGCAATGATGGCTCTAGCAGGTTTGATCGT
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 151
+ READ_SEG: [0, 151]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 4
+ SPOT_LEN: 151
+ TRIM_LEN: 151
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 20223123320211200021310032023022113211020213231200100101020333313100120232001001121212120333033312111130201212320110020211321111111011101012102302211312210301021213112121103330001222301133102212210100011002111030120223123001130013200000..0000213
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 5
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 26, 26, 26, 26, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 35, 26, 26, 26, 39, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 26, 26, 26, 26, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 4 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: CCTCGTCGCTTCACTTTTCATGGGCTTCGGAGTGCTGTTCCTGCTACTTTGGGTTGGAATATACGTTTGAAGCTTTGGGTGACTGACTTATAATATGACACATTCCAGTCGAACAAAGGACATCACACACAACACCAACTGGATTCTGTACTCAATTGGACTGCACTGACAATATTTTGAGATTGTATGGAGTCTGGTTTTGTTTCACAATTGAAGATGATTTGTAAACGAAAAAANAAAAAGTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 245
+ READ_SEG: [0, 245]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 5
+ SPOT_LEN: 245
+ TRIM_LEN: 245
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: .
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 6
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 0
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: N
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 1
+ READ_SEG: [0, 1]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 6
+ SPOT_LEN: 1
+ TRIM_LEN: 1
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 223200321003103331210230003113330102230133303001022311100130130130131100321130133000012310133313120110010203102331310332111310031021031232200102023210011110102223120033232133321130013221231231102322000101220220002200102131111102333001221113300123201102323233323230223032203330223213323101
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 7
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 39, 39, 39, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 34, 34, 34, 34, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 39, 21, 21, 21, 21, 21, 35, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 38, 38, 38, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 4 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: CTAGGGCTGGGCAATATGACCTAAAATGTATAACCTCGGTATAATTTGGAGCACAAACGGTAACGGTACAAATCACGGTATTTTTGATGGTATACGTCCACCCAAGGCAAGCGTACCGCTGTGCAAATGGACCGTCGAGGGTTCCTAGTTTGTGTTGGAGATGAAATAGCTGCGCTGTAAACGAGTCGTCGTGGATCTTTTGGTCTTCTTTTCTTTGGACGTGTGTTCGCGGGTCTGTGCGGGTCGAACAAGCTAGCGCTAGCCTCGGCTCCGCGGAGCTGCGATGGT
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 288
+ READ_SEG: [0, 288]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 7
+ SPOT_LEN: 288
+ TRIM_LEN: 288
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 312332130330013213131311103130100220330003132112211210312031220331223032033112121022101200020112122023001312220111111111111111111111111111232
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 8
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 39, 39, 40, 40, 40, 40, 40, 40, 40, 39, 39, 38, 37, 35, 35, 35, 35, 32, 32, 21, 21, 18, 25, 24, 32, 33, 24, 25, 25, 26, 35, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 35, 35, 37, 37, 37, 37, 35, 35, 35, 37, 37, 37, 37, 37, 37, 37, 35, 33, 32, 32, 32, 32, 32, 27, 23, 16, 16, 16, 16, 19, 19, 32, 32, 32, 30, 32, 32, 33, 37, 37, 37, 35, 35, 35, 35, 35, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 3 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ACTATCATTATTTGCTGCATGCACAATGCCAAAGAATAAAATGCTGTCTGTCAATGAATGAGGCGTCTAATCCGCACTGACCTCAACTTTTCCACTGAGGATTTGCAGAGGTGTGTGTGTGTGTGTGTGTGTGTGTGTCGA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 141
+ READ_SEG: [0, 141]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 8
+ SPOT_LEN: 141
+ TRIM_LEN: 141
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 3
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 9
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 14
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: A
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 1
+ READ_SEG: [0, 1]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 9
+ SPOT_LEN: 1
+ TRIM_LEN: 1
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 1113102220321220323011002113132101023311102023132320203003331103221213312231022232120110210122020113123200020011332122312101301202210221013202122020003213210102101021102012100330320023102103000110102300112013212333113010003103101221222211022111033003
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 10
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 21, 21, 21, 33, 37, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 35, 35, 35, 34, 37, 33, 31, 30, 29, 29, 19, 17, 17, 17, 13, 13, 13, 14, 12, 19, 18, 22, 22, 25, 24, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GTGCAAGAGGCTGAGGCTAACAAAGTGCATCAACCTATGTGGAAGCATCGAAGGCCCGCGTGGCTCAGTATGAGCAAGAGCTGAACAAGTTGAGGAACATGATCCCCTTTGTATCAGATGACCATTGAAGACCTCAACGAAGTCTTCCCCGACGACCAAGTTGGACAAGGTCAAATAATCCCTACCTGGCCCCACCAAGCCCACTTGCTGATATGTAACCCCGTTACCAGACTCTCACCTCACAATAAAT
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 250
+ READ_SEG: [0, 250]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 10
+ SPOT_LEN: 250
+ TRIM_LEN: 250
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 33311333221321211222302103222110103211322212002132122301203222112123122333113
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 11
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 34, 34, 38, 38, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 38, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ATACATATCTGCTGACAGAGCCTGGCTCTGTTGGCTGTAGAGTCCCTGCTGAGCCAGGCTCTGTCAGCAGATATGTA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 77
+ READ_SEG: [0, 77]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 11
+ SPOT_LEN: 77
+ TRIM_LEN: 77
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 303
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 12
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 16, 16, 16
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AAT
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 3
+ READ_SEG: [0, 3]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 12
+ SPOT_LEN: 3
+ TRIM_LEN: 3
+ TRIM_START: 0
+
+ BASE_COUNT: 1992
+ BIO_BASE_COUNT: 1992
+ CMP_BASE_COUNT: 1992
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 020211001202210203122201033110123121112132313130203112333120312022111011200121221103112021111111201133110022130210220230010312320130210113221001212321320221111102202100010312200222312330200030233002201312320012211123133221111221031312122131320310320002113131112033112211322122113000202200102031111120000233
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 13
+ MIN_SPOT_ID: 1
+ NAME: 13
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 40, 40, 40, 40, 26, 21, 21, 21, 30, 30, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 3 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: TCCTGTTTGAAGACCTTACTCTTGGCGTGGTCGTCACAGTAGCATGCCTTACAGCGCAGGCAGGAGTGTTGTCCCAGTCTGTTACAGGACACACACTTGTATGTTTCTGCCTGGAGGATTTGGCAGCTTGCCTGGTGCTCAAACTGATCATCCTCACACAAGAAGTTTTGGCAGAAAGAGCAGCGGAAAATTCGCCCTCCATGATCCCAGACACTACGCTCACACTCAATGCAGTCTGCATCCGTTAGGGGACATGCACAGGCGTGAGTGCTCAGACATTTTCCTCCCAAGGCACACAGGGGGATA
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 306
+ READ_SEG: [0, 306]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 13
+ SPOT_GROUP:
+ SPOT_ID: 13
+ SPOT_LEN: 306
+ TRIM_LEN: 306
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/7.1.stdout b/test/fastq-loader/expected/7.1.stdout
new file mode 100644
index 0000000..a4158cd
--- /dev/null
+++ b/test/fastq-loader/expected/7.1.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 1025
+ BIO_BASE_COUNT: 1025
+ CMP_BASE_COUNT: 1025
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 32221001232021032212221120133210330331132030111131310212320130231200330232013203300231032110333113001122130311333232301021300200321100002110112231020013122132303310001331220213313321330223331101002002230033013230020231000320033101332123232101011000130130302310102031031213302310210102212222023123212031111210200121222111301020122122023130022031231211000203330131110310000200100212313123101330333110220231213313002301111130012202000333020020223303121301310203312033023110303 [...]
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 43, 43, 71, 69, 29, 29, 29, 29, 58, 58, 39, 39, 67, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 45, 43, 47, 47, 71, 71, 71, 38, 38, 71, 45, 45, 71, 69, 69, 71, 71, 50, 50, 22, 22, 22, 62, 62, 70, 71, 60, 60, 71, 71, 52, 52, 71, 71, 50, 50, 50, 67, 64, 38, 38, 71, 57, 57, 57, 57, 71, 71, 71, 71, 39, 39, 39, 46, 48, 71, 71, 42, 42, 42, 43, 52, 52, 71, 71, 68, 18, 54, 54, 56, 39, 39, 52, 71, 71, 71, 71, 71, 57, 57, 71, 71, 42, 41, 6, 65, 36, 36, 65, 34, 34, 61, 70, 57, 42, 57 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AGAGTTTGATCCTGGCTCAGAGTGAACGCTGGCGGCGTGCTTAACACATGCAAGTCGAACGGATGAAATAAGCTTGCTTATTTCGTTAGTGGCGCACGGGTGAGTAATGTATAGCTAACCTGCCCTTTAGTGGGGGACAACAGATGGAAACGTCTGCTAATACCCCATACTCCTGCGTATCATAAGATATGTTGGGAAAGATTTATTGCTAAAGGATGGGGCTTTATGGTATCAGCTAGTTGGTGGGGTAACGGCCTACCAAGGCAATGACGCCTACCTGGTTCTGAGAGGATGATCAGGCACACTGGAAACTGAGACACGGTTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGGGAAACCCTGATGCAGCAACGCCGCGTGGAGGATGACGCATTTCGGTGTGTAAACTCCTTTTATAAGGGAAGATAATGACGGTACCTTATGAATAAGCACCGGC [...]
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 507
+ READ_SEG: [0, 507]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 507
+ TRIM_LEN: 507
+ TRIM_START: 0
+
+ BASE_COUNT: 1025
+ BIO_BASE_COUNT: 1025
+ CMP_BASE_COUNT: 1025
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 32221001232021032212021320133210330133132030111131310212320132221322231020312100202300020312003220322002110332013001122130133311001301021302331020020203323022300200121002213031302033303311211202123313103200132110300133220301130133202310210033312001303232321010112223301123001101020332132310013010301221222200332013012111121020121222111301201221220231302203123121100020333013331031003101002121331231033103331122112022201000230232313002322211033010002022000002213013100102202 [...]
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 71, 68, 68, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 69, 69, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 48, 48, 71, 70, 70, 71, 71, 71, 71, 71, 71, 71, 51, 51, 71, 71, 63, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 62, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 67, 67, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 21, 21, 21, 21, 23, 71, 71, 71, 53, 53, 53, 71, 71, 71, 71, 71, 71, 53, 53, 53, 71, 71, 59, 59, 71, 71, 71, 71, 71, 28, 28, 28, 71, 71, 71, 7 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: AGAGTTTGATCCTGGCTCAGGACGAACGCTGGCGGTATGCTTAACACATGCAAGTCGAACGAGACGAGATGGAATGACCCTTCGGGGAATGAAATCTTAGAAAGTGGCGAACGGGTGAGTAACGCGTGGGTAACCTGCCTATGGAAAGGAATAGCCTCGGGAAACTGGGAGTAATGCCTTATAATACAGTGAAGTCGCATGGCTTTGCTGTTAAACGCTCCGGTGCCATAGGATGGACCCGCGTCCCATTAGCTAGTTGGTGAGATAACAGCCCACCAAGGCGACGATGGGTAACCGGTCTGAGAGGGCGAACGGTCACACTGGAACTGAGACACGGTCCAGACTCCTACGGAGGCAGCAGTGGGGAATATTGCGCAATGGGCAACCCTGACGCAGCAATACCGCGTGAGTGAAGAGGTTTTCGGATCGTAAAGCTCTGTTATTGGGGAAGAAAAAAGACGGTACCCAAGAAG [...]
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 518
+ READ_SEG: [0, 518]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 518
+ TRIM_LEN: 518
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/7.2.stdout b/test/fastq-loader/expected/7.2.stdout
new file mode 100644
index 0000000..a7a4eff
--- /dev/null
+++ b/test/fastq-loader/expected/7.2.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 1033
+ BIO_BASE_COUNT: 1033
+ CMP_BASE_COUNT: 1033
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 3320110002200110011000000000002310000002200001111110022000011110002112000000110330330022003213300111110000001001320011111100000110000013211101113301100110000012311110110110001110010123000000110000001100011000001110111
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 6, 0, 4, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 5, 0, 0, 1, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 5, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 5, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 1, 0, 0, 2, 8, 0, 1, 0, 0, 4, 0, 0, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: ATCCACCCCTCCCACCCACCCCCCCCCCCCTACCCCCCCTCCCCCACACACCCTCCCCCACACCCCTGTCCCCCCCACCGCCGCCCTCCCGACGCCCACACAAAAAAACCCATCCCACACACCCCCCACCCCCCATCACAACACGCCACCCACCCCCCAGCACACCACCACCCCACAAACCAGCCCCCCCACCCCCCCACCCCACCCCCCACAACAC
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 217
+ READ_SEG: [0, 217]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 217
+ TRIM_LEN: 217
+ TRIM_START: 0
+
+ BASE_COUNT: 1033
+ BIO_BASE_COUNT: 1033
+ CMP_BASE_COUNT: 1033
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 20111100001100101000113030000101011011011010001110003333000110000111100011113301100330110033011101330003213332001001100033330011010100110110003211100110000033110110000000333311033001100011100132133010122010100000000033011001230330000000110123000001100033003223003213030113333003311000123033000012300000000000001111100001010100100011000011001010001101100133011010000110000111010000000111010101000110011011010112201100003300001010003210000101100013311110111000133011000321111 [...]
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0, 4, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 5, 0, 0, 0, 3, 0, 4, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 5, 4, 3, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 6, 0, 0, 0, 1, 0, 0, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 4, 0, 2, 0, 0, 3, 3, 2, 0, 3, 3, 0, 0, 0, 1, 2, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 5, 0, 0, [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: CCACACCCCCACCCAACCCCACGGCCCCCAACCACCACCACCAAAACACCCCGCGCCCCACCCCCACACCCCACACGCCACCCGCCACCCGCCACAACGCCCCGACGCGAAACCCACCCCGCGCCCACCAACCCACCACCCCGACACCCACCCCCCGCACCACCCCCCCCGCGCACCGCCCACCCCACAAACGACGCCAACTCCAACCCCCCCCCCGCCACCCAGCCGCCCCCCCCACCAGCCCCCCACCCCGCCCGAGCCCGACGGCCACGCGCCCGCACCCCAGCCGCCCCCAGCCCCCCCCCCCCCCACACAAAAACCAACCCAAAACAAAAACAAACCAAAACAACAAACGCCACCAAAAACAAAAACACCAAAAAAAACACCAACCAAAACAAACAACAACCACTCCACCCCCGCCCCCAACCCCGACCCCCAACAAAACGCACACCACAAAACGCCACCCCGACACA [...]
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 816
+ READ_SEG: [0, 816]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 816
+ TRIM_LEN: 816
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/7.3.stdout b/test/fastq-loader/expected/7.3.stdout
new file mode 100644
index 0000000..f51b1a6
--- /dev/null
+++ b/test/fastq-loader/expected/7.3.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 1076
+ BIO_BASE_COUNT: 1076
+ CMP_BASE_COUNT: 1076
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 1013222012202312332112220332021212330330022330222013211133333202123102303221202133123222223222022210102222002332020301202110230033301121323222230022311123012302231012212200232222323231012221211111011221332310
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GGTAGAGGTCTTCGTCGCTGTCTCCGCTTCAGTCGCCGCCCTCGCCTCTTGCTGTGCGCGCTTCAGCAAGCCGAGTCCTGCGTCGAGAGATCTCCTCTGGTTCTCTTTCGCTTCCGGTCCTGTTCGGGCGCCACTGCTAGAGATTTCTACACTAACTAAGATGGTCTGAGGGATCTCTAGCTACCAGAGTCACACAACAGACGCTACC
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 208
+ READ_SEG: [0, 208]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 208
+ TRIM_LEN: 208
+ TRIM_START: 0
+
+ BASE_COUNT: 1076
+ BIO_BASE_COUNT: 1076
+ CMP_BASE_COUNT: 1076
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 10021022333303332130220223031222201202222233333322222203300211203322000303033331121333021322123333320232202222131131321312123123331222322023211331233111222311133230222233230101320032111111110130220223302220223212202211222203102222000213332203303332121120201210321221233033211132123133333333303312110333333333332110233311312220332203333303003003331231323222103032103322203231220233221230331212222320013222013022231203300101312232120101101330101303120220231200112201331312003 [...]
+ CS_KEY: T
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 0
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_PACBIO_SMRT
+ QUALITY: 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ: GGGACCTCGCGCCGCGACGGAGGAGCCGTCTCTTGAAGAGAGCGCGCGAGAGAGGCGGGACAGGCGAGGGGCCGGCGCGTGACGCGGACGAGTCGCGCGAAGCTCCTCTCATGTACGACGTCAGCAGCGCAGAGCTCCTAGTGCGTCGCACAGAGCACATAGCCTCTCGCTAACCATCCCGACACACACAACGGAGGAGCGGAGAAGATCAGAAGACAGAGAATGGAGAGGGGACGCGAGGCGGCGCTGACAGGAACTGGCTGAGTCGCCGCTGTGCTGATGCGCGCGCGCCGCAGTGGCGCGCGCGCGCTGTTCGCGTGCAGAGGCGAGGCGCGCCGGGCCCGCGTCGTAGCTCTGGCCGACCGCTCTTAGCAGAAGCGAGTCGGCGTCAGAGATCCCATCTCCATTCTCGTCCGCCCAACGTCTAGTCCAACAACGCCAACGGCAGGAGGATGAAACAGAACGCATGAAAT [...]
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_LEN: 868
+ READ_SEG: [0, 868]
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP:
+ SPOT_ID: 2
+ SPOT_LEN: 868
+ TRIM_LEN: 868
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/8.0.stdout b/test/fastq-loader/expected/8.0.stdout
new file mode 100644
index 0000000..44db5d1
--- /dev/null
+++ b/test/fastq-loader/expected/8.0.stdout
@@ -0,0 +1,30 @@
+ BASE_COUNT: 66
+ BIO_BASE_COUNT: 66
+ CMP_BASE_COUNT: 66
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 301212321010213302323201331023331311203221313213231002230003322030
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 66
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 1
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: AACTGATCAACCTGCGGATCGAACGCAAGCGCAACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 33, 33
+ READ_SEG: [0, 33], [33, 33]
+ READ_START: 0, 33
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 1
+ SPOT_GROUP:
+ SPOT_ID: 1
+ SPOT_LEN: 66
+ TRIM_LEN: 66
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/expected/8.1.stderr b/test/fastq-loader/expected/8.1.stderr
new file mode 100644
index 0000000..3a036e1
--- /dev/null
+++ b/test/fastq-loader/expected/8.1.stderr
@@ -0,0 +1,5 @@
+latf-load err: file="8.1.fastq"
+latf-load err:Inconsistent secondary read number: previously used 3, now seen 2
+latf-load warn: path not found while removing directory within database module - table SEQUENCE failed to drop temporary column 'TMP_KEY_ID'
+latf-load err: format unsupported while parsing file - accession="obj" errors="1" status="failure"
+latf-load err: format unsupported while parsing file - load failed
diff --git a/test/fastq-loader/expected/9.0.stdout b/test/fastq-loader/expected/9.0.stdout
new file mode 100644
index 0000000..498100c
--- /dev/null
+++ b/test/fastq-loader/expected/9.0.stdout
@@ -0,0 +1,60 @@
+ BASE_COUNT: 404
+ BIO_BASE_COUNT: 404
+ CMP_BASE_COUNT: 404
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 2230120003312333000101101303001013310103223001100120023010030322210223120322311200013213102011200203322132132213111122002212110220112212323122012213221002021302221333210033032200312330210133320301210321
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 202
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 1
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 30, 30, 27, 35, 26, 35, 35, 35, 37, 32, 34, 23, 11, 34, 25, 34, 37, 38, 40, 33, 38, 10, 34, 34, 8, 18, 27, 34, 37, 39, 29, 34, 16, 9, 25, 36, 37, 35, 33, 34, 30, 9, 16, 33, 38, 37, 15, 33, 37, 31, 9, 24, 35, 34, 29, 33, 8, 30, 30, 34, 34, 33, 34, 25, 35, 22, 23, 19, 31, 28, 37, 36, 36, 31, 36, 32, 25, 8, 22, 8, 8, 28, 30, 24, 30, 22, 31, 31, 33, 34, 25, 29, 26, 26, 18, 28, 31, 33, 33, 33, 33, 31, 33, 31, 37, 30, 35, 32, 36, 39, 39, 19, 34, 27, 32, 34, 25, 36, 36, 39, 2 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: CTAACTTTTATGATATTTTGGTGGTAATTTGGTATGGTTAGATTTGTTTGAAAGCCAAATTAGAGTTCTACTTAGATGTCCCCATCATGGAACAGGGAATACTGCTGCTCATGTGTCTTTCTGACAAGAACAGACTAGCAGAACTCATCTGGGAAGTAAGAGTATAGTTTATTAGAAATGATAAGTTGCGCTTAACTGGCTG
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 101, 101
+ READ_SEG: [0, 101], [101, 101]
+ READ_START: 0, 101
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP: GATCAG
+ SPOT_ID: 1
+ SPOT_LEN: 202
+ TRIM_LEN: 202
+ TRIM_START: 0
+
+ BASE_COUNT: 404
+ BIO_BASE_COUNT: 404
+ CMP_BASE_COUNT: 404
+CMP_LINKAGE_GROUP:
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CSREAD: 1131131133323131133030331132231121330123331222003300110002133123111202120023213022003330321020211202111300303030011213303300332202121220032020312021032011103132222220220023012002233111002332013120311030
+ CS_KEY: TT
+ CS_NATIVE: false
+ FIXED_SPOT_LEN: 202
+ LINKAGE_GROUP:
+ MAX_SPOT_ID: 2
+ MIN_SPOT_ID: 1
+ NAME: 2
+ PLATFORM: SRA_PLATFORM_UNDEFINED
+ QUALITY: 33, 33, 31, 35, 37, 37, 37, 37, 38, 39, 38, 39, 39, 40, 40, 39, 37, 39, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 40, 38, 40, 41, 41, 39, 39, 40, 41, 41, 37, 36, 40, 39, 40, 37, 40, 37, 34, 35, 36, 38, 39, 40, 40, 41, 40, 41, 40, 41, 37, 38, 40, 40, 37, 40, 39, 38, 40, 40, 41, 41, 38, 40, 40, 41, 41, 40, 40, 38, 41, 40, 40, 40, 38, 38, 36, 39, 40, 41, 39, 39, 39, 37, 39, 38, 39, 37, 37, 37, 37, 37, 37, 31, 33, 34, 37, 37, 37, 37, 37, 39, 39, 39, 39, 39, 39, 40, 38, 38, 4 [...]
+ RD_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ: GTACATGTATAGCATGTATTAATACATCTACAGTATTGATATGAGAAATAAACAAAAGTATGATGTGAAGTCCCTAGTAAGAAATATTAGTTCCTGTCCTGGTAAATTAATTTGTCATAATAAATAGAAGTCAGAAATCCTTACTTCAATCCACAATGCTCTCTCCTCCCTAACTTTCTATGTGGGATAGGTACTTACAATT
+ READ_FILTER: SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS
+ READ_LEN: 101, 101
+ READ_SEG: [0, 101], [101, 101]
+ READ_START: 0, 101
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_BIOLOGICAL
+ SIGNAL_LEN: 0
+ SPOT_COUNT: 2
+ SPOT_GROUP: GATCAG
+ SPOT_ID: 2
+ SPOT_LEN: 202
+ TRIM_LEN: 202
+ TRIM_START: 0
+
diff --git a/test/fastq-loader/input/1.1.fastq b/test/fastq-loader/input/1.1.fastq
new file mode 100644
index 0000000..069381b
--- /dev/null
+++ b/test/fastq-loader/input/1.1.fastq
@@ -0,0 +1,5 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+&.<77478889998776776:997974354774779
+
diff --git a/test/fastq-loader/input/1.2.fastq b/test/fastq-loader/input/1.2.fastq
new file mode 100644
index 0000000..9f7e6b7
--- /dev/null
+++ b/test/fastq-loader/input/1.2.fastq
@@ -0,0 +1,5 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+YYYYYYYYYYYYYYYYPYYVYYYYYYYYYYYYYYYY
+
diff --git a/test/fastq-loader/input/1.3.fastq b/test/fastq-loader/input/1.3.fastq
new file mode 100644
index 0000000..39145e2
--- /dev/null
+++ b/test/fastq-loader/input/1.3.fastq
@@ -0,0 +1,5 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+41 42 43 44 45 46 47 48 49 40 41 42 43 44 45 46 47 48 49 40 41 42 43 44 45 46 47 48 49 40 41 42 43 44 45 46
+
diff --git a/test/fastq-loader/input/1.4.fastq b/test/fastq-loader/input/1.4.fastq
new file mode 100644
index 0000000..371fc95
--- /dev/null
+++ b/test/fastq-loader/input/1.4.fastq
@@ -0,0 +1,24 @@
+ at ID57_120908_30E4FAAXX:3:1:1772:953/1
+GCAATAGCGCGTTGCCTAATCTAACGACGATGATTG
++ID57_120908_30E4FAAXX:3:1:1772:953
+hhhhhhhhhhhhhhhhhhhhhhbdhhhhhhDhGhhh
+ at ID57_120908_30E4FAAXX:3:1:1772:953/2
+ATGGCTCAGGGCCAGGCCCAGAGCCCTTGCGATCAG
++ID57_120908_30E4FAAXX:3:1:1772:953
+hhhhhhhhhhhhhahhhhhhhMhhhLhhhhh<hh at h
+ at ID57_120908_30E4FAAXX:3:1:1590:999/1
+GTTTTATCGGCAGCCGTCTGCTTTCGCGCCTAAGCC
++ID57_120908_30E4FAAXX:3:1:1590:999
+hhhhhhhhhhhhh[hhhhhNXhhH=Ah`LhM??>hB
+ at ID57_120908_30E4FAAXX:3:1:1590:999/2
+TAAGCAGCGCCTGCGCAGTCGCTGCTTAGTCGCTTA
++ID57_120908_30E4FAAXX:3:1:1590:999
+hhhhhhhhhhhhhhhhhhhhhhhhhbhKhhhhhhhC
+ at ID57_120908_30E4FAAXX:3:1:1701:982/1
+GAGCAGTACGAGCAGTACCTGTTTTTCATTGGAGAT
++ID57_120908_30E4FAAXX:3:1:1701:982
+hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXhhh
+ at ID57_120908_30E4FAAXX:3:1:1701:982/2
+GGTCGCTGACGATGTGCGGAACCAACCGCTCCCGTC
++ID57_120908_30E4FAAXX:3:1:1701:982
+hhhhhhhhhhhhhhhhhhhhhhhOUhhhhhhhIh[h
diff --git a/test/fastq-loader/input/10.0.fastq b/test/fastq-loader/input/10.0.fastq
new file mode 100644
index 0000000..e7efa74
--- /dev/null
+++ b/test/fastq-loader/input/10.0.fastq
@@ -0,0 +1,4 @@
+ at HWI-ST1374:1:1101:1161:2060#0/1
+CCTACACTTGTATTTTGGTTA
++HWI-ST1374:1:1101:1161:2060#0/1
+bb~eeeeegggcgiihhcegg
diff --git a/test/fastq-loader/input/11.0.1.fasta b/test/fastq-loader/input/11.0.1.fasta
new file mode 100644
index 0000000..67e5df2
--- /dev/null
+++ b/test/fastq-loader/input/11.0.1.fasta
@@ -0,0 +1,2 @@
+ at SRR390728.1.1
+GAGCAATAATGTCTATTTGGTTTTTTTTTTTTTTTTTTTTTTTTTTTCCGCCAATACACCCCACAACAAGTAACAC
diff --git a/test/fastq-loader/input/11.0.2.fasta b/test/fastq-loader/input/11.0.2.fasta
new file mode 100644
index 0000000..45efbc3
--- /dev/null
+++ b/test/fastq-loader/input/11.0.2.fasta
@@ -0,0 +1,2 @@
+ at SRR390728.1.2
+GCCACTACATAGGATGTATTTTTGCAGCAACAAGAAGAAGGGGGGGGGGGGGGGTAAAACAAAAATACAGCGGGCG
diff --git a/test/fastq-loader/input/11.1.1.fastq b/test/fastq-loader/input/11.1.1.fastq
new file mode 100644
index 0000000..316d9b6
--- /dev/null
+++ b/test/fastq-loader/input/11.1.1.fastq
@@ -0,0 +1,4 @@
+ at SRR493912.15083.1 15083 length=101
+TAAAGCTTTCATTTCGTTCCCTCCATTAACTGTCATACACCAATATATTATCATAATCCTTATATTAAAATGATTGATTTTATGTAAATTATTTATAAATT
++SRR493912.15083.1 15083 length=101
+CCCFFFFFHHGHGJJJJJJJIIJJGJJIJGIHHIJFBHGIIJGFE at BHIIECEHIIGIGIHHIIJIIIJGEECHHF@EGHGDHGEHFEEHHFFFDFFFEE@
\ No newline at end of file
diff --git a/test/fastq-loader/input/11.1.2.fastq b/test/fastq-loader/input/11.1.2.fastq
new file mode 100644
index 0000000..a95e6a4
--- /dev/null
+++ b/test/fastq-loader/input/11.1.2.fastq
@@ -0,0 +1,4 @@
+ at SRR493912.15083.2 15083 length=101
+TAAAGCTTTCATTTCGTTCCCTCCATTAACTGTCATACACCAATATATTATCATAATCCTTATATTAAAATGATTGATTTTATGTAAATTATTTATAAATT
++SRR493912.15083.2 15083 length=101
+CCCFFFFFHHGHGJJJJJJJIIJJGJJIJGIHHIJFBHGIIJGFE at BHIIECEHIIGIGIHHIIJIIIJGEECHHF@EGHGDHGEHFEEHHFFFDFFFEE@
\ No newline at end of file
diff --git a/test/fastq-loader/input/12.0.fastq b/test/fastq-loader/input/12.0.fastq
new file mode 100644
index 0000000..b716dab
--- /dev/null
+++ b/test/fastq-loader/input/12.0.fastq
@@ -0,0 +1,8 @@
+ at HWI-ST1374:1:1101:1161:2060#SG1/1
+CCTACACTTGTATTTTGGTTA
++HWI-ST1374:1:1101:1161:2060#SG1/1
+bb~eeeeegggcgiihhcegg
+ at HWI-ST1375:1:1101:1161:2060#SG2/1
+CCTACACTTGTATTTTGGTTA
++HWI-ST1375:1:1101:1161:2060#SG2/1
+bb~eeeeegggcgiihhcegg
diff --git a/test/fastq-loader/input/12.1.fastq b/test/fastq-loader/input/12.1.fastq
new file mode 100644
index 0000000..b716dab
--- /dev/null
+++ b/test/fastq-loader/input/12.1.fastq
@@ -0,0 +1,8 @@
+ at HWI-ST1374:1:1101:1161:2060#SG1/1
+CCTACACTTGTATTTTGGTTA
++HWI-ST1374:1:1101:1161:2060#SG1/1
+bb~eeeeegggcgiihhcegg
+ at HWI-ST1375:1:1101:1161:2060#SG2/1
+CCTACACTTGTATTTTGGTTA
++HWI-ST1375:1:1101:1161:2060#SG2/1
+bb~eeeeegggcgiihhcegg
diff --git a/test/fastq-loader/input/12.2.fastq b/test/fastq-loader/input/12.2.fastq
new file mode 100644
index 0000000..c040978
--- /dev/null
+++ b/test/fastq-loader/input/12.2.fastq
@@ -0,0 +1,4 @@
+ at HWI-ST1234:33:D1019ACXX:2:1101:1415:2223/1 1:N:0:ATCACG
+CCTACACTTGTATTTTGGTTA
+ at HWI-ST1234:33:D1019ACXX:2:1101:1415:2223/2 2:N:0:ATCACG
+CCTACACTTGTATTTTGGTTA
diff --git a/test/fastq-loader/input/13.0.fastq b/test/fastq-loader/input/13.0.fastq
new file mode 100644
index 0000000..e6b5a3c
--- /dev/null
+++ b/test/fastq-loader/input/13.0.fastq
@@ -0,0 +1,12 @@
+ at SRR000123.10 EXRHO8E16JXOK2 length=272
+TCAGCCACCGACATTTATCTGTTCTTTCTCCCAATCGTATACTGAGTACGCTATATCTGTCAATTCAACCGGTTTCAACGGGTTGCTGCCTCCCGGGGCATTGACCGTAACCAAGACTTCGTAACAGGTATTGCGGTTCAATTTCTTGGCCGCACTGACCGGAATCTGGTAATAGCTGCTCTCCATGAATTGCGGATCTCCGGTAGAACCGTCTTCATTGTGAGGCGTATAATTCATCGGGATGTTTACAATCAGGCGCACCTCCTTTTCCG
++SRR000123.10 EXRHO8E16JXOK2 length=272
+====E==F>===<E?)<=;=;F=<HB.=9HB.B97=<===;==<;======<<=====<=<D;B;<@9D=B;C>*<@7<C?*B::;::C<;FB1GC7)9;B:<;D=;<C=C=B;<<<?6<=<A9;=@7=<A99=D=C<<B;@;$;C=@8 at 88=<;;<:C=B=C==<<C=;C==<<=<<<;==D====C<C=;<C==<;;D=D=9==C<C=;=;B;<;@8=;<<B;==<<<C<C<<<:=FB2<;<FB198B;9<;B;<;==C=<C<GC6(B;1
+ at SRR000123.11 EXRHO8E16JR2D4 length=262
+TCAGTATGAATTCCGTGGCTCGGATGCCGGATATATGTTTCGGTTGACACAGGAACCTGGAAGCCGGTTTGTGGAAATGACCGAAAATTACCGCAGTGCACGTCATGTAGTGGCTTTTGCTAACGAGTTTGTAAAGACATGCGCAGAATGAAAACGAATGCCTATTATTTCTATGCGGAAGGAGGAGGGAGTGGGTTGGAGTAACTCATCATCGGTCGTGCCTGTATGTATCAACCGCTCGTGGAAGAATTGTCTTCAGCAG
++SRR000123.11 EXRHO8E16JR2D4 length=262
+==;;===;D;C:?5=:F><==F><==E<F><<=====JD1;F=E=;:<===E=E<E<<C9B8=@6F=IB/=:C<E at -:::C<;FB5&B:6>6<<7:<=<===<<;;==<<;C==FC5'820>59969C>*=2?;#;54222254<:C;=7EA2"95<3<8B;<;C=4FB2<4<<8;B<=5@;2@;<FB2;9<@<&C=@;<78C=<874;18<;C=27(4,9/:<5<99<3==:0C=<852<:B:>67C<:0:(=?6:7<442
+ at SRR000123.12 EXRHO8E16JYG2J length=264
+TCAGATCGGCAATCGTAGCATCTTCAGTTTCTCCTGAGCGATGAGAGGTAACCGTAGTATATCCATGACGATGAGCCATTTCGATTGCATCCAGTGTTTCACTGAGTGAGCCGATCTGATTTACTTAATAAGGATGGAATTGGCACATCCCACGCTCAATACCTTTCGTAAGGAAGTCTACATTGTTAACGAACGAGGTCGATCGCCGTACCCACGCTGGCGAGCGTCCACCGACTACGTTCGGTTACGTTTTTACTTACTCCC
++SRR000123.12 EXRHO8E16JYG2J length=264
+==<==;<F>=D;=;=5==9<<<F><==JD1==F=====;<<<====F><F=F=<=====<==C<<<<<<;;<<;<C<;FB2<:<C<8<<<C<<;:=FB1<<<:<<<=;=<D=<=<<;=<FB1;=@;;2=B:9/=6;2;2C<?6:999<A=(:)<5<:@8;2B;@;%9=.@;A9A<(5:2<98B=07-8.<:C=7&2B:;<8<<;:B<(<=@;$9-<=<@8<5:<73<C=8C=<<*=<<9A<:C=D=3(2GC8-"94C<569EA.
diff --git a/test/fastq-loader/input/13.1.fastq b/test/fastq-loader/input/13.1.fastq
new file mode 100644
index 0000000..213002e
--- /dev/null
+++ b/test/fastq-loader/input/13.1.fastq
@@ -0,0 +1,12 @@
+ at EXRHO8E16JTGUV
+TCAGTTTCGGGAACTATGTAAACAATACGCTAAGCGTGTTCTATGGTTTTACAATGTTCAGGATGGAAACATTGTAGGAGATAACAACCGAGAAGTATCGCTGCCTGTCGGCTGAGACACGCAACAGGGGATAGGCAAGGCACTACAGGGGATAGGN
++EXRHO8E16JTGUV
+=<:7F?)9F?)>3<=<===F?*<D:<<<=<:F>=<==:D;==;=D;LE8,49E<==E==;E===E<F at +==E<==<D=<8<=C;;A9 at 7;<9>6<<===<=<<A:8<:;C<<=<;<<<9<:=B;88GC6(6<<C==C=C=<=<&<9=GC7):<<B:!
+ at EXRHO8E16JU4WU
+TCAGCTACATTGACCTTTTACTATAACATCTATGAAGGGATTATCGAAAGCCGTCGAAAGATTGGTAAAAAGACTACCGTGCGTGGTGTTATGAACCGTGTTCTTCCGAATGTGCTGGAGTTCAAAGAAATTTTGAAAAATAAAAAACCTTGCCTTTCGAGTTGATGCAAAACTACATCAAGGATTCAAGGGTTGACTATCAACGCAATTTAAGTACGCTGAGTAAAGCGTACTATCATCCCTGTGATGCTTTCTGTGAAGAGGTATTGGAATTACTGAG
++EXRHO8E16JU4WU
+<=49=:=<=D;==F=JC4%9====E<==<9===;E=HB.<D;====E>(<D:<=<=F?*=<D;E<=ME9.$=<<;9B;:<<;;<@9;:@9=8=>5C=<:8C<=>6 at 8==5<<<<=<D=<9D=;FB1;B>)GC7)<HD9/%<HC92+$@:C==C=FB18<=;D==<:<=HD8,3<=<<<<C<D=<C=;C=FB1C=;:<;;<<D=;<:@8FA/C=<<<<=:<:=<9FB2<<<;;;;=<<<<FB0<<<<<==;FB19:<<=C=9:C<29C=C<C<C<<<8<4<
+ at EXRHO8E16JVI1Y
+TCAGGGGGACGCCCCAAGGTGTATTCGTCCGAAGTTGCTGTGATGGTCACATGGTACATACGGTGATTGTTAAGACCATTAACACTACCCGTAGTTGTATTGTAAGTATATTTGTAAGGCCTCCTGAGACACGCAACAGGGGATAGGCAAGGCACACAGGGGATAGGN
++EXRHO8E16JVI1Y
+==<LE8-"=<9IC3"B8A7;===E<===E<<<1;>3;<<=====E=======E========E<===D:=B;C<==C<=C<C<<===<D?+<<=<B:<=<B:<=B;=<=<=D?,=<C;A:B:<?7==<=<<<==<D=<=GC6(:<=C=<C=D===<===HD8+<;=C=!
diff --git a/test/fastq-loader/input/14.0.fasta b/test/fastq-loader/input/14.0.fasta
new file mode 100644
index 0000000..67e5df2
--- /dev/null
+++ b/test/fastq-loader/input/14.0.fasta
@@ -0,0 +1,2 @@
+ at SRR390728.1.1
+GAGCAATAATGTCTATTTGGTTTTTTTTTTTTTTTTTTTTTTTTTTTCCGCCAATACACCCCACAACAAGTAACAC
diff --git a/test/fastq-loader/input/15.0.fastq b/test/fastq-loader/input/15.0.fastq
new file mode 100755
index 0000000..14e9753
--- /dev/null
+++ b/test/fastq-loader/input/15.0.fastq
@@ -0,0 +1,4 @@
+ at acec18be-55b3-42d3-afde-bb1eb13197f2_Basecall_2D_2d
+GAGAGGGTATATATAATACGAGAGCTCCCGGGAGGTACTACTCCCAGTCGGGAGAGTCGCGATATACTATACCCGGGTAATATACTCATCGCATATACGAGAGGGGATATACTCATCGGGTATAAGAGATGATAATGCAGATGATAGATATATCGGGAGAGATACTACTCATATAATATACTATATATACCATCGCTCCAGATATACCAGTATACTATACCCCAGAGAGATACTCTACCCGGGTATACCCGGGAGCTCCCAGGAGAGGATATATACGAGCACCATATAAGAGGTATACTCAGATATACTCATCGCGATATGGGTAGCATCTGGAGAGATGGTACCCATATATACTCTGGTACGAGCTCGAGCTCCATCGCGATATATACTATAATATACTCTCATCTGGAGTATATATACCCAGAGATGGATATACTCATTAATATGGGTATATATAATATACTCACCCAGCTCTACCCGGGTACCGAGAGC [...]
++
+(())(%(%%%%%%%%'%&%%%&%%%%()&%%%&%%%'&%%&''%&%&&'(('%'%%&%&%&%%%%%%%%&%%&%&'&&%%%&%&%%%&%%&%&%&%&%&%%%&&&%%%%%%&&&%%%%%%%%%%&%&%%&%%%%&&&&&%&&&&&&%&&&&&'&%&&%%&%%&%&&&'()''(((&&&&&%'('+*+)*)&&&'%&%&&%%'((%&(&&%%%%%&&'&&))))'%%%&%&&&&%'%%&&'%%%%%%%&%''&&%%%%%%%&&&&&&&&&%&%&%&%%%%%&%%%%%%%&&&&%%&%&%&%&&&%&%&%&&&&%&%%%%%&((&%%&%&&%&&&&%&%&&%%%%%%%%%%%%%%%&%&&'%%%%&%&%&%%%%%%&%%%&%%%%%%%%%%%%%%%%%%%%%%%&%%&&%%%%&&&&'&&&&%&%%%%%%%%%&%&%%%%%%%%%&%&%%%%%%&%&&%%&%%%&&%%%%%%&%%%%&%'%&'%%%%&&%&%&& [...]
diff --git a/test/fastq-loader/input/2.1.1.fastq b/test/fastq-loader/input/2.1.1.fastq
new file mode 100644
index 0000000..ba0f52e
--- /dev/null
+++ b/test/fastq-loader/input/2.1.1.fastq
@@ -0,0 +1,5 @@
+ at R16:8:1:0:875#0/1
+T123123
+ at R16:8:1:0:14#0/1
+G123123
+
diff --git a/test/fastq-loader/input/2.1.fastq b/test/fastq-loader/input/2.1.fastq
new file mode 100644
index 0000000..d3cc85b
--- /dev/null
+++ b/test/fastq-loader/input/2.1.fastq
@@ -0,0 +1,4 @@
+ at R16:8:1:0:875#0/1
+TGGAATAACCATTCCTCATGCCTAGAAGAAGAATCTCTACAAGCAGGATTCTTGCTTTCAAAATGCCCTTATAA
+ at R16:8:1:0:14#0/1
+TTGCAACTATAGCAACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTA
diff --git a/test/fastq-loader/input/2.2.fastq b/test/fastq-loader/input/2.2.fastq
new file mode 100644
index 0000000..9f59a38
--- /dev/null
+++ b/test/fastq-loader/input/2.2.fastq
@@ -0,0 +1,4 @@
+>HWI-EAS6_4_FC2010T:1:1:80:366
+BBBBBBBBBBBBBBBBBBBB
+>HWI-EAS6_4_FC2010T:1:1:212:230
+CCCCCCCCCCCCCCCCCCCC
\ No newline at end of file
diff --git a/test/fastq-loader/input/2.3.fastq b/test/fastq-loader/input/2.3.fastq
new file mode 100644
index 0000000..878d296
--- /dev/null
+++ b/test/fastq-loader/input/2.3.fastq
@@ -0,0 +1,8 @@
+>HWI-EAS6_4_FC2010T:1:1:80:366
+DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+>HWI-EAS6_4_FC2010T:1:1:212:230
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+>HWI-EAS6_4_FC2010T:1:1:80:366
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
+>HWI-EAS6_4_FC2010T:1:1:212:230
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
\ No newline at end of file
diff --git a/test/fastq-loader/input/2.4.fastq b/test/fastq-loader/input/2.4.fastq
new file mode 100644
index 0000000..13816d0
--- /dev/null
+++ b/test/fastq-loader/input/2.4.fastq
@@ -0,0 +1,8 @@
+>HWI-EAS6_4_FC2010T:1:1:80:366
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
+>HWI-EAS6_4_FC2010T:1:1:212:230
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
+>HWI-EAS6_4_FC2010T:1:1:80:366
+DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+>HWI-EAS6_4_FC2010T:1:1:212:230
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
diff --git a/test/fastq-loader/input/2.5.fastq b/test/fastq-loader/input/2.5.fastq
new file mode 100644
index 0000000..28c749a
--- /dev/null
+++ b/test/fastq-loader/input/2.5.fastq
@@ -0,0 +1,9 @@
+ at HWI-EAS6_4_FC2010T:1:1:80:366
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_4_FC2010T:1:1:80:366
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+ at HWI-EAS6_4_FC2010T:1:1:212:230
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_4_FC2010T:1:1:212:230
+DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+
diff --git a/test/fastq-loader/input/2.6.fastq b/test/fastq-loader/input/2.6.fastq
new file mode 100644
index 0000000..ee402b2
--- /dev/null
+++ b/test/fastq-loader/input/2.6.fastq
@@ -0,0 +1,9 @@
+ at HWI-EAS6_4_FC2010T:1:1:80:366/1
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_4_FC2010T:1:1:80:366
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+ at HWI-EAS6_4_FC2010T:1:1:80:366/2
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_4_FC2010T:1:1:212:230
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+
diff --git a/test/fastq-loader/input/2.7.fastq b/test/fastq-loader/input/2.7.fastq
new file mode 100644
index 0000000..70c76bc
--- /dev/null
+++ b/test/fastq-loader/input/2.7.fastq
@@ -0,0 +1,8 @@
+ at HWI-EAS6_4_FC2010T:1:1:80:366
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_4_FC2010T:1:1:80:366
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ at HWI-EAS6_4_FC2010T:1:1:80:366
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_4_FC2010T:1:1:212:230
+GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
diff --git a/test/fastq-loader/input/2.8.1.fastq b/test/fastq-loader/input/2.8.1.fastq
new file mode 100644
index 0000000..2a1cc02
--- /dev/null
+++ b/test/fastq-loader/input/2.8.1.fastq
@@ -0,0 +1,4 @@
+ at GG3IVWD03HJRKK
+NTA
+ at GG3IVWD03HJRKZ
+NNT
diff --git a/test/fastq-loader/input/2.8.fastq b/test/fastq-loader/input/2.8.fastq
new file mode 100644
index 0000000..1384e06
--- /dev/null
+++ b/test/fastq-loader/input/2.8.fastq
@@ -0,0 +1,4 @@
+ at GG3IVWD03HJRKK
+NTA
+ at GG3IVWD03HJRKZ
+NTA
diff --git a/test/fastq-loader/input/2.9.1.fastq b/test/fastq-loader/input/2.9.1.fastq
new file mode 100644
index 0000000..36abd6f
--- /dev/null
+++ b/test/fastq-loader/input/2.9.1.fastq
@@ -0,0 +1,4 @@
+ at BILLIEHOLIDAY
+GTCG
++BILLIEHOLIDAY
+&.&.&.&.
diff --git a/test/fastq-loader/input/2.9.fastq b/test/fastq-loader/input/2.9.fastq
new file mode 100644
index 0000000..b4c6e95
--- /dev/null
+++ b/test/fastq-loader/input/2.9.fastq
@@ -0,0 +1,4 @@
+ at BILLIEHOLIDAY
+GTCG
++BILLIEHOLIDAY
+&.
diff --git a/test/fastq-loader/input/3.1a.fastq b/test/fastq-loader/input/3.1a.fastq
new file mode 100644
index 0000000..260fcb8
--- /dev/null
+++ b/test/fastq-loader/input/3.1a.fastq
@@ -0,0 +1,8 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+GAGCACGAGGACCCANNNATCAACGACNANNNGANN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
diff --git a/test/fastq-loader/input/3.1b.fastq b/test/fastq-loader/input/3.1b.fastq
new file mode 100644
index 0000000..2d0d2b9
--- /dev/null
+++ b/test/fastq-loader/input/3.1b.fastq
@@ -0,0 +1,9 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+ACTGGAGCACGANAGNCCCNCNACTNANANCNGNNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+CTGGAGCACGAGAACNCNGCCCGGACANANGNGCNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
+
diff --git a/test/fastq-loader/input/3.2a.fastq b/test/fastq-loader/input/3.2a.fastq
new file mode 100644
index 0000000..1c6c81d
--- /dev/null
+++ b/test/fastq-loader/input/3.2a.fastq
@@ -0,0 +1,8 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+ACTGGAGCACGANAGNCCCNCNACTNANANCNGNNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+CTGGAGCACGAGAACNCNGCCCGGACANANGNGCNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+GAGCACGAGGACCCANNNATCAACGACNANNNGANN
diff --git a/test/fastq-loader/input/3.2b.fastq b/test/fastq-loader/input/3.2b.fastq
new file mode 100644
index 0000000..166cc59
--- /dev/null
+++ b/test/fastq-loader/input/3.2b.fastq
@@ -0,0 +1,8 @@
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+40 40 40 40 40 27 40 40 12 8 5 6 -5 -3 0 -5 -4 0 4 -5 7 -5 7 1 0 -5 -0 -5 -1 -5 -0 -5 7 -5 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+40 40 40 40 40 40 40 23 40 40 9 22 -2 14 9 -5 7 -5 0 -2 3 9 -1 0 7 3 0 -5 8 -5 -3 -5 10 2 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+40 3 1 22 17 18 34 8 13 21 -3 7 5 0 -0 -5 1 -0 7 3 2 -3 -3 3 -1 -1 4 -5 5 -2 -2 -5 -0 -1 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+40 40 40 40 40 40 40 22 33 40 16 29 4 -1 1 -5 -5 -5 7 -3 1 -1 -1 6 -1 14 -1 -5 -2 -5 -5 -5 6 -1 -5 -5
diff --git a/test/fastq-loader/input/3.3a.fastq b/test/fastq-loader/input/3.3a.fastq
new file mode 100644
index 0000000..166cc59
--- /dev/null
+++ b/test/fastq-loader/input/3.3a.fastq
@@ -0,0 +1,8 @@
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+40 40 40 40 40 27 40 40 12 8 5 6 -5 -3 0 -5 -4 0 4 -5 7 -5 7 1 0 -5 -0 -5 -1 -5 -0 -5 7 -5 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+40 40 40 40 40 40 40 23 40 40 9 22 -2 14 9 -5 7 -5 0 -2 3 9 -1 0 7 3 0 -5 8 -5 -3 -5 10 2 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+40 3 1 22 17 18 34 8 13 21 -3 7 5 0 -0 -5 1 -0 7 3 2 -3 -3 3 -1 -1 4 -5 5 -2 -2 -5 -0 -1 -5 -5
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+40 40 40 40 40 40 40 22 33 40 16 29 4 -1 1 -5 -5 -5 7 -3 1 -1 -1 6 -1 14 -1 -5 -2 -5 -5 -5 6 -1 -5 -5
diff --git a/test/fastq-loader/input/3.3b.fastq b/test/fastq-loader/input/3.3b.fastq
new file mode 100644
index 0000000..1c6c81d
--- /dev/null
+++ b/test/fastq-loader/input/3.3b.fastq
@@ -0,0 +1,8 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:212:211
+ACTGGAGCACGANAGNCCCNCNACTNANANCNGNNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:182:340
+CTGGAGCACGAGAACNCNGCCCGGACANANGNGCNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:118:250
+GAGCACGAGGACCCANNNATCAACGACNANNNGANN
diff --git a/test/fastq-loader/input/4.4.fastq b/test/fastq-loader/input/4.4.fastq
new file mode 100644
index 0000000..f53b4ad
--- /dev/null
+++ b/test/fastq-loader/input/4.4.fastq
@@ -0,0 +1,13 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC21F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC22F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC23F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC24F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC25F3DAAXX:8:2:342:540/1
+G12312312312312312312312312312312312
+
diff --git a/test/fastq-loader/input/4.5.1.fastq b/test/fastq-loader/input/4.5.1.fastq
new file mode 100644
index 0000000..2c5c331
--- /dev/null
+++ b/test/fastq-loader/input/4.5.1.fastq
@@ -0,0 +1,10 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX
+G12312312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC21F3DAAXX
+G12112312312312312312 312312312312312
+ at BILLIEHOLIDAY_1_FC22F3DAAXX
+G1232231231231231231 2312312312312312
+ at BILLIEHOLIDAY_1_FC23F3DAAXX
+G12313312312312312312312312312312312
+ at BILLIEHOLIDAY_1_FC24F3DAAXX
+G12312112312312312312312312312312312
diff --git a/test/fastq-loader/input/4.5.fastq b/test/fastq-loader/input/4.5.fastq
new file mode 100644
index 0000000..3781903
--- /dev/null
+++ b/test/fastq-loader/input/4.5.fastq
@@ -0,0 +1,10 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G1231231231231231 2312312312312312312
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G12112312312312312 312312312312312312
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G123223123123123123 12312312312312312
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G1231331231231231231 2312312312312312
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+G12312112312312312312 312312312312312
diff --git a/test/fastq-loader/input/4.fastq b/test/fastq-loader/input/4.fastq
new file mode 100644
index 0000000..069381b
--- /dev/null
+++ b/test/fastq-loader/input/4.fastq
@@ -0,0 +1,5 @@
+ at BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540/1
+GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN
++BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540
+&.<77478889998776776:997974354774779
+
diff --git a/test/fastq-loader/input/5.0.fastq.gz b/test/fastq-loader/input/5.0.fastq.gz
new file mode 100644
index 0000000..7c236e5
Binary files /dev/null and b/test/fastq-loader/input/5.0.fastq.gz differ
diff --git a/test/fastq-loader/input/6.0.fastq b/test/fastq-loader/input/6.0.fastq
new file mode 100644
index 0000000..1a065e7
--- /dev/null
+++ b/test/fastq-loader/input/6.0.fastq
@@ -0,0 +1,52 @@
+ at GG3IVWD03HJRKK length=290 xy=2978_1730 region=3 run=R_2010_05_11_11_15_22_
+ATATACATTTGTCTGTACAGCATGGAATTCTCATACTCTAATCAATATAAAATAATGATTGATTATTCAAGAAAATAAATTGTCAGACAAATGAAAAATAATCTTAAGCCACAGCCCTAAAATACCGTAGATACCATGAGACAAAAAACACTGCTTCCACGAGTCAGGAGCAACTCCCATTATTTTACATTTTATCACCGCCGTCCATTTCTCTTCAGTCTTTTTTACTCTTTTGATTTATTTATTTTACACAAAACAATTATTTATAATTGATTTATTCAGTTTATTTA
++
+89:HHA:/1192DCHHIIEIIIIGGGGIIIIIIIIIIIIIIIIIIIA95553A8<EHHGIIIIGEEAHD;71111;///AADBGIIIIEDDCC:::::I77DIHHIIIDDDGID556===@@H?IIIIIIIIIIIIIIIIII669997B2BBIIIIIIIIIIIIIIIIIII;;;;;;HIIIE;;;;IDA444482DE>>@<?IGHHI>>>B>IIIGGGGG677722HI1=53117;@B=;//1=8;=:DDCD>>@@G<;>>=BBEIIIIDABB=>9;00750,,,51411
+ at GG3IVWD03GMLDS length=238 xy=2600_2350 region=3 run=R_2010_05_11_11_15_22_
+TGAAGCCAAGAAGCCACAGCAACATCATGTTTGAGGAGAAGAAGAGCTCCTAAGACGGAGGCTTCCTGTCGGCTGTTCCCTCTGGAGAAGAAGAAGTGACGTTGCCTTGCGAATGTTAGTTTGTAAGAGAACCTGTTCAGTTCGTAACCTTAATCCTCAGCCGACCTGTATTAGACACGTGTCTCCCTCCATGTATGAACTGAAGCCATCCTCCAGGTGAGTCGCTCACTCTGACCCA
++
+FFEEEFFFFFFIIIIIIIHF;;;HHHHHH@@@IIIIIIIIIIIIIIIIIDFDFFFFFFFFFFFFFFFFFFFFFFFDD?::99B566:=ABDDDDDD???DDA==:::::9<==>>=?<111187>><<<=>>899>>>900048888<<<<@<888<<<?AA8555::DAAADDDFFFDCCFFFFFC<99<?FFFFDDDACCFD???AADA???AAADFDDDDDDBBB??==772212
+ at GG3IVWD03GFQBB length=1 xy=2522_1637 region=3 run=R_2010_05_11_11_15_22_
+N
++
+!
+ at GG3IVWD03F2Q8L length=151 xy=2374_2515 region=3 run=R_2010_05_11_11_15_22_
+AGCGGGAGAGGGGCACATGGTGTGAGGGTCCCAGGATGAACACCCTACGAGTAATAGAGGGATCAACCTGCTTGTAGGCATGTGCCGCACAAGAACCACAATAGGTATACCCAGCATGCGGCGCAATGATGGCTCTAGCAGGTTTGATCGT
++
+HII===EBH>>>>EEIIIIIIIIIIHHHIHHHIIIIIIIIIIHHHIIIIIIIIIIIIIHHHIIIIIIIIIIIIIIIIIIIIIEBBADGGG<<>AAAAADDEEHHHHIIIEDFFIIIEEEEIGBB===BIIIGED==AAA?/////2:=::8
+ at GG3IVWD03G7J0C length=245 xy=2839_1402 region=3 run=R_2010_05_11_11_15_22_
+CCTCGTCGCTTCACTTTTCATGGGCTTCGGAGTGCTGTTCCTGCTACTTTGGGTTGGAATATACGTTTGAAGCTTTGGGTGACTGACTTATAATATGACACATTCCAGTCGAACAAAGGACATCACACACAACACCAACTGGATTCTGTACTCAATTGGACTGCACTGACAATATTTTGAGATTGTATGGAGTCTGGTTTTGTTTCACAATTGAAGATGATTTGTAAACGAAAAAANAAAAAGTA
++
+IIIIIIIIIIIIII;;;;IIIHHHIIIIIIIIIIIIIIIIIIIIIIIHHHHHHIIIIIIIIIIID;;;HIIIIHHHHHHIIIIIIIIIIIIIIIIIIIIIII;;;;IIIIIIIIHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICCCCIIIIIIIIIIIIIIH@@BBIIIIIIIIDC>>==FB=22---0/,--5=B==@@@EIIEDDD>>>9122229666624!/3333IH8
+ at GG3IVWD03G2V2N length=1 xy=2786_0845 region=3 run=R_2010_05_11_11_15_22_
+N
++
+!
+ at GG3IVWD03HKKWM length=288 xy=2987_2884 region=3 run=R_2010_05_11_11_15_22_
+CTAGGGCTGGGCAATATGACCTAAAATGTATAACCTCGGTATAATTTGGAGCACAAACGGTAACGGTACAAATCACGGTATTTTTGATGGTATACGTCCACCCAAGGCAAGCGTACCGCTGTGCAAATGGACCGTCGAGGGTTCCTAGTTTGTGTTGGAGATGAAATAGCTGCGCTGTAAACGAGTCGTCGTGGATCTTTTGGTCTTCTTTTCTTTGGACGTGTGTTCGCGGGTCTGTGCGGGTCGAACAAGCTAGCGCTAGCCTCGGCTCCGCGGAGCTGCGATGGT
++
+IIIHHHIIHHHIIIIIIIIIIICCCCIIIIIIIIIIIIIIIIIIHHHIIIIIIIHHHIIIIIIIIIIIIHHHIIIIIIIH66666DHIIIIIIIIIIIIIGGGIIIIIIIIIIIIIIIIIIIIIHHHIIIIIIIIIHH;;;??HHIIIHHHIIIIIIIIIIII???IIIIIIIIIIIIHHHIIIIIIIIIIIIIIID><97<95B=52////8///@@EIIIIIIIIIIIHHHIIIIIH??;;;HIIIIIIIIIIIIIIIIIIIIHHHHHHIIIIIIIIIIIIIIIII
+ at GG3IVWD03G0YS1 length=141 xy=2764_1187 region=3 run=R_2010_05_11_11_15_22_
+ACTATCATTATTTGCTGCATGCACAATGCCAAAGAATAAAATGCTGTCTGTCAATGAATGAGGCGTCTAATCCGCACTGACCTCAACTTTTCCACTGAGGATTTGCAGAGGTGTGTGTGTGTGTGTGTGTGTGTGTGTCGA
++
+FFFFFFFFFFFHHIIIIIIIHHGFDDDDAA663:9AB9::;DFFFFFFFFFFFFFFFFFFFCDDFFFFDDDFFFFFFFDBAAAAA<8111144AAA?AABFFFDDDDDFFFFFFFFFFFFFFFFFFFFFFDBA??=6643/
+ at GG3IVWD03FQOVY length=1 xy=2237_0748 region=3 run=R_2010_05_11_11_15_22_
+A
++
+/
+ at GG3IVWD03HD8KU length=250 xy=2915_1884 region=3 run=R_2010_05_11_11_15_22_
+GTGCAAGAGGCTGAGGCTAACAAAGTGCATCAACCTATGTGGAAGCATCGAAGGCCCGCGTGGCTCAGTATGAGCAAGAGCTGAACAAGTTGAGGAACATGATCCCCTTTGTATCAGATGACCATTGAAGACCTCAACGAAGTCTTCCCCGACGACCAAGTTGGACAAGGTCAAATAATCCCTACCTGGCCCCACCAAGCCCACTTGCTGATATGTAACCCCGTTACCAGACTCTCACCTCACAATAAAT
++
+FFFFFFFFFFFIIIIIIIIHH666BFHIIIIIIIIIIIIIIIIIIIIIIIIIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDCFB@?>>4222.../-4377:9777996664223266:666<:333779;222244.3322667;;../426;;44...4//<66357//366.0..415;;=66440449999:?<==AAA7766@>41//14=998=?A at A:9:<>>A;;84
+ at GG3IVWD03GXKBC length=77 xy=2725_2182 region=3 run=R_2010_05_11_11_15_22_
+ATACATATCTGCTGACAGAGCCTGGCTCTGTTGGCTGTAGAGTCCCTGCTGAGCCAGGCTCTGTCAGCAGATATGTA
++
+IIIIIIIIIIIIIIIIIIIHHHHCCGGIIIIIIIIIIIIIIIIHHGHHIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+ at GG3IVWD03HIDOA length=3 xy=2962_2600 region=3 run=R_2010_05_11_11_15_22_
+AAT
++
+111
+ at GG3IVWD03HB687 length=306 xy=2892_1065 region=3 run=R_2010_05_11_11_15_22_
+TCCTGTTTGAAGACCTTACTCTTGGCGTGGTCGTCACAGTAGCATGCCTTACAGCGCAGGCAGGAGTGTTGTCCCAGTCTGTTACAGGACACACACTTGTATGTTTCTGCCTGGAGGATTTGGCAGCTTGCCTGGTGCTCAAACTGATCATCCTCACACAAGAAGTTTTGGCAGAAAGAGCAGCGGAAAATTCGCCCTCCATGATCCCAGACACTACGCTCACACTCAATGCAGTCTGCATCCGTTAGGGGACATGCACAGGCGTGAGTGCTCAGACATTTTCCTCCCAAGGCACACAGGGGGATA
++
+IIII;666??HIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHHHIIIIIIIIIIIIIIIIIIIIIHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIHHHIIIIIIIIIIIIHHHIIIIIIIIIIIIIIIIIIIHHHIIIHHHIHHHHHIIIIIIIIIICCBBIIIII;;;E<EAGGI=;4442@@HE774=7:EEEE?455IIIIIIIIIIIIIIIIIIDCCDDIIIIIIIIIIIIIIIH??>>?DIIIIIIIC????HIIIEA?AB=;=;00--..-333....:=;;;8---//;53
diff --git a/test/fastq-loader/input/7.1.fastq b/test/fastq-loader/input/7.1.fastq
new file mode 100644
index 0000000..d79f3ec
--- /dev/null
+++ b/test/fastq-loader/input/7.1.fastq
@@ -0,0 +1,9 @@
+ at m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19/ccs
+AGAGTTTGATCCTGGCTCAGAGTGAACGCTGGCGGCGTGCTTAACACATGCAAGTCGAACGGATGAAATAAGCTTGCTTATTTCGTTAGTGGCGCACGGGTGAGTAATGTATAGCTAACCTGCCCTTTAGTGGGGGACAACAGATGGAAACGTCTGCTAATACCCCATACTCCTGCGTATCATAAGATATGTTGGGAAAGATTTATTGCTAAAGGATGGGGCTTTATGGTATCAGCTAGTTGGTGGGGTAACGGCCTACCAAGGCAATGACGCCTACCTGGTTCTGAGAGGATGATCAGGCACACTGGAAACTGAGACACGGTTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGGGAAACCCTGATGCAGCAACGCCGCGTGGAGGATGACGCATTTCGGTGTGTAAACTCCTTTTATAAGGGAAGATAATGACGGTACCTTATGAATAAGCACCGGCTAACTCCGTGTCAGCAGCC [...]
++m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19/ccs
+LLhf>>>>[[HHdggghhhhhhhNLPPhhhGGhNNhffhhSS777__gh]]hhUUhhSSSdaGGhZZZZhhhhHHHOQhhKKKLUUhhe3WWYHHUhhhhhZZhhKJ'bEEbCC^gZKZdhhMMM,,,,^fVVAIV]]=<=hhhNNhXXX at hhhEE]_OOOC8988VhHhXEEE_ffQQgeZZHFHUUTThOO222222_aafdhWWW^^hhRHHHh++++hFFF[hUU??BBhcaabhOOMMLNNNNRggXTTUdeh^hbcQTOOffhLLh55bXUXbII%%Whh]]hXUP\hg99hee..cgghhh111\hhhhggG99@,,\_ddKKQPYYhhhhh=67bbgHHahCCCC>??g111hhh\\\88888DFFEQQWW??Xf]EE888[$$IbecceJJfT`hXJR>>WWWYh^gOMRE>>>?hfb>>>>>hVV&&&eehhg^^^hQOTKhUT[LhhhhKZZKKK--SR&&c=111hdEdWWhcdDEdO9+ [...]
+ at m121205_055009_42163_c100416332550000001523041801151327_s1_p0/25/ccs
+AGAGTTTGATCCTGGCTCAGGACGAACGCTGGCGGTATGCTTAACACATGCAAGTCGAACGAGACGAGATGGAATGACCCTTCGGGGAATGAAATCTTAGAAAGTGGCGAACGGGTGAGTAACGCGTGGGTAACCTGCCTATGGAAAGGAATAGCCTCGGGAAACTGGGAGTAATGCCTTATAATACAGTGAAGTCGCATGGCTTTGCTGTTAAACGCTCCGGTGCCATAGGATGGACCCGCGTCCCATTAGCTAGTTGGTGAGATAACAGCCCACCAAGGCGACGATGGGTAACCGGTCTGAGAGGGCGAACGGTCACACTGGAACTGAGACACGGTCCAGACTCCTACGGAGGCAGCAGTGGGGAATATTGCGCAATGGGCAACCCTGACGCAGCAATACCGCGTGAGTGAAGAGGTTTTCGGATCGTAAAGCTCTGTTATTGGGGAAGAAAAAAGACGGTACCCAAGAAGAAAGTCCCGGCTAACTACG [...]
++m121205_055009_42163_c100416332550000001523041801151327_s1_p0/25/ccs
+heehhhhhhhhhhffhhhhhhhhhhhhhhhQQhgghhhhhhhTThh`hhhhhhhhhhhh_hhhhhhhhhhddhhhhhhhhhhh66668hhhVVVhhhhhhVVVhh\\hhhhh===hhhhhhhhhhhhhbfhhhhhhh333hhhhhhhddhhhhhggghhhhhhhhhZZZhhhhhhh;;ffhhhhhhhhhhh+$%%hhhhhffh]]]]hhhhhhhhhZZggghhhh__ghhgghhhhhdddhZZh999hhhh^^hhh__fghhhhhhhhhhhKKKd00cc==hhhhhhhbbbhhheehehhhhhhhHHHehhhhhhhhhfhhhhUhhhhhhhhhhe??hbbchhhhhhhhh333^^ffhhhhh////gghh44hhhhhhh....ggVVUhhhhhhhYMNchhhbedhhhhhhh==a'&0CCCChhhhhehh]]]]hhhhhggghhFFFFhh^HHHHHHhhMMghhMMMNNhddhDDDhgAAAQQ``hhhhhhh [...]
+
diff --git a/test/fastq-loader/input/7.2.fastq b/test/fastq-loader/input/7.2.fastq
new file mode 100644
index 0000000..6f07408
--- /dev/null
+++ b/test/fastq-loader/input/7.2.fastq
@@ -0,0 +1,8 @@
+ at m101111_134728_richard_c000027022550000000115022502211150_s1_p0/1
+ATCCACCCCTCCCACCCACCCCCCCCCCCCTACCCCCCCTCCCCCACACACCCTCCCCCACACCCCTGTCCCCCCCACCGCCGCCCTCCCGACGCCCACACAAAAAAACCCATCCCACACACCCCCCACCCCCCATCACAACACGCCACCCACCCCCCAGCACACCACCACCCCACAAACCAGCCCCCCCACCCCCCCACCCCACCCCCCACAACAC
++
+'!%!%#!!!!!!%"!!!$"!!!!!!!!!!#""!!!!$!!!#!!!!!!!!!!!!!!$#!"!!!!!!!!!!$'!!!#"!!!!!&!!"$!!!$!!!!!%!!&!!!!!!!!$!!&!%!"!!!!!!&!!$!!#!!!!$!!!!!&!!!!&!!"!!#)!"!!%!!!!!"%!!!"!"!"!!&!)!!#!!!!"$!!!!&!!%!!"!'!!!!$"!!"$!!!!!!!!"
+ at m101111_134728_richard_c000027022550000000115022502211150_s1_p0/2
+CCACACCCCCACCCAACCCCACGGCCCCCAACCACCACCACCAAAACACCCCGCGCCCCACCCCCACACCCCACACGCCACCCGCCACCCGCCACAACGCCCCGACGCGAAACCCACCCCGCGCCCACCAACCCACCACCCCGACACCCACCCCCCGCACCACCCCCCCCGCGCACCGCCCACCCCACAAACGACGCCAACTCCAACCCCCCCCCCGCCACCCAGCCGCCCCCCCCACCAGCCCCCCACCCCGCCCGAGCCCGACGGCCACGCGCCCGCACCCCAGCCGCCCCCAGCCCCCCCCCCCCCCACACAAAAACCAACCCAAAACAAAAACAAACCAAAACAACAAACGCCACCAAAAACAAAAACACCAAAAAAAACACCAACCAAAACAAACAACAACCACTCCACCCCCGCCCCCAACCCCGACCCCCAACAAAACGCACACCACAAAACGCCACCCCGACACACCACGCGCAGCCCCACACA [...]
++
+#!!$!"!!!!!""#!%!#!!!!!$!!!!&!!!$!%$!!!#!!!!!!!"&%$!!!#"!!!!!!%#!"!!!!!!!!!!!!!!!!!!!!!!!&!!'!!!"!!#!!""##!!"!!!!!!#!!!#%!#!!$$#!$$!!!"#"!!$!!!!!!!!#!!!!!$&!!&!$"!!!(!!!!"!!!!!!!!!!"#!!(&!!!!&!'$!!!!$%!!!!!!!!!!!!!!!!!!!!!!!'!!!!!!!!"!!!!#&!!!!!!!!!!!!!!&!#!!!!!!!!!!!"!!!"!$!!#!"!'%!#(!!%!#"!$!'!!!!!"!$""#!!!!"!!!%!!!!!%%!#!!!!$#!!!$!!!"!!!!!!$!!$!!!#"!!!!!!!"!!!!!!!!!!!!!!!!!!!!!#!!!"!!!$!!#"'!"!"'%!!!!!!!#!&!"!!!!!)!!!!!"**!!#!!!!&!!#!!!!"!#!!!!!!!!!!!%%!!!"!!!!(!!!!!!!!!!!!!%!#!!#&'!& [...]
diff --git a/test/fastq-loader/input/7.3.fastq b/test/fastq-loader/input/7.3.fastq
new file mode 100644
index 0000000..2b47bed
--- /dev/null
+++ b/test/fastq-loader/input/7.3.fastq
@@ -0,0 +1,8 @@
+ at m101210_094054_00126_c000028442550000000115022402181134_s1_p0/2 ccs
+GGTAGAGGTCTTCGTCGCTGTCTCCGCTTCAGTCGCCGCCCTCGCCTCTTGCTGTGCGCGCTTCAGCAAGCCGAGTCCTGCGTCGAGAGATCTCCTCTGGTTCTCTTTCGCTTCCGGTCCTGTTCGGGCGCCACTGCTAGAGATTTCTACACTAACTAAGATGGTCTGAGGGATCTCTAGCTACCAGAGTCACACAACAGACGCTACC
++m101210_094054_00126_c000028442550000000115022402181134_s1_p0/2 ccs
+5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
+ at m101210_094054_00126_c000028442550000000115022402181134_s1_p0/3 ccs
+GGGACCTCGCGCCGCGACGGAGGAGCCGTCTCTTGAAGAGAGCGCGCGAGAGAGGCGGGACAGGCGAGGGGCCGGCGCGTGACGCGGACGAGTCGCGCGAAGCTCCTCTCATGTACGACGTCAGCAGCGCAGAGCTCCTAGTGCGTCGCACAGAGCACATAGCCTCTCGCTAACCATCCCGACACACACAACGGAGGAGCGGAGAAGATCAGAAGACAGAGAATGGAGAGGGGACGCGAGGCGGCGCTGACAGGAACTGGCTGAGTCGCCGCTGTGCTGATGCGCGCGCGCCGCAGTGGCGCGCGCGCGCTGTTCGCGTGCAGAGGCGAGGCGCGCCGGGCCCGCGTCGTAGCTCTGGCCGACCGCTCTTAGCAGAAGCGAGTCGGCGTCAGAGATCCCATCTCCATTCTCGTCCGCCCAACGTCTAGTCCAACAACGCCAACGGCAGGAGGATGAAACAGAACGCATGAAATGATCGCGTGATGCGGACGA [...]
++m101210_094054_00126_c000028442550000000115022402181134_s1_p0/3 ccs
+555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 [...]
diff --git a/test/fastq-loader/input/8.0.fastq b/test/fastq-loader/input/8.0.fastq
new file mode 100644
index 0000000..2e3c64e
--- /dev/null
+++ b/test/fastq-loader/input/8.0.fastq
@@ -0,0 +1,9 @@
+ at HWI-EAS6_4_FC2010T:1:1:80:366/1
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_4_FC2010T:1:1:80:366
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+ at HWI-EAS6_4_FC2010T:1:1:80:366/3
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_4_FC2010T:1:1:212:230
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+
diff --git a/test/fastq-loader/input/8.1.fastq b/test/fastq-loader/input/8.1.fastq
new file mode 100644
index 0000000..92c872b
--- /dev/null
+++ b/test/fastq-loader/input/8.1.fastq
@@ -0,0 +1,17 @@
+ at HWI-EAS6_4_FC2010T:1:1:80:366/1
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_4_FC2010T:1:1:80:366
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+ at HWI-EAS6_4_FC2010T:1:1:80:366/3
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_4_FC2010T:1:1:212:230
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ at HWI-EAS6_5_FC2010T:1:1:80:366/1
+AACTGATCAACCTGCGGATCGAACGCAAGCGCA
++HWI-EAS6_5_FC2010T:1:1:80:366
+EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+ at HWI-EAS6_5_FC2010T:1:1:80:366/2
+ACAGGCTCATGCTGCTACCCTCGGGGCGAGGCC
++HWI-EAS6_5_FC2010T:1:1:212:230
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+
diff --git a/test/fastq-loader/input/9.0.fastq b/test/fastq-loader/input/9.0.fastq
new file mode 100644
index 0000000..5e3ded4
--- /dev/null
+++ b/test/fastq-loader/input/9.0.fastq
@@ -0,0 +1,16 @@
+ at DG7PMJN1:293:D12THACXX:2:1101:1161:1968_1:N:0:GATCAG
+CTAACTTTTATGATATTTTGGTGGTAATTTGGTATGGTTAGATTTGTTTGAAAGCCAAATTAGAGTTCTACTTAGATGTCCCCATCATGGAACAGGGAATA
++
+??<D;DDDFAC8,C:CFGIBG+CC)3<CFH>C1*:EFDBC?*1BGF0BF@*9DC>B)??CCBC:D784@=FEE at EA:)7))=?9?7@@BC:>;;3=@BBBB
+ at DG7PMJN1:293:D12THACXX:2:1101:1275:1946_1:N:0:GATCAG
+GTACATGTATAGCATGTATTAATACATCTACAGTATTGATATGAGAAATAAACAAAAGTATGATGTGAAGTCCCTAGTAAGAAATATTAGTTCCTGTCCTG
++
+BB at DFFFFGHGHHIIHFHIIIJJJJJJJIGIJJHHIJJFEIHIFIFCDEGHIIJIJIJFGIIFIHGIIJJGIIJJIIGJIIIGGEHIJHHHFHGHFFFFFF
+ at DG7PMJN1:293:D12THACXX:2:1101:1161:1968_2:N:0:GATCAG
+CTGCTGCTCATGTGTCTTTCTGACAAGAACAGACTAGCAGAACTCATCTGGGAAGTAAGAGTATAGTTTATTAGAAATGATAAGTTGCGCTTAACTGGCTG
++
+ at B@F?DAEHH4C<AC:EEH>CIFHIGGG>EGGHCFEGGGGCEGHIJJGGGGEBGIHG>?FHB<E<C at EGGGEGIF>HAGGEFCHH?E3593>@ACCDCBC?
+ at DG7PMJN1:293:D12THACXX:2:1101:1275:1946_2:N:0:GATCAG
+GTAAATTAATTTGTCATAATAAATAGAAGTCAGAAATCCTTACTTCAATCCACAATGCTCTCTCCTCCCTAACTTTCTATGTGGGATAGGTACTTACAATT
++
+ at BCFFFFFHHHHHHIGGIIJJIIJJIJIJHGIHIIIJGGHIGHIIJJIJGIIJJJJJJJJJJIJGIJJIJIHJJJJJJIJIEHGHCEFDFFFEEFEEEDDD
diff --git a/test/fastq-loader/runtestcase.sh b/test/fastq-loader/runtestcase.sh
new file mode 100755
index 0000000..d5e4a98
--- /dev/null
+++ b/test/fastq-loader/runtestcase.sh
@@ -0,0 +1,106 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# $1 - path to vdb tools (fastq-load.3, vdb-dump)
+# $2 - work directory (expected results under expected/, actual results and temporaries created under actual/)
+# $3 - test case ID
+# $3 - expected result code from fastq-load.3
+# $4, $5, ... - command line options for fastq-load.3
+#
+# return codes:
+# 0 - passed
+# 1 - coud not create temp dir
+# 2 - unexpected return code from fastq-load.3
+# 3 - vdb-dump failed on the output of fastq-load.3
+# 4 - outputs differ
+
+BINDIR=$1
+WORKDIR=$2
+CASEID=$3
+RC=$4
+shift 4
+CMDLINE=$*
+
+DUMP="$BINDIR/vdb-dump"
+LOAD="$BINDIR/latf-load"
+TEMPDIR=$WORKDIR/actual/$CASEID
+
+echo "running $CASEID"
+
+mkdir -p $TEMPDIR
+rm -rf $TEMPDIR/*
+if [ "$?" != "0" ] ; then
+ exit 1
+fi
+export LD_LIBRARY_PATH=$BINDIR/../lib;
+
+#CMD="$LOAD $CMDLINE -o $TEMPDIR/obj --no-user-settings 1>$TEMPDIR/load.stdout 2>$TEMPDIR/load.stderr"
+CMD="$LOAD $CMDLINE -o $TEMPDIR/obj 1>$TEMPDIR/load.stdout 2>$TEMPDIR/load.stderr"
+# echo $CMD
+eval $CMD
+rc="$?"
+if [ "$rc" != "$RC" ] ; then
+ echo "$LOAD returned $rc, expected $RC"
+ echo "command executed:"
+ echo $CMD
+ cat $TEMPDIR/load.stderr
+ exit 2
+fi
+
+if [ "$rc" == "0" ] ; then
+ CMD="$DUMP $TEMPDIR/obj 1>$TEMPDIR/dump.stdout 2>$TEMPDIR/dump.stderr"
+ eval $CMD
+ rc="$?"
+ if [ "$rc" != "0" ] ; then
+ echo "command executed:"
+ echo $CMD
+ cat $TEMPDIR/dump.stderr
+ exit 3
+ fi
+ diff $WORKDIR/expected/$CASEID.stdout $TEMPDIR/dump.stdout >$TEMPDIR/diff
+ rc="$?"
+else # load failed as expected
+ # remove timestamps
+ sed -i -e 's/^....-..-..T..:..:.. //g' $TEMPDIR/load.stderr
+ # remove pathnames
+ sed -i -e 's=/.*/==g' $TEMPDIR/load.stderr
+ # remove source locations
+ sed -i -e 's=: .*:[0-9]*:[^ ]*:=:=g' $TEMPDIR/load.stderr
+ # remove version number
+ sed -i -e 's=latf-load\(\.[0-9]*\)*=latf-load=g' $TEMPDIR/load.stderr
+ diff $WORKDIR/expected/$CASEID.stderr $TEMPDIR/load.stderr >$TEMPDIR/diff
+ rc="$?"
+fi
+if [ "$rc" != "0" ] ; then
+ cat $TEMPDIR/diff
+ echo "command executed:"
+ echo $CMD
+ exit 4
+fi
+
+#rm -rf $TEMPDIR
+
+exit 0
diff --git a/test/fastq-loader/test-fastq-loader.cpp b/test/fastq-loader/test-fastq-loader.cpp
new file mode 100644
index 0000000..82e0dca
--- /dev/null
+++ b/test/fastq-loader/test-fastq-loader.cpp
@@ -0,0 +1,229 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Long-running tests for ReaderFile-related interfaces
+*/
+
+#include <cstring>
+#include <ctime>
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/out.h>
+
+#include <kapp/args.h>
+
+#include <kfs/directory.h>
+#include <kfs/impl.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/schema.h>
+
+extern "C" {
+#include <loader/common-reader.h>
+#include <loader/common-writer.h>
+#include <loader/sequence-writer.h>
+#include <loader/alignment-writer.h>
+#include "../../tools/fastq-loader/fastq-reader.h"
+#include "../../tools/fastq-loader/fastq-parse.h"
+}
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(LoaderFastqTestSuite);
+
+///////////////////////////////////////////////// tests for loading FASTQ files
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+class TempFileFixture
+{
+public:
+ static const string TempDir;
+ static const string SchemaPath;
+ static const string DbType;
+
+public:
+ TempFileFixture()
+ : wd(0), rf(0)
+ {
+ if ( KDirectoryNativeDir ( & wd ) != 0 )
+ FAIL("KDirectoryNativeDir failed");
+
+ if ( VDBManagerMakeUpdate ( & mgr, wd ) != 0)
+ FAIL("VDBManagerMakeUpdate failed");
+
+ if ( VDBManagerMakeSchema ( mgr, & schema ) != 0 )
+ FAIL("VDBManagerMakeSchema failed");
+ if ( VSchemaParseFile( schema, SchemaPath.c_str() ) != 0 )
+ FAIL("VSchemaParseFile failed");
+
+ if ( KDirectoryCreateDir_v1 ( wd, 0775, kcmOpen | kcmInit | kcmCreate, TempDir.c_str() ) != 0 )
+ FAIL("KDirectoryOpenDirUpdate_v1 failed");
+ }
+ ~TempFileFixture()
+ {
+ if ( rf != 0 && ReaderFileRelease( rf ) != 0)
+ FAIL("ReaderFileRelease failed");
+
+ if ( schema && VSchemaRelease(schema) != 0 )
+ FAIL("VSchemaRelease failed");
+ if ( db && VDatabaseRelease(db) != 0 )
+ FAIL("VDatabaseRelease failed");
+ if ( mgr && VDBManagerRelease(mgr) != 0 )
+ FAIL("VDBManagerRelease failed");
+
+ if ( wd && ! filename.empty() && KDirectoryRemove(wd, true, filename.c_str()) != 0 )
+ FAIL("KDirectoryRemove on input failed");
+
+ if ( wd && ! dbName.empty() )
+ { // sometimes it takes several attempts to remove a non-empty dir
+ while (KDirectoryRemove(wd, true, dbName.c_str()) != 0);
+ }
+ if ( wd )
+ { // sometimes it takes several attempts to remove a non-empty dir
+ while (KDirectoryRemove(wd, true, TempDir.c_str()) != 0);
+ }
+
+ if ( wd && KDirectoryRelease ( wd ) != 0 )
+ FAIL("KDirectoryRelease failed");
+ }
+ rc_t CreateFile(const char* p_filename, const char* contents)
+ { // create and open for read
+ KFile* file;
+ filename=p_filename;
+ rc_t rc=KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, p_filename);
+ if (rc == 0)
+ {
+ size_t num_writ=0;
+ rc=KFileWrite(file, 0, contents, strlen(contents), &num_writ);
+ if (rc == 0)
+ {
+ rc=KFileRelease(file);
+ }
+ else
+ {
+ KFileRelease(file);
+ }
+ file=0;
+ }
+ return FastqReaderFileMake(&rf, wd, p_filename, FASTQphred33, 0, false);
+ }
+
+ KDirectory* wd;
+ string filename;
+ const ReaderFile* rf;
+ VDBManager* mgr;
+ VSchema *schema;
+ VDatabase* db;
+ string dbName;
+};
+const string TempFileFixture::TempDir = "./tmp";
+const string TempFileFixture::SchemaPath = "align/align.vschema";
+const string TempFileFixture::DbType = "NCBI:align:db:alignment_unsorted";
+
+///////////////////////////////////////////////// FASTQ-based tests for CommonWriter
+FIXTURE_TEST_CASE(CommonWriterOneFile, TempFileFixture)
+{ // source: SRR006565
+ CreateFile(GetName(),
+ "@G15-D_3_1_903_603_0.81\n"
+ "GATTGTAGGGAGTAGGGTACAATACAGTCTGGTCTC\n"
+ "+G15-D_3_1_903_603_0.81\n"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
+
+ dbName = string(GetName())+".db";
+ KDirectoryRemove(wd, true, dbName.c_str());
+ REQUIRE_RC(VDBManagerCreateDB(mgr, &db, schema, DbType.c_str(), kcmInit + kcmMD5, dbName.c_str()));
+
+ CommonWriterSettings settings;
+ memset(&settings, 0, sizeof(settings));
+ settings.numfiles = 1;
+ settings.tmpfs = TempDir.c_str();
+
+ CommonWriter cw;
+ REQUIRE_RC(CommonWriterInit( &cw, mgr, db, &settings ));
+
+ REQUIRE_RC(CommonWriterArchive( &cw, rf ));
+ REQUIRE_RC(CommonWriterComplete( &cw, false, 0 ));
+
+ REQUIRE_RC(CommonWriterWhack( &cw ));
+
+ //TODO: open and validate database
+}
+
+//////////////////////////////////////////// Main
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+
+const char UsageDefaultName[] = "test-fastq-loader";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ( "Usage:\n" "\t%s [options] -o path\n\n", progname );
+}
+
+rc_t CC Usage( const Args* args )
+{
+ return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ KConfigDisableUserSettings();
+
+ KDirectory * native = NULL;
+ rc_t rc = KDirectoryNativeDir( &native);
+
+ const KDirectory * dir = NULL;
+ if (rc == 0)
+ rc = KDirectoryOpenDirRead ( native, &dir, false, "." );
+ KConfig * cfg = NULL;
+ if (rc == 0)
+ rc = KConfigMake ( &cfg, dir ) ;
+ if (rc == 0)
+ rc=LoaderFastqTestSuite(argc, argv);
+
+ KConfigRelease(cfg);
+ KDirectoryRelease(dir);
+ KDirectoryRelease(native);
+
+ return rc;
+}
+
+}
+
diff --git a/test/fastq-loader/wb-test-fastq.cpp b/test/fastq-loader/wb-test-fastq.cpp
new file mode 100644
index 0000000..1f526b8
--- /dev/null
+++ b/test/fastq-loader/wb-test-fastq.cpp
@@ -0,0 +1,1384 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for FASTQ loader
+*/
+#include <ktst/unit_test.hpp>
+#include <klib/rc.h>
+#include <loader/common-writer.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include "../../tools/fastq-loader/fastq-parse.h"
+#include "../../tools/fastq-loader/fastq-tokens.h"
+#include "../../tools/fastq-loader/fastq-reader.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <cstring>
+#include <stdexcept>
+#include <list>
+
+using namespace std;
+
+TEST_SUITE(FastqLoaderWbTestSuite);
+
+//////////////////////////////////////////// tests for flex-generated scanner
+
+
+// test fixture for scanner tests
+class FastqScanFixture
+{
+public:
+ FastqScanFixture()
+ {
+ pb.self = this;
+ pb.input = Input;
+ consumed = 0;
+ }
+ ~FastqScanFixture()
+ {
+ FASTQScan_yylex_destroy(&pb);
+ if (pb.record != 0)
+ {
+ KDataBufferWhack( & pb.record->source );
+ free(pb.record);
+ }
+ }
+ void InitScan(const char* p_input, bool trace=false)
+ {
+ input = p_input;
+ FASTQScan_yylex_init(&pb, trace);
+ pb.record = (FastqRecord*)calloc(sizeof(FastqRecord), 1);
+ KDataBufferMakeBytes ( & pb.record->source, 0 );
+ FASTQ_ParseBlockInit ( &pb );
+ }
+ int Scan()
+ {
+ int tokenId=FASTQ_lex(&sym, pb.scanner);
+ if (tokenId != 0)
+ {
+ tokenText=string(TokenTextPtr(&pb, &sym), sym.tokenLength);
+ }
+ else
+ {
+ tokenText.clear();
+ }
+
+ return tokenId;
+ }
+ static size_t CC Input(FASTQParseBlock* sb, char* buf, size_t max_size)
+ {
+ FastqScanFixture* self = (FastqScanFixture*)sb->self;
+ if (self->input.size() < self->consumed)
+ return 0;
+
+ size_t to_copy = min(self->input.size() - self->consumed, max_size);
+ if (to_copy == 0)
+ return 0;
+
+ memmove(buf, self->input.c_str(), to_copy);
+ if (to_copy < max_size && buf[to_copy-1] != '\n')
+ {
+ buf[to_copy] = '\n';
+ ++to_copy;
+ }
+ self->consumed += to_copy;
+ return to_copy;
+ }
+
+ string input;
+ size_t consumed;
+ FASTQParseBlock pb;
+ FASTQToken sym;
+ string tokenText;
+};
+
+FIXTURE_TEST_CASE(EmptyInput, FastqScanFixture)
+{
+ InitScan("");
+ REQUIRE_EQUAL(Scan(), 0);
+}
+#define REQUIRE_TOKEN(tok) REQUIRE_EQUAL((int)tok, Scan());
+#define REQUIRE_TOKEN_TEXT(tok, text) REQUIRE_TOKEN(tok); REQUIRE_EQ(tokenText, string(text));
+
+#define REQUIRE_TOKEN_COORD(tok, text, line, col) \
+ REQUIRE_TOKEN_TEXT(tok, text); \
+ REQUIRE_EQ(pb.lastToken->line_no, (size_t)line); \
+ REQUIRE_EQ(pb.lastToken->column_no, (size_t)col);
+
+FIXTURE_TEST_CASE(TagLine1, FastqScanFixture)
+{
+ InitScan("@HWUSI-EAS499_1:1:3:9:1822\n");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN_COORD(fqALPHANUM, "HWUSI-EAS499", 1, 2);
+ REQUIRE_TOKEN('_');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "1");
+ REQUIRE_TOKEN_TEXT(fqCOORDS, ":1:3:9:1822");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN(0);
+}
+
+FIXTURE_TEST_CASE(SequenceQuality, FastqScanFixture)
+{
+ InitScan("@8\n" "GATC\n" "+8:1:46:673\n" "!**'\n");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "8");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_COORD(fqBASESEQ, "GATC", 2, 1);
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN('+');
+ REQUIRE_TOKEN_TEXT(fqTOKEN, "8:1:46:673");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_TEXT(fqASCQUAL, "!**'");
+ REQUIRE_TOKEN(fqENDLINE);
+}
+
+FIXTURE_TEST_CASE(QualityOnly, FastqScanFixture)
+{
+ InitScan(">8\n" "\x7F!**'\n");
+ REQUIRE_TOKEN('>');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "8");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_TEXT(fqASCQUAL, "\x7F!**'");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN(0);
+}
+
+FIXTURE_TEST_CASE(NoEOL_InQuality, FastqScanFixture)
+{
+ InitScan("@8\n" "GATC\n" "+\n" "!**'");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "8");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_TEXT(fqBASESEQ, "GATC");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN('+');
+ REQUIRE_TOKEN(fqENDLINE);
+
+ REQUIRE_TOKEN_TEXT(fqASCQUAL, "!**'");
+ REQUIRE_TOKEN(fqENDLINE); /* this is auto-inserted by FastqScanFixture::Input() */
+ REQUIRE_TOKEN(0);
+}
+
+FIXTURE_TEST_CASE(CRnoLF, FastqScanFixture)
+{
+ InitScan("@8\r", 0);
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "8");
+ REQUIRE_TOKEN(fqENDLINE);
+}
+
+FIXTURE_TEST_CASE(CommaSeparatedQuality3, FastqScanFixture)
+{
+ InitScan("@8\n" "GATC\n" "+\n" "0047044004,046,,4000,04444000,--,6-\n");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN_TEXT(fqNUMBER, "8");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_TEXT(fqBASESEQ, "GATC");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN('+');
+ REQUIRE_TOKEN(fqENDLINE);
+
+ REQUIRE_TOKEN_TEXT(fqASCQUAL, "0047044004,046,,4000,04444000,--,6-");
+ REQUIRE_EQUAL(Scan(), (int)fqENDLINE);
+ REQUIRE_EQUAL(Scan(), 0);
+}
+
+FIXTURE_TEST_CASE(WsBeforeEol, FastqScanFixture)
+{
+ InitScan("@ \n");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_EQUAL(Scan(), 0);
+}
+
+FIXTURE_TEST_CASE(SkipToEol, FastqScanFixture)
+{
+ InitScan("@ kjalkjaldkj \nGATC\n");
+ REQUIRE_TOKEN('@');
+ FASTQScan_skip_to_eol(&pb);
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_TOKEN_TEXT(fqBASESEQ, "GATC"); // back to normal
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_EQUAL(Scan(), 0);
+}
+
+FIXTURE_TEST_CASE(InlineBaseSequence, FastqScanFixture)
+{
+ InitScan("@:GATC.NNNN\n");
+ REQUIRE_TOKEN('@');
+ REQUIRE_TOKEN(':');
+ FASTQScan_inline_sequence(&pb);
+ REQUIRE_TOKEN_TEXT(fqBASESEQ, "GATC.NNNN");
+ REQUIRE_TOKEN(fqENDLINE);
+ REQUIRE_EQUAL(Scan(), 0);
+}
+
+///////////////////////////////////////////////// Fastq Parser test fixture
+class ParserFixture
+{
+public:
+ ParserFixture()
+ {
+ pb.record = 0;
+ }
+ ~ParserFixture()
+ {
+ FASTQScan_yylex_destroy(&pb);
+ if (pb.record != 0)
+ {
+ KDataBufferWhack( & pb.record->source );
+ free(pb.record);
+ }
+ }
+
+ bool Parse(bool traceLex = false)
+ {
+ pb.self = this;
+ pb.input = Input;
+ pb.qualityFormat = FASTQphred33;
+ pb.defaultReadNumber = 9;
+ pb.secondaryReadNumber = 0;
+ pb.ignoreSpotGroups = false;
+
+ if (FASTQScan_yylex_init(& pb, traceLex) != 0)
+ FAIL("ParserFixture::ParserFixture: FASTQScan_yylex_init failed");
+
+ pb.record = (FastqRecord*)calloc(1, sizeof(FastqRecord));
+ if (pb.record == 0)
+ FAIL("ParserFixture::ParserFixture: malloc failed");
+ KDataBufferMakeBytes ( & pb.record->source, 0 );
+
+ //FASTQ_debug = 1;
+ FASTQ_ParseBlockInit ( &pb );
+ return FASTQ_parse( &pb ) == 1 && pb.record->rej == 0;
+ }
+
+ void AddBuffer(const string& p_text)
+ {
+ buffers.push_back(p_text);
+ }
+
+ static size_t CC Input(struct FASTQParseBlock* sb, char* buf, size_t max_size)
+ {
+ ParserFixture* self = (ParserFixture*)sb->self;
+ if (self->buffers.empty())
+ return 0;
+
+ string s = self->buffers.front();
+ self->buffers.pop_front();
+ memmove(buf, s.c_str(), s.size()); // ignore max_size for our short test lines
+ return s.size();
+ }
+
+ list<string> buffers;
+ FASTQParseBlock pb;
+};
+
+FIXTURE_TEST_CASE(BufferBreakInTag, ParserFixture)
+{
+ AddBuffer("@HWI-ST226:170:AB075UABXX:3:1101:10089:7031 ");
+ AddBuffer("1:N:0:GCCAAT\n"
+ "TACA\n"
+ "+\n"
+ "GEGE\n");
+ REQUIRE(Parse());
+ REQUIRE_EQ(1, (int)pb.record->seq.readnumber);
+}
+
+///////////////////////////////////////////////// FastqReader test fixture
+
+class LoaderFixture
+{
+public:
+ LoaderFixture()
+ : wd(0), rf(0),
+ record(0), seq(0), reject(0),
+ read(0), readLength(0),
+ name(0), length(0),
+ errorText(0), errorLine(0), column(0),
+ quality(0), qualityAsciiOffset(0), qualityType(-1),
+ qualityFormat(FASTQphred33), defaultReadNumber(0),
+ ignoreSpotGroups(false)
+ {
+ if ( KDirectoryNativeDir ( & wd ) != 0 )
+ FAIL("KDirectoryNativeDir failed");
+ }
+ ~LoaderFixture()
+ {
+ delete [] read;
+
+ if (seq != 0 && SequenceRelease(seq) != 0)
+ FAIL("SequenceRelease failed");
+
+ if (record != 0 && RecordRelease(record) != 0)
+ FAIL("RecordRelease failed");
+
+ if (reject != 0 && RejectedRelease(reject) != 0)
+ FAIL("RejectedRelease failed");
+
+ if ( rf != 0 && ReaderFileRelease( rf ) != 0)
+ FAIL("ReaderFileRelease failed");
+
+ if ( !filename.empty() && KDirectoryRemove(wd, true, filename.c_str()) != 0)
+ FAIL("KDirectoryRemove failed");
+
+ if ( KDirectoryRelease ( wd ) != 0 )
+ FAIL("KDirectoryRelease failed");
+
+ FASTQ_debug = 0;
+ }
+ rc_t CreateFile(const char* p_filename, const char* contents)
+ { // create and open for read
+ KFile* file;
+ filename=p_filename;
+ rc_t rc=KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, p_filename);
+ if (rc == 0)
+ {
+ size_t num_writ=0;
+ rc=KFileWrite(file, 0, contents, strlen(contents), &num_writ);
+ if (rc == 0)
+ {
+ rc=KFileRelease(file);
+ }
+ else
+ {
+ KFileRelease(file);
+ }
+ file=0;
+ }
+ return FastqReaderFileMake(&rf, wd, p_filename, qualityFormat, defaultReadNumber, ignoreSpotGroups);
+ }
+ void CreateFileGetRecord(const char* fileName, const char* contents)
+ {
+ if (record != 0 && RecordRelease(record) != 0)
+ throw logic_error("CreateFileGetRecord: RecordRelease failed");
+
+ if (CreateFile(fileName, contents) != 0)
+ throw logic_error("CreateFileGetRecord: CreateFile failed");
+
+ if (ReaderFileGetRecord(rf, &record) != 0 || record == 0)
+ throw logic_error("CreateFileGetRecord: ReaderFileGetRecord failed");
+ }
+ bool GetRecord()
+ {
+ if (rf == 0)
+ return false;
+
+ if (record != 0 && RecordRelease(record) != 0)
+ return false;
+ if (reject != 0 && RejectedRelease(reject) != 0)
+ return false;
+ reject = 0;
+ if (seq != 0 && SequenceRelease(seq) != 0)
+ return false;
+ seq = 0;
+
+ return ReaderFileGetRecord(rf, &record) == 0;
+ }
+
+ bool GetRejected()
+ {
+ if (reject != 0 && RejectedRelease(reject) != 0)
+ throw logic_error("GetRejected: RejectedRelease failed");
+ if (record == 0)
+ throw logic_error("GetRejected: record == 0");
+ if (RecordGetRejected(record, &reject) != 0)
+ throw logic_error("GetRejected: RecordGetRejected failed");
+ if (reject == 0)
+ return false;
+ if (RejectedGetError(reject, &errorText, &errorLine, &column, &fatal) != 0)
+ throw logic_error("IsFatal: RejectedGetError failed");
+ return true;
+ }
+
+ bool CreateFileGetSequence(const char* name, const char* contents)
+ {
+ if (CreateFile(name, contents) != 0)
+ throw logic_error("CreateFileGetSequence: CreateFile failed");
+
+ if (!GetRecord() || record == 0)
+ throw logic_error("CreateFileGetSequence: GetRecord failed");
+
+ if (GetRejected())
+ throw logic_error(string("CreateFileGetSequence: record rejected, ")+string(errorText));
+
+ if (RecordGetSequence(record, &seq) != 0)
+ throw logic_error("CreateFileGetSequence: RecordGetSequence failed:");
+
+ return seq != 0;
+ }
+
+ bool MakeReadBuffer()
+ {
+ if (SequenceGetReadLength(seq, &readLength) != 0 || readLength == 0)
+ return false;
+
+ delete [] read;
+ read = new char[readLength];
+ return true;
+ }
+
+ void BisonDebugOn()
+ {
+ FASTQ_debug = 1;
+ }
+
+ KDirectory* wd;
+ string filename;
+ const ReaderFile* rf;
+ const Record* record;
+ const Sequence* seq;
+ const Rejected* reject;
+
+ char* read;
+ uint32_t readLength;
+
+ const char* name;
+ size_t length;
+
+ const char* errorText;
+ uint64_t errorLine;
+ uint64_t column;
+ bool fatal;
+ const void* errorData;
+
+ const int8_t* quality;
+ uint8_t qualityAsciiOffset;
+ int qualityType;
+
+ enum FASTQQualityFormat qualityFormat;
+ int8_t defaultReadNumber;
+ bool ignoreSpotGroups;
+};
+
+///////////////////////////////////////////////// FASTQ test cases
+FIXTURE_TEST_CASE(EmptyFile, LoaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(), ""));
+ REQUIRE_EQ( string(ReaderFileGetPathname(rf)), string(GetName()) );
+ REQUIRE(GetRecord());
+ REQUIRE_NULL(record);
+}
+
+FIXTURE_TEST_CASE(EndLines, LoaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(), "\n\n"));
+ REQUIRE_EQ( string(ReaderFileGetPathname(rf)), string(GetName()) );
+ REQUIRE(GetRecord());
+ REQUIRE_NULL(record);
+}
+
+//////////////////// syntax errors and recovery
+const string SyntaxError("syntax error");
+FIXTURE_TEST_CASE(SyntaxError1, LoaderFixture)
+{
+ string input="qqq abcd";
+
+ CreateFileGetRecord(GetName(), input.c_str());
+
+ REQUIRE(GetRejected());
+ REQUIRE(!fatal);
+ REQUIRE_NOT_NULL(errorText);
+ REQUIRE_EQ(SyntaxError, string (errorText).substr(0, SyntaxError.size()));
+ REQUIRE_EQ(errorLine, (uint64_t)1);
+ REQUIRE_EQ(column, (uint64_t)4);
+
+ const void* data;
+ REQUIRE_RC(RejectedGetData(reject, &data, &length));
+ REQUIRE_NOT_NULL(data);
+ REQUIRE_EQ(input, string((const char*)data, length));
+}
+
+FIXTURE_TEST_CASE(SyntaxError2, LoaderFixture)
+{
+ #define input "qqq abcd"
+ CreateFileGetRecord(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n" input );
+ REQUIRE(GetRecord());
+
+ REQUIRE(GetRejected());
+ REQUIRE(!fatal);
+ REQUIRE_NOT_NULL(errorText);
+ REQUIRE_EQ(SyntaxError, string (errorText).substr(0, SyntaxError.size()));
+ REQUIRE_EQ(errorLine, (uint64_t)5);
+ REQUIRE_EQ(column, (uint64_t)4);
+
+ const void* data;
+ REQUIRE_RC(RejectedGetData(reject, &data, &length));
+ REQUIRE_EQ(string(input), string((const char*)data, length));
+
+
+ #undef input
+}
+
+FIXTURE_TEST_CASE(RecoveryFromErrorAtTopLevel, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "qqq abcd\n" "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n");
+ REQUIRE(GetRejected());
+
+ REQUIRE(GetRecord());
+ REQUIRE_NOT_NULL(record);
+
+ REQUIRE_RC(RecordGetSequence(record, &seq));
+ REQUIRE_NOT_NULL(seq);
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("SEQ_ID1"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(RecoveryFromErrorInHeader, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "@SEQ_ID1^\n" "GATT\n" "+\n" "!''*\n" "@SEQ_ID2\n" "GATT\n" "+\n" "!''*\n");
+ REQUIRE(GetRejected());
+
+ REQUIRE(GetRecord());
+ REQUIRE_NOT_NULL(record);
+
+ REQUIRE_RC(RecordGetSequence(record, &seq));
+ REQUIRE_NOT_NULL(seq);
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("SEQ_ID2"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(RecoveryFromErrorInRead, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "@SEQ_ID1\n" "G^ATT\n" "+\n" "!''*\n" "@SEQ_ID2\n" "GATT\n" "+\n" "!''*\n");
+ REQUIRE(GetRejected());
+
+ REQUIRE(GetRecord());
+ REQUIRE_NOT_NULL(record);
+
+ REQUIRE_RC(RecordGetSequence(record, &seq));
+ REQUIRE_NOT_NULL(seq);
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("SEQ_ID2"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(RecoveryFromErrorInQuality, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "\n" "@SEQ_ID2\n" "GATT\n" "+\n" "!''*\n");
+ REQUIRE(GetRejected());
+
+ REQUIRE(GetRecord());
+ REQUIRE_NOT_NULL(record);
+
+ REQUIRE_RC(RecordGetSequence(record, &seq));
+ REQUIRE_NOT_NULL(seq);
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("SEQ_ID2"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(ErrorLineNumber, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(),
+ "@HWI-ST959:56:D0AW4ACXX:8:2108:6958:112042 1:Y:0#\n"
+ "ATT\n");
+ REQUIRE(GetRejected());
+ REQUIRE_EQ(SyntaxError, string (errorText).substr(0, SyntaxError.size()));
+ REQUIRE_EQ(errorLine, (uint64_t)1);
+ REQUIRE_EQ(column, (uint64_t)49);
+}
+
+//////////////////// tag line parsing
+#define TEST_TAGLINE(line)\
+ CreateFileGetRecord(GetName(), line "\n" "GATT\n" "+\n" "!''*\n");\
+ REQUIRE(! GetRejected()); /* no error */ \
+ REQUIRE(GetRecord()); /* parsing done */ \
+ REQUIRE_NULL(record); /* input consumed */
+
+FIXTURE_TEST_CASE(Tag1, LoaderFixture) { TEST_TAGLINE("@HWUSI-EAS499:1:3:9:1822"); }
+FIXTURE_TEST_CASE(Tag2_1, LoaderFixture) { TEST_TAGLINE("@HWUSI-EAS499:1:3:9:1822:.2"); }
+FIXTURE_TEST_CASE(Tag2_2, LoaderFixture) { TEST_TAGLINE("@HWUSI-EAS499:1:3:9:1822:1.2"); }
+FIXTURE_TEST_CASE(Tag3, LoaderFixture) { TEST_TAGLINE("@BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540"); }
+FIXTURE_TEST_CASE(Tag4, LoaderFixture) { TEST_TAGLINE("@BILLIEHOLIDAY_1_FC200TYAAXX_3_1_751_675"); }
+FIXTURE_TEST_CASE(Tag5, LoaderFixture) { TEST_TAGLINE("@HWUSI-EAS499:1:3:9:1822#0/1"); }
+FIXTURE_TEST_CASE(Tag6, LoaderFixture) { TEST_TAGLINE("@1:3:9:1822:33.44"); }
+FIXTURE_TEST_CASE(Tag7, LoaderFixture) { TEST_TAGLINE("@1:3:9:1822#1/2"); }
+FIXTURE_TEST_CASE(Tag8, LoaderFixture) { TEST_TAGLINE("@HWUSI-EAS499:1:3:9:1822#CAT/1"); }
+FIXTURE_TEST_CASE(Tag9, LoaderFixture) { TEST_TAGLINE("@ERBRDQF01EGP9U"); }
+FIXTURE_TEST_CASE(Tag10, LoaderFixture) { TEST_TAGLINE("@ID57_120908_30E4FAAXX:3:1:1772:953.1"); }
+FIXTURE_TEST_CASE(Tag11, LoaderFixture) { TEST_TAGLINE(">ID57_120908_30E4FAAXX:3:1:1772:953"); }
+FIXTURE_TEST_CASE(Tag12, LoaderFixture) { TEST_TAGLINE("@741:6:1:1204:10747"); }
+FIXTURE_TEST_CASE(Tag13, LoaderFixture) { TEST_TAGLINE("@741:6:1:1204:10747/1"); }
+FIXTURE_TEST_CASE(Tag14, LoaderFixture) { TEST_TAGLINE("@SNPSTER4_246_30GCDAAXX_PE:1:1:3:896/1 run=090102_SNPSTER4_0246_30GCDAAXX_PE"); }
+FIXTURE_TEST_CASE(Tag15, LoaderFixture) { TEST_TAGLINE("@G15-D_3_1_903_603_0.81"); }
+
+//////////////////// building Sequence objects
+FIXTURE_TEST_CASE(NotRejected, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "@HWUSI-EAS499:1:3:9:1822:1.2\n" "GATT\n" "+\n" "!''*\n");
+ reject = (const Rejected*)1;
+ REQUIRE_RC(RecordGetRejected(record, &reject));
+ REQUIRE_NULL(reject);
+}
+
+FIXTURE_TEST_CASE(SequenceNoAlignment, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(), "@HWUSI-EAS499:1:3:9:1822:1.2\n" "GATT\n" "+\n" "!''*\n");
+
+ const Alignment* align;
+ REQUIRE_RC(RecordGetAlignment(record, &align));
+ REQUIRE_NULL(align);
+
+ REQUIRE_RC(RecordGetSequence(record, &seq));
+ REQUIRE_NOT_NULL(seq);
+}
+
+FIXTURE_TEST_CASE(TestSequenceGetReadLength, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n" ));
+ REQUIRE_RC(SequenceGetReadLength(seq, &readLength));
+ REQUIRE_EQ(readLength, 4u);
+}
+
+FIXTURE_TEST_CASE(TestSequenceGetRead, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n" ));
+ REQUIRE(MakeReadBuffer());
+ REQUIRE_RC(SequenceGetRead(seq, read));
+ REQUIRE_EQ(string(read, readLength), string("GATT"));
+}
+
+FIXTURE_TEST_CASE(TestSequenceGetRead2, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n" ));
+ REQUIRE(MakeReadBuffer());
+
+ // normal
+ REQUIRE_RC(SequenceGetRead2(seq, read, 0, 2));
+ REQUIRE_EQ(string(read, 2), string("GA"));
+
+ // stop out of range
+ REQUIRE_RC_FAIL(SequenceGetRead2(seq, read, 2, 6));
+
+ // start out of range
+ REQUIRE_RC_FAIL(SequenceGetRead2(seq, read, 20, 1));
+}
+
+FIXTURE_TEST_CASE(SequenceGetQuality33, LoaderFixture)
+{
+ qualityFormat = FASTQphred33;
+
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n" ));
+
+ REQUIRE_RC(SequenceGetQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ REQUIRE_NOT_NULL(quality);
+ uint32_t l;
+ REQUIRE_RC(SequenceGetReadLength(seq, &l));
+ REQUIRE_EQ(qualityAsciiOffset, (uint8_t)33);
+ REQUIRE_EQ(qualityType, (int)QT_Phred);
+ REQUIRE_EQ(quality[0], (int8_t)'!');
+}
+
+FIXTURE_TEST_CASE(SequenceGetQuality64, LoaderFixture)
+{
+ qualityFormat = FASTQphred64;
+
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" "BBCC\n" ));
+
+ REQUIRE_RC(SequenceGetQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ REQUIRE_NOT_NULL(quality);
+ uint32_t l;
+ REQUIRE_RC(SequenceGetReadLength(seq, &l));
+ REQUIRE_EQ(qualityAsciiOffset, (uint8_t)64);
+ REQUIRE_EQ(qualityType, (int)QT_Phred);
+ REQUIRE_EQ(quality[0], (int8_t)'B');
+}
+
+FIXTURE_TEST_CASE(SequenceGetQualityLogOdds, LoaderFixture)
+{
+ qualityFormat = FASTQlogodds;
+
+ REQUIRE(CreateFileGetSequence(GetName(), "@SEQ_ID1\n" "GATT\n" "+\n" ";>@H\n" ));
+
+ REQUIRE_RC(SequenceGetQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ REQUIRE_NOT_NULL(quality);
+ uint32_t l;
+ REQUIRE_RC(SequenceGetReadLength(seq, &l));
+ REQUIRE_EQ(qualityAsciiOffset, (uint8_t)64);
+ REQUIRE_EQ(qualityType, (int)QT_LogOdds);
+ REQUIRE_EQ(quality[0], (int8_t)';');
+}
+
+FIXTURE_TEST_CASE(SequenceBaseSpace, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@q\n" "GATC\n" "+\n" "!''*\n" ));
+ REQUIRE(!SequenceIsColorSpace(seq));
+ char k;
+ REQUIRE_RC(SequenceGetCSKey(seq, &k)); // RC is 0 but k is undefined
+}
+
+FIXTURE_TEST_CASE(SequenceColorSpace, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@q\n" "G123\n" "+\n" "!''*\n" ));
+ REQUIRE(SequenceIsColorSpace(seq));
+
+ char k;
+ REQUIRE_RC(SequenceGetCSKey(seq, &k));
+ REQUIRE_EQ(k, 'G');
+
+ uint32_t l;
+ REQUIRE_RC(SequenceGetReadLength(seq, &l));
+ REQUIRE_EQ(l, (uint32_t)0);
+ REQUIRE_RC(SequenceGetCSReadLength(seq, &l));
+ REQUIRE_EQ(l, (uint32_t)3);
+
+ delete [] read;
+ read = new char[l];
+ REQUIRE_RC(SequenceGetCSRead(seq, read));
+ REQUIRE_EQ(string(read, l), string("123"));
+
+ REQUIRE_RC(SequenceGetCSQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ REQUIRE_NOT_NULL(quality);
+ REQUIRE_EQ(qualityType, (int)QT_Phred);
+ REQUIRE_EQ(qualityAsciiOffset, (uint8_t)33);
+ REQUIRE_EQ(quality[0], (int8_t)'\'');
+ REQUIRE_EQ(quality[1], (int8_t)'\'');
+ REQUIRE_EQ(quality[2], (int8_t)'*' );
+}
+
+FIXTURE_TEST_CASE(SequenceGetOrientationIsReverse, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@q\n" "G123\n" "+\n" "!''*\n" ));
+ REQUIRE_EQ(SequenceGetOrientationSelf(seq), (int)ReadOrientationUnknown);
+ REQUIRE_EQ(SequenceGetOrientationMate(seq), (int)ReadOrientationUnknown);
+}
+
+// Read Number
+FIXTURE_TEST_CASE(ReadNumber, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWUSI-EAS499:1:3:9:1822#0/1\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(SequenceIsFirst(seq));
+ REQUIRE(!SequenceIsSecond(seq));
+}
+FIXTURE_TEST_CASE(ReadNumberMissing, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWUSI-EAS499:1:3:9:1822\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(!SequenceIsFirst(seq));
+ REQUIRE(!SequenceIsSecond(seq));
+}
+FIXTURE_TEST_CASE(ReadNumberDefault, LoaderFixture)
+{
+ defaultReadNumber = 2;
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWUSI-EAS499:1:3:9:1822\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(!SequenceIsFirst(seq));
+ REQUIRE(SequenceIsSecond(seq));
+}
+FIXTURE_TEST_CASE(ReadNumberOverride, LoaderFixture)
+{
+ defaultReadNumber = 1;
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWUSI-EAS499:1:3:9:1822/2\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(!SequenceIsFirst(seq));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE(RunSpotRead, LoaderFixture)
+{
+ defaultReadNumber = 1;
+ REQUIRE(CreateFileGetSequence(GetName(), "@SRR390728.1.2\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE(RunSpotRead_withTail, LoaderFixture)
+{
+ defaultReadNumber = 1;
+ REQUIRE(CreateFileGetSequence(GetName(), "@SRR390728.1.2 123\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE(RunSpotNothing, LoaderFixture)
+{
+ defaultReadNumber = 1;
+ REQUIRE(CreateFileGetSequence(GetName(), "@SRR390728.1\n" "GATT\n" "+\n" "!''*\n"));
+}
+
+// Components of Illumina tag lines:
+// @HWUSI-EAS499:1:3:9:1822#0/1"
+// spot-name HWUSI-EAS499:1:3:9:1822 tag line up to and including coordinates
+// spot-group "0" token following '#'
+// read-number "1" 1 or 2 following '/'
+
+// not implemented for now:
+// run-group HWUSI-EAS499 tag line up to and excluding coordinates
+// coords [ 1 3 9 182 ]
+// fmt-name HWUSI-EAS499:1:3:$X:$Y
+
+FIXTURE_TEST_CASE(SequenceGetSpotNameIllumina, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWUSI-EAS499:1:3:9:1822#0/1\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWUSI-EAS499:1:3:9:1822"), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroupIllumina, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@1:3:9:1822#CAT/1\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("CAT"), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroupIllumina_Ignored, LoaderFixture)
+{
+ ignoreSpotGroups = true;
+ REQUIRE(CreateFileGetSequence(GetName(), "@1:3:9:1822#CAT/1\n" "GATT\n" "+\n" "!''*\n"));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string(""), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroup_Empty, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ ">HWI-EAS6_4_FC2010T:1:1:80:366\n"
+ "GATT\n"
+ "+\n"
+ "!''*\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string(""), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(!SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroup_Zero, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ ">HWI-EAS6_4_FC2010T:1:1:80:366#0\n"
+ "GATT\n"
+ "+\n"
+ "!''*\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string(""), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(!SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroupBarcode, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@HWI-ST1234:33:D1019ACXX:2:1101:1415:2223/1 1:N:0:ATCACG\nATCG\n"));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("ATCACG"), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(SequenceIsFirst(seq));
+}
+
+FIXTURE_TEST_CASE(SequenceGetSpotGroupUnderscore, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(), "@FCA5PJ4:1:1101:14707:1407#GTAGTCGC_AGCTCGGT/1\nATCG\n"));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("GTAGTCGC_AGCTCGGT"), string(name, length));
+ REQUIRE(!SequenceIsSecond(seq));
+ REQUIRE(SequenceIsFirst(seq));
+}
+
+
+#define TEST_PAIRED(line, paired)\
+ REQUIRE(CreateFileGetSequence(GetName(), line "\n" "GATT\n" "+\n" "!''*\n"));\
+ if (paired)\
+ REQUIRE(SequenceWasPaired(seq));\
+ else\
+ REQUIRE(!SequenceWasPaired(seq));
+
+FIXTURE_TEST_CASE(SequenceWasPaired1, LoaderFixture) { TEST_PAIRED("@HWUSI-EAS499:1:3:9:1822", false); }
+FIXTURE_TEST_CASE(SequenceWasPaired2, LoaderFixture) { TEST_PAIRED("@HWUSI-EAS499:1:3:9:1822#0/0", false); }
+FIXTURE_TEST_CASE(SequenceWasPaired3, LoaderFixture) { TEST_PAIRED("@HWUSI-EAS499:1:3:9:1822#0/1", true); }
+FIXTURE_TEST_CASE(SequenceWasPaired4, LoaderFixture) { TEST_PAIRED("@HWUSI-EAS499:1:3:9:1822#CAT/1", true); }
+FIXTURE_TEST_CASE(SequenceWasPaired5, LoaderFixture) { TEST_PAIRED("@HWUSI-EAS499:1:3:9:1822/2", true); }
+
+FIXTURE_TEST_CASE(SequenceGetSpotNameOneLine, LoaderFixture)
+{ // source: SRR014283
+ REQUIRE(CreateFileGetSequence(GetName(), "USI-EAS50_1:6:1:392:881:GCT:!!!"));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("USI-EAS50_1:6:1:392:881"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(SequenceGetNameNumeric, LoaderFixture)
+{ // source: SRR094419
+ qualityFormat = FASTQphred64;
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@741:6:1:1204:10747/1\n"
+ "GTCGTTGTCCCGCTCCTCATATTCNNNNNNNNNNNN\n"
+ "+\n"
+ "bbbbbbbbbbbbbbbbbbbb````BBBBBBBBBBBB\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("741:6:1:1204:10747"), string(name, length));
+}
+
+//////////////////// parsing Quality lines
+
+FIXTURE_TEST_CASE(GtStartsQualityOnly, LoaderFixture)
+{ // source: XXX001656
+ CreateFileGetRecord(GetName(),
+ ">HWI-EAS6_4_FC2010T:1:1:80:366\n"
+ "!!\n"
+ ">HWI-EAS6_4_FC2010T:1:1:80:366\n"
+ "!!\n"
+ );
+ REQUIRE(GetRejected());
+ REQUIRE(!fatal);
+}
+
+FIXTURE_TEST_CASE(OneLineRead, LoaderFixture)
+{
+// source: SRR016872
+ CreateFileGetRecord(GetName(), "USI-EAS50_1:6:1:392:881:GCTC:!!!!\n");
+ REQUIRE(!GetRejected());
+}
+
+FIXTURE_TEST_CASE(ForcePhredOffset, LoaderFixture)
+{ // quality line looks like it may be Phred64, but we know we are dealing with Phred33
+// source: SRR014126
+ qualityFormat = FASTQphred33;
+ CreateFileGetSequence(GetName(),
+ "@R16:8:1:19:1012#0/2\n"
+ "TTAAATGACTCTTTAAAAAACACAACATACATTGATATATTTATTCCTAGATATTTGCTTATAAGACTCTAATCA\n"
+ "+\n"
+ "BCCBBBACBBCCCCBCCCCCCCCCCBCBCCCABBBBBBCCBBCBBCCBBCBCCCABBCAAABC at CCCAB@CBACC\n"
+ );
+ REQUIRE_RC(SequenceGetQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ REQUIRE_NOT_NULL(quality);
+ REQUIRE_EQ(qualityType, (int)QT_Phred);
+ REQUIRE_EQ(qualityAsciiOffset, (uint8_t)33);
+ REQUIRE_EQ(quality[0], (int8_t)'B');
+}
+
+// Illumina spot names
+FIXTURE_TEST_CASE(IlluminaCasava_1_8, LoaderFixture)
+{ // source: SAMN01860354.fastq
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST273:315:C0LKAACXX:7:1101:1487:2221 2:Y:0:GGCTAC\n"
+ "AACA\n+\n$.%0\n"
+ ));
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST273:315:C0LKAACXX:7:1101:1487:2221"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+ REQUIRE(SequenceIsLowQuality(seq));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("GGCTAC"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(IlluminaCasava_1_8_SpotGroupNumber, LoaderFixture)
+{ // source: SAMN01860354.fastq
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST273:315:C0LKAACXX:7:1101:1487:2221 2:Y:0:1\n"
+ "AACA\n+\n$.%0\n"
+ ));
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST273:315:C0LKAACXX:7:1101:1487:2221"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+ REQUIRE(SequenceIsLowQuality(seq));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("1"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(IlluminaCasava_1_8_SpotGroup_MoreMadness, LoaderFixture)
+{ // source: SRR1106612
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST808:130:H0B8YADXX:1:1101:1914:2223 1:N:0:NNNNNN.GGTCCA.AAAA\n"
+ "AACA\n+\n$.%0\n"
+ ));
+
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string("NNNNNN.GGTCCA.AAAA"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(IlluminaCasava_1_8_EmptyTag, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST959:56:D0AW4ACXX:8:1101:1233:2026 2:N:0:\n"
+ "AACA\n+\n$.%0\n"
+
+ ));
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST959:56:D0AW4ACXX:8:1101:1233:2026"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+ REQUIRE(! SequenceIsLowQuality(seq));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string(), string(name, length));
+}
+
+FIXTURE_TEST_CASE(Illumina_NegativeCoords, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWUSI-EAS1679-0005:4:113:4454:-51#0\n"
+ "AACA\n+\n$.%0\n"
+ ));
+
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWUSI-EAS1679-0005:4:113:4454:-51"), string(name, length));
+ REQUIRE_RC(SequenceGetSpotGroup(seq, &name, &length));
+ REQUIRE_EQ(string(""), string(name, length));
+}
+
+FIXTURE_TEST_CASE(Illumina_Underscore, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@DG7PMJN1:293:D12THACXX:2:1101:1161:1968_2:N:0:GATCAG\n"
+ "AGAGTTTGAT\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("DG7PMJN1:293:D12THACXX:2:1101:1161:1968"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE(Illumina_IdentifierAtFront, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@QSEQ161.65 DBV2SVN1:1:1101:1474:2213#0/1\n"
+ "AGAGTTTGAT\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("DBV2SVN1:1:1101:1474:2213"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(Illumina_SpaceAndIdentifierAtFront, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@ QSEQ161 EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG\n"
+ "AGAGTTTGAT\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("EAS139:136:FC706VJ:2:2104:15343:197393"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(SRR1778155 , LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@2-796964 M01929:5:000000000-A46YE:1:1108:16489:18207 1:N:0:2 orig_bc=TATCGGGA new_bc=TATCGGGA bc_diffs=0\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("M01929:5:000000000-A46YE:1:1108:16489:18207"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(SRA192487, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST1234:33:D1019ACXX:2:1101:1415:2223/1 1:N:0:ATCACG\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST1234:33:D1019ACXX:2:1101:1415:2223"), string(name, length));
+}
+
+//////////////////// odd syntax cases
+FIXTURE_TEST_CASE(NoEolAtEof, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(),
+ "@SEQ_ID1\n" "GATT\n" "+\n" "!''*\n"
+ "@SEQ_ID2\n" "GATT\n" "+\n" "!''*"
+ );
+ REQUIRE_NOT_NULL(record);
+ REQUIRE(! GetRejected());
+
+ REQUIRE(GetRecord());
+ REQUIRE(! GetRejected());
+ REQUIRE_NOT_NULL(record);
+}
+
+FIXTURE_TEST_CASE(GtStartsReadOnly, LoaderFixture)
+{ // source: XXX001656
+ CreateFileGetRecord(GetName(),
+ ">q\n"
+ "AAC\n"
+ ">q\n"
+ "ACA\n"
+ );
+ REQUIRE(!GetRejected());
+}
+
+//////////////////// detecting older formats
+
+FIXTURE_TEST_CASE(Quality33TooLow, LoaderFixture)
+{ // negative qualities are not allowed for Phred33
+// source: SRR016872
+ qualityFormat = FASTQphred33;
+ CreateFileGetRecord(GetName(),
+ "@HWI-EAS102_1_30LWPAAXX:5:1:1792:566\n"
+ "GAAACCCCCTATTAGANNNNCNNNNCNATCATGTCA\n"
+ "+HWI-EAS102_1_30LWPAAXX:5:1:1792:566\n"
+ "II IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"
+ );
+ REQUIRE(GetRejected());
+ REQUIRE(fatal);
+}
+
+FIXTURE_TEST_CASE(Quality64TooLow, LoaderFixture)
+{ // negative qualities are not allowed for Phred64
+// source: SRR016872
+ qualityFormat = FASTQphred64;
+ CreateFileGetRecord(GetName(),
+ "@HWI-EAS102_1_30LWPAAXX:5:1:1511:102\n"
+ "GGGGTTAGTGGCAGGGGGGGGGTCTCGGGGGGGGGG\n"
+ "+HWI-EAS102_1_30LWPAAXX:5:1:1511:102\n"
+ "IIIIIIIIIIIIIIIIII;IIIIIIIIIIIIIIIII\n"
+ );
+ REQUIRE(GetRejected());
+ REQUIRE(fatal);
+}
+
+FIXTURE_TEST_CASE(QualityLogoddsTooLow, LoaderFixture)
+{ // qualities under 59 are not allowed for LogOdds
+ qualityFormat = FASTQlogodds;
+ CreateFileGetRecord(GetName(),
+ "@HWI-EAS102_1_30LWPAAXX:5:1:1511:102\n"
+ "GGGGTTAGTGGCAGGGGGGGGGTCTCGGGGGGGGGG\n"
+ "+HWI-EAS102_1_30LWPAAXX:5:1:1511:102\n"
+ "I:IIIIIIIIIIIIIIII;IIIIIIIIIIIIIIIII\n" // ':' = 58
+ );
+ REQUIRE(GetRejected());
+ REQUIRE(fatal);
+}
+
+FIXTURE_TEST_CASE(DecimalQualityRejected, LoaderFixture)
+{
+ CreateFileGetRecord(GetName(),
+ "@BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540\n"
+ "GTCGCTTCTCGGAAGNGTGAAAGACAANAATNTTNN\n"
+ "+BILLIEHOLIDAY_1_FC20F3DAAXX:8:2:342:540\n"
+ "40 3 1 22 17 18 34 8 13 21 3 7 5 0 0 5 1 0 7 3 2 3 3 3 1 1 4 5 5 2 2 5 0 1 5 5\n"
+ );
+ REQUIRE(GetRejected());
+ REQUIRE(fatal);
+}
+
+////////////////// detecting alternative formats
+FIXTURE_TEST_CASE(PacbioRaw, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19\n"
+ "AGAGTTTGAT\n"
+ "+m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19\n"
+ "LLhf>>>>[[\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19"), string(name, length));
+}
+FIXTURE_TEST_CASE(PacbioCcs, LoaderFixture)
+{
+ defaultReadNumber = -1;
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19/ccs\n"
+ "AGAGTTTGAT\n"
+ "+m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19/ccs\n"
+ "LLhf>>>>[[\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("m121205_055009_42163_c100416332550000001523041801151327_s1_p0/19/ccs"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(PacbioNoReadNumbers, LoaderFixture)
+{
+ defaultReadNumber = -1;
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m121205_055009_42163_c100416332550000001523041801151327_s1_p0/1\n"
+ "AGAGTTTGAT\n"
+ "+m121205_055009_42163_c100416332550000001523041801151327_s1_p0/1\n"
+ "LLhf>>>>[[\n"
+ ));
+ REQUIRE(!SequenceIsFirst(seq));
+ REQUIRE(!SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE(PacbioWsCcs, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m101210_094054_00126_c000028442550000000115022402181134_s1_p0/2 ccs\n"
+ "AGAGTTTGAT\n"
+ "+m101210_094054_00126_c000028442550000000115022402181134_s1_p0/2 ccs\n"
+ "LLhf>>>>[[\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("m101210_094054_00126_c000028442550000000115022402181134_s1_p0/2"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(PacbioError, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m130727_021351_42150_c100538232550000001823086511101336_s1_p0/53/0_106\n"
+ "TTTTTCCAAAAAAGGAGACGTAAACATTTCTTAACTTGCCAGCACTCTAATTCCAAAATCAAGTCGCATTTCTGACATTGCGGTAAGATTGTGCAATATCATATCT\n"
+ "+\n"
+ ")*'&*'+*(*+#-,-/'+-)+,'-./+*+.()*()*,$#,)'+**%+'*/,+(/,,*,'/&,+--%.-.*),,+.,,.'./%-/,/(.%.,*(.+/-/(../.&'#\n"
+ ));
+}
+
+FIXTURE_TEST_CASE(NotPairedRead_Error, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST226:170:AB075UABXX:3:1101:10089:7031 1:N:0:GCCAAT\n"
+ "TACA\n"
+ ));
+ REQUIRE(SequenceIsFirst(seq));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST226:170:AB075UABXX:3:1101:10089:7031"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(NoFragmentInfo_Error, LoaderFixture)
+{
+ defaultReadNumber = -1;
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@m130727_021351_42150_c100538232550000001823086511101336_s1_p0/283/0_9315\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("m130727_021351_42150_c100538232550000001823086511101336_s1_p0/283/0_9315"), string(name, length));
+}
+
+FIXTURE_TEST_CASE(NoColonAtTheEnd_Error, LoaderFixture)
+{
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HET-141-007:154:C391TACXX:6:2316:3220:70828 1:N:0\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE(SequenceIsFirst(seq));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HET-141-007:154:C391TACXX:6:2316:3220:70828"), string(name, length));
+}
+
+FIXTURE_TEST_CASE ( MissingRead, LoaderFixture )
+{ // source: SRR529889
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@GG3IVWD03HIDOA length=3 xy=2962_2600 region=3 run=R_2010_05_11_11_15_22_\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("GG3IVWD03HIDOA"), string(name, length));
+}
+
+FIXTURE_TEST_CASE ( UnexpectedEOLreported, LoaderFixture )
+{ // source: SRR1915965
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST1106:381:D1CDRACXX:8:1101:10000:110594\t2\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST1106:381:D1CDRACXX:8:1101:10000:110594"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE ( AnotherUnexpectedEOLreported, LoaderFixture )
+{ // source: SRR1686805
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@HWI-ST225:626:C2Y82ACXX:3:1304:7988:75799_2\n"
+ "AACA\n+\n$.%0\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("HWI-ST225:626:C2Y82ACXX:3:1304:7988:75799"), string(name, length));
+ REQUIRE(SequenceIsSecond(seq));
+}
+
+FIXTURE_TEST_CASE ( FastqDumpOutput, LoaderFixture )
+{ // VDB-2835 source: fastq-dump SRR000123
+ REQUIRE(CreateFileGetSequence(GetName(),
+ "@SRR000123.1 EXRHO8E16JTGUV length=157\n"
+ "TCAGTTTCGGGAACTATGTAAACAATACGCTAAGCGTGTTCTATGGTTTTACAATGTTCAGGATGGAAACATTGTAGGAGATAACAACCGAGAAGTATCGCTGCCTGTCGGCTGAGACACGCAACAGGGGATAGGCAAGGCACTACAGGGGATAGGN\n"
+ "+SRR000123.1 EXRHO8E16JTGUV length=157\n"
+ "=<:7F?)9F?)>3<=<===F?*<D:<<<=<:F>=<==:D;==;=D;LE8,49E<==E==;E===E<F at +==E<==<D=<8<=C;;A9 at 7;<9>6<<===<=<<A:8<:;C<<=<;<<<9<:=B;88GC6(6<<C==C=C=<=<&<9=GC7):<<B:!\n"
+ ));
+ REQUIRE_RC(SequenceGetSpotName(seq, &name, &length));
+ REQUIRE_EQ(string("SRR000123.1"), string(name, length));
+}
+
+
+// FIXTURE_TEST_CASE(Pacbio, LoaderFixture)
+// {
+ // REQUIRE(CreateFileGetSequence(GetName(),
+ // "@m120419_100821_42161_c100329130310000001523018509161273_s1_p0/11/2511_3149\n"
+ // "CTGCTTCTCCTGCTCTTCCTACTGTCCTCTCCCTGCTGTCGCTTCGCCCC\n"
+ // "TCGGTGGAGGCCGCGTTTGAGCGGCCGGTGTCCGCTGC\n"
+ // "+\n"
+ // "+*.,+*(,$+-.)**('#%*',*.*&,.(,$',,,($.,)#.-.-%'*#%\n"
+ // ",../*+*!.%!!-!/-&(.+.!.'!!//,/)!//!*-'\n"
+ // ));
+
+ // REQUIRE_RC(SequenceGetReadLength(seq, &readLength));
+ // REQUIRE_EQ(readLength, 88u);
+ // REQUIRE(MakeReadBuffer());
+ // REQUIRE_RC(SequenceGetRead(seq, read));
+ // REQUIRE_EQ(string(read, readLength), string("CTGCTTCTCCTGCTCTTCCTACTGTCCTCTCCCTGCTGTCGCTTCGCCCCTCGGTGGAGGCCGCGTTTGAGCGGCCGGTGTCCGCTGC"));
+
+ // REQUIRE_RC(SequenceGetQuality(seq, &quality, &qualityAsciiOffset, &qualityType));
+ // REQUIRE_NOT_NULL(quality);
+ // REQUIRE_EQ(qualityType, (int)QT_Phred);
+ // REQUIRE_EQ((unsigned int)qualityAsciiOffset, (unsigned int)phredOffset);
+ // REQUIRE_EQ(quality[0], (int8_t)'+');
+ // REQUIRE_EQ(quality[87], (int8_t)'\'');
+// }
+
+// @ERBRDQF01EGP9U
+// spot-name
+// spot-group
+// read-number
+// run-group
+// coords
+// fmt-name
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "wb-test-fastq";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ KConfigDisableUserSettings();
+ rc_t rc=FastqLoaderWbTestSuite(argc, argv);
+ return rc;
+}
+
+}
diff --git a/test/fuse/Makefile b/test/fuse/Makefile
new file mode 100644
index 0000000..d674e68
--- /dev/null
+++ b/test/fuse/Makefile
@@ -0,0 +1,79 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+runtests:
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/fuse
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# remote-fuser-test
+#
+REMOTE_FUSER_TEST_SRC = \
+ remote-fuser-test \
+ utils
+
+REMOTE_FUSER_TEST_OBJ = \
+ $(addsuffix .$(OBJX),$(REMOTE_FUSER_TEST_SRC))
+
+REMOTE_FUSER_TEST_LIB = \
+ -sncbi-vdb-static \
+ -skapp
+
+$(TEST_BINDIR)/remote-fuser-test: $(REMOTE_FUSER_TEST_OBJ)
+ $(LP) --exe -o $@ $^ $(REMOTE_FUSER_TEST_LIB)
+
+#-------------------------------------------------------------------------------
+# slowtests: match output vs sra-pileup
+#
+
+ifeq (linux,$(BUILD_OS))
+ ifneq (Ubuntu,$(OS_DISTRIBUTOR))
+slowtests: run-test
+
+run-test: $(TEST_BINDIR)/remote-fuser-test
+ @$(SRCDIR)/remote_fuser_test.sh standard 180 $(TARGDIR)/bin
+
+ else
+slowtests:
+ endif
+else
+slowtests:
+endif
+
+.PHONY: run-test
diff --git a/test/fuse/cfg/standard.cfg b/test/fuse/cfg/standard.cfg
new file mode 100644
index 0000000..02888a4
--- /dev/null
+++ b/test/fuse/cfg/standard.cfg
@@ -0,0 +1,26 @@
+###############################################################
+## Config file for remote_fuser_test.sh script
+## That is standard 'long' running test config file
+###############################################################
+
+## The test directory the directory where test will take place
+## It is all in one directory.
+##
+
+TEST_DIR="/panfs/pan1/trace_work/teamcity-tests/remote-fuser"
+
+## This is an URL to XML file with mount information
+##
+
+XML_URL="http://ftp-trace.ncbi.nlm.nih.gov/blast/db/cloud/LATEST/fuse.xml"
+
+## This vairable is optional. You may uncommet it if You need
+## to restrict used disk space by amount of GYGA BYTES.
+##
+
+# MAX_DISK_SPACE_GIG=100
+
+## This variable is a mail list to report a problem
+##
+
+MAIL_LIST="iskhakof"
diff --git a/test/fuse/kart-util.sh b/test/fuse/kart-util.sh
new file mode 100755
index 0000000..ebb067d
--- /dev/null
+++ b/test/fuse/kart-util.sh
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+P_NM=`basename $0`
+
+E_TAG="--extract"
+C_TAG="--create"
+
+usage ()
+{
+ cat << EOF
+
+That utility will create kart file or extract data from it.
+
+Syntax: $P_NM action source [ destination ]
+
+Where:
+
+ action - one of two "$E_TAG" or "$C_TAG"
+ source - source text or cart file
+ destination - destination text or cart file. Optional parameter.
+ if it is omitted, script will add or cut ".krt"
+ from source file.
+
+EOF
+
+}
+
+####
+####
+## Parsing Args
+##
+ACT_P=""
+EXT_P="_do_extract"
+CRE_P="_do_create"
+
+SRC_F=""
+SRC_S=0
+
+DST_F=""
+DST_S=0
+
+if [ $# -ne 2 -a $# -ne 3 ]
+then
+ echo ERROR: invalid arguments passed
+ usage
+ exit 1
+fi
+
+case $1 in
+ $E_TAG)
+ ACT_P=$EXT_P
+ ;;
+ $C_TAG)
+ ACT_P=$CRE_P
+ ;;
+ *)
+ echo ERROR: invalid action parameter passed
+ usage
+ exit 1
+ ;;
+esac
+
+SRC_F=$2
+SRC_S=`stat -c "%s" $SRC_F 2>/dev/null`
+if [ $? -ne 0 ]
+then
+ echo ERROR: can not stat file \'$SRC_F\'
+ exit 1
+fi
+
+DST_F=$3
+
+####
+####
+## Processing
+##
+
+MAGIC="ncbikart"
+
+_do_extract ()
+{
+ if [ -z "$SRC_F" ]
+ then
+ echo "ERROR: undefined 'source' file"
+ exit 1
+ fi
+
+ if [ -z "$DST_F" ]
+ then
+ DST_F=`dirname $SRC_F`/`basename $SRC_F .krt`.txt
+ fi
+
+ cat <<EOF
+Extracting kart information
+from: $SRC_F
+ to: $DST_F
+EOF
+ if [ -f "$DST_F" ]
+ then
+ echo "Removing baaad file '$DST_F'"
+ rm -f $DST_F
+ if [ $? -ne 0 ]
+ then
+ echo "ERROR: Can not remove file '$DST_F'"
+ exit 1
+ fi
+ fi
+
+ tail -c $(( $SRC_S - ${#MAGIC} )) $SRC_F | gunzip -c >$DST_F
+
+ ## There are header and footer, so ... simple check
+ LIN_Q=`cat $DST_F | wc -l`
+ if [ "$LIN_Q" -lt 2 ]
+ then
+ echo "WARNING: Invalid kart file format"
+ else
+ echo "EXTRACTED: $(( $LIN_Q - 1 )) entries"
+ fi
+}
+
+_do_create ()
+{
+ if [ -z "$SRC_F" ]
+ then
+ echo "ERROR: undefined 'source' file"
+ exit 1
+ fi
+
+ if [ -z "$DST_F" ]
+ then
+ DST_F=`dirname $SRC_F`/`basename $SRC_F .txt`.krt
+ fi
+
+ cat <<EOF
+Creating kart file
+from: $SRC_F
+ to: $DST_F
+EOF
+ if [ -f "$DST_F" ]
+ then
+ echo "Removing baaad file '$DST_F'"
+ rm -f $DST_F
+ if [ $? -ne 0 ]
+ then
+ echo "ERROR: Can not remove file '$DST_F'"
+ exit 1
+ fi
+ fi
+
+ echo -n $MAGIC > $DST_F
+ cat $SRC_F | gzip -c >> $DST_F
+}
+
+####
+####
+## Actrual processing is here
+##
+
+eval $ACT_P
+
+if [ $? -ne 0 ]
+then
+ echo "ERROR: something come wrong :("
+fi
+
+echo "DONE OK"
diff --git a/test/fuse/remote-fuser-test.c b/test/fuse/remote-fuser-test.c
new file mode 100644
index 0000000..7233dc2
--- /dev/null
+++ b/test/fuse/remote-fuser-test.c
@@ -0,0 +1,794 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "remote-fuser-test.vers.h" /* VDB_PASSWD_VERS */
+
+#include <sysalloc.h>
+#include <kapp/main.h> /* KMain */
+
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <kproc/lock.h>
+#include <kproc/thread.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+// #include "mutli.h"
+#include "utils.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <sys/time.h>
+#include <signal.h>
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/* Single File Test
+ */
+struct _SFTest {
+ const char * path;
+ uint64_t size;
+};
+
+static
+rc_t CC
+_SFTestDispose ( const struct _SFTest * self )
+{
+ struct _SFTest * Test = ( struct _SFTest * ) self;
+
+ if ( Test != NULL ) {
+ if ( Test -> path != NULL ) {
+ free ( ( char * ) Test -> path );
+
+ Test -> path = NULL;
+ }
+
+ Test -> size = 0;
+
+ free ( Test );
+ }
+
+ return 0;
+} /* _SFTestDispose () */
+
+static
+rc_t CC
+_SFTestMake ( const struct _SFTest ** Test, const char * Path )
+{
+ rc_t RCt;
+ struct _SFTest * Ret;
+ struct KDirectory * Dir;
+ uint32_t PathType;
+ uint64_t Size;
+
+ RCt = 0;
+ Ret = NULL;
+ Dir = NULL;
+ PathType = kptNotFound;
+ Size = 0;
+
+ if ( Test != NULL ) {
+ * Test = NULL;
+ }
+
+ if ( Test == NULL || Path == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ /* First we shoud check that file exist
+ */
+ RCt = KDirectoryNativeDir ( & Dir );
+ if ( RCt == 0 ) {
+ PathType = KDirectoryPathType ( Dir, Path );
+ if ( PathType == kptFile ) {
+ RCt = KDirectoryFileSize ( Dir, & Size, Path );
+ if ( Size == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+ }
+ else {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+ KDirectoryRelease ( Dir );
+ }
+
+ if ( RCt == 0 ) {
+ Ret = calloc ( 1, sizeof ( struct _SFTest ) );
+ if ( Ret == NULL ) {
+ RCt = RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ Ret -> path = string_dup_measure ( Path, NULL );
+ if ( Ret -> path == NULL ) {
+ RCt = RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ Ret -> size = Size;
+
+ * Test = Ret;
+ }
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * Test = NULL;
+
+ _SFTestDispose ( Ret );
+ }
+
+ return RCt;
+} /* _SFTestMake () */
+
+/* I am pushed to write that test fast, so nothing special. Just
+ * reading 32M blocks at random offset
+ */
+static
+rc_t CC
+_SFTestNewJob (
+ struct _SFTest * self,
+ int Iteration,
+ const char ** Name,
+ uint64_t * Offset,
+ size_t * Size
+)
+{
+ rc_t RCt;
+ size_t BS;
+ uint64_t Oko;
+
+ RCt = 0;
+ BS = 33554432;
+ Oko = 0;
+
+ if ( Name != NULL ) {
+ * Name = NULL;
+ }
+
+ if ( Offset != NULL ) {
+ * Offset = 0;
+ }
+
+ if ( Size != NULL ) {
+ * Size = 0;
+ }
+
+ if ( self == NULL || Name == NULL || Offset == NULL || Size == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ * Name = self -> path;
+
+ if ( self -> size < BS ) {
+ * Offset = 0;
+ * Size = self -> size;
+ }
+ else {
+ Oko = ( uint64_t ) ( self -> size / BS );
+ * Offset = ( rand () % Oko ) * BS;
+ * Size = BS;
+
+ if ( self -> size <= * Offset + BS ) {
+ * Size = self -> size - * Offset;
+ }
+ }
+
+ return RCt;
+} /* _SFTestNewJob () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/* Multiply Files Test
+ */
+struct _MFTest {
+ const struct _SFTest ** files;
+ size_t files_qty;
+};
+
+static
+rc_t CC
+_MFTestDispose ( const struct _MFTest * self )
+{
+ size_t llp;
+ struct _MFTest * Test;
+
+ llp = 0;
+ Test = ( struct _MFTest * ) self;
+
+ if ( Test != NULL ) {
+ if ( Test -> files != NULL ) {
+ for ( llp = 0; llp < Test -> files_qty; llp ++ ) {
+ _SFTestDispose ( self -> files [ llp ] );
+ }
+
+ free ( Test -> files );
+ }
+
+ Test -> files = NULL;
+ Test -> files_qty = 0;
+
+ free ( Test );
+ }
+
+ return 0;
+} /* _MFTestDispose () */
+
+static rc_t CC _MFTestLoadEntries (
+ struct _MFTest * self,
+ const char * Path
+ );
+
+static
+rc_t CC
+_MFTestMake ( const struct _MFTest ** Test, const char * Path )
+{
+ rc_t RCt;
+ struct _MFTest * Ret;
+
+ RCt = 0;
+ Ret = NULL;
+
+ if ( Test != NULL ) {
+ * Test = NULL;
+ }
+
+ if ( Test == NULL || Path == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ Ret = calloc ( 1, sizeof ( struct _MFTest ) );
+ if ( Ret == NULL ) {
+ RCt = RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ RCt = _MFTestLoadEntries ( Ret, Path );
+ if ( RCt == 0 ) {
+ * Test = Ret;
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * Test = NULL;
+
+ _MFTestDispose ( Ret );
+ }
+
+ return RCt;
+} /* _MFTestMake () */
+
+static
+rc_t CC
+_ReadAll ( const char * Path, char ** Buf, size_t * BufSize )
+{
+ rc_t RCt;
+ const struct KFile * File;
+ struct KDirectory * Dir;
+ char * RetBuf;
+ size_t Size, NumRead;
+
+ RCt = 0;
+ File = NULL;
+ Dir = NULL;
+ RetBuf = NULL;
+ Size = 0;
+ NumRead = 0;
+
+ RCt = KDirectoryNativeDir ( & Dir );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryFileSize ( Dir, & Size, Path );
+ if ( RCt == 0 ) {
+ if ( Size == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+ else {
+ RetBuf = calloc ( Size, sizeof ( char ) );
+ if ( RetBuf == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ RCt = KDirectoryOpenFileRead ( Dir, & File, Path );
+ if ( RCt == 0 ) {
+ RCt = KFileReadAll (
+ File,
+ 0,
+ RetBuf,
+ Size,
+ & NumRead
+ );
+ if ( RCt == 0 ) {
+ * Buf = RetBuf;
+ * BufSize = Size;
+ }
+ }
+ }
+ }
+ }
+
+ KDirectoryRelease ( Dir );
+ }
+
+ if ( RCt != 0 ) {
+ Buf = NULL;
+ BufSize = 0;
+
+ if ( RetBuf != NULL ) {
+ free ( RetBuf );
+ }
+ }
+
+ return RCt;
+} /* _ReadAll () */
+
+static
+rc_t CC
+_PaarseEntries ( struct _MFTest * self, char * Buf, size_t BufSize )
+{
+ rc_t RCt;
+ size_t NumLines;
+ const struct _SFTest ** Tests;
+ char * pS, * pE, * pC;
+ size_t llp;
+ const struct _SFTest * Test;
+
+ RCt = 0;
+ NumLines = 0;
+ Tests = 0;
+ pS = pE = pC = NULL;
+ llp = 0;
+ Test = NULL;
+
+ if ( self == NULL || Buf == NULL || BufSize == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ /* Fist we are going through buffer trying to define amount
+ * of lines
+ */
+ pS = pC = Buf;
+ pE = pS + BufSize;
+
+ while ( pC < pE ) {
+
+ if ( * pC == '\n' ) {
+ * pC = 0;
+ NumLines ++;
+ pS = pC + 1;
+ }
+
+ pC ++;
+ }
+
+ if ( pS < pC ) {
+ * pC = 0; /* Ha-ha, will write zero beyond boundary */
+ NumLines ++;
+ }
+
+ if ( NumLines == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ Tests = calloc ( NumLines, sizeof ( struct _SFTest * ) );
+ if ( Tests == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+
+ /* Here we are doing another pass to fill a foo
+ */
+ pS = pC = Buf;
+ pE = pS + BufSize;
+ llp = 0;
+ Test = 0;
+
+ while ( pC < pE ) {
+
+ if ( * pC == 0 ) {
+ RCt = _SFTestMake ( & Test, pS );
+ if ( RCt != 0 ) {
+ break;
+ }
+
+ Tests [ llp ] = Test;
+
+ llp ++;
+ pS = pC + 1;
+ }
+
+ pC ++;
+ }
+
+ if ( RCt == 0 ) {
+ if ( pS < pC ) {
+ RCt = _SFTestMake ( & Test, pS );
+ if ( RCt == 0 ) {
+ Tests [ llp ] = Test;
+ }
+ }
+ }
+
+ if ( RCt == 0 ) {
+ self -> files = Tests;
+ self -> files_qty = NumLines;
+ }
+ else {
+ self -> files = NULL;
+ self -> files_qty = 0;
+
+ if ( Tests != NULL ) {
+ for ( llp = 0; llp < NumLines; llp ++ ) {
+ _SFTestDispose ( Tests [ llp ] );
+ }
+ }
+ }
+
+ return RCt;
+} /* _PaarseEntries () */
+
+rc_t CC
+_MFTestLoadEntries ( struct _MFTest * self, const char * Path )
+{
+ rc_t RCt;
+ char * Buf;
+ size_t BufSize;
+
+ RCt = 0;
+ Buf = NULL;
+ BufSize = 0;
+
+ if ( self == NULL || Path == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ RCt = _ReadAll ( Path, & Buf, & BufSize );
+ if ( RCt == 0 ) {
+ RCt = _PaarseEntries ( self, Buf, BufSize );
+
+ free ( Buf );
+ }
+
+ return RCt;
+} /* _MFTestLoadEntries () */
+
+/* I am pushed to write that test fast, so nothing special. Just
+ * reading 32M blocks at random offset from random files
+ */
+static
+rc_t CC
+_MFTestNewJob (
+ struct _MFTest * self,
+ int Iteration,
+ const char ** Name,
+ uint64_t * Offset,
+ size_t * Size
+)
+{
+ rc_t RCt;
+ size_t BS;
+ uint64_t Oko;
+ const struct _SFTest * Test;
+
+ RCt = 0;
+ BS = 33554432;
+ Oko = 0;
+ Test = NULL;
+
+ if ( Name != NULL ) {
+ * Name = NULL;
+ }
+
+ if ( Offset != NULL ) {
+ * Offset = 0;
+ }
+
+ if ( Size != NULL ) {
+ * Size = 0;
+ }
+
+ if ( self == NULL || Name == NULL || Offset == NULL || Size == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ /* First we are going to choose righ path
+ */
+ Test = self -> files [ rand () % self -> files_qty ];
+
+ * Name = Test -> path;
+
+ if ( Test -> size < BS ) {
+ * Offset = 0;
+ * Size = Test -> size;
+ }
+ else {
+ Oko = ( uint64_t ) ( Test -> size / BS );
+ * Offset = ( rand () % Oko ) * BS;
+ * Size = BS;
+
+ if ( Test -> size <= * Offset + BS ) {
+ * Size = Test -> size - * Offset;
+ }
+ }
+
+ return RCt;
+} /* _MFTestNewJob () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+rc_t run_many_files ( int NumThr, int TumeRun, const char * Path )
+{
+ rc_t RCt;
+ const struct _MFTest * Test;
+ const struct XTasker * Tasker;
+
+ RCt = 0;
+ Test = NULL;
+ Tasker = NULL;
+
+ RCt = _MFTestMake ( & Test, Path );
+ if ( RCt == 0 ) {
+
+ RCt = XTaskerMake (
+ & Tasker,
+ NumThr,
+ ( void * ) Test,
+ ( Job4Task ) _MFTestNewJob
+ );
+ if ( RCt == 0 ) {
+
+ printf (
+ "Run test in [%d] threads on [%lu] files\n",
+ NumThr,
+ Test -> files_qty
+ );
+
+ XTaskerRun ( Tasker, TumeRun * 60 );
+
+ XTaskerDispose ( Tasker );
+ }
+
+ _MFTestDispose ( Test );
+ }
+
+ return RCt;
+} /* run_many_files () */
+
+static
+rc_t run_single_file ( int NumThr, int TumeRun, const char * Path )
+{
+ rc_t RCt;
+ const struct _SFTest * Test;
+ const struct XTasker * Tasker;
+
+ RCt = 0;
+ Test = NULL;
+ Tasker = NULL;
+
+ RCt = _SFTestMake ( & Test, Path );
+ if ( RCt == 0 ) {
+
+ RCt = XTaskerMake (
+ & Tasker,
+ NumThr,
+ ( void * ) Test,
+ ( Job4Task ) _SFTestNewJob
+ );
+ if ( RCt == 0 ) {
+ printf (
+ "Run test in [%d] threads on [single] file\n",
+ NumThr
+ );
+
+ XTaskerRun ( Tasker, TumeRun * 60 );
+
+ XTaskerDispose ( Tasker );
+ }
+
+ _SFTestDispose ( Test );
+ }
+
+ return RCt;
+} /* run_single_file () */
+
+/******************************************************************************/
+
+static
+rc_t run ( int NumThr, int TumeRun, const char * Path, bool IsList )
+{
+ rc_t RCt = 0;
+
+ if ( IsList ) {
+ /* Here we are reading list */
+ RCt = run_many_files ( NumThr, TumeRun, Path );
+ }
+ else {
+ RCt = run_single_file ( NumThr, TumeRun, Path );
+ /* This is a single file case */
+ }
+
+
+ return RCt;
+}
+
+ver_t CC KAppVersion(void) { return REMOTE_FUSER_TEST_VERS; }
+
+/* Here I will temporarily parce arguments, and will attach
+ * toolkit ones later ... test program :)
+ */
+#define MAX_PATH_SIZE 1234
+
+char ProgramName [ MAX_PATH_SIZE ];
+
+const static char * NumThrTag = "-t";
+const static char * NumThrDsc = "num_threads";
+#define NUM_THR_DEF 16
+static int NumThr = NUM_THR_DEF;
+
+static char * RunTimeTag = "-r";
+static char * RunTimeDsc = "run_time";
+#define RUN_TIME_DEF 180
+static int RunTime = RUN_TIME_DEF;
+
+static char * ListTag = "-l";
+bool PathIsList = false;
+
+char FilePath [ MAX_PATH_SIZE ];
+
+static
+void
+RightUsage()
+{
+ printf ( "\nThat program will test 'remote-fuser' application. It implements two types\n" );
+ printf ( "of test : multiply access to single file and multiply acces to many files\n" );
+ printf ( "\n" );
+ printf ( "Ussage: %s [ %s %s ] [ %s %s ] [%s] path\n\n",
+ ProgramName, NumThrTag, NumThrDsc,
+ RunTimeTag, RunTimeDsc, ListTag
+ );
+ printf ( "Where:\n\n" );
+ printf ( "%s - num threads to run, optional, default %d\n", NumThrDsc, NUM_THR_DEF );
+ printf ( " %s - time minutes to run, optional, default %d\n", RunTimeDsc, RUN_TIME_DEF );
+ printf ( " %s - flag that show that path is a list file for multiply access test\n", ListTag );
+ printf ( " path - path to file ( single or list )\n" );
+ printf ( "\n" );
+} /* RightUsage() */
+
+static
+bool
+ParseArgs ( int argc, char ** argv )
+{
+ const char * PPU;
+ int llp;
+
+ PPU = NULL;
+ llp = 0;
+
+ PPU = strrchr ( * argv, '/' );
+ if ( PPU == NULL ) {
+ PPU = * argv;
+ }
+ strcpy ( ProgramName, PPU );
+
+ * FilePath = 0;
+
+ for ( llp = 1; llp < argc; llp ++ ) {
+
+ PPU = argv [ llp ];
+ if ( * PPU == '-' ) {
+
+ if ( strcmp ( NumThrTag, PPU ) == 0 ) {
+ if ( argc - 1 <= llp ) {
+ printf ( "ERROR : parameter [%s] requests an argument\n", NumThrTag );
+ return false;
+ }
+
+ llp ++;
+ if ( ( NumThr = atol ( argv [ llp ] ) ) == 0 ) {
+ printf ( "ERROR : invalid parameter [%s] value [%s]\n", NumThrTag, argv [ llp ] );
+ }
+
+ continue;
+ }
+
+ if ( strcmp ( RunTimeTag, PPU ) == 0 ) {
+ if ( argc - 1 <= llp ) {
+ printf ( "ERROR : parameter [%s] requests an argument\n", RunTimeTag );
+ return false;
+ }
+
+ llp ++;
+ if ( ( RunTime = atol ( argv [ llp ] ) ) == 0 ) {
+ printf ( "ERROR : invalid parameter [%s] value [%s]\n", RunTimeTag, argv [ llp ] );
+ }
+
+ continue;
+ }
+
+ if ( strcmp ( ListTag, PPU ) == 0 ) {
+ PathIsList = true;
+
+ continue;
+ }
+
+ printf ( "ERROR : unknown parameter [%s]\n", PPU );
+ return false;
+ }
+ else {
+ strcpy ( FilePath, PPU );
+ break;
+ }
+ }
+
+ if ( * FilePath == 0 ) {
+ printf ( "ERROR : no path passed\n" );
+ return false;
+ }
+
+ if ( 48 <= NumThr ) {
+ printf ( "ERROR : invalide amount of threads passed [%d], should be less than 48\n", NumThr );
+ return false;
+ }
+
+ if ( RunTime < 2 ) {
+ printf ( "ERROR : invalide amount of run time passed [%d], should be greater than 2\n", RunTime );
+ return false;
+ }
+
+ return true;
+} /* ParseArgs() */
+
+
+const char UsageDefaultName[] = "Henri Fuseli";
+rc_t CC UsageSummary (const char* progname) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+
+rc_t CC KMain(int argc, char *argv[]) {
+
+
+ if ( ! ParseArgs ( argc, argv ) ) {
+ RightUsage();
+ return 1;
+ }
+
+ if ( signal ( SIGINT, XTaskerSigIntHandler ) == SIG_ERR ) {
+ printf ( "Can not instal signal handlers\n" );
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ }
+
+ return run ( NumThr, RunTime, FilePath, PathIsList );
+}
diff --git a/test/fuse/remote-fuser-test.vers b/test/fuse/remote-fuser-test.vers
new file mode 100644
index 0000000..8acdd82
--- /dev/null
+++ b/test/fuse/remote-fuser-test.vers
@@ -0,0 +1 @@
+0.0.1
diff --git a/test/fuse/remote-fuser-test.vers.h b/test/fuse/remote-fuser-test.vers.h
new file mode 100644
index 0000000..625fe28
--- /dev/null
+++ b/test/fuse/remote-fuser-test.vers.h
@@ -0,0 +1 @@
+#define REMOTE_FUSER_TEST_VERS 0x00000001
diff --git a/test/fuse/remote_fuser_clean.sh b/test/fuse/remote_fuser_clean.sh
new file mode 100755
index 0000000..e54550e
--- /dev/null
+++ b/test/fuse/remote_fuser_clean.sh
@@ -0,0 +1,404 @@
+#!/bin/bash
+
+ulimit -c unlimited
+
+#####################################################################
+## Lyrics:
+##
+## The goal of that script is to clean data leftovers, run away fuser
+## processes, and report if here is any problem
+##
+## That script has one parameter :
+##
+## config_name : it will try to find configuration file
+## cfg/config_name.cfg ( optional )
+## default config name is 'standard'
+##
+#####################################################################
+
+## Where we are, who we are?
+##
+SCR_DIR=`dirname $0`
+SCR_DIR=`cd $SCR_DIR; pwd`
+
+SCR_NAME=`basename $0`
+SCR_SNAME=`basename $0 .sh`
+
+## Loading common things to live
+##
+CMN_SCR="$SCR_DIR/remote_fuser_common.sh"
+if [ ! -f "$CMN_SCR" ]
+then
+ echo "ERROR: Can not stat script '$CMN_SCR' ... exiting"
+ exit 1
+fi
+
+. $CMN_SCR
+
+#####################################################################
+##
+## Simple setup : directory
+##
+## TEST_DIR ---/ USER ---/ HOST ---/ PID ---/ cache_dir /
+## |-/ logs |-/ mount_point /
+## |-/ bin |-/ tmp_dir /
+## |-/ depot |-/ status_file
+##
+## depot - directory with test binaries, just a history
+## bin - test binaries in work
+## status_file - says a lot ... but heart-bot
+##
+## It is checking USER/HOST directory for PID and clean unused.
+## If there is a process which is unable to kill, it will be reported
+## to MAIL_LIST from config file
+##
+#####################################################################
+
+## Config file
+##
+CFG_DIR=$SCR_DIR/cfg
+if [ ! -d "$CFG_DIR" ]
+then
+ _err_exit "Can not stat directory '$CFG_DIR'"
+fi
+
+####
+## Here the usage and Arguments processing
+#
+CFG_NAME_DEF="standard"
+CFG_NAME=$CFG_NAME_DEF
+
+usage ( )
+{
+ cat >&2 <<EOF
+
+This script will remove unused test data for remote_fuser utility.
+
+Syntax is :
+
+ $SCR_NAME [ config_name ]
+
+Where :
+
+ config_name - name of config to use.
+ String. Optional. Default "$CFG_NAME_DEF"
+
+EOF
+}
+
+case $# in
+ 0)
+ ;;
+ 1)
+ CFG_NAME=$1
+ ;;
+ *)
+ usage
+ _err_exit Invalid parameters
+ ;;
+esac
+
+## Checking arguments
+##
+CFG_FILE=$CFG_DIR/${CFG_NAME}.cfg
+if [ ! -f "$CFG_FILE" ]
+then
+ _err_exit "Can not stat config file with name '$CFG_NAME'"
+fi
+
+####
+## Loading fonfig file
+#
+. $CFG_FILE
+if [ $? -ne 0 ]
+then
+ _err_exit "Can not load config file '$CFG_NAME'"
+fi
+
+####
+## Checking config file data and prepareing environment
+#
+if [ -z "$TEST_DIR" ]
+then
+ _err_exit "Config does not have definition for variable TEST_DIR"
+fi
+
+if [ ! -d "$TEST_DIR" ]
+then
+ _err_exit "Can not stat directory '$TEST_DIR'"
+fi
+
+###
+### Prefixes U_(ser), H_(ost), P_(rocess), F_(inal) - is what we use
+###
+
+_assign_create_dir ()
+{
+ if [ $# -ne 2 ]
+ then
+ _err_exit "_assign_create_dir(): requires two arguments"
+ fi
+
+ DVAL=$1
+ if [ ! -d "$DVAL" ]
+ then
+ _msg "Creating directory '$DVAL'"
+ _exec mkdir $DVAL
+ _exec chmod ugoa+rwx $DVAL
+ fi
+
+ DVAL=`cd $DVAL; pwd`
+
+ eval "$2=$DVAL"
+}
+
+###
+## There are logs, bin and depot on user level of test direcotry
+#
+_assign_create_dir $TEST_DIR/$DAS_USER U_TEST_DIR
+_assign_create_dir $U_TEST_DIR/$DAS_HOST H_TEST_DIR
+
+_assign_create_dir $U_TEST_DIR/log F_LOG_DIR
+
+F_VALID="cache mount status.file temp"
+U_VALID="bin depot log"
+
+## Here we are logging and execing
+##
+F_TIME_STAMP=`date +%Y-%m-%d_%H-%M-%S`
+F_LOG_FILE=$F_LOG_DIR/${SCR_SNAME}.log.${DAS_CTX}.${F_TIME_STAMP}
+echo Log file: $F_LOG_FILE
+
+exec >$F_LOG_FILE 2>&1
+
+## One more time for log file
+##
+_print_env $@
+
+####
+### OLD LOGS
+##
+#
+_bump
+_msg OLD LOGS
+
+## Here we are clearing old logs
+##
+DAYS_KEEP_LOG=10
+
+SEC_IN_DAY=$(( 60 * 60 * 24 ))
+NOW_DAY=$(( `date +%s` / $SEC_IN_DAY ))
+
+check_remove ()
+{
+ F2R=$1
+
+ if [ -n "$F2R" ]
+ then
+ FILE_DAY=$(( `stat --print="%X" $F2R` / $SEC_IN_DAY ))
+ DALT=$(( $NOW_DAY - $FILE_DAY ))
+ if [ $DAYS_KEEP_LOG -le $DALT ]
+ then
+ _msg Log file is $DALT days old, removing \'$F2R\'
+ rm -f $F2R
+ if [ $? -ne 0 ]
+ then
+ _wrn Can not remove file \'$F2R\'
+ fi
+ fi
+ fi
+}
+
+clear_old_logs ()
+{
+ _msg Cleaning old logs ...
+
+ for i in `ls $F_LOG_DIR 2>/dev/null`
+ do
+ check_remove $F_LOG_DIR/$i
+ done
+}
+
+clear_old_logs
+
+_msg OLD LOGS DONE
+
+####
+### OLD FUSES
+##
+#
+_bump
+_msg OLD FUSES
+
+_remove_dir ()
+{
+ D2R=$1
+
+ if [ -d "$D2R" ]
+ then
+ _exec_plain rm -rf $D2R
+ if [ $? -ne 0 ]
+ then
+ _msg Failed to remove directory $D2R
+ sleep 3
+ _exec_plain rm -rf $D2R
+ if [ $? -ne 0 ]
+ then
+ INVALID_FUSES[${#INVALID_FUSES[*]}]="CAN NOT REMOVE: $D2R"
+ fi
+ fi
+ fi
+}
+
+_clean_data_for_pid ()
+{
+ DPD=$1
+
+ _msg "<=================================>"
+ _msg Cleaning data for PID = $DPD
+
+ F_TEST_DIR=$H_TEST_DIR/$DPD
+
+ ## First we are trying to read data from status file
+ ##
+
+ unset F_PID
+ unset F_MNT
+ ST_FL=$F_TEST_DIR/status.file
+ if [ -f $ST_FL ]
+ then
+ _load_fuser_params $ST_FL F_PID F_MNT
+ else
+ F_MNT=$F_TEST_DIR/mount
+ fi
+
+ if [ -n "$F_PID" ]
+ then
+ _shutdown_fuser $F_PID $F_MNT
+ if [ $? -ne 0 ]
+ then
+ ## Failed to shutdown
+ INVALID_FUSES[${#INVALID_FUSES[*]}]="STIL RUN: PID=$F_PID MPOINT=$F_MNT"
+ else
+ _remove_dir $F_TEST_DIR
+ fi
+ else
+ _check_dir_mounted $F_MNT
+ if [ $? -eq 0 ]
+ then
+ /bin/fusermount -u $F_MNT
+
+ _check_dir_mounted $F_MNT
+ if [ $? -eq 0 ]
+ then
+ INVALID_FUSES[${#INVALID_FUSES[*]}]="STIL RUN: MPOINT=$F_MNT"
+ else
+ _remove_dir $F_TEST_DIR
+ fi
+ else
+ _remove_dir $F_TEST_DIR
+ fi
+ fi
+}
+
+_clean_test_data ()
+{
+ DPD=$1
+
+ ps -p $DPD > /dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ _msg Process with PID = $DPD is still running
+ return
+ fi
+
+ _clean_data_for_pid $DPD
+}
+
+for i in ` ls $H_TEST_DIR 2>/dev/null `
+do
+ _clean_test_data $i
+done
+
+####
+### SANITY CHECK
+##
+#
+_bump
+_msg SANITY CHECK
+
+_check_sanity ()
+{
+ N2C=$1
+
+ for i in $U_VALID
+ do
+ if [ "$i" == "$N2C" ]
+ then
+ return 0
+ fi
+ done
+
+ /usr/bin/nslookup $N2C >/dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ return 0
+ fi
+
+ return 1
+}
+
+_check_sanity_remove ()
+{
+ SDR=$1
+
+ ENT=$U_TEST_DIR/$SDR
+
+ _check_sanity $SDR
+ if [ $? -eq 0 ]
+ then
+ _msg LEGIT: $ENT
+ else
+ _msg REMOVING: $ENT
+ _exec_plain rm -rf $ENT
+ if [ $? -ne 0 ]
+ then
+ _msg Failed to remove $ENT
+ sleep 3
+ _msg Another attempt to remove $ENT
+ _exec_plain rm -rf $ENT
+ if [ $? -ne 0 ]
+ then
+ INVALID_FUSES[${#INVALID_FUSES[*]}]="CAN NOT REMOVE: $ENT"
+ fi
+ fi
+ fi
+}
+
+for i in ` ls $U_TEST_DIR 2>/dev/null `
+do
+ _check_sanity_remove $i
+done
+
+####
+### REPORTING EXITING
+##
+#
+_bump
+_msg CLEANING COMPLETED
+
+PQT=${#INVALID_FUSES[*]}
+
+_msg FOUND $PQT PROBLEMS
+
+if [ $PQT -ne 0 ]
+then
+ CNT=0
+ while [ $CNT -lt $PQT ]
+ do
+ CNT=$(( $CNT + 1 ))
+ _msg " $CNT: ${INVALID_FUSES[$CNT]}"
+ done
+fi
+
+_msg BYE ...
diff --git a/test/fuse/remote_fuser_common.sh b/test/fuse/remote_fuser_common.sh
new file mode 100644
index 0000000..0cff2bc
--- /dev/null
+++ b/test/fuse/remote_fuser_common.sh
@@ -0,0 +1,282 @@
+#!/bin/bash
+
+ulimit -c unlimited
+
+#####################################################################
+## That file contains common methods and variables for remote-fuser
+## test scripts
+#####################################################################
+
+###
+## Some impoertants
+#
+DAS_PID=$$
+
+DAS_HOST=$HOSTNAME
+if [ -z "$DAS_HOST" ]
+then
+ DAS_HOST=`hostname 2>/dev/null`
+ if [ -z "$DAS_HOST" ]
+ then
+ DAS_HOST="unknown-host"
+ fi
+fi
+
+DAS_USER=$USER
+if [ -z "$DAS_USER" ]
+then
+ DAS_USER=`id -n -u`
+ if [ -z "$DAS_USER" ]
+ then
+ DAS_USER="unknown-user"
+ fi
+fi
+
+DAS_CTX=${DAS_HOST}.${DAS_PID}
+
+DAS_TSTAMP=`date +%Y-%m-%d_%H-%M-%S`
+
+####
+## Environment: Jy's a mal naaier maar ek hou van jou baie
+#
+
+_print_env ()
+{
+ for i in @ DAS_PID USER REMOTE_USER DAS_USER HOME HOST HOSTNAME DAS_HOST HOSTTYPE
+ do
+ echo "[$i] [${!i}]"
+ done
+ echo "[groups] [`groups`]"
+}
+
+_print_env $@
+
+####
+## Some interesting stuff
+#
+
+_bump ()
+{
+ echo ""
+ echo "####################################################################"
+ echo "####################################################################"
+ echo "##"
+ echo "## `date`"
+ echo "##"
+ echo "####################################################################"
+}
+
+_msg ( )
+{
+ echo "INF[$SCR_SNAME][`date +%Y-%m-%d_%H:%M:%S`] $@"
+}
+
+_wrn ( )
+{
+ echo "WRN[$SCR_SNAME][`date +%Y-%m-%d_%H:%M:%S`] $@" >&2
+}
+
+_err ( )
+{
+ echo "ERR[$SCR_SNAME][`date +%Y-%m-%d_%H:%M:%S`] $@" >&2
+}
+
+_err_exit ( )
+{
+ _err $@
+ _err Exiting ...
+ exit 1
+}
+
+_exec_plain ()
+{
+ CDM="$@"
+ _msg "## $CDM"
+ eval "$CDM"
+
+ return $?
+}
+
+_exec ()
+{
+ CDM="$@"
+ _msg "## $CDM"
+ eval "$CDM"
+ if [ $? -ne 0 ]
+ then
+ _err_exit "FAILED: $CDM"
+ fi
+}
+
+## Syntax : _assign_create_dir path_to_dir VARIABLE_NAME_TO_ASSIGN
+##
+_assign_create_dir ()
+{
+ if [ $# -ne 2 ]
+ then
+ _err_exit "_assign_create_dir(): requires two arguments"
+ fi
+
+ DVAL=$1
+ if [ ! -d "$DVAL" ]
+ then
+ _msg "Creating directory '$DVAL'"
+ _exec mkdir $DVAL
+ _exec chmod ugoa+rwx $DVAL
+ fi
+
+ DVAL=`cd $DVAL; pwd`
+
+ eval "$2=$DVAL"
+}
+
+## Here we are checking that two pathes points to the same directory
+##
+_same_dir ()
+{
+ if [ $# -ne 2 ]
+ then
+ _err_exit "_same_dir(): requires two arguments"
+ fi
+
+ N1=`basename $1`
+ N2=`basename $2`
+ if [ "$N1" == "$N2" ]
+ then
+ N1=`dirname $1`
+ N2=`dirname $2`
+ if [ "$N1" -ef "$N2" ]
+ then
+ return 0
+ fi
+ fi
+
+ return 1
+}
+
+## Checking that path is in mtab, returns 0 if dir mounted and used
+## Syntax: _check_dir_mounted path_to_dir
+##
+_check_dir_mounted ()
+{
+ ## We are simple not check an mount directory.
+ for i in `mount | awk ' { print $3 } ' `
+ do
+ _same_dir $1 $i
+ if [ $? -eq 0 ]
+ then
+ _msg "Mount point is in use '$1'"
+ return 0
+ fi
+ done
+
+ _msg "Mount point is not in use '$1'"
+ return 1
+}
+
+###
+## Various FUSE checks
+#
+
+## Stores fuser PID and MountPoint to file
+## Syntax: _store_fuser_params path PID MOUNT_POINT
+_store_fuser_params ()
+{
+ cat>$1 <<EOF
+pid = $2
+mount_point = $3
+EOF
+}
+
+## Read fuser PID and MountPoint from file
+## Syntax: _load_fuser_params path PID MOUNT_POINT
+_load_fuser_params ()
+{
+ RPD=`grep pid $1 | tail -n 1 | sed "s#=# #1" | awk ' { print int ( $2 ); } ' `
+ RMP=`grep mount_point $1 | tail -n 1 | sed "s#=# #1" | awk ' { print $2; } ' `
+ eval "$2=$RPD"
+ eval "$3=$RMP"
+}
+
+## Check that there is a process with such a PID or mount in use
+## Syntax: _is_fuser_run FUSE_PID MOUNT_POINT
+##
+_is_fuser_run ()
+{
+ FUP=$1
+ if [ -n "$FUP" ]
+ then
+ ps -p $FUP >/dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ _wrn PROCESS WITH PID = $FUP EXISTS
+ return 0
+ fi
+ fi
+
+ MOP=$2
+ _check_dir_mounted $MOP
+ if [ $? -eq 0 ]
+ then
+ _wrn MOUNT to \'$MOP\' STILL EXISTS
+ return 0
+ fi
+
+ return 1
+}
+
+## Shutdown fuser. Returns 0 if it is success
+## Syntax: _shutdown_fuser PID MOUNT_POINT
+##
+_shutdown_fuser ()
+{
+ _err Shutdown FUSER and exit
+ ## Check if there is still mount
+ ##
+
+ MPO=$2
+ _check_dir_mounted $MPO
+ if [ $? -eq 0 ]
+ then
+ /bin/fusermount -u $MPO
+ fi
+
+ sleep 1
+
+ ## Check that process is still in the memory
+ ##
+ FPI=$1
+ if [ -n "$FPI" ]
+ then
+ ps -p $FPI >/dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ _err Killing FUSER process $FPI mounted on $MPO
+ kill -9 $FPI
+ fi
+ fi
+
+ sleep 3
+
+ if [ -n "$FPI" ]
+ then
+ ps -p $FPI >/dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ _err Failed to shutdown FUSER process $FPI mounted on $MPO
+ return 1
+ fi
+ fi
+
+ _check_dir_mounted $MPO
+ if [ $? -eq 0 ]
+ then
+ _err Failed to shutdown FUSER process $FPI mounted on $MPO
+ return 1
+ fi
+
+ _err FUSER process $FPI was shut down
+
+ return 0
+}
+
diff --git a/test/fuse/remote_fuser_test.sh b/test/fuse/remote_fuser_test.sh
new file mode 100755
index 0000000..21af667
--- /dev/null
+++ b/test/fuse/remote_fuser_test.sh
@@ -0,0 +1,516 @@
+#!/bin/bash
+
+ulimit -c unlimited
+
+#####################################################################
+## Lyrics:
+##
+## That script has three parameters:
+##
+## config_name : it will try to find configuration file
+## cfg/config_name.cfg ( optional )
+## default config name is 'standard'
+## time_minutes : run time of script in minutes ( optional )
+## default time is 180 minutes
+## bin_directory : place where binary files like remote-fuser
+## etc are located ( mandatory )
+##
+#####################################################################
+
+## Where we are, who we are?
+##
+SCR_DIR=`dirname $0`
+SCR_DIR=`cd $SCR_DIR; pwd`
+
+SCR_NAME=`basename $0`
+SCR_SNAME=`basename $0 .sh`
+
+## Loading common things to live
+##
+CMN_SCR="$SCR_DIR/remote_fuser_common.sh"
+if [ ! -f "$CMN_SCR" ]
+then
+ echo "ERROR: Can not stat script '$CMN_SCR' ... exiting"
+ exit 1
+fi
+
+. $CMN_SCR
+
+#####################################################################
+##
+## Simple setup : directory
+##
+## TEST_DIR ---/ USER ---/ HOST ---/ PID ---/ cache_dir /
+## |-/ logs |-/ mount_point /
+## |-/ bin |-/ tmp_dir /
+## |-/ depot |-/ status_file
+##
+## depot - directory with test binaries, just a history
+## bin - test binaries in work
+## status_file - says a lot ... but heart-bot
+##
+#####################################################################
+
+## Config file
+##
+CFG_DIR=$SCR_DIR/cfg
+if [ ! -d "$CFG_DIR" ]
+then
+ _err_exit "Can not stat directory '$CFG_DIR'"
+fi
+
+####
+## Here the usage and Arguments processing
+#
+CFG_NAME_DEF="standard"
+CFG_NAME=$CFG_NAME_DEF
+
+RUN_TIME_DEF=180
+RUN_TIME=$RUN_TIME_DEF
+
+BIN_DIR=""
+
+usage ( )
+{
+ cat >&2 <<EOF
+
+This script will test remote_fuser utility.
+
+Syntax is :
+
+ $SCR_NAME [ config_name ] [ run_time ] binary_directory
+
+Where :
+
+ config_name - name of config to use.
+ String. Optional. Default "$CFG_NAME_DEF"
+ run_time - time to run script.
+ Integer. Optional. Default "$RUN_TIME_DEF"
+ binary_directory - directory which contains executables, like
+ remote-fuser, remote-fuser-reader, etc
+
+EOF
+}
+
+_qualify ()
+{
+ VAL=$1
+
+ if [ -z "$VAL" ]
+ then
+ _err_exit "qualify(): missed parameter"
+ fi
+
+## Simple, if it is number, it is time, overwise it is config name
+##
+ if [[ $VAL != *[!0-9]* ]]
+ then
+ RUN_TIME=$VAL
+ else
+ CFG_NAME=$VAL
+ fi
+}
+
+case $# in
+ 3)
+ _qualify $1
+ _qualify $2
+ BIN_DIR=$3
+ ;;
+ 2)
+ _qualify $1
+ BIN_DIR=$2
+ ;;
+ 1)
+ BIN_DIR=$1
+ ;;
+ *)
+ usage
+ _err_exit Invalid parameters
+ ;;
+esac
+
+## Checking arguments
+##
+CFG_FILE=$CFG_DIR/${CFG_NAME}.cfg
+if [ ! -f "$CFG_FILE" ]
+then
+ _err_exit "Can not stat config file with name '$CFG_NAME'"
+fi
+
+## Checking RUN_TIME ... it should not be less than 3 minutes
+##
+if [ $RUN_TIME -le 3 ]
+then
+ _err_exit "Run time parameter should be greater than 3 minutes"
+fi
+
+## Checking BIN_DIR and binaries
+##
+if [ ! -d "$BIN_DIR" ]
+then
+ _err_exit "Can not stat BIN_DIR directory '$BIN_DIR'"
+fi
+
+BIN_DIR=$BIN_DIR/../bin
+if [ ! -d "$BIN_DIR" ]
+then
+ _err_exit "Can not stat BIN_DIR directory '$BIN_DIR'"
+fi
+BIN_DIR=`cd $BIN_DIR; pwd`
+
+TESTBIN_DIR=$BIN_DIR/../test-bin
+if [ ! -d "$TESTBIN_DIR" ]
+then
+ _err_exit "Can not stat TESTBIN_DIR directory '$TESTBIN_DIR'"
+fi
+TESTBIN_DIR=`cd $TESTBIN_DIR; pwd`
+
+####
+## Loading fonfig file
+#
+. $CFG_FILE
+if [ $? -ne 0 ]
+then
+ _err_exit "Can not load config file '$CFG_NAME'"
+fi
+
+####
+## Checking config file data and prepareing environment
+#
+if [ -z "$TEST_DIR" ]
+then
+ _err_exit "Config does not have definition for variable TEST_DIR"
+fi
+
+if [ ! -d "$TEST_DIR" ]
+then
+ _err_exit "Can not stat directory '$TEST_DIR'"
+fi
+
+###
+### Prefixes U_(ser), H_(ost), P_(rocess), F_(inal) - is what we use
+###
+
+_assign_create_dir $TEST_DIR/$DAS_USER U_TEST_DIR
+_assign_create_dir $U_TEST_DIR/$DAS_HOST H_TEST_DIR
+_assign_create_dir $H_TEST_DIR/$DAS_PID P_TEST_DIR
+
+###
+## There are logs, bin and depot on user level of test direcotry
+#
+_assign_create_dir $U_TEST_DIR/bin F_BIN_DIR
+_assign_create_dir $U_TEST_DIR/depot F_DEPOT_DIR
+_assign_create_dir $U_TEST_DIR/log F_LOG_DIR
+
+###
+## There are cache, mount and temp on process level of test direcotry
+#
+_assign_create_dir $P_TEST_DIR/cache F_CACHE_DIR
+_assign_create_dir $P_TEST_DIR/mount F_MOUNT_DIR
+_assign_create_dir $P_TEST_DIR/temp F_TEMP_DIR
+
+F_STATUS_FILE=$P_TEST_DIR/status.file
+
+## Checking mounts and old logs are moved to outside script
+##
+
+## Here we are logging and execing
+##
+F_LOG_FILE=$F_LOG_DIR/${SCR_SNAME}.log.${DAS_CTX}.${DAS_TSTAMP}
+echo Log file: $F_LOG_FILE
+
+exec >$F_LOG_FILE 2>&1
+
+## One more time for log file
+##
+_print_env $@
+
+## Cleaning old data
+##
+_bump
+_msg Cleaning old data
+
+CLN_CMD="$SCR_DIR/remote_fuser_clean.sh"
+if [ -f "$CLN_CMD" ]
+then
+ nohup $CLN_CMD $CFG_NAME &
+fi
+
+## Here we are copying binaries
+##
+_copy_assign_app ()
+{
+ if [ $# -ne 3 ]
+ then
+ _err_exit "_copy_assign_app(): requires two arguments"
+ fi
+
+ SRC=$1/$2
+ if [ ! -x "$SRC" ]
+ then
+ _err_exit "_copy_assign_app(): can not stat file '$SRC'"
+ fi
+
+ LNK=$F_BIN_DIR/$2
+
+ eval cmp $SRC $LNK
+ if [ $? -ne 0 ]
+ then
+ DST=$F_DEPOT_DIR/${2}.${DAS_TSTAMP}
+ _exec cp -p $SRC $DST
+ _exec rm -f $LNK
+ _exec ln -s $DST $LNK
+ fi
+
+ eval "$3=$LNK"
+}
+
+_copy_assign_app $BIN_DIR remote-fuser REMOTE_FUSER_APP
+_copy_assign_app $TESTBIN_DIR remote-fuser-test REMOTE_FUSER_TEST_APP
+
+###
+## Here we are checking and pre-processing XML file
+#
+if [ -z "$XML_URL" ]
+then
+ _err_exit "Config does not have definition for variable XML_URL"
+fi
+
+eval HEAD "$XML_URL" >/dev/null
+if [ $? -ne 0 ]
+then
+ _err_exit "Can not stat XML file from '$XML_URL'"
+fi
+
+F_FUSE_XML=$F_TEMP_DIR/FUSE.xml.${DAS_CTX}.${DAS_TSTAMP}
+eval GET "$XML_URL" >$F_FUSE_XML
+if [ $? -ne 0 ]
+then
+ _err_exit "Can not download XML file from '$XML_URL'"
+fi
+
+###
+## Here we are starting FUSER
+#
+_msg Starting Fuse
+
+FUSER_LOG=$F_LOG_DIR/remote-fuser.log.${DAS_CTX}.${DAS_TSTAMP}
+FUSER_CMD="$REMOTE_FUSER_APP -d -x $XML_URL -m $F_MOUNT_DIR -e $F_CACHE_DIR -L 5 -B 4 -o kernel_cache"
+
+_msg "## $FUSER_CMD"
+$FUSER_CMD >$FUSER_LOG 2>&1 &
+FUSER_PID=$!
+
+## Because!
+
+_store_fuser_params $F_STATUS_FILE $FUSER_PID $F_MOUNT_DIR
+
+_clear_data ()
+{
+ _msg "Removing test data"
+
+ _exec_plain rm -rf $P_TEST_DIR
+ if [ $? -ne 0 ]
+ then
+ _err "Can not remove test data"
+
+ sleep 2
+
+ _msg "Removing test data attempt 2"
+
+ _exec_plain rm -rf $P_TEST_DIR
+ if [ $? -ne 0 ]
+ then
+ _err "Can not remove test data"
+ return 1
+ fi
+ fi
+
+ _msg "Test data removed"
+}
+
+_stop_fuser ()
+{
+ _msg "Stopping Fuse"
+ MCD="$REMOTE_FUSER_APP -u -m $F_MOUNT_DIR"
+ _msg "## $MCD"
+ $MCD
+
+ sleep 100
+
+ _is_fuser_run $FUSER_PID $F_MOUNT_DIR
+ if [ $? -eq 0 ]
+ then
+ _shutdown_fuser $FUSER_PID $F_MOUNT_DIR
+ fi
+
+ _clear_data
+}
+
+_test_failed ()
+{
+ _err "TEST FAILED: $@"
+
+ _stop_fuser
+
+ _err_exit
+}
+
+## Here we should wait a some time and check that mount is success
+## The mount is success if there is record in mtab and some files
+## appeared in mount directory
+##
+for i in All the way home from Baltimore "(C)" Talking Heads THE_END
+do
+ case $i in
+ THE_END)
+ _err Can not start fuser
+ _shutdown_fuser $FUSER_PID $F_MOUNT_DIR
+ ;;
+ *)
+ echo -n "$i "
+ sleep 1
+ _check_dir_mounted $F_MOUNT_DIR
+ if [ $? -eq 0 ]
+ then
+ echo ...
+ break
+ fi
+ ;;
+ esac
+done
+
+#####################################################################
+#####################################################################
+#####
+### First test is checking that file downloads full and correctly
+#
+
+_bump
+_msg TEST 1: Downloading single file
+
+## First we are trying to choose not big file to download
+##
+LINF=` grep "<File" $F_FUSE_XML | sed "s#name=##1" | sed "s#size=##1" | sed "s#path=##1" | sed "s#\"##g" | awk ' { print $2 " " $3 " " $4 } ' | sort -n -k 2 | awk ' BEGIN { SZ=0; NM=""; UR="" } { if ( SZ < 100000 ) { if ( SZ < int ( $2 ) ) { SZ = int ( $2 ); NM = $1; UR = $3 } } } END { print NM " " SZ " " UR } ' `
+if [ -z "$LINF" ]
+then
+ _test_failed "Invalid XML file '$F_FUSE_XML'"
+fi
+
+REMOTE_URL=`echo $LINF | awk ' { print $3 } ' `
+LOCAL_FILE=`echo $LINF | awk ' { print $1 } ' `
+TEMP_FILE=$F_TEMP_DIR/${LOCAL_FILE}.${DAS_CTX}.${DAS_TSTAMP}
+
+## Downloading copy of proxied file
+##
+_msg "Downloading file '$REMOTE_URL'"
+eval GET "$REMOTE_URL" >$TEMP_FILE
+if [ $? -ne 0 ]
+then
+ _test_failed "Can not load remote file '$REMOTE_URL'"
+fi
+
+## Compareing downloaded file with file proxied by FUSE
+##
+_msg "Compareing downloaded file '$REMOTE_URL' with $F_MOUNT_DIR/$LOCAL_FILE"
+eval cmp $TEMP_FILE $F_MOUNT_DIR/$LOCAL_FILE
+if [ $? -ne 0 ]
+then
+ _test_failed "Invalid file content '$F_MOUNT_DIR/$LOCAL_FILE'"
+fi
+
+## Checking CACHE directory, cuz here should be only one file,
+## without ".cache" extention
+##
+RCA_DIR=$F_CACHE_DIR/.cache
+FILES=(`ls $RCA_DIR`)
+if [ ${#FILES[@]} -ne 1 ]
+then
+ ls $RCA_DIR >&2
+ _test_failed "Invalid content of cache directory '$RCA_DIR'"
+fi
+
+if [[ "${FILES[0]}" == *.cache ]]
+then
+ ls $RCA_DIR >&2
+ _test_failed "Partially downloaded file at '$RCA_DIR'"
+fi
+
+_msg TEST 1: Passed
+
+#####################################################################
+#####################################################################
+#####
+### Second multithread access to singe file
+#
+
+_bump
+_msg TEST 2: Multithread acces to single file
+
+R_TM=2
+N_THR=30
+
+## First we should choose file big enough for a test ...
+## couple hundred megs is OK
+##
+
+for i in `ls $F_MOUNT_DIR`
+do
+ if [ `stat --print="%s" $F_MOUNT_DIR/$i` -gt 200000000 ]
+ then
+ FILE_NAME=$i
+ break
+ fi
+done
+
+if [ -z "$FILE_NAME" ]
+then
+ _test_failed "Can not find file with suitable size"
+fi
+
+TEST_CMD="$REMOTE_FUSER_TEST_APP -t $N_THR -r $R_TM $F_MOUNT_DIR/$FILE_NAME"
+_msg "## $TEST_CMD"
+eval "$TEST_CMD"
+if [ $? -ne 0 ]
+then
+ _test_failed "Single file test failed"
+fi
+
+_msg TEST 2: Passed
+
+#####################################################################
+#####################################################################
+#####
+### Second multithread access to set of files
+#
+
+_bump
+_msg TEST 3: Multithread acces to set of files
+
+## First we should create list of files with limitation
+##
+
+LIST_FILE=$F_TEMP_DIR/listfile.${DAS_CTX}.$DAS_TSTAMP
+for i in `ls $F_MOUNT_DIR`
+do
+ echo $F_MOUNT_DIR/$i >>$LIST_FILE
+done
+
+TEST_CMD="$REMOTE_FUSER_TEST_APP -t $N_THR -r $RUN_TIME -l $LIST_FILE"
+_msg "## $TEST_CMD"
+eval "$TEST_CMD"
+if [ $? -ne 0 ]
+then
+ _test_failed "Multiply files test failed"
+fi
+
+
+_msg TEST 3: Passed
+
+#####
+### Here we are stopping fuser
+#
+_stop_fuser
+
+_msg TEST PASSED!
diff --git a/test/fuse/utils.c b/test/fuse/utils.c
new file mode 100644
index 0000000..e1f2873
--- /dev/null
+++ b/test/fuse/utils.c
@@ -0,0 +1,867 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kproc/lock.h>
+#include <kproc/thread.h>
+
+#include <atomic32.h>
+
+#include "utils.h"
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <signal.h>
+
+ /*))))
+ |||| XStats implementation
+ ((((*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ || XTmXXXX stuff
+((*/
+
+/*)))
+ /// Mesuring time in ... microzecoidz from :
+ \\\ # date -d @1380000000
+ /// Tue Sep 24 01:20:00 EDT 2013
+(((*/
+const uint64_t _DateFrom = 1380000000;
+const uint64_t _DateCoeff = 1000000;
+
+uint64_t CC
+XTmNow ()
+{
+ struct timeval TV;
+ uint64_t RetVal;
+
+ gettimeofday ( & TV, NULL );
+ RetVal = ( ( TV.tv_sec - _DateFrom ) * _DateCoeff ) + TV.tv_usec;
+
+
+ return RetVal;
+} /* XTmNow () */
+
+/*))
+ || XStats struct
+((*/
+struct XStats {
+ struct KLock * mutabor;
+
+ uint64_t start_time; /* Time of starting stat */
+
+ uint64_t qty; /* all Reads Qty */
+ uint64_t err_qty; /* bad Reads Qty */
+ uint64_t time; /* Time of Reads cumulative */
+ uint64_t size; /* all Reads Qty */
+};
+
+static rc_t CC _XStatsReset_NoLock ( const struct XStats * self );
+
+rc_t CC
+XStatsDispose ( const struct XStats * self )
+{
+ struct XStats * Stats = ( struct XStats * ) self;
+
+ if ( Stats != NULL ) {
+ if ( Stats -> mutabor != NULL ) {
+ KLockRelease ( Stats -> mutabor );
+ Stats -> mutabor = NULL;
+ }
+
+ _XStatsReset_NoLock ( self );
+
+ free ( Stats );
+ }
+
+ return 0;
+} /* XStatDispose () */
+
+rc_t CC
+XStatsMake ( const struct XStats ** Stats )
+{
+ rc_t RCt;
+ struct XStats * Ret;
+
+ RCt = 0;
+ Ret = NULL;
+
+ if ( Stats != NULL ) {
+ * Stats = NULL;
+ }
+
+ Ret = calloc ( 1, sizeof ( struct XStats ) );
+ if ( Ret == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ RCt = KLockMake ( & ( Ret -> mutabor ) );
+ if ( RCt == 0 ) {
+ RCt = XStatsReset ( Ret );
+ if ( RCt == 0 ) {
+ * Stats = ( const struct XStats * ) Ret;
+ }
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * Stats = NULL;
+
+ if ( Ret != NULL ) {
+ XStatsDispose ( Ret );
+ }
+ }
+
+ return RCt;
+} /* XStatMake () */
+
+static
+rc_t CC
+_XStatsReset_NoLock ( const struct XStats * self )
+{
+ struct XStats * Stats = ( struct XStats * ) self;
+
+ if ( Stats != NULL ) {
+ Stats -> start_time = XTmNow ();
+
+ Stats -> qty = 0;
+ Stats -> err_qty = 0;
+ Stats -> time = 0;
+ Stats -> size = 0;
+ }
+
+ return 0;
+} /* _XStatsReset_NoLock () */
+
+rc_t CC
+XStatsReset ( const struct XStats * self )
+{
+ rc_t RCt = 0;
+
+ if ( self != NULL ) {
+ RCt = KLockAcquire ( self -> mutabor );
+ if ( RCt == 0 ) {
+ RCt = _XStatsReset_NoLock ( self );
+ KLockUnlock ( self -> mutabor );
+ }
+ }
+
+ return RCt;
+} /* XStatReset () */
+
+rc_t CC
+XStatsGood ( const struct XStats * self, uint64_t Size, uint64_t Time )
+{
+ rc_t RCt;
+ struct XStats * Stats;
+
+ RCt = 0;
+ Stats = ( struct XStats * ) self;
+
+ if ( Stats != NULL ) {
+ RCt = KLockAcquire ( Stats -> mutabor );
+ if ( RCt == 0 ) {
+ Stats -> qty ++;
+ Stats -> time += Time;
+ Stats -> size += Size;
+
+ KLockUnlock ( Stats -> mutabor );
+ }
+ }
+
+ return RCt;
+} /* XStatDispose () */
+
+rc_t CC
+XStatsBad ( const struct XStats * self )
+{
+ rc_t RCt;
+ struct XStats * Stats;
+
+ RCt = 0;
+ Stats = ( struct XStats * ) self;
+
+ if ( Stats != NULL ) {
+ RCt = KLockAcquire ( Stats -> mutabor );
+ if ( RCt == 0 ) {
+ Stats -> err_qty ++;
+
+ KLockUnlock ( Stats -> mutabor );
+ }
+ }
+
+ return RCt;
+} /* XStatDispose () */
+
+rc_t CC
+XStatsReport ( const struct XStats * self )
+{
+ rc_t RCt;
+ uint64_t Per;
+ uint64_t Tim;
+
+ RCt = 0;
+ Per = 0;
+ Tim = 0;
+
+ if ( self != NULL ) {
+ RCt = KLockAcquire ( self -> mutabor );
+ if ( RCt == 0 ) {
+ printf ( "<<== Read Stats\n" );
+ printf ( " READ QTY : %lu\n", self -> qty );
+ Per = self -> qty == 0 ? 0 : ( ( int ) ( ( ( float ) self -> err_qty * 100.0f ) / ( float ) ( self -> qty ) ) );
+ printf ( " ERRORS : %lu [%lu%%]\n", self -> err_qty, Per );
+ Tim = ( XTmNow () - self -> start_time ) / 1000000;
+ printf ( " TIME : %lu sec\n", Tim );
+ printf ( " ACC TIME : %lu sec\n", self -> time / 1000000 );
+ printf ( " READ SIZE : %lu but\n", self -> size );
+
+ Per = self -> time == 0 ? 0 : ( self -> size / Tim ) ;
+ printf ( " THOUGHOUT : %lu bit per sec\n", Per );
+
+ KLockUnlock ( self -> mutabor );
+ }
+ }
+
+ return RCt;
+} /* XStatDispose () */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+struct XTasker;
+
+struct XTask {
+ const struct XTasker * tasker;
+
+ struct KThread * thread;
+
+ size_t task_no;
+
+ size_t buffer_size;
+ char * buffer;
+};
+
+struct XTasker {
+ size_t task_qty;
+ const struct XTask ** tasks;
+
+ atomic32_t iteration;
+ atomic32_t is_run;
+ atomic32_t is_done;
+
+ uint64_t stop_at;
+
+ const struct XStats * stat;
+
+ void * job_4_task_data;
+ Job4Task job_4_task;
+};
+
+rc_t CC _TaskStop ( const struct XTask * self );
+
+static
+rc_t CC
+_TaskDispose ( const struct XTask * self )
+{
+ struct XTask * Task = ( struct XTask * ) self;
+
+ if ( Task != NULL ) {
+ if ( Task -> thread != NULL ) {
+ _TaskStop ( Task );
+ }
+
+ Task -> task_no = 0;
+
+ Task -> buffer_size = 0;
+ if ( Task -> buffer != NULL ) {
+ free ( Task -> buffer );
+ Task -> buffer = NULL;
+ }
+
+ Task -> tasker = NULL;
+ }
+
+ return 0;
+} /* _TaskDispose () */
+
+static
+rc_t CC
+_TaskMake (
+ const struct XTask ** Task,
+ const struct XTasker * Tasker,
+ size_t TaskNo
+)
+{
+ rc_t RCt;
+ struct XTask * Ret;
+
+ RCt = 0;
+ Ret = NULL;
+
+ if ( * Task != NULL ) {
+ * Task = NULL;
+ }
+
+ if ( Tasker == NULL || Task == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ Ret = calloc ( 1, sizeof ( struct XTask ) );
+ if ( Ret == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ Ret -> tasker = Tasker;
+ Ret -> task_no = TaskNo;
+
+ * Task = ( const struct XTask * ) Ret;
+ }
+
+ if ( RCt != 0 ) {
+ * Task = NULL;
+
+ if ( Ret != NULL ) {
+ _TaskDispose ( Ret );
+ }
+ }
+
+ return RCt;
+} /* _TaskMake () */
+
+static
+rc_t CC
+_TaskRealloc ( const struct XTask * self, size_t BufferSize )
+{
+ struct XTask * Task = ( struct XTask * ) self;
+
+ if ( Task -> buffer_size < BufferSize ) {
+ if ( Task -> buffer != 0 ) {
+ free ( Task -> buffer );
+
+ Task -> buffer = NULL;
+ Task -> buffer_size = 0;
+ }
+
+ Task -> buffer_size = ( ( BufferSize / 1024 ) + 1 ) * 1024;
+ Task -> buffer = calloc (
+ Task -> buffer_size,
+ sizeof ( char )
+ );
+ if ( Task -> buffer == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ }
+
+ return 0;
+} /* _TaskRealloc () */
+
+
+static
+rc_t CC
+_TaskRead ( const struct XTask * self )
+{
+ rc_t RCt;
+ const char * Name;
+ uint64_t Offset;
+ size_t Size, NumRead;
+ struct KDirectory * Directory;
+ const struct KFile * File;
+ uint64_t Time;
+
+ RCt = 0;
+ Name = NULL;
+ Offset = 0;
+ Size = NumRead = 0;
+ Directory = NULL;
+ File = NULL;
+ Time = 0;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( self -> tasker == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ RCt = XTaskerNewJob ( self -> tasker, & Name, & Offset, & Size );
+ if ( RCt == 0 ) {
+ if ( Name != NULL ) {
+ RCt = _TaskRealloc ( self, Size );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryNativeDir ( & Directory );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryOpenFileRead (
+ Directory,
+ & File,
+ Name
+ );
+ if ( RCt == 0 ) {
+ Time = XTmNow ();
+
+ RCt = KFileReadAll (
+ File,
+ Offset,
+ self -> buffer,
+ Size,
+ & NumRead
+ );
+ if ( RCt == 0 ) {
+ XStatsGood (
+ self -> tasker -> stat,
+ NumRead,
+ ( XTmNow () - Time )
+ );
+ }
+ else {
+ XStatsBad ( self -> tasker -> stat );
+ }
+
+ KFileRelease ( File );
+ }
+ KDirectoryRelease ( Directory );
+ }
+ }
+ }
+ }
+
+ return RCt;
+} /* _TaskRead () */
+
+static
+bool CC
+_TaskDone ( const struct XTask * self )
+{
+ if ( self != NULL ) {
+ return XTaskerIsDoneSet ( self -> tasker );
+ }
+
+ return true;
+} /* _TaskDone () */
+
+static
+rc_t CC
+_TaskThreadProc ( const struct KThread * Thread, void * Data )
+{
+ rc_t RCt;
+ struct XTask * Task;
+
+ RCt = 0;
+ Task = ( struct XTask * ) Data;
+
+ if ( Thread == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( Data == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ while ( true ) {
+ /* We are ignoring the return code, cuz there is statistic */
+ /* RCt = */
+ _TaskRead ( Task );
+
+ if ( _TaskDone ( Task ) ) {
+ break;
+ }
+ }
+
+ atomic32_dec ( ( atomic32_t * ) & ( Task -> tasker -> is_run ) );
+
+ return RCt;
+} /* _TaskThreadProc () */
+
+static
+rc_t CC
+_TaskRun ( const struct XTask * self )
+{
+ struct XTask * Task = ( struct XTask * ) self;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( self -> tasker == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ if ( self -> thread != NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ atomic32_read_and_add (
+ ( atomic32_t * ) & ( Task -> tasker -> is_run ), 1
+ );
+
+ return KThreadMake ( & ( Task -> thread ), _TaskThreadProc, Task );
+} /* _TaskRun () */
+
+rc_t CC
+_TaskStop ( const struct XTask * self )
+{
+ rc_t RCt;
+ struct XTask * Task;
+
+ RCt = 0;
+ Task = ( struct XTask * ) self;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ KThreadCancel ( Task -> thread );
+ KThreadWait ( Task -> thread, NULL );
+ KThreadRelease ( Task -> thread );
+
+ Task -> thread = NULL;
+
+ return RCt;
+} /* TaskStop () */
+
+rc_t CC
+XTaskerDispose ( const struct XTasker * self )
+{
+ struct XTasker * Tasker;
+ size_t llp;
+
+ Tasker = ( struct XTasker * ) self;
+ llp = 0;
+
+ if ( Tasker != NULL ) {
+ if ( Tasker -> stat != NULL ) {
+ XStatsDispose ( Tasker -> stat );
+ Tasker -> stat = NULL;
+ }
+
+ if ( Tasker -> tasks != NULL ) {
+ for ( llp = 0; llp < Tasker -> task_qty; llp ++ ) {
+ if ( Tasker -> tasks [ llp ] != NULL ) {
+ _TaskDispose ( Tasker -> tasks [ llp ] );
+ Tasker -> tasks [ llp ] = NULL;
+ }
+ }
+ }
+ Tasker -> tasks = NULL;
+ Tasker -> task_qty = 0;
+
+ atomic32_set ( & ( Tasker -> iteration ), 0 );
+ atomic32_set ( & ( Tasker -> is_run ), 0 );
+ atomic32_set ( & ( Tasker -> is_done ), 0 );
+
+ Tasker -> stop_at = 0;
+
+ Tasker -> job_4_task_data = NULL;
+ Tasker -> job_4_task = NULL;
+
+ free ( Tasker );
+ }
+
+ return 0;
+} /* XTaskerDispose () */
+
+/* JOJOBA here will be variable part */
+rc_t CC
+XTaskerMake (
+ const struct XTasker ** Tasker,
+ size_t NumThreads,
+ void * Data,
+ Job4Task Jobber
+)
+{
+ rc_t RCt;
+ struct XTasker * Ret;
+ size_t llp;
+
+ RCt = 0;
+ Ret = NULL;
+ llp = 0;
+
+ if ( Tasker != NULL ) {
+ * Tasker = NULL;
+ }
+
+ if ( Tasker == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( Jobber == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( NumThreads == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ Ret = calloc ( 1, sizeof ( struct XTasker ) );
+ if ( Ret == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ Ret -> tasks = calloc ( NumThreads, sizeof ( struct XTask * ) );
+ if ( Ret -> tasks == NULL ) {
+ RCt = RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcExhausted );
+ }
+ else {
+ if ( RCt == 0 ) {
+ Ret -> task_qty = NumThreads;
+ for ( llp = 0; llp < NumThreads; llp ++ ) {
+ RCt = _TaskMake ( Ret -> tasks + llp, Ret, llp );
+ if ( RCt != 0 ) {
+ break;
+ }
+ }
+ if ( RCt == 0 ) {
+ RCt = XStatsMake ( & ( Ret -> stat ) );
+ if ( RCt == 0 ) {
+ atomic32_set ( & ( Ret -> iteration ), 0 );
+ atomic32_set ( & ( Ret -> is_run ), 0 );
+ atomic32_set ( & ( Ret -> is_done ), 0 );
+ Ret -> stop_at = 0;
+ Ret -> job_4_task_data = Data;
+ Ret -> job_4_task = Jobber;
+
+ * Tasker = Ret;
+ }
+ }
+ }
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * Tasker = NULL;
+
+ if ( Ret != NULL ) {
+ XTaskerDispose ( Ret );
+ }
+ }
+
+ return RCt;
+} /* XTaskerMake () */
+
+rc_t CC
+XTaskerRun ( const struct XTasker * self, size_t Seconds )
+{
+ rc_t RCt;
+ size_t llp;
+
+ RCt = 0;
+ llp = 0;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ if ( self -> tasks == NULL || self -> task_qty == 0 ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcInvalid );
+ }
+
+ ( ( struct XTasker * ) self ) -> stop_at =
+ XTmNow () + ( Seconds * 1000000 );
+
+ for ( llp = 0; llp < self -> task_qty; llp ++ ) {
+ if ( self -> tasks [ llp ] != NULL ) {
+ RCt = _TaskRun ( self -> tasks [ llp ] );
+ }
+
+ if ( RCt != 0 ) {
+ break;
+ }
+ }
+
+ RCt = XTaskerWait ( self );
+
+ return RCt;
+} /* XTaskerRun () */
+
+bool CC
+XTaskerIsRunning ( const struct XTasker * self )
+{
+ if ( self != NULL ) {
+ return atomic32_read ( & ( self -> is_run ) ) != 0;
+ }
+
+ return false;
+} /* XTaskerIsRunning () */
+
+rc_t CC
+XTaskerNewJob (
+ const struct XTasker * self,
+ const char ** FileName,
+ uint64_t * Offset,
+ size_t * Size
+)
+{
+ int Iteration = 0;
+
+ if ( FileName != NULL ) {
+ * FileName = NULL;
+ }
+
+ if ( Offset != NULL ) {
+ * Offset = 0;
+ }
+
+ if ( Size != NULL ) {
+ * Size = 0;
+ }
+
+ if ( self == NULL || FileName == NULL || Offset == NULL || Size == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ Iteration = atomic32_read_and_add (
+ ( atomic32_t * ) & ( self -> iteration ),
+ 1
+ );
+
+ if ( XTaskerIsDoneSet ( self ) ) {
+ return 0;
+ }
+
+ return self -> job_4_task (
+ self -> job_4_task_data,
+ Iteration,
+ FileName,
+ Offset,
+ Size
+ );
+} /* XTaskerNewJob () */
+
+rc_t CC
+XTaskerSetDone ( const struct XTasker * self )
+{
+ if ( self == NULL ) {
+ return RC ( rcExe, rcNoTarg, rcProcessing, rcParam, rcNull );
+ }
+
+ atomic32_set ( ( atomic32_t * ) & ( self -> is_done ), 1 );
+
+ return 0;
+} /* XTaskerSetDone () */
+
+bool CC
+XTaskerIsDoneSet ( const struct XTasker * self )
+{
+ if ( self != NULL ) {
+ return atomic32_read ( & ( self -> is_done ) ) != 0;
+ }
+
+ return false;
+} /* XTaskerIsDoneSet () */
+
+bool CC
+XTaskerIsDone ( const struct XTasker * self )
+{
+ return XTaskerIsDoneSet ( self ) && ! XTaskerIsRunning ( self );
+} /* XTaskerIsDone () */
+
+static bool _sSigIntHandled = false;
+
+void CC
+XTaskerSigIntHandler ( int SigNo )
+{
+ if ( SigNo == SIGINT ) {
+ printf ( "SIGINT handled, ignored, but we will exit\n" );
+
+ _sSigIntHandled = true;
+ }
+} /* XTaskerSigIntHandler () */
+
+rc_t CC
+XTaskerWait ( const struct XTasker * self )
+{
+ uint64_t Next = 0;
+ uint64_t Now = 0;
+ size_t llp = 0;
+ uint64_t Pardon = 600 * 1000000;
+ struct timespec t_spec;
+ struct timespec t_rem;
+
+ t_spec . tv_sec = 0;
+ t_spec . tv_nsec = 100000;
+
+ t_rem . tv_sec = 0;
+ t_rem . tv_nsec = 0;
+
+ if ( XTaskerIsRunning ( self ) ) {
+ Next = XTmNow () + Pardon;
+
+ while ( true ) {
+ nanosleep ( & t_spec, & t_rem );
+
+ if ( _sSigIntHandled ) {
+ XTaskerSetDone ( self );
+ }
+
+ Now = XTmNow ();
+
+ if ( self -> stop_at < Now ) {
+ if ( ! XTaskerIsDoneSet ( self ) ) {
+ XTaskerSetDone ( self );
+ }
+ }
+
+ if ( XTaskerIsDone ( self ) ) {
+ break;
+ }
+
+ if ( Next < Now ) {
+ Next += Pardon;
+
+ XStatsReport ( self -> stat );
+ }
+ }
+
+ XStatsReport ( self -> stat );
+
+ for ( llp = 0; llp < self -> task_qty; llp ++ ) {
+ if ( self -> tasks [ llp ] != NULL ) {
+ _TaskStop ( self -> tasks [ llp ] );
+ }
+ }
+ }
+
+ return 0;
+} /* XTaskerWait () */
diff --git a/test/fuse/utils.h b/test/fuse/utils.h
new file mode 100644
index 0000000..dd477a0
--- /dev/null
+++ b/test/fuse/utils.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _utils_h_
+#define _utils_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/**
+ ** Lyrics:
+ ** That file contains stupid things
+ **
+ **/
+
+/*) Fowards, and others
+ (*/
+
+/*) Something about time im MicroSeconds
+ (*/
+uint64_t CC XTmNow ( );
+
+/*) Statistics module
+ (*/
+struct XStats;
+
+rc_t CC XStatsMake ( const struct XStats ** Stats );
+rc_t CC XStatsDispose ( const struct XStats * self );
+
+rc_t CC XStatsReset ( const struct XStats * self );
+
+rc_t CC XStatsGood (
+ const struct XStats * self,
+ uint64_t Size,
+ uint64_t Time
+ );
+
+rc_t CC XStatsBad ( const struct XStats * self );
+
+rc_t CC XStatsReport ( const struct XStats * self );
+
+/*) Tasks
+ (*/
+struct XTasker;
+
+ /* Supposed to return NULL Name and 0 RC if there are no
+ * tasks anymore
+ */
+typedef rc_t ( CC * Job4Task ) (
+ void * Data,
+ int Iteration,
+ const char ** Name,
+ uint64_t * Offset,
+ size_t * Size
+ );
+
+rc_t CC XTaskerMake (
+ const struct XTasker ** Tasker,
+ size_t NumThreads,
+ void * Data,
+ Job4Task Jobber
+ );
+rc_t CC XTaskerDispose ( const struct XTasker * self );
+
+rc_t CC XTaskerRun ( const struct XTasker * self, size_t Seconds );
+bool CC XTaskerIsRunning ( const struct XTasker * self );
+
+ /* We suppose if FileName returned as NULL, there are no new jobs
+ */
+rc_t CC XTaskerNewJob (
+ const struct XTasker * self,
+ const char ** FileName,
+ uint64_t * Offset,
+ size_t * Size
+ );
+
+rc_t CC XTaskerSetDone ( const struct XTasker * self );
+bool CC XTaskerIsDoneSet ( const struct XTasker * self );
+bool CC XTaskerIsDone ( const struct XTasker * self );
+
+rc_t CC XTaskerWait ( const struct XTasker * self );
+
+void CC XTaskerSigIntHandler ( int SigNo );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _utils_h_ */
diff --git a/test/general-loader/.gitignore b/test/general-loader/.gitignore
new file mode 100644
index 0000000..08ce4e2
--- /dev/null
+++ b/test/general-loader/.gitignore
@@ -0,0 +1,2 @@
+db
+*.gw
diff --git a/test/general-loader/Makefile b/test/general-loader/Makefile
new file mode 100644
index 0000000..7098d66
--- /dev/null
+++ b/test/general-loader/Makefile
@@ -0,0 +1,187 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+ @ rm tmp.kfg
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/general-loader
+
+TEST_TOOLS = \
+ test-general-loader \
+ test-general-writer \
+ test-gw-dumper
+
+ALL_TOOLS = \
+ $(TEST_TOOLS) \
+
+include $(TOP)/build/Makefile.env
+
+$(shell echo "vdb/schema/paths = \"$(VDB_INCDIR)\"" > tmp.kfg)
+VDB_CONFIG = $(shell pwd)
+
+INCDIRS += -I$(TOP)/tools/general-loader
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-general-loader
+#
+TEST_GEN_LOAD_SRC = \
+ test-general-loader \
+ testsource
+
+TEST_GEN_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_GEN_LOAD_SRC))
+
+TEST_GEN_LOAD_LIB = \
+ -sncbi-wvdb-static \
+ -sload \
+ -skapp \
+ -sktst \
+
+$(TEST_BINDIR)/test-general-loader: $(TEST_GEN_LOAD_OBJ)
+ $(LP) --exe -o $@ $^ $(TEST_GEN_LOAD_LIB)
+
+gen_load: test-general-loader
+ $(TEST_BINDIR)/test-general-loader
+
+#-------------------------------------------------------------------------------
+# test-general-writer
+#
+TEST_GEN_WRITE_SRC = \
+ test-general-writer
+
+TEST_GEN_WRITE_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_GEN_WRITE_SRC))
+
+TEST_GEN_WRITE_LIB = \
+ -L$(LIBDIR) \
+ -sgeneral-writer
+
+
+$(TEST_BINDIR)/test-general-writer: $(TEST_GEN_WRITE_OBJ)
+ $(LP) --exe -o $@ $^ $(TEST_GEN_WRITE_LIB)
+
+runtests:$(TEST_TOOLS) #piped-load-tests
+
+piped-load-tests: $(ALL_TOOLS)
+ -$(TEST_BINDIR)/test-general-writer | $(BINDIR)/general-loader -L=info
+ -$(BINDIR)/vdb-dump -T table1 remote_db
+ rm -rf remote_db
+
+#-------------------------------------------------------------------------------
+# test-gw-dumper
+#
+TEST_GW_DUMP_SRC = \
+ test-gw-dumper
+
+TEST_GW_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_GW_DUMP_SRC))
+
+TEST_GW_DUMP_LIB = \
+ -sgeneral-writer \
+
+$(TEST_BINDIR)/test-gw-dumper: $(TEST_GW_DUMP_OBJ)
+ $(LP) --exe -o $@ $^ $(TEST_GW_DUMP_LIB)
+
+gw_dump: test-gw-dumper
+ $(TEST_BINDIR)/$^
+
+#-------------------------------------------------------------------------------
+# general-loader tool tests
+#
+runtests: setup tool-tests
+
+setup:
+ @ mkdir -p db
+
+$(TEST_BINDIR)/makeinputs: makeinputs.cpp
+ @# generate numbered input streams for tool tests
+ $(CXX) makeinputs.cpp testsource.cpp -o $(TEST_BINDIR)/makeinputs -I$(INCDIRS) -L$(VDB_LIBDIR) -lncbi-vdb-static
+
+tool-tests: $(TEST_BINDIR)/makeinputs
+ @mkdir -p input && $(TEST_BINDIR)/makeinputs && rm $(TEST_BINDIR)/makeinputs
+ @#
+ @# basic, unpacked
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 1 0 -I=$(VDB_INCDIR)
+ @#
+ @# basic, packed
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 1packed 0 -I=$(VDB_INCDIR)
+ @#
+ @# target db override
+ @# use 1.gl which specifies the target as actual/1/db, and override that to where the script expects to see the result
+ @cp input/1.gl input/1override.gl && $(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 1override 0 "-I=$(VDB_INCDIR) --target actual/1override/db"
+ @# same with the storthand option
+ @cp input/1.gl input/1override.gl && $(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 1override 0 "-I=$(VDB_INCDIR) -T actual/1override/db"
+ @#
+ @# error message event, unpacked
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 2 3 "-I=$(VDB_INCDIR) -L=err"
+ @#
+ @# error message event, packed
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 2packed 3 "-I=$(VDB_INCDIR) -L=err"
+ @#
+ @# empty default values, unpacked
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 3 0 -I=$(VDB_INCDIR)
+ @#
+ @# empty default values, packed
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 3packed 0 -I=$(VDB_INCDIR)
+ @#
+ @# move ahead event, unpacked
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 4 0 -I=$(VDB_INCDIR)
+ @#
+ @# move ahead event, packed
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 4packed 0 -I=$(VDB_INCDIR)
+ @#
+ @# integer compression (packed only)
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) vdb-dump $(SRCDIR) 5packed 0 "-L=info -I=$(VDB_INCDIR)"
+ @#
+ @# software name in the metadata, unpacked
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) kdbmeta $(SRCDIR) 6 0 "-L=info -I=$(VDB_INCDIR)" SOFTWARE/formatter
+ @#
+ @# software name in the metadata, packed
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) kdbmeta $(SRCDIR) 6packed 0 "-L=info -I=$(VDB_INCDIR)" SOFTWARE/formatter
+ @#
+ @rm -rf input/*.gl actual/*
+
+one-tool: $(TEST_BINDIR)/makeinputs
+ @mkdir -p input && $(TEST_BINDIR)/makeinputs && rm $(TEST_BINDIR)/makeinputs
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) kdbmeta $(SRCDIR) 6 0 "-L=info -I=$(VDB_INCDIR)" SOFTWARE/formatter
+
+
+#-------------------------------------------------------------------------------
+# general-loader tool tests
+#
+slowtests: #piped-dump
+
+piped-dump: $(BINDIR)/pileup-stats test-general-loader
+ #$(BINDIR)/pileup-stats SRR1063272 | $(BINDIR)/general-loader #-L=info
+ $(BINDIR)/pileup-stats SRR1232302 | $(BINDIR)/general-loader -L=info
+
diff --git a/test/general-loader/expected/1.stdout b/test/general-loader/expected/1.stdout
new file mode 100644
index 0000000..cd95218
--- /dev/null
+++ b/test/general-loader/expected/1.stdout
@@ -0,0 +1,75 @@
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first value
+ SPOT_ID: 1
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 2
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 3
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second value
+ SPOT_ID: 4
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second default
+ SPOT_ID: 5
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/1override.stdout b/test/general-loader/expected/1override.stdout
new file mode 100644
index 0000000..cd95218
--- /dev/null
+++ b/test/general-loader/expected/1override.stdout
@@ -0,0 +1,75 @@
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first value
+ SPOT_ID: 1
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 2
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 3
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second value
+ SPOT_ID: 4
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second default
+ SPOT_ID: 5
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/1packed.stdout b/test/general-loader/expected/1packed.stdout
new file mode 100644
index 0000000..cd95218
--- /dev/null
+++ b/test/general-loader/expected/1packed.stdout
@@ -0,0 +1,75 @@
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first value
+ SPOT_ID: 1
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 2
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: first default
+ SPOT_ID: 3
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second value
+ SPOT_ID: 4
+ TRIM_START: 0
+
+COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP: second default
+ SPOT_ID: 5
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/2.stderr b/test/general-loader/expected/2.stderr
new file mode 100644
index 0000000..6b1684e
--- /dev/null
+++ b/test/general-loader/expected/2.stderr
@@ -0,0 +1,2 @@
+general-loader err: general-loader: error "something is wrong"
+general-loader err: error exists while reading file - load failed
diff --git a/test/general-loader/expected/2packed.stderr b/test/general-loader/expected/2packed.stderr
new file mode 100644
index 0000000..6b1684e
--- /dev/null
+++ b/test/general-loader/expected/2packed.stderr
@@ -0,0 +1,2 @@
+general-loader err: general-loader: error "something is wrong"
+general-loader err: error exists while reading file - load failed
diff --git a/test/general-loader/expected/3.stdout b/test/general-loader/expected/3.stdout
new file mode 100644
index 0000000..3481de0
--- /dev/null
+++ b/test/general-loader/expected/3.stdout
@@ -0,0 +1,16 @@
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/3packed.stdout b/test/general-loader/expected/3packed.stdout
new file mode 100644
index 0000000..3481de0
--- /dev/null
+++ b/test/general-loader/expected/3packed.stdout
@@ -0,0 +1,16 @@
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/4.stdout b/test/general-loader/expected/4.stdout
new file mode 100644
index 0000000..c05dd30
--- /dev/null
+++ b/test/general-loader/expected/4.stdout
@@ -0,0 +1,160 @@
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 2
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 3
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 4
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 5
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS: 100
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 6
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 7
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 8
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 9
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 10
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/4packed.stdout b/test/general-loader/expected/4packed.stdout
new file mode 100644
index 0000000..c05dd30
--- /dev/null
+++ b/test/general-loader/expected/4packed.stdout
@@ -0,0 +1,160 @@
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 2
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 3
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 4
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 5
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS: 100
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 6
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 7
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 8
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 9
+ TRIM_START: 0
+
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS:
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 10
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/5packed.stdout b/test/general-loader/expected/5packed.stdout
new file mode 100644
index 0000000..d8acc2e
--- /dev/null
+++ b/test/general-loader/expected/5packed.stdout
@@ -0,0 +1,16 @@
+ COLOR_MATRIX: 0, 1, 2, 3, 4, 1, 0, 3, 2, 4, 2, 3, 0, 1, 4, 3, 2, 1, 0, 4, 4, 4, 4, 4, 4
+ CS_KEY: T
+ CS_NATIVE: false
+ LABEL: reference
+ LABEL_LEN: 9
+ LABEL_START: 0
+ MIN_SPOT_ID: 1
+PRIMARY_ALIGNMENT_IDS: 1085102592571150095
+ RD_FILTER: SRA_READ_FILTER_PASS
+ READ_FILTER: SRA_READ_FILTER_PASS
+ READ_START: 0
+ READ_TYPE: SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD
+ SPOT_GROUP:
+ SPOT_ID: 1
+ TRIM_START: 0
+
diff --git a/test/general-loader/expected/6.stdout b/test/general-loader/expected/6.stdout
new file mode 100644
index 0000000..b8bf71a
--- /dev/null
+++ b/test/general-loader/expected/6.stdout
@@ -0,0 +1 @@
+<formatter name="some software" vers="9.8.7654"/>
diff --git a/test/general-loader/expected/6packed.stdout b/test/general-loader/expected/6packed.stdout
new file mode 100644
index 0000000..b8bf71a
--- /dev/null
+++ b/test/general-loader/expected/6packed.stdout
@@ -0,0 +1 @@
+<formatter name="some software" vers="9.8.7654"/>
diff --git a/test/general-loader/input/column01 b/test/general-loader/input/column01
new file mode 100644
index 0000000..c5ed0f9
--- /dev/null
+++ b/test/general-loader/input/column01
@@ -0,0 +1,2 @@
+First test sentence
+Second sentence to test the stream
diff --git a/test/general-loader/input/column02 b/test/general-loader/input/column02
new file mode 100644
index 0000000..c5ed0f9
--- /dev/null
+++ b/test/general-loader/input/column02
@@ -0,0 +1,2 @@
+First test sentence
+Second sentence to test the stream
diff --git a/test/general-loader/makeinputs.cpp b/test/general-loader/makeinputs.cpp
new file mode 100644
index 0000000..c9d739a
--- /dev/null
+++ b/test/general-loader/makeinputs.cpp
@@ -0,0 +1,226 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for General Loader
+*/
+#include "testsource.hpp"
+
+#include "../../tools/general-loader/utf8-like-int-codec.c"
+
+using namespace std;
+
+const char* tableName = "REFERENCE";
+const char* asciiColumnName = "SPOT_GROUP";
+const char* i64ColumnName = "PRIMARY_ALIGNMENT_IDS";
+const char* u32ColumnName = "SPOT_ID";
+
+
+static
+string
+DatabasePath ( const string& p_caseId, bool p_packed )
+{
+ string caseId = p_caseId;
+ if ( p_packed )
+ {
+ caseId += "packed";
+ }
+ return string ( "actual/" ) + caseId + "/db";
+}
+
+static
+string
+OutputPath ( const string& p_caseId, bool p_packed )
+{
+ string caseId = p_caseId;
+ if ( p_packed )
+ {
+ caseId += "packed";
+ }
+ return string ( "input/" ) + caseId + ".gl";
+}
+
+void
+OneTableOneColumnWithDefaults( const string& p_caseId, bool p_packed )
+{ // default values changed mid-data
+ TestSource source;
+ TestSource::packed = p_packed;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . NewTableEvent ( 1, tableName );
+ source . NewColumnEvent ( 1, 1, asciiColumnName, 8 );
+ source . OpenStreamEvent();
+
+ string value1 = "first value";
+ source . CellDataEvent( 1, value1 );
+ source . NextRowEvent ( 1 );
+
+ string default1 = "first default";
+ source . CellDefaultEvent( 1, default1 );
+ source . NextRowEvent ( 1 );
+
+ source . NextRowEvent ( 1 );
+
+ string value2 = "second value";
+ source . CellDefaultEvent( 1, value2 );
+ source . NextRowEvent ( 1 );
+
+ string default2 = "second default";
+ source . CellDefaultEvent( 1, default2 );
+ source . NextRowEvent ( 1 );
+
+ source . CloseStreamEvent();
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+void
+ErrorMessage( const string& p_caseId, bool p_packed )
+{
+ TestSource source;
+ TestSource::packed = p_packed;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . NewTableEvent ( 1, tableName );
+ source . NewColumnEvent ( 1, 1, asciiColumnName, 8 );
+ source . OpenStreamEvent();
+
+ source . ErrorMessageEvent( "something is wrong" );
+
+ source . CloseStreamEvent();
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+void
+EmptyDefaultValue( const string& p_caseId, bool p_packed )
+{
+ TestSource source;
+ TestSource::packed = p_packed;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . NewTableEvent ( 1, tableName );
+ source . NewColumnEvent ( 1, 1, i64ColumnName, 64 );
+ source . OpenStreamEvent();
+
+ source . CellEmptyDefaultEvent( 1 );
+ source . NextRowEvent ( 1 );
+
+ source . CloseStreamEvent();
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+void
+MoveAhead( const string& p_caseId, bool p_packed )
+{
+ TestSource source;
+ TestSource::packed = p_packed;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . NewTableEvent ( 1, tableName );
+ source . NewColumnEvent ( 1, 1, i64ColumnName, 64 );
+ source . OpenStreamEvent();
+
+ source . CellEmptyDefaultEvent( 1 );
+ source . MoveAheadEvent ( 1, 5 );
+
+ source . CellDataEvent( 1, (int64_t)100 );
+ source . MoveAheadEvent ( 1, 5 );
+
+ // expected: 5 empty cells, 100, 4 empty cells
+ source . CloseStreamEvent();
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+void
+IntegerCompression( const string& p_caseId, bool p_packed )
+{
+ if ( !p_packed )
+ { // Integer compression is used in packed mode only
+ return;
+ }
+
+ TestSource source;
+ TestSource::packed = true;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . NewTableEvent ( 1, tableName );
+ source . NewColumnEvent ( 1, 1, i64ColumnName, 64, true );
+ source . OpenStreamEvent();
+
+ uint8_t buf[128];
+ int bytes = encode_uint64 ( 0x0F0F0F0F0F0F0F0FLL, buf, buf + sizeof buf );
+ source . CellDataEventRaw ( 1, 1, buf, bytes );
+ source . NextRowEvent ( 1 );
+
+ source . CloseStreamEvent();
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+void
+SoftwareIdString( const string& p_caseId, bool p_packed )
+{ // Software identification string in metadata
+ TestSource source;
+ TestSource::packed = true;
+
+ source . SchemaEvent ( "align/align.vschema", "NCBI:align:db:alignment_sorted" );
+ source . DatabaseEvent ( DatabasePath ( p_caseId, p_packed ) );
+
+ source . SoftwareNameEvent ( string ( "some software" ), string ( "9.8.7654" ) );
+
+ source . OpenStreamEvent();
+ source . CloseStreamEvent();
+
+ source . SaveBuffer ( OutputPath ( p_caseId, p_packed ) . c_str () );
+}
+
+int main()
+{
+ for (bool packed = false; ; packed = true )
+ {
+ OneTableOneColumnWithDefaults( "1", packed );
+ ErrorMessage( "2", packed );
+ EmptyDefaultValue( "3", packed );
+ MoveAhead( "4", packed );
+ IntegerCompression( "5", packed );
+ SoftwareIdString( "6", packed );
+
+ if ( packed )
+ {
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/test/general-loader/runtestcase.sh b/test/general-loader/runtestcase.sh
new file mode 100755
index 0000000..6f2a6f8
--- /dev/null
+++ b/test/general-loader/runtestcase.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# $1 - path to sra-tools executables (general-loader, vdb-dump)
+# $2 - name of the dumper executable (vdb-dump, kdbmeta etc.)
+# $3 - work directory (expected results under expected/, actual results and temporaries created under actual/)
+# $4 - test case ID (expect a file input/$3.gl to exist)
+# $5 - expected return code
+# $6 - command line options for general-loader
+# $7 - command line options for dumper
+#
+# return codes:
+# 0 - passed
+# 1 - could not create temp dir
+# 2 - unexpected return code from general-loader
+# 3 - vdb-dump failed on the output of general-loader
+# 4 - outputs differ
+
+BINDIR=$1
+DUMPER=$2
+WORKDIR=$3
+CASEID=$4
+RC=$5
+LOAD_OPTIONS=$6
+DUMP_OPTIONS=$7
+
+DUMP="$BINDIR/$DUMPER"
+LOAD="$BINDIR/general-loader"
+TEMPDIR=$WORKDIR/actual/$CASEID
+
+echo "running test case $CASEID"
+
+mkdir -p $TEMPDIR
+if [ "$?" != "0" ] ; then
+ echo "cannot create "
+ exit 1
+fi
+rm -rf $TEMPDIR/*
+
+CMD="cat input/$CASEID.gl | $LOAD $LOAD_OPTIONS 1>$TEMPDIR/load.stdout 2>$TEMPDIR/load.stderr"
+#echo $CMD
+eval $CMD
+rc="$?"
+if [ "$rc" != "$RC" ] ; then
+ echo "$LOAD returned $rc, expected $RC"
+ echo "command executed:"
+ echo $CMD
+ cat $TEMPDIR/load.stderr
+ exit 2
+fi
+
+if [ "$rc" == "0" ] ; then
+ CMD="$DUMP $TEMPDIR/db $DUMP_OPTIONS 1>$TEMPDIR/dump.stdout 2>$TEMPDIR/dump.stderr"
+ #echo $CMD
+ eval $CMD || ( echo "$CMD" && exit 3 )
+
+ # remove timestamps, date from metadata
+ sed -i -e 's/<timestamp>.*<\/timestamp>/<timestamp\/>/g' $TEMPDIR/dump.stdout
+ sed -i -e 's/date=".*" name/date="" name/g' $TEMPDIR/dump.stdout
+
+ diff $WORKDIR/expected/$CASEID.stdout $TEMPDIR/dump.stdout >$TEMPDIR/diff
+ rc="$?"
+else
+ # remove timestamps
+ sed -i -e 's/^....-..-..T..:..:.. //g' $TEMPDIR/load.stderr
+ # remove pathnames
+ sed -i -e 's=/.*/==g' $TEMPDIR/load.stderr
+ # remove source locations
+ sed -i -e 's=: .*:[0-9]*:[^ ]*:=:=g' $TEMPDIR/load.stderr
+ # remove version number
+ sed -i -e 's=general-loader\(\.[0-9]*\)*=general-loader=g' $TEMPDIR/load.stderr
+ diff $WORKDIR/expected/$CASEID.stderr $TEMPDIR/load.stderr >$TEMPDIR/diff
+ rc="$?"
+fi
+
+if [ "$rc" != "0" ] ; then
+ cat $TEMPDIR/diff
+ echo "command executed:"
+ echo $CMD
+ exit 4
+fi
+
+rm -rf $TEMPDIR
+
+exit 0
diff --git a/test/general-loader/schema/.gitignore b/test/general-loader/schema/.gitignore
new file mode 100644
index 0000000..4063701
--- /dev/null
+++ b/test/general-loader/schema/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/test/general-loader/test-general-loader.cpp b/test/general-loader/test-general-loader.cpp
new file mode 100644
index 0000000..8b42714
--- /dev/null
+++ b/test/general-loader/test-general-loader.cpp
@@ -0,0 +1,1683 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for General Loader
+*/
+
+#include "../../tools/general-loader/general-loader.cpp"
+#include "../../tools/general-loader/database-loader.cpp"
+#include "../../tools/general-loader/protocol-parser.cpp"
+#include "../../tools/general-loader/utf8-like-int-codec.c"
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+
+#include <klib/printf.h>
+#include <klib/debug.h>
+
+#include <kns/adapt.h>
+
+#include <kfs/nullfile.h>
+#include <kfs/file.h>
+#include <kfs/ramfile.h>
+
+#include <kdb/table.h>
+
+#include <kfg/config.h> // KConfigPrint
+
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <vfs/manager.h>
+
+#include <vdb/vdb-priv.h>
+
+#include <time.h>
+#include <cstring>
+#include <stdexcept>
+#include <map>
+#include <fstream>
+#include <cstdio>
+
+#include "testsource.hpp"
+
+using namespace std;
+using namespace ncbi::NK;
+
+static KLogLevel l = 4;
+static rc_t argsHandler(int argc, char* argv[]) {
+ Args* args = NULL;
+ rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 0, NULL, 0);
+ ArgsWhack(args);
+ KLogLevel lv = KLogLevelGet();
+ if (lv != 4) {
+ l = lv;
+ }
+ return rc;
+}
+TEST_SUITE_WITH_ARGS_HANDLER(GeneralLoaderTestSuite, argsHandler);
+
+const string ScratchDir = "./db/";
+const string DefaultSchema = ScratchDir + "default.vschema";
+
+const string DefaultSchemaText =
+ "table table1 #1.0.0 { column ascii columnAscii; column U32 columnU32; column bool columnBool; };\n"
+ "table table2 #1.0.0 { column I64 columnI64; column U8 columnU8; };\n"
+ "database root_database #1 { table table1 #1 TABLE1; table table2 #1 TABLE2; };\n";
+
+const string DefaultDatabase = "root_database";
+
+const string DefaultTable = "TABLE1";
+const string Table2 = "TABLE2";
+
+const string DefaultColumn = "columnAscii";
+const string U32Column = "columnU32";
+const string BoolColumn = "columnBool";
+const string I64Column = "columnI64";
+const string U8Column = "columnU8";
+
+static
+void
+ClearScratchDir ()
+{
+ KDirectory* wd;
+ KDirectoryNativeDir ( & wd );
+ KDirectoryClearDir ( wd, true, ScratchDir . c_str() );
+ KDirectoryRelease ( wd );
+}
+
+
+class GeneralLoaderFixture
+{
+public:
+ static const uint32_t DefaultTableId = 100;
+
+ static const uint32_t DefaultColumnId = 1;
+ static const uint32_t Column16Id = 16;
+ static const uint32_t Column32Id = 32;
+ static const uint32_t Column64Id = 64;
+
+ static std::string argv0;
+
+public:
+ GeneralLoaderFixture()
+ : m_db ( 0 ),
+ m_cursor ( 0 ),
+ m_wd ( 0 )
+ {
+ THROW_ON_RC ( KDirectoryNativeDir ( & m_wd ) );
+
+ CreateFile ( DefaultSchema, DefaultSchemaText );
+ }
+ ~GeneralLoaderFixture()
+ {
+ RemoveDatabase();
+ if (l == 4) {
+ KLogLevelSet ( klogFatal );
+ }
+ KDirectoryRelease ( m_wd );
+ if ( ! m_tempSchemaFile . empty() )
+ {
+ remove ( m_tempSchemaFile . c_str() );
+ }
+ }
+
+ GeneralLoader* MakeLoader ( const struct KFile * p_input )
+ {
+ struct KStream * inStream;
+ THROW_ON_RC ( KStreamFromKFilePair ( & inStream, p_input, 0 ) );
+
+ GeneralLoader* ret = new GeneralLoader ( argv0, * inStream );
+ ret -> AddSchemaIncludePath ( ScratchDir );
+
+ THROW_ON_RC ( KStreamRelease ( inStream ) );
+ THROW_ON_RC ( KFileRelease ( p_input ) );
+
+ return ret;
+ }
+ bool RunLoader ( GeneralLoader& p_loader, rc_t p_rc )
+ {
+ rc_t rc = p_loader.Run();
+ if ( rc == p_rc )
+ {
+ return true;
+ }
+
+ char buf[1024];
+ string_printf ( buf, sizeof buf, NULL, "Expected rc='%R', actual='%R'", p_rc, rc );
+ cerr << buf << endl;
+ return false;
+ }
+
+ bool Run ( const struct KFile * p_input, rc_t p_rc )
+ {
+ struct KStream* inStream;
+ THROW_ON_RC ( KStreamFromKFilePair ( & inStream, p_input, 0 ) );
+
+ GeneralLoader gl ( argv0, *inStream );
+ gl . AddSchemaIncludePath ( ScratchDir );
+
+ rc_t rc = gl.Run();
+ bool ret;
+ if ( GetRCObject ( rc ) == GetRCObject ( p_rc ) &&
+ GetRCState ( rc ) == GetRCState ( p_rc ) )
+ {
+ ret = true;
+ }
+ else
+ {
+ char buf[1024];
+ string_printf ( buf, sizeof buf, NULL, "Expected rc='%R', actual='%R'", p_rc, rc );
+ cerr << buf << endl;
+ ret = false;
+ }
+
+ THROW_ON_RC ( KStreamRelease ( inStream ) );
+ THROW_ON_RC ( KFileRelease ( p_input ) );
+
+ return ret;
+ }
+
+ void RemoveDatabase()
+ {
+ CloseDatabase();
+ if ( ! m_source . GetDatabaseName() . empty () )
+ {
+ KDirectoryRemove ( m_wd, true, m_source . GetDatabaseName() . c_str() );
+ }
+ }
+
+ void OpenDatabase( const char* p_dbNameOverride = 0 )
+ {
+ CloseDatabase();
+
+ VDBManager * vdb;
+ THROW_ON_RC ( VDBManagerMakeUpdate ( & vdb, NULL ) );
+
+ try
+ {
+ THROW_ON_RC ( VDBManagerOpenDBUpdate ( vdb, &m_db, NULL, p_dbNameOverride != 0 ? p_dbNameOverride : m_source . GetDatabaseName() . c_str() ) );
+ }
+ catch(...)
+ {
+ VDBManagerRelease ( vdb );
+ throw;
+ }
+
+ THROW_ON_RC ( VDBManagerRelease ( vdb ) );
+ }
+ void CloseDatabase()
+ {
+ if ( m_db != 0 )
+ {
+ VDatabaseRelease ( m_db );
+ m_db = 0;
+ }
+ if ( m_cursor != 0 )
+ {
+ VCursorRelease ( m_cursor );
+ m_cursor = 0;
+ }
+ }
+
+ void SetUpStream( const string& p_dbName, const string& p_schema = DefaultSchema, const string& p_schemaName = DefaultDatabase )
+ {
+ m_source . SchemaEvent ( p_schema, p_schemaName );
+ string dbName = ScratchDir + p_dbName;
+ if ( m_source.packed )
+ {
+ dbName += "-packed";
+ }
+ m_source . DatabaseEvent ( dbName );
+ }
+ void SetUpStream_OneTable( const string& p_dbName )
+ {
+ SetUpStream( p_dbName );
+ m_source . NewTableEvent ( DefaultTableId, DefaultTable );
+ }
+ void OpenStream_OneTableOneColumn ( const string& p_dbName )
+ {
+ SetUpStream_OneTable( p_dbName );
+ m_source . NewColumnEvent ( DefaultColumnId, DefaultTableId, DefaultColumn, 8 );
+ m_source . OpenStreamEvent();
+ }
+
+ bool SetUpForIntegerCompression( const string& p_dbName )
+ {
+ if ( ! TestSource::packed )
+ return false; // integer compaction is used in packed mode only
+
+ m_tempSchemaFile = ScratchDir + string ( p_dbName ) + ".vschema";
+ string schemaText =
+ "table table1 #1.0.0\n"
+ "{\n"
+ " column U16 column16;\n"
+ " column U32 column32;\n"
+ " column U64 column64;\n"
+ "};\n"
+ "database database1 #1\n"
+ "{\n"
+ " table table1 #1 TABLE1;\n"
+ "};\n"
+ ;
+ CreateFile ( m_tempSchemaFile, schemaText );
+ SetUpStream ( p_dbName, m_tempSchemaFile, "database1" );
+
+ m_source . NewTableEvent ( DefaultTableId, "TABLE1" );
+
+ m_source . NewColumnEvent ( Column16Id, DefaultTableId, "column16", 16, true );
+ m_source . NewColumnEvent ( Column32Id, DefaultTableId, "column32", 32, true );
+ m_source . NewColumnEvent ( Column64Id, DefaultTableId, "column64", 64, true );
+
+ return true;
+ }
+
+ void OpenCursor( const string& p_table, const string& p_column )
+ {
+ OpenDatabase();
+ const VTable * tbl;
+ THROW_ON_RC ( VDatabaseOpenTableRead ( m_db, &tbl, p_table.c_str() ) );
+ try
+ {
+ THROW_ON_RC ( VTableCreateCursorRead ( tbl, & m_cursor ) );
+
+ uint32_t idx;
+ THROW_ON_RC ( VCursorAddColumn ( m_cursor, &idx, p_column.c_str() ) );
+ THROW_ON_RC ( VCursorOpen ( m_cursor ) );
+ THROW_ON_RC ( VTableRelease ( tbl ) );
+ }
+ catch (...)
+ {
+ VTableRelease ( tbl );
+ throw;
+ }
+ }
+
+ template < typename T > T GetValue ( const string& p_table, const string& p_column, uint64_t p_row )
+ {
+ OpenCursor( p_table, p_column );
+ THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+ THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+
+ T ret;
+ uint32_t num_read;
+ THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8 * sizeof ( T ), &ret, 1, &num_read ) );
+ THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+ return ret;
+ }
+
+ template < typename T > bool IsNullValue ( const string& p_table, const string& p_column, uint64_t p_row )
+ {
+ OpenCursor( p_table, p_column );
+ THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+ THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+
+ T ret;
+ uint32_t num_read;
+ THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8 * sizeof ( T ), &ret, 1, &num_read ) );
+ THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+ return num_read == 0;
+ }
+
+ template < typename T > T GetValueWithIndex ( const string& p_table, const string& p_column, uint64_t p_row, uint32_t p_count, size_t p_index )
+ {
+ OpenCursor( p_table, p_column );
+ THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+ THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+
+ assert(1024 >= p_count);
+ T ret [ 1024 ];
+
+ uint32_t num_read;
+ THROW_ON_RC ( VCursorRead ( m_cursor, 1, (uint32_t) ( 8 * sizeof ( T ) ), &ret, p_count, &num_read ) );
+ THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+ return ret [ p_index ];
+ }
+
+ void FullLog()
+ {
+ KLogLevelSet ( klogInfo );
+ }
+
+ void CreateFile ( const string& p_name, const string& p_content )
+ {
+ ofstream out( p_name . c_str() );
+ out << p_content;
+ }
+
+ std::string GetDbMetadataAttr ( const std::string& p_node, const std::string& p_attr )
+ {
+ const KMetadata *meta;
+ THROW_ON_RC ( VDatabaseOpenMetadataRead ( m_db, &meta ) );
+
+ const KMDataNode *node;
+ THROW_ON_RC ( KMetadataOpenNodeRead ( meta, &node, p_node.c_str() ) );
+
+ size_t num_read;
+ char attr [ 256 ];
+ THROW_ON_RC ( KMDataNodeReadAttr ( node, p_attr.c_str(), attr, sizeof attr, & num_read ) );
+ THROW_ON_RC ( KMDataNodeRelease ( node ) );
+ THROW_ON_RC ( KMetadataRelease ( meta ) );
+ return string ( attr, num_read );
+ }
+
+ std::string GetMetadata ( const KMetadata* p_meta, const std::string& p_node )
+ {
+ const KMDataNode *node;
+ THROW_ON_RC ( KMetadataOpenNodeRead ( p_meta, &node, p_node.c_str() ) );
+
+ size_t num_read;
+ char buf[ 256 ];
+
+ THROW_ON_RC ( KMDataNodeReadCString ( node, buf, sizeof buf, &num_read ) );
+
+ THROW_ON_RC ( KMDataNodeRelease ( node ) );
+ return string ( buf, num_read );
+
+ }
+ std::string GetDbMetadata ( VDatabase* p_db, const std::string& p_node )
+ {
+ const KMetadata *meta;
+ THROW_ON_RC ( VDatabaseOpenMetadataRead ( p_db, &meta ) );
+ string ret = GetMetadata ( meta, p_node );
+ THROW_ON_RC ( KMetadataRelease ( meta ) );
+ return ret;
+ }
+
+ TestSource m_source;
+ VDatabase * m_db;
+ const VCursor * m_cursor;
+ KDirectory* m_wd;
+ string m_tempSchemaFile;
+ string m_ScratchDir;
+};
+
+template<> std::string GeneralLoaderFixture::GetValue ( const string& p_table, const string& p_column, uint64_t p_row )
+{
+ OpenCursor( p_table, p_column );
+ THROW_ON_RC ( VCursorSetRowId ( m_cursor, p_row ) );
+ THROW_ON_RC ( VCursorOpenRow ( m_cursor ) );
+
+ char buf[1024];
+ uint32_t num_read;
+ THROW_ON_RC ( VCursorRead ( m_cursor, 1, 8, &buf, sizeof buf, &num_read ) );
+ THROW_ON_RC ( VCursorCloseRow ( m_cursor ) );
+ return string ( buf, num_read );
+}
+
+std::string GeneralLoaderFixture :: argv0;
+
+FIXTURE_TEST_CASE ( EmptyInput, GeneralLoaderFixture )
+{
+ const struct KFile * input;
+ REQUIRE_RC ( KFileMakeNullRead ( & input ) );
+ REQUIRE ( Run ( input, SILENT_RC ( rcNS, rcFile, rcReading, rcTransfer, rcIncomplete ) ) );
+}
+
+FIXTURE_TEST_CASE ( ShortInput, GeneralLoaderFixture )
+{
+ char buffer[10];
+ const struct KFile * input;
+ REQUIRE_RC ( KRamFileMakeRead ( & input, buffer, sizeof buffer ) );
+
+ REQUIRE ( Run ( input, SILENT_RC ( rcNS, rcFile, rcReading, rcTransfer, rcIncomplete ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadSignature, GeneralLoaderFixture )
+{
+ TestSource ts ( "badsigna" );
+ REQUIRE ( Run ( ts . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcHeader, rcCorrupt ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadEndianness, GeneralLoaderFixture )
+{
+ TestSource ts ( GeneralLoaderSignatureString, 3 );
+ REQUIRE ( Run ( ts . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcFormat, rcInvalid) ) );
+}
+
+FIXTURE_TEST_CASE ( ReverseEndianness, GeneralLoaderFixture )
+{
+ TestSource ts ( GeneralLoaderSignatureString, GW_REVERSE_ENDIAN );
+ REQUIRE ( Run ( ts . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcFormat, rcUnsupported ) ) );
+}
+
+FIXTURE_TEST_CASE ( LaterVersion, GeneralLoaderFixture )
+{
+ TestSource ts ( GeneralLoaderSignatureString, GW_GOOD_ENDIAN, GW_CURRENT_VERSION + 1 );
+ REQUIRE ( Run ( ts . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcHeader, rcBadVersion ) ) );
+}
+
+//TODO: MakeTruncatedSource (stop in the middle of an event)
+
+
+FIXTURE_TEST_CASE ( BadSchemaFileName, GeneralLoaderFixture )
+{
+ m_source . SchemaEvent ( "this file should not exist", "someSchemaName" );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadSchemaFileName_Long, GeneralLoaderFixture )
+{
+ m_source . SchemaEvent ( string ( GeneralLoader :: MaxPackedString + 1, 'x' ), "someSchemaName" );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadSchemaName, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName(), "align/align.vschema", "bad schema name" );
+ m_source . OpenStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadSchemaName_Long, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName(), "align/align.vschema", string ( GeneralLoader :: MaxPackedString + 1, 'x' ) );
+ m_source . OpenStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadTableName, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( 1, "nosuchtable" );
+ m_source . OpenStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadTableName_Long, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( 1, string ( GeneralLoader :: MaxPackedString + 1, 'x' ) );
+ m_source . OpenStreamEvent();
+
+ // the expected return code is different here due to VDB's internal limitation on 256 characters in a table name
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcDB,rcDirectory,rcResolving,rcPath,rcExcessive ) ) );
+}
+
+FIXTURE_TEST_CASE ( DuplicateTableId, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( 1, DefaultTable );
+ m_source . NewTableEvent ( 1, "differentTable" ); // same Id
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcTable, rcExists ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadColumnName, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( DefaultTableId, DefaultTable );
+ m_source . NewColumnEvent ( 1, DefaultTableId, "nosuchcolumn", 8 );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( BadTableId, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( 1, DefaultTable );
+ m_source . NewColumnEvent ( 1, 2, DefaultColumn, 8 );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcTable, rcInvalid ) ) );
+}
+
+FIXTURE_TEST_CASE ( DuplicateColumnName, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, DefaultTableId, DefaultColumn, 8 );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcExists ) ) );
+}
+
+FIXTURE_TEST_CASE ( DuplicateColumnId, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 1, DefaultTableId, "NAME", 8 );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcColumn, rcExists ) ) );
+}
+
+FIXTURE_TEST_CASE ( NoOpenStreamEvent, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcNS, rcFile, rcReading, rcTransfer, rcIncomplete ) ) );
+}
+
+FIXTURE_TEST_CASE ( NoCloseStreamEvent, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . OpenStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcNS, rcFile, rcReading, rcTransfer, rcIncomplete ) ) );
+}
+
+FIXTURE_TEST_CASE ( NoColumns, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // make sure database exists and is valid
+ OpenDatabase (); // did not throw => opened successfully
+}
+
+//Testing integration of software name and version input
+FIXTURE_TEST_CASE ( SoftwareName, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ const string SoftwareName = "softwarename";
+ const string Version = "2.1.1";
+ m_source . SoftwareNameEvent ( SoftwareName, Version );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate metadata
+ OpenDatabase ();
+ REQUIRE_EQ ( SoftwareName, GetDbMetadataAttr ( "SOFTWARE/formatter", "name" ) );
+ REQUIRE_EQ ( Version, GetDbMetadataAttr ( "SOFTWARE/formatter", "vers" ) );
+
+ // extract the program name from path the same way it's done in ncbi-vdb/libs/kapp/loader-meta.c:KLoaderMeta_Write
+ {
+ const char* tool_name = strrchr(argv0.c_str(), '/');
+ const char* r = strrchr(argv0.c_str(), '\\');
+ if( tool_name != NULL && r != NULL && tool_name < r ) {
+ tool_name = r;
+ }
+ if( tool_name++ == NULL) {
+ tool_name = argv0.c_str();
+ }
+
+ REQUIRE_EQ ( string ( tool_name ), GetDbMetadataAttr ( "SOFTWARE/loader", "name" ) );
+ }
+
+ REQUIRE_EQ ( string ( __DATE__), GetDbMetadataAttr ( "SOFTWARE/loader", "date" ) );
+ {
+ char buf[265];
+ string_printf ( buf, sizeof buf, NULL, "%V", KAppVersion() ); // same format as in ncbi-vdb/libs/kapp/loader-meta.c:MakeVersion()
+ REQUIRE_EQ ( string ( buf ), GetDbMetadataAttr ( "SOFTWARE/loader", "vers" ) );
+ }
+}
+
+FIXTURE_TEST_CASE ( SoftwareName_BadVersion, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ const string SoftwareName = "softwarename";
+ const string Version = "2.1..1"; // improperly formatted
+ m_source . SoftwareNameEvent ( SoftwareName, Version );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcDatabase, rcCreating, rcMessage, rcBadVersion ) ) );
+}
+
+FIXTURE_TEST_CASE ( DBAddDatabase, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database database0 #1 { table table1 #1 TABLE1; } ;"
+ "database root_database #1 { database database0 #1 SUBDB; } ;"
+ )
+ );
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddDatabaseEvent ( 1, 0, "SUBDB", "subdb", kcmCreate );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate database
+ OpenDatabase ();
+ VDatabase * subDb;
+ REQUIRE_RC ( VDatabaseOpenDBUpdate ( m_db, & subDb, "subdb" ) );
+ REQUIRE_RC ( VDatabaseRelease ( subDb ) );
+}
+
+FIXTURE_TEST_CASE ( DBAddSubDatabase, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database database0 #1 { table table1 #1 TABLE1; } ;"
+ "database database1 #1 { database database0 #1 SUBSUBDB; } ;"
+ "database root_database #1 { database database1 #1 SUBDB; } ;"
+ )
+ );
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddDatabaseEvent ( 1, 0, "SUBDB", "subdb", kcmCreate );
+ m_source . DBAddDatabaseEvent ( 2, 1, "SUBSUBDB", "subsubdb", kcmCreate );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate database
+ OpenDatabase ();
+ VDatabase * subDb;
+ REQUIRE_RC ( VDatabaseOpenDBUpdate ( m_db, & subDb, "subdb" ) );
+ VDatabase * subSubDb;
+ REQUIRE_RC ( VDatabaseOpenDBUpdate ( subDb, & subSubDb, "subsubdb" ) );
+ REQUIRE_RC ( VDatabaseRelease ( subSubDb ) );
+ REQUIRE_RC ( VDatabaseRelease ( subDb ) );
+}
+
+FIXTURE_TEST_CASE ( DBAddTable, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database root_database #1 { table table1 #1 TABLE1; } ;"
+ )
+ );
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddTableEvent ( 1, 0, "TABLE1", "tbl", kcmCreate );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate database
+ OpenDatabase ();
+ const VTable *tbl;
+ REQUIRE_RC ( VDatabaseOpenTableRead ( m_db, & tbl, "tbl" ) );
+ REQUIRE_RC ( VTableRelease ( tbl ) );
+}
+
+FIXTURE_TEST_CASE ( DBAddTableToSubDb, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database database0 #1 { table table1 #1 TABLE1; } ;"
+ "database root_database #1 { database database0 #1 SUBDB; } ;"
+ )
+ );
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddDatabaseEvent ( 2, 0, "SUBDB", "subdb", kcmCreate );
+ m_source . DBAddTableEvent ( 1, 2, "TABLE1", "tbl", kcmCreate );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate database
+ OpenDatabase ();
+ {
+ VDatabase * subDb;
+ REQUIRE_RC ( VDatabaseOpenDBUpdate ( m_db, & subDb, "subdb" ) );
+ const VTable *tbl;
+ REQUIRE_RC ( VDatabaseOpenTableRead ( subDb, & tbl, "tbl" ) );
+ REQUIRE_RC ( VTableRelease ( tbl ) );
+ REQUIRE_RC ( VDatabaseRelease ( subDb ) );
+ }
+}
+
+FIXTURE_TEST_CASE ( DBMetadataNode, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ const string key = "dbmetadatanode";
+ const string value = "1a2b3c4d";
+ m_source . OpenStreamEvent();
+ m_source . DBMetadataNodeEvent ( 0, key, value );
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ OpenDatabase ();
+ REQUIRE_EQ ( value, GetDbMetadata( m_db, key ) );
+}
+
+FIXTURE_TEST_CASE ( SubDBMetadataNode, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database database0 #1 { table table1 #1 TABLE1; } ;"
+ "database root_database #1 { database database0 #1 SUBDB; } ;"
+ )
+ );
+ const uint32_t subDbId = 2;
+ const string key = "subdbmetadatanode";
+ const string value = "1a2b3c4dsub";
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddDatabaseEvent ( subDbId, 0, "SUBDB", "subdb", kcmCreate );
+ m_source . DBAddTableEvent ( 1, subDbId, "TABLE1", "tbl", kcmCreate );
+ m_source . OpenStreamEvent();
+ m_source . DBMetadataNodeEvent ( subDbId, key, value );
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ OpenDatabase ();
+ {
+ VDatabase * subDb;
+ REQUIRE_RC ( VDatabaseOpenDBUpdate ( m_db, & subDb, "subdb" ) );
+ REQUIRE_EQ ( value, GetDbMetadata( subDb, key ) );
+ REQUIRE_RC ( VDatabaseRelease ( subDb ) );
+ }
+}
+
+FIXTURE_TEST_CASE ( TblMetadataNode, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database root_database #1 { table table1 #1 TABLE1; } ;"
+ )
+ );
+
+ const char* tblName = "tbl";
+ const uint32_t tblId = 2;
+ const string key = "tblmetadatanode";
+ const string value = "tbl1a2b3c4d";
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddTableEvent ( tblId, 0, "TABLE1", tblName, kcmCreate );
+
+ m_source . OpenStreamEvent();
+ m_source . TblMetadataNodeEvent ( tblId, key, value);
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate database
+ OpenDatabase ();
+ {
+ const VTable *tbl;
+ REQUIRE_RC ( VDatabaseOpenTableRead ( m_db, & tbl, tblName ) );
+
+ {
+ const KMetadata *meta;
+ REQUIRE_RC ( VTableOpenMetadataRead ( tbl, &meta ) );
+ REQUIRE_EQ ( value, GetMetadata ( meta, key) );
+ REQUIRE_RC ( KMetadataRelease ( meta ) );
+ }
+ REQUIRE_RC ( VTableRelease ( tbl ) );
+ }
+}
+
+FIXTURE_TEST_CASE ( ColMetadataNode, GeneralLoaderFixture )
+{
+ string schemaFile = ScratchDir + GetName() + ".vschema";
+ CreateFile ( schemaFile,
+ string (
+ "table table1 #1.0.0 { column ascii column1; };"
+ "database root_database #1 { table table1 #1 TABLE1; } ;"
+ )
+ );
+
+ const char* tblName = "tbl";
+ const uint32_t tblId = 2;
+ const char* colName = "column1";
+ const uint32_t colId = 5;
+ const string NodeName = "colmetadatanode";
+ const string NodeValue = "1a2b3c4d";
+
+ SetUpStream ( GetName(), schemaFile, "root_database");
+
+ m_source . DBAddTableEvent ( tblId, 0, "TABLE1", tblName, kcmCreate | kcmMD5 );
+ m_source . NewColumnEvent ( colId, tblId, colName, 8 );
+
+ m_source . OpenStreamEvent();
+ m_source . ColMetadataNodeEvent ( colId, NodeName, NodeValue );
+ // need at least 2 rows with different value in order for the column to become physical, otherwise column's metadata will not be stored
+ m_source . CellDataEvent( colId, string("blah1") );
+ m_source . NextRowEvent ( tblId );
+ m_source . CellDataEvent( colId, string("brh2") );
+ m_source . NextRowEvent ( tblId );
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ // validate metadata
+ OpenDatabase ();
+ {
+ const VTable *tbl;
+ REQUIRE_RC ( VDatabaseOpenTableRead ( m_db, & tbl, tblName ) );
+
+ {
+ const KTable* ktbl;
+ REQUIRE_RC ( VTableOpenKTableRead ( tbl, & ktbl ) );
+ {
+ const KColumn* col;
+ REQUIRE_RC ( KTableOpenColumnRead ( ktbl, & col, colName ) );
+ {
+ const KMetadata *meta;
+ REQUIRE_RC ( KColumnOpenMetadataRead ( col, &meta ) );
+
+ REQUIRE_EQ ( NodeValue, GetMetadata ( meta, NodeName ) );
+
+ REQUIRE_RC ( KMetadataRelease ( meta ) );
+ }
+ REQUIRE_RC ( KColumnRelease ( col ) );
+ }
+ REQUIRE_RC ( KTableRelease ( ktbl ) );
+ }
+ REQUIRE_RC ( VTableRelease ( tbl ) );
+ }
+}
+
+FIXTURE_TEST_CASE ( NoData, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . NewTableEvent ( 2, DefaultTable ); // ids do not have to be consecutive
+ m_source . NewColumnEvent ( 222, 2, DefaultColumn, 8 );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_THROW ( OpenCursor( DefaultTable, DefaultColumn ) );
+}
+
+FIXTURE_TEST_CASE ( Chunk_BadColumnId, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ m_source . CellDataEvent( /*bad*/2, string("blah") );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( WriteNoCommit, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value = "a single character string cell";
+ m_source . CellDataEvent( DefaultColumnId, value );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_THROW ( OpenCursor( DefaultTable, DefaultColumn ) );
+}
+
+FIXTURE_TEST_CASE ( CommitBadTableId, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ m_source . NextRowEvent ( /*bad*/2 );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcExe, rcFile, rcReading, rcTable, rcNotFound ) ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnOneCellOneChunk, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value = "a single character string cell";
+ m_source . CellDataEvent( DefaultColumnId, value );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnOneCellOneChunk_Long, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value ( GeneralLoader :: MaxPackedString + 1, 'x' );
+ m_source . CellDataEvent( DefaultColumnId, value );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnOneCellManyChunks, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value1 = "first";
+ m_source . CellDataEvent( DefaultColumnId, value1 );
+ string value2 = "second!";
+ m_source . CellDataEvent( DefaultColumnId, value2 );
+ string value3 = "third!!!";
+ m_source . CellDataEvent( DefaultColumnId, value3 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1 + value2 + value3, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( IntegerCompression_MinimumCompression, GeneralLoaderFixture )
+{
+ if ( ! SetUpForIntegerCompression ( GetName() ) )
+ return;
+
+ // no compression ( adds 1 byte per value )
+ const uint16_t u16value = 0x3456;
+ const uint32_t u32value = 0x789abcde;
+ const uint64_t u64value = 0x0F0F0F0F0F0F0F0FLL;
+
+ m_source . OpenStreamEvent();
+
+ uint8_t buf[128];
+
+ int bytes = encode_uint16 ( u16value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 3, bytes );
+ m_source . CellDataEventRaw ( Column16Id, 1, buf, bytes );
+
+ bytes = encode_uint32 ( u32value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 5, bytes );
+ m_source . CellDataEventRaw ( Column32Id, 1, buf, bytes );
+
+ bytes = encode_uint64 ( u64value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 9, bytes );
+ m_source . CellDataEventRaw ( Column64Id, 1, buf, bytes );
+
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( u16value, GetValue<uint16_t> ( "TABLE1", "column16", 1 ) );
+ REQUIRE_EQ ( u32value, GetValue<uint32_t> ( "TABLE1", "column32", 1 ) );
+ REQUIRE_EQ ( u64value, GetValue<uint64_t> ( "TABLE1", "column64", 1 ) );
+}
+
+FIXTURE_TEST_CASE ( IntegerCompression_MaximumCompression, GeneralLoaderFixture )
+{
+ if ( ! SetUpForIntegerCompression ( GetName() ) )
+ return;
+
+ // induce maximum compression ( 1 byte per value <= 0x7F )
+ const uint16_t u16value = 0;
+ const uint32_t u32value = 2;
+ const uint64_t u64value = 0x7F;
+
+ m_source . OpenStreamEvent();
+
+ uint8_t buf[128];
+
+ int bytes = encode_uint16 ( u16value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 1, bytes );
+ m_source . CellDataEventRaw ( Column16Id, 1, buf, bytes );
+
+ bytes = encode_uint32 ( u32value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 1, bytes );
+ m_source . CellDataEventRaw ( Column32Id, 1, buf, bytes );
+
+ bytes = encode_uint64 ( u64value, buf, buf + sizeof buf );
+ REQUIRE_EQ ( 1, bytes );
+ m_source . CellDataEventRaw ( Column64Id, 1, buf, bytes );
+
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( u16value, GetValue<uint16_t> ( "TABLE1", "column16", 1 ) );
+ REQUIRE_EQ ( u32value, GetValue<uint32_t> ( "TABLE1", "column32", 1 ) );
+ REQUIRE_EQ ( u64value, GetValue<uint64_t> ( "TABLE1", "column64", 1 ) );
+}
+
+FIXTURE_TEST_CASE ( IntegerCompression_MultipleValues, GeneralLoaderFixture )
+{
+ if ( ! SetUpForIntegerCompression ( GetName() ) )
+ return;
+
+ // induce maximum compression ( 1 byte per value <= 0x7F )
+ const uint16_t u16value1 = 0x0001; const uint16_t u16value2 = 0x0002;
+ const uint32_t u32value1 = 0x00000003; const uint32_t u32value2 = 0x00000004;
+ const uint64_t u64value1 = 0x0000000000000006; const uint64_t u64value2 = 0x0000000000000007;
+
+ m_source . OpenStreamEvent();
+
+ uint8_t buf[128];
+
+ {
+ int bytesTotal = 0;
+ int bytes = encode_uint16 ( u16value1, buf, buf + sizeof buf );
+ bytesTotal += bytes;
+ bytes = encode_uint16 ( u16value2, buf + bytesTotal, buf + sizeof buf );
+ bytesTotal += bytes;
+ REQUIRE_EQ ( 2, bytesTotal );
+ m_source . CellDataEventRaw ( Column16Id, 2, buf, bytesTotal );
+ }
+
+ {
+ int bytesTotal = 0;
+ int bytes = encode_uint32 ( u32value1, buf, buf + sizeof buf );
+ bytesTotal += bytes;
+ bytes = encode_uint32 ( u32value2, buf + bytesTotal, buf + sizeof buf );
+ bytesTotal += bytes;
+ REQUIRE_EQ ( 2, bytesTotal );
+ m_source . CellDataEventRaw ( Column32Id, 2, buf, bytesTotal );
+ }
+
+ {
+ int bytesTotal = 0;
+ int bytes = encode_uint64 ( u64value1, buf, buf + sizeof buf );
+ bytesTotal += bytes;
+ bytes = encode_uint64 ( u64value2, buf + bytesTotal, buf + sizeof buf );
+ bytesTotal += bytes;
+ REQUIRE_EQ ( 2, bytesTotal );
+ m_source . CellDataEventRaw ( Column64Id, 2, buf, bytesTotal );
+ }
+
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( u16value1, GetValueWithIndex<uint16_t> ( "TABLE1", "column16", 1, 2, 0 ) );
+ REQUIRE_EQ ( u16value2, GetValueWithIndex<uint16_t> ( "TABLE1", "column16", 1, 2, 1 ) );
+ REQUIRE_EQ ( u32value1, GetValueWithIndex<uint32_t> ( "TABLE1", "column32", 1, 2, 0 ) );
+ REQUIRE_EQ ( u32value2, GetValueWithIndex<uint32_t> ( "TABLE1", "column32", 1, 2, 1 ) );
+ REQUIRE_EQ ( u64value1, GetValueWithIndex<uint64_t> ( "TABLE1", "column64", 1, 2, 0 ) );
+ REQUIRE_EQ ( u64value2, GetValueWithIndex<uint64_t> ( "TABLE1", "column64", 1, 2, 1 ) );
+}
+
+// default values
+
+FIXTURE_TEST_CASE ( OneColumnDefaultNoWrite, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value = "this be my default";
+ m_source . CellDefaultEvent( DefaultColumnId, value );
+ // no WriteEvent
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnDefaultNoWrite_Long, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value ( GeneralLoader :: MaxPackedString + 1, 'x' );
+ m_source . CellDefaultEvent( DefaultColumnId, value );
+ // no WriteEvent
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( MoveAhead, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value = "this be my default";
+ m_source . CellDefaultEvent( DefaultColumnId, value );
+ m_source . MoveAheadEvent ( DefaultTableId, 3 );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 2 ) );
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 3 ) );
+ REQUIRE_THROW ( GetValue<string> ( DefaultTable, DefaultColumn, 4 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnDefaultOverwite, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string valueDflt = "this be my default";
+ m_source . CellDefaultEvent( DefaultColumnId, valueDflt );
+ string value = "not the default";
+ m_source . CellDataEvent( DefaultColumnId, value );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnChangeDefault, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value1 = "this be my first default";
+ m_source . CellDefaultEvent( DefaultColumnId, value1 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ string value2 = "and this be my second default";
+ m_source . CellDefaultEvent( DefaultColumnId, value2 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( value2, GetValue<string> ( DefaultTable, DefaultColumn, 2 ) );
+}
+
+FIXTURE_TEST_CASE ( OneColumnDataAndDefaultsMixed, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ string value1 = "first value";
+ m_source . CellDataEvent( DefaultColumnId, value1 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ string default1 = "first default";
+ m_source . CellDefaultEvent( DefaultColumnId, default1 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ string value2 = "second value";
+ m_source . CellDefaultEvent( DefaultColumnId, value2 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ string default2 = "second default";
+ m_source . CellDefaultEvent( DefaultColumnId, default2 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( default1, GetValue<string> ( DefaultTable, DefaultColumn, 2 ) );
+ REQUIRE_EQ ( default1, GetValue<string> ( DefaultTable, DefaultColumn, 3 ) );
+ REQUIRE_EQ ( value2, GetValue<string> ( DefaultTable, DefaultColumn, 4 ) );
+ REQUIRE_EQ ( default2, GetValue<string> ( DefaultTable, DefaultColumn, 5 ) );
+}
+
+FIXTURE_TEST_CASE ( TwoColumnsFullRow, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, DefaultTableId, U32Column, 32 );
+ m_source . OpenStreamEvent();
+
+ string value1 = "value1";
+ m_source . CellDataEvent( 1, value1 );
+ uint32_t value2 = 12345;
+ m_source . CellDataEvent( 2, value2 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( value2, GetValue<uint32_t> ( DefaultTable, U32Column, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( TwoColumnsIncompleteRow, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, DefaultTableId, U32Column, 32 );
+ m_source . OpenStreamEvent();
+
+ string value1 = "value1";
+ m_source . CellDataEvent( 1, value1 );
+ // no CellData for column 2
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), SILENT_RC ( rcVDB, rcColumn, rcClosing, rcRow, rcIncomplete) ) );
+}
+
+FIXTURE_TEST_CASE ( TwoColumnsPartialRowWithDefaults, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, DefaultTableId, U32Column, 32 );
+ m_source . OpenStreamEvent();
+
+ string value1 = "value1";
+ m_source . CellDataEvent( 1, value1 );
+ uint32_t value2 = 12345;
+ m_source . CellDefaultEvent( 2, value2 );
+ // no Data Event for column2
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( value2, GetValue<uint32_t> ( DefaultTable, U32Column, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( TwoColumnsPartialRowWithDefaultsAndOverride, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+
+ m_source . NewColumnEvent ( 1, DefaultTableId, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, DefaultTableId, U32Column, 32 );
+ m_source . NewColumnEvent ( 3, DefaultTableId, BoolColumn, 8 );
+ m_source . OpenStreamEvent();
+
+ string value1 = "value1";
+ m_source . CellDataEvent( 1, value1 );
+ uint32_t value2 = 12345;
+ m_source . CellDefaultEvent( 2, value2 );
+ m_source . CellDefaultEvent( 3, false );
+ bool value3 = true;
+ m_source . CellDataEvent( 3, true ); // override default
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( value1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) ); // explicit
+ REQUIRE_EQ ( value2, GetValue<uint32_t> ( DefaultTable, U32Column, 1 ) ); // default
+ REQUIRE_EQ ( value3, GetValue<bool> ( DefaultTable, BoolColumn, 1 ) ); // not the default
+}
+
+FIXTURE_TEST_CASE ( EmptyDefault_String, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+
+ m_source . OpenStreamEvent();
+
+ m_source . CellEmptyDefaultEvent( 1 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( string(), GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( EmptyDefault_Int, GeneralLoaderFixture )
+{
+ SetUpStream_OneTable ( GetName() );
+
+ m_source . NewColumnEvent ( 1, DefaultTableId, U32Column, 32 );
+ m_source . OpenStreamEvent();
+
+ m_source . CellEmptyDefaultEvent( 1 );
+ m_source . NextRowEvent ( DefaultTableId );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE ( IsNullValue<uint32_t> ( DefaultTable, U32Column, 1 ) );
+}
+
+FIXTURE_TEST_CASE ( MultipleTables_Multiple_Columns_MultipleRows, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+
+ m_source . NewTableEvent ( 100, DefaultTable );
+ m_source . NewColumnEvent ( 1, 100, DefaultColumn, 8 );
+ m_source . NewColumnEvent ( 2, 100, U32Column, 32 );
+
+ m_source . NewTableEvent ( 200, Table2 );
+ m_source . NewColumnEvent ( 3, 200, I64Column, 64 );
+ m_source . NewColumnEvent ( 4, 200, U8Column, 8 );
+
+ m_source . OpenStreamEvent();
+
+ string t1c1v1 = "t1c1v1";
+ m_source . CellDataEvent( 1, t1c1v1 );
+ uint32_t t1c2v1 = 121;
+ m_source . CellDataEvent( 2, t1c2v1 );
+ m_source . NextRowEvent ( 100 );
+
+ int64_t t2c1v1 = 211;
+ m_source . CellDataEvent( 3, t2c1v1 );
+ uint8_t t2c2v1 = 221;
+ m_source . CellDataEvent( 4, t2c2v1 );
+ m_source . NextRowEvent ( 200 );
+
+ string t1c1v2 = "t1c1v2";
+ m_source . CellDataEvent( 1, t1c1v2 );
+ uint32_t t1c2v2 = 122;
+ m_source . CellDataEvent( 2, t1c2v2 );
+ m_source . NextRowEvent ( 100 );
+
+ int64_t t2c1v2 = 212;
+ m_source . CellDataEvent( 3, t2c1v2 );
+ uint8_t t2c2v2 = 222;
+ m_source . CellDataEvent( 4, t2c2v2 );
+ m_source . NextRowEvent ( 200 );
+
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+
+ REQUIRE_EQ ( t1c1v1, GetValue<string> ( DefaultTable, DefaultColumn, 1 ) );
+ REQUIRE_EQ ( t1c2v1, GetValue<uint32_t> ( DefaultTable, U32Column, 1 ) );
+ REQUIRE_EQ ( t2c1v1, GetValue<int64_t> ( Table2, I64Column, 1 ) );
+ REQUIRE_EQ ( t2c2v1, GetValue<uint8_t> ( Table2, U8Column, 1 ) );
+
+ REQUIRE_EQ ( t1c1v2, GetValue<string> ( DefaultTable, DefaultColumn, 2 ) );
+ REQUIRE_EQ ( t1c2v2, GetValue<uint32_t> ( DefaultTable, U32Column, 2 ) );
+ REQUIRE_EQ ( t2c1v2, GetValue<int64_t> ( Table2, I64Column, 2 ) );
+ REQUIRE_EQ ( t2c2v2, GetValue<uint8_t> ( Table2, U8Column, 2 ) );
+}
+
+FIXTURE_TEST_CASE ( AdditionalSchemaIncludePaths_Single, GeneralLoaderFixture )
+{
+ string schemaPath = "schema";
+ string includeName = string ( GetName() ) + ".inc.vschema";
+ string schemaIncludeFile = schemaPath + "/" + includeName;
+ CreateFile ( schemaIncludeFile, "table table1 #1.0.0 { column ascii column1; };" );
+ string schemaFile = string ( GetName() ) + ".vschema";
+ CreateFile ( schemaFile, string ( "include '" ) + includeName + "'; database database1 #1 { table table1 #1 TABLE1; } ;" );
+
+ SetUpStream ( GetName(), schemaFile, "database1" );
+
+ const char* table1 = "TABLE1";
+ const char* column1 = "column1";
+ m_source . NewTableEvent ( DefaultTableId, table1 );
+ m_source . NewColumnEvent ( DefaultColumnId, DefaultTableId, column1, 8 );
+ m_source . OpenStreamEvent();
+
+ string t1c1v1 = "t1c1v1";
+ m_source . CellDataEvent( DefaultColumnId, t1c1v1 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ gl -> AddSchemaIncludePath ( schemaPath );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( t1c1v1, GetValue<string> ( table1, column1, 1 ) );
+
+ remove ( schemaIncludeFile . c_str() );
+ remove ( schemaFile . c_str() );
+}
+
+FIXTURE_TEST_CASE ( AdditionalSchemaIncludePaths_Multiple, GeneralLoaderFixture )
+{
+ string schemaPath = "schema";
+ string includeName = string ( GetName() ) + ".inc.vschema";
+ string schemaIncludeFile = schemaPath + "/" + includeName;
+ CreateFile ( schemaIncludeFile, "table table1 #1.0.0 { column ascii column1; };" );
+ string schemaFile = string ( GetName() ) + ".vschema";
+ CreateFile ( schemaFile, string ( "include '" ) + includeName + "'; database database1 #1 { table table1 #1 TABLE1; } ;" );
+
+ SetUpStream ( GetName(), schemaFile, "database1" );
+
+ const char* table1 = "TABLE1";
+ const char* column1 = "column1";
+ m_source . NewTableEvent ( DefaultTableId, table1 );
+ m_source . NewColumnEvent ( DefaultColumnId, DefaultTableId, column1, 8 );
+ m_source . OpenStreamEvent();
+
+ string t1c1v1 = "t1c1v1";
+ m_source . CellDataEvent( DefaultColumnId, t1c1v1 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ gl -> AddSchemaIncludePath ( "path1" );
+ gl -> AddSchemaIncludePath ( string ( "path2:" ) + schemaPath + ":path3" );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( t1c1v1, GetValue<string> ( table1, column1, 1 ) );
+
+ remove ( schemaIncludeFile . c_str() );
+ remove ( schemaFile . c_str() );
+}
+
+FIXTURE_TEST_CASE ( AdditionalSchemaFiles_Single, GeneralLoaderFixture )
+{
+ string schemaPath = "schema";
+ string schemaFile = schemaPath + "/" + GetName() + ".vschema";
+ CreateFile ( schemaFile, "table table1 #1.0.0 { column ascii column1; }; database database1 #1 { table table1 #1 TABLE1; };" );
+
+ // here we specify a schema that does not exist but it's OK as long as we add a good schema later
+ SetUpStream ( GetName(), "does not exist", "database1" );
+
+ const char* table1 = "TABLE1";
+ const char* column1 = "column1";
+ m_source . NewTableEvent ( DefaultTableId, table1 );
+ m_source . NewColumnEvent ( DefaultColumnId, DefaultTableId, column1, 8 );
+ m_source . OpenStreamEvent();
+
+ string t1c1v1 = "t1c1v1";
+ m_source . CellDataEvent( DefaultColumnId, t1c1v1 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ gl -> AddSchemaFile ( schemaFile );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( t1c1v1, GetValue<string> ( table1, column1, 1 ) );
+
+ remove ( schemaFile . c_str() );
+}
+
+FIXTURE_TEST_CASE ( AdditionalSchemaFiles_Multiple, GeneralLoaderFixture )
+{
+ string schemaPath = "schema";
+ string schemaFile1 = schemaPath + "/" + GetName() + "1.vschema";
+ CreateFile ( schemaFile1, "table table1 #1.0.0 { column ascii column1; };" );
+ string schemaFile2 = schemaPath + "/" + GetName() + "2.vschema";
+ CreateFile ( schemaFile2, "database database1 #1 { table table1 #1 TABLE1; };" ); // this file uses table1 defined in schemaFile1
+
+ string dbFile = string ( GetName() ) + ".db";
+
+ // here we specify a schema that does not exist but it's OK as long as we add a good schema later
+ m_source . SchemaEvent ( "does not exist", "database1" );
+ m_source . DatabaseEvent ( dbFile );
+
+ const char* table1 = "TABLE1";
+ const char* column1 = "column1";
+ m_source . NewTableEvent ( DefaultTableId, table1 );
+ m_source . NewColumnEvent ( DefaultColumnId, DefaultTableId, column1, 8 );
+ m_source . OpenStreamEvent();
+
+ string t1c1v1 = "t1c1v1";
+ m_source . CellDataEvent( DefaultColumnId, t1c1v1 );
+ m_source . NextRowEvent ( DefaultTableId );
+ m_source . CloseStreamEvent();
+
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ gl -> AddSchemaFile ( schemaFile1 + ":garbage.vschema:" + schemaFile2 ); // some are good
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_EQ ( t1c1v1, GetValue<string> ( table1, column1, 1 ) );
+
+ remove ( schemaFile1 . c_str() );
+ remove ( schemaFile2 . c_str() );
+}
+
+FIXTURE_TEST_CASE ( ErrorMessage, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+ m_source . OpenStreamEvent();
+ m_source . ErrorMessageEvent ( "error message" );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), RC ( rcExe, rcFile, rcReading, rcError, rcExists ) ) );
+}
+
+FIXTURE_TEST_CASE ( ErrorMessage_Long, GeneralLoaderFixture )
+{
+ OpenStream_OneTableOneColumn ( GetName() );
+ m_source . OpenStreamEvent();
+ m_source . ErrorMessageEvent ( string ( 257, 'x' ) );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), RC ( rcExe, rcFile, rcReading, rcError, rcExists ) ) );
+}
+
+FIXTURE_TEST_CASE ( LogMessage, GeneralLoaderFixture )
+{
+//FullLog();
+// uncomment the line above to see the message on stdout, eg:
+// 2016-01-05T18:45:01 test-general-loader.1 info: general-loader: log from front-end-app: "some log message"
+
+ OpenStream_OneTableOneColumn ( GetName() );
+ const string SoftwareName = "front-end-app";
+ const string Version = "2.1.1";
+ m_source . SoftwareNameEvent ( SoftwareName, Version );
+ m_source . OpenStreamEvent();
+ m_source . LogMessageEvent ( "some log message" );
+ m_source . CloseStreamEvent();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+}
+
+
+FIXTURE_TEST_CASE ( ProgressMessage, GeneralLoaderFixture )
+{
+ // timestamp
+ time_t timestamp = time ( NULL );
+
+ OpenStream_OneTableOneColumn ( GetName() );
+ m_source . OpenStreamEvent ();
+ m_source . ProgMessageEvent ( 123, "progress message", timestamp, 2, 45 );
+ m_source . CloseStreamEvent ();
+
+ REQUIRE ( Run ( m_source . MakeSource (), 0 ) );
+}
+
+
+FIXTURE_TEST_CASE ( TargetOverride, GeneralLoaderFixture )
+{
+ SetUpStream ( GetName() );
+ m_source . OpenStreamEvent();
+ m_source . CloseStreamEvent();
+
+ string newTarget = string ( GetName() ) + "_override";
+ {
+ GeneralLoader* gl = MakeLoader ( m_source . MakeSource () );
+ gl -> SetTargetOverride ( newTarget );
+ REQUIRE ( RunLoader ( *gl, 0 ) );
+ delete gl;
+ } // make sure loader is destroyed (= db closed) before we reopen the database for verification
+
+ REQUIRE_THROW ( OpenDatabase() ); // the db from the instruction stream was not created
+ OpenDatabase ( newTarget . c_str() ); // did not throw => overridden target db opened successfully
+
+ // clean up
+ CloseDatabase();
+ KDirectoryRemove ( m_wd, true, newTarget . c_str() );
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "test-general-loader";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+// TestEnv::verbosity = LogLevel::e_all;
+ KConfigDisableUserSettings();
+
+ ClearScratchDir();
+
+ GeneralLoaderFixture :: argv0 = argv[0];
+
+ TestSource::packed = false;
+ cerr << "Unpacked protocol: ";
+ rc_t rc = GeneralLoaderTestSuite(argc, argv);
+ if ( rc == 0 )
+ {
+ ClearScratchDir();
+
+ TestSource::packed = true;
+ cerr << "Packed protocol: ";
+ rc = GeneralLoaderTestSuite(argc, argv);
+ }
+
+ ClearScratchDir();
+
+ return rc;
+}
+
+}
+
diff --git a/test/general-loader/test-general-writer.cpp b/test/general-loader/test-general-writer.cpp
new file mode 100644
index 0000000..902b2eb
--- /dev/null
+++ b/test/general-loader/test-general-writer.cpp
@@ -0,0 +1,341 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "../../tools/general-loader/general-writer.hpp"
+
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <cstdlib>
+#include <cstring>
+#include <cstdio>
+
+namespace ncbi
+{
+
+ GeneralWriter * testCreateGw ( const char * out_path, const char * schema_path, const char * software_name, const char * version )
+ {
+ GeneralWriter * ret;
+ if ( out_path == 0 )
+ {
+ // use stdout
+ ret = new GeneralWriter ( 1 );
+ }
+ else
+ {
+ // use a file
+ ret = new GeneralWriter ( out_path );
+ }
+
+ ret -> setRemotePath ( schema_path );
+ ret -> useSchema ( schema_path, std :: string ( "general_writer:test:db" ) );
+ ret -> setSoftwareName ( software_name, version );
+
+ return ret;
+ }
+
+ int testAddTable ( GeneralWriter *gw )
+ {
+ return gw -> addTable ( std :: string ( "table1" ) );
+ }
+
+ void testAddColumn ( GeneralWriter *gw, int table_id, const char *column_names [], int column_count, int *stream_ids )
+ {
+ for ( int i = 0; i < column_count; ++ i )
+ {
+ const char *name = column_names [ i ];
+ stream_ids [ i ] = gw -> addColumn ( table_id, name, 8, 0 ); // all columns are ascii for now
+ }
+ }
+
+ void testDBAddDatabase ( GeneralWriter *gw, const char *mbr_name, const char *db_name, uint8_t create_mode )
+ {
+ gw -> dbAddDatabase ( 0, mbr_name, db_name, create_mode );
+ }
+
+ void testDBAddTable ( GeneralWriter *gw, const char *mbr_name, const char *table_name, uint8_t create_mode )
+ {
+ gw -> dbAddDatabase ( 0, mbr_name, table_name, create_mode );
+ }
+
+ void testOpen ( GeneralWriter *gw )
+ {
+ gw -> open ();
+ }
+
+ void testColumnDefault ( GeneralWriter *gw, int stream_id )
+ {
+ const char *data = "some string as data";
+ gw -> columnDefault ( stream_id, 8, data, strlen ( data ) );
+ }
+
+ void testWrite ( GeneralWriter *gw, int table_id, int *stream_ids, int column_count, const char *file_names [] )
+ {
+ FILE **columns = ( FILE ** ) calloc ( column_count, sizeof *columns );
+ if ( columns == NULL )
+ throw "Failed to allocate memory";
+
+ char buffer [ 4096 ];
+ size_t buff_size = sizeof buffer;
+
+ // Populate array of file pointers
+ for ( int i = 0; i < column_count; ++ i )
+ {
+ const char *name = file_names [ i ];
+ FILE *column = fopen ( name, "r" );
+
+ if ( column == NULL )
+ throw "Error opening file";
+
+ columns [ i ] = column;
+
+ column = 0;
+ }
+
+ // open the stream
+ gw -> open ();
+
+ // set default values for each column
+ for ( int i = 0; i < column_count; ++ i )
+ gw -> columnDefault ( stream_ids [ i ], 8, "EOF", strlen ( "EOF" ) );
+
+ while ( 1 )
+ {
+ bool validColumn = false;
+ // write one line from each column
+ for ( int i = 0; i < column_count; ++ i )
+ {
+ // Skip any NULL entries in the FILE array
+ if ( columns [ i ] == NULL )
+ continue;
+
+ FILE *column = columns [ i ];
+
+ if ( fgets ( buffer, buff_size, column ) == NULL )
+ {
+ if ( ferror ( column ) )
+ {
+ fclose ( column );
+ throw "Error reading from file";
+ }
+
+ // Found EOF while reading cell data
+ // close FILE and set array pointer to NULL
+ fclose ( column );
+ column = 0;
+ columns [ i ] = 0;
+ continue;
+ }
+
+ // found valid data, write line and go to next column
+ int elem_count = strlen ( ( const char * ) buffer );
+
+ // ensure there are no new lines at the end of the string
+ for ( int j = elem_count - 1; j >= 0; -- j )
+ {
+ if ( buffer [ j ] == '\n' )
+ -- elem_count;
+ }
+
+ gw -> write ( stream_ids [ i ], 8, buffer, elem_count );
+ validColumn = true;
+ }
+
+ if ( ! validColumn )
+ break;
+
+ // go to the next row
+ gw -> nextRow ( table_id );
+ }
+ free ( columns );
+ }
+
+ void testAddDBMetadataNode ( GeneralWriter *gw, const char * node, const char *value )
+ {
+ gw -> setDBMetadataNode ( 0, node, value );
+ }
+
+ void testAddTblMetadataNode ( GeneralWriter *gw, const char * node, const char *value )
+ {
+ gw -> setTblMetadataNode ( 1, node, value );
+ }
+
+ void testAddColMetadataNode ( GeneralWriter *gw, const char * node, const char *value )
+ {
+ gw -> setColMetadataNode ( 1, node, value );
+ }
+
+ void testProgMsg ( GeneralWriter *gw, const char *name,
+ uint32_t version, uint64_t done, uint64_t total )
+ {
+ gw -> progMsg ( name, version, done, total );
+ }
+
+ void testEndStream ( GeneralWriter *gw )
+ {
+ gw -> endStream ();
+
+ try
+ {
+ std :: cerr << "Attempting add table after endStream" << std :: endl;
+ gw -> addTable ( "table1" );
+ }
+ catch ( const char x [] )
+ {
+ std :: cerr << x << std :: endl;
+ std :: cerr << "addTable correctly failed" << std :: endl;
+ }
+ }
+
+ void runTest ( int column_count, const char * columns [], const char *outfile, const char * schema_path )
+ {
+ GeneralWriter *gw;
+ try
+ {
+ const char * column_names [ column_count ];
+
+ for ( int i = 0; i < column_count ; ++ i )
+ column_names [ i ] = columns [ i ];
+
+ gw = testCreateGw ( outfile, schema_path, "softwarename", "2" );
+ std :: cerr << "CreateGw Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ int table_id = testAddTable ( gw );
+ std :: cerr << "addTable Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ int stream_ids [ column_count ];
+ testAddColumn ( gw, table_id, column_names, column_count, stream_ids );
+ std :: cerr << "addColumn Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testDBAddDatabase ( gw, "member_name", "db_name", 1 );
+ std :: cerr << "dbAddDatabase Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testDBAddTable ( gw, "member_name", "table_name", 1 );
+ std :: cerr << "dbAddTable Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testWrite ( gw, table_id, stream_ids, column_count, column_names );
+ std :: cerr << "write Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testAddDBMetadataNode ( gw, "db_metadata_node", "01a2b3c4d" );
+ std :: cerr << "setDBMetadataNode Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+ testAddTblMetadataNode ( gw, "tbl_metadata_node", "01a2b3c4d" );
+ std :: cerr << "setTblMetadataNode Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+ testAddColMetadataNode ( gw, "col_metadata_node", "01a2b3c4d" );
+ std :: cerr << "setColMetadataNode Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testProgMsg ( gw, "name", 1, 54768, 64000 );
+ std :: cerr << "setProgMsg Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ testEndStream ( gw );
+ std :: cerr << "endStream Success" << std :: endl;
+ std :: cerr << "---------------------------------" << std :: endl;
+
+ }
+ catch ( ... )
+ {
+ delete gw;
+ throw;
+ }
+ delete gw;
+ }
+}
+
+const char * getArg ( const char* &arg, int & i, int argc, char * argv [] )
+{
+ if ( arg [ 1 ] != 0 )
+ {
+ const char * next = arg + 1;
+ arg = "\0";
+ return next;
+ }
+
+ if ( ++ i == argc )
+ throw "Missing argument";
+
+ return argv [ i ];
+}
+
+int main ( int argc, char * argv [] )
+{
+ int status = 1;
+
+ try
+ {
+
+ const char *outfile = "./db/";
+ const char *schema_path = "./test-general-writer.vschema";
+ int num_columns = 0;
+
+ for ( int i = 1; i < argc; ++ i )
+ {
+ const char * arg = argv [ i ];
+ if ( arg [ 0 ] != '-' )
+ {
+ // have an input column
+ argv [ num_columns ++ ] = ( char* ) arg;
+ }
+ else do switch ( ( ++ arg ) [ 0 ] )
+ {
+ case 'o':
+ outfile = getArg ( arg, i, argc, argv );
+ break;
+ case 's':
+ schema_path = getArg ( arg, i, argc, argv );
+ default:
+ throw "Invalid argument";
+ }
+ while ( arg [ 1 ] != 0 );
+ }
+
+ if ( num_columns == 0 )
+ {
+ const char * columns [ 2 ] = { "input/column01", "input/column02" };
+ ncbi :: runTest ( 2, columns, outfile, schema_path );
+ }
+ else
+ {
+ ncbi :: runTest ( num_columns, ( const char ** ) argv, outfile, schema_path );
+ }
+
+ status = 0;
+ }
+ catch ( const char x [] )
+ {
+ std :: cerr << x << std :: endl;
+ }
+
+ return status;
+}
diff --git a/test/general-loader/test-gw-dumper.cpp b/test/general-loader/test-gw-dumper.cpp
new file mode 100644
index 0000000..6a6347d
--- /dev/null
+++ b/test/general-loader/test-gw-dumper.cpp
@@ -0,0 +1,80 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _cpp_gw_dumper_test_
+#define _cpp_gw_dumper_test_
+
+#ifndef _hpp_general_writer_
+#include "general-writer.hpp"
+#endif
+
+#include <kfs/defs.h>
+
+namespace ncbi
+{
+ static
+ void run ()
+ {
+ GeneralWriter gw ( "test-gw-dumper.gw" );
+
+ gw . setRemotePath ( "remote-path" );
+ gw . setSoftwareName ( "gw-dumper-test", "0.9.0" );
+ gw . useSchema ( "schemafile.vschema", "db_spec.schema" );
+
+ int db_id = gw . dbAddDatabase ( 0, "db1", "db1", kcmCreate );
+ gw . setDBMetadataNode ( db_id, "node/path", "value01" );
+
+ int tbl_id = gw . dbAddTable ( db_id, "tbl1", "tbl1", kcmCreate );
+ gw . setTblMetadataNode ( tbl_id, "tbl/path", "value01" );
+
+ int col_id = gw . addColumn ( tbl_id, "col1", 64, 0 );
+ gw . setColMetadataNode ( col_id, "col/path", "value01" );
+
+ tbl_id = gw . addTable ( "tbl2" );
+ gw . setTblMetadataNode ( tbl_id, "tbl2/path", "value02" );
+ }
+}
+
+
+int main ( int argc, char * argv [] )
+{
+ try
+ {
+ ncbi :: run ();
+ }
+ catch ( const char x [] )
+ {
+ std :: cerr << "caught exception: " << x << '\n';
+ }
+ catch ( ... )
+ {
+ std :: cerr << "caught exception\n";
+ }
+
+ return 0;
+}
+
+#endif //_cpp_gw_dumper_test_
diff --git a/test/general-loader/testsource.cpp b/test/general-loader/testsource.cpp
new file mode 100644
index 0000000..ccbeae5
--- /dev/null
+++ b/test/general-loader/testsource.cpp
@@ -0,0 +1,758 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Test stream creation class for unit-testing General Loader
+*/
+
+#include "testsource.hpp"
+
+#include "../../tools/general-loader/general-loader.hpp"
+
+#include <kfs/ramfile.h>
+
+#include <sysalloc.h>
+
+#include <cstring>
+
+#include <stdexcept>
+
+using namespace std;
+using namespace ncbi;
+
+/////////////////////////////////////////////// TestSource::Buffer
+
+TestSource::Buffer::Buffer ( const string& p_signature, uint32_t p_endness, uint32_t p_version, bool p_packing )
+: m_buffer ( 0 ), m_bufSize ( 0 )
+{
+ init ( m_header );
+ strncpy ( m_header . dad . signature, p_signature . c_str(), sizeof m_header . dad . signature );
+ m_header . dad . endian = p_endness;
+ m_header . dad . version = p_version;
+ m_header . packing = p_packing ? 1 : 0;
+
+ Write ( & m_header, m_header . dad . hdr_size );
+}
+
+TestSource::Buffer::~Buffer ()
+{
+ free ( m_buffer );
+}
+
+void
+TestSource::Buffer::Save ( std::ostream& p_out ) const
+{
+ p_out . write ( m_buffer, m_bufSize );
+}
+
+void
+TestSource::Buffer::Write ( const void * p_data, size_t p_size )
+{
+ m_buffer = ( char * ) realloc ( m_buffer, m_bufSize + p_size );
+ if ( m_buffer == 0 )
+ throw logic_error ( "TestSource::Buffer::Write: realloc failed" );
+
+ memmove ( m_buffer + m_bufSize, p_data, p_size );
+ m_bufSize += p_size;
+}
+
+void
+TestSource::Buffer::Pad ( size_t p_alignment )
+{
+ size_t newSize = ( m_bufSize + p_alignment - 1 ) / p_alignment;
+ newSize *= p_alignment;
+ if ( m_bufSize != newSize )
+ {
+ m_buffer = ( char * ) realloc ( m_buffer, newSize );
+ if ( m_buffer == 0 )
+ throw logic_error ( "TestSource::Buffer::Write: realloc failed" );
+ memset ( m_buffer + m_bufSize, 0, newSize - m_bufSize );
+ m_bufSize = newSize;
+ }
+}
+
+void
+TestSource::Buffer::Write ( const TestSource::Event& p_event )
+{
+ if ( m_header . packing )
+ {
+ WritePacked ( p_event );
+ }
+ else
+ {
+ WriteUnpacked ( p_event );
+ }
+}
+
+void
+TestSource::Buffer::WriteUnpacked ( const TestSource::Event& p_event )
+{
+ Pad ();
+ switch ( p_event . m_event )
+ {
+ case evt_use_schema:
+ case evt_software_name:
+ case evt_db_metadata_node:
+ case evt_tbl_metadata_node:
+ case evt_col_metadata_node:
+ {
+ gw_2string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_size1 ( hdr, p_event . m_str1 . size() );
+ set_size2 ( hdr, p_event . m_str2 . size() );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ Write ( p_event . m_str2 . c_str(), p_event . m_str2 . size() );
+ }
+ break;
+
+ case evt_remote_path:
+ case evt_new_table:
+ case evt_logmsg:
+ case evt_errmsg:
+ {
+ gw_1string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_size ( hdr, p_event . m_str1 . size () );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ }
+ break;
+ case evt_progmsg:
+ gw_status_evt_v1 hdr;
+ init ( hdr, p_event . m_id1 , evt_progmsg );
+ set_version ( hdr, p_event . m_uint32_2 );
+ set_timestamp ( hdr, p_event . m_uint32 );
+ set_pid ( hdr, p_event . m_id1 );
+ set_size ( hdr, p_event . m_str1 . size () );
+ set_percent ( hdr, p_event . m_uint32_3 );
+
+ Write ( &hdr . dad, sizeof hdr );
+ Write ( p_event . m_str1 . c_str (), p_event . m_str1 . size () );
+
+ break;
+
+ case evt_new_column :
+ {
+ gw_column_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_table_id ( hdr, p_event . m_id2 );
+ set_elem_bits ( hdr, p_event . m_uint32 );
+ set_name_size ( hdr, p_event . m_str1 . size () );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . c_str (), p_event . m_str1 . size () );
+ }
+ break;
+
+ case evt_add_mbr_db:
+ case evt_add_mbr_tbl:
+ {
+ gw_add_mbr_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+
+ set_db_id ( hdr, p_event . m_id2 );
+ set_size1 ( hdr, p_event . m_str1 . size() );
+ set_size2 ( hdr, p_event . m_str2 . size() );
+ set_create_mode ( hdr, p_event . m_uint8 );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . data (), p_event . m_str1 . size () );
+ Write ( p_event . m_str2 . data (), p_event . m_str2 . size () );
+
+ }
+ break;
+
+ case evt_open_stream:
+ case evt_end_stream:
+ {
+ gw_evt_hdr_v1 hdr;
+ init ( hdr, 0, p_event . m_event );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ case evt_cell_data :
+ case evt_cell_default :
+ {
+ gw_data_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_elem_count ( hdr, p_event . m_uint32 );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_val . data(), p_event . m_val . size() );
+ }
+ break;
+
+ case evt_next_row:
+ case evt_empty_default :
+ {
+ gw_evt_hdr_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ case evt_move_ahead:
+ {
+ gw_move_ahead_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_nrows ( hdr, p_event . m_uint64 );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ default:
+ throw logic_error ( "TestSource::Buffer::WriteUnpacked: event not implemented" );
+ }
+}
+
+void
+TestSource::Buffer::WritePacked ( const TestSource::Event& p_event )
+{
+ switch ( p_event . m_event )
+ {
+ case evt_use_schema:
+ case evt_software_name:
+ case evt_db_metadata_node:
+ case evt_tbl_metadata_node:
+ case evt_col_metadata_node:
+ if ( p_event . m_str1 . size () <= GeneralLoader :: MaxPackedString && p_event . m_str2 . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_2string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+
+ set_size1 ( hdr, p_event . m_str1 . size() );
+ set_size2 ( hdr, p_event . m_str2 . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_2string_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_use_schema2 );
+
+ set_size1 ( hdr, p_event . m_str1 . size() );
+ set_size2 ( hdr, p_event . m_str2 . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ Write ( p_event . m_str2 . c_str(), p_event . m_str2 . size() );
+ break;
+
+ //TODO: the following 3 cases are almost identical - refactor
+ case evt_remote_path:
+ if ( p_event . m_str1 . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_1string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_remote_path );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_1string_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_remote_path2 );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ break;
+ case evt_new_table:
+ if ( p_event . m_str1 . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_1string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_new_table );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_1string_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_new_table2 );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ break;
+ case evt_logmsg:
+ {
+ gwp_1string_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ break;
+ case evt_errmsg:
+ if ( p_event . m_str1 . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_1string_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_errmsg );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_1string_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_errmsg2 );
+ set_size ( hdr, p_event . m_str1 . size () );
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_str1 . c_str(), p_event . m_str1 . size() );
+ break;
+ case evt_progmsg:
+ gwp_status_evt_v1 hdr;
+ init ( hdr, p_event . m_id1 , evt_progmsg );
+ set_version ( hdr, p_event . m_uint32_2 );
+ set_timestamp ( hdr, p_event . m_uint32 );
+ set_pid ( hdr, ( uint16_t ) p_event . m_id1 );
+ set_size ( hdr, p_event . m_str1 . size () );
+ set_percent ( hdr, ( uint8_t ) p_event . m_uint32_3 );
+
+ Write ( &hdr . dad, sizeof hdr );
+ Write ( p_event . m_str1 . c_str (), p_event . m_str1 . size () );
+ break;
+ case evt_new_column :
+ {
+ gwp_column_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_table_id ( hdr, p_event . m_id2 );
+ set_elem_bits ( hdr, p_event . m_uint32 );
+ hdr . flag_bits = p_event . m_uint8;
+ set_name_size ( hdr, p_event . m_str1 . size () );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . c_str (), p_event . m_str1 . size () );
+ }
+ break;
+
+ case evt_add_mbr_db:
+ case evt_add_mbr_tbl:
+ {
+ gwp_add_mbr_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+
+ set_db_id ( hdr, p_event . m_id2 );
+ set_size1 ( hdr, p_event . m_str1 . size() );
+ set_size2 ( hdr, p_event . m_str2 . size() );
+ set_create_mode ( hdr, p_event . m_uint8 );
+
+ Write ( & hdr, sizeof hdr );
+ Write ( p_event . m_str1 . data (), p_event . m_str1 . size () );
+ Write ( p_event . m_str2 . data (), p_event . m_str2 . size () );
+
+ }
+ break;
+
+ case evt_open_stream:
+ case evt_end_stream:
+ {
+ gwp_evt_hdr_v1 hdr;
+ init ( hdr, 0, p_event . m_event );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ case evt_cell_data :
+ if ( p_event . m_val . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_data_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_cell_data );
+ // in the packed message, we specify the number of bytes in the cell
+ set_size ( hdr, p_event . m_val . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_data_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_cell_data2 );
+ // in the packed message, we specify the number of bytes in the cell
+ set_size ( hdr, p_event . m_val . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_val . data(), p_event . m_val . size() );
+ break;
+ case evt_cell_default :
+ if ( p_event . m_val . size () <= GeneralLoader :: MaxPackedString )
+ {
+ gwp_data_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_cell_default ); //TODO: this is the only difference from evt_cell_data - refactor
+ // in the packed message, we specify the number of bytes in the cell
+ set_size ( hdr, p_event . m_val . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ else
+ {
+ gwp_data_evt_U16_v1 hdr;
+ init ( hdr, p_event . m_id1, evt_cell_default2 ); //TODO: this is the only difference from evt_cell_data - refactor
+ // in the packed message, we specify the number of bytes in the cell
+ set_size ( hdr, p_event . m_val . size() );
+
+ Write ( & hdr, sizeof hdr );
+ }
+ Write ( p_event . m_val . data(), p_event . m_val . size() );
+ break;
+
+ case evt_next_row:
+ case evt_empty_default :
+ {
+ gwp_evt_hdr_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ case evt_move_ahead:
+ {
+ gwp_move_ahead_evt_v1 hdr;
+ init ( hdr, p_event . m_id1, p_event . m_event );
+ set_nrows ( hdr, p_event . m_uint64 );
+ Write ( & hdr, sizeof hdr );
+ }
+ break;
+
+ default:
+ throw logic_error ( "TestSource::Buffer::WritePacked: event not implemented" );
+ }
+}
+
+/////////////////////////////////////// TestSource
+
+bool TestSource::packed = false;
+
+TestSource::TestSource ( const string& p_signature, uint32_t p_endness, uint32_t p_version )
+: m_buffer ( new Buffer ( p_signature, p_endness, p_version, packed ) )
+{
+}
+
+TestSource::~TestSource()
+{
+ delete m_buffer;
+}
+
+const struct KFile *
+TestSource::MakeSource ()
+{
+ const struct KFile * ret;
+ if ( KRamFileMakeRead ( & ret,
+ const_cast < char* > ( m_buffer -> GetData() ),
+ m_buffer -> GetSize() ) != 0
+ || ret == 0 )
+ throw logic_error ( "TestSource::MakeSource KRamFileMakeRead failed" );
+
+ return ret;
+}
+
+void
+TestSource::SchemaEvent ( const std::string& p_schemaFile, const std::string& p_schemaName )
+{
+ m_buffer -> Write ( Event ( evt_use_schema, p_schemaFile, p_schemaName ) );
+}
+
+void
+TestSource::DatabaseEvent ( const std::string& p_databaseName )
+{
+ m_buffer -> Write ( Event ( evt_remote_path, p_databaseName ) );
+ m_database = p_databaseName;
+}
+
+void
+TestSource::SoftwareNameEvent ( const std::string& p_softwareName, const std::string& p_version )
+{
+ m_buffer -> Write ( Event ( evt_software_name, p_softwareName, p_version ) );
+}
+
+void
+TestSource::DBMetadataNodeEvent ( ObjectId p_id, const std::string& p_metadataNode, const std::string& p_value )
+{
+ m_buffer -> Write ( Event ( evt_db_metadata_node, p_id, p_metadataNode, p_value ) );
+}
+
+void
+TestSource::TblMetadataNodeEvent ( TableId p_id, const std::string& p_metadataNode, const std::string& p_value )
+{
+ m_buffer -> Write ( Event ( evt_tbl_metadata_node, p_id, p_metadataNode, p_value ) );
+}
+
+void
+TestSource::ColMetadataNodeEvent ( ColumnId p_id, const std::string& p_metadataNode, const std::string& p_value )
+{
+ m_buffer -> Write ( Event ( evt_col_metadata_node, p_id, p_metadataNode, p_value ) );
+}
+
+void
+TestSource::NewTableEvent ( TableId p_id, const std::string& p_table )
+{
+ m_buffer -> Write ( Event ( evt_new_table, p_id, p_table ) );
+}
+
+void
+TestSource::NewColumnEvent ( ColumnId p_columnId, TableId p_tableId, const std::string& p_column, uint32_t p_elemBits, bool p_compresssed )
+{
+ m_buffer -> Write ( Event ( evt_new_column, p_columnId, p_tableId, p_column, p_elemBits, p_compresssed ? 1 : 0 ) );
+}
+
+void
+TestSource::DBAddDatabaseEvent ( int p_db_id, int p_parent_id, const std :: string &p_mbr_name, const std :: string &p_db_name, uint8_t p_create_mode )
+{
+ m_buffer -> Write ( Event ( evt_add_mbr_db, p_db_id, p_parent_id, p_mbr_name, p_db_name, p_create_mode ) );
+}
+
+void
+TestSource::DBAddTableEvent ( int p_tbl_id, int p_db_id, const std :: string &p_mbr_name, const std :: string &p_table_name, uint8_t p_create_mode )
+{
+ m_buffer -> Write ( Event ( evt_add_mbr_tbl, p_tbl_id, p_db_id, p_mbr_name, p_table_name, p_create_mode ) );
+}
+
+void
+TestSource::OpenStreamEvent ()
+{
+ m_buffer -> Write ( Event ( evt_open_stream ) );
+}
+
+void
+TestSource::CloseStreamEvent ()
+{
+ m_buffer -> Write ( Event ( evt_end_stream ) );
+}
+
+void
+TestSource::NextRowEvent ( TableId p_id )
+{
+ m_buffer -> Write ( Event ( evt_next_row, p_id ) );
+}
+
+void
+TestSource::MoveAheadEvent ( TableId p_id, uint64_t p_count )
+{
+ m_buffer -> Write ( Event ( evt_move_ahead, p_id, p_count ) );
+}
+
+template<> void TestSource::CellDataEvent ( ColumnId p_columnId, string p_value )
+{
+ m_buffer -> Write ( Event ( evt_cell_data, p_columnId, ( uint32_t ) p_value . size(), ( uint32_t ) p_value . size(), p_value . c_str() ) );
+}
+
+void
+TestSource::CellDefaultEvent ( ColumnId p_columnId, const string& p_value )
+{
+ m_buffer -> Write ( Event ( p_value . size() == 0 ? evt_empty_default : evt_cell_default,
+ p_columnId,
+ ( uint32_t ) p_value . size(),
+ ( uint32_t ) p_value . size(),
+ p_value . c_str() ) );
+}
+
+void
+TestSource::CellEmptyDefaultEvent ( ColumnId p_columnId )
+{
+ m_buffer -> Write ( Event ( evt_empty_default, p_columnId, 0, 0, 0 ) );
+}
+
+void
+TestSource::CellDefaultEvent ( ColumnId p_columnId, uint32_t p_value )
+{
+ m_buffer -> Write ( Event ( evt_cell_default, p_columnId, 1, sizeof p_value, (const void*)&p_value ) );
+}
+void
+TestSource::CellDefaultEvent ( ColumnId p_columnId, bool p_value )
+{
+ m_buffer -> Write ( Event ( evt_cell_default, p_columnId, 1, sizeof p_value, (const void*)&p_value ) );
+}
+
+void
+TestSource::ErrorMessageEvent ( const string& p_msg )
+{
+ m_buffer -> Write ( Event ( evt_errmsg, p_msg ) );
+}
+
+void
+TestSource::LogMessageEvent ( const string& p_msg )
+{
+ m_buffer -> Write ( Event ( evt_logmsg, p_msg ) );
+}
+
+void
+TestSource::ProgMessageEvent ( ProcessId p_pid, const std :: string& p_name, uint32_t p_timestamp, uint32_t p_version, uint32_t p_percent )
+{
+ m_buffer -> Write ( Event ( evt_progmsg, p_pid, p_name, p_timestamp, p_version, p_percent ) );
+}
+
+
+void
+TestSource::SaveBuffer ( const char* p_filename ) const
+{
+ ofstream out ( p_filename );
+ m_buffer -> Save ( out );
+}
+
+TestSource::Event::Event ( gw_evt_id p_event )
+: m_event ( p_event ),
+ m_id1 ( 0 ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1 )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1, uint64_t p_uint64 )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( p_uint64 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_id2, const std::string& p_str, uint32_t p_uint32, uint8_t p_uint8 )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( p_id2 ),
+ m_uint8 ( p_uint8 ),
+ m_uint32 ( p_uint32 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id, const std::string& p_str1 )
+: m_event ( p_event ),
+ m_id1 ( p_id ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, const std::string& p_str1 )
+: m_event ( p_event ),
+ m_id1 ( 0 ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, const std::string& p_str1, const std::string& p_str2 )
+: m_event ( p_event ),
+ m_id1 ( 0 ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 ),
+ m_str2 ( p_str2 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id, const std::string& p_str1, const std::string& p_str2 )
+: m_event ( p_event ),
+ m_id1 ( p_id ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 ),
+ m_str2 ( p_str2 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_elem_count, uint32_t p_val_bytes, const void* p_val )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( 0 ),
+ m_uint32 ( p_elem_count ),
+ m_uint64 ( 0 )
+{
+ const char* v = ( const char* ) p_val;
+ for ( size_t i = 0; i != p_val_bytes; ++i )
+ {
+ m_val . push_back ( v [ i ] );
+ }
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1, const std::string& p_str1, const std::string& p_str2, uint8_t p_uint8 )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( 0 ),
+ m_uint8 ( p_uint8 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 ),
+ m_str2 ( p_str2 )
+{
+}
+
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_pid, const std :: string& p_name, uint32_t p_timestamp, uint32_t p_version, uint32_t p_percent )
+: m_event ( p_event ),
+ m_id1 ( p_pid ),
+ m_id2 ( 0 ),
+ m_uint8 ( 0 ),
+ m_uint32 ( p_timestamp ),
+ m_uint32_2 ( p_version ),
+ m_uint32_3 ( p_percent ),
+ m_str1 ( p_name )
+{
+}
+TestSource::Event::Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_id2, const std::string& p_str1, const std::string& p_str2, uint8_t p_uint8 )
+: m_event ( p_event ),
+ m_id1 ( p_id1 ),
+ m_id2 ( p_id2 ),
+ m_uint8 ( p_uint8 ),
+ m_uint32 ( 0 ),
+ m_uint64 ( 0 ),
+ m_str1 ( p_str1 ),
+ m_str2 ( p_str2 )
+{
+}
+
+
+TestSource::Event::~Event()
+{
+}
diff --git a/test/general-loader/testsource.hpp b/test/general-loader/testsource.hpp
new file mode 100644
index 0000000..b6c3694
--- /dev/null
+++ b/test/general-loader/testsource.hpp
@@ -0,0 +1,177 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _sra_tools_test_hpp_testsource
+#define _sra_tools_test_hpp_testsource
+
+/**
+* Test stream creation class for unit-testing General Loader
+*/
+
+#include <sysalloc.h>
+
+#include <kfc/defs.h>
+
+#include <kfs/file.h>
+
+#include "../../tools/general-loader/general-writer.h"
+
+#include <string>
+#include <vector>
+#include <fstream>
+
+class TestSource
+{
+public:
+ typedef uint32_t TableId;
+ typedef uint32_t ColumnId;
+ typedef uint32_t ObjectId;
+ typedef uint32_t ProcessId;
+
+public:
+ static bool packed;
+
+public:
+ TestSource( const std:: string& p_signature = GW_SIGNATURE,
+ uint32_t p_endness = GW_GOOD_ENDIAN,
+ uint32_t p_version = GW_CURRENT_VERSION );
+
+ ~TestSource();
+
+ const std::string & GetDatabaseName() { return m_database; }
+
+ const struct KFile * MakeSource ();
+
+ void SchemaEvent ( const std::string& p_schemaFile, const std::string& p_schemaName );
+ void DatabaseEvent ( const std::string& p_databaseName );
+ void SoftwareNameEvent ( const std::string& p_softwareName, const std::string& p_version );
+
+ void DBMetadataNodeEvent ( ObjectId p_id, const std::string& p_metadataNode, const std::string& p_value );
+ void TblMetadataNodeEvent ( TableId p_id, const std::string& p_metadataNode, const std::string& p_value );
+ void ColMetadataNodeEvent ( ColumnId p_id, const std::string& p_metadataNode, const std::string& p_value );
+
+ void NewTableEvent ( TableId p_id, const std::string& p_table );
+ void NewColumnEvent ( ColumnId p_columnId, TableId p_tableId,
+ const std::string& p_column, uint32_t p_elemBits, bool p_compresssed = false );
+
+ void DBAddDatabaseEvent ( int p_db_id, int p_parent_id, const std :: string &p_mbr_name,
+ const std :: string &p_db_name, uint8_t p_create_mode );
+ void DBAddTableEvent ( int ptbl_id, int p_db_id, const std :: string &p_mbr_name,
+ const std :: string &p_table_name, uint8_t p_create_mode );
+
+ void OpenStreamEvent ();
+ void CloseStreamEvent ();
+ void NextRowEvent ( TableId p_id );
+ void MoveAheadEvent ( TableId p_id, uint64_t p_count );
+ void CellDefaultEvent ( ColumnId p_columnId, const std :: string& p_value );
+ void CellDefaultEvent ( ColumnId p_columnId, uint32_t p_value );
+ void CellDefaultEvent ( ColumnId p_columnId, bool p_value );
+ void CellEmptyDefaultEvent ( ColumnId p_columnId );
+
+ void ErrorMessageEvent ( const std :: string& p_msg );
+ void LogMessageEvent ( const std :: string& p_msg );
+ void ProgMessageEvent ( ProcessId p_pid, const std :: string& p_name, uint32_t p_timestamp, uint32_t p_version, uint32_t p_percent );
+
+ template < typename T > void CellDataEvent ( ColumnId p_columnId, T p_value )
+ {
+ m_buffer -> Write ( Event ( evt_cell_data, p_columnId, 1, sizeof p_value, (const void*)&p_value ) );
+ } // see below for specialization for std::string (follows the class definition)
+
+ // use this to capture stream contents to be used in cmdline tests
+ void SaveBuffer ( const char* p_filename ) const;
+
+ void CellDataEventRaw ( ColumnId p_columnId, uint32_t p_elemCount, const void* p_value, uint32_t p_size )
+ {
+ m_buffer -> Write ( Event ( evt_cell_data, p_columnId, p_elemCount, p_size, p_value ) );
+ }
+
+private:
+ struct Event
+ {
+ Event ( gw_evt_id p_event );
+ Event ( gw_evt_id p_event, const std::string& p_str1 );
+ Event ( gw_evt_id p_event, const std::string& p_str1, const std::string& p_str2 );
+ Event ( gw_evt_id p_event, uint32_t p_id1 );
+ Event ( gw_evt_id p_event, uint32_t p_id1, uint64_t p_uint64 );
+ Event ( gw_evt_id p_event, uint32_t p_id1, const std::string& p_str1 );
+ Event ( gw_evt_id p_event, uint32_t p_id, const std::string& p_str1, const std::string& p_str2 );
+ Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_elem_count, uint32_t p_val_bytes, const void* p_val );
+ Event ( gw_evt_id p_event, uint32_t p_id1, const std::string& p_str1, const std::string& p_str2, uint8_t p_uint8 );
+ Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_id2, const std::string& p_str, uint32_t p_uint32, uint8_t p_uint8 );
+ Event ( gw_evt_id p_event, uint32_t p_pid, const std :: string& p_name, uint32_t p_timestamp, uint32_t p_version, uint32_t percent );
+ Event ( gw_evt_id p_event, uint32_t p_id1, uint32_t p_id2, const std::string& p_str1, const std::string& p_str2, uint8_t p_uint8 );
+
+ ~Event();
+
+ gw_evt_id m_event;
+ uint32_t m_id1;
+ uint32_t m_id2;
+
+ uint8_t m_uint8;
+ uint32_t m_uint32;
+ uint32_t m_uint32_2;
+ uint32_t m_uint32_3;
+ uint64_t m_uint64;
+
+ std :: string m_str1;
+ std :: string m_str2;
+ std :: vector < char > m_val;
+ };
+
+ class Buffer
+ {
+ public:
+ Buffer(const std :: string& p_signature, uint32_t p_endness, uint32_t p_version, bool p_packing);
+ ~Buffer();
+
+ void Write ( const Event& );
+
+ void Save ( std::ostream& p_out ) const;
+
+ const char* GetData() { return m_buffer; }
+ size_t GetSize() const { return m_bufSize; }
+
+ private:
+ void WritePacked ( const Event& );
+ void WriteUnpacked ( const Event& );
+
+ void Write( const void * p_data, size_t p_size );
+ void Pad ( size_t p_alignment = 4 );
+
+ char* m_buffer;
+ size_t m_bufSize;
+
+ gw_header_v1 m_header;
+ };
+
+ std :: string m_database;
+
+ Buffer* m_buffer;
+};
+
+template<> void TestSource::CellDataEvent ( ColumnId p_columnId, std :: string p_value );
+
+#endif
diff --git a/test/kar/Makefile b/test/kar/Makefile
new file mode 100644
index 0000000..1745dfc
--- /dev/null
+++ b/test/kar/Makefile
@@ -0,0 +1,56 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/kar
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: kar_test
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+kar_test: kar-test.sh
+ @ echo "Starting kar tests..."
+ @ bash kar-test.sh $(BINDIR)/kar
+
+kar:
+ rm -rf actual
+ mkdir -p actual
+ $(BINDIR)/kar -c actual/1.0.kar -d input/1.0; $(BINDIR)/kar -t actual/1.0.kar >actual/1.0.stdout; diff expected/1.0.stdout actual/1.0.stdout
+ rm -rf actual
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/kar
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
diff --git a/test/kar/acc.txt b/test/kar/acc.txt
new file mode 100644
index 0000000..5c539f2
--- /dev/null
+++ b/test/kar/acc.txt
@@ -0,0 +1,756 @@
+-454-sff-load(0.0.0)-T,SRR170845,T,454
+-454-sff-load(1.2.0)-T,ERR023140,T,454
+-454-sff-load(1.2.1)-T,SRR059129,T,454
+-454-sff-loader2(1.0.0)-T,SRR054445,T,454
+-ABSOLID-abi-load(1.0.0)-T,ERR023201,T,ABSOLID
+-ABSOLID-srf-load(1.0.20)-T,SRR064942,T,ABSOLID
+-ABSOLID-srf-load.1.2.7(1.2.7)-T,SRR064943,T,ABSOLID
+#all runs of this type are private: -ABSOLID-srf-loader(1.0.0)-T,ERR001624,T,ABSOLID
+-ABSOLID-srf-loader(1.0.16)-T,SRR022546,T,ABSOLID
+-ABSOLID-srf-loader(1.0.17)-T,SRR035261,T,ABSOLID
+-ABSOLID-srf-loader(1.0.18)-T,SRR037487,T,ABSOLID
+-ABSOLID-srf-loader(1.0.19)-T,SRR042790,T,ABSOLID
+-ILLUMINA-fastq-load(1.0.20)-T,DRR000720,T,ILLUMINA
+-ILLUMINA-fastq-load(1.2.12)-T,SRR116859,T,ILLUMINA
+-ILLUMINA-fastq-load(1.2.5)-T,SRR061422,T,ILLUMINA
+-ILLUMINA-fastq-load(1.2.6)-T,SRR070223,T,ILLUMINA
+-ILLUMINA-fastq-load(1.2.9)-T,SRR097428,T,ILLUMINA
+-ILLUMINA-fastq-load.1.2.5(0.0.0)-T,SRR060117,T,ILLUMINA
+#all runs of this type are private: -ILLUMINA-fastq-loader(1.0.18)-T,SRR035374,T,ILLUMINA
+-ILLUMINA-fastq-loader(1.0.19)-T,SRR042491,T,ILLUMINA
+-ILLUMINA-srf-load(1.0.0)-T,ERR029415,T,ILLUMINA
+-ILLUMINA-srf-load(1.2.12)-T,SRR111945,T,ILLUMINA
+-ILLUMINA-srf-load(1.2.8)-T,SRR074886,T,ILLUMINA
+-ILLUMINA-srf-load(1.2.9)-T,SRR139156,T,ILLUMINA
+-ILLUMINA-srf-loader(1.0.0)-T,ERR006438,T,ILLUMINA
+NCBI:SRA:ABI:tbl:v2#1-ABSOLID-abi-load(2.0.10)-T,SRR111922,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1-ABSOLID-abi-load(2.0.4)-T,ERR030907,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.3-ABSOLID-abi-load(2.1.6)-T,ERR057556,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.3-ABSOLID-srf-load(2.1.6)-T,SRR350985,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-(0.0.0)-T,SRR217435,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(1.0.0)-T,ERR029930,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(1.0.20)-T,SRR089693,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.10)-T,SRR192558,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.12)-T,ERR042390,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.13)-T,SRR204407,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.14)-T,SRR316179,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.4)-T,ERR034127,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.7)-T,SRR171266,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.0.8)-T,SRR122308,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.10)-T,SRR445714,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.11)-T,SRR449301,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.12)-T,SRR492068,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.13)-T,SRR500516,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.14)-T,SRR525280,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.16)-T,SRR527583,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.17)-T,ERR182858,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.18)-T,ERR015491,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.2)-T,DRR001233,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.7)-T,DRR001804,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.8)-T,ERR071081,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.1.9)-T,ERR147439,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.2.0)-T,ERR202403,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.2.2)-T,ERR426402,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.2.3)-T,SRR806209,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.3.1)-T,DRR017925,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.3.2)-T,ERR329996,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.3.3)-T,ERR321058,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.3.4)-T,ERR660625,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.3.5)-T,DRR031434,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load(2.4.2)-T,ERR964674,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.3.5(2.3.5)-T,SRR1574808,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.0(2.4.0)-T,SRR1584376,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.1(2.4.1)-T,SRR1611170,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.2(2.4.2)-T,SRR1752098,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.3(2.4.3)-T,SRR1792532,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.4(2.4.4)-T,SRR1826150,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.4.5(2.4.5)-T,SRR2009387,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.5.0(2.5.0)-T,SRR2032161,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.5.1(2.5.1)-T,SRR2009469,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-load.2.5.2(2.5.2)-T,SRR2604583,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.11)-T,SRR017232,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.12)-T,SRR017902,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.14)-T,SRR019624,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.16)-T,SRR029494,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.17)-T,SRR033650,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-abi-loader(1.0.19)-T,DRR000425,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(1.0.0)-T,ERR022067,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(1.0.20)-T,SRR066817,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(1.2.12)-T,SRR111917,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(1.2.8)-T,SRR072241,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(1.2.9)-T,SRR172826,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.10)-T,SRR190574,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.14)-T,SRR308194,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.2)-T,SRR057562,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.5)-T,SRR057563,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.8)-T,SRR171679,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.0.9)-T,SRR173012,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.10)-T,SRR444082,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.12)-T,SRR452972,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.14)-T,SRR515191,T,ABSOLID
+#all runs of this type are private: NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.16)-T,ERR031050,T,ABSOLID
+#all runs of this type are private: NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.17)-T,ERR031052,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.18)-T,SRR578343,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.7)-T,SRR360387,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.8)-T,SRR389180,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.1.9)-T,ERR136940,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.2.2)-T,ERR271693,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.2.3)-T,SRR797892,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.3.2)-T,ERR107277,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load(2.3.3)-T,ERR032981,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load.1.2.7(1.2.7)-T,SRR064941,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-load.2.3.5(2.3.5)-T,ERR034813,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.0)-T,ERR002797,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.12)-T,SRR017528,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.14)-T,SRR016407,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.15)-T,SRR023628,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.16)-T,SRR027914,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.17)-T,SRR036757,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.18)-T,SRR037163,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.19)-T,SRR049684,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.5)-T,SRR013122,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.7)-T,SRR014962,T,ABSOLID
+NCBI:SRA:ABI:tbl:v2#1.0.4-ABSOLID-srf-loader(1.0.9)-T,SRR011686,T,ABSOLID
+NCBI:SRA:CG:tbl:fastq#1-COMPLETE_GENOMICS-(0.0.0)-T,SRR072706,T,COMPLETE_GENOMICS
+NCBI:SRA:Helicos:tbl:v2#1-HELICOS-helicos-load(2.0.2)-T,SRR020175,T,HELICOS
+#all runs of this type are private: NCBI:SRA:Helicos:tbl:v2#1-HELICOS-helicos-load(2.0.4)-T,DRR000947,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.3-HELICOS-helicos-load(2.1.6)-T,SRR346126,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.10)-T,SRR182422,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.13)-T,SRR203495,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.14)-T,SRR316183,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.2)-T,SRR051918,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.4)-T,DRR000965,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.6)-T,SRR099372,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.0.7)-T,SRR133639,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.10)-T,SRR442058,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.12)-T,SRR452966,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.14)-T,SRR514051,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.17)-T,SRR543533,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.18)-T,SRR621477,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.7)-T,DRR002075,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.1.8)-T,SRR389805,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.2.3)-T,SRR643530,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.3.1)-T,DRR013752,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.3.2)-T,SRR1002954,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.3.3)-T,SRR1041831,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.3.4)-T,SRR1143403,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load(2.3.5)-T,DRR018325,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load.2.3.5(2.3.5)-T,SRR1557952,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load.2.4.2(2.4.2)-T,SRR1732726,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load.2.4.3(2.4.3)-T,SRR1776516,T,HELICOS
+NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load.2.4.4(2.4.4)-T,SRR1810117,T,HELICOS
+#all runs of this type are private: NCBI:SRA:Helicos:tbl:v2#1.0.4-HELICOS-helicos-load.2.5.2(2.5.2)-T,SRR2123712,T,HELICOS
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-(0.0.0)-T,ERR037327,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.10)-T,SRR061126,T,ILLUMINA
+#all runs of this type are private:NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.13)-T,SRR207070,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.14)-T,SRR222486,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.15)-T,SRR222563,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.16)-T,SRR222544,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.7)-T,SRR166829,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-fastq-load(2.0.9)-T,SRR112725,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-illumina-load(2.0.10)-T,SRR112722,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-illumina-load(2.0.13)-T,SRR074174,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-illumina-load(2.0.15)-T,SRR074176,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-illumina-load(2.0.8)-T,SRR074172,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-srf-load(2.0.10)-T,SRR189815,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-srf-load(2.0.14)-T,SRR315558,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-srf-load(2.0.2)-T,SRR090423,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1-ILLUMINA-srf-load(2.0.7)-T,SRR112721,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1-UNDEFINED-(0.0.0)-T,ERR005089,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.2-ILLUMINA-fastq-load(2.1.0)-T,SRR341919,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1.0.2-ILLUMINA-srf-load(2.1.2)-T,SRR329669,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.3-ILLUMINA-fastq-load(2.1.3)-T,ERR022479,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.3-ILLUMINA-fastq-load(2.1.6)-T,ERR056367,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.3-ILLUMINA-illumina-load(2.1.6)-T,SRR353581,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.3-ILLUMINA-srf-load(2.1.6)-T,ERR055396,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.3-UNDEFINED-(0.0.0)-T,ERR056977,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-(0.0.0)-T,ERR039506,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.0.0)-T,ERR022980,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.0.20)-T,DRR000719,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.2.12)-T,SRR122250,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.2.5)-T,DRR000599,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.2.6)-T,DRR000600,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(1.2.9)-T,DRR000183,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.10)-T,SRR203064,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.12)-T,ERR016388,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.13)-T,SRR210917,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.14)-T,SRR223486,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.15)-T,SRR222572,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.16)-T,SRR316687,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.2)-T,SRR100283,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.5)-T,SRR149193,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.7)-T,SRR171281,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.8)-T,SRR172867,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.0.9)-T,SRR173087,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.0)-T,SRR342601,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.10)-T,SRR413527,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.11)-T,DRR000184,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.12)-T,SRR449307,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.13)-T,DRR002381,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.14)-T,SRR500734,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.15)-T,SRR524806,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.17)-T,DRR002425,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.18)-T,ERR197925,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.19)-T,SRR636603,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.2)-T,SRR329488,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.6)-T,SRR352029,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.7)-T,DRR002161,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.8)-T,ERR069563,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.1.9)-T,ERR161565,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.2.0)-T,ERR209685,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.2.1)-T,SRR642751,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.2.2)-T,ERR431471,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.2.3)-T,ERR062333,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.3.1)-T,DRR016800,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.3.2)-T,ERR234231,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.3.3)-T,ERR348421,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.3.4)-T,ERR665060,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.3.5)-T,DRR046906,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load(2.4.2)-T,ERR995409,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.2.3(2.2.3)-T,SRR2054695,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.3.4(2.3.4)-T,SRR976375,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.3.5(2.3.5)-T,SRR1576091,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.0(2.4.0)-T,SRR1593278,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.1(2.4.1)-T,SRR1612549,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.2(2.4.2)-T,SRR1633898,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.2-2(2.4.2)-T,SRR1757773,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.3(2.4.3)-T,SRR1796487,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.4(2.4.4)-T,SRR1873559,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.4.5(2.4.5)-T,SRR2015829,T,ILLUMINA
+#all runs of this type are private (12551 runs!) : NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.5.0(2.5.0)-T,ERR668737,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.5.1(2.5.1)-T,ERR943220,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-load.2.5.2(2.5.2)-T,ERR966616,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.0)-T,ERR012002,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.10)-T,SRR016855,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.14)-T,DRR000030,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.15)-T,DRR000092,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.16)-T,DRR000116,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.17)-T,DRR000149,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.18)-T,DRR000348,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.19)-T,DRR000431,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.6)-T,SRR016113,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.7)-T,SRR016404,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.8)-T,SRR016673,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-fastq-loader(1.0.9)-T,SRR016689,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(1.0.20)-T,SRR059729,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.10)-T,SRR196233,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.12)-T,DRR001166,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.13)-T,SRR210843,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.15)-T,SRR315151,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.5)-T,SRR068545,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.0.7)-T,SRR094665,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.10)-T,SRR446875,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.12)-T,SRR490661,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.13)-T,SRR500487,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.14)-T,SRR521268,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.16)-T,SRR526944,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.17)-T,SRR546125,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.18)-T,ERR011433,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.2)-T,SRR343009,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.7)-T,SRR364792,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.8)-T,SRR400034,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.1.9)-T,SRR402371,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.2.3)-T,SRR807436,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.3.2)-T,ERR029142,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.3.3)-T,SRR1043688,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.3.4)-T,SRR1168348,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load(2.3.5)-T,SRR1200459,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.3.5(2.3.5)-T,SRR1573735,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.0(2.4.0)-T,SRR1585483,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.1(2.4.1)-T,SRR1610241,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.2(2.4.2)-T,SRR1743391,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.3(2.4.3)-T,SRR1793912,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.4(2.4.4)-T,SRR1848960,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.4.5(2.4.5)-T,SRR1999299,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.5.0(2.5.0)-T,SRR2002782,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.5.1(2.5.1)-T,SRR2080517,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-load.2.5.2(2.5.2)-T,SRR2571529,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-loader(1.0.16)-T,DRR000086,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-loader(1.0.17)-T,SRR036730,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-loader(1.0.18)-T,DRR000357,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-illumina-loader(1.0.19)-T,DRR000385,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(1.0.0)-T,ERR029908,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(1.0.20)-T,DRR000852,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(1.2.12)-T,SRR122317,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(1.2.8)-T,SRR074903,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(1.2.9)-T,SRR172842,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.10)-T,SRR201982,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.12)-T,ERR043309,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.13)-T,SRR210866,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.14)-T,SRR316174,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.2)-T,SRR097423,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.4)-T,ERR034168,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.5)-T,SRR097541,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.7)-T,SRR103712,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.8)-T,SRR172843,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.0.9)-T,SRR125283,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.10)-T,SRR447701,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.11)-T,SRR449319,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.12)-T,SRR492480,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.13)-T,SRR499899,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.14)-T,ERR027766,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.16)-T,ERR030402,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.17)-T,SRR539338,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.18)-T,ERR039256,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.2)-T,SRR342314,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.7)-T,DRR002371,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.8)-T,SRR400432,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.1.9)-T,ERR159680,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.2.2)-T,ERR091574,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.2.3)-T,ERR174377,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.3.1)-T,DRR016723,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.3.2)-T,ERR009051,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.3.3)-T,ERR032238,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.3.4)-T,ERR034047,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load(2.3.5)-T,DRR034607,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load.2.3.5(2.3.5)-T,SRR1572157,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load.2.4.2(2.4.2)-T,SRR1618793,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-load.2.4.5(2.4.5)-T,SRR1916926,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.0)-T,ERR012497,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.10)-T,SRR017210,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.11)-T,SRR017391,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.12)-T,SRR018036,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.14)-T,SRR019655,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.15)-T,SRR026434,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.16)-T,SRR029673,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.17)-T,SRR035652,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.18)-T,SRR037496,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.19)-T,DRR000437,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.8)-T,SRR016773,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-ILLUMINA-srf-loader(1.0.9)-T,SRR016774,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-UNDEFINED-(0.0.0)-T,ERR558193,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:phred:v2#1.0.4-UNDEFINED--(0.0.0)-T,ERR997444,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-(0.0.0)-T,ERR029914,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.10)-T,SRR197986,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.12)-T,DRR001464,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.13)-T,SRR211280,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.14)-T,SRR218100,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.16)-T,SRR316299,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.2)-T,SRR122262,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.5)-T,SRR124179,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.7)-T,SRR171600,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.8)-T,SRR171660,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-ILLUMINA-fastq-load(2.0.9)-T,SRR133640,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1-UNDEFINED-(0.0.0)-T,ERR005103,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.1-ILLUMINA-(0.0.0)-T,SRR189060,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.2-ILLUMINA-fastq-load(2.0.16)-T,SRR316298,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.2-ILLUMINA-fastq-load(2.1.0)-T,SRR342244,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.2-ILLUMINA-fastq-load(2.1.2)-T,SRR328463,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.3-ILLUMINA-fastq-load(2.1.6)-T,ERR035782,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.3-UNDEFINED-(0.0.0)-T,ERR054653,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-(0.0.0)-T,SRR333073,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.0.10)-T,SRR188204,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.0.16)-T,SRR290598,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.0.8)-T,SRR124187,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.10)-T,SRR408990,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.11)-T,SRR447749,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.12)-T,SRR449290,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.13)-T,SRR458497,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.14)-T,SRR499708,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.15)-T,SRR520470,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.18)-T,DRR003752,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.19)-T,SRR628281,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.6)-T,SRR346717,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.7)-T,SRR364492,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.8)-T,SRR400044,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.1.9)-T,SRR403299,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.2.1)-T,SRR642643,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.2.2)-T,ERR364417,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.2.3)-T,SRR770352,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.3.2)-T,SRR943042,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.3.3)-T,SRR1028161,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.3.4)-T,ERR455050,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load(2.3.5)-T,SRR1168260,T,ILLUMINA
+#all runs of this type are private: NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-ILLUMINA-fastq-load.2.3.5(2.3.5)-T,SRR1564142,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.0.4-UNDEFINED-(0.0.0)-T,ERR246328,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:q1:v2#1.1-ILLUMINA-fastq-load.2.5.2(2.5.2)-T,SRR2351394,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q1:v2#1.1-UNDEFINED--(0.0.0)-T,ERR932647,T,UNDEFINED
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-illumina-load(2.0.10)-T,SRR191722,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-illumina-load(2.0.12)-T,SRR203399,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-illumina-load(2.0.13)-T,SRR203398,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.10)-T,SRR191899,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.12)-T,ERR029934,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.13)-T,SRR210919,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.14)-T,SRR314702,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.2)-T,SRR088665,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1-ILLUMINA-srf-load(2.0.8)-T,SRR030701,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.2-ILLUMINA-srf-load(2.1.2)-T,SRR340085,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.3-ILLUMINA-illumina-load(2.1.6)-T,SRR349671,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.3-ILLUMINA-srf-load(2.1.6)-T,SRR352226,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.10)-T,SRR448116,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.12)-T,SRR488773,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.13)-T,SRR493780,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.17)-T,SRR535749,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.7)-T,SRR358621,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.1.9)-T,SRR398608,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.3.2)-T,SRR922614,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.3.3)-T,SRR954969,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load(2.3.4)-T,SRR1146683,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-illumina-load.2.3.5(2.3.5)-T,SRR1407910,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.10)-T,SRR413422,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.12)-T,SRR452497,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.14)-T,SRR515921,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.17)-T,SRR546566,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.18)-T,ERR009041,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.7)-T,DRR001883,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.8)-T,SRR398639,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.1.9)-T,SRR402916,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.2.3)-T,SRR770571,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.3.2)-T,ERR009036,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load(2.3.4)-T,ERR008638,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.0.4-ILLUMINA-srf-load.2.3.5(2.3.5)-T,SRR029224,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.1-ILLUMINA-illumina-load.2.5.2(2.5.2)-T,SRR2162766,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:q4:v2#1.1-ILLUMINA-srf-load.2.5.0(2.5.0)-T,SRR1920251,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:v2#1.0.4-ILLUMINA-(0.0.0)-T,SRR000842,T,ILLUMINA
+NCBI:SRA:Illumina:tbl:v2#1.0.4-ILLUMINA-srf-loader(1.0.0)-T,ERR008867,T,ILLUMINA
+NCBI:SRA:IonTorrent:tbl:v2#1.0.2-ION_TORRENT-sff-load(2.1.0)-T,SRR329501,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.1.13)-T,SRR490154,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.1.15)-T,SRR518512,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.1.17)-T,SRR522850,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.1.18)-T,DRR003960,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.1.19)-T,SRR630872,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.2.3)-T,SRR802359,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.3.1)-T,DRR017979,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.3.2)-T,SRR988538,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.3.3)-T,SRR1043572,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.3.4)-T,SRR1171639,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.3.5)-T,DRR034561,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load(2.4.2)-T,ERR979094,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.3.5(2.3.5)-T,SRR1569014,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.4.0(2.4.0)-T,SRR1586608,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.4.1(2.4.1)-T,SRR1609129,T,ION_TORRENT
+#all runs of this type are private: NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.4.2-2(2.4.2)-T,SRR1737219,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.4.4(2.4.4)-T,SRR1836013,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.4.5(2.4.5)-T,SRR1954993,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-fastq-load.2.5.2(2.5.2)-T,SRR2218460,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.10)-T,SRR446826,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.12)-T,SRR488826,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.13)-T,SRR495202,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.17)-T,DRR003303,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.18)-T,ERR161543,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.7)-T,SRR329497,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.8)-T,SRR389194,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.1.9)-T,SRR402854,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.2.2)-T,ERR319091,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.2.3)-T,SRR788730,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.3.1)-T,DRR017924,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.3.2)-T,SRR1002633,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.3.3)-T,SRR1043577,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.3.4)-T,ERR574422,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.3.5)-T,DRR044367,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load(2.4.2)-T,ERR866477,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.3.5(2.3.5)-T,SRR1575317,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.4.2(2.4.2)-T,SRR1748018,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.4.3(2.4.3)-T,SRR1796210,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.4.4(2.4.4)-T,SRR1818320,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.4.5(2.4.5)-T,SRR2014557,T,ION_TORRENT
+NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.5.1(2.5.1)-T,SRR2069650,T,ION_TORRENT
+#all runs of this type are private: NCBI:SRA:IonTorrent:tbl:v2#1.0.3-ION_TORRENT-sff-load.2.5.2(2.5.2)-T,SRR2529521,T,ION_TORRENT
+NCBI:SRA:Nanopore:db#1-OXFORD_NANOPORE-general-loader(2.5.4)-D,ERR968961,D,OXFORD_NANOPORE
+NCBI:SRA:PacBio:smrt:db#1-PACBIO_SMRT-(0.0.0)-D,SRR353493,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1-PACBIO_SMRT-pacbio-load(2.1.8)-D,SRR387217,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.10)-D,SRR448138,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.12)-D,SRR458511,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.13)-D,SRR500650,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.14)-D,SRR517973,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.17)-D,SRR534091,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.18)-D,ERR160066,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.8)-D,SRR389290,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.1.9)-D,SRR387289,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.2.3)-D,SRR811963,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.3.2)-D,SRR1003009,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.3.3)-D,SRR1003644,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load(2.3.5)-D,DRR034928,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.3.5(2.3.5)-D,SRR1514774,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.4.1(2.4.1)-D,SRR1754811,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.4.3(2.4.3)-D,ERR599182,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.4.4(2.4.4)-D,ERR772474,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.4.5(2.4.5)-D,ERR871715,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.5.0(2.5.0)-D,ERR904395,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.5.1(2.5.1)-D,ERR956962,D,PACBIO_SMRT
+NCBI:SRA:PacBio:smrt:db#1.0.1-PACBIO_SMRT-pacbio-load.2.5.2(2.5.2)-D,ERR976792,D,PACBIO_SMRT
+NCBI:SRA:_454_:tbl:v2#1-454-sff-load(2.0.10)-T,SRR201949,T,454
+NCBI:SRA:_454_:tbl:v2#1-454-sff-load(2.0.13)-T,SRR210878,T,454
+NCBI:SRA:_454_:tbl:v2#1-454-sff-load(2.0.14)-T,SRR292210,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.5-454-sff-load(2.1.2)-T,SRR333138,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.6-454-fastq-load(2.1.6)-T,ERR039829,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.6-454-sff-load(2.1.0)-T,SRR353543,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.6-454-sff-load(2.1.6)-T,DRR001607,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-(0.0.0)-T,DRR000345,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.10)-T,SRR189081,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.13)-T,SRR208304,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.16)-T,SRR307780,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.2)-T,SRR124144,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.5)-T,SRR099221,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.7)-T,SRR134394,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.8)-T,SRR171665,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.0.9)-T,SRR176508,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.10)-T,SRR408050,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.11)-T,SRR446299,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.13)-T,SRR491408,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.14)-T,SRR498453,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.15)-T,SRR520997,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.17)-T,SRR527811,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.18)-T,ERR171548,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.19)-T,SRR633538,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.2)-T,SRR326939,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.7)-T,SRR385745,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.8)-T,SRR397936,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.1.9)-T,SRR403902,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.2.0)-T,ERR204765,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.2.2)-T,ERR327894,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.2.3)-T,SRR822313,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.3.1)-T,DRR016801,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.3.2)-T,SRR1002600,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.3.3)-T,SRR1043059,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.3.4)-T,SRR1171851,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.3.5)-T,DRR046617,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load(2.4.2)-T,ERR978987,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.3.5(2.3.5)-T,SRR1574968,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.0(2.4.0)-T,SRR1592904,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.1(2.4.1)-T,SRR1612401,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.2(2.4.2)-T,SRR1619688,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.2-2(2.4.2)-T,SRR1752133,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.3(2.4.3)-T,SRR1752124,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.4(2.4.4)-T,SRR1806724,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.4.5(2.4.5)-T,SRR2009611,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.5.0(2.5.0)-T,SRR2048979,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.5.1(2.5.1)-T,SRR2057819,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-fastq-load.2.5.2(2.5.2)-T,SRR2581216,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(0.0.0)-T,DRR000586,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(1.2.0)-T,ERR015938,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(1.2.1)-T,SRR059268,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.10)-T,SRR202954,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.12)-T,DRR001557,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.13)-T,SRR212417,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.14)-T,SRR316686,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.3)-T,SRR149178,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.4)-T,SRR142729,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.5)-T,SRR156345,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.7)-T,SRR167727,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.8)-T,SRR171298,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.0.9)-T,SRR174891,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.0)-T,DRR002366,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.10)-T,SRR448936,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.11)-T,SRR449080,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.12)-T,SRR492852,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.13)-T,SRR500658,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.14)-T,SRR525235,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.16)-T,DRR002386,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.17)-T,ERR198676,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.18)-T,SRR636596,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.2)-T,DRR001368,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.6)-T,SRR350327,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.7)-T,DRR001728,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.8)-T,SRR400435,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.1.9)-T,SRR404102,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.2.0)-T,ERR209054,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.2.2)-T,ERR430966,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.2.3)-T,ERR023134,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.3.1)-T,DRR016802,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.3.2)-T,ERR344830,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.3.3)-T,ERR139684,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.3.4)-T,ERR664799,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.3.5)-T,DRR046428,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load(2.4.2)-T,ERR995354,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.3.5(2.3.5)-T,SRR1575394,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.0(2.4.0)-T,SRR1592716,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.1(2.4.1)-T,SRR1611914,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.2(2.4.2)-T,SRR1752597,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.3(2.4.3)-T,SRR1793659,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.4(2.4.4)-T,SRR1839343,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.4.5(2.4.5)-T,ERR768594,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.5.0(2.5.0)-T,ERR768593,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.5.1(2.5.1)-T,SRR2097334,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-load.2.5.2(2.5.2)-T,ERR768591,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-loader(1.0.18)-T,SRR031989,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-loader2(1.0.0)-T,DRR000421,T,454
+NCBI:SRA:_454_:tbl:v2#1.0.7-454-sff-loader2(1.2.1)-T,SRR053769,T,454
+NCBI:align:db:alignment_evidence_sorted#1-orm-cg-load(2.2.0)-D,SRR576646,D,orm,NC_000002.11:20001-20011
+#all runs of this type are private: NCBI:align:db:alignment_evidence_sorted#1-orm-cg-load(2.2.1)-D,SRR576697,D,orm,NC_000001.10:15001-15011
+NCBI:align:db:alignment_evidence_sorted#1-orm-cg-load(2.3.1)-D,SRR834935,D,orm,NC_000001.10:15001-15011
+NCBI:align:db:alignment_evidence_sorted#1-orm-cg-load(2.3.2)-D,SRR849254,D,orm,NC_000004.11:20001-20011
+NCBI:align:db:alignment_evidence_sorted#1.0.1-orm-cg-load(2.3.1)-D,SRR800317,D,orm,NC_000005.9:20001-20011
+NCBI:align:db:alignment_evidence_sorted#1.0.1-orm-cg-load.2.3.5(2.3.5)-D,SRR1186270,D,orm,NC_000001.10:15001-15011
+#all runs of this type are private: NCBI:align:db:alignment_evidence_sorted#1.2-COMPLETE_GENOMICS-cg-load.2.4.5-5(2.4.5)-D,SRR1745774,D,COMPLETE_GENOMICS,NC_000006.11:150001-150011
+#all runs of this type are private: NCBI:align:db:alignment_evidence_sorted#1.2-COMPLETE_GENOMICS-cg-load.2.5.0(2.5.0)-D,SRR2048475,D,COMPLETE_GENOMICS,chr19:60062-60099
+#all runs of this type are private: NCBI:align:db:alignment_evidence_sorted#1.2-COMPLETE_GENOMICS-cg-load.2.5.1(2.5.1)-D,SRR2070515,D,COMPLETE_GENOMICS,NC_000001.10:25001-25011
+NCBI:align:db:alignment_sorted#1.1-ILLUMINA-bam-load(2.1.13)-D,SRR403996,D,ILLUMINA,supercontig_1.1:1-5000
+NCBI:align:db:alignment_sorted#1.1-ILLUMINA-bam-load(2.1.14)-D,SRR497603,D,ILLUMINA,gi|51973633|gb|CP000001.1|:250001-250010
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.10)-D,SRR403878,D,UNDEFINED,AE003852.1:2454-2463
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.11)-D,SRR448741,D,UNDEFINED,1:121485001-121485010
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.13)-D,SRR489721,D,UNDEFINED,chr1:3516602-3525782
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.14)-D,SRR413284,D,UNDEFINED,FLT3_NM_004119.2:2366-2433
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.8)-D,SRR389317,D,UNDEFINED,NC_000001.10:30001-35000
+NCBI:align:db:alignment_sorted#1.1-UNDEFINED-bam-load(2.1.9)-D,SRR399287,D,UNDEFINED,1:152185501-152185510
+NCBI:align:db:alignment_sorted#1.2-ABSOLID-bam-load(2.1.22)-D,SRR620424,D,ABSOLID,chr5:23562556-23562566
+NCBI:align:db:alignment_sorted#1.2-ABSOLID-bam-load(2.2.3)-D,ERR069107,D,ABSOLID,chr1:121185001-121185010
+NCBI:align:db:alignment_sorted#1.2-COMPLETE_GENOMICS-bam-load(2.1.22)-D,SRR556761,D,COMPLETE_GENOMICS,CM000663.1:15001-15011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.16)-D,SRR501069,D,ILLUMINA,gi|169794206|ref|NC_010410.1|:15001-20000
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.17)-D,SRR522246,D,ILLUMINA,0:5001-5011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.18)-D,SRR515196,D,ILLUMINA,MITO:1-5000
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.19)-D,SRR514629,D,ILLUMINA,scaffold00001:15001-20000
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.20)-D,SRR536876,D,ILLUMINA,NC_000001.10:152280001-152280011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.21)-D,SRR514297,D,ILLUMINA,AE014134.5:5001-5011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.1.22)-D,ERR208922,D,ILLUMINA,NC_000001.10:565001-570000
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.2.1)-D,SRR643441,D,ILLUMINA,ecoli_K12_MG12655:10001-10011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-bam-load(2.2.3)-D,SRR515556,D,ILLUMINA,Contig7124:10001-10011
+NCBI:align:db:alignment_sorted#1.2-ILLUMINA-latf-load(2.3.1)-D,SRR749062,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2-ION_TORRENT-bam-load(2.1.17)-D,SRR515965,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.2-ION_TORRENT-bam-load(2.1.22)-D,SRR620446,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.16)-D,SRR408241,D,UNDEFINED,P_bra_lrc182:5001-5011
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.17)-D,SRR521953,D,UNDEFINED,NC_000001.9:1560001-1565000
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.18)-D,SRR497623,D,UNDEFINED,AL111168.1:220001-225000
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.19)-D,SRR543323,D,UNDEFINED,NC_000067.5:103410001-103415000
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.20)-D,SRR527121,D,UNDEFINED,NC_000067.5:3190001-3190011
+#all runs in this class produce a core-dump: NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.21)-D,SRR547593,D,UNDEFINED
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.1.22)-D,ERR194152,D,UNDEFINED,NC_001807.4:1-11
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.2.1)-D,SRR643698,D,UNDEFINED,supercontig_1.1:5001-5011
+NCBI:align:db:alignment_sorted#1.2-UNDEFINED-bam-load(2.2.3)-D,ERR194157,D,UNDEFINED,J01415.2:1-11
+NCBI:align:db:alignment_sorted#1.2.1-454-latf-load(2.3.1)-D,SRR617107,D,454
+NCBI:align:db:alignment_sorted#1.2.1-454-latf-load(2.3.2)-D,ERR169857,D,454
+NCBI:align:db:alignment_sorted#1.2.1-454-latf-load(2.3.3)-D,SRR1022493,D,454
+NCBI:align:db:alignment_sorted#1.2.1-454-latf-load.2.3.4(2.3.4)-D,SRR1138226,D,454
+NCBI:align:db:alignment_sorted#1.2.1-454-latf-load.2.3.5(2.3.5)-D,ERR346690,D,454
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-bam-load(2.2.3)-D,SRR767813,D,ABSOLID,AF034253.1:1-5000
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-bam-load(2.3.2)-D,ERR303572,D,ABSOLID,CM000664.1:73675001-73675011
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-bam-load(2.3.3)-D,ERR301268,D,ABSOLID,NC_000002.10:91680001-91680011
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-bam-load.2.3.5(2.3.5)-D,SRR1213182,D,ABSOLID,CM000663.1:10001-15000
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-bam-load.2.3.6(2.3.6)-D,SRR1572146,D,ABSOLID,chr1:11767-14445
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-latf-load(2.3.1)-D,SRR801846,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-latf-load(2.3.2)-D,SRR987600,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-latf-load(2.3.3)-D,SRR975539,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-latf-load.2.3.4(2.3.4)-D,SRR1170761,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.2.1-ABSOLID-latf-load.2.3.5(2.3.5)-D,SRR1525616,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.2.1-CAPILLARY-latf-load.2.3.5(2.3.5)-D,SRR1537526,D,CAPILLARY
+NCBI:align:db:alignment_sorted#1.2.1-COMPLETE_GENOMICS-bam-load.2.3.5(2.3.5)-D,SRR1238554,D,COMPLETE_GENOMICS,NC_000001.10:15001-15011
+NCBI:align:db:alignment_sorted#1.2.1-HELICOS-latf-load.2.3.5(2.3.5)-D,SRR1217244,D,HELICOS
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load(2.2.3)-D,SRR1604786,D,ILLUMINA,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load(2.3.1)-D,DRR013124,D,ILLUMINA,4-1/1:3650001-3650011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load(2.3.2)-D,SRR1607286,D,ILLUMINA,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load(2.3.3)-D,ERR366772,D,ILLUMINA,NC_005089.1:10001-10011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load.2.3.3(2.3.3)-D,SRR1043724,D,ILLUMINA,JA2010_JC_00014:1-11
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load.2.3.4(2.3.4)-D,ERR420434,D,ILLUMINA,NC_003197.1:5001-5011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load.2.3.5(2.3.5)-D,ERR583001,D,ILLUMINA,NC_000067.6:7775001-7780000
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-bam-load.2.3.6(2.3.6)-D,SRR1556219,D,ILLUMINA,CM000663.1:15001-15011
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load(2.3.1)-D,SRR816291,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load(2.3.2)-D,ERR318157,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load(2.3.3)-D,SRR1041633,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load.2.3.3(2.3.3)-D,SRR1043950,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load.2.3.4(2.3.4)-D,SRR1171738,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ILLUMINA-latf-load.2.3.5(2.3.5)-D,SRR1575336,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.2.1-ION_TORRENT-bam-load(2.3.2)-D,ERR303537,D,ION_TORRENT,CM000671.1:32630001-32630011
+NCBI:align:db:alignment_sorted#1.2.1-ION_TORRENT-bam-load.2.3.4(2.3.4)-D,SRR1153486,D,ION_TORRENT,22:1-1935
+NCBI:align:db:alignment_sorted#1.2.1-ION_TORRENT-bam-load.2.3.5(2.3.5)-D,SRR1536244,D,ION_TORRENT,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.2.1-ION_TORRENT-latf-load(2.3.2)-D,SRR851864,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.2.1-ION_TORRENT-latf-load.2.3.5(2.3.5)-D,SRR1299024,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-bam-load.2.3.4(2.3.4)-D,SRR1141473,D,PACBIO_SMRT,Pf3D7_03_v3:220001-225000
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-bam-load.2.3.5(2.3.5)-D,SRR1195987,D,PACBIO_SMRT,Pf3D7_03_v3:220001-225000
+#all runs of this type are private: NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load(2.3.1)-D,SRR816121,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load(2.3.2)-D,SRR942732,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load(2.3.3)-D,SRR999223,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load.2.3.3(2.3.3)-D,SRR1006673,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load.2.3.4(2.3.4)-D,SRR1168957,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.2.1-PACBIO_SMRT-latf-load.2.3.5(2.3.5)-D,SRR1564130,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.5.4(2.5.4)-D,SRR820132,D,UNDEFINED,chr9:118398-123961
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load(2.2.3)-D,SRR806708,D,UNDEFINED,chr1:10001-10002
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load(2.3.2)-D,ERR318663,D,UNDEFINED,CM000663.1:85001-85011
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load(2.3.3)-D,ERR231644,D,UNDEFINED,NC_000067.6:33855001-33855011
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load(2.3.5)-D,DRR027738,D,UNDEFINED,AF125673r4000:1-2
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load.2.3.3(2.3.3)-D,SRR1041911,D,UNDEFINED,NC_000079.5:63110001-63115000
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load.2.3.4(2.3.4)-D,ERR419241,D,UNDEFINED,BX571856.1:1-11
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load.2.3.5(2.3.5)-D,ERR571749,D,UNDEFINED,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-bam-load.2.3.6(2.3.6)-D,ERR571748,D,UNDEFINED,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-latf-load(2.3.1)-D,DRR017561,D,UNDEFINED
+NCBI:align:db:alignment_sorted#1.2.1-UNDEFINED-latf-load(2.3.5)-D,DRR047105,D,UNDEFINED
+#all runs of this type are private: NCBI:align:db:alignment_sorted#1.3-454-bam-load.2.5.1(2.5.1)-D,SRR2430743,D,454,ENSMUST00000179481:1-11
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.0(2.4.0)-D,SRR1578536,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.2(2.4.2)-D,SRR1630887,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.2-2(2.4.2)-D,SRR1756068,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.3(2.4.3)-D,ERR673991,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.4(2.4.4)-D,ERR673994,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.4.5(2.4.5)-D,SRR2011241,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.5.0(2.5.0)-D,SRR2054761,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.5.1(2.5.1)-D,ERR924522,D,454
+NCBI:align:db:alignment_sorted#1.3-454-latf-load.2.5.2(2.5.2)-D,ERR752925,D,454
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.4.0.1(2.4.0)-D,ERR634919,D,ABSOLID,NC_000001.9:725001-730000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.4.2(2.4.2)-D,SRR1772144,D,ABSOLID,chr1:600001-605000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.4.3-1(2.4.3)-D,ERR661176,D,ABSOLID,CM000663.1:10001-15000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.4.5(2.4.5)-D,ERR747955,D,ABSOLID,CM000663.1:10001-15000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.5.0(2.5.0)-D,ERR732600,D,ABSOLID,chr1:14535-20000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.5.1(2.5.1)-D,ERR946955,D,ABSOLID,CM000666.1:114275001-114275011
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-bam-load.2.5.2(2.5.2)-D,SRR2102318,D,ABSOLID,NC_000001.10:25001-30000
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-latf-load.2.4.2-2(2.4.2)-D,SRR1743390,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-latf-load.2.4.3(2.4.3)-D,SRR1761345,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-latf-load.2.4.4(2.4.4)-D,SRR1813463,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-latf-load.2.4.5(2.4.5)-D,SRR1952625,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.3-ABSOLID-latf-load.2.5.2(2.5.2)-D,SRR2179730,D,ABSOLID
+NCBI:align:db:alignment_sorted#1.3-CAPILLARY-latf-load.2.4.4(2.4.4)-D,SRR1811472,D,CAPILLARY
+NCBI:align:db:alignment_sorted#1.3-CAPILLARY-latf-load.2.4.5(2.4.5)-D,ERR673293,D,CAPILLARY
+NCBI:align:db:alignment_sorted#1.3-CAPILLARY-latf-load.2.5.1(2.5.1)-D,SRR2064214,D,CAPILLARY
+NCBI:align:db:alignment_sorted#1.3-CAPILLARY-latf-load.2.5.2(2.5.2)-D,ERR738697,D,CAPILLARY
+NCBI:align:db:alignment_sorted#1.3-COMPLETE_GENOMICS-bam-load.2.5.0(2.5.0)-D,SRR1772964,D,COMPLETE_GENOMICS,CM000663.1:20001-20011
+NCBI:align:db:alignment_sorted#1.3-COMPLETE_GENOMICS-bam-load.2.5.1(2.5.1)-D,SRR1772963,D,COMPLETE_GENOMICS,NC_000001.10:20001-20011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.3.6(2.3.6)-D,SRR1576042,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.0(2.4.0)-D,SRR1576253,D,ILLUMINA,CM000663.1:10001-15000
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.0.1(2.4.0)-D,ERR637305,D,ILLUMINA,NC_004325.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.1(2.4.1)-D,ERR654280,D,ILLUMINA,AE005674.2:1-11
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.2(2.4.2)-D,ERR714615,D,ILLUMINA,FM211187.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.3(2.4.3)-D,SRR1764942,D,ILLUMINA,CM000663.1:16255001-16255011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.3-1(2.4.3)-D,SRR1779286,D,ILLUMINA,CM000663.1:169380001-169380011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.4(2.4.4)-D,SRR1735564,D,ILLUMINA,R00000039:1-100
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.4.5(2.4.5)-D,SRR1561427,D,ILLUMINA,NW_006881719.1:135001-135011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.5.0(2.5.0)-D,SRR1596219,D,ILLUMINA,CM000663.1:16890001-16890011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.5.1(2.5.1)-D,ERR976755,D,ILLUMINA,NC_004325.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-bam-load.2.5.2(2.5.2)-D,SRR2089355,D,ILLUMINA,NC_000001.10:16255001-16255011
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.3.5(2.3.5)-D,SRR1576132,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.0(2.4.0)-D,SRR1593262,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.1(2.4.1)-D,SRR1612367,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.2(2.4.2)-D,ERR579200,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.2-2(2.4.2)-D,ERR637413,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.3(2.4.3)-D,SRR1796498,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.4(2.4.4)-D,ERR665272,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.4.5(2.4.5)-D,SRR2015928,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.5.0(2.5.0)-D,ERR566218,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.5.1(2.5.1)-D,ERR929452,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ILLUMINA-latf-load.2.5.2(2.5.2)-D,SRR2628530,D,ILLUMINA
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.0(2.4.0)-D,SRR1581222,D,ION_TORRENT,CM000663.1:43810001-43815000
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.0.1(2.4.0)-D,SRR1582621,D,ION_TORRENT,CM000663.1:4610001-4615000
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.2(2.4.2)-D,SRR1710770,D,ION_TORRENT,NC_011993.1:50001-50011
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.3-1(2.4.3)-D,ERR654234,D,ION_TORRENT,CM000663.1:196945001-196950000
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.4(2.4.4)-D,ERR654241,D,ION_TORRENT,CM000663.1:196945001-196950000
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.4.5(2.4.5)-D,SRR1979203,D,ION_TORRENT,CM000673.1:62285001-62285011
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.5.0(2.5.0)-D,SRR2054919,D,ION_TORRENT,NC_002695.1:1-11
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.5.1(2.5.1)-D,ERR868268,D,ION_TORRENT,CM000663.1:152280001-152280011
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-bam-load.2.5.2(2.5.2)-D,ERR875288,D,ION_TORRENT,NM_017436.4:1-2106
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.4.2(2.4.2)-D,SRR1611625,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.4.2-2(2.4.2)-D,SRR1745247,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.4.3(2.4.3)-D,ERR653335,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.4.4(2.4.4)-D,SRR1867944,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.4.5(2.4.5)-D,SRR2014707,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.5.0(2.5.0)-D,ERR792549,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.5.1(2.5.1)-D,ERR849661,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-ION_TORRENT-latf-load.2.5.2(2.5.2)-D,ERR906384,D,ION_TORRENT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.4.1(2.4.1)-D,SRR1609768,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.4.2-2(2.4.2)-D,SRR1722569,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.4.3(2.4.3)-D,SRR1793660,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.4.4(2.4.4)-D,SRR1823957,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.4.5(2.4.5)-D,SRR1980665,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.5.0(2.5.0)-D,SRR2049159,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.5.1(2.5.1)-D,SRR2084063,D,PACBIO_SMRT
+NCBI:align:db:alignment_sorted#1.3-PACBIO_SMRT-latf-load.2.5.2(2.5.2)-D,SRR2560504,D,PACBIO_SMRT
+#all runs of this type are private: NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.3.6(2.3.6)-D,SRR1575026,D,UNDEFINED,NC_000086.6:166650001-166650011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.0(2.4.0)-D,ERR577497,D,UNDEFINED,CM000663.1:10001-15000
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.0.1(2.4.0)-D,ERR577494,D,UNDEFINED,J01415.2:10001-10011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.1(2.4.1)-D,ERR653156,D,UNDEFINED,FR878060.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.2(2.4.2)-D,ERR694485,D,UNDEFINED,NC_000017.9:1-5000
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.3(2.4.3)-D,SRR1758433,D,UNDEFINED,NC_000067.5:4800001-4800011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.3-1(2.4.3)-D,SRR1842828,D,UNDEFINED,NODE_1000157_length_958_cov_43.022964:118-612
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.4(2.4.4)-D,ERR769899,D,UNDEFINED,MT:1000-9000
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.4.5(2.4.5)-D,ERR769886,D,UNDEFINED,NC_012920.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.5.0(2.5.0)-D,ERR726972,D,UNDEFINED,NC_001133.8:5001-5011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.5.1(2.5.1)-D,ERR922054,D,UNDEFINED,NC_012920.1:5001-5011
+NCBI:align:db:alignment_sorted#1.3-UNDEFINED-bam-load.2.5.2(2.5.2)-D,ERR957001,D,UNDEFINED,NC_003197.1:1-11
+NCBI:align:db:alignment_unsorted#1.2-ILLUMINA-bam-load(2.2.2)-D,ERR221380,D,ILLUMINA,AL111168.1:1-5000
+NCBI:align:db:alignment_unsorted#1.2-ILLUMINA-bam-load(2.3.4)-D,ERR449385,D,ILLUMINA
+NCBI:align:db:alignment_unsorted#1.2.1-ILLUMINA-bam-load(2.3.4)-D,ERR570054,D,ILLUMINA
diff --git a/test/kar/expected/1.0.stdout b/test/kar/expected/1.0.stdout
new file mode 100644
index 0000000..a06c00e
--- /dev/null
+++ b/test/kar/expected/1.0.stdout
@@ -0,0 +1,35 @@
+1.md5
+col
+col/sub1
+col/sub1/idx
+col/sub1/idx0
+col/sub1/idx1
+col/sub1/idx2
+col/sub1/idx3
+idx
+idx/4a
+idx/4b
+idx/sub
+idx/sub/4c
+idx/sub/4d
+md
+md/cur
+md5
+sub1
+sub1/col
+sub1/col/sub1
+sub1/col/sub1/idx
+sub1/col/sub1/idx0
+sub1/col/sub1/idx1
+sub1/col/sub1/idx2
+sub1/col/sub1/idx3
+sub1/md
+sub1/md/cur
+sub1/sub2
+sub1/sub2/col
+sub1/sub2/col/sub1
+sub1/sub2/col/sub1/idx
+sub1/sub2/col/sub1/idx0
+sub1/sub2/col/sub1/idx1
+sub1/sub2/col/sub1/idx2
+sub1/sub2/col/sub1/idx3
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/1.md5
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/1.md5
diff --git a/src/test/java/htsjdk/samtools/apps/.gitignore b/test/kar/input/1.0/col/sub1/idx
similarity index 100%
rename from src/test/java/htsjdk/samtools/apps/.gitignore
rename to test/kar/input/1.0/col/sub1/idx
diff --git a/src/test/java/htsjdk/samtools/fastq/.gitignore b/test/kar/input/1.0/col/sub1/idx0
similarity index 100%
rename from src/test/java/htsjdk/samtools/fastq/.gitignore
rename to test/kar/input/1.0/col/sub1/idx0
diff --git a/src/test/java/htsjdk/tribble/source/.gitignore b/test/kar/input/1.0/col/sub1/idx1
similarity index 100%
rename from src/test/java/htsjdk/tribble/source/.gitignore
rename to test/kar/input/1.0/col/sub1/idx1
diff --git a/src/test/resources/htsjdk/samtools/cram/xx#blank.sam b/test/kar/input/1.0/col/sub1/idx2
similarity index 100%
rename from src/test/resources/htsjdk/samtools/cram/xx#blank.sam
rename to test/kar/input/1.0/col/sub1/idx2
diff --git a/src/test/resources/htsjdk/samtools/io/empty.txt b/test/kar/input/1.0/col/sub1/idx3
similarity index 100%
rename from src/test/resources/htsjdk/samtools/io/empty.txt
rename to test/kar/input/1.0/col/sub1/idx3
diff --git a/src/test/resources/htsjdk/tribble/tmp/.gitignore b/test/kar/input/1.0/idx/4a
similarity index 100%
rename from src/test/resources/htsjdk/tribble/tmp/.gitignore
rename to test/kar/input/1.0/idx/4a
diff --git a/src/test/resources/tribble/tmp/.gitignore b/test/kar/input/1.0/idx/4b
similarity index 100%
rename from src/test/resources/tribble/tmp/.gitignore
rename to test/kar/input/1.0/idx/4b
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/idx/sub/4c
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/idx/sub/4c
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/idx/sub/4d
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/idx/sub/4d
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/md/cur
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/md/cur
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/md5
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/md5
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/col/sub1/idx
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/col/sub1/idx
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/col/sub1/idx0
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/col/sub1/idx0
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/col/sub1/idx1
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/col/sub1/idx1
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/col/sub1/idx2
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/col/sub1/idx2
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/col/sub1/idx3
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/col/sub1/idx3
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/md/cur
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/md/cur
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/sub2/col/sub1/idx
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/sub2/col/sub1/idx
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/sub2/col/sub1/idx0
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/sub2/col/sub1/idx0
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/sub2/col/sub1/idx1
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/sub2/col/sub1/idx1
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/sub2/col/sub1/idx2
similarity index 100%
copy from src/main/java/htsjdk/tribble/util/ftp/.gitignore
copy to test/kar/input/1.0/sub1/sub2/col/sub1/idx2
diff --git a/src/main/java/htsjdk/tribble/util/ftp/.gitignore b/test/kar/input/1.0/sub1/sub2/col/sub1/idx3
similarity index 100%
rename from src/main/java/htsjdk/tribble/util/ftp/.gitignore
rename to test/kar/input/1.0/sub1/sub2/col/sub1/idx3
diff --git a/test/kar/kar-srr-test.sh b/test/kar/kar-srr-test.sh
new file mode 100755
index 0000000..3693944
--- /dev/null
+++ b/test/kar/kar-srr-test.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+KAR=kar
+[ $# -ge 1 ] && KAR="$1"
+
+ACCLIST="acc.txt"
+acc="tmp"
+
+cleanup ()
+{
+ chmod -R +w $acc*
+ rm -rf $acc* *-dump.txt
+}
+
+trap 'echo " quitting $acc test" && cleanup && exit 1' 2
+
+for acc in `shuf -n 1 $ACCLIST | cut -d',' -f2`
+do
+ # extract an SRR with the new tool
+ echo "extracting $acc"
+ if ! kar -x `srapath $acc` -d $acc
+ then
+ STATUS=$?
+ echo "new KAR failed to extract an exisiting SRR file"
+ cleanup
+ exit $STATUS
+ fi
+
+ # re-kar the exracted SRR to run VDB-DUMP
+ echo "archiving $acc"
+ if ! kar -c $acc.sra -d $acc
+ then
+ STATUS=$?
+ echo "new KAR to create archive with previously extracted SRR file"
+ cleanup
+ exit $STATUS
+ fi
+
+ # vdb-dump the new archive and compare outputs from the old SRR archive
+ echo "starting dumps"
+ vdb-dump $acc.sra > new-$acc-dump.txt
+ echo " finished dumping new-$acc-dump.txt"
+ vdb-dump `srapath $acc` > old-$acc-dump.txt
+ echo " finished dumping old-$acc-dump.txt"
+
+ echo "comparing new-$acc-dump.txt and old-$acc-dump.txt"
+ if ! diff new-$acc-dump.txt old-$acc-dump.txt
+ then
+ STATUS=$?
+ echo "vdb-dump differs in new archive"
+ cleanup
+ exit $STATUS
+ fi
+
+ cleanup
+done
+
+exit $STATUS
diff --git a/test/kar/kar-test.sh b/test/kar/kar-test.sh
new file mode 100755
index 0000000..b407a46
--- /dev/null
+++ b/test/kar/kar-test.sh
@@ -0,0 +1,400 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+RESULT="result"
+ARCHIVE="newkar.kar"
+INPUT="source"
+OUTPUT="output"
+
+
+KAR=kar
+[ $# -ge 1 ] && KAR="$1"
+
+UNAME=$(uname -s)
+case $UNAME in
+ (Linux)
+ OS=linux
+ ;;
+ (Darwin)
+ OS=mac
+ MD5TOOL=/sbin/md5
+ ;;
+ (*)
+ echo "unsupported platform: $UNAME"
+ exit 1
+ ;;
+esac
+
+
+OLDKAR=/net/snowman/vol/projects/trace_software/vdb/$OS/debug/x86_64/bin/kar.2.6.3
+if [ ! -x $OLDKAR ]
+then
+ OLDKAR=/panfs/traces01.be-md.ncbi.nlm.nih.gov/trace_software/vdb/vdb-versions/2.6.3/$OS/debug/x86_64/bin/kar.2.6.3
+fi
+
+cleanup ()
+{
+ rm -rf $ARCHIVE $ARCHIVE.md5 $RESULT/* $RESULT
+
+}
+
+test_create ()
+{
+ echo "Testing create mode..."
+ if ! $KAR -c $ARCHIVE -d $INPUT
+ then
+ echo "KAR create operation failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing create mode with existing archive..."
+ if $KAR -c $ARCHIVE -d $INPUT 2> /dev/null
+ then
+ echo "KAR create operation with existing archive failed to produce an error"
+ cleanup
+ exit 1
+ fi
+}
+
+test_create_options ()
+{
+ echo " Testing force: -f create mode..."
+ if ! $KAR -f -c $ARCHIVE -d $INPUT
+ then
+ echo "KAR force create operation failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing option variation --create ..."
+ if ! $KAR -f --create $ARCHIVE -d $INPUT
+ then
+ echo "KAR create operation failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing option variation --directory ..."
+ if ! $KAR -f --create $ARCHIVE --directory $INPUT
+ then
+ echo "KAR create operation failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing option variation --force ..."
+ if ! $KAR --force --create $ARCHIVE --directory $INPUT
+ then
+ echo "KAR create operation failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing md5: --md5 mode..."
+ if ! $KAR --md5 -f -c $ARCHIVE -d $INPUT
+ then
+ echo "KAR md5 operation failed"
+ exit 1
+ else
+ case $UNAME in
+ (Linux)
+ if ! md5sum -c $ARCHIVE.md5 > /dev/null
+ then
+ echo "md5sum check failed with status $?"
+ cleanup
+ exit 1
+ fi
+ ;;
+ (Darwin)
+ if [ ! -x $MD5TOOL ]
+ then
+ echo "could not locate executable md5 tool"
+ elif ! MD5=$($MD5TOOL $ARCHIVE | cut -f4 -d' ')
+ then
+ echo "md5 failed with status $?"
+ cleanup
+ exit 1
+ else
+ MY_MD5=$(cut -f1 -d' ' $ARCHIVE.md5)
+ if [ "$MD5" != "$MY_MD5" ]
+ then
+ echo "$ARCHIVE: FAILED"
+ cleanup
+ exit 1
+ fi
+ fi
+ ;;
+ (*)
+ echo unknown platform
+ cleanup
+ exit 1
+ ;;
+ esac
+ fi
+}
+
+test_list ()
+{
+ echo "Testing test mode..."
+ if ! $KAR -t $ARCHIVE > /dev/null
+ then
+ STATUS=$?
+ echo "KAR listing failed"
+ cleanup
+ exit 1
+ fi
+
+ echo " Testing option variation --test ..."
+ if ! $KAR --test $ARCHIVE > /dev/null
+ then
+ STATUS=$?
+ echo "KAR listing failed"
+ cleanup
+ exit 1
+ fi
+}
+
+test_list_options ()
+{
+ echo " Testing longlist: -l mode..."
+ if ! $KAR -l -t $ARCHIVE > /dev/null
+ then
+ STATUS=$?
+ echo "KAR long listing failed"
+ cleanup
+ exit 1
+ fi
+}
+
+test_extract ()
+{
+ echo "Testing extract mode..."
+ DIR="extracted"
+ if ! $KAR -x $ARCHIVE -d $DIR
+ then
+ STATUS=$?
+ echo "KAR extraction failed"
+ cleanup
+ exit 1
+ fi
+
+ rm -rf $DIR
+
+ echo " Testing extract mode --extract..."
+ DIR="extracted"
+ if ! $KAR --extract $ARCHIVE -d $DIR
+ then
+ STATUS=$?
+ echo "KAR extraction failed"
+ cleanup
+ exit 1
+ fi
+
+ rm -rf $DIR
+}
+
+
+# create archive with new tool
+# test and extract with legacy
+test_cNew_txOld_cmp ()
+{
+ echo "Testing new archive - list and extract with old..."
+
+ mkdir $RESULT
+
+ $KAR -f -c $ARCHIVE -d $INPUT
+
+ if ! $OLDKAR -t $ARCHIVE > $RESULT/olist.txt
+ then
+ STATUS=$?
+ echo " legacy-KAR could not test the archive...failed"
+ cleanup
+ exit 1
+ fi
+
+ if ! $OLDKAR -l -t $ARCHIVE > $RESULT/ollist.txt
+ then
+ STATUS=$?
+ echo " legacy-KAR could not test the archive with longlist...failed"
+ cleanup
+ exit 1
+ fi
+
+ if ! $OLDKAR -x $ARCHIVE -d $RESULT/o_extracted
+ then
+ STATUS=$?
+ echo " legacy-KAR could not extract the archive...failed"
+ cleanup
+ exit 1
+ fi
+
+
+ #start comparing outputs
+ echo " Comparing list outputs..."
+ $KAR -t $ARCHIVE > $RESULT/nlist.txt
+ if ! diff -w $RESULT/olist.txt $RESULT/nlist.txt > $RESULT/diff.txt
+ then
+ STATUS=$?
+ echo " KAR listing differs from legacy...test failed"
+ cat $RESULT/diff.txt
+ cleanup
+ exit 1
+ fi
+
+ # there is no purpose in testing long list mode.
+ # most of the differences are an attempt to correct errors in the old tool
+
+ echo " Comparing extracted archives..."
+ $KAR -x $ARCHIVE -d $RESULT/n_extracted
+ if ! diff -q -r $RESULT/o_extracted $RESULT/n_extracted 2> $RESULT/diff.txt
+ then
+ grep -v "alias" $RESULT/diff.txt > $RESULT/tmp; mv $RESULT/tmp $RESULT/diff.txt
+
+ if [ -s $RESULT/diff.txt ]
+ then
+ STATUS=$?
+ echo " KAR extracting content differs from legacy...test failed"
+ cat $RESULT/diff.txt
+ cleanup
+ exit 1
+ fi
+ fi
+
+ chmod -R +w $RESULT/o_extracted
+ cleanup
+}
+
+
+
+test_cOld_txNew_cmp ()
+{
+ echo "Testing legacy archive - list and extract with new..."
+ SS="simple_source"
+
+ mkdir $RESULT
+
+ # create new source and remove aliases legacy kar doesnt handle
+ cp -r $INPUT $SS
+ rm -rf $SS/alias_subdir $SS/local_f_subdir_alias
+
+ $OLDKAR -f -c $ARCHIVE -d $SS
+
+ if ! $KAR -t $ARCHIVE > $RESULT/nlist.txt
+ then
+ STATUS=$?
+ echo " KAR could not test the archive...failed"
+ rm -rf $SS
+ cleanup
+ exit 1
+ fi
+
+ if ! $KAR -l -t $ARCHIVE > $RESULT/nllist.txt
+ then
+ STATUS=$?
+ echo " KAR could not test the archive with longlist...failed"
+ rm -rf $SS
+ cleanup
+ exit 1
+ fi
+
+ if ! $KAR -x $ARCHIVE -d $RESULT/n_extracted
+ then
+ STATUS=$?
+ echo " KAR could not extract the archive...failed"
+ rm -rf $SS
+ cleanup
+ exit 1
+ fi
+
+
+ #start comparing outputs
+ echo " Comparing list outputs..."
+ $OLDKAR -t $ARCHIVE > $RESULT/olist.txt
+ if ! diff -w $RESULT/nlist.txt $RESULT/olist.txt > $RESULT/diff.txt
+ then
+ STATUS=$?
+ echo " KAR listing differs from legacy...test failed"
+ cat $RESULT/diff.txt
+ cleanup
+ exit 1
+ fi
+
+ # there is no purpose in testing long list mode.
+ # most of the differences are an attempt to correct errors in the old tool
+
+ echo " Comparing extracted archives..."
+ $OLDKAR -x $ARCHIVE -d $RESULT/o_extracted
+ if ! diff -q -r $RESULT/n_extracted $RESULT/o_extracted 2> $RESULT/diff.txt
+ then
+ grep -v "alias" $RESULT/diff.txt > $RESULT/tmp; mv $RESULT/tmp $RESULT/diff.txt
+
+ if [ -s $RESULT/diff.txt ]
+ then
+ STATUS=$?
+ echo " KAR extracting content differs from legacy...test failed"
+ cat $RESULT/diff.txt
+ cleanup
+ exit 1
+ fi
+ fi
+
+ chmod -R +w $RESULT/o_extracted
+ rm -rf $SS
+ cleanup
+}
+
+
+run_basic ()
+{
+ test_create
+ test_create_options
+ test_list
+ test_list_options
+ test_extract
+}
+
+run_compare ()
+{
+ if [ -x $OLDKAR ]
+ then
+ test_cNew_txOld_cmp
+ test_cOld_txNew_cmp
+ else
+ echo "could not locate old kar tool to run comparisons"
+ fi
+}
+
+
+# run the script
+run_basic
+run_compare
+
+
+cleanup
+
+
+exit 0
\ No newline at end of file
diff --git a/test/kar/old-kar b/test/kar/old-kar
new file mode 120000
index 0000000..950a1d6
--- /dev/null
+++ b/test/kar/old-kar
@@ -0,0 +1 @@
+/net/snowman/vol/projects/trace_software/vdb/linux/debug/x86_64/bin/kar
\ No newline at end of file
diff --git a/test/kar/source/alias_subdir/d1/subdir_f_alias b/test/kar/source/alias_subdir/d1/subdir_f_alias
new file mode 120000
index 0000000..1180d4b
--- /dev/null
+++ b/test/kar/source/alias_subdir/d1/subdir_f_alias
@@ -0,0 +1 @@
+../../f1
\ No newline at end of file
diff --git a/test/kar/source/alias_subdir/f1 b/test/kar/source/alias_subdir/f1
new file mode 100644
index 0000000..6e9849c
--- /dev/null
+++ b/test/kar/source/alias_subdir/f1
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi
diff --git a/test/kar/source/d1/d1f1 b/test/kar/source/d1/d1f1
new file mode 100644
index 0000000..6e9849c
--- /dev/null
+++ b/test/kar/source/d1/d1f1
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi
diff --git a/test/kar/source/d1/d1f2 b/test/kar/source/d1/d1f2
new file mode 100644
index 0000000..74647a2
--- /dev/null
+++ b/test/kar/source/d1/d1f2
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/d1/d1f3 b/test/kar/source/d1/d1f3
new file mode 100644
index 0000000..883bdf7
--- /dev/null
+++ b/test/kar/source/d1/d1f3
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/d2/d1/d2f1 b/test/kar/source/d2/d1/d2f1
new file mode 100644
index 0000000..6e9849c
--- /dev/null
+++ b/test/kar/source/d2/d1/d2f1
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi
diff --git a/test/kar/source/d2/d1/d2f2 b/test/kar/source/d2/d1/d2f2
new file mode 100644
index 0000000..74647a2
--- /dev/null
+++ b/test/kar/source/d2/d1/d2f2
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/d2/d1/d2f3 b/test/kar/source/d2/d1/d2f3
new file mode 100644
index 0000000..883bdf7
--- /dev/null
+++ b/test/kar/source/d2/d1/d2f3
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/d3/d2/d1/d3f1 b/test/kar/source/d3/d2/d1/d3f1
new file mode 100644
index 0000000..6e9849c
--- /dev/null
+++ b/test/kar/source/d3/d2/d1/d3f1
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi
diff --git a/test/kar/source/d3/d2/d1/d3f2 b/test/kar/source/d3/d2/d1/d3f2
new file mode 100644
index 0000000..74647a2
--- /dev/null
+++ b/test/kar/source/d3/d2/d1/d3f2
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/d3/d2/d1/d3f3 b/test/kar/source/d3/d2/d1/d3f3
new file mode 100644
index 0000000..883bdf7
--- /dev/null
+++ b/test/kar/source/d3/d2/d1/d3f3
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/f1 b/test/kar/source/f1
new file mode 100644
index 0000000..6e9849c
--- /dev/null
+++ b/test/kar/source/f1
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi
diff --git a/test/kar/source/f2 b/test/kar/source/f2
new file mode 100644
index 0000000..74647a2
--- /dev/null
+++ b/test/kar/source/f2
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/f3 b/test/kar/source/f3
new file mode 100644
index 0000000..883bdf7
--- /dev/null
+++ b/test/kar/source/f3
@@ -0,0 +1 @@
+sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd vi sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v sdfkjas;dfl lkajsdf ;lkajsd fajsd kjaskdjhf aisdhc askjdc lakscsc lshdiasbcasbhd v
diff --git a/test/kar/source/local_d_alias b/test/kar/source/local_d_alias
new file mode 120000
index 0000000..562890b
--- /dev/null
+++ b/test/kar/source/local_d_alias
@@ -0,0 +1 @@
+d1
\ No newline at end of file
diff --git a/test/kar/source/local_f_alias b/test/kar/source/local_f_alias
new file mode 120000
index 0000000..9dd7ac9
--- /dev/null
+++ b/test/kar/source/local_f_alias
@@ -0,0 +1 @@
+f1
\ No newline at end of file
diff --git a/test/kar/source/local_f_subdir_alias b/test/kar/source/local_f_subdir_alias
new file mode 120000
index 0000000..b555588
--- /dev/null
+++ b/test/kar/source/local_f_subdir_alias
@@ -0,0 +1 @@
+alias_subdir/f1
\ No newline at end of file
diff --git a/test/kget/.gitignore b/test/kget/.gitignore
new file mode 100644
index 0000000..d64c8f0
--- /dev/null
+++ b/test/kget/.gitignore
@@ -0,0 +1,3 @@
+*.sra
+*.dat
+*.cachetee
\ No newline at end of file
diff --git a/test/kget/Makefile b/test/kget/Makefile
new file mode 100644
index 0000000..c7b8daa
--- /dev/null
+++ b/test/kget/Makefile
@@ -0,0 +1,66 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/kget
+
+TEST_TOOLS = \
+
+include $(TOP)/build/Makefile.env
+
+.PHONY: $(TEST_TOOLS)
+
+#-------------------------------------------------------------------------------
+# runtests:
+#
+runtests: download
+
+download:
+ export PATH=$(BINDIR):$$PATH; export VDB_CONFIG=`pwd` ; \
+ python test_kget.py # expect rc = 0
+
+#-------------------------------------------------------------------------------
+# slowtests: match output vs wget
+#
+
+slowtests: diff-vs-wget
+
+ACCESSION = SRR072810
+URL = http://sra-download.ncbi.nlm.nih.gov/srapub/$(ACCESSION)
+
+clean:
+ rm -f $(ACCESSION)*
+
+diff-vs-wget: clean
+ $(BINDIR)/kget --reliable -c ./$(ACCESSION).cachetee $(URL) $(ACCESSION).dat --progress
+ wget --no-check-certificate $(URL)
+ diff ./$(ACCESSION) ./$(ACCESSION).dat
+ #diff $(ACCESSION).sra ./$(ACCESSION).cachetee
+ rm -f $(ACCESSION)*
+
+
+.PHONY:
diff --git a/test/kget/resolver.kfg b/test/kget/resolver.kfg
new file mode 100644
index 0000000..e3ecd77
--- /dev/null
+++ b/test/kget/resolver.kfg
@@ -0,0 +1 @@
+/repository/remote/main/CGI/resolver-cgi = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
diff --git a/test/kget/test_kget.py b/test/kget/test_kget.py
new file mode 100644
index 0000000..64080b4
--- /dev/null
+++ b/test/kget/test_kget.py
@@ -0,0 +1,175 @@
+import os
+import sys
+import subprocess
+import hashlib
+import datetime
+
+'''---------------------------------------------------------------------
+ calls "vdb-dump ACCESSION --info"
+ extracts from the output the line that starts with "remote : ...."
+ returns the remote url or None
+---------------------------------------------------------------------'''
+def get_remote_url( acc ):
+ cmd = "vdb-dump %s --info"%( acc )
+ try:
+ lines = subprocess.check_output( cmd, shell = True ).split( "\n" )
+ for line in lines:
+ try:
+ colon = line.index( ":" )
+ if line[ :colon ].strip() == "remote" :
+ url = line[ colon+1: ].strip()
+ if url.startswith( "http:" ) or url.startswith( "https:" ) :
+ return url
+ except:
+ pass
+ for line in lines:
+ try:
+ colon = line.index( ":" )
+ if line[ :colon ].strip() == "path" :
+ url = line[ colon+1: ].strip()
+ if url.startswith( "http:" ) or url.startswith( "https:" ) :
+ return url
+ except:
+ pass
+ except:
+ pass
+ return None
+
+'''---------------------------------------------------------------------
+ calls "kget URL --show-size"
+ extracts from the output the line that starts with "file-size : ...."
+ returns the value as int or 0
+---------------------------------------------------------------------'''
+def kget_remote_size( url ):
+ cmd = "kget %s --show-size"%( url )
+ try:
+ lines = subprocess.check_output( cmd, shell = True ).split( "\n" )
+ for line in lines:
+ try:
+ eq = line.index( "=" )
+ if line[ :eq ].strip() == "file-size" :
+ return int( line[ eq+1: ].strip() )
+ except:
+ pass
+ except:
+ pass
+ return 0
+
+'''---------------------------------------------------------------------
+ helper functions to create a md5 or sha256 hash from a file
+ ( this way we do not depend on the existence of a md5sum-binary )
+---------------------------------------------------------------------'''
+def hashfile( afile, hasher, blocksize=65536 ) :
+ buf = afile.read( blocksize )
+ while len( buf ) > 0 :
+ hasher.update( buf )
+ buf = afile.read( blocksize )
+ return hasher.hexdigest()
+
+def md5( fname ) :
+ return hashfile( open( fname, 'rb' ), hashlib.md5() )
+
+def sha256( fname ) :
+ return hashfile( open( fname, 'rb' ), hashlib.sha256() )
+
+
+'''---------------------------------------------------------------------
+ calls "kget URL"
+---------------------------------------------------------------------'''
+def kget_download_partial( url, acc ):
+ try:
+ os.remove( acc )
+ except:
+ pass
+
+ cmd = "kget %s"%( url )
+ try:
+ subprocess.check_output( cmd, shell = True )
+ return md5( acc )
+ except:
+ return None
+
+'''---------------------------------------------------------------------
+ calls "kget URL --full"
+---------------------------------------------------------------------'''
+def kget_download_full( url, acc ):
+ try:
+ os.remove( acc )
+ except:
+ pass
+ cmd = "kget %s --full"%( url )
+ try:
+ subprocess.check_output( cmd, shell = True )
+ return md5( acc )
+ except:
+ return None
+
+
+'''---------------------------------------------------------------------
+ the expected values
+---------------------------------------------------------------------'''
+ACC = "NC_011748.1"
+EXP_SIZE = 1313197
+EXP_MD5 = "2656bc178743c5e32bf0594246300dd6"
+
+
+'''---------------------------------------------------------------------
+ main...
+---------------------------------------------------------------------'''
+print "-" * 80
+print "we test download of accession '%s'"%( ACC )
+
+URL = get_remote_url( ACC )
+if URL == None :
+ print "cannot resolve accession '%s'"%( ACC )
+ sys.exit( -1 )
+
+print "'%s' is resolved into '%s'"%( ACC, URL )
+
+remote_size = kget_remote_size( URL )
+if remote_size != EXP_SIZE :
+ print "size (%d) differs from expected size(%d)"%( remote_size, EXP_SIZE )
+ sys.exit( -1 )
+else :
+ print "size as expected = %d"%( remote_size )
+
+t_start = datetime.datetime.now()
+remote_md5 = kget_download_partial( URL, ACC )
+t_partial = datetime.datetime.now() - t_start;
+if remote_md5 == None :
+ print "error downloading '%s'"%( URL )
+ sys.exit( -1 )
+
+if remote_md5 != EXP_MD5 :
+ print "md5 diff: expected (%s) vs remote (%s)"%( EXP_MD5, remote_md5 )
+ sys.exit( -1 )
+else :
+ print "partial donwload ok in %d ms"%( t_partial.microseconds)
+
+t_start = datetime.datetime.now()
+remote_md5 = kget_download_full( URL, ACC )
+t_full = datetime.datetime.now() - t_start;
+if remote_md5 == None :
+ print "error downloading '%s'"%( URL )
+ sys.exit( -1 )
+
+if remote_md5 != EXP_MD5 :
+ print "md5 diff: expected (%s) vs remote (%s)"%( EXP_MD5, remote_md5 )
+ sys.exit( -1 )
+else :
+ print "full donwload ok in %d ms"%( t_full.microseconds )
+
+'''---------------------------------------------------------------------
+if t_full >= t_partial :
+ print "timing problem: full download should be faster than partial download"
+ sys.exit( -1 )
+else :
+ print "timing ok: full download is faster than partial download"
+---------------------------------------------------------------------'''
+
+try:
+ os.remove( ACC )
+except:
+ pass
+
+print "-" * 80
diff --git a/test/network-test/Makefile b/test/network-test/Makefile
new file mode 100644
index 0000000..ec2dc9f
--- /dev/null
+++ b/test/network-test/Makefile
@@ -0,0 +1,99 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = test/network-test
+
+include $(TOP)/build/Makefile.env
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ network-test
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: vers-includes
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(ALL_TOOLS): vers-includes
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/all: \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# vers-includes
+#
+$(TARGDIR)/vers-includes: $(addsuffix .vers.h,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/vers-includes
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# TOOL_SRC
+#
+TOOL_SRC = \
+ network-testing \
+ network-test
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+TOOL_LIB = \
+ -skapp \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/network-test: $(TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR) -o $@ $^ $(TOOL_LIB)
diff --git a/test/network-test/analyze_strace_log.py b/test/network-test/analyze_strace_log.py
new file mode 100755
index 0000000..1db5c23
--- /dev/null
+++ b/test/network-test/analyze_strace_log.py
@@ -0,0 +1,128 @@
+import os, sys
+
+def extract_port( value ) :
+ res = 0
+ open_par = value.find( '(' )
+ close_par = value.rfind( ')' )
+ if close_par > open_par :
+ try :
+ res = int( value[ open_par + 1 : close_par ] )
+ except :
+ self.socket = 0
+
+class logline :
+ def __init__( self, line, line_nr ) :
+ self.line = line
+ self.line_nr = line_nr
+ self.valid = 0
+ a = line.strip().split( "=" )
+ if len( a ) > 1 :
+ try :
+ b = a[ len( a ) - 1 ].strip().split( " " )
+ self.result = int( b[ 0 ].strip() )
+ open_par = line.find( '(' )
+ if open_par > 0 :
+ self.name = line[ 0 : open_par ]
+ close_par = line.rfind( ')' )
+ if close_par > open_par :
+ tmp = line[ open_par + 1 : close_par ].split( "," )
+ self.params = [ ( x.strip() ) for x in tmp ]
+ if len( self.params ) > 0 :
+ try :
+ self.socket = int( self.params[ 0 ] )
+ except :
+ self.socket = 0
+ self.valid = 1
+ except :
+ pass
+
+ def __str__( self ) :
+ if self.valid > 0 :
+ return "#%d : valid %d, name '%s', result %d, socket %d"%( self.line_nr, self.valid, self.name, self.result, self.socket )
+ return "#%d invalid: '%s'"%( self.line )
+
+class connection :
+ def __init__( self, socket ) :
+ self.socket = socket
+ self.status = 0
+ self.receive_lines = 0
+ self.send_lines = 0
+ print "open socket #%d"%( socket )
+
+ def handle( self, ll ) :
+ if ll.name == 'connect' :
+ self.connect( ll )
+ elif ll.name == 'sendto' :
+ self.sendto( ll )
+ elif ll.name == 'recvfrom' :
+ self.recvfrom( ll )
+ elif ll.name == 'shutdown' :
+ self.shutdown( ll )
+
+ def connect( self, ll ) :
+ print "#%d connect: '%s'"%( self.socket, ll.params )
+
+ def sendto( self, ll ) :
+ if self.send_lines == 0 :
+ print "#%d send: '%s'"%( self.socket, ll.params[ 1 ] )
+ self.send_lines += 1
+
+ def recvfrom( self, ll ) :
+ if self.receive_lines == 0 :
+ print "#%d receive: '%s'"%( self.socket, ll.params[ 1 ] )
+ self.receive_lines += 1
+
+ def shutdown( self, ll ) :
+ self.status = -1
+
+
+def make_connection( line ) :
+ res = None
+ rest_of_line = line[6:]
+ a = rest_of_line.strip().split( "=" )
+ b = a[ 0 ].strip()[1:-1].split( "," )
+ socket_id = int( a[ 1 ].strip() )
+ if b[ 0 ] == 'PF_INET' :
+ res = connection( int( a[ 1 ].strip() ) )
+ return res
+
+def extract_id( line ) :
+ res = line.find( '(' )
+ if res < 0 :
+ return res
+ comma = line.find( ',' )
+ if comma < 0 :
+ return comma
+ tmp = line[ res + 1 : comma ]
+ return int( tmp.strip() )
+
+
+def analyze( logfilename ) :
+ print "analyzing file: '" + logfilename + "'"
+ connections = {}
+ f = open( logfilename )
+ line_nr = 0
+ for line in iter( f ) :
+ ll = logline( line, line_nr )
+ if ll.valid > 0 :
+ if ll.name == 'socket' :
+ if ll.params[ 0 ] == 'PF_INET' :
+ s = ll.result
+ connections[ s ] = connection( s )
+ else :
+ try :
+ s = connections[ ll.socket ]
+ s.handle( ll )
+ if s.status < 0 :
+ del connections[ ll.socket ]
+ print "closed #%d"%( ll.socket )
+ except :
+ pass
+ line_nr += 1
+ f.close
+
+if __name__ == '__main__':
+ if len( sys.argv ) > 1 :
+ analyze( sys.argv[ 1 ] )
+ else :
+ analyze( 'strace.log' )
diff --git a/test/network-test/network-test.c b/test/network-test/network-test.c
new file mode 100644
index 0000000..a6c02ce
--- /dev/null
+++ b/test/network-test/network-test.c
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "network-test.vers.h"
+
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <kfs/file.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+
+#include "network-testing.h"
+
+const char UsageDefaultName[] = "network-test";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg( "\nUsage:\n %s [accession]\n\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+
+/* Version EXTERN
+ * return 4-part version code: 0xMMmmrrrr, where
+ * MM = major release
+ * mm = minor release
+ * rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+ return NETWORK_TEST_VERS;
+}
+
+static rc_t CC write_to_FILE ( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ rc_t rc = KOutHandlerSet ( write_to_FILE, stdout );
+ if ( rc == 0 )
+ {
+ if ( argc < 2 )
+ rc = perfrom_network_test( "SRR000001" );
+ else
+ rc = perfrom_network_test( argv[ 1 ] );
+ }
+ return rc;
+}
+
diff --git a/test/network-test/network-test.vers b/test/network-test/network-test.vers
new file mode 100644
index 0000000..3eefcb9
--- /dev/null
+++ b/test/network-test/network-test.vers
@@ -0,0 +1 @@
+1.0.0
diff --git a/test/network-test/network-testing.c b/test/network-test/network-testing.c
new file mode 100644
index 0000000..44651cf
--- /dev/null
+++ b/test/network-test/network-testing.c
@@ -0,0 +1,436 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+#include <klib/time.h>
+
+#include <kns/manager.h>
+#include <kns/kns-mgr-priv.h> /* KNSManagerMakeReliableHttpFile */
+#include <kns/endpoint.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <kfs/file.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+static rc_t ipv4_endpoint_to_string( char * buffer, size_t buflen, KEndPoint * ep )
+{
+ uint32_t b[4];
+ b[0] = ( ep->u.ipv4.addr & 0xFF000000 ) >> 24;
+ b[1] = ( ep->u.ipv4.addr & 0xFF0000 ) >> 16;
+ b[2] = ( ep->u.ipv4.addr & 0xFF00 ) >> 8;
+ b[3] = ( ep->u.ipv4.addr & 0xFF );
+ return string_printf( buffer, buflen, NULL, "ipv4: %d.%d.%d.%d : %d",
+ b[0], b[1], b[2], b[3], ep->u.ipv4.port );
+}
+
+static rc_t ipv6_endpoint_to_string( char * buffer, size_t buflen, KEndPoint * ep )
+{
+ uint32_t b[8];
+ b[0] = ( ep->u.ipv6.addr[ 0 ] << 8 ) | ep->u.ipv6.addr[ 1 ];
+ b[1] = ( ep->u.ipv6.addr[ 2 ] << 8 ) | ep->u.ipv6.addr[ 3 ];
+ b[2] = ( ep->u.ipv6.addr[ 4 ] << 8 ) | ep->u.ipv6.addr[ 5 ];
+ b[3] = ( ep->u.ipv6.addr[ 6 ] << 8 ) | ep->u.ipv6.addr[ 7 ];
+ b[4] = ( ep->u.ipv6.addr[ 8 ] << 8 ) | ep->u.ipv6.addr[ 9 ];
+ b[5] = ( ep->u.ipv6.addr[ 10 ] << 8 ) | ep->u.ipv6.addr[ 11 ];
+ b[6] = ( ep->u.ipv6.addr[ 12 ] << 8 ) | ep->u.ipv6.addr[ 13 ];
+ b[7] = ( ep->u.ipv6.addr[ 14 ] << 8 ) | ep->u.ipv6.addr[ 15 ];
+ return string_printf( buffer, buflen, NULL, "ipv6: %.04X:%.04X:%.04X:%.04X:%.04X:%.04X:%.04X:%.04X: :%d",
+ b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], ep->u.ipv6.port );
+}
+
+static rc_t ipc_endpoint_to_string( char * buffer, size_t buflen, KEndPoint * ep )
+{
+ return string_printf( buffer, buflen, NULL, "ipc: %s", ep->u.ipc_name );
+}
+
+static rc_t endpoint_to_string( char * buffer, size_t buflen, KEndPoint * ep )
+{
+ rc_t rc;
+ switch( ep->type )
+ {
+ case epIPV4 : rc = ipv4_endpoint_to_string( buffer, buflen, ep ); break;
+ case epIPV6 : rc = ipv6_endpoint_to_string( buffer, buflen, ep ); break;
+ case epIPC : rc = ipc_endpoint_to_string( buffer, buflen, ep ); break;
+ default : rc = string_printf( buffer, buflen, NULL, "unknown endpoint-tyep %d", ep->type ); break;
+ }
+ return rc;
+}
+
+static rc_t perfrom_dns_test( KNSManager const * kns_mgr, const char * domain, uint16_t port )
+{
+ rc_t rc;
+ KEndPoint ep;
+ String s_domain;
+
+ KTimeMs_t start_time = KTimeMsStamp();
+ StringInitCString( &s_domain, domain );
+ rc = KNSManagerInitDNSEndpoint( kns_mgr, &ep, &s_domain, port );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "cannot init endpoint for $(URL):$(PORT)", "URL=%s,PORT=%d", domain, port );
+ else
+ {
+ char s_endpoint[ 1024 ];
+ rc = endpoint_to_string( s_endpoint, sizeof s_endpoint, &ep );
+ KOutMsg( "\nendpoint for %s:%d is: '%s'\n", domain, port, s_endpoint );
+ }
+ KOutMsg( "in %d milliseconds\n", KTimeMsStamp() - start_time );
+
+ return rc;
+}
+
+
+static rc_t read_stream_into_databuffer( KStream * stream, KDataBuffer * databuffer )
+{
+ rc_t rc;
+
+ size_t total = 0;
+ KDataBufferMakeBytes( databuffer, 4096 );
+ while ( 1 )
+ {
+ size_t num_read;
+ uint8_t * base;
+ uint64_t avail = databuffer->elem_count - total;
+ if ( avail < 256 )
+ {
+ rc = KDataBufferResize( databuffer, databuffer->elem_count + 4096 );
+ if ( rc != 0 )
+ {
+ LogErr( klogErr, rc, "CGI: KDataBufferResize failed" );
+ break;
+ }
+ }
+
+ base = databuffer->base;
+ rc = KStreamRead( stream, & base [ total ], ( size_t ) databuffer->elem_count - total, &num_read );
+ if ( rc != 0 )
+ {
+ /* TBD - look more closely at rc */
+ if ( num_read > 0 )
+ {
+ LogErr( klogErr, rc, "CGI: KStreamRead failed" );
+ rc = 0;
+ }
+ else
+ break;
+ }
+
+ if ( num_read == 0 )
+ break;
+
+ total += num_read;
+ }
+
+ if ( rc == 0 )
+ databuffer->elem_count = total;
+ return rc;
+}
+
+
+static rc_t call_cgi( KNSManager const * kns_mgr, const char * cgi_url, uint32_t ver_major, uint32_t ver_minor,
+ const char * protocol, const char * acc, KDataBuffer * databuffer )
+{
+ KHttpRequest * req;
+ rc_t rc = KNSManagerMakeReliableClientRequest( kns_mgr, &req, 0x01000000, NULL, cgi_url );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "CGI: cannot make ReliableClientRequest $(URL)", "URL=%s", cgi_url );
+ else
+ {
+ rc = KHttpRequestAddPostParam( req, "version=%u.%u", ver_major, ver_minor );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "CGI: KHttpRequestAddPostParam version=$(V1).$(V2) failed", "V1=%d,V2=%d", ver_major, ver_minor );
+
+ if ( rc == 0 )
+ {
+ rc = KHttpRequestAddPostParam( req, "acc=%s", acc );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "CGI: KHttpRequestAddPostParam acc=$(ACC) failed", "ACC=%s", acc );
+ }
+
+ if ( rc == 0 )
+ {
+ rc = KHttpRequestAddPostParam ( req, "accept-proto=%s", protocol );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "CGI: KHttpRequestAddPostParam accept-proto=$(PROTO) failed", "PROTO=%s", protocol );
+ }
+
+ if ( rc == 0 )
+ {
+ KHttpResult *rslt;
+ rc = KHttpRequestPOST( req, &rslt );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "CGI: KHttpRequestPOST failed" );
+ else
+ {
+ uint32_t code;
+ rc = KHttpResultStatus ( rslt, &code, NULL, 0, NULL );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "CGI: KHttpResultStatus failed" );
+ else
+ {
+ if ( code != 200 )
+ pLogErr( klogErr, rc, "CGI: unexpected result-code of $(RESCODE)", "RESCODE=%d", code );
+ else
+ {
+ KStream *response;
+
+ rc = KHttpResultGetInputStream ( rslt, &response );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "CGI: KHttpResultGetInputStream failed" );
+ else
+ {
+ rc = read_stream_into_databuffer( response, databuffer );
+ KStreamRelease ( response );
+ }
+ }
+ }
+ KHttpResultRelease ( rslt );
+ }
+ }
+ KHttpRequestRelease ( req );
+ }
+ return rc;
+}
+
+
+static rc_t perform_cgi_test( KNSManager const * kns_mgr, const char * acc )
+{
+ rc_t rc;
+ KDataBuffer databuffer;
+ KTimeMs_t start_time = KTimeMsStamp();
+
+ memset( &databuffer, 0, sizeof databuffer );
+ rc = call_cgi( kns_mgr, "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi", 1, 1, "http,https", acc, &databuffer );
+ if ( rc == 0 )
+ {
+ const char *start = ( const void* ) databuffer.base;
+ size_t size = KDataBufferBytes( &databuffer );
+ KOutMsg( "\nCGI: Response = %.*s\n", size, start );
+ }
+ KOutMsg( "in %d milliseconds\n\n", KTimeMsStamp() - start_time );
+
+ return rc;
+}
+
+
+static rc_t print_vpath( const char * prefix, const VPath * vpath, char * buffer, size_t buflen )
+{
+ const String * s_path;
+ rc_t rc = VPathMakeString( vpath, &s_path );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "VPathMakeString() for $(PREFIX) failed", "PREFIX=%s", prefix );
+ else
+ {
+ KOutMsg( "resolved (%s) : %S\n", prefix, s_path );
+ if ( buffer != NULL && buflen > 0 )
+ string_printf( buffer, buflen, NULL, "%S", s_path );
+ StringWhack( s_path );
+ }
+ return rc;
+}
+
+
+static rc_t perform_resolve_test( const char * acc, char * buffer, size_t buflen )
+{
+ VFSManager * vfs_mgr;
+ rc_t rc = VFSManagerMake( &vfs_mgr );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "VFSManagerMake failed" );
+ else
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "VFSManagerGetResolver failed" );
+ else
+ {
+ VPath * query_path;
+ rc = VFSManagerMakePath( vfs_mgr, &query_path, "ncbi-acc:%s", acc );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "VFSManagerMakePath failed" );
+ else
+ {
+ const VPath * local = NULL;
+ const VPath * remote = NULL;
+ const VPath * cache = NULL;
+
+ KTimeMs_t start_time = KTimeMsStamp();
+
+ rc = VResolverQuery( resolver, 0, query_path, &local, NULL, NULL );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "VResolverQuery (local) failed" );
+ else
+ {
+ rc = print_vpath( "local ", local, NULL, 0 );
+ VPathRelease ( local );
+ }
+ rc = VResolverQuery( resolver, 0, query_path, NULL, &remote, &cache );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "VResolverQuery (remote/cache) failed" );
+ else
+ {
+ if ( remote != NULL )
+ {
+ rc = print_vpath( "remote", remote, buffer, buflen );
+ VPathRelease ( remote );
+ }
+ if ( rc == 0 && cache != NULL )
+ {
+ rc = print_vpath( "cache ", cache, NULL, 0 );
+ VPathRelease ( cache );
+ }
+ }
+
+ KOutMsg( "in %d milliseconds\n", KTimeMsStamp() - start_time );
+ VPathRelease ( query_path );
+ }
+ VResolverRelease( resolver );
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+ return rc;
+}
+
+
+static rc_t read_blocks( const KFile * remote_file, uint32_t block_count, uint64_t * total )
+{
+ rc_t rc = 0;
+ size_t block_size = 1024 * 1024 * 32;
+
+ *total = 0;
+ uint8_t * block = malloc( block_size );
+ if ( block == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+ LogErr( klogErr, rc, "allocation of block failed" );
+ }
+ else
+ {
+ uint32_t i;
+ uint64_t pos = 0;
+ for ( i = 0; rc == 0 && i < block_count; ++i )
+ {
+ size_t num_read;
+ rc = KFileReadAll( remote_file, pos, block, block_size, &num_read );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "KFileReadAll() at '$(POS)' failed", "POS=%ld", pos );
+ else
+ pos += num_read;
+ }
+ *total = pos;
+ free( (void *) block );
+ }
+ return rc;
+}
+
+static rc_t perform_read_test( KNSManager const * kns_mgr, const char * remote_path )
+{
+
+ const KFile * remote_file;
+ KTimeMs_t start_time = KTimeMsStamp();
+ rc_t rc = KNSManagerMakeHttpFile ( kns_mgr, &remote_file, NULL, 0x0101, "%s", remote_path );
+ if ( rc != 0 )
+ pLogErr( klogErr, rc, "KNSManagerMakeHttpFile() '$(FILENAME)' failed", "FILENAME=%s", remote_path );
+ else
+ {
+ uint64_t total;
+ KOutMsg( "\n'%s' opened\nin %d milliseconds\n", remote_path, KTimeMsStamp() - start_time );
+ start_time = KTimeMsStamp();
+ rc = read_blocks( remote_file, 10, &total );
+ KOutMsg( "total of %ld bytes read in %d milliseconds\n\n", total, KTimeMsStamp() - start_time );
+ KFileRelease( remote_file );
+ }
+ return rc;
+}
+
+rc_t perfrom_network_test( const char * acc )
+{
+ KNSManager * kns_mgr;
+ rc_t rc = KNSManagerMake( &kns_mgr );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "cannot make KNS-Manager" );
+ else
+ {
+ if ( KNSManagerGetHTTPProxyEnabled( kns_mgr ) )
+ {
+ KOutMsg( "\nKNSManager: proxy enabled\n" );
+ {
+ const String * proxy;
+ rc = KNSManagerGetHTTPProxyPath( kns_mgr, &proxy );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "cannot request proxy-path from KNS-Manager" );
+ else
+ KOutMsg( "KNSManager: proxy at : %S\n", proxy );
+ }
+ }
+ else
+ KOutMsg( "\nKNSManager: proxy disabled\n" );
+
+ if ( rc == 0 )
+ {
+ const char * user_agent;
+ rc = KNSManagerGetUserAgent( &user_agent );
+ if ( rc != 0 )
+ LogErr( klogErr, rc, "cannot request user-agent from KNS-Manager" );
+ else
+ KOutMsg( "KNSManager: user-agent = '%s'\n", user_agent );
+ }
+
+ if ( rc == 0 )
+ rc = perfrom_dns_test( kns_mgr, "www.ncbi.nlm.nih.gov", 80 );
+
+ if ( rc == 0 )
+ rc = perform_cgi_test( kns_mgr, acc );
+
+ if ( rc == 0 )
+ {
+ char remote_path[ 4096 ];
+ remote_path[ 0 ] = 0;
+ rc = perform_resolve_test( acc, remote_path, sizeof remote_path );
+ if ( rc == 0 && remote_path[ 0 ] != 0 )
+ rc = perform_read_test( kns_mgr, remote_path );
+ }
+
+ KNSManagerRelease( kns_mgr );
+ }
+ return rc;
+}
diff --git a/test/network-test/network-testing.h b/test/network-test/network-testing.h
new file mode 100644
index 0000000..00cacd8
--- /dev/null
+++ b/test/network-test/network-testing.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_network_testing_
+#define _h_network_testing_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+
+rc_t perfrom_network_test( const char * acc );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/test/ngs-pileup/Makefile b/test/ngs-pileup/Makefile
new file mode 100644
index 0000000..03ab186
--- /dev/null
+++ b/test/ngs-pileup/Makefile
@@ -0,0 +1,137 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/ngs-pileup
+
+TEST_TOOLS = \
+ test-ngs-pileup
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# test-ngs-pileup
+#
+TEST_NGS_PILEUP_SRC = \
+ test-ngs-pileup
+
+TEST_NGS_PILEUP_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_NGS_PILEUP_SRC))
+
+TEST_NGS_PILEUP_LIB = \
+ -sngs-c++ \
+ -sncbi-ngs-c++ \
+ -sncbi-vdb-static \
+ -skapp \
+ -sktst \
+
+$(TEST_BINDIR)/test-ngs-pileup: $(TEST_NGS_PILEUP_OBJ)
+ $(LP) --exe -o $@ $^ $(TEST_NGS_PILEUP_LIB)
+
+#-------------------------------------------------------------------------------
+# slowtests: match output vs sra-pileup
+#
+
+slowtests: diff-vs-sra-pileup
+
+diff-vs-sra-pileup:
+ -@ ./runtestcase.sh $(BINDIR) $(SRCDIR) 1.0 SRR833251
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 2.0 SRR1166393
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 3.0 ERR334733 # ILLUMINA
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 4.0 SRR1068006
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 5.0 SRR619510 # ABSOLID REF_ROWS=36172
+ -@ ./runtestcase.sh $(BINDIR) $(SRCDIR) 6.0 SRR1251988 # SEC_ROWS=198
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 7.0 SRR1186012 # ION_TORRENT
+ -@ ./runtestcase.sh $(BINDIR) $(SRCDIR) 8.1 SRR556739 -r chrY # COMPLETE_GENOMICS
+ -@ ./runtestcase.sh $(BINDIR) $(SRCDIR) 8.2 SRR556739 -r chrM # COMPLETE_GENOMICS, circular reference
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 9.0 SRR341578 -r NC_011752.1 #:19900-20022
+
+onediff:
+ @ ./runtestcase.sh $(BINDIR) $(SRCDIR) 9.1 SRR341578 -r NC_011752.1:19900-20022
+
+#alignment selection:
+#TODO: multiple references in one accession
+#TODO: multiple accessions with overlapping alignments
+#TODO: filter by reference (-r ref) using canonic name
+#TODO: filter by reference (-r ref) using common name
+#TODO: filter by multiple references (-r ref1 -r ref2)
+#TODO: filter by position on the reference (-r ref:from-to)
+#TODO: filter by multiple positions on the same reference (-r ref:from1-to1 -r ref:from2-to2)
+#TODO: primary alignment table only (-t p)
+#TODO: secondary alignment table only (-t s)
+#TODO: evidence table only (-t e)
+#TODO: include duplicates (-d 1)
+#TODO: do not include duplicates (-d 0) NB: broken in sra-pileup
+#TODO: minimum mapq value (-q min)
+
+#output control:
+#TODO: omit qualities (-n)
+
+#output file control:
+#TODO: redirect output to a file (-o)
+#TODO: bzip2 output (--bzip2)
+#TODO: gzip output (--gzip)
+
+# hidden options:
+#TODO: output alignment information (-i)
+# any more?
+
+#not sure if these are needed:
+# -p|--spotgroups <spotgroups-modes> divide by spotgroups
+# -e|--seqname use original seq-name
+# --minmismatch min percent of mismatches used in function
+# mismatch, default is 5%
+# --merge-dist If adjacent slices are closer than this,
+# they are merged and skiplist is created.
+# a value of zero disables the feature,
+# default is 10000
+# --function ref list references
+# --function ref-ex list references coverage
+# --function count sort pileup with counters
+# --function stat strand/tlen statistic
+# --function mismatch only lines with mismatch
+# --function index list deletion counts
+# --function varcount variation counters: ref-name, ref-pos,
+# ref-base, coverage, mismatch A, mismatch C,
+# mismatch G, mismatch T, deletes, inserts, ins
+# after A, ins after C, ins after G, ins
+# after T
+# --function deletes list deletions greater then 20
+#
+#Grouping of accessions into artificial spotgroups:
+# sra-pileup SRRXXXXXX=a SRRYYYYYY=b SRRZZZZZZ=a
+
+
+
+.PHONY: diff-vs-sra-pileup
diff --git a/test/ngs-pileup/runtestcase.sh b/test/ngs-pileup/runtestcase.sh
new file mode 100755
index 0000000..b28c39b
--- /dev/null
+++ b/test/ngs-pileup/runtestcase.sh
@@ -0,0 +1,90 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# $1 - path to sra tools (sra-pileup, ngs-pileup)
+# $2 - work directory (actual results and temporaries created under actual/)
+# $3 - test case ID
+# $4, $5, ... - command line options for pileup programs
+#
+# return codes:
+# 0 - passed
+# 1 - could not create temp dir
+# 2 - unexpected return code from sra-pileup
+# 3 - unexpected return code from ngs-pileup
+# 4 - outputs differ
+
+BINDIR=$1
+WORKDIR=$2
+CASEID=$3
+shift 3
+CMDLINE=$*
+
+SRA_PILEUP="$BINDIR/sra-pileup"
+NGS_PILEUP="$BINDIR/ngs-pileup"
+TEMPDIR=$WORKDIR/actual/$CASEID
+
+printf "running $CASEID: "
+
+mkdir -p $TEMPDIR
+rm -rf $TEMPDIR/*
+if [ "$?" != "0" ] ; then
+ exit 1
+fi
+
+CMD="$SRA_PILEUP $CMDLINE 1>$TEMPDIR/sra.stdout.tmp 2>$TEMPDIR/sra.stderr"
+printf "sra... "
+eval "$CMD"
+if [ "$?" != "0" ] ; then
+ echo "SRA pileup failed. Command executed:"
+ echo $CMD
+ cat $TEMPDIR/sra.stderr
+ exit 2
+fi
+cut -f 1,2,4 $TEMPDIR/sra.stdout.tmp >$TEMPDIR/sra.stdout
+
+CMD="$NGS_PILEUP $CMDLINE 1>$TEMPDIR/ngs.stdout 2>$TEMPDIR/ngs.stderr"
+printf "ngs... "
+eval "$CMD"
+if [ "$?" != "0" ] ; then
+ echo "NGS pileup failed. Command executed:"
+ echo $CMD
+ cat $TEMPDIR/ngs.stderr
+ exit 3
+fi
+
+printf "diff... "
+diff $TEMPDIR/sra.stdout $TEMPDIR/ngs.stdout >$TEMPDIR/diff
+if [ "$?" != "0" ] ; then
+ cat $TEMPDIR/diff
+ echo "command executed:"
+ echo $CMD
+ exit 4
+fi
+
+printf "done\n"
+rm -rf $TEMPDIR
+
+exit 0
diff --git a/test/ngs-pileup/test-ngs-pileup.cpp b/test/ngs-pileup/test-ngs-pileup.cpp
new file mode 100644
index 0000000..0711d84
--- /dev/null
+++ b/test/ngs-pileup/test-ngs-pileup.cpp
@@ -0,0 +1,177 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Unit tests for NGS Pileup
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <sysalloc.h>
+
+#include <sstream>
+
+#include "../../tools/ngs-pileup/ngs-pileup.cpp"
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(NgsPileupTestSuite);
+
+class NGSPileupFixture
+{
+public:
+ NGSPileupFixture()
+ {
+ ps . output = & m_str;
+ }
+
+ string Run()
+ {
+ NGS_Pileup ( ps ) . Run ();
+ return m_str . str ();
+ }
+
+ ostringstream m_str;
+ NGS_Pileup::Settings ps;
+};
+
+FIXTURE_TEST_CASE ( NoInput, NGSPileupFixture )
+{
+ Run ();
+ REQUIRE_EQ ( string(), m_str . str() );
+}
+
+FIXTURE_TEST_CASE ( BadInput, NGSPileupFixture )
+{
+ ps . AddInput ( "blah" );
+ REQUIRE_THROW ( Run() );
+ REQUIRE_EQ ( string(), m_str . str() );
+}
+
+FIXTURE_TEST_CASE ( Basic, NGSPileupFixture )
+{
+ ps . AddInput ( "SRR833251" ); // a small accession with primary and secondary alignments
+ string expectedStart = "gi|169794206|ref|NC_010410.1|\t19376\t1\n"; //TODO: expand when pileup prints out more data
+ REQUIRE_EQ ( expectedStart, Run () . substr ( 0, expectedStart . length () ) );
+}
+
+FIXTURE_TEST_CASE ( SingleReference_ByCommonName, NGSPileupFixture )
+{
+ ps . AddInput ( "ERR247027" );
+ ps . AddReference ( "Pf3D7_13" );
+ string expectedStart = "AL844509.2\t1212494\t1"; //TODO: expand when pileup prints out more data
+ string actual = Run ();
+ REQUIRE_EQ ( expectedStart, actual . substr ( 0, expectedStart . length () ) );
+}
+
+FIXTURE_TEST_CASE ( SingleReference_ByCanonicalName, NGSPileupFixture )
+{
+ ps . AddInput ( "ERR247027" );
+ ps . AddReference ( "AL844509.2" );
+ string expectedStart = "AL844509.2\t1212494\t1"; //TODO: expand when pileup prints out more data
+ REQUIRE_EQ ( expectedStart, Run () . substr ( 0, expectedStart . length () ) );
+}
+
+FIXTURE_TEST_CASE ( SingleReference_Slice, NGSPileupFixture )
+{
+ ps . AddInput ( "ERR247027" );
+ ps . AddReferenceSlice ( "AL844509.2", 1212492, 3 );
+ string expected =
+ "AL844509.2\t1212494\t1\n" /* this position is 1-based */
+ "AL844509.2\t1212495\t1\n";
+ //TODO: expand when pileup prints out more data
+ REQUIRE_EQ ( expected, Run () );
+}
+
+#if 0
+FIXTURE_TEST_CASE ( MultipleReferences, NGSPileupFixture )
+{
+ ps . AddInput ( "SRR1068024" ); // 38 references
+ const string ref1 = "0000000.72b.NC2_17738";
+ const string ref2 = "0000000.72b.NC2_14823"; // this one should come first in the output
+ ps . AddReference ( ref1 );
+ ps . AddReference ( ref2 );
+ string expectedStart = ref2 + "\t1\t1";
+
+ string res = Run();
+
+ REQUIRE_EQ ( expectedStart, res . substr ( 0, expectedStart . length () ) );
+ REQUIRE_NE ( string :: npos, res. find ( ref2 ) );
+}
+
+FIXTURE_TEST_CASE ( MultipleInputs, NGSPileupFixture )
+{ // ERR334733 ERR334777 align against the same reference, ERR334733's position comes first so it has to
+ // be the first on the output regardless of order of accessions on the command line
+ ps . AddInput ( "ERR334777" );
+ ps . AddInput ( "ERR334733" );
+ string expectedStart = "FN433596.1\t805952\t1"; // comes from ERR334733
+ string res = Run();
+ REQUIRE_EQ ( expectedStart, res . substr ( 0, expectedStart . length () ) );
+ REQUIRE_NE ( string :: npos, res. find ( "2424446" ) ); // one of the positions from ERR334777
+}
+
+FIXTURE_TEST_CASE ( AllReferencses, NGSPileupFixture )
+{
+ ps . AddInput ( "SRR341578" );
+ string expectedStart = "NC_011748.1\t1\t1";
+ REQUIRE_EQ ( expectedStart, Run () . substr ( 0, expectedStart . length () ) );
+}
+
+//TODO: multiple input overlapping
+#endif
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "test-ngs-pileup";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ KConfigDisableUserSettings();
+ rc_t rc=NgsPileupTestSuite(argc, argv);
+ return rc;
+}
+
+}
+
diff --git a/test/pileup-stats/Makefile b/test/pileup-stats/Makefile
new file mode 100644
index 0000000..cd8b3f6
--- /dev/null
+++ b/test/pileup-stats/Makefile
@@ -0,0 +1,66 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/pileup-stats
+
+TEST_TOOLS = \
+
+ALL_TOOLS = \
+ $(TEST_TOOLS) \
+
+include $(TOP)/build/Makefile.env
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+runtests: pileup-stats ignore-args
+
+#-------------------------------------------------------------------------------
+# pileup-stats tool tests
+#
+
+pileup-stats: $(BINDIR)/pileup-stats
+ @ # The line below is the test for --version output. Yes, this is ridiculous to make tests like this (especially the one depending on the path to the sources of the binary being tested) but Anatoly insisted on it here: VDB-2837
+ @ $(BINDIR)/pileup-stats -V | sed -e 's/\([1-9][0-9]*\)\.0\.0/\1/' -e 's/\([1-9][0-9]*\.[1-9][0-9]*\)\.0/\1/' -e 's/\([1-9][0-9]*\.[0-9][0-9]*\.[1-9][0-9]*\)/\1/' | grep --quiet "$(shell head -n 1 $(TOP)/tools/pileup-stats/pileup-stats.vers)[^0-9\.]"
+
+slowtests: optional-column-ref-offset-type
+
+optional-column-ref-offset-type:
+ @ $(BINDIR)/pileup-stats --align-category primary ERR085308 >/dev/null
+
+vg: $(BINDIR)/pileup-stats
+ @ # TODO: a better command line options should be chosen to test for memory leaks
+ valgrind --ncbi --suppressions=$(SRCDIR)/valgrind.suppress $(BINDIR)/pileup-stats -V
+
+ignore-args: test-ignore-args.sh
+ @ echo "starting test-ignore-args..."
+ @ bash test-ignore-args.sh
\ No newline at end of file
diff --git a/test/pileup-stats/test-ignore-args.sh b/test/pileup-stats/test-ignore-args.sh
new file mode 100644
index 0000000..364a860
--- /dev/null
+++ b/test/pileup-stats/test-ignore-args.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+test_ignore_args ()
+{
+ if ! pileup-stats -L 1 2> /dev/null
+ then
+ echo $?...test failed on option -L
+ fi
+
+ if ! pileup-stats -z ignore.txt 2> /dev/null
+ then
+ echo $?...test failed on option -z
+ fi
+
+ if ! pileup-stats --log-level 1 2> /dev/null
+ then
+ echo $?...test failed on option --log-level
+ fi
+
+ if ! pileup-stats --xml-log ignore.txt 2> /dev/null
+ then
+ echo $?...test failed on option --xml-log
+ fi
+
+ if ! pileup-stats --xml-log-fd ignore.txt 2> /dev/null
+ then
+ echo $?...test failed on option --xml-log-fd
+ fi
+}
+
+test_ignore_args
\ No newline at end of file
diff --git a/test/pileup-stats/valgrind.suppress b/test/pileup-stats/valgrind.suppress
new file mode 100644
index 0000000..002d332
--- /dev/null
+++ b/test/pileup-stats/valgrind.suppress
@@ -0,0 +1,6 @@
+{
+ vt_cache
+ Memcheck:Leak
+ fun:calloc
+ fun:_ZN3ngs7Resolve*
+}
diff --git a/test/qual-recalib-stat/Makefile b/test/qual-recalib-stat/Makefile
new file mode 100644
index 0000000..64df55b
--- /dev/null
+++ b/test/qual-recalib-stat/Makefile
@@ -0,0 +1,49 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/qual-recalib-stat
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: check_exit_code
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+
+check_exit_code:
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/qual-recalib-stat
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
diff --git a/test/samline/Makefile b/test/samline/Makefile
new file mode 100644
index 0000000..414b84d
--- /dev/null
+++ b/test/samline/Makefile
@@ -0,0 +1,115 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = test/samline
+
+include $(TOP)/build/Makefile.env
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ samline \
+ sampart
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: vers-includes
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(ALL_TOOLS): vers-includes
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/all: \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# vers-includes
+#
+$(TARGDIR)/vers-includes: $(addsuffix .vers.h,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/vers-includes
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+CMN_LIBS = \
+ -skapp \
+ -sncbi-vdb \
+ -lm
+
+#-------------------------------------------------------------------------------
+# SAMLINE
+#
+SAMLINE_SRC = \
+ refbases \
+ cigar \
+ alig-gen
+
+SAMLINE_OBJ = \
+ $(addsuffix .$(OBJX),$(SAMLINE_SRC))
+
+$(BINDIR)/samline: $(SAMLINE_OBJ)
+ $(LD) --exe --vers $(SRCDIR) -o $@ $^ $(CMN_LIBS)
+
+#-------------------------------------------------------------------------------
+# SAMPART
+#
+SAMPART_SRC = \
+ refbases \
+ cigar \
+ sampart
+
+SAMPART_OBJ = \
+ $(addsuffix .$(OBJX),$(SAMPART_SRC))
+
+$(BINDIR)/sampart: $(SAMPART_OBJ)
+ $(LD) --exe --vers $(SRCDIR) -o $@ $^ $(CMN_LIBS)
diff --git a/test/samline/alig-gen.c b/test/samline/alig-gen.c
new file mode 100644
index 0000000..66845c5
--- /dev/null
+++ b/test/samline/alig-gen.c
@@ -0,0 +1,656 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "samline.vers.h"
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "refbases.h"
+#include "cigar.h"
+
+#define DFLT_REFNAME "NC_011752.1"
+#define DFLT_REFPOS 10000
+#define DFLT_CIGAR "50M"
+#define DFLT_INSBASES "ACGTACGTACGT"
+#define DFLT_MAPQ 20
+#define DFLT_QNAME "1"
+#define DFLT_TLEN 0
+
+static const char * refname_usage[] = { "the ref-seq-id to use 'NC_011752.1'", NULL };
+static const char * refalias_usage[] = { "the alias to be written out like 'c1'", NULL };
+static const char * refpos_usage[] = { "the position on the reference 0-based", NULL };
+static const char * cigar_usage[] = { "the cigar-string to use", NULL };
+static const char * insbases_usage[] = { "what bases to insert ( if needed )", NULL };
+static const char * mapq_usage[] = { "what mapq to use", NULL };
+static const char * reverse_usage[] = { "alignment is reverse", NULL };
+static const char * qname_usage[] = { "query template name", NULL };
+static const char * sec_usage[] = { "secondary alignment", NULL };
+static const char * bad_usage[] = { "did not pass quality control", NULL };
+static const char * dup_usage[] = { "is PCR or optical duplicate", NULL };
+static const char * prop_usage[] = { "each fragment is properly aligned", NULL };
+static const char * first_usage[] = { "fragment is first", NULL };
+static const char * last_usage[] = { "fragment is last", NULL };
+static const char * show_usage[] = { "show details of calculations", NULL };
+static const char * ref_usage[] = { "return only refbases (set cigar to 100M for len=100)", NULL };
+static const char * flags_usage[] = { "decode decimal flags-value", NULL };
+static const char * header_usage[] = { "produce header", NULL };
+static const char * config_usage[] = { "procuce config-file", NULL };
+static const char * mdtag_usage[] = { "procuce md-tag", NULL };
+
+#define OPTION_REFNAME "refname"
+#define OPTION_REFALIAS "refalias"
+#define OPTION_REFPOS "refpos"
+#define OPTION_CIGAR "cigar"
+#define OPTION_INSBASES "insbases"
+#define OPTION_MAPQ "mapq"
+#define OPTION_REVERSE "reverse"
+#define OPTION_QNAME "qname"
+#define OPTION_SEC "secondary"
+#define OPTION_BAD "bad"
+#define OPTION_DUP "duplicate"
+#define OPTION_PROP "proper"
+#define OPTION_FIRST "first"
+#define OPTION_LAST "last"
+#define OPTION_SHOW "show"
+#define OPTION_REF "ref"
+#define OPTION_FLAGS "flags"
+#define OPTION_HEADER "header"
+#define OPTION_CONFIG "config"
+#define OPTION_MDTAG "mdtag"
+
+#define ALIAS_REFNAME "r"
+#define ALIAS_REFALIAS "b"
+#define ALIAS_REFPOS "p"
+#define ALIAS_CIGAR "c"
+#define ALIAS_INSBASES "i"
+#define ALIAS_MAPQ "m"
+#define ALIAS_REVERSE "e"
+#define ALIAS_SEC "2"
+#define ALIAS_BAD "a"
+#define ALIAS_DUP "u"
+#define ALIAS_PROP "o"
+#define ALIAS_SHOW "s"
+#define ALIAS_REF "f"
+#define ALIAS_FLAGS "l"
+#define ALIAS_HEADER "d"
+#define ALIAS_CONFIG "n"
+#define ALIAS_MDTAG "t"
+
+OptDef Options[] =
+{
+ { OPTION_REFNAME, ALIAS_REFNAME, NULL, refname_usage, 2, true, false },
+ { OPTION_REFALIAS, ALIAS_REFALIAS, NULL, refalias_usage, 2, true, false },
+ { OPTION_REFPOS, ALIAS_REFPOS, NULL, refpos_usage, 2, true, false },
+ { OPTION_CIGAR, ALIAS_CIGAR, NULL, cigar_usage, 2, true, false },
+ { OPTION_INSBASES, ALIAS_INSBASES, NULL, insbases_usage, 1, true, false },
+ { OPTION_MAPQ, ALIAS_MAPQ, NULL, mapq_usage, 2, true, false },
+ { OPTION_REVERSE, ALIAS_REVERSE, NULL, reverse_usage, 1, false, false },
+ { OPTION_QNAME, NULL, NULL, qname_usage, 2, true, false },
+ { OPTION_SEC, ALIAS_SEC, NULL, sec_usage, 2, true, false },
+ { OPTION_BAD, ALIAS_BAD, NULL, bad_usage, 2, true, false },
+ { OPTION_DUP, ALIAS_DUP, NULL, dup_usage, 2, true, false },
+ { OPTION_PROP, ALIAS_PROP, NULL, prop_usage, 2, true, false },
+ { OPTION_FIRST, NULL, NULL, first_usage, 2, true, false },
+ { OPTION_LAST, NULL, NULL, last_usage, 2, true, false },
+ { OPTION_SHOW, ALIAS_SHOW, NULL, show_usage, 1, false, false },
+ { OPTION_REF, ALIAS_REF, NULL, ref_usage, 1, false, false },
+ { OPTION_FLAGS, ALIAS_FLAGS, NULL, flags_usage, 1, true, false },
+ { OPTION_HEADER, ALIAS_HEADER, NULL, header_usage, 1, false, false },
+ { OPTION_CONFIG, ALIAS_CONFIG, NULL, config_usage, 1, true, false },
+ { OPTION_MDTAG, ALIAS_MDTAG, NULL, mdtag_usage, 1, false, false }
+};
+
+const char UsageDefaultName[] = "samline";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg( "\nUsage:\n %s [options]\n\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ int i, n_options;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+ KOutMsg ( "Options:\n" );
+
+ n_options = sizeof Options / sizeof Options[ 0 ];
+ for ( i = 0; i < n_options; ++i )
+ {
+ OptDef * o = &Options[ i ];
+ HelpOptionLine( o->aliases, o->name, NULL, o->help );
+ }
+
+ KOutMsg ( "\n" );
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+
+/* Version EXTERN
+ * return 4-part version code: 0xMMmmrrrr, where
+ * MM = major release
+ * mm = minor release
+ * rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+ return SAMLINE_VERS;
+}
+
+
+static const char * get_str_option( const Args * args, const char * name, uint32_t idx, const char * dflt )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( ( rc == 0 )&&( count > idx ) )
+ {
+ const char * res = NULL;
+ ArgsOptionValue( args, name, idx, (const void **)&res );
+ return res;
+ }
+ else
+ return dflt;
+}
+
+
+static uint32_t get_uint32_option( const Args * args, const char * name, uint32_t idx, const uint32_t dflt )
+{
+ const char * s = get_str_option( args, name, idx, NULL );
+ if ( s == NULL )
+ return dflt;
+ return atoi( s );
+}
+
+static uint32_t get_bool_option( const Args * args, const char * name )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ return ( rc == 0 && count > 0 );
+}
+
+typedef struct alignment
+{
+ const char * qname;
+ const char * refname;
+ const char * refalias;
+ const char * cigar_str;
+ const char * refbases;
+ char read[ 4096 ];
+ char sam[ 4096 ];
+
+ int reverse, secondary, bad, dup, prop, first, last;
+
+ uint32_t refpos, mapq, bases_in_ref, reflen;
+
+ struct cigar_t * cigar;
+} alignment;
+
+typedef struct gen_context
+{
+ const char * insbases;
+ const char * config;
+ uint32_t flags, header;
+ int32_t tlen;
+
+ alignment alig[ 2 ];
+} gen_context;
+
+
+static rc_t CC write_to_FILE ( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+
+static size_t random_string( char * buffer, size_t buflen, const char * char_set, size_t length )
+{
+ size_t res = 0;
+ if ( buffer != NULL && buflen > 0 )
+ {
+ const char dflt_charset[] = "0123456789"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const char * cs = ( char_set == NULL ) ? dflt_charset : char_set;
+ size_t charset_len = strlen( cs ) - 1;
+ while ( res < length && res < ( buflen - 1 ) )
+ {
+ size_t rand_idx = ( double ) rand() / RAND_MAX * charset_len;
+ buffer[ res++ ] = cs[ rand_idx ];
+ }
+ buffer[ res ] = 0;
+ }
+ return res;
+}
+
+
+static size_t random_quality( char * buffer, size_t buflen, size_t length )
+{
+ const char qualities[] = "!\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~";
+ return random_string( buffer, buflen, qualities, length );
+}
+
+static uint32_t sam_flags( const alignment * alig, const alignment * other, int first, int last )
+{
+ uint32_t res = 0;
+ if ( first || last ) res |= 0x01; /* multiple fragments */
+ if ( alig->prop != 0 ) res |= 0x02; /* each fragment properly aligned */
+ if ( alig->refpos == 0 ) res |= 0x04; /* this fragment is unmapped */
+ if ( other != NULL && other->refpos == 0 ) res |= 0x08; /* next fragment is unmapped */
+ if ( alig->reverse ) res |= 0x10; /* this fragment is reversed */
+ if ( other != NULL && other->reverse ) res |= 0x20; /* next fragment is reversed */
+ if ( first ) res |= 0x40; /* this is the first fragment */
+ if ( last ) res |= 0x80; /* this is the last fragment */
+ if ( alig->secondary != 0 ) res |= 0x100; /* this is a secondary alignment */
+ if ( alig->bad != 0 ) res |= 0x200; /* this is did not pass quality controls */
+ if ( alig->dup != 0 ) res |= 0x400; /* this is PCR or optical duplicate */
+ return res;
+}
+
+
+static size_t produce_sam( char * buffer, size_t buflen,
+ const gen_context * gctx, const alignment * alig, const alignment * other )
+{
+ size_t res = 0;
+ if ( buffer != NULL ) buffer[ 0 ] = 0;
+
+ if ( buffer != NULL && gctx != NULL && alig != NULL )
+ {
+ char merged_cigar_str[ 4096 ];
+ char quality[ 4096 ];
+ int first = 0;
+ int last = 0;
+ const char * r_next = "*";
+ uint32_t r_pos = 0;
+ struct cigar_t * merged_cigar = merge_cigar_t( alig->cigar );
+
+ random_quality( quality, sizeof quality, cigar_t_readlen( merged_cigar ) ) ;
+ cigar_t_string( merged_cigar_str, sizeof merged_cigar_str, merged_cigar );
+
+ if ( other != NULL && other->refname != NULL && other->refpos != 0 )
+ {
+ r_next = other->refalias == NULL ? other->refname : other->refalias;
+ first = ( alig->refpos < other->refpos );
+ last = !first;
+ r_pos = other->refpos;
+ }
+ else
+ {
+ first = alig->first;
+ last = alig->last;
+ }
+
+ string_printf ( buffer, buflen, &res,
+ "%s\t%d\t%s\t%d\t%d\t%s\t%s\t%d\t%d\t%s\t%s",
+ alig->qname,
+ sam_flags( alig, other, first, last ),
+ alig->refalias == NULL ? alig->refname : alig->refalias,
+ alig->refpos,
+ alig->mapq,
+ merged_cigar_str,
+ r_next,
+ r_pos,
+ gctx->tlen,
+ alig->read,
+ quality );
+
+ free_cigar_t( merged_cigar );
+ }
+ return res;
+}
+
+static void show_alig_details( const alignment * alig )
+{
+ KOutMsg ( "QNAME : %s\n", alig->qname );
+ KOutMsg ( "REFNAME : %s\n", alig->refname );
+ KOutMsg ( "REFALIAS : %s\n", alig->refalias == NULL ? "n/a" : alig->refalias );
+ KOutMsg ( "REFPOS : %d\n", alig->refpos );
+ KOutMsg ( "CIGAR : %s\n", alig->cigar_str );
+ KOutMsg ( "MAPQ : %d\n", alig->mapq );
+ KOutMsg ( "REVERSE : %s\n", alig->reverse ? "YES" : "NO" );
+ KOutMsg ( "SECONDARY: %s\n", alig->secondary ? "YES" : "NO" );
+ KOutMsg ( "BAD : %s\n", alig->bad ? "YES" : "NO" );
+ KOutMsg ( "DUPLICATE: %s\n", alig->dup ? "YES" : "NO" );
+ KOutMsg ( "PROPERLY : %s\n", alig->prop ? "YES" : "NO" );
+ KOutMsg ( "FIRST : %s\n", alig->first ? "YES" : "NO" );
+ KOutMsg ( "LAST : %s\n", alig->last ? "YES" : "NO" );
+ KOutMsg ( "REFLEN : %d\n", alig->reflen );
+ KOutMsg ( "READLEN : %d\n", cigar_t_readlen( alig->cigar ) );
+ KOutMsg ( "INSLEN : %d\n", cigar_t_inslen( alig->cigar ) );
+ KOutMsg ( "REFBASES : %s\n", alig->refbases );
+ KOutMsg ( "READ : %s\n", alig->read );
+ KOutMsg ( "SAM : %s\n", alig->sam );
+
+}
+
+static void show_details( const gen_context * gctx )
+{
+ KOutMsg ( "INSBASES : %s\n", gctx->insbases );
+ KOutMsg ( "TLEN : %d\n", gctx->tlen );
+ KOutMsg ( "CONFIG : %s\n", gctx->config );
+ if ( gctx->tlen != 0 )
+ {
+ KOutMsg ( "----- ALIGNMENT #1 -----\n" );
+ show_alig_details( &gctx->alig[ 0 ] );
+ KOutMsg ( "----- ALIGNMENT #2 -----\n" );
+ show_alig_details( &gctx->alig[ 1 ] );
+ }
+ else
+ show_alig_details( &gctx->alig[ 0 ] );
+}
+
+
+static void show_mdtag( const gen_context * gctx )
+{
+ struct cigar_t * cigar;
+
+ KOutMsg ( "calculating MD-TAG:\n" );
+ KOutMsg ( "READ : %s\n", gctx->alig[0].read );
+ KOutMsg ( "REFBASES : %s\n", gctx->alig[0].refbases );
+
+ cigar = make_cigar_t( gctx->alig[0].cigar_str );
+ if ( cigar != NULL )
+ {
+ struct cigar_t *merged_cigar = merge_cigar_t( cigar );
+ if ( merged_cigar != NULL )
+ {
+ char merged_cigar_str[ 4096 ];
+ char the_tag[ 4096 ];
+
+ cigar_t_string( merged_cigar_str, sizeof merged_cigar_str, merged_cigar );
+ md_tag( the_tag, sizeof the_tag, merged_cigar, gctx->alig[0].read, gctx->alig[0].refbases );
+
+ KOutMsg ( "CIGAR : %s\n", merged_cigar_str );
+ KOutMsg ( "MD-TAG : %s\n", the_tag );
+
+ free_cigar_t( merged_cigar );
+ }
+ free_cigar_t( cigar );
+ }
+}
+
+static void explain_flags( const uint32_t flags )
+{
+ if ( ( flags & 0x01 ) == 0x01 )
+ KOutMsg ( "0x001 ... multiple fragments\n" );
+ if ( ( flags & 0x02 ) == 0x02 )
+ KOutMsg ( "0x002 ... each fragment properly aligned\n" );
+ if ( ( flags & 0x04 ) == 0x04 )
+ KOutMsg ( "0x004 ... this fragment is unmapped\n" );
+ if ( ( flags & 0x08 ) == 0x08 )
+ KOutMsg ( "0x008 ... next fragment is unmapped\n" );
+ if ( ( flags & 0x10 ) == 0x10 )
+ KOutMsg ( "0x010 ... this fragment is reversed\n" );
+ if ( ( flags & 0x20 ) == 0x20 )
+ KOutMsg ( "0x020 ... next fragment is reversed\n" );
+ if ( ( flags & 0x40 ) == 0x40 )
+ KOutMsg ( "0x040 ... this is the first fragment\n" );
+ if ( ( flags & 0x80 ) == 0x80 )
+ KOutMsg ( "0x080 ... this is the last fragment\n" );
+ if ( ( flags & 0x100 ) == 0x100 )
+ KOutMsg ( "0x100 ... this is a secondary alignment\n" );
+ if ( ( flags & 0x200 ) == 0x200 )
+ KOutMsg ( "0x200 ... this is did not pass quality controls\n" );
+ if ( ( flags & 0x400 ) == 0x400 )
+ KOutMsg ( "0x400 ... this is PCR or optical duplicate\n" );
+}
+
+
+static size_t write_config_line( KFile * dst, size_t at, const char * alias, const char * canonical )
+{
+ size_t num_in_buffer, res = 0;
+ char buffer[ 4096 ];
+ rc_t rc = string_printf ( buffer, sizeof buffer, &num_in_buffer, "%s\t%s\n", alias, canonical );
+ if ( rc == 0 )
+ {
+ size_t written_to_file;
+ rc = KFileWriteAll ( dst, at, buffer, num_in_buffer, &written_to_file );
+ if ( rc == 0 )
+ res = at + written_to_file;
+ }
+ return res;
+}
+
+
+static void write_config_file( const char * filename, const alignment * alig0, const alignment * alig1 )
+{
+ KDirectory *dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc == 0 )
+ {
+ KFile * dst;
+ rc = KDirectoryCreateFile ( dir, &dst, false, 0664, kcmInit, filename );
+ if ( rc == 0 )
+ {
+ size_t pos = 0;
+ const char * alias0 = NULL;
+ const char * alias1 = NULL;
+ const char * canonical0 = NULL;
+ const char * canonical1 = NULL;
+
+ if ( alig0 != 0 )
+ {
+ canonical0 = alig0->refname == NULL ? DFLT_REFNAME : alig0->refname;
+ alias0 = alig0->refalias == NULL ? canonical0 : alig0->refalias;
+ }
+
+ if ( alig1 != 0 )
+ {
+ canonical1 = alig1->refname == NULL ? DFLT_REFNAME : alig1->refname;
+ alias1 = alig1->refalias == NULL ? canonical1 : alig1->refalias;
+ }
+
+ pos = write_config_line( dst, pos, alias0, canonical0 );
+ if ( ( strcmp( alias0, alias1 ) != 0 ) )
+ write_config_line( dst, pos, alias1, canonical1 );
+
+ KFileRelease( dst );
+ }
+ KDirectoryRelease( dir );
+ }
+}
+
+
+static void generate_alignment( const gen_context * gctx )
+{
+ /* write reference names into config-file for bam-load */
+ if ( gctx->config != NULL )
+ write_config_file( gctx->config, &gctx->alig[ 0 ], &gctx->alig[ 1 ] );
+
+ /* procude SAM-header on stdout */
+ if ( gctx->header )
+ {
+ const char * refname0 = gctx->alig[ 0 ].refalias;
+ const char * refname1 = gctx->alig[ 1 ].refalias;
+ int bases_in_ref0 = gctx->alig[ 0 ].bases_in_ref;
+
+ if ( refname0 == NULL ) refname0 = gctx->alig[ 0 ].refname;
+ if ( refname1 == NULL ) refname1 = gctx->alig[ 1 ].refname;
+
+ KOutMsg( "@HD\tVN:1.3\n" );
+ KOutMsg( "@SQ\tSN:%s\tAS:%s\tLN:%d\n", refname0, refname0, bases_in_ref0 );
+ if ( refname1 != NULL && ( strcmp( refname0, refname1 ) != 0 ) )
+ {
+ int bases_in_ref1 = gctx->alig[ 1 ].bases_in_ref;
+ KOutMsg( "@SQ\tSN:%s\tAS:%s\tLN:%d\n", refname1, refname1, bases_in_ref1 );
+ }
+ }
+
+ /* produces SAM-line for 1st alignment */
+ KOutMsg( "%s\n", gctx->alig[ 0 ].sam );
+
+ /* produces SAM-line for 2nd alignment ( mate ) */
+ if ( gctx->tlen != 0 )
+ KOutMsg( "%s\n", gctx->alig[ 1 ].sam );
+}
+
+
+static void read_alig_context( Args * args, alignment * alig, uint32_t idx )
+{
+ alig->qname = get_str_option( args, OPTION_QNAME, idx, idx == 0 ? "1" : "2" );
+ alig->refname = get_str_option( args, OPTION_REFNAME, idx, idx == 0 ? DFLT_REFNAME : NULL );
+ alig->refalias = get_str_option( args, OPTION_REFALIAS, idx, NULL );
+ alig->refpos = get_uint32_option( args, OPTION_REFPOS, idx, idx == 0 ? DFLT_REFPOS : 0 );
+ alig->cigar_str = get_str_option( args, OPTION_CIGAR, idx, DFLT_CIGAR );
+ alig->mapq = get_uint32_option( args, OPTION_MAPQ, idx, DFLT_MAPQ );
+
+ alig->reverse = get_uint32_option( args, OPTION_REVERSE, idx, 0 );
+ alig->secondary = get_uint32_option( args, OPTION_SEC, idx, 0 );
+ alig->bad = get_uint32_option( args, OPTION_BAD, idx, 0 );
+ alig->dup = get_uint32_option( args, OPTION_DUP, idx, 0 );
+ alig->prop = get_uint32_option( args, OPTION_PROP, idx, 0 );
+ alig->first = get_uint32_option( args, OPTION_FIRST, idx, 0 );
+ alig->last = get_uint32_option( args, OPTION_LAST, idx, 0 );
+
+ /* precalculate values need in all functions */
+ alig->cigar = make_cigar_t( alig->cigar_str );
+ alig->reflen = cigar_t_reflen( alig->cigar );
+}
+
+static void release_alig( alignment * alig )
+{
+ if ( alig->refbases != NULL ) free( ( void* ) alig->refbases );
+ free_cigar_t( alig->cigar );
+}
+
+static void read_context( Args * args, gen_context * gctx )
+{
+ alignment *alig0, *alig1;
+
+ gctx->insbases = get_str_option( args, OPTION_INSBASES, 0, DFLT_INSBASES );
+ gctx->flags = get_uint32_option( args, OPTION_FLAGS, 0, 0 );
+ gctx->header = get_bool_option( args, OPTION_HEADER );
+ gctx->config = get_str_option( args, OPTION_CONFIG, 0, NULL );
+ gctx->tlen = 0;
+
+ read_alig_context( args, &gctx->alig[ 0 ], 0 );
+ read_alig_context( args, &gctx->alig[ 1 ], 1 );
+
+ alig0 = &gctx->alig[ 0 ];
+ alig1 = &gctx->alig[ 1 ];
+
+ if ( gctx->alig[ 1 ].refpos > 0 )
+ {
+ if ( gctx->alig[ 1 ].refname == NULL )
+ gctx->alig[ 1 ].refname = gctx->alig[ 0 ].refname;
+ if ( gctx->alig[ 1 ].refalias == NULL )
+ gctx->alig[ 1 ].refalias = gctx->alig[ 0 ].refalias;
+
+ uint32_t end = alig1->refpos + alig1->reflen;
+ gctx->tlen = ( end - alig0->refpos );
+
+ alig0->refbases = read_refbases( alig0->refname, alig0->refpos, alig0->reflen, &alig0->bases_in_ref );
+ alig1->refbases = read_refbases( alig1->refname, alig1->refpos, alig1->reflen, &alig1->bases_in_ref );
+
+ cigar_t_2_read( alig0->read, sizeof alig0->read, alig0->cigar, alig0->refbases, gctx->insbases );
+ cigar_t_2_read( alig1->read, sizeof alig1->read, alig1->cigar, alig1->refbases, gctx->insbases );
+
+ produce_sam( alig0->sam, sizeof alig0->sam, gctx, alig0, alig1 );
+ produce_sam( alig1->sam, sizeof alig1->sam, gctx, alig1, alig0 );
+ }
+ else
+ {
+ alig0->refbases = read_refbases( alig0->refname, alig0->refpos, alig0->reflen, &alig0->bases_in_ref );
+ alig1->refbases = NULL;
+ alig1->bases_in_ref = 0;
+
+ cigar_t_2_read( alig0->read, sizeof alig0->read, alig0->cigar, alig0->refbases, gctx->insbases );
+ alig1->read[ 0 ] = 0;
+
+ produce_sam( alig0->sam, sizeof alig0->sam, gctx, alig0, alig1 );
+ alig1->sam[ 0 ] = 0;
+ }
+}
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ rc_t rc = KOutHandlerSet ( write_to_FILE, stdout );
+ if ( rc == 0 )
+ {
+ Args * args;
+
+ int n_options = sizeof Options / sizeof Options[ 0 ];
+ rc = ArgsMakeAndHandle( &args, argc, argv, 1, Options, n_options );
+ if ( rc == 0 )
+ {
+ gen_context gctx;
+
+ read_context( args, &gctx );
+
+ if ( get_bool_option( args, OPTION_SHOW ) )
+ show_details( &gctx );
+ else if ( get_bool_option( args, OPTION_REF ) )
+ KOutMsg ( "%s\n", gctx.alig[ 0 ].refbases );
+ else if ( get_bool_option( args, OPTION_MDTAG ) )
+ show_mdtag( &gctx );
+ else if ( gctx.flags > 0 )
+ explain_flags( gctx.flags );
+ else
+ generate_alignment( &gctx );
+
+ release_alig( &gctx.alig[ 0 ] );
+ if ( gctx.tlen != 0 )
+ release_alig( &gctx.alig[ 1 ] );
+
+ ArgsWhack( args );
+ }
+ }
+ return rc;
+}
+
diff --git a/test/samline/bx_tag_test.py b/test/samline/bx_tag_test.py
new file mode 100755
index 0000000..3448d52
--- /dev/null
+++ b/test/samline/bx_tag_test.py
@@ -0,0 +1,27 @@
+#!/opt/python-all/bin/python
+from sam import *
+
+REF = "NC_011752.1"
+ALIAS = "c1"
+CSRA1 = "X.CSRA"
+
+def load( L ) :
+ R1 = bam_load( L, CSRA1, "--make-spots-with-secondary -E0 -Q0" )
+ print "bam-load = %d"%( R1 )
+
+def load_and_print( L ) :
+ load( L )
+ sam_dump( CSRA1 )
+
+
+def test1() :
+ A1 = make_prim( "A1", 0, REF, ALIAS, 17000, 20, "60M" )
+ A2 = make_prim( "A2", 0, REF, ALIAS, 12500, 20, "50M" )
+ A1.pair_with( A2 )
+
+ A1.set_tags( "BX:Z:i_am_a_BX_tag" )
+
+ load_and_print( [ A1, A2 ] )
+
+
+test1()
diff --git a/test/samline/ca_test.py b/test/samline/ca_test.py
new file mode 100755
index 0000000..c8e30e3
--- /dev/null
+++ b/test/samline/ca_test.py
@@ -0,0 +1,80 @@
+#!/opt/python-all/bin/python
+from sam import *
+
+def dump( acc ) :
+ print "%s.SEQ"%(acc)
+ vdb_dump( acc, "-C SPOT_ID,READ -l0 -f tab" )
+ print "%s.PRIM"%( acc )
+ vdb_dump( acc, "-T PRIMARY_ALIGNMENT -C ALIGN_ID,READ -l0, -f tab" )
+ print "%s.SEC"%( acc )
+ vdb_dump( acc, "-T SECONDARY_ALIGNMENT -C ALIGN_ID,READ -l0 -f tab" )
+
+REF = "NC_011752.1"
+ALIAS = "c1"
+CSRA1 = "AFTER_BAM_LOAD.CSRA"
+CSRA2 = "AFTER_SRA_SORT.CSRA"
+
+def load_sort( L ) :
+ R1 = bam_load( L, CSRA1, "--make-spots-with-secondary -L 3 -E0 -Q0" )
+ if R1 == 1 :
+ print "bam-load = OK"
+ R2 = sra_sort( CSRA1, CSRA2 )
+ if R2 == 1 :
+ print "sra-sort = OK"
+ else :
+ print "sra-sort = FAILED"
+ else :
+ print "bam-load = FAILED"
+
+def load_sort_print( L ) :
+ load_sort( L )
+ dump( CSRA1 )
+ dump( CSRA2 )
+
+
+def test1() :
+ print "test #1 --------------------------------------------------"
+ print "...having a single recondary alignmnet without a primary it belongs to"
+ A1 = make_prim( "A1", 0, REF, ALIAS, 17000, 20, "60M" )
+ A2 = make_prim( "A2", 0, REF, ALIAS, 12500, 20, "50M" )
+ A1.pair_with( A2 )
+
+ A3 = make_prim( "A3", 0, REF, ALIAS, 33000, 20, "60M" )
+ U1 = make_unaligned( "U1", 0, "ACTTTAGTAAGGGGTTNN" )
+
+ A4 = make_sec( "A4", 0, REF, ALIAS, 19000, 20, "60M" )
+ A4.link_to( A1 )
+
+ A5 = make_sec( "A5", 0, REF, ALIAS, 22000, 20, "30M" )
+
+ load_sort_print( [ A1, A2, A3, A4, U1, A5 ] )
+
+# the resulting X.CSRA and S.CSRA produce errors in seq_restore_read_impl2
+def test2() :
+ print "test #2 --------------------------------------------------"
+ print "...having a pair of a prim. and a sec. alignment"
+ print "= SEQUENCE-table cannot reconstruct READ"
+ A1 = make_prim( "A1", 0, REF, ALIAS, 17000, 20, "60M" )
+ A2 = make_sec( "A2", 0, REF, ALIAS, 12500, 20, "50M" )
+ A1.pair_with( A2 )
+
+ load_sort_print( [ A1, A2 ] )
+
+# the resulting X.CSRA produces errors in seq_restore_read_impl2
+# but S.CSRA sefaults in vdb-dump!
+def test3() :
+ print "test #3 --------------------------------------------------"
+ A1 = make_prim( "A1", 0, REF, ALIAS, 1000, 20, "53M" )
+ A2 = make_sec( "A2", 0, REF, ALIAS, 3500, 20, "50M" )
+ A1.pair_with( A2 )
+
+ A3 = make_sec( "A3", 0, REF, ALIAS, 6800, 20, "55M" )
+ A3.flags |= FLAG_NEXT_UNMAPPED
+
+ load_sort_print( [ A3, A1, A2 ] )
+
+
+test1()
+test2()
+test3()
+
diff --git a/test/samline/cigar.c b/test/samline/cigar.c
new file mode 100644
index 0000000..6193699
--- /dev/null
+++ b/test/samline/cigar.c
@@ -0,0 +1,446 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/printf.h>
+#include <klib/out.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "cigar.h"
+
+struct cigar_t
+{
+ char * op;
+ int * count;
+ size_t size, length;
+};
+
+
+static void init_cigar_t( struct cigar_t * c, size_t size )
+{
+ if ( c != NULL )
+ {
+ c->size = 0;
+ c->length = 0;
+ c->op = malloc( sizeof( c->op[ 0 ] ) * size );
+ if ( c->op != NULL )
+ {
+ c->count = malloc( sizeof( c->count[ 0 ] ) * size );
+ if ( c->count != NULL )
+ c->size = size;
+ else
+ free( ( void * ) c->op );
+ }
+ }
+}
+
+
+static void resize_cigar_t( struct cigar_t * c, size_t new_size )
+{
+ if ( c != NULL )
+ {
+ if ( c->size == 0 )
+ init_cigar_t( c, new_size );
+ else if ( c->size < new_size )
+ {
+ char * temp_op = c->op;
+ c->op = realloc( c->op, sizeof( c->op[ 0 ] ) * new_size );
+ if ( c->op != NULL )
+ {
+ int * temp_count = c->count;
+ c->count = realloc( c->count, sizeof( c->count[ 0 ] ) * new_size );
+ if ( c->count != NULL )
+ c->size = new_size;
+ else
+ c->count = temp_count;
+ }
+ else
+ c->op = temp_op;
+ }
+ }
+}
+
+static void append_to_cigar_t( struct cigar_t * c, char op, int count )
+{
+ if ( c->length < c->size )
+ {
+ c->op[ c->length ] = op;
+ c->count[ c->length ++ ] = count;
+ }
+}
+
+void parse_cigar_t( struct cigar_t * c, const char * cigar_str )
+{
+ if ( c != NULL && cigar_str != NULL && cigar_str[ 0 ] != 0 )
+ {
+ resize_cigar_t( c, strlen( cigar_str ) );
+ if ( c->size > 0 )
+ {
+ int count = 0;
+ while ( *cigar_str != 0 && c->length < c->size )
+ {
+ if ( isdigit( *cigar_str ) )
+ {
+ count = ( count * 10 ) + ( *cigar_str - '0' );
+ }
+ else
+ {
+ if ( count == 0 ) count = 1;
+ append_to_cigar_t( c, *cigar_str, count );
+ count = 0;
+ }
+ cigar_str++;
+ }
+ }
+ }
+}
+
+
+struct cigar_t * make_cigar_t( const char * cigar_str )
+{
+ struct cigar_t * res = malloc( sizeof * res );
+ if ( res != NULL )
+ {
+ size_t size;
+ if ( cigar_str != NULL && cigar_str[ 0 ] != 0 )
+ size = strlen( cigar_str );
+ else
+ size = 1024;
+ init_cigar_t( res, size );
+ if ( res->size == size )
+ parse_cigar_t( res, cigar_str );
+ }
+ return res;
+}
+
+
+void free_cigar_t( struct cigar_t * c )
+{
+ if ( c != NULL )
+ {
+ if ( c->op != NULL )
+ {
+ free( ( void * ) c->op );
+ c->op = NULL;
+ }
+ if ( c->count != NULL )
+ {
+ free( ( void * ) c->count );
+ c->count = NULL;
+ }
+ free( ( void * ) c );
+ }
+}
+
+
+int cigar_t_reflen( const struct cigar_t * c )
+{
+ int res = 0;
+ if ( c != NULL )
+ {
+ int i;
+ for ( i = 0; i < c->length; ++i )
+ {
+ switch( c->op[ i ] )
+ {
+ case 'A' : res += c->count[ i ]; break;
+ case 'C' : res += c->count[ i ]; break;
+ case 'G' : res += c->count[ i ]; break;
+ case 'T' : res += c->count[ i ]; break;
+
+ case 'D' : res += c->count[ i ]; break;
+ case 'M' : res += c->count[ i ]; break;
+ }
+ }
+ }
+ return res;
+}
+
+
+int cigar_t_readlen( const struct cigar_t * c )
+{
+ int res = 0;
+ if ( c != NULL )
+ {
+ int i;
+ for ( i = 0; i < c->length; ++i )
+ {
+ if ( c->op[ i ] != 'D' )
+ res += c->count[ i ];
+ }
+ }
+ return res;
+}
+
+
+int cigar_t_inslen( const struct cigar_t * c )
+{
+ int res = 0;
+ if ( c != NULL )
+ {
+ int i;
+ for ( i = 0; i < c->length; ++i )
+ {
+ if ( c->op[ i ] == 'I' )
+ res += c->count[ i ];
+ }
+ }
+ return res;
+}
+
+
+size_t cigar_t_string( char * buffer, size_t buf_len, const struct cigar_t * c )
+{
+ size_t res = 0;
+ if ( buffer != NULL && buf_len > 0 && c != NULL && c->length > 0 )
+ {
+ int i;
+ for ( i = 0; i < c->length && res < buf_len; ++i )
+ {
+ size_t num_writ;
+ string_printf( &buffer[ res ], buf_len - res, &num_writ,
+ "%d%c", c->count[ i ], c->op[ i ] );
+ res += num_writ;
+ }
+ if ( res < buf_len )
+ buffer[ res ] = 0;
+ }
+ return res;
+}
+
+
+void debug_cigar_t( const struct cigar_t * c )
+{
+ if ( c != NULL )
+ {
+ int i;
+ for ( i = 0; i < c->length; ++i )
+ KOutMsg( "c[%d]: %d x %c\n", i, c->count[ i ], c->op[ i ] );
+ }
+}
+
+static int can_merge( char op1, char op2 )
+{
+ char mop1 = op1;
+ char mop2 = op2;
+ if ( mop1 == 'A' || mop1 == 'C' || mop1 == 'G' || mop1 == 'T' )
+ mop1 = 'M';
+ if ( mop2 == 'A' || mop2 == 'C' || mop2 == 'G' || mop2 == 'T' )
+ mop2 = 'M';
+ return ( mop1 == mop2 );
+}
+
+
+struct cigar_t * merge_cigar_t( const struct cigar_t * c )
+{
+ struct cigar_t * res = NULL;
+ if ( c != NULL && c -> length > 0 )
+ {
+ res = malloc( sizeof * res );
+ if ( res != NULL )
+ {
+ init_cigar_t( res, c->size );
+ if ( res->size == c->size )
+ {
+ int i, last;
+ append_to_cigar_t( res, c->op[ 0 ], c->count[ 0 ] );
+ for ( i = 1; i < c->length; ++i )
+ {
+ last = res->length - 1;
+ if ( can_merge( c->op[ i ], res->op[ last ] ) )
+ {
+ res->count[ last ] += c->count[ i ];
+ res->op[ last ] = 'M';
+ }
+ else
+ append_to_cigar_t( res, c->op[ i ], c->count[ i ] );
+ }
+ }
+ }
+ }
+ return res;
+}
+
+
+static void append_base( char * buffer, size_t buf_len, size_t * buf_idx, int count, char c )
+{
+ int i;
+ for ( i = 0; i < count && *buf_idx < buf_len; ++i )
+ buffer[ (*buf_idx)++ ] = c;
+}
+
+static void append_bases( char * buffer, size_t buf_len, size_t * buf_idx, int count,
+ const char * src, int src_len, int *src_idx )
+{
+ int i;
+ for ( i = 0; i < count && *buf_idx < buf_len && *src_idx < src_len; ++i )
+ buffer[ (*buf_idx)++ ] = src[ (*src_idx)++ ];
+}
+
+
+size_t cigar_t_2_read( char * buffer, size_t buf_len,
+ const struct cigar_t * c, const char * ref_bases, const char * ins_bases )
+{
+ size_t res = 0;
+ if ( buffer != NULL && buf_len > 0 && c != NULL )
+ {
+ int readlen = cigar_t_readlen( c );
+ if ( readlen > 0 )
+ {
+ int needed_ref_bases = cigar_t_reflen( c );
+ int available_ref_bases = ref_bases != NULL ? strlen( ref_bases ) : 0;
+ if ( available_ref_bases >= needed_ref_bases )
+ {
+ int needed_ins_bases = cigar_t_inslen( c );
+ int available_ins_bases = ins_bases != NULL ? strlen( ins_bases ) : 0;
+ if ( available_ins_bases >= needed_ins_bases )
+ {
+ int ref_idx = 0;
+ int ins_idx = 0;
+ int cigar_idx;
+ for ( cigar_idx = 0; cigar_idx < c->length; ++cigar_idx )
+ {
+ int count = c->count[ cigar_idx ];
+ switch ( c->op[ cigar_idx ] )
+ {
+ case 'A' : append_base( buffer, buf_len, &res, count, 'A' );
+ ref_idx += count;
+ break;
+
+ case 'C' : append_base( buffer, buf_len, &res, count, 'C' );
+ ref_idx += count;
+ break;
+
+ case 'G' : append_base( buffer, buf_len, &res, count, 'G' );
+ ref_idx += count;
+ break;
+
+ case 'T' : append_base( buffer, buf_len, &res, count, 'T' );
+ ref_idx += count;
+ break;
+
+ case 'D' : ref_idx += count;
+ break;
+
+ case 'I' : append_bases( buffer, buf_len, &res, count,
+ ins_bases, available_ins_bases, &ins_idx );
+ break;
+
+ case 'M' : append_bases( buffer, buf_len, &res, count,
+ ref_bases, available_ref_bases, &ref_idx );
+ break;
+ }
+ }
+ if ( res < buf_len )
+ buffer[ res ] = 0;
+ }
+ }
+ }
+ }
+ return res;
+}
+
+
+static void print_matchcount( char * buffer, size_t buf_len, size_t *buf_idx, int *match_count )
+{
+ size_t num_writ;
+ string_printf( &buffer[ *buf_idx ], buf_len - *buf_idx, &num_writ, "%d", *match_count );
+ *match_count = 0;
+ *buf_idx += num_writ;
+}
+
+static void md_delete( char * buffer, size_t buf_len, size_t *buf_idx, int count, int *match_count,
+ const char * reference, int *ref_idx )
+{
+ if ( *match_count > 0 )
+ print_matchcount( buffer, buf_len, buf_idx, match_count );
+
+ if ( *buf_idx + count + 1 < buf_len )
+ {
+ int i;
+ buffer[ (*buf_idx)++ ] = '^';
+ for ( i = 0; i < count; ++i )
+ buffer[ (*buf_idx)++ ] = reference[ (*ref_idx)++ ];
+ }
+}
+
+static void md_match( char * buffer, size_t buf_len, size_t *buf_idx, int count, int *match_count,
+ const char * read, int *read_idx, const char *reference, int *ref_idx )
+{
+ int i;
+ for ( i = 0; i < count; ++i )
+ {
+ if ( read[ (*read_idx)++ ] == reference[ *ref_idx ] )
+ {
+ (*match_count)++;
+ }
+ else
+ {
+ print_matchcount( buffer, buf_len, buf_idx, match_count );
+ if ( *buf_idx < buf_len )
+ buffer[ (*buf_idx)++ ] = reference[ *ref_idx ];
+ }
+ (*ref_idx)++;
+ }
+}
+
+size_t md_tag( char * buffer, size_t buf_len,
+ const struct cigar_t * c, const char * read, const char * reference )
+{
+ size_t res = 0;
+ if ( buffer != NULL && buf_len > 0 && c != NULL )
+ {
+ int read_idx = 0;
+ int ref_idx = 0;
+ int match_count = 0;
+ int cigar_idx;
+ for ( cigar_idx = 0; cigar_idx < c->length; ++cigar_idx )
+ {
+ int count = c->count[ cigar_idx ];
+ switch ( c->op[ cigar_idx ] )
+ {
+ case 'D' : md_delete( buffer, buf_len, &res, count, &match_count,
+ reference, &ref_idx );
+ break;
+
+ case 'I' : read_idx += count; break;
+
+ case 'M' : md_match( buffer, buf_len, &res, count, &match_count,
+ read, &read_idx, reference, &ref_idx );
+ break;
+ }
+ }
+ if ( match_count > 0 )
+ print_matchcount( buffer, buf_len, &res, &match_count );
+
+ if ( res < buf_len )
+ buffer[ res ] = 0;
+ }
+ return res;
+}
diff --git a/test/samline/cigar.h b/test/samline/cigar.h
new file mode 100644
index 0000000..75bb6a8
--- /dev/null
+++ b/test/samline/cigar.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cigar_
+#define _h_cigar_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct cigar_t;
+
+struct cigar_t * make_cigar_t( const char * cigar_str );
+void free_cigar_t( struct cigar_t * c );
+
+int cigar_t_reflen( const struct cigar_t * c );
+int cigar_t_readlen( const struct cigar_t * c );
+int cigar_t_inslen( const struct cigar_t * c );
+
+size_t cigar_t_string( char * buffer, size_t buf_len, const struct cigar_t * c );
+
+struct cigar_t * merge_cigar_t( const struct cigar_t * c );
+
+size_t md_tag( char * buffer, size_t buf_len,
+ const struct cigar_t * c, const char * read, const char * reference );
+
+void debug_cigar_t( const struct cigar_t * c );
+
+size_t cigar_t_2_read( char * buffer, size_t buf_len,
+ const struct cigar_t * c, const char * ref_bases, const char * ins_bases );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/test/samline/example.sh b/test/samline/example.sh
new file mode 100755
index 0000000..4c385f3
--- /dev/null
+++ b/test/samline/example.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+execute()
+{
+ echo "------------------------------------------------------"
+ echo $1
+ eval $1
+ echo "."
+}
+
+# call: produce_SAM "$CONFIG" "$SAMFILE"
+produce_SAM()
+{
+ SAMLINE_BINARY="samline"
+ REFNAME="NC_011752.1"
+ REFPOS1=1000
+ REFPOS2=3500
+ CIGAR1="30MAAA20M"
+ CIGAR2="50M2D10M"
+ execute "$SAMLINE_BINARY -r $REFNAME -p $REFPOS1 -p $REFPOS2 -c $CIGAR1 -c $CIGAR2 -n $1 -d > $2"
+}
+
+# call: convert_SAM_to_BAM "$SAMFILE" "$BAMFILE"
+convert_SAM_to_BAM()
+{
+ SAMTOOLS_BINARY="/netopt/ncbi_tools64/samtools/bin/samtools"
+ execute "$SAMTOOLS_BINARY view -bS $1 > $2"
+}
+
+# call: load_BAM_to_CSRA "$CONFIG" "$BAMFILE" "$TEMP_DIR"
+load_BAM_to_CSRA()
+{
+ BAMLOAD_BINARY="bam-load"
+ execute "$BAMLOAD_BINARY -L 3 -o $3 -k $1 -E0 -Q0 $2"
+}
+
+# call: load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+load_SAM_to_CSRA()
+{
+ BAMLOAD_BINARY="bam-load"
+ execute "cat $2 | $BAMLOAD_BINARY -L 3 -o $3 -k $1 -E0 -Q0 /dev/stdin"
+}
+
+# call: kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+kar_CSRA()
+{
+ KAR_BINARY="kar"
+ execute "$KAR_BINARY --create $1 -d $2 -f"
+}
+
+SAMFILE="temp.SAM"
+CONFIG="temp.kfg"
+TEMP_DIR="temp_csra"
+FINAL_CSRA="test.csra"
+
+produce_SAM "$CONFIG" "$SAMFILE"
+load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+
+execute "rm -rf $TEMP_DIR $SAMFILE $CONFIG"
+execute "vdb-dump $FINAL_CSRA --info"
diff --git a/test/samline/refbases.c b/test/samline/refbases.c
new file mode 100644
index 0000000..0ec7052
--- /dev/null
+++ b/test/samline/refbases.c
@@ -0,0 +1,184 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+
+#include <kfs/directory.h>
+
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <string.h>
+
+#include "refbases.h"
+
+static uint32_t read_uint32( const VCursor * cur, uint32_t col_idx )
+{
+ uint32_t elem_bits, boff, row_len;
+ const uint32_t * value;
+ rc_t rc = VCursorCellDataDirect ( cur, 1, col_idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc == 0 )
+ return *value;
+ return 0;
+}
+
+static uint32_t read_buffer( const VCursor * cur, char * buffer, int64_t row_id,
+ uint32_t offset, size_t buflen, uint32_t col_idx )
+{
+ uint32_t elem_bits, boff, row_len, res = 0;
+ const char * value;
+ rc_t rc = VCursorCellDataDirect ( cur, row_id, col_idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc == 0 && row_len > offset )
+ {
+ res = ( row_len - offset );
+ if ( res > buflen ) res = buflen;
+ memmove ( buffer, &value[ offset ], res );
+ }
+ return res;
+}
+
+
+static uint32_t read_bases( const VCursor * cur, char * buffer, uint32_t ref_pos_1_based,
+ uint32_t ref_len, uint32_t col_idx, uint32_t max_seq_len )
+{
+ uint32_t res = 0, n_read = 1;
+ uint32_t row_id = ( ( ref_pos_1_based - 1 ) / max_seq_len ) + 1;
+ uint32_t offset = ( ref_pos_1_based - 1 ) - ( ( row_id - 1 ) * max_seq_len );
+ size_t buflen = ref_len;
+ while ( res < ref_len && n_read > 0 )
+ {
+ n_read = read_buffer( cur, &buffer[ res ], row_id++, offset, buflen, col_idx );
+ res += n_read;
+ buflen -= n_read;
+ offset = 0;
+ }
+ return res;
+}
+
+
+char * read_refbases( const char * refname, uint32_t ref_pos_1_based, uint32_t ref_len, uint32_t * bases_in_ref )
+{
+ char * res = NULL;
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc == 0 )
+ {
+ const VDBManager * mgr;
+ rc = VDBManagerMakeRead ( &mgr, dir );
+ if ( rc == 0 )
+ {
+ const VTable * tab;
+ rc = VDBManagerOpenTableRead( mgr, &tab, NULL, "%s", refname );
+ if ( rc == 0 )
+ {
+ const VCursor * cur;
+ rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc == 0 )
+ {
+ uint32_t base_count_idx, read_idx, max_seq_len_idx;
+ rc = VCursorAddColumn( cur, &base_count_idx, "BASE_COUNT" );
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn( cur, &read_idx, "READ" );
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn( cur, &max_seq_len_idx, "MAX_SEQ_LEN" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( cur );
+ if ( rc == 0 )
+ {
+ uint32_t base_count = read_uint32( cur, base_count_idx );
+ if ( bases_in_ref != NULL )
+ *bases_in_ref = base_count;
+ uint32_t max_seq_len = read_uint32( cur, max_seq_len_idx );
+ if ( base_count > ( ref_pos_1_based + ref_len ) && max_seq_len > 0 )
+ {
+ res = malloc( ref_len + 1 );
+ if ( res != NULL )
+ {
+ uint32_t n_read = read_bases( cur, res, ref_pos_1_based,
+ ref_len, read_idx, max_seq_len );
+ res[ n_read ] = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ VCursorRelease( cur );
+ }
+ VTableRelease( tab );
+ }
+ VDBManagerRelease( mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ return res;
+}
+
+
+uint32_t ref_len( const char * refname )
+{
+ uint32_t res = 0;
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc == 0 )
+ {
+ const VDBManager * mgr;
+ rc = VDBManagerMakeRead ( &mgr, dir );
+ if ( rc == 0 )
+ {
+ const VTable * tab;
+ rc = VDBManagerOpenTableRead( mgr, &tab, NULL, "%s", refname );
+ if ( rc == 0 )
+ {
+ const VCursor * cur;
+ rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc == 0 )
+ {
+ uint32_t base_count_idx;
+ rc = VCursorAddColumn( cur, &base_count_idx, "BASE_COUNT" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( cur );
+ if ( rc == 0 )
+ res = read_uint32( cur, base_count_idx );
+ }
+ VCursorRelease( cur );
+ }
+ VTableRelease( tab );
+ }
+ VDBManagerRelease( mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ return res;
+}
diff --git a/test/samline/refbases.h b/test/samline/refbases.h
new file mode 100644
index 0000000..e229559
--- /dev/null
+++ b/test/samline/refbases.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_refbases_
+#define _h_refbases_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char * read_refbases( const char * refname, uint32_t ref_pos_1_based,
+ uint32_t ref_len, uint32_t * bases_in_ref );
+
+uint32_t ref_len( const char * refname );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/test/samline/reject_multi_refnames.sh b/test/samline/reject_multi_refnames.sh
new file mode 100755
index 0000000..bd554e2
--- /dev/null
+++ b/test/samline/reject_multi_refnames.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+execute()
+{
+ echo "------------------------------------------------------"
+ echo $1
+ eval $1
+ echo "."
+}
+
+# call: produce_SAM "$SAMFILE" "$CONFIG"
+produce_SAM()
+{
+ SAMLINE_BINARY="samline"
+
+ OUTFILE=$1
+ CONFIG=$2
+
+ REFNAME="NC_011752.1"
+ REFALIAS0="c1"
+ REFALIAS1="c2"
+ REFPOS0=1000
+ REFPOS1=3500
+ CIGAR0="50M"
+ CIGAR1="50M"
+
+ ALIG0="-r $REFNAME -b $REFALIAS0 -p $REFPOS0 -c $CIGAR0"
+ ALIG1="-r $REFNAME -b $REFALIAS1 -p $REFPOS1 -c $CIGAR1"
+ #ALIG0="-r $REFNAME -p $REFPOS0 -c $CIGAR0"
+ #ALIG1="-r $REFNAME -p $REFPOS1 -c $CIGAR1"
+ WRITE_CONFIG="-n $CONFIG"
+ WRITE_HDR="-d"
+
+ execute "$SAMLINE_BINARY $ALIG0 $ALIG1 $WRITE_HDR $WRITE_CONFIG > $OUTFILE"
+}
+
+# call: load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+load_SAM_to_CSRA()
+{
+ BAMLOAD_BINARY="bam-load"
+ execute "cat $2 | $BAMLOAD_BINARY -L 5 -o $3 -k $1 -E0 -Q0 /dev/stdin" # --allow-multi-map"
+}
+
+# call: kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+kar_CSRA()
+{
+ KAR_BINARY="kar"
+ execute "$KAR_BINARY --create $1 -d $2 -f"
+}
+
+PREFIX="RMF"
+SAMFILE="${PREFIX}.SAM"
+CONFIG="${PREFIX}.kfg"
+TEMP_DIR="${PREFIX}_csra"
+FINAL_CSRA="${PREFIX}.csra"
+
+#produce_SAM "$SAMFILE" "$CONFIG"
+#execute "rm -rf $TEMP_DIR"
+load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+#kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+#execute "rm -rf $TEMP_DIR"
+#execute "vdb-dump $FINAL_CSRA --info"
\ No newline at end of file
diff --git a/test/samline/sam.py b/test/samline/sam.py
new file mode 100644
index 0000000..67d7284
--- /dev/null
+++ b/test/samline/sam.py
@@ -0,0 +1,339 @@
+import subprocess
+import os
+import shutil
+
+'''---------------------------------------------------------------
+helper function: generate READ from cigar,refname,refpos
+---------------------------------------------------------------'''
+def cigar2read( cigar, pos, ref ):
+ cmd = "sampart -f read -c %s -p %d -r %s"%( cigar, pos, ref )
+ return subprocess.check_output( cmd, shell = True )
+
+'''---------------------------------------------------------------
+helper function: generate random QUALITY of given length
+---------------------------------------------------------------'''
+def rnd_qual( l ):
+ cmd = "sampart -f qual -l %d -s 7"%( l )
+ return subprocess.check_output( cmd, shell = True )
+
+'''---------------------------------------------------------------
+helper function: transform cigar with given inserts into
+a 'clean' cigar, bam-load does accept
+---------------------------------------------------------------'''
+def merge_cigar( cigar ):
+ cmd = "sampart -f cigar -c %s"%( cigar )
+ return subprocess.check_output( cmd, shell = True )
+
+'''---------------------------------------------------------------
+helper function: to get length of a reference ( from the RefSeq-Acc )
+---------------------------------------------------------------'''
+def ref_len( ref ):
+ cmd = "sampart -f rlen -r %s"%( ref )
+ return int( subprocess.check_output( cmd, shell = True ) )
+
+'''---------------------------------------------------------------
+helper function: remove a file, without error if it does not exist
+---------------------------------------------------------------'''
+def rm_file( filename ) :
+ try:
+ os.remove( filename )
+ except:
+ pass
+
+'''---------------------------------------------------------------
+helper function: remove a direcotry, without error if it does not exist
+---------------------------------------------------------------'''
+def rm_dir( dirname ) :
+ try:
+ shutil.rmtree( dirname, ignore_errors=True )
+ except:
+ pass
+
+def load_file( filename ) :
+ if os.path.isfile( filename ) :
+ with open( filename, "r" ) as the_file:
+ return the_file.read()
+ return ""
+
+def print_file( filename ) :
+ s = load_file( filename )
+ if len( s ) > 0 :
+ print s
+
+def print_txt( txt ) :
+ if len( txt ) > 0 :
+ print txt
+
+def print_txt_list( list ) :
+ for a in list :
+ print_txt( a )
+
+'''===============================================================
+preform a bam-load on a python-list of SAM-objects
+ will create temporary files and directory ( x.sam, x.kfg, x_csra )
+ writes the content of the python-list into x.sam
+ writes a config file into x.kfg
+ performs bam-load, and prints it's output
+ kar's the created directory into the given output-file
+ can be asked to keep the temporary files
+ list ........ list of SAM-objects
+ output....... name of cSRA-file to be created
+ params....... parameters passed into bam-load
+ keep_files... False/True for debugging temp. files
+==============================================================='''
+def bam_load( list, output, params, keep_files = False ) :
+ res = 0
+ txt1=""
+ txt2=""
+ try :
+ rm_dir( "x_csra" )
+ rm_file( output )
+ rm_file( "err.txt" )
+ save_sam( list, "x.sam" )
+ save_config( list, "x.kfg" )
+ cmd = "bam-load %s -o x_csra -k x.kfg x.sam 2>err.txt"%( params )
+ txt1 = subprocess.check_output( cmd, shell=True )
+ cmd = "kar --create %s -d x_csra -f 2>err.txt"%( output )
+ txt2 = subprocess.check_output( cmd, shell=True )
+ if not keep_files :
+ rm_dir( "x_csra" )
+ rm_file( "x.sam" )
+ rm_file( "x.kfg" )
+ res = 1
+ except :
+ pass
+ print_txt_list( [ load_file( "err.txt" ), txt1, txt2 ] )
+ rm_file( "err.txt" )
+ return res
+
+
+'''===============================================================
+preform a sra-sort on a given cSRA-file
+ will create a temporary directory ( x_csra )
+ performs sra-sort, and prints it's output
+ kar's the created directory into the given output-file
+ can be asked to keep the temporary files
+ list ........ list of SAM-objects
+ output....... name of cSRA-file to be created
+ params....... parameters passed into bam-load
+ keep_files... False/True for debugging temp. files
+==============================================================='''
+def sra_sort( input, output, params = "", keep_files = False ) :
+ res = 0
+ txt1 = ""
+ txt2 = ""
+ try :
+ rm_dir( "s_csra" )
+ rm_file( output )
+ rm_file( "err.txt" )
+ cmd = "sra-sort %s s_csra -f %s 2>err.txt"%( input, params )
+ txt1 = subprocess.check_output( cmd, shell=True )
+ cmd = "kar --create %s -d s_csra -f 2>err.txt"%( output )
+ txt2 = subprocess.check_output( cmd, shell=True )
+ if not keep_files :
+ rm_dir( "s_csra" )
+ res = 1
+ except :
+ pass
+ print_txt_list( [ load_file( "err.txt" ), txt1, txt2 ] )
+ rm_file( "err.txt" )
+ return res
+
+
+def vdb_dump( accession, params = "" ) :
+ try :
+ cmd = "vdb-dump %s %s"%( accession, params )
+ txt = subprocess.check_output( cmd, stderr=subprocess.STDOUT, shell=True )
+ print txt
+ return 1
+ except :
+ pass
+ return 0
+
+def sam_dump( accession, params = "" ) :
+ try :
+ cmd = "sam-dump %s %s"%( accession, params )
+ txt = subprocess.check_output( cmd, stderr=subprocess.STDOUT, shell=True )
+ print txt
+ return 1
+ except :
+ pass
+ return 0
+
+'''===============================================================
+all 11 different SAM-Flags
+==============================================================='''
+FLAG_MULTI = 0x01
+FLAG_PROPPER = 0x02
+FLAG_UNMAPPED = 0x04
+FLAG_NEXT_UNMAPPED = 0x08
+FLAG_REVERSED = 0x010
+FLAG_NEXT_REVERSED = 0x020
+FLAG_FIRST = 0x040
+FLAG_LAST = 0x080
+FLAG_SECONDARY = 0x0100
+FLAG_BAD = 0x0200
+FLAG_PCR = 0x0400
+
+
+'''===============================================================
+ make a primary SAM-alignment
+==============================================================='''
+def make_prim( qname, flags, refname, refalias, pos, mapq, cigar, rnxt = "*", pnxt = "0" ) :
+ return SAM( qname, flags | FLAG_PROPPER, refname, refalias, pos, mapq, merge_cigar( cigar ),
+ cigar2read( cigar, pos, refname ), rnxt, pnxt )
+
+
+'''===============================================================
+ make a secondary SAM-alignment
+==============================================================='''
+def make_sec( qname, flags, refname, refalias, pos, mapq, cigar, rnxt = "*", pnxt = "0" ) :
+ return SAM( qname, flags | FLAG_SECONDARY, refname, refalias, pos, mapq, merge_cigar( cigar ),
+ cigar2read( cigar, pos, refname ), rnxt, pnxt )
+
+
+'''===============================================================
+ make a unaligned SAM
+==============================================================='''
+def make_unaligned( qname, flags, seq ) :
+ return SAM( qname, flags | FLAG_UNMAPPED, "-", "-", 0, 255, "*", seq, "-", 0 )
+
+
+'''---------------------------------------------------------------
+helper function: walk the list of SAM-objects, create a dictionary
+ key: refalias, value: refname
+ ( used in extract_headers and produce_config )
+---------------------------------------------------------------'''
+def make_refdict( list ) :
+ res = {}
+ for a in list :
+ res[ a.refalias ] = a.refname
+ return res
+
+'''---------------------------------------------------------------
+helper function: create SAM-headers from a list of SAM-objects
+ as a list of strings
+ used in print_sam and save_sam
+---------------------------------------------------------------'''
+def extract_headers( list ) :
+ reflist = make_refdict( list )
+ res = [ "@HD\tVN:1.3" ]
+ for k, v in reflist.items():
+ l = ref_len( v )
+ res.append( "@SQ\tSN:%s\tAS:%s\tLN:%d"%( k, k, l ) )
+ return res
+
+'''---------------------------------------------------------------
+helper function: create a config-file for bam-load out of
+ a list of SAM-objects
+ used in save_config
+---------------------------------------------------------------'''
+def produce_config( list ) :
+ reflist = make_refdict( list )
+ res = []
+ for k, v in reflist.items():
+ if k != "*" and k != "-" :
+ res.append( "%s\t%s"%( k, v ) )
+ return res
+
+'''---------------------------------------------------------------
+helper function: save config file created from list of SAM-objects
+ used in bam_load
+---------------------------------------------------------------'''
+def save_config( list, filename ) :
+ with open( filename, "w" ) as f:
+ for s in produce_config( list ) :
+ f.write( "%s\n"%( s ) )
+
+'''---------------------------------------------------------------
+helper function: prints a list of SAM-objects
+---------------------------------------------------------------'''
+def print_sam( list ):
+ for s in extract_headers( list ) :
+ print s
+ for s in list :
+ print s
+
+'''---------------------------------------------------------------
+helper function: save a list of SAM-objects as file
+ used in bam_load
+---------------------------------------------------------------'''
+def save_sam( list, filename ) :
+ with open( filename, "w" ) as f:
+ for s in extract_headers( list ) :
+ f.write( "%s\n"%( s ) )
+ for s in list :
+ f.write( "%s\n"%( s ) )
+
+'''===============================================================
+ SAM-object
+==============================================================='''
+class SAM:
+
+ def __init__( self, qname, flags, refname, refalias, pos, mapq, cigar, seq, rnxt, pnxt, tags="" ) :
+ self.qname = qname
+ self.flags = flags
+ self.refname = refname
+ self.refalias = refalias
+ self.pos = pos
+ self.mapq = mapq
+ self.cigar = cigar
+ self.seq = seq
+ self.qual = rnd_qual( len( self.seq ) )
+ self.nxt_ref = rnxt
+ self.nxt_pos = pnxt
+ self.tlen = 0
+ self.tags = tags
+
+ def __str__( self ):
+ if len( self.tags ) > 0 :
+ return "%s\t%d\t%s\t%s\t%d\t%s\t%s\t%s\t%d\t%s\t%s\t%s"%( self.qname,
+ self.flags, self.refalias, self.pos, self.mapq, self.cigar, self.nxt_ref,
+ self.nxt_pos, self.tlen, self.seq, self.qual, self.tags )
+ else :
+ return "%s\t%d\t%s\t%s\t%d\t%s\t%s\t%s\t%d\t%s\t%s"%( self.qname,
+ self.flags, self.refalias, self.pos, self.mapq, self.cigar, self.nxt_ref,
+ self.nxt_pos, self.tlen, self.seq, self.qual )
+
+ def set_flag( self, flagbit, state ) :
+ if state :
+ self.flags |= flagbit
+ else :
+ self.flags &= ~flagbit
+
+ def set_tags( self, tag ) :
+ self.tags = tag
+
+ def add_tag( self, tag ) :
+ if len( self.tags ) > 0 :
+ self.tags += ";"
+ self.tags += tag
+ else :
+ self.tags = tag
+
+ def pair_with( self, other ) :
+ self.nxt_ref = other.refalias
+ self.nxt_pos = other.pos
+ other.nxt_ref = self.refalias
+ other.nxt_pos = self.pos
+ self.flags |= FLAG_MULTI
+ other.flags |= FLAG_MULTI
+ self.set_flag( FLAG_FIRST, True )
+ other.set_flag( FLAG_FIRST, False )
+ self.set_flag( FLAG_LAST, False )
+ other.set_flag( FLAG_LAST, True )
+ self.set_flag( FLAG_NEXT_UNMAPPED, other.flags & FLAG_UNMAPPED )
+ self.set_flag( FLAG_NEXT_REVERSED, other.flags & FLAG_REVERSED )
+ other.set_flag( FLAG_NEXT_UNMAPPED, self.flags & FLAG_UNMAPPED )
+ other.set_flag( FLAG_NEXT_REVERSED, self.flags & FLAG_REVERSED )
+ other.qname = self.qname
+
+ def link_to( self, other ) :
+ self.flags |= FLAG_MULTI
+ self.set_flag( FLAG_FIRST, other.flags & FLAG_FIRST )
+ self.set_flag( FLAG_LAST, other.flags & FLAG_LAST )
+ self.set_flag( FLAG_NEXT_UNMAPPED, other.flags & FLAG_UNMAPPED )
+ self.set_flag( FLAG_NEXT_REVERSED, other.flags & FLAG_REVERSED )
+ self.nxt_ref = other.refalias
+ self.nxt_pos = other.pos
+ self.qname = other.qname
diff --git a/test/samline/samline.vers b/test/samline/samline.vers
new file mode 100644
index 0000000..3eefcb9
--- /dev/null
+++ b/test/samline/samline.vers
@@ -0,0 +1 @@
+1.0.0
diff --git a/test/samline/sampart.c b/test/samline/sampart.c
new file mode 100644
index 0000000..e07c3f5
--- /dev/null
+++ b/test/samline/sampart.c
@@ -0,0 +1,304 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "sampart.vers.h"
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "refbases.h"
+#include "cigar.h"
+
+#define DFLT_FUNCTION "read"
+#define DFLT_REFNAME "NC_011752.1"
+#define DFLT_REFPOS 10000
+#define DFLT_CIGAR "50M"
+#define DFLT_INSBASES "ACGTACGTACGT"
+#define DFLT_LEN 50
+#define DFLT_SEED 7
+
+static const char * function_usage[] = { "which function to execute ( read, qual, cigar, rlen )", NULL };
+static const char * refname_usage[] = { "the ref-seq-id to use 'NC_011752.1'", NULL };
+static const char * refpos_usage[] = { "the position on the reference 0-based", NULL };
+static const char * cigar_usage[] = { "the cigar-string to use", NULL };
+static const char * insbases_usage[] = { "what bases to insert ( if needed )", NULL };
+static const char * len_usage[] = { "length of random quality", NULL };
+static const char * seed_usage[] = { "seed for random", NULL };
+
+#define OPTION_FUNCTION "function"
+#define OPTION_REFNAME "refname"
+#define OPTION_REFPOS "refpos"
+#define OPTION_CIGAR "cigar"
+#define OPTION_INSBASES "insbases"
+#define OPTION_LEN "len"
+#define OPTION_SEED "seed"
+
+#define ALIAS_FUNCTION "f"
+#define ALIAS_REFNAME "r"
+#define ALIAS_REFPOS "p"
+#define ALIAS_CIGAR "c"
+#define ALIAS_INSBASES "i"
+#define ALIAS_LEN "l"
+#define ALIAS_SEED "s"
+
+OptDef Options[] =
+{
+ { OPTION_FUNCTION, ALIAS_FUNCTION, NULL, function_usage, 1, true, false },
+ { OPTION_REFNAME, ALIAS_REFNAME, NULL, refname_usage, 1, true, false },
+ { OPTION_REFPOS, ALIAS_REFPOS, NULL, refpos_usage, 1, true, false },
+ { OPTION_CIGAR, ALIAS_CIGAR, NULL, cigar_usage, 1, true, false },
+ { OPTION_INSBASES, ALIAS_INSBASES, NULL, insbases_usage, 1, true, false },
+ { OPTION_LEN, ALIAS_LEN, NULL, len_usage, 1, true, false },
+ { OPTION_SEED, ALIAS_SEED, NULL, seed_usage, 1, true, false }
+};
+
+const char UsageDefaultName[] = "sampart";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg( "\nUsage:\n %s [options]\n\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ int i, n_options;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+ KOutMsg ( "Options:\n" );
+
+ n_options = sizeof Options / sizeof Options[ 0 ];
+ for ( i = 0; i < n_options; ++i )
+ {
+ OptDef * o = &Options[ i ];
+ HelpOptionLine( o->aliases, o->name, NULL, o->help );
+ }
+
+ KOutMsg ( "\n" );
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+
+/* Version EXTERN
+ * return 4-part version code: 0xMMmmrrrr, where
+ * MM = major release
+ * mm = minor release
+ * rrrr = bug-fix release
+ */
+ver_t CC KAppVersion ( void )
+{
+ return SAMPART_VERS;
+}
+
+static const char * get_str_option( const Args * args, const char * name, uint32_t idx, const char * dflt )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( ( rc == 0 )&&( count > idx ) )
+ {
+ const char * res = NULL;
+ ArgsOptionValue( args, name, idx, (const void **)&res );
+ return res;
+ }
+ else
+ return dflt;
+}
+
+static uint32_t get_uint32_option( const Args * args, const char * name, uint32_t idx, const uint32_t dflt )
+{
+ const char * s = get_str_option( args, name, idx, NULL );
+ if ( s == NULL )
+ return dflt;
+ return atoi( s );
+}
+
+static rc_t CC write_to_FILE ( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+static rc_t make_read( const Args * args )
+{
+ rc_t rc = 0;
+ const char * cigar_str = get_str_option( args, OPTION_CIGAR, 0, DFLT_CIGAR );
+ struct cigar_t * cigar = make_cigar_t( cigar_str );
+ if ( cigar != NULL )
+ {
+ uint32_t reflen = cigar_t_reflen( cigar );
+ uint32_t refpos = get_uint32_option( args, OPTION_REFPOS, 0, DFLT_REFPOS );
+ const char * refname = get_str_option( args, OPTION_REFNAME, 0, DFLT_REFNAME );
+ const char * refbases = read_refbases( refname, refpos, reflen, NULL );
+ if ( refbases != NULL )
+ {
+ int read_len = cigar_t_readlen( cigar );
+ char * buffer = malloc( read_len + 1 );
+ if ( buffer != NULL )
+ {
+ const char * ins_bases = get_str_option( args, OPTION_INSBASES, 0, DFLT_INSBASES );
+ cigar_t_2_read( buffer, read_len + 1, cigar, refbases, ins_bases );
+ rc = KOutMsg( "%s", buffer );
+ free( buffer );
+ }
+ free( ( void * )refbases );
+ }
+ free_cigar_t( cigar );
+ }
+ return rc;
+}
+
+
+static size_t random_string( char * buffer, size_t buflen, const char * char_set, size_t length )
+{
+ size_t res = 0;
+ if ( buffer != NULL && buflen > 0 )
+ {
+ const char dflt_charset[] = "0123456789"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const char * cs = ( char_set == NULL ) ? dflt_charset : char_set;
+ size_t charset_len = strlen( cs ) - 1;
+ while ( res < length && res < ( buflen - 1 ) )
+ {
+ size_t rand_idx = ( double ) rand() / RAND_MAX * charset_len;
+ buffer[ res++ ] = cs[ rand_idx ];
+ }
+ buffer[ res ] = 0;
+ }
+ return res;
+}
+
+
+static size_t random_quality( char * buffer, size_t buflen, size_t length )
+{
+ const char qualities[] = "!\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~";
+ return random_string( buffer, buflen, qualities, length );
+}
+
+
+static rc_t make_quality( const Args * args )
+{
+ rc_t rc = 0;
+ uint32_t len = get_uint32_option( args, OPTION_LEN, 0, DFLT_LEN );
+ uint32_t seed = get_uint32_option( args, OPTION_SEED, 0, DFLT_SEED );
+ char * buffer = malloc( len + 1 );
+ if ( buffer != NULL )
+ {
+ if ( seed > 0 ) srand( seed );
+ random_quality( buffer, len + 1, len );
+ rc = KOutMsg( "%s", buffer );
+ free( buffer );
+ }
+ return rc;
+}
+
+static rc_t make_cigar( const Args * args )
+{
+ rc_t rc = 0;
+ const char * cigar_str = get_str_option( args, OPTION_CIGAR, 0, DFLT_CIGAR );
+ struct cigar_t * cigar = make_cigar_t( cigar_str );
+ if ( cigar != NULL )
+ {
+ char buffer[ 4096 ];
+ struct cigar_t * merged_cigar = merge_cigar_t( cigar );
+ cigar_t_string( buffer, sizeof buffer, merged_cigar );
+ rc = KOutMsg( "%s", buffer );
+ free_cigar_t( merged_cigar );
+ free_cigar_t( cigar );
+ }
+ return rc;
+}
+
+static rc_t get_ref_len( const Args * args )
+{
+ rc_t rc = 0;
+ const char * refname = get_str_option( args, OPTION_REFNAME, 0, DFLT_REFNAME );
+ if ( refname != NULL )
+ rc = KOutMsg( "%d", ref_len( refname ) );
+ return rc;
+}
+
+static const char function_read[] = "read";
+static const char function_qual[] = "qual";
+static const char function_cigar[] = "cigar";
+static const char function_rlen[] = "rlen";
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ rc_t rc = KOutHandlerSet ( write_to_FILE, stdout );
+ if ( rc == 0 )
+ {
+ Args * args;
+
+ int n_options = sizeof Options / sizeof Options[ 0 ];
+ rc = ArgsMakeAndHandle( &args, argc, argv, 1, Options, n_options );
+ if ( rc == 0 )
+ {
+ const char * function = get_str_option( args, OPTION_FUNCTION, 0, DFLT_FUNCTION );
+
+ if ( 0 == strcase_cmp ( function, string_size( function ), function_read, 4, 4 ) )
+ rc = make_read( args );
+ else if ( 0 == strcase_cmp ( function, string_size( function ), function_qual, 4, 4 ) )
+ rc = make_quality( args );
+ else if ( 0 == strcase_cmp ( function, string_size( function ), function_cigar, 5, 5 ) )
+ rc = make_cigar( args );
+ else if ( 0 == strcase_cmp ( function, string_size( function ), function_rlen, 4, 4 ) )
+ rc = get_ref_len( args );
+ else
+ rc = KOutMsg( "unknown function '%s'\n", function );
+ ArgsWhack( args );
+ }
+ }
+ return rc;
+}
diff --git a/test/samline/sampart.vers b/test/samline/sampart.vers
new file mode 100644
index 0000000..3eefcb9
--- /dev/null
+++ b/test/samline/sampart.vers
@@ -0,0 +1 @@
+1.0.0
diff --git a/test/samline/sec_align_problem.sh b/test/samline/sec_align_problem.sh
new file mode 100755
index 0000000..59f6be3
--- /dev/null
+++ b/test/samline/sec_align_problem.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+execute()
+{
+ echo "------------------------------------------------------"
+ echo $1
+ eval $1
+ echo "."
+}
+
+# this will produce 2 files:
+# a) a config-file for bam-load with the used reference
+# b) a SAM-file with header-line containing the lonely sec. alignment
+# call: produce_SAM "$CONFIG" "$SAMFILE"
+produce_SAM1()
+{
+ SAMLINE_BINARY="samline"
+ QNAME="--qname 1"
+ REFNAME="-r NC_011752.1"
+ REFPOS="-p 6800"
+ CIGAR="-c 55M"
+ SECONDARY="-2 1"
+ #FIRST="--first 1"
+ WITH_HEADERS="-d"
+ CREATE_CONFIG="-n $1"
+ execute "$SAMLINE_BINARY $QNAME $REFNAME $REFPOS $CIGAR $SECONDARY $FIRST $WITH_HEADERS $CREATE_CONFIG > $2"
+}
+
+# this will produce 1 file with these 2 primary mates
+# call: produce_SAM "$SAMFILE"
+produce_SAM2()
+{
+ SAMLINE_BINARY="samline"
+ QNAME="--qname 2"
+ REFNAME="-r NC_011752.1"
+ REFPOS1="-p 1000"
+ REFPOS2="-p 3500"
+ CIGAR1="-c 30MAAA20M"
+ CIGAR2="-c 50M2D10M"
+ SEC1="-2 0"
+ SEC2="-2 1"
+ execute "$SAMLINE_BINARY $QNAME $REFNAME $REFPOS1 $REFPOS2 $CIGAR1 $CIGAR2 $SEC1 $SEC2 >> $1"
+}
+
+# call: load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+load_SAM_to_CSRA()
+{
+ BAMLOAD_BINARY="bam-load"
+ execute "cat $2 | $BAMLOAD_BINARY --make-spots-with-secondary -L 3 -o $3 -k $1 -E0 -Q0 /dev/stdin"
+}
+
+# call: kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+kar_CSRA()
+{
+ KAR_BINARY="kar"
+ execute "$KAR_BINARY --create $1 -d $2 -f"
+}
+
+SAMFILE="p1.SAM"
+CONFIG="p1.cfg"
+TEMP_DIR="p1_csra"
+FINAL_CSRA="p1.csra"
+TEMP_SORTED_CSRA="p2_csra"
+SORTED_CSRA="p2.csra"
+
+produce_SAM1 "$CONFIG" "$SAMFILE"
+produce_SAM2 "$SAMFILE"
+load_SAM_to_CSRA "$CONFIG" "$SAMFILE" "$TEMP_DIR"
+kar_CSRA "$FINAL_CSRA" "$TEMP_DIR"
+#execute "vdb-dump $FINAL_CSRA --info"
+#execute "sra-stat $FINAL_CSRA"
+execute "sra-sort $FINAL_CSRA $TEMP_SORTED_CSRA -f"
+kar_CSRA "$SORTED_CSRA" "$TEMP_SORTED_CSRA"
+#execute "vdb-dump $SORTED_CSRA --info"
+#execute "sra-stat $SORTED_CSRA"
+#execute "rm -rf $TEMP_DIR $TEMP_SORTED_CSRA $SAMFILE $CONFIG"
diff --git a/test/sra-pileup/Makefile b/test/sra-pileup/Makefile
new file mode 100644
index 0000000..4ad3ec3
--- /dev/null
+++ b/test/sra-pileup/Makefile
@@ -0,0 +1,49 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/sra-pileup
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: check_exit_code
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+
+check_exit_code:
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/sra-pileup
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
diff --git a/test/srapath/Makefile b/test/srapath/Makefile
new file mode 100644
index 0000000..5402a5e
--- /dev/null
+++ b/test/srapath/Makefile
@@ -0,0 +1,49 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/srapath
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: check_exit_code
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+
+check_exit_code:
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/srapath
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
diff --git a/test/tarballs/build.xml b/test/tarballs/build.xml
new file mode 100644
index 0000000..ffe59c7
--- /dev/null
+++ b/test/tarballs/build.xml
@@ -0,0 +1,27 @@
+<project>
+ <property name="sourcename" value="sratoolkit.current-win64.zip" />
+ <property name="url" value="http://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/" />
+ <property name="workdir" value=".\temp" />
+ <property name="targetname" value="current-win64" />
+
+ <target name="tarballs">
+ <delete dir="${workdir}" failonerror="false"/>
+ <mkdir dir="${workdir}"/>
+ <get src="${url}/${sourcename}" dest="${workdir}/${sourcename}" />
+ <unzip src="${workdir}/${sourcename}" dest="${workdir}" />
+ <delete dir="${workdir}/${sourcename}" />
+ <dirset id="tgt" dir="${workdir}" includes="*-win64"/>
+ <property name="target" refid="tgt"/>
+ <move file="${workdir}/${target}" tofile="${workdir}/${targetname}"/>
+
+ <echo message="Target directory is ${workdir}/${targetname}"/>
+
+ <exec executable="cmd" failonerror="true" >
+ <arg value="/c"/>
+ <arg value="test-tarballs.bat"/>
+ <arg value="${workdir}\${targetname}\bin"/>
+ </exec>
+
+ <delete dir="${workdir}" failonerror="false"/>
+ </target>
+</project>
diff --git a/test/tarballs/test-tarballs.bat b/test/tarballs/test-tarballs.bat
new file mode 100644
index 0000000..8cffe29
--- /dev/null
+++ b/test/tarballs/test-tarballs.bat
@@ -0,0 +1,42 @@
+:: ===========================================================================
+::
+:: PUBLIC DOMAIN NOTICE
+:: National Center for Biotechnology Information
+::
+:: This software/database is a "United States Government Work" under the
+:: terms of the United States Copyright Act. It was written as part of
+:: the author's official duties as a United States Government employee and
+:: thus cannot be copyrighted. This software/database is freely available
+:: to the public for use. The National Library of Medicine and the U.S.
+:: Government have not placed any restriction on its use or reproduction.
+::
+:: Although all reasonable efforts have been taken to ensure the accuracy
+:: and reliability of the software and data, the NLM and the U.S.
+:: Government do not and cannot warrant the performance or results that
+:: may be obtained by using this software or data. The NLM and the U.S.
+:: Government disclaim all warranties, express or implied, including
+:: warranties of performance, merchantability or fitness for any particular
+:: purpose.
+::
+:: Please cite the author in any work or product based on this material.
+::
+:: ===========================================================================
+
+echo on
+Setlocal
+Setlocal EnableDelayedExpansion
+
+set TOOLS=abi-dump align-info cache-mgr fastq-dump illumina-dump kar kdbmeta latf-load prefetch rcexplain sam-dump sff-dump ^
+ sra-pileup sra-stat srapath test-sra vdb-config vdb-copy vdb-decrypt vdb-dump vdb-encrypt vdb-lock ^
+ vdb-unlock vdb-validate
+rem Temporarily removed from 2.8.0 due to an HTTPS bug in C++Toolkit. To be restored later
+rem blastn_vdb tblastn_vdb
+
+:: vdb-passwd is obsolete but still in the package
+
+set FAILED=
+
+for %%t in ( %TOOLS% ) do ( echo | set /p=%%t & %1\%%t -h >NUL & ( if errorlevel 1 ( echo | set /p=failed! & set FAILED=!FAILED! %%t ) ) & echo. )
+
+if "%FAILED%" NEQ "" ( echo. & echo FAILED: %FAILED% & exit /b 1 )
+
diff --git a/test/tarballs/test-tarballs.sh b/test/tarballs/test-tarballs.sh
new file mode 100755
index 0000000..9cd2fc4
--- /dev/null
+++ b/test/tarballs/test-tarballs.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+#
+# Download and test SRA Toolkit tarballs (see VDB-1345)
+# Errors are reported to the specified email
+#
+# Parameters:
+# $1 - working dir (will contain a copy of the latest md5sum.txt file)
+#
+# return codes:
+# 0 - tests passed
+# 1 - wget failed
+# 2 - gunzip failed
+# 3 - tar failed
+# 4 - one of the tools failed
+
+WORKDIR=$1
+if [ "${WORKDIR}" == "" ]
+then
+ WORKDIR="./temp"
+fi
+
+TOOLS="abi-dump abi-load align-info bam-load blastn_vdb cache-mgr cg-load fastq-dump fastq-load helicos-load illumina-dump \
+illumina-load kar kdbmeta latf-load prefetch rcexplain sam-dump sff-dump sff-load sra-pileup \
+sra-sort sra-stat srapath srf-load tblastn_vdb test-sra vdb-config vdb-copy vdb-decrypt vdb-dump vdb-encrypt vdb-lock \
+vdb-unlock vdb-validate"
+
+# vdb-passwd is obsolete but still in the package
+
+case $(uname) in
+Linux)
+ python -mplatform | grep Ubuntu && OS=ubuntu64 || OS=centos_linux64
+ TOOLS="${TOOLS} pacbio-load remote-fuser"
+ ;;
+Darwin)
+ OS=mac64
+ ;;
+esac
+
+TARBALLS_URL=http://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/
+TARGET=sratoolkit.current-${OS}
+
+mkdir -p ${WORKDIR}
+cd ${WORKDIR}
+
+wget --no-check-certificate ${TARBALLS_URL}${TARGET}.tar.gz || exit 1
+gunzip -f ${TARGET}.tar.gz || exit 2
+PACKAGE=$(tar tf ${TARGET}.tar | head -n 1)
+rm -rf ${PACKAGE}
+tar xvf ${TARGET}.tar || exit 3
+
+FAILED=""
+for tool in ${TOOLS}
+do
+ echo $tool
+ ${PACKAGE}/bin/$tool -h
+ if [ "$?" != "0" ]
+ then
+ echo "$(pwd)/${PACKAGE}/bin/$tool failed"
+ FAILED="${FAILED} $tool"
+ fi
+done
+
+if [ "${FAILED}" != "" ]
+then
+ echo "The following tools failed: ${FAILED}"
+ exit 4
+fi
+
+rm -rf ${PACKAGE} ${TARGET}.tar
+cd -
+
+
+
diff --git a/test/vcf-loader/Makefile b/test/vcf-loader/Makefile
new file mode 100644
index 0000000..aaf8fcf
--- /dev/null
+++ b/test/vcf-loader/Makefile
@@ -0,0 +1,76 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+ @ rm tmp.kfg
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vcf-loader
+
+TEST_TOOLS = \
+ test-vcf-loader
+
+include $(TOP)/build/Makefile.env
+
+
+$(shell echo "vdb/schema/paths = \"$(VDB_INCDIR)\"" > tmp.kfg)
+
+# make sure runs are not cached in the user repository when running tests
+ifeq ($(wildcard ../../../asm-trace),)
+ ifeq (,$(VDB_CONFIG))
+ VDB_CONFIG = $(shell pwd)
+ endif
+endif
+
+ifeq (,$(VDB_CONFIG))
+ VDB_CONFIG = $(shell pwd)
+endif
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# white-box test
+#
+INCDIRS += -I$(TOP)/tools/vcf-loader
+
+VCF_TEST_SRC = \
+ test-vcf-loader
+
+VCF_TEST_OBJ = \
+ $(addsuffix .$(OBJX),$(VCF_TEST_SRC))
+
+VCF_TEST_LIB = \
+ -skapp \
+ -sktst \
+ -sncbi-wvdb \
+ -svcfloader
+
+$(TEST_BINDIR)/test-vcf-loader: $(VCF_TEST_OBJ)
+ $(LP) --exe -o $@ $^ $(VCF_TEST_LIB)
diff --git a/test/vcf-loader/only-remote-repository.kfg b/test/vcf-loader/only-remote-repository.kfg
new file mode 100644
index 0000000..2e7ef51
--- /dev/null
+++ b/test/vcf-loader/only-remote-repository.kfg
@@ -0,0 +1,2 @@
+/repository/remote/main/CGI/resolver-cgi = "http://www.ncbi.nlm.nih.gov/Traces/names/names.cgi"
+/repository/user/main/public/cache-enabled = "false"
diff --git a/test/vcf-loader/test-vcf-loader.cpp b/test/vcf-loader/test-vcf-loader.cpp
new file mode 100644
index 0000000..d7afaed
--- /dev/null
+++ b/test/vcf-loader/test-vcf-loader.cpp
@@ -0,0 +1,862 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* tests for VCF reader
+*/
+
+#include <ktst/unit_test.hpp>
+
+#include <klib/out.h>
+#include <klib/namelist.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <align/writer-reference.h>
+
+#include <sysalloc.h>
+#include <stdexcept>
+#include <sstream>
+#include <memory.h>
+
+extern "C" {
+#include "../../tools/vcf-loader/vcf-grammar.h"
+#include "../../tools/vcf-loader/vcf-parse.h"
+#include "../../tools/vcf-loader/vcf-reader.h"
+#include "../../tools/vcf-loader/vcf-database.h"
+}
+
+using namespace std;
+using namespace ncbi::NK;
+
+TEST_SUITE(VcfLoaderTestSuite);
+
+// test fixture for scanner tests
+class VcfScanFixture
+{
+public:
+ VcfScanFixture()
+ : consumed(0)
+ {
+ pb.self = this;
+ pb.input = Input;
+ }
+ ~VcfScanFixture()
+ {
+ VCFScan_yylex_destroy(&pb);
+ }
+ void InitScan(const char* p_input, bool trace=false)
+ {
+ input = p_input;
+ VCFScan_yylex_init(&pb, trace);
+ }
+ int Scan()
+ {
+ int tokenId=VCF_lex(&sym, pb.scanner);
+
+ if (tokenId != 0)
+ tokenText=string(input.c_str() + sym.tokenStart, sym.tokenLength);
+
+ return tokenId;
+ }
+ static size_t CC Input(VCFParseBlock* sb, char* buf, size_t max_size)
+ {
+ VcfScanFixture* self = (VcfScanFixture*)sb->self;
+ if (self->input.size() < self->consumed)
+ return 0;
+
+ size_t to_copy = min(self->input.size() - self->consumed, max_size);
+ if (to_copy == 0)
+ return 0;
+
+ memmove(buf, self->input.c_str(), to_copy);
+ if (to_copy < max_size && buf[to_copy-1] != '\n')
+ {
+ buf[to_copy] = '\n';
+ ++to_copy;
+ }
+ self->consumed += to_copy;
+ return to_copy;
+ }
+
+ string input;
+ size_t consumed;
+ VCFParseBlock pb;
+ VCFToken sym;
+ string tokenText;
+};
+
+#define REQUIRE_TOKEN(tok) REQUIRE_EQUAL(Scan(), (int)tok);
+#define REQUIRE_TOKEN_TEXT(tok, text) REQUIRE_TOKEN(tok); REQUIRE_EQ(tokenText, string(text));
+
+#define REQUIRE_TOKEN_COORD(tok, text, line, col) \
+ REQUIRE_TOKEN_TEXT(tok, text); \
+ REQUIRE_EQ(pb.lastToken->line_no, (size_t)line); \
+ REQUIRE_EQ(pb.lastToken->column_no, (size_t)col);
+
+FIXTURE_TEST_CASE(EmptyInput, VcfScanFixture)
+{
+ InitScan("");
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(MetaLineSimple, VcfScanFixture)
+{
+ InitScan("##fileformat=VCFv4.1\n");
+ REQUIRE_TOKEN_TEXT(vcfMETAKEY_FORMAT, "fileformat");
+ REQUIRE_TOKEN_TEXT('=', "=");
+ REQUIRE_TOKEN_TEXT(vcfMETAVALUE, "VCFv4.1");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(MetaLineComposite, VcfScanFixture)
+{
+ InitScan("##fileformat=<key1=val1,key2=val2>\n");
+ REQUIRE_TOKEN_TEXT(vcfMETAKEY, "fileformat");
+ REQUIRE_TOKEN_TEXT('=', "=");
+ REQUIRE_TOKEN_TEXT('<', "<");
+ REQUIRE_TOKEN_TEXT(vcfMETAKEY, "key1");
+ REQUIRE_TOKEN_TEXT('=', "=");
+ REQUIRE_TOKEN_TEXT(vcfMETAVALUE, "val1");
+ REQUIRE_TOKEN_TEXT(',', ",");
+ REQUIRE_TOKEN_TEXT(vcfMETAKEY, "key2");
+ REQUIRE_TOKEN_TEXT('=', "=");
+ REQUIRE_TOKEN_TEXT(vcfMETAVALUE, "val2");
+ REQUIRE_TOKEN_TEXT('>', ">");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(HeaderLine, VcfScanFixture)
+{
+ InitScan("#CHROM\tPOS\n");
+ REQUIRE_TOKEN_TEXT(vcfHEADERITEM, "CHROM");
+ REQUIRE_TOKEN_TEXT(vcfHEADERITEM, "POS");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(DataItems, VcfScanFixture)
+{
+ InitScan("20\tNS=3;DP=14;AF=0.5;DB;H2\n");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "20");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "NS=3;DP=14;AF=0.5;DB;H2");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(DataLine_TrailingTab, VcfScanFixture)
+{
+ InitScan("20\tNS=3;DP=14;AF=0.5;DB;H2\t\n");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "20");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "NS=3;DP=14;AF=0.5;DB;H2");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+FIXTURE_TEST_CASE(DataLine_EOF, VcfScanFixture)
+{
+ InitScan("20\tNS=3;DP=14;AF=0.5;DB;H2");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "20");
+ REQUIRE_TOKEN_TEXT(vcfDATAITEM, "NS=3;DP=14;AF=0.5;DB;H2");
+ REQUIRE_TOKEN(vcfENDLINE);
+ REQUIRE_TOKEN(0);
+}
+
+// parser tests
+
+class VcfParseFixture
+{
+public:
+ VcfParseFixture()
+ : expectError(false)
+ {
+ pb.self = this;
+ pb.input = Input;
+ pb.error = Error;
+ pb.metaLine = AddMetaLine;
+ pb.openMetaLine = OpenMetaLine;
+ pb.closeMetaLine = CloseMetaLine;
+ pb.keyValue = KeyValue;
+ pb.headerItem = HeaderItem;
+ pb.openDataLine = OpenDataLine;
+ pb.dataItem = DataItem;
+ pb.closeDataLine = CloseDataLine;
+ }
+ ~VcfParseFixture()
+ {
+ VCFScan_yylex_destroy(&pb);
+ }
+
+protected:
+ static size_t Input(VCFParseBlock* pb, char* buf, size_t max_size)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ self.input.read(buf, max_size);
+ return self.input.gcount();
+ }
+ static void Error(VCFParseBlock* pb, const char* message)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ if (!self.expectError)
+ throw logic_error(string("VcfParseFixture::Error:") + message);
+ }
+
+ string TokenToString(const VCFToken& t)
+ {
+ return string(input.str().c_str() + t.tokenStart, t.tokenLength);
+ }
+
+ static void AddMetaLine(VCFParseBlock* pb, VCFToken* key, VCFToken* value)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ MetaLine::value_type p;
+ p.first = self.TokenToString(*key);
+ if (value)
+ p.second = self.TokenToString(*value);
+ MetaLine ml;
+ ml.push_back(p);
+ self.meta.push_back(ml);
+ }
+ static void OpenMetaLine(VCFParseBlock* pb, VCFToken* key)
+ {
+ AddMetaLine(pb, key, NULL);
+ }
+ static void CloseMetaLine(VCFParseBlock* pb)
+ {
+ }
+ static void KeyValue(VCFParseBlock* pb, VCFToken* key, VCFToken* value)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ MetaLine::value_type p;
+ p.first = self.TokenToString(*key);
+ p.second = self.TokenToString(*value);
+
+ self.meta.back().push_back(p);
+ }
+ static void HeaderItem(VCFParseBlock* pb, VCFToken* value)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ self.header.push_back(self.TokenToString(*value));
+ }
+ static void OpenDataLine(VCFParseBlock* pb)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ self.data.push_back(DataLine());
+ }
+ static void DataItem(VCFParseBlock* pb, VCFToken* value)
+ {
+ VcfParseFixture& self = *reinterpret_cast<VcfParseFixture*>(pb->self);
+ self.data.back().push_back(self.TokenToString(*value));
+ }
+ static void CloseDataLine(VCFParseBlock* pb)
+ {
+ }
+
+ void InitScan(const char* p_input, bool trace=false)
+ {
+ input.str(p_input);
+ VCFScan_yylex_init(&pb, trace);
+ }
+
+public:
+ VCFParseBlock pb;
+
+ istringstream input;
+
+ typedef vector<pair<string, string> > MetaLine;
+ vector<MetaLine> meta;
+
+ vector<string> header; // all tokens from the header line
+
+ typedef vector<string> DataLine;
+ vector<DataLine> data;
+
+ bool expectError;
+};
+
+// parser tests
+FIXTURE_TEST_CASE(EmptyFile, VcfParseFixture)
+{
+ InitScan("");
+ expectError = true;
+ REQUIRE_EQ( VCF_parse(&pb), 0 ); // EOF
+}
+
+// meta lines
+FIXTURE_TEST_CASE(FormatLineOnly, VcfParseFixture)
+{
+ InitScan("##fileformat=VCFv4.0\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "1\t2827693\t.\tCCGTC\tC\t.\tPASS\tSVTYPE=DEL\n");
+ REQUIRE_EQ( VCF_parse(&pb), 1 );
+ REQUIRE_EQ( meta.size(), (size_t)1 );
+ REQUIRE_EQ( meta[0].size(), (size_t)1 );
+ REQUIRE_EQ( meta[0][0].first, string("fileformat") );
+ REQUIRE_EQ( meta[0][0].second, string("VCFv4.0") );
+}
+
+FIXTURE_TEST_CASE(MetaLines, VcfParseFixture)
+{
+ InitScan("##fileformat=VCFv4.0\n"
+ "##fileDate=20090805\n"
+ "##source=myImputationProgramV3.1\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "1\t2827693\t.\tCCGTC\tC\t.\tPASS\tSVTYPE=DEL\n");
+ REQUIRE_EQ( VCF_parse(&pb), 1 ); // EOF
+ REQUIRE_EQ( meta.size(), (size_t)3 );
+
+ REQUIRE_EQ( meta[0].size(), (size_t)1 );
+ REQUIRE_EQ( meta[0][0].first, string("fileformat") );
+ REQUIRE_EQ( meta[0][0].second, string("VCFv4.0") );
+
+ REQUIRE_EQ( meta[1].size(), (size_t)1 );
+ REQUIRE_EQ( meta[1][0].first, string("fileDate") );
+ REQUIRE_EQ( meta[1][0].second, string("20090805") );
+
+ REQUIRE_EQ( meta[2].size(), (size_t)1 );
+ REQUIRE_EQ( meta[2][0].first, string("source") );
+ REQUIRE_EQ( meta[2][0].second, string("myImputationProgramV3.1") );
+}
+
+FIXTURE_TEST_CASE(Header, VcfParseFixture)
+{
+ InitScan("##fileformat=VCFv4.0\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "1\t2827693\t.\tCCGTC\tC\t.\tPASS\tSVTYPE=DEL\n");
+ REQUIRE_EQ( VCF_parse(&pb), 1 );
+ REQUIRE_EQ( header.size(), (size_t)8 );
+ REQUIRE_EQ( header[0], string("CHROM") );
+ REQUIRE_EQ( header[1], string("POS") );
+ REQUIRE_EQ( header[2], string("ID") );
+ REQUIRE_EQ( header[3], string("REF") );
+ REQUIRE_EQ( header[4], string("ALT") );
+ REQUIRE_EQ( header[5], string("QUAL") );
+ REQUIRE_EQ( header[6], string("FILTER") );
+ REQUIRE_EQ( header[7], string("INFO") );
+}
+
+FIXTURE_TEST_CASE(MetaHeaderData, VcfParseFixture)
+{
+ InitScan(
+ "##fileformat=VCFv4.0\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tNA00001\n"
+ "1\t2827693\t.\tCCGTC\tC\t.\tPASS\tSVTYPE=DEL;END=2827680;BKPTID=Pindel_LCS_D1099159;HOMLEN=1;HOMSEQ=C;SVLEN=-66\tGT:GQ\t1/1:13.9\n");
+ REQUIRE_EQ( VCF_parse(&pb), 1 );
+ REQUIRE_EQ( data.size(), (size_t)1 );
+
+ REQUIRE_EQ( data[0].size(), (size_t)10 );
+ REQUIRE_EQ( data[0][0], string("1") );
+ REQUIRE_EQ( data[0][1], string("2827693") );
+ REQUIRE_EQ( data[0][2], string(".") );
+ REQUIRE_EQ( data[0][3], string("CCGTC") );
+}
+
+FIXTURE_TEST_CASE(InfoLine, VcfParseFixture)
+{
+ InitScan("##fileformat=VCFv4.0\n"
+ "##INFO=<ID=DP,Number=1,Type=Integer,Description=\"Total Depth\">\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tNA00001\n"
+ "1\t2827693\t.\tCCGTC\tC\t.\tPASS\tSVTYPE=DEL\n");
+
+ REQUIRE_EQ( VCF_parse(&pb), 1 );
+ REQUIRE_EQ( meta.size(), (size_t)2 );
+ REQUIRE_EQ( meta[1].size(), (size_t)5 );
+ MetaLine& ml = meta[1];
+ REQUIRE_EQ( ml[0].first, string("INFO") );
+ REQUIRE_EQ( ml[0].second, string() );
+ REQUIRE_EQ( ml[1].first, string("ID") );
+ REQUIRE_EQ( ml[1].second, string("DP") );
+ REQUIRE_EQ( ml[2].first, string("Number") );
+ REQUIRE_EQ( ml[2].second, string("1") );
+ REQUIRE_EQ( ml[3].first, string("Type") );
+ REQUIRE_EQ( ml[3].second, string("Integer") );
+ REQUIRE_EQ( ml[4].first, string("Description") );
+ REQUIRE_EQ( ml[4].second, string("\"Total Depth\"") );
+}
+
+
+// data lines
+FIXTURE_TEST_CASE(MultiipleDataLines, VcfParseFixture)
+{
+ InitScan(
+ "##fileformat=VCFv4.0\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tNA00001\n"
+ "1\t2827693\n"
+ "2\t3\n");
+ REQUIRE_EQ( VCF_parse(&pb), 1 );
+ REQUIRE_EQ( data.size(), (size_t)2 );
+
+ REQUIRE_EQ( data[0].size(), (size_t)2 );
+ REQUIRE_EQ( data[0][0], string("1") );
+ REQUIRE_EQ( data[0][1], string("2827693") );
+
+ REQUIRE_EQ( data[1].size(), (size_t)2 );
+ REQUIRE_EQ( data[1][0], string("2") );
+ REQUIRE_EQ( data[1][1], string("3") );
+}
+
+// VcfReader
+
+class VcfReaderFixture
+{
+public:
+ VcfReaderFixture()
+ : reader(0), messages(0), messageCount(0)
+ {
+ if (KDirectoryNativeDir(&wd) != 0)
+ throw logic_error(string("VcfReaderFixture: KDirectoryNativeDir failed"));
+
+ if (VcfReaderMake((const VcfReader**)&reader) != 0)
+ throw logic_error(string("VcfReaderFixture: VcfReaderMake failed"));
+ }
+ ~VcfReaderFixture()
+ {
+ KDirectoryRemove(wd, true, filename.c_str());
+
+ if (reader != 0 && VcfReaderWhack(reader) != 0)
+ throw logic_error(string("~VcfReaderFixture: VcfReaderWhack failed"));
+
+ if (KDirectoryRelease(wd) != 0)
+ throw logic_error(string("~VcfReaderFixture: KDirectoryRelease failed"));
+ }
+
+ rc_t CreateFile(const char* p_filename, const char* contents)
+ {
+ KDirectoryRemove(wd, true, p_filename);
+
+ filename = p_filename;
+
+ KFile* file;
+ rc_t rc = KDirectoryCreateFile(wd, &file, true, 0664, kcmInit, p_filename);
+ if (rc == 0)
+ {
+ size_t num_writ=0;
+ rc = KFileWrite(file, 0, contents, strlen(contents), &num_writ);
+ if (rc == 0)
+ rc = KFileRelease(file);
+ else
+ KFileRelease(file);
+ }
+ return rc;
+ }
+
+ rc_t ParseFile(const char* p_filename)
+ {
+ messages = 0;
+ messageCount = 0;
+
+ KFile* file;
+ rc_t rc = KDirectoryOpenFileRead(wd, (const KFile**)&file, p_filename);
+ if (rc == 0)
+ {
+ rc = VcfReaderParse(reader, file, &messages);
+ if (messages != NULL)
+ {
+ rc_t rc2 = VNameListCount(messages, &messageCount);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ if (rc == 0)
+ rc = KFileRelease(file);
+ else
+ KFileRelease(file);
+ }
+ return rc;
+ }
+
+ KDirectory* wd;
+ VcfReader *reader;
+ string filename;
+ const struct VNamelist* messages;
+ uint32_t messageCount;
+};
+
+FIXTURE_TEST_CASE(VcfReader_EmptyFile, VcfReaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(), ""));
+ REQUIRE_RC_FAIL(ParseFile(GetName()));
+ REQUIRE_NOT_NULL(messages);
+ REQUIRE_EQ(1u, messageCount);
+ const char* msg;
+ REQUIRE_RC(VNameListGet ( messages, 0, &msg ));
+ REQUIRE_EQ(string("Empty file"), string(msg));
+}
+
+static string StringToSTL(const String& str)
+{
+ return string(str.addr, str.len);
+}
+
+FIXTURE_TEST_CASE(VcfReader_Parse, VcfReaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(),
+ // this is taken from the spec:
+ // http://www.1000genomes.org/wiki/analysis/variant-call-format/vcf-variant-call-format-version-42
+ "##fileformat=VCFv4.2\n"
+ "##fileDate=20090805\n"
+ "##source=myImputationProgramV3.1\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "20\t14370\trs6054257\tG\tA\t29\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\n"
+ "20\t17330\t.\tT\tA\t3\tq10\tNS=3;DP=11;AF=0.017\n"
+ ));
+ REQUIRE_RC(ParseFile(GetName()));
+
+ uint32_t count;
+ REQUIRE_RC(VcfReaderGetDataLineCount(reader, &count));
+ REQUIRE_EQ(2u, count);
+
+ const VcfDataLine* line;
+ REQUIRE_RC(VcfReaderGetDataLine(reader, 0, &line));
+ REQUIRE_NOT_NULL(line);
+ REQUIRE_EQ(string("20"), StringToSTL(line->chromosome));
+ REQUIRE_EQ(14370u, line->position);
+ REQUIRE_EQ(string("rs6054257"), StringToSTL(line->id));
+ REQUIRE_EQ(string("G"), StringToSTL(line->refBases));
+ REQUIRE_EQ(string("A"), StringToSTL(line->altBases));
+ REQUIRE_EQ(29u, (unsigned int)line->quality);
+ REQUIRE_EQ(string("PASS"), StringToSTL(line->filter));
+ REQUIRE_EQ(string("NS=3;DP=14;AF=0.5;DB;H2"), StringToSTL(line->info));
+
+ REQUIRE_RC(VcfReaderGetDataLine(reader, 1, &line));
+ REQUIRE_NOT_NULL(line);
+ REQUIRE_EQ(string("20"), StringToSTL(line->chromosome));
+ REQUIRE_EQ(17330u, line->position);
+ REQUIRE_EQ(string("."), StringToSTL(line->id));
+ REQUIRE_EQ(string("T"), StringToSTL(line->refBases));
+ REQUIRE_EQ(string("A"), StringToSTL(line->altBases));
+ REQUIRE_EQ(3u, (unsigned int)line->quality);
+ REQUIRE_EQ(string("q10"), StringToSTL(line->filter));
+ REQUIRE_EQ(string("NS=3;DP=11;AF=0.017"), StringToSTL(line->info));
+
+ REQUIRE_RC(VcfReaderGetDataLine(reader, 2, &line));
+ REQUIRE_NULL(line);
+}
+
+FIXTURE_TEST_CASE(VcfReader_Parse_GenotypeFields, VcfReaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(),
+ "##fileformat=VCFv4.2\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "20\t14370\trs6054257\tG\tA\t29\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\tblah1\t2blah\tetc...\n"
+ ));
+ REQUIRE_RC(ParseFile(GetName()));
+
+ const VcfDataLine* line;
+ REQUIRE_RC(VcfReaderGetDataLine(reader, 0, &line));
+ REQUIRE_NOT_NULL(line);
+
+ uint32_t fieldCount;
+ REQUIRE_RC( VNameListCount(line->genotypeFields, &fieldCount) );
+ REQUIRE_EQ(3u, fieldCount);
+
+ const char* name;
+
+ REQUIRE_RC(VNameListGet ( line->genotypeFields, 0, &name ));
+ REQUIRE_NOT_NULL(name);
+ REQUIRE_EQ(string("blah1"), string(name));
+
+ REQUIRE_RC(VNameListGet ( line->genotypeFields, 1, &name ));
+ REQUIRE_NOT_NULL(name);
+ REQUIRE_EQ(string("2blah"), string(name));
+
+ REQUIRE_RC(VNameListGet ( line->genotypeFields, 2, &name ));
+ REQUIRE_NOT_NULL(name);
+ REQUIRE_EQ(string("etc..."), string(name));
+}
+
+FIXTURE_TEST_CASE(VcfReader_Parse_Errors, VcfReaderFixture)
+{
+ REQUIRE_RC(CreateFile(GetName(),
+ "##fileformat=VCFv4.2\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "20\t14370\trs6054257\tG\tA\t1000\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\tblah1\t2blah\tetc...\n"
+ "20\t14370\trs6054257\tG\tA\t10\tPASS\n"
+ )); // 1. 1000 is too much for a quality
+ // 2. not all mandatory fields present
+ REQUIRE_RC_FAIL(ParseFile(GetName()));
+ REQUIRE_EQ(2u, messageCount);
+ const char* msg;
+ REQUIRE_RC(VNameListGet ( messages, 0, &msg ));
+ REQUIRE_EQ(string("line 3 column 24: invalid numeric value for 'quality'"), string(msg));
+ REQUIRE_RC(VNameListGet ( messages, 1, &msg ));
+ REQUIRE_EQ(string("line 4 column 31: one or more of the 8 mandatory columns are missing"), string(msg));
+}
+
+// VcfDatabase
+class VcfDatabaseFixture : public VcfReaderFixture
+{
+public:
+ VcfDatabaseFixture()
+ {
+ if (VDBManagerMakeUpdate(&m_vdbMgr, wd) != 0)
+ throw logic_error(string("VcfDatabaseFixture(): VDBManagerMakeUpdate failed"));
+ }
+ ~VcfDatabaseFixture()
+ {
+ if (VDBManagerRelease(m_vdbMgr) != 0)
+ throw logic_error(string("~VcfDatabaseFixture: VDBManagerRelease failed"));
+ }
+
+ void Setup(const string& p_caseName)
+ {
+ m_dbName = p_caseName+".db";
+ m_cfgName = p_caseName+".cfg";
+
+ KDirectoryRemove(wd, true, m_dbName.c_str());
+
+ if (VDBManagerMakeSchema(m_vdbMgr, &m_schema) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Setup: VDBManagerMakeSchema failed"));
+
+ if (VSchemaParseText ( m_schema, "vcf_schema", schema_text, string_measure(schema_text, NULL) ) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Setup: VSchemaParseText failed"));
+
+ if (VDBManagerCreateDB(m_vdbMgr, &m_db, m_schema, "vcf", kcmCreate | kcmMD5, m_dbName.c_str()) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Setup: VDBManagerCreateDB failed"));
+
+ if (CreateFile(m_cfgName.c_str(), "20 CM000682.1"))
+ throw logic_error(string("VcfDatabaseFixture::Setup: CreateFile failed"));
+ }
+ void Teardown()
+ {
+ if (VDatabaseRelease(m_db) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Teardown: VDatabaseRelease failed"));
+ if (VSchemaRelease(m_schema) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Teardown: VSchemaRelease failed"));
+ // this remove fails on Windows for unexplained reasons ("access denied" to <dbname>/tbl/REFERENCE/col), so ignore the result:
+ KDirectoryRemove(wd, true, m_dbName.c_str());
+ if (KDirectoryRemove(wd, true, m_cfgName.c_str()) != 0)
+ throw logic_error(string("VcfDatabaseFixture::Teardown: KDirectoryRemove(m_cfgName) failed"));
+ }
+
+protected:
+ static const char schema_text[];
+ static const uint32_t basesPerRow = 5000;
+
+ VDBManager* m_vdbMgr;
+ VSchema* m_schema;
+ VDatabase* m_db;
+ string m_cfgName;
+ string m_dbName;
+};
+
+const char VcfDatabaseFixture::schema_text[] =
+"version 1; "
+
+"include 'align/align.vschema';"
+
+" table variant #1 { "
+" extern column U32 ref_id = .ref_id;"
+" physical column U32 .ref_id = ref_id;"
+
+" extern column U32 position = .position;"
+" physical column U32 .position = position;"
+
+" extern column U32 length = .length;"
+" physical column U32 .length = length;"
+
+" extern column ascii sequence = .sequence;"
+" physical column ascii .sequence = sequence;"
+
+" };"
+
+" table variant_phase #1 { "
+" extern column U32 variant_id = .variant_id;"
+" physical column U32 .variant_id = variant_id;"
+
+" extern column U32 phase = .phase;"
+" physical column U32 .phase = phase;"
+" };"
+
+" table alignment #1 { "
+" extern column U32 align_id = .align_id;"
+" physical column U32 .align_id = align_id;"
+
+" extern column U32 ref_id = .ref_id;"
+" physical column U32 .ref_id = ref_id;"
+
+" extern column U32 position = .position;"
+" physical column U32 .position = position;"
+
+" extern column U32 phase = .phase;"
+" physical column U32 .phase = phase;"
+
+" extern column ascii cigar = .cigar;"
+" physical column ascii .cigar = cigar;"
+
+" extern column ascii mismatch = .mismatch;"
+" physical column ascii .mismatch = mismatch;"
+
+" };"
+
+"database vcf #1 { "
+" table NCBI:align:tbl:reference #2 REFERENCE;"
+" table variant #1 VARIANT;"
+" table variant_phase #1 VARIANT_PHASE;"
+" table alignment #1 ALIGNMENT;"
+"};";
+
+FIXTURE_TEST_CASE(VcfDatabase_GetReference, VcfDatabaseFixture)
+{
+ // this would be better done as a unit test on the ReferenceSeq interface
+ // (there is no appropriate suite for that at this point)
+ Setup(GetName());
+ const ReferenceMgr* refMgr;
+ REQUIRE_RC(ReferenceMgr_Make(&refMgr, m_db, m_vdbMgr, 0, m_cfgName.c_str(), NULL, 0, 0, 0));
+ const ReferenceSeq* seq;
+ bool dummy1 = false;
+ bool dummy2 = false;
+ REQUIRE_RC(ReferenceMgr_GetSeq(refMgr, &seq, "20", &dummy1, false, &dummy2));
+
+ INSDC_coord_zero coord = 14370;
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ uint64_t global_ref_start;
+ REQUIRE_RC(ReferenceSeq_TranslateOffset_int(seq, coord, &ref_id, &ref_start, &global_ref_start));
+ REQUIRE_EQ(ref_id, (int64_t)(1 + coord / basesPerRow));
+ REQUIRE_EQ(ref_start, (INSDC_coord_zero)(coord % basesPerRow));
+ REQUIRE_EQ(global_ref_start, (uint64_t)coord);
+
+ REQUIRE_RC(ReferenceSeq_Release(seq));
+ REQUIRE_RC(ReferenceMgr_Release(refMgr, true, NULL, false, NULL));
+ Teardown();
+}
+
+FIXTURE_TEST_CASE(VcfDatabaseBasic, VcfDatabaseFixture)
+{
+ Setup(GetName());
+
+ REQUIRE_RC(CreateFile(GetName(),
+ // this is taken from the spec:
+ // http://www.1000genomes.org/wiki/analysis/variant-call-format/vcf-variant-call-format-version-42
+ "##fileformat=VCFv4.2\n"
+ "##fileDate=20090805\n"
+ "##source=myImputationProgramV3.1\n"
+ "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n"
+ "20\t14370\trs6054257\tG\tCCCC\t29\tPASS\tNS=3;DP=14;AF=0.5;DB;H2\n"
+ "20\t17330\t.\tT\tA\t3\tq10\tNS=3;DP=11;AF=0.017\n"
+ ));
+ REQUIRE_RC(ParseFile(GetName()));
+
+ REQUIRE_RC(VcfDatabaseSave(reader, m_cfgName.c_str(), m_db));
+
+ // verify
+ const VTable *tbl;
+ REQUIRE_RC(VDBManagerOpenTableRead(m_vdbMgr, &tbl, m_schema, (m_dbName+"/tbl/VARIANT").c_str()));
+ VCursor *cur;
+ REQUIRE_RC(VTableCreateCursorRead( tbl, (const VCursor**)&cur ));
+
+ uint32_t ref_id_idx, position_idx, length_idx, sequence_idx;
+ REQUIRE_RC(VCursorAddColumn( cur, &ref_id_idx, "ref_id" ));
+ REQUIRE_RC(VCursorAddColumn( cur, &position_idx, "position" ));
+ REQUIRE_RC(VCursorAddColumn( cur, &length_idx, "length" ));
+ REQUIRE_RC(VCursorAddColumn( cur, &sequence_idx, "sequence" ));
+
+ REQUIRE_RC(VCursorOpen( cur ));
+
+ char buf[256];
+ uint32_t row_len;
+ const uint32_t elemBits = 8;
+
+ int64_t rowId = 1;
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 1, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(8u, row_len);
+ REQUIRE_EQ(3u, *(uint32_t*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 2, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(sizeof(INSDC_coord_zero), (size_t)row_len);
+ REQUIRE_EQ((INSDC_coord_zero)(14370u % basesPerRow), *(INSDC_coord_zero*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 3, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(sizeof(uint32_t), (size_t)row_len);
+ REQUIRE_EQ(4u, *(uint32_t*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 4, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(4u, row_len);
+ REQUIRE_EQ(string(buf, 4), string("CCCC"));
+
+ rowId = 2;
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 1, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(8u, row_len);
+ REQUIRE_EQ(4u, *(uint32_t*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 2, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(sizeof(INSDC_coord_zero), (size_t)row_len);
+ REQUIRE_EQ((INSDC_coord_zero)(17330u % basesPerRow), *(INSDC_coord_zero*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 3, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(sizeof(uint32_t), (size_t)row_len);
+ REQUIRE_EQ(1u, *(uint32_t*)buf);
+
+ REQUIRE_RC(VCursorReadDirect(cur, rowId, 4, elemBits, buf, sizeof(buf), &row_len ));
+ REQUIRE_EQ(1u, row_len);
+ REQUIRE_EQ(string(buf, 1), string("A"));
+
+ rowId = 3;
+ REQUIRE_RC_FAIL(VCursorReadDirect(cur, rowId, 1, elemBits, buf, sizeof(buf), &row_len ));
+
+ REQUIRE_RC(VCursorRelease(cur));
+ REQUIRE_RC(VTableRelease(tbl));
+ Teardown();
+}
+
+//////////////////////////////////////////// Main
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+extern "C"
+{
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+
+const char UsageDefaultName[] = "vcf-loader-test";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ( "Usage:\n" "\t%s [options] -o path\n\n", progname );
+}
+
+rc_t CC Usage( const Args* args )
+{
+ return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ KConfigDisableUserSettings();
+
+ rc_t rc = VcfLoaderTestSuite(argc, argv);
+ return rc;
+}
+
+}
+
diff --git a/test/vdb-copy/Makefile b/test/vdb-copy/Makefile
new file mode 100644
index 0000000..6e52fe4
--- /dev/null
+++ b/test/vdb-copy/Makefile
@@ -0,0 +1,49 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vdb-copy
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+$(TEST_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+runtests: check_exit_code
+
+#-------------------------------------------------------------------------------
+# scripted tests
+#
+
+check_exit_code:
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/vdb-copy
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
diff --git a/test/vdb-dump/Makefile b/test/vdb-dump/Makefile
new file mode 100644
index 0000000..5449f2c
--- /dev/null
+++ b/test/vdb-dump/Makefile
@@ -0,0 +1,104 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vdb-dump
+
+TEST_TOOLS =
+
+include $(TOP)/build/Makefile.env
+
+EXT_TOOLS = \
+ vdb-dump-makedb
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TEST_TOOLS)
+
+runtests: vdb-dump
+
+#-------------------------------------------------------------------------------
+# vdb-dump-makedb
+# Create test databases
+MAKEDB_SRC = \
+ makedb
+
+MAKEDB_OBJ = \
+ $(addsuffix .$(OBJX),$(MAKEDB_SRC))
+
+MAKEDB_LIB = \
+ -skapp \
+ -sktst \
+ -sncbi-wvdb \
+
+$(BINDIR)/vdb-dump-makedb: $(MAKEDB_OBJ)
+ $(LP) --exe -o $@ $^ $(MAKEDB_LIB)
+
+makedb:
+ @ cd $(SRCDIR); rm -rf data; mkdir -p data; $(BINDIR)/vdb-dump-makedb
+
+#-------------------------------------------------------------------------------
+# run tests for vdb-dump
+vdb-dump: makedb
+ @ rm -rf actual
+ @ mkdir -p actual
+ @ echo "testing vdb-dump..."
+ @ # output format
+ @ $(BINDIR)/vdb-dump SRR056386 -R 1 -C READ -f tab >actual/1.0.stdout && diff expected/1.0.stdout actual/1.0.stdout
+ @ $(BINDIR)/vdb-dump SRR056386 -R 1 -C READ -f tab -I >actual/1.1.stdout && diff expected/1.1.stdout actual/1.1.stdout
+ @ # nested databases
+ @ $(BINDIR)/vdb-dump -E data/NestedDatabase >actual/2.0.stdout && diff expected/2.0.stdout actual/2.0.stdout
+ @ $(BINDIR)/vdb-dump -T SUBDB_1.SUBSUBDB_1.TABLE1 data/NestedDatabase >actual/2.1.stdout && diff expected/2.1.stdout actual/2.1.stdout
+ @ $(BINDIR)/vdb-dump -T SUBDB_1.SUBSUBDB_2.TABLE2 data/NestedDatabase >actual/2.2.stdout && diff expected/2.2.stdout actual/2.2.stdout
+ @ rm -rf actual
+ @ rm -rf data
+ @ python $(TOP)/build/check-exit-code.py $(BINDIR)/vdb-dump
+ @ echo "...all tests passed"
+
+.PHONY: kar
+
diff --git a/test/vdb-dump/expected/1.0.stdout b/test/vdb-dump/expected/1.0.stdout
new file mode 100644
index 0000000..8645a27
--- /dev/null
+++ b/test/vdb-dump/expected/1.0.stdout
@@ -0,0 +1 @@
+TCAGAATTACTTGAGGCTGCACACCATTCAAGTTGTCATGAGACACGTCATCAAGAGGCACTTCCACGTCGACATCTGCGGCAGTCTAACCGTCTGTATTAATGTTGTAATTACTTTCCATTTACTGATTTGATGTTAAAACAAATTTAATTAATTTATAACAATTTAACTTAAATCCTTCTTAATCTCTTTAAATGAACTGAGGGGGTTTTGGGGGTTTTTGGGGTTTTTGGGGGTTTTTGGGGGTCGTGCCACGCTTACCGTACATCCGCCTTGGCCTGAGACTGCCAAAGGGCACCACAGGGGGGGGATTAAGGGGN
diff --git a/test/vdb-dump/expected/1.1.stdout b/test/vdb-dump/expected/1.1.stdout
new file mode 100644
index 0000000..77cc039
--- /dev/null
+++ b/test/vdb-dump/expected/1.1.stdout
@@ -0,0 +1 @@
+1 TCAGAATTACTTGAGGCTGCACACCATTCAAGTTGTCATGAGACACGTCATCAAGAGGCACTTCCACGTCGACATCTGCGGCAGTCTAACCGTCTGTATTAATGTTGTAATTACTTTCCATTTACTGATTTGATGTTAAAACAAATTTAATTAATTTATAACAATTTAACTTAAATCCTTCTTAATCTCTTTAAATGAACTGAGGGGGTTTTGGGGGTTTTTGGGGTTTTTGGGGGTTTTTGGGGGTCGTGCCACGCTTACCGTACATCCGCCTTGGCCTGAGACTGCCAAAGGGCACCACAGGGGGGGGATTAAGGGGN
diff --git a/test/vdb-dump/expected/2.0.stdout b/test/vdb-dump/expected/2.0.stdout
new file mode 100644
index 0000000..96d6437
--- /dev/null
+++ b/test/vdb-dump/expected/2.0.stdout
@@ -0,0 +1,15 @@
+enumerating the tables of database 'data/NestedDatabase'
+db : SUBDB_1
+ db : SUBSUBDB_1
+ tbl : TABLE1
+ db : SUBSUBDB_2
+ tbl : TABLE2
+ tbl : TABLE1
+db : SUBDB_2
+ db : SUBSUBDB_1
+ tbl : TABLE1
+ db : SUBSUBDB_2
+ tbl : TABLE2
+ tbl : TABLE2
+tbl : TABLE1
+tbl : TABLE2
diff --git a/test/vdb-dump/expected/2.1.stdout b/test/vdb-dump/expected/2.1.stdout
new file mode 100644
index 0000000..aacb50a
--- /dev/null
+++ b/test/vdb-dump/expected/2.1.stdout
@@ -0,0 +1,4 @@
+col: 1-1/1
+
+col: 1-1/2
+
diff --git a/test/vdb-dump/expected/2.2.stdout b/test/vdb-dump/expected/2.2.stdout
new file mode 100644
index 0000000..0114a14
--- /dev/null
+++ b/test/vdb-dump/expected/2.2.stdout
@@ -0,0 +1,4 @@
+col: 2-2/1
+
+col: 2-2/2
+
diff --git a/test/vdb-dump/makedb.cpp b/test/vdb-dump/makedb.cpp
new file mode 100644
index 0000000..d32998b
--- /dev/null
+++ b/test/vdb-dump/makedb.cpp
@@ -0,0 +1,229 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/**
+* Create test databases for vdb-dump
+*/
+
+#include <fstream>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+using namespace std;
+
+#define CHECK_RC(call) { rc_t rc = call; if ( rc != 0 ) return rc; }
+
+rc_t
+AddRow ( VCursor* p_curs, int64_t p_rowId, uint32_t p_colIdx, const string& p_value )
+{
+ CHECK_RC ( VCursorSetRowId ( p_curs, p_rowId ) );
+ CHECK_RC ( VCursorOpenRow ( p_curs ) );
+ CHECK_RC ( VCursorWrite ( p_curs, p_colIdx, 8, p_value.c_str(), 0, p_value.size() ) );
+ CHECK_RC ( VCursorCommitRow ( p_curs ) );
+ CHECK_RC ( VCursorCloseRow ( p_curs ) );
+ CHECK_RC ( VCursorCommit ( p_curs ) );
+ return 0;
+}
+
+rc_t
+NestedDatabase()
+{
+ const string ScratchDir = "./data/";
+ const string DefaultSchemaText =
+ "table table1 #1.0.0 { column ascii col; };\n"
+ "table table2 #1.0.0 { column ascii col; };\n"
+
+ "database database1_1 #1 { table table1 #1 TABLE1; };\n"
+ "database database1_2 #1 { table table2 #1 TABLE2; };\n"
+
+ "database database1 #1\n"
+ "{\n"
+ " database database1_1 #1 SUBSUBDB_1;\n"
+ " database database1_2 #1 SUBSUBDB_2;\n"
+ " table table1 #1 TABLE1;\n"
+ "};\n"
+
+ "database database2 #1\n"
+ "{\n"
+ " database database1_1 #1 SUBSUBDB_1;\n"
+ " database database1_2 #1 SUBSUBDB_2;\n"
+ " table table2 #1 TABLE2;\n"
+ "};\n"
+
+ "database root_database #1\n"
+ "{\n"
+ " database database1 #1 SUBDB_1;\n"
+ " database database2 #1 SUBDB_2;\n"
+ " table table1 #1 TABLE1;\n"
+ " table table2 #1 TABLE2;\n"
+ " };\n"
+ ;
+ const string DefaultDatabase = "root_database";
+
+ VDBManager* mgr;
+ CHECK_RC ( VDBManagerMakeUpdate ( & mgr, NULL ) );
+ VSchema* schema;
+ CHECK_RC ( VDBManagerMakeSchema ( mgr, & schema ) );
+ CHECK_RC ( VSchemaParseText ( schema, NULL, DefaultSchemaText.c_str(), DefaultSchemaText.size() ) );
+
+ VDatabase* db;
+ CHECK_RC ( VDBManagerCreateDB ( mgr,
+ & db,
+ schema,
+ DefaultDatabase . c_str(),
+ kcmInit + kcmMD5,
+ "%s",
+ ( ScratchDir + "NestedDatabase" ) . c_str() ) );
+
+ { // SUBDB_1
+ VDatabase *db1;
+ CHECK_RC ( VDatabaseCreateDB ( db, & db1, "SUBDB_1", kcmInit + kcmMD5, "SUBDB_1" ) );
+ { // SUBSUBDB_1
+ VDatabase *db1_1;
+ CHECK_RC ( VDatabaseCreateDB ( db1, & db1_1, "SUBSUBDB_1", kcmInit + kcmMD5, "SUBSUBDB_1" ) );
+ { // TABLE1
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db1_1, & tab, "TABLE1", kcmInit + kcmMD5, "TABLE1" ) );
+ VCursor *curs;
+ CHECK_RC ( VTableCreateCursorWrite ( tab, & curs, kcmInsert ) ) ;
+ uint32_t idx;
+ CHECK_RC ( VCursorAddColumn ( curs, & idx, "col" ) );
+ CHECK_RC ( VCursorOpen ( curs ) );
+ CHECK_RC ( AddRow ( curs, 1, idx, "1-1/1" ) );
+ CHECK_RC ( AddRow ( curs, 2, idx, "1-1/2" ) );
+ CHECK_RC ( VCursorRelease ( curs ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db1_1 ) );
+ }
+ { // SUBSUBDB_2
+ VDatabase *db1_2;
+ CHECK_RC ( VDatabaseCreateDB ( db1, & db1_2, "SUBSUBDB_2", kcmInit + kcmMD5, "SUBSUBDB_2" ) );
+ { // TABLE2
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db1_2, & tab, "TABLE2", kcmInit + kcmMD5, "TABLE2" ) );
+ VCursor *curs;
+ CHECK_RC ( VTableCreateCursorWrite ( tab, & curs, kcmInsert ) ) ;
+ uint32_t idx;
+ CHECK_RC ( VCursorAddColumn ( curs, & idx, "col" ) );
+ CHECK_RC ( VCursorOpen ( curs ) );
+ CHECK_RC ( AddRow ( curs, 1, idx, "2-2/1" ) );
+ CHECK_RC ( AddRow ( curs, 2, idx, "2-2/2" ) );
+ CHECK_RC ( VCursorRelease ( curs ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db1_2 ) );
+ }
+ { // TABLE1
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db1, & tab, "TABLE1", kcmInit + kcmMD5, "TABLE1" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db1 ) );
+ }
+ { // SUBDB_2
+ VDatabase *db2;
+ CHECK_RC ( VDatabaseCreateDB ( db, & db2, "SUBDB_2", kcmInit + kcmMD5, "SUBDB_2" ) );
+ { // SUBSUBDB_1
+ VDatabase *db2_1;
+ CHECK_RC ( VDatabaseCreateDB ( db2, & db2_1, "SUBSUBDB_1", kcmInit + kcmMD5, "SUBSUBDB_1" ) );
+ { // TABLE1
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db2_1, & tab, "TABLE1", kcmInit + kcmMD5, "TABLE1" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db2_1 ) );
+ }
+ { // SUBSUBDB_2
+ VDatabase *db2_2;
+ CHECK_RC ( VDatabaseCreateDB ( db2, & db2_2, "SUBSUBDB_2", kcmInit + kcmMD5, "SUBSUBDB_2" ) );
+ { // TABLE2
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db2_2, & tab, "TABLE2", kcmInit + kcmMD5, "TABLE2" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db2_2 ) );
+ }
+ { // TABLE2
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db2, & tab, "TABLE2", kcmInit + kcmMD5, "TABLE2" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ CHECK_RC ( VDatabaseRelease ( db2 ) );
+ }
+
+ { // TABLE1
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db, & tab, "TABLE1", kcmInit + kcmMD5, "TABLE1" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+ { // TABLE2
+ VTable *tab;
+ CHECK_RC ( VDatabaseCreateTable ( db, & tab, "TABLE2", kcmInit + kcmMD5, "TABLE2" ) );
+ CHECK_RC ( VTableRelease ( tab ) );
+ }
+
+ CHECK_RC ( VSchemaRelease ( schema ) );
+ CHECK_RC ( VDatabaseRelease ( db ) );
+ CHECK_RC ( VDBManagerRelease ( mgr ) );
+ return 0;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kfg/config.h>
+
+ver_t CC KAppVersion ( void )
+{
+ return 0x1000000;
+}
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "makedb";
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ KConfigDisableUserSettings();
+
+ return NestedDatabase();
+}
+
+}
diff --git a/test/vdb-validate/Makefile b/test/vdb-validate/Makefile
new file mode 100644
index 0000000..934a9f2
--- /dev/null
+++ b/test/vdb-validate/Makefile
@@ -0,0 +1,66 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vdb-validate
+
+TEST_TOOLS = \
+
+ALL_TOOLS = \
+ $(TEST_TOOLS) \
+
+include $(TOP)/build/Makefile.env
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+.PHONY: $(TEST_TOOLS)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# ref-variation tool tests
+#
+runtests: vdb-validate
+
+vdb-validate: $(BINDIR)/vdb-validate
+ @ echo "Starting vdb-validate tests..."
+ @ rm -rf actual/
+ @ mkdir actual/
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_len_mismatch.csra" no_sdc_checks 0
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_tmp_mismatch.csra --sdc:rows 100%" sdc_tmp_mismatch 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_pa_longer.csra --sdc:rows 100%" sdc_pa_longer_1 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_pa_longer.csra --sdc:rows 100% --sdc:plen_thold 50%" sdc_pa_longer_2 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_pa_longer.csra --sdc:rows 100% --sdc:plen_thold 51%" sdc_pa_longer_3 0
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_len_mismatch.csra --sdc:rows 100% --sdc:plen_thold 1%" sdc_len_mismatch_1 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_len_mismatch.csra --sdc:rows 100% --sdc:plen_thold 100%" sdc_len_mismatch_2 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_seq_cmp_read_len_corrupt.csra --sdc:seq-rows 100%" sdc_seq_cmp_read_len_corrupt 3
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/sdc_seq_cmp_read_len_fixed.csra --sdc:seq-rows 100%" sdc_seq_cmp_read_len_fixed 0
+ @ ./runtestcase.sh "$(BINDIR)/vdb-validate db/blob-row-gap.kar" ROW_GAP 0
+ @ echo "All vdb-validate tests succeed"
+ @ rm -rf actual/
+
diff --git a/test/vdb-validate/db/blob-row-gap.kar b/test/vdb-validate/db/blob-row-gap.kar
new file mode 100644
index 0000000..9b6bdd8
Binary files /dev/null and b/test/vdb-validate/db/blob-row-gap.kar differ
diff --git a/test/vdb-validate/db/sdc_len_mismatch.csra b/test/vdb-validate/db/sdc_len_mismatch.csra
new file mode 100644
index 0000000..52afee0
Binary files /dev/null and b/test/vdb-validate/db/sdc_len_mismatch.csra differ
diff --git a/test/vdb-validate/db/sdc_pa_longer.csra b/test/vdb-validate/db/sdc_pa_longer.csra
new file mode 100644
index 0000000..3e767a5
Binary files /dev/null and b/test/vdb-validate/db/sdc_pa_longer.csra differ
diff --git a/test/vdb-validate/db/sdc_seq_cmp_read_len_corrupt.csra b/test/vdb-validate/db/sdc_seq_cmp_read_len_corrupt.csra
new file mode 100644
index 0000000..e26e354
Binary files /dev/null and b/test/vdb-validate/db/sdc_seq_cmp_read_len_corrupt.csra differ
diff --git a/test/vdb-validate/db/sdc_seq_cmp_read_len_fixed.csra b/test/vdb-validate/db/sdc_seq_cmp_read_len_fixed.csra
new file mode 100644
index 0000000..0810af0
Binary files /dev/null and b/test/vdb-validate/db/sdc_seq_cmp_read_len_fixed.csra differ
diff --git a/test/vdb-validate/db/sdc_tmp_mismatch.csra b/test/vdb-validate/db/sdc_tmp_mismatch.csra
new file mode 100644
index 0000000..a34c387
Binary files /dev/null and b/test/vdb-validate/db/sdc_tmp_mismatch.csra differ
diff --git a/test/vdb-validate/expected/ROW_GAP b/test/vdb-validate/expected/ROW_GAP
new file mode 100644
index 0000000..17532f7
--- /dev/null
+++ b/test/vdb-validate/expected/ROW_GAP
@@ -0,0 +1,42 @@
+info: Database 'blob-row-gap.kar' metadata: md5 ok
+info: Table 'FEATURE' metadata: md5 ok
+info: Column 'FEAT_TYPE': checksums ok
+info: Column 'LOC_LEN': checksums ok
+info: Column 'LOC_ROW_ID': checksums ok
+info: Column 'LOC_SEQ_TYPE': checksums ok
+info: Column 'LOC_START': checksums ok
+info: Column 'LOC_STRAND': checksums ok
+info: Column 'PRODUCT_LEN': checksums ok
+info: Column 'PRODUCT_ROW_ID': checksums ok
+info: Column 'PRODUCT_SEQ_TYPE': checksums ok
+info: Column 'PRODUCT_START': checksums ok
+info: Column 'SEQ_FEAT': checksums ok
+info: Table 'GI_IDX' metadata: md5 ok
+info: Column 'NUC_ROW_ID': checksums ok
+info: Column 'PROT_ROW_ID': checksums ok
+info: Table 'PROTEIN' metadata: md5 ok
+info: Column 'DESCR': checksums ok
+info: Column 'FEAT_PRODUCT_ROW_ID': checksums ok
+info: Column 'FEAT_ROW_END': checksums ok
+info: Column 'FEAT_ROW_START': checksums ok
+info: Column 'GI': checksums ok
+info: Column 'HASH': checksums ok
+info: Column 'PROTEIN': checksums ok
+info: Column 'PROTEIN_LEN': checksums ok
+info: Column 'PROTEIN_NAME': checksums ok
+info: Column 'TITLE': checksums ok
+info: Table 'PROT_ACC_IDX' metadata: md5 ok
+info: Column 'PROTEIN_ROW_ID': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'ALTREAD': checksums ok
+info: Column 'CLIP_LEN': checksums ok
+info: Column 'CONTIG_NAME': checksums ok
+info: Column 'DESCR': checksums ok
+info: Column 'FEAT_ROW_END': checksums ok
+info: Column 'FEAT_ROW_START': checksums ok
+info: Column 'GI': checksums ok
+info: Column 'HASH': checksums ok
+info: Column 'PROT_COUNT': checksums ok
+info: Column 'READ': checksums ok
+info: Column 'TITLE': checksums ok
+info: Database 'blob-row-gap.kar' is consistent
diff --git a/test/vdb-validate/expected/no_sdc_checks b/test/vdb-validate/expected/no_sdc_checks
new file mode 100644
index 0000000..53e5c2c
--- /dev/null
+++ b/test/vdb-validate/expected/no_sdc_checks
@@ -0,0 +1,23 @@
+info: Database 'sdc_len_mismatch.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CGRAPH_MISMATCHES': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_len_mismatch.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_len_mismatch.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+info: Database 'sdc_len_mismatch.csra' is consistent
diff --git a/test/vdb-validate/expected/sdc_len_mismatch_1 b/test/vdb-validate/expected/sdc_len_mismatch_1
new file mode 100644
index 0000000..7ae23b4
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_len_mismatch_1
@@ -0,0 +1,24 @@
+info: Database 'sdc_len_mismatch.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CGRAPH_MISMATCHES': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_len_mismatch.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_len_mismatch.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+err: data inconsistent while validating database - Database 'db/sdc_len_mismatch.csra': Limit violation (pa_longer_sa): there are at least 1 alignments where HAS_REF_OFFSET column is longer in PRIMARY_ALIGNMENT than in SECONDARY_ALIGNMENT
+err: data inconsistent while validating database - Database 'sdc_len_mismatch.csra' check failed
diff --git a/test/vdb-validate/expected/sdc_len_mismatch_2 b/test/vdb-validate/expected/sdc_len_mismatch_2
new file mode 100644
index 0000000..313eb27
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_len_mismatch_2
@@ -0,0 +1,24 @@
+info: Database 'sdc_len_mismatch.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CGRAPH_MISMATCHES': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_len_mismatch.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_len_mismatch.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+err: data inconsistent while validating database - Database 'db/sdc_len_mismatch.csra': PRIMARY_ALIGNMENT:2 HAS_REF_OFFSET length (23) less than SECONDARY_ALIGNMENT:2 HAS_REF_OFFSET length (52)
+err: data inconsistent while validating database - Database 'sdc_len_mismatch.csra' check failed
diff --git a/test/vdb-validate/expected/sdc_pa_longer_1 b/test/vdb-validate/expected/sdc_pa_longer_1
new file mode 100644
index 0000000..ecd7ac8
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_pa_longer_1
@@ -0,0 +1,26 @@
+info: Database 'sdc_pa_longer.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Column 'TMP_HAS_MISMATCH': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_pa_longer.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_pa_longer.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+err: data inconsistent while validating database - Database 'db/sdc_pa_longer.csra': Limit violation (pa_longer_sa): there are at least 1 alignments where HAS_REF_OFFSET column is longer in PRIMARY_ALIGNMENT than in SECONDARY_ALIGNMENT
+err: data inconsistent while validating database - Database 'sdc_pa_longer.csra' check failed
diff --git a/test/vdb-validate/expected/sdc_pa_longer_2 b/test/vdb-validate/expected/sdc_pa_longer_2
new file mode 100644
index 0000000..ecd7ac8
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_pa_longer_2
@@ -0,0 +1,26 @@
+info: Database 'sdc_pa_longer.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Column 'TMP_HAS_MISMATCH': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_pa_longer.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_pa_longer.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+err: data inconsistent while validating database - Database 'db/sdc_pa_longer.csra': Limit violation (pa_longer_sa): there are at least 1 alignments where HAS_REF_OFFSET column is longer in PRIMARY_ALIGNMENT than in SECONDARY_ALIGNMENT
+err: data inconsistent while validating database - Database 'sdc_pa_longer.csra' check failed
diff --git a/test/vdb-validate/expected/sdc_pa_longer_3 b/test/vdb-validate/expected/sdc_pa_longer_3
new file mode 100644
index 0000000..d2d2288
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_pa_longer_3
@@ -0,0 +1,26 @@
+info: Database 'sdc_pa_longer.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Column 'TMP_HAS_MISMATCH': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Database 'db/sdc_pa_longer.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_pa_longer.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+info: Database 'db/sdc_pa_longer.csra': SEQUENCE and SECONDARY_ALIGNMENT tables data integrity checks ok
+info: Database 'sdc_pa_longer.csra' is consistent
diff --git a/test/vdb-validate/expected/sdc_seq_cmp_read_len_corrupt b/test/vdb-validate/expected/sdc_seq_cmp_read_len_corrupt
new file mode 100644
index 0000000..8cd413b
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_seq_cmp_read_len_corrupt
@@ -0,0 +1,44 @@
+info: Database 'sdc_seq_cmp_read_len_corrupt.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'GLOBAL_REF_START': checksums ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'MISMATCH': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'REF_ORIENTATION': checksums ok
+info: Column 'SEQ_READ_ID': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CGRAPH_MISMATCHES': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'OVERLAP_REF_POS': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'GLOBAL_REF_START': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'MATE_REF_ORIENTATION': checksums ok
+info: Column 'MATE_REF_POS': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'REF_ORIENTATION': checksums ok
+info: Column 'SEQ_READ_ID': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Column 'TEMPLATE_LEN': checksums ok
+info: Column 'TMP_HAS_MISMATCH': checksums ok
+info: Column 'TMP_MISMATCH': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'CMP_READ': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Column 'READ_START': checksums ok
+info: Column 'READ_TYPE': checksums ok
+info: Column 'SPOT_GROUP': checksums ok
+info: Database 'db/sdc_seq_cmp_read_len_corrupt.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_seq_cmp_read_len_corrupt.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+warn: Database 'db/sdc_seq_cmp_read_len_corrupt.csra' has secondary alignments without primary
+err: data inconsistent while validating database - Database 'db/sdc_seq_cmp_read_len_corrupt.csra': SEQUENCE:1 CMP_READ length (75) does not match sum of unaligned READ_LEN values (150)
+err: data inconsistent while validating database - Database 'sdc_seq_cmp_read_len_corrupt.csra' check failed
diff --git a/test/vdb-validate/expected/sdc_seq_cmp_read_len_fixed b/test/vdb-validate/expected/sdc_seq_cmp_read_len_fixed
new file mode 100644
index 0000000..98afa93
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_seq_cmp_read_len_fixed
@@ -0,0 +1,43 @@
+info: Database 'sdc_seq_cmp_read_len_fixed.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Column 'GLOBAL_REF_START': checksums ok
+info: Column 'HAS_MISMATCH': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'MISMATCH': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'REF_ORIENTATION': checksums ok
+info: Column 'SEQ_READ_ID': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CGRAPH_MISMATCHES': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Column 'GLOBAL_REF_START': checksums ok
+info: Column 'HAS_REF_OFFSET': checksums ok
+info: Column 'MATE_REF_ORIENTATION': checksums ok
+info: Column 'MATE_REF_POS': checksums ok
+info: Column 'REF_LEN': checksums ok
+info: Column 'REF_ORIENTATION': checksums ok
+info: Column 'SEQ_READ_ID': checksums ok
+info: Column 'SEQ_SPOT_ID': checksums ok
+info: Column 'TEMPLATE_LEN': checksums ok
+info: Column 'TMP_HAS_MISMATCH': checksums ok
+info: Column 'TMP_MISMATCH': checksums ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Column 'CMP_READ': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_ID': checksums ok
+info: Column 'QUALITY': checksums ok
+info: Column 'READ_LEN': checksums ok
+info: Column 'READ_START': checksums ok
+info: Column 'READ_TYPE': checksums ok
+info: Column 'SPOT_GROUP': checksums ok
+info: Database 'db/sdc_seq_cmp_read_len_fixed.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_seq_cmp_read_len_fixed.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+warn: Database 'db/sdc_seq_cmp_read_len_fixed.csra' has secondary alignments without primary
+info: Database 'db/sdc_seq_cmp_read_len_fixed.csra': SEQUENCE and SECONDARY_ALIGNMENT tables data integrity checks ok
+info: Database 'sdc_seq_cmp_read_len_fixed.csra' is consistent
diff --git a/test/vdb-validate/expected/sdc_tmp_mismatch b/test/vdb-validate/expected/sdc_tmp_mismatch
new file mode 100644
index 0000000..5893d4e
--- /dev/null
+++ b/test/vdb-validate/expected/sdc_tmp_mismatch
@@ -0,0 +1,16 @@
+info: Database 'sdc_tmp_mismatch.csra' metadata: md5 ok
+info: Table 'PRIMARY_ALIGNMENT' metadata: md5 ok
+info: Table 'REFERENCE' metadata: md5 ok
+info: Column 'CGRAPH_HIGH': checksums ok
+info: Column 'CS_KEY': checksums ok
+info: Column 'OVERLAP_REF_POS': checksums ok
+info: Column 'PRIMARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SECONDARY_ALIGNMENT_IDS': checksums ok
+info: Column 'SEQ_LEN': checksums ok
+info: Column 'SEQ_START': checksums ok
+info: Table 'SECONDARY_ALIGNMENT' metadata: md5 ok
+info: Table 'SEQUENCE' metadata: md5 ok
+info: Database 'db/sdc_tmp_mismatch.csra': SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID referential integrity ok
+info: Database 'db/sdc_tmp_mismatch.csra': REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID referential integrity ok
+err: data inconsistent while validating database - Database 'db/sdc_tmp_mismatch.csra': SECONDARY_ALIGNMENT:1 TMP_MISMATCH column contains '='
+err: data inconsistent while validating database - Database 'sdc_tmp_mismatch.csra' check failed
diff --git a/test/vdb-validate/runtestcase.sh b/test/vdb-validate/runtestcase.sh
new file mode 100755
index 0000000..84ba505
--- /dev/null
+++ b/test/vdb-validate/runtestcase.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+TEST_CMD=$1
+CASEID=$2
+RC=$3
+
+CMD="$TEST_CMD > \"actual/$CASEID.tmp\" 2>&1"
+#echo $CMD
+eval $CMD
+rc="$?"
+
+if [ "$rc" != "$RC" ] ; then
+ echo "command \"$TEST_CMD\" returned $rc, expected $RC"
+ echo "command executed:"
+ echo $CMD
+
+ echo "command output:"
+ cat actual/$CASEID.tmp
+ exit 2
+fi
+
+# remove first two columns from output: datetime and progname
+cat "actual/$CASEID.tmp" | awk '{if(substr($2,1,12) == "vdb-validate"){$2=$1="";} print $0}' > "actual/$CASEID"
+rm "actual/$CASEID.tmp"
+
+# remove trailing white spaces
+sed -i -e 's/^[ \t]*//g' "actual/$CASEID"
+# remove file names and line numbers
+sed -i -e 's/: .*:[0-9]*:[^ ]*:/:/g' "actual/$CASEID"
+
+diff expected/$CASEID actual/$CASEID
+rc="$?"
+
+if [ "$rc" != "0" ] ; then
+ exit 3
+fi
+
diff --git a/test/vschema/Makefile b/test/vschema/Makefile
new file mode 100644
index 0000000..ca9aaf9
--- /dev/null
+++ b/test/vschema/Makefile
@@ -0,0 +1,120 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: runtests
+ @ rm tmp.kfg
+
+TOP ?= $(abspath ../..)
+
+MODULE = test/vschema
+
+include $(TOP)/build/Makefile.env
+
+$(shell echo "vdb/schema/paths = \"$(VDB_INCDIR)\"" > tmp.kfg)
+
+clean: stdclean
+
+#-------------------------------------------------------------------------------
+# bio-end schema tests
+#
+runtests: \
+ bio-end-tests \
+ idx-text-tests
+
+#-------------------------------------------------------------------------------
+# bio-end-tests
+#
+TEST_BIO_END_MAKEINPUTS_SRC = \
+ bio-end/makeinputs
+
+TEST_BIO_END_MAKEINPUTS_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_BIO_END_MAKEINPUTS_SRC))
+
+TEST_BIO_END_MAKEINPUTS_LIB = \
+ -L$(LIBDIR) \
+ -sgeneral-writer
+
+
+bio-end-makeinputs: $(TEST_BIO_END_MAKEINPUTS_OBJ)
+ $(LP) --exe -o ./bio-end-makeinputs $^ $(TEST_BIO_END_MAKEINPUTS_LIB)
+ @rm bio-end-makeinputs.exe.d $(TEST_BIO_END_MAKEINPUTS_OBJ)
+
+bio-end-tests: bio-end-makeinputs
+ @mkdir -p $(SRCDIR)/bio-end/input && ./bio-end-makeinputs && rm ./bio-end-makeinputs
+ @# test cases
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/bio-end bio-end excl-1 0 n
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/bio-end bio-end excl-2 0 n
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/bio-end bio-end excl-3 0 n
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/bio-end bio-end excl-4 0 n
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/bio-end bio-end incl-1 0 n
+ @rm -f $(SRCDIR)/bio-end/input/*.gl
+ @echo "bio-end tests executed successfuly"
+
+#-------------------------------------------------------------------------------
+# idx-text-tests
+#
+TEST_IDX_TEXT_MAKEINPUTS_SRC = \
+ idx-text/makeinputs
+
+TEST_IDX_TEXT_MAKEINPUTS_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_IDX_TEXT_MAKEINPUTS_SRC))
+
+TEST_IDX_TEXT_MAKEINPUTS_LIB = \
+ -L$(LIBDIR) \
+ -sgeneral-writer
+
+idx-text-makeinputs: $(TEST_IDX_TEXT_MAKEINPUTS_OBJ)
+ $(LP) --exe -o ./idx-text-makeinputs $^ $(TEST_IDX_TEXT_MAKEINPUTS_LIB)
+ @rm idx-text-makeinputs.exe.d $(TEST_IDX_TEXT_MAKEINPUTS_OBJ)
+
+
+TEST_IDX_TEXT_CHECKLOOKUP_SRC = \
+ idx-text/checklookup
+
+TEST_IDX_TEXT_CHECKLOOKUP_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_IDX_TEXT_CHECKLOOKUP_SRC))
+
+TEST_IDX_TEXT_CHECKLOOKUP_LIB = \
+ -L$(LIBDIR) \
+ -sncbi-vdb
+
+idx-text-checklookup: $(TEST_IDX_TEXT_CHECKLOOKUP_OBJ)
+ $(LP) --exe -o ./idx-text-checklookup $^ $(TEST_IDX_TEXT_CHECKLOOKUP_LIB)
+ @rm idx-text-checklookup.exe.d $(TEST_IDX_TEXT_CHECKLOOKUP_OBJ)
+
+
+idx-text-tests: idx-text-makeinputs idx-text-checklookup
+ @mkdir -p $(SRCDIR)/idx-text/input && ./idx-text-makeinputs && rm ./idx-text-makeinputs
+ @# test cases
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text ci-1 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text ci-2 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text ci-3 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text ci-4 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text ci-5 0 n
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text cs-1 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text cs-2 0 y ./idx-text-checklookup
+ @$(SRCDIR)/runtestcase.sh $(BINDIR) $(SRCDIR)/idx-text idx-text cs-3 0 n
+ @rm -f ./idx-text-checklookup
+ @rm -f $(SRCDIR)/idx-text/input/*.gl
+ @echo "idx-text tests executed successfuly"
diff --git a/test/vschema/bio-end/bio-end-excl.vschema b/test/vschema/bio-end/bio-end-excl.vschema
new file mode 100644
index 0000000..3e91875
--- /dev/null
+++ b/test/vschema/bio-end/bio-end-excl.vschema
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+include 'insdc/insdc.vschema';
+include 'insdc/sra.vschema';
+include 'ncbi/sra.vschema';
+
+table bio_end:test:table1 #1
+{
+ column INSDC:coord:zero out_read_start;
+ column INSDC:coord:len out_read_len;
+ column INSDC:SRA:xread_type out_read_type;
+
+ readonly column INSDC:coord:zero bio_end
+ = NCBI:SRA:bio_end < false > ( out_read_start, out_read_type, out_read_len );
+}
+
+database bio_end:test:database1 #1
+{
+ table bio_end:test:table1 #1 table1;
+}
diff --git a/test/vschema/bio-end/bio-end-incl.vschema b/test/vschema/bio-end/bio-end-incl.vschema
new file mode 100644
index 0000000..c071196
--- /dev/null
+++ b/test/vschema/bio-end/bio-end-incl.vschema
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+include 'insdc/insdc.vschema';
+include 'insdc/sra.vschema';
+include 'ncbi/sra.vschema';
+
+table bio_end:test:table1 #1
+{
+ column INSDC:coord:zero out_read_start;
+ column INSDC:coord:len out_read_len;
+ column INSDC:SRA:xread_type out_read_type;
+
+ readonly column INSDC:coord:zero bio_end
+ = NCBI:SRA:bio_end < true > ( out_read_start, out_read_type, out_read_len );
+}
+
+database bio_end:test:database1 #1
+{
+ table bio_end:test:table1 #1 table1;
+}
diff --git a/test/vschema/bio-end/expected/excl-1.stdout b/test/vschema/bio-end/expected/excl-1.stdout
new file mode 100644
index 0000000..702409a
--- /dev/null
+++ b/test/vschema/bio-end/expected/excl-1.stdout
@@ -0,0 +1,5 @@
+ bio_end: 12
+ out_read_len: 4, 4, 4
+out_read_start: 0, 4, 8
+ out_read_type: SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL
+
diff --git a/test/vschema/bio-end/expected/excl-2.stdout b/test/vschema/bio-end/expected/excl-2.stdout
new file mode 100644
index 0000000..2667e5c
--- /dev/null
+++ b/test/vschema/bio-end/expected/excl-2.stdout
@@ -0,0 +1,5 @@
+ bio_end: 8
+ out_read_len: 4, 4, 4
+out_read_start: 0, 4, 8
+ out_read_type: SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+
diff --git a/test/vschema/bio-end/expected/excl-3.stdout b/test/vschema/bio-end/expected/excl-3.stdout
new file mode 100644
index 0000000..b428943
--- /dev/null
+++ b/test/vschema/bio-end/expected/excl-3.stdout
@@ -0,0 +1,5 @@
+ bio_end: 8
+ out_read_len: 4, 4, 4, 0, 0
+out_read_start: 0, 4, 8, 12, 12
+ out_read_type: SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+
diff --git a/test/vschema/bio-end/expected/excl-4.stdout b/test/vschema/bio-end/expected/excl-4.stdout
new file mode 100644
index 0000000..43e18a6
--- /dev/null
+++ b/test/vschema/bio-end/expected/excl-4.stdout
@@ -0,0 +1,5 @@
+ bio_end: 13
+ out_read_len: 4, 4, 4, 1, 0
+out_read_start: 0, 4, 8, 12, 13
+ out_read_type: SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+
diff --git a/test/vschema/bio-end/expected/incl-1.stdout b/test/vschema/bio-end/expected/incl-1.stdout
new file mode 100644
index 0000000..6ec1b01
--- /dev/null
+++ b/test/vschema/bio-end/expected/incl-1.stdout
@@ -0,0 +1,5 @@
+ bio_end: 7
+ out_read_len: 4, 4, 4
+out_read_start: 0, 4, 8
+ out_read_type: SRA_READ_TYPE_TECHNICAL, SRA_READ_TYPE_BIOLOGICAL, SRA_READ_TYPE_TECHNICAL
+
diff --git a/test/vschema/bio-end/makeinputs.cpp b/test/vschema/bio-end/makeinputs.cpp
new file mode 100644
index 0000000..bb34391
--- /dev/null
+++ b/test/vschema/bio-end/makeinputs.cpp
@@ -0,0 +1,129 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Unit tests for Bio-end function
+ */
+#include "../../../tools/general-loader/general-writer.hpp"
+
+#define TEST_SUITE "bio-end"
+
+using namespace ncbi;
+
+const char* tableName = "table1";
+
+void run( const char * p_caseId, bool inclusive, const int32_t coord_start[], const int32_t coord_len[], const int8_t coord_type[], int segments_number )
+{
+ std::string output_path = std::string ( TEST_SUITE "/input/" ) + p_caseId + ".gl";
+ std::string db_path = std::string ( TEST_SUITE "/actual/" ) + p_caseId + "/db";
+ std::string schema_path = inclusive ? TEST_SUITE "/bio-end-incl.vschema" : TEST_SUITE "/bio-end-excl.vschema";
+
+ GeneralWriter *gw;
+ try
+ {
+ gw = new GeneralWriter ( output_path );
+
+ gw -> setRemotePath ( db_path );
+ gw -> useSchema ( schema_path, "bio_end:test:database1" );
+
+ int table_id = gw -> addTable ( tableName );
+ int column_read_start_id = gw -> addIntegerColumn ( table_id, "out_read_start", 32 );
+ int column_read_len_id = gw -> addIntegerColumn ( table_id, "out_read_len", 32 );
+ int column_read_type_id = gw -> addIntegerColumn ( table_id, "out_read_type", 8 );
+
+ gw -> open ();
+
+
+#define write(column_id, column_bits, data) gw -> write ( column_id, column_bits, &data[0], segments_number );
+ write ( column_read_start_id, 32, coord_start );
+ write ( column_read_len_id, 32, coord_len );
+ write ( column_read_type_id, 8, coord_type );
+#undef write
+
+ gw -> nextRow(table_id);
+
+ gw -> endStream ();
+
+ delete gw;
+
+ }
+ catch ( ... )
+ {
+ delete gw;
+ throw;
+ }
+}
+
+int main()
+{
+ {
+ int32_t coord_start[] = {0, 4, 8};
+ int32_t coord_len[] = {4, 4, 4};
+ int8_t coord_type[] = {1, 0, 1};
+ const char * test_case_id = "excl-1";
+ bool inclusive = false;
+
+ run( test_case_id, inclusive, coord_start, coord_len, coord_type, sizeof coord_type / sizeof coord_type[0] );
+ }
+ {
+ int32_t coord_start[] = {0, 4, 8};
+ int32_t coord_len[] = {4, 4, 4};
+ int8_t coord_type[] = {0, 1, 0};
+ const char * test_case_id = "excl-2";
+ bool inclusive = false;
+
+ run( test_case_id, inclusive, coord_start, coord_len, coord_type, sizeof coord_type / sizeof coord_type[0] );
+ }
+ {
+ int32_t coord_start[] = {0, 4, 8, 12, 12};
+ int32_t coord_len[] = {4, 4, 4, 0, 0};
+ int8_t coord_type[] = {0, 1, 0, 1, 0};
+ const char * test_case_id = "excl-3";
+ bool inclusive = false;
+
+ run( test_case_id, inclusive, coord_start, coord_len, coord_type, sizeof coord_type / sizeof coord_type[0] );
+ }
+ {
+ int32_t coord_start[] = {0, 4, 8, 12, 13};
+ int32_t coord_len[] = {4, 4, 4, 1, 0};
+ int8_t coord_type[] = {0, 1, 0, 1, 0};
+ const char * test_case_id = "excl-4";
+ bool inclusive = false;
+
+ run( test_case_id, inclusive, coord_start, coord_len, coord_type, sizeof coord_type / sizeof coord_type[0] );
+ }
+ {
+ int32_t coord_start[] = {0, 4, 8};
+ int32_t coord_len[] = {4, 4, 4};
+ int8_t coord_type[] = {0, 1, 0};
+ const char * test_case_id = "incl-1";
+ bool inclusive = true;
+
+ run( test_case_id, inclusive, coord_start, coord_len, coord_type, sizeof coord_type / sizeof coord_type[0] );
+ }
+
+ return 0;
+}
diff --git a/test/vschema/idx-text/checklookup.cpp b/test/vschema/idx-text/checklookup.cpp
new file mode 100644
index 0000000..7d6a877
--- /dev/null
+++ b/test/vschema/idx-text/checklookup.cpp
@@ -0,0 +1,335 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Perform checks of function idx:text:lookup on created databases,
+ * because it requires passing parameter through cursor parameter QUERY_NAME
+ */
+
+#include <klib/log.h>
+#include <klib/writer.h>
+#include <kfs/directory.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <iostream>
+#include <map>
+
+#define TEST_SUITE "idx-text"
+#define TABLE_NAME "table1"
+
+struct RowRange {
+ int64_t start_id;
+ int64_t stop_id;
+};
+
+struct TestCase {
+ const char* path;
+ std::map<std::string, RowRange> key_ranges;
+};
+
+static std::map<std::string, TestCase> test_cases;
+static const char* test_case_name;
+
+rc_t runChecks(const TestCase& test_case, const VCursor * cursor, uint32_t name_idx, uint32_t name_range_idx)
+{
+ rc_t rc;
+ int64_t first_id;
+ uint64_t count_id;
+
+ rc = VCursorIdRange( cursor, name_idx, &first_id, &count_id );
+ if (rc != 0)
+ {
+ LOGERR( klogInt, rc, "VCursorIdRange() failed" );
+ return rc;
+ }
+
+ for (uint64_t row_id = first_id; row_id < first_id + count_id; ++row_id)
+ {
+ const char * name = NULL;
+ uint32_t name_len;
+ RowRange *row_range;
+
+ rc = VCursorCellDataDirect( cursor, row_id, name_idx, NULL, (void const **)&name, NULL, &name_len );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorCellDataDirect() failed" );
+ return rc;
+ }
+
+ if ( name_len == 0 )
+ continue;
+
+ rc = VCursorParamsSet( ( struct VCursorParams const * )cursor, "QUERY_NAME", "%.*s", name_len, name );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorParamsSet() failed" );
+ return rc;
+ }
+
+ rc = VCursorCellDataDirect( cursor, row_id, name_range_idx, NULL, (void const **)&row_range, NULL, NULL );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorCellDataDirect() failed" );
+ return rc;
+ }
+
+ std::string name_str(name, name_len);
+
+ if (test_case.key_ranges.find(name_str) == test_case.key_ranges.end())
+ {
+ PLOGMSG( klogInt, (klogErr, "Unexpected name '$(NAME)' in test case '$(TC_NAME)'", "TC_NAME=%s,NAME=%s", test_case_name, name_str.c_str()) );
+ return 1;
+ }
+
+ RowRange row_range_exp = test_case.key_ranges.find(name_str)->second;
+ if (row_range->start_id != row_range_exp.start_id || row_range->stop_id != row_range_exp.stop_id)
+ {
+ PLOGMSG( klogInt, (klogErr, "Row range for name '$(NAME)' in test case '$(TC_NAME)' does not match. Expected: $(EXP_S)-$(EXP_F), actual: $(ACT_S)-$(ACT_F)",
+ "TC_NAME=%s,NAME=%s,EXP_S=%ld,EXP_F=%ld,ACT_S=%ld,ACT_F=%ld",
+ test_case_name, name_str.c_str(), row_range_exp.start_id, row_range_exp.stop_id, row_range->start_id, row_range->stop_id) );
+ return 1;
+ }
+ }
+
+ return rc;
+}
+
+rc_t run(const TestCase& test_case)
+{
+ rc_t rc;
+ KDirectory * cur_dir;
+ const VDBManager * manager;
+ const VDatabase * database;
+ const VTable * table;
+ const VCursor * cursor;
+ uint32_t name_idx;
+ uint32_t name_range_idx;
+
+ rc = KDirectoryNativeDir( &cur_dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ else
+ {
+ rc = VDBManagerMakeRead ( &manager, cur_dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ else
+ {
+ rc = VDBManagerOpenDBRead( manager, &database, NULL, "%s", test_case.path );
+ if (rc != 0)
+ LOGERR( klogInt, rc, "VDBManagerOpenDBRead() failed" );
+ else
+ {
+ rc = VDatabaseOpenTableRead( database, &table, "%s", TABLE_NAME );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VDatabaseOpenTableRead() failed" );
+ else
+ {
+ rc = VTableCreateCursorRead( table, &cursor );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VTableCreateCursorRead() failed" );
+ else
+ {
+ /* add columns to cursor */
+ rc = VCursorAddColumn( cursor, &name_idx, "(utf8)NAME" );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VCursorAddColumn() failed" );
+ else
+ {
+ rc = VCursorAddColumn( cursor, &name_range_idx, "NAME_RANGE" );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VCursorAddColumn() failed" );
+ else
+ {
+ rc = VCursorOpen( cursor );
+ if (rc != 0)
+ LOGERR( klogInt, rc, "VCursorOpen() failed" );
+ else
+ rc = runChecks( test_case, cursor, name_idx, name_range_idx );
+ }
+ }
+ VCursorRelease( cursor );
+ }
+ VTableRelease( table );
+ }
+ VDatabaseRelease( database );
+ }
+
+ VDBManagerRelease( manager );
+ }
+ KDirectoryRelease( cur_dir );
+ }
+ return rc;
+}
+
+/* New test cases should go here */
+void initTestCases()
+{
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {2, 5};
+ key_ranges["a"] = range;
+ key_ranges["A"] = range;
+ }
+ {
+ RowRange range = {7, 7};
+ key_ranges["b"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/ci-1/db", key_ranges };
+ test_cases["ci-1"] = tc;
+ }
+
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {1, 5};
+ key_ranges["abcdefghi"] = range;
+ key_ranges["abcdefGHI"] = range;
+ key_ranges["ABcdefghi"] = range;
+ }
+ {
+ RowRange range = {6, 6};
+ key_ranges["ABcdefghi1234567890"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/ci-2/db", key_ranges };
+ test_cases["ci-2"] = tc;
+ }
+
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {1, 4};
+ key_ranges["abcdefghi"] = range;
+ key_ranges["abcdefGHI"] = range;
+ key_ranges["ABcdefghi"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/ci-3/db", key_ranges };
+ test_cases["ci-3"] = tc;
+ }
+
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {1, 4};
+ key_ranges["abcdefghi"] = range;
+ key_ranges["abcdefGHI"] = range;
+ key_ranges["ABcdefghi"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/ci-4/db", key_ranges };
+ test_cases["ci-4"] = tc;
+ }
+
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {1, 3};
+ key_ranges["abcdefghi"] = range;
+ }
+
+ {
+ RowRange range = {4, 4};
+ key_ranges["abcdefGHI"] = range;
+ }
+
+ {
+ RowRange range = {5, 5};
+ key_ranges["ABcdefghi"] = range;
+ }
+
+ {
+ RowRange range = {6, 6};
+ key_ranges["ABcdefghi1234567890"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/cs-1/db", key_ranges };
+ test_cases["cs-1"] = tc;
+ }
+
+ {
+ std::map<std::string, RowRange> key_ranges;
+ {
+ RowRange range = {1, 3};
+ key_ranges["abcdefghi"] = range;
+ }
+
+ {
+ RowRange range = {4, 4};
+ key_ranges["abcdefGHI"] = range;
+ }
+
+ {
+ RowRange range = {5, 5};
+ key_ranges["ABcdefghi"] = range;
+ }
+
+ {
+ RowRange range = {6, 6};
+ key_ranges["ABcdefghi1234567890"] = range;
+ }
+
+ TestCase tc = { TEST_SUITE "/actual/cs-2/db", key_ranges };
+ test_cases["cs-2"] = tc;
+ }
+}
+
+int main(int argc, const char* argv[])
+{
+ /* init logging */
+ KLogLibHandlerSetStdErr();
+ KLogHandlerSetStdErr();
+ KWrtInit("checklookup", 0);
+
+ initTestCases();
+
+ if (argc < 2)
+ {
+ std::cerr << "Please specify test case name" << std::endl;
+ return 1;
+ }
+
+ test_case_name = argv[1];
+ if (test_cases.find(test_case_name) == test_cases.end())
+ {
+ std::cerr << "Unknown test case name: " << test_case_name << std::endl;
+ return 2;
+ }
+
+ rc_t rc = run(test_cases[test_case_name]);
+ if (rc != 0)
+ return 3;
+
+ std::cout << "Success" << std::endl;
+ return 0;
+}
diff --git a/test/vschema/idx-text/expected/ci-1.stdout b/test/vschema/idx-text/expected/ci-1.stdout
new file mode 100644
index 0000000..0f8a271
--- /dev/null
+++ b/test/vschema/idx-text/expected/ci-1.stdout
@@ -0,0 +1,21 @@
+ NAME:
+NAME_RANGE:
+
+ NAME: a
+NAME_RANGE:
+
+ NAME: a
+NAME_RANGE:
+
+ NAME: a
+NAME_RANGE:
+
+ NAME: A
+NAME_RANGE:
+
+ NAME:
+NAME_RANGE:
+
+ NAME: b
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/ci-2.stdout b/test/vschema/idx-text/expected/ci-2.stdout
new file mode 100644
index 0000000..cbeb94d
--- /dev/null
+++ b/test/vschema/idx-text/expected/ci-2.stdout
@@ -0,0 +1,18 @@
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefGHI
+NAME_RANGE:
+
+ NAME: ABcdefghi
+NAME_RANGE:
+
+ NAME: ABcdefghi1234567890
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/ci-3.stdout b/test/vschema/idx-text/expected/ci-3.stdout
new file mode 100644
index 0000000..fa546e0
--- /dev/null
+++ b/test/vschema/idx-text/expected/ci-3.stdout
@@ -0,0 +1,12 @@
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefGHI
+NAME_RANGE:
+
+ NAME: ABcdefghi
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/ci-4.stdout b/test/vschema/idx-text/expected/ci-4.stdout
new file mode 100644
index 0000000..fa546e0
--- /dev/null
+++ b/test/vschema/idx-text/expected/ci-4.stdout
@@ -0,0 +1,12 @@
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefGHI
+NAME_RANGE:
+
+ NAME: ABcdefghi
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/ci-5.stdout b/test/vschema/idx-text/expected/ci-5.stdout
new file mode 100644
index 0000000..dfb77ec
--- /dev/null
+++ b/test/vschema/idx-text/expected/ci-5.stdout
@@ -0,0 +1,15 @@
+ NAME: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+NAME_RANGE:
+
+ NAME: Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+NAME_RANGE:
+
+ NAME:
+NAME_RANGE:
+
+ NAME: aaa
+NAME_RANGE:
+
+ NAME:
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/cs-1.stdout b/test/vschema/idx-text/expected/cs-1.stdout
new file mode 100644
index 0000000..cbeb94d
--- /dev/null
+++ b/test/vschema/idx-text/expected/cs-1.stdout
@@ -0,0 +1,18 @@
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefGHI
+NAME_RANGE:
+
+ NAME: ABcdefghi
+NAME_RANGE:
+
+ NAME: ABcdefghi1234567890
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/cs-2.stdout b/test/vschema/idx-text/expected/cs-2.stdout
new file mode 100644
index 0000000..cbeb94d
--- /dev/null
+++ b/test/vschema/idx-text/expected/cs-2.stdout
@@ -0,0 +1,18 @@
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefghi
+NAME_RANGE:
+
+ NAME: abcdefGHI
+NAME_RANGE:
+
+ NAME: ABcdefghi
+NAME_RANGE:
+
+ NAME: ABcdefghi1234567890
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/expected/cs-3.stdout b/test/vschema/idx-text/expected/cs-3.stdout
new file mode 100644
index 0000000..a0dea33
--- /dev/null
+++ b/test/vschema/idx-text/expected/cs-3.stdout
@@ -0,0 +1,18 @@
+ NAME: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+NAME_RANGE:
+
+ NAME: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+NAME_RANGE:
+
+ NAME: Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+NAME_RANGE:
+
+ NAME:
+NAME_RANGE:
+
+ NAME: aaa
+NAME_RANGE:
+
+ NAME:
+NAME_RANGE:
+
diff --git a/test/vschema/idx-text/idx-text.vschema b/test/vschema/idx-text/idx-text.vschema
new file mode 100644
index 0000000..7ec91c5
--- /dev/null
+++ b/test/vschema/idx-text/idx-text.vschema
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+version 1;
+
+include 'vdb/vdb.vschema';
+
+/* ======= case insensitive - lower ======= */
+table idx_text:ci_lower:test:table #1
+{
+ extern column utf8 NAME = out_name_utf8;
+ physical utf8 .NAME = idx:text:insert < 'i_name', CASE_INSENSITIVE_LOWER > ( NAME );
+
+ utf8 out_name_utf8 = idx:text:project < 'i_name', CASE_INSENSITIVE_LOWER > ( .NAME );
+
+ // Mechanism to seach for NAME
+ readonly column vdb:row_id_range NAME_RANGE
+ = idx:text:lookup < 'i_name', 'QUERY_NAME', CASE_INSENSITIVE_LOWER > ();
+}
+
+database idx_text:ci_lower:test:database #1
+{
+ table idx_text:ci_lower:test:table #1 table1;
+}
+
+/* ======= case insensitive - upper ======= */
+table idx_text:ci_upper:test:table #1
+{
+ extern column utf8 NAME = out_name_utf8;
+ physical utf8 .NAME = idx:text:insert < 'i_name', CASE_INSENSITIVE_UPPER > ( NAME );
+
+ utf8 out_name_utf8 = idx:text:project < 'i_name', CASE_INSENSITIVE_UPPER > ( .NAME );
+
+ // Mechanism to seach for NAME
+ readonly column vdb:row_id_range NAME_RANGE
+ = idx:text:lookup < 'i_name', 'QUERY_NAME', CASE_INSENSITIVE_UPPER > ();
+}
+
+database idx_text:ci_upper:test:database #1
+{
+ table idx_text:ci_upper:test:table #1 table1;
+}
+
+/* ======= case sensitive ======= */
+table idx_text:cs:test:table #1
+{
+ extern column utf8 NAME = out_name_utf8;
+ physical utf8 .NAME = idx:text:insert < 'i_name', CASE_SENSITIVE > ( NAME );
+
+ utf8 out_name_utf8 = idx:text:project < 'i_name', CASE_SENSITIVE > ( .NAME );
+
+ ascii out_name = cast ( out_name_utf8 );
+
+ // Mechanism to seach for NAME
+ readonly column vdb:row_id_range NAME_RANGE
+ = idx:text:lookup < 'i_name', 'QUERY_NAME', CASE_SENSITIVE > ();
+}
+
+database idx_text:cs:test:database #1
+{
+ table idx_text:cs:test:table #1 table1;
+}
+
+/* ======= default: case sensitive ======= */
+table idx_text:default_cs:test:table #1
+{
+ extern column utf8 NAME = out_name_utf8;
+ physical utf8 .NAME = idx:text:insert < 'i_name' > ( NAME );
+
+ utf8 out_name_utf8 = idx:text:project < 'i_name' > ( .NAME );
+
+ ascii out_name = cast ( out_name_utf8 );
+
+ // Mechanism to seach for NAME
+ readonly column vdb:row_id_range NAME_RANGE
+ = idx:text:lookup < 'i_name', 'QUERY_NAME' > ();
+}
+
+database idx_text:default_cs:test:database #1
+{
+ table idx_text:default_cs:test:table #1 table1;
+}
\ No newline at end of file
diff --git a/test/vschema/idx-text/makeinputs.cpp b/test/vschema/idx-text/makeinputs.cpp
new file mode 100644
index 0000000..50ebe97
--- /dev/null
+++ b/test/vschema/idx-text/makeinputs.cpp
@@ -0,0 +1,182 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/**
+ * Unit tests for text index functionality
+ */
+#include "../../../tools/general-loader/general-writer.hpp"
+
+#include <string>
+
+#define TEST_SUITE "idx-text"
+
+using namespace ncbi;
+
+const char* tableName = "table1";
+
+enum TestCaseType
+{
+ caseInsensitiveLower,
+ caseInsensitiveUpper,
+ caseSensitive,
+ defaultCaseSensitive
+};
+
+void run( const char * p_caseId, TestCaseType test_case_type, const std::string names[], int names_len )
+{
+ std::string output_path = std::string ( TEST_SUITE "/input/" ) + p_caseId + ".gl";
+ std::string db_path = std::string ( TEST_SUITE "/actual/" ) + p_caseId + "/db";
+ std::string schema_path = TEST_SUITE "/idx-text.vschema";
+
+ GeneralWriter *gw;
+ try
+ {
+ const char* db_schema;
+ switch (test_case_type) {
+ case caseInsensitiveLower:
+ db_schema = "idx_text:ci_lower:test:database";
+ break;
+ case caseInsensitiveUpper:
+ db_schema = "idx_text:ci_upper:test:database";
+ break;
+ case caseSensitive:
+ db_schema = "idx_text:cs:test:database";
+ break;
+ case defaultCaseSensitive:
+ db_schema = "idx_text:default_cs:test:database";
+ break;
+ default:
+ assert(false);
+ }
+ gw = new GeneralWriter ( output_path );
+
+ gw -> setRemotePath ( db_path );
+ gw -> useSchema ( schema_path, db_schema );
+
+ int table_id = gw -> addTable ( tableName );
+ int column_name_id = gw -> addColumn ( table_id, "NAME", 8 );
+
+ gw -> open ();
+
+ for (int i = 0; i < names_len; ++i)
+ {
+ if ( names[i].size() > 0 )
+ gw -> write ( column_name_id, 8, names[i].c_str(), names[i].size() );
+ else
+ gw -> columnDefault ( column_name_id, 8, names[i].c_str(), names[i].size() );
+
+ gw -> nextRow(table_id);
+ }
+
+ gw -> endStream ();
+
+ delete gw;
+
+ }
+ catch ( ... )
+ {
+ delete gw;
+ throw;
+ }
+}
+
+int main()
+{
+ {
+ std::string names[] = {"", "a", "a", "a", "A", "", "b"};
+ const char * test_case_id = "ci-1";
+
+ run( test_case_id, caseInsensitiveLower, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {"abcdefghi", "abcdefghi", "abcdefghi", "abcdefGHI", "ABcdefghi", "ABcdefghi1234567890"};
+ const char * test_case_id = "ci-2";
+
+ run( test_case_id, caseInsensitiveLower, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {"abcdefghi", "abcdefghi", "abcdefGHI", "ABcdefghi"};
+ const char * test_case_id = "ci-3";
+
+ run( test_case_id, caseInsensitiveLower, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {"abcdefghi", "abcdefghi", "abcdefGHI", "ABcdefghi"};
+ const char * test_case_id = "ci-4";
+
+ run( test_case_id, caseInsensitiveUpper, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {
+ // very long name - 1025 characters
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+ "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+ "",
+ "aaa",
+ ""
+ };
+ const char * test_case_id = "ci-5";
+
+ run( test_case_id, caseInsensitiveLower, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {"abcdefghi", "abcdefghi", "abcdefghi", "abcdefGHI", "ABcdefghi", "ABcdefghi1234567890"};
+ const char * test_case_id = "cs-1";
+
+ run( test_case_id, caseSensitive, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {"abcdefghi", "abcdefghi", "abcdefghi", "abcdefGHI", "ABcdefghi", "ABcdefghi1234567890"};
+ const char * test_case_id = "cs-2";
+
+ run( test_case_id, defaultCaseSensitive, names, sizeof names / sizeof names[0] );
+ }
+
+ {
+ std::string names[] = {
+ // very long name - 1024 characters
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+ // very long name - 1023 characters
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+ // very long name - 1025 characters
+ "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [...]
+ "",
+ "aaa",
+ ""
+ };
+ const char * test_case_id = "cs-3";
+
+ run( test_case_id, caseSensitive, names, sizeof names / sizeof names[0] );
+ }
+
+ return 0;
+}
diff --git a/test/vschema/runtestcase.sh b/test/vschema/runtestcase.sh
new file mode 100755
index 0000000..dd41aee
--- /dev/null
+++ b/test/vschema/runtestcase.sh
@@ -0,0 +1,126 @@
+#!/bin/bash
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#echo "$0 $*"
+
+# $1 - path to sra-tools executables (general-loader, vdb-dump)
+# $2 - work directory (expected results under expected/, actual results and temporaries created under actual/)
+# $3 - test case ID (expect a file input/$3.gl to exist)
+# $4 - expected return coode
+# $5, $6, ... - command line options for general-loader
+#
+# return codes:
+# 0 - passed
+# 1 - could not create temp dir
+# 2 - unexpected return code from general-loader
+# 3 - vdb-dump failed on the output of general-loader
+# 4 - outputs differ
+
+BINDIR=$1
+WORKDIR=$2
+SUITEID=$3
+CASEID=$4
+RC=$5
+EXTRA_CHECKER_PRESENT=$6
+if [ "$EXTRA_CHECKER_PRESENT" == "y" ] ; then
+ EXTRA_CHECKER=$7
+ shift 7
+else
+ EXTRA_CHECKER=
+ shift 6
+fi
+CMDLINE=$*
+
+DUMP="$BINDIR/vdb-dump"
+LOAD="$BINDIR/general-loader"
+TEMPDIR=$WORKDIR/actual/$CASEID
+
+echo "running test $SUITEID:$CASEID"
+
+mkdir -p $TEMPDIR
+rm -rf $TEMPDIR/*
+if [ "$?" != "0" ] ; then
+ exit 1
+fi
+
+CMD="export VDB_CONFIG=`pwd`; cat $SUITEID/input/$CASEID.gl | $LOAD $CMDLINE 1>$TEMPDIR/load.stdout 2>$TEMPDIR/load.stderr"
+#echo $CMD
+eval $CMD
+rc="$?"
+if [ "$rc" != "$RC" ] ; then
+ echo "$LOAD returned $rc, expected $RC"
+ echo "command executed:"
+ echo $CMD
+
+ cat $TEMPDIR/load.stdout
+ cat $TEMPDIR/load.stderr
+ exit 2
+fi
+
+if [ "$rc" == "0" ] ; then
+ CMD="$DUMP $TEMPDIR/db 1>$TEMPDIR/dump.stdout 2>$TEMPDIR/dump.stderr"
+ #echo $CMD
+ eval $CMD || exit 3
+ diff $WORKDIR/expected/$CASEID.stdout $TEMPDIR/dump.stdout >$TEMPDIR/diff
+ rc="$?"
+else
+ # remove timestamps
+ sed -i -e 's/^....-..-..T..:..:.. //g' $TEMPDIR/load.stderr
+ # remove pathnames
+ sed -i -e 's=/.*/==g' $TEMPDIR/load.stderr
+ # remove source locations
+ sed -i -e 's=: .*:[0-9]*:[^ ]*:=:=g' $TEMPDIR/load.stderr
+ # remove version number
+ sed -i -e 's=latf-load\(\.[0-9]*\)*=latf-load=g' $TEMPDIR/load.stderr
+ diff $WORKDIR/expected/$CASEID.stderr $TEMPDIR/load.stderr >$TEMPDIR/diff
+ rc="$?"
+fi
+
+if [ "$rc" != "0" ] ; then
+ echo "command executed:"
+ echo $CMD
+
+ cat $TEMPDIR/diff
+ exit 4
+fi
+
+if [ "$EXTRA_CHECKER_PRESENT" == "y" ] ; then
+ CMD="$EXTRA_CHECKER $CASEID 1>$TEMPDIR/extra_checker.stdout 2>$TEMPDIR/extra_checker.stderr"
+ eval $CMD
+ rc="$?"
+
+ if [ "$rc" != "0" ] ; then
+ echo "command executed:"
+ echo $CMD
+
+ cat $TEMPDIR/extra_checker.stdout
+ cat $TEMPDIR/extra_checker.stderr
+
+ exit 5
+ fi
+fi
+
+rm -rf $TEMPDIR
+
+exit 0
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644
index 0000000..f523b36
--- /dev/null
+++ b/tools/.gitignore
@@ -0,0 +1,6 @@
+pileupcomp
+avg-qual
+sra-rewrite
+core.*
+gmon.out
+
diff --git a/tools/Makefile b/tools/Makefile
new file mode 100644
index 0000000..8c67e95
--- /dev/null
+++ b/tools/Makefile
@@ -0,0 +1,91 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+by_default: default
+
+TOP ?= $(abspath ..)
+MODULE = tools
+
+include $(TOP)/build/Makefile.shell
+
+include $(TOP)/build/Makefile.config
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS = \
+ util \
+ align-cache \
+ kar \
+ kqsh \
+ vdb-dump \
+ sra-dump \
+ sra-pileup \
+ bam-loader \
+ fastq-loader \
+ srapath \
+ sra-stat \
+ vdb-copy \
+ rd-filter-redact \
+ vdb-config \
+ align-info \
+ qual-recalib-stat \
+ prefetch \
+ vdb-decrypt \
+ vdb-validate \
+ sra-sort \
+ cache-mgr \
+ vcf-loader \
+ copycat \
+ sra-load \
+ ccextract \
+ pacbio-load \
+ fuse \
+ vdb-diff \
+ kget \
+ ngs-pileup \
+ general-loader \
+ fastdump \
+
+ifneq (win,$(BUILD_OS))
+ifneq (rwin,$(BUILD_OS))
+ SUBDIRS += cg-load pileup-stats
+endif
+endif
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+$(SUBDIRS):
+ @ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS)
+
+#-------------------------------------------------------------------------------
+# pass-through
+#
+out debug profile release GCC ICC VC++:
+ @ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env $@
+
+.PHONY: out debug profile release GCC ICC VC++
diff --git a/tools/align-cache/Makefile b/tools/align-cache/Makefile
new file mode 100644
index 0000000..bc0a781
--- /dev/null
+++ b/tools/align-cache/Makefile
@@ -0,0 +1,78 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/align-cache
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ align-cache
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# align-cache
+#
+ALIGN_CACHE_SRC = \
+ align-cache \
+ helper
+
+ALIGN_CACHE_OBJ = \
+ $(addsuffix .$(OBJX),$(ALIGN_CACHE_SRC))
+
+ALIGN_CACHE_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -sm \
+ -sload
+
+$(BINDIR)/align-cache: $(ALIGN_CACHE_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(ALIGN_CACHE_LIB)
diff --git a/tools/align-cache/align-cache.cpp b/tools/align-cache/align-cache.cpp
new file mode 100644
index 0000000..c988f27
--- /dev/null
+++ b/tools/align-cache/align-cache.cpp
@@ -0,0 +1,552 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "helper.h"
+
+#include <stdio.h>
+#include <iostream>
+
+#include <kapp/main.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+
+namespace AlignCache
+{
+ struct Params
+ {
+ // Command line Params:
+ char const* dbPathSrc;
+ char const* dbPathDst;
+
+ // Command line options
+ int64_t id_spread_threshold;
+ size_t cursor_cache_size;
+ size_t min_cache_count;
+
+ // Internal parameters
+ bool cache_alignment_count;
+ } g_Params =
+ {
+ // Command line Params:
+ "",
+ "",
+ // Command line options
+ 50000,
+#if _ARCH_BITS == 64
+ 16UL << 30, // 16 GB
+#else
+ 1024UL << 20, // 1 GB
+#endif
+ 100000,
+ // Internal parameters
+ true
+ };
+
+ char const OPTION_ID_SPREAD_THRESHOLD[] = "threshold";
+ char const ALIAS_ID_SPREAD_THRESHOLD[] = "t";
+ char const* USAGE_ID_SPREAD_THRESHOLD[] = { "cache PRIMARY_ALIGNMENT records with difference between values of ALIGN_ID and MATE_ALIGN_ID >= the value of 'threshold' option", NULL };
+
+ char const OPTION_CURSOR_CACHE_SIZE[] = "cursor-cache";
+ //char const ALIAS_CURSOR_CACHE_SIZE[] = "c";
+ char const* USAGE_CURSOR_CACHE_SIZE[] = { "the size of the read cursor in Megabytes", NULL };
+
+ char const OPTION_MIN_CACHE_COUNT[] = "min-cache-count";
+ //char const ALIAS_MIN_CACHE_COUNT[] = "";
+ char const* USAGE_MIN_CACHE_COUNT[] = { "if the number of primary alignment ids in the src db selected for caching is less than <min-cache-count>, the cache db will not be created at all", NULL };
+
+ ::OptDef Options[] =
+ {
+ { OPTION_ID_SPREAD_THRESHOLD, ALIAS_ID_SPREAD_THRESHOLD, NULL, USAGE_ID_SPREAD_THRESHOLD, 1, true, false },
+ { OPTION_CURSOR_CACHE_SIZE, NULL, NULL, USAGE_CURSOR_CACHE_SIZE, 1, true, false },
+ { OPTION_MIN_CACHE_COUNT, NULL, NULL, USAGE_MIN_CACHE_COUNT, 1, true, false },
+ };
+
+ struct PrimaryAlignmentData
+ {
+ uint64_t prev_key;
+ VDBObjects::CVCursor const* pCursorPA;
+ uint32_t const* pColumnIndex;
+ uint32_t const* pColumnIndexCache;
+ size_t const column_count;
+ VDBObjects::CVCursor* pCursorPACache;
+ //size_t count;
+ //size_t const total_count;
+ KApp::CProgressBar* pProgressBar;
+ };
+
+ //size_t print_percent ( size_t count, size_t total_count )
+ //{
+ // size_t const total_points = 10000;
+ // if ( total_count >= total_points && !(count % (total_count / total_points)) )
+ // {
+ // size_t points = (size_t)(total_points*count/total_count);
+ // std::cout
+ // << (100*points/total_points)
+ // << "."
+ // << ( 1000*points/total_points % 10 )
+ // << ( 10000*points/total_points % 10 )
+ // << "% ("
+ // << count
+ // << "/"
+ // << total_count
+ // << ")"
+ // << std::endl;
+ // return points;
+ // }
+ // else
+ // return 0;
+ //}
+
+ template <typename T>
+ void copy_single_int_field (
+ VDBObjects::CVCursor const& curFrom,
+ VDBObjects::CVCursor& curTo,
+ int64_t row_id,
+ uint32_t column_index_from,
+ uint32_t column_index_to
+ )
+ {
+ T val;
+ curFrom.ReadItems ( row_id, column_index_from, & val, sizeof (T) );
+ curTo.Write ( column_index_to, & val, 1 );
+ }
+
+ void copy_str_field (
+ VDBObjects::CVCursor const& curFrom,
+ VDBObjects::CVCursor& curTo,
+ int64_t row_id,
+ uint32_t column_index_from,
+ uint32_t column_index_to
+ )
+ {
+ char val[4096];
+ uint32_t item_count = curFrom.ReadItems ( row_id, column_index_from, val, sizeof (val) );
+ curTo.Write ( column_index_to, val, item_count );
+ }
+
+
+ rc_t KVectorCallbackPrimaryAlignment ( uint64_t key, bool value, void *user_data )
+ {
+ if ( ::Quitting() )
+ {
+ LOGMSG ( klogWarn, "Interrupted" );
+ return 1;
+ }
+
+ assert ( value );
+ PrimaryAlignmentData* p = (PrimaryAlignmentData*)user_data;
+ int64_t prev_row_id = (int64_t)p->prev_key;
+ int64_t row_id = (int64_t)key;
+ VDBObjects::CVCursor& cur_cache = *p->pCursorPACache;
+
+ p->pProgressBar->Process ( 1, false );
+
+ //++p->count;
+ //print_percent (p->count, p->total_count);
+
+ // Filling gaps between actually cached rows with zero-length records
+ if ( p->prev_key )
+ {
+ if ( row_id - prev_row_id > 1)
+ {
+ cur_cache.OpenRow ();
+ cur_cache.CommitRow ();
+ if (row_id - prev_row_id > 2)
+ cur_cache.RepeatRow ( row_id - prev_row_id - 2 ); // -2 due to the first zero-row has been written in the previous line
+ cur_cache.CloseRow ();
+ }
+ }
+
+ // Caching (copying) actual record from PRIMARY_ALIGNMENT table
+ {
+ // The very first visit - need to set starting row_id
+ if ( p->prev_key == 0 )
+ cur_cache.SetRowId ( row_id );
+
+ VDBObjects::CVCursor const& cur_pa = *p->pCursorPA;
+ uint32_t const* ColIndexPA = p->pColumnIndex;
+ uint32_t const* ColIndexCache = p->pColumnIndexCache;
+
+ cur_cache.OpenRow ();
+
+ // MATE_ALIGN_ID
+ size_t column_index = 0;
+ copy_single_int_field <int64_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // SAM_FLAGS
+ ++ column_index;
+ copy_single_int_field <uint32_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // TEMPLATE_LEN
+ ++ column_index;
+ copy_single_int_field <int32_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // MATE_REF_NAME
+ ++ column_index;
+ copy_str_field (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // MATE_REF_POS
+ ++ column_index;
+ copy_single_int_field <uint32_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // SAM_QUALITY
+ ++ column_index;
+ copy_str_field (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // RD_FILTER
+ ++ column_index;
+ copy_single_int_field <uint8_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ // SPOT_GROUP
+ ++ column_index;
+ copy_str_field (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+
+ if ( g_Params.cache_alignment_count )
+ {
+ // ALIGNMENT_COUNT
+ ++ column_index;
+ copy_single_int_field <uint8_t> (cur_pa, cur_cache, row_id, ColIndexPA[column_index], ColIndexCache[column_index] );
+ }
+
+ cur_cache.CommitRow ();
+ cur_cache.CloseRow ();
+
+ p->prev_key = key;
+ }
+
+ return 0;
+ }
+
+ bool ProcessSequenceRow ( int64_t idRow, VDBObjects::CVCursor const& cursor, KLib::CKVector& vect, uint32_t idxCol )
+ {
+ int64_t buf[3]; // TODO: find out the real type of this array
+ uint32_t items_read_count = cursor.ReadItems ( idRow, idxCol, buf, countof(buf) );
+ if ( items_read_count == 2 )
+ {
+ int64_t id1 = buf[0];
+ int64_t id2 = buf[1];
+ int64_t diff = id1 >= id2 ? id1 - id2 : id2 - id1;
+
+ if (id1 && id2 && diff > g_Params.id_spread_threshold)
+ {
+ vect.SetBool(id1, true);
+ vect.SetBool(id2, true);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ size_t FillKVectorWithAlignIDs (VDBObjects::CVDatabase const& vdb, size_t cache_size, KLib::CKVector& vect )
+ {
+ char const* ColumnNamesSequence[] =
+ {
+ "PRIMARY_ALIGNMENT_ID"
+ };
+ uint32_t ColumnIndexSequence [ countof (ColumnNamesSequence) ];
+
+ VDBObjects::CVTable table = vdb.OpenTable("SEQUENCE");
+
+ VDBObjects::CVCursor cursor = table.CreateCursorRead ( cache_size );
+ cursor.InitColumnIndex (ColumnNamesSequence, ColumnIndexSequence, countof(ColumnNamesSequence), false);
+ cursor.Open();
+
+ int64_t idRow = 0;
+ uint64_t nRowCount = 0;
+ size_t count = 0;
+
+ cursor.GetIdRange (idRow, nRowCount);
+
+ for (; (uint64_t)idRow < nRowCount; ++idRow )
+ {
+ if ( ::Quitting() )
+ {
+ LOGMSG ( klogWarn, "Interrupted" );
+ return 0;
+ }
+
+ if ( ProcessSequenceRow (idRow, cursor, vect, ColumnIndexSequence[0]) )
+ ++count;
+ }
+
+ return count;
+ }
+
+ void CachePrimaryAlignment (VDBObjects::CVDBManager& mgr, VDBObjects::CVDatabase const& vdb, size_t cache_size, KLib::CKVector const& vect, size_t vect_size, KApp::CProgressBar& progress_bar)
+ {
+ // Defining the set of columns to be copied from PRIMARY_ALIGNMENT table
+ // to the new cache table
+ // ALIGNMENT_COUNT is the optional column, it must be at the end of this array
+#define DECLARE_PA_COLUMNS( arrName, column_suffix ) char const* arrName[] =\
+ {\
+ "MATE_ALIGN_ID" column_suffix,\
+ "SAM_FLAGS" column_suffix,\
+ "TEMPLATE_LEN" column_suffix,\
+ "MATE_REF_NAME" column_suffix,\
+ "MATE_REF_POS" column_suffix,\
+ "SAM_QUALITY" column_suffix,\
+ "RD_FILTER" column_suffix,\
+ "SPOT_GROUP" column_suffix,\
+ "ALIGNMENT_COUNT" column_suffix\
+ }
+
+ DECLARE_PA_COLUMNS (ColumnNamesPrimaryAlignment, "");
+ DECLARE_PA_COLUMNS (ColumnNamesPrimaryAlignmentCache, "_CACHE");
+#undef DECLARE_PA_COLUMNS
+
+ uint32_t ColumnIndexPrimaryAlignment [ countof (ColumnNamesPrimaryAlignment) ];
+ uint32_t ColumnIndexPrimaryAlignmentCache [ countof (ColumnNamesPrimaryAlignmentCache) ];
+
+ // Openning cursor to iterate through PRIMARY_ALIGNMENT table
+ VDBObjects::CVTable tablePA = vdb.OpenTable("PRIMARY_ALIGNMENT");
+ VDBObjects::CVCursor cursorPA = tablePA.CreateCursorRead ( cache_size );
+ cursorPA.PermitPostOpenAdd();
+ cursorPA.InitColumnIndex ( ColumnNamesPrimaryAlignment, ColumnIndexPrimaryAlignment, countof(ColumnNamesPrimaryAlignment) - 1, false );
+ cursorPA.Open();
+
+ // Check if we can read ALIGNMENT_COUNT parameter
+ try
+ {
+ cursorPA.InitColumnIndex(
+ ColumnNamesPrimaryAlignment + countof(ColumnNamesPrimaryAlignment) - 1,
+ ColumnIndexPrimaryAlignment + countof(ColumnIndexPrimaryAlignment) - 1,
+ 1, false
+ );
+ }
+ catch (Utils::CErrorMsg const& e)
+ {
+ if (e.getRC() == RC ( rcVDB, rcCursor, rcUpdating, rcColumn, rcNotFound ) )
+ g_Params.cache_alignment_count = false;
+ else
+ throw;
+ }
+
+ // Creating new cache table (with the same name - PRIMARY_ALIGNMENT but in the separate DB file)
+ char const schema_path[] = "align/mate-cache.vschema";
+
+ VDBObjects::CVSchema schema = mgr.MakeSchema ();
+ schema.VSchemaParseFile ( schema_path );
+ char szCacheDBName[256] = "";
+ string_printf (szCacheDBName, countof (szCacheDBName), NULL, "%s", g_Params.dbPathDst );
+ VDBObjects::CVDatabase dbCache = mgr.CreateDB ( schema, "NCBI:align:db:mate_cache #1", kcmParents | kcmInit | kcmMD5, szCacheDBName );
+ VDBObjects::CVTable tableCache = dbCache.CreateTable ( "PRIMARY_ALIGNMENT" );
+
+ VDBObjects::CVCursor cursorCache = tableCache.CreateCursorWrite ( kcmInsert );
+ cursorCache.InitColumnIndex ( ColumnNamesPrimaryAlignmentCache, ColumnIndexPrimaryAlignmentCache, countof (ColumnNamesPrimaryAlignmentCache) - (size_t) (!g_Params.cache_alignment_count), true );
+ cursorCache.Open ();
+
+ //PrimaryAlignmentData data = { 0, &cursorPA, ColumnIndexPrimaryAlignment, ColumnIndexPrimaryAlignmentCache, countof (ColumnNamesPrimaryAlignment), &cursorCache, 0, vect_size };
+ progress_bar.Append (vect_size);
+ PrimaryAlignmentData data =
+ {
+ 0,
+ &cursorPA,
+ ColumnIndexPrimaryAlignment,
+ ColumnIndexPrimaryAlignmentCache,
+ countof (ColumnNamesPrimaryAlignment),
+ &cursorCache,
+ &progress_bar
+ };
+
+ // process each saved primary_alignment_id
+ vect.VisitBool ( KVectorCallbackPrimaryAlignment, & data );
+ cursorCache.Commit ();
+ }
+
+ int create_cache_db_impl()
+ {
+ // Adding 0% mark at the very beginning of the program
+ KApp::CProgressBar progress_bar(1);
+ progress_bar.Process ( 0, true );
+
+ VDBObjects::CVDBManager mgr;
+ mgr.Make();
+
+ VDBObjects::CVDatabase vdb = mgr.OpenDB (g_Params.dbPathSrc);
+
+ // Scan SEQUENCE table to find mate_alignment_ids that have to be cached
+ KLib::CKVector vect;
+ size_t count = FillKVectorWithAlignIDs ( vdb, g_Params.cursor_cache_size, vect );
+
+ if ( count*2 >= g_Params.min_cache_count )
+ {
+ // For each id in vect cache the PRIMARY_ALIGNMENT record
+ CachePrimaryAlignment ( mgr, vdb, g_Params.cursor_cache_size, vect, count*2, progress_bar );
+ }
+ else
+ {
+ if ( ::Quitting() == 0 )
+ {
+ PLOGMSG ( klogWarn,
+ ( klogWarn,
+ "The cache db will not be created because there is not "
+ "enough records to cache: $(COUNT) is found and minimum $(MIN_COUNT) is required. "
+ "The minimum required number can be changed via $(OPTION_MIN_CACHE_COUNT) parameter.",
+ "COUNT=%zu,MIN_COUNT=%zu,OPTION_MIN_CACHE_COUNT=%s",
+ count*2, g_Params.min_cache_count, OPTION_MIN_CACHE_COUNT
+ ));
+ }
+ }
+
+ mgr.Release (); // should not be necessary - destructor should do job
+ return 0;
+ }
+
+ // interpret exception processed by Utils::HandleException:
+ // filter out some errors like invalid db - users don't want to
+ // see such errors as actual errors
+ int InterpretException ( int64_t rcCodeUtil, bool bSilent, char const* szErrDesc )
+ {
+ if ( rcCodeUtil == Utils::rcUnknown ||
+ rcCodeUtil == Utils::rcErrorStdExc ||
+ rcCodeUtil == Utils::rcInvalid)
+ {
+ if ( ! bSilent )
+ LOGMSG ( klogErr, szErrDesc );
+
+ return 3;
+ }
+ else if (rcCodeUtil == SILENT_RC( rcDB,rcMgr,rcOpening,rcDatabase,rcIncorrect ) ||
+ rcCodeUtil == SILENT_RC( rcVFS,rcTree,rcResolving,rcPath,rcNotFound ))
+ {
+ if ( ! bSilent )
+ LOGMSG ( klogWarn, szErrDesc );
+ return 0;
+ }
+ else
+ {
+ if ( ! bSilent )
+ LOGMSG ( klogErr, szErrDesc );
+ return 3;
+ }
+ }
+
+ int create_cache_db_impl_safe ()
+ {
+ try
+ {
+ return create_cache_db_impl ();
+ }
+ catch (...)
+ {
+ char szErrDesc [512];
+ int64_t rc = Utils::HandleException ( true, szErrDesc, countof(szErrDesc) );
+ return InterpretException ( rc, false, szErrDesc );
+ }
+ }
+
+ int create_cache_db (int argc, char** argv)
+ {
+ try
+ {
+ KApp::CArgs args (argc, argv, Options, countof (Options), ::XMLLogger_Args, ::XMLLogger_ArgsQty);
+ KApp::CXMLLogger xml_logger ( args );
+ uint32_t param_count = args.GetParamCount ();
+ if ( param_count != 2 )
+ {
+ MiniUsage (args.GetArgs());
+ return 0;
+ }
+
+ g_Params.dbPathSrc = args.GetParamValue (0);
+ g_Params.dbPathDst = args.GetParamValue (1);
+
+ if (args.GetOptionCount (OPTION_ID_SPREAD_THRESHOLD))
+ g_Params.id_spread_threshold = args.GetOptionValueUInt<int64_t> ( OPTION_ID_SPREAD_THRESHOLD, 0 );
+
+ if (args.GetOptionCount (OPTION_CURSOR_CACHE_SIZE))
+ g_Params.cursor_cache_size = 1024*1024 * args.GetOptionValueUInt<size_t> ( OPTION_CURSOR_CACHE_SIZE, 0 );
+
+ if (args.GetOptionCount (OPTION_MIN_CACHE_COUNT))
+ g_Params.min_cache_count = args.GetOptionValueUInt <size_t> ( OPTION_MIN_CACHE_COUNT, 0 );
+
+ return create_cache_db_impl_safe ();
+ }
+ catch (...) // here we handle only exceptions in CArgs or CXMLLogger
+ {
+ return Utils::HandleException ( false, NULL, 0 );
+ }
+ }
+}
+
+
+extern "C"
+{
+ const char UsageDefaultName[] = "align-cache";
+ rc_t CC UsageSummary (const char * progname)
+ {
+ printf (
+ "Usage:\n"
+ " %s [options] <src-db-path> <new-cache-db-path>\n"
+ "\n"
+ "Summary:\n"
+ " Create a cache file for given database <src-db-path>\n"
+ " PRIMARY_ALIGNMENT table and save it into <new-cache-db-path>\n"
+ "\n", progname);
+ return 0;
+ }
+ const char* param_usage_src[] = { "Path to the database", NULL };
+ const char* param_usage_dst[] = { "Path to the new cache database to be created", NULL };
+ rc_t CC Usage (::Args const* args)
+ {
+ rc_t rc = 0;
+ const char* progname = UsageDefaultName;
+ const char* fullpath = UsageDefaultName;
+
+ if (args == NULL)
+ rc = RC(rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram(args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ printf("Parameters:\n");
+
+ HelpParamLine ("src-db-path", param_usage_src);
+ HelpParamLine ("new-cache-db-path", param_usage_dst);
+
+ printf ("\nOptions:\n");
+
+ HelpOptionLine (AlignCache::ALIAS_ID_SPREAD_THRESHOLD, AlignCache::OPTION_ID_SPREAD_THRESHOLD, "value", AlignCache::USAGE_ID_SPREAD_THRESHOLD);
+ HelpOptionLine (NULL, AlignCache::OPTION_CURSOR_CACHE_SIZE, "value in MB", AlignCache::USAGE_CURSOR_CACHE_SIZE);
+ HelpOptionLine (NULL, AlignCache::OPTION_MIN_CACHE_COUNT, "count", AlignCache::USAGE_MIN_CACHE_COUNT);
+ XMLLogger_Usage();
+
+ printf ("\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+ }
+
+ rc_t CC KMain(int argc, char* argv[])
+ {
+ return AlignCache::create_cache_db (argc, argv);
+ }
+}
diff --git a/tools/align-cache/helper.cpp b/tools/align-cache/helper.cpp
new file mode 100644
index 0000000..1b02c48
--- /dev/null
+++ b/tools/align-cache/helper.cpp
@@ -0,0 +1,923 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+// helper.cpp
+
+#include "helper.h"
+
+#include <algorithm>
+#include <stdio.h>
+#include <iostream>
+
+#include <vdb/vdb-priv.h>
+#include <klib/rc.h>
+
+#ifdef _WIN32
+#pragma warning (disable:4503)
+#endif
+
+// TODO: remove printfs
+namespace KLib
+{
+ CKVector::CKVector() : m_pSelf(NULL)
+ {
+ Make();
+ }
+
+ CKVector::~CKVector()
+ {
+ Release();
+ }
+
+ void CKVector::Make()
+ {
+ if (m_pSelf)
+ throw Utils::CErrorMsg (0, "Duplicated call to KVectorMake");
+
+ rc_t rc = ::KVectorMake(&m_pSelf);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KVectorMake");
+#if DEBUG_PRINT != 0
+ printf("Created KVector %p\n", m_pSelf);
+#endif
+ }
+
+ void CKVector::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing KVector %p\n", m_pSelf);
+#endif
+ ::KVectorRelease(m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+ size_t const RECORD_SIZE_IN_BITS = 2;
+ uint64_t const BIT_SET_MASK = 0x2;
+ uint64_t const BIT_VALUE_MASK = 0x1;
+ uint64_t const BIT_RECORD_MASK = BIT_SET_MASK | BIT_VALUE_MASK;
+
+ void CKVector::SetBool(uint64_t key, bool value)
+ {
+#if USING_UINT64_BITMAP == 1
+ uint64_t stored_bits = 0;
+ uint64_t key_qword = key / 64;
+ uint64_t key_bit = key % 64;
+ rc_t rc = ::KVectorGetU64 ( m_pSelf, key_qword, &stored_bits );
+ bool first_time = rc == RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound ); // 0x1e615458
+ if ( !first_time && rc )
+ throw Utils::CErrorMsg(rc, "KVectorGetU64");
+
+ uint64_t new_bit = (uint64_t)value << key_bit;
+ uint64_t stored_bit = (uint64_t)1 << key_bit & stored_bits;
+
+ if ( first_time || new_bit != stored_bit )
+ {
+ if ( new_bit )
+ stored_bits |= new_bit;
+ else
+ stored_bits &= ~new_bit;
+
+ rc_t rc = ::KVectorSetU64 ( m_pSelf, key_qword, stored_bits );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KVectorSetU64");
+ }
+#elif USING_UINT64_BITMAP == 2
+ uint64_t stored_bits = 0;
+ uint64_t key_qword = key / (sizeof(stored_bits) * 8 / RECORD_SIZE_IN_BITS);
+ uint64_t bit_offset_in_qword = (key % (sizeof(stored_bits) * 8 / RECORD_SIZE_IN_BITS)) * RECORD_SIZE_IN_BITS;
+ rc_t rc = ::KVectorGetU64 ( m_pSelf, key_qword, &stored_bits );
+ bool first_time = rc == RC ( rcCont, rcVector, rcAccessing, rcItem, rcNotFound ); // 0x1e615458;
+ if ( !first_time && rc )
+ throw Utils::CErrorMsg(rc, "KVectorGetU64");
+
+ uint64_t new_bit_record = (BIT_SET_MASK | (uint64_t)value) << bit_offset_in_qword;
+ uint64_t stored_bit_record = (uint64_t)BIT_RECORD_MASK << bit_offset_in_qword & stored_bits;
+
+ if ( first_time || new_bit_record != stored_bit_record )
+ {
+ stored_bits &= ~((uint64_t)BIT_RECORD_MASK << bit_offset_in_qword); // clear stored record to assign a new value by bitwise OR
+ stored_bits |= new_bit_record;
+
+ rc_t rc = ::KVectorSetU64 ( m_pSelf, key_qword, stored_bits );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KVectorSetU64");
+ }
+#else
+
+ rc_t rc = ::KVectorSetBool ( m_pSelf, key, value );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KVectorSetBool");
+#endif
+ }
+
+ struct UserDataU64toBool
+ {
+ rc_t ( * f ) ( uint64_t key, bool value, void *user_data );
+ void* user_data;
+ };
+#if USING_UINT64_BITMAP == 1
+ rc_t VisitU64toBoolAdapter ( uint64_t key, uint64_t value, void *user_data )
+ {
+ rc_t ( * bool_callback ) ( uint64_t key, bool value, void *user_data );
+ bool_callback = ((UserDataU64toBool*) user_data) -> f;
+ void* original_user_data = ((UserDataU64toBool*) user_data) -> user_data;
+
+ rc_t rc = 0;
+ for ( size_t i = 0; i < sizeof (value) * 8; ++i )
+ {
+ rc = bool_callback ( key * 64 + i, (bool) ((uint64_t)1 << i & value), original_user_data );
+ if ( rc )
+ return rc;
+ }
+ return rc;
+ }
+#elif USING_UINT64_BITMAP == 2
+ rc_t VisitU64toBoolAdapter ( uint64_t key, uint64_t value, void *user_data )
+ {
+ rc_t ( * bool_callback ) ( uint64_t key, bool value, void *user_data );
+ bool_callback = ((UserDataU64toBool*) user_data) -> f;
+ void* original_user_data = ((UserDataU64toBool*) user_data) -> user_data;
+
+ rc_t rc = 0;
+ for ( size_t i = 0; i < sizeof (value) * 8 / RECORD_SIZE_IN_BITS; ++i )
+ {
+ uint64_t key_bool = key * sizeof(value) * 8 / RECORD_SIZE_IN_BITS + i;
+ uint64_t record = value >> i * RECORD_SIZE_IN_BITS & BIT_RECORD_MASK;
+ if ( record & BIT_SET_MASK )
+ {
+ rc = bool_callback ( key_bool, (bool) (record & BIT_VALUE_MASK), original_user_data );
+ if ( rc )
+ return rc;
+ }
+ }
+ return rc;
+ }
+#endif
+
+ void CKVector::VisitBool(rc_t ( * f ) ( uint64_t key, bool value, void *user_data ), void *user_data) const
+ {
+#if USING_UINT64_BITMAP == 1
+ UserDataU64toBool user_data_adapter = { f, user_data };
+ ::KVectorVisitU64 ( m_pSelf, false, VisitU64toBoolAdapter, &user_data_adapter );
+#elif USING_UINT64_BITMAP == 2
+ UserDataU64toBool user_data_adapter = { f, user_data };
+ ::KVectorVisitU64 ( m_pSelf, false, VisitU64toBoolAdapter, &user_data_adapter );
+#else
+ ::KVectorVisitBool ( m_pSelf, false, f, user_data );
+#endif
+ }
+}
+
+///////////////////////////////////////////////////////////////
+
+namespace VDBObjects
+{
+ CVCursor::CVCursor() : m_pSelf(NULL)
+ {}
+
+ CVCursor::~CVCursor()
+ {
+ Release();
+ }
+
+ CVCursor::CVCursor(CVCursor const& x)
+ {
+ Clone(x);
+ }
+
+ CVCursor& CVCursor::operator=(CVCursor const& x)
+ {
+ if (m_pSelf)
+ Release();
+
+ Clone(x);
+ return *this;
+ }
+
+ void CVCursor::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing VCursor %p\n", m_pSelf);
+#endif
+ ::VCursorRelease(m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+ void CVCursor::Clone(CVCursor const& x)
+ {
+ m_pSelf = x.m_pSelf;
+ ::VCursorAddRef ( m_pSelf );
+#if DEBUG_PRINT != 0
+ printf ("CLONING VCursor %p\n", m_pSelf);
+#endif
+ }
+
+ void CVCursor::Open() const
+ {
+ rc_t rc = ::VCursorOpen(m_pSelf);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorOpen");
+ }
+
+ void CVCursor::PermitPostOpenAdd() const
+ {
+ rc_t rc = ::VCursorPermitPostOpenAdd ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorPermitPostOpenAdd");
+ }
+
+ void CVCursor::InitColumnIndex(char const* const* ColumnNames, uint32_t* pColumnIndex, size_t nCount, bool set_default)
+ {
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ rc_t rc = ::VCursorAddColumn(m_pSelf, & pColumnIndex[i], ColumnNames[i] );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorAddColumn - [%s]", ColumnNames[i]);
+
+ if ( set_default )
+ {
+ VTypedecl type;
+ VTypedesc desc;
+ uint32_t idx = pColumnIndex[i];
+
+ rc = ::VCursorDatatype ( m_pSelf, idx, & type, & desc );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorDatatype (column idx=%u [%s])", idx, ColumnNames[i]);
+
+ uint32_t elem_bits = ::VTypedescSizeof ( & desc );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VTypedescSizeof (column idx=%u [%s])", idx, ColumnNames[i]);
+ rc = ::VCursorDefault ( m_pSelf, idx, elem_bits, "", 0, 0 );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorDefault (column idx=%u [%s])", idx, ColumnNames[i]);
+ }
+ }
+ }
+
+ void CVCursor::GetIdRange(int64_t& idFirstRow, uint64_t& nRowCount) const
+ {
+ rc_t rc = ::VCursorIdRange(m_pSelf, 0, &idFirstRow, &nRowCount);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorIdRange");
+ }
+
+ int64_t CVCursor::GetRowId () const
+ {
+ int64_t row_id;
+ rc_t rc = ::VCursorRowId ( m_pSelf, & row_id );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorRowId");
+
+ return row_id;
+ }
+
+ void CVCursor::SetRowId (int64_t row_id) const
+ {
+ rc_t rc = ::VCursorSetRowId ( m_pSelf, row_id );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorSetRowId (%ld)", row_id);
+ }
+
+ void CVCursor::OpenRow () const
+ {
+ rc_t rc = ::VCursorOpenRow ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorOpenRow");
+ }
+
+ void CVCursor::CommitRow ()
+ {
+ rc_t rc = ::VCursorCommitRow ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorCommitRow");
+ }
+
+ void CVCursor::RepeatRow ( uint64_t count )
+ {
+ rc_t rc = ::VCursorRepeatRow ( m_pSelf, count );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorRepeatRow (%lu)", count);
+ }
+
+ void CVCursor::CloseRow () const
+ {
+ rc_t rc = ::VCursorCloseRow ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorCloseRow");
+ }
+
+ void CVCursor::Commit ()
+ {
+ rc_t rc = ::VCursorCommit ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorCommit");
+ }
+
+///////////////////////////////////////////////////////////////////////////////////
+
+ CVTable::CVTable() : m_pSelf(NULL)
+ {
+ }
+
+ CVTable::~CVTable()
+ {
+ Release();
+ }
+
+ CVTable::CVTable(CVTable const& x)
+ {
+ Clone(x);
+ }
+
+ CVTable& CVTable::operator=(CVTable const& x)
+ {
+ if (m_pSelf)
+ Release();
+
+ Clone(x);
+ return *this;
+ }
+
+ void CVTable::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing VTable %p\n", m_pSelf);
+#endif
+ ::VTableRelease(m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+ void CVTable::Clone(CVTable const& x)
+ {
+ m_pSelf = x.m_pSelf;
+ ::VTableAddRef ( m_pSelf );
+#if DEBUG_PRINT != 0
+ printf ("CLONING VTable %p\n", m_pSelf);
+#endif
+ }
+
+ CVCursor CVTable::CreateCursorRead ( size_t cache_size ) const
+ {
+ CVCursor cursor;
+ rc_t rc = ::VTableCreateCachedCursorRead(m_pSelf, const_cast<VCursor const**>(& cursor.m_pSelf), cache_size);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VTableCreateCachedCursorRead (%zu)", cache_size);
+
+#if DEBUG_PRINT != 0
+ printf("Created cursor (rd) %p\n", cursor.m_pSelf);
+#endif
+ return cursor;
+ }
+
+ CVCursor CVTable::CreateCursorWrite (::KCreateMode mode)
+ {
+ CVCursor cursor;
+ rc_t rc = ::VTableCreateCursorWrite ( m_pSelf, & cursor.m_pSelf, mode );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VTableCreateCursorWrite");
+
+#if DEBUG_PRINT != 0
+ printf("Created cursor (wr) %p\n", cursor.m_pSelf);
+#endif
+ return cursor;
+ }
+
+//////////////////////////////////////////////////////////////////////
+
+ CVDatabase::CVDatabase() : m_pSelf(NULL)
+ {}
+
+ CVDatabase::~CVDatabase()
+ {
+ Release();
+ }
+
+ CVDatabase::CVDatabase(CVDatabase const& x)
+ {
+ Clone(x);
+ }
+
+ CVDatabase& CVDatabase::operator=(CVDatabase const& x)
+ {
+ if (m_pSelf)
+ Release();
+
+ Clone(x);
+ return *this;
+ }
+
+ void CVDatabase::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing VDatabase %p\n", m_pSelf);
+#endif
+ ::VDatabaseRelease(m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+ void CVDatabase::Clone(CVDatabase const& x)
+ {
+ m_pSelf = x.m_pSelf;
+ ::VDatabaseAddRef ( m_pSelf );
+#if DEBUG_PRINT != 0
+ printf ("CLONING VDatabase %p\n", m_pSelf);
+#endif
+ }
+
+ CVTable CVDatabase::OpenTable(char const* pszTableName) const
+ {
+ CVTable table;
+ rc_t rc = ::VDatabaseOpenTableRead(m_pSelf, const_cast<VTable const**>(& table.m_pSelf), pszTableName);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDatabaseOpenTableRead (%s)", pszTableName);
+
+#if DEBUG_PRINT != 0
+ printf("Opened table %p (%s)\n", table.m_pSelf, pszTableName);
+#endif
+ return table;
+ }
+
+ CVTable CVDatabase::CreateTable ( char const* pszTableName )
+ {
+ CVTable table;
+ //rc_t rc = ::VDatabaseCreateTableDefault ( m_pSelf, & table.m_pSelf, pszTableName, pszTableName );
+ rc_t rc = ::VDatabaseCreateTableByMask ( m_pSelf, & table.m_pSelf, pszTableName, 0, 0, pszTableName );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDatabaseCreateTableDefault (%s)", pszTableName);
+
+#if DEBUG_PRINT != 0
+ printf("Created table %p (%s)\n", table.m_pSelf, pszTableName);
+#endif
+ return table;
+ }
+
+ void CVDatabase::ColumnCreateParams ( ::KCreateMode cmode, ::KChecksum checksum, size_t pgsize )
+ {
+ rc_t rc = ::VDatabaseColumnCreateParams ( m_pSelf, cmode, checksum, pgsize );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDatabaseColumnCreateParams");
+ }
+
+//////////////////////////////////////////////////////////////////////
+
+ CVSchema::CVSchema() : m_pSelf (NULL)
+ {
+ }
+ CVSchema::~CVSchema()
+ {
+ Release();
+ }
+
+ CVSchema::CVSchema(CVSchema const& x)
+ {
+ Clone (x);
+ }
+
+ CVSchema& CVSchema::operator=(CVSchema const& x)
+ {
+ Clone (x);
+ return *this;
+ }
+
+ void CVSchema::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing VSchema %p\n", m_pSelf);
+#endif
+ ::VSchemaRelease ( m_pSelf );
+ m_pSelf = NULL;
+ }
+ }
+
+ void CVSchema::Clone ( CVSchema const& x )
+ {
+ if (false && m_pSelf)
+ {
+ assert(0);
+ Release();
+ }
+ m_pSelf = x.m_pSelf;
+ ::VSchemaAddRef ( m_pSelf );
+#if DEBUG_PRINT != 0
+ printf ("CLONING VSchema %p\n", m_pSelf);
+#endif
+ }
+
+ void CVSchema::VSchemaParseFile ( char const* pszFilePath )
+ {
+ rc_t rc = ::VSchemaParseFile ( m_pSelf, pszFilePath );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VSchemaParseFile (%s)", pszFilePath);
+ }
+
+//////////////////////////////////////////////////////////////////////
+
+ CVDBManager::CVDBManager() : m_pSelf(NULL)
+ {}
+
+ CVDBManager::~CVDBManager()
+ {
+ Release();
+ }
+
+ void CVDBManager::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing VDBManager %p\n", m_pSelf);
+#endif
+ ::VDBManagerRelease(m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+#if MANAGER_WRITABLE != 0
+ void CVDBManager::Make()
+ {
+ assert(m_pSelf == NULL);
+ if (m_pSelf)
+ throw Utils::CErrorMsg(0, "Double call to VDBManagerMakeUpdate");
+
+ rc_t rc = ::VDBManagerMakeUpdate ( & m_pSelf, NULL );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerMakeUpdate");
+
+ /*rc = VDBManagerDisablePagemapThread ( m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerDisablePagemapThread");*/
+
+#if DEBUG_PRINT != 0
+ printf("Created VDBManager (wr) %p\n", m_pSelf);
+#endif
+ }
+#else
+ void CVDBManager::Make()
+ {
+ assert(m_pSelf == NULL);
+ if (m_pSelf)
+ throw Utils::CErrorMsg(0, "Double call to VDBManagerMakeRead");
+
+ rc_t rc = ::VDBManagerMakeRead(const_cast<VDBManager const**>(&m_pSelf), NULL);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerMakeRead");
+
+#if DEBUG_PRINT != 0
+ printf("Created VDBManager (rd) %p\n", m_pSelf);
+#endif
+ }
+#endif
+
+ CVDatabase CVDBManager::OpenDB(char const* pszDBName) const
+ {
+ CVDatabase vdb;
+ rc_t rc = ::VDBManagerOpenDBRead(m_pSelf, const_cast<VDatabase const**>(& vdb.m_pSelf), NULL, pszDBName);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerOpenDBRead (%s)", pszDBName);
+
+#if DEBUG_PRINT != 0
+ printf("Opened database %p (%s)\n", vdb.m_pSelf, pszDBName);
+#endif
+ return vdb;
+ }
+#if MANAGER_WRITABLE != 0
+ CVDatabase CVDBManager::CreateDB ( CVSchema const& schema, char const* pszTypeDesc, ::KCreateMode cmode, char const* pszPath )
+ {
+ CVDatabase vdb;
+ rc_t rc = ::VDBManagerCreateDB ( m_pSelf, & vdb.m_pSelf, schema.m_pSelf, pszTypeDesc, cmode, pszPath );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerCreateDB (%s)", pszPath);
+
+#if DEBUG_PRINT != 0
+ printf("Created database %p (%s)\n", vdb.m_pSelf, pszPath);
+#endif
+ // set creation mode of objects ( tables, columns, etc. ) to
+ // create new or re-initialize existing, plus attach md5 checksums
+ // to all files.
+ // set blob creation mode to record 32-bit CRC within blob
+ // continue to use default page size...
+ vdb.ColumnCreateParams ( kcmInit | kcmMD5, kcsCRC32, 0 );
+ return vdb;
+ }
+#endif
+
+ CVSchema CVDBManager::MakeSchema () const
+ {
+ CVSchema schema;
+ rc_t rc = ::VDBManagerMakeSchema ( m_pSelf, & schema.m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VDBManagerMakeSchema");
+
+#if DEBUG_PRINT != 0
+ printf("Created Schema %p\n", schema.m_pSelf);
+#endif
+ return schema;
+ }
+}
+
+namespace KApp
+{
+ CArgs::CArgs (int argc, char** argv, ::OptDef const* pOptions, size_t option_count)
+ : m_pSelf(NULL)
+ {
+ MakeAndHandle ( argc, argv, pOptions, option_count );
+ }
+
+ CArgs::CArgs (int argc, char** argv, ::OptDef const* pOptions1, size_t option_count1, ::OptDef const* pOptions2, size_t option_count2)
+ : m_pSelf(NULL)
+ {
+ MakeAndHandle ( argc, argv, pOptions1, option_count1, pOptions2, option_count2 );
+ }
+
+ CArgs::~CArgs()
+ {
+ Release();
+ }
+
+ void CArgs::MakeAndHandle (int argc, char** argv, ::OptDef const* pOptions, size_t option_count)
+ {
+ if (m_pSelf)
+ throw Utils::CErrorMsg (0, "Duplicated call to ArgsMakeAndHandle");
+
+ rc_t rc = ::ArgsMakeAndHandle (&m_pSelf, argc, argv, 1, pOptions, option_count);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsMakeAndHandle");
+#if DEBUG_PRINT != 0
+ printf("Created Args %p\n", m_pSelf);
+#endif
+ }
+ void CArgs::MakeAndHandle ( int argc, char** argv, ::OptDef const* pOptions1, size_t option_count1, ::OptDef const* pOptions2, size_t option_count2 )
+ {
+ if (m_pSelf)
+ throw Utils::CErrorMsg (0, "Duplicated call to ArgsMakeAndHandle");
+
+ rc_t rc = ::ArgsMakeAndHandle (&m_pSelf, argc, argv, 2, pOptions1, option_count1, pOptions2, option_count2);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsMakeAndHandle(2)");
+#if DEBUG_PRINT != 0
+ printf("Created Args(2) %p\n", m_pSelf);
+#endif
+ }
+
+ void CArgs::Release()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing Args %p\n", m_pSelf);
+#endif
+ ::ArgsRelease (m_pSelf);
+ m_pSelf = NULL;
+ }
+ }
+
+ ::Args const* CArgs::GetArgs () const
+ {
+ return m_pSelf;
+ }
+
+ uint32_t CArgs::GetParamCount () const
+ {
+ uint32_t ret = 0;
+ rc_t rc = ::ArgsParamCount ( m_pSelf, &ret );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsParamCount");
+
+ return ret;
+ }
+
+ char const* CArgs::GetParamValue ( uint32_t iteration ) const
+ {
+ void const* ret = NULL;
+ rc_t rc = ::ArgsParamValue ( m_pSelf, iteration, & ret );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsParamValue");
+
+ return static_cast <char const*> (ret);
+ }
+
+ uint32_t CArgs::GetOptionCount ( char const* option_name ) const
+ {
+ uint32_t ret = 0;
+ rc_t rc = ::ArgsOptionCount ( m_pSelf, option_name, &ret );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsOptionCount (%s)", option_name);
+
+ return ret;
+ }
+
+ char const* CArgs::GetOptionValue ( char const* option_name, uint32_t iteration ) const
+ {
+ void const* ret = NULL;
+ rc_t rc = ::ArgsOptionValue ( m_pSelf, option_name, iteration, & ret );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "ArgsOptionValue (%s)", option_name);
+
+ return static_cast <char const*> (ret);
+ }
+
+////////////////////////////////
+
+ CProgressBar::CProgressBar ( uint64_t size )
+ {
+ Make ( size );
+ }
+
+ CProgressBar::~CProgressBar ()
+ {
+ Release ();
+ }
+
+ void CProgressBar::Make ( uint64_t size )
+ {
+ rc_t rc = ::KLoadProgressbar_Make ( &m_pSelf, size );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KLoadProgressbar_Make");
+#if DEBUG_PRINT != 0
+ printf ( "Created ProgressBar %p\n", m_pSelf );
+#endif
+ }
+ void CProgressBar::Release ()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing ProgressBar %p\n", m_pSelf);
+#endif
+ ::KLoadProgressbar_Release ( m_pSelf, true );
+ m_pSelf = NULL;
+ }
+ }
+
+ void CProgressBar::Append ( uint64_t chunk )
+ {
+ rc_t rc = ::KLoadProgressbar_Append ( m_pSelf, chunk );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KLoadProgressbar_Append");
+ }
+
+ void CProgressBar::Process ( uint64_t chunk, bool force_report )
+ {
+ rc_t rc = ::KLoadProgressbar_Process ( m_pSelf, chunk, force_report );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "KLoadProgressbar_Process");
+ }
+
+///////////////////////////////////////////
+ CXMLLogger::CXMLLogger ( CArgs const& args )
+ {
+ Make ( args );
+ }
+
+ CXMLLogger::~CXMLLogger ()
+ {
+ Release ();
+ }
+
+ void CXMLLogger::Make ( CArgs const& args )
+ {
+ rc_t rc = ::XMLLogger_Make ( &m_pSelf, NULL, args.m_pSelf );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "XMLLogger_Make");
+#if DEBUG_PRINT != 0
+ printf ( "Created XMLLogger %p\n", m_pSelf );
+#endif
+ }
+
+ void CXMLLogger::Release ()
+ {
+ if (m_pSelf)
+ {
+#if DEBUG_PRINT != 0
+ printf("Releasing XMLLogger %p\n", m_pSelf);
+#endif
+ ::XMLLogger_Release ( m_pSelf );
+ m_pSelf = NULL;
+ }
+ }
+}
+
+namespace Utils
+{
+ CErrorMsg::CErrorMsg(rc_t rc, char const* fmt_str, ...)
+ : m_rc(rc)
+ {
+ va_list args;
+ va_start(args, fmt_str);
+ string_vprintf (m_szDescr, countof(m_szDescr), NULL, fmt_str, args);
+ va_end(args);
+ }
+
+ rc_t CErrorMsg::getRC() const
+ {
+ return m_rc;
+ }
+ char const* CErrorMsg::what() const throw()
+ {
+ return m_szDescr;
+ }
+
+ int64_t HandleException ( bool bSilent, char* pErrDesc, size_t sizeErrDesc )
+ {
+ try
+ {
+ throw;
+ }
+ catch (Utils::CErrorMsg const& e)
+ {
+ char szBufErr[512];
+ if ( pErrDesc == NULL )
+ {
+ pErrDesc = szBufErr;
+ sizeErrDesc = countof(szBufErr);
+ }
+ size_t rc = e.getRC();
+ rc_t res;
+ if (rc != 0)
+ res = string_printf(pErrDesc, sizeErrDesc, NULL, "%s failed with code 0x%08x (%u) [%R]", e.what(), rc, rc, rc);
+ else
+ res = string_printf(pErrDesc, sizeErrDesc, NULL, "%s", e.what());
+ if (res == rcBuffer || res == rcInsufficient)
+ pErrDesc [sizeErrDesc - 1] = '\0';
+
+ if ( ! bSilent )
+ LOGMSG ( klogErr, pErrDesc );
+
+ return rc;
+ }
+ catch (std::exception const& e)
+ {
+ char szBufErr[512];
+ if ( pErrDesc == NULL )
+ {
+ pErrDesc = szBufErr;
+ sizeErrDesc = countof(szBufErr);
+ }
+ rc_t res = string_printf(pErrDesc, sizeErrDesc, NULL, "std::exception: %s", e.what());
+ if (res == rcBuffer || res == rcInsufficient)
+ pErrDesc [sizeErrDesc - 1] = '\0';
+
+ if ( ! bSilent )
+ LOGMSG ( klogErr, pErrDesc );
+
+ return Utils::rcErrorStdExc;
+ }
+ catch (...)
+ {
+ char szBufErr[512];
+ if ( pErrDesc == NULL )
+ {
+ pErrDesc = szBufErr;
+ sizeErrDesc = countof(szBufErr);
+ }
+ rc_t res = string_printf(pErrDesc, sizeErrDesc, NULL, "Unexpected exception occured");
+ if (res == rcBuffer || res == rcInsufficient)
+ pErrDesc [sizeErrDesc - 1] = '\0';
+
+ if ( ! bSilent )
+ LOGMSG ( klogErr, pErrDesc );
+
+ return Utils::rcUnknown;
+ }
+
+ assert ( false );
+ return Utils::rcInvalid; // this shall never be reached
+ }
+}
diff --git a/tools/align-cache/helper.h b/tools/align-cache/helper.h
new file mode 100644
index 0000000..1fe213f
--- /dev/null
+++ b/tools/align-cache/helper.h
@@ -0,0 +1,390 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+// helper.h
+#include <exception>
+#include <string.h>
+
+#include <stdint.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <kapp/args.h>
+#include <kapp/progressbar.h>
+#include <kapp/log-xml.h>
+
+
+#ifndef countof
+#define countof(arr) (sizeof(arr)/sizeof(arr[0]))
+#endif
+
+#ifdef _WIN32
+#pragma warning (disable:4503)
+#endif
+
+#define USING_UINT64_BITMAP 0
+#define MANAGER_WRITABLE 1
+#define DEBUG_PRINT 0
+
+namespace KLib
+{
+ class CKVector
+ {
+ public:
+ CKVector();
+ CKVector (CKVector const& x);
+ CKVector& operator= (CKVector const& x);
+ ~CKVector();
+
+ void SetBool (uint64_t key, bool value);
+ void VisitBool (rc_t ( * f ) ( uint64_t key, bool value, void *user_data ), void *user_data) const;
+
+ private:
+ void Make();
+ void Release();
+
+ ::KVector* m_pSelf;
+ };
+}
+
+namespace Utils
+{
+ class CErrorMsg : public std::exception
+ {
+ public:
+ CErrorMsg(rc_t rc, char const* fmt_str, ...);
+
+ rc_t getRC() const;
+ virtual char const* what() const throw();
+
+ private:
+ char m_szDescr[256];
+ rc_t m_rc;
+ };
+
+ template <typename T> T atoi_t ( char const* str_val )
+ {
+ if ( str_val [0] == '\0' )
+ throw Utils::CErrorMsg(0, "atoi_t: invalid input string (empty)");
+
+ size_t i = 0;
+ char sign = '+';
+ if ( str_val[0] == '-' || str_val[0] == '+' )
+ {
+ ++i;
+ sign = str_val[0];
+ }
+
+ T ret = 0;
+ for (; str_val[i] != '\0'; ++i )
+ {
+ if ( str_val[i] < '0' || str_val[i] > '9' )
+ throw Utils::CErrorMsg(0, "atoi_t: invalid input string \"%s\" (invalid character: '%c' at pos=%zu)", str_val, str_val[i], i+1);
+ ret = ret*10 + str_val[i] - '0';
+ }
+
+ return sign == '-' ? -ret : ret;
+ }
+
+ template <typename T> T atou_t ( char const* str_val )
+ {
+ if ( str_val [0] == '\0' )
+ throw Utils::CErrorMsg(0, "atou_t: invalid input string (empty)");
+
+ T ret = 0;
+ for ( size_t i = 0; str_val[i] != '\0'; ++i )
+ {
+ if ( str_val[i] < '0' || str_val[i] > '9' )
+ throw Utils::CErrorMsg(0, "atoi_t: invalid input string \"%s\" (invalid character: '%c' at pos=%zu)", str_val, str_val[i], i+1);
+ ret = ret*10 + str_val[i] - '0';
+ }
+
+ return ret;
+ }
+
+ enum ErrorHandlerCode
+ {
+ rcUnknown = -2,
+ rcErrorStdExc = -1,
+ rcInvalid = -99
+ // value > 0 means rc_t returned from a VDB-function
+ // zero shall not be returned
+ };
+
+ // This function must be called inside catch block only
+ // if bSilent == true then produce no output, only return ErrorHandlerCode
+ // pErrDesc and sizeErrDesc - the buffer to write error description to (NULL - OK)
+ int64_t HandleException ( bool bSilent, char* pErrDesc, size_t sizeErrDesc );
+}
+
+namespace VDBObjects
+{
+ /* functor to remove trailing '\n' from char reads */
+ template<typename T> class CPostReadAction
+ {
+ T* m_pBuf;
+ uint32_t m_nCount;
+ public:
+ CPostReadAction(T* pBuf, uint32_t nCount) : m_pBuf(pBuf), m_nCount(nCount) {}
+ void operator()() const;
+ };
+ template<typename T> inline void CPostReadAction<T>::operator()() const {}
+ template<> inline void CPostReadAction<char>::operator()() const { m_pBuf[m_nCount] = '\0'; }
+ template<> inline void CPostReadAction<unsigned char>::operator()() const { m_pBuf[m_nCount] = '\0'; }
+
+ class CVCursor;
+ class CVTable;
+ class CVDatabase;
+ class CVSchema;
+
+/////////////////////////////////////////////////////////////////////////////////
+
+ class CVDBManager
+ {
+ public:
+ CVDBManager();
+ ~CVDBManager();
+ CVDBManager(CVDBManager const& x);
+ CVDBManager& operator=(CVDBManager const& x);
+
+ void Make();
+ void Release();
+ CVDatabase OpenDB ( char const* pszDBName ) const;
+ CVDatabase CreateDB ( CVSchema const& schema, char const* pszTypeDesc, ::KCreateMode cmode, char const* pszPath );
+ CVSchema MakeSchema () const;
+
+ private:
+ ::VDBManager* m_pSelf;
+ };
+
+/////////////////////////////////////////////////////////////////////////////////
+
+ class CVSchema
+ {
+ public:
+ friend CVSchema CVDBManager::MakeSchema () const;
+ friend CVDatabase CVDBManager::CreateDB ( CVSchema const& schema, char const* pszTypeDesc, ::KCreateMode cmode, char const* pszPath );
+
+ CVSchema();
+ ~CVSchema();
+ CVSchema(CVSchema const& x);
+ CVSchema& operator=(CVSchema const& x);
+
+ void Make();
+ void Release();
+ void VSchemaParseFile(char const* pszFilePath);
+
+ private:
+ void Clone ( CVSchema const& x );
+ ::VSchema* m_pSelf;
+ };
+
+/////////////////////////////////////////////////////////////////////////////////
+
+ class CVDatabase
+ {
+ public:
+ friend CVDatabase CVDBManager::OpenDB ( char const* pszDBName ) const;
+ friend CVDatabase CVDBManager::CreateDB ( CVSchema const& schema, char const* pszTypeDesc, ::KCreateMode cmode, char const* pszPath );
+
+ CVDatabase();
+ ~CVDatabase();
+ CVDatabase(CVDatabase const& x);
+ CVDatabase& operator=(CVDatabase const& x);
+
+ void Release();
+ CVTable OpenTable ( char const* pszTableName ) const;
+ CVTable CreateTable ( char const* pszTableName );
+ void ColumnCreateParams ( ::KCreateMode cmode, ::KChecksum checksum, size_t pgsize );
+
+ private:
+ void Clone(CVDatabase const& x);
+ ::VDatabase* m_pSelf;
+ };
+
+//////////////////////////////////////////////////////////////
+
+ class CVTable
+ {
+ public:
+ friend CVTable CVDatabase::OpenTable(char const* pszTableName) const;
+ friend CVTable CVDatabase::CreateTable ( char const* pszTableName );
+
+ CVTable();
+ ~CVTable();
+ CVTable(CVTable const& x);
+ CVTable& operator=(CVTable const& x);
+
+ void Release();
+ CVCursor CreateCursorRead ( size_t cache_size ) const;
+ CVCursor CreateCursorWrite ( ::KCreateMode mode );
+
+ private:
+ void Clone(CVTable const& x);
+ ::VTable* m_pSelf;
+ };
+
+////////////////////////////////////////////////////////////////////////////
+
+ class CVCursor
+ {
+ public:
+ friend CVCursor CVTable::CreateCursorRead ( size_t cache_size ) const;
+ friend CVCursor CVTable::CreateCursorWrite (::KCreateMode mode);
+
+ CVCursor();
+ ~CVCursor();
+ CVCursor(CVCursor const& x);
+ CVCursor& operator=(CVCursor const& x);
+
+ void Release();
+ void PermitPostOpenAdd() const;
+#if MANAGER_WRITABLE != 0
+ void InitColumnIndex(char const* const* ColumnNames, uint32_t* pColumnIndex, size_t nCount, bool set_default);
+#else
+ void InitColumnIndex(char const* const* ColumnNames, uint32_t* pColumnIndex, size_t nCount);
+#endif
+ void Open() const;
+ void GetIdRange(int64_t& idFirstRow, uint64_t& nRowCount) const;
+
+ template <typename T> uint32_t ReadItems (int64_t idRow, uint32_t idxCol, T* pBuf, uint32_t nBufLen) const
+ {
+ uint32_t nItemsRead = 0;
+
+ rc_t rc = ::VCursorReadDirect(m_pSelf, idRow, idxCol, 8*sizeof(T), pBuf, nBufLen, &nItemsRead);
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorReadDirect: row_id=%ld, idxCol=%u", idRow, idxCol);
+
+ //CPostReadAction<T>(pBuf, nItemsRead)();
+
+ return nItemsRead;
+ }
+
+ template <typename T> void Write (uint32_t idxCol, T const* pBuf, uint64_t count)
+ {
+ rc_t rc = ::VCursorWrite ( m_pSelf, idxCol, 8 * sizeof(T), pBuf, 0, count );
+ if (rc)
+ throw Utils::CErrorMsg(rc, "VCursorWrite: idxCol=%u", idxCol);
+ }
+
+ int64_t GetRowId () const;
+ void SetRowId (int64_t row_id) const;
+ void OpenRow () const;
+ void CommitRow ();
+ void RepeatRow ( uint64_t count );
+ void CloseRow () const;
+ void Commit ();
+
+ private:
+ void Clone(CVCursor const& x);
+ ::VCursor* m_pSelf;
+ };
+}
+
+///////////////////////
+
+namespace KApp
+{
+ class CArgs;
+ class CXMLLogger
+ {
+ public:
+ CXMLLogger ( CArgs const& args );
+ CXMLLogger (CXMLLogger const& x);
+ CXMLLogger& operator= (CXMLLogger const& x);
+ ~CXMLLogger ();
+
+ void Make ( CArgs const& args );
+
+ private:
+ void Release ();
+
+ XMLLogger const* m_pSelf;
+ };
+
+/////////////////////////////////////////
+
+ class CArgs
+ {
+ public:
+ friend void CXMLLogger::Make ( CArgs const& args );
+
+ CArgs ( int argc, char** argv, ::OptDef const* pOptions, size_t option_count );
+ CArgs ( int argc, char** argv, ::OptDef const* pOptions1, size_t option_count1, ::OptDef const* pOptions2, size_t option_count2 );
+ CArgs ( CArgs const& x );
+ CArgs& operator= ( CArgs const& x );
+ ~CArgs ();
+
+ ::Args const* GetArgs () const;
+ uint32_t GetParamCount () const;
+ char const* GetParamValue ( uint32_t iteration ) const;
+ uint32_t GetOptionCount ( char const* option_name ) const;
+ char const* GetOptionValue ( char const* option_name, uint32_t iteration ) const;
+
+ template <typename T> T GetOptionValueInt ( char const* option_name, uint32_t iteration ) const
+ {
+ char const* str_val = GetOptionValue ( option_name, iteration );
+ return Utils::atoi_t <T> ( str_val );
+ }
+ template <typename T> T GetOptionValueUInt ( char const* option_name, uint32_t iteration ) const
+ {
+ char const* str_val = GetOptionValue ( option_name, iteration );
+ return Utils::atou_t <T> ( str_val );
+ }
+
+ private:
+
+ void MakeAndHandle ( int argc, char** argv, ::OptDef const* pOptions, size_t option_count );
+ // TODO: it's better to make ::ArgsMakeAndHandle be able to take va_list
+ void MakeAndHandle ( int argc, char** argv, ::OptDef const* pOptions1, size_t option_count1, ::OptDef const* pOptions2, size_t option_count2 );
+ void Release ();
+
+ ::Args* m_pSelf;
+ };
+
+ class CProgressBar
+ {
+ public:
+ CProgressBar ( uint64_t size );
+ CProgressBar ( CProgressBar const& x );
+ CProgressBar& operator= ( CProgressBar const& x );
+ ~CProgressBar ();
+
+ void Append ( uint64_t chunk );
+ void Process ( uint64_t chunk, bool force_report );
+
+ private:
+ void Make ( uint64_t size );
+ void Release ();
+
+ KLoadProgressbar const* m_pSelf;
+ };
+}
diff --git a/tools/align-info/Makefile b/tools/align-info/Makefile
new file mode 100644
index 0000000..b6d9fcd
--- /dev/null
+++ b/tools/align-info/Makefile
@@ -0,0 +1,76 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/align-info
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ align-info
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# align-info
+#
+ALIGN_INFO_SRC = \
+ align-info
+
+ALIGN_INFO_OBJ = \
+ $(addsuffix .$(OBJX),$(ALIGN_INFO_SRC))
+
+ALIGN_INFO_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/align-info: $(ALIGN_INFO_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(ALIGN_INFO_LIB)
diff --git a/tools/align-info/align-info.c b/tools/align-info/align-info.c
new file mode 100644
index 0000000..bba4cc1
--- /dev/null
+++ b/tools/align-info/align-info.c
@@ -0,0 +1,571 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sra/sraschema.h> /* VDBManagerMakeSRASchema */
+
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/dependencies.h> /* VDBDependencies */
+#include <vdb/table.h> /* VTable */
+#include <vdb/schema.h> /* VSchema */
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/vdb-priv.h> /* VDBManagerOpenKDBManagerRead */
+
+#include <kapp/main.h>
+
+#include <kfg/config.h> /* KConfig */
+
+#include <kdb/manager.h> /* KDBManagerRelease */
+#include <kdb/namelist.h> /* KMDataNodeListChild */
+#include <kdb/meta.h> /* KMetadata */
+
+#include <klib/container.h> /* BSTree */
+#include <klib/sort.h> /* ksort */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/log.h> /* LOGERR */
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h> /* RC */
+
+#include <assert.h>
+#include <stdio.h> /* sscanf */
+#include <stdlib.h> /* free */
+#include <string.h> /* strcmp */
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt,rc, "$(msg): $(name)","msg=%s,name=%s",msg,name)))
+#define DESTRUCT(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+typedef struct Params {
+ const char* dbPath;
+
+ bool paramBamHeader;
+ bool paramQuality;
+ bool paramRef;
+
+ bool paramHeaders;
+} Params;
+
+#define ALIAS_ALL "a"
+#define OPTION_ALL "all"
+static const char* USAGE_ALL[] = { "print all information", NULL };
+
+#define ALIAS_BAM "b"
+#define OPTION_BAM "bam"
+static const char* USAGE_BAM[] = { "print bam header (if present)", NULL };
+
+#define ALIAS_QUA "Q"
+#define OPTION_QUA "qual"
+static const char* USAGE_QUA[]
+ = { "print quality statistics (if present)", NULL };
+
+#define ALIAS_REF "r"
+#define OPTION_REF "ref"
+static const char* USAGE_REF[] = { "print refseq information [default]", NULL };
+
+#define ALIAS_HEA "H"
+#define OPTION_HEA "headers"
+static const char* USAGE_HEA[] = { "print headers for output blocks", NULL };
+
+OptDef Options[] =
+{
+ { OPTION_ALL, ALIAS_ALL, NULL, USAGE_ALL, 1, false, false }
+ , { OPTION_BAM, ALIAS_BAM, NULL, USAGE_BAM, 1, false, false }
+ , { OPTION_QUA, ALIAS_QUA, NULL, USAGE_QUA, 1, false, false }
+ , { OPTION_REF, ALIAS_REF, NULL, USAGE_REF, 1, false, false }
+ , { OPTION_HEA, ALIAS_HEA, NULL, USAGE_HEA, 1, false, false }
+};
+
+rc_t CC UsageSummary (const char * progname) {
+ return KOutMsg (
+ "Usage:\n"
+ " %s [options] <db-path>\n"
+ "\n"
+ "Summary:\n"
+ " Print database alignment information\n"
+ "\n", progname);
+ }
+
+static const char* param_usage[] = { "Path to the database", NULL };
+
+rc_t CC Usage(const Args* args) {
+ rc_t rc = 0 ;
+
+ const char* progname = UsageDefaultName;
+ const char* fullpath = UsageDefaultName;
+
+ if (args == NULL)
+ { rc = RC(rcExe, rcArgv, rcAccessing, rcSelf, rcNull); }
+ else
+ { rc = ArgsProgram(args, &fullpath, &progname); }
+
+ UsageSummary(progname);
+
+ KOutMsg("Parameters:\n");
+
+ HelpParamLine ("db-path", param_usage);
+
+ KOutMsg ("\nOptions:\n");
+
+ HelpOptionLine (ALIAS_ALL, OPTION_ALL, NULL, USAGE_ALL);
+ HelpOptionLine (ALIAS_REF, OPTION_REF, NULL, USAGE_REF);
+ HelpOptionLine (ALIAS_BAM, OPTION_BAM, NULL, USAGE_BAM);
+ HelpOptionLine (ALIAS_QUA, OPTION_QUA, NULL, USAGE_QUA);
+ HelpOptionLine (ALIAS_HEA, OPTION_HEA, NULL, USAGE_HEA);
+
+ KOutMsg ("\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+const char UsageDefaultName[] = "align-info";
+
+static rc_t bam_header(const VDatabase* db) {
+ rc_t rc = 0;
+ const char path[] = "BAM_HEADER";
+ const KMetadata* meta = NULL;
+ const KMDataNode* node = NULL;
+ char* buffer = NULL;
+ assert(db);
+ if (rc == 0) {
+ rc = VDatabaseOpenMetadataRead(db, &meta);
+ DISP_RC(rc, "while calling VDatabaseOpenMetadataRead");
+ }
+ if (rc == 0) {
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", path);
+ if (GetRCState(rc) == rcNotFound)
+ { rc = 0; }
+ else {
+ DISP_RC2(rc, path, "while calling KMetadataOpenNodeRead");
+ if (rc == 0) {
+ int i = 0;
+ size_t bsize = 0;
+ size_t size = 1024;
+ for (i = 0; i < 2; ++i) {
+ free(buffer);
+ bsize = size + 1;
+ buffer = malloc(bsize);
+ if (buffer == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating,
+ rcMemory, rcExhausted);
+ }
+ else {
+ rc = KMDataNodeReadCString(node, buffer, bsize, &size);
+ if (rc == 0) {
+ break;
+ }
+ else if (i == 0
+ && GetRCObject(rc) == (enum RCObject)rcBuffer
+ && GetRCState (rc) == rcInsufficient)
+ {
+ rc = 0;
+ }
+ }
+ DISP_RC2(rc, path, "while calling KMDataNodeReadCString");
+ }
+ }
+ }
+ }
+ if (rc == 0 && buffer)
+ { OUTMSG(("BAM_HEADER: {\n%s}\n\n", buffer)); }
+ DESTRUCT(KMDataNode, node);
+ DESTRUCT(KMetadata, meta);
+ free(buffer);
+ return rc;
+}
+
+static int64_t CC sort_callback(const void* p1, const void* p2, void* data) {
+ int i1 = *(int*) p1;
+ int i2 = *(int*) p2;
+ return i1 - i2;
+}
+static rc_t qual_stats(const Params* prm, const VDatabase* db) {
+ rc_t rc = 0;
+ const char tblName[] = "SEQUENCE";
+ const VTable* tbl = NULL;
+ const KMetadata* meta = NULL;
+ const KMDataNode* node = NULL;
+ assert(prm && db);
+ if (rc == 0) {
+ rc = VDatabaseOpenTableRead(db, &tbl, "%s", tblName);
+ DISP_RC2(rc, tblName, "while calling VDatabaseOpenTableRead");
+ }
+ if (rc == 0) {
+ rc = VTableOpenMetadataRead(tbl, &meta);
+ DISP_RC2(rc, tblName, "while calling VTableOpenMetadataRead");
+ }
+ if (rc == 0) {
+ bool found = false;
+ const char path[] = "STATS/QUALITY";
+ rc = KMetadataOpenNodeRead(meta, &node, path);
+ if (rc == 0)
+ { found = true; }
+ else if (GetRCState(rc) == rcNotFound)
+ { rc = 0; }
+ DISP_RC2(rc, path, "while calling KMetadataOpenNodeRead");
+ if (found) {
+ uint32_t i = 0;
+ int nbr = 0;
+ uint32_t count = 0;
+ KNamelist* names = NULL;
+ int* quals = NULL;
+ if (rc == 0) {
+ rc = KMDataNodeListChild(node, &names);
+ DISP_RC2(rc, path, "while calling KMDataNodeListChild");
+ }
+ if (rc == 0) {
+ rc = KNamelistCount(names, &count);
+ DISP_RC2(rc, path, "while calling KNamelistCount");
+ if (rc == 0 && count > 0) {
+ quals = calloc(count, sizeof *quals);
+ if (quals == NULL) {
+ rc = RC(rcExe,
+ rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ }
+ }
+ for (i = 0; i < count && rc == 0; ++i) {
+ /* uint64_t u = 0;
+ const KMDataNode* n = NULL; */
+ const char* nodeName = NULL;
+ const char* name = NULL;
+ rc = KNamelistGet(names, i, &nodeName);
+ DISP_RC2(rc, path, "while calling KNamelistGet");
+ if (rc)
+ { break; }
+ name = nodeName;
+ /* rc = KMDataNodeOpenNodeRead(node, &n, name);
+ DISP_RC(rc, name);
+ if (rc == 0) {
+ rc = KMDataNodeReadAsU64(n, &u);
+ DISP_RC(rc, name);
+ } */
+ if (rc == 0) {
+ char* c = strchr(name, '_');
+ if (c != NULL && *(c + 1) != '\0') {
+ name = c + 1;
+ if (sscanf(name, "%d", &quals[i]) != 1) {
+ rc = RC(rcExe,
+ rcNode, rcParsing, rcName, rcUnexpected);
+ PLOGERR(klogInt,
+ (klogInt, rc, "$(name)", "name=%s", nodeName));
+ }
+ }
+ /* OUTMSG(("QUALITY %s %lu\n", name, u)); */
+ }
+ /* DESTRUCT(KMDataNode, n); */
+ }
+ if (rc == 0 && count > 0)
+ { ksort(quals, count, sizeof *quals, sort_callback, NULL); }
+
+ if (rc == 0) {
+ if (prm->paramHeaders) {
+ OUTMSG(("Quality statistics - rows per value\n"));
+ OUTMSG(("Quality values:"));
+ for (i = 0; i <= 40; ++i) {
+ OUTMSG(("\t%d", i));
+ }
+ OUTMSG(("\n"));
+ }
+ OUTMSG(("%s", prm->dbPath));
+ }
+
+ for (i = 0, nbr = 0; i < count && rc == 0; ++i, ++nbr) {
+ uint64_t u = 0;
+ char name[64];
+ const KMDataNode* n = NULL;
+ sprintf(name, "PHRED_%d", quals[i]);
+ rc = KMDataNodeOpenNodeRead(node, &n, "%s", name);
+ DISP_RC(rc, name);
+ if (rc == 0) {
+ rc = KMDataNodeReadAsU64(n, &u);
+ DISP_RC(rc, name);
+ if (rc == 0) {
+ while (nbr < quals[i]) {
+ OUTMSG(("\t0"));
+ ++nbr;
+ }
+ OUTMSG(("\t%lu", u));
+ /* OUTMSG(("QUALITY %d %lu\n", quals[i], u)); */
+ }
+ }
+ DESTRUCT(KMDataNode, n);
+ }
+ while (rc == 0 && nbr <= 40) {
+ OUTMSG(("\t0"));
+ nbr++;
+ }
+ if (rc == 0) {
+ OUTMSG(("\n"));
+ }
+ DESTRUCT(KNamelist, names);
+ }
+ }
+ DESTRUCT(KMDataNode, node);
+ DESTRUCT(KMetadata, meta);
+ DESTRUCT(VTable, tbl);
+ return rc;
+}
+
+static rc_t align_info(const Params* prm) {
+ rc_t rc = 0;
+
+ const VDatabase* db = NULL;
+ const VDBManager* mgr = NULL;
+ const KDBManager *kmgr = NULL;
+ VSchema* schema = NULL;
+ bool is_db = false;
+
+ if (prm == NULL)
+ { return RC(rcExe, rcQuery, rcExecuting, rcParam, rcNull); }
+
+ if (rc == 0) {
+ rc = VDBManagerMakeRead(&mgr, NULL);
+ DISP_RC(rc, "while calling VDBManagerMakeRead");
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerOpenKDBManagerRead(mgr, &kmgr);
+ DISP_RC(rc, "while calling VDBManagerOpenKDBManagerRead");
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerMakeSRASchema(mgr, &schema);
+ DISP_RC(rc, "while calling VDBManagerMakeSRASchema");
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerOpenDBRead(mgr, &db, schema, "%s", prm->dbPath);
+ if (rc == 0) {
+ is_db = true;
+ }
+ else if (rc == SILENT_RC(rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect)) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "'$(path)' is not a database", "path=%s", prm->dbPath));
+ rc = 0;
+ }
+ else {
+ PLOGERR(klogErr,
+ (klogErr, rc, "$(path)", "path=%s", prm->dbPath));
+ }
+ }
+
+ if (is_db) {
+ if (rc == 0) {
+ if (prm->paramRef) {
+ const VDBDependencies* dep = NULL;
+ uint32_t count = 0;
+ int i = 0;
+ if (prm->paramHeaders) {
+ OUTMSG(("Alignments:\n"));
+ }
+ rc = VDatabaseListDependencies(db, &dep, false);
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDatabaseListDependencies");
+ if (rc == 0) {
+ rc = VDBDependenciesCount(dep, &count);
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesCount");
+ }
+ for (i = 0; i < count && rc == 0; ++i) {
+ bool circular = false;
+ const char* name = NULL;
+ const char* path = NULL;
+ const char* remote = NULL;
+ bool local = false;
+ const char* seqId = NULL;
+ rc = VDBDependenciesCircular(dep, &circular, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesCircular");
+ break;
+ }
+ rc = VDBDependenciesName(dep, &name, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesName");
+ break;
+ }
+ rc = VDBDependenciesPath(dep, &path, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesPath");
+ break;
+ }
+ rc = VDBDependenciesLocal(dep, &local, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesLocal");
+ break;
+ }
+ rc = VDBDependenciesSeqId(dep, &seqId, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesSeqId");
+ break;
+ }
+ rc = VDBDependenciesPathRemote(dep, &remote, i);
+ if (rc != 0) {
+ DISP_RC2(rc, prm->dbPath,
+ "while calling VDBDependenciesRemote");
+ break;
+ }
+ OUTMSG(("%s,%s,%s,%s", seqId, name,
+ (circular ? "true" : "false"),
+ (local ? "local" : "remote")));
+ if (path && path[0]) {
+ OUTMSG((":%s", path));
+ }
+ else if (remote && remote[0]) {
+ OUTMSG(("::%s", remote));
+ }
+ OUTMSG(("\n"));
+ }
+ DESTRUCT(VDBDependencies, dep);
+ if (prm->paramHeaders) {
+ OUTMSG(("\n"));
+ }
+ }
+
+ if (prm->paramBamHeader) {
+ rc_t rc3 = bam_header(db);
+ if (rc3 != 0 && rc == 0)
+ { rc = rc3; }
+ }
+
+ if (prm->paramQuality) {
+ rc_t rc3 = qual_stats(prm, db);
+ if (rc3 != 0 && rc == 0)
+ { rc = rc3; }
+ }
+ }
+
+ }
+
+ DESTRUCT(VSchema, schema);
+ DESTRUCT(KDBManager, kmgr);
+ DESTRUCT(VDBManager, mgr);
+ DESTRUCT(VDatabase, db);
+
+ return rc;
+}
+
+rc_t CC KMain(int argc, char* argv[]) {
+ rc_t rc = 0;
+ Args* args = NULL;
+
+ Params prm;
+ memset(&prm, 0, sizeof prm);
+
+ do {
+ uint32_t pcount = 0;
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 1,
+ Options, sizeof Options / sizeof (OptDef));
+ if (rc) {
+ LOGERR(klogErr, rc, "While calling ArgsMakeAndHandle");
+ break;
+ }
+ rc = ArgsParamCount(args, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "While calling ArgsParamCount");
+ break;
+ }
+ if (pcount < 1) {
+ MiniUsage(args);
+ DESTRUCT(Args, args);
+ exit(1);
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many database parameters");
+ break;
+ }
+ rc = ArgsParamValue(args, 0, (const void **)&prm.dbPath);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving database name");
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_ALL, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_ALL "' argument");
+ break;
+ }
+ if (pcount)
+ { prm.paramBamHeader = prm.paramQuality = prm.paramRef = true; }
+
+ rc = ArgsOptionCount (args, OPTION_BAM, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_BAM "' argument");
+ break;
+ }
+ if (pcount)
+ { prm.paramBamHeader = true; }
+
+ rc = ArgsOptionCount (args, OPTION_QUA, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_QUA "' argument");
+ break;
+ }
+ if (pcount)
+ { prm.paramQuality = true; }
+
+ rc = ArgsOptionCount (args, OPTION_REF, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_REF "' argument");
+ break;
+ }
+ if (pcount)
+ { prm.paramRef = true; }
+
+ if (!prm.paramBamHeader && !prm.paramQuality && !prm.paramRef)
+ { prm.paramRef = true; }
+
+ rc = ArgsOptionCount (args, OPTION_HEA, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_HEA "' argument");
+ break;
+ }
+ if (pcount) {
+ prm.paramHeaders = true;
+ }
+ } while (false);
+
+ if (rc == 0)
+ { rc = align_info(&prm); }
+
+ DESTRUCT(Args, args);
+ return rc;
+}
+
+/************************************* EOF ************************************/
diff --git a/tools/bam-loader/Globals.h b/tools/bam-loader/Globals.h
new file mode 100644
index 0000000..6031eaf
--- /dev/null
+++ b/tools/bam-loader/Globals.h
@@ -0,0 +1,93 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+enum LoaderModes {
+ mode_Archive,
+ mode_Remap
+};
+
+typedef struct globals
+{
+ char const *inpath;
+ char const *outpath;
+ char const *outname;
+ char const *firstOut;
+ char const *tmpfs;
+
+ struct KFile *noMatchLog;
+
+ char const *schemaPath;
+ char const *schemaIncludePath;
+
+ char const *refXRefPath;
+
+ char const *QualQuantizer;
+
+ char const *refFilter;
+
+ char const** refFiles; /* NULL-terminated array pointing to argv */
+
+ char const *headerText;
+
+ uint64_t maxAlignCount;
+ size_t cache_size;
+
+ unsigned errCount;
+ unsigned maxErrCount;
+ unsigned maxWarnCount_NoMatch;
+ unsigned maxWarnCount_DupConflict;
+ unsigned pid;
+ unsigned minMatchCount; /* minimum number of matches to count as an alignment */
+ int minMapQual;
+ enum LoaderModes mode;
+ enum LoaderModes globalMode;
+ uint32_t maxSeqLen;
+ bool omit_aligned_reads;
+ bool omit_reference_reads;
+ bool no_real_output;
+ bool expectUnsorted;
+ bool requireSorted;
+ bool noVerifyReferences;
+ bool onlyVerifyReferences;
+ bool useQUAL;
+ bool limit2config;
+ bool editAlignedQual;
+ bool keepMismatchQual;
+ bool acceptBadDups; /* accept spots with inconsistent PCR duplicate flags */
+ bool acceptNoMatch; /* accept without any matching bases */
+ bool noSpotAssembly;
+ uint8_t alignedQualValue;
+ bool allUnaligned; /* treat all records as unaligned */
+ bool noColorSpace;
+ bool noSecondary;
+ bool hasTI;
+ bool acceptHardClip;
+ bool allowMultiMapping; /* allow multiple reference names to map to the same real reference */
+ bool assembleWithSecondary;
+ bool deferSecondary;
+} Globals;
+
+extern Globals G;
diff --git a/tools/bam-loader/KFileHelper.c b/tools/bam-loader/KFileHelper.c
new file mode 100644
index 0000000..b9c65c0
--- /dev/null
+++ b/tools/bam-loader/KFileHelper.c
@@ -0,0 +1,142 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "KFileHelper.h"
+#include <string.h>
+
+rc_t BufferedKFileGets(KDataBuffer *buf, unsigned offset, unsigned *nread, BufferedKFile *strm) {
+ unsigned i;
+ unsigned n;
+ int ch;
+ rc_t rc;
+
+ do {
+ if (strm->cur != strm->inbuf) {
+ ch = strm->buf[strm->cur];
+
+ if (ch == '\r' || ch == '\n')
+ ++strm->cur;
+ else
+ break;
+ }
+ else {
+ size_t numread;
+
+ rc = KFileRead(strm->kfp, strm->fpos, strm->buf, sizeof(strm->buf), &numread);
+ if (rc) return -1;
+
+ strm->cur = 0;
+ strm->inbuf = numread;
+ strm->fpos += numread;
+ if (numread == 0) {
+ *nread = 0;
+ return 0;
+ }
+ }
+ } while (1);
+
+ for (n = 0, i = offset; ; ++i, ++n) {
+ if (strm->cur != strm->inbuf) {
+ ch = strm->buf[strm->cur++];
+ }
+ else {
+ size_t numread;
+
+ rc = KFileRead(strm->kfp, strm->fpos, strm->buf, sizeof(strm->buf), &numread);
+ if (rc) return rc;
+
+ strm->cur = 0;
+ strm->inbuf = numread;
+ if (numread == 0) break;
+ strm->fpos += numread;
+ ch = strm->buf[strm->cur++];
+ }
+ if (ch == '\r' || ch == '\n') break;
+ if (i >= buf->elem_count) {
+ rc = KDataBufferResize(buf, buf->elem_count ? buf->elem_count * 2 : 1024);
+ if (rc) return rc;
+ }
+ ((char *)buf->base)[i] = ch;
+ }
+ *nread = n;
+ return 0;
+}
+
+rc_t BufferedKFileOpen(const KDirectory *directory, BufferedKFile *rslt, const char *fileName, ...) {
+ va_list va;
+ rc_t rc;
+
+ memset(rslt, 0, sizeof(rslt) - sizeof(rslt->buf));
+
+ va_start(va, fileName);
+ rc = KDirectoryVOpenFileRead(directory, &rslt->kfp, fileName, va);
+ va_end(va);
+
+ return rc;
+}
+
+rc_t BufferedKFileClose(BufferedKFile *strm) {
+ return KFileRelease(strm->kfp);
+}
+
+rc_t LoadFile(KDataBuffer *dst, uint64_t *lineCount, const KDirectory *dir, const char *fileName, ...) {
+ BufferedKFile strm;
+ rc_t rc;
+ unsigned line = 0;
+
+ memset(&strm, 0, sizeof(strm) - sizeof(strm.buf));
+ {
+ va_list va;
+
+ va_start(va, fileName);
+ rc = KDirectoryVOpenFileRead(dir, &strm.kfp, fileName, va);
+ va_end(va);
+ }
+ if (rc == 0) {
+ unsigned offset = 0;
+ unsigned i;
+
+ while ((rc = BufferedKFileGets(dst, offset, &i, &strm)) == 0 && i) {
+ offset += i;
+ if (offset + 1 >= dst->elem_count) {
+ rc = KDataBufferResize(dst, offset + 1);
+ if (rc)
+ break;
+ }
+ ((char *)dst->base)[offset++] = '\0';
+ ++line;
+ }
+ BufferedKFileClose(&strm);
+ if (rc == 0)
+ rc = KDataBufferResize(dst, offset);
+ }
+ if (rc != 0) {
+ KDataBufferResize(dst, 0);
+ line = 0;
+ }
+ if (lineCount) *lineCount = line;
+ return rc;
+}
diff --git a/tools/bam-loader/KFileHelper.h b/tools/bam-loader/KFileHelper.h
new file mode 100644
index 0000000..4551952
--- /dev/null
+++ b/tools/bam-loader/KFileHelper.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_KFILEHELPER_H_
+#define BAM_LOAD_KFILEHELPER_H_ 1
+#include <klib/data-buffer.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+typedef struct BufferedKFile BufferedKFile;
+
+#define KFILE_BUF_SIZE (4096)
+struct BufferedKFile {
+ uint64_t fpos;
+ const KFile *kfp;
+ unsigned inbuf;
+ unsigned cur;
+ char buf[KFILE_BUF_SIZE];
+};
+
+rc_t BufferedKFileGets(KDataBuffer *buf, unsigned offset, unsigned *nread, BufferedKFile *strm);
+rc_t BufferedKFileOpen(const KDirectory *directory, BufferedKFile *rslt, const char *fileName, ...);
+rc_t BufferedKFileClose(BufferedKFile *strm);
+rc_t LoadFile(KDataBuffer *dst, uint64_t *lineCount, const KDirectory *dir, const char *fileName, ...);
+#endif
diff --git a/tools/bam-loader/KVPFile.c b/tools/bam-loader/KVPFile.c
new file mode 100644
index 0000000..1ab2326
--- /dev/null
+++ b/tools/bam-loader/KVPFile.c
@@ -0,0 +1,355 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "KVPFile.h"
+
+#include <kfs/file.h>
+#include <klib/rc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define USE_KDB_BTREE 1
+
+#if USE_KDB_BTREE
+#include <kdb/btree.h>
+#else
+#include "hashtable.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#endif
+
+
+
+#if USE_KDB_BTREE
+
+/* going to make an index with:
+ * a) backing file
+ * b) page size is fixed at 32K, otherwise the page size would have to be stored somewhere
+ * c) page cache - need cache limit in bytes
+ * d) 2 chunked value streams - need key chunking and value chunking
+ * e) B-Tree-ish index, requiring a comparison function. this interface uses opaque keys.
+ * the "matched-count" parameter is useful for trie traversal, but this will be built-in
+ */
+rc_t KVPFileMake ( KVPFile **rslt, KFile *file, size_t climit,
+ size_t kchunk_size, size_t vchunk_size,
+ size_t min_ksize, size_t max_ksize, size_t min_vsize, size_t max_vsize,
+ KVPFileCompareFunc cmp )
+{
+ return KBTreeMakeUpdate ( ( KBTree** ) rslt, file, climit, false, kbtOpaqueKey,
+ kchunk_size, vchunk_size, min_ksize, max_ksize, min_vsize, max_vsize, cmp );
+}
+
+
+/* this whacker works fine
+ */
+rc_t KVPFileWhack ( KVPFile *xself, bool commit )
+{
+ KBTree *self = ( KBTree* ) xself;
+
+ rc_t rc = 0;
+
+ if ( self != NULL )
+ {
+ /* drop the backing file unless commiting */
+ if ( ! commit )
+ rc = KBTreeDropBacking ( self );
+
+ /* drop the b-tree */
+ rc = KBTreeRelease ( self );
+ }
+
+ return rc;
+}
+
+
+/* whacker */
+void KVPValueWhack ( KVPValue *self )
+{
+ KBTreeValueWhack ( self );
+}
+
+/* return the pointer to thingie */
+rc_t KVPValueAccessRead ( const KVPValue *self, const void **mem, size_t *bytes )
+{
+ return KBTreeValueAccessRead ( self, mem, bytes );
+}
+
+rc_t KVPValueAccessUpdate ( KVPValue *self, void **mem, size_t *bytes )
+{
+ return KBTreeValueAccessUpdate ( self, mem, bytes );
+}
+
+
+/* find will not modify the index in any way
+ * returns a pointer into a page, meaning that the values cannot exceed 32K in size
+ * this is done
+ */
+rc_t KVPFileFind ( const KVPFile *self, KVPValue *val, const void *key, size_t ksize )
+{
+ return KBTreeFind ( ( const KBTree* ) self, val, key, ksize );
+}
+
+
+
+/* find or insert will return an existing or create a new entry
+ * note that the new entry is initially zeroed
+ */
+rc_t KVPFileFindOrInsert ( KVPFile *self, KVPValue *val,
+ bool *was_inserted, size_t alloc_size,
+ const void *key, size_t ksize )
+{
+ return KBTreeEntry ( ( KBTree* ) self, val, was_inserted, alloc_size, key, ksize );
+}
+
+rc_t KVPFileForEach ( const KVPFile *self,
+ void ( CC * f )( const void *key, size_t ksize, KVPValue *val, void *ctx ),
+ void *ctx )
+{
+ return KBTreeForEach((KBTree *)self, 0, f, ctx);
+}
+
+
+#else
+typedef struct KTempMMap {
+ void *base;
+ size_t sz;
+ int fd;
+ unsigned elemsize;
+ unsigned fileNo;
+} KTempMMap;
+
+static rc_t KTempMMapMake(KTempMMap *rslt, size_t initSize, size_t elemSize)
+{
+ char fname[4096];
+
+ memset(rslt, 0, sizeof(*rslt));
+ rslt->elemsize = elemSize;
+
+ sprintf(fname, "/tmp/kvp.%u.XXXXXX", getpid());
+ rslt->fd = mkstemp(fname);
+ if (rslt->fd < 0) {
+ perror(fname);
+ return RC(rcApp, rcFile, rcCreating, rcFile, rcUnknown);
+ }
+ unlink(fname);
+
+ if (ftruncate(rslt->fd, initSize * elemSize) != 0)
+ return RC(rcApp, rcFile, rcResizing, rcFile, rcUnknown);
+
+ rslt->sz = initSize;
+
+ rslt->base = mmap(0, initSize * elemSize, PROT_READ | PROT_WRITE, MAP_SHARED, rslt->fd, 0);
+ if (rslt->base == MAP_FAILED)
+ return RC(rcApp, rcMemMap, rcCreating, rcMemory, rcInsufficient);
+
+ return 0;
+}
+
+static rc_t KTempMMapWhack(KTempMMap *self)
+{
+ close(self->fd);
+ madvise(self->base, self->sz, MADV_DONTNEED);
+ munmap(self->base, self->sz);
+ return 0;
+}
+
+static void *KTempMMapPointer(KTempMMap *self, size_t offset, size_t count)
+{
+ void *temp;
+ size_t newsz;
+
+ if (offset + count <= self->sz)
+ return &((uint8_t *)self->base)[offset * self->elemsize];
+
+ newsz = self->sz;
+ while (newsz < offset + count)
+ newsz <<= 1;
+
+ if (ftruncate(self->fd, newsz * self->elemsize) != 0)
+ return NULL;
+
+ temp = mmap(0, newsz * self->elemsize, PROT_READ | PROT_WRITE, MAP_SHARED, self->fd, 0);
+ if (temp == MAP_FAILED)
+ return NULL;
+
+ munmap(self->base, self->sz);
+ self->base = temp;
+ self->sz = newsz;
+
+ return &((uint8_t *)self->base)[offset * self->elemsize];
+}
+
+typedef struct key_t {
+ uint8_t len;
+ char key[255];
+} my_key_t;
+
+struct KVPFile {
+ HashTable *ht;
+ size_t next_obj;
+ KTempMMap keys;
+ KTempMMap values;
+};
+
+typedef struct KVPValueImpl KVPValueImpl;
+struct KVPValueImpl
+{
+ KVPFile * file;
+ size_t offset;
+ size_t size;
+};
+
+static int KeyComp(const void *id, const void *key, uint32_t len, void *ctx)
+{
+ KVPFile *self = ctx;
+ const my_key_t *test = KTempMMapPointer(&self->keys, (intptr_t)id, 1);
+ int r = memcmp(test->key, key, test->len < len ? test->len : len);
+ if (r == 0)
+ r = test->len - len;
+ return r;
+}
+
+rc_t KVPFileMake(KVPFile **rslt,
+ KFile *file,
+ size_t climit,
+ size_t kchunk_size, size_t vchunk_size,
+ size_t min_ksize, size_t max_ksize,
+ size_t min_vsize, size_t max_vsize,
+ KVPFileCompareFunc cmp
+ )
+{
+ rc_t rc;
+ KVPFile *self = calloc(1, sizeof(*self));
+
+ if (self == NULL)
+ return RC(rcApp, rcMemMap, rcAllocating, rcMemory, rcExhausted);
+
+ rc = KTempMMapMake(&self->keys, 256, sizeof(my_key_t));
+ if (rc == 0) {
+ rc = KTempMMapMake(&self->values, 256, max_vsize);
+ if (rc == 0) {
+ rc = HashTableMake(&self->ht, 256, KeyComp, self);
+ if (rc == 0) {
+ *rslt = self;
+ return 0;
+ }
+ KTempMMapWhack(&self->values);
+ }
+ KTempMMapWhack(&self->keys);
+ }
+ free(self);
+ return rc;
+}
+
+rc_t KVPFileWhack(KVPFile *self, bool commit)
+{
+ if (self) {
+ KTempMMapWhack(&self->values);
+ KTempMMapWhack(&self->keys);
+ HashTableWhack(self->ht, 0, 0);
+ free(self);
+ }
+ return 0;
+}
+
+rc_t KVPFileFind(const KVPFile *self, KVPValue *xval, const void *key, size_t ksize)
+{
+ KVPValueImpl *val = ( KVPValueImpl* ) xval;
+ const HashTableIterator iter = HashTableLookup(self->ht, key, ksize);
+ if (HashTableIteratorHasValue(&iter)) {
+ val->file = (void *)self;
+ val->offset = (intptr_t)HashTableIteratorGetValue(&iter);
+ val->size = 1;
+ return 0;
+ }
+ return RC(rcApp, rcMemMap, rcReading, rcId, rcNotFound);
+}
+
+rc_t KVPFileFindOrInsert(KVPFile *self, KVPValue *xval,
+ bool *was_inserted, size_t alloc_size,
+ const void *key, size_t ksize
+ )
+{
+ KVPValueImpl *val = ( KVPValueImpl* ) xval;
+ HashTableIterator iter = HashTableLookup(self->ht, key, ksize);
+
+ if (HashTableIteratorHasValue(&iter)) {
+ val->file = (void *)self;
+ val->offset = (intptr_t)HashTableIteratorGetValue(&iter);
+ val->size = 1;
+ *was_inserted = false;
+ return 0;
+ }
+ else {
+ size_t new_id = self->next_obj++;
+ my_key_t *new_key = KTempMMapPointer(&self->keys, new_id, 1);
+
+ new_key->len = ksize;
+ memmove(new_key->key, key, ksize);
+
+ *was_inserted = true;
+ val->file = (void *)self;
+ val->offset = new_id;
+ val->size = 1;
+ HashTableIteratorSetValue(&iter, (void *)(val->offset));
+ }
+ return 0;
+}
+
+static rc_t KVPValueAccess(const KVPValueImpl *value, void **mem, size_t *bytes)
+{
+ KVPFile *self = value->file;
+ void *temp = KTempMMapPointer(&self->values, value->offset, value->size);
+
+ if (temp != NULL) {
+ *bytes = self->values.elemsize * value->size;
+ *mem = temp;
+ return 0;
+ }
+ *bytes = 0;
+ *mem = NULL;
+ return RC(rcApp, rcMemMap, rcReading, rcMemory, rcNotFound);
+}
+
+rc_t KVPValueAccessRead(const KVPValue *self, const void **mem, size_t *bytes)
+{
+ return KVPValueAccess((const KVPValueImpl*)self, (void **)mem, bytes);
+}
+
+rc_t KVPValueAccessUpdate(KVPValue *self, void **mem, size_t *bytes)
+{
+ return KVPValueAccess((KVPValueImpl*)self, mem, bytes);
+}
+
+void KVPValueWhack(KVPValue *self)
+{
+}
+
+#endif /* USE_KDB_BTREE */
diff --git a/tools/bam-loader/KVPFile.h b/tools/bam-loader/KVPFile.h
new file mode 100644
index 0000000..01de157
--- /dev/null
+++ b/tools/bam-loader/KVPFile.h
@@ -0,0 +1,164 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_KVPFile_
+#define _h_KVPFile_
+
+#ifndef _h_kdb_btree_
+#include <kdb/btree.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* this can be made to work as we go forward
+ */
+typedef struct KVPFile KVPFile;
+
+
+/* generic comparison function
+ * size_t indicates bytes
+ */
+typedef KBTreeCompareFunc KVPFileCompareFunc;
+
+
+/* going to make an index with:
+ * a) backing file
+ * b) page size is fixed at 32K, otherwise the page size would have to be stored somewhere
+ * c) page cache - need cache limit in bytes
+ * d) 2 chunked value streams - need key chunking and value chunking
+ * e) B-Tree-ish index, requiring a comparison function. this interface uses opaque keys.
+ * the "matched-count" parameter is useful for trie traversal, but this will be built-in
+ *
+ * "rslt" [ OUT ] - return of Ken's object
+ *
+ * "file" [ IN ] - open file with read/write permissions.
+ * NB - a reference will be attached to this file, so you still own it
+ *
+ * "climit" [ IN ] - cache limit in bytes. the internal page cache will
+ * retain UP TO ( but not exceeding ) the limit specified. for 32K pages,
+ * this means than the byte values 0..0x7FFF will result in NO CACHE.
+ * internally, this limit is converted to a page count by simple division,
+ * i.e. cpage-limit = climit / PGSIZE.
+ *
+ * "kchunk_size" [ IN ] and "vchunk_size" [ IN ] - the "chunking" ( alignment )
+ * factor for storing keys and values, respectively. rounded up to the nearest
+ * power of 2 that will hold the bytes specified.
+ *
+ * "min_ksize" [ IN ] and "max_ksize" [ IN ] - specifies the allowed key sizes. if
+ * unknown, a min of 1 and a max of ~ ( size_t ) 0 will allow for any size. if fixed,
+ * min_ksize == max_ksize will indicate this, and the size will be used exactly as
+ * chunking factor ( see "kchunk_size" above ).
+ *
+ * "min_vsize" [ IN ] and "max_vsize" [ IN ] - specifies allowed value sizes. see above.
+ *
+ * "cmp" [ IN ] - comparison callback function for opaque keys. later, we'll want to
+ * make use of key type knowledge to improve traversal ( callbacks are expensive ), but
+ * for now, we can treat them as opaque.
+ */
+rc_t KVPFileMake ( KVPFile **rslt, struct KFile *file, size_t climit,
+ size_t kchunk_size, size_t vchunk_size,
+ size_t min_ksize, size_t max_ksize, size_t min_vsize, size_t max_vsize,
+ KVPFileCompareFunc cmp );
+
+
+
+/* this whacker works fine
+ *
+ * "commit" [ IN ] - if false, tells the underlying pagefile
+ * to forget its backing before whacking the cache.
+ */
+rc_t KVPFileWhack ( KVPFile *self, bool commit );
+
+
+/* results point directly into pages, and thus require a reference
+ * I'm going to invent a structure to use and some functions - the
+ * structure itself may change, but we should be able to make it work
+ *
+ * it will be an defined structure, although it may be defined simply as
+ * an array of 3 size_t to make it opaque. if it were made an allocation,
+ * then we'd have to have a special allocator in order to keep the noise
+ * down. maybe that's the way to go, but it means more code. for now,...
+ */
+typedef struct KBTreeValue KVPValue;
+
+
+/* whacker */
+void KVPValueWhack ( KVPValue *self );
+
+/* return the pointer to thingie */
+rc_t KVPValueAccessRead ( const KVPValue *self, const void **mem, size_t *bytes );
+rc_t KVPValueAccessUpdate ( KVPValue *self, void **mem, size_t *bytes );
+
+
+/* find will not modify the index in any way
+ * returns a pointer into a page, meaning that the values cannot exceed 32K in size
+ * this is done
+ *
+ * "val" [ OUT ] - pointer to an uninitialized block that will contain
+ * information on how to access data within a page. note that the value
+ * is "live", and if accessed for update will cause the page to be modified.
+ * it is not clear whether this is desired or side-effect behavior, so I'm
+ * leaving it alone for now.
+ *
+ * "key" [ IN ] and "ksize" [ IN ] - opaque key description
+ */
+rc_t KVPFileFind ( const KVPFile *self, KVPValue *val, const void *key, size_t ksize );
+
+
+
+/* find or insert will return an existing or create a new entry
+ * note that the new entry is initially zeroed
+ *
+ * "val" [ OUT ] - pointer to uninitialized block that will contain value data.
+ * since the intention is to modify the value, access to val will most certainly
+ * be via "KVPValueAccessUpdate" which will dirty the page regardless.
+ *
+ * "was_inserted" [ OUT ] - if true, the returned value was the result of an
+ * insertion and can be guaranteed to be all 0 bits. otherwise, the returned
+ * value will be whatever was there previously.
+ *
+ * "alloc_size" [ IN ] - the number of value bytes to allocate upon insertion,
+ * i.e. if the key was not found. this value must agree with the limits specified
+ * in Make.
+ *
+ * "key" [ IN ] and "ksize" [ IN ] - opaque key description
+ */
+rc_t KVPFileFindOrInsert ( KVPFile *self, KVPValue *val,
+ bool *was_inserted, size_t alloc_size,
+ const void *key, size_t ksize );
+
+rc_t KVPFileForEach ( const KVPFile *self,
+ void ( CC * f )( const void *key, size_t ksize, KVPValue *val, void *ctx ),
+ void *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_KVPFile_ */
diff --git a/tools/bam-loader/Makefile b/tools/bam-loader/Makefile
new file mode 100644
index 0000000..deb525a
--- /dev/null
+++ b/tools/bam-loader/Makefile
@@ -0,0 +1,111 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/bam-loader
+
+INT_TOOLS = \
+ samview
+
+EXT_TOOLS = \
+ bam-load
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (win,$(OS))
+all std:
+ @ echo "not building bam-load under Windows"
+else
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+endif
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# bam-load
+#
+BAMLOAD_SRC = \
+ bam-loader \
+ bam \
+ alignment-writer \
+ reference-writer \
+ sequence-writer \
+ loader-imp \
+ mem-bank \
+ low-match-count
+
+BAMLOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(BAMLOAD_SRC))
+
+BAMLOAD_LIB = \
+ -lkapp \
+ -stk-version \
+ -lload \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/bam-load: $(BAMLOAD_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(BAMLOAD_LIB)
+
+
+#-------------------------------------------------------------------------------
+# samview
+#
+SAMVIEW_SRC = \
+ bam \
+ samview
+
+SAMVIEW_OBJ = \
+ $(addsuffix .$(OBJX),$(SAMVIEW_SRC))
+
+SAMVIEW_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/samview: $(SAMVIEW_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SAMVIEW_LIB)
+
diff --git a/tools/bam-loader/alignment-writer.c b/tools/bam-loader/alignment-writer.c
new file mode 100644
index 0000000..6e93b7f
--- /dev/null
+++ b/tools/bam-loader/alignment-writer.c
@@ -0,0 +1,267 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <sysalloc.h>
+#include <klib/out.h>
+
+#include <vdb/vdb-priv.h>
+
+#include "alignment-writer.h"
+#include "Globals.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+enum e_tables {
+ tblPrimary,
+ tblSecondary,
+ tblN
+};
+
+struct s_alignment {
+ VDatabase *db;
+ TableWriterAlgn const *tbl[tblN];
+ int64_t rowId;
+ int st;
+};
+
+Alignment *AlignmentMake(VDatabase *db) {
+ Alignment *self = calloc(1, sizeof(*self));
+
+ if (self) {
+ self->db = db;
+ VDatabaseAddRef(self->db);
+ }
+ return self;
+}
+
+static rc_t SetColumnDefaults(TableWriterAlgn const *tbl)
+{
+ return 0;
+}
+
+static rc_t WritePrimaryRecord(Alignment *const self, AlignmentRecord *const data)
+{
+ if (self->tbl[tblPrimary] == NULL) {
+ rc_t rc = TableWriterAlgn_Make(&self->tbl[tblPrimary], self->db,
+ ewalgn_tabletype_PrimaryAlignment,
+ ewalgn_co_TMP_KEY_ID +
+ (G.expectUnsorted ? ewalgn_co_unsorted : 0));
+ if (rc)
+ return rc;
+ rc = SetColumnDefaults(self->tbl[tblPrimary]);
+ if (rc)
+ return rc;
+ }
+ return TableWriterAlgn_Write(self->tbl[tblPrimary], &data->data, &data->alignId);
+}
+
+static rc_t WriteSecondaryRecord(Alignment *const self, AlignmentRecord *const data)
+{
+ if (self->tbl[tblSecondary] == NULL) {
+ rc_t rc = TableWriterAlgn_Make(&self->tbl[tblSecondary], self->db,
+ ewalgn_tabletype_SecondaryAlignment,
+ ewalgn_co_TMP_KEY_ID +
+ (G.expectUnsorted ? ewalgn_co_unsorted : 0));
+ if (rc)
+ return rc;
+ rc = SetColumnDefaults(self->tbl[tblSecondary]);
+ if (rc)
+ return rc;
+ }
+#if 1
+ /* try to make consistent with cg-load */
+ if (data->mate_ref_pos == 0) {
+ data->data.mate_ref_orientation.elements = 0;
+ }
+#endif
+ return TableWriterAlgn_Write(self->tbl[tblSecondary], &data->data, &data->alignId);
+}
+
+rc_t AlignmentWriteRecord(Alignment *const self, AlignmentRecord *const data)
+{
+ return data->isPrimary ? WritePrimaryRecord(self, data) : WriteSecondaryRecord(self, data);
+}
+
+rc_t AlignmentStartUpdatingSpotIds(Alignment *const self)
+{
+ return 0;
+}
+
+rc_t AlignmentGetSpotKey(Alignment *const self, uint64_t * keyId)
+{
+ rc_t rc;
+
+ switch (self->st) {
+ case 0:
+ if (self->tbl[tblPrimary]) {
+ rc = TableWriterAlgn_TmpKeyStart(self->tbl[tblPrimary]);
+ if (rc)
+ break;
+ }
+ self->rowId = 0;
+ ++self->st;
+ case 1:
+ if (self->tbl[tblPrimary]) {
+ rc = TableWriterAlgn_TmpKey(self->tbl[tblPrimary], ++self->rowId, keyId);
+ if (rc == 0)
+ break;
+ ++self->st;
+ if (GetRCState(rc) != rcNotFound || GetRCObject(rc) != rcRow || self->tbl[tblSecondary] == NULL)
+ break;
+ }
+ else
+ ++self->st;
+ case 2:
+ rc = TableWriterAlgn_TmpKeyStart(self->tbl[tblSecondary]);
+ if (rc)
+ break;
+ self->rowId = 0;
+ ++self->st;
+ case 3:
+ rc = TableWriterAlgn_TmpKey(self->tbl[tblSecondary], ++self->rowId, keyId);
+ if (rc == 0)
+ break;
+ if (GetRCState(rc) != rcNotFound || GetRCObject(rc) != rcRow)
+ break;
+ ++self->st;
+ break;
+ default:
+ rc = RC(rcAlign, rcTable, rcUpdating, rcError, rcIgnored);
+ break;
+ }
+ return rc;
+}
+
+rc_t AlignmentWriteSpotId(Alignment * const self, int64_t const spotId)
+{
+ switch (self->st) {
+ case 1:
+ return TableWriterAlgn_Write_SpotId(self->tbl[tblPrimary], self->rowId, spotId);
+ case 3:
+ return TableWriterAlgn_Write_SpotId(self->tbl[tblSecondary], self->rowId, spotId);
+ default:
+ return RC(rcAlign, rcTable, rcUpdating, rcSelf, rcInconsistent);
+ }
+}
+
+rc_t AlignmentWhack(Alignment * const self, bool const commit)
+{
+ rc_t const rc = self->tbl[tblPrimary] ? TableWriterAlgn_Whack(self->tbl[tblPrimary], commit, NULL) : 0;
+ rc_t const rc2 = self->tbl[tblSecondary] ? TableWriterAlgn_Whack(self->tbl[tblSecondary], commit | (rc == 0), NULL) : 0;
+
+ VDatabaseRelease(self->db);
+ free(self);
+ return rc ? rc : rc2;
+}
+
+static size_t LayoutStorage(void *const buffer, unsigned const readlen,
+ void const **const p_ref_offset,
+ void const **const p_ref_offset_type,
+ void const **const p_mismatch,
+ void const **const p_has_ref_offset,
+ void const **const p_has_mismatch
+ )
+{
+ int32_t *const ref_offset = buffer;
+ uint8_t *const ref_offset_type = (uint8_t *)&ref_offset[readlen];
+ char *const mismatch = (char *)&ref_offset_type[readlen];
+ bool *const has_ref_offset = (bool *)&mismatch[readlen];
+ bool *const has_mismatch = (bool *)&has_ref_offset[readlen];
+ void *const endp = &has_mismatch[readlen];
+
+ if (p_ref_offset ) *p_ref_offset = ref_offset;
+ if (p_ref_offset_type) *p_ref_offset_type = ref_offset_type;
+ if (p_mismatch ) *p_mismatch = mismatch;
+ if (p_has_ref_offset ) *p_has_ref_offset = has_ref_offset;
+ if (p_has_mismatch ) *p_has_mismatch = has_mismatch;
+
+ return (char const *)endp - (char const *)buffer;
+}
+
+rc_t AlignmentRecordInit(AlignmentRecord *const self, unsigned const readlen)
+{
+ KDataBuffer buffer = self->buffer;
+
+ buffer.elem_bits = 8;
+ {
+ size_t const need = LayoutStorage(0, readlen, 0, 0, 0, 0, 0);
+ rc_t const rc = KDataBufferResize(&buffer, need);
+ if (rc) return rc;
+ }
+ memset(self, 0, sizeof(*self));
+ self->buffer = buffer;
+
+ self->data.seq_read_id.buffer = &self->read_id;
+ self->data.seq_read_id.elements = 1;
+ self->data.ref_id.buffer = &self->ref_id;
+ self->data.ref_id.elements = 1;
+ if (G.expectUnsorted) {
+ self->data.ref_start.buffer = &self->ref_start;
+ self->data.ref_start.elements = 1;
+ }
+ else {
+ self->data.global_ref_start.buffer = &self->global_ref_start;
+ self->data.global_ref_start.elements = 1;
+ }
+ self->data.ref_orientation.buffer = &self->ref_orientation;
+ self->data.ref_orientation.elements = 1;
+ self->data.mapq.buffer = &self->mapq;
+ self->data.mapq.elements = 1;
+ self->data.tmp_key_id.buffer = &self->tmp_key_id;
+ self->data.tmp_key_id.elements = 1;
+
+ self->data.read_start.buffer = &self->read_start;
+ self->data.read_start.elements = 1;
+ self->data.read_len.buffer = &self->read_len;
+ self->data.read_len.elements = 1;
+
+ self->data.mate_ref_orientation.buffer = &self->mate_ref_orientation;
+ self->data.mate_ref_orientation.elements = 1;
+ self->data.mate_ref_id.buffer = &self->mate_ref_id;
+ self->data.mate_ref_id.elements = 1;
+ self->data.mate_ref_pos.buffer = &self->mate_ref_pos;
+ self->data.mate_ref_pos.elements = 1;
+ self->data.mate_align_id.buffer = &self->mate_align_id;
+ self->data.mate_align_id.elements = 1;
+ self->data.template_len.buffer = &self->template_len;
+ self->data.template_len.elements = 1;
+
+ LayoutStorage(buffer.base, readlen,
+ &self->data.ref_offset.buffer,
+ &self->data.ref_offset_type.buffer,
+ &self->data.mismatch.buffer,
+ &self->data.has_ref_offset.buffer,
+ &self->data.has_mismatch.buffer);
+
+ self->data.has_mismatch.elements = readlen;
+ self->data.has_ref_offset.elements = readlen;
+
+ return 0;
+}
diff --git a/tools/bam-loader/alignment-writer.h b/tools/bam-loader/alignment-writer.h
new file mode 100644
index 0000000..bdbfcfa
--- /dev/null
+++ b/tools/bam-loader/alignment-writer.h
@@ -0,0 +1,101 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_ALIGNMENT_WRITER_H_
+#define BAM_LOAD_ALIGNMENT_WRITER_H_ 1
+
+#include <klib/data-buffer.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <insdc/insdc.h>
+
+#include <align/writer-alignment.h>
+
+typedef struct s_alignment Alignment;
+typedef struct AlignmentRecord AlignmentRecord;
+
+struct AlignmentRecord {
+ KDataBuffer buffer;
+ TableWriterAlgnData data;
+ int64_t alignId;
+ bool isPrimary;
+
+ INSDC_coord_one read_id;
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ uint64_t global_ref_start;
+ bool ref_orientation;
+ uint32_t mapq;
+ uint64_t tmp_key_id;
+
+ INSDC_coord_zero read_start;
+ INSDC_coord_len read_len;
+
+ bool mate_ref_orientation;
+ int64_t mate_ref_id;
+ INSDC_coord_zero mate_ref_pos;
+ int64_t mate_align_id;
+ int32_t template_len;
+};
+
+#define AR_REF_ID(X) ((X).ref_id)
+#define AR_REF_START(X) ((X).global_ref_start)
+#define AR_REF_LEN(X) ((X).ref_len)
+#define AR_REF_ORIENT(X) ((X).ref_orientation)
+#define AR_READNO(X) ((X).read_id)
+#define AR_MAPQ(X) ((X).mapq)
+#define AR_KEY(X) ((X).tmp_key_id)
+
+#define AR_BASECOUNT(X) ((X).data.has_mismatch.elements)
+#define AR_HAS_MISMATCH(X) ((bool *)((X).data.has_mismatch.buffer))
+#define AR_HAS_OFFSET(X) ((bool *)((X).data.has_ref_offset.buffer))
+
+#define AR_NUM_MISMATCH(X) ((X).data.mismatch.elements)
+#define AR_MISMATCH(X) ((char *)((X).data.mismatch.buffer))
+
+#define AR_NUM_OFFSET(X) ((X).data.ref_offset.elements)
+#define AR_OFFSET(X) ((INSDC_coord_zero *)((X).data.ref_offset.buffer))
+#define AR_OFFSET_TYPE(X) ((uint8_t *)((X).data.ref_offset_type.buffer))
+
+#define AR_LINKAGE_GROUP(X) ((X).data.linkageGroup)
+
+Alignment *AlignmentMake(VDatabase *db);
+
+rc_t AlignmentWriteRecord(Alignment *self, AlignmentRecord *data);
+
+rc_t AlignmentStartUpdatingSpotIds(Alignment *self);
+
+rc_t AlignmentGetSpotKey(Alignment *self, uint64_t *keyId);
+
+rc_t AlignmentWriteSpotId(Alignment *self, int64_t spotId);
+
+rc_t AlignmentWhack(Alignment *self, bool commit);
+
+rc_t AlignmentRecordInit(AlignmentRecord *self, unsigned readlen);
+
+#endif
diff --git a/tools/bam-loader/analysis.c b/tools/bam-loader/analysis.c
new file mode 100644
index 0000000..2fa0168
--- /dev/null
+++ b/tools/bam-loader/analysis.c
@@ -0,0 +1,157 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+
+#include "KFileHelper.h"
+#include "analysis.h"
+#include "Globals.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static rc_t ParseAnalysis(Analysis *rslt, unsigned lines, char *src) {
+ unsigned i;
+
+ rslt->N = lines;
+ memset(&rslt->line[0], 0, lines * sizeof(rslt->line[0]));
+
+ for (i = 0; i != lines; ++i) {
+ char *endp;
+ char *tab;
+
+ endp = strchr(src, 0);
+ assert(endp);
+
+ rslt->line[i].name = src;
+ tab = strchr(src, '\t');
+ if (!tab) break;
+ src = tab + 1;
+ tab[0] = '\0';
+
+ rslt->line[i].refID = src;
+ tab = strchr(src, '\t');
+ if (!tab) break;
+ src = tab + 1;
+ tab[0] = '\0';
+
+ tab = strchr(src, '\t');
+ if (!tab) break;
+ src = tab + 1;
+
+ rslt->line[i].bamFile = src;
+ tab = strchr(src, '\t');
+ if (!tab) break;
+ src = tab + 1;
+ tab[0] = '\0';
+
+ rslt->line[i].asoFile = src;
+ tab = strchr(src, '\t');
+ if (!tab) break;
+ tab[0] = '\0';
+
+ src = endp + 1;
+ }
+ for (i = 0; i != lines; ++i) {
+ if (rslt->line[i].name == NULL ||
+ rslt->line[i].refID == NULL ||
+ rslt->line[i].bamFile == NULL ||
+ rslt->line[i].asoFile == NULL
+ )
+ {
+ return RC(rcApp, rcFile, rcReading, rcData, rcCorrupt);
+ }
+ }
+ return 0;
+}
+
+static int CC CompAnalysisLineBamFile(const void *A, const void *B, void *ignore) {
+ const AnalysisLine *a = A;
+ const AnalysisLine *b = B;
+ int rslt = strcmp(a->bamFile, b->bamFile);
+
+ if (rslt == 0)
+ rslt = strcmp(a->name, b->name);
+ return rslt;
+}
+
+const char *AnalysisNextBAMFile(const char *last) {
+ unsigned i;
+ if (last == NULL) {
+ return G.analysis->line[0].bamFile;
+ }
+ for (i = 1; i < G.analysis->N; ++i) {
+ if (strcmp(last, G.analysis->line[i].bamFile) > 0) {
+ return G.analysis->line[i].bamFile;
+ }
+ }
+ return NULL;
+}
+
+AnalysisLine *AnalysisMatch(const char *bamFile, const char *name) {
+ unsigned i;
+
+ for (i = 0; i != G.analysis->N; ++i) {
+ if (strcmp(bamFile, G.analysis->line[i].bamFile) == 0 &&
+ strcmp(name, G.analysis->line[i].name) == 0
+ )
+ {
+ return &G.analysis->line[i];
+ }
+ }
+ return NULL;
+}
+
+rc_t LoadAnalysis(const char *fileName) {
+ rc_t rc;
+ KDataBuffer buf;
+ uint64_t lines;
+
+ memset(&buf, 0, sizeof(buf));
+ buf.elem_bits = 8;
+
+ rc = LoadFile(&buf, &lines, G.inDir, fileName);
+ if (rc == 0) {
+ if (lines > 0 && buf.elem_count > 0) {
+ G.analysis = malloc(sizeof(*G.analysis) + (lines - 1) * sizeof(G.analysis->line[0]) + buf.elem_count);
+ if (G.analysis)
+ memmove(&G.analysis->line[lines], buf.base, buf.elem_count);
+ else
+ rc = RC(rcApp, rcFile, rcReading, rcMemory, rcExhausted);
+ }
+ else
+ rc = RC(rcApp, rcFile, rcReading, rcData, rcEmpty);
+ }
+ KDataBufferWhack(&buf);
+ if (rc == 0) {
+ rc = ParseAnalysis(G.analysis, lines, (char *)&G.analysis->line[lines]);
+ }
+ return rc;
+}
+
diff --git a/tools/bam-loader/analysis.h b/tools/bam-loader/analysis.h
new file mode 100644
index 0000000..766a652
--- /dev/null
+++ b/tools/bam-loader/analysis.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_ANALYSIS_H_
+#define BAM_LOAD_ANALYSIS_H_ 1
+#include <klib/rc.h>
+
+typedef struct s_analysis_line {
+ const char *name;
+ const char *refID;
+ const char *bamFile;
+ const char *asoFile;
+ uint64_t startPos;
+} AnalysisLine;
+
+typedef struct s_analysis {
+ unsigned N;
+ AnalysisLine line[1];
+} Analysis;
+
+const char *AnalysisNextBAMFile(const char *last);
+
+AnalysisLine *AnalysisMatch(const char *bamFile, const char *name);
+
+rc_t LoadAnalysis(const char *fileName);
+#endif
diff --git a/tools/bam-loader/bam-alignment.h b/tools/bam-loader/bam-alignment.h
new file mode 100644
index 0000000..14aae6d
--- /dev/null
+++ b/tools/bam-loader/bam-alignment.h
@@ -0,0 +1,74 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct bam_alignment_s {
+ uint8_t rID[4];
+ uint8_t pos[4];
+ uint8_t read_name_len;
+ uint8_t mapQual;
+ uint8_t bin[2];
+ uint8_t n_cigars[2];
+ uint8_t flags[2];
+ uint8_t read_len[4];
+ uint8_t mate_rID[4];
+ uint8_t mate_pos[4];
+ uint8_t ins_size[4];
+ char read_name[1 /* read_name_len */];
+/* if you change length of read_name,
+ * adjust calculation of offsets in BAM_AlignmentSetOffsets */
+/* uint32_t cigar[n_cigars];
+ * uint8_t seq[(read_len + 1) / 2];
+ * uint8_t qual[read_len];
+ * uint8_t extra[...];
+ */
+};
+
+typedef union bam_alignment_u {
+ struct bam_alignment_s cooked;
+ uint8_t raw[sizeof(struct bam_alignment_s)];
+} bam_alignment;
+
+struct offset_size_s {
+ unsigned offset;
+ unsigned size; /* this is the total length of the tag; length of data is size - 3 */
+};
+
+struct BAM_Alignment {
+ struct BAM_File *parent;
+ bam_alignment const *data;
+ uint8_t *storage;
+
+ uint64_t keyId;
+ bool wasInserted;
+
+ unsigned datasize;
+ unsigned cigar;
+ unsigned seq;
+ unsigned qual;
+ unsigned numExtra;
+ unsigned hasColor;
+ struct offset_size_s extra[1];
+};
diff --git a/tools/bam-loader/bam-loader.c b/tools/bam-loader/bam-loader.c
new file mode 100644
index 0000000..fdb95d4
--- /dev/null
+++ b/tools/bam-loader/bam-loader.c
@@ -0,0 +1,1270 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kapp/log-xml.h>
+#include <align/writer-refseq.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <limits.h>
+
+#include "Globals.h"
+#include "loader-imp.h"
+
+/*: ARGS
+Summary:
+ Load a BAM formatted data file
+
+Usage:
+ --help display this text and quit
+ --version display the version string and quit
+ [global-options] [options] <file...> [ --remap [options] <file>... ]...
+
+//:global-options
+Global Options:
+
+* options effecting logging
+ log-level <level> logging level values: [fatal|sys|int|err|warn|info|0-5] default: info
+ xml-log <filename> produce an XML-formatted log file
+
+* options effecting performance optimisation
+ tmpfs <directory> where to store temparary files, default: '/tmp'
+ cache-size <mbytes> the limit in MB for temparary files
+
+* options effecting error limits
+ max-err-count <number> the maximum number of errors to ignore
+ max-warning-dup-flag <count> the limit for number of duplicate flag mismatch warnings
+
+//:options
+Options:
+ output <name> name of the output, required
+ config <file> reference configuration file (See Configuration)
+ header <file> file containing the SAM header
+ remap special option to enable processing sets of remapped files. remap MUST be given between each set, all regular options can be respecified, in fact the output must be unique for each set. This is for when a set of reads are aligned multiple times, for example against different reference builds or with different aligners. This mode ensures that spot ids are the same across the several outputs.
+
+Debugging Options:
+ only-verify exit after verifying existence of references
+ max-rec-count <number> exit after processing this many records (per file)
+ nomatch-log <path> log alignments with no matching bases
+
+Filtering Options:
+ minimum-match <number> minimum number of matches for an alignment
+ no-secondary ignore alignments marked as secondary
+ accept-dups accept spots with inconsistent PCR duplicate flags
+ accept-nomatch accept alignments with no matching bases
+ ref-config limit processing to references in the config file, ignoring all others
+ ref-filter <name> limit processing to the given reference, ignoring all others
+ min-mapq <number> filter secondary alignments by minimum mapping quality
+
+Rare or Esoteric Options:
+ input <directory> where to find fasta files
+ ref-file <file> fasta file with references
+ unsorted expect unsorted input (requires more memory)
+ sorted require sorted input
+ TI look for trace id optional tag
+ unaligned <file> file without aligned reads
+
+Deprecated Options:
+ use-OQ use OQ option column for quality values instead of QUAL
+ no-verify skip verify existence of references from the BAM file
+ accept-hard-clip allow hard clipping in CIGAR
+ allow-multi-map allow the same reference to be mapped to multiple names in the input files
+ edit-aligned-qual <number> convert quality at aligned positions to this value
+ cs turn on awareness of colorspace
+ qual-quant quality scores quantization level
+ keep-mismatch-qual don't quantized quality at mismatched positions
+
+
+Example:
+ bam-load -o /tmp/SRZ123456 -k analysis.bam.cfg 123456.bam
+*/
+
+/* MARK: Arguments and Usage */
+static char const option_input[] = "input";
+static char const option_output[] = "output";
+static char const option_tmpfs[] = "tmpfs";
+static char const option_config[] = "config";
+static char const option_min_mapq[] = "min-mapq";
+static char const option_qual_compress[] = "qual-quant";
+static char const option_cache_size[] = "cache-size";
+static char const option_unsorted[] = "unsorted";
+static char const option_sorted[] = "sorted";
+static char const option_max_err_count[] = "max-err-count";
+static char const option_max_rec_count[] = "max-rec-count";
+static char const option_no_verify[] = "no-verify";
+static char const option_only_verify[] = "only-verify";
+static char const option_use_qual[] = "use-QUAL";
+static char const option_ref_filter[] = "ref-filter";
+static char const option_ref_config[] = "ref-config";
+static char const option_edit_aligned_qual[] = "edit-aligned-qual";
+static char const option_unaligned[] = "unaligned";
+static char const option_accept_dup[] = "accept-dups";
+static char const option_accept_nomatch[] = "accept-nomatch";
+static char const option_nomatch_log[] = "nomatch-log";
+static char const option_keep_mismatch_qual[] = "keep-mismatch-qual";
+static char const option_min_match[] = "minimum-match";
+static char const option_header[] = "header";
+static char const option_no_cs[] = "no-cs";
+static char const option_no_secondary[] = "no-secondary";
+static char const option_ref_file[] = "ref-file";
+static char const option_TI[] = "TI";
+static char const option_max_warn_dup_flag[] = "max-warning-dup-flag";
+static char const option_accept_hard_clip[] = "accept-hard-clip";
+static char const option_allow_multi_map[] = "allow-multi-map";
+static char const option_allow_secondary[] = "make-spots-with-secondary";
+static char const option_defer_secondary[] = "defer-secondary";
+
+#define OPTION_INPUT option_input
+#define OPTION_OUTPUT option_output
+#define OPTION_TMPFS option_tmpfs
+#define OPTION_CONFIG option_config
+#define OPTION_MINMAPQ option_min_mapq
+#define OPTION_QCOMP option_qual_compress
+#define OPTION_CACHE_SIZE option_cache_size
+#define OPTION_MAX_ERR_COUNT option_max_err_count
+#define OPTION_MAX_REC_COUNT option_max_rec_count
+#define OPTION_UNALIGNED option_unaligned
+#define OPTION_ACCEPT_DUP option_accept_dup
+#define OPTION_ACCEPT_NOMATCH option_accept_nomatch
+#define OPTION_NOMATCH_LOG option_nomatch_log
+#define OPTION_MIN_MATCH option_min_match
+#define OPTION_HEADER option_header
+#define OPTION_NO_CS option_no_cs
+#define OPTION_NO_SECONDARY option_no_secondary
+#define OPTION_REF_FILE option_ref_file
+#define OPTION_TI option_TI
+#define OPTION_MAX_WARN_DUP_FLAG option_max_warn_dup_flag
+#define OPTION_ACCEPT_HARD_CLIP option_accept_hard_clip
+#define OPTION_ALLOW_MULTI_MAP option_allow_multi_map
+#define OPTION_ALLOW_SECONDARY option_allow_secondary
+#define OPTION_DEFER_SECONDARY option_defer_secondary
+
+#define ALIAS_INPUT "i"
+#define ALIAS_OUTPUT "o"
+#define ALIAS_TMPFS "t"
+#define ALIAS_CONFIG "k"
+#define ALIAS_MINMAPQ "q"
+#define ALIAS_QCOMP "Q"
+#define ALIAS_MAX_ERR_COUNT "E"
+#define ALIAS_UNALIGNED "u"
+#define ALIAS_ACCEPT_DUP "d"
+#define ALIAS_NO_SECONDARY "P"
+#define ALIAS_REF_FILE "r"
+
+static
+char const * input_usage[] =
+{
+ "Path where to get fasta files from.",
+ NULL
+};
+
+static
+char const * output_usage[] =
+{
+ "Path and Name of the output database.",
+ NULL
+};
+
+static
+char const * tmpfs_usage[] =
+{
+ "Path to be used for scratch files.",
+ NULL
+};
+
+static
+char const * config_usage[] =
+{
+ "Path to configuration file:",
+ "maps the input BAM file's reference names to the equivalent GenBank accession.",
+ "It is a tab-delimited text file with unix line endings (\\n - LF) with the following fields in this order:",
+ "#1 reference name as it occurs in the BAM file's SN field of @SQ header record;",
+ "#2 INSDC reference ID",
+ NULL
+};
+
+static
+char const * min_mapq_usage[] =
+{
+ "Filter secondary alignments by minimum mapping quality.",
+ NULL
+};
+
+static
+char const * qcomp_usage[] =
+{
+ "Quality scores quantization level, can be a number (0: none, 1: 2bit, 2: 1bit), or a string like '1:10,10:20,20:30,30:-' (which is equivalent to 1) (nb. the endpoint is exclusive).",
+ NULL
+};
+
+static
+char const * unsorted_usage[] =
+{
+ "Tell the loader to expect unsorted input (requires more memory)",
+ NULL
+};
+
+static
+char const * sorted_usage[] =
+{
+ "Tell the loader to require sorted input",
+ NULL
+};
+
+static
+char const * cache_size_usage[] =
+{
+ "Set the cache size in MB for the temporary indices",
+ NULL
+};
+
+static
+char const * mrc_usage[] =
+{
+ "Set the maximum number of records to process from the BAM file",
+ NULL
+};
+
+static
+char const * mec_usage[] =
+{
+ "Set the maximum number of errors to ignore from the BAM file",
+ NULL
+};
+
+static
+char const * no_verify_usage[] =
+{
+ "Skip verify existence of references from the BAM file",
+ NULL
+};
+
+static
+char const * only_verify_usage[] =
+{
+ "Exit after verifying existence of references from the BAM file",
+ NULL
+};
+
+static
+char const * use_QUAL_usage[] =
+{
+ "use QUAL column for quality values (default is to use OQ if it is available)",
+ NULL
+};
+
+static
+char const * use_ref_filter[] =
+{
+ "Only process alignments to the given reference",
+ NULL
+};
+
+static
+char const * use_ref_config[] =
+{
+ "Only process alignments to references in the config file",
+ NULL
+};
+
+static
+char const * use_edit_aligned_qual[] =
+{
+ "Convert quality at aligned positions to this value",
+ NULL
+};
+
+static
+char const * use_keep_mismatch_qual[] =
+{
+ "Don't quantized quality at mismatched positions",
+ NULL
+};
+
+static
+char const * use_unaligned[] =
+{
+ "Specify file without aligned reads",
+ NULL
+};
+
+static
+char const * use_accept_dups[] =
+{
+ "Accept spots inconsistent PCR duplicate flags",
+ NULL
+};
+
+static
+char const * use_accept_nomatch[] =
+{
+ "Accept alignments with no matching bases",
+ NULL
+};
+
+static
+char const * use_nomatch_log[] =
+{
+ "Where to write info for alignments with no matching bases",
+ NULL
+};
+
+static
+char const * use_min_match[] =
+{
+ "minimum number of matches for an alignment",
+ NULL
+};
+
+static
+char const * use_header[] =
+{
+ "path to a file containing the SAM header to store in the resulting cSRA, recommended in case of multiple input BAMs",
+ NULL
+};
+
+static
+char const * use_no_cs[] =
+{
+ "turn off awareness of colorspace",
+ NULL
+};
+
+static
+char const * use_no_secondary[] =
+{
+ "ignore alignments marked as secondary",
+ NULL
+};
+
+static
+char const * use_ref_file[] =
+{
+ "path to a fasta file with references",
+ NULL
+};
+
+static
+char const * use_TI[] =
+{
+ "for trace alignments",
+ NULL
+};
+
+static
+char const * use_max_dup_warnings[] =
+{
+ "set limit for number of duplicate flag mismatch warnings",
+ NULL
+};
+
+static
+char const * use_accept_hard_clip[] =
+{
+ "accept hard clipping in CIGAR",
+ NULL
+};
+
+static
+char const * use_allow_multi_map[] =
+{
+ "allow the same reference to be mapped to multiple names in the input files",
+ "(default is disallow, old behaviors was to allow it)",
+ NULL
+};
+
+static
+char const * use_allow_secondary[] =
+{
+ "use secondary alignments for constructing spots",
+ NULL
+};
+
+static
+char const * use_defer_secondary[] =
+{
+ "defer processing of secondary alignments until the end of the file",
+ NULL
+};
+
+OptDef Options[] =
+{
+ /* order here is same as in param array below!!! */
+ { OPTION_INPUT, ALIAS_INPUT, NULL, input_usage, 1, true, false },
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, true },
+ { OPTION_CONFIG, ALIAS_CONFIG, NULL, config_usage, 1, true, false },
+ { OPTION_HEADER, NULL, NULL, use_header, 1, true, false },
+ { OPTION_TMPFS, ALIAS_TMPFS, NULL, tmpfs_usage, 1, true, false },
+ { OPTION_UNALIGNED, ALIAS_UNALIGNED, NULL, use_unaligned, 256, true, false },
+ { OPTION_ACCEPT_DUP, ALIAS_ACCEPT_DUP, NULL, use_accept_dups, 1, false, false },
+ { OPTION_ACCEPT_NOMATCH, NULL, NULL, use_accept_nomatch, 1, false, false },
+ { OPTION_NOMATCH_LOG, NULL, NULL, use_nomatch_log, 1, true, false },
+ { OPTION_QCOMP, ALIAS_QCOMP, NULL, qcomp_usage, 1, true, false },
+ { OPTION_MINMAPQ, ALIAS_MINMAPQ, NULL, min_mapq_usage, 1, true, false },
+ { OPTION_CACHE_SIZE, NULL, NULL, cache_size_usage, 1, true, false },
+ { OPTION_NO_CS, NULL, NULL, use_no_cs, 1, false, false },
+ { OPTION_MIN_MATCH, NULL, NULL, use_min_match, 1, true, false },
+ { OPTION_NO_SECONDARY, ALIAS_NO_SECONDARY, NULL, use_no_secondary, 1, false, false },
+ { option_unsorted, NULL, NULL, unsorted_usage, 1, false, false },
+ { option_sorted, NULL, NULL, sorted_usage, 1, false, false },
+ { option_no_verify, NULL, NULL, no_verify_usage, 1, false, false },
+ { option_only_verify, NULL, NULL, only_verify_usage, 1, false, false },
+ { option_use_qual, NULL, NULL, use_QUAL_usage, 1, false, false },
+ { option_ref_config, NULL, NULL, use_ref_config, 1, false, false },
+ { option_ref_filter, NULL, NULL, use_ref_filter, 1, true, false },
+ { option_edit_aligned_qual, NULL, NULL, use_edit_aligned_qual, 1, true, false },
+ { option_keep_mismatch_qual, NULL, NULL, use_keep_mismatch_qual, 1, false, false },
+ { OPTION_MAX_REC_COUNT, NULL, NULL, mrc_usage, 1, true, false },
+ { OPTION_MAX_ERR_COUNT, ALIAS_MAX_ERR_COUNT, NULL, mec_usage, 1, true, false },
+ { OPTION_REF_FILE, ALIAS_REF_FILE, NULL, use_ref_file, 0, true, false },
+ { OPTION_TI, NULL, NULL, use_TI, 1, false, false },
+ { OPTION_MAX_WARN_DUP_FLAG, NULL, NULL, use_max_dup_warnings, 1, true, false },
+ { OPTION_ACCEPT_HARD_CLIP, NULL, NULL, use_accept_hard_clip, 1, false, false },
+ { OPTION_ALLOW_MULTI_MAP, NULL, NULL, use_allow_multi_map, 1, false, false },
+ { OPTION_ALLOW_SECONDARY, NULL, NULL, use_allow_secondary, 1, false, false },
+ { OPTION_DEFER_SECONDARY, NULL, NULL, use_defer_secondary, 1, false, false }
+};
+
+const char* OptHelpParam[] =
+{
+ /* order here is same as in OptDef array above!!! */
+ "path", /* input */
+ "path", /* output */
+ "path-to-file", /* config */
+ "path-to-file", /* header */
+ "path", /* tmpfs */
+ "path-to-file", /* unaligned */
+ NULL, /* accept dups */
+ NULL, /* accept no-match */
+ "path-to-file", /* no-match log */
+ "level", /* quality compression */
+ "phred-score", /* min. mapq */
+ "mbytes", /* cache size */
+ NULL, /* no colorspace */
+ "count", /* min. match count */
+ NULL, /* no secondary */
+ NULL, /* unsorted */
+ NULL, /* sorted */
+ NULL, /* no verify ref's */
+ NULL, /* quit after verify ref's */
+ NULL, /* force QUAL */
+ NULL, /* ref's from config */
+ "name", /* only this ref */
+ "new-value", /* value for aligned qualities */
+ NULL, /* no quantize mismatch qualities */
+ "number", /* max. record count to process */
+ "number", /* max. error count */
+ "path-to-file", /* reference fasta file */
+ NULL, /* use XT->TI */
+ "count", /* max. duplicate warning count */
+ NULL, /* allow hard clipping */
+ NULL, /* allow multimapping */
+ NULL, /* allow secondary */
+ NULL /* defer secondary */
+};
+
+rc_t UsageSummary (char const * progname)
+{
+ return KOutMsg (
+ "Usage:\n"
+ "\t%s [options] <bam-file>\n"
+ "\n"
+ "Summary:\n"
+ "\tLoad a BAM formatted data file\n"
+ "\n"
+ "Example:\n"
+ "\t%s -o /tmp/SRZ123456 -k analysis.bam.cfg 123456.bam\n"
+ "\n"
+ ,progname, progname);
+}
+
+char const UsageDefaultName[] = "bam-load";
+
+rc_t CC Usage (const Args * args)
+{
+ rc_t rc;
+ int i;
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ const size_t argsQty = sizeof(Options) / sizeof(Options[0]);
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ for(i = 0; i < argsQty; i++ ) {
+ if( Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < argsQty; i++ ) {
+ if( !Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ XMLLogger_Usage();
+ OUTMSG(("\n"));
+ HelpOptionsStandard ();
+ HelpVersion (fullpath, KAppVersion());
+ return rc;
+}
+
+/* MARK: Definitions and Globals */
+
+#define SCHEMAFILE "align/align.vschema"
+
+Globals G;
+
+#ifdef _WIN32
+#include <process.h>
+#else
+#include <unistd.h>
+#endif
+static void set_pid(void)
+{
+ G.pid = getpid();
+}
+
+static rc_t PathWithBasePath(char rslt[], size_t sz, char const path[], char const base[])
+{
+ size_t const plen = strlen(path);
+ bool const hasBase = base && base[0];
+ bool const isBareName = strchr(path, '/') == NULL;
+
+ if (isBareName && hasBase) {
+ if (string_printf(rslt, sz, NULL, "%s/%s", base, path) == 0)
+ return 0;
+ }
+ else if (plen < sz) {
+ strncpy(rslt, path, sz);
+ return 0;
+ }
+ {
+ rc_t const rc = RC(rcApp, rcArgv, rcAccessing, rcBuffer, rcInsufficient);
+ (void)LOGERR(klogErr, rc, "The path to the file is too long");
+ return rc;
+ }
+}
+
+static rc_t OpenFile(KFile const **kf, char const path[], char const base[])
+{
+ char fname[4096];
+ rc_t rc = PathWithBasePath(fname, sizeof(fname), path, base);
+
+ if (rc == 0) {
+ KDirectory *dir;
+
+ rc = KDirectoryNativeDir(&dir);
+ if (rc == 0) {
+ rc = KDirectoryOpenFileRead(dir, kf, "%s", fname);
+ KDirectoryRelease(dir);
+ }
+ }
+ return rc;
+}
+
+static rc_t LoadHeader(char const **rslt, char const path[], char const base[])
+{
+ KFile const *kf;
+ rc_t rc = OpenFile(&kf, path, base);
+
+ *rslt = NULL;
+ if (rc == 0) {
+ uint64_t fsize;
+ rc = KFileSize(kf, &fsize);
+ if (rc == 0) {
+ char *fdata = malloc(fsize+1);
+
+ if (fdata) {
+ size_t nread;
+ rc = KFileRead(kf, 0, fdata, fsize, &nread);
+ if (rc == 0) {
+ if (nread) {
+ fdata[nread] = '\0';
+ *rslt = fdata;
+ }
+ else {
+ free(fdata);
+ rc = RC(rcApp, rcArgv, rcAccessing, rcFile, rcEmpty);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' is empty", "file=%s", path));
+ }
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to read file '$(file)'", "file=%s", path));
+ }
+ }
+ else {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to read file '$(file)'", "file=%s", path));
+ }
+ }
+ KFileRelease(kf);
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to open file '$(file)'", "file=%s", path));
+ }
+ return rc;
+}
+
+static rc_t main_help_vers(int argc, char * argv[])
+{
+ Args *args = NULL;
+ rc_t const rc = ArgsMakeAndHandle (&args, argc, argv, 2, Options,
+ sizeof Options / sizeof (OptDef), XMLLogger_Args, XMLLogger_ArgsQty);
+ ArgsWhack(args);
+ return rc;
+}
+
+static rc_t getArgValue(Args *const args, char const *name, int index, char const **result)
+{
+ void const *value;
+ rc_t const rc = ArgsOptionValue(args, name, index, &value);
+ if (rc) return rc;
+ free((void *)*result);
+ *result = strdup(value);
+ assert(*result);
+ return 0;
+}
+
+static rc_t main_1(int argc, char *argv[], bool const continuing, unsigned const load)
+{
+ Args *args;
+ rc_t rc;
+ unsigned n_aligned = 0;
+ unsigned n_unalgnd = 0;
+ char *aligned[256];
+ char *unalgnd[256];
+ char *name_buffer = NULL;
+ unsigned next_name = 0;
+ unsigned nbsz = 0;
+ char const *value;
+ char *dummy;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof(Options)/sizeof(Options[0]));
+ while (rc == 0) {
+ uint32_t pcount;
+
+ rc = ArgsOptionCount(args, option_only_verify, &pcount);
+ if (rc)
+ break;
+ G.onlyVerifyReferences |= (pcount > 0);
+
+ rc = ArgsOptionCount(args, option_no_verify, &pcount);
+ if (rc)
+ break;
+ G.noVerifyReferences |= (pcount > 0);
+
+ rc = ArgsOptionCount(args, option_use_qual, &pcount);
+ if (rc)
+ break;
+ G.useQUAL |= (pcount > 0);
+
+ rc = ArgsOptionCount(args, option_ref_config, &pcount);
+ if (rc)
+ break;
+ G.limit2config |= (pcount > 0);
+
+ rc = ArgsOptionCount(args, OPTION_REF_FILE, &pcount);
+ if (rc)
+ break;
+ if (pcount && G.refFiles) {
+ int i;
+
+ for (i = 0; G.refFiles[i]; ++i)
+ free((void *)G.refFiles[i]);
+ free((void *)G.refFiles);
+ }
+ G.refFiles = calloc(pcount + 1, sizeof(*(G.refFiles)));
+ if (!G.refFiles) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+ break;
+ }
+ while(pcount-- > 0) {
+ rc = getArgValue(args, OPTION_REF_FILE, pcount, &G.refFiles[pcount]);
+ if (rc)
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_TMPFS, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, OPTION_TMPFS, 0, &G.tmpfs);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_INPUT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, OPTION_INPUT, 0, &G.inpath);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single input parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, option_ref_filter, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, option_ref_filter, 0, &G.refFilter);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_CONFIG, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, OPTION_CONFIG, 0, &G.refXRefPath);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single input parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_OUTPUT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, OPTION_OUTPUT, 0, &G.outpath);
+ if (rc)
+ break;
+ if (load == 0) {
+ G.firstOut = strdup(G.outpath);
+ }
+ value = strrchr(G.outpath, '/');
+ G.outname = value ? (value + 1) : G.outpath;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single output parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+ else if (!G.onlyVerifyReferences) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcInsufficient);
+ OUTMSG (("Output parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MINMAPQ, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue(args, OPTION_MINMAPQ, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.minMapQual = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_QCOMP, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = getArgValue(args, OPTION_QCOMP, 0, &G.QualQuantizer);
+ if (rc)
+ break;
+ }
+
+ rc = ArgsOptionCount (args, option_edit_aligned_qual, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, option_edit_aligned_qual, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.alignedQualValue = strtoul(value, &dummy, 0);
+ if (G.alignedQualValue == 0) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcIncorrect);
+ OUTMSG (("edit-aligned-qual: bad value\n"));
+ MiniUsage (args);
+ break;
+ }
+ G.editAlignedQual = true;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_CACHE_SIZE, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_CACHE_SIZE, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.cache_size = strtoul(value, &dummy, 0) * 1024UL * 1024UL;
+ if (G.cache_size == 0) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcIncorrect);
+ OUTMSG (("cache-size: bad value\n"));
+ MiniUsage (args);
+ break;
+ }
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MAX_WARN_DUP_FLAG, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_WARN_DUP_FLAG, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxWarnCount_DupConflict = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, option_unsorted, &pcount);
+ if (rc)
+ break;
+ G.expectUnsorted |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, option_sorted, &pcount);
+ if (rc)
+ break;
+ G.requireSorted |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_MAX_REC_COUNT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_REC_COUNT, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxAlignCount = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MAX_ERR_COUNT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_ERR_COUNT, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxErrCount = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MIN_MATCH, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MIN_MATCH, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.minMatchCount = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_ACCEPT_DUP, &pcount);
+ if (rc)
+ break;
+ G.acceptBadDups |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_ACCEPT_NOMATCH, &pcount);
+ if (rc)
+ break;
+ G.acceptNoMatch |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, option_keep_mismatch_qual, &pcount);
+ if (rc)
+ break;
+ G.keepMismatchQual |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_NO_CS, &pcount);
+ if (rc)
+ break;
+ G.noColorSpace |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_NO_SECONDARY, &pcount);
+ if (rc)
+ break;
+ G.noSecondary |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_TI, &pcount);
+ if (rc)
+ break;
+ G.hasTI |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_ACCEPT_HARD_CLIP, &pcount);
+ if (rc)
+ break;
+ G.acceptHardClip |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_ALLOW_MULTI_MAP, &pcount);
+ if (rc)
+ break;
+ G.allowMultiMapping |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_ALLOW_SECONDARY, &pcount);
+ if (rc)
+ break;
+ G.assembleWithSecondary |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_DEFER_SECONDARY, &pcount);
+ if (rc)
+ break;
+ G.deferSecondary |= (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_NOMATCH_LOG, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ KDirectory *dir;
+
+ rc = ArgsOptionValue (args, OPTION_NOMATCH_LOG, 0, (const void **)&value);
+ if (rc) break;
+ rc = KDirectoryNativeDir(&dir);
+ if (rc) break;
+ rc = KDirectoryCreateFile(dir, &G.noMatchLog, 0, 0664, kcmInit, "%s", value);
+ KDirectoryRelease(dir);
+ if (rc) break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_HEADER, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1) {
+ rc = ArgsOptionValue (args, OPTION_HEADER, 0, (const void **)&value);
+ if (rc) break;
+ free((void *)G.headerText);
+ rc = LoadHeader(&G.headerText, value, G.inpath);
+ if (rc) break;
+ }
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc) break;
+ if (pcount == 0)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcInsufficient);
+ MiniUsage (args);
+ break;
+ }
+ else if (pcount > sizeof(aligned)/sizeof(aligned[0])) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ (void)PLOGERR(klogErr, (klogErr, rc, "$(count) input files is too many, $(max) is the limit",
+ "count=%u,max=%u", (unsigned)pcount, (unsigned)(sizeof(aligned)/sizeof(aligned[0]))));
+ break;
+ }
+ else {
+ unsigned need = G.inpath ? (strlen(G.inpath) + 1) * pcount : 0;
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsParamValue(args, i, (const void **)&value);
+ if (rc) break;
+ need += strlen(value) + 1;
+ }
+ nbsz = need;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_UNALIGNED, &pcount);
+ if (rc)
+ break;
+ if (pcount > 0)
+ {
+ unsigned need = G.inpath ? (strlen(G.inpath) + 1) * pcount : 0;
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsOptionValue(args, OPTION_UNALIGNED, i, (const void **)&value);
+ if (rc) break;
+ need += strlen(value) + 1;
+ }
+ if (rc) break;
+ nbsz += need;
+ }
+
+ name_buffer = malloc(nbsz);
+ if (name_buffer == NULL) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_UNALIGNED, &pcount);
+ if (rc == 0) {
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsOptionValue(args, OPTION_UNALIGNED, i, (const void **)&value);
+ if (rc) break;
+
+ unalgnd[n_unalgnd++] = name_buffer + next_name;
+ rc = PathWithBasePath(name_buffer + next_name, nbsz - next_name, value, G.inpath);
+ if (rc) break;
+ next_name += strlen(name_buffer + next_name) + 1;
+ }
+ if (rc) break;
+ }
+ else
+ break;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc == 0) {
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsParamValue(args, i, (const void **)&value);
+ if (rc) break;
+
+ aligned[n_aligned++] = name_buffer + next_name;
+ rc = PathWithBasePath(name_buffer + next_name, nbsz - next_name, value, G.inpath);
+ if (rc) break;
+ next_name += strlen(name_buffer + next_name) + 1;
+ }
+ }
+ else
+ break;
+
+ rc = run(argv[0], n_aligned, (char const **)aligned, n_unalgnd, (char const **)unalgnd, continuing);
+ break;
+ }
+ free(name_buffer);
+
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "load failed",
+ "severity=total,status=failure,accession=%s,errors=%u", G.outname, G.errCount));
+ } else {
+ (void)PLOGMSG(klogInfo, (klogInfo, "loaded",
+ "severity=total,status=success,accession=%s,errors=%u", G.outname, G.errCount));
+ }
+ ArgsWhack(args);
+ return rc;
+}
+
+static void cleanupGlobal(void)
+{
+ if (G.refFiles) {
+ int i;
+
+ for (i = 0; G.refFiles[i]; ++i)
+ free((void *)G.refFiles[i]);
+ free((void *)G.refFiles);
+ }
+ free((void *)G.tmpfs);
+ free((void *)G.inpath);
+ free((void *)G.refFilter);
+ free((void *)G.refXRefPath);
+ free((void *)G.outpath);
+ free((void *)G.firstOut);
+ free((void *)G.headerText);
+ free((void *)G.QualQuantizer);
+ free((void *)G.schemaPath);
+}
+
+static int find_arg(char const *const *const query, int const first, int const argc, char **const argv)
+{
+ int i;
+
+ for (i = first; i < argc; ++i) {
+ int j;
+
+ for (j = 0; query[j] != NULL; ++j) {
+ if (strcmp(argv[i], query[j]) == 0)
+ return i;
+ }
+ }
+ return 0;
+}
+
+static bool has_arg(char const *const *const query, int const argc, char **const argv)
+{
+ return find_arg(query, 1, argc, argv) > 0;
+}
+
+static const char *logger_options[] = { "--xml-log-fd", "--xml-log", "-z" };
+static XMLLogger const *make_logger(int *argc, char *argv[])
+{
+ XMLLogger const *rslt = NULL;
+ char *argf[4];
+ int i;
+
+ argf[0] = argv[0];
+ argf[1] = NULL;
+ argf[2] = NULL;
+ argf[3] = NULL;
+
+ for (i = 1; i < *argc; ++i) {
+ int remove = 0;
+
+ if (strcmp(argv[i], logger_options[2]) == 0) {
+ argf[1] = argv[i];
+ argf[2] = argv[i + 1];
+ remove = 2;
+ }
+ else {
+ int j;
+
+ for (j = 0; j < 2; ++j) {
+ if (strstr(argv[i], logger_options[j]) == argv[i]) {
+ int const n = strlen(logger_options[j]);
+
+ if (argv[i][n] == '\0') {
+ argf[1] = argv[i];
+ argf[2] = argv[i + 1];
+ remove = 2;
+ }
+ else if (argv[i][n] == '=') {
+ argv[i][n] = '\0';
+ argf[1] = argv[i];
+ argf[2] = argv[i] + n + 1;
+ remove = 1;
+ }
+ break;
+ }
+ }
+ }
+ if (argf[1] != NULL) {
+ Args *args = NULL;
+
+ ArgsMakeAndHandle(&args, 3, argf, 1, XMLLogger_Args, XMLLogger_ArgsQty);
+ if (args) {
+ XMLLogger_Make(&rslt, NULL, args);
+ ArgsWhack(args);
+ }
+ }
+ if (remove) {
+ *argc -= remove;
+ memmove(argv + i, argv + i + remove, (*argc + 1) * sizeof(argv[0]));
+ break;
+ }
+ }
+ return rslt;
+}
+
+rc_t CC KMain(int argc, char *argv[])
+{
+ static const char *help[] = { "--help", "-h", "-?", NULL };
+ static const char *vers[] = { "--version", "-V", NULL };
+
+ bool const has_help = has_arg(help, argc, argv);
+ bool const has_vers = has_arg(vers, argc, argv);
+ XMLLogger const *logger = NULL;
+ int argfirst = 0;
+ int arglast = 0;
+ rc_t rc = 0;
+ unsigned load = 0;
+
+ if (has_help) {
+ argc = 2;
+ argv[1] = "--help";
+ return main_help_vers(argc, argv);
+ }
+ if (has_vers) {
+ argc = 2;
+ argv[1] = "--version";
+ return main_help_vers(argc, argv);
+ }
+
+ logger = make_logger(&argc, argv);
+
+ memset(&G, 0, sizeof(G));
+ G.mode = mode_Archive;
+ G.globalMode = mode_Archive;
+ G.maxSeqLen = TableWriterRefSeq_MAX_SEQ_LEN;
+ G.schemaPath = strdup(SCHEMAFILE);
+ G.omit_aligned_reads = true;
+ G.omit_reference_reads = true;
+ G.minMapQual = 0; /* accept all */
+ G.tmpfs = strdup("/tmp");
+ G.cache_size = ((size_t)16) << 30;
+ G.maxErrCount = 1000;
+ G.minMatchCount = 10;
+
+ set_pid();
+
+ for (arglast = 1; arglast < argc; ++arglast) {
+ if (strcmp(argv[arglast], "--remap") == 0) {
+ argv[arglast] = argv[0];
+ G.globalMode = mode_Remap;
+ rc = main_1(arglast - argfirst, argv + argfirst, true, load);
+ if (rc)
+ break;
+ G.mode = mode_Remap;
+ argfirst = arglast;
+ ++load;
+ }
+ }
+ rc = main_1(arglast - argfirst, argv + argfirst, false, load);
+ XMLLogger_Release(logger);
+ cleanupGlobal();
+ return rc;
+}
diff --git a/tools/bam-loader/bam-priv.h b/tools/bam-loader/bam-priv.h
new file mode 100644
index 0000000..c813922
--- /dev/null
+++ b/tools/bam-loader/bam-priv.h
@@ -0,0 +1,196 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "bam.h"
+#include "bam-alignment.h"
+
+typedef struct BAMIndex BAMIndex;
+typedef struct BufferedFile BufferedFile;
+typedef struct SAMFile SAMFile;
+typedef struct BGZFile BGZFile;
+
+#define ZLIB_BLOCK_SIZE (64u * 1024u)
+#define RGLR_BUFFER_SIZE (16u * ZLIB_BLOCK_SIZE)
+#define PIPE_BUFFER_SIZE (4096u)
+
+typedef uint8_t zlib_block_t[ZLIB_BLOCK_SIZE];
+
+typedef struct RawFile_vt_s {
+ rc_t (*FileRead)(void *, zlib_block_t, unsigned *);
+ uint64_t (*FileGetPos)(void const *);
+ float (*FileProPos)(void const *);
+ uint64_t (*FileGetSize)(void const *);
+ rc_t (*FileSetPos)(void *, uint64_t);
+ void (*FileWhack)(void *);
+} RawFile_vt;
+
+/* MARK: SAMFile */
+
+struct BufferedFile {
+ KFile const *kf;
+ void *buf;
+ uint64_t fmax; /* file size if known or 0 */
+ uint64_t fpos; /* position in file of first byte in buffer */
+ size_t bpos; /* position in buffer of read head */
+ size_t bmax; /* number of valid bytes in buffer */
+ size_t size; /* maximum number of that can be read into buffer */
+};
+
+struct SAMFile {
+ BufferedFile file;
+ int putback;
+ rc_t last;
+};
+
+struct BGZFile {
+ BufferedFile file;
+ z_stream zs;
+};
+
+struct BAM_File {
+ union {
+ BGZFile bam;
+ SAMFile sam;
+ } file;
+ RawFile_vt vt;
+
+ KFile *defer;
+
+ BAMRefSeq *refSeq; /* pointers into headerData1 except name points into headerData2 */
+ BAMReadGroup *readGroup; /* pointers into headerData1 */
+ char const *version;
+ char const *header;
+ void *headerData1; /* gets used for refSeq and readGroup */
+ void *headerData2; /* gets used for refSeq */
+ BAM_Alignment *nocopy; /* used to hold current record for BAM_FileRead2 */
+
+ uint64_t fpos_cur;
+ uint64_t deferPos;
+
+ unsigned refSeqs;
+ unsigned readGroups;
+ unsigned bufSize; /* current size of uncompressed buffer */
+ unsigned bufCurrent; /* location in uncompressed buffer of read head */
+ bool eof;
+ bool isSAM;
+ zlib_block_t buffer; /* uncompressed buffer */
+};
+
+#define CG_NUM_SEGS 4
+
+#ifdef __GNUC__
+static inline int getRefSeqId(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getPosition(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getReadNameLength(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getBin(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getMapQual(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getCigarCount(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getFlags(BAM_Alignment const *) __attribute__((always_inline));
+static inline unsigned getReadLen(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getMateRefSeqId(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getMatePos(BAM_Alignment const *) __attribute__((always_inline));
+static inline int getInsertSize(BAM_Alignment const *) __attribute__((always_inline));
+static inline char const *getReadName(BAM_Alignment const *) __attribute__((always_inline));
+static inline void const *getCigarBase(BAM_Alignment const *) __attribute__((always_inline));
+static inline uint16_t LE2HUI16(void const *) __attribute__((always_inline));
+static inline uint32_t LE2HUI32(void const *) __attribute__((always_inline));
+static inline uint64_t LE2HUI64(void const *) __attribute__((always_inline));
+static inline int16_t LE2HI16(void const *) __attribute__((always_inline));
+static inline int32_t LE2HI32(void const *) __attribute__((always_inline));
+static inline int64_t LE2HI64(void const *) __attribute__((always_inline));
+#endif /* __GNUC__ */
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+static inline uint16_t LE2HUI16(void const *X) { uint16_t y; memmove(&y, X, sizeof(y)); return y; }
+static inline uint32_t LE2HUI32(void const *X) { uint32_t y; memmove(&y, X, sizeof(y)); return y; }
+static inline uint64_t LE2HUI64(void const *X) { uint64_t y; memmove(&y, X, sizeof(y)); return y; }
+static inline int16_t LE2HI16(void const *X) { int16_t y; memmove(&y, X, sizeof(y)); return y; }
+static inline int32_t LE2HI32(void const *X) { int32_t y; memmove(&y, X, sizeof(y)); return y; }
+static inline int64_t LE2HI64(void const *X) { int64_t y; memmove(&y, X, sizeof(y)); return y; }
+#endif
+#if __BYTE_ORDER == __BIG_ENDIAN
+static inline uint16_t LE2HUI16(void const *X) { uint16_t y; memmove(&y, X, sizeof(y)); return (uint16_t)bswap_16(y); }
+static inline uint32_t LE2HUI32(void const *X) { uint32_t y; memmove(&y, X, sizeof(y)); return (uint32_t)bswap_32(y); }
+static inline uint64_t LE2HUI64(void const *X) { uint64_t y; memmove(&y, X, sizeof(y)); return (uint64_t)bswap_64(y); }
+static inline int16_t LE2HI16(void const *X) { int16_t y; memmove(&y, X, sizeof(y)); return ( int16_t)bswap_16(y); }
+static inline int32_t LE2HI32(void const *X) { int32_t y; memmove(&y, X, sizeof(y)); return ( int32_t)bswap_32(y); }
+static inline int64_t LE2HI64(void const *X) { int64_t y; memmove(&y, X, sizeof(y)); return ( int64_t)bswap_64(y); }
+#endif
+
+static inline int getRefSeqId(BAM_Alignment const *const self) {
+ return LE2HI32(self->data->cooked.rID);
+}
+
+static inline int getPosition(BAM_Alignment const *const self) {
+ return LE2HI32(self->data->cooked.pos);
+}
+
+static inline int getReadNameLength(BAM_Alignment const *const self) {
+ return self->data->cooked.read_name_len;
+}
+
+static inline int getBin(BAM_Alignment const *const self) {
+ return LE2HUI16(self->data->cooked.bin);
+}
+
+static inline int getMapQual(BAM_Alignment const *const self) {
+ return self->data->cooked.mapQual;
+}
+
+static inline int getCigarCount(BAM_Alignment const *const self) {
+ return LE2HUI16(self->data->cooked.n_cigars);
+}
+
+static inline int getFlags(BAM_Alignment const *const self) {
+ return LE2HUI16(self->data->cooked.flags);
+}
+
+static inline unsigned getReadLen(BAM_Alignment const *const self) {
+ return LE2HUI32(self->data->cooked.read_len);
+}
+
+static inline int getMateRefSeqId(BAM_Alignment const *const self) {
+ return LE2HI32(self->data->cooked.mate_rID);
+}
+
+static inline int getMatePos(BAM_Alignment const *const self) {
+ return LE2HI32(self->data->cooked.mate_pos);
+}
+
+static inline int getInsertSize(BAM_Alignment const *const self) {
+ return LE2HI32(self->data->cooked.ins_size);
+}
+
+static inline char const *getReadName(BAM_Alignment const *const self) {
+ return &self->data->cooked.read_name[0];
+}
+
+static inline void const *getCigarBase(BAM_Alignment const *const self)
+{
+ return &self->data->raw[self->cigar];
+}
+
+static bool BAM_AlignmentShouldDefer(BAM_Alignment const *);
diff --git a/tools/bam-loader/bam-reader.c b/tools/bam-loader/bam-reader.c
new file mode 100644
index 0000000..ca397e9
--- /dev/null
+++ b/tools/bam-loader/bam-reader.c
@@ -0,0 +1,1104 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct BamReaderFile BamReaderFile;
+typedef struct BamRecord BamRecord;
+typedef struct BamSequence BamSequence;
+typedef struct BamAlignment BamAlignment;
+typedef struct BamCGData BamCGData;
+typedef struct BamReferenceInfo BamReferenceInfo;
+
+#define READERFILE_IMPL BamReaderFile
+#define RECORD_IMPL BamRecord
+#define SEQUENCE_IMPL BamSequence
+#define ALIGNMENT_IMPL BamAlignment
+#define CGDATA_IMPL BamCGData
+#define REFERENCEINFO_IMPL BamReferenceInfo
+
+#include "bam-reader.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <loader/common-reader-priv.h>
+
+struct BamSequence
+{
+ Sequence dadSeq;
+ Alignment dadAlign;
+ CGData dadCG;
+ KRefcount refcount;
+
+ const BAMAlignment* bam;
+ uint16_t flags;
+};
+
+struct BamRecord
+{
+ Record dad;
+
+ BamSequence seq;
+ Rejected* rej;
+};
+/*TODO: remove when done refactoring */
+const BAMAlignment *ToBamAlignment(const Record* record)
+{
+ assert(record);
+ return ((const BamRecord*)record)->seq.bam;
+}
+
+static rc_t BamSequenceInit(BamSequence* self);
+
+/*--------------------------------------------------------------------------
+ * BamRecord
+ */
+static rc_t BamRecordAddRef ( const BamRecord* self );
+static rc_t BamRecordRelease ( const BamRecord* self );
+static rc_t BamRecordGetSequence ( const BamRecord* self, const Sequence** result);
+static rc_t BamRecordGetAlignment ( const BamRecord* self, const Alignment** result);
+static rc_t BamRecordGetRejected ( const BamRecord* self, const Rejected** result);
+
+static Record_vt_v1 BamRecord_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ BamRecordAddRef,
+ BamRecordRelease,
+ BamRecordGetSequence,
+ BamRecordGetAlignment,
+ BamRecordGetRejected,
+ /* end minor version == 0 */
+};
+
+static rc_t CC BamRecordInit ( BamRecord* self )
+{
+ assert(self);
+ self->dad.vt.v1 = & BamRecord_vt;
+ self->rej = 0;
+ return BamSequenceInit(& self->seq);
+}
+
+static rc_t BamRecordWhack( const BamRecord* self )
+{
+ rc_t rc = 0;
+ assert(self);
+
+ rc = BAMAlignmentRelease(self->seq.bam);
+
+ if (rc != 0)
+ RejectedRelease(self->rej);
+ else
+ rc = RejectedRelease(self->rej);
+
+ free ( (BamRecord*) self );
+
+ return rc;
+}
+
+static rc_t BamRecordAddRef( const BamRecord* self )
+{
+ assert(self);
+ KRefcountAdd( & self->seq.refcount, "BamRecord" );
+ /* TODO: handle rc from KRefcountAdd */
+ return 0;
+}
+
+static rc_t BamRecordRelease( const BamRecord* cself )
+{
+ if ( cself != NULL )
+ {
+ BamRecord *self = ( BamRecord* ) cself;
+ switch ( KRefcountDrop ( & self ->seq.refcount, "BamRecord" ) )
+ {
+ case krefWhack:
+ BamRecordWhack( self );
+ break;
+ default:
+ /* TODO: handle other values */
+ break;
+ }
+ }
+ return 0;
+}
+
+static rc_t BamRecordGetSequence( const BamRecord* self, const Sequence** result )
+{
+ rc_t rc = 0;
+ assert(result);
+ rc = BamRecordAddRef(self);
+ if (rc == 0)
+ *result = (const Sequence*) & self->seq;
+ else
+ *result = 0;
+ return rc;
+}
+
+static rc_t BamRecordGetAlignment( const BamRecord* self, const Alignment** result)
+{
+ rc_t rc = 0;
+ assert(result);
+
+ /* do not allow access is flagged as unmapped*/
+ if ((self->seq.flags & BAMFlags_SelfIsUnmapped) != 0)
+ *result = 0;
+ else
+ {
+ rc = BamRecordAddRef(self);
+ if (rc == 0)
+ *result = (const Alignment*) & self->seq.dadAlign;
+ else
+ *result = 0;
+ }
+ return rc;
+}
+
+static rc_t BamRecordGetRejected( const BamRecord* self, const Rejected** result)
+{
+ rc_t rc = 0;
+ assert(result);
+ *result = 0;
+ if (self->rej != 0)
+ {
+ rc = RejectedAddRef(self->rej);
+ if (rc == 0)
+ *result = self->rej;
+ }
+ return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * BamSequence forwards
+ */
+static rc_t BamSequenceAddRef ( const BamSequence* self );
+static rc_t BamSequenceRelease ( const BamSequence* self );
+static rc_t BamSequenceGetReadLength ( const BamSequence *self, uint32_t *length );
+static rc_t BamSequenceGetRead ( const BamSequence *self, char *sequence );
+static rc_t BamSequenceGetRead2 ( const BamSequence *self, char *sequence, uint32_t start, uint32_t stop );
+static rc_t BamSequenceGetQuality ( const BamSequence *self, const int8_t **quality, uint8_t *offset, int *qualType );
+static rc_t BamSequenceGetSpotGroup ( const BamSequence *self, const char **name, size_t *length );
+static rc_t BamSequenceGetSpotName ( const BamSequence *self, const char **name, size_t *length );
+static bool BamSequenceIsColorSpace ( const BamSequence *self );
+static rc_t BamSequenceGetCSKey ( const BamSequence *self, char cskey[1] );
+static rc_t BamSequenceGetCSReadLength ( const BamSequence *self, uint32_t *length );
+static rc_t BamSequenceGetCSRead ( const BamSequence *self, char *sequence );
+static rc_t BamSequenceGetCSQuality ( const BamSequence *self, const int8_t **quality, uint8_t *offset, int *qualType );
+static bool BamSequenceRecordWasPaired ( const BamSequence *self );
+static int BamSequenceRecordOrientationSelf ( const BamSequence *self );
+static int BamSequenceRecordOrientationMate ( const BamSequence *self );
+static bool BamSequenceRecordIsFirst ( const BamSequence *self );
+static bool BamSequenceRecordIsSecond ( const BamSequence *self );
+static bool BamSequenceRecordIsDuplicate ( const BamSequence *self );
+static bool BamSequenceIsLowQuality ( const BamSequence *self );
+static rc_t BamSequenceGetTI ( const BamSequence *self, uint64_t *ti );
+
+/*--------------------------------------------------------------------------
+ * BamCGData
+ */
+
+static rc_t BamCGDataAddRef ( const BamCGData* self );
+static rc_t BamCGDataRelease ( const BamCGData* self );
+static rc_t BamCGDataGetSeqQual ( const BamCGData* self, char sequence[/* 35 */], uint8_t quality[/* 35 */] );
+static rc_t BamCGDataGetCigar ( const BamCGData* self, uint32_t *cigar, uint32_t cig_max, uint32_t *cig_act );
+static rc_t BamCGDataGetAlignGroup ( const BamCGData* self, char buffer[], size_t max_size, size_t *act_size );
+
+/* CGGetAlignGroup
+ */
+rc_t CC CGDataGetAlignGroup ( const CGData* self,
+ char buffer[],
+ size_t max_size,
+ size_t *act_size );
+
+static CGData_vt_v1 BamCGData_vt = {
+ 1, 0,
+ /* start minor version == 0 */
+ BamCGDataAddRef,
+ BamCGDataRelease,
+
+ BamCGDataGetSeqQual,
+ BamCGDataGetCigar,
+ BamCGDataGetAlignGroup
+ /* end minor version == 0 */
+};
+
+static const BamSequence*
+BamCGDataToSequence(const BamCGData* cg)
+{
+ return ( const BamSequence * ) ( (uint8_t*)cg- offsetof ( BamSequence, dadCG) );
+}
+
+static rc_t BamCGDataAddRef ( const BamCGData* self )
+{
+ return BamSequenceAddRef(BamCGDataToSequence(self));
+}
+
+static rc_t BamCGDataRelease ( const BamCGData* self )
+{
+ return BamSequenceRelease(BamCGDataToSequence(self));
+}
+
+static rc_t BamCGDataGetSeqQual ( const BamCGData* self, char sequence[/* 35 */], uint8_t quality[/* 35 */] )
+{
+ return BAMAlignmentGetCGSeqQual(BamCGDataToSequence(self)->bam, sequence, quality);
+}
+
+static rc_t BamCGDataGetCigar ( const BamCGData* self, uint32_t *cigar, uint32_t cig_max, uint32_t *cig_act )
+{
+ return BAMAlignmentGetCGCigar(BamCGDataToSequence(self)->bam, cigar, cig_max, cig_act);
+}
+
+static rc_t BamCGDataGetAlignGroup ( const BamCGData* self, char buffer[], size_t max_size, size_t *act_size )
+{
+ return BAMAlignmentGetCGAlignGroup(BamCGDataToSequence(self)->bam, buffer, max_size, act_size);
+}
+
+/*--------------------------------------------------------------------------
+ * BamAlignment
+ */
+
+static rc_t BamAlignmentAddRef ( const BamAlignment* self );
+static rc_t BamAlignmentRelease ( const BamAlignment* self );
+
+static rc_t BamAlignmentGetRefSeqId ( const BamAlignment *self, int32_t *refSeqId );
+static rc_t BamAlignmentGetMateRefSeqId ( const BamAlignment *self, int32_t *refSeqId );
+static rc_t BamAlignmentGetPosition ( const BamAlignment *self, int64_t *pos );
+static rc_t BamAlignmentGetMatePosition ( const BamAlignment *self, int64_t *pos );
+static rc_t BamAlignmentGetMapQuality ( const BamAlignment *self, uint8_t *qual );
+static rc_t BamAlignmentGetAlignmentDetail ( const BamAlignment *self, AlignmentDetail *rslt, uint32_t count, uint32_t *actual, int32_t *firstMatch, int32_t *lastMatch );
+static rc_t BamAlignmentGetAlignOpCount ( const BamAlignment *self, uint32_t *n );
+static rc_t BamAlignmentGetInsertSize ( const BamAlignment *self, int64_t *size );
+static rc_t BamAlignmentGetCGData ( const BamAlignment *self, const CGData** cg);
+static rc_t BamAlignmentGetBAMCigar ( const BamAlignment *self, uint32_t const **rslt, uint32_t *length );
+static bool BamAlignmentIsSecondary ( const BamAlignment *self );
+
+static Alignment_vt_v1 BamAlignment_vt = {
+ 1, 0,
+ /* start minor version == 0 */
+ BamAlignmentAddRef,
+ BamAlignmentRelease,
+ BamAlignmentGetRefSeqId,
+ BamAlignmentGetMateRefSeqId,
+ BamAlignmentGetPosition,
+ BamAlignmentGetMatePosition,
+ BamAlignmentGetMapQuality,
+ BamAlignmentGetAlignmentDetail,
+ BamAlignmentGetAlignOpCount,
+ BamAlignmentGetInsertSize,
+ BamAlignmentGetCGData,
+ BamAlignmentGetBAMCigar,
+ BamAlignmentIsSecondary,
+ /* end minor version == 0 */
+};
+
+static const BamSequence*
+BamAlignmentToSequence(const BamAlignment* align)
+{
+ return ( const BamSequence * ) ( (uint8_t*)align - offsetof ( BamSequence, dadAlign ) );
+}
+
+static rc_t BamAlignmentAddRef ( const BamAlignment* self )
+{
+ return BamSequenceAddRef(BamAlignmentToSequence(self));
+}
+
+static rc_t BamAlignmentRelease ( const BamAlignment* self )
+{
+ return BamSequenceRelease(BamAlignmentToSequence(self));
+}
+
+static rc_t BamAlignmentGetRefSeqId ( const BamAlignment *self, int32_t *refSeqId )
+{
+ return BAMAlignmentGetRefSeqId(BamAlignmentToSequence(self)->bam, refSeqId);
+}
+
+static rc_t BamAlignmentGetMateRefSeqId ( const BamAlignment *self, int32_t *refSeqId )
+{
+ return BAMAlignmentGetMateRefSeqId(BamAlignmentToSequence(self)->bam, refSeqId);
+}
+
+static rc_t BamAlignmentGetPosition ( const BamAlignment *self, int64_t *pos )
+{
+ return BAMAlignmentGetPosition(BamAlignmentToSequence(self)->bam, pos);
+}
+
+static rc_t BamAlignmentGetMatePosition ( const BamAlignment *self, int64_t *pos )
+{
+ return BAMAlignmentGetMatePosition(BamAlignmentToSequence(self)->bam, pos);
+}
+
+static rc_t BamAlignmentGetMapQuality ( const BamAlignment *self, uint8_t *qual )
+{
+ return BAMAlignmentGetMapQuality(BamAlignmentToSequence(self)->bam, qual);
+}
+
+static rc_t BamAlignmentGetAlignmentDetail ( const BamAlignment *self, AlignmentDetail *rslt, uint32_t count, uint32_t *actual, int32_t *firstMatch, int32_t *lastMatch )
+{
+ return BAMAlignmentGetAlignmentDetail ( BamAlignmentToSequence(self)->bam, (BAMAlignmentDetail*)rslt, count, actual, firstMatch, lastMatch );
+}
+
+static rc_t BamAlignmentGetAlignOpCount ( const BamAlignment *self, uint32_t *n )
+{
+ return BAMAlignmentGetCigarCount ( BamAlignmentToSequence(self)->bam, n );
+}
+
+static rc_t BamAlignmentGetInsertSize ( const BamAlignment *self, int64_t *size )
+{
+ return BAMAlignmentGetInsertSize ( BamAlignmentToSequence(self)->bam, size );
+}
+
+static rc_t BamAlignmentGetCGData ( const BamAlignment *self, const CGData** cg)
+{
+ rc_t rc = 0;
+ if (BAMAlignmentHasCGData(BamAlignmentToSequence(self)->bam))
+ {
+ rc_t rc = BamAlignmentAddRef(self);
+ if (rc == 0)
+ *cg = (const CGData*) & BamAlignmentToSequence(self)->dadCG;
+ else
+ *cg = 0;
+ }
+ else
+ *cg = 0;
+ return rc;
+}
+
+static rc_t BamAlignmentGetBAMCigar ( const BamAlignment *self, uint32_t const **rslt, uint32_t *length )
+{
+ return BAMAlignmentGetRawCigar(BamAlignmentToSequence(self)->bam, rslt, length);
+}
+
+static bool BamAlignmentIsSecondary( const BamAlignment *self )
+{
+ return (BamAlignmentToSequence(self)->flags & BAMFlags_IsNotPrimary) != 0;
+}
+
+/*--------------------------------------------------------------------------
+ * BamSequence
+ */
+
+static Sequence_vt_v1 BamSequence_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ BamSequenceAddRef,
+ BamSequenceRelease,
+ BamSequenceGetReadLength,
+ BamSequenceGetRead,
+ BamSequenceGetRead2,
+ BamSequenceGetQuality,
+ BamSequenceGetSpotGroup,
+ BamSequenceGetSpotName,
+ BamSequenceIsColorSpace,
+ BamSequenceGetCSKey,
+ BamSequenceGetCSReadLength,
+ BamSequenceGetCSRead,
+ BamSequenceGetCSQuality,
+ BamSequenceRecordWasPaired,
+ BamSequenceRecordOrientationSelf,
+ BamSequenceRecordOrientationMate,
+ BamSequenceRecordIsFirst,
+ BamSequenceRecordIsSecond,
+ BamSequenceRecordIsDuplicate,
+ BamSequenceIsLowQuality,
+ BamSequenceGetTI,
+ /* end minor version == 0 */
+};
+
+static
+rc_t
+BamSequenceInit(BamSequence* self)
+{
+ self->dadSeq.vt.v1 = & BamSequence_vt;
+ self->dadAlign.vt.v1 = & BamAlignment_vt;
+ self->dadCG.vt.v1 = & BamCGData_vt;
+ KRefcountInit ( & self -> refcount, 1, "BamSequence", "BamSequenceInit", "");
+ self->bam= 0;
+ self->flags = 0;
+
+ return 0;
+}
+
+static const BamRecord*
+BamSequenceToRecord(const BamSequence* seq)
+{
+ return ( const BamRecord * ) ( (uint8_t*)seq - offsetof ( BamRecord, seq ) );
+}
+
+static rc_t BamSequenceAddRef( const BamSequence* self )
+{
+ switch (KRefcountAdd( & self->refcount, "BamSequence" ))
+ {
+ case krefLimit:
+ return RC ( RC_MODULE, rcData, rcAttaching, rcRange, rcExcessive );
+ case krefNegative:
+ return RC ( RC_MODULE, rcData, rcAttaching, rcRefcount, rcInvalid );
+ }
+ return 0;
+}
+
+static rc_t BamSequenceRelease( const BamSequence* self )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "BamSequence" ) )
+ {
+ case krefWhack:
+ return BamRecordWhack ( BamSequenceToRecord(self) );
+
+ case krefNegative:
+ return RC ( RC_MODULE, rcData, rcDestroying, rcSelf, rcDestroyed );
+ }
+ }
+
+ return 0;
+
+}
+
+static rc_t BamSequenceGetReadLength ( const BamSequence *self, uint32_t *length )
+{
+ assert(self);
+ assert(self->bam);
+ return BAMAlignmentGetReadLength(self->bam, length);
+}
+
+static rc_t BamSequenceGetRead ( const BamSequence *self, char *sequence )
+{
+ assert(self);
+ assert(self->bam);
+ assert(sequence);
+ return BAMAlignmentGetSequence(self->bam, sequence);
+}
+
+static rc_t BamSequenceGetRead2 ( const BamSequence *self, char *sequence, uint32_t start, uint32_t stop )
+{
+ assert(self);
+ assert(self->bam);
+ assert(sequence);
+ return BAMAlignmentGetSequence2(self->bam, sequence, start, stop);
+}
+
+static rc_t BamSequenceGetQuality ( const BamSequence *self, const int8_t **quality, uint8_t *offset, int *qualType )
+{
+ assert(self);
+ assert(self->bam);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ {
+ rc_t rc = BAMAlignmentGetQuality2(self->bam, (const uint8_t **)quality, offset);
+ if (rc != 0)
+ {
+ *quality = NULL;
+ *offset = 0;
+ *qualType = 0;
+ }
+ else
+ *qualType = QT_Phred;
+ return rc;
+ }
+}
+
+static rc_t BamSequenceGetSpotGroup ( const BamSequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(self->bam);
+ assert(name);
+ {
+ rc_t rc = BAMAlignmentGetReadGroupName ( self->bam, name );
+ if (rc != 0)
+ {
+ *name = NULL;
+ *length = 0;
+ }
+ else
+ *length = string_size(*name);
+ return rc;
+ }
+}
+
+static rc_t BamSequenceGetSpotName ( const BamSequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(self->bam);
+ assert(name);
+ {
+ rc_t rc = BAMAlignmentGetReadName ( self->bam, name );
+ if (rc != 0)
+ {
+ *name = NULL;
+ *length = 0;
+ }
+ else
+ *length = string_size(*name);
+ return rc;
+ }
+}
+
+static bool BamSequenceIsColorSpace ( const BamSequence *self )
+{
+ assert(self);
+ assert(self->bam);
+ return BAMAlignmentHasColorSpace(self->bam);
+}
+
+static rc_t BamSequenceGetCSKey ( const BamSequence *self, char cskey[1] )
+{
+ assert(self);
+ assert(self->bam);
+ return BAMAlignmentGetCSKey(self->bam, cskey);
+}
+
+static rc_t BamSequenceGetCSReadLength ( const BamSequence *self, uint32_t *length )
+{
+ assert(self);
+ assert(self->bam);
+ assert(length);
+ return BAMAlignmentGetCSSeqLen(self->bam, length);
+}
+
+static rc_t BamSequenceGetCSRead ( const BamSequence *self, char *sequence )
+{
+ assert(self);
+ assert(self->bam);
+ assert(sequence);
+ {
+ uint32_t length;
+ rc_t rc = BAMAlignmentGetCSSeqLen(self->bam, &length);
+ return rc ? rc : BAMAlignmentGetCSSequence(self->bam, sequence, length);
+ }
+}
+
+static rc_t BamSequenceGetCSQuality ( const BamSequence *self, const int8_t **quality, uint8_t *offset, int *qualType )
+{
+ assert(self);
+ assert(self->bam);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ {
+ rc_t rc = BAMAlignmentGetCSQuality(self->bam, (const uint8_t **)quality, offset);
+ if (rc != 0)
+ {
+ *quality = NULL;
+ *offset = 0;
+ *qualType = 0;
+ }
+ else
+ *qualType = QT_Phred;
+ return rc;
+ }
+}
+
+static bool BamSequenceRecordWasPaired ( const BamSequence *self )
+{
+ return self->flags & BAMFlags_WasPaired;
+}
+
+static int BamSequenceRecordOrientationSelf ( const BamSequence *self )
+{
+ return (self->flags & BAMFlags_SelfIsReverse) ? ReadOrientationReverse : ReadOrientationForward;
+}
+
+static int BamSequenceRecordOrientationMate ( const BamSequence *self )
+{
+ return (self->flags & BAMFlags_MateIsReverse) ? ReadOrientationReverse : ReadOrientationForward;;
+}
+
+static bool BamSequenceRecordIsFirst ( const BamSequence *self )
+{
+ return self->flags & BAMFlags_IsFirst;
+}
+
+static bool BamSequenceRecordIsSecond ( const BamSequence *self )
+{
+ return self->flags & BAMFlags_IsSecond;
+}
+
+static bool BamSequenceRecordIsDuplicate ( const BamSequence *self )
+{
+ return self->flags & BAMFlags_IsDuplicate;
+}
+
+static bool BamSequenceIsLowQuality ( const BamSequence *self )
+{
+ return self->flags & BAMFlags_IsLowQuality;
+}
+
+static rc_t BamSequenceGetTI ( const BamSequence *self, uint64_t *ti )
+{
+ return BAMAlignmentGetTI(self->bam, ti);
+}
+
+ /*--------------------------------------------------------------------------
+ * BamReferenceInfo forwards
+ */
+static rc_t BamReferenceAddRef ( const BamReferenceInfo* self );
+static rc_t BamReferenceRelease ( const BamReferenceInfo* self );
+static rc_t BamReferenceInfoGetRefSeqCount ( const BamReferenceInfo* self, uint32_t* count );
+static rc_t BamReferenceInfoGetRefSeq ( const BamReferenceInfo* self, uint32_t n, ReferenceSequence* result );
+static rc_t BamReferenceInfoGetReadGroupCount ( const BamReferenceInfo* self, uint32_t* count );
+static rc_t BamReferenceInfoGetReadGroup ( const BamReferenceInfo* self, unsigned n, ReadGroup* result );
+static rc_t BamReferenceInfoGetReadGroupByName ( const BamReferenceInfo* self, const char* name, ReadGroup* result );
+
+static ReferenceInfo_vt_v1 BamReferenceInfo_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ BamReferenceAddRef,
+ BamReferenceRelease,
+ BamReferenceInfoGetRefSeqCount,
+ BamReferenceInfoGetRefSeq,
+ BamReferenceInfoGetReadGroupCount,
+ BamReferenceInfoGetReadGroup,
+ BamReferenceInfoGetReadGroupByName,
+ /* end minor version == 0 */
+};
+
+/*--------------------------------------------------------------------------
+ * BamReaderFile
+ */
+static rc_t BamReaderFileWhack ( BamReaderFile* self );
+static rc_t BamReaderFileGetRecord ( const BamReaderFile *self, const Record** result );
+static float BamReaderFileGetProportionalPosition ( const BamReaderFile *self );
+static rc_t BamReaderFileGetReferenceInfo ( const BamReaderFile *self, const ReferenceInfo** result );
+
+static ReaderFile_vt_v1 BamReaderFile_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ BamReaderFileWhack,
+ BamReaderFileGetRecord,
+ BamReaderFileGetProportionalPosition,
+ BamReaderFileGetReferenceInfo,
+ /* end minor version == 0 */
+};
+
+struct BamReaderFile
+{
+ ReaderFile dad;
+ ReferenceInfo refInfo;
+
+ const BAMFile* reader;
+};
+
+const BAMFile* ToBam(const ReaderFile* reader)
+{
+ assert(reader);
+ return ((const BamReaderFile*)reader)->reader;
+}
+
+float BamReaderFileGetProportionalPosition ( const BamReaderFile *f )
+{
+ BamReaderFile* self = (BamReaderFile*) f;
+ return BAMFileGetProportionalPosition(self->reader);
+}
+
+rc_t BamReaderFileGetReferenceInfo ( const BamReaderFile *self, const ReferenceInfo** result )
+{
+ *result = & self->refInfo;
+ return ReaderFileAddRef( & self->dad );
+}
+
+rc_t BamReaderFileWhack( BamReaderFile* f )
+{
+ BamReaderFile* self = (BamReaderFile*) f;
+
+ BAMFileRelease(self->reader);
+
+ free ( (void*)self->dad.pathname );
+ free ( self );
+
+ return 0;
+}
+
+rc_t BamReaderFileGetRecord ( const BamReaderFile *f, const Record** result )
+{
+ rc_t rc;
+ BamReaderFile* self = (BamReaderFile*) f;
+
+ BamRecord* record = (BamRecord*)malloc(sizeof(BamRecord));
+ if (record == NULL)
+ {
+ rc = RC ( RC_MODULE, rcData, rcAllocating, rcMemory, rcExhausted );
+ return 0;
+ }
+ rc = BamRecordInit(record);
+ if (rc != 0)
+ {
+ free(record);
+ return rc;
+ }
+
+ rc = BAMFileRead2(self->reader, &record->seq.bam);
+ if (rc)
+ {
+ if (GetRCModule(rc) == rcAlign && GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
+ { /* end of input */
+ rc = 0;
+ }
+ *result = 0;
+ BamRecordRelease(record);
+ }
+ else
+ {
+ *result = (const Record*)record;
+ BAMAlignmentGetFlags(record->seq.bam, &record->seq.flags);
+ }
+
+ return rc;
+}
+
+rc_t CC BamReaderFileMake( const ReaderFile **reader, char const headerText[], char const path[])
+{
+ rc_t rc;
+ BamReaderFile* self = (BamReaderFile*) malloc ( sizeof * self );
+ if ( self == NULL )
+ {
+ rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted );
+ *reader = 0;
+ }
+ else
+ {
+ rc = ReaderFileInit ( self );
+ self->dad.vt.v1 = & BamReaderFile_vt;
+ self->refInfo.vt.v1 = & BamReferenceInfo_vt;
+
+ self->dad.pathname = string_dup(path, strlen(path)+1);
+ if ( self->dad.pathname == NULL )
+ {
+ rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted );
+ }
+
+ rc = BAMFileMakeWithHeader ( &self->reader, headerText, "%s", self->dad.pathname );
+
+ if (rc != 0)
+ {
+ BamReaderFileWhack( self );
+ *reader = 0;
+ }
+ else
+ {
+ *reader = (const ReaderFile *) self;
+ }
+ }
+
+ return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * BamReferenceInfo
+ */
+static const BamReaderFile*
+BamRefInfoToReader(const BamReferenceInfo* ref)
+{
+ return ( const BamReaderFile * ) ( (uint8_t*)ref - offsetof ( BamReaderFile, refInfo ) );
+}
+
+rc_t BamReferenceAddRef ( const BamReferenceInfo* self )
+{
+ return ReaderFileAddRef( & BamRefInfoToReader(self)->dad );
+}
+
+rc_t BamReferenceRelease ( const BamReferenceInfo* self )
+{
+ return ReaderFileRelease ( & BamRefInfoToReader(self)->dad );
+}
+
+rc_t BamReferenceInfoGetRefSeqCount ( const BamReferenceInfo* self, uint32_t* count )
+{
+ return BAMFileGetRefSeqCount( BamRefInfoToReader(self)->reader, count );
+}
+
+rc_t BamReferenceInfoGetRefSeq ( const BamReferenceInfo *self, uint32_t n, ReferenceSequence *result )
+{
+ const BAMRefSeq *refSeq;
+ rc_t rc = BAMFileGetRefSeq( BamRefInfoToReader(self)->reader, n, &refSeq );
+ if (rc != 0 || refSeq == NULL)
+ {
+ return RC ( RC_MODULE, rcHeader, rcAccessing, rcParam, rcOutofrange );
+ }
+
+ result->length = refSeq->length;
+ result->name = refSeq->name;
+ result->checksum = refSeq->checksum;
+
+ return 0;
+}
+
+rc_t BamReferenceInfoGetReadGroupCount ( const BamReferenceInfo *self, uint32_t *count )
+{
+ return BAMFileGetReadGroupCount ( BamRefInfoToReader(self)->reader, count );
+}
+
+rc_t BamReferenceInfoGetReadGroup ( const BamReferenceInfo *self, unsigned n, ReadGroup* result )
+{
+ const BAMReadGroup *rg;
+ rc_t rc = BAMFileGetReadGroup( BamRefInfoToReader(self)->reader, n, &rg );
+ if (rc != 0 || rg == NULL)
+ {
+ return RC ( RC_MODULE, rcHeader, rcAccessing, rcParam, rcOutofrange );
+ }
+
+ result->name = rg->name;
+ result->platform = rg->platform;
+
+ return 0;
+}
+
+rc_t BamReferenceInfoGetReadGroupByName ( const BamReferenceInfo *self, const char *name, ReadGroup *result )
+{
+ const BAMReadGroup *rg;
+ rc_t rc = BAMFileGetReadGroupByName( BamRefInfoToReader(self)->reader, name, &rg );
+ if (rc != 0 || rg == NULL)
+ {
+ return RC ( RC_MODULE, rcHeader, rcAccessing, rcParam, rcOutofrange );
+ }
+
+ result->name = rg->name;
+ result->platform = rg->platform;
+
+ return 0;
+}
+
+
+
+
+
+
+#ifdef TENTATIVE
+/**************************** future parsing-on-a-thread code *****************************************/
+
+#include "bam-reader.h"
+
+#include <atomic32.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <klib/rc.h>
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+#include <kproc/thread.h>
+
+#define BUFFER_COUNT (3)
+
+struct BAMReader
+{
+ atomic32_t refcount;
+ const BAMFile* file;
+
+ KLock *lock;
+ KCondition *have_data;
+ KCondition *need_data;
+ KThread *th;
+
+ const BAMAlignment* que[BUFFER_COUNT];
+ unsigned volatile nque;
+ rc_t volatile rc;
+
+ bool eof;
+};
+
+static rc_t BAMReaderThreadMain(KThread const *const th, void *const vp);
+
+#define END_OF_DATA RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound)
+
+rc_t BAMReaderMake( const BAMReader **result,
+ char const headerText[],
+ char const path[] )
+{
+ rc_t rc;
+ BAMReader *self = malloc(sizeof(BAMReader));
+ if ( self == NULL )
+ {
+ *result = NULL;
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ else
+ {
+ atomic32_set( & self->refcount, 1 );
+ rc = BAMFileMakeWithHeader( & self->file, headerText, "%s", path);
+ if ( rc != 0 )
+ {
+ free(self);
+ *result = 0;
+ }
+ else
+ *result = self;
+ }
+
+ self->nque = 0;
+ self->rc = 0;
+ self->eof = false;
+
+ rc = KLockMake(&self->lock);
+ if (rc == 0)
+ {
+ rc = KConditionMake(&self->have_data);
+ if (rc == 0)
+ {
+ rc = KConditionMake(&self->need_data);
+ if (rc == 0)
+ {
+ rc = KThreadMake(&self->th, BAMReaderThreadMain, self);
+ if (rc == 0)
+ return 0;
+ KConditionRelease(self->need_data);
+ }
+ KConditionRelease(self->have_data);
+ }
+ KLockRelease(self->lock);
+ }
+
+ return rc;
+}
+
+static void BAMReaderWhack(BAMReader *const self)
+{
+ KThreadCancel(self->th);
+ KThreadWait(self->th, NULL);
+ BAMFileRelease(self->file);
+ KConditionRelease(self->need_data);
+ KConditionRelease(self->have_data);
+ KLockRelease(self->lock);
+ KThreadRelease(self->th);
+}
+
+
+/* AddRef
+ * Release
+ */
+rc_t BAMReaderAddRef ( const BAMReader *self )
+{
+ if (self != NULL)
+ atomic32_inc(&((BAMReader *)self)->refcount);
+ return 0;
+}
+
+rc_t BAMReaderRelease ( const BAMReader *cself )
+{
+ BAMReader *self = (BAMReader *)cself;
+
+ if (cself != NULL)
+ {
+ if (atomic32_dec_and_test(&self->refcount))
+ {
+ BAMReaderWhack(self);
+ free(self);
+ }
+ }
+ return 0;
+}
+
+/* GetBAMFile
+ */
+const BAMFile* BAMReaderGetBAMFile ( const BAMReader *self )
+{
+ if (self == NULL)
+ return NULL;
+ return self->file;
+}
+
+static rc_t BAMReaderThreadMain(KThread const *const th, void *const vp)
+{
+ BAMReader *const self = (BAMReader *)vp;
+ rc_t rc = 0;
+ const BAMAlignment* rec;
+
+ KLockAcquire(self->lock);
+ do
+ {
+ while (self->nque == BUFFER_COUNT)
+ KConditionWait(self->need_data, self->lock);
+
+ {
+ rc = BAMFileRead( self->file, &rec);
+ if (rc == END_OF_DATA)
+ {
+ rec = NULL;
+ rc = 0;
+ }
+ else if (rc)
+ break;
+
+ self->que[self->nque] = rec;
+ ++self->nque;
+ KConditionSignal(self->have_data);
+ }
+ }
+ while (rec);
+ self->rc = rc;
+ KLockUnlock(self->lock);
+ return 0;
+}
+
+/* Read
+ * read an aligment
+ *
+ * "result" [ OUT ] - return param for BAMAlignment object
+ * must be released with BAMAlignmentRelease
+ *
+ * returns RC(..., ..., ..., rcRow, rcNotFound) at end
+ */
+rc_t BAMReaderRead ( const BAMReader *cself, const BAMAlignment **result )
+{
+ rc_t rc;
+ BAMReader *self = (BAMReader *)cself;
+
+ if (self == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+ if (self->eof)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+
+ KLockAcquire(self->lock);
+ if ((rc = self->rc) == 0)
+ {
+ while (self->nque == 0 && (rc = self->rc) == 0)
+ KConditionWait(self->have_data, self->lock);
+ if (rc == 0)
+ {
+ *result = self->que[0];
+
+ if (*result)
+ {
+ --self->nque;
+ memmove(&self->que[0], &self->que[1], self->nque * sizeof(self->que[0]));
+ KConditionSignal(self->need_data);
+ }
+ else
+ {
+ self->eof = true;
+ rc = END_OF_DATA;
+ }
+ }
+ }
+ KLockUnlock(self->lock);
+
+ return rc;
+}
+
+#endif
+
+
diff --git a/tools/bam-loader/bam-reader.h b/tools/bam-loader/bam-reader.h
new file mode 100644
index 0000000..5247563
--- /dev/null
+++ b/tools/bam-loader/bam-reader.h
@@ -0,0 +1,98 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_bam_reader_
+#define _h_bam_reader_
+
+#include <klib/rc.h>
+#include <kfs/directory.h>
+
+#include <align/extern.h>
+#include <align/bam.h>
+
+#include <loader/common-reader-priv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t CC BamReaderFileMake( const ReaderFile **self, char const headerText[], char const path[] );
+
+/* temporary crutches for refactoring: */
+const BAMFile* ToBam(const ReaderFile *self);
+const BAMAlignment *ToBamAlignment(const Record* record);
+
+#if 0
+#ifdef TENTATIVE
+/*--------------------------------------------------------------------------
+ * BAMReader, a parsing thread adapter for BAMFile.
+ * Creates a thread that does reading and parsing of BAM files, provides access to parsed data one record at a time.
+ */
+typedef struct BAMReader BAMReader;
+
+rc_t BAMReaderMake( const BAMReader **result,
+ char const headerText[],
+ char const path[] );
+
+/* AddRef
+ * Release
+ */
+rc_t BAMReaderAddRef ( const BAMReader *self );
+rc_t AMReaderRelease ( const BAMReader *self );
+
+/* GetBAMFile
+ */
+const BAMFile* BAMReaderGetBAMFile ( const BAMReader *self );
+
+/* Read
+ * read an aligment
+ *
+ * "result" [ OUT ] - return param for BAMAlignment object
+ * must be released with BAMAlignmentRelease
+ *
+ * returns RC(..., ..., ..., rcRow, rcNotFound) at end
+ */
+rc_t BAMReaderRead ( const BAMReader *self, const BAMAlignment **result );
+
+#else /*TENTATIVE*/
+
+/* use BAMFile directly, as in the earlier version */
+typedef struct BAMFile BAMReader;
+
+#define BAMReaderMake BAMFileMakeWithHeader
+#define BAMReaderAddRef BAMFileAddRef
+#define BAMReaderRelease BAMFileRelease
+#define BAMReaderGetBAMFile(p) (p)
+#define BAMReaderRead BAMFileRead
+
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_bam_reader_ */
diff --git a/tools/bam-loader/bam.c b/tools/bam-loader/bam.c
new file mode 100644
index 0000000..559a0ff
--- /dev/null
+++ b/tools/bam-loader/bam.c
@@ -0,0 +1,4113 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/defs.h>
+#include <klib/debug.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/mmap.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/refcount.h>
+#include <sysalloc.h>
+
+#include <atomic32.h>
+#include <strtol.h>
+
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <kfs/kfs-priv.h>
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <assert.h>
+#if 1
+/*_DEBUGGING*/
+#include <stdio.h>
+#include <os-native.h>
+#endif
+
+#include <endian.h>
+#include <byteswap.h>
+
+#include <zlib.h>
+
+#include "bam-priv.h"
+
+static rc_t BufferedFileRead(BufferedFile *const self)
+{
+ uint64_t const fpos = self->fpos + self->bmax;
+ rc_t const rc = KFileRead(self->kf, fpos, self->buf, self->size, &self->bmax);
+ if (rc) {
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Error %R read %u bytes from SAM/BAM file at position %lu\n", rc, self->bmax, fpos));
+ return rc;
+ }
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Read %u bytes from SAM/BAM file at position %lu\n", self->bmax, fpos));
+ self->fpos = fpos;
+ self->bpos = 0;
+ return 0;
+}
+
+static rc_t BufferedFileInit(BufferedFile *const self, KFile const *const kf)
+{
+ rc_t const rc = KFileSize(kf, &self->fmax);
+ if (rc || self->fmax == 0) {
+ self->fmax = 0;
+ self->size = PIPE_BUFFER_SIZE;
+ }
+ else
+ self->size = self->fmax < RGLR_BUFFER_SIZE ? self->fmax : RGLR_BUFFER_SIZE;
+
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("File size is %lu; Read buffer is %lu\n", self->fmax, self->size));
+ self->buf = malloc(self->size);
+ self->fpos = 0;
+ self->bpos = 0;
+ self->bmax = 0;
+ self->kf = kf;
+ KFileAddRef(kf);
+
+ return self->buf != NULL ? 0 : RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+}
+
+static void BufferedFileWhack(BufferedFile *const self)
+{
+ KFileRelease(self->kf);
+ free(self->buf);
+}
+
+static uint64_t BufferedFileGetPos(BufferedFile const *const self)
+{
+ return self->fpos + self->bpos;
+}
+
+static float BufferedFileProPos(BufferedFile const *const self)
+{
+ return self->fmax == 0 ? -1.0 : (BufferedFileGetPos(self) / (double)self->fmax);
+}
+
+static rc_t BufferedFileSetPos(BufferedFile *const self, uint64_t const pos)
+{
+ if (pos >= self->fpos && pos < self->fpos + self->bmax) {
+ self->bpos = (size_t)(pos - self->fpos);
+ }
+ else if (pos < self->fmax) {
+ self->fpos = pos;
+ self->bpos = 0;
+ self->bmax = 0;
+ }
+ else
+ return RC(rcAlign, rcFile, rcPositioning, rcParam, rcInvalid);
+ return 0;
+}
+
+static uint64_t BufferedFileGetSize(BufferedFile const *const self)
+{
+ return self->fmax;
+}
+
+static int SAMFileRead1(SAMFile *const self)
+{
+ if (self->putback < 0) {
+ if (self->file.bpos == self->file.bmax) {
+ rc_t const rc = BufferedFileRead(&self->file);
+
+ self->last = rc;
+ if (rc || self->file.bmax == 0) return -1;
+ }
+ return ((char const *)self->file.buf)[self->file.bpos++];
+ }
+ else {
+ int const x = self->putback;
+ self->putback = -1;
+ return x;
+ }
+}
+
+static rc_t SAMFileLastError(SAMFile const *const self)
+{
+ return self->last ? self->last : SILENT_RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+}
+
+static void SAMFilePutBack(SAMFile *const self, int ch)
+{
+ if (self->file.bpos > 0)
+ --self->file.bpos;
+ else
+ self->putback = ch;
+}
+
+static rc_t SAMFileInit(SAMFile *self, RawFile_vt *vt)
+{
+ static RawFile_vt const my_vt = {
+ (rc_t (*)(void *, zlib_block_t, unsigned *))NULL,
+ (uint64_t (*)(void const *))BufferedFileGetPos,
+ (float (*)(void const *))BufferedFileProPos,
+ (uint64_t (*)(void const *))BufferedFileGetSize,
+ (rc_t (*)(void *, uint64_t))BufferedFileSetPos,
+ (void (*)(void *))NULL
+ };
+
+ self->putback = -1;
+ self->last = 0;
+ *vt = my_vt;
+
+ return 0;
+}
+
+/* MARK: BGZFile *** Start *** */
+
+#define VALIDATE_BGZF_HEADER 1
+#if (ZLIB_VERNUM < 0x1230)
+#undef VALIDATE_BGZF_HEADER
+#warning "zlib too old, inflateGetHeader not available, not validating BGZF headers"
+#else
+#endif
+
+static rc_t BGZFileGetMoreBytes(BGZFile *self)
+{
+ rc_t const rc = BufferedFileRead(&self->file);
+ if (rc)
+ return rc;
+
+ if (self->file.bmax == 0)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+
+ self->zs.avail_in = (uInt)(self->file.bmax);
+ self->zs.next_in = (Bytef *)self->file.buf;
+
+ return 0;
+}
+
+static rc_t BGZFileRead(BGZFile *self, zlib_block_t dst, unsigned *pNumRead)
+{
+#if VALIDATE_BGZF_HEADER
+ uint8_t extra[256];
+ gz_header head;
+#endif
+ rc_t rc = 0;
+ unsigned loops;
+ int zr;
+
+ *pNumRead = 0;
+ if (self->file.bmax == 0 || self->zs.avail_in == 0) {
+ rc = BGZFileGetMoreBytes(self);
+ if (rc)
+ return rc;
+ }
+
+#if VALIDATE_BGZF_HEADER
+ memset(&head, 0, sizeof(head));
+ head.extra = extra;
+ head.extra_max = sizeof(extra);
+
+ zr = inflateGetHeader(&self->zs, &head);
+ assert(zr == Z_OK);
+#endif
+
+ self->zs.next_out = (Bytef *)dst;
+ self->zs.avail_out = sizeof(zlib_block_t);
+
+ for (loops = 0; loops != 2; ++loops) {
+ {
+ uLong const initial = self->zs.total_in;
+
+ zr = inflate(&self->zs, Z_FINISH);
+ {
+ uLong const final = self->zs.total_in;
+ uLong const len = final - initial;
+
+ self->file.bpos += len;
+ }
+ }
+ assert(self->zs.avail_in == self->file.bmax - self->file.bpos);
+
+ switch (zr) {
+ case Z_OK:
+ case Z_BUF_ERROR:
+ rc = BGZFileGetMoreBytes(self);
+ if ( rc != 0 )
+ {
+ if ((int)GetRCObject(rc) == rcData && GetRCState(rc) == rcInsufficient)
+ {
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("EOF in Zlib block after %lu bytes\n", self->file.fpos + self->file.bpos));
+ rc = RC(rcAlign, rcFile, rcReading, rcFile, rcTooShort);
+ }
+ return rc;
+ }
+ break;
+ case Z_STREAM_END:
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Zlib block size (before/after): %u/%u\n", self->zs.total_in, self->zs.total_out));
+#if VALIDATE_BGZF_HEADER
+ if (head.done) {
+ unsigned const extra_len = head.extra_len;
+ unsigned i;
+ unsigned bsize = 0;
+
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header extra length: %u\n", extra_len));
+ for (i = 0; i < extra_len; ) {
+ uint8_t const si1 = extra[i + 0];
+ uint8_t const si2 = extra[i + 1];
+ unsigned const slen = LE2HUI16(&extra[i + 2]);
+
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header extra: %c%c(%u)\n", si1, si2, slen));
+ if (si1 == 'B' && si2 == 'C') {
+ bsize = 1 + LE2HUI16(&extra[i + 4]);
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("BGZF Header extra field BC: bsize %u\n", bsize));
+ break;
+ }
+ i += slen + 4;
+ }
+ if (bsize == 0 || bsize != self->zs.total_in) {
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("BGZF Header extra field BC not found\n"));
+ rc = RC(rcAlign, rcFile, rcReading, rcFormat, rcInvalid); /* not BGZF */
+ }
+ }
+ else {
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("GZIP Header not found\n"));
+ rc = RC(rcAlign, rcFile, rcReading, rcFile, rcCorrupt);
+ }
+#endif
+ *pNumRead = (unsigned)self->zs.total_out; /* <= 64k */
+ zr = inflateReset(&self->zs);
+ assert(zr == Z_OK);
+ return rc;
+ default:
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Unexpected Zlib result %i: %s\n", zr, self->zs.msg ? self->zs.msg : "unknown"));
+ return RC(rcAlign, rcFile, rcReading, rcFile, rcCorrupt);
+ }
+ }
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BGZF), ("Failed reading BAM file after %lu bytes\n", self->file.fpos + self->file.bpos));
+ return RC(rcAlign, rcFile, rcReading, rcFile, rcTooShort);
+}
+
+static void BGZFileWhack(BGZFile *self)
+{
+ inflateEnd(&self->zs);
+}
+
+static rc_t BGZFileInit(BGZFile *const self, RawFile_vt *const vt)
+{
+ int i;
+ static RawFile_vt const my_vt = {
+ (rc_t (*)(void *, zlib_block_t, unsigned *))BGZFileRead,
+ (uint64_t (*)(void const *))BufferedFileGetPos,
+ (float (*)(void const *))BufferedFileProPos,
+ (uint64_t (*)(void const *))BufferedFileGetSize,
+ (rc_t (*)(void *, uint64_t))BufferedFileSetPos,
+ (void (*)(void *))BGZFileWhack
+ };
+
+ *vt = my_vt;
+
+ i = inflateInit2(&self->zs, MAX_WBITS + 16); /* max + enable gzip headers */
+ switch (i) {
+ case Z_OK:
+ break;
+ case Z_MEM_ERROR:
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ default:
+ return RC(rcAlign, rcFile, rcConstructing, rcNoObj, rcUnexpected);
+ }
+
+ return 0;
+}
+
+static const char cigarChars[] = {
+ ct_Match,
+ ct_Insert,
+ ct_Delete,
+ ct_Skip,
+ ct_SoftClip,
+ ct_HardClip,
+ ct_Padded,
+ ct_Equal,
+ ct_NotEqual
+ /* ct_Overlap must not appear in actual BAM file */
+};
+
+static inline int opt_tag_cmp(char const a[2], char const b[2])
+{
+ int const d0 = (int)a[0] - (int)b[0];
+ return d0 ? d0 : ((int)a[1] - (int)b[1]);
+}
+
+static int64_t OptTag_sort(void const *A, void const *B, void *ctx)
+{
+ BAM_Alignment const *const self = ctx;
+ unsigned const a_off = ((struct offset_size_s const *)A)->offset;
+ unsigned const b_off = ((struct offset_size_s const *)B)->offset;
+ char const *const a = (char const *)&self->data->raw[a_off];
+ char const *const b = (char const *)&self->data->raw[b_off];
+ int const diff = opt_tag_cmp(a, b);
+
+ if ( diff != 0 )
+ return diff;
+ else if ( a < b )
+ return -1;
+ else
+ return a > b;
+}
+
+/* find the first occurence of tag OR if tag doesn't exist, where it should have been. */
+static unsigned tag_search(BAM_Alignment const *const self, char const tag[2])
+{
+ unsigned f = 0;
+ unsigned e = self->numExtra;
+
+ while (f < e) {
+ unsigned const m = f + ((e - f) >> 1);
+ char const *const mtag = (char const *)&self->data->raw[self->extra[m].offset];
+ int const d = opt_tag_cmp(tag, mtag);
+
+ if (d > 0)
+ f = m + 1;
+ else
+ e = m;
+ }
+ return f;
+}
+
+static unsigned tag_count(BAM_Alignment const *const self,
+ char const tag[2],
+ unsigned const at)
+{
+ unsigned n;
+
+ for (n = 0; n + at < self->numExtra; ++n) {
+ if (opt_tag_cmp(tag, (char const *)&self->data->raw[self->extra[n + at].offset]) != 0)
+ break;
+ }
+ return n;
+}
+
+static unsigned Modulus(int i, unsigned N)
+{
+ while (i < 0)
+ i += N;
+ return i % N;
+}
+
+static struct offset_size_s const *getTag(BAM_Alignment const *const self,
+ char const tag[2],
+ int const which)
+{
+ unsigned const fnd = tag_search(self, tag);
+ unsigned const run = tag_count(self, tag, fnd);
+ return run > 0 ? &self->extra[fnd + Modulus(which, run)] : NULL;
+}
+
+static struct offset_size_s const *get_CS_info(BAM_Alignment const *cself)
+{
+ return getTag(cself, "CS", 0);
+}
+
+static struct offset_size_s const *get_CQ_info(BAM_Alignment const *cself)
+{
+ return getTag(cself, "CQ", 0);
+}
+
+static char const *get_RG(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "RG", 0);
+ return (char const *)((x != NULL && cself->data->raw[x->offset + 2] == 'Z') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_CS(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = get_CS_info(cself);
+ return (char const *)((x != NULL && cself->data->raw[x->offset + 2] == 'Z') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static uint8_t const *get_CQ(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = get_CQ_info(cself);
+ return (uint8_t const *)((x != NULL && cself->data->raw[x->offset + 2] == 'Z') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static struct offset_size_s const *get_OQ_info(BAM_Alignment const *cself)
+{
+ return getTag(cself, "OQ", 0);
+}
+
+static uint8_t const *get_OQ(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = get_OQ_info(cself);
+ return (uint8_t const *)((x != NULL && cself->data->raw[x->offset + 2] == 'Z') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_XT(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "XT", 0);
+ return (char const *)((x != NULL && cself->data->raw[x->offset + 2] == 'Z') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static uint8_t const *get_XS(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "XS", -1); /* want last one */
+ return (uint8_t const *)((x != NULL && cself->data->raw[x->offset + 2] == 'A') ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static struct offset_size_s const *get_CG_ZA_info(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "ZA", 0);
+ return x;
+}
+
+static struct offset_size_s const *get_CG_ZI_info(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "ZI", 0);
+ return x;
+}
+
+static struct offset_size_s const *get_CG_GC_info(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "GC", 0);
+ return x;
+}
+
+static struct offset_size_s const *get_CG_GS_info(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "GS", 0);
+ return x;
+}
+
+static struct offset_size_s const *get_CG_GQ_info(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "GQ", 0);
+ return x;
+}
+
+static char const *get_BX(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "BX", 0);
+ return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_CB(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "CB", 0);
+ return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_UB(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "UB", 0);
+ return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+static char const *get_BC(BAM_Alignment const *cself)
+{
+ struct offset_size_s const *const x = getTag(cself, "BC", 0);
+ return (char const *)(x && cself->data->raw[x->offset + 2] == 'Z' ? &cself->data->raw[x->offset + 3] : NULL);
+}
+
+/* MARK: BAM_File Reading functions */
+
+/* returns (rcData, rcInsufficient) if eof */
+static rc_t BAM_FileFillBuffer(BAM_File *self)
+{
+ rc_t const rc = self->vt.FileRead(&self->file, self->buffer, &self->bufSize);
+ if (rc)
+ return rc;
+ if (self->bufSize == 0 || self->bufSize <= self->bufCurrent)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInsufficient);
+ return 0;
+}
+
+static rc_t BAM_FileReadn(BAM_File *self, const unsigned len, uint8_t dst[/* len */]) {
+ rc_t rc;
+ unsigned cur;
+ unsigned n = 0;
+
+ if (len == 0)
+ return 0;
+
+ for (cur = 0; ; cur += n) {
+ if (self->bufSize > self->bufCurrent) {
+ n = self->bufSize - self->bufCurrent;
+ if (cur + n > len)
+ n = len - cur;
+ memmove(&dst[cur], &self->buffer[self->bufCurrent], n);
+ self->bufCurrent += n;
+ }
+ if (self->bufCurrent != self->bufSize && self->bufSize != 0)
+ return 0;
+ if (self->bufSize != 0) {
+ /* a seek has not just been done so update the file position.
+ * if we didn't and a request for the position is made before the
+ * next read, we will not have the position of the next read.
+ *
+ * if a seek had just been done then
+ * self->fpos_cur == BGZFileGetPos(&self->file)
+ * is already true.
+ */
+ self->fpos_cur = self->vt.FileGetPos(&self->file);
+ self->bufCurrent = 0;
+ self->bufSize = 0;
+ if (cur + n == len)
+ return 0;
+ }
+
+ rc = BAM_FileFillBuffer(self);
+ if (rc)
+ return rc;
+ }
+}
+
+static void const *BAM_FilePeek(BAM_File const *const self, unsigned const offset)
+{
+ return &self->buffer[self->bufCurrent + offset];
+}
+
+static unsigned BAM_FileMaxPeek(BAM_File const *self)
+{
+ return self->bufSize > self->bufCurrent ? self->bufSize - self->bufCurrent : 0;
+}
+
+static int32_t BAM_FilePeekI32(BAM_File *self)
+{
+ return LE2HI32(BAM_FilePeek(self, 0));
+}
+
+static rc_t BAM_FileReadI32(BAM_File *self, int32_t *rhs)
+{
+ uint8_t buf[sizeof(int32_t)];
+ rc_t rc = BAM_FileReadn(self, sizeof(int32_t), buf);
+
+ if (rc == 0)
+ *rhs = LE2HI32(buf);
+ return rc;
+}
+
+/* MARK: BAM File header parsing functions */
+
+static unsigned ParseHD(char const **rslt, unsigned const hlen, char hdata[])
+{
+ unsigned i;
+ unsigned tag;
+ unsigned value;
+ int st = 0;
+ int ws = 1;
+
+ for (i = 0; i < hlen; ++i) {
+ char const cc = hdata[i];
+
+ if (ws && isspace(cc))
+ continue;
+ ws = 0;
+
+ switch (st) {
+ case 0:
+ tag = i;
+ ++st;
+ break;
+ case 1:
+ if (isspace(cc))
+ return 0;
+ ++st;
+ break;
+ case 2:
+ if (cc != ':')
+ continue;
+ hdata[i] = '\0';
+ value = i + 1;
+ ++st;
+ break;
+ case 3:
+ if (cc == '\t' || cc == '\r' || cc == '\n') {
+ hdata[i] = '\0';
+
+ if (strcmp(&hdata[tag], "VN") == 0)
+ *rslt = &hdata[value];
+
+ ++st;
+ ws = 1;
+ }
+ break;
+ case 4:
+ if (cc == '@')
+ return i;
+ tag = i;
+ st = 1;
+ break;
+ }
+ }
+ return st == 4 ? i : 0;
+}
+
+static unsigned ParseSQ(BAMRefSeq *rs, unsigned const hlen, char hdata[])
+{
+ unsigned i;
+ unsigned tag;
+ unsigned value;
+ int st = 0;
+ int ws = 1;
+
+ for (i = 0; i < hlen; ++i) {
+ char const cc = hdata[i];
+
+ if (ws && isspace(cc))
+ continue;
+ ws = 0;
+
+ switch (st) {
+ case 0:
+ tag = i;
+ ++st;
+ break;
+ case 1:
+ if (isspace(cc))
+ return 0;
+ ++st;
+ break;
+ case 2:
+#define HACKAMATIC 1
+#if HACKAMATIC
+ if (cc != ':') {
+ if (i + 1 >= hlen || hdata[i+1] != ':')
+ return 0;
+ else
+ ++i;
+ }
+#else
+ if (cc != ':')
+ continue;
+#endif
+ hdata[i] = '\0';
+ value = i + 1;
+ ++st;
+ break;
+ case 3:
+ if (cc == '\t' || cc == '\r' || cc == '\n') {
+ unsigned j;
+
+ hdata[i] = '\0';
+
+ while (value < i && isspace(hdata[value]))
+ ++value;
+ for (j = i; value < j && isspace(hdata[j - 1]); )
+ hdata[--j] = '\0';
+
+ if (strcmp(&hdata[tag], "SN") == 0)
+ rs->name = &hdata[value];
+ else if (strcmp(&hdata[tag], "LN") == 0)
+ rs->length = strtou64(&hdata[value], NULL, 10);
+ else if (strcmp(&hdata[tag], "AS") == 0)
+ rs->assemblyId = &hdata[value];
+#if HACKAMATIC
+ else if (strcmp(&hdata[tag], "M5") == 0 || strcmp(&hdata[tag], "MD5") == 0)
+#else
+ else if (strcmp(&hdata[tag], "M5") == 0)
+#endif
+#undef HACKAMATIC
+ {
+ unsigned len = j - value;
+
+ if ((hdata[value] == '\'' || hdata[value] == '"') && hdata[value + len - 1] == hdata[value]) {
+ ++value;
+ len -= 2;
+ }
+ if (len == 32) {
+ rs->checksum = &rs->checksum_array[0];
+ for (j = 0; j != 16; ++j) {
+ int const ch1 = toupper(hdata[value + j * 2 + 0]);
+ int const ch2 = toupper(hdata[value + j * 2 + 1]);
+
+ if (isxdigit(ch1) && isxdigit(ch2)) {
+ rs->checksum_array[j] =
+ ((ch1 > '9' ? (ch1 - ('A' - 10)) : (ch1 - '0')) << 4) +
+ (ch2 > '9' ? (ch2 - ('A' - 10)) : (ch2 - '0'));
+ }
+ else {
+ rs->checksum = NULL;
+ break;
+ }
+ }
+ }
+ }
+ else if (strcmp(&hdata[tag], "UR") == 0)
+ rs->uri = &hdata[value];
+ else if (strcmp(&hdata[tag], "SP") == 0)
+ rs->species = &hdata[value];
+
+ ++st;
+ ws = 1;
+ }
+ break;
+ case 4:
+ if (cc == '@')
+ return i;
+ tag = i;
+ st = 1;
+ break;
+ }
+ }
+ return st == 4 ? i : 0;
+}
+
+static unsigned ParseRG(BAMReadGroup *dst, unsigned const hlen, char hdata[])
+{
+ unsigned i;
+ unsigned tag;
+ unsigned value;
+ int st = 0;
+ int ws = 1;
+
+ for (i = 0; i < hlen; ++i) {
+ char const cc = hdata[i];
+
+ if (ws && isspace(cc))
+ continue;
+ ws = 0;
+
+ switch (st) {
+ case 0:
+ tag = i;
+ ++st;
+ break;
+ case 1:
+ if (isspace(cc))
+ return 0;
+ ++st;
+ break;
+ case 2:
+ if (cc != ':')
+ continue;
+ hdata[i] = '\0';
+ value = i + 1;
+ ++st;
+ break;
+ case 3:
+ if (cc == '\t' || cc == '\r' || cc == '\n') {
+ unsigned j = i;
+
+ hdata[i] = '\0';
+
+ while (value < i && isspace(hdata[value]))
+ ++value;
+ while (value < j && isspace(hdata[j - 1]))
+ hdata[--j] = '\0';
+
+ if ((hdata[value] == '\"' || hdata[value] == '\'') && hdata[value] == hdata[j - 1]) {
+ ++value;
+ hdata[j - 1] = '\0';
+ }
+ if (strcmp(&hdata[tag], "ID") == 0)
+ dst->name = &hdata[value];
+ else if (strcmp(&hdata[tag], "SM") == 0)
+ dst->sample = &hdata[value];
+ else if (strcmp(&hdata[tag], "LB") == 0)
+ dst->library = &hdata[value];
+ else if (strcmp(&hdata[tag], "DS") == 0)
+ dst->description = &hdata[value];
+ else if (strcmp(&hdata[tag], "PU") == 0)
+ dst->unit = &hdata[value];
+ else if (strcmp(&hdata[tag], "PI") == 0)
+ dst->insertSize = &hdata[value];
+ else if (strcmp(&hdata[tag], "CN") == 0)
+ dst->center = &hdata[value];
+ else if (strcmp(&hdata[tag], "DT") == 0)
+ dst->runDate = &hdata[value];
+ else if (strcmp(&hdata[tag], "PL") == 0)
+ dst->platform = &hdata[value];
+
+ ++st;
+ ws = 1;
+ }
+ break;
+ case 4:
+ if (cc == '@')
+ return i;
+ tag = i;
+ st = 1;
+ break;
+ }
+ }
+ return st == 4 ? i : 0;
+}
+
+static bool ParseHeader(BAM_File *self, char hdata[], size_t hlen) {
+ unsigned rg = 0;
+ unsigned sq = 0;
+ unsigned i;
+ unsigned tag;
+ int st = 0;
+ int ws = 1;
+
+ for (i = 0; i < hlen; ++i) {
+ char const cc = hdata[i];
+
+ if (ws && isspace(cc))
+ continue;
+ ws = 0;
+
+ switch (st) {
+ case 0:
+ if (cc == '@')
+ ++st;
+ else
+ return false;
+ break;
+ case 1:
+ if (isspace(cc))
+ return false;
+ tag = i;
+ ++st;
+ break;
+ case 2:
+ if (isspace(cc)) {
+ hdata[i] = '\0';
+ if (i - tag == 2) {
+ if (strcmp(&hdata[tag], "HD") == 0) {
+ unsigned const used = ParseHD(&self->version, hlen - i - 1, &hdata[i + 1]);
+ if (used == 0) return false;
+ i += used;
+ st = 0;
+ break;
+ }
+ if (strcmp(&hdata[tag], "SQ") == 0) {
+ unsigned const used = ParseSQ(&self->refSeq[sq++], hlen - i - 1, &hdata[i + 1]);
+ if (used == 0) return false;
+ i += used;
+ st = 0;
+ break;
+ }
+ if (strcmp(&hdata[tag], "RG") == 0) {
+ unsigned const used = ParseRG(&self->readGroup[rg++], hlen - i - 1, &hdata[i + 1]);
+ if (used == 0) return false;
+ i += used;
+ st = 0;
+ break;
+ }
+ }
+ if (st == 2) {
+ ++st;
+ ws = 0;
+ }
+ }
+ else if (i - tag > 2)
+ ++st;
+ break;
+ case 3:
+ if (cc == '\r' || cc == '\n') {
+ st = 0;
+ ws = 1;
+ }
+ break;
+ }
+ }
+ return true;
+}
+
+static int64_t comp_ReadGroup(const void *A, const void *B, void *ignored) {
+ BAMReadGroup const *const a = A;
+ BAMReadGroup const *const b = B;
+
+ /* make null names sort to the bottom */
+ if (a->name == NULL || b->name == NULL)
+ return 0;
+ if (a->name == NULL)
+ return 1;
+ if (b->name == NULL)
+ return -1;
+
+ /* make empty names sort to the bottom */
+ if (a->name[0] == '\0' || b->name[0] == '\0')
+ return 0;
+ if (a->name[0] == '\0')
+ return 1;
+ if (b->name[0] == '\0')
+ return -1;
+
+ return strcmp(a->name, b->name);
+}
+
+static int64_t comp_RefSeqName(const void *A, const void *B, void *ignored) {
+ BAMRefSeq const *const a = A;
+ BAMRefSeq const *const b = B;
+
+ /* make null names sort to the bottom */
+ if (a->name == NULL || b->name == NULL)
+ return 0;
+ if (a->name == NULL)
+ return 1;
+ if (b->name == NULL)
+ return -1;
+
+ /* make empty names sort to the bottom */
+ if (a->name[0] == '\0' || b->name[0] == '\0')
+ return 0;
+ if (a->name[0] == '\0')
+ return 1;
+ if (b->name[0] == '\0')
+ return -1;
+ {
+ int const cmp = strcmp(a->name, b->name);
+ return cmp != 0 ? cmp : (int64_t)a->id - (int64_t)b->id;
+ }
+}
+
+static unsigned MeasureHeader(unsigned *RG, unsigned *SQ, char const text[])
+{
+ unsigned size;
+ unsigned cur = 0;
+
+ for (size = 0; ; ++size) {
+ int const ch = text[size];
+
+ if (ch == '\0')
+ return size;
+ if (ch == '\n') {
+ cur = 0;
+ continue;
+ }
+ if (++cur == 3) {
+ if (text[size - 1] == 'R' && ch == 'G') {
+ ++*RG;
+ continue;
+ }
+ if (text[size - 1] == 'S' && ch == 'Q') {
+ ++*SQ;
+ continue;
+ }
+ }
+ }
+}
+
+static rc_t ProcessHeaderText(BAM_File *self, char const text[], bool makeCopy)
+{
+ unsigned RG = 0;
+ unsigned SQ = 0;
+ unsigned const size = MeasureHeader(&RG, &SQ, text);
+ unsigned i;
+
+ if (SQ) {
+ self->refSeq = calloc(SQ, sizeof(self->refSeq[0]));
+ if (self->refSeq == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ self->refSeqs = SQ;
+
+ if (RG) {
+ self->readGroup = calloc(RG, sizeof(self->readGroup[0]));
+ if (self->readGroup == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ self->readGroups = RG;
+
+ if (makeCopy) {
+ void *const tmp = malloc(size + 1);
+ if (tmp == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ self->header = tmp; /* a const copy of the original */
+ memmove(tmp, text, size + 1);
+ }
+ else
+ self->header = text;
+ {
+ char *const copy = malloc(size + 1); /* an editable copy */
+ if (copy == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ self->headerData1 = copy; /* so it's not leaked */
+ memmove(copy, text, size + 1);
+
+ {
+ bool const parsed = ParseHeader(self, copy, size);
+ if (!parsed)
+ return RC(rcAlign, rcFile, rcParsing, rcData, rcInvalid);
+ }
+ }
+ for (i = 0; i < self->readGroups; ++i)
+ self->readGroup[i].id = i;
+
+ ksort(self->readGroup, self->readGroups, sizeof(self->readGroup[0]), comp_ReadGroup, NULL);
+
+ /* remove read groups with missing and empty names */
+ for (i = self->readGroups; i != 0; ) {
+ BAMReadGroup const *const rg = &self->readGroup[--i];
+ char const *const name = rg->name;
+ if (name == NULL || name[0] == '\0') {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Read Group #$(rg) is missing ID in SAM header", "rg=%i", (int)rg->id));
+ --self->readGroups;
+ }
+ }
+
+ /* check for duplicate read groups names */
+ for (i = 1; i < self->readGroups; ++i) {
+ BAMReadGroup const *const a = &self->readGroup[i - 1];
+ BAMReadGroup const *const b = &self->readGroup[i - 0];
+
+ if (strcmp(a->name, b->name) == 0) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Read Groups #$(r1) and #$(r2) have the same ID '$(id)' in SAM header",
+ "r1=%i,r2=%i,id=%s", (int)a->id, (int)b->id, a->name));
+ }
+ }
+
+ /* these id's are temporary, for reporting only
+ * in BAM, they'll get the id from the second part of the header
+ * in SAM, they'll get reassigned in alphabetical order
+ */
+ for (i = 0; i < self->refSeqs; ++i)
+ self->refSeq[i].id = i;
+
+ ksort(self->refSeq, self->refSeqs, sizeof(self->refSeq[0]), comp_RefSeqName, NULL);
+
+ /* remove references with missing and empty names */
+ for (i = self->refSeqs; i != 0; ) {
+ BAMRefSeq const *const ref = &self->refSeq[--i];
+ char const *const name = ref->name;
+ if (name == NULL || name[0] == '\0') {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference #$(rg) is missing name in SAM header", "rg=%i", (int)ref->id));
+ --self->refSeqs;
+ }
+ }
+
+ /* check for and remove duplicate reference names */
+ for (i = self->refSeqs; i > 1; --i) {
+ BAMRefSeq *const a = &self->refSeq[i - 2];
+ BAMRefSeq *const b = &self->refSeq[i - 1];
+
+ if (strcmp(a->name, b->name) == 0) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "References #$(r1) and #$(r2) have the same name '$(id)' in SAM header",
+ "r1=%i,r2=%i,id=%s", (int)a->id, (int)b->id, a->name));
+ memmove(a, b, (self->refSeqs - i + 1) * sizeof(self->refSeq[0]));
+ --self->refSeqs;
+ }
+ }
+
+ /* check for zero-length references */
+ for (i = 0; i != self->refSeqs; ++i) {
+ BAMRefSeq const *const rs = &self->refSeq[i];
+
+ if (rs->length == 0)
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference '$(ref)' has zero length", "ref=%s", rs->name));
+ }
+
+ return 0;
+}
+
+static rc_t ReadMagic(BAM_File *self)
+{
+ uint8_t sig[4];
+ rc_t rc = BAM_FileReadn(self, 4, sig);
+
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM signature: '%c%c%c' %u\n", sig[0], sig[1], sig[2], sig[3]));
+ if (rc == 0 && (sig[0] != 'B' || sig[1] != 'A' || sig[2] != 'M' || sig[3] != 1))
+ rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcBadVersion);
+ return rc;
+}
+
+static rc_t ReadHeaders(BAM_File *self,
+ char **headerText, size_t *headerTextLen,
+ char **refData, unsigned *numrefs)
+{
+ unsigned hlen;
+ char *htxt = NULL;
+ unsigned nrefs;
+ char *rdat = NULL;
+ unsigned rdsz;
+ unsigned rdms;
+ unsigned i;
+ int32_t i32;
+ rc_t rc = BAM_FileReadI32(self, &i32);
+
+ if (rc) return rc;
+
+ if (i32 < 0) {
+ rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+ goto BAILOUT;
+ }
+ hlen = i32;
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header text size: %u\n", hlen));
+
+ htxt = malloc(hlen + 1);
+ if (htxt == NULL) {
+ rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+ goto BAILOUT;
+ }
+
+ rc = BAM_FileReadn(self, hlen, (uint8_t *)htxt); if (rc) goto BAILOUT;
+ htxt[hlen] = '\0';
+
+ rc = BAM_FileReadI32(self, &i32); if (rc) goto BAILOUT;
+ if (i32 < 0) {
+ rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+ goto BAILOUT;
+ }
+ nrefs = i32;
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header reference count: %u\n", nrefs));
+ if (nrefs) {
+ rdms = nrefs * 16;
+ if (rdms < 4096)
+ rdms = 4096;
+ rdat = malloc(rdms);
+ if (rdat == NULL) {
+ rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+ goto BAILOUT;
+ }
+ for (i = rdsz = 0; i < nrefs; ++i) {
+ rc = BAM_FileReadI32(self, &i32); if (rc) goto BAILOUT;
+ if (i32 <= 0) {
+ rc = RC(rcAlign, rcFile, rcReading, rcHeader, rcInvalid);
+ goto BAILOUT;
+ }
+ if (rdsz + i32 + 8 > rdms) {
+ void *tmp;
+
+ do { rdms <<= 1; } while (rdsz + i32 + 8 > rdms);
+ tmp = realloc(rdat, rdms);
+ if (tmp == NULL) {
+ rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+ goto BAILOUT;
+ }
+ rdat = tmp;
+ }
+ memmove(rdat + rdsz, &i32, 4);
+ rdsz += 4;
+ rc = BAM_FileReadn(self, i32, (uint8_t *)&rdat[rdsz]); if (rc) goto BAILOUT;
+ rdsz += i32;
+ rc = BAM_FileReadI32(self, &i32); if (rc) goto BAILOUT;
+ memmove(rdat + rdsz, &i32, 4);
+ rdsz += 4;
+ }
+ }
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Header reference size: %u\n", rdsz));
+
+ *headerText = htxt;
+ *headerTextLen = hlen;
+ *refData = rdat;
+ *numrefs = nrefs;
+ return 0;
+
+BAILOUT:
+ if (htxt)
+ free(htxt);
+ if (rdat)
+ free(rdat);
+
+ return rc;
+}
+
+static unsigned FindRefSeqByName(char const name[], bool match, unsigned const N, BAMRefSeq const refSeq[])
+{
+ unsigned f = 0;
+ unsigned e = N;
+
+ while (f < e) {
+ unsigned const m = f + ((e - f) >> 1);
+ int const cmp = strcmp(name, refSeq[m].name);
+
+ if (cmp < 0)
+ e = m;
+ else if (cmp > 0)
+ f = m + 1;
+ else
+ return m;
+ }
+ return match ? N : f;
+}
+
+static void FindAndSetupRefSeq(BAMRefSeq *rs, unsigned const refSeqs, BAMRefSeq const refSeq[])
+{
+ unsigned const fnd = FindRefSeqByName(rs->name, true, refSeqs, refSeq);
+ if (fnd != refSeqs) {
+ rs->assemblyId = refSeq[fnd].assemblyId;
+ rs->uri = refSeq[fnd].uri;
+ rs->species = refSeq[fnd].species;
+ if (refSeq[fnd].checksum) {
+ rs->checksum = &rs->checksum_array[0];
+ memmove(rs->checksum_array, refSeq[fnd].checksum_array, 16);
+ }
+ else
+ rs->checksum = NULL;
+ }
+}
+
+static rc_t ProcessBAMHeader(BAM_File *self, char const headerText[])
+{
+ unsigned i;
+ unsigned cp;
+ char *htxt;
+ char *rdat;
+ size_t hlen;
+ unsigned nrefs;
+ BAMRefSeq *refSeq;
+ rc_t rc = ReadMagic(self);
+
+ if (rc) return rc;
+
+ rc = ReadHeaders(self, &htxt, &hlen, &rdat, &nrefs);
+ if (rc) return rc;
+
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("BAM Data records start at: %lu+%u\n", self->fpos_cur, self->bufCurrent));
+
+ if (nrefs) {
+ refSeq = calloc(nrefs, sizeof(self->refSeq[0]));
+ if (refSeq == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+
+ if (headerText) {
+ free(htxt);
+ rc = ProcessHeaderText(self, headerText, true);
+ }
+ else
+ rc = ProcessHeaderText(self, htxt, false);
+
+ if (rc) return rc;
+
+ for (i = cp = 0; i < nrefs; ++i) {
+ unsigned const nlen = LE2HUI32(rdat + cp);
+ char *const name = rdat + cp + 4;
+ unsigned const rlen = LE2HUI32(rdat + cp + nlen + 4);
+
+ cp += nlen + 8;
+ name[nlen] = '\0';
+
+ refSeq[i].id = i;
+ refSeq[i].name = name;
+ refSeq[i].length = rlen;
+ FindAndSetupRefSeq(&refSeq[i], self->refSeqs, self->refSeq);
+ }
+ free(self->refSeq);
+ self->refSeq = refSeq;
+ self->refSeqs = nrefs;
+ self->headerData2 = rdat; /* so it's not leaked */
+
+ return 0;
+}
+
+static rc_t ProcessSAMHeader(BAM_File *self, char const substitute[])
+{
+ SAMFile *const file = &self->file.sam;
+ size_t headerSize = 0;
+ char *headerText = NULL;
+ rc_t rc;
+ int st = 0;
+
+ for ( ; ; ) {
+ void *const tmp = headerText;
+ int const ch = SAMFileRead1(file);
+
+ if (ch == -1)
+ return SAMFileLastError(file);
+
+ if (st == 0) {
+ if (ch != '@') {
+ SAMFilePutBack(file, ch);
+ break;
+ }
+ st = 1;
+ }
+ headerText = realloc(headerText, headerSize + 2);
+ if (headerText == NULL) {
+ free(tmp);
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ headerText[headerSize++] = ch;
+ headerText[headerSize] = '\0';
+ if (ch == '\n')
+ st = 0;
+ }
+
+ if (substitute)
+ rc = ProcessHeaderText(self, substitute, true);
+ else if (headerText)
+ rc = ProcessHeaderText(self, headerText, false);
+ else {
+ rc = RC(rcAlign, rcFile, rcConstructing, rcHeader, rcNotFound);
+ (void)LOGERR(klogErr, rc, "SAM header required");
+ }
+ if (rc == 0) {
+ unsigned i;
+
+ for (i = 0; i < self->refSeqs; ++i)
+ self->refSeq[i].id = i;
+ }
+ return rc;
+}
+
+/* MARK: BAM File destructor */
+
+static void BAM_FileWhack(BAM_File *self) {
+ if (self->refSeqs > 0 && self->refSeq)
+ free(self->refSeq);
+ if (self->readGroup)
+ free(self->readGroup);
+ if (self->header)
+ free((void *)self->header);
+ if (self->headerData1)
+ free((void *)self->headerData1);
+ if (self->headerData2)
+ free((void *)self->headerData2);
+ if (self->nocopy)
+ free(self->nocopy);
+ if (self->vt.FileWhack)
+ self->vt.FileWhack(&self->file);
+ KFileRelease(self->defer);
+ BufferedFileWhack(&self->file.bam.file);
+}
+
+/* MARK: BAM File constructors */
+
+/* file is retained */
+static rc_t BAM_FileMakeWithKFileAndHeader(BAM_File **cself,
+ KFile const *file,
+ char const *headerText)
+{
+ BAM_File *self = calloc(1, sizeof(*self));
+ rc_t rc;
+
+ if (self == NULL)
+ return RC(rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted);
+
+ rc = BufferedFileInit(&self->file.bam.file, file);
+ if (rc) {
+ free(self);
+ return rc;
+ }
+
+ rc = BGZFileInit(&self->file.bam, &self->vt);
+ if (rc == 0) {
+ rc = ProcessBAMHeader(self, headerText);
+ if (rc == 0) {
+ *cself = self;
+ return 0;
+ }
+ }
+ BGZFileWhack(&self->file.bam);
+
+ self->file.sam.file.bpos = 0;
+ rc = SAMFileInit(&self->file.sam, &self->vt);
+ if (rc == 0) {
+ self->isSAM = true;
+ rc = ProcessSAMHeader(self, headerText);
+ if (rc == 0) {
+ *cself = self;
+ return 0;
+ }
+ }
+ BufferedFileWhack(&self->file.sam.file);
+ free(self);
+
+ return rc;
+}
+
+rc_t BAM_FileMake(const BAM_File **cself,
+ KFile *defer,
+ char const headerText[],
+ char const path[], ... )
+{
+ KDirectory *dir;
+ va_list args;
+ rc_t rc;
+ const KFile *kf;
+
+ if (cself == NULL)
+ return RC(rcAlign, rcFile, rcOpening, rcParam, rcNull);
+ *cself = NULL;
+
+ if (strcmp(path, "/dev/stdin") == 0) {
+ rc = KFileMakeStdIn(&kf);
+ }
+ else {
+ rc = KDirectoryNativeDir(&dir);
+ if (rc) return rc;
+ va_start(args, path);
+ rc = KDirectoryVOpenFileRead(dir, &kf, path, args);
+ va_end(args);
+ KDirectoryRelease(dir);
+ }
+ if (rc == 0) {
+ BAM_File *self = NULL;
+ rc = BAM_FileMakeWithKFileAndHeader(&self, kf, headerText);
+ if (rc == 0) {
+ assert(self != NULL);
+ KFileAddRef(defer);
+ self->defer = defer;
+ }
+ *cself = self;
+ KFileRelease(kf);
+ }
+ return rc;
+}
+
+/* MARK: BAM File ref-counting */
+
+rc_t BAM_FileAddRef(const BAM_File *cself) {
+ return 0;
+}
+
+rc_t BAM_FileRelease(const BAM_File *cself) {
+ BAM_File *self = (BAM_File *)cself;
+
+ if (cself != NULL) {
+ BAM_FileWhack(self);
+ free(self);
+ }
+ return 0;
+}
+
+/* MARK: BAM File positioning */
+
+float BAM_FileGetProportionalPosition(const BAM_File *self)
+{
+ return self->vt.FileProPos(&self->file);
+}
+
+rc_t BAM_FileGetPosition(const BAM_File *self, BAM_FilePosition *pos) {
+ *pos = (self->fpos_cur << 16) | self->bufCurrent;
+ return 0;
+}
+
+static void BAM_FileAdvance(BAM_File *const self, unsigned distance)
+{
+ self->bufCurrent += distance;
+ if (self->bufCurrent == self->bufSize) {
+ self->fpos_cur = self->vt.FileGetPos(&self->file);
+ self->bufCurrent = 0;
+ self->bufSize = 0;
+ }
+}
+
+/* MARK: BAM Alignment contruction */
+
+static int TagTypeSize(int const type)
+{
+ switch (type) {
+ case dt_ASCII: /* A */
+ case dt_INT8: /* c */
+ case dt_UINT8: /* C */
+ return 1;
+
+ case dt_INT16: /* s */
+ case dt_UINT16: /* S */
+ return 2;
+
+ case dt_INT: /* i */
+ case dt_UINT: /* I */
+ case dt_FLOAT32: /* f */
+ return 4;
+#if 0
+ case dt_FLOAT64: /* d */
+ return 8;
+#endif
+ case dt_CSTRING: /* Z */
+ case dt_HEXSTRING: /* H */
+ return -'S';
+
+ case dt_NUM_ARRAY: /* B */
+ return -'A';
+ }
+ return 0;
+}
+
+static void ColorCheck(BAM_Alignment *const self, char const tag[2], unsigned const len)
+{
+ if (tag[0] == 'C' && len != 0) {
+ int const ch = tag[1];
+ int const flag = ch == 'Q' ? 2 : ch == 'S' ? 1 : 0;
+
+ if (flag)
+ self->hasColor ^= (len << 2) | flag;
+ }
+}
+
+static rc_t ParseOptData(BAM_Alignment *const self, size_t const maxsize,
+ size_t const xtra, size_t const datasize)
+{
+ size_t const maxExtra = (maxsize - (sizeof(*self) - sizeof(self->extra))) / sizeof(self->extra[0]);
+ char const *const base = (char const *)self->data->raw;
+ unsigned i = 0;
+ unsigned len;
+ unsigned offset;
+
+ self->numExtra = 0;
+ for (len = 0, offset = (unsigned)xtra; offset < datasize; offset += len) {
+ int const valuelen1 = TagTypeSize(base[offset + 2]);
+ unsigned valuelen;
+
+ if (valuelen1 < 0) {
+ char const *const value = &base[offset + 3];
+
+ if (-valuelen1 == 'S') {
+ valuelen = 0;
+ while (value[valuelen] != '\0') {
+ ++valuelen;
+ if (offset + valuelen >= datasize) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ return rc;
+ }
+ }
+ ColorCheck(self, base + offset, valuelen);
+ ++valuelen;
+ }
+ else {
+ int const elem_size = TagTypeSize(value[0]);
+
+ assert(-valuelen1 == 'A');
+ if (elem_size <= 0) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+ return rc;
+ }
+ else {
+ int const elem_count = LE2HI32(&value[1]);
+
+ valuelen = elem_size * elem_count + 1 + 4;
+ if (offset + valuelen >= datasize) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ return rc;
+ }
+ }
+ }
+ }
+ else if (valuelen1 == 0) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+ return rc;
+ }
+ else
+ valuelen = valuelen1;
+
+ len = valuelen + 3;
+ if (i < maxExtra) {
+ self->extra[i].offset = offset;
+ self->extra[i].size = len;
+ }
+ ++i;
+ }
+ self->numExtra = i;
+ if (2 <= i && i <= maxExtra)
+ ksort(self->extra, i, sizeof(self->extra[0]), OptTag_sort, self);
+
+ return 0;
+}
+
+static rc_t ParseOptDataLog(BAM_Alignment *const self, unsigned const maxsize,
+ unsigned const xtra, unsigned const datasize)
+{
+ unsigned const maxExtra = (maxsize - (sizeof(*self) - sizeof(self->extra))) / sizeof(self->extra[0]);
+ char const *const base = (char const *)self->data->raw;
+ unsigned i = 0;
+ unsigned len;
+ unsigned offset;
+
+ self->numExtra = 0;
+ for (len = 0, offset = (unsigned)xtra; offset < datasize; offset += len) {
+ int const type = base[offset + 2];
+ int const valuelen1 = TagTypeSize(type);
+ unsigned valuelen;
+
+ if (valuelen1 > 0)
+ valuelen = valuelen1;
+ else if (valuelen1 < 0) {
+ char const *const value = &base[offset + 3];
+
+ if (-valuelen1 == 'S') {
+ valuelen = 0;
+ while (value[valuelen] != '\0') {
+ ++valuelen;
+ if (offset + valuelen >= datasize) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ (void)LOGERR(klogErr, rc,
+ "Parsing BAM optional fields: "
+ "unterminated string");
+ return rc;
+ }
+ }
+ ColorCheck(self, base + offset, valuelen);
+ ++valuelen;
+ }
+ else {
+ int const elem_type = value[0];
+ int const elem_size = TagTypeSize(elem_type);
+
+ assert(-valuelen1 == 'A');
+ if (elem_size <= 0) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+ (void)LOGERR(klogErr, rc,
+ "Parsing BAM optional fields: "
+ "unknown array type");
+ return rc;
+ }
+ else {
+ int const elem_count = LE2HI32(&value[1]);
+
+ valuelen = elem_size * elem_count + 1 + 4;
+ if (offset + valuelen >= datasize) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ (void)LOGERR(klogErr, rc,
+ "Parsing BAM optional fields: "
+ "array too big");
+ return rc;
+ }
+ }
+ }
+ }
+ else {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+ (void)LOGERR(klogErr, rc,
+ "Parsing BAM optional fields: "
+ "unknown type");
+ return rc;
+ }
+
+ len = valuelen + 3;
+ if (i < maxExtra) {
+ self->extra[i].offset = offset;
+ self->extra[i].size = len;
+ }
+ ++i;
+ }
+ self->numExtra = i;
+ if (2 <= i && i <= maxExtra)
+ ksort(self->extra, i, sizeof(self->extra[0]), OptTag_sort, self);
+
+ return 0;
+}
+
+static unsigned BAM_AlignmentSize(unsigned const max_extra_tags)
+{
+ BAM_Alignment const *const y = NULL;
+
+ return sizeof(*y) + (max_extra_tags ? max_extra_tags - 1 : 0) * sizeof(y->extra);
+}
+
+static unsigned BAM_AlignmentSetOffsets(BAM_Alignment *const self)
+{
+ unsigned const nameLen = getReadNameLength(self);
+ unsigned const cigCnt = getCigarCount(self);
+ unsigned const readLen = getReadLen(self);
+ unsigned const cigar = (unsigned)(&((struct bam_alignment_s const *)NULL)->read_name[nameLen] - (const char *)NULL);
+ unsigned const seq = cigar + 4 * cigCnt;
+ unsigned const qual = seq + (readLen + 1) / 2;
+ unsigned const xtra = qual + readLen;
+
+ self->cigar = cigar;
+ self->seq = seq;
+ self->qual = qual;
+
+ return xtra;
+}
+
+static bool BAM_AlignmentInit(BAM_Alignment *const self, unsigned const maxsize,
+ unsigned const datasize, void const *const data)
+{
+ memset(self, 0, sizeof(*self));
+ self->data = data;
+ self->datasize = datasize;
+ {
+ unsigned const xtra = BAM_AlignmentSetOffsets(self);
+
+ if ( datasize >= xtra
+ && datasize >= self->cigar
+ && datasize >= self->seq
+ && datasize >= self->qual)
+ {
+ rc_t const rc = ParseOptData(self, maxsize, xtra, datasize);
+
+ if (rc == 0)
+ return true;
+ }
+ return false;
+ }
+}
+
+static void BAM_AlignmentDebugPrint(BAM_Alignment const *const self)
+{
+ DBGMSG(DBG_ALIGN, DBG_FLAG(DBG_ALIGN_BAM), ("{"
+ "\"BAM record\": "
+ "{ "
+ "\"size\": %u, "
+ "\"name length\": %u, "
+ "\"cigar count\": %u, "
+ "\"read length\": %u, "
+ "\"extra count\": %u "
+ "}"
+ "}\n",
+ (unsigned)self->datasize,
+ (unsigned)getReadNameLength(self),
+ (unsigned)getCigarCount(self),
+ (unsigned)getReadLen(self),
+ (unsigned)self->numExtra));
+}
+
+static bool BAM_AlignmentInitLog(BAM_Alignment *const self, unsigned const maxsize,
+ unsigned const datasize, void const *const data)
+{
+ memset(self, 0, sizeof(*self));
+ self->data = data;
+ self->datasize = datasize;
+ {
+ unsigned const xtra = BAM_AlignmentSetOffsets(self);
+
+ if ( datasize >= xtra
+ && datasize >= self->cigar
+ && datasize >= self->seq
+ && datasize >= self->qual)
+ {
+ rc_t const rc = ParseOptDataLog(self, maxsize, xtra, datasize);
+
+ if (rc == 0) {
+ BAM_AlignmentDebugPrint(self);
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+static void BAM_AlignmentLogParseError(BAM_Alignment const *self)
+{
+ char const *const reason = self->cigar > self->datasize ? "BAM Record CIGAR too long"
+ : self->seq > self->datasize ? "BAM Record SEQ too long"
+ : self->qual > self->datasize ? "BAM Record QUAL too long"
+ : self->qual + getReadLen(self) > self->datasize ? "BAM Record EXTRA too long"
+ : "BAM Record EXTRA parsing failure";
+
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), reason);
+}
+
+/* MARK: BAM Alignment readers */
+
+/* returns
+ * (rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable)
+ * or
+ * (rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient)
+ * if should read with copy
+ */
+static
+rc_t BAM_FileReadNoCopy(BAM_File *const self, unsigned actsize[], BAM_Alignment rhs[],
+ unsigned const maxsize)
+{
+ unsigned const maxPeek = BAM_FileMaxPeek(self);
+ bool isgood;
+
+ *actsize = 0;
+
+ if (maxPeek == 0) {
+ rc_t const rc = BAM_FileFillBuffer(self);
+
+ if (rc == 0)
+ return BAM_FileReadNoCopy(self, actsize, rhs, maxsize);
+
+ if ((int)GetRCObject(rc) == rcData && GetRCState(rc) == rcInsufficient)
+ {
+ self->eof = true;
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+ }
+ return rc;
+ }
+ if (maxPeek < 4)
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable);
+ else {
+ int32_t const i32 = BAM_FilePeekI32(self);
+
+ if (i32 <= 0)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+ if (maxPeek < i32 + 4)
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcNotAvailable);
+
+ isgood = BAM_AlignmentInitLog(rhs, maxsize, i32, BAM_FilePeek(self, 4));
+ rhs[0].parent = self;
+ }
+ *actsize = BAM_AlignmentSize(rhs[0].numExtra);
+ if (isgood && *actsize > maxsize)
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+
+ BAM_FileAdvance(self, 4 + rhs->datasize);
+ return isgood ? 0 : RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid);
+}
+
+static
+unsigned BAM_AlignmentSizeFromData(unsigned const datasize, void const *data)
+{
+ BAM_Alignment temp;
+
+ BAM_AlignmentInit(&temp, sizeof(temp), datasize, data);
+
+ return BAM_AlignmentSize(temp.numExtra);
+}
+
+static bool BAM_AlignmentIsEmpty(BAM_Alignment const *const self)
+{
+ if (getReadNameLength(self) == 0)
+ return true;
+ if (getReadName(self)[0] == '\0')
+ return true;
+ if (self->hasColor == 3)
+ return false;
+ if (getReadLen(self) != 0)
+ return false;
+ if (getCigarCount(self) != 0)
+ return false;
+ return true;
+}
+
+static
+rc_t BAM_FileReadCopy(BAM_File *const self, BAM_Alignment const *rslt[], bool const log)
+{
+ void *storage;
+ void const *data;
+ unsigned datasize;
+ rc_t rc;
+
+ rslt[0] = NULL;
+ {
+ int32_t i32;
+
+ rc = BAM_FileReadI32(self, &i32);
+ if ( rc != 0 )
+ {
+ if ((int)GetRCObject(rc) == rcData && GetRCState(rc) == rcInsufficient)
+ {
+ self->eof = true;
+ rc = SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+ }
+ return rc;
+ }
+ if (i32 <= 0)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+ datasize = i32;
+ }
+ if (BAM_FileMaxPeek(self) < datasize) {
+ data = storage = malloc(datasize);
+ if (storage == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+ rc = BAM_FileReadn(self, datasize, storage);
+ }
+ else {
+ storage = NULL;
+ data = (bam_alignment *)&self->buffer[self->bufCurrent];
+
+ BAM_FileAdvance(self, datasize);
+ }
+ if (rc == 0) {
+ unsigned const rsltsize = BAM_AlignmentSizeFromData(datasize, data);
+ BAM_Alignment *const y = malloc(rsltsize);
+
+ if (y) {
+ if ((log ? BAM_AlignmentInitLog : BAM_AlignmentInit)(y, rsltsize, datasize, data)) {
+ if (storage != NULL)
+ y->storage = storage;
+
+ y->parent = self;
+ rslt[0] = y;
+
+ if (BAM_AlignmentIsEmpty(y))
+ return RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+ return 0;
+ }
+ rc = RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid);
+ free(y);
+ }
+ else
+ rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+ }
+ free(storage);
+
+ return rc;
+}
+
+/* MARK: SAM code */
+
+static void SAM2BAM_ConvertShort(void *const Dst, int value)
+{
+ uint8_t *const dst = Dst;
+ dst[0] = (uint8_t)(value >> 0);
+ dst[1] = (uint8_t)(value >> 8);
+}
+
+static void SAM2BAM_ConvertInt(void *const Dst, int value)
+{
+ uint8_t *const dst = Dst;
+ dst[0] = (uint8_t)(value >> 0);
+ dst[1] = (uint8_t)(value >> 8);
+ dst[2] = (uint8_t)(value >> 16);
+ dst[3] = (uint8_t)(value >> 24);
+}
+
+static int SAM2BAM_CIGAR_OpCount(char const cigar[])
+{
+ unsigned i;
+ unsigned n = 0;
+ int st = 0;
+
+ if (cigar[0] == '*' && cigar[1] == '\0')
+ return 0;
+
+ for (i = 0; ; ++i) {
+ int const ch = cigar[i];
+
+ if (ch == '\0')
+ break;
+
+ if (st == 0) {
+ if (!isdigit(ch))
+ return -1;
+ st = 1;
+ }
+ else if (!isdigit(ch)) {
+ ++n;
+ st = 0;
+ }
+ }
+ return st == 0 ? n : -1;
+}
+
+static int SAM2BAM_ConvertCIGAR1(uint8_t dst[4], char const value[])
+{
+ int len = 0;
+ int code = 0;
+ unsigned i = 0;
+
+ if (value[0] == '\0')
+ return 0;
+
+ for ( ; ; ) {
+ int const ch = value[i++];
+
+ if (!isdigit(ch)) {
+ switch (ch) {
+ case 'M':
+ code = 0;
+ break;
+ case 'I':
+ code = 1;
+ break;
+ case 'D':
+ code = 2;
+ break;
+ case 'N':
+ code = 3;
+ break;
+ case 'S':
+ code = 4;
+ break;
+ case 'H':
+ code = 5;
+ break;
+ case 'P':
+ code = 6;
+ break;
+ case '=':
+ code = 7;
+ break;
+ case 'X':
+ code = 8;
+ break;
+ default:
+ return -1;
+ }
+ break;
+ }
+ len = (len * 10) + (ch - '0');
+ if (len >= (1 << 24))
+ return -2;
+ }
+ SAM2BAM_ConvertInt(dst, (len << 4) | code);
+ return i;
+}
+
+static rc_t SAM2BAM_ConvertCIGAR(unsigned const insize, void /* inout */ *const data, void const *const endp)
+{
+ char *const value = data;
+ uint8_t *const dst = (void *)(value + insize);
+ unsigned j = 0;
+ unsigned i;
+
+ for (i = 0; i < insize; ++j) {
+ if ((void const *)(dst + j * 4 + 4) >= endp)
+ return RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+ {
+ int const k = SAM2BAM_ConvertCIGAR1(dst + j * 4, value + i);
+ if (k > 0)
+ i += k;
+ else
+ return k == 0 ? 0 : RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ }
+ }
+ memmove(data, dst, 4 * j);
+ return 0;
+}
+
+static int SAM2BAM_ConvertBase(int base)
+{
+ static char const tr[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,0x0, -1, -1,
+ -1,0x1,0xE,0x2,0xD, -1, -1,0x4,0xB, -1, -1,0xC, -1,0x3,0xF, -1,
+ -1, -1,0x5,0x6,0x8, -1,0x7,0x9, -1,0xA, -1, -1, -1, -1, -1, -1,
+ -1,0x1,0xE,0x2,0xD, -1, -1,0x4,0xB, -1, -1,0xC, -1,0x3,0xF, -1,
+ -1, -1,0x5,0x6,0x8, -1,0x7,0x9, -1,0xA, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ };
+ return tr[base];
+}
+
+static rc_t SAM2BAM_ConvertSEQ(unsigned const insize, void /* inout */ *const data, void const *const endp)
+{
+ char const *const value = data;
+ uint8_t *const dst = data;
+ unsigned const n = insize & ~((unsigned)1);
+ unsigned j = 0;
+ unsigned i;
+
+ for (i = 0; i < n; i += 2, ++j) {
+ int const hi = SAM2BAM_ConvertBase(value[i + 0]);
+ int const lo = SAM2BAM_ConvertBase(value[i + 1]);
+
+ if (hi < 0 || lo < 0)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+ dst[j] = (hi << 4) | lo;
+ }
+ if (n != insize) {
+ int const hi = SAM2BAM_ConvertBase(value[n]);
+ int const lo = 0;
+
+ if (hi < 0 || lo < 0)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+ dst[j] = (hi << 4) | lo;
+ }
+ return 0;
+}
+
+static rc_t SAM2BAM_ConvertQUAL(unsigned const insize, void /* inout */ *const data, void const *const endp)
+{
+ char const *const value = data;
+ uint8_t *const dst = data;
+ unsigned i;
+
+ for (i = 0; i < insize; ++i) {
+ int const ch = value[i];
+
+ if (ch < '!' || ch > '~')
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ dst[i] = ch - 33;
+ }
+ return 0;
+}
+
+static int SAM2BAM_ScanValue(void *const dst, char const *src, bool isFloat, bool isArray)
+{
+ int i = 0;
+ int sgn = 0;
+ uint64_t mantissa = 0;
+ int shift = 0;
+ int exponent = 0;
+ int st = 0;
+
+ if (isArray) {
+ int const ch = src[i++];
+ if (ch != ',')
+ return -1;
+ }
+ for ( ; ; ++i) {
+ int const ch = src[i];
+ int const value = ch - '0';
+
+ if (ch == '\0')
+ break;
+ if (isArray && ch == ',')
+ break;
+ switch (st) {
+ case 0:
+ ++st;
+ if (ch == '-') {
+ sgn = -1;
+ break;
+ }
+ else if (ch == '+') {
+ sgn = 1;
+ break;
+ }
+ /* fallthrough; */
+ case 1:
+ if (ch == '.') {
+ st = 2;
+ break;
+ }
+ if (ch == 'e' || ch == 'E') {
+ st = 3;
+ break;
+ }
+ if (value < 0 || value > 9)
+ return -1;
+ mantissa = mantissa * 10 + value;
+ break;
+ case 2:
+ if (ch == 'e' || ch == 'E') {
+ st = 3;
+ break;
+ }
+ if (value < 0 || value > 9)
+ return -1;
+ mantissa = mantissa * 10 + value;
+ ++shift;
+ break;
+ case 3:
+ ++st;
+ if (ch == '-') {
+ ++st;
+ break;
+ }
+ else if (ch == '+') {
+ break;
+ }
+ /* fallthrough; */
+ case 4:
+ if (value < 0 || value > 9)
+ return -1;
+ exponent = exponent * 10 + value;
+ break;
+ case 5:
+ if (value < 0 || value > 9)
+ return -1;
+ exponent = exponent * 10 - value;
+ break;
+ }
+ }
+ {
+ double const value = mantissa * pow(10, exponent - shift) * (sgn ? sgn : 1);
+ union { int i; float f; } x;
+ if (isFloat)
+ x.f = value;
+ else
+ x.i = floor(value);
+ SAM2BAM_ConvertInt(dst, x.i);
+ }
+ return i;
+}
+
+static int SAM2BAM_ConvertEXTRA(unsigned const insize, void /* inout */ *const data, void const *const endp)
+{
+ if (insize < 5) /* XX:T:\0 */
+ return -1;
+ {
+ char const *const src = data;
+
+ if (src[2] != ':' || src[4] != ':')
+ return -3;
+ {
+ int const type = src[3];
+ char *const dst = data;
+
+ dst[2] = type;
+
+ switch (type) {
+ case 'A':
+ dst[3] = src[5];
+ return 4;
+ case 'H':
+ case 'Z':
+ memmove(dst + 3, src + 5, insize - 5);
+ dst[insize - 2] = '\0';
+ return insize - 1;
+ case 'i':
+ case 'f': {
+ if ((void const *)&dst[7] >= endp)
+ return -2;
+ {
+ int const n = SAM2BAM_ScanValue(&dst[3], src + 5, type == 'f', false);
+ return (n < 0 || n + 5 != insize) ? -4 : 7;
+ }
+ }
+ case 'B':
+ break;
+ default:
+ return -3;
+ }
+
+ if (insize < 8) /* XX:B:T,x\0 */
+ return -1;
+
+ switch (src[5]) {
+ case 'c':
+ case 'C':
+ case 's':
+ case 'S':
+ case 'i':
+ case 'I':
+ case 'f':
+ break;
+ default:
+ return -3;
+ }
+ {
+ uint8_t *const scratch = (void *)(src + insize);
+ int const subtype = src[5] == 'f' ? 'f' : 'i';
+ unsigned i;
+ unsigned j;
+
+ dst[3] = subtype;
+ for (i = 6, j = 0; i < insize; ++j) {
+ if ((void const *)(scratch + 4 * j + 4) >= endp)
+ return -2;
+ {
+ int const n = SAM2BAM_ScanValue(scratch + 4 * j, src + i, subtype == 'f', true);
+ if (n < 0)
+ return -4;
+ i += n;
+ }
+ }
+ SAM2BAM_ConvertInt(&dst[4], j);
+ memmove(&dst[8], scratch, 4 * j);
+ return 8 + 4 * j;
+ }
+ }
+ }
+}
+
+static rc_t BAM_FileReadSAM(BAM_File *const self, BAM_Alignment const **const rslt)
+{
+ void const *const endp = self->buffer + sizeof(self->buffer);
+ struct bam_alignment_s *raw = (void *)self->buffer;
+ struct {
+ int namelen;
+ int FLAG;
+ int RNAME;
+ int POS;
+ int MAPQ;
+ int cigars;
+ int RNEXT;
+ int PNEXT;
+ int TLEN;
+
+ int readlen;
+
+ char *QNAME;
+ uint32_t *CIGAR; /* probably not aligned */
+ uint8_t *SEQ;
+ uint8_t *QUAL;
+ char *EXTRA;
+ } temp;
+ unsigned field = 1;
+ char *scratch = &raw->read_name[0];
+ int *intScratch = NULL;
+ int sgn = 1;
+ unsigned i = 0;
+
+ memset(raw, 0, sizeof(*raw));
+ memset(&temp, 0, sizeof(temp));
+ temp.QNAME = scratch;
+
+ for ( ; ; ) {
+ int const ch = SAMFileRead1(&self->file.sam);
+ if (ch < 0) {
+ rc_t const rc = SAMFileLastError(&self->file.sam);
+ return (i == 0 && field == 1 && (rc == 0 || GetRCState(rc) == rcInsufficient)) ? SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound) : rc;
+ }
+ if ((void const *)&scratch[i] >= endp)
+ return RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+
+ if (ch == '\n' && i > 0 && scratch[i - 1] == '\r') {
+ /* handle \r\n line endings */
+ --i;
+ }
+ if (!(ch == '\t' || ch == '\n')) {
+ if (field != 0) {
+ if (intScratch == NULL) {
+ scratch[i] = ch;
+ }
+ else {
+ int const value = ch - '0';
+ if (ch == '-' && i == 0) {
+ sgn = -1;
+ }
+ else if (ch == '-' && i == 0) {
+ sgn = 1;
+ }
+ else {
+ if (value < 0 || value > 9) {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error parsing integer field");
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ }
+ *intScratch = *intScratch * 10 + value * sgn;
+ }
+ }
+ }
+ ++i;
+ continue;
+ }
+ if (intScratch == NULL)
+ scratch[i] = '\0';
+ else {
+ intScratch = NULL;
+ sgn = 1;
+ }
+ switch (field) {
+ case 0:
+ if (ch == '\n')
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ break;
+ case 1:
+ if (i == 1 && scratch[0] == '*') {
+ temp.namelen = 0;
+ }
+ else {
+ temp.namelen = i + 1; /* includes NULL terminator */
+ scratch += i + 1; /* don't want to overwrite it */
+ if (temp.namelen > 255) {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error QNAME is too long");
+ field = 0;
+ }
+ }
+ temp.CIGAR = (void *)scratch;
+ intScratch = &temp.FLAG;
+ break;
+ case 2:
+ break;
+ case 3:
+ if (i == 1 && scratch[0] == '*')
+ temp.RNAME = -1;
+ else {
+ unsigned const id = FindRefSeqByName(scratch, true, self->refSeqs, self->refSeq);
+ if (id < self->refSeqs)
+ temp.RNAME = id;
+ else {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record missing reference");
+ field = 0;
+ }
+ }
+ intScratch = &temp.POS;
+ break;
+ case 4:
+ intScratch = &temp.MAPQ;
+ break;
+ case 5:
+ if (temp.MAPQ > 255) {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error MAPQ > 255");
+ field = 0;
+ }
+ break;
+ case 6:
+ temp.cigars = SAM2BAM_CIGAR_OpCount(scratch);
+ if (temp.cigars < 0) {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error parsing CIGAR");
+ field = 0;
+ }
+ else if (temp.cigars > 0) {
+ scratch += 4 * temp.cigars;
+ temp.SEQ = (uint8_t *)scratch;
+ {
+ rc_t const rc = SAM2BAM_ConvertCIGAR(i, temp.CIGAR, endp);
+ if (rc) {
+ LOGERR(klogErr, rc, "SAM Record error parsing CIGAR");
+ field = 0;
+ }
+ }
+ }
+ else
+ temp.SEQ = (uint8_t *)scratch;
+ break;
+ case 7:
+ if (i == 1 && scratch[0] == '*')
+ temp.RNEXT = -1;
+ else if (i == 1 && scratch[0] == '=')
+ temp.RNEXT = temp.RNAME;
+ else {
+ unsigned const id = FindRefSeqByName(scratch, true, self->refSeqs, self->refSeq);
+ if (id < self->refSeqs)
+ temp.RNEXT = id;
+ else {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record missing reference");
+ field = 0;
+ }
+ }
+ intScratch = &temp.PNEXT;
+ break;
+ case 8:
+ intScratch = &temp.TLEN;
+ break;
+ case 9:
+ break;
+ case 10:
+ if (i == 1 && scratch[0] == '*')
+ temp.readlen = 0;
+ else {
+ temp.readlen = i;
+ scratch += (temp.readlen + 1) / 2;
+ temp.QUAL = (uint8_t *)scratch;
+ {
+ rc_t const rc = SAM2BAM_ConvertSEQ(i, temp.SEQ, endp);
+ if (rc) {
+ LOGERR(klogErr, rc, "SAM Record error converting SEQ");
+ field = 0;
+ }
+ }
+ }
+ break;
+ case 11:
+ if (temp.readlen == 0)
+ break;
+ if (i == 1 && scratch[0] == '*')
+ memset(temp.QUAL, 0xFF, temp.readlen);
+ else if (i == temp.readlen) {
+ rc_t const rc = SAM2BAM_ConvertQUAL(i, temp.QUAL, endp);
+ if (rc) {
+ LOGERR(klogErr, rc, "SAM Record error converting QUAL");
+ field = 0;
+ }
+ }
+ else {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error length of SEQ != length of QUAL");
+ field = 0;
+ }
+ scratch += temp.readlen;
+ break;
+ default:
+ {
+ int const n = SAM2BAM_ConvertEXTRA(i, scratch, endp);
+ if (n < 0) {
+ LOGERR(klogErr, RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid), "SAM Record error parsing optional field");
+ field = 0;
+ }
+ else {
+ if (n == 0)
+ --field;
+ else
+ scratch += n;
+ }
+ break;
+ }
+ }
+ if (ch == '\n') {
+ if (field < 11) {
+ rc_t const rc = RC(rcAlign, rcFile, rcReading, rcRow, rcTooShort);
+ LOGERR(klogErr, rc, "SAM Record error too few fields");
+ return rc;
+ }
+ break;
+ }
+ i = 0;
+ if (field > 0)
+ ++field;
+ }
+
+ SAM2BAM_ConvertInt(raw->rID, temp.RNAME);
+ SAM2BAM_ConvertInt(raw->pos, temp.POS - 1);
+ raw->read_name_len = temp.namelen;
+ raw->mapQual = temp.MAPQ;
+ SAM2BAM_ConvertShort(raw->n_cigars, temp.cigars);
+ SAM2BAM_ConvertShort(raw->flags, temp.FLAG);
+ SAM2BAM_ConvertInt(raw->read_len, temp.readlen);
+ SAM2BAM_ConvertInt(raw->mate_rID, temp.RNEXT);
+ SAM2BAM_ConvertInt(raw->mate_pos, temp.PNEXT - 1);
+ SAM2BAM_ConvertInt(raw->ins_size, temp.TLEN);
+ {
+ unsigned const datasize = (char *)scratch - (char *)self->buffer;
+ unsigned const rsltsize = BAM_AlignmentSizeFromData(datasize, self->buffer);
+ BAM_Alignment *const y = malloc(rsltsize);
+
+ if (y == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+ if (BAM_AlignmentInitLog(y, rsltsize, datasize, self->buffer)) {
+ y->parent = self;
+ rslt[0] = y;
+
+ if (BAM_AlignmentIsEmpty(y))
+ return RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+ return 0;
+ }
+ free(y);
+ }
+ return RC(rcAlign, rcFile, rcReading, rcRow, rcInvalid);
+}
+
+static rc_t read2(BAM_File *const self, BAM_Alignment const **const rhs)
+{
+ unsigned actsize = 0;
+ rc_t rc;
+
+ if (self->bufCurrent >= self->bufSize && self->eof)
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+
+ if (self->isSAM) {
+ rc = BAM_FileReadSAM(self, rhs);
+ if (rc != 0 && GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
+ self->eof = true;
+ return rc;
+ }
+ if (self->nocopy == NULL) {
+ size_t const size = 64u * 1024u;
+ void *const temp = malloc(size);
+
+ if (temp == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+ self->nocopy = temp;
+ }
+
+ rc = BAM_FileReadNoCopy(self, &actsize, self->nocopy, 64u * 1024u);
+ if (rc == 0) {
+ *rhs = self->nocopy;
+ if (BAM_AlignmentIsEmpty(self->nocopy)) {
+ rc = RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+ LOGERR(klogWarn, rc, "BAM Record contains no alignment or sequence data");
+ }
+ }
+ else if ((int)GetRCObject(rc) == rcBuffer && GetRCState(rc) == rcInsufficient)
+ {
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ }
+ else if ((int)GetRCObject(rc) == rcBuffer && GetRCState(rc) == rcNotAvailable)
+ {
+ rc = BAM_FileReadCopy(self, rhs, true);
+ }
+ else if ((int)GetRCObject(rc) == rcRow && GetRCState(rc) == rcInvalid) {
+ BAM_AlignmentLogParseError(self->nocopy);
+ }
+ return rc;
+}
+
+static rc_t readDefer(BAM_File *const self, BAM_Alignment const **const rslt)
+{
+ uint32_t datasize = 0;
+ size_t nread = 0;
+ rc_t rc = 0;
+
+ rc = KFileReadAll(self->defer, self->deferPos, &datasize, 4, &nread);
+ if (rc) return rc;
+ if (nread == 0) {
+ KFileRelease(self->defer);
+ self->defer = NULL;
+ return SILENT_RC(rcAlign, rcFile, rcReading, rcRow, rcNotFound);
+ }
+ assert(nread == 4);
+ assert(datasize < 64u * 1024u);
+ if (self->nocopy == NULL) {
+ size_t const size = 64u * 1024u;
+ void *const temp = malloc(size);
+
+ if (temp == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+
+ self->nocopy = temp;
+ }
+
+ rc = KFileReadAll(self->defer, self->deferPos + 4, self->buffer, datasize, &nread);
+ if (rc) return rc;
+ assert(nread == datasize);
+ self->deferPos += 4 + datasize;
+
+ BAM_AlignmentInitLog(self->nocopy, 64u * 1024u, datasize, self->buffer);
+ self->nocopy->parent = self;
+ *rslt = self->nocopy;
+ if (BAM_AlignmentIsEmpty(self->nocopy)) {
+ rc = RC(rcAlign, rcFile, rcReading, rcRow, rcEmpty);
+ LOGERR(klogWarn, rc, "BAM Record contains no alignment or sequence data");
+ }
+ return rc;
+}
+
+static rc_t writeExactly(KFile *const f, uint64_t const pos, void const *const data, size_t const size) {
+ char const *const p = (char const *)data;
+ size_t written = 0;
+
+ while (written < size) {
+ size_t num_writ = 0;
+ rc_t const rc = KFileWrite(f, pos + written, p + written, size - written, &num_writ);
+ if (rc) return rc;
+ written += num_writ;
+ }
+ return 0;
+}
+
+static rc_t writeDefer(BAM_File *const self, BAM_Alignment const *const algn)
+{
+ rc_t rc = 0;
+
+ rc = writeExactly(self->defer, self->deferPos, &algn->datasize, 4);
+ if (rc) return rc;
+ rc = writeExactly(self->defer, self->deferPos + 4, algn->data, algn->datasize);
+ if (rc) return rc;
+ self->deferPos += 4 + algn->datasize;
+ return 0;
+}
+
+rc_t BAM_FileRead2(const BAM_File *cself, const BAM_Alignment **rhs)
+{
+ BAM_File *const self = (BAM_File *)cself;
+
+ if (self == NULL || rhs == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+
+ *rhs = NULL;
+
+ if (self->eof && self->defer != NULL) {
+ return readDefer(self, rhs);
+ }
+ for ( ; ; ) {
+ rc_t const rc = read2(self, rhs);
+ if (rc != 0) {
+ if (self->eof && self->defer != NULL) {
+ self->deferPos = 0;
+ return readDefer(self, rhs);
+ }
+ return rc;
+ }
+ if (self->defer && BAM_AlignmentShouldDefer(*rhs)) {
+ rc_t const rc = writeDefer(self, *rhs);
+ if (rc) return rc;
+ }
+ else
+ break;
+ }
+ return 0;
+}
+
+rc_t BAM_FileRead(const BAM_File *cself, const BAM_Alignment **rhs)
+{
+ assert(!"deprecated");
+ abort();
+}
+
+/* MARK: BAM File header info accessor */
+
+rc_t BAM_FileGetRefSeqById(const BAM_File *cself, int32_t id, const BAMRefSeq **rhs)
+{
+ *rhs = NULL;
+ if (id >= 0 && id < cself->refSeqs)
+ *rhs = &cself->refSeq[id];
+ return 0;
+}
+
+rc_t BAM_FileGetReadGroupByName(const BAM_File *cself, const char *name, const BAMReadGroup **rhs)
+{
+ BAMReadGroup rg;
+
+ *rhs = NULL;
+
+ rg.name = name;
+ if (rg.name != NULL)
+ *rhs = kbsearch(&rg, cself->readGroup, cself->readGroups, sizeof(rg), comp_ReadGroup, NULL);
+
+ return 0;
+}
+
+rc_t BAM_FileGetRefSeqCount(const BAM_File *cself, unsigned *rhs)
+{
+ *rhs = cself->refSeqs;
+ return 0;
+}
+
+rc_t BAM_FileGetRefSeq(const BAM_File *cself, unsigned i, const BAMRefSeq **rhs)
+{
+ *rhs = NULL;
+ if (i < cself->refSeqs)
+ *rhs = &cself->refSeq[i];
+ return 0;
+}
+
+rc_t BAM_FileGetReadGroupCount(const BAM_File *cself, unsigned *rhs)
+{
+ *rhs = cself->readGroups;
+ return 0;
+}
+
+rc_t BAM_FileGetReadGroup(const BAM_File *cself, unsigned i, const BAMReadGroup **rhs)
+{
+ *rhs = NULL;
+ if (i < cself->readGroups)
+ *rhs = &cself->readGroup[i];
+ return 0;
+}
+
+rc_t BAM_FileGetHeaderText(BAM_File const *cself, char const **header, size_t *header_len)
+{
+ *header = cself->header;
+ *header_len = *header ? string_size( *header ) : 0;
+ return 0;
+}
+
+/* MARK: BAM Alignment destructor */
+
+static rc_t BAM_AlignmentWhack(BAM_Alignment *self)
+{
+ if (self != self->parent->nocopy) {
+ free(self->storage);
+ free(self);
+ }
+ return 0;
+}
+
+/* MARK: BAM Alignment ref-counting */
+
+rc_t BAM_AlignmentAddRef(const BAM_Alignment *cself)
+{
+ return 0;
+}
+
+rc_t BAM_AlignmentRelease(const BAM_Alignment *cself)
+{
+ BAM_AlignmentWhack((BAM_Alignment *)cself);
+
+ return 0;
+}
+
+rc_t BAM_AlignmentCopy(const BAM_Alignment *self, BAM_Alignment **rslt)
+{
+ unsigned const rsltsize = BAM_AlignmentSize(self->numExtra);
+ unsigned const padded = (rsltsize + 15UL) & ~15UL;
+ void *const tmp = malloc(padded + self->datasize);
+ void *const tmp2 = &((char *)tmp)[padded];
+
+ assert(tmp != NULL);
+ if (tmp == NULL) {
+ LOGMSG(klogFatal, "OUT OF MEMORY");
+ abort();
+ }
+ memmove(tmp, self, rsltsize);
+ memmove(tmp2, self->data, self->datasize);
+ *rslt = tmp;
+ (**rslt).data = tmp2;
+ (**rslt).storage = NULL;
+
+ return 0;
+}
+
+static bool BAM_AlignmentShouldDefer(BAM_Alignment const *const self)
+{
+ int const flags = getFlags(self);
+ if (flags & BAMFlags_SelfIsUnmapped)
+ return false;
+ if (flags & BAMFlags_IsNotPrimary)
+ return true;
+ if (flags & BAMFlags_IsSupplemental)
+ return true;
+ return false;
+}
+
+#if 0
+uint16_t BAM_AlignmentIffyFields(const BAM_Alignment *self)
+{
+}
+
+uint16_t BAM_AlignmentBadFields(const BAM_Alignment *self)
+{
+}
+#endif
+
+/* MARK: BAM Alignment accessors */
+
+static uint32_t BAM_AlignmentGetCigarElement(const BAM_Alignment *self, unsigned i)
+{
+ return LE2HUI32(&((uint8_t const *)getCigarBase(self))[i * 4]);
+}
+
+rc_t BAM_AlignmentGetRefSeqId(const BAM_Alignment *cself, int32_t *rhs)
+{
+ *rhs = getRefSeqId(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetPosition(const BAM_Alignment *cself, int64_t *rhs)
+{
+ *rhs = getPosition(cself);
+ return 0;
+}
+
+bool BAM_AlignmentIsMapped(const BAM_Alignment *cself)
+{
+ if (((getFlags(cself) & BAMFlags_SelfIsUnmapped) == 0) && getRefSeqId(cself) >= 0 && getPosition(cself) >= 0)
+ return true;
+ return false;
+}
+
+/* static bool BAM_AlignmentIsMateMapped(const BAM_Alignment *cself)
+{
+ if (((getFlags(cself) & BAMFlags_MateIsUnmapped) == 0) && getMateRefSeqId(cself) >= 0 && getMatePos(cself) >= 0)
+ return true;
+ return false;
+} */
+
+rc_t BAM_AlignmentGetAlignmentDetail(
+ const BAM_Alignment *self,
+ BAM_AlignmentDetail *rslt, uint32_t count, uint32_t *actual,
+ int32_t *pfirst, int32_t *plast
+ )
+{
+ unsigned i;
+ unsigned ccnt; /* cigar count */
+ int32_t gpos; /* refSeq pos in global coordinates */
+ unsigned rpos; /* read pos (always local coordinates) */
+ uint32_t rlen; /* read length */
+ int32_t first = -1;
+ int32_t last = -1;
+
+ if (!self)
+ return RC(rcAlign, rcFile, rcReading, rcSelf, rcNull);
+
+ rlen = getReadLen(self);
+ ccnt = getCigarCount(self);
+ gpos = getPosition(self);
+
+ if (gpos < 0)
+ ccnt = 0;
+
+ if (actual)
+ *actual = ccnt;
+
+ if (pfirst)
+ *pfirst = -1;
+
+ if (plast)
+ *plast = -1;
+
+ if (ccnt == 0)
+ return 0;
+
+ if (rslt == NULL) {
+ if (actual == NULL)
+ return RC(rcAlign, rcFile, rcReading, rcParam, rcNull);
+ count = 0;
+ }
+
+ if (count < ccnt)
+ return RC(rcAlign, rcFile, rcReading, rcBuffer, rcInsufficient);
+
+ for (rpos = 0, i = 0; i != ccnt; ++i) {
+ uint32_t len = BAM_AlignmentGetCigarElement(self, i);
+ int op = len & 0x0F;
+
+ if (op > sizeof(cigarChars))
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+
+ op = cigarChars[op];
+ len >>= 4;
+
+ rslt[i].refSeq_pos = gpos;
+ rslt[i].read_pos = rpos;
+ rslt[i].length = len;
+ rslt[i].type = (BAMCigarType)op;
+
+ switch ((BAMCigarType)op) {
+ case ct_Match:
+ case ct_Equal:
+ if (first == -1)
+ first = i;
+ last = i;
+ gpos += len;
+ rpos += len;
+ break;
+ case ct_Insert:
+ case ct_SoftClip:
+ gpos += len;
+ break;
+ case ct_Delete:
+ case ct_Skip:
+ rpos += len;
+ break;
+ case ct_HardClip:
+ case ct_Padded:
+ rslt[i].refSeq_pos = -1;
+ rslt[i].read_pos = -1;
+ break;
+ default:
+ break;
+ }
+
+ if (rslt[i].read_pos > rlen)
+ return RC(rcAlign, rcFile, rcReading, rcData, rcInvalid);
+ }
+ if (pfirst)
+ *pfirst = first;
+
+ if (plast)
+ *plast = last;
+
+ return 0;
+}
+
+static
+unsigned ReferenceLengthFromCIGAR(const BAM_Alignment *self)
+{
+ unsigned i;
+ unsigned n = getCigarCount(self);
+ unsigned y;
+
+ for (i = 0, y = 0; i != n; ++i) {
+ uint32_t const len = BAM_AlignmentGetCigarElement(self, i);
+
+ switch (cigarChars[len & 0x0F]) {
+ case ct_Match:
+ case ct_Equal:
+ case ct_NotEqual:
+ case ct_Delete:
+ case ct_Skip:
+ y += len >> 4;
+ break;
+ default:
+ break;
+ }
+ }
+ return y;
+}
+
+static unsigned SequenceLengthFromCIGAR(const BAM_Alignment *self)
+{
+ unsigned i;
+ unsigned n = getCigarCount(self);
+ unsigned y;
+
+ for (i = 0, y = 0; i != n; ++i) {
+ uint32_t const len = BAM_AlignmentGetCigarElement(self, i);
+
+ switch (cigarChars[len & 0x0F]) {
+ case ct_Match:
+ case ct_Equal:
+ case ct_NotEqual:
+ case ct_Insert:
+ case ct_SoftClip:
+ y += len >> 4;
+ break;
+ default:
+ break;
+ }
+ }
+ return y;
+}
+
+rc_t BAM_AlignmentGetPosition2(const BAM_Alignment *cself, int64_t *rhs, uint32_t *length)
+{
+ *rhs = getPosition(cself);
+ if (*rhs >= 0)
+ *length = ReferenceLengthFromCIGAR(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetReadGroupName(const BAM_Alignment *cself, const char **rhs)
+{
+ *rhs = get_RG(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetReadName(const BAM_Alignment *cself, const char **rhs)
+{
+ *rhs = getReadName(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetReadName2(const BAM_Alignment *cself, const char **rhs, size_t *length)
+{
+ *length = getReadNameLength(cself) - 1;
+ *rhs = getReadName(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetReadName3(const BAM_Alignment *cself, const char **rhs, size_t *length)
+{
+ char const *const name = getReadName(cself);
+ size_t len = getReadNameLength(cself);
+ size_t i;
+
+ for (i = len; i; ) {
+ int const ch = name[--i];
+
+ if (ch == '/') {
+ len = i;
+ break;
+ }
+ if (!isdigit(ch))
+ break;
+ }
+ *rhs = name;
+ *length = len;
+
+ return 0;
+}
+
+rc_t BAM_AlignmentGetFlags(const BAM_Alignment *cself, uint16_t *rhs)
+{
+ *rhs = getFlags(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetMapQuality(const BAM_Alignment *cself, uint8_t *rhs)
+{
+ *rhs = getMapQual(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetCigarCount(const BAM_Alignment *cself, unsigned *rhs)
+{
+ *rhs = getCigarCount(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetRawCigar(const BAM_Alignment *cself, uint32_t const *rslt[], uint32_t *length)
+{
+ *rslt = getCigarBase(cself);
+ *length = getCigarCount(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetCigar(const BAM_Alignment *cself, uint32_t i, BAMCigarType *type, uint32_t *length)
+{
+ uint32_t x;
+
+ if (i >= getCigarCount(cself))
+ return RC(rcAlign, rcFile, rcReading, rcParam, rcInvalid);
+
+ x = BAM_AlignmentGetCigarElement(cself, i);
+ *type = (BAMCigarType)(cigarChars[x & 0x0F]);
+ *length = x >> 4;
+ return 0;
+}
+
+rc_t BAM_AlignmentGetReadLength(const BAM_Alignment *cself, uint32_t *rhs)
+{
+ *rhs = getReadLen(cself);
+ return 0;
+}
+
+static int get1Base(BAM_Alignment const *const self, unsigned const i)
+{
+/*
+ * = A C M G R S V T W Y H K D B N
+ * 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
+ * 1111 1000 0100 1100 0010 1010 0110 1110 0001 1001 0101 1101 0011 1011 0111 0000
+ * N T G K C Y S B A W R D M H V =
+ */
+ static const char tr[16] = "=ACMGRSVTWYHKDBN";
+/* static const char ctr[16] = "=TGKCYSBAWRDMHVN"; */
+ uint8_t const *const seq = &self->data->raw[self->seq];
+ unsigned const b4na2 = seq[i >> 1];
+ unsigned const b4na = (i & 1) == 0 ? (b4na2 >> 4) : (b4na2 & 0x0F);
+
+ return tr[b4na];
+}
+
+static int get1Qual(BAM_Alignment const *const self, unsigned const i)
+{
+ uint8_t const *const src = &self->data->raw[self->qual];
+
+ return src[i];
+}
+
+rc_t BAM_AlignmentGetSequence2(const BAM_Alignment *cself, char *rhs, uint32_t start, uint32_t stop)
+{
+ unsigned const n = getReadLen(cself);
+ unsigned si, di;
+
+ if (stop == 0 || stop > n)
+ stop = n;
+
+ for (di = 0, si = start; si != stop; ++si, ++di) {
+ rhs[di] = get1Base(cself, si);
+ }
+ return 0;
+}
+
+rc_t BAM_AlignmentGetSequence(const BAM_Alignment *cself, char *rhs)
+{
+ return BAM_AlignmentGetSequence2(cself, rhs, 0, 0);
+}
+
+bool BAM_AlignmentHasColorSpace(BAM_Alignment const *cself)
+{
+ return get_CS(cself) != NULL;
+}
+
+rc_t BAM_AlignmentGetCSKey(BAM_Alignment const *cself, char rhs[1])
+{
+ char const *const vCS = get_CS(cself);
+
+ if (vCS)
+ rhs[0] = vCS[0];
+ return 0;
+}
+
+rc_t BAM_AlignmentGetCSSeqLen(BAM_Alignment const *cself, uint32_t *rhs)
+{
+ struct offset_size_s const *const vCS = get_CS_info(cself);
+
+ *rhs = vCS ? vCS->size - 5 : 0;
+ return 0;
+}
+
+rc_t BAM_AlignmentGetCSSequence(BAM_Alignment const *cself, char rhs[], uint32_t seqlen)
+{
+ char const *const vCS = get_CS(cself);
+
+ if (vCS) {
+ unsigned i;
+
+ for (i = 0;i != seqlen; ++i) {
+ char const ch = vCS[i+1];
+
+ rhs[i] = (ch == '4') ? '.' : ch;
+ }
+ }
+ return 0;
+}
+
+rc_t BAM_AlignmentGetQuality(const BAM_Alignment *cself, const uint8_t **rhs)
+{
+ *rhs = &cself->data->raw[cself->qual];
+ return 0;
+}
+
+rc_t BAM_AlignmentGetQuality2(BAM_Alignment const *cself, uint8_t const **rhs, uint8_t *offset)
+{
+ uint8_t const *const OQ = get_OQ(cself);
+
+ if (OQ) {
+ struct offset_size_s const *const oq = get_OQ_info(cself);
+
+ if (oq->size - 4 == getReadLen(cself)) {
+ *offset = 33;
+ *rhs = OQ;
+ }
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInconsistent);
+ }
+ else {
+ *offset = 0;
+ *rhs = &cself->data->raw[cself->qual];
+ }
+ return 0;
+}
+
+rc_t BAM_AlignmentGetCSQuality(BAM_Alignment const *cself, uint8_t const **rhs, uint8_t *offset)
+{
+ struct offset_size_s const *const cs = get_CS_info(cself);
+ struct offset_size_s const *const cq = get_CQ_info(cself);
+ uint8_t const *const CQ = get_CQ(cself);
+
+ if (cs && cq && CQ) {
+ if (cs->size == cq->size) {
+ *offset = 33;
+ *rhs = CQ + 1;
+ return 0;
+ }
+ if (cs->size == cq->size + 1) {
+ *offset = 33;
+ *rhs = CQ;
+ return 0;
+ }
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInconsistent);
+ }
+ *offset = 0;
+ *rhs = &cself->data->raw[cself->qual];
+ return 0;
+}
+
+rc_t BAM_AlignmentGetMateRefSeqId(const BAM_Alignment *cself, int32_t *rhs)
+{
+ *rhs = getMateRefSeqId(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetMatePosition(const BAM_Alignment *cself, int64_t *rhs)
+{
+ *rhs = getMatePos(cself);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetInsertSize(const BAM_Alignment *cself, int64_t *rhs)
+{
+ *rhs = getInsertSize(cself);
+ return 0;
+}
+
+static int FormatOptData(BAM_Alignment const *const self,
+ size_t const maxsize,
+ char buffer[])
+{
+ char const *const base = (char const *)&self->data->raw[self->qual + getReadLen(self)];
+ unsigned i;
+ unsigned offset;
+ unsigned cur = 0;
+ int j;
+
+ for (i = 0, offset = 0; i < self->numExtra; ++i) {
+ int type;
+ union { float f; uint32_t i; } fi;
+
+ if (cur + 7 > maxsize)
+ return -1;
+ buffer[cur++] = '\t';
+ buffer[cur++] = base[offset++];
+ buffer[cur++] = base[offset++];
+ buffer[cur++] = ':';
+ type = base[offset++];
+
+ switch (type) {
+ case dt_ASCII: /* A */
+ buffer[cur++] = 'A';
+ buffer[cur++] = ':';
+ buffer[cur++] = base[offset++];
+ break;
+
+ case dt_INT8: /* c */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)*((int8_t const *)(base + offset)));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 1;
+ break;
+
+ case dt_UINT8: /* C */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)*((uint8_t const *)(base + offset)));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 1;
+ break;
+
+ case dt_INT16: /* s */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI16(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 2;
+ break;
+
+ case dt_UINT16: /* S */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI16(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 2;
+ break;
+
+ case dt_INT: /* i */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 4;
+ break;
+
+ case dt_UINT: /* I */
+ buffer[cur++] = 'i';
+ buffer[cur++] = ':';
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 4;
+ break;
+
+ case dt_FLOAT32: /* f */
+ buffer[cur++] = 'f';
+ buffer[cur++] = ':';
+ fi.i = LE2HUI32(base + offset);
+ j = snprintf(buffer + cur, maxsize - cur, "%f", fi.f);
+ if ((cur += j) >= maxsize)
+ return -1;
+ while (buffer[cur - 1] == '0')
+ --cur;
+ if (buffer[cur - 1] == '.')
+ --cur;
+ offset += 4;
+ break;
+
+ case dt_HEXSTRING: /* H */
+ case dt_CSTRING: /* Z */
+ buffer[cur++] = type == dt_CSTRING ? 'Z' : 'H';
+ buffer[cur++] = ':';
+ for ( ; ; ) {
+ int const ch = base[offset++];
+
+ if (ch == '\0')
+ break;
+ if (cur >= maxsize)
+ return -1;
+ buffer[cur++] = ch;
+ }
+ break;
+
+ case dt_NUM_ARRAY: /* B */
+ buffer[cur++] = 'B';
+ buffer[cur++] = ':';
+ {
+ int const elemtype = base[offset++];
+ unsigned const elemcount = LE2HUI32(base + offset);
+ unsigned k;
+
+ if (cur + 2 >= maxsize)
+ return -1;
+ buffer[cur++] = elemtype;
+ offset += 4;
+ for (k = 0; k < elemcount; ++k) {
+ buffer[cur++] = ',';
+ switch (elemtype) {
+ case dt_INT8:
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)*((int8_t const *)(base + offset)));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 1;
+ break;
+
+ case dt_UINT8:
+ j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)*((uint8_t const *)(base + offset)));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 1;
+ break;
+
+ case dt_INT16:
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI16(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 2;
+ break;
+
+ case dt_UINT16:
+ j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI16(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 2;
+ break;
+
+ case dt_INT:
+ j = snprintf(buffer + cur, maxsize - cur, "%i", (int)LE2HI32(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 4;
+ break;
+
+ case dt_UINT:
+ j = snprintf(buffer + cur, maxsize - cur, "%u", (unsigned)LE2HUI32(base + offset));
+ if ((cur += j) >= maxsize)
+ return -1;
+ offset += 4;
+ break;
+
+ case dt_FLOAT32:
+ fi.i = LE2HUI32(base + offset);
+ j = snprintf(buffer + cur, maxsize - cur, "%f", fi.f);
+ if ((cur += j) >= maxsize)
+ return -1;
+ while (buffer[cur - 1] == '0')
+ --cur;
+ if (buffer[cur - 1] == '.')
+ --cur;
+ offset += 4;
+ break;
+
+ default:
+ return -1;
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ return -1;
+ break;
+ }
+ }
+ return cur;
+}
+
+static rc_t FormatSAM(BAM_Alignment const *self,
+ size_t *const actsize,
+ size_t const maxsize,
+ char *const buffer)
+{
+ int i = 0;
+ size_t cur = 0;
+ unsigned j;
+ int const refSeqId = getRefSeqId(self);
+ int const refPos = getPosition(self);
+ unsigned const cigCount = getCigarCount(self);
+ uint32_t const *const cigar = getCigarBase(self);
+ int const mateRefSeqId = getMateRefSeqId(self);
+ int const mateRefPos = getMatePos(self);
+ unsigned const readlen = getReadLen(self);
+
+ i = snprintf(&buffer[cur], maxsize - cur,
+ "%s\t%i\t%s\t%i\t%i\t",
+ getReadName(self),
+ getFlags(self),
+ refSeqId < 0 ? "*" : self->parent->refSeq[refSeqId].name,
+ refPos < 0 ? 0 : refPos + 1,
+ getMapQual(self)
+ );
+ if ((cur += i) > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+
+ if (cigCount > 0) {
+ for (j = 0; j < cigCount; ++j) {
+ uint32_t const el = cigar[j];
+ BAMCigarType const type = (BAMCigarType)(cigarChars[el & 0x0F]);
+ unsigned const length = el >> 4;
+
+ i = snprintf(&buffer[cur], maxsize - cur, "%u%c", length, type);
+ if ((cur += i) > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ }
+ }
+ else {
+ if ((cur + 1) > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ buffer[cur++] = '*';
+ }
+ i = snprintf(&buffer[cur], maxsize - cur,
+ "\t%s\t%i\t%i\t",
+ mateRefSeqId < 0 ? "*" : mateRefSeqId == refSeqId ? "=" : self->parent->refSeq[mateRefSeqId].name,
+ mateRefPos < 0 ? 0 : mateRefPos + 1,
+ getInsertSize(self)
+ );
+ if ((cur += i) > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ if (readlen) {
+ uint8_t const *const qual = &self->data->raw[self->qual];
+
+ if (cur + 2 * readlen + 1 > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ BAM_AlignmentGetSequence(self, &buffer[cur]);
+ cur += readlen;
+ buffer[cur] = '\t';
+ ++cur;
+
+ for (j = 0; j < readlen; ++j) {
+ if (qual[j] != 0xFF)
+ goto HAS_QUAL;
+ }
+ if (1) {
+ buffer[cur++] = '*';
+ }
+ else {
+ HAS_QUAL:
+ for (j = 0; j < readlen; ++j)
+ buffer[cur++] = qual[j] + 33;
+ }
+ }
+ else {
+ i = snprintf(&buffer[cur], maxsize - cur, "*\t*");
+ if ((cur += i) > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ }
+ i = FormatOptData(self, maxsize - cur, &buffer[cur]);
+ if (i < 0)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ if ((cur += i) + 2 > maxsize)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcExcessive);
+ buffer[cur++] = '\n';
+ buffer[cur] = '\0';
+ *actsize = cur;
+
+ return 0;
+}
+
+#define FORMAT_SAM_SCRATCH_SIZE ((size_t)(64u * 1024u))
+static rc_t FormatSAMBuffer(BAM_Alignment const *self,
+ size_t actSize[],
+ size_t const maxsize,
+ char *const buffer)
+{
+ char scratch[FORMAT_SAM_SCRATCH_SIZE];
+ size_t actsize = 0;
+ rc_t const rc = FormatSAM(self, &actsize, FORMAT_SAM_SCRATCH_SIZE, scratch);
+
+ actSize[0] = actsize;
+ if (rc) return rc;
+
+ if (actsize > maxsize)
+ return RC(rcAlign, rcReading, rcRow, rcBuffer, rcInsufficient);
+
+ memmove(buffer, scratch, actsize);
+ return 0;
+}
+
+rc_t BAM_AlignmentFormatSAM(BAM_Alignment const *self,
+ size_t *const actSize,
+ size_t const maxsize,
+ char *const buffer)
+{
+ if (self == NULL)
+ return RC(rcAlign, rcReading, rcRow, rcSelf, rcNull);
+ if (buffer == NULL)
+ return RC(rcAlign, rcReading, rcRow, rcParam, rcNull);
+ else {
+ size_t actsize = 0;
+ rc_t const rc = (maxsize < FORMAT_SAM_SCRATCH_SIZE ? FormatSAMBuffer : FormatSAM)(self, &actsize, maxsize, buffer);
+
+ if (actSize)
+ *actSize = actsize;
+ return rc;
+ }
+}
+
+typedef struct OptForEach_ctx_s {
+ BAMOptData *val;
+ BAMOptData **alloced;
+ size_t valsize;
+ rc_t rc;
+ BAMOptionalDataFunction user_f;
+ void *user_ctx;
+} OptForEach_ctx_t;
+
+static bool i_OptDataForEach(BAM_Alignment const *cself, void *Ctx, char const tag[2], BAMOptDataValueType type, unsigned count, void const *value, unsigned size)
+{
+ OptForEach_ctx_t *ctx = (OptForEach_ctx_t *)Ctx;
+ size_t const need = (size_t)&((BAMOptData const *)NULL)->u.f64[(count * size + sizeof(double) - 1)/sizeof(double)];
+
+ if (need > ctx->valsize) {
+ void *const temp = realloc(ctx->alloced, need);
+ if (temp == NULL) {
+ ctx->rc = RC(rcAlign, rcFile, rcReading, rcMemory, rcExhausted);
+ return true;
+ }
+ *ctx->alloced = ctx->val = temp;
+ ctx->valsize = need;
+ }
+ ctx->val->type = type;
+ ctx->val->element_count = (type == dt_CSTRING || type == dt_HEXSTRING) ? size - 1 : count;
+
+ memmove(ctx->val->u.u8, value, size * count);
+#if __BYTE_ORDER == __BIG_ENDIAN
+ {{
+ unsigned di;
+ uint32_t elem_count = ctx->val->element_count;
+
+ switch (size) {
+ case 2:
+ for (di = 0; di != elem_count; ++di)
+ ctx->val->u.u16[di] = LE2HUI16(&ctx->val->u.u16[di]);
+ break;
+ case 4:
+ for (di = 0; di != elem_count; ++di)
+ ctx->val->u.u32[di] = LE2HUI32(&ctx->val->u.u32[di]);
+ break;
+ case 8:
+ for (di = 0; di != elem_count; ++di)
+ ctx->val->u.u64[di] = LE2HUI64(&ctx->val->u.u64[di]);
+ break;
+ }
+ }}
+#endif
+ ctx->rc = ctx->user_f(ctx->user_ctx, tag, ctx->val);
+ return ctx->rc != 0;
+}
+
+rc_t BAM_AlignmentOptDataForEach(const BAM_Alignment *cself, void *user_ctx, BAMOptionalDataFunction f)
+{
+ union u {
+ BAMOptData value;
+ uint8_t storage[4096];
+ } value_auto;
+ OptForEach_ctx_t ctx;
+ rc_t rc = 0;
+ unsigned i;
+
+ ctx.val = &value_auto.value;
+ ctx.alloced = NULL;
+ ctx.valsize = sizeof(value_auto);
+ ctx.rc = 0;
+ ctx.user_f = f;
+ ctx.user_ctx = user_ctx;
+
+ for (i = 0; i != cself->numExtra; ++i) {
+ char const *const tag = (char const *)&cself->data->raw[cself->extra[i].offset];
+ uint8_t type = tag[2];
+ uint8_t const *const vp = (uint8_t const *)&tag[3];
+ unsigned len = cself->extra[i].size - 3;
+ unsigned size = cself->extra[i].size - 3;
+ unsigned count = 1;
+ unsigned offset = 0;
+
+ if (type == dt_NUM_ARRAY) {
+ unsigned elem_size = 0;
+ uint32_t elem_count = 0;
+
+ offset = len = 5;
+ switch (vp[0]) {
+ case dt_INT8:
+ case dt_UINT8:
+ elem_size = 1;
+ break;
+ case dt_INT16:
+ case dt_UINT16:
+ elem_size = 2;
+ break;
+ case dt_FLOAT32:
+ case dt_INT:
+ case dt_UINT:
+ elem_size = 4;
+ break;
+#if 0
+ case dt_FLOAT64:
+ elem_size = 8;
+ break;
+#endif
+ default:
+ rc = RC(rcAlign, rcFile, rcReading, rcData, rcUnexpected);
+ break;
+ }
+ if (rc)
+ break;
+ elem_count = LE2HUI32(&vp[1]);
+ len += elem_size * elem_count;
+ type = vp[0];
+ count = elem_count;
+ size = elem_size;
+ break;
+ }
+ if (i_OptDataForEach(cself, &ctx, tag, type, count, &vp[offset], size))
+ break;
+ }
+ rc = rc ? rc : ctx.rc;
+ if (ctx.alloced)
+ free(ctx.alloced);
+ return rc;
+}
+
+/* MARK: Complete Genomics stuff */
+
+bool BAM_AlignmentHasCGData(BAM_Alignment const *self)
+{
+ return get_CG_GC_info(self) && get_CG_GS_info(self) && get_CG_GQ_info(self);
+}
+
+rc_t BAM_AlignmentCGReadLength(BAM_Alignment const *self, uint32_t *readlen)
+{
+ struct offset_size_s const *const GCi = get_CG_GC_info(self);
+ struct offset_size_s const *const GSi = get_CG_GS_info(self);
+ struct offset_size_s const *const GQi = get_CG_GQ_info(self);
+
+ if (GCi && GSi && GQi) {
+ char const *GS = (char const *)&self->data->raw[GSi->offset + 3];
+ char const *GQ = (char const *)&self->data->raw[GQi->offset + 3];
+ char const *GC = (char const *)&self->data->raw[GCi->offset + 3];
+ unsigned oplen = 0;
+ unsigned i;
+ unsigned di = 0;
+ unsigned si = 0;
+
+ for (i = 0; ; ++i) {
+ int const ch = GC[i];
+
+ if (ch == '\0')
+ break;
+ if (isdigit(ch)) {
+ oplen = oplen * 10 + (ch - '0');
+ }
+ else if (ch != 'S' && ch != 'G')
+ return RC(rcAlign, rcRow, rcReading, rcData, rcUnexpected);
+ else {
+ unsigned const jmax = (ch == 'G') ? (oplen * 2) : oplen;
+ unsigned j;
+
+ if (ch == 'S') {
+ ;
+ }
+ else {
+ for (j = 0; j < jmax; ++j) {
+ int const base = *GS++;
+ int const qual = *GQ++;
+
+ switch (base) {
+ case 'A':
+ case 'C':
+ case 'M':
+ case 'G':
+ case 'R':
+ case 'S':
+ case 'V':
+ case 'T':
+ case 'W':
+ case 'Y':
+ case 'H':
+ case 'K':
+ case 'D':
+ case 'B':
+ case 'N':
+ break;
+ default:
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ }
+ if (qual < 33)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ }
+ }
+ si += oplen;
+ di += jmax;
+ oplen = 0;
+ }
+ }
+ if (*GS != '\0' || *GQ != '\0' || si != getReadLen(self))
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+
+ *readlen = di;
+ return 0;
+ }
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+static unsigned BAM_AlignmentParseCGTag(BAM_Alignment const *self, size_t const max_cg_segs, unsigned cg_segs[/* max_cg_segs */])
+{
+ struct offset_size_s const *const GCi = get_CG_GC_info(self);
+ char const *cur = (char const *)&self->data->raw[GCi->offset + 3];
+ unsigned i = 0;
+ int last_op = 0;
+
+ memset(cg_segs, 0, max_cg_segs * sizeof(cg_segs[0]));
+
+ while (*cur != '\0' && i < max_cg_segs) {
+ char *endp;
+ unsigned const op_len = (unsigned)strtol(cur, &endp, 10);
+ int const op = *endp;
+
+ cur = endp + 1;
+ if (op == last_op)
+ cg_segs[i - 1] += op_len;
+ else
+ cg_segs[i++] = op_len;
+ last_op = op;
+ }
+ return i;
+}
+
+static
+rc_t ExtractInt32(BAM_Alignment const *self, int32_t *result,
+ struct offset_size_s const *const tag)
+{
+ int64_t y;
+ int const type = self->data->raw[tag->offset + 2];
+ void const *const pvalue = &self->data->raw[tag->offset + 3];
+
+ switch (type) {
+ case 'c':
+ if (tag->size == 4)
+ y = *((int8_t const *)pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ case 'C':
+ if (tag->size == 4)
+ y = *((uint8_t const *)pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ case 's':
+ if (tag->size == 5)
+ y = LE2HI16(pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ case 'S':
+ if (tag->size == 5)
+ y = LE2HUI16(pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ case 'i':
+ if (tag->size == 7)
+ y = LE2HI32(pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ case 'I':
+ if (tag->size == 7)
+ y = LE2HUI32(pvalue);
+ else
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+ break;
+ default:
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+ }
+ if (INT32_MIN <= y && y <= INT32_MAX) {
+ *result = (int32_t)y;
+ return 0;
+ }
+ return RC(rcAlign, rcRow, rcReading, rcData, rcInvalid);
+}
+
+rc_t BAM_AlignmentGetCGAlignGroup(BAM_Alignment const *self,
+ char buffer[],
+ size_t max_size,
+ size_t *act_size)
+{
+ struct offset_size_s const *const ZA = get_CG_ZA_info(self);
+ struct offset_size_s const *const ZI = get_CG_ZI_info(self);
+
+ if (ZA && ZI) {
+ rc_t rc;
+ int32_t za;
+ int32_t zi;
+
+ rc = ExtractInt32(self, &za, ZA); if (rc) return rc;
+ rc = ExtractInt32(self, &zi, ZI); if (rc) return rc;
+ return string_printf(buffer, max_size, act_size, "%i_%i", zi, za);
+ }
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+rc_t BAM_AlignmentGetCGSeqQual(BAM_Alignment const *self,
+ char sequence[],
+ uint8_t quality[])
+{
+ struct offset_size_s const *const GCi = get_CG_GC_info(self);
+ struct offset_size_s const *const GSi = get_CG_GS_info(self);
+ struct offset_size_s const *const GQi = get_CG_GQ_info(self);
+
+ if (GCi && GSi && GQi) {
+ char const *GS = (char const *)&self->data->raw[GSi->offset + 3];
+ char const *GQ = (char const *)&self->data->raw[GQi->offset + 3];
+ char const *GC = (char const *)&self->data->raw[GCi->offset + 3];
+ unsigned oplen = 0;
+ unsigned di = 0;
+ unsigned si = 0;
+
+ for ( ; ; ) {
+ int const ch = *GC++;
+
+ if (ch == '\0')
+ break;
+ if (isdigit(ch)) {
+ oplen = oplen * 10 + (ch - '0');
+ continue;
+ }
+ if (ch == 'S') {
+ unsigned i;
+
+ for (i = 0; i < oplen; ++i, ++di, ++si) {
+ unsigned const base = get1Base(self, si);
+ unsigned const qual = get1Qual(self, si);
+
+ sequence[di] = base;
+ quality [di] = qual;
+ }
+ }
+ else {
+ unsigned i;
+
+ for (i = 0; i < oplen * 2; ++i, ++di) {
+ unsigned const base = *GS++;
+ unsigned const qual = *GQ++ - 33;
+
+ sequence[di] = base;
+ quality [di] = qual;
+ }
+ si += oplen;
+ }
+ oplen = 0;
+ }
+ return 0;
+ }
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+
+static unsigned splice(uint32_t cigar[], unsigned n, unsigned at, unsigned out, unsigned in, uint32_t const new_values[/* in */])
+{
+ assert(at + out <= n);
+ memmove(&cigar[at + in], &cigar[at + out], (n - at - out) * 4);
+ if (in)
+ memmove(&cigar[at], new_values, in * 4);
+ return n + in - out;
+}
+
+#define OPCODE_2_FIX (0xF)
+
+static unsigned insert_B(unsigned const T, unsigned const G, unsigned const n, uint32_t cigar[/* n */])
+{
+ unsigned i;
+ unsigned pos;
+
+ for (pos = i = 0; i < n; ++i) {
+ int const opcode = cigar[i] & 0xF;
+
+ switch (opcode) {
+ case 0:
+ case 1:
+ case 4:
+ case 7:
+ case 8:
+ {{
+ unsigned const len = cigar[i] >> 4;
+ unsigned const nxt = pos + len;
+
+ if (pos <= T && T <= nxt) {
+ unsigned const l = T - pos;
+ unsigned const r = len - l;
+ uint32_t op[4];
+
+ op[0] = (l << 4) | opcode;
+ op[1] = (G << 4) | 9; /* B */
+ op[2] = (G << 4) | 0; /* M this is not backwards */
+ op[3] = (r << 4) | opcode;
+
+ return splice(cigar, n, i, 1,
+ 4 - (l == 0 ? 1 : 0) - (r == 0 ? 1 : 0),
+ op + (l == 0 ? 1 : 0));
+ }
+ pos = nxt;
+ }}
+ break;
+ default:
+ break;
+ }
+ }
+ return n;
+}
+
+static unsigned canonicalize(uint32_t cigar[], unsigned n)
+{
+ unsigned i;
+
+ /* remove zero-length and P operations */
+ for (i = n; i > 0; ) {
+ --i;
+ if (cigar[i] >> 4 == 0 || (cigar[i] & 0xF) == 6)
+ n = splice(cigar, n, i, 1, 0, NULL);
+ }
+ /* merge adjacent operations of the same type */
+ for (i = 1; i < n; ) {
+ unsigned const opL = cigar[i-1] & 0xF;
+ unsigned const opI = cigar[ i ] & 0xF;
+
+ if (opI == opL) {
+ unsigned const oplen = (cigar[i] >> 4) + (cigar[i-1] >> 4);
+ uint32_t const op = (oplen << 4) | opI;
+
+ n = splice(cigar, n, i-1, 2, 1, &op);
+ }
+ else
+ ++i;
+ }
+ return n;
+}
+
+static unsigned GetCGCigar(BAM_Alignment const *self, unsigned const N, uint32_t cigar[/* N */])
+{
+ unsigned i;
+ unsigned S;
+ unsigned n = getCigarCount(self);
+ unsigned seg[64];
+ unsigned const segs = BAM_AlignmentParseCGTag(self, sizeof(seg)/sizeof(seg[0]), seg);
+ unsigned const gaps = (segs - 1) >> 1;
+
+ if (2 * gaps + 1 != segs)
+ return RC(rcAlign, rcRow, rcReading, rcData, rcUnexpected);
+
+ if (N < n + 2 * gaps)
+ return RC(rcAlign, rcRow, rcReading, rcBuffer, rcInsufficient);
+
+ memmove(cigar, getCigarBase(self), n * 4);
+
+ if (n > 1)
+ n = canonicalize(cigar, n); /* just in case */
+
+ for (i = 0, S = 0; i < gaps; ++i) {
+ unsigned const s = seg[2 * i + 0];
+ unsigned const g = seg[2 * i + 1];
+
+ S += s + g;
+ if (g > 0)
+ n = insert_B(S, g, n, cigar);
+ S += g;
+ }
+ return n;
+}
+
+rc_t BAM_AlignmentGetCGCigar(BAM_Alignment const *self,
+ uint32_t *cigar,
+ uint32_t cig_max,
+ uint32_t *cig_act)
+{
+ struct offset_size_s const *const GCi = get_CG_GC_info(self);
+
+ *cig_act = 0;
+
+ if (GCi) {
+ *cig_act = GetCGCigar(self, cig_max, cigar);
+ return 0;
+ }
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+/* MARK: end CG stuff */
+
+rc_t BAM_AlignmentGetTI(BAM_Alignment const *self, uint64_t *ti)
+{
+ char const *const TI = get_XT(self);
+ long long unsigned temp;
+
+ if (TI && sscanf(TI, "ti|%llu", &temp) == 1) {
+ *ti = (uint64_t)temp;
+ return 0;
+ }
+ return SILENT_RC(rcAlign, rcRow, rcReading, rcData, rcNotFound);
+}
+
+rc_t BAM_AlignmentGetRNAStrand(BAM_Alignment const *const self, uint8_t *const rslt)
+{
+ if (rslt) {
+ uint8_t const *const XS = get_XS(self);
+
+ *rslt = XS ? XS[0] : ' ';
+ }
+ return 0;
+}
+
+rc_t BAM_AlignmentGetLinkageGroup(BAM_Alignment const *const self,
+ char const **const BX,
+ char const **const CB,
+ char const **const UB)
+{
+ *BX = get_BX(self);
+ *CB = get_CB(self);
+ *UB = get_UB(self);
+ return 0;
+}
+
+rc_t BAM_AlignmentGetBarCode(BAM_Alignment const *self,
+ char const **const BC)
+{
+ *BC = get_BC(self);
+ return 0;
+}
diff --git a/tools/bam-loader/bam.h b/tools/bam-loader/bam.h
new file mode 100644
index 0000000..d088d6d
--- /dev/null
+++ b/tools/bam-loader/bam.h
@@ -0,0 +1,597 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/*--------------------------------------------------------------------------
+ * BAM_Alignment
+ */
+typedef struct BAM_Alignment BAM_Alignment;
+
+/* AddRef
+ * Release
+ */
+rc_t BAM_AlignmentAddRef ( const BAM_Alignment *self );
+rc_t BAM_AlignmentRelease ( const BAM_Alignment *self );
+
+rc_t BAM_AlignmentCopy(const BAM_Alignment *self, BAM_Alignment **rslt);
+
+/* GetReadLength
+ * get the sequence length
+ * i.e. the number of elements of both sequence and quality
+ *
+ * "length" [ OUT ] - length in bases of query sequence and quality
+ */
+rc_t BAM_AlignmentGetReadLength ( const BAM_Alignment *self, uint32_t *length );
+
+
+/* GetSequence
+ * get the sequence data [0..ReadLength)
+ * caller provides buffer of ReadLength bytes
+ *
+ * "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+rc_t BAM_AlignmentGetSequence ( const BAM_Alignment *self, char *sequence );
+
+/* GetSequence2
+ * get the sequence data [0..ReadLength)
+ * caller provides buffer of ReadLength bytes
+ *
+ * "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ *
+ * "start" [ IN ] and "stop" [ IN ] - zero-based coordinates, half-closed interval
+ */
+rc_t BAM_AlignmentGetSequence2 ( const BAM_Alignment *self, char *sequence, uint32_t start, uint32_t stop);
+
+
+/* GetQuality
+ * get the raw quality data [0..ReadLength)
+ * values are unsigned with 0xFF == missing
+ *
+ * "quality" [ OUT ] - return param for quality sequence
+ * held internally, validity is guaranteed for the life of the BAM_Alignment
+ */
+rc_t BAM_AlignmentGetQuality ( const BAM_Alignment *self, const uint8_t **quality );
+
+/* GetQuality2
+ * get the raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ * values are unsigned with 0xFF == missing
+ *
+ * "quality" [ OUT ] - return param for quality sequence
+ * held internally, validity is guaranteed for the life of the BAM_Alignment
+ */
+rc_t BAM_AlignmentGetQuality2(const BAM_Alignment *self, const uint8_t **quality, uint8_t *offset);
+
+/* GetRefSeqId
+ * get id of reference sequence
+ * pass result into BAM_FileGetRefSeqById to get the Reference Sequence record
+ *
+ * "refSeqId" [ OUT ] - zero-based id of reference sequence
+ * returns -1 if set as invalid within BAM ( rc may be zero )
+ */
+rc_t BAM_AlignmentGetRefSeqId ( const BAM_Alignment *self, int32_t *refSeqId );
+
+/* GetMateRefSeqId
+ * get id of mate's reference sequence
+ * pass result into BAM_FileGetRefSeqById to get the Reference Sequence record
+ *
+ * "refSeqId" [ OUT ] - zero-based id of reference sequence
+ * returns -1 if invalid
+ */
+rc_t BAM_AlignmentGetMateRefSeqId ( const BAM_Alignment *self, int32_t *refSeqId );
+
+
+/* GetPosition
+ * get the aligned position on the ref. seq.
+ *
+ * "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ * "pos" [ OUT ] - zero-based position on reference sequence
+ * returns -1 if invalid
+ */
+rc_t BAM_AlignmentGetPosition ( const BAM_Alignment *self, int64_t *pos );
+
+/* GetPosition2
+ * get the aligned start position on the ref. seq.
+ * get the aligned length on the ref. seq.
+ *
+ * "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ * "pos" [ OUT ] - zero-based position on reference sequence
+ * returns -1 if invalid
+ *
+ * "length" [ OUT ] - length of alignment on reference sequence
+ * returns 0 if invalid
+ */
+rc_t BAM_AlignmentGetPosition2 ( const BAM_Alignment *self, int64_t *pos, uint32_t *length );
+
+
+/* GetMatePosition
+ * starting coordinate of mate's alignment on ref. seq.
+ *
+ * "pos" [ OUT ] - zero-based position on reference sequence
+ * returns -1 if invalid
+ */
+rc_t BAM_AlignmentGetMatePosition ( const BAM_Alignment *self, int64_t *pos );
+
+
+/* IsMapped
+ * is the alignment mapped to something
+ */
+bool BAM_AlignmentIsMapped ( const BAM_Alignment *self );
+
+
+/* GetReadGroupName
+ * get the name of the read group (i.e. accession)
+ * pass result into BAM_FileGetReadGroupByName to get the Read Group record
+ *
+ * "name" [ OUT ] - return param for NUL-terminated read group name
+ * held internally, validity is guaranteed for the life of the BAM_Alignment
+ */
+rc_t BAM_AlignmentGetReadGroupName ( const BAM_Alignment *self, const char **name );
+
+
+/* GetReadName
+ * get the read name (i.e. spot name)
+ * GetReadName2
+ * get the read name and length in bytes
+ *
+ * "name" [ OUT ] - return param for NUL-terminated read name
+ * held internally, validity is guaranteed for the life of the BAM_Alignment
+ *
+ * "length" [ OUT ] - return the number of bytes in "name"
+ * excluding terminating NUL.
+ */
+rc_t BAM_AlignmentGetReadName ( const BAM_Alignment *self, const char **name );
+rc_t BAM_AlignmentGetReadName2 ( const BAM_Alignment *self, const char **name, size_t *length );
+
+
+/* GetReadName3
+ * get the read name and length in bytes
+ * applies fixups to name
+ *
+ * "name" [ OUT ] - return param for read name
+ * held internally, validity is guaranteed for the life of the BAM_Alignment
+ *
+ * "length" [ OUT ] - return the number of bytes in "name"
+ */
+rc_t BAM_AlignmentGetReadName3 ( const BAM_Alignment *self, const char **name, size_t *length );
+
+/* HasColorSpace
+ * Does the alignment have colorspace info
+ */
+bool BAM_AlignmentHasColorSpace ( const BAM_Alignment *self );
+
+/* GetCSKey
+ * get the colorspace key
+ *
+ * "cskey" [ OUT ] - return param
+ */
+rc_t BAM_AlignmentGetCSKey ( const BAM_Alignment *self, char cskey[1] );
+
+rc_t BAM_AlignmentGetCSSeqLen ( const BAM_Alignment *self, uint32_t *seqLen );
+/* GetCSSequence
+ * get the colorspace sequence data [0..seqLen)
+ * caller provides buffer of seqLen bytes
+ *
+ * "csseq" [ OUT ] - pointer to a buffer of at least seqLen bytes
+ * "seqLen" [ IN ] - length of sequence from BAM_AlignmentGetCSSeqLen
+ */
+rc_t BAM_AlignmentGetCSSequence ( const BAM_Alignment *self, char *csseq, uint32_t seqLen );
+
+rc_t BAM_AlignmentGetCSQuality(BAM_Alignment const *cself, uint8_t const **quality, uint8_t *offset);
+
+
+/* GetFlags
+ * return the raw "flags" bitmap word
+ *
+ * "flags" [ OUT ] - return parameter for bitmap word
+ */
+enum BAMFlags
+{
+ BAMFlags_bit_WasPaired = 0, /* was paired when sequenced */
+ BAMFlags_bit_IsMappedAsPair,
+ BAMFlags_bit_SelfIsUnmapped,
+ BAMFlags_bit_MateIsUnmapped,
+ BAMFlags_bit_SelfIsReverse,
+ BAMFlags_bit_MateIsReverse,
+ BAMFlags_bit_IsFirst, /* and mate exists */
+ BAMFlags_bit_IsSecond, /* and mate exists */
+ BAMFlags_bit_IsNotPrimary, /* a read having split hits may have multiple primary alignments */
+ BAMFlags_bit_IsLowQuality, /* fails platform/vendor quality checks */
+ BAMFlags_bit_IsDuplicate, /* PCR or optical dup */
+ BAMFlags_bit_IsSupplemental,
+
+ BAMFlags_WasPaired = (1 << BAMFlags_bit_WasPaired),
+ BAMFlags_IsMappedAsPair = (1 << BAMFlags_bit_IsMappedAsPair),
+ BAMFlags_SelfIsUnmapped = (1 << BAMFlags_bit_SelfIsUnmapped),
+ BAMFlags_MateIsUnmapped = (1 << BAMFlags_bit_MateIsUnmapped),
+ BAMFlags_SelfIsReverse = (1 << BAMFlags_bit_SelfIsReverse),
+ BAMFlags_MateIsReverse = (1 << BAMFlags_bit_MateIsReverse),
+ BAMFlags_IsFirst = (1 << BAMFlags_bit_IsFirst),
+ BAMFlags_IsSecond = (1 << BAMFlags_bit_IsSecond),
+ BAMFlags_IsNotPrimary = (1 << BAMFlags_bit_IsNotPrimary),
+ BAMFlags_IsLowQuality = (1 << BAMFlags_bit_IsLowQuality),
+ BAMFlags_IsDuplicate = (1 << BAMFlags_bit_IsDuplicate),
+ BAMFlags_IsSupplemental = (1 << BAMFlags_bit_IsSupplemental)
+};
+
+rc_t BAM_AlignmentGetFlags ( const BAM_Alignment *self, uint16_t *flags );
+
+
+/* GetMapQuality
+ * return the quality score of mapping
+ *
+ * "qual" [ OUT ] - return param for quality score
+ */
+rc_t BAM_AlignmentGetMapQuality ( const BAM_Alignment *self, uint8_t *qual );
+
+
+/* GetAlignmentDetail
+ * get the alignment details
+ *
+ * "rslt" [ OUT, NULL OKAY ] and "count" [ IN ] - array to hold detail records
+ *
+ * "actual" [ OUT, NULL OKAY ] - number of elements written to "rslt"
+ * required if "rslt" is not NULL
+ *
+ * "firstMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the first match to the refSeq
+ * or < 0 if invalid
+ *
+ * "lastMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the last match to the refSeq
+ * or < 0 if invalid
+ */
+typedef uint32_t BAMCigarType;
+enum BAMCigarTypes
+{
+ ct_Match = 'M', /* 0 */
+ ct_Insert = 'I', /* 1 */
+ ct_Delete = 'D', /* 2 */
+ ct_Skip = 'N', /* 3 */
+ ct_SoftClip = 'S', /* 4 */
+ ct_HardClip = 'H', /* 5 */
+ ct_Padded = 'P', /* 6 */
+ ct_Equal = '=', /* 7 */
+ ct_NotEqual = 'X', /* 8 */
+ ct_Overlap = 'B' /* Complete Genomics extension */
+};
+
+typedef struct BAM_AlignmentDetail BAM_AlignmentDetail;
+struct BAM_AlignmentDetail
+{
+ int64_t refSeq_pos; /* position on refSeq where this alignment region starts or -1 if NA */
+ int32_t read_pos; /* position on read where this alignment region starts or -1 if NA */
+ uint32_t length; /* length of alignment region */
+ BAMCigarType type; /* type of alignment */
+};
+
+rc_t BAM_AlignmentGetAlignmentDetail ( const BAM_Alignment *self,
+ BAM_AlignmentDetail *rslt, uint32_t count, uint32_t *actual,
+ int32_t *firstMatch, int32_t *lastMatch );
+
+
+/* GetCigarCount
+ * the number of CIGAR elements
+ * a CIGAR element consists of the pair of matching op code and op length
+ *
+ * "n" [ OUT ] - return param for cigar count
+ */
+rc_t BAM_AlignmentGetCigarCount ( const BAM_Alignment *self, uint32_t *n );
+
+
+rc_t BAM_AlignmentGetRawCigar(const BAM_Alignment *cself, uint32_t const **rslt, uint32_t *length);
+
+/* GetCigar
+ * get CIGAR element n [0..GetCigarCount)
+ */
+rc_t BAM_AlignmentGetCigar ( const BAM_Alignment *self,
+ uint32_t n, BAMCigarType *type, uint32_t *length );
+
+
+/* GetInsertSize
+ * distance in bases to start of mate's alignment on ref. seq.
+ *
+ * "size" [ OUT ] - >0 for first in pair, <0 for second
+ */
+rc_t BAM_AlignmentGetInsertSize ( const BAM_Alignment *self, int64_t *size );
+
+rc_t BAM_AlignmentFormatSAM(const BAM_Alignment *self,
+ size_t *actsize,
+ size_t maxsize,
+ char *buffer);
+
+/* OptDataForEach
+ * DANGER
+ * these optional fields are the weakest part of BAM.
+ *
+ * It is probably best to not use this info.
+ * You can't count on them being there.
+ * Moreover, you might need to interpret the types correctly.
+ */
+typedef uint32_t BAMOptDataValueType;
+enum BAMOptDataValueTypes
+{
+ dt_CSTRING = 'Z',
+ dt_INT8 = 'c',
+ dt_UINT8 = 'C',
+ dt_INT16 = 's',
+ dt_UINT16 = 'S',
+ dt_INT = 'i',
+ dt_UINT = 'I',
+ dt_FLOAT32 = 'f',
+#if 0
+ dt_FLOAT64 = 'd', /* removed? not in Dec 19 2013 version of SAMv1.pdf */
+#endif
+ dt_ASCII = 'A',
+ dt_HEXSTRING = 'H',
+ dt_NUM_ARRAY = 'B'
+};
+
+#define OPT_TAG_X "X?" /* end user data */
+#define OPT_TAG_Y "Y?" /* end user data */
+#define OPT_TAG_Z "Z?" /* end user data */
+
+#define OPT_TAG_ReadGroup "RG" /* Read Group; same as BAM_AlignmentGetReadGroupName */
+#define OPT_TAG_Library "LB" /* LIbrary; also BAMReadGroup */
+#define OPT_TAG_Unit "PU" /* Platform specific Unit; also BAMReadGroup */
+#define OPT_TAG_Program "PG" /* Alignment software name */
+#define OPT_TAG_AlignScore "AS" /* Alignment Score (MapQuality?) */
+#define OPT_TAG_SecQual "SQ" /* second called base:2 and quality:6; length == ReadLength? warning */
+#define OPT_TAG_MateMapQual "MQ" /* map Quality of mate */
+#define OPT_TAG_NumMismatch "NM" /* Number of Mismatches */
+#define OPT_TAG_Hits0 "H0" /* Number of perfect hits */
+#define OPT_TAG_Hits1 "H1" /* Number of off-by-one */
+#define OPT_TAG_Hits2 "H2" /* Number of off-by-two */
+#define OPT_TAG_CondQual "UQ" /* conditional Quality of read */
+#define OPT_TAG_CondQPair "PQ" /* conditional Quality of pair */
+#define OPT_TAG_ReadHits "NH" /* Number of times this read (spot) aligns */
+#define OPT_TAG_ReadHits2 "IH" /* Number of times this read (spot) aligns that are in this file */
+#define OPT_TAG_HitIndex "HI" /* n-th hit for this read in this file */
+#define OPT_TAG_Match2 "MD" /* another sort of matching string like CIGAR but different? */
+#define OPT_TAG_ColorKey "CS" /* primer and first color */
+#define OPT_TAG_ColorQual "CQ" /* quality of above */
+#define OPT_TAG_ColorMisses "CM" /* Number of color-space Mismatches */
+#define OPT_TAG_SeqOverlap "GS"
+#define OPT_TAG_QualOverlap "GQ"
+#define OPT_TAG_OverlapDesc "GC"
+#define OPT_TAG_MateSeq "R2" /* sequence of the mate */
+#define OPT_TAG_MateQual "Q2" /* quality scores of the mate */
+#define OPT_TAG_OtherQual "S2"
+#define OPT_TAG_NextHitRef "CC" /* Reference name of the next hit */
+#define OPT_TAG_NextHitPos "CP" /* coordinate of the next hit */
+#define OPT_TAG_SingleMapQ "SM" /* quality of mapping as if not paired */
+#define OPT_TAG_AM "AM"
+#define OPT_TAG_MAQFlag "MQ"
+
+
+struct BAMOptData
+{
+ BAMOptDataValueType type;
+ uint32_t element_count;
+ union {
+ int8_t i8[8];
+ uint8_t u8[8];
+ int16_t i16[4];
+ uint16_t u16[4];
+ int32_t i32[2];
+ uint32_t u32[2];
+ int64_t i64[2];
+ uint64_t u64[2];
+ float f32[2];
+ double f64[1];
+ char asciiz[8];
+ } u;
+};
+
+typedef struct BAMOptData BAMOptData;
+
+typedef rc_t ( * BAMOptionalDataFunction )
+ ( void *ctx, const char tag[2], const BAMOptData *value );
+
+rc_t BAM_AlignmentOptDataForEach
+ ( const BAM_Alignment *self, void *ctx, BAMOptionalDataFunction callback );
+
+
+bool BAM_AlignmentHasCGData(BAM_Alignment const *self);
+
+rc_t BAM_AlignmentCGReadLength(BAM_Alignment const *self, uint32_t *readlen);
+
+rc_t BAM_AlignmentGetCGSeqQual(BAM_Alignment const *self,
+ char sequence[],
+ uint8_t quality[]);
+
+rc_t BAM_AlignmentGetCGCigar(BAM_Alignment const *self,
+ uint32_t *cigar,
+ uint32_t cig_max,
+ uint32_t *cig_act);
+
+rc_t BAM_AlignmentGetTI(BAM_Alignment const *self, uint64_t *ti);
+
+/* strand = '+', '-', or ' ' */
+rc_t BAM_AlignmentGetRNAStrand(BAM_Alignment const *self, uint8_t *strand);
+
+rc_t BAM_AlignmentGetCGAlignGroup(BAM_Alignment const *self,
+ char buffer[],
+ size_t max_size,
+ size_t *act_size);
+
+rc_t BAM_AlignmentGetLinkageGroup(BAM_Alignment const *self,
+ char const ** BX,
+ char const ** CB,
+ char const ** UB);
+
+rc_t BAM_AlignmentGetBarCode(BAM_Alignment const *self,
+ char const **BC);
+
+
+/*--------------------------------------------------------------------------
+ * BAM_File
+ */
+typedef struct BAM_File BAM_File;
+
+typedef struct BAMRefSeq BAMRefSeq;
+struct BAMRefSeq
+{
+ uint64_t length;
+ const char *name; /* not null unique */
+ const char *assemblyId;
+ const uint8_t *checksum;
+ const char *uri;
+ const char *species;
+ uint32_t id;
+ uint8_t checksum_array[16];
+};
+
+typedef struct BAMReadGroup BAMReadGroup;
+struct BAMReadGroup
+{
+ const char *name; /* not null unique, accession e.g. SRR001138 */
+ const char *sample; /* not null */
+ const char *library;
+ const char *description;
+ const char *unit; /* platform specific identifier, e.g. BI.080214_SL-XAJ_0001_FC2044KAAXX.7 */
+ const char *insertSize;
+ const char *center; /* e.g. BI */
+ const char *runDate;
+ const char *platform; /* e.g. ILLUMINA */
+ uint32_t id;
+};
+
+
+/* 64-bit structure stored as an integer
+ * The high-order 48 bits store the position in the file at which a
+ * compressed block starts. The low-order 16 bits store the position
+ * in the decompressed block at which a record starts. This is the
+ * way that positions are represented in BAM indices.
+ */
+typedef uint64_t BAM_FilePosition;
+
+
+/* Make
+ * open the BAM file specified by path
+ *
+ * "path" [ IN ] - NUL terminated string or format
+ */
+rc_t BAM_FileMake(const BAM_File **result,
+ KFile *defer,
+ char const headerText[],
+ char const path[], ... );
+
+/* AddRef
+ * Release
+ */
+rc_t BAM_FileAddRef ( const BAM_File *self );
+rc_t BAM_FileRelease ( const BAM_File *self );
+
+
+/* GetPosition
+ * get the position of the about-to-be read alignment
+ * this position can be stored
+ * this position can be passed into SetPosition to seek to the same alignment
+ *
+ * "pos" [ OUT ] - return parameter for position
+ */
+rc_t BAM_FileGetPosition ( const BAM_File *self, BAM_FilePosition *pos );
+
+
+/* GetProportionalPosition
+ * get the aproximate proportional position in the input file
+ * this is intended to be useful for computing progress
+ *
+ * NB - does not return rc_t
+ */
+float BAM_FileGetProportionalPosition ( const BAM_File *self );
+
+
+/* Read
+ * read an aligment
+ *
+ * "result" [ OUT ] - return param for BAM_Alignment object
+ * must be released with BAM_AlignmentRelease, is invalidated or contents
+ * change on next call to BAM_FileRead2. Unlike with BAM_FileRead, no attempt is
+ * made to preserve this object.
+ *
+ * returns:
+ * RC(..., ..., ..., rcRow, rcNotFound) at end
+ * RC(..., ..., ..., rcRow, rcInvalid) and RC(..., ..., ..., rcRow, rcEmpty)
+ * are not fatal and are resumable
+ *
+ * tries to use static buffers and will log messages about parsing errors
+ */
+rc_t BAM_FileRead2 ( const BAM_File *self, const BAM_Alignment **result );
+
+
+/* GetRefSeqCount
+ * get the number of Reference Sequences refered to in the header
+ * this is not necessarily the number of Reference Sequences referenced
+ * by the alignments
+ */
+rc_t BAM_FileGetRefSeqCount ( const BAM_File *self, uint32_t *count );
+
+
+/* GetRefSeq
+ * get the n'th Ref. Seq. where n is [0..RefSeqCount)
+ * the resulting pointer is static-like; it is freed when the BAM_File is.
+ * IOW, it is good for precisely at long as the BAM_File is.
+ */
+rc_t BAM_FileGetRefSeq ( const BAM_File *self, uint32_t n, const BAMRefSeq **result );
+
+
+/* GetRefSeqById
+ * get a Ref. Seq. by its id
+ * the resulting pointer is static-like; it is freed when the BAM_File is.
+ * IOW, it is good for precisely at long as the BAM_File is.
+ */
+rc_t BAM_FileGetRefSeqById ( const BAM_File *self, int32_t id, const BAMRefSeq **result );
+
+
+/* GetReadGroupCount
+ * get the number of Read Groups (accessions, etc.) refered to in the header
+ * this is not necessarily the number of Read Groups referenced
+ * by the alignments
+ */
+rc_t BAM_FileGetReadGroupCount ( const BAM_File *self, uint32_t *count );
+
+/* GetReadGroup
+ * get the n'th Read Group where n is [0..ReadGroupCount)
+ * the resulting pointer is static-like; it is freed when the BAM_File is.
+ * IOW, it is good for precisely at long as the BAM_File is.
+ */
+rc_t BAM_FileGetReadGroup ( const BAM_File *self, unsigned n, const BAMReadGroup **result );
+
+/* GetHeaderText
+ * get the text of the BAM header file
+ * the resulting pointer is static-like; it is freed when the BAM_File is.
+ * IOW, it is good for precisely at long as the BAM_File is.
+ */
+rc_t BAM_FileGetHeaderText(BAM_File const *cself, char const **header, size_t *header_len);
+
+
+/* GetReadGroupByName
+ * get a Read Group by its name
+ * the resulting pointer is static-like; it is freed when the BAM_File is.
+ * IOW, it is good for precisely at long as the BAM_File is.
+ */
+rc_t BAM_FileGetReadGroupByName ( const BAM_File *self,
+ const char *name, const BAMReadGroup **result );
diff --git a/tools/bam-loader/config-file.cpp b/tools/bam-loader/config-file.cpp
new file mode 100644
index 0000000..9eca698
--- /dev/null
+++ b/tools/bam-loader/config-file.cpp
@@ -0,0 +1,195 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "config-file.hpp"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <cctype>
+#include <sstream>
+
+/*
+ * Config file:
+ * The config file consists of lines containing whitespace (ASCII 9 or 32)
+ * seperated fields. The fields are:
+ * NAME (unique)
+ * SEQID
+ * extra (optional)
+ */
+
+/// reads a line with leading and trailing whitespace trimmed;
+/// ignores lines consisting entirely of whitespace;
+static std::string const getline(std::istream &is)
+{
+ std::string line("");
+ auto ws = true;
+ size_t len = 0;
+
+ for ( ; ; ) {
+ auto const ch = is.get();
+ if (ch < 0)
+ break;
+ if (ws && isspace(ch))
+ continue;
+
+ if (ch == '\n' || ch == '\r')
+ break;
+
+ ws = false;
+ line.push_back(ch);
+ if (!isspace(ch))
+ len = line.size();
+ }
+ line.erase(len);
+
+ return line;
+}
+
+template <typename T>
+struct Range {
+ T start, end;
+
+ Range(T const init) : start(init), end(init) {}
+ T const size() const {
+ return start < end ? (end - start) : 0;
+ }
+};
+
+struct Parse {
+ Range<std::string::size_type> name;
+ Range<std::string::size_type> seqid;
+ Range<std::string::size_type> extra;
+
+ Parse()
+ : name(std::string::npos)
+ , seqid(std::string::npos)
+ , extra(std::string::npos)
+ {}
+ bool good() const {
+ return name.size() > 0 && seqid.size() > 0;
+ }
+};
+
+static Parse parseLine(std::string const &in) {
+ static std::string const whitespace(" \t");
+ Parse rslt;
+
+ if (in[0] != '#') {
+ rslt.name.start = 0;
+
+ rslt.name.end = in.find_first_of(whitespace);
+ if (rslt.name.end != std::string::npos) {
+ rslt.seqid.start = in.find_first_not_of(whitespace, rslt.name.end);
+ if (rslt.seqid.start != std::string::npos) {
+ rslt.seqid.end = in.find_first_of(whitespace, rslt.seqid.start);
+ if (rslt.seqid.end == std::string::npos)
+ rslt.seqid.end = in.size();
+ else {
+ rslt.extra.start = in.find_first_not_of(whitespace, rslt.seqid.end);
+ rslt.extra.end = in.size();
+ }
+ }
+ }
+ }
+
+ return rslt;
+}
+
+static ConfigFile::Line makeLine(std::string const &in, Parse const &parse) {
+ ConfigFile::Line rslt;
+
+ rslt.NAME = in.substr(parse.name.start, parse.name.size());
+ rslt.SEQID = in.substr(parse.seqid.start, parse.seqid.size());
+ if (parse.extra.size() > 0)
+ rslt.EXTRA = in.substr(parse.extra.start, parse.extra.size());
+ else
+ rslt.EXTRA = "";
+
+ return rslt;
+}
+
+static ConfigFile::Unparsed makeUnparsed(unsigned const lineno, std::string const &line) {
+ ConfigFile::Unparsed rslt;
+
+ rslt.lineno = lineno;
+ rslt.line = line;
+
+ return rslt;
+}
+
+ConfigFile::ConfigFile(std::istream &is) {
+ unsigned lineno = 0;
+
+ while (is.good()) {
+ auto const in = getline(is);
+ if (in.size() == 0) {
+ break;
+ }
+ ++lineno;
+
+ auto const parse = parseLine(in);
+ if (parse.good())
+ lines.push_back(makeLine(in, parse));
+ else
+ unparsed.push_back(makeUnparsed(lineno, in));
+ }
+ if (is.eof())
+ msg = "no errors";
+ else
+ msg = "error reading input";
+
+ std::ostringstream oss;
+ oss << msg << "; lines read: " << lineno;
+ msg = oss.str();
+}
+
+ConfigFile ConfigFile::load(std::string const &filename) {
+ std::ifstream ifs(filename);
+
+ return ifs.is_open() ? ConfigFile::load(ifs) : ConfigFile();
+}
+
+void ConfigFile::printDescription(std::ostream &os, bool const detail) const {
+ os << "Loaded " << lines.size() << " records" << std::endl;
+ if (detail) {
+ for (auto i = lines.begin(); i != lines.end(); ++i)
+ os << i->NAME << '\t' << i->SEQID << '\t' << i->EXTRA << std::endl;
+ }
+ os << "Unparsed lines: " << unparsed.size() << std::endl;
+ if (detail) {
+ for (auto i = unparsed.begin(); i != unparsed.end(); ++i)
+ os << i->lineno << '\t' << i->line << std::endl;
+ }
+ os << msg << std::endl;
+}
+
+#ifdef TESTING
+int main(int argc, char *argv[]) {
+ auto const config = argc > 1 ? ConfigFile::load(argv[1]) : ConfigFile::load(std::cin);
+
+ config.printDescription(std::cout, true);
+}
+#endif
diff --git a/tools/bam-loader/config-file.hpp b/tools/bam-loader/config-file.hpp
new file mode 100644
index 0000000..dbb15f4
--- /dev/null
+++ b/tools/bam-loader/config-file.hpp
@@ -0,0 +1,65 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+/*
+ * Config file:
+ * The config file consists of lines containing whitespace (ASCII 9 or 32)
+ * seperated fields. The fields are:
+ * NAME (unique)
+ * SEQID
+ * extra (optional)
+ */
+
+class ConfigFile {
+ ConfigFile() {}
+ ConfigFile(std::istream &is);
+public:
+ struct Line {
+ std::string NAME;
+ std::string SEQID;
+ std::string EXTRA;
+ };
+ struct Unparsed {
+ unsigned lineno;
+ std::string line;
+ };
+
+ std::vector<Line const> lines;
+ std::vector<Unparsed const> unparsed;
+ std::string msg;
+
+ ~ConfigFile() {}
+
+ void printDescription(std::ostream &, bool detail = false) const;
+
+ static ConfigFile load(std::istream &is) {
+ return ConfigFile(is);
+ }
+ static ConfigFile load(std::string const &filename);
+};
diff --git a/tools/bam-loader/fasta-file.cpp b/tools/bam-loader/fasta-file.cpp
new file mode 100644
index 0000000..013cee8
--- /dev/null
+++ b/tools/bam-loader/fasta-file.cpp
@@ -0,0 +1,257 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "fasta-file.hpp"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <cctype>
+
+/*
+ * Fasta files:
+ * Fasta file consists of one of more sequences. A sequence in a fasta file
+ * consists of a seqid line followed by lines containing the bases of the
+ * sequence. A seqid line starts with '>' and the next word (whitespace
+ * delimited) is the seqid.
+ */
+
+struct tmpSequence {
+ std::string SEQID;
+ std::string SEQID_LINE;
+ size_t data_start;
+ unsigned data_size;
+ bool hadErrors;
+};
+
+/// reads a line with leading and trailing whitespace trimmed;
+/// ignores lines consisting entirely of whitespace;
+static std::string const getline(std::istream &is)
+{
+ std::string line("");
+ auto ws = true;
+ size_t len = 0;
+
+ for ( ; ; ) {
+ auto const ch = is.get();
+ if (ch < 0)
+ break;
+ if (ws && isspace(ch))
+ continue;
+
+ if (ch == '\n' || ch == '\r')
+ break;
+
+ ws = false;
+ line.push_back(ch);
+ if (!isspace(ch))
+ len = line.size();
+ }
+ line.erase(len);
+
+ return line;
+}
+
+static bool cleanCopyFastaSequence(char *const dst,
+ char const *const src,
+ unsigned const len)
+{
+ static char const tr[] = {
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','.',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ','A','B','C','D',' ',' ','G','H',' ',' ','K',' ','M','N',' ',
+ ' ',' ','R','S','T',' ','V','W','N','Y',' ',' ',' ',' ',' ',' ',
+ ' ','A','B','C','D',' ',' ','G','H',' ',' ','K',' ','M','N',' ',
+ ' ',' ','R','S','T',' ','V','W','N','Y',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
+ };
+
+ auto hadErrors = false;
+
+ for (unsigned i = 0; i < len; ++i) {
+ int const ch = src[i]; // .ACMGRSVTWYHKDBN and lower case
+
+ if (ch != ' ')
+ dst[i] = ch;
+ else {
+ dst[i] = 'N';
+ hadErrors = true;
+ }
+ }
+
+ return hadErrors;
+}
+
+static bool readFile(std::istream &is,
+ char *&data,
+ size_t &size,
+ size_t &limit,
+ std::vector<tmpSequence> &sequences
+ )
+{
+ static std::string const whitespace("\t ");
+ tmpSequence sequence;
+ auto st = 0;
+
+ for ( ; ; ) {
+ auto line = getline(is);
+
+ switch (st) {
+ case 1:
+ if (line[0] == '>') {
+ auto const seqidstart = line.find_first_not_of(whitespace, 1);
+
+ if (seqidstart != std::string::npos) {
+ sequence.SEQID_LINE.push_back(' ');
+ sequence.SEQID_LINE.append(line, seqidstart, std::string::npos);
+ }
+ break;
+ }
+ ++st;
+ /* fallthrough */
+ case 2:
+ if (line[0] == '>' || line.size() == 0) {
+ sequences.push_back(sequence);
+ st = 0;
+ /* fallthrough */
+ }
+ else {
+ auto const start = line.find_first_not_of(whitespace);
+ auto const len = line.size() - start;
+
+ if (size + len > limit) {
+ do { limit <<= 1; } while (size + len > limit);
+ auto const tmp = realloc(reinterpret_cast<void *>(data), limit);
+
+ if (!tmp) throw std::bad_alloc();
+ data = reinterpret_cast<char *>(tmp);
+ }
+
+ sequence.hadErrors |= cleanCopyFastaSequence(data + size, line.data() + start, len);
+ size += len;
+ sequence.data_size += len;
+ break;
+ }
+ case 0:
+ if (line.size() == 0)
+ return true;
+
+ if (line[0] == '>') {
+ auto const seqidstart = line.find_first_not_of(whitespace, 1);
+ if (seqidstart != std::string::npos) {
+ auto const seqidend = line.find_first_of(whitespace, seqidstart);
+
+ sequence.SEQID_LINE = std::string(line, seqidstart);
+ sequence.SEQID = std::string(line, seqidstart, seqidend - seqidstart);
+ sequence.data_start = size;
+ sequence.data_size = 0;
+ sequence.hadErrors = false;
+ ++st;
+ break;
+ }
+ }
+ default:
+ return false;
+ }
+ }
+}
+
+FastaFile::FastaFile(std::istream &is) : data(nullptr)
+{
+ std::vector<tmpSequence> tmp;
+ size_t limit = 1024u * 1024u;
+ size_t size = 0;
+ auto data = reinterpret_cast<char *>(malloc(limit));
+
+ if (!data)
+ throw std::bad_alloc();
+
+ if (readFile(is, data, size, limit, tmp) && is.eof()) {
+ this->data = realloc(reinterpret_cast<void *>(data), size);
+ if (!this->data) throw std::bad_alloc();
+
+ for (auto i = tmp.begin(); i != tmp.end(); ++i) {
+ Sequence seq;
+
+ seq.SEQID = i->SEQID;
+ seq.SEQID_LINE = i->SEQID_LINE;
+ seq.data = data + i->data_start;
+ seq.length = i->data_size;
+ seq.hadErrors = i->hadErrors;
+
+ sequences.push_back(seq);
+ }
+ }
+ else {
+ free(data);
+ }
+}
+
+FastaFile FastaFile::load(std::string const filename)
+{
+ std::ifstream ifs(filename);
+
+ return ifs.is_open() ? FastaFile::load(ifs) : FastaFile();
+}
+
+#ifdef TESTING
+void wait(std::string const &msg = "Waiting") {
+ std::string s;
+
+ std::cout << msg << "... [Press enter]" << std::endl;
+ std::getline(std::cin, s);
+}
+
+void test(std::string const &filename) {
+ auto const test = FastaFile::load(filename);
+
+ std::cout << "Loaded " << test.sequences.size() << " sequences" << std::endl;
+
+ size_t total = 0;
+ for (auto i = test.sequences.begin(); i != test.sequences.end(); ++i)
+ total += i->length;
+
+ std::cout << "Loaded " << total << " bases" << std::endl;
+
+// wait("Run leaks");
+}
+
+int main(int argc, char *argv[])
+{
+ if (argc > 1) {
+ test(argv[1]);
+ }
+// wait("Run leaks again");
+}
+#endif
diff --git a/tools/bam-loader/fasta-file.hpp b/tools/bam-loader/fasta-file.hpp
new file mode 100644
index 0000000..543c4b0
--- /dev/null
+++ b/tools/bam-loader/fasta-file.hpp
@@ -0,0 +1,63 @@
+/*==============================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+/*
+ * Fasta files:
+ * Fasta file consists of one of more sequences. A sequence in a fasta file
+ * consists of a seqid line followed by lines containing the bases of the
+ * sequence. A seqid line starts with '>' and the next word (whitespace
+ * delimited) is the seqid.
+ */
+
+class FastaFile {
+ FastaFile() : data(NULL) {}
+ FastaFile(std::istream &is);
+
+ void *data;
+public:
+ struct Sequence {
+ std::string SEQID;
+ std::string SEQID_LINE;
+ char const *data;
+ unsigned length;
+ bool hadErrors; // erroneous base values are replaced with N
+ };
+
+ std::vector<Sequence const> sequences;
+
+ ~FastaFile() {
+ free(data);
+ data = nullptr;
+ }
+
+ static FastaFile load(std::istream &is) {
+ return FastaFile(is);
+ }
+ static FastaFile load(std::string const filename);
+};
diff --git a/tools/bam-loader/hashtable.c b/tools/bam-loader/hashtable.c
new file mode 100644
index 0000000..ee8f8e6
--- /dev/null
+++ b/tools/bam-loader/hashtable.c
@@ -0,0 +1,878 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#if TESTING
+#include <stdio.h>
+#include <string.h>
+#endif
+
+#include "hashtable.h"
+
+typedef struct HTBucket HTBucket;
+typedef struct HTEntry HTEntry;
+
+#define HASH_TABLE_ENTRIES_MAX (0x80000)
+#define HASH_TABLE_PREALLOC_MAX 1
+
+struct HTEntry {
+ const void *payload;
+ uint32_t hashValue;
+};
+
+struct HTBucket {
+ HTBucket *overflow;
+ uint32_t used; /* one bit per entry */
+ HTEntry entry[32];
+};
+
+struct HashTable {
+ size_t hashMask; /* the "size" of the table is hashMask + 1 */
+ size_t entryCount; /* total number of entries in table */
+
+ HashTableKeyCompFunc comp_func;
+ const void *ctx;
+
+#if HASH_TABLE_PREALLOC_MAX
+ HTBucket table[HASH_TABLE_ENTRIES_MAX];
+#else
+ HTBucket *table;
+#endif
+};
+
+typedef struct HashTableRealIterator {
+ HashTable *table;
+ HTBucket *bucket;
+ uint32_t slot;
+ uint32_t hashValue;
+} HashTableRealIterator;
+
+typedef union HashTableImplIterator {
+ HashTableRealIterator real;
+ HashTableIterator user;
+} HashTableImplIterator;
+
+static unsigned FirstSet(unsigned bits)
+{
+ assert(bits != 0);
+ if ((bits & 0xFFFF) != 0) {
+ if ((bits & 0xFF) != 0) {
+ if ((bits & 0xF) != 0) {
+ if ((bits & 0x3) != 0) {
+ if ((bits & 0x1) != 0)
+ return 0;
+ else
+ return 1;
+ }
+ else if ((bits & 0x4) != 0)
+ return 2;
+ else
+ return 3;
+ }
+ else if ((bits & 0x30) != 0) {
+ if ((bits & 0x10) != 0)
+ return 4;
+ else
+ return 5;
+ }
+ else if ((bits & 0x40) != 0)
+ return 6;
+ else
+ return 7;
+ }
+ else if ((bits & 0xF00) != 0) {
+ if ((bits & 0x300) != 0) {
+ if ((bits & 0x100) != 0)
+ return 8;
+ else
+ return 9;
+ }
+ else if ((bits & 0x400) != 0)
+ return 10;
+ else
+ return 11;
+ }
+ else if ((bits & 0x3000) != 0) {
+ if ((bits & 0x1000) != 0)
+ return 12;
+ else
+ return 13;
+ }
+ else if ((bits & 0x4000) != 0)
+ return 14;
+ else
+ return 15;
+ }
+ else if ((bits & 0xFF0000) != 0) {
+ if ((bits & 0xF0000) != 0) {
+ if ((bits & 0x30000) != 0) {
+ if ((bits & 0x10000) != 0)
+ return 16;
+ else
+ return 17;
+ }
+ else if ((bits & 0x40000) != 0)
+ return 18;
+ else
+ return 19;
+ }
+ else if ((bits & 0x300000) != 0) {
+ if ((bits & 0x100000) != 0)
+ return 20;
+ else
+ return 21;
+ }
+ else if ((bits & 0x400000) != 0)
+ return 22;
+ else
+ return 23;
+ }
+ else if ((bits & 0xF000000) != 0) {
+ if ((bits & 0x3000000) != 0) {
+ if ((bits & 0x1000000) != 0)
+ return 24;
+ else
+ return 25;
+ }
+ else if ((bits & 0x4000000) != 0)
+ return 26;
+ else
+ return 27;
+ }
+ else if ((bits & 0x30000000) != 0) {
+ if ((bits & 0x10000000) != 0)
+ return 28;
+ else
+ return 29;
+ }
+ else if ((bits & 0x40000000) != 0)
+ return 30;
+ else
+ return 31;
+
+}
+
+static rc_t HTBucketNextOpenSlot(HTBucket *self, HTBucket **rslt, unsigned *slot)
+{
+ while (self->used == 0xFFFFFFFF) {
+ if (self->overflow != NULL) {
+ self = self->overflow;
+ continue;
+ }
+ self->overflow = malloc(sizeof(*self->overflow));
+ if (self->overflow == NULL)
+ return RC(rcCont, rcBuffer, rcAllocating, rcMemory, rcExhausted);
+ self->overflow->overflow = NULL;
+ self->overflow->used = 0;
+ *rslt = self->overflow;
+ *slot = 0;
+ return 0;
+ }
+ *rslt = self;
+ *slot = FirstSet(~self->used);
+
+ return 0;
+}
+
+static rc_t HTBucketInsert(HTBucket *self, const HTEntry *entry)
+{
+ HTBucket *found;
+ unsigned slot;
+ rc_t rc = HTBucketNextOpenSlot(self, &found, &slot);
+
+ if (rc)
+ return rc;
+ found->used |= (1 << slot);
+ found->entry[slot] = *entry;
+ return 0;
+}
+
+static bool HTBucketFreeSlot(HTBucket *self, unsigned slot)
+{
+ unsigned i;
+
+ self->used &= ~(1 << slot);
+#if _DEBUGGING
+ self->entry[slot].payload = NULL;
+#endif
+ if (self->overflow == NULL)
+ return true;
+
+ /* pull something out of the overflow */
+ i = FirstSet(self->overflow->used);
+ self->entry[slot] = self->overflow->entry[i];
+ self->used |= (1 << slot);
+ HTBucketFreeSlot(self->overflow, i);
+ if (self->overflow->used == 0) {
+ free(self->overflow);
+ self->overflow = NULL;
+ }
+ return false;
+}
+
+static void HTBucketForEach(const HTBucket *self, void (*fn)(void *payload, void *ctx), void *ctx)
+{
+ do {
+ uint32_t bits = self->used;
+ unsigned i;
+
+ for (i = 0; i != 32 && bits != 0; ++i, bits >>= 1) {
+ if ((bits & 1) == 0)
+ continue;
+ fn((void *)self->entry[i].payload, ctx);
+ }
+ self = self->overflow;
+ } while (self != NULL);
+}
+
+static bool HTBucketDoUntil(const HTBucket *self, bool (*fn)(void *payload, void *ctx), void *ctx)
+{
+ do {
+ uint32_t bits = self->used;
+ unsigned i;
+
+ for (i = 0; i != 32 && bits != 0; ++i, bits >>= 1) {
+ if ((bits & 1) == 0)
+ continue;
+ if (fn((void *)self->entry[i].payload, ctx))
+ return true;
+ }
+ self = self->overflow;
+ } while (self != NULL);
+ return false;
+}
+
+static bool HTBucketValidate(const HTBucket *self, uint32_t hash, uint32_t mask)
+{
+ do {
+ uint32_t bits = self->used;
+ unsigned i;
+
+ for (i = 0; i != 32 && bits != 0; ++i, bits >>= 1) {
+ const HTEntry *entry = &self->entry[i];
+ bool is_free = (bits & 1) == 0;
+#if _DEBUGGING
+ bool is_null = entry->payload == NULL;
+
+ if (is_free != is_null)
+ return true;
+#endif
+ if (is_free)
+ continue;
+ if ((entry->hashValue & mask) != hash)
+ return true;
+ }
+ if (self->overflow && self->overflow->used == 0)
+ return true;
+ self = self->overflow;
+ } while (self != NULL);
+ return false;
+}
+
+static void HTBucketWhack(HTBucket *self, void (*fn)(void *payload, void *ctx), void *ctx)
+{
+ uint32_t bits;
+ unsigned i;
+
+ if (self->overflow) {
+ HTBucketWhack(self->overflow, fn, ctx);
+ free(self->overflow);
+ }
+ for (i = 0, bits = self->used; i != 32 && bits != 0 && fn; ++i, bits >>= 1) {
+ if ((bits & 1) == 0)
+ continue;
+ fn((void *)self->entry[i].payload, ctx);
+ }
+}
+
+static uint32_t GetHashValue(const uint8_t *key, unsigned len)
+{
+ /*
+ * My basic hash function is Pearson's hash.
+ * The tables below contain each value between 0 and 255 inclusive, in
+ * random order. The tables were generated with the following perl script.
+ *
+ * #!perl -w
+ * my @x = (0 .. 255); # each value between 0 and 255 inclusive
+ * foreach (0 .. 10000) { # randomize the order
+ * my $i = $_ % 256; # a sequential index
+ * my $r = rand(256); # a random index
+ * ($x[$i], $x[$r]) = ($x[$r], $x[$i]); # swap x[i] and x[r]
+ * }
+ * print join(', ', map { sprintf '%3u', $_; } @x);
+ *
+ * You can generate lots of different 8-bit hash functions this way.
+ *
+ * I generate four 8-bit hashes and combine them to make a 32-bit one.
+ * Even though I may not use all bits for the hash (e.g. the limit on the
+ * table's size is much less than UINT32_MAX), computing and storing the
+ * full hash reduces the number of string compares I have to do when buckets
+ * have lots of items in them.
+ */
+ static const uint8_t T1[] = {
+ 64, 186, 39, 203, 54, 211, 98, 32, 26, 23, 219, 94, 77, 60, 56, 184,
+ 129, 242, 10, 91, 84, 192, 19, 197, 231, 133, 125, 244, 48, 176, 160, 164,
+ 17, 41, 57, 137, 44, 196, 116, 146, 105, 40, 122, 47, 220, 226, 213, 212,
+ 107, 191, 52, 144, 9, 145, 81, 101, 217, 206, 85, 134, 143, 58, 128, 20,
+ 236, 102, 83, 149, 148, 180, 167, 163, 12, 239, 31, 0, 73, 152, 1, 15,
+ 75, 200, 4, 165, 5, 66, 25, 111, 255, 70, 174, 151, 96, 126, 147, 34,
+ 112, 161, 127, 181, 237, 78, 37, 74, 222, 123, 21, 132, 95, 51, 141, 45,
+ 61, 131, 193, 68, 62, 249, 178, 33, 7, 195, 228, 82, 27, 46, 254, 90,
+ 185, 240, 246, 124, 205, 182, 42, 22, 198, 69, 166, 92, 169, 136, 223, 245,
+ 118, 97, 115, 80, 252, 209, 49, 79, 221, 38, 28, 35, 36, 208, 187, 248,
+ 158, 201, 202, 168, 2, 18, 189, 119, 216, 214, 11, 6, 89, 16, 229, 109,
+ 120, 43, 162, 106, 204, 8, 199, 235, 142, 210, 86, 153, 227, 230, 24, 100,
+ 224, 113, 190, 243, 218, 215, 225, 173, 99, 238, 138, 59, 183, 154, 171, 232,
+ 157, 247, 233, 67, 88, 50, 253, 251, 140, 104, 156, 170, 150, 103, 117, 110,
+ 155, 72, 207, 250, 159, 194, 177, 130, 135, 87, 71, 175, 14, 55, 172, 121,
+ 234, 13, 30, 241, 93, 188, 53, 114, 76, 29, 65, 3, 179, 108, 63, 139
+ };
+ static const uint8_t T2[] = {
+ 119, 174, 44, 225, 94, 226, 141, 197, 35, 241, 179, 154, 26, 161, 129, 10,
+ 104, 53, 97, 12, 243, 80, 51, 123, 185, 13, 66, 214, 114, 17, 74, 165,
+ 110, 143, 170, 222, 242, 73, 40, 101, 56, 163, 68, 86, 198, 9, 21, 90,
+ 8, 1, 146, 121, 103, 70, 5, 160, 149, 50, 145, 236, 100, 75, 148, 58,
+ 55, 15, 33, 131, 127, 186, 6, 109, 115, 2, 108, 52, 209, 128, 208, 47,
+ 220, 173, 45, 72, 156, 212, 152, 102, 77, 36, 134, 137, 162, 54, 235, 167,
+ 28, 255, 155, 240, 135, 176, 246, 244, 22, 157, 20, 224, 210, 192, 71, 140,
+ 14, 211, 251, 204, 30, 213, 132, 248, 178, 187, 142, 62, 215, 106, 229, 125,
+ 41, 216, 49, 29, 98, 32, 18, 237, 79, 206, 63, 227, 25, 99, 150, 223,
+ 171, 118, 4, 139, 81, 0, 133, 95, 188, 120, 27, 124, 61, 195, 231, 207,
+ 31, 202, 91, 252, 46, 39, 250, 144, 238, 254, 219, 200, 130, 201, 48, 107,
+ 205, 177, 88, 16, 147, 221, 164, 184, 89, 67, 190, 11, 175, 42, 136, 189,
+ 245, 117, 83, 3, 180, 172, 76, 43, 183, 84, 218, 169, 253, 159, 196, 59,
+ 193, 249, 181, 116, 153, 24, 87, 239, 138, 199, 111, 82, 69, 105, 78, 151,
+ 122, 168, 126, 85, 228, 233, 34, 113, 194, 191, 19, 230, 182, 96, 217, 38,
+ 234, 232, 92, 23, 57, 203, 65, 60, 64, 37, 158, 247, 93, 166, 112, 7
+ };
+ static const uint8_t T3[] = {
+ 103, 33, 228, 32, 183, 231, 139, 60, 67, 80, 184, 100, 70, 19, 14, 58,
+ 104, 48, 140, 10, 91, 137, 31, 96, 102, 180, 77, 121, 251, 167, 37, 206,
+ 79, 151, 109, 15, 92, 174, 108, 16, 95, 145, 18, 236, 49, 177, 135, 0,
+ 165, 86, 83, 107, 144, 44, 27, 116, 168, 193, 119, 230, 56, 97, 138, 149,
+ 132, 21, 176, 39, 205, 12, 69, 179, 210, 25, 213, 194, 239, 209, 248, 28,
+ 93, 38, 224, 66, 105, 160, 40, 17, 23, 129, 212, 8, 178, 118, 163, 73,
+ 3, 63, 57, 94, 254, 186, 131, 166, 61, 191, 133, 192, 78, 114, 250, 200,
+ 222, 136, 188, 204, 101, 11, 247, 146, 142, 152, 171, 157, 110, 141, 199, 29,
+ 147, 88, 211, 240, 164, 196, 189, 50, 65, 112, 219, 237, 197, 115, 126, 154,
+ 246, 170, 227, 235, 42, 148, 84, 201, 242, 85, 35, 6, 173, 122, 215, 218,
+ 75, 82, 1, 169, 143, 195, 51, 155, 54, 9, 71, 24, 53, 7, 47, 229,
+ 158, 26, 245, 89, 150, 181, 255, 249, 221, 217, 223, 76, 90, 36, 216, 130,
+ 220, 125, 182, 55, 202, 234, 203, 123, 34, 172, 74, 30, 4, 241, 162, 233,
+ 64, 62, 127, 20, 52, 106, 190, 253, 185, 111, 232, 2, 187, 13, 68, 117,
+ 128, 98, 208, 41, 159, 46, 207, 244, 226, 22, 252, 214, 5, 243, 99, 113,
+ 120, 225, 175, 124, 134, 161, 156, 45, 72, 87, 43, 59, 198, 153, 238, 81
+ };
+ static const uint8_t T4[] = {
+ 103, 124, 53, 254, 91, 106, 131, 69, 158, 23, 249, 171, 241, 30, 194, 217,
+ 64, 123, 129, 118, 35, 16, 209, 190, 155, 104, 148, 163, 78, 188, 174, 245,
+ 218, 125, 210, 250, 107, 212, 117, 17, 109, 44, 71, 38, 253, 177, 11, 114,
+ 60, 192, 133, 219, 97, 246, 41, 228, 127, 151, 62, 213, 224, 234, 138, 162,
+ 31, 110, 222, 141, 25, 135, 18, 49, 132, 242, 203, 207, 68, 130, 116, 59,
+ 63, 67, 169, 147, 94, 0, 134, 77, 51, 128, 247, 21, 88, 145, 122, 19,
+ 40, 58, 9, 39, 252, 8, 156, 126, 146, 80, 159, 201, 186, 175, 74, 89,
+ 54, 173, 208, 86, 239, 6, 61, 139, 66, 87, 150, 231, 82, 42, 197, 202,
+ 199, 196, 121, 112, 161, 99, 90, 144, 105, 195, 255, 27, 3, 216, 187, 172,
+ 12, 4, 221, 182, 215, 214, 76, 98, 15, 33, 47, 200, 113, 140, 227, 191,
+ 100, 24, 251, 185, 152, 237, 235, 92, 96, 1, 193, 2, 154, 72, 198, 223,
+ 28, 46, 13, 56, 153, 232, 233, 143, 108, 184, 43, 119, 84, 189, 120, 211,
+ 10, 164, 73, 230, 149, 238, 20, 37, 95, 166, 240, 29, 204, 167, 243, 236,
+ 45, 170, 220, 5, 7, 50, 160, 83, 157, 22, 168, 111, 55, 137, 206, 36,
+ 85, 180, 79, 142, 102, 181, 14, 115, 57, 34, 75, 244, 248, 48, 93, 183,
+ 229, 101, 205, 70, 226, 225, 165, 176, 136, 179, 52, 32, 26, 81, 65, 178
+ };
+ unsigned h1 = 0;
+ unsigned h2 = 0;
+ unsigned h3 = 0;
+ unsigned h4 = 0;
+ unsigned i;
+
+ for (i = 0; i != len; ++i) {
+ uint8_t ch = key[i];
+ h1 = T1[h1 ^ ch];
+ h2 = T2[h2 ^ ch];
+ h3 = T3[h3 ^ ch];
+ h4 = T4[h4 ^ ch];
+ }
+
+ return (h4 << 24) | (h3 << 16) | (h2 << 8) | h1;
+}
+
+rc_t HashTableMake(HashTable **rslt, uint32_t initialSize, HashTableKeyCompFunc kf, const void *ctx)
+{
+ HashTable *self;
+ unsigned i;
+
+ *rslt = NULL;
+
+ if (initialSize == 0)
+ initialSize = 2;
+ else {
+ uint32_t m;
+
+ for (m = 2; m < initialSize; m <<= 1)
+ ;
+ initialSize = m;
+
+ if (initialSize > HASH_TABLE_ENTRIES_MAX)
+ initialSize = HASH_TABLE_ENTRIES_MAX;
+ }
+
+ self = malloc(sizeof(*self));
+ if (self == NULL)
+ return RC(rcCont, rcSelf, rcAllocating, rcMemory, rcExhausted);
+
+#if HASH_TABLE_PREALLOC_MAX
+#else
+ self->table = malloc(initialSize * sizeof(self->table[0]));
+ if (self == NULL) {
+ free(self);
+ return RC(rcCont, rcSelf, rcAllocating, rcMemory, rcExhausted);
+ }
+#endif
+
+ for (i = 0; i != initialSize; ++i) {
+ self->table[i].used = 0;
+ self->table[i].overflow = NULL;
+ }
+
+ self->hashMask = initialSize - 1;
+ self->entryCount = 0;
+
+ self->comp_func = kf;
+ self->ctx = ctx;
+
+ *rslt = self;
+
+ return 0;
+}
+
+static bool HashTableValidate(const HashTable *self)
+{
+ unsigned i;
+
+ for (i = 0; i != self->hashMask + 1; ++i) {
+ if (HTBucketValidate(&self->table[i], i, self->hashMask))
+ return true;
+ }
+ return false;
+}
+
+static rc_t HashTableExpand(HashTable *self)
+{
+ const uint32_t mask = (self->hashMask << 1) | 1;
+ size_t size;
+ unsigned i;
+#if HASH_TABLE_PREALLOC_MAX
+#else
+ HTBucket *temp;
+#endif
+
+ /* the table must be smaller than the limit */
+ if (self->hashMask >= HASH_TABLE_ENTRIES_MAX - 1)
+ return 0;
+
+ size = self->hashMask + 1;
+
+ /* the density of used slots needs to be high enough */
+ if (self->entryCount * 4 < size * 3 * 32)
+ return 0;
+
+#if HASH_TABLE_PREALLOC_MAX
+#else
+ temp = realloc(self->table, size * 2);
+ if (temp == NULL)
+ return RC(rcCont, rcTable, rcResizing, rcMemory, rcExhausted);
+ self->table = temp;
+#endif
+
+ /* move any items that should be moved
+ * to the new buckets (about half should)
+ */
+ for (i = 0; i != size; ++i) {
+ HTBucket *bucket = &self->table[i];
+ HTBucket *other = &self->table[i + size];
+
+ other->overflow = NULL;
+ other->used = 0;
+ do {
+ unsigned j;
+ uint32_t bits = bucket->used;
+
+ for (j = 0; j != 32 && bits != 0; ++j, bits >>= 1) {
+ /* slot j occupied? */
+ if ((bits & 1) != 0) {
+ HTEntry *entry = &bucket->entry[j];
+
+ assert((entry->hashValue & self->hashMask) == i);
+
+ while ((entry->hashValue & mask) != i) {
+ rc_t rc;
+
+ /* move to new bucket */
+ assert((entry->hashValue & mask) == i + size);
+
+ rc = HTBucketInsert(other, entry);
+ if (rc) return rc;
+ if (HTBucketFreeSlot(bucket, j))
+ break;
+
+ /* FreeSlot decided to reuse the slot
+ * for something from the overflow,
+ * so process the new thing
+ */
+ assert((entry->hashValue & self->hashMask) == i);
+ }
+ }
+ }
+ bucket = bucket->overflow;
+ } while (bucket);
+ }
+ self->hashMask = mask;
+#if 0
+ HashTableValidate(self);
+#endif
+ return 0;
+}
+
+static rc_t HashTableShrink(HashTable *self)
+{
+ const uint32_t mask = self->hashMask >> 1;
+ size_t size;
+ unsigned i;
+ unsigned j;
+
+ if (self->hashMask > 255)
+ return 0;
+
+ size = self->hashMask + 1;
+
+ if (self->entryCount * 4 >= size * 3 * 32)
+ return 0;
+
+ for (j = 0, i = mask + 1; i != size; ++i, ++j) {
+ HTBucket *bucket = &self->table[i];
+ HTBucket *other = &self->table[j];
+
+ do {
+ unsigned k;
+ uint32_t bits = bucket->used;
+
+ for (k = 0; k != 32 && bits != 0; ++k, bits >>= 1) {
+ if ((bits & 1) != 0) {
+ rc_t rc;
+ HTEntry *entry = &bucket->entry[k];
+
+ assert((entry->hashValue & self->hashMask) == i);
+ assert((entry->hashValue & mask) == j);
+
+ rc = HTBucketInsert(other, entry);
+ if (rc) return rc;
+ }
+ }
+ bucket = bucket->overflow;
+ } while (bucket);
+ }
+ self->hashMask = mask;
+#if 0
+ HashTableValidate(self);
+#endif
+ return 0;
+}
+
+static bool HashTableFindSlot(const HashTable *self,
+ const void *key,
+ uint32_t key_len,
+ HashTableRealIterator *iter
+ )
+{
+ uint32_t h = GetHashValue(key, key_len);
+ const HTBucket *bucket = &self->table[h & self->hashMask];
+ const HTBucket *open_bucket = NULL;
+ int slot = 0;
+
+ iter->hashValue = h;
+ do {
+ unsigned i;
+ uint32_t bits = bucket->used;
+
+ for (i = 0; i != 32 && (bits != 0 || open_bucket == NULL); ++i, bits >>= 1) {
+ if ((bits & 1) == 0) {
+ if (open_bucket == NULL) {
+ open_bucket = bucket;
+ slot = i;
+ }
+ continue;
+ }
+ if (bucket->entry[i].hashValue != h)
+ continue;
+ if (self->comp_func(bucket->entry[i].payload, key, key_len, (void *)self->ctx) != 0)
+ continue;
+
+ iter->bucket = (HTBucket *)bucket;
+ iter->slot = i;
+ return true;
+ }
+ if (bucket->overflow == NULL)
+ break;
+ bucket = bucket->overflow;
+ } while (1);
+ if (open_bucket == NULL) {
+ iter->bucket = (HTBucket *)bucket;
+ iter->slot = 32;
+ }
+ else {
+ iter->bucket = (HTBucket *)open_bucket;
+ iter->slot = slot;
+ }
+
+ return false;
+}
+
+HashTableIterator HashTableLookup(HashTable *self, const void *key, uint32_t key_length)
+{
+ HashTableImplIterator rslt;
+
+ rslt.real.table = self;
+ HashTableFindSlot(self, key, key_length, &rslt.real);
+
+ return rslt.user;
+}
+
+void HashTableRemove(HashTable *self, const HashTableIterator *iter,
+ HashTableFreeFunc whack, void *ctx)
+{
+ const HashTableRealIterator *i = &((const HashTableImplIterator *)iter)->real;
+ uint32_t hv;
+
+ assert(i->table == self);
+ if (i->slot > 32)
+ return;
+ if ((i->bucket->used & (1 << i->slot)) == 0)
+ return;
+
+ hv = i->hashValue;
+ assert(hv == i->bucket->entry[i->slot].hashValue);
+
+ if (whack)
+ whack((void *)i->bucket->entry[i->slot].payload, ctx);
+
+ HTBucketFreeSlot(i->bucket, i->slot);
+ if (i->bucket->used == 0) {
+ HTBucket *parent = &self->table[hv & self->hashMask];
+
+ if (i->bucket != parent) {
+ while (parent->overflow != i->bucket)
+ parent = parent->overflow;
+ assert(parent->overflow == i->bucket);
+ assert(i->bucket->overflow == NULL);
+ parent->overflow = NULL;
+ free(i->bucket);
+ }
+ }
+ --self->entryCount;
+}
+
+void HashTableForEach(const HashTable *self, void (*fn)(void *payload, void *ctx), void *ctx)
+{
+ unsigned i;
+
+ for (i = 0; i != self->hashMask + 1; ++i) {
+ HTBucketForEach(&self->table[i], fn, ctx);
+ }
+}
+
+bool HashTableDoUntil(const HashTable *self, bool (*fn)(void *payload, void *ctx), void *ctx)
+{
+ unsigned i;
+
+ for (i = 0; i != self->hashMask + 1; ++i) {
+ if (HTBucketDoUntil(&self->table[i], fn, ctx))
+ return true;
+ }
+ return false;
+}
+
+void HashTableWhack(HashTable *self, HashTableFreeFunc fn, void *ctx)
+{
+ unsigned i;
+
+ if (self) {
+ for (i = 0; i != self->hashMask + 1; ++i)
+ HTBucketWhack(&self->table[i], fn, ctx);
+#if HASH_TABLE_PREALLOC_MAX
+#else
+ free(self->table);
+#endif
+ free(self);
+ }
+}
+
+bool HashTableIteratorHasValue(const HashTableIterator *iter)
+{
+ const HashTableRealIterator *i = &((const HashTableImplIterator *)iter)->real;
+
+ if (i->slot < 32 && (i->bucket->used & (1 << i->slot)) != 0)
+ return true;
+ return false;
+}
+
+const void *HashTableIteratorGetValue(const HashTableIterator *iter)
+{
+ const HashTableRealIterator *i = &((const HashTableImplIterator *)iter)->real;
+ return i->bucket->entry[i->slot].payload;
+}
+
+rc_t HashTableIteratorSetValue(HashTableIterator *iter, const void *value)
+{
+ HashTableRealIterator *i = &((HashTableImplIterator *)iter)->real;
+ HashTable *self = i->table;
+
+ if (i->slot >= 32) {
+ rc_t rc;
+
+ assert(i->bucket->used == 0xFFFFFFFF);
+ rc = HashTableExpand(self);
+ if (rc)
+ return rc;
+ rc = HTBucketNextOpenSlot(&self->table[i->hashValue & self->hashMask], &i->bucket, &i->slot);
+ if (rc)
+ return rc;
+ }
+ assert((i->bucket->used & (1 << i->slot)) == 0);
+ i->bucket->entry[i->slot].hashValue = i->hashValue;
+ i->bucket->entry[i->slot].payload = value;
+ i->bucket->used |= (1 << i->slot);
+ ++self->entryCount;
+ return 0;
+}
+
+#define TESTING 0
+#if TESTING
+#include <stdio.h>
+#include <string.h>
+
+struct pstring {
+ uint8_t len;
+ char str[255];
+};
+
+static int comp_func(const void *Obj, const void *key, uint32_t len, void *ignore)
+{
+ const struct pstring *obj = Obj;
+ return obj->len == len ? memcmp(obj->str, key, len) : obj->len - len;
+}
+
+static void print_key(void *Obj, void *ignore)
+{
+ const struct pstring *obj = Obj;
+
+ printf("%s\n", obj->str);
+ return;
+}
+
+static struct pstring **LoadTestData(unsigned *count) {
+ FILE *fp = fopen("spot_name.txt", "r");
+ unsigned N = 0;
+ unsigned bytes = 0;
+ struct pstring **rslt;
+
+ *count = 0;
+ if (fp == NULL) {
+ perror("failed to open test data file");
+ return NULL;
+ }
+ do {
+ char buf[256];
+ int i = fscanf(fp, " %256s ", buf);
+ if (i != 1)
+ break;
+ ++N;
+ bytes += strlen(buf);
+ } while (1);
+ rewind(fp);
+
+ rslt = malloc(N * (sizeof(*rslt) + 2) + bytes);
+ if (rslt) {
+ unsigned i;
+ char *cp = (char *)&rslt[N];
+
+ for (i = 0; i != N; ++i) {
+ rslt[i] = (struct pstring *)cp;
+ fscanf(fp, " %s ", rslt[i]->str);
+ rslt[i]->len = strlen(rslt[i]->str);
+ cp += rslt[i]->len + 2;
+ }
+ *count = N;
+ }
+ fclose(fp);
+ return rslt;
+}
+
+bool is_not_consistent(void *payload, void *context)
+{
+ return payload == NULL;
+}
+
+void test(void) {
+ HashTable *ht;
+ struct pstring **testdata;
+ unsigned N;
+ unsigned i;
+
+ srand(time(0));
+
+ testdata = LoadTestData(&N);
+
+ if (HashTableMake(&ht, 0, comp_func, 0) != 0)
+ return;
+
+ for (i = 0; i != N; ++i) {
+ const struct pstring *val = testdata[i % N];
+ HashTableIterator iter = HashTableLookup(ht, val->str, val->len);
+
+ if (HashTableIteratorHasValue(&iter)) {
+ HashTableRemove(ht, &iter, 0, 0);
+ }
+ else {
+ HashTableIteratorSetValue(&iter, val);
+ }
+ }
+#if 1
+ HashTableValidate(ht);
+#else
+ HashTableForEach(ht, print_key, 0);
+#endif
+ HashTableWhack(ht, 0, 0);
+}
+#endif
+
diff --git a/tools/bam-loader/hashtable.h b/tools/bam-loader/hashtable.h
new file mode 100644
index 0000000..e77ee9c
--- /dev/null
+++ b/tools/bam-loader/hashtable.h
@@ -0,0 +1,55 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct HashTable HashTable;
+typedef struct HashTableIterator HashTableIterator;
+
+typedef int (*HashTableKeyCompFunc)(const void *value, const void *key, uint32_t key_length, void *context);
+typedef void (*HashTableFreeFunc)(void *value, void *context);
+
+struct HashTableIterator {
+ const void *root;
+ const void *bucket;
+ uint64_t id;
+};
+
+rc_t HashTableMake(HashTable **rslt, uint32_t initialSize, HashTableKeyCompFunc kf, const void *context);
+
+void HashTableForEach(const HashTable *self, void (*fn)(void *value, void *context), void *context);
+
+bool HashTableDoUntil(const HashTable *self, bool (*fn)(void *value, void *context), void *context);
+
+HashTableIterator HashTableLookup(HashTable *self, const void *key, uint32_t key_length);
+
+void HashTableWhack(HashTable *self, HashTableFreeFunc fn, void *context);
+
+void HashTableRemove(HashTable *self, const HashTableIterator *iter, HashTableFreeFunc whack, void *context);
+
+bool HashTableIteratorHasValue(const HashTableIterator *iter);
+
+const void *HashTableIteratorGetValue(const HashTableIterator *iter);
+
+rc_t HashTableIteratorSetValue(HashTableIterator *iter, const void *value);
diff --git a/tools/bam-loader/loader-imp.c b/tools/bam-loader/loader-imp.c
new file mode 100644
index 0000000..46b46d7
--- /dev/null
+++ b/tools/bam-loader/loader-imp.c
@@ -0,0 +1,3130 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/* #include "bam-load.vers.h" */
+
+#include <klib/callconv.h>
+#include <klib/data-buffer.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/sort.h>
+#include <klib/printf.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kdb/btree.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/meta.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+#include <align/dna-reverse-cmpl.h>
+#include <align/align.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/loader-file.h>
+#include <kapp/loader-meta.h>
+#include <kapp/log-xml.h>
+#include <kapp/progressbar.h>
+
+#include <kproc/queue.h>
+#include <kproc/thread.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+
+#include <sysalloc.h>
+#include <atomic32.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <limits.h>
+#include <time.h>
+#include <zlib.h>
+#include "bam.h"
+#include "bam-alignment.h"
+#include "Globals.h"
+#include "sequence-writer.h"
+#include "reference-writer.h"
+#include "alignment-writer.h"
+#include "mem-bank.h"
+#include "low-match-count.h"
+
+#define NUM_ID_SPACES (256u)
+
+#define MMA_NUM_CHUNKS_BITS (20u)
+#define MMA_NUM_SUBCHUNKS_BITS ((32u)-(MMA_NUM_CHUNKS_BITS))
+#define MMA_SUBCHUNK_SIZE (1u << MMA_NUM_CHUNKS_BITS)
+#define MMA_SUBCHUNK_COUNT (1u << MMA_NUM_SUBCHUNKS_BITS)
+
+typedef struct {
+ int fd;
+ size_t elemSize;
+ off_t fsize;
+ uint8_t *current;
+ struct mma_map_s {
+ struct mma_submap_s {
+ uint8_t *base;
+ } submap[MMA_SUBCHUNK_COUNT];
+ } map[NUM_ID_SPACES];
+} MMArray;
+
+typedef struct {
+ uint32_t primaryId[2];
+ uint32_t spotId;
+ uint32_t fragmentId;
+ uint8_t fragment_len[2]; /*** lowest byte of fragment length to prevent different sizes of primary and secondary alignments **/
+ uint8_t platform;
+ uint8_t pId_ext[2];
+ uint8_t spotId_ext;
+ uint8_t alignmentCount[2]; /* 0..254; 254: saturated max; 255: special meaning "too many" */
+ uint8_t unmated: 1,
+ pcr_dup: 1,
+ unaligned_1: 1,
+ unaligned_2: 1,
+ hardclipped: 1,
+ primary_is_set: 1;
+} ctx_value_t;
+
+#define CTX_VALUE_SET_P_ID(O,N,V) do { int64_t tv = (V); (O).primaryId[N] = (uint32_t)tv; (O).pId_ext[N] = tv >> 32; } while(0);
+#define CTX_VALUE_GET_P_ID(O,N) ((((int64_t)((O).pId_ext[N])) << 32) | (O).primaryId[N])
+
+#define CTX_VALUE_SET_S_ID(O,V) do { int64_t tv = (V); (O).spotId = (uint32_t)tv; (O).spotId_ext = tv >> 32; } while(0);
+#define CTX_VALUE_GET_S_ID(O) ((((int64_t)(O).spotId_ext) << 32) | (O).spotId)
+
+typedef struct FragmentInfo {
+ uint64_t ti;
+ uint32_t readlen;
+ uint8_t aligned;
+ uint8_t is_bad;
+ uint8_t orientation;
+ uint8_t readNo;
+ uint8_t sglen;
+ uint8_t lglen;
+ uint8_t cskey;
+} FragmentInfo;
+
+typedef struct KeyToID {
+ KBTree *key2id[NUM_ID_SPACES];
+ char *key2id_names;
+
+ uint32_t idCount[NUM_ID_SPACES];
+ uint32_t key2id_hash[NUM_ID_SPACES];
+
+ unsigned key2id_max;
+ unsigned key2id_name_max;
+ unsigned key2id_name_alloc;
+ unsigned key2id_count;
+
+ unsigned key2id_name[NUM_ID_SPACES];
+ /* this array is kept in name order */
+ /* this maps the names to key2id and idCount */
+ unsigned key2id_oid[NUM_ID_SPACES];
+} KeyToID;
+
+typedef struct context_t {
+ KeyToID keyToID;
+ const KLoadProgressbar *progress[4];
+ MMArray *id2value;
+ MemBank *frags;
+ int64_t spotId;
+ int64_t primaryId;
+ int64_t secondId;
+ uint64_t alignCount;
+
+ unsigned pass;
+ bool isColorSpace;
+} context_t;
+
+static char const *Print_ctx_value_t(ctx_value_t const *const self)
+{
+ static char buffer[16384];
+ rc_t rc = string_printf(buffer, sizeof(buffer), NULL, "pid: { %lu, %lu }, sid: %lu, fid: %u, alc: { %u, %u }, flg: %x", CTX_VALUE_GET_P_ID(*self, 0), CTX_VALUE_GET_P_ID(*self, 1), CTX_VALUE_GET_S_ID(*self), self->fragmentId, self->alignmentCount[0], self->alignmentCount[1], *(self->alignmentCount + sizeof(self->alignmentCount)/sizeof(self->alignmentCount[0])));
+
+ if (rc)
+ return 0;
+ return buffer;
+}
+
+static rc_t MMArrayMake(MMArray **rslt, int fd, uint32_t elemSize)
+{
+ MMArray *const self = calloc(1, sizeof(*self));
+
+ if (self == NULL)
+ return RC(rcExe, rcMemMap, rcConstructing, rcMemory, rcExhausted);
+ self->elemSize = (elemSize + 3) & ~(3u); /** align to 4 byte **/
+ self->fd = fd;
+ *rslt = self;
+ return 0;
+}
+
+#define PERF 0
+#define PROT 0
+
+static rc_t MMArrayGet(MMArray *const self, void **const value, uint64_t const element)
+{
+ size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+ unsigned const bin_no = element >> 32;
+ unsigned const subbin = ((uint32_t)element) >> MMA_NUM_CHUNKS_BITS;
+ unsigned const in_bin = (uint32_t)element & (MMA_SUBCHUNK_SIZE - 1);
+
+ if (bin_no >= sizeof(self->map)/sizeof(self->map[0]))
+ return RC(rcExe, rcMemMap, rcConstructing, rcId, rcExcessive);
+
+ if (self->map[bin_no].submap[subbin].base == NULL) {
+ off_t const cur_fsize = self->fsize;
+ off_t const new_fsize = cur_fsize + chunk;
+
+ if (ftruncate(self->fd, new_fsize) != 0)
+ return RC(rcExe, rcFile, rcResizing, rcSize, rcExcessive);
+ else {
+ void *const base = mmap(NULL, chunk, PROT_READ|PROT_WRITE,
+ MAP_FILE|MAP_SHARED, self->fd, cur_fsize);
+
+ self->fsize = new_fsize;
+ if (base == MAP_FAILED) {
+ PLOGMSG(klogErr, (klogErr, "Failed to construct map for bin $(bin), subbin $(subbin)", "bin=%u,subbin=%u", bin_no, subbin));
+ return RC(rcExe, rcMemMap, rcConstructing, rcMemory, rcExhausted);
+ }
+ else {
+#if PERF
+ static unsigned mapcount = 0;
+
+ (void)PLOGMSG(klogInfo, (klogInfo, "Number of mmaps: $(cnt)", "cnt=%u", ++mapcount));
+#endif
+ self->map[bin_no].submap[subbin].base = base;
+ }
+ }
+ }
+ uint8_t *const next = self->map[bin_no].submap[subbin].base;
+#if PROT
+ if (next != self->current) {
+ void *const current = self->current;
+
+ if (current)
+ mprotect(current, chunk, PROT_NONE);
+
+ mprotect(self->current = next, chunk, PROT_READ|PROT_WRITE);
+ }
+#endif
+ *value = &next[(size_t)in_bin * self->elemSize];
+ return 0;
+}
+
+static rc_t MMArrayGetRead(MMArray *const self, void const **const value, uint64_t const element)
+{
+ unsigned const bin_no = element >> 32;
+ unsigned const subbin = ((uint32_t)element) >> MMA_NUM_CHUNKS_BITS;
+ unsigned const in_bin = (uint32_t)element & (MMA_SUBCHUNK_SIZE - 1);
+
+ if (bin_no >= sizeof(self->map)/sizeof(self->map[0]))
+ return RC(rcExe, rcMemMap, rcConstructing, rcId, rcExcessive);
+
+ if (self->map[bin_no].submap[subbin].base == NULL)
+ return RC(rcExe, rcMemMap, rcReading, rcId, rcInvalid);
+
+ uint8_t *const next = self->map[bin_no].submap[subbin].base;
+#if PROT
+ size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+ if (next != self->current) {
+ void *const current = self->current;
+
+ if (current)
+ mprotect(current, chunk, PROT_NONE);
+
+ mprotect(self->current = next, chunk, PROT_READ);
+ }
+#endif
+ *value = &next[(size_t)in_bin * self->elemSize];
+ return 0;
+}
+
+static void MMArrayLock(MMArray *const self)
+{
+#if PROT
+ size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+ void *const current = self->current;
+
+ self->current = NULL;
+ if (current)
+ mprotect(current, chunk, PROT_NONE);
+#endif
+}
+
+static void MMArrayClear(MMArray *self)
+{
+ size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+ unsigned i;
+
+ for (i = 0; i != sizeof(self->map)/sizeof(self->map[0]); ++i) {
+ unsigned j;
+
+ for (j = 0; j != sizeof(self->map[0].submap)/sizeof(self->map[0].submap[0]); ++j) {
+ if (self->map[i].submap[j].base) {
+#if PROT
+ mprotect(self->map[i].submap[j].base, chunk, PROT_READ|PROT_WRITE);
+#endif
+ memset(self->map[i].submap[j].base, 0, chunk);
+#if PROT
+ mprotect(self->map[i].submap[j].base, chunk, PROT_NONE);
+#endif
+ }
+ }
+ }
+#if PROT
+ self->current = NULL;
+#endif
+}
+
+static void MMArrayWhack(MMArray *self)
+{
+ size_t const chunk = MMA_SUBCHUNK_SIZE * self->elemSize;
+ unsigned i;
+
+ for (i = 0; i != sizeof(self->map)/sizeof(self->map[0]); ++i) {
+ unsigned j;
+
+ for (j = 0; j != sizeof(self->map[0].submap)/sizeof(self->map[0].submap[0]); ++j) {
+ if (self->map[i].submap[j].base)
+ munmap(self->map[i].submap[j].base, chunk);
+ }
+ }
+ close(self->fd);
+ free(self);
+}
+
+static rc_t OpenKBTree(KBTree **const rslt, unsigned n, unsigned max)
+{
+ size_t const cacheSize = (((G.cache_size - (G.cache_size / 2) - (G.cache_size / 8)) / max)
+ + 0xFFFFF) & ~((size_t)0xFFFFF);
+ KFile *file = NULL;
+ KDirectory *dir;
+ char fname[4096];
+ rc_t rc;
+
+ rc = KDirectoryNativeDir(&dir);
+ if (rc)
+ return rc;
+
+ rc = string_printf(fname, sizeof(fname), NULL, "%s/key2id.%u.%u", G.tmpfs, G.pid, n); if (rc) return rc;
+ rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+ KDirectoryRemove(dir, 0, "%s", fname);
+ KDirectoryRelease(dir);
+ if (rc == 0) {
+ rc = KBTreeMakeUpdate(rslt, file, cacheSize,
+ false, kbtOpaqueKey,
+ 1, 255, sizeof ( uint32_t ),
+ NULL
+ );
+ KFileRelease(file);
+#if PERF
+ if (rc == 0) {
+ static unsigned treecount = 0;
+
+ (void)PLOGMSG(klogInfo, (klogInfo, "Number of trees: $(cnt)", "cnt=%u", ++treecount));
+ }
+#endif
+ }
+ return rc;
+}
+
+static rc_t GetKeyIDOld(KeyToID *const ctx, uint64_t *const rslt, bool *const wasInserted, char const key[], char const name[], unsigned const namelen)
+{
+ unsigned const keylen = strlen(key);
+ rc_t rc;
+ uint64_t tmpKey;
+
+ if (ctx->key2id_count == 0) {
+ rc = OpenKBTree(&ctx->key2id[0], 1, 1);
+ if (rc) return rc;
+ ctx->key2id_count = 1;
+ }
+ if (memcmp(key, name, keylen) == 0) {
+ /* qname starts with read group; no append */
+ tmpKey = ctx->idCount[0];
+ rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, name, namelen);
+ }
+ else {
+ char sbuf[4096];
+ char *buf = sbuf;
+ char *hbuf = NULL;
+ size_t bsize = sizeof(sbuf);
+ size_t actsize;
+
+ if (keylen + namelen + 2 > bsize) {
+ hbuf = malloc(bsize = keylen + namelen + 2);
+ if (hbuf == NULL)
+ return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+ buf = hbuf;
+ }
+ rc = string_printf(buf, bsize, &actsize, "%s\t%.*s", key, (int)namelen, name);
+
+ tmpKey = ctx->idCount[0];
+ rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, buf, actsize);
+ if (hbuf)
+ free(hbuf);
+ }
+ if (rc == 0) {
+ *rslt = tmpKey;
+ if (*wasInserted)
+ ++ctx->idCount[0];
+ }
+ return rc;
+}
+
+static unsigned HashKey(void const *const key, unsigned const keylen)
+{
+#if 0
+ /* There is nothing special about this hash. It was randomly generated. */
+ static const uint8_t T1[] = {
+ 64, 186, 39, 203, 54, 211, 98, 32, 26, 23, 219, 94, 77, 60, 56, 184,
+ 129, 242, 10, 91, 84, 192, 19, 197, 231, 133, 125, 244, 48, 176, 160, 164,
+ 17, 41, 57, 137, 44, 196, 116, 146, 105, 40, 122, 47, 220, 226, 213, 212,
+ 107, 191, 52, 144, 9, 145, 81, 101, 217, 206, 85, 134, 143, 58, 128, 20,
+ 236, 102, 83, 149, 148, 180, 167, 163, 12, 239, 31, 0, 73, 152, 1, 15,
+ 75, 200, 4, 165, 5, 66, 25, 111, 255, 70, 174, 151, 96, 126, 147, 34,
+ 112, 161, 127, 181, 237, 78, 37, 74, 222, 123, 21, 132, 95, 51, 141, 45,
+ 61, 131, 193, 68, 62, 249, 178, 33, 7, 195, 228, 82, 27, 46, 254, 90,
+ 185, 240, 246, 124, 205, 182, 42, 22, 198, 69, 166, 92, 169, 136, 223, 245,
+ 118, 97, 115, 80, 252, 209, 49, 79, 221, 38, 28, 35, 36, 208, 187, 248,
+ 158, 201, 202, 168, 2, 18, 189, 119, 216, 214, 11, 6, 89, 16, 229, 109,
+ 120, 43, 162, 106, 204, 8, 199, 235, 142, 210, 86, 153, 227, 230, 24, 100,
+ 224, 113, 190, 243, 218, 215, 225, 173, 99, 238, 138, 59, 183, 154, 171, 232,
+ 157, 247, 233, 67, 88, 50, 253, 251, 140, 104, 156, 170, 150, 103, 117, 110,
+ 155, 72, 207, 250, 159, 194, 177, 130, 135, 87, 71, 175, 14, 55, 172, 121,
+ 234, 13, 30, 241, 93, 188, 53, 114, 76, 29, 65, 3, 179, 108, 63, 139
+ };
+ unsigned h = 0x55;
+ unsigned i = keylen;
+
+ do { h = T1[h ^ ((uint8_t)i)]; } while ((i >>= 8) != 0);
+
+ for (i = 0; i != keylen; ++i)
+ h = T1[h ^ ((uint8_t const *)key)[i]];
+
+ return h;
+#else
+ /* FNV-1a hash with folding */
+ uint64_t h = 0xcbf29ce484222325;
+ unsigned i;
+
+ for (i = 0; i < keylen; ++i) {
+ uint8_t const octet = ((uint8_t const *)key)[i];
+ h = (h ^ octet) * 0x100000001b3ull;
+ }
+ return ((uint32_t)(h ^ (h >> 32))) % NUM_ID_SPACES;
+#endif
+}
+
+#define USE_ILLUMINA_NAMING_CORRECTION 1
+
+static size_t GetFixedNameLength(char const name[], size_t const namelen)
+{
+#if USE_ILLUMINA_NAMING_CORRECTION
+ /*** Check for possible fixes to illumina names ****/
+ size_t newlen=namelen;
+ /*** First get rid of possible "/1" "/2" "/3" at the end - violates SAM spec **/
+ if(newlen > 2 && name[newlen-2] == '/' && (name[newlen-1] == '1' || name[newlen-1] == '2' || name[newlen-1] == '3')){
+ newlen -=2;
+ }
+ if(newlen > 2 && name[newlen-2] == '#' && (name[newlen-1] == '0')){ /*** Now, find "#0" ***/
+ newlen -=2;
+ } else if(newlen>10){ /*** find #ACGT ***/
+ int i=newlen;
+ for(i--;i>4;i--){ /*** stopping at 4 since the rest of record should still contain :x:y ***/
+ char a=toupper(name[i]);
+ if(a != 'A' && a != 'C' && a !='G' && a !='T'){
+ break;
+ }
+ }
+ if (name[i] == '#'){
+ switch (newlen-i) { /** allowed values for illumina barcodes :5,6,8 **/
+ case 5:
+ case 6:
+ case 8:
+ newlen=i;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if(newlen < namelen){ /*** check for :x:y at the end now - to make sure it is illumina **/
+ int i=newlen;
+ for(i--;i>0 && isdigit(name[i]);i--){}
+ if(name[i]==':'){
+ for(i--;i>0 && isdigit(name[i]);i--){}
+ if(name[i]==':' && newlen > 0){ /*** some name before :x:y should still exist **/
+ /*** looks like illumina ***/
+ return newlen;
+ }
+ }
+ }
+#endif
+ return namelen;
+}
+
+static
+rc_t GetKeyID(KeyToID *const ctx,
+ uint64_t *const rslt,
+ bool *const wasInserted,
+ char const key[],
+ char const name[],
+ size_t const o_namelen)
+{
+ size_t const namelen = GetFixedNameLength(name, o_namelen);
+
+ if (ctx->key2id_max == 1)
+ return GetKeyIDOld(ctx, rslt, wasInserted, key, name, namelen);
+ else {
+ unsigned const keylen = strlen(key);
+ unsigned const h = HashKey(key, keylen);
+ unsigned f;
+ unsigned e = ctx->key2id_count;
+ uint64_t tmpKey;
+
+ *rslt = 0;
+ {{
+ uint32_t const bucket_value = ctx->key2id_hash[h];
+ unsigned const n = (uint8_t) bucket_value;
+ unsigned const i1 = (uint8_t)(bucket_value >> 8);
+ unsigned const i2 = (uint8_t)(bucket_value >> 16);
+ unsigned const i3 = (uint8_t)(bucket_value >> 24);
+
+ if (n > 0 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i1]) == 0) {
+ f = i1;
+ /*
+ ctx->key2id_hash[h] = (i3 << 24) | (i2 << 16) | (i1 << 8) | n;
+ */
+ goto GET_ID;
+ }
+ if (n > 1 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i2]) == 0) {
+ f = i2;
+ ctx->key2id_hash[h] = (i3 << 24) | (i1 << 16) | (i2 << 8) | n;
+ goto GET_ID;
+ }
+ if (n > 2 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i3]) == 0) {
+ f = i3;
+ ctx->key2id_hash[h] = (i2 << 24) | (i1 << 16) | (i3 << 8) | n;
+ goto GET_ID;
+ }
+ }}
+ f = 0;
+ while (f < e) {
+ unsigned const m = (f + e) / 2;
+ unsigned const oid = ctx->key2id_oid[m];
+ int const diff = strcmp(key, ctx->key2id_names + ctx->key2id_name[oid]);
+
+ if (diff < 0)
+ e = m;
+ else if (diff > 0)
+ f = m + 1;
+ else {
+ f = oid;
+ goto GET_ID;
+ }
+ }
+ if (ctx->key2id_count < ctx->key2id_max) {
+ unsigned const name_max = ctx->key2id_name_max + keylen + 1;
+ KBTree *tree;
+ rc_t rc = OpenKBTree(&tree, ctx->key2id_count + 1, 1); /* ctx->key2id_max); */
+
+ if (rc) return rc;
+
+ if (ctx->key2id_name_alloc < name_max) {
+ unsigned alloc = ctx->key2id_name_alloc;
+ void *tmp;
+
+ if (alloc == 0)
+ alloc = 4096;
+ while (alloc < name_max)
+ alloc <<= 1;
+ tmp = realloc(ctx->key2id_names, alloc);
+ if (tmp == NULL)
+ return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+ ctx->key2id_names = tmp;
+ ctx->key2id_name_alloc = alloc;
+ }
+ if (f < ctx->key2id_count) {
+ memmove(&ctx->key2id_oid[f + 1], &ctx->key2id_oid[f], (ctx->key2id_count - f) * sizeof(ctx->key2id_oid[f]));
+ }
+ ctx->key2id_oid[f] = ctx->key2id_count;
+ ++ctx->key2id_count;
+ f = ctx->key2id_oid[f];
+ ctx->key2id_name[f] = ctx->key2id_name_max;
+ ctx->key2id_name_max = name_max;
+
+ memmove(&ctx->key2id_names[ctx->key2id_name[f]], key, keylen + 1);
+ ctx->key2id[f] = tree;
+ ctx->idCount[f] = 0;
+ if ((uint8_t)ctx->key2id_hash[h] < 3) {
+ unsigned const n = (uint8_t)ctx->key2id_hash[h] + 1;
+
+ ctx->key2id_hash[h] = (((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | n;
+ }
+ else {
+ /* the hash function isn't working too well
+ * keep the 3 mru
+ */
+ ctx->key2id_hash[h] = (((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | 3;
+ }
+ GET_ID:
+ tmpKey = ctx->idCount[f];
+ rc = KBTreeEntry(ctx->key2id[f], &tmpKey, wasInserted, name, namelen);
+ if (rc == 0) {
+ *rslt = (((uint64_t)f) << 32) | tmpKey;
+ if (*wasInserted)
+ ++ctx->idCount[f];
+ assert(tmpKey < ctx->idCount[f]);
+ }
+ return rc;
+ }
+ (void)PLOGMSG(klogErr, (klogErr, "too many read groups: max is $(max)", "max=%d", (int)ctx->key2id_count, (int)ctx->key2id_max));
+ return RC(rcExe, rcTree, rcAllocating, rcConstraint, rcViolated);
+ }
+}
+
+static rc_t OpenMMapFile(context_t *const ctx, KDirectory *const dir)
+{
+ int fd;
+ char fname[4096];
+ rc_t rc = string_printf(fname, sizeof(fname), NULL, "%s/id2value.%u", G.tmpfs, G.pid);
+
+ if (rc)
+ return rc;
+
+ fd = open(fname, O_RDWR|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR);
+ if (fd < 0)
+ return RC(rcExe, rcFile, rcCreating, rcFile, rcNotFound);
+ unlink(fname);
+ return MMArrayMake(&ctx->id2value, fd, sizeof(ctx_value_t));
+}
+
+static rc_t TmpfsDirectory(KDirectory **const rslt)
+{
+ KDirectory *dir;
+ rc_t rc = KDirectoryNativeDir(&dir);
+ if (rc == 0) {
+ rc = KDirectoryOpenDirUpdate(dir, rslt, false, "%s", G.tmpfs);
+ KDirectoryRelease(dir);
+ }
+ return rc;
+}
+
+static rc_t SetupContext(context_t *ctx, unsigned numfiles)
+{
+ rc_t rc = 0;
+
+ // memset(ctx, 0, sizeof(*ctx));
+
+ if (G.mode == mode_Archive) {
+ KDirectory *dir;
+ size_t fragSize[2];
+
+ fragSize[1] = (G.cache_size / 8);
+ fragSize[0] = fragSize[1] * 4;
+
+ rc = TmpfsDirectory(&dir);
+ if (rc == 0)
+ rc = OpenMMapFile(ctx, dir);
+ if (rc == 0)
+ rc = MemBankMake(&ctx->frags, dir, G.pid, fragSize);
+ KDirectoryRelease(dir);
+ }
+ else if (G.mode == mode_Remap) {
+ KeyToID const save1 = ctx->keyToID;
+ MMArray *const save2 = ctx->id2value;
+ int64_t const save3 = ctx->spotId;
+
+ memset(ctx, 0, sizeof(*ctx));
+ ctx->keyToID = save1;
+ ctx->id2value = save2;
+ ctx->spotId = save3;
+ }
+
+ rc = KLoadProgressbar_Make(&ctx->progress[0], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[1], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[2], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[3], 0); if (rc) return rc;
+
+ KLoadProgressbar_Append(ctx->progress[0], 100 * numfiles);
+
+ return rc;
+}
+
+static void ContextReleaseMemBank(context_t *ctx)
+{
+ MemBankRelease(ctx->frags);
+ ctx->frags = NULL;
+}
+
+static void ContextRelease(context_t *ctx, bool continuing)
+{
+ KLoadProgressbar_Release(ctx->progress[0], true);
+ KLoadProgressbar_Release(ctx->progress[1], true);
+ KLoadProgressbar_Release(ctx->progress[2], true);
+ KLoadProgressbar_Release(ctx->progress[3], true);
+ if (!continuing)
+ MMArrayWhack(ctx->id2value);
+ else
+ MMArrayClear(ctx->id2value);
+}
+
+static
+void COPY_QUAL(uint8_t D[], uint8_t const S[], unsigned const L, bool const R)
+{
+ if (R) {
+ unsigned i;
+ unsigned j;
+
+ for (i = 0, j = L - 1; i != L; ++i, --j)
+ D[i] = S[j];
+ }
+ else
+ memmove(D, S, L);
+}
+
+static
+void COPY_READ(INSDC_dna_text D[], INSDC_dna_text const S[], unsigned const L, bool const R)
+{
+ static INSDC_dna_text const compl[] = {
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , '.', 0 ,
+ '0', '1', '2', '3', 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
+ };
+ if (R) {
+ unsigned i;
+ unsigned j;
+
+ for (i = 0, j = L - 1; i != L; ++i, --j)
+ D[i] = compl[((uint8_t const *)S)[j]];
+ }
+ else
+ memmove(D, S, L);
+}
+
+static KFile *MakeDeferralFile() {
+ if (G.deferSecondary) {
+ char template[4096];
+ int fd;
+ KFile *f;
+ KDirectory *d;
+ size_t nwrit;
+
+ KDirectoryNativeDir(&d);
+ string_printf(template, sizeof(template), &nwrit, "%s/defer.XXXXXX", G.tmpfs);
+ fd = mkstemp(template);
+ KDirectoryOpenFileWrite(d, &f, true, template);
+ close(fd);
+ unlink(template);
+ return f;
+ }
+ return NULL;
+}
+
+static rc_t OpenBAM(const BAM_File **bam, VDatabase *db, const char bamFile[])
+{
+ rc_t rc = 0;
+
+ if (strcmp(bamFile, "/dev/stdin") == 0) {
+ rc = BAM_FileMake(bam, MakeDeferralFile(), G.headerText, "/dev/stdin");
+ }
+ else {
+ rc = BAM_FileMake(bam, MakeDeferralFile(), G.headerText, "%s", bamFile);
+ }
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to open '$(file)'", "file=%s", bamFile));
+ }
+ else if (db) {
+ KMetadata *dbmeta;
+
+ rc = VDatabaseOpenMetadataUpdate(db, &dbmeta);
+ if (rc == 0) {
+ KMDataNode *node;
+
+ rc = KMetadataOpenNodeUpdate(dbmeta, &node, "BAM_HEADER");
+ KMetadataRelease(dbmeta);
+ if (rc == 0) {
+ char const *header;
+ size_t size;
+
+ rc = BAM_FileGetHeaderText(*bam, &header, &size);
+ if (rc == 0) {
+ rc = KMDataNodeWrite(node, header, size);
+ }
+ KMDataNodeRelease(node);
+ }
+ }
+ }
+
+ return rc;
+}
+
+static rc_t VerifyReferences(BAM_File const *bam, Reference const *ref)
+{
+ rc_t rc = 0;
+ uint32_t n;
+ unsigned i;
+
+ BAM_FileGetRefSeqCount(bam, &n);
+ for (i = 0; i != n; ++i) {
+ BAMRefSeq const *refSeq;
+
+ BAM_FileGetRefSeq(bam, i, &refSeq);
+ if (G.refFilter && strcmp(refSeq->name, G.refFilter) != 0)
+ continue;
+
+ rc = ReferenceVerify(ref, refSeq->name, refSeq->length, refSeq->checksum);
+ if (rc) {
+ if (GetRCObject(rc) == rcChecksum && GetRCState(rc) == rcUnequal) {
+#if NCBI
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference: '$(name)', Length: $(len); checksums do not match", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+#endif
+ }
+ else if (GetRCObject(rc) == rcSize && GetRCState(rc) == rcUnequal) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference: '$(name)', Length: $(len); lengths do not match", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ else if (GetRCObject(rc) == rcSize && GetRCState(rc) == rcEmpty) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference: '$(name)', Length: $(len); fasta file is empty", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ else if (GetRCObject(rc) == rcId && GetRCState(rc) == rcNotFound) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Reference: '$(name)', Length: $(len); no match found", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ else {
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "Reference: '$(name)', Length: $(len); error", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ }
+ else if (G.onlyVerifyReferences) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Reference: '$(name)', Length: $(len); match found", "name=%s,len=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ }
+ return 0;
+}
+
+static uint8_t GetMapQ(BAM_Alignment const *rec)
+{
+ uint8_t mapQ;
+
+ BAM_AlignmentGetMapQuality(rec, &mapQ);
+ return mapQ;
+}
+
+static bool EditAlignedQualities(uint8_t qual[], bool const hasMismatch[], unsigned readlen)
+{
+ unsigned i;
+ bool changed = false;
+
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q_0 = qual[i];
+ uint8_t const q_1= hasMismatch[i] ? G.alignedQualValue : q_0;
+
+ if (q_0 != q_1) {
+ changed = true;
+ break;
+ }
+ }
+ if (!changed)
+ return false;
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q_0 = qual[i];
+ uint8_t const q_1= hasMismatch[i] ? G.alignedQualValue : q_0;
+
+ qual[i] = q_1;
+ }
+ return true;
+}
+
+static bool EditUnalignedQualities(uint8_t qual[], bool const hasMismatch[], unsigned readlen)
+{
+ unsigned i;
+ bool changed = false;
+
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q_0 = qual[i];
+ uint8_t const q_1 = (q_0 & 0x7F) | (hasMismatch[i] ? 0x80 : 0);
+
+ if (q_0 != q_1) {
+ changed = true;
+ break;
+ }
+ }
+ if (!changed)
+ return false;
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q_0 = qual[i];
+ uint8_t const q_1 = (q_0 & 0x7F) | (hasMismatch[i] ? 0x80 : 0);
+
+ qual[i] = q_1;
+ }
+ return true;
+}
+
+static bool platform_cmp(char const platform[], char const test[])
+{
+ unsigned i;
+
+ for (i = 0; ; ++i) {
+ int ch1 = test[i];
+ int ch2 = toupper(platform[i]);
+
+ if (ch1 != ch2)
+ break;
+ if (ch1 == 0)
+ return true;
+ }
+ return false;
+}
+
+static
+INSDC_SRA_platform_id GetINSDCPlatform(BAM_File const *bam, char const name[]) {
+ if (name) {
+ BAMReadGroup const *rg;
+
+ BAM_FileGetReadGroupByName(bam, name, &rg);
+ if (rg && rg->platform) {
+ switch (toupper(rg->platform[0])) {
+ case 'C':
+ if (platform_cmp(rg->platform, "COMPLETE GENOMICS"))
+ return SRA_PLATFORM_COMPLETE_GENOMICS;
+ if (platform_cmp(rg->platform, "CAPILLARY"))
+ return SRA_PLATFORM_CAPILLARY;
+ break;
+ case 'H':
+ if (platform_cmp(rg->platform, "HELICOS"))
+ return SRA_PLATFORM_HELICOS;
+ break;
+ case 'I':
+ if (platform_cmp(rg->platform, "ILLUMINA"))
+ return SRA_PLATFORM_ILLUMINA;
+ if (platform_cmp(rg->platform, "IONTORRENT"))
+ return SRA_PLATFORM_ION_TORRENT;
+ break;
+ case 'L':
+ if (platform_cmp(rg->platform, "LS454"))
+ return SRA_PLATFORM_454;
+ break;
+ case 'N':
+ if (platform_cmp(name, "NANOPORE"))
+ return SRA_PLATFORM_OXFORD_NANOPORE;
+ break;
+ case 'O':
+ if (platform_cmp(name, "OXFORD_NANOPORE"))
+ return SRA_PLATFORM_OXFORD_NANOPORE;
+ break;
+ case 'P':
+ if (platform_cmp(rg->platform, "PACBIO"))
+ return SRA_PLATFORM_PACBIO_SMRT;
+ break;
+ case 'S':
+ if (platform_cmp(rg->platform, "SOLID"))
+ return SRA_PLATFORM_ABSOLID;
+ if (platform_cmp(name, "SANGER"))
+ return SRA_PLATFORM_CAPILLARY;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return SRA_PLATFORM_UNDEFINED;
+}
+
+static
+rc_t CheckLimitAndLogError(void)
+{
+ unsigned const count = ++G.errCount;
+
+ if (G.maxErrCount > 0 && count > G.maxErrCount) {
+ (void)PLOGERR(klogErr, (klogErr, SILENT_RC(rcAlign, rcFile, rcReading, rcError, rcExcessive), "Number of errors $(cnt) exceeds limit of $(max): Exiting", "cnt=%u,max=%u", count, G.maxErrCount));
+ return RC(rcAlign, rcFile, rcReading, rcError, rcExcessive);
+ }
+ return 0;
+}
+
+static
+void RecordNoMatch(char const readName[], char const refName[], uint32_t const refPos)
+{
+ if (G.noMatchLog) {
+ static uint64_t lpos = 0;
+ char logbuf[256];
+ size_t len;
+
+ if (string_printf(logbuf, sizeof(logbuf), &len, "%s\t%s\t%u\n", readName, refName, refPos) == 0) {
+ KFileWrite(G.noMatchLog, lpos, logbuf, len, NULL);
+ lpos += len;
+ }
+ }
+}
+
+static LowMatchCounter *lmc = NULL;
+
+static
+rc_t LogNoMatch(char const readName[], char const refName[], unsigned rpos, unsigned matches)
+{
+ rc_t const rc = CheckLimitAndLogError();
+ static unsigned count = 0;
+
+ if (lmc == NULL)
+ lmc = LowMatchCounterMake();
+ assert(lmc != NULL);
+ LowMatchCounterAdd(lmc, refName);
+
+ ++count;
+ if (rc) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+ "occurred=%u", count));
+ (void)PLOGMSG(klogErr, (klogErr, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+ "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+ return rc;
+ }
+ if (G.maxWarnCount_NoMatch == 0 || count < G.maxWarnCount_NoMatch)
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+ "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+ return 0;
+}
+
+struct rlmc_context {
+ KMDataNode *node;
+ unsigned node_number;
+ rc_t rc;
+};
+
+static void RecordLowMatchCount(void *Ctx, char const name[], unsigned const count)
+{
+ struct rlmc_context *const ctx = Ctx;
+
+ if (ctx->rc == 0) {
+ KMDataNode *sub = NULL;
+
+ ctx->rc = KMDataNodeOpenNodeUpdate(ctx->node, &sub, "LOW_MATCH_COUNT_%u", ++ctx->node_number);
+ if (ctx->rc == 0) {
+ uint32_t const count_temp = count;
+ ctx->rc = KMDataNodeWriteAttr(sub, "REFNAME", name);
+ if (ctx->rc == 0)
+ ctx->rc = KMDataNodeWriteB32(sub, &count_temp);
+
+ KMDataNodeRelease(sub);
+ }
+ }
+}
+
+static rc_t RecordLowMatchCounts(KMDataNode *const node)
+{
+ struct rlmc_context ctx;
+
+ assert(lmc != NULL);
+ if (node) {
+ ctx.node = node;
+ ctx.node_number = 0;
+ ctx.rc = 0;
+
+ LowMatchCounterEach(lmc, &ctx, RecordLowMatchCount);
+ }
+ return ctx.rc;
+}
+
+static
+rc_t LogDupConflict(char const readName[])
+{
+ rc_t const rc = CheckLimitAndLogError();
+ static unsigned count = 0;
+
+ ++count;
+ if (rc) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+ "occurred=%u", count));
+ (void)PLOGERR(klogWarn, (klogWarn, SILENT_RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+ "name=%s", readName));
+ }
+ else if (G.maxWarnCount_DupConflict == 0 || count < G.maxWarnCount_DupConflict)
+ (void)PLOGERR(klogWarn, (klogWarn, SILENT_RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+ "name=%s", readName));
+ return rc;
+}
+
+static char const *const CHANGED[] = {
+ "FLAG changed",
+ "QUAL changed",
+ "SEQ changed",
+ "record made unaligned",
+ "record made unfragmented",
+ "mate alignment lost",
+ "record discarded",
+ "reference name changed",
+ "CIGAR changed"
+};
+
+#define FLAG_CHANGED (0)
+#define QUAL_CHANGED (1)
+#define SEQ_CHANGED (2)
+#define MAKE_UNALIGNED (3)
+#define MAKE_UNFRAGMENTED (4)
+#define MATE_LOST (5)
+#define DISCARDED (6)
+#define REF_NAME_CHANGED (7)
+#define CIGAR_CHANGED (8)
+
+static char const *const REASONS[] = {
+/* FLAG changed */
+ "0x400 and 0x200 both set", /* 0 */
+ "conflicting PCR Dup flags", /* 1 */
+ "primary alignment already exists", /* 2 */
+ "was already recorded as unaligned", /* 3 */
+/* QUAL changed */
+ "original quality used", /* 4 */
+ "unaligned colorspace", /* 5 */
+ "aligned bases", /* 6 */
+ "unaligned bases", /* 7 */
+ "reversed", /* 8 */
+/* unaligned */
+ "low MAPQ", /* 9 */
+ "low match count", /* 10 */
+ "missing alignment info", /* 11 */
+ "missing reference position", /* 12 */
+ "invalid alignment info", /* 13 */
+ "invalid reference position", /* 14 */
+ "invalid reference", /* 15 */
+ "unaligned reference", /* 16 */
+ "unknown reference", /* 17 */
+ "hard-clipped colorspace", /* 18 */
+/* unfragmented */
+ "missing fragment info", /* 19 */
+ "too many fragments", /* 20 */
+/* mate info lost */
+ "invalid mate reference", /* 21 */
+ "missing mate alignment info", /* 22 */
+ "unknown mate reference", /* 23 */
+/* discarded */
+ "conflicting PCR duplicate", /* 24 */
+ "conflicting fragment info", /* 25 */
+ "reference is skipped", /* 26 */
+/* reference name changed */
+ "reference was named more than once", /* 27 */
+/* CIGAR changed */
+ "alignment overhanging end of reference", /* 28 */
+/* discarded */
+ "hard-clipped secondary alignment", /* 29 */
+ "low-matching secondary alignment", /* 30 */
+};
+
+static struct {
+ unsigned what, why;
+} const CHANGES[] = {
+ {FLAG_CHANGED, 0},
+ {FLAG_CHANGED, 1},
+ {FLAG_CHANGED, 2},
+ {FLAG_CHANGED, 3},
+ {QUAL_CHANGED, 4},
+ {QUAL_CHANGED, 5},
+ {QUAL_CHANGED, 6},
+ {QUAL_CHANGED, 7},
+ {QUAL_CHANGED, 8},
+ {SEQ_CHANGED, 8},
+ {MAKE_UNALIGNED, 9},
+ {MAKE_UNALIGNED, 10},
+ {MAKE_UNALIGNED, 11},
+ {MAKE_UNALIGNED, 12},
+ {MAKE_UNALIGNED, 13},
+ {MAKE_UNALIGNED, 14},
+ {MAKE_UNALIGNED, 15},
+ {MAKE_UNALIGNED, 16},
+ {MAKE_UNALIGNED, 17},
+ {MAKE_UNALIGNED, 18},
+ {MAKE_UNFRAGMENTED, 19},
+ {MAKE_UNFRAGMENTED, 20},
+ {MATE_LOST, 21},
+ {MATE_LOST, 22},
+ {MATE_LOST, 23},
+ {DISCARDED, 24},
+ {DISCARDED, 25},
+ {DISCARDED, 26},
+ {DISCARDED, 17},
+ {REF_NAME_CHANGED, 27},
+ {CIGAR_CHANGED, 28},
+ {DISCARDED, 29},
+ {DISCARDED, 30},
+};
+
+#define NUMBER_OF_CHANGES ((unsigned)(sizeof(CHANGES)/sizeof(CHANGES[0])))
+static unsigned change_counter[NUMBER_OF_CHANGES];
+
+static void LOG_CHANGE(unsigned const change)
+{
+ ++change_counter[change];
+}
+
+static void PrintChangeReport(void)
+{
+ unsigned i;
+
+ for (i = 0; i != NUMBER_OF_CHANGES; ++i) {
+ if (change_counter[i] > 0) {
+ char const *const what = CHANGED[CHANGES[i].what];
+ char const *const why = REASONS[CHANGES[i].why];
+
+ PLOGMSG(klogInfo, (klogInfo, "$(what) $(times) times because $(reason)", "what=%s,reason=%s,times=%u", what, why, change_counter[i]));
+ }
+ }
+}
+
+static rc_t RecordChange(KMDataNode *const node,
+ char const node_name[],
+ unsigned const node_number,
+ char const what[],
+ char const why[],
+ unsigned const count)
+{
+ KMDataNode *sub = NULL;
+ rc_t const rc_sub = KMDataNodeOpenNodeUpdate(node, &sub, "%s_%u", node_name, node_number);
+
+ if (rc_sub) return rc_sub;
+ {
+ uint32_t const count_temp = count;
+ rc_t const rc_attr1 = KMDataNodeWriteAttr(sub, "change", what);
+ rc_t const rc_attr2 = KMDataNodeWriteAttr(sub, "reason", why);
+ rc_t const rc_value = KMDataNodeWriteB32(sub, &count_temp);
+
+ KMDataNodeRelease(sub);
+ if (rc_attr1) return rc_attr1;
+ if (rc_attr2) return rc_attr2;
+ if (rc_value) return rc_value;
+
+ return 0;
+ }
+}
+
+static rc_t RecordChanges(KMDataNode *const node, char const name[])
+{
+ if (node) {
+ unsigned i;
+ unsigned j = 0;
+
+ for (i = 0; i != NUMBER_OF_CHANGES; ++i) {
+ if (change_counter[i] > 0) {
+ char const *const what = CHANGED[CHANGES[i].what];
+ char const *const why = REASONS[CHANGES[i].why];
+ rc_t const rc = RecordChange(node, name, ++j, what, why, change_counter[i]);
+
+ if (rc) return rc;
+ }
+ }
+ }
+ return 0;
+}
+
+#define FLAG_CHANGED_400_AND_200 do { LOG_CHANGE( 0); } while(0)
+#define FLAG_CHANGED_PCR_DUP do { LOG_CHANGE( 1); } while(0)
+#define FLAG_CHANGED_PRIMARY_DUP do { LOG_CHANGE( 2); } while(0)
+#define FLAG_CHANGED_WAS_UNALIGNED do { LOG_CHANGE( 3); } while(0)
+#define QUAL_CHANGED_OQ do { LOG_CHANGE( 4); } while(0)
+#define QUAL_CHANGED_UNALIGNED_CS do { LOG_CHANGE( 5); } while(0)
+#define QUAL_CHANGED_ALIGNED_EDIT do { LOG_CHANGE( 6); } while(0)
+#define QUAL_CHANGED_UNALIGN_EDIT do { LOG_CHANGE( 7); } while(0)
+#define QUAL_CHANGED_REVERSED do { LOG_CHANGE( 8); } while(0)
+#define SEQ__CHANGED_REV_COMP do { LOG_CHANGE( 9); } while(0)
+#define UNALIGNED_LOW_MAPQ do { LOG_CHANGE(10); } while(0)
+#define UNALIGNED_LOW_MATCH_COUNT do { LOG_CHANGE(11); } while(0)
+#define UNALIGNED_MISSING_INFO do { LOG_CHANGE(12); } while(0)
+#define UNALIGNED_MISSING_REF_POS do { LOG_CHANGE(13); } while(0)
+#define UNALIGNED_INVALID_INFO do { LOG_CHANGE(14); } while(0)
+#define UNALIGNED_INVALID_REF_POS do { LOG_CHANGE(15); } while(0)
+#define UNALIGNED_INVALID_REF do { LOG_CHANGE(16); } while(0)
+#define UNALIGNED_UNALIGNED_REF do { LOG_CHANGE(17); } while(0)
+#define UNALIGNED_UNKNOWN_REF do { LOG_CHANGE(18); } while(0)
+#define UNALIGNED_HARD_CLIPPED_CS do { LOG_CHANGE(19); } while(0)
+#define UNFRAGMENT_MISSING_INFO do { LOG_CHANGE(20); } while(0)
+#define UNFRAGMENT_TOO_MANY do { LOG_CHANGE(21); } while(0)
+#define MATE_INFO_LOST_INVALID do { LOG_CHANGE(22); } while(0)
+#define MATE_INFO_LOST_MISSING do { LOG_CHANGE(23); } while(0)
+#define MATE_INFO_LOST_UNKNOWN_REF do { LOG_CHANGE(24); } while(0)
+#define DISCARD_PCR_DUP do { LOG_CHANGE(25); } while(0)
+#define DISCARD_BAD_FRAGMENT_INFO do { LOG_CHANGE(26); } while(0)
+#define DISCARD_SKIP_REFERENCE do { LOG_CHANGE(27); } while(0)
+#define DISCARD_UNKNOWN_REFERENCE do { LOG_CHANGE(28); } while(0)
+#define RENAMED_REFERENCE do { LOG_CHANGE(29); } while(0)
+#define OVERHANGING_ALIGNMENT do { LOG_CHANGE(30); } while(0)
+#define DISCARD_HARDCLIP_SECONDARY do { LOG_CHANGE(31); } while(0)
+#define DISCARD_BAD_SECONDARY do { LOG_CHANGE(32); } while(0)
+
+static bool isHardClipped(unsigned const ops, uint32_t const cigar[/* ops */])
+{
+ unsigned i;
+
+ for (i = 0; i < ops; ++i) {
+ uint32_t const op = cigar[i];
+ int const code = op & 0x0F;
+
+ if (code == 5)
+ return true;
+ }
+ return false;
+}
+
+static rc_t FixOverhangingAlignment(KDataBuffer *cigBuf, uint32_t *opCount, uint32_t refPos, uint32_t refLen, uint32_t readlen)
+{
+ uint32_t const *cigar = cigBuf->base;
+ int refend = refPos;
+ int seqpos = 0;
+ unsigned i;
+
+ for (i = 0; i < *opCount; ++i) {
+ uint32_t const op = cigar[i];
+ int const len = op >> 4;
+ int const code = op & 0x0F;
+
+ switch (code) {
+ case 0: /* M */
+ case 7: /* = */
+ case 8: /* X */
+ seqpos += len;
+ refend += len;
+ break;
+ case 2: /* D */
+ case 3: /* N */
+ refend += len;
+ break;
+ case 1: /* I */
+ case 4: /* S */
+ case 9: /* B */
+ seqpos += len;
+ default:
+ break;
+ }
+ if (refend > refLen) {
+ int const chop = refend - refLen;
+ int const newlen = len - chop;
+ int const left = seqpos - chop;
+ if (left * 2 > readlen) {
+ int const clip = readlen - left;
+ rc_t rc;
+
+ *opCount = i + 2;
+ rc = KDataBufferResize(cigBuf, *opCount);
+ if (rc) return rc;
+ ((uint32_t *)cigBuf->base)[i ] = (newlen << 4) | code;
+ ((uint32_t *)cigBuf->base)[i+1] = (clip << 4) | 4;
+ OVERHANGING_ALIGNMENT;
+ break;
+ }
+ }
+ }
+ return 0;
+}
+
+static context_t GlobalContext;
+static timeout_t bamq_tm;
+static KQueue *bamq;
+static KThread *bamread_thread;
+
+static rc_t run_bamread_thread(const KThread *self, void *const file)
+{
+ rc_t rc = 0;
+ size_t NR = 0;
+
+ while (rc == 0) {
+ BAM_Alignment const *crec = NULL;
+ BAM_Alignment *rec = NULL;
+
+ ++NR;
+ rc = BAM_FileRead2(file, &crec);
+ if ((int)GetRCObject(rc) == rcRow && (int)GetRCState(rc) == rcEmpty) {
+ rc = CheckLimitAndLogError();
+ continue;
+ }
+ if ((int)GetRCObject(rc) == rcRow && (int)GetRCState(rc) == rcNotFound) {
+ /* EOF */
+ rc = 0;
+ --NR;
+ break;
+ }
+ if (rc) break;
+ rc = BAM_AlignmentCopy(crec, &rec);
+ BAM_AlignmentRelease(crec);
+ if (rc) break;
+
+ {
+ static char const dummy[] = "";
+ char const *spotGroup;
+ char const *name;
+ size_t namelen;
+
+ BAM_AlignmentGetReadName2(rec, &name, &namelen);
+ BAM_AlignmentGetReadGroupName(rec, &spotGroup);
+ rc = GetKeyID(&GlobalContext.keyToID, &rec->keyId, &rec->wasInserted, spotGroup ? spotGroup : dummy, name, namelen);
+ if (rc) break;
+ }
+
+ for ( ; ; ) {
+ rc = KQueuePush(bamq, rec, &bamq_tm);
+ if (rc == 0 || (int)GetRCObject(rc) != rcTimeout)
+ break;
+ }
+ }
+ KQueueSeal(bamq);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "bamread_thread done");
+ }
+ else {
+ (void)PLOGMSG(klogInfo, (klogInfo, "bamread_thread done; read $(NR) records", "NR=%lu", NR));
+ }
+ return rc;
+}
+
+/* call on main thread only */
+static BAM_Alignment const *getNextRecord(BAM_File const *const bam, rc_t *const rc)
+{
+ if (bamq == NULL) {
+ TimeoutInit(&bamq_tm, 10000); /* 10 seconds */
+ *rc = KQueueMake(&bamq, 4096);
+ if (*rc) return NULL;
+ *rc = KThreadMake(&bamread_thread, run_bamread_thread, (void *)bam);
+ if (*rc) {
+ KQueueRelease(bamq);
+ bamq = NULL;
+ return NULL;
+ }
+ }
+ while (*rc == 0 && (*rc = Quitting()) == 0) {
+ BAM_Alignment const *rec = NULL;
+
+ *rc = KQueuePop(bamq, (void **)&rec, &bamq_tm);
+ if (*rc == 0)
+ return rec; /* this is the normal return */
+
+ if ((int)GetRCObject(*rc) == rcTimeout)
+ *rc = 0;
+ else {
+ if ((int)GetRCObject(*rc) == rcData && (int)GetRCState(*rc) == rcDone)
+ (void)LOGMSG(klogDebug, "KQueuePop Done");
+ else
+ (void)PLOGERR(klogWarn, (klogWarn, *rc, "KQueuePop Error", NULL));
+ }
+ }
+ KQueueSeal(bamq);
+ {
+ rc_t rc2 = 0;
+ KThreadWait(bamread_thread, &rc2);
+ if (rc2 != 0)
+ *rc = rc2;
+ }
+ KThreadRelease(bamread_thread);
+ bamread_thread = NULL;
+ KQueueRelease(bamq);
+ bamq = NULL;
+ return NULL;
+}
+
+static void getSpotGroup(BAM_Alignment const *const rec, char spotGroup[])
+{
+ char const *rgname;
+
+ BAM_AlignmentGetReadGroupName(rec, &rgname);
+ if (rgname)
+ strcpy(spotGroup, rgname);
+ else
+ spotGroup[0] = '\0';
+}
+
+static char const *getLinkageGroup(BAM_Alignment const *const rec)
+{
+ static char linkageGroup[1024];
+ char const *BX = NULL;
+ char const *CB = NULL;
+ char const *UB = NULL;
+
+ linkageGroup[0] = '\0';
+ BAM_AlignmentGetLinkageGroup(rec, &BX, &CB, &UB);
+ if (BX == NULL) {
+ if (CB != NULL && UB != NULL) {
+ unsigned const cblen = strlen(CB);
+ unsigned const ublen = strlen(UB);
+ if (cblen + ublen + 8 < sizeof(linkageGroup)) {
+ memmove(&linkageGroup[ 0], "CB:", 3);
+ memmove(&linkageGroup[ 3], CB, cblen);
+ memmove(&linkageGroup[cblen + 3], "|UB:", 4);
+ memmove(&linkageGroup[cblen + 7], UB, ublen + 1);
+ }
+ }
+ }
+ else {
+ unsigned const bxlen = strlen(BX);
+ if (bxlen + 1 < sizeof(linkageGroup))
+ memmove(linkageGroup, BX, bxlen + 1);
+ }
+ return linkageGroup;
+}
+
+static rc_t ProcessBAM(char const bamFile[], context_t *ctx, VDatabase *db,
+ /* data outputs */
+ Reference *ref, Sequence *seq, Alignment *align,
+ /* output parameters */
+ bool *had_alignments, bool *had_sequences)
+{
+ const BAM_File *bam;
+ const BAM_Alignment *rec;
+ KDataBuffer buf;
+ KDataBuffer fragBuf;
+ KDataBuffer cigBuf;
+ rc_t rc;
+ int32_t lastRefSeqId = -1;
+ bool wasRenamed = false;
+ size_t rsize;
+ uint64_t keyId = 0;
+ uint64_t reccount = 0;
+ char spotGroup[512];
+ size_t namelen;
+ float progress = 0.0;
+ unsigned warned = 0;
+ long fcountBoth=0;
+ long fcountOne=0;
+ int skipRefSeqID = -1;
+ int unmapRefSeqId = -1;
+ uint64_t recordsRead = 0;
+ uint64_t recordsProcessed = 0;
+ uint64_t filterFlagConflictRecords=0; /*** counts number of conflicts between flags 0x400 and 0x200 ***/
+#define MAX_WARNINGS_FLAG_CONFLICT 10000 /*** maximum errors to report ***/
+
+ bool isColorSpace = false;
+ bool isNotColorSpace = G.noColorSpace;
+ char alignGroup[32];
+ size_t alignGroupLen;
+ AlignmentRecord data;
+ KDataBuffer seqBuffer;
+ KDataBuffer qualBuffer;
+ SequenceRecord srec;
+ SequenceRecordStorage srecStorage;
+
+ /* setting up buffers */
+ memset(&data, 0, sizeof(data));
+ memset(&srec, 0, sizeof(srec));
+
+ srec.ti = srecStorage.ti;
+ srec.readStart = srecStorage.readStart;
+ srec.readLen = srecStorage.readLen;
+ srec.orientation = srecStorage.orientation;
+ srec.is_bad = srecStorage.is_bad;
+ srec.alignmentCount = srecStorage.alignmentCount;
+ srec.aligned = srecStorage.aligned;
+ srec.cskey = srecStorage. cskey;
+
+ rc = OpenBAM(&bam, db, bamFile);
+ if (rc) return rc;
+ if (!G.noVerifyReferences && ref != NULL) {
+ rc = VerifyReferences(bam, ref);
+ if (G.onlyVerifyReferences) {
+ BAM_FileRelease(bam);
+ return rc;
+ }
+ }
+ if (ctx->keyToID.key2id_max == 0) {
+ uint32_t rgcount;
+ unsigned rgi;
+
+ BAM_FileGetReadGroupCount(bam, &rgcount);
+ if (rgcount > (sizeof(ctx->keyToID.key2id)/sizeof(ctx->keyToID.key2id[0]) - 1))
+ ctx->keyToID.key2id_max = 1;
+ else
+ ctx->keyToID.key2id_max = sizeof(ctx->keyToID.key2id)/sizeof(ctx->keyToID.key2id[0]);
+
+ for (rgi = 0; rgi != rgcount; ++rgi) {
+ BAMReadGroup const *rg;
+
+ BAM_FileGetReadGroup(bam, rgi, &rg);
+ if (rg && rg->platform && platform_cmp(rg->platform, "CAPILLARY")) {
+ G.hasTI = true;
+ break;
+ }
+ }
+ }
+
+ /* setting up more buffers */
+ rc = KDataBufferMake(&cigBuf, 32, 0);
+ if (rc)
+ return rc;
+
+ rc = KDataBufferMake(&fragBuf, 8, 1024);
+ if (rc)
+ return rc;
+
+ rc = KDataBufferMake(&buf, 16, 0);
+ if (rc)
+ return rc;
+
+ rc = KDataBufferMake(&seqBuffer, 8, 4096);
+ if (rc)
+ return rc;
+
+ rc = KDataBufferMake(&qualBuffer, 8, 4096);
+ if (rc)
+ return rc;
+
+ if (rc == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Loading '$(file)'", "file=%s", bamFile));
+ }
+
+ while ((rec = getNextRecord(bam, &rc)) != NULL) {
+ bool aligned;
+ uint32_t readlen;
+ uint16_t flags;
+ int64_t rpos=0;
+ char *seqDNA;
+ const BAMRefSeq *refSeq;
+ ctx_value_t *value;
+ bool wasInserted;
+ int32_t refSeqId=-1;
+ uint8_t *qual;
+ bool mated;
+ const char *name;
+ char cskey = 0;
+ bool originally_aligned;
+ bool isPrimary;
+ uint32_t opCount;
+ bool hasCG = false;
+ uint64_t ti = 0;
+ uint32_t csSeqLen = 0;
+ int lpad = 0;
+ int rpad = 0;
+ bool hardclipped = false;
+ bool revcmp = false;
+ unsigned readNo = 0;
+ bool wasPromoted = false;
+ char const *barCode = NULL;
+ char const *linkageGroup;
+
+ ++recordsRead;
+
+ BAM_AlignmentGetReadName2(rec, &name, &namelen);
+
+ keyId = rec->keyId;
+ wasInserted = rec->wasInserted;
+
+ rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "MMArrayGet: failed on id '$(id)'", "id=%u", keyId));
+ goto LOOP_END;
+ }
+
+ {
+ float const new_value = BAM_FileGetProportionalPosition(bam) * 100.0;
+ float const delta = new_value - progress;
+ if (delta > 1.0) {
+ KLoadProgressbar_Process(ctx->progress[0], delta, false);
+ progress = new_value;
+ }
+ }
+
+ BAM_AlignmentGetBarCode(rec, &barCode);
+ linkageGroup = getLinkageGroup(rec);
+
+ if (!G.noColorSpace) {
+ if (BAM_AlignmentHasColorSpace(rec)) {
+ if (isNotColorSpace) {
+MIXED_BASE_AND_COLOR:
+ rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains base space and color space", "file=%s", bamFile));
+ goto LOOP_END;
+ }
+ /* COLORSPACE is disabled!
+ * ctx->isColorSpace = isColorSpace = true; */
+ }
+ else if (isColorSpace)
+ goto MIXED_BASE_AND_COLOR;
+ else
+ isNotColorSpace = true;
+ }
+ BAM_AlignmentGetFlags(rec, &flags);
+
+ originally_aligned = (flags & BAMFlags_SelfIsUnmapped) == 0;
+ aligned = originally_aligned;
+
+ mated = false;
+ if (flags & BAMFlags_WasPaired) {
+ if ((flags & BAMFlags_IsFirst) != 0)
+ readNo |= 1;
+ if ((flags & BAMFlags_IsSecond) != 0)
+ readNo |= 2;
+ switch (readNo) {
+ case 1:
+ case 2:
+ mated = true;
+ break;
+ case 0:
+ if ((warned & 1) == 0) {
+ (void)LOGMSG(klogWarn, "Spots without fragment info have been encountered");
+ warned |= 1;
+ }
+ UNFRAGMENT_MISSING_INFO;
+ break;
+ case 3:
+ if ((warned & 2) == 0) {
+ (void)LOGMSG(klogWarn, "Spots with more than two fragments have been encountered");
+ warned |= 2;
+ }
+ UNFRAGMENT_TOO_MANY;
+ break;
+ }
+ }
+ if (!mated)
+ readNo = 1;
+
+ isPrimary = (flags & (BAMFlags_IsNotPrimary|BAMFlags_IsSupplemental)) == 0 ? true : false;
+ if (G.deferSecondary && !isPrimary && aligned && CTX_VALUE_GET_P_ID(*value, readNo - 1) == 0) {
+ /* promote to primary alignment */
+ isPrimary = true;
+ wasPromoted = true;
+ }
+
+ getSpotGroup(rec, spotGroup);
+ if (wasInserted) {
+ if (G.mode == mode_Remap) {
+ (void)PLOGERR(klogErr, (klogErr, rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)' is a new spot, not a remapping",
+ "name=%s", name));
+ goto LOOP_END;
+ }
+ /* first time spot is seen */
+ /* need to make sure that every goto LOOP_END */
+ /* above this point is with rc != 0 */
+ /* else this structure won't get initialized */
+ memset(value, 0, sizeof(*value));
+ value->unmated = !mated;
+ if (isPrimary || G.assembleWithSecondary || G.deferSecondary) {
+ value->pcr_dup = (flags & BAMFlags_IsDuplicate) == 0 ? 0 : 1;
+ value->platform = GetINSDCPlatform(bam, spotGroup);
+ value->primary_is_set = 1;
+ }
+ }
+ if (!isPrimary && G.noSecondary)
+ goto LOOP_END;
+
+ rc = BAM_AlignmentCGReadLength(rec, &readlen);
+ if (rc != 0 && GetRCState(rc) != rcNotFound) {
+ (void)LOGERR(klogErr, rc, "Invalid CG data");
+ goto LOOP_END;
+ }
+ if (rc == 0) {
+ hasCG = true;
+ BAM_AlignmentGetCigarCount(rec, &opCount);
+ rc = KDataBufferResize(&cigBuf, opCount * 2 + 5);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize CIGAR buffer");
+ goto LOOP_END;
+ }
+ rc = AlignmentRecordInit(&data, readlen);
+ if (rc == 0)
+ rc = KDataBufferResize(&buf, readlen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+
+ seqDNA = buf.base;
+ qual = (uint8_t *)&seqDNA[readlen];
+
+ rc = BAM_AlignmentGetCGSeqQual(rec, seqDNA, qual);
+ if (rc == 0) {
+ rc = BAM_AlignmentGetCGCigar(rec, cigBuf.base, cigBuf.elem_count, &opCount);
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to read CG data");
+ goto LOOP_END;
+ }
+ data.data.align_group.elements = 0;
+ data.data.align_group.buffer = alignGroup;
+ if (BAM_AlignmentGetCGAlignGroup(rec, alignGroup, sizeof(alignGroup), &alignGroupLen) == 0)
+ data.data.align_group.elements = alignGroupLen;
+ }
+ else {
+ /* normal flow i.e. NOT CG */
+ uint32_t const *tmp;
+
+ /* resize buffers */
+ BAM_AlignmentGetReadLength(rec, &readlen);
+ BAM_AlignmentGetRawCigar(rec, &tmp, &opCount);
+ rc = KDataBufferResize(&cigBuf, opCount);
+ assert(rc == 0);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize CIGAR buffer");
+ goto LOOP_END;
+ }
+ memmove(cigBuf.base, tmp, opCount * sizeof(uint32_t));
+
+ hardclipped = isHardClipped(opCount, cigBuf.base);
+ if (hardclipped) {
+ if (isPrimary && !wasPromoted) {
+ /* when we promote a secondary to primary and it is hardclipped, we want to "fix" it */
+ if (!G.acceptHardClip) {
+ rc = RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains hard clipped primary alignments", "file=%s", bamFile));
+ goto LOOP_END;
+ }
+ }
+ else if (!G.acceptHardClip) { /* convert to soft clip */
+ uint32_t *const cigar = cigBuf.base;
+ uint32_t const lOp = cigar[0];
+ uint32_t const rOp = cigar[opCount - 1];
+
+ lpad = (lOp & 0xF) == 5 ? (lOp >> 4) : 0;
+ rpad = (rOp & 0xF) == 5 ? (rOp >> 4) : 0;
+
+ if (lpad + rpad == 0) {
+ rc = RC(rcApp, rcFile, rcReading, rcData, rcInvalid);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains invalid CIGAR", "file=%s", bamFile));
+ goto LOOP_END;
+ }
+ if (lpad != 0) {
+ uint32_t const new_lOp = (((uint32_t)lpad) << 4) | 4;
+ cigar[0] = new_lOp;
+ }
+ if (rpad != 0) {
+ uint32_t const new_rOp = (((uint32_t)rpad) << 4) | 4;
+ cigar[opCount - 1] = new_rOp;
+ }
+ }
+ }
+
+ if (G.deferSecondary && !isPrimary) {
+ /*** try to see if hard-clipped secondary alignment can be salvaged **/
+ if (readlen + lpad + rpad < 256 && readlen + lpad + rpad < value->fragment_len[readNo - 1]) {
+ rc = KDataBufferResize(&cigBuf, opCount + 1);
+ assert(rc == 0);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize CIGAR buffer");
+ goto LOOP_END;
+ }
+ if (rpad > 0 && lpad == 0) {
+ uint32_t *const cigar = cigBuf.base;
+ lpad = value->fragment_len[readNo - 1] - readlen - rpad;
+ memmove(cigar + 1, cigar, opCount * sizeof(*cigar));
+ cigar[0] = (uint32_t)((lpad << 4) | 4);
+ }
+ else {
+ uint32_t *const cigar = cigBuf.base;
+ rpad += value->fragment_len[readNo - 1] - readlen - lpad;
+ cigar[opCount] = (uint32_t)((rpad << 4) | 4);
+ }
+ opCount++;
+ }
+ }
+ rc = AlignmentRecordInit(&data, readlen + lpad + rpad);
+ assert(rc == 0);
+ if (rc == 0)
+ rc = KDataBufferResize(&buf, readlen + lpad + rpad);
+ assert(rc == 0);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+
+ seqDNA = buf.base;
+ qual = (uint8_t *)&seqDNA[(readlen | csSeqLen) + lpad + rpad];
+ memset(seqDNA, 'N', (readlen | csSeqLen) + lpad + rpad);
+ memset(qual, 0, (readlen | csSeqLen) + lpad + rpad);
+
+ BAM_AlignmentGetSequence(rec, seqDNA + lpad);
+ if (G.useQUAL) {
+ uint8_t const *squal;
+
+ BAM_AlignmentGetQuality(rec, &squal);
+ memmove(qual + lpad, squal, readlen);
+ }
+ else {
+ uint8_t const *squal;
+ uint8_t qoffset = 0;
+ unsigned i;
+
+ rc = BAM_AlignmentGetQuality2(rec, &squal, &qoffset);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(name)': length of original quality does not match sequence", "name=%s", name));
+ goto LOOP_END;
+ }
+ if (qoffset) {
+ for (i = 0; i != readlen; ++i)
+ qual[i + lpad] = squal[i] - qoffset;
+ QUAL_CHANGED_OQ;
+ }
+ else
+ memmove(qual + lpad, squal, readlen);
+ }
+ readlen = readlen + lpad + rpad;
+ data.data.align_group.elements = 0;
+ data.data.align_group.buffer = alignGroup;
+ }
+ if (G.hasTI) {
+ rc = BAM_AlignmentGetTI(rec, &ti);
+ if (rc)
+ ti = 0;
+ rc = 0;
+ }
+
+ rc = KDataBufferResize(&seqBuffer, readlen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+ rc = KDataBufferResize(&qualBuffer, readlen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+ AR_REF_ORIENT(data) = (flags & BAMFlags_SelfIsReverse) == 0 ? false : true;
+
+ rpos = -1;
+ if (aligned) {
+ BAM_AlignmentGetPosition(rec, &rpos);
+ BAM_AlignmentGetRefSeqId(rec, &refSeqId);
+ if (refSeqId != lastRefSeqId) {
+ refSeq = NULL;
+ BAM_FileGetRefSeqById(bam, refSeqId, &refSeq);
+ }
+ }
+
+ revcmp = (isColorSpace && !aligned) ? false : AR_REF_ORIENT(data);
+ (void)PLOGMSG(klogDebug, (klogDebug, "Read '$(name)' is $(or) at $(ref):$(pos)", "name=%s,or=%s,ref=%s,pos=%i", name, revcmp ? "reverse" : "forward", refSeq ? refSeq->name : "(none)", rpos));
+ COPY_READ(seqBuffer.base, seqDNA, readlen, revcmp);
+ COPY_QUAL(qualBuffer.base, qual, readlen, revcmp);
+
+ AR_MAPQ(data) = GetMapQ(rec);
+ if (!isPrimary && AR_MAPQ(data) < G.minMapQual)
+ goto LOOP_END;
+
+ if (aligned && align == NULL) {
+ rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains aligned records", "file=%s", bamFile));
+ goto LOOP_END;
+ }
+ while (aligned) {
+ if (rpos >= 0 && refSeqId >= 0) {
+ if (refSeqId == skipRefSeqID) {
+ DISCARD_SKIP_REFERENCE;
+ goto LOOP_END;
+ }
+ if (refSeqId == unmapRefSeqId) {
+ aligned = false;
+ UNALIGNED_UNALIGNED_REF;
+ break;
+ }
+ unmapRefSeqId = -1;
+ if (refSeq == NULL) {
+ rc = SILENT_RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "File '$(file)': Spot '$(name)' refers to an unknown Reference number $(refSeqId)", "file=%s,refSeqId=%i,name=%s", bamFile, (int)refSeqId, name));
+ rc = CheckLimitAndLogError();
+ DISCARD_UNKNOWN_REFERENCE;
+ goto LOOP_END;
+ }
+ else {
+ bool shouldUnmap = false;
+
+ if (G.refFilter && strcmp(G.refFilter, refSeq->name) != 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Skipping Reference '$(name)'", "name=%s", refSeq->name));
+ skipRefSeqID = refSeqId;
+ DISCARD_SKIP_REFERENCE;
+ goto LOOP_END;
+ }
+
+ rc = ReferenceSetFile(ref, refSeq->name, refSeq->length, refSeq->checksum, &shouldUnmap, &wasRenamed);
+ if (rc == 0) {
+ lastRefSeqId = refSeqId;
+ if (shouldUnmap) {
+ aligned = false;
+ unmapRefSeqId = refSeqId;
+ UNALIGNED_UNALIGNED_REF;
+ }
+ break;
+ }
+ if (GetRCObject(rc) == rcConstraint && GetRCState(rc) == rcViolated) {
+ int const level = G.limit2config ? klogWarn : klogErr;
+
+ (void)PLOGMSG(level, (level, "Could not find a Reference to match { name: '$(name)', length: $(rlen) }", "name=%s,rlen=%u", refSeq->name, (unsigned)refSeq->length));
+ }
+ else if (!G.limit2config)
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)': Spot '$(sname)' refers to an unknown Reference '$(rname)'", "file=%s,rname=%s,sname=%s", bamFile, refSeq->name, name));
+ if (G.limit2config) {
+ rc = 0;
+ UNALIGNED_UNKNOWN_REF;
+ }
+ goto LOOP_END;
+ }
+ }
+ else if (refSeqId < 0) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' was marked aligned, but reference id = $(id) is invalid", "name=%.*s,id=%i", namelen, name, refSeqId));
+ if ((rc = CheckLimitAndLogError()) != 0) goto LOOP_END;
+ UNALIGNED_INVALID_REF;
+ }
+ else {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' was marked aligned, but reference position = $(pos) is invalid", "name=%.*s,pos=%i", namelen, name, rpos));
+ if ((rc = CheckLimitAndLogError()) != 0) goto LOOP_END;
+ UNALIGNED_INVALID_REF_POS;
+ }
+
+ aligned = false;
+ }
+ if (!aligned && (G.refFilter != NULL || G.limit2config)) {
+ assert(!"this shouldn't happen");
+ goto LOOP_END;
+ }
+
+ AR_KEY(data) = keyId;
+ AR_READNO(data) = readNo;
+
+ if (wasInserted) {
+ }
+ else if (isPrimary || G.assembleWithSecondary || G.deferSecondary) {
+ /* other times */
+ int o_pcr_dup = value->pcr_dup;
+ int const n_pcr_dup = (flags & BAMFlags_IsDuplicate) == 0 ? 0 : 1;
+
+ if (!value->primary_is_set) {
+ o_pcr_dup = n_pcr_dup;
+ value->primary_is_set = 1;
+ }
+
+ value->pcr_dup = o_pcr_dup & n_pcr_dup;
+ if (o_pcr_dup != (o_pcr_dup & n_pcr_dup)) {
+ FLAG_CHANGED_PCR_DUP;
+ }
+ if (mated && value->unmated) {
+ (void)PLOGERR(klogWarn, (klogWarn, SILENT_RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)', which was first seen without mate info, now has mate info",
+ "name=%s", name));
+ rc = CheckLimitAndLogError();
+ DISCARD_BAD_FRAGMENT_INFO;
+ goto LOOP_END;
+ }
+ else if (!mated && !value->unmated) {
+ (void)PLOGERR(klogWarn, (klogWarn, SILENT_RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)', which was first seen with mate info, now has no mate info",
+ "name=%s", name));
+ rc = CheckLimitAndLogError();
+ DISCARD_BAD_FRAGMENT_INFO;
+ goto LOOP_END;
+ }
+ }
+ if (isPrimary) {
+ switch (readNo) {
+ case 1:
+ if (CTX_VALUE_GET_P_ID(*value, 0) != 0) {
+ isPrimary = false;
+ FLAG_CHANGED_PRIMARY_DUP;
+ }
+ else if (aligned && value->unaligned_1) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Read 1 of spot '$(name)', which was unmapped, is now being mapped at position $(pos) on reference '$(ref)'; this alignment will be considered as secondary", "name=%s,ref=%s,pos=%u", name, refSeq->name, rpos));
+ isPrimary = false;
+ FLAG_CHANGED_WAS_UNALIGNED;
+ }
+ break;
+ case 2:
+ if (CTX_VALUE_GET_P_ID(*value, 1) != 0) {
+ isPrimary = false;
+ FLAG_CHANGED_PRIMARY_DUP;
+ }
+ else if (aligned && value->unaligned_2) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Read 2 of spot '$(name)', which was unmapped, is now being mapped at position $(pos) on reference '$(ref)'; this alignment will be considered as secondary", "name=%s,ref=%s,pos=%u", name, refSeq->name, rpos));
+ isPrimary = false;
+ FLAG_CHANGED_WAS_UNALIGNED;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (hardclipped) {
+ value->hardclipped = 1;
+ }
+#if 0 /** EY TO REVIEW **/
+ if (!isPrimary && value->hardclipped) {
+ DISCARD_HARDCLIP_SECONDARY;
+ goto LOOP_END;
+ }
+#endif
+
+ /* input is clean */
+ ++recordsProcessed;
+
+ data.isPrimary = isPrimary;
+ if (aligned) {
+ uint32_t matches = 0;
+ uint32_t misses = 0;
+ uint8_t rna_orient = ' ';
+
+ FixOverhangingAlignment(&cigBuf, &opCount, rpos, refSeq->length, readlen);
+ BAM_AlignmentGetRNAStrand(rec, &rna_orient);
+ {
+ int const intronType = rna_orient == '+' ? NCBI_align_ro_intron_plus :
+ rna_orient == '-' ? NCBI_align_ro_intron_minus :
+ hasCG ? NCBI_align_ro_complete_genomics :
+ NCBI_align_ro_intron_unknown;
+ rc = ReferenceRead(ref, &data, rpos, cigBuf.base, opCount, seqDNA, readlen, intronType, &matches, &misses);
+ }
+ if (rc == 0) {
+ int const i = readNo - 1;
+ int const clipped_rl = readlen < 255 ? readlen : 255;
+ if (i >= 0 && i < 2) {
+ int const rl = value->fragment_len[i];
+
+ if (rl == 0)
+ value->fragment_len[i] = clipped_rl;
+ else if (rl != clipped_rl) {
+ if (isPrimary) {
+ rc = RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Primary alignment for '$(name)' has different length ($(len)) than previously recorded secondary alignment. Try to defer secondary alignment processing.",
+ "name=%s,len=%d", name, readlen));
+ }
+ else {
+ rc = SILENT_RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "Secondary alignment for '$(name)' has different length ($(len)) than previously recorded primary alignment; discarding secondary alignment.",
+ "name=%s,len=%d", name, readlen));
+ DISCARD_BAD_SECONDARY;
+ rc = CheckLimitAndLogError();
+ }
+ goto LOOP_END;
+ }
+ }
+ }
+ if (rc == 0 && (matches < G.minMatchCount || (matches == 0 && !G.acceptNoMatch))) {
+ if (isPrimary) {
+ if (misses > matches) {
+ RecordNoMatch(name, refSeq->name, rpos);
+ rc = LogNoMatch(name, refSeq->name, (unsigned)rpos, (unsigned)matches);
+ if (rc)
+ goto LOOP_END;
+ }
+ }
+ else {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos); discarding secondary alignment",
+ "name=%s,ref=%s,pos=%u,count=%u", name, refSeq->name, (unsigned)rpos, (unsigned)matches));
+ DISCARD_BAD_SECONDARY;
+ rc = 0;
+ goto LOOP_END;
+ }
+ }
+ if (rc) {
+ aligned = false;
+
+ if (((int)GetRCObject(rc)) == ((int)rcData) && GetRCState(rc) == rcNotAvailable) {
+ /* because of code above converting hard clips to soft clips, this should be unreachable */
+ abort();
+ }
+ else if (((int)GetRCObject(rc)) == ((int)rcData)) {
+ UNALIGNED_INVALID_INFO;
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "Spot '$(name)': bad alignment to reference '$(ref)' at $(pos)", "name=%s,ref=%s,pos=%u", name, refSeq->name, rpos));
+ /* Data errors may get reset; alignment will be unmapped at any rate */
+ rc = CheckLimitAndLogError();
+ }
+ else {
+ UNALIGNED_INVALID_REF_POS;
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "Spot '$(name)': error reading reference '$(ref)' at $(pos)", "name=%s,ref=%s,pos=%u", name, refSeq->name, rpos));
+ rc = CheckLimitAndLogError();
+ }
+ if (rc) goto LOOP_END;
+ }
+ }
+
+ if (!aligned && isPrimary) {
+ switch (readNo) {
+ case 1:
+ value->unaligned_1 = 1;
+ break;
+ case 2:
+ value->unaligned_2 = 1;
+ break;
+ default:
+ break;
+ }
+ }
+ if (isPrimary) {
+ switch (readNo) {
+ case 1:
+ if (CTX_VALUE_GET_P_ID(*value, 0) == 0 && aligned) {
+ data.alignId = ++ctx->primaryId;
+ CTX_VALUE_SET_P_ID(*value, 0, data.alignId);
+ }
+ break;
+ case 2:
+ if (CTX_VALUE_GET_P_ID(*value, 1) == 0 && aligned) {
+ data.alignId = ++ctx->primaryId;
+ CTX_VALUE_SET_P_ID(*value, 1, data.alignId);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (G.mode == mode_Archive)
+ goto WRITE_SEQUENCE;
+ else
+ goto WRITE_ALIGNMENT;
+ if (0) {
+WRITE_SEQUENCE:
+ if (barCode) {
+ if (spotGroup[0] != '\0' && value->platform == SRA_PLATFORM_UNDEFINED) {
+ /* don't use bar code */
+ }
+ else {
+ unsigned const sglen = strlen(barCode);
+ if (sglen + 1 < sizeof(spotGroup))
+ memmove(spotGroup, barCode, sglen + 1);
+ }
+ }
+ if (mated) {
+ int64_t const spotId = CTX_VALUE_GET_S_ID(*value);
+ uint32_t const fragmentId = value->fragmentId;
+ bool const spotHasBeenWritten = (spotId != 0);
+ bool const spotHasFragmentInfo = (fragmentId != 0);
+ bool const spotIsFirstSeen = (spotHasBeenWritten || spotHasFragmentInfo) ? false : true;
+
+ if (spotHasBeenWritten) {
+ /* do nothing */
+ }
+ else if (spotIsFirstSeen) {
+ /* start spot assembly */
+ unsigned sz;
+ FragmentInfo fi;
+ int32_t mate_refSeqId = -1;
+ int64_t pnext = 0;
+
+ if (!isPrimary) {
+ if ( (!G.assembleWithSecondary || hardclipped) && !G.deferSecondary ) {
+ goto WRITE_ALIGNMENT;
+ }
+ (void)PLOGMSG(klogDebug, (klogDebug, "Spot '$(name)' (id $(id)) is being constructed from secondary alignment information", "id=%lx,name=%s", keyId, name));
+ }
+ memset(&fi, 0, sizeof(fi));
+
+ fi.aligned = isPrimary ? aligned : 0;
+ fi.ti = ti;
+ fi.orientation = AR_REF_ORIENT(data);
+ fi.readNo = readNo;
+ fi.sglen = strlen(spotGroup);
+ fi.lglen = strlen(linkageGroup);
+
+ fi.readlen = readlen;
+ fi.cskey = cskey;
+ fi.is_bad = (flags & BAMFlags_IsLowQuality) != 0;
+ sz = sizeof(fi) + 2*fi.readlen + fi.sglen + fi.lglen;
+ if (align) {
+ BAM_AlignmentGetMateRefSeqId(rec, &mate_refSeqId);
+ BAM_AlignmentGetMatePosition(rec, &pnext);
+ }
+ if(align && mate_refSeqId == refSeqId && pnext > 0 && pnext!=rpos /*** weird case in some bams**/){
+ rc = MemBankAlloc(ctx->frags, &value->fragmentId, sz, 0, false);
+ fcountBoth++;
+ } else {
+ rc = MemBankAlloc(ctx->frags, &value->fragmentId, sz, 0, true);
+ fcountOne++;
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KMemBankAlloc failed");
+ goto LOOP_END;
+ }
+ /*printf("IN:%10d\tcnt2=%ld\tcnt1=%ld\n",value->fragmentId,fcountBoth,fcountOne);*/
+
+ rc = KDataBufferResize(&fragBuf, sz);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize fragment buffer");
+ goto LOOP_END;
+ }
+ {{
+ uint8_t *dst = (uint8_t*) fragBuf.base;
+
+ memmove(dst,&fi,sizeof(fi));
+ dst += sizeof(fi);
+ memmove(dst, seqBuffer.base, readlen);
+ dst += readlen;
+ memmove(dst, qualBuffer.base, readlen);
+ dst += fi.readlen;
+ memmove(dst, spotGroup, fi.sglen);
+ dst += fi.sglen;
+ memmove(dst, linkageGroup, fi.lglen);
+ dst += fi.lglen;
+ }}
+ rc = MemBankWrite(ctx->frags, value->fragmentId, 0, fragBuf.base, sz, &rsize);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankWrite failed writing fragment $(id)", "id=%u", value->fragmentId));
+ goto LOOP_END;
+ }
+ if (revcmp) {
+ QUAL_CHANGED_REVERSED;
+ SEQ__CHANGED_REV_COMP;
+ }
+ }
+ else if (spotHasFragmentInfo) {
+ /* continue spot assembly */
+ FragmentInfo *fip;
+ {
+ size_t size1;
+ size_t size2;
+
+ rc = MemBankSize(ctx->frags, fragmentId, &size1);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankSize failed on fragment $(id)", "id=%u", fragmentId));
+ goto LOOP_END;
+ }
+
+ rc = KDataBufferResize(&fragBuf, size1);
+ fip = (FragmentInfo *)fragBuf.base;
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to resize fragment buffer", ""));
+ goto LOOP_END;
+ }
+
+ rc = MemBankRead(ctx->frags, fragmentId, 0, fragBuf.base, size1, &size2);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankRead failed on fragment $(id)", "id=%u", fragmentId));
+ goto LOOP_END;
+ }
+ assert(size1 == size2);
+ }
+ if (readNo == fip->readNo) {
+ /* is a repeat of the same read; do nothing */
+ }
+ else {
+ /* mate found; finish spot assembly */
+ unsigned read1 = 0;
+ unsigned read2 = 1;
+ char const *const seq1 = (void *)&fip[1];
+ char const *const qual1 = (void *)(seq1 + fip->readlen);
+ char const *const sg1 = (void *)(qual1 + fip->readlen);
+ char const *const bx1 = (void *)(sg1 + fip->sglen);
+
+ if (!isPrimary) {
+ if ((!G.assembleWithSecondary || hardclipped) && !G.deferSecondary ) {
+ goto WRITE_ALIGNMENT;
+ }
+ (void)PLOGMSG(klogDebug, (klogDebug, "Spot '$(name)' (id $(id)) is being constructed from secondary alignment information", "id=%lx,name=%s", keyId, name));
+ }
+ rc = KDataBufferResize(&seqBuffer, readlen + fip->readlen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+ rc = KDataBufferResize(&qualBuffer, readlen + fip->readlen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed to resize record buffer");
+ goto LOOP_END;
+ }
+ if (readNo < fip->readNo) {
+ read1 = 1;
+ read2 = 0;
+ }
+
+ memset(&srecStorage, 0, sizeof(srecStorage));
+ srec.numreads = 2;
+ srec.readLen[read1] = fip->readlen;
+ srec.readLen[read2] = readlen;
+ srec.readStart[1] = srec.readLen[0];
+ {
+ char const *const s1 = seq1;
+ char const *const s2 = seqBuffer.base;
+ char *const d = seqBuffer.base;
+ char *const d1 = d + srec.readStart[read1];
+ char *const d2 = d + srec.readStart[read2];
+
+ srec.seq = seqBuffer.base;
+ if (d2 != s2) {
+ memmove(d2, s2, readlen);
+ }
+ memmove(d1, s1, fip->readlen);
+ }
+ {
+ char const *const s1 = qual1;
+ char const *const s2 = qualBuffer.base;
+ char *const d = qualBuffer.base;
+ char *const d1 = d + srec.readStart[read1];
+ char *const d2 = d + srec.readStart[read2];
+
+ srec.qual = qualBuffer.base;
+ if (d2 != s2) {
+ memmove(d2, s2, readlen);
+ }
+ memmove(d1, s1, fip->readlen);
+ }
+
+ srec.ti[read1] = fip->ti;
+ srec.ti[read2] = ti;
+
+ srec.aligned[read1] = fip->aligned;
+ srec.aligned[read2] = isPrimary ? aligned : 0;
+
+ srec.is_bad[read1] = fip->is_bad;
+ srec.is_bad[read2] = (flags & BAMFlags_IsLowQuality) != 0;
+
+ srec.orientation[read1] = fip->orientation;
+ srec.orientation[read2] = AR_REF_ORIENT(data);
+
+ srec.cskey[read1] = fip->cskey;
+ srec.cskey[read2] = cskey;
+
+ srec.keyId = keyId;
+
+ srec.spotGroup = sg1;
+ srec.spotGroupLen = fip->sglen;
+
+ srec.linkageGroup = bx1;
+ srec.linkageGroupLen = fip->lglen;
+
+ srec.seq = seqBuffer.base;
+ srec.qual = qualBuffer.base;
+
+ rc = SequenceWriteRecord(seq, &srec, isColorSpace, value->pcr_dup, value->platform);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+ goto LOOP_END;
+ }
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ if(fragmentId & 1){
+ fcountOne--;
+ } else {
+ fcountBoth--;
+ }
+ /* printf("OUT:%9d\tcnt2=%ld\tcnt1=%ld\n",fragmentId,fcountBoth,fcountOne);*/
+ rc = MemBankFree(ctx->frags, fragmentId);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "KMemBankFree failed on fragment $(id)", "id=%u", fragmentId));
+ goto LOOP_END;
+ }
+ value->fragmentId = 0;
+ if (revcmp) {
+ QUAL_CHANGED_REVERSED;
+ SEQ__CHANGED_REV_COMP;
+ }
+ if (value->pcr_dup && (srec.is_bad[0] || srec.is_bad[1])) {
+ FLAG_CHANGED_400_AND_200;
+ filterFlagConflictRecords++;
+ if (filterFlagConflictRecords < MAX_WARNINGS_FLAG_CONFLICT) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)': both 0x400 and 0x200 flag bits set, only 0x400 will be saved", "name=%s", name));
+ }
+ else if (filterFlagConflictRecords == MAX_WARNINGS_FLAG_CONFLICT) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Last reported warning: Spot '$(name)': both 0x400 and 0x200 flag bits set, only 0x400 will be saved", "name=%s", name));
+ }
+ }
+ }
+ }
+ else {
+ (void)PLOGMSG(klogErr, (klogErr, "Spot '$(name)' has caused the loader to enter an illogical state", "name=%s", name));
+ assert("this should never happen");
+ }
+ }
+ else if (CTX_VALUE_GET_S_ID(*value) == 0) {
+ /* new unmated fragment - no spot assembly */
+ if (!isPrimary) {
+ if ((!G.assembleWithSecondary || hardclipped) && !G.deferSecondary ) {
+ goto WRITE_ALIGNMENT;
+ }
+ (void)PLOGMSG(klogDebug, (klogDebug, "Spot '$(name)' (id $(id)) is being constructed from secondary alignment information", "id=%lx,name=%s", keyId, name));
+ }
+ memset(&srecStorage, 0, sizeof(srecStorage));
+ srec.numreads = 1;
+
+ srec.readLen[0] = readlen;
+ srec.ti[0] = ti;
+ srec.aligned[0] = isPrimary ? aligned : 0;
+ srec.is_bad[0] = (flags & BAMFlags_IsLowQuality) != 0;
+ srec.orientation[0] = AR_REF_ORIENT(data);
+ srec.cskey[0] = cskey;
+
+ srec.keyId = keyId;
+
+ srec.spotGroup = spotGroup;
+ srec.spotGroupLen = strlen(spotGroup);
+
+ srec.linkageGroup = linkageGroup;
+ srec.linkageGroupLen = strlen(linkageGroup);
+
+ srec.seq = seqBuffer.base;
+ srec.qual = qualBuffer.base;
+
+ rc = SequenceWriteRecord(seq, &srec, isColorSpace, value->pcr_dup, value->platform);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "SequenceWriteRecord failed", ""));
+ goto LOOP_END;
+ }
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ value->fragmentId = 0;
+ if (value->pcr_dup && srec.is_bad[0]) {
+ FLAG_CHANGED_400_AND_200;
+ filterFlagConflictRecords++;
+ if (filterFlagConflictRecords < MAX_WARNINGS_FLAG_CONFLICT) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)': both 0x400 and 0x200 flag bits set, only 0x400 will be saved", "name=%s", name));
+ }
+ else if (filterFlagConflictRecords == MAX_WARNINGS_FLAG_CONFLICT) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Last reported warning: Spot '$(name)': both 0x400 and 0x200 flag bits set, only 0x400 will be saved", "name=%s", name));
+ }
+ }
+ if (revcmp) {
+ QUAL_CHANGED_REVERSED;
+ SEQ__CHANGED_REV_COMP;
+ }
+ }
+ }
+WRITE_ALIGNMENT:
+ if (aligned) {
+ if (mated && !isPrimary) {
+ int32_t bam_mrid;
+ int64_t mpos;
+ int64_t mrid = 0;
+ int64_t tlen;
+
+ BAM_AlignmentGetMatePosition(rec, &mpos);
+ BAM_AlignmentGetMateRefSeqId(rec, &bam_mrid);
+ BAM_AlignmentGetInsertSize(rec, &tlen);
+
+ if (mpos >= 0 && bam_mrid >= 0 && tlen != 0) {
+ BAMRefSeq const *mref;
+
+ BAM_FileGetRefSeq(bam, bam_mrid, &mref);
+ if (mref) {
+ rc_t rc_temp = ReferenceGet1stRow(ref, &mrid, mref->name);
+ if (rc_temp == 0) {
+ data.mate_ref_pos = mpos;
+ data.template_len = tlen;
+ data.mate_ref_orientation = (flags & BAMFlags_MateIsReverse) ? 1 : 0;
+ }
+ else {
+ (void)PLOGERR(klogWarn, (klogWarn, rc_temp, "Failed to get refID for $(name)", "name=%s", mref->name));
+ MATE_INFO_LOST_UNKNOWN_REF;
+ }
+ data.mate_ref_id = mrid;
+ }
+ else {
+ MATE_INFO_LOST_INVALID;
+ }
+ }
+ else if (mpos >= 0 || bam_mrid >= 0 || tlen != 0) {
+ MATE_INFO_LOST_MISSING;
+ }
+ }
+
+ if (wasRenamed) {
+ RENAMED_REFERENCE;
+ }
+ if (value->alignmentCount[readNo - 1] < 254)
+ ++value->alignmentCount[readNo - 1];
+ ++ctx->alignCount;
+
+ assert(keyId >> 32 < ctx->keyToID.key2id_count);
+ assert((uint32_t)keyId < ctx->keyToID.idCount[keyId >> 32]);
+
+ if (linkageGroup[0] != '\0') {
+ AR_LINKAGE_GROUP(data).elements = strlen(linkageGroup);
+ AR_LINKAGE_GROUP(data).buffer = linkageGroup;
+ }
+
+ rc = AlignmentWriteRecord(align, &data);
+ if (rc == 0) {
+ if (!isPrimary)
+ data.alignId = ++ctx->secondId;
+
+ rc = ReferenceAddAlignId(ref, data.alignId, isPrimary);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "ReferenceAddAlignId failed", ""));
+ }
+ else {
+ *had_alignments = true;
+ }
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc, "AlignmentWriteRecord failed", ""));
+ }
+ }
+ /**************************************************************/
+
+ LOOP_END:
+ BAM_AlignmentRelease(rec);
+ ++reccount;
+ if (G.maxAlignCount > 0 && reccount >= G.maxAlignCount)
+ break;
+ if (rc == 0)
+ *had_sequences = true;
+ }
+ if (rc) {
+ if ( (GetRCModule(rc) == rcCont && (int)GetRCObject(rc) == rcData && GetRCState(rc) == rcDone)
+ || (GetRCModule(rc) == rcAlign && GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound))
+ {
+ (void)PLOGMSG(klogInfo, (klogInfo, "EOF '$(file)'; processed $(proc)", "file=%s,read=%lu,proc=%lu", bamFile, (unsigned long)recordsRead, (unsigned long)recordsProcessed));
+ rc = 0;
+ }
+ else {
+ (void)PLOGERR(klogInfo, (klogInfo, rc, "Error '$(file)'; read $(read); processed $(proc)", "file=%s,read=%lu,proc=%lu", bamFile, (unsigned long)recordsRead, (unsigned long)recordsProcessed));
+ }
+ }
+ if (filterFlagConflictRecords > 0) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "$(cnt1) out of $(cnt2) records contained warning : both 0x400 and 0x200 flag bits set, only 0x400 will be saved", "cnt1=%lu,cnt2=%lu", filterFlagConflictRecords,recordsProcessed));
+ }
+ if (rc == 0 && recordsProcessed == 0) {
+ (void)LOGMSG(klogWarn, (G.limit2config || G.refFilter != NULL) ?
+ "All records from the file were filtered out" :
+ "The file contained no records that were processed.");
+ rc = RC(rcAlign, rcFile, rcReading, rcData, rcEmpty);
+ }
+
+ BAM_FileRelease(bam);
+ MMArrayLock(ctx->id2value);
+ KDataBufferWhack(&buf);
+ KDataBufferWhack(&fragBuf);
+ KDataBufferWhack(&cigBuf);
+ KDataBufferWhack(&data.buffer);
+ return rc;
+}
+
+static rc_t WriteSoloFragments(context_t *ctx, Sequence *seq)
+{
+ uint32_t i;
+ unsigned j;
+ uint64_t idCount = 0;
+ rc_t rc;
+ KDataBuffer fragBuf;
+ SequenceRecordStorage srecStorage;
+ SequenceRecord srec;
+
+ ++ctx->pass;
+ memset(&srec, 0, sizeof(srec));
+
+ srec.ti = srecStorage.ti;
+ srec.readStart = srecStorage.readStart;
+ srec.readLen = srecStorage.readLen;
+ srec.orientation = srecStorage.orientation;
+ srec.is_bad = srecStorage.is_bad;
+ srec.alignmentCount = srecStorage.alignmentCount;
+ srec.aligned = srecStorage.aligned;
+ srec.cskey = srecStorage. cskey;
+
+ rc = KDataBufferMake(&fragBuf, 8, 0);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KDataBufferMake failed");
+ return rc;
+ }
+ for (idCount = 0, j = 0; j < ctx->keyToID.key2id_count; ++j) {
+ idCount += ctx->keyToID.idCount[j];
+ }
+ KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], idCount);
+
+ for (idCount = 0, j = 0; j < ctx->keyToID.key2id_count; ++j) {
+ for (i = 0; i != ctx->keyToID.idCount[j]; ++i, ++idCount) {
+ uint64_t const keyId = ((uint64_t)j << 32) | i;
+ ctx_value_t *value;
+ size_t rsize;
+ size_t sz;
+ char const *src;
+ FragmentInfo const *fip;
+
+ rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+ if (rc)
+ break;
+ KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+ if (value->fragmentId == 0)
+ continue;
+
+ rc = MemBankSize(ctx->frags, value->fragmentId, &sz);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KMemBankSize failed");
+ break;
+ }
+ rc = KDataBufferResize(&fragBuf, (size_t)sz);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KDataBufferResize failed");
+ break;
+ }
+ rc = MemBankRead(ctx->frags, value->fragmentId, 0, fragBuf.base, sz, &rsize);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KMemBankRead failed");
+ break;
+ }
+ assert( rsize == sz );
+
+ fip = fragBuf.base;
+ src = (char const *)&fip[1];
+
+ memset(&srecStorage, 0, sizeof(srecStorage));
+ if (value->unmated) {
+ srec.numreads = 1;
+ srec.readLen[0] = fip->readlen;
+ srec.ti[0] = fip->ti;
+ srec.aligned[0] = fip->aligned;
+ srec.is_bad[0] = fip->is_bad;
+ srec.orientation[0] = fip->orientation;
+ srec.cskey[0] = fip->cskey;
+ }
+ else {
+ unsigned const read = ((fip->aligned && CTX_VALUE_GET_P_ID(*value, 0) == 0) || value->unaligned_2) ? 1 : 0;
+
+ srec.numreads = 2;
+ srec.readLen[read] = fip->readlen;
+ srec.readStart[1] = srec.readLen[0];
+ srec.ti[read] = fip->ti;
+ srec.aligned[read] = fip->aligned;
+ srec.is_bad[read] = fip->is_bad;
+ srec.orientation[read] = fip->orientation;
+ srec.cskey[0] = srec.cskey[1] = 'N';
+ srec.cskey[read] = fip->cskey;
+ }
+ srec.seq = (char *)src;
+ srec.qual = (uint8_t *)(src + fip->readlen);
+ srec.spotGroup = (char *)(src + 2 * fip->readlen);
+ srec.spotGroupLen = fip->sglen;
+ srec.linkageGroup = (char *)(src + 2 * fip->readlen * fip->sglen);
+ srec.linkageGroupLen = fip->lglen;
+ srec.keyId = keyId;
+ rc = SequenceWriteRecord(seq, &srec, ctx->isColorSpace, value->pcr_dup, value->platform);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+ break;
+ }
+ /*rc = KMemBankFree(frags, id);*/
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ }
+ }
+ MMArrayLock(ctx->id2value);
+ KDataBufferWhack(&fragBuf);
+ return rc;
+}
+
+static rc_t SequenceUpdateAlignInfo(context_t *ctx, Sequence *seq)
+{
+ rc_t rc = 0;
+ uint64_t row;
+ uint64_t keyId;
+
+ ++ctx->pass;
+ KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], ctx->spotId + 1);
+
+ for (row = 1; row <= ctx->spotId; ++row) {
+ ctx_value_t *value;
+
+ rc = SequenceReadKey(seq, row, &keyId);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to get key for row $(row)", "row=%u", (unsigned)row));
+ break;
+ }
+ rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to read info for row $(row), index $(idx)", "row=%u,idx=%u", (unsigned)row, (unsigned)keyId));
+ break;
+ }
+ if (G.mode == mode_Remap) {
+ CTX_VALUE_SET_S_ID(*value, row);
+ }
+ if (row != CTX_VALUE_GET_S_ID(*value)) {
+ rc = RC(rcApp, rcTable, rcWriting, rcData, rcUnexpected);
+ (void)PLOGMSG(klogErr, (klogErr, "Unexpected spot id $(spotId) for row $(row), index $(idx)", "spotId=%u,row=%u,idx=%u", (unsigned)CTX_VALUE_GET_S_ID(*value), (unsigned)row, (unsigned)keyId));
+ break;
+ }
+ {{
+ int64_t primaryId[2];
+ int const logLevel = klogWarn; /*G.assembleWithSecondary ? klogWarn : klogErr;*/
+
+ primaryId[0] = CTX_VALUE_GET_P_ID(*value, 0);
+ primaryId[1] = CTX_VALUE_GET_P_ID(*value, 1);
+
+ if (primaryId[0] == 0 && value->alignmentCount[0] != 0) {
+ rc = RC(rcApp, rcTable, rcWriting, rcConstraint, rcViolated);
+ (void)PLOGERR(logLevel, (logLevel, rc, "Spot id $(id) read 1 never had a primary alignment", "id=%lx", keyId));
+ }
+ if (!value->unmated && primaryId[1] == 0 && value->alignmentCount[1] != 0) {
+ rc = RC(rcApp, rcTable, rcWriting, rcConstraint, rcViolated);
+ (void)PLOGERR(logLevel, (logLevel, rc, "Spot id $(id) read 2 never had a primary alignment", "id=%lx", keyId));
+ }
+ if (rc != 0 && logLevel == klogErr)
+ break;
+
+ rc = SequenceUpdateAlignData(seq, row, value->unmated ? 1 : 2,
+ primaryId,
+ value->alignmentCount);
+ }}
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed updating Alignment data in sequence table");
+ break;
+ }
+ KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+ }
+ MMArrayLock(ctx->id2value);
+ return rc;
+}
+
+static rc_t AlignmentUpdateSpotInfo(context_t *ctx, Alignment *align)
+{
+ rc_t rc;
+ uint64_t keyId;
+
+ ++ctx->pass;
+
+ KLoadProgressbar_Append(ctx->progress[ctx->pass - 1], ctx->alignCount);
+
+ rc = AlignmentStartUpdatingSpotIds(align);
+ while (rc == 0 && (rc = Quitting()) == 0) {
+ ctx_value_t *value;
+
+ rc = AlignmentGetSpotKey(align, &keyId);
+ if (rc) {
+ if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
+ rc = 0;
+ break;
+ }
+ assert(keyId >> 32 < ctx->keyToID.key2id_count);
+ assert((uint32_t)keyId < ctx->keyToID.idCount[keyId >> 32]);
+ rc = MMArrayGet(ctx->id2value, (void **)&value, keyId);
+ if (rc == 0) {
+ int64_t const spotId = CTX_VALUE_GET_S_ID(*value);
+
+ if (spotId == 0) {
+ rc = RC(rcApp, rcTable, rcWriting, rcConstraint, rcViolated);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(id)' was never assigned a spot id, probably has no primary alignments", "id=%lx", keyId));
+ break;
+ }
+ rc = AlignmentWriteSpotId(align, spotId);
+ }
+ KLoadProgressbar_Process(ctx->progress[ctx->pass - 1], 1, false);
+ }
+ MMArrayLock(ctx->id2value);
+ return rc;
+}
+
+
+static rc_t ArchiveBAM(VDBManager *mgr, VDatabase *db,
+ unsigned bamFiles, char const *bamFile[],
+ unsigned seqFiles, char const *seqFile[],
+ bool *has_alignments,
+ bool continuing)
+{
+ rc_t rc = 0;
+ rc_t rc2;
+ Reference ref;
+ Sequence seq;
+ Alignment *align;
+ static context_t *ctx = &GlobalContext;
+ bool has_sequences = false;
+ unsigned i;
+
+ *has_alignments = false;
+ rc = ReferenceInit(&ref, mgr, db);
+ if (rc)
+ return rc;
+
+ if (G.onlyVerifyReferences) {
+ for (i = 0; i < bamFiles && rc == 0; ++i) {
+ rc = ProcessBAM(bamFile[i], NULL, db, &ref, NULL, NULL, NULL, NULL);
+ }
+ ReferenceWhack(&ref, false);
+ return rc;
+ }
+ SequenceInit(&seq, db);
+ align = AlignmentMake(db);
+
+ rc = SetupContext(ctx, bamFiles + seqFiles);
+ if (rc)
+ return rc;
+
+ ctx->pass = 1;
+ for (i = 0; i < bamFiles && rc == 0; ++i) {
+ bool this_has_alignments = false;
+ bool this_has_sequences = false;
+
+ rc = ProcessBAM(bamFile[i], ctx, db, &ref, &seq, align, &this_has_alignments, &this_has_sequences);
+ *has_alignments |= this_has_alignments;
+ has_sequences |= this_has_sequences;
+ }
+ for (i = 0; i < seqFiles && rc == 0; ++i) {
+ bool this_has_alignments = false;
+ bool this_has_sequences = false;
+
+ rc = ProcessBAM(seqFile[i], ctx, db, &ref, &seq, align, &this_has_alignments, &this_has_sequences);
+ *has_alignments |= this_has_alignments;
+ has_sequences |= this_has_sequences;
+ }
+ if (!continuing) {
+/*** No longer need memory for key2id ***/
+ for (i = 0; i != ctx->keyToID.key2id_count; ++i) {
+ KBTreeDropBacking(ctx->keyToID.key2id[i]);
+ KBTreeRelease(ctx->keyToID.key2id[i]);
+ ctx->keyToID.key2id[i] = NULL;
+ }
+ free(ctx->keyToID.key2id_names);
+ ctx->keyToID.key2id_names = NULL;
+/*******************/
+ }
+
+ if (has_sequences) {
+ if (rc == 0 && (rc = Quitting()) == 0) {
+ if (G.mode == mode_Archive) {
+ (void)LOGMSG(klogInfo, "Writing unpaired sequences");
+ rc = WriteSoloFragments(ctx, &seq);
+ ContextReleaseMemBank(ctx);
+ }
+ if (rc == 0) {
+ rc = SequenceDoneWriting(&seq);
+ if (rc == 0) {
+ (void)LOGMSG(klogInfo, "Updating sequence alignment info");
+ rc = SequenceUpdateAlignInfo(ctx, &seq);
+ }
+ }
+ }
+ }
+
+ if (*has_alignments && rc == 0 && (rc = Quitting()) == 0) {
+ (void)LOGMSG(klogInfo, "Writing alignment spot ids");
+ rc = AlignmentUpdateSpotInfo(ctx, align);
+ }
+ rc2 = AlignmentWhack(align, *has_alignments && rc == 0 && (rc = Quitting()) == 0);
+ if (rc == 0)
+ rc = rc2;
+
+ rc2 = ReferenceWhack(&ref, *has_alignments && rc == 0 && (rc = Quitting()) == 0);
+ if (rc == 0)
+ rc = rc2;
+
+ SequenceWhack(&seq, rc == 0);
+
+ ContextRelease(ctx, continuing);
+
+ if (rc == 0) {
+ (void)LOGMSG(klogInfo, "Successfully loaded all files");
+ }
+ return rc;
+}
+
+rc_t WriteLoaderSignature(KMetadata *meta, char const progName[])
+{
+ KMDataNode *node;
+ rc_t rc = KMetadataOpenNodeUpdate(meta, &node, "/");
+
+ if (rc == 0) {
+ rc = KLoaderMeta_Write(node, progName, __DATE__, "BAM", KAppVersion());
+ KMDataNodeRelease(node);
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Cannot update loader meta");
+ }
+ return rc;
+}
+
+rc_t OpenPath(char const path[], KDirectory **dir)
+{
+ KDirectory *p;
+ rc_t rc = KDirectoryNativeDir(&p);
+
+ if (rc == 0) {
+ rc = KDirectoryOpenDirUpdate(p, dir, false, "%s", path);
+ KDirectoryRelease(p);
+ }
+ return rc;
+}
+
+static
+rc_t ConvertDatabaseToUnmapped(VDatabase *db)
+{
+ VTable* tbl;
+ rc_t rc = VDatabaseOpenTableUpdate(db, &tbl, "SEQUENCE");
+ if (rc == 0)
+ {
+ VTableRenameColumn(tbl, false, "CMP_ALTREAD", "ALTREAD");
+ VTableRenameColumn(tbl, false, "CMP_READ", "READ");
+ VTableRenameColumn(tbl, false, "CMP_ALTCSREAD", "ALTCSREAD");
+ VTableRenameColumn(tbl, false, "CMP_CSREAD", "CSREAD");
+ rc = VTableRelease(tbl);
+ }
+ return rc;
+}
+
+rc_t run(char const progName[],
+ unsigned bamFiles, char const *bamFile[],
+ unsigned seqFiles, char const *seqFile[],
+ bool continuing)
+{
+ VDBManager *mgr;
+ rc_t rc;
+ rc_t rc2;
+ char const *db_type = G.expectUnsorted ? "NCBI:align:db:alignment_unsorted" : "NCBI:align:db:alignment_sorted";
+
+ rc = VDBManagerMakeUpdate(&mgr, NULL);
+ if (rc) {
+ (void)LOGERR (klogErr, rc, "failed to create VDB Manager!");
+ }
+ else {
+ bool has_alignments = false;
+
+ /* VDBManagerDisableFlushThread(mgr); */
+ rc = VDBManagerDisablePagemapThread(mgr);
+ if (rc == 0)
+ {
+ if (G.onlyVerifyReferences) {
+ rc = ArchiveBAM(mgr, NULL, bamFiles, bamFile, 0, NULL, &has_alignments, continuing);
+ }
+ else {
+ VSchema *schema;
+
+ rc = VDBManagerMakeSchema(mgr, &schema);
+ if (rc) {
+ (void)LOGERR (klogErr, rc, "failed to create schema");
+ }
+ else {
+ (void)(rc = VSchemaAddIncludePath(schema, "%s", G.schemaIncludePath));
+ rc = VSchemaParseFile(schema, "%s", G.schemaPath);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "failed to parse schema file $(file)", "file=%s", G.schemaPath));
+ }
+ else {
+ VDatabase *db;
+
+ rc = VDBManagerCreateDB(mgr, &db, schema, db_type,
+ kcmInit + kcmMD5, "%s", G.outpath);
+ VSchemaRelease(schema);
+ if (rc == 0) {
+ rc = ArchiveBAM(mgr, db, bamFiles, bamFile, seqFiles, seqFile, &has_alignments, continuing);
+ if (rc == 0)
+ PrintChangeReport();
+ if (rc == 0 && !has_alignments) {
+ rc = ConvertDatabaseToUnmapped(db);
+ }
+ else if (rc == 0 && lmc != NULL) {
+ VTable *tbl = NULL;
+ KTable *ktbl = NULL;
+ KMetadata *meta = NULL;
+ KMDataNode *node = NULL;
+
+ VDatabaseOpenTableUpdate(db, &tbl, "REFERENCE");
+ VTableOpenKTableUpdate(tbl, &ktbl);
+ VTableRelease(tbl);
+
+ KTableOpenMetadataUpdate(ktbl, &meta);
+ KTableRelease(ktbl);
+
+ KMetadataOpenNodeUpdate(meta, &node, "LOW_MATCH_COUNT");
+ KMetadataRelease(meta);
+
+ RecordLowMatchCounts(node);
+
+ KMDataNodeRelease(node);
+
+ LowMatchCounterFree(lmc);
+ lmc = NULL;
+ }
+ VDatabaseRelease(db);
+
+ if (rc == 0 && G.globalMode == mode_Remap && !continuing) {
+ VTable *tbl = NULL;
+
+ VDBManagerOpenDBUpdate(mgr, &db, NULL, G.firstOut);
+ VDatabaseOpenTableUpdate(db, &tbl, "SEQUENCE");
+ VDatabaseRelease(db);
+ VTableDropColumn(tbl, "TMP_KEY_ID");
+ VTableDropColumn(tbl, "READ");
+ VTableDropColumn(tbl, "ALTREAD");
+ VTableRelease(tbl);
+ }
+
+ if (rc == 0) {
+ KMetadata *meta = NULL;
+
+ {
+ KDBManager *kmgr = NULL;
+
+ rc = VDBManagerOpenKDBManagerUpdate(mgr, &kmgr);
+ if (rc == 0) {
+ KDatabase *kdb;
+
+ rc = KDBManagerOpenDBUpdate(kmgr, &kdb, "%s", G.outpath);
+ if (rc == 0) {
+ rc = KDatabaseOpenMetadataUpdate(kdb, &meta);
+ KDatabaseRelease(kdb);
+ }
+ KDBManagerRelease(kmgr);
+ }
+ }
+ if (rc == 0) {
+ rc = WriteLoaderSignature(meta, progName);
+ if (rc == 0) {
+ KMDataNode *changes = NULL;
+
+ rc = KMetadataOpenNodeUpdate(meta, &changes, "CHANGES");
+ if (rc == 0)
+ RecordChanges(changes, "CHANGE");
+ KMDataNodeRelease(changes);
+ }
+ KMetadataRelease(meta);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ rc2 = VDBManagerRelease(mgr);
+ if (rc2)
+ (void)LOGERR(klogWarn, rc2, "Failed to release VDB Manager");
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
diff --git a/tools/bam-loader/loader-imp.h b/tools/bam-loader/loader-imp.h
new file mode 100644
index 0000000..d90625f
--- /dev/null
+++ b/tools/bam-loader/loader-imp.h
@@ -0,0 +1,30 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+rc_t run(char const argv0[],
+ unsigned countAligned, char const *bamFile[],
+ unsigned countUnaligned, char const *unaligned[],
+ bool continuing);
diff --git a/tools/bam-loader/low-match-count.cpp b/tools/bam-loader/low-match-count.cpp
new file mode 100644
index 0000000..48f9f44
--- /dev/null
+++ b/tools/bam-loader/low-match-count.cpp
@@ -0,0 +1,72 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+extern "C" {
+#include "low-match-count.h"
+}
+
+#include <map>
+#include <string>
+
+struct LowMatchCounter {
+ typedef unsigned counter_t;
+ typedef std::map<std::string, counter_t> map_t;
+
+ map_t counter;
+
+ void add(std::string const &name) {
+ ++counter[name];
+ }
+
+ void each(void *ctx, callback_f callback) const {
+ map_t::const_iterator i;
+
+ for (i = counter.begin(); i != counter.end(); ++i) {
+ char const *const name = i->first.c_str();
+ callback(ctx, name, i->second);
+ }
+ }
+};
+
+extern "C" {
+
+LowMatchCounter *LowMatchCounterMake() {
+ return new LowMatchCounter;
+}
+
+void LowMatchCounterAdd(LowMatchCounter *const self, char const *const name) {
+ self->add(name);
+}
+
+void LowMatchCounterEach(LowMatchCounter const *const self, void *callback_ctx, callback_f callback) {
+ self->each(callback_ctx, callback);
+}
+
+void LowMatchCounterFree(LowMatchCounter *const self) {
+ delete self;
+}
+
+}
diff --git a/tools/bam-loader/low-match-count.h b/tools/bam-loader/low-match-count.h
new file mode 100644
index 0000000..76b9b85
--- /dev/null
+++ b/tools/bam-loader/low-match-count.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef void (*callback_f)(void *ctx, char const *name, unsigned count);
+typedef struct LowMatchCounter LowMatchCounter;
+
+LowMatchCounter *LowMatchCounterMake();
+void LowMatchCounterAdd(LowMatchCounter *, char const *);
+void LowMatchCounterEach(LowMatchCounter const *, void *, callback_f);
+void LowMatchCounterFree(LowMatchCounter *);
diff --git a/tools/bam-loader/mate-distance-stats.cpp b/tools/bam-loader/mate-distance-stats.cpp
new file mode 100644
index 0000000..f732370
--- /dev/null
+++ b/tools/bam-loader/mate-distance-stats.cpp
@@ -0,0 +1,23 @@
+#include "mate-distance-stats.hpp"
+#include <vector>
+#include <algorithm>
+
+unsigned MateDistanceStats::NthMostFrequent(unsigned N, distance_t result[N]) const
+{
+ typedef std::vector<map_t::const_iterator> vector_t;
+ unsigned const n = map.size() < N ? map.size() : N;
+ vector_t v;
+
+ v.reserve(map.size());
+ for (map_t::const_iterator i = map.cbegin(); i != map.cend(); ++i) {
+ v.push_back(i);
+ }
+ std::stable_sort(v.begin(), v.end(), compare_count_descending);
+ std::sort(v.begin(), v.begin() + n, compare_distance); // unique key therefore regular sort is stable
+
+ vector_t::const_iterator j = v.cbegin();
+ for (unsigned i = 0; i != n; ++i, ++j) {
+ result[i] = (*j)->first;
+ }
+ return n;
+}
diff --git a/tools/bam-loader/mate-distance-stats.hpp b/tools/bam-loader/mate-distance-stats.hpp
new file mode 100644
index 0000000..87f50ad
--- /dev/null
+++ b/tools/bam-loader/mate-distance-stats.hpp
@@ -0,0 +1,20 @@
+#include <map>
+
+class MateDistanceStats {
+public:
+ typedef unsigned long distance_t;
+ typedef unsigned long long count_t;
+private:
+ typedef std::map<distance_t, count_t> map_t;
+ map_t map;
+ static bool compare_count_descending(map_t::const_iterator a, map_t::const_iterator b) {
+ return b->second < a->second;
+ }
+ static bool compare_distance(map_t::const_iterator a, map_t::const_iterator b) {
+ return a->first < b->first;
+ }
+public:
+ MateDistanceStats() {}
+ void Count(distance_t const &d) { ++map[d]; }
+ unsigned NthMostFrequent(unsigned N, distance_t result[N]) const;
+};
diff --git a/tools/bam-loader/mem-bank.cpp b/tools/bam-loader/mem-bank.cpp
new file mode 100644
index 0000000..75d8eda
--- /dev/null
+++ b/tools/bam-loader/mem-bank.cpp
@@ -0,0 +1,477 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+
+extern "C" {
+#include "mem-bank.h"
+}
+
+#define USE_KMEMBANK 0
+
+#if USE_KMEMBANK
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/pagefile.h>
+#include <kfs/pmem.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+
+#define FRAG_CHUNK_SIZE (128)
+
+struct MemBank {
+ KMemBank *fragsOne;
+ KMemBank *fragsBoth;
+};
+
+static rc_t OpenMBankFile(KMemBank **const mbank, KDirectory *const dir, int const pid, char const *const suffix, size_t const climit)
+{
+ KFile *file = NULL;
+ char fname[4096];
+ rc_t rc = string_printf(fname, sizeof(fname), NULL, "frag_data%s.%u", suffix, pid);
+
+ if (rc)
+ return rc;
+
+ rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+ KDirectoryRemove(dir, 0, "%s", fname);
+ if (rc == 0) {
+ KPageFile *backing;
+
+ rc = KPageFileMakeUpdate(&backing, file, climit, false);
+ KFileRelease(file);
+ if (rc == 0) {
+ rc = KMemBankMake(mbank, FRAG_CHUNK_SIZE, 0, backing);
+ KPageFileRelease(backing);
+ }
+ }
+ return rc;
+}
+
+static rc_t MemBank_Make(MemBank **rslt, KDirectory *const dir, int const pid, size_t const climits[2])
+{
+ KMemBank *fragsOne;
+
+ rc_t rc = OpenMBankFile(&fragsOne, dir, pid, "One", climits[0]);
+ if (rc == 0) {
+ KMemBank *fragsBoth;
+
+ rc = OpenMBankFile(&fragsBoth, dir, pid, "Both", climits[1]);
+
+ if (rc == 0) {
+ MemBank *const self = reinterpret_cast<MemBank *>(malloc(sizeof(self)));
+
+ if (self) {
+ self->fragsOne = fragsOne;
+ self->fragsBoth = fragsBoth;
+
+ *rslt = self;
+ return 0;
+ }
+ rc = RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted);
+ KMemBankRelease(fragsBoth);
+ }
+ KMemBankRelease(fragsOne);
+ }
+ return rc;
+}
+
+void MemBank_Release(MemBank *const self)
+{
+ KMemBankRelease(self->fragsBoth);
+ KMemBankRelease(self->fragsOne);
+ free(self);
+}
+
+rc_t MemBank_Alloc(MemBank *const self, uint32_t *const Id, size_t const size, bool const clear, bool const longlived)
+{
+ uint64_t id = 0;
+ KMemBank *const mbank = longlived ? self->fragsOne : self->fragsBoth;
+ rc_t rc = KMemBankAlloc(mbank, &id, size, clear);
+ uint32_t const id_out = (uint32_t)((id << 1) + (longlived ? 1 : 0));
+
+ if ((uint64_t)id_out != ((id << 1) + (longlived ? 1 : 0))) {
+ PLOGMSG(klogFatal, (klogFatal, "membank '$(which)': id space overflow", longlived ? "fragsOne" : "fragsBoth"));
+ abort();
+ }
+ Id[0] = id_out;
+ return rc;
+}
+
+rc_t MemBank_Write(MemBank *const self, uint32_t const id, uint64_t const pos, void const *const buffer, size_t const size, size_t *const num_writ)
+{
+ uint64_t const myId = id >> 1;
+ bool const longlived = (id & 1) ? true : false;
+ KMemBank *const mbank = longlived ? self->fragsOne : self->fragsBoth;
+
+ return KMemBankWrite(mbank, myId, pos, buffer, size, num_writ);
+}
+
+rc_t MemBank_Size(MemBank const *const self, uint32_t const id, size_t *const rslt)
+{
+ uint64_t const myId = id >> 1;
+ bool const longlived = (id & 1) ? true : false;
+ KMemBank const *const mbank = longlived ? self->fragsOne : self->fragsBoth;
+ uint64_t size;
+ rc_t const rc = KMemBankSize(mbank, myId, &size);
+
+ *rslt = size;
+ return rc;
+}
+
+rc_t MemBank_Read(MemBank const *const self, uint32_t const id, uint64_t const pos, void *const buffer, size_t const bsize, size_t *const num_read)
+{
+ uint64_t const myId = id >> 1;
+ bool const longlived = (id & 1) ? true : false;
+ KMemBank *const mbank = longlived ? self->fragsOne : self->fragsBoth;
+
+ return KMemBankRead(mbank, myId, pos, buffer, bsize, num_read);
+}
+
+rc_t MemBank_Free(MemBank *const self, uint32_t const id)
+{
+ uint64_t const myId = id >> 1;
+ bool const longlived = (id & 1) ? true : false;
+ KMemBank *const mbank = longlived ? self->fragsOne : self->fragsBoth;
+
+ return KMemBankFree(mbank, myId);
+}
+
+#else
+
+#include <map>
+#include <set>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+#include <algorithm>
+
+class pmem
+{
+ struct allocation {
+ void *memory;
+ size_t size;
+
+ allocation(int = 0) : memory(0), size(0) {}
+ };
+ typedef std::map<uint32_t, struct allocation> my_map_t;
+ typedef std::set<uint32_t> my_set_t;
+ my_map_t in_use;
+ my_set_t no_use;
+ my_map_t::size_type max_in_use;
+ my_set_t::size_type max_no_use;
+ my_map_t::size_type total_allocs;
+ my_map_t::size_type total_frees;
+
+ void *get(uint32_t const id) const
+ {
+ my_map_t::const_iterator const i = in_use.find(id);
+
+ if (i == in_use.end())
+ throw std::runtime_error("attempt to access invalid id");
+
+ return i->second.memory;
+ }
+public:
+ pmem(int = 0)
+ : max_in_use(0)
+ , max_no_use(0)
+ , total_allocs(0)
+ , total_frees(0)
+ {}
+ ~pmem() {
+ my_map_t::iterator i;
+
+ for (i = in_use.begin(); i != in_use.end(); ++i) {
+ free(i->second.memory);
+ ++total_frees;
+ }
+#if 0
+ std::cerr << "max. used: " << max_in_use << std::endl;
+ std::cerr << "max. free: " << max_no_use << std::endl;
+ std::cerr << "num alloc: " << total_allocs << std::endl;
+ std::cerr << "num frees: " << total_frees << std::endl;
+#endif
+ }
+
+ void Write(uint32_t id, size_t const offset, size_t const size, void const *const data) const
+ {
+ if (offset + size <= this->Size(id)) {
+ char *dst = reinterpret_cast<char *>(get(id)) + offset;
+ char const *src = reinterpret_cast<char const *>(data);
+
+ std::copy(src, src + size, dst);
+ return;
+ }
+ throw std::runtime_error("attempt to write more than was allocated");
+ }
+ uint32_t Alloc(size_t const size, bool const clear = true)
+ {
+ my_map_t::key_type new_key;
+
+ if (no_use.begin() == no_use.end()) {
+ my_map_t::size_type const new_id = in_use.size() + 1;
+
+ if (max_in_use < new_id)
+ max_in_use = new_id;
+
+ new_key = (my_map_t::key_type)new_id;
+ if (new_key < new_id)
+ throw std::runtime_error("pmem overflow");
+ }
+ else {
+ my_set_t::const_iterator const j = no_use.begin();
+
+ new_key = *j;
+ no_use.erase(j);
+ }
+ my_map_t::iterator const i = in_use.insert(my_map_t::value_type(new_key, 0)).first;
+
+ void *const alloc = calloc(1, size);
+ if (alloc) {
+ i->second.memory = alloc;
+ i->second.size = size;
+
+ ++total_allocs;
+ return i->first;
+ }
+ throw std::bad_alloc();
+ }
+ void Free(uint32_t const id)
+ {
+ my_map_t::iterator const i = in_use.find(id);
+
+ if (i == in_use.end())
+ throw std::runtime_error("attempt to free invalid id");
+
+ void *const alloc = i->second.memory;
+
+ no_use.insert(id);
+ if (max_no_use < no_use.size())
+ max_no_use = no_use.size();
+
+ in_use.erase(i);
+ free(alloc);
+ ++total_frees;
+ }
+ size_t Size(uint32_t const id) const
+ {
+ my_map_t::const_iterator const i = in_use.find(id);
+
+ if (i == in_use.end())
+ throw std::runtime_error("attempt to access invalid or freed id");
+
+ return i->second.size;
+ }
+ void const *Read(uint32_t const id) const
+ {
+ return get(id);
+ }
+};
+
+rc_t MemBank_Make(MemBank **bank, struct KDirectory * = 0, int = 0, size_t const * = 0)
+{
+ try {
+ pmem *const rslt = new pmem;
+
+ *bank = reinterpret_cast<MemBank *>(rslt);
+ return 0;
+ }
+ catch (std::bad_alloc const &e) {
+ return RC(rcApp, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ catch (std::exception const &e) {
+ std::cout << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+
+void MemBank_Release(MemBank *const self)
+{
+ delete reinterpret_cast<pmem *>(self);
+}
+
+rc_t MemBank_Alloc(MemBank *const Self, uint32_t *const id, size_t const bytes, bool const clear, bool const longlived)
+{
+ try {
+ pmem *const self = reinterpret_cast<pmem *>(Self);
+
+ *id = self->Alloc(bytes, clear);
+ return 0;
+ }
+ catch (std::bad_alloc const &e) {
+ return RC(rcApp, rcFile, rcAllocating, rcMemory, rcExhausted);
+ }
+ catch (std::exception const &e) {
+ std::cerr << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+
+rc_t MemBank_Write(MemBank *const Self, uint32_t const id, uint64_t const pos, void const *const buffer, size_t const bsize, size_t *const num_writ)
+{
+ try {
+ pmem *const self = reinterpret_cast<pmem *>(Self);
+
+ *num_writ = 0;
+
+ size_t const size = self->Size((uint32_t)id);
+
+ if (pos >= size)
+ return 0;
+
+ size_t const actsize = (bsize + pos > size) ? (size - pos) : size;
+
+ *num_writ = actsize;
+ self->Write(id, pos, actsize, buffer);
+
+ return 0;
+ }
+ catch (std::exception const &e) {
+ std::cerr << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+
+rc_t MemBank_Size(MemBank const *const Self, uint32_t const id, size_t *const size)
+{
+ try {
+ pmem const *const self = reinterpret_cast<pmem const *>(Self);
+
+ *size = self->Size(id);
+ return 0;
+ }
+ catch (std::exception const &e) {
+ std::cerr << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+
+rc_t MemBank_Read(MemBank const *const Self, uint32_t const id, uint64_t const pos, void *const buffer, size_t const bsize, size_t *const num_read)
+{
+ try {
+ pmem const *const self = reinterpret_cast<pmem const *>(Self);
+
+ *num_read = 0;
+
+ size_t const size = self->Size(id);
+ char const *data = reinterpret_cast<char const *>(self->Read(id)) + pos;
+
+ if (pos >= size)
+ return 0;
+
+ size_t const actsize = (bsize + pos > size) ? (size - pos) : size;
+
+ *num_read = actsize;
+
+ char *dst = reinterpret_cast<char *>(buffer);
+ std::copy(data, data + actsize, dst);
+
+ return 0;
+ }
+ catch (std::exception const &e) {
+ std::cerr << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+
+rc_t MemBank_Free(MemBank *const Self, uint32_t const id)
+{
+ try {
+ pmem *const self = reinterpret_cast<pmem *>(Self);
+
+ self->Free(id);
+ return 0;
+ }
+ catch (std::exception const &e) {
+ std::cerr << e.what() << std::endl;
+ abort();
+ }
+ catch (...) {
+ std::cout << "this is bad!" << std::endl;
+ abort();
+ }
+}
+#endif
+
+extern "C" {
+ rc_t MemBankMake(MemBank **bank, struct KDirectory *dir, int pid, size_t const climits[2])
+ {
+ return MemBank_Make(bank, dir, pid, climits);
+ }
+
+ void MemBankRelease(MemBank *const self)
+ {
+ MemBank_Release(self);
+ }
+
+ rc_t MemBankAlloc(MemBank *const Self, uint32_t *const id, size_t const bytes, bool const clear, bool const longlived)
+ {
+ return MemBank_Alloc(Self, id, bytes, clear, longlived);
+ }
+
+ rc_t MemBankWrite(MemBank *const Self, uint32_t const id, uint64_t const pos, void const *const buffer, size_t const bsize, size_t *const num_writ)
+ {
+ return MemBank_Write(Self, id, pos, buffer, bsize, num_writ);
+ }
+
+ rc_t MemBankSize(MemBank const *const Self, uint32_t const id, size_t *const size)
+ {
+ return MemBank_Size(Self, id, size);
+ }
+
+ rc_t MemBankRead(MemBank const *const Self, uint32_t const id, uint64_t const pos, void *const buffer, size_t const bsize, size_t *const num_read)
+ {
+ return MemBank_Read(Self, id, pos, buffer, bsize, num_read);
+ }
+
+ rc_t MemBankFree(MemBank *const Self, uint32_t const id)
+ {
+ return MemBank_Free(Self, id);
+ }
+}
+
diff --git a/tools/bam-loader/mem-bank.h b/tools/bam-loader/mem-bank.h
new file mode 100644
index 0000000..6d9257a
--- /dev/null
+++ b/tools/bam-loader/mem-bank.h
@@ -0,0 +1,41 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct MemBank MemBank;
+
+rc_t MemBankMake(MemBank **rslt, struct KDirectory *dir, int pid, size_t const climits[2]);
+
+void MemBankRelease(MemBank *self);
+
+rc_t MemBankAlloc(MemBank *self, uint32_t *id, size_t size, bool clear, bool longlived);
+
+rc_t MemBankWrite(MemBank *self, uint32_t id, uint64_t pos, void const *buffer, size_t size, size_t *num_writ);
+
+rc_t MemBankSize(MemBank const *self, uint32_t id, size_t *rslt);
+
+rc_t MemBankRead(MemBank const *self, uint32_t id, uint64_t pos, void *buffer, size_t bsize, size_t *num_read);
+
+rc_t MemBankFree(MemBank *self, uint32_t id);
diff --git a/tools/bam-loader/quality-quantizer.cpp b/tools/bam-loader/quality-quantizer.cpp
new file mode 100644
index 0000000..5a3eea8
--- /dev/null
+++ b/tools/bam-loader/quality-quantizer.cpp
@@ -0,0 +1,107 @@
+#include "quality-quantizer.hpp"
+#include <cctype>
+
+static void setLookupTable(int tbl[256], int const value, unsigned const start = 0, unsigned const end = 256)
+{
+ for (unsigned i = start; i < end; ++i) {
+ tbl[i] = value;
+ }
+}
+
+static void clearLookupTable(int tbl[256])
+{
+ setLookupTable(tbl, -1);
+}
+
+static bool initLookupTable(int tbl[256], char const quant[])
+{
+ unsigned i = 0;
+ unsigned limit = 0;
+ int value = -1;
+ int ws = 1;
+ int st = 0;
+
+ clearLookupTable(tbl);
+ for (unsigned cur = 0; quant[cur] != 0; ++cur) {
+ int const ch = quant[cur];
+
+ if (ws) {
+ if (isspace(ch))
+ continue;
+ ws = false;
+ }
+ switch (st) {
+ case 0:
+ if (isdigit(ch)) {
+ value = (value * 10) + ch - '0';
+ break;
+ }
+ else if (isspace(ch)) {
+ ++st;
+ ws = true;
+ break;
+ }
+ ++st;
+ /* no break */
+ case 1:
+ if (ch != ':')
+ return false;
+ ws = true;
+ ++st;
+ break;
+ case 2:
+ if (isdigit(ch)) {
+ limit = (limit * 10) + ch - '0';
+ break;
+ }
+ else if (isspace(ch)) {
+ ++st;
+ ws = true;
+ break;
+ }
+ else if (ch == '-' && limit == 0) {
+ setLookupTable(tbl, value, i);
+ return true;
+ }
+ ++st;
+ /* no break */
+ case 3:
+ if (ch != ',')
+ return false;
+ ws = true;
+ st = 0;
+ if (i > limit)
+ return false;
+ setLookupTable(tbl, value, i, limit);
+ i = limit;
+ limit = value = 0;
+ break;
+ }
+ }
+ if (st == 0) {
+ switch (value) {
+ case 0:
+ for (unsigned i = 0; i < 256; ++i) {
+ tbl[i] = i;
+ }
+ return true;
+ case 1:
+ setLookupTable(tbl, 1, 0, 10);
+ setLookupTable(tbl, 10, 10, 20);
+ setLookupTable(tbl, 20, 20, 30);
+ setLookupTable(tbl, 30, 30);
+ return true;
+ case 2:
+ setLookupTable(tbl, 1, 0, 30);
+ setLookupTable(tbl, 30, 30);
+ return true;
+ }
+ }
+ return false;
+}
+
+QualityQuantizer::QualityQuantizer(char const spec[])
+{
+ if (!initLookupTable(lookup, spec))
+ clearLookupTable(lookup);
+}
diff --git a/tools/bam-loader/quality-quantizer.hpp b/tools/bam-loader/quality-quantizer.hpp
new file mode 100644
index 0000000..1135a13
--- /dev/null
+++ b/tools/bam-loader/quality-quantizer.hpp
@@ -0,0 +1,10 @@
+#include <cstdint>
+
+class QualityQuantizer {
+ int lookup[256];
+public:
+ QualityQuantizer(char const spec[]);
+ int quantize(int const value) const {
+ return (0 <= value && value < 256) ? lookup[value] : -1;
+ }
+};
diff --git a/tools/bam-loader/reference-writer.c b/tools/bam-loader/reference-writer.c
new file mode 100644
index 0000000..c35ebd6
--- /dev/null
+++ b/tools/bam-loader/reference-writer.c
@@ -0,0 +1,615 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <kfs/file.h>
+
+#include <kapp/main.h> /* for Quitting */
+
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <align/writer-refseq.h>
+
+#include "reference-writer.h"
+#include "Globals.h"
+
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#define SORTED_OPEN_TABLE_LIMIT (2)
+/*#define SORTED_CACHE_SIZE ((2 * 1024 * 1024)/(SORTED_OPEN_TABLE_LIMIT)) TODO: use line below until switch to unsorted is fixed */
+#define SORTED_CACHE_SIZE (350 * 1024 * 1024)
+
+#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+#define UNSORTED_OPEN_TABLE_LIMIT (8)
+#define UNSORTED_CACHE_SIZE ((1024 * 1024 * 1024)/(UNSORTED_OPEN_TABLE_LIMIT))
+#else
+#define UNSORTED_OPEN_TABLE_LIMIT (255)
+#define UNSORTED_CACHE_SIZE (350 * 1024 * 1024)
+#endif
+
+#if _DEBUGGING
+#define DUMP_CONFIG 1
+#endif
+
+struct overlap_s {
+ uint32_t min; /* minimum start pos of any alignment that ends in this chunk */
+ uint32_t max; /* maximum end pos of any alignment that starts before this chunk and ends in this chunk */
+};
+
+struct s_reference_info {
+ unsigned name; /* offset of start of name in ref_names */
+ unsigned id;
+ unsigned lastOffset;
+};
+
+extern void ReferenceMgr_DumpConfig(ReferenceMgr const *const self);
+
+rc_t ReferenceInit(Reference *self, const VDBManager *mgr, VDatabase *db)
+{
+ rc_t rc;
+ size_t const cache = G.expectUnsorted ? UNSORTED_CACHE_SIZE : SORTED_CACHE_SIZE;
+ unsigned const open_count = G.expectUnsorted ? UNSORTED_OPEN_TABLE_LIMIT : SORTED_OPEN_TABLE_LIMIT;
+
+ memset(self, 0, sizeof(*self));
+
+ self->coverage.elem_bits = self->mismatches.elem_bits = self->indels.elem_bits = 32;
+ self->pri_align.elem_bits = self->sec_align.elem_bits = 64;
+ self->pri_overlap.elem_bits = self->sec_overlap.elem_bits = sizeof(struct overlap_s) * 8;
+ self->ref_names.elem_bits = 8;
+ self->ref_info.elem_bits = 8 * sizeof(struct s_reference_info);
+
+ rc = ReferenceMgr_Make(&self->mgr, db, mgr, ewrefmgr_co_Coverage,
+ G.refXRefPath, G.inpath,
+ G.maxSeqLen, cache, open_count);
+ if (rc == 0) {
+ unsigned i;
+
+ for (i = 0; G.refFiles[i]; ++i) {
+ rc = ReferenceMgr_FastaPath(self->mgr, G.refFiles[i]);
+ if (rc) {
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "fasta file '$(file)'", "file=%s", G.refFiles[i]));
+ break;
+ }
+ }
+#if DUMP_CONFIG
+ if (rc == 0) {
+ ReferenceMgr_DumpConfig(self->mgr);
+ }
+#endif
+ }
+ return rc;
+}
+
+static
+rc_t Unsorted(Reference *self) {
+ if (G.requireSorted) {
+ rc_t const rc = RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+ (void)LOGERR(klogWarn, rc, "Alignments are unsorted");
+ return rc;
+ }
+ /* do not ever change this message */
+ (void)LOGMSG(klogWarn, "Alignments are unsorted");
+
+ self->out_of_order = true;
+
+ ReferenceMgr_SetCache(self->mgr, UNSORTED_CACHE_SIZE, UNSORTED_OPEN_TABLE_LIMIT);
+
+ KDataBufferWhack(&self->sec_align);
+ KDataBufferWhack(&self->pri_align);
+ KDataBufferWhack(&self->mismatches);
+ KDataBufferWhack(&self->indels);
+ KDataBufferWhack(&self->coverage);
+ KDataBufferWhack(&self->pri_overlap);
+ KDataBufferWhack(&self->sec_overlap);
+
+ return 0;
+}
+
+#define BAIL_ON_FAIL(STMT) do { rc_t const rc__ = (STMT); if (rc__) return rc__; } while(0)
+
+static rc_t FlushBuffers(Reference *self, unsigned upto, bool full, bool final)
+{
+ if (!self->out_of_order && upto > 0) {
+ unsigned offset = 0;
+ unsigned *const miss = (unsigned *)self->mismatches.base;
+ unsigned *const indel = (unsigned *)self->indels.base;
+ unsigned *const cov = (unsigned *)self->coverage.base;
+ struct overlap_s *const pri_overlap = (struct overlap_s *)self->pri_overlap.base;
+ struct overlap_s *const sec_overlap = (struct overlap_s *)self->sec_overlap.base;
+ unsigned chunk = 0;
+
+ while ((self->curPos + offset + (full ? 0 : G.maxSeqLen)) <= upto) {
+ ReferenceSeqCoverage data;
+ unsigned const curPos = self->curPos + offset;
+ unsigned const n = self->endPos > (curPos + G.maxSeqLen) ?
+ G.maxSeqLen : (self->endPos - curPos);
+ unsigned const m = curPos + n > upto ? upto - curPos : n;
+ unsigned i;
+ unsigned hi;
+ unsigned lo;
+
+ if (n == 0) break;
+
+ memset(&data, 0, sizeof(data));
+
+ data.ids[ewrefcov_primary_table].elements = self->pri_align.elem_count;
+ data.ids[ewrefcov_primary_table].buffer = self->pri_align.base;
+ data.overlap_ref_pos[ewrefcov_primary_table] = pri_overlap[chunk].min;
+ data.overlap_ref_len[ewrefcov_primary_table] = pri_overlap[chunk].max ? pri_overlap[chunk].max - curPos : 0;
+
+ data.ids[ewrefcov_secondary_table].elements = self->sec_align.elem_count;
+ data.ids[ewrefcov_secondary_table].buffer = self->sec_align.base;
+ data.overlap_ref_pos[ewrefcov_secondary_table] = sec_overlap[chunk].min;
+ data.overlap_ref_len[ewrefcov_secondary_table] = sec_overlap[chunk].max ? sec_overlap[chunk].max - curPos : 0;
+
+ for (hi = 0, lo = UINT_MAX, i = 0; i != m; ++i) {
+ unsigned const coverage = cov[offset + i];
+
+ if (hi < coverage)
+ hi = coverage;
+ if (lo > coverage)
+ lo = coverage;
+ }
+ data.low = lo > 255 ? 255 : lo;
+ data.high = hi > 255 ? 255 : hi;
+
+ for (i = 0; i != m; ++i)
+ data.mismatches += miss[offset + i];
+
+ for (i = 0; i != m; ++i)
+ data.indels += indel[offset + i];
+
+ {
+ rc_t rc = ReferenceSeq_AddCoverage(self->rseq, curPos, &data);
+
+ if (rc) {
+ return Unsorted(self);
+ }
+ }
+
+ KDataBufferResize(&self->pri_align, 0);
+ KDataBufferResize(&self->sec_align, 0);
+ offset += n;
+ ++chunk;
+ }
+ if (!final && offset > 0) {
+ unsigned const newChunkCount = (unsigned)self->pri_overlap.elem_count - chunk;
+ unsigned const newBaseCount = self->endPos - self->curPos - offset;
+
+ memmove(self->pri_overlap.base, pri_overlap + chunk, newChunkCount * sizeof(pri_overlap[0]));
+ memmove(self->sec_overlap.base, sec_overlap + chunk, newChunkCount * sizeof(sec_overlap[0]));
+ memmove(self->mismatches.base, miss + offset, newBaseCount * sizeof(miss[0]));
+ memmove(self->indels.base, indel + offset, newBaseCount * sizeof(indel[0]));
+ memmove(self->coverage.base, cov + offset, newBaseCount * sizeof(cov[0]));
+
+ KDataBufferResize(&self->pri_overlap, newChunkCount);
+ KDataBufferResize(&self->sec_overlap, newChunkCount);
+
+ self->curPos += offset;
+ }
+ }
+ return 0;
+}
+
+static int str__cmp(char const A[], char const B[])
+{
+ unsigned i;
+
+ for (i = 0; ; ++i) {
+ int const a = A[i];
+ int const b = B[i];
+
+ if (a != b)
+ return a - b;
+ if (a == 0)
+ return 0;
+ }
+}
+
+static int str__equal(char const A[], char const B[])
+{
+ unsigned i;
+
+ for (i = 0; ; ++i) {
+ int const a = A[i];
+ int const b = B[i];
+
+ if (a != b)
+ return 0;
+ if (a == 0)
+ return 1;
+ }
+}
+
+static unsigned str__len(char const A[])
+{
+ unsigned i;
+
+ for (i = 0; ; ++i) {
+ int const a = A[i];
+
+ if (a == 0)
+ return i;
+ }
+}
+
+static unsigned bsearch_name(char const qry[], char const names[],
+ unsigned const count,
+ struct s_reference_info const refInfo[],
+ int found[])
+{
+ unsigned f = 0;
+ unsigned e = count;
+
+ while (f < e) {
+ unsigned const m = f + ((e - f) >> 1);
+ char const *const name = &names[refInfo[m].name];
+ int const diff = str__cmp(qry, name);
+
+ if (diff < 0)
+ e = m;
+ else if (diff > 0)
+ f = m + 1;
+ else {
+ found[0] = 1;
+ return m;
+ }
+ }
+ return f;
+}
+
+static struct s_reference_info s_reference_info_make(unsigned const name, unsigned const id)
+{
+ struct s_reference_info rslt;
+
+ rslt.name = name;
+ rslt.id = id;
+ rslt.lastOffset = 0;
+
+ return rslt;
+}
+
+static unsigned GetLastOffset(Reference const *const self)
+{
+ if (self->last_id < self->ref_info.elem_count) {
+ struct s_reference_info const *const refInfoBase = self->ref_info.base;
+ return refInfoBase[self->last_id].lastOffset;
+ }
+ return 0;
+}
+
+static void SetLastOffset(Reference *const self, unsigned const newValue)
+{
+ if (self->last_id < self->ref_info.elem_count) {
+ struct s_reference_info *const refInfoBase = self->ref_info.base;
+ refInfoBase[self->last_id].lastOffset = newValue;
+ }
+}
+
+rc_t ReferenceSetFile(Reference *const self, char const id[],
+ uint64_t const length, uint8_t const md5[16],
+ bool *const shouldUnmap,
+ bool *const wasRenamed)
+{
+ ReferenceSeq const *rseq;
+ int found = 0;
+ unsigned at = 0;
+
+ if (self->last_id < self->ref_info.elem_count) {
+ struct s_reference_info const *const refInfoBase = self->ref_info.base;
+ struct s_reference_info const refInfo = refInfoBase[self->last_id];
+ char const *const nameBase = self->ref_names.base;
+ char const *const last = nameBase + refInfo.id;
+
+ if (str__equal(id, last)) {
+ return 0;
+ }
+ }
+
+ BAIL_ON_FAIL(FlushBuffers(self, self->length, true, true));
+ BAIL_ON_FAIL(ReferenceMgr_GetSeq(self->mgr, &rseq, id, shouldUnmap, G.allowMultiMapping, wasRenamed));
+
+ self->rseq = rseq;
+
+ at = bsearch_name(id, self->ref_names.base, self->ref_info.elem_count, self->ref_info.base, &found);
+ if (!found) {
+ unsigned const len = str__len(id);
+ unsigned const name_at = self->ref_names.elem_count;
+ unsigned const id_at = name_at;
+ struct s_reference_info const new_elem = s_reference_info_make(name_at, id_at);
+ rc_t const rc = KDataBufferResize(&self->ref_names, name_at + len + 1);
+
+ if (rc)
+ return rc;
+ else {
+ unsigned const count = (unsigned)self->ref_info.elem_count;
+ rc_t const rc = KDataBufferResize(&self->ref_info, count + 1);
+ struct s_reference_info *const refInfoBase = self->ref_info.base;
+
+ if (rc)
+ return rc;
+
+ memmove(((char *)self->ref_names.base) + name_at, id, len + 1);
+ memmove(refInfoBase + at + 1, refInfoBase + at, (count - at) * sizeof(*refInfoBase));
+ refInfoBase[at] = new_elem;
+ }
+ (void)PLOGMSG(klogInfo, (klogInfo, "Processing Reference '$(id)'", "id=%s", id));
+ if (*wasRenamed) {
+ char const *actid = NULL;
+ ReferenceSeq_GetID(rseq, &actid);
+ (void)PLOGMSG(klogInfo, (klogInfo, "Reference '$(id)' was renamed to '$(actid)'", "id=%s,actid=%s", id, actid));
+ }
+ }
+ else if (!self->out_of_order)
+ Unsorted(self);
+
+ self->last_id = at;
+ self->curPos = self->endPos = 0;
+ self->length = (unsigned)length;
+ KDataBufferResize(&self->pri_overlap, 0);
+ KDataBufferResize(&self->sec_overlap, 0);
+
+ return 0;
+}
+
+rc_t ReferenceVerify(Reference const *const self,
+ char const id[],
+ uint64_t const length,
+ uint8_t const md5[16])
+{
+ bool wasRenamed = false;
+ return ReferenceMgr_Verify(self->mgr, id, (unsigned)length, md5, G.allowMultiMapping, &wasRenamed);
+}
+
+rc_t ReferenceGet1stRow(Reference const *self, int64_t *refID, char const refName[])
+{
+ ReferenceSeq const *rseq;
+ bool shouldUnmap = false;
+ bool wasRenamed = false;
+ rc_t rc = ReferenceMgr_GetSeq(self->mgr, &rseq, refName, &shouldUnmap, G.allowMultiMapping, &wasRenamed);
+
+ if( rc == 0 ) {
+ rc = ReferenceSeq_Get1stRow(rseq, refID);
+ ReferenceSeq_Release(rseq);
+ }
+ return rc;
+}
+
+static
+rc_t ReferenceAddCoverage(Reference *const self,
+ unsigned const refStart,
+ unsigned const refLength,
+ uint32_t const mismatches,
+ uint32_t const indels,
+ bool const isPrimary
+ )
+{
+ unsigned const refEnd = refStart + refLength;
+
+ if (refEnd > self->endPos || self->endPos == 0) {
+ unsigned const t1 = refEnd + (G.maxSeqLen - 1);
+ unsigned const adjust = t1 % G.maxSeqLen;
+ unsigned const t2 = t1 - adjust;
+ unsigned const newEndPos = t2 != 0 ? t2 : G.maxSeqLen;
+ unsigned const baseCount = self->endPos - self->curPos;
+ unsigned const newBaseCount = newEndPos - self->curPos;
+
+ BAIL_ON_FAIL(KDataBufferResize(&self->coverage, newBaseCount));
+ BAIL_ON_FAIL(KDataBufferResize(&self->mismatches, newBaseCount));
+ BAIL_ON_FAIL(KDataBufferResize(&self->indels, newBaseCount));
+
+ memset(&((unsigned *)self->coverage.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+ memset(&((unsigned *)self->mismatches.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+ memset(&((unsigned *)self->indels.base)[baseCount], 0, (newBaseCount - baseCount) * sizeof(unsigned));
+ self->endPos = newEndPos;
+ }
+ if ((refEnd - self->curPos) / G.maxSeqLen >= self->pri_overlap.elem_count) {
+ unsigned const chunks = (refEnd - self->curPos) / G.maxSeqLen + 1;
+ unsigned const end = (unsigned)self->pri_overlap.elem_count;
+
+ BAIL_ON_FAIL(KDataBufferResize(&self->pri_overlap, chunks));
+ BAIL_ON_FAIL(KDataBufferResize(&self->sec_overlap, chunks));
+
+ memset(&((struct overlap_s *)self->pri_overlap.base)[end], 0, (chunks - end) * sizeof(struct overlap_s));
+ memset(&((struct overlap_s *)self->sec_overlap.base)[end], 0, (chunks - end) * sizeof(struct overlap_s));
+ }
+ BAIL_ON_FAIL(FlushBuffers(self, refStart, false, false));
+ if (!self->out_of_order) {
+ unsigned const startBase = refStart - self->curPos;
+ unsigned const endChunk = (startBase + refLength) / G.maxSeqLen;
+ KDataBuffer *const overlapBuffer = isPrimary ? &self->pri_overlap : &self->sec_overlap;
+ unsigned *const cov = &((unsigned *)self->coverage.base)[startBase];
+ unsigned i;
+
+ ((unsigned *)self->mismatches.base)[startBase] += mismatches;
+ ((unsigned *)self->indels.base)[startBase] += indels;
+
+ if (((struct overlap_s *)overlapBuffer->base)[endChunk].min == 0 ||
+ ((struct overlap_s *)overlapBuffer->base)[endChunk].min > refStart)
+ {
+ ((struct overlap_s *)overlapBuffer->base)[endChunk].min = refStart;
+ }
+ if (endChunk != 0 &&
+ ((struct overlap_s *)overlapBuffer->base)[endChunk].max < refStart + refLength)
+ {
+ ((struct overlap_s *)overlapBuffer->base)[endChunk].max = refStart + refLength;
+ }
+
+ for (i = 0; i != refLength; ++i) {
+ if (cov[i] < UINT_MAX)
+ ++cov[i];
+ }
+ }
+ return 0;
+}
+
+static void GetCounts(AlignmentRecord const *data, unsigned const seqLen,
+ unsigned *const nMatch,
+ unsigned *const nMiss,
+ unsigned *const nIndels)
+{
+ bool const *const has_mismatch = data->data.has_mismatch.buffer;
+ bool const *const has_offset = data->data.has_ref_offset.buffer;
+ int32_t const *const ref_offset = data->data.ref_offset.buffer;
+ uint8_t const *const ref_offset_type = data->data.ref_offset_type.buffer;
+ unsigned misses = 0;
+ unsigned matchs = 0;
+ unsigned insert = 0;
+ unsigned delete = 0;
+ unsigned j = 0;
+ unsigned i;
+
+ for (i = 0; i < seqLen; ) {
+ if (has_offset[i]) {
+ int const offs = ref_offset[j];
+ int const type = ref_offset_type[j];
+
+ ++j;
+ if (type == 0) {
+ if (offs < 0)
+ ++insert;
+ else
+ ++delete;
+ }
+ if (offs < 0) {
+ i += (unsigned)(-offs);
+ continue;
+ }
+ }
+ if (has_mismatch[i])
+ ++misses;
+ else
+ ++matchs;
+ ++i;
+ }
+ *nMatch = matchs;
+ *nMiss = misses;
+ *nIndels = insert + delete;
+}
+
+rc_t ReferenceRead(Reference *self, AlignmentRecord *data, uint64_t const pos,
+ uint32_t const rawCigar[], uint32_t const cigCount,
+ char const seqDNA[], uint32_t const seqLen,
+ uint8_t rna_orient, uint32_t *matches, uint32_t *misses)
+{
+ unsigned nmis = 0;
+ unsigned nmatch = 0;
+ unsigned indels = 0;
+
+ *matches = 0;
+ BAIL_ON_FAIL(ReferenceSeq_Compress(self->rseq,
+ (G.acceptHardClip ? ewrefmgr_co_AcceptHardClip : 0) + ewrefmgr_cmp_Binary,
+ (INSDC_coord_len)pos,
+ seqDNA, seqLen,
+ rawCigar, cigCount,
+ 0, NULL, 0, 0, NULL, 0,
+ rna_orient,
+ &data->data));
+
+ GetCounts(data, seqLen, &nmatch, &nmis, &indels);
+ *matches = nmatch;
+ *misses = nmis;
+/* removed before more comlete implementation - EY
+ if (!G.acceptNoMatch && data->data.ref_len == 0)
+ return RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated);
+***********************/
+
+ if (!self->out_of_order && pos < GetLastOffset(self)) {
+ return Unsorted(self);
+ }
+ if (!self->out_of_order) {
+ SetLastOffset(self, data->data.effective_offset);
+
+ /* if (G.acceptNoMatch || nmatch >= G.minMatchCount) --- removed before more comlete implementation - EY ***/
+ return ReferenceAddCoverage(self, data->data.effective_offset,
+ data->data.ref_len, nmis, indels,
+ data->isPrimary);
+ /* else return RC(rcApp, rcFile, rcReading, rcConstraint, rcViolated); --- removed before more comlete implementation - EY ***/
+ }
+ return 0;
+}
+
+static rc_t IdVecAppend(KDataBuffer *vec, uint64_t id)
+{
+ uint64_t const end = vec->elem_count;
+
+ BAIL_ON_FAIL(KDataBufferResize(vec, end + 1));
+ ((uint64_t *)vec->base)[end] = id;
+ return 0;
+}
+
+rc_t ReferenceAddAlignId(Reference *self,
+ int64_t align_id,
+ bool is_primary
+ )
+{
+ if (self->out_of_order)
+ return 0;
+ return IdVecAppend(is_primary ? &self->pri_align : &self->sec_align, align_id);
+}
+
+rc_t ReferenceWhack(Reference *self, bool commit)
+{
+ rc_t rc = 0;
+
+ if (self) {
+#if DUMP_CONFIG
+ if (self->mgr)
+ ReferenceMgr_DumpConfig(self->mgr);
+#endif
+ if (commit) {
+ rc = FlushBuffers(self, self->length, true, true);
+ if (rc != 0)
+ commit = false;
+ }
+ KDataBufferWhack(&self->sec_align);
+ KDataBufferWhack(&self->pri_align);
+ KDataBufferWhack(&self->mismatches);
+ KDataBufferWhack(&self->indels);
+ KDataBufferWhack(&self->coverage);
+ KDataBufferWhack(&self->pri_overlap);
+ KDataBufferWhack(&self->sec_overlap);
+ KDataBufferWhack(&self->ref_names);
+ KDataBufferWhack(&self->ref_info);
+ if (self->rseq)
+ rc = ReferenceSeq_Release(self->rseq);
+ if (self->out_of_order) {
+ (void)LOGMSG(klogInfo, "Starting coverage calculation");
+ rc = ReferenceMgr_Release(self->mgr, commit, NULL, true, Quitting);
+ }
+ else {
+ rc = ReferenceMgr_Release(self->mgr, commit, NULL, false, Quitting);
+ }
+ }
+ return rc;
+}
diff --git a/tools/bam-loader/reference-writer.h b/tools/bam-loader/reference-writer.h
new file mode 100644
index 0000000..2946c82
--- /dev/null
+++ b/tools/bam-loader/reference-writer.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_REFERENCE_WRITER_H_
+#define BAM_LOAD_REFERENCE_WRITER_H_ 1
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <klib/data-buffer.h>
+
+#include <align/writer-reference.h>
+#include "alignment-writer.h"
+
+typedef struct s_reference {
+ const ReferenceMgr *mgr;
+ const ReferenceSeq *rseq;
+ int64_t lastRefId;
+ unsigned curPos;
+ unsigned endPos;
+ unsigned length;
+ unsigned last_id; /* == ref_info.elem_count if no last id */
+
+ KDataBuffer coverage;
+ KDataBuffer mismatches;
+ KDataBuffer indels;
+ KDataBuffer pri_align;
+ KDataBuffer sec_align;
+ KDataBuffer pri_overlap;
+ KDataBuffer sec_overlap;
+ KDataBuffer ref_names;
+ KDataBuffer ref_info;
+
+ bool out_of_order;
+} Reference;
+
+rc_t ReferenceInit(Reference *self, const VDBManager *mgr, VDatabase *db);
+rc_t ReferenceSetFile(Reference *self, char const id[],
+ uint64_t length, uint8_t const md5[16],
+ bool *shouldUnmap,
+ bool *wasRenamed);
+rc_t ReferenceVerify(Reference const *self, char const id[], uint64_t length, uint8_t const md5[16]);
+rc_t ReferenceGet1stRow(Reference const *self, int64_t *refID, char const refName[]);
+rc_t ReferenceAddAlignId(Reference *self,
+ int64_t align_id,
+ bool is_primary
+ );
+rc_t ReferenceRead(Reference *self, AlignmentRecord *data, uint64_t pos,
+ uint32_t const rawCigar[], uint32_t cigCount,
+ char const seqDNA[], uint32_t seqLen,
+ uint8_t rna_orient, uint32_t *matches, uint32_t *misses);
+rc_t ReferenceWhack(Reference *self, bool commit);
+
+#endif
diff --git a/tools/bam-loader/samview.c b/tools/bam-loader/samview.c
new file mode 100644
index 0000000..44fed67
--- /dev/null
+++ b/tools/bam-loader/samview.c
@@ -0,0 +1,104 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <kfs/file.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bam.h"
+
+#include <klib/rc.h>
+
+static void writeHeader(BAM_File const *const bam)
+{
+ char const *header = NULL;
+ size_t hsize = 0;
+
+ BAM_FileGetHeaderText(bam, &header, &hsize);
+ fwrite(header, 1, hsize, stdout);
+}
+
+static rc_t writeSAM(BAM_Alignment const *const rec)
+{
+ static char buffer[64*1024];
+ size_t actsize = 0;
+ rc_t const rc = BAM_AlignmentFormatSAM(rec, &actsize, sizeof(buffer), buffer);
+
+ if (rc == 0)
+ fwrite(buffer, 1, actsize, stdout);
+
+ return rc;
+}
+
+static
+void samview(char const path[])
+{
+ BAM_File const *bam = NULL;
+ rc_t rc = BAM_FileMake(&bam, NULL, NULL, path);
+
+ if (rc == 0) {
+ BAM_Alignment const *rec = NULL;
+
+ writeHeader(bam);
+ while ((rc = BAM_FileRead2(bam, &rec)) == 0) {
+ rc_t const rc2 = writeSAM(rec);
+ BAM_AlignmentRelease(rec);
+ if (rc2)
+ break;
+ }
+ BAM_FileRelease(bam);
+ if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)
+ rc = 0;
+ }
+ if (rc)
+ LOGERR(klogWarn, rc, "Final RC");
+}
+
+rc_t CC UsageSummary(char const *name)
+{
+ return 0;
+}
+
+rc_t CC Usage(Args const *args)
+{
+ return 0;
+}
+
+rc_t CC KMain(int argc, char *argv[])
+{
+ if (argc == 1) {
+ samview("/dev/stdin");
+ return 0;
+ }
+ while (--argc) {
+ samview(*++argv);
+ }
+ return 0;
+}
diff --git a/tools/bam-loader/sequence-writer.c b/tools/bam-loader/sequence-writer.c
new file mode 100644
index 0000000..b951290
--- /dev/null
+++ b/tools/bam-loader/sequence-writer.c
@@ -0,0 +1,497 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+
+#include <kdb/manager.h>
+
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "Globals.h"
+#include <align/writer-sequence.h>
+#include "sequence-writer.h"
+
+/* MARK: Sequence Object */
+
+Sequence *SequenceInit(Sequence *self, VDatabase *db) {
+ memset(self, 0, sizeof(*self));
+ self->db = db;
+ VDatabaseAddRef(db);
+ return self;
+}
+
+static rc_t getTable(Sequence *self, bool color)
+{
+ int const options = (color ? ewseq_co_ColorSpace : 0)
+ | (G.hasTI ? ewseq_co_TI : 0)
+ | (G.globalMode == mode_Remap ? (ewseq_co_SaveRead | ewseq_co_KeepKey) : 0)
+ | ewseq_co_NoLabelData
+ | ewseq_co_SpotGroup;
+
+ if (self->tbl) return 0;
+
+ return TableWriterSeq_Make(&self->tbl, self->db,
+ options,
+ G.QualQuantizer);
+}
+
+static rc_t writeRecordX(Sequence *self,
+ SequenceRecord const *rec,
+ bool color,
+ bool isDup,
+ INSDC_SRA_platform_id platform
+ )
+{
+ rc_t rc = 0;
+ uint8_t nreads = rec->numreads;
+ unsigned i;
+ unsigned seqLen;
+ int64_t dummyRowId;
+
+ uint8_t readInfo[4096];
+ void *h_readInfo = NULL;
+
+ INSDC_coord_zero *readStart = (void *)readInfo;
+ INSDC_coord_len *readLen;
+ uint8_t *alcnt;
+ INSDC_SRA_xread_type *readType;
+ INSDC_SRA_read_filter *readFilter;
+ bool *mask = NULL;
+ size_t const elemSize = sizeof(alcnt[0]) + sizeof(readType[0])
+ + sizeof(readStart[0]) + sizeof(readLen[0])
+ + sizeof(readFilter[0]);
+
+ TableWriterSeqData data;
+
+ assert(G.mode == mode_Archive);
+
+ for (i = seqLen = 0; i != nreads; ++i) {
+ seqLen += rec->readLen[i];
+ }
+
+ if (nreads * elemSize + G.keepMismatchQual * seqLen * sizeof(mask[0]) > sizeof(readInfo))
+ {
+ h_readInfo = malloc(nreads * elemSize + G.keepMismatchQual * seqLen * sizeof(mask[0]));
+ if (h_readInfo == NULL)
+ return RC(rcAlign, rcTable, rcWriting, rcMemory, rcExhausted);
+ readStart = h_readInfo;
+ }
+ readLen = (INSDC_coord_len *)&readStart[nreads];
+ alcnt = (uint8_t *)&readLen[nreads];
+ readType = (INSDC_SRA_xread_type *)&alcnt[nreads];
+ readFilter = (INSDC_SRA_read_filter *)&readType[nreads];
+
+ if (G.keepMismatchQual) {
+ mask = (bool *)&readFilter[nreads];
+
+ for (i = 0; i != seqLen; ++i) {
+ mask[i] = (rec->qual[i] & 0x80) != 0;
+ }
+ }
+
+ for (i = 0; i != nreads; ++i) {
+ int const count = rec->aligned[i] ? 1 : 0;
+ int const len = rec->readLen[i];
+ int const start = rec->readStart[i];
+ int const type = len == 0 ? SRA_READ_TYPE_TECHNICAL : SRA_READ_TYPE_BIOLOGICAL;
+ int const dir = len == 0 ? 0 : rec->orientation[i] ? SRA_READ_TYPE_REVERSE : SRA_READ_TYPE_FORWARD;
+ int const filter = isDup ? SRA_READ_FILTER_CRITERIA : rec->is_bad[i] ? SRA_READ_FILTER_REJECT : SRA_READ_FILTER_PASS;
+
+ alcnt[i] = count;
+ readLen[i] = len;
+ readStart[i] = start;
+ readType[i] = type | dir;
+ readFilter[i] = filter;
+ }
+
+ memset(&data, 0, sizeof(data));
+
+ data.sequence.buffer = rec->seq;
+ data.sequence.elements = seqLen;
+
+ data.quality.buffer = rec->qual;
+ data.quality.elements = seqLen;
+
+ if (G.keepMismatchQual) {
+ data.no_quantize_mask.buffer = mask;
+ data.no_quantize_mask.elements = seqLen;
+ }
+
+ data.alignment_count.buffer = alcnt;
+ data.alignment_count.elements = nreads;
+
+ data.nreads = nreads;
+
+ data.read_type.buffer = readType;
+ data.read_type.elements = nreads;
+
+ data.read_start.buffer = readStart;
+ data.read_start.elements = nreads;
+
+ data.read_len.buffer = readLen;
+ data.read_len.elements = nreads;
+
+ data.tmp_key_id = rec->keyId;
+
+ data.spot_group.buffer = rec->spotGroup;
+ data.spot_group.elements = rec->spotGroupLen;
+
+ data.cskey.buffer = rec->cskey;
+ data.cskey.elements = nreads;
+
+ data.read_filter.buffer = readFilter;
+ data.read_filter.elements = nreads;
+
+ data.platform.buffer = &platform;
+ data.platform.elements = 1;
+
+ data.ti.buffer = rec->ti;
+ data.ti.elements = nreads;
+
+ if (!G.no_real_output) {
+ rc = getTable(self, color);
+ if (rc == 0) {
+ rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+ }
+ }
+
+ if (h_readInfo)
+ free(h_readInfo);
+
+ return rc;
+}
+
+static unsigned totalSequenceLength(SequenceRecord const *const rec)
+{
+ unsigned const nreads = rec->numreads;
+ unsigned rslt = 0;
+ unsigned i;
+
+ for (i = 0; i < nreads; ++i)
+ rslt += rec->readLen[i];
+
+ return rslt;
+}
+
+static rc_t writeRecord2(Sequence *self,
+ SequenceRecord const *rec,
+ bool color,
+ bool isDup,
+ INSDC_SRA_platform_id platform
+ )
+{
+ INSDC_SRA_xread_type readType[2];
+ INSDC_SRA_read_filter readFilter[2];
+ uint8_t alcnt[2];
+
+ rc_t rc = 0;
+ unsigned const nreads = rec->numreads;
+ unsigned const seqLen = totalSequenceLength(rec);
+ unsigned i;
+ bool fullyUnaligned = true;
+
+ TableWriterSeqData data;
+
+ assert(G.mode == mode_Archive);
+
+ for (i = 0; i != nreads; ++i) {
+ int const count = rec->aligned[i] ? 1 : 0;
+ int const len = rec->readLen[i];
+ int const type = len == 0 ? SRA_READ_TYPE_TECHNICAL : SRA_READ_TYPE_BIOLOGICAL;
+ int const dir = len == 0 ? 0 : rec->orientation[i] ? SRA_READ_TYPE_REVERSE : SRA_READ_TYPE_FORWARD;
+ int const filter = isDup ? SRA_READ_FILTER_CRITERIA : rec->is_bad[i] ? SRA_READ_FILTER_REJECT : SRA_READ_FILTER_PASS;
+
+ if (rec->aligned[i])
+ fullyUnaligned = false;
+ alcnt[i] = count;
+ readType[i] = type | dir;
+ readFilter[i] = filter;
+ }
+
+ memset(&data, 0, sizeof(data));
+
+ data.sequence.buffer = rec->seq;
+ data.sequence.elements = seqLen;
+
+ data.quality.buffer = rec->qual;
+ data.quality.elements = seqLen;
+
+ data.alignment_count.buffer = alcnt;
+ data.alignment_count.elements = nreads;
+
+ data.nreads = nreads;
+
+ data.read_type.buffer = readType;
+ data.read_type.elements = nreads;
+
+ data.read_start.buffer = rec->readStart;
+ data.read_start.elements = nreads;
+
+ data.read_len.buffer = rec->readLen;
+ data.read_len.elements = nreads;
+
+ data.tmp_key_id = rec->keyId;
+
+ data.spot_group.buffer = rec->spotGroup;
+ data.spot_group.elements = rec->spotGroupLen;
+
+ data.cskey.buffer = rec->cskey;
+ data.cskey.elements = nreads;
+
+ data.read_filter.buffer = readFilter;
+ data.read_filter.elements = nreads;
+
+ data.platform.buffer = &platform;
+ data.platform.elements = 1;
+
+ data.ti.buffer = rec->ti;
+ data.ti.elements = nreads;
+
+ if (fullyUnaligned && rec->linkageGroup && rec->linkageGroupLen > 0) {
+ data.linkageGroup.buffer = rec->linkageGroup;
+ data.linkageGroup.elements = rec->linkageGroupLen;
+ }
+ if (!G.no_real_output) {
+ rc = getTable(self, color);
+ if (rc == 0) {
+ int64_t dummyRowId;
+ rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+ }
+ }
+
+ return rc;
+}
+
+rc_t SequenceWriteRecord(Sequence *self,
+ SequenceRecord const *rec,
+ bool color,
+ bool isDup,
+ INSDC_SRA_platform_id platform
+ )
+{
+ if (rec->numreads <= 2 && !G.keepMismatchQual) {
+ return writeRecord2(self, rec, color, isDup, platform);
+ }
+ else {
+ return writeRecordX(self, rec, color, isDup, platform);
+ }
+}
+
+static rc_t ReadSequenceData(TableWriterSeqData *const data, VCursor const *const curs, int64_t const row, uint32_t const colId[])
+{
+ int i;
+
+ memset(data, 0, sizeof(*data));
+
+ for (i = 0; i <= 8; ++i) {
+ uint32_t elem_bits = 0;
+ uint32_t row_len = 0;
+ uint32_t boff = 0;
+ void const *base = NULL;
+ rc_t const rc = VCursorCellDataDirect(curs, row, colId[i], &elem_bits, &base, &boff, &row_len);
+ if (rc == 0) {
+ TableWriterData *tdata = NULL;
+
+ switch (i) {
+ case 0:
+ assert(elem_bits == sizeof(data->tmp_key_id) * 8);
+ assert(row_len == 1);
+ memmove(&data->tmp_key_id, base, sizeof(data->tmp_key_id));
+ break;
+ case 1:
+ tdata = &data->sequence;
+ break;
+ case 2:
+ tdata = &data->quality;
+ break;
+ case 3:
+ tdata = &data->read_type;
+ break;
+ case 4:
+ tdata = &data->read_start;
+ break;
+ case 5:
+ tdata = &data->read_len;
+ break;
+ case 6:
+ tdata = &data->spot_group;
+ break;
+ case 7:
+ tdata = &data->read_filter;
+ break;
+ case 8:
+ tdata = &data->platform;
+ break;
+ default:
+ assert(!"reachable");
+ break;
+ }
+ if (tdata) {
+ tdata->buffer = base;
+ tdata->elements = row_len;
+ }
+ }
+ else
+ return rc;
+ }
+ return 0;
+}
+
+rc_t SequenceDoneWriting(Sequence *self)
+{
+ if (G.mode == mode_Remap) {
+ /* copy the SEQUENCE table from the first output */
+ VDBManager *mgr = NULL;
+ rc_t rc;
+
+ getTable(self, false);
+
+ rc = VDatabaseOpenManagerUpdate(self->db, &mgr);
+ assert(rc == 0);
+
+ if (rc == 0) {
+ VDatabase const *db = NULL;
+
+ rc = VDBManagerOpenDBRead(mgr, &db, NULL, G.firstOut);
+ assert(rc == 0);
+
+ VDBManagerRelease(mgr);
+ if (rc == 0) {
+ VTable const *tbl = NULL;
+
+ rc = VDatabaseOpenTableRead(db, &tbl, "SEQUENCE");
+ assert(rc == 0);
+ VDatabaseRelease(db);
+ if (rc == 0) {
+ VCursor const *curs = NULL;
+ rc = VTableCreateCursorRead(tbl, &curs);
+ assert(rc == 0);
+ VTableRelease(tbl);
+ if (rc == 0) {
+ uint32_t colId[9];
+
+ rc = VCursorAddColumn(curs, &colId[0], "TMP_KEY_ID");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[1], "(INSDC:dna:text)READ");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[2], "QUALITY");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[3], "READ_TYPE");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[4], "READ_START");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[5], "READ_LEN");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[6], "SPOT_GROUP");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[7], "READ_FILTER");
+ assert(rc == 0);
+ rc = VCursorAddColumn(curs, &colId[8], "PLATFORM");
+ assert(rc == 0);
+ if (rc == 0) {
+ rc = VCursorOpen(curs);
+ assert(rc == 0);
+ if (rc == 0) {
+ int64_t first;
+ uint64_t count;
+ uint64_t row;
+ TableWriterSeqData data;
+
+ rc = VCursorIdRange(curs, colId[0], &first, &count);
+ assert(rc == 0);
+ for (row = 0; row < count; ++row) {
+ int64_t dummyRowId = 0;
+
+ rc = ReadSequenceData(&data, curs, row+first, colId);
+ assert(rc == 0);
+ if (rc) return rc;
+
+ data.nreads = data.read_start.elements;
+
+ rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+ assert(rc == 0);
+ if (rc) return rc;
+ }
+ }
+ }
+ VCursorRelease(curs);
+ }
+ }
+ }
+ }
+ }
+ return TableWriterSeq_TmpKeyStart(self->tbl);
+}
+
+rc_t SequenceReadKey(const Sequence *cself, int64_t row, uint64_t *keyId)
+{
+ return TableWriterSeq_TmpKey(cself->tbl, row, keyId);
+}
+
+rc_t SequenceUpdateAlignData(Sequence *self, int64_t rowId, unsigned nreads,
+ int64_t const primeId[/* nreads */],
+ uint8_t const algnCnt[/* nreads */])
+{
+ TableWriterData data[2];
+
+ data[0].buffer = primeId; data[0].elements = nreads;
+ data[1].buffer = algnCnt; data[1].elements = nreads;
+
+ return TableWriterSeq_WriteAlignmentData(self->tbl, rowId, &data[0], &data[1]);
+}
+
+void SequenceWhack(Sequence *self, bool commit) {
+ uint64_t dummyRows;
+
+ if (self->tbl == NULL)
+ return;
+
+ (void)TableWriterSeq_Whack(self->tbl, commit, &dummyRows);
+ if (G.mode == mode_Remap) {
+ /* This only happens for the second and subsequent loads.
+ * Cleaning up the first load is handled by the bam-load itself
+ * when everything is done.
+ */
+ VTable *tbl = NULL;
+ rc_t rc = VDatabaseOpenTableUpdate(self->db, &tbl, "SEQUENCE");
+ assert(rc == 0);
+ VTableDropColumn(tbl, "TMP_KEY_ID");
+ VTableDropColumn(tbl, "READ");
+ VTableRelease(tbl);
+ }
+ VDatabaseRelease(self->db);
+}
diff --git a/tools/bam-loader/sequence-writer.h b/tools/bam-loader/sequence-writer.h
new file mode 100644
index 0000000..a847db8
--- /dev/null
+++ b/tools/bam-loader/sequence-writer.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_SEQUENCE_WRITER_H_
+#define BAM_LOAD_SEQUENCE_WRITER_H_ 1
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+
+struct TableWriterSeq;
+
+typedef struct s_sequence_record {
+ char *seq;
+ uint8_t *qual;
+ uint32_t *readStart;
+ uint32_t *readLen;
+ uint8_t *orientation;
+ uint8_t *is_bad;
+ uint8_t *alignmentCount;
+ char const *spotGroup;
+ char const *linkageGroup;
+ bool *aligned;
+ char *cskey;
+ uint64_t *ti;
+ uint64_t keyId;
+ unsigned spotGroupLen;
+ unsigned linkageGroupLen;
+ unsigned numreads;
+} SequenceRecord;
+
+typedef struct s_sequence_record_storage {
+ uint64_t ti[2];
+ uint32_t readStart[2];
+ uint32_t readLen[2];
+ uint8_t orientation[2];
+ uint8_t is_bad[2];
+ uint8_t alignmentCount[2];
+ bool aligned[2];
+ char cskey[2];
+} SequenceRecordStorage;
+
+typedef struct s_sequence {
+ VDatabase *db;
+ struct TableWriterSeq const *tbl;
+} Sequence;
+
+Sequence *SequenceInit(Sequence *self, VDatabase *db);
+
+rc_t SequenceWriteRecord(Sequence *self, SequenceRecord const *rec,
+ bool color, bool isDup, INSDC_SRA_platform_id platform);
+
+rc_t SequenceDoneWriting(Sequence *self);
+rc_t SequenceReadKey(const Sequence *self, int64_t row, uint64_t *key);
+rc_t SequenceUpdateAlignData(Sequence *self, int64_t row, unsigned nreads,
+ const int64_t primeId[/* nreads */],
+ const uint8_t alignCount[/* nreads */]);
+
+void SequenceWhack(Sequence *self, bool commit);
+
+
+#endif /* ndef BAM_LOAD_SEQUENCE_WRITER_H_ */
diff --git a/tools/cache-mgr/Makefile b/tools/cache-mgr/Makefile
new file mode 100644
index 0000000..1a0d8dd
--- /dev/null
+++ b/tools/cache-mgr/Makefile
@@ -0,0 +1,76 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/cache-mgr
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ cache-mgr
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# cache-mgr
+#
+TOOL_SRC = \
+ cache-mgr
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+TOOL_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/cache-mgr: $(TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TOOL_LIB)
+
diff --git a/tools/cache-mgr/cache-mgr.c b/tools/cache-mgr/cache-mgr.c
new file mode 100644
index 0000000..7d33977
--- /dev/null
+++ b/tools/cache-mgr/cache-mgr.c
@@ -0,0 +1,1415 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+
+#include <kfg/config.h>
+#include <kfg/repository.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/cacheteefile.h>
+#include <kfs/defs.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <strtol.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+static const char * report_usage[] = { "report objects in cache", NULL };
+static const char * rreport_usage[] = { "report status of repositories", NULL };
+static const char * unlock_usage[] = { "remove lock-files", NULL };
+static const char * clear_usage[] = { "clear cache", NULL };
+static const char * enable_usage[] = { "enable repository [user/site/rem]", NULL };
+static const char * disable_usage[] = { "disable repository [user/site/rem]", NULL };
+static const char * detail_usage[] = { "show detailed report", NULL };
+static const char * tstzero_usage[] = { "test for zero blocks (for report function)", NULL };
+static const char * urname_usage[] = { "restrict to this user-repository", NULL };
+static const char * max_rem_usage[] = { "remove until reached that many bytes", NULL };
+static const char * rem_dir_usage[] = { "remove directories, not only files", NULL };
+
+#define OPTION_CREPORT "report"
+#define ALIAS_CREPORT "r"
+
+#define OPTION_UNLOCK "unlock"
+#define ALIAS_UNLOCK "u"
+
+#define OPTION_CLEAR "clear"
+#define ALIAS_CLEAR "c"
+
+#define OPTION_ENABLE "enable"
+#define ALIAS_ENABLE "e"
+
+#define OPTION_DISABLE "disable"
+#define ALIAS_DISABLE "d"
+
+#define OPTION_RREPORT "rep-report"
+#define ALIAS_RREPORT "o"
+
+#define OPTION_DETAIL "details"
+#define ALIAS_DETAIL "t"
+
+#define OPTION_URNAME "user-repo-name"
+#define ALIAS_URNAME "p"
+
+#define OPTION_MAXREM "max-remove"
+#define ALIAS_MAXREM "m"
+
+#define OPTION_REMDIR "remove-dirs"
+#define ALIAS_REMDIR "i"
+
+#define OPTION_TSTZERO "test-zero"
+#define ALIAS_TSTZERO "z"
+
+OptDef ToolOptions[] =
+{
+ { OPTION_CREPORT, ALIAS_CREPORT, NULL, report_usage, 1, false, false },
+ { OPTION_RREPORT, ALIAS_RREPORT, NULL, rreport_usage, 1, false, false },
+ { OPTION_DETAIL, ALIAS_DETAIL, NULL, detail_usage, 1, false, false },
+ { OPTION_TSTZERO, ALIAS_TSTZERO, NULL, tstzero_usage, 1, false, false },
+ { OPTION_UNLOCK, ALIAS_UNLOCK, NULL, unlock_usage, 1, false, false },
+ { OPTION_CLEAR, ALIAS_CLEAR, NULL, clear_usage, 1, false, false },
+ { OPTION_MAXREM, ALIAS_MAXREM, NULL, max_rem_usage, 1, true, false },
+ { OPTION_REMDIR, ALIAS_REMDIR, NULL, rem_dir_usage, 1, false, false },
+ { OPTION_ENABLE, ALIAS_ENABLE, NULL, enable_usage, 1, true, false },
+ { OPTION_DISABLE, ALIAS_DISABLE, NULL, disable_usage, 1, true, false },
+ { OPTION_URNAME, ALIAS_URNAME, NULL, urname_usage, 1, true, false }
+};
+
+const char UsageDefaultName[] = "cache-mgr";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [path_to_cache] options\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ {
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ rc = UsageSummary ( progname );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "UsageSummary() failed in $(func)", "func=%s", __func__ ) );
+
+ }
+ else
+ rc = KOutMsg ( "Options:\n" );
+
+ if ( rc == 0 )
+ {
+ uint32_t idx, count = sizeof ToolOptions / sizeof ToolOptions [ 0 ];
+ for ( idx = 0; idx < count; ++idx )
+ {
+ OptDef * o = &ToolOptions[ idx ];
+ HelpOptionLine ( o->aliases, o->name, NULL, o->help );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg ( "\n" );
+
+ if ( rc == 0 )
+ {
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+ }
+ }
+ return rc;
+}
+
+typedef enum tool_main_function
+{
+ tf_report,
+ tf_rreport,
+ tf_unlock,
+ tf_clear,
+ tf_enable,
+ tf_disable,
+ tf_unknown
+} tool_main_function;
+
+
+typedef struct tool_options
+{
+ uint64_t max_remove;
+
+ VNamelist * paths;
+ const char * user_repo_name;
+
+ uint32_t path_count;
+ tool_main_function main_function;
+ KRepCategory category;
+
+ bool detailed;
+ bool tstzero;
+ bool remove_dirs;
+} tool_options;
+
+
+static rc_t init_tool_options( tool_options * options )
+{
+ rc_t rc = VNamelistMake ( &options->paths, 5 );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "VNamelistMake() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ options->path_count = 0;
+ options->main_function = tf_unknown;
+ options->user_repo_name = NULL;
+ options->max_remove = 0;
+ }
+ return rc;
+}
+
+
+static rc_t clear_tool_options( tool_options * options )
+{
+ rc_t rc = VNamelistRelease ( options->paths );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "VNamelistRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+
+ if ( options->user_repo_name != NULL )
+ {
+ free( (void*) options->user_repo_name );
+ options->user_repo_name = NULL;
+ }
+ return rc;
+}
+
+
+static bool get_bool_option( const Args * args, const char * name )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionCount() failed in $(func)", "func=%s", __func__ ) );
+ return false;
+ }
+ return ( count > 0 );
+}
+
+
+static bool string_cmp_1( const char * s1, const char * s2 )
+{
+ int cmp = string_cmp( s1, string_size( s1 ), s2, string_size( s2 ), -1 );
+ return ( cmp == 0 );
+}
+
+
+static KRepCategory get_repo_select( const Args * args, const char * name )
+{
+ KRepCategory res = krepBadCategory;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionCount() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else if ( count > 0 )
+ {
+ const char * s = NULL;
+ rc = ArgsOptionValue( args, name, 0, (const void **)&s );
+ if ( rc == 0 && s != NULL )
+ {
+ if ( string_cmp_1 ( s, "user" ) )
+ res = krepUserCategory;
+ else if ( string_cmp_1 ( s, "site" ) )
+ res = krepSiteCategory;
+ else if ( string_cmp_1 ( s, "rem" ) )
+ res = krepRemoteCategory;
+ }
+ }
+ return res;
+}
+
+
+static rc_t get_user_repo_name( const Args * args, const char ** name )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, OPTION_URNAME, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionCount( $(option) ) failed in $(func)", "option=%s,func=%s", OPTION_URNAME, __func__ ) );
+ }
+ else if ( count > 0 )
+ {
+ const char * s = NULL;
+ rc = ArgsOptionValue( args, OPTION_URNAME, 0, (const void **)&s );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionValue( $(option), 0 ) failed in $(func)", "option=%s,func=%s", OPTION_URNAME, __func__ ) );
+ }
+ else if ( s != NULL )
+ *name = string_dup_measure ( s, NULL );
+ }
+ return rc;
+}
+
+
+static rc_t get_max_remove( const Args * args, uint64_t * max_rem )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, OPTION_MAXREM, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionCount( $(option) ) failed in $(func)", "option=%s,func=%s", OPTION_MAXREM, __func__ ) );
+ }
+ else if ( count > 0 )
+ {
+ const char * s = NULL;
+ rc = ArgsOptionValue( args, OPTION_MAXREM, 0, (const void **)&s );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsOptionValue( $(option), 0 ) failed in $(func)", "option=%s,func=%s", OPTION_MAXREM, __func__ ) );
+ }
+ else if ( s != NULL )
+ {
+ char *endp;
+ *max_rem = strtou64( s, &endp, 10 );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t add_tool_options_path( tool_options * options, const char * path )
+{
+ rc_t rc = VNamelistAppend ( options->paths, path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "VNamelistAppend( $(name) ) failed in $(func)", "name=%s, func=%s", path, __func__ ) );
+ }
+ if ( rc == 0 )
+ options->path_count++;
+ return rc;
+}
+
+
+static rc_t get_tool_options( Args * args, tool_options * options )
+{
+ uint32_t idx, count;
+
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsParamCount() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else if ( count > 0 )
+ {
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *value = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&value );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsParamValue( $(idx) ) failed in $(func)", "idx=%d,func=%s", idx, __func__ ) );
+ }
+ else if ( value != NULL )
+ rc = add_tool_options_path( options, value );
+ }
+ }
+
+ options->main_function = tf_unknown;
+ options->detailed = get_bool_option( args, OPTION_DETAIL );
+ options->tstzero = get_bool_option( args, OPTION_TSTZERO );
+ options->remove_dirs = get_bool_option( args, OPTION_REMDIR );
+
+ if ( get_bool_option( args, OPTION_CREPORT ) )
+ options->main_function = tf_report;
+ else if ( get_bool_option( args, OPTION_RREPORT ) )
+ options->main_function = tf_rreport;
+ else if ( get_bool_option( args, OPTION_UNLOCK ) )
+ options->main_function = tf_unlock;
+ else if ( get_bool_option( args, OPTION_CLEAR ) )
+ options->main_function = tf_clear;
+ else
+ {
+ options->category = get_repo_select( args, OPTION_ENABLE );
+ if ( options->category != krepBadCategory )
+ options->main_function = tf_enable;
+
+ if ( options->category == krepBadCategory )
+ {
+ options->category = get_repo_select( args, OPTION_DISABLE );
+ if ( options->category != krepBadCategory )
+ options->main_function = tf_disable;
+ }
+ }
+
+ if ( rc == 0 )
+ rc = get_user_repo_name( args, &options->user_repo_name );
+ if ( rc == 0 )
+ rc = get_max_remove( args, &options->max_remove );
+ return rc;
+}
+
+
+typedef struct visit_ctx
+{
+ KDirectory * dir;
+ KConfig * cfg;
+ const KRepositoryMgr * repo_mgr;
+
+ const tool_options * options;
+ const char * path;
+ void * data;
+ uint32_t path_type;
+ bool terminate;
+} visit_ctx;
+
+
+typedef rc_t ( *on_path_t )( visit_ctx * obj );
+
+
+static rc_t foreach_path_obj( visit_ctx * ctx, on_path_t func )
+{
+ rc_t rc = 0;
+ ctx->path_type = ( KDirectoryPathType ( ctx->dir, "%s", ctx->path ) & ~ kptAlias );
+ if ( ctx->path_type == kptDir )
+ {
+ KNamelist * path_objects;
+ rc = KDirectoryList ( ctx->dir, &path_objects, NULL, NULL, "%s", ctx->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryList( $(path) ) failed in $(func)", "path=%s,func=%s", ctx->path, __func__ ) );
+ }
+ else
+ {
+ uint32_t idx, count;
+ rc = KNamelistCount ( path_objects, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KNamelistCount() failed in $(func)", "func=%s", __func__ ) );
+ }
+ for ( idx = 0; idx < count && rc == 0 && !ctx->terminate; ++idx )
+ {
+ const char * obj_name = NULL;
+ rc = KNamelistGet ( path_objects, idx, &obj_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KNamelistGet( $(idx) ) failed in $(func)", "idx=%d,func=%s", idx, __func__ ) );
+ }
+ else if ( obj_name != NULL )
+ {
+ char obj_path[ 4096 ];
+ rc = KDirectoryResolvePath ( ctx->dir, true, obj_path, sizeof obj_path, "%s/%s", ctx->path, obj_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryResolvePath( $(path) ) failed in $(func)", "path=%s,func=%s", ctx->path, __func__ ) );
+ }
+ else
+ {
+ visit_ctx octx;
+ octx.dir = ctx->dir;
+ octx.options = ctx->options;
+ octx.path = obj_path;
+ octx.data = ctx->data;
+ octx.path_type = ( KDirectoryPathType ( ctx->dir, "%s", obj_path ) & ~ kptAlias );
+ if ( octx.path_type == kptDir )
+ {
+ rc = foreach_path_obj( &octx, func ); /* recursion !!! */
+ }
+ else if ( octx.path_type == kptFile )
+ {
+ rc = func( &octx );
+ }
+ }
+ }
+ }
+
+ {
+ rc_t rc2 = KNamelistRelease ( path_objects );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KNamelistRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ }
+ if ( rc == 0 && ( ctx->path_type == kptDir || ctx->path_type == kptFile ) && !ctx->terminate )
+ {
+ /* at the very end of it, call the function for the path itself */
+ rc = func( ctx );
+ }
+ return rc;
+}
+
+
+static rc_t foreach_path( visit_ctx * octx, on_path_t func )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ octx->terminate = false;
+ for ( idx = 0; idx < octx->options->path_count && rc == 0 && !octx->terminate; ++idx )
+ {
+ rc = VNameListGet ( octx->options->paths, idx, &octx->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "VNameListGet( $(idx) ) failed in $(func)", "idx=%u,func=%s", idx, __func__ ) );
+ }
+ else if ( octx->path != NULL )
+ {
+ rc = foreach_path_obj( octx, func );
+ }
+ }
+ return rc;
+}
+
+
+static bool string_ends_in( const char * str, const char * end )
+{
+ bool res = false;
+ if ( str != NULL && end != NULL )
+ {
+ uint32_t l_str = string_len( str, string_size( str ) );
+ uint32_t l_end = string_len( end, string_size( end ) );
+ if ( l_str >= l_end && l_end > 0 )
+ {
+ const char * p = str + ( l_str - l_end );
+ res = ( string_cmp ( p, l_end, end, l_end, l_end ) == 0 );
+ }
+ }
+ return res;
+}
+
+
+/***************************************************************************************************************/
+
+typedef struct report_data
+{
+ uint32_t partial_count;
+ uint32_t full_count;
+ uint32_t lock_count;
+ uint64_t file_size;
+ uint64_t used_file_size;
+} report_data;
+
+
+static rc_t on_report_cache_file( visit_ctx * obj )
+{
+ rc_t rc = 0;
+ uint64_t file_size = 0;
+ uint64_t used_size = 0;
+ uint64_t checked_blocks = 0;
+ uint64_t empty_blocks = 0;
+ float completeness = 0.0;
+
+ bool locked = false;
+ report_data * data = obj->data;
+
+ data->partial_count++;
+ rc = KDirectoryFileSize ( obj->dir, &file_size, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryFileSize( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ struct KFile const *f;
+
+ data->file_size += file_size;
+ rc = KDirectoryOpenFileRead ( obj->dir, &f, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryOpenFileRead( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ rc = GetCacheCompleteness( f, &completeness, &used_size ); /* libs/kfs/cacheteefile.c */
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "GetCacheCompleteness( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ data->used_file_size += used_size;
+ }
+
+ if ( rc == 0 && obj->options->tstzero )
+ {
+ rc = Has_Cache_Zero_Blocks( f, &checked_blocks, &empty_blocks ); /* libs/kfs/cacheteefile.c */
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "Has_Cache_Zero_Blocks( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ }
+
+ KFileRelease( f );
+ }
+ }
+ if ( rc == 0 )
+ {
+ uint32_t pt = ( KDirectoryPathType ( obj->dir, "%s.lock", obj->path ) & ~ kptAlias );
+ locked = ( pt == kptFile );
+ }
+
+ if ( rc == 0 && obj->options->detailed )
+ {
+ if ( locked )
+ rc = KOutMsg( "%s complete by %.02f %% [%,lu of %,lu]bytes locked\n",
+ obj->path, completeness, used_size, file_size );
+ else
+ rc = KOutMsg( "%s complete by %.02f %% [%,lu of %,lu]bytes\n",
+ obj->path, completeness, used_size, file_size );
+ }
+
+ if ( rc == 0 && obj->options->tstzero )
+ {
+ rc = KOutMsg( "%s has %lu blocks set in bitmap where %lu are empty\n",
+ obj->path, checked_blocks, empty_blocks );
+ }
+
+ return rc;
+}
+
+
+static rc_t on_report_full_file( visit_ctx * obj )
+{
+ rc_t rc = 0;
+ uint64_t file_size = 0;
+ report_data * data = obj->data;
+
+ data->full_count++;
+ rc = KDirectoryFileSize ( obj->dir, &file_size, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryFileSize( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ data->file_size += file_size;
+ data->used_file_size += file_size;
+ if ( obj->options->detailed )
+ rc = KOutMsg( "%s complete file of %,lu bytes\n", obj->path, file_size );
+ }
+ return rc;
+}
+
+
+static rc_t on_report_path( visit_ctx * obj )
+{
+ rc_t rc = 0;
+ if ( obj->path_type == kptFile )
+ {
+ report_data * data = obj->data;
+ if ( string_ends_in( obj->path, ".cache" ) )
+ {
+ rc = on_report_cache_file( obj );
+ }
+ else if ( string_ends_in( obj->path, ".lock" ) )
+ {
+ data->lock_count ++;
+ }
+ else if ( string_ends_in( obj->path, ".sra" ) )
+ {
+ rc = on_report_full_file( obj );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_report( visit_ctx * octx )
+{
+ rc_t rc = 0;
+ report_data data;
+
+ memset( &data, 0, sizeof data );
+ octx->data = &data;
+
+ if ( octx->options->detailed )
+ rc = KOutMsg( "\n-----------------------------------\n" );
+ if ( rc == 0 )
+ rc = foreach_path( octx, on_report_path );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "-----------------------------------\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u cached file(s)\n", data.partial_count );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u complete file(s)\n", data.full_count );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,lu bytes in cached files\n", data.file_size );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,lu bytes used in cached files\n", data.used_file_size );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u lock files\n", data.lock_count );
+
+ return rc;
+}
+
+
+/***************************************************************************************************************/
+typedef rc_t ( CC * get_repo_cb )( const KRepositoryMgr *self, KRepositoryVector *repos );
+
+const char MAIN_CAT_USER[] = "user";
+const char MAIN_CAT_SITE[] = "site";
+const char MAIN_CAT_REMOTE[] = "remote";
+
+const char SUB_CAT_UNKNOWN[] = "unknown";
+const char SUB_CAT_MAIN[] = "main";
+const char SUB_CAT_AUX[] = "aux";
+const char SUB_CAT_PROT[] = "protected";
+
+
+static rc_t report_repo( visit_ctx * octx, KRepCategory category )
+{
+ rc_t rc, rc1;
+ KRepositoryVector repos;
+ const char * hint;
+
+ VectorInit ( &repos, 0, 5 );
+
+ switch ( category )
+ {
+ case krepUserCategory : hint = MAIN_CAT_USER;
+ rc = KRepositoryMgrUserRepositories( octx->repo_mgr, &repos );
+ break;
+
+ case krepSiteCategory : hint = MAIN_CAT_SITE;
+ rc = KRepositoryMgrSiteRepositories( octx->repo_mgr, &repos );
+ break;
+
+ case krepRemoteCategory : hint = MAIN_CAT_REMOTE;
+ rc = KRepositoryMgrRemoteRepositories( octx->repo_mgr, &repos );
+ break;
+ }
+
+ if ( rc != 0 )
+ {
+ if ( rc == SILENT_RC( rcKFG, rcNode, rcOpening, rcPath, rcNotFound ) )
+ {
+ KOutMsg("\n%s:\n", hint);
+ KOutMsg("\tnot found in configuration\n");
+ rc = 0;
+ }
+ else
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryMgr<$(hint)>repositories() failed in $(func)",
+ "hint=%s,func=%s", hint, __func__ ) );
+ }
+ }
+ else
+ {
+ uint32_t idx;
+ bool disabled = KRepositoryMgrCategoryDisabled ( octx->repo_mgr, category );
+
+ rc = KOutMsg( "\n%s:\n", hint );
+ if ( rc == 0 && disabled )
+ rc = KOutMsg( "\tglobally disabled\n" );
+
+ for ( idx = 0; idx < VectorLength( &repos ) && rc == 0; ++idx )
+ {
+ const KRepository *repo = VectorGet( &repos, idx );
+ if ( repo != NULL )
+ {
+ char repo_name[ 1024 ];
+ rc = KRepositoryDisplayName ( repo, repo_name, sizeof repo_name, NULL );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryName() for $(hint) failed in $(func)", "hint=%s,func=%s", hint, __func__ ) );
+ }
+ else
+ {
+ KRepSubCategory sub_cat = KRepositorySubCategory ( repo );
+ bool disabled = KRepositoryDisabled ( repo );
+ bool cache_enabled = KRepositoryCacheEnabled ( repo );
+ const char * sub_cat_ptr = SUB_CAT_UNKNOWN;
+ switch( sub_cat )
+ {
+ case krepMainSubCategory : sub_cat_ptr = SUB_CAT_MAIN; break;
+ case krepAuxSubCategory : sub_cat_ptr = SUB_CAT_AUX; break;
+ case krepProtectedSubCategory : sub_cat_ptr = SUB_CAT_PROT; break;
+ default : sub_cat_ptr = SUB_CAT_UNKNOWN; break;
+ }
+
+ rc = KOutMsg( "\t%s.%s: %s, cache-%s",
+ sub_cat_ptr, repo_name,
+ ( disabled ? "disabled" : "enabled" ),
+ ( cache_enabled ? "enabled" : "disabled" ) );
+ if ( rc == 0 )
+ {
+ if ( octx->options->detailed )
+ {
+ /* it is OK if we cannot find the root of a repository... */
+ char where[ 4096 ];
+ rc1 = KRepositoryRoot ( repo, where, sizeof where, NULL );
+ if ( rc1 == 0 )
+ rc = KOutMsg( ", at %s", where );
+ else
+ {
+ rc1 = KRepositoryResolver ( repo, where, sizeof where, NULL );
+ if ( rc1 == 0 )
+ rc = KOutMsg( ", at %s", where );
+ }
+ }
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ }
+ }
+ {
+ rc1 = KRepositoryVectorWhack ( &repos );
+ if ( rc1 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc1,
+ "KRepositoryVectorWhack() for $(hint) failed in $(func)", "hint=%s,func=%s", hint, __func__ ) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_rreport( visit_ctx * octx )
+{
+ rc_t rc = report_repo( octx, krepUserCategory );
+
+ if ( rc == 0 )
+ rc = report_repo( octx, krepSiteCategory );
+
+ if ( rc == 0 )
+ rc = report_repo( octx, krepRemoteCategory );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ return rc;
+}
+
+
+/***************************************************************************************************************/
+
+
+typedef struct unlock_data
+{
+ uint32_t lock_count;
+} unlock_data;
+
+
+static rc_t on_unlock_path( visit_ctx * obj )
+{
+ rc_t rc = 0;
+ if ( obj->path_type == kptFile && string_ends_in( obj->path, ".lock" ) )
+ {
+ unlock_data * data = obj->data;
+ rc = KDirectoryRemove ( obj->dir, false, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryRemove( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ data->lock_count++;
+ rc = KOutMsg( "%s deleted\n", obj->path );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_unlock( visit_ctx * octx )
+{
+ rc_t rc = 0;
+ unlock_data data;
+
+ memset( &data, 0, sizeof data );
+ octx->data = &data;
+ if ( rc == 0 )
+ rc = foreach_path( octx, on_unlock_path );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "-----------------------------------\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u lock-files removed\n", data.lock_count );
+
+ return rc;
+}
+
+
+/***************************************************************************************************************/
+
+
+typedef struct clear_data
+{
+ uint32_t removed_files;
+ uint32_t removed_directories;
+ uint64_t removed_size;
+} clear_data;
+
+
+static rc_t on_clear_path( visit_ctx * obj )
+{
+ rc_t rc = 0;
+ clear_data * data = obj->data;
+
+ /* the caller is written to first hit the files/subdirs, then the directory that contains them */
+ if ( obj->path_type == kptDir )
+ {
+ if ( obj->options->remove_dirs )
+ {
+ rc = KDirectoryRemove ( obj->dir, false, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryRemove( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ data->removed_directories++;
+ }
+ }
+ else if ( obj->path_type == kptFile )
+ {
+ uint64_t file_size;
+ rc = KDirectoryFileSize ( obj->dir, &file_size, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryFileSize( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ rc = KDirectoryRemove ( obj->dir, false, "%s", obj->path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryRemove( $(path) ) failed in $(func)", "path=%s,func=%s", obj->path, __func__ ) );
+ }
+ else
+ {
+ if ( obj->options->detailed )
+ rc = KOutMsg( "FILE: '%s' removed (%,lu bytes)\n", obj->path, file_size );
+ data->removed_files++;
+ data->removed_size += file_size;
+ if ( obj->options->max_remove > 0 && data->removed_size >= obj->options->max_remove )
+ {
+ obj->terminate = true;
+ KOutMsg( "the maximum of %,lu bytes to be removed is reached now\n", obj->options->max_remove );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_clear( visit_ctx * octx )
+{
+ rc_t rc = 0;
+ clear_data data;
+
+ memset( &data, 0, sizeof data );
+ octx->data = &data;
+
+ if ( octx->options->max_remove > 0 )
+ rc = KOutMsg( "removing max %,u bytes\n", octx->options->max_remove );
+ if ( rc == 0 )
+ rc = foreach_path( octx, on_clear_path );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "-----------------------------------\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u files removed\n", data.removed_files );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,u directories removed\n", data.removed_directories );
+ if ( rc == 0 )
+ rc = KOutMsg( "%,lu bytes removed\n", data.removed_size );
+
+ return rc;
+}
+
+
+/***************************************************************************************************************/
+
+/*
+static rc_t enable_disable_repo( bool disabled, get_repo_cb getter, const char * hint )
+{
+ KConfig * cfg;
+ rc_t rc = KConfigMake ( &cfg, NULL );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMake() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ const KRepositoryMgr *repo_mgr;
+ rc = KConfigMakeRepositoryMgrRead ( cfg, &repo_mgr );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMakeRepositoryMgrRead() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ uint32_t idx;
+ KRepositoryVector repos;
+ VectorInit ( &repos, 0, 5 );
+ rc = getter ( repo_mgr, &repos );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryMgr<$(hint)>repositories() failed in $(func)", "hint=%s,func=%s", hint, __func__ ) );
+ }
+ for ( idx = 0; idx < VectorLength( &repos ) && rc == 0; ++idx )
+ {
+ const KRepository *repo = VectorGet( &repos, idx );
+ if ( repo != NULL )
+ {
+ rc = KRepositorySetDisabled ( repo, disabled );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositorySetDisabled() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ if ( disabled )
+ KOutMsg( "%s repositories disabled\n", hint );
+ else
+ KOutMsg( "%s repositories enabled\n", hint );
+ }
+ {
+ rc_t rc2 = KRepositoryVectorWhack ( &repos );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KRepositoryVectorWhack() failed in $(func)", "func=%s", __func__ ) );
+ }
+ rc2 = KRepositoryMgrRelease ( repo_mgr );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KRepositoryMgrRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+
+ }
+ }
+
+ {
+ rc_t rc2 = KConfigRelease ( cfg );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KConfigRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t enable_disable_user_repo( bool disabled )
+{
+ return enable_disable_repo( disabled, KRepositoryMgrUserRepositories, "user" );
+}
+
+
+static rc_t enable_disable_site_repo( bool disabled )
+{
+ return enable_disable_repo( disabled, KRepositoryMgrSiteRepositories, "site" );
+}
+
+
+static rc_t enable_disable_remote_repo( bool disabled )
+{
+ return enable_disable_repo( disabled, KRepositoryMgrRemoteRepositories, "remote" );
+}
+*/
+
+/***************************************************************************************************************/
+
+
+static rc_t perform_set_disable( visit_ctx * octx, bool disabled )
+{
+ rc_t rc;
+ if ( octx->options->category == krepBadCategory )
+ rc = KOutMsg( "enable unknown category\n" );
+ else
+ {
+ rc = KRepositoryMgrCategorySetDisabled ( octx->repo_mgr, octx->options->category, disabled );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryMgrCategorySetDisabled() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ rc = KConfigCommit ( octx->cfg );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigCommit() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/***************************************************************************************************************/
+
+
+static rc_t perform( tool_options * options, Args * args )
+{
+ visit_ctx octx;
+ rc_t rc2, rc = KDirectoryNativeDir( &octx.dir );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KDirectoryNativeDir() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ rc = KConfigMake ( &octx.cfg, NULL );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMake() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ rc = KConfigMakeRepositoryMgrRead ( octx.cfg, &octx.repo_mgr );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMakeRepositoryMgrRead() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ octx.options = options;
+ octx.data = NULL;
+ switch( options->main_function )
+ {
+ case tf_report : rc = perform_report( &octx ); break;
+ case tf_rreport : rc = perform_rreport( &octx ); break;
+ case tf_unlock : rc = perform_unlock( &octx ); break;
+ case tf_clear : rc = perform_clear( &octx ); break;
+ case tf_enable : rc = perform_set_disable( &octx, false ); break;
+ case tf_disable : rc = perform_set_disable( &octx, true ); break;
+ case tf_unknown : rc = Usage( args ); break;
+ }
+
+ rc2 = KRepositoryMgrRelease ( octx.repo_mgr );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KRepositoryMgrRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+
+ rc2 = KConfigRelease ( octx.cfg );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KConfigRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+
+ rc2 = KDirectoryRelease( octx.dir );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KDirectoryRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ Main:
+***************************************************************************/
+
+static rc_t CC on_history_path( const String * part, void *data )
+{
+ tool_options * options = data;
+ rc_t rc = add_tool_options_path( options, part->addr );
+ if ( options -> detailed )
+ KOutMsg( "source: %S\n", part );
+ return rc;
+}
+
+static rc_t get_cache_path_from_repo_mgr( tool_options * options )
+{
+ KConfig * cfg;
+ rc_t rc = KConfigMake ( &cfg, NULL );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMake() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ const KRepositoryMgr *repo_mgr;
+ rc = KConfigMakeRepositoryMgrRead ( cfg, &repo_mgr );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KConfigMakeRepositoryMgrRead() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ KRepositoryVector repos;
+ VectorInit ( &repos, 0, 5 );
+ rc = KRepositoryMgrUserRepositories ( repo_mgr, &repos );
+ if ( rc != 0 )
+ {
+ rc = 0; /* we do not have a user-repository, but that is OK, the caller will display the lack of it ... */
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < VectorLength( &repos ) && rc == 0; ++idx )
+ {
+ bool add = true;
+ KRepository * repo = VectorGet ( &repos, idx );
+ if ( repo != NULL )
+ {
+ if ( options->user_repo_name != NULL )
+ {
+ char name[ 1024 ];
+ rc = KRepositoryName( repo, name, sizeof name, NULL );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryName( for repo # $(idx) ) failed in $(func)", "idx=%u,func=%s", idx, __func__ ) );
+ }
+ else
+ add = string_cmp_1( options->user_repo_name, name );
+ }
+ if ( add )
+ {
+ rc_t rc1;
+ char path[ 4096 ];
+ size_t path_size;
+ rc = KRepositoryRoot ( repo, path, sizeof path, &path_size );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KRepositoryRoot( for repo # $(idx) ) failed in $(func)", "idx=%u,func=%s", idx, __func__ ) );
+ }
+ else
+ {
+ path[ path_size ] = 0;
+ rc = add_tool_options_path( options, path );
+ if ( options->detailed )
+ KOutMsg( "source: %s\n", path );
+ }
+ rc1 = KRepositoryRootHistory ( repo, path, sizeof path, &path_size );
+ if ( rc1 == 0 ) /* it is not an error if we have no repository-root */
+ {
+ path[ path_size ] = 0;
+ foreach_Str_part( path, ':', on_history_path, options );
+ }
+ }
+ }
+ }
+ {
+ rc_t rc2 = KRepositoryVectorWhack ( &repos );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KRepositoryVectorWhack() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ {
+ rc_t rc2 = KRepositoryMgrRelease ( repo_mgr );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KRepositoryMgrRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ {
+ rc_t rc2 = KConfigRelease ( cfg );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "KConfigRelease() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t CC write_to_FILE ( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f ); /* hardcoded value for stdout == 1 */
+ if ( * num_writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+
+static rc_t explain_no_cache_found ( void )
+{
+ rc_t rc = KOutMsg( "this tool was not able to find the location of the cache\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "solution A : specify the cache-path at the commandline like 'cache-mgr ~/my_cache -r'\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "solution B : fix your broken configuration-setup ( use vdb-config )\n" );
+ return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc = KOutHandlerSet ( write_to_FILE, stdout );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "KOutHandlerSet() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ Args * args;
+ rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ ToolOptions, sizeof ToolOptions / sizeof ToolOptions [ 0 ] );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "ArgsMakeAndHandle() failed in $(func)", "func=%s", __func__ ) );
+ }
+ else
+ {
+ tool_options options;
+ rc = init_tool_options( &options );
+ if ( rc == 0 )
+ {
+ rc = get_tool_options( args, &options );
+ if ( rc == 0 )
+ {
+ bool cache_paths_needed = false;
+ switch( options.main_function )
+ {
+ case tf_report : ;
+ case tf_unlock : ;
+ case tf_clear : cache_paths_needed = true; break;
+ case tf_rreport : ;
+ case tf_enable : ;
+ case tf_disable : ;
+ case tf_unknown : ; break;
+ }
+
+ if ( options.path_count == 0 && cache_paths_needed )
+ rc = get_cache_path_from_repo_mgr( &options );
+
+ if ( rc == 0 )
+ {
+ if ( options.path_count == 0 && cache_paths_needed )
+ {
+ rc = explain_no_cache_found ();
+ }
+ else
+ rc = perform( &options, args );
+ }
+ }
+ clear_tool_options( &options );
+ }
+ }
+ {
+ rc_t rc2 = ArgsWhack ( args );
+ if ( rc2 != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc2,
+ "ArgsWhack() failed in $(func)", "func=%s", __func__ ) );
+ }
+ }
+ }
+
+ return rc;
+}
+
diff --git a/tools/ccextract/Makefile b/tools/ccextract/Makefile
new file mode 100644
index 0000000..d5eb330
--- /dev/null
+++ b/tools/ccextract/Makefile
@@ -0,0 +1,90 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/ccextract
+
+INT_TOOLS =
+
+EXT_TOOLS = ccextract
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_XML2))
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built:" \
+ "It requires our internal library 'libkxml'" \
+ "which requires 'libxml2' and its development headers."
+endif
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# ccextract
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+CCEXTRACT_SRC = \
+ ccextract
+
+CCEXTRACT_OBJ = \
+ $(addsuffix .$(OBJX),$(CCEXTRACT_SRC))
+
+CCEXTRACT_LIB = \
+ -lkapp \
+ -stk-version \
+ -lkxfs \
+ -lkxml \
+ -sncbi-vdb
+
+$(BINDIR)/ccextract: $(CCEXTRACT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(CCEXTRACT_LIB)
diff --git a/tools/ccextract/ccextract.c b/tools/ccextract/ccextract.c
new file mode 100644
index 0000000..6cc7e27
--- /dev/null
+++ b/tools/ccextract/ccextract.c
@@ -0,0 +1,1272 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/manager-priv.h>
+#include <vfs/path-priv.h>
+#include <kxml/xml.h>
+#include <kfs/defs.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/nullfile.h>
+#include <kfs/teefile.h>
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <kapp/args.h>
+#include <kapp/main.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/*
+ * some program globals
+ */
+const char * program_name = "ccextract"; /* default it but try to set it */
+const char * full_path = "ccextract"; /* default it but try to set it */
+
+
+#define OPTION_XML "copycat-xml"
+#define OPTION_FORCE "force"
+#define OPTION_DIR "directory"
+
+#define ALIAS_XML "x"
+#define ALIAS_FORCE "f"
+#define ALIAS_DIR "d"
+
+
+static
+const char * xml_usage[] =
+{ "XML generated by 'copycat''", NULL };
+static
+const char * force_usage[] =
+{ "force overwrite of existing files", NULL };
+static
+const char * dir_usage[] =
+{ "location of output dbase directory", NULL };
+
+const char UsageDefaultName [] = "ccextract";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] [-d|--directory <directory>] -x|--copycat-xml <XML-file>\\\n"
+ " source-archive | [path [...]]"
+ "\n"
+ "Summary:\n"
+ " Copies files and/or directories, creating a catalog of the copied files.\n",
+ progname);
+}
+
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+const char * first_usage[] =
+{
+ "The path to a archive file ",
+ NULL
+};
+
+static
+const char * second_usage[] =
+{
+ "A file by path or ID to extract",
+ "If none are given all files are extracted",
+ NULL
+};
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Parameters:\n");
+
+ HelpParamLine ("source-file-path", first_usage);
+ HelpParamLine ("extract-path", second_usage);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine (ALIAS_XML, OPTION_XML, "XML-file", xml_usage);
+ HelpOptionLine (ALIAS_DIR, OPTION_DIR, "directoy-path", dir_usage);
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+
+ HelpOptionsStandard ();
+/* 1 2 3 4 5 6 7 8 */
+/* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_XML, ALIAS_XML, NULL, xml_usage, 1, true, true },
+ { OPTION_DIR, ALIAS_DIR, NULL, dir_usage, 1, true, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false }
+};
+
+
+/* ----------------------------------------------------------------------
+ */
+static struct
+{
+ const char * dirstr;
+ VPath * dirpath;
+ KDirectory * dir; /* extraction target directory */
+
+ const char * xmlstr;
+ VPath * xmlpath;
+ const KFile * xml;
+
+ const char * arcstr;
+
+ /* root directory for XFS is archive as a directory but located below the archive */
+ const char * rootstr;
+ const KDirectory * root;
+
+ /* base is the directory made from the archive - xtoc/xfs is a bit incoherent here */
+ const char * basestr;
+ VPath * basepath;
+ const KDirectory * base;
+
+
+ VFSManager * vfsmgr;
+
+ Vector pathstr;
+ Vector pathvpath;
+ BSTree pathtree;
+
+
+
+
+ KFile * null;
+
+
+
+
+ bool force;
+ uint32_t cm;
+} options;
+
+
+/* ----------------------------------------------------------------------
+ */
+typedef struct extnode
+{
+ BSTNode node;
+ const VPath * path;
+ uint64_t offset;
+} extnode;
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t extnode_make (extnode ** new_node, const VPath * path, uint64_t offset)
+{
+ rc_t rc;
+
+ if (new_node == NULL)
+ {
+ rc = RC (rcExe, rcTree, rcConstructing, rcParam, rcNull);
+ LOGERR (klogInt, rc, "missing new_node for making node");
+ }
+ else
+ {
+ *new_node = NULL;
+
+ if (path == NULL)
+ {
+ rc = RC (rcExe, rcTree, rcConstructing, rcParam, rcNull);
+ LOGERR (klogInt, rc, "missing path for making node");
+ }
+ else if (path == NULL)
+ {
+ rc = RC (rcExe, rcTree, rcConstructing, rcParam, rcNull);
+ LOGERR (klogInt, rc, "missing path for making node");
+ }
+ else
+ {
+ extnode * node;
+
+ node = malloc (sizeof *node);
+ if (node == NULL)
+ {
+ rc = RC (rcExe, rcTree, rcConstructing, rcMemory, rcExhausted);
+ LOGERR (klogFatal, rc, "unable to get memory to make a VPath node");
+ }
+ else
+ {
+ rc = VPathAddRef (path);
+ if (rc == 0)
+ {
+ node->path = path;
+ node->offset = offset;
+ *new_node = node;
+ return 0;
+ }
+ free (node);
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+void CC extnode_whack (BSTNode * n, void * data)
+{
+ if (n)
+ {
+ VPathRelease (((extnode*)n)->path);
+ free (n);
+ }
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+int64_t CC extnode_sort (const BSTNode * item, const BSTNode * n)
+{
+ const extnode * l;
+ const extnode * r;
+ int64_t ii;
+
+ l = (const extnode *)item;
+ r = (const extnode *)n;
+
+ if (l->offset < r->offset)
+ ii = -1;
+
+ else if (l->offset > r->offset)
+ ii = 1;
+
+ else
+ {
+ size_t lz;
+ size_t rz;
+ char lbuff [8192];
+ char rbuff [8192];
+ rc_t lrc;
+ rc_t rrc;
+
+ lrc = VPathReadPath (l->path, lbuff, sizeof (lbuff), &lz);
+ if (lrc)
+ {
+ LOGERR (klogInt, lrc, "failed to etract item path");
+ lz = 0;
+ }
+
+ rrc = VPathReadPath (r->path, rbuff, sizeof (rbuff), &rz);
+ if (lrc)
+ {
+ LOGERR (klogInt, rrc, "failed to etract node path");
+ rz = 0;
+ }
+
+ ii = string_cmp (lbuff, lz, rbuff, rz, lz + rz);
+ }
+ return ii;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+typedef struct rc_data
+{
+ rc_t rc;
+} rc_data;
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+bool CC extract_one (BSTNode * n, void * data_)
+{
+ extnode * node;
+ rc_data * data = data_;
+ rc_t rc;
+ size_t z;
+ char buff [8193];
+
+ assert (n);
+ assert (data);
+
+ node = (extnode*)n;
+
+ rc = VPathReadPath (node->path, buff, sizeof (buff) - 1, &z);
+ if (rc)
+ LOGERR (klogErr, rc, "error pulling path for an extraction");
+ else
+ {
+ const KFile * sfile;
+
+ buff[z] = '\0';
+
+/*
+ * use base unless we have to revert to root.
+ * base allows more control over options like password where the outside
+ * archive might have a different password than an inner file
+ */
+#if 1
+ rc = VFSManagerOpenFileReadDirectoryRelative (options.vfsmgr, options.base,
+ &sfile, node->path);
+#else
+ rc = VFSManagerOpenFileReadDirectoryRelative (options.vfsmgr, options.root,
+ &sfile, node->path);
+#endif
+ if (rc)
+ LOGERR (klogErr, rc, "error opening file within the archive");
+ else
+ {
+ KFile * dfile;
+
+/* KOutMsg ("%s: %s %x\n", __func__, node->path, options.cm); */
+ rc = KDirectoryCreateFile (options.dir, &dfile, false, 0640, options.cm, "%s", buff);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "failed to create file '$(P)'", "P=%s", buff));
+ else
+ {
+ const KFile * teefile;
+
+ rc = KFileMakeTeeRead (&teefile, sfile, dfile);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "failed pipefitting file '$(P)'", "P=%s", buff));
+ else
+ {
+ KFileAddRef (sfile);
+ KFileAddRef (dfile);
+ rc = KFileRelease (teefile);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "failed copying file '$(P)'", "P=%s", buff));
+ }
+ }
+ KFileRelease (sfile);
+ }
+ KFileRelease (sfile);
+ }
+ data->rc = rc;
+ return (rc != 0);
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t extract ()
+{
+ rc_data data;
+ bool failed;
+
+ /* done sequentially - this will cause back ups on reads if both
+ * containers and their contents are extracted
+ *
+ * we are also using a DoUntil approach that quits at the first failed
+ * extract
+ */
+ failed = BSTreeDoUntil (&options.pathtree, false, extract_one, &data);
+
+ if (failed)
+ LOGERR (klogErr, data.rc, "failure extracting a file");
+
+ return data.rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+#if 0
+static
+int CC sort_pathpath_cmp (const void ** litem, const void ** ritem, void * data)
+{
+ uint64_t lloc, rloc;
+
+ {
+ const VPath * lpath;
+ size_t z;
+ rc_t rc;
+ char pbuff [8192];
+
+ lpath = *litem;
+
+ rc = VPathReadPath (lpath, pbuff, sizeof pbuff, &z);
+ if (rc == 0)
+ {
+ switch (KDirectoryPathType (options.base, "%s", pbuff))
+ {
+ default:
+ lloc = 0;
+ break;
+ case kptFile:
+ rc = KDirectoryFileLocator (options.base, &lloc, "%s", pbuff);
+ break;
+ }
+ if (rc == 0)
+ {
+ const VPath * rpath;
+
+ rpath = *ritem;
+ rc = VPathReadPath (rpath, pbuff, sizeof pbuff, &z);
+ if (rc == 0)
+ {
+ switch (KDirectoryPathType (options.base, "%s", pbuff))
+ {
+ default:
+ rloc = 0;
+ break;
+ case kptFile:
+ rc = KDirectoryFileLocator (options.base, &rloc, "%s", pbuff);
+ break;
+ }
+ }
+ }
+ }
+ if (rc) /* surrender */
+ lloc = rloc = 0;
+ }
+
+ {
+ int cmp;
+
+ if (lloc < rloc)
+ cmp = -1;
+ else if (lloc > rloc)
+ cmp = 1;
+ else
+ {
+ assert (lloc == rloc);
+ cmp = 0;
+ };
+
+ return cmp;
+ }
+}
+#endif
+
+
+#if 0
+/* ----------------------------------------------------------------------
+ */
+static
+bool CC build_tree_add (void * _item, void * _data)
+{
+ build_tree_data * data = _data;
+ return false;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t build_tree ()
+{
+
+ rc_t rc;
+ rc_data data;
+ bool did_until = false;
+
+ BSTreeInit (&options.pathtree);
+
+ VectorDoUntil (options.pathpath, false, build_tree_add, &data);
+}
+#endif
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t insert_path (const VPath * vpath, uint64_t offset)
+{
+ extnode * node;
+ rc_t rc;
+
+ rc = extnode_make (&node, vpath, offset);
+ if (rc == 0)
+ {
+ rc = BSTreeInsert (&options.pathtree, &node->node, extnode_sort);
+ if (rc)
+ LOGERR (klogInt, rc, "error inserting tree node");
+ else
+ return 0;
+
+ extnode_whack (&node->node, NULL);
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t walk_path_file (char * path, size_t z, uint64_t * offset, KPathType kpt)
+{
+ uint64_t this_offset;
+ char * pc;
+ rc_t rc;
+
+ assert (path);
+ assert (offset);
+
+ this_offset = 0;
+ rc = 0;
+ if (kpt == kptFile)
+ {
+ rc = KDirectoryFileLocator (options.base, &this_offset, "%s", path);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failure walking path '$(P)'",
+ "P=%s", path));
+ }
+ if (rc == 0)
+ {
+ pc = string_rchr (path, z, '/');
+ if (pc)
+ {
+ uint64_t that_offset;
+ KPathType lkpt;
+
+ *pc = '\0';
+ lkpt = KDirectoryPathType (options.base, "%s", path);
+
+ switch (lkpt)
+ {
+ default:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ break;
+ case kptNotFound:
+ case kptZombieFile:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcNotFound);
+ break;
+
+ case kptBadPath:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ break;
+
+ case kptFile:
+ case kptDir:
+ /* we should always hit here */
+ rc = walk_path_file (path, z, &that_offset, lkpt);
+ if (rc == 0)
+ {
+ this_offset += that_offset;
+ }
+ break;
+
+ case kptCharDev:
+ case kptBlockDev:
+ case kptFIFO:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcIncorrect);
+ break;
+ }
+ *pc = '/';
+ }
+ }
+ *offset = this_offset;
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t walk_path_tree (char * path, size_t z)
+{
+ return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * signature is because this is called by VectorDoUntil
+ */
+static
+void CC handle_path (void * item_, void * data_)
+{
+ if ((item_ != NULL) && (data_ != NULL))
+ {
+ VPath * vpath = item_;
+ rc_data * data = data_;
+ size_t z;
+ rc_t rc;
+ char pbuff [8193];
+/* char tbuff [8193]; */
+
+ if (data->rc)
+ return;
+
+ /* -1 saves room for a guaranteed NUL */
+ rc = VPathReadPath (vpath, pbuff, sizeof (pbuff) - 1, &z);
+ if (rc)
+ LOGERR (klogErr, rc, "failed to pull path out of VPath");
+
+ else if (z)
+ {
+ KPathType kpt;
+
+ /* force a NUL just in case: we saved room for it */
+ pbuff[z] = '\0';
+
+ /* what type of path is this? */
+ kpt = KDirectoryPathType (options.base, "%s", pbuff);
+
+#if 0
+/* ain't doing this now, and may never because of the root versus base problems */
+ /* dereference links until we're done */
+ while (kpt & kptAlias)
+ {
+ rc = KDirectoryResolveAlias (options.base, true,
+ tbuff, sizeof tbuff, "%s", pbuff);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc, "error resolving path '$(P)'",
+ "P=%s", pbuff));
+ break;
+ }
+ else
+ {
+ memmove (tbuff, pbuff, sizeof pbuff);
+ z = string_size (pbuff);
+ kpt = KDirectoryPathType (options.root, "%s", pbuff);
+ }
+ }
+#endif
+ /* if we didn't crash this path dereferecing it. */
+ if (rc == 0)
+ {
+ if (kpt & kptAlias)
+ kpt = kptAlias;
+
+ switch (kpt)
+ {
+ default:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ PLOGERR (klogErr,
+ (klogErr, rc, "unknown problem with path '$(P)'",
+ "P=%s", pbuff));
+ break;
+ case kptNotFound:
+ PLOGERR (klogErr,
+ (klogErr, rc, "path is a not found in archive '$(P)'",
+ "P=%s", pbuff));
+ break;
+
+ case kptZombieFile:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcNotFound);
+ PLOGERR (klogErr,
+ (klogErr, rc, "path is a not in archive but should be '$(P)'",
+ "P=%s", pbuff));
+ break;
+
+ case kptBadPath:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ PLOGERR (klogErr,
+ (klogErr, rc, "unusable path form '$(P)'",
+ "P=%s", pbuff));
+ break;
+
+ case kptFile:
+ {
+ uint64_t offset = 0;
+ rc = walk_path_file (pbuff, z, &offset, kptFile);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "couldn't walk path '$(P)'",
+ "P=%s", pbuff));
+ else
+ {
+ rc = insert_path (vpath, offset);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "couldn't sort path '$(P)'",
+ "P=%s", pbuff));
+ }
+ break;
+ }
+ case kptDir:
+ rc = walk_path_tree (pbuff, z);
+ break;
+
+ case kptCharDev:
+ case kptBlockDev:
+ case kptFIFO:
+ case kptAlias:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcIncorrect);
+ PLOGERR (klogErr,
+ (klogErr, rc, "unusable path target type '$(P)'",
+ "P=%s", pbuff));
+ break;
+ }
+ }
+ }
+ data->rc = rc;
+ }
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t build_tree_then_run ()
+{
+ rc_data data;
+
+ data.rc = 0;
+
+ BSTreeInit (&options.pathtree);
+
+ VectorForEach (&options.pathvpath, false, handle_path, &data);
+
+ if (data.rc == 0)
+ data.rc = extract();
+
+ BSTreeWhack (&options.pathtree, extnode_whack, NULL);
+
+ return data.rc;
+}
+
+/* ----------------------------------------------------------------------
+ */
+static
+void CC build_vpath_one (void * item, void * data)
+{
+ const char * path;
+ rc_data * prc;
+
+ path = item;
+ prc = data;
+
+ if (prc->rc == 0)
+ {
+ static const char ccid [] = "copycat-id:";
+ const size_t cz = sizeof (ccid) - 1;
+ size_t pz;
+ const char * hier;
+ const char * ppath;
+ VPath * vpath;
+ rc_t rc;
+ char vbuff [8193];
+
+ rc = 0;
+ ppath = path;
+ pz = string_size (path);
+ hier = string_chr (path, pz, ':');
+
+ if ((hier != NULL) &&
+ (0 == string_cmp (path, (hier+1) - path, ccid, cz /*sizeof (ccid) - 1*/, cz)))
+ {
+ static const char nfile[] = "ncbi-file:";
+ char * qmark;
+ size_t s, r/*, q */;
+ char ibuff [8192];
+ char rbuff [8192];
+
+ ++hier;
+ s = hier - path;
+ r = string_copy (ibuff, sizeof (ibuff), hier, pz - s);
+
+ qmark = string_chr (ibuff, r, '?');
+ if (qmark == NULL) /* this is more future with parts */
+ qmark = string_chr (ibuff, r, '#');
+
+ if (qmark != NULL)
+ *qmark = '\0';
+
+ rc = KDirectoryResolveAlias (options.root, true, rbuff, sizeof (rbuff), "%s", ibuff);
+
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "error resolving file id '$(I)", "I=%s", ibuff));
+
+ else
+ {
+ char * slash;
+ size_t z;
+
+ slash = string_chr (rbuff+1, sizeof (rbuff), '/');
+ if (slash == NULL)
+ /* we won't extract the root */
+ return;
+
+ ++slash;
+
+ z = string_size (slash);
+ if (z == 0)
+ return;
+
+ if (qmark)
+ {
+ s = string_copy (vbuff, sizeof (vbuff), nfile, sizeof (nfile));
+ r = string_copy (vbuff + s, sizeof (vbuff) - s, slash, z);
+ /*q = */string_copy (vbuff + s + r, (sizeof (vbuff) - s) - r, qmark, pz - (qmark - path));
+ }
+ else
+ {
+ s = string_copy (vbuff, sizeof (vbuff), slash, z);
+ }
+ ppath = vbuff;
+ }
+ }
+
+ if (rc == 0)
+ {
+ rc = VFSManagerMakePath (options.vfsmgr, &vpath, "%s", ppath);
+ if (rc)
+ ;
+ else
+ {
+ rc = VectorAppend (&options.pathvpath, NULL, vpath);
+ if (rc)
+ {
+ VPathRelease (vpath);
+ }
+ }
+ }
+
+ prc->rc = rc;
+ }
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+void CC build_vpath_whack (void * item, void * data)
+{
+ VPath * p;
+
+ p = item;
+
+ VPathRelease ( p );
+}
+
+/* ----------------------------------------------------------------------
+ * pull paramstring 1-N and comnvert then to internal VPaths
+ */
+static
+rc_t build_vpath_then_run ()
+{
+ rc_data data;
+
+ data.rc = 0;
+
+ VectorInit (&options.pathvpath, 0, VectorLength (&options.pathstr));
+
+ VectorForEach (&options.pathstr, false, build_vpath_one, &data);
+
+ if (data.rc == 0)
+ build_tree_then_run();
+
+ VectorWhack (&options.pathvpath, build_vpath_whack, NULL);
+
+ return data.rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * SCHEME:PATH/FILE?QUERY
+ *
+ * form_one is just a file
+ * form_two is just a path and a file (can ignore scheme until more schemes supported)
+ * form_three is all parts except path present which for here acts like form_one
+ * form_four is all four parts
+ *
+ * path is the directory path leading to root
+ * root will be the directory containing the archive
+ * base will be the archive as a directory
+ */
+static
+rc_t open_root_then_run ()
+{
+ static const char dot[] = ".";
+ char rootstr [8192];
+ char basestr [8192];
+ const char * colon;
+ rc_t rc;
+
+ colon = strchr (options.arcstr, ':');
+ if (colon == NULL) /* no scheme so it has to be a plain path */
+ {
+ char * last_slash;
+
+ strcpy (basestr, options.arcstr);
+ last_slash = strrchr (basestr, '/');
+
+ if (last_slash == NULL) /* in this directory */
+ {
+ options.rootstr = dot;
+ options.basestr = options.arcstr;
+ /* done */
+ }
+ else
+ {
+ *last_slash = '\0';
+ options.rootstr = basestr;
+ options.basestr = last_slash + 1;
+ /* done */
+ }
+ }
+ else
+ {
+ char * end_of_root;
+ char * last_slash;
+
+ strcpy (rootstr, colon+1);
+
+ end_of_root = strchr (rootstr, '?');
+
+ if (end_of_root == NULL)
+ end_of_root = strchr (rootstr, '#');
+
+ if (end_of_root)
+ *end_of_root = '\0';
+
+ options.rootstr = rootstr;
+
+ last_slash = strchr (rootstr, '/');
+ if (last_slash == NULL)
+ {
+ /* no path */
+ options.rootstr = dot;
+ options.basestr = options.arcstr;
+ /* done */
+ }
+ else
+ {
+ size_t x,z;
+
+ *last_slash = '\0';
+ options.rootstr = rootstr;
+
+ /* scheme */
+ z = string_size (rootstr);
+
+ x = string_copy (basestr, sizeof (basestr), options.arcstr, (colon + 1) - options.arcstr);
+ strcpy (basestr + x, options.arcstr + x + z + 1);
+ options.basestr = basestr;
+ /* done */
+ }
+ }
+ {
+ KDirectory * cwd;
+
+ rc = VFSManagerGetCWD (options.vfsmgr, &cwd);
+ if (rc)
+ ;
+ else
+ {
+ rc = KDirectoryOpenXTocDirRead (cwd, &options.root, true,
+ options.xml, "%s", options.rootstr);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc,
+ "failed to open XFS from '$(P)' using '$(P)'",
+ "P=%s", options.basestr, options.xmlstr));
+ else
+ {
+ rc = VFSManagerMakePath (options.vfsmgr, &options.basepath, "%s", options.basestr);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc,
+ "failed to make vpath from '$(P)'",
+ "P=%s", options.basestr));
+ else
+ {
+ rc = VFSManagerOpenDirectoryRead (options.vfsmgr,
+ &options.base,
+ options.basepath);
+ if (rc == 0)
+ {
+ rc = build_vpath_then_run ();
+
+ KDirectoryRelease (options.base);
+ }
+ KDirectoryRelease (options.root);
+ }
+ VPathRelease (options.basepath);
+ }
+ KDirectoryRelease (cwd);
+ }
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t open_xml_then_run()
+{
+ rc_t rc;
+
+ rc = VFSManagerMakePath (options.vfsmgr, &options.xmlpath, "%s", options.xmlstr);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "failed to create path for '$(P)'",
+ "P=%s", options.xmlstr));
+ else
+ {
+ rc = VFSManagerOpenFileRead (options.vfsmgr, &options.xml, options.xmlpath);
+ if (rc)
+ LOGERR (klogErr, rc, "Failed to open output directoryCopycat XML file");
+ else
+ {
+ rc = open_root_then_run ();
+ }
+ VPathRelease (options.xmlpath);
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t open_dir_then_run()
+{
+ rc_t rc;
+
+ rc = VFSManagerMakePath (options.vfsmgr, &options.dirpath, "%s", options.dirstr);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "failed to create path for '$(P)'",
+ "P=%s", options.dirstr));
+ else
+ {
+ rc = VFSManagerOpenDirectoryUpdate (options.vfsmgr, &options.dir, options.dirpath);
+ if (rc)
+ LOGERR (klogErr, rc, "Failed to open output directory");
+ else
+ {
+ rc = open_xml_then_run();
+ KDirectoryRelease (options.dir);
+ }
+ VPathRelease (options.dirpath);
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ */
+static
+rc_t open_mgr_then_run()
+{
+ rc_t rc;
+
+ rc = VFSManagerMake (&options.vfsmgr);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to create VFS manager");
+ else
+ {
+ rc = open_dir_then_run ();
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------
+ * KMain
+ *
+ * Figure out what is on the command line
+ */
+rc_t KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc == 0)
+ {
+ /* use do {} while; for easy outs */
+ do
+ {
+ const char * pc;
+ uint32_t pcount;
+
+ rc = ArgsProgram (args, &full_path, &program_name);
+ if (rc)
+ {
+ PLOGERR (klogFatal,
+ (klogFatal, rc, "failed to set name to $'(N)'",
+ "N=%s", program_name));
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to check force option");
+ break;
+ }
+ if (pcount)
+ {
+ options.force = true;
+ options.cm = kcmParents | kcmInit;
+ }
+ else
+ {
+ options.force = true;
+ options.cm = kcmParents | kcmCreate;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_XML, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to check XML option");
+ break;
+ }
+ if (pcount)
+ {
+ rc = ArgsOptionValue (args, OPTION_XML, 0, (const void **)&options.xmlstr);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to get XML value");
+ break;
+ }
+ }
+ else
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcNull);
+ LOGERR (klogFatal, rc, "missing required copycat-xml option");
+ MiniUsage(args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_DIR, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to check directory option");
+ break;
+ }
+ if (pcount)
+ {
+ rc = ArgsOptionValue (args, OPTION_DIR, 0, (const void **)&options.dirstr);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to get directory value");
+ break;
+ }
+ }
+ else
+ {
+ options.dirstr = ".";
+ }
+
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "failed to count parameters");
+ break;
+ }
+ if (pcount == 0)
+ {
+ rc = RC ( rcExe, rcArgv, rcReading, rcParam, rcInsufficient );
+ LOGERR (klogFatal, rc, "Missing archive parameter");
+ MiniUsage (args);
+ break;
+ }
+
+ {
+ uint32_t block;
+
+ block = 1;
+ if (pcount > 2)
+ block = pcount - 1;
+
+ VectorInit (&options.pathstr, 0, block);
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&options.arcstr);
+ if (rc)
+ LOGERR (klogFatal, rc, "failed to retrieve archive parameter");
+ else
+ {
+ if (pcount == 1)
+ {
+ rc = VectorAppend (&options.pathstr, NULL, ".");
+ if (rc)
+ LOGERR (klogFatal, rc, "failed to set default path parameter");
+ }
+ else
+ {
+ uint32_t ix;
+
+ for (ix = 1; ix < pcount; ++ix)
+ {
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ {
+ PLOGERR (klogFatal,
+ (klogFatal, rc, "unable to extract path parameter '$(K)",
+ "K=%u", ix));
+ break;
+ }
+ rc = VectorAppend (&options.pathstr, NULL, pc);
+ if (rc)
+ {
+ PLOGERR (klogFatal,
+ (klogFatal, rc, "failed to add path '$(P)' to list",
+ "P=%s", pc));
+ break;
+ }
+ }
+ }
+ }
+ if (rc == 0)
+ open_mgr_then_run();
+
+ VectorWhack (&options.pathstr, NULL, NULL);
+
+ } while (0);
+ ArgsWhack (args);
+ }
+ return rc;
+}
diff --git a/tools/cg-load/.gitignore b/tools/cg-load/.gitignore
new file mode 100644
index 0000000..718f861
--- /dev/null
+++ b/tools/cg-load/.gitignore
@@ -0,0 +1,2 @@
+*.vers.h
+*.sh
diff --git a/tools/cg-load/Makefile b/tools/cg-load/Makefile
new file mode 100644
index 0000000..a564fee
--- /dev/null
+++ b/tools/cg-load/Makefile
@@ -0,0 +1,97 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/cg-load
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ cg-load
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# cg-load
+#
+CGLOAD_SRC = \
+ cg-load \
+ factory-evidence-intervals \
+ factory-evidence-dnbs \
+ factory-mappings \
+ factory-reads \
+ factory-tag-lfr \
+ f1_3 \
+ f1_5 \
+ f1_7 \
+ f2_0 \
+ f2_2 \
+ f2_4 \
+ f2_5 \
+ file \
+ file-version-factory \
+ formats \
+ writer-algn \
+ writer-evidence-dnbs \
+ writer-evidence-intervals \
+ writer-seq \
+
+CGLOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(CGLOAD_SRC))
+
+CGLOAD_LIB = \
+ -lkapp \
+ -stk-version \
+ -lload \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/cg-load: $(CGLOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(CGLOAD_LIB)
+
diff --git a/tools/cg-load/cg-load.c b/tools/cg-load/cg-load.c
new file mode 100644
index 0000000..357de1c
--- /dev/null
+++ b/tools/cg-load/cg-load.c
@@ -0,0 +1,1270 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "debug.h" /* DEBUG_MSG */
+#include "file.h" /* FGroupMAP_LoadReads */
+#include "formats.h" /* get_cg_reads_ngaps */
+
+#include <kapp/log-xml.h> /* XMLLogger */
+#include <kapp/loader-meta.h> /* KLoaderMeta_Write */
+#include <kapp/main.h> /* KAppVersion */
+
+#include <kdb/manager.h> /* kptDatabase */
+#include <kdb/meta.h> /* KMetadata */
+
+#include <kfs/arc.h> /* KDirectoryOpenArcDirRead */
+#include <kfs/tar.h> /* KArcParseTAR */
+
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h> /* string_printf */
+#include <klib/status.h> /* STSMSG */
+
+#include <vdb/schema.h> /* VDBManagerMakeSchema */
+
+#include <sysalloc.h> /* malloc */
+
+#include <assert.h>
+#include <errno.h>
+
+typedef struct SParam_struct
+{
+ const char* argv0;
+
+ KDirectory* input_dir;
+ const KDirectory *map_dir;
+ const KDirectory *asm_dir;
+ KDirectory* output_dir;
+
+ const char* map_path;
+ const char* asm_path;
+ const char* schema;
+ const char* refseqcfg;
+ const char* refseqpath;
+ const char* library;
+ char const** refFiles; /* NULL-terminated array pointing to argv */
+ /* mostly for debugging */
+ uint32_t refseq_chunk;
+ const char* out;
+ uint32_t force;
+ uint32_t force_refw;
+ uint32_t force_readw;
+ uint32_t no_read_ahead;
+ const char* qual_quant;
+ uint32_t no_spot_group;
+ uint32_t min_mapq;
+ uint32_t single_mate;
+ uint32_t cluster_size;
+ uint32_t load_other_evidence;
+
+ uint32_t read_len;
+} SParam;
+
+typedef struct DB_Handle_struct {
+ VDBManager* mgr;
+ VSchema* schema;
+ VDatabase* db;
+ const ReferenceMgr* rmgr;
+ const CGWriterSeq* wseq;
+ TReadsData* reads;
+ const CGWriterAlgn* walgn;
+ TMappingsData* mappings;
+ const CGWriterEvdInt* wev_int;
+ TEvidenceIntervalsData* ev_int;
+ const CGWriterEvdDnbs* wev_dnb;
+ TEvidenceDnbsData* ev_dnb;
+} DB_Handle;
+
+static
+rc_t DB_Init(const SParam* p, DB_Handle* h)
+{
+ rc_t rc;
+
+ if( (rc = VDBManagerMakeUpdate(&h->mgr, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to create VDB Manager");
+
+ }
+ else if( (rc = VDBManagerMakeSchema(h->mgr, &h->schema)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to create schema");
+
+ }
+ else if( (rc = VSchemaParseFile(h->schema, "%s", p->schema)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to parse schema file '$(schema)'", PLOG_S(schema), p->schema));
+
+ }
+ else if( (rc = VDBManagerCreateDB(h->mgr, &h->db, h->schema, "NCBI:align:db:alignment_evidence",
+ p->force ? kcmInit : kcmCreate, p->out)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to create database at '$(path)'", PLOG_S(path), p->out));
+
+ }
+ else if( (rc = ReferenceMgr_Make(&h->rmgr, h->db, h->mgr, (p->force_refw ? ewrefmgr_co_allREADs : 0),
+ p->refseqcfg, p->refseqpath, p->refseq_chunk, 350 * 1024 * 1024, 0)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to create reference manager");
+
+ }
+ else if( (rc = CGWriterAlgn_Make(&h->walgn, &h->mappings, h->db, h->rmgr, p->min_mapq, p->single_mate, p->cluster_size)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to create alignment writer");
+
+ }
+ else if ((rc = CGWriterSeq_Make(&h->wseq, &h->reads, h->db,
+ (p->force_readw ? ewseq_co_SaveRead : 0) |
+ (p->no_spot_group ? 0 : ewseq_co_SpotGroup), p->qual_quant,
+ p->read_len))
+ != 0)
+ {
+ LOGERR(klogErr, rc, "failed to create sequence writer");
+
+ } else if( p->asm_path && (rc = CGWriterEvdInt_Make(&h->wev_int, &h->ev_int, h->db, h->rmgr, 0)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to create evidence intervals writer");
+ }
+ else if (p->asm_path
+ && (rc = CGWriterEvdDnbs_Make
+ (&h->wev_dnb, &h->ev_dnb, h->db, h->rmgr, 0, p->read_len)) != 0)
+ {
+ LOGERR(klogErr, rc, "failed to create evidence dnbs writer");
+ }
+ else {
+ const char** r = p->refFiles;
+ while( rc == 0 && *r != NULL ) {
+ if( (rc = ReferenceMgr_FastaPath(h->rmgr, *r++)) != 0 ) {
+ PLOGERR(klogInfo, (klogInfo, rc, "fasta file '$(file)'", "file=%s", r[-1]));
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t DB_Fini(const SParam* p, DB_Handle* h, bool drop)
+{
+ rc_t rc = 0, rc2;
+
+ /* THIS FUNCTION MAKES NO ATTEMPT TO PRESERVE INITIAL ERROR CODES
+ EACH SUCCESSIVE ERROR OVERWRITES THE PREVIOUS CODE */
+ if( h != NULL ) {
+ PLOGMSG(klogInfo, (klogInfo, "DB_Fini was called with drop=$(drop)",
+ "drop=%s", drop ? "true" : "false"));
+
+ PLOGMSG(klogInfo, (klogInfo, "Fini SEQUENCE", "severity=status"));
+ if( (rc2 = CGWriterSeq_Whack(h->wseq, !drop, NULL)) != 0) {
+ LOGERR(klogErr, rc2, "Failed SEQUENCE release");
+ if (!drop) {
+ drop = true;
+ rc = rc2;
+ }
+ }
+ h->wseq = NULL;
+ h->reads = NULL;
+ PLOGMSG(klogInfo, (klogInfo, "Fini (PRI&SEC)_ALIGNMENT", "severity=status"));
+ if( (rc2 = CGWriterAlgn_Whack(h->walgn, !drop, NULL, NULL)) != 0) {
+ LOGERR(klogErr, rc2, "Failed (PRI&SEC)_ALIGNMENT release");
+ if (!drop) {
+ drop = true;
+ rc = rc2;
+ }
+ }
+ h->walgn = NULL;
+ h->mappings = NULL;
+ PLOGMSG(klogInfo, (klogInfo, "Fini EVIDENCE_INTERVAL", "severity=status"));
+ if( (rc2 = CGWriterEvdInt_Whack(h->wev_int, !drop, NULL)) != 0) {
+ LOGERR(klogErr, rc2, "Failed EVIDENCE_INTERVAL release");
+ if (!drop) {
+ drop = true;
+ rc = rc2;
+ }
+ }
+ h->wev_int = NULL;
+ h->ev_int = NULL;
+ PLOGMSG(klogInfo, (klogInfo, "Fini EVIDENCE_ALIGNMENT", "severity=status"));
+ if( (rc2 = CGWriterEvdDnbs_Whack(h->wev_dnb, !drop, NULL)) != 0) {
+ LOGERR(klogErr, rc2, "Failed EVIDENCE_ALIGNMENT release");
+ if (!drop) {
+ drop = true;
+ rc = rc2;
+ }
+ }
+ h->wev_dnb = NULL;
+ h->ev_dnb = NULL;
+ PLOGMSG(klogInfo, (klogInfo, "Fini calculating reference coverage", "severity=status"));
+ if( (rc2 = ReferenceMgr_Release
+ (h->rmgr, !drop, NULL, drop ? false : true, Quitting)) != 0)
+ {
+ LOGERR(klogErr, rc2, "Failed calculating reference coverage");
+ if (!drop) {
+ drop = true;
+ rc = rc2;
+ }
+ }
+ h->rmgr = NULL;
+ if( rc == 0 )
+ {
+ KMetadata* meta;
+ if( (rc = VDatabaseOpenMetadataUpdate(h->db, &meta)) == 0 ) {
+ KMDataNode *node;
+ if( (rc = KMetadataOpenNodeUpdate(meta, &node, "/")) == 0 ) {
+ if( (rc = KLoaderMeta_Write(node, p->argv0, __DATE__, "Complete Genomics", KAppVersion())) != 0 ) {
+ LOGERR(klogErr, rc, "Cannot update loader meta");
+ }
+ KMDataNodeRelease(node);
+ }
+ KMetadataRelease(meta);
+ }
+ }
+ PLOGERR(klogInfo, (klogInfo, rc, "Fini VDatabaseRelease", "severity=status"));
+ VDatabaseRelease(h->db);
+ h->db = NULL;
+ VSchemaRelease(h->schema);
+ h->schema = NULL;
+ if( drop || rc != 0 ) {
+ rc2 = VDBManagerDrop(h->mgr, kptDatabase, "%s", p->out);
+ /*if( GetRCState(rc2) == rcNotFound ) {
+ // WHAT WOULD BE THE POINT OF RESETTING "rc" TO ZERO?
+ rc = 0;
+ } else*/ if( rc2 != 0 ) {
+ if ( rc == 0 )
+ rc = rc2;
+ PLOGERR(klogErr, (klogErr, rc2, "cannot drop db at '$(path)'", PLOG_S(path), p->out));
+ }
+ }
+ VDBManagerRelease(h->mgr);
+ h->mgr = NULL;
+ }
+ return rc;
+}
+
+typedef struct FGroupKey_struct {
+ CG_EFileType type;
+ const CGFIELD_ASSEMBLY_ID_TYPE* assembly_id;
+ union {
+ struct {
+ const CGFIELD_SLIDE_TYPE* slide;
+ const CGFIELD_LANE_TYPE* lane;
+ const CGFIELD_BATCH_FILE_NUMBER_TYPE* batch_file_number;
+ } map;
+ struct {
+ const CGFIELD_SAMPLE_TYPE* sample;
+ const CGFIELD_CHROMOSOME_TYPE* chromosome;
+ } asmb;
+ } u;
+} FGroupKey;
+
+static
+rc_t CC FGroupKey_Make(FGroupKey* key,
+ const CGLoaderFile* file, const SParam* param)
+{
+ rc_t rc = 0;
+ CG_EFileType ftype;
+
+ if( (rc = CGLoaderFile_GetType(file, &ftype)) == 0 ) {
+ switch(ftype) {
+ case cg_eFileType_READS:
+ case cg_eFileType_MAPPINGS:
+ case cg_eFileType_TAG_LFR:
+ key->type = cg_eFileType_READS;
+ if ((rc = CGLoaderFile_GetAssemblyId(file, &key->assembly_id)) == 0 &&
+ (rc = CGLoaderFile_GetSlide(file, &key->u.map.slide)) == 0 &&
+ (rc = CGLoaderFile_GetLane(file, &key->u.map.lane)) == 0)
+ {
+ rc = CGLoaderFile_GetBatchFileNumber(file,
+ &key->u.map.batch_file_number);
+ }
+ break;
+ case cg_eFileType_EVIDENCE_INTERVALS:
+ case cg_eFileType_EVIDENCE_DNBS:
+ if( param->asm_path != NULL ) {
+ /* do not pick up ASM files if not requested */
+ key->type = cg_eFileType_EVIDENCE_INTERVALS;
+ if( (rc = CGLoaderFile_GetAssemblyId(file, &key->assembly_id)) == 0 &&
+ (rc = CGLoaderFile_GetSample(file, &key->u.asmb.sample)) == 0 ) {
+ rc = CGLoaderFile_GetChromosome(file, &key->u.asmb.chromosome);
+ }
+ break;
+ }
+ default:
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcIgnored);
+ break;
+ }
+ }
+ return rc;
+}
+static
+rc_t CC FGroupKey_Validate(const FGroupKey* key)
+{
+ rc_t rc = 0;
+ DEBUG_MSG(5, ("KEY: "));
+ switch( key->type ) {
+ case cg_eFileType_READS:
+ DEBUG_MSG(5, ("%s:%s:%s:%04u", key->assembly_id, key->u.map.slide, key->u.map.lane, key->u.map.batch_file_number));
+ if( !key->assembly_id || !key->u.map.slide || !key->u.map.lane || !key->u.map.batch_file_number ) {
+ rc = RC(rcExe, rcQueue, rcValidating, rcId, rcIncomplete);
+ }
+ break;
+ case cg_eFileType_EVIDENCE_INTERVALS:
+ DEBUG_MSG(5, ("%s:%s:%s", key->assembly_id, key->u.asmb.sample, key->u.asmb.chromosome));
+ if( !key->assembly_id || !key->u.asmb.sample || !key->u.asmb.chromosome ) {
+ rc = RC(rcExe, rcQueue, rcValidating, rcId, rcIncomplete);
+ }
+ break;
+ default:
+ DEBUG_MSG(5, ("CORRUPT!!"));
+ rc = RC(rcExe, rcQueue, rcValidating, rcId, rcWrongType);
+ break;
+ }
+ return rc;
+}
+
+typedef struct FGroupMAP_struct {
+ BSTNode dad;
+ FGroupKey key;
+ const CGLoaderFile* seq;
+ const CGLoaderFile* align;
+ const CGLoaderFile* tagLfr;
+} FGroupMAP;
+
+static
+void FGroupMAP_CloseFiles(FGroupMAP *g)
+{
+ CGLoaderFile_Close(g->seq);
+ CGLoaderFile_Close(g->align);
+ CGLoaderFile_Close(g->tagLfr);
+}
+
+static void CC FGroupMAP_Whack(BSTNode *node, void *data) {
+ FGroupMAP* n = (FGroupMAP*)node;
+
+ CGLoaderFile_Release(n->seq , false);
+ CGLoaderFile_Release(n->align , false);
+ CGLoaderFile_Release(n->tagLfr, false);
+
+ free(node);
+}
+
+static
+int64_t CC FGroupMAP_Cmp( const void *item, const BSTNode *node )
+{
+ const FGroupKey* i = (const FGroupKey*)item;
+ const FGroupMAP* n = (const FGroupMAP*)node;
+
+ int64_t r = strcmp(i->assembly_id, n->key.assembly_id);
+ if( r == 0 ) {
+ if( i->type == n->key.type ) {
+ switch( i->type ) {
+ case cg_eFileType_READS:
+ if( (r = strcmp(i->u.map.slide, n->key.u.map.slide)) == 0 ) {
+ if( (r = strcmp(i->u.map.lane, n->key.u.map.lane)) == 0 ) {
+ r = (int64_t)(*(i->u.map.batch_file_number)) - (int64_t)(*(n->key.u.map.batch_file_number));
+ }
+ }
+ break;
+ case cg_eFileType_EVIDENCE_INTERVALS:
+ if( (r = strcmp(i->u.asmb.sample, n->key.u.asmb.sample)) == 0 ) {
+ r = strcmp(i->u.asmb.chromosome, n->key.u.asmb.chromosome);
+ }
+ break;
+ default:
+ r = -1;
+ break;
+ }
+ } else {
+ r = -1;
+ }
+ }
+ return r;
+}
+
+static
+int64_t CC FGroupMAP_Sort( const BSTNode *item, const BSTNode *n )
+{
+ return FGroupMAP_Cmp(&((const FGroupMAP*)item)->key, n);
+}
+
+typedef struct FGroupMAP_FindData_struct {
+ FGroupKey key;
+ int64_t rowid;
+} FGroupMAP_FindData;
+
+static
+bool CC FGroupMAP_FindRowId( BSTNode *node, void *data )
+{
+ FGroupMAP_FindData* d = (FGroupMAP_FindData*)data;
+ const FGroupMAP* n = (const FGroupMAP*)node;
+
+ if( FGroupMAP_Cmp(&d->key, node) == 0 ) {
+ if( CGLoaderFile_GetStartRow(n->seq, &d->rowid) == 0 ) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static
+rc_t CC FGroupMAP_Set(FGroupMAP* g, const CGLoaderFile* file)
+{
+ rc_t rc = 0;
+ CG_EFileType ftype;
+
+ if( (rc = CGLoaderFile_GetType(file, &ftype)) == 0 ) {
+ if( g->key.type == cg_eFileType_READS ) {
+ if( ftype == cg_eFileType_READS ) {
+ if( g->seq == NULL ) {
+ g->seq = file;
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcDuplicate);
+ }
+ } else if( ftype == cg_eFileType_MAPPINGS ) {
+ if( g->align == NULL ) {
+ g->align = file;
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcDuplicate);
+ }
+ }
+ else if (ftype == cg_eFileType_TAG_LFR) {
+ if (g->tagLfr == NULL) {
+ g->tagLfr = file;
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcDuplicate);
+ }
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcWrongType);
+ }
+ } else if( g->key.type == cg_eFileType_EVIDENCE_INTERVALS ) {
+ if( ftype == cg_eFileType_EVIDENCE_INTERVALS ) {
+ if( g->seq != NULL ) {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcDuplicate);
+ } else {
+ g->seq = file;
+ }
+ } else if( ftype == cg_eFileType_EVIDENCE_DNBS ) {
+ if( g->align == NULL ) {
+ g->align = file;
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcDuplicate);
+ }
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcItem, rcWrongType);
+ }
+ } else {
+ rc = RC(rcExe, rcQueue, rcInserting, rcType, rcUnexpected);
+ }
+ }
+ return rc;
+}
+
+static
+void CC FGroupMAP_Validate( BSTNode *n, void *data )
+{
+ const FGroupMAP* g = (const FGroupMAP*)n;
+ rc_t rc = 0, *rc_out = (rc_t*)data;
+ const char* rnm = NULL, *mnm = NULL;
+
+ rc = FGroupKey_Validate(&g->key);
+ if( g->seq != NULL ) {
+ CGLoaderFile_Filename(g->seq, &rnm);
+ rnm = rnm ? strrchr(rnm, '/') : rnm;
+ DEBUG_MSG(5, (" READS(%s)", rnm));
+ }
+ if( g->align ) {
+ CGLoaderFile_Filename(g->align, &mnm);
+ mnm = mnm ? strrchr(mnm, '/') : mnm;
+ DEBUG_MSG(5, (" MAPPINGS(%s)", mnm));
+ }
+ if (g->tagLfr != NULL) {
+ CGLoaderFile_Filename(g->tagLfr, &mnm);
+ mnm = mnm ? strrchr(mnm, '/') : mnm;
+ DEBUG_MSG(5, (" TAG_LFR(%s)", mnm));
+ }
+ DEBUG_MSG(5, ("\n"));
+ if( rc == 0 && g->seq == NULL ) {
+ rc = RC(rcExe, rcQueue, rcValidating, rcItem, rcIncomplete);
+ }
+
+ /* THIS USED TO WIPE OUT THE "rc" ON EACH ENTRY */
+ if( rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc, "file pair $(f1)[mandatory], $(f2)[optional]", PLOG_2(PLOG_S(f1),PLOG_S(f2)), rnm, mnm));
+ if ( * rc_out == 0 )
+ *rc_out = rc;
+#if 0
+ } else {
+ *rc_out = RC(0, 0, 0, 0, 0);
+#endif
+ }
+}
+
+typedef struct DirVisit_Data_Struct {
+ const SParam* param;
+ BSTree* tree;
+ const KDirectory* dir;
+ uint32_t format_version;
+} DirVisit_Data;
+
+/* you cannot addref to this dir object cause it's created on stack silently */
+static
+rc_t CC DirVisitor(const KDirectory *dir, uint32_t type, const char *name, void *data)
+{
+ rc_t rc = 0;
+ DirVisit_Data* d = (DirVisit_Data*)data;
+
+ assert(d);
+
+ if( (type & ~kptAlias) == kptFile ) {
+ if (strcmp(&name[strlen(name) - 4], ".tsv") == 0 ||
+ strcmp(&name[strlen(name) - 8], ".tsv.bz2") == 0 ||
+ strcmp(&name[strlen(name) - 7], ".tsv.gz") == 0)
+ {
+ char buf[4096] = "";
+ const CGLoaderFile* file = NULL;
+ FGroupKey key;
+ if( (rc = KDirectoryResolvePath(dir, true, buf, sizeof(buf), "%s", name)) == 0 &&
+ (rc = CGLoaderFile_Make(&file, d->dir, buf, NULL, !d->param->no_read_ahead)) == 0 &&
+ (rc = FGroupKey_Make(&key, file, d->param)) == 0 )
+ {
+ FGroupMAP* found = (FGroupMAP*)BSTreeFind(d->tree, &key, FGroupMAP_Cmp);
+
+ assert(file && file->cg_file);
+ if (file->cg_file->type == cg_eFileType_READS ||
+ file->cg_file->type == cg_eFileType_MAPPINGS)
+ {
+ if (d->format_version == 0) {
+ d->format_version = file->cg_file->format_version;
+ }
+ else if (d->format_version != file->cg_file->format_version)
+ {
+ rc = RC(rcExe, rcFile, rcInserting,
+ rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "READS or MAPPINGS "
+ "format_version mismatch: $(o) vs. $(n)",
+ "o=%d,n=%d",
+ d->format_version, file->cg_file->format_version));
+ }
+ }
+
+ if (rc == 0) {
+ if (d->param != NULL && ! d->param->load_other_evidence &&
+ strstr(buf, "/EVIDENCE") != NULL &&
+ strstr(buf, "/EVIDENCE/") == NULL)
+ {
+ DEBUG_MSG(5, ("file %s recognized as %s: ignored\n",
+ name, buf));
+ rc = CGLoaderFile_Release(file, true);
+ file = NULL;
+ }
+ else {
+ DEBUG_MSG(5, ("file %s recognized as %s\n", name, buf));
+ if (found != NULL) {
+ rc = FGroupMAP_Set(found, file);
+ }
+ else {
+ FGroupMAP* x = calloc(1, sizeof(*x));
+ if (x == NULL) {
+ rc = RC(rcExe,
+ rcFile, rcInserting, rcMemory, rcExhausted);
+ }
+ else {
+ memmove(&x->key, &key, sizeof(key));
+ if ((rc = FGroupMAP_Set(x, file)) == 0) {
+ rc = BSTreeInsertUnique(d->tree,
+ &x->dad, NULL, FGroupMAP_Sort);
+ }
+ }
+ }
+ }
+ }
+ } else if( GetRCObject(rc) == rcItem && GetRCState(rc) == rcIgnored ) {
+ DEBUG_MSG(5, ("file %s ignored\n", name));
+ rc = CGLoaderFile_Release(file, true);
+ file = NULL;
+ }
+ if( rc != 0 && file != NULL ) {
+ CGLoaderFile_LOG(file, klogErr, rc, NULL, NULL);
+ CGLoaderFile_Release(file, true);
+ }
+ } else if( strcmp(&name[strlen(name) - 4], ".tar") == 0 ) {
+ const KDirectory* tmp = d->dir;
+ if( (rc = KDirectoryOpenArcDirRead(dir, &d->dir, true, name, tocKFile, KArcParseTAR, NULL, NULL)) == 0 ) {
+ rc = KDirectoryVisit(d->dir, true, DirVisitor, d, ".");
+ KDirectoryRelease(d->dir);
+ }
+ d->dir = tmp;
+ }
+ }
+ return rc;
+}
+
+typedef struct FGroupMAP_LoadData_struct {
+ rc_t rc;
+ const SParam* param;
+ DB_Handle db;
+ const BSTree* reads;
+} FGroupMAP_LoadData;
+
+typedef enum {
+ eCtxRead,
+ eCtxLfr,
+ eCtxMapping
+} TCtx;
+static bool _FGroupMAPDone(FGroupMAP *self, TCtx ctx, FGroupMAP_LoadData* d) {
+ /* (rcData rcDone) is always set on reads file EOF */
+ bool eofLfr = true;
+ bool eofMapping = true;
+ assert(self && d);
+ if (d->rc == 0 ||
+ GetRCState(d->rc) != rcDone || GetRCObject(d->rc) != (enum RCObject)rcData)
+ {
+ return false;
+ }
+ d->rc = 0;
+ if (d->rc == 0 && self->tagLfr != NULL) {
+ d->rc = CGLoaderFile_IsEof(self->tagLfr, &eofLfr);
+ }
+ if (d->rc == 0 && self->align != NULL) {
+ d->rc = CGLoaderFile_IsEof(self->align, &eofMapping);
+ }
+ if (d->rc == 0) {
+ switch (ctx) {
+ case eCtxRead:
+ if (!eofLfr) {
+ /* not EOF */
+ d->rc = RC(rcExe, rcFile, rcReading, rcData, rcUnexpected);
+ CGLoaderFile_LOG(self->align, klogErr, d->rc,
+ "extra tag LFRs, possible that corresponding "
+ "reads file is truncated", NULL);
+ }
+ else if (!eofMapping) {
+ /* not EOF */
+ d->rc = RC(rcExe, rcFile, rcReading, rcData, rcUnexpected);
+ CGLoaderFile_LOG(self->align, klogErr, d->rc,
+ "extra mappings, possible that corresponding "
+ "reads file is truncated", NULL);
+ }
+ break;
+ case eCtxLfr:
+ case eCtxMapping:
+ d->rc = RC(rcExe, rcFile, rcReading, rcCondition, rcInvalid);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ }
+ if (d->rc == 0) {
+ /* mappings and lfr file EOF detected ok */
+ DEBUG_MSG(5, (" done\n", FGroupKey_Validate(&self->key)));
+ }
+ return true;
+}
+
+bool CC FGroupMAP_LoadReads( BSTNode *node, void *data )
+{
+ TCtx ctx = eCtxRead;
+ FGroupMAP* n = (FGroupMAP*)node;
+ FGroupMAP_LoadData* d = (FGroupMAP_LoadData*)data;
+
+ bool done = false;
+
+ DEBUG_MSG(5, (" started\n", FGroupKey_Validate(&n->key)));
+ while (!done && d->rc == 0) {
+ ctx = eCtxRead;
+ d->rc = CGLoaderFile_GetRead(n->seq, d->db.reads);
+ if (d->rc == 0 && n->tagLfr != NULL) {
+ ctx = eCtxLfr;
+ d->rc = CGLoaderFile_GetTagLfr(n->tagLfr, d->db.reads);
+ }
+ if (d->rc == 0) {
+ if ((d->db.reads->flags
+ & (cg_eLeftHalfDnbNoMatches | cg_eLeftHalfDnbMapOverflow))
+ &&
+ (d->db.reads->flags
+ & (cg_eRightHalfDnbNoMatches | cg_eRightHalfDnbMapOverflow)))
+ {
+ d->db.mappings->map_qty = 0;
+ } else {
+ ctx = eCtxMapping;
+ d->rc = CGLoaderFile_GetMapping(n->align, d->db.mappings);
+ }
+/* alignment written 1st than sequence -> primary_alignment_id must be set!! */
+ if (d->rc == 0 &&
+ (d->rc = CGWriterAlgn_Write(d->db.walgn, d->db.reads)) == 0)
+ {
+ d->rc = CGWriterSeq_Write(d->db.wseq);
+ }
+ }
+ done = _FGroupMAPDone(n, ctx, d);
+ d->rc = d->rc ? d->rc : Quitting();
+ }
+ if( d->rc != 0 ) {
+ CGLoaderFile_LOG(n->seq, klogErr, d->rc, NULL, NULL);
+ CGLoaderFile_LOG(n->align, klogErr, d->rc, NULL, NULL);
+ }
+
+ FGroupMAP_CloseFiles(n);
+ return d->rc != 0;
+}
+
+bool CC FGroupMAP_LoadEvidence( BSTNode *node, void *data )
+{
+ FGroupMAP* n = (FGroupMAP*)node;
+ FGroupMAP_LoadData* d = (FGroupMAP_LoadData*)data;
+
+ DEBUG_MSG(5, ("' started\n", FGroupKey_Validate(&n->key)));
+ while( d->rc == 0 ) {
+ if( (d->rc = CGLoaderFile_GetEvidenceIntervals(n->seq, d->db.ev_int)) == 0 ) {
+ int64_t evint_rowid;
+ if( n->align != NULL ) {
+ d->rc = CGLoaderFile_GetEvidenceDnbs(n->align, d->db.ev_int->interval_id, d->db.ev_dnb);
+ } else {
+ d->db.ev_dnb->qty = 0; /***weird, but the easiest place to fix ***/
+ }
+ /* interval written 1st than dnbs which uses interval as reference */
+ if( d->rc == 0 ) {
+ d->rc = CGWriterEvdInt_Write(d->db.wev_int, d->db.ev_dnb, &evint_rowid);
+ }
+ if( d->rc == 0 && n->align != NULL ) {
+ /* attach dnbs to reads */
+ uint16_t i;
+ FGroupMAP_FindData found;
+
+ found.key.type = cg_eFileType_READS;
+ d->rc = CGLoaderFile_GetAssemblyId(n->align, &found.key.assembly_id);
+ for(i = 0; d->rc == 0 && i < d->db.ev_dnb->qty; i++) {
+ found.key.u.map.slide = d->db.ev_dnb->dnbs[i].slide;
+ found.key.u.map.lane = d->db.ev_dnb->dnbs[i].lane;
+ found.key.u.map.batch_file_number = &d->db.ev_dnb->dnbs[i].file_num_in_lane;
+ if( BSTreeDoUntil(d->reads, false, FGroupMAP_FindRowId, &found) ) {
+ d->rc = CGWriterEvdDnbs_SetSEQ(d->db.wev_dnb, i, found.rowid);
+ } else {
+ d->rc = RC(rcExe, rcFile, rcWriting, rcData, rcInconsistent);
+ }
+ }
+ }
+ if( d->rc == 0 && n->align != NULL ) {
+ d->rc = CGWriterEvdDnbs_Write(d->db.wev_dnb, d->db.ev_int, evint_rowid);
+ }
+ }
+ if( GetRCState(d->rc) == rcDone && GetRCObject(d->rc) == (enum RCObject)rcData ) {
+ bool eof = false;
+ d->rc = 0;
+ if( n->align == NULL || ((d->rc = CGLoaderFile_IsEof(n->align, &eof)) == 0 && eof) ) {
+ /* dnbs file EOF detected ok */
+ DEBUG_MSG(5, ("' done\n", FGroupKey_Validate(&n->key)));
+ break;
+ } else if( d->rc == 0 ) {
+ /* not EOF */
+ d->rc = RC(rcExe, rcFile, rcReading, rcData, rcUnexpected);
+ CGLoaderFile_LOG(n->align, klogErr, d->rc,
+ "extra dnbs, possible that corresponding intervals file is truncated", NULL);
+ }
+ }
+ d->rc = d->rc ? d->rc : Quitting();
+ }
+ if( d->rc != 0 ) {
+ CGLoaderFile_LOG(n->seq, klogErr, d->rc, NULL, NULL);
+ CGLoaderFile_LOG(n->align, klogErr, d->rc, NULL, NULL);
+ }
+ FGroupMAP_CloseFiles(n);
+ return d->rc != 0;
+}
+
+
+static const char * lib_dst = "extra/library";
+
+static rc_t copy_library( const KDirectory * src_dir, KDirectory * dst_dir,
+ const char * in_path, const char * out_path )
+{
+ rc_t rc;
+ size_t l = string_size( out_path ) + string_size( lib_dst ) + 2;
+ char * dst = malloc( l );
+ if ( dst == NULL )
+ rc = RC( rcExe, rcFile, rcCopying, rcMemory, rcExhausted );
+ else
+ {
+ size_t written;
+ rc = string_printf( dst, l, &written, "%s/%s", out_path, lib_dst );
+ if ( rc == 0 )
+ rc = KDirectoryCopy( src_dir, dst_dir, true, in_path, dst );
+ free( dst );
+ }
+ return rc;
+}
+
+
+static rc_t open_dir_or_tar( const KDirectory *dir, const KDirectory **sub, const char * name )
+{
+ rc_t rc1, rc2;
+ rc1 = KDirectoryOpenDirRead( dir, sub, true, "%s", name );
+ if ( rc1 != 0 )
+ {
+ rc2 = KDirectoryOpenTarArchiveRead( dir, sub, true, "%s", name );
+ if ( rc2 == 0 )
+ rc1 = rc2;
+ }
+ return rc1;
+}
+
+static rc_t Load( SParam* param )
+{
+ rc_t rc = 0, rc1 = 0;
+ BSTree slides, evidence;
+
+
+ param->map_dir = NULL;
+ param->asm_dir = NULL;
+ param->output_dir = ( KDirectory * )param->input_dir;
+ BSTreeInit( &slides );
+ BSTreeInit( &evidence );
+
+ rc = open_dir_or_tar( param->input_dir, ¶m->map_dir, param->map_path );
+ if ( rc == 0 )
+ {
+ DirVisit_Data dv;
+
+ dv.param = param;
+ dv.tree = &slides;
+ dv.dir = param->map_dir;
+ dv.format_version = 0;
+ rc = KDirectoryVisit( param->map_dir, true, DirVisitor, &dv, NULL );
+ if ( rc == 0 )
+ {
+ if ( param->asm_path != NULL )
+ {
+ rc_t rc2 = open_dir_or_tar( param->input_dir, ¶m->asm_dir, param->asm_path );
+ if ( rc2 == 0 )
+ {
+ dv.tree = &evidence;
+ dv.dir = param->asm_dir;
+ rc = KDirectoryVisit( param->asm_dir, true, DirVisitor, &dv, NULL );
+ }
+ }
+
+ if (rc == 0) {
+ param->read_len = get_cg_read_len(dv.format_version);
+ }
+
+ if ( rc == 0 )
+ {
+ /* SHOULD HAVE A BSTreeEmpty FUNCTION OR SOMETHING...
+ MAKE ONE HERE - WITH KNOWLEDGE THAT TREE IS NOT NULL: */
+#ifndef BSTreeEmpty
+#define BSTreeEmpty( bst ) \
+ ( ( bst ) -> root == NULL )
+#endif
+ if ( BSTreeEmpty ( & slides ) && BSTreeEmpty ( & evidence ) )
+ rc = RC( rcExe, rcFile, rcReading, rcData, rcInsufficient );
+ else
+ {
+ /* CORRECTED SETTING OF "rc" IN "FGroupMAP_Validate" */
+ assert ( rc == 0 );
+ BSTreeForEach( &slides, false, FGroupMAP_Validate, &rc );
+ BSTreeForEach( &evidence, false, FGroupMAP_Validate, &rc );
+ }
+
+ if ( rc == 0 )
+ {
+ FGroupMAP_LoadData data;
+
+ PLOGMSG( klogInfo, ( klogInfo, "file set validation complete", "severity=status" ) );
+ memset( &data, 0, sizeof( data ) );
+ data.rc = 0;
+ data.param = param;
+ data.reads = &slides;
+ rc = DB_Init( param, &data.db );
+ if ( rc == 0 )
+ {
+ BSTreeDoUntil( &slides, false, FGroupMAP_LoadReads, &data );
+ rc = data.rc;
+ if ( rc == 0 )
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "MAP loaded", "severity=status" ) );
+ BSTreeDoUntil( &evidence, false, FGroupMAP_LoadEvidence, &data );
+ rc = data.rc;
+ if ( rc == 0 )
+ PLOGMSG( klogInfo, ( klogInfo, "ASM loaded", "severity=status" ) );
+ }
+ }
+ rc1 = DB_Fini( param, &data.db, rc != 0 );
+ if ( rc == 0 )
+ rc = rc1;
+ }
+ }
+ }
+
+ /* copy the extra library ( file or recursive directory ) */
+ if ( rc == 0 && param->library != NULL )
+ {
+ const KDirectory *lib_src;
+ rc = open_dir_or_tar( param->input_dir, &lib_src, param->library );
+ if ( rc == 0 )
+ {
+ rc = copy_library( param->input_dir, param->output_dir,
+ param->library, param->out );
+ if ( rc == 0 )
+ STSMSG( 0, ( "extra lib copied" ) );
+ else
+ LOGERR( klogErr, rc, "failed to copy extra library" );
+ KDirectoryRelease( lib_src );
+ }
+/*
+ else
+ {
+ rc = copy_library( param->input_dir, param->output_dir,
+ ".", param->out );
+ if ( rc == 0 )
+ STSMSG( 0, ( "extra lib copied" ) );
+ else
+ LOGERR( klogErr, rc, "failed to copy extra library" );
+ }
+*/
+ }
+ KDirectoryRelease( param->map_dir );
+ KDirectoryRelease( param->asm_dir );
+ }
+ BSTreeWhack( &slides, FGroupMAP_Whack, NULL );
+ BSTreeWhack( &evidence, FGroupMAP_Whack, NULL );
+ return rc;
+}
+
+const char* map_usage[] = {"MAP input directory path containing files", NULL};
+const char* asm_usage[] = {"ASM input directory path containing files", NULL};
+const char* load_extra_evidence_usage[]
+ = { "load extra evidence files", NULL};
+const char* schema_usage[] = {"database schema file name", NULL};
+const char* output_usage[] = {"output database path", NULL};
+const char* force_usage[] = {"force output overwrite", NULL};
+const char* refseqcfg_usage[] = {"path to a file with reference-to-accession list", NULL};
+const char* refseqpath_usage[] = {"path to a directory with reference sequences in fasta", NULL};
+const char* refseqchunk_usage[] = {NULL, "hidden param to override REFERENCE table seq chunk size for testing", NULL};
+const char* reffile_usage[] = {"path to fasta file with references", NULL};
+const char* forceref_usage[] = {"force reference sequence write", NULL};
+const char* forceread_usage[] = {"force reads write", NULL};
+const char* qualquant_usage[] = {"quality scores quantization level, can be a number (0: none, 1: 2bit, 2: 1bit), or a string like '1:10,10:20,20:30,30:-' (which is equivalent to 1)", NULL};
+const char* nospotgroup_usage[] = {"do not write source file key to SPOT_GROUP column", NULL};
+const char* min_mapq_usage[] = {"filter secondary mappings by minimum weight (phred)", NULL};
+const char* no_secondary_usage[] = {"preserve only one mapping per half-DNB based on weight", NULL};
+const char* single_mate_usage[] = {"if secondary mates have duplicates preserve only one in each pair based on weight", NULL};
+const char* cluster_size_usage[] = {"defines cluster window on the reference, records only 1 placement from given cluster size; default is zero which means ignore", NULL};
+const char* no_read_ahead_usage[] = {"disable input files threaded caching", NULL};
+const char* library_usage[] = {"copy extra file/directory into output", NULL};
+
+/* this enum must have same order as MainArgs array below */
+enum OptDefIndex {
+ eopt_MapInput = 0,
+ eopt_AsmInput,
+ eopt_LoadExtraEvidence,
+ eopt_Schema,
+ eopt_RefSeqConfig,
+ eopt_RefSeqPath,
+ eopt_RefSeqChunk,
+ eopt_RefFile,
+ eopt_Output,
+ eopt_Force,
+ eopt_ForceRef,
+ eopt_ForceRead,
+ eopt_QualQuantization,
+ eopt_NoSpotGroup,
+ eopt_MinMapQ,
+ eopt_No2nd_ary,
+ eopt_SingleMate,
+ eopt_ClusterSize,
+ eopt_noReadAhead,
+ eopt_Library
+};
+
+OptDef MainArgs[] =
+{
+ /* if you change order in this array, rearrange enum above accordingly! */
+ { "map", "m", NULL, map_usage, 1, true, true },
+ { "asm", "a", NULL, asm_usage, 1, true, false },
+ { "load-extra-evidence", NULL, NULL,
+ load_extra_evidence_usage, 1, false, false },
+ { "schema", "s", NULL, schema_usage, 1, true, false },
+ { "refseq-config", "k", NULL, refseqcfg_usage, 1, true, false },
+ { "refseq-path", "i", NULL, refseqpath_usage, 1, true, false },
+ { "refseq-chunk", "C", NULL, refseqchunk_usage, 1, true, false },
+ { "ref-file", "r", NULL, reffile_usage, 1, true, false },
+ { "output", "o", NULL, output_usage, 1, true, true },
+ { "force", "f", NULL, force_usage, 1, false, false },
+ { "write-reference", "g", NULL, forceref_usage, 1, false, false },
+ { "write-read", "w", NULL, forceread_usage, 1, false, false },
+ { "qual-quant", "Q", NULL, qualquant_usage, 1, true, false },
+ { "no-spotgroup", "G", NULL, nospotgroup_usage, 1, false, false },
+ { "min-mapq", "q", NULL, min_mapq_usage, 1, true, false },
+ { "no-secondary", "P", NULL, no_secondary_usage, 1, false, false },
+ { "single-mate", NULL, NULL, single_mate_usage, 1, false, false },
+ { "cluster-size", NULL, NULL, cluster_size_usage, 1, true, false },
+ { "input-no-threads", "t", NULL, no_read_ahead_usage, 1, false, false },
+ { "library", "l", NULL, library_usage, 1, true, false }
+};
+const size_t MainArgsQty = sizeof(MainArgs) / sizeof(MainArgs[0]);
+
+rc_t UsageSummary (char const * progname)
+{
+ OUTMSG((
+ "Usage:\n"
+ "\t%s [options] -m map-dir -o path-to-run\n"
+ "\n"
+ "Summary:\n"
+ "\tLoad a Complete Genomics formatted data files\n"
+ "\n"
+ "Example:\n"
+ "\t%s -m build36/MAP -o /tmp/SRZ123456\n"
+ "\n"
+ ,progname, progname));
+ return 0;
+}
+
+char const UsageDefaultName[] = "cg-load";
+
+rc_t CC Usage( const Args* args )
+{
+ rc_t rc;
+ int i;
+ const char* progname = UsageDefaultName;
+ const char* fullname = UsageDefaultName;
+
+ rc = ArgsProgram(args, &fullname, &progname);
+
+ UsageSummary(progname);
+
+ for(i = 0; i < MainArgsQty; i++ ) {
+ if( MainArgs[i].required && MainArgs[i].help[0] != NULL ) {
+ HelpOptionLine(MainArgs[i].aliases, MainArgs[i].name, NULL, MainArgs[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < MainArgsQty; i++ ) {
+ if( !MainArgs[i].required && MainArgs[i].help[0] != NULL ) {
+ HelpOptionLine(MainArgs[i].aliases, MainArgs[i].name, NULL, MainArgs[i].help);
+ }
+ }
+ XMLLogger_Usage();
+ OUTMSG(("\n"));
+ HelpOptionsStandard();
+ HelpVersion(fullname, KAppVersion());
+ return rc;
+}
+
+rc_t CC KMain( int argc, char* argv[] )
+{
+ rc_t rc = 0;
+ Args* args = NULL;
+ const char* errmsg = NULL, *refseq_chunk = NULL, *min_mapq = NULL, *cluster_size = NULL;
+ const XMLLogger* xml_logger = NULL;
+ SParam params;
+ memset(¶ms, 0, sizeof(params));
+ params.schema = "align/align.vschema";
+
+ params.argv0 = argv[0];
+
+ if( (rc = ArgsMakeAndHandle(&args, argc, argv, 2, MainArgs, MainArgsQty, XMLLogger_Args, XMLLogger_ArgsQty)) == 0 ) {
+ uint32_t count;
+ if( (rc = ArgsParamCount (args, &count)) != 0 || count != 0 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ ArgsParamValue(args, 0, (const void **)&errmsg);
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Output].name, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = MainArgs[eopt_Output].name;
+ } else if( (rc = ArgsOptionValue(args, MainArgs[eopt_Output].name, 0, (const void **)¶ms.out)) != 0 ) {
+ errmsg = MainArgs[eopt_Output].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_MapInput].name, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = MainArgs[eopt_MapInput].name;
+ } else if( (rc = ArgsOptionValue(args, MainArgs[eopt_MapInput].name, 0, (const void **)¶ms.map_path)) != 0 ) {
+ errmsg = MainArgs[eopt_MapInput].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Schema].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = MainArgs[eopt_Schema].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_Schema].name, 0, (const void **)¶ms.schema)) != 0 ) {
+ errmsg = MainArgs[eopt_Schema].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_AsmInput].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_AsmInput].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_AsmInput].name, 0, (const void **)¶ms.asm_path)) != 0 ) {
+ errmsg = MainArgs[eopt_AsmInput].name;
+
+ }
+ else if ((rc = ArgsOptionCount(args,
+ MainArgs[eopt_LoadExtraEvidence].name,
+ ¶ms.load_other_evidence)) != 0 )
+ {
+ errmsg = MainArgs[eopt_LoadExtraEvidence].name;
+
+ }
+ else if( (rc = ArgsOptionCount(args, MainArgs[eopt_RefSeqConfig].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_RefSeqConfig].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_RefSeqConfig].name, 0, (const void **)¶ms.refseqcfg)) != 0 ) {
+ errmsg = MainArgs[eopt_RefSeqConfig].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_RefSeqPath].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_RefSeqPath].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_RefSeqPath].name, 0, (const void **)¶ms.refseqpath)) != 0 ) {
+ errmsg = MainArgs[eopt_RefSeqPath].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Library].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_Library].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_Library].name, 0, (const void **)¶ms.library)) != 0 ) {
+ errmsg = MainArgs[eopt_Library].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_RefSeqChunk].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_RefSeqChunk].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_RefSeqChunk].name, 0, (const void **)&refseq_chunk)) != 0 ) {
+ errmsg = MainArgs[eopt_RefSeqChunk].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Force].name, ¶ms.force)) != 0 ) {
+ errmsg = MainArgs[eopt_Force].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_ForceRef].name, ¶ms.force_refw)) != 0 ) {
+ errmsg = MainArgs[eopt_ForceRef].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_ForceRead].name, ¶ms.force_readw)) != 0 ) {
+ errmsg = MainArgs[eopt_ForceRead].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_noReadAhead].name, ¶ms.no_read_ahead)) != 0 ) {
+ errmsg = MainArgs[eopt_noReadAhead].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_NoSpotGroup].name, ¶ms.no_spot_group)) != 0 ) {
+ errmsg = MainArgs[eopt_NoSpotGroup].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_No2nd_ary].name, ¶ms.min_mapq)) != 0 ) {
+ errmsg = MainArgs[eopt_No2nd_ary].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_QualQuantization].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_QualQuantization].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_QualQuantization].name, 0, (const void **)¶ms.qual_quant)) != 0 ) {
+ errmsg = MainArgs[eopt_QualQuantization].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_MinMapQ].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_MinMapQ].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_MinMapQ].name, 0, (const void **)&min_mapq)) != 0 ) {
+ errmsg = MainArgs[eopt_MinMapQ].name;
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_ClusterSize].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_ClusterSize].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_ClusterSize].name, 0, (const void **)&cluster_size)) != 0 ) {
+ errmsg = MainArgs[eopt_ClusterSize].name;
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_SingleMate].name, ¶ms.single_mate)) != 0 ) {
+ errmsg = MainArgs[eopt_SingleMate].name;
+
+ } else {
+ do {
+ long val = 0;
+ char* end = NULL;
+ uint32_t count;
+
+ if( (rc = ArgsOptionCount(args, MainArgs[eopt_RefFile].name, &count)) != 0 ) {
+ break;
+ } else {
+ params.refFiles = calloc(count + 1, sizeof(*(params.refFiles)));
+ if( params.refFiles == NULL ) {
+ rc = RC(rcApp, rcArgv, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ while(rc == 0 && count-- > 0) {
+ rc = ArgsOptionValue(args, MainArgs[eopt_RefFile].name, count, (const void **)¶ms.refFiles[count]);
+ }
+ }
+
+ if( refseq_chunk != NULL ) {
+ errno = 0;
+ val = strtol(refseq_chunk, &end, 10);
+ if( errno != 0 || refseq_chunk == end || *end != '\0' || val < 0 || val > UINT32_MAX ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ break;
+ }
+ params.refseq_chunk = val;
+ }
+ if( params.min_mapq > 0 ) {
+ params.min_mapq = ~0;
+ } else if( min_mapq != NULL ) {
+ errno = 0;
+ val = strtol(min_mapq, &end, 10);
+ if( errno != 0 || min_mapq == end || *end != '\0' || val < 0 || val > 255 ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ break;
+ }
+ params.min_mapq = val;
+ }
+
+ if ( cluster_size )
+ params.cluster_size = atoi( cluster_size );
+ else
+ params.cluster_size = 0;
+
+ rc = KDirectoryNativeDir( ¶ms.input_dir );
+ if ( rc != 0 )
+ errmsg = "current directory";
+ else
+ {
+ rc = XMLLogger_Make( &xml_logger, params.input_dir, args );
+ if ( rc != 0 )
+ errmsg = "XML logging";
+ else
+ rc = Load( ¶ms );
+ }
+ } while( false );
+ KDirectoryRelease( params.input_dir );
+
+ free(params.refFiles);
+ params.refFiles = NULL;
+ }
+ }
+ /* find accession as last part of path for internal XML logging */
+ refseq_chunk = params.out ? strrchr(params.out, '/') : "/???";
+ if( refseq_chunk ++ == NULL )
+ refseq_chunk = params.out;
+
+ if( argc < 2 )
+ MiniUsage(args);
+ else if( rc != 0 )
+ {
+ if( errmsg )
+ {
+ MiniUsage(args);
+ LOGERR(klogErr, rc, errmsg);
+ }
+ else
+ {
+ PLOGERR(klogErr, (klogErr, rc, "load failed: $(accession)",
+ "severity=total,status=failure,accession=%s", refseq_chunk));
+ }
+ }
+ else
+ {
+ PLOGMSG(klogInfo, (klogInfo, "loaded",
+ "severity=total,status=success,accession=%s", refseq_chunk));
+ }
+ ArgsWhack(args);
+ XMLLogger_Release(xml_logger);
+ return rc;
+}
diff --git a/tools/cg-load/debug.h b/tools/cg-load/debug.h
new file mode 100644
index 0000000..2d732c4
--- /dev/null
+++ b/tools/cg-load/debug.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_debug_h_
+#define _tools_cg_load_debug_h_
+
+#include <klib/debug.h>
+
+#define DEBUG_MSG_PASTE(a,b) a##b
+#define DEBUG_MSG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(DEBUG_MSG_PASTE(DBG_APP_,flag)), msg)
+
+#endif /* _tools_cg_load_debug_h_ */
diff --git a/tools/cg-load/defs.h b/tools/cg-load/defs.h
new file mode 100644
index 0000000..d470e96
--- /dev/null
+++ b/tools/cg-load/defs.h
@@ -0,0 +1,163 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_defs_h_
+#define _tools_cg_load_defs_h_
+
+
+#include <stdint.h> /* uint64_t */
+
+
+#define CG_FORMAT_2_5 0x02050000
+
+
+/* buffers and sizes */
+
+/*
+#define CG_CHROMOSOME_NAME (8) make if fit NC_003977 */
+#define CG_CHROMOSOME_NAME (10)
+
+#define CG_SLIDE (32)
+#define CG_LANE (8)
+
+#define CG_READS_NREADS (2)
+
+#define CG_READS15_SPOT_LEN 70
+#define CG_READS25_SPOT_LEN 60
+
+#define CG_READS15_NGAPS 3
+#define CG_READS25_NGAPS 2
+
+#define CG_MAPPINGS_MAX (2048)
+#define CG_EVDNC_PLOIDY (3)
+#define CG_EVDNC_INTERVALID_LEN (32)
+#define CG_EVDNC_SPOT_LEN (10 * 1024)
+#define CG_TAG_LFR_DATA_LEN (10)
+
+/* CG_EVDNC_ALLELE_NUM is 3 in v.1.5; 4 in v.2 */
+#define CG_EVDNC_ALLELE_NUM (4)
+
+#define CG_EVDNC_ALLELE_LEN (10 * 1024)
+#define CG_EVDNC_ALLELE_CIGAR_LEN (10 * 1024)
+
+typedef char CGFIELD_LIBRARY_TYPE;
+typedef char CGFIELD_SAMPLE_TYPE;
+typedef char CGFIELD_SLIDE_TYPE;
+typedef char CGFIELD_LANE_TYPE;
+typedef char CGFIELD_CHROMOSOME_TYPE;
+typedef char CGFIELD_ASSEMBLY_ID_TYPE;
+typedef char CGFIELD_SOFTWARE_VERSION_TYPE;
+typedef char CGFIELD_DBSNP_BUILD_TYPE;
+typedef char CGFIELD_COSMIC_TYPE;
+typedef char CGFIELD_PFAM_DATE_TYPE;
+typedef char CGFIELD_MIRBASE_VERSION_TYPE;
+typedef char CGFIELD_DGV_VERSION_TYPE;
+typedef char CGFIELD_GENERATED_AT_TYPE;
+typedef char CGFIELD_GENERATED_BY_TYPE;
+typedef char CGFIELD_GENE_ANNOTATIONS_TYPE;
+typedef char CGFIELD_GENOME_REFERENCE_TYPE;
+typedef uint32_t CGFIELD_BATCH_FILE_NUMBER_TYPE;
+typedef uint64_t CGFIELD_BATCH_OFFSET_TYPE;
+typedef uint32_t CGFIELD_FIELD_SIZE_TYPE;
+typedef uint32_t CGFIELD_MAX_PLOIDY_TYPE;
+typedef uint16_t CGFIELD_WINDOW_SHIFT_TYPE;
+typedef uint16_t CGFIELD_WINDOW_WIDTH_TYPE;
+typedef uint16_t CGFIELD_NUMBER_LEVELS_TYPE;
+typedef uint16_t CGFIELD_MEAN_LEVEL_X_TYPE;
+typedef uint16_t CGFIELD_WELL_ID;
+
+/******************************************************************************/
+
+typedef enum CG_EFileType_enum {
+ cg_eFileType_Unknown = 0,
+ cg_eFileType_READS = 1,
+ cg_eFileType_MAPPINGS,
+ cg_eFileType_LIB_DNB,
+ cg_eFileType_LIB_MATE_GAPS,
+ cg_eFileType_LIB_SEQDEP_GAPS,
+ cg_eFileType_REFMETRICS,
+ cg_eFileType_IDENTIFIER_MAPPING,
+ cg_eFileType_DBSNP_TO_CGI,
+ cg_eFileType_GENE_ANNOTATION,
+ cg_eFileType_SUMMARY_REPORT,
+ cg_eFileType_VAR_ANNOTATION,
+ cg_eFileType_GENE_VAR_SUMMARY_REPORT,
+ cg_eFileType_EVIDENCE_CORRELATION,
+ cg_eFileType_EVIDENCE_DNBS,
+ cg_eFileType_EVIDENCE_INTERVALS,
+ cg_eFileType_COVERAGE_DISTRIBUTION,
+ cg_eFileType_COVERAGE_BY_GC,
+ cg_eFileType_DEPTH_OF_COVERAGE,
+ cg_eFileType_INDEL_LENGTH_CODING,
+ cg_eFileType_INDEL_LENGTH,
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING,
+ cg_eFileType_SUBSTITUTION_LENGTH,
+ cg_eFileType_CNV_SEGMENTS,
+ cg_eFileType_TUMOR_CNV_SEGMENTS,
+ cg_eFileType_CNV_DETAILS_SCORES,
+ cg_eFileType_TUMOR_DETAILS_SCORES,
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_SEGMENTS,
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_DETAILS,
+ cg_eFileType_JUNCTIONS,
+ cg_eFileType_JUNCTION_DNBS,
+ cg_eFileType_SV_EVENTS,
+ cg_eFileType_VAR_OLPL,
+ cg_eFileType_MEI,
+ cg_eFileType_TUMOR_CNV_DETAILS,
+ cg_eFileType_DIPLOID_SOMATIC_CNV_SEGMENTS,
+ cg_eFileType_COVERAGE_DISTRIBUTION_CODING,
+ cg_eFileType_COVERAGE_BY_GC_CODING,
+ cg_eFileType_LIB_SMALL_GAPS_ROLLUP,
+ cg_eFileType_DIPLOID_SOMATIC_CNV_DETAIL_SCORES,
+
+ cg_eFileType_TAG_LFR,
+ cg_eFileType_Last
+} CG_EFileType;
+
+typedef enum {
+ cg_eLibraryType_Unknown,
+ cg_eLibraryType_PureLFR,
+ cg_eLibraryType_MixedLFR,
+ cg_eLibraryType_MixedSTD,
+ cg_eLibraryType_Standard,
+} CG_ELibraryType;
+
+typedef enum CG_EMappingsFlags_enum {
+ cg_eLastDNBRecord = 0x01,
+ cg_eLeftHalfDnbMap = 0x00,
+ cg_eRightHalfDnbMap = 0x02,
+ cg_eFwdDnbStrand = 0x00,
+ cg_eRevDnbStrand = 0x04
+} CG_EMappingsFlags;
+
+typedef enum CG_EReadsFlags_enum {
+ cg_eLeftHalfDnbNoMatches = 0x01,
+ cg_eLeftHalfDnbMapOverflow = 0x02,
+ cg_eRightHalfDnbNoMatches = 0x04,
+ cg_eRightHalfDnbMapOverflow = 0x08
+} CG_EReadsFlags;
+
+
+#endif /* _tools_cg_load_defs_h_ */
diff --git a/tools/cg-load/f1_3.c b/tools/cg-load/f1_3.c
new file mode 100644
index 0000000..3b0d400
--- /dev/null
+++ b/tools/cg-load/f1_3.c
@@ -0,0 +1,77 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-reads.h"
+#include "factory-mappings.h"
+#include "factory-evidence-intervals.h"
+#include "factory-evidence-dnbs.h"
+
+#include "file.h"
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS", cg_eFileType_READS, CGReads13_Make },
+ { "MAPPINGS", cg_eFileType_MAPPINGS, CGMappings13_Make },
+ { "LIB-DNB", cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS", cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS", cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS", cg_eFileType_REFMETRICS, NULL },
+ { "DBSNP-TO-CGI", cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION", cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT", cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION", cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION", cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs13_Make },
+ { "EVIDENCE-INTERVALS",
+ cg_eFileType_EVIDENCE_INTERVALS, CGEvidenceIntervals13_Make },
+ { "COVERAGE-DISTRIBUTION", cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+ { "COVERAGE-BY-GC", cg_eFileType_COVERAGE_BY_GC, NULL },
+ { "DEPTH-OF-COVERAGE", cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING", cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH", cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING",
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH", cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV_DETAIL_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL }, /*VDB-1404*/
+ { "TUMOR_DETAILS_SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "JUNCTIONS", cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS", cg_eFileType_JUNCTION_DNBS, NULL },
+ /* undocumented */
+ { "VAR-OLPL", cg_eFileType_VAR_OLPL, NULL }
+
+};
+
+rc_t CGFile13_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/f1_5.c b/tools/cg-load/f1_5.c
new file mode 100644
index 0000000..3a0dab8
--- /dev/null
+++ b/tools/cg-load/f1_5.c
@@ -0,0 +1,78 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-evidence-dnbs.h"
+#include "factory-evidence-intervals.h"
+#include "factory-mappings.h"
+#include "factory-reads.h"
+#include "factory-tag-lfr.h"
+
+#include "file.h"
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS", cg_eFileType_READS, CGReads15_Make },
+ { "MAPPINGS", cg_eFileType_MAPPINGS, CGMappings15_Make },
+ { "LIB-DNB", cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS", cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS", cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS", cg_eFileType_REFMETRICS, NULL },
+ { "DBSNP-TO-CGI", cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION", cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT", cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION", cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION", cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs15_Make },
+ { "EVIDENCE-INTERVALS",
+ cg_eFileType_EVIDENCE_INTERVALS, CGEvidenceIntervals15_Make },
+ { "COVERAGE-DISTRIBUTION", cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+ { "COVERAGE-BY-GC", cg_eFileType_COVERAGE_BY_GC, NULL },
+ { "DEPTH-OF-COVERAGE", cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING", cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH", cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING",
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH", cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "TUMOR_DETAILS_SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "JUNCTIONS", cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS", cg_eFileType_JUNCTION_DNBS, NULL },
+ /* undocumented */
+ { "VAR-OLPL", cg_eFileType_VAR_OLPL, NULL },
+
+ { "TAG_LFR", cg_eFileType_TAG_LFR, CGTagLfr15_Make },
+};
+
+rc_t CGFile15_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/f1_7.c b/tools/cg-load/f1_7.c
new file mode 100644
index 0000000..1970d79
--- /dev/null
+++ b/tools/cg-load/f1_7.c
@@ -0,0 +1,97 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+
+#include "factory-reads.h" /* CGReads15_Make */
+#include "factory-mappings.h" /* CGMappings15_Make */
+#include "factory-evidence-intervals.h" /* CGEvidenceIntervals15_Make */
+#include "factory-evidence-dnbs.h" /* CGEvidenceDnbs15_Make */
+#include "factory-tag-lfr.h" /* CGTagLfr15_Make */
+
+
+#include "file.h" /* CGFileType */
+
+
+/* File format v1.7
+ Software v1.12
+#FORMAT_VERSION 1.7 */
+
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS", cg_eFileType_READS, CGReads15_Make },
+ { "MAPPINGS", cg_eFileType_MAPPINGS, CGMappings15_Make },
+ { "LIB-DNB", cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS", cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS", cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS", cg_eFileType_REFMETRICS, NULL },
+ { "DBSNP-TO-CGI", cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION", cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT", cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION", cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION", cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs15_Make },
+ { "EVIDENCE-INTERVALS",
+ cg_eFileType_EVIDENCE_INTERVALS, CGEvidenceIntervals15_Make },
+ { "DEPTH-OF-COVERAGE", cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING", cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH", cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING",
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH", cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "TUMOR_DETAILS_SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "JUNCTIONS", cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS", cg_eFileType_JUNCTION_DNBS, NULL },
+ { "VAR-OLPL" , cg_eFileType_VAR_OLPL, NULL },
+ { "MEI" , cg_eFileType_MEI , NULL },
+
+ { "COVERAGE-BY-GC" , cg_eFileType_COVERAGE_BY_GC , NULL },
+ { "COVERAGE-DISTRIBUTION", cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+
+ /* semi-documented:
+ mentioned in "Data File Formats.File format v1.7.Software v1.12 */
+ { "COVERAGE-BY-GC-CODING", cg_eFileType_COVERAGE_BY_GC , NULL },
+ { "COVERAGE-DISTRIBUTION-CODING",
+ cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+
+ /* undocumented */
+ { "VAR-OLPL", cg_eFileType_VAR_OLPL, NULL },
+
+ { "TAG_LFR", cg_eFileType_TAG_LFR, CGTagLfr15_Make },
+};
+
+
+rc_t CGFile17_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/f2_0.c b/tools/cg-load/f2_0.c
new file mode 100644
index 0000000..ca5b938
--- /dev/null
+++ b/tools/cg-load/f2_0.c
@@ -0,0 +1,98 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-evidence-dnbs.h"
+#include "factory-evidence-intervals.h"
+#include "factory-mappings.h"
+#include "factory-reads.h"
+#include "factory-tag-lfr.h"
+
+#include "file.h"
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS", cg_eFileType_READS, CGReads20_Make },
+ { "MAPPINGS", cg_eFileType_MAPPINGS, CGMappings20_Make },
+ { "LIB-DNB", cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS", cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS", cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS", cg_eFileType_REFMETRICS, NULL },
+ { "DBSNP-TO-CGI", cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION", cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT", cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION", cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION", cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs20_Make },
+ { "EVIDENCE-INTERVALS",
+ cg_eFileType_EVIDENCE_INTERVALS, CGEvidenceIntervals20_Make },
+ { "COVERAGE-DISTRIBUTION", cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+ { "COVERAGE-BY-GC", cg_eFileType_COVERAGE_BY_GC, NULL },
+ { "DEPTH-OF-COVERAGE", cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING", cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH", cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING",
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH", cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "TUMOR-CNV-SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAILS-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "TUMOR_DETAILS_SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "TUMOR-DETAILS-SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "JUNCTIONS", cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS", cg_eFileType_JUNCTION_DNBS, NULL },
+ { "SV-EVENTS", cg_eFileType_SV_EVENTS, NULL },
+ { "VAR-OLPL", cg_eFileType_VAR_OLPL, NULL },
+ { "MEI", cg_eFileType_MEI, NULL },
+ /* from the documentation */
+ { "TUMOR-CNV-DETAILS", cg_eFileType_TUMOR_CNV_DETAILS, NULL },
+ { "DIPLOID-SOMATIC-CNV-SEGMENTS",
+ cg_eFileType_DIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "COVERAGE-DISTRIBUTION-CODING",
+ cg_eFileType_COVERAGE_DISTRIBUTION_CODING, NULL },
+ { "COVERAGE-BY-GC-CODING", cg_eFileType_COVERAGE_BY_GC_CODING, NULL },
+ { "LIB-SMALL-GAPS-ROLLUP", cg_eFileType_LIB_SMALL_GAPS_ROLLUP, NULL },
+
+ { "TAG_LFR", cg_eFileType_TAG_LFR, CGTagLfr15_Make },
+
+ /* VDB-1383 */
+ { "NONDIPLOID-SOMATIC-CNV-SEGMENTS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "NONDIPLOID-SOMATIC-CNV-DETAILS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_DETAILS, NULL },
+ { "DIPLOID-SOMATIC-CNV-DETAIL-SCORES",
+ cg_eFileType_DIPLOID_SOMATIC_CNV_DETAIL_SCORES, NULL },
+};
+
+rc_t CGFile20_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/f2_2.c b/tools/cg-load/f2_2.c
new file mode 100644
index 0000000..774f36f
--- /dev/null
+++ b/tools/cg-load/f2_2.c
@@ -0,0 +1,98 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-evidence-dnbs.h"
+#include "factory-evidence-intervals.h"
+#include "factory-mappings.h"
+#include "factory-reads.h"
+#include "factory-tag-lfr.h"
+
+#include "file.h"
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS", cg_eFileType_READS, CGReads22_Make },
+ { "MAPPINGS", cg_eFileType_MAPPINGS, CGMappings22_Make },
+ { "LIB-DNB", cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS", cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS", cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS", cg_eFileType_REFMETRICS, NULL },
+ { "IDENTIFIER-MAPPING", cg_eFileType_IDENTIFIER_MAPPING, NULL },
+ { "DBSNP-TO-CGI", cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION", cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT", cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION", cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION", cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs22_Make },
+ { "EVIDENCE-INTERVALS",
+ cg_eFileType_EVIDENCE_INTERVALS, CGEvidenceIntervals22_Make },
+ { "COVERAGE-DISTRIBUTION", cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+ { "COVERAGE-BY-GC", cg_eFileType_COVERAGE_BY_GC, NULL },
+ { "DEPTH-OF-COVERAGE", cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING", cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH", cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING",
+ cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH", cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS", cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "TUMOR-CNV-SEGMENTS", cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAILS-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES", cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "TUMOR_DETAILS_SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "TUMOR-DETAILS-SCORES", cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "NONDIPLOID-SOMATIC-CNV-SEGMENTS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "NONDIPLOID-SOMATIC-CNV-DETAILS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_DETAILS, NULL },
+ { "JUNCTIONS", cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS", cg_eFileType_JUNCTION_DNBS, NULL },
+ { "SV-EVENTS", cg_eFileType_SV_EVENTS, NULL },
+ { "VAR-OLPL", cg_eFileType_VAR_OLPL, NULL },
+ { "MEI", cg_eFileType_MEI, NULL },
+ /* from Standard Sequencing Service Data File Formats file test */
+ { "TUMOR-CNV-DETAILS", cg_eFileType_TUMOR_CNV_DETAILS, NULL },
+ { "DIPLOID-SOMATIC-CNV-SEGMENTS",
+ cg_eFileType_DIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "COVERAGE-DISTRIBUTION-CODING",
+ cg_eFileType_COVERAGE_DISTRIBUTION_CODING, NULL },
+ { "COVERAGE-BY-GC-CODING", cg_eFileType_COVERAGE_BY_GC_CODING, NULL },
+ { "LIB-SMALL-GAPS-ROLLUP", cg_eFileType_LIB_SMALL_GAPS_ROLLUP, NULL },
+ /* from Cancer Sequencing Service Data File Formats file test */
+ { "DIPLOID-SOMATIC-CNV-DETAILSCORES",
+ cg_eFileType_DIPLOID_SOMATIC_CNV_DETAIL_SCORES, NULL },
+
+ { "TAG_LFR", cg_eFileType_TAG_LFR, CGTagLfr15_Make },
+};
+
+rc_t CGFile22_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/f2_4.c b/tools/cg-load/f2_4.c
new file mode 100644
index 0000000..6036f6f
--- /dev/null
+++ b/tools/cg-load/f2_4.c
@@ -0,0 +1,33 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-file.h" /* CGFile22_Make */
+#include "file.h" /* CGFileType */
+
+rc_t CGFile24_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGFile22_Make ( self, type, file );
+}
diff --git a/tools/cg-load/f2_5.c b/tools/cg-load/f2_5.c
new file mode 100644
index 0000000..48c414d
--- /dev/null
+++ b/tools/cg-load/f2_5.c
@@ -0,0 +1,98 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-evidence-dnbs.h"
+#include "factory-evidence-intervals.h"
+#include "factory-mappings.h"
+#include "factory-reads.h"
+#include "factory-tag-lfr.h"
+
+#include "file.h"
+
+static const CGFileTypeFactory cg_ETypeXX_names[] = {
+ { "READS" , cg_eFileType_READS, CGReads25_Make },
+ { "MAPPINGS" , cg_eFileType_MAPPINGS, CGMappings25_Make },
+ { "LIB-DNB" , cg_eFileType_LIB_DNB, NULL },
+ { "LIB-MATE-GAPS" , cg_eFileType_LIB_MATE_GAPS, NULL },
+ { "LIB-SEQDEP-GAPS" , cg_eFileType_LIB_SEQDEP_GAPS, NULL },
+ { "REFMETRICS" , cg_eFileType_REFMETRICS, NULL },
+ { "IDENTIFIER-MAPPING" , cg_eFileType_IDENTIFIER_MAPPING, NULL },
+ { "DBSNP-TO-CGI" , cg_eFileType_DBSNP_TO_CGI, NULL },
+ { "GENE-ANNOTATION" , cg_eFileType_GENE_ANNOTATION, NULL },
+ { "SUMMARY-REPORT" , cg_eFileType_SUMMARY_REPORT, NULL },
+ { "VAR-ANNOTATION" , cg_eFileType_VAR_ANNOTATION, NULL },
+ { "GENE-VAR-SUMMARY-REPORT", cg_eFileType_GENE_VAR_SUMMARY_REPORT, NULL },
+ { "EVIDENCE-CORRELATION" , cg_eFileType_EVIDENCE_CORRELATION, NULL },
+ { "EVIDENCE-DNBS", cg_eFileType_EVIDENCE_DNBS, CGEvidenceDnbs25_Make },
+ { "EVIDENCE-INTERVALS" , cg_eFileType_EVIDENCE_INTERVALS,
+ CGEvidenceIntervals25_Make },
+ { "COVERAGE-DISTRIBUTION" , cg_eFileType_COVERAGE_DISTRIBUTION, NULL },
+ { "COVERAGE-BY-GC" , cg_eFileType_COVERAGE_BY_GC, NULL },
+ { "DEPTH-OF-COVERAGE" , cg_eFileType_DEPTH_OF_COVERAGE, NULL },
+ { "INDEL-LENGTH-CODING" , cg_eFileType_INDEL_LENGTH_CODING, NULL },
+ { "INDEL-LENGTH" , cg_eFileType_INDEL_LENGTH, NULL },
+ { "SUBSTITUTION-LENGTH-CODING"
+ , cg_eFileType_SUBSTITUTION_LENGTH_CODING, NULL },
+ { "SUBSTITUTION-LENGTH" , cg_eFileType_SUBSTITUTION_LENGTH, NULL },
+ { "CNV_SEGMENTS" , cg_eFileType_CNV_SEGMENTS, NULL },
+ { "CNV-SEGMENTS" , cg_eFileType_CNV_SEGMENTS, NULL },
+ { "TUMOR_CNV_SEGMENTS" , cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "TUMOR-CNV-SEGMENTS" , cg_eFileType_TUMOR_CNV_SEGMENTS, NULL },
+ { "CNV_DETAILS_SCORES" , cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAILS-SCORES" , cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "CNV-DETAIL-SCORES" , cg_eFileType_CNV_DETAILS_SCORES, NULL },
+ { "TUMOR_DETAILS_SCORES" , cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "TUMOR-DETAILS-SCORES" , cg_eFileType_TUMOR_DETAILS_SCORES, NULL },
+ { "NONDIPLOID-SOMATIC-CNV-SEGMENTS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "NONDIPLOID-SOMATIC-CNV-DETAILS",
+ cg_eFileType_NONDIPLOID_SOMATIC_CNV_DETAILS, NULL },
+ { "JUNCTIONS" , cg_eFileType_JUNCTIONS, NULL },
+ { "JUNCTION-DNBS" , cg_eFileType_JUNCTION_DNBS, NULL },
+ { "SV-EVENTS" , cg_eFileType_SV_EVENTS, NULL },
+ { "VAR-OLPL" , cg_eFileType_VAR_OLPL, NULL },
+ { "MEI" , cg_eFileType_MEI, NULL },
+ /* from Standard Sequencing Service Data File Formats file test */
+ { "TUMOR-CNV-DETAILS", cg_eFileType_TUMOR_CNV_DETAILS, NULL },
+ { "DIPLOID-SOMATIC-CNV-SEGMENTS"
+ , cg_eFileType_DIPLOID_SOMATIC_CNV_SEGMENTS, NULL },
+ { "COVERAGE-DISTRIBUTION-CODING"
+ , cg_eFileType_COVERAGE_DISTRIBUTION_CODING, NULL },
+ { "COVERAGE-BY-GC-CODING", cg_eFileType_COVERAGE_BY_GC_CODING, NULL },
+ { "LIB-SMALL-GAPS-ROLLUP", cg_eFileType_LIB_SMALL_GAPS_ROLLUP, NULL },
+ /* from Cancer Sequencing Service Data File Formats file test */
+ { "DIPLOID-SOMATIC-CNV-DETAILSCORES"
+ , cg_eFileType_DIPLOID_SOMATIC_CNV_DETAIL_SCORES, NULL },
+
+ { "TAG_LFR" , cg_eFileType_TAG_LFR, CGTagLfr25_Make },
+};
+
+rc_t CGFile25_Make(const CGFileType** self,
+ const char* type, const CGLoaderFile* file)
+{
+ return CGLoaderFileMakeCGFileType(file, type,
+ cg_ETypeXX_names, sizeof cg_ETypeXX_names / sizeof cg_ETypeXX_names[0],
+ self);
+}
diff --git a/tools/cg-load/factory-cmn.h b/tools/cg-load/factory-cmn.h
new file mode 100644
index 0000000..61b97cb
--- /dev/null
+++ b/tools/cg-load/factory-cmn.h
@@ -0,0 +1,57 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_cmh_h_
+#define _tools_cg_load_factory_cmh_h_
+
+#include <klib/defs.h>
+#include "defs.h"
+
+typedef CGFIELD_LIBRARY_TYPE CGFIELD15_LIBRARY[32];
+typedef CGFIELD_SAMPLE_TYPE CGFIELD15_SAMPLE[32];
+typedef CGFIELD_SLIDE_TYPE CGFIELD15_SLIDE[CG_SLIDE];
+typedef CGFIELD_LANE_TYPE CGFIELD15_LANE[CG_LANE];
+typedef CGFIELD_CHROMOSOME_TYPE CGFIELD15_CHROMOSOME[CG_CHROMOSOME_NAME];
+typedef CGFIELD_ASSEMBLY_ID_TYPE CGFIELD15_ASSEMBLY_ID[50];
+typedef CGFIELD_SOFTWARE_VERSION_TYPE CGFIELD15_SOFTWARE_VERSION[38];
+typedef CGFIELD_DBSNP_BUILD_TYPE CGFIELD15_DBSNP_BUILD[8];
+typedef CGFIELD_COSMIC_TYPE CGFIELD15_COSMIC[8];
+typedef CGFIELD_PFAM_DATE_TYPE CGFIELD15_PFAM_DATE[16];
+typedef CGFIELD_MIRBASE_VERSION_TYPE CGFIELD15_MIRBASE_VERSION[8];
+typedef CGFIELD_DGV_VERSION_TYPE CGFIELD15_DGV_VERSION[16];
+typedef CGFIELD_GENERATED_AT_TYPE CGFIELD15_GENERATED_AT[32];
+typedef CGFIELD_GENERATED_BY_TYPE CGFIELD15_GENERATED_BY[32];
+typedef CGFIELD_GENE_ANNOTATIONS_TYPE CGFIELD15_GENE_ANNOTATIONS[16];
+typedef CGFIELD_GENOME_REFERENCE_TYPE CGFIELD15_GENOME_REFERENCE[16];
+typedef CGFIELD_BATCH_FILE_NUMBER_TYPE CGFIELD15_BATCH_FILE_NUMBER;
+typedef CGFIELD_BATCH_OFFSET_TYPE CGFIELD15_BATCH_OFFSET;
+typedef CGFIELD_FIELD_SIZE_TYPE CGFIELD15_FIELD_SIZE;
+typedef CGFIELD_MAX_PLOIDY_TYPE CGFIELD15_MAX_PLOIDY;
+typedef CGFIELD_WINDOW_SHIFT_TYPE CGFIELD15_WINDOW_SHIFT;
+typedef CGFIELD_WINDOW_WIDTH_TYPE CGFIELD15_WINDOW_WIDTH;
+typedef CGFIELD_NUMBER_LEVELS_TYPE CGFIELD15_NUMBER_LEVELS;
+typedef CGFIELD_MEAN_LEVEL_X_TYPE CGFIELD15_MEAN_LEVEL_X;
+
+#endif /* _tools_cg_load_factory_cmh_h_ */
diff --git a/tools/cg-load/factory-evidence-dnbs.c b/tools/cg-load/factory-evidence-dnbs.c
new file mode 100644
index 0000000..0f5065e
--- /dev/null
+++ b/tools/cg-load/factory-evidence-dnbs.c
@@ -0,0 +1,625 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "debug.h"
+
+#include "factory-cmn.h"
+#include "factory-evidence-dnbs.h"
+
+typedef struct CGEvidenceDnbs15 CGEvidenceDnbs15;
+#define CGFILETYPE_IMPL CGEvidenceDnbs15
+#include "file.h"
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct CGEvidenceDnbs15 {
+ CGFileType dad;
+ const CGLoaderFile* file;
+ uint64_t records;
+ /* headers */
+ CGFIELD15_ASSEMBLY_ID assembly_id;
+ CGFIELD15_CHROMOSOME chromosome;
+ CGFIELD15_GENERATED_AT generated_at;
+ CGFIELD15_GENERATED_BY generated_by;
+ CGFIELD15_SAMPLE sample;
+ CGFIELD15_SOFTWARE_VERSION software_version;
+};
+
+void CGEvidenceDnbs15_Release(const CGEvidenceDnbs15* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGEvidenceDnbs15* self = (CGEvidenceDnbs15*)cself;
+ if( records != NULL ) {
+ *records = cself->records;
+ }
+ free(self);
+ }
+}
+
+static
+rc_t CC CGEvidenceDnbs15_Header(const CGEvidenceDnbs15* cself, const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGEvidenceDnbs15* self = (CGEvidenceDnbs15*)cself;
+
+ if( strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->assembly_id, sizeof(self->assembly_id));
+ } else if( strncmp("CHROMOSOME\t", buf, slen = 11) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->chromosome, sizeof(self->chromosome));
+ } else if( strncmp("GENERATED_AT\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_at, sizeof(self->generated_at));
+ } else if( strncmp("GENERATED_BY\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_by, sizeof(self->generated_by));
+ } else if( strncmp("SAMPLE\t", buf, slen = 7) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->sample, sizeof(self->sample));
+ } else if( strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->software_version, sizeof(self->software_version));
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+ return rc;
+}
+
+static rc_t CC CGEvidenceDnbs25_Header(
+ const CGEvidenceDnbs15* cself, const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGEvidenceDnbs15* self = (CGEvidenceDnbs15*)cself;
+
+ /* from SRA-2617 files */
+ if (strncmp("APPROVAL\t", buf, slen = 9) == 0) {
+ }
+ else if (strncmp("TITLE\t", buf, slen = 6) == 0) {
+ }
+ else if (strncmp("ADDRESS\t", buf, slen = 8) == 0) {
+ }
+
+ /* From Table 1: Header Metadata Present in all Data Files */
+ else if (strncmp("CUSTOMER_SAMPLE_ID\t", buf, slen = 19) == 0) {
+ }
+ else if (strncmp("SAMPLE_SOURCE\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("REPORTED_GENDER\t", buf, slen = 16) == 0) {
+ }
+ else if (strncmp("CALLED_GENDER\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("TUMOR_STATUS\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_SOURCE\t", buf, slen = 13) == 0) {
+ }
+
+ else if (strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->assembly_id, sizeof(self->assembly_id));
+ }
+ else if (strncmp("CHROMOSOME\t", buf, slen = 11) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->chromosome, sizeof(self->chromosome));
+ }
+ else if (strncmp("GENERATED_AT\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_at, sizeof(self->generated_at));
+ }
+ else if (strncmp("GENERATED_BY\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_by, sizeof(self->generated_by));
+ }
+ else if (strncmp("SAMPLE\t", buf, slen = 7) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->sample, sizeof(self->sample));
+ }
+ else if (strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->software_version, sizeof(self->software_version));
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+
+ return rc;
+}
+
+static
+rc_t CGEvidenceDnbs15_GetAssemblyId(const CGEvidenceDnbs15* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ if( cself->assembly_id[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *assembly_id = cself->assembly_id;
+ return 0;
+}
+
+static
+rc_t CGEvidenceDnbs15_GetSample(const CGEvidenceDnbs15* cself, const CGFIELD_SAMPLE_TYPE** sample)
+{
+ if( cself->sample[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *sample = cself->sample;
+ return 0;
+}
+
+static
+rc_t CGEvidenceDnbs15_GetChromosome(const CGEvidenceDnbs15* cself, const CGFIELD_CHROMOSOME_TYPE** chromosome)
+{
+ if( cself->chromosome[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *chromosome = cself->chromosome;
+ return 0;
+}
+
+static rc_t CC CGEvidenceDnbs_Read(
+ const CGEvidenceDnbs15* cself, const char* interval_id,
+ TEvidenceDnbsData* data, int score_allele_num)
+{
+ rc_t rc = 0;
+ TEvidenceDnbsData_dnb* m = NULL;
+ static TEvidenceDnbsData_dnb next_rec;
+ static char next_interval_id[32] = "";
+
+ /* local copy of unused TEvidenceDnbsData_dnb struct elements */
+ char reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ INSDC_coord_zero mate_offset_in_reference;
+ char mate_reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ uint16_t score_allele[4] = {0, 0, 0, 0}; /* v1.5 has ScoreAllele[012]; v2.0 - [0123] */
+ char qual[CG_EVDNC_SPOT_LEN];
+
+ strcpy(data->interval_id, interval_id);
+ data->qty = 0;
+ /* already read one rec for this interval_id */
+ if( next_interval_id[0] != '\0' ) {
+ if( strcmp(next_interval_id, interval_id) != 0 ) {
+ /* nothing todo since next interval id is different */
+ return rc;
+ }
+ m = &data->dnbs[data->qty++];
+ memmove(m, &next_rec, sizeof(next_rec));
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\tnot_used\t0\tnot_used\t%c\t0\t0\t0\t'%.*s'\t'--'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ m->mapping_quality, m->read_len, m->read));
+ }
+ do {
+ int i = 0;
+ char tmp[2];
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0 ) {
+ next_interval_id[0] = '\0';
+ break; /* EOF */
+ }
+ if( data->qty >= data->max_qty ) {
+ TEvidenceDnbsData_dnb* x;
+ data->max_qty += 100;
+ x = realloc(data->dnbs, sizeof(*(data->dnbs)) * data->max_qty);
+ if( x == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ data->dnbs = x;
+ }
+ m = &data->dnbs[data->qty++];
+
+ /*DEBUG_MSG(10, ("%2hu evidenceDnbs: '%.*s'\n", data->qty, len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, next_interval_id, sizeof(next_interval_id));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->chr, sizeof(m->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->slide, sizeof(m->slide));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->lane, sizeof(m->lane));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u32(b, p - b, &m->file_num_in_lane);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u64(b, p - b, &m->dnb_offset_in_lane_file);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->allele_index);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] != 'L' && tmp[0] != 'R' ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->side = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] != '+' && tmp[0] != '-' ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->strand = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset_in_allele);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->allele_alignment, sizeof(m->allele_alignment));
+ m->allele_alignment_length = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset_in_reference);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, reference_alignment, sizeof(reference_alignment));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &mate_offset_in_reference);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, mate_reference_alignment, sizeof(mate_reference_alignment));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] < 33 || tmp[0] > 126 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->mapping_quality = tmp[0];
+ for (i = 0; i < score_allele_num; ++i) {
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &score_allele[i]);
+ if(rc){
+ score_allele[i] =0;
+ rc =0;
+ }
+ }
+ CG_LINE_NEXT_FIELD(b, len, p);
+ m->read_len = p - b;
+ rc = str2buf(b, m->read_len, m->read, sizeof(m->read));
+ CG_LINE_LAST_FIELD(b, len, p);
+ if( m->read_len != p - b ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInconsistent);
+ } else {
+ rc = str2buf(b, p - b, qual, sizeof(qual));
+ }
+ ((CGEvidenceDnbs15*)cself)->records++;
+ if( strcmp(next_interval_id, data->interval_id) != 0 ) {
+ if (score_allele_num == 3) {
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\t'%s'\t%i\t'%s'\t%c\t%hu\t%hu\t%hu\t'%.*s'\t'%s'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ reference_alignment, mate_offset_in_reference, mate_reference_alignment,
+ m->mapping_quality, score_allele[0], score_allele[1], score_allele[2], m->read_len, m->read, qual));
+ }
+ else if (score_allele_num == 4) {
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\t'%s'\t%i\t'%s'\t%c\t%hu\t%hu\t%hu\t%hu\t'%.*s'\t'%s'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ reference_alignment, mate_offset_in_reference, mate_reference_alignment,
+ m->mapping_quality, score_allele[0], score_allele[1], score_allele[2], score_allele[3], m->read_len, m->read, qual));
+ }
+ else { assert(0); }
+ }
+ CG_LINE_END();
+ if( next_interval_id[0] == '\0' ) {
+ break;
+ }
+ if( strcmp(next_interval_id, data->interval_id) != 0 ) {
+ /* next record is from next interval, remeber it and stop */
+ memmove(&next_rec, m, sizeof(next_rec));
+ data->qty--;
+ break;
+ }
+ } while( rc == 0 );
+ return rc;
+}
+
+static rc_t CC CGEvidenceDnbs25_Read(const CGEvidenceDnbs15 *cself,
+ const char *interval_id, TEvidenceDnbsData *data)
+{
+ const int score_allele_num = 4;
+ rc_t rc = 0;
+ TEvidenceDnbsData_dnb* m = NULL;
+ static TEvidenceDnbsData_dnb next_rec;
+ static char next_interval_id[32] = "";
+
+ /* local copy of unused TEvidenceDnbsData_dnb struct elements */
+ char reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ INSDC_coord_zero mate_offset_in_reference;
+ char mate_reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ uint16_t score_allele[4] = {0, 0, 0, 0}; /* v >= 2.0 has ScoreAllele[0-3] */
+ char qual[CG_EVDNC_SPOT_LEN];
+
+ bool lfr = false;
+ assert(cself->file->cg_file);
+ lfr = cself->file->cg_file->libraryType == cg_eLibraryType_PureLFR;
+
+ strcpy(data->interval_id, interval_id);
+ data->qty = 0;
+ /* already read one rec for this interval_id */
+ if( next_interval_id[0] != '\0' ) {
+ if( strcmp(next_interval_id, interval_id) != 0 ) {
+ /* nothing todo since next interval id is different */
+ return rc;
+ }
+ m = &data->dnbs[data->qty++];
+ memmove(m, &next_rec, sizeof(next_rec));
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\tnot_used\t0\tnot_used\t%c\t0\t0\t0\t'%.*s'\t'--'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ m->mapping_quality, m->read_len, m->read));
+ }
+ do {
+ int i = 0;
+ char tmp[2];
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0 ) {
+ next_interval_id[0] = '\0';
+ break; /* EOF */
+ }
+ if( data->qty >= data->max_qty ) {
+ TEvidenceDnbsData_dnb* x;
+ data->max_qty += 100;
+ x = realloc(data->dnbs, sizeof(*(data->dnbs)) * data->max_qty);
+ if( x == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ data->dnbs = x;
+ }
+ m = &data->dnbs[data->qty++];
+
+ /*DEBUG_MSG(10, ("%2hu evidenceDnbs: '%.*s'\n", data->qty, len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, next_interval_id, sizeof(next_interval_id));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->chr, sizeof(m->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->slide, sizeof(m->slide));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->lane, sizeof(m->lane));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u32(b, p - b, &m->file_num_in_lane);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u64(b, p - b, &m->dnb_offset_in_lane_file);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->allele_index);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] != 'L' && tmp[0] != 'R' ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->side = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] != '+' && tmp[0] != '-' ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->strand = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset_in_allele);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->allele_alignment, sizeof(m->allele_alignment));
+ m->allele_alignment_length = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset_in_reference);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, reference_alignment, sizeof(reference_alignment));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &mate_offset_in_reference);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, mate_reference_alignment, sizeof(mate_reference_alignment));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] < 33 || tmp[0] > 126 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->mapping_quality = tmp[0];
+ for (i = 0; i < score_allele_num; ++i) {
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &score_allele[i]);
+ if (rc != 0) {
+ score_allele[i] = 0;
+ rc = 0;
+ }
+ }
+ CG_LINE_NEXT_FIELD(b, len, p);
+ m->read_len = p - b;
+ rc = str2buf(b, m->read_len, m->read, sizeof(m->read));
+
+ /* Scores */
+ if (lfr) {
+ CG_LINE_NEXT_FIELD(b, len, p);
+ }
+ else {
+ CG_LINE_LAST_FIELD(b, len, p);
+ }
+ if (m->read_len != p - b) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInconsistent);
+ }
+ else {
+ rc = str2buf(b, p - b, qual, sizeof(qual));
+ }
+
+ if (lfr) {
+ /* Standard Sequencing Service Data File Formats (File format v2.5)
+ states that Scores is the last column in evidenceDnbs file
+ but in 2.5 submission mentioned in SRA-2617
+ there are additionally wellId and wellScore columns.
+ #LIBRARY_TYPE is Pure LFR for this submission. */
+
+ /* wellId */
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->wellId);
+ if (rc == 0 && (m->wellId < 0 || m->wellId > 384)) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+
+ /* wellScore */
+ CG_LINE_LAST_FIELD(b, len, p);
+ }
+
+ ((CGEvidenceDnbs15*)cself)->records++;
+ if( strcmp(next_interval_id, data->interval_id) != 0 ) {
+ if (score_allele_num == 3) {
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\t'%s'\t%i\t'%s'\t%c\t%hu\t%hu\t%hu\t'%.*s'\t'%s'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ reference_alignment, mate_offset_in_reference, mate_reference_alignment,
+ m->mapping_quality, score_allele[0], score_allele[1], score_allele[2], m->read_len, m->read, qual));
+ }
+ else if (score_allele_num == 4) {
+ DEBUG_MSG(10, ("%3u evidenceDnbs: '%s'\t'%s'\t'%s'\t'%s'\t%u\t%lu\t%hu\t%c\t%c\t%i\t'%.*s'"
+ "\t%i\t'%s'\t%i\t'%s'\t%c\t%hu\t%hu\t%hu\t%hu\t'%.*s'\t'%s'\n",
+ data->qty, next_interval_id, m->chr, m->slide, m->lane, m->file_num_in_lane,
+ m->dnb_offset_in_lane_file, m->allele_index, m->side, m->strand, m->offset_in_allele,
+ m->allele_alignment_length, m->allele_alignment, m->offset_in_reference,
+ reference_alignment, mate_offset_in_reference, mate_reference_alignment,
+ m->mapping_quality, score_allele[0], score_allele[1], score_allele[2], score_allele[3], m->read_len, m->read, qual));
+ }
+ else { assert(0); }
+ }
+ CG_LINE_END();
+ if( next_interval_id[0] == '\0' ) {
+ break;
+ }
+ if( strcmp(next_interval_id, data->interval_id) != 0 ) {
+ /* next record is from next interval, remeber it and stop */
+ memmove(&next_rec, m, sizeof(next_rec));
+ data->qty--;
+ break;
+ }
+ } while( rc == 0 );
+ return rc;
+}
+
+static
+rc_t CC CGEvidenceDnbs15_Read(const CGEvidenceDnbs15* self, const char* interval_id, TEvidenceDnbsData* data)
+{ return CGEvidenceDnbs_Read(self, interval_id, data, 3); }
+
+static
+rc_t CC CGEvidenceDnbs20_Read(const CGEvidenceDnbs15* self, const char* interval_id, TEvidenceDnbsData* data)
+{ return CGEvidenceDnbs_Read(self, interval_id, data, 4); }
+
+static const CGFileType_vt CGEvidenceDnbs15_vt =
+{
+ CGEvidenceDnbs15_Header,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs15_Read,
+ NULL, /* tag_lfr */
+ CGEvidenceDnbs15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs15_GetSample,
+ CGEvidenceDnbs15_GetChromosome,
+ CGEvidenceDnbs15_Release
+};
+
+static const CGFileType_vt CGEvidenceDnbs20_vt =
+{
+ CGEvidenceDnbs15_Header,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs20_Read,
+ NULL, /* tag_lfr */
+ CGEvidenceDnbs15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs15_GetSample,
+ CGEvidenceDnbs15_GetChromosome,
+ CGEvidenceDnbs15_Release
+};
+
+static const CGFileType_vt CGEvidenceDnbs25_vt = {
+ CGEvidenceDnbs25_Header,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs25_Read,
+ NULL, /* tag_lfr */
+ CGEvidenceDnbs15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceDnbs15_GetSample,
+ CGEvidenceDnbs15_GetChromosome,
+ CGEvidenceDnbs15_Release
+};
+
+static
+rc_t CC CGEvidenceDnbs_Make(const CGFileType** cself, const CGLoaderFile* file,
+ const CGFileType_vt* vt)
+{
+ rc_t rc = 0;
+ CGEvidenceDnbs15* obj = NULL;
+
+ assert(vt);
+
+ if( cself == NULL || file == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ } else {
+ *cself = NULL;
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->file = file;
+ obj->dad.type = cg_eFileType_EVIDENCE_DNBS;
+ obj->dad.vt = vt;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &obj->dad;
+ } else {
+ CGEvidenceDnbs15_Release(obj, NULL);
+ }
+ return rc;
+}
+
+rc_t CC CGEvidenceDnbs15_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGEvidenceDnbs_Make(self, file, &CGEvidenceDnbs15_vt); }
+
+rc_t CC CGEvidenceDnbs13_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGEvidenceDnbs15_Make(self, file); }
+
+rc_t CC CGEvidenceDnbs20_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGEvidenceDnbs_Make(self, file, &CGEvidenceDnbs20_vt); }
+
+rc_t CC CGEvidenceDnbs22_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGEvidenceDnbs_Make(self, file, &CGEvidenceDnbs20_vt); }
+
+rc_t CC CGEvidenceDnbs25_Make(const CGFileType** self, const CGLoaderFile* file)
+{
+ return CGEvidenceDnbs_Make(self, file, &CGEvidenceDnbs25_vt);
+}
diff --git a/tools/cg-load/factory-evidence-dnbs.h b/tools/cg-load/factory-evidence-dnbs.h
new file mode 100644
index 0000000..1fa0194
--- /dev/null
+++ b/tools/cg-load/factory-evidence-dnbs.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_evidence_dnbs_h_
+#define _tools_cg_load_factory_evidence_dnbs_h_
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CC CGEvidenceDnbs13_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGEvidenceDnbs15_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGEvidenceDnbs20_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGEvidenceDnbs22_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGEvidenceDnbs25_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+
+
+#endif /* _tools_cg_load_factory_evidence_dnbs_h_ */
diff --git a/tools/cg-load/factory-evidence-intervals.c b/tools/cg-load/factory-evidence-intervals.c
new file mode 100644
index 0000000..339a02d
--- /dev/null
+++ b/tools/cg-load/factory-evidence-intervals.c
@@ -0,0 +1,396 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "debug.h"
+#include "factory-cmn.h"
+#include "factory-evidence-intervals.h"
+
+typedef struct CGEvidenceIntervals15 CGEvidenceIntervals15;
+#define CGFILETYPE_IMPL CGEvidenceIntervals15
+#include "file.h"
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct CGEvidenceIntervals15 {
+ CGFileType dad;
+ const CGLoaderFile* file;
+ uint64_t records;
+ /* headers */
+ CGFIELD15_ASSEMBLY_ID assembly_id;
+ CGFIELD15_CHROMOSOME chromosome;
+ CGFIELD15_GENERATED_AT generated_at;
+ CGFIELD15_GENERATED_BY generated_by;
+ CGFIELD15_SAMPLE sample;
+ CGFIELD15_SOFTWARE_VERSION software_version;
+};
+
+static
+rc_t CC CGEvidenceIntervals15_Header(const CGEvidenceIntervals15* cself, const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGEvidenceIntervals15* self = (CGEvidenceIntervals15*)cself;
+
+ if( strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->assembly_id, sizeof(self->assembly_id));
+ } else if( strncmp("CHROMOSOME\t", buf, slen = 11) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->chromosome, sizeof(self->chromosome));
+ } else if( strncmp("GENERATED_AT\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_at, sizeof(self->generated_at));
+ } else if( strncmp("GENERATED_BY\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_by, sizeof(self->generated_by));
+ } else if( strncmp("SAMPLE\t", buf, slen = 7) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->sample, sizeof(self->sample));
+ } else if( strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->software_version, sizeof(self->software_version));
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+ return rc;
+}
+
+static rc_t CC CGEvidenceIntervals25_Header(const CGEvidenceIntervals15* cself,
+ const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen = 0;
+ CGEvidenceIntervals15* self = (CGEvidenceIntervals15*)cself;
+
+ /* from SRA-2617 files */
+ if (strncmp("APPROVAL\t", buf, slen = 9) == 0) {
+ }
+ else if (strncmp("TITLE\t", buf, slen = 6) == 0) {
+ }
+ else if (strncmp("ADDRESS\t", buf, slen = 8) == 0) {
+ }
+
+ /* From Table 1: Header Metadata Present in all Data Files */
+ else if (strncmp("CUSTOMER_SAMPLE_ID\t", buf, slen = 19) == 0) {
+ }
+ else if (strncmp("SAMPLE_SOURCE\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("REPORTED_GENDER\t", buf, slen = 16) == 0) {
+ }
+ else if (strncmp("CALLED_GENDER\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("TUMOR_STATUS\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_SOURCE\t", buf, slen = 13) == 0) {
+ }
+
+ else if (strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->assembly_id, sizeof(self->assembly_id));
+ }
+ else if (strncmp("CHROMOSOME\t", buf, slen = 11) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->chromosome, sizeof(self->chromosome));
+ }
+ else if (strncmp("GENERATED_AT\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_at, sizeof(self->generated_at));
+ }
+ else if (strncmp("GENERATED_BY\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_by, sizeof(self->generated_by));
+ }
+ else if (strncmp("SAMPLE\t", buf, slen = 7) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->sample, sizeof(self->sample));
+ }
+ else if (strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->software_version, sizeof(self->software_version));
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+
+ return rc;
+}
+
+static
+rc_t CGEvidenceIntervals15_GetAssemblyId(const CGEvidenceIntervals15* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ if( cself->assembly_id[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *assembly_id = cself->assembly_id;
+ return 0;
+}
+
+static
+rc_t CGEvidenceIntervals15_GetSample(const CGEvidenceIntervals15* cself, const CGFIELD_SAMPLE_TYPE** sample)
+{
+ if( cself->sample[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *sample = cself->sample;
+ return 0;
+}
+
+static
+rc_t CGEvidenceIntervals15_GetChromosome(const CGEvidenceIntervals15* cself, const CGFIELD_CHROMOSOME_TYPE** chromosome)
+{
+ if( cself->chromosome[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *chromosome = cself->chromosome;
+ return 0;
+}
+
+static
+rc_t CC CGEvidenceIntervals15_Read(const CGEvidenceIntervals15* cself, TEvidenceIntervalsData* data)
+{
+ rc_t rc = 0;
+
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcDone);
+ break;
+ }
+ /*DEBUG_MSG(10, ("evidenceIntervals: '%.*s'\n", len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->interval_id, sizeof(data->interval_id));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->chr, sizeof(data->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &data->offset);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u32(b, p - b, &data->length);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &data->ploidy);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_indexes, sizeof(data->allele_indexes));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &data->score);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[0], sizeof(data->allele[0]));
+ data->allele_length[0] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[1], sizeof(data->allele[1]));
+ data->allele_length[1] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[2], sizeof(data->allele[2]));
+ data->allele_length[2] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_alignment[1], sizeof(data->allele_alignment[1]));
+ data->allele_alignment_length[1] = p - b;
+ CG_LINE_LAST_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_alignment[2], sizeof(data->allele_alignment[2]));
+ data->allele_alignment_length[2] = p - b;
+ ((CGEvidenceIntervals15*)cself)->records++;
+ DEBUG_MSG(10, ("evidenceIntervals: '%s'\t'%s'\t%i\t%u\t%u\t%s\t%u\t'%s'\t'%s'\t'%s'\t'%s'\t'%s'\n",
+ data->interval_id, data->chr, data->offset, data->length, data->ploidy,
+ data->allele_indexes, data->score, data->allele[0], data->allele[1], data->allele[2],
+ data->allele_alignment[1], data->allele_alignment[2]));
+ CG_LINE_END();
+ return rc;
+}
+
+static
+rc_t CC CGEvidenceIntervals20_Read(const CGEvidenceIntervals15* cself, TEvidenceIntervalsData* data)
+{
+ rc_t rc = 0;
+
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcDone);
+ break;
+ }
+ /*DEBUG_MSG(10, ("evidenceIntervals: '%.*s'\n", len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->interval_id, sizeof(data->interval_id));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->chr, sizeof(data->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &data->offset);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u32(b, p - b, &data->length);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &data->ploidy);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_indexes, sizeof(data->allele_indexes));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &data->scoreVAF);
+ data->score = data->scoreVAF; /***TODO: do we need re-calculation? ***/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &data->scoreEAF);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[0], sizeof(data->allele[0]));
+ data->allele_length[0] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[1], sizeof(data->allele[1]));
+ data->allele_length[1] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[2], sizeof(data->allele[2]));
+ data->allele_length[2] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele[3], sizeof(data->allele[3]));
+ data->allele_length[3] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_alignment[1], sizeof(data->allele_alignment[1]));
+ data->allele_alignment_length[1] = p - b;
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_alignment[2], sizeof(data->allele_alignment[2]));
+ data->allele_alignment_length[2] = p - b;
+ CG_LINE_LAST_FIELD(b, len, p);
+ rc = str2buf(b, p - b, data->allele_alignment[3], sizeof(data->allele_alignment[3]));
+ data->allele_alignment_length[3] = p - b;
+ ((CGEvidenceIntervals15*)cself)->records++;
+ DEBUG_MSG(10, (
+ "evidenceIntervals: '%s'\t'%s'\t%i\t%u\t%u\t%s\t%u\t%u\t'%s'\t'%s'\t'%s'\t'%s'\t'%s'\t'%s'\t'%s'\n",
+ data->interval_id, data->chr, data->offset, data->length, data->ploidy,
+ data->allele_indexes, data->scoreVAF, data->scoreEAF,
+ data->allele[0], data->allele[1], data->allele[2], data->allele[3],
+ data->allele_alignment[1], data->allele_alignment[2], data->allele_alignment[3]));
+ CG_LINE_END();
+ return rc;
+}
+
+static
+void CC CGEvidenceIntervals15_Release(const CGEvidenceIntervals15* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGEvidenceIntervals15* self = (CGEvidenceIntervals15*)cself;
+ if( records != NULL ) {
+ *records = cself->records;
+ }
+ free(self);
+ }
+}
+
+static const CGFileType_vt CGEvidenceIntervals15_vt =
+{
+ CGEvidenceIntervals15_Header,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals15_Read,
+ NULL,
+ NULL, /* tag_lfr */
+ CGEvidenceIntervals15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals15_GetSample,
+ CGEvidenceIntervals15_GetChromosome,
+ CGEvidenceIntervals15_Release
+};
+
+static const CGFileType_vt CGEvidenceIntervals20_vt =
+{
+ CGEvidenceIntervals15_Header,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals20_Read,
+ NULL,
+ NULL, /* tag_lfr */
+ CGEvidenceIntervals15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals15_GetSample,
+ CGEvidenceIntervals15_GetChromosome,
+ CGEvidenceIntervals15_Release
+};
+
+static const CGFileType_vt CGEvidenceIntervals25_vt = {
+ CGEvidenceIntervals25_Header,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals20_Read,
+ NULL,
+ NULL, /* tag_lfr */
+ CGEvidenceIntervals15_GetAssemblyId,
+ NULL,
+ NULL,
+ NULL,
+ CGEvidenceIntervals15_GetSample,
+ CGEvidenceIntervals15_GetChromosome,
+ CGEvidenceIntervals15_Release
+};
+
+static
+rc_t CGEvidenceIntervals_Make(const CGFileType** cself, const CGLoaderFile* file, const CGFileType_vt* vt)
+{
+ rc_t rc = 0;
+ CGEvidenceIntervals15* obj = NULL;
+
+ assert(vt);
+
+ if( cself == NULL || file == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ }
+ if( rc == 0 ) {
+ *cself = NULL;
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->file = file;
+ obj->dad.type = cg_eFileType_EVIDENCE_INTERVALS;
+ obj->dad.vt = vt;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &obj->dad;
+ } else {
+ CGEvidenceIntervals15_Release(obj, NULL);
+ }
+ return rc;
+}
+
+rc_t CGEvidenceIntervals15_Make(const CGFileType** self,
+ const CGLoaderFile* file)
+{ return CGEvidenceIntervals_Make(self, file, &CGEvidenceIntervals15_vt); }
+
+rc_t CGEvidenceIntervals13_Make(const CGFileType** self,
+ const CGLoaderFile* file)
+{ return CGEvidenceIntervals15_Make(self, file); }
+
+rc_t CGEvidenceIntervals20_Make(const CGFileType** self,
+ const CGLoaderFile* file)
+{ return CGEvidenceIntervals_Make(self, file, &CGEvidenceIntervals20_vt); }
+
+rc_t CGEvidenceIntervals22_Make(const CGFileType** self,
+ const CGLoaderFile* file)
+{ return CGEvidenceIntervals20_Make(self, file); }
+
+rc_t CGEvidenceIntervals25_Make(const CGFileType **self,
+ const CGLoaderFile *file)
+{
+ return CGEvidenceIntervals_Make(self, file, &CGEvidenceIntervals25_vt);
+}
diff --git a/tools/cg-load/factory-evidence-intervals.h b/tools/cg-load/factory-evidence-intervals.h
new file mode 100644
index 0000000..4f781f1
--- /dev/null
+++ b/tools/cg-load/factory-evidence-intervals.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_evidence_intervals_h_
+#define _tools_cg_load_factory_evidence_intervals_h_
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CGEvidenceIntervals13_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CGEvidenceIntervals15_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CGEvidenceIntervals20_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CGEvidenceIntervals22_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CGEvidenceIntervals25_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+
+
+#endif /* _tools_cg_load_factory_evidence_intervals_h_ */
diff --git a/tools/cg-load/factory-file.h b/tools/cg-load/factory-file.h
new file mode 100644
index 0000000..43fbbcb
--- /dev/null
+++ b/tools/cg-load/factory-file.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_file_h_
+#define _tools_cg_load_factory_file_h_
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CGFile13_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile15_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile17_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile20_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile22_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile24_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+rc_t CGFile25_Make(const struct CGFileType** self,
+ const char* type, const struct CGLoaderFile* file);
+
+#endif /* _tools_cg_load_factory_file_h_ */
diff --git a/tools/cg-load/factory-mappings.c b/tools/cg-load/factory-mappings.c
new file mode 100644
index 0000000..8434c84
--- /dev/null
+++ b/tools/cg-load/factory-mappings.c
@@ -0,0 +1,539 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+
+#include "debug.h"
+#include "factory-cmn.h"
+#include "factory-mappings.h"
+
+typedef struct CGMappings15 CGMappings15;
+#define CGFILETYPE_IMPL CGMappings15
+#include "file.h"
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+struct CGMappings15 {
+ CGFileType dad;
+ const CGLoaderFile* file;
+ uint64_t records;
+ /* headers */
+ CGFIELD15_ASSEMBLY_ID assembly_id;
+ CGFIELD15_BATCH_FILE_NUMBER batch_file_number;
+ CGFIELD15_GENERATED_AT generated_at;
+ CGFIELD15_GENERATED_BY generated_by;
+ CGFIELD15_LANE lane;
+ CGFIELD15_LIBRARY library;
+ CGFIELD15_SAMPLE sample;
+ CGFIELD15_SLIDE slide;
+ CGFIELD15_SOFTWARE_VERSION software_version;
+};
+
+void CGMappings15_Release(const CGMappings15* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGMappings15* self = (CGMappings15*)cself;
+ if( records != NULL ) {
+ *records = cself->records;
+ }
+ free(self);
+ }
+}
+
+static
+rc_t CC CGMappings15_Header(const CGMappings15* cself, const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGMappings15* self = (CGMappings15*)cself;
+
+ if( strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->assembly_id, sizeof(self->assembly_id));
+ } else if( strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0 ) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if( self->batch_file_number < 1 ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ } else if( strncmp("GENERATED_AT\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_at, sizeof(self->generated_at));
+ } else if( strncmp("GENERATED_BY\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_by, sizeof(self->generated_by));
+ } else if( strncmp("LANE\t", buf, slen = 5) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->lane, sizeof(self->lane));
+ } else if( strncmp("LIBRARY\t", buf, slen = 8) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->library, sizeof(self->library));
+ } else if( strncmp("SAMPLE\t", buf, slen = 7) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->sample, sizeof(self->sample));
+ } else if( strncmp("SLIDE\t", buf, slen = 6) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->slide, sizeof(self->slide));
+ } else if( strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->software_version, sizeof(self->software_version));
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+ return rc;
+}
+
+static rc_t CC CGMappings25_Header(const CGMappings15* cself,
+ const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen = 0;
+ CGMappings15* self = (CGMappings15*)cself;
+
+ /* from SRA-2617 files */
+ if (strncmp("APPROVAL\t", buf, slen = 9) == 0) {
+ }
+ else if (strncmp("TITLE\t", buf, slen = 6) == 0) {
+ }
+ else if (strncmp("ADDRESS\t", buf, slen = 8) == 0) {
+ }
+
+ /* From Table 1: Header Metadata Present in all Data Files */
+ else if (strncmp("CUSTOMER_SAMPLE_ID\t", buf, slen = 19) == 0) {
+ }
+ else if (strncmp("SAMPLE_SOURCE\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("REPORTED_GENDER\t", buf, slen = 16) == 0) {
+ }
+ else if (strncmp("CALLED_GENDER\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("TUMOR_STATUS\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_SOURCE\t", buf, slen = 13) == 0) {
+ }
+
+ else if (strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->assembly_id, sizeof(self->assembly_id));
+ }
+ else if (strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if (self->batch_file_number < 1 ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ }
+ else if (strncmp("GENERATED_AT\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_at, sizeof(self->generated_at));
+ }
+ else if (strncmp("GENERATED_BY\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_by, sizeof(self->generated_by));
+ }
+ else if (strncmp("LANE\t", buf, slen = 5) == 0) {
+ rc = str2buf(&buf[slen], len - slen, self->lane, sizeof(self->lane));
+ }
+ else if (strncmp("LIBRARY\t", buf, slen = 8) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->library, sizeof(self->library));
+ }
+ else if (strncmp("SAMPLE\t", buf, slen = 7) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->sample, sizeof(self->sample));
+ }
+ else if (strncmp("SLIDE\t", buf, slen = 6) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->slide, sizeof(self->slide));
+ }
+ else if (strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->software_version, sizeof(self->software_version));
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+
+ return rc;
+}
+
+static
+rc_t CGMappings15_GetAssemblyId(const CGMappings15* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ if( cself->assembly_id[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *assembly_id = cself->assembly_id;
+ return 0;
+}
+
+static
+rc_t CGMappings15_GetSlide(const CGMappings15* cself, const CGFIELD_SLIDE_TYPE** slide)
+{
+ if( cself->slide[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *slide = cself->slide;
+ return 0;
+}
+
+static
+rc_t CGMappings15_GetLane(const CGMappings15* cself, const CGFIELD_LANE_TYPE** lane)
+{
+ if( cself->lane[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *lane = cself->lane;
+ return 0;
+}
+
+static
+rc_t CGMappings15_GetBatchFileNumber(const CGMappings15* cself, const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number)
+{
+ *batch_file_number = &cself->batch_file_number;
+ return 0;
+}
+
+static
+rc_t CC CGMappings15_Read(const CGMappings15* cself, TMappingsData* data)
+{
+ rc_t rc = 0;
+ TMappingsData_map* m = NULL;
+
+ data->map_qty = 0;
+ do {
+ char tmp[2];
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInsufficient);
+ break;
+ }
+ m = &data->map[data->map_qty];
+ m->saved = false;
+ /*DEBUG_MSG(10, ("mappings %4u: '%.*s'\n", data->map_qty, len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->flags);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->chr, sizeof(m->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[0]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[1]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[2]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] < 33 || tmp[0] > 126 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->weight = tmp[0];
+ CG_LINE_LAST_FIELD(b, len, p);
+ if( (rc = str2u32(b, p - b, &m->mate)) != 0 ) {
+ } else if( m->flags > 7 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ } else if( ++data->map_qty >= CG_MAPPINGS_MAX ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcBuffer, rcInsufficient);
+ }
+ ((CGMappings15*)cself)->records++;
+ DEBUG_MSG(10, ("mappings %4u: %u\t'%s'\t%u\t%i\t%i\t%i\t%c\t%u\n",
+ data->map_qty - 1, m->flags, m->chr, m->offset,
+ m->gap[0], m->gap[1], m->gap[2], m->weight, m->mate));
+ CG_LINE_END();
+ } while( rc == 0 && !(m->flags & cg_eLastDNBRecord) );
+ if (rc == 0) {
+ unsigned i;
+ unsigned const n = data->map_qty;
+
+ for (i = 0; i != n && rc == 0; ++i) {
+ unsigned const mate = data->map[i].mate;
+
+ if (mate > n)
+ data->map[i].mate = i;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t CC CGMappings22_Read(const CGMappings15* cself, TMappingsData* data)
+{
+ rc_t rc = 0;
+ TMappingsData_map* m = NULL;
+
+ data->map_qty = 0;
+ do {
+ char tmp[2];
+ char armWeight = '\0';
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInsufficient);
+ break;
+ }
+ m = &data->map[data->map_qty];
+ m->saved = false;
+ /*DEBUG_MSG(10, ("mappings %4u: '%.*s'\n", data->map_qty, len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->flags);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->chr, sizeof(m->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[0]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[1]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[2]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] < 33 || tmp[0] > 126 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->weight = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if( (rc = str2u32(b, p - b, &m->mate)) != 0 ) {
+ } else if( m->flags > 7 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ } else if( ++data->map_qty >= CG_MAPPINGS_MAX ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcBuffer, rcInsufficient);
+ }
+ CG_LINE_LAST_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if (tmp[0] < 33 || tmp[0] > 126)
+ { rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange); }
+ armWeight = tmp[0]; /* ignore armWeight */
+ ((CGMappings15*)cself)->records++;
+ DEBUG_MSG(10, ("mappings %4u: %u\t'%s'\t%u\t%i\t%i\t%i\t%c\t%u\t%c\n",
+ data->map_qty - 1, m->flags, m->chr, m->offset,
+ m->gap[0], m->gap[1], m->gap[2], m->weight, m->mate, armWeight));
+ armWeight += 0; /* shut up used variable warning in release build */
+ CG_LINE_END();
+ } while( rc == 0 && !(m->flags & cg_eLastDNBRecord) );
+ if (rc == 0) {
+ unsigned i;
+ unsigned const n = data->map_qty;
+
+ for (i = 0; i != n && rc == 0; ++i) {
+ unsigned const mate = data->map[i].mate;
+
+ if (mate > n)
+ data->map[i].mate = n;
+ }
+ }
+ return rc;
+}
+
+static rc_t CC CGMappings25_Read(
+ const CGMappings15 *cself, TMappingsData *data)
+{
+ rc_t rc = 0;
+ TMappingsData_map* m = NULL;
+
+ assert(cself);
+
+ data->map_qty = 0;
+ do {
+ char tmp[2];
+ char armWeight = '\0';
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInsufficient);
+ break;
+ }
+ m = &data->map[data->map_qty];
+ m->saved = false;
+ /*DEBUG_MSG(10, ("mappings %4u: '%.*s'\n", data->map_qty, len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &m->flags);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, m->chr, sizeof(m->chr));
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i32(b, p - b, &m->offset);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[0]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[1]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2i16(b, p - b, &m->gap[2]);
+ CG_LINE_NEXT_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if( tmp[0] < 33 || tmp[0] > 126 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ m->weight = tmp[0];
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if( (rc = str2u32(b, p - b, &m->mate)) != 0 ) {
+ } else if( m->flags > 7 ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ } else if( ++data->map_qty >= CG_MAPPINGS_MAX ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcBuffer, rcInsufficient);
+ }
+ CG_LINE_LAST_FIELD(b, len, p);
+ rc = str2buf(b, p - b, tmp, sizeof(tmp));
+ if (rc == 0 && (tmp[0] < 33 || tmp[0] > 126)) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ armWeight = tmp[0]; /* ignore armWeight */
+ ((CGMappings15*)cself)->records++;
+ DEBUG_MSG(10, ("mappings %4u: %u\t'%s'\t%u\t%i\t%i\t%i\t%c\t%u\t%c\n",
+ data->map_qty - 1, m->flags, m->chr, m->offset,
+ m->gap[0], m->gap[1], m->gap[2], m->weight, m->mate, armWeight));
+ armWeight += 0; /* shut up used variable warning in release build */
+
+ if (rc == 0) {
+ assert(m->gap[2] == 0);
+ if (m->gap[2] != 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ if (m->flags & cg_eRevDnbStrand) {
+ assert(m->gap[0] == -1);
+ if (m->gap[0] != -1) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ }
+ else {
+ assert(m->gap[1] == -1);
+ if (m->gap[1] != -1) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ }
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Bad gap value in mapping file (File format >= v2.5)");
+ }
+ }
+
+ CG_LINE_END();
+ } while( rc == 0 && !(m->flags & cg_eLastDNBRecord) );
+ if (rc == 0) {
+ unsigned i;
+ unsigned const n = data->map_qty;
+
+ for (i = 0; i != n && rc == 0; ++i) {
+ unsigned const mate = data->map[i].mate;
+
+ if (mate > n)
+ data->map[i].mate = n;
+ }
+ }
+ return rc;
+}
+
+static const CGFileType_vt CGMappings15_vt =
+{
+ CGMappings15_Header,
+ NULL,
+ NULL,
+ CGMappings15_Read,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ CGMappings15_GetAssemblyId,
+ CGMappings15_GetSlide,
+ CGMappings15_GetLane,
+ CGMappings15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGMappings15_Release
+};
+
+static const CGFileType_vt CGMappings22_vt =
+{
+ CGMappings15_Header,
+ NULL,
+ NULL,
+ CGMappings22_Read,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ CGMappings15_GetAssemblyId,
+ CGMappings15_GetSlide,
+ CGMappings15_GetLane,
+ CGMappings15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGMappings15_Release
+};
+
+static const CGFileType_vt CGMappings25_vt = {
+ CGMappings25_Header,
+ NULL,
+ NULL,
+ CGMappings25_Read,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ CGMappings15_GetAssemblyId,
+ CGMappings15_GetSlide,
+ CGMappings15_GetLane,
+ CGMappings15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGMappings15_Release
+};
+
+static
+rc_t CC CGMappings_Make(const CGFileType** cself,
+ const CGLoaderFile* file, const CGFileType_vt* vt)
+{
+ rc_t rc = 0;
+ CGMappings15* obj = NULL;
+
+ if( cself == NULL || file == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ } else {
+ *cself = NULL;
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->file = file;
+ obj->dad.type = cg_eFileType_MAPPINGS;
+ obj->dad.vt = vt;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &obj->dad;
+ } else {
+ CGMappings15_Release(obj, NULL);
+ }
+ return rc;
+}
+
+rc_t CC CGMappings15_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGMappings_Make(self, file, &CGMappings15_vt); }
+
+rc_t CC CGMappings13_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGMappings15_Make(self, file); }
+
+rc_t CC CGMappings20_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGMappings15_Make(self, file); }
+
+rc_t CC CGMappings22_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGMappings_Make(self, file, &CGMappings22_vt); }
+
+rc_t CC CGMappings25_Make(const CGFileType **self, const CGLoaderFile *file)
+{
+ return CGMappings_Make(self, file, &CGMappings25_vt);
+}
diff --git a/tools/cg-load/factory-mappings.h b/tools/cg-load/factory-mappings.h
new file mode 100644
index 0000000..428352b
--- /dev/null
+++ b/tools/cg-load/factory-mappings.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_mappings_h_
+#define _tools_cg_load_factory_mappings_h_
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CC CGMappings13_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGMappings15_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGMappings20_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGMappings22_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGMappings25_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+
+
+#endif /* _tools_cg_load_factory_mappings_h_ */
diff --git a/tools/cg-load/factory-reads.c b/tools/cg-load/factory-reads.c
new file mode 100644
index 0000000..be194e5
--- /dev/null
+++ b/tools/cg-load/factory-reads.c
@@ -0,0 +1,448 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "debug.h"
+#include "factory-cmn.h"
+#include "factory-reads.h"
+
+typedef struct CGReads15 CGReads15;
+#define CGFILETYPE_IMPL CGReads15
+#include "file.h"
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+struct CGReads15 {
+ CGFileType dad;
+ const CGLoaderFile* file;
+ int64_t start_rowid;
+ char spot_group[512];
+ uint64_t records;
+ /* headers */
+ CGFIELD15_ASSEMBLY_ID assembly_id;
+ CGFIELD15_BATCH_FILE_NUMBER batch_file_number;
+ CGFIELD15_BATCH_OFFSET batch_offset;
+ CGFIELD15_FIELD_SIZE field_size;
+ CGFIELD15_GENERATED_AT generated_at;
+ CGFIELD15_GENERATED_BY generated_by;
+ CGFIELD15_LANE lane;
+ CGFIELD15_LIBRARY library;
+ CGFIELD15_SAMPLE sample;
+ CGFIELD15_SLIDE slide;
+ CGFIELD15_SOFTWARE_VERSION software_version;
+};
+
+static
+rc_t CC CGReads15_Header(const CGReads15* cself, const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGReads15* self = (CGReads15*)cself;
+
+ if( strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->assembly_id, sizeof(self->assembly_id));
+ } else if( strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0 ) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if( self->batch_file_number < 1 ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ } else if( strncmp("BATCH_OFFSET\t", buf, slen = 13) == 0 ) {
+ rc = str2u64(&buf[slen], len - slen, &self->batch_offset);
+ } else if( strncmp("FIELD_SIZE\t", buf, slen = 11) == 0 ) {
+ rc = str2u32(&buf[slen], len - slen, &self->field_size);
+ } else if( strncmp("GENERATED_AT\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_at, sizeof(self->generated_at));
+ } else if( strncmp("GENERATED_BY\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_by, sizeof(self->generated_by));
+ } else if( strncmp("LANE\t", buf, slen = 5) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->lane, sizeof(self->lane));
+ } else if( strncmp("LIBRARY\t", buf, slen = 8) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->library, sizeof(self->library));
+ } else if( strncmp("SAMPLE\t", buf, slen = 7) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->sample, sizeof(self->sample));
+ } else if( strncmp("SLIDE\t", buf, slen = 6) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->slide, sizeof(self->slide));
+ } else if( strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->software_version, sizeof(self->software_version));
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+ return rc;
+}
+
+static rc_t CC CGReads25_Header(const CGReads15* cself,
+ const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen = 0;
+ CGReads15* self = (CGReads15*)cself;
+
+ /* from SRA-2617 files */
+ if (strncmp("APPROVAL\t", buf, slen = 9) == 0) {
+ }
+ else if (strncmp("TITLE\t", buf, slen = 6) == 0) {
+ }
+ else if (strncmp("ADDRESS\t", buf, slen = 8) == 0) {
+ }
+
+ /* From Table 1: Header Metadata Present in all Data Files */
+ else if (strncmp("CUSTOMER_SAMPLE_ID\t", buf, slen = 19) == 0) {
+ }
+ else if (strncmp("SAMPLE_SOURCE\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("REPORTED_GENDER\t", buf, slen = 16) == 0) {
+ }
+ else if (strncmp("CALLED_GENDER\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("TUMOR_STATUS\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_SOURCE\t", buf, slen = 13) == 0) {
+ }
+
+ else if (strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->assembly_id, sizeof(self->assembly_id));
+ }
+ else if (strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if (self->batch_file_number < 1) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ }
+ else if (strncmp("BATCH_OFFSET\t", buf, slen = 13) == 0) {
+ rc = str2u64(&buf[slen], len - slen, &self->batch_offset);
+ }
+ else if (strncmp("FIELD_SIZE\t", buf, slen = 11) == 0) {
+ rc = str2u32(&buf[slen], len - slen, &self->field_size);
+ }
+ else if (strncmp("GENERATED_AT\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_at, sizeof(self->generated_at));
+ }
+ else if (strncmp("GENERATED_BY\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_by, sizeof(self->generated_by));
+ }
+ else if (strncmp("LANE\t", buf, slen = 5) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->lane, sizeof(self->lane));
+ }
+ else if (strncmp("LIBRARY\t", buf, slen = 8) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->library, sizeof(self->library));
+ }
+ else if (strncmp("SAMPLE\t", buf, slen = 7) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->sample, sizeof(self->sample));
+ }
+ else if (strncmp("SLIDE\t", buf, slen = 6) == 0) {
+ rc = str2buf(&buf[slen], len - slen, self->slide, sizeof(self->slide));
+ }
+ else if (strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->software_version, sizeof(self->software_version));
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+
+ return rc;
+}
+
+static
+rc_t CGReads15_GetAssemblyId(const CGReads15* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ if( cself->assembly_id[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *assembly_id = cself->assembly_id;
+ return 0;
+}
+
+static
+rc_t CGReads15_GetSlide(const CGReads15* cself, const CGFIELD_SLIDE_TYPE** slide)
+{
+ if( cself->slide[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *slide = cself->slide;
+ return 0;
+}
+
+static
+rc_t CGReads15_GetLane(const CGReads15* cself, const CGFIELD_LANE_TYPE** lane)
+{
+ if( cself->lane[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *lane = cself->lane;
+ return 0;
+}
+
+static
+rc_t CGReads15_GetBatchFileNumber(const CGReads15* cself, const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number)
+{
+ *batch_file_number = &cself->batch_file_number;
+ return 0;
+}
+
+
+static rc_t CC CGReads15_Read(const CGReads15* cself, TReadsData* data) {
+ rc_t rc = 0;
+
+ if (cself->start_rowid == 0) {
+ ((CGReads15*)cself)->start_rowid = data->rowid;
+ }
+ CG_LINE_START(cself->file, b, len, p);
+ if (b == NULL || len == 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcDone);
+ break;
+ }
+ /*DEBUG_MSG(10, ("reads: '%.*s'\n", len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if ((rc = str2u16(b, p - b, &data->flags)) != 0) {
+ }
+ else if (data->flags > 10) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ else if ((data->flags & 0x03) == 3 || (data->flags & 0x07) == 7) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ CG_LINE_NEXT_FIELD(b, len, p);
+ data->seq.sequence.elements = p - b;
+ if (data->seq.sequence.elements != CG_READS15_SPOT_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ else {
+ rc = str2buf(b, data->seq.sequence.elements,
+ data->read, sizeof(data->read));
+ /* clear cache, set in algnment writer */
+ data->reverse[0] = '\0';
+ data->reverse[CG_READS15_SPOT_LEN / 2] = '\0';
+ }
+ CG_LINE_LAST_FIELD(b, len, p);
+ data->seq.quality.elements = p - b;
+ if (data->seq.quality.elements != CG_READS15_SPOT_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ else {
+ rc = str2buf(b, data->seq.quality.elements,
+ data->qual, sizeof(data->qual));
+ }
+ data->seq.spot_len = CG_READS15_SPOT_LEN;
+
+ data->reads_format = 0x01050000;
+
+ if (cself->records == 0) {
+ size_t w;
+
+#if 0
+ rc = string_printf(((CGReads15*)cself)->spot_group,
+ sizeof(cself->spot_group), &w, "%s:%s:%s:%04u", cself->assembly_id,
+ cself->slide, cself->lane, cself->batch_file_number);
+#else
+ rc = string_printf(((CGReads15*)cself)->spot_group,
+ sizeof(cself->spot_group), &w, "%s-%s", cself->slide, cself->lane);
+#endif
+ data->seq.spot_group.buffer = cself->spot_group;
+ data->seq.spot_group.elements = w;
+ }
+ ((CGReads15*)cself)->records++;
+ DEBUG_MSG(10,
+ ("reads: %u\t'%s'\t'%s'\n", data->flags, data->read, data->qual));
+ CG_LINE_END();
+
+ return rc;
+}
+
+static rc_t CC CGReads25_Read(const CGReads15* cself, TReadsData* data) {
+ rc_t rc = 0;
+
+ if (cself->start_rowid == 0) {
+ ((CGReads15*)cself)->start_rowid = data->rowid;
+ }
+ CG_LINE_START(cself->file, b, len, p);
+ if (b == NULL || len == 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcDone);
+ break;
+ }
+ /*DEBUG_MSG(10, ("reads: '%.*s'\n", len, b));*/
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if ((rc = str2u16(b, p - b, &data->flags)) != 0) {
+ }
+ else if (data->flags > 10) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+ else if ((data->flags & 0x03) == 3 || (data->flags & 0x07) == 7) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ CG_LINE_NEXT_FIELD(b, len, p);
+ data->seq.sequence.elements = p - b;
+ if (data->seq.sequence.elements != CG_READS25_SPOT_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ else {
+ rc = str2buf(b, data->seq.sequence.elements,
+ data->read, sizeof(data->read));
+ /* clear cache, set in algnment writer */
+ data->reverse[0] = '\0';
+ data->reverse[CG_READS25_SPOT_LEN / 2] = '\0';
+ }
+ CG_LINE_LAST_FIELD(b, len, p);
+ data->seq.quality.elements = p - b;
+ if (data->seq.quality.elements != CG_READS25_SPOT_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ else {
+ rc = str2buf(b, data->seq.quality.elements,
+ data->qual, sizeof(data->qual));
+ }
+ data->seq.spot_len = CG_READS25_SPOT_LEN;
+
+ data->reads_format = 0x02050000;
+
+ if (cself->records == 0) {
+ size_t w;
+
+ rc = string_printf(((CGReads15*)cself)->spot_group,
+ sizeof(cself->spot_group), &w, "%s-%s", cself->slide, cself->lane);
+ data->seq.spot_group.buffer = cself->spot_group;
+ data->seq.spot_group.elements = w;
+ }
+ ((CGReads15*)cself)->records++;
+ DEBUG_MSG(10,
+ ("reads: %u\t'%s'\t'%s'\n", data->flags, data->read, data->qual));
+ CG_LINE_END();
+
+ return rc;
+}
+
+
+static
+rc_t CGReads15_GetStartRow(const CGReads15* cself, int64_t* rowid)
+{
+ *rowid = cself->start_rowid;
+ return 0;
+}
+
+static
+void CC CGReads15_Release(const CGReads15* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGReads15* self = (CGReads15*)cself;
+ if( records != NULL ) {
+ *records = cself->records;
+ }
+ free(self);
+ }
+}
+
+static const CGFileType_vt CGReads15_vt =
+{
+ CGReads15_Header,
+ CGReads15_Read,
+ CGReads15_GetStartRow,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ CGReads15_GetAssemblyId,
+ CGReads15_GetSlide,
+ CGReads15_GetLane,
+ CGReads15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGReads15_Release
+};
+
+static const CGFileType_vt CGReads25_vt = {
+ CGReads25_Header,
+ CGReads25_Read,
+ CGReads15_GetStartRow,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ CGReads15_GetAssemblyId,
+ CGReads15_GetSlide,
+ CGReads15_GetLane,
+ CGReads15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGReads15_Release
+};
+
+static rc_t CC CGReads_Make(const CGFileType** cself,
+ const CGLoaderFile* file, const CGFileType_vt *vt)
+{
+ rc_t rc = 0;
+ CGReads15* obj = NULL;
+
+ if( cself == NULL || file == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ }
+ if( rc == 0 ) {
+ *cself = NULL;
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->file = file;
+ obj->dad.type = cg_eFileType_READS;
+ obj->dad.vt = vt;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &obj->dad;
+ } else {
+ CGReads15_Release(obj, NULL);
+ }
+ return rc;
+}
+
+rc_t CC CGReads15_Make(const CGFileType** cself, const CGLoaderFile* file)
+{
+ return CGReads_Make(cself, file, &CGReads15_vt);
+}
+
+rc_t CC CGReads13_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGReads15_Make(self, file); }
+
+rc_t CC CGReads20_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGReads15_Make(self, file); }
+
+rc_t CC CGReads22_Make(const CGFileType** self, const CGLoaderFile* file)
+{ return CGReads15_Make(self, file); }
+
+rc_t CC CGReads25_Make(const CGFileType **self, const CGLoaderFile *file) {
+ return CGReads_Make(self, file, &CGReads25_vt);
+}
diff --git a/tools/cg-load/factory-reads.h b/tools/cg-load/factory-reads.h
new file mode 100644
index 0000000..84bde21
--- /dev/null
+++ b/tools/cg-load/factory-reads.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_reads_h_
+#define _tools_cg_load_factory_reads_h_
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CC CGReads13_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGReads15_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGReads20_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGReads22_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGReads25_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+
+
+#endif /* _tools_cg_load_factory_reads_h_ */
diff --git a/tools/cg-load/factory-tag-lfr.c b/tools/cg-load/factory-tag-lfr.c
new file mode 100644
index 0000000..c986f64
--- /dev/null
+++ b/tools/cg-load/factory-tag-lfr.c
@@ -0,0 +1,376 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "debug.h"
+#include "factory-cmn.h"
+#include "factory-tag-lfr.h"
+
+typedef struct CGTagLfr CGTagLfr;
+#define CGFILETYPE_IMPL CGTagLfr
+#include "file.h"
+
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+struct CGTagLfr {
+ CGFileType dad;
+ const CGLoaderFile* file;
+ int64_t start_rowid;
+ char spot_group[512];
+ uint64_t records;
+ /* headers */
+ CGFIELD15_ASSEMBLY_ID assembly_id;
+ CGFIELD15_BATCH_FILE_NUMBER batch_file_number;
+ CGFIELD15_BATCH_OFFSET batch_offset;
+ CGFIELD15_FIELD_SIZE field_size;
+ CGFIELD15_GENERATED_AT generated_at;
+ CGFIELD15_GENERATED_BY generated_by;
+ CGFIELD15_LANE lane;
+ CGFIELD15_LIBRARY library;
+ CGFIELD15_SAMPLE sample;
+ CGFIELD15_SLIDE slide;
+ CGFIELD15_SOFTWARE_VERSION software_version;
+ CGFIELD_WELL_ID wellId;
+};
+
+
+static rc_t CC CGTagLfr15_Header(const CGTagLfr* cself,
+ const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGTagLfr* self = (CGTagLfr*)cself;
+
+ if( strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->assembly_id, sizeof(self->assembly_id));
+ } else if( strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0 ) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if( self->batch_file_number < 1 ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ } else if( strncmp("BATCH_OFFSET\t", buf, slen = 13) == 0 ) {
+ rc = str2u64(&buf[slen], len - slen, &self->batch_offset);
+ } else if( strncmp("FIELD_SIZE\t", buf, slen = 11) == 0 ) {
+ rc = str2u32(&buf[slen], len - slen, &self->field_size);
+ } else if( strncmp("GENERATED_AT\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_at, sizeof(self->generated_at));
+ } else if( strncmp("GENERATED_BY\t", buf, slen = 13) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->generated_by, sizeof(self->generated_by));
+ } else if( strncmp("LANE\t", buf, slen = 5) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->lane, sizeof(self->lane));
+ } else if( strncmp("LIBRARY\t", buf, slen = 8) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->library, sizeof(self->library));
+ } else if( strncmp("SAMPLE\t", buf, slen = 7) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->sample, sizeof(self->sample));
+ } else if( strncmp("SLIDE\t", buf, slen = 6) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->slide, sizeof(self->slide));
+ } else if( strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0 ) {
+ rc = str2buf(&buf[slen], len - slen, self->software_version, sizeof(self->software_version));
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+ return rc;
+}
+
+static rc_t CC CGTagLfr25_Header(const CGTagLfr* cself,
+ const char* buf, const size_t len)
+{
+ rc_t rc = 0;
+ size_t slen;
+ CGTagLfr* self = (CGTagLfr*)cself;
+
+ /* from SRA-2617 files */
+ if (strncmp("APPROVAL\t", buf, slen = 9) == 0) {
+ }
+ else if (strncmp("TITLE\t", buf, slen = 6) == 0) {
+ }
+ else if (strncmp("ADDRESS\t", buf, slen = 8) == 0) {
+ }
+
+ /* From Table 1: Header Metadata Present in all Data Files */
+ else if (strncmp("CUSTOMER_SAMPLE_ID\t", buf, slen = 19) == 0) {
+ }
+ else if (strncmp("SAMPLE_SOURCE\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("REPORTED_GENDER\t", buf, slen = 16) == 0) {
+ }
+ else if (strncmp("CALLED_GENDER\t", buf, slen = 14) == 0) {
+ }
+ else if (strncmp("TUMOR_STATUS\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, slen = 13) == 0) {
+ }
+ else if (strncmp("LIBRARY_SOURCE\t", buf, slen = 13) == 0) {
+ }
+
+ else if (strncmp("ASSEMBLY_ID\t", buf, slen = 12) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->assembly_id, sizeof(self->assembly_id));
+ }
+ else if (strncmp("BATCH_FILE_NUMBER\t", buf, slen = 18) == 0) {
+ rc = str2u32(&buf[slen], len - slen, &self->batch_file_number);
+ if (self->batch_file_number < 1) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcOutofrange);
+ }
+ }
+ else if (strncmp("BATCH_OFFSET\t", buf, slen = 13) == 0) {
+ rc = str2u64(&buf[slen], len - slen, &self->batch_offset);
+ }
+ else if (strncmp("FIELD_SIZE\t", buf, slen = 11) == 0) {
+ rc = str2u32(&buf[slen], len - slen, &self->field_size);
+ }
+ else if (strncmp("GENERATED_AT\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_at, sizeof(self->generated_at));
+ }
+ else if (strncmp("GENERATED_BY\t", buf, slen = 13) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->generated_by, sizeof(self->generated_by));
+ }
+ else if (strncmp("LANE\t", buf, slen = 5) == 0) {
+ rc = str2buf(&buf[slen], len - slen, self->lane, sizeof(self->lane));
+ }
+ else if (strncmp("LIBRARY\t", buf, slen = 8) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->library, sizeof(self->library));
+ }
+ else if (strncmp("SAMPLE\t", buf, slen = 7) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->sample, sizeof(self->sample));
+ }
+ else if (strncmp("SLIDE\t", buf, slen = 6) == 0) {
+ rc = str2buf(&buf[slen], len - slen, self->slide, sizeof(self->slide));
+ }
+ else if (strncmp("SOFTWARE_VERSION\t", buf, slen = 17) == 0) {
+ rc = str2buf(&buf[slen], len - slen,
+ self->software_version, sizeof(self->software_version));
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcName, rcUnrecognized);
+ }
+
+ return rc;
+}
+
+
+static rc_t CGTagLfr15_GetAssemblyId(const CGTagLfr* cself,
+ const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ if( cself->assembly_id[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *assembly_id = cself->assembly_id;
+ return 0;
+}
+
+static rc_t CGTagLfr15_GetSlide(const CGTagLfr* cself,
+ const CGFIELD_SLIDE_TYPE** slide)
+{
+ if( cself->slide[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *slide = cself->slide;
+ return 0;
+}
+
+static rc_t CGTagLfr15_GetLane(const CGTagLfr* cself,
+ const CGFIELD_LANE_TYPE** lane)
+{
+ if( cself->lane[0] == '\0' ) {
+ return RC(rcRuntime, rcFile, rcReading, rcFormat, rcInvalid);
+ }
+ *lane = cself->lane;
+ return 0;
+}
+
+static rc_t CGTagLfr15_GetBatchFileNumber(const CGTagLfr* cself,
+ const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number)
+{
+ *batch_file_number = &cself->batch_file_number;
+ return 0;
+}
+
+static rc_t CGTagLfr15_GetStartRow(
+ const CGTagLfr* cself, int64_t* rowid)
+{
+ *rowid = cself->start_rowid;
+ return 0;
+}
+
+static rc_t CC CGTagLfr15_GetTagLfr(
+ const CGFILETYPE_IMPL* cself, TReadsData* data)
+{
+ rc_t rc = 0;
+ uint16_t wellScore = 0;
+ if( cself->start_rowid == 0 ) {
+ ((CGTagLfr*)cself)->start_rowid = data->rowid;
+ }
+ CG_LINE_START(cself->file, b, len, p);
+ if( b == NULL || len == 0) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInsufficient);
+ break;
+ }
+ /* reads */
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if (p - b != CG_TAG_LFR_DATA_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+ /* scores */
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if (p - b != CG_TAG_LFR_DATA_LEN) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcInvalid);
+ }
+
+ /* wellId */
+ CG_LINE_NEXT_FIELD(b, len, p);
+ if ((rc = str2u16(b, p - b, &((CGTagLfr*)cself)->wellId)) != 0) {
+ }
+ else if (cself->wellId < 0 || cself->wellId > 384) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcOutofrange);
+ }
+
+ /* wellScore */
+ CG_LINE_LAST_FIELD(b, len, p);
+ rc = str2u16(b, p - b, &wellScore);
+
+ if (rc == 0) {
+ size_t w = 0;
+ if (cself->wellId != 0) {
+ rc = string_printf(((CGTagLfr*)cself)->spot_group,
+ sizeof(cself->spot_group), &w, "%s-%s#%03d",
+ cself->slide, cself->lane, cself->wellId);
+ }
+ else {
+ rc = string_printf(((CGTagLfr*)cself)->spot_group,
+ sizeof(cself->spot_group), &w, "%s-%s",
+ cself->slide, cself->lane);
+ }
+ data->seq.spot_group.buffer = cself->spot_group;
+ data->seq.spot_group.elements = w;
+ }
+
+ ((CGTagLfr*)cself)->records++;
+
+ DEBUG_MSG(10, ("tag-lfr: '%.*s'\t%d\n",
+ (int32_t)data->seq.spot_group.elements, data->seq.spot_group.buffer,
+ cself->wellId));
+
+ CG_LINE_END();
+
+ return rc;
+}
+
+static
+void CC CGTagLfr15_Release(const CGTagLfr* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGTagLfr* self = (CGTagLfr*)cself;
+ if( records != NULL ) {
+ *records = cself->records;
+ }
+ free(self);
+ }
+}
+
+static const CGFileType_vt CGTagLfr15_vt =
+{
+ CGTagLfr15_Header,
+ NULL,
+ CGTagLfr15_GetStartRow,
+ NULL,
+ NULL,
+ NULL,
+ CGTagLfr15_GetTagLfr, /* tag_lfr */
+ CGTagLfr15_GetAssemblyId,
+ CGTagLfr15_GetSlide,
+ CGTagLfr15_GetLane,
+ CGTagLfr15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGTagLfr15_Release
+};
+
+static const CGFileType_vt CGTagLfr25_vt =
+{
+ CGTagLfr25_Header,
+ NULL,
+ CGTagLfr15_GetStartRow,
+ NULL,
+ NULL,
+ NULL,
+ CGTagLfr15_GetTagLfr, /* tag_lfr */
+ CGTagLfr15_GetAssemblyId,
+ CGTagLfr15_GetSlide,
+ CGTagLfr15_GetLane,
+ CGTagLfr15_GetBatchFileNumber,
+ NULL,
+ NULL,
+ CGTagLfr15_Release
+};
+
+static rc_t CC CGTagLfr_Make(const CGFileType **cself,
+ const CGLoaderFile *file, const CGFileType_vt *vt)
+{
+ rc_t rc = 0;
+ CGTagLfr* obj = NULL;
+
+ if( cself == NULL || file == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ }
+ if( rc == 0 ) {
+ *cself = NULL;
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->file = file;
+ obj->dad.type = cg_eFileType_TAG_LFR;
+ obj->dad.vt = vt;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &obj->dad;
+ } else {
+ CGTagLfr15_Release(obj, NULL);
+ }
+ return rc;
+}
+
+rc_t CC CGTagLfr15_Make(const CGFileType **cself,
+ const CGLoaderFile *file)
+{
+ return CGTagLfr_Make(cself, file, &CGTagLfr15_vt);
+}
+
+rc_t CC CGTagLfr25_Make(const CGFileType **cself,
+ const CGLoaderFile *file)
+{
+ return CGTagLfr_Make(cself, file, &CGTagLfr25_vt);
+}
diff --git a/tools/cg-load/factory-tag-lfr.h b/tools/cg-load/factory-tag-lfr.h
new file mode 100644
index 0000000..95a706e
--- /dev/null
+++ b/tools/cg-load/factory-tag-lfr.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_factory_tag_lfr_h_
+#define _tools_cg_load_factory_tag_lfr_h_
+
+
+#include <klib/defs.h>
+
+struct CGFileType;
+struct CGLoaderFile;
+
+rc_t CC CGTagLfr15_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+rc_t CC CGTagLfr25_Make(const struct CGFileType** self,
+ const struct CGLoaderFile* file);
+
+
+#endif /* _tools_cg_load_factory_tag_lfr_h_ */
diff --git a/tools/cg-load/file-version-factory.c b/tools/cg-load/file-version-factory.c
new file mode 100644
index 0000000..d5637bd
--- /dev/null
+++ b/tools/cg-load/file-version-factory.c
@@ -0,0 +1,165 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+#include "factory-file.h" /* CGFile15_Make ... */
+
+typedef struct CGIgnored CGIgnored;
+#define CGFILETYPE_IMPL CGIgnored
+#include "file.h" /* CGLoaderFile */
+
+#include <sysalloc.h>
+
+#include <assert.h>
+
+rc_t CGLoaderFile_CreateCGFile(CGLoaderFile* self,
+ uint32_t FORMAT_VERSION, const char* TYPE)
+{
+ assert(self && !self->cg_file);
+
+ switch (FORMAT_VERSION) {
+ case 0x01030000:
+ return CGFile13_Make(&self->cg_file, TYPE, self);
+ case 0x01050000:
+ case 0x01060000:
+ return CGFile15_Make(&self->cg_file, TYPE, self);
+ case 0x01070000:
+ return CGFile17_Make(&self->cg_file, TYPE, self);
+ case 0x02000000:
+ return CGFile20_Make(&self->cg_file, TYPE, self);
+ case 0x02020000:
+ return CGFile22_Make(&self->cg_file, TYPE, self);
+ case 0x02040000:
+ return CGFile24_Make(&self->cg_file, TYPE, self);
+ case 0x02050000:
+ return CGFile25_Make(&self->cg_file, TYPE, self);
+ default: {
+ const char* name = NULL;
+ rc_t rc = CGLoaderFile_Filename(self, &name);
+ if (rc != 0 || name == NULL)
+ { name = " | UNKNOWN | "; }
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcData, rcBadVersion);
+ PLOGERR(klogErr, (klogErr, rc,
+ "Unexpected #FORMAT_VERSION value '$(FORMAT_VERSION)' "
+ "in CG file '$(name)'",
+ "FORMAT_VERSION=%X,name=%s", FORMAT_VERSION, name));
+ return rc;
+ }
+ }
+}
+
+struct CGIgnored {
+ CGFileType dad;
+};
+
+static
+void CC CGIgnored_Release(const CGIgnored* cself, uint64_t* records)
+{
+ if( cself != NULL ) {
+ CGIgnored* self = (CGIgnored*)cself;
+ if( records != NULL ) {
+ *records = 0;
+ }
+ free(self);
+ }
+}
+
+static
+rc_t CC CGIgnored_Header(const CGIgnored* cself,
+ const char* buf, const size_t len)
+{
+ return 0;
+}
+
+static const CGFileType_vt CGIgnored_vt =
+{
+ CGIgnored_Header,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* tag_lfr */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ CGIgnored_Release
+};
+
+rc_t CGLoaderFileMakeCGFileType(const CGLoaderFile* self, const char* type,
+ const CGFileTypeFactory* factory, size_t factories,
+ const CGFileType** ftype)
+{
+ rc_t rc = 0;
+ CGIgnored* obj = NULL;
+ uint32_t i;
+
+ if (self == NULL || type == NULL ||
+ factory == NULL || factories == 0 || ftype == NULL)
+ {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcParam, rcNull);
+ }
+ else {
+ *ftype = NULL;
+
+ for (i = 0; i < factories; ++i) {
+ if (strcmp(type, factory[i].name) == 0) {
+ if (factory[i].make != NULL) {
+ return factory[i].make(ftype, self);
+ } else if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime,
+ rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ obj->dad.vt = &CGIgnored_vt;
+ obj->dad.type = factory[i].type;
+ }
+ break;
+ }
+ }
+
+ if( obj == NULL ) {
+ const char* name = NULL;
+ rc = CGLoaderFile_Filename(self, &name);
+ if (rc != 0 || name == NULL)
+ { name = " | UNKNOWN | "; }
+
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcItem, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc,
+ "Unexpected header #TYPE value '$(TYPE)' in CG file '$(name)'",
+ "TYPE=%s,name=%s", type, name));
+ }
+ }
+
+ if( rc == 0 ) {
+ *ftype = &obj->dad;
+ }
+ else {
+ CGIgnored_Release(obj, NULL);
+ }
+
+ return rc;
+}
diff --git a/tools/cg-load/file.c b/tools/cg-load/file.c
new file mode 100644
index 0000000..1fcecff
--- /dev/null
+++ b/tools/cg-load/file.c
@@ -0,0 +1,516 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+
+
+#include "debug.h"
+#include "defs.h"
+#include "factory-file.h"
+#include "file.h"
+
+#include <kapp/loader-file.h>
+
+#include <kfs/directory.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/status.h>
+
+#include <strtol.h>
+#include <sysalloc.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+rc_t CGLoaderFile_IsEof(const CGLoaderFile* cself, bool* eof)
+{
+ return KLoaderFile_IsEof(cself ? cself->file : NULL, eof);
+}
+
+rc_t CGLoaderFile_Close(const CGLoaderFile* cself)
+{
+ const char* nm;
+
+ if( KLoaderFile_FullName(cself ? cself->file : NULL, &nm) == 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "File $(file) done", "severity=status,file=%s", nm));
+ }
+ return KLoaderFile_Close(cself ? cself->file : NULL);
+}
+
+rc_t CGLoaderFile_Line(const CGLoaderFile* cself, uint64_t* line)
+{
+ return KLoaderFile_Line(cself ? cself->file : NULL, line);
+}
+
+
+rc_t CGLoaderFile_Readline(const CGLoaderFile* cself,
+ const void** buffer, size_t* length)
+{
+ return KLoaderFile_Readline(cself ? cself->file : NULL, buffer, length);
+}
+
+rc_t CGLoaderFile_Filename(
+ const CGLoaderFile* cself, const char** name)
+{
+ return KLoaderFile_Name(cself ? cself->file : NULL, name);
+}
+
+rc_t CGLoaderFile_LOG(const CGLoaderFile* cself, KLogLevel lvl,
+ rc_t rc, const char *msg, const char *fmt, ...)
+{
+ if( cself != NULL ) {
+ va_list args;
+ va_start(args, fmt);
+ rc = KLoaderFile_VLOG(cself->file, lvl, rc, msg, fmt, args);
+ va_end(args);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_Release(const CGLoaderFile* cself, bool ignored)
+{
+ rc_t rc = 0;
+
+ if( cself ) {
+ CGLoaderFile* self = (CGLoaderFile*)cself;
+ /* may return md5 check error here */
+ if( self->cg_file && self->cg_file->vt->destroy ) {
+ uint64_t recs = 0;
+ self->cg_file->vt->destroy(self->cg_file, &recs);
+ if( rc == 0 && !ignored ) {
+ const char* name = NULL;
+ CGLoaderFile_Filename(cself, &name);
+ STSMSG(0, ("file %s %lu records", name, recs));
+ }
+ }
+ rc = KLoaderFile_Release(self->file, ignored);
+ free(self);
+ }
+ return rc;
+}
+
+static rc_t parse_version(const char* buf, size_t len, uint32_t* v) {
+ rc_t rc = 0;
+ int i = 0;
+ int64_t q;
+ char* end = (char*)buf;
+ const size_t sz = sizeof(*v) / sizeof(char);
+
+ *v = 0;
+ do {
+ if( i == sz ) {
+ rc = RC(rcRuntime, rcHeader, rcConstructing, rcFile, rcBadVersion);
+ } else {
+ q = strtoi64(end, &end, 10);
+ if( q < 0 || q > 255 ) {
+ rc = RC(rcRuntime, rcHeader, rcConstructing, rcFile, rcBadVersion);
+ } else if( *end == '.' ) {
+ end++;
+ } else if( end - buf < len ) {
+ rc = RC(rcRuntime, rcHeader, rcConstructing, rcFile, rcBadVersion);
+ }
+ *v = *v | ((uint8_t)q << ((sz - ++i) * 8));
+ }
+ } while( rc == 0 && end - buf < len);
+ return rc;
+}
+
+static
+rc_t _CGLoaderFileParseLibraryType(const CGLoaderFile *self,
+ const char *buf, size_t len, uint32_t *t)
+{
+ char libraryType[64] = "";
+ rc_t rc = str2buf(buf, len, libraryType, sizeof(libraryType));
+ if (rc != 0) {
+ return rc;
+ }
+ assert(t);
+ /* From Standard Sequencing Service Data File Formats. File format v2.5 */
+ switch (libraryType[0]) {
+ case 'P': {
+ const char n[] = "PureLFR" ; /* From File format v2.5 */
+ const char s[] = "Pure LFR"; /* From submission in SRA-2617 */
+ if (string_cmp(n, sizeof n - 1, libraryType,
+ string_measure(libraryType, NULL), sizeof n - 1) == 0
+ ||string_cmp(s, sizeof s - 1, libraryType,
+ string_measure(libraryType, NULL), sizeof s - 1) == 0)
+ {
+ *t = cg_eLibraryType_PureLFR;
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcData, rcUnrecognized);
+ }
+ break;
+ }
+ case 'M': {
+ const char l[] = "Mixed-LFR";
+ const char s[] = "Mixed-STD";
+ if (string_cmp(l, sizeof l - 1, libraryType,
+ string_measure(libraryType, NULL), sizeof l - 1) == 0)
+ {
+ *t = cg_eLibraryType_MixedLFR;
+ }
+ else if (string_cmp(s, sizeof s - 1, libraryType,
+ string_measure(libraryType, NULL), sizeof s - 1) == 0)
+ {
+ *t = cg_eLibraryType_MixedSTD;
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcData, rcUnrecognized);
+ }
+ break;
+ }
+ case 'S': {
+ const char a[] = "Standard";
+ if (string_cmp(a, sizeof a - 1, libraryType,
+ string_measure(libraryType, NULL), sizeof a - 1) == 0)
+ {
+ *t = cg_eLibraryType_Standard;
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcData, rcUnrecognized);
+ }
+ break;
+ }
+ default:
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcData, rcUnrecognized);
+ break;
+ }
+ if (rc != 0) {
+ CGLoaderFile_LOG(self, klogErr, rc,
+ "unexpected LIBRARY_TYPE value <$(t)>", "t=%s", libraryType);
+ }
+ return rc;
+}
+
+static
+rc_t CGLoaderFile_header(const CGLoaderFile* cself)
+{
+ rc_t rc = 0;
+
+ if( cself->cg_file == NULL ) {
+ CGLoaderFile* self = (CGLoaderFile*)cself;
+ const char* buf;
+ size_t len;
+ uint32_t fver = 0;
+ char type[64] = "";
+ uint32_t libraryType = cg_eLibraryType_Unknown;
+
+ do {
+ if ((rc = CGLoaderFile_Readline(self, (const void**)&buf, &len))
+ == 0)
+ {
+ if( buf == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcData, rcTooShort);
+ } else if( len == 0 ) {
+ /* empty line: skip */
+ } else if( buf[0] == '>' ) {
+ /* start of records */
+ break;
+ }
+ else if( buf[0] == '#' ) {
+ len--; buf++;
+ if (strncmp("FORMAT_VERSION\t", buf, 15) == 0) {
+ rc = parse_version(&buf[15], len - 15, &fver);
+ }
+ else if (strncmp("LIBRARY_TYPE\t", buf, 13) == 0) {
+ rc = _CGLoaderFileParseLibraryType(cself,
+ &buf[13], len - 13, &libraryType);
+ }
+ else if (strncmp("TYPE\t", buf, 5) == 0) {
+ rc = str2buf(&buf[5], len - 5, type, sizeof(type));
+ }
+ }
+ else {
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcData, rcUnrecognized);
+ }
+ }
+ } while (rc == 0 && self->cg_file == NULL);
+
+ if (rc == 0) {
+ rc = CGLoaderFile_CreateCGFile(self, fver, type);
+
+ if( rc == 0 ) {
+ CGFileType* f = (CGFileType*)self->cg_file;
+ f->format_version = fver;
+ f->libraryType = libraryType;
+
+ if (f->type == cg_eFileType_Unknown ||
+ !f->vt || !f->vt->header)
+ {
+ rc = RC(rcRuntime, rcFile, rcConstructing,
+ rcInterface, rcIncomplete);
+ }
+ }
+ if( rc == 0 ) {
+ /* we need to restart file for loading all header by sub class */
+ KLoaderFile_Reset(self->file);
+ }
+ while (rc == 0) {
+ if( (rc = CGLoaderFile_Readline(self, (const void**)&buf, &len)) == 0 ) {
+ if( buf == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcData, rcTooShort);
+ } else if( len == 0 ) {
+ /* empty line: skip */
+ } else if( buf[0] == '>' ) {
+ /* start of records */
+ break;
+ } else if( buf[0] == '#' ) {
+ if( strncmp("FORMAT_VERSION\t", &buf[1], 15) != 0 && strncmp("TYPE\t", &buf[1], 5) != 0 ) {
+ rc = cself->cg_file->vt->header(cself->cg_file, &buf[1], len - 1);
+ }
+ } else {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcData, rcUnrecognized);
+ }
+ }
+ }
+ }
+ /* close file after file is processed, but stay at data start */
+ KLoaderFile_SetReadAhead(self->file, self->read_ahead);
+ KLoaderFile_Close(self->file);
+ }
+
+ return rc;
+}
+
+rc_t CGLoaderFile_Make(const CGLoaderFile** cself, const KDirectory* dir, const char* filename,
+ const uint8_t* md5_digest, bool read_ahead)
+{
+ rc_t rc = 0;
+ CGLoaderFile* obj = NULL;
+
+ if( cself == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcSelf, rcNull);
+ } else if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = KLoaderFile_Make(&obj->file, dir, filename, md5_digest, false)) == 0 ) {
+ obj->read_ahead = read_ahead;
+ }
+ if( rc == 0 ) {
+ *cself = obj;
+ } else {
+ CGLoaderFile_Release(obj, true);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetType(const CGLoaderFile* cself, CG_EFileType* type)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || type == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcClassifying, rcParam, rcNull);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ *type = cself->cg_file->type;
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetRead(const CGLoaderFile* cself, TReadsData* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || data == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_READS ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->reads == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->reads(cself->cg_file, data);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetTagLfr(const CGLoaderFile* cself, TReadsData* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || data == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_TAG_LFR ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->tag_lfr == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->tag_lfr(cself->cg_file, data);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetStartRow(const CGLoaderFile* cself, int64_t* rowid)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || rowid == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_READS ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->get_start_row == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->get_start_row(cself->cg_file, rowid);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetMapping(const CGLoaderFile* cself, TMappingsData* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || data == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_MAPPINGS ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->mappings == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->mappings(cself->cg_file, data);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetEvidenceIntervals(const CGLoaderFile* cself, TEvidenceIntervalsData* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || data == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_EVIDENCE_INTERVALS ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->evidence_intervals == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->evidence_intervals(cself->cg_file, data);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetEvidenceDnbs(const CGLoaderFile* cself, const char* interval_id, TEvidenceDnbsData* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || interval_id == NULL || data == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->type != cg_eFileType_EVIDENCE_DNBS ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( cself->cg_file->vt->evidence_dnbs == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcIncomplete);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->evidence_dnbs(cself->cg_file, interval_id, data);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetAssemblyId(const CGLoaderFile* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || assembly_id == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->assembly_id == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->assembly_id(cself->cg_file, assembly_id);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetSlide(const CGLoaderFile* cself, const CGFIELD_SLIDE_TYPE** slide)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || slide == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->slide == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->slide(cself->cg_file, slide);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetLane(const CGLoaderFile* cself, const CGFIELD_LANE_TYPE** lane)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || lane == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->lane == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->lane(cself->cg_file, lane);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetBatchFileNumber(const CGLoaderFile* cself, const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || batch_file_number == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->batch_file_number == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->batch_file_number(cself->cg_file, batch_file_number);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetSample(const CGLoaderFile* cself, const CGFIELD_SAMPLE_TYPE** sample)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || sample == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->sample == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->sample(cself->cg_file, sample);
+ }
+ return rc;
+}
+
+rc_t CGLoaderFile_GetChromosome(const CGLoaderFile* cself, const CGFIELD_CHROMOSOME_TYPE** chromosome)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || chromosome == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcParam, rcNull);
+ } else if( cself->cg_file->vt->chromosome == NULL ) {
+ rc = RC(rcRuntime, rcFile, rcReading, rcInterface, rcUnsupported);
+ } else if( (rc = CGLoaderFile_header(cself)) == 0 ) {
+ rc = cself->cg_file->vt->chromosome(cself->cg_file, chromosome);
+ }
+ return rc;
+}
diff --git a/tools/cg-load/file.h b/tools/cg-load/file.h
new file mode 100644
index 0000000..c3eea89
--- /dev/null
+++ b/tools/cg-load/file.h
@@ -0,0 +1,334 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_file_h_
+#define _tools_cg_load_file_h_
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include "defs.h"
+#include "writer-seq.h"
+#include "writer-algn.h"
+#include "writer-evidence-intervals.h"
+#include "writer-evidence-dnbs.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <strtol.h>
+
+
+/* some usefull utils */
+/* strchr but in fixed size buffer (not asciiZ!) */
+static __inline__ const char* str_chr(const char* str, const size_t len, char sep)
+{
+ const char* end = str + len;
+ while( str < end ) {
+ if( *str == sep ) {
+ break;
+ }
+ str++;
+ }
+ return str == end ? NULL : str;
+}
+
+static __inline__
+rc_t str2buf(const char* str, const size_t len, char* buf, const size_t buf_sz)
+{
+ if( buf_sz <= len ) {
+ rc_t rc = RC(rcRuntime, rcString, rcCopying, rcBuffer, rcInsufficient);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc, "'$(str)': $(sz) <= $(len)",
+ "str=%.*s,sz=%lu,len=%lu", len, str, buf_sz, len));
+ }
+ return rc;
+ }
+ memmove(buf, str, len);
+ buf[len] = '\0';
+ return 0;
+}
+
+static __inline__
+rc_t str2unsigned(const char* str, const size_t len, uint64_t max, uint64_t* value)
+{
+ char* end;
+ int64_t q;
+
+ if( len == 0 ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcTooShort);
+ }
+ q = strtou64(str, &end, 10);
+ if( end - str != len ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcInvalid);
+ }
+ if( q < 0 || ( uint64_t ) q > max ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcOutofrange);
+ }
+ *value = q;
+ return 0;
+}
+static __inline__
+rc_t str2u64(const char* str, const size_t len, uint64_t* value)
+{
+ rc_t rc;
+ uint64_t q;
+
+ if( (rc = str2unsigned(str, len, -1, &q)) == 0 ) {
+ *value = q;
+ }
+ return rc;
+}
+
+static __inline__
+rc_t str2signed(const char* str, const size_t len, int64_t min, int64_t max, int64_t* value)
+{
+ char* end;
+ int64_t q;
+
+ if( len == 0 ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcTooShort);
+ }
+ q = strtoi64(str, &end, 10);
+ if( end - str != len ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcInvalid);
+ }
+ if( q < min || q > max ) {
+ return RC(rcRuntime, rcString, rcConverting, rcData, rcOutofrange);
+ }
+ *value = q;
+ return 0;
+}
+static __inline__
+rc_t str2i64(const char* str, const size_t len, int64_t* value)
+{
+ rc_t rc;
+ int64_t q;
+
+#if _ARCH_BITS == 32
+ if( (rc = str2signed(str, len, -0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL, &q)) == 0 ) {
+ *value = q;
+ }
+#else
+ if( (rc = str2signed(str, len, -0x7FFFFFFFFFFFFFFFL, 0x7FFFFFFFFFFFFFFFL, &q)) == 0 ) {
+ *value = q;
+ }
+#endif
+ return rc;
+}
+static __inline__
+rc_t str2i32(const char* str, const size_t len, int32_t* value)
+{
+ rc_t rc;
+ int64_t q;
+
+ if( (rc = str2signed(str, len, -0x7FFFFFFF - 1, 0x7FFFFFFF, &q)) == 0 ) {
+ *value = ( int32_t ) q;
+ }
+ return rc;
+}
+static __inline__
+rc_t str2u32(const char* str, const size_t len, uint32_t* value)
+{
+ rc_t rc;
+ uint64_t q;
+
+ if( (rc = str2unsigned(str, len, 0xFFFFFFFF, &q)) == 0 ) {
+ *value = ( uint32_t ) q;
+ }
+ return rc;
+}
+static __inline__
+rc_t str2i16(const char* str, const size_t len, int16_t* value)
+{
+ rc_t rc;
+ int64_t q;
+
+ if( (rc = str2signed(str, len, -0x7FFF - 1, 0x7FFF, &q)) == 0 ) {
+ *value = ( int16_t ) q;
+ }
+ return rc;
+}
+static __inline__
+rc_t str2u16(const char* str, const size_t len, uint16_t* value)
+{
+ rc_t rc;
+ uint64_t q;
+
+ if( (rc = str2unsigned(str, len, 0xFFFF, &q)) == 0 ) {
+ *value = ( uint16_t ) q;
+ }
+ return rc;
+}
+#define CG_LINE_START(file, buf, len, res) \
+ do { \
+ const char* buf, *res; \
+ size_t len; \
+ if( (rc = CGLoaderFile_Readline(file, (const void**)&buf, &len)) != 0 ) { \
+ break; \
+ } \
+ res = buf - 1;
+
+#define CG_LINE_NEXT_FIELD(buf, len, res) \
+ if( rc != 0 ) { \
+ break; \
+ } else { \
+ len -= ++res - buf; \
+ buf = res; \
+ if( (res = str_chr(buf, len, '\t')) == NULL ) { \
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcCorrupt); \
+ break; \
+ } \
+ }
+
+#define CG_LINE_LAST_FIELD(buf, len, res) \
+ if( rc != 0 ) { \
+ break; \
+ } else { \
+ len -= ++res - buf; \
+ buf = res; \
+ res = buf + len; \
+ if( str_chr(buf, len, '\t') != NULL ) { \
+ rc = RC(rcRuntime, rcFile, rcReading, rcData, rcCorrupt); \
+ break; \
+ } \
+ }
+
+#define CG_LINE_END() \
+ } while(false)
+
+#ifndef CGFILETYPE_IMPL
+#define CGFILETYPE_IMPL CGFileType
+#endif
+
+typedef struct CGFileType CGFileType;
+
+typedef struct CGFileType_vt_struct {
+ rc_t ( CC *header ) (const CGFILETYPE_IMPL* self, const char* buf, const size_t len);
+
+ rc_t ( CC *reads ) (const CGFILETYPE_IMPL* cself, TReadsData* data);
+ rc_t ( CC *get_start_row ) (const CGFILETYPE_IMPL* cself, int64_t* rowid);
+ rc_t ( CC *mappings ) (const CGFILETYPE_IMPL* cself, TMappingsData* data);
+ rc_t ( CC *evidence_intervals )(const CGFILETYPE_IMPL* cself, TEvidenceIntervalsData* data);
+ rc_t ( CC *evidence_dnbs )(const CGFILETYPE_IMPL* cself, const char* interval_id, TEvidenceDnbsData* data);
+ rc_t ( CC *tag_lfr )(const CGFILETYPE_IMPL* cself, TReadsData* data);
+
+ rc_t ( CC *assembly_id) (const CGFILETYPE_IMPL* self, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id);
+ rc_t ( CC *slide) (const CGFILETYPE_IMPL* self, const CGFIELD_SLIDE_TYPE** slide);
+ rc_t ( CC *lane) (const CGFILETYPE_IMPL* self, const CGFIELD_LANE_TYPE** lane);
+ rc_t ( CC *batch_file_number) (const CGFILETYPE_IMPL* self, const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number);
+ rc_t ( CC *sample) (const CGFILETYPE_IMPL* self, const CGFIELD_SAMPLE_TYPE** sample);
+ rc_t ( CC *chromosome) (const CGFILETYPE_IMPL* self, const CGFIELD_CHROMOSOME_TYPE** chromosome);
+
+ void ( CC *destroy ) (const CGFILETYPE_IMPL* self, uint64_t* records);
+} CGFileType_vt;
+
+struct CGFileType {
+ uint32_t format_version;
+ CG_EFileType type;
+ CG_ELibraryType libraryType;
+ const CGFileType_vt* vt;
+};
+
+typedef struct CGLoaderFile
+{
+ bool read_ahead;
+ const struct KLoaderFile *file;
+ const CGFileType* cg_file;
+} CGLoaderFile;
+
+typedef struct CGFileTypeFactory {
+ const char* name;
+ CG_EFileType type;
+ rc_t ( CC *make ) (const CGFileType** self, const CGLoaderFile* file);
+} CGFileTypeFactory;
+
+rc_t CGLoaderFile_Make(const CGLoaderFile **cself, const KDirectory* dir, const char* filename,
+ const uint8_t* md5_digest, bool read_ahead);
+
+rc_t CGLoaderFile_Release(const CGLoaderFile* cself, bool ignored);
+
+/* returns true if eof is reached and buffer is empty */
+rc_t CGLoaderFile_IsEof(const CGLoaderFile* cself, bool* eof);
+
+/* closes the underlying file */
+rc_t CGLoaderFile_Close(const CGLoaderFile* cself);
+
+/* returns current 1-based line number in file */
+rc_t CGLoaderFile_Line(const CGLoaderFile* cself, uint64_t* line);
+
+rc_t CGLoaderFile_Filename(const CGLoaderFile *cself, const char** name);
+
+rc_t CGLoaderFile_LOG(const CGLoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ...);
+
+rc_t CGLoaderFile_GetType(const CGLoaderFile* cself, CG_EFileType* type);
+
+rc_t CGLoaderFile_GetRead(const CGLoaderFile* cself, TReadsData* data);
+rc_t CGLoaderFile_GetStartRow(const CGLoaderFile* cself, int64_t* rowid);
+
+rc_t CGLoaderFile_GetTagLfr(const CGLoaderFile* cself, TReadsData* data);
+
+rc_t CGLoaderFile_GetMapping(const CGLoaderFile* cself, TMappingsData* data);
+
+rc_t CGLoaderFile_GetEvidenceIntervals(const CGLoaderFile* cself, TEvidenceIntervalsData* data);
+
+rc_t CGLoaderFile_GetEvidenceDnbs(const CGLoaderFile* cself, const char* interval_id, TEvidenceDnbsData* data);
+
+rc_t CGLoaderFile_GetAssemblyId(const CGLoaderFile* cself, const CGFIELD_ASSEMBLY_ID_TYPE** assembly_id);
+rc_t CGLoaderFile_GetSlide(const CGLoaderFile* cself, const CGFIELD_SLIDE_TYPE** slide);
+rc_t CGLoaderFile_GetLane(const CGLoaderFile* cself, const CGFIELD_LANE_TYPE** lane);
+rc_t CGLoaderFile_GetBatchFileNumber(const CGLoaderFile* cself, const CGFIELD_BATCH_FILE_NUMBER_TYPE** batch_file_number);
+rc_t CGLoaderFile_GetSample(const CGLoaderFile* cself, const CGFIELD_SAMPLE_TYPE** sample);
+rc_t CGLoaderFile_GetChromosome(const CGLoaderFile* cself, const CGFIELD_CHROMOSOME_TYPE** chromosome);
+
+
+/* Readline
+ * makes next line from a file available in buffer.
+ * eligable EOL symbols are: \n (unix), \r (older mac), \r\n (win)
+ * EOL symbol(s) never included in buffer length.
+ * line is \0 terminated.
+ * if there is no EOL at EOF - not an error.
+ * fails if internal buffer is insufficient.
+ * buffer is NULL on EOF
+ * rc state of (rcString rcTooLong) means line was too long
+ * you may copy line and readline again for the tail of the line
+ *
+ * "buffer" [ OUT ] and "length" [ OUT ] - returned line and it's length
+ */
+rc_t CGLoaderFile_Readline(const CGLoaderFile* cself, const void** buffer, size_t* length);
+
+rc_t CGLoaderFile_CreateCGFile(CGLoaderFile* self,
+ uint32_t FORMAT_VERSION, const char* TYPE);
+
+rc_t CGLoaderFileMakeCGFileType(const CGLoaderFile* self, const char* type,
+ const CGFileTypeFactory* factory, size_t factories,
+ const CGFileType** ftype);
+
+#endif /* _tools_cg_load_file_h_ */
diff --git a/tools/cg-load/formats.c b/tools/cg-load/formats.c
new file mode 100644
index 0000000..e3808cc
--- /dev/null
+++ b/tools/cg-load/formats.c
@@ -0,0 +1,54 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "defs.h" /* CG_FORMAT_2_5 */
+#include "formats.h" /* get_cg_reads_ngaps */
+
+#include <assert.h>
+
+
+/* CG native format files have some changes since version 2.5 */
+
+
+uint32_t get_cg_reads_ngaps(uint32_t reads_format) {
+ assert(reads_format);
+
+ return reads_format < CG_FORMAT_2_5 ? 3 : 2;
+}
+
+/* IN FORMAT VERSION 2.5 SPOT LENGTH WAS CHANGES FROM 70 to 60 */
+uint32_t get_cg_read_len(uint32_t reads_format) {
+ uint32_t spot_len = CG_READS15_SPOT_LEN;
+
+ assert(reads_format);
+
+ if (reads_format >= CG_FORMAT_2_5) {
+ spot_len = CG_READS25_SPOT_LEN;
+ }
+
+ return spot_len / 2;
+}
diff --git a/tools/cg-load/formats.h b/tools/cg-load/formats.h
new file mode 100644
index 0000000..d378442
--- /dev/null
+++ b/tools/cg-load/formats.h
@@ -0,0 +1,41 @@
+#ifndef _tools_cg_load_formats_h_
+#define _tools_cg_load_formats_h_
+
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include <stdint.h> /* uint32_t */
+
+
+/* CG native format files have some changes since version 2.5 */
+
+
+uint32_t get_cg_reads_ngaps(uint32_t reads_format);
+uint32_t get_cg_read_len (uint32_t reads_format);
+
+
+#endif /* _tools_cg_load_formats_h_ */
diff --git a/tools/cg-load/writer-algn.c b/tools/cg-load/writer-algn.c
new file mode 100644
index 0000000..4015250
--- /dev/null
+++ b/tools/cg-load/writer-algn.c
@@ -0,0 +1,825 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "debug.h" /* DEBUG_MSG */
+#include "defs.h" /* cg_eRightHalfDnbMap */
+#include "formats.h" /* get_cg_reads_ngaps */
+#include "writer-algn.h" /* CGWriterAlgn */
+
+#include <align/align.h> /* NCBI_align_ro_complete_genomics */
+#include <align/dna-reverse-cmpl.h> /* DNAReverseCompliment */
+
+#include <klib/log.h> /* PLOGERR */
+#include <klib/rc.h>
+#include <klib/sort.h> /* ksort */
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <math.h> /* pow */
+#include <string.h> /* strcmp */
+
+
+typedef struct CGWriterAlgn_match_struct {
+ /* filled out by ReferenceMgr_Compress */
+ INSDC_coord_zero read_start;
+ INSDC_coord_len read_len;
+ bool has_ref_offset[CG_READS15_SPOT_LEN];
+ int32_t ref_offset[CG_READS15_SPOT_LEN];
+ uint8_t ref_offset_type[CG_READS15_SPOT_LEN];
+ bool has_mismatch[CG_READS15_SPOT_LEN];
+ char mismatch[CG_READS15_SPOT_LEN];
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ /* fill oud here */
+ int64_t seq_spot_id;
+ INSDC_coord_one seq_read_id;
+ bool ref_orientation;
+ uint32_t mapq;
+ /* used only only in secondary */
+ bool mate_ref_orientation;
+ int64_t mate_ref_id;
+ INSDC_coord_zero mate_ref_pos;
+ INSDC_coord_zero template_len;
+ INSDC_coord_len ref_len;
+} CGWriterAlgn_match;
+
+struct CGWriterAlgn {
+ const ReferenceMgr* rmgr;
+ const TableWriterAlgn* primary;
+ const TableWriterAlgn* secondary;
+ TableWriterAlgnData algn[CG_MAPPINGS_MAX];
+ CGWriterAlgn_match match[CG_MAPPINGS_MAX];
+ TMappingsData data;
+ uint32_t min_mapq;
+ bool single_mate;
+ uint64_t forced_pairs_cnt;
+ uint64_t dropped_mates_cnt;
+};
+
+
+static uint32_t global_cluster_size;
+
+rc_t CGWriterAlgn_Make(const CGWriterAlgn** cself, TMappingsData** data, VDatabase* db, const ReferenceMgr* rmgr,
+ uint32_t min_mapq, bool single_mate, uint32_t cluster_size)
+{
+ rc_t rc = 0;
+ CGWriterAlgn* self;
+
+ if( cself == NULL || db == NULL ) {
+ return RC(rcExe, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ if( (rc = TableWriterAlgn_Make(&self->primary, db,
+ ewalgn_tabletype_PrimaryAlignment, ewalgn_co_SEQ_SPOT_ID | ewalgn_co_unsorted)) != 0 ){
+ LOGERR(klogErr, rc, "primary alignment table");
+ } else if( (rc = TableWriterAlgn_Make(&self->secondary, db,
+ ewalgn_tabletype_SecondaryAlignment, ewalgn_co_SEQ_SPOT_ID | ewalgn_co_unsorted)) != 0 ) {
+ LOGERR(klogErr, rc, "secondary alignment table");
+ } else {
+ int i;
+ /* interconnect buffers */
+ for(i = 0; i < CG_MAPPINGS_MAX; i++) {
+ self->algn[i].seq_spot_id.buffer = &self->match[i].seq_spot_id;
+ self->algn[i].seq_spot_id.elements = 1;
+
+ self->algn[i].seq_read_id.buffer = &self->match[i].seq_read_id;
+ self->algn[i].seq_read_id.elements = 1;
+
+ self->algn[i].read_start.buffer = &self->match[i].read_start;
+
+ self->algn[i].read_len.buffer = &self->match[i].read_len;
+
+ self->algn[i].has_ref_offset.buffer = self->match[i].has_ref_offset;
+
+ self->algn[i].ref_offset.buffer = self->match[i].ref_offset;
+
+ self->algn[i].ref_offset_type.buffer = self->match[i].ref_offset_type;
+
+ self->algn[i].ref_id.buffer = &self->match[i].ref_id;
+
+ self->algn[i].ref_start.buffer = &self->match[i].ref_start;
+
+ self->algn[i].has_mismatch.buffer = self->match[i].has_mismatch;
+
+ self->algn[i].mismatch.buffer = self->match[i].mismatch;
+
+ self->algn[i].ref_orientation.buffer = &self->match[i].ref_orientation;
+ self->algn[i].ref_orientation.elements = 1;
+
+ self->algn[i].mapq.buffer = &self->match[i].mapq;
+ self->algn[i].mapq.elements = 1;
+
+ self->algn[i].mate_ref_orientation.buffer = &self->match[i].mate_ref_orientation;
+ self->algn[i].mate_ref_orientation.elements = 1;
+
+ self->algn[i].mate_ref_id.buffer = &self->match[i].mate_ref_id;
+ self->algn[i].mate_ref_id.elements = 1;
+
+ self->algn[i].mate_ref_pos.buffer = &self->match[i].mate_ref_pos;
+ self->algn[i].mate_ref_pos.elements = 1;
+
+ self->algn[i].template_len.buffer = &self->match[i].template_len;
+ self->algn[i].template_len.elements = 1;
+ }
+ self->rmgr = rmgr;
+ self->min_mapq = min_mapq;
+ self->single_mate = single_mate;
+ global_cluster_size = cluster_size;
+ *data = &self->data;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ CGWriterAlgn_Whack(self, false, NULL, NULL);
+ }
+ return rc;
+}
+
+rc_t CGWriterAlgn_Whack(const CGWriterAlgn* cself, bool commit, uint64_t* rows_1st, uint64_t* rows_2nd)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ CGWriterAlgn* self = (CGWriterAlgn*)cself;
+ rc_t rc1 = TableWriterAlgn_Whack(cself->primary, commit, rows_1st);
+ rc_t rc2 = TableWriterAlgn_Whack(cself->secondary, commit, rows_2nd);
+ if( self->forced_pairs_cnt > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "$(forced_pairs_cnt) forced pairs to PRIMARY", "forced_pairs_cnt=%lu", self->forced_pairs_cnt));
+ }
+ if( self->dropped_mates_cnt > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "$(dropped_mates_cnt) dropped duplicate mates in SECONDARY", "dropped_mates_cnt=%lu", self->dropped_mates_cnt));
+ }
+ rc = rc1 ? rc1 : rc2;
+ free(self);
+ }
+ return rc;
+}
+
+static
+rc_t CGWriterAlgn_Save(CGWriterAlgn *const self,
+ TReadsData *const rd,
+ TableWriterAlgn const *const writer,
+ uint32_t const mate,
+ int64_t *const rowid)
+{
+ rc_t rc = 0;
+ TMappingsData_map *const map = &self->data.map[mate];
+
+ if( !map->saved ) {
+ CGWriterAlgn_match *const match = &self->match[mate];
+ TableWriterAlgnData *const algn = &self->algn[mate];
+
+ uint32_t g = 0;
+
+ uint32_t* cigar = NULL;
+ uint32_t left_cigar15 []={ 5 << 4, 0, 10 << 4, 0, 10 << 4, 0,10 << 4 };
+ uint32_t right_cigar15[]={ 10 << 4, 0, 10 << 4, 0, 10 << 4, 0, 5 << 4 };
+ uint32_t left_cigar25 []={ 10 << 4, 0, 10 << 4, 0, 10 << 4, 0, 0 };
+ uint32_t right_cigar25[]={ 10 << 4, 0, 10 << 4, 0, 10 << 4, 0, 0 };
+ uint32_t *left_cigar = NULL;
+ uint32_t *right_cigar = NULL;
+ uint32_t cg_reads_ngaps = 0;
+
+ const char *read = NULL;
+ uint32_t read_len = 0;
+
+ assert(rd);
+
+ cg_reads_ngaps = get_cg_reads_ngaps(rd->reads_format);
+
+ read_len = rd->seq.spot_len / 2;
+ if (cg_reads_ngaps == 3) {
+ left_cigar = left_cigar15;
+ right_cigar = right_cigar15;
+ }
+ else if (cg_reads_ngaps == 2) {
+ left_cigar = left_cigar25;
+ right_cigar = right_cigar25;
+ }
+ else {
+ assert(0);
+ }
+
+ if (match->seq_read_id == 2) {
+ read = &((const char*)(rd->seq.sequence.buffer))[read_len];
+ cigar = right_cigar;
+ g = read_len;
+ }
+ else {
+ read = rd->seq.sequence.buffer;
+ cigar = left_cigar;
+ g = 0;
+ }
+ if (match->ref_orientation) {
+ if( rd->reverse[g] == '\0' ) {
+ if( (rc = DNAReverseCompliment(read, &rd->reverse[g], read_len)) != 0) {
+ return rc;
+ }
+ DEBUG_MSG(10, ("'%.*s' -> cg_eRevDnbStrand: '%.*s'\n", read_len, read, read_len, &rd->reverse[g]));
+ }
+ read = &rd->reverse[g];
+ cigar = (cigar == left_cigar) ? right_cigar : left_cigar;
+ }
+ for(g = 0; g < cg_reads_ngaps; g++) {
+ if( map->gap[g] > 0 ) {
+ cigar[g * 2 + 1] = (map->gap[g] << 4) | 3; /* 'xN' */
+ } else if( map->gap[g] < 0 ) {
+ cigar[g * 2 + 1] = (-map->gap[g] << 4) | 9; /* 'xB' */
+ } else {
+ cigar[g * 2 + 1] = 0; /* '0M' */
+ }
+ }
+ algn->ploidy = 0;
+ if( (rc = ReferenceMgr_Compress(self->rmgr, ewrefmgr_cmp_Binary,
+ map->chr, map->offset, read, read_len, cigar, 7, 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_complete_genomics, algn)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "compression failed $(id) $(o)",
+ PLOG_2(PLOG_S(id),PLOG_I32(o)), map->chr, map->offset));
+ }
+ else {
+#if 1
+ /* this is to try represent these alignments as unmated to match cgatools
+ * axf uses the row length of MATE_REF_ORIENTATION as the indicator of
+ * mate presence
+ */
+ unsigned const save = algn->mate_ref_orientation.elements;
+
+ if (map->mate == mate)
+ algn->mate_ref_orientation.elements = 0;
+
+ rc = TableWriterAlgn_Write(writer, algn, rowid);
+
+ if (map->mate == mate)
+ algn->mate_ref_orientation.elements = save;
+#else
+ rc = TableWriterAlgn_Write(writer, algn, rowid);
+#endif
+ map->saved = true;
+ }
+ }
+
+ return rc;
+}
+
+#if 1
+static
+double JointQ(double const Q1, double const Q2)
+{
+ double const P1 = 1.0 - pow(10.0, Q1/-10.0); /* prob that 1 is not incorrect */
+ double const P2 = 1.0 - pow(10.0, Q2/-10.0); /* prob that 2 is not incorrect */
+ double const Pj = 1.0 - P1*P2; /* prob that 1+2 is incorrect */
+ double const Q = -10.0 * log10(Pj);
+
+ return Q;
+}
+
+static
+unsigned FindBestPair(TMappingsData *const data)
+{
+ unsigned const N = data->map_qty;
+ unsigned i;
+ double maxq;
+ unsigned best = N;
+
+ /* pick best of the reciprocal pairs */
+ for (i = 0, maxq = -1.0; i != N; ++i) {
+ unsigned const mate = data->map[i].mate;
+ bool const is_left = (data->map[i].flags & cg_eRightHalfDnbMap) == 0;
+
+ if (mate < N && mate != i && data->map[mate].mate == i && is_left) {
+ double const Q1 = (int)data->map[i].weight - 33;
+ double const Q2 = (int)data->map[mate].weight - 33;
+ double const q = JointQ(Q1, Q2);
+
+ assert(Q1 >= 0);
+ assert(Q2 >= 0);
+ assert(q >= 0);
+ if (maxq < q) {
+ maxq = q;
+ best = i;
+ }
+ }
+ }
+ if (best < N)
+ return best;
+
+ /* no reciprocal pairs, pick best of any pair */
+ for (i = 0, maxq = 0.0; i != N; ++i) {
+ unsigned const mate = data->map[i].mate;
+ if (mate < N && mate != i) {
+ double const Q1 = (int)data->map[i].weight - 33;
+ double const Q2 = (int)data->map[mate].weight - 33;
+ double const q = JointQ(Q1, Q2);
+
+ assert(Q1 >= 0);
+ assert(Q2 >= 0);
+ assert(q >= 0);
+ if (maxq < q) {
+ maxq = q;
+ best = i;
+ }
+ }
+ }
+ if (best == N) {
+ /* no pair with a joint Q > 0; pick best mapping */
+ for (i = 0, maxq = 0.0; i != N; ++i) {
+ unsigned const mate = data->map[i].mate;
+ if (mate < N && mate != i) {
+ double const q = (int)data->map[i].weight - 33;
+
+ if (maxq < q) {
+ maxq = q;
+ best = i;
+ }
+ }
+ }
+ if (best == N) {
+ /* no mapping with Q > 0; pick first */
+ for (i = 0, maxq = 0.0; i != N; ++i) {
+ unsigned const mate = data->map[i].mate;
+ if (mate < N && mate != i) {
+ best = i;
+ break;
+ }
+ }
+ if (best == N) {
+ /* give up */
+ return N;
+ }
+ }
+ }
+ {
+ /* make the pair reciprocal */
+ unsigned const mate = data->map[best].mate;
+
+ if (mate < N) {
+ data->map[mate].mate = best;
+ return (data->map[best].flags & cg_eRightHalfDnbMap) ? mate : best;
+ }
+ return N;
+ }
+}
+
+static
+unsigned FindBestLeft(TMappingsData *const data)
+{
+ unsigned const N = data->map_qty;
+ unsigned i;
+ unsigned best;
+ int maxq;
+
+ for (best = N, maxq = -1, i = 0; i != N; ++i) {
+ int const q = (int)data->map[i].weight;
+
+ if ((data->map[i].flags & cg_eRightHalfDnbMap) == 0 && maxq < q) {
+ maxq = q;
+ best = i;
+ }
+ }
+ return best;
+}
+
+static
+unsigned FindBestRight(TMappingsData *const data)
+{
+ unsigned const N = data->map_qty;
+ unsigned i;
+ unsigned best;
+ int maxq;
+
+ for (best = N, maxq = -1, i = 0; i != N; ++i) {
+ int const q = (int)data->map[i].weight;
+
+ if ((data->map[i].flags & cg_eRightHalfDnbMap) != 0 && maxq < q) {
+ maxq = q;
+ best = i;
+ }
+ }
+ return best;
+}
+
+static
+bool check_in_cluster(TMappingsData_map const *const a, TMappingsData_map const *const b)
+{
+ if ( (a->flags & cg_eRightHalfDnbMap) == (b->flags & cg_eRightHalfDnbMap)
+ && (strcmp(a->chr, b->chr) == 0)
+ && abs((int)a->offset - (int)b->offset) <= global_cluster_size)
+ {
+ return true;
+ }
+ return false;
+}
+
+static
+int64_t clustering_sort_cb(void const *const A, void const *const B, void *const ctx)
+{
+ TMappingsData const *const data = (TMappingsData const *)ctx;
+ unsigned const ia = *(unsigned const *)A;
+ unsigned const ib = *(unsigned const *)B;
+ TMappingsData_map const *const a = &data->map[ia];
+ TMappingsData_map const *const b = &data->map[ib];
+ int64_t res;
+ unsigned j = 0;
+
+ res = (int64_t)(a->flags & cg_eRightHalfDnbMap) - (int64_t)(b->flags & cg_eRightHalfDnbMap); /**** separate by DNP side ***/
+ if (res) return res;
+
+ res = strcmp(a->chr, b->chr); /* same chromosome ? **/
+ if (res) return res;
+
+ res = (a->offset - b->offset) / (global_cluster_size + 1); /*** is it within the range ***/
+ if (res) return res;
+
+ /**cluster is defined here; now pick the winner **/
+ res = (int64_t)a->saved - (int64_t)b->saved; /*** if already saved **/
+ if (res) return -res;
+
+ res = (int64_t)a->weight - (int64_t)b->weight; /*** has higher score **/
+ if (res) return -res;
+
+ res = 0;
+ assert(data->cg_reads_ngaps);
+ for (j = 0; j != data->cg_reads_ngaps; ++j) {
+ res += (int64_t)(a->gap[j]) - (int64_t)(b->gap[j]);
+ } /** has lower projection on the reference **/
+
+ return res;
+}
+
+static
+void cluster_mates(TMappingsData *const data)
+{
+ unsigned index[CG_MAPPINGS_MAX];
+ unsigned i;
+ unsigned j;
+
+ for (i = 0; i != data->map_qty; ++i)
+ index[i] = i;
+
+ ksort(index, data->map_qty, sizeof(index[0]), clustering_sort_cb, data);
+ for (i = 0, j = 1; j != data->map_qty; ++j) {
+ unsigned const ii = index[i];
+ unsigned const ij = index[j];
+ TMappingsData_map *const a = &data->map[ij];
+ TMappingsData_map const *const b = &data->map[ii];
+
+ if (check_in_cluster(a, b)) {
+ unsigned const a_mate = a->mate;
+ unsigned const b_mate = b->mate;
+
+ if ( a_mate == ij /** remove singletons **/
+ || a_mate == b_mate) /** or cluster originator has the same mate **/
+ {
+ a->saved = true;
+ DEBUG_MSG(10, ("mapping %u was dropped as a part of cluster at mapping %u\n", ij, ii));
+ }
+ }
+ else
+ i = j;
+ }
+}
+
+static
+INSDC_coord_zero template_length(unsigned const self_left,
+ unsigned const mate_left,
+ unsigned const self_len,
+ unsigned const mate_len,
+ unsigned const read_id)
+{
+ /* adapted from libs/axf/template_len.c */
+ unsigned const self_right = self_left + self_len;
+ unsigned const mate_right = mate_left + mate_len;
+ unsigned const leftmost = (self_left < mate_left ) ? self_left : mate_left;
+ unsigned const rightmost = (self_right > mate_right) ? self_right : mate_right;
+ unsigned const tlen = rightmost - leftmost;
+
+ /* The standard says, "The leftmost segment has a plus sign and the rightmost has a minus sign." */
+ if ( (self_left <= mate_left && self_right >= mate_right) /* mate fully contained within self or */
+ || (mate_left <= self_left && mate_right >= self_right)) /* self fully contained within mate; */
+ {
+ if (self_left < mate_left || (read_id == 1 && self_left == mate_left))
+ return (INSDC_coord_zero)tlen;
+ else
+ return -(INSDC_coord_zero)tlen;
+ }
+ else if ( (self_right == mate_right && mate_left == leftmost) /* both are rightmost, but mate is leftmost */
+ || self_right == rightmost)
+ {
+ return -(INSDC_coord_zero)tlen;
+ }
+ else
+ return (INSDC_coord_zero)tlen;
+}
+
+static
+rc_t CGWriterAlgn_Write_int(CGWriterAlgn *const self, TReadsData *const read)
+{
+ TMappingsData *const data = &self->data;
+ unsigned const N = data->map_qty;
+ rc_t rc = 0;
+
+ if (N != 0) {
+ unsigned left_prime = N;
+ unsigned right_prime = N;
+ unsigned i;
+ unsigned countLeft = 0;
+ unsigned countRight = 0;
+
+ assert(read);
+
+ data->cg_reads_ngaps = get_cg_reads_ngaps(read->reads_format);
+ assert(data->cg_reads_ngaps);
+
+ for (i = 0; i != N; ++i) {
+ char const *const refname = data->map[i].chr;
+ unsigned j;
+ INSDC_coord_len reflen = read->seq.spot_len / 2;
+ ReferenceSeq const *rseq;
+ bool shouldUnmap = false;
+ bool wasRenamed = false;
+
+ memset(&self->match[i], 0, sizeof(self->match[i]));
+
+ rc = ReferenceMgr_GetSeq(self->rmgr, &rseq, refname, &shouldUnmap, true, &wasRenamed);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed accessing Reference '$(ref)'", "ref=%s", refname));
+ break;
+ }
+ assert(shouldUnmap == false);
+ rc = ReferenceSeq_Get1stRow(rseq, &self->match[i].ref_id); /* if the above worked, this is infallible */
+ assert(rc == 0);
+ ReferenceSeq_Release(rseq);
+
+ for (j = 0; j != data->cg_reads_ngaps; ++j) {
+ reflen += data->map[i].gap[j];
+ }
+
+ self->match[i].seq_spot_id = read->rowid;
+ self->match[i].mapq = data->map[i].weight - 33;
+ self->match[i].ref_orientation = (data->map[i].flags & cg_eRevDnbStrand) ? true : false;
+ self->match[i].ref_len = reflen;
+
+ if (data->map[i].flags & cg_eRightHalfDnbMap) {
+ self->match[i].seq_read_id = 2;
+ ++countRight;
+ }
+ else {
+ self->match[i].seq_read_id = 1;
+ ++countLeft;
+ }
+ }
+
+ if (countLeft > 0 && countRight > 0) {
+ left_prime = FindBestPair(data);
+ if (left_prime < N) {
+ right_prime = data->map[left_prime].mate;
+ }
+ else { /* force the pairing */
+ left_prime = FindBestLeft(data);
+ right_prime = FindBestRight(data);
+ data->map[left_prime].mate = right_prime;
+ data->map[right_prime].mate = left_prime;
+ }
+ for (i = 0; i != N; ++i) {
+ unsigned const mate = data->map[i].mate;
+
+ if (mate < N && mate != i) {
+ INSDC_coord_zero const tlen = (self->match[i].ref_id == self->match[mate].ref_id)
+ ? template_length(data->map[i].offset,
+ data->map[mate].offset,
+ self->match[i].ref_len,
+ self->match[mate].ref_len,
+ self->match[i].seq_read_id)
+ : 0;
+
+ self->match[i].mate_ref_id = self->match[mate].ref_id;
+ self->match[i].mate_ref_orientation = self->match[mate].ref_orientation;
+ self->match[i].mate_ref_pos = data->map[mate].offset;
+ self->match[i].template_len = tlen;
+ }
+ }
+ }
+ else if (countLeft > 0) {
+ left_prime = FindBestLeft(data);
+ }
+ else {
+ assert(countRight > 0);
+ right_prime = FindBestRight(data);
+ }
+
+ read->align_count[0] = countLeft < 254 ? countLeft : 255;
+ read->align_count[1] = countRight < 254 ? countRight : 255;
+ if (rc == 0 && left_prime < N) {
+ rc = CGWriterAlgn_Save(self, read, self->primary, left_prime,
+ &read->prim_algn_id[0]);
+ read->prim_is_reverse[0] = self->match[left_prime].ref_orientation;
+ data->map[left_prime].saved = 1;
+ }
+ if (rc == 0 && right_prime < N) {
+ rc = CGWriterAlgn_Save(self, read, self->primary, right_prime,
+ &read->prim_algn_id[1]);
+ read->prim_is_reverse[1] = self->match[right_prime].ref_orientation;
+ data->map[right_prime].saved = 1;
+ }
+ if (global_cluster_size > 0 && data->map_qty > 1 + (left_prime < N ? 1 : 0) + (right_prime < N ? 1 : 0)) {
+ cluster_mates(data);
+ }
+ for (i = 0; i != N && rc == 0; ++i) {
+ if (data->map[i].saved || self->match[i].mapq < self->min_mapq)
+ continue;
+ rc = CGWriterAlgn_Save(self, read, self->secondary, i, NULL);
+ }
+ }
+ return rc;
+}
+
+rc_t CGWriterAlgn_Write(const CGWriterAlgn* cself, TReadsData* read)
+{
+ assert(cself != NULL);
+ assert(read != NULL);
+ assert(read->seq.sequence.buffer != NULL
+ && read->seq.sequence.elements == read->seq.spot_len
+ && (read->seq.sequence.elements == CG_READS15_SPOT_LEN ||
+ read->seq.sequence.elements == CG_READS25_SPOT_LEN));
+
+ memset(read->prim_algn_id, 0, sizeof(read->prim_algn_id));
+ memset(read->align_count, 0, sizeof(read->align_count));
+ memset(read->prim_is_reverse, 0, sizeof(read->prim_is_reverse));
+
+ return CGWriterAlgn_Write_int((CGWriterAlgn *)cself, read);
+}
+
+#else
+
+rc_t CGWriterAlgn_Write(const CGWriterAlgn* cself, TReadsData* read)
+{
+ if( cself->data.map_qty != 0 ) {
+ /* primary is-found indicator: weights are ASCII-33 so they can't be 0 if found */
+ uint8_t left_weight = 0, right_weight = 0, pair_weight = 0;
+ uint32_t i, left_prim = 0, right_prim = 0, paired = 0;
+
+ CGWriterAlgn* self = (CGWriterAlgn*)cself;
+ TMappingsData* data = &self->data;
+
+ /* find best left, right and pair */
+ for(i = 0; i < data->map_qty; i++) {
+ int k = (data->map[i].flags & cg_eRightHalfDnbMap) ? 1 : 0;
+ if( read->align_count[k] < 254 ) {
+ read->align_count[k]++;
+ }
+ if( k == 0 ) {
+ if( left_weight < data->map[i].weight ) {
+ left_prim = i;
+ left_weight = data->map[i].weight;
+ }
+ } else {
+ if( right_weight < data->map[i].weight ) {
+ right_prim = i;
+ right_weight = data->map[i].weight;
+ }
+ }
+ if( i != data->map[i].mate && pair_weight < data->map[i].weight ) {
+ if( data->map[i].mate < data->map_qty ) {
+ /* note pair's left mate id */
+ paired = k == 0 ? i : data->map[i].mate;
+ pair_weight = data->map[i].weight;
+ } else {
+ /* fail safe in case mate id is out of map boundaries */
+ data->map[i].mate = i;
+ }
+ }
+ }
+ /* choose primary pair */
+ if( left_weight > right_weight && data->map[left_prim].mate != left_prim ) {
+ /* left is better and has a mate -> choose left pair */
+ right_prim = data->map[left_prim].mate;
+ right_weight = data->map[right_prim].weight;
+ } else if( right_weight > left_weight && data->map[right_prim].mate != right_prim ) {
+ /* right is better and has a mate -> choose right pair */
+ left_prim = data->map[right_prim].mate;
+ left_weight = data->map[left_prim].weight;
+ } else if( pair_weight > 0 ) {
+ /* use paired as primary */
+ left_prim = paired;
+ left_weight = data->map[left_prim].weight;
+ right_prim = data->map[left_prim].mate;
+ right_weight = data->map[right_prim].weight;
+ } else if( left_weight > 0 && right_weight > 0 ) {
+ /* force best left and right to be mates */
+ data->map[left_prim].mate = right_prim;
+ data->map[right_prim].mate = left_prim;
+ self->forced_pairs_cnt++;
+ DEBUG_MSG(10, ("forced pair: %u %u\n", left_prim, right_prim));
+ }
+#if _DEBUGGING
+ DEBUG_MSG(10, ("alignment_count [%hu,%hu]", read->align_count[0], read->align_count[1]));
+ DEBUG_MSG(10, (" left primary: "));
+ if( left_weight > 0 ) {
+ DEBUG_MSG(10, ("weight %hu [%c], id %u", left_weight, left_weight, left_prim));
+ } else {
+ DEBUG_MSG(10, ("none"));
+ }
+ DEBUG_MSG(10, ("; right primary: "));
+ if( right_weight > 0 ) {
+ DEBUG_MSG(10, ("weight %hu [%c], id %u", right_weight, right_weight, right_prim));
+ } else {
+ DEBUG_MSG(10, ("none"));
+ }
+ DEBUG_MSG(10, ("\n"));
+#endif
+ assert((left_weight == 0 && read->align_count[0] == 0) || (left_weight > 0 && read->align_count[0] > 0));
+ assert((right_weight == 0 && read->align_count[1] == 0) || (right_weight > 0 && read->align_count[1] > 0));
+
+ /* write left primary */
+ if( rc == 0 && left_weight > 0 ) {
+ rc = CGWriterAlgn_Save(self, read, self->primary, left_prim, &read->prim_algn_id[0]);
+ read->prim_is_reverse[0] = cself->match[left_prim].ref_orientation;
+ }
+ /* write right primary */
+ if( rc == 0 && right_weight > 0 ) {
+ rc = CGWriterAlgn_Save(self, read, self->primary, right_prim, &read->prim_algn_id[1]);
+ read->prim_is_reverse[1] = cself->match[right_prim].ref_orientation;
+ }
+ DEBUG_MSG(10, ("prim_algn_rowid [%li,%li], ", read->prim_algn_id[0], read->prim_algn_id[1]));
+ DEBUG_MSG(10, ("prim_is_reverse [%hu,%hu]\n", read->prim_is_reverse[0], read->prim_is_reverse[1]));
+ if( rc == 0 ) {
+ /* others go to secondary */
+ int64_t row;
+
+ rc = TableWriterAlgn_GetNextRowId(cself->secondary, &row);
+ if( global_cluster_size > 0 && data->map_qty > 1) {
+ cluster_mates(data);
+ }
+ if( cself->single_mate ) {
+ /* we need to re-mate in case original mate's weight is lower */
+ for(i = 0; rc == 0 && i < data->map_qty; i++ ) {
+ if( !data->map[i].saved && data->map[i].weight >= cself->min_mapq ) {
+ uint32_t mate = data->map[i].mate;
+ if( mate != i && data->map[mate].mate != i ) {
+ self->dropped_mates_cnt++;
+ if( data->map[data->map[mate].mate].weight < data->map[i].weight ) {
+ /* do not save my mate's mate */
+ DEBUG_MSG(10, ("mate %u dropped as pair of %u\n", data->map[mate].mate, mate));
+ data->map[data->map[mate].mate].saved = true;
+ /* repoint mate to me */
+ data->map[mate].mate = i;
+ } else {
+ /* do not save me */
+ DEBUG_MSG(10, ("mate %u dropped as pair of %u\n", i, mate));
+ data->map[i].saved = true;
+ }
+ }
+ }
+ }
+ }
+ for(i = 0; rc == 0 && i < data->map_qty; i++ ) {
+ if( !data->map[i].saved && data->map[i].weight >= cself->min_mapq ) {
+ uint32_t mate = data->map[i].mate;
+ /* no mate or mate is under-weigth */
+ if( mate == i || data->map[mate].weight < cself->min_mapq ||
+ /* or mate was saved in primary */
+ (left_weight > 0 && mate == left_prim) || (right_weight > 0 && mate == right_prim) ) {
+ self->match[i].mate_align_id = 0;
+ rc = CGWriterAlgn_Save(self, read, self->secondary, i, NULL);
+ row++;
+ } else {
+ self->match[mate].mate_align_id = row++;
+ self->match[i].mate_align_id = row++;
+ if( (rc = CGWriterAlgn_Save(self, read, self->secondary, i, NULL)) == 0 ) {
+ rc = CGWriterAlgn_Save(self, read, self->secondary, mate, NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+#endif
diff --git a/tools/cg-load/writer-algn.h b/tools/cg-load/writer-algn.h
new file mode 100644
index 0000000..b852c4d
--- /dev/null
+++ b/tools/cg-load/writer-algn.h
@@ -0,0 +1,63 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_writer_algn_h_
+#define _tools_cg_load_writer_algn_h_
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/manager.h>
+#include <insdc/insdc.h>
+#include <align/writer-alignment.h>
+#include <align/writer-reference.h>
+
+#include "writer-seq.h"
+
+typedef struct TMappingsData_map_struct {
+ bool saved;
+ uint16_t flags;
+ char chr[CG_CHROMOSOME_NAME];
+ INSDC_coord_zero offset;
+ int16_t gap[CG_READS15_NGAPS];
+ uint8_t weight;
+ uint32_t mate;
+} TMappingsData_map;
+
+typedef struct TMappingsData_struct {
+ uint16_t map_qty;
+ TMappingsData_map map[CG_MAPPINGS_MAX];
+ uint32_t cg_reads_ngaps;
+} TMappingsData;
+
+typedef struct CGWriterAlgn CGWriterAlgn;
+
+rc_t CGWriterAlgn_Make(const CGWriterAlgn** cself, TMappingsData** data, VDatabase* db, const ReferenceMgr* rmgr,
+ uint32_t min_mapq, bool single_mate, uint32_t cluster_size);
+
+rc_t CGWriterAlgn_Whack(const CGWriterAlgn* cself, bool commit, uint64_t* rows_1st, uint64_t* rows_2nd);
+
+rc_t CGWriterAlgn_Write(const CGWriterAlgn* cself, TReadsData* read);
+
+#endif /* _tools_cg_load_writer_algn_h_ */
diff --git a/tools/cg-load/writer-evidence-dnbs.c b/tools/cg-load/writer-evidence-dnbs.c
new file mode 100644
index 0000000..81d538f
--- /dev/null
+++ b/tools/cg-load/writer-evidence-dnbs.c
@@ -0,0 +1,246 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "debug.h"
+#include "defs.h"
+#include "writer-evidence-dnbs.h"
+#include "writer-evidence-intervals.h"
+
+#include <align/align.h>
+#include <align/dna-reverse-cmpl.h>
+#include <align/writer-alignment.h>
+
+#include <insdc/insdc.h>
+
+#include <kfs/file.h>
+
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct CGWriterEvdDnb_match_struct {
+
+ int64_t seq_spot_id;
+ INSDC_coord_one seq_read_id;
+
+ /* filled out by ReferenceMgr_Compress */
+ INSDC_coord_zero read_start;
+ INSDC_coord_len read_len;
+ bool has_ref_offset[CG_EVDNC_ALLELE_LEN];
+ int32_t ref_offset[CG_EVDNC_ALLELE_LEN];
+ uint8_t ref_offset_type[CG_EVDNC_ALLELE_LEN];
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ bool has_mismatch[CG_EVDNC_ALLELE_LEN];
+ char mismatch[CG_EVDNC_ALLELE_LEN];
+
+ bool ref_orientation;
+ uint32_t ref_ploidy;
+ uint32_t mapq;
+
+} CGWriterEvdDnb_match;
+
+struct CGWriterEvdDnbs {
+ const ReferenceMgr* rmgr;
+ const TableWriterAlgn* writer;
+
+ TableWriterAlgnData algn;
+ CGWriterEvdDnb_match match;
+
+ TEvidenceDnbsData data;
+
+ uint64_t bad_allele_index;
+ uint32_t read_len;
+};
+
+rc_t CGWriterEvdDnbs_Make(const CGWriterEvdDnbs **cself,
+ TEvidenceDnbsData **data, VDatabase *db, const ReferenceMgr *rmgr,
+ const uint32_t options, uint32_t read_len)
+{
+ rc_t rc = 0;
+ CGWriterEvdDnbs* self;
+
+ if( cself == NULL || db == NULL ) {
+ return RC(rcExe, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ if( (rc = TableWriterAlgn_Make(&self->writer, db, ewalgn_tabletype_EvidenceAlignment, ewalgn_co_SEQ_SPOT_ID)) == 0 ) {
+ self->algn.seq_spot_id.buffer = &self->match.seq_spot_id;
+ self->algn.seq_spot_id.elements = 1;
+ self->algn.seq_read_id.buffer = &self->match.seq_read_id;
+ self->algn.seq_read_id.elements = 1;
+
+ self->algn.read_start.buffer = &self->match.read_start;
+ self->algn.read_len.buffer = &self->match.read_len;
+ self->algn.has_ref_offset.buffer = self->match.has_ref_offset;
+ self->algn.ref_offset.buffer = self->match.ref_offset;
+ self->algn.ref_offset_type.buffer = self->match.ref_offset_type;
+ self->algn.ref_id.buffer = &self->match.ref_id;
+ self->algn.ref_id.elements = 1;
+ self->algn.ref_start.buffer = &self->match.ref_start;
+ self->algn.ref_start.elements = 1;
+ self->algn.has_mismatch.buffer = self->match.has_mismatch;
+ self->algn.mismatch.buffer = self->match.mismatch;
+ self->algn.ref_orientation.buffer = &self->match.ref_orientation;
+ self->algn.ref_orientation.elements = 1;
+ self->algn.ref_ploidy.buffer = &self->match.ref_ploidy;
+ self->algn.ref_ploidy.elements = 1;
+ self->algn.mapq.buffer = &self->match.mapq;
+ self->algn.mapq.elements = 1;
+ self->rmgr = rmgr;
+
+ /* set to 1st row for evidence_interval to collect ids */
+ self->data.last_rowid = 1;
+
+ self->read_len = read_len;
+
+ *data = &self->data;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ CGWriterEvdDnbs_Whack(self, false, NULL);
+ }
+ return rc;
+}
+
+rc_t CGWriterEvdDnbs_Whack(const CGWriterEvdDnbs* cself, bool commit, uint64_t* rows)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ CGWriterEvdDnbs* self = (CGWriterEvdDnbs*)cself;
+ if( self->bad_allele_index > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "$(bad_allele_index) bad allele_indexes in evidence dnbs",
+ "bad_allele_index=%lu", self->bad_allele_index));
+ }
+ rc = TableWriterAlgn_Whack(cself->writer, commit, rows);
+ free(self->data.dnbs);
+ free(self);
+ }
+ return rc;
+}
+
+rc_t CGWriterEvdDnbs_SetSEQ(const CGWriterEvdDnbs* cself, uint16_t dnb, const int64_t seq_spot_id_1st)
+{
+ rc_t rc = 0;
+ CGWriterEvdDnbs* self =(CGWriterEvdDnbs*)cself;
+
+ assert(cself != NULL);
+
+ self->data.dnbs[dnb].seq_spot_id = seq_spot_id_1st + self->data.dnbs[dnb].dnb_offset_in_lane_file;
+
+ return rc;
+}
+
+rc_t CGWriterEvdDnbs_Write(const CGWriterEvdDnbs* cself, const TEvidenceIntervalsData* ref, int64_t ref_rowid)
+{
+ rc_t rc = 0;
+ uint16_t i;
+ int64_t last_rowid;
+ CGWriterEvdDnbs* self =(CGWriterEvdDnbs*)cself;
+
+ assert(cself != NULL);
+ assert(ref != NULL);
+
+ for(i = 0; rc == 0 && i < cself->data.qty; i++) {
+
+ /* align against allele */
+ uint16_t ai = cself->data.dnbs[i].allele_index;
+ self->match.ref_ploidy = ref->allele_indexes_to_read_number[ai];
+ if( self->match.ref_ploidy == 0 ) {
+ DEBUG_MSG(3, ("bad allele_index for interval %s %s[%hu]\n", cself->data.dnbs[i].chr, cself->data.interval_id, i + 1));
+ self->bad_allele_index++;
+ continue;
+ }
+ else {
+ const char *read = NULL;
+ char reversed[CG_READS15_SPOT_LEN] = "";
+ uint32_t read_len = cself->read_len;
+
+ assert(read_len == CG_READS15_SPOT_LEN / 2
+ || read_len == CG_READS25_SPOT_LEN / 2);
+
+ if( cself->data.dnbs[i].side == 'L' ) {
+ self->match.seq_read_id = 1;
+ read = cself->data.dnbs[i].read;
+ } else {
+ self->match.seq_read_id = 2;
+ read = &cself->data.dnbs[i].read[read_len];
+ }
+ if( cself->data.dnbs[i].strand == '-' ) {
+ if( (rc = DNAReverseCompliment(read, reversed, read_len)) != 0 ) {
+ break;
+ }
+ read = reversed;
+ self->match.ref_orientation = true;
+ } else {
+ self->match.ref_orientation = false;
+ }
+ self->algn.ploidy = 0;
+ if( (rc = ReferenceMgr_Compress(cself->rmgr, 0, cself->data.dnbs[i].chr,
+ cself->data.dnbs[i].offset_in_reference, read, read_len,
+ cself->data.dnbs[i].allele_alignment, cself->data.dnbs[i].allele_alignment_length,
+ ref->offset,
+ ref->allele[ai], ref->allele_length[ai],
+ cself->data.dnbs[i].offset_in_allele,
+ ref->allele_alignment[ai], ref->allele_alignment_length[ai],
+ NCBI_align_ro_complete_genomics, &self->algn)) == 0 ) {
+ self->match.mapq = cself->data.dnbs[i].mapping_quality - 33;
+ /* pointer to SEQUENCE table spot and read */
+ self->match.seq_spot_id = cself->data.dnbs[i].seq_spot_id;
+ self->match.ref_id = ref_rowid;
+ self->match.ref_start = cself->data.dnbs[i].offset_in_allele;
+ DEBUG_MSG(3, ("REF_ID: %li, REF_START: %i, REF_PLOIDY: %hu\n",
+ self->match.ref_id, self->match.ref_start, self->match.ref_ploidy));
+ rc = TableWriterAlgn_Write(cself->writer, &self->algn, &last_rowid);
+ if( rc == 0 && self->data.last_rowid++ != last_rowid ) {
+ rc = RC(rcExe, rcTable, rcWriting, rcData, rcInconsistent);
+ }
+ } else if( GetRCObject(rc) == rcOffset && GetRCState(rc) == rcOutofrange ) {
+ PLOGERR(klogErr, (klogErr, rc, "evidence dnb for $(chr) interval $(interval) OffsetInReference $(offset) skipped",
+ "chr=%s,interval=%s,offset=%i", ref->chr, ref->interval_id, cself->data.dnbs[i].offset_in_reference));
+ rc = 0;
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/cg-load/writer-evidence-dnbs.h b/tools/cg-load/writer-evidence-dnbs.h
new file mode 100644
index 0000000..f0c17af
--- /dev/null
+++ b/tools/cg-load/writer-evidence-dnbs.h
@@ -0,0 +1,97 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_writer_evidence_dnbs_h_
+#define _tools_cg_load_writer_evidence_dnbs_h_
+
+
+#include "defs.h"
+#include "factory-cmn.h"
+
+#include <insdc/insdc.h>
+
+#include <sra/sradb.h>
+
+#include <vdb/database.h>
+
+
+struct ReferenceMgr;
+
+
+typedef struct TEvidenceDnbsData_dnb_struct {
+
+ /* translated:
+ slide+lane+file_num_in_lane+dnb_offset_in_lane_file --> SEQ_SPOT_ID */
+ int64_t seq_spot_id;
+
+ char chr[CG_CHROMOSOME_NAME];
+ char slide[CG_SLIDE];
+ char lane[CG_LANE];
+ CGFIELD15_BATCH_FILE_NUMBER file_num_in_lane;
+ uint64_t dnb_offset_in_lane_file; /* zero-based */
+ uint16_t allele_index;
+ char side;
+ char strand;
+ INSDC_coord_zero offset_in_allele;
+ char allele_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ /* strlen for allele_alignment[] buffer */
+ size_t allele_alignment_length;
+ uint8_t mapping_quality;
+ INSDC_coord_zero offset_in_reference;
+ /* moved into reading function since it is not used after reading anyway
+ char reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ INSDC_coord_zero mate_offset_in_reference;
+ char mate_reference_alignment[CG_EVDNC_ALLELE_CIGAR_LEN];
+ uint16_t score_allele[3];*/
+ char read[CG_EVDNC_SPOT_LEN];
+ size_t read_len;
+ /*char qual[CG_EVDNC_SPOT_LEN];
+ */
+ CGFIELD_WELL_ID wellId;
+} TEvidenceDnbsData_dnb;
+
+typedef struct TEvidenceDnbsData {
+ char interval_id[CG_EVDNC_INTERVALID_LEN];
+ uint16_t qty;
+ uint16_t max_qty;
+ TEvidenceDnbsData_dnb* dnbs;
+ int64_t last_rowid; /* last used rowid in this table */
+} TEvidenceDnbsData;
+
+typedef struct CGWriterEvdDnbs CGWriterEvdDnbs;
+
+struct TEvidenceIntervalsData;
+
+rc_t CGWriterEvdDnbs_Make(const CGWriterEvdDnbs **cself,
+ TEvidenceDnbsData **data, VDatabase *db, const struct ReferenceMgr *rmgr,
+ const uint32_t options, uint32_t read_len);
+
+rc_t CGWriterEvdDnbs_Whack(const CGWriterEvdDnbs* cself, bool commit, uint64_t* rows);
+
+rc_t CGWriterEvdDnbs_SetSEQ(const CGWriterEvdDnbs* cself, uint16_t dnb, const int64_t seq_spot_id_1st);
+
+rc_t CGWriterEvdDnbs_Write(const CGWriterEvdDnbs* cself, const struct TEvidenceIntervalsData* ref, int64_t ref_rowid);
+
+#endif /* _tools_cg_load_writer_evidence_dnbs_h_ */
diff --git a/tools/cg-load/writer-evidence-intervals.c b/tools/cg-load/writer-evidence-intervals.c
new file mode 100644
index 0000000..e5efd8f
--- /dev/null
+++ b/tools/cg-load/writer-evidence-intervals.c
@@ -0,0 +1,263 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "debug.h"
+#include "defs.h"
+#include "file.h"
+#include "writer-evidence-dnbs.h"
+#include "writer-evidence-intervals.h"
+
+#include <align/align.h>
+
+#include <kfs/file.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+
+#include <vdb/table.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct CGWriterEvdInt_match_struct {
+
+ /* filled out by ReferenceMgr_Compress */
+ INSDC_coord_zero read_start[CG_EVDNC_PLOIDY];
+ INSDC_coord_len read_len[CG_EVDNC_PLOIDY];
+ bool has_ref_offset[CG_EVDNC_ALLELE_LEN];
+ int32_t ref_offset[CG_EVDNC_ALLELE_LEN];
+ uint8_t ref_offset_type[CG_EVDNC_ALLELE_LEN];
+ bool has_mismatch[CG_EVDNC_ALLELE_LEN];
+ char mismatch[CG_EVDNC_ALLELE_LEN];
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ bool ref_orientation;
+ uint32_t mapq;
+
+} CGWriterEvdInt_match;
+
+struct CGWriterEvdInt {
+ const ReferenceMgr* rmgr;
+ const TableWriterAlgn* writer;
+ TableWriterAlgnData algn;
+ TEvidenceIntervalsData data;
+ CGWriterEvdInt_match match;
+ int64_t* dnbs_ids;
+ uint64_t dnbs_ids_max;
+};
+
+rc_t CGWriterEvdInt_Make(const CGWriterEvdInt** cself, TEvidenceIntervalsData** data,
+ VDatabase* db, const ReferenceMgr* rmgr, const uint32_t options)
+{
+ rc_t rc = 0;
+ CGWriterEvdInt* self;
+
+ if( cself == NULL || db == NULL ) {
+ return RC(rcExe, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ if( (rc = TableWriterAlgn_Make(&self->writer, db, ewalgn_tabletype_EvidenceInterval, 0)) == 0 ) {
+ self->algn.read_start.buffer = &self->match.read_start;
+ self->algn.read_len.buffer = &self->match.read_len;
+ self->algn.has_ref_offset.buffer = self->match.has_ref_offset;
+ self->algn.ref_offset.buffer = self->match.ref_offset;
+ self->algn.ref_offset_type.buffer = self->match.ref_offset_type;
+ self->algn.has_mismatch.buffer = self->match.has_mismatch;
+ self->algn.mismatch.buffer = self->match.mismatch;
+ self->algn.ref_id.buffer = &self->match.ref_id;
+ self->algn.ref_id.elements = 1;
+ self->algn.ref_start.buffer = &self->match.ref_start;
+ self->algn.ref_start.elements = 1;
+ self->match.ref_orientation = false;
+ self->algn.ref_orientation.buffer = &self->match.ref_orientation;
+ self->algn.ref_orientation.elements = 1;
+ self->algn.mapq.buffer = &self->match.mapq;
+ self->algn.mapq.elements = 1;
+ self->algn.alingment_ids.buffer = self->dnbs_ids;
+ self->rmgr = rmgr;
+ *data = &self->data;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ CGWriterEvdInt_Whack(self, false, NULL);
+ }
+ return rc;
+}
+
+rc_t CGWriterEvdInt_Whack(const CGWriterEvdInt* cself, bool commit, uint64_t* rows)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ CGWriterEvdInt* self = (CGWriterEvdInt*)cself;
+ rc = TableWriterAlgn_Whack(cself->writer, commit, rows);
+ free(self->dnbs_ids);
+ free(self);
+ }
+ return rc;
+}
+
+rc_t CGWriterEvdInt_Write(const CGWriterEvdInt* cself, const TEvidenceDnbsData* dnbs, int64_t* rowid)
+{
+ rc_t rc = 0;
+ CGWriterEvdInt* self = (CGWriterEvdInt*)cself;
+
+ assert(cself != NULL);
+
+ memset(self->data.allele_indexes_to_read_number, 0, sizeof(self->data.allele_indexes_to_read_number));
+ if( self->data.ploidy == 1 ) {
+
+ uint32_t i = self->data.allele_indexes[0] - '0';
+
+ if( self->data.allele_indexes[1] != '\0' || i > 2 ) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcOutofrange);
+ } else if( self->data.allele_alignment_length[i] == 0 ) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcEmpty);
+ } else {
+ if( i == 0 ) {
+ rc = string_printf(self->data.allele_alignment[0], sizeof(self->data.allele_alignment[0]),
+ &self->data.allele_alignment_length[0], "%uM", self->data.length);
+ }
+ if( rc == 0 ) {
+ self->algn.ploidy = 0;
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i], self->data.allele_length[i],
+ self->data.allele_alignment[i], self->data.allele_alignment_length[i],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i] = 1; /* 1st read */
+ }
+ }
+
+ } else if( self->data.ploidy == 2 ) { /** possibilities: 0;1 1;2 and 1;1 - single ploidy but recorded as dual **/
+ uint32_t i1 = self->data.allele_indexes[0] - '0';
+ uint32_t i2 = self->data.allele_indexes[2] - '0';
+
+ if( self->data.allele_indexes[1] != ';' || self->data.allele_indexes[3] != '\0' || i1 > 2 || i2 > 2) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcOutofrange);
+ } else {
+ if( i1 == 0 || i2 == 0 ) {
+ rc = string_printf(self->data.allele_alignment[0], sizeof(self->data.allele_alignment[0]),
+ &self->data.allele_alignment_length[0], "%uM", self->data.length);
+ }
+ if( self->data.allele_alignment_length[i1] == 0 || self->data.allele_alignment_length[i2] == 0 ) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcEmpty);
+ }
+ if( rc == 0 ) {
+ self->algn.ploidy = 0;
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i1], self->data.allele_length[i1],
+ self->data.allele_alignment[i1], self->data.allele_alignment_length[i1],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i1] = 1; /* 1st read */
+ }
+ if( rc == 0 ) {
+ if ( i2 != i1 ) {
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i2], self->data.allele_length[i2],
+ self->data.allele_alignment[i2], self->data.allele_alignment_length[i2],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i2] = 2; /* 2nd read */
+ } else {
+ self->data.ploidy = 1;
+ }
+ }
+ }
+
+ } else if( self->data.ploidy == 3 ) { /** possibilities: 0;1;2 1;2;3 **/
+ uint32_t i1 = self->data.allele_indexes[0] - '0';
+ uint32_t i2 = self->data.allele_indexes[2] - '0';
+ uint32_t i3 = self->data.allele_indexes[4] - '0';
+
+
+ if( self->data.allele_indexes[1] != ';' || self->data.allele_indexes[3] != ';' || self->data.allele_indexes[5] != '\0' || i1 > 3 || i2 > 3 || i3 > 3) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcOutofrange);
+ } else {
+ if( i1 == 0 || i2 == 0 || i3 == 0) {
+ rc = string_printf(self->data.allele_alignment[0], sizeof(self->data.allele_alignment[0]),
+ &self->data.allele_alignment_length[0], "%uM", self->data.length);
+ }
+ if( self->data.allele_alignment_length[i1] == 0 || self->data.allele_alignment_length[i2] == 0 || self->data.allele_alignment_length[i3]==0) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcEmpty);
+ }
+ if( rc == 0 ) {
+ self->algn.ploidy = 0;
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i1], self->data.allele_length[i1],
+ self->data.allele_alignment[i1], self->data.allele_alignment_length[i1],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i1] = 1; /* 1st read */
+ }
+ if( rc == 0 ) {
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i2], self->data.allele_length[i2],
+ self->data.allele_alignment[i2], self->data.allele_alignment_length[i2],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i2] = 2; /* 2nd read */
+ }
+ if( rc == 0 ) {
+ rc = ReferenceMgr_Compress(cself->rmgr, ewrefmgr_cmp_Exact, self->data.chr, self->data.offset, self->data.allele[i3], self->data.allele_length[i3],
+ self->data.allele_alignment[i3], self->data.allele_alignment_length[i3],
+ 0, NULL, 0, 0, NULL, 0, NCBI_align_ro_intron_unknown, &self->algn);
+ self->data.allele_indexes_to_read_number[i3] = 3; /* 3rd read */
+ }
+ }
+
+ } else {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcData, rcUnrecognized);
+ }
+ if( rc == 0 ) { /*** a bit careful here - were are predicting what EvidenceDnb writer will do ***/
+ uint32_t i,valid_qty;
+ for(valid_qty = i = 0;i< dnbs->qty;i++){
+ if(self->data.allele_indexes_to_read_number[dnbs->dnbs[i].allele_index] > 0){
+ valid_qty++;
+ }
+ }
+ if( self->dnbs_ids_max < valid_qty ) {
+ void* p = realloc(self->dnbs_ids, sizeof(*(self->dnbs_ids)) * valid_qty);
+ if( p == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcWriting, rcMemory, rcExhausted);
+ } else {
+ self->dnbs_ids = p;
+ self->dnbs_ids_max = valid_qty;
+ self->algn.alingment_ids.buffer = self->dnbs_ids;
+ }
+ }
+ if( rc == 0 ) {
+ self->algn.alingment_ids.elements = valid_qty;
+ for(i=0;i<valid_qty;i++){
+ self->dnbs_ids[i] = dnbs->last_rowid + i;
+ }
+ }
+ }
+ if( rc == 0 ) {
+ self->match.mapq = self->data.score;
+ rc = TableWriterAlgn_Write(self->writer, &self->algn, rowid);
+ }
+ return rc;
+}
diff --git a/tools/cg-load/writer-evidence-intervals.h b/tools/cg-load/writer-evidence-intervals.h
new file mode 100644
index 0000000..7a8f586
--- /dev/null
+++ b/tools/cg-load/writer-evidence-intervals.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_writer_evidence_intervals
+#define _tools_cg_load_writer_evidence_intervals
+
+#include <vdb/database.h>
+#include <vdb/manager.h>
+#include <insdc/insdc.h>
+
+#include "defs.h"
+#include <align/writer-alignment.h>
+#include <align/writer-reference.h>
+
+typedef struct TEvidenceIntervalsData {
+ char interval_id[CG_EVDNC_INTERVALID_LEN];
+ char chr[CG_CHROMOSOME_NAME];
+ INSDC_coord_zero offset;
+ INSDC_coord_len length;
+ uint16_t ploidy;
+ char allele_indexes[16];
+ /* translation from allele_indexes into read id for use in dnbs */
+ uint8_t allele_indexes_to_read_number[CG_EVDNC_ALLELE_NUM];
+ int32_t score;
+ int32_t scoreVAF;
+ int32_t scoreEAF;
+ char allele[CG_EVDNC_ALLELE_NUM][CG_EVDNC_ALLELE_LEN];
+ /* strlen for allele[3][] buffers */
+ size_t allele_length[CG_EVDNC_ALLELE_NUM];
+ char allele_alignment[CG_EVDNC_ALLELE_NUM][CG_EVDNC_ALLELE_CIGAR_LEN];
+ /* strlen for allele_alignment[3][] buffers */
+ size_t allele_alignment_length[CG_EVDNC_ALLELE_NUM];
+} TEvidenceIntervalsData;
+
+typedef struct CGWriterEvdInt CGWriterEvdInt;
+
+struct TEvidenceDnbsData;
+
+rc_t CGWriterEvdInt_Make(const CGWriterEvdInt** cself, TEvidenceIntervalsData** data,
+ VDatabase* db, const ReferenceMgr* rmgr, const uint32_t options);
+
+rc_t CGWriterEvdInt_Whack(const CGWriterEvdInt* cself, bool commit, uint64_t* rows);
+
+rc_t CGWriterEvdInt_Write(const CGWriterEvdInt* cself, const struct TEvidenceDnbsData* dnbs, int64_t* rowid);
+
+#endif /* _tools_cg_load_writer_evidence_intervals */
diff --git a/tools/cg-load/writer-seq.c b/tools/cg-load/writer-seq.c
new file mode 100644
index 0000000..c936fbc
--- /dev/null
+++ b/tools/cg-load/writer-seq.c
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "debug.h"
+#include "defs.h"
+#include "writer-seq.h"
+
+#include <insdc/insdc.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+const INSDC_SRA_platform_id DFTL_platform = SRA_PLATFORM_COMPLETE_GENOMICS;
+const char DFTL_label[] = "LeftRight";
+const INSDC_coord_zero DFTL_label_start[CG_READS_NREADS] = {0, 4};
+const INSDC_coord_len DFTL_label_len[CG_READS_NREADS] = {4, 5};
+
+INSDC_coord_zero DFTL_read_start[CG_READS_NREADS] = {0, 35};
+INSDC_coord_len DFTL_read_len [CG_READS_NREADS] = {35, 35};
+
+const INSDC_SRA_read_filter DFTL_read_filter[CG_READS_NREADS] = {SRA_READ_FILTER_PASS, SRA_READ_FILTER_PASS};
+
+struct CGWriterSeq {
+ const TableWriterSeq* base;
+ TReadsData data;
+};
+
+rc_t CGWriterSeq_Make(const CGWriterSeq** cself,
+ TReadsData** data, VDatabase* db, const uint32_t options,
+ const char* quality_quantization, uint32_t read_len)
+{
+ rc_t rc = 0;
+ CGWriterSeq* self;
+
+ assert(read_len == CG_READS15_SPOT_LEN / 2
+ || read_len == CG_READS25_SPOT_LEN / 2);
+
+ if( cself == NULL || db == NULL ) {
+ return RC(rcExe, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ TableWriterData p;
+ p.buffer = &DFTL_platform;
+ p.elements = 1;
+ if( (rc = TableWriterSeq_Make(&self->base, db, options | ewseq_co_AlignData | ewseq_co_SpotGroup, quality_quantization)) != 0 ) {
+ LOGERR(klogErr, rc, "sequence table");
+ }
+ else if ((rc =
+ TableWriteSeq_WriteDefault(self->base, ewseq_cn_PLATFORM, &p)) == 0)
+ {
+ int i = 0;
+ for (i = 0; i < CG_READS_NREADS; ++i) {
+ DFTL_read_len[i] = read_len;
+ }
+ DFTL_read_start[1] = read_len;
+
+ /* attach data pointer to data */
+ self->data.seq.nreads = CG_READS_NREADS;
+ self->data.seq.alignment_count.buffer = self->data.align_count;
+ self->data.seq.alignment_count.elements = CG_READS_NREADS;
+ self->data.seq.primary_alignment_id.buffer = self->data.prim_algn_id;
+ self->data.seq.primary_alignment_id.elements = CG_READS_NREADS;
+ self->data.seq.sequence.buffer = self->data.read;
+ self->data.seq.quality.buffer = self->data.qual;
+ self->data.seq.label.buffer = DFTL_label;
+ self->data.seq.label.elements = sizeof(DFTL_label) - 1;
+ self->data.seq.label_start.buffer = DFTL_label_start;
+ self->data.seq.label_start.elements = CG_READS_NREADS;
+ self->data.seq.label_len.buffer = DFTL_label_len;
+ self->data.seq.label_len.elements = CG_READS_NREADS;
+ self->data.seq.read_type.buffer = self->data.read_type;
+ self->data.seq.read_type.elements = CG_READS_NREADS;
+ self->data.seq.read_start.buffer = DFTL_read_start;
+ self->data.seq.read_start.elements = CG_READS_NREADS;
+ self->data.seq.read_len.buffer = DFTL_read_len;
+ self->data.seq.read_len.elements = CG_READS_NREADS;
+ self->data.seq.read_filter.buffer = DFTL_read_filter;
+ self->data.seq.read_filter.elements = CG_READS_NREADS;
+
+ /* set to 1st row for aligment to refer */
+ self->data.rowid = 1;
+ *data = &self->data;
+ }
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ CGWriterSeq_Whack(self, false, NULL);
+ }
+ return rc;
+}
+
+rc_t CGWriterSeq_Whack(const CGWriterSeq* cself, bool commit, uint64_t* rows)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ CGWriterSeq* self = (CGWriterSeq*)cself;
+ rc = TableWriterSeq_Whack(cself->base, commit, rows);
+ free(self);
+ }
+ return rc;
+}
+
+rc_t CGWriterSeq_Write(const CGWriterSeq* cself)
+{
+ uint64_t i;
+ int64_t r;
+ rc_t rc;
+ INSDC_quality_phred* b;
+ CGWriterSeq* self = (CGWriterSeq*)cself;
+
+ assert(cself != NULL);
+
+ b = (INSDC_quality_phred*)(self->data.seq.quality.buffer);
+ for(i = 0; i < cself->data.seq.quality.elements; i++ ) {
+ b[i] -= 33;
+ }
+ for(i = 0; i < CG_READS_NREADS; i++) {
+ self->data.read_type[i] = SRA_READ_TYPE_BIOLOGICAL |
+ (cself->data.prim_is_reverse[i] ? SRA_READ_TYPE_REVERSE : SRA_READ_TYPE_FORWARD);
+ }
+ rc = TableWriterSeq_Write(cself->base, &cself->data.seq, &r);
+ return rc ? rc : (self->data.rowid++ == r ? 0 : RC(rcExe, rcTable, rcWriting, rcData, rcInconsistent));
+}
diff --git a/tools/cg-load/writer-seq.h b/tools/cg-load/writer-seq.h
new file mode 100644
index 0000000..5cc899e
--- /dev/null
+++ b/tools/cg-load/writer-seq.h
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_cg_load_writer_seq_h_
+#define _tools_cg_load_writer_seq_h_
+
+#include <insdc/insdc.h>
+#include <vdb/database.h>
+#include <sra/sradb.h>
+#include <align/writer-sequence.h>
+
+typedef struct TReadsData_struct {
+ uint32_t reads_format;
+
+ uint16_t flags;
+ char read[CG_READS15_SPOT_LEN + 1];
+ char qual[CG_READS15_SPOT_LEN + 1];
+
+ /* reverse read cache by half-dnb */
+ INSDC_dna_text reverse[CG_READS15_SPOT_LEN];
+
+ TableWriterSeqData seq;
+ int64_t rowid;
+ uint8_t align_count[CG_READS_NREADS];
+ int64_t prim_algn_id[CG_READS_NREADS];
+ bool prim_is_reverse[CG_READS_NREADS];
+ SRAReadTypes read_type[CG_READS_NREADS];
+} TReadsData;
+
+typedef struct CGWriterSeq CGWriterSeq;
+
+rc_t CGWriterSeq_Make(const CGWriterSeq** cself,
+ TReadsData** data, VDatabase* db, const uint32_t options,
+ const char* quality_quantization, uint32_t read_len);
+
+rc_t CGWriterSeq_Whack(const CGWriterSeq* cself, bool commit, uint64_t* rows);
+
+rc_t CGWriterSeq_Write(const CGWriterSeq* cself);
+
+#endif /* _tools_cg_load_writer_seq_h_ */
diff --git a/tools/copycat/Makefile b/tools/copycat/Makefile
new file mode 100644
index 0000000..985c064
--- /dev/null
+++ b/tools/copycat/Makefile
@@ -0,0 +1,100 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/copycat
+
+INT_TOOLS =
+
+EXT_TOOLS = copycat
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_MAGIC))
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built:" \
+ "It requires our internal library 'libkff'" \
+ "which requires 'libmagic' and its development headers."
+endif
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# copycat
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+COPYCAT_SRC = \
+ copycat \
+ ccfileformat \
+ cccat \
+ cctree \
+ cctree-dump \
+ cctar \
+ ccsra \
+ ccsubchunk \
+ ccfile
+
+COPYCAT_OBJ = \
+ $(addsuffix .$(OBJX),$(COPYCAT_SRC))
+
+COPYCAT_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+ -skff \
+ -smagic-static
+
+
+$(BINDIR)/copycat: $(COPYCAT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(COPYCAT_LIB)
+ @ cp $(SRCDIR)/magic $(BINDIR)
diff --git a/tools/copycat/ccbuffer.c b/tools/copycat/ccbuffer.c
new file mode 100644
index 0000000..b628c2b
--- /dev/null
+++ b/tools/copycat/ccbuffer.c
@@ -0,0 +1,153 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <assert.h>
+#include <atomic.h>
+#include <stdlib.h>
+
+
+/* #include <os-native.h> */
+
+/* #include <klib/rc.h> */
+/* #include <kapp/main.h> */
+/* #include <kcont/queue.h> */
+
+#include "copycat-priv.h"
+
+/* ==========
+ * Buffer is a generic buffer to be used to pass data between co-routines or
+ * threads.
+ */
+struct Buffer
+{
+ /* standard SRA tool kit type reference counter: zero when free and
+ * in the queue of the BufferMgr */
+ atomic32_t refcount;
+ /* keep track of manager - by adding a reference when allocated it keeps
+ * the manager alive long enough to free all buffers */
+ BufferMgr * mgr;
+ /* how large is the payload for the buffer */
+ size_t payload_size;
+ /* how large is the content of the payload? */
+ size_t payload_content;
+ /* the payload of the packet is the rest of the packet (and not normally
+ * a single byte) */
+ char payload [1];
+};
+
+/* ----------
+ * Constructor/initializer for a buffer: called only from a BufferMgr
+ * Return: rc_t
+ * buff pointer to a pointer to hold a reference to the new Buffer
+ * payload_size how large to make the data portion of the Buffer
+ * mgr a reference back to the manager that will control this buffer
+ */
+rc_t BufferMake (Buffer ** buff, size_t payload_size, BufferMgr * mgr)
+{
+ Buffer * self = NULL;
+ rc_t rc = 0;
+
+ assert (mgr != NULL);
+
+ self = malloc (payload_size + sizeof (Buffer) - 1);
+ if (self == NULL)
+ {
+ rc = RC (rcExe, rcBuffer, rcAllocating, rcMemory, rcExhausted);
+ }
+ else
+ {
+ /* non-standard for SRA Toolkit; refcount is 0 while not allocated */
+ atomic32_set (&self->refcount, 0);
+ self->mgr = mgr;
+ self->payload_size = payload_size;
+ self->payload_content = 0;
+ }
+ *buff = self;
+ return rc;
+}
+
+rc_t BufferAddRef (const Buffer * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((Buffer*)self)->refcount);
+ return 0;
+}
+
+rc_t BufferRelease (const Buffer * cself)
+{
+ Buffer * self = (Buffer *)cself;
+ rc_t rc = 0;
+
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ if (self->mgr == NULL)
+ free (self);
+ else
+ {
+ /* refcount reaching 0 means to put back in the free_q for the BufferMgr */
+ rc = BufferMgrPutBuffer (self->mgr, self, NULL);
+
+ /* if failed return ownership to last releaser */
+ if (rc != 0)
+ atomic32_set (&self->refcount, 1);
+ }
+ }
+ }
+ return rc;
+}
+
+size_t BufferPayloadGetSize (const Buffer * self)
+{
+ assert (self != NULL);
+ return self->payload_size;
+}
+size_t BufferContentGetSize (const Buffer * self)
+{
+ assert (self != NULL);
+ return self->payload_content;
+}
+rc_t BufferContentSetSize (Buffer * self, size_t z)
+{
+ rc_t rc = 0;
+ assert (self != NULL);
+ assert (z <= self->payload_size);
+ self->payload_content = z;
+ return rc;
+}
+/* is it too redundant to have a read and write version? */
+const void * BufferPayload (const Buffer * self)
+{
+ assert (self != NULL);
+ return (const void*)self->payload;
+}
+void * BufferPayloadWrite (Buffer * self)
+{
+ assert (self != NULL);
+ return (void*)self->payload;
+}
+
diff --git a/tools/copycat/ccbuffermgr.c b/tools/copycat/ccbuffermgr.c
new file mode 100644
index 0000000..8323929
--- /dev/null
+++ b/tools/copycat/ccbuffermgr.c
@@ -0,0 +1,234 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <assert.h>
+
+#include <atomic.h>
+/* #include <os-native.h> */
+
+/* #include <klib/rc.h> */
+/* #include <kapp/main.h> */
+#include <kcont/queue.h>
+#include <kapp/log.h>
+
+#include "copycat-priv.h"
+
+/* ==========
+ * BufferMgr
+ */
+struct BufferMgr
+{
+ atomic32_t refcount;
+ uint32_t timeout;
+ KQueue * free_q;
+};
+
+
+/* Standard SRA type constructor:
+ * construction of the manager also creates the buffers per specification in the parameters
+ * buffmgr where to put a reference to the new BufferMgr
+ * buffcount how many Buffers to make as well
+ * buffsize how large a payload is desired for the Buffers
+ * timeout number of milliseconds of wait time for the operations for this BufferMgr
+ */
+rc_t BufferMgrMake (BufferMgr ** buffmgr, uint32_t buffcount, size_t buffsize, uint32_t timeout)
+{
+ rc_t rc = 0;
+ BufferMgr * self;
+
+ *buffmgr = NULL;
+ self = malloc ( sizeof * self );
+
+ if ( self == NULL)
+ {
+ rc = RC (rcExe, rcBuffer, rcAllocating, rcMemory, rcExhausted);
+ LOGERR (klogErr, rc, "BufferMgrMake: error allocating for buffer manager");
+ }
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ self->timeout = timeout; /* default timeout */
+ rc = KQueueMake (&self->free_q, buffcount);
+
+ if (rc != 0)
+ LOGERR (klogErr, rc, "BufferMgrMake: error making KQueue");
+ else
+ {
+ uint32_t ix;
+ union
+ {
+ Buffer * b;
+ void * v;
+ } bp;
+ timeout_t tm;
+
+ for (ix = 0; ix < buffcount; ++ix)
+ {
+ bp.v = NULL;
+ rc = TimeoutInit (&tm, timeout);
+
+ if (rc == 0)
+ {
+ rc = BufferMake (&bp.b, buffsize, self);
+ if (rc == 0)
+ {
+ rc = KQueuePush (self->free_q, bp.v, &tm);
+ if (rc != 0)
+ free (bp.v);
+ }
+ if (rc != 0)
+ break;
+ }
+ }
+ if (ix == buffcount)
+ {
+ atomic32_set (&self->refcount, 1);
+ *buffmgr = self;
+ return 0;
+ }
+ else
+ {
+ /* failure so undo all */
+ rc_t rc_sub = 0;
+
+ while (rc_sub)
+ {
+ rc_sub = TimeoutInit (&tm, timeout);
+ if (rc_sub == 0)
+ {
+ rc_sub = KQueuePop (self->free_q, &bp.v, &tm);
+ if (rc_sub == 0)
+ if (bp.v != NULL)
+ free (bp.v);
+ }
+ }
+ }
+ KQueueRelease (self->free_q);
+ }
+ free (self);
+ }
+ return rc;
+}
+
+rc_t BufferMgrAddRef (const BufferMgr * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((BufferMgr*)self)->refcount);
+ return 0;
+}
+
+rc_t BufferMgrRelease (BufferMgr *self)
+{
+ rc_t rc = 0;
+ void * bp;
+ timeout_t tm;
+ if ( self != NULL )
+ {
+ if ( atomic32_dec_and_test (&self->refcount))
+ {
+ /* release all allocated buffers here */
+ while (rc)
+ {
+ rc = TimeoutInit (&tm, self->timeout);
+ if (rc == 0)
+ {
+ rc = KQueuePop (self->free_q, &bp, &tm);
+ if (rc == 0)
+ if (bp != NULL)
+ free (bp);
+ }
+ }
+ if (rc == 0)
+ free (self);
+ }
+ }
+ return rc;
+}
+rc_t BufferMgrPutBuffer (BufferMgr * self, Buffer * buff, timeout_t * tm)
+{
+ rc_t rc = 0;
+ timeout_t t;
+
+ assert (self != NULL);
+ assert (buff != NULL);
+
+ if (tm == NULL)
+ {
+ tm = &t;
+ rc = TimeoutInit (tm, self->timeout);
+ }
+
+ if (rc == 0)
+ {
+ rc = KQueuePush (self->free_q, buff, tm);
+ if (rc == 0)
+ {
+ /* take ownership of the buffer removing keep alive reference */
+ BufferMgrRelease (self);
+ }
+ }
+ if (rc != 0)
+ /* assign ownership back to the caller */
+ BufferAddRef(buff);
+
+ return rc;
+}
+rc_t BufferMgrGetBuffer (BufferMgr * self, Buffer ** buff, timeout_t * tm)
+{
+ rc_t rc = 0, orc;
+ timeout_t t;
+ void * bp;
+
+ assert (self != NULL);
+ assert (buff != NULL);
+
+ if (tm == NULL)
+ {
+ tm = &t;
+ rc = TimeoutInit (tm, self->timeout);
+ }
+
+ if (rc == 0)
+ {
+ *buff = NULL;
+
+ rc = KQueuePop (self->free_q, &bp, tm);
+ if (rc == 0)
+ {
+ /* add a keep alive reference to the buffer */
+ rc = BufferMgrAddRef (self);
+ if (rc)
+ LOGERR (klogInt, rc, "Error adding reference to buffer manager");
+ else
+ *buff = bp;
+
+ rc = BufferAddRef(*buff);
+ if (orc)
+ LOGERR (klogInt, rc, "Error adding reference to a buffer");
+ }
+ }
+ return rc;
+}
diff --git a/tools/copycat/ccbufferq.c b/tools/copycat/ccbufferq.c
new file mode 100644
index 0000000..0d3b4cb
--- /dev/null
+++ b/tools/copycat/ccbufferq.c
@@ -0,0 +1,175 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <assert.h>
+
+#include <atomic.h>
+#include <os-native.h>
+
+#include <klib/rc.h>
+#include <kapp/log.h>
+#include <kcont/queue.h>
+
+#include "copycat-priv.h"
+
+
+
+struct BufferQ
+{
+ atomic32_t refcount; /* how many references to this object */
+ uint32_t timeout; /* default timeout in millisecs */
+ KQueue * q; /* The underlying thread safe queue */
+};
+
+rc_t BufferQAddRef (const BufferQ * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((BufferQ*)self)->refcount);
+ return 0;
+}
+
+rc_t BufferQRelease (const BufferQ *cself)
+{
+ BufferQ * self = (BufferQ*)cself;
+ rc_t rc = 0;
+ if ( self != NULL )
+ {
+ if ( atomic32_dec_and_test (&self->refcount))
+ {
+ const Buffer * b;
+ while (rc == 0)
+ {
+ rc = BufferQPopBuffer (self, &b, NULL);
+ BufferRelease (b);
+ }
+/* this might need rework especially if KQueue changes */
+ if ((GetRCState(rc) == rcExhausted) && (GetRCObject(rc) == rcTimeout))
+ rc = 0;
+ if (rc == 0)
+ {
+ rc = KQueueRelease (self->q);
+ if (rc == 0)
+ {
+ free (self);
+ return 0;
+ }
+ }
+ atomic32_inc (&((BufferQ*)self)->refcount);
+ }
+ }
+ return rc;
+}
+
+
+rc_t BufferQMake (BufferQ ** q, uint32_t timeout, uint32_t length)
+{
+ rc_t rc = 0;
+ BufferQ * self;
+
+ assert (q != NULL);
+
+ self = malloc (sizeof * self);
+ if (self == NULL)
+ rc = RC (rcExe, rcQueue, rcAllocating, rcMemory, rcExhausted);
+ else
+ {
+ rc = KQueueMake (&self->q, length);
+ if (rc == 0)
+ {
+ self->timeout = timeout;
+ atomic32_set (&self->refcount, 1);
+ *q = self;
+ }
+ }
+
+ return rc;
+}
+
+rc_t BufferQPushBuffer (BufferQ * self, const Buffer * buff, timeout_t * tm)
+{
+ rc_t rc = 0;
+ timeout_t t;
+
+ assert (self != NULL);
+ assert (buff != NULL);
+
+ if (tm == NULL) /* do we need the default timeout? */
+ {
+ tm = &t;
+ rc = TimeoutInit (tm, self->timeout);
+ }
+
+ if (rc == 0)
+ {
+ rc = KQueuePush (self->q, buff, tm);
+ if (rc == 0)
+ {
+ /* share ownership of the buffer removing keep alive reference */
+ rc = BufferAddRef (buff);
+ }
+ }
+
+ return rc;
+}
+rc_t BufferQPopBuffer (BufferQ * self, const Buffer ** buff, timeout_t * tm)
+{
+ rc_t rc = 0;
+ timeout_t t;
+ void * p;
+ LOGMSG (klogDebug10, "BufferQPopBuffer");
+ assert (self != NULL);
+ assert (buff != NULL);
+
+ if (tm == NULL)
+ {
+ LOGMSG (klogDebug10, "BufferQPopBuffer tm was NULL");
+ tm = &t;
+ rc = TimeoutInit (tm, self->timeout);
+ }
+
+ if (rc == 0)
+ {
+ LOGMSG (klogDebug10, "BufferQPopBuffer call KQueuePop");
+ rc = KQueuePop (self->q, &p, tm);
+ PLOGMSG (klogDebug10, "BufferQPopBuffer back from KQueuePop $(rc)", PLOG_U32(rc), rc);
+ if (rc == 0)
+ *buff = p;
+ else
+ {
+ *buff = NULL;
+ }
+ }
+ LOGMSG (klogDebug10, "leave BufferQPopBuffer");
+ return rc;
+}
+rc_t BufferQSeal (BufferQ * self)
+{
+ return KQueueSeal (self->q);
+}
+bool BufferQSealed (BufferQ *self)
+{
+ return KQueueSealed (self->q);
+}
diff --git a/tools/copycat/cccat.c b/tools/copycat/cccat.c
new file mode 100644
index 0000000..64cd32e
--- /dev/null
+++ b/tools/copycat/cccat.c
@@ -0,0 +1,1797 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "copycat-priv.h"
+#include "cctree-priv.h"
+
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/encfile-priv.h>
+#include <krypto/wgaencrypt.h>
+#include <kfs/kfs-priv.h>
+#include <kfs/file.h>
+#include <kfs/teefile.h>
+#include <kfs/gzip.h>
+#include <kfs/bzip.h>
+#include <kfs/md5.h>
+#include <kfs/countfile.h>
+#include <kfs/readheadfile.h>
+#include <kfs/buffile.h>
+#include <kfs/crc.h>
+#include <klib/checksum.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* make it last include */
+#include "debug.h"
+
+#define EXAMINE_KAR_FILES 0
+#define DECRYPT_FAIL_AS_PLAIN_FILE 0
+/* the readhead file isn't working yet */
+#define USE_KBUFFILE 1
+
+static
+const VPath * src_path = NULL;
+
+static
+const VPath * dst_path = NULL;
+
+static
+bool do_encrypt = false;
+static
+bool do_decrypt = false;
+static
+bool wga_pw_read = false;
+static
+bool src_pw_read = false;
+static
+bool dst_pw_read = false;
+
+static
+char wga_pwd [256];
+static
+char src_pwd [256];
+static
+char dst_pwd [256];
+
+static
+size_t wga_pwd_sz;
+static
+size_t src_pwd_sz;
+static
+size_t dst_pwd_sz;
+
+static
+KKey src_key;
+
+static
+KKey dst_key;
+
+static
+KDirectory * cwd = NULL;
+
+
+static
+rc_t get_password (const VPath * path, char * pw, size_t pwz, size_t * num_read, KKey * key, bool * read)
+{
+ const KFile * pwfile;
+ size_t z;
+ rc_t rc;
+ char obuff [8096];
+
+ if (VPathOption (path, vpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+ {
+ if (VPathOption (path, vpopt_pwpath, obuff, sizeof obuff, &z) == 0)
+ rc = KDirectoryOpenFileRead (cwd, &pwfile, "%s", obuff);
+
+ else if (VPathOption (path, vpopt_pwfd, obuff, sizeof obuff, &z) == 0)
+ rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+
+ else
+ rc = RC (rcExe, rcPath, rcAccessing, rcParam, rcUnsupported);
+ if (rc == 0)
+ {
+ rc = KFileRead (pwfile, 0, pw, pwz, num_read);
+
+ if (rc == 0)
+ {
+ char * pc;
+
+ if (*num_read < pwz)
+ pw[*num_read] = '\0';
+
+ pc = string_chr (pw, *num_read, '\r');
+ if (pc)
+ {
+ *pc = '\0';
+ *num_read = pc - pw;
+ }
+
+ pc = string_chr (pw, *num_read, '\n');
+ if (pc)
+ {
+ *pc = '\0';
+ *num_read = pc - pw;
+ }
+
+ *read = true;
+ rc = KKeyInitRead (key, kkeyAES128, pw, *num_read);
+ }
+
+ KFileRelease (pwfile);
+ }
+ }
+ else
+ rc = RC (rcExe, rcPath, rcAccessing, rcFunction, rcNotFound);
+ return rc;
+}
+
+
+static
+rc_t wga_password (const VPath * path, char * pw, size_t pwz, size_t * num_read, bool * read)
+{
+ const KFile * pwfile;
+ size_t z;
+ rc_t rc;
+ char obuff [8096];
+
+ if (VPathOption (path, vpopt_encrypted, obuff, sizeof obuff, &z) == 0)
+ {
+ if (VPathOption (path, vpopt_pwpath, obuff, sizeof obuff, &z) == 0)
+ rc = KDirectoryOpenFileRead (cwd, &pwfile, "%s", obuff);
+
+ else if (VPathOption (path, vpopt_pwfd, obuff, sizeof obuff, &z) == 0)
+ rc = KFileMakeFDFileRead (&pwfile, atoi (obuff));
+
+ else
+ rc = RC (rcExe, rcPath, rcAccessing, rcParam, rcUnsupported);
+ if (rc == 0)
+ {
+ rc = KFileRead (pwfile, 0, pw, pwz, num_read);
+
+ if (rc == 0)
+ {
+ char * pc;
+
+ if (*num_read < pwz)
+ pw[*num_read] = '\0';
+
+ pc = string_chr (pw, *num_read, '\r');
+ if (pc)
+ {
+ *pc = '\0';
+ *num_read = pc - pw;
+ }
+
+ pc = string_chr (pw, *num_read, '\n');
+ if (pc)
+ {
+ *pc = '\0';
+ *num_read = pc - pw;
+ }
+
+ *read = true;
+ }
+
+ KFileRelease (pwfile);
+ }
+ }
+ else
+ rc = RC (rcExe, rcPath, rcAccessing, rcFunction, rcNotFound);
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * copycat
+ */
+static
+rc_t ccat_cache ( CCCachedFileNode **np, const KFile *sf,
+ enum CCType ntype, CCFileNode *node, const char *name )
+{
+ rc_t rc;
+ KFile *out;
+
+ /* create path */
+ char path [ 256 ];
+ int len = snprintf ( path, sizeof path, "%s", name );
+
+ DEBUG_STATUS (("%s: name '%s'\n", __func__, name));
+
+ if ( len < 0 || len >= sizeof path )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+
+ /* look for a name that has not yet been written */
+ if ( CCTreeFind ( ctree, path ) != NULL )
+ {
+ uint32_t i;
+ const char *ext = strrchr ( name, '.' );
+ if ( ext != NULL )
+ {
+ for ( i = 2; ; ++ i )
+ {
+ len = snprintf ( path, sizeof path, "%.*s-%u%s", ( int ) ( ext - name ), name, i, ext );
+ if ( len < 0 || len >= sizeof path )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+ if ( CCTreeFind ( ctree, path ) == NULL )
+ break;
+ }
+ }
+ else
+ {
+ for ( i = 2; ; ++ i )
+ {
+ len = snprintf ( path, sizeof path, "%s-%u", name, i );
+ if ( len < 0 || len >= sizeof path )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+ if ( CCTreeFind ( ctree, path ) == NULL )
+ break;
+ }
+ }
+ }
+
+ /* create an output file */
+ rc = KDirectoryCreateFile ( cdir, & out, false, 0640, cm, "%s", path );
+ if ( rc != 0 && GetRCState ( rc ) == rcUnauthorized )
+ {
+ /* respond to a file that has no write privs */
+ uint32_t access;
+ rc_t rc2 = KDirectoryAccess ( cdir, & access, "%s", path );
+ if ( rc2 == 0 )
+ {
+ rc2 = KDirectorySetAccess ( cdir, false, 0640, 0777, "%s", path );
+ if ( rc2 == 0 )
+ {
+ rc = KDirectoryCreateFile ( cdir, & out, false, 0640, cm, "%s", path );
+ if ( rc != 0 )
+ KDirectorySetAccess ( cdir, false, access, 0777, "%s", path );
+ }
+ }
+ }
+
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to create cached file '$(path)'", "path=%s", path ));
+ else
+ {
+ const KFile *tee;
+ rc = KFileMakeTeeRead ( & tee, sf, out );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to create cache tee file on '$(path)'", "path=%s", path ));
+ else
+ {
+ KFileAddRef ( sf );
+ KFileAddRef ( out );
+ rc = KFileRelease ( tee );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to close cache tee file on '$(path)'", "path=%s", path ));
+ }
+
+ KFileRelease ( out );
+
+ if ( rc == 0 )
+ {
+ rc = CCCachedFileNodeMake ( np, path, ntype, node );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create cached file node" );
+ else
+ {
+ rc = KDirectorySetAccess ( cdir, false, 0440, 0777, "%s", path );
+
+ /* create named entry in ctree */
+ rc = CCTreeInsert ( ctree, 0, ccFile, NULL, path );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to record cached file" );
+ }
+ }
+ }
+
+ return rc;
+}
+
+
+static
+rc_t ccat_extract_path (char * path, size_t pathz, const char * name)
+{
+ rc_t rc = 0;
+ int len;
+
+ DEBUG_STATUS (("%s: name '%s'\n", __func__, name));
+
+ if (extract_dir)
+ len = snprintf ( path, pathz, "%s%s", epath, name );
+ else
+ len = snprintf ( path, pathz, "%s", name );
+ DEBUG_STATUS (("%s: path '%s'\n",__func__, path));
+
+ if ( len < 0 || len >= pathz )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+
+ /* look for a name that has not yet been written */
+ if ( CCTreeFind ( etree, path ) != NULL )
+ {
+ uint32_t i;
+ const char *ext = strrchr ( name, '.' );
+ if ( ext != NULL )
+ {
+ for ( i = 2; ; ++ i )
+ {
+ len = snprintf ( path, pathz, "%.*s-%u%s", ( int ) ( ext - name ), name, i, ext );
+ if ( len < 0 || len >= pathz )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+ if ( CCTreeFind ( etree, path ) == NULL )
+ break;
+ }
+ }
+ else
+ {
+ for ( i = 2; ; ++ i )
+ {
+ len = snprintf ( path, pathz, "%s-%u", name, i );
+ if ( len < 0 || len >= pathz )
+ return RC ( rcExe, rcFile, rcWriting, rcPath, rcExcessive );
+ if ( CCTreeFind ( etree, path ) == NULL )
+ break;
+ }
+ }
+ }
+ DEBUG_STATUS (("%s: rc '%u(%R)' path '%s'\n",__func__, rc, rc, path));
+ return rc;
+}
+
+
+static
+rc_t ccat_extract (const KFile *sf, const char * path)
+{
+ rc_t rc;
+ KFile *out;
+
+ rc = KDirectoryCreateFile ( edir, & out, false, 0640, cm, "%s", path );
+ if ( rc != 0 && GetRCState ( rc ) == rcUnauthorized )
+ {
+ /* respond to a file that has no write privs */
+ uint32_t access;
+ rc_t rc2 = KDirectoryAccess ( edir, & access, "%s", path );
+ if ( rc2 == 0 )
+ {
+ rc2 = KDirectorySetAccess ( edir, false, 0640, 0777, "%s", path );
+ if ( rc2 == 0 )
+ {
+ rc = KDirectoryCreateFile ( edir, & out, false, 0640, cm, "%s", path );
+ DBG_KFILE(("%s: called KDirectoryCreateFile rc %R path %s\n",__func__,rc,path));
+ DBG_KFile(out);
+ if ( rc != 0 )
+ KDirectorySetAccess ( edir, false, access, 0777, "%s", path );
+ }
+ }
+ }
+ if ( rc != 0 )
+ PLOGERR ( klogErr,
+ ( klogErr, rc,
+ "failed to create extracted file '$(path)'",
+ "path=%s", path ));
+ else
+ {
+ const KFile *tee;
+ rc = KFileMakeTeeRead ( & tee, sf, out );
+ DBG_KFILE(("%s: called KFileMakeTeeRead rc %R \n",__func__,rc));
+ DBG_KFile(tee);
+ if ( rc != 0 )
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to create extract tee file on '$(path)'", "path=%s", path ));
+ else
+ {
+ KFileAddRef ( sf );
+ KFileAddRef ( out );
+ rc = KFileRelease ( tee );
+ if ( rc != 0 )
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to close extract tee file on '$(path)'",
+ "path=%s", path));
+ else if (!xml_dir)
+ {
+ CCCachedFileNode * np;
+
+ rc = CCCachedFileNodeMake (&np, path, ccCached, NULL );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create cached extract file node" );
+ else
+ {
+ rc = CCTreeInsert (etree, 0, ccFile, NULL, path);
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to record cached extract file" );
+ }
+ }
+ }
+ KFileRelease ( out );
+ }
+
+ return rc;
+}
+
+static
+rc_t ccat_arc ( CCContainerNode **np, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name, uint32_t type_id )
+{
+ rc_t rc /*, orc */;
+
+ /* ensure we handle this type of archive */
+ switch ( type_id )
+ {
+ case ccfftaSra:
+#if ! EXAMINE_KAR_FILES
+ * np = NULL;
+ return 0;
+#endif
+ case ccfftaHD5:
+ * np = NULL;
+ return 0;
+ case ccfftaTar:
+ break;
+ default:
+ /* don't recognize archive format - treat as a normal file */
+ PLOGMSG ( klogWarn, ( klogWarn, "archive '$(name)' type '$(ftype)' will not be analyzed: "
+ "unknown format", "name=%s,ftype=%s", name, node -> ftype ));
+ * np = NULL;
+ return 0;
+ }
+
+ /* create container node */
+ rc = CCContainerNodeMake ( np, ntype, node );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create container node" );
+ else
+ {
+ CCContainerNode *cont = * np;
+
+ /* orc = 0; */
+ switch ( type_id )
+ {
+ case ccfftaTar:
+ /* orc = */ ccat_tar ( cont, sf, name );
+ break;
+ case ccfftaSra:
+ /* orc = */ ccat_sra (cont, sf, name);
+ break;
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t ccat_enc ( CCContainerNode **np, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name,
+ uint32_t type_id )
+{
+ rc_t rc = 0;
+ const KFile *df;
+ uint64_t expected = SIZE_UNKNOWN; /* assume we won't know */
+
+ switch ( type_id )
+ {
+ case ccffteNCBI:
+ if (!src_pw_read)
+ {
+ rc = get_password (src_path, src_pwd, sizeof src_pwd, &src_pwd_sz, &src_key, &src_pw_read);
+ if (rc)
+ {
+ validate_instead:
+ rc = KFileAddRef (sf);
+ if (rc == 0)
+ {
+ PLOGMSG ( klogWarn, ( klogWarn, "file '$(name)' type '$(ftype)' will be validated but not be decoded: "
+ "no password given", "name=%s,ftype=%s", name, node -> ftype ));
+ /* can't decompress it - treat it as a normal file */
+ rc = KEncFileValidate (sf);
+ if (rc)
+ {
+ memmove (node->ftype + sizeof "Errored" - 1, node->ftype, strlen (node->ftype));
+ memmove (node->ftype, "Errored", sizeof "Errored" - 1);
+ }
+ * np = NULL;
+ return 0;
+ }
+ return rc;
+ }
+ }
+ rc = KEncFileMakeRead (&df, sf, &src_key);
+ if (rc)
+ goto validate_instead;
+ break;
+
+ case ccffteWGA:
+ if (!wga_pw_read)
+ rc = wga_password (src_path, wga_pwd, sizeof wga_pwd, &wga_pwd_sz, &wga_pw_read);
+ if (rc == 0)
+ {
+ rc = KFileMakeWGAEncRead (&df, sf, wga_pwd, wga_pwd_sz);
+ break;
+ }
+ /* can't decompress it - treat it as a normal file */
+ PLOGMSG ( klogWarn, ( klogWarn, "file '$(name)' type '$(ftype)' will not be decoded: "
+ "no password given", "name=%s,ftype=%s", name, node -> ftype ));
+ * np = NULL;
+ return 0;
+
+ default:
+ /* can't decrypt it - treat it as a normal file */
+ PLOGMSG ( klogWarn, ( klogWarn, "file '$(name)' type '$(ftype)' will not be decoded: "
+ "unknown encoding format", "name=%s,ftype=%s", name, node -> ftype ));
+ * np = NULL;
+ return 0;
+ }
+
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to decode file '$(path)'", "path=%s", name ));
+ else
+ {
+ rc = CCContainerNodeMake ( np, ntype, node );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create container node" );
+ else
+ {
+ CCContainerNode *cont = * np;
+ CCFileNode *nnode;
+
+ /* now create a new contained file node */
+ rc = CCFileNodeMake ( & nnode, expected );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create contained file node" );
+ else
+ {
+ int len;
+ char newname [ 256 ];
+
+ /* invent a new name for file */
+ const char *ext = strrchr ( name, '.' );
+ if ( ext == NULL )
+ len = snprintf ( newname, sizeof newname, "%s", name );
+ else
+ len = snprintf ( newname, sizeof newname, "%.*s", ( int ) ( ext - name ), name );
+
+ if ( len < 0 || len >= sizeof newname )
+ {
+ rc = RC ( rcExe, rcNode, rcConstructing, rcName, rcExcessive );
+ LOGERR ( klogErr, rc, "failed to create contained file node" );
+ }
+ else
+ {
+ void * save;
+ const KFile * cf;
+ /* rc_t krc; */
+
+ copycat_log_set (&node->logs, &save);
+
+ rc = CCFileMakeRead (&cf, df, &node->rc);
+ if (rc == 0)
+ {
+ /* recurse with buffer on decoding */
+ /* krc = */ ccat_buf ( & cont -> sub, cf, mtime,
+ ccContFile, nnode, newname);
+
+ KFileRelease (cf);
+ /* if successful, "node" ( allocated locally above )
+ will have been entered into "cont->sub" */
+ }
+
+ copycat_log_set (&save, NULL);
+ }
+ }
+ }
+
+ KFileRelease ( df );
+ }
+
+ return rc;
+}
+
+static
+rc_t ccat_cmp ( CCContainerNode **np, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name, uint32_t type_id )
+{
+ const KFile *zf;
+ /* use a variable incase we ever get a compression that can be queried
+ * about file size */
+ uint64_t expected = SIZE_UNKNOWN;
+ rc_t rc;
+
+ switch ( type_id )
+ {
+
+ case ccfftcGzip:
+ /* this code attaches a new reference to "sf" */
+ rc = KFileMakeGzipForRead ( & zf, sf );
+ break;
+ case ccfftcBzip2:
+ /* this code attaches a new reference to "sf" */
+ rc = KFileMakeBzip2ForRead ( & zf, sf );
+ break;
+ default:
+ /* can't decompress it - treat it as a normal file */
+ PLOGMSG ( klogWarn, ( klogWarn, "file '$(name)' type '$(ftype)' will not be decompressed: "
+ "unknown compression format", "name=%s,ftype=%s", name, node -> ftype ));
+ * np = NULL;
+ return 0;
+ }
+
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to decompress file '$(path)'", "path=%s", name ));
+ else
+ {
+ rc = CCContainerNodeMake ( np, ntype, node );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create container node" );
+ else
+ {
+ CCContainerNode *cont = * np;
+ CCFileNode *nnode;
+
+ /* now create a new contained file node */
+ rc = CCFileNodeMake ( & nnode, expected );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create contained file node" );
+ else
+ {
+ int len;
+ char newname [ 256 ];
+
+ /* invent a new name for file */
+ const char *ext = strrchr ( name, '.' );
+ if ( ext == NULL )
+ len = snprintf ( newname, sizeof newname, "%s", name );
+ else if ( strcasecmp ( ext, ".tgz" ) == 0 )
+ len = snprintf ( newname, sizeof newname, "%.*s.tar", ( int ) ( ext - name ), name );
+ else
+ len = snprintf ( newname, sizeof newname, "%.*s", ( int ) ( ext - name ), name );
+
+ if ( len < 0 || len >= sizeof newname )
+ {
+ rc = RC ( rcExe, rcNode, rcConstructing, rcName, rcExcessive );
+ LOGERR ( klogErr, rc, "failed to create contained file node" );
+ }
+ else
+ {
+ void * save;
+ const KFile * cf;
+ /* rc_t krc; */
+
+ copycat_log_set (&nnode->logs, &save);
+
+ rc = CCFileMakeRead (&cf, zf, &node->rc);
+ if (rc == 0)
+ {
+ /* recurse with buffer on decompression */
+ /* krc = */ ccat_buf (& cont -> sub, cf, mtime,
+ ccContFile, nnode, newname);
+
+ KFileRelease (cf);
+ /* if successful, "node" ( allocated locally above )
+ will have been entered into "cont->sub" */
+ }
+
+ copycat_log_set (save, NULL);
+ }
+ }
+ }
+
+ KFileRelease ( zf );
+ }
+
+ return rc;
+}
+
+static
+rc_t ccat_path_append (const char * name)
+{
+ size_t z;
+ z = string_size (name);
+ DEBUG_STATUS (("%s:in epath %s name %s z %zu \n",__func__, epath, name, z));
+ if (ehere + z + 1 >= epath + sizeof (epath))
+ return RC (rcExe, rcNoTarg, rcConcatenating, rcBuffer, rcTooShort);
+ memmove(ehere, name, z);
+ ehere += z;
+ *ehere++ = '/';
+ *ehere = '\0';
+ DEBUG_STATUS (("%s: out name %s epath %s\n",__func__,name, epath));
+ return 0;
+}
+
+static
+rc_t ccat_main ( CCTree *tree, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name )
+{
+ /* the pointer e_go_back allows us to remove additions to the stored
+ * path built up as we descend into deeper container/archive/directories */
+ char * e_go_back = ehere;
+
+ /* determine file type based upon contents and name */
+ uint32_t type_id, class_id;
+/* rc_t orc; */
+ rc_t rc = CCFileFormatGetType ( filefmt, sf, name,
+ node -> ftype, sizeof node -> ftype, & type_id, & class_id );
+
+ DEBUG_STATUS (("%s: name '%s' type '%s'\n",__func__,name,node->ftype));
+
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to determine type of file '$(path)'", "path=%s", name ));
+ else
+ {
+ /* file could be a container */
+ CCContainerNode *cont;
+ CCCachedFileNode *cfile;
+
+ /* assume this node will get name */
+ void *entry = node;
+
+ bool xml_insert = false;
+ bool tee_done = false;
+ /* create path */
+ const char * basename;
+ char path [ 8192 + 256 ];
+
+ if ((basename = strrchr (name, '/')) != NULL)
+ ++basename;
+ else
+ basename = name;
+
+
+ /* look for special files */
+ switch ( class_id )
+ {
+ case ccffcEncoded:
+ rc = ccat_path_append (name);
+ if (rc == 0)
+ {
+ rc = ccat_enc ( & cont, sf, mtime, ntype, node, basename, type_id );
+ if ( rc == 0 && cont != NULL )
+ {
+ ntype = ccContainer;
+ entry = cont;
+ }
+ }
+ ehere = e_go_back;
+ *ehere = '\0';
+ break;
+ case ccffcCompressed:
+ rc = ccat_path_append (name);
+ if (rc == 0)
+ {
+ rc = ccat_cmp ( & cont, sf, mtime, ntype, node, basename, type_id );
+ if ( rc == 0 && cont != NULL )
+ {
+ ntype = ccContainer;
+ entry = cont;
+ }
+ }
+ ehere = e_go_back;
+ *ehere = '\0';
+ break;
+ case ccffcArchive:
+ rc = ccat_path_append (name);
+ if (rc == 0)
+ {
+ rc = ccat_arc ( & cont, sf, mtime, ntype, node, basename, type_id );
+ if ( rc == 0 && cont != NULL )
+ {
+ ntype = ccArchive;
+ entry = cont;
+ }
+ }
+ ehere = e_go_back;
+ *ehere = '\0';
+ break;
+ case ccffcCached:
+ if ( cdir != NULL )
+ {
+ rc = ccat_cache ( & cfile, sf, ntype, node, basename );
+ if ( rc == 0 && cont != NULL )
+ {
+ tee_done = true;
+ ntype = ccCached;
+ entry = cfile;
+ }
+ }
+ /* fall through */
+ default:
+ rc = ccat_extract_path (path, sizeof path, name);
+ DEBUG_STATUS (("%s: extract_path '%s'\n",__func__,path));
+ if ((edir != NULL) && (! tee_done))
+ {
+ rc = ccat_extract (sf, path);
+ if (rc == 0)
+ tee_done = true;
+ }
+ if (rc == 0)
+ {
+ xml_insert = true;
+ }
+ if (!tee_done)
+ {
+ const KFile * cf;
+
+ rc = CCFileMakeRead (&cf, sf, &node->rc);
+ if (rc == 0)
+ {
+ const KFile * tee;
+
+ rc = KFileMakeTeeRead (&tee, cf, fnull);
+ if (rc == 0)
+ {
+ rc = KFileAddRef (fnull);
+
+ KFileRelease (tee);
+ }
+ }
+ }
+ break;
+ }
+
+ /* create entry into tree */
+ if ( rc == 0 )
+ {
+ if (! xml_dir)
+ {
+ DEBUG_STATUS (("%s: ready to insert '%s'\n",__func__,name));
+ rc = CCTreeInsert ( tree, mtime, ntype, entry, name );
+ /* if we are extracting create a name node with other information being incorrect */
+ if (edir != NULL)
+ {
+ }
+ }
+ else if (xml_insert)
+ {
+ DEBUG_STATUS (("%s: ready to insert '%s' for '%s'\n",__func__,path, name));
+ rc = CCTreeInsert (etree, mtime, ntype, entry, path);
+ }
+
+ if ( rc != 0 )
+ PLOGERR (klogInt, (klogInt, rc,
+ "failed to enter node '$(name)'",
+ "name=%s", name ));
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t ccat_sz ( CCTree *tree, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name )
+{
+ /* create a counting file to fill out its size */
+ const KFile *sz;
+ rc_t rc, orc;
+
+ rc = KFileMakeCounterRead ( & sz, sf, & node -> size, & node -> lines, true );
+
+
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to create counting wrapper for '$(path)'", "path=%s", name ));
+ else
+ {
+ /* give the wrapper its own reference
+ rather than taking the one we gave it */
+ rc = KFileAddRef ( sf );
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "Error in reference counting for '$(path)'", "path=%s", name ));
+ else
+ /* the main catalog function */
+ rc = ccat_main ( tree, sz, mtime, ntype, node, name );
+
+ /* release the sizer */
+ orc = KFileRelease ( sz );
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, orc, "Error in closing byte counting for '$(path)'", "path=%s", name ));
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+
+ return rc;
+}
+
+rc_t ccat_md5 ( CCTree *tree, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name )
+{
+ /* all files have an MD5 hash for identification.
+ the following code is for expediency.
+ we already have a formatter for output,
+ and to reuse it we simply pipe its output
+ to /dev/null, so to speak */
+ KMD5SumFmt *fmt;
+ rc_t rc, orc;
+
+ /* NEW - there are some cases where md5sums would not be useful
+ and only take up CPU power. */
+ if ( no_md5 )
+ return ccat_sz ( tree, sf, mtime, ntype, node, name );
+
+ /* normal md5 path */
+ rc = KMD5SumFmtMakeUpdate ( & fmt, fnull );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to create md5sum formatter for '$(path)'", "path=%s", name ));
+ else
+ {
+ const KFile *md5;
+
+ /* give another fnull reference to formatter */
+ rc = KFileAddRef ( fnull );
+ if (rc)
+ LOGERR (klogInt, rc, "Error referencing MD5 format file");
+ else
+ {
+
+ /* this is the wrapper that calculates MD5 */
+ rc = KFileMakeNewMD5Read ( & md5, sf, fmt, name );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to create md5 wrapper for '$(path)'", "path=%s", name ));
+ else
+ {
+ /* give the wrapper its own reference
+ rather than taking the one we gave it */
+ rc = KFileAddRef ( sf );
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failure in reference counting file for '$(path)'",
+ "path=%s", name ));
+ else
+ {
+ /* continue on to obtaining file size */
+ rc = ccat_sz ( tree, md5, mtime, ntype, node, name );
+
+ /* this will drop the MD5 calculator, but not
+ its source file, and cause the digest to be
+ written to its formatter */
+ orc = KFileRelease ( md5 );
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failure in release reference counting file for '$(path)'",
+ "path=%s", name ));
+ if (rc == 0)
+ rc = orc;
+ }
+
+ /* if there were no errors, read the MD5 from formatter.
+ this must be done AFTER releasing the MD5 file,
+ or nothing will ever get written */
+ if ( rc == 0 )
+ {
+ bool bin;
+ rc = KMD5SumFmtFind ( fmt, name, node -> _md5, & bin );
+ }
+ }
+ }
+ }
+
+ /* dump the formatter, but not fnull */
+ orc = KMD5SumFmtRelease ( fmt );
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failure in releasing MD5 format file for '$(path)'",
+ "path=%s", name ));
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+
+ return rc;
+}
+
+/* buffered recursion entrypoint */
+rc_t ccat_buf ( CCTree *tree, const KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name )
+{
+ /* create a buffered file to counter random access */
+ const KFile *buf;
+ rc_t rc, orc;
+
+#if USE_KBUFFILE
+ rc = KBufFileMakeRead (&buf, sf, 2 * 32 * 1024);
+#else
+ rc = KFileMakeReadHead (&buf, sf, 4096);
+#endif
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to create buffer for '$(path)'",
+ "path=%s", name ));
+ else
+ {
+ /* skip ccat */
+ rc = ccat_md5 ( tree, buf, mtime, ntype, node, name );
+
+ /* release the buffer */
+ orc = KFileRelease ( buf );
+ if (orc)
+ {
+ PLOGERR (klogInt, (klogInt, orc, "Error closing buffer for '$(path)'", "path=%s", name ));
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+ return rc;
+}
+
+
+typedef struct copycat_pb
+{
+ CCTree * tree;
+ const KFile * sf;
+ KFile * df;
+ KTime_t mtime;
+ enum CCType ntype;
+ CCFileNode * node;
+ const char * name;
+} copycat_pb;
+
+
+rc_t copycat_add_tee (const copycat_pb * ppb)
+{
+ const KFile * tee;
+ rc_t rc, orc;
+
+ rc = KFileMakeTeeRead (&tee, ppb->sf, ppb->df);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "failed to create encrypter for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ rc = KFileAddRef (ppb->df);
+ if (rc)
+ LOGERR (klogInt, rc, "Reference counting error");
+ else
+ {
+ rc = KFileAddRef (ppb->sf);
+ if (rc)
+ LOGERR (klogInt, rc, "Reference counting error");
+ else
+ {
+ orc = ccat_md5 (ppb->tree, tee, ppb->mtime, ppb->ntype, ppb->node, ppb->name);
+
+ /* report? */
+ orc = KFileRelease (tee);
+ if (orc)
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "Error in closing byte counting for '$(path)'",
+ "path=%s", ppb->name ));
+
+/* orc = KFileRelease (ppb->sf); */
+/* if (orc) */
+/* PLOGERR (klogInt, */
+/* (klogInt, orc, */
+/* "Error in closing byte counting of tee source for '$(path)'", */
+/* "path=%s", ppb->name )); */
+ }
+/* orc = KFileRelease (ppb->df); */
+/* if (orc) */
+/* PLOGERR (klogInt, */
+/* (klogInt, orc, */
+/* "Error in closing byte counting of tee destination for '$(path)'", */
+/* "path=%s", ppb->name )); */
+ }
+ }
+ return rc;
+}
+
+
+static
+rc_t copycat_add_node (const copycat_pb * ppb)
+{
+ rc_t rc;
+
+ rc = ccat_path_append (ppb->name);
+ if (rc == 0)
+ {
+ CCContainerNode *cont;
+
+ /* make a container node for the encrypted output file */
+ rc = CCContainerNodeMake (&cont, ccFile, ppb->node);
+ if (rc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc, "error creating container node for '$(path)'",
+ "path=%s", ppb->name));
+ }
+ else
+ {
+ copycat_pb pb = *ppb;
+ uint64_t expected = /*(ppb->node->expected != SIZE_UNKNOWN)
+ ? ppb->node->expected :*/ SIZE_UNKNOWN;
+ pb.tree = &cont->sub;
+
+ /* this will be the node for the unencrypted version of the output file */
+ rc = CCFileNodeMake (&pb.node, expected );
+ if (rc)
+ LOGERR (klogInt, rc, "failed to create contained node");
+ else
+ {
+ void * save;
+ size_t len;
+ size_t elen;
+ size_t clen;
+ rc_t orc;
+ char name [ 1024 ];
+
+ len = strlen (pb.name);
+ elen = strlen (ncbi_encryption_extension);
+ clen = len - elen;
+
+ /*
+ *if the name had .ncbi_enc at the end remove it
+ * for the inner node.
+ */
+ if (strcmp (ncbi_encryption_extension, pb.name + clen) == 0)
+ {
+ memmove (name, pb.name, clen);
+ name[clen] = '\0';
+ }
+ /*
+ * if it did not, prepend '.' to the name
+ */
+ else
+ {
+ name[0] = '.';
+ if (len > sizeof name - 2)
+ len = sizeof name - 2;
+ strncpy (name+1, pb.name, len);
+ name[len+1] = '\0';
+ }
+ pb.name = name;
+
+ copycat_log_set (&pb.node->logs, &save);
+
+ rc = copycat_add_tee (&pb);
+
+ copycat_log_set (save, NULL);
+
+ orc = CCTreeInsert (ppb->tree, ppb->mtime, ccContainer, cont, ppb->name);
+
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+ }
+ return rc;
+}
+
+/* -----
+ * copycat_add_enc
+ *
+ * add an encryptor to the copy chain
+ */
+rc_t copycat_add_enc (const copycat_pb * ppb)
+{
+ copycat_pb pb = *ppb;
+ rc_t rc = 0;
+
+ if (!dst_pw_read)
+ rc = get_password (dst_path, dst_pwd, sizeof dst_pwd, &dst_pwd_sz, &dst_key, &dst_pw_read);
+ if (rc)
+ return rc;
+
+ rc = KEncFileMakeWrite (&pb.df, ppb->df, &dst_key);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "failed to create encrypter for '$(path)'",
+ "path=%s", pb.name ));
+ else
+ {
+ strncpy (pb.node->ftype, "Encoded/NCBI", sizeof pb.node->ftype);
+
+
+ /* add the container to the cataloging tree */
+ rc = copycat_add_node (&pb);
+ if (rc == 0)
+ {
+ rc = KFileRelease (pb.df);
+ if (rc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "Error in closing byte counting for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* -----
+ * copycat_add_sz
+ *
+ * if we are encrypting the output we need to do an actual byte count across the
+ * write side of the encryption so we add a filter into the copy chain. If we
+ * are not encrypting we do this calculation in the ccat chain for the outside file
+ * and never reach this function.
+ */
+rc_t copycat_add_sz (const copycat_pb * ppb)
+{
+ /* create a counting file to fill out its size */
+ copycat_pb pb = *ppb;
+ rc_t rc, orc;
+
+ rc = KFileMakeCounterWrite (&pb.df, ppb->df, &pb.node->size, &pb.node->lines, true);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create counting wrapper for '$(path)'",
+ "path=%s", pb.name ));
+ else
+ {
+ /* give the wrapper its own reference
+ rather than taking the one we gave it */
+ rc = KFileAddRef ( ppb->df );
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc, "Error in reference counting for '$(path)'",
+ "path=%s", pb.name));
+ else
+ rc = copycat_add_enc (&pb);
+
+ /* release the sizer */
+ orc = KFileRelease (pb.df);
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, orc, "Error in closing byte counting "
+ "(probable read error) for '$(path)'", "path=%s",
+ pb.name ));
+ /* a failure in the counter destructor might mean a failure
+ * in the copy so return the error */
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+
+ return rc;
+}
+
+
+/* -----
+ * copycat_add_md5
+ *
+ * if we are encrypting the output we need to do an md5 calculation across the
+ * write side of the encryption so we add a filter into the copy chain. If we
+ * are not encrypting we do the md5 calculation in the ccat chain for the outside file
+ * and never reach this function.
+ */
+rc_t copycat_add_md5 (const copycat_pb * ppb)
+{
+ /* all files have an MD5 hash for identification.
+ the following code is for expediency.
+ we already have a formatter for output,
+ and to reuse it we simply pipe its output
+ to /dev/null, so to speak */
+ KMD5SumFmt *fmt;
+ rc_t rc;
+
+ if ( no_md5 )
+ return copycat_add_sz (ppb);
+
+ rc = KMD5SumFmtMakeUpdate (&fmt, fnull);
+ if ( rc != 0 )
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create md5sum formatter for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ rc_t orc;
+ /* give another fnull reference to formatter */
+ rc = KFileAddRef (fnull);
+ if (rc)
+ LOGERR (klogInt, rc, "Error referencing MD5 format file");
+ else
+ {
+ copycat_pb pb = *ppb;
+
+ /* this is the wrapper that calculates MD5 */
+ rc = KMD5FileMakeWrite ((struct KMD5File**)&pb.df, ppb->df, fmt, ppb->name );
+ if ( rc != 0 )
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create md5 wrapper for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ /* give the wrapper its own reference
+ rather than taking the one we gave it */
+ rc = KFileAddRef (ppb->df);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failure in reference counting file for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ /* continue on to obtaining file size */
+ rc = copycat_add_sz (&pb);
+
+ /* this will drop the MD5 calculator, but not
+ its source file, and cause the digest to be
+ written to its formatter */
+ orc = KFileRelease (pb.df);
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "failure in releasing md5 calculation file for '$(path)'",
+ "path=%s", ppb->name ));
+ }
+
+ /* if there were no errors, read the MD5 from formatter.
+ this must be done AFTER releasing the MD5 file,
+ or nothing will ever get written */
+ if (orc == 0)
+ {
+ bool bin;
+ orc = KMD5SumFmtFind (fmt, ppb->name, ppb->node->_md5, &bin);
+ if (orc)
+ PLOGERR (klogWarn,
+ (klogWarn, orc,
+ "Error in obtaining the MD5 for '$(path)'",
+ "path=%s", pb.name));
+ }
+ }
+ }
+
+ /* dump the formatter, but not fnull */
+ orc = KMD5SumFmtRelease (fmt);
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failure in releasing MD5 format file for '$(path)'",
+ "path=%s", ppb->name ));
+ /* we can 'forget' this error after logging it */
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+
+ return rc;
+}
+
+/* -----
+ * copycat_add_crc
+ *
+ * this is the first function in building the write side of the copy chain
+ *
+ * We calculate a crc on the outgoing file and none of the interior files
+ * and we do that at this point in the chain regardless of whether we will
+ * encrypt the outgoing file.
+ *
+ * We'll add the crc calculator to the write side stream and then decide
+ * whether to add an encryptor into the chain. We add one to the write side
+ * of the chain if we have an encrypting password or jump to finishing the
+ * copy chain if we do not
+ */
+rc_t copycat_add_crc (const copycat_pb * ppb)
+{
+ /* external files have a CRC32 checksum
+ the following code is for expediency.
+ we already have a formatter for output,
+ and to reuse it we simply pipe its output
+ to /dev/null, so to speak */
+ rc_t rc;
+ KCRC32SumFmt * fmt;
+
+ rc = KCRC32SumFmtMakeUpdate ( &fmt, fnull );
+ if ( rc != 0 )
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create crc32sum formatter for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ rc_t orc = 0;
+
+ /* give another fnull reference to formatter */
+ rc = KFileAddRef ( fnull );
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "error in reference counting crc formatter fnull for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ copycat_pb pb = *ppb;
+
+ /* this is the wrapper that calculates CRC32 */
+ rc = KCRC32FileMakeWrite ( (KCRC32File**)&pb.df, ppb->df, fmt, ppb->name );
+ if ( rc != 0 )
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create crc32 wrapper for '$(path)'",
+ "path=%s", ppb->name ));
+ else
+ {
+ /* give the wrapper its own reference
+ rather than taking the one we gave it */
+ rc = KFileAddRef (ppb->df);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "error in reference counting file for '$(path)'",
+ "path=%s", ppb->name ));
+ else if (do_encrypt)
+ {
+ /* add in the size of the enc header */
+ if (pb.node->expected != SIZE_UNKNOWN)
+ {
+ uint64_t temp;
+
+ temp = pb.node->expected; /* current expected count */
+
+ temp += (ENC_DATA_BLOCK_SIZE - 1); /* add enough to fill last block */
+ temp /= ENC_DATA_BLOCK_SIZE; /* how many blocks */
+ temp *= sizeof (KEncFileBlock); /* size of encrypted blocks */
+ temp += sizeof (KEncFileHeader) + sizeof (KEncFileFooter);
+ pb.node->expected = temp;
+ }
+ rc = copycat_add_md5 (&pb);
+ }
+ else
+ rc = copycat_add_tee (&pb);
+
+ /* this will drop the CRC calculator, but not
+ its source file, and cause the CRC to be
+ written to its formatter */
+ orc = KFileRelease (pb.df);
+ if (orc)
+ {
+ LOGERR (klogErr, orc, "Failed to close out crc calculator");
+ /* an error here implies an error in the copy so report it */
+ rc = orc;
+ }
+ }
+ /* if there were no errors, read the CRC from formatter.
+ this must be done AFTER releasing the CRC file,
+ or nothing will ever get written */
+ if ( rc == 0 )
+ {
+ bool bin;
+ orc = KCRC32SumFmtFind ( fmt, ppb->name, &pb.node->crc32, &bin );
+ if (orc)
+ PLOGERR (klogWarn,
+ (klogWarn, orc,
+ "Failed to obtain the CRC for '$(path)'",
+ "path=%s", pb.name));
+ /* an error here isn't an error in copy */
+ }
+ }
+ /* dump the formatter, but not fnull */
+ orc = KCRC32SumFmtRelease ( fmt );
+ if (orc)
+ LOGERR (klogWarn, orc, "Failed to close off CRC storage");
+ /* this error we do not need to track */
+ if (rc == 0)
+ rc = orc;
+ }
+ return rc;
+}
+
+
+/* -----
+ * copycat_add_buf2
+ *
+ * This function adds buffering to the outermostDecrypted file read so that we
+ * can read the first portion of the file for file type analysis and then
+ * re-read it for cataloging.
+ *
+ * At this point the only file type analysis needed is to determine
+ * whether we have in incoming encrypted file We've already checked for
+ * the existence of the key or we wouldn't get here.
+ */
+rc_t copycat_add_buf2 (const copycat_pb * ppb)
+{
+ copycat_pb pb = *ppb;
+ rc_t rc = 0;
+
+ /* create a buffered file to allow re-reading of the first 128 bytes
+ * a tad overkill */
+#if USE_KBUFFILE
+ rc = KBufFileMakeRead (&pb.sf, ppb->sf, 2*32*1024);
+#else
+ rc = KFileMakeReadHead (&pb.sf, ppb->sf, 4*1024);
+#endif
+ if (rc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create buffer for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ else
+ {
+ rc_t orc;
+
+ rc = copycat_add_crc (&pb);
+
+ orc = KFileRelease (pb.sf);
+ if (orc)
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "failed to read buffer for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ return rc;
+}
+
+
+/* -----
+ * copycat_add_dec
+ *
+ * add a decryption to the read side of the copy chain.
+ * no other decisions made here
+ */
+rc_t copycat_add_dec_ncbi (const copycat_pb * ppb)
+{
+ copycat_pb pb = *ppb;
+ rc_t rc = 0;
+
+ if (!src_pw_read)
+ rc = get_password (src_path, src_pwd, sizeof src_pwd, &src_pwd_sz, &src_key, &src_pw_read);
+
+ if (rc == 0)
+ {
+ rc = KEncFileMakeRead (&pb.sf, ppb->sf, &src_key);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create decrypter for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ if (rc == 0)
+ {
+ rc_t orc;
+
+ /* this decryption won't know its output size until it gets there */
+ pb.node->expected = SIZE_UNKNOWN;
+ rc = copycat_add_buf2 (&pb);
+ orc = KFileRelease (pb.sf);
+ if (orc)
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "failed to close decrypter for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ return rc;
+}
+
+rc_t copycat_add_dec_wga (const copycat_pb * ppb)
+{
+ copycat_pb pb = *ppb;
+ rc_t rc = 0;
+
+ if (!src_pw_read)
+ rc = wga_password (src_path, src_pwd, sizeof src_pwd, &src_pwd_sz, &src_pw_read);
+
+ if (rc == 0)
+ {
+ rc = KFileMakeWGAEncRead (&pb.sf, ppb->sf, src_pwd, src_pwd_sz);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create decrypter for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ if (rc == 0)
+ {
+ rc_t orc;
+
+ if (pb.node->expected != SIZE_UNKNOWN)
+ pb.node->expected -= 128; /* subtract off the size of the WGA header */
+ rc = copycat_add_buf2 (&pb);
+ orc = KFileRelease (pb.sf);
+ if (orc)
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "failed to close decrypter for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ return rc;
+}
+
+/* -----
+ * copycat_add_dec
+ *
+ * At this point the only file type analysis needed is to determine
+ * whether we have in incoming encrypted file We've already checked for
+ * the existence of the key or we wouldn't get here.
+ */
+rc_t copycat_add_dec (const copycat_pb * ppb)
+{
+ copycat_pb pb = *ppb;
+ rc_t rc = 0;
+ size_t num_read;
+ uint8_t buff [128];
+
+ rc = KFileReadAll (pb.sf, 0, buff, sizeof buff, &num_read);
+ if (rc)
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to read buffer for '$(path)'",
+ "path=%s", pb.name ));
+ else
+ {
+ rc_t orc;
+
+ /*
+ * if we have an encrypted file add decryption to the chain
+ * if not jump sraight to the write side of the chain
+ */
+ if (CCFileFormatIsNCBIEncrypted (buff))
+ rc = copycat_add_dec_ncbi (&pb);
+ else if (KFileIsWGAEnc (buff, num_read) == 0)
+ rc = copycat_add_dec_wga (&pb);
+ else
+ rc = copycat_add_crc (&pb);
+
+ orc = KFileRelease (pb.sf);
+ if (orc)
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "failed to read buffer for '$(path)'",
+ "path=%s", pb.name ));
+ }
+ return rc;
+}
+
+
+/* -----
+ * copycat
+ *
+ * The copycat function is the actual copy and catalog function.
+ * All before this function is called is building toward this.
+ *
+ * The functions prefixed copycat_add_ are functions used in building the
+ * chain of KFS and other filters for doing the copy function. Some
+ * cataloging is included where the output file is encoded and to
+ * generate the CRC unique to the outer file in the catalog.
+ * The ccat_add_ functions are filters toward the leafs in the catlog
+ * portion of the program.
+ *
+ * Much of this could be inlined but the indention creep across the screen
+ * and the handling of levels of indention would get intense. Also some
+ * filters are skipped which also would have made it more unweildy to
+ * write and maintain.
+ *
+ * In this function we build a node for cataloging the outermost layer of
+ * the output file which may differ from the file as read here if a
+ * decryption and/or encryption is added.
+ *
+ * We then
+ */
+rc_t copycat (CCTree *tree, KTime_t mtime, KDirectory * _cwd,
+ const VPath * src, const KFile *sf,
+ const VPath * dst, KFile *df,
+ const char *spath, const char *name,
+ uint64_t expected, bool _do_decrypt, bool _do_encrypt)
+{
+ void * save;
+ copycat_pb pb;
+ rc_t rc;
+
+ DEBUG_STATUS (("%s: copy file %s\n",__func__, spath));
+
+ cwd = _cwd;
+ src_path = src;
+ dst_path = dst;
+
+ src_pw_read = false;
+
+ do_decrypt = _do_decrypt;
+ do_encrypt = _do_encrypt;
+
+ /* -----
+ * Create a cataloging node for the outer most file as written
+ */
+ rc = CCFileNodeMake ( &pb.node, expected );
+ if (rc)
+ {
+ LOGERR ( klogInt, rc, "failed to allocate file node" );
+ return rc;
+ }
+
+ pb.tree = tree;
+ pb.mtime = mtime;
+ pb.ntype = ccFile;
+ pb.name = name;
+
+
+ copycat_log_set (&pb.node->logs, &save);
+
+ if (out_block)
+ {
+ rc = KBufWriteFileMakeWrite (&pb.df, df, out_block);
+ if (rc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create buffer for '$(path)'",
+ "path=%s", pb.name ));
+ return rc;
+ }
+ }
+ else
+ {
+ pb.df = df;
+ }
+
+ if (in_block)
+ {
+ rc = KBufReadFileMakeRead (&pb.sf, sf, in_block);
+ }
+ else
+ {
+#if USE_KBUFFILE
+ rc = KBufFileMakeRead (&pb.sf, sf, 2*32*1024);
+#else
+ rc = KFileMakeReadHead (&pb.sf, sf, 4*1024);
+#endif
+ }
+ if (rc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, rc,
+ "failed to create buffer for '$(path)'",
+ "path=%s", spath ));
+ return rc;
+ }
+ else
+ {
+ /*
+ * if we have a decryption password prepare a decryption read path
+ * if not jump to preparing the write path
+ */
+ rc = do_decrypt
+ ? copycat_add_dec (&pb)
+ : copycat_add_crc (&pb);
+ }
+ copycat_log_set (save, NULL);
+
+ return rc;
+}
diff --git a/tools/copycat/cccopier.c b/tools/copycat/cccopier.c
new file mode 100644
index 0000000..07c6a21
--- /dev/null
+++ b/tools/copycat/cccopier.c
@@ -0,0 +1,217 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <atomic.h>
+
+#include <kapp/main.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kapp/log.h>
+
+#include "copycat-priv.h"
+
+
+struct Copier
+{
+ atomic32_t refcount;
+ BufferQ * q; /* input q for buffers to copy to file */
+ KFile * f; /* output file (actually a KMD5File) */
+ uint64_t o; /* how far into the output file are we */
+};
+
+
+rc_t CopierRelease (const Copier * cself)
+{
+ rc_t rc = 0;
+ Copier * self = (Copier*)cself;
+
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ rc = KFileRelease (self->f);
+ if (rc == 0)
+ {
+ rc = BufferQRelease (self->q);
+ if (rc == 0)
+ {
+ free (self);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t CopierAddRef (const Copier * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((Copier*)self)->refcount);
+ return 0;
+}
+
+static
+rc_t CopierMakeF (Copier * cp, KDirectory * dir, const char * path)
+{
+ rc_t rc, orc;
+ KFile * fm;
+
+ rc = KDirectoryCreateFile (dir, &fm, true, 0666, kcmCreate|kcmParents,
+ "%s.md5", path);
+ if (rc == 0)
+ {
+ KMD5SumFmt * md5f;
+ rc = KMD5SumFmtMakeUpdate (&md5f, fm);
+ if (rc == 0)
+ {
+ KFile * f;
+ rc = KDirectoryCreateFile (dir, &f, false, 0666, kcmCreate,
+ "%s", path);
+ if (rc == 0)
+ {
+ KMD5File * fmd5;
+ rc = KMD5FileMakeWrite (&fmd5, f, md5f, path);
+ if (rc == 0)
+ {
+ cp->f = KMD5FileToKFile (fmd5);
+ orc = KMD5SumFmtRelease (md5f);
+ if (orc)
+ LOGERR (klogInt, orc, "Failure releasing MD5 format");
+ cp->o = 0; /* start of file */
+ return rc;
+ }
+ orc = KFileRelease (f);
+ if (orc)
+ LOGERR (klogInt, orc, "Failure releasing Copier file");
+ }
+ orc = KMD5SumFmtRelease (md5f);
+ if (orc)
+ LOGERR (klogInt, orc, "Failure releasing MD5 format");
+ }
+ orc = KFileRelease (fm);
+ if (orc)
+ LOGERR (klogInt, orc, "Failure releasing MD5SUM file");
+ }
+ return rc;
+}
+
+rc_t CopierMake (Copier ** c, KDirectory * dir, const char * path, uint32_t timeout, uint32_t length)
+{
+ rc_t rc = 0, orc;
+ Copier * self;
+
+ self = malloc (sizeof *self);
+ if (self == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ }
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ self->f = NULL;
+ self->q = NULL;
+ rc = CopierMakeF (self, dir, path);
+ if (rc == 0)
+ {
+ rc = BufferQMake (&self->q, timeout, length);
+ if (rc == 0)
+ {
+ *c = self;
+ atomic32_set (&self->refcount, 1);
+ return rc;
+ }
+ }
+ orc = CopierRelease (self);
+ if (orc)
+ LOGERR (klogInt, orc, "Error releasing Copier");
+ }
+ return rc;
+}
+
+rc_t CopierDoOne (Copier * self)
+{
+ rc_t rc = 0;
+ const Buffer * b;
+
+ LOGMSG (klogDebug10, "CopierDoOne");
+ rc = Quitting();
+ if (rc == 0)
+ {
+ LOGMSG (klogDebug10, "call BufferQPopBuffer");
+ rc = BufferQPopBuffer (self->q, &b, NULL);
+ if (rc == 0)
+ {
+ size_t w;
+ size_t z;
+ LOGMSG (klogDebug10, "call BufferContentGetSize");
+ z = BufferContentGetSize (b);
+ rc = KFileWrite (self->f, self->o, b, z, &w);
+ self->o += w;
+ if (w != z)
+ rc = RC (rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete);
+ else
+ rc = BufferRelease (b);
+ }
+ /* ow this is ugly! */
+ /* is the rc a "exhausted" on a timeout? */
+ else if ((GetRCObject(rc) == rcTimeout) && (GetRCState(rc) == rcExhausted))
+ {
+ rc = 0;
+ LOGMSG (klogDebug10, "CopierDoOne timeout");
+ /* if so is the queue also sealed? */
+ if (BufferQSealed (self->q) == true)
+ {
+ LOGMSG (klogDebug10, "CopierDoOne sealed");
+ /* if both then we are done and so signal */
+ rc = KFileRelease (self->f);
+ PLOGMSG (klogDebug10, "CopierDoOne back from KFileRelease $(rc)",PLOG_U32(rc),rc);
+ if (rc == 0)
+ {
+ self->f = NULL;
+ rc = BufferQRelease (self->q);
+ if (rc == 0)
+ {
+ self->q = NULL;
+ rc = RC (rcExe, rcNoTarg, rcCopying, rcNoTarg, rcDone );
+ }
+ }
+ }
+ }
+ else
+ LOGMSG (klogDebug10, "CopierDoOne pop failure");
+
+ }
+ else
+ LOGMSG (klogDebug10, "CopierDoOne: quitting");
+ return rc;
+}
+
+BufferQ * CopierGetQ (Copier *self)
+{
+ return (self->q);
+}
+
diff --git a/tools/copycat/cccopy.c b/tools/copycat/cccopy.c
new file mode 100644
index 0000000..b46f241
--- /dev/null
+++ b/tools/copycat/cccopy.c
@@ -0,0 +1,347 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <assert.h>
+#include <atomic.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <kapp/log.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/teefile.h>
+#include "copycat.h"
+
+
+/* ======================================================================
+ * CCCopy does up the copy portion of the copycat tool's functionality
+ * and sets up CCCat that does the Catalog portion.
+ */
+struct CCCopy
+{
+ atomic32_t refcount;
+ const KDirectory * in;
+ KDirectory * out;
+ KDirectory * xml;
+ KMD5SumFmt * md5;
+ CCFileFormat * ff;
+ CCTree * tree;
+ uint32_t timeout;
+ bool force;
+ char path[4096];
+};
+
+rc_t CCCopyAddRef (const CCCopy * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((CCCopy*)self)->refcount);
+ return 0;
+}
+
+rc_t CCCopyRelease (const CCCopy * cself)
+{
+ CCCopy * self = (CCCopy *)cself;
+ rc_t rc = 0;
+ LOGMSG (klogDebug9, "Enter: CCCopyRelease");
+
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ KDirectoryRelease (self->in);
+ KDirectoryRelease (self->out);
+ KDirectoryRelease (self->xml);
+ KMD5SumFmtRelease (self->md5);
+ CCFileFormatRelease (self->ff);
+ free (self);
+ }
+ }
+ return rc;
+}
+
+rc_t CCCopyMake (CCCopy ** p, const KDirectory * in, KDirectory * out,
+ KDirectory * xml, bool force, KMD5SumFmt * md5,
+ CCFileFormat * ff, CCTree * tree, const char * path)
+{
+ rc_t rc;
+ size_t pathlen;
+ CCCopy * self;
+ char relpath [4096];
+
+ assert (in != NULL);
+ assert (out != NULL);
+ assert (xml != NULL);
+ assert (path != NULL);
+
+ rc = KDirectoryResolvePath (in, false, relpath, sizeof relpath, "%s", path);
+ if (rc != 0)
+ {
+ pLOGERR (klogErr, rc, "unable to resolve path $(P)", PLOG_S(P), path);
+ return rc;
+ }
+ if ((relpath[0] == '.') && (relpath[1] == '.') && (relpath[2] == '/'))
+ {
+ rc = RC (rcExe, rcDirectory, rcResolving, rcPath, rcOutOfKDirectory);
+ pLOGERR (klogErr, rc, "Path must resolve to current directory or subdirectories $(P)",
+ PLOG_S(P), relpath);
+ return rc;
+ }
+
+ pathlen = strlen(relpath);
+ self = malloc (sizeof (*self) - sizeof (*self->path) + pathlen + 1);
+ if (self == NULL)
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ KDirectoryAddRef (in);
+ KDirectoryAddRef (out);
+ KDirectoryAddRef (xml);
+ KMD5SumFmtAddRef (md5);
+ CCFileFormatAddRef (ff);
+ self->in = in;
+ self->out = out;
+ self->xml = xml;
+ self->force = force;
+ self->md5 = md5;
+ self->ff = ff;
+ self->tree = tree;
+ memmove (self->path, relpath, pathlen+1);
+ *p = self;
+ }
+ return rc;
+}
+static
+rc_t CCCopyDoFile (CCCopy * self)
+{
+ const KFile * original;
+ rc_t rc = 0;
+ enum KCreateMode mode;
+
+ PLOGMSG (klogDebug9, "CCCopyDoFile $(f)", PLOG_S(f), self->path);
+
+ if (! self->force)
+ {
+ /* if not forced replace mode we fail on existing file */
+ mode = kcmCreate;
+ }
+ else
+ {
+ uint32_t tt;
+
+ tt = KDirectoryPathType (self->out, "%s", self->path);
+ switch (tt)
+ {
+ default:
+ PLOGMSG (klogWarn, "File exists and will be replaced in output directory $(f)",
+ PLOG_S(f), self->path);
+ break;
+ /* if the path to the file or the file do not exist no warning */
+ case kptNotFound:
+ case kptBadPath:
+ break;
+ }
+ tt = KDirectoryPathType (self->xml, "%s", self->path);
+ switch (tt)
+ {
+ default:
+ PLOGMSG (klogWarn, "File exists and might be replaced in xml directory $(f)",
+ PLOG_S(f), self->path);
+ break;
+ /* if the path to the file or the file do not exist no warning */
+ case kptNotFound:
+ case kptBadPath:
+ break;
+ }
+
+ /* forced mode we create with init instead of create forcing a delete/create effect */
+ mode = kcmInit;
+ }
+
+ /* open original source for read */
+ rc = KDirectoryOpenFileRead (self->in, &original, "%s", self->path);
+ if (rc == 0)
+ {
+ KFile * copy;
+
+ /* create copy output for write */
+ rc = KDirectoryCreateFile (self->out, ©, false, 0644, mode|kcmParents,
+ "%s", self->path);
+ if (rc == 0)
+ {
+ KFile * fm;
+
+ /* create parallel <path>.md5 */
+ rc = KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5",
+ self->path);
+ if (rc == 0)
+ {
+ KMD5SumFmt * md5f;
+
+ /* make the .md5 an MD5 sum format file */
+ rc = KMD5SumFmtMakeUpdate (&md5f, fm);
+ if (rc == 0)
+ {
+ union u
+ {
+ KFile * kf;
+ KMD5File * mf;
+ } outf;
+
+ /* combine the copy and MD5 file into our special KFile */
+ rc = KMD5FileMakeWrite (&outf.mf, copy, md5f, self->path);
+ if (rc == 0)
+ {
+ const KFile * inf;
+
+ /* release this outside reference to the MD5SumFMT leaving
+ * only the one internal to the KMD5File */
+ KMD5SumFmtRelease (md5f);
+
+ /* create the KTeeFile that copies reads from the
+ * original as writes to the copy. Reads will be
+ * made by the cataloging process */
+ rc = KFileMakeTeeRead (&inf, original, outf.kf);
+ if (rc == 0)
+ {
+ CCCat * po;
+ KTime_t mtime;
+
+ /* try to get a modification time for this pathname */
+ rc = KDirectoryDate (self->in, &mtime, "%s", self->path);
+ if (rc != 0)
+ mtime = 0; /* default to ? 0? */
+
+ /* create the cataloger giving it the infile which
+ * is the KTeeFile, Indirectory, the XML directory,
+ * and the original path for the file */
+
+ rc = CCCatMake (&po, self->in, self->xml, inf, self->md5,
+ self->ff, mtime, self->tree, false, 0, self->path);
+ if (rc == 0)
+ {
+ /* do the catalog (and thus copy) */
+ rc = CCCatDo(po);
+ /* release the cataloger object */
+ CCCatRelease (po);
+ }
+ else
+ pLOGERR (klogDebug6, rc, "failure in CCCatMake $(P)",
+ PLOG_S(P), self->path);
+ /* release the infile which will complete a copy
+ * regardless of the state of the cataloger */
+ KFileRelease (inf);
+/* return rc; */
+ }
+ else
+ {
+ KFileRelease (outf.kf);
+ KFileRelease (original);
+ pLOGERR (klogDebug4, rc, "failure with kfilemaketeeread $(P)",
+ PLOG_S(P), self->path);
+ } /* rc = KFileMakeTeeRead (&inf, original, outf.kf);*/
+ }
+ else
+ {
+ KFileRelease (copy);
+ KMD5SumFmtRelease (md5f);
+ pLOGERR (klogDebug4, rc, "failure with KMD5FileMakeWrite $(P)",
+ PLOG_S(P), self->path);
+ } /* KMD5FileMakeWrite (&outf.mf, copy, md5f, self->path); */
+ } /* KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5", */
+ else
+ pLOGERR (klogDebug4, rc, "failure with KMD5SumFmtMakeUpdate $(P)",
+ PLOG_S(P), self->path);
+
+ KFileRelease (fm);
+ } /* KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5", */
+ else
+ pLOGERR (klogDebug4, rc, "failure with KDirectoryCreateFile $(P).md5",
+ PLOG_S(P), self->path);
+ KFileRelease (copy);
+ } /* rc = KDirectoryVCreateFile (self->out, ©, false, 0644, mode|kcmParents, */
+ else
+ pLOGERR (klogDebug4, rc, "failure with KDirectoryVCreateFile $(P)",
+ PLOG_S(P), self->path);
+ KFileRelease (original);
+ } /* rc = KDirectoryVOpenFileRead (self->in, &original, self->path, NULL); */
+ else
+ pLOGERR (klogDebug4, rc, "failure with KDirectoryVOpenFileRead $(pP)",
+ PLOG_S(P), self->path);
+ return rc;
+}
+
+static
+rc_t CCCopyDoDirectory (CCCopy * self)
+{
+ rc_t rc = 0;
+ PLOGMSG (klogInfo, "CCCopyDoDirectory $(d)", PLOG_S(d), self->path);
+
+ rc = RC (rcExe, rcDirectory, rcCopying, rcParam, rcUnsupported);
+ return rc;
+}
+rc_t CCCopyDo (CCCopy * self)
+{
+ rc_t rc = 0;
+ enum KPathType type;
+
+ assert (self != NULL);
+ assert (self->path != NULL);
+
+ type = KDirectoryPathType (self->in, "%s", self->path);
+ switch (type & ~kptAlias)
+ {
+ case kptNotFound:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcNotFound);
+ break;
+ default:
+ case kptBadPath:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ break;
+ case kptFile:
+ rc = CCCopyDoFile (self);
+ break;
+ case kptDir:
+#if 0
+ rc = CCCopyDoDirectory (self);
+#else
+ rc = PLOGMSG (klogInfo, "Ignoring directory $(p)",PLOG_S(p),self->path);
+#endif
+ break;
+ case kptCharDev:
+ rc = PLOGMSG (klogInfo, "Ignoring kptCharDev $(p)",PLOG_S(p),self->path);
+ break;
+ case kptBlockDev:
+ rc = PLOGMSG (klogInfo, "Ignoring kptBlockDev $(p)",PLOG_S(p),self->path);
+ break;
+ case kptFIFO:
+ rc = PLOGMSG (klogInfo, "Ignoring kptFIFO $(p)",PLOG_S(p),self->path);
+ break;
+ }
+ return rc;
+}
+
diff --git a/tools/copycat/ccfile.c b/tools/copycat/ccfile.c
new file mode 100644
index 0000000..22ea5ee
--- /dev/null
+++ b/tools/copycat/ccfile.c
@@ -0,0 +1,271 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/countfile.h>
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+/* ======================================================================
+ * CCFile
+ */
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+typedef struct CCFile CCFile;
+#define KFILE_IMPL struct CCFile
+#include <kfs/impl.h>
+
+
+/*-----------------------------------------------------------------------
+ * CCFile
+ */
+struct CCFile
+{
+ KFile dad;
+ KFile * original;
+ rc_t * prc;
+};
+
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t CC CCFileDestroy (CCFile *self)
+{
+ rc_t rc = KFileRelease (self->original);
+ free (self);
+ return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ * returns an underlying system file object
+ * and starting offset to contiguous region
+ * suitable for memory mapping, or NULL if
+ * no such file is available.
+ *
+ * bytes could not be counted if memory mapped so this is disallowed
+ */
+
+static
+struct KSysFile *CC CCFileGetSysFile (const CCFile *self, uint64_t *offset)
+{
+ return KFileGetSysFile (self->original, offset);
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ * returns 0 if random access, error code otherwise
+ */
+static
+rc_t CC CCFileRandomAccess (const CCFile *self)
+{
+ assert (self != NULL);
+ assert (self->original != NULL);
+ return KFileRandomAccess (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ * returns a KFileDesc
+ * not intended to be a content type,
+ * but rather an implementation class
+ */
+static
+uint32_t CC CCFileType (const CCFile *self)
+{
+ return KFileType (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Size
+ * returns size in bytes of file
+ *
+ * "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t CC CCFileSize (const CCFile *self, uint64_t *size)
+{
+ return KFileSize (self->original, size);
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ * sets size in bytes of file
+ *
+ * "size" [ IN ] - new file size
+ */
+static
+rc_t CC CCFileSetSize (CCFile *self, uint64_t size)
+{
+ return KFileSetSize (self->original, size);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ * read file from known position
+ *
+ * "pos" [ IN ] - starting position within file
+ *
+ * "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ * "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ * giving number of bytes actually read
+ */
+static
+rc_t CC CCFileRead (const CCFile *self,
+ uint64_t pos,
+ void *buffer,
+ size_t bsize,
+ size_t *num_read)
+{
+ rc_t rc;
+
+ rc = KFileRead (self->original, pos, buffer, bsize, num_read);
+ if (*self->prc == 0)
+ *((CCFile*)self)->prc = rc;
+ return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ * write file at known position
+ *
+ * "pos" [ IN ] - starting position within file
+ *
+ * "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ * "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ * giving number of bytes actually written
+ *
+ */
+static
+rc_t CC CCFileWrite (CCFile *self, uint64_t pos,
+ const void *buffer, size_t bsize,
+ size_t *num_writ)
+{
+ rc_t rc;
+
+ rc = KFileWrite (self->original, pos, buffer, bsize, num_writ);
+ if (*self->prc == 0)
+ *self->prc = rc;
+ return rc;
+}
+
+static const KFile_vt_v1 vtCCFile =
+{
+ /* version */
+ 1, 1,
+
+ /* 1.0 */
+ CCFileDestroy,
+ CCFileGetSysFile,
+ CCFileRandomAccess,
+ CCFileSize,
+ CCFileSetSize,
+ CCFileRead,
+ CCFileWrite,
+
+ /* 1.1 */
+ CCFileType
+};
+
+/* ----------------------------------------------------------------------
+ * CCFileMake
+ * create a new file object
+ */
+
+static
+rc_t CCFileMake (CCFile ** pself,
+ KFile * original,
+ rc_t * prc)
+{
+ CCFile * self;
+ rc_t rc;
+ /* needs to be better */
+ assert (pself);
+ assert (original);
+ assert (prc);
+
+ self = malloc (sizeof (CCFile));
+ if (self == NULL) /* allocation failed */
+ {
+ /* fail */
+ rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ else
+ {
+ rc = KFileInit (&self->dad, /* initialize base class */
+ (const KFile_vt*)&vtCCFile,/* VTable for CCFile */
+ "CCFile", "no-name",
+ original->read_enabled,
+ original->write_enabled);
+ if (rc == 0)
+ {
+ rc = KFileAddRef (original);
+ if (rc == 0)
+ {
+ self->original = original;
+ self->prc = prc;
+ *pself = self;
+ return *prc = 0;
+ }
+ }
+ /* fail */
+ free (self);
+ }
+ *pself = NULL;
+ *prc = rc;
+ return rc;
+}
+
+LIB_EXPORT rc_t CC CCFileMakeRead (const KFile ** self, const KFile * original,
+ rc_t * prc)
+{
+ return CCFileMake ((CCFile **)self, (KFile*)original, prc);
+}
+LIB_EXPORT rc_t CC CCFileMakeUpdate (KFile ** self, KFile * original,
+ rc_t * prc)
+{
+ return CCFileMake ((CCFile **)self, (KFile*)original, prc);
+}
+LIB_EXPORT rc_t CC CCFileMakeWrite (KFile ** self, KFile * original,
+ rc_t * prc)
+{
+ return CCFileMake ((CCFile **)self, (KFile*)original, prc);
+}
+
+/* end of file countfile.c */
+
diff --git a/tools/copycat/ccfileformat.c b/tools/copycat/ccfileformat.c
new file mode 100644
index 0000000..58ca4db
--- /dev/null
+++ b/tools/copycat/ccfileformat.c
@@ -0,0 +1,405 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <klib/rc.h>
+#include <klib/debug.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/file.h>
+#include <kfs/fileformat.h>
+#include <kfs/ffext.h>
+#include <kfs/ffmagic.h>
+#include <krypto/wgaencrypt.h>
+#include <kfg/config.h>
+#include <atomic32.h>
+#include <stddef.h>
+#include "copycat-priv.h"
+#include "debug.h"
+
+bool CCFileFormatIsNCBIEncrypted ( void * buffer )
+{
+ static const char file_sig[] = "NCBInenc";
+
+ return (memcmp (buffer, file_sig, sizeof file_sig - 1) == 0);
+}
+bool CCFileFormatIsKar ( void * buffer )
+{
+ static const char file_sig[] = "NCBI.sra";
+
+ return (memcmp (buffer, file_sig, sizeof file_sig - 1) == 0);
+}
+
+
+
+
+CCFileFormat *filefmt;
+
+/* ======================================================================
+ * Process does up the copy portion of the copycat tool's functionality
+ * and sets up ProcessOne that does the Catalog portion.
+ */
+struct CCFileFormat
+{
+ KFileFormat * magic;
+ KFileFormat * ext;
+ atomic32_t refcount;
+};
+
+static const char magictable [] =
+{
+ "Generic Format for Sequence Data (SRF)\tSequenceReadFormat\n"
+ "GNU tar archive\tTapeArchive\n"
+ "POSIX tar archive\tTapeArchive\n"
+ "POSIX tar archive (GNU)\tTapeArchive\n"
+ "Standard Flowgram Format (SFF)\tStandardFlowgramFormat\n"
+ "NCBI kar sequence read archive\tSequenceReadArchive\n"
+ "tar archive\tTapeArchive\n"
+ "XML document text\tExtensibleMarkupLanguage\n"
+ "bzip2 compressed data\tBzip\n"
+ "Zip archive data\tWinZip\n"
+ "gzip compressed data\tGnuZip\n"
+};
+static const char exttable [] =
+{
+ "Unknown\tUnknown\n"
+ "bam\tBinaryAlignmentMap\n"
+ "bz2\tBzip\n"
+ "gz\tGnuZip\n"
+ "tgz\tGnuZip\n"
+ "sff\tStandardFlowgramFormat\n"
+ "sra\tSequenceReadArchive\n"
+ "srf\tSequenceReadFormat\n"
+ "tar\tTapeArchive\n"
+ "xml\tExtensibleMarkupLanguage\n"
+ "h5\tHD5\n"
+};
+
+static const char classtable [] =
+{
+ "Archive\n"
+ "Cached\n"
+ "Compressed\n"
+ "Read\n"
+};
+
+static const char formattable [] =
+{
+ "BinaryAlignmentMap\tRead\n"
+ "Bzip\tCompressed\n"
+ "GnuZip\tCompressed\n"
+ "WinZip\tRead\n"
+ "ExtensibleMarkupLanguage\tCached\n"
+ "SequenceReadFormat\tRead\n"
+ "SequenceReadArchive\tArchive\n"
+ "StandardFlowgramFormat\tRead\n"
+ "TapeArchive\tArchive\n"
+ "HD5\tArchive\n"
+};
+
+static const char magicpath [] = "/usr/share/misc/magic";
+
+rc_t CCFileFormatAddRef (const CCFileFormat * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((CCFileFormat*)self)->refcount);
+ return 0;
+}
+
+rc_t CCFileFormatRelease (const CCFileFormat * cself)
+{
+ rc_t rc = 0;
+ CCFileFormat *self;
+
+ self = (CCFileFormat *)cself; /* mutable field is ref count */
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ DEBUG_STATUS(("%s call KFileFormatRelease for extentions\n", __func__));
+ rc = KFileFormatRelease (self->ext);
+ if (rc == 0)
+ {
+ DEBUG_STATUS(("%s call KFileFormatRelease for magic\n", __func__));
+ rc = KFileFormatRelease (self->magic);
+ if (rc == 0)
+ {
+ free (self);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t CCFileFormatMake (CCFileFormat ** p)
+{
+ rc_t rc;
+ CCFileFormat * self;
+
+ DEBUG_ENTRY();
+
+ self = malloc (sizeof *self);
+
+ if (self == NULL)
+ {
+ rc = RC (rcExe, rcFileFormat, rcCreating, rcMemory, rcExhausted);
+ }
+ else
+ {
+ /* magic file has to be located next to the executable */
+ KConfig* kfg;
+ rc = KConfigMake ( &kfg, NULL );
+ if ( rc == 0 )
+ {
+ String* bindir;
+ rc = KConfigReadString ( kfg, "vdb/lib/paths/kfg", &bindir );
+ KConfigRelease ( kfg );
+ if ( rc == 0 )
+ {
+ char magicpath[1024];
+ size_t num_writ;
+ rc = string_printf ( magicpath, sizeof ( magicpath ), &num_writ, "%S/magic", bindir );
+ StringWhack ( bindir );
+ if ( rc == 0 )
+ {
+ rc = KExtFileFormatMake (&self->ext, exttable, sizeof (exttable) - 1,
+ formattable, sizeof (formattable) - 1);
+ if (rc == 0)
+ {
+ rc = KMagicFileFormatMake (&self->magic, magicpath, magictable,
+ sizeof (magictable) - 1,
+ formattable, sizeof (formattable) - 1);
+ if (rc == 0)
+ {
+ atomic32_set (&self->refcount , 1);
+ *p = self;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ free (self);
+ }
+ *p = NULL;
+ return rc;
+}
+
+rc_t CCFileFormatGetType (const CCFileFormat * self, const KFile * file,
+ const char * path, char * buffer, size_t buffsize, uint32_t * ptype, uint32_t * pclass)
+{
+ static const char u_u[] = "Unknown/Unknown";
+ rc_t rc, orc;
+
+ int ret;
+ size_t mtz;
+ size_t etz;
+ size_t num_read;
+ KFileFormatType mtype;
+ KFileFormatType etype;
+ KFileFormatClass mclass;
+ KFileFormatClass eclass;
+ char mclassbuf [256];
+ char mtypebuf [256];
+ char eclassbuf [256];
+ char etypebuf [256];
+ uint8_t preread [8192];
+
+ DEBUG_ENTRY();
+ DEBUG_STATUS(("%s: getting type for (%s)\n",__func__,path));
+
+ /* initially assume that we don't know the type or class
+ * these are just treated as files with no special processing
+ * more than we that we don't know the type or class */
+
+ *pclass = *ptype = 0;
+ strncpy (buffer, u_u, buffsize);
+ buffer[buffsize-1] = '\0'; /* in case we got truncated in the copy above */
+
+ orc = KFileRead (file, 0, preread, sizeof (preread), &num_read);
+ if (orc == 0)
+ {
+ if (CCFileFormatIsKar (preread))
+ {
+ *pclass = ccffcArchive;
+ *ptype = ccfftaSra;
+ strncpy (buffer, "Archive/SequenceReadArchive", buffsize);
+ return 0;
+ }
+ if (CCFileFormatIsNCBIEncrypted (preread))
+ {
+ *pclass = ccffcEncoded;
+ *ptype = ccffteNCBI;
+ strncpy (buffer, "Encoded/NCBI", buffsize);
+ return 0;
+ }
+ /* Sorta kinda hack to see if the file is WGA encrypted
+ * We short cut the other stuff if it is WGA encoded
+ */
+ if (KFileIsWGAEnc (preread, num_read) == 0)
+ {
+ *pclass = ccffcEncoded;
+ *ptype = ccffteWGA;
+ strncpy (buffer, "Encoded/WGA", buffsize);
+ return 0;
+ }
+
+
+ rc = KFileFormatGetTypePath (self->ext, NULL, path, &etype, &eclass,
+ etypebuf, sizeof (etypebuf), &etz);
+ if (rc == 0)
+ {
+
+ rc = KFileFormatGetTypeBuff (self->magic, preread, num_read, &mtype,
+ &mclass, mtypebuf, sizeof (mtypebuf), &mtz);
+ if (rc == 0)
+ {
+ rc = KFileFormatGetClassDescr (self->ext, eclass, eclassbuf, sizeof (eclassbuf));
+ if (rc == 0)
+ {
+ rc = KFileFormatGetClassDescr (self->magic, mclass, mclassbuf, sizeof (mclassbuf));
+ if (rc == 0)
+ {
+ DEBUG_STATUS(("%s: (%s) %s/%s<=%s/%s\n", __func__,
+ path, mclassbuf, mtypebuf, eclassbuf, etypebuf));
+
+ /* first handle known special cases */
+ if ((strcmp("WinZip", mtypebuf) == 0) &&
+ (strcmp("GnuZip", etypebuf) == 0))
+ {
+ /* we've gotten in too many Zip files with extension gz */
+ PLOGMSG (klogWarn,
+ (klogWarn, "File '$(path)' is in unzupported winzip/pkzip format",
+ "path=%s", path));
+ }
+ else if (!strcmp("BinaryAlignmentMap", etypebuf) && !strcmp ("GnuZip", mtypebuf))
+ {
+ /*** bam files have gnuzip magic, we need to treat them as data files ***/
+ strcpy (mclassbuf, eclassbuf );
+ strcpy (mtypebuf, etypebuf);
+ mtype = etype;
+ mclass = eclass;
+ }
+ else if ((strcmp("SequenceReadArchive", etypebuf) == 0) &&
+ (strcmp("Unknown", mtypebuf) == 0))
+ {
+ /* magic might not detect SRA/KAR files yet */
+ DEBUG_STATUS(("%s: (%s) %s/%s<=%s/%s\n", __func__,
+ path, mclassbuf, mtypebuf, eclassbuf, etypebuf));
+ strcpy (mclassbuf, eclassbuf);
+ strcpy (mtypebuf, etypebuf);
+ mtype = etype;
+ mclass = eclass;
+ }
+ else if ((strcmp("HD5", etypebuf) == 0) &&
+ (strcmp("Unknown", mtypebuf) == 0))
+ {
+ DEBUG_STATUS(("%s:5 (%s) %s/%s<=%s/%s\n", __func__,
+ path, mclassbuf, mtypebuf, eclassbuf, etypebuf));
+ strcpy (mclassbuf, eclassbuf);
+ strcpy (mtypebuf, etypebuf);
+ mtype = etype;
+ mclass = eclass;
+ }
+
+ /* now that we've fixed a few cases use the magic derived
+ * class and type as the extensions could be wrong and can
+ * cause failures */
+ if (strcmp ("Archive", mclassbuf) == 0)
+ {
+ *pclass = ccffcArchive;
+ if (strcmp ("TapeArchive", mtypebuf) == 0)
+ *ptype = ccfftaTar;
+ else if (strcmp ("SequenceReadArchive", mtypebuf) == 0)
+ *ptype = ccfftaSra;
+ }
+ else if (strcmp("Compressed", mclassbuf) == 0)
+ {
+ *pclass = ccffcCompressed;
+ if (strcmp ("Bzip", mtypebuf) == 0)
+ {
+ *ptype = ccfftcBzip2;
+ if ( no_bzip2 )
+ * pclass = *ptype = 0;
+ }
+ else if (strcmp ("GnuZip", mtypebuf) == 0)
+ *ptype = ccfftcGzip;
+ }
+
+ /* Hmmm... we are using extension to determine XML though
+ * Probably okay */
+ else if (strcmp ("Cached", eclassbuf) == 0)
+ {
+ *pclass = ccffcCached;
+ if (strcmp ("ExtensibleMarkupLanguage", etypebuf) == 0)
+ *ptype = ccfftxXML;
+ strcpy (mclassbuf, eclassbuf);
+ strcpy (mtypebuf, etypebuf);
+
+ }
+
+ /* build the eventual filetype string - vaguely mime type like */
+#if 1
+ ret = snprintf (buffer, buffsize, "%s/%s", mclassbuf, mtypebuf);
+ if (ret >= buffsize)
+ {
+ ret = buffsize-1;
+ buffer[buffsize-1] = '\0';
+ }
+
+#else
+ ecz = strlen (eclassbuf);
+ num_read = (ecz < buffsize) ? ecz : buffsize;
+ strncpy (buffer, eclassbuf, buffsize);
+ if (num_read >= (buffsize-2))
+ buffer [num_read] = '\0';
+ else
+ {
+ buffer [num_read++] = '/';
+ strncpy (buffer+num_read, etypebuf,
+ buffsize - num_read);
+ }
+ buffer[buffsize-1] = '\0';
+ /* buffer [num_read++] = '/'; */
+#endif
+ }
+ }
+ }
+ }
+ if (rc)
+ {
+ *pclass = *ptype = 0;
+ strncpy (buffer, u_u, buffsize);
+ buffer[buffsize-1] = '\0'; /* in case we got truncated in the copy above */
+ }
+ }
+ return orc;
+}
diff --git a/tools/copycat/ccproc.c b/tools/copycat/ccproc.c
new file mode 100644
index 0000000..0e29bc6
--- /dev/null
+++ b/tools/copycat/ccproc.c
@@ -0,0 +1,319 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <assert.h>
+#include <atomic.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <kapp/log.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/teefile.h>
+#include "copycat.h"
+
+
+/* ======================================================================
+ * Process does up the copy portion of the copycat tool's functionality
+ * and sets up ProcessOne that does the Catalog portion.
+ */
+struct Process
+{
+ atomic32_t refcount;
+ const KDirectory * in;
+ KDirectory * out;
+ KDirectory * xml;
+ KMD5SumFmt * md5;
+ CCFileFormat * ff;
+ uint32_t timeout;
+ bool force;
+ char path[4096];
+};
+
+rc_t ProcessAddRef (const Process * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((Process*)self)->refcount);
+ return 0;
+}
+
+rc_t ProcessRelease (const Process * cself)
+{
+ Process * self = (Process *)cself;
+ rc_t rc = 0;
+ LOGMSG (klogDebug10, "Enter: ProcessRelease");
+
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ KDirectoryRelease (self->in);
+ KDirectoryRelease (self->out);
+ KDirectoryRelease (self->xml);
+ KMD5SumFmtRelease (self->md5);
+ CCFileFormatRelease (self->ff);
+ free (self);
+ }
+ }
+ return rc;
+}
+
+rc_t ProcessMake (Process ** p, const KDirectory * in, KDirectory * out,
+ KDirectory * xml, bool force, KMD5SumFmt * md5,
+ CCFileFormat * ff, const char * path)
+{
+ rc_t rc;
+ size_t pathlen;
+ Process * self;
+ char relpath [4096];
+
+ assert (in != NULL);
+ assert (out != NULL);
+ assert (xml != NULL);
+ assert (path != NULL);
+
+ rc = KDirectoryResolvePath (in, false, relpath, sizeof relpath, "%s", path);
+ if (rc != 0)
+ {
+ pLOGERR (klogErr, rc, "unable to resolve path $(P)", PLOG_S(P), path);
+ return rc;
+ }
+ if ((relpath[0] == '.') && (relpath[1] == '.') && (relpath[2] == '/'))
+ {
+ rc = RC (rcExe, rcDirectory, rcResolving, rcPath, rcOutOfKDirectory);
+ pLOGERR (klogErr, rc, "Path must resolve to current directory or subdirectories $(P)",
+ PLOG_S(P), relpath);
+ return rc;
+ }
+
+ pathlen = strlen(relpath);
+ self = malloc (sizeof (*self) - sizeof (*self->path) + pathlen + 1);
+ if (self == NULL)
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ KDirectoryAddRef (in);
+ KDirectoryAddRef (out);
+ KDirectoryAddRef (xml);
+ KMD5SumFmtAddRef (md5);
+ CCFileFormatAddRef (ff);
+ self->in = in;
+ self->out = out;
+ self->xml = xml;
+ self->force = force;
+ self->md5 = md5;
+ self->ff = ff;
+ memmove (self->path, relpath, pathlen+1);
+ *p = self;
+ }
+ return rc;
+}
+static
+rc_t ProcessDoFile (Process * self)
+{
+ const KFile * original;
+ rc_t rc = 0;
+ enum KCreateMode mode;
+
+ PLOGMSG (klogDebug10, "ProcessDoFile $(f)", PLOG_S(f), self->path);
+
+
+ if (! self->force)
+ {
+ /* if not forced replace mode we fail on existing file */
+ mode = kcmCreate;
+ }
+ else
+ {
+ uint32_t tt;
+
+ tt = KDirectoryPathType (self->out, "%s", self->path);
+ switch (tt)
+ {
+ default:
+ PLOGMSG (klogWarn, "File exists and will be replaced in output directory $(f)",
+ PLOG_S(f), self->path);
+ break;
+ /* if the path to the file or the file do not exist no warning */
+ case kptNotFound:
+ case kptBadPath:
+ break;
+ }
+ tt = KDirectoryPathType (self->xml, "%s", self->path);
+ switch (tt)
+ {
+ default:
+ PLOGMSG (klogWarn, "File exists and might be replaced in xml directory $(f)",
+ PLOG_S(f), self->path);
+ break;
+ /* if the path to the file or the file do not exist no warning */
+ case kptNotFound:
+ case kptBadPath:
+ break;
+ }
+
+ /* forced mode we create with init instead of create forcing a delete/create effect */
+ mode = kcmInit;
+ }
+
+ /* open originial source for read */
+ rc = KDirectoryOpenFileRead (self->in, &original, "%s", self->path);
+ if (rc == 0)
+ {
+ KFile * copy;
+
+ /* create copy output for write */
+ rc = KDirectoryCreateFile (self->out, ©, false, 0644, mode|kcmParents,
+ "%s", self->path);
+ if (rc == 0)
+ {
+ KFile * fm;
+
+ /* create parallel <path>.md5 */
+ rc = KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5",
+ self->path);
+ if (rc == 0)
+ {
+ KMD5SumFmt * md5f;
+
+ /* make the .md5 an MD5 sum format file */
+ rc = KMD5SumFmtMakeUpdate (&md5f, fm);
+ if (rc == 0)
+ {
+ union u
+ {
+ KFile * kf;
+ KMD5File * mf;
+ } outf;
+
+ /* combine the copy and MD5 file into our special KFile */
+ rc = KMD5FileMakeWrite (&outf.mf, copy, md5f, self->path);
+ if (rc == 0)
+ {
+ const KFile * inf;
+
+ /* release this outside reference to the MD5SumFMT leaving
+ * only the one internal to the KMD5File */
+ KMD5SumFmtRelease (md5f);
+
+ /* create the KTeeFile that copies reads from the
+ * original as writes to the copy. Reads will be
+ * made by the cataloging process */
+ rc = KFileMakeTeeRead (&inf, original, outf.kf);
+ if (rc == 0)
+ {
+ ProcessOne * po;
+
+ /* create the cataloger giving it the infile which
+ * is the KTeeFile, Indirectory, the XML directory,
+ * and the original path for the file */
+ rc = ProcessOneMake (&po, self->in, self->xml, inf,
+ self->md5, self->ff, self->path);
+ if (rc == 0)
+ {
+ /* do the catalog (and thus copy) */
+ rc = ProcessOneDo(po);
+ /* release the cataloger object */
+ ProcessOneRelease (po);
+ }
+ /* release the infile which will complete a copy
+ * regardless of the state of the cataloger */
+ KFileRelease (inf);
+/* return rc; */
+ }
+ else
+ {
+ KFileRelease (outf.kf);
+ KFileRelease (original);
+ } /* rc = KFileMakeTeeRead (&inf, original, outf.kf);*/
+ }
+ else
+ {
+ KFileRelease (copy);
+ KMD5SumFmtRelease (md5f);
+ } /* KMD5FileMakeWrite (&outf.mf, copy, md5f, self->path); */
+ } /* KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5", */
+ KFileRelease (fm);
+ } /* KDirectoryCreateFile (self->out, &fm, true, 0644, mode, "%s.md5", */
+ KFileRelease (copy);
+ } /* rc = KDirectoryVCreateFile (self->out, ©, false, 0644, mode|kcmParents, */
+ KFileRelease (original);
+ } /* rc = KDirectoryVOpenFileRead (self->in, &original, self->path, NULL); */
+ return rc;
+}
+
+static
+rc_t ProcessDoDirectory (Process * self)
+{
+ rc_t rc = 0;
+ PLOGMSG (klogInfo, "ProcessDoDirectory $(d)", PLOG_S(d), self->path);
+
+ rc = RC (rcExe, rcDirectory, rcCopying, rcParam, rcUnsupported);
+ return rc;
+}
+rc_t ProcessDo (Process * self)
+{
+ rc_t rc = 0;
+ enum KPathType type;
+
+ assert (self != NULL);
+ assert (self->path != NULL);
+
+ type = KDirectoryPathType (self->in, "%s", self->path);
+ switch (type & ~kptAlias)
+ {
+ case kptNotFound:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcNotFound);
+ break;
+ default:
+ case kptBadPath:
+ rc = RC (rcExe, rcPath, rcAccessing, rcPath, rcInvalid);
+ break;
+ case kptFile:
+ rc = ProcessDoFile (self);
+ break;
+ case kptDir:
+#if 0
+ rc = ProcessDoDirectory (self);
+#else
+ rc = PLOGMSG (klogInfo, "Ignoring directory $(p)",PLOG_S(p),self->path);
+#endif
+ break;
+ case kptCharDev:
+ rc = PLOGMSG (klogInfo, "Ignoring kptCharDev $(p)",PLOG_S(p),self->path);
+ break;
+ case kptBlockDev:
+ rc = PLOGMSG (klogInfo, "Ignoring kptBlockDev $(p)",PLOG_S(p),self->path);
+ break;
+ case kptFIFO:
+ rc = PLOGMSG (klogInfo, "Ignoring kptFIFO $(p)",PLOG_S(p),self->path);
+ break;
+ }
+ return rc;
+}
+
diff --git a/tools/copycat/ccprocone.c b/tools/copycat/ccprocone.c
new file mode 100644
index 0000000..24a7bfd
--- /dev/null
+++ b/tools/copycat/ccprocone.c
@@ -0,0 +1,217 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <assert.h>
+#include <atomic.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <kapp/log.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/teefile.h>
+#include <kfs/buffile.h>
+/* #include <klib/rc.h> */
+
+#include "copycat.h"
+
+/* ==========
+ * Process is a generic buffer to be used to pass data between co-routines or
+ * threads.
+ */
+
+struct ProcessOne
+{
+ atomic32_t refcount; /* how many references to this object */
+ const KDirectory * dir;
+ KDirectory * xml;
+ const KFile * file;
+ CCFileFormat * ff;
+ KMD5SumFmt *md5;
+ char path [4096];
+};
+
+rc_t ProcessOneMake (ProcessOne ** ppo, const KDirectory * dir, KDirectory * xml,
+ const KFile * file, KMD5SumFmt *md5, CCFileFormat * ff,
+ const char * path)
+{
+ ProcessOne * self;
+ rc_t rc = 0;
+ size_t pathlen;
+
+ PLOGMSG (klogDebug10, "ProcessOneMake $(f)", PLOG_S(f), path);
+ /* legit seeming inputs? these could be replaced with RC returns */
+ assert (ppo != NULL);
+ assert (file != NULL);
+ assert (path != NULL);
+
+ /* allocate the object */
+ pathlen = strlen (path);
+ self = malloc (sizeof (*self) - sizeof(self->path) + pathlen + 1);
+ if (self == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ }
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ KDirectoryAddRef (dir);
+ KDirectoryAddRef (xml);
+ KMD5SumFmtAddRef (md5);
+ CCFileFormatAddRef (ff);
+ KFileAddRef (file);
+ self->dir = dir;
+ self->xml = xml;
+ self->md5 = md5;
+ self->file = file;
+ self->ff = ff;
+ memmove (self->path, path, pathlen);
+ self->path[pathlen] = '\0';
+ rc = 0;
+ }
+ *ppo = self;
+ return rc;
+}
+
+rc_t ProcessOneAddRef (const ProcessOne * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((ProcessOne*)self)->refcount);
+ return 0;
+}
+rc_t ProcessOneRelease (const ProcessOne * cself)
+{
+ ProcessOne * self = (ProcessOne *)cself;
+ rc_t rc = 0;
+
+ if (self != NULL)
+ {
+ PLOGMSG (klogDebug10, "ProcessOneRelease $(f)", PLOG_S(f), self->path);
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ KDirectoryRelease (self->dir);
+ KDirectoryRelease (self->xml);
+ KMD5SumFmtRelease (self->md5);
+ CCFileFormatRelease (self->ff);
+ KFileRelease (self->file);
+ free (self);
+ }
+ }
+ return rc;
+}
+const char * typeToString (enum KPathType type)
+{
+ switch (type)
+ {
+ default:
+ return "bad-KPathType";
+ case kptNotFound:
+ return "not-found";
+ case kptBadPath:
+ return "bad-path";
+ case kptFile:
+ return "file";
+ case kptDir:
+ return "directory";
+ case kptCharDev:
+ return "character-device";
+ case kptBlockDev:
+ return "block-device";
+ case kptFIFO:
+ return "fifo";
+ case kptAlias|kptNotFound:
+ return "link-to-not-found";
+ case kptAlias|kptBadPath:
+ return "link-to-bad-path";
+ case kptAlias|kptFile:
+ return "link-to-file";
+ case kptAlias|kptDir:
+ return "link-to-directory";
+ case kptAlias|kptCharDev:
+ return "link-to-character-device";
+ case kptAlias|kptBlockDev:
+ return "link-to-block-device";
+ case kptAlias|kptFIFO:
+ return "link-to-fifo";
+ }
+}
+rc_t ProcessOneDoFile (ProcessOne * self)
+{
+ rc_t rc = 0;
+ KFile * mfile;
+
+ PLOGMSG (klogInfo, "ProcessOneDoFile: $(F)", PLOG_S(F), self->path);
+
+
+ rc = KFileMakeNewMD5Read (&mfile, self->file, self->md5, self->path);
+ if (rc == 0)
+ {
+ const KFile * bfile;
+ rc = KFileMakeBuf (&bfile, mfile, 64*1024);
+ if (rc == 0)
+ {
+ /* add more here */
+
+ KFileRelease (bfile);
+ }
+ else
+ {
+ pLOGERR (klogErr, rc, "Failure to initiate buffer $(F)", PLOG_S(F), self->path);
+ KFileRelease (mfile);
+ }
+ }
+ else
+ pLOGERR (klogErr, rc, "Failure to initiate MD5 summing $(F)", PLOG_S(F), self->path);
+
+ return rc;
+}
+rc_t ProcessOneDo (ProcessOne * self)
+{
+ static const char F[] = PLOG_2(PLOG_S(p),PLOG_S(t));
+ enum KPathType type;
+ rc_t rc = 0;
+
+ type = KDirectoryPathType (self->dir, "%s", self->path);
+
+ switch (type)
+ {
+ case kptFile:
+ rc = ProcessOneDoFile (self);
+ break;
+/* case kptDir: */
+/* break; */
+/* case kptAlias|kptFile: */
+/* break; */
+/* case kptAlias|kptDir: */
+/* break; */
+ default:
+ PLOGMSG (klogInfo, "+ Skipping $(p) of type $(t)", F, self->path, typeToString(type));
+ break;
+ }
+ return rc;
+}
diff --git a/tools/copycat/ccread.c b/tools/copycat/ccread.c
new file mode 100644
index 0000000..fedaef7
--- /dev/null
+++ b/tools/copycat/ccread.c
@@ -0,0 +1,302 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <assert.h>
+#include <atomic.h>
+#include <kapp/main.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kapp/log.h>
+#include "copycat-priv.h"
+
+
+struct Reader
+{
+ atomic32_t refcount;
+ const KFile * f; /* input file */
+ uint64_t o; /* how far into the input file are we */
+ BufferQ * out; /* two output queues to copy everything read */
+ BufferQ * xml;
+ BufferMgr * mgr; /* a manager for allocating a throttling buffer set */
+};
+
+rc_t ReaderRelease (const Reader * cself)
+{
+ rc_t rc = 0;
+ Reader * self = (Reader*)cself;
+
+ if (self != NULL)
+ {
+ if (atomic32_dec_and_test (&self->refcount))
+ {
+ /* might already have been released */
+ rc = KFileRelease (self->f);
+ if (rc == 0)
+ {
+ rc = BufferQRelease (self->out);
+ if (rc == 0)
+ {
+ rc = BufferQRelease (self->xml);
+ if (rc == 0)
+ {
+ rc = BufferMgrRelease (self->mgr);
+ if (rc == 0)
+ free (self);
+ else
+ atomic32_set (&self->refcount, 1);
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t ReaderAddRef (const Reader * self)
+{
+ if (self != NULL)
+ atomic32_inc (&((Reader*)self)->refcount);
+ return 0;
+}
+
+rc_t ReaderMake (Reader ** r, const KDirectory * d, const char * path, Copier * p,
+ Cataloger * g, uint32_t c, uint32_t z, uint32_t t)
+{
+ rc_t rc = 0;
+ Reader * self;
+
+ self = malloc (sizeof * self);
+ if (self == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ LOGERR (klogErr, rc, "ReaderMake: error allocating Reader");
+ }
+ else
+ {
+ atomic32_set (&self->refcount, 1);
+ self->o = 0;
+
+ rc = KDirectoryOpenFileRead (d, &self->f, "%s", path);
+ if (rc != 0)
+ {
+ pLOGERR (klogErr, rc,
+ "ReaderMake: error open file for read $(f)",
+ PLOG_S(f), path);
+ }
+ else
+ {
+ self->out = CopierGetQ(p);
+ if (self->out == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcBuffer, rcCorrupt);
+ LOGERR (klogErr, rc, "ReaderMake: corrupt Copier queue");
+ }
+ else
+ {
+ rc = BufferQAddRef (self->out);
+ if (rc == 0)
+ {
+ self->xml = CatalogerGetQ(g);
+ if (self->xml == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcCreating, rcQueue, rcCorrupt);
+ LOGERR (klogErr, rc, "ReaderMake: corrupt Cataloger queue");
+ }
+ else
+ {
+ rc = BufferQAddRef (self->xml);
+ if (rc == 0)
+ {
+ rc = BufferMgrMake (&self->mgr, c, z, t);
+ if (rc == 0)
+ {
+ atomic32_set (&self->refcount, 1);
+ *r = self;
+ return 0;
+ }
+ LOGERR (klogErr, rc, "ReaderMake: error creating buffer manager");
+ BufferQRelease (self->xml);
+ }
+ LOGERR (klogErr, rc, "ReaderMake: error setting reference to xml queue");
+ }
+ LOGERR (klogErr, rc, "ReaderMake: error setting reference to xml queue");
+ BufferQRelease (self->out);
+ }
+ LOGERR (klogErr, rc, "ReaderMake: error setting reference to out queue");
+ }
+ KFileRelease (self->f);
+ }
+ free (self);
+ }
+ return rc;
+}
+
+rc_t ReaderDoOne (Reader * self)
+{
+ rc_t rc = 0;
+
+ assert (self != NULL);
+ assert (self->mgr != NULL);
+
+ rc = Quitting();
+ if (rc == 0)
+ {
+ Buffer * b = NULL;
+
+ rc = BufferMgrGetBuffer (self->mgr, &b, NULL);
+ if (rc != 0)
+ {
+ /* -----
+ * if we couldn't get a buffer because we timeout, we don't want to
+ * signal a failure, so reset the rc and exit with no error
+ */
+ if ((GetRCState(rc) == rcExhausted) && (GetRCObject(rc) == rcTimeout))
+ {
+ rc = 0;
+ LOGMSG (klogInfo,
+ "ReaderDoOne: timeout getting a buffer");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: error getting a buffer");
+
+ }
+ else
+ {
+ size_t t;
+ size_t r;
+ char * p;
+
+ /* -----
+ * get the limits/values of the buffer we got
+ */
+ t = BufferPayloadGetSize (b);
+ p = BufferPayloadWrite (b);
+ assert (t > 0);
+ assert (b != NULL);
+
+ /* attempt to read from the file */
+ rc = KFileRead (self->f, self->o, p, t, &r);
+ if (rc == 0)
+ {
+ PLOGMSG (klogDebug10,
+ "ReaderDoOne: back from KFileRead $(z)",
+ PLOG_U32(z),
+ r);
+ /* if we have a read of some length send it to our two
+ * processor friends: copy and catalog
+ */
+ if (r != 0)
+ {
+ self->o += r;
+ rc = BufferContentSetSize (b, r);
+ if (rc == 0)
+ {
+ rc = BufferQPushBuffer (self->out, b, NULL);
+ if (rc == 0)
+ {
+ rc = BufferQPushBuffer (self->xml, b, NULL);
+ if (rc != 0)
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to send bugger to xml queue");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to send bugger to out queue");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to set size of buffer");
+ }
+ /* if we had a successful read of 'nothing' we are at end of file */
+ else
+ {
+ /* drop the file */
+ rc = KFileRelease (self->f);
+ if (rc == 0)
+ {
+ self->f = NULL;
+ /* seal off and release the two queues */
+ rc = BufferQSeal (self->out);
+ if (rc == 0)
+ {
+ rc = BufferQRelease (self->out);
+ if (rc == 0)
+ {
+ self->out = NULL;
+ rc = BufferQSeal (self->xml);
+ if (rc == 0)
+ {
+ rc = BufferQRelease (self->xml);
+ if (rc == 0)
+ {
+ self->xml = NULL;
+ rc = BufferMgrRelease (self->mgr);
+ if (rc == 0)
+ {
+ self->mgr = NULL;
+ rc = RC (rcExe, rcProcess, rcReading, rcThread, rcDone);
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to release buffer manager");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to release buffer xml queue");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to seal buffer xml queue");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to release buffer out queue");
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: Failure to seal buffer out queue");
+ }
+ else
+ LOGMSG (klogErr,
+ "ReaderDoOne: Failure to close input file");
+ }
+ }
+ else
+ LOGERR (klogErr, rc,
+ "ReaderDoOne: file read error");
+ BufferRelease (b);
+ }
+ }
+ else
+ {
+ LOGMSG (klogInt, "ReaderDoOne: Reader quitting");
+ }
+ return rc;
+}
+
+
diff --git a/tools/copycat/ccsra.c b/tools/copycat/ccsra.c
new file mode 100644
index 0000000..4c1b022
--- /dev/null
+++ b/tools/copycat/ccsra.c
@@ -0,0 +1,1239 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "copycat-priv.h"
+
+#include <klib/rc.h>
+#include <kfs/arc.h>
+#include <kfs/sra.h>
+#include <kfs/toc.h>
+#include <kfs/file.h>
+#include <kfs/subfile.h>
+#include <klib/namelist.h>
+#include <klib/vector.h>
+#include <klib/status.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+typedef struct CCNodeSraDir CCNodeSraDir;
+#define KDIR_IMPL struct CCNodeSraDir
+#include <kfs/impl.h>
+
+/* must be after kfs/impl */
+#include "debug.h"
+
+struct CCNodeSraDir
+{
+ KDirectory dad;
+ const KFile * file;
+ const char * dir_name;
+ const char * sub_name;
+ size_t name_size;
+
+};
+
+static bool CCNodeSraDirLegalPath (const CCNodeSraDir * self, const char * path)
+{
+ if (*path == '/')
+ return (strncmp (self->sub_name, path+1, self->name_size + 1) == 0);
+ else
+ return (strncmp (self->sub_name, path, self->name_size + 1) == 0);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirDestroy
+ */
+static rc_t CC CCNodeSraDirDestroy (CCNodeSraDir *self)
+{
+ if (self)
+ {
+ KFileRelease (self->file);
+ free (self);
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirList
+ * create a directory listing
+ *
+ * "list" [ OUT ] - return parameter for list object
+ *
+ * "path" [ IN, NULL OKAY ] - optional parameter for target
+ * directory. if NULL, interpreted to mean "."
+ */
+static
+rc_t CC CCNodeSraDirList (const CCNodeSraDir *self,
+ KNamelist **listp,
+ bool (CC* f) (const KDirectory *dir, const char *name, void *data),
+ void *data,
+ const char *path,
+ va_list args)
+{
+ assert (0);
+
+ return 0;
+}
+
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirVisit
+ * visit each path under designated directory,
+ * recursively if so indicated
+ *
+ * "recurse" [ IN ] - if non-zero, recursively visit sub-directories
+ *
+ * "f" [ IN ] and "data" [ IN, OPAQUE ] - function to execute
+ * on each path. receives a base directory and relative path
+ * for each entry, where each path is also given the leaf name
+ * for convenience. if "f" returns non-zero, the iteration will
+ * terminate and that value will be returned. NB - "dir" will not
+ * be the same as "self".
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native character set
+ */
+static
+rc_t CC CCNodeSraDirVisit (const CCNodeSraDir *self,
+ bool recurse,
+ rc_t (CC* f) (const KDirectory *, uint32_t, const char *, void *),
+ void *data,
+ const char *path,
+ va_list args)
+{
+ assert (0);
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirVisitUpdate
+ */
+static rc_t CC CCNodeSraDirVisitUpdate (CCNodeSraDir *self,
+ bool recurse,
+ rc_t (CC*f) (KDirectory *,uint32_t,const char *,void *),
+ void *data,
+ const char *path,
+ va_list args)
+{
+ return RC (rcFS, rcDirectory, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirPathType
+ * returns a KPathType
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native character set
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static uint32_t CC CCNodeSraDirPathType (const CCNodeSraDir *self, const char *path, va_list args)
+{
+ if (CCNodeSraDirLegalPath (self, path))
+ return kptFile;
+ return kptNotFound;
+}
+
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirRelativePath
+ * makes "path" relative to "root"
+ * both "root" and "path" MUST be absolute
+ * both "root" and "path" MUST be canonical, i.e. have no "//", "/./" or "/../" sequences
+ */
+/*
+static
+rc_t CCNodeSraDirRelativePath (const CCNodeSraDir *self, enum RCContext ctx,
+ const char *root, char *path, size_t path_max)
+{
+ assert (0);
+ return 0;
+}
+*/
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirResolvePath
+ *
+ * resolves path to an absolute or directory-relative path
+ *
+ * [IN] const CCNodeSraDir *self Objected oriented self
+ * [IN] bool absolute if non-zero, always give a path starting
+ * with '/'. NB - if the directory is
+ * chroot'd, the absolute path
+ * will still be relative to directory root.
+ * [OUT] char * resolved buffer for NUL terminated result path in
+ * directory-native character set
+ * [IN] size_t rsize limiting size of resolved buffer
+ * [IN] const char * path NUL terminated string in directory-native
+ * character set denoting target path.
+ * NB - need not exist.
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC CCNodeSraDirResolvePath (const CCNodeSraDir *self,
+ bool absolute,
+ char *resolved,
+ size_t rsize,
+ const char *path_fmt,
+ va_list args)
+{
+ char path[4096];
+ int size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( size < 0 || size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+ if (absolute && (path[0] != '/'))
+ {
+ string_printf (resolved, rsize, NULL, "/%s", path);
+ }
+ else
+ string_copy (resolved, rsize, path, self->name_size+1);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirResolveAlias
+ * resolves an alias path to its immediate target
+ * NB - the resolved path may be yet another alias
+ *
+ * "alias" [ IN ] - NUL terminated string in directory-native
+ * character set denoting an object presumed to be an alias.
+ *
+ * "resolved" [ OUT ] and "rsize" [ IN ] - buffer for
+ * NUL terminated result path in directory-native character set
+ *
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC CCNodeSraDirResolveAlias (const CCNodeSraDir * self,
+ bool absolute,
+ char * resolved,
+ size_t rsize,
+ const char *alias,
+ va_list args)
+{
+ assert (0);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirRename
+ * rename an object accessible from directory, replacing
+ * any existing target object of the same type
+ *
+ * "from" [ IN ] - NUL terminated string in directory-native
+ * character set denoting existing object
+ *
+ * "to" [ IN ] - NUL terminated string in directory-native
+ * character set denoting existing object
+ */
+static
+rc_t CC CCNodeSraDirRename (CCNodeSraDir *self, bool force, const char *from, const char *to)
+{
+ assert (self != NULL);
+ assert (from != NULL);
+ assert (to != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirRemove
+ * remove an accessible object from its directory
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target object
+ *
+ * "force" [ IN ] - if non-zero and target is a directory,
+ * remove recursively
+ */
+static
+rc_t CC CCNodeSraDirRemove (CCNodeSraDir *self, bool force, const char *path, va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirClearDir
+ * remove all directory contents
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target directory
+ *
+ * "force" [ IN ] - if non-zero and directory entry is a
+ * sub-directory, remove recursively
+ */
+static
+rc_t CC CCNodeSraDirClearDir (CCNodeSraDir *self, bool force, const char *path, va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirAccess
+ * get access to object
+ *
+ * "access" [ OUT ] - return parameter for Unix access mode
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target object
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static rc_t CC CCNodeSraDirVAccess (const CCNodeSraDir *self,
+ uint32_t *access,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (access != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcReading, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirSetAccess
+ * set access to object a la Unix "chmod"
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target object
+ *
+ * "access" [ IN ] and "mask" [ IN ] - definition of change
+ * where "access" contains new bit values and "mask defines
+ * which bits should be changed.
+ *
+ * "recurse" [ IN ] - if non zero and "path" is a directory,
+ * apply changes recursively.
+ */
+static rc_t CC CCNodeSraDirSetAccess (CCNodeSraDir *self,
+ bool recurse,
+ uint32_t access,
+ uint32_t mask,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+
+static rc_t CC CCNodeSraDirVDate (const CCNodeSraDir *self,
+ KTime_t *date,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (date != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcReading, rcSelf, rcUnsupported);
+}
+static rc_t CC CCNodeSraDirSetDate (CCNodeSraDir *self,
+ bool recurse,
+ KTime_t date,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+static
+struct KSysDir *CC CCNodeSraDirGetSysDir ( const CCNodeSraDir *self )
+{
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirCreateAlias
+ * creates a path alias according to create mode
+ *
+ * "targ" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target object
+ *
+ * "alias" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target alias
+ *
+ * "access" [ IN ] - standard Unix directory access mode
+ * used when "mode" has kcmParents set and alias path does
+ * not exist.
+ *
+ * "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC CCNodeSraDirCreateAlias (CCNodeSraDir *self,
+ uint32_t access,
+ KCreateMode mode,
+ const char *targ,
+ const char *alias)
+{
+ assert (self != NULL);
+ assert (targ != NULL);
+ assert (alias != NULL);
+
+ return RC (rcFS, rcNoTarg, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirOpenFileRead
+ * opens an existing file with read-only access
+ *
+ * "f" [ OUT ] - return parameter for newly opened file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC CCNodeSraDirOpenFileRead (const CCNodeSraDir *self,
+ const KFile **f,
+ const char *path_fmt,
+ va_list args)
+{
+ rc_t rc;
+ char path[4096];
+ int size;
+
+ assert (self != NULL);
+ assert (f != NULL);
+ assert (path_fmt != NULL);
+
+ size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( size < 0 || size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+
+ if (CCNodeSraDirLegalPath (self, path))
+ {
+ rc = KFileAddRef (self->file);
+ if (rc == 0)
+ {
+ *f = self->file;
+ return 0;
+ }
+ return rc;
+ }
+ else
+ rc = RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcNotFound);
+ *f = NULL;
+ return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirOpenFileWrite
+ * opens an existing file with write access
+ *
+ * "f" [ OUT ] - return parameter for newly opened file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "update" [ IN ] - if non-zero, open in read/write mode
+ * otherwise, open in write-only mode
+ */
+static
+rc_t CC CCNodeSraDirOpenFileWrite (CCNodeSraDir *self,
+ KFile **f,
+ bool update,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (f != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirCreateFile
+ * opens a file with write access
+ *
+ * "f" [ OUT ] - return parameter for newly opened file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "access" [ IN ] - standard Unix access mode, e.g. 0664
+ *
+ * "update" [ IN ] - if non-zero, open in read/write mode
+ * otherwise, open in write-only mode
+ *
+ * "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC CCNodeSraDirCreateFile (CCNodeSraDir *self,
+ KFile **f,
+ bool update,
+ uint32_t access,
+ KCreateMode cmode,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (f != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirFileLocator
+ * returns locator in bytes of target file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "locator" [ OUT ] - return parameter for file locator
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC CCNodeSraDirFileLocator (const CCNodeSraDir *self,
+ uint64_t *locator,
+ const char *path_fmt,
+ va_list args)
+{
+ char path[4096];
+ int size;
+
+ assert (self != NULL);
+ assert (locator != NULL);
+ assert (path_fmt != NULL);
+
+ size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( size < 0 || size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+
+ *locator = 0; /* undefined for this situation */
+ if (CCNodeSraDirLegalPath (self, path))
+ return 0;
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcNotFound);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirFileSize
+ * returns size in bytes of target file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC CCNodeSraDirFileSize (const CCNodeSraDir *self,
+ uint64_t *size,
+ const char *path_fmt,
+ va_list args)
+{
+ char path[4096];
+ int path_size;
+
+ assert (self != NULL);
+ assert (size != NULL);
+ assert (path_fmt != NULL);
+
+ path_size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( path_size < 0 || path_size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+
+ if (CCNodeSraDirLegalPath (self, path))
+ return (KFileSize (self->file, size)); /* we have to assume physical and logical size are the same */
+
+ *size = 0;
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcNotFound);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirFileSize
+ * returns size in bytes of target file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "size" [ OUT ] - return parameter for file size
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC CCNodeSraDirFilePhysicalSize (const CCNodeSraDir *self,
+ uint64_t *size,
+ const char *path_fmt,
+ va_list args)
+{
+ char path[4096];
+ int path_size;
+
+ assert (self != NULL);
+ assert (size != NULL);
+ assert (path_fmt != NULL);
+
+ path_size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( path_size < 0 || path_size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+
+ if (CCNodeSraDirLegalPath (self, path))
+ return (KFileSize (self->file, size)); /* we have to assume physical and logical size are the same */
+
+ *size = 0;
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcNotFound);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirSetFileSize
+ * sets size in bytes of target file
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "size" [ IN ] - new file size
+ */
+static
+rc_t CC CCNodeSraDirSetFileSize (CCNodeSraDir *self,
+ uint64_t size,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcWriting, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirOpenDirRead
+ *
+ * opens a sub-directory
+ *
+ * [IN] const CCNodeSraDir * self Object Oriented C CCNodeSraDir self
+ * [OUT] const KDirectory ** subp Where to put the new KDirectory/CCNodeSraDir
+ * [IN] bool chroot Create a chroot cage for this new subdirectory
+ * [IN] const char * path Path to the directory to open
+ * [IN] va_list args So far the only use of args is possible additions to path
+ */
+static
+rc_t CC CCNodeSraDirOpenDirRead (const CCNodeSraDir *self,
+ const KDirectory **subp,
+ bool chroot,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (subp != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcReading, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirOpenDirUpdate
+ * opens a sub-directory
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target directory
+ *
+ * "chroot" [ IN ] - if non-zero, the new directory becomes
+ * chroot'd and will interpret paths beginning with '/'
+ * relative to itself.
+ */
+static
+rc_t CC CCNodeSraDirOpenDirUpdate (CCNodeSraDir *self,
+ KDirectory ** subp,
+ bool chroot,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (subp != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirCreateDir
+ * create a sub-directory
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target directory
+ *
+ * "access" [ IN ] - standard Unix directory permissions
+ *
+ * "mode" [ IN ] - a creation mode (see explanation above).
+ */
+static
+rc_t CC CCNodeSraDirCreateDir (CCNodeSraDir *self,
+ uint32_t access,
+ KCreateMode mode,
+ const char *path,
+ va_list args)
+{
+ assert (self != NULL);
+ assert (path != NULL);
+
+ return RC (rcFS, rcNoTarg, rcCreating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirDestroyFile
+ */
+static
+rc_t CC CCNodeSraDirDestroyFile (CCNodeSraDir *self,
+ KFile * f)
+{
+ assert (self != NULL);
+ assert (f != NULL);
+
+ return RC (rcFS, rcNoTarg, rcDestroying, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * CCNodeSraDirFileContiguous
+ *
+ *
+ * "path" [ IN ] - NUL terminated string in directory-native
+ * character set denoting target file
+ *
+ * "contiguous" [ OUT ] - return parameter for file status
+ * NOTE: Does not meet a design target of on stack (localized variable) allocation of single 4kb path
+ */
+static
+rc_t CC CCNodeSraDirFileContiguous (const CCNodeSraDir *self,
+ bool * contiguous,
+ const char *path_fmt,
+ va_list args)
+{
+ char path[4096];
+ int size;
+
+ assert (self);
+ assert (contiguous);
+ assert (path_fmt);
+
+ size = args ?
+ vsnprintf ( path, sizeof path, path_fmt, args ) :
+ snprintf ( path, sizeof path, "%s", path_fmt );
+ if ( size < 0 || size >= (int) sizeof path )
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcExcessive );
+
+ if (CCNodeSraDirLegalPath (self, path))
+ {
+ *contiguous = true;
+ return 0;
+ }
+ *contiguous = false;
+ return RC (rcFS, rcNoTarg, rcAccessing, rcPath, rcNotFound);
+}
+
+
+static KDirectory_vt_v1 CCNodeSraDir_vt =
+{
+ /* version 1.0 */
+ 1, 3,
+
+ /* start minor version 0 methods*/
+ CCNodeSraDirDestroy,
+ CCNodeSraDirList,
+ CCNodeSraDirVisit,
+ CCNodeSraDirVisitUpdate,
+ CCNodeSraDirPathType,
+ CCNodeSraDirResolvePath,
+ CCNodeSraDirResolveAlias,
+ CCNodeSraDirRename,
+ CCNodeSraDirRemove,
+ CCNodeSraDirClearDir,
+ CCNodeSraDirVAccess,
+ CCNodeSraDirSetAccess,
+ CCNodeSraDirCreateAlias,
+ CCNodeSraDirOpenFileRead,
+ CCNodeSraDirOpenFileWrite,
+ CCNodeSraDirCreateFile,
+ CCNodeSraDirFileSize,
+ CCNodeSraDirSetFileSize,
+ CCNodeSraDirOpenDirRead,
+ CCNodeSraDirOpenDirUpdate,
+ CCNodeSraDirCreateDir,
+ CCNodeSraDirDestroyFile,
+ /* end minor version 0 methods*/
+ /* start minor version 1 methods*/
+ CCNodeSraDirVDate,
+ CCNodeSraDirSetDate,
+ CCNodeSraDirGetSysDir,
+ /* end minor version 2 methods*/
+ CCNodeSraDirFileLocator,
+ /* end minor version 2 methods*/
+ /* end minor version 3 methods*/
+ CCNodeSraDirFilePhysicalSize,
+ CCNodeSraDirFileContiguous
+ /* end minor version 3 methods*/
+};
+static const char root_name[] = "/";
+static
+rc_t KDirectoryMakeSraNodeDir (const KDirectory ** pself, const KFile * file,
+ const char * name)
+{
+ CCNodeSraDir * self;
+ size_t name_size;
+ rc_t rc;
+
+ assert (pself);
+
+ name_size = string_size (name);
+ self = malloc (sizeof (*self) + name_size + 1);
+ if (self == NULL)
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ else
+ {
+ rc = KFileAddRef (file);
+ if (rc == 0)
+ {
+ rc_t orc;
+ self->file = file;
+ self->dir_name = root_name;
+ self->sub_name = (const char *)(self+1);
+ self->name_size = name_size;
+ strcpy ((char*)self->sub_name, name);
+ rc = KDirectoryInit (&self->dad, (const KDirectory_vt*)&CCNodeSraDir_vt,
+ "CCSraNodeDir", root_name, false);
+ if (rc == 0)
+ {
+ *pself = &self->dad;
+ return 0;
+ }
+ orc = KFileRelease (file);
+ if (orc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, orc,
+ "Error releaseing sub file '$(F) in a KAR archive",
+ "F=%s", name));
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct list_item
+{
+ KPathType type;
+ uint32_t access;
+ uint64_t size;
+ uint64_t loc;
+ KTime_t mtime;
+ char * path;
+ char * link;
+
+} list_item;
+
+static
+void CC list_item_whack (void * item, void * data)
+{
+ free (item);
+}
+static
+int64_t CC list_item_cmp (const void * item, const void * n)
+{
+ const list_item * l = item;
+ const list_item * r = n;
+
+/* a bit of a hack to get around issue with CCTree
+ * it has to have a directory say "dir" inserted before
+ * a file within it say dir/file
+ */
+
+ /* dirs before others */
+ if ((l->type == kptDir) && (r->type != kptDir))
+ return -1;
+ if ((r->type == kptDir) && (l->type != kptDir))
+ return 1;
+
+ /* then by location */
+ if (l->loc > r->loc)
+ return 1;
+ if (l->loc < r->loc)
+ return -1;
+
+ /* if a file is zero sized, but it before a non-zero sized file */
+ if ((l->size == 0) && (r->size > 0))
+ return -1;
+ if ((r->size == 0) && (l->size > 0))
+ return 1;
+
+ /* if type is the same, location is the same and size is the same
+ * go alphabetically. This puts dirs before sub dirs since
+ * strcmp says "dir" comes before "dir/dir"
+ */
+ return (strcmp (l->path, r->path));
+}
+
+
+typedef struct list_adata
+{
+ Vector list;
+ Vector sort;
+ bool has_zombies;
+} list_adata;
+
+
+static rc_t list_adata_init (list_adata * self)
+{
+ VectorInit (&self->list, 0, 512);
+ VectorInit (&self->sort, 0, 512);
+ self->has_zombies = false;
+ return 0;
+}
+
+
+static void list_adata_whack (list_adata * self)
+{
+ VectorWhack (&self->list, NULL, NULL);
+ VectorWhack (&self->sort, list_item_whack, NULL);
+}
+
+
+/* filter will let us add the add to and extract by name things to kar */
+static
+rc_t step_through_dir (const KDirectory * dir, const char * path,
+ rc_t (*action)(const KDirectory *, const char *, void *),
+ void * adata)
+{
+ rc_t rc;
+ KNamelist * names;
+
+ STSMSG (4, ("step_through_dir %s\n", path));
+
+ rc = KDirectoryList (dir, &names, NULL, NULL, "%s", path);
+ if (rc == 0)
+ {
+ uint32_t limit;
+ rc = KNamelistCount (names, &limit);
+ if (rc == 0)
+ {
+ uint32_t idx;
+ size_t pathlen;
+
+ pathlen = strlen(path);
+ for (idx = 0; (rc == 0) && (idx < limit); idx ++)
+ {
+ const char * name;
+ rc = KNamelistGet (names, idx, &name);
+ if (rc == 0)
+ {
+ size_t namelen = strlen (name);
+ size_t new_pathlen = pathlen + 1 + namelen;
+ char * new_path = malloc (new_pathlen + 1);
+
+ if (new_path != NULL)
+ {
+ char * recur_path;
+ if (pathlen == 0)
+ {
+ memmove (new_path, name, namelen);
+ new_path[namelen] = '\0';
+ }
+ else
+ {
+ memmove (new_path, path, pathlen);
+ new_path[pathlen] = '/';
+ memmove (new_path + pathlen + 1, name, namelen);
+ new_path[pathlen+1+namelen] = '\0';
+ }
+ recur_path = malloc (pathlen + 1 + namelen + 1);
+ if (recur_path != NULL)
+ {
+ rc = KDirectoryResolvePath (dir, false, recur_path,
+ pathlen + 1 + namelen + 1,
+ "%s", new_path);
+
+ if (rc == 0)
+ rc = action (dir, recur_path, adata);
+
+ free (recur_path);
+ }
+ free (new_path);
+ }
+ }
+ }
+ }
+ KNamelistRelease (names);
+ }
+ return rc;
+}
+static
+rc_t list_action (const KDirectory * dir, const char * path, void * _adata)
+{
+ rc_t rc = 0;
+ list_adata * data = _adata;
+ list_item * item = NULL;
+ KPathType type = KDirectoryPathType (dir, "%s", path);
+ size_t pathlen = strlen (path);
+ size_t linklen = 0;
+ char link [2 * 4096]; /* we'll truncate? */
+
+ if (type & kptAlias)
+ {
+ rc = KDirectoryVResolveAlias (dir, false, link, sizeof (link),
+ path, NULL);
+ if (rc == 0)
+ linklen = strlen (link);
+ }
+
+ if (rc == 0)
+ {
+ item = calloc (sizeof (*item) + pathlen + linklen + 2, 1); /* usually one too many */
+ if (item == NULL)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted);
+ }
+ else
+ {
+ do
+ {
+ item->path = (char *)(item+1);
+ strcpy (item->path, path);
+ item->type = type;
+ rc = KDirectoryAccess (dir, &item->access, "%s", path);
+ if (rc) break;
+
+ rc = KDirectoryDate (dir, &item->mtime, "%s", path);
+ if (rc) break;
+
+ if (type & kptAlias)
+ {
+ item->link = item->path + pathlen + 1;
+ strcpy (item->link, link);
+ }
+ else switch (type & ~kptAlias)
+ {
+ case kptNotFound:
+ rc = RC (rcExe, rcDirectory, rcAccessing, rcPath, rcNotFound);
+ break;
+ case kptBadPath:
+ rc = RC (rcExe, rcDirectory, rcAccessing, rcPath, rcInvalid);
+ break;
+ case kptZombieFile:
+ data->has_zombies = true;
+ case kptFile:
+ rc = KDirectoryFileSize (dir, &item->size, "%s", path);
+ if (rc == 0)
+ rc = KDirectoryFileLocator (dir, &item->loc, "%s", path);
+ DBGMSG (DBG_APP, 1, ("%s: found file %s size %lu at %lu\n",
+ __func__, item->path, item->size, item->loc));
+ break;
+ case kptDir:
+ DBGMSG (DBG_APP, 1, ("%s: found directory %s\n",
+ __func__, item->path));
+ break;
+ default:
+ DBGMSG (DBG_APP, 1, ("%s: found unknown %s\n",
+ __func__, item->path));
+ break;
+ }
+ } while (0);
+ }
+ }
+ if (rc == 0)
+ {
+ VectorAppend (&data->list, NULL, item);
+ VectorInsert (&data->sort, item, NULL, list_item_cmp);
+
+ if (type == kptDir)
+ rc = step_through_dir (dir, path, list_action, data);
+ }
+ return rc;
+}
+
+
+typedef struct CCSra
+{
+ CCTree * tree;
+ const KDirectory * ndir;
+ const KDirectory * adir;
+ const KFile * file;
+} CCSra;
+
+
+static
+rc_t CCSraInit (CCSra ** pself, CCTree * tree, const KFile * sf, const char * name)
+{
+ CCSra * self;
+ rc_t rc;
+
+ assert (pself);
+ assert (sf);
+ assert (name);
+
+ self = malloc (sizeof (*self));
+ if (self == NULL)
+ rc = RC (rcExe, rcMemory, rcAllocating, rcMemory, rcExhausted);
+ else
+ {
+ KFileAddRef (self->file = sf);
+
+ rc = KDirectoryMakeSraNodeDir (&self->ndir, sf, name);
+ if (rc == 0)
+ {
+ rc = KDirectoryOpenSraArchiveReadUnbounded (self->ndir, &self->adir, true, "%s", name);
+ if (rc == 0)
+ {
+ self->tree = tree;
+ *pself = self;
+ return 0;
+ }
+ KDirectoryRelease (self->ndir);
+ }
+ free (self);
+ }
+ return rc; /* error out */
+}
+
+static
+bool CC CCSraOneItem (void * item_, void * data_)
+{
+ CCSra * self = data_;
+ list_item * item = item_;
+ rc_t rc;
+
+ DBGMSG (DBG_APP, 1, ("%s: %s\n", __func__, item->path));
+
+
+ switch (item->type)
+ {
+ default:
+ DBGMSG (DBG_APP, 1, ("%s: item->type not processed (%d)\n", __func__, item->type));
+ rc = 0;
+ break;
+ case kptFile:
+ {
+ CCArcFileNode * node;
+ rc = CCArcFileNodeMake (&node, item->loc, item->size);
+ if (rc == 0)
+ {
+ const KFile * sfile;
+ rc = KFileMakeSubRead (&sfile, self->file, item->loc, item->size);
+ if (rc == 0)
+ {
+ void * save;
+
+ copycat_log_set (&node->dad.logs, &save);
+
+ rc = ccat_md5 (self->tree, sfile, item->mtime, ccArcFile, &node->dad,
+ item->path);
+
+ copycat_log_set (save, NULL);
+
+ KFileRelease (sfile);
+ }
+ }
+ DBGMSG (DBG_APP, 1, ("%s: kptFile processed %lu at %lu\n", __func__, item->size, item->loc));
+ break;
+ }
+ case kptDir:
+ {
+ CCTree * node;
+ rc = CCTreeMake (&node);
+ if (rc == 0)
+ {
+ rc = CCTreeInsert (self->tree, item->mtime, ccDirectory, node, item->path);
+ DBGMSG (DBG_APP, 1, ("%s: insert directory %s\n", __func__, item->path));
+ }
+ break;
+ }
+ }
+ DBGMSG (DBG_APP, 1, ("%s: exiting rc (%R) (%d)\n", __func__, rc, (rc !=0)));
+ return (rc != 0);
+}
+
+static
+void CCSraWhack (CCSra * self)
+{
+ rc_t rc, orc;
+ rc = KDirectoryRelease (self->ndir);
+ orc = KDirectoryRelease (self->adir);
+ if (rc == 0)
+ rc = orc;
+ orc = KFileRelease (self->file);
+ if (rc == 0)
+ rc = orc;
+ if (rc)
+ LOGERR(klogWarn, rc, "error releaseing CCSra");
+ free (self);
+}
+rc_t ccat_sra ( CCContainerNode *np, const KFile *sf, const char *name )
+{
+ rc_t rc;
+ CCSra * sra;
+
+ rc = CCSraInit (&sra, &np->sub, sf, name);
+
+ if (rc == 0)
+ {
+ list_adata ldata;
+
+ list_adata_init (&ldata);
+ rc = step_through_dir (sra->adir, ".", list_action, &ldata);
+ if (rc == 0)
+ {
+ DBGMSG (DBG_APP, 1, ("Vector sizes list (%u) sort (%u)\n",
+ VectorLength(&ldata.list),
+ VectorLength(&ldata.sort)));
+ VectorDoUntil (&ldata.sort, false, CCSraOneItem, sra);
+/* VectorDoUntil (&ldata.list, false, CCSraOneItem, sra); */
+ }
+ list_adata_whack (&ldata);
+ CCSraWhack (sra);
+ }
+ DBGMSG (DBG_APP, 1, ("Done with %s\n", name));
+ return rc;
+}
+
diff --git a/tools/copycat/ccsubchunk.c b/tools/copycat/ccsubchunk.c
new file mode 100644
index 0000000..1a4ad38
--- /dev/null
+++ b/tools/copycat/ccsubchunk.c
@@ -0,0 +1,390 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kfs/subfile.h>
+#include <kfs/arc.h> /* definition of chunks */
+#include "copycat-priv.h"
+/* ======================================================================
+ * KSubChunkedFile
+ * a chunked file inside an archive not general purpose yet
+ */
+
+/* -----
+ * define the specific types to be used in the templatish/inheritancish
+ * definition of vtables and their elements
+ */
+#define KFILE_IMPL struct KSubChunkFile
+#include <kfs/impl.h>
+
+static rc_t KSubChunkFileDestroy (KSubChunkFile *self);
+static struct KSysFile *KSubChunkFileGetSysFile (const KSubChunkFile *self,
+ uint64_t *offset);
+static rc_t KSubChunkFileRandomAccess (const KSubChunkFile *self);
+static uint32_t KSubChunkFileType (const KSubChunkFile *self);
+static rc_t KSubChunkFileSize (const KSubChunkFile *self, uint64_t *size);
+static rc_t KSubChunkFileSetSize (KSubChunkFile *self, uint64_t size);
+static rc_t KSubChunkFileRead (const KSubChunkFile *self, uint64_t pos,
+ void *buffer, size_t bsize, size_t *num_read);
+static rc_t KSubChunkFileWrite (KSubChunkFile *self, uint64_t pos, const void *buffer,
+ size_t size, size_t *num_writ);
+
+
+static const KFile_vt_v1 vtKSubChunkFile =
+{
+ /* version */
+ 1, 1,
+
+ /* 1.0 */
+ KSubChunkFileDestroy,
+ KSubChunkFileGetSysFile,
+ KSubChunkFileRandomAccess,
+ KSubChunkFileSize,
+ KSubChunkFileSetSize,
+ KSubChunkFileRead,
+ KSubChunkFileWrite,
+
+ /* 1.1 */
+ KSubChunkFileType
+};
+
+/*-----------------------------------------------------------------------
+ * KSubChunkFile
+ * an archive file including tar and sra
+ */
+struct KSubChunkFile
+{
+ KFile dad;
+ uint64_t size;
+ const KFile * original;
+ uint32_t num_chunks;
+ const KTocChunk chunks [1];
+};
+
+/* ----------------------------------------------------------------------
+ * KSubChunkFileMake
+ * create a new file object
+ */
+
+rc_t KFileMakeChunkRead (const struct KFile ** pself,
+ const struct KFile * original,
+ uint64_t size,
+ uint32_t num_chunks,
+ struct KTocChunk * chunks)
+{
+ rc_t rc;
+ KSubChunkFile * self;
+
+ /* -----
+ */
+ assert (pself != NULL);
+ assert (original != NULL);
+
+ *pself = NULL;
+ rc = 0;
+ /* -----
+ * get space for the object
+ */
+ self = malloc (sizeof (KSubChunkFile) + ((num_chunks-1) * sizeof (KTocChunk)));
+ if (self == NULL) /* allocation failed */
+ {
+ /* fail */
+ rc = RC (rcFS, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ else
+ {
+ rc = KFileInit (&self->dad, /* initialize base class */
+ (const KFile_vt*)&vtKSubChunkFile, /* VTable for KSubChunkFile */
+ "KSubChunkFile", "no-name",
+ true,false); /* read allowed,write disallowed */
+ if (rc == 0)
+ {
+ KFileAddRef (original);
+ /* succeed */
+ self->size = size;
+ self->original = original;
+ self->num_chunks = num_chunks;
+ memmove ((struct KTocChunk*)self->chunks, chunks, num_chunks * sizeof (KTocChunk));
+ *pself = &self->dad;
+ return 0;
+ }
+ /* fail */
+ free (self);
+ }
+ return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Destroy
+ *
+ */
+static
+rc_t KSubChunkFileDestroy (KSubChunkFile *self)
+{
+ assert (self != NULL);
+ KFileRelease (self->original);
+ free (self);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------
+ * GetSysFile
+ * returns an underlying system file object
+ * and starting offset to contiguous region
+ * suitable for memory mapping, or NULL if
+ * no such file is available.
+ *
+ * We cant allow memory mapping a tee file as the read?writes ar needed
+ * to trigger the writes to the copy KFile
+ */
+
+static
+struct KSysFile *KSubChunkFileGetSysFile (const KSubChunkFile *self, uint64_t *offset)
+{
+ /* parameters must be non-NULL */
+ assert (self != NULL);
+ assert (offset != NULL);
+
+ /* not implmenting at this time */
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * RandomAccess
+ *
+ * returns 0 if random access, error code otherwise
+ *
+ * Update needs to be able to seek both original and copy while read
+ * only needs to be able to seek the original.
+ */
+static
+rc_t KSubChunkFileRandomAccess (const KSubChunkFile *self)
+{
+ assert (self != NULL);
+ return KFileRandomAccess (self->original);
+}
+
+/* ----------------------------------------------------------------------
+ * Type
+ * returns a KFileDesc
+ * not intended to be a content type,
+ * but rather an implementation class
+ */
+static
+uint32_t KSubChunkFileType (const KSubChunkFile *self)
+{
+ return KFileType (self->original);
+}
+
+
+/* ----------------------------------------------------------------------
+ * Size
+ * returns size in bytes of file
+ *
+ * "size" [ OUT ] - return parameter for file size
+ */
+static
+rc_t KSubChunkFileSize (const KSubChunkFile *self, uint64_t *size)
+{
+ assert (self != NULL);
+ assert (size != NULL);
+
+ *size = self->size;
+
+ return 0;;
+}
+
+/* ----------------------------------------------------------------------
+ * SetSize
+ * sets size in bytes of file
+ *
+ * "size" [ IN ] - new file size
+ */
+static
+rc_t KSubChunkFileSetSize (KSubChunkFile *self, uint64_t size)
+{
+ return RC (rcFS, rcFile, rcUpdating, rcSelf, rcUnsupported);
+}
+
+/* ----------------------------------------------------------------------
+ * Read
+ * read file from known position
+ *
+ * "pos" [ IN ] - starting position within file
+ *
+ * "buffer" [ OUT ] and "bsize" [ IN ] - return buffer for read
+ *
+ * "num_read" [ OUT, NULL OKAY ] - optional return parameter
+ * giving number of bytes actually read
+ */
+static
+rc_t KSubChunkFileRead (const KSubChunkFile *self,
+ uint64_t pos,
+ void *buffer,
+ size_t bsize,
+ size_t *num_read)
+{
+ size_t count; /* how many to read/write in an action */
+ uint8_t * pbuff; /* access the buffer as an array of bytes */
+ uint64_t end; /* this will be set to the end offset */
+ uint32_t num_chunks;
+ const KTocChunk * pchunk;
+ rc_t rc; /* general purpose return from calls and pass along */
+
+ assert (self != NULL);
+ assert (buffer != NULL);
+ assert (num_read != NULL);
+ assert (bsize != 0);
+
+ /* -----
+ * assume no read/write will happen or rather start with having read none;
+ * this write could be superfluous but we need to prepare *num_read for += operations
+ */
+ *num_read = 0;
+
+ pbuff = buffer;
+ end = pos + bsize;
+ num_chunks = self->num_chunks;
+ pchunk = self->chunks;
+
+ /* -----
+ * step through the chunks
+ */
+ for (rc = 0; (num_chunks) && (pos < end); --num_chunks, ++pchunk)
+ {
+ uint64_t cend; /* end offset of this chunk */
+
+ /* -----
+ * determine the end of this chunk
+ */
+ cend = pchunk->logical_position + pchunk->size;
+
+ /* -----
+ * if this chunk is entirely before the current position
+ * we are looking for
+ * skip to the next (if any) chunk
+ */
+ if (pos > cend)
+ continue;
+
+ /* -----
+ * handle any needed zero fill section before the next chunk
+ */
+ if (pos < pchunk->logical_position)
+ {
+ /* -----
+ * try to fake-read as many bytes of zero as possible
+ * so start assuming you need enough zeros to reach the next chunk
+ * but cut it back to the remaining requested if that was too many
+ */
+ count = pchunk->logical_position - pos;
+ if (count > bsize)
+ count = bsize;
+
+ /* fake read the zeros */
+ memset (pbuff, 0, count);
+
+ /* update tracking variables */
+ pbuff += count;
+ pos += count;
+ *num_read += count;
+ }
+
+ /* -----
+ * handle a chunk section
+ *
+ * if we are here, then we still have bytes to get and
+ * pos >= pchunk_logical_position
+ *
+ * Get the most we can from this chunk.
+ * If there are enough bytes in this chunk to finish the read: do so.
+ * Else read through the end of the chunk
+ */
+ count = (end <= cend) ? end - pos : cend - pos;
+
+ /* -----
+ * a little tricky is we call by value the wanted count and the function
+ * called will over write that with the actual read count
+ */
+ rc = KFileRead (self->original,
+ pchunk->source_position + (pchunk->logical_position - pos),
+ pbuff, count, &count);
+
+ *num_read += count;
+ if (rc != 0)
+ {
+ /* failure so abort */
+ break;
+ }
+ pbuff += count;
+ pos += count;
+ *num_read += count;
+ }
+ /* -----
+ * If eveything so far is okay but we have more bytes to read
+ * yet no more chunks; then fill to the end with zeroes
+ */
+ if ((rc == 0) && (pos < end))
+ {
+ count = end - pos;
+ memset (pbuff, 0, count);
+ *num_read += count;
+ }
+ return rc;
+}
+
+/* ----------------------------------------------------------------------
+ * Write
+ * write file at known position
+ *
+ * "pos" [ IN ] - starting position within file
+ *
+ * "buffer" [ IN ] and "size" [ IN ] - data to be written
+ *
+ * "num_writ" [ OUT, NULL OKAY ] - optional return parameter
+ * giving number of bytes actually written
+ *
+ * Unsupported as we now treat archives as READ ONLY
+ */
+static
+rc_t KSubChunkFileWrite (KSubChunkFile *self, uint64_t pos,
+ const void *buffer, size_t bsize,
+ size_t *num_writ)
+{
+ assert (self != NULL);
+ assert (buffer != NULL);
+ assert (num_writ != NULL);
+
+ *num_writ = 0;
+ return RC (rcFS, rcFile, rcWriting, rcSelf, rcUnsupported);
+}
+
+/* end of file subfile.c */
+
diff --git a/tools/copycat/cctar.c b/tools/copycat/cctar.c
new file mode 100644
index 0000000..cedf6aa
--- /dev/null
+++ b/tools/copycat/cctar.c
@@ -0,0 +1,2199 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "copycat-priv.h"
+#include "debug.h"
+
+#include <klib/rc.h>
+#include <kfs/arc.h>
+#include <kfs/toc.h>
+#include <kfs/file.h>
+#include <kfs/subfile.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <os-native.h>
+
+#include <strtol.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* ======================================================================
+ *
+ * ======================================================================
+ */
+
+#define OFFSET_OF(structure,member) ((size_t)((&(((structure*)0)->member))-(0)))
+#define PASTE_2(a,b) a##b
+#define PASTE_3(a,b,c) a##b##c
+#define STRINGIFY(a) #a
+#ifdef sun
+#undef sun
+#endif
+typedef struct sparse_data
+{
+ struct sparse_data* next;
+ uint64_t offset;
+ uint64_t size;
+} sparse_data;
+
+typedef struct CCTar
+{
+ CCFileNode * tar_node; /* so we can flag errors */
+ CCTree * tree;
+ const KFile * file;
+ const char * name;
+ sparse_data * sparse_q;
+ struct KTocChunk * chunks; /* table of chunks: logical_position, source_position, size */
+ size_t tar_length; /* how long should the tar file for proper format */
+ size_t buffer_length; /* how long is the window into the buffer */
+ uint32_t num_chunks;
+ uint64_t position; /* current position in the file */
+ uint64_t position_new; /* next current position in the file */
+ uint64_t position_limit; /* max_position read */
+
+ uint64_t cursor; /* where we are by parsing the tar */
+
+ bool found_zero_block;
+ bool found_second_zero_block;
+ uint8_t buffer [8 * 1024];
+
+} CCTar;
+
+
+
+static
+rc_t CCTarMake (CCTar ** pself, CCTree * tree, const KFile * sf,
+ const char * name, CCFileNode * fnode)
+{
+ rc_t rc;
+ CCTar * self;
+
+ /* instead of setting individual fields to 9 allocate it as zeroed */
+ self = calloc (1, sizeof * self);
+ if (self == NULL)
+ {
+ rc = RC (rcExe, 0,0,rcMemory, rcExhausted);
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "No memory for tar parse object for $(P)", PLOG_S(P), name));
+ free (self);
+ *pself = NULL;
+ return rc;
+ }
+ self->tree = tree;
+ self->file = sf;
+ self->name = name;
+ self->tar_length = 1024; /* at init we expect at least two zero blocks */
+ *pself = self;
+ return 0;
+}
+
+
+static
+rc_t CCTarWhack (const CCTar * cself)
+{
+ free ((void*)cself); /* cast away const */
+ return 0;
+}
+
+
+/* ======================================================================
+ * Header format structures
+ *
+ * Tar (tape archiver) started possibly as a unix utility in BSD rivalling
+ * the cpio from the AT&T System III. The exact derivation is unimportant
+ * and some names might be slightly misleading based on historical
+ * inaccuracies but successful implmentation is not dependant on such
+ * accuracy in historical trivia but rather on accuracy in technical details.
+ *
+ * Posix attempted to standardize the growingly divergent variants of tar
+ * but it has led to only slightly more standardized variants with vaguely
+ * compatible extensions.
+ *
+ * For the purposes of this implmentation we will refer to the known to the
+ * author versions of tar and include the tar like aspects of the posix pax
+ * replacement for tar.
+ *
+ * Cpio support could be added if desired with only some difficulty.
+ *
+ * Supported known variants for this implmentation will be:
+ * V7 - the oldest known common base defitions for a tar header
+ * block ( possibly from Unix V7?)
+ * POSIX - Posix.1-1988 initial restandardization of a header block
+ * This versio introduced the ustar name for a tar header
+ * and includes that term as a "magic" constant.
+ * PAX - Posix.1.2001 headers for pax a tar derivative that us a
+ * peaceful attempt to unify the tar and cpio formats apparently.
+ * It isn't different than POSIX in the ustar block but instead
+ * is an introduction of two new values of a link field in the
+ * tar header that defines what comes next (see headers defined
+ * below).
+ * SUN - an extension to the POSIX tar header format from SunOS 5
+ * STAR 85 - pre-POSIX extensions to tar from Heorg Schilling (ask him its
+ * the bestest most greatest tar until STAR94)
+ * STAR 94 - A redo of star based on the POSIX ustar tar header. A less
+ * broken than most implmentation of a POSIX/ustar tar header
+ * based tar. Schilling says its the only real implmentation of
+ * a ustar based tar but it isn't fully compliant by design.
+ * GNU 89 - a selected variant of tar from FSF/GNU that is a broken
+ * implementation of a POSIX/ustar header based tar.
+ * GNU 01 - A slight redo of the FSF/GNU tar format. There are actually
+ * evolving variants all of which are still somewhat broken
+ * implementations of a ustar based tar header format.
+ *
+ * Along with these variants of a tar/ustar semi-standard tar header there are
+ * other header blocks and other significant blocks that are also tracked in
+ * this implmentation of a tar reader.
+ * ZERO BLOCK - a block of 512 zero bytes that is supposed to be padding at
+ * the end of a tar file to meet some super blocksize. Based on
+ * where it fits in it would be found when looking for a header
+ * for the next file included in a tar archive.
+ * RAW - a convention to mean a header block of a type that has not been
+ * determined.
+ */
+#define TYPES() \
+ type_(UNDEFINED) type_(ZERO_BLOCK) type_(CPIO) type_(V7) type_(POSIX) \
+ type_(SUN) type_(STAR_85) type_(STAR_94) type_(GNU_89) type_(SPARSE)
+
+
+#define type_(e) PASTE_2(TAR_,e),
+
+typedef enum tar_header_type
+{
+ TYPES()
+ TAR_TYPE_COUNT
+} tar_header_type;
+
+#undef type_
+#define type_(e) STRINGIFY(e),
+static const char * get_type_string(tar_header_type t)
+{
+ static const char * type_error = "Error";
+ static const char * type_strings[] =
+ {
+ TYPES()
+ };
+ if ((t < 0) || (t >= TAR_TYPE_COUNT))
+ return type_error;
+ return type_strings[t];
+}
+#undef type_
+#undef TYPES
+
+
+/* =============================================================================
+ * Tar headers are almost ASCII based but definitely byte/octet based so all
+ * elements are best defined as arrays of char and use casts to signed and unsigned
+ * where appropriate in interpretation..
+ *
+ * All Tar files or streams are divided into blocks of 512 bytes
+ * This is significant in the file data in that the last block
+ * of a file is supposed to be padded with NUL to fill out a block
+ * and then be followed by two blocks of all NUL bytes.
+ * headers are also 512 bytes with various but fairly consistent
+ * interpretations of what is where with in that block
+ *
+ * Most tar utilities further define super blocks consisting of a number of blocks
+ * typically 10 of them for a length of 5120 bytes. This is irrelevant for this
+ * implmentation. By definition a tar file ends with two "zero blocks" and enough
+ * more after that to fill one of these super blocks. We ignore all aspects of
+ * this.
+ */
+#define TAR_BLOCK_SIZE (512)
+typedef char tar_raw_block [TAR_BLOCK_SIZE];
+#define BLOCKS_FOR_BYTES(byte_count) ((byte_count+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)
+
+/* --------------------------------------------------------------------------------
+ * lengths of various tar header fields
+ */
+
+/* --------------------
+ * Tar file names are always 100 bytes long and include preceding
+ * path names. The utilities do not precluded paths that put the
+ * files outside of the "base" where the tar file was created.
+ *
+ * To handle tar files made by older tar utilities if the last
+ * character is '/' then the file should be assumed to be a directory.
+ *
+ * This 'type' is used for both the name of the object being archived
+ * and the link target if it is a hard or soft link.
+ */
+#define TAR_NAME_LEN (100)
+typedef char tar_file_name [TAR_NAME_LEN];
+
+/* --------------------
+ * Tar mode strings are always 8 bytes long.
+ *
+ * 9 file access permissions bits and three execution mode bits.
+ *
+ * Zero '0' not NUL pre-fill unused bytes. a user permision of 0644 would be stored as
+ * "0000644" with a NUL terminator.
+ *
+ * The format is 7 octal ASCII bytes with only the last 4 being
+ * significant. That is the first three are always '0'. The 8th
+ * byte is NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_MODE_LEN (8)
+typedef char tar_file_mode [TAR_MODE_LEN];
+/* -----
+ * These are the bits if the mode is in binary (octal defines for ease of interpretation)
+ * they match the st_mode field from the stat()/fstat() struct stat.
+ *
+ * GNU tar puts the file type bits from the stat structure in the mode of the tar file.
+ * Other tar implmentations might as well though no where is this dktefined as required or
+ * recommended or even supported.
+ */
+#define TAR_SUID_BIT (04000) /* set UID on execution */
+#define TAR_GUID_BIT (02000) /* set GID on execution */
+#define TAR_STICKY_BIT (01000) /* save text / sticky bit */
+/* file permissions */
+#define TAR_MODE_OREAD (00400) /* read by owner */
+#define TAR_MODE_OWRITE (00200) /* write by owner */
+#define TAR_MODE_OEXEC (00100) /* execute by owner */
+#define TAR_MODE_GREAD (00040) /* read by group */
+#define TAR_MODE_GWRITE (00020) /* write by group */
+#define TAR_MODE_GEXEC (00010) /* execute by group */
+#define TAR_MODE_WREAD (00004) /* read by other */
+#define TAR_MODE_WWRITE (00002) /* write by other */
+#define TAR_MODE_WEXEC (00001) /* execute by other */
+
+/* -----
+ * These are the bits once converted into ASCII
+ * with in an ASCII byte these bits are actually usable so no conversion needed
+ * '0' = 0x30 / 060
+ * '1' = 0x31 / 061
+ * '2' = 0x32 / 062
+ * '3' = 0x33 / 063
+ * '4' = 0x34 / 064
+ * '5' = 0x35 / 065
+ * '6' = 0x36 / 066
+ * '7' = 0x37 / 067
+ */
+#define TAR_MODE_READ (0x01)
+#define TAR_MODE_WRITE (0x02)
+#define TAR_MODE_EXEC (0x04)
+#define TAR_MODE_STICKY (0x01)
+#define TAR_MODE_GUID (0x02)
+#define TAR_MODE_SUID (0x04)
+#define TAR_MODE_OWNER_BYTE (6)
+#define TAR_MODE_GROUP_BYTE (5)
+#define TAR_MODE_WORLD_BYTE (4)
+#define TAR_MODE_USER_BYTE (3)
+#define TAR_MODE_EXEC_BYTE (2)
+
+/* --------------------
+ * Tar user (and group) numeric IDs are put into 8 bytes.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_ID_LEN (8)
+typedef char tar_id [TAR_ID_LEN];
+
+/* --------------------
+ * Tar file size elements are 12 bytes long with 11 used
+ * for octal characters making the maximum size of a file
+ * for pure classic or Posix tar limited to 8 GBytes.
+ * Various tar utilities handle longer files in different
+ * ways if at all.
+ *
+ * A length of 100 bytes would be stored as "00000000144".
+ *
+ * Links and some other special values are archived with a
+ * length of zero and thus no data blocks.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ *
+ * GNU tar implmentations use alternative intrpretatopms of
+ * this and possibly other fields using mime base 64 or
+ * base 256 (big endian nonstandard sized binary)
+ */
+#define TAR_SIZE_LEN (12)
+typedef char tar_size [TAR_SIZE_LEN];
+#define MAX_TAR_FILE_SIZE (077777777777)
+
+/* --------------------
+ * Tar file modification/access/creation times are 12 bytes
+ * long. This holds 11 octal ASCII digits representing the
+ * number of seconds since 01/01/1970 00:00 UTC.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_TIME_LEN (12)
+typedef char tar_time [TAR_TIME_LEN];
+
+/* --------------------
+ * Tar has a weak checksum protection of part of the tar header
+ * that is 8 bytes long and again uses 7 ASCII octal digits.
+ *
+ * There is a '0' prefill and as terminating NUL.
+ *
+ * Older utilities might put preceding ' ' characters or
+ * instead of pre-fill have post fill ' ' or NUL.
+ */
+#define TAR_CSUM_LEN (8)
+typedef char tar_csum [TAR_CSUM_LEN];
+#define csum_blanks (" ")
+
+/* --------------------
+ * The tar link is a single byte that expresses the type of file
+ * or special value represented by this entry.
+ */
+typedef char tar_link;
+
+#define LINKS() \
+ link_('\0',OLDNORMAL_FILE) \
+ link_('0',NORMAL_FILE) \
+ link_('1',HARD_LINK) \
+ link_('2',SYMBOLIC_LINK) \
+ link_('3',CHARACTER_SPECIAL) \
+ link_('4',BLOCK_SPECIAL) \
+ link_('5',DIRECTORY) \
+ link_('6',FIFO) \
+ link_('7',CONTIGUOUS_FILE) \
+ link_('A',SOLARIS_ACL) \
+ link_('D',GNU_DUMPDIR) \
+ link_('E',SOLARIS_ACL_FILE) \
+ link_('I',INODE_METADATA) \
+ link_('K',NEXT_LONG_LINK) \
+ link_('L',NEXT_LONG_NAME) \
+ link_('M',MULTI_VOLUME) \
+ link_('N',GNU1989_LONG_NAMES) \
+ link_('S',SPARSE) \
+ link_('V',VOLUME_NAME) \
+ link_('X',SUN_XHDR) \
+ link_('g',PAX_GLOBAL_XHDR) \
+ link_('x',PAX_XHDR)
+
+#define link_(v,n) PASTE_2(LINK_,n) = v,
+
+enum e_tar_link
+{
+ LINKS()
+ LINK_TYPE_COUNT
+};
+#undef link_
+
+#define link_(v,n) {STRINGIFY(n), v},
+struct nv_pair
+{
+ const char * name;
+ tar_link link;
+};
+static const char * get_link_string(tar_link l)
+{
+ static const struct nv_pair pairs[] =
+ {
+ LINKS()
+ {NULL, 0}
+ };
+ unsigned int ix;
+
+ for (ix = 0; ix < LINK_TYPE_COUNT; ++ix)
+ if (pairs[ix].link == l)
+ return pairs[ix].name;
+ return "UNDEFINED";
+}
+#undef link_
+#undef LINKS
+
+
+/* --------------------
+ * The tar magic string is 6 bytes long.
+ */
+#define TAR_MAGIC_LEN (6)
+typedef char tar_magic [TAR_MAGIC_LEN];
+#define POSIX_MAGIC_CONST "ustar" /* includes terminating NUL */
+
+/* --------------------
+ * The tar version string is two bytes long and uses both bytes
+ */
+#define TAR_VERSION_LEN (2)
+typedef char tar_version [TAR_VERSION_LEN];
+#define POSIX_VERSION_CONST "00" /* does not include terminating NUL */
+
+/* --------------------
+ * The Posix strong user/group name is 32 bytes long
+ */
+#define TAR_STRNAME_LEN (32)
+typedef char tar_strname [TAR_STRNAME_LEN];
+
+/* --------------------
+ * The dev? strings are 8 bytes long
+ */
+#define TAR_DEV_LEN (8)
+typedef char tar_dev [TAR_DEV_LEN];
+
+/* --------------------
+ * Posix prefix is 155 bytes that can be put before the name to give a path of
+ * 255 bytes instad of the smaller limit of 99.
+ */
+#define TAR_PREFIX_LEN (155)
+typedef char tar_prefix [TAR_PREFIX_LEN];
+
+/*
+ * Sun extensions
+ */
+
+/* --------------------
+ */
+typedef char sun_extnum;
+#define SUN_FULLSIZE_LEN (10)
+typedef char sun_fullsize [SUN_FULLSIZE_LEN];
+
+/* --------------------
+ * star extensions
+ *
+ * star85 is old star from 1985
+ */
+typedef char star85_version;
+#define STAR85_FILETYPE_LEN (8)
+typedef char star85_filetype [STAR85_FILETYPE_LEN];
+#define STAR85_TYPE_LEN (12)
+typedef char star85_type [STAR85_TYPE_LEN];
+#define STAR85_RDEV_LEN (12)
+typedef char star85_rdev [STAR85_RDEV_LEN];
+/* ignoring the 11 byte rdev with minor bits */
+#define STAR85_UNAME_LEN (16)
+typedef char star85_uname [STAR85_UNAME_LEN];
+#define STAR85_GNAME_LEN (15)
+typedef char star85_gname [STAR85_GNAME_LEN];
+#define STAR_XMAGIC_LEN (4)
+typedef char star_magic [STAR_XMAGIC_LEN];
+#define STAR_MAGIC_CONST ("tar")
+#define NSTAR_PREFIX_LEN (1)
+typedef char nstar_prefix [NSTAR_PREFIX_LEN];
+
+/* --------------------
+ * gnu extensions
+ */
+#define GNU89_MAGIC_LEN (8)
+typedef char gnu89_magic [GNU89_MAGIC_LEN];
+#define GNU_89_MAGIC_CONST "ustar " /* includes terminating NUL */
+#define GNU_89_GNUMAGIC_CONST "GNUtar " /* includes terminating NUL */
+#define GNU89_LONGNAMES_LEN (4)
+typedef char gnu89_longnames [GNU89_LONGNAMES_LEN];
+
+
+/* --------------------
+ * shared between the feuding star and gnu tar
+ */
+typedef char tar_isextended ;
+typedef struct tar_sparse
+{
+ tar_size offset;
+ tar_size num_bytes;
+} tar_sparse;
+#define GNU_SPARSES_IN_EXTRA_HEADER (16)
+#define GNU_SPARSES_IN_OLD_HEADER (4)
+#define GNU_SPARSES_IN_SPARSE_HEADER (21)
+#define STAR_SPARSES_IN_HEADER (4)
+#define STAR_SPARSES_IN_EXT_HEADER (21)
+
+
+/* ----------------------------------------
+ * The various tar header formats
+ *
+ * Note that in all the tar, posix and pax formats the first 257 bytes are
+ * the same. In all posix ad almost compliant formats the first
+ * 345 bytes are the same (except GNU 89). It is abuse of the 155
+ * bytes of the prefix that make star and gnu truly not posix compliant
+ * Sun used the 12 bytes after the prefix so is still psox compliant.
+ */
+typedef struct tar_v7_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ /* end of header // 257 */
+} tar_v7_header;
+
+typedef struct tar_posix_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ tar_magic magic; /* 257 */
+ tar_version version; /* 263 */
+ tar_strname uname; /* 265 */
+ tar_strname gname; /* 297 */
+ tar_dev devmajor; /* 329 */
+ tar_dev devminor; /* 337 */
+ tar_prefix prefix; /* 345 */
+ /* end of header // 500 */
+} tar_posix_header, tar_pax_header;
+
+typedef struct tar_sun_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ tar_magic magic; /* 257 */
+ tar_version version; /* 263 */
+ tar_strname uname; /* 265 */
+ tar_strname gname; /* 297 */
+ tar_dev devmajor; /* 329 */
+ tar_dev devminor; /* 337 */
+ tar_prefix prefix; /* 345 */
+ sun_extnum extnum; /* 500 non-conformant */
+ sun_extnum extcount; /* 501 non-conformant */
+ sun_fullsize fullsize; /* 502 non-conformant */
+ /* end of header // 512 non-conformant */
+} tar_sun_header;
+
+typedef struct tar_star_85_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ star85_version starversion; /* 257 non-conformant */
+ star85_filetype starfiletype; /* 258 internal type of file? non-conformant */
+ star85_type startype; /* 266 type of file (UNIX)? non-conformant */
+ star85_rdev rdev; /* 278 non-conformant */
+ tar_time atime; /* 290 non-conformant */
+ tar_time ctime; /* 302 non-conformant */
+ star85_uname uname; /* 314 non-conformant */
+ star85_gname gname; /* 330 non-conformant */
+ tar_prefix prefix; /* 345 non-conformant */
+ char ___fill0[8]; /* 500 non-conformant */
+ star_magic xmagic; /* 508 non-conformant */
+ /* end of header // 512 non-conformant */
+} tar_star_85_header;
+typedef struct tar_star_94_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ tar_magic magic; /* 257 */
+ tar_version version; /* 263 */
+ tar_strname uname; /* 265 */
+ tar_strname gname; /* 297 */
+ tar_dev devmajor; /* 329 */
+ tar_dev devminor; /* 337 */
+ nstar_prefix prefix; /* 345 */
+ char ___fill0; /* 346 */
+ char ___fill1[8]; /* 347 */
+ tar_isextended isextended; /* 355 non-conformant */
+ tar_sparse sparse[STAR_SPARSES_IN_HEADER]; /* 356 non-conformant */
+ tar_size realsize; /* 452 non-conformant */
+ tar_size offset; /* 464 non-conformant */
+ tar_time atime; /* 476 non-conformant */
+ tar_time ctime; /* 488 non-conformant */
+ char ___fill2[8]; /* 500 */
+ star_magic xmagic; /* 508 non-conformant */
+ /* end of header // 512 */
+} tar_star_94_header;
+
+typedef struct tar_gnu_89_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ gnu89_magic magic; /* 257 non-conformant */
+ tar_strname uname; /* 265 */
+ tar_strname gname; /* 297 */
+ tar_dev devmajor; /* 329 */
+ tar_dev devminor; /* 337 */
+ tar_time atime; /* 345 non-conformant */
+ tar_time ctime; /* 357 non-conformant */
+ tar_size offset; /* 369 non-conformant */
+ gnu89_longnames longnames; /* 381 non-conformant */
+ char ___fill0[1]; /* 385 */
+ tar_sparse sparse [GNU_SPARSES_IN_OLD_HEADER];/* 386 optional sparse */
+ tar_isextended isextended; /* 482 non-conformant */
+ tar_size realsize; /* 483 non-conformant */
+ /* end of header // 495 */
+} tar_gnu_89_header;
+
+typedef struct tar_gnu_99_header
+{
+ /* type member name and offset */
+ tar_file_name name; /* 0 */
+ tar_file_mode mode; /* 100 */
+ tar_id uid; /* 108 */
+ tar_id gid; /* 116 */
+ tar_size size; /* 124 */
+ tar_time mtime; /* 136 */
+ tar_csum csum; /* 148 */
+ tar_link link; /* 156 */
+ tar_file_name linkname; /* 157 */
+ gnu89_magic magic; /* 257 non-conformant */
+ tar_strname uname; /* 265 */
+ tar_strname gname; /* 297 */
+ tar_dev devmajor; /* 329 */
+ tar_dev devminor; /* 337 */
+ tar_time atime; /* 345 non-conformant */
+ tar_time ctime; /* 357 non-conformant */
+ tar_size offset; /* 369 non-conformant */
+ gnu89_longnames longnames; /* 381 non-conformant */
+ char ___fill0[1]; /* 385 */
+ tar_sparse sparse [GNU_SPARSES_IN_OLD_HEADER];/* 386 non-conformant optional sparse */
+ tar_isextended isextended; /* 482 non-conformant */
+ tar_size realsize; /* 483 non-conformant */
+ /* end of header // 495 */
+} tar_gnu_99_header;
+
+typedef struct tar_sparse_header
+{
+ /* type member name and offset */
+ tar_sparse sparse [STAR_SPARSES_IN_EXT_HEADER];/* 0 */
+ tar_isextended isextended; /* 504 */
+} tar_sparse_header; /* 505 end of header */
+
+typedef struct tar_cpio_header
+{
+ /* type member name and offset */
+ char magic [6]; /* 0 must be "070707" */
+#define TAR_CPIO_MAGIC_CONST ("070707")
+ char dev [6]; /* 6 (dev,ino) is unique for each file in archive */
+ char ino [6]; /* 12 see dev */
+ char mode [6]; /* 18 */
+ char uid [6]; /* 24 */
+ char gif [6]; /* 30 */
+ char nlink [6]; /* 36 */
+ char rdev [6]; /* 42 */
+ char mtime [11]; /* 48 */
+ char namesize [6]; /* 59 */
+ char filesize [6]; /* 65 */
+ char buff [1]; /* 71 name and file data */
+} tar_cpio_header;
+
+typedef union tar_header
+{
+ /* ----------
+ * The TAR header is to be zero filled by definition but some tar
+ * programs use ' ' instead.
+ *
+ * accept zeros ('0'), spaces (' ') or NULs (0x00) as equivalent where reasonable
+ *
+ * This name refers to the entire header as a single undifferentiated
+ * sequence of bytes.
+ */
+ tar_raw_block raw; /* tar block as an array of bytes: used for 0 blocks here */
+ tar_cpio_header cpio; /* cpio not really tar */
+ tar_v7_header tar; /* classic header back to the beginnings of memory */
+ tar_posix_header posix; /* ustar or Posix 1003.1 header */
+ tar_sun_header suntar; /* Sun Microsystems tar header */
+ tar_star_85_header star_85; /* star header from 1985 (pre-Posix) */
+ tar_star_94_header star_94; /* star header from 1994 (post-Posix) */
+ tar_gnu_89_header gnu_89; /* gnu header from circa 1989 (post-posix but broken) */
+ tar_gnu_99_header gnu_99; /* gnu header from ???? */
+ tar_sparse_header sparse; /* star / gnu extended sparses header */
+} tar_header;
+
+
+/* ======================================================================
+ * local module-wide function like macros
+ */
+/* -----
+ * offset of is the count of bytes between the base of a structure and
+ * a particular member of that structure
+ */
+#define OFFSET_OF(structure,member) ((size_t)((&(((structure*)0)->member))-(0)))
+
+
+/* ======================================================================
+ * compilation unit local functions
+ */
+
+/* ======================================================================
+ * return the RFC 2045 base 64 value for a byte character
+ * -1 for any out of range
+ *
+ * base 64 uses A-Z as 0-25, a-z as 26-51, 0-9 as 52-61, + as 62 and / as 63
+ */
+static int64_t decode_base64char (uint8_t byte)
+{
+ /*
+ * trade off of space for table versus time to upsize the return
+ * and reupsize where it is used
+ */
+ static const int8_t table[] =
+ {
+ /*
+ * 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+ */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 00 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 10 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, /* 20 */
+ 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, /* 30 */
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, /* 40 */
+ 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, /* 50 */
+ -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, /* 60 */
+ 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, /* 70 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 90 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* A0 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* B0 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* C0 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* D0 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* E0 */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 /* F0 */
+ };
+ return table[byte];
+}
+
+
+/* ======================================================================
+ * return the RFC 2045 base 64 value of a string at <str> of length <len>
+ *
+ * Interpreted the specification to mean that you simply ignore any out
+ * of range characters. They are not treated as bytes of 0 as that would
+ * mean a shift of earlier bytes.
+ *
+ * Each character is 6 bits of the final value.
+ */
+static int64_t decode_base64string (const uint8_t* str, size_t len)
+{
+ int64_t result = 0;
+ int64_t temp = 0;
+ size_t ix;
+
+ for (ix = 0; ix < len; ++ix)
+ {
+ if ((temp = decode_base64char(str[ix])) >= 0)
+ {
+ result <<= 6; /* result *= 64 */
+ result += temp;
+ }
+ }
+ return result;
+}
+
+
+/* ======================================================================
+ * tar_strtoll
+ *
+ * This function will convert a string in a tar header into a 64 signed
+ * integer.
+ *
+ * The original tar header used just octal numbers in ascii in fixed length
+ * fields. As normal in the computer software world these "obviously plenty
+ * big" fields became way too small.
+ *
+ * GNU tar invented two approaches to make these numeric fields "bigger" but
+ * only prolonged the pain by squeezing the new numbers into the same fields.
+ *
+ * In the tar v7 and ustar based tar headers the fields are:
+ * Name Size Octal Range Interpretation
+ * mode 8 0-2097151 bit flags
+ * uid 8 0-2097151
+ * gid 8 0-2097151
+ * size 12 0-8589934591 up to 8 Giga-Byte files
+ * mtime 12 0-8589934591 1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ *
+ * atime 12 0-8589934591 1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ * ctime 12 0-8589934591 1970/01/01 00:00:00 GMT-2242/03/16 12:56:31 GMT
+ *
+ * GNU's first and already obsolete approach was to put Mime base-64 numbers
+ * With these the first byte is '+' or '-' to signal it isn't octal ASCII.
+ *
+ * GNU's second approach is base-256 which is a big endian binary string of lengths other
+ * than the 1, 2, 4 or 8 bytes of the standard integer types. In this approach the first
+ * byte is either 0x80 for a positive number or 0xFF for a negative number.
+ */
+
+static int64_t tar_strtoll (const uint8_t * str, size_t len)
+{
+ int64_t result = 0;
+ bool negative = false;
+ uint8_t temp_buff[24]; /* long enough to hold all octal bytes for 64 bit numbers */
+
+ /* -----
+ * force a NUL in case the source doesn't have one; this is for
+ * strtoll() on ASCII Octal
+ */
+ if ( len >= sizeof temp_buff )
+ len = sizeof temp_buff - 1;
+ memmove (temp_buff, str, len);
+ temp_buff[ len ] = 0x00;
+
+ /* -----
+ * Most are going to be simple ASCII octal using '0'-'7' with NUL terminator
+ * leading 0 is not required but of course is accepted to match tar
+ * header specifications
+ */
+ if (((temp_buff[0] >= '0')&&(temp_buff[0] <= '7'))||(temp_buff[0] == ' '))
+ {
+ /* use stdlib strtoll - longest expected goes a few bits into the upper longword */
+ result = strtoi64((char*)temp_buff,NULL,8);
+ }
+ /* -----
+ * "base-256" well that is "binary" big endian of some length
+ *
+ * For fields longer than eight bytes upper bytes will shift out of
+ * significance into the bit bucket.
+ */
+ else if ((temp_buff[0] == 0x80)||(temp_buff[0] == 0xFF)) /* from GNU tar */
+ {
+ unsigned int ix;
+ negative = (bool)((temp_buff[0] == 0xFF) ? true : false);
+ result = temp_buff[0] & 0x7F; /* toss first flag bit */
+ for (ix = 1; ix < len; ++ix)
+ {
+ result <<= 8; /* result *= 256; */
+ result += temp_buff[ix];
+ }
+ if (negative)
+ result = -result;
+ }
+ /* -----
+ * "base-64" an already dumped idea from GNU tar
+ */
+ else if ((temp_buff[0] == '+')||(temp_buff[0] == '-')) /* from GNU tar */
+ {
+ int64_t temp;
+ negative = (bool)((temp_buff[0] == '-') ? true : false);
+ temp = decode_base64string(temp_buff+1,len-1);
+ /* potential overflow */
+ result = negative ? -temp : temp;
+ }
+
+ /* -----
+ * look for an empty field of all NUL
+ */
+ else if (temp_buff[0] == 0x00)
+ {
+ unsigned int ix;
+ for (ix = 1; ix < len; ++ix)
+ {
+ if (temp_buff[ix] != 0x00)
+ goto fail;
+ }
+ }
+ /* -----
+ * no idea what it is then
+ */
+ else
+ {
+ fail:
+ result = 0; /* as good a guess as any */
+ PLOGMSG (klogErr, (klogErr, "unknown integer storage type $(B0)$(B1)$(B2)$(B3)$(B4)$(B5)$(B6)$(B7)",
+ "B0=%c,B1=%c,B2=%c,B3=%c,B4=%c,B5=%c,B6=%c,B7=%c",
+ temp_buff[0],temp_buff[1],temp_buff[2],temp_buff[3],
+ temp_buff[4],temp_buff[5],temp_buff[6],temp_buff[7]));
+ }
+ return result;
+}
+
+
+
+/* ======================================================================
+ * tar_header_type
+ * determine most probable tar header block type
+ */
+static tar_header_type what_header_type(const tar_header* header)
+{
+ /* -----
+ * we'll assume its bad until we find a better guess
+ */
+ tar_header_type type = TAR_UNDEFINED;
+
+ /* -----
+ * look for a cpio header though we aren't expecting to support it quite yet
+ */
+ if (strncmp(header->cpio.magic, TAR_CPIO_MAGIC_CONST, sizeof(header->cpio.magic)) == 0)
+ {
+ type = TAR_CPIO;
+ }
+ /* -----
+ * look for extended headers of some type
+ *
+ * look for posix based extensions as hopefully most likely
+ */
+ else if (strcmp(header->posix.magic, POSIX_MAGIC_CONST) == 0)
+ {
+ /* -----
+ * we have a post posix standard tar header but we aren't done yet
+ *
+ * First we look for star extensions to the header
+ */
+ if (strcmp(header->star_94.xmagic, STAR_MAGIC_CONST) == 0)
+ {
+
+ /* -----
+ * we have either an old or new star archive
+ */
+ if (strcmp(header->star_94.magic, POSIX_MAGIC_CONST) == 0)
+ {
+ /* -----
+ * we have a new star type archive
+ */
+ type = TAR_STAR_94;
+ }
+ else
+ {
+ /* -----
+ * we have a old star type archive
+ */
+ type = TAR_STAR_85;
+ }
+ }
+ /* -----
+ * Next we look for SunOS5 extensions to the header
+ */
+ else if (header->suntar.extnum &&
+ header->suntar.extcount &&
+ header->suntar.fullsize)
+ {
+ type = TAR_SUN;
+ }
+ /* -----
+ * Else it seems to be the generic Posix tar header
+ */
+ else
+ {
+ type = TAR_POSIX;
+ }
+ }
+ /* -----
+ * Not a proper magic for a POSIX ustar header so look for the improper magic of GNU's tar
+ */
+ else if (strcmp(header->star_94.magic, GNU_89_MAGIC_CONST) == 0)
+ {
+ /* we have an old GNU not really posix compliant archive type */
+ type = TAR_GNU_89;
+ }
+ /* -----
+ * If there is anything else there we don't know what to do with it
+ */
+ else if (header->posix.magic[0] != 0)
+ {
+ /* -----
+ * Log an anomaly showing what we found in the magic field
+ */
+ char temp_str [9];
+ memset(temp_str,0,sizeof(temp_str));
+ strncpy(temp_str,header->posix.magic,8);
+ type = TAR_UNDEFINED;
+ }
+ /* -----
+ * not knowing what we have lets see if it is a block of all zeroes
+ * knowing we can ignore it
+ */
+ else
+ {
+ /* -----
+ * If this were a legitimate V7 (well just old style)
+ * tar header the first character would be non-NUL
+ * and the link would be on eof the old types
+ */
+ if ((header->raw[0]>= ' ')&&(header->raw[0] <= '~'))
+ {
+ switch (header->tar.link)
+ {
+ case LINK_OLDNORMAL_FILE:
+ case LINK_NORMAL_FILE:
+ case LINK_HARD_LINK:
+ case LINK_SYMBOLIC_LINK:
+ case LINK_CHARACTER_SPECIAL:
+ case LINK_BLOCK_SPECIAL:
+ case LINK_DIRECTORY:
+ case LINK_FIFO:
+ case LINK_CONTIGUOUS_FILE:
+ /* GNU TAR will do this to us */
+ case LINK_NEXT_LONG_LINK:
+ case LINK_NEXT_LONG_NAME:
+ case LINK_GNU1989_LONG_NAMES:
+ type = TAR_V7;
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ /* -----
+ * look for anything not zero
+ */
+ unsigned int ix;
+
+ for (ix = 0; ix < sizeof(tar_header); ++ix)
+ {
+ if (header->raw[ix])
+ {
+ /* -----
+ * non-zero so quit looking
+ */
+ break;
+ }
+ }
+ /* -----
+ * if we got to the end we know they are all zero so say so
+ */
+ if (ix == sizeof(tar_header))
+ {
+ type = TAR_ZERO_BLOCK;
+ }
+ }
+ }
+ return type;
+}
+
+
+/* ======================================================================
+ */
+
+static rc_t sparse_data_make (sparse_data ** new_item, uint64_t offset, uint64_t size)
+{
+ sparse_data * p;
+
+ p = malloc (sizeof (sparse_data));
+ if (p != NULL)
+ {
+ p->offset = offset;
+ p->size = size;
+ p->next = NULL;
+ *new_item = p;
+ return 0;
+ }
+ else
+ return -1;
+}
+
+static rc_t sparse_data_push(sparse_data ** q, uint64_t offset, uint64_t size)
+{
+ if (q == NULL)
+ {
+ return -1;
+ }
+ else if (*q == NULL)
+ {
+ return sparse_data_make (q, offset, size);
+ }
+ else
+ {
+ return sparse_data_push (&((*q)->next), offset, size);
+ }
+}
+
+static rc_t sparse_data_pop (sparse_data ** q, sparse_data **item)
+{
+ if ((q == NULL) || (item == NULL))
+ {
+ return -1;
+ }
+ else
+ {
+ *item = *q;
+ *q = (*item)->next;
+ (*item)->next = NULL;
+ return 0;
+ }
+}
+
+static rc_t sparse_data_kill (sparse_data ** q)
+{
+ if (q == NULL)
+ {
+ return -1;
+ }
+ if (*q == NULL)
+ {
+ return 0;
+ }
+ if ((*q)->next != NULL)
+ {
+ return sparse_data_kill(&(*q)->next);
+ }
+ free (*q);
+ *q = NULL;
+ return 0;
+}
+
+/* ======================================================================
+ * local module-wide variables (reduction in parameter pushing)
+ *
+ * Module shared variables; kinda like C++ class elements
+ */
+
+static rc_t make_chunk_list(CCTar * self, uint64_t file_offset)
+{
+ uint64_t count = self->num_chunks;
+ uint64_t source_position = file_offset;
+ uint64_t ix;
+ sparse_data * psd;
+ rc_t rc;
+
+ if (self->chunks)
+ free (self->chunks); /* shouldn't happen */
+ self->chunks = malloc( (size_t)( count * sizeof(KTocChunk) ) );
+ if (self->chunks == NULL)
+ return -1;
+
+
+ for (ix = 0; ix < count; ++ix)
+ {
+ rc = sparse_data_pop (&self->sparse_q, &psd);
+ if (rc != 0)
+ return rc;
+ self->chunks[ix].logical_position = psd->offset;
+ self->chunks[ix].source_position = source_position;
+ self->chunks[ix].size = psd->size;
+ source_position += psd->size;
+ sparse_data_kill(&psd);
+ }
+ return 0;
+}
+
+static void whack_chunk_list(CCTar * self)
+{
+ free (self->chunks);
+ self->chunks = NULL;
+ self->num_chunks = 0;
+}
+
+#if HANDLING_EXTENDED_HEADERS
+/* ======================================================================
+ * mini class for handling pax/posix/ustar
+ * extended headers and global extended headers
+ *
+ * Many of the values are included to get past range limits imposed by the ustar format
+ * particular for string length and charcter set or shortish integral values. <ekyword>
+ * and <value> below are UTF-8.
+ *
+ * values in the header are string values written as with a 'printf' using the form
+ * printf("%d %s=%s\n",<length>,<keyword>,<value>)
+ *
+ * <length> is described ambiguously as
+ * "The <length> field shall be the decimal length of the extended header record in octets,
+ * including the trailing <newline>."
+ * So does that include the length of <length>? or not?
+ *
+ * The field <keyword> is allowed in a pax Extended Header include but are not limited to
+ * atime time_t but with fractional seconds maybe
+ * charset enumeration list
+ * comment human readable comments
+ * gid integer gid allowing numbers greater than ustar limit of 2097151 (07777777)
+ * gname over rides xhdr gid and ustar gname and gid
+ * linkpath
+ * mtime time_t but with franctional seconds maybe
+ * path
+ * realtime.<ANY>
+ * security.<ANY>
+ * size
+ * uid integer uid allowing numbers greater than ustar limit of 2097151 (07777777)
+ * uname
+ * Any other keywords desired can be included but might not be meaningful to many applications.
+ * Keyword can have pretty much any character in it except '='.
+ *
+ * <value> is a UTF-8 string that ends with the '\n'.
+ *
+ *
+ * charset is limited to (omit the quotation marks)
+ * <value> Formal Standard
+ * "ISO-IR 646 1990" ISO/IEC 646:1990
+ * "ISO-IR 8859 1 1998" ISO/IEC 8859-1:1998
+ * "ISO-IR 8859 2 1999" ISO/IEC 8859-2:1999
+ * "ISO-IR 8859 3 1999" ISO/IEC 8859-3:1999
+ * "ISO-IR 8859 4 1998" ISO/IEC 8859-4:1998
+ * "ISO-IR 8859 5 1999" ISO/IEC 8859-5:1999
+ * "ISO-IR 8859 6 1999" ISO/IEC 8859-6:1999
+ * "ISO-IR 8859 7 1987" ISO/IEC 8859-7:1987
+ * "ISO-IR 8859 8 1999" ISO/IEC 8859-8:1999
+ * "ISO-IR 8859 9 1999" ISO/IEC 8859-9:1999
+ * "ISO-IR 8859 10 1998" ISO/IEC 8859-10:1998
+ * "ISO-IR 8859 13 1998" ISO/IEC 8859-13:1998
+ * "ISO-IR 8859 14 1998" ISO/IEC 8859-14:1998
+ * "ISO-IR 8859 15 1999" ISO/IEC 8859-15:1999
+ * "ISO-IR 10646 2000" ISO/IEC 10646:2000
+ * "ISO-IR 10646 2000 UTF-8" ISO/IEC 10646, UTF-8 encoding
+ * "BINARY" None.
+ */
+typedef enum pax_charset
+{
+ PAX_CS_NOT_SPECIFIED,
+ PAX_CS_ISO_IR_646_1990,
+ PAX_CS_ISO_IR_8859_1_1998,
+ PAX_CS_ISO_IR_8859_2_1999,
+ PAX_CS_ISO_IR_8859_3_1999,
+ PAX_CS_ISO_IR_8859_4_1998,
+ PAX_CS_ISO_IR_8859_5_1999,
+ PAX_CS_ISO_IR_8859_6_1999,
+ PAX_CS_PAX_CS_ISO_IR_8859_7_1997,
+ PAX_CS_ISO_IR_8859_8_1999,
+ PAX_CS_ISO_IR_8859_9_1999,
+ PAX_CS_ISO_IR_8859_10_1998,
+ PAX_CS_ISO_IR_8859_13_1998,
+ PAX_CS_ISO_IR_8859_14_1998,
+ PAX_CS_ISO_IR_8859_15_1998,
+ PAX_CS_ISO_IR_1064_2000,
+ PAX_CS_ISO_IR_1064_2000_UTF_8,
+ PAX_CS_BINARY
+} pax_charset;
+
+static const char * pax_charset_strings[] =
+{
+ "Not Specified",
+ "ISO-IR 646 1990",
+ "ISO-IR 8859 1 1998",
+ "ISO-IR 8859 2 1999",
+ "ISO-IR 8859 3 1999",
+ "ISO-IR 8859 4 1998",
+ "ISO-IR 8859 5 1999",
+ "ISO-IR 8859 6 1999",
+ "ISO-IR 8859 7 1987",
+ "ISO-IR 8859 8 1999",
+ "ISO-IR 8859 9 1999",
+ "ISO-IR 8859 10 1998",
+ "ISO-IR 8859 13 1998",
+ "ISO-IR 8859 14 1998",
+ "ISO-IR 8859 15 1999",
+ "ISO-IR 10646 2000",
+ "ISO-IR 10646 2000 UTF-8",
+ "BINARY",
+ NULL
+};
+
+static pax_charset pax_xhdr_parse_charset_string(char*string)
+{
+ int ix; /* index */
+ const char * ps; /* pointer to string */
+
+ for (ps = pax_charset_strings[ix= 0]; ps; ps = pax_charset_strings[++ix])
+ if (strcmp(ps,string) == 0)
+ return ix;
+ return PAX_CS_NOT_SPECIFIED; /* matched none so set it to not specified */
+}
+
+typedef struct pax_xheader pax_xheader;
+struct pax_xheader
+{
+ char * path; /* supercedes .posix.name */
+ char * linkpath; /* supercedes .posix.linkname */
+ char * uname; /* user name supercedes .posix.uname uid and .posix.uid */
+ char * gname; /* group name supercedes .posix.gname gid and .posix.gid */
+ time_t atime; /* supercedes .posix.atime */
+ time_t mtime; /* supercedes .posix.mtime */
+ uid_t uid; /* supercedes .posix.uid */
+ gid_t gid; /* supercedes .posix.gname */
+ off_t size; /* supercedes .posix.size */
+ pax_charset charset; /* not supported by us? */
+};
+
+static pax_xheader * pax_xhdr_create (void)
+{
+ pax_xheader * pxv = malloc (sizeof(pax_xheader));
+ memset (pxv,0,sizeof(pax_xheader));
+ return pxv;
+}
+
+static void pax_xhdr_delete(pax_xheader * self)
+{
+ if (self->path)
+ free (self->path);
+ if (self->linkpath)
+ free (self->linkpath);
+ if (self->uname)
+ free (self->uname);
+ if (self->gname)
+ free (self->gname);
+ free (self);
+}
+
+static rc_t pax_xhdr_set_general_string (char ** str, const char * val)
+{
+ size_t len; /* how much memory */
+ char * nl; /* point to any new line in source */
+ rc_t rc = 0; /* return code; assume success */
+
+ if (*str) /* if already set, free the old value */
+ free (*str);
+ nl = strchr (val, '\n');
+ if (nl)
+ {
+ len = nl - val + 1; /* +1 for NUL */
+ }
+ else
+ {
+ len = strlen (val) + 1;
+ }
+ *str = malloc (len);
+ if (*str)
+ {
+ strncpy (*str, val, len-1);
+ (*str)[len-1] = '\0'; /* if it was a '\n' terminated value this is needed not worth the check if needed */
+ }
+ else
+ {
+ rc = RC(rcFS/*?*/,rcAllocating,0/*?*/,rcNoObj/*?*/,rcNull); /* well its not 0 */
+ }
+ return rc;
+}
+
+/* ----------
+ * new_path points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_path(pax_xheader * self, char * new_path)
+{
+ return pax_xhdr_set_general_string(&(self->path),new_path);
+}
+
+/* ----------
+ * new_path points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_linkpath(pax_xheader * self, char * new_path)
+{
+ return pax_xhdr_set_general_string(&(self->linkpath),new_path);
+}
+
+/* ----------
+ * new_name points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_uname(pax_xheader * self, char * new_name)
+{
+ return pax_xhdr_set_general_string(&(self->uname),new_name);
+}
+
+/* ----------
+ * new_name points to a string that ends with either a '\n' or a NUL
+ */
+LIB_EXPORT rc_t CC pax_xhdr_set_gname(pax_xheader * self, char * new_name)
+{
+ return pax_xhdr_set_general_string(&(self->gname),new_name);
+}
+
+LIB_EXPORT bool CC pax_xhdr_get_general_string (char**src, char**dst, size_t max)
+{
+ if (strlen(*src) > max-1) /* fail if too big for target */
+ {
+ return false;
+ }
+ strcpy(*dst,*src);
+ return true;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_path(pax_xheader * self, char ** path, size_t max)
+{
+ return (pax_xhdr_get_general_string(&self->path,path,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_linkpath(pax_xheader * self, char ** path, size_t max)
+{
+ return (pax_xhdr_get_general_string(&self->linkpath,path,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_uname(pax_xheader * self, char ** name, size_t max)
+{
+ return (pax_xhdr_get_general_string(&self->uname,name,max))? 0 : ~0;
+}
+
+LIB_EXPORT rc_t CC pax_xhdr_get_gname(pax_xheader * self, char ** name, size_t max)
+{
+ return (pax_xhdr_get_general_string(&self->gname,name,max))? 0 : ~0;
+}
+
+/* ----------
+ * The mtime and atime <value> is defined as
+ * The pax utility shall write an mtime record for each file in write
+ * or copy modes if the file's modification time cannot be represented
+ * exactly in the ustar header logical record described in ustar
+ * Interchange Format. This can occur if the time is out of ustar range,
+ * or if the file system of the underlying implementation supports
+ * non-integer time granularities and the time is not an integer. All of
+ * these time records shall be formatted as a decimal representation of
+ * the time in seconds since the Epoch. If a period ( '.' ) decimal
+ * point character is present, the digits to the right of the point shall
+ * represent the units of a subsecond timing granularity, where the first
+ * digit is tenths of a second and each subsequent digit is a tenth of
+ * the previous digit. In read or copy mode, the pax utility shall
+ * truncate the time of a file to the greatest value that is not greater
+ * than the input header file time. In write or copy mode, the pax
+ * utility shall output a time exactly if it can be represented exactly
+ * as a decimal number, and otherwise shall generate only enough digits
+ * so that the same time shall be recovered if the file is extracted on a
+ * system whose underlying implementation supports the same time
+ * granularity.
+ *
+ * So...
+ * Looks like for our purposes we ignore anything after a possible decimal
+ * point and just use the integer part of whatever is there and just not be
+ * to worried about it since we aren't creating any of this, just reading ie.
+ */
+static rc_t pax_xhdr_set_general_time (const char * ts, time_t * tt)
+{
+ uint64_t temp = strtou64(ts,NULL,10); /* tosses decimal part for us */
+
+ if (temp)
+ *tt = (time_t)temp;
+ return temp ? 0 : ~0;
+}
+
+/* ======================================================================
+ * This is the data accumulated for each entry in a tar file.
+ */
+static struct tar_entry_data
+{
+ /* -----
+ * We are not using linux (or other O/S specific) type here because the ranges
+ * for the system creating the archive might have larger types than the system
+ * we are running on. We'll leave it to the outside caller of this program to
+ * "make it fit".
+ */
+
+
+ entry_type type;
+
+ char * path;
+ char * link;
+
+ uint64_t size;
+ uint64_t offset;
+
+ mode_t mode;
+
+ char * uname;
+ uid_t uid;
+
+ char * gname;
+ gid_t gid;
+
+ time_t mtime;
+ time_t atime;
+ time_t ctime;
+
+} tar_entry_data;
+#endif
+
+/* ======================================================================
+ *
+ * offset is the byte position within the tar file
+ * hard_limit is the byte position with in the tar file that is not mapped
+ *
+ * This is the ugliest function/method in the whole module. The extensions
+ * to the tar header are not done in a consistent manner so convolutions
+ * have to be made to support all manner of extensions.
+ */
+static rc_t process_one_entry (CCTar * self)
+{
+ rc_t rc;
+ char full_path [4096];
+ char full_link [4096];
+ /* uint64_t data_offset; */
+ uint64_t data_position;
+ uint64_t data_size;
+ int64_t virtual_data_size;
+ tar_header_type type;
+ tar_link link;
+ time_t mtime;
+ /* mode_t mode; */
+ uint64_t current_position;
+ union
+ {
+ const uint8_t * b;
+ const tar_header * h;
+ } current_header;
+ bool done;
+ bool gnu_sparse;
+/* bool found_zero_block; */
+
+ DEBUG_ENTRY();
+
+ rc = 0;
+ /* data_offset = */ data_position = virtual_data_size = data_size = 0;
+ type = TAR_UNDEFINED;
+ link = LINK_OLDNORMAL_FILE;
+ mtime = 0;
+ /* mode = 0; */
+ current_position = self->position;
+ done = false;
+ gnu_sparse = false;
+/* found_zero_block = false; */
+
+ /* -----
+ * clear the full name and link name entries
+ */
+ memset(full_path,0,sizeof(full_path));
+ memset(full_link,0,sizeof(full_link));
+
+ /* -----
+ * set the header at the current TAR block.
+ * That is the map starts at position buffer_start and we are at
+ * current_position into the file so we take the map as a pointer
+ * and add to it the difference between our current position and the map's
+ * initial position (first header is at map + 0 - 0)
+ */
+ current_header.b = self->buffer;
+
+ /* -----
+ * start processing
+ */
+ do
+ {
+ /* -----
+ * what we will do depends upon the type of this block
+ */
+ type = gnu_sparse ? TAR_SPARSE : what_header_type(current_header.h);
+ if (self->found_zero_block)
+ {
+ if (self->found_second_zero_block == true)
+ {
+ type = TAR_ZERO_BLOCK; /* skip anyway */
+ }
+ else if (type == TAR_ZERO_BLOCK)
+ {
+ self->found_second_zero_block = true;
+ }
+ else
+ {
+ rc = RC (rcExe, rcArc, rcParsing, rcFormat, rcUnexpected );
+
+ LOGERR (klogErr, rc,
+ "Found Extra Header after a block of zeros");
+
+ KOutMsg ("header '%lu' position '%lu' limit '%lu'\n",
+ self->position + (current_header.b - self->buffer)
+ ,self->position, self-> position_limit);
+
+ return rc;
+ }
+ }
+ switch (type)
+ {
+ case TAR_ZERO_BLOCK:
+ self->found_zero_block = true;
+ self->position_new += 512;
+ self->cursor = self->position_new;
+ done = true;
+ return 0;
+ case TAR_SPARSE:
+ {
+ /* -----
+ * If there is an extension header we'll have different work to do
+ */
+ int64_t ix;
+ uint64_t of;
+ uint64_t sz;
+
+ for (ix = 0; ix< GNU_SPARSES_IN_EXTRA_HEADER; ++ix)
+ {
+ rc_t ret;
+ of = tar_strtoll((const uint8_t*)current_header.h->sparse.sparse[ix].offset,
+ TAR_SIZE_LEN);
+ sz = tar_strtoll((const uint8_t*)current_header.h->sparse.sparse[ix].num_bytes,
+ TAR_SIZE_LEN);
+ if (sz == 0)
+ {
+ break;
+ }
+ ret = sparse_data_push (&self->sparse_q, of, sz);
+ if (ret)
+ {
+ sparse_data_kill(&self->sparse_q);
+ rc = RC (rcExe, rcArc, rcParsing, rcFormat, rcUnexpected );
+ LOGERR (klogErr, rc, "Problems parsing sparse header");
+ return rc;
+ }
+ ++self->num_chunks;
+ }
+ }
+ break;
+
+ default:
+ PLOGERR (klogErr,
+ (klogErr, RC (rcFS, rcArc, rcParsing, rcFormat, rcUnknown),
+ "unsupported header type $(type) $(string)",
+ "type=%d,string=%s",
+ type, get_type_string(type)));
+ done = true;
+ break;
+
+ case TAR_GNU_89:
+ case TAR_V7:
+ case TAR_POSIX:
+ /* -----
+ * almost anything we do will depend upon the size of the data for this block
+ *
+ * this will be wrong if we ever support cpio...
+ */
+ data_size = (tar_strtoll((uint8_t*)current_header.h->tar.size,TAR_SIZE_LEN));
+ mtime = (tar_strtoll((uint8_t*)current_header.h->tar.mtime,TAR_TIME_LEN));
+ /* mode = (tar_strtoll((uint8_t*)current_header.h->tar.mode,TAR_MODE_LEN)); */
+ }
+ /* -----
+ * Sometimes we are done just by identifying the header type.
+ * If so we break the loop here.
+ */
+ if (done)
+ {
+ /* -----
+ * point at the next header block
+ * Add the size of the header itself plus enough block sizes of data to cover
+ * any associated data.
+ */
+ size_t header_plus_data_block_size = (1+BLOCKS_FOR_BYTES(data_size))*TAR_BLOCK_SIZE;
+ current_position += header_plus_data_block_size;
+ current_header.b += header_plus_data_block_size;
+ break;
+ }
+
+ /* -----
+ * several extensions to USTAR/TAR format headers involve
+ * prepending another header type to give a name longer
+ * than will fit in tthe header itself. If we had one of
+ * those use that name. But if the full path has not been
+ * set use the path from this header.
+ */
+ if (full_path[0] == 0) /* if full_path wasn't filled in by an 'L' long name */
+ {
+ /* -----
+ * if there is a prefix (POSIX style) use it
+ * copy the prefix and then concatenate the name field
+ */
+ if (current_header.h->posix.prefix[0])
+ {
+ /* -----
+ * copy in the prefix, force a NUL just in case. then add a directory divider
+ */
+ strncpy(full_path,current_header.h->posix.prefix,TAR_PREFIX_LEN);
+ full_path[TAR_PREFIX_LEN] = 0x00;
+ strcat(full_path,"/");
+ }
+ strncat(full_path,current_header.h->tar.name,TAR_NAME_LEN);
+ }
+ link = current_header.h->tar.link;
+ switch (link)
+ {
+ case LINK_SPARSE:
+ /* -----
+ * If there is an extension header we'll have different work to do
+ */
+ if (current_header.h->gnu_89.isextended)
+ {
+ /* -----
+ * If we have an extended header the following makes sure there is room
+ */
+ if (current_position + (2 * sizeof(tar_header)) > self->position_limit)
+ {
+ rc = RC (rcExe, rcArc, rcParsing, rcBuffer, rcTooShort);
+ LOGERR (klogErr, rc, "Tar parsing buffer is too small to parse this file");
+ return rc;
+ }
+ done = false;
+ gnu_sparse = true; /* next block will be part of the header and not data */
+ data_position = current_position + 2 * sizeof(tar_header);
+ }
+ else
+ {
+ done = true;
+ gnu_sparse = false;
+ data_position = current_position + sizeof(tar_header);
+ }
+
+ done = (bool)! current_header.h->gnu_89.isextended;
+ {
+ int32_t ix;
+ rc_t ret;
+
+ virtual_data_size = (tar_strtoll((uint8_t*)current_header.h->gnu_89.realsize,TAR_SIZE_LEN));
+
+ for (ix = 0; ix< GNU_SPARSES_IN_OLD_HEADER; ++ix)
+ {
+ uint64_t sposition = tar_strtoll((const uint8_t*)current_header.h->gnu_89.sparse[ix].offset,
+ TAR_SIZE_LEN);
+ uint64_t ssize = tar_strtoll((const uint8_t*)current_header.h->gnu_89.sparse[ix].num_bytes,
+ TAR_SIZE_LEN);
+ if (ssize == 0)
+ {
+ break;
+ }
+
+ ret = sparse_data_push (&self->sparse_q, sposition, ssize);
+ if (ret)
+ {
+ sparse_data_kill(&self->sparse_q);
+ LOGERR (klogErr, rc, "Error parsing in header sparse data");
+ return rc;
+ }
+ ++self->num_chunks;
+ }
+ }
+ data_position = current_position + sizeof(tar_header);
+ break;
+
+ case LINK_OLDNORMAL_FILE: /* deprecated normal file */
+ /* -----
+ * this should only happen with LINK_OLDNORMAL_FILE
+ *
+ * If the type is file but the last character in the path is "/"
+ * treat it as a directory instead
+ */
+ if (full_path[strlen(full_path)-2] == '\\')
+ {
+ link = LINK_DIRECTORY;
+ }
+ /* fall through */
+ case LINK_NORMAL_FILE:
+ case LINK_CONTIGUOUS_FILE:
+ case LINK_DIRECTORY:
+ data_position = current_position + sizeof(tar_header);
+ done = true;
+ break;
+
+ case LINK_HARD_LINK:
+ case LINK_SYMBOLIC_LINK:
+ if (full_link[0] == 0)
+ {
+ strncpy(full_link,current_header.h->tar.linkname,TAR_NAME_LEN);
+ }
+ done = true;
+ break;
+
+ /* ----------
+ * These types we ignore
+ */
+ case LINK_CHARACTER_SPECIAL:
+ case LINK_BLOCK_SPECIAL:
+ case LINK_FIFO:
+ case LINK_INODE_METADATA:
+ /* -----
+ * Nothing to be done
+ */
+ PLOGMSG (klogInfo,
+ (klogInfo,
+ "ignored link type ($(type)) $(typestring) at $(position)",
+ "type=$%X,typestring=%s,position=%lld",
+ (unsigned)(current_header.h->tar.link),
+ get_link_string(current_header.h->tar.link),
+ (uint64_t)(current_position)+(uint64_t)(OFFSET_OF(tar_v7_header,link))));
+ data_size = 0;
+ done = true;
+ break;
+
+ case LINK_PAX_GLOBAL_XHDR:
+ case LINK_GNU_DUMPDIR: /* we are just gonna ignore this and not treat it like LINK_DIRECTORY */
+ case LINK_SOLARIS_ACL_FILE:
+ case LINK_VOLUME_NAME:
+ case LINK_MULTI_VOLUME:
+ done = true;
+ break;
+
+ case LINK_SOLARIS_ACL:
+ case LINK_PAX_XHDR: /* posix extended */
+ break;
+
+ case LINK_NEXT_LONG_LINK: /* long link name */
+ /* -----
+ * Long link name needs access now to its full set of data blocks, request a window shift
+ * if it is not currently accessible
+ */
+ if (current_position + sizeof(tar_header) + data_size > self->position_limit)
+ {
+ rc = RC (rcExe, rcArc, rcParsing, rcBuffer, rcTooShort);
+ LOGERR (klogErr, rc, "Tar parsing buffer is too small to parse this file");
+ return rc;
+ }
+
+ strncpy(full_link, (char*)(current_header.b + sizeof(tar_header)), data_size);
+ /* (void)PLOGMSG ((klogDebug1,"Full linkpath is ($path)","path=%s",full_link)); */
+ break;
+ case LINK_NEXT_LONG_NAME: /* long path name */
+ /* -----
+ * Long path name needs access now to its full set of data blocks, request a window shift
+ * if it is not currently accessible
+ */
+ if (current_position + sizeof(tar_header) + data_size > self->position_limit)
+ {
+ rc = RC (rcExe, rcArc, rcParsing, rcBuffer, rcTooShort);
+ LOGERR (klogErr, rc, "Tar parsing buffer is too small to parse this file");
+ return rc;
+ }
+
+ strncpy(full_path, (char*)(current_header.b + sizeof(tar_header)), data_size);
+ break;
+ }
+
+ /* -----
+ * move the current header position to past the data blocks
+ */
+ if (link == LINK_SPARSE)
+ {
+ current_position += sizeof (tar_header);
+ current_header.b += sizeof(tar_header);
+
+ }
+ else
+ {
+ current_position += sizeof (tar_header)+ ((data_size+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)*TAR_BLOCK_SIZE;
+ current_header.b += sizeof(tar_header) + ((data_size+TAR_BLOCK_SIZE-1)/TAR_BLOCK_SIZE)*TAR_BLOCK_SIZE;
+ }
+ /* -----
+ * if that is past the currently available
+ * quit the parse of this entry asn ask for a window shift, yeah, we'll redo work
+ * but its far simpler code to just start over than track being in the middle
+ */
+ if ((!done) && (current_position >= self->position_limit))
+ {
+ rc = RC (rcExe, rcArc, rcParsing, rcBuffer, rcTooShort);
+ LOGERR (klogErr, rc, "Tar parsing buffer is too small to parse this file");
+ return rc;
+ }
+ } while (! done);
+
+ /* -----
+ * generate output for this entry
+ */
+ switch (type)
+ {
+ default:
+ case TAR_UNDEFINED:
+ rc = RC (rcFS, rcArc, rcParsing, rcData, rcUnsupported);
+ PLOGERR (klogErr,
+ (klogErr, rc, "Unhandled Header Block $(typeint)",
+ "typeint=%u",type));
+ return rc;
+ case TAR_ZERO_BLOCK:
+ /* ignored */
+ break;
+
+ case TAR_CPIO:
+ case TAR_V7:
+ case TAR_POSIX:
+ /* case TAR_PAX: */
+ case TAR_SUN:
+ case TAR_STAR_85:
+ case TAR_STAR_94:
+ case TAR_GNU_89:
+ /*case TAR_GNU_01: */
+ case TAR_SPARSE:
+ /* -----
+ * TODO:
+ * implement a header checksum routine call it here, and return -1 if the check sum fails
+ */
+ if (gnu_sparse)
+ {
+ link = LINK_SPARSE; /* faking it for the next section */
+ }
+
+ switch (link)
+ {
+ case LINK_OLDNORMAL_FILE:
+ case LINK_NORMAL_FILE:
+ case LINK_CONTIGUOUS_FILE:
+ {
+ uint64_t start;
+ CCArcFileNode * node;
+
+ start = data_size ? data_position : 0;
+ /* LOGMSG (klogDebug3, "KArcTOCCreateFile"); */
+ DEBUG_MSG (3, ("about to CreateFile '':$(linkint)\n",
+ PLOG_2(PLOG_C(link),PLOG_X8(linkint)),
+ link,link));
+ /* now create a new contained file node */
+ rc = CCArcFileNodeMake ( & node, start, data_size );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create contained file node" );
+ else
+ {
+ const KFile * sfile;
+ rc = KFileMakeSubRead (&sfile, self->file, start, data_size);
+ if (rc != 0)
+ LOGERR ( klogInt, rc, "failed to create sub file reader" );
+ else
+ {
+ void * save;
+ rc_t orc;
+
+ copycat_log_set (&node->dad.logs, &save);
+
+ rc = ccat_md5 ( self->tree, sfile, mtime,
+ ccArcFile, &node->dad, full_path);
+
+ copycat_log_set (save, NULL);
+
+ orc = KFileRelease (sfile);
+ if (orc)
+ {
+ PLOGERR (klogInt,
+ (klogInt, orc,
+ "Failure handling a file '$(F) inside of a tar file",
+ "F=%s", full_path));
+ if (rc == 0)
+ rc = orc;
+ }
+
+ self->cursor += node->dad.size;
+
+ }
+ /* if successful, "node" ( allocated locally above )
+ will have been entered into "cont->sub" */
+ }
+ break;
+ }
+ case LINK_HARD_LINK:
+ {
+ DEBUG_MSG (3, ("KArcTOCCreateHardLink"));
+/* rc_t CCTreeSymlink ( CCTree *self, const char *targ, const char *alias ); */
+ rc = CCTreeLink (self->tree, mtime, full_link, full_path);
+ break;
+ }
+ case LINK_SYMBOLIC_LINK:
+ {
+ CCSymlinkNode * node;
+
+ DEBUG_MSG (3, ("KArcTOCCreateSoftLink"));
+
+ rc = CCSymlinkNodeMake (&node, full_link);
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to create sym link node" );
+ if ( rc == 0 )
+ {
+ rc = CCTreeInsert (self->tree, mtime, ccSymlink, node, full_path );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to enter node '$(name)'", "name=%s", full_path ));
+ }
+ break;
+ }
+/*
+static
+rc_t KSubChunkFileMake (KSubChunkFile ** pself,
+ const KFile * original,
+ uint64_t size,
+ uint32_t num_chunks)
+*/
+ case LINK_SPARSE:
+ {
+ CChunkFileNode * node;
+
+ DEBUG_MSG (3, ("LINK_SPARSE KArcTOCCreateChunkedFile"));
+ rc = CChunkFileNodeMake (&node, virtual_data_size);
+ if (rc != 0)
+ LOGERR ( klogInt, rc, "failed to create contained chunked file node" );
+ else
+ {
+ const KFile * sfile;
+ void * save;
+
+ copycat_log_set (&node->dad.logs, &save);
+
+ make_chunk_list(self, data_position);
+ whack_chunk_list (self);
+ rc = KFileMakeChunkRead (&sfile, self->file, virtual_data_size, self->num_chunks, self->chunks);
+ if (rc != 0)
+ LOGERR ( klogInt, rc, "failed to create sub chunk file reader" );
+ else
+ {
+ rc = ccat_md5 ( self->tree, sfile, mtime,
+ ccChunkFile, &node->dad, full_path);
+ KFileRelease (sfile);
+ }
+ /* if successful, "node" ( allocated locally above )
+ will have been entered into "cont->sub" */
+
+ copycat_log_set (save, NULL);
+ }
+ break;
+ }
+ case LINK_CHARACTER_SPECIAL:
+ case LINK_BLOCK_SPECIAL:
+ case LINK_FIFO:
+ case LINK_VOLUME_NAME:
+ case LINK_SOLARIS_ACL:
+ case LINK_GNU_DUMPDIR:
+ case LINK_SUN_XHDR:
+ case LINK_INODE_METADATA:
+ DEBUG_MSG (1, ("Ignored Entry Type %: named %s",
+ get_link_string(link),
+ full_path));
+ break;
+ case LINK_DIRECTORY:
+ {
+ CCTree * node;
+ DEBUG_MSG (3, ("KArcTOCCreateDir"));
+
+ rc = CCTreeMake (&node);
+ if (rc != 0)
+ LOGERR (klogInt, rc, "failed to make directory node");
+ else
+ {
+ rc = CCTreeInsert (self->tree, mtime, ccDirectory, node, full_path);
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to enter node '$(name)'", "name=%s", full_path ));
+ }
+ break;
+ }
+
+ default:
+ PLOGMSG (klogInfo,
+ (klogInfo,
+ " type ($(type)) name ($(name() link ($(link)) size ($(size)) position ($(position))",
+ "type=%s,name=%s,link=%s,size=%lld,position=%lld",
+ get_type_string(type),
+ full_path,
+ full_link,
+ data_size,
+ data_position));
+ break;
+ }
+ break;
+ }
+ self->position_new = current_position;
+ return 0;
+}
+
+static
+rc_t CCTarFillBuffer (CCTar * self)
+{
+ rc_t rc;
+ size_t to_read;
+ size_t to_copy;
+ size_t read;
+ size_t copy_offset;
+
+ assert (self);
+ assert (self->position <= self->position_new);
+
+ /* bring in what we still need from what we already have */
+
+ /* if we are restarting beyond what is in the buffer */
+ if (self->position_new >= self->position_limit)
+ {
+ self->position_limit = self->position_new;
+ to_read = sizeof (self->buffer);
+ to_copy = 0;
+ }
+ /* else we are going to copy some then read some */
+ else
+ {
+ to_copy = self->position_limit - self->position_new;
+ to_read = sizeof (self->buffer) - to_copy;
+ copy_offset = self->position_new - self->position;
+ memmove (self->buffer, self->buffer + copy_offset, to_copy);
+ }
+
+
+ self->position = self->position_new;
+ self->buffer_length = to_copy;
+/* memset (self->buffer + to_copy, 0, to_read); */
+ rc = KFileReadAll (self->file, self->position_limit, self->buffer + to_copy, to_read, &read);
+ if ((rc == 0) && (read != 0))
+ {
+ self->buffer_length += read;
+ self->position_limit += read;
+ }
+
+ return rc;
+}
+
+
+rc_t ccat_tar ( CCContainerNode *np, const KFile *sf, const char *name )
+{
+ rc_t rc;
+ CCTar * tar;
+ CCFileNode * fnode = np->entry; /* we want the base class FileNode only */
+
+ rc = CCTarMake (&tar, &np->sub, sf, name, fnode);
+ if (rc == 0)
+ {
+ do
+ {
+ rc = CCTarFillBuffer (tar);
+ if (rc != 0) /* this would be a hard 'system' error */
+ break;
+
+ if (tar->position == tar->position_limit) /* EOF */
+ break;
+
+ rc = process_one_entry (tar);
+ if (rc != 0)
+ break;
+
+ } while (!tar->found_second_zero_block);
+
+ /* tar file needs two 512 zero blocks at end
+ * it's a format error if not found */
+ if ( ! tar->found_second_zero_block )
+ {
+ rc_t lrc = RC (rcExe, rcArc, rcAccessing, rcFormat, rcTooShort);
+ fnode->err = true;
+ /* we won't fail copycat over this format error */
+ PLOGERR (klogErr,
+ (klogErr, lrc,
+ "tar file '$(F)' missing terminating zero blocks",
+ "F=%s", name));
+ }
+
+ CCTarWhack (tar);
+ }
+ return rc;
+}
+
diff --git a/tools/copycat/cctree-dump.c b/tools/copycat/cctree-dump.c
new file mode 100644
index 0000000..8b752ab
--- /dev/null
+++ b/tools/copycat/cctree-dump.c
@@ -0,0 +1,1030 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cctree-priv.h"
+#include "copycat-priv.h"
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <kapp/main.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+
+/*--------------------------------------------------------------------------
+ * fowards
+ */
+static bool CCNameDump ( BSTNode *n, void *data );
+
+
+/*--------------------------------------------------------------------------
+ * CCDumper
+ */
+typedef struct CCDumper CCDumper;
+struct CCDumper
+{
+ rc_t ( * flush ) ( void*, const void*, size_t );
+ void *out;
+
+ const char *sep;
+
+#if ! STORE_ID_IN_NODE
+ uint32_t id;
+#endif
+ uint32_t indent;
+ rc_t rc;
+
+ size_t total;
+ char buffer [ 4096 ];
+};
+
+
+/* Init
+ * sets up block
+ */
+static
+void CCDumperInit ( CCDumper *self,
+ rc_t ( * flush ) ( void *out, const void *buffer, size_t size ), void *out )
+{
+ self -> flush = flush;
+ self -> out = out;
+ self -> sep = "";
+#if ! STORE_ID_IN_NODE
+ self -> id = 0;
+#endif
+ self -> indent = 0;
+ self -> rc = 0;
+ self -> total = 0;
+}
+
+
+/* Flush
+ */
+static
+rc_t CCDumperFlush ( CCDumper *self )
+{
+ rc_t rc = ( * self -> flush ) ( self -> out, self -> buffer, self -> total );
+ if ( rc == 0 )
+ self -> total = 0;
+ return rc;
+}
+
+static
+rc_t CCDumperFlushLine ( CCDumper *self )
+{
+#if ! _DEBUGGING
+ if ( self -> total < sizeof self -> buffer / 2 )
+ return 0;
+#endif
+ return CCDumperFlush ( self );
+}
+
+
+/* Whack
+ * flushes buffer if necessary
+ */
+static
+rc_t CCDumperWhack ( CCDumper *self )
+{
+ if ( self -> rc == 0 && self -> total != 0 )
+ return CCDumperFlush ( self );
+ return 0;
+}
+
+
+/* Write
+ * writes data to buffer, flushes as necessary
+ */
+static
+rc_t CCDumperWrite ( CCDumper *self, const char *buffer, size_t size )
+{
+ rc_t rc;
+ size_t total, num_writ;
+
+ for ( rc = 0, total = 0; total < size; total += num_writ )
+ {
+ if ( self -> total == sizeof self -> buffer )
+ {
+ rc = CCDumperFlush ( self );
+ if ( rc != 0 )
+ break;
+ }
+
+ num_writ = size - total;
+ if ( num_writ > sizeof self -> buffer - self -> total )
+ num_writ = sizeof self -> buffer - self -> total;
+
+ memmove ( & self -> buffer [ self -> total ], & buffer [ total ], num_writ );
+ self -> total += num_writ;
+ }
+
+ return rc;
+}
+
+/* IndentLevel
+ * increase or decrease indentation level
+ */
+static
+void CCDumperIncIndentLevel ( CCDumper *self )
+{
+ ++ self -> indent;
+}
+
+static
+void CCDumperDecIndentLevel ( CCDumper *self )
+{
+ if ( self -> indent > 0 )
+ -- self -> indent;
+}
+
+
+/* Indent
+ * writes indentation spacing
+ */
+static
+rc_t CCDumperIndent ( CCDumper *self )
+{
+ rc_t rc;
+ uint32_t total, num_writ;
+
+ /* use 2 spaces per tab */
+ const char *tabs = " ";
+
+ for ( rc = 0, total = 0; total < self -> indent; total += num_writ )
+ {
+ num_writ = ( ( self -> indent - total - 1 ) & 0xF ) + 1;
+ rc = CCDumperWrite ( self, tabs, num_writ + num_writ );
+ if ( rc != 0 )
+ break;
+ }
+
+ return rc;
+}
+
+/* Sep
+ * write separator string
+ */
+static
+rc_t CCDumperSep ( CCDumper *self )
+{
+ if ( self -> sep == NULL )
+ return 0;
+
+ return CCDumperWrite ( self, self -> sep, strlen ( self -> sep ) );
+}
+
+/* Print
+ * \t - indent
+ * \n - end of line
+ * %d - integer
+ * %u - unsigned
+ * %ld - int64_t
+ * %lu - uint64_t
+ * %f - double
+ * %s - null-terminated C-string
+ * %p - separator
+ * %S - String*
+ * %I - unique id
+ * %T - timestamp
+ * %M - MD5 digest
+ * %C - CRC32
+ * %N - CCName*
+ * %F - full CCName*
+ */
+static
+rc_t StringPrint ( const String *self, CCDumper *d )
+{
+/* BUFF_WARNING_TRACK has to be larger than all size differences
+ * between a special character and its encoding in XML
+ * 8 is big enough for all I know about when writing this with some
+ * safety margin
+ */
+#define BUFF_WARNING_TRACK 8
+#define BUFF_SIZE (256)
+#define REPLACE_COPY(C,S) \
+ case C: \
+ sp++;\
+ count--;\
+ memmove (bp,(S),sizeof(S)-1);\
+ bp += sizeof(S)-1;\
+ break
+
+ char buff [256 + 5];
+ char * bp;
+ const char * sp;
+ size_t count;
+ rc_t rc = 0;
+
+ /* start at the beginnings of the string and buffer */
+ sp = self->addr;
+ bp = buff;
+
+ count = self->size;
+
+ while (count > 0)
+ {
+ if ((bp - buff) > (BUFF_SIZE - BUFF_WARNING_TRACK))
+ {
+ rc = CCDumperWrite (d, buff, bp-buff);
+ if (rc)
+ return rc;
+ bp = buff;
+ }
+ switch (*sp)
+ {
+ /* just copy most characters */
+ default:
+ *bp++ = *sp++;
+ count --;
+ break;
+
+ REPLACE_COPY('<',"<");
+ REPLACE_COPY('>',">");
+ REPLACE_COPY('&',"&");
+ REPLACE_COPY('"',""");
+ REPLACE_COPY('\'',"'");
+
+ }
+ }
+ if (bp > buff)
+ rc = CCDumperWrite (d, buff, bp-buff);
+ return rc;
+
+}
+
+static
+rc_t CCNamePrint ( const CCName *self, CCDumper *d )
+{
+ return StringPrint ( & self -> name, d );
+}
+
+static
+rc_t CCNamePrintFull ( const CCName *self, CCDumper *d )
+{
+ if ( self -> dad != NULL )
+ {
+ rc_t rc = CCNamePrintFull ( self -> dad, d );
+ if ( rc == 0 )
+ rc = CCDumperWrite ( d, "/", 1 );
+ if ( rc != 0 )
+ return rc;
+ }
+ return CCNamePrint ( self, d );
+}
+
+static
+rc_t KTimePrint ( KTime_t self, CCDumper *d )
+{
+ int len;
+ char buffer [ 64 ];
+ time_t t = ( time_t ) self;
+
+ struct tm gmt;
+ gmtime_r ( & t, & gmt );
+ len = sprintf ( buffer, "%04d-%02d-%02dT%02d:%02d:%02dZ"
+ , gmt . tm_year + 1900
+ , gmt . tm_mon + 1
+ , gmt . tm_mday
+ , gmt . tm_hour
+ , gmt . tm_min
+ , gmt . tm_sec
+ );
+
+ return CCDumperWrite ( d, buffer, len );
+}
+
+static
+rc_t MD5Print ( const uint8_t *digest, CCDumper *d )
+{
+ int i, len;
+ char buff [ 36 ];
+
+ for ( i = len = 0; i < 16; ++ i )
+ len += sprintf ( & buff [ len ], "%02x", digest [ i ] );
+
+ return CCDumperWrite ( d, buff, 32 );
+}
+
+static
+rc_t CCDumperVPrint ( CCDumper *self, const char *fmt, va_list args )
+{
+ rc_t rc;
+ const char *start, *end;
+
+ for ( rc = 0, start = end = fmt; * end != 0; ++ end )
+ {
+ int len;
+ size_t size;
+ char buffer [ 256 ];
+
+ switch ( * end )
+ {
+ case '\t':
+ if ( end > start )
+ rc = CCDumperWrite ( self, start, end - start );
+ if ( rc == 0 )
+ rc = CCDumperIndent ( self );
+ start = end + 1;
+ break;
+ case '\n':
+ rc = CCDumperWrite ( self, start, end - start + 1 );
+ if ( rc == 0 )
+ rc = CCDumperFlushLine ( self );
+ start = end + 1;
+ break;
+ case '%':
+ if ( end > start )
+ {
+ rc = CCDumperWrite ( self, start, end - start );
+ if ( rc != 0 )
+ break;
+ }
+ switch ( * ( ++ end ) )
+ {
+ case 'd':
+ len = sprintf ( buffer, "%d", va_arg ( args, int ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'u':
+ len = sprintf ( buffer, "%u", va_arg ( args, unsigned int ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'x':
+ len = sprintf ( buffer, "%x", va_arg ( args, unsigned int ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'f':
+ len = sprintf ( buffer, "%f", va_arg ( args, double ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'l':
+ switch ( * ( ++ end ) )
+ {
+ case 'd':
+ rc = string_printf ( buffer, sizeof buffer, & size, "%ld", va_arg ( args, int64_t ) );
+ if ( rc == 0 )
+ rc = CCDumperWrite ( self, buffer, size );
+ break;
+ case 'u':
+ rc = string_printf ( buffer, sizeof buffer, & size, "%lu", va_arg ( args, uint64_t ) );
+ if ( rc == 0 )
+ rc = CCDumperWrite ( self, buffer, size );
+ break;
+ }
+ break;
+ case 's':
+ len = sprintf ( buffer, "%s", va_arg ( args, const char* ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'p':
+ rc = CCDumperSep ( self );
+ break;
+ case 'S':
+ rc = StringPrint ( va_arg ( args, const String* ), self );
+ break;
+ case 'I':
+#if STORE_ID_IN_NODE
+ len = sprintf ( buffer, "%u", va_arg ( args, uint32_t ) );
+#else
+ len = sprintf ( buffer, "%u", ++ self -> id );
+#endif
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'T':
+ rc = KTimePrint ( va_arg ( args, KTime_t ), self );
+ break;
+ case 'M':
+ rc = MD5Print ( va_arg ( args, const uint8_t* ), self );
+ break;
+ case 'C':
+ len = sprintf ( buffer, "%08x", va_arg ( args, unsigned int ) );
+ rc = CCDumperWrite ( self, buffer, len );
+ break;
+ case 'N':
+ rc = CCNamePrint ( va_arg ( args, const CCName* ), self );
+ break;
+ case 'F':
+ rc = CCNamePrintFull ( va_arg ( args, const CCName* ), self );
+ break;
+ case '%':
+ rc = CCDumperWrite ( self, "%", 1 );
+ break;
+ }
+ start = end + 1;
+ break;
+ }
+
+ if ( rc != 0 )
+ break;
+ }
+
+ if ( rc == 0 && end > start )
+ {
+ rc = CCDumperWrite ( self, start, end - start );
+ if ( rc == 0 )
+ rc = CCDumperFlushLine ( self );
+ }
+
+ return rc;
+}
+
+static
+rc_t CCDumperPrint ( CCDumper *self, const char *fmt, ... )
+{
+ rc_t rc;
+ va_list args;
+
+ va_start ( args, fmt );
+ rc = CCDumperVPrint ( self, fmt, args );
+ va_end ( args );
+
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCFileNode
+ * a node with a size and modification timestamp
+ * has a file type determined by magic/etc.
+ * has an md5 checksum
+ *
+ * how would an access mode be used? access mode of a file is
+ * whatever the filesystem says it is, and within an archive,
+ * it's read-only based upon access mode of outer file...
+ */
+
+/* Dump
+ */
+static
+rc_t CCFileNodeDumpCmn ( const CCFileNode *self, const char *tag,
+ const CCName *name, const String *cached, CCDumper *d )
+{
+ rc_t rc = CCDumperPrint ( d,
+ "\t<%s " /* node class */
+ "id=\"%I\" " /* unique id */
+ "path=\"%F\" " /* full path */
+ "name=\"%N\" " /* node name */
+ , tag
+#if STORE_ID_IN_NODE
+ , self -> id
+#endif
+ , name
+ , name );
+ if ( rc == 0 && cached != NULL )
+ rc = CCDumperPrint ( d,
+ "cached=\"%S\" " /* cached name */
+ , cached );
+ if ( rc == 0 )
+ rc = CCDumperPrint ( d,
+ "size=\"%lu\" "
+ , self->size );
+ if (( rc == 0 ) && ( self->size > 0 ) && ( self->lines != 0 ))
+ rc = CCDumperPrint ( d,
+ "lines=\"%lu\" "
+ , self->lines );
+ if ( rc == 0 )
+ rc = CCDumperPrint ( d,
+ "mtime=\"%T\" " /* mod time */
+ , name -> mtime );
+ if ( rc == 0 )
+ {
+ if ( self -> rc )
+ rc = CCDumperPrint ( d,
+ "filetype=\"Errored%s\" " /* file type */
+ , self -> ftype );
+ else
+ rc = CCDumperPrint ( d,
+ "filetype=\"%s\" " /* file type */
+ , self -> ftype );
+ }
+ if ( rc == 0 && ! no_md5 )
+ rc = CCDumperPrint ( d,
+ "md5=\"%M\" " /* md5 digest */
+ , self -> _md5 );
+
+ return rc;
+}
+
+typedef struct dump_log_data
+{
+ rc_t rc;
+ CCDumper * d;
+} dump_log_data;
+
+static
+rc_t CCNodeDumpLog ( void * n, CCDumper * d )
+{
+ String s;
+
+ StringInitCString (&s, n); /* cast after add gets past node */
+
+ return CCDumperPrint ( d, "\t<CCError>%S</CCError>\n", &s );
+}
+
+
+static
+rc_t CCFileNodeDump ( const CCFileNode *cself, const char *tag,
+ const CCName *name, const String *cached, CCDumper *d, bool close )
+{
+ rc_t rc;
+ bool trunc;
+ CCFileNode * self = (CCFileNode *)cself;
+
+ trunc = ((self->expected != SIZE_UNKNOWN) &&
+ (self->expected != self->size));
+
+ rc = CCFileNodeDumpCmn ( self, tag, name, cached, d );
+ if ( rc == 0 && self -> crc32 != 0 )
+ rc = CCDumperPrint ( d, " crc32=\"%C\"", self -> crc32 );
+ if ( rc == 0 )
+ {
+ if (self->err || trunc || (self->logs.head != NULL))
+ {
+ do
+ {
+ rc = CCDumperPrint (d, ">\n");
+ if (rc) break;
+
+ if (trunc)
+ {
+ rc = CCDumperPrint (d, "\t<CCErrSize expected=\"%lu\">"
+ "Error in file size expected %lu but got %lu"
+ "</CCErrSize>\n", self->expected,
+ self->expected, self->size);
+ if (rc) break;
+ }
+
+ if (self->err)
+ {
+ if (self->logs.head != NULL)
+ {
+ SLNode* log;
+
+ while ((log = SLListPopHead (&self->logs)) != NULL)
+ {
+ CCNodeDumpLog (log+1, d);
+ free (log);
+ }
+ }
+ else
+ rc = CCDumperPrint (d, "\t<CCErr>Not specified</CCErr>\n");
+ }
+ if (rc) break;
+
+ if (close)
+ rc = CCDumperPrint (d, "\t</%s>\n", tag);
+ } while (0);
+ }
+ else if (close)
+ rc = CCDumperPrint (d, "/>\n");
+ else
+ rc = CCDumperPrint (d, ">\n");
+ }
+ return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * CCArcFileNode
+ * a file with an offset into another file
+ */
+
+/* Dump
+ */
+static
+rc_t CCArcFileNodeDump ( const CCArcFileNode *cself, const char *tag,
+ const CCName *name, const String *cached, CCDumper *d, bool close )
+{
+ rc_t rc;
+ bool trunc;
+ CCArcFileNode * self = (CCArcFileNode *)cself;
+
+ trunc = ((self->dad.expected != SIZE_UNKNOWN) &&
+ (self->dad.expected != self->dad.size));
+
+ rc = CCFileNodeDumpCmn ( & self -> dad, tag, name, cached, d );
+ if ( rc == 0 )
+ {
+ if (!xml_dir)
+ rc = CCDumperPrint ( d, " offset=\"%lu\"", self->offset);
+ if (rc == 0) do
+ {
+ if (self->dad.err || trunc || (self->dad.logs.head != NULL))
+ {
+ rc = CCDumperPrint (d, ">\n");
+ if (rc) break;
+
+ if (trunc)
+ {
+ rc = CCDumperPrint (d, "\t<CCErrSize expected=\"%lu\">"
+ "Error in file size expected %lu but got %lu"
+ "</CCErrSize>\n", self->dad.expected,
+ self->dad.expected, self->dad.size);
+ if (rc) break;
+ }
+
+ if (self->dad.err)
+ {
+ if (self->dad.logs.head != NULL)
+ {
+ SLNode* log;
+
+ while ((log = SLListPopHead (&self->dad.logs)) != NULL)
+ {
+ CCNodeDumpLog (log+1, d);
+ free (log);
+ }
+ }
+ else
+ rc = CCDumperPrint (d, "\t<CCErr>Not specified</CCErr>\n");
+ }
+ if (rc) break;
+
+ if (close)
+ rc = CCDumperPrint (d, "\t</%s>\n", tag);
+ }
+ else if (close)
+ rc = CCDumperPrint (d, "/>\n");
+ else
+ rc = CCDumperPrint (d, ">\n");
+ } while (0);
+ }
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CChunkFileNode
+ * a file with one or more chunks (offset/size) into another file
+ */
+
+/* Dump
+ */
+static
+bool CChunkDump ( SLNode *n, void *data )
+{
+ CCDumper *d = data;
+ const CChunk *self = ( const CChunk* ) n;
+
+ d -> rc = CCDumperPrint ( d, "\t<chunk offset=\"%lu\" size=\"%lu\"/>\n",
+ self -> offset, self -> size );
+
+ return ( d -> rc != 0 ) ? true : false;
+}
+
+static
+rc_t CChunkFileNodeDump ( const CChunkFileNode *self, const char *tag,
+ const CCName *name, const String *cached, CCDumper *d, bool close )
+{
+ rc_t rc = CCFileNodeDumpCmn ( & self -> dad, tag, name, cached, d );
+ if ( rc == 0 )
+ rc = CCDumperPrint ( d, " size=\"%lu\">\n", self -> dad . size );
+ CCDumperIncIndentLevel ( d );
+ if ( rc == 0 )
+ {
+ if ( SLListDoUntil ( & self -> chunks, CChunkDump, d ) )
+ rc = d -> rc;
+ }
+ CCDumperDecIndentLevel ( d );
+ if ( rc == 0 && close )
+ rc = CCDumperPrint ( d, "\t</%s>\n", tag );
+
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCCachedFileNode
+ * a file wrapper with cached file name
+ */
+
+/* Dump
+ */
+#if 0 /* why is this commented out... */
+static
+rc_t CCCachedFileNodeDump ( const CCCachedFileNode *self,
+ const CCName *name, CCDumper *d )
+{
+ rc_t rc;
+ const void *entry = self -> entry;
+
+ switch ( self -> type )
+ {
+ case ccFile:
+ case ccContFile:
+ rc = CCFileNodeDump ( entry, "file", name, & self -> cached, d, true );
+ break;
+ case ccArcFile:
+ rc = CCArcFileNodeDump ( entry, "file", name, & self -> cached, d, true );
+ break;
+ case ccChunkFile:
+ rc = CChunkFileNodeDump ( entry, "file", name, & self -> cached, d, true );
+ break;
+ default:
+ rc = RC ( rcExe, rcTree, rcWriting, rcNode, rcUnrecognized );
+ }
+
+ return rc;
+}
+#endif
+
+/*--------------------------------------------------------------------------
+ * CCContainerNode
+ * a container/archive file entry
+ * a file with sub-entries
+ */
+
+/* Dump
+ */
+static
+rc_t CCContainerNodeDump ( const CCContainerNode *self, const char *node,
+ const CCName *name, CCDumper *d )
+{
+ rc_t rc;
+ const void *entry = self -> entry;
+
+ switch ( self -> type )
+ {
+ case ccFile:
+ case ccContFile:
+ rc = CCFileNodeDump ( entry, node, name, NULL, d, false );
+ break;
+ case ccArcFile:
+ rc = CCArcFileNodeDump ( entry, node, name, NULL, d, false );
+ break;
+ case ccChunkFile:
+ rc = CChunkFileNodeDump ( entry, node, name, NULL, d, false );
+ break;
+ default:
+ rc = RC ( rcExe, rcTree, rcWriting, rcNode, rcUnrecognized );
+ }
+
+ if ( rc != 0 )
+ return rc;
+
+ CCDumperIncIndentLevel ( d );
+
+ if ( BSTreeDoUntil ( & self -> sub, false, CCNameDump, d ) )
+ rc = d -> rc;
+
+ CCDumperDecIndentLevel ( d );
+
+ if ( rc == 0 )
+ rc = CCDumperPrint ( d, "\t</%s>\n", node );
+
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCSymlinkNode
+ * a directory entry with a substitution path
+ */
+
+/* Dump
+ */
+static
+rc_t CCSymlinkNodeDump ( const CCSymlinkNode *self, const CCName *name, CCDumper *d, bool replaced )
+{
+ const char * tag = replaced ? "replaced-symlink" : "symlink";
+ return CCDumperPrint ( d, "\t<%s name=\"%N\" mtime=\"%T\">%S</%s>\n",
+ tag, name, name -> mtime, & self -> path, tag );
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCTreeNode
+ * doesn't actually exist, but is treated separately from tree
+ */
+
+/* Dump
+ */
+static
+rc_t CCTreeNodeDump ( const CCTree *self, const CCName *name, CCDumper *d, bool replaced )
+{
+ const char * tag = replaced ? "replaced-directory" : "directory";
+ rc_t rc = CCDumperPrint ( d, "\t<%s name=\"%N\" mtime=\"%T\">\n",
+ tag, name, name -> mtime );
+
+ CCDumperIncIndentLevel ( d );
+
+ if ( rc == 0 && BSTreeDoUntil ( self, false, CCNameDump, d ) )
+ rc = d -> rc;
+
+ CCDumperDecIndentLevel ( d );
+
+ if ( rc == 0 )
+ rc = CCDumperPrint ( d, "\t</%s>\n", tag );
+
+ return rc;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCName
+ * the main entrypoint
+ */
+
+/* Dump
+ */
+static
+bool CCNameDump ( BSTNode *n, void *data )
+{
+ CCDumper * d = data;
+ const CCName * self = (const CCName*)n;
+ void * entry = self->entry;
+ uint32_t type = self->type;
+ bool replaced = false;
+
+ if (type == ccReplaced)
+ {
+ const CCReplacedNode * node = entry;
+ type = node->type;
+ entry = node->entry;
+ replaced = true;
+ }
+
+ if (type == ccCached)
+ {
+ const CCCachedFileNode * node = entry;
+ type = node->type;
+ entry = node->entry;
+ }
+
+ if ( type == ccHardlink )
+ {
+ do
+ {
+ /* if for some reason the link is broken */
+ if ( self -> entry == NULL )
+ return false;
+ self = self -> entry;
+ }
+ while ( self -> type == ccHardlink );
+
+ entry = self -> entry;
+ type = self -> type;
+ self = ( const CCName* ) n;
+ }
+
+ switch ( type )
+ {
+ case ccFile:
+ case ccContFile:
+ d -> rc = CCFileNodeDump ( entry, replaced ? "replaced-file" : "file", self, NULL, d, true );
+ break;
+ case ccArcFile:
+ d -> rc = CCArcFileNodeDump ( entry, replaced ? "replaced-file" : "file", self, NULL, d, true );
+ break;
+ case ccChunkFile:
+ d -> rc = CChunkFileNodeDump ( entry, replaced ? "replaced-file" : "file", self, NULL, d, true );
+ break;
+ case ccContainer:
+ d -> rc = CCContainerNodeDump ( entry, replaced ? "replaced-container" : "container", self, d );
+ break;
+ case ccArchive:
+ d -> rc = CCContainerNodeDump ( entry, replaced ? "replaced-archive" : "archive", self, d );
+ break;
+ case ccSymlink:
+ d -> rc = CCSymlinkNodeDump ( entry, self, d, replaced );
+ break;
+ case ccDirectory:
+ d -> rc = CCTreeNodeDump ( entry, self, d, replaced );
+ break;
+ case ccCached:
+#if 0
+ d -> rc = CCCachedFileNodeDump ( entry, self, d );
+#else
+ d -> rc = RC ( rcExe, rcTree, rcWriting, rcNode, rcCorrupt );
+#endif
+ break;
+ default:
+ d -> rc = RC ( rcExe, rcTree, rcWriting, rcNode, rcUnrecognized );
+ }
+
+ return ( d -> rc != 0 ) ? true : false;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * CCTree
+ * a binary search tree with CCNodes
+ */
+
+/* Dump
+ * dump tree using provided callback function
+ *
+ * "write" [ IN, NULL OKAY ] and "out" [ IN, OPAQUE ] - callback function
+ * for writing. if "write" is NULL, print to stdout.
+ */
+static
+rc_t CCTreeDumpInt2 ( const CCTree *self, CCDumper *d, SLList * logs )
+{
+ rc_t rc = 0;
+
+ /* print logs attached to this node */
+ if (logs->head != NULL)
+ {
+ SLNode * log;
+ while ((log = SLListPopHead (logs)) != NULL)
+ {
+ CCNodeDumpLog (log+1, d);
+ free (log);
+ }
+ }
+
+ CCDumperIncIndentLevel ( d );
+
+ if ( BSTreeDoUntil ( self, false, CCNameDump, d ) )
+ rc = d -> rc;
+
+ CCDumperDecIndentLevel ( d );
+
+ return rc;
+}
+
+/* print root node and call out to print what that contains */
+static
+rc_t CCTreeDumpInt ( const CCTree *self, CCDumper *d, SLList * logs )
+{
+ ver_t v = KAppVersion ();
+ rc_t rc = CCDumperPrint ( d, "<ROOT version=\"%u.%u.%u\">\n",
+ VersionGetMajor(v),
+ VersionGetMinor(v),
+ VersionGetRelease(v));
+ if ( rc == 0 )
+ {
+ rc = CCTreeDumpInt2 ( self, d, logs );
+
+ if ( rc == 0 )
+ CCDumperPrint ( d, "</ROOT>\n" );
+ }
+ return rc;
+}
+
+static
+rc_t write_FILE ( void *out, const void *buffer, size_t bytes )
+{
+ size_t num_writ;
+
+ if ( bytes == 0 )
+ return 0;
+
+ num_writ = fwrite ( buffer, 1, bytes, out );
+ if ( num_writ == bytes )
+ return 0;
+ if ( num_writ != 0 )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ if ( buffer == NULL )
+ return RC ( rcExe, rcFile, rcWriting, rcParam, rcNull );
+
+ return RC ( rcExe, rcFile, rcWriting, rcNoObj, rcUnknown );
+}
+
+rc_t CCTreeDump ( const CCTree *self,
+ rc_t ( * write ) ( void *out, const void *buffer, size_t bytes ),
+ void *out, SLList * logs )
+{
+ rc_t rc, rc2;
+ CCDumper d;
+
+ if ( write == NULL )
+ {
+ write = write_FILE;
+ out = stdout;
+ }
+
+ CCDumperInit ( & d, write, out );
+
+ rc = CCTreeDumpInt ( self, & d, logs );
+
+ rc2 = CCDumperWhack ( & d );
+
+ return rc ? rc : rc2;
+}
diff --git a/tools/copycat/cctree-priv.h b/tools/copycat/cctree-priv.h
new file mode 100644
index 0000000..897576e
--- /dev/null
+++ b/tools/copycat/cctree-priv.h
@@ -0,0 +1,351 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cctree_priv_
+#define _h_cctree_priv_
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#define STORE_ID_IN_NODE 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct BSTree CCTree;
+typedef struct CCName CCName;
+
+
+/*--------------------------------------------------------------------------
+ * CCType
+ * enum describing entry type
+ */
+enum CCType
+{
+ ccFile,
+ ccContFile,
+ ccArcFile,
+ ccChunkFile,
+ ccContainer,
+ ccArchive,
+ ccSymlink,
+ ccHardlink,
+ ccDirectory,
+ ccCached,
+ ccReplaced /* a name attached to a replaced file (name twice in tar for example) */
+};
+
+
+/*--------------------------------------------------------------------------
+ * CCFileNode
+ * a node with a size and modification timestamp
+ * has a file type determined by magic/etc.
+ * has an md5 checksum
+ *
+ * how would an access mode be used? access mode of a file is
+ * whatever the filesystem says it is, and within an archive,
+ * it's read-only based upon access mode of outer file...
+ */
+typedef struct CCFileNode CCFileNode;
+struct CCFileNode
+{
+ uint64_t expected; /* size expected (0 if not known) */
+/* #define SIZE_UNKNOWN (UINT64_MAX) */
+#define SIZE_UNKNOWN ((uint64_t)(int64_t)-1)
+ uint64_t size; /* actual size */
+ uint64_t lines; /* linecount if ASCII */
+ uint32_t crc32;
+#if STORE_ID_IN_NODE
+ uint32_t id;
+#endif
+ rc_t rc;
+ bool err; /* errors found while reading/parsing */
+ char ftype [ 252 ];
+ uint8_t _md5 [ 32 ];
+ SLList logs;
+};
+
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CCFileNodeMake ( CCFileNode **n, uint64_t expected );
+
+/* Whack
+ */
+#define CCFileNodeWhack( self ) \
+ free ( self )
+
+
+/*--------------------------------------------------------------------------
+ * CCArcFileNode
+ * a file with an offset into another file
+ */
+typedef struct CCArcFileNode CCArcFileNode;
+struct CCArcFileNode
+{
+ CCFileNode dad;
+ uint64_t offset;
+};
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CCArcFileNodeMake ( CCArcFileNode **n,
+ uint64_t offset, uint64_t size );
+
+/* Whack
+ */
+#define CCArcFileNodeWhack( self ) \
+ free ( self )
+
+
+/*--------------------------------------------------------------------------
+ * CChunkFileNode
+ * a file with one or more chunks (offset/size) into another file
+ */
+typedef struct CChunk CChunk;
+struct CChunk
+{
+ SLNode n;
+ uint64_t offset;
+ uint64_t size;
+};
+
+typedef struct CChunkFileNode CChunkFileNode;
+struct CChunkFileNode
+{
+ CCFileNode dad;
+ SLList chunks;
+};
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CChunkFileNodeMake ( CChunkFileNode **n, uint64_t size );
+
+/* AddChunk
+ * adds a chunk to the chunk file
+ */
+rc_t CChunkFileNodeAddChunk ( CChunkFileNode *self,
+ uint64_t offset, uint64_t size );
+
+/* Whack
+ */
+void CChunkFileNodeWhack ( CChunkFileNode *self );
+
+
+/*--------------------------------------------------------------------------
+ * CCCachedFileNode
+ * a file wrapper with cached file name
+ */
+typedef struct CCCachedFileNode CCCachedFileNode;
+struct CCCachedFileNode
+{
+ /* cached name */
+ String cached;
+
+ /* container CCFileNode */
+ void *entry;
+ uint32_t type;
+};
+
+/* Make
+ * creates a cached file wrapper
+ */
+rc_t CCCachedFileNodeMake ( CCCachedFileNode **n,
+ const char *path, enum CCType type, const void *entry );
+
+/* Whack
+ */
+void CCCachedFileNodeWhack ( CCCachedFileNode *self );
+
+
+/*--------------------------------------------------------------------------
+ * CCSymlinkNode
+ * a directory entry with a substitution path
+ */
+typedef struct CCSymlinkNode CCSymlinkNode;
+struct CCSymlinkNode
+{
+ String path;
+};
+
+/* Make
+ * creates a symlink object
+ */
+rc_t CCSymlinkNodeMake ( CCSymlinkNode **n, const char *path );
+
+/* Whack
+ */
+#define CCSymlinkNodeWhack( self ) \
+ free ( self )
+
+
+/*--------------------------------------------------------------------------
+ * CCTree
+ * a binary search tree with CCNodes
+ */
+
+/* Make
+ * make a root tree or sub-directory
+ */
+rc_t CCTreeMake ( CCTree **t );
+
+/* Insert
+ * create an entry into a tree
+ * parses path into required sub-directories
+ *
+ * "mtime" [ IN ] - modification timestamp
+ *
+ * "type" [ IN ] and "entry" [ IN ] - typed entry
+ *
+ * "path" [ IN ] - vararg-style path of the entry, relative
+ * to "self".
+ *
+ * NB - '..' is not allowed in this implementation.
+ */
+rc_t CCTreeInsert ( CCTree *self, KTime_t mtime,
+ enum CCType type, const void *entry, const char *path, ... );
+
+/* Find
+ * find a named node
+ * returns NULL if not found
+ */
+const CCName *CCTreeFind ( const CCTree *self, const char *path, ... );
+
+
+/* Link
+ * create a symlink to existing node
+ */
+rc_t CCTreeLink ( CCTree *self, KTime_t mtime,
+ const char *targ, const char *alias );
+
+
+/* Whack
+ */
+void CCTreeWhack ( CCTree *self );
+
+/* Dump
+ * dump tree using provided callback function
+ *
+ * "write" [ IN, NULL OKAY ] and "out" [ IN, OPAQUE ] - callback function
+ * for writing. if "write" is NULL, print to stdout.
+ */
+rc_t CCTreeDump ( const CCTree *self,
+ rc_t ( * write ) ( void *out, const void *buffer, size_t bytes ),
+ void *out, SLList * logs );
+
+
+/*--------------------------------------------------------------------------
+ * CCContainerNode
+ * its entry is a container file, i.e. an archive or else processed
+ * with some sort of envelope such as compression. its sub nodes
+ * are the contents and have their own names.
+ */
+typedef struct CCContainerNode CCContainerNode;
+struct CCContainerNode
+{
+ /* contents */
+ CCTree sub;
+
+ /* container CCFileNode */
+ void *entry;
+ uint32_t type;
+};
+
+/* Make
+ * creates an archive object
+ */
+rc_t CCContainerNodeMake ( CCContainerNode **n,
+ enum CCType type, const void *entry );
+
+/* Whack
+ */
+void CCContainerNodeWhack ( CCContainerNode *self );
+
+
+/*--------------------------------------------------------------------------
+ * CCReplacedNode
+ * its entry is any other type. when a name shows up twice in a tar file
+ * the first version is replaced.
+ */
+typedef struct CCReplacedNode CCReplacedNode;
+struct CCReplacedNode
+{
+ /* container CCFileNode */
+ void *entry;
+ uint32_t type;
+};
+
+/* Make
+ */
+rc_t CCReplacedNodeMake ( CCReplacedNode **n,
+ enum CCType type, const void *entry );
+
+/* Whack
+ */
+void CCReplacedNodeWhack ( CCReplacedNode *self );
+
+
+
+/*--------------------------------------------------------------------------
+ * CCName
+ * an entry name in a CCTree
+ */
+struct CCName
+{
+ BSTNode n;
+ CCName *dad;
+ KTime_t mtime;
+ void *entry;
+ String name;
+ uint32_t type;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_cctree_priv_ */
diff --git a/tools/copycat/cctree.c b/tools/copycat/cctree.c
new file mode 100644
index 0000000..f3bdaa2
--- /dev/null
+++ b/tools/copycat/cctree.c
@@ -0,0 +1,754 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "copycat-priv.h"
+#include "cctree-priv.h"
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * CCFileNode
+ * a node with a size and modification timestamp
+ * has a file type determined by magic/etc.
+ * has an md5 checksum
+ *
+ * how would an access mode be used? access mode of a file is
+ * whatever the filesystem says it is, and within an archive,
+ * it's read-only based upon access mode of outer file...
+ */
+
+static
+void CCFileNodeInit ( CCFileNode *self, uint64_t expected )
+{
+#if STORE_ID_IN_NODE
+ static uint32_t file_id;
+ self -> id = ++ file_id;
+#endif
+ self -> expected = expected;
+ self -> size = 0; /* we learn this with the counter file */
+ self -> lines = 0; /* we learn this with the counter file */
+ self -> crc32 = 0;
+ self -> rc = 0;
+ self -> err = false;
+ memset ( self -> ftype, 0, sizeof self -> ftype );
+ memset ( self -> _md5, 0, sizeof self -> _md5 );
+ SLListInit ( &self->logs );
+}
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CCFileNodeMake ( CCFileNode **np, uint64_t expected )
+{
+ CCFileNode *n = malloc ( sizeof * n );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ CCFileNodeInit ( n, expected );
+
+ * np = n;
+ return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * CCArcFileNode
+ * a file with an offset into another file
+ */
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CCArcFileNodeMake ( CCArcFileNode **np,
+ uint64_t offset, uint64_t expected )
+{
+ CCArcFileNode *n = malloc ( sizeof * n );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ CCFileNodeInit ( & n -> dad, expected );
+ n -> offset = offset;
+
+ * np = n;
+ return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CChunkFileNode
+ * a file with one or more chunks (offset/size) into another file
+ */
+
+/* Whack
+ */
+static
+void CChunkWhack ( SLNode *n, void *ignore )
+{
+ free ( n );
+}
+
+void CChunkFileNodeWhack ( CChunkFileNode *self )
+{
+ if ( self != NULL )
+ {
+ SLListWhack ( & self -> chunks, CChunkWhack, NULL );
+ CCFileNodeWhack ( & self -> dad );
+ }
+}
+
+/* Make
+ * creates an object with provided properties
+ * md5 digest needs to be filled in afterward
+ */
+rc_t CChunkFileNodeMake ( CChunkFileNode **np, uint64_t expected )
+{
+ CChunkFileNode *n = malloc ( sizeof * n );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ CCFileNodeInit ( & n -> dad, expected );
+ SLListInit ( & n -> chunks );
+
+ * np = n;
+ return 0;
+}
+
+/* AddChunk
+ * adds a chunk to the chunk file
+ */
+rc_t CChunkFileNodeAddChunk ( CChunkFileNode *self,
+ uint64_t offset, uint64_t size )
+{
+ CChunk *c = malloc ( sizeof * c );
+ if ( c == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ c -> offset = offset;
+ c -> size = size;
+
+ SLListPushTail ( & self -> chunks, & c -> n );
+ return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCCachedFileNode
+ * a file wrapper with cached file name
+ */
+
+/* Make
+ * creates a cached file wrapper
+ */
+rc_t CCCachedFileNodeMake ( CCCachedFileNode **np, const char *path,
+ enum CCType type, const void *entry )
+{
+ CCCachedFileNode *n = malloc ( sizeof * n + strlen ( path ) + 1 );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ strcpy ( ( char* ) ( n + 1 ), path );
+ StringInitCString ( & n -> cached, ( char* ) ( n + 1 ) );
+ n -> entry = ( void* ) entry;
+ n -> type = type;
+
+ * np = n;
+ return 0;
+}
+
+/* Whack
+ */
+void CCCachedFileNodeWhack ( CCCachedFileNode *self )
+{
+ if ( self != NULL )
+ {
+ switch ( self -> type )
+ {
+ case ccFile:
+ CCFileNodeWhack ( self -> entry );
+ break;
+ case ccArcFile:
+ CCArcFileNodeWhack ( self -> entry );
+ break;
+ case ccChunkFile:
+ CChunkFileNodeWhack ( self -> entry );
+ break;
+ }
+ free ( self );
+ }
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCSymlinkNode
+ * a directory entry with a substitution path
+ */
+
+/* Make
+ * creates a symlink object
+ */
+rc_t CCSymlinkNodeMake ( CCSymlinkNode **np, const char *path )
+{
+ CCSymlinkNode *n = malloc ( sizeof * n + strlen ( path ) + 1 );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ strcpy ( ( char* ) ( n + 1 ), path );
+ StringInitCString ( & n -> path, ( char* ) ( n + 1 ) );
+
+ * np = n;
+ return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCName
+ * an entry name in a CCTree
+ */
+
+
+/* Whack
+ */
+static
+void CCNameWhack ( BSTNode *n, void *ignore )
+{
+ CCName *self = ( CCName* ) n;
+ if ( self -> entry != NULL ) switch ( self -> type )
+ {
+ case ccFile:
+ case ccContFile:
+ CCFileNodeWhack ( self -> entry );
+ break;
+ case ccArcFile:
+ CCArcFileNodeWhack ( self -> entry );
+ break;
+ case ccChunkFile:
+ CChunkFileNodeWhack ( self -> entry );
+ break;
+ case ccContainer:
+ CCContainerNodeWhack ( self -> entry );
+ break;
+ case ccSymlink:
+ CCSymlinkNodeWhack ( self -> entry );
+ break;
+ case ccHardlink:
+ break;
+ case ccDirectory:
+ CCTreeWhack ( self -> entry );
+ break;
+ }
+
+ free ( self );
+}
+
+
+/* Make
+ * make a node name
+ */
+static
+rc_t CCNameMake ( CCName **np, KTime_t mtime, CCName *dad,
+ const String *name, enum CCType type, const void *entry )
+{
+ CCName *n = malloc ( sizeof * n + name -> size + 1 );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ string_copy ( ( char* ) ( n + 1 ), name -> size + 1, name -> addr, name -> size );
+ n -> mtime = mtime;
+ n -> dad = dad;
+ n -> entry = ( void* ) entry;
+ StringInit ( & n -> name, ( char* ) ( n + 1 ), name -> size, name -> len );
+ n -> type = ( uint32_t ) type;
+
+ * np = n;
+ return 0;
+}
+
+/* Cmp
+ * Sort
+ */
+static
+int64_t CCNameCmp ( const void *item, const BSTNode *n )
+{
+ const String *a = item;
+ const CCName *b = ( const CCName* ) n;
+ return StringCompare ( a, & b -> name );
+}
+
+static
+int64_t CCNameSort ( const BSTNode *item, const BSTNode *n )
+{
+ const CCName *a = ( const CCName* ) item;
+ const CCName *b = ( const CCName* ) n;
+ int64_t cmp = StringCompare ( & a -> name, & b -> name );
+ if (cmp != 0)
+ return cmp;
+#if 0
+ if (b->type == ccReplaced)
+ return 1;
+#endif
+ return 1; /* make new item always greater than existing n */
+}
+
+
+/*--------------------------------------------------------------------------
+ * CCContainerNode
+ * an archive file entry
+ * a file with a sub-directory
+ */
+
+
+/* Whack
+ */
+void CCContainerNodeWhack ( CCContainerNode *self )
+{
+ if ( self != NULL )
+ {
+ BSTreeWhack ( & self -> sub, CCNameWhack, NULL );
+ switch ( self -> type )
+ {
+ case ccFile:
+ CCFileNodeWhack ( self -> entry );
+ break;
+ case ccArcFile:
+ CCArcFileNodeWhack ( self -> entry );
+ break;
+ case ccChunkFile:
+ CChunkFileNodeWhack ( self -> entry );
+ break;
+ }
+ free ( self );
+ }
+}
+
+/* Make
+ * creates an archive object
+ */
+rc_t CCContainerNodeMake ( CCContainerNode **np,
+ enum CCType type, const void *entry )
+{
+ CCContainerNode *n = malloc ( sizeof * n );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ BSTreeInit ( & n -> sub );
+ n -> entry = ( void* ) entry;
+ n -> type = ( uint32_t ) type;
+
+ * np = n;
+ return 0;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * CCReplacedNode
+ * an archive file entry
+ * a file with a sub-directory
+ */
+
+
+/* Whack
+ */
+void CCReplacedNodeWhack ( CCReplacedNode *self )
+{
+ if ( self != NULL )
+ {
+ switch ( self -> type )
+ {
+ case ccFile:
+ CCFileNodeWhack ( self -> entry );
+ break;
+ case ccArcFile:
+ CCArcFileNodeWhack ( self -> entry );
+ break;
+ case ccChunkFile:
+ CChunkFileNodeWhack ( self -> entry );
+ break;
+ }
+ free ( self );
+ }
+}
+
+/* Make
+ * creates an archive object
+ */
+rc_t CCReplacedNodeMake ( CCReplacedNode **np,
+ enum CCType type, const void *entry )
+{
+ CCReplacedNode *n = malloc ( sizeof * n );
+ if ( n == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ n -> entry = ( void* ) entry;
+ n -> type = ( uint32_t ) type;
+
+ * np = n;
+ return 0;
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * CCTree
+ * a binary search tree with CCNodes
+ */
+
+
+/* Whack
+ */
+void CCTreeWhack ( CCTree *self )
+{
+ if ( self != NULL )
+ {
+ BSTreeWhack ( self, CCNameWhack, NULL );
+ free ( self );
+ }
+}
+
+
+/* Make
+ * make a root tree or sub-directory
+ */
+rc_t CCTreeMake ( CCTree **tp )
+{
+ CCTree *t = malloc ( sizeof * t );
+ if ( t == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcMemory, rcExhausted );
+
+ BSTreeInit ( t );
+
+ * tp = t;
+ return 0;
+}
+
+
+/* Insert
+ * create an entry into a tree
+ * parses path into required sub-directories
+ */
+static
+void CCTreePatchSubdirPath ( BSTNode *n, void *data )
+{
+ CCName *sym = ( CCName* ) n;
+ sym -> dad = data;
+}
+
+static
+rc_t CCTreeVInsert ( CCTree *self, KTime_t mtime,
+ enum CCType type, const void *entry, const char *fmt, va_list args )
+{
+ rc_t rc;
+ size_t sz;
+ String name;
+ CCName *dad, *sym;
+
+ char path [ 4096 ];
+ int i, j, len = vsnprintf ( path, sizeof path, fmt, args );
+ if ( len < 0 || len >= sizeof path )
+ return RC ( rcExe, rcTree, rcInserting, rcPath, rcExcessive );
+
+ while ( len > 0 && path [ len - 1 ] == '/' )
+ path [ -- len ] = 0;
+
+ /* create/navigate path */
+ for ( dad = NULL, i = 0; i < len; i = j + 1 )
+ {
+ for ( j = i; j < len; ++ j )
+ {
+ if ( path [ j ] == '/' )
+ {
+ /* detect non-empty names */
+ sz = j - i;
+ if ( sz != 0 )
+ {
+ CCTree *dir;
+
+ /* ignore '.' */
+ if ( sz == 1 && path [ i ] == '.' )
+ break;
+
+ /* '..' is not allowed */
+ if ( sz == 2 && path [ i ] == '.' && path [ i + 1 ] == '.' )
+ return RC ( rcExe, rcTree, rcInserting, rcPath, rcIncorrect );
+
+ /* get name of directory */
+ StringInit ( & name, & path [ i ], sz, string_len ( & path [ i ], sz ) );
+
+ /* find existing */
+ sym = ( CCName* ) BSTreeFind ( self, & name, CCNameCmp );
+
+ /* handle a hard link */
+ while ( sym != NULL && sym -> type == ccHardlink )
+ sym = sym -> entry;
+
+ /* should be a directory-ish thing */
+ if ( sym != NULL )
+ {
+ switch ( sym -> type )
+ {
+ case ccContainer:
+ case ccArchive:
+ self = & ( ( CCContainerNode* ) sym -> entry ) -> sub;
+ break;
+ case ccDirectory:
+ self = sym -> entry;
+ break;
+ default:
+ return RC ( rcExe, rcTree, rcInserting, rcPath, rcIncorrect );
+ }
+
+ dad = sym;
+ break;
+ }
+
+ /* create new sub-directory */
+ rc = CCTreeMake ( & dir );
+ if ( rc != 0 )
+ return rc;
+
+ /* create directory name */
+ rc = CCNameMake ( & sym, mtime, dad, & name, ccDirectory, dir );
+ if ( rc != 0 )
+ {
+ CCTreeWhack ( dir );
+ return rc;
+ }
+
+ /* enter it into current directory
+ don't need to validate it's unique */
+ BSTreeInsert ( self, & sym -> n, CCNameSort );
+ dad = sym;
+ self = dir;
+ }
+ break;
+ }
+ }
+
+ if ( j == len )
+ break;
+ }
+
+ /* create entry name */
+ if ( i >= len )
+ return RC ( rcExe, rcTree, rcInserting, rcPath, rcIncorrect );
+ sz = len - i;
+ StringInit ( & name, & path [ i ], sz, string_len ( & path [ i ], sz ) );
+
+
+ /* create named entry */
+ rc = CCNameMake ( & sym, mtime, dad, & name, type, entry );
+ if ( rc == 0 )
+ {
+#if 0
+ /* enter it into tree */
+ rc = BSTreeInsertUnique ( self, & sym -> n, NULL, CCNameSort );
+ if ( rc != 0 )
+ free ( sym );
+#else
+ BSTNode * n = BSTreeFind (self, &sym->name, CCNameCmp);
+ if (n != NULL)
+ {
+ CCReplacedNode * rn;
+ CCName * nn = (CCName*)n;
+
+ switch (nn->type)
+ {
+ case ccDirectory:
+ if (sym->type == ccDirectory)
+ {
+ /* better would be to capture directory traits then goto */
+ nn->mtime = sym->mtime;
+
+ /* we aren't yet handling a directory duplicate other than tar files */
+
+ if (((CCContainerNode*)sym->entry)->sub.root != NULL)
+ rc = RC (rcExe, rcTree, rcInserting, rcNode, rcIncorrect);
+
+ goto skip_insert;
+ }
+ default:
+ rc = CCReplacedNodeMake (&rn, nn->type, nn->entry);
+ if (rc == 0)
+ {
+ nn->type = ccReplaced;
+ nn->entry = rn;
+ }
+ }
+ }
+ if (rc == 0)
+ rc = BSTreeInsert (self, &sym->n, CCNameSort);
+ skip_insert:
+ if (rc)
+ free (sym);
+#endif
+ /* if this guy has children, become dad */
+ else if ( entry != NULL ) switch ( type )
+ {
+ case ccContainer:
+ case ccArchive:
+ BSTreeForEach ( & ( ( CCContainerNode* ) entry ) -> sub, false, CCTreePatchSubdirPath, sym );
+ break;
+ case ccDirectory:
+ BSTreeForEach ( entry, false, CCTreePatchSubdirPath, sym );
+ break;
+ default: /* shushing warnings */
+ break;
+ }
+ }
+
+ return rc;
+}
+
+rc_t CCTreeInsert ( CCTree *self, KTime_t mtime,
+ enum CCType type, const void *entry, const char *path, ... )
+{
+ rc_t rc;
+ va_list args;
+
+ va_start ( args, path );
+ rc = CCTreeVInsert ( self, mtime, type, entry, path, args );
+ va_end ( args );
+
+ return rc;
+}
+
+/* Find
+ * find a named node
+ * returns NULL if not found
+ */
+static
+const CCName *CCTreeVFind ( const CCTree *self, const char *fmt, va_list args )
+{
+ size_t sz;
+ String name;
+ CCName /* *dad, */ *sym;
+
+ char path [ 4096 ];
+ int i, j, len = vsnprintf ( path, sizeof path, fmt, args );
+ if ( len < 0 || len >= sizeof path )
+ return NULL;
+
+ while ( len > 0 && path [ len - 1 ] == '/' )
+ path [ -- len ] = 0;
+
+ /* create/navigate path */
+ for ( /* dad = NULL, */ i = 0; i < len; i = j + 1 )
+ {
+ for ( j = i; j < len; ++ j )
+ {
+ if ( path [ j ] == '/' )
+ {
+ /* detect non-empty names */
+ sz = j - i;
+ if ( sz != 0 )
+ {
+ /* ignore '.' */
+ if ( sz == 1 && path [ i ] == '.' )
+ break;
+
+ /* '..' is not allowed */
+ if ( sz == 2 && path [ i ] == '.' && path [ i + 1 ] == '.' )
+ return NULL;
+
+ /* get name of directory */
+ StringInit ( & name, & path [ i ], sz, string_len ( & path [ i ], sz ) );
+
+ /* find existing */
+ sym = ( CCName* ) BSTreeFind ( self, & name, CCNameCmp );
+
+ /* handle hard-link */
+ while ( sym != NULL && sym -> type == ccHardlink )
+ sym = sym -> entry;
+
+ /* handle not found */
+ if ( sym == NULL )
+ return NULL;
+
+ /* loop or return the found object */
+ switch ( sym -> type )
+ {
+ case ccContainer:
+ case ccArchive:
+ self = & ( ( CCContainerNode* ) sym -> entry ) -> sub;
+ break;
+ case ccDirectory:
+ self = sym -> entry;
+ break;
+ default:
+ return NULL;
+ }
+
+ /* dad = sym; */
+ break;
+ }
+ }
+ }
+
+ if ( j == len )
+ break;
+ }
+
+ if ( i >= len )
+ return NULL;
+
+ sz = len - i;
+ StringInit ( & name, & path [ i ], sz, string_len ( & path [ i ], sz ) );
+ return ( const CCName* ) BSTreeFind ( self, & name, CCNameCmp );
+}
+
+
+const CCName *CCTreeFind ( const CCTree *self, const char *path, ... )
+{
+ va_list args;
+ const CCName *name;
+
+ va_start ( args, path );
+ name = CCTreeVFind ( self, path, args );
+ va_end ( args );
+
+ return name;
+}
+
+
+/* Link
+ * create a symlink to existing node
+ */
+rc_t CCTreeLink ( CCTree *self, KTime_t mtime,
+ const char *targ, const char *alias )
+{
+ const CCName *orig = CCTreeFind ( self, targ );
+ if ( orig == NULL )
+ return RC ( rcExe, rcTree, rcInserting, rcPath, rcNotFound );
+
+ return CCTreeInsert ( self, mtime, ccHardlink, orig, alias );
+}
diff --git a/tools/copycat/copycat-priv.h b/tools/copycat/copycat-priv.h
new file mode 100644
index 0000000..77efc7c
--- /dev/null
+++ b/tools/copycat/copycat-priv.h
@@ -0,0 +1,229 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#ifndef _h_copycat_priv_
+#define _h_copycat_priv_
+
+#ifndef _h_cctree_priv_
+#include "cctree-priv.h"
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+ struct KFile;
+struct KTocChunk;
+
+/*--------------------------------------------------------------------------
+ * globals
+ */
+extern uint32_t in_block;
+extern uint32_t out_block;
+extern int verbose; /* program-wide access to verbosity level */
+extern CCTree *ctree; /* tree of nodes as seen while cataloging the input */
+extern CCTree *etree; /* tree of nodes as extracted */
+extern KDirectory *cdir; /* here we 'cache' XML files that get tweaked and passed to laoders */
+extern KDirectory *edir; /* here we extract non container/archive files for use if we can't
+ * load without unpacking */
+extern bool extract_dir; /* if set we are adding directories on extraction to match our
+ * normal output XML */
+extern bool xml_dir; /* if set we will output XML to match our extracted files not
+ * the original packed submission */
+extern bool no_bzip2; /* if true, don't try to decompress bzipped files */
+extern bool no_md5; /* if true, don't calculate md5 sums */
+extern char epath [8192]; /* we build a path down through containes/archives */
+extern char * ehere; /* the pointer to the next character in epath during descent */
+extern KCreateMode cm;
+extern struct KFile *fnull; /* global reference to "/dev/null" or bit bucket KFile */
+
+extern void * dump_out;
+extern char ncbi_encryption_extension[];
+extern char wga_encryption_extension[];
+
+rc_t CC copycat_log_writer (void * self, const char * buffer, size_t buffer_size,
+ size_t * num_writ);
+rc_t CC copycat_log_lib_writer (void * self, const char * buffer, size_t buffer_size,
+ size_t * num_writ);
+
+/*--------------------------------------------------------------------------
+ * copycat
+ */
+typedef struct ccat_pb
+{
+ CCTree * tree;
+ const struct KFile * sf;
+ KTime_t mtime;
+ enum CCType ntype;
+ CCFileNode * node;
+ const char * name;
+} ccat_pb;
+
+/* ccat
+ * non-buffered recursive entrypoint
+ *
+ * "tree" [ IN ] - immediate parent of node
+ *
+ * "src" [ IN ] - file to be analyzed
+ *
+ * "mtime" [ IN ] - modification time of "src"
+ *
+ * "ntype" [ IN ] and "node" [ IN ] - file node and type
+ *
+ * "name" [ IN ] - file leaf name
+ *
+ * use this call if buffering of the parent provides buffering of the child
+ * such as archive formats with no compression such as kar or tar
+ */
+rc_t ccat_md5 ( CCTree *tree, const struct KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name );
+
+/* ccat_buf
+ * buffered recursive entrypoint
+ *
+ * "bsize" [ IN ] - requested buffer size
+ *
+ * use this call when recursing on a type where buffering of the parent won't
+ * help such as decompression or decryption
+ */
+rc_t ccat_buf ( CCTree *tree, const struct KFile *sf, KTime_t mtime,
+ enum CCType ntype, CCFileNode *node, const char *name);
+
+
+/* -----
+ * copycat
+ *
+ * The copycat function is the actual copy and catalog function.
+ * All before this function is called is building toward this.
+ */
+struct VPath;
+rc_t copycat (CCTree *tree, KTime_t mtime, KDirectory * cwd,
+ const struct VPath * src, const struct KFile *sf,
+ const struct VPath * dst, struct KFile *df,
+ const char *spath, const char *name,
+ uint64_t expected_size, bool do_decrypt, bool do_encrypt);
+
+/*--------------------------------------------------------------------------
+ * CCFileFormat
+ */
+typedef struct CCFileFormat CCFileFormat;
+extern CCFileFormat *filefmt;
+
+typedef enum CCFileFormatClass
+{
+ ccffcError = -1,
+ ccffcUnknown,
+ ccffcCompressed,
+ ccffcArchive,
+ ccffcCached,
+ ccffcEncoded
+} CCFileFormatClass;
+
+typedef enum CCFileFormatTypeCompressed
+{
+ ccfftcError = -1,
+ ccfftcUnknown,
+ ccfftcGzip,
+ ccfftcBzip2,
+ ccfftcZip
+} CCFileFormatTypeCompressed;
+
+typedef enum CCFileFormatTypeArchive
+{
+ ccfftaError = -1,
+ ccfftaUnknown,
+ ccfftaTar,
+ ccfftaSra,
+ ccfftaHD5
+} CCFileFormatTypeArchive;
+
+typedef enum CCFileFormatTypeXML
+{
+ ccfftxError = -1,
+ ccfftxUnknown,
+ ccfftxXML
+} CCFileFormatTypeXML;
+
+typedef enum CCFileFormatTypeEncoded
+{
+ ccffteError = -1,
+ ccffteUnknown,
+ ccffteNCBIErrored,
+ ccffteNCBI,
+ ccffteWGAErrored,
+ ccffteWGA
+} CCFileFormatTypeEncoded;
+
+rc_t CCFileFormatMake ( CCFileFormat ** p );
+rc_t CCFileFormatRelease ( const CCFileFormat *self );
+rc_t CCFileFormatGetType ( const CCFileFormat *self, struct KFile const *file,
+ const char *path, char *buffer, size_t buffsize,
+ uint32_t *type, uint32_t *class );
+
+
+rc_t ccat_tar ( CCContainerNode *np, const struct KFile *sf, const char *name );
+rc_t ccat_sra ( CCContainerNode *np, const struct KFile *sf, const char *name );
+
+typedef struct KSubChunkFile KSubChunkFile;
+
+rc_t KFileMakeChunkRead (const struct KFile ** pself,
+ const struct KFile * original,
+ uint64_t size,
+ uint32_t num_chunks,
+ struct KTocChunk * chunks);
+
+bool CCFileFormatIsNCBIEncrypted ( void * buffer );
+bool CCFileFormatIsWGAEncrypted ( void * buffer );
+/*
+ * Use as DEBUG_STATUS(("format",arg,...))
+ */
+#define DEBUG_STATUS(msg) DBGMSG(DBG_APP,1,msg)
+
+
+rc_t copycat_log_set (void * new, void ** prev);
+
+
+struct KFile;
+rc_t CC CCFileMakeRead (const struct KFile ** self,
+ const struct KFile * original, rc_t * prc);
+rc_t CC CCFileMakeUpdate (struct KFile ** self,
+ struct KFile * original, rc_t * prc);
+rc_t CC CCFileMakeWrite (struct KFile ** self,
+ struct KFile * original, rc_t * prc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_copycat_priv_ */
diff --git a/tools/copycat/copycat.c b/tools/copycat/copycat.c
new file mode 100644
index 0000000..78e2771
--- /dev/null
+++ b/tools/copycat/copycat.c
@@ -0,0 +1,1251 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "copycat-priv.h"
+#include "cctree-priv.h"
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/nullfile.h>
+#include <kfs/crc.h>
+#include <klib/checksum.h>
+#include <klib/writer.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/debug.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+
+#include <strtol.h>
+
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/*
+ * some program globals
+ */
+const char * program_name = "copycat"; /* default it but try to set it */
+const char * full_path = "copycat"; /* default it but try to set it */
+int verbose = 0;
+KFile *fnull;
+
+/* cache information */
+CCTree *ctree;
+KDirectory *cdir;
+
+uint32_t in_block = 0;
+uint32_t out_block = 0;
+
+CCTree *etree;
+KDirectory * edir; /* extracted file base kdir */
+char epath[8192];
+char * ehere;
+bool xml_dir = false;
+bool extract_dir = false;
+bool no_bzip2 = false;
+bool no_md5 = false;
+void * dump_out;
+const char * xml_base = NULL;
+
+char ncbi_encryption_extension[] = ".nenc";
+char wga_encryption_extension[] = ".ncbi_enc";
+
+static
+KWrtWriter log_writer;
+static
+KWrtWriter log_lib_writer;
+static
+void * log_data;
+static
+void * log_lib_data;
+
+rc_t CC copycat_log_writer (void * self, const char * buffer, size_t buffer_size,
+ size_t * num_writ)
+{
+ if (self)
+ {
+ void * bf = malloc (sizeof (SLNode) + buffer_size);
+ if (bf)
+ {
+ const char * ps, * pc;
+ size_t z;
+ ps = strchr (buffer, ' ');
+ if (ps)
+ {
+ ++ps;
+ pc = strchr (ps, '-');
+ if (pc == NULL)
+ pc = strchr (ps, ':');
+ if (pc)
+ pc = pc + 2;
+ else
+ pc = ps;
+ }
+ else
+ pc = buffer;
+ z = buffer_size - (pc - buffer);
+ memmove ( (void*)(((SLNode*)bf)+1), pc, z);
+ ((char*)(((SLNode*)bf)+1))[z-1] = '\0';
+ SLListPushTail (self, bf);
+ }
+ }
+ return (log_writer != NULL)
+ ? log_writer (log_data, buffer, buffer_size, num_writ) : 0;
+}
+rc_t CC copycat_log_lib_writer (void * self, const char * buffer, size_t buffer_size,
+ size_t * num_writ)
+{
+ if (self)
+ {
+ void * bf = malloc (sizeof (SLNode) + buffer_size);
+ if (bf)
+ {
+ const char * ps, * pc;
+ size_t z;
+ ps = strchr (buffer, ' ');
+ if (ps)
+ {
+ ++ps;
+ pc = strchr (ps, ':');
+ if (pc)
+ pc = pc + 2;
+ else
+ pc = ps;
+ }
+ else
+ pc = buffer;
+ z = buffer_size - (pc - buffer);
+ memmove ( (void*)(((SLNode*)bf)+1), pc, z);
+ ((char*)(((SLNode*)bf)+1))[z-1] = '\0';
+ SLListPushTail (self, bf);
+ }
+ }
+ return (log_lib_writer != NULL)
+ ? log_lib_writer (log_lib_data, buffer, buffer_size, num_writ) : 0;
+}
+
+static
+rc_t copycat_log_unset ()
+{
+ rc_t rc_l, rc_ll;
+
+ rc_l = KLogHandlerSet (log_writer, log_data);
+ rc_ll = KLogHandlerSet (log_lib_writer, log_lib_data);
+
+ return (rc_l != 0) ? rc_l : rc_ll;
+}
+
+rc_t copycat_log_set (void * new, void ** prev)
+{
+ rc_t rc;
+
+ if (prev)
+ *prev = KLogDataGet();
+
+ rc = KLogHandlerSet (copycat_log_writer, new);
+ if (rc == 0)
+ rc = KLogLibHandlerSet (copycat_log_lib_writer, new);
+
+ if (rc)
+ copycat_log_unset ();
+
+ return rc;
+}
+
+/* global create mode */
+KCreateMode cm = kcmParents | kcmCreate;
+
+#define OPTION_CACHE "cache-dir"
+#define OPTION_FORCE "force"
+#define OPTION_DEST "output"
+#define OPTION_EXTRACT "extract"
+#define OPTION_EXTDIR "extract-to-dir"
+#define OPTION_XMLDIR "xml-dir"
+#define OPTION_DECPWD "decryption-password"
+#define OPTION_ENCPWD "encryption-password"
+#define OPTION_XMLBASE "xml-base-node"
+#define OPTION_INBLOCK "input-buffer"
+#define OPTION_OUTBLOCK "output-buffer"
+#define OPTION_NOBZIP2 "no-bzip2"
+#define OPTION_NOMD5 "no-md5"
+
+#define ALIAS_CACHE "x"
+#define ALIAS_FORCE "f"
+#define ALIAS_DEST "o"
+#define ALIAS_EXTRACT "e"
+#define ALIAS_EXTDIR "E"
+#define ALIAS_XMLDIR "X"
+#define ALIAS_DECPWD ""
+#define ALIAS_ENCPWD ""
+#define ALIAS_XMLBASE ""
+#define ALIAS_INBLOCK ""
+#define ALIAS_OUTBLOCK ""
+#define ALIAS_NOBZIP2 ""
+#define ALIAS_NOMD5 ""
+
+
+
+static
+const char * extract_usage[] =
+{ "location of extracted files", NULL };
+static
+const char * cache_usage[] =
+{ "location of output cached files", NULL };
+static
+const char * force_usage[] =
+{ "force overwrite of existing files", NULL };
+static
+const char * dest_usage[] =
+{ "location of output", NULL };
+static
+const char * xmldir_usage[] =
+{ "XML matches extracted files", NULL };
+static
+const char * extdir_usage[] =
+{ "extracted directories match normal XML", NULL };
+static
+const char * xmlbase_usage[] =
+{ "use this to base the XML not destination; can only be used with a single source", NULL };
+static
+const char * inblock_usage[] =
+{ "system file reads are of blocks of this size", NULL };
+static
+const char * outblock_usage[] =
+{ "system file writes are of blocks of this size", NULL };
+static
+const char * no_bzip2_usage[] =
+{ "do not decompress files compressed with bzip2", NULL };
+const char * no_md5_usage[] =
+{ "do not calculate md5 hashes", NULL };
+
+
+const char UsageDefaultName [] = "copycat";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] src-file dst-file\n"
+ " %s [options] src-file [src-file...] dst-dir\n"
+ " %s [options] -o dst-dir src-file [src-file...]\n"
+ "\n"
+ "Summary:\n"
+ " Copies files and/or directories, creating a catalog of the copied files.\n",
+ progname, progname, progname);
+}
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ HelpOptionLine (ALIAS_CACHE, OPTION_CACHE, "dir-path", cache_usage);
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+ HelpOptionLine (ALIAS_DEST, OPTION_DEST, "file-path", dest_usage);
+ HelpOptionLine (ALIAS_EXTRACT, OPTION_EXTRACT, "dir-path", extract_usage);
+ HelpOptionLine (ALIAS_EXTDIR, OPTION_EXTDIR, NULL, extdir_usage);
+ HelpOptionLine (ALIAS_XMLDIR, OPTION_XMLDIR, NULL, xmldir_usage);
+ HelpOptionLine (ALIAS_INBLOCK, OPTION_INBLOCK, "size-in-KB", inblock_usage);
+ HelpOptionLine (ALIAS_OUTBLOCK,OPTION_OUTBLOCK, "size-in-KB", outblock_usage);
+ HelpOptionLine (ALIAS_NOBZIP2,OPTION_NOBZIP2, NULL, no_bzip2_usage);
+ HelpOptionLine (ALIAS_NOMD5,OPTION_NOMD5, NULL, no_md5_usage);
+ HelpOptionsStandard ();
+
+
+
+/* 1 2 3 4 5 6 7 8 */
+/* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */
+ OUTMSG (("Use:\n"
+ " Copy and catalog:\n"
+ " Some quick examples:\n"
+ " %s dir/file.tar other-dir/file.tar\n"
+ " copy file.tar from dir to other-dir and write the catalog to stdout\n"
+ " %s dir/file.tar otherdir/\n"
+ " the same\n", progname,progname));
+ OUTMSG ((" %s \"ncbi-file:dir/file.tar.nenc?encrypt&pwfile=pw other-dir.file.tar\n"
+ " copy and decrypt file.tar.nenc from dir to other-dir and catalog\n"
+ " %s dir/file.tar \"ncbi-file:other-dir/file.tar.nenc?encrypt&pwfile=pw\n"
+ " copy and encrypt file.tar from dir to other-dir/file.tar.nenc and catalog\n"
+ " %s \"ncbi-file:dir/file.tar.nenc?encrypt&pwfile=pw1 \\\n"
+ " \"ncbi-file:other-dir/file.tar.nenc?encrypt&pwfile=pw2\n"
+ " copy the file as above while changing the encryption\n"
+ "\n", progname, progname, progname));
+ OUTMSG (("Use:\n"
+ " Copy source file[s] to a destination file or directory.\n"
+ " File names can either be typical path names or they can be URLs (IRLs) using\n"
+ " the standard \"file\" or extended \"ncbi-file\" schemes.\n"
+ " The catalog is XML output sent by default to stdout.\n"
+ " As UTF-8 is accepted in the paths they are IRLs for International Resource\n"
+ " Locators.\n"
+ "\n"));
+ OUTMSG ((" If the specified destination does not exist, there could be an ambiguity\n"
+ " whether the destination is supposed to be a file or directory. If the\n"
+ " entered path ends in a '/' character or if there is more than one source\n"
+ " it is assumed to mean a directory and is created as such. If neither of\n"
+ " of those apply it is assumed to be a file.\n"
+ "\n"));
+ OUTMSG ((" The sources or destination may also be special Unix devices:\n"
+ " /dev/stdin is supported as a source.\n"
+ " /dev/stdout and /dev/stderr is supported as a destination.\n"
+ " Other file descriptor devices can be used in the form:\n"
+ " /dev/fd/<fd-number>\n"));
+ OUTMSG ((" For example /dev/stdin is synonymous with /dev/fd/0 as a source.\n"
+ " If /dev/stdout or /dev/fd/1 is used as the destination then the XML\n"
+ " output is redirected to /dev/stderr (/dev/fd/2).\n"
+ " Device /dev/null as the destination is treated as a file with only one\n"
+ " source but as a directory if more than one source. Using this device\n"
+ " means no actual file will be copied but the cataloging will be done but\n"
+ " " OPTION_XMLBASE " must be used.\n"
+ "\n"));
+ OUTMSG ((" These special devices can be entered using the URL (IRL) schemes if\n"
+ " desired. This allows the use of 'query' decorators.\n"
+ " \n"));
+ OUTMSG ((" If a query is added to the URL it will need to be enclosed within '\"\'\n"
+ " characters on a command line to prevent premature interpretation.\n"
+ " The query for the 'ncbi-file' extension to the 'file' scheme allows\n"
+ " encryption and decryption. The supported query is introduced by the\n"
+ " standard URI/IRI syntax of a '?' character with a '&' character\n"
+ " separating individual query-entries.\n"
+ "\n"));
+ OUTMSG ((" The supported query entries are:\n"
+ " 'encrypt' or 'enc' to mean the input may be encrypted or the output\n"
+ " will be encrypted,\n"
+ " 'pwfile=<path>' gives the path to file containing the password.\n"
+ " 'pwfd=<FD>' gives the numerical file descriptor from which to read\n"
+ " the password,\n"
+ "\n"));
+ OUTMSG ((" In this program the encrypted input can apply to a file contained within\n"
+ " the source rather than just the source file itself. The tool is fully\n"
+ " compatible with all versions of NCBI encryption.\n"
+ "\n"
+ " If the output is to be encrypted only the newer FIPS compliant encryption\n"
+ " will be used and applies to the whole file.\n"
+ "\n"));
+ OUTMSG (("NOTE: Not all combinations of URL specifications will work at this point.\n"
+ "\n"
+ "NOTE: using the same file descriptor for multiple sources or overlapping with\n"
+ " stdin/stdout/stderr may cause undefined behavior including hanging the\n"
+ " the program.\n"
+ "\n"));
+ OUTMSG ((" The '-x' option allows small files that are typed as eligible for\n"
+ " caching to be copied to the cache directory provided. the directory\n"
+ " will be created if necessary.\n"
+ " the intent is to capture top-level files, such that files are copied\n"
+ " into the flat cache directory without regard to where they were found\n"
+ " in the input hierarchy. in the case of name conflict, output files will\n"
+ " be renamed.\n"
+ "\n"));
+ OUTMSG ((" To prevent internal decompression of bzipped files, use the option\n"
+ " '--no-bzip2'\n"
+ "\n"));
+ OUTMSG ((" To prevent calculation of MD5 hashes, use the option\n"
+ " '--no-md5'\n"
+ "\n"));
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_EXTRACT, ALIAS_EXTRACT, NULL, extract_usage, 1, true, false },
+ { OPTION_EXTDIR, ALIAS_EXTDIR, NULL, extdir_usage, 0, false, false },
+ { OPTION_XMLDIR, ALIAS_XMLDIR, NULL, xmldir_usage, 0, false, false },
+ { OPTION_CACHE, ALIAS_CACHE, NULL, cache_usage, 1, true, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false },
+ { OPTION_DEST, ALIAS_DEST, NULL, dest_usage, 1, true, false },
+ { OPTION_XMLBASE, ALIAS_XMLBASE, NULL, xmlbase_usage, 1, true, false },
+ { OPTION_INBLOCK, ALIAS_OUTBLOCK,NULL, inblock_usage, 1, true, false },
+ { OPTION_OUTBLOCK,ALIAS_OUTBLOCK,NULL, outblock_usage,1, true, false },
+ { OPTION_NOBZIP2, ALIAS_NOBZIP2, NULL, no_bzip2_usage,0, false, false },
+ { OPTION_NOMD5, ALIAS_NOMD5, NULL, no_md5_usage, 0, false, false }
+};
+
+/* file2file
+ */
+static
+rc_t copycat_file2file (CCTree * tree,
+ SLList * logs,
+ VFSManager * mgr,
+ VPath * _src,
+ VPath * _dst,
+ const char * leaf)
+{
+ size_t sz;
+ rc_t rc;
+ bool do_encrypt;
+ bool do_decrypt;
+ char spath [8192];
+
+ do_decrypt = (VPathOption (_src, vpopt_encrypted, spath, sizeof spath, &sz) == 0);
+ do_encrypt = (VPathOption (_dst, vpopt_encrypted, spath, sizeof spath, &sz) == 0);
+
+ /* we can't use the automagical nature of the VPath and its query part
+ * because copycat needs to peek under the hood; but we want the automagical
+ * ability to handle it's path part.
+ */
+
+ rc = VPathReadPath (_src, spath, sizeof spath, &sz);
+ if (rc)
+ LOGERR (klogInt, rc, "error rereading built source path");
+ else
+ {
+ char dpath [8192];
+ size_t dz;
+
+ rc = VPathReadPath (_dst, dpath, sizeof dpath, &dz);
+ if (rc)
+ LOGERR (klogInt, rc, "error rereading built source path");
+ else
+ {
+ KDirectory * cwd;
+
+ rc = VFSManagerGetCWD (mgr, &cwd);
+ if (rc)
+ LOGERR (klogInt, rc, "error pulling directory out of manager");
+ else
+ {
+ KTime_t mtime = 0;
+ bool src_dev = false;
+ bool dst_dev = false;
+
+ if (strncmp (spath, "/dev/", sizeof "/dev/"-1) == 0)
+ {
+ /* get date from file system
+ [this won't be either the submitter original date
+ nor the mod-date within the file system, unless
+ the date gets reset...] */
+ mtime = time (NULL);
+ src_dev = true;
+ }
+ else
+ {
+ rc = KDirectoryDate (cwd, &mtime, "%s", spath);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "failed to determine modtime for '$(path)' continuing", "path=%s", spath ));
+ mtime = time (NULL);
+ rc = 0;
+ }
+ }
+ if (strncmp (dpath, "/dev/", sizeof "/dev/" - 1) == 0)
+ {
+ if (strcmp(dpath, "/dev/stdout") == 0 ||
+ strcmp(dpath, "/dev/fd/1") == 0)
+ {
+ dump_out = stderr;
+ }
+ dst_dev = true;
+
+ if (src_dev && (xml_base == NULL))
+ {
+ rc = RC (rcExe, rcArgv, rcAccessing, rcParam, rcNull);
+ LOGERR (klogErr, rc, "Must provide " OPTION_XMLBASE
+ " when using a device stream as output");
+ }
+ }
+ if (rc == 0)
+ {
+ char * sleaf;
+ char * dleaf;
+ char * ext;
+ VPath * src;
+ size_t xz;
+ char xpath [8192]; /* way over sized - its a leaf only */
+
+ sleaf = strrchr (spath, '/');
+ if (sleaf++ == NULL)
+ sleaf = spath;
+
+ dleaf = strrchr (dpath, '/');
+ if (dleaf++ == NULL)
+ dleaf = dpath;
+
+ xz = strlen (leaf);
+ memmove (xpath, leaf, xz + 1);
+
+ /* if we are encrypting the output make sure we have an encryption
+ * extension on the destination.
+ */
+ if (do_decrypt)
+ {
+ ext = strrchr (xpath, '.');
+ if (ext == NULL)
+ ext = xpath;
+ if ((strcmp (ext, ncbi_encryption_extension) == 0) ||
+ (strcmp (ext, wga_encryption_extension) == 0))
+ *ext = '\0';
+ }
+ else
+ ext = xpath + strlen (xpath);
+
+ if (do_encrypt)
+ {
+ strcpy (ext, ncbi_encryption_extension);
+
+ if (!dst_dev)
+ {
+ ext = strrchr (dleaf, '.');
+ if (ext == NULL)
+ ext = dleaf + strlen (dleaf);
+
+ if (strcmp (ext, ncbi_encryption_extension) != 0)
+ strcat (ext, ncbi_encryption_extension);
+ }
+ }
+
+ rc = VFSManagerMakePath (mgr, &src, "%s", spath);
+ if (rc)
+ LOGERR (klogErr, rc, "error rebuilding source path");
+ else
+ {
+ VPath * dst;
+
+ rc = VFSManagerMakePath (mgr, &dst, "%s", dpath);
+ if (rc)
+ LOGERR (klogErr, rc, "error rebuilding source path");
+ else
+ {
+
+ /* never allow overwrite of something already there */
+ if (CCTreeFind (tree, xpath) != NULL ) /* dleaf? xpath? */
+ {
+ rc = RC ( rcExe, rcFile, rcCopying, rcPath, rcExists );
+ PLOGERR ( klogInt, (klogInt, rc, "will not overwrite "
+ "just-created '$(path)'", "path=%s", xpath ));
+ }
+ else
+ {
+ const KFile * sf;
+
+ rc = VFSManagerOpenFileRead (mgr, &sf, src);
+ if (rc)
+ PLOGERR (klogFatal,
+ (klogFatal, rc,
+ "error opening input '$(P)'", "P=%s", spath));
+ else
+ {
+ uint64_t expected;
+
+ rc = KFileSize (sf, &expected);
+ if (rc)
+ {
+ if (GetRCState (rc) == rcUnsupported)
+ {
+ expected = rcUnsupported;
+ rc = 0;
+ }
+ }
+ if (rc == 0)
+ {
+ KFile * df;
+
+ rc = VFSManagerCreateFile (mgr, &df, false, 0640, cm, dst);
+ if (GetRCState (rc) == rcUnauthorized)
+ {
+ uint32_t access;
+ rc_t orc;
+
+ orc = KDirectoryAccess (cwd, &access, "%s", dpath);
+ if (orc == 0)
+ {
+ orc = KDirectorySetAccess (cwd, false, 0640, 0777, "%s", dpath);
+ if (orc == 0)
+ {
+ rc = VFSManagerCreateFile (mgr, &df, false, 0640, cm, dst);
+ if (rc)
+ KDirectorySetAccess (cwd, false, access, 0777, "%s", dpath);
+ }
+ }
+ }
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to creat destination file '$(path)'",
+ "path=%s", dpath));
+ else
+ {
+ rc_t orc;
+
+ log_writer = KLogWriterGet();
+ log_lib_writer = KLogLibWriterGet();
+ log_data = KLogDataGet();
+ log_lib_data = KLogLibDataGet();
+
+ rc = copycat_log_set (logs, NULL);
+ if (rc == 0)
+ {
+ DEBUG_STATUS (("\n-----\n%s: call copycat (tree(%p), mtime(%lu),"
+ " cwd(%p), _src(%p), sf(%p), _dst(%p), df(%p), "
+ "spath(%s), leaf(%s), expected(%lu), do_decrypt(%d)"
+ " do_encrypt(%d))\n\n", __func__,
+ tree, mtime, cwd, _src, sf, _dst, df, spath,
+ xpath, expected, do_decrypt, do_encrypt));
+ rc = copycat (tree, mtime, cwd, _src, sf, _dst, df, spath,
+ xpath, expected, do_decrypt, do_encrypt);
+
+ orc = copycat_log_unset();
+ }
+
+ if (rc)
+ LOGERR (klogFatal, rc, "copycat function failed");
+ else
+ rc = orc;
+
+ KFileRelease (df);
+ }
+ }
+ KFileRelease (sf);
+ }
+ }
+ VPathRelease (dst);
+ }
+ VPathRelease (src);
+ }
+ }
+ KDirectoryRelease (cwd);
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* files2dir
+ */
+static
+rc_t copycat_files2dir (CCTree * tree, SLList * logs, VFSManager * mgr, Vector * v, VPath * dst)
+{
+ size_t dz;
+ uint32_t ix;
+ rc_t rc;
+ char dbuff [8192];
+
+ /* xml-base only works for a single file */
+ if ((VectorLength (v) > 1) && (xml_base != NULL))
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcIncorrect);
+ LOGERR (klogErr, rc, "Can only use " OPTION_XMLBASE " with a single source file");
+ return rc;
+ }
+
+ /* get the path out of the destination VPath */
+ rc = VPathReadPath (dst, dbuff, sizeof dbuff, &dz);
+ if (rc)
+ return rc;
+
+ for (ix = 0; ix < VectorLength (v); ++ix)
+ {
+ VPath * new_dst;
+ VPath * src;
+ char * sleaf;
+ size_t sz;
+ char sbuff [8192];
+
+ src = (VPath*) VectorGet (v, ix);
+ if (src == NULL) /* warn? error? abort? */
+ continue;
+
+
+ rc = VPathReadPath (src, sbuff, sizeof sbuff, &sz);
+ if (rc)
+ return rc;
+
+ sleaf = strrchr (sbuff, '/');
+ if (sleaf++ == NULL)
+ sleaf = sbuff;
+
+ /* the special case destination is the null device which we treat
+ * as if it was a directory at first and then as a file
+ */
+ if (strcmp (dbuff, "/dev/null") == 0)
+ {
+ rc = VPathAddRef (dst);
+ if (rc != 0)
+ break;
+ new_dst = dst;
+ }
+ else
+ {
+ DEBUG_STATUS(("%s: %s (%lu)\n", __func__, dbuff, dz));
+
+ /* fix up the destination path if it's missing a final '/'
+ * this is inside the loop because of the null device special case
+ */
+ if (dbuff [dz-1] != '/')
+ {
+ dbuff [dz++] = '/';
+ dbuff [dz] = '\0';
+ }
+
+ /* append source leaf to destination path */
+ string_copy (dbuff + dz, sizeof dbuff - dz, sleaf, strlen (sleaf));
+
+ DEBUG_STATUS(("%s: %s\n", __func__, dbuff));
+
+ /* make a new VPath - no URI stuff gets transferred here */
+ rc = VFSManagerMakePath (mgr, &new_dst, "%s", dbuff);
+ if (rc)
+ break;
+ }
+
+ /* do this one file copy and catalog now */
+ rc = copycat_file2file (tree, logs, mgr, src, new_dst, xml_base ? xml_base : sleaf);
+
+ VPathRelease (new_dst);
+ }
+ return rc;
+}
+
+
+/* run
+ *
+ * dest will be set if the -o option was used.
+ *
+ */
+static
+rc_t copycat_run ( CCTree *tree, SLList * logs, VFSManager * mgr,
+ const char *cache, VPath * _dest, const char *extract,
+ Vector * v)
+{
+ rc_t rc;
+ int dest_type;
+ KDirectory * cwd;
+ VPath * dest;
+ size_t sz;
+ const char * pleaf;
+ char pbuff [4096];
+
+ /* =====
+ * directories aren't yet using the VFSManager to open them
+ * because we have to get more under the covers for our cataloging
+ */
+
+ rc = VFSManagerGetCWD (mgr, &cwd);
+ if (rc)
+ return rc;
+
+ /* if there's a cache path, create directory */
+ if ( cache != NULL )
+ {
+ rc = KDirectoryCreateDir ( cwd, 0775, kcmParents | kcmOpen, "%s", cache );
+ if ( rc == 0 )
+ rc = KDirectoryOpenDirUpdate ( cwd, & cdir, true, "%s", cache );
+ if ( rc != 0 )
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to open cache directory '$(path)'",
+ "path=%s", cache ));
+ return rc;
+ }
+ }
+ else
+ cdir = NULL;
+
+ /* if there's a extract path, create directory */
+ if ( extract != NULL )
+ {
+ rc = KDirectoryCreateDir (cwd, 0775, kcmParents | kcmOpen, "%s", extract);
+ if ( rc == 0 )
+ rc = KDirectoryOpenDirUpdate (cwd, & edir, true, "%s", extract);
+ if ( rc != 0 )
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "failed to open extract directory '$(path)'",
+ "path=%s", extract ));
+ return rc;
+ }
+ }
+ else
+ edir = NULL;
+
+ dest = _dest;
+ if (dest == NULL)
+ {
+ rc = VectorRemove (v, VectorLength(v) - 1, (void**)&dest);
+ if (rc)
+ return rc;
+ }
+
+ rc = VPathReadPath (dest, pbuff, sizeof pbuff, &sz);
+ if (rc)
+ return rc;
+
+ if (xml_base)
+ pleaf = xml_base;
+ else
+ {
+ pleaf = strrchr (pbuff, '/');
+ if (pleaf++ == NULL)
+ pleaf = pbuff;
+ }
+
+
+ /* check destination type */
+ dest_type = KDirectoryPathType (cwd, "%s", pbuff);
+ DEBUG_STATUS(("%s: checked destination type for '%s' got '%u'\n", __func__, pbuff, dest_type));
+ switch (dest_type & ~ kptAlias)
+ {
+ case kptNotFound:
+ /* this is the potentially ambiguous situation
+ * if only two arguments and the last isn't definitively a directory
+ * we assume its supposed to be a file.
+ *
+ * If the target does not exist but it's path ends in '/' or if
+ * there is more than one source we know it is supposed to be a
+ * directory.
+ */
+ if ((pbuff[sz-1] != '/')
+/* ((pbuff[sz-1] != '.') */
+
+
+
+/* ( */
+/* )) */
+ && (VectorLength (v) == 1))
+ {
+ return copycat_file2file (tree, logs, mgr, VectorGet (v, 0), dest, pleaf);
+ }
+
+ /* create a directory at the given path */
+ rc = KDirectoryCreateDir ( cwd, 0775, kcmParents | kcmOpen, "%s", pbuff );
+ if ( rc != 0 )
+ return rc;
+
+ /* fall through */
+ case kptDir:
+ return copycat_files2dir (tree, logs, mgr, v, dest);
+
+
+ case kptCharDev:
+ /*
+ * special case NULL device can act like a directory here
+ * all other 'devices' we treat as a file
+ */
+ if ( strcmp ( pbuff, "/dev/null" ) == 0 )
+ {
+#if 0
+ if (VectorLength (v) > 1)
+#endif
+ return copycat_files2dir (tree, logs, mgr, v, dest);
+ }
+ /* fall through */
+ case kptBlockDev:
+ case kptFIFO:
+ case kptFile:
+ if (VectorLength (v) == 1)
+ return copycat_file2file (tree, logs, mgr, VectorGet (v, 0), dest, pleaf);
+
+ rc = RC (rcExe, rcDirectory, rcAccessing, rcPath, rcNotFound);
+ PLOGERR (klogFatal,
+ (klogFatal, rc, "copying multiple files, but target argument "
+ "[$(D)] is not a directory", "D=%s", pbuff));
+ return rc;
+ }
+
+ fprintf ( stderr, "%s: '%s': specified destination path is not a directory\n", program_name, pbuff );
+ return RC ( rcExe, rcDirectory, rcAccessing, rcPath, rcIncorrect );
+}
+/* dump
+ */
+static
+rc_t copycat_fwrite ( void *out, const void *buffer, size_t bytes )
+{
+ size_t writ = fwrite ( buffer, 1, bytes, out );
+ if ( writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+static
+rc_t copycat_dump ( const CCTree *tree, SLList * logs )
+{
+ return CCTreeDump ( tree, copycat_fwrite, dump_out, logs );
+}
+
+static
+void param_whack (void * path, void * ignored)
+{
+ (void)VPathRelease ((const VPath*)path);
+}
+
+/* KMain
+ */
+
+rc_t KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc, orc;
+
+ KStsHandlerSetStdErr();
+ KStsLibHandlerSetStdErr();
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc == 0)
+ {
+ /* CS-101: DO WHILE ( 0 ) LOOPS ARE CUTE FOR AVOIDING GOTO,
+ BUT IT MEANS YOU HAVE TO PUT ALL OF YOUR CLEANUP OUTSIDE
+ OF THE LOOP, IN ORDER TO BREAK OUT IN A NON-STRUCTURED WAY */
+ do
+ {
+ const char * dest;
+ const char * cache;
+ const char * extract = NULL;
+
+ uint32_t pcount;
+ CCTree * tree;
+ VFSManager * mgr = NULL;
+ VPath * dp = NULL;
+ Vector params = { NULL, 0, 0, 0};
+ uint32_t ix;
+
+ rc = ArgsProgram (args, &full_path, &program_name);
+ if (rc)
+ break;
+
+ extract_dir = false;
+ xml_dir = false;
+ memset (epath, 0, sizeof (epath));
+ ehere = epath;
+
+ rc = ArgsOptionCount (args, OPTION_CACHE, &pcount);
+ if (rc)
+ break;
+ if (pcount)
+ {
+ rc = ArgsOptionValue (args, OPTION_CACHE, 0, (const void **)&cache);
+ if (rc)
+ break;
+ }
+ else
+ cache = NULL;
+
+ rc = ArgsOptionCount (args, OPTION_DEST, &pcount);
+ if (rc)
+ break;
+ if (pcount)
+ {
+ rc = ArgsOptionValue (args, OPTION_DEST, 0, (const void **)&dest);
+ if (rc)
+ break;
+ }
+ else
+ {
+ dest = NULL;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_EXTRACT, &pcount);
+ if (rc)
+ break;
+ if (pcount)
+ {
+ rc = ArgsOptionValue (args, OPTION_EXTRACT, 0, (const void **)&extract);
+ if (rc)
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_EXTDIR, &pcount);
+ if (rc)
+ break;
+ extract_dir = pcount > 0;
+
+ rc = ArgsOptionCount (args, OPTION_XMLDIR, &pcount);
+ if (rc)
+ break;
+ xml_dir = pcount > 0;
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ break;
+ if (pcount)
+ cm = kcmParents | kcmInit;
+
+ rc = ArgsOptionCount (args, OPTION_XMLBASE, &pcount);
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_XMLBASE, 0, (const void **)&xml_base);
+ if (rc)
+ break;
+
+ /* we might want a few more checks here... */
+ if (strchr (xml_base, '/') != NULL)
+ {
+ rc = RC (rcExe, rcArgv, rcAccessing, rcParam, rcInvalid);
+ break;
+ }
+ }
+
+ rc = ArgsOptionCount (args, OPTION_INBLOCK, &pcount);
+ if (pcount == 1)
+ {
+ const char * start;
+ char * end;
+ uint32_t val;
+
+ rc = ArgsOptionValue (args, OPTION_INBLOCK, 0, (const void **)&start);
+ if (rc)
+ break;
+
+ val = strtou32 (start, &end, 10);
+
+ if (*end != '\0')
+ {
+ rc = RC (rcExe, rcArgv, rcAccessing, rcParam, rcInvalid);
+ break;
+ }
+ in_block = val * 1024;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_OUTBLOCK, &pcount);
+ if (pcount == 1)
+ {
+ const char * start;
+ char * end;
+ uint32_t val;
+
+ rc = ArgsOptionValue (args, OPTION_OUTBLOCK, 0, (const void **)&start);
+ if (rc)
+ break;
+
+ val = strtou32 (start, &end, 10);
+
+ if (*end != '\0')
+ {
+ rc = RC (rcExe, rcArgv, rcAccessing, rcParam, rcInvalid);
+ break;
+ }
+ out_block = val * 1024;
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_NOBZIP2, & pcount );
+ if ( pcount > 0 )
+ {
+ no_bzip2 = true;
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_NOMD5, & pcount );
+ if ( pcount > 0 )
+ {
+ no_md5 = true;
+ }
+
+ /* all parameters plus the possible dest option parameter */
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0)
+ {
+ rc = RC ( rcExe, rcArgv, rcReading, rcParam, rcInsufficient );
+ MiniUsage (args);
+ break;
+ }
+
+ if ((dest == NULL) && (extract == NULL) && (pcount < 2))
+ {
+ rc = RC ( rcExe, rcArgv, rcReading, rcParam, rcInvalid );
+ if (pcount)
+ LOGERR (klogFatal, rc, "missing source and destination arguments\n");
+ else
+ LOGERR (klogFatal, rc, "missing destination argument[s]\n");
+ break;
+ }
+
+ VectorInit (¶ms, 0, 8); /* 8 is arbirary - seems long enough for no realloc */
+
+ rc = VFSManagerMake (&mgr);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc,
+ "unable to build file system manager");
+ break;
+ }
+
+ for (ix = 0; ix < pcount; ++ix)
+ {
+ VPath * kp;
+ const char * pc;
+
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "unable to extract path parameter");
+ break;
+ }
+
+ rc = VFSManagerMakePath (mgr, &kp, "%s", pc);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "unable to build path parameter");
+ break;
+ }
+
+ rc = VectorSet (¶ms, ix, kp);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "unable to stow path parameter");
+ break;
+ }
+ }
+ if (rc == 0)
+ {
+ if (dest)
+ {
+ rc = VFSManagerMakePath (mgr, &dp, "%s", dest);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "unable to build dest parameter");
+ break;
+ }
+ }
+ DEBUG_STATUS(("%s: Create file tree\n", __func__));
+ rc = CCTreeMake (&tree);
+ if (rc)
+ {
+ LOGERR ( klogInt, rc, "failed to create parse tree" );
+ }
+ else
+ {
+ DEBUG_STATUS(("%s: Create cache file tree\n", __func__));
+
+ rc = CCTreeMake (&ctree);
+ if (rc)
+ {
+ LOGERR ( klogInt, rc, "failed to create cache tree" );
+ }
+ else
+ {
+ DEBUG_STATUS(("%s: Create extracted file tree\n",
+ __func__));
+
+ rc = CCTreeMake (&etree);
+ if (rc)
+ {
+ LOGERR ( klogInt, rc,
+ "failed to create extract tree" );
+ }
+ else
+ {
+ DEBUG_STATUS(("%s: Create NULL output file\n",
+ __func__));
+ rc = KFileMakeNullUpdate (&fnull);
+ if (rc)
+ LOGERR (klogInt, rc,
+ "failed to create null output");
+ else
+ {
+ DEBUG_STATUS(("%s: Open File Format Tester\n",
+ __func__));
+
+ rc = CCFileFormatMake ( & filefmt );
+ if ( rc != 0 )
+ LOGERR (klogInt, rc,
+ "failed to create file format" );
+ else
+ {
+ SLList logs;
+
+ DEBUG_STATUS(("%s: Initialize CRC32\n",
+ __func__));
+
+ SLListInit (&logs);
+ CRC32Init ();
+
+ DEBUG_STATUS(("%s: Copy and catalog\n",
+ __func__));
+
+ dump_out = stdout; /* kludge */
+
+ rc = copycat_run (tree, &logs, mgr, cache,
+ dp, extract, ¶ms);
+ if ( rc == 0 )
+ rc = copycat_dump ( xml_dir ? etree : tree, &logs );
+ DEBUG_STATUS(("%s: Output XML\n", __func__));
+
+
+ CCFileFormatRelease ( filefmt );
+ }
+
+ DEBUG_STATUS(("%s: Release NULL output file\n", __func__));
+
+ orc = KFileRelease ( fnull ), fnull = NULL;
+ if (rc == 0)
+ rc = orc;
+ }
+ DEBUG_STATUS(("%s: Whack extracted file tree;\n", __func__));
+ CCTreeWhack (etree);
+ }
+ DEBUG_STATUS(("%s: Whack cache file tree;\n", __func__));
+ CCTreeWhack (ctree);
+ }
+ DEBUG_STATUS(("%s: Whack file tree;\n", __func__));
+ CCTreeWhack (tree);
+ }
+
+ VPathRelease (dp);
+ }
+ VFSManagerRelease (mgr);
+ VectorWhack (¶ms, param_whack, NULL);
+ } while (0);
+ }
+ ArgsWhack (args);
+ orc = KDirectoryRelease (cdir); /* class extren should be NULL if never used */
+ if (orc)
+ {
+ LOGERR (klogInt, rc, "Error shutting file system access");
+ if (rc == 0)
+ rc = orc;
+ }
+ DEBUG_STATUS(("%s: exit rc %R(%x);\n", __func__, rc, rc));
+ return rc;
+}
+
diff --git a/tools/copycat/debug.h b/tools/copycat/debug.h
new file mode 100644
index 0000000..b47d440
--- /dev/null
+++ b/tools/copycat/debug.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#ifndef _h_copycat_debug_
+#define _h_copycat_debug_
+
+#include <klib/debug.h>
+
+#ifndef _h_kfs_impl_
+#include <kfs/impl.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DEBUG_MSG_PASTE(a,b) a##b
+#define DEBUG_MSG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(DEBUG_MSG_PASTE(DBG_APP_,flag)), msg)
+#define DEBUG_ENTRY() DEBUG_MSG(10,("Enter: %s\n", __func__))
+
+/*--------------------------------------------------------------------------
+ * application debug stuff
+ */
+
+/* redefine some application flags to be more specialized rather than just numbers */
+#define DBG_CC DBG_APP
+#define DBG_CC_FILE DBG_APP_1
+#define DBG_CC_CCTREE DBG_APP_2
+
+#define DBG_KFILE(msg) DBGMSG (DBG_CC, DBG_FLAG(DBG_CC_FILE), msg)
+
+#if _DEBUGGING
+#define DBG_KFile(p) \
+ { DBG_KFILE(("%s: KFile * %p\n", __func__, (p))); \
+ if (p) { \
+ DBG_KFILE((" vt: %p\n",(p)->vt)); \
+ DBG_KFILE((" dir: %p\n",(p)->dir)); \
+ DBG_KFILE((" ref: %u\n",*(unsigned*)&(p)->refcount)); \
+ DBG_KFILE((" read_enabled: %u\n",*(unsigned*)&(p)->read_enabled)); \
+ DBG_KFILE((" write_enabled: %u\n",*(unsigned*)&(p)->write_enabled));}}
+#else
+#define DBG_KFile(p)
+#endif
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_copycat_debug_ */
diff --git a/tools/copycat/magic b/tools/copycat/magic
new file mode 100644
index 0000000..1f6abea
--- /dev/null
+++ b/tools/copycat/magic
@@ -0,0 +1,18398 @@
+
+#------------------------------------------------------------------------------
+# $File: acorn,v 1.5 2009/09/19 16:28:07 christos Exp $
+# acorn: file(1) magic for files found on Acorn systems
+#
+
+# RISC OS Chunk File Format
+# From RISC OS Programmer's Reference Manual, Appendix D
+# We guess the file type from the type of the first chunk.
+0 lelong 0xc3cbc6c5 RISC OS Chunk data
+>12 string OBJ_ \b, AOF object
+>12 string LIB_ \b, ALF library
+
+# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
+16 lelong 0xef000011 RISC OS AIF executable
+
+# RISC OS Draw files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0 string Draw RISC OS Draw file data
+
+# RISC OS new format font files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0 string FONT\0 RISC OS outline font data,
+>5 byte x version %d
+0 string FONT\1 RISC OS 1bpp font data,
+>5 byte x version %d
+0 string FONT\4 RISC OS 4bpp font data
+>5 byte x version %d
+
+# RISC OS Music files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0 string Maestro\r RISC OS music file
+>8 byte x version %d
+
+>8 byte x type %d
+
+# Digital Symphony data files
+# From: Bernard Jungen (bern8817 at euphonynet.be)
+0 string \x02\x01\x13\x13\x13\x01\x0d\x10 Digital Symphony sound sample (RISC OS),
+>8 byte x version %d,
+>9 pstring x named "%s",
+>(9.b+19) byte =0 8-bit logarithmic
+>(9.b+19) byte =1 LZW-compressed linear
+>(9.b+19) byte =2 8-bit linear signed
+>(9.b+19) byte =3 16-bit linear signed
+>(9.b+19) byte =4 SigmaDelta-compressed linear
+>(9.b+19) byte =5 SigmaDelta-compressed logarithmic
+>(9.b+19) byte >5 unknown format
+
+0 string \x02\x01\x13\x13\x14\x12\x01\x0b Digital Symphony song (RISC OS),
+>8 byte x version %d,
+>9 byte =1 1 voice,
+>9 byte !1 %d voices,
+>10 leshort =1 1 track,
+>10 leshort !1 %d tracks,
+>12 leshort =1 1 pattern
+>12 leshort !1 %d patterns
+
+0 string \x02\x01\x13\x13\x10\x14\x12\x0e
+>9 byte =0 Digital Symphony sequence (RISC OS),
+>>8 byte x version %d,
+>>10 byte =1 1 line,
+>>10 byte !1 %d lines,
+>>11 leshort =1 1 position
+>>11 leshort !1 %d positions
+>9 byte =1 Digital Symphony pattern data (RISC OS),
+>>8 byte x version %d,
+>>10 leshort =1 1 pattern
+>>10 leshort !1 %d patterns
+
+#------------------------------------------------------------------------------
+# $File: adi,v 1.4 2009/09/19 16:28:07 christos Exp $
+# adi: file(1) magic for ADi's objects
+# From Gregory McGarry <g.mcgarry at ieee.org>
+#
+0 leshort 0x521c COFF DSP21k
+>18 lelong &02 executable,
+>18 lelong ^02
+>>18 lelong &01 static object,
+>>18 lelong ^01 relocatable object,
+>18 lelong &010 stripped
+>18 lelong ^010 not stripped
+
+#------------------------------------------------------------------------------
+# $File: adventure,v 1.10 2009/09/19 16:28:07 christos Exp $
+# adventure: file(1) magic for Adventure game files
+#
+# from Allen Garvin <earendil at faeryland.tamu-commerce.edu>
+# Edited by Dave Chapeskie <dchapes at ddm.on.ca> Jun 28, 1998
+# Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+#
+# ALAN
+# I assume there are other, lower versions, but these are the only ones I
+# saw in the archive.
+0 beshort 0x0206 ALAN game data
+>2 byte <10 version 2.6%d
+
+
+# Infocom (see z-machine)
+#------------------------------------------------------------------------------
+# Z-machine: file(1) magic for Z-machine binaries.
+#
+# This will match ${TEX_BASE}/texmf/omega/ocp/char2uni/inbig5.ocp which
+# appears to be a version-0 Z-machine binary.
+#
+# The (false match) message is to correct that behavior. Perhaps it is
+# not needed.
+#
+16 belong&0xfe00f0f0 0x3030 Infocom game data
+>0 ubyte 0 (false match)
+>0 ubyte >0 (Z-machine %d,
+>>2 ubeshort x Release %d /
+>>18 string >\0 Serial %.6s)
+
+#------------------------------------------------------------------------------
+# Glulx: file(1) magic for Glulx binaries.
+#
+# I haven't checked for false matches yet.
+#
+0 string Glul Glulx game data
+>4 beshort x (Version %d
+>>6 byte x \b.%d
+>>8 byte x \b.%d)
+>36 string Info Compiled by Inform
+
+
+
+# For Quetzal and blorb magic see iff
+
+
+# TADS (Text Adventure Development System)
+# All files are machine-independent (games compile to byte-code) and are tagged
+# with a version string of the form "V2.<digit>.<digit>\0" (but TADS 3 is
+# on the way).
+# Game files start with "TADS2 bin\n\r\032\0" then the compiler version.
+0 string TADS2\ bin TADS
+>9 belong !0x0A0D1A00 game data, CORRUPTED
+>9 belong 0x0A0D1A00
+>>13 string >\0 %s game data
+# Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version.
+0 string TADS2\ rsc TADS
+>9 belong !0x0A0D1A00 resource data, CORRUPTED
+>9 belong 0x0A0D1A00
+>>13 string >\0 %s resource data
+# Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian
+# 2-byte length N, the N-char name of the game file *without* a NUL (darn!),
+# "TADS2 save\n\r\032\0" and the interpreter version.
+0 string TADS2\ save/g TADS
+>12 belong !0x0A0D1A00 saved game data, CORRUPTED
+>12 belong 0x0A0D1A00
+>>(16.s+32) string >\0 %s saved game data
+# Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter
+# version.
+0 string TADS2\ save TADS
+>10 belong !0x0A0D1A00 saved game data, CORRUPTED
+>10 belong 0x0A0D1A00
+>>14 string >\0 %s saved game data
+
+# Danny Milosavljevic <danny.milo at gmx.net>
+# this are adrift (adventure game standard) game files, extension .taf
+# depending on version magic continues with 0x93453E6139FA (V 4.0)
+# 0x9445376139FA (V 3.90)
+# 0x9445366139FA (V 3.80)
+# this is from source (http://www.adrift.org.uk/) and I have some taf
+# files, and checked them.
+#0 belong 0x3C423FC9
+#>4 belong 0x6A87C2CF Adrift game file
+#!:mime application/x-adrift
+
+#------------------------------------------------------------------------------
+# $File: allegro,v 1.4 2009/09/19 16:28:07 christos Exp $
+# allegro: file(1) magic for Allegro datafiles
+# Toby Deshane <hac at shoelace.digivill.net>
+#
+0 belong 0x736C6821 Allegro datafile (packed)
+0 belong 0x736C682E Allegro datafile (not packed/autodetect)
+0 belong 0x736C682B Allegro datafile (appended exe data)
+
+#------------------------------------------------------------------------------
+# $File: alliant,v 1.7 2009/09/19 16:28:07 christos Exp $
+# alliant: file(1) magic for Alliant FX series a.out files
+#
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0 short 0420 0420 Alliant virtual executable
+>2 short &0x0020 common library
+>16 long >0 not stripped
+0 short 0421 0421 Alliant compact executable
+>2 short &0x0020 common library
+>16 long >0 not stripped
+
+#------------------------------------------------------------------------------
+# $File: alpha,v 1.7 2009/09/19 16:28:07 christos Exp $
+# alpha architecture description
+#
+
+0 leshort 0603 COFF format alpha
+>22 leshort&030000 !020000 executable
+>24 leshort 0410 pure
+>24 leshort 0413 paged
+>22 leshort&020000 !0 dynamically linked
+>16 lelong !0 not stripped
+>16 lelong 0 stripped
+>22 leshort&030000 020000 shared library
+>24 leshort 0407 object
+>27 byte x - version %d
+>26 byte x .%d
+>28 byte x -%d
+
+# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike at opac.bl.uk>
+#
+# The actual magic number is just "Core", followed by a 2-byte version
+# number; however, treating any file that begins with "Core" as a Digital
+# UNIX core dump file may produce too many false hits, so we include one
+# byte of the version number as well; DU 5.0 appears only to be up to
+# version 2.
+#
+0 string Core\001 Alpha COFF format core dump (Digital UNIX)
+>24 string >\0 \b, from '%s'
+0 string Core\002 Alpha COFF format core dump (Digital UNIX)
+>24 string >\0 \b, from '%s'
+
+
+#------------------------------------------------------------------------------
+# $File: amanda,v 1.5 2009/09/19 16:28:07 christos Exp $
+# amanda: file(1) magic for amanda file format
+#
+0 string AMANDA:\ AMANDA
+>8 string TAPESTART\ DATE tape header file,
+>>23 string X
+>>>25 string >\ Unused %s
+>>23 string >\ DATE %s
+>8 string FILE\ dump file,
+>>13 string >\ DATE %s
+
+#------------------------------------------------------------------------------
+# $File: amigaos,v 1.14 2009/09/19 16:28:07 christos Exp $
+# amigaos: file(1) magic for AmigaOS binary formats:
+
+#
+# From ignatios at cs.uni-bonn.de (Ignatios Souvatzis)
+#
+0 belong 0x000003fa AmigaOS shared library
+0 belong 0x000003f3 AmigaOS loadseg()ble executable/binary
+0 belong 0x000003e7 AmigaOS object/library data
+#
+0 beshort 0xe310 Amiga Workbench
+>2 beshort 1
+>>48 byte 1 disk icon
+>>48 byte 2 drawer icon
+>>48 byte 3 tool icon
+>>48 byte 4 project icon
+>>48 byte 5 garbage icon
+>>48 byte 6 device icon
+>>48 byte 7 kickstart icon
+>>48 byte 8 workbench application icon
+>2 beshort >1 icon, vers. %d
+#
+# various sound formats from the Amiga
+# G=F6tz Waschk <waschk at informatik.uni-rostock.de>
+#
+0 string FC14 Future Composer 1.4 Module sound file
+0 string SMOD Future Composer 1.3 Module sound file
+0 string AON4artofnoise Art Of Noise Module sound file
+1 string MUGICIAN/SOFTEYES Mugician Module sound file
+58 string SIDMON\ II\ -\ THE Sidmon 2.0 Module sound file
+0 string Synth4.0 Synthesis Module sound file
+0 string ARP. The Holy Noise Module sound file
+0 string BeEp\0 JamCracker Module sound file
+0 string COSO\0 Hippel-COSO Module sound file
+# Too simple (short, pure ASCII, deep), MPi
+#26 string V.3 Brian Postma's Soundmon Module sound file v3
+#26 string BPSM Brian Postma's Soundmon Module sound file v3
+#26 string V.2 Brian Postma's Soundmon Module sound file v2
+
+# The following are from: "Stefan A. Haubenthal" <polluks at web.de>
+0 beshort 0x0f00 AmigaOS bitmap font
+0 beshort 0x0f03 AmigaOS outline font
+0 belong 0x80001001 AmigaOS outline tag
+0 string ##\ version catalog translation
+0 string EMOD\0 Amiga E module
+8 string ECXM\0 ECX module
+0 string/c @database AmigaGuide file
+
+# Amiga disk types
+#
+0 string RDSK Rigid Disk Block
+>160 string x on %.24s
+0 string DOS\0 Amiga DOS disk
+0 string DOS\1 Amiga FFS disk
+0 string DOS\2 Amiga Inter DOS disk
+0 string DOS\3 Amiga Inter FFS disk
+0 string DOS\4 Amiga Fastdir DOS disk
+0 string DOS\5 Amiga Fastdir FFS disk
+0 string KICK Kickstart disk
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+0 string LZX LZX compressed archive (Amiga)
+
+
+#------------------------------------------------------------------------------
+# $File: animation,v 1.39 2009/09/27 19:02:12 christos Exp $
+# animation: file(1) magic for animation/movie formats
+#
+# animation formats
+# MPEG, FLI, DL originally from vax at ccwf.cc.utexas.edu (VaX#n8)
+# FLC, SGI, Apple originally from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# SGI and Apple formats
+0 string MOVI Silicon Graphics movie file
+!:mime video/x-sgi-movie
+4 string moov Apple QuickTime
+!:mime video/quicktime
+>12 string mvhd \b movie (fast start)
+>12 string mdra \b URL
+>12 string cmov \b movie (fast start, compressed header)
+>12 string rmra \b multiple URLs
+4 string mdat Apple QuickTime movie (unoptimized)
+!:mime video/quicktime
+#4 string wide Apple QuickTime movie (unoptimized)
+#!:mime video/quicktime
+#4 string skip Apple QuickTime movie (modified)
+#!:mime video/quicktime
+#4 string free Apple QuickTime movie (modified)
+#!:mime video/quicktime
+4 string idsc Apple QuickTime image (fast start)
+!:mime image/x-quicktime
+#4 string idat Apple QuickTime image (unoptimized)
+#!:mime image/x-quicktime
+4 string pckg Apple QuickTime compressed archive
+!:mime application/x-quicktime-player
+4 string/W jP JPEG 2000 image
+!:mime image/jp2
+4 string ftyp ISO Media
+>8 string isom \b, MPEG v4 system, version 1
+!:mime video/mp4
+>8 string iso2 \b, MPEG v4 system, part 12 revision
+>8 string mp41 \b, MPEG v4 system, version 1
+!:mime video/mp4
+>8 string mp42 \b, MPEG v4 system, version 2
+!:mime video/mp4
+>8 string mp7t \b, MPEG v4 system, MPEG v7 XML
+>8 string mp7b \b, MPEG v4 system, MPEG v7 binary XML
+>8 string/W jp2 \b, JPEG 2000
+!:mime image/jp2
+>8 string 3gp \b, MPEG v4 system, 3GPP
+!:mime video/3gpp
+>>11 byte 4 \b v4 (H.263/AMR GSM 6.10)
+>>11 byte 5 \b v5 (H.263/AMR GSM 6.10)
+>>11 byte 6 \b v6 (ITU H.264/AMR GSM 6.10)
+>8 string mmp4 \b, MPEG v4 system, 3GPP Mobile
+!:mime video/mp4
+>8 string avc1 \b, MPEG v4 system, 3GPP JVT AVC
+!:mime video/3gpp
+>8 string/W M4A \b, MPEG v4 system, iTunes AAC-LC
+!:mime audio/mp4
+>8 string/W M4V \b, MPEG v4 system, iTunes AVC-LC
+!:mime video/mp4
+>8 string/W M4P \b, MPEG v4 system, iTunes AES encrypted
+>8 string/W M4B \b, MPEG v4 system, iTunes bookmarked
+>8 string/W qt \b, Apple QuickTime movie
+!:mime video/quicktime
+
+# MPEG sequences
+# Scans for all common MPEG header start codes
+0 belong 0x00000001
+>4 byte&0x1F 0x07 JVT NAL sequence, H.264 video
+>>5 byte 66 \b, baseline
+>>5 byte 77 \b, main
+>>5 byte 88 \b, extended
+>>7 byte x \b @ L %u
+0 belong&0xFFFFFF00 0x00000100
+>3 byte 0xBA MPEG sequence
+!:mime video/mpeg
+>>4 byte &0x40 \b, v2, program multiplex
+>>4 byte ^0x40 \b, v1, system multiplex
+>3 byte 0xBB MPEG sequence, v1/2, multiplex (missing pack header)
+>3 byte&0x1F 0x07 MPEG sequence, H.264 video
+>>4 byte 66 \b, baseline
+>>4 byte 77 \b, main
+>>4 byte 88 \b, extended
+>>6 byte x \b @ L %u
+>3 byte 0xB0 MPEG sequence, v4
+!:mime video/mpeg4-generic
+>>5 belong 0x000001B5
+>>>9 byte &0x80
+>>>>10 byte&0xF0 16 \b, video
+>>>>10 byte&0xF0 32 \b, still texture
+>>>>10 byte&0xF0 48 \b, mesh
+>>>>10 byte&0xF0 64 \b, face
+>>>9 byte&0xF8 8 \b, video
+>>>9 byte&0xF8 16 \b, still texture
+>>>9 byte&0xF8 24 \b, mesh
+>>>9 byte&0xF8 32 \b, face
+>>4 byte 1 \b, simple @ L1
+>>4 byte 2 \b, simple @ L2
+>>4 byte 3 \b, simple @ L3
+>>4 byte 4 \b, simple @ L0
+>>4 byte 17 \b, simple scalable @ L1
+>>4 byte 18 \b, simple scalable @ L2
+>>4 byte 33 \b, core @ L1
+>>4 byte 34 \b, core @ L2
+>>4 byte 50 \b, main @ L2
+>>4 byte 51 \b, main @ L3
+>>4 byte 53 \b, main @ L4
+>>4 byte 66 \b, n-bit @ L2
+>>4 byte 81 \b, scalable texture @ L1
+>>4 byte 97 \b, simple face animation @ L1
+>>4 byte 98 \b, simple face animation @ L2
+>>4 byte 99 \b, simple face basic animation @ L1
+>>4 byte 100 \b, simple face basic animation @ L2
+>>4 byte 113 \b, basic animation text @ L1
+>>4 byte 114 \b, basic animation text @ L2
+>>4 byte 129 \b, hybrid @ L1
+>>4 byte 130 \b, hybrid @ L2
+>>4 byte 145 \b, advanced RT simple @ L!
+>>4 byte 146 \b, advanced RT simple @ L2
+>>4 byte 147 \b, advanced RT simple @ L3
+>>4 byte 148 \b, advanced RT simple @ L4
+>>4 byte 161 \b, core scalable @ L1
+>>4 byte 162 \b, core scalable @ L2
+>>4 byte 163 \b, core scalable @ L3
+>>4 byte 177 \b, advanced coding efficiency @ L1
+>>4 byte 178 \b, advanced coding efficiency @ L2
+>>4 byte 179 \b, advanced coding efficiency @ L3
+>>4 byte 180 \b, advanced coding efficiency @ L4
+>>4 byte 193 \b, advanced core @ L1
+>>4 byte 194 \b, advanced core @ L2
+>>4 byte 209 \b, advanced scalable texture @ L1
+>>4 byte 210 \b, advanced scalable texture @ L2
+>>4 byte 211 \b, advanced scalable texture @ L3
+>>4 byte 225 \b, simple studio @ L1
+>>4 byte 226 \b, simple studio @ L2
+>>4 byte 227 \b, simple studio @ L3
+>>4 byte 228 \b, simple studio @ L4
+>>4 byte 229 \b, core studio @ L1
+>>4 byte 230 \b, core studio @ L2
+>>4 byte 231 \b, core studio @ L3
+>>4 byte 232 \b, core studio @ L4
+>>4 byte 240 \b, advanced simple @ L0
+>>4 byte 241 \b, advanced simple @ L1
+>>4 byte 242 \b, advanced simple @ L2
+>>4 byte 243 \b, advanced simple @ L3
+>>4 byte 244 \b, advanced simple @ L4
+>>4 byte 245 \b, advanced simple @ L5
+>>4 byte 247 \b, advanced simple @ L3b
+>>4 byte 248 \b, FGS @ L0
+>>4 byte 249 \b, FGS @ L1
+>>4 byte 250 \b, FGS @ L2
+>>4 byte 251 \b, FGS @ L3
+>>4 byte 252 \b, FGS @ L4
+>>4 byte 253 \b, FGS @ L5
+>3 byte 0xB5 MPEG sequence, v4
+>>4 byte &0x80
+>>>5 byte&0xF0 16 \b, video (missing profile header)
+>>>5 byte&0xF0 32 \b, still texture (missing profile header)
+>>>5 byte&0xF0 48 \b, mesh (missing profile header)
+>>>5 byte&0xF0 64 \b, face (missing profile header)
+>>4 byte&0xF8 8 \b, video (missing profile header)
+>>4 byte&0xF8 16 \b, still texture (missing profile header)
+>>4 byte&0xF8 24 \b, mesh (missing profile header)
+>>4 byte&0xF8 32 \b, face (missing profile header)
+>3 byte 0xB3 MPEG sequence
+>>12 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video
+>>12 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video
+>>12 belong 0x000001B5 \b, v2,
+>>>16 byte&0x0F 1 \b HP
+>>>16 byte&0x0F 2 \b Spt
+>>>16 byte&0x0F 3 \b SNR
+>>>16 byte&0x0F 4 \b MP
+>>>16 byte&0x0F 5 \b SP
+>>>17 byte&0xF0 64 \b at HL
+>>>17 byte&0xF0 96 \b at H-14
+>>>17 byte&0xF0 128 \b at ML
+>>>17 byte&0xF0 160 \b at LL
+>>>17 byte &0x08 \b progressive
+>>>17 byte ^0x08 \b interlaced
+>>>17 byte&0x06 2 \b Y'CbCr 4:2:0 video
+>>>17 byte&0x06 4 \b Y'CbCr 4:2:2 video
+>>>17 byte&0x06 6 \b Y'CbCr 4:4:4 video
+>>11 byte &0x02
+>>>75 byte &0x01
+>>>>140 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video
+>>>>140 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video
+>>>>140 belong 0x000001B5 \b, v2,
+>>>>>144 byte&0x0F 1 \b HP
+>>>>>144 byte&0x0F 2 \b Spt
+>>>>>144 byte&0x0F 3 \b SNR
+>>>>>144 byte&0x0F 4 \b MP
+>>>>>144 byte&0x0F 5 \b SP
+>>>>>145 byte&0xF0 64 \b at HL
+>>>>>145 byte&0xF0 96 \b at H-14
+>>>>>145 byte&0xF0 128 \b at ML
+>>>>>145 byte&0xF0 160 \b at LL
+>>>>>145 byte &0x08 \b progressive
+>>>>>145 byte ^0x08 \b interlaced
+>>>>>145 byte&0x06 2 \b Y'CbCr 4:2:0 video
+>>>>>145 byte&0x06 4 \b Y'CbCr 4:2:2 video
+>>>>>145 byte&0x06 6 \b Y'CbCr 4:4:4 video
+>>76 belong 0x000001B8 \b, v1, progressive Y'CbCr 4:2:0 video
+>>76 belong 0x000001B2 \b, v1, progressive Y'CbCr 4:2:0 video
+>>76 belong 0x000001B5 \b, v2,
+>>>80 byte&0x0F 1 \b HP
+>>>80 byte&0x0F 2 \b Spt
+>>>80 byte&0x0F 3 \b SNR
+>>>80 byte&0x0F 4 \b MP
+>>>80 byte&0x0F 5 \b SP
+>>>81 byte&0xF0 64 \b at HL
+>>>81 byte&0xF0 96 \b at H-14
+>>>81 byte&0xF0 128 \b at ML
+>>>81 byte&0xF0 160 \b at LL
+>>>81 byte &0x08 \b progressive
+>>>81 byte ^0x08 \b interlaced
+>>>81 byte&0x06 2 \b Y'CbCr 4:2:0 video
+>>>81 byte&0x06 4 \b Y'CbCr 4:2:2 video
+>>>81 byte&0x06 6 \b Y'CbCr 4:4:4 video
+>>4 belong&0xFFFFFF00 0x78043800 \b, HD-TV 1920P
+>>>7 byte&0xF0 0x10 \b, 16:9
+>>4 belong&0xFFFFFF00 0x50002D00 \b, SD-TV 1280I
+>>>7 byte&0xF0 0x10 \b, 16:9
+>>4 belong&0xFFFFFF00 0x30024000 \b, PAL Capture
+>>>7 byte&0xF0 0x10 \b, 4:3
+>>4 beshort&0xFFF0 0x2C00 \b, 4CIF
+>>>5 beshort&0x0FFF 0x01E0 \b NTSC
+>>>5 beshort&0x0FFF 0x0240 \b PAL
+>>>7 byte&0xF0 0x20 \b, 4:3
+>>>7 byte&0xF0 0x30 \b, 16:9
+>>>7 byte&0xF0 0x40 \b, 11:5
+>>>7 byte&0xF0 0x80 \b, PAL 4:3
+>>>7 byte&0xF0 0xC0 \b, NTSC 4:3
+>>4 belong&0xFFFFFF00 0x2801E000 \b, LD-TV 640P
+>>>7 byte&0xF0 0x10 \b, 4:3
+>>4 belong&0xFFFFFF00 0x1400F000 \b, 320x240
+>>>7 byte&0xF0 0x10 \b, 4:3
+>>4 belong&0xFFFFFF00 0x0F00A000 \b, 240x160
+>>>7 byte&0xF0 0x10 \b, 4:3
+>>4 belong&0xFFFFFF00 0x0A007800 \b, 160x120
+>>>7 byte&0xF0 0x10 \b, 4:3
+>>4 beshort&0xFFF0 0x1600 \b, CIF
+>>>5 beshort&0x0FFF 0x00F0 \b NTSC
+>>>5 beshort&0x0FFF 0x0120 \b PAL
+>>>7 byte&0xF0 0x20 \b, 4:3
+>>>7 byte&0xF0 0x30 \b, 16:9
+>>>7 byte&0xF0 0x40 \b, 11:5
+>>>7 byte&0xF0 0x80 \b, PAL 4:3
+>>>7 byte&0xF0 0xC0 \b, NTSC 4:3
+>>>5 beshort&0x0FFF 0x0240 \b PAL 625
+>>>>7 byte&0xF0 0x20 \b, 4:3
+>>>>7 byte&0xF0 0x30 \b, 16:9
+>>>>7 byte&0xF0 0x40 \b, 11:5
+>>4 beshort&0xFFF0 0x2D00 \b, CCIR/ITU
+>>>5 beshort&0x0FFF 0x01E0 \b NTSC 525
+>>>5 beshort&0x0FFF 0x0240 \b PAL 625
+>>>7 byte&0xF0 0x20 \b, 4:3
+>>>7 byte&0xF0 0x30 \b, 16:9
+>>>7 byte&0xF0 0x40 \b, 11:5
+>>4 beshort&0xFFF0 0x1E00 \b, SVCD
+>>>5 beshort&0x0FFF 0x01E0 \b NTSC 525
+>>>5 beshort&0x0FFF 0x0240 \b PAL 625
+>>>7 byte&0xF0 0x20 \b, 4:3
+>>>7 byte&0xF0 0x30 \b, 16:9
+>>>7 byte&0xF0 0x40 \b, 11:5
+>>7 byte&0x0F 1 \b, 23.976 fps
+>>7 byte&0x0F 2 \b, 24 fps
+>>7 byte&0x0F 3 \b, 25 fps
+>>7 byte&0x0F 4 \b, 29.97 fps
+>>7 byte&0x0F 5 \b, 30 fps
+>>7 byte&0x0F 6 \b, 50 fps
+>>7 byte&0x0F 7 \b, 59.94 fps
+>>7 byte&0x0F 8 \b, 60 fps
+>>11 byte &0x04 \b, Constrained
+
+# MPEG ADTS Audio (*.mpx/mxa/aac)
+# from dreesen at math.fu-berlin.de
+# modified to fully support MPEG ADTS
+
+# MP3, M1A
+# modified by Joerg Jenderek
+# GRR the original test are too common for many DOS files
+# so don't accept as MP3 until we've tested the rate
+0 beshort&0xFFFE 0xFFFA
+# rates
+>2 byte&0xF0 0x10 MPEG ADTS, layer III, v1, 32 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x20 MPEG ADTS, layer III, v1, 40 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x30 MPEG ADTS, layer III, v1, 48 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x40 MPEG ADTS, layer III, v1, 56 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x50 MPEG ADTS, layer III, v1, 64 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x60 MPEG ADTS, layer III, v1, 80 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x70 MPEG ADTS, layer III, v1, 96 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x80 MPEG ADTS, layer III, v1, 112 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0x90 MPEG ADTS, layer III, v1, 128 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0xA0 MPEG ADTS, layer III, v1, 160 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0xB0 MPEG ADTS, layer III, v1, 192 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0xC0 MPEG ADTS, layer III, v1, 224 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0xD0 MPEG ADTS, layer III, v1, 256 kbps
+!:mime audio/mpeg
+>2 byte&0xF0 0xE0 MPEG ADTS, layer III, v1, 320 kbps
+!:mime audio/mpeg
+# timing
+>2 byte&0x0C 0x00 \b, 44.1 kHz
+>2 byte&0x0C 0x04 \b, 48 kHz
+>2 byte&0x0C 0x08 \b, 32 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MP2, M1A
+0 beshort&0xFFFE 0xFFFC MPEG ADTS, layer II, v1
+!:mime audio/mpeg
+# rates
+>2 byte&0xF0 0x10 \b, 32 kbps
+>2 byte&0xF0 0x20 \b, 48 kbps
+>2 byte&0xF0 0x30 \b, 56 kbps
+>2 byte&0xF0 0x40 \b, 64 kbps
+>2 byte&0xF0 0x50 \b, 80 kbps
+>2 byte&0xF0 0x60 \b, 96 kbps
+>2 byte&0xF0 0x70 \b, 112 kbps
+>2 byte&0xF0 0x80 \b, 128 kbps
+>2 byte&0xF0 0x90 \b, 160 kbps
+>2 byte&0xF0 0xA0 \b, 192 kbps
+>2 byte&0xF0 0xB0 \b, 224 kbps
+>2 byte&0xF0 0xC0 \b, 256 kbps
+>2 byte&0xF0 0xD0 \b, 320 kbps
+>2 byte&0xF0 0xE0 \b, 384 kbps
+# timing
+>2 byte&0x0C 0x00 \b, 44.1 kHz
+>2 byte&0x0C 0x04 \b, 48 kHz
+>2 byte&0x0C 0x08 \b, 32 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MPA, M1A
+# updated by Joerg Jenderek
+# GRR the original test are too common for many DOS files, so test 32 <= kbits <= 448
+# GRR this test is still too general as it catches a BOM of UTF-16 files (0xFFFE)
+# FIXME: Almost all little endian UTF-16 text with BOM are clobbered by these entries
+#0 beshort&0xFFFE 0xFFFE
+#>2 ubyte&0xF0 >0x0F
+#>>2 ubyte&0xF0 <0xE1 MPEG ADTS, layer I, v1
+## rate
+#>>>2 byte&0xF0 0x10 \b, 32 kbps
+#>>>2 byte&0xF0 0x20 \b, 64 kbps
+#>>>2 byte&0xF0 0x30 \b, 96 kbps
+#>>>2 byte&0xF0 0x40 \b, 128 kbps
+#>>>2 byte&0xF0 0x50 \b, 160 kbps
+#>>>2 byte&0xF0 0x60 \b, 192 kbps
+#>>>2 byte&0xF0 0x70 \b, 224 kbps
+#>>>2 byte&0xF0 0x80 \b, 256 kbps
+#>>>2 byte&0xF0 0x90 \b, 288 kbps
+#>>>2 byte&0xF0 0xA0 \b, 320 kbps
+#>>>2 byte&0xF0 0xB0 \b, 352 kbps
+#>>>2 byte&0xF0 0xC0 \b, 384 kbps
+#>>>2 byte&0xF0 0xD0 \b, 416 kbps
+#>>>2 byte&0xF0 0xE0 \b, 448 kbps
+## timing
+#>>>2 byte&0x0C 0x00 \b, 44.1 kHz
+#>>>2 byte&0x0C 0x04 \b, 48 kHz
+#>>>2 byte&0x0C 0x08 \b, 32 kHz
+## channels/options
+#>>>3 byte&0xC0 0x00 \b, Stereo
+#>>>3 byte&0xC0 0x40 \b, JntStereo
+#>>>3 byte&0xC0 0x80 \b, 2x Monaural
+#>>>3 byte&0xC0 0xC0 \b, Monaural
+##>1 byte ^0x01 \b, Data Verify
+##>2 byte &0x02 \b, Packet Pad
+##>2 byte &0x01 \b, Custom Flag
+##>3 byte &0x08 \b, Copyrighted
+##>3 byte &0x04 \b, Original Source
+##>3 byte&0x03 1 \b, NR: 50/15 ms
+##>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MP3, M2A
+0 beshort&0xFFFE 0xFFF2 MPEG ADTS, layer III, v2
+!:mime audio/mpeg
+# rate
+>2 byte&0xF0 0x10 \b, 8 kbps
+>2 byte&0xF0 0x20 \b, 16 kbps
+>2 byte&0xF0 0x30 \b, 24 kbps
+>2 byte&0xF0 0x40 \b, 32 kbps
+>2 byte&0xF0 0x50 \b, 40 kbps
+>2 byte&0xF0 0x60 \b, 48 kbps
+>2 byte&0xF0 0x70 \b, 56 kbps
+>2 byte&0xF0 0x80 \b, 64 kbps
+>2 byte&0xF0 0x90 \b, 80 kbps
+>2 byte&0xF0 0xA0 \b, 96 kbps
+>2 byte&0xF0 0xB0 \b, 112 kbps
+>2 byte&0xF0 0xC0 \b, 128 kbps
+>2 byte&0xF0 0xD0 \b, 144 kbps
+>2 byte&0xF0 0xE0 \b, 160 kbps
+# timing
+>2 byte&0x0C 0x00 \b, 22.05 kHz
+>2 byte&0x0C 0x04 \b, 24 kHz
+>2 byte&0x0C 0x08 \b, 16 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MP2, M2A
+0 beshort&0xFFFE 0xFFF4 MPEG ADTS, layer II, v2
+# rate
+>2 byte&0xF0 0x10 \b, 8 kbps
+>2 byte&0xF0 0x20 \b, 16 kbps
+>2 byte&0xF0 0x30 \b, 24 kbps
+>2 byte&0xF0 0x40 \b, 32 kbps
+>2 byte&0xF0 0x50 \b, 40 kbps
+>2 byte&0xF0 0x60 \b, 48 kbps
+>2 byte&0xF0 0x70 \b, 56 kbps
+>2 byte&0xF0 0x80 \b, 64 kbps
+>2 byte&0xF0 0x90 \b, 80 kbps
+>2 byte&0xF0 0xA0 \b, 96 kbps
+>2 byte&0xF0 0xB0 \b, 112 kbps
+>2 byte&0xF0 0xC0 \b, 128 kbps
+>2 byte&0xF0 0xD0 \b, 144 kbps
+>2 byte&0xF0 0xE0 \b, 160 kbps
+# timing
+>2 byte&0x0C 0x00 \b, 22.05 kHz
+>2 byte&0x0C 0x04 \b, 24 kHz
+>2 byte&0x0C 0x08 \b, 16 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MPA, M2A
+0 beshort&0xFFFE 0xFFF6 MPEG ADTS, layer I, v2
+!:mime audio/mpeg
+# rate
+>2 byte&0xF0 0x10 \b, 32 kbps
+>2 byte&0xF0 0x20 \b, 48 kbps
+>2 byte&0xF0 0x30 \b, 56 kbps
+>2 byte&0xF0 0x40 \b, 64 kbps
+>2 byte&0xF0 0x50 \b, 80 kbps
+>2 byte&0xF0 0x60 \b, 96 kbps
+>2 byte&0xF0 0x70 \b, 112 kbps
+>2 byte&0xF0 0x80 \b, 128 kbps
+>2 byte&0xF0 0x90 \b, 144 kbps
+>2 byte&0xF0 0xA0 \b, 160 kbps
+>2 byte&0xF0 0xB0 \b, 176 kbps
+>2 byte&0xF0 0xC0 \b, 192 kbps
+>2 byte&0xF0 0xD0 \b, 224 kbps
+>2 byte&0xF0 0xE0 \b, 256 kbps
+# timing
+>2 byte&0x0C 0x00 \b, 22.05 kHz
+>2 byte&0x0C 0x04 \b, 24 kHz
+>2 byte&0x0C 0x08 \b, 16 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# MP3, M25A
+0 beshort&0xFFFE 0xFFE2 MPEG ADTS, layer III, v2.5
+!:mime audio/mpeg
+# rate
+>2 byte&0xF0 0x10 \b, 8 kbps
+>2 byte&0xF0 0x20 \b, 16 kbps
+>2 byte&0xF0 0x30 \b, 24 kbps
+>2 byte&0xF0 0x40 \b, 32 kbps
+>2 byte&0xF0 0x50 \b, 40 kbps
+>2 byte&0xF0 0x60 \b, 48 kbps
+>2 byte&0xF0 0x70 \b, 56 kbps
+>2 byte&0xF0 0x80 \b, 64 kbps
+>2 byte&0xF0 0x90 \b, 80 kbps
+>2 byte&0xF0 0xA0 \b, 96 kbps
+>2 byte&0xF0 0xB0 \b, 112 kbps
+>2 byte&0xF0 0xC0 \b, 128 kbps
+>2 byte&0xF0 0xD0 \b, 144 kbps
+>2 byte&0xF0 0xE0 \b, 160 kbps
+# timing
+>2 byte&0x0C 0x00 \b, 11.025 kHz
+>2 byte&0x0C 0x04 \b, 12 kHz
+>2 byte&0x0C 0x08 \b, 8 kHz
+# channels/options
+>3 byte&0xC0 0x00 \b, Stereo
+>3 byte&0xC0 0x40 \b, JntStereo
+>3 byte&0xC0 0x80 \b, 2x Monaural
+>3 byte&0xC0 0xC0 \b, Monaural
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Packet Pad
+#>2 byte &0x01 \b, Custom Flag
+#>3 byte &0x08 \b, Copyrighted
+#>3 byte &0x04 \b, Original Source
+#>3 byte&0x03 1 \b, NR: 50/15 ms
+#>3 byte&0x03 3 \b, NR: CCIT J.17
+
+# AAC (aka MPEG-2 NBC audio) and MPEG-4 audio
+
+# Stored AAC streams (instead of the MP4 format)
+0 string ADIF MPEG ADIF, AAC
+!:mime audio/x-hx-aac-adif
+>4 byte &0x80
+>>13 byte &0x10 \b, VBR
+>>13 byte ^0x10 \b, CBR
+>>16 byte&0x1E 0x02 \b, single stream
+>>16 byte&0x1E 0x04 \b, 2 streams
+>>16 byte&0x1E 0x06 \b, 3 streams
+>>16 byte &0x08 \b, 4 or more streams
+>>16 byte &0x10 \b, 8 or more streams
+>>4 byte &0x80 \b, Copyrighted
+>>13 byte &0x40 \b, Original Source
+>>13 byte &0x20 \b, Home Flag
+>4 byte ^0x80
+>>4 byte &0x10 \b, VBR
+>>4 byte ^0x10 \b, CBR
+>>7 byte&0x1E 0x02 \b, single stream
+>>7 byte&0x1E 0x04 \b, 2 streams
+>>7 byte&0x1E 0x06 \b, 3 streams
+>>7 byte &0x08 \b, 4 or more streams
+>>7 byte &0x10 \b, 8 or more streams
+>>4 byte &0x40 \b, Original Stream(s)
+>>4 byte &0x20 \b, Home Source
+
+# Live or stored single AAC stream (used with MPEG-2 systems)
+0 beshort&0xFFF6 0xFFF0 MPEG ADTS, AAC
+!:mime audio/x-hx-aac-adts
+>1 byte &0x08 \b, v2
+>1 byte ^0x08 \b, v4
+# profile
+>>2 byte &0xC0 \b LTP
+>2 byte&0xc0 0x00 \b Main
+>2 byte&0xc0 0x40 \b LC
+>2 byte&0xc0 0x80 \b SSR
+# timing
+>2 byte&0x3c 0x00 \b, 96 kHz
+>2 byte&0x3c 0x04 \b, 88.2 kHz
+>2 byte&0x3c 0x08 \b, 64 kHz
+>2 byte&0x3c 0x0c \b, 48 kHz
+>2 byte&0x3c 0x10 \b, 44.1 kHz
+>2 byte&0x3c 0x14 \b, 32 kHz
+>2 byte&0x3c 0x18 \b, 24 kHz
+>2 byte&0x3c 0x1c \b, 22.05 kHz
+>2 byte&0x3c 0x20 \b, 16 kHz
+>2 byte&0x3c 0x24 \b, 12 kHz
+>2 byte&0x3c 0x28 \b, 11.025 kHz
+>2 byte&0x3c 0x2c \b, 8 kHz
+# channels
+>2 beshort&0x01c0 0x0040 \b, monaural
+>2 beshort&0x01c0 0x0080 \b, stereo
+>2 beshort&0x01c0 0x00c0 \b, stereo + center
+>2 beshort&0x01c0 0x0100 \b, stereo+center+LFE
+>2 beshort&0x01c0 0x0140 \b, surround
+>2 beshort&0x01c0 0x0180 \b, surround + LFE
+>2 beshort &0x01C0 \b, surround + side
+#>1 byte ^0x01 \b, Data Verify
+#>2 byte &0x02 \b, Custom Flag
+#>3 byte &0x20 \b, Original Stream
+#>3 byte &0x10 \b, Home Source
+#>3 byte &0x08 \b, Copyrighted
+
+# Live MPEG-4 audio streams (instead of RTP FlexMux)
+0 beshort&0xFFE0 0x56E0 MPEG-4 LOAS
+!:mime audio/x-mp4a-latm
+#>1 beshort&0x1FFF x \b, %u byte packet
+>3 byte&0xE0 0x40
+>>4 byte&0x3C 0x04 \b, single stream
+>>4 byte&0x3C 0x08 \b, 2 streams
+>>4 byte&0x3C 0x0C \b, 3 streams
+>>4 byte &0x08 \b, 4 or more streams
+>>4 byte &0x20 \b, 8 or more streams
+>3 byte&0xC0 0
+>>4 byte&0x78 0x08 \b, single stream
+>>4 byte&0x78 0x10 \b, 2 streams
+>>4 byte&0x78 0x18 \b, 3 streams
+>>4 byte &0x20 \b, 4 or more streams
+>>4 byte &0x40 \b, 8 or more streams
+# This magic isn't strong enough (matches plausible ISO-8859-1 text)
+#0 beshort 0x4DE1 MPEG-4 LO-EP audio stream
+#!:mime audio/x-mp4a-latm
+
+# Summary: FLI animation format
+# Created by: Daniel Quinlan <quinlan at yggdrasil.com>
+# Modified by (1): Abel Cheung <abelcheung at gmail.com> (avoid over-generic detection)
+4 leshort 0xAF11
+# standard FLI always has 320x200 resolution and 8 bit color
+>8 leshort 320
+>>10 leshort 200
+>>>12 leshort 8 FLI animation, 320x200x8
+!:mime video/x-fli
+>>>>6 leshort x \b, %d frames
+# frame speed is multiple of 1/70s
+>>>>16 leshort x \b, %d/70s per frame
+
+# Summary: FLC animation format
+# Created by: Daniel Quinlan <quinlan at yggdrasil.com>
+# Modified by (1): Abel Cheung <abelcheung at gmail.com> (avoid over-generic detection)
+4 leshort 0xAF12
+# standard FLC always use 8 bit color
+>12 leshort 8 FLC animation
+!:mime video/x-flc
+>>8 leshort x \b, %d
+>>10 leshort x \bx%dx8
+>>6 uleshort x \b, %d frames
+>>16 uleshort x \b, %dms per frame
+
+# DL animation format
+# XXX - collision with most `mips' magic
+#
+# I couldn't find a real magic number for these, however, this
+# -appears- to work. Note that it might catch other files, too, so be
+# careful!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)! The DL format is really bad.
+#
+#0 byte 1 DL version 1, medium format (160x100, 4 images/screen)
+#!:mime video/x-unknown
+#>42 byte x - %d screens,
+#>43 byte x %d commands
+#0 byte 2 DL version 2
+#!:mime video/x-unknown
+#>1 byte 1 - large format (320x200,1 image/screen),
+#>1 byte 2 - medium format (160x100,4 images/screen),
+#>1 byte >2 - unknown format,
+#>42 byte x %d screens,
+#>43 byte x %d commands
+# Based on empirical evidence, DL version 3 have several nulls following the
+# \003. Most of them start with non-null values at hex offset 0x34 or so.
+#0 string \3\0\0\0\0\0\0\0\0\0\0\0 DL version 3
+
+# iso 13818 transport stream
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001 (ISO 13818.1)
+# (the following is a little bit restrictive and works fine for a stream
+# that starts with PAT properly. it won't work for stream data, that is
+# cut from an input device data right in the middle, but this shouldn't
+# disturb)
+# syncbyte 8 bit 0x47
+# error_ind 1 bit -
+# payload_start 1 bit 1
+# priority 1 bit -
+# PID 13 bit 0x0000
+# scrambling 2 bit -
+# adaptfld_ctrl 2 bit 1 or 3
+# conti_count 4 bit 0
+0 belong&0xFF5FFF1F 0x47400010 MPEG transport stream data
+>188 byte !0x47 CORRUPTED
+
+# DIF digital video file format <mpruett at sgi.com>
+0 belong&0xffffff00 0x1f070000 DIF
+>4 byte &0x01 (DVCPRO) movie file
+>4 byte ^0x01 (DV) movie file
+>3 byte &0x80 (PAL)
+>3 byte ^0x80 (NTSC)
+
+# Microsoft Advanced Streaming Format (ASF) <mpruett at sgi.com>
+0 belong 0x3026b275 Microsoft ASF
+!:mime video/x-ms-asf
+
+# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0 string \x8aMNG MNG video data,
+!:mime video/x-mng
+>4 belong !0x0d0a1a0a CORRUPTED,
+>4 belong 0x0d0a1a0a
+>>16 belong x %ld x
+>>20 belong x %ld
+
+# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0 string \x8bJNG JNG video data,
+!:mime video/x-jng
+>4 belong !0x0d0a1a0a CORRUPTED,
+>4 belong 0x0d0a1a0a
+>>16 belong x %ld x
+>>20 belong x %ld
+
+# Vivo video (Wolfram Kleff)
+3 string \x0D\x0AVersion:Vivo Vivo video data
+
+# VRML (Virtual Reality Modelling Language)
+0 string/w #VRML\ V1.0\ ascii VRML 1 file
+!:mime model/vrml
+0 string/w #VRML\ V2.0\ utf8 ISO/IEC 14772 VRML 97 file
+!:mime model/vrml
+
+# X3D (Extensible 3D) [http://www.web3d.org/specifications/x3d-3.0.dtd]
+# From Michel Briand <michelbriand at free.fr>
+0 string \<?xml\ version="
+!:strength +1
+>20 search/1000/cw \<!DOCTYPE\ X3D X3D (Extensible 3D) model xml text
+!:mime model/x3d
+
+#---------------------------------------------------------------------------
+# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
+# From Mark Sheppard <msheppard at climax.co.uk>, 2002-10-03
+#
+0 string HVQM4 %s
+>6 string >\0 v%s
+>0 byte x GameCube movie,
+>0x34 ubeshort x %d x
+>0x36 ubeshort x %d,
+>0x26 ubeshort x %dµs,
+>0x42 ubeshort 0 no audio
+>0x42 ubeshort >0 %dHz audio
+
+# From: "Stefan A. Haubenthal" <polluks at web.de>
+0 string DVDVIDEO-VTS Video title set,
+>0x21 byte x v%x
+0 string DVDVIDEO-VMG Video manager,
+>0x21 byte x v%x
+
+# From: Behan Webster <behanw at websterwood.com>
+# NuppelVideo used by Mythtv (*.nuv)
+# Note: there are two identical stanzas here differing only in the
+# initial string matched. It used to be done with a regex, but we're
+# trying to get rid of those.
+0 string NuppelVideo MythTV NuppelVideo
+>12 string x v%s
+>20 lelong x (%d
+>24 lelong x \bx%d),
+>36 string P \bprogressive,
+>36 string I \binterlaced,
+>40 ledouble x \baspect:%.2f,
+>48 ledouble x \bfps:%.2f
+0 string MythTV MythTV NuppelVideo
+>12 string x v%s
+>20 lelong x (%d
+>24 lelong x \bx%d),
+>36 string P \bprogressive,
+>36 string I \binterlaced,
+>40 ledouble x \baspect:%.2f,
+>48 ledouble x \bfps:%.2f
+
+# MPEG file
+# MPEG sequences
+# FIXME: This section is from the old magic.mime file and needs integrating with the rest
+0 belong 0x000001BA
+>4 byte &0x40
+!:mime video/mp2p
+>4 byte ^0x40
+!:mime video/mpeg
+0 belong 0x000001BB
+!:mime video/mpeg
+0 belong 0x000001B0
+!:mime video/mp4v-es
+0 belong 0x000001B5
+!:mime video/mp4v-es
+0 belong 0x000001B3
+!:mime video/mpv
+0 belong&0xFF5FFF1F 0x47400010
+!:mime video/mp2t
+0 belong 0x00000001
+>4 byte&0x1F 0x07
+!:mime video/h264
+
+# Type: Bink Video
+# URL: http://wiki.multimedia.cx/index.php?title=3DBink_Container
+# From: <hoehle at users.sourceforge.net> 2008-07-18
+0 string BIK Bink Video
+>3 regex =[a-z] rev.%s
+#>4 ulelong x size %d
+>20 ulelong x \b, %d
+>24 ulelong x \bx%d
+>8 ulelong x \b, %d frames
+>32 ulelong x at rate %d/
+>28 ulelong >1 \b%d
+>40 ulelong =0 \b, no audio
+>40 ulelong !0 \b, %d audio track
+>>40 ulelong !1 \bs
+# follow properties of the first audio track only
+>>48 uleshort x %dHz
+>>51 byte&0x20 0 mono
+>>51 byte&0x20 !0 stereo
+#>>51 byte&0x10 0 FFT
+#>>51 byte&0x10 !0 DCT
+
+#------------------------------------------------------------------------------
+# $File: apl,v 1.6 2009/09/19 16:28:07 christos Exp $
+# apl: file(1) magic for APL (see also "pdp" and "vax" for other APL
+# workspaces)
+#
+0 long 0100554 APL workspace (Ken's original?)
+
+#------------------------------------------------------------------------------
+# $File: apple,v 1.23 2009/09/19 16:28:08 christos Exp $
+# apple: file(1) magic for Apple file formats
+#
+0 search/1 FiLeStArTfIlEsTaRt binscii (apple ][) text
+0 string \x0aGL Binary II (apple ][) data
+0 string \x76\xff Squeezed (apple ][) data
+0 string NuFile NuFile archive (apple ][) data
+0 string N\xf5F\xe9l\xe5 NuFile archive (apple ][) data
+0 belong 0x00051600 AppleSingle encoded Macintosh file
+0 belong 0x00051607 AppleDouble encoded Macintosh file
+
+# Type: Apple Emulator 2IMG format
+# From: Radek Vokal <rvokal at redhat.com>
+0 string 2IMG Apple ][ 2IMG Disk Image
+>4 string XGS! \b, XGS
+>4 string CTKG \b, Catakig
+>4 string ShIm \b, Sheppy's ImageMaker
+>4 string WOOF \b, Sweet 16
+>4 string B2TR \b, Bernie ][ the Rescue
+>4 string !nfc \b, ASIMOV2
+>4 string x \b, Unknown Format
+>0xc byte 00 \b, DOS 3.3 sector order
+>>0x10 byte 00 \b, Volume 254
+>>0x10 byte&0x7f x \b, Volume %u
+>0xc byte 01 \b, ProDOS sector order
+>>0x14 short x \b, %u Blocks
+>0xc byte 02 \b, NIB data
+
+# magic for Newton PDA package formats
+# from Ruda Moura <ruda at helllabs.org>
+0 string package0 Newton package, NOS 1.x,
+>12 belong &0x80000000 AutoRemove,
+>12 belong &0x40000000 CopyProtect,
+>12 belong &0x10000000 NoCompression,
+>12 belong &0x04000000 Relocation,
+>12 belong &0x02000000 UseFasterCompression,
+>16 belong x version %d
+
+0 string package1 Newton package, NOS 2.x,
+>12 belong &0x80000000 AutoRemove,
+>12 belong &0x40000000 CopyProtect,
+>12 belong &0x10000000 NoCompression,
+>12 belong &0x04000000 Relocation,
+>12 belong &0x02000000 UseFasterCompression,
+>16 belong x version %d
+
+0 string package4 Newton package,
+>8 byte 8 NOS 1.x,
+>8 byte 9 NOS 2.x,
+>12 belong &0x80000000 AutoRemove,
+>12 belong &0x40000000 CopyProtect,
+>12 belong &0x10000000 NoCompression,
+
+# The following entries for the Apple II are for files that have
+# been transferred as raw binary data from an Apple, without having
+# been encapsulated by any of the above archivers.
+#
+# In general, Apple II formats are hard to identify because Apple DOS
+# and especially Apple ProDOS have strong typing in the file system and
+# therefore programmers never felt much need to include type information
+# in the files themselves.
+#
+# Eric Fischer <enf at pobox.com>
+
+# AppleWorks word processor:
+#
+# This matches the standard tab stops for an AppleWorks file, but if
+# a file has a tab stop set in the first four columns this will fail.
+#
+# The "O" is really the magic number, but that's so common that it's
+# necessary to check the tab stops that follow it to avoid false positives.
+
+4 string O==== AppleWorks word processor data
+>85 byte&0x01 >0 \b, zoomed
+>90 byte&0x01 >0 \b, paginated
+>92 byte&0x01 >0 \b, with mail merge
+#>91 byte x \b, left margin %d
+
+# AppleWorks database:
+#
+# This isn't really a magic number, but it's the closest thing to one
+# that I could find. The 1 and 2 really mean "order in which you defined
+# categories" and "left to right, top to bottom," respectively; the D and R
+# mean that the cursor should move either down or right when you press Return.
+
+#30 string \x01D AppleWorks database data
+#30 string \x02D AppleWorks database data
+#30 string \x01R AppleWorks database data
+#30 string \x02R AppleWorks database data
+
+# AppleWorks spreadsheet:
+#
+# Likewise, this isn't really meant as a magic number. The R or C means
+# row- or column-order recalculation; the A or M means automatic or manual
+# recalculation.
+
+#131 string RA AppleWorks spreadsheet data
+#131 string RM AppleWorks spreadsheet data
+#131 string CA AppleWorks spreadsheet data
+#131 string CM AppleWorks spreadsheet data
+
+# Applesoft BASIC:
+#
+# This is incredibly sloppy, but will be true if the program was
+# written at its usual memory location of 2048 and its first line
+# number is less than 256. Yuck.
+
+0 belong&0xff00ff 0x80000 Applesoft BASIC program data
+#>2 leshort x \b, first line number %d
+
+# ORCA/EZ assembler:
+#
+# This will not identify ORCA/M source files, since those have
+# some sort of date code instead of the two zero bytes at 6 and 7
+# XXX Conflicts with ELF
+#4 belong&0xff00ffff 0x01000000 ORCA/EZ assembler source data
+#>5 byte x \b, build number %d
+
+# Broderbund Fantavision
+#
+# I don't know what these values really mean, but they seem to recur.
+# Will they cause too many conflicts?
+
+# Probably :-)
+#2 belong&0xFF00FF 0x040008 Fantavision movie data
+
+# Some attempts at images.
+#
+# These are actually just bit-for-bit dumps of the frame buffer, so
+# there's really no reasonably way to distinguish them except for their
+# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
+# or, occasionally, 8184.
+#
+# Nevertheless this will manage to catch a lot of images that happen
+# to have a solid-colored line at the bottom of the screen.
+
+# GRR: Magic too weak
+#8144 string \x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F Apple II image with white background
+#8144 string \x55\x2A\x55\x2A\x55\x2A\x55\x2A Apple II image with purple background
+#8144 string \x2A\x55\x2A\x55\x2A\x55\x2A\x55 Apple II image with green background
+#8144 string \xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA Apple II image with blue background
+#8144 string \xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5 Apple II image with orange background
+
+# Beagle Bros. Apple Mechanic fonts
+
+0 belong&0xFF00FFFF 0x6400D000 Apple Mechanic font
+
+# Apple Universal Disk Image Format (UDIF) - dmg files.
+# From Johan Gade.
+# These entries are disabled for now until we fix the following issues.
+#
+# Note there might be some problems with the "VAX COFF executable"
+# entry. Note this entry should be placed before the mac filesystem section,
+# particularly the "Apple Partition data" entry.
+#
+# The intended meaning of these tests is, that the file is only of the
+# specified type if both of the lines are correct - i.e. if the first
+# line matches and the second doesn't then it is not of that type.
+#
+#0 long 0x7801730d
+#>4 long 0x62626060 UDIF read-only zlib-compressed image (UDZO)
+#
+# Note that this entry is recognized correctly by the "Apple Partition
+# data" entry - however since this entry is more specific - this
+# information seems to be more useful.
+#0 long 0x45520200
+#>0x410 string disk\ image UDIF read/write image (UDRW)
+
+# From: Toby Peterson <toby at apple.com>
+0 string bplist00 Apple binary property list
+
+# Apple binary property list (bplist)
+# Assumes version bytes are hex.
+# Provides content hints for version 0 files. Assumes that the root
+# object is the first object (true for CoreFoundation implementation).
+# From: David Remahl <dremahl at apple.com>
+0 string bplist
+>6 byte x \bCoreFoundation binary property list data, version 0x%c
+>>7 byte x \b%c
+>6 string 00 \b
+>>8 byte&0xF0 0x00 \b
+>>>8 byte&0x0F 0x00 \b, root type: null
+>>>8 byte&0x0F 0x08 \b, root type: false boolean
+>>>8 byte&0x0F 0x09 \b, root type: true boolean
+>>8 byte&0xF0 0x10 \b, root type: integer
+>>8 byte&0xF0 0x20 \b, root type: real
+>>8 byte&0xF0 0x30 \b, root type: date
+>>8 byte&0xF0 0x40 \b, root type: data
+>>8 byte&0xF0 0x50 \b, root type: ascii string
+>>8 byte&0xF0 0x60 \b, root type: unicode string
+>>8 byte&0xF0 0x80 \b, root type: uid (CORRUPT)
+>>8 byte&0xF0 0xa0 \b, root type: array
+>>8 byte&0xF0 0xd0 \b, root type: dictionary
+
+# Apple/NeXT typedstream data
+# Serialization format used by NeXT and Apple for various
+# purposes in YellowStep/Cocoa, including some nib files.
+# From: David Remahl <dremahl at apple.com>
+2 string typedstream NeXT/Apple typedstream data, big endian
+>0 byte x \b, version %hhd
+>0 byte <5 \b
+>>13 byte 0x81 \b
+>>>14 ubeshort x \b, system %hd
+2 string streamtyped NeXT/Apple typedstream data, little endian
+>0 byte x \b, version %hhd
+>0 byte <5 \b
+>>13 byte 0x81 \b
+>>>14 uleshort x \b, system %hd
+
+#------------------------------------------------------------------------------
+# CAF: Apple CoreAudio File Format
+#
+# Container format for high-end audio purposes.
+# From: David Remahl <dremahl at apple.com>
+#
+0 string caff CoreAudio Format audio file
+>4 beshort <10 version %d
+>6 beshort x
+
+
+#------------------------------------------------------------------------------
+# Keychain database files
+0 string kych Mac OS X Keychain File
+
+#------------------------------------------------------------------------------
+# Code Signing related file types
+0 belong 0xfade0c00 Mac OS X Code Requirement
+>8 belong 1 (opExpr)
+>4 belong x - %d bytes
+
+0 belong 0xfade0c01 Mac OS X Code Requirement Set
+>8 belong >1 containing %d items
+>4 belong x - %d bytes
+
+0 belong 0xfade0c02 Mac OS X Code Directory
+>8 belong x version %x
+>12 belong >0 flags 0x%x
+>4 belong x - %d bytes
+
+0 belong 0xfade0cc0 Mac OS X Detached Code Signature (non-executable)
+>4 belong x - %d bytes
+
+0 belong 0xfade0cc1 Mac OS X Detached Code Signature
+>8 belong >1 (%d elements)
+>4 belong x - %d bytes
+
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+# .vdi
+4 string innotek\ VirtualBox\ Disk\ Image %s
+
+#------------------------------------------------------------------------------
+# $File: applix,v 1.5 2009/09/19 16:28:08 christos Exp $
+# applix: file(1) magic for Applixware
+# From: Peter Soos <sp at osb.hu>
+#
+0 string *BEGIN Applixware
+>7 string WORDS Words Document
+>7 string GRAPHICS Graphic
+>7 string RASTER Bitmap
+>7 string SPREADSHEETS Spreadsheet
+>7 string MACRO Macro
+>7 string BUILDER Builder Object
+
+#------------------------------------------------------------------------------
+# $File: archive,v 1.55 2009/12/04 15:00:47 christos Exp $
+# archive: file(1) magic for archive formats (see also "msdos" for self-
+# extracting compressed archives)
+#
+# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
+# pre-POSIX "tar" archives are handled in the C code.
+
+# POSIX tar archives
+257 string ustar\0 POSIX tar archive
+!:mime application/x-tar # encoding: posix
+257 string ustar\040\040\0 GNU tar archive
+!:mime application/x-tar # encoding: gnu
+
+# cpio archives
+#
+# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats and thus are strings, not numbers.
+0 short 070707 cpio archive
+!:mime application/x-cpio
+0 short 0143561 byte-swapped cpio archive
+!:mime application/x-cpio # encoding: swapped
+0 string 070707 ASCII cpio archive (pre-SVR4 or odc)
+0 string 070701 ASCII cpio archive (SVR4 with no CRC)
+0 string 070702 ASCII cpio archive (SVR4 with CRC)
+
+# Debian package (needs to go before regular portable archives)
+#
+0 string =!<arch>\ndebian
+!:mime application/x-debian-package
+>8 string debian-split part of multipart Debian package
+>8 string debian-binary Debian binary package
+>8 string !debian
+>68 string >\0 (format %s)
+# These next two lines do not work, because a bzip2 Debian archive
+# still uses gzip for the control.tar (first in the archive). Only
+# data.tar varies, and the location of its filename varies too.
+# file/libmagic does not current have support for ascii-string based
+# (offsets) as of 2005-09-15.
+#>81 string bz2 \b, uses bzip2 compression
+#>84 string gz \b, uses gzip compression
+#>136 ledate x created: %s
+
+# other archives
+0 long 0177555 very old archive
+0 short 0177555 very old PDP-11 archive
+0 long 0177545 old archive
+0 short 0177545 old PDP-11 archive
+0 long 0100554 apl workspace
+0 string =<ar> archive
+!:mime application/x-archive
+
+# MIPS archive (needs to go before regular portable archives)
+#
+0 string =!<arch>\n__________E MIPS archive
+>20 string U with MIPS Ucode members
+>21 string L with MIPSEL members
+>21 string B with MIPSEB members
+>19 string L and an EL hash table
+>19 string B and an EB hash table
+>22 string X -- out of date
+
+0 search/1 -h- Software Tools format archive text
+
+#
+# XXX - why are there multiple <ar> thingies? Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0 string =!<arch> current ar archive
+# 0 long 0x213c6172 archive file
+#
+# and for SVR1 archives, we have:
+#
+# 0 string \<ar> System V Release 1 ar archive
+# 0 string =<ar> archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0 string =!<arch> current ar archive
+!:mime application/x-archive
+>8 string __.SYMDEF random library
+>0 belong =65538 - pre SR9.5
+>0 belong =65539 - post SR9.5
+>0 beshort 2 - object archive
+>0 beshort 3 - shared library module
+>0 beshort 4 - debug break-pointed module
+>0 beshort 5 - absolute code program module
+0 string \<ar> System V Release 1 ar archive
+0 string =<ar> archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+0 belong 0x65ff0000 VAX 3.0 archive
+0 belong 0x3c61723e VAX 5.0 archive
+#
+0 long 0x213c6172 archive file
+0 lelong 0177555 very old VAX archive
+0 leshort 0177555 very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0 lelong 0177545 old VAX archive
+>8 string __.SYMDEF random library
+0 leshort 0177545 old PDP-11 archive
+>8 string __.SYMDEF random library
+#
+# From "pdp" (but why a 4-byte quantity?)
+#
+0 lelong 0x39bed PDP-11 old archive
+0 lelong 0x39bee PDP-11 4.0 archive
+
+# ARC archiver, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# The first byte is the magic (0x1a), byte 2 is the compression type for
+# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
+# filename of the first file (null terminated). Since some types collide
+# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
+# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%). 0x01 collides with terminfo.
+0 lelong&0x8080ffff 0x0000081a ARC archive data, dynamic LZW
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000091a ARC archive data, squashed
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000021a ARC archive data, uncompressed
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000031a ARC archive data, packed
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000041a ARC archive data, squeezed
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000061a ARC archive data, crunched
+!:mime application/x-arc
+# [JW] stuff taken from idarc, obviously ARC successors:
+0 lelong&0x8080ffff 0x00000a1a PAK archive data
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000141a ARC+ archive data
+!:mime application/x-arc
+0 lelong&0x8080ffff 0x0000481a HYP archive data
+!:mime application/x-arc
+
+# Acorn archive formats (Disaster prone simpleton, m91dps at ecs.ox.ac.uk)
+# I can't create either SPARK or ArcFS archives so I have not tested this stuff
+# [GRR: the original entries collide with ARC, above; replaced with combined
+# version (not tested)]
+#0 byte 0x1a RISC OS archive (spark format)
+0 string \032archive RISC OS archive (ArcFS format)
+0 string Archive\000 RISC OS archive (ArcFS format)
+
+# All these were taken from idarc, many could not be verified. Unfortunately,
+# there were many low-quality sigs, i.e. easy to trigger false positives.
+# Please notify me of any real-world fishy/ambiguous signatures and I'll try
+# to get my hands on the actual archiver and see if I find something better. [JW]
+# probably many can be enhanced by finding some 0-byte or control char near the start
+
+# idarc calls this Crush/Uncompressed... *shrug*
+0 string CRUSH Crush archive data
+# Squeeze It (.sqz)
+0 string HLSQZ Squeeze It archive data
+# SQWEZ
+0 string SQWEZ SQWEZ archive data
+# HPack (.hpk)
+0 string HPAK HPack archive data
+# HAP
+0 string \x91\x33HF HAP archive data
+# MD/MDCD
+0 string MDmd MDCD archive data
+# LIM
+0 string LIM\x1a LIM archive data
+# SAR
+3 string LH5 SAR archive data
+# BSArc/BS2
+0 string \212\3SB \0 BSArc/BS2 archive data
+# MAR
+2 string =-ah MAR archive data
+# ACB
+0 belong&0x00f800ff 0x00800000 ACB archive data
+# CPZ
+# TODO, this is what idarc says: 0 string \0\0\0 CPZ archive data
+# JRC
+0 string JRchive JRC archive data
+# Quantum
+0 string DS\0 Quantum archive data
+# ReSOF
+0 string PK\3\6 ReSOF archive data
+# QuArk
+0 string 7\4 QuArk archive data
+# YAC
+14 string YC YAC archive data
+# X1
+0 string X1 X1 archive data
+0 string XhDr X1 archive data
+# CDC Codec (.dqt)
+0 belong&0xffffe000 0x76ff2000 CDC Codec archive data
+# AMGC
+0 string \xad6" AMGC archive data
+# NuLIB
+0 string NõFélå NuLIB archive data
+# PakLeo
+0 string LEOLZW PAKLeo archive data
+# ChArc
+0 string SChF ChArc archive data
+# PSA
+0 string PSA PSA archive data
+# CrossePAC
+0 string DSIGDCC CrossePAC archive data
+# Freeze
+0 string \x1f\x9f\x4a\x10\x0a Freeze archive data
+# KBoom
+0 string ¨MP¨ KBoom archive data
+# NSQ, must go after CDC Codec
+0 string \x76\xff NSQ archive data
+# DPA
+0 string Dirk\ Paehl DPA archive data
+# BA
+# TODO: idarc says "bytes 0-2 == bytes 3-5"
+# TTComp
+0 string \0\6 TTComp archive data
+# ESP, could this conflict with Easy Software Products' (e.g.ESP ghostscript) documentation?
+0 string ESP ESP archive data
+# ZPack
+0 string \1ZPK\1 ZPack archive data
+# Sky
+0 string \xbc\x40 Sky archive data
+# UFA
+0 string UFA UFA archive data
+# Dry
+0 string =-H2O DRY archive data
+# FoxSQZ
+0 string FOXSQZ FoxSQZ archive data
+# AR7
+0 string ,AR7 AR7 archive data
+# PPMZ
+0 string PPMZ PPMZ archive data
+# MS Compress
+4 string \x88\xf0\x27 MS Compress archive data
+# updated by Joerg Jenderek
+>9 string \0
+>>0 string KWAJ
+>>>7 string \321\003 MS Compress archive data
+>>>>14 ulong >0 \b, original size: %ld bytes
+>>>>18 ubyte >0x65
+>>>>>18 string x \b, was %.8s
+>>>>>(10.b-4) string x \b.%.3s
+# MP3 (archiver, not lossy audio compression)
+0 string MP3\x1a MP3-Archiver archive data
+# ZET
+0 string OZÝ ZET archive data
+# TSComp
+0 string \x65\x5d\x13\x8c\x08\x01\x03\x00 TSComp archive data
+# ARQ
+0 string gW\4\1 ARQ archive data
+# Squash
+3 string OctSqu Squash archive data
+# Terse
+0 string \5\1\1\0 Terse archive data
+# PUCrunch
+0 string \x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31 PUCrunch archive data
+# UHarc
+0 string UHA UHarc archive data
+# ABComp
+0 string \2AB ABComp archive data
+0 string \3AB2 ABComp archive data
+# CMP
+0 string CO\0 CMP archive data
+# Splint
+0 string \x93\xb9\x06 Splint archive data
+# InstallShield
+0 string \x13\x5d\x65\x8c InstallShield Z archive Data
+# Gather
+1 string GTH Gather archive data
+# BOA
+0 string BOA BOA archive data
+# RAX
+0 string ULEB\xa RAX archive data
+# Xtreme
+0 string ULEB\0 Xtreme archive data
+# Pack Magic
+0 string @â\1\0 Pack Magic archive data
+# BTS
+0 belong&0xfeffffff 0x1a034465 BTS archive data
+# ELI 5750
+0 string Ora\ ELI 5750 archive data
+# QFC
+0 string \x1aFC\x1a QFC archive data
+0 string \x1aQF\x1a QFC archive data
+# PRO-PACK
+0 string RNC PRO-PACK archive data
+# 777
+0 string 777 777 archive data
+# LZS221
+0 string sTaC LZS221 archive data
+# HPA
+0 string HPA HPA archive data
+# Arhangel
+0 string LG Arhangel archive data
+# EXP1, uses bzip2
+0 string 0123456789012345BZh EXP1 archive data
+# IMP
+0 string IMP\xa IMP archive data
+# NRV
+0 string \x00\x9E\x6E\x72\x76\xFF NRV archive data
+# Squish
+0 string \x73\xb2\x90\xf4 Squish archive data
+# Par
+0 string PHILIPP Par archive data
+0 string PAR Par archive data
+# HIT
+0 string UB HIT archive data
+# SBX
+0 belong&0xfffff000 0x53423000 SBX archive data
+# NaShrink
+0 string NSK NaShrink archive data
+# SAPCAR
+0 string #\ CAR\ archive\ header SAPCAR archive data
+0 string CAR\ 2.00RG SAPCAR archive data
+# Disintegrator
+0 string DST Disintegrator archive data
+# ASD
+0 string ASD ASD archive data
+# InstallShield CAB
+0 string ISc( InstallShield CAB
+# TOP4
+0 string T4\x1a TOP4 archive data
+# BatComp left out: sig looks like COM executable
+# so TODO: get real 4dos batcomp file and find sig
+# BlakHole
+0 string BH\5\7 BlakHole archive data
+# BIX
+0 string BIX0 BIX archive data
+# ChiefLZA
+0 string ChfLZ ChiefLZA archive data
+# Blink
+0 string Blink Blink archive data
+# Logitech Compress
+0 string \xda\xfa Logitech Compress archive data
+# ARS-Sfx (FIXME: really a SFX? then goto COM/EXE)
+1 string (C)\ STEPANYUK ARS-Sfx archive data
+# AKT/AKT32
+0 string AKT32 AKT32 archive data
+0 string AKT AKT archive data
+# NPack
+0 string MSTSM NPack archive data
+# PFT
+0 string \0\x50\0\x14 PFT archive data
+# SemOne
+0 string SEM SemOne archive data
+# PPMD
+0 string \x8f\xaf\xac\x84 PPMD archive data
+# FIZ
+0 string FIZ FIZ archive data
+# MSXiE
+0 belong&0xfffff0f0 0x4d530000 MSXiE archive data
+# DeepFreezer
+0 belong&0xfffffff0 0x797a3030 DeepFreezer archive data
+# DC
+0 string =<DC- DC archive data
+# TPac
+0 string \4TPAC\3 TPac archive data
+# Ai
+0 string Ai\1\1\0 Ai archive data
+0 string Ai\1\0\0 Ai archive data
+# Ai32
+0 string Ai\2\0 Ai32 archive data
+0 string Ai\2\1 Ai32 archive data
+# SBC
+0 string SBC SBC archive data
+# Ybs
+0 string YBS Ybs archive data
+# DitPack
+0 string \x9e\0\0 DitPack archive data
+# DMS
+0 string DMS! DMS archive data
+# EPC
+0 string \x8f\xaf\xac\x8c EPC archive data
+# VSARC
+0 string VS\x1a VSARC archive data
+# PDZ
+0 string PDZ PDZ archive data
+# ReDuq
+0 string rdqx ReDuq archive data
+# GCA
+0 string GCAX GCA archive data
+# PPMN
+0 string pN PPMN archive data
+# WinImage
+3 string WINIMAGE WinImage archive data
+# Compressia
+0 string CMP0CMP Compressia archive data
+# UHBC
+0 string UHB UHBC archive data
+# WinHKI
+0 string \x61\x5C\x04\x05 WinHKI archive data
+# WWPack data file
+0 string WWP WWPack archive data
+# BSN (BSA, PTS-DOS)
+0 string \xffBSG BSN archive data
+1 string \xffBSG BSN archive data
+3 string \xffBSG BSN archive data
+1 string \0\xae\2 BSN archive data
+1 string \0\xae\3 BSN archive data
+1 string \0\xae\7 BSN archive data
+# AIN
+0 string \x33\x18 AIN archive data
+0 string \x33\x17 AIN archive data
+# XPA32
+0 string xpa\0\1 XPA32 archive data
+# SZip (TODO: doesn't catch all versions)
+0 string SZ\x0a\4 SZip archive data
+# XPack DiskImage
+0 string jm XPack DiskImage archive data
+# XPack Data
+0 string xpa XPack archive data
+# XPack Single Data
+0 string Í\ jm XPack single archive data
+
+# TODO: missing due to unknown magic/magic at end of file:
+#DWC
+#ARG
+#ZAR
+#PC/3270
+#InstallIt
+#RKive
+#RK
+#XPack Diskimage
+
+# These were inspired by idarc, but actually verified
+# Dzip archiver (.dz)
+0 string DZ Dzip archive data
+>2 byte x \b, version %i
+>3 byte x \b.%i
+# ZZip archiver (.zz)
+0 string ZZ\ \0\0 ZZip archive data
+0 string ZZ0 ZZip archive data
+# PAQ archiver (.paq)
+0 string \xaa\x40\x5f\x77\x1f\xe5\x82\x0d PAQ archive data
+0 string PAQ PAQ archive data
+>3 byte&0xf0 0x30
+>>3 byte x (v%c)
+# JAR archiver (.j), this is the successor to ARJ, not Java's JAR (which is essentially ZIP)
+0xe string \x1aJar\x1b JAR (ARJ Software, Inc.) archive data
+0 string JARCS JAR (ARJ Software, Inc.) archive data
+
+# ARJ archiver (jason at jarthur.Claremont.EDU)
+0 leshort 0xea60 ARJ archive data
+!:mime application/x-arj
+>5 byte x \b, v%d,
+>8 byte &0x04 multi-volume,
+>8 byte &0x10 slash-switched,
+>8 byte &0x20 backup,
+>34 string x original name: %s,
+>7 byte 0 os: MS-DOS
+>7 byte 1 os: PRIMOS
+>7 byte 2 os: Unix
+>7 byte 3 os: Amiga
+>7 byte 4 os: Macintosh
+>7 byte 5 os: OS/2
+>7 byte 6 os: Apple ][ GS
+>7 byte 7 os: Atari ST
+>7 byte 8 os: NeXT
+>7 byte 9 os: VAX/VMS
+>3 byte >0 %d]
+# [JW] idarc says this is also possible
+2 leshort 0xea60 ARJ archive data
+
+# HA archiver (Greg Roelofs, newt at uchicago.edu)
+# This is a really bad format. A file containing HAWAII will match this...
+#0 string HA HA archive data,
+#>2 leshort =1 1 file,
+#>2 leshort >1 %u files,
+#>4 byte&0x0f =0 first is type CPY
+#>4 byte&0x0f =1 first is type ASC
+#>4 byte&0x0f =2 first is type HSC
+#>4 byte&0x0f =0x0e first is type DIR
+#>4 byte&0x0f =0x0f first is type SPECIAL
+# suggestion: at least identify small archives (<1024 files)
+0 belong&0xffff00fc 0x48410000 HA archive data
+>2 leshort =1 1 file,
+>2 leshort >1 %u files,
+>4 byte&0x0f =0 first is type CPY
+>4 byte&0x0f =1 first is type ASC
+>4 byte&0x0f =2 first is type HSC
+>4 byte&0x0f =0x0e first is type DIR
+>4 byte&0x0f =0x0f first is type SPECIAL
+
+# HPACK archiver (Peter Gutmann, pgut1 at cs.aukuni.ac.nz)
+0 string HPAK HPACK archive data
+
+# JAM Archive volume format, by Dmitry.Kohmanyuk at UA.net
+0 string \351,\001JAM\ JAM archive,
+>7 string >\0 version %.4s
+>0x26 byte =0x27 -
+>>0x2b string >\0 label %.11s,
+>>0x27 lelong x serial %08x,
+>>0x36 string >\0 fstype %.8s
+
+# LHARC/LHA archiver (Greg Roelofs, newt at uchicago.edu)
+2 string -lh0- LHarc 1.x/ARX archive data [lh0]
+!:mime application/x-lharc
+2 string -lh1- LHarc 1.x/ARX archive data [lh1]
+!:mime application/x-lharc
+2 string -lz4- LHarc 1.x archive data [lz4]
+!:mime application/x-lharc
+2 string -lz5- LHarc 1.x archive data [lz5]
+!:mime application/x-lharc
+# [never seen any but the last; -lh4- reported in comp.compression:]
+2 string -lzs- LHa/LZS archive data [lzs]
+!:mime application/x-lha
+2 string -lh\40- LHa 2.x? archive data [lh ]
+!:mime application/x-lha
+2 string -lhd- LHa 2.x? archive data [lhd]
+!:mime application/x-lha
+2 string -lh2- LHa 2.x? archive data [lh2]
+!:mime application/x-lha
+2 string -lh3- LHa 2.x? archive data [lh3]
+!:mime application/x-lha
+2 string -lh4- LHa (2.x) archive data [lh4]
+!:mime application/x-lha
+2 string -lh5- LHa (2.x) archive data [lh5]
+!:mime application/x-lha
+2 string -lh6- LHa (2.x) archive data [lh6]
+!:mime application/x-lha
+2 string -lh7- LHa (2.x)/LHark archive data [lh7]
+!:mime application/x-lha
+>20 byte x - header level %d
+# taken from idarc [JW]
+2 string -lZ PUT archive data
+2 string -lz LZS archive data
+2 string -sw1- Swag archive data
+
+# RAR archiver (Greg Roelofs, newt at uchicago.edu)
+0 string Rar! RAR archive data,
+!:mime application/x-rar
+>44 byte x v%0x,
+>10 byte >0 flags:
+>>10 byte &0x01 Archive volume,
+>>10 byte &0x02 Commented,
+>>10 byte &0x04 Locked,
+>>10 byte &0x08 Solid,
+>>10 byte &0x20 Authenticated,
+>35 byte 0 os: MS-DOS
+>35 byte 1 os: OS/2
+>35 byte 2 os: Win32
+>35 byte 3 os: Unix
+# some old version? idarc says:
+0 string RE\x7e\x5e RAR archive data
+
+# SQUISH archiver (Greg Roelofs, newt at uchicago.edu)
+0 string SQSH squished archive data (Acorn RISCOS)
+
+# UC2 archiver (Greg Roelofs, newt at uchicago.edu)
+# [JW] see exe section for self-extracting version
+0 string UC2\x1a UC2 archive data
+
+# PKZIP multi-volume archive
+0 string PK\x07\x08PK\x03\x04 Zip multi-volume archive data, at least PKZIP v2.50 to extract
+!:mime application/zip
+
+# ZIP archives (Greg Roelofs, c/o zip-bugs at wkuvx1.wku.edu)
+0 string PK\003\004
+>30 ubelong !0x6d696d65
+>>4 byte 0x00 Zip archive data
+!:mime application/zip
+>>4 byte 0x09 Zip archive data, at least v0.9 to extract
+!:mime application/zip
+>>4 byte 0x0a Zip archive data, at least v1.0 to extract
+!:mime application/zip
+>>4 byte 0x0b Zip archive data, at least v1.1 to extract
+!:mime application/zip
+>>0x161 string WINZIP Zip archive data, WinZIP self-extracting
+!:mime application/zip
+>>4 byte 0x14 Zip archive data, at least v2.0 to extract
+!:mime application/zip
+>>4 byte 0x2d Zip64 archive data, at least v3.0 to extract
+!:mime application/zip
+
+# OpenOffice.org / KOffice / StarOffice documents
+# Listed here because they ARE zip files
+#
+# From: Abel Cheung <abel at oaka.org>
+>30 string mimetype
+
+# KOffice (1.2 or above) formats
+>>50 string vnd.kde. KOffice (>=1.2)
+>>>58 string karbon Karbon document
+>>>58 string kchart KChart document
+>>>58 string kformula KFormula document
+>>>58 string kivio Kivio document
+>>>58 string kontour Kontour document
+>>>58 string kpresenter KPresenter document
+>>>58 string kspread KSpread document
+>>>58 string kword KWord document
+
+# OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7)
+>>50 string vnd.sun.xml. OpenOffice.org 1.x
+>>>62 string writer Writer
+>>>>68 byte !0x2e document
+>>>>68 string .template template
+>>>>68 string .global global document
+>>>62 string calc Calc
+>>>>66 byte !0x2e spreadsheet
+>>>>66 string .template template
+>>>62 string draw Draw
+>>>>66 byte !0x2e document
+>>>>66 string .template template
+>>>62 string impress Impress
+>>>>69 byte !0x2e presentation
+>>>>69 string .template template
+>>>62 string math Math document
+>>>62 string base Database file
+
+# OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8)
+# http://lists.oasis-open.org/archives/office/200505/msg00006.html
+>>50 string vnd.oasis.opendocument. OpenDocument
+>>>73 string text
+>>>>77 byte !0x2d Text
+!:mime application/vnd.oasis.opendocument.text
+>>>>77 string -template Text Template
+!:mime application/vnd.oasis.opendocument.text-template
+>>>>77 string -web HTML Document Template
+!:mime application/vnd.oasis.opendocument.text-web
+>>>>77 string -master Master Document
+!:mime application/vnd.oasis.opendocument.text-master
+>>>73 string graphics
+>>>>81 byte !0x2d Drawing
+!:mime application/vnd.oasis.opendocument.graphics
+>>>>81 string -template Template
+!:mime application/vnd.oasis.opendocument.graphics-template
+>>>73 string presentation
+>>>>85 byte !0x2d Presentation
+!:mime application/vnd.oasis.opendocument.presentation
+>>>>85 string -template Template
+!:mime application/vnd.oasis.opendocument.presentation-template
+>>>73 string spreadsheet
+>>>>84 byte !0x2d Spreadsheet
+!:mime application/vnd.oasis.opendocument.spreadsheet
+>>>>84 string -template Template
+!:mime application/vnd.oasis.opendocument.spreadsheet-template
+>>>73 string chart
+>>>>78 byte !0x2d Chart
+!:mime application/vnd.oasis.opendocument.chart
+>>>>78 string -template Template
+!:mime application/vnd.oasis.opendocument.chart-template
+>>>73 string formula
+>>>>80 byte !0x2d Formula
+!:mime application/vnd.oasis.opendocument.formula
+>>>>80 string -template Template
+!:mime application/vnd.oasis.opendocument.formula-template
+>>>73 string database Database
+!:mime application/vnd.oasis.opendocument.database
+>>>73 string image
+>>>>78 byte !0x2d Image
+!:mime application/vnd.oasis.opendocument.image
+>>>>78 string -template Template
+!:mime application/vnd.oasis.opendocument.image-template
+
+# Zoo archiver
+20 lelong 0xfdc4a7dc Zoo archive data
+!:mime application/x-zoo
+>4 byte >48 \b, v%c.
+>>6 byte >47 \b%c
+>>>7 byte >47 \b%c
+>32 byte >0 \b, modify: v%d
+>>33 byte x \b.%d+
+>42 lelong 0xfdc4a7dc \b,
+>>70 byte >0 extract: v%d
+>>>71 byte x \b.%d+
+
+# Shell archives
+10 string #\ This\ is\ a\ shell\ archive shell archive text
+!:mime application/octet-stream
+
+#
+# LBR. NB: May conflict with the questionable
+# "binary Computer Graphics Metafile" format.
+#
+0 string \0\ \ \ \ \ \ \ \ \ \ \ \0\0 LBR archive data
+#
+# PMA (CP/M derivative of LHA)
+#
+2 string -pm0- PMarc archive data [pm0]
+2 string -pm1- PMarc archive data [pm1]
+2 string -pm2- PMarc archive data [pm2]
+2 string -pms- PMarc SFX archive (CP/M, DOS)
+5 string -pc1- PopCom compressed executable (CP/M)
+
+# From Rafael Laboissiere <rafael at laboissiere.net>
+# The Project Revision Control System (see
+# http://prcs.sourceforge.net) generates a packaged project
+# file which is recognized by the following entry:
+0 leshort 0xeb81 PRCS packaged project
+
+# Microsoft cabinets
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+#0 string MSCF\0\0\0\0 Microsoft cabinet file data,
+#>25 byte x v%d
+#>24 byte x \b.%d
+# MPi: All CABs have version 1.3, so this is pointless.
+# Better magic in debian-additions.
+
+# GTKtalog catalogs
+# by David Necas (Yeti) <yeti at physics.muni.cz>
+4 string gtktalog\ GTKtalog catalog data,
+>13 string 3 version 3
+>>14 beshort 0x677a (gzipped)
+>>14 beshort !0x677a (not gzipped)
+>13 string >3 version %s
+
+############################################################################
+# Parity archive reconstruction file, the 'par' file format now used on Usenet.
+0 string PAR\0 PARity archive data
+>48 leshort =0 - Index file
+>48 leshort >0 - file number %d
+
+# Felix von Leitner <felix-file at fefe.de>
+0 string d8:announce BitTorrent file
+!:mime application/x-bittorrent
+
+# Atari MSA archive - Teemu Hukkanen <tjhukkan at iki.fi>
+0 beshort 0x0e0f Atari MSA archive data
+>2 beshort x \b, %d sectors per track
+>4 beshort 0 \b, 1 sided
+>4 beshort 1 \b, 2 sided
+>6 beshort x \b, starting track: %d
+>8 beshort x \b, ending track: %d
+
+# Alternate ZIP string (amc at arwen.cs.berkeley.edu)
+0 string PK00PK\003\004 Zip archive data
+
+# ACE archive (from http://www.wotsit.org/download.asp?f=ace)
+# by Stefan `Sec` Zehl <sec at 42.org>
+7 string **ACE** ACE archive data
+>15 byte >0 version %d
+>16 byte =0x00 \b, from MS-DOS
+>16 byte =0x01 \b, from OS/2
+>16 byte =0x02 \b, from Win/32
+>16 byte =0x03 \b, from Unix
+>16 byte =0x04 \b, from MacOS
+>16 byte =0x05 \b, from WinNT
+>16 byte =0x06 \b, from Primos
+>16 byte =0x07 \b, from AppleGS
+>16 byte =0x08 \b, from Atari
+>16 byte =0x09 \b, from Vax/VMS
+>16 byte =0x0A \b, from Amiga
+>16 byte =0x0B \b, from Next
+>14 byte x \b, version %d to extract
+>5 leshort &0x0080 \b, multiple volumes,
+>>17 byte x \b (part %d),
+>5 leshort &0x0002 \b, contains comment
+>5 leshort &0x0200 \b, sfx
+>5 leshort &0x0400 \b, small dictionary
+>5 leshort &0x0800 \b, multi-volume
+>5 leshort &0x1000 \b, contains AV-String
+>>30 string \x16*UNREGISTERED\x20VERSION* (unregistered)
+>5 leshort &0x2000 \b, with recovery record
+>5 leshort &0x4000 \b, locked
+>5 leshort &0x8000 \b, solid
+# Date in MS-DOS format (whatever that is)
+#>18 lelong x Created on
+
+# sfArk : compression program for Soundfonts (sf2) by Dirk Jagdmann
+# <doj at cubic.org>
+0x1A string sfArk sfArk compressed Soundfont
+>0x15 string 2
+>>0x1 string >\0 Version %s
+>>0x2A string >\0 : %s
+
+# DR-DOS 7.03 Packed File *.??_
+0 string Packed\ File\ Personal NetWare Packed File
+>12 string x \b, was "%.12s"
+
+# EET archive
+# From: Tilman Sauerbeck <tilman at code-monkey.de>
+0 belong 0x1ee7ff00 EET archive
+!:mime application/x-eet
+
+# rzip archives
+0 string RZIP rzip compressed data
+>4 byte x - version %d
+>5 byte x \b.%d
+>6 belong x (%d bytes)
+
+# From: "Robert Dale" <robdale at gmail.com>
+0 belong 123 dar archive,
+>4 belong x label "%.8x
+>>8 belong x %.8x
+>>>12 beshort x %.4x"
+>14 byte 0x54 end slice
+>14 beshort 0x4e4e multi-part
+>14 beshort 0x4e53 multi-part, with -S
+
+# Symbian installation files
+# http://www.thouky.co.uk/software/psifs/sis.html
+# http://developer.symbian.com/main/downloads/papers/SymbianOSv91/softwareinstallsis.pdf
+8 lelong 0x10000419 Symbian installation file
+!:mime application/vnd.symbian.install
+>4 lelong 0x1000006D (EPOC release 3/4/5)
+>4 lelong 0x10003A12 (EPOC release 6)
+0 lelong 0x10201A7A Symbian installation file (Symbian OS 9.x)
+!:mime x-epoc/x-sisx-app
+
+# From "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string MPQ\032 MoPaQ (MPQ) archive
+
+# From: Dirk Jagdmann <doj at cubic.org>
+# xar archive format: http://code.google.com/p/xar/
+0 string xar! xar archive
+>6 beshort x - version %ld
+
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+# .kgb
+0 string KGB_arch KGB Archiver file
+>10 string x with compression level %.1s
+
+# xar (eXtensible ARchiver) archive
+# From: "David Remahl" <dremahl at apple.com>
+0 string xar! xar archive
+#>4 beshort x header size %d
+>6 beshort x version %d,
+#>8 quad x compressed TOC: %d,
+#>16 quad x uncompressed TOC: %d,
+>24 belong 0 no checksum
+>24 belong 1 SHA-1 checksum
+>24 belong 2 MD5 checksum
+
+#------------------------------------------------------------------------------
+# $File: asterix,v 1.5 2009/09/19 16:28:08 christos Exp $
+# asterix: file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
+# strings as "long" - we assume they're just strings:
+# From: guy at netapp.com (Guy Harris)
+#
+0 string *STA Aster*x
+>7 string WORD Words Document
+>7 string GRAP Graphic
+>7 string SPRE Spreadsheet
+>7 string MACR Macro
+0 string 2278 Aster*x Version 2
+>29 byte 0x36 Words Document
+>29 byte 0x35 Graphic
+>29 byte 0x32 Spreadsheet
+>29 byte 0x38 Macro
+
+
+#------------------------------------------------------------------------------
+# $File: att3b,v 1.8 2009/09/19 16:28:08 christos Exp $
+# att3b: file(1) magic for AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+# The 3B20 conflicts with SCCS.
+#0 beshort 0550 3b20 COFF executable
+#>12 belong >0 not stripped
+#>22 beshort >0 - version %ld
+#0 beshort 0551 3b20 COFF executable (TV)
+#>12 belong >0 not stripped
+#>22 beshort >0 - version %ld
+#
+# WE32K
+#
+0 beshort 0560 WE32000 COFF
+>18 beshort ^00000020 object
+>18 beshort &00000020 executable
+>12 belong >0 not stripped
+>18 beshort ^00010000 N/A on 3b2/300 w/paging
+>18 beshort &00020000 32100 required
+>18 beshort &00040000 and MAU hardware required
+>20 beshort 0407 (impure)
+>20 beshort 0410 (pure)
+>20 beshort 0413 (demand paged)
+>20 beshort 0443 (target shared library)
+>22 beshort >0 - version %ld
+0 beshort 0561 WE32000 COFF executable (TV)
+>12 belong >0 not stripped
+#>18 beshort &00020000 - 32100 required
+#>18 beshort &00040000 and MAU hardware required
+#>22 beshort >0 - version %ld
+#
+# core file for 3b2
+0 string \000\004\036\212\200 3b2 core file
+>364 string >\0 of '%s'
+
+#------------------------------------------------------------------------------
+# $File: audio,v 1.59 2009/11/04 17:27:37 christos Exp $
+# audio: file(1) magic for sound formats (see also "iff")
+#
+# Jan Nicolai Langfeldt (janl at ifi.uio.no), Dan Quinlan (quinlan at yggdrasil.com),
+# and others
+#
+
+# Sun/NeXT audio data
+0 string .snd Sun/NeXT audio data:
+>12 belong 1 8-bit ISDN mu-law,
+!:mime audio/basic
+>12 belong 2 8-bit linear PCM [REF-PCM],
+!:mime audio/basic
+>12 belong 3 16-bit linear PCM,
+!:mime audio/basic
+>12 belong 4 24-bit linear PCM,
+!:mime audio/basic
+>12 belong 5 32-bit linear PCM,
+!:mime audio/basic
+>12 belong 6 32-bit IEEE floating point,
+!:mime audio/basic
+>12 belong 7 64-bit IEEE floating point,
+!:mime audio/basic
+>12 belong 8 Fragmented sample data,
+>12 belong 10 DSP program,
+>12 belong 11 8-bit fixed point,
+>12 belong 12 16-bit fixed point,
+>12 belong 13 24-bit fixed point,
+>12 belong 14 32-bit fixed point,
+>12 belong 18 16-bit linear with emphasis,
+>12 belong 19 16-bit linear compressed,
+>12 belong 20 16-bit linear with emphasis and compression,
+>12 belong 21 Music kit DSP commands,
+>12 belong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),
+!:mime audio/x-adpcm
+>12 belong 24 compressed (8-bit CCITT G.722 ADPCM)
+>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM),
+>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM),
+>12 belong 27 8-bit A-law (CCITT G.711),
+>20 belong 1 mono,
+>20 belong 2 stereo,
+>20 belong 4 quad,
+>16 belong >0 %d Hz
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+0 lelong 0x0064732E DEC audio data:
+>12 lelong 1 8-bit ISDN mu-law,
+!:mime audio/x-dec-basic
+>12 lelong 2 8-bit linear PCM [REF-PCM],
+!:mime audio/x-dec-basic
+>12 lelong 3 16-bit linear PCM,
+!:mime audio/x-dec-basic
+>12 lelong 4 24-bit linear PCM,
+!:mime audio/x-dec-basic
+>12 lelong 5 32-bit linear PCM,
+!:mime audio/x-dec-basic
+>12 lelong 6 32-bit IEEE floating point,
+!:mime audio/x-dec-basic
+>12 lelong 7 64-bit IEEE floating point,
+!:mime audio/x-dec-basic
+>12 belong 8 Fragmented sample data,
+>12 belong 10 DSP program,
+>12 belong 11 8-bit fixed point,
+>12 belong 12 16-bit fixed point,
+>12 belong 13 24-bit fixed point,
+>12 belong 14 32-bit fixed point,
+>12 belong 18 16-bit linear with emphasis,
+>12 belong 19 16-bit linear compressed,
+>12 belong 20 16-bit linear with emphasis and compression,
+>12 belong 21 Music kit DSP commands,
+>12 lelong 23 8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice enc.),
+!:mime audio/x-dec-basic
+>12 belong 24 compressed (8-bit CCITT G.722 ADPCM)
+>12 belong 25 compressed (3-bit CCITT G.723.3 ADPCM),
+>12 belong 26 compressed (5-bit CCITT G.723.5 ADPCM),
+>12 belong 27 8-bit A-law (CCITT G.711),
+>20 lelong 1 mono,
+>20 lelong 2 stereo,
+>20 lelong 4 quad,
+>16 lelong >0 %d Hz
+
+# Creative Labs AUDIO stuff
+0 string MThd Standard MIDI data
+!:mime audio/midi
+>8 beshort x (format %d)
+>10 beshort x using %d track
+>10 beshort >1 \bs
+>12 beshort&0x7fff x at 1/%d
+>12 beshort&0x8000 >0 SMPTE
+
+0 string CTMF Creative Music (CMF) data
+!:mime audio/x-unknown
+0 string SBI SoundBlaster instrument data
+!:mime audio/x-unknown
+0 string Creative\ Voice\ File Creative Labs voice data
+!:mime audio/x-unknown
+# is this next line right? it came this way...
+>19 byte 0x1A
+>23 byte >0 - version %d
+>22 byte >0 \b.%d
+
+# first entry is also the string "NTRK"
+0 belong 0x4e54524b MultiTrack sound data
+>4 belong x - version %ld
+
+# Extended MOD format (*.emd) (Greg Roelofs, newt at uchicago.edu); NOT TESTED
+# [based on posting 940824 by "Dirk/Elastik", husberg at lehtori.cc.tut.fi]
+0 string EMOD Extended MOD sound data,
+>4 byte&0xf0 x version %d
+>4 byte&0x0f x \b.%d,
+>45 byte x %d instruments
+>83 byte 0 (module)
+>83 byte 1 (song)
+
+# Real Audio (Magic .ra\0375)
+0 belong 0x2e7261fd RealAudio sound file
+!:mime audio/x-pn-realaudio
+0 string .RMF RealMedia file
+!:mime application/vnd.rn-realmedia
+#video/x-pn-realvideo
+#video/vnd.rn-realvideo
+#application/vnd.rn-realmedia
+# sigh, there are many mimes for that but the above are the most common.
+
+# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert at dialin.ind.net]
+# Oct 31, 1995
+# fixed by <doj at cubic.org> 2003-06-24
+# Too short...
+#0 string MTM MultiTracker Module sound file
+#0 string if Composer 669 Module sound data
+#0 string JN Composer 669 Module sound data (extended format)
+0 string MAS_U ULT(imate) Module sound data
+
+#0 string FAR Module sound data
+#>4 string >\15 Title: "%s"
+
+0x2c string SCRM ScreamTracker III Module sound data
+>0 string >\0 Title: "%s"
+
+# Gravis UltraSound patches
+# From <ache at nagual.ru>
+
+0 string GF1PATCH110\0ID#000002\0 GUS patch
+0 string GF1PATCH100\0ID#000002\0 Old GUS patch
+
+# mime types according to http://www.geocities.com/nevilo/mod.htm:
+# audio/it .it
+# audio/x-zipped-it .itz
+# audio/xm fasttracker modules
+# audio/x-s3m screamtracker modules
+# audio/s3m screamtracker modules
+# audio/x-zipped-mod mdz
+# audio/mod mod
+# audio/x-mod All modules (mod, s3m, 669, mtm, med, xm, it, mdz, stm, itz, xmz, s3z)
+
+#
+# Taken from loader code from mikmod version 2.14
+# by Steve McIntyre (stevem at chiark.greenend.org.uk)
+# <doj at cubic.org> added title printing on 2003-06-24
+0 string MAS_UTrack_V00
+>14 string >/0 ultratracker V1.%.1s module sound data
+!:mime audio/x-mod
+#audio/x-tracker-module
+
+0 string UN05 MikMod UNI format module sound data
+
+0 string Extended\ Module: Fasttracker II module sound data
+!:mime audio/x-mod
+#audio/x-tracker-module
+>17 string >\0 Title: "%s"
+
+21 string/c =!SCREAM! Screamtracker 2 module sound data
+!:mime audio/x-mod
+#audio/x-screamtracker-module
+21 string BMOD2STM Screamtracker 2 module sound data
+!:mime audio/x-mod
+#audio/x-screamtracker-module
+1080 string M.K. 4-channel Protracker module sound data
+!:mime audio/x-mod
+#audio/x-protracker-module
+>0 string >\0 Title: "%s"
+1080 string M!K! 4-channel Protracker module sound data
+!:mime audio/x-mod
+#audio/x-protracker-module
+>0 string >\0 Title: "%s"
+1080 string FLT4 4-channel Startracker module sound data
+!:mime audio/x-mod
+#audio/x-startracker-module
+>0 string >\0 Title: "%s"
+1080 string FLT8 8-channel Startracker module sound data
+!:mime audio/x-mod
+#audio/x-startracker-module
+>0 string >\0 Title: "%s"
+1080 string 4CHN 4-channel Fasttracker module sound data
+!:mime audio/x-mod
+#audio/x-fasttracker-module
+>0 string >\0 Title: "%s"
+1080 string 6CHN 6-channel Fasttracker module sound data
+!:mime audio/x-mod
+#audio/x-fasttracker-module
+>0 string >\0 Title: "%s"
+1080 string 8CHN 8-channel Fasttracker module sound data
+!:mime audio/x-mod
+#audio/x-fasttracker-module
+>0 string >\0 Title: "%s"
+1080 string CD81 8-channel Octalyser module sound data
+!:mime audio/x-mod
+#audio/x-octalysertracker-module
+>0 string >\0 Title: "%s"
+1080 string OKTA 8-channel Octalyzer module sound data
+!:mime audio/x-mod
+#audio/x-octalysertracker-module
+>0 string >\0 Title: "%s"
+# Not good enough.
+#1082 string CH
+#>1080 string >/0 %.2s-channel Fasttracker "oktalyzer" module sound data
+1080 string 16CN 16-channel Taketracker module sound data
+!:mime audio/x-mod
+#audio/x-taketracker-module
+>0 string >\0 Title: "%s"
+1080 string 32CN 32-channel Taketracker module sound data
+!:mime audio/x-mod
+#audio/x-taketracker-module
+>0 string >\0 Title: "%s"
+
+# TOC sound files -Trevor Johnson <trevor at jpj.net>
+#
+0 string TOC TOC sound file
+
+# sidfiles <pooka at iki.fi>
+# added name,author,(c) and new RSID type by <doj at cubic.org> 2003-06-24
+0 string SIDPLAY\ INFOFILE Sidplay info file
+
+0 string PSID PlaySID v2.2+ (AMIGA) sidtune
+>4 beshort >0 w/ header v%d,
+>14 beshort =1 single song,
+>14 beshort >1 %d songs,
+>16 beshort >0 default song: %d
+>0x16 string >\0 name: "%s"
+>0x36 string >\0 author: "%s"
+>0x56 string >\0 copyright: "%s"
+
+0 string RSID RSID sidtune PlaySID compatible
+>4 beshort >0 w/ header v%d,
+>14 beshort =1 single song,
+>14 beshort >1 %d songs,
+>16 beshort >0 default song: %d
+>0x16 string >\0 name: "%s"
+>0x36 string >\0 author: "%s"
+>0x56 string >\0 copyright: "%s"
+
+# IRCAM <mpruett at sgi.com>
+# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
+0 belong 0x64a30100 IRCAM file (VAX)
+0 belong 0x64a30200 IRCAM file (Sun)
+0 belong 0x64a30300 IRCAM file (MIPS little-endian)
+0 belong 0x64a30400 IRCAM file (NeXT)
+
+# NIST SPHERE <mpruett at sgi.com>
+0 string NIST_1A\n\ \ \ 1024\n NIST SPHERE file
+
+# Sample Vision <mpruett at sgi.com>
+0 string SOUND\ SAMPLE\ DATA\ Sample Vision file
+
+# Audio Visual Research <tonigonenstein at users.sourceforge.net>
+0 string 2BIT Audio Visual Research file,
+>12 beshort =0 mono,
+>12 beshort =-1 stereo,
+>14 beshort x %d bits
+>16 beshort =0 unsigned,
+>16 beshort =-1 signed,
+>22 belong&0x00ffffff x %d Hz,
+>18 beshort =0 no loop,
+>18 beshort =-1 loop,
+>21 ubyte <128 note %d,
+>22 byte =0 replay 5.485 KHz
+>22 byte =1 replay 8.084 KHz
+>22 byte =2 replay 10.971 KHz
+>22 byte =3 replay 16.168 KHz
+>22 byte =4 replay 21.942 KHz
+>22 byte =5 replay 32.336 KHz
+>22 byte =6 replay 43.885 KHz
+>22 byte =7 replay 47.261 KHz
+
+# SGI SoundTrack <mpruett at sgi.com>
+0 string _SGI_SoundTrack SGI SoundTrack project file
+# ID3 version 2 tags <waschk at informatik.uni-rostock.de>
+0 string ID3 Audio file with ID3 version 2
+>3 byte x \b.%d
+>4 byte x \b.%d
+>>5 byte &0x80 \b, unsynchronized frames
+>>5 byte &0x40 \b, extended header
+>>5 byte &0x20 \b, experimental
+>>5 byte &0x10 \b, footer present
+>(6.I) indirect x \b, contains:
+
+# NSF (NES sound file) magic
+0 string NESM\x1a NES Sound File
+>14 string >\0 ("%s" by
+>46 string >\0 %s, copyright
+>78 string >\0 %s),
+>5 byte x version %d,
+>6 byte x %d tracks,
+>122 byte&0x2 =1 dual PAL/NTSC
+>122 byte&0x1 =1 PAL
+>122 byte&0x1 =0 NTSC
+
+# Impulse tracker module (audio/x-it)
+0 string IMPM Impulse Tracker module sound data -
+!:mime audio/x-mod
+>4 string >\0 "%s"
+>40 leshort !0 compatible w/ITv%x
+>42 leshort !0 created w/ITv%x
+
+# Imago Orpheus module (audio/x-imf)
+60 string IM10 Imago Orpheus module sound data -
+>0 string >\0 "%s"
+
+# From <collver1 at attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0 string IMPS Impulse Tracker Sample
+>18 byte &2 16 bit
+>18 byte ^2 8 bit
+>18 byte &4 stereo
+>18 byte ^4 mono
+0 string IMPI Impulse Tracker Instrument
+>28 leshort !0 ITv%x
+>30 byte !0 %d samples
+
+# Yamaha TX Wave: file(1) magic for Yamaha TX Wave audio files
+# From <collver1 at attbi.com>
+0 string LM8953 Yamaha TX Wave
+>22 byte 0x49 looped
+>22 byte 0xC9 non-looped
+>23 byte 1 33kHz
+>23 byte 2 50kHz
+>23 byte 3 16kHz
+
+# scream tracker: file(1) magic for Scream Tracker sample files
+#
+# From <collver1 at attbi.com>
+76 string SCRS Scream Tracker Sample
+>0 byte 1 sample
+>0 byte 2 adlib melody
+>0 byte >2 adlib drum
+>31 byte &2 stereo
+>31 byte ^2 mono
+>31 byte &4 16bit little endian
+>31 byte ^4 8bit
+>30 byte 0 unpacked
+>30 byte 1 packed
+
+# audio
+# From: Cory Dikkers <cdikkers at swbell.net>
+0 string MMD0 MED music file, version 0
+0 string MMD1 OctaMED Pro music file, version 1
+0 string MMD3 OctaMED Soundstudio music file, version 3
+0 string OctaMEDCmpr OctaMED Soundstudio compressed file
+0 string MED MED_Song
+0 string SymM Symphonie SymMOD music file
+#
+0 string THX AHX version
+>3 byte =0 1 module data
+>3 byte =1 2 module data
+#
+0 string OKTASONG Oktalyzer module data
+#
+0 string DIGI\ Booster\ module\0 %s
+>20 byte >0 %c
+>>21 byte >0 \b%c
+>>>22 byte >0 \b%c
+>>>>23 byte >0 \b%c
+>610 string >\0 \b, "%s"
+#
+0 string DBM0 DIGI Booster Pro Module
+>4 byte >0 V%X.
+>>5 byte x \b%02X
+>16 string >\0 \b, "%s"
+#
+0 string FTMN FaceTheMusic module
+>16 string >\0d \b, "%s"
+
+# From: <doj at cubic.org> 2003-06-24
+0 string AMShdr\32 Velvet Studio AMS Module v2.2
+0 string Extreme Extreme Tracker AMS Module v1.3
+0 string DDMF Xtracker DMF Module
+>4 byte x v%i
+>0xD string >\0 Title: "%s"
+>0x2B string >\0 Composer: "%s"
+0 string DSM\32 Dynamic Studio Module DSM
+0 string SONG DigiTrekker DTM Module
+0 string DMDL DigiTrakker MDL Module
+0 string PSM\32 Protracker Studio PSM Module
+44 string PTMF Poly Tracker PTM Module
+>0 string >\32 Title: "%s"
+0 string MT20 MadTracker 2.0 Module MT2
+0 string RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD
+0 string RTMM RTM Module
+0x426 string MaDoKaN96 XMS Adlib Module
+>0 string >\0 Composer: "%s"
+0 string AMF AMF Module
+>4 string >\0 Title: "%s"
+0 string MODINFO1 Open Cubic Player Module Inforation MDZ
+0 string Extended\40Instrument: Fast Tracker II Instrument
+
+# From: Takeshi Hamasaki <hma at syd.odn.ne.jp>
+# NOA Nancy Codec file
+0 string \210NOA\015\012\032 NOA Nancy Codec Movie file
+# Yamaha SMAF format
+0 string MMMD Yamaha SMAF file
+# Sharp Jisaku Melody format for PDC
+0 string \001Sharp\040JisakuMelody SHARP Cell-Phone ringing Melody
+>20 string Ver01.00 Ver. 1.00
+>>32 byte x , %d tracks
+
+# Free lossless audio codec <http://flac.sourceforge.net>
+# From: Przemyslaw Augustyniak <silvathraec at rpg.pl>
+0 string fLaC FLAC audio bitstream data
+!:mime audio/x-flac
+>4 byte&0x7f >0 \b, unknown version
+>4 byte&0x7f 0 \b
+# some common bits/sample values
+>>20 beshort&0x1f0 0x030 \b, 4 bit
+>>20 beshort&0x1f0 0x050 \b, 6 bit
+>>20 beshort&0x1f0 0x070 \b, 8 bit
+>>20 beshort&0x1f0 0x0b0 \b, 12 bit
+>>20 beshort&0x1f0 0x0f0 \b, 16 bit
+>>20 beshort&0x1f0 0x170 \b, 24 bit
+>>20 byte&0xe 0x0 \b, mono
+>>20 byte&0xe 0x2 \b, stereo
+>>20 byte&0xe 0x4 \b, 3 channels
+>>20 byte&0xe 0x6 \b, 4 channels
+>>20 byte&0xe 0x8 \b, 5 channels
+>>20 byte&0xe 0xa \b, 6 channels
+>>20 byte&0xe 0xc \b, 7 channels
+>>20 byte&0xe 0xe \b, 8 channels
+# some common sample rates
+>>17 belong&0xfffff0 0x0ac440 \b, 44.1 kHz
+>>17 belong&0xfffff0 0x0bb800 \b, 48 kHz
+>>17 belong&0xfffff0 0x07d000 \b, 32 kHz
+>>17 belong&0xfffff0 0x056220 \b, 22.05 kHz
+>>17 belong&0xfffff0 0x05dc00 \b, 24 kHz
+>>17 belong&0xfffff0 0x03e800 \b, 16 kHz
+>>17 belong&0xfffff0 0x02b110 \b, 11.025 kHz
+>>17 belong&0xfffff0 0x02ee00 \b, 12 kHz
+>>17 belong&0xfffff0 0x01f400 \b, 8 kHz
+>>17 belong&0xfffff0 0x177000 \b, 96 kHz
+>>17 belong&0xfffff0 0x0fa000 \b, 64 kHz
+>>21 byte&0xf >0 \b, >4G samples
+>>21 byte&0xf 0 \b
+>>>22 belong >0 \b, %u samples
+>>>22 belong 0 \b, length unknown
+
+# (ISDN) VBOX voice message file (Wolfram Kleff)
+0 string VBOX VBOX voice message data
+
+# ReBorn Song Files (.rbs)
+# David J. Singer <doc at deadvirgins.org.uk>
+8 string RB40 RBS Song file
+>29 string ReBorn created by ReBorn
+>37 string Propellerhead created by ReBirth
+
+# Synthesizer Generator and Kimwitu share their file format
+0 string A#S#C#S#S#L#V#3 Synthesizer Generator or Kimwitu data
+# Kimwitu++ uses a slightly different magic
+0 string A#S#C#S#S#L#HUB Kimwitu++ data
+
+# From "Simon Hosie
+0 string TFMX-SONG TFMX module sound data
+
+# Monkey's Audio compressed audio format (.ape)
+# From danny.milo at gmx.net (Danny Milosavljevic)
+# New version from Abel Cheung <abel (@) oaka.org>
+0 string MAC\040 Monkey's Audio compressed format
+>4 uleshort >0x0F8B version %d
+>>(0x08.l) uleshort =1000 with fast compression
+>>(0x08.l) uleshort =2000 with normal compression
+>>(0x08.l) uleshort =3000 with high compression
+>>(0x08.l) uleshort =4000 with extra high compression
+>>(0x08.l) uleshort =5000 with insane compression
+>>(0x08.l+18) uleshort =1 \b, mono
+>>(0x08.l+18) uleshort =2 \b, stereo
+>>(0x08.l+20) ulelong x \b, sample rate %d
+>4 uleshort <0x0F8C version %d
+>>6 uleshort =1000 with fast compression
+>>6 uleshort =2000 with normal compression
+>>6 uleshort =3000 with high compression
+>>6 uleshort =4000 with extra high compression
+>>6 uleshort =5000 with insane compression
+>>10 uleshort =1 \b, mono
+>>10 uleshort =2 \b, stereo
+>>12 ulelong x \b, sample rate %d
+
+# adlib sound files
+# From Gürkan Sengün <gurkan at linuks.mine.nu>, http://www.linuks.mine.nu
+0 string RAWADATA RdosPlay RAW
+
+1068 string RoR AMUSIC Adlib Tracker
+
+0 string JCH EdLib
+
+0 string mpu401tr MPU-401 Trakker
+
+0 string SAdT Surprise! Adlib Tracker
+>4 byte x Version %d
+
+0 string XAD! eXotic ADlib
+
+0 string ofTAZ! eXtra Simple Music
+
+# Spectrum 128 tunes (.ay files).
+# From: Emanuel Haupt <ehaupt at critical.ch>
+0 string ZXAYEMUL Spectrum 128 tune
+
+0 string \0BONK BONK,
+#>5 byte x version %d
+>14 byte x %d channel(s),
+>15 byte =1 lossless,
+>15 byte =0 lossy,
+>16 byte x mid-side
+
+384 string LockStream LockStream Embedded file (mostly MP3 on old Nokia phones)
+
+# format VQF (proprietary codec for sound)
+# some infos on the header file available at :
+# http://www.twinvq.org/english/technology_format.html
+0 string TWIN97012000 VQF data
+>27 short 0 \b, Mono
+>27 short 1 \b, Stereo
+>31 short >0 \b, %d kbit/s
+>35 short >0 \b, %d kHz
+
+# Nelson A. de Oliveira (naoliv at gmail.com)
+# .eqf
+0 string Winamp\ EQ\ library\ file %s
+# it will match only versions like v<digit>.<digit>
+# Since I saw only eqf files with version v1.1 I think that it's OK
+>23 string x \b%.4s
+# .preset
+0 string [Equalizer\ preset] XMMS equalizer preset
+# .m3u
+0 search/1 #EXTM3U M3U playlist text
+# .pls
+0 search/1 [playlist] PLS playlist text
+# licq.conf
+1 string [licq] LICQ configuration file
+
+# Atari ST audio files by Dirk Jagdmann <doj at cubic.org>
+0 string ICE! SNDH Atari ST music
+0 string SC68\ Music-file\ /\ (c)\ (BeN)jami sc68 Atari ST music
+
+# musepak support From: "Jiri Pejchal" <jiri.pejchal at gmail.com>
+0 string MP+ Musepack audio
+>3 byte 255 \b, SV pre8
+>3 byte&0xF 0x6 \b, SV 6
+>3 byte&0xF 0x8 \b, SV 8
+>3 byte&0xF 0x7 \b, SV 7
+>>3 byte&0xF0 0x0 \b.0
+>>3 byte&0xF0 0x10 \b.1
+>>3 byte&0xF0 240 \b.15
+>>10 byte&0xF0 0x0 \b, no profile
+>>10 byte&0xF0 0x10 \b, profile 'Unstable/Experimental'
+>>10 byte&0xF0 0x50 \b, quality 0
+>>10 byte&0xF0 0x60 \b, quality 1
+>>10 byte&0xF0 0x70 \b, quality 2 (Telephone)
+>>10 byte&0xF0 0x80 \b, quality 3 (Thumb)
+>>10 byte&0xF0 0x90 \b, quality 4 (Radio)
+>>10 byte&0xF0 0xA0 \b, quality 5 (Standard)
+>>10 byte&0xF0 0xB0 \b, quality 6 (Xtreme)
+>>10 byte&0xF0 0xC0 \b, quality 7 (Insane)
+>>10 byte&0xF0 0xD0 \b, quality 8 (BrainDead)
+>>10 byte&0xF0 0xE0 \b, quality 9
+>>10 byte&0xF0 0xF0 \b, quality 10
+>>27 byte 0x0 \b, Buschmann 1.7.0-9, Klemm 0.90-1.05
+>>27 byte 102 \b, Beta 1.02
+>>27 byte 104 \b, Beta 1.04
+>>27 byte 105 \b, Alpha 1.05
+>>27 byte 106 \b, Beta 1.06
+>>27 byte 110 \b, Release 1.1
+>>27 byte 111 \b, Alpha 1.11
+>>27 byte 112 \b, Beta 1.12
+>>27 byte 113 \b, Alpha 1.13
+>>27 byte 114 \b, Beta 1.14
+>>27 byte 115 \b, Alpha 1.15
+
+# IMY
+# from http://filext.com/detaillist.php?extdetail=IMY
+# http://cellphones.about.com/od/cellularfaqs/f/rf_imelody.htm
+# http://download.ncl.ie/doc/api/ie/ncl/media/music/IMelody.html
+# http://www.wx800.com/msg/download/irda/iMelody.pdf
+0 string BEGIN:IMELODY iMelody Ringtone Format
+
+# From: "Mateus Caruccio" <mateus at caruccio.com>
+# guitar pro v3,4,5 from http://filext.com/file-extension/gp3
+0 string \030FICHIER\ GUITAR\ PRO\ v3. Guitar Pro Ver. 3 Tablature
+
+# From: "Leslie P. Polzer" <leslie.polzer at gmx.net>
+60 string SONG SoundFX Module sound file
+
+# Type: Adaptive Multi-Rate Codec
+# URL: http://filext.com/detaillist.php?extdetail=AMR
+# From: Russell Coker <russell at coker.com.au>
+0 string #!AMR Adaptive Multi-Rate Codec (GSM telephony)
+
+#----------------------------------------------------------------
+# $File: basis,v 1.4 2009/09/19 16:28:08 christos Exp $
+# basis: file(1) magic for BBx/Pro5-files
+# Oliver Dammer <dammer at olida.de> 2005/11/07
+# http://www.basis.com business-basic-files.
+#
+0 string \074\074bbx\076\076 BBx
+>7 string \000 indexed file
+>7 string \001 serial file
+>7 string \002 keyed file
+>>13 short 0 (sort)
+>7 string \004 program
+>>18 byte x (LEVEL %d)
+>>>23 string >\000 psaved
+>7 string \006 mkeyed file
+>>13 short 0 (sort)
+>>8 string \000 (mkey)
+
+#------------------------------------------------------------------------------
+# $File: bflt,v 1.4 2009/09/19 16:28:08 christos Exp $
+# bFLT: file(1) magic for BFLT uclinux binary files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+#
+0 string bFLT BFLT executable
+>4 belong x - version %ld
+>4 belong 4
+>>36 belong&0x1 0x1 ram
+>>36 belong&0x2 0x2 gotpic
+>>36 belong&0x4 0x4 gzip
+>>36 belong&0x8 0x8 gzdata
+
+#------------------------------------------------------------------------------
+# $File: blender,v 1.5 2009/09/19 16:28:08 christos Exp $
+# blender: file(1) magic for Blender 3D related files
+#
+# Native format rule v1.2. For questions use the developers list
+# http://lists.blender.org/mailman/listinfo/bf-committers
+# GLOB chunk was moved near start and provides subversion info since 2.42
+
+0 string =BLENDER Blender3D,
+>7 string =_ saved as 32-bits
+>>8 string =v little endian
+>>>9 byte x with version %c.
+>>>10 byte x \b%c
+>>>11 byte x \b%c
+>>>0x40 string =GLOB \b.
+>>>>0x58 leshort x \b%.4d
+>>8 string =V big endian
+>>>9 byte x with version %c.
+>>>10 byte x \b%c
+>>>11 byte x \b%c
+>>>0x40 string =GLOB \b.
+>>>>0x58 beshort x \b%.4d
+>7 string =- saved as 64-bits
+>>8 string =v little endian
+>>9 byte x with version %c.
+>>10 byte x \b%c
+>>11 byte x \b%c
+>>0x44 string =GLOB \b.
+>>>0x60 leshort x \b%.4d
+>>8 string =V big endian
+>>>9 byte x with version %c.
+>>>10 byte x \b%c
+>>>11 byte x \b%c
+>>>0x44 string =GLOB \b.
+>>>>0x60 beshort x \b%.4d
+
+# Scripts that run in the embeded Python interpreter
+0 string #!BPY Blender3D BPython script
+
+#------------------------------------------------------------------------------
+# $File: blit,v 1.8 2009/09/19 16:28:08 christos Exp $
+# blit: file(1) magic for 68K Blit stuff as seen from 680x0 machine
+#
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well? If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0 long 0407 68K Blit (standalone) executable
+#0 short 0407 VAX-order2 68K Blit (standalone) executable
+0 short 03401 VAX-order 68K Blit (standalone) executable
+0 long 0406 68k Blit mpx/mux executable
+0 short 0406 VAX-order2 68k Blit mpx/mux executable
+0 short 03001 VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0 short 0520 tty630 layers executable
+
+#------------------------------------------------------------------------------
+# $File: bout,v 1.5 2009/09/19 16:28:08 christos Exp $
+# i80960 b.out objects and archives
+#
+0 long 0x10d i960 b.out relocatable object
+>16 long >0 not stripped
+#
+# b.out archive (hp-rt on i960)
+0 string =!<bout> b.out archive
+>8 string __.SYMDEF random library
+
+#------------------------------------------------------------------------------
+# $File: bsdi,v 1.5 2009/09/19 16:28:08 christos Exp $
+# bsdi: file(1) magic for BSD/OS (from BSDI) objects
+#
+
+0 lelong 0314 386 compact demand paged pure executable
+>16 lelong >0 not stripped
+>32 byte 0x6a (uses shared libs)
+
+0 lelong 0407 386 executable
+>16 lelong >0 not stripped
+>32 byte 0x6a (uses shared libs)
+
+0 lelong 0410 386 pure executable
+>16 lelong >0 not stripped
+>32 byte 0x6a (uses shared libs)
+
+0 lelong 0413 386 demand paged pure executable
+>16 lelong >0 not stripped
+>32 byte 0x6a (uses shared libs)
+
+# same as in SunOS 4.x, except for static shared libraries
+0 belong&077777777 0600413 sparc demand paged
+>0 byte &0x80
+>>20 belong <4096 shared library
+>>20 belong =4096 dynamically linked executable
+>>20 belong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+>36 belong 0xb4100001 (uses shared libs)
+
+0 belong&077777777 0600410 sparc pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+>36 belong 0xb4100001 (uses shared libs)
+
+0 belong&077777777 0600407 sparc
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+>36 belong 0xb4100001 (uses shared libs)
+
+#------------------------------------------------------------------------------
+# $File: btsnoop,v 1.5 2009/09/19 16:28:08 christos Exp $
+# BTSnoop: file(1) magic for BTSnoop files
+#
+# From <marcel at holtmann.org>
+0 string btsnoop\0 BTSnoop
+>8 belong x version %d,
+>12 belong 1001 Unencapsulated HCI
+>12 belong 1002 HCI UART (H4)
+>12 belong 1003 HCI BCSP
+>12 belong 1004 HCI Serial (H5)
+>>12 belong x type %d
+
+#------------------------------------------------------------------------------
+# $File: c-lang,v 1.14 2009/09/19 16:28:08 christos Exp $
+# c-lang: file(1) magic for C programs (or REXX)
+#
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# if you uncomment "/*" for C/REXX below, also uncomment this entry
+#0 string /*\ XPM\ */ X pixmap image data
+#!:mime image/x-xpmi
+
+# 3DS (3d Studio files) Conflicts with diff output 0x3d '='
+#16 beshort 0x3d3d image/x-3ds
+
+# this first will upset you if you're a PL/1 shop...
+# in which case rm it; ascmagic will catch real C programs
+#0 search/1 /* C or REXX program text
+#0 search/1 // C++ program text
+
+# From: Mikhail Teterin <mi at aldan.algebra.com>
+0 string cscope cscope reference data
+>7 string x version %.2s
+# We skip the path here, because it is often long (so file will
+# truncate it) and mostly redundant.
+# The inverted index functionality was added some time betwen
+# versions 11 and 15, so look for -q if version is above 14:
+>7 string >14
+>>10 search/100 \ -q\ with inverted index
+>10 search/100 \ -c\ text (non-compressed)
+
+#------------------------------------------------------------------------------
+# $File: c64,v 1.5 2009/09/19 16:28:08 christos Exp $
+# c64: file(1) magic for various commodore 64 related files
+#
+# From: Dirk Jagdmann <doj at cubic.org>
+
+0x16500 belong 0x12014100 D64 Image
+0x16500 belong 0x12014180 D71 Image
+0x61800 belong 0x28034400 D81 Image
+0 string C64\40CARTRIDGE CCS C64 Emultar Cartridge Image
+0 belong 0x43154164 X64 Image
+
+0 string GCR-1541 GCR Image
+>8 byte x version: %i
+>9 byte x tracks: %i
+
+9 string PSUR ARC archive (c64)
+2 string -LH1- LHA archive (c64)
+
+0 string C64File PC64 Emulator file
+>8 string >\0 "%s"
+0 string C64Image PC64 Freezer Image
+
+0 beshort 0x38CD C64 PCLink Image
+0 string CBM\144\0\0 Power 64 C64 Emulator Snapshot
+
+0 belong 0xFF424CFF WRAptor packer (c64)
+
+0 string C64S\x20tape\x20file T64 tape Image
+>32 leshort x Version:0x%x
+>36 leshort !0 Entries:%i
+>40 string x Name:%.24s
+
+0 string C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image
+>32 leshort x Version:0x%x
+>36 leshort !0 Entries:%i
+>40 string x Name:%.24s
+
+0 string C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image
+>32 leshort x Version:0x%x
+>36 leshort !0 Entries:%i
+>40 string x Name:%.24s
+
+#------------------------------------------------------------------------------
+# $File: cad,v 1.9 2009/09/19 16:28:08 christos Exp $
+# autocad: file(1) magic for cad files
+#
+
+# AutoCAD DWG versions R13/R14 (www.autodesk.com)
+# Written December 01, 2003 by Lester Hightower
+# Based on the DWG File Format Specifications at http://www.opendwg.org/
+0 string \101\103\061\060\061 AutoCAD
+>5 string \062\000\000\000\000 DWG ver. R13
+>5 string \064\000\000\000\000 DWG ver. R14
+
+# Microstation DGN/CIT Files (www.bentley.com)
+# Last updated July 29, 2005 by Lester Hightower
+# DGN is the default file extension of Microstation/Intergraph CAD files.
+# CIT is the proprietary raster format (similar to TIFF) used to attach
+# raster underlays to Microstation DGN (vector) drawings.
+#
+# http://www.wotsit.org/search.asp
+# http://filext.com/detaillist.php?extdetail=DGN
+# http://filext.com/detaillist.php?extdetail=CIT
+#
+# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2
+# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928
+# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682
+# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F
+0 string \010\011\376 Microstation
+>3 string \002
+>>30 string \026\105 DGNFile
+>>30 string \034\105 DGNFile
+>>30 string \073\107 DGNFile
+>>30 string \073\110 DGNFile
+>>30 string \106\107 DGNFile
+>>30 string \110\103 DGNFile
+>>30 string \120\104 DGNFile
+>>30 string \172\104 DGNFile
+>>30 string \172\105 DGNFile
+>>30 string \172\106 DGNFile
+>>30 string \234\106 DGNFile
+>>30 string \273\105 DGNFile
+>>30 string \306\106 DGNFile
+>>30 string \310\104 DGNFile
+>>30 string \341\104 DGNFile
+>>30 string \372\103 DGNFile
+>>30 string \372\104 DGNFile
+>>30 string \372\106 DGNFile
+>>30 string \376\103 DGNFile
+>4 string \030\000\000 CITFile
+>4 string \030\000\003 CITFile
+
+# AutoCad, from Nahuel Greco
+# AutoCAD DWG versions R12/R13/R14 (www.autodesk.com)
+0 string AC1012 AutoCad (release 12)
+0 string AC1013 AutoCad (release 13)
+0 string AC1014 AutoCad (release 14)
+
+# CAD: file(1) magic for computer aided design files
+# Phillip Griffith <phillip dot griffith at gmail dot com>
+# AutoCAD magic taken from the Open Design Alliance's OpenDWG specifications.
+#
+0 belong 0x08051700 Bentley/Intergraph MicroStation DGN cell library
+0 belong 0x0809fe02 Bentley/Intergraph MicroStation DGN vector CAD
+0 belong 0xc809fe02 Bentley/Intergraph MicroStation DGN vector CAD
+0 beshort 0x0809 Bentley/Intergraph MicroStation
+>0x02 byte 0xfe
+>>0x04 beshort 0x1800 CIT raster CAD
+0 string AC1012 AutoDesk AutoCAD R13
+0 string AC1014 AutoDesk AutoCAD R14
+0 string AC1015 AutoDesk AutoCAD R2000
+
+#------------------------------------------------------------------------------
+# $File: cafebabe,v 1.8 2009/09/19 16:28:08 christos Exp $
+# Cafe Babes unite!
+#
+# Since Java bytecode and Mach-O fat-files have the same magic number, the test
+# must be performed in the same "magic" sequence to get both right. The long
+# at offset 4 in a mach-O fat file tells the number of architectures; the short at
+# offset 4 in a Java bytecode file is the JVM minor version and the
+# short at offset 6 is the JVM major version. Since there are only
+# only 18 labeled Mach-O architectures at current, and the first released
+# Java class format was version 43.0, we can safely choose any number
+# between 18 and 39 to test the number of architectures against
+# (and use as a hack). Let's not use 18, because the Mach-O people
+# might add another one or two as time goes by...
+#
+0 belong 0xcafebabe
+!:mime application/x-java-applet
+>4 belong >30 compiled Java class data,
+>>6 beshort x version %d.
+>>4 beshort x \b%d
+# Which is which?
+#>>4 belong 0x032d (Java 1.0)
+#>>4 belong 0x032d (Java 1.1)
+>>4 belong 0x002e (Java 1.2)
+>>4 belong 0x002f (Java 1.3)
+>>4 belong 0x0030 (Java 1.4)
+>>4 belong 0x0031 (Java 1.5)
+>>4 belong 0x0032 (Java 1.6)
+
+
+0 belong 0xcafebabe
+>4 belong 1 Mach-O fat file with 1 architecture
+>4 belong >1
+>>4 belong <20 Mach-O fat file with %ld architectures
+
+0 belong 0xcafed00d JAR compressed with pack200,
+>>5 byte x version %d.
+>>4 byte x \b%d
+!:mime application/x-java-pack200
+
+#------------------------------------------------------------------------------
+# $File: cddb,v 1.4 2009/09/19 16:28:08 christos Exp $
+# CDDB: file(1) magic for CDDB(tm) format CD text data files
+#
+# From <steve at gracenote.com>
+#
+# This is the /etc/magic entry to decode datafiles as used by
+# CDDB-enabled CD player applications.
+#
+
+0 search/1/w #\040xmcd CDDB(tm) format CD text data
+
+#------------------------------------------------------------------------------
+# $File: chord,v 1.4 2009/09/19 16:28:08 christos Exp $
+# chord: file(1) magic for Chord music sheet typesetting utility input files
+#
+# From Philippe De Muyter <phdm at macqel.be>
+# File format is actually free, but many distributed files begin with `{title'
+#
+0 string {title Chord text file
+
+
+#------------------------------------------------------------------------------
+# $File: cisco,v 1.4 2009/09/19 16:28:08 christos Exp $
+# cisco: file(1) magic for cisco Systems routers
+#
+# Most cisco file-formats are covered by the generic elf code
+#
+# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
+0 belong&0xffffff00 0x85011400 cisco IOS microcode
+>7 string >\0 for '%s'
+0 belong&0xffffff00 0x8501cb00 cisco IOS experimental microcode
+>7 string >\0 for '%s'
+
+#------------------------------------------------------------------------------
+# $File: citrus,v 1.4 2009/09/19 16:28:08 christos Exp $
+# citrus locale declaration
+#
+
+0 string RuneCT Citrus locale declaration for LC_CTYPE
+
+
+#------------------------------------------------------------------------------
+# $File: clarion,v 1.4 2009/09/19 16:28:08 christos Exp $
+# clarion: file(1) magic for # Clarion Personal/Professional Developer
+# (v2 and above)
+# From: Julien Blache <jb at jblache.org>
+
+# Database files
+# signature
+0 leshort 0x3343 Clarion Developer (v2 and above) data file
+# attributes
+>2 leshort &0x0001 \b, locked
+>2 leshort &0x0004 \b, encrypted
+>2 leshort &0x0008 \b, memo file exists
+>2 leshort &0x0010 \b, compressed
+>2 leshort &0x0040 \b, read only
+# number of records
+>5 lelong x \b, %ld records
+
+# Memo files
+0 leshort 0x334d Clarion Developer (v2 and above) memo data
+
+# Key/Index files
+# No magic? :(
+
+# Help files
+0 leshort 0x49e0 Clarion Developer (v2 and above) help data
+
+#------------------------------------------------------------------------------
+# $File: claris,v 1.5 2009/09/19 16:28:08 christos Exp $
+# claris: file(1) magic for claris
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Claris Works a word processor, etc.
+# Version 3.0
+
+# .pct claris works clip art files
+#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
+#*
+#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
+#null to byte 1000 octal
+514 string \377\377\377\377\000 Claris clip art?
+>0 string \0\0\0\0\0\0\0\0\0\0\0\0\0 yes.
+514 string \377\377\377\377\001 Claris clip art?
+>0 string \0\0\0\0\0\0\0\0\0\0\0\0\0 yes.
+
+# Claris works files
+# .cwk
+0 string \002\000\210\003\102\117\102\117\000\001\206 Claris works document
+# .plt
+0 string \020\341\000\000\010\010 Claris Works pallete files .plt
+
+# .msp a dictionary file I am not sure about this I have only one .msp file
+0 string \002\271\262\000\040\002\000\164 Claris works dictionary
+
+# .usp are user dictionary bits
+# I am not sure about a magic header:
+#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
+# soh S p f 8 U D sp ^ S cr nl p o d i
+#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
+# a t r i s t sp ^ S cr nl d i v sp #
+
+# .mth Thesaurus
+# starts with \0 but no magic header
+
+# .chy Hyphenation file
+# I am not sure: 000 210 034 000 000
+
+# other claris files
+#./windows/claris/useng.ndx: data
+#./windows/claris/xtndtran.l32: data
+#./windows/claris/xtndtran.lst: data
+#./windows/claris/clworks.lbl: data
+#./windows/claris/clworks.prf: data
+#./windows/claris/userd.spl: data
+
+#------------------------------------------------------------------------------
+# $File: clipper,v 1.6 2009/09/19 16:28:08 christos Exp $
+# clipper: file(1) magic for Intergraph (formerly Fairchild) Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18 short !074000,000000 C1 R1
+# >18 short !074000,004000 C2 R1
+# >18 short !074000,010000 C3 R1
+# >18 short !074000,074000 TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18 short&074000 000000 C1 R1
+# >18 short&074000 004000 C2 R1
+# >18 short&074000 010000 C3 R1
+# >18 short&074000 074000 TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0 short 0575 CLIPPER COFF executable (VAX #)
+>20 short 0407 (impure)
+>20 short 0410 (5.2 compatible)
+>20 short 0411 (pure)
+>20 short 0413 (demand paged)
+>20 short 0443 (target shared library)
+>12 long >0 not stripped
+>22 short >0 - version %ld
+0 short 0577 CLIPPER COFF executable
+>18 short&074000 000000 C1 R1
+>18 short&074000 004000 C2 R1
+>18 short&074000 010000 C3 R1
+>18 short&074000 074000 TEST
+>20 short 0407 (impure)
+>20 short 0410 (pure)
+>20 short 0411 (separate I&D)
+>20 short 0413 (paged)
+>20 short 0443 (target shared library)
+>12 long >0 not stripped
+>22 short >0 - version %ld
+>48 long&01 01 alignment trap enabled
+>52 byte 1 -Ctnc
+>52 byte 2 -Ctsw
+>52 byte 3 -Ctpw
+>52 byte 4 -Ctcb
+>53 byte 1 -Cdnc
+>53 byte 2 -Cdsw
+>53 byte 3 -Cdpw
+>53 byte 4 -Cdcb
+>54 byte 1 -Csnc
+>54 byte 2 -Cssw
+>54 byte 3 -Cspw
+>54 byte 4 -Cscb
+4 string pipe CLIPPER instruction trace
+4 string prof CLIPPER instruction profile
+
+#------------------------------------------------------------------------------
+# $File: commands,v 1.36 2010/01/24 18:41:11 christos Exp $
+# commands: file(1) magic for various shells and interpreters
+#
+#0 string : shell archive or script for antique kernel text
+0 string/w #!\ /bin/sh POSIX shell script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /bin/csh C shell script text executable
+!:mime text/x-shellscript
+# korn shell magic, sent by George Wu, gwu at clyde.att.com
+0 string/w #!\ /bin/ksh Korn shell script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /bin/tcsh Tenex C shell script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/tcsh Tenex C shell script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/bin/tcsh Tenex C shell script text executable
+!:mime text/x-shellscript
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron at cs.unsw.oz.au (Cameron Simpson)
+0 string/w #!\ /bin/zsh Paul Falstad's zsh script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/bin/zsh Paul Falstad's zsh script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/bin/zsh Paul Falstad's zsh script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/bin/ash Neil Brown's ash script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/bin/ae Neil Brown's ae script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /bin/nawk new awk script text executable
+!:mime text/x-nawk
+0 string/w #!\ /usr/bin/nawk new awk script text executable
+!:mime text/x-nawk
+0 string/w #!\ /usr/local/bin/nawk new awk script text executable
+!:mime text/x-nawk
+0 string/w #!\ /bin/gawk GNU awk script text executable
+!:mime text/x-gawk
+0 string/w #!\ /usr/bin/gawk GNU awk script text executable
+!:mime text/x-gawk
+0 string/w #!\ /usr/local/bin/gawk GNU awk script text executable
+!:mime text/x-gawk
+#
+0 string/w #!\ /bin/awk awk script text executable
+!:mime text/x-awk
+0 string/w #!\ /usr/bin/awk awk script text executable
+!:mime text/x-awk
+# update to distinguish from *.vcf files
+# this is broken because postscript has /EBEGIN{ for example.
+#0 search/Ww BEGIN { awk script text
+
+# AT&T Bell Labs' Plan 9 shell
+0 string/w #!\ /bin/rc Plan 9 rc shell script text executable
+
+# bash shell magic, from Peter Tobias (tobias at server.et-inf.fho-emden.de)
+0 string/w #!\ /bin/bash Bourne-Again shell script text executable
+!:mime text/x-shellscript
+0 string/w #!\ /usr/local/bin/bash Bourne-Again shell script text executable
+!:mime text/x-shellscript
+
+# using env
+0 string/t #!/usr/bin/env a
+>15 string/t >\0 %s script text executable
+0 string/t #!\ /usr/bin/env a
+>16 string/t >\0 %s script text executable
+
+# PHP scripts
+# Ulf Harnhammar <ulfh at update.uu.se>
+0 search/1/c =<?php PHP script text
+!:mime text/x-php
+0 search/1 =<?\n PHP script text
+!:mime text/x-php
+0 search/1 =<?\r PHP script text
+!:mime text/x-php
+0 search/1/w #!\ /usr/local/bin/php PHP script text executable
+!:mime text/x-php
+0 search/1/w #!\ /usr/bin/php PHP script text executable
+!:mime text/x-php
+
+0 string Zend\x00 PHP script Zend Optimizer data
+
+0 string $! DCL command file
+
+#----------------------------------------------------------------------------
+# $File: communications,v 1.5 2009/09/19 16:28:08 christos Exp $
+# communication
+
+# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.
+# It is used for conformance testing of communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0 string $Suite TTCN Abstract Test Suite
+>&1 string $SuiteId
+>>&1 string >\n %s
+>&2 string $SuiteId
+>>&1 string >\n %s
+>&3 string $SuiteId
+>>&1 string >\n %s
+
+# MSC (message sequence charts) are a formal description technique,
+# described in ITU-T Z.120, mainly used for communication protocols.
+# Added by W. Borgert <debacle at debian.org>.
+0 string mscdocument Message Sequence Chart (document)
+0 string msc Message Sequence Chart (chart)
+0 string submsc Message Sequence Chart (subchart)
+
+#------------------------------------------------------------------------------
+# $File: compress,v 1.42 2009/09/19 16:28:08 christos Exp $
+# compress: file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0 string \037\235 compress'd data
+!:mime application/x-compress
+!:apple LZIVZIVU
+>2 byte&0x80 >0 block compressed
+>2 byte&0x1f x %d bits
+
+# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
+# Edited by Chris Chittleborough <cchittleborough at yahoo.com.au>, March 2002
+# * Original filename is only at offset 10 if "extra field" absent
+# * Produce shorter output - notably, only report compression methods
+# other than 8 ("deflate", the only method defined in RFC 1952).
+0 string \037\213 gzip compressed data
+!:mime application/x-gzip
+>2 byte <8 \b, reserved method
+>2 byte >8 \b, unknown method
+>3 byte &0x01 \b, ASCII
+>3 byte &0x02 \b, has CRC
+>3 byte &0x04 \b, extra field
+>3 byte&0xC =0x08
+>>10 string x \b, was "%s"
+>3 byte &0x10 \b, has comment
+>9 byte =0x00 \b, from FAT filesystem (MS-DOS, OS/2, NT)
+>9 byte =0x01 \b, from Amiga
+>9 byte =0x02 \b, from VMS
+>9 byte =0x03 \b, from Unix
+>9 byte =0x04 \b, from VM/CMS
+>9 byte =0x05 \b, from Atari
+>9 byte =0x06 \b, from HPFS filesystem (OS/2, NT)
+>9 byte =0x07 \b, from MacOS
+>9 byte =0x08 \b, from Z-System
+>9 byte =0x09 \b, from CP/M
+>9 byte =0x0A \b, from TOPS/20
+>9 byte =0x0B \b, from NTFS filesystem (NT)
+>9 byte =0x0C \b, from QDOS
+>9 byte =0x0D \b, from Acorn RISCOS
+>3 byte &0x10 \b, comment
+>3 byte &0x20 \b, encrypted
+>4 ledate >0 \b, last modified: %s
+>8 byte 2 \b, max compression
+>8 byte 4 \b, max speed
+
+# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
+0 string \037\036 packed data
+!:mime application/octet-stream
+>2 belong >1 \b, %d characters originally
+>2 belong =1 \b, %d character originally
+#
+# This magic number is byte-order-independent.
+0 short 0x1f1f old packed data
+!:mime application/octet-stream
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+0 short 0x1fff compacted data
+!:mime application/octet-stream
+# This string is valid for SunOS (BE) and a matching "short" is listed
+# in the Ultrix (LE) magic file.
+0 string \377\037 compacted data
+!:mime application/octet-stream
+0 short 0145405 huf output
+!:mime application/octet-stream
+
+# bzip2
+0 string BZh bzip2 compressed data
+!:mime application/x-bzip2
+>3 byte >47 \b, block size = %c00k
+
+# lzip
+0 string LZIP lzip compressed data
+!:mime application/x-lzip
+>4 byte x \b, version: %d
+
+# squeeze and crunch
+# Michael Haardt <michael at cantor.informatik.rwth-aachen.de>
+0 beshort 0x76FF squeezed data,
+>4 string x original name %s
+0 beshort 0x76FE crunched data,
+>2 string x original name %s
+0 beshort 0x76FD LZH compressed data,
+>2 string x original name %s
+
+# Freeze
+0 string \037\237 frozen file 2.1
+0 string \037\236 frozen file 1.0 (or gzip 0.5)
+
+# SCO compress -H (LZH)
+0 string \037\240 SCO compress -H (LZH) data
+
+# European GSM 06.10 is a provisional standard for full-rate speech
+# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+# excitation/long term prediction) coding at 13 kbit/s.
+#
+# There's only a magic nibble (4 bits); that nibble repeats every 33
+# bytes. This isn't suited for use, but maybe we can use it someday.
+#
+# This will cause very short GSM files to be declared as data and
+# mismatches to be declared as data too!
+#0 byte&0xF0 0xd0 data
+#>33 byte&0xF0 0xd0
+#>66 byte&0xF0 0xd0
+#>99 byte&0xF0 0xd0
+#>132 byte&0xF0 0xd0 GSM 06.10 compressed audio
+
+# bzip a block-sorting file compressor
+# by Julian Seward <sewardj at cs.man.ac.uk> and others
+#
+#0 string BZ bzip compressed data
+#>2 byte x \b, version: %c
+#>3 string =1 \b, compression block size 100k
+#>3 string =2 \b, compression block size 200k
+#>3 string =3 \b, compression block size 300k
+#>3 string =4 \b, compression block size 400k
+#>3 string =5 \b, compression block size 500k
+#>3 string =6 \b, compression block size 600k
+#>3 string =7 \b, compression block size 700k
+#>3 string =8 \b, compression block size 800k
+#>3 string =9 \b, compression block size 900k
+
+# lzop from <markus.oberhumer at jk.uni-linz.ac.at>
+0 string \x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a lzop compressed data
+>9 beshort <0x0940
+>>9 byte&0xf0 =0x00 - version 0.
+>>9 beshort&0x0fff x \b%03x,
+>>13 byte 1 LZO1X-1,
+>>13 byte 2 LZO1X-1(15),
+>>13 byte 3 LZO1X-999,
+## >>22 bedate >0 last modified: %s,
+>>14 byte =0x00 os: MS-DOS
+>>14 byte =0x01 os: Amiga
+>>14 byte =0x02 os: VMS
+>>14 byte =0x03 os: Unix
+>>14 byte =0x05 os: Atari
+>>14 byte =0x06 os: OS/2
+>>14 byte =0x07 os: MacOS
+>>14 byte =0x0A os: Tops/20
+>>14 byte =0x0B os: WinNT
+>>14 byte =0x0E os: Win32
+>9 beshort >0x0939
+>>9 byte&0xf0 =0x00 - version 0.
+>>9 byte&0xf0 =0x10 - version 1.
+>>9 byte&0xf0 =0x20 - version 2.
+>>9 beshort&0x0fff x \b%03x,
+>>15 byte 1 LZO1X-1,
+>>15 byte 2 LZO1X-1(15),
+>>15 byte 3 LZO1X-999,
+## >>25 bedate >0 last modified: %s,
+>>17 byte =0x00 os: MS-DOS
+>>17 byte =0x01 os: Amiga
+>>17 byte =0x02 os: VMS
+>>17 byte =0x03 os: Unix
+>>17 byte =0x05 os: Atari
+>>17 byte =0x06 os: OS/2
+>>17 byte =0x07 os: MacOS
+>>17 byte =0x0A os: Tops/20
+>>17 byte =0x0B os: WinNT
+>>17 byte =0x0E os: Win32
+
+# 4.3BSD-Quasijarus Strong Compression
+# http://minnie.tuhs.org/Quasijarus/compress.html
+0 string \037\241 Quasijarus strong compressed data
+
+# From: Cory Dikkers <cdikkers at swbell.net>
+0 string XPKF Amiga xpkf.library compressed data
+0 string PP11 Power Packer 1.1 compressed data
+0 string PP20 Power Packer 2.0 compressed data,
+>4 belong 0x09090909 fast compression
+>4 belong 0x090A0A0A mediocre compression
+>4 belong 0x090A0B0B good compression
+>4 belong 0x090A0C0C very good compression
+>4 belong 0x090A0C0D best compression
+
+# 7-zip archiver, from Thomas Klausner (wiz at danbala.tuwien.ac.at)
+# http://www.7-zip.org or DOC/7zFormat.txt
+#
+0 string 7z\274\257\047\034 7-zip archive data,
+>6 byte x version %d
+>7 byte x \b.%d
+
+# Type: LZMA
+# URL: http://www.7-zip.org/sdk.html
+# From: Robert Millan <rmh at aybabtu.com> and Reuben Thomas <rrt at sc3d.org>
+# Commented out because apparently not reliable (according to Debian
+# bug #364260)
+#0 string ]\000\000\200\000 LZMA compressed data
+
+# Type: LZMA
+0 lelong&0xffffff =0x5d
+>12 leshort =0xff LZMA compressed data,
+>>5 lequad =0xffffffffffffffff streamed
+>>5 lequad !0xffffffffffffffff non-streamed, size %lld
+!:mime application/x-lzma
+
+# http://tukaani.org/xz/xz-file-format.txt
+0 ustring \xFD7zXZ\x00 xz compressed data
+!:mime application/x-xz
+
+# AFX compressed files (Wolfram Kleff)
+2 string -afx- AFX compressed file data
+
+# Supplementary magic data for the file(1) command to support
+# rzip(1). The format is described in magic(5).
+#
+# Copyright (C) 2003 by Andrew Tridgell. You may do whatever you want with
+# this file.
+#
+0 string RZIP rzip compressed data
+>4 byte x - version %d
+>5 byte x \b.%d
+>6 belong x (%d bytes)
+
+# Type: XZ
+# URL: http://tukaani.org/xz/
+0 string \xfd\x37\x7a\x58\x5a\x00 XZ compressed data
+!:mime application/x-xz
+
+#------------------------------------------------------------------------------
+# $File: console,v 1.16 2009/09/19 16:28:08 christos Exp $
+# Console game magic
+# Toby Deshane <hac at shoelace.digivill.net>
+# ines: file(1) magic for Marat's iNES Nintendo Entertainment System
+# ROM dump format
+
+0 string NES\032 iNES ROM dump,
+>4 byte x %dx16k PRG
+>5 byte x \b, %dx8k CHR
+>6 byte&0x01 =0x1 \b, [Vert.]
+>6 byte&0x01 =0x0 \b, [Horiz.]
+>6 byte&0x02 =0x2 \b, [SRAM]
+>6 byte&0x04 =0x4 \b, [Trainer]
+>6 byte&0x04 =0x8 \b, [4-Scr]
+
+#------------------------------------------------------------------------------
+# gameboy: file(1) magic for the Nintendo (Color) Gameboy raw ROM format
+#
+0x104 belong 0xCEED6666 Gameboy ROM:
+>0x134 string >\0 "%.16s"
+>0x146 byte 0x03 \b,[SGB]
+>0x147 byte 0x00 \b, [ROM ONLY]
+>0x147 byte 0x01 \b, [ROM+MBC1]
+>0x147 byte 0x02 \b, [ROM+MBC1+RAM]
+>0x147 byte 0x03 \b, [ROM+MBC1+RAM+BATT]
+>0x147 byte 0x05 \b, [ROM+MBC2]
+>0x147 byte 0x06 \b, [ROM+MBC2+BATTERY]
+>0x147 byte 0x08 \b, [ROM+RAM]
+>0x147 byte 0x09 \b, [ROM+RAM+BATTERY]
+>0x147 byte 0x0B \b, [ROM+MMM01]
+>0x147 byte 0x0C \b, [ROM+MMM01+SRAM]
+>0x147 byte 0x0D \b, [ROM+MMM01+SRAM+BATT]
+>0x147 byte 0x0F \b, [ROM+MBC3+TIMER+BATT]
+>0x147 byte 0x10 \b, [ROM+MBC3+TIMER+RAM+BATT]
+>0x147 byte 0x11 \b, [ROM+MBC3]
+>0x147 byte 0x12 \b, [ROM+MBC3+RAM]
+>0x147 byte 0x13 \b, [ROM+MBC3+RAM+BATT]
+>0x147 byte 0x19 \b, [ROM+MBC5]
+>0x147 byte 0x1A \b, [ROM+MBC5+RAM]
+>0x147 byte 0x1B \b, [ROM+MBC5+RAM+BATT]
+>0x147 byte 0x1C \b, [ROM+MBC5+RUMBLE]
+>0x147 byte 0x1D \b, [ROM+MBC5+RUMBLE+SRAM]
+>0x147 byte 0x1E \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
+>0x147 byte 0x1F \b, [Pocket Camera]
+>0x147 byte 0xFD \b, [Bandai TAMA5]
+>0x147 byte 0xFE \b, [Hudson HuC-3]
+>0x147 byte 0xFF \b, [Hudson HuC-1]
+
+>0x148 byte 0 \b, ROM: 256Kbit
+>0x148 byte 1 \b, ROM: 512Kbit
+>0x148 byte 2 \b, ROM: 1Mbit
+>0x148 byte 3 \b, ROM: 2Mbit
+>0x148 byte 4 \b, ROM: 4Mbit
+>0x148 byte 5 \b, ROM: 8Mbit
+>0x148 byte 6 \b, ROM: 16Mbit
+>0x148 byte 0x52 \b, ROM: 9Mbit
+>0x148 byte 0x53 \b, ROM: 10Mbit
+>0x148 byte 0x54 \b, ROM: 12Mbit
+
+>0x149 byte 1 \b, RAM: 16Kbit
+>0x149 byte 2 \b, RAM: 64Kbit
+>0x149 byte 3 \b, RAM: 128Kbit
+>0x149 byte 4 \b, RAM: 1Mbit
+
+#>0x14e long x \b, CRC: %x
+
+#------------------------------------------------------------------------------
+# genesis: file(1) magic for the Sega MegaDrive/Genesis raw ROM format
+#
+0x100 string SEGA Sega MegaDrive/Genesis raw ROM dump
+>0x120 string >\0 Name: "%.16s"
+>0x110 string >\0 %.16s
+>0x1B0 string RA with SRAM
+
+#------------------------------------------------------------------------------
+# genesis: file(1) magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAGN Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte 0 \b, last in series or standalone
+>2 byte >0 \b, split ROM
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# genesis: file(1) alternate magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAMG Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte x \b, last in series or standalone
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# smsgg: file(1) magic for Sega Master System and Game Gear ROM dumps
+#
+# Does not detect all images. Very preliminary guesswork. Need more data
+# on format.
+#
+# FIXME: need a little more info...;P
+#
+#0 byte 0xF3
+#>1 byte 0xED Sega Master System/Game Gear ROM dump
+#>1 byte 0x31 Sega Master System/Game Gear ROM dump
+#>1 byte 0xDB Sega Master System/Game Gear ROM dump
+#>1 byte 0xAF Sega Master System/Game Gear ROM dump
+#>1 byte 0xC3 Sega Master System/Game Gear ROM dump
+
+#------------------------------------------------------------------------------
+# dreamcast: file(1) uncertain magic for the Sega Dreamcast VMU image format
+#
+0 belong 0x21068028 Sega Dreamcast VMU game image
+0 string LCDi Dream Animator file
+
+#------------------------------------------------------------------------------
+# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
+#
+0 belong 0x37804012 V64 Nintendo 64 ROM dump
+
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+# Nintendo .nds
+192 string \044\377\256Qi\232 Nintendo DS Game ROM Image
+# Nintendo .gba
+0 string \056\000\000\352$\377\256Qi Nintendo Game Boy Advance ROM Image
+
+#------------------------------------------------------------------------------
+# msx: file(1) magic for MSX game cartridge dumps
+# Too simple - MPi
+#0 beshort 0x4142 MSX game cartridge dump
+
+#------------------------------------------------------------------------------
+# Sony Playstation executables (Adam Sjoegren <asjo at diku.dk>) :
+0 string PS-X\ EXE Sony Playstation executable
+# Area:
+>113 string x (%s)
+
+#------------------------------------------------------------------------------
+# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia at cc.hut.fi>)
+0 string XBEH XBE, Microsoft Xbox executable
+# probabilistic checks whether signed or not
+>0x0004 ulelong =0x0
+>>&2 ulelong =0x0
+>>>&2 ulelong =0x0 \b, not signed
+>0x0004 ulelong >0
+>>&2 ulelong >0
+>>>&2 ulelong >0 \b, signed
+# expect base address of 0x10000
+>0x0104 ulelong =0x10000
+>>(0x0118-0x0FF60) ulelong&0x80000007 0x80000007 \b, all regions
+>>(0x0118-0x0FF60) ulelong&0x80000007 !0x80000007
+>>>(0x0118-0x0FF60) ulelong >0 (regions:
+>>>>(0x0118-0x0FF60) ulelong &0x00000001 NA
+>>>>(0x0118-0x0FF60) ulelong &0x00000002 Japan
+>>>>(0x0118-0x0FF60) ulelong &0x00000004 Rest_of_World
+>>>>(0x0118-0x0FF60) ulelong &0x80000000 Manufacturer
+>>>(0x0118-0x0FF60) ulelong >0 \b)
+
+# --------------------------------
+# Microsoft Xbox data file formats
+0 string XIP0 XIP, Microsoft Xbox data
+0 string XTF0 XTF, Microsoft Xbox data
+
+# Atari Lynx cartridge dump (EXE/BLL header)
+# From: "Stefan A. Haubenthal" <polluks at web.de>
+
+0 beshort 0x8008 Lynx cartridge,
+>2 beshort x RAM start $%04x
+>6 string BS93
+
+# Opera file system that is used on the 3DO console
+# From: Serge van den Boom <svdb at stack.nl>
+0 string \x01ZZZZZ\x01 3DO "Opera" file system
+
+# From Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+0 string GBS Nintendo Gameboy Music/Audio Data
+12 string GameBoy\ Music\ Module Nintendo Gameboy Music Module
+
+# Playstations Patch Files from: From: Thomas Klausner <tk at giga.or.at>
+0 string PPF30 Playstation Patch File version 3.0
+>5 byte 0 \b, PPF 1.0 patch
+>5 byte 1 \b, PPF 2.0 patch
+>5 byte 2 \b, PPF 3.0 patch
+>>56 byte 0 \b, Imagetype BIN (any)
+>>56 byte 1 \b, Imagetype GI (PrimoDVD)
+>>57 byte 0 \b, Blockcheck disabled
+>>57 byte 1 \b, Blockcheck enabled
+>>58 byte 0 \b, Undo data not available
+>>58 byte 1 \b, Undo data available
+>6 string x \b, description: %s
+
+0 string PPF20 Playstation Patch File version 2.0
+>5 byte 0 \b, PPF 1.0 patch
+>5 byte 1 \b, PPF 2.0 patch
+>>56 lelong >0 \b, size of file to patch %d
+>6 string x \b, description: %s
+
+0 string PPF10 Playstation Patch File version 1.0
+>5 byte 0 \b, Simple Encoding
+>6 string x \b, description: %s
+
+# From: Daniel Dawson <ddawson at icehouse.net>
+# SNES9x .smv "movie" file format.
+0 string SMV\x1A SNES9x input recording
+>0x4 lelong x \b, version %d
+# version 4 is latest so far
+>0x4 lelong <5
+>>0x8 ledate x \b, recorded at %s
+>>0xc lelong >0 \b, rerecorded %d times
+>>0x10 lelong x \b, %d frames long
+>>0x14 byte >0 \b, data for controller(s):
+>>>0x14 byte &0x1 #1
+>>>0x14 byte &0x2 #2
+>>>0x14 byte &0x4 #3
+>>>0x14 byte &0x8 #4
+>>>0x14 byte &0x10 #5
+>>0x15 byte ^0x1 \b, begins from snapshot
+>>0x15 byte &0x1 \b, begins from reset
+>>0x15 byte ^0x2 \b, NTSC standard
+>>0x15 byte &0x2 \b, PAL standard
+>>0x17 byte &0x1 \b, settings:
+# WIP1Timing not used as of version 4
+>>>0x4 lelong <4
+>>>>0x17 byte &0x2 WIP1Timing
+>>>0x17 byte &0x4 Left+Right
+>>>0x17 byte &0x8 VolumeEnvX
+>>>0x17 byte &0x10 FakeMute
+>>>0x17 byte &0x20 SyncSound
+# New flag as of version 4
+>>>0x4 lelong >3
+>>>>0x17 byte &0x80 NoCPUShutdown
+>>0x4 lelong <4
+>>>0x18 lelong >0x23
+>>>>0x20 leshort !0
+>>>>>0x20 lestring16 x \b, metadata: "%s"
+>>0x4 lelong >3
+>>>0x24 byte >0 \b, port 1:
+>>>>0x24 byte 1 joypad
+>>>>0x24 byte 2 mouse
+>>>>0x24 byte 3 SuperScope
+>>>>0x24 byte 4 Justifier
+>>>>0x24 byte 5 multitap
+>>>0x24 byte >0 \b, port 2:
+>>>>0x25 byte 1 joypad
+>>>>0x25 byte 2 mouse
+>>>>0x25 byte 3 SuperScope
+>>>>0x25 byte 4 Justifier
+>>>>0x25 byte 5 multitap
+>>>0x18 lelong >0x43
+>>>>0x40 leshort !0
+>>>>>0x40 lestring16 x \b, metadata: "%s"
+>>0x17 byte &0x40 \b, ROM:
+>>>(0x18.l-26) lelong x CRC32 0x%08x
+>>>(0x18.l-23) string x "%s"
+
+
+#------------------------------------------------------------------------------
+# $File: convex,v 1.7 2009/09/19 16:28:08 christos Exp $
+# convex: file(1) magic for Convex boxes
+#
+# Convexes are big-endian.
+#
+# /*\
+# * Below are the magic numbers and tests added for Convex.
+# * Added at beginning, because they are expected to be used most.
+# \*/
+0 belong 0507 Convex old-style object
+>16 belong >0 not stripped
+0 belong 0513 Convex old-style demand paged executable
+>16 belong >0 not stripped
+0 belong 0515 Convex old-style pre-paged executable
+>16 belong >0 not stripped
+0 belong 0517 Convex old-style pre-paged, non-swapped executable
+>16 belong >0 not stripped
+0 belong 0x011257 Core file
+#
+# The following are a series of dump format magic numbers. Each one
+# corresponds to a drastically different dump format. The first on is
+# the original dump format on a 4.1 BSD or earlier file system. The
+# second marks the change between the 4.1 file system and the 4.2 file
+# system. The Third marks the changing of the block size from 1K
+# to 2K to be compatible with an IDC file system. The fourth indicates
+# a dump that is dependent on Convex Storage Manager, because data in
+# secondary storage is not physically contained within the dump.
+# The restore program uses these number to determine how the data is
+# to be extracted.
+#
+24 belong =60013 dump format, 4.2 or 4.3 BSD (IDC compatible)
+24 belong =60014 dump format, Convex Storage Manager by-reference dump
+#
+# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
+# If there is no `=' sign, assume just checking for whether the bit is set?
+#
+0 belong 0601 Convex SOFF
+>88 belong&0x000f0000 =0x00000000 c1
+>88 belong &0x00010000 c2
+>88 belong &0x00020000 c2mp
+>88 belong &0x00040000 parallel
+>88 belong &0x00080000 intrinsic
+>88 belong &0x00000001 demand paged
+>88 belong &0x00000002 pre-paged
+>88 belong &0x00000004 non-swapped
+>88 belong &0x00000008 POSIX
+#
+>84 belong &0x80000000 executable
+>84 belong &0x40000000 object
+>84 belong&0x20000000 =0 not stripped
+>84 belong&0x18000000 =0x00000000 native fpmode
+>84 belong&0x18000000 =0x10000000 ieee fpmode
+>84 belong&0x18000000 =0x18000000 undefined fpmode
+#
+0 belong 0605 Convex SOFF core
+#
+0 belong 0607 Convex SOFF checkpoint
+>88 belong&0x000f0000 =0x00000000 c1
+>88 belong &0x00010000 c2
+>88 belong &0x00020000 c2mp
+>88 belong &0x00040000 parallel
+>88 belong &0x00080000 intrinsic
+>88 belong &0x00000008 POSIX
+#
+>84 belong&0x18000000 =0x00000000 native fpmode
+>84 belong&0x18000000 =0x10000000 ieee fpmode
+>84 belong&0x18000000 =0x18000000 undefined fpmode
+
+#------------------------------------------------------------------------------
+# $File: cracklib,v 1.7 2009/09/19 16:28:08 christos Exp $
+# cracklib: file (1) magic for cracklib v2.7
+
+0 lelong 0x70775631 Cracklib password index, little endian
+>4 long >0 (%i words)
+>4 long 0 ("64-bit")
+>>8 long >-1 (%i words)
+0 belong 0x70775631 Cracklib password index, big endian
+>4 belong >-1 (%i words)
+# really bellong 0x0000000070775631
+0 search/1 \0\0\0\0pwV1 Cracklib password index, big endian ("64-bit")
+>12 belong >0 (%i words)
+
+# ----------------------------------------------------------------------------
+# $File: ctags,v 1.6 2009/09/19 16:28:08 christos Exp $
+# ctags: file (1) magic for Exuberant Ctags files
+# From: Alexander Mai <mai at migdal.ikp.physik.tu-darmstadt.de>
+0 search/1 =!_TAG Exuberant Ctags tag file text
+
+#------------------------------------------------------------------------------
+# $File: dact,v 1.4 2009/09/19 16:28:08 christos Exp $
+# dact: file(1) magic for DACT compressed files
+#
+0 long 0x444354C3 DACT compressed data
+>4 byte >-1 (version %i.
+>5 byte >-1 $BS%i.
+>6 byte >-1 $BS%i)
+>7 long >0 $BS, original size: %i bytes
+>15 long >30 $BS, block size: %i bytes
+
+#------------------------------------------------------------------------------
+# $File: database,v 1.24 2009/09/19 16:28:08 christos Exp $
+# database: file(1) magic for various databases
+#
+# extracted from header/code files by Graeme Wilford (eep2gw at ee.surrey.ac.uk)
+#
+#
+# GDBM magic numbers
+# Will be maintained as part of the GDBM distribution in the future.
+# <downsj at teeny.org>
+0 belong 0x13579ace GNU dbm 1.x or ndbm database, big endian
+!:mime application/x-gdbm
+0 lelong 0x13579ace GNU dbm 1.x or ndbm database, little endian
+!:mime application/x-gdbm
+0 string GDBM GNU dbm 2.x database
+!:mime application/x-gdbm
+#
+# Berkeley DB
+#
+# Ian Darwin's file /etc/magic files: big/little-endian version.
+#
+# Hash 1.85/1.86 databases store metadata in network byte order.
+# Btree 1.85/1.86 databases store the metadata in host byte order.
+# Hash and Btree 2.X and later databases store the metadata in host byte order.
+
+0 long 0x00061561 Berkeley DB
+!:mime application/x-dbm
+>8 belong 4321
+>>4 belong >2 1.86
+>>4 belong <3 1.85
+>>4 belong >0 (Hash, version %d, native byte-order)
+>8 belong 1234
+>>4 belong >2 1.86
+>>4 belong <3 1.85
+>>4 belong >0 (Hash, version %d, little-endian)
+
+0 belong 0x00061561 Berkeley DB
+>8 belong 4321
+>>4 belong >2 1.86
+>>4 belong <3 1.85
+>>4 belong >0 (Hash, version %d, big-endian)
+>8 belong 1234
+>>4 belong >2 1.86
+>>4 belong <3 1.85
+>>4 belong >0 (Hash, version %d, native byte-order)
+
+0 long 0x00053162 Berkeley DB 1.85/1.86
+>4 long >0 (Btree, version %d, native byte-order)
+0 belong 0x00053162 Berkeley DB 1.85/1.86
+>4 belong >0 (Btree, version %d, big-endian)
+0 lelong 0x00053162 Berkeley DB 1.85/1.86
+>4 lelong >0 (Btree, version %d, little-endian)
+
+12 long 0x00061561 Berkeley DB
+>16 long >0 (Hash, version %d, native byte-order)
+12 belong 0x00061561 Berkeley DB
+>16 belong >0 (Hash, version %d, big-endian)
+12 lelong 0x00061561 Berkeley DB
+>16 lelong >0 (Hash, version %d, little-endian)
+
+12 long 0x00053162 Berkeley DB
+>16 long >0 (Btree, version %d, native byte-order)
+12 belong 0x00053162 Berkeley DB
+>16 belong >0 (Btree, version %d, big-endian)
+12 lelong 0x00053162 Berkeley DB
+>16 lelong >0 (Btree, version %d, little-endian)
+
+12 long 0x00042253 Berkeley DB
+>16 long >0 (Queue, version %d, native byte-order)
+12 belong 0x00042253 Berkeley DB
+>16 belong >0 (Queue, version %d, big-endian)
+12 lelong 0x00042253 Berkeley DB
+>16 lelong >0 (Queue, version %d, little-endian)
+
+# From Max Bowsher.
+12 long 0x00040988 Berkeley DB
+>16 long >0 (Log, version %d, native byte-order)
+12 belong 0x00040988 Berkeley DB
+>16 belong >0 (Log, version %d, big-endian)
+12 lelong 0x00040988 Berkeley DB
+>16 lelong >0 (Log, version %d, little-endian)
+
+#
+#
+# Round Robin Database Tool by Tobias Oetiker <oetiker at ee.ethz.ch>
+0 string/b RRD\0 RRDTool DB
+>4 string/b x version %s
+#----------------------------------------------------------------------
+# ROOT: file(1) magic for ROOT databases
+#
+0 string root\0 ROOT file
+>4 belong x Version %d
+>33 belong x (Compression: %d)
+
+# XXX: Weak magic.
+# Alex Ott <ott at jet.msk.su>
+## Paradox file formats
+#2 leshort 0x0800 Paradox
+#>0x39 byte 3 v. 3.0
+#>0x39 byte 4 v. 3.5
+#>0x39 byte 9 v. 4.x
+#>0x39 byte 10 v. 5.x
+#>0x39 byte 11 v. 5.x
+#>0x39 byte 12 v. 7.x
+#>>0x04 byte 0 indexed .DB data file
+#>>0x04 byte 1 primary index .PX file
+#>>0x04 byte 2 non-indexed .DB data file
+#>>0x04 byte 3 non-incrementing secondary index .Xnn file
+#>>0x04 byte 4 secondary index .Ynn file
+#>>0x04 byte 5 incrementing secondary index .Xnn file
+#>>0x04 byte 6 non-incrementing secondary index .XGn file
+#>>0x04 byte 7 secondary index .YGn file
+#>>>0x04 byte 8 incrementing secondary index .XGn file
+
+## XBase database files
+#0 byte 0x02
+#>8 leshort >0
+#>>12 leshort 0 FoxBase
+#!:mime application/x-dbf
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x03
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x04
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 dBASE IV no memo file
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x05
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 dBASE V no memo file
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x30
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 Visual FoxPro
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x43
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 FlagShip with memo var size
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x7b
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 dBASEIV with memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x83
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 FoxBase+, dBaseIII+ with memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x8b
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 dBaseIV with memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0x8e
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 dBaseIV with SQL Table
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0xb3
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 FlagShip with .dbt memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 byte 0xf5
+#!:mime application/x-dbf
+#>8 leshort >0
+#>>12 leshort 0 FoxPro with memo
+#>>>0x04 lelong 0 (no records)
+#>>>0x04 lelong >0 (%ld records)
+#
+#0 leshort 0x0006 DBase 3 index file
+
+# MS Access database
+4 string Standard\ Jet\ DB Microsoft Access Database
+!:mime application/x-msaccess
+
+# TDB database from Samba et al - Martin Pool <mbp at samba.org>
+0 string TDB\ file TDB database
+>32 lelong 0x2601196D version 6, little-endian
+>>36 lelong x hash size %d bytes
+
+# SE Linux policy database
+0 lelong 0xf97cff8c SE Linux policy
+>16 lelong x v%d
+>20 lelong 1 MLS
+>24 lelong x %d symbols
+>28 lelong x %d ocons
+
+# ICE authority file data (Wolfram Kleff)
+2 string ICE ICE authority data
+
+# X11 Xauthority file (Wolfram Kleff)
+10 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+11 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+12 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+13 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+14 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+15 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+16 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+17 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+18 string MIT-MAGIC-COOKIE-1 X11 Xauthority data
+
+# From: Maxime Henrion <mux at FreeBSD.org>
+# PostgreSQL's custom dump format, Maxime Henrion <mux at FreeBSD.org>
+0 string PGDMP PostgreSQL custom database dump
+>5 byte x - v%d
+>6 byte x \b.%d
+>5 beshort <0x101 \b-0
+>5 beshort >0x100
+>>7 byte x \b-%d
+
+# Type: Advanced Data Format (ADF) database
+# URL: http://www.grc.nasa.gov/WWW/cgns/adf/
+# From: Nicolas Chauvat <nicolas.chauvat at logilab.fr>
+0 string @(#)ADF\ Database CGNS Advanced Data Format
+
+# Tokyo Cabinet magic data
+# http://tokyocabinet.sourceforge.net/index.html
+0 string ToKyO\ CaBiNeT\n Tokyo Cabinet
+>14 string x \b (%s)
+>32 byte 0 \b, Hash
+!:mime application/x-tokyocabinet-hash
+>32 byte 1 \b, B+ tree
+!:mime application/x-tokyocabinet-btree
+>32 byte 2 \b, Fixed-length
+!:mime application/x-tokyocabinet-fixed
+>32 byte 3 \b, Table
+!:mime application/x-tokyocabinet-table
+>33 byte &1 \b, [open]
+>33 byte &2 \b, [fatal]
+>34 byte x \b, apow=%d
+>35 byte x \b, fpow=%d
+>36 byte &0x01 \b, [large]
+>36 byte &0x02 \b, [deflate]
+>36 byte &0x04 \b, [bzip]
+>36 byte &0x08 \b, [tcbs]
+>36 byte &0x10 \b, [excodec]
+>40 lequad x \b, bnum=%lld
+>48 lequad x \b, rnum=%lld
+>56 lequad x \b, fsiz=%lld
+
+#------------------------------------------------------------------------------
+# $File: diamond,v 1.7 2009/09/19 16:28:08 christos Exp $
+# diamond: file(1) magic for Diamond system
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+# The full deal is too long...
+#0 string <list>\n<protocol\ bbn-multimedia-format> Diamond Multimedia Document
+0 string =<list>\n<protocol\ bbn-m Diamond Multimedia Document
+
+#------------------------------------------------------------------------------
+# $File: diff,v 1.10 2009/09/19 16:28:08 christos Exp $
+# diff: file(1) magic for diff(1) output
+#
+0 search/1 diff\ diff output text
+!:mime text/x-diff
+0 search/1 ***\ diff output text
+!:mime text/x-diff
+0 search/1 Only\ in\ diff output text
+!:mime text/x-diff
+0 search/1 Common\ subdirectories:\ diff output text
+!:mime text/x-diff
+
+0 search/1 Index: RCS/CVS diff output text
+!:mime text/x-diff
+
+# bsdiff: file(1) magic for bsdiff(1) output
+0 string BSDIFF40 bsdiff(1) patch file
+
+# unified diff
+0 search/4096 ---\
+>&0 search/1024 \n
+>>&0 search/1 +++\
+>>>&0 search/1024 \n
+>>>>&0 search/1 @@ unified diff output text
+!:mime text/x-diff
+!:strength + 30
+#------------------------------------------------------------------------------
+# $File: digital,v 1.8 2009/09/19 16:28:08 christos Exp $
+# Digital UNIX - Info
+#
+0 string =!<arch>\n________64E Alpha archive
+>22 string X -- out of date
+#
+# Alpha COFF Based Executables
+# The stripped stuff really needs to be an 8 byte (64 bit) compare,
+# but this works
+0 leshort 0x183 COFF format alpha
+>22 leshort&020000 &010000 sharable library,
+>22 leshort&020000 ^010000 dynamically linked,
+>24 leshort 0410 pure
+>24 leshort 0413 demand paged
+>8 lelong >0 executable or object module, not stripped
+>8 lelong 0
+>>12 lelong 0 executable or object module, stripped
+>>12 lelong >0 executable or object module, not stripped
+>27 byte >0 - version %d.
+>26 byte >0 %d-
+>28 leshort >0 %d
+#
+# The next is incomplete, we could tell more about this format,
+# but its not worth it.
+0 leshort 0x188 Alpha compressed COFF
+0 leshort 0x18f Alpha u-code object
+#
+#
+# Some other interesting Digital formats,
+0 string \377\377\177 ddis/ddif
+0 string \377\377\174 ddis/dots archive
+0 string \377\377\176 ddis/dtif table data
+0 string \033c\033 LN03 output
+0 long 04553207 X image
+#
+0 string =!<PDF>!\n profiling data file
+#
+# Locale data tables (MIPS and Alpha).
+#
+0 short 0x0501 locale data table
+>6 short 0x24 for MIPS
+>6 short 0x40 for Alpha
+
+#------------------------------------------------------------------------------
+# $File: dolby,v 1.5 2009/09/19 16:28:08 christos Exp $
+# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka at gmx.at>
+# from http://www.atsc.org/standards/a_52a.pdf
+# corrections, additions, etc. are always welcome!
+#
+# syncword
+0 beshort 0x0b77 ATSC A/52 aka AC-3 aka Dolby Digital stream,
+# fscod
+>4 byte&0xc0 0x00 48 kHz,
+>4 byte&0xc0 0x40 44.1 kHz,
+>4 byte&0xc0 0x80 32 kHz,
+# is this one used for 96 kHz?
+>4 byte&0xc0 0xc0 reserved frequency,
+#
+>5 byte&7 = 0 \b, complete main (CM)
+>5 byte&7 = 1 \b, music and effects (ME)
+>5 byte&7 = 2 \b, visually impaired (VI)
+>5 byte&7 = 3 \b, hearing impaired (HI)
+>5 byte&7 = 4 \b, dialogue (D)
+>5 byte&7 = 5 \b, commentary (C)
+>5 byte&7 = 6 \b, emergency (E)
+# acmod
+>6 byte&0xe0 0x00 1+1 front,
+>6 byte&0xe0 0x20 1 front/0 rear,
+>6 byte&0xe0 0x40 2 front/0 rear,
+>6 byte&0xe0 0x60 3 front/0 rear,
+>6 byte&0xe0 0x80 2 front/1 rear,
+>6 byte&0xe0 0xa0 3 front/1 rear,
+>6 byte&0xe0 0xc0 2 front/2 rear,
+>6 byte&0xe0 0xe0 3 front/2 rear,
+# lfeon (these may be incorrect)
+>7 byte&0x40 0x00 LFE off,
+>7 byte&0x40 0x40 LFE on,
+#
+>4 byte&0x3e = 0x00 \b, 32 kbit/s
+>4 byte&0x3e = 0x02 \b, 40 kbit/s
+>4 byte&0x3e = 0x04 \b, 48 kbit/s
+>4 byte&0x3e = 0x06 \b, 56 kbit/s
+>4 byte&0x3e = 0x08 \b, 64 kbit/s
+>4 byte&0x3e = 0x0a \b, 80 kbit/s
+>4 byte&0x3e = 0x0c \b, 96 kbit/s
+>4 byte&0x3e = 0x0e \b, 112 kbit/s
+>4 byte&0x3e = 0x10 \b, 128 kbit/s
+>4 byte&0x3e = 0x12 \b, 160 kbit/s
+>4 byte&0x3e = 0x14 \b, 192 kbit/s
+>4 byte&0x3e = 0x16 \b, 224 kbit/s
+>4 byte&0x3e = 0x18 \b, 256 kbit/s
+>4 byte&0x3e = 0x1a \b, 320 kbit/s
+>4 byte&0x3e = 0x1c \b, 384 kbit/s
+>4 byte&0x3e = 0x1e \b, 448 kbit/s
+>4 byte&0x3e = 0x20 \b, 512 kbit/s
+>4 byte&0x3e = 0x22 \b, 576 kbit/s
+>4 byte&0x3e = 0x24 \b, 640 kbit/s
+# dsurmod (these may be incorrect)
+>6 beshort&0x0180 0x0000 Dolby Surround not indicated
+>6 beshort&0x0180 0x0080 not Dolby Surround encoded
+>6 beshort&0x0180 0x0100 Dolby Surround encoded
+>6 beshort&0x0180 0x0180 reserved Dolby Surround mode
+
+#------------------------------------------------------------------------------
+# $File: dump,v 1.11 2009/09/19 16:28:09 christos Exp $
+# dump: file(1) magic for dump file format--for new and old dump filesystems
+#
+# We specify both byte orders in order to recognize byte-swapped dumps.
+#
+24 belong 60012 new-fs dump file (big endian),
+>4 bedate x Previous dump %s,
+>8 bedate x This dump %s,
+>12 belong >0 Volume %ld,
+>692 belong 0 Level zero, type:
+>692 belong >0 Level %d, type:
+>0 belong 1 tape header,
+>0 belong 2 beginning of file record,
+>0 belong 3 map of inodes on tape,
+>0 belong 4 continuation of file record,
+>0 belong 5 end of volume,
+>0 belong 6 map of inodes deleted,
+>0 belong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 belong >0 Flags %x
+
+24 belong 60011 old-fs dump file (big endian),
+#>4 bedate x Previous dump %s,
+#>8 bedate x This dump %s,
+>12 belong >0 Volume %ld,
+>692 belong 0 Level zero, type:
+>692 belong >0 Level %d, type:
+>0 belong 1 tape header,
+>0 belong 2 beginning of file record,
+>0 belong 3 map of inodes on tape,
+>0 belong 4 continuation of file record,
+>0 belong 5 end of volume,
+>0 belong 6 map of inodes deleted,
+>0 belong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 belong >0 Flags %x
+
+24 lelong 60012 new-fs dump file (little endian),
+>4 ledate x This dump %s,
+>8 ledate x Previous dump %s,
+>12 lelong >0 Volume %ld,
+>692 lelong 0 Level zero, type:
+>692 lelong >0 Level %d, type:
+>0 lelong 1 tape header,
+>0 lelong 2 beginning of file record,
+>0 lelong 3 map of inodes on tape,
+>0 lelong 4 continuation of file record,
+>0 lelong 5 end of volume,
+>0 lelong 6 map of inodes deleted,
+>0 lelong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 lelong >0 Flags %x
+
+24 lelong 60011 old-fs dump file (little endian),
+#>4 ledate x Previous dump %s,
+#>8 ledate x This dump %s,
+>12 lelong >0 Volume %ld,
+>692 lelong 0 Level zero, type:
+>692 lelong >0 Level %d, type:
+>0 lelong 1 tape header,
+>0 lelong 2 beginning of file record,
+>0 lelong 3 map of inodes on tape,
+>0 lelong 4 continuation of file record,
+>0 lelong 5 end of volume,
+>0 lelong 6 map of inodes deleted,
+>0 lelong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 lelong >0 Flags %x
+
+18 leshort 60011 old-fs dump file (16-bit, assuming PDP-11 endianness),
+>2 medate x Previous dump %s,
+>6 medate x This dump %s,
+>10 leshort >0 Volume %ld,
+>0 leshort 1 tape header.
+>0 leshort 2 beginning of file record.
+>0 leshort 3 map of inodes on tape.
+>0 leshort 4 continuation of file record.
+>0 leshort 5 end of volume.
+>0 leshort 6 map of inodes deleted.
+>0 leshort 7 end of medium (for floppy).
+
+24 belong 0x19540119 new-fs dump file (ufs2, big endian),
+>896 beqdate x Previous dump %s,
+>904 beqdate x This dump %s,
+>12 belong >0 Volume %ld,
+>692 belong 0 Level zero, type:
+>692 belong >0 Level %d, type:
+>0 belong 1 tape header,
+>0 belong 2 beginning of file record,
+>0 belong 3 map of inodes on tape,
+>0 belong 4 continuation of file record,
+>0 belong 5 end of volume,
+>0 belong 6 map of inodes deleted,
+>0 belong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 belong >0 Flags %x
+
+24 lelong 0x19540119 new-fs dump file (ufs2, little endian),
+>896 leqdate x This dump %s,
+>904 leqdate x Previous dump %s,
+>12 lelong >0 Volume %ld,
+>692 lelong 0 Level zero, type:
+>692 lelong >0 Level %d, type:
+>0 lelong 1 tape header,
+>0 lelong 2 beginning of file record,
+>0 lelong 3 map of inodes on tape,
+>0 lelong 4 continuation of file record,
+>0 lelong 5 end of volume,
+>0 lelong 6 map of inodes deleted,
+>0 lelong 7 end of medium (for floppy),
+>676 string >\0 Label %s,
+>696 string >\0 Filesystem %s,
+>760 string >\0 Device %s,
+>824 string >\0 Host %s,
+>888 lelong >0 Flags %x
+
+#------------------------------------------------------------------------------
+# $File: dyadic,v 1.4 2009/09/19 16:28:09 christos Exp $
+# Dyadic: file(1) magic for Dyalog APL.
+#
+0 byte 0xaa
+>1 byte <4 Dyalog APL
+>>1 byte 0x00 incomplete workspace
+>>1 byte 0x01 component file
+>>1 byte 0x02 external variable
+>>1 byte 0x03 workspace
+>>2 byte x version %d
+>>3 byte x .%d
+
+#------------------------------------------------------------------------------
+# $File: editors,v 1.8 2009/09/19 16:28:09 christos Exp $
+# T602 editor documents
+# by David Necas <yeti at physics.muni.cz>
+0 string @CT\ T602 document data,
+>4 string 0 Kamenicky
+>4 string 1 CP 852
+>4 string 2 KOI8-CS
+>4 string >2 unknown encoding
+
+# Vi IMproved Encrypted file
+# by David Necas <yeti at physics.muni.cz>
+0 string VimCrypt~ Vim encrypted file data
+# Vi IMproved Swap file
+# by Sven Wegener <swegener at gentoo.org>
+0 string b0VIM\ Vim swap file
+>&0 string >\0 \b, version %s
+
+#------------------------------------------------------------------------------
+# $File: efi,v 1.4 2009/09/19 16:28:09 christos Exp $
+# efi: file(1) magic for Universal EFI binaries
+
+0 lelong 0x0ef1fab9
+>4 lelong 1 Universal EFI binary with 1 architecture
+>>&0 lelong 7 \b, i386
+>>&0 lelong 0x01000007 \b, x86_64
+>4 lelong 2 Universal EFI binary with 2 architectures
+>>&0 lelong 7 \b, i386
+>>&0 lelong 0x01000007 \b, x86_64
+>>&20 lelong 7 \b, i386
+>>&20 lelong 0x01000007 \b, x86_64
+>4 lelong >2 Universal EFI binary with %ld architectures
+
+#------------------------------------------------------------------------------
+# $File: elf,v 1.53 2009/09/19 16:28:09 christos Exp $
+# elf: file(1) magic for ELF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by: unknown
+# Modified by (1): Daniel Quinlan <quinlan at yggdrasil.com>
+# Modified by (2): Peter Tobias <tobias at server.et-inf.fho-emden.de> (core support)
+# Modified by (3): Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de> (fix of core support)
+# Modified by (4): <gerardo.cacciari at gmail.com> (VMS Itanium)
+# Modified by (5): Matthias Urlichs <smurf at debian.org> (Listing of many architectures)
+0 string \177ELF ELF
+>4 byte 0 invalid class
+>4 byte 1 32-bit
+>4 byte 2 64-bit
+>5 byte 0 invalid byte order
+>5 byte 1 LSB
+>>16 leshort 0 no file type,
+!:strength *2
+!:mime application/octet-stream
+>>16 leshort 1 relocatable,
+!:mime application/x-object
+>>16 leshort 2 executable,
+!:mime application/x-executable
+>>16 leshort 3 shared object,
+!:mime application/x-sharedlib
+>>16 leshort 4 core file
+!:mime application/x-coredump
+# Core file detection is not reliable.
+#>>>(0x38+0xcc) string >\0 of '%s'
+#>>>(0x38+0x10) lelong >0 (signal %d),
+>>16 leshort &0xff00 processor-specific,
+>>18 leshort 0 no machine,
+>>18 leshort 1 AT&T WE32100 - invalid byte order,
+>>18 leshort 2 SPARC - invalid byte order,
+>>18 leshort 3 Intel 80386,
+>>18 leshort 4 Motorola
+>>>36 lelong &0x01000000 68000 - invalid byte order,
+>>>36 lelong &0x00810000 CPU32 - invalid byte order,
+>>>36 lelong 0 68020 - invalid byte order,
+>>18 leshort 5 Motorola 88000 - invalid byte order,
+>>18 leshort 6 Intel 80486,
+>>18 leshort 7 Intel 80860,
+# The official e_machine number for MIPS is now #8, regardless of endianness.
+# The second number (#10) will be deprecated later. For now, we still
+# say something if #10 is encountered, but only gory details for #8.
+>>18 leshort 8 MIPS,
+>>>36 lelong &0x20 N32
+>>18 leshort 10 MIPS,
+>>>36 lelong &0x20 N32
+>>18 leshort 8
+# only for 32-bit
+>>>4 byte 1
+>>>>36 lelong&0xf0000000 0x00000000 MIPS-I
+>>>>36 lelong&0xf0000000 0x10000000 MIPS-II
+>>>>36 lelong&0xf0000000 0x20000000 MIPS-III
+>>>>36 lelong&0xf0000000 0x30000000 MIPS-IV
+>>>>36 lelong&0xf0000000 0x40000000 MIPS-V
+>>>>36 lelong&0xf0000000 0x50000000 MIPS32
+>>>>36 lelong&0xf0000000 0x60000000 MIPS64
+>>>>36 lelong&0xf0000000 0x70000000 MIPS32 rel2
+>>>>36 lelong&0xf0000000 0x80000000 MIPS64 rel2
+# only for 64-bit
+>>>4 byte 2
+>>>>48 lelong&0xf0000000 0x00000000 MIPS-I
+>>>>48 lelong&0xf0000000 0x10000000 MIPS-II
+>>>>48 lelong&0xf0000000 0x20000000 MIPS-III
+>>>>48 lelong&0xf0000000 0x30000000 MIPS-IV
+>>>>48 lelong&0xf0000000 0x40000000 MIPS-V
+>>>>48 lelong&0xf0000000 0x50000000 MIPS32
+>>>>48 lelong&0xf0000000 0x60000000 MIPS64
+>>>>48 lelong&0xf0000000 0x70000000 MIPS32 rel2
+>>>>48 lelong&0xf0000000 0x80000000 MIPS64 rel2
+>>18 leshort 9 Amdahl - invalid byte order,
+>>18 leshort 10 MIPS (deprecated),
+>>18 leshort 11 RS6000 - invalid byte order,
+>>18 leshort 15 PA-RISC - invalid byte order,
+>>>50 leshort 0x0214 2.0
+>>>48 leshort &0x0008 (LP64),
+>>18 leshort 16 nCUBE,
+>>18 leshort 17 Fujitsu VPP500,
+>>18 leshort 18 SPARC32PLUS - invalid byte order,
+>>18 leshort 20 PowerPC,
+>>18 leshort 22 IBM S/390,
+>>18 leshort 36 NEC V800,
+>>18 leshort 37 Fujitsu FR20,
+>>18 leshort 38 TRW RH-32,
+>>18 leshort 39 Motorola RCE,
+>>18 leshort 40 ARM,
+>>18 leshort 41 Alpha,
+>>18 leshort 0xa390 IBM S/390 (obsolete),
+>>18 leshort 42 Renesas SH,
+>>18 leshort 43 SPARC V9 - invalid byte order,
+>>18 leshort 44 Siemens Tricore Embedded Processor,
+>>18 leshort 45 Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18 leshort 46 Renesas H8/300,
+>>18 leshort 47 Renesas H8/300H,
+>>18 leshort 48 Renesas H8S,
+>>18 leshort 49 Renesas H8/500,
+>>18 leshort 50 IA-64,
+>>18 leshort 51 Stanford MIPS-X,
+>>18 leshort 52 Motorola Coldfire,
+>>18 leshort 53 Motorola M68HC12,
+>>18 leshort 54 Fujitsu MMA,
+>>18 leshort 55 Siemens PCP,
+>>18 leshort 56 Sony nCPU,
+>>18 leshort 57 Denso NDR1,
+>>18 leshort 58 Start*Core,
+>>18 leshort 59 Toyota ME16,
+>>18 leshort 60 ST100,
+>>18 leshort 61 Tinyj emb.,
+>>18 leshort 62 x86-64,
+>>18 leshort 63 Sony DSP,
+>>18 leshort 66 FX66,
+>>18 leshort 67 ST9+ 8/16 bit,
+>>18 leshort 68 ST7 8 bit,
+>>18 leshort 69 MC68HC16,
+>>18 leshort 70 MC68HC11,
+>>18 leshort 71 MC68HC08,
+>>18 leshort 72 MC68HC05,
+>>18 leshort 73 SGI SVx,
+>>18 leshort 74 ST19 8 bit,
+>>18 leshort 75 Digital VAX,
+>>18 leshort 76 Axis cris,
+>>18 leshort 77 Infineon 32-bit embedded,
+>>18 leshort 78 Element 14 64-bit DSP,
+>>18 leshort 79 LSI Logic 16-bit DSP,
+>>18 leshort 80 MMIX,
+>>18 leshort 81 Harvard machine-independent,
+>>18 leshort 82 SiTera Prism,
+>>18 leshort 83 Atmel AVR 8-bit,
+>>18 leshort 84 Fujitsu FR30,
+>>18 leshort 85 Mitsubishi D10V,
+>>18 leshort 86 Mitsubishi D30V,
+>>18 leshort 87 NEC v850,
+>>18 leshort 88 Renesas M32R,
+>>18 leshort 89 Matsushita MN10300,
+>>18 leshort 90 Matsushita MN10200,
+>>18 leshort 91 picoJava,
+>>18 leshort 92 OpenRISC,
+>>18 leshort 93 ARC Cores Tangent-A5,
+>>18 leshort 94 Tensilica Xtensa,
+>>18 leshort 97 NatSemi 32k,
+>>18 leshort 106 Analog Devices Blackfin,
+>>18 leshort 113 Altera Nios II,
+>>18 leshort 0xae META,
+>>18 leshort 0x3426 OpenRISC (obsolete),
+>>18 leshort 0x8472 OpenRISC (obsolete),
+>>18 leshort 0x9026 Alpha (unofficial),
+>>20 lelong 0 invalid version
+>>20 lelong 1 version 1
+>>36 lelong 1 MathCoPro/FPU/MAU Required
+>5 byte 2 MSB
+>>16 beshort 0 no file type,
+!:mime application/octet-stream
+>>16 beshort 1 relocatable,
+!:mime application/x-object
+>>16 beshort 2 executable,
+!:mime application/x-executable
+>>16 beshort 3 shared object,
+!:mime application/x-sharedlib
+>>16 beshort 4 core file,
+!:mime application/x-coredump
+#>>>(0x38+0xcc) string >\0 of '%s'
+#>>>(0x38+0x10) belong >0 (signal %d),
+>>16 beshort &0xff00 processor-specific,
+>>18 beshort 0 no machine,
+>>18 beshort 1 AT&T WE32100,
+>>18 beshort 2 SPARC,
+>>18 beshort 3 Intel 80386 - invalid byte order,
+>>18 beshort 4 Motorola
+>>>36 belong &0x01000000 68000,
+>>>36 belong &0x00810000 CPU32,
+>>>36 belong 0 68020,
+>>18 beshort 5 Motorola 88000,
+>>18 beshort 6 Intel 80486 - invalid byte order,
+>>18 beshort 7 Intel 80860,
+# only for MIPS - see comment in little-endian section above.
+>>18 beshort 8 MIPS,
+>>>36 belong &0x20 N32
+>>18 beshort 10 MIPS,
+>>>36 belong &0x20 N32
+>>18 beshort 8
+# only for 32-bit
+>>>4 byte 1
+>>>>36 belong&0xf0000000 0x00000000 MIPS-I
+>>>>36 belong&0xf0000000 0x10000000 MIPS-II
+>>>>36 belong&0xf0000000 0x20000000 MIPS-III
+>>>>36 belong&0xf0000000 0x30000000 MIPS-IV
+>>>>36 belong&0xf0000000 0x40000000 MIPS-V
+>>>>36 belong&0xf0000000 0x50000000 MIPS32
+>>>>36 belong&0xf0000000 0x60000000 MIPS64
+>>>>36 belong&0xf0000000 0x70000000 MIPS32 rel2
+>>>>36 belong&0xf0000000 0x80000000 MIPS64 rel2
+# only for 64-bit
+>>>4 byte 2
+>>>>48 belong&0xf0000000 0x00000000 MIPS-I
+>>>>48 belong&0xf0000000 0x10000000 MIPS-II
+>>>>48 belong&0xf0000000 0x20000000 MIPS-III
+>>>>48 belong&0xf0000000 0x30000000 MIPS-IV
+>>>>48 belong&0xf0000000 0x40000000 MIPS-V
+>>>>48 belong&0xf0000000 0x50000000 MIPS32
+>>>>48 belong&0xf0000000 0x60000000 MIPS64
+>>>>48 belong&0xf0000000 0x70000000 MIPS32 rel2
+>>>>48 belong&0xf0000000 0x80000000 MIPS64 rel2
+>>18 beshort 9 Amdahl,
+>>18 beshort 10 MIPS (deprecated),
+>>18 beshort 11 RS6000,
+>>18 beshort 15 PA-RISC
+>>>50 beshort 0x0214 2.0
+>>>48 beshort &0x0008 (LP64)
+>>18 beshort 16 nCUBE,
+>>18 beshort 17 Fujitsu VPP500,
+>>18 beshort 18 SPARC32PLUS,
+>>>36 belong&0xffff00 0x000100 V8+ Required,
+>>>36 belong&0xffff00 0x000200 Sun UltraSPARC1 Extensions Required,
+>>>36 belong&0xffff00 0x000400 HaL R1 Extensions Required,
+>>>36 belong&0xffff00 0x000800 Sun UltraSPARC3 Extensions Required,
+>>18 beshort 20 PowerPC or cisco 4500,
+>>18 beshort 21 64-bit PowerPC or cisco 7500,
+>>18 beshort 22 IBM S/390,
+>>18 beshort 23 Cell SPU,
+>>18 beshort 24 cisco SVIP,
+>>18 beshort 25 cisco 7200,
+>>18 beshort 36 NEC V800 or cisco 12000,
+>>18 beshort 37 Fujitsu FR20,
+>>18 beshort 38 TRW RH-32,
+>>18 beshort 39 Motorola RCE,
+>>18 beshort 40 ARM,
+>>18 beshort 41 Alpha,
+>>18 beshort 42 Renesas SH,
+>>18 beshort 43 SPARC V9,
+>>>48 belong&0xffff00 0x000200 Sun UltraSPARC1 Extensions Required,
+>>>48 belong&0xffff00 0x000400 HaL R1 Extensions Required,
+>>>48 belong&0xffff00 0x000800 Sun UltraSPARC3 Extensions Required,
+>>>48 belong&0x3 0 total store ordering,
+>>>48 belong&0x3 1 partial store ordering,
+>>>48 belong&0x3 2 relaxed memory ordering,
+>>18 beshort 44 Siemens Tricore Embedded Processor,
+>>18 beshort 45 Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18 beshort 46 Renesas H8/300,
+>>18 beshort 47 Renesas H8/300H,
+>>18 beshort 48 Renesas H8S,
+>>18 beshort 49 Renesas H8/500,
+>>18 beshort 50 IA-64,
+>>18 beshort 51 Stanford MIPS-X,
+>>18 beshort 52 Motorola Coldfire,
+>>18 beshort 53 Motorola M68HC12,
+>>18 beshort 73 Cray NV1,
+>>18 beshort 75 Digital VAX,
+>>18 beshort 88 Renesas M32R,
+>>18 leshort 92 OpenRISC,
+>>18 leshort 0x3426 OpenRISC (obsolete),
+>>18 leshort 0x8472 OpenRISC (obsolete),
+>>18 beshort 94 Tensilica Xtensa,
+>>18 beshort 97 NatSemi 32k,
+>>18 beshort 0x18ad AVR32 (unofficial),
+>>18 beshort 0x9026 Alpha (unofficial),
+>>18 beshort 0xa390 IBM S/390 (obsolete),
+>>20 belong 0 invalid version
+>>20 belong 1 version 1
+>>36 belong 1 MathCoPro/FPU/MAU Required
+# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
+# like proper ELF, but extracting the string had bad results.
+>4 byte <0x80
+>>8 string >\0 (%s)
+>8 string \0
+>>7 byte 0 (SYSV)
+>>7 byte 1 (HP-UX)
+>>7 byte 2 (NetBSD)
+>>7 byte 3 (GNU/Linux)
+>>7 byte 4 (GNU/Hurd)
+>>7 byte 5 (86Open)
+>>7 byte 6 (Solaris)
+>>7 byte 7 (Monterey)
+>>7 byte 8 (IRIX)
+>>7 byte 9 (FreeBSD)
+>>7 byte 10 (Tru64)
+>>7 byte 11 (Novell Modesto)
+>>7 byte 12 (OpenBSD)
+>8 string \2
+>>7 byte 13 (OpenVMS)
+>>7 byte 97 (ARM)
+>>7 byte 255 (embedded)
+
+#------------------------------------------------------------------------------
+# $File: encore,v 1.6 2009/09/19 16:28:09 christos Exp $
+# encore: file(1) magic for Encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0 short 0x154 Encore
+>20 short 0x107 executable
+>20 short 0x108 pure executable
+>20 short 0x10b demand-paged executable
+>20 short 0x10f unsupported executable
+>12 long >0 not stripped
+>22 short >0 - version %ld
+>22 short 0 -
+#>4 date x stamp %s
+0 short 0x155 Encore unsupported executable
+>12 long >0 not stripped
+>22 short >0 - version %ld
+>22 short 0 -
+#>4 date x stamp %s
+
+#------------------------------------------------------------------------------
+# $File: epoc,v 1.7 2009/09/19 16:28:09 christos Exp $
+# EPOC : file(1) magic for EPOC documents [Psion Series 5/Osaris/Geofox 1]
+# Stefan Praszalowicz <hpicollo at worldnet.fr> and Peter Breitenlohner <peb at mppmu.mpg.de>
+# Useful information for improving this file can be found at:
+# http://software.frodo.looijaard.name/psiconv/formats/Index.html
+#------------------------------------------------------------------------------
+0 lelong 0x10000037 Psion Series 5
+>4 lelong 0x10000039 font file
+>4 lelong 0x1000003A printer driver
+>4 lelong 0x1000003B clipboard
+>4 lelong 0x10000042 multi-bitmap image
+!:mime image/x-epoc-mbm
+>4 lelong 0x1000006A application information file
+>4 lelong 0x1000006D
+>>8 lelong 0x1000007D Sketch image
+!:mime image/x-epoc-sketch
+>>8 lelong 0x1000007E voice note
+>>8 lelong 0x1000007F Word file
+!:mime application/x-epoc-word
+>>8 lelong 0x10000085 OPL program (TextEd)
+!:mime application/x-epoc-opl
+>>8 lelong 0x10000088 Sheet file
+!:mime application/x-epoc-sheet
+>>8 lelong 0x100001C4 EasyFax initialisation file
+>4 lelong 0x10000073 OPO module
+!:mime application/x-epoc-opo
+>4 lelong 0x10000074 OPL application
+!:mime application/x-epoc-app
+>4 lelong 0x1000008A exported multi-bitmap image
+
+0 lelong 0x10000041 Psion Series 5 ROM multi-bitmap image
+
+0 lelong 0x10000050 Psion Series 5
+>4 lelong 0x1000006D database
+>4 lelong 0x100000E4 ini file
+
+0 lelong 0x10000079 Psion Series 5 binary:
+>4 lelong 0x00000000 DLL
+>4 lelong 0x10000049 comms hardware library
+>4 lelong 0x1000004A comms protocol library
+>4 lelong 0x1000005D OPX
+>4 lelong 0x1000006C application
+>4 lelong 0x1000008D DLL
+>4 lelong 0x100000AC logical device driver
+>4 lelong 0x100000AD physical device driver
+>4 lelong 0x100000E5 file transfer protocol
+>4 lelong 0x100000E5 file transfer protocol
+>4 lelong 0x10000140 printer definition
+>4 lelong 0x10000141 printer definition
+
+0 lelong 0x1000007A Psion Series 5 executable
+
+#------------------------------------------------------------------------------
+# $File: erlang,v 1.5 2009/09/19 16:28:09 christos Exp $
+# erlang: file(1) magic for Erlang JAM and BEAM files
+# URL: http://www.erlang.org/faq/x779.html#AEN812
+
+# OTP R3-R4
+0 string \0177BEAM! Old Erlang BEAM file
+>6 short >0 - version %d
+
+# OTP R5 and onwards
+0 string FOR1
+>8 string BEAM Erlang BEAM file
+
+# 4.2 version may have a copyright notice!
+4 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
+79 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
+
+4 string 1.0\ Fri\ Feb\ 3\ 09:55:56\ MET\ 1995 Erlang JAM file - version 4.3
+
+#------------------------------------------------------------------------------
+# $File: esri,v 1.4 2009/09/19 16:28:09 christos Exp $
+# ESRI Shapefile format (.shp .shx .dbf=DBaseIII)
+# Based on info from
+# <URL:http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf>
+0 belong 9994 ESRI Shapefile
+>4 belong =0
+>8 belong =0
+>12 belong =0
+>16 belong =0
+>20 belong =0
+>28 lelong x version %d
+>24 belong x length %d
+>32 lelong =0 type Null Shape
+>32 lelong =1 type Point
+>32 lelong =3 type PolyLine
+>32 lelong =5 type Polygon
+>32 lelong =8 type MultiPoint
+>32 lelong =11 type PointZ
+>32 lelong =13 type PolyLineZ
+>32 lelong =15 type PolygonZ
+>32 lelong =18 type MultiPointZ
+>32 lelong =21 type PointM
+>32 lelong =23 type PolyLineM
+>32 lelong =25 type PolygonM
+>32 lelong =28 type MultiPointM
+>32 lelong =31 type MultiPatch
+
+#------------------------------------------------------------------------------
+# $File: fcs,v 1.4 2009/09/19 16:28:09 christos Exp $
+# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files
+# From Roger Leigh <roger at whinlatter.uklinux.net>
+0 string FCS1.0 Flow Cytometry Standard (FCS) data, version 1.0
+0 string FCS2.0 Flow Cytometry Standard (FCS) data, version 2.0
+0 string FCS3.0 Flow Cytometry Standard (FCS) data, version 3.0
+
+
+#------------------------------------------------------------------------------
+# $File: filesystems,v 1.55 2010/01/16 17:45:12 chl Exp $
+# filesystems: file(1) magic for different filesystems
+#
+0 string \366\366\366\366 PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774 beshort 0xdabe
+# modified by Joerg Jenderek, because original test
+# succeeds for Cabinet archive dao360.dl_ with negative blocks
+>0770 long >0 Sun disk label
+>>0 string x '%s
+>>>31 string >\0 \b%s
+>>>>63 string >\0 \b%s
+>>>>>95 string >\0 \b%s
+>>0 string x \b'
+>>0734 short >0 %d rpm,
+>>0736 short >0 %d phys cys,
+>>0740 short >0 %d alts/cyl,
+>>0746 short >0 %d interleave,
+>>0750 short >0 %d data cyls,
+>>0752 short >0 %d alt cyls,
+>>0754 short >0 %d heads/partition,
+>>0756 short >0 %d sectors/track,
+>>0764 long >0 start cyl %ld,
+>>0770 long x %ld blocks
+# Is there a boot block written 1 sector in?
+>512 belong&077777777 0600407 \b, boot block present
+# Joerg Jenderek: Smart Boot Manager backup file is 41 byte header + first sectors of disc
+# (http://btmgr.sourceforge.net/docs/user-guide-3.html)
+0 string SBMBAKUP_ Smart Boot Manager backup file
+>9 string x \b, version %-5.5s
+>>14 string =_
+>>>15 string x %-.1s
+>>>>16 string =_ \b.
+>>>>>17 string x \b%-.1s
+>>>>>>18 string =_ \b.
+>>>>>>>19 string x \b%-.1s
+>>>22 ubyte 0
+>>>>21 ubyte x \b, from drive 0x%x
+>>>22 ubyte >0
+>>>>21 string x \b, from drive %s
+
+# Joerg Jenderek
+# DOS Emulator image is 128 byte, null right padded header + harddisc image
+0 string DOSEMU\0
+>0x27E leshort 0xAA55
+#offset is 128
+>>19 ubyte 128
+>>>(19.b-1) ubyte 0x0 DOS Emulator image
+>>>>7 ulelong >0 \b, %u heads
+>>>>11 ulelong >0 \b, %d sectors/track
+>>>>15 ulelong >0 \b, %d cylinders
+
+# updated by Joerg Jenderek at Sep 2007
+# only for sector sizes with 512 or more Bytes
+0x1FE leshort 0xAA55 x86 boot sector
+# to do also for sectors < than 512 Bytes and some other files, GRR
+#30 search/481 \x55\xAA x86 boot sector
+# not for BeOS floppy 1440k, MBRs
+#(11.s-2) uleshort 0xAA55 x86 boot sector
+>2 string OSBS \b, OS/BS MBR
+# J\xf6rg Jenderek <joerg dot jenderek at web dot de>
+>0x8C string Invalid\ partition\ table \b, MS-DOS MBR
+# dr-dos with some upper-, lowercase variants
+>0x9D string Invalid\ partition\ table$
+>>181 string No\ Operating\ System$
+>>>201 string Operating\ System\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03
+>0x9D string Invalid\ partition\ table$
+>>181 string No\ operating\ system$
+>>>201 string Operating\ system\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03
+>342 string Invalid\ partition\ table$
+>>366 string No\ operating\ system$
+>>>386 string Operating\ system\ load\ error$ \b, DR-DOS MBR, version 7.01 to 7.03
+>295 string NEWLDR\0
+>>302 string Bad\ PT\ $
+>>>310 string No\ OS\ $
+>>>>317 string OS\ load\ err$
+>>>>>329 string Moved\ or\ missing\ IBMBIO.LDR\n\r
+>>>>>>358 string Press\ any\ key\ to\ continue.\n\r$
+>>>>>>>387 string Copyright\ (c)\ 1984,1998
+>>>>>>>>411 string Caldera\ Inc.\0 \b, DR-DOS MBR (IBMBIO.LDR)
+>0x10F string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>>0x1B8 ubelong >0 \b, Serial 0x%-.4x
+>0x8B string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 5.00 to 4.00.950
+>271 string Invalid\ partition\ table\0
+>>295 string Error\ loading\ operating\ system\0
+>>>326 string Missing\ operating\ system\0 \b, mbr
+#
+>139 string Invalid\ partition\ table\0
+>>163 string Error\ loading\ operating\ system\0
+>>>194 string Missing\ operating\ system\0 \b, Microsoft Windows XP mbr
+# http://www.heise.de/ct/05/09/006/ page 184
+#HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\?:=Serial4Bytes+8Bytes
+>>>>0x1B8 ulelong >0 \b,Serial 0x%-.4x
+>300 string Invalid\ partition\ table\0
+>>324 string Error\ loading\ operating\ system\0
+>>>355 string Missing\ operating\ system\0 \b, Microsoft Windows XP MBR
+#??>>>389 string Invalid\ system\ disk
+>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x
+>300 string Ung\201ltige\ Partitionstabelle
+#split string to avoid error: String too long
+>>328 string Fehler\ beim\ Laden\
+>>>346 string des\ Betriebssystems
+>>>>366 string Betriebssystem\ nicht\ vorhanden \b, Microsoft Windows XP MBR (german)
+>>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x
+#>0x145 string Default:\ F \b, FREE-DOS MBR
+#>0x14B string Default:\ F \b, FREE-DOS 1.0 MBR
+>0x145 search/7 Default:\ F \b, FREE-DOS MBR
+#>>313 string F0\ .\ .\ .
+#>>>322 string disk\ 1
+#>>>>382 string FAT3
+>64 string no\ active\ partition\ found
+>>96 string read\ error\ while\ reading\ drive \b, FREE-DOS Beta 0.9 MBR
+# Ranish Partition Manager http://www.ranish.com/part/
+>387 search/4 \0\ Error!\r
+>>378 search/7 Virus!
+>>>397 search/4 Booting\
+>>>>408 search/4 HD1/\0 \b, Ranish MBR (
+>>>>>416 string Writing\ changes... \b2.37
+>>>>>>438 ubyte x \b,0x%x dots
+>>>>>>440 ubyte >0 \b,virus check
+>>>>>>441 ubyte >0 \b,partition %c
+#2.38,2.42,2.44
+>>>>>416 string !Writing\ changes... \b
+>>>>>>418 ubyte 1 \bvirus check,
+>>>>>>419 ubyte x \b0x%x seconds
+>>>>>>420 ubyte&0x0F >0 \b,partition
+>>>>>>>420 ubyte&0x0F <5 \b %x
+>>>>>>>420 ubyte&0x0F 0Xf \b ask
+>>>>>420 ubyte x \b)
+#
+>271 string Operating\ system\ loading
+>>296 string error\r \b, SYSLINUX MBR (2.10)
+# http://www.acronis.de/
+>362 string MBR\ Error\ \0\r
+>>376 string ress\ any\ key\ to\
+>>>392 string boot\ from\ floppy...\0 \b, Acronis MBR
+# added by Joerg Jenderek
+# http://www.visopsys.org/
+# http://partitionlogic.org.uk/
+>309 string No\ bootable\ partition\ found\r
+>>339 string I/O\ Error\ reading\ boot\ sector\r \b, Visopsys MBR
+>349 string No\ bootable\ partition\ found\r
+>>379 string I/O\ Error\ reading\ boot\ sector\r \b, simple Visopsys MBR
+# bootloader, bootmanager
+>0x40 string SBML
+# label with 11 characters of FAT 12 bit filesystem
+>>43 string SMART\ BTMGR
+>>>430 string SBMK\ Bad!\r \b, Smart Boot Manager
+# OEM-ID not always "SBM"
+#>>>>3 strings SBM
+>>>>6 string >\0 \b, version %s
+>382 string XOSLLOADXCF \b, eXtended Operating System Loader
+>6 string LILO \b, LInux i386 boot LOader
+>>120 string LILO \b, version 22.3.4 SuSe
+>>172 string LILO \b, version 22.5.8 Debian
+# updated by Joerg Jenderek at Oct 2008
+# variables according to grub-0.97/stage1/stage1.S or
+# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data
+# usual values are marked with comments to get only informations of strange GRUB loaders
+>342 search/60 \0Geom\0
+#>0 ulelong x %x=0x009048EB , 0x2a9048EB 0
+>>0x41 ubyte <2
+>>>0x3E ubyte >2 \b; GRand Unified Bootloader
+# 0x3 for 0.5.95,0.93,0.94,0.96 0x4 for 1.90
+>>>>0x3E ubyte x \b, stage1 version 0x%x
+#If it is 0xFF, use a drive passed by BIOS
+>>>>0x40 ubyte <0xFF \b, boot drive 0x%x
+# in most case 0,1,0x2e for GRUB 0.5.95
+>>>>0x41 ubyte >0 \b, LBA flag 0x%x
+>>>>0x42 uleshort <0x8000 \b, stage2 address 0x%x
+#>>>>0x42 uleshort =0x8000 \b, stage2 address 0x%x (usual)
+>>>>0x42 uleshort >0x8000 \b, stage2 address 0x%x
+#>>>>0x44 ulelong =1 \b, 1st sector stage2 0x%x (default)
+>>>>0x44 ulelong >1 \b, 1st sector stage2 0x%x
+>>>>0x48 uleshort <0x800 \b, stage2 segment 0x%x
+#>>>>0x48 uleshort =0x800 \b, stage2 segment 0x%x (usual)
+>>>>0x48 uleshort >0x800 \b, stage2 segment 0x%x
+>>>>402 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>394 string stage1 \b, GRUB version 0.5.95
+>>>>382 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>376 string GRUB\ \0 \b, GRUB version 0.93 or 1.94
+>>>>383 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>377 string GRUB\ \0 \b, GRUB version 0.94
+>>>>385 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>379 string GRUB\ \0 \b, GRUB version 0.95 or 0.96
+>>>>391 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>385 string GRUB\ \0 \b, GRUB version 0.97
+#unkown version
+>>>343 string Geom\0Read\0\ Error\0
+>>>>321 string Loading\ stage1.5 \b, GRUB version x.y
+>>>380 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>374 string GRUB\ \0 \b, GRUB version n.m
+# http://syslinux.zytor.com/
+>478 string Boot\ failed\r
+>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (1.62)
+>480 string Boot\ failed\r
+>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (2.06 or 2.11)
+>484 string Boot\ error\r \b, SYSLINUX bootloader (3.11)
+>395 string chksum\0\ ERROR!\0 \b, Gujin bootloader
+# http://www.bcdwb.de/bcdw/index_e.htm
+>3 string BCDL
+>>498 string BCDL\ \ \ \ BIN \b, Bootable CD Loader (1.50Z)
+# mbr partition table entries
+# OEM-ID does not contain MicroSoft,NEWLDR,DOS,SYSLINUX,or MTOOLs
+>3 string !MS
+>>3 string !SYSLINUX
+>>>3 string !MTOOL
+>>>>3 string !NEWLDR
+>>>>>5 string !DOS
+# not FAT (32 bit)
+>>>>>>82 string !FAT32
+#not Linux kernel
+>>>>>>>514 string !HdrS
+#not BeOS
+>>>>>>>>422 string !Be\ Boot\ Loader
+# active flag 0 or 0x80 and type > 0
+>>>>>>>>>446 ubyte <0x81
+>>>>>>>>>>446 ubyte&0x7F 0
+>>>>>>>>>>>450 ubyte >0 \b; partition 1: ID=0x%x
+>>>>>>>>>>>>446 ubyte 0x80 \b, active
+>>>>>>>>>>>>447 ubyte x \b, starthead %u
+#>>>>>>>>>>>>448 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>448 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>454 ulelong x \b, startsector %u
+>>>>>>>>>>>>458 ulelong x \b, %u sectors
+#
+>>>>>>>>>462 ubyte <0x81
+>>>>>>>>>>462 ubyte&0x7F 0
+>>>>>>>>>>>466 ubyte >0 \b; partition 2: ID=0x%x
+>>>>>>>>>>>>462 ubyte 0x80 \b, active
+>>>>>>>>>>>>463 ubyte x \b, starthead %u
+#>>>>>>>>>>>>464 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>464 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>470 ulelong x \b, startsector %u
+>>>>>>>>>>>>474 ulelong x \b, %u sectors
+#
+>>>>>>>>>478 ubyte <0x81
+>>>>>>>>>>478 ubyte&0x7F 0
+>>>>>>>>>>>482 ubyte >0 \b; partition 3: ID=0x%x
+>>>>>>>>>>>>478 ubyte 0x80 \b, active
+>>>>>>>>>>>>479 ubyte x \b, starthead %u
+#>>>>>>>>>>>>480 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>481 ubyte x \b, start C2S: 0x%x
+#>>>>>>>>>>>>480 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>486 ulelong x \b, startsector %u
+>>>>>>>>>>>>490 ulelong x \b, %u sectors
+#
+>>>>>>>>>494 ubyte <0x81
+>>>>>>>>>>494 ubyte&0x7F 0
+>>>>>>>>>>>498 ubyte >0 \b; partition 4: ID=0x%x
+>>>>>>>>>>>>494 ubyte 0x80 \b, active
+>>>>>>>>>>>>495 ubyte x \b, starthead %u
+#>>>>>>>>>>>>496 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>496 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>502 ulelong x \b, startsector %u
+>>>>>>>>>>>>506 ulelong x \b, %u sectors
+# mbr partition table entries end
+# http://www.acronis.de/
+#FAT label=ACRONIS\ SZ
+#OEM-ID=BOOTWIZ0
+>442 string Non-system\ disk,\
+>>459 string press\ any\ key...\x7\0 \b, Acronis Startup Recovery Loader
+# DOS names like F11.SYS are 8 right space padded bytes+3 bytes
+>>>477 ubyte&0xDF >0
+>>>>477 string x \b %-.3s
+>>>>>480 ubyte&0xDF >0
+>>>>>>480 string x \b%-.5s
+>>>>485 ubyte&0xDF >0
+>>>>>485 string x \b.%-.3s
+#
+>185 string FDBOOT\ Version\
+>>204 string \rNo\ Systemdisk.\
+>>>220 string Booting\ from\ harddisk.\n\r
+>>>245 string Cannot\ load\ from\ harddisk.\n\r
+>>>>273 string Insert\ Systemdisk\
+>>>>>291 string and\ press\ any\ key.\n\r \b, FDBOOT harddisk Bootloader
+>>>>>>200 string >\0 \b, version %-3s
+>242 string Bootsector\ from\ C.H.\ Hochst\204
+>>278 string No\ Systemdisk.\
+>>>293 string Booting\ from\ harddisk.\n\r
+>>>441 string Cannot\ load\ from\ harddisk.\n\r
+>>>>469 string Insert\ Systemdisk\
+>>>>>487 string and\ press\ any\ key.\n\r \b, WinImage harddisk Bootloader
+>>>>>>209 string >\0 \b, version %-4.4s
+>(1.b+2) ubyte 0xe
+>>(1.b+3) ubyte 0x1f
+>>>(1.b+4) ubyte 0xbe
+>>>>(1.b+5) ubyte 0x77
+>>>>(1.b+6) ubyte 0x7c
+>>>>>(1.b+7) ubyte 0xac
+>>>>>>(1.b+8) ubyte 0x22
+>>>>>>>(1.b+9) ubyte 0xc0
+>>>>>>>>(1.b+10) ubyte 0x74
+>>>>>>>>>(1.b+11) ubyte 0xb
+>>>>>>>>>>(1.b+12) ubyte 0x56
+>>>>>>>>>>(1.b+13) ubyte 0xb4 \b, mkdosfs boot message display
+>214 string Please\ try\ to\ install\ FreeDOS\ \b, DOS Emulator boot message display
+#>>244 string from\ dosemu-freedos-*-bin.tgz\r
+#>>>170 string Sorry,\ could\ not\ load\ an\
+#>>>>195 string operating\ system.\r\n
+#
+>103 string This\ is\ not\ a\ bootable\ disk.\
+>>132 string Please\ insert\ a\ bootable\
+>>>157 string floppy\ and\r\n
+>>>>169 string press\ any\ key\ to\ try\ again...\r \b, FREE-DOS message display
+#
+>66 string Solaris\ Boot\ Sector
+>>99 string Incomplete\ MDBoot\ load.
+>>>89 string Version \b, Sun Solaris Bootloader
+>>>>97 byte x version %c
+#
+>408 string OS/2\ !!\ SYS01475\r\0
+>>429 string OS/2\ !!\ SYS02025\r\0
+>>>450 string OS/2\ !!\ SYS02027\r\0
+>>>469 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp bootloader
+#
+>409 string OS/2\ !!\ SYS01475\r\0
+>>430 string OS/2\ !!\ SYS02025\r\0
+>>>451 string OS/2\ !!\ SYS02027\r\0
+>>>470 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp Bootloader
+>112 string This\ disk\ is\ not\ bootable\r
+>>142 string If\ you\ wish\ to\ make\ it\ bootable
+>>>176 string run\ the\ DOS\ program\ SYS\
+>>>200 string after\ the\r
+>>>>216 string system\ has\ been\ loaded\r\n
+>>>>>242 string Please\ insert\ a\ DOS\ diskette\
+>>>>>271 string into\r\n\ the\ drive\ and\
+>>>>>>292 string strike\ any\ key...\0 \b, IBM OS/2 Warp message display
+# XP
+>430 string NTLDR\ is\ missing\xFF\r\n
+>>449 string Disk\ error\xFF\r\n
+>>>462 string Press\ any\ key\ to\ restart\r \b, Microsoft Windows XP Bootloader
+# DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+#
+>430 string NTLDR\ nicht\ gefunden\xFF\r\n
+>>453 string Datentr\204gerfehler\xFF\r\n
+>>>473 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (german)
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+# offset variant
+>>>>379 string \0
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+#
+>430 string NTLDR\ fehlt\xFF\r\n
+>>444 string Datentr\204gerfehler\xFF\r\n
+>>>464 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (2.german)
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+# variant
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+#
+>430 string NTLDR\ fehlt\xFF\r\n
+>>444 string Medienfehler\xFF\r\n
+>>>459 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (3.german)
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+# variant
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+>430 string Datentr\204ger\ entfernen\xFF\r\n
+>>454 string Medienfehler\xFF\r\n
+>>>469 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (4.german)
+>>>>379 string \0
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+# variant
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+
+#>3 string NTFS\ \ \ \
+>389 string Fehler\ beim\ Lesen\
+>>407 string des\ Datentr\204gers
+>>>426 string NTLDR\ fehlt
+>>>>440 string NTLDR\ ist\ komprimiert
+>>>>>464 string Neustart\ mit\ Strg+Alt+Entf\r \b, Microsoft Windows XP Bootloader NTFS (german)
+#>3 string NTFS\ \ \ \
+>313 string A\ disk\ read\ error\ occurred.\r
+>>345 string A\ kernel\ file\ is\ missing\
+>>>370 string from\ the\ disk.\r
+>>>>484 string NTLDR\ is\ compressed
+>>>>>429 string Insert\ a\ system\ diskette\
+>>>>>>454 string and\ restart\r\nthe\ system.\r \b, Microsoft Windows XP Bootloader NTFS
+# DOS loader variants different languages,offsets
+>472 ubyte&0xDF >0
+>>389 string Invalid\ system\ disk\xFF\r\n
+>>>411 string Disk\ I/O\ error
+>>>>428 string Replace\ the\ disk,\ and\
+>>>>>455 string press\ any\ key \b, Microsoft Windows 98 Bootloader
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.5s
+>>>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>>>479 string x \b%-.1s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>390 string Invalid\ system\ disk\xFF\r\n
+>>>412 string Disk\ I/O\ error\xFF\r\n
+>>>>429 string Replace\ the\ disk,\ and\
+>>>>>451 string then\ press\ any\ key\r \b, Microsoft Windows 98 Bootloader
+>>388 string Ungueltiges\ System\ \xFF\r\n
+>>>410 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>427 string Datentraeger\ wechseln\ und\
+>>>>>453 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (german)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497 ubyte&0xDF >0
+>>>>>>>497 string x %-.5s
+>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>505 ubyte&0xDF >0
+>>>>>>>505 string x \b.%-.3s
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0 or
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.5s
+>>>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>>>479 string x \b%-.1s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>390 string Ungueltiges\ System\ \xFF\r\n
+>>>412 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>429 string Datentraeger\ wechseln\ und\
+>>>>>455 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (German)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497 ubyte&0xDF >0
+>>>>>>>497 string x %-.7s
+>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>504 string x \b%-.1s
+>>>>>>505 ubyte&0xDF >0
+>>>>>>>505 string x \b.%-.3s
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0 or
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.6s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>389 string Ungueltiges\ System\ \xFF\r\n
+>>>411 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>428 string Datentraeger\ wechseln\ und\
+>>>>>454 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (GERMAN)
+# DOS names like IO.SYS,WINBOOT.SYS,MSDOS.SYS,WINBOOT.INI are 8 right space padded bytes+3 bytes
+>>>>>>472 string x %-.2s
+>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>474 string x \b%-.5s
+>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>479 string x \b%-.1s
+>>>>>>480 ubyte&0xDF >0
+>>>>>>>480 string x \b.%-.3s
+>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>483 string x \b%-.5s
+>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>488 string x \b%-.2s
+>>>>>>>>490 ubyte&0xDF >0
+>>>>>>>>>490 string x \b%-.1s
+>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>491 string x \b.%-.3s
+>479 ubyte&0xDF >0
+>>416 string Kein\ System\ oder\
+>>>433 string Laufwerksfehler
+>>>>450 string Wechseln\ und\ Taste\ dr\201cken \b, Microsoft DOS Bootloader (german)
+#IO.SYS
+>>>>>479 string x \b %-.2s
+>>>>>>481 ubyte&0xDF >0
+>>>>>>>481 string x \b%-.6s
+>>>>>487 ubyte&0xDF >0
+>>>>>>487 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>490 ubyte&0xDF >0 \b+
+>>>>>>>490 string x \b%-.5s
+>>>>>>>>495 ubyte&0xDF >0
+>>>>>>>>>495 string x \b%-.3s
+>>>>>>>498 ubyte&0xDF >0
+>>>>>>>>498 string x \b.%-.3s
+#
+>376 search/41 Non-System\ disk\ or\
+>>395 search/41 disk\ error\r
+>>>407 search/41 Replace\ and\
+>>>>419 search/41 press\ \b,
+>>>>419 search/41 strike\ \b, old
+>>>>426 search/41 any\ key\ when\ ready\r MS or PC-DOS bootloader
+#449 Disk\ Boot\ failure\r MS 3.21
+#466 Boot\ Failure\r MS 3.30
+>>>>>468 search/18 \0
+#IO.SYS,IBMBIO.COM
+>>>>>>&0 string x \b %-.2s
+>>>>>>>&-20 ubyte&0xDF >0
+>>>>>>>>&-1 string x \b%-.4s
+>>>>>>>>>&-16 ubyte&0xDF >0
+>>>>>>>>>>&-1 string x \b%-.2s
+>>>>>>&8 ubyte&0xDF >0 \b.
+>>>>>>>&-1 string x \b%-.3s
+#MSDOS.SYS,IBMDOS.COM
+>>>>>>&11 ubyte&0xDF >0 \b+
+>>>>>>>&-1 string x \b%-.5s
+>>>>>>>>&-6 ubyte&0xDF >0
+>>>>>>>>>&-1 string x \b%-.1s
+>>>>>>>>>>&-5 ubyte&0xDF >0
+>>>>>>>>>>>&-1 string x \b%-.2s
+>>>>>>>&7 ubyte&0xDF >0 \b.
+>>>>>>>>&-1 string x \b%-.3s
+>441 string Cannot\ load\ from\ harddisk.\n\r
+>>469 string Insert\ Systemdisk\
+>>>487 string and\ press\ any\ key.\n\r \b, MS (2.11) DOS bootloader
+#>43 string \224R-LOADER\ \ SYS =label
+>54 string SYS
+>>324 string VASKK
+>>>495 string NEWLDR\0 \b, DR-DOS Bootloader (LOADER.SYS)
+#
+>98 string Press\ a\ key\ to\ retry\0\r
+>>120 string Cannot\ find\ file\ \0\r
+>>>139 string Disk\ read\ error\0\r
+>>>>156 string Loading\ ...\0 \b, DR-DOS (3.41) Bootloader
+#DRBIOS.SYS
+>>>>>44 ubyte&0xDF >0
+>>>>>>44 string x \b %-.6s
+>>>>>>>50 ubyte&0xDF >0
+>>>>>>>>50 string x \b%-.2s
+>>>>>>52 ubyte&0xDF >0
+>>>>>>>52 string x \b.%-.3s
+#
+>70 string IBMBIO\ \ COM
+>>472 string Cannot\ load\ DOS!\
+>>>489 string Any\ key\ to\ retry \b, DR-DOS Bootloader
+>>471 string Cannot\ load\ DOS\
+>>487 string press\ key\ to\ retry \b, Open-DOS Bootloader
+#??
+>444 string KERNEL\ \ SYS
+>>314 string BOOT\ error! \b, FREE-DOS Bootloader
+>499 string KERNEL\ \ SYS
+>>305 string BOOT\ err!\0 \b, Free-DOS Bootloader
+>449 string KERNEL\ \ SYS
+>>319 string BOOT\ error! \b, FREE-DOS 0.5 Bootloader
+#
+>449 string Loading\ FreeDOS
+>>0x1AF ulelong >0 \b, FREE-DOS 0.95,1.0 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+#
+>331 string Error!.0 \b, FREE-DOS 1.0 bootloader
+#
+>125 string Loading\ FreeDOS...\r
+>>311 string BOOT\ error!\r \b, FREE-DOS bootloader
+>>>441 ubyte&0xDF >0
+>>>>441 string x \b %-.6s
+>>>>>447 ubyte&0xDF >0
+>>>>>>447 string x \b%-.1s
+>>>>>>>448 ubyte&0xDF >0
+>>>>>>>>448 string x \b%-.1s
+>>>>449 ubyte&0xDF >0
+>>>>>449 string x \b.%-.3s
+>124 string FreeDOS\0
+>>331 string \ err\0 \b, FREE-DOS BETa 0.9 Bootloader
+# DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>>333 string \ err\0 \b, FREE-DOS BEta 0.9 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>>334 string \ err\0 \b, FREE-DOS Beta 0.9 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>336 string Error!\
+>>343 string Hit\ a\ key\ to\ reboot. \b, FREE-DOS Beta 0.9sr1 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+# added by Joerg Jenderek
+# http://www.visopsys.org/
+# http://partitionlogic.org.uk/
+# OEM-ID=Visopsys
+>478 ulelong 0
+>>(1.b+326) string I/O\ Error\ reading\
+>>>(1.b+344) string Visopsys\ loader\r
+>>>>(1.b+361) string Press\ any\ key\ to\ continue.\r \b, Visopsys loader
+# http://alexfru.chat.ru/epm.html#bootprog
+>494 ubyte >0x4D
+>>495 string >E
+>>>495 string <S
+#OEM-ID is not reliable
+>>>>3 string BootProg
+# It just looks for a program file name at the root directory
+# and loads corresponding file with following execution.
+# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes
+>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader
+>>>>>499 string x \b %-.1s
+>>>>>>500 ubyte&0xDF >0
+>>>>>>>500 string x \b%-.1s
+>>>>>>>>501 ubyte&0xDF >0
+>>>>>>>>>501 string x \b%-.1s
+>>>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>>>>>>>>>>>505 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>505 string x \b%-.1s
+>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s
+#name extension
+>>>>>507 ubyte&0xDF >0 \b.
+>>>>>>507 string x \b%-.1s
+>>>>>>>508 ubyte&0xDF >0
+>>>>>>>>508 string x \b%-.1s
+>>>>>>>>>509 ubyte&0xDF >0
+>>>>>>>>>>509 string x \b%-.1s
+#If the boot sector fails to read any other sector,
+#it prints a very short message ("RE") to the screen and hangs the computer.
+#If the boot sector fails to find needed program in the root directory,
+#it also hangs with another message ("NF").
+>>>>>492 string RENF \b, FAT (12 bit)
+>>>>>495 string RENF \b, FAT (16 bit)
+# http://alexfru.chat.ru/epm.html#bootprog
+>494 ubyte >0x4D
+>>495 string >E
+>>>495 string <S
+#OEM-ID is not reliable
+>>>>3 string BootProg
+# It just looks for a program file name at the root directory
+# and loads corresponding file with following execution.
+# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes
+>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader
+>>>>>499 string x \b %-.1s
+>>>>>>500 ubyte&0xDF >0
+>>>>>>>500 string x \b%-.1s
+>>>>>>>>501 ubyte&0xDF >0
+>>>>>>>>>501 string x \b%-.1s
+>>>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>>>>>>>>>>>505 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>505 string x \b%-.1s
+>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s
+#name extension
+>>>>>507 ubyte&0xDF >0 \b.
+>>>>>>507 string x \b%-.1s
+>>>>>>>508 ubyte&0xDF >0
+>>>>>>>>508 string x \b%-.1s
+>>>>>>>>>509 ubyte&0xDF >0
+>>>>>>>>>>509 string x \b%-.1s
+#If the boot sector fails to read any other sector,
+#it prints a very short message ("RE") to the screen and hangs the computer.
+#If the boot sector fails to find needed program in the root directory,
+#it also hangs with another message ("NF").
+>>>>>492 string RENF \b, FAT (12 bit)
+>>>>>495 string RENF \b, FAT (16 bit)
+# x86 bootloader end
+# updated by Joerg Jenderek at Sep 2007
+>3 ubyte 0
+#no active flag
+>>446 ubyte 0
+# partition 1 not empty
+>>>450 ubyte >0
+# partitions 3,4 empty
+>>>>482 ubyte 0
+>>>>>498 ubyte 0
+# partition 2 ID=0,5,15
+>>>>>>466 ubyte <0x10
+>>>>>>>466 ubyte 0x05 \b, extended partition table
+>>>>>>>466 ubyte 0x0F \b, extended partition table (LBA)
+>>>>>>>466 ubyte 0x0 \b, extended partition table (last)
+# JuMP short bootcodeoffset NOP assembler instructions will usually be EB xx 90
+# http://mirror.href.com/thestarman/asm/2bytejumps.htmm#FWD
+# older drives may use Near JuMP instruction E9 xx xx
+>0 lelong&0x009000EB 0x009000EB
+>0 lelong&0x000000E9 0x000000E9
+# minimal short forward jump found 03cx??
+# maximal short forward jump is 07fx
+>1 ubyte <0xff \b, code offset 0x%x
+# mtools-3.9.8/msdos.h
+# usual values are marked with comments to get only informations of strange FAT systems
+# valid sectorsize must be a power of 2 from 32 to 32768
+>>11 uleshort&0x000f x
+>>>11 uleshort <32769
+>>>>11 uleshort >31
+>>>>>21 ubyte&0xf0 0xF0
+>>>>>>3 string >\0 \b, OEM-ID "%8.8s"
+#http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC
+>>>>>>>8 string IHC \b cached by Windows 9M
+>>>>>>11 uleshort >512 \b, Bytes/sector %u
+#>>>>>>11 uleshort =512 \b, Bytes/sector %u=512 (usual)
+>>>>>>11 uleshort <512 \b, Bytes/sector %u
+>>>>>>13 ubyte >1 \b, sectors/cluster %u
+#>>>>>>13 ubyte =1 \b, sectors/cluster %u (usual on Floppies)
+>>>>>>14 uleshort >32 \b, reserved sectors %u
+#>>>>>>14 uleshort =32 \b, reserved sectors %u (usual Fat32)
+#>>>>>>14 uleshort >1 \b, reserved sectors %u
+#>>>>>>14 uleshort =1 \b, reserved sectors %u (usual FAT12,FAT16)
+>>>>>>14 uleshort <1 \b, reserved sectors %u
+>>>>>>16 ubyte >2 \b, FATs %u
+#>>>>>>16 ubyte =2 \b, FATs %u (usual)
+>>>>>>16 ubyte =1 \b, FAT %u
+>>>>>>16 ubyte >0
+>>>>>>17 uleshort >0 \b, root entries %u
+#>>>>>>17 uleshort =0 \b, root entries %u=0 (usual Fat32)
+>>>>>>19 uleshort >0 \b, sectors %u (volumes <=32 MB)
+#>>>>>>19 uleshort =0 \b, sectors %u=0 (usual Fat32)
+>>>>>>21 ubyte >0xF0 \b, Media descriptor 0x%x
+#>>>>>>21 ubyte =0xF0 \b, Media descriptor 0x%x (usual floppy)
+>>>>>>21 ubyte <0xF0 \b, Media descriptor 0x%x
+>>>>>>22 uleshort >0 \b, sectors/FAT %u
+#>>>>>>22 uleshort =0 \b, sectors/FAT %u=0 (usual Fat32)
+>>>>>>26 ubyte >2 \b, heads %u
+#>>>>>>26 ubyte =2 \b, heads %u (usual floppy)
+>>>>>>26 ubyte =1 \b, heads %u
+#skip for Digital Research DOS (version 3.41) 1440 kB Bootdisk
+>>>>>>38 ubyte !0x70
+>>>>>>>28 ulelong >0 \b, hidden sectors %u
+#>>>>>>>28 ulelong =0 \b, hidden sectors %u (usual floppy)
+>>>>>>>32 ulelong >0 \b, sectors %u (volumes > 32 MB)
+#>>>>>>>32 ulelong =0 \b, sectors %u (volumes > 32 MB)
+# FAT<32 specific
+>>>>>>82 string !FAT32
+#>>>>>>>36 ubyte 0x80 \b, physical drive 0x%x=0x80 (usual harddisk)
+#>>>>>>>36 ubyte 0 \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>>36 ubyte !0x80
+>>>>>>>>36 ubyte !0 \b, physical drive 0x%x
+>>>>>>>37 ubyte >0 \b, reserved 0x%x
+#>>>>>>>37 ubyte =0 \b, reserved 0x%x
+>>>>>>>38 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>38 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>38 ubyte =0x29
+>>>>>>>>39 ulelong x \b, serial number 0x%x
+>>>>>>>>43 string <NO\ NAME \b, label: "%11.11s"
+>>>>>>>>43 string >NO\ NAME \b, label: "%11.11s"
+>>>>>>>>43 string =NO\ NAME \b, unlabeled
+>>>>>>>54 string FAT \b, FAT
+>>>>>>>>54 string FAT12 \b (12 bit)
+>>>>>>>>54 string FAT16 \b (16 bit)
+# FAT32 specific
+>>>>>>82 string FAT32 \b, FAT (32 bit)
+>>>>>>>36 ulelong x \b, sectors/FAT %u
+>>>>>>>40 uleshort >0 \b, extension flags %u
+#>>>>>>>40 uleshort =0 \b, extension flags %u
+>>>>>>>42 uleshort >0 \b, fsVersion %u
+#>>>>>>>42 uleshort =0 \b, fsVersion %u (usual)
+>>>>>>>44 ulelong >2 \b, rootdir cluster %u
+#>>>>>>>44 ulelong =2 \b, rootdir cluster %u
+#>>>>>>>44 ulelong =1 \b, rootdir cluster %u
+>>>>>>>48 uleshort >1 \b, infoSector %u
+#>>>>>>>48 uleshort =1 \b, infoSector %u (usual)
+>>>>>>>48 uleshort <1 \b, infoSector %u
+>>>>>>>50 uleshort >6 \b, Backup boot sector %u
+#>>>>>>>50 uleshort =6 \b, Backup boot sector %u (usual)
+>>>>>>>50 uleshort <6 \b, Backup boot sector %u
+>>>>>>>54 ulelong >0 \b, reserved1 0x%x
+>>>>>>>58 ulelong >0 \b, reserved2 0x%x
+>>>>>>>62 ulelong >0 \b, reserved3 0x%x
+# same structure as FAT1X
+>>>>>>>64 ubyte >0x80 \b, physical drive 0x%x
+#>>>>>>>64 ubyte =0x80 \b, physical drive 0x%x=80 (usual harddisk)
+>>>>>>>64 ubyte&0x7F >0 \b, physical drive 0x%x
+#>>>>>>>64 ubyte =0 \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>>65 ubyte >0 \b, reserved 0x%x
+>>>>>>>66 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>66 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>66 ubyte =0x29
+>>>>>>>>67 ulelong x \b, serial number 0x%x
+>>>>>>>>71 string <NO\ NAME \b, label: "%11.11s"
+>>>>>>>71 string >NO\ NAME \b, label: "%11.11s"
+>>>>>>>71 string =NO\ NAME \b, unlabeled
+### FATs end
+>0x200 lelong 0x82564557 \b, BSD disklabel
+# FATX
+0 string FATX FATX filesystem data
+
+
+# Minix filesystems - Juan Cespedes <cespedes at debian.org>
+0x410 leshort 0x137f
+!:strength / 2
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V1, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x137f
+!:strength / 2
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V1 (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x138f
+!:strength / 2
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V1, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x138f
+!:strength / 2
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V1, 30 char names (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x2468
+>0x402 beshort < 100
+>>0x402 beshort > -1 Minix filesystem, V2, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x2468
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V2 (big endian), %d zones
+>0x1e string minix \b, bootable
+
+0x410 leshort 0x2478
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V2, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x2478
+>0x402 beshort < 100
+>0x402 beshort > -1 Minix filesystem, V2, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x2478
+>0x402 beshort !0 Minix filesystem, V2, 30 char names (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x4d5a
+>0x402 beshort !0 Minix filesystem, V3, %d zones
+>0x1e string minix \b, bootable
+
+# romfs filesystems - Juan Cespedes <cespedes at debian.org>
+0 string -rom1fs- romfs filesystem, version 1
+>8 belong x %d bytes,
+>16 string x named %s.
+
+# netboot image - Juan Cespedes <cespedes at debian.org>
+0 lelong 0x1b031336L Netboot image,
+>4 lelong&0xFFFFFF00 0
+>>4 lelong&0x100 0x000 mode 2
+>>4 lelong&0x100 0x100 mode 3
+>4 lelong&0xFFFFFF00 !0 unknown mode
+
+0x18b string OS/2 OS/2 Boot Manager
+
+# updated by Joerg Jenderek at Oct 2008!!
+# http://syslinux.zytor.com/iso.php
+0 ulelong 0x7c40eafa isolinux Loader
+# http://syslinux.zytor.com/pxe.php
+0 ulelong 0x007c05ea pxelinux Loader
+0 ulelong 0x60669c66 pxelinux Loader
+
+# added by Joerg Jenderek
+# In the second sector (+0x200) are variables according to grub-0.97/stage2/asm.S or
+# grub-1.94/kern/i386/pc/startup.S
+# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data
+# usual values are marked with comments to get only informations of strange GRUB loaders
+0x200 uleshort 0x70EA
+# found only version 3.{1,2}
+>0x206 ubeshort >0x0300
+# GRUB version (0.5.)95,0.93,0.94,0.96,0.97 > "00"
+>>0x212 ubyte >0x29
+>>>0x213 ubyte >0x29
+# not iso9660_stage1_5
+#>>>0 ulelong&0x00BE5652 0x00BE5652
+>>>>0x213 ubyte >0x29 GRand Unified Bootloader
+# config_file for stage1_5 is 0xffffffff + default "/boot/grub/stage2"
+>>>>0x217 ubyte 0xFF stage1_5
+>>>>0x217 ubyte <0xFF stage2
+>>>>0x206 ubyte x \b version %u
+>>>>0x207 ubyte x \b.%u
+# module_size for 1.94
+>>>>0x208 ulelong <0xffffff \b, installed partition %u
+#>>>>0x208 ulelong =0xffffff \b, %u (default)
+>>>>0x208 ulelong >0xffffff \b, installed partition %u
+# GRUB 0.5.95 unofficial
+>>>>0x20C ulelong&0x2E300000 0x2E300000
+# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs
+>>>>>0x20C ubyte x \b, identifier 0x%x
+#>>>>>0x20D ubyte =0 \b, LBA flag 0x%x (default)
+>>>>>0x20D ubyte >0 \b, LBA flag 0x%x
+# GRUB version as string
+>>>>>0x20E string >\0 \b, GRUB version %-s
+# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
+>>>>>>0x215 ulong 0xffffffff
+>>>>>>>0x219 string >\0 \b, configuration file %-s
+>>>>>>0x215 ulong !0xffffffff
+>>>>>>>0x215 string >\0 \b, configuration file %-s
+# newer GRUB versions
+>>>>0x20C ulelong&0x2E300000 !0x2E300000
+##>>>>>0x20C ulelong =0 \b, saved entry %d (usual)
+>>>>>0x20C ulelong >0 \b, saved entry %d
+# for 1.94 contains kernel image size
+# for 0.93,0.94,0.96,0.97
+# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs 6=vstafs 7=jfs 8=xfs 9=iso9660 a=ufs2
+>>>>>0x210 ubyte x \b, identifier 0x%x
+# The flag for LBA forcing is in most cases 0
+#>>>>>0x211 ubyte =0 \b, LBA flag 0x%x (default)
+>>>>>0x211 ubyte >0 \b, LBA flag 0x%x
+# GRUB version as string
+>>>>>0x212 string >\0 \b, GRUB version %-s
+# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
+>>>>>0x217 ulong 0xffffffff
+>>>>>>0x21b string >\0 \b, configuration file %-s
+>>>>>0x217 ulong !0xffffffff
+>>>>>>0x217 string >\0 \b, configuration file %-s
+
+9564 lelong 0x00011954 Unix Fast File system [v1] (little-endian),
+>8404 string x last mounted on %s,
+#>9504 ledate x last checked at %s,
+>8224 ledate x last written at %s,
+>8401 byte x clean flag %d,
+>8228 lelong x number of blocks %d,
+>8232 lelong x number of data blocks %d,
+>8236 lelong x number of cylinder groups %d,
+>8240 lelong x block size %d,
+>8244 lelong x fragment size %d,
+>8252 lelong x minimum percentage of free blocks %d,
+>8256 lelong x rotational delay %dms,
+>8260 lelong x disk rotational speed %drps,
+>8320 lelong 0 TIME optimization
+>8320 lelong 1 SPACE optimization
+
+42332 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 leqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 lequad x number of blocks %lld,
+>&-288 lequad x number of data blocks %lld,
+>&-1332 lelong x number of cylinder groups %d,
+>&-1328 lelong x block size %d,
+>&-1324 lelong x fragment size %d,
+>&-180 lelong x average file size %d,
+>&-176 lelong x average number of files in dir %d,
+>&-272 lequad x pending blocks to free %lld,
+>&-264 lelong x pending inodes to free %ld,
+>&-664 lequad x system-wide uuid %0llx,
+>&-1316 lelong x minimum percentage of free blocks %d,
+>&-1248 lelong 0 TIME optimization
+>&-1248 lelong 1 SPACE optimization
+
+66908 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 leqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 lequad x number of blocks %lld,
+>&-288 lequad x number of data blocks %lld,
+>&-1332 lelong x number of cylinder groups %d,
+>&-1328 lelong x block size %d,
+>&-1324 lelong x fragment size %d,
+>&-180 lelong x average file size %d,
+>&-176 lelong x average number of files in dir %d,
+>&-272 lequad x pending blocks to free %lld,
+>&-264 lelong x pending inodes to free %ld,
+>&-664 lequad x system-wide uuid %0llx,
+>&-1316 lelong x minimum percentage of free blocks %d,
+>&-1248 lelong 0 TIME optimization
+>&-1248 lelong 1 SPACE optimization
+
+9564 belong 0x00011954 Unix Fast File system [v1] (big-endian),
+>7168 belong 0x4c41424c Apple UFS Volume
+>>7186 string x named %s,
+>>7176 belong x volume label version %d,
+>>7180 bedate x created on %s,
+>8404 string x last mounted on %s,
+#>9504 bedate x last checked at %s,
+>8224 bedate x last written at %s,
+>8401 byte x clean flag %d,
+>8228 belong x number of blocks %d,
+>8232 belong x number of data blocks %d,
+>8236 belong x number of cylinder groups %d,
+>8240 belong x block size %d,
+>8244 belong x fragment size %d,
+>8252 belong x minimum percentage of free blocks %d,
+>8256 belong x rotational delay %dms,
+>8260 belong x disk rotational speed %drps,
+>8320 belong 0 TIME optimization
+>8320 belong 1 SPACE optimization
+
+42332 belong 0x19540119 Unix Fast File system [v2] (big-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 beqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 bequad x number of blocks %lld,
+>&-288 bequad x number of data blocks %lld,
+>&-1332 belong x number of cylinder groups %d,
+>&-1328 belong x block size %d,
+>&-1324 belong x fragment size %d,
+>&-180 belong x average file size %d,
+>&-176 belong x average number of files in dir %d,
+>&-272 bequad x pending blocks to free %lld,
+>&-264 belong x pending inodes to free %ld,
+>&-664 bequad x system-wide uuid %0llx,
+>&-1316 belong x minimum percentage of free blocks %d,
+>&-1248 belong 0 TIME optimization
+>&-1248 belong 1 SPACE optimization
+
+66908 belong 0x19540119 Unix Fast File system [v2] (big-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 beqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 bequad x number of blocks %lld,
+>&-288 bequad x number of data blocks %lld,
+>&-1332 belong x number of cylinder groups %d,
+>&-1328 belong x block size %d,
+>&-1324 belong x fragment size %d,
+>&-180 belong x average file size %d,
+>&-176 belong x average number of files in dir %d,
+>&-272 bequad x pending blocks to free %lld,
+>&-264 belong x pending inodes to free %ld,
+>&-664 bequad x system-wide uuid %0llx,
+>&-1316 belong x minimum percentage of free blocks %d,
+>&-1248 belong 0 TIME optimization
+>&-1248 belong 1 SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger at dilger.ca>
+# ext4 filesystem - Eric Sandeen <sandeen at sandeen.net>
+0x438 leshort 0xEF53 Linux
+>0x44c lelong x rev %d
+>0x43e leshort x \b.%d
+# No journal? ext2
+>0x45c lelong ^0x0000004 ext2 filesystem data
+>>0x43a leshort ^0x0000001 (mounted or unclean)
+# Has a journal? ext3 or ext4
+>0x45c lelong &0x0000004
+# and small INCOMPAT?
+>>0x460 lelong <0x0000040
+# and small RO_COMPAT?
+>>>0x464 lelong <0x0000008 ext3 filesystem data
+# else large RO_COMPAT?
+>>>0x464 lelong >0x0000007 ext4 filesystem data
+# else large INCOMPAT?
+>>0x460 lelong >0x000003f ext4 filesystem data
+# General flags for any ext* fs
+>0x460 lelong &0x0000004 (needs journal recovery)
+>0x43a leshort &0x0000002 (errors)
+# INCOMPAT flags
+>0x460 lelong &0x0000001 (compressed)
+#>0x460 lelong &0x0000002 (filetype)
+#>0x460 lelong &0x0000010 (meta bg)
+>0x460 lelong &0x0000040 (extents)
+>0x460 lelong &0x0000080 (64bit)
+#>0x460 lelong &0x0000100 (mmp)
+#>0x460 lelong &0x0000200 (flex bg)
+# RO_INCOMPAT flags
+#>0x464 lelong &0x0000001 (sparse super)
+>0x464 lelong &0x0000002 (large files)
+>0x464 lelong &0x0000008 (huge files)
+#>0x464 lelong &0x0000010 (gdt checksum)
+#>0x464 lelong &0x0000020 (many subdirs)
+#>0x463 lelong &0x0000040 (extra isize)
+
+# SGI disk labels - Nathan Scott <nathans at debian.org>
+0 belong 0x0BE5A941 SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans at debian.org>
+0 belong 0x58465342 SGI XFS filesystem data
+>0x4 belong x (blksz %d,
+>0x68 beshort x inosz %d,
+>0x64 beshort ^0x2004 v1 dirs)
+>0x64 beshort &0x2004 v2 dirs)
+
+############################################################################
+# Minix-ST kernel floppy
+0x800 belong 0x46fc2700 Atari-ST Minix kernel image
+>19 string \240\5\371\5\0\011\0\2\0 \b, 720k floppy
+>19 string \320\2\370\5\0\011\0\1\0 \b, 360k floppy
+
+############################################################################
+# Hmmm, is this a better way of detecting _standard_ floppy images ?
+19 string \320\2\360\3\0\011\0\1\0 DOS floppy 360k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \240\5\371\3\0\011\0\2\0 DOS floppy 720k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \100\013\360\011\0\022\0\2\0 DOS floppy 1440k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+
+19 string \240\5\371\5\0\011\0\2\0 DOS floppy 720k, IBM
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \100\013\371\5\0\011\0\2\0 DOS floppy 1440k, mkdosfs
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+
+19 string \320\2\370\5\0\011\0\1\0 Atari-ST floppy 360k
+19 string \240\5\371\5\0\011\0\2\0 Atari-ST floppy 720k
+
+# Valid media descriptor bytes for MS-DOS:
+#
+# Byte Capacity Media Size and Type
+# -------------------------------------------------
+#
+# F0 2.88 MB 3.5-inch, 2-sided, 36-sector
+# F0 1.44 MB 3.5-inch, 2-sided, 18-sector
+# F9 720K 3.5-inch, 2-sided, 9-sector
+# F9 1.2 MB 5.25-inch, 2-sided, 15-sector
+# FD 360K 5.25-inch, 2-sided, 9-sector
+# FF 320K 5.25-inch, 2-sided, 8-sector
+# FC 180K 5.25-inch, 1-sided, 9-sector
+# FE 160K 5.25-inch, 1-sided, 8-sector
+# FE 250K 8-inch, 1-sided, single-density
+# FD 500K 8-inch, 2-sided, single-density
+# FE 1.2 MB 8-inch, 2-sided, double-density
+# F8 ----- Fixed disk
+#
+# FC xxxK Apricot 70x1x9 boot disk.
+#
+# Originally a bitmap:
+# xxxxxxx0 Not two sided
+# xxxxxxx1 Double sided
+# xxxxxx0x Not 8 SPT
+# xxxxxx1x 8 SPT
+# xxxxx0xx Not Removable drive
+# xxxxx1xx Removable drive
+# 11111xxx Must be one.
+#
+# But now it's rather random:
+# 111111xx Low density disk
+# 00 SS, Not 8 SPT
+# 01 DS, Not 8 SPT
+# 10 SS, 8 SPT
+# 11 DS, 8 SPT
+#
+# 11111001 Double density 3� floppy disk, high density 5�
+# 11110000 High density 3� floppy disk
+# 11111000 Hard disk any format
+#
+
+# CDROM Filesystems
+# Modified for UDF by gerardo.cacciari at gmail.com
+32769 string CD001
+!:mime application/x-iso9660-image
+>38913 string !NSR0 ISO 9660 CD-ROM filesystem data
+>38913 string NSR0 UDF filesystem data
+>>38917 string 1 (version 1.0)
+>>38917 string 2 (version 1.5)
+>>38917 string 3 (version 2.0)
+>>38917 byte >0x33 (unknown version, ID 0x%X)
+>>38917 byte <0x31 (unknown version, ID 0x%X)
+# "application id" which appears to be used as a volume label
+#>32808 string/T >\0 '%s'
+>34816 string \000CD001\001EL\ TORITO\ SPECIFICATION (bootable)
+37633 string CD001 ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
+!:mime application/x-iso9660-image
+32776 string CDROM High Sierra CD-ROM filesystem data
+
+# .cso files
+0 string CISO Compressed ISO CD image
+
+# cramfs filesystem - russell at coker.com.au
+0 lelong 0x28cd3d45 Linux Compressed ROM File System data, little endian
+>4 lelong x size %lu
+>8 lelong &1 version #2
+>8 lelong &2 sorted_dirs
+>8 lelong &4 hole_support
+>32 lelong x CRC 0x%x,
+>36 lelong x edition %lu,
+>40 lelong x %lu blocks,
+>44 lelong x %lu files
+
+0 belong 0x28cd3d45 Linux Compressed ROM File System data, big endian
+>4 belong x size %lu
+>8 belong &1 version #2
+>8 belong &2 sorted_dirs
+>8 belong &4 hole_support
+>32 belong x CRC 0x%x,
+>36 belong x edition %lu,
+>40 belong x %lu blocks,
+>44 belong x %lu files
+
+# reiserfs - russell at coker.com.au
+0x10034 string ReIsErFs ReiserFS V3.5
+0x10034 string ReIsEr2Fs ReiserFS V3.6
+>0x1002c leshort x block size %d
+>0x10032 leshort &2 (mounted or unclean)
+>0x10000 lelong x num blocks %d
+>0x10040 lelong 1 tea hash
+>0x10040 lelong 2 yura hash
+>0x10040 lelong 3 r5 hash
+
+# JFFS - russell at coker.com.au
+0 lelong 0x34383931 Linux Journalled Flash File system, little endian
+0 belong 0x34383931 Linux Journalled Flash File system, big endian
+
+# EST flat binary format (which isn't, but anyway)
+# From: Mark Brown <broonie at sirena.org.uk>
+0 string ESTFBINR EST flat binary
+
+# Aculab VoIP firmware
+# From: Mark Brown <broonie at sirena.org.uk>
+0 string VoIP\ Startup\ and Aculab VoIP firmware
+>35 string x format %s
+
+# From: Mark Brown <broonie at sirena.org.uk> [old]
+# From: Behan Webster <behanw at websterwood.com>
+0 belong 0x27051956 u-boot legacy uImage,
+>32 string x %s,
+>28 byte 0 Invalid os/
+>28 byte 1 OpenBSD/
+>28 byte 2 NetBSD/
+>28 byte 3 FreeBSD/
+>28 byte 4 4.4BSD/
+>28 byte 5 Linux/
+>28 byte 6 SVR4/
+>28 byte 7 Esix/
+>28 byte 8 Solaris/
+>28 byte 9 Irix/
+>28 byte 10 SCO/
+>28 byte 11 Dell/
+>28 byte 12 NCR/
+>28 byte 13 LynxOS/
+>28 byte 14 VxWorks/
+>28 byte 15 pSOS/
+>28 byte 16 QNX/
+>28 byte 17 Firmware/
+>28 byte 18 RTEMS/
+>28 byte 19 ARTOS/
+>28 byte 20 Unity OS/
+>28 byte 21 INTEGRITY/
+>29 byte 0 \bInvalid CPU,
+>29 byte 1 \bAlpha,
+>29 byte 2 \bARM,
+>29 byte 3 \bIntel x86,
+>29 byte 4 \bIA64,
+>29 byte 5 \bMIPS,
+>29 byte 6 \bMIPS 64-bit,
+>29 byte 7 \bPowerPC,
+>29 byte 8 \bIBM S390,
+>29 byte 9 \bSuperH,
+>29 byte 10 \bSparc,
+>29 byte 11 \bSparc 64-bit,
+>29 byte 12 \bM68K,
+>29 byte 13 \bNios-32,
+>29 byte 14 \bMicroBlaze,
+>29 byte 15 \bNios-II,
+>29 byte 16 \bBlackfin,
+>29 byte 17 \bAVR32,
+>29 byte 18 \bSTMicroelectronics ST200,
+>30 byte 0 Invalid Image
+>30 byte 1 Standalone Program
+>30 byte 2 OS Kernel Image
+>30 byte 3 RAMDisk Image
+>30 byte 4 Multi-File Image
+>30 byte 5 Firmware Image
+>30 byte 6 Script File
+>30 byte 7 Filesystem Image (any type)
+>30 byte 8 Binary Flat Device Tree BLOB
+>31 byte 0 (Not compressed),
+>31 byte 1 (gzip),
+>31 byte 2 (bzip2),
+>31 byte 3 (lzma),
+>12 belong x %d bytes,
+>8 bedate x %s,
+>16 belong x Load Address: 0x%08X,
+>20 belong x Entry Point: 0x%08X,
+>4 belong x Header CRC: 0x%08X,
+>24 belong x Data CRC: 0x%08X
+
+# JFFS2 file system
+0 leshort 0x1984 Linux old jffs2 filesystem data little endian
+0 leshort 0x1985 Linux jffs2 filesystem data little endian
+
+# Squashfs
+0 string sqsh Squashfs filesystem, big endian,
+>28 beshort x version %d.
+>30 beshort x \b%d,
+>28 beshort <3
+>>8 belong x %d bytes,
+>28 beshort >2
+>>28 beshort <4
+>>>63 bequad x %lld bytes,
+>>28 beshort >3
+>>>40 bequad x %lld bytes,
+#>>67 belong x %d bytes,
+>4 belong x %d inodes,
+>28 beshort <2
+>>32 beshort x blocksize: %d bytes,
+>28 beshort >1
+>>28 beshort <4
+>>>51 belong x blocksize: %d bytes,
+>>28 beshort >3
+>>>12 belong x blocksize: %d bytes,
+>28 beshort <4
+>>39 bedate x created: %s
+>28 beshort >3
+>>8 bedate x created: %s
+0 string hsqs Squashfs filesystem, little endian,
+>28 leshort x version %d.
+>30 leshort x \b%d,
+>28 leshort <3
+>>8 lelong x %d bytes,
+>28 leshort >2
+>>28 leshort <4
+>>>63 lequad x %lld bytes,
+>>28 leshort >3
+>>>40 lequad x %lld bytes,
+#>>63 lelong x %d bytes,
+>4 lelong x %d inodes,
+>28 leshort <2
+>>32 leshort x blocksize: %d bytes,
+>28 leshort >1
+>>28 leshort <4
+>>>51 lelong x blocksize: %d bytes,
+>>28 leshort >3
+>>>12 lelong x blocksize: %d bytes,
+>28 leshort <4
+>>39 ledate x created: %s
+>28 leshort >3
+>>8 ledate x created: %s
+
+0 string td\000 floppy image data (TeleDisk)
+
+# AFS Dump Magic
+# From: Ty Sarna <tsarna at sarna.org>
+0 string \x01\xb3\xa1\x13\x22 AFS Dump
+>&0 belong x (v%d)
+>>&0 byte 0x76
+>>>&0 belong x Vol %d,
+>>>>&0 byte 0x6e
+>>>>>&0 string x %s
+>>>>>>&1 byte 0x74
+>>>>>>>&0 beshort 2
+>>>>>>>>&4 bedate x on: %s
+>>>>>>>>&0 bedate =0 full dump
+>>>>>>>>&0 bedate !0 incremental since: %s
+
+#----------------------------------------------------------
+#delta ISO Daniel Novotny (dnovotny at redhat.com)
+0 string DISO Delta ISO data
+>4 belong x version %d
+
+# VMS backup savesets - gerardo.cacciari at gmail.com
+#
+4 string \x01\x00\x01\x00\x01\x00
+>(0.s+16) string \x01\x01
+>>&(&0.b+8) byte 0x42 OpenVMS backup saveset data
+>>>40 lelong x (block size %d,
+>>>49 string >\0 original name '%s',
+>>>2 short 1024 VAX generated)
+>>>2 short 2048 AXP generated)
+>>>2 short 4096 I64 generated)
+
+# Summary: Oracle Clustered Filesystem
+# Created by: Aaron Botsis <redhat at digitalmafia.org>
+8 string OracleCFS Oracle Clustered Filesystem,
+>4 long x rev %d
+>0 long x \b.%d,
+>560 string x label: %.64s,
+>136 string x mountpoint: %.128s
+
+# Summary: Oracle ASM tagged volume
+# Created by: Aaron Botsis <redhat at digitalmafia.org>
+32 string ORCLDISK Oracle ASM Volume,
+>40 string x Disk Name: %0.12s
+32 string ORCLCLRD Oracle ASM Volume (cleared),
+>40 string x Disk Name: %0.12s
+
+# Oracle Clustered Filesystem - Aaron Botsis <redhat at digitalmafia.org>
+8 string OracleCFS Oracle Clustered Filesystem,
+>4 long x rev %d
+>0 long x \b.%d,
+>560 string x label: %.64s,
+>136 string x mountpoint: %.128s
+
+# Oracle ASM tagged volume - Aaron Botsis <redhat at digitalmafia.org>
+32 string ORCLDISK Oracle ASM Volume,
+>40 string x Disk Name: %0.12s
+32 string ORCLCLRD Oracle ASM Volume (cleared),
+>40 string x Disk Name: %0.12s
+
+# Compaq/HP RILOE floppy image
+# From: Dirk Jagdmann <doj at cubic.org>
+0 string CPQRFBLO Compaq/HP RILOE floppy image
+
+#------------------------------------------------------------------------------
+# Files-11 On-Disk Structure (OpenVMS file system) - gerardo.cacciari at gmail.com
+# These bits come from LBN 1 (home block) of ODS-2 and ODS-5 volumes, which is
+# mapped to VBN 2 of [000000]INDEXF.SYS;1
+#
+1008 string DECFILE11B Files-11 On-Disk Structure
+>525 byte x Level %d
+>525 byte x (ODS-%d OpenVMS file system),
+>984 string x volume label is '%-12.12s'
+
+# From: Thomas Klausner <wiz at NetBSD.org>
+# http://filext.com/file-extension/DAA
+# describes the daa file format. The magic would be:
+0 string DAA\x0\x0\x0\x0\x0 PowerISO Direct-Access-Archive
+
+# From Albert Cahalan <acahalan at gmail.com>
+# really le32 operation,destination,payloadsize (but quite predictable)
+# 01 00 00 00 00 00 00 c0 00 02 00 00
+0 string \1\0\0\0\0\0\0\300\0\2\0\0 Marvell Libertas firmware
+
+# From Eric Sandeen
+# GFS2
+0x10000 belong 0x01161970 Linux
+>0x10018 belong 0x0000051d GFS1 Filesystem
+>>0x10024 belong x (blocksize %d,
+>>0x10060 string >\0 lockproto %s)
+>0x10018 belong 0x00000709 GFS2 Filesystem
+>>0x10024 belong x (blocksize %d,
+>>0x10060 string >\0 lockproto %s)
+
+# BTRFS
+0x10040 string _BHRfS_M BTRFS Filesystem
+>0x1012b string >\0 (label "%s",
+>0x10090 lelong x sectorsize %d,
+>0x10094 lelong x nodesize %d,
+>0x10098 lelong x leafsize %d)
+
+
+# dvdisaster's .ecc
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string *dvdisaster* dvdisaster error correction file
+
+# xfs metadump image
+# mb_magic XFSM at 0; superblock magic XFSB at 1 << mb_blocklog
+# but can we do the << ? For now it's always 512 (0x200) anyway.
+0 string XFSM
+>0x200 string XFSB XFS filesystem metadump image
+
+
+#------------------------------------------------------------------------------
+# $File: filesystems,v 1.55 2010/01/16 17:45:12 chl Exp $
+# filesystems: file(1) magic for different filesystems
+#
+0 string \366\366\366\366 PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774 beshort 0xdabe
+# modified by Joerg Jenderek, because original test
+# succeeds for Cabinet archive dao360.dl_ with negative blocks
+>0770 long >0 Sun disk label
+>>0 string x '%s
+>>>31 string >\0 \b%s
+>>>>63 string >\0 \b%s
+>>>>>95 string >\0 \b%s
+>>0 string x \b'
+>>0734 short >0 %d rpm,
+>>0736 short >0 %d phys cys,
+>>0740 short >0 %d alts/cyl,
+>>0746 short >0 %d interleave,
+>>0750 short >0 %d data cyls,
+>>0752 short >0 %d alt cyls,
+>>0754 short >0 %d heads/partition,
+>>0756 short >0 %d sectors/track,
+>>0764 long >0 start cyl %ld,
+>>0770 long x %ld blocks
+# Is there a boot block written 1 sector in?
+>512 belong&077777777 0600407 \b, boot block present
+# Joerg Jenderek: Smart Boot Manager backup file is 41 byte header + first sectors of disc
+# (http://btmgr.sourceforge.net/docs/user-guide-3.html)
+0 string SBMBAKUP_ Smart Boot Manager backup file
+>9 string x \b, version %-5.5s
+>>14 string =_
+>>>15 string x %-.1s
+>>>>16 string =_ \b.
+>>>>>17 string x \b%-.1s
+>>>>>>18 string =_ \b.
+>>>>>>>19 string x \b%-.1s
+>>>22 ubyte 0
+>>>>21 ubyte x \b, from drive 0x%x
+>>>22 ubyte >0
+>>>>21 string x \b, from drive %s
+
+# Joerg Jenderek
+# DOS Emulator image is 128 byte, null right padded header + harddisc image
+0 string DOSEMU\0
+>0x27E leshort 0xAA55
+#offset is 128
+>>19 ubyte 128
+>>>(19.b-1) ubyte 0x0 DOS Emulator image
+>>>>7 ulelong >0 \b, %u heads
+>>>>11 ulelong >0 \b, %d sectors/track
+>>>>15 ulelong >0 \b, %d cylinders
+
+# updated by Joerg Jenderek at Sep 2007
+# only for sector sizes with 512 or more Bytes
+0x1FE leshort 0xAA55 x86 boot sector
+# to do also for sectors < than 512 Bytes and some other files, GRR
+#30 search/481 \x55\xAA x86 boot sector
+# not for BeOS floppy 1440k, MBRs
+#(11.s-2) uleshort 0xAA55 x86 boot sector
+>2 string OSBS \b, OS/BS MBR
+# J\xf6rg Jenderek <joerg dot jenderek at web dot de>
+>0x8C string Invalid\ partition\ table \b, MS-DOS MBR
+# dr-dos with some upper-, lowercase variants
+>0x9D string Invalid\ partition\ table$
+>>181 string No\ Operating\ System$
+>>>201 string Operating\ System\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03
+>0x9D string Invalid\ partition\ table$
+>>181 string No\ operating\ system$
+>>>201 string Operating\ system\ load\ error$ \b, DR-DOS MBR, Version 7.01 to 7.03
+>342 string Invalid\ partition\ table$
+>>366 string No\ operating\ system$
+>>>386 string Operating\ system\ load\ error$ \b, DR-DOS MBR, version 7.01 to 7.03
+>295 string NEWLDR\0
+>>302 string Bad\ PT\ $
+>>>310 string No\ OS\ $
+>>>>317 string OS\ load\ err$
+>>>>>329 string Moved\ or\ missing\ IBMBIO.LDR\n\r
+>>>>>>358 string Press\ any\ key\ to\ continue.\n\r$
+>>>>>>>387 string Copyright\ (c)\ 1984,1998
+>>>>>>>>411 string Caldera\ Inc.\0 \b, DR-DOS MBR (IBMBIO.LDR)
+>0x10F string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>>0x1B8 ubelong >0 \b, Serial 0x%-.4x
+>0x8B string Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 5.00 to 4.00.950
+>271 string Invalid\ partition\ table\0
+>>295 string Error\ loading\ operating\ system\0
+>>>326 string Missing\ operating\ system\0 \b, mbr
+#
+>139 string Invalid\ partition\ table\0
+>>163 string Error\ loading\ operating\ system\0
+>>>194 string Missing\ operating\ system\0 \b, Microsoft Windows XP mbr
+# http://www.heise.de/ct/05/09/006/ page 184
+#HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices\?:=Serial4Bytes+8Bytes
+>>>>0x1B8 ulelong >0 \b,Serial 0x%-.4x
+>300 string Invalid\ partition\ table\0
+>>324 string Error\ loading\ operating\ system\0
+>>>355 string Missing\ operating\ system\0 \b, Microsoft Windows XP MBR
+#??>>>389 string Invalid\ system\ disk
+>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x
+>300 string Ung\201ltige\ Partitionstabelle
+#split string to avoid error: String too long
+>>328 string Fehler\ beim\ Laden\
+>>>346 string des\ Betriebssystems
+>>>>366 string Betriebssystem\ nicht\ vorhanden \b, Microsoft Windows XP MBR (german)
+>>>>>0x1B8 ulelong >0 \b, Serial 0x%-.4x
+#>0x145 string Default:\ F \b, FREE-DOS MBR
+#>0x14B string Default:\ F \b, FREE-DOS 1.0 MBR
+>0x145 search/7 Default:\ F \b, FREE-DOS MBR
+#>>313 string F0\ .\ .\ .
+#>>>322 string disk\ 1
+#>>>>382 string FAT3
+>64 string no\ active\ partition\ found
+>>96 string read\ error\ while\ reading\ drive \b, FREE-DOS Beta 0.9 MBR
+# Ranish Partition Manager http://www.ranish.com/part/
+>387 search/4 \0\ Error!\r
+>>378 search/7 Virus!
+>>>397 search/4 Booting\
+>>>>408 search/4 HD1/\0 \b, Ranish MBR (
+>>>>>416 string Writing\ changes... \b2.37
+>>>>>>438 ubyte x \b,0x%x dots
+>>>>>>440 ubyte >0 \b,virus check
+>>>>>>441 ubyte >0 \b,partition %c
+#2.38,2.42,2.44
+>>>>>416 string !Writing\ changes... \b
+>>>>>>418 ubyte 1 \bvirus check,
+>>>>>>419 ubyte x \b0x%x seconds
+>>>>>>420 ubyte&0x0F >0 \b,partition
+>>>>>>>420 ubyte&0x0F <5 \b %x
+>>>>>>>420 ubyte&0x0F 0Xf \b ask
+>>>>>420 ubyte x \b)
+#
+>271 string Operating\ system\ loading
+>>296 string error\r \b, SYSLINUX MBR (2.10)
+# http://www.acronis.de/
+>362 string MBR\ Error\ \0\r
+>>376 string ress\ any\ key\ to\
+>>>392 string boot\ from\ floppy...\0 \b, Acronis MBR
+# added by Joerg Jenderek
+# http://www.visopsys.org/
+# http://partitionlogic.org.uk/
+>309 string No\ bootable\ partition\ found\r
+>>339 string I/O\ Error\ reading\ boot\ sector\r \b, Visopsys MBR
+>349 string No\ bootable\ partition\ found\r
+>>379 string I/O\ Error\ reading\ boot\ sector\r \b, simple Visopsys MBR
+# bootloader, bootmanager
+>0x40 string SBML
+# label with 11 characters of FAT 12 bit filesystem
+>>43 string SMART\ BTMGR
+>>>430 string SBMK\ Bad!\r \b, Smart Boot Manager
+# OEM-ID not always "SBM"
+#>>>>3 strings SBM
+>>>>6 string >\0 \b, version %s
+>382 string XOSLLOADXCF \b, eXtended Operating System Loader
+>6 string LILO \b, LInux i386 boot LOader
+>>120 string LILO \b, version 22.3.4 SuSe
+>>172 string LILO \b, version 22.5.8 Debian
+# updated by Joerg Jenderek at Oct 2008
+# variables according to grub-0.97/stage1/stage1.S or
+# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data
+# usual values are marked with comments to get only informations of strange GRUB loaders
+>342 search/60 \0Geom\0
+#>0 ulelong x %x=0x009048EB , 0x2a9048EB 0
+>>0x41 ubyte <2
+>>>0x3E ubyte >2 \b; GRand Unified Bootloader
+# 0x3 for 0.5.95,0.93,0.94,0.96 0x4 for 1.90
+>>>>0x3E ubyte x \b, stage1 version 0x%x
+#If it is 0xFF, use a drive passed by BIOS
+>>>>0x40 ubyte <0xFF \b, boot drive 0x%x
+# in most case 0,1,0x2e for GRUB 0.5.95
+>>>>0x41 ubyte >0 \b, LBA flag 0x%x
+>>>>0x42 uleshort <0x8000 \b, stage2 address 0x%x
+#>>>>0x42 uleshort =0x8000 \b, stage2 address 0x%x (usual)
+>>>>0x42 uleshort >0x8000 \b, stage2 address 0x%x
+#>>>>0x44 ulelong =1 \b, 1st sector stage2 0x%x (default)
+>>>>0x44 ulelong >1 \b, 1st sector stage2 0x%x
+>>>>0x48 uleshort <0x800 \b, stage2 segment 0x%x
+#>>>>0x48 uleshort =0x800 \b, stage2 segment 0x%x (usual)
+>>>>0x48 uleshort >0x800 \b, stage2 segment 0x%x
+>>>>402 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>394 string stage1 \b, GRUB version 0.5.95
+>>>>382 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>376 string GRUB\ \0 \b, GRUB version 0.93 or 1.94
+>>>>383 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>377 string GRUB\ \0 \b, GRUB version 0.94
+>>>>385 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>379 string GRUB\ \0 \b, GRUB version 0.95 or 0.96
+>>>>391 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>>385 string GRUB\ \0 \b, GRUB version 0.97
+#unkown version
+>>>343 string Geom\0Read\0\ Error\0
+>>>>321 string Loading\ stage1.5 \b, GRUB version x.y
+>>>380 string Geom\0Hard\ Disk\0Read\0\ Error\0
+>>>>374 string GRUB\ \0 \b, GRUB version n.m
+# http://syslinux.zytor.com/
+>478 string Boot\ failed\r
+>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (1.62)
+>480 string Boot\ failed\r
+>>495 string LDLINUX\ SYS \b, SYSLINUX bootloader (2.06 or 2.11)
+>484 string Boot\ error\r \b, SYSLINUX bootloader (3.11)
+>395 string chksum\0\ ERROR!\0 \b, Gujin bootloader
+# http://www.bcdwb.de/bcdw/index_e.htm
+>3 string BCDL
+>>498 string BCDL\ \ \ \ BIN \b, Bootable CD Loader (1.50Z)
+# mbr partition table entries
+# OEM-ID does not contain MicroSoft,NEWLDR,DOS,SYSLINUX,or MTOOLs
+>3 string !MS
+>>3 string !SYSLINUX
+>>>3 string !MTOOL
+>>>>3 string !NEWLDR
+>>>>>5 string !DOS
+# not FAT (32 bit)
+>>>>>>82 string !FAT32
+#not Linux kernel
+>>>>>>>514 string !HdrS
+#not BeOS
+>>>>>>>>422 string !Be\ Boot\ Loader
+# active flag 0 or 0x80 and type > 0
+>>>>>>>>>446 ubyte <0x81
+>>>>>>>>>>446 ubyte&0x7F 0
+>>>>>>>>>>>450 ubyte >0 \b; partition 1: ID=0x%x
+>>>>>>>>>>>>446 ubyte 0x80 \b, active
+>>>>>>>>>>>>447 ubyte x \b, starthead %u
+#>>>>>>>>>>>>448 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>448 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>454 ulelong x \b, startsector %u
+>>>>>>>>>>>>458 ulelong x \b, %u sectors
+#
+>>>>>>>>>462 ubyte <0x81
+>>>>>>>>>>462 ubyte&0x7F 0
+>>>>>>>>>>>466 ubyte >0 \b; partition 2: ID=0x%x
+>>>>>>>>>>>>462 ubyte 0x80 \b, active
+>>>>>>>>>>>>463 ubyte x \b, starthead %u
+#>>>>>>>>>>>>464 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>464 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>470 ulelong x \b, startsector %u
+>>>>>>>>>>>>474 ulelong x \b, %u sectors
+#
+>>>>>>>>>478 ubyte <0x81
+>>>>>>>>>>478 ubyte&0x7F 0
+>>>>>>>>>>>482 ubyte >0 \b; partition 3: ID=0x%x
+>>>>>>>>>>>>478 ubyte 0x80 \b, active
+>>>>>>>>>>>>479 ubyte x \b, starthead %u
+#>>>>>>>>>>>>480 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>481 ubyte x \b, start C2S: 0x%x
+#>>>>>>>>>>>>480 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>486 ulelong x \b, startsector %u
+>>>>>>>>>>>>490 ulelong x \b, %u sectors
+#
+>>>>>>>>>494 ubyte <0x81
+>>>>>>>>>>494 ubyte&0x7F 0
+>>>>>>>>>>>498 ubyte >0 \b; partition 4: ID=0x%x
+>>>>>>>>>>>>494 ubyte 0x80 \b, active
+>>>>>>>>>>>>495 ubyte x \b, starthead %u
+#>>>>>>>>>>>>496 ubyte x \b, start C_S: 0x%x
+#>>>>>>>>>>>>496 ubeshort&1023 x \b, startcylinder? %d
+>>>>>>>>>>>>502 ulelong x \b, startsector %u
+>>>>>>>>>>>>506 ulelong x \b, %u sectors
+# mbr partition table entries end
+# http://www.acronis.de/
+#FAT label=ACRONIS\ SZ
+#OEM-ID=BOOTWIZ0
+>442 string Non-system\ disk,\
+>>459 string press\ any\ key...\x7\0 \b, Acronis Startup Recovery Loader
+# DOS names like F11.SYS are 8 right space padded bytes+3 bytes
+>>>477 ubyte&0xDF >0
+>>>>477 string x \b %-.3s
+>>>>>480 ubyte&0xDF >0
+>>>>>>480 string x \b%-.5s
+>>>>485 ubyte&0xDF >0
+>>>>>485 string x \b.%-.3s
+#
+>185 string FDBOOT\ Version\
+>>204 string \rNo\ Systemdisk.\
+>>>220 string Booting\ from\ harddisk.\n\r
+>>>245 string Cannot\ load\ from\ harddisk.\n\r
+>>>>273 string Insert\ Systemdisk\
+>>>>>291 string and\ press\ any\ key.\n\r \b, FDBOOT harddisk Bootloader
+>>>>>>200 string >\0 \b, version %-3s
+>242 string Bootsector\ from\ C.H.\ Hochst\204
+>>278 string No\ Systemdisk.\
+>>>293 string Booting\ from\ harddisk.\n\r
+>>>441 string Cannot\ load\ from\ harddisk.\n\r
+>>>>469 string Insert\ Systemdisk\
+>>>>>487 string and\ press\ any\ key.\n\r \b, WinImage harddisk Bootloader
+>>>>>>209 string >\0 \b, version %-4.4s
+>(1.b+2) ubyte 0xe
+>>(1.b+3) ubyte 0x1f
+>>>(1.b+4) ubyte 0xbe
+>>>>(1.b+5) ubyte 0x77
+>>>>(1.b+6) ubyte 0x7c
+>>>>>(1.b+7) ubyte 0xac
+>>>>>>(1.b+8) ubyte 0x22
+>>>>>>>(1.b+9) ubyte 0xc0
+>>>>>>>>(1.b+10) ubyte 0x74
+>>>>>>>>>(1.b+11) ubyte 0xb
+>>>>>>>>>>(1.b+12) ubyte 0x56
+>>>>>>>>>>(1.b+13) ubyte 0xb4 \b, mkdosfs boot message display
+>214 string Please\ try\ to\ install\ FreeDOS\ \b, DOS Emulator boot message display
+#>>244 string from\ dosemu-freedos-*-bin.tgz\r
+#>>>170 string Sorry,\ could\ not\ load\ an\
+#>>>>195 string operating\ system.\r\n
+#
+>103 string This\ is\ not\ a\ bootable\ disk.\
+>>132 string Please\ insert\ a\ bootable\
+>>>157 string floppy\ and\r\n
+>>>>169 string press\ any\ key\ to\ try\ again...\r \b, FREE-DOS message display
+#
+>66 string Solaris\ Boot\ Sector
+>>99 string Incomplete\ MDBoot\ load.
+>>>89 string Version \b, Sun Solaris Bootloader
+>>>>97 byte x version %c
+#
+>408 string OS/2\ !!\ SYS01475\r\0
+>>429 string OS/2\ !!\ SYS02025\r\0
+>>>450 string OS/2\ !!\ SYS02027\r\0
+>>>469 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp bootloader
+#
+>409 string OS/2\ !!\ SYS01475\r\0
+>>430 string OS/2\ !!\ SYS02025\r\0
+>>>451 string OS/2\ !!\ SYS02027\r\0
+>>>470 string OS2BOOT\ \ \ \ \b, IBM OS/2 Warp Bootloader
+>112 string This\ disk\ is\ not\ bootable\r
+>>142 string If\ you\ wish\ to\ make\ it\ bootable
+>>>176 string run\ the\ DOS\ program\ SYS\
+>>>200 string after\ the\r
+>>>>216 string system\ has\ been\ loaded\r\n
+>>>>>242 string Please\ insert\ a\ DOS\ diskette\
+>>>>>271 string into\r\n\ the\ drive\ and\
+>>>>>>292 string strike\ any\ key...\0 \b, IBM OS/2 Warp message display
+# XP
+>430 string NTLDR\ is\ missing\xFF\r\n
+>>449 string Disk\ error\xFF\r\n
+>>>462 string Press\ any\ key\ to\ restart\r \b, Microsoft Windows XP Bootloader
+# DOS names like NTLDR,CMLDR,$LDR$ are 8 right space padded bytes+3 bytes
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+#
+>430 string NTLDR\ nicht\ gefunden\xFF\r\n
+>>453 string Datentr\204gerfehler\xFF\r\n
+>>>473 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (german)
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+# offset variant
+>>>>379 string \0
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+#
+>430 string NTLDR\ fehlt\xFF\r\n
+>>444 string Datentr\204gerfehler\xFF\r\n
+>>>464 string Neustart\ mit\ beliebiger\ Taste\r \b, Microsoft Windows XP Bootloader (2.german)
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+# variant
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+#
+>430 string NTLDR\ fehlt\xFF\r\n
+>>444 string Medienfehler\xFF\r\n
+>>>459 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (3.german)
+>>>>371 ubyte >0x20
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+# variant
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+>430 string Datentr\204ger\ entfernen\xFF\r\n
+>>454 string Medienfehler\xFF\r\n
+>>>469 string Neustart:\ Taste\ dr\201cken\r \b, Microsoft Windows XP Bootloader (4.german)
+>>>>379 string \0
+>>>>>368 ubyte&0xDF >0
+>>>>>>368 string x %-.5s
+>>>>>>>373 ubyte&0xDF >0
+>>>>>>>>373 string x \b%-.3s
+>>>>>>376 ubyte&0xDF >0
+>>>>>>>376 string x \b.%-.3s
+# variant
+>>>>417 ubyte&0xDF >0
+>>>>>417 string x %-.5s
+>>>>>>422 ubyte&0xDF >0
+>>>>>>>422 string x \b%-.3s
+>>>>>425 ubyte&0xDF >0
+>>>>>>425 string >\ \b.%-.3s
+#
+
+#>3 string NTFS\ \ \ \
+>389 string Fehler\ beim\ Lesen\
+>>407 string des\ Datentr\204gers
+>>>426 string NTLDR\ fehlt
+>>>>440 string NTLDR\ ist\ komprimiert
+>>>>>464 string Neustart\ mit\ Strg+Alt+Entf\r \b, Microsoft Windows XP Bootloader NTFS (german)
+#>3 string NTFS\ \ \ \
+>313 string A\ disk\ read\ error\ occurred.\r
+>>345 string A\ kernel\ file\ is\ missing\
+>>>370 string from\ the\ disk.\r
+>>>>484 string NTLDR\ is\ compressed
+>>>>>429 string Insert\ a\ system\ diskette\
+>>>>>>454 string and\ restart\r\nthe\ system.\r \b, Microsoft Windows XP Bootloader NTFS
+# DOS loader variants different languages,offsets
+>472 ubyte&0xDF >0
+>>389 string Invalid\ system\ disk\xFF\r\n
+>>>411 string Disk\ I/O\ error
+>>>>428 string Replace\ the\ disk,\ and\
+>>>>>455 string press\ any\ key \b, Microsoft Windows 98 Bootloader
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.5s
+>>>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>>>479 string x \b%-.1s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>390 string Invalid\ system\ disk\xFF\r\n
+>>>412 string Disk\ I/O\ error\xFF\r\n
+>>>>429 string Replace\ the\ disk,\ and\
+>>>>>451 string then\ press\ any\ key\r \b, Microsoft Windows 98 Bootloader
+>>388 string Ungueltiges\ System\ \xFF\r\n
+>>>410 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>427 string Datentraeger\ wechseln\ und\
+>>>>>453 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (german)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497 ubyte&0xDF >0
+>>>>>>>497 string x %-.5s
+>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>505 ubyte&0xDF >0
+>>>>>>>505 string x \b.%-.3s
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0 or
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.5s
+>>>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>>>479 string x \b%-.1s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>390 string Ungueltiges\ System\ \xFF\r\n
+>>>412 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>429 string Datentraeger\ wechseln\ und\
+>>>>>455 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (German)
+#WINBOOT.SYS only not spaces (0xDF)
+>>>>>>497 ubyte&0xDF >0
+>>>>>>>497 string x %-.7s
+>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>504 string x \b%-.1s
+>>>>>>505 ubyte&0xDF >0
+>>>>>>>505 string x \b.%-.3s
+#IO.SYS
+>>>>>>472 ubyte&0xDF >0 or
+>>>>>>>472 string x \b %-.2s
+>>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>>474 string x \b%-.6s
+>>>>>>>480 ubyte&0xDF >0
+>>>>>>>>480 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>>483 string x \b%-.5s
+>>>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>>>488 string x \b%-.3s
+>>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>>491 string x \b.%-.3s
+#
+>>389 string Ungueltiges\ System\ \xFF\r\n
+>>>411 string E/A-Fehler\ \ \ \ \xFF\r\n
+>>>>428 string Datentraeger\ wechseln\ und\
+>>>>>454 string Taste\ druecken\r \b, Microsoft Windows 95/98/ME Bootloader (GERMAN)
+# DOS names like IO.SYS,WINBOOT.SYS,MSDOS.SYS,WINBOOT.INI are 8 right space padded bytes+3 bytes
+>>>>>>472 string x %-.2s
+>>>>>>>474 ubyte&0xDF >0
+>>>>>>>>474 string x \b%-.5s
+>>>>>>>>479 ubyte&0xDF >0
+>>>>>>>>>479 string x \b%-.1s
+>>>>>>480 ubyte&0xDF >0
+>>>>>>>480 string x \b.%-.3s
+>>>>>>483 ubyte&0xDF >0 \b+
+>>>>>>>483 string x \b%-.5s
+>>>>>>>488 ubyte&0xDF >0
+>>>>>>>>488 string x \b%-.2s
+>>>>>>>>490 ubyte&0xDF >0
+>>>>>>>>>490 string x \b%-.1s
+>>>>>>>491 ubyte&0xDF >0
+>>>>>>>>491 string x \b.%-.3s
+>479 ubyte&0xDF >0
+>>416 string Kein\ System\ oder\
+>>>433 string Laufwerksfehler
+>>>>450 string Wechseln\ und\ Taste\ dr\201cken \b, Microsoft DOS Bootloader (german)
+#IO.SYS
+>>>>>479 string x \b %-.2s
+>>>>>>481 ubyte&0xDF >0
+>>>>>>>481 string x \b%-.6s
+>>>>>487 ubyte&0xDF >0
+>>>>>>487 string x \b.%-.3s
+#MSDOS.SYS
+>>>>>>490 ubyte&0xDF >0 \b+
+>>>>>>>490 string x \b%-.5s
+>>>>>>>>495 ubyte&0xDF >0
+>>>>>>>>>495 string x \b%-.3s
+>>>>>>>498 ubyte&0xDF >0
+>>>>>>>>498 string x \b.%-.3s
+#
+>376 search/41 Non-System\ disk\ or\
+>>395 search/41 disk\ error\r
+>>>407 search/41 Replace\ and\
+>>>>419 search/41 press\ \b,
+>>>>419 search/41 strike\ \b, old
+>>>>426 search/41 any\ key\ when\ ready\r MS or PC-DOS bootloader
+#449 Disk\ Boot\ failure\r MS 3.21
+#466 Boot\ Failure\r MS 3.30
+>>>>>468 search/18 \0
+#IO.SYS,IBMBIO.COM
+>>>>>>&0 string x \b %-.2s
+>>>>>>>&-20 ubyte&0xDF >0
+>>>>>>>>&-1 string x \b%-.4s
+>>>>>>>>>&-16 ubyte&0xDF >0
+>>>>>>>>>>&-1 string x \b%-.2s
+>>>>>>&8 ubyte&0xDF >0 \b.
+>>>>>>>&-1 string x \b%-.3s
+#MSDOS.SYS,IBMDOS.COM
+>>>>>>&11 ubyte&0xDF >0 \b+
+>>>>>>>&-1 string x \b%-.5s
+>>>>>>>>&-6 ubyte&0xDF >0
+>>>>>>>>>&-1 string x \b%-.1s
+>>>>>>>>>>&-5 ubyte&0xDF >0
+>>>>>>>>>>>&-1 string x \b%-.2s
+>>>>>>>&7 ubyte&0xDF >0 \b.
+>>>>>>>>&-1 string x \b%-.3s
+>441 string Cannot\ load\ from\ harddisk.\n\r
+>>469 string Insert\ Systemdisk\
+>>>487 string and\ press\ any\ key.\n\r \b, MS (2.11) DOS bootloader
+#>43 string \224R-LOADER\ \ SYS =label
+>54 string SYS
+>>324 string VASKK
+>>>495 string NEWLDR\0 \b, DR-DOS Bootloader (LOADER.SYS)
+#
+>98 string Press\ a\ key\ to\ retry\0\r
+>>120 string Cannot\ find\ file\ \0\r
+>>>139 string Disk\ read\ error\0\r
+>>>>156 string Loading\ ...\0 \b, DR-DOS (3.41) Bootloader
+#DRBIOS.SYS
+>>>>>44 ubyte&0xDF >0
+>>>>>>44 string x \b %-.6s
+>>>>>>>50 ubyte&0xDF >0
+>>>>>>>>50 string x \b%-.2s
+>>>>>>52 ubyte&0xDF >0
+>>>>>>>52 string x \b.%-.3s
+#
+>70 string IBMBIO\ \ COM
+>>472 string Cannot\ load\ DOS!\
+>>>489 string Any\ key\ to\ retry \b, DR-DOS Bootloader
+>>471 string Cannot\ load\ DOS\
+>>487 string press\ key\ to\ retry \b, Open-DOS Bootloader
+#??
+>444 string KERNEL\ \ SYS
+>>314 string BOOT\ error! \b, FREE-DOS Bootloader
+>499 string KERNEL\ \ SYS
+>>305 string BOOT\ err!\0 \b, Free-DOS Bootloader
+>449 string KERNEL\ \ SYS
+>>319 string BOOT\ error! \b, FREE-DOS 0.5 Bootloader
+#
+>449 string Loading\ FreeDOS
+>>0x1AF ulelong >0 \b, FREE-DOS 0.95,1.0 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+#
+>331 string Error!.0 \b, FREE-DOS 1.0 bootloader
+#
+>125 string Loading\ FreeDOS...\r
+>>311 string BOOT\ error!\r \b, FREE-DOS bootloader
+>>>441 ubyte&0xDF >0
+>>>>441 string x \b %-.6s
+>>>>>447 ubyte&0xDF >0
+>>>>>>447 string x \b%-.1s
+>>>>>>>448 ubyte&0xDF >0
+>>>>>>>>448 string x \b%-.1s
+>>>>449 ubyte&0xDF >0
+>>>>>449 string x \b.%-.3s
+>124 string FreeDOS\0
+>>331 string \ err\0 \b, FREE-DOS BETa 0.9 Bootloader
+# DOS names like KERNEL.SYS,KERNEL16.SYS,KERNEL32.SYS,METAKERN.SYS are 8 right space padded bytes+3 bytes
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>>333 string \ err\0 \b, FREE-DOS BEta 0.9 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>>334 string \ err\0 \b, FREE-DOS Beta 0.9 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+>336 string Error!\
+>>343 string Hit\ a\ key\ to\ reboot. \b, FREE-DOS Beta 0.9sr1 Bootloader
+>>>497 ubyte&0xDF >0
+>>>>497 string x \b %-.6s
+>>>>>503 ubyte&0xDF >0
+>>>>>>503 string x \b%-.1s
+>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>504 string x \b%-.1s
+>>>>505 ubyte&0xDF >0
+>>>>>505 string x \b.%-.3s
+# added by Joerg Jenderek
+# http://www.visopsys.org/
+# http://partitionlogic.org.uk/
+# OEM-ID=Visopsys
+>478 ulelong 0
+>>(1.b+326) string I/O\ Error\ reading\
+>>>(1.b+344) string Visopsys\ loader\r
+>>>>(1.b+361) string Press\ any\ key\ to\ continue.\r \b, Visopsys loader
+# http://alexfru.chat.ru/epm.html#bootprog
+>494 ubyte >0x4D
+>>495 string >E
+>>>495 string <S
+#OEM-ID is not reliable
+>>>>3 string BootProg
+# It just looks for a program file name at the root directory
+# and loads corresponding file with following execution.
+# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes
+>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader
+>>>>>499 string x \b %-.1s
+>>>>>>500 ubyte&0xDF >0
+>>>>>>>500 string x \b%-.1s
+>>>>>>>>501 ubyte&0xDF >0
+>>>>>>>>>501 string x \b%-.1s
+>>>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>>>>>>>>>>>505 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>505 string x \b%-.1s
+>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s
+#name extension
+>>>>>507 ubyte&0xDF >0 \b.
+>>>>>>507 string x \b%-.1s
+>>>>>>>508 ubyte&0xDF >0
+>>>>>>>>508 string x \b%-.1s
+>>>>>>>>>509 ubyte&0xDF >0
+>>>>>>>>>>509 string x \b%-.1s
+#If the boot sector fails to read any other sector,
+#it prints a very short message ("RE") to the screen and hangs the computer.
+#If the boot sector fails to find needed program in the root directory,
+#it also hangs with another message ("NF").
+>>>>>492 string RENF \b, FAT (12 bit)
+>>>>>495 string RENF \b, FAT (16 bit)
+# http://alexfru.chat.ru/epm.html#bootprog
+>494 ubyte >0x4D
+>>495 string >E
+>>>495 string <S
+#OEM-ID is not reliable
+>>>>3 string BootProg
+# It just looks for a program file name at the root directory
+# and loads corresponding file with following execution.
+# DOS names like STARTUP.BIN,STARTUPC.COM,STARTUPE.EXE are 8 right space padded bytes+3 bytes
+>>>>499 ubyte&0xDF >0 \b, COM/EXE Bootloader
+>>>>>499 string x \b %-.1s
+>>>>>>500 ubyte&0xDF >0
+>>>>>>>500 string x \b%-.1s
+>>>>>>>>501 ubyte&0xDF >0
+>>>>>>>>>501 string x \b%-.1s
+>>>>>>>>>>502 ubyte&0xDF >0
+>>>>>>>>>>>502 string x \b%-.1s
+>>>>>>>>>>>>503 ubyte&0xDF >0
+>>>>>>>>>>>>>503 string x \b%-.1s
+>>>>>>>>>>>>>>504 ubyte&0xDF >0
+>>>>>>>>>>>>>>>504 string x \b%-.1s
+>>>>>>>>>>>>>>>>505 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>505 string x \b%-.1s
+>>>>>>>>>>>>>>>>>>506 ubyte&0xDF >0
+>>>>>>>>>>>>>>>>>>>506 string x \b%-.1s
+#name extension
+>>>>>507 ubyte&0xDF >0 \b.
+>>>>>>507 string x \b%-.1s
+>>>>>>>508 ubyte&0xDF >0
+>>>>>>>>508 string x \b%-.1s
+>>>>>>>>>509 ubyte&0xDF >0
+>>>>>>>>>>509 string x \b%-.1s
+#If the boot sector fails to read any other sector,
+#it prints a very short message ("RE") to the screen and hangs the computer.
+#If the boot sector fails to find needed program in the root directory,
+#it also hangs with another message ("NF").
+>>>>>492 string RENF \b, FAT (12 bit)
+>>>>>495 string RENF \b, FAT (16 bit)
+# x86 bootloader end
+# updated by Joerg Jenderek at Sep 2007
+>3 ubyte 0
+#no active flag
+>>446 ubyte 0
+# partition 1 not empty
+>>>450 ubyte >0
+# partitions 3,4 empty
+>>>>482 ubyte 0
+>>>>>498 ubyte 0
+# partition 2 ID=0,5,15
+>>>>>>466 ubyte <0x10
+>>>>>>>466 ubyte 0x05 \b, extended partition table
+>>>>>>>466 ubyte 0x0F \b, extended partition table (LBA)
+>>>>>>>466 ubyte 0x0 \b, extended partition table (last)
+# JuMP short bootcodeoffset NOP assembler instructions will usually be EB xx 90
+# http://mirror.href.com/thestarman/asm/2bytejumps.htmm#FWD
+# older drives may use Near JuMP instruction E9 xx xx
+>0 lelong&0x009000EB 0x009000EB
+>0 lelong&0x000000E9 0x000000E9
+# minimal short forward jump found 03cx??
+# maximal short forward jump is 07fx
+>1 ubyte <0xff \b, code offset 0x%x
+# mtools-3.9.8/msdos.h
+# usual values are marked with comments to get only informations of strange FAT systems
+# valid sectorsize must be a power of 2 from 32 to 32768
+>>11 uleshort&0x000f x
+>>>11 uleshort <32769
+>>>>11 uleshort >31
+>>>>>21 ubyte&0xf0 0xF0
+>>>>>>3 string >\0 \b, OEM-ID "%8.8s"
+#http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC
+>>>>>>>8 string IHC \b cached by Windows 9M
+>>>>>>11 uleshort >512 \b, Bytes/sector %u
+#>>>>>>11 uleshort =512 \b, Bytes/sector %u=512 (usual)
+>>>>>>11 uleshort <512 \b, Bytes/sector %u
+>>>>>>13 ubyte >1 \b, sectors/cluster %u
+#>>>>>>13 ubyte =1 \b, sectors/cluster %u (usual on Floppies)
+>>>>>>14 uleshort >32 \b, reserved sectors %u
+#>>>>>>14 uleshort =32 \b, reserved sectors %u (usual Fat32)
+#>>>>>>14 uleshort >1 \b, reserved sectors %u
+#>>>>>>14 uleshort =1 \b, reserved sectors %u (usual FAT12,FAT16)
+>>>>>>14 uleshort <1 \b, reserved sectors %u
+>>>>>>16 ubyte >2 \b, FATs %u
+#>>>>>>16 ubyte =2 \b, FATs %u (usual)
+>>>>>>16 ubyte =1 \b, FAT %u
+>>>>>>16 ubyte >0
+>>>>>>17 uleshort >0 \b, root entries %u
+#>>>>>>17 uleshort =0 \b, root entries %u=0 (usual Fat32)
+>>>>>>19 uleshort >0 \b, sectors %u (volumes <=32 MB)
+#>>>>>>19 uleshort =0 \b, sectors %u=0 (usual Fat32)
+>>>>>>21 ubyte >0xF0 \b, Media descriptor 0x%x
+#>>>>>>21 ubyte =0xF0 \b, Media descriptor 0x%x (usual floppy)
+>>>>>>21 ubyte <0xF0 \b, Media descriptor 0x%x
+>>>>>>22 uleshort >0 \b, sectors/FAT %u
+#>>>>>>22 uleshort =0 \b, sectors/FAT %u=0 (usual Fat32)
+>>>>>>26 ubyte >2 \b, heads %u
+#>>>>>>26 ubyte =2 \b, heads %u (usual floppy)
+>>>>>>26 ubyte =1 \b, heads %u
+#skip for Digital Research DOS (version 3.41) 1440 kB Bootdisk
+>>>>>>38 ubyte !0x70
+>>>>>>>28 ulelong >0 \b, hidden sectors %u
+#>>>>>>>28 ulelong =0 \b, hidden sectors %u (usual floppy)
+>>>>>>>32 ulelong >0 \b, sectors %u (volumes > 32 MB)
+#>>>>>>>32 ulelong =0 \b, sectors %u (volumes > 32 MB)
+# FAT<32 specific
+>>>>>>82 string !FAT32
+#>>>>>>>36 ubyte 0x80 \b, physical drive 0x%x=0x80 (usual harddisk)
+#>>>>>>>36 ubyte 0 \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>>36 ubyte !0x80
+>>>>>>>>36 ubyte !0 \b, physical drive 0x%x
+>>>>>>>37 ubyte >0 \b, reserved 0x%x
+#>>>>>>>37 ubyte =0 \b, reserved 0x%x
+>>>>>>>38 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>38 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>38 ubyte =0x29
+>>>>>>>>39 ulelong x \b, serial number 0x%x
+>>>>>>>>43 string <NO\ NAME \b, label: "%11.11s"
+>>>>>>>>43 string >NO\ NAME \b, label: "%11.11s"
+>>>>>>>>43 string =NO\ NAME \b, unlabeled
+>>>>>>>54 string FAT \b, FAT
+>>>>>>>>54 string FAT12 \b (12 bit)
+>>>>>>>>54 string FAT16 \b (16 bit)
+# FAT32 specific
+>>>>>>82 string FAT32 \b, FAT (32 bit)
+>>>>>>>36 ulelong x \b, sectors/FAT %u
+>>>>>>>40 uleshort >0 \b, extension flags %u
+#>>>>>>>40 uleshort =0 \b, extension flags %u
+>>>>>>>42 uleshort >0 \b, fsVersion %u
+#>>>>>>>42 uleshort =0 \b, fsVersion %u (usual)
+>>>>>>>44 ulelong >2 \b, rootdir cluster %u
+#>>>>>>>44 ulelong =2 \b, rootdir cluster %u
+#>>>>>>>44 ulelong =1 \b, rootdir cluster %u
+>>>>>>>48 uleshort >1 \b, infoSector %u
+#>>>>>>>48 uleshort =1 \b, infoSector %u (usual)
+>>>>>>>48 uleshort <1 \b, infoSector %u
+>>>>>>>50 uleshort >6 \b, Backup boot sector %u
+#>>>>>>>50 uleshort =6 \b, Backup boot sector %u (usual)
+>>>>>>>50 uleshort <6 \b, Backup boot sector %u
+>>>>>>>54 ulelong >0 \b, reserved1 0x%x
+>>>>>>>58 ulelong >0 \b, reserved2 0x%x
+>>>>>>>62 ulelong >0 \b, reserved3 0x%x
+# same structure as FAT1X
+>>>>>>>64 ubyte >0x80 \b, physical drive 0x%x
+#>>>>>>>64 ubyte =0x80 \b, physical drive 0x%x=80 (usual harddisk)
+>>>>>>>64 ubyte&0x7F >0 \b, physical drive 0x%x
+#>>>>>>>64 ubyte =0 \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>>65 ubyte >0 \b, reserved 0x%x
+>>>>>>>66 ubyte >0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>66 ubyte <0x29 \b, dos < 4.0 BootSector (0x%x)
+>>>>>>>66 ubyte =0x29
+>>>>>>>>67 ulelong x \b, serial number 0x%x
+>>>>>>>>71 string <NO\ NAME \b, label: "%11.11s"
+>>>>>>>71 string >NO\ NAME \b, label: "%11.11s"
+>>>>>>>71 string =NO\ NAME \b, unlabeled
+### FATs end
+>0x200 lelong 0x82564557 \b, BSD disklabel
+# FATX
+0 string FATX FATX filesystem data
+
+
+# Minix filesystems - Juan Cespedes <cespedes at debian.org>
+0x410 leshort 0x137f
+!:strength / 2
+>0x402 beshort < 100 Minix filesystem, V1, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x137f
+!:strength / 2
+>0x402 beshort < 100 Minix filesystem, V1 (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x138f
+!:strength / 2
+>0x402 beshort < 100 Minix filesystem, V1, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x138f
+!:strength / 2
+>0x402 beshort < 100 Minix filesystem, V1, 30 char names (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x2468
+>0x402 beshort < 100 Minix filesystem, V2, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x2468
+>0x402 beshort < 100 Minix filesystem, V2 (big endian), %d zones
+>0x1e string minix \b, bootable
+
+0x410 leshort 0x2478
+>0x402 beshort < 100 Minix filesystem, V2, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x2478
+>0x402 beshort < 100 Minix filesystem, V2, 30 char names, %d zones
+>0x1e string minix \b, bootable
+0x410 beshort 0x2478
+>0x402 beshort !0 Minix filesystem, V2, 30 char names (big endian), %d zones
+>0x1e string minix \b, bootable
+0x410 leshort 0x4d5a
+>0x402 beshort !0 Minix filesystem, V3, %d zones
+>0x1e string minix \b, bootable
+
+# romfs filesystems - Juan Cespedes <cespedes at debian.org>
+0 string -rom1fs- romfs filesystem, version 1
+>8 belong x %d bytes,
+>16 string x named %s.
+
+# netboot image - Juan Cespedes <cespedes at debian.org>
+0 lelong 0x1b031336L Netboot image,
+>4 lelong&0xFFFFFF00 0
+>>4 lelong&0x100 0x000 mode 2
+>>4 lelong&0x100 0x100 mode 3
+>4 lelong&0xFFFFFF00 !0 unknown mode
+
+0x18b string OS/2 OS/2 Boot Manager
+
+# updated by Joerg Jenderek at Oct 2008!!
+# http://syslinux.zytor.com/iso.php
+0 ulelong 0x7c40eafa isolinux Loader
+# http://syslinux.zytor.com/pxe.php
+0 ulelong 0x007c05ea pxelinux Loader
+0 ulelong 0x60669c66 pxelinux Loader
+
+# added by Joerg Jenderek
+# In the second sector (+0x200) are variables according to grub-0.97/stage2/asm.S or
+# grub-1.94/kern/i386/pc/startup.S
+# http://www.gnu.org/software/grub/manual/grub.html#Embedded-data
+# usual values are marked with comments to get only informations of strange GRUB loaders
+0x200 uleshort 0x70EA
+# found only version 3.{1,2}
+>0x206 ubeshort >0x0300
+# GRUB version (0.5.)95,0.93,0.94,0.96,0.97 > "00"
+>>0x212 ubyte >0x29
+>>>0x213 ubyte >0x29
+# not iso9660_stage1_5
+#>>>0 ulelong&0x00BE5652 0x00BE5652
+>>>>0x213 ubyte >0x29 GRand Unified Bootloader
+# config_file for stage1_5 is 0xffffffff + default "/boot/grub/stage2"
+>>>>0x217 ubyte 0xFF stage1_5
+>>>>0x217 ubyte <0xFF stage2
+>>>>0x206 ubyte x \b version %u
+>>>>0x207 ubyte x \b.%u
+# module_size for 1.94
+>>>>0x208 ulelong <0xffffff \b, installed partition %u
+#>>>>0x208 ulelong =0xffffff \b, %u (default)
+>>>>0x208 ulelong >0xffffff \b, installed partition %u
+# GRUB 0.5.95 unofficial
+>>>>0x20C ulelong&0x2E300000 0x2E300000
+# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs
+>>>>>0x20C ubyte x \b, identifier 0x%x
+#>>>>>0x20D ubyte =0 \b, LBA flag 0x%x (default)
+>>>>>0x20D ubyte >0 \b, LBA flag 0x%x
+# GRUB version as string
+>>>>>0x20E string >\0 \b, GRUB version %-s
+# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
+>>>>>>0x215 ulong 0xffffffff
+>>>>>>>0x219 string >\0 \b, configuration file %-s
+>>>>>>0x215 ulong !0xffffffff
+>>>>>>>0x215 string >\0 \b, configuration file %-s
+# newer GRUB versions
+>>>>0x20C ulelong&0x2E300000 !0x2E300000
+##>>>>>0x20C ulelong =0 \b, saved entry %d (usual)
+>>>>>0x20C ulelong >0 \b, saved entry %d
+# for 1.94 contains kernel image size
+# for 0.93,0.94,0.96,0.97
+# 0=stage2 1=ffs 2=e2fs 3=fat 4=minix 5=reiserfs 6=vstafs 7=jfs 8=xfs 9=iso9660 a=ufs2
+>>>>>0x210 ubyte x \b, identifier 0x%x
+# The flag for LBA forcing is in most cases 0
+#>>>>>0x211 ubyte =0 \b, LBA flag 0x%x (default)
+>>>>>0x211 ubyte >0 \b, LBA flag 0x%x
+# GRUB version as string
+>>>>>0x212 string >\0 \b, GRUB version %-s
+# for stage1_5 is 0xffffffff + config_file "/boot/grub/stage2" default
+>>>>>0x217 ulong 0xffffffff
+>>>>>>0x21b string >\0 \b, configuration file %-s
+>>>>>0x217 ulong !0xffffffff
+>>>>>>0x217 string >\0 \b, configuration file %-s
+
+9564 lelong 0x00011954 Unix Fast File system [v1] (little-endian),
+>8404 string x last mounted on %s,
+#>9504 ledate x last checked at %s,
+>8224 ledate x last written at %s,
+>8401 byte x clean flag %d,
+>8228 lelong x number of blocks %d,
+>8232 lelong x number of data blocks %d,
+>8236 lelong x number of cylinder groups %d,
+>8240 lelong x block size %d,
+>8244 lelong x fragment size %d,
+>8252 lelong x minimum percentage of free blocks %d,
+>8256 lelong x rotational delay %dms,
+>8260 lelong x disk rotational speed %drps,
+>8320 lelong 0 TIME optimization
+>8320 lelong 1 SPACE optimization
+
+42332 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 leqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 lequad x number of blocks %lld,
+>&-288 lequad x number of data blocks %lld,
+>&-1332 lelong x number of cylinder groups %d,
+>&-1328 lelong x block size %d,
+>&-1324 lelong x fragment size %d,
+>&-180 lelong x average file size %d,
+>&-176 lelong x average number of files in dir %d,
+>&-272 lequad x pending blocks to free %lld,
+>&-264 lelong x pending inodes to free %ld,
+>&-664 lequad x system-wide uuid %0llx,
+>&-1316 lelong x minimum percentage of free blocks %d,
+>&-1248 lelong 0 TIME optimization
+>&-1248 lelong 1 SPACE optimization
+
+66908 lelong 0x19540119 Unix Fast File system [v2] (little-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 leqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 lequad x number of blocks %lld,
+>&-288 lequad x number of data blocks %lld,
+>&-1332 lelong x number of cylinder groups %d,
+>&-1328 lelong x block size %d,
+>&-1324 lelong x fragment size %d,
+>&-180 lelong x average file size %d,
+>&-176 lelong x average number of files in dir %d,
+>&-272 lequad x pending blocks to free %lld,
+>&-264 lelong x pending inodes to free %ld,
+>&-664 lequad x system-wide uuid %0llx,
+>&-1316 lelong x minimum percentage of free blocks %d,
+>&-1248 lelong 0 TIME optimization
+>&-1248 lelong 1 SPACE optimization
+
+9564 belong 0x00011954 Unix Fast File system [v1] (big-endian),
+>7168 belong 0x4c41424c Apple UFS Volume
+>>7186 string x named %s,
+>>7176 belong x volume label version %d,
+>>7180 bedate x created on %s,
+>8404 string x last mounted on %s,
+#>9504 bedate x last checked at %s,
+>8224 bedate x last written at %s,
+>8401 byte x clean flag %d,
+>8228 belong x number of blocks %d,
+>8232 belong x number of data blocks %d,
+>8236 belong x number of cylinder groups %d,
+>8240 belong x block size %d,
+>8244 belong x fragment size %d,
+>8252 belong x minimum percentage of free blocks %d,
+>8256 belong x rotational delay %dms,
+>8260 belong x disk rotational speed %drps,
+>8320 belong 0 TIME optimization
+>8320 belong 1 SPACE optimization
+
+42332 belong 0x19540119 Unix Fast File system [v2] (big-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 beqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 bequad x number of blocks %lld,
+>&-288 bequad x number of data blocks %lld,
+>&-1332 belong x number of cylinder groups %d,
+>&-1328 belong x block size %d,
+>&-1324 belong x fragment size %d,
+>&-180 belong x average file size %d,
+>&-176 belong x average number of files in dir %d,
+>&-272 bequad x pending blocks to free %lld,
+>&-264 belong x pending inodes to free %ld,
+>&-664 bequad x system-wide uuid %0llx,
+>&-1316 belong x minimum percentage of free blocks %d,
+>&-1248 belong 0 TIME optimization
+>&-1248 belong 1 SPACE optimization
+
+66908 belong 0x19540119 Unix Fast File system [v2] (big-endian)
+>&-1164 string x last mounted on %s,
+>&-696 string >\0 volume name %s,
+>&-304 beqldate x last written at %s,
+>&-1167 byte x clean flag %d,
+>&-1168 byte x readonly flag %d,
+>&-296 bequad x number of blocks %lld,
+>&-288 bequad x number of data blocks %lld,
+>&-1332 belong x number of cylinder groups %d,
+>&-1328 belong x block size %d,
+>&-1324 belong x fragment size %d,
+>&-180 belong x average file size %d,
+>&-176 belong x average number of files in dir %d,
+>&-272 bequad x pending blocks to free %lld,
+>&-264 belong x pending inodes to free %ld,
+>&-664 bequad x system-wide uuid %0llx,
+>&-1316 belong x minimum percentage of free blocks %d,
+>&-1248 belong 0 TIME optimization
+>&-1248 belong 1 SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger at dilger.ca>
+# ext4 filesystem - Eric Sandeen <sandeen at sandeen.net>
+0x438 leshort 0xEF53 Linux
+>0x44c lelong x rev %d
+>0x43e leshort x \b.%d
+# No journal? ext2
+>0x45c lelong ^0x0000004 ext2 filesystem data
+>>0x43a leshort ^0x0000001 (mounted or unclean)
+# Has a journal? ext3 or ext4
+>0x45c lelong &0x0000004
+# and small INCOMPAT?
+>>0x460 lelong <0x0000040
+# and small RO_COMPAT?
+>>>0x464 lelong <0x0000008 ext3 filesystem data
+# else large RO_COMPAT?
+>>>0x464 lelong >0x0000007 ext4 filesystem data
+# else large INCOMPAT?
+>>0x460 lelong >0x000003f ext4 filesystem data
+# General flags for any ext* fs
+>0x460 lelong &0x0000004 (needs journal recovery)
+>0x43a leshort &0x0000002 (errors)
+# INCOMPAT flags
+>0x460 lelong &0x0000001 (compressed)
+#>0x460 lelong &0x0000002 (filetype)
+#>0x460 lelong &0x0000010 (meta bg)
+>0x460 lelong &0x0000040 (extents)
+>0x460 lelong &0x0000080 (64bit)
+#>0x460 lelong &0x0000100 (mmp)
+#>0x460 lelong &0x0000200 (flex bg)
+# RO_INCOMPAT flags
+#>0x464 lelong &0x0000001 (sparse super)
+>0x464 lelong &0x0000002 (large files)
+>0x464 lelong &0x0000008 (huge files)
+#>0x464 lelong &0x0000010 (gdt checksum)
+#>0x464 lelong &0x0000020 (many subdirs)
+#>0x463 lelong &0x0000040 (extra isize)
+
+# SGI disk labels - Nathan Scott <nathans at debian.org>
+0 belong 0x0BE5A941 SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans at debian.org>
+0 belong 0x58465342 SGI XFS filesystem data
+>0x4 belong x (blksz %d,
+>0x68 beshort x inosz %d,
+>0x64 beshort ^0x2004 v1 dirs)
+>0x64 beshort &0x2004 v2 dirs)
+
+############################################################################
+# Minix-ST kernel floppy
+0x800 belong 0x46fc2700 Atari-ST Minix kernel image
+>19 string \240\5\371\5\0\011\0\2\0 \b, 720k floppy
+>19 string \320\2\370\5\0\011\0\1\0 \b, 360k floppy
+
+############################################################################
+# Hmmm, is this a better way of detecting _standard_ floppy images ?
+19 string \320\2\360\3\0\011\0\1\0 DOS floppy 360k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \240\5\371\3\0\011\0\2\0 DOS floppy 720k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \100\013\360\011\0\022\0\2\0 DOS floppy 1440k
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+
+19 string \240\5\371\5\0\011\0\2\0 DOS floppy 720k, IBM
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+19 string \100\013\371\5\0\011\0\2\0 DOS floppy 1440k, mkdosfs
+>0x1FE leshort 0xAA55 \b, x86 hard disk boot sector
+
+19 string \320\2\370\5\0\011\0\1\0 Atari-ST floppy 360k
+19 string \240\5\371\5\0\011\0\2\0 Atari-ST floppy 720k
+
+# Valid media descriptor bytes for MS-DOS:
+#
+# Byte Capacity Media Size and Type
+# -------------------------------------------------
+#
+# F0 2.88 MB 3.5-inch, 2-sided, 36-sector
+# F0 1.44 MB 3.5-inch, 2-sided, 18-sector
+# F9 720K 3.5-inch, 2-sided, 9-sector
+# F9 1.2 MB 5.25-inch, 2-sided, 15-sector
+# FD 360K 5.25-inch, 2-sided, 9-sector
+# FF 320K 5.25-inch, 2-sided, 8-sector
+# FC 180K 5.25-inch, 1-sided, 9-sector
+# FE 160K 5.25-inch, 1-sided, 8-sector
+# FE 250K 8-inch, 1-sided, single-density
+# FD 500K 8-inch, 2-sided, single-density
+# FE 1.2 MB 8-inch, 2-sided, double-density
+# F8 ----- Fixed disk
+#
+# FC xxxK Apricot 70x1x9 boot disk.
+#
+# Originally a bitmap:
+# xxxxxxx0 Not two sided
+# xxxxxxx1 Double sided
+# xxxxxx0x Not 8 SPT
+# xxxxxx1x 8 SPT
+# xxxxx0xx Not Removable drive
+# xxxxx1xx Removable drive
+# 11111xxx Must be one.
+#
+# But now it's rather random:
+# 111111xx Low density disk
+# 00 SS, Not 8 SPT
+# 01 DS, Not 8 SPT
+# 10 SS, 8 SPT
+# 11 DS, 8 SPT
+#
+# 11111001 Double density 3� floppy disk, high density 5�
+# 11110000 High density 3� floppy disk
+# 11111000 Hard disk any format
+#
+
+# CDROM Filesystems
+# Modified for UDF by gerardo.cacciari at gmail.com
+32769 string CD001
+!:mime application/x-iso9660-image
+>38913 string !NSR0 ISO 9660 CD-ROM filesystem data
+>38913 string NSR0 UDF filesystem data
+>>38917 string 1 (version 1.0)
+>>38917 string 2 (version 1.5)
+>>38917 string 3 (version 2.0)
+>>38917 byte >0x33 (unknown version, ID 0x%X)
+>>38917 byte <0x31 (unknown version, ID 0x%X)
+# "application id" which appears to be used as a volume label
+>32808 string >\0 '%s'
+>34816 string \000CD001\001EL\ TORITO\ SPECIFICATION (bootable)
+37633 string CD001 ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
+!:mime application/x-iso9660-image
+32776 string CDROM High Sierra CD-ROM filesystem data
+
+# .cso files
+0 string CISO Compressed ISO CD image
+
+# cramfs filesystem - russell at coker.com.au
+0 lelong 0x28cd3d45 Linux Compressed ROM File System data, little endian
+>4 lelong x size %lu
+>8 lelong &1 version #2
+>8 lelong &2 sorted_dirs
+>8 lelong &4 hole_support
+>32 lelong x CRC 0x%x,
+>36 lelong x edition %lu,
+>40 lelong x %lu blocks,
+>44 lelong x %lu files
+
+0 belong 0x28cd3d45 Linux Compressed ROM File System data, big endian
+>4 belong x size %lu
+>8 belong &1 version #2
+>8 belong &2 sorted_dirs
+>8 belong &4 hole_support
+>32 belong x CRC 0x%x,
+>36 belong x edition %lu,
+>40 belong x %lu blocks,
+>44 belong x %lu files
+
+# reiserfs - russell at coker.com.au
+0x10034 string ReIsErFs ReiserFS V3.5
+0x10034 string ReIsEr2Fs ReiserFS V3.6
+>0x1002c leshort x block size %d
+>0x10032 leshort &2 (mounted or unclean)
+>0x10000 lelong x num blocks %d
+>0x10040 lelong 1 tea hash
+>0x10040 lelong 2 yura hash
+>0x10040 lelong 3 r5 hash
+
+# JFFS - russell at coker.com.au
+0 lelong 0x34383931 Linux Journalled Flash File system, little endian
+0 belong 0x34383931 Linux Journalled Flash File system, big endian
+
+# EST flat binary format (which isn't, but anyway)
+# From: Mark Brown <broonie at sirena.org.uk>
+0 string ESTFBINR EST flat binary
+
+# Aculab VoIP firmware
+# From: Mark Brown <broonie at sirena.org.uk>
+0 string VoIP\ Startup\ and Aculab VoIP firmware
+>35 string x format %s
+
+# From: Mark Brown <broonie at sirena.org.uk> [old]
+# From: Behan Webster <behanw at websterwood.com>
+0 belong 0x27051956 u-boot legacy uImage,
+>32 string x %s,
+>28 byte 0 Invalid os/
+>28 byte 1 OpenBSD/
+>28 byte 2 NetBSD/
+>28 byte 3 FreeBSD/
+>28 byte 4 4.4BSD/
+>28 byte 5 Linux/
+>28 byte 6 SVR4/
+>28 byte 7 Esix/
+>28 byte 8 Solaris/
+>28 byte 9 Irix/
+>28 byte 10 SCO/
+>28 byte 11 Dell/
+>28 byte 12 NCR/
+>28 byte 13 LynxOS/
+>28 byte 14 VxWorks/
+>28 byte 15 pSOS/
+>28 byte 16 QNX/
+>28 byte 17 Firmware/
+>28 byte 18 RTEMS/
+>28 byte 19 ARTOS/
+>28 byte 20 Unity OS/
+>28 byte 21 INTEGRITY/
+>29 byte 0 \bInvalid CPU,
+>29 byte 1 \bAlpha,
+>29 byte 2 \bARM,
+>29 byte 3 \bIntel x86,
+>29 byte 4 \bIA64,
+>29 byte 5 \bMIPS,
+>29 byte 6 \bMIPS 64-bit,
+>29 byte 7 \bPowerPC,
+>29 byte 8 \bIBM S390,
+>29 byte 9 \bSuperH,
+>29 byte 10 \bSparc,
+>29 byte 11 \bSparc 64-bit,
+>29 byte 12 \bM68K,
+>29 byte 13 \bNios-32,
+>29 byte 14 \bMicroBlaze,
+>29 byte 15 \bNios-II,
+>29 byte 16 \bBlackfin,
+>29 byte 17 \bAVR32,
+>29 byte 18 \bSTMicroelectronics ST200,
+>30 byte 0 Invalid Image
+>30 byte 1 Standalone Program
+>30 byte 2 OS Kernel Image
+>30 byte 3 RAMDisk Image
+>30 byte 4 Multi-File Image
+>30 byte 5 Firmware Image
+>30 byte 6 Script File
+>30 byte 7 Filesystem Image (any type)
+>30 byte 8 Binary Flat Device Tree BLOB
+>31 byte 0 (Not compressed),
+>31 byte 1 (gzip),
+>31 byte 2 (bzip2),
+>31 byte 3 (lzma),
+>12 belong x %d bytes,
+>8 bedate x %s,
+>16 belong x Load Address: 0x%08X,
+>20 belong x Entry Point: 0x%08X,
+>4 belong x Header CRC: 0x%08X,
+>24 belong x Data CRC: 0x%08X
+
+# JFFS2 file system
+0 leshort 0x1984 Linux old jffs2 filesystem data little endian
+0 leshort 0x1985 Linux jffs2 filesystem data little endian
+
+# Squashfs
+0 string sqsh Squashfs filesystem, big endian,
+>28 beshort x version %d.
+>30 beshort x \b%d,
+>28 beshort <3
+>>8 belong x %d bytes,
+>28 beshort >2
+>>28 beshort <4
+>>>63 bequad x %lld bytes,
+>>28 beshort >3
+>>>40 bequad x %lld bytes,
+#>>67 belong x %d bytes,
+>4 belong x %d inodes,
+>28 beshort <2
+>>32 beshort x blocksize: %d bytes,
+>28 beshort >1
+>>28 beshort <4
+>>>51 belong x blocksize: %d bytes,
+>>28 beshort >3
+>>>12 belong x blocksize: %d bytes,
+>28 beshort <4
+>>39 bedate x created: %s
+>28 beshort >3
+>>8 bedate x created: %s
+0 string hsqs Squashfs filesystem, little endian,
+>28 leshort x version %d.
+>30 leshort x \b%d,
+>28 leshort <3
+>>8 lelong x %d bytes,
+>28 leshort >2
+>>28 leshort <4
+>>>63 lequad x %lld bytes,
+>>28 leshort >3
+>>>40 lequad x %lld bytes,
+#>>63 lelong x %d bytes,
+>4 lelong x %d inodes,
+>28 leshort <2
+>>32 leshort x blocksize: %d bytes,
+>28 leshort >1
+>>28 leshort <4
+>>>51 lelong x blocksize: %d bytes,
+>>28 leshort >3
+>>>12 lelong x blocksize: %d bytes,
+>28 leshort <4
+>>39 ledate x created: %s
+>28 leshort >3
+>>8 ledate x created: %s
+
+0 string td\000 floppy image data (TeleDisk)
+
+# AFS Dump Magic
+# From: Ty Sarna <tsarna at sarna.org>
+0 string \x01\xb3\xa1\x13\x22 AFS Dump
+>&0 belong x (v%d)
+>>&0 byte 0x76
+>>>&0 belong x Vol %d,
+>>>>&0 byte 0x6e
+>>>>>&0 string x %s
+>>>>>>&1 byte 0x74
+>>>>>>>&0 beshort 2
+>>>>>>>>&4 bedate x on: %s
+>>>>>>>>&0 bedate =0 full dump
+>>>>>>>>&0 bedate !0 incremental since: %s
+
+#----------------------------------------------------------
+#delta ISO Daniel Novotny (dnovotny at redhat.com)
+0 string DISO Delta ISO data
+>4 belong x version %d
+
+# VMS backup savesets - gerardo.cacciari at gmail.com
+#
+4 string \x01\x00\x01\x00\x01\x00
+>(0.s+16) string \x01\x01
+>>&(&0.b+8) byte 0x42 OpenVMS backup saveset data
+>>>40 lelong x (block size %d,
+>>>49 string >\0 original name '%s',
+>>>2 short 1024 VAX generated)
+>>>2 short 2048 AXP generated)
+>>>2 short 4096 I64 generated)
+
+# Summary: Oracle Clustered Filesystem
+# Created by: Aaron Botsis <redhat at digitalmafia.org>
+8 string OracleCFS Oracle Clustered Filesystem,
+>4 long x rev %d
+>0 long x \b.%d,
+>560 string x label: %.64s,
+>136 string x mountpoint: %.128s
+
+# Summary: Oracle ASM tagged volume
+# Created by: Aaron Botsis <redhat at digitalmafia.org>
+32 string ORCLDISK Oracle ASM Volume,
+>40 string x Disk Name: %0.12s
+32 string ORCLCLRD Oracle ASM Volume (cleared),
+>40 string x Disk Name: %0.12s
+
+# Oracle Clustered Filesystem - Aaron Botsis <redhat at digitalmafia.org>
+8 string OracleCFS Oracle Clustered Filesystem,
+>4 long x rev %d
+>0 long x \b.%d,
+>560 string x label: %.64s,
+>136 string x mountpoint: %.128s
+
+# Oracle ASM tagged volume - Aaron Botsis <redhat at digitalmafia.org>
+32 string ORCLDISK Oracle ASM Volume,
+>40 string x Disk Name: %0.12s
+32 string ORCLCLRD Oracle ASM Volume (cleared),
+>40 string x Disk Name: %0.12s
+
+# Compaq/HP RILOE floppy image
+# From: Dirk Jagdmann <doj at cubic.org>
+0 string CPQRFBLO Compaq/HP RILOE floppy image
+
+#------------------------------------------------------------------------------
+# Files-11 On-Disk Structure (OpenVMS file system) - gerardo.cacciari at gmail.com
+# These bits come from LBN 1 (home block) of ODS-2 and ODS-5 volumes, which is
+# mapped to VBN 2 of [000000]INDEXF.SYS;1
+#
+1008 string DECFILE11B Files-11 On-Disk Structure
+>525 byte x Level %d
+>525 byte x (ODS-%d OpenVMS file system),
+>984 string x volume label is '%-12.12s'
+
+# From: Thomas Klausner <wiz at NetBSD.org>
+# http://filext.com/file-extension/DAA
+# describes the daa file format. The magic would be:
+0 string DAA\x0\x0\x0\x0\x0 PowerISO Direct-Access-Archive
+
+# From Albert Cahalan <acahalan at gmail.com>
+# really le32 operation,destination,payloadsize (but quite predictable)
+# 01 00 00 00 00 00 00 c0 00 02 00 00
+0 string \1\0\0\0\0\0\0\300\0\2\0\0 Marvell Libertas firmware
+
+# From Eric Sandeen
+# GFS2
+0x10000 belong 0x01161970 Linux
+>0x10018 belong 0x0000051d GFS1 Filesystem
+>>0x10024 belong x (blocksize %d,
+>>0x10060 string >\0 lockproto %s)
+>0x10018 belong 0x00000709 GFS2 Filesystem
+>>0x10024 belong x (blocksize %d,
+>>0x10060 string >\0 lockproto %s)
+
+# BTRFS
+0x10040 string _BHRfS_M BTRFS Filesystem
+>0x1012b string >\0 (label "%s",
+>0x10090 lelong x sectorsize %d,
+>0x10094 lelong x nodesize %d,
+>0x10098 lelong x leafsize %d)
+
+
+# dvdisaster's .ecc
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string *dvdisaster* dvdisaster error correction file
+
+# xfs metadump image
+# mb_magic XFSM at 0; superblock magic XFSB at 1 << mb_blocklog
+# but can we do the << ? For now it's always 512 (0x200) anyway.
+0 string XFSM
+>0x200 string XFSB XFS filesystem metadump image
+
+
+#------------------------------------------------------------------------------
+# $File: flash,v 1.9 2009/11/08 01:30:01 christos Exp $
+# flash: file(1) magic for Macromedia Flash file format
+#
+# See
+#
+# http://www.macromedia.com/software/flash/open/
+#
+0 string FWS Macromedia Flash data,
+>3 byte x version %d
+!:mime application/x-shockwave-flash
+0 string CWS Macromedia Flash data (compressed),
+!:mime application/x-shockwave-flash
+>3 byte x version %d
+# From: Cal Peake <cp at absolutedigital.net>
+0 string FLV Macromedia Flash Video
+!:mime video/x-flv
+
+#
+# Yosu Gomez
+0 string AGD2\xbe\xb8\xbb\xcd\x00 Macromedia Freehand 7 Document
+0 string AGD3\xbe\xb8\xbb\xcc\x00 Macromedia Freehand 8 Document
+# From Dave Wilson
+0 string AGD4\xbe\xb8\xbb\xcb\x00 Macromedia Freehand 9 Document
+
+#------------------------------------------------------------------------------
+# $File: fonts,v 1.21 2009/12/06 23:17:52 rrt Exp $
+# fonts: file(1) magic for font data
+#
+0 search/1 FONT ASCII vfont text
+0 short 0436 Berkeley vfont data
+0 short 017001 byte-swapped Berkeley vfont data
+
+# PostScript fonts (must precede "printer" entries), quinlan at yggdrasil.com
+0 string %!PS-AdobeFont-1. PostScript Type 1 font text
+>20 string >\0 (%s)
+6 string %!PS-AdobeFont-1. PostScript Type 1 font program data
+0 string %!FontType1 PostScript Type 1 font program data
+6 string %!FontType1 PostScript Type 1 font program data
+0 string %!PS-Adobe-3.0\ Resource-Font PostScript Type 1 font text
+
+# X11 font files in SNF (Server Natural Format) format
+0 belong 00000004 X11 SNF font data, MSB first
+0 lelong 00000004 X11 SNF font data, LSB first
+
+# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+0 search/1 STARTFONT\ X11 BDF font text
+
+# X11 fonts, from Daniel Quinlan (quinlan at yggdrasil.com)
+# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
+0 string \001fcp X11 Portable Compiled Font data
+>12 byte 0x02 \b, LSB first
+>12 byte 0x0a \b, MSB first
+0 string D1.0\015 X11 Speedo font data
+
+#------------------------------------------------------------------------------
+# FIGlet fonts and controlfiles
+# From figmagic supplied with Figlet version 2.2
+# "David E. O'Brien" <obrien at FreeBSD.ORG>
+0 string flf FIGlet font
+>3 string >2a version %-2.2s
+0 string flc FIGlet controlfile
+>3 string >2a version %-2.2s
+
+# libGrx graphics lib fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
+0 belong 0x14025919 libGrx font data,
+>8 leshort x %dx
+>10 leshort x \b%d
+>40 string x %s
+# Misc. DOS VGA fonts, from Albert Cahalan (acahalan at cs.uml.edu)
+0 belong 0xff464f4e DOS code page font data collection
+7 belong 0x00454741 DOS code page font data
+7 belong 0x00564944 DOS code page font data (from Linux?)
+4098 string DOSFONT DOSFONT2 encrypted font data
+
+# downloadable fonts for browser (prints type) anthon at mnt.org
+0 string PFR1 PFR1 font
+>102 string >0 \b: %s
+
+# True Type fonts
+0 string \000\001\000\000\000 TrueType font data
+!:mime application/x-font-ttf
+
+0 string \007\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font
+0 string \012\001\001\000Copyright\ (c)\ 199 Adobe Multiple Master font
+
+0 string ttcf TrueType font collection data
+
+# Opentype font data from Avi Bercovich
+0 string OTTO OpenType font data
+!:mime application/vnd.ms-opentype
+
+# Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+0 string SplineFontDB: Spline Font Database
+!:mime application/vnd.font-fontforge-sfd
+>14 string x version %s
+
+#------------------------------------------------------------------------------
+# $File: fortran,v 1.6 2009/09/19 16:28:09 christos Exp $
+# FORTRAN source
+0 regex/100 \^[Cc][\ \t] FORTRAN program
+!:mime text/x-fortran
+
+#------------------------------------------------------------------------------
+# $File: frame,v 1.12 2009/09/19 16:28:09 christos Exp $
+# frame: file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+# Note that this is the Framemaker Maker Interchange Format, not the
+# Normal format which would be application/vnd.framemaker.
+#
+0 string \<MakerFile FrameMaker document
+!:mime application/x-mif
+>11 string 5.5 (5.5
+>11 string 5.0 (5.0
+>11 string 4.0 (4.0
+>11 string 3.0 (3.0
+>11 string 2.0 (2.0
+>11 string 1.0 (1.0
+>14 byte x %c)
+0 string \<MIFFile FrameMaker MIF (ASCII) file
+!:mime application/x-mif
+>9 string 4.0 (4.0)
+>9 string 3.0 (3.0)
+>9 string 2.0 (2.0)
+>9 string 1.0 (1.x)
+0 search/1 \<MakerDictionary FrameMaker Dictionary text
+!:mime application/x-mif
+>17 string 3.0 (3.0)
+>17 string 2.0 (2.0)
+>17 string 1.0 (1.x)
+0 string \<MakerScreenFont FrameMaker Font file
+!:mime application/x-mif
+>17 string 1.01 (%s)
+0 string \<MML FrameMaker MML file
+!:mime application/x-mif
+0 string \<BookFile FrameMaker Book file
+!:mime application/x-mif
+>10 string 3.0 (3.0
+>10 string 2.0 (2.0
+>10 string 1.0 (1.0
+>13 byte x %c)
+# XXX - this book entry should be verified, if you find one, uncomment this
+#0 string \<Book\ FrameMaker Book (ASCII) file
+#!:mime application/x-mif
+#>6 string 3.0 (3.0)
+#>6 string 2.0 (2.0)
+#>6 string 1.0 (1.0)
+0 string \<Maker Intermediate Print File FrameMaker IPL file
+!:mime application/x-mif
+
+#------------------------------------------------------------------------------
+# $File: freebsd,v 1.7 2009/09/19 16:28:09 christos Exp $
+# freebsd: file(1) magic for FreeBSD objects
+#
+# All new-style FreeBSD magic numbers are in host byte order (i.e.,
+# little-endian on x86).
+#
+# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
+# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
+# schemes for distinguishing between executable images, shared libraries,
+# and object files.
+#
+# FreeBSD says:
+#
+# Regardless of whether it's pure, demand-paged, or none of the
+# above:
+#
+# if the entry point is < 4096, then it's a shared library if
+# the "has run-time loader information" bit is set, and is
+# position-independent if the "is position-independent" bit
+# is set;
+#
+# if the entry point is >= 4096 (or >4095, same thing), then it's
+# an executable, and is dynamically-linked if the "has run-time
+# loader information" bit is set.
+#
+# On x86, NetBSD says:
+#
+# If it's neither pure nor demand-paged:
+#
+# if it has the "has run-time loader information" bit set, it's
+# a dynamically-linked executable;
+#
+# if it doesn't have that bit set, then:
+#
+# if it has the "is position-independent" bit set, it's
+# position-independent;
+#
+# if the entry point is non-zero, it's an executable, otherwise
+# it's an object file.
+#
+# If it's pure:
+#
+# if it has the "has run-time loader information" bit set, it's
+# a dynamically-linked executable, otherwise it's just an
+# executable.
+#
+# If it's demand-paged:
+#
+# if it has the "has run-time loader information" bit set,
+# then:
+#
+# if the entry point is < 4096, it's a shared library;
+#
+# if the entry point is = 4096 or > 4096 (i.e., >= 4096),
+# it's a dynamically-linked executable);
+#
+# if it doesn't have the "has run-time loader information" bit
+# set, then it's just an executable.
+#
+# (On non-x86, NetBSD does much the same thing, except that it uses
+# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
+# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
+# had 8K pages; dunno about MIPS.)
+#
+# I suspect the two will differ only in perverse and uninteresting cases
+# ("shared" libraries that aren't demand-paged and whose pages probably
+# won't actually be shared, executables with entry points <4096).
+#
+# I leave it to those more familiar with FreeBSD and NetBSD to figure out
+# what the right answer is (although using ">4095", FreeBSD-style, is
+# probably better than separately checking for "=4096" and ">4096",
+# NetBSD-style). (The old "netbsd" file analyzed FreeBSD demand paged
+# executables using the NetBSD technique.)
+#
+0 lelong&0377777777 041400407 FreeBSD/i386
+>20 lelong <4096
+>>3 byte&0xC0 &0x80 shared library
+>>3 byte&0xC0 0x40 PIC object
+>>3 byte&0xC0 0x00 object
+>20 lelong >4095
+>>3 byte&0x80 0x80 dynamically linked executable
+>>3 byte&0x80 0x00 executable
+>16 lelong >0 not stripped
+
+0 lelong&0377777777 041400410 FreeBSD/i386 pure
+>20 lelong <4096
+>>3 byte&0xC0 &0x80 shared library
+>>3 byte&0xC0 0x40 PIC object
+>>3 byte&0xC0 0x00 object
+>20 lelong >4095
+>>3 byte&0x80 0x80 dynamically linked executable
+>>3 byte&0x80 0x00 executable
+>16 lelong >0 not stripped
+
+0 lelong&0377777777 041400413 FreeBSD/i386 demand paged
+>20 lelong <4096
+>>3 byte&0xC0 &0x80 shared library
+>>3 byte&0xC0 0x40 PIC object
+>>3 byte&0xC0 0x00 object
+>20 lelong >4095
+>>3 byte&0x80 0x80 dynamically linked executable
+>>3 byte&0x80 0x00 executable
+>16 lelong >0 not stripped
+
+0 lelong&0377777777 041400314 FreeBSD/i386 compact demand paged
+>20 lelong <4096
+>>3 byte&0xC0 &0x80 shared library
+>>3 byte&0xC0 0x40 PIC object
+>>3 byte&0xC0 0x00 object
+>20 lelong >4095
+>>3 byte&0x80 0x80 dynamically linked executable
+>>3 byte&0x80 0x00 executable
+>16 lelong >0 not stripped
+
+# XXX gross hack to identify core files
+# cores start with a struct tss; we take advantage of the following:
+# byte 7: highest byte of the kernel stack pointer, always 0xfe
+# 8/9: kernel (ring 0) ss value, always 0x0010
+# 10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
+# 28: low order byte of the current PTD entry, always 0 since the
+# PTD is page-aligned
+#
+7 string \357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 FreeBSD/i386 a.out core file
+>1039 string >\0 from '%s'
+
+# /var/run/ld.so.hints
+# What are you laughing about?
+0 lelong 011421044151 ld.so hints file (Little Endian
+>4 lelong >0 \b, version %d)
+>4 belong <1 \b)
+0 belong 011421044151 ld.so hints file (Big Endian
+>4 belong >0 \b, version %d)
+>4 belong <1 \b)
+
+#
+# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
+#
+0 string SCRSHOT_ scrshot(1) screenshot,
+>8 byte x version %d,
+>9 byte 2 %d bytes in header,
+>>10 byte x %d chars wide by
+>>11 byte x %d chars high
+
+#------------------------------------------------------------------------------
+# $File: fsav,v 1.11 2009/09/19 16:28:09 christos Exp $
+# fsav: file(1) magic for datafellows fsav virus definition files
+# Anthon van der Neut (anthon at mnt.org)
+
+# ftp://ftp.f-prot.com/pub/{macrdef2.zip,nomacro.def}
+0 beshort 0x1575 fsav macro virus signatures
+>8 leshort >0 (%d-
+>11 byte >0 \b%02d-
+>10 byte >0 \b%02d)
+# ftp://ftp.f-prot.com/pub/sign.zip
+#10 ubyte <12
+#>9 ubyte <32
+#>>8 ubyte 0x0a
+#>>>12 ubyte 0x07
+#>>>>11 uleshort >0 fsav DOS/Windows virus signatures (%d-
+#>>>>10 byte 0 \b01-
+#>>>>10 byte 1 \b02-
+#>>>>10 byte 2 \b03-
+#>>>>10 byte 3 \b04-
+#>>>>10 byte 4 \b05-
+#>>>>10 byte 5 \b06-
+#>>>>10 byte 6 \b07-
+#>>>>10 byte 7 \b08-
+#>>>>10 byte 8 \b09-
+#>>>>10 byte 9 \b10-
+#>>>>10 byte 10 \b11-
+#>>>>10 byte 11 \b12-
+#>>>>9 ubyte >0 \b%02d)
+# ftp://ftp.f-prot.com/pub/sign2.zip
+#0 ubyte 0x62
+#>1 ubyte 0xF5
+#>>2 ubyte 0x1
+#>>>3 ubyte 0x1
+#>>>>4 ubyte 0x0e
+#>>>>>13 ubyte >0 fsav virus signatures
+#>>>>>>11 ubyte x size 0x%02x
+#>>>>>>12 ubyte x \b%02x
+#>>>>>>13 ubyte x \b%02x bytes
+
+# Joerg Jenderek: joerg dot jenderek at web dot de
+# http://www.clamav.net/doc/latest/html/node45.html
+# .cvd files start with a 512 bytes colon separated header
+# ClamAV-VDB:buildDate:version:signaturesNumbers:functionalityLevelRequired:MD5:Signature:builder:buildTime
+# + gzipped tarball files
+0 string ClamAV-VDB:
+>11 string >\0 Clam AntiVirus database %-.23s
+>>34 string :
+>>>35 string !: \b, version
+>>>>35 string x \b%-.1s
+>>>>>36 string !:
+>>>>>>36 string x \b%-.1s
+>>>>>>>37 string !:
+>>>>>>>>37 string x \b%-.1s
+>>>>>>>>>38 string !:
+>>>>>>>>>>38 string x \b%-.1s
+>512 string \037\213 \b, gzipped
+>769 string ustar\0 \b, tarred
+
+# Type: Grisoft AVG AntiVirus
+# From: David Newgas <david at newgas.net>
+0 string AVG7_ANTIVIRUS_VAULT_FILE AVG 7 Antivirus vault file data
+
+#------------------------------------------------------------------------------
+# $File: games,v 1.8 2009/09/19 16:28:09 christos Exp $
+# games: file(1) for games
+
+# Fabio Bonelli <fabiobonelli at libero.it>
+# Quake II - III data files
+0 string IDP2 Quake II 3D Model file,
+>20 long x %lu skin(s),
+>8 long x (%lu x
+>12 long x %lu),
+>40 long x %lu frame(s),
+>16 long x Frame size %lu bytes,
+>24 long x %lu vertices/frame,
+>28 long x %lu texture coordinates,
+>32 long x %lu triangles/frame
+
+0 string IBSP Quake
+>4 long 0x26 II Map file (BSP)
+>4 long 0x2E III Map file (BSP)
+
+0 string IDS2 Quake II SP2 sprite file
+
+#---------------------------------------------------------------------------
+# Doom and Quake
+# submitted by Nicolas Patrois
+
+0 string \xcb\x1dBoom\xe6\xff\x03\x01 Boom or linuxdoom demo
+# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01
+
+24 string LxD\ 203 Linuxdoom save
+>0 string x , name=%s
+>44 string x , world=%s
+
+# Quake
+
+0 string PACK Quake I or II world or extension
+
+#0 string -1\x0a Quake I demo
+#>30 string x version %.4s
+#>61 string x level %s
+
+#0 string 5\x0a Quake I save
+
+# The levels
+
+# Quake 1
+
+0 string 5\x0aIntroduction Quake I save: start Introduction
+0 string 5\x0athe_Slipgate_Complex Quake I save: e1m1 The slipgate complex
+0 string 5\x0aCastle_of_the_Damned Quake I save: e1m2 Castle of the damned
+0 string 5\x0athe_Necropolis Quake I save: e1m3 The necropolis
+0 string 5\x0athe_Grisly_Grotto Quake I save: e1m4 The grisly grotto
+0 string 5\x0aZiggurat_Vertigo Quake I save: e1m8 Ziggurat vertigo (secret)
+0 string 5\x0aGloom_Keep Quake I save: e1m5 Gloom keep
+0 string 5\x0aThe_Door_To_Chthon Quake I save: e1m6 The door to Chthon
+0 string 5\x0aThe_House_of_Chthon Quake I save: e1m7 The house of Chthon
+0 string 5\x0athe_Installation Quake I save: e2m1 The installation
+0 string 5\x0athe_Ogre_Citadel Quake I save: e2m2 The ogre citadel
+0 string 5\x0athe_Crypt_of_Decay Quake I save: e2m3 The crypt of decay (dopefish lives!)
+0 string 5\x0aUnderearth Quake I save: e2m7 Underearth (secret)
+0 string 5\x0athe_Ebon_Fortress Quake I save: e2m4 The ebon fortress
+0 string 5\x0athe_Wizard's_Manse Quake I save: e2m5 The wizard's manse
+0 string 5\x0athe_Dismal_Oubliette Quake I save: e2m6 The dismal oubliette
+0 string 5\x0aTermination_Central Quake I save: e3m1 Termination central
+0 string 5\x0aVaults_of_Zin Quake I save: e3m2 Vaults of Zin
+0 string 5\x0athe_Tomb_of_Terror Quake I save: e3m3 The tomb of terror
+0 string 5\x0aSatan's_Dark_Delight Quake I save: e3m4 Satan's dark delight
+0 string 5\x0athe_Haunted_Halls Quake I save: e3m7 The haunted halls (secret)
+0 string 5\x0aWind_Tunnels Quake I save: e3m5 Wind tunnels
+0 string 5\x0aChambers_of_Torment Quake I save: e3m6 Chambers of torment
+0 string 5\x0athe_Sewage_System Quake I save: e4m1 The sewage system
+0 string 5\x0aThe_Tower_of_Despair Quake I save: e4m2 The tower of despair
+0 string 5\x0aThe_Elder_God_Shrine Quake I save: e4m3 The elder god shrine
+0 string 5\x0athe_Palace_of_Hate Quake I save: e4m4 The palace of hate
+0 string 5\x0aHell's_Atrium Quake I save: e4m5 Hell's atrium
+0 string 5\x0athe_Nameless_City Quake I save: e4m8 The nameless city (secret)
+0 string 5\x0aThe_Pain_Maze Quake I save: e4m6 The pain maze
+0 string 5\x0aAzure_Agony Quake I save: e4m7 Azure agony
+0 string 5\x0aShub-Niggurath's_Pit Quake I save: end Shub-Niggurath's pit
+
+# Quake DeathMatch levels
+
+0 string 5\x0aPlace_of_Two_Deaths Quake I save: dm1 Place of two deaths
+0 string 5\x0aClaustrophobopolis Quake I save: dm2 Claustrophobopolis
+0 string 5\x0aThe_Abandoned_Base Quake I save: dm3 The abandoned base
+0 string 5\x0aThe_Bad_Place Quake I save: dm4 The bad place
+0 string 5\x0aThe_Cistern Quake I save: dm5 The cistern
+0 string 5\x0aThe_Dark_Zone Quake I save: dm6 The dark zone
+
+# Scourge of Armagon
+
+0 string 5\x0aCommand_HQ Quake I save: start Command HQ
+0 string 5\x0aThe_Pumping_Station Quake I save: hip1m1 The pumping station
+0 string 5\x0aStorage_Facility Quake I save: hip1m2 Storage facility
+0 string 5\x0aMilitary_Complex Quake I save: hip1m5 Military complex (secret)
+0 string 5\x0athe_Lost_Mine Quake I save: hip1m3 The lost mine
+0 string 5\x0aResearch_Facility Quake I save: hip1m4 Research facility
+0 string 5\x0aAncient_Realms Quake I save: hip2m1 Ancient realms
+0 string 5\x0aThe_Gremlin's_Domain Quake I save: hip2m6 The gremlin's domain (secret)
+0 string 5\x0aThe_Black_Cathedral Quake I save: hip2m2 The black cathedral
+0 string 5\x0aThe_Catacombs Quake I save: hip2m3 The catacombs
+0 string 5\x0athe_Crypt__ Quake I save: hip2m4 The crypt
+0 string 5\x0aMortum's_Keep Quake I save: hip2m5 Mortum's keep
+0 string 5\x0aTur_Torment Quake I save: hip3m1 Tur torment
+0 string 5\x0aPandemonium Quake I save: hip3m2 Pandemonium
+0 string 5\x0aLimbo Quake I save: hip3m3 Limbo
+0 string 5\x0athe_Edge_of_Oblivion Quake I save: hipdm1 The edge of oblivion (secret)
+0 string 5\x0aThe_Gauntlet Quake I save: hip3m4 The gauntlet
+0 string 5\x0aArmagon's_Lair Quake I save: hipend Armagon's lair
+
+# Malice
+
+0 string 5\x0aThe_Academy Quake I save: start The academy
+0 string 5\x0aThe_Lab Quake I save: d1 The lab
+0 string 5\x0aArea_33 Quake I save: d1b Area 33
+0 string 5\x0aSECRET_MISSIONS Quake I save: d3b Secret missions
+0 string 5\x0aThe_Hospital Quake I save: d10 The hospital (secret)
+0 string 5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)
+0 string 5\x0aBACK_2_MALICE Quake I save: d4b Back to Malice
+0 string 5\x0aArea44 Quake I save: d1c Area 44
+0 string 5\x0aTakahiro_Towers Quake I save: d2 Takahiro towers
+0 string 5\x0aA_Rat's_Life Quake I save: d3 A rat's life
+0 string 5\x0aInto_The_Flood Quake I save: d4 Into the flood
+0 string 5\x0aThe_Flood Quake I save: d5 The flood
+0 string 5\x0aNuclear_Plant Quake I save: d6 Nuclear plant
+0 string 5\x0aThe_Incinerator_Plant Quake I save: d7 The incinerator plant
+0 string 5\x0aThe_Foundry Quake I save: d7b The foundry
+0 string 5\x0aThe_Underwater_Base Quake I save: d8 The underwater base
+0 string 5\x0aTakahiro_Base Quake I save: d9 Takahiro base
+0 string 5\x0aTakahiro_Laboratories Quake I save: d12 Takahiro laboratories
+0 string 5\x0aStayin'_Alive Quake I save: d13 Stayin' alive
+0 string 5\x0aB.O.S.S._HQ Quake I save: d14 B.O.S.S. HQ
+0 string 5\x0aSHOWDOWN! Quake I save: d15 Showdown!
+
+# Malice DeathMatch levels
+
+0 string 5\x0aThe_Seventh_Precinct Quake I save: ddm1 The seventh precinct
+0 string 5\x0aSub_Station Quake I save: ddm2 Sub station
+0 string 5\x0aCrazy_Eights! Quake I save: ddm3 Crazy eights!
+0 string 5\x0aEast_Side_Invertationa Quake I save: ddm4 East side invertationa
+0 string 5\x0aSlaughterhouse Quake I save: ddm5 Slaughterhouse
+0 string 5\x0aDOMINO Quake I save: ddm6 Domino
+0 string 5\x0aSANDRA'S_LADDER Quake I save: ddm7 Sandra's ladder
+
+
+0 string MComprHD MAME CHD compressed hard disk image,
+>12 belong x version %lu
+
+# doom - submitted by Jon Dowland
+
+0 string =IWAD doom main IWAD data
+>4 lelong x containing %d lumps
+0 string =PWAD doom patch PWAD data
+>4 lelong x containing %d lumps
+
+
+# Summary: Warcraft 3 save
+# Extension: .w3g
+# Created by: "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string Warcraft\ III\ recorded\ game %s
+
+
+# Summary: Warcraft 3 map
+# Extension: .w3m
+# Created by: "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string HM3W Warcraft III map file
+
+
+# Summary: SGF Smart Game Format
+# Extension: .sgf
+# Reference: http://www.red-bean.com/sgf/
+# Created by: Eduardo Sabbatella <eduardo_sabbatella at yahoo.com.ar>
+# Modified by (1): Abel Cheung (regex, more game format)
+# FIXME: Some games don't have GM (game type)
+0 regex \\(;.*GM\\[[0-9]{1,2}\\] Smart Game Format
+>2 search/0x200 GM[
+>>&0 string 1] (Go)
+>>&0 string 2] (Othello)
+>>&0 string 3] (chess)
+>>&0 string 4] (Gomoku+Renju)
+>>&0 string 5] (Nine Men's Morris)
+>>&0 string 6] (Backgammon)
+>>&0 string 7] (Chinese chess)
+>>&0 string 8] (Shogi)
+>>&0 string 9] (Lines of Action)
+>>&0 string 10] (Ataxx)
+>>&0 string 11] (Hex)
+>>&0 string 12] (Jungle)
+>>&0 string 13] (Neutron)
+>>&0 string 14] (Philosopher's Football)
+>>&0 string 15] (Quadrature)
+>>&0 string 16] (Trax)
+>>&0 string 17] (Tantrix)
+>>&0 string 18] (Amazons)
+>>&0 string 19] (Octi)
+>>&0 string 20] (Gess)
+>>&0 string 21] (Twixt)
+>>&0 string 22] (Zertz)
+>>&0 string 23] (Plateau)
+>>&0 string 24] (Yinsh)
+>>&0 string 25] (Punct)
+>>&0 string 26] (Gobblet)
+>>&0 string 27] (hive)
+>>&0 string 28] (Exxit)
+>>&0 string 29] (Hnefatal)
+>>&0 string 30] (Kuba)
+>>&0 string 31] (Tripples)
+>>&0 string 32] (Chase)
+>>&0 string 33] (Tumbling Down)
+>>&0 string 34] (Sahara)
+>>&0 string 35] (Byte)
+>>&0 string 36] (Focus)
+>>&0 string 37] (Dvonn)
+>>&0 string 38] (Tamsk)
+>>&0 string 39] (Gipf)
+>>&0 string 40] (Kropki)
+
+
+# Summary: Civilization 4 video
+# Extension: .bik
+# Created by: Abel Cheung <abelcheung at gmail.com>
+0 string BIKi Civilization 4 Video
+
+
+##############################################
+# NetImmerse/Gamebryo game engine entries
+
+# Summary: Gamebryo game engine file
+# Extension: .nif, .kf
+# Created by: Abel Cheung <abelcheung at gmail.com>
+0 string Gamebryo\ File\ Format,\ Version\ Gamebryo game engine file
+>&0 regex [0-9a-z.]+ \b, version %s
+
+# Summary: Gamebryo game engine file
+# Extension: .kfm
+# Created by: Abel Cheung <abelcheung at gmail.com>
+0 string ;Gamebryo\ KFM\ File\ Version\ Gamebryo game engine animation File
+>&0 regex [0-9a-z.]+ \b, version %s
+
+# Summary: NetImmerse game engine file
+# Extension .nif
+# Created by: Abel Cheung <abelcheung at gmail.com>
+0 string NetImmerse\ File\ Format,\ Versio
+>&0 string n\ NetImmerse game engine file
+>>&0 regex [0-9a-z.]+ \b, version %s
+
+
+#------------------------------------------------------------------------------
+# $File: gcc,v 1.4 2009/09/19 16:28:09 christos Exp $
+# gcc: file(1) magic for GCC special files
+#
+0 string gpch GCC precompiled header
+
+# The version field is annoying. It's 3 characters, not zero-terminated.
+>5 byte x (version %c
+>6 byte x \b%c
+>7 byte x \b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4 byte 67 for C
+>4 byte 111 for Objective C
+>4 byte 43 for C++
+>4 byte 79 for Objective C++
+
+#------------------------------------------------------------------------------
+# $File: geos,v 1.4 2009/09/19 16:28:09 christos Exp $
+# GEOS files (Vidar Madsen, vidar at gimp.org)
+# semi-commonly used in embedded and handheld systems.
+0 belong 0xc745c153 GEOS
+>40 byte 1 executable
+>40 byte 2 VMFile
+>40 byte 3 binary
+>40 byte 4 directory label
+>40 byte <1 unknown
+>40 byte >4 unknown
+>4 string >\0 \b, name "%s"
+#>44 short x \b, version %d
+#>46 short x \b.%d
+#>48 short x \b, rev %d
+#>50 short x \b.%d
+#>52 short x \b, proto %d
+#>54 short x \br%d
+#>168 string >\0 \b, copyright "%s"
+
+#------------------------------------------------------------------------------
+# $File: gimp,v 1.6 2009/09/19 16:28:09 christos Exp $
+# GIMP Gradient: file(1) magic for the GIMP's gradient data files
+# by Federico Mena <federico at nuclecu.unam.mx>
+
+0 string GIMP\ Gradient GIMP gradient data
+
+#------------------------------------------------------------------------------
+# XCF: file(1) magic for the XCF image format used in the GIMP developed
+# by Spencer Kimball and Peter Mattis
+# ('Bucky' LaDieu, nega at vt.edu)
+
+0 string gimp\ xcf GIMP XCF image data,
+>9 string file version 0,
+>9 string v version
+>>10 string >\0 %s,
+>14 belong x %lu x
+>18 belong x %lu,
+>22 belong 0 RGB Color
+>22 belong 1 Greyscale
+>22 belong 2 Indexed Color
+>22 belong >2 Unknown Image Type.
+
+#------------------------------------------------------------------------------
+# XCF: file(1) magic for the patterns used in the GIMP, developed
+# by Spencer Kimball and Peter Mattis
+# ('Bucky' LaDieu, nega at vt.edu)
+
+20 string GPAT GIMP pattern data,
+>24 string x %s
+
+#------------------------------------------------------------------------------
+# XCF: file(1) magic for the brushes used in the GIMP, developed
+# by Spencer Kimball and Peter Mattis
+# ('Bucky' LaDieu, nega at vt.edu)
+
+20 string GIMP GIMP brush data
+
+# GIMP Curves File
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+0 string #\040GIMP\040Curves\040File GIMP curve file
+
+#------------------------------------------------------------------------------
+# $File: gnome-keyring,v 1.2 2009/09/19 16:28:09 christos Exp $
+# GNOME keyring
+# Contributed by Josh Triplett
+# FIXME: Could be simplified if pstring supported two-byte counts
+0 string GnomeKeyring\n\r\0\n GNOME keyring
+>&0 ubyte 0 \b, major version 0
+>>&0 ubyte 0 \b, minor version 0
+>>>&0 ubyte 0 \b, crypto type 0 (AEL)
+>>>&0 ubyte >0 \b, crypto type %hhu (unknown)
+>>>&1 ubyte 0 \b, hash type 0 (MD5)
+>>>&1 ubyte >0 \b, hash type %hhu (unknown)
+>>>&2 ubelong 0xFFFFFFFF \b, name NULL
+>>>&2 ubelong !0xFFFFFFFF
+>>>>&-4 ubelong >255 \b, name too long for file's pstring type
+>>>>&-4 ubelong <256
+>>>>>&-1 pstring x \b, name "%s"
+>>>>>>&0 ubeqdate x \b, last modified %s
+>>>>>>&8 ubeqdate x \b, created %s
+>>>>>>&16 ubelong &1
+>>>>>>>&0 ubelong x \b, locked if idle for %u seconds
+>>>>>>&16 ubelong ^1 \b, not locked if idle
+>>>>>>&24 ubelong x \b, hash iterations %u
+>>>>>>&28 ubequad x \b, salt %llu
+>>>>>>&52 ubelong x \b, %u item(s)
+
+#------------------------------------------------------------------------------
+# $File: gnu,v 1.11 2009/09/19 16:28:09 christos Exp $
+# gnu: file(1) magic for various GNU tools
+#
+# GNU nlsutils message catalog file format
+#
+0 string \336\22\4\225 GNU message catalog (little endian),
+>4 lelong x revision %d,
+>8 lelong x %d messages
+0 string \225\4\22\336 GNU message catalog (big endian),
+>4 belong x revision %d,
+>8 belong x %d messages
+# message catalogs, from Mitchum DSouza <m.dsouza at mrc-apu.cam.ac.uk>
+0 string *nazgul* Nazgul style compiled message catalog
+>8 lelong >0 \b, version %ld
+
+# GnuPG
+# The format is very similar to pgp
+0 string \001gpg GPG key trust database
+>4 byte x version %d
+# Note: magic.mime had 0x8501 for the next line instead of 0x8502
+0 beshort 0x8502 GPG encrypted data
+!:mime text/PGP # encoding: data
+
+# This magic is not particularly good, as the keyrings don't have true
+# magic. Nevertheless, it covers many keyrings.
+0 beshort 0x9901 GPG key public ring
+!:mime application/x-gnupg-keyring
+
+# Gnumeric spreadsheet
+# This entry is only semi-helpful, as Gnumeric compresses its files, so
+# they will ordinarily reported as "compressed", but at least -z helps
+39 string =<gmr:Workbook Gnumeric spreadsheet
+
+# From: James Youngman <jay at gnu.org>
+# gnu find magic
+0 string \0LOCATE GNU findutils locate database data
+>7 string >\0 \b, format %s
+>7 string 02 \b (frcode)
+
+# Files produced by GNU gettext
+0 long 0xDE120495 GNU-format message catalog data
+0 long 0x950412DE GNU-format message catalog data
+
+#------------------------------------------------------------------------------
+# $File: gnumeric,v 1.4 2009/09/19 16:28:09 christos Exp $
+# gnumeric: file(1) magic for Gnumeric spreadsheet
+# This entry is only semi-helpful, as Gnumeric compresses its files, so
+# they will ordinarily reported as "compressed", but at least -z helps
+39 string =<gmr:Workbook Gnumeric spreadsheet
+!:mime application/x-gnumeric
+
+#------------------------------------------------------------------------------
+# $File: grace,v 1.4 2009/09/19 16:28:09 christos Exp $
+# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+#
+# ACE/gr binary
+0 string \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003 old ACE/gr binary file
+>39 byte >0 - version %c
+# ACE/gr ascii
+0 string #\ xvgr\ parameter\ file ACE/gr ascii file
+0 string #\ xmgr\ parameter\ file ACE/gr ascii file
+0 string #\ ACE/gr\ parameter\ file ACE/gr ascii file
+# Grace projects
+0 string #\ Grace\ project\ file Grace project file
+>23 string @version\ (version
+>>32 byte >0 %c
+>>33 string >\0 \b.%.2s
+>>35 string >\0 \b.%.2s)
+# ACE/gr fit description files
+0 string #\ ACE/gr\ fit\ description\ ACE/gr fit description file
+# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+
+#------------------------------------------------------------------------------
+# $File: graphviz,v 1.7 2009/09/19 16:28:09 christos Exp $
+# graphviz: file(1) magic for http://www.graphviz.org/
+
+# FIXME: These patterns match too generally. For example, the first
+# line matches a LaTeX file containing the word "graph" (with a {
+# following later) and the second line matches this file.
+#0 regex/100 [\r\n\t\ ]*graph[\r\n\t\ ]+.*\\{ graphviz graph text
+#!:mime text/vnd.graphviz
+#0 regex/100 [\r\n\t\ ]*digraph[\r\n\t\ ]+.*\\{ graphviz digraph text
+#!:mime text/vnd.graphviz
+
+#------------------------------------------------------------------------------
+# $File: gringotts,v 1.5 2009/09/19 16:28:09 christos Exp $
+# gringotts: file(1) magic for Gringotts
+# http://devel.pluto.linux.it/projects/Gringotts/
+# author: Germano Rizzo <mano at pluto.linux.it>
+#GRG3????Y
+0 string GRG Gringotts data file
+#file format 1
+>3 string 1 v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9
+#file format 2
+>3 string 2 v.2, MCRYPT S2K,
+>>8 byte&0x70 0x00 RIJNDAEL-128 crypt,
+>>8 byte&0x70 0x10 SERPENT crypt,
+>>8 byte&0x70 0x20 TWOFISH crypt,
+>>8 byte&0x70 0x30 CAST-256 crypt,
+>>8 byte&0x70 0x40 SAFER+ crypt,
+>>8 byte&0x70 0x50 LOKI97 crypt,
+>>8 byte&0x70 0x60 3DES crypt,
+>>8 byte&0x70 0x70 RIJNDAEL-256 crypt,
+>>8 byte&0x08 0x00 SHA1 hash,
+>>8 byte&0x08 0x08 RIPEMD-160 hash,
+>>8 byte&0x04 0x00 ZLib
+>>8 byte&0x04 0x04 BZip2
+>>8 byte&0x03 0x00 lvl.0
+>>8 byte&0x03 0x01 lvl.3
+>>8 byte&0x03 0x02 lvl.6
+>>8 byte&0x03 0x03 lvl.9
+#file format 3
+>3 string 3 v.3, OpenPGP S2K,
+>>8 byte&0x70 0x00 RIJNDAEL-128 crypt,
+>>8 byte&0x70 0x10 SERPENT crypt,
+>>8 byte&0x70 0x20 TWOFISH crypt,
+>>8 byte&0x70 0x30 CAST-256 crypt,
+>>8 byte&0x70 0x40 SAFER+ crypt,
+>>8 byte&0x70 0x50 LOKI97 crypt,
+>>8 byte&0x70 0x60 3DES crypt,
+>>8 byte&0x70 0x70 RIJNDAEL-256 crypt,
+>>8 byte&0x08 0x00 SHA1 hash,
+>>8 byte&0x08 0x08 RIPEMD-160 hash,
+>>8 byte&0x04 0x00 ZLib
+>>8 byte&0x04 0x04 BZip2
+>>8 byte&0x03 0x00 lvl.0
+>>8 byte&0x03 0x01 lvl.3
+>>8 byte&0x03 0x02 lvl.6
+>>8 byte&0x03 0x03 lvl.9
+#file format >3
+>3 string >3 v.%.1s (unknown details)
+
+#------------------------------------------------------------------------------
+# $File: hitachi-sh,v 1.5 2009/09/19 16:28:09 christos Exp $
+# hitach-sh: file(1) magic for Hitachi Super-H
+#
+# Super-H COFF
+#
+0 beshort 0x0500 Hitachi SH big-endian COFF
+>18 beshort&0x0002 =0x0000 object
+>18 beshort&0x0002 =0x0002 executable
+>18 beshort&0x0008 =0x0008 \b, stripped
+>18 beshort&0x0008 =0x0000 \b, not stripped
+#
+0 leshort 0x0550 Hitachi SH little-endian COFF
+>18 leshort&0x0002 =0x0000 object
+>18 leshort&0x0002 =0x0002 executable
+>18 leshort&0x0008 =0x0008 \b, stripped
+>18 leshort&0x0008 =0x0000 \b, not stripped
+
+
+#------------------------------------------------------------------------------
+# $File: hp,v 1.23 2009/09/19 16:28:09 christos Exp $
+# hp: file(1) magic for Hewlett Packard machines (see also "printer")
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# Daniel Quinlan (quinlan at yggdrasil.com): hp200 machines are 68010 based;
+# hp300 are 68020+68881 based; hp400 are also 68k. The following basic
+# HP magic is useful for reference, but using "long" magic is a better
+# practice in order to avoid collisions.
+#
+# Guy Harris (guy at netapp.com): some additions to this list came from
+# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
+# 1.2, and 2.0). The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
+# "/etc/magic", though, except for the "archive file relocatable library"
+# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
+# used in executables, or have they just not yet updated "/etc/magic"
+# completely?
+#
+# 0 beshort 200 hp200 (68010) BSD binary
+# 0 beshort 300 hp300 (68020+68881) BSD binary
+# 0 beshort 0x20c hp200/300 HP-UX binary
+# 0 beshort 0x20d hp400 (68030) HP-UX binary
+# 0 beshort 0x20e hp400 (68040?) HP-UX binary
+# 0 beshort 0x20b PA-RISC1.0 HP-UX binary
+# 0 beshort 0x210 PA-RISC1.1 HP-UX binary
+# 0 beshort 0x211 PA-RISC1.2 HP-UX binary
+# 0 beshort 0x214 PA-RISC2.0 HP-UX binary
+
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0 beshort 0627 Apollo m68k COFF executable
+>18 beshort ^040000 not stripped
+>22 beshort >0 - version %ld
+0 beshort 0624 apollo a88k COFF executable
+>18 beshort ^040000 not stripped
+>22 beshort >0 - version %ld
+0 long 01203604016 TML 0123 byte-order format
+0 long 01702407010 TML 1032 byte-order format
+0 long 01003405017 TML 2301 byte-order format
+0 long 01602007412 TML 3210 byte-order format
+#### PA-RISC 1.1
+0 belong 0x02100106 PA-RISC1.1 relocatable object
+0 belong 0x02100107 PA-RISC1.1 executable
+>168 belong &0x00000004 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x02100108 PA-RISC1.1 shared executable
+>168 belong&0x4 0x4 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x0210010b PA-RISC1.1 demand-load executable
+>168 belong&0x4 0x4 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x0210010e PA-RISC1.1 shared library
+>96 belong >0 - not stripped
+
+0 belong 0x0210010d PA-RISC1.1 dynamic load library
+>96 belong >0 - not stripped
+
+#### PA-RISC 2.0
+0 belong 0x02140106 PA-RISC2.0 relocatable object
+
+0 belong 0x02140107 PA-RISC2.0 executable
+>168 belong &0x00000004 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x02140108 PA-RISC2.0 shared executable
+>168 belong &0x00000004 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x0214010b PA-RISC2.0 demand-load executable
+>168 belong &0x00000004 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x0214010e PA-RISC2.0 shared library
+>96 belong >0 - not stripped
+
+0 belong 0x0214010d PA-RISC2.0 dynamic load library
+>96 belong >0 - not stripped
+
+#### 800
+0 belong 0x020b0106 PA-RISC1.0 relocatable object
+
+0 belong 0x020b0107 PA-RISC1.0 executable
+>168 belong&0x4 0x4 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x020b0108 PA-RISC1.0 shared executable
+>168 belong&0x4 0x4 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x020b010b PA-RISC1.0 demand-load executable
+>168 belong&0x4 0x4 dynamically linked
+>(144) belong 0x054ef630 dynamically linked
+>96 belong >0 - not stripped
+
+0 belong 0x020b010e PA-RISC1.0 shared library
+>96 belong >0 - not stripped
+
+0 belong 0x020b010d PA-RISC1.0 dynamic load library
+>96 belong >0 - not stripped
+
+0 belong 0x213c6172 archive file
+>68 belong 0x020b0619 - PA-RISC1.0 relocatable library
+>68 belong 0x02100619 - PA-RISC1.1 relocatable library
+>68 belong 0x02110619 - PA-RISC1.2 relocatable library
+>68 belong 0x02140619 - PA-RISC2.0 relocatable library
+
+#### 500
+0 long 0x02080106 HP s500 relocatable executable
+>16 long >0 - version %ld
+
+0 long 0x02080107 HP s500 executable
+>16 long >0 - version %ld
+
+0 long 0x02080108 HP s500 pure executable
+>16 long >0 - version %ld
+
+#### 200
+0 belong 0x020c0108 HP s200 pure executable
+>4 beshort >0 - version %ld
+>8 belong &0x80000000 save fp regs
+>8 belong &0x40000000 dynamically linked
+>8 belong &0x20000000 debuggable
+>36 belong >0 not stripped
+
+0 belong 0x020c0107 HP s200 executable
+>4 beshort >0 - version %ld
+>8 belong &0x80000000 save fp regs
+>8 belong &0x40000000 dynamically linked
+>8 belong &0x20000000 debuggable
+>36 belong >0 not stripped
+
+0 belong 0x020c010b HP s200 demand-load executable
+>4 beshort >0 - version %ld
+>8 belong &0x80000000 save fp regs
+>8 belong &0x40000000 dynamically linked
+>8 belong &0x20000000 debuggable
+>36 belong >0 not stripped
+
+0 belong 0x020c0106 HP s200 relocatable executable
+>4 beshort >0 - version %ld
+>6 beshort >0 - highwater %d
+>8 belong &0x80000000 save fp regs
+>8 belong &0x20000000 debuggable
+>8 belong &0x10000000 PIC
+
+0 belong 0x020a0108 HP s200 (2.x release) pure executable
+>4 beshort >0 - version %ld
+>36 belong >0 not stripped
+
+0 belong 0x020a0107 HP s200 (2.x release) executable
+>4 beshort >0 - version %ld
+>36 belong >0 not stripped
+
+0 belong 0x020c010e HP s200 shared library
+>4 beshort >0 - version %ld
+>6 beshort >0 - highwater %d
+>36 belong >0 not stripped
+
+0 belong 0x020c010d HP s200 dynamic load library
+>4 beshort >0 - version %ld
+>6 beshort >0 - highwater %d
+>36 belong >0 not stripped
+
+#### MISC
+0 long 0x0000ff65 HP old archive
+0 long 0x020aff65 HP s200 old archive
+0 long 0x020cff65 HP s200 old archive
+0 long 0x0208ff65 HP s500 old archive
+
+0 long 0x015821a6 HP core file
+
+0 long 0x4da7eee8 HP-WINDOWS font
+>8 byte >0 - version %ld
+0 string Bitmapfile HP Bitmapfile
+
+0 string IMGfile CIS compimg HP Bitmapfile
+# XXX - see "lif"
+#0 short 0x8000 lif file
+0 long 0x020c010c compiled Lisp
+
+0 string msgcat01 HP NLS message catalog,
+>8 long >0 %d messages
+
+# Summary: HP-48/49 calculator
+# Created by: phk at data.fls.dk
+# Modified by (1): AMAKAWA Shuhei <sa264 at cam.ac.uk>
+# Modified by (2): Samuel Thibault <samuel.thibault at ens-lyon.org> (HP49 support)
+0 string HPHP HP
+>4 string 48 48 binary
+>4 string 49 49 binary
+>7 byte >64 - Rev %c
+>8 leshort 0x2911 (ADR)
+>8 leshort 0x2933 (REAL)
+>8 leshort 0x2955 (LREAL)
+>8 leshort 0x2977 (COMPLX)
+>8 leshort 0x299d (LCOMPLX)
+>8 leshort 0x29bf (CHAR)
+>8 leshort 0x29e8 (ARRAY)
+>8 leshort 0x2a0a (LNKARRAY)
+>8 leshort 0x2a2c (STRING)
+>8 leshort 0x2a4e (HXS)
+>8 leshort 0x2a74 (LIST)
+>8 leshort 0x2a96 (DIR)
+>8 leshort 0x2ab8 (ALG)
+>8 leshort 0x2ada (UNIT)
+>8 leshort 0x2afc (TAGGED)
+>8 leshort 0x2b1e (GROB)
+>8 leshort 0x2b40 (LIB)
+>8 leshort 0x2b62 (BACKUP)
+>8 leshort 0x2b88 (LIBDATA)
+>8 leshort 0x2d9d (PROG)
+>8 leshort 0x2dcc (CODE)
+>8 leshort 0x2e48 (GNAME)
+>8 leshort 0x2e6d (LNAME)
+>8 leshort 0x2e92 (XLIB)
+
+0 string %%HP: HP text
+>6 string T(0) - T(0)
+>6 string T(1) - T(1)
+>6 string T(2) - T(2)
+>6 string T(3) - T(3)
+>10 string A(D) A(D)
+>10 string A(R) A(R)
+>10 string A(G) A(G)
+>14 string F(.) F(.);
+>14 string F(,) F(,);
+
+
+# Summary: HP-38/39 calculator
+# Created by: Samuel Thibault <samuel.thibault at ens-lyon.org>
+0 string HP3
+>3 string 8 HP 38
+>3 string 9 HP 39
+>4 string Bin binary
+>4 string Asc ASCII
+>7 string A (Directory List)
+>7 string B (Zaplet)
+>7 string C (Note)
+>7 string D (Program)
+>7 string E (Variable)
+>7 string F (List)
+>7 string G (Matrix)
+>7 string H (Library)
+>7 string I (Target List)
+>7 string J (ASCII Vector specification)
+>7 string K (wildcard)
+
+# Summary: HP-38/39 calculator
+# Created by: Samuel Thibault <samuel.thibault at ens-lyon.org>
+0 string HP3
+>3 string 8 HP 38
+>3 string 9 HP 39
+>4 string Bin binary
+>4 string Asc ASCII
+>7 string A (Directory List)
+>7 string B (Zaplet)
+>7 string C (Note)
+>7 string D (Program)
+>7 string E (Variable)
+>7 string F (List)
+>7 string G (Matrix)
+>7 string H (Library)
+>7 string I (Target List)
+>7 string J (ASCII Vector specification)
+>7 string K (wildcard)
+
+# hpBSD magic numbers
+0 beshort 200 hp200 (68010) BSD
+>2 beshort 0407 impure binary
+>2 beshort 0410 read-only binary
+>2 beshort 0413 demand paged binary
+0 beshort 300 hp300 (68020+68881) BSD
+>2 beshort 0407 impure binary
+>2 beshort 0410 read-only binary
+>2 beshort 0413 demand paged binary
+#
+# From David Gero <dgero at nortelnetworks.com>
+# HP-UX 10.20 core file format from /usr/include/sys/core.h
+# Unfortunately, HP-UX uses corehead blocks without specifying the order
+# There are four we care about:
+# CORE_KERNEL, which starts with the string "HP-UX"
+# CORE_EXEC, which contains the name of the command
+# CORE_PROC, which contains the signal number that caused the core dump
+# CORE_FORMAT, which contains the version of the core file format (== 1)
+# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
+# but we include all 6 variations of the order of the first 3, and
+# assume that PROC will always be last
+# Order 1: KERNEL, EXEC, FORMAT, PROC
+0x10 string HP-UX
+>0 belong 2
+>>0xC belong 0x3C
+>>>0x4C belong 0x100
+>>>>0x58 belong 0x44
+>>>>>0xA0 belong 1
+>>>>>>0xAC belong 4
+>>>>>>>0xB0 belong 1
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0x90 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+# Order 2: KERNEL, FORMAT, EXEC, PROC
+>>>0x4C belong 1
+>>>>0x58 belong 4
+>>>>>0x5C belong 1
+>>>>>>0x60 belong 0x100
+>>>>>>>0x6C belong 0x44
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0xA4 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+# Order 3: FORMAT, KERNEL, EXEC, PROC
+0x24 string HP-UX
+>0 belong 1
+>>0xC belong 4
+>>>0x10 belong 1
+>>>>0x14 belong 2
+>>>>>0x20 belong 0x3C
+>>>>>>0x60 belong 0x100
+>>>>>>>0x6C belong 0x44
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0xA4 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+# Order 4: EXEC, KERNEL, FORMAT, PROC
+0x64 string HP-UX
+>0 belong 0x100
+>>0xC belong 0x44
+>>>0x54 belong 2
+>>>>0x60 belong 0x3C
+>>>>>0xA0 belong 1
+>>>>>>0xAC belong 4
+>>>>>>>0xB0 belong 1
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0x44 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+# Order 5: FORMAT, EXEC, KERNEL, PROC
+0x78 string HP-UX
+>0 belong 1
+>>0xC belong 4
+>>>0x10 belong 1
+>>>>0x14 belong 0x100
+>>>>>0x20 belong 0x44
+>>>>>>0x68 belong 2
+>>>>>>>0x74 belong 0x3C
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0x58 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+# Order 6: EXEC, FORMAT, KERNEL, PROC
+>0 belong 0x100
+>>0xC belong 0x44
+>>>0x54 belong 1
+>>>>0x60 belong 4
+>>>>>0x64 belong 1
+>>>>>>0x68 belong 2
+>>>>>>>0x74 belong 0x2C
+>>>>>>>>0xB4 belong 4 core file
+>>>>>>>>>0x44 string >\0 from '%s'
+>>>>>>>>>0xC4 belong 3 - received SIGQUIT
+>>>>>>>>>0xC4 belong 4 - received SIGILL
+>>>>>>>>>0xC4 belong 5 - received SIGTRAP
+>>>>>>>>>0xC4 belong 6 - received SIGABRT
+>>>>>>>>>0xC4 belong 7 - received SIGEMT
+>>>>>>>>>0xC4 belong 8 - received SIGFPE
+>>>>>>>>>0xC4 belong 10 - received SIGBUS
+>>>>>>>>>0xC4 belong 11 - received SIGSEGV
+>>>>>>>>>0xC4 belong 12 - received SIGSYS
+>>>>>>>>>0xC4 belong 33 - received SIGXCPU
+>>>>>>>>>0xC4 belong 34 - received SIGXFSZ
+
+
+
+#------------------------------------------------------------------------------
+# $File: human68k,v 1.5 2009/09/19 16:28:09 christos Exp $
+# human68k: file(1) magic for Human68k (X680x0 DOS) binary formats
+# Magic too short!
+#0 string HU Human68k
+#>68 string LZX LZX compressed
+#>>72 string >\0 (version %s)
+#>(8.L+74) string LZX LZX compressed
+#>>(8.L+78) string >\0 (version %s)
+#>60 belong >0 binded
+#>(8.L+66) string #HUPAIR hupair
+#>0 string HU X executable
+#>(8.L+74) string #LIBCV1 - linked PD LIBC ver 1
+#>4 belong >0 - base address 0x%x
+#>28 belong >0 not stripped
+#>32 belong >0 with debug information
+#0 beshort 0x601a Human68k Z executable
+#0 beshort 0x6000 Human68k object file
+#0 belong 0xd1000000 Human68k ar binary archive
+#0 belong 0xd1010000 Human68k ar ascii archive
+#0 beshort 0x0068 Human68k lib archive
+#4 string LZX Human68k LZX compressed
+#>8 string >\0 (version %s)
+#>4 string LZX R executable
+#2 string #HUPAIR Human68k hupair R executable
+
+#------------------------------------------------------------------------------
+# $File: ibm370,v 1.8 2009/09/19 16:28:09 christos Exp $
+# ibm370: file(1) magic for IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+# AIX 4.1's "/etc/magic" has
+#
+# 0 short 0535 370 sysV executable
+# >12 long >0 not stripped
+# >22 short >0 - version %d
+# >30 long >0 - 5.2 format
+# 0 short 0530 370 sysV pure executable
+# >12 long >0 not stripped
+# >22 short >0 - version %d
+# >30 long >0 - 5.2 format
+#
+# instead of the "USS/370" versions of the same magic numbers.
+#
+0 beshort 0537 370 XA sysV executable
+>12 belong >0 not stripped
+>22 beshort >0 - version %d
+>30 belong >0 - 5.2 format
+0 beshort 0532 370 XA sysV pure executable
+>12 belong >0 not stripped
+>22 beshort >0 - version %d
+>30 belong >0 - 5.2 format
+0 beshort 054001 370 sysV pure executable
+>12 belong >0 not stripped
+0 beshort 055001 370 XA sysV pure executable
+>12 belong >0 not stripped
+0 beshort 056401 370 sysV executable
+>12 belong >0 not stripped
+0 beshort 057401 370 XA sysV executable
+>12 belong >0 not stripped
+0 beshort 0531 SVR2 executable (Amdahl-UTS)
+>12 belong >0 not stripped
+>24 belong >0 - version %ld
+0 beshort 0534 SVR2 pure executable (Amdahl-UTS)
+>12 belong >0 not stripped
+>24 belong >0 - version %ld
+0 beshort 0530 SVR2 pure executable (USS/370)
+>12 belong >0 not stripped
+>24 belong >0 - version %ld
+0 beshort 0535 SVR2 executable (USS/370)
+>12 belong >0 not stripped
+>24 belong >0 - version %ld
+
+#------------------------------------------------------------------------------
+# $File: ibm6000,v 1.9 2009/09/19 16:28:09 christos Exp $
+# ibm6000: file(1) magic for RS/6000 and the RT PC.
+#
+0 beshort 0x01df executable (RISC System/6000 V3.1) or obj module
+>12 belong >0 not stripped
+# Breaks sun4 statically linked execs.
+#0 beshort 0x0103 executable (RT Version 2) or obj module
+#>2 byte 0x50 pure
+#>28 belong >0 not stripped
+#>6 beshort >0 - version %ld
+0 beshort 0x0104 shared library
+0 beshort 0x0105 ctab data
+0 beshort 0xfe04 structured file
+0 string 0xabcdef AIX message catalog
+0 belong 0x000001f9 AIX compiled message catalog
+0 string \<aiaff> archive
+0 string \<bigaf> archive (big format)
+
+
+#------------------------------------------------------------------------------
+# $File: iff,v 1.12 2009/09/19 16:28:09 christos Exp $
+# iff: file(1) magic for Interchange File Format (see also "audio" & "images")
+#
+# Daniel Quinlan (quinlan at yggdrasil.com) -- IFF was designed by Electronic
+# Arts for file interchange. It has also been used by Apple, SGI, and
+# especially Commodore-Amiga.
+#
+# IFF files begin with an 8 byte FORM header, followed by a 4 character
+# FORM type, which is followed by the first chunk in the FORM.
+
+0 string FORM IFF data
+#>4 belong x \b, FORM is %d bytes long
+# audio formats
+>8 string AIFF \b, AIFF audio
+!:mime audio/x-aiff
+>8 string AIFC \b, AIFF-C compressed audio
+!:mime audio/x-aiff
+>8 string 8SVX \b, 8SVX 8-bit sampled sound voice
+!:mime audio/x-aiff
+>8 string 16SV \b, 16SV 16-bit sampled sound voice
+>8 string SAMP \b, SAMP sampled audio
+>8 string MAUD \b, MAUD MacroSystem audio
+>8 string SMUS \b, SMUS simple music
+>8 string CMUS \b, CMUS complex music
+# image formats
+>8 string ILBMBMHD \b, ILBM interleaved image
+>>20 beshort x \b, %d x
+>>22 beshort x %d
+>8 string RGBN \b, RGBN 12-bit RGB image
+>8 string RGB8 \b, RGB8 24-bit RGB image
+>8 string DEEP \b, DEEP TVPaint/XiPaint image
+>8 string DR2D \b, DR2D 2-D object
+>8 string TDDD \b, TDDD 3-D rendering
+>8 string LWOB \b, LWOB 3-D object
+>8 string LWO2 \b, LWO2 3-D object, v2
+>8 string LWLO \b, LWLO 3-D layered object
+>8 string REAL \b, REAL Real3D rendering
+>8 string MC4D \b, MC4D MaxonCinema4D rendering
+>8 string ANIM \b, ANIM animation
+>8 string YAFA \b, YAFA animation
+>8 string SSA\ \b, SSA super smooth animation
+>8 string ACBM \b, ACBM continuous image
+>8 string FAXX \b, FAXX fax image
+# other formats
+>8 string FTXT \b, FTXT formatted text
+>8 string CTLG \b, CTLG message catalog
+>8 string PREF \b, PREF preferences
+>8 string DTYP \b, DTYP datatype description
+>8 string PTCH \b, PTCH binary patch
+>8 string AMFF \b, AMFF AmigaMetaFile format
+>8 string WZRD \b, WZRD StormWIZARD resource
+>8 string DOC\ \b, DOC desktop publishing document
+
+# These go at the end of the iff rules
+#
+# I don't see why these might collide with anything else.
+#
+# Interactive Fiction related formats
+#
+>8 string IFRS \b, Blorb Interactive Fiction
+>>24 string Exec with executable chunk
+>8 string IFZS \b, Z-machine or Glulx saved game file (Quetzal)
+
+#------------------------------------------------------------------------------
+# $File: images,v 1.64 2009/12/06 00:38:50 christos Exp $
+# images: file(1) magic for image formats (see also "iff", and "c-lang" for
+# XPM bitmaps)
+#
+# originally from jef at helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl at ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# little magic: PCX (first byte is 0x0a)
+
+# Targa - matches `povray', `ppmtotga' and `xv' outputs
+# by Philippe De Muyter <phdm at macqel.be>
+# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
+# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
+# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
+# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
+# `tgatoppm' recognizes a superset (Index may be anything)
+1 belong&0xfff7ffff 0x01010000 Targa image data - Map
+>2 byte&8 8 - RLE
+>12 leshort >0 %hd x
+>14 leshort >0 %hd
+1 belong&0xfff7ffff 0x00020000 Targa image data - RGB
+>2 byte&8 8 - RLE
+>12 leshort >0 %hd x
+>14 leshort >0 %hd
+1 belong&0xfff7ffff 0x00030000 Targa image data - Mono
+>2 byte&8 8 - RLE
+>12 leshort >0 %hd x
+>14 leshort >0 %hd
+
+# PBMPLUS images
+# The next byte following the magic is always whitespace.
+# strength is changed to try these patterns before "x86 boot sector"
+0 search/1 P1
+>3 regex =[0-9]*\ [0-9]* Netpbm PBM image text
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-bitmap
+0 search/1 P2
+>3 regex =[0-9]*\ [0-9]* Netpbm PGM image text
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-greymap
+0 search/1 P3
+>3 regex =[0-9]*\ [0-9]* Netpbm PPM image text
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-pixmap
+0 string P4
+>3 regex =[0-9]*\ [0-9]* Netpbm PBM "rawbits" image data
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-bitmap
+0 string P5
+>3 regex =[0-9]*\ [0-9]* Netpbm PGM "rawbits" image data
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-greymap
+0 string P6
+>3 regex =[0-9]*\ [0-9]* Netpbm PPM "rawbits" image data
+>3 regex =[0-9]+\ \b, size = %sx
+>>3 regex =\ [0-9]+ \b%s
+!:strength + 45
+!:mime image/x-portable-pixmap
+0 string P7 Netpbm PAM image file
+!:mime image/x-portable-pixmap
+
+# From: bryanh at giraffe-data.com (Bryan Henderson)
+0 string \117\072 Solitaire Image Recorder format
+>4 string \013 MGI Type 11
+>4 string \021 MGI Type 17
+0 string .MDA MicroDesign data
+>21 byte 48 version 2
+>21 byte 51 version 3
+0 string .MDP MicroDesign page data
+>21 byte 48 version 2
+>21 byte 51 version 3
+
+# NIFF (Navy Interchange File Format, a modification of TIFF) images
+# [GRR: this *must* go before TIFF]
+0 string IIN1 NIFF image data
+!:mime image/x-niff
+
+# Tag Image File Format, from Daniel Quinlan (quinlan at yggdrasil.com)
+# The second word of TIFF files is the TIFF version number, 42, which has
+# never changed. The TIFF specification recommends testing for it.
+0 string MM\x00\x2a TIFF image data, big-endian
+!:mime image/tiff
+0 string II\x2a\x00 TIFF image data, little-endian
+!:mime image/tiff
+
+# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
+# (Greg Roelofs, newt at uchicago.edu)
+# (Albert Cahalan, acahalan at cs.uml.edu)
+#
+# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
+#
+0 string \x89PNG\x0d\x0a\x1a\x0a PNG image data
+!:mime image/png
+>16 belong x \b, %ld x
+>20 belong x %ld,
+>24 byte x %d-bit
+>25 byte 0 grayscale,
+>25 byte 2 \b/color RGB,
+>25 byte 3 colormap,
+>25 byte 4 gray+alpha,
+>25 byte 6 \b/color RGBA,
+#>26 byte 0 deflate/32K,
+>28 byte 0 non-interlaced
+>28 byte 1 interlaced
+
+# possible GIF replacements; none yet released!
+# (Greg Roelofs, newt at uchicago.edu)
+#
+# GRR 950115: this was mine ("Zip GIF"):
+0 string GIF94z ZIF image (GIF+deflate alpha)
+!:mime image/x-unknown
+#
+# GRR 950115: this is Jeremy Wohl's Free Graphics Format (better):
+#
+0 string FGF95a FGF image (GIF+deflate beta)
+!:mime image/x-unknown
+#
+# GRR 950115: this is Thomas Boutell's Portable Bitmap Format proposal
+# (best; not yet implemented):
+#
+0 string PBF PBF image (deflate compression)
+!:mime image/x-unknown
+
+# GIF
+0 string GIF8 GIF image data
+!:mime image/gif
+!:apple 8BIMGIFf
+>4 string 7a \b, version 8%s,
+>4 string 9a \b, version 8%s,
+>6 leshort >0 %hd x
+>8 leshort >0 %hd
+#>10 byte &0x80 color mapped,
+#>10 byte&0x07 =0x00 2 colors
+#>10 byte&0x07 =0x01 4 colors
+#>10 byte&0x07 =0x02 8 colors
+#>10 byte&0x07 =0x03 16 colors
+#>10 byte&0x07 =0x04 32 colors
+#>10 byte&0x07 =0x05 64 colors
+#>10 byte&0x07 =0x06 128 colors
+#>10 byte&0x07 =0x07 256 colors
+
+# ITC (CMU WM) raster files. It is essentially a byte-reversed Sun raster,
+# 1 plane, no encoding.
+0 string \361\0\100\273 CMU window manager raster image data
+>4 lelong >0 %d x
+>8 lelong >0 %d,
+>12 lelong >0 %d-bit
+
+# Magick Image File Format
+0 string id=ImageMagick MIFF image data
+
+# Artisan
+0 long 1123028772 Artisan image data
+>4 long 1 \b, rectangular 24-bit
+>4 long 2 \b, rectangular 8-bit with colormap
+>4 long 3 \b, rectangular 32-bit (24-bit with matte)
+
+# FIG (Facility for Interactive Generation of figures), an object-based format
+0 search/1 #FIG FIG image text
+>5 string x \b, version %.3s
+
+# PHIGS
+0 string ARF_BEGARF PHIGS clear text archive
+0 string @(#)SunPHIGS SunPHIGS
+# version number follows, in the form m.n
+>40 string SunBin binary
+>32 string archive archive
+
+# GKS (Graphics Kernel System)
+0 string GKSM GKS Metafile
+>24 string SunGKS \b, SunGKS
+
+# CGM image files
+0 string BEGMF clear text Computer Graphics Metafile
+
+# MGR bitmaps (Michael Haardt, u31b3hs at pool.informatik.rwth-aachen.de)
+0 string yz MGR bitmap, modern format, 8-bit aligned
+0 string zz MGR bitmap, old format, 1-bit deep, 16-bit aligned
+0 string xz MGR bitmap, old format, 1-bit deep, 32-bit aligned
+0 string yx MGR bitmap, modern format, squeezed
+
+# Fuzzy Bitmap (FBM) images
+0 string %bitmap\0 FBM image data
+>30 long 0x31 \b, mono
+>30 long 0x33 \b, color
+
+# facsimile data
+1 string PC\ Research,\ Inc group 3 fax data
+>29 byte 0 \b, normal resolution (204x98 DPI)
+>29 byte 1 \b, fine resolution (204x196 DPI)
+# From: Herbert Rosmanith <herp at wildsau.idv.uni.linz.at>
+0 string Sfff structured fax file
+
+
+# PC bitmaps (OS/2, Windows BMP files) (Greg Roelofs, newt at uchicago.edu)
+0 string BM
+>14 leshort 12 PC bitmap, OS/2 1.x format
+!:mime image/x-ms-bmp
+>>18 leshort x \b, %d x
+>>20 leshort x %d
+>14 leshort 64 PC bitmap, OS/2 2.x format
+!:mime image/x-ms-bmp
+>>18 leshort x \b, %d x
+>>20 leshort x %d
+>14 leshort 40 PC bitmap, Windows 3.x format
+!:mime image/x-ms-bmp
+>>18 lelong x \b, %d x
+>>22 lelong x %d x
+>>28 leshort x %d
+>14 leshort 128 PC bitmap, Windows NT/2000 format
+!:mime image/x-ms-bmp
+>>18 lelong x \b, %d x
+>>22 lelong x %d x
+>>28 leshort x %d
+# Too simple - MPi
+#0 string IC PC icon data
+#0 string PI PC pointer image data
+#0 string CI PC color icon data
+#0 string CP PC color pointer image data
+# Conflicts with other entries [BABYL]
+#0 string BA PC bitmap array data
+
+# XPM icons (Greg Roelofs, newt at uchicago.edu)
+# note possible collision with C/REXX entry in c-lang; currently commented out
+0 search/1 /*\ XPM\ */ X pixmap image text
+
+# Utah Raster Toolkit RLE images (janl at ifi.uio.no)
+0 leshort 0xcc52 RLE image data,
+>6 leshort x %d x
+>8 leshort x %d
+>2 leshort >0 \b, lower left corner: %d
+>4 leshort >0 \b, lower right corner: %d
+>10 byte&0x1 =0x1 \b, clear first
+>10 byte&0x2 =0x2 \b, no background
+>10 byte&0x4 =0x4 \b, alpha channel
+>10 byte&0x8 =0x8 \b, comment
+>11 byte >0 \b, %d color channels
+>12 byte >0 \b, %d bits per pixel
+>13 byte >0 \b, %d color map channels
+
+# image file format (Robert Potter, potter at cs.rochester.edu)
+0 string Imagefile\ version- iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10 string >\0 %s
+
+# Sun raster images, from Daniel Quinlan (quinlan at yggdrasil.com)
+0 belong 0x59a66a95 Sun raster image data
+>4 belong >0 \b, %d x
+>8 belong >0 %d,
+>12 belong >0 %d-bit,
+#>16 belong >0 %d bytes long,
+>20 belong 0 old format,
+#>20 belong 1 standard,
+>20 belong 2 compressed,
+>20 belong 3 RGB,
+>20 belong 4 TIFF,
+>20 belong 5 IFF,
+>20 belong 0xffff reserved for testing,
+>24 belong 0 no colormap
+>24 belong 1 RGB colormap
+>24 belong 2 raw colormap
+#>28 belong >0 colormap is %d bytes long
+
+# SGI image file format, from Daniel Quinlan (quinlan at yggdrasil.com)
+#
+# See
+# http://reality.sgi.com/grafica/sgiimage.html
+#
+0 beshort 474 SGI image data
+#>2 byte 0 \b, verbatim
+>2 byte 1 \b, RLE
+#>3 byte 1 \b, normal precision
+>3 byte 2 \b, high precision
+>4 beshort x \b, %d-D
+>6 beshort x \b, %d x
+>8 beshort x %d
+>10 beshort x \b, %d channel
+>10 beshort !1 \bs
+>80 string >0 \b, "%s"
+
+0 string IT01 FIT image data
+>4 belong x \b, %d x
+>8 belong x %d x
+>12 belong x %d
+#
+0 string IT02 FIT image data
+>4 belong x \b, %d x
+>8 belong x %d x
+>12 belong x %d
+#
+2048 string PCD_IPI Kodak Photo CD image pack file
+>0xe02 byte&0x03 0x00 , landscape mode
+>0xe02 byte&0x03 0x01 , portrait mode
+>0xe02 byte&0x03 0x02 , landscape mode
+>0xe02 byte&0x03 0x03 , portrait mode
+0 string PCD_OPA Kodak Photo CD overview pack file
+
+# FITS format. Jeff Uphoff <juphoff at tarsier.cv.nrao.edu>
+# FITS is the Flexible Image Transport System, the de facto standard for
+# data and image transfer, storage, etc., for the astronomical community.
+# (FITS floating point formats are big-endian.)
+0 string SIMPLE\ \ = FITS image data
+>109 string 8 \b, 8-bit, character or unsigned binary integer
+>108 string 16 \b, 16-bit, two's complement binary integer
+>107 string \ 32 \b, 32-bit, two's complement binary integer
+>107 string -32 \b, 32-bit, floating point, single precision
+>107 string -64 \b, 64-bit, floating point, double precision
+
+# other images
+0 string This\ is\ a\ BitMap\ file Lisp Machine bit-array-file
+
+# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
+# stuff.
+#
+0 beshort 0x1010 PEX Binary Archive
+
+# DICOM medical imaging data
+128 string DICM DICOM medical imaging data
+!:mime application/dicom
+
+# XWD - X Window Dump file.
+# As described in /usr/X11R6/include/X11/XWDFile.h
+# used by the xwd program.
+# Bradford Castalia, idaeim, 1/01
+4 belong 7 XWD X Window Dump image data
+>100 string >\0 \b, "%s"
+>16 belong x \b, %dx
+>20 belong x \b%dx
+>12 belong x \b%d
+
+# PDS - Planetary Data System
+# These files use Parameter Value Language in the header section.
+# Unfortunately, there is no certain magic, but the following
+# strings have been found to be most likely.
+0 string NJPL1I00 PDS (JPL) image data
+2 string NJPL1I PDS (JPL) image data
+0 string CCSD3ZF PDS (CCSD) image data
+2 string CCSD3Z PDS (CCSD) image data
+0 string PDS_ PDS image data
+0 string LBLSIZE= PDS (VICAR) image data
+
+# pM8x: ATARI STAD compressed bitmap format
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 2, 2001
+# p M 8 5/6 xx yy zz data...
+# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
+# bytes either run horizontally (pM85) or vertically (pM86). yy is the
+# most frequent byte, xx and zz are runlength escape codes, where xx is
+# used for runs of yy.
+#
+0 string pM85 Atari ST STAD bitmap image data (hor)
+>5 byte 0x00 (white background)
+>5 byte 0xFF (black background)
+0 string pM86 Atari ST STAD bitmap image data (vert)
+>5 byte 0x00 (white background)
+>5 byte 0xFF (black background)
+
+# Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+# http://www.atarimax.com/jindroush.atari.org/afmtatr.html
+0 leshort 0x0296 Atari ATR image
+
+# XXX:
+# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
+# magic.
+# SGI RICE image file <mpruett at sgi.com>
+#0 beshort 0x5249 RICE image
+#>2 beshort x v%d
+#>4 beshort x (%d x
+#>6 beshort x %d)
+#>8 beshort 0 8 bit
+#>8 beshort 1 10 bit
+#>8 beshort 2 12 bit
+#>8 beshort 3 13 bit
+#>10 beshort 0 4:2:2
+#>10 beshort 1 4:2:2:4
+#>10 beshort 2 4:4:4
+#>10 beshort 3 4:4:4:4
+#>12 beshort 1 RGB
+#>12 beshort 2 CCIR601
+#>12 beshort 3 RP175
+#>12 beshort 4 YUV
+
+#------------------------------------------------------------------------------
+#
+# Marco Schmidt (marcoschmidt at users.sourceforge.net) -- an image file format
+# for the EPOC operating system, which is used with PDAs like those from Psion
+#
+# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
+# of various EPOC file formats
+
+0 string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
+
+# PCX image files
+# From: Dan Fandrich <dan at coneharvesters.com>
+0 beshort 0x0a00 PCX ver. 2.5 image data
+0 beshort 0x0a02 PCX ver. 2.8 image data, with palette
+0 beshort 0x0a03 PCX ver. 2.8 image data, without palette
+0 beshort 0x0a04 PCX for Windows image data
+0 beshort 0x0a05 PCX ver. 3.0 image data
+>4 leshort x bounding box [%hd,
+>6 leshort x %hd] -
+>8 leshort x [%hd,
+>10 leshort x %hd],
+>65 byte >1 %d planes each of
+>3 byte x %hhd-bit
+>68 byte 0 image,
+>68 byte 1 colour,
+>68 byte 2 grayscale,
+>68 byte >2 image,
+>68 byte <0 image,
+>12 leshort >0 %hd x
+>>14 leshort x %hd dpi,
+>2 byte 0 uncompressed
+>2 byte 1 RLE compressed
+
+# Adobe Photoshop
+# From: Asbjoern Sloth Toennesen <asbjorn at lila.io>
+0 string 8BPS Adobe Photoshop Image
+!:mime image/vnd.adobe.photoshop
+>4 beshort 2 (PSB)
+>18 belong x \b, %d x
+>14 belong x %d,
+>24 beshort 0 bitmap
+>24 beshort 1 grayscale
+>>12 beshort 2 with alpha
+>24 beshort 2 indexed
+>24 beshort 3 RGB
+>>12 beshort 4 \bA
+>24 beshort 4 CMYK
+>>12 beshort 5 \bA
+>24 beshort 7 multichannel
+>24 beshort 8 duotone
+>24 beshort 9 lab
+>12 beshort > 1
+>>12 beshort x \b, %dx
+>12 beshort 1 \b,
+>22 beshort x %d-bit channel
+>12 beshort > 1 \bs
+
+# XV thumbnail indicator (ThMO)
+0 string P7\ 332 XV thumbnail image data
+
+# NITF is defined by United States MIL-STD-2500A
+0 string NITF National Imagery Transmission Format
+>25 string >\0 dated %.14s
+
+# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)
+0 belong 0x00010008 GEM Image data
+>12 beshort x %d x
+>14 beshort x %d,
+>4 beshort x %d planes,
+>8 beshort x %d x
+>10 beshort x %d pixelsize
+
+# GEM Metafile (Wolfram Kleff)
+0 lelong 0x0018FFFF GEM Metafile data
+>4 leshort x version %d
+
+#
+# SMJPEG. A custom Motion JPEG format used by Loki Entertainment
+# Software Torbjorn Andersson <d91tan at Update.UU.SE>.
+#
+0 string \0\nSMJPEG SMJPEG
+>8 belong x %d.x data
+# According to the specification you could find any number of _TXT
+# headers here, but I can't think of any way of handling that. None of
+# the SMJPEG files I tried it on used this feature. Even if such a
+# file is encountered the output should still be reasonable.
+>16 string _SND \b,
+>>24 beshort >0 %d Hz
+>>26 byte 8 8-bit
+>>26 byte 16 16-bit
+>>28 string NONE uncompressed
+# >>28 string APCM ADPCM compressed
+>>27 byte 1 mono
+>>28 byte 2 stereo
+# Help! Isn't there any way to avoid writing this part twice?
+>>32 string _VID \b,
+# >>>48 string JFIF JPEG
+>>>40 belong >0 %d frames
+>>>44 beshort >0 (%d x
+>>>46 beshort >0 %d)
+>16 string _VID \b,
+# >>32 string JFIF JPEG
+>>24 belong >0 %d frames
+>>28 beshort >0 (%d x
+>>30 beshort >0 %d)
+
+0 string Paint\ Shop\ Pro\ Image\ File Paint Shop Pro Image File
+
+# "thumbnail file" (icon)
+# descended from "xv", but in use by other applications as well (Wolfram Kleff)
+0 string P7\ 332 XV "thumbnail file" (icon) data
+
+# taken from fkiss: (<yav at mte.biglobe.ne.jp> ?)
+0 string KiSS KISS/GS
+>4 byte 16 color
+>>5 byte x %d bit
+>>8 leshort x %d colors
+>>10 leshort x %d groups
+>4 byte 32 cell
+>>5 byte x %d bit
+>>8 leshort x %d x
+>>10 leshort x %d
+>>12 leshort x +%d
+>>14 leshort x +%d
+
+# Webshots (www.webshots.com), by John Harrison
+0 string C\253\221g\230\0\0\0 Webshots Desktop .wbz file
+
+# Hercules DASD image files
+# From Jan Jaeger <jj at septa.nl>
+0 string CKD_P370 Hercules CKD DASD image file
+>8 long x \b, %d heads per cylinder
+>12 long x \b, track size %d bytes
+>16 byte x \b, device type 33%2.2X
+
+0 string CKD_C370 Hercules compressed CKD DASD image file
+>8 long x \b, %d heads per cylinder
+>12 long x \b, track size %d bytes
+>16 byte x \b, device type 33%2.2X
+
+0 string CKD_S370 Hercules CKD DASD shadow file
+>8 long x \b, %d heads per cylinder
+>12 long x \b, track size %d bytes
+>16 byte x \b, device type 33%2.2X
+
+# Squeak images and programs - etoffi at softhome.net
+0 string \146\031\0\0 Squeak image data
+0 search/1 'From\040Squeak Squeak program text
+
+# partimage: file(1) magic for PartImage files (experimental, incomplete)
+# Author: Hans-Joachim Baader <hjb at pro-linux.de>
+0 string PaRtImAgE-VoLuMe PartImage
+>0x0020 string 0.6.1 file version %s
+>>0x0060 lelong >-1 volume %ld
+#>>0x0064 8 byte identifier
+#>>0x007c reserved
+>>0x0200 string >\0 type %s
+>>0x1400 string >\0 device %s,
+>>0x1600 string >\0 original filename %s,
+# Some fields omitted
+>>0x2744 lelong 0 not compressed
+>>0x2744 lelong 1 gzip compressed
+>>0x2744 lelong 2 bzip2 compressed
+>>0x2744 lelong >2 compressed with unknown algorithm
+>0x0020 string >0.6.1 file version %s
+>0x0020 string <0.6.1 file version %s
+
+# DCX is multi-page PCX, using a simple header of up to 1024
+# offsets for the respective PCX components.
+# From: Joerg Wunsch <joerg_wunsch at uriah.heep.sax.de>
+0 lelong 987654321 DCX multi-page PCX image data
+
+# Simon Walton <simonw at matteworld.com>
+# Kodak Cineon format for scanned negatives
+# http://www.kodak.com/US/en/motion/support/dlad/
+0 lelong 0xd75f2a80 Cineon image data
+>200 belong >0 \b, %ld x
+>204 belong >0 %ld
+
+
+# Bio-Rad .PIC is an image format used by microscope control systems
+# and related image processing software used by biologists.
+# From: Vebjorn Ljosa <vebjorn at ljosa.com>
+# BOOL values are two-byte integers; use them to rule out false positives.
+# http://web.archive.org/web/20050317223257/www.cs.ubc.ca/spider/ladic/text/biorad.txt
+# Samples: http://www.loci.wisc.edu/software/sample-data
+14 leshort <2
+>62 leshort <2
+>>54 leshort 12345 Bio-Rad .PIC Image File
+>>>0 leshort >0 %hd x
+>>>2 leshort >0 %hd,
+>>>4 leshort =1 1 image in file
+>>>4 leshort >1 %hd images in file
+
+# From Jan "Yenya" Kasprzak <kas at fi.muni.cz>
+# The description of *.mrw format can be found at
+# http://www.dalibor.cz/minolta/raw_file_format.htm
+0 string \000MRM Minolta Dimage camera raw image data
+
+# Summary: DjVu image / document
+# Extension: .djvu
+# Reference: http://djvu.org/docs/DjVu3Spec.djvu
+# Submitted by: Stephane Loeuillet <stephane.loeuillet at tiscali.fr>
+# Modified by (1): Abel Cheung <abelcheung at gmail.com>
+0 string AT&TFORM
+>12 string DJVM DjVu multiple page document
+!:mime image/vnd.djvu
+>12 string DJVU DjVu image or single page document
+!:mime image/vnd.djvu
+>12 string DJVI DjVu shared document
+!:mime image/vnd.djvu
+>12 string THUM DjVu page thumbnails
+!:mime image/vnd.djvu
+
+
+# From Marc Espie
+0 lelong 20000630 OpenEXR image data
+
+# From: Tom Hilinski <tom.hilinski at comcast.net>
+# http://www.unidata.ucar.edu/packages/netcdf/
+0 string CDF\001 NetCDF Data Format data
+
+#-----------------------------------------------------------------------
+# Hierarchical Data Format, used to facilitate scientific data exchange
+# specifications at http://hdf.ncsa.uiuc.edu/
+0 belong 0x0e031301 Hierarchical Data Format (version 4) data
+!:mime application/x-hdf
+0 string \211HDF\r\n\032 Hierarchical Data Format (version 5) data
+!:mime application/x-hdf
+
+# From: Tobias Burnus <burnus at net-b.de>
+# Xara (for a while: Corel Xara) is a graphic package, see
+# http://www.xara.com/ for Windows and as GPL application for Linux
+0 string XARA\243\243 Xara graphics file
+
+# http://www.cartesianinc.com/Tech/
+0 string CPC\262 Cartesian Perceptual Compression image
+!:mime image/x-cpi
+
+# From Albert Cahalan <acahalan at gmail.com>
+# puredigital used it for the CVS disposable camcorder
+#8 lelong 4 ZBM bitmap image data
+#>4 leshort x %u x
+#>6 leshort x %u
+
+# From Albert Cahalan <acahalan at gmail.com>
+# uncompressed 5:6:5 HighColor image for OLPC XO firmware icons
+0 string C565 OLPC firmware icon image data
+>4 leshort x %u x
+>6 leshort x %u
+
+# Applied Images - Image files from Cytovision
+# Gustavo Junior Alves <gjalves at gjalves.com.br>
+0 string \xce\xda\xde\xfa Cytovision Metaphases file
+0 string \xed\xad\xef\xac Cytovision Karyotype file
+0 string \x0b\x00\x03\x00 Cytovision FISH Probe file
+0 string \xed\xfe\xda\xbe Cytovision FLEX file
+0 string \xed\xab\xed\xfe Cytovision FLEX file
+0 string \xad\xfd\xea\xad Cytovision RATS file
+
+# Wavelet Scalar Quantization format used in gray-scale fingerprint images
+# From Tano M Fotang <mfotang at quanteq.com>
+0 string \xff\xa0\xff\xa8\x00 Wavelet Scalar Quantization image data
+
+# JPEG 2000 Code Stream Bitmap
+# From Petr Splichal <psplicha at redhat.com>
+0 string \xFF\x4F\xFF\x51\x00 JPEG-2000 Code Stream Bitmap data
+
+#------------------------------------------------------------------------------
+# $File: inform,v 1.5 2009/09/19 16:28:09 christos Exp $
+# inform: file(1) magic for Inform interactive fiction language
+
+# URL: http://www.inform-fiction.org/
+# From: Reuben Thomas <rrt at sc3d.org>
+
+0 search/100/cW constant\ story Inform source text
+
+#------------------------------------------------------------------------------
+# $File: intel,v 1.8 2009/09/19 16:28:10 christos Exp $
+# intel: file(1) magic for x86 Unix
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft"). DOS is in "msdos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?). OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0 leshort 0502 basic-16 executable
+>12 lelong >0 not stripped
+#>22 leshort >0 - version %ld
+0 leshort 0503 basic-16 executable (TV)
+>12 lelong >0 not stripped
+#>22 leshort >0 - version %ld
+0 leshort 0510 x86 executable
+>12 lelong >0 not stripped
+0 leshort 0511 x86 executable (TV)
+>12 lelong >0 not stripped
+0 leshort =0512 iAPX 286 executable small model (COFF)
+>12 lelong >0 not stripped
+#>22 leshort >0 - version %ld
+0 leshort =0522 iAPX 286 executable large model (COFF)
+>12 lelong >0 not stripped
+#>22 leshort >0 - version %ld
+# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
+0 leshort =0514 80386 COFF executable
+>12 lelong >0 not stripped
+>22 leshort >0 - version %ld
+
+# rom: file(1) magic for BIOS ROM Extensions found in intel machines
+# mapped into memory between 0xC0000 and 0xFFFFF
+# From Gürkan Sengün <gurkan at linuks.mine.nu>, www.linuks.mine.nu
+0 beshort 0x55AA BIOS (ia32) ROM Ext.
+>5 string USB USB
+>7 string LDR UNDI image
+>30 string IBM IBM comp. Video
+>26 string Adaptec Adaptec
+>28 string Adaptec Adaptec
+>42 string PROMISE Promise
+>2 byte x (%d*512)
+
+#------------------------------------------------------------------------------
+# $File: interleaf,v 1.10 2009/09/19 16:28:10 christos Exp $
+# interleaf: file(1) magic for InterLeaf TPS:
+#
+0 string =\210OPS Interleaf saved data
+0 string =<!OPS Interleaf document text
+>5 string ,\ Version\ = \b, version
+>>17 string >\0 %.3s
+
+#------------------------------------------------------------------------------
+# $File: island,v 1.5 2009/09/19 16:28:10 christos Exp $
+# island: file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
+# "/etc/magic":
+# From: guy at netapp.com (Guy Harris)
+#
+4 string pgscriptver IslandWrite document
+13 string DrawFile IslandDraw document
+
+
+#------------------------------------------------------------------------------
+# $File: ispell,v 1.8 2009/09/19 16:28:10 christos Exp $
+# ispell: file(1) magic for ispell
+#
+# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602. This magic
+# will match 0x9600 through 0x9603 in *both* little endian and big endian.
+# (No other current magic entries collide.)
+#
+# Updated by Daniel Quinlan (quinlan at yggdrasil.com)
+#
+0 leshort&0xFFFC 0x9600 little endian ispell
+>0 byte 0 hash file (?),
+>0 byte 1 3.0 hash file,
+>0 byte 2 3.1 hash file,
+>0 byte 3 hash file (?),
+>2 leshort 0x00 8-bit, no capitalization, 26 flags
+>2 leshort 0x01 7-bit, no capitalization, 26 flags
+>2 leshort 0x02 8-bit, capitalization, 26 flags
+>2 leshort 0x03 7-bit, capitalization, 26 flags
+>2 leshort 0x04 8-bit, no capitalization, 52 flags
+>2 leshort 0x05 7-bit, no capitalization, 52 flags
+>2 leshort 0x06 8-bit, capitalization, 52 flags
+>2 leshort 0x07 7-bit, capitalization, 52 flags
+>2 leshort 0x08 8-bit, no capitalization, 128 flags
+>2 leshort 0x09 7-bit, no capitalization, 128 flags
+>2 leshort 0x0A 8-bit, capitalization, 128 flags
+>2 leshort 0x0B 7-bit, capitalization, 128 flags
+>2 leshort 0x0C 8-bit, no capitalization, 256 flags
+>2 leshort 0x0D 7-bit, no capitalization, 256 flags
+>2 leshort 0x0E 8-bit, capitalization, 256 flags
+>2 leshort 0x0F 7-bit, capitalization, 256 flags
+>4 leshort >0 and %d string characters
+0 beshort&0xFFFC 0x9600 big endian ispell
+>1 byte 0 hash file (?),
+>1 byte 1 3.0 hash file,
+>1 byte 2 3.1 hash file,
+>1 byte 3 hash file (?),
+>2 beshort 0x00 8-bit, no capitalization, 26 flags
+>2 beshort 0x01 7-bit, no capitalization, 26 flags
+>2 beshort 0x02 8-bit, capitalization, 26 flags
+>2 beshort 0x03 7-bit, capitalization, 26 flags
+>2 beshort 0x04 8-bit, no capitalization, 52 flags
+>2 beshort 0x05 7-bit, no capitalization, 52 flags
+>2 beshort 0x06 8-bit, capitalization, 52 flags
+>2 beshort 0x07 7-bit, capitalization, 52 flags
+>2 beshort 0x08 8-bit, no capitalization, 128 flags
+>2 beshort 0x09 7-bit, no capitalization, 128 flags
+>2 beshort 0x0A 8-bit, capitalization, 128 flags
+>2 beshort 0x0B 7-bit, capitalization, 128 flags
+>2 beshort 0x0C 8-bit, no capitalization, 256 flags
+>2 beshort 0x0D 7-bit, no capitalization, 256 flags
+>2 beshort 0x0E 8-bit, capitalization, 256 flags
+>2 beshort 0x0F 7-bit, capitalization, 256 flags
+>4 beshort >0 and %d string characters
+# ispell 4.0 hash files kromJx <kromJx at crosswinds.net>
+# Ispell 4.0
+0 string ISPL ispell
+>4 long x hash file version %d,
+>8 long x lexletters %d,
+>12 long x lexsize %d,
+>16 long x hashsize %d,
+>20 long x stblsize %d
+
+#------------------------------------------------------------
+# $File: java,v 1.12 2009/09/19 16:28:10 christos Exp $
+# Java ByteCode and Mach-O binaries (e.g., Mac OS X) use the
+# same magic number, 0xcafebabe, so they are both handled
+# in the entry called "cafebabe".
+#------------------------------------------------------------
+# Java serialization
+# From Martin Pool (m.pool at pharos.com.au)
+0 beshort 0xaced Java serialization data
+>2 beshort >0x0004 \b, version %d
+
+0 belong 0xfeedfeed Java KeyStore
+!:mime application/x-java-keystore
+0 belong 0xcececece Java JCE KeyStore
+!:mime application/x-java-jce-keystore
+
+# Dalvik .dex format. http://retrodev.com/android/dexformat.html
+# From <mkf at google.com> "Mike Fleming"
+0 string dex\n
+>0 regex dex\n[0-9][0-9][0-9]\0 Dalvik dex file
+>4 string >000 version %s
+0 string dey\n
+>0 regex dey\n[0-9][0-9][0-9]\0 Dalvik dex file (optimized for host)
+>4 string >000 version %s
+
+
+#------------------------------------------------------------------------------
+# $File: jpeg,v 1.15 2009/09/19 16:28:10 christos Exp $
+# JPEG images
+# SunOS 5.5.1 had
+#
+# 0 string \377\330\377\340 JPEG file
+# 0 string \377\330\377\356 JPG file
+#
+# both of which turn into "JPEG image data" here.
+#
+0 beshort 0xffd8 JPEG image data
+!:mime image/jpeg
+!:apple 8BIMJPEG
+!:strength +1
+>6 string JFIF \b, JFIF standard
+# The following added by Erik Rossen <rossen at freesurf.ch> 1999-09-06
+# in a vain attempt to add image size reporting for JFIF. Note that these
+# tests are not fool-proof since some perfectly valid JPEGs are currently
+# impossible to specify in magic(4) format.
+# First, a little JFIF version info:
+>>11 byte x \b %d.
+>>12 byte x \b%02d
+# Next, the resolution or aspect ratio of the image:
+#>>13 byte 0 \b, aspect ratio
+#>>13 byte 1 \b, resolution (DPI)
+#>>13 byte 2 \b, resolution (DPCM)
+#>>4 beshort x \b, segment length %d
+# Next, show thumbnail info, if it exists:
+>>18 byte !0 \b, thumbnail %dx
+>>>19 byte x \b%d
+
+# EXIF moved down here to avoid reporting a bogus version number,
+# and EXIF version number printing added.
+# - Patrik R=E5dman <patrik+file-magic at iki.fi>
+>6 string Exif \b, EXIF standard
+# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
+# All possible combinations of entries have to be enumerated, since no looping
+# is possible. And both endians are possible...
+# The combinations included below are from real-world JPEGs.
+# Little-endian
+>>12 string II
+# IFD 0 Entry #5:
+>>>70 leshort 0x8769
+# EXIF IFD Entry #1:
+>>>>(78.l+14) leshort 0x9000
+>>>>>(78.l+23) byte x %c
+>>>>>(78.l+24) byte x \b.%c
+>>>>>(78.l+25) byte !0x30 \b%c
+# IFD 0 Entry #9:
+>>>118 leshort 0x8769
+# EXIF IFD Entry #3:
+>>>>(126.l+38) leshort 0x9000
+>>>>>(126.l+47) byte x %c
+>>>>>(126.l+48) byte x \b.%c
+>>>>>(126.l+49) byte !0x30 \b%c
+# IFD 0 Entry #10
+>>>130 leshort 0x8769
+# EXIF IFD Entry #3:
+>>>>(138.l+38) leshort 0x9000
+>>>>>(138.l+47) byte x %c
+>>>>>(138.l+48) byte x \b.%c
+>>>>>(138.l+49) byte !0x30 \b%c
+# EXIF IFD Entry #4:
+>>>>(138.l+50) leshort 0x9000
+>>>>>(138.l+59) byte x %c
+>>>>>(138.l+60) byte x \b.%c
+>>>>>(138.l+61) byte !0x30 \b%c
+# EXIF IFD Entry #5:
+>>>>(138.l+62) leshort 0x9000
+>>>>>(138.l+71) byte x %c
+>>>>>(138.l+72) byte x \b.%c
+>>>>>(138.l+73) byte !0x30 \b%c
+# IFD 0 Entry #11
+>>>142 leshort 0x8769
+# EXIF IFD Entry #3:
+>>>>(150.l+38) leshort 0x9000
+>>>>>(150.l+47) byte x %c
+>>>>>(150.l+48) byte x \b.%c
+>>>>>(150.l+49) byte !0x30 \b%c
+# EXIF IFD Entry #4:
+>>>>(150.l+50) leshort 0x9000
+>>>>>(150.l+59) byte x %c
+>>>>>(150.l+60) byte x \b.%c
+>>>>>(150.l+61) byte !0x30 \b%c
+# EXIF IFD Entry #5:
+>>>>(150.l+62) leshort 0x9000
+>>>>>(150.l+71) byte x %c
+>>>>>(150.l+72) byte x \b.%c
+>>>>>(150.l+73) byte !0x30 \b%c
+# Big-endian
+>>12 string MM
+# IFD 0 Entry #9:
+>>>118 beshort 0x8769
+# EXIF IFD Entry #1:
+>>>>(126.L+14) beshort 0x9000
+>>>>>(126.L+23) byte x %c
+>>>>>(126.L+24) byte x \b.%c
+>>>>>(126.L+25) byte !0x30 \b%c
+# EXIF IFD Entry #3:
+>>>>(126.L+38) beshort 0x9000
+>>>>>(126.L+47) byte x %c
+>>>>>(126.L+48) byte x \b.%c
+>>>>>(126.L+49) byte !0x30 \b%c
+# IFD 0 Entry #10
+>>>130 beshort 0x8769
+# EXIF IFD Entry #3:
+>>>>(138.L+38) beshort 0x9000
+>>>>>(138.L+47) byte x %c
+>>>>>(138.L+48) byte x \b.%c
+>>>>>(138.L+49) byte !0x30 \b%c
+# EXIF IFD Entry #5:
+>>>>(138.L+62) beshort 0x9000
+>>>>>(138.L+71) byte x %c
+>>>>>(138.L+72) byte x \b.%c
+>>>>>(138.L+73) byte !0x30 \b%c
+# IFD 0 Entry #11
+>>>142 beshort 0x8769
+# EXIF IFD Entry #4:
+>>>>(150.L+50) beshort 0x9000
+>>>>>(150.L+59) byte x %c
+>>>>>(150.L+60) byte x \b.%c
+>>>>>(150.L+61) byte !0x30 \b%c
+# Here things get sticky. We can do ONE MORE marker segment with
+# indirect addressing, and that's all. It would be great if we could
+# do pointer arithemetic like in an assembler language. Christos?
+# And if there was some sort of looping construct to do searches, plus a few
+# named accumulators, it would be even more effective...
+# At least we can show a comment if no other segments got inserted before:
+>(4.S+5) byte 0xFE
+>>(4.S+8) string >\0 \b, comment: "%s"
+# FIXME: When we can do non-byte counted strings, we can use that to get
+# the string's count, and fix Debian bug #283760
+#>(4.S+5) byte 0xFE \b, comment
+#>>(4.S+6) beshort x \b length=%d
+#>>(4.S+8) string >\0 \b, "%s"
+# Or, we can show the encoding type (I've included only the three most common)
+# and image dimensions if we are lucky and the SOFn (image segment) is here:
+>(4.S+5) byte 0xC0 \b, baseline
+>>(4.S+6) byte x \b, precision %d
+>>(4.S+7) beshort x \b, %dx
+>>(4.S+9) beshort x \b%d
+>(4.S+5) byte 0xC1 \b, extended sequential
+>>(4.S+6) byte x \b, precision %d
+>>(4.S+7) beshort x \b, %dx
+>>(4.S+9) beshort x \b%d
+>(4.S+5) byte 0xC2 \b, progressive
+>>(4.S+6) byte x \b, precision %d
+>>(4.S+7) beshort x \b, %dx
+>>(4.S+9) beshort x \b%d
+# I've commented-out quantisation table reporting. I doubt anyone cares yet.
+#>(4.S+5) byte 0xDB \b, quantisation table
+#>>(4.S+6) beshort x \b length=%d
+#>14 beshort x \b, %d x
+#>16 beshort x \b %d
+
+# HSI is Handmade Software's proprietary JPEG encoding scheme
+0 string hsi1 JPEG image data, HSI proprietary
+
+# From: David Santinoli <david at santinoli.com>
+0 string \x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A JPEG 2000 image data
+
+# Type: JPEG 2000 codesream
+# From: Mathieu Malaterre <mathieu.malaterre at gmail.com>
+0 belong 0xff4fff51 JPEG 2000 codestream
+45 beshort 0xff52
+
+#------------------------------------------------------------------------------
+# $File: karma,v 1.6 2009/09/19 16:28:10 christos Exp $
+# karma: file(1) magic for Karma data files
+#
+# From <rgooch at atnf.csiro.au>
+
+0 string KarmaRHD Version Karma Data Structure Version
+>16 belong x %lu
+
+#------------------------------------------------------------------------------
+# $File: kde,v 1.4 2009/09/19 16:28:10 christos Exp $
+# kde: file(1) magic for KDE
+
+0 string [KDE\ Desktop\ Entry] KDE desktop entry
+!:mime application/x-kdelnk
+0 string #\ KDE\ Config\ File KDE config file
+!:mime application/x-kdelnk
+0 string #\ xmcd xmcd database file for kscd
+!:mime text/x-xmcd
+
+#------------------------------------------------------------------------------
+# $File: kml,v 1.2 2009/09/19 16:28:10 christos Exp $
+# Type: Google KML, formerly Keyhole Markup Language
+# Future development of this format has been handed
+# over to the Open Geospatial Consortium.
+# http://www.opengeospatial.org/standards/kml/
+# From: Asbjoern Sloth Toennesen <asbjorn at lila.io>
+0 string \<?xml
+>20 search/400 \ xmlns=
+>>&0 regex ['"]http://earth.google.com/kml Google KML document
+!:mime application/vnd.google-earth.kml+xml
+>>>&1 string 2.0' \b, version 2.0
+>>>&1 string 2.1' \b, version 2.1
+>>>&1 string 2.2' \b, version 2.2
+
+#------------------------------------------------------------------------------
+# Type: OpenGIS KML, formerly Keyhole Markup Language
+# This standard is maintained by the
+# Open Geospatial Consortium.
+# http://www.opengeospatial.org/standards/kml/
+# From: Asbjoern Sloth Toennesen <asbjorn at lila.io>
+>>&0 regex ['"]http://www.opengis.net/kml OpenGIS KML document
+!:mime application/vnd.google-earth.kml+xml
+>>>&1 string 2.2 \b, version 2.2
+
+#------------------------------------------------------------------------------
+# Type: Google KML Archive (ZIP based)
+# http://code.google.com/apis/kml/documentation/kml_tut.html
+# From: Asbjoern Sloth Toennesen <asbjorn at lila.io>
+0 string PK\003\004
+>4 byte 0x14
+>>30 string doc.kml Compressed Google KML Document, including resources.
+!:mime application/vnd.google-earth.kmz
+
+#------------------------------------------------------------------------------
+# $File: lecter,v 1.4 2009/09/19 16:28:10 christos Exp $
+# DEC SRC Virtual Paper: Lectern files
+# Karl M. Hegbloom <karlheg at inetarena.com>
+0 string lect DEC SRC Virtual Paper Lectern file
+
+#------------------------------------------------------------------------------
+# $File: lex,v 1.6 2009/09/19 16:28:10 christos Exp $
+# lex: file(1) magic for lex
+#
+# derived empirically, your offsets may vary!
+0 search/100 yyprevious C program text (from lex)
+>3 search/1 >\0 for %s
+# C program text from GNU flex, from Daniel Quinlan <quinlan at yggdrasil.com>
+0 search/100 generated\ by\ flex C program text (from flex)
+# lex description file, from Daniel Quinlan <quinlan at yggdrasil.com>
+0 search/1 %{ lex description text
+
+#------------------------------------------------------------------------------
+# $File: lif,v 1.8 2009/09/19 16:28:10 christos Exp $
+# lif: file(1) magic for lif
+#
+# (Daniel Quinlan <quinlan at yggdrasil.com>)
+#
+0 beshort 0x8000 lif file
+
+#------------------------------------------------------------------------------
+# $File: linux,v 1.33 2009/10/23 16:44:59 christos Exp $
+# linux: file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan at yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2 leshort 100 Linux/i386
+# >0 leshort 0407 impure executable (OMAGIC)
+# >0 leshort 0410 pure executable (NMAGIC)
+# >0 leshort 0413 demand-paged executable (ZMAGIC)
+# >0 leshort 0314 demand-paged executable (QMAGIC)
+#
+0 lelong 0x00640107 Linux/i386 impure executable (OMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x00640108 Linux/i386 pure executable (NMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x0064010b Linux/i386 demand-paged executable (ZMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x006400cc Linux/i386 demand-paged executable (QMAGIC)
+>16 lelong 0 \b, stripped
+#
+0 string \007\001\000 Linux/i386 object file
+>20 lelong >0x1020 \b, DLL library
+# Linux-8086 stuff:
+0 string \01\03\020\04 Linux-8086 impure executable
+>28 long !0 not stripped
+0 string \01\03\040\04 Linux-8086 executable
+>28 long !0 not stripped
+#
+0 string \243\206\001\0 Linux-8086 object file
+#
+0 string \01\03\020\20 Minix-386 impure executable
+>28 long !0 not stripped
+0 string \01\03\040\20 Minix-386 executable
+>28 long !0 not stripped
+# core dump file, from Bill Reynolds <bill at goshawk.lanl.gov>
+216 lelong 0421 Linux/i386 core file
+>220 string >\0 of '%s'
+>200 lelong >0 (signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan at yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2 string LILO Linux/i386 LILO boot/chain loader
+#
+# PSF fonts, from H. Peter Anvin <hpa at yggdrasil.com>
+0 leshort 0x0436 Linux/i386 PC Screen Font data,
+>2 byte 0 256 characters, no directory,
+>2 byte 1 512 characters, no directory,
+>2 byte 2 256 characters, Unicode directory,
+>2 byte 3 512 characters, Unicode directory,
+>3 byte >0 8x%d
+# Linux swap file, from Daniel Quinlan <quinlan at yggdrasil.com>
+4086 string SWAP-SPACE Linux/i386 swap file
+# From: Jeff Bailey <jbailey at ubuntu.com>
+# Linux swap file with swsusp1 image, from Jeff Bailey <jbailey at ubuntu.com>
+4076 string SWAPSPACE2S1SUSPEND Linux/i386 swap file (new style) with SWSUSP1 image
+# according to man page of mkswap (8) March 1999
+4086 string SWAPSPACE2 Linux/i386 swap file (new style)
+>0x400 long x %d (4K pages)
+>0x404 long x size %d pages
+>>4086 string SWAPSPACE2
+>>>1052 string >\0 Label %s
+# From Daniel Novotny <dnovotny at redhat.com>
+# swap file for PowerPC
+65526 string SWAPSPACE2 Linux/ppc swap file
+16374 string SWAPSPACE2 Linux/ia64 swap file
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+# from Erik Troan (ewt at redhat.com) examining od dumps, so this
+# could be wrong
+# updated by David Mosberger (davidm at azstarnet.com) based on
+# GNU BFD and MIPS info found below.
+#
+0 leshort 0x0183 ECOFF alpha
+>24 leshort 0407 executable
+>24 leshort 0410 pure
+>24 leshort 0413 demand paged
+>8 long >0 not stripped
+>8 long 0 stripped
+>23 leshort >0 - version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan at cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey at rincewind.chemie.uni-ulm.de>
+# and Nicol�s Lichtmaier <nick at debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+# Linux kernel boot images (i386 arch) (Wolfram Kleff)
+514 string HdrS Linux kernel
+>510 leshort 0xAA55 x86 boot executable
+>>518 leshort >0x1ff
+>>>529 byte 0 zImage,
+>>>529 byte 1 bzImage,
+>>>(526.s+0x200) string >\0 version %s,
+>>498 leshort 1 RO-rootFS,
+>>498 leshort 0 RW-rootFS,
+>>508 leshort >0 root_dev 0x%X,
+>>502 leshort >0 swap_dev 0x%X,
+>>504 leshort >0 RAMdisksize %u KB,
+>>506 leshort 0xFFFF Normal VGA
+>>506 leshort 0xFFFE Extended VGA
+>>506 leshort 0xFFFD Prompt for Videomode
+>>506 leshort >0 Video mode %d
+# This also matches new kernels, which were caught above by "HdrS".
+0 belong 0xb8c0078e Linux kernel
+>0x1e3 string Loading version 1.3.79 or older
+>0x1e9 string Loading from prehistoric times
+
+# System.map files - Nicol�s Lichtmaier <nick at debian.org>
+8 search/1 \ A\ _text Linux kernel symbol map text
+
+# LSM entries - Nicol�s Lichtmaier <nick at debian.org>
+0 search/1 Begin3 Linux Software Map entry text
+0 search/1 Begin4 Linux Software Map entry text (new format)
+
+# From Matt Zimmerman, enhanced for v3 by Matthew Palmer
+0 belong 0x4f4f4f4d User-mode Linux COW file
+>4 belong <3 \b, version %d
+>>8 string >\0 \b, backing file %s
+>4 belong >2 \b, version %d
+>>32 string >\0 \b, backing file %s
+
+############################################################################
+# Linux kernel versions
+
+0 string \xb8\xc0\x07\x8e\xd8\xb8\x00\x90 Linux
+>497 leshort 0 x86 boot sector
+>>514 belong 0x8e of a kernel from the dawn of time!
+>>514 belong 0x908ed8b4 version 0.99-1.1.42
+>>514 belong 0x908ed8b8 for memtest86
+
+>497 leshort !0 x86 kernel
+>>504 leshort >0 RAMdisksize=%u KB
+>>502 leshort >0 swap=0x%X
+>>508 leshort >0 root=0x%X
+>>>498 leshort 1 \b-ro
+>>>498 leshort 0 \b-rw
+>>506 leshort 0xFFFF vga=normal
+>>506 leshort 0xFFFE vga=extended
+>>506 leshort 0xFFFD vga=ask
+>>506 leshort >0 vga=%d
+>>514 belong 0x908ed881 version 1.1.43-1.1.45
+>>514 belong 0x15b281cd
+>>>0xa8e belong 0x55AA5a5a version 1.1.46-1.2.13,1.3.0
+>>>0xa99 belong 0x55AA5a5a version 1.3.1,2
+>>>0xaa3 belong 0x55AA5a5a version 1.3.3-1.3.30
+>>>0xaa6 belong 0x55AA5a5a version 1.3.31-1.3.41
+>>>0xb2b belong 0x55AA5a5a version 1.3.42-1.3.45
+>>>0xaf7 belong 0x55AA5a5a version 1.3.46-1.3.72
+>>514 string HdrS
+>>>518 leshort >0x1FF
+>>>>529 byte 0 \b, zImage
+>>>>529 byte 1 \b, bzImage
+>>>>(526.s+0x200) string >\0 \b, version %s
+
+# Linux boot sector thefts.
+0 belong 0xb8c0078e Linux
+>0x1e6 belong 0x454c4b53 ELKS Kernel
+>0x1e6 belong !0x454c4b53 style boot sector
+
+############################################################################
+# Linux S390 executable
+8 string \x02\x00\x00\x18\x60\x00\x00\x50\x02\x00\x00\x68\x60\x00\x00\x50\x40\x40\x40\x40\x40\x40\x40\x40 Linux S390
+>0x00010000 search/b/4096 \x00\x0a\x00\x00\x8b\xad\xcc\xcc
+# 64bit
+>>&0 string \xc1\x00\xef\xe3\xf0\x68\x00\x00 Z10 64bit kernel
+>>&0 string \xc1\x00\xef\xc3\x00\x00\x00\x00 Z9-109 64bit kernel
+>>&0 string \xc0\x00\x20\x00\x00\x00\x00\x00 Z990 64bit kernel
+>>&0 string \x00\x00\x00\x00\x00\x00\x00\x00 Z900 64bit kernel
+# 32bit
+>>&0 string \x81\x00\xc8\x80\x00\x00\x00\x00 Z10 32bit kernel
+>>&0 string \x81\x00\xc8\x80\x00\x00\x00\x00 Z9-109 32bit kernel
+>>&0 string \x80\x00\x20\x00\x00\x00\x00\x00 Z990 32bit kernel
+>>&0 string \x80\x00\x00\x00\x00\x00\x00\x00 Z900 32bit kernel
+
+############################################################################
+# Linux 8086 executable
+0 lelong&0xFF0000FF 0xC30000E9 Linux-Dev86 executable, headerless
+>5 string .
+>>4 string >\0 \b, libc version %s
+
+0 lelong&0xFF00FFFF 0x4000301 Linux-8086 executable
+>2 byte&0x01 !0 \b, unmapped zero page
+>2 byte&0x20 0 \b, impure
+>2 byte&0x20 !0
+>>2 byte&0x10 !0 \b, A_EXEC
+>2 byte&0x02 !0 \b, A_PAL
+>2 byte&0x04 !0 \b, A_NSYM
+>2 byte&0x08 !0 \b, A_STAND
+>2 byte&0x40 !0 \b, A_PURE
+>2 byte&0x80 !0 \b, A_TOVLY
+>28 long !0 \b, not stripped
+>37 string .
+>>36 string >\0 \b, libc version %s
+
+# 0 lelong&0xFF00FFFF 0x10000301 ld86 I80386 executable
+# 0 lelong&0xFF00FFFF 0xB000301 ld86 M68K executable
+# 0 lelong&0xFF00FFFF 0xC000301 ld86 NS16K executable
+# 0 lelong&0xFF00FFFF 0x17000301 ld86 SPARC executable
+
+# SYSLINUX boot logo files (from 'ppmtolss16' sources)
+# http://syslinux.zytor.com/
+#
+0 lelong =0x1413f33d SYSLINUX' LSS16 image data
+>4 leshort x \b, width %d
+>6 leshort x \b, height %d
+
+0 string OOOM User-Mode-Linux's Copy-On-Write disk image
+>4 belong x version %d
+
+# SE Linux policy database
+# From: Mike Frysinger <vapier at gentoo.org>
+0 lelong 0xf97cff8c SE Linux policy
+>16 lelong x v%d
+>20 lelong 1 MLS
+>24 lelong x %d symbols
+>28 lelong x %d ocons
+
+# Linux Logical Volume Manager (LVM)
+# Emmanuel VARAGNAT <emmanuel.varagnat at guzu.net>
+#
+# System ID, UUID and volume group name are 128 bytes long
+# but they should never be full and initialized with zeros...
+#
+# LVM1
+#
+0x0 string HM\001 LVM1 (Linux Logical Volume Manager), version 1
+>0x12c string >\0 , System ID: %s
+
+0x0 string HM\002 LVM1 (Linux Logical Volume Manager), version 2
+>0x12c string >\0 , System ID: %s
+
+# LVM2
+#
+# It seems that the label header can be in one the four first sector
+# of the disk... (from _find_labeller in lib/label/label.c of LVM2)
+#
+# 0x200 seems to be the common case
+
+0x218 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+# read the offset to add to the start of the header, and the header
+# start in 0x200
+>(0x214.l+0x200) string >\0 , UUID: %s
+
+0x018 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x014.l) string >\0 , UUID: %s
+
+0x418 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x414.l+0x400) string >\0 , UUID: %s
+
+0x618 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x614.l+0x600) string >\0 , UUID: %s
+
+# LVM snapshot
+# from Jason Farrel
+0 string SnAp LVM Snapshot (CopyOnWrite store)
+>4 lelong !0 - valid,
+>4 lelong 0 - invalid,
+>8 lelong x version %d,
+>12 lelong x chunk_size %d
+
+# SE Linux policy database
+0 lelong 0xf97cff8c SE Linux policy
+>16 lelong x v%d
+>20 lelong 1 MLS
+>24 lelong x %d symbols
+>28 lelong x %d ocons
+
+# LUKS: Linux Unified Key Setup, On-Disk Format, http://luks.endorphin.org/spec
+# Anthon van der Neut (anthon at mnt.org)
+0 string LUKS\xba\xbe LUKS encrypted file,
+>6 beshort x ver %d
+>8 string x [%s,
+>40 string x %s,
+>72 string x %s]
+>168 string x UUID: %s
+
+
+# Summary: Xen saved domain file
+# Created by: Radek Vokal <rvokal at redhat.com>
+0 string LinuxGuestRecord Xen saved domain
+>20 search/256 (name
+>>&1 string x (name %s)
+
+
+#------------------------------------------------------------------------------
+# $File: linux,v 1.33 2009/10/23 16:44:59 christos Exp $
+# linux: file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan at yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2 leshort 100 Linux/i386
+# >0 leshort 0407 impure executable (OMAGIC)
+# >0 leshort 0410 pure executable (NMAGIC)
+# >0 leshort 0413 demand-paged executable (ZMAGIC)
+# >0 leshort 0314 demand-paged executable (QMAGIC)
+#
+0 lelong 0x00640107 Linux/i386 impure executable (OMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x00640108 Linux/i386 pure executable (NMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x0064010b Linux/i386 demand-paged executable (ZMAGIC)
+>16 lelong 0 \b, stripped
+0 lelong 0x006400cc Linux/i386 demand-paged executable (QMAGIC)
+>16 lelong 0 \b, stripped
+#
+0 string \007\001\000 Linux/i386 object file
+>20 lelong >0x1020 \b, DLL library
+# Linux-8086 stuff:
+0 string \01\03\020\04 Linux-8086 impure executable
+>28 long !0 not stripped
+0 string \01\03\040\04 Linux-8086 executable
+>28 long !0 not stripped
+#
+0 string \243\206\001\0 Linux-8086 object file
+#
+0 string \01\03\020\20 Minix-386 impure executable
+>28 long !0 not stripped
+0 string \01\03\040\20 Minix-386 executable
+>28 long !0 not stripped
+# core dump file, from Bill Reynolds <bill at goshawk.lanl.gov>
+216 lelong 0421 Linux/i386 core file
+>220 string >\0 of '%s'
+>200 lelong >0 (signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan at yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2 string LILO Linux/i386 LILO boot/chain loader
+#
+# PSF fonts, from H. Peter Anvin <hpa at yggdrasil.com>
+0 leshort 0x0436 Linux/i386 PC Screen Font data,
+>2 byte 0 256 characters, no directory,
+>2 byte 1 512 characters, no directory,
+>2 byte 2 256 characters, Unicode directory,
+>2 byte 3 512 characters, Unicode directory,
+>3 byte >0 8x%d
+# Linux swap file, from Daniel Quinlan <quinlan at yggdrasil.com>
+4086 string SWAP-SPACE Linux/i386 swap file
+# From: Jeff Bailey <jbailey at ubuntu.com>
+# Linux swap file with swsusp1 image, from Jeff Bailey <jbailey at ubuntu.com>
+4076 string SWAPSPACE2S1SUSPEND Linux/i386 swap file (new style) with SWSUSP1 image
+# according to man page of mkswap (8) March 1999
+4086 string SWAPSPACE2 Linux/i386 swap file (new style)
+>0x400 long x %d (4K pages)
+>0x404 long x size %d pages
+>>4086 string SWAPSPACE2
+>>>1052 string >\0 Label %s
+# From Daniel Novotny <dnovotny at redhat.com>
+# swap file for PowerPC
+65526 string SWAPSPACE2 Linux/ppc swap file
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+# from Erik Troan (ewt at redhat.com) examining od dumps, so this
+# could be wrong
+# updated by David Mosberger (davidm at azstarnet.com) based on
+# GNU BFD and MIPS info found below.
+#
+0 leshort 0x0183 ECOFF alpha
+>24 leshort 0407 executable
+>24 leshort 0410 pure
+>24 leshort 0413 demand paged
+>8 long >0 not stripped
+>8 long 0 stripped
+>23 leshort >0 - version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan at cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey at rincewind.chemie.uni-ulm.de>
+# and Nicol�s Lichtmaier <nick at debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+# Linux kernel boot images (i386 arch) (Wolfram Kleff)
+514 string HdrS Linux kernel
+>510 leshort 0xAA55 x86 boot executable
+>>518 leshort >0x1ff
+>>>529 byte 0 zImage,
+>>>529 byte 1 bzImage,
+>>>(526.s+0x200) string >\0 version %s,
+>>498 leshort 1 RO-rootFS,
+>>498 leshort 0 RW-rootFS,
+>>508 leshort >0 root_dev 0x%X,
+>>502 leshort >0 swap_dev 0x%X,
+>>504 leshort >0 RAMdisksize %u KB,
+>>506 leshort 0xFFFF Normal VGA
+>>506 leshort 0xFFFE Extended VGA
+>>506 leshort 0xFFFD Prompt for Videomode
+>>506 leshort >0 Video mode %d
+# This also matches new kernels, which were caught above by "HdrS".
+0 belong 0xb8c0078e Linux kernel
+>0x1e3 string Loading version 1.3.79 or older
+>0x1e9 string Loading from prehistoric times
+
+# System.map files - Nicol�s Lichtmaier <nick at debian.org>
+8 search/1 \ A\ _text Linux kernel symbol map text
+
+# LSM entries - Nicol�s Lichtmaier <nick at debian.org>
+0 search/1 Begin3 Linux Software Map entry text
+0 search/1 Begin4 Linux Software Map entry text (new format)
+
+# From Matt Zimmerman, enhanced for v3 by Matthew Palmer
+0 belong 0x4f4f4f4d User-mode Linux COW file
+>4 belong <3 \b, version %d
+>>8 string >\0 \b, backing file %s
+>4 belong >2 \b, version %d
+>>32 string >\0 \b, backing file %s
+
+############################################################################
+# Linux kernel versions
+
+0 string \xb8\xc0\x07\x8e\xd8\xb8\x00\x90 Linux
+>497 leshort 0 x86 boot sector
+>>514 belong 0x8e of a kernel from the dawn of time!
+>>514 belong 0x908ed8b4 version 0.99-1.1.42
+>>514 belong 0x908ed8b8 for memtest86
+
+>497 leshort !0 x86 kernel
+>>504 leshort >0 RAMdisksize=%u KB
+>>502 leshort >0 swap=0x%X
+>>508 leshort >0 root=0x%X
+>>>498 leshort 1 \b-ro
+>>>498 leshort 0 \b-rw
+>>506 leshort 0xFFFF vga=normal
+>>506 leshort 0xFFFE vga=extended
+>>506 leshort 0xFFFD vga=ask
+>>506 leshort >0 vga=%d
+>>514 belong 0x908ed881 version 1.1.43-1.1.45
+>>514 belong 0x15b281cd
+>>>0xa8e belong 0x55AA5a5a version 1.1.46-1.2.13,1.3.0
+>>>0xa99 belong 0x55AA5a5a version 1.3.1,2
+>>>0xaa3 belong 0x55AA5a5a version 1.3.3-1.3.30
+>>>0xaa6 belong 0x55AA5a5a version 1.3.31-1.3.41
+>>>0xb2b belong 0x55AA5a5a version 1.3.42-1.3.45
+>>>0xaf7 belong 0x55AA5a5a version 1.3.46-1.3.72
+>>514 string HdrS
+>>>518 leshort >0x1FF
+>>>>529 byte 0 \b, zImage
+>>>>529 byte 1 \b, bzImage
+>>>>(526.s+0x200) string >\0 \b, version %s
+
+# Linux boot sector thefts.
+0 belong 0xb8c0078e Linux
+>0x1e6 belong 0x454c4b53 ELKS Kernel
+>0x1e6 belong !0x454c4b53 style boot sector
+
+############################################################################
+# Linux 8086 executable
+0 lelong&0xFF0000FF 0xC30000E9 Linux-Dev86 executable, headerless
+>5 string .
+>>4 string >\0 \b, libc version %s
+
+0 lelong&0xFF00FFFF 0x4000301 Linux-8086 executable
+>2 byte&0x01 !0 \b, unmapped zero page
+>2 byte&0x20 0 \b, impure
+>2 byte&0x20 !0
+>>2 byte&0x10 !0 \b, A_EXEC
+>2 byte&0x02 !0 \b, A_PAL
+>2 byte&0x04 !0 \b, A_NSYM
+>2 byte&0x08 !0 \b, A_STAND
+>2 byte&0x40 !0 \b, A_PURE
+>2 byte&0x80 !0 \b, A_TOVLY
+>28 long !0 \b, not stripped
+>37 string .
+>>36 string >\0 \b, libc version %s
+
+# 0 lelong&0xFF00FFFF 0x10000301 ld86 I80386 executable
+# 0 lelong&0xFF00FFFF 0xB000301 ld86 M68K executable
+# 0 lelong&0xFF00FFFF 0xC000301 ld86 NS16K executable
+# 0 lelong&0xFF00FFFF 0x17000301 ld86 SPARC executable
+
+# SYSLINUX boot logo files (from 'ppmtolss16' sources)
+# http://syslinux.zytor.com/
+#
+0 lelong =0x1413f33d SYSLINUX' LSS16 image data
+>4 leshort x \b, width %d
+>6 leshort x \b, height %d
+
+0 string OOOM User-Mode-Linux's Copy-On-Write disk image
+>4 belong x version %d
+
+# SE Linux policy database
+# From: Mike Frysinger <vapier at gentoo.org>
+0 lelong 0xf97cff8c SE Linux policy
+>16 lelong x v%d
+>20 lelong 1 MLS
+>24 lelong x %d symbols
+>28 lelong x %d ocons
+
+# Linux Logical Volume Manager (LVM)
+# Emmanuel VARAGNAT <emmanuel.varagnat at guzu.net>
+#
+# System ID, UUID and volume group name are 128 bytes long
+# but they should never be full and initialized with zeros...
+#
+# LVM1
+#
+0x0 string HM\001 LVM1 (Linux Logical Volume Manager), version 1
+>0x12c string >\0 , System ID: %s
+
+0x0 string HM\002 LVM1 (Linux Logical Volume Manager), version 2
+>0x12c string >\0 , System ID: %s
+
+# LVM2
+#
+# It seems that the label header can be in one the four first sector
+# of the disk... (from _find_labeller in lib/label/label.c of LVM2)
+#
+# 0x200 seems to be the common case
+
+0x218 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+# read the offset to add to the start of the header, and the header
+# start in 0x200
+>(0x214.l+0x200) string >\0 , UUID: %s
+
+0x018 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x014.l) string >\0 , UUID: %s
+
+0x418 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x414.l+0x400) string >\0 , UUID: %s
+
+0x618 string LVM2\ 001 LVM2 (Linux Logical Volume Manager)
+>(0x614.l+0x600) string >\0 , UUID: %s
+
+# LVM snapshot
+# from Jason Farrel
+0 string SnAp LVM Snapshot (CopyOnWrite store)
+>4 lelong !0 - valid,
+>4 lelong 0 - invalid,
+>8 lelong x version %d,
+>12 lelong x chunk_size %d
+
+# SE Linux policy database
+0 lelong 0xf97cff8c SE Linux policy
+>16 lelong x v%d
+>20 lelong 1 MLS
+>24 lelong x %d symbols
+>28 lelong x %d ocons
+
+# LUKS: Linux Unified Key Setup, On-Disk Format, http://luks.endorphin.org/spec
+# Anthon van der Neut (anthon at mnt.org)
+0 string LUKS\xba\xbe LUKS encrypted file,
+>6 beshort x ver %d
+>8 string x [%s,
+>40 string x %s,
+>72 string x %s]
+>168 string x UUID: %s
+
+
+# Summary: Xen saved domain file
+# Created by: Radek Vokal <rvokal at redhat.com>
+0 string LinuxGuestRecord Xen saved domain
+>20 search/256 (name
+>>&1 string x (name %s)
+
+
+#------------------------------------------------------------------------------
+# $File: lisp,v 1.23 2009/09/19 16:28:10 christos Exp $
+# lisp: file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan at yggdrasil.com)
+
+# updated by Joerg Jenderek
+# GRR: This lot is too weak
+#0 string ;;
+# windows INF files often begin with semicolon and use CRLF as line end
+# lisp files are mainly created on unix system with LF as line end
+#>2 search/4096 !\r Lisp/Scheme program text
+#>2 search/4096 \r Windows INF file
+
+0 search/4096 (setq\ Lisp/Scheme program text
+!:mime text/x-lisp
+0 search/4096 (defvar\ Lisp/Scheme program text
+!:mime text/x-lisp
+0 search/4096 (defparam\ Lisp/Scheme program text
+!:mime text/x-lisp
+0 search/4096 (defun\ Lisp/Scheme program text
+!:mime text/x-lisp
+0 search/4096 (autoload\ Lisp/Scheme program text
+!:mime text/x-lisp
+0 search/4096 (custom-set-variables\ Lisp/Scheme program text
+!:mime text/x-lisp
+
+# Emacs 18 - this is always correct, but not very magical.
+0 string \012( Emacs v18 byte-compiled Lisp data
+!:mime application/x-elc
+# Emacs 19+ - ver. recognition added by Ian Springer
+# Also applies to XEmacs 19+ .elc files; could tell them apart with regexs
+# - Chris Chittleborough <cchittleborough at yahoo.com.au>
+0 string ;ELC
+>4 byte >18
+>4 byte <32 Emacs/XEmacs v%d byte-compiled Lisp data
+!:mime application/x-elc
+
+# Files produced by CLISP Common Lisp From: Bruno Haible <haible at ilog.fr>
+0 string (SYSTEM::VERSION\040' CLISP byte-compiled Lisp program (pre 2004-03-27)
+0 string (|SYSTEM|::|VERSION|\040' CLISP byte-compiled Lisp program text
+
+0 long 0x70768BD2 CLISP memory image data
+0 long 0xD28B7670 CLISP memory image data, other endian
+
+#.com and .bin for MIT scheme
+0 string \372\372\372\372 MIT scheme (library?)
+
+# From: David Allouche <david at allouche.net>
+0 search/1 \<TeXmacs| TeXmacs document text
+!:mime text/texmacs
+
+#------------------------------------------------------------------------------
+# $File: llvm,v 1.4 2009/09/19 16:28:10 christos Exp $
+# llvm: file(1) magic for LLVM byte-codes
+# URL: http://llvm.cs.uiuc.edu/docs/BytecodeFormat.html#signature
+# From: Al Stone <ahs3 at fc.hp.com>
+
+0 string llvm LLVM byte-codes, uncompressed
+0 string llvc0 LLVM byte-codes, null compression
+0 string llvc1 LLVM byte-codes, gzip compression
+0 string llvc2 LLVM byte-codes, bzip2 compression
+
+#------------------------------------------------------------------------------
+# $File: lua,v 1.5 2009/09/19 16:28:10 christos Exp $
+# lua: file(1) magic for Lua scripting language
+# URL: http://www.lua.org/
+# From: Reuben Thomas <rrt at sc3d.org>, Seo Sanghyeon <tinuviel at sparcs.kaist.ac.kr>
+
+# Lua scripts
+0 search/1/w #!\ /usr/bin/lua Lua script text executable
+!:mime text/x-lua
+0 search/1/w #!\ /usr/local/bin/lua Lua script text executable
+!:mime text/x-lua
+0 search/1 #!/usr/bin/env\ lua Lua script text executable
+!:mime text/x-lua
+0 search/1 #!\ /usr/bin/env\ lua Lua script text executable
+!:mime text/x-lua
+
+# Lua bytecode
+0 string \033Lua Lua bytecode,
+>4 byte 0x50 version 5.0
+>4 byte 0x51 version 5.1
+
+#------------------------------------------------------------------------------
+# $File: luks,v 1.4 2009/09/19 16:28:10 christos Exp $
+# luks: file(1) magic for Linux Unified Key Setup
+# URL: http://luks.endorphin.org/spec
+# From: Anthon van der Neut <anthon at mnt.org>
+
+0 string LUKS\xba\xbe LUKS encrypted file,
+>6 beshort x ver %d
+>8 string x [%s,
+>40 string x %s,
+>72 string x %s]
+>168 string x UUID: %s
+
+#------------------------------------------------------------
+# $File: mach,v 1.9 2009/09/19 16:28:10 christos Exp $
+# Mach has two magic numbers, 0xcafebabe and 0xfeedface.
+# Unfortunately the first, cafebabe, is shared with
+# Java ByteCode, so they are both handled in the file "cafebabe".
+# The "feedface" ones are handled herein.
+#------------------------------------------------------------
+0 lelong&0xfffffffe 0xfeedface Mach-O
+>0 byte 0xcf 64-bit
+>12 lelong 1 object
+>12 lelong 2 executable
+>12 lelong 3 fixed virtual memory shared library
+>12 lelong 4 core
+>12 lelong 5 preload executable
+>12 lelong 6 dynamically linked shared library
+>12 lelong 7 dynamic linker
+>12 lelong 8 bundle
+>12 lelong 9 dynamically linked shared library stub
+>12 lelong >9
+>>12 lelong x filetype=%ld
+>4 lelong <0
+>>4 lelong x architecture=%ld
+>4 lelong 1 vax
+>4 lelong 2 romp
+>4 lelong 3 architecture=3
+>4 lelong 4 ns32032
+>4 lelong 5 ns32332
+>4 lelong 6 m68k
+>4 lelong 7 i386
+>4 lelong 8 mips
+>4 lelong 9 ns32532
+>4 lelong 10 architecture=10
+>4 lelong 11 hppa
+>4 lelong 12 acorn
+>4 lelong 13 m88k
+>4 lelong 14 sparc
+>4 lelong 15 i860-big
+>4 lelong 16 i860
+>4 lelong 17 rs6000
+>4 lelong 18 ppc
+>4 lelong 16777234 ppc64
+>4 lelong >16777234
+>>4 lelong x architecture=%ld
+#
+0 belong&0xfffffffe 0xfeedface Mach-O
+>3 byte 0xcf 64-bit
+>12 belong 1 object
+>12 belong 2 executable
+>12 belong 3 fixed virtual memory shared library
+>12 belong 4 core
+>12 belong 5 preload executable
+>12 belong 6 dynamically linked shared library
+>12 belong 7 dynamic linker
+>12 belong 8 bundle
+>12 belong 9 dynamically linked shared library stub
+>12 belong >9
+>>12 belong x filetype=%ld
+>4 belong <0
+>>4 belong x architecture=%ld
+>4 belong 1 vax
+>4 belong 2 romp
+>4 belong 3 architecture=3
+>4 belong 4 ns32032
+>4 belong 5 ns32332
+>4 belong 6 for m68k architecture
+# from NeXTstep 3.0 <mach/machine.h>
+# i.e. mc680x0_all, ignore
+# >>8 belong 1 (mc68030)
+>>8 belong 2 (mc68040)
+>>8 belong 3 (mc68030 only)
+>4 belong 7 i386
+>4 belong 8 mips
+>4 belong 9 ns32532
+>4 belong 10 architecture=10
+>4 belong 11 hppa
+>4 belong 12 acorn
+>4 belong 13 m88k
+>4 belong 14 sparc
+>4 belong 15 i860-big
+>4 belong 16 i860
+>4 belong 17 rs6000
+>4 belong 18 ppc
+>4 belong 16777234 ppc64
+>4 belong >16777234
+>>4 belong x architecture=%ld
+
+#------------------------------------------------------------------------------
+# $File: macintosh,v 1.20 2009/09/19 16:28:10 christos Exp $
+# macintosh description
+#
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11 string must\ be\ converted\ with\ BinHex BinHex binary text
+!:mime application/mac-binhex40
+>41 string x \b, version %.3s
+
+# Stuffit archives are the de facto standard of compression for Macintosh
+# files obtained from most archives. (franklsm at tuns.ca)
+0 string SIT! StuffIt Archive (data)
+!:mime application/x-stuffit
+!:apple SIT!SIT!
+>2 string x : %s
+0 string SITD StuffIt Deluxe (data)
+>2 string x : %s
+0 string Seg StuffIt Deluxe Segment (data)
+>2 string x : %s
+
+# Newer StuffIt archives (grant at netbsd.org)
+0 string StuffIt StuffIt Archive
+!:mime application/x-stuffit
+!:apple SIT!SIT!
+#>162 string >0 : %s
+
+# Macintosh Applications and Installation binaries (franklsm at tuns.ca)
+# GRR: Too weak
+#0 string APPL Macintosh Application (data)
+#>2 string x \b: %s
+
+# Macintosh System files (franklsm at tuns.ca)
+# GRR: Too weak
+#0 string zsys Macintosh System File (data)
+#0 string FNDR Macintosh Finder (data)
+#0 string libr Macintosh Library (data)
+#>2 string x : %s
+#0 string shlb Macintosh Shared Library (data)
+#>2 string x : %s
+#0 string cdev Macintosh Control Panel (data)
+#>2 string x : %s
+#0 string INIT Macintosh Extension (data)
+#>2 string x : %s
+#0 string FFIL Macintosh Truetype Font (data)
+#>2 string x : %s
+#0 string LWFN Macintosh Postscript Font (data)
+#>2 string x : %s
+
+# Additional Macintosh Files (franklsm at tuns.ca)
+# GRR: Too weak
+#0 string PACT Macintosh Compact Pro Archive (data)
+#>2 string x : %s
+#0 string ttro Macintosh TeachText File (data)
+#>2 string x : %s
+#0 string TEXT Macintosh TeachText File (data)
+#>2 string x : %s
+#0 string PDF Macintosh PDF File (data)
+#>2 string x : %s
+
+# MacBinary format (Eric Fischer, enf at pobox.com)
+#
+# Unfortunately MacBinary doesn't really have a magic number prior
+# to the MacBinary III format. The checksum is really the way to
+# do it, but the magic file format isn't up to the challenge.
+#
+# 0 byte 0
+# 1 byte # filename length
+# 2 string # filename
+# 65 string # file type
+# 69 string # file creator
+# 73 byte # Finder flags
+# 74 byte 0
+# 75 beshort # vertical posn in window
+# 77 beshort # horiz posn in window
+# 79 beshort # window or folder ID
+# 81 byte # protected?
+# 82 byte 0
+# 83 belong # length of data segment
+# 87 belong # length of resource segment
+# 91 belong # file creation date
+# 95 belong # file modification date
+# 99 beshort # length of comment after resource
+# 101 byte # new Finder flags
+# 102 string mBIN # (only in MacBinary III)
+# 106 byte # char. code of file name
+# 107 byte # still more Finder flags
+# 116 belong # total file length
+# 120 beshort # length of add'l header
+# 122 byte 129 # for MacBinary II
+# 122 byte 130 # for MacBinary III
+# 123 byte 129 # minimum version that can read fmt
+# 124 beshort # checksum
+#
+# This attempts to use the version numbers as a magic number, requiring
+# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
+# be 0x81. This works for the files I have, but maybe not for everyone's.
+
+# Unfortunately, this magic is quite weak - MPi
+#122 beshort&0xFCFF 0x8081 Macintosh MacBinary data
+
+# MacBinary I doesn't have the version number field at all, but MacBinary II
+# has been in use since 1987 so I hope there aren't many really old files
+# floating around that this will miss. The original spec calls for using
+# the nulls in 0, 74, and 82 as the magic number.
+#
+# Another possibility, that would also work for MacBinary I, is to use
+# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
+# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
+# and that 74 will be 0. So something like
+#
+# 71 belong&0x80804EFF 0x00000000 Macintosh MacBinary data
+#
+# >73 byte&0x01 0x01 \b, inited
+# >73 byte&0x02 0x02 \b, changed
+# >73 byte&0x04 0x04 \b, busy
+# >73 byte&0x08 0x08 \b, bozo
+# >73 byte&0x10 0x10 \b, system
+# >73 byte&0x10 0x20 \b, bundle
+# >73 byte&0x10 0x40 \b, invisible
+# >73 byte&0x10 0x80 \b, locked
+
+#>65 string x \b, type "%4.4s"
+
+#>65 string 8BIM (PhotoShop)
+#>65 string ALB3 (PageMaker 3)
+#>65 string ALB4 (PageMaker 4)
+#>65 string ALT3 (PageMaker 3)
+#>65 string APPL (application)
+#>65 string AWWP (AppleWorks word processor)
+#>65 string CIRC (simulated circuit)
+#>65 string DRWG (MacDraw)
+#>65 string EPSF (Encapsulated PostScript)
+#>65 string FFIL (font suitcase)
+#>65 string FKEY (function key)
+#>65 string FNDR (Macintosh Finder)
+#>65 string GIFf (GIF image)
+#>65 string Gzip (GNU gzip)
+#>65 string INIT (system extension)
+#>65 string LIB\ (library)
+#>65 string LWFN (PostScript font)
+#>65 string MSBC (Microsoft BASIC)
+#>65 string PACT (Compact Pro archive)
+#>65 string PDF\ (Portable Document Format)
+#>65 string PICT (picture)
+#>65 string PNTG (MacPaint picture)
+#>65 string PREF (preferences)
+#>65 string PROJ (Think C project)
+#>65 string QPRJ (Think Pascal project)
+#>65 string SCFL (Defender scores)
+#>65 string SCRN (startup screen)
+#>65 string SITD (StuffIt Deluxe)
+#>65 string SPn3 (SuperPaint)
+#>65 string STAK (HyperCard stack)
+#>65 string Seg\ (StuffIt segment)
+#>65 string TARF (Unix tar archive)
+#>65 string TEXT (ASCII)
+#>65 string TIFF (TIFF image)
+#>65 string TOVF (Eudora table of contents)
+#>65 string WDBN (Microsoft Word word processor)
+#>65 string WORD (MacWrite word processor)
+#>65 string XLS\ (Microsoft Excel)
+#>65 string ZIVM (compress (.Z))
+#>65 string ZSYS (Pre-System 7 system file)
+#>65 string acf3 (Aldus FreeHand)
+#>65 string cdev (control panel)
+#>65 string dfil (Desk Acessory suitcase)
+#>65 string libr (library)
+#>65 string nX^d (WriteNow word processor)
+#>65 string nX^w (WriteNow dictionary)
+#>65 string rsrc (resource)
+#>65 string scbk (Scrapbook)
+#>65 string shlb (shared library)
+#>65 string ttro (SimpleText read-only)
+#>65 string zsys (system file)
+
+#>69 string x \b, creator "%4.4s"
+
+# Somewhere, Apple has a repository of registered Creator IDs. These are
+# just the ones that I happened to have files from and was able to identify.
+
+#>69 string 8BIM (Adobe Photoshop)
+#>69 string ALD3 (PageMaker 3)
+#>69 string ALD4 (PageMaker 4)
+#>69 string ALFA (Alpha editor)
+#>69 string APLS (Apple Scanner)
+#>69 string APSC (Apple Scanner)
+#>69 string BRKL (Brickles)
+#>69 string BTFT (BitFont)
+#>69 string CCL2 (Common Lisp 2)
+#>69 string CCL\ (Common Lisp)
+#>69 string CDmo (The Talking Moose)
+#>69 string CPCT (Compact Pro)
+#>69 string CSOm (Eudora)
+#>69 string DMOV (Font/DA Mover)
+#>69 string DSIM (DigSim)
+#>69 string EDIT (Macintosh Edit)
+#>69 string ERIK (Macintosh Finder)
+#>69 string EXTR (self-extracting archive)
+#>69 string Gzip (GNU gzip)
+#>69 string KAHL (Think C)
+#>69 string LWFU (LaserWriter Utility)
+#>69 string LZIV (compress)
+#>69 string MACA (MacWrite)
+#>69 string MACS (Macintosh operating system)
+#>69 string MAcK (MacKnowledge terminal emulator)
+#>69 string MLND (Defender)
+#>69 string MPNT (MacPaint)
+#>69 string MSBB (Microsoft BASIC (binary))
+#>69 string MSWD (Microsoft Word)
+#>69 string NCSA (NCSA Telnet)
+#>69 string PJMM (Think Pascal)
+#>69 string PSAL (Hunt the Wumpus)
+#>69 string PSI2 (Apple File Exchange)
+#>69 string R*ch (BBEdit)
+#>69 string RMKR (Resource Maker)
+#>69 string RSED (Resource Editor)
+#>69 string Rich (BBEdit)
+#>69 string SIT! (StuffIt)
+#>69 string SPNT (SuperPaint)
+#>69 string Unix (NeXT Mac filesystem)
+#>69 string VIM! (Vim editor)
+#>69 string WILD (HyperCard)
+#>69 string XCEL (Microsoft Excel)
+#>69 string aCa2 (Fontographer)
+#>69 string aca3 (Aldus FreeHand)
+#>69 string dosa (Macintosh MS-DOS file system)
+#>69 string movr (Font/DA Mover)
+#>69 string nX^n (WriteNow)
+#>69 string pdos (Apple ProDOS file system)
+#>69 string scbk (Scrapbook)
+#>69 string ttxt (SimpleText)
+#>69 string ufox (Foreign File Access)
+
+# Just in case...
+
+102 string mBIN MacBinary III data with surprising version number
+
+# sas magic from Bruce Foster (bef at nwu.edu)
+#
+#0 string SAS SAS
+#>8 string x %s
+0 string SAS SAS
+>24 string DATA data file
+>24 string CATALOG catalog
+>24 string INDEX data file index
+>24 string VIEW data view
+# sas 7+ magic from Reinhold Koch (reinhold.koch at roche.com)
+#
+0x54 string SAS SAS 7+
+>0x9C string DATA data file
+>0x9C string CATALOG catalog
+>0x9C string INDEX data file index
+>0x9C string VIEW data view
+
+# spss magic for SPSS system and portable files,
+# from Bruce Foster (bef at nwu.edu).
+
+0 long 0xc1e2c3c9 SPSS Portable File
+>40 string x %s
+
+0 string $FL2 SPSS System File
+>24 string x %s
+
+# Macintosh filesystem data
+# From "Tom N Harris" <telliamed at mac.com>
+# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson at alaska.net>
+# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
+# entries depend on the data arithmetic added after v.35
+# There's also some Pascal strings in here, ditto...
+
+# The boot block signature, according to IM:Files, is
+# "for HFS volumes, this field always contains the value 0x4C4B."
+# But if this is true for MFS or HFS+ volumes, I don't know.
+# Alternatively, the boot block is supposed to be zeroed if it's
+# unused, so a simply >0 should suffice.
+
+0x400 beshort 0xD2D7 Macintosh MFS data
+>0 beshort 0x4C4B (bootable)
+>0x40a beshort &0x8000 (locked)
+>0x402 beldate-0x7C25B080 x created: %s,
+>0x406 beldate-0x7C25B080 >0 last backup: %s,
+>0x414 belong x block size: %d,
+>0x412 beshort x number of blocks: %d,
+>0x424 pstring x volume name: %s
+
+# "BD" is has many false positives
+#0x400 beshort 0x4244 Macintosh HFS data
+#>0 beshort 0x4C4B (bootable)
+#>0x40a beshort &0x8000 (locked)
+#>0x40a beshort ^0x0100 (mounted)
+#>0x40a beshort &0x0200 (spared blocks)
+#>0x40a beshort &0x0800 (unclean)
+#>0x47C beshort 0x482B (Embedded HFS+ Volume)
+#>0x402 beldate-0x7C25B080 x created: %s,
+#>0x406 beldate-0x7C25B080 x last modified: %s,
+#>0x440 beldate-0x7C25B080 >0 last backup: %s,
+#>0x414 belong x block size: %d,
+#>0x412 beshort x number of blocks: %d,
+#>0x424 pstring x volume name: %s
+
+0x400 beshort 0x482B Macintosh HFS Extended
+>&0 beshort x version %d data
+>0 beshort 0x4C4B (bootable)
+>0x404 belong ^0x00000100 (mounted)
+>&2 belong &0x00000200 (spared blocks)
+>&2 belong &0x00000800 (unclean)
+>&2 belong &0x00008000 (locked)
+>&6 string x last mounted by: '%.4s',
+# really, that should be treated as a belong and we print a string
+# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
+>&14 beldate-0x7C25B080 x created: %s,
+# only the creation date is local time, all other timestamps in HFS+ are UTC.
+>&18 bedate-0x7C25B080 x last modified: %s,
+>&22 bedate-0x7C25B080 >0 last backup: %s,
+>&26 bedate-0x7C25B080 >0 last checked: %s,
+>&38 belong x block size: %d,
+>&42 belong x number of blocks: %d,
+>&46 belong x free blocks: %d
+
+# I don't think this is really necessary since it doesn't do much and
+# anything with a valid driver descriptor will also have a valid
+# partition map
+#0 beshort 0x4552 Apple Device Driver data
+#>&24 beshort =1 \b, MacOS
+
+# Is that the partition type a cstring or a pstring? Well, IM says "strings
+# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a
+# cstring. Of course, partitions can contain more than four entries, but
+# what're you gonna do?
+# GRR: This magic is too weak, it is just "PM"
+#0x200 beshort 0x504D Apple Partition data
+#>0x2 beshort x (block size: %d):
+#>0x230 string x first type: %s,
+#>0x210 string x name: %s,
+#>0x254 belong x number of blocks: %d,
+#>0x400 beshort 0x504D
+#>>0x430 string x second type: %s,
+#>>0x410 string x name: %s,
+#>>0x454 belong x number of blocks: %d,
+#>>0x600 beshort 0x504D
+#>>>0x630 string x third type: %s,
+#>>>0x610 string x name: %s,
+#>>>0x654 belong x number of blocks: %d,
+#>>0x800 beshort 0x504D
+#>>>0x830 string x fourth type: %s,
+#>>>0x810 string x name: %s,
+#>>>0x854 belong x number of blocks: %d,
+#>>>0xa00 beshort 0x504D
+#>>>>0xa30 string x fifth type: %s,
+#>>>>0xa10 string x name: %s,
+#>>>>0xa54 belong x number of blocks: %d
+#>>>0xc00 beshort 0x504D
+#>>>>0xc30 string x sixth type: %s,
+#>>>>0xc10 string x name: %s,
+#>>>>0xc54 belong x number of blocks: %d
+## AFAIK, only the signature is different
+#0x200 beshort 0x5453 Apple Old Partition data
+#>0x2 beshort x block size: %d,
+#>0x230 string x first type: %s,
+#>0x210 string x name: %s,
+#>0x254 belong x number of blocks: %d,
+#>0x400 beshort 0x504D
+#>>0x430 string x second type: %s,
+#>>0x410 string x name: %s,
+#>>0x454 belong x number of blocks: %d,
+#>>0x800 beshort 0x504D
+#>>>0x830 string x third type: %s,
+#>>>0x810 string x name: %s,
+#>>>0x854 belong x number of blocks: %d,
+#>>>0xa00 beshort 0x504D
+#>>>>0xa30 string x fourth type: %s,
+#>>>>0xa10 string x name: %s,
+#>>>>0xa54 belong x number of blocks: %d
+
+# From: Remi Mommsen <mommsen at slac.stanford.edu>
+0 string BOMStore Mac OS X bill of materials (BOM) file
+
+#------------------------------------------------------------------------------
+# $File: magic,v 1.9 2009/09/19 16:28:10 christos Exp $
+# magic: file(1) magic for magic files
+#
+0 string #\ Magic magic text file for file(1) cmd
+0 lelong 0xF11E041C magic binary file for file(1) cmd
+>4 lelong x (version %d) (little endian)
+0 belong 0xF11E041C magic binary file for file(1) cmd
+>4 belong x (version %d) (big endian)
+
+#------------------------------------------------------------------------------
+# $File: mail.news,v 1.17 2009/09/19 16:28:10 christos Exp $
+# mail.news: file(1) magic for mail and news
+#
+# Unfortunately, saved netnews also has From line added in some news software.
+#0 string From mail text
+# There are tests to ascmagic.c to cope with mail and news.
+0 string Relay-Version: old news text
+!:mime message/rfc822
+0 string #!\ rnews batched news text
+!:mime message/rfc822
+0 string N#!\ rnews mailed, batched news text
+!:mime message/rfc822
+0 string Forward\ to mail forwarding text
+!:mime message/rfc822
+0 string Pipe\ to mail piping text
+!:mime message/rfc822
+0 string Return-Path: smtp mail text
+!:mime message/rfc822
+0 string Path: news text
+!:mime message/news
+0 string Xref: news text
+!:mime message/news
+0 string From: news or mail text
+!:mime message/rfc822
+0 string Article saved news text
+!:mime message/news
+0 string BABYL Emacs RMAIL text
+0 string Received: RFC 822 mail text
+!:mime message/rfc822
+0 string MIME-Version: MIME entity text
+#0 string Content- MIME entity text
+
+# TNEF files...
+0 lelong 0x223E9F78 Transport Neutral Encapsulation Format
+
+# From: Kevin Sullivan <ksulliva at psc.edu>
+0 string *mbx* MBX mail folder
+
+# From: Simon Matter <simon.matter at invoca.ch>
+0 string \241\002\213\015skiplist\ file\0\0\0 Cyrus skiplist DB
+
+# JAM(mbp) Fidonet message area databases
+# JHR file
+0 string JAM\0 JAM message area header file
+>12 leshort >0 (%d messages)
+
+# Squish Fidonet message area databases
+# SQD file (requires at least one message in the area)
+# XXX: Weak magic
+#256 leshort 0xAFAE4453 Squish message area data file
+#>4 leshort >0 (%d messages)
+
+#0 string \<!--\ MHonArc text/html; x-type=mhonarc
+
+#------------------------------------------------------------------------------
+# $File: maple,v 1.6 2009/09/19 16:28:10 christos Exp $
+# maple: file(1) magic for maple files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Maple V release 4, a multi-purpose math program
+#
+
+# maple library .lib
+0 string \000MVR4\nI MapleVr4 library
+
+# .ind
+# no magic for these :-(
+# they are compiled indexes for maple files
+
+# .hdb
+0 string \000\004\000\000 Maple help database
+
+# .mhp
+# this has the form <PACKAGE=name>
+0 string \<PACKAGE= Maple help file
+0 string \<HELP\ NAME= Maple help file
+0 string \n\<HELP\ NAME= Maple help file with extra carriage return at start (yuck)
+#0 string #\ Newton Maple help file, old style
+0 string #\ daub Maple help file, old style
+#0 string #=========== Maple help file, old style
+
+# .mws
+0 string \000\000\001\044\000\221 Maple worksheet
+#this is anomalous
+0 string WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000 Maple worksheet, but weird
+# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
+# that is {VERSION major_version miunor_version computer_type version_string}
+0 string {VERSION\ Maple worksheet
+>9 string >\0 version %.1s.
+>>>11 string >\0 %.1s
+
+# .mps
+0 string \0\0\001$ Maple something
+# from byte 4 it is either 'nul E' or 'soh R'
+# I think 'nul E' means a file that was saved as a different name
+# a sort of revision marking
+# 'soh R' means new
+>4 string \000\105 An old revision
+>4 string \001\122 The latest save
+
+# .mpl
+# some of these are the same as .mps above
+#0000000 000 000 001 044 000 105 same as .mps
+#0000000 000 000 001 044 001 122 same as .mps
+
+0 string #\n##\ <SHAREFILE= Maple something
+0 string \n#\n##\ <SHAREFILE= Maple something
+0 string ##\ <SHAREFILE= Maple something
+0 string #\r##\ <SHAREFILE= Maple something
+0 string \r#\r##\ <SHAREFILE= Maple something
+0 string #\ \r##\ <DESCRIBE> Maple something anomalous.
+
+#------------------------------------------------------------------------------
+# $File: mathcad,v 1.5 2009/09/19 16:28:10 christos Exp $
+# mathcad: file(1) magic for Mathcad documents
+# URL: http://www.mathsoft.com/
+# From: Josh Triplett <josh at freedesktop.org>
+
+0 string .MCAD\t Mathcad document
+
+#------------------------------------------------------------------------------
+# $File: mathematica,v 1.7 2009/09/19 16:28:10 christos Exp $
+# mathematica: file(1) magic for mathematica files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Mathematica a multi-purpose math program
+# versions 2.2 and 3.0
+
+#mathematica .mb
+0 string \064\024\012\000\035\000\000\000 Mathematica version 2 notebook
+0 string \064\024\011\000\035\000\000\000 Mathematica version 2 notebook
+
+# .ma
+# multiple possibilites:
+
+0 string (*^\n\n::[\011frontEndVersion\ =\ Mathematica notebook
+#>41 string >\0 %s
+
+#0 string (*^\n\n::[\011palette Mathematica notebook version 2.x
+
+#0 string (*^\n\n::[\011Information Mathematica notebook version 2.x
+#>675 string >\0 %s #doesn't work well
+
+# there may be 'cr' instread of 'nl' in some does this matter?
+
+# generic:
+0 string (*^\r\r::[\011 Mathematica notebook version 2.x
+0 string (*^\r\n\r\n::[\011 Mathematica notebook version 2.x
+0 string (*^\015 Mathematica notebook version 2.x
+0 string (*^\n\r\n\r::[\011 Mathematica notebook version 2.x
+0 string (*^\r::[\011 Mathematica notebook version 2.x
+0 string (*^\r\n::[\011 Mathematica notebook version 2.x
+0 string (*^\n\n::[\011 Mathematica notebook version 2.x
+0 string (*^\n::[\011 Mathematica notebook version 2.x
+
+
+# Mathematica .mx files
+
+#0 string (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*) Mathematica binary file
+0 string (*This\ is\ a\ Mathematica\ binary\ Mathematica binary file
+#>71 string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000
+# >71... is optional
+>88 string >\0 from %s
+
+
+# Mathematica files PBF:
+# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
+0 string MMAPBF\000\001\000\000\000\203\000\001\000 Mathematica PBF (fonts I think)
+
+# .ml files These are menu resources I think
+# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\
+# how to put that into a magic rule?
+4 string \ A~ MAthematica .ml file
+
+# .nb files
+#too long 0 string (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook Mathematica 3.0 notebook
+0 string (*********************** Mathematica 3.0 notebook
+
+# other (* matches it is a comment start in these langs
+# GRR: Too weak; also matches other languages e.g. ML
+#0 string (* Mathematica, or Pascal, Modula-2 or 3 code text
+
+#########################
+# MatLab v5
+0 string MATLAB Matlab v5 mat-file
+>126 short 0x494d (big endian)
+>>124 beshort x version 0x%04x
+>126 short 0x4d49 (little endian)
+>>124 leshort x version 0x%04x
+
+
+#------------------------------------------------------------------------------
+# $File: matroska,v 1.5 2009/09/27 19:02:12 christos Exp $
+# matroska: file(1) magic for Matroska files
+#
+# See http://www.matroska.org/
+#
+
+# EBML id:
+0 belong 0x1a45dfa3
+# DocType id:
+>5 beshort 0x4282
+# DocType contents:
+>>8 string matroska Matroska data
+!:mime video/x-matroska
+
+# EBML id:
+0 belong 0x1a45dfa3
+# DocType id:
+>0 search/4096 \x42\x82
+# DocType contents:
+>>&1 string webm WebM
+!:mime video/webm
+
+#------------------------------------------------------------------------------
+# $File: mcrypt,v 1.5 2009/09/19 16:28:10 christos Exp $
+# Mavroyanopoulos Nikos <nmav at hellug.gr>
+# mcrypt: file(1) magic for mcrypt 2.2.x;
+0 string \0m\3 mcrypt 2.5 encrypted data,
+>4 string >\0 algorithm: %s,
+>>&1 leshort >0 keysize: %d bytes,
+>>>&0 string >\0 mode: %s,
+
+0 string \0m\2 mcrypt 2.2 encrypted data,
+>3 byte 0 algorithm: blowfish-448,
+>3 byte 1 algorithm: DES,
+>3 byte 2 algorithm: 3DES,
+>3 byte 3 algorithm: 3-WAY,
+>3 byte 4 algorithm: GOST,
+>3 byte 6 algorithm: SAFER-SK64,
+>3 byte 7 algorithm: SAFER-SK128,
+>3 byte 8 algorithm: CAST-128,
+>3 byte 9 algorithm: xTEA,
+>3 byte 10 algorithm: TWOFISH-128,
+>3 byte 11 algorithm: RC2,
+>3 byte 12 algorithm: TWOFISH-192,
+>3 byte 13 algorithm: TWOFISH-256,
+>3 byte 14 algorithm: blowfish-128,
+>3 byte 15 algorithm: blowfish-192,
+>3 byte 16 algorithm: blowfish-256,
+>3 byte 100 algorithm: RC6,
+>3 byte 101 algorithm: IDEA,
+>4 byte 0 mode: CBC,
+>4 byte 1 mode: ECB,
+>4 byte 2 mode: CFB,
+>4 byte 3 mode: OFB,
+>4 byte 4 mode: nOFB,
+>5 byte 0 keymode: 8bit
+>5 byte 1 keymode: 4bit
+>5 byte 2 keymode: SHA-1 hash
+>5 byte 3 keymode: MD5 hash
+
+#------------------------------------------------------------------------------
+# $File: mercurial,v 1.4 2009/09/19 16:28:10 christos Exp $
+# mercurial: file(1) magic for Mercurial changeset bundles
+# http://www.selenic.com/mercurial/wiki/
+#
+# Jesse Glick (jesse.glick at sun.com)
+#
+
+0 string HG10 Mercurial changeset bundle
+>4 string UN (uncompressed)
+>4 string GZ (gzip compressed)
+>4 string BZ (bzip2 compressed)
+
+#------------------------------------------------------------------------------
+# $File: mime,v 1.5 2009/09/19 16:28:10 christos Exp $
+# mime: file(1) magic for MIME encoded files
+#
+0 string Content-Type:\
+>14 string >\0 %s
+0 string Content-Type:
+>13 string >\0 %s
+
+#------------------------------------------------------------------------------
+# $File: mips,v 1.5 2009/09/19 16:28:10 christos Exp $
+# mips: file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
+# Dec Ultrix (MIPS)
+# all of SGI's *current* machines and OSes run in big-endian mode on the
+# MIPS machines, as far as I know.
+#
+# XXX - what is the blank "-" line?
+#
+# kbd file definitions
+0 string kbd!map kbd map file
+>8 byte >0 Ver %d:
+>10 short >0 with %d table(s)
+0 belong 0407 old SGI 68020 executable
+0 belong 0410 old SGI 68020 pure executable
+0 beshort 0x8765 disk quotas file
+0 beshort 0x0506 IRIS Showcase file
+>2 byte 0x49 -
+>3 byte x - version %ld
+0 beshort 0x0226 IRIS Showcase template
+>2 byte 0x63 -
+>3 byte x - version %ld
+0 belong 0x5343464d IRIS Showcase file
+>4 byte x - version %ld
+0 belong 0x5443464d IRIS Showcase template
+>4 byte x - version %ld
+0 belong 0xdeadbabe IRIX Parallel Arena
+>8 belong >0 - version %ld
+#
+0 beshort 0x0160 MIPSEB ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>22 byte x - version %ld
+>23 byte x .%ld
+#
+0 beshort 0x0162 MIPSEL-BE ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %d
+>22 byte x .%ld
+#
+0 beshort 0x6001 MIPSEB-LE ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %d
+>22 byte x .%ld
+#
+0 beshort 0x6201 MIPSEL ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %ld
+>22 byte x .%ld
+#
+# MIPS 2 additions
+#
+0 beshort 0x0163 MIPSEB MIPS-II ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>22 byte x - version %ld
+>23 byte x .%ld
+#
+0 beshort 0x0166 MIPSEL-BE MIPS-II ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>22 byte x - version %ld
+>23 byte x .%ld
+#
+0 beshort 0x6301 MIPSEB-LE MIPS-II ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %ld
+>22 byte x .%ld
+#
+0 beshort 0x6601 MIPSEL MIPS-II ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %ld
+>22 byte x .%ld
+#
+# MIPS 3 additions
+#
+0 beshort 0x0140 MIPSEB MIPS-III ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>22 byte x - version %ld
+>23 byte x .%ld
+#
+0 beshort 0x0142 MIPSEL-BE MIPS-III ECOFF executable
+>20 beshort 0407 (impure)
+>20 beshort 0410 (swapped)
+>20 beshort 0413 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>22 byte x - version %ld
+>23 byte x .%ld
+#
+0 beshort 0x4001 MIPSEB-LE MIPS-III ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %ld
+>22 byte x .%ld
+#
+0 beshort 0x4201 MIPSEL MIPS-III ECOFF executable
+>20 beshort 03401 (impure)
+>20 beshort 04001 (swapped)
+>20 beshort 05401 (paged)
+>8 belong >0 not stripped
+>8 belong 0 stripped
+>23 byte x - version %ld
+>22 byte x .%ld
+#
+0 beshort 0x180 MIPSEB Ucode
+0 beshort 0x182 MIPSEL-BE Ucode
+# 32bit core file
+0 belong 0xdeadadb0 IRIX core dump
+>4 belong 1 of
+>16 string >\0 '%s'
+# 64bit core file
+0 belong 0xdeadad40 IRIX 64-bit core dump
+>4 belong 1 of
+>16 string >\0 '%s'
+# N32bit core file
+0 belong 0xbabec0bb IRIX N32 core dump
+>4 belong 1 of
+>16 string >\0 '%s'
+# New style crash dump file
+0 string \x43\x72\x73\x68\x44\x75\x6d\x70 IRIX vmcore dump of
+>36 string >\0 '%s'
+# Trusted IRIX info
+0 string SGIAUDIT SGI Audit file
+>8 byte x - version %d
+>9 byte x .%ld
+#
+0 string WNGZWZSC Wingz compiled script
+0 string WNGZWZSS Wingz spreadsheet
+0 string WNGZWZHP Wingz help file
+#
+0 string #Inventor V IRIS Inventor 1.0 file
+0 string #Inventor V2 Open Inventor 2.0 file
+# GLF is OpenGL stream encoding
+0 string glfHeadMagic(); GLF_TEXT
+4 belong 0x7d000000 GLF_BINARY_LSB_FIRST
+4 belong 0x0000007d GLF_BINARY_MSB_FIRST
+# GLS is OpenGL stream encoding; GLS is the successor of GLF
+0 string glsBeginGLS( GLS_TEXT
+4 belong 0x10000000 GLS_BINARY_LSB_FIRST
+4 belong 0x00000010 GLS_BINARY_MSB_FIRST
+
+#------------------------------------------------------------------------------
+# $File: mirage,v 1.7 2009/09/19 16:28:10 christos Exp $
+# mirage: file(1) magic for Mirage executables
+#
+# XXX - byte order?
+#
+0 long 31415 Mirage Assembler m.out executable
+
+#-----------------------------------------------------------------------------
+# $File: misctools,v 1.10 2009/09/19 16:28:10 christos Exp $
+# misctools: file(1) magic for miscellaneous UNIX tools.
+#
+0 search/1 %%!! X-Post-It-Note text
+0 string/c BEGIN:VCALENDAR vCalendar calendar file
+0 string/c BEGIN:VCARD vCard visiting card
+!:mime text/x-vcard
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+4 string gtktalog GNOME Catalogue (gtktalog)
+>13 string >\0 version %s
+
+# Summary: Libtool library file
+# Extension: .la
+# Submitted by: Tomasz Trojanowski <tomek at uninet.com.pl>
+0 search/80 .la\ -\ a\ libtool\ library\ file libtool library file
+
+# Summary: Libtool object file
+# Extension: .lo
+# Submitted by: Abel Cheung <abelcheung at gmail.com>
+0 search/80 .lo\ -\ a\ libtool\ object\ file libtool object file
+
+# From: Daniel Novotny <dnovotny at redhat.com>
+0 string MDMP\x93\xA7 MDMP crash report data
+
+#-----------------------------------------------------------------------------
+# $File: misctools,v 1.10 2009/09/19 16:28:10 christos Exp $
+# misctools: file(1) magic for miscellaneous UNIX tools.
+#
+0 search/1 %%!! X-Post-It-Note text
+0 string/c BEGIN:VCALENDAR vCalendar calendar file
+0 string/c BEGIN:VCARD vCard visiting card
+!:mime text/x-vcard
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+4 string gtktalog GNOME Catalogue (gtktalog)
+>13 string >\0 version %s
+
+# Summary: Libtool library file
+# Extension: .la
+# Submitted by: Tomasz Trojanowski <tomek at uninet.com.pl>
+0 search/80 .la\ -\ a\ libtool\ library\ file libtool library file
+
+# Summary: Libtool object file
+# Extension: .lo
+# Submitted by: Abel Cheung <abelcheung at gmail.com>
+0 search/80 .lo\ -\ a\ libtool\ object\ file libtool object file
+
+#------------------------------------------------------------------------------
+# $File: mkid,v 1.6 2009/09/19 16:28:10 christos Exp $
+# mkid: file(1) magic for mkid(1) databases
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0 string \311\304 ID tags data
+>2 short >0 version %d
+
+#------------------------------------------------------------------------------
+# $File: mlssa,v 1.4 2009/09/19 16:28:10 christos Exp $
+# mlssa: file(1) magic for MLSSA datafiles
+#
+0 lelong 0xffffabcd MLSSA datafile,
+>4 leshort x algorithm %d,
+>10 lelong x %d samples
+
+#------------------------------------------------------------------------------
+# $File: mmdf,v 1.6 2009/09/19 16:28:10 christos Exp $
+# mmdf: file(1) magic for MMDF mail files
+#
+0 string \001\001\001\001 MMDF mailbox
+
+#------------------------------------------------------------------------------
+# $File: modem,v 1.4 2009/09/19 16:28:10 christos Exp $
+# modem: file(1) magic for modem programs
+#
+# From: Florian La Roche <florian at knorke.saar.de>
+4 string Research, Digifax-G3-File
+>29 byte 1 , fine resolution
+>29 byte 0 , normal resolution
+
+0 short 0x0100 raw G3 data, byte-padded
+0 short 0x1400 raw G3 data
+#
+# Magic data for vgetty voice formats
+# (Martin Seine & Marc Eberhard)
+
+#
+# raw modem data version 1
+#
+0 string RMD1 raw modem data
+>4 string >\0 (%s /
+>20 short >0 compression type 0x%04x)
+
+#
+# portable voice format 1
+#
+0 string PVF1\n portable voice format
+>5 string >\0 (binary %s)
+
+#
+# portable voice format 2
+#
+0 string PVF2\n portable voice format
+>5 string >\0 (ascii %s)
+
+
+#------------------------------------------------------------------------------
+# $File: motorola,v 1.10 2009/09/19 16:28:11 christos Exp $
+# motorola: file(1) magic for Motorola 68K and 88K binaries
+#
+# 68K
+#
+0 beshort 0520 mc68k COFF
+>18 beshort ^00000020 object
+>18 beshort &00000020 executable
+>12 belong >0 not stripped
+>168 string .lowmem Apple toolbox
+>20 beshort 0407 (impure)
+>20 beshort 0410 (pure)
+>20 beshort 0413 (demand paged)
+>20 beshort 0421 (standalone)
+0 beshort 0521 mc68k executable (shared)
+>12 belong >0 not stripped
+0 beshort 0522 mc68k executable (shared demand paged)
+>12 belong >0 not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0 beshort 0554 68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0 beshort 0555 88K BCS executable
+#
+# Motorola S-Records, from Gerd Truschinski <gt at freebsd.first.gmd.de>
+0 string S0 Motorola S-Record; binary data in text format
+
+# ATARI ST relocatable PRG
+#
+# from Oskar Schirmer <schirmer at scara.com> Feb 3, 2001
+# (according to Roland Waldi, Oct 21, 1987)
+# besides the magic 0x601a, the text segment size is checked to be
+# not larger than 1 MB (which is a lot on ST).
+# The additional 0x601b distinction I took from Doug Lee's magic.
+0 belong&0xFFFFFFF0 0x601A0000 Atari ST M68K contiguous executable
+>2 belong x (txt=%ld,
+>6 belong x dat=%ld,
+>10 belong x bss=%ld,
+>14 belong x sym=%ld)
+0 belong&0xFFFFFFF0 0x601B0000 Atari ST M68K non-contig executable
+>2 belong x (txt=%ld,
+>6 belong x dat=%ld,
+>10 belong x bss=%ld,
+>14 belong x sym=%ld)
+
+# Atari ST/TT... program format (sent by Wolfram Kleff <kleff at cs.uni-bonn.de>)
+0 beshort 0x601A Atari 68xxx executable,
+>2 belong x text len %lu,
+>6 belong x data len %lu,
+>10 belong x BSS len %lu,
+>14 belong x symboltab len %lu,
+>18 belong 0
+>22 belong &0x01 fastload flag,
+>22 belong &0x02 may be loaded to alternate RAM,
+>22 belong &0x04 malloc may be from alternate RAM,
+>22 belong x flags: 0x%lX,
+>26 beshort 0 no relocation tab
+>26 beshort !0 + relocation tab
+>30 string SFX [Self-Extracting LZH SFX archive]
+>38 string SFX [Self-Extracting LZH SFX archive]
+>44 string ZIP! [Self-Extracting ZIP SFX archive]
+
+0 beshort 0x0064 Atari 68xxx CPX file
+>8 beshort x (version %04lx)
+
+#------------------------------------------------------------------------------
+# $File: mozilla,v 1.4 2009/09/19 16:28:11 christos Exp $
+# mozilla: file(1) magic for Mozilla XUL fastload files
+# (XUL.mfasl and XPC.mfasl)
+# URL: http://www.mozilla.org/
+# From: Josh Triplett <josh at freedesktop.org>
+
+0 string XPCOM\nMozFASL\r\n\x1A Mozilla XUL fastload data
+
+#------------------------------------------------------------------------------
+# $File: msdos,v 1.65 2009/09/19 16:28:11 christos Exp $
+# msdos: file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan at yggdrasil.com)
+# updated by Joerg Jenderek at Oct 2008
+0 string @
+>1 string/cW \ echo\ off DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW echo\ off DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW rem\ DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW set\ DOS batch file text
+!:mime text/x-msdos-batch
+
+
+# OS/2 batch files are REXX. the second regex is a bit generic, oh well
+# the matched commands seem to be common in REXX and uncommon elsewhere
+100 regex/c =^[\ \t]{0,10}call[\ \t]{1,10}rxfunc OS/2 REXX batch file text
+100 regex/c =^[\ \t]{0,10}say\ ['"] OS/2 REXX batch file text
+
+0 leshort 0x14c MS Windows COFF Intel 80386 object file
+#>4 ledate x stamp %s
+0 leshort 0x166 MS Windows COFF MIPS R4000 object file
+#>4 ledate x stamp %s
+0 leshort 0x184 MS Windows COFF Alpha object file
+#>4 ledate x stamp %s
+0 leshort 0x268 MS Windows COFF Motorola 68000 object file
+#>4 ledate x stamp %s
+0 leshort 0x1f0 MS Windows COFF PowerPC object file
+#>4 ledate x stamp %s
+0 leshort 0x290 MS Windows COFF PA-RISC object file
+#>4 ledate x stamp %s
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting. The user version was 0.0, but there's
+# probably some linker directive to set it. The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+# many of the compressed formats were extraced from IDARC 1.23 source code
+#
+0 string MZ
+!:mime application/x-dosexec
+>0x18 leshort <0x40 MS-DOS executable
+>0 string MZ\0\0\0\0\0\0\0\0\0\0PE\0\0 \b, PE for MS Windows
+>>&18 leshort&0x2000 >0 (DLL)
+>>&88 leshort 0 (unknown subsystem)
+>>&88 leshort 1 (native)
+>>&88 leshort 2 (GUI)
+>>&88 leshort 3 (console)
+>>&88 leshort 7 (POSIX)
+>>&0 leshort 0x0 unknown processor
+>>&0 leshort 0x14c Intel 80386
+>>&0 leshort 0x166 MIPS R4000
+>>&0 leshort 0x184 Alpha
+>>&0 leshort 0x268 Motorola 68000
+>>&0 leshort 0x1f0 PowerPC
+>>&0 leshort 0x290 PA-RISC
+>>&18 leshort&0x0100 >0 32-bit
+>>&18 leshort&0x1000 >0 system file
+>>&0xf4 search/0x140 \x0\x40\x1\x0
+>>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive
+>30 string Copyright\ 1989-1990\ PKWARE\ Inc. Self-extracting PKZIP archive
+!:mime application/zip
+# Is next line correct? One might expect "Corp." not "Copr." If it is right, add a note to that effect.
+>30 string PKLITE\ Copr. Self-extracting PKZIP archive
+!:mime application/zip
+
+>0x18 leshort >0x3f
+>>(0x3c.l) string PE\0\0 PE
+>>>(0x3c.l+25) byte 1 \b32 executable
+>>>(0x3c.l+25) byte 2 \b32+ executable
+# hooray, there's a DOS extender using the PE format, with a valid PE
+# executable inside (which just prints a message and exits if run in win)
+>>>(0x3c.l+92) leshort <10
+>>>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender
+>>>>(8.s*16) string !32STUB for MS Windows
+>>>>>(0x3c.l+22) leshort&0x2000 >0 (DLL)
+>>>>>(0x3c.l+92) leshort 0 (unknown subsystem)
+>>>>>(0x3c.l+92) leshort 1 (native)
+>>>>>(0x3c.l+92) leshort 2 (GUI)
+>>>>>(0x3c.l+92) leshort 3 (console)
+>>>>>(0x3c.l+92) leshort 7 (POSIX)
+>>>(0x3c.l+92) leshort 10 (EFI application)
+>>>(0x3c.l+92) leshort 11 (EFI boot service driver)
+>>>(0x3c.l+92) leshort 12 (EFI runtime driver)
+>>>(0x3c.l+92) leshort 13 (XBOX)
+>>>(0x3c.l+4) leshort 0x0 unknown processor
+>>>(0x3c.l+4) leshort 0x14c Intel 80386
+>>>(0x3c.l+4) leshort 0x166 MIPS R4000
+>>>(0x3c.l+4) leshort 0x184 Alpha
+>>>(0x3c.l+4) leshort 0x268 Motorola 68000
+>>>(0x3c.l+4) leshort 0x1f0 PowerPC
+>>>(0x3c.l+4) leshort 0x290 PA-RISC
+>>>(0x3c.l+4) leshort 0x200 Intel Itanium
+>>>(0x3c.l+22) leshort&0x0100 >0 32-bit
+>>>(0x3c.l+22) leshort&0x1000 >0 system file
+>>>(0x3c.l+232) lelong >0 Mono/.Net assembly
+
+>>>>(0x3c.l+0xf8) string UPX0 \b, UPX compressed
+>>>>(0x3c.l+0xf8) search/0x140 PEC2 \b, PECompact2 compressed
+>>>>(0x3c.l+0xf8) search/0x140 UPX2
+>>>>>(&0x10.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
+>>>>(0x3c.l+0xf8) search/0x140 .idata
+>>>>>(&0xe.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
+>>>>>(&0xe.l+(-4)) string ZZ0 \b, ZZip self-extracting archive
+>>>>>(&0xe.l+(-4)) string ZZ1 \b, ZZip self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .rsrc
+>>>>>(&0x0f.l+(-4)) string a\\\4\5 \b, WinHKI self-extracting archive
+>>>>>(&0x0f.l+(-4)) string Rar! \b, RAR self-extracting archive
+>>>>>(&0x0f.l+(-4)) search/0x3000 MSCF \b, InstallShield self-extracting archive
+>>>>>(&0x0f.l+(-4)) search/32 Nullsoft \b, Nullsoft Installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .data
+>>>>>(&0x0f.l) string WEXTRACT \b, MS CAB-Installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .petite\0 \b, Petite compressed
+>>>>>(0x3c.l+0xf7) byte x
+>>>>>>(&0x104.l+(-4)) string =!sfx! \b, ACE self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .WISE \b, WISE installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .dz\0\0\0 \b, Dzip self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .reloc
+>>>>>(&0xe.l+(-4)) search/0x180 PK\3\4 \b, ZIP self-extracting archive (WinZip)
+
+>>>>&(0x3c.l+0xf8) search/0x100 _winzip_ \b, ZIP self-extracting archive (WinZip)
+>>>>&(0x3c.l+0xf8) search/0x100 SharedD \b, Microsoft Installer self-extracting archive
+>>>>0x30 string Inno \b, InnoSetup self-extracting archive
+
+>>(0x3c.l) string !PE\0\0 MS-DOS executable
+
+>>(0x3c.l) string NE \b, NE
+>>>(0x3c.l+0x36) byte 0 (unknown OS)
+>>>(0x3c.l+0x36) byte 1 for OS/2 1.x
+>>>(0x3c.l+0x36) byte 2 for MS Windows 3.x
+>>>(0x3c.l+0x36) byte 3 for MS-DOS
+>>>(0x3c.l+0x36) byte >3 (unknown OS)
+>>>(0x3c.l+0x36) byte 0x81 for MS-DOS, Phar Lap DOS extender
+>>>(0x3c.l+0x0c) leshort&0x8003 0x8002 (DLL)
+>>>(0x3c.l+0x0c) leshort&0x8003 0x8001 (driver)
+>>>&(&0x24.s-1) string ARJSFX \b, ARJ self-extracting archive
+>>>(0x3c.l+0x70) search/0x80 WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip)
+
+>>(0x3c.l) string LX\0\0 \b, LX
+>>>(0x3c.l+0x0a) leshort <1 (unknown OS)
+>>>(0x3c.l+0x0a) leshort 1 for OS/2
+>>>(0x3c.l+0x0a) leshort 2 for MS Windows
+>>>(0x3c.l+0x0a) leshort 3 for DOS
+>>>(0x3c.l+0x0a) leshort >3 (unknown OS)
+>>>(0x3c.l+0x10) lelong&0x28000 =0x8000 (DLL)
+>>>(0x3c.l+0x10) lelong&0x20000 >0 (device driver)
+>>>(0x3c.l+0x10) lelong&0x300 0x300 (GUI)
+>>>(0x3c.l+0x10) lelong&0x28300 <0x300 (console)
+>>>(0x3c.l+0x08) leshort 1 i80286
+>>>(0x3c.l+0x08) leshort 2 i80386
+>>>(0x3c.l+0x08) leshort 3 i80486
+>>>(8.s*16) string emx \b, emx
+>>>>&1 string x %s
+>>>&(&0x54.l-3) string arjsfx \b, ARJ self-extracting archive
+
+# MS Windows system file, supposedly a collection of LE executables
+>>(0x3c.l) string W3 \b, W3 for MS Windows
+
+>>(0x3c.l) string LE\0\0 \b, LE executable
+>>>(0x3c.l+0x0a) leshort 1
+# some DOS extenders use LE files with OS/2 header
+>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender
+>>>>0x240 search/0x200 WATCOM\ C/C++ for MS-DOS, DOS4GW DOS extender
+>>>>0x440 search/0x100 CauseWay\ DOS\ Extender for MS-DOS, CauseWay DOS extender
+>>>>0x40 search/0x40 PMODE/W for MS-DOS, PMODE/W DOS extender
+>>>>0x40 search/0x40 STUB/32A for MS-DOS, DOS/32A DOS extender (stub)
+>>>>0x40 search/0x80 STUB/32C for MS-DOS, DOS/32A DOS extender (configurable stub)
+>>>>0x40 search/0x80 DOS/32A for MS-DOS, DOS/32A DOS extender (embedded)
+# this is a wild guess; hopefully it is a specific signature
+>>>>&0x24 lelong <0x50
+>>>>>(&0x4c.l) string \xfc\xb8WATCOM
+>>>>>>&0 search/8 3\xdbf\xb9 \b, 32Lite compressed
+# another wild guess: if real OS/2 LE executables exist, they probably have higher start EIP
+#>>>>(0x3c.l+0x1c) lelong >0x10000 for OS/2
+# fails with DOS-Extenders.
+>>>(0x3c.l+0x0a) leshort 2 for MS Windows
+>>>(0x3c.l+0x0a) leshort 3 for DOS
+>>>(0x3c.l+0x0a) leshort 4 for MS Windows (VxD)
+>>>(&0x7c.l+0x26) string UPX \b, UPX compressed
+>>>&(&0x54.l-3) string UNACE \b, ACE self-extracting archive
+
+# looks like ASCII, probably some embedded copyright message.
+# and definitely not NE/LE/LX/PE
+>>0x3c lelong >0x20000000
+>>>(4.s*512) leshort !0x014c \b, MZ for MS-DOS
+# header data too small for extended executable
+>2 long !0
+>>0x18 leshort <0x40
+>>>(4.s*512) leshort !0x014c
+
+>>>>&(2.s-514) string !LE
+>>>>>&-2 string !BW \b, MZ for MS-DOS
+>>>>&(2.s-514) string LE \b, LE
+>>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender
+# educated guess since indirection is still not capable enough for complex offset
+# calculations (next embedded executable would be at &(&2*512+&0-2)
+# I suspect there are only LE executables in these multi-exe files
+>>>>&(2.s-514) string BW
+>>>>>0x240 search/0x100 DOS/4G ,\b LE for MS-DOS, DOS4GW DOS extender (embedded)
+>>>>>0x240 search/0x100 !DOS/4G ,\b BW collection for MS-DOS
+
+# This sequence skips to the first COFF segment, usually .text
+>(4.s*512) leshort 0x014c \b, COFF
+>>(8.s*16) string go32stub for MS-DOS, DJGPP go32 DOS extender
+>>(8.s*16) string emx
+>>>&1 string x for DOS, Win or OS/2, emx %s
+>>&(&0x42.l-3) byte x
+>>>&0x26 string UPX \b, UPX compressed
+# and yet another guess: small .text, and after large .data is unusal, could be 32lite
+>>&0x2c search/0xa0 .text
+>>>&0x0b lelong <0x2000
+>>>>&0 lelong >0x6000 \b, 32lite compressed
+
+>(8.s*16) string $WdX \b, WDos/X DOS extender
+
+# .EXE formats (Greg Roelofs, newt at uchicago.edu)
+#
+>0x35 string \x8e\xc0\xb9\x08\x00\xf3\xa5\x4a\x75\xeb\x8e\xc3\x8e\xd8\x33\xff\xbe\x30\x00\x05 \b, aPack compressed
+>0xe7 string LH/2\ Self-Extract \b, %s
+>0x1c string diet \b, diet compressed
+>0x1c string LZ09 \b, LZEXE v0.90 compressed
+>0x1c string LZ91 \b, LZEXE v0.91 compressed
+>0x1c string tz \b, TinyProg compressed
+>0x1e string PKLITE \b, %s compressed
+>0x64 string W\ Collis\0\0 \b, Compack compressed
+>0x24 string LHa's\ SFX \b, LHa self-extracting archive
+!:mime application/x-lha
+>0x24 string LHA's\ SFX \b, LHa self-extracting archive
+!:mime application/x-lha
+>0x24 string \ $ARX \b, ARX self-extracting archive
+>0x24 string \ $LHarc \b, LHarc self-extracting archive
+>0x20 string SFX\ by\ LARC \b, LARC self-extracting archive
+>1638 string -lh5- \b, LHa self-extracting archive v2.13S
+>0x17888 string Rar! \b, RAR self-extracting archive
+>0x40 string aPKG \b, aPackage self-extracting archive
+
+>32 string AIN
+>>35 string 2 \b, AIN 2.x compressed
+>>35 string <2 \b, AIN 1.x compressed
+>>35 string >2 \b, AIN 1.x compressed
+>28 string UC2X \b, UCEXE compressed
+>28 string WWP\ \b, WWPACK compressed
+
+# skip to the end of the exe
+>(4.s*512) long x
+>>&(2.s-517) byte x
+>>>&0 string PK\3\4 \b, ZIP self-extracting archive
+>>>&0 string Rar! \b, RAR self-extracting archive
+>>>&0 string =!\x11 \b, AIN 2.x self-extracting archive
+>>>&0 string =!\x12 \b, AIN 2.x self-extracting archive
+>>>&0 string =!\x17 \b, AIN 1.x self-extracting archive
+>>>&0 string =!\x18 \b, AIN 1.x self-extracting archive
+>>>&7 search/400 **ACE** \b, ACE self-extracting archive
+>>>&0 search/0x480 UC2SFX\ Header \b, UC2 self-extracting archive
+
+>0x1c string RJSX \b, ARJ self-extracting archive
+# winarj stores a message in the stub instead of the sig in the MZ header
+>0x20 search/0xe0 aRJsfX \b, ARJ self-extracting archive
+
+# a few unknown ZIP sfxes, no idea if they are needed or if they are
+# already captured by the generic patterns above
+>122 string Windows\ self-extracting\ ZIP \b, ZIP self-extracting archive
+>(8.s*16) search/0x20 PKSFX \b, ZIP self-extracting archive (PKZIP)
+# TODO: how to add this? >FileSize-34 string Windows\ Self-Installing\ Executable \b, ZIP self-extracting archive
+#
+
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801 string \x79\xff\x80\xff\x76\xff \b, CODEC archive v3.21
+>>49824 leshort =1 \b, 1 file
+>>49824 leshort >1 \b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan at yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+# test too generic ?
+#0 byte 0xe9 DOS executable (COM)
+#>0x1FE leshort 0xAA55 \b, boot code
+#>6 string SFX\ of\ LHarc (%s)
+#0 belong 0xffffffff DOS executable (device driver)
+#CMD640X2.SYS
+#>10 string >\x23
+#>>10 string !\x2e
+#>>>17 string <\x5B
+#>>>>10 string CMD640X2.SYS \b, name: %.8s
+#UDMA.SYS
+#>10 string <\x41
+#>>12 string >\x40
+#>>>10 string !$
+#>>>>12 string UDMA.SYS \b, name: %.8s
+#CMD640X2.SYS
+#>10 string <\x41
+#>>12 string >\x40
+#>>>10 string !$
+#>>>>12 string CMD640X2.SYS \b, name: %.8s
+#KEYB.SYS
+#>10 string <\x41
+#>>12 string >\x40
+#>>>10 string !$
+#>>>>12 string KEYB.SYS \b, name: %.8s
+#BTCDROM.SYS
+#>22 string >\x40
+#>>22 string <\x5B
+#>>>23 string <\x5B
+#>>>>22 string BTCDROM.SYS \b, name: %.8s
+#ASPICD.SYS
+#>22 string >\x40
+#>>22 string <\x5B
+#>>>23 string <\x5B
+#>>>>22 string ASPICD.SYS \b, name: %.8s
+#ATAPICD.SYS
+#>76 string \0
+#>>77 string >\x40
+#>>>77 string <\x5B
+#>>>>77 string ATAPICD.SYS \b, name: %.8s
+# test too generic ?
+#0 byte 0x8c DOS executable (COM)
+# updated by Joerg Jenderek at Oct 2008
+#0 ulelong 0xffff10eb DR-DOS executable (COM)
+# byte 0xeb conflicts with "sequent" magic leshort 0xn2eb
+#0 ubeshort&0xeb8d >0xeb00
+# DR-DOS STACKER.COM SCREATE.SYS missed
+#>0 byte 0xeb DOS executable (COM)
+#>>0x1FE leshort 0xAA55 \b, boot code
+#>>85 string UPX \b, UPX compressed
+#>>4 string \ $ARX \b, ARX self-extracting archive
+#>>4 string \ $LHarc \b, LHarc self-extracting archive
+#>>0x20e string SFX\ by\ LARC \b, LARC self-extracting archive
+# updated by Joerg Jenderek at Oct 2008
+#0 byte 0xb8 COM executable
+#0 uleshort&0x80ff 0x00b8
+# modified by Joerg Jenderek
+#>1 lelong !0x21cd4cff COM executable for DOS
+# http://syslinux.zytor.com/comboot.php
+# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode
+# start with assembler instructions mov eax,21cd4cffh
+0 uleshort&0xc0ff 0xc0b8
+>1 lelong 0x21cd4cff COM executable (32-bit COMBOOT)
+0 string \x81\xfc
+>4 string \x77\x02\xcd\x20\xb9
+>>36 string UPX! FREE-DOS executable (COM), UPX compressed
+252 string Must\ have\ DOS\ version DR-DOS executable (COM)
+# added by Joerg Jenderek at Oct 2008
+# GRR search is not working
+#34 search/2 UPX! FREE-DOS executable (COM), UPX compressed
+34 string UPX! FREE-DOS executable (COM), UPX compressed
+35 string UPX! FREE-DOS executable (COM), UPX compressed
+# GRR search is not working
+#2 search/28 \xcd\x21 COM executable for MS-DOS
+#WHICHFAT.cOM
+#2 string \xcd\x21 COM executable for DOS
+#DELTREE.cOM DELTREE2.cOM
+#4 string \xcd\x21 COM executable for DOS
+#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM
+#5 string \xcd\x21 COM executable for DOS
+#DELTMP.COm HASFAT32.cOM
+#7 string \xcd\x21
+#>0 byte !0xb8 COM executable for DOS
+#COMP.cOM MORE.COm
+#10 string \xcd\x21
+#>5 string !\xcd\x21 COM executable for DOS
+#comecho.com
+#13 string \xcd\x21 COM executable for DOS
+#HELP.COm EDIT.coM
+#18 string \xcd\x21 COM executable for MS-DOS
+#NWRPLTRM.COm
+#23 string \xcd\x21 COM executable for MS-DOS
+#LOADFIX.cOm LOADFIX.cOm
+#30 string \xcd\x21 COM executable for MS-DOS
+#syslinux.com 3.11
+#70 string \xcd\x21 COM executable for DOS
+# many compressed/converted COMs start with a copy loop instead of a jump
+0x6 search/0xa \xfc\x57\xf3\xa5\xc3 COM executable for MS-DOS
+0x6 search/0xa \xfc\x57\xf3\xa4\xc3 COM executable for DOS
+>0x18 search/0x10 \x50\xa4\xff\xd5\x73 \b, aPack compressed
+0x3c string W\ Collis\0\0 COM executable for MS-DOS, Compack compressed
+# FIXME: missing diet .com compression
+
+# miscellaneous formats
+0 string LZ MS-DOS executable (built-in)
+#0 byte 0xf0 MS-DOS program library data
+#
+
+# AAF files:
+# <stuartc at rd.bbc.co.uk> Stuart Cunningham
+0 string \320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377 AAF legacy file using MS Structured Storage
+>30 byte 9 (512B sectors)
+>30 byte 12 (4kB sectors)
+0 string \320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001 AAF file using MS Structured Storage
+>30 byte 9 (512B sectors)
+>30 byte 12 (4kB sectors)
+
+# Popular applications
+2080 string Microsoft\ Word\ 6.0\ Document %s
+!:mime application/msword
+2080 string Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+!:mime application/msword
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112 string MSWordDoc Microsoft Word document data
+!:mime application/msword
+#
+0 belong 0x31be0000 Microsoft Word Document
+!:mime application/msword
+#
+0 string PO^Q` Microsoft Word 6.0 Document
+!:mime application/msword
+#
+0 string \376\067\0\043 Microsoft Office Document
+!:mime application/msword
+0 string \333\245-\0\0\0 Microsoft Office Document
+!:mime application/msword
+512 string \354\245\301 Microsoft Word Document
+!:mime application/msword
+#
+2080 string Microsoft\ Excel\ 5.0\ Worksheet %s
+!:mime application/vnd.ms-excel
+
+2080 string Foglio\ di\ lavoro\ Microsoft\ Exce %s
+!:mime application/vnd.ms-excel
+#
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114 string Biff5 Microsoft Excel 5.0 Worksheet
+!:mime application/vnd.ms-excel
+# Italian MS-Excel
+2121 string Biff5 Microsoft Excel 5.0 Worksheet
+!:mime application/vnd.ms-excel
+0 string \x09\x04\x06\x00\x00\x00\x10\x00 Microsoft Excel Worksheet
+!:mime application/vnd.ms-excel
+#
+0 belong 0x00001a00 Lotus 1-2-3
+!:mime application/x-123
+>4 belong 0x00100400 wk3 document data
+>4 belong 0x02100400 wk4 document data
+>4 belong 0x07800100 fm3 or fmb document data
+>4 belong 0x07800000 fm3 or fmb document data
+#
+0 belong 0x00000200 Lotus 1-2-3
+!:mime application/x-123
+>4 belong 0x06040600 wk1 document data
+>4 belong 0x06800200 fmt document data
+0 string WordPro\0 Lotus WordPro
+!:mime application/vnd.lotus-wordpro
+0 string WordPro\r\373 Lotus WordPro
+!:mime application/vnd.lotus-wordpro
+
+
+# Summary: Script used by InstallScield to uninstall applications
+# Extension: .isu
+# Submitted by: unknown
+# Modified by (1): Abel Cheung <abelcheung at gmail.com> (replace useless entry)
+0 string \x71\xa8\x00\x00\x01\x02
+>12 string Stirling\ Technologies, InstallShield Uninstall Script
+
+# Winamp .avs
+#0 string Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
+0 string Nullsoft\ AVS\ Preset\ Winamp plug in
+
+# Windows Metafont .WMF
+0 string \327\315\306\232 ms-windows metafont .wmf
+0 string \002\000\011\000 ms-windows metafont .wmf
+0 string \001\000\011\000 ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0 string \003\001\001\004\070\001\000\000 tz3 ms-works file
+0 string \003\002\001\004\070\001\000\000 tz3 ms-works file
+0 string \003\003\001\004\070\001\000\000 tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0 string MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 MS Windows special zipped file
+
+
+#ico files
+0 string \102\101\050\000\000\000\056\000\000\000\000\000\000\000 Icon for MS Windows
+
+# Windows icons (Ian Springer <ips at fpk.hp.com>)
+0 string \000\000\001\000 MS Windows icon resource
+!:mime image/x-ico
+>4 byte 1 - 1 icon
+>4 byte >1 - %d icons
+>>6 byte >0 \b, %dx
+>>>7 byte >0 \b%d
+>>8 byte 0 \b, 256-colors
+>>8 byte >0 \b, %d-colors
+
+
+# .chr files
+0 string PK\010\010BGI Borland font
+>4 string >\0 %s
+# then there is a copyright notice
+
+
+# .bgi files
+0 string pk\010\010BGI Borland device
+>4 string >\0 %s
+# then there is a copyright notice
+
+
+# Windows Recycle Bin record file (named INFO2)
+# By Abel Cheung (abelcheung AT gmail dot com)
+# Version 4 always has 280 bytes (0x118) per record, version 5 has 800 bytes
+# Since Vista uses another structure, INFO2 structure probably won't change
+# anymore. Detailed analysis in:
+# http://www.cybersecurityinstitute.biz/downloads/INFO2.pdf
+0 lelong 0x00000004
+>12 lelong 0x00000118 Windows Recycle Bin INFO2 file (Win98 or below)
+
+0 lelong 0x00000005
+>12 lelong 0x00000320 Windows Recycle Bin INFO2 file (Win2k - WinXP)
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something files wrongly identified as G3 .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+#0 string \000\001 pfm?
+#>3 string \022\000\000Copyright\ yes
+#>3 string \002\000\000Copyright\ yes
+#>3 string >\0 oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9 string GERBILDOC First Choice document
+9 string GERBILDB First Choice database
+9 string GERBILCLIP First Choice database
+0 string GERBIL First Choice device file
+9 string RABBITGRAPH RabbitGraph file
+0 string DCU1 Borland Delphi .DCU file
+0 string =!<spell> MKS Spell hash list (old format)
+0 string =!<spell2> MKS Spell hash list
+# Too simple - MPi
+#0 string AH Halo(TM) bitmapped font file
+0 lelong 0x08086b70 TurboC BGI file
+0 lelong 0x08084b50 TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0 byte 0x03 DBase 3 data file
+>0x04 lelong 0 (no records)
+>0x04 lelong >0 (%ld records)
+0 byte 0x83 DBase 3 data file with memo(s)
+>0x04 lelong 0 (no records)
+>0x04 lelong >0 (%ld records)
+0 leshort 0x0006 DBase 3 index file
+0 string PMCC Windows 3.x .GRP file
+1 string RDC-meg MegaDots
+>8 byte >0x2F version %c
+>9 byte >0x2F \b.%c file
+0 lelong 0x4C
+>4 lelong 0x00021401 Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0 belong 0xC5D0D3C6 DOS EPS Binary File
+>4 long >0 Postscript starts at byte %d
+>>8 long >0 length %d
+>>>12 long >0 Metafile starts at byte %d
+>>>>16 long >0 length %d
+>>>20 long >0 TIFF starts at byte %d
+>>>>24 long >0 length %d
+
+# TNEF magic From "Joomy" <joomy at se-ed.net>
+# Microsoft Outlook's Transport Neutral Encapsulation Format (TNEF)
+0 leshort 0x223e9f78 TNEF
+!:mime application/vnd.ms-tnef
+
+# HtmlHelp files (.chm)
+0 string ITSF\003\000\000\000\x60\000\000\000\001\000\000\000 MS Windows HtmlHelp Data
+
+# GFA-BASIC (Wolfram Kleff)
+2 string GFA-BASIC3 GFA-BASIC 3 data
+
+#------------------------------------------------------------------------------
+# From Stuart Caie <kyzer at 4u.net> (developer of cabextract)
+# Microsoft Cabinet files
+0 string MSCF\0\0\0\0 Microsoft Cabinet archive data
+!:mime application/vnd.ms-cab-compressed
+>8 lelong x \b, %u bytes
+>28 leshort 1 \b, 1 file
+>28 leshort >1 \b, %u files
+
+# InstallShield Cabinet files
+0 string ISc( InstallShield Cabinet archive data
+>5 byte&0xf0 =0x60 version 6,
+>5 byte&0xf0 !0x60 version 4/5,
+>(12.l+40) lelong x %u files
+
+# Windows CE package files
+0 string MSCE\0\0\0\0 Microsoft WinCE install header
+>20 lelong 0 \b, architecture-independent
+>20 lelong 103 \b, Hitachi SH3
+>20 lelong 104 \b, Hitachi SH4
+>20 lelong 0xA11 \b, StrongARM
+>20 lelong 4000 \b, MIPS R4000
+>20 lelong 10003 \b, Hitachi SH3
+>20 lelong 10004 \b, Hitachi SH3E
+>20 lelong 10005 \b, Hitachi SH4
+>20 lelong 70001 \b, ARM 7TDMI
+>52 leshort 1 \b, 1 file
+>52 leshort >1 \b, %u files
+>56 leshort 1 \b, 1 registry entry
+>56 leshort >1 \b, %u registry entries
+
+
+# Windows Enhanced Metafile (EMF)
+# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp
+# for further information.
+0 ulelong 1
+>40 string \ EMF Windows Enhanced Metafile (EMF) image data
+>>44 ulelong x version 0x%x
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+0 string COWD VMWare3
+>4 byte 3 disk image
+>>32 lelong x (%d/
+>>36 lelong x \b%d/
+>>40 lelong x \b%d)
+>4 byte 2 undoable disk image
+>>32 string >\0 (%s)
+
+0 string VMDK VMware4 disk image
+0 string KDMV VMware4 disk image
+
+#--------------------------------------------------------------------
+# Qemu Emulator Images
+# Lines written by Friedrich Schwittay (f.schwittay at yousable.de)
+# Made by reading sources and doing trial and error on existing
+# qcow files
+0 string QFI Qemu Image, Format: Qcow
+
+# Uncomment the following line to display Magic (only used for debugging
+# this magic number)
+#>0 string x , Magic: %s
+
+# There are currently 2 Versions: "1" and "2"
+# I do not use Version 2 and therefor branch here
+# but can assure: it works (tested on both versions)
+# Also my Qemu 0.9.0 which uses this Version 2 refuses
+# to start in its bios
+>0x04 belong 2 , Version: 2
+>0x04 belong 1 , Version: 1
+
+# Using the existence of the Backing File Offset to Branch or not
+# to read Backing File Information
+>>0xc belong >0 , Backing File( Offset: %lu
+>>>(0xc.L) string >\0 , Path: %s
+
+# Didn't get the trick here how qemu stores the "Size" at this Position
+# There is actually something stored but nothing makes sense
+# The header in the sources talks about it
+#>>>16 lelong x , Size: %lu
+
+# Modification time of the Backing File
+# Really useful if you want to know if your backing
+# file is still usable together with this image
+>>>20 bedate x , Mtime: %s )
+
+# Don't know how to calculate in Magicfiles
+# Also: this Information is not reliably
+# stored in image-files
+>>24 lelong x , Disk Size could be: %d * 256 bytes
+
+>4 belong 3 (v3)
+# Using the existence of the Backing File Offset to determine whether
+# to read Backing File Information
+>>8 bequad >0 \b, has backing file
+# Note that this isn't a null-terminated string; the length is actually
+# (16.L). Assuming a null-terminated string happens to work usually, but it
+# may spew junk until it reaches a \0 in some cases. Also, since there's no
+# .Q modifier, we just use the bottom four bytes as an offset. Note that if
+# the file is over 4G, and the backing file path is stored after the first 4G,
+# the wrong filename will be printed. (This should be (8.Q), when that syntax
+# is introduced.)
+>>>(12.L) string >\0 (path %s)
+>>24 bequad x \b, %lld bytes
+>>32 belong 1 \b, AES-encrypted
+
+0 string QEVM QEMU's suspend to disk image
+
+# QEMU QED Image
+# http://wiki.qemu.org/Features/QED/Specification
+0 string/b QED\0 QEMU QED Image
+
+# VDI Image
+64 string/b \x7f\x10\xda\xbe VDI Image
+>68 string/b \x01\x00\x01\x00 version 1.1
+>0 string >\0 (%s)
+>368 lequad x \b, %lld bytes
+
+0 string Bochs\ Virtual\ HD\ Image Bochs disk image,
+>32 string x type %s,
+>48 string x subtype %s
+
+0 lelong 0x02468ace Bochs Sparse disk image
+
+# from http://filext.com by Derek M Jones <derek at knosof.co.uk>
+# False positive with PPT (also currently this string is too long)
+#0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF\x09\x00\x06 Microsoft Installer
+0 string \320\317\021\340\241\261\032\341 Microsoft Office Document
+#>48 byte 0x1B Excel Document
+#!:mime application/vnd.ms-excel
+>546 string bjbj Microsoft Word Document
+!:mime application/msword
+>546 string jbjb Microsoft Word Document
+!:mime application/msword
+
+0 string \224\246\056 Microsoft Word Document
+!:mime application/msword
+
+512 string R\0o\0o\0t\0\ \0E\0n\0t\0r\0y Microsoft Word Document
+!:mime application/msword
+
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+# Magic type for Dell's BIOS .hdr files
+# Dell's .hdr
+0 string $RBU
+>23 string Dell %s system BIOS
+>5 byte 2
+>>48 byte x version %d.
+>>49 byte x \b%d.
+>>50 byte x \b%d
+>5 byte <2
+>>48 string x version %.3s
+
+# Type: Microsoft DirectDraw Surface
+# URL: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/DDSFileReference/ddsfileformat.asp
+# From: Morten Hustveit <morten at debian.org>
+0 string DDS\040\174\000\000\000 Microsoft DirectDraw Surface (DDS),
+>16 lelong >0 %hd x
+>12 lelong >0 %hd,
+>84 string x %.4s
+
+# Type: Microsoft Document Imaging Format (.mdi)
+# URL: http://en.wikipedia.org/wiki/Microsoft_Document_Imaging_Format
+# From: Daniele Sempione <scrows at oziosi.org>
+0 short 0x5045 Microsoft Document Imaging Format
+
+# MS eBook format (.lit)
+0 string ITOLITLS Microsoft Reader eBook Data
+>8 lelong x \b, version %u
+!:mime application/x-ms-reader
+
+#------------------------------------------------------------------------------
+# $File: msdos,v 1.65 2009/09/19 16:28:11 christos Exp $
+# msdos: file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan at yggdrasil.com)
+# updated by Joerg Jenderek at Oct 2008
+0 string @
+>1 string/cW \ echo\ off DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW echo\ off DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW rem\ DOS batch file text
+!:mime text/x-msdos-batch
+>1 string/cW set\ DOS batch file text
+!:mime text/x-msdos-batch
+
+
+# OS/2 batch files are REXX. the second regex is a bit generic, oh well
+# the matched commands seem to be common in REXX and uncommon elsewhere
+100 regex/c =^[\ \t]{0,10}call[\ \t]{1,10}rxfunc OS/2 REXX batch file text
+100 regex/c =^[\ \t]{0,10}say\ ['"] OS/2 REXX batch file text
+
+0 leshort 0x14c MS Windows COFF Intel 80386 object file
+#>4 ledate x stamp %s
+0 leshort 0x166 MS Windows COFF MIPS R4000 object file
+#>4 ledate x stamp %s
+0 leshort 0x184 MS Windows COFF Alpha object file
+#>4 ledate x stamp %s
+0 leshort 0x268 MS Windows COFF Motorola 68000 object file
+#>4 ledate x stamp %s
+0 leshort 0x1f0 MS Windows COFF PowerPC object file
+#>4 ledate x stamp %s
+0 leshort 0x290 MS Windows COFF PA-RISC object file
+#>4 ledate x stamp %s
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting. The user version was 0.0, but there's
+# probably some linker directive to set it. The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+# many of the compressed formats were extraced from IDARC 1.23 source code
+#
+0 string MZ
+!:mime application/x-dosexec
+>0x18 leshort <0x40 MS-DOS executable
+>0 string MZ\0\0\0\0\0\0\0\0\0\0PE\0\0 \b, PE for MS Windows
+>>&18 leshort&0x2000 >0 (DLL)
+>>&88 leshort 0 (unknown subsystem)
+>>&88 leshort 1 (native)
+>>&88 leshort 2 (GUI)
+>>&88 leshort 3 (console)
+>>&88 leshort 7 (POSIX)
+>>&0 leshort 0x0 unknown processor
+>>&0 leshort 0x14c Intel 80386
+>>&0 leshort 0x166 MIPS R4000
+>>&0 leshort 0x184 Alpha
+>>&0 leshort 0x268 Motorola 68000
+>>&0 leshort 0x1f0 PowerPC
+>>&0 leshort 0x290 PA-RISC
+>>&18 leshort&0x0100 >0 32-bit
+>>&18 leshort&0x1000 >0 system file
+>>&0xf4 search/0x140 \x0\x40\x1\x0
+>>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive
+>30 string Copyright\ 1989-1990\ PKWARE\ Inc. Self-extracting PKZIP archive
+!:mime application/zip
+# Is next line correct? One might expect "Corp." not "Copr." If it is right, add a note to that effect.
+>30 string PKLITE\ Copr. Self-extracting PKZIP archive
+!:mime application/zip
+
+>0x18 leshort >0x3f
+>>(0x3c.l) string PE\0\0 PE
+>>>(0x3c.l+25) byte 1 \b32 executable
+>>>(0x3c.l+25) byte 2 \b32+ executable
+# hooray, there's a DOS extender using the PE format, with a valid PE
+# executable inside (which just prints a message and exits if run in win)
+>>>(0x3c.l+92) leshort <10
+>>>>(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender
+>>>>(8.s*16) string !32STUB for MS Windows
+>>>>>(0x3c.l+22) leshort&0x2000 >0 (DLL)
+>>>>>(0x3c.l+92) leshort 0 (unknown subsystem)
+>>>>>(0x3c.l+92) leshort 1 (native)
+>>>>>(0x3c.l+92) leshort 2 (GUI)
+>>>>>(0x3c.l+92) leshort 3 (console)
+>>>>>(0x3c.l+92) leshort 7 (POSIX)
+>>>(0x3c.l+92) leshort 10 (EFI application)
+>>>(0x3c.l+92) leshort 11 (EFI boot service driver)
+>>>(0x3c.l+92) leshort 12 (EFI runtime driver)
+>>>(0x3c.l+92) leshort 13 (XBOX)
+>>>(0x3c.l+4) leshort 0x0 unknown processor
+>>>(0x3c.l+4) leshort 0x14c Intel 80386
+>>>(0x3c.l+4) leshort 0x166 MIPS R4000
+>>>(0x3c.l+4) leshort 0x184 Alpha
+>>>(0x3c.l+4) leshort 0x268 Motorola 68000
+>>>(0x3c.l+4) leshort 0x1f0 PowerPC
+>>>(0x3c.l+4) leshort 0x290 PA-RISC
+>>>(0x3c.l+4) leshort 0x200 Intel Itanium
+>>>(0x3c.l+22) leshort&0x0100 >0 32-bit
+>>>(0x3c.l+22) leshort&0x1000 >0 system file
+>>>(0x3c.l+232) lelong >0 Mono/.Net assembly
+
+>>>>(0x3c.l+0xf8) string UPX0 \b, UPX compressed
+>>>>(0x3c.l+0xf8) search/0x140 PEC2 \b, PECompact2 compressed
+>>>>(0x3c.l+0xf8) search/0x140 UPX2
+>>>>>(&0x10.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
+>>>>(0x3c.l+0xf8) search/0x140 .idata
+>>>>>(&0xe.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
+>>>>>(&0xe.l+(-4)) string ZZ0 \b, ZZip self-extracting archive
+>>>>>(&0xe.l+(-4)) string ZZ1 \b, ZZip self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .rsrc
+>>>>>(&0x0f.l+(-4)) string a\\\4\5 \b, WinHKI self-extracting archive
+>>>>>(&0x0f.l+(-4)) string Rar! \b, RAR self-extracting archive
+>>>>>(&0x0f.l+(-4)) search/0x3000 MSCF \b, InstallShield self-extracting archive
+>>>>>(&0x0f.l+(-4)) search/32 Nullsoft \b, Nullsoft Installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .data
+>>>>>(&0x0f.l) string WEXTRACT \b, MS CAB-Installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .petite\0 \b, Petite compressed
+>>>>>(0x3c.l+0xf7) byte x
+>>>>>>(&0x104.l+(-4)) string =!sfx! \b, ACE self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .WISE \b, WISE installer self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .dz\0\0\0 \b, Dzip self-extracting archive
+>>>>(0x3c.l+0xf8) search/0x140 .reloc
+>>>>>(&0xe.l+(-4)) search/0x180 PK\3\4 \b, ZIP self-extracting archive (WinZip)
+
+>>>>&(0x3c.l+0xf8) search/0x100 _winzip_ \b, ZIP self-extracting archive (WinZip)
+>>>>&(0x3c.l+0xf8) search/0x100 SharedD \b, Microsoft Installer self-extracting archive
+>>>>0x30 string Inno \b, InnoSetup self-extracting archive
+
+>>(0x3c.l) string !PE\0\0 MS-DOS executable
+
+>>(0x3c.l) string NE \b, NE
+>>>(0x3c.l+0x36) byte 0 (unknown OS)
+>>>(0x3c.l+0x36) byte 1 for OS/2 1.x
+>>>(0x3c.l+0x36) byte 2 for MS Windows 3.x
+>>>(0x3c.l+0x36) byte 3 for MS-DOS
+>>>(0x3c.l+0x36) byte >3 (unknown OS)
+>>>(0x3c.l+0x36) byte 0x81 for MS-DOS, Phar Lap DOS extender
+>>>(0x3c.l+0x0c) leshort&0x8003 0x8002 (DLL)
+>>>(0x3c.l+0x0c) leshort&0x8003 0x8001 (driver)
+>>>&(&0x24.s-1) string ARJSFX \b, ARJ self-extracting archive
+>>>(0x3c.l+0x70) search/0x80 WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip)
+
+>>(0x3c.l) string LX\0\0 \b, LX
+>>>(0x3c.l+0x0a) leshort <1 (unknown OS)
+>>>(0x3c.l+0x0a) leshort 1 for OS/2
+>>>(0x3c.l+0x0a) leshort 2 for MS Windows
+>>>(0x3c.l+0x0a) leshort 3 for DOS
+>>>(0x3c.l+0x0a) leshort >3 (unknown OS)
+>>>(0x3c.l+0x10) lelong&0x28000 =0x8000 (DLL)
+>>>(0x3c.l+0x10) lelong&0x20000 >0 (device driver)
+>>>(0x3c.l+0x10) lelong&0x300 0x300 (GUI)
+>>>(0x3c.l+0x10) lelong&0x28300 <0x300 (console)
+>>>(0x3c.l+0x08) leshort 1 i80286
+>>>(0x3c.l+0x08) leshort 2 i80386
+>>>(0x3c.l+0x08) leshort 3 i80486
+>>>(8.s*16) string emx \b, emx
+>>>>&1 string x %s
+>>>&(&0x54.l-3) string arjsfx \b, ARJ self-extracting archive
+
+# MS Windows system file, supposedly a collection of LE executables
+>>(0x3c.l) string W3 \b, W3 for MS Windows
+
+>>(0x3c.l) string LE\0\0 \b, LE executable
+>>>(0x3c.l+0x0a) leshort 1
+# some DOS extenders use LE files with OS/2 header
+>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender
+>>>>0x240 search/0x200 WATCOM\ C/C++ for MS-DOS, DOS4GW DOS extender
+>>>>0x440 search/0x100 CauseWay\ DOS\ Extender for MS-DOS, CauseWay DOS extender
+>>>>0x40 search/0x40 PMODE/W for MS-DOS, PMODE/W DOS extender
+>>>>0x40 search/0x40 STUB/32A for MS-DOS, DOS/32A DOS extender (stub)
+>>>>0x40 search/0x80 STUB/32C for MS-DOS, DOS/32A DOS extender (configurable stub)
+>>>>0x40 search/0x80 DOS/32A for MS-DOS, DOS/32A DOS extender (embedded)
+# this is a wild guess; hopefully it is a specific signature
+>>>>&0x24 lelong <0x50
+>>>>>(&0x4c.l) string \xfc\xb8WATCOM
+>>>>>>&0 search/8 3\xdbf\xb9 \b, 32Lite compressed
+# another wild guess: if real OS/2 LE executables exist, they probably have higher start EIP
+#>>>>(0x3c.l+0x1c) lelong >0x10000 for OS/2
+# fails with DOS-Extenders.
+>>>(0x3c.l+0x0a) leshort 2 for MS Windows
+>>>(0x3c.l+0x0a) leshort 3 for DOS
+>>>(0x3c.l+0x0a) leshort 4 for MS Windows (VxD)
+>>>(&0x7c.l+0x26) string UPX \b, UPX compressed
+>>>&(&0x54.l-3) string UNACE \b, ACE self-extracting archive
+
+# looks like ASCII, probably some embedded copyright message.
+# and definitely not NE/LE/LX/PE
+>>0x3c lelong >0x20000000
+>>>(4.s*512) leshort !0x014c \b, MZ for MS-DOS
+# header data too small for extended executable
+>2 long !0
+>>0x18 leshort <0x40
+>>>(4.s*512) leshort !0x014c
+
+>>>>&(2.s-514) string !LE
+>>>>>&-2 string !BW \b, MZ for MS-DOS
+>>>>&(2.s-514) string LE \b, LE
+>>>>>0x240 search/0x100 DOS/4G for MS-DOS, DOS4GW DOS extender
+# educated guess since indirection is still not capable enough for complex offset
+# calculations (next embedded executable would be at &(&2*512+&0-2)
+# I suspect there are only LE executables in these multi-exe files
+>>>>&(2.s-514) string BW
+>>>>>0x240 search/0x100 DOS/4G ,\b LE for MS-DOS, DOS4GW DOS extender (embedded)
+>>>>>0x240 search/0x100 !DOS/4G ,\b BW collection for MS-DOS
+
+# This sequence skips to the first COFF segment, usually .text
+>(4.s*512) leshort 0x014c \b, COFF
+>>(8.s*16) string go32stub for MS-DOS, DJGPP go32 DOS extender
+>>(8.s*16) string emx
+>>>&1 string x for DOS, Win or OS/2, emx %s
+>>&(&0x42.l-3) byte x
+>>>&0x26 string UPX \b, UPX compressed
+# and yet another guess: small .text, and after large .data is unusal, could be 32lite
+>>&0x2c search/0xa0 .text
+>>>&0x0b lelong <0x2000
+>>>>&0 lelong >0x6000 \b, 32lite compressed
+
+>(8.s*16) string $WdX \b, WDos/X DOS extender
+
+# .EXE formats (Greg Roelofs, newt at uchicago.edu)
+#
+>0x35 string \x8e\xc0\xb9\x08\x00\xf3\xa5\x4a\x75\xeb\x8e\xc3\x8e\xd8\x33\xff\xbe\x30\x00\x05 \b, aPack compressed
+>0xe7 string LH/2\ Self-Extract \b, %s
+>0x1c string diet \b, diet compressed
+>0x1c string LZ09 \b, LZEXE v0.90 compressed
+>0x1c string LZ91 \b, LZEXE v0.91 compressed
+>0x1c string tz \b, TinyProg compressed
+>0x1e string PKLITE \b, %s compressed
+>0x64 string W\ Collis\0\0 \b, Compack compressed
+>0x24 string LHa's\ SFX \b, LHa self-extracting archive
+!:mime application/x-lha
+>0x24 string LHA's\ SFX \b, LHa self-extracting archive
+!:mime application/x-lha
+>0x24 string \ $ARX \b, ARX self-extracting archive
+>0x24 string \ $LHarc \b, LHarc self-extracting archive
+>0x20 string SFX\ by\ LARC \b, LARC self-extracting archive
+>1638 string -lh5- \b, LHa self-extracting archive v2.13S
+>0x17888 string Rar! \b, RAR self-extracting archive
+>0x40 string aPKG \b, aPackage self-extracting archive
+
+>32 string AIN
+>>35 string 2 \b, AIN 2.x compressed
+>>35 string <2 \b, AIN 1.x compressed
+>>35 string >2 \b, AIN 1.x compressed
+>28 string UC2X \b, UCEXE compressed
+>28 string WWP\ \b, WWPACK compressed
+
+# skip to the end of the exe
+>(4.s*512) long x
+>>&(2.s-517) byte x
+>>>&0 string PK\3\4 \b, ZIP self-extracting archive
+>>>&0 string Rar! \b, RAR self-extracting archive
+>>>&0 string =!\x11 \b, AIN 2.x self-extracting archive
+>>>&0 string =!\x12 \b, AIN 2.x self-extracting archive
+>>>&0 string =!\x17 \b, AIN 1.x self-extracting archive
+>>>&0 string =!\x18 \b, AIN 1.x self-extracting archive
+>>>&7 search/400 **ACE** \b, ACE self-extracting archive
+>>>&0 search/0x480 UC2SFX\ Header \b, UC2 self-extracting archive
+
+>0x1c string RJSX \b, ARJ self-extracting archive
+# winarj stores a message in the stub instead of the sig in the MZ header
+>0x20 search/0xe0 aRJsfX \b, ARJ self-extracting archive
+
+# a few unknown ZIP sfxes, no idea if they are needed or if they are
+# already captured by the generic patterns above
+>122 string Windows\ self-extracting\ ZIP \b, ZIP self-extracting archive
+>(8.s*16) search/0x20 PKSFX \b, ZIP self-extracting archive (PKZIP)
+# TODO: how to add this? >FileSize-34 string Windows\ Self-Installing\ Executable \b, ZIP self-extracting archive
+#
+
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801 string \x79\xff\x80\xff\x76\xff \b, CODEC archive v3.21
+>>49824 leshort =1 \b, 1 file
+>>49824 leshort >1 \b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan at yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+# test too generic ?
+0 byte 0xe9 DOS executable (COM)
+>0x1FE leshort 0xAA55 \b, boot code
+>6 string SFX\ of\ LHarc (%s)
+0 belong 0xffffffff DOS executable (device driver)
+#CMD640X2.SYS
+>10 string >\x23
+>>10 string !\x2e
+>>>17 string <\x5B
+>>>>10 string x \b, name: %.8s
+#UDMA.SYS KEYB.SYS CMD640X2.SYS
+>10 string <\x41
+>>12 string >\x40
+>>>10 string !$
+>>>>12 string x \b, name: %.8s
+#BTCDROM.SYS ASPICD.SYS
+>22 string >\x40
+>>22 string <\x5B
+>>>23 string <\x5B
+>>>>22 string x \b, name: %.8s
+#ATAPICD.SYS
+>76 string \0
+>>77 string >\x40
+>>>77 string <\x5B
+>>>>77 string x \b, name: %.8s
+# test too generic ?
+0 byte 0x8c DOS executable (COM)
+# updated by Joerg Jenderek at Oct 2008
+0 ulelong 0xffff10eb DR-DOS executable (COM)
+# byte 0xeb conflicts with "sequent" magic leshort 0xn2eb
+0 ubeshort&0xeb8d >0xeb00
+# DR-DOS STACKER.COM SCREATE.SYS missed
+>0 byte 0xeb DOS executable (COM)
+>>0x1FE leshort 0xAA55 \b, boot code
+>>85 string UPX \b, UPX compressed
+>>4 string \ $ARX \b, ARX self-extracting archive
+>>4 string \ $LHarc \b, LHarc self-extracting archive
+>>0x20e string SFX\ by\ LARC \b, LARC self-extracting archive
+# updated by Joerg Jenderek at Oct 2008
+#0 byte 0xb8 COM executable
+0 uleshort&0x80ff 0x00b8
+# modified by Joerg Jenderek
+>1 lelong !0x21cd4cff COM executable for DOS
+# http://syslinux.zytor.com/comboot.php
+# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode
+# start with assembler instructions mov eax,21cd4cffh
+0 uleshort&0xc0ff 0xc0b8
+>1 lelong 0x21cd4cff COM executable (32-bit COMBOOT)
+0 string \x81\xfc
+>4 string \x77\x02\xcd\x20\xb9
+>>36 string UPX! FREE-DOS executable (COM), UPX compressed
+252 string Must\ have\ DOS\ version DR-DOS executable (COM)
+# added by Joerg Jenderek at Oct 2008
+# GRR search is not working
+#34 search/2 UPX! FREE-DOS executable (COM), UPX compressed
+34 string UPX! FREE-DOS executable (COM), UPX compressed
+35 string UPX! FREE-DOS executable (COM), UPX compressed
+# GRR search is not working
+#2 search/28 \xcd\x21 COM executable for MS-DOS
+#WHICHFAT.cOM
+2 string \xcd\x21 COM executable for DOS
+#DELTREE.cOM DELTREE2.cOM
+4 string \xcd\x21 COM executable for DOS
+#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM
+5 string \xcd\x21 COM executable for DOS
+#DELTMP.COm HASFAT32.cOM
+7 string \xcd\x21
+>0 byte !0xb8 COM executable for DOS
+#COMP.cOM MORE.COm
+10 string \xcd\x21
+>5 string !\xcd\x21 COM executable for DOS
+#comecho.com
+13 string \xcd\x21 COM executable for DOS
+#HELP.COm EDIT.coM
+18 string \xcd\x21 COM executable for MS-DOS
+#NWRPLTRM.COm
+23 string \xcd\x21 COM executable for MS-DOS
+#LOADFIX.cOm LOADFIX.cOm
+30 string \xcd\x21 COM executable for MS-DOS
+#syslinux.com 3.11
+70 string \xcd\x21 COM executable for DOS
+# many compressed/converted COMs start with a copy loop instead of a jump
+0x6 search/0xa \xfc\x57\xf3\xa5\xc3 COM executable for MS-DOS
+0x6 search/0xa \xfc\x57\xf3\xa4\xc3 COM executable for DOS
+>0x18 search/0x10 \x50\xa4\xff\xd5\x73 \b, aPack compressed
+0x3c string W\ Collis\0\0 COM executable for MS-DOS, Compack compressed
+# FIXME: missing diet .com compression
+
+# miscellaneous formats
+0 string LZ MS-DOS executable (built-in)
+#0 byte 0xf0 MS-DOS program library data
+#
+
+# AAF files:
+# <stuartc at rd.bbc.co.uk> Stuart Cunningham
+0 string \320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377 AAF legacy file using MS Structured Storage
+>30 byte 9 (512B sectors)
+>30 byte 12 (4kB sectors)
+0 string \320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001 AAF file using MS Structured Storage
+>30 byte 9 (512B sectors)
+>30 byte 12 (4kB sectors)
+
+# Popular applications
+2080 string Microsoft\ Word\ 6.0\ Document %s
+!:mime application/msword
+2080 string Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+!:mime application/msword
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112 string MSWordDoc Microsoft Word document data
+!:mime application/msword
+#
+0 belong 0x31be0000 Microsoft Word Document
+!:mime application/msword
+#
+0 string PO^Q` Microsoft Word 6.0 Document
+!:mime application/msword
+#
+0 string \376\067\0\043 Microsoft Office Document
+!:mime application/msword
+0 string \333\245-\0\0\0 Microsoft Office Document
+!:mime application/msword
+512 string \354\245\301 Microsoft Word Document
+!:mime application/msword
+#
+2080 string Microsoft\ Excel\ 5.0\ Worksheet %s
+!:mime application/vnd.ms-excel
+
+2080 string Foglio\ di\ lavoro\ Microsoft\ Exce %s
+!:mime application/vnd.ms-excel
+#
+# Pawel Wiecek <coven at i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114 string Biff5 Microsoft Excel 5.0 Worksheet
+!:mime application/vnd.ms-excel
+# Italian MS-Excel
+2121 string Biff5 Microsoft Excel 5.0 Worksheet
+!:mime application/vnd.ms-excel
+0 string \x09\x04\x06\x00\x00\x00\x10\x00 Microsoft Excel Worksheet
+!:mime application/vnd.ms-excel
+#
+0 belong 0x00001a00 Lotus 1-2-3
+!:mime application/x-123
+>4 belong 0x00100400 wk3 document data
+>4 belong 0x02100400 wk4 document data
+>4 belong 0x07800100 fm3 or fmb document data
+>4 belong 0x07800000 fm3 or fmb document data
+#
+0 belong 0x00000200 Lotus 1-2-3
+!:mime application/x-123
+>4 belong 0x06040600 wk1 document data
+>4 belong 0x06800200 fmt document data
+0 string WordPro\0 Lotus WordPro
+!:mime application/vnd.lotus-wordpro
+0 string WordPro\r\373 Lotus WordPro
+!:mime application/vnd.lotus-wordpro
+
+
+# Summary: Script used by InstallScield to uninstall applications
+# Extension: .isu
+# Submitted by: unknown
+# Modified by (1): Abel Cheung <abelcheung at gmail.com> (replace useless entry)
+0 string \x71\xa8\x00\x00\x01\x02
+>12 string Stirling\ Technologies, InstallShield Uninstall Script
+
+# Winamp .avs
+#0 string Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
+0 string Nullsoft\ AVS\ Preset\ Winamp plug in
+
+# Windows Metafont .WMF
+0 string \327\315\306\232 ms-windows metafont .wmf
+0 string \002\000\011\000 ms-windows metafont .wmf
+0 string \001\000\011\000 ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0 string \003\001\001\004\070\001\000\000 tz3 ms-works file
+0 string \003\002\001\004\070\001\000\000 tz3 ms-works file
+0 string \003\003\001\004\070\001\000\000 tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0 string MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 MS Windows special zipped file
+
+
+#ico files
+0 string \102\101\050\000\000\000\056\000\000\000\000\000\000\000 Icon for MS Windows
+
+# Windows icons (Ian Springer <ips at fpk.hp.com>)
+0 string \000\000\001\000 MS Windows icon resource
+!:mime image/x-ico
+>4 byte 1 - 1 icon
+>4 byte >1 - %d icons
+>>6 byte >0 \b, %dx
+>>>7 byte >0 \b%d
+>>8 byte 0 \b, 256-colors
+>>8 byte >0 \b, %d-colors
+
+
+# .chr files
+0 string PK\010\010BGI Borland font
+>4 string >\0 %s
+# then there is a copyright notice
+
+
+# .bgi files
+0 string pk\010\010BGI Borland device
+>4 string >\0 %s
+# then there is a copyright notice
+
+
+# Windows Recycle Bin record file (named INFO2)
+# By Abel Cheung (abelcheung AT gmail dot com)
+# Version 4 always has 280 bytes (0x118) per record, version 5 has 800 bytes
+# Since Vista uses another structure, INFO2 structure probably won't change
+# anymore. Detailed analysis in:
+# http://www.cybersecurityinstitute.biz/downloads/INFO2.pdf
+0 lelong 0x00000004
+>12 lelong 0x00000118 Windows Recycle Bin INFO2 file (Win98 or below)
+
+0 lelong 0x00000005
+>12 lelong 0x00000320 Windows Recycle Bin INFO2 file (Win2k - WinXP)
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something files wrongly identified as G3 .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+#0 string \000\001 pfm?
+#>3 string \022\000\000Copyright\ yes
+#>3 string \002\000\000Copyright\ yes
+#>3 string >\0 oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9 string GERBILDOC First Choice document
+9 string GERBILDB First Choice database
+9 string GERBILCLIP First Choice database
+0 string GERBIL First Choice device file
+9 string RABBITGRAPH RabbitGraph file
+0 string DCU1 Borland Delphi .DCU file
+0 string =!<spell> MKS Spell hash list (old format)
+0 string =!<spell2> MKS Spell hash list
+# Too simple - MPi
+#0 string AH Halo(TM) bitmapped font file
+0 lelong 0x08086b70 TurboC BGI file
+0 lelong 0x08084b50 TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0 byte 0x03 DBase 3 data file
+>0x04 lelong 0 (no records)
+>0x04 lelong >0 (%ld records)
+0 byte 0x83 DBase 3 data file with memo(s)
+>0x04 lelong 0 (no records)
+>0x04 lelong >0 (%ld records)
+0 leshort 0x0006 DBase 3 index file
+0 string PMCC Windows 3.x .GRP file
+1 string RDC-meg MegaDots
+>8 byte >0x2F version %c
+>9 byte >0x2F \b.%c file
+0 lelong 0x4C
+>4 lelong 0x00021401 Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0 belong 0xC5D0D3C6 DOS EPS Binary File
+>4 long >0 Postscript starts at byte %d
+>>8 long >0 length %d
+>>>12 long >0 Metafile starts at byte %d
+>>>>16 long >0 length %d
+>>>20 long >0 TIFF starts at byte %d
+>>>>24 long >0 length %d
+
+# TNEF magic From "Joomy" <joomy at se-ed.net>
+# Microsoft Outlook's Transport Neutral Encapsulation Format (TNEF)
+0 leshort 0x223e9f78 TNEF
+!:mime application/vnd.ms-tnef
+
+# HtmlHelp files (.chm)
+0 string ITSF\003\000\000\000\x60\000\000\000\001\000\000\000 MS Windows HtmlHelp Data
+
+# GFA-BASIC (Wolfram Kleff)
+2 string GFA-BASIC3 GFA-BASIC 3 data
+
+#------------------------------------------------------------------------------
+# From Stuart Caie <kyzer at 4u.net> (developer of cabextract)
+# Microsoft Cabinet files
+0 string MSCF\0\0\0\0 Microsoft Cabinet archive data
+!:mime application/vnd.ms-cab-compressed
+>8 lelong x \b, %u bytes
+>28 leshort 1 \b, 1 file
+>28 leshort >1 \b, %u files
+
+# InstallShield Cabinet files
+0 string ISc( InstallShield Cabinet archive data
+>5 byte&0xf0 =0x60 version 6,
+>5 byte&0xf0 !0x60 version 4/5,
+>(12.l+40) lelong x %u files
+
+# Windows CE package files
+0 string MSCE\0\0\0\0 Microsoft WinCE install header
+>20 lelong 0 \b, architecture-independent
+>20 lelong 103 \b, Hitachi SH3
+>20 lelong 104 \b, Hitachi SH4
+>20 lelong 0xA11 \b, StrongARM
+>20 lelong 4000 \b, MIPS R4000
+>20 lelong 10003 \b, Hitachi SH3
+>20 lelong 10004 \b, Hitachi SH3E
+>20 lelong 10005 \b, Hitachi SH4
+>20 lelong 70001 \b, ARM 7TDMI
+>52 leshort 1 \b, 1 file
+>52 leshort >1 \b, %u files
+>56 leshort 1 \b, 1 registry entry
+>56 leshort >1 \b, %u registry entries
+
+
+# Windows Enhanced Metafile (EMF)
+# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp
+# for further information.
+0 ulelong 1
+>40 string \ EMF Windows Enhanced Metafile (EMF) image data
+>>44 ulelong x version 0x%x
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+0 string COWD VMWare3
+>4 byte 3 disk image
+>>32 lelong x (%d/
+>>36 lelong x \b%d/
+>>40 lelong x \b%d)
+>4 byte 2 undoable disk image
+>>32 string >\0 (%s)
+
+0 string VMDK VMware4 disk image
+0 string KDMV VMware4 disk image
+
+#--------------------------------------------------------------------
+# Qemu Emulator Images
+# Lines written by Friedrich Schwittay (f.schwittay at yousable.de)
+# Made by reading sources and doing trial and error on existing
+# qcow files
+0 string QFI Qemu Image, Format: Qcow
+
+# Uncomment the following line to display Magic (only used for debugging
+# this magic number)
+#>0 string x , Magic: %s
+
+# There are currently 2 Versions: "1" and "2"
+# I do not use Version 2 and therefor branch here
+# but can assure: it works (tested on both versions)
+# Also my Qemu 0.9.0 which uses this Version 2 refuses
+# to start in its bios
+>0x04 belong 2 , Version: 2
+>0x04 belong 1 , Version: 1
+
+# Using the existence of the Backing File Offset to Branch or not
+# to read Backing File Information
+>>0xc belong >0 , Backing File( Offset: %lu
+>>>(0xc.L) string >\0 , Path: %s
+
+# Didn't get the trick here how qemu stores the "Size" at this Position
+# There is actually something stored but nothing makes sense
+# The header in the sources talks about it
+#>>>16 lelong x , Size: %lu
+
+# Modification time of the Backing File
+# Really useful if you want to know if your backing
+# file is still usable together with this image
+>>>20 bedate x , Mtime: %s )
+
+# Don't know how to calculate in Magicfiles
+# Also: this Information is not reliably
+# stored in image-files
+>>24 lelong x , Disk Size could be: %d * 256 bytes
+
+0 string QEVM QEMU's suspend to disk image
+
+0 string Bochs\ Virtual\ HD\ Image Bochs disk image,
+>32 string x type %s,
+>48 string x subtype %s
+
+0 lelong 0x02468ace Bochs Sparse disk image
+
+# from http://filext.com by Derek M Jones <derek at knosof.co.uk>
+# False positive with PPT (also currently this string is too long)
+#0 string \xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF\x09\x00\x06 Microsoft Installer
+0 string \320\317\021\340\241\261\032\341 Microsoft Office Document
+#>48 byte 0x1B Excel Document
+#!:mime application/vnd.ms-excel
+>546 string bjbj Microsoft Word Document
+!:mime application/msword
+>546 string jbjb Microsoft Word Document
+!:mime application/msword
+
+0 string \224\246\056 Microsoft Word Document
+!:mime application/msword
+
+512 string R\0o\0o\0t\0\ \0E\0n\0t\0r\0y Microsoft Word Document
+!:mime application/msword
+
+# From: "Nelson A. de Oliveira" <naoliv at gmail.com>
+# Magic type for Dell's BIOS .hdr files
+# Dell's .hdr
+0 string $RBU
+>23 string Dell %s system BIOS
+>48 string x version %.3s
+
+# Type: Microsoft DirectDraw Surface
+# URL: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/DDSFileReference/ddsfileformat.asp
+# From: Morten Hustveit <morten at debian.org>
+0 string DDS\040\174\000\000\000 Microsoft DirectDraw Surface (DDS),
+>16 lelong >0 %hd x
+>12 lelong >0 %hd,
+>84 string x %.4s
+
+# Type: Microsoft Document Imaging Format (.mdi)
+# URL: http://en.wikipedia.org/wiki/Microsoft_Document_Imaging_Format
+# From: Daniele Sempione <scrows at oziosi.org>
+0 short 0x5045 Microsoft Document Imaging Format
+
+# MS eBook format (.lit)
+0 string ITOLITLS Microsoft Reader eBook Data
+>8 lelong x \b, version %u
+!:mime application/x-ms-reader
+
+#------------------------------------------------------------------------------
+# $File: msvc,v 1.5 2009/09/19 16:28:11 christos Exp $
+# msvc: file(1) magic for msvc
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# Microsoft visual C
+#
+# I have version 1.0
+
+# .aps
+0 string HWB\000\377\001\000\000\000 Microsoft Visual C .APS file
+
+# .ide
+#too long 0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316 MSVC .ide
+0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157 MSVC .ide
+
+# .res
+0 string \000\000\000\000\040\000\000\000\377 MSVC .res
+0 string \377\003\000\377\001\000\020\020\350 MSVC .res
+0 string \377\003\000\377\001\000\060\020\350 MSVC .res
+
+#.lib
+0 string \360\015\000\000 Microsoft Visual C library
+0 string \360\075\000\000 Microsoft Visual C library
+0 string \360\175\000\000 Microsoft Visual C library
+
+#.pch
+0 string DTJPCH0\000\022\103\006\200 Microsoft Visual C .pch
+
+# .pdb
+# too long 0 string Microsoft\ C/C++\ program\ database\
+0 string Microsoft\ C/C++\ MSVC program database
+>18 string program\ database\
+>33 string >\0 ver %s
+
+#.sbr
+0 string \000\002\000\007\000 MSVC .sbr
+>5 string >\0 %s
+
+#.bsc
+0 string \002\000\002\001 MSVC .bsc
+
+#.wsp
+0 string 1.00\ .0000.0000\000\003 MSVC .wsp version 1.0000.0000
+# these seem to start with the version and contain menus
+
+# ------------------------------------------------------------------------
+# $File: mup,v 1.4 2009/09/19 16:28:11 christos Exp $
+# mup: file(1) magic for Mup (Music Publisher) input file.
+#
+# From: Abel Cheung <abel (@) oaka.org>
+#
+# NOTE: This header is mainly proposed in the Arkkra mailing list,
+# and is not a mandatory header because of old mup input file
+# compatibility. Noteedit also use mup format, but is not forcing
+# user to use any header as well.
+#
+0 search/1 //!Mup Mup music publication program input text
+>6 string -Arkkra (Arkkra)
+>>13 string -
+>>>16 string .
+>>>>14 string x \b, need V%.4s
+>>>15 string .
+>>>>14 string x \b, need V%.3s
+>6 string -
+>>9 string .
+>>>7 string x \b, need V%.4s
+>>8 string .
+>>>7 string x \b, need V%.3s
+
+#-----------------------------------------------------------------------------
+# $File: natinst,v 1.4 2009/09/19 16:28:11 christos Exp $
+# natinst: file(1) magic for National Instruments Code Files
+
+#
+# From <egamez at fcfm.buap.mx> Enrique G�mez-Flores
+# version 1
+# Many formats still missing, we use, for the moment LabVIEW
+# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
+#
+0 string RSRC National Instruments,
+# Check if it's a LabVIEW File
+>8 string LV LabVIEW File,
+# Check wich kind of file is
+>>10 string SB Code Resource File, data
+>>10 string IN Virtual Instrument Program, data
+>>10 string AR VI Library, data
+# This is for Menu Libraries
+>8 string LMNULBVW Portable File Names, data
+# This is for General Resources
+>8 string rsc Resources File, data
+# This is for VXI Package
+0 string VMAP National Instruments, VXI File, data
+
+#------------------------------------------------------------------------------
+# $File: ncr,v 1.7 2009/09/19 16:28:11 christos Exp $
+# ncr: file(1) magic for NCR Tower objects
+#
+# contributed by
+# Michael R. Wayne *** TMC & Associates *** INTERNET: wayne at ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne OR wayne at fmsrl7.UUCP
+#
+0 beshort 000610 Tower/XP rel 2 object
+>12 belong >0 not stripped
+>20 beshort 0407 executable
+>20 beshort 0410 pure executable
+>22 beshort >0 - version %ld
+0 beshort 000615 Tower/XP rel 2 object
+>12 belong >0 not stripped
+>20 beshort 0407 executable
+>20 beshort 0410 pure executable
+>22 beshort >0 - version %ld
+0 beshort 000620 Tower/XP rel 3 object
+>12 belong >0 not stripped
+>20 beshort 0407 executable
+>20 beshort 0410 pure executable
+>22 beshort >0 - version %ld
+0 beshort 000625 Tower/XP rel 3 object
+>12 belong >0 not stripped
+>20 beshort 0407 executable
+>20 beshort 0410 pure executable
+>22 beshort >0 - version %ld
+0 beshort 000630 Tower32/600/400 68020 object
+>12 belong >0 not stripped
+>20 beshort 0407 executable
+>20 beshort 0410 pure executable
+>22 beshort >0 - version %ld
+0 beshort 000640 Tower32/800 68020
+>18 beshort &020000 w/68881 object
+>18 beshort &040000 compatible object
+>18 beshort &060000 object
+>20 beshort 0407 executable
+>20 beshort 0413 pure executable
+>12 belong >0 not stripped
+>22 beshort >0 - version %ld
+0 beshort 000645 Tower32/800 68010
+>18 beshort &040000 compatible object
+>18 beshort &060000 object
+>20 beshort 0407 executable
+>20 beshort 0413 pure executable
+>12 belong >0 not stripped
+>22 beshort >0 - version %ld
+
+#------------------------------------------------------------------------------
+# $File: netbsd,v 1.18 2009/09/19 16:28:11 christos Exp $
+# netbsd: file(1) magic for NetBSD objects
+#
+# All new-style magic numbers are in network byte order.
+#
+
+0 lelong 000000407 a.out NetBSD little-endian object file
+>16 lelong >0 not stripped
+0 belong 000000407 a.out NetBSD big-endian object file
+>16 belong >0 not stripped
+
+0 belong&0377777777 041400413 a.out NetBSD/i386 demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 041400410 a.out NetBSD/i386 pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 041400407 a.out NetBSD/i386
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+0 belong&0377777777 041400507 a.out NetBSD/i386 core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+0 belong&0377777777 041600413 a.out NetBSD/m68k demand paged
+>0 byte &0x80
+>>20 belong <8192 shared library
+>>20 belong =8192 dynamically linked executable
+>>20 belong >8192 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 041600410 a.out NetBSD/m68k pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 041600407 a.out NetBSD/m68k
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 belong !0 executable
+>>20 belong =0 object file
+>16 belong >0 not stripped
+0 belong&0377777777 041600507 a.out NetBSD/m68k core
+>12 string >\0 from '%s'
+>32 belong !0 (signal %d)
+
+0 belong&0377777777 042000413 a.out NetBSD/m68k4k demand paged
+>0 byte &0x80
+>>20 belong <4096 shared library
+>>20 belong =4096 dynamically linked executable
+>>20 belong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 042000410 a.out NetBSD/m68k4k pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 042000407 a.out NetBSD/m68k4k
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 belong !0 executable
+>>20 belong =0 object file
+>16 belong >0 not stripped
+0 belong&0377777777 042000507 a.out NetBSD/m68k4k core
+>12 string >\0 from '%s'
+>32 belong !0 (signal %d)
+
+0 belong&0377777777 042200413 a.out NetBSD/ns32532 demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 042200410 a.out NetBSD/ns32532 pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 042200407 a.out NetBSD/ns32532
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+0 belong&0377777777 042200507 a.out NetBSD/ns32532 core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+0 belong&0377777777 045200507 a.out NetBSD/powerpc core
+>12 string >\0 from '%s'
+
+0 belong&0377777777 042400413 a.out NetBSD/sparc demand paged
+>0 byte &0x80
+>>20 belong <8192 shared library
+>>20 belong =8192 dynamically linked executable
+>>20 belong >8192 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 042400410 a.out NetBSD/sparc pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 042400407 a.out NetBSD/sparc
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 belong !0 executable
+>>20 belong =0 object file
+>16 belong >0 not stripped
+0 belong&0377777777 042400507 a.out NetBSD/sparc core
+>12 string >\0 from '%s'
+>32 belong !0 (signal %d)
+
+0 belong&0377777777 042600413 a.out NetBSD/pmax demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 042600410 a.out NetBSD/pmax pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 042600407 a.out NetBSD/pmax
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+0 belong&0377777777 042600507 a.out NetBSD/pmax core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+0 belong&0377777777 043000413 a.out NetBSD/vax 1k demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 043000410 a.out NetBSD/vax 1k pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 043000407 a.out NetBSD/vax 1k
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+0 belong&0377777777 043000507 a.out NetBSD/vax 1k core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+0 belong&0377777777 045400413 a.out NetBSD/vax 4k demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 045400410 a.out NetBSD/vax 4k pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 045400407 a.out NetBSD/vax 4k
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+0 belong&0377777777 045400507 a.out NetBSD/vax 4k core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+# NetBSD/alpha does not support (and has never supported) a.out objects,
+# so no rules are provided for them. NetBSD/alpha ELF objects are
+# dealt with in "elf".
+0 lelong 0x00070185 ECOFF NetBSD/alpha binary
+>10 leshort 0x0001 not stripped
+>10 leshort 0x0000 stripped
+0 belong&0377777777 043200507 a.out NetBSD/alpha core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+0 belong&0377777777 043400413 a.out NetBSD/mips demand paged
+>0 byte &0x80
+>>20 belong <8192 shared library
+>>20 belong =8192 dynamically linked executable
+>>20 belong >8192 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 043400410 a.out NetBSD/mips pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+0 belong&0377777777 043400407 a.out NetBSD/mips
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 belong !0 executable
+>>20 belong =0 object file
+>16 belong >0 not stripped
+0 belong&0377777777 043400507 a.out NetBSD/mips core
+>12 string >\0 from '%s'
+>32 belong !0 (signal %d)
+
+0 belong&0377777777 043600413 a.out NetBSD/arm32 demand paged
+>0 byte &0x80
+>>20 lelong <4096 shared library
+>>20 lelong =4096 dynamically linked executable
+>>20 lelong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 043600410 a.out NetBSD/arm32 pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 lelong >0 not stripped
+0 belong&0377777777 043600407 a.out NetBSD/arm32
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80
+>>0 byte &0x40 position independent
+>>20 lelong !0 executable
+>>20 lelong =0 object file
+>16 lelong >0 not stripped
+# NetBSD/arm26 has always used ELF objects, but it shares a core file
+# format with NetBSD/arm32.
+0 belong&0377777777 043600507 a.out NetBSD/arm core
+>12 string >\0 from '%s'
+>32 lelong !0 (signal %d)
+
+#------------------------------------------------------------------------------
+# $File: netscape,v 1.6 2009/09/19 16:28:11 christos Exp $
+# netscape: file(1) magic for Netscape files
+# "H. Nanosecond" <aldomel at ix.netcom.com>
+# version 3 and 4 I think
+#
+
+# Netscape Address book .nab
+0 string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
+
+# Netscape Communicator address book
+0 string \000\017\102\111 Netscape Communicator address book
+
+# .snm Caches
+0 string #\ Netscape\ folder\ cache Netscape folder cache
+0 string \000\036\204\220\000 Netscape folder cache
+# .n2p
+# Net 2 Phone
+#0 string 123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
+0 string SX961999 Net2phone
+
+#
+#This is files ending in .art, FIXME add more rules
+0 string JG\004\016\0\0\0\0 ART
+
+#------------------------------------------------------------------------------
+# $File: netware,v 1.4 2009/09/19 16:28:11 christos Exp $
+# netware: file(1) magic for NetWare Loadable Modules (NLMs)
+# From: Mads Martin Joergensen <mmj at suse.de>
+
+0 string NetWare\ Loadable\ Module NetWare Loadable Module
+
+#------------------------------------------------------------------------------
+# $File: news,v 1.6 2009/09/19 16:28:11 christos Exp $
+# news: file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
+#
+0 string StartFontMetrics ASCII font metrics
+0 string StartFont ASCII font bits
+0 belong 0x137A2944 NeWS bitmap font
+0 belong 0x137A2947 NeWS font family
+0 belong 0x137A2950 scalable OpenFont binary
+0 belong 0x137A2951 encrypted scalable OpenFont binary
+8 belong 0x137A2B45 X11/NeWS bitmap font
+8 belong 0x137A2B48 X11/NeWS font family
+
+#------------------------------------------------------------------------------
+# $File: nitpicker,v 1.4 2009/09/19 16:28:11 christos Exp $
+# nitpicker: file(1) magic for Flowfiles.
+# From: Christian Jachmann <C.Jachmann at gmx.net> http://www.nitpicker.de
+0 string NPFF NItpicker Flow File
+>4 byte x V%d.
+>5 byte x %d
+>6 bedate x started: %s
+>10 bedate x stopped: %s
+>14 belong x Bytes: %u
+>18 belong x Bytes1: %u
+>22 belong x Flows: %u
+>26 belong x Pkts: %u
+
+#------------------------------------------------------------------------------
+# $File: ocaml,v 1.4 2009/09/19 16:28:11 christos Exp $
+# ocaml: file(1) magic for Objective Caml files.
+0 string Caml1999 Objective caml
+>8 string X exec file
+>8 string I interface file (.cmi)
+>8 string O object file (.cmo)
+>8 string A library file (.cma)
+>8 string Y native object file (.cmx)
+>8 string Z native library file (.cmxa)
+>8 string M abstract syntax tree implementation file
+>8 string N abstract syntax tree interface file
+>9 string >\0 (Version %3.3s).
+
+#------------------------------------------------------------------------------
+# $File: octave,v 1.4 2009/09/19 16:28:11 christos Exp $
+# octave binary data file(1) magic, from Dirk Eddelbuettel <edd at debian.org>
+0 string Octave-1-L Octave binary data (little endian)
+0 string Octave-1-B Octave binary data (big endian)
+
+#------------------------------------------------------------------------------
+# $File: ole2compounddocs,v 1.4 2009/09/19 16:28:11 christos Exp $
+# Microsoft OLE 2 Compound Documents : file(1) magic for Microsoft Structured
+# storage (http://en.wikipedia.org/wiki/Structured_Storage)
+# Additional tests for OLE 2 Compound Documents should be under this recipe.
+
+0 string \320\317\021\340\241\261\032\341 OLE 2 Compound Document
+# - Microstation V8 DGN files (www.bentley.com)
+# Last update on 10/23/2006 by Lester Hightower
+> 0x480 string D\000g\000n\000~\000H : Microstation V8 DGN
+# - Visio documents
+# Last update on 10/23/2006 by Lester Hightower
+> 0x480 string V\000i\000s\000i\000o\000D\000o\000c : Visio Document
+
+#------------------------------------------------------------------------------
+# $File: olf,v 1.4 2009/09/19 16:28:11 christos Exp $
+# olf: file(1) magic for OLF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by Erik Theisen <etheisen at openbsd.org>
+# Based on elf from Daniel Quinlan <quinlan at yggdrasil.com>
+0 string \177OLF OLF
+>4 byte 0 invalid class
+>4 byte 1 32-bit
+>4 byte 2 64-bit
+>7 byte 0 invalid os
+>7 byte 1 OpenBSD
+>7 byte 2 NetBSD
+>7 byte 3 FreeBSD
+>7 byte 4 4.4BSD
+>7 byte 5 Linux
+>7 byte 6 SVR4
+>7 byte 7 esix
+>7 byte 8 Solaris
+>7 byte 9 Irix
+>7 byte 10 SCO
+>7 byte 11 Dell
+>7 byte 12 NCR
+>5 byte 0 invalid byte order
+>5 byte 1 LSB
+>>16 leshort 0 no file type,
+>>16 leshort 1 relocatable,
+>>16 leshort 2 executable,
+>>16 leshort 3 shared object,
+# Core handling from Peter Tobias <tobias at server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk at ds9.au.s.shuttle.de>
+>>16 leshort 4 core file
+>>>(0x38+0xcc) string >\0 of '%s'
+>>>(0x38+0x10) lelong >0 (signal %d),
+>>16 leshort &0xff00 processor-specific,
+>>18 leshort 0 no machine,
+>>18 leshort 1 AT&T WE32100 - invalid byte order,
+>>18 leshort 2 SPARC - invalid byte order,
+>>18 leshort 3 Intel 80386,
+>>18 leshort 4 Motorola 68000 - invalid byte order,
+>>18 leshort 5 Motorola 88000 - invalid byte order,
+>>18 leshort 6 Intel 80486,
+>>18 leshort 7 Intel 80860,
+>>18 leshort 8 MIPS R3000_BE - invalid byte order,
+>>18 leshort 9 Amdahl - invalid byte order,
+>>18 leshort 10 MIPS R3000_LE,
+>>18 leshort 11 RS6000 - invalid byte order,
+>>18 leshort 15 PA-RISC - invalid byte order,
+>>18 leshort 16 nCUBE,
+>>18 leshort 17 VPP500,
+>>18 leshort 18 SPARC32PLUS,
+>>18 leshort 20 PowerPC,
+>>18 leshort 0x9026 Alpha,
+>>20 lelong 0 invalid version
+>>20 lelong 1 version 1
+>>36 lelong 1 MathCoPro/FPU/MAU Required
+>8 string >\0 (%s)
+>5 byte 2 MSB
+>>16 beshort 0 no file type,
+>>16 beshort 1 relocatable,
+>>16 beshort 2 executable,
+>>16 beshort 3 shared object,
+>>16 beshort 4 core file,
+>>>(0x38+0xcc) string >\0 of '%s'
+>>>(0x38+0x10) belong >0 (signal %d),
+>>16 beshort &0xff00 processor-specific,
+>>18 beshort 0 no machine,
+>>18 beshort 1 AT&T WE32100,
+>>18 beshort 2 SPARC,
+>>18 beshort 3 Intel 80386 - invalid byte order,
+>>18 beshort 4 Motorola 68000,
+>>18 beshort 5 Motorola 88000,
+>>18 beshort 6 Intel 80486 - invalid byte order,
+>>18 beshort 7 Intel 80860,
+>>18 beshort 8 MIPS R3000_BE,
+>>18 beshort 9 Amdahl,
+>>18 beshort 10 MIPS R3000_LE - invalid byte order,
+>>18 beshort 11 RS6000,
+>>18 beshort 15 PA-RISC,
+>>18 beshort 16 nCUBE,
+>>18 beshort 17 VPP500,
+>>18 beshort 18 SPARC32PLUS,
+>>18 beshort 20 PowerPC or cisco 4500,
+>>18 beshort 21 cisco 7500,
+>>18 beshort 24 cisco SVIP,
+>>18 beshort 25 cisco 7200,
+>>18 beshort 36 cisco 12000,
+>>18 beshort 0x9026 Alpha,
+>>20 belong 0 invalid version
+>>20 belong 1 version 1
+>>36 belong 1 MathCoPro/FPU/MAU Required
+
+#------------------------------------------------------------------------------
+# $File: os2,v 1.7 2009/09/19 16:28:11 christos Exp $
+# os2: file(1) magic for OS/2 files
+#
+
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+1 search/1 InternetShortcut MS Windows 95 Internet shortcut text
+>24 search/1 >\ (URL=<%s>)
+
+# OS/2 URL objects
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news at REMOVEIFNOTSPAMusa.net>
+#0 string http: OS/2 URL object text
+#>5 string >\ (WWW) <http:%s>
+#0 string mailto: OS/2 URL object text
+#>7 string >\ (email) <%s>
+#0 string news: OS/2 URL object text
+#>5 string >\ (Usenet) <%s>
+#0 string ftp: OS/2 URL object text
+#>4 string >\ (FTP) <ftp:%s>
+#0 string file: OS/2 URL object text
+#>5 string >\ (Local file) <%s>
+
+# >>>>> OS/2 INF/HLP <<<<< (source: Daniel Dissett ddissett at netcom.com)
+# Carl Hauser (chauser.parc at xerox.com) and
+# Marcus Groeber (marcusg at ph-cip.uni-koeln.de)
+# list the following header format in inf02a.doc:
+#
+# int16 ID; // ID magic word (5348h = "HS")
+# int8 unknown1; // unknown purpose, could be third letter of ID
+# int8 flags; // probably a flag word...
+# // bit 0: set if INF style file
+# // bit 4: set if HLP style file
+# // patching this byte allows reading HLP files
+# // using the VIEW command, while help files
+# // seem to work with INF settings here as well.
+# int16 hdrsize; // total size of header
+# int16 unknown2; // unknown purpose
+#
+0 string HSP\x01\x9b\x00 OS/2 INF
+>107 string >0 (%s)
+0 string HSP\x10\x9b\x00 OS/2 HLP
+>107 string >0 (%s)
+
+# OS/2 INI (this is a guess)
+0 string \xff\xff\xff\xff\x14\0\0\0 OS/2 INI
+
+#------------------------------------------------------------------------------
+# $File: os400,v 1.5 2009/09/19 16:28:11 christos Exp $
+# os400: file(1) magic for IBM OS/400 files
+#
+# IBM OS/400 (i5/OS) Save file (SAVF) - gerardo.cacciari at gmail.com
+# In spite of its quite variable format (due to internal memory page
+# length differences between CISC and RISC versions of the OS) the
+# SAVF structure hasn't suitable offsets to identify the catalog
+# header in the first descriptor where there are some useful infos,
+# so we must search in a somewhat large area for a particular string
+# that represents the EBCDIC encoding of 'QSRDSSPC' (save/restore
+# descriptor space) preceded by a two byte constant.
+#
+1090 search/7393 \x19\xDB\xD8\xE2\xD9\xC4\xE2\xE2\xD7\xC3 IBM OS/400 save file data
+>&212 byte 0x01 \b, created with SAVOBJ
+>&212 byte 0x02 \b, created with SAVLIB
+>&212 byte 0x07 \b, created with SAVCFG
+>&212 byte 0x08 \b, created with SAVSECDTA
+>&212 byte 0x0A \b, created with SAVSECDTA
+>&212 byte 0x0B \b, created with SAVDLO
+>&212 byte 0x0D \b, created with SAVLICPGM
+>&212 byte 0x11 \b, created with SAVCHGOBJ
+>&213 byte 0x44 \b, at least V5R4 to open
+>&213 byte 0x43 \b, at least V5R3 to open
+>&213 byte 0x42 \b, at least V5R2 to open
+>&213 byte 0x41 \b, at least V5R1 to open
+>&213 byte 0x40 \b, at least V4R5 to open
+>&213 byte 0x3F \b, at least V4R4 to open
+>&213 byte 0x3E \b, at least V4R3 to open
+>&213 byte 0x3C \b, at least V4R2 to open
+>&213 byte 0x3D \b, at least V4R1M4 to open
+>&213 byte 0x3B \b, at least V4R1 to open
+>&213 byte 0x3A \b, at least V3R7 to open
+>&213 byte 0x35 \b, at least V3R6 to open
+>&213 byte 0x36 \b, at least V3R2 to open
+>&213 byte 0x34 \b, at least V3R1 to open
+>&213 byte 0x31 \b, at least V3R0M5 to open
+>&213 byte 0x30 \b, at least V2R3 to open
+
+#------------------------------------------------------------------------------
+# $File: os9,v 1.6 2009/09/19 16:28:11 christos Exp $
+#
+# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Ignatios Souvatzis for
+# the NetBSD project.
+# 4. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+#
+# OS9/6809 module descriptions:
+#
+0 beshort 0x87CD OS9/6809 module:
+#
+>6 byte&0x0f 0x00 non-executable
+>6 byte&0x0f 0x01 machine language
+>6 byte&0x0f 0x02 BASIC I-code
+>6 byte&0x0f 0x03 Pascal P-code
+>6 byte&0x0f 0x04 C I-code
+>6 byte&0x0f 0x05 COBOL I-code
+>6 byte&0x0f 0x06 Fortran I-code
+#
+>6 byte&0xf0 0x10 program executable
+>6 byte&0xf0 0x20 subroutine
+>6 byte&0xf0 0x30 multi-module
+>6 byte&0xf0 0x40 data module
+#
+>6 byte&0xf0 0xC0 system module
+>6 byte&0xf0 0xD0 file manager
+>6 byte&0xf0 0xE0 device driver
+>6 byte&0xf0 0xF0 device descriptor
+#
+# OS9/m68k stuff (to be continued)
+#
+0 beshort 0x4AFC OS9/68K module:
+#
+# attr
+>0x14 byte&0x80 0x80 re-entrant
+>0x14 byte&0x40 0x40 ghost
+>0x14 byte&0x20 0x20 system-state
+#
+# lang:
+#
+>0x13 byte 1 machine language
+>0x13 byte 2 BASIC I-code
+>0x13 byte 3 Pascal P-code
+>0x13 byte 4 C I-code
+>0x13 byte 5 COBOL I-code
+>0x13 byte 6 Fortran I-code
+#
+#
+# type:
+#
+>0x12 byte 1 program executable
+>0x12 byte 2 subroutine
+>0x12 byte 3 multi-module
+>0x12 byte 4 data module
+>0x12 byte 11 trap library
+>0x12 byte 12 system module
+>0x12 byte 13 file manager
+>0x12 byte 14 device driver
+>0x12 byte 15 device descriptor
+
+#------------------------------------------------------------------------------
+# $File: osf1,v 1.7 2009/09/19 16:28:11 christos Exp $
+#
+# Mach magic number info
+#
+0 long 0xefbe OSF/Rose object
+# I386 magic number info
+#
+0 short 0565 i386 COFF object
+
+#------------------------------------------------------------------------------
+# $File: palm,v 1.7 2009/09/19 16:28:11 christos Exp $
+# palm: file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
+#
+# Brian Lalor <blalor at hcirisc.cs.binghamton.edu>
+
+# appl
+60 belong 0x6170706c PalmOS application
+>0 string >\0 "%s"
+# TEXt
+60 belong 0x54455874 AportisDoc file
+>0 string >\0 "%s"
+# HACK
+60 belong 0x4841434b HackMaster hack
+>0 string >\0 "%s"
+
+# Variety of PalmOS document types
+# Michael-John Turner <mj at debian.org>
+# Thanks to Hasan Umit Ezerce <humit at tr-net.net.tr> for his DocType
+60 string BVokBDIC BDicty PalmOS document
+>0 string >\0 "%s"
+60 string DB99DBOS DB PalmOS document
+>0 string >\0 "%s"
+60 string vIMGView FireViewer/ImageViewer PalmOS document
+>0 string >\0 "%s"
+60 string PmDBPmDB HanDBase PalmOS document
+>0 string >\0 "%s"
+60 string InfoINDB InfoView PalmOS document
+>0 string >\0 "%s"
+60 string ToGoToGo iSilo PalmOS document
+>0 string >\0 "%s"
+60 string JfDbJBas JFile PalmOS document
+>0 string >\0 "%s"
+60 string JfDbJFil JFile Pro PalmOS document
+>0 string >\0 "%s"
+60 string DATALSdb List PalmOS document
+>0 string >\0 "%s"
+60 string Mdb1Mdb1 MobileDB PalmOS document
+>0 string >\0 "%s"
+60 string PNRdPPrs PeanutPress PalmOS document
+>0 string >\0 "%s"
+60 string DataPlkr Plucker PalmOS document
+>0 string >\0 "%s"
+60 string DataSprd QuickSheet PalmOS document
+>0 string >\0 "%s"
+60 string SM01SMem SuperMemo PalmOS document
+>0 string >\0 "%s"
+60 string TEXtTlDc TealDoc PalmOS document
+>0 string >\0 "%s"
+60 string InfoTlIf TealInfo PalmOS document
+>0 string >\0 "%s"
+60 string DataTlMl TealMeal PalmOS document
+>0 string >\0 "%s"
+60 string DataTlPt TealPaint PalmOS document
+>0 string >\0 "%s"
+60 string dataTDBP ThinkDB PalmOS document
+>0 string >\0 "%s"
+60 string TdatTide Tides PalmOS document
+>0 string >\0 "%s"
+60 string ToRaTRPW TomeRaider PalmOS document
+>0 string >\0 "%s"
+
+# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)
+# For version 1.xx zTXTs, outputs version and numbers of bookmarks and
+# annotations.
+# For other versions, just outputs version.
+#
+60 string zTXT A GutenPalm zTXT e-book
+>0 string >\0 "%s"
+>(0x4E.L) byte 0
+>>(0x4E.L+1) byte x (v0.%02d)
+>(0x4E.L) byte 1
+>>(0x4E.L+1) byte x (v1.%02d)
+>>>(0x4E.L+10) beshort >0
+>>>>(0x4E.L+10) beshort <2 - 1 bookmark
+>>>>(0x4E.L+10) beshort >1 - %d bookmarks
+>>>(0x4E.L+14) beshort >0
+>>>>(0x4E.L+14) beshort <2 - 1 annotation
+>>>>(0x4E.L+14) beshort >1 - %d annotations
+>(0x4E.L) byte >1 (v%d.
+>>(0x4E.L+1) byte x %02d)
+
+# Palm OS .prc file types
+60 string libr Palm OS dynamic library data
+>0 string >\0 "%s"
+60 string ptch Palm OS operating system patch data
+>0 string >\0 "%s"
+
+# Mobipocket (www.mobipocket.com), donated by Carl Witty
+60 string BOOKMOBI Mobipocket E-book
+>0 string >\0 "%s"
+
+#------------------------------------------------------------------------------
+# $File: parix,v 1.4 2009/09/19 16:28:11 christos Exp $
+#
+# Parix COFF executables
+# From: Ignatios Souvatzis <ignatios at cs.uni-bonn.de>
+#
+0 beshort&0xfff 0xACE PARIX
+>0 byte&0xf0 0x80 T800
+>0 byte&0xf0 0x90 T9000
+>19 byte&0x02 0x02 executable
+>19 byte&0x02 0x00 object
+>19 byte&0x0c 0x00 not stripped
+
+#------------------------------------------------------------------------------
+# $File: pbm,v 1.6 2009/09/19 16:28:11 christos Exp $
+# pbm: file(1) magic for Portable Bitmap files
+#
+# XXX - byte order?
+#
+0 short 0x2a17 "compact bitmap" format (Poskanzer)
+
+#------------------------------------------------------------------------------
+# $File: pdf,v 1.6 2009/09/19 16:28:11 christos Exp $
+# pdf: file(1) magic for Portable Document Format
+#
+
+0 string %PDF- PDF document
+!:mime application/pdf
+>5 byte x \b, version %c
+>7 byte x \b.%c
+
+# From: Nick Schmalenberger <nick at schmalenberger.us>
+# Forms Data Format
+0 string %FDF- FDF document
+>5 byte x \b, version %c
+>7 byte x \b.%c
+
+#------------------------------------------------------------------------------
+# $File: pdp,v 1.8 2009/09/19 16:28:11 christos Exp $
+# pdp: file(1) magic for PDP-11 executable/object and APL workspace
+#
+0 lelong 0101555 PDP-11 single precision APL workspace
+0 lelong 0101554 PDP-11 double precision APL workspace
+#
+# PDP-11 a.out
+#
+0 leshort 0407 PDP-11 executable
+>8 leshort >0 not stripped
+>15 byte >0 - version %ld
+
+0 leshort 0401 PDP-11 UNIX/RT ldp
+0 leshort 0405 PDP-11 old overlay
+
+0 leshort 0410 PDP-11 pure executable
+>8 leshort >0 not stripped
+>15 byte >0 - version %ld
+
+0 leshort 0411 PDP-11 separate I&D executable
+>8 leshort >0 not stripped
+>15 byte >0 - version %ld
+
+0 leshort 0437 PDP-11 kernel overlay
+
+# These last three are derived from 2.11BSD file(1)
+0 leshort 0413 PDP-11 demand-paged pure executable
+>8 leshort >0 not stripped
+
+0 leshort 0430 PDP-11 overlaid pure executable
+>8 leshort >0 not stripped
+
+0 leshort 0431 PDP-11 overlaid separate executable
+>8 leshort >0 not stripped
+
+#------------------------------------------------------------------------------
+# $File: perl,v 1.16 2009/09/19 16:28:11 christos Exp $
+# perl: file(1) magic for Larry Wall's perl language.
+#
+# The `eval' lines recognizes an outrageously clever hack.
+# Keith Waclena <keith at cerberus.uchicago.edu>
+# Send additions to <perl5-porters at perl.org>
+0 search/1/w #!\ /bin/perl Perl script text executable
+!:mime text/x-perl
+0 search/1 eval\ "exec\ /bin/perl Perl script text
+!:mime text/x-perl
+0 search/1/w #!\ /usr/bin/perl Perl script text executable
+!:mime text/x-perl
+0 search/1 eval\ "exec\ /usr/bin/perl Perl script text
+!:mime text/x-perl
+0 search/1/w #!\ /usr/local/bin/perl Perl script text executable
+!:mime text/x-perl
+0 search/1 eval\ "exec\ /usr/local/bin/perl Perl script text
+!:mime text/x-perl
+0 search/1 eval\ '(exit\ $?0)'\ &&\ eval\ 'exec Perl script text
+!:mime text/x-perl
+
+
+# by Dmitry V. Levin and Alexey Tourbin
+# check the first line
+0 search/1 package
+>0 regex \^package[\ \t]+[0-9A-Za-z_:]+\ *; Perl5 module source text
+# not 'p', check other lines
+0 search/1 !p
+>0 regex \^package[\ \t]+[0-9A-Za-z_:]+\ *;
+>>0 regex \^1\ *;|\^(use|sub|my)\ .*[(;{=] Perl5 module source text
+
+
+
+# Perl POD documents
+# From: Tom Hukins <tom at eborcom.com>
+0 search/1/W \=pod\n Perl POD document text
+0 search/1/W \n\=pod\n Perl POD document text
+0 search/1/W \=head1\ Perl POD document text
+0 search/1/W \n\=head1\ Perl POD document text
+0 search/1/W \=head2\ Perl POD document text
+0 search/1/W \n\=head2\ Perl POD document text
+
+# Perl Storable data files.
+0 string perl-store perl Storable (v0.6) data
+>4 byte >0 (net-order %d)
+>>4 byte &01 (network-ordered)
+>>4 byte =3 (major 1)
+>>4 byte =2 (major 1)
+
+0 string pst0 perl Storable (v0.7) data
+>4 byte >0
+>>4 byte &01 (network-ordered)
+>>4 byte =5 (major 2)
+>>4 byte =4 (major 2)
+>>5 byte >0 (minor %d)
+
+#------------------------------------------------------------------------------
+# $File: pgp,v 1.9 2009/09/19 16:28:11 christos Exp $
+# pgp: file(1) magic for Pretty Good Privacy
+# see http://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
+#
+0 beshort 0x9900 PGP key public ring
+!:mime application/x-pgp-keyring
+0 beshort 0x9501 PGP key security ring
+!:mime application/x-pgp-keyring
+0 beshort 0x9500 PGP key security ring
+!:mime application/x-pgp-keyring
+0 beshort 0xa600 PGP encrypted data
+#!:mime application/pgp-encrypted
+#0 string -----BEGIN\040PGP text/PGP armored data
+!:mime text/PGP # encoding: armored data
+#>15 string PUBLIC\040KEY\040BLOCK- public key block
+#>15 string MESSAGE- message
+#>15 string SIGNED\040MESSAGE- signed message
+#>15 string PGP\040SIGNATURE- signature
+
+2 string ---BEGIN\ PGP\ PUBLIC\ KEY\ BLOCK- PGP public key block
+!:mime application/pgp-keys
+0 string -----BEGIN\040PGP\40MESSAGE- PGP message
+!:mime application/pgp
+0 string -----BEGIN\040PGP\40SIGNATURE- PGP signature
+!:mime application/pgp-signature
+
+#------------------------------------------------------------------------------
+# $File: pkgadd,v 1.6 2009/09/19 16:28:11 christos Exp $
+# pkgadd: file(1) magic for SysV R4 PKG Datastreams
+#
+0 string #\ PaCkAgE\ DaTaStReAm pkg Datastream (SVR4)
+!:mime application/x-svr4-package
+
+#------------------------------------------------------------------------------
+# $File: plan9,v 1.5 2009/09/19 16:28:11 christos Exp $
+# plan9: file(1) magic for AT&T Bell Labs' Plan 9 executables
+# From: "Stefan A. Haubenthal" <polluks at web.de>
+#
+0 belong 0x00000107 Plan 9 executable, Motorola 68k
+0 belong 0x000001EB Plan 9 executable, Intel 386
+0 belong 0x00000247 Plan 9 executable, Intel 960
+0 belong 0x000002AB Plan 9 executable, SPARC
+0 belong 0x00000407 Plan 9 executable, MIPS R3000
+0 belong 0x0000048B Plan 9 executable, AT&T DSP 3210
+0 belong 0x00000517 Plan 9 executable, MIPS R4000 BE
+0 belong 0x000005AB Plan 9 executable, AMD 29000
+0 belong 0x00000647 Plan 9 executable, ARM 7-something
+0 belong 0x000006EB Plan 9 executable, PowerPC
+0 belong 0x00000797 Plan 9 executable, MIPS R4000 LE
+0 belong 0x0000084B Plan 9 executable, DEC Alpha
+
+#------------------------------------------------------------------------------
+# $File: plus5,v 1.6 2009/09/19 16:28:11 christos Exp $
+# plus5: file(1) magic for Plus Five's UNIX MUMPS
+#
+# XXX - byte order? Paging Hokey....
+#
+0 short 0x259 mumps avl global
+>2 byte >0 (V%d)
+>6 byte >0 with %d byte name
+>7 byte >0 and %d byte data cells
+0 short 0x25a mumps blt global
+>2 byte >0 (V%d)
+>8 short >0 - %d byte blocks
+>15 byte 0x00 - P/D format
+>15 byte 0x01 - P/K/D format
+>15 byte 0x02 - K/D format
+>15 byte >0x02 - Bad Flags
+
+#------------------------------------------------------------------------------
+# $File: printer,v 1.22 2009/09/19 16:28:11 christos Exp $
+# printer: file(1) magic for printer-formatted files
+#
+
+# PostScript, updated by Daniel Quinlan (quinlan at yggdrasil.com)
+0 string %! PostScript document text
+!:mime application/postscript
+!:apple ASPSTEXT
+>2 string PS-Adobe- conforming
+>>11 string >\0 DSC level %.3s
+>>>15 string EPS \b, type %s
+>>>15 string Query \b, type %s
+>>>15 string ExitServer \b, type %s
+>>>15 search/1000 %%LanguageLevel:\
+>>>>&0 string >\0 \b, Level %s
+# Some PCs have the annoying habit of adding a ^D as a document separator
+0 string \004%! PostScript document text
+!:mime application/postscript
+!:apple ASPSTEXT
+>3 string PS-Adobe- conforming
+>>12 string >\0 DSC level %.3s
+>>>16 string EPS \b, type %s
+>>>16 string Query \b, type %s
+>>>16 string ExitServer \b, type %s
+>>>16 search/1000 %%LanguageLevel:\
+>>>>&0 string >\0 \b, Level %s
+0 string \033%-12345X%!PS PostScript document
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews at Black.Market.NET>
+0 belong 0xC5D0D3C6 DOS EPS Binary File
+>4 long >0 Postscript starts at byte %d
+>>8 long >0 length %d
+>>>12 long >0 Metafile starts at byte %d
+>>>>16 long >0 length %d
+>>>20 long >0 TIFF starts at byte %d
+>>>>24 long >0 length %d
+
+# Summary: Adobe's PostScript Printer Description File
+# Extension: .ppd
+# Reference: http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf, Section 3.8
+# Submitted by: Yves Arrouye <arrouye at marin.fdn.fr>
+#
+0 string *PPD-Adobe:\x20 PPD file
+>&0 string x \b, version %s
+
+# HP Printer Job Language
+0 string \033%-12345X at PJL HP Printer Job Language data
+# HP Printer Job Language
+# The header found on Win95 HP plot files is the "Silliest Thing possible"
+# (TM)
+# Every driver puts the language at some random position, with random case
+# (LANGUAGE and Language)
+# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
+# From: Uwe Bonnes <bon at elektron.ikp.physik.th-darmstadt.de>
+#
+0 string \033%-12345X at PJL HP Printer Job Language data
+>&0 string >\0 %s
+>>&0 string >\0 %s
+>>>&0 string >\0 %s
+>>>>&0 string >\0 %s
+#>15 string \ ENTER\ LANGUAGE\ =
+#>31 string PostScript PostScript
+
+# HP Printer Control Language, Daniel Quinlan (quinlan at yggdrasil.com)
+0 string \033E\033 HP PCL printer data
+>3 string \&l0A - default page size
+>3 string \&l1A - US executive page size
+>3 string \&l2A - US letter page size
+>3 string \&l3A - US legal page size
+>3 string \&l26A - A4 page size
+>3 string \&l80A - Monarch envelope size
+>3 string \&l81A - No. 10 envelope size
+>3 string \&l90A - Intl. DL envelope size
+>3 string \&l91A - Intl. C5 envelope size
+>3 string \&l100A - Intl. B5 envelope size
+>3 string \&l-81A - No. 10 envelope size (landscape)
+>3 string \&l-90A - Intl. DL envelope size (landscape)
+
+# IMAGEN printer-ready files:
+0 string @document( Imagen printer
+# this only works if "language xxx" is first item in Imagen header.
+>10 string language\ impress (imPRESS data)
+>10 string language\ daisy (daisywheel text)
+>10 string language\ diablo (daisywheel text)
+>10 string language\ printer (line printer emulation)
+>10 string language\ tektronix (Tektronix 4014 emulation)
+# Add any other languages that your Imagen uses - remember
+# to keep the word `text' if the file is human-readable.
+# [GRR 950115: missing "postscript" or "ultrascript" (whatever it was called)]
+#
+# Now magic for IMAGEN font files...
+0 string Rast RST-format raster font data
+>45 string >0 face %s
+# From Jukka Ukkonen
+0 string \033[K\002\0\0\017\033(a\001\0\001\033(g Canon Bubble Jet BJC formatted data
+
+# From <mike at flyn.org>
+# These are the /etc/magic entries to decode data sent to an Epson printer.
+0 string \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P Epson Stylus Color 460 data
+
+
+#------------------------------------------------------------------------------
+# zenographics: file(1) magic for Zenographics ZjStream printer data
+# Rick Richardson rickr at mn.rr.com
+0 string JZJZ
+>0x12 string ZZ Zenographics ZjStream printer data (big-endian)
+0 string ZJZJ
+>0x12 string ZZ Zenographics ZjStream printer data (little-endian)
+
+
+#------------------------------------------------------------------------------
+# Oak Technologies printer stream
+# Rick Richardson <rickr at mn.rr.com>
+0 string OAK
+>0x07 byte 0
+>0x0b byte 0 Oak Technologies printer stream
+
+# This would otherwise be recognized as PostScript - nick at debian.org
+0 string %!VMF SunClock's Vector Map Format data
+
+#------------------------------------------------------------------------------
+# HP LaserJet 1000 series downloadable firmware file
+0 string \xbe\xefABCDEFGH HP LaserJet 1000 series downloadable firmware
+
+# From: Paolo <oopla at users.sf.net>
+# Epson ESC/Page, ESC/PageColor
+0 string \x1b\x01 at EJL Epson ESC/Page language printer data
+
+#------------------------------------------------------------------------------
+# $File: project,v 1.4 2009/09/19 16:28:11 christos Exp $
+# project: file(1) magic for Project management
+#
+# Magic strings for ftnchek project files. Alexander Mai
+0 string FTNCHEK_\ P project file for ftnchek
+>10 string 1 version 2.7
+>10 string 2 version 2.8 to 2.10
+>10 string 3 version 2.11 or later
+
+#------------------------------------------------------------------------------
+# $File: psdbms,v 1.6 2009/09/19 16:28:11 christos Exp $
+# psdbms: file(1) magic for psdatabase
+#
+0 belong&0xff00ffff 0x56000000 ps database
+>1 string >\0 version %s
+>4 string >\0 from kernel %s
+
+#------------------------------------------------------------------------------
+# $File: pulsar,v 1.5 2009/09/19 16:28:12 christos Exp $
+# pulsar: file(1) magic for Pulsar POP3 daemon binary files
+#
+# http://pulsar.sourceforge.net
+# mailto:rok.papez at lugos.si
+#
+
+0 belong 0x1ee7f11e Pulsar POP3 daemon mailbox cache file.
+>4 ubelong x Version: %d.
+>8 ubelong x \b%d
+
+
+#------------------------------------------------------------------------------
+# $File: pyramid,v 1.7 2009/09/19 16:28:12 christos Exp $
+# pyramid: file(1) magic for Pyramids
+#
+# XXX - byte order?
+#
+0 long 0x50900107 Pyramid 90x family executable
+0 long 0x50900108 Pyramid 90x family pure executable
+>16 long >0 not stripped
+0 long 0x5090010b Pyramid 90x family demand paged pure executable
+>16 long >0 not stripped
+
+#------------------------------------------------------------------------------
+# $File: python,v 1.12 2009/10/27 14:49:57 christos Exp $
+# python: file(1) magic for python
+#
+# From: David Necas <yeti at physics.muni.cz>
+# often the module starts with a multiline string
+0 string/t """ a python script text executable
+# MAGIC as specified in Python/import.c (1.5 to 2.6a1 and 3.1a0, assuming
+# that Py_UnicodeFlag is off for Python 2)
+# 20121 ( YEAR - 1995 ) + MONTH + DAY (little endian followed by "\r\n"
+0 belong 0x994e0d0a python 1.5/1.6 byte-compiled
+0 belong 0x87c60d0a python 2.0 byte-compiled
+0 belong 0x2aeb0d0a python 2.1 byte-compiled
+0 belong 0x2ded0d0a python 2.2 byte-compiled
+0 belong 0x3bf20d0a python 2.3 byte-compiled
+0 belong 0x6df20d0a python 2.4 byte-compiled
+0 belong 0xb3f20d0a python 2.5 byte-compiled
+0 belong 0xd1f20d0a python 2.6 byte-compiled
+0 belong 0x3b0c0d0a python 3.0 byte-compiled
+0 belong 0x4f0c0d0a python 3.1 byte-compiled
+
+0 search/1/w #!\ /usr/bin/python Python script text executable
+!:mime text/x-python
+0 search/1/w #!\ /usr/local/bin/python Python script text executable
+!:mime text/x-python
+0 search/1 #!/usr/bin/env\ python Python script text executable
+!:mime text/x-python
+0 search/1 #!\ /usr/bin/env\ ruby Python script text executable
+!:mime text/x-python
+
+# from module.submodule import func1, func2
+0 regex/ \^from\\s+(\\w|\\.)+\\s+import.*$ Python script text executable
+!:strength - 20
+!:mime text/x-python
+
+# def __init__ (self, ...):
+0 search/4096 def\ __init__
+>&0 search/64 self Python script text executable
+!:mime text/x-python
+
+# comments
+0 search/4096 '''
+>&0 regex .*'''$ Python script text executable
+!:mime text/x-python
+
+0 search/4096 """
+>&0 regex .*"""$ Python script text executable
+!:mime text/x-python
+
+# try:
+# except: or finally:
+# block
+0 search/4096 try:
+>&0 regex \^\\s*except.*: Python script text executable
+!:mime text/x-python
+0 search/4096 try:
+>&0 search/4096 finally: Python script text executable
+!:mime text/x-python
+
+# def name(args, args):
+0 regex \^(\ |\\t)*def\ +[a-zA-Z]+
+>&0 regex \ *\\(([a-zA-Z]|,|\ )*\\):$ Python script text executable
+!:strength - 20
+!:mime text/x-python
+
+#------------------------------------------------------------------------------
+# $File: python,v 1.12 2009/10/27 14:49:57 christos Exp $
+# python: file(1) magic for python
+#
+# From: David Necas <yeti at physics.muni.cz>
+# often the module starts with a multiline string
+0 string/t """ a python script text executable
+# MAGIC as specified in Python/import.c (1.5 to 2.6a1 and 3.1a0, assuming
+# that Py_UnicodeFlag is off for Python 2)
+# 20121 ( YEAR - 1995 ) + MONTH + DAY (little endian followed by "\r\n"
+0 belong 0x994e0d0a python 1.5/1.6 byte-compiled
+0 belong 0x87c60d0a python 2.0 byte-compiled
+0 belong 0x2aeb0d0a python 2.1 byte-compiled
+0 belong 0x2ded0d0a python 2.2 byte-compiled
+0 belong 0x3bf20d0a python 2.3 byte-compiled
+0 belong 0x6df20d0a python 2.4 byte-compiled
+0 belong 0xb3f20d0a python 2.5 byte-compiled
+0 belong 0xd1f20d0a python 2.6 byte-compiled
+0 belong 0x3b0c0d0a python 3.0 byte-compiled
+0 belong 0x4f0c0d0a python 3.1 byte-compiled
+
+0 search/1/w #!\ /usr/bin/python Python script text executable
+!:mime text/x-python
+0 search/1/w #!\ /usr/local/bin/python Python script text executable
+!:mime text/x-python
+0 search/1 #!/usr/bin/env\ python Python script text executable
+!:mime text/x-python
+0 search/1 #!\ /usr/bin/env\ ruby Python script text executable
+!:mime text/x-python
+
+# from module.submodule import func1, func2
+0 regex/ \^from\\s+(\\w|\\.)+\\s+import.*$ Python script text executable
+!:strength - 20
+!:mime text/x-python
+
+# def __init__ (self, ...):
+0 search/4096 def\ __init__
+>&0 search/64 self Python script text executable
+!:mime text/x-python
+
+# comments
+0 search/4096 '''
+>&0 regex .*'''$ Python script text executable
+!:mime text/x-python
+
+0 search/4096 """
+>&0 regex .*"""$ Python script text executable
+!:mime text/x-python
+
+# try:
+# except: or finally:
+# block
+0 search/4096 try:
+>&0 regex \^\\s*except.*: Python script text executable
+!:mime text/x-python
+0 search/4096 try:
+>&0 search/4096 finally: Python script text executable
+!:mime text/x-python
+
+#------------------------------------------------------------------------------
+# $File: revision,v 1.6 2009/09/19 16:28:12 christos Exp $
+# file(1) magic for revision control files
+# From Hendrik Scholz <hendrik at scholz.net>
+0 string /1\ :pserver: cvs password text file
+
+# Conary changesets
+# From: Jonathan Smith <smithj at rpath.com>
+0 belong 0xea3f81bb Conary changeset data
+
+# Type: Git bundles (git-bundle)
+# From: Josh Triplett <josh at freedesktop.org>
+0 string #\ v2\ git\ bundle\n Git bundle
+
+# Type: Mercurial bundles
+# From: Seo Sanghyeon <tinuviel at sparcs.kaist.ac.kr>
+0 string HG10 Mercurial bundle,
+>4 string UN uncompressed
+>4 string BZ bzip2 compressed
+
+#------------------------------------------------------------------------------
+# $File: riff,v 1.18 2009/09/19 16:28:12 christos Exp $
+# riff: file(1) magic for RIFF format
+# See
+#
+# http://www.seanet.com/users/matts/riffmci/riffmci.htm
+#
+# AVI section extended by Patrik R�dman <patrik+file-magic at iki.fi>
+#
+0 string RIFF RIFF (little-endian) data
+# RIFF Palette format
+>8 string PAL \b, palette
+>>16 leshort x \b, version %d
+>>18 leshort x \b, %d entries
+# RIFF Device Independent Bitmap format
+>8 string RDIB \b, device-independent bitmap
+>>16 string BM
+>>>30 leshort 12 \b, OS/2 1.x format
+>>>>34 leshort x \b, %d x
+>>>>36 leshort x %d
+>>>30 leshort 64 \b, OS/2 2.x format
+>>>>34 leshort x \b, %d x
+>>>>36 leshort x %d
+>>>30 leshort 40 \b, Windows 3.x format
+>>>>34 lelong x \b, %d x
+>>>>38 lelong x %d x
+>>>>44 leshort x %d
+# RIFF MIDI format
+>8 string RMID \b, MIDI
+# RIFF Multimedia Movie File format
+>8 string RMMP \b, multimedia movie
+# RIFF wrapper for MP3
+>8 string RMP3 \b, MPEG Layer 3 audio
+# Microsoft WAVE format (*.wav)
+>8 string WAVE \b, WAVE audio
+!:mime audio/x-wav
+>>20 leshort 1 \b, Microsoft PCM
+>>>34 leshort >0 \b, %d bit
+>>20 leshort 2 \b, Microsoft ADPCM
+>>20 leshort 6 \b, ITU G.711 A-law
+>>20 leshort 7 \b, ITU G.711 mu-law
+>>20 leshort 17 \b, IMA ADPCM
+>>20 leshort 20 \b, ITU G.723 ADPCM (Yamaha)
+>>20 leshort 49 \b, GSM 6.10
+>>20 leshort 64 \b, ITU G.721 ADPCM
+>>20 leshort 80 \b, MPEG
+>>20 leshort 85 \b, MPEG Layer 3
+>>22 leshort =1 \b, mono
+>>22 leshort =2 \b, stereo
+>>22 leshort >2 \b, %d channels
+>>24 lelong >0 %d Hz
+# Corel Draw Picture
+>8 string CDRA \b, Corel Draw Picture
+!:mime image/x-coreldraw
+# AVI == Audio Video Interleave
+>8 string AVI\040 \b, AVI
+!:mime video/x-msvideo
+>>12 string LIST
+>>>20 string hdrlavih
+>>>>&36 lelong x \b, %lu x
+>>>>&40 lelong x %lu,
+>>>>&4 lelong >1000000 <1 fps,
+>>>>&4 lelong 1000000 1.00 fps,
+>>>>&4 lelong 500000 2.00 fps,
+>>>>&4 lelong 333333 3.00 fps,
+>>>>&4 lelong 250000 4.00 fps,
+>>>>&4 lelong 200000 5.00 fps,
+>>>>&4 lelong 166667 6.00 fps,
+>>>>&4 lelong 142857 7.00 fps,
+>>>>&4 lelong 125000 8.00 fps,
+>>>>&4 lelong 111111 9.00 fps,
+>>>>&4 lelong 100000 10.00 fps,
+# ]9.9,10.1[
+>>>>&4 lelong <101010
+>>>>>&-4 lelong >99010
+>>>>>>&-4 lelong !100000 ~10 fps,
+>>>>&4 lelong 83333 12.00 fps,
+# ]11.9,12.1[
+>>>>&4 lelong <84034
+>>>>>&-4 lelong >82645
+>>>>>>&-4 lelong !83333 ~12 fps,
+>>>>&4 lelong 66667 15.00 fps,
+# ]14.9,15.1[
+>>>>&4 lelong <67114
+>>>>>&-4 lelong >66225
+>>>>>>&-4 lelong !66667 ~15 fps,
+>>>>&4 lelong 50000 20.00 fps,
+>>>>&4 lelong 41708 23.98 fps,
+>>>>&4 lelong 41667 24.00 fps,
+# ]23.9,24.1[
+>>>>&4 lelong <41841
+>>>>>&-4 lelong >41494
+>>>>>>&-4 lelong !41708
+>>>>>>>&-4 lelong !41667 ~24 fps,
+>>>>&4 lelong 40000 25.00 fps,
+# ]24.9,25.1[
+>>>>&4 lelong <40161
+>>>>>&-4 lelong >39841
+>>>>>>&-4 lelong !40000 ~25 fps,
+>>>>&4 lelong 33367 29.97 fps,
+>>>>&4 lelong 33333 30.00 fps,
+# ]29.9,30.1[
+>>>>&4 lelong <33445
+>>>>>&-4 lelong >33223
+>>>>>>&-4 lelong !33367
+>>>>>>>&-4 lelong !33333 ~30 fps,
+>>>>&4 lelong <32224 >30 fps,
+##>>>>&4 lelong x (%lu)
+##>>>>&20 lelong x %lu frames,
+# Note: The tests below assume that the AVI has 1 or 2 streams,
+# "vids" optionally followed by "auds".
+# (Should cover 99.9% of all AVIs.)
+# assuming avih length = 56
+>>>88 string LIST
+>>>>96 string strlstrh
+>>>>>108 string vids video:
+>>>>>>&0 lelong 0 uncompressed
+# skip past vids strh
+>>>>>>(104.l+108) string strf
+>>>>>>>(104.l+132) lelong 1 RLE 8bpp
+>>>>>>>(104.l+132) string/c cvid Cinepak
+>>>>>>>(104.l+132) string/c i263 Intel I.263
+>>>>>>>(104.l+132) string/c iv32 Indeo 3.2
+>>>>>>>(104.l+132) string/c iv41 Indeo 4.1
+>>>>>>>(104.l+132) string/c iv50 Indeo 5.0
+>>>>>>>(104.l+132) string/c mp42 Microsoft MPEG-4 v2
+>>>>>>>(104.l+132) string/c mp43 Microsoft MPEG-4 v3
+>>>>>>>(104.l+132) string/c fmp4 FFMpeg MPEG-4
+>>>>>>>(104.l+132) string/c mjpg Motion JPEG
+>>>>>>>(104.l+132) string/c div3 DivX 3
+>>>>>>>>112 string/c div3 Low-Motion
+>>>>>>>>112 string/c div4 Fast-Motion
+>>>>>>>(104.l+132) string/c divx DivX 4
+>>>>>>>(104.l+132) string/c dx50 DivX 5
+>>>>>>>(104.l+132) string/c xvid XviD
+>>>>>>>(104.l+132) string/c h264 H.264
+>>>>>>>(104.l+132) string/c wmv3 Windows Media Video 9
+>>>>>>>(104.l+132) string/c h264 X.264 or H.264
+>>>>>>>(104.l+132) lelong 0
+##>>>>>>>(104.l+132) string x (%.4s)
+# skip past first (video) LIST
+>>>>(92.l+96) string LIST
+>>>>>(92.l+104) string strlstrh
+>>>>>>(92.l+116) string auds \b, audio:
+# auds strh length = 56:
+>>>>>>>(92.l+172) string strf
+>>>>>>>>(92.l+180) leshort 0x0001 uncompressed PCM
+>>>>>>>>(92.l+180) leshort 0x0002 ADPCM
+>>>>>>>>(92.l+180) leshort 0x0006 aLaw
+>>>>>>>>(92.l+180) leshort 0x0007 uLaw
+>>>>>>>>(92.l+180) leshort 0x0050 MPEG-1 Layer 1 or 2
+>>>>>>>>(92.l+180) leshort 0x0055 MPEG-1 Layer 3
+>>>>>>>>(92.l+180) leshort 0x2000 Dolby AC3
+>>>>>>>>(92.l+180) leshort 0x0161 DivX
+##>>>>>>>>(92.l+180) leshort x (0x%.4x)
+>>>>>>>>(92.l+182) leshort 1 (mono,
+>>>>>>>>(92.l+182) leshort 2 (stereo,
+>>>>>>>>(92.l+182) leshort >2 (%d channels,
+>>>>>>>>(92.l+184) lelong x %d Hz)
+# auds strh length = 64:
+>>>>>>>(92.l+180) string strf
+>>>>>>>>(92.l+188) leshort 0x0001 uncompressed PCM
+>>>>>>>>(92.l+188) leshort 0x0002 ADPCM
+>>>>>>>>(92.l+188) leshort 0x0055 MPEG-1 Layer 3
+>>>>>>>>(92.l+188) leshort 0x2000 Dolby AC3
+>>>>>>>>(92.l+188) leshort 0x0161 DivX
+##>>>>>>>>(92.l+188) leshort x (0x%.4x)
+>>>>>>>>(92.l+190) leshort 1 (mono,
+>>>>>>>>(92.l+190) leshort 2 (stereo,
+>>>>>>>>(92.l+190) leshort >2 (%d channels,
+>>>>>>>>(92.l+192) lelong x %d Hz)
+# Animated Cursor format
+>8 string ACON \b, animated cursor
+# SoundFont 2 <mpruett at sgi.com>
+>8 string sfbk SoundFont/Bank
+# MPEG-1 wrapped in a RIFF, apparently
+>8 string CDXA \b, wrapped MPEG-1 (CDXA)
+>8 string 4XMV \b, 4X Movie file
+
+#
+# XXX - some of the below may only appear in little-endian form.
+#
+# Also "MV93" appears to be for one form of Macromedia Director
+# files, and "GDMF" appears to be another multimedia format.
+#
+0 string RIFX RIFF (big-endian) data
+# RIFF Palette format
+>8 string PAL \b, palette
+>>16 beshort x \b, version %d
+>>18 beshort x \b, %d entries
+# RIFF Device Independent Bitmap format
+>8 string RDIB \b, device-independent bitmap
+>>16 string BM
+>>>30 beshort 12 \b, OS/2 1.x format
+>>>>34 beshort x \b, %d x
+>>>>36 beshort x %d
+>>>30 beshort 64 \b, OS/2 2.x format
+>>>>34 beshort x \b, %d x
+>>>>36 beshort x %d
+>>>30 beshort 40 \b, Windows 3.x format
+>>>>34 belong x \b, %d x
+>>>>38 belong x %d x
+>>>>44 beshort x %d
+# RIFF MIDI format
+>8 string RMID \b, MIDI
+# RIFF Multimedia Movie File format
+>8 string RMMP \b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8 string WAVE \b, WAVE audio
+>>20 leshort 1 \b, Microsoft PCM
+>>>34 leshort >0 \b, %d bit
+>>22 beshort =1 \b, mono
+>>22 beshort =2 \b, stereo
+>>22 beshort >2 \b, %d channels
+>>24 belong >0 %d Hz
+# Corel Draw Picture
+>8 string CDRA \b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8 string AVI\040 \b, AVI
+# Animated Cursor format
+>8 string ACON \b, animated cursor
+# Notation Interchange File Format (big-endian only)
+>8 string NIFF \b, Notation Interchange File Format
+# SoundFont 2 <mpruett at sgi.com>
+>8 string sfbk SoundFont/Bank
+
+#------------------------------------------------------------------------------
+# $File: rpm,v 1.9 2009/11/06 13:53:52 christos Exp $
+#
+# RPM: file(1) magic for Red Hat Packages Erik Troan (ewt at redhat.com)
+#
+0 belong 0xedabeedb RPM
+!:mime application/x-rpm
+>4 byte x v%d
+>5 byte x \b.%d
+>6 beshort 1 src
+>6 beshort 0 bin
+>>8 beshort 1 i386/x86_64
+>>8 beshort 2 Alpha/Sparc64
+>>8 beshort 3 Sparc
+>>8 beshort 4 MIPS
+>>8 beshort 5 PowerPC
+>>8 beshort 6 68000
+>>8 beshort 7 SGI
+>>8 beshort 8 RS6000
+>>8 beshort 9 IA64
+>>8 beshort 10 Sparc64
+>>8 beshort 11 MIPSel
+>>8 beshort 12 ARM
+>>8 beshort 13 MiNT
+>>8 beshort 14 S/390
+>>8 beshort 15 S/390x
+>>8 beshort 16 PowerPC64
+>>8 beshort 17 SuperH
+>>8 beshort 18 Xtensa
+>>8 beshort 255 noarch
+>>10 string x %s
+
+#delta RPM Daniel Novotny (dnovotny at redhat.com)
+0 string drpm Delta RPM
+!:mime application/x-rpm
+>12 string x %s
+
+>>>8 beshort 11 MIPSel
+>>>8 beshort 12 ARM
+>>>8 beshort 13 MiNT
+>>>8 beshort 14 S/390
+>>>8 beshort 15 S/390x
+>>>8 beshort 16 PowerPC64
+>>>8 beshort 17 SuperH
+>>>8 beshort 18 Xtensa
+>>10 string x %s
+
+#------------------------------------------------------------------------------
+# $File: rpm,v 1.9 2009/11/06 13:53:52 christos Exp $
+#
+# RPM: file(1) magic for Red Hat Packages Erik Troan (ewt at redhat.com)
+#
+0 belong 0xedabeedb RPM
+!:mime application/x-rpm
+>4 byte x v%d
+>5 byte x \b.%d
+>6 beshort 1 src
+>6 beshort 0 bin
+>>8 beshort 1 i386/x86_64
+>>8 beshort 2 Alpha/Sparc64
+>>8 beshort 3 Sparc
+>>8 beshort 4 MIPS
+>>8 beshort 5 PowerPC
+>>8 beshort 6 68000
+>>8 beshort 7 SGI
+>>8 beshort 8 RS6000
+>>8 beshort 9 IA64
+>>8 beshort 10 Sparc64
+>>8 beshort 11 MIPSel
+>>8 beshort 12 ARM
+>>8 beshort 13 MiNT
+>>8 beshort 14 S/390
+>>8 beshort 15 S/390x
+>>8 beshort 16 PowerPC64
+>>8 beshort 17 SuperH
+>>8 beshort 18 Xtensa
+>>8 beshort 255 noarch
+
+#delta RPM Daniel Novotny (dnovotny at redhat.com)
+0 string drpm Delta RPM
+!:mime application/x-rpm
+>12 string x %s
+
+>>>8 beshort 11 MIPSel
+>>>8 beshort 12 ARM
+>>>8 beshort 13 MiNT
+>>>8 beshort 14 S/390
+>>>8 beshort 15 S/390x
+>>>8 beshort 16 PowerPC64
+>>>8 beshort 17 SuperH
+>>>8 beshort 18 Xtensa
+>>10 string x %s
+
+#------------------------------------------------------------------------------
+# $File: rtf,v 1.7 2009/09/19 16:28:12 christos Exp $
+# rtf: file(1) magic for Rich Text Format (RTF)
+#
+# Duncan P. Simpson, D.P.Simpson at dcs.warwick.ac.uk
+#
+0 string {\\rtf Rich Text Format data,
+!:mime text/rtf
+>5 string 1 version 1,
+>>6 string \\ansi ANSI
+>>6 string \\mac Apple Macintosh
+>>6 string \\pc IBM PC, code page 437
+>>6 string \\pca IBM PS/2, code page 850
+>>6 default x unknown character set
+>5 default x unknown version
+
+#------------------------------------------------------------------------------
+# $File: ruby,v 1.3 2009/09/19 16:28:12 christos Exp $
+# ruby: file(1) magic for Ruby scripting language
+# URL: http://www.ruby-lang.org/
+# From: Reuben Thomas <rrt at sc3d.org>
+
+# Ruby scripts
+0 search/1/w #!\ /usr/bin/ruby Ruby script text executable
+!:mime text/x-ruby
+0 search/1/w #!\ /usr/local/bin/ruby Ruby script text executable
+!:mime text/x-ruby
+0 search/1 #!/usr/bin/env\ ruby Ruby script text executable
+!:mime text/x-ruby
+0 search/1 #!\ /usr/bin/env\ ruby Ruby script text executable
+!:mime text/x-ruby
+
+# What looks like ruby, but does not have a shebang
+# (modules and such)
+# From: Lubomir Rintel <lkundrak at v3.sk>
+0 regex \^[\ \t]*require[\ \t]'[A-Za-z_\/]+'
+>0 regex include\ [A-Z]|def\ [a-z]|\ do$
+>>0 regex \^[\ \t]*end([\ \t]*[;#].*)?$ Ruby script text
+!:mime text/x-ruby
+0 regex \^[\ \t]*(class|module)[\ \t][A-Z]
+>0 regex (modul|includ)e\ [A-Z]|def\ [a-z]
+>>0 regex \^[\ \t]*end([\ \t]*[;#].*)?$ Ruby module source text
+!:mime text/x-ruby
+
+#------------------------------------------------------------------------------
+# $File: sc,v 1.6 2009/09/19 16:28:12 christos Exp $
+# sc: file(1) magic for "sc" spreadsheet
+#
+38 string Spreadsheet sc spreadsheet file
+!:mime application/x-sc
+
+#------------------------------------------------------------------------------
+# $File: sccs,v 1.6 2009/09/19 16:28:12 christos Exp $
+# sccs: file(1) magic for SCCS archives
+#
+# SCCS archive structure:
+# \001h01207
+# \001s 00276/00000/00000
+# \001d D 1.1 87/09/23 08:09:20 ian 1 0
+# \001c date and time created 87/09/23 08:09:20 by ian
+# \001e
+# \001u
+# \001U
+# ... etc.
+# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
+# *Sigh*. And these both came from various parts of the USG.
+# Maybe we should just switch everybody from SCCS to RCS!
+# Further, you can't just say '\001h0', because the five-digit number
+# is a checksum that could (presumably) have any leading digit,
+# and we don't have regular expression matching yet.
+# Hence the following official kludge:
+8 string \001s\ SCCS archive data
+
+#------------------------------------------------------------------------------
+# $File: scientific,v 1.6 2009/09/19 16:28:12 christos Exp $
+# scientific: file(1) magic for scientific formats
+#
+# From: Joe Krahn <krahn at niehs.nih.gov>
+
+########################################################
+# CCP4 data and plot files:
+0 string MTZ\040 MTZ reflection file
+
+92 string PLOT%%84 Plot84 plotting file
+>52 byte 1 , Little-endian
+>55 byte 1 , Big-endian
+
+########################################################
+# Electron density MAP/MASK formats
+
+0 string EZD_MAP NEWEZD Electron Density Map
+109 string MAP\040( Old EZD Electron Density Map
+
+0 string/c :-)\040Origin BRIX Electron Density Map
+>170 string >0 , Sigma:%.12s
+#>4 string >0 %.178s
+#>4 addr x %.178s
+
+7 string 18\040!NTITLE XPLOR ASCII Electron Density Map
+9 string \040!NTITLE\012\040REMARK CNS ASCII electron density map
+
+208 string MAP\040 CCP4 Electron Density Map
+# Assumes same stamp for float and double (normal case)
+>212 byte 17 \b, Big-endian
+>212 byte 34 \b, VAX format
+>212 byte 68 \b, Little-endian
+>212 byte 85 \b, Convex native
+
+############################################################
+# X-Ray Area Detector images
+0 string R-AXIS4\ \ \ R-Axis Area Detector Image:
+>796 lelong <20 Little-endian, IP #%d,
+>>768 lelong >0 Size=%dx
+>>772 lelong >0 \b%d
+>796 belong <20 Big-endian, IP #%d,
+>>768 belong >0 Size=%dx
+>>772 belong >0 \b%d
+
+0 string RAXIS\ \ \ \ \ R-Axis Area Detector Image, Win32:
+>796 lelong <20 Little-endian, IP #%d,
+>>768 lelong >0 Size=%dx
+>>772 lelong >0 \b%d
+>796 belong <20 Big-endian, IP #%d,
+>>768 belong >0 Size=%dx
+>>772 belong >0 \b%d
+
+
+1028 string MMX\000\000\000\000\000\000\000\000\000\000\000\000\000 MAR Area Detector Image,
+>1072 ulong >1 Compressed(%d),
+>1100 ulong >1 %d headers,
+>1104 ulong >0 %d x
+>1108 ulong >0 %d,
+>1120 ulong >0 %d bits/pixel
+
+# Type: GEDCOM genealogical (family history) data
+# From: Giuseppe Bilotta
+0 search/1/c 0\ HEAD GEDCOM genealogy text
+>&0 search 1\ GEDC
+>>&0 search 2\ VERS version
+>>>&1 search/1 >\0 %s
+# From: Phil Endecott <phil05 at chezphil.org>
+0 string \000\060\000\040\000\110\000\105\000\101\000\104 GEDCOM data
+0 string \060\000\040\000\110\000\105\000\101\000\104\000 GEDCOM data
+0 string \376\377\000\060\000\040\000\110\000\105\000\101\000\104 GEDCOM data
+0 string \377\376\060\000\040\000\110\000\105\000\101\000\104\000 GEDCOM data
+
+#------------------------------------------------------------------------------
+# $File: securitycerts,v 1.4 2009/09/19 16:28:12 christos Exp $
+0 search/1 -----BEGIN\ CERTIFICATE------ RFC1421 Security Certificate text
+0 search/1 -----BEGIN\ NEW\ CERTIFICATE RFC1421 Security Certificate Signing Request text
+0 belong 0xedfeedfe Sun 'jks' Java Keystore File data
+
+0 string \0volume_key volume_key escrow packet
+
+#------------------------------------------------------------------------------
+# $File: sendmail,v 1.7 2009/09/19 16:28:12 christos Exp $
+# sendmail: file(1) magic for sendmail config files
+#
+# XXX - byte order?
+#
+0 byte 046 Sendmail frozen configuration
+>16 string >\0 - version %s
+0 short 0x271c Sendmail frozen configuration
+>16 string >\0 - version %s
+
+#------------------------------------------------------------------------------
+# sendmail: file(1) magic for sendmail m4(1) files
+#
+# From Hendrik Scholz <hendrik at scholz.net>
+# i.e. files in /usr/share/sendmail/cf/
+#
+0 string divert(-1)\n sendmail m4 text file
+
+
+#------------------------------------------------------------------------------
+# $File: sequent,v 1.8 2009/09/19 16:28:12 christos Exp $
+# sequent: file(1) magic for Sequent machines
+#
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
+# For Sequent's multiprocessor systems (incomplete).
+0 lelong 0x00ea BALANCE NS32000 .o
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 lelong 0x10ea BALANCE NS32000 executable (0 @ 0)
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 lelong 0x20ea BALANCE NS32000 executable (invalid @ 0)
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 lelong 0x30ea BALANCE NS32000 standalone executable
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+#
+# Symmetry information added by Jason Merrill <jason at jarthur.claremont.edu>.
+# Symmetry magic nums will not be reached if DOS COM comes before them;
+# byte 0xeb is matched before these get a chance.
+0 leshort 0x12eb SYMMETRY i386 .o
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 leshort 0x22eb SYMMETRY i386 executable (0 @ 0)
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 leshort 0x32eb SYMMETRY i386 executable (invalid @ 0)
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+0 leshort 0x42eb SYMMETRY i386 standalone executable
+>16 lelong >0 not stripped
+>124 lelong >0 version %ld
+
+#------------------------------------------------------------------------------
+# $File: sgi,v 1.17 2009/09/19 16:28:12 christos Exp $
+# sgi: file(1) magic for Silicon Graphics applications
+
+#
+#
+# Performance Co-Pilot file types
+0 string PmNs PCP compiled namespace (V.0)
+0 string PmN PCP compiled namespace
+>3 string >\0 (V.%1.1s)
+#3 lelong 0x84500526 PCP archive
+3 belong 0x84500526 PCP archive
+>7 byte x (V.%d)
+#>20 lelong -2 temporal index
+#>20 lelong -1 metadata
+#>20 lelong 0 log volume #0
+#>20 lelong >0 log volume #%ld
+>20 belong -2 temporal index
+>20 belong -1 metadata
+>20 belong 0 log volume #0
+>20 belong >0 log volume #%ld
+>24 string >\0 host: %s
+0 string PCPFolio PCP
+>9 string Version: Archive Folio
+>18 string >\0 (V.%s)
+0 string #pmchart PCP pmchart view
+>9 string Version
+>17 string >\0 (V%-3.3s)
+0 string #kmchart PCP kmchart view
+>9 string Version
+>17 string >\0 (V.%s)
+0 string pmview PCP pmview config
+>7 string Version
+>15 string >\0 (V%-3.3s)
+0 string #pmlogger PCP pmlogger config
+>10 string Version
+>18 string >\0 (V%1.1s)
+0 string #pmdahotproc PCP pmdahotproc config
+>13 string Version
+>21 string >\0 (V%-3.3s)
+0 string PcPh PCP Help
+>4 string 1 Index
+>4 string 2 Text
+>5 string >\0 (V.%1.1s)
+0 string #pmieconf-rules PCP pmieconf rules
+>16 string >\0 (V.%1.1s)
+3 string pmieconf-pmie PCP pmie config
+>17 string >\0 (V.%1.1s)
+
+# SpeedShop data files
+0 lelong 0x13130303 SpeedShop data file
+
+# mdbm files
+0 lelong 0x01023962 mdbm file, version 0 (obsolete)
+0 string mdbm mdbm file,
+>5 byte x version %d,
+>6 byte x 2^%d pages,
+>7 byte x pagesize 2^%d,
+>17 byte x hash %d,
+>11 byte x dataformat %d
+
+# Alias Maya files
+0 string //Maya ASCII Alias Maya Ascii File,
+>13 string >\0 version %s
+8 string MAYAFOR4 Alias Maya Binary File,
+>32 string >\0 version %s scene
+8 string MayaFOR4 Alias Maya Binary File,
+>32 string >\0 version %s scene
+8 string CIMG Alias Maya Image File
+8 string DEEP Alias Maya Image File
+#------------------------------------------------------------------------------
+# $File: sgml,v 1.24 2009/09/19 17:31:35 christos Exp $
+# Type: SVG Vectorial Graphics
+# From: Noel Torres <tecnico at ejerciciosresueltos.com>
+0 string \<?xml\ version="
+>15 string >\0
+>>19 search/4096 \<svg SVG Scalable Vector Graphics image
+!:mime image/svg+xml
+>>19 search/4096 \<gnc-v2 GnuCash file
+!:mime application/x-gnucash
+
+# Sitemap file
+0 string \<?xml\ version="
+>15 string >\0
+>>19 search/4096 \<urlset XML Sitemap document text
+!:mime application/xml-sitemap
+
+# xhtml
+0 string \<?xml\ version="
+>15 string >\0
+>>19 search/4096/cWbt \<!doctype\ html xHTML document text
+!:mime text/html
+0 string \<?xml\ version='
+>15 string >\0
+>>19 search/4096/cWbt \<!doctype\ html xHTML document text
+!:mime text/html
+0 string \<?xml\ version="
+>15 string >\0
+>>19 search/4096/cWbt \<html broken xHTML document text
+!:mime text/html
+
+#------------------------------------------------------------------------------
+# sgml: file(1) magic for Standard Generalized Markup Language
+# HyperText Markup Language (HTML) is an SGML document type,
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# adapted to string extenstions by Anthon van der Neut <anthon at mnt.org)
+0 search/1/cb \<!doctype\ html HTML document text
+!:mime text/html
+0 search/1/cb \<head HTML document text
+!:mime text/html
+0 search/1/cb \<title HTML document text
+!:mime text/html
+0 search/1/cb \<html HTML document text
+!:mime text/html
+
+# Extensible markup language (XML), a subset of SGML
+# from Marc Prud'hommeaux (marc at apocalypse.org)
+0 search/1/cwbt \<?xml XML document text
+!:mime application/xml
+0 string \<?xml\ version\ " XML
+!:mime application/xml
+0 string \<?xml\ version=" XML
+!:mime application/xml
+>15 search/1 >\0 %.3s document text
+>>23 search/1 \<xsl:stylesheet (XSL stylesheet)
+>>24 search/1 \<xsl:stylesheet (XSL stylesheet)
+0 string \<?xml\ version=' XML
+!:mime application/xml
+>15 search/1 >\0 %.3s document text
+>>23 search/1 \<xsl:stylesheet (XSL stylesheet)
+>>24 search/1 \<xsl:stylesheet (XSL stylesheet)
+0 search/1/wbt \<?xml XML document text
+!:mime application/xml
+!:strength - 10
+0 search/1/wbt \<?XML broken XML document text
+!:mime application/xml
+!:strength - 10
+
+
+# SGML, mostly from rph at sq
+0 search/1/cb \<!doctype exported SGML document text
+0 search/1/cb \<!subdoc exported SGML subdocument text
+0 search/1/cb \<!-- exported SGML document text
+
+# Web browser cookie files
+# (Mozilla, Galeon, Netscape 4, Konqueror..)
+# Ulf Harnhammar <ulfh at update.uu.se>
+0 search/1 #\ HTTP\ Cookie\ File Web browser cookie text
+0 search/1 #\ Netscape\ HTTP\ Cookie\ File Netscape cookie text
+0 search/1 #\ KDE\ Cookie\ File Konqueror cookie text
+
+#------------------------------------------------------------------------
+# $File: sharc,v 1.6 2009/09/19 16:28:12 christos Exp $
+# file(1) magic for sharc files
+#
+# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by
+# FutureGroove Music (dsp at futuregroove.de)
+
+#------------------------------------------------------------------------
+#0 string Draw RiscOS Drawfile
+#0 string PACK RiscOS PackdDir archive
+
+#------------------------------------------------------------------------
+# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
+
+#0 string =! Assembler source
+#0 string Analog ADi asm listing file
+0 string .SYSTEM SHARC architecture file
+0 string .system SHARC architecture file
+
+0 leshort 0x521C SHARC COFF binary
+>2 leshort >1 , %hd sections
+>>12 lelong >0 , not stripped
+
+#------------------------------------------------------------------------------
+# $File: sinclair,v 1.5 2009/09/19 16:28:12 christos Exp $
+# sinclair: file(1) sinclair QL
+
+# additions to /etc/magic by Thomas M. Ott (ThMO)
+
+# Sinclair QL floppy disk formats (ThMO)
+0 string =QL5 QL disk dump data,
+>3 string =A 720 KB,
+>3 string =B 1.44 MB,
+>3 string =C 3.2 MB,
+>4 string >\0 label:%.10s
+
+# Sinclair QL OS dump (ThMO)
+# (NOTE: if `file' would be able to use indirect references in a endian format
+# differing from the natural host format, this could be written more
+# reliably and faster...)
+#
+# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more
+# than the first 8K of a file... #-(
+#
+#0 belong =0x30000
+#>49124 belong <47104
+#>>49128 belong <47104
+#>>>49132 belong <47104
+#>>>>49136 belong <47104 QL OS dump data,
+#>>>>>49148 string >\0 type %.3s,
+#>>>>>49142 string >\0 version %.4s
+
+# Sinclair QL firmware executables (ThMO)
+0 string NqNqNq`\004 QL firmware executable (BCPL)
+
+# Sinclair QL libraries (was ThMO)
+0 beshort 0xFB01 QDOS object
+>2 pstring x '%s'
+
+# Sinclair QL executables (was ThMO)
+4 belong 0x4AFB QDOS executable
+>9 pstring x '%s'
+
+# Sinclair QL ROM (ThMO)
+0 belong =0x4AFB0001 QL plugin-ROM data,
+>9 pstring =\0 un-named
+>9 pstring >\0 named: %s
+
+#------------------------------------------------------------------------------
+# $File: sketch,v 1.4 2009/09/19 16:28:12 christos Exp $
+# Sketch Drawings: http://sketch.sourceforge.net/
+# From: Edwin Mons <e at ik.nu>
+0 search/1 ##Sketch Sketch document text
+
+#-----------------------------------------------
+# $File: smalltalk,v 1.5 2009/09/19 16:28:12 christos Exp $
+# GNU Smalltalk image, starting at version 1.6.2
+# From: catull_us at yahoo.com
+#
+0 string GSTIm\0\0 GNU SmallTalk
+# little-endian
+>7 byte&1 =0 LE image version
+>>10 byte x %d.
+>>9 byte x \b%d.
+>>8 byte x \b%d
+#>>12 lelong x , data: %ld
+#>>16 lelong x , table: %ld
+#>>20 lelong x , memory: %ld
+# big-endian
+>7 byte&1 =1 BE image version
+>>8 byte x %d.
+>>9 byte x \b%d.
+>>10 byte x \b%d
+#>>12 belong x , data: %ld
+#>>16 belong x , table: %ld
+#>>20 belong x , memory: %ld
+
+
+
+#------------------------------------------------------------------------------
+# $File: sniffer,v 1.14 2009/09/19 16:28:12 christos Exp $
+# sniffer: file(1) magic for packet capture files
+#
+# From: guy at alum.mit.edu (Guy Harris)
+#
+
+#
+# Microsoft Network Monitor 1.x capture files.
+#
+0 string RTSS NetMon capture file
+>5 byte x - version %d
+>4 byte x \b.%d
+>6 leshort 0 (Unknown)
+>6 leshort 1 (Ethernet)
+>6 leshort 2 (Token Ring)
+>6 leshort 3 (FDDI)
+>6 leshort 4 (ATM)
+
+#
+# Microsoft Network Monitor 2.x capture files.
+#
+0 string GMBU NetMon capture file
+>5 byte x - version %d
+>4 byte x \b.%d
+>6 leshort 0 (Unknown)
+>6 leshort 1 (Ethernet)
+>6 leshort 2 (Token Ring)
+>6 leshort 3 (FDDI)
+>6 leshort 4 (ATM)
+
+#
+# Network General Sniffer capture files.
+# Sorry, make that "Network Associates Sniffer capture files."
+# Sorry, make that "Network General old DOS Sniffer capture files."
+#
+0 string TRSNIFF\ data\ \ \ \ \032 Sniffer capture file
+>33 byte 2 (compressed)
+>23 leshort x - version %d
+>25 leshort x \b.%d
+>32 byte 0 (Token Ring)
+>32 byte 1 (Ethernet)
+>32 byte 2 (ARCNET)
+>32 byte 3 (StarLAN)
+>32 byte 4 (PC Network broadband)
+>32 byte 5 (LocalTalk)
+>32 byte 6 (Znet)
+>32 byte 7 (Internetwork Analyzer)
+>32 byte 9 (FDDI)
+>32 byte 10 (ATM)
+
+#
+# Cinco Networks NetXRay capture files.
+# Sorry, make that "Network General Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic, and Windows
+# Sniffer Pro", capture files."
+# Sorry, make that "Network General Sniffer capture files."
+#
+0 string XCP\0 NetXRay capture file
+>4 string >\0 - version %s
+>44 leshort 0 (Ethernet)
+>44 leshort 1 (Token Ring)
+>44 leshort 2 (FDDI)
+>44 leshort 3 (WAN)
+>44 leshort 8 (ATM)
+>44 leshort 9 (802.11)
+
+#
+# "libpcap" capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0 ubelong 0xa1b2c3d4 tcpdump capture file (big-endian)
+>4 beshort x - version %d
+>6 beshort x \b.%d
+>20 belong 0 (No link-layer encapsulation
+>20 belong 1 (Ethernet
+>20 belong 2 (3Mb Ethernet
+>20 belong 3 (AX.25
+>20 belong 4 (ProNET
+>20 belong 5 (CHAOS
+>20 belong 6 (Token Ring
+>20 belong 7 (BSD ARCNET
+>20 belong 8 (SLIP
+>20 belong 9 (PPP
+>20 belong 10 (FDDI
+>20 belong 11 (RFC 1483 ATM
+>20 belong 12 (raw IP
+>20 belong 13 (BSD/OS SLIP
+>20 belong 14 (BSD/OS PPP
+>20 belong 19 (Linux ATM Classical IP
+>20 belong 50 (PPP or Cisco HDLC
+>20 belong 51 (PPP-over-Ethernet
+>20 belong 99 (Symantec Enterprise Firewall
+>20 belong 100 (RFC 1483 ATM
+>20 belong 101 (raw IP
+>20 belong 102 (BSD/OS SLIP
+>20 belong 103 (BSD/OS PPP
+>20 belong 104 (BSD/OS Cisco HDLC
+>20 belong 105 (802.11
+>20 belong 106 (Linux Classical IP over ATM
+>20 belong 107 (Frame Relay
+>20 belong 108 (OpenBSD loopback
+>20 belong 109 (OpenBSD IPsec encrypted
+>20 belong 112 (Cisco HDLC
+>20 belong 113 (Linux "cooked"
+>20 belong 114 (LocalTalk
+>20 belong 117 (OpenBSD PFLOG
+>20 belong 119 (802.11 with Prism header
+>20 belong 122 (RFC 2625 IP over Fibre Channel
+>20 belong 123 (SunATM
+>20 belong 127 (802.11 with radiotap header
+>20 belong 129 (Linux ARCNET
+>20 belong 138 (Apple IP over IEEE 1394
+>20 belong 140 (MTP2
+>20 belong 141 (MTP3
+>20 belong 143 (DOCSIS
+>20 belong 144 (IrDA
+>20 belong 147 (Private use 0
+>20 belong 148 (Private use 1
+>20 belong 149 (Private use 2
+>20 belong 150 (Private use 3
+>20 belong 151 (Private use 4
+>20 belong 152 (Private use 5
+>20 belong 153 (Private use 6
+>20 belong 154 (Private use 7
+>20 belong 155 (Private use 8
+>20 belong 156 (Private use 9
+>20 belong 157 (Private use 10
+>20 belong 158 (Private use 11
+>20 belong 159 (Private use 12
+>20 belong 160 (Private use 13
+>20 belong 161 (Private use 14
+>20 belong 162 (Private use 15
+>20 belong 163 (802.11 with AVS header
+>16 belong x \b, capture length %d)
+0 ulelong 0xa1b2c3d4 tcpdump capture file (little-endian)
+>4 leshort x - version %d
+>6 leshort x \b.%d
+>20 lelong 0 (No link-layer encapsulation
+>20 lelong 1 (Ethernet
+>20 lelong 2 (3Mb Ethernet
+>20 lelong 3 (AX.25
+>20 lelong 4 (ProNET
+>20 lelong 5 (CHAOS
+>20 lelong 6 (Token Ring
+>20 lelong 7 (ARCNET
+>20 lelong 8 (SLIP
+>20 lelong 9 (PPP
+>20 lelong 10 (FDDI
+>20 lelong 11 (RFC 1483 ATM
+>20 lelong 12 (raw IP
+>20 lelong 13 (BSD/OS SLIP
+>20 lelong 14 (BSD/OS PPP
+>20 lelong 19 (Linux ATM Classical IP
+>20 lelong 50 (PPP or Cisco HDLC
+>20 lelong 51 (PPP-over-Ethernet
+>20 lelong 99 (Symantec Enterprise Firewall
+>20 lelong 100 (RFC 1483 ATM
+>20 lelong 101 (raw IP
+>20 lelong 102 (BSD/OS SLIP
+>20 lelong 103 (BSD/OS PPP
+>20 lelong 104 (BSD/OS Cisco HDLC
+>20 lelong 105 (802.11
+>20 lelong 106 (Linux Classical IP over ATM
+>20 lelong 107 (Frame Relay
+>20 lelong 108 (OpenBSD loopback
+>20 lelong 109 (OpenBSD IPsec encrypted
+>20 lelong 112 (Cisco HDLC
+>20 lelong 113 (Linux "cooked"
+>20 lelong 114 (LocalTalk
+>20 lelong 117 (OpenBSD PFLOG
+>20 lelong 119 (802.11 with Prism header
+>20 lelong 122 (RFC 2625 IP over Fibre Channel
+>20 lelong 123 (SunATM
+>20 lelong 127 (802.11 with radiotap header
+>20 lelong 129 (Linux ARCNET
+>20 lelong 138 (Apple IP over IEEE 1394
+>20 lelong 140 (MTP2
+>20 lelong 141 (MTP3
+>20 lelong 143 (DOCSIS
+>20 lelong 144 (IrDA
+>20 lelong 147 (Private use 0
+>20 lelong 148 (Private use 1
+>20 lelong 149 (Private use 2
+>20 lelong 150 (Private use 3
+>20 lelong 151 (Private use 4
+>20 lelong 152 (Private use 5
+>20 lelong 153 (Private use 6
+>20 lelong 154 (Private use 7
+>20 lelong 155 (Private use 8
+>20 lelong 156 (Private use 9
+>20 lelong 157 (Private use 10
+>20 lelong 158 (Private use 11
+>20 lelong 159 (Private use 12
+>20 lelong 160 (Private use 13
+>20 lelong 161 (Private use 14
+>20 lelong 162 (Private use 15
+>20 lelong 163 (802.11 with AVS header
+>16 lelong x \b, capture length %d)
+
+#
+# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0 ubelong 0xa1b2cd34 extended tcpdump capture file (big-endian)
+>4 beshort x - version %d
+>6 beshort x \b.%d
+>20 belong 0 (No link-layer encapsulation
+>20 belong 1 (Ethernet
+>20 belong 2 (3Mb Ethernet
+>20 belong 3 (AX.25
+>20 belong 4 (ProNET
+>20 belong 5 (CHAOS
+>20 belong 6 (Token Ring
+>20 belong 7 (ARCNET
+>20 belong 8 (SLIP
+>20 belong 9 (PPP
+>20 belong 10 (FDDI
+>20 belong 11 (RFC 1483 ATM
+>20 belong 12 (raw IP
+>20 belong 13 (BSD/OS SLIP
+>20 belong 14 (BSD/OS PPP
+>16 belong x \b, capture length %d)
+0 ulelong 0xa1b2cd34 extended tcpdump capture file (little-endian)
+>4 leshort x - version %d
+>6 leshort x \b.%d
+>20 lelong 0 (No link-layer encapsulation
+>20 lelong 1 (Ethernet
+>20 lelong 2 (3Mb Ethernet
+>20 lelong 3 (AX.25
+>20 lelong 4 (ProNET
+>20 lelong 5 (CHAOS
+>20 lelong 6 (Token Ring
+>20 lelong 7 (ARCNET
+>20 lelong 8 (SLIP
+>20 lelong 9 (PPP
+>20 lelong 10 (FDDI
+>20 lelong 11 (RFC 1483 ATM
+>20 lelong 12 (raw IP
+>20 lelong 13 (BSD/OS SLIP
+>20 lelong 14 (BSD/OS PPP
+>16 lelong x \b, capture length %d)
+
+#
+# AIX "iptrace" capture files.
+#
+0 string iptrace\ 1.0 "iptrace" capture file
+0 string iptrace\ 2.0 "iptrace" capture file
+
+#
+# Novell LANalyzer capture files.
+#
+0 leshort 0x1001 LANalyzer capture file
+0 leshort 0x1007 LANalyzer capture file
+
+#
+# HP-UX "nettl" capture files.
+#
+0 string \x54\x52\x00\x64\x00 "nettl" capture file
+
+#
+# RADCOM WAN/LAN Analyzer capture files.
+#
+0 string \x42\xd2\x00\x34\x12\x66\x22\x88 RADCOM WAN/LAN Analyzer capture file
+
+#
+# NetStumbler log files. Not really packets, per se, but about as
+# close as you can get. These are log files from NetStumbler, a
+# Windows program, that scans for 802.11b networks.
+#
+0 string NetS NetStumbler log file
+>8 lelong x \b, %d stations found
+
+#
+# EtherPeek/AiroPeek "version 9" capture files.
+#
+0 string \177ver EtherPeek/AiroPeek capture file
+
+#
+# Visual Networks traffic capture files.
+#
+0 string \x05VNF Visual Networks traffic capture file
+
+#
+# Network Instruments Observer capture files.
+#
+0 string ObserverPktBuffe Network Instruments Observer capture file
+
+#
+# Files from Accellent Group's 5View products.
+#
+0 string \xaa\xaa\xaa\xaa 5View capture file
+
+#------------------------------------------------------------------------------
+# $File: softquad,v 1.13 2009/09/19 16:28:12 christos Exp $
+# softquad: file(1) magic for SoftQuad Publishing Software
+#
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0 string \<!SQ\ DTD> Compiled SGML rules file
+>9 string >\0 Type %s
+0 string \<!SQ\ A/E> A/E SGML Document binary
+>9 string >\0 Type %s
+0 string \<!SQ\ STS> A/E SGML binary styles file
+>9 string >\0 Type %s
+0 short 0xc0de Compiled PSI (v1) data
+0 short 0xc0da Compiled PSI (v2) data
+>3 string >\0 (%s)
+# Binary sqtroff font/desc files...
+0 short 0125252 SoftQuad DESC or font file binary
+>2 short >0 - version %d
+# Bitmaps...
+0 search/1 SQ\ BITMAP1 SoftQuad Raster Format text
+#0 string SQ\ BITMAP2 SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0 string X\ SoftQuad troff Context intermediate
+>2 string 495 for AT&T 495 laser printer
+>2 string hp for Hewlett-Packard LaserJet
+>2 string impr for IMAGEN imPRESS
+>2 string ps for PostScript
+
+# From: Michael Piefel <piefel at debian.org>
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0 string X\ 495 SoftQuad troff Context intermediate for AT&T 495 laser printer
+0 string X\ hp SoftQuad troff Context intermediate for HP LaserJet
+0 string X\ impr SoftQuad troff Context intermediate for IMAGEN imPRESS
+0 string X\ ps SoftQuad troff Context intermediate for PostScript
+
+#------------------------------------------------------------------------------
+# $File: spec,v 1.4 2009/09/19 16:28:12 christos Exp $
+# spec: file(1) magic for SPEC raw results (*.raw, *.rsf)
+#
+# Cloyce D. Spradling <cloyce at headgear.org>
+
+0 string spec SPEC
+>4 string .cpu CPU
+>>8 string <: \b%.4s
+>>12 string . raw result text
+
+17 string version=SPECjbb SPECjbb
+>32 string <: \b%.4s
+>>37 string <: v%.4s raw result text
+
+0 string BEGIN\040SPECWEB SPECweb
+>13 string <: \b%.2s
+>>15 string _SSL \b_SSL
+>>>20 string <: v%.4s raw result text
+>>16 string <: v%.4s raw result text
+
+#------------------------------------------------------------------------------
+# $File: spectrum,v 1.6 2009/09/19 16:28:12 christos Exp $
+# spectrum: file(1) magic for Spectrum emulator files.
+#
+# John Elliott <jce at seasip.demon.co.uk>
+
+#
+# Spectrum +3DOS header
+#
+0 string PLUS3DOS\032 Spectrum +3 data
+>15 byte 0 - BASIC program
+>15 byte 1 - number array
+>15 byte 2 - character array
+>15 byte 3 - memory block
+>>16 belong 0x001B0040 (screen)
+>15 byte 4 - Tasword document
+>15 string TAPEFILE - ZXT tapefile
+#
+# Tape file. This assumes the .TAP starts with a Spectrum-format header,
+# which nearly all will.
+#
+0 string \023\000\000 Spectrum .TAP data
+>4 string x "%-10.10s"
+>3 byte 0 - BASIC program
+>3 byte 1 - number array
+>3 byte 2 - character array
+>3 byte 3 - memory block
+>>14 belong 0x001B0040 (screen)
+
+# The following three blocks are from pak21-spectrum at srcf.ucam.org
+# TZX tape images
+0 string ZXTape!\x1a Spectrum .TZX data
+>8 byte x version %d
+>9 byte x \b.%d
+
+# RZX input recording files
+0 string RZX! Spectrum .RZX data
+>4 byte x version %d
+>5 byte x \b.%d
+
+# Floppy disk images
+0 string MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
+0 string MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
+0 string EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
+0 string SINCLAIR Spectrum .SCL Betadisk image
+
+# Hard disk images
+0 string RS-IDE\x1a Spectrum .HDF hard disk image
+>7 byte x \b, version 0x%02x
+
+#------------------------------------------------------------------------------
+# $File: sql,v 1.6 2009/09/19 16:28:12 christos Exp $
+# sql: file(1) magic for SQL files
+#
+# From: "Marty Leisner" <mleisner at eng.mc.xerox.com>
+# Recognize some MySQL files.
+#
+0 beshort 0xfe01 MySQL table definition file
+>2 byte x Version %d
+0 belong&0xffffff00 0xfefe0300 MySQL MISAM index file
+>3 byte x Version %d
+0 belong&0xffffff00 0xfefe0700 MySQL MISAM compressed data file
+>3 byte x Version %d
+0 belong&0xffffff00 0xfefe0500 MySQL ISAM index file
+>3 byte x Version %d
+0 belong&0xffffff00 0xfefe0600 MySQL ISAM compressed data file
+>3 byte x Version %d
+0 string \376bin MySQL replication log
+
+#------------------------------------------------------------------------------
+# iRiver H Series database file
+# From Ken Guest <ken at linux.ie>
+# As observed from iRivNavi.iDB and unencoded firmware
+#
+0 string iRivDB iRiver Database file
+>11 string >\0 Version %s
+>39 string iHP-100 [H Series]
+
+#------------------------------------------------------------------------------
+# SQLite database files
+# Ken Guest <ken at linux.ie>, Ty Sarna, Zack Weinberg
+#
+# Version 1 used GDBM internally; its files cannot be distinguished
+# from other GDBM files.
+#
+# Version 2 used this format:
+0 string **\ This\ file\ contains\ an\ SQLite SQLite 2.x database
+
+# Version 3 of SQLite allows applications to embed their own "user version"
+# number in the database. Detect this and distinguish those files.
+
+0 string SQLite\ format\ 3
+>60 string _MTN Monotone source repository
+>60 belong !0 SQLite 3.x database, user version %u
+>60 belong 0 SQLite 3.x database
+
+#------------------------------------------------------------------------------
+# $File: sun,v 1.20 2009/09/19 16:28:12 christos Exp $
+# sun: file(1) magic for Sun machines
+#
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases. (5.x uses ELF.)
+#
+0 belong&077777777 0600413 sparc demand paged
+>0 byte &0x80
+>>20 belong <4096 shared library
+>>20 belong =4096 dynamically linked executable
+>>20 belong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0600410 sparc pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0600407 sparc
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0400413 mc68020 demand paged
+>0 byte &0x80
+>>20 belong <4096 shared library
+>>20 belong =4096 dynamically linked executable
+>>20 belong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0400410 mc68020 pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0400407 mc68020
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0200413 mc68010 demand paged
+>0 byte &0x80
+>>20 belong <4096 shared library
+>>20 belong =4096 dynamically linked executable
+>>20 belong >4096 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0200410 mc68010 pure
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+0 belong&077777777 0200407 mc68010
+>0 byte &0x80 dynamically linked executable
+>0 byte ^0x80 executable
+>16 belong >0 not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0 belong 0407 old sun-2 executable
+>16 belong >0 not stripped
+0 belong 0410 old sun-2 pure executable
+>16 belong >0 not stripped
+0 belong 0413 old sun-2 demand paged executable
+>16 belong >0 not stripped
+
+#
+# Core files. "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0 belong 0x080456 SunOS core file
+>4 belong 432 (SPARC)
+>>132 string >\0 from '%s'
+>>116 belong =3 (quit)
+>>116 belong =4 (illegal instruction)
+>>116 belong =5 (trace trap)
+>>116 belong =6 (abort)
+>>116 belong =7 (emulator trap)
+>>116 belong =8 (arithmetic exception)
+>>116 belong =9 (kill)
+>>116 belong =10 (bus error)
+>>116 belong =11 (segmentation violation)
+>>116 belong =12 (bad argument to system call)
+>>116 belong =29 (resource lost)
+>>120 belong x (T=%dK,
+>>124 belong x D=%dK,
+>>128 belong x S=%dK)
+>4 belong 826 (68K)
+>>128 string >\0 from '%s'
+>4 belong 456 (SPARC 4.x BCP)
+>>152 string >\0 from '%s'
+# Sun SunPC
+0 long 0xfa33c08e SunPC 4.0 Hard Disk
+0 string #SUNPC_CONFIG SunPC 4.0 Properties Values
+# Sun snoop (see RFC 1761, which describes the capture file format).
+#
+0 string snoop Snoop capture file
+>8 belong >0 - version %ld
+>12 belong 0 (IEEE 802.3)
+>12 belong 1 (IEEE 802.4)
+>12 belong 2 (IEEE 802.5)
+>12 belong 3 (IEEE 802.6)
+>12 belong 4 (Ethernet)
+>12 belong 5 (HDLC)
+>12 belong 6 (Character synchronous)
+>12 belong 7 (IBM channel-to-channel adapter)
+>12 belong 8 (FDDI)
+>12 belong 9 (Unknown)
+
+# Microsoft ICM color profile
+36 string acspMSFT Microsoft ICM Color Profile
+# Sun KCMS
+36 string acsp Kodak Color Management System, ICC Profile
+
+#---------------------------------------------------------------------------
+# The following entries have been tested by Duncan Laurie <duncan at sun.com> (a
+# lead Sun/Cobalt developer) who agrees that they are good and worthy of
+# inclusion.
+
+# Boot ROM images for Sun/Cobalt Linux server appliances
+0 string Cobalt\ Networks\ Inc.\nFirmware\ v Paged COBALT boot rom
+>38 string x V%.4s
+
+# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code
+# at the very end where file(1) can't get it.
+0 string CRfs COBALT boot rom data (Flat boot rom or file system)
+
+
+
+#------------------------------------------------------------------------
+# $File: sysex,v 1.6 2009/09/19 16:28:12 christos Exp $
+# sysex: file(1) magic for MIDI sysex files
+#
+#
+0 byte 0xF0 SysEx File -
+
+# North American Group
+>1 byte 0x01 Sequential
+>1 byte 0x02 IDP
+>1 byte 0x03 OctavePlateau
+>1 byte 0x04 Moog
+>1 byte 0x05 Passport
+>1 byte 0x06 Lexicon
+>1 byte 0x07 Kurzweil/Future Retro
+>>3 byte 0x77 777
+>>4 byte 0x00 Bank
+>>4 byte 0x01 Song
+>>5 byte 0x0f 16
+>>5 byte 0x0e 15
+>>5 byte 0x0d 14
+>>5 byte 0x0c 13
+>>5 byte 0x0b 12
+>>5 byte 0x0a 11
+>>5 byte 0x09 10
+>>5 byte 0x08 9
+>>5 byte 0x07 8
+>>5 byte 0x06 7
+>>5 byte 0x05 6
+>>5 byte 0x04 5
+>>5 byte 0x03 4
+>>5 byte 0x02 3
+>>5 byte 0x01 2
+>>5 byte 0x00 1
+>>5 byte 0x10 (ALL)
+>>2 byte x \b, Channel %d
+>1 byte 0x08 Fender
+>1 byte 0x09 Gulbransen
+>1 byte 0x0a AKG
+>1 byte 0x0b Voyce
+>1 byte 0x0c Waveframe
+>1 byte 0x0d ADA
+>1 byte 0x0e Garfield
+>1 byte 0x0f Ensoniq
+>1 byte 0x10 Oberheim
+>>2 byte 0x06 Matrix 6 series
+>>3 byte 0x0A Dump (All)
+>>3 byte 0x01 Dump (Bank)
+>>4 belong 0x0002040E Matrix 1000
+>>>11 byte <2 User bank %d
+>>>11 byte >1 Preset bank %d
+>1 byte 0x11 Apple
+>1 byte 0x12 GreyMatter
+>1 byte 0x14 PalmTree
+>1 byte 0x15 JLCooper
+>1 byte 0x16 Lowrey
+>1 byte 0x17 AdamsSmith
+>1 byte 0x18 E-mu
+>1 byte 0x19 Harmony
+>1 byte 0x1a ART
+>1 byte 0x1b Baldwin
+>1 byte 0x1c Eventide
+>1 byte 0x1d Inventronics
+>1 byte 0x1f Clarity
+
+# European Group
+>1 byte 0x21 SIEL
+>1 byte 0x22 Synthaxe
+>1 byte 0x24 Hohner
+>1 byte 0x25 Twister
+>1 byte 0x26 Solton
+>1 byte 0x27 Jellinghaus
+>1 byte 0x28 Southworth
+>1 byte 0x29 PPG
+>1 byte 0x2a JEN
+>1 byte 0x2b SSL
+>1 byte 0x2c AudioVertrieb
+
+>1 byte 0x2f ELKA
+>>3 byte 0x09 EK-44
+
+>1 byte 0x30 Dynacord
+>1 byte 0x31 Jomox
+>1 byte 0x33 Clavia
+>1 byte 0x39 Soundcraft
+# Some Waldorf info from http://Stromeko.Synth.net/Downloads#WaldorfDocs
+>1 byte 0x3e Waldorf
+>>2 byte 0x00 microWave
+>>2 byte 0x0E microwave2 / XT
+>>2 byte 0x0F Q / Q+
+>>3 byte =0 (default id)
+>>3 byte >0 (
+>>>3 byte <0x7F \bdevice %d)
+>>>3 byte =0x7F \bbroadcast id)
+>>3 byte 0x7f Microwave I
+>>>4 byte 0x00 SNDR (Sound Request)
+>>>4 byte 0x10 SNDD (Sound Dump)
+>>>4 byte 0x20 SNDP (Sound Parameter Change)
+>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry)
+>>>4 byte 0x70 BOOT (Sound Reserved)
+>>>4 byte 0x01 MULR (Multi Request)
+>>>4 byte 0x11 MULD (Multi Dump)
+>>>4 byte 0x21 MULP (Multi Parameter Change)
+>>>4 byte 0x31 MULQ (Multi Parameter Inquiry)
+>>>4 byte 0x71 OS (Multi Reserved)
+>>>4 byte 0x02 DRMR (Drum Map Request)
+>>>4 byte 0x12 DRMD (Drum Map Dump)
+>>>4 byte 0x22 DRMP (Drum Map Parameter Change)
+>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry)
+>>>4 byte 0x72 BIN (Drum Map Reserved)
+>>>4 byte 0x03 PATR (Sequencer Pattern Request)
+>>>4 byte 0x13 PATD (Sequencer Pattern Dump)
+>>>4 byte 0x23 PATP (Sequencer Pattern Parameter Change)
+>>>4 byte 0x33 PATQ (Sequencer Pattern Parameter Inquiry)
+>>>4 byte 0x73 AFM (Sequencer Pattern Reserved)
+>>>4 byte 0x04 GLBR (Global Parameter Request)
+>>>4 byte 0x14 GLBD (Global Parameter Dump)
+>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
+>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
+>>>4 byte 0x07 MODR (Mode Parameter Request)
+>>>4 byte 0x17 MODD (Mode Parameter Dump)
+>>>4 byte 0x27 MODP (Mode Parameter Parameter Change)
+>>>4 byte 0x37 MODQ (Mode Parameter Parameter Inquiry)
+>>2 byte 0x10 microQ
+>>>4 byte 0x00 SNDR (Sound Request)
+>>>4 byte 0x10 SNDD (Sound Dump)
+>>>4 byte 0x20 SNDP (Sound Parameter Change)
+>>>4 byte 0x30 SNDQ (Sound Parameter Inquiry)
+>>>4 byte 0x70 (Sound Reserved)
+>>>4 byte 0x01 MULR (Multi Request)
+>>>4 byte 0x11 MULD (Multi Dump)
+>>>4 byte 0x21 MULP (Multi Parameter Change)
+>>>4 byte 0x31 MULQ (Multi Parameter Inquiry)
+>>>4 byte 0x71 OS (Multi Reserved)
+>>>4 byte 0x02 DRMR (Drum Map Request)
+>>>4 byte 0x12 DRMD (Drum Map Dump)
+>>>4 byte 0x22 DRMP (Drum Map Parameter Change)
+>>>4 byte 0x32 DRMQ (Drum Map Parameter Inquiry)
+>>>4 byte 0x72 BIN (Drum Map Reserved)
+>>>4 byte 0x04 GLBR (Global Parameter Request)
+>>>4 byte 0x14 GLBD (Global Parameter Dump)
+>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
+>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
+>>2 byte 0x11 rackAttack
+>>>4 byte 0x00 SNDR (Sound Parameter Request)
+>>>4 byte 0x10 SNDD (Sound Parameter Dump)
+>>>4 byte 0x20 SNDP (Sound Parameter Parameter Change)
+>>>4 byte 0x30 SNDQ (Sound Parameter Parameter Inquiry)
+>>>4 byte 0x01 PRGR (Program Parameter Request)
+>>>4 byte 0x11 PRGD (Program Parameter Dump)
+>>>4 byte 0x21 PRGP (Program Parameter Parameter Change)
+>>>4 byte 0x31 PRGQ (Program Parameter Parameter Inquiry)
+>>>4 byte 0x71 OS (Program Parameter Reserved)
+>>>4 byte 0x03 PATR (Pattern Parameter Request)
+>>>4 byte 0x13 PATD (Pattern Parameter Dump)
+>>>4 byte 0x23 PATP (Pattern Parameter Parameter Change)
+>>>4 byte 0x33 PATQ (Pattern Parameter Parameter Inquiry)
+>>>4 byte 0x04 GLBR (Global Parameter Request)
+>>>4 byte 0x14 GLBD (Global Parameter Dump)
+>>>4 byte 0x24 GLBP (Global Parameter Parameter Change)
+>>>4 byte 0x34 GLBQ (Global Parameter Parameter Inquiry)
+>>>4 byte 0x05 EFXR (FX Parameter Request)
+>>>4 byte 0x15 EFXD (FX Parameter Dump)
+>>>4 byte 0x25 EFXP (FX Parameter Parameter Change)
+>>>4 byte 0x35 EFXQ (FX Parameter Parameter Inquiry)
+>>>4 byte 0x07 MODR (Mode Command Request)
+>>>4 byte 0x17 MODD (Mode Command Dump)
+>>>4 byte 0x27 MODP (Mode Command Parameter Change)
+>>>4 byte 0x37 MODQ (Mode Command Parameter Inquiry)
+>>2 byte 0x03 Wave
+>>>4 byte 0x00 SBPR (Soundprogram)
+>>>4 byte 0x01 SAPR (Performance)
+>>>4 byte 0x02 SWAVE (Wave)
+>>>4 byte 0x03 SWTBL (Wave control table)
+>>>4 byte 0x04 SVT (Velocity Curve)
+>>>4 byte 0x05 STT (Tuning Table)
+>>>4 byte 0x06 SGLB (Global Parameters)
+>>>4 byte 0x07 SARRMAP (Performance Program Change Map)
+>>>4 byte 0x08 SBPRMAP (Sound Program Change Map)
+>>>4 byte 0x09 SBPRPAR (Sound Parameter)
+>>>4 byte 0x0A SARRPAR (Performance Parameter)
+>>>4 byte 0x0B SINSPAR (Instrument/External Parameter)
+>>>4 byte 0x0F SBULK (Bulk Switch on/off)
+
+# Japanese Group
+>1 byte 0x40 Kawai
+>>3 byte 0x20 K1
+>>3 byte 0x22 K4
+
+>1 byte 0x41 Roland
+>>3 byte 0x14 D-50
+>>3 byte 0x2b U-220
+>>3 byte 0x02 TR-707
+
+>1 byte 0x42 Korg
+>>3 byte 0x19 M1
+
+>1 byte 0x43 Yamaha
+>1 byte 0x44 Casio
+>1 byte 0x46 Kamiya
+>1 byte 0x47 Akai
+>1 byte 0x48 Victor
+>1 byte 0x49 Mesosha
+>1 byte 0x4b Fujitsu
+>1 byte 0x4c Sony
+>1 byte 0x4e Teac
+>1 byte 0x50 Matsushita
+>1 byte 0x51 Fostex
+>1 byte 0x52 Zoom
+>1 byte 0x54 Matsushita
+>1 byte 0x57 Acoustic tech. lab.
+
+>1 belong&0xffffff00 0x00007400 Ta Horng
+>1 belong&0xffffff00 0x00007500 e-Tek
+>1 belong&0xffffff00 0x00007600 E-Voice
+>1 belong&0xffffff00 0x00007700 Midisoft
+>1 belong&0xffffff00 0x00007800 Q-Sound
+>1 belong&0xffffff00 0x00007900 Westrex
+>1 belong&0xffffff00 0x00007a00 Nvidia*
+>1 belong&0xffffff00 0x00007b00 ESS
+>1 belong&0xffffff00 0x00007c00 Mediatrix
+>1 belong&0xffffff00 0x00007d00 Brooktree
+>1 belong&0xffffff00 0x00007e00 Otari
+>1 belong&0xffffff00 0x00007f00 Key Electronics
+>1 belong&0xffffff00 0x00010000 Shure
+>1 belong&0xffffff00 0x00010100 AuraSound
+>1 belong&0xffffff00 0x00010200 Crystal
+>1 belong&0xffffff00 0x00010300 Rockwell
+>1 belong&0xffffff00 0x00010400 Silicon Graphics
+>1 belong&0xffffff00 0x00010500 Midiman
+>1 belong&0xffffff00 0x00010600 PreSonus
+>1 belong&0xffffff00 0x00010800 Topaz
+>1 belong&0xffffff00 0x00010900 Cast Lightning
+>1 belong&0xffffff00 0x00010a00 Microsoft
+>1 belong&0xffffff00 0x00010b00 Sonic Foundry
+>1 belong&0xffffff00 0x00010c00 Line 6
+>1 belong&0xffffff00 0x00010d00 Beatnik Inc.
+>1 belong&0xffffff00 0x00010e00 Van Koerving
+>1 belong&0xffffff00 0x00010f00 Altech Systems
+>1 belong&0xffffff00 0x00011000 S & S Research
+>1 belong&0xffffff00 0x00011100 VLSI Technology
+>1 belong&0xffffff00 0x00011200 Chromatic
+>1 belong&0xffffff00 0x00011300 Sapphire
+>1 belong&0xffffff00 0x00011400 IDRC
+>1 belong&0xffffff00 0x00011500 Justonic Tuning
+>1 belong&0xffffff00 0x00011600 TorComp
+>1 belong&0xffffff00 0x00011700 Newtek Inc.
+>1 belong&0xffffff00 0x00011800 Sound Sculpture
+>1 belong&0xffffff00 0x00011900 Walker Technical
+>1 belong&0xffffff00 0x00011a00 Digital Harmony
+>1 belong&0xffffff00 0x00011b00 InVision
+>1 belong&0xffffff00 0x00011c00 T-Square
+>1 belong&0xffffff00 0x00011d00 Nemesys
+>1 belong&0xffffff00 0x00011e00 DBX
+>1 belong&0xffffff00 0x00011f00 Syndyne
+>1 belong&0xffffff00 0x00012000 Bitheadz
+>1 belong&0xffffff00 0x00012100 Cakewalk
+>1 belong&0xffffff00 0x00012200 Staccato
+>1 belong&0xffffff00 0x00012300 National Semicon.
+>1 belong&0xffffff00 0x00012400 Boom Theory
+>1 belong&0xffffff00 0x00012500 Virtual DSP Corp
+>1 belong&0xffffff00 0x00012600 Antares
+>1 belong&0xffffff00 0x00012700 Angel Software
+>1 belong&0xffffff00 0x00012800 St Louis Music
+>1 belong&0xffffff00 0x00012900 Lyrrus dba G-VOX
+>1 belong&0xffffff00 0x00012a00 Ashley Audio
+>1 belong&0xffffff00 0x00012b00 Vari-Lite
+>1 belong&0xffffff00 0x00012c00 Summit Audio
+>1 belong&0xffffff00 0x00012d00 Aureal Semicon.
+>1 belong&0xffffff00 0x00012e00 SeaSound
+>1 belong&0xffffff00 0x00012f00 U.S. Robotics
+>1 belong&0xffffff00 0x00013000 Aurisis
+>1 belong&0xffffff00 0x00013100 Nearfield Multimedia
+>1 belong&0xffffff00 0x00013200 FM7 Inc.
+>1 belong&0xffffff00 0x00013300 Swivel Systems
+>1 belong&0xffffff00 0x00013400 Hyperactive
+>1 belong&0xffffff00 0x00013500 MidiLite
+>1 belong&0xffffff00 0x00013600 Radical
+>1 belong&0xffffff00 0x00013700 Roger Linn
+>1 belong&0xffffff00 0x00013800 Helicon
+>1 belong&0xffffff00 0x00013900 Event
+>1 belong&0xffffff00 0x00013a00 Sonic Network
+>1 belong&0xffffff00 0x00013b00 Realtime Music
+>1 belong&0xffffff00 0x00013c00 Apogee Digital
+
+>1 belong&0xffffff00 0x00202b00 Medeli Electronics
+>1 belong&0xffffff00 0x00202c00 Charlie Lab
+>1 belong&0xffffff00 0x00202d00 Blue Chip Music
+>1 belong&0xffffff00 0x00202e00 BEE OH Corp
+>1 belong&0xffffff00 0x00202f00 LG Semicon America
+>1 belong&0xffffff00 0x00203000 TESI
+>1 belong&0xffffff00 0x00203100 EMAGIC
+>1 belong&0xffffff00 0x00203200 Behringer
+>1 belong&0xffffff00 0x00203300 Access Music
+>1 belong&0xffffff00 0x00203400 Synoptic
+>1 belong&0xffffff00 0x00203500 Hanmesoft Corp
+>1 belong&0xffffff00 0x00203600 Terratec
+>1 belong&0xffffff00 0x00203700 Proel SpA
+>1 belong&0xffffff00 0x00203800 IBK MIDI
+>1 belong&0xffffff00 0x00203900 IRCAM
+>1 belong&0xffffff00 0x00203a00 Propellerhead Software
+>1 belong&0xffffff00 0x00203b00 Red Sound Systems
+>1 belong&0xffffff00 0x00203c00 Electron ESI AB
+>1 belong&0xffffff00 0x00203d00 Sintefex Audio
+>1 belong&0xffffff00 0x00203e00 Music and More
+>1 belong&0xffffff00 0x00203f00 Amsaro
+>1 belong&0xffffff00 0x00204000 CDS Advanced Technology
+>1 belong&0xffffff00 0x00204100 Touched by Sound
+>1 belong&0xffffff00 0x00204200 DSP Arts
+>1 belong&0xffffff00 0x00204300 Phil Rees Music
+>1 belong&0xffffff00 0x00204400 Stamer Musikanlagen GmbH
+>1 belong&0xffffff00 0x00204500 Soundart
+>1 belong&0xffffff00 0x00204600 C-Mexx Software
+>1 belong&0xffffff00 0x00204700 Klavis Tech.
+>1 belong&0xffffff00 0x00204800 Noteheads AB
+
+0 string T707 Roland TR-707 Data
+
+#------------------------------------------------------------------------------
+# $File: teapot,v 1.4 2009/09/19 16:28:12 christos Exp $
+# teapot: file(1) magic for "teapot" spreadsheet
+#
+0 string #!teapot\012xdr teapot work sheet (XDR format)
+
+#------------------------------------------------------------------------------
+# $File: terminfo,v 1.6 2009/09/19 16:28:12 christos Exp $
+# terminfo: file(1) magic for terminfo
+#
+# XXX - byte order for screen images?
+#
+0 string \032\001 Compiled terminfo entry
+0 short 0433 Curses screen image
+0 short 0434 Curses screen image
+
+#------------------------------------------------------------------------------
+# $File: tex,v 1.16 2009/09/19 16:28:12 christos Exp $
+# tex: file(1) magic for TeX files
+#
+# XXX - needs byte-endian stuff (big-endian and little-endian DVI?)
+#
+# From <conklin at talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0 string \367\002 TeX DVI file
+!:mime application/x-dvi
+>16 string >\0 (%s)
+0 string \367\203 TeX generic font data
+0 string \367\131 TeX packed font data
+>3 string >\0 (%s)
+0 string \367\312 TeX virtual font data
+0 search/1 This\ is\ TeX, TeX transcript text
+0 search/1 This\ is\ METAFONT, METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data. The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2 string \000\021 TeX font metric data
+!:mime application/x-tex-tfm
+>33 string >\0 (%s)
+2 string \000\022 TeX font metric data
+!:mime application/x-tex-tfm
+>33 string >\0 (%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan at yggdrasil.com)
+0 search/1 \\input\ texinfo Texinfo source text
+!:mime text/x-texinfo
+0 search/1 This\ is\ Info\ file GNU Info text
+!:mime text/x-info
+
+# TeX documents, from Daniel Quinlan (quinlan at yggdrasil.com)
+0 search/4096 \\input TeX document text
+!:mime text/x-tex
+!:strength - 4
+0 search/4096 \\section LaTeX document text
+!:mime text/x-tex
+!:strength - 1
+0 search/4096 \\setlength LaTeX document text
+!:mime text/x-tex
+!:strength - 4
+0 search/4096 \\documentstyle LaTeX document text
+!:mime text/x-tex
+!:strength - 1
+0 search/4096 \\chapter LaTeX document text
+!:mime text/x-tex
+!:strength - 1
+0 search/4096 \\documentclass LaTeX 2e document text
+!:mime text/x-tex
+!:strength - 4
+0 search/4096 \\relax LaTeX auxiliary file
+!:mime text/x-tex
+!:strength - 4
+0 search/4096 \\contentsline LaTeX table of contents
+!:mime text/x-tex
+!:strength - 4
+0 search/4096 %\ -*-latex-*- LaTeX document text
+!:mime text/x-tex
+
+# Tex document, from Hendrik Scholz <hendrik at scholz.net>
+0 search/1 \\ifx TeX document text
+
+# Index and glossary files
+0 search/4096 \\indexentry LaTeX raw index file
+!:strength - 15
+0 search/4096 \\begin{theindex} LaTeX sorted index
+!:strength - 15
+0 search/4096 \\glossaryentry LaTeX raw glossary
+!:strength - 15
+0 search/4096 \\begin{theglossary} LaTeX sorted glossary
+!:strength - 15
+0 search/4096 This\ is\ makeindex Makeindex log file
+!:strength - 15
+
+# End of TeX
+
+#------------------------------------------------------------------------------
+# file(1) magic for BibTex text files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0 search/1/c @article{ BibTeX text file
+0 search/1/c @book{ BibTeX text file
+0 search/1/c @inbook{ BibTeX text file
+0 search/1/c @incollection{ BibTeX text file
+0 search/1/c @inproceedings{ BibTeX text file
+0 search/1/c @manual{ BibTeX text file
+0 search/1/c @misc{ BibTeX text file
+0 search/1/c @preamble{ BibTeX text file
+0 search/1/c @phdthesis{ BibTeX text file
+0 search/1/c @techreport{ BibTeX text file
+0 search/1/c @unpublished{ BibTeX text file
+
+73 search/1 %%%\ \ BibTeX-file{ BibTex text file (with full header)
+
+73 search/1 %%%\ \ @BibTeX-style-file{ BibTeX style text file (with full header)
+
+0 search/1 %\ BibTeX\ standard\ bibliography\ BibTeX standard bibliography style text file
+
+0 search/1 %\ BibTeX\ ` BibTeX custom bibliography style text file
+
+0 search/1 @c\ @mapfile{ TeX font aliases text file
+
+#------------------------------------------------------------------------------
+# $File: tgif,v 1.5 2009/09/19 16:28:12 christos Exp $
+# file(1) magic for tgif(1) files
+# From Hendrik Scholz <hendrik at scholz.net>
+
+0 string %TGIF\ x Tgif file version %s
+
+
+#------------------------------------------------------------------------------
+# $File: ti-8x,v 1.6 2009/09/19 16:28:12 christos Exp $
+# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
+#
+# From: Ryan McGuire (rmcguire at freenet.columbus.oh.us).
+#
+# Update: Romain Lievin (roms at lpg.ticalc.org).
+#
+# NOTE: This list is not complete.
+# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
+# program/group magic numbers in here because I cannot find any.
+0 string **TI80** TI-80 Graphing Calculator File.
+0 string **TI81** TI-81 Graphing Calculator File.
+#
+# Magic Numbers for the TI-73
+#
+0 string **TI73** TI-73 Graphing Calculator
+>0x00003B byte 0x00 (real number)
+>0x00003B byte 0x01 (list)
+>0x00003B byte 0x02 (matrix)
+>0x00003B byte 0x03 (equation)
+>0x00003B byte 0x04 (string)
+>0x00003B byte 0x05 (program)
+>0x00003B byte 0x06 (assembly program)
+>0x00003B byte 0x07 (picture)
+>0x00003B byte 0x08 (gdb)
+>0x00003B byte 0x0C (complex number)
+>0x00003B byte 0x0F (window settings)
+>0x00003B byte 0x10 (zoom)
+>0x00003B byte 0x11 (table setup)
+>0x00003B byte 0x13 (backup)
+
+# Magic Numbers for the TI-82
+#
+0 string **TI82** TI-82 Graphing Calculator
+>0x00003B byte 0x00 (real)
+>0x00003B byte 0x01 (list)
+>0x00003B byte 0x02 (matrix)
+>0x00003B byte 0x03 (Y-variable)
+>0x00003B byte 0x05 (program)
+>0x00003B byte 0x06 (protected prgm)
+>0x00003B byte 0x07 (picture)
+>0x00003B byte 0x08 (gdb)
+>0x00003B byte 0x0B (window settings)
+>0x00003B byte 0x0C (window settings)
+>0x00003B byte 0x0D (table setup)
+>0x00003B byte 0x0E (screenshot)
+>0x00003B byte 0x0F (backup)
+#
+# Magic Numbers for the TI-83
+#
+0 string **TI83** TI-83 Graphing Calculator
+>0x00003B byte 0x00 (real)
+>0x00003B byte 0x01 (list)
+>0x00003B byte 0x02 (matrix)
+>0x00003B byte 0x03 (Y-variable)
+>0x00003B byte 0x04 (string)
+>0x00003B byte 0x05 (program)
+>0x00003B byte 0x06 (protected prgm)
+>0x00003B byte 0x07 (picture)
+>0x00003B byte 0x08 (gdb)
+>0x00003B byte 0x0B (window settings)
+>0x00003B byte 0x0C (window settings)
+>0x00003B byte 0x0D (table setup)
+>0x00003B byte 0x0E (screenshot)
+>0x00003B byte 0x13 (backup)
+#
+# Magic Numbers for the TI-83+
+#
+0 string **TI83F* TI-83+ Graphing Calculator
+>0x00003B byte 0x00 (real number)
+>0x00003B byte 0x01 (list)
+>0x00003B byte 0x02 (matrix)
+>0x00003B byte 0x03 (equation)
+>0x00003B byte 0x04 (string)
+>0x00003B byte 0x05 (program)
+>0x00003B byte 0x06 (assembly program)
+>0x00003B byte 0x07 (picture)
+>0x00003B byte 0x08 (gdb)
+>0x00003B byte 0x0C (complex number)
+>0x00003B byte 0x0F (window settings)
+>0x00003B byte 0x10 (zoom)
+>0x00003B byte 0x11 (table setup)
+>0x00003B byte 0x13 (backup)
+>0x00003B byte 0x15 (application variable)
+>0x00003B byte 0x17 (group of variable)
+
+#
+# Magic Numbers for the TI-85
+#
+0 string **TI85** TI-85 Graphing Calculator
+>0x00003B byte 0x00 (real number)
+>0x00003B byte 0x01 (complex number)
+>0x00003B byte 0x02 (real vector)
+>0x00003B byte 0x03 (complex vector)
+>0x00003B byte 0x04 (real list)
+>0x00003B byte 0x05 (complex list)
+>0x00003B byte 0x06 (real matrix)
+>0x00003B byte 0x07 (complex matrix)
+>0x00003B byte 0x08 (real constant)
+>0x00003B byte 0x09 (complex constant)
+>0x00003B byte 0x0A (equation)
+>0x00003B byte 0x0C (string)
+>0x00003B byte 0x0D (function GDB)
+>0x00003B byte 0x0E (polar GDB)
+>0x00003B byte 0x0F (parametric GDB)
+>0x00003B byte 0x10 (diffeq GDB)
+>0x00003B byte 0x11 (picture)
+>0x00003B byte 0x12 (program)
+>0x00003B byte 0x13 (range)
+>0x00003B byte 0x17 (window settings)
+>0x00003B byte 0x18 (window settings)
+>0x00003B byte 0x19 (window settings)
+>0x00003B byte 0x1A (window settings)
+>0x00003B byte 0x1B (zoom)
+>0x00003B byte 0x1D (backup)
+>0x00003B byte 0x1E (unknown)
+>0x00003B byte 0x2A (equation)
+>0x000032 string ZS4 - ZShell Version 4 File.
+>0x000032 string ZS3 - ZShell Version 3 File.
+#
+# Magic Numbers for the TI-86
+#
+0 string **TI86** TI-86 Graphing Calculator
+>0x00003B byte 0x00 (real number)
+>0x00003B byte 0x01 (complex number)
+>0x00003B byte 0x02 (real vector)
+>0x00003B byte 0x03 (complex vector)
+>0x00003B byte 0x04 (real list)
+>0x00003B byte 0x05 (complex list)
+>0x00003B byte 0x06 (real matrix)
+>0x00003B byte 0x07 (complex matrix)
+>0x00003B byte 0x08 (real constant)
+>0x00003B byte 0x09 (complex constant)
+>0x00003B byte 0x0A (equation)
+>0x00003B byte 0x0C (string)
+>0x00003B byte 0x0D (function GDB)
+>0x00003B byte 0x0E (polar GDB)
+>0x00003B byte 0x0F (parametric GDB)
+>0x00003B byte 0x10 (diffeq GDB)
+>0x00003B byte 0x11 (picture)
+>0x00003B byte 0x12 (program)
+>0x00003B byte 0x13 (range)
+>0x00003B byte 0x17 (window settings)
+>0x00003B byte 0x18 (window settings)
+>0x00003B byte 0x19 (window settings)
+>0x00003B byte 0x1A (window settings)
+>0x00003B byte 0x1B (zoom)
+>0x00003B byte 0x1D (backup)
+>0x00003B byte 0x1E (unknown)
+>0x00003B byte 0x2A (equation)
+#
+# Magic Numbers for the TI-89
+#
+0 string **TI89** TI-89 Graphing Calculator
+>0x000048 byte 0x00 (expression)
+>0x000048 byte 0x04 (list)
+>0x000048 byte 0x06 (matrix)
+>0x000048 byte 0x0A (data)
+>0x000048 byte 0x0B (text)
+>0x000048 byte 0x0C (string)
+>0x000048 byte 0x0D (graphic data base)
+>0x000048 byte 0x0E (figure)
+>0x000048 byte 0x10 (picture)
+>0x000048 byte 0x12 (program)
+>0x000048 byte 0x13 (function)
+>0x000048 byte 0x14 (macro)
+>0x000048 byte 0x1C (zipped)
+>0x000048 byte 0x21 (assembler)
+#
+# Magic Numbers for the TI-92
+#
+0 string **TI92** TI-92 Graphing Calculator
+>0x000048 byte 0x00 (expression)
+>0x000048 byte 0x04 (list)
+>0x000048 byte 0x06 (matrix)
+>0x000048 byte 0x0A (data)
+>0x000048 byte 0x0B (text)
+>0x000048 byte 0x0C (string)
+>0x000048 byte 0x0D (graphic data base)
+>0x000048 byte 0x0E (figure)
+>0x000048 byte 0x10 (picture)
+>0x000048 byte 0x12 (program)
+>0x000048 byte 0x13 (function)
+>0x000048 byte 0x14 (macro)
+>0x000048 byte 0x1D (backup)
+#
+# Magic Numbers for the TI-92+/V200
+#
+0 string **TI92P* TI-92+/V200 Graphing Calculator
+>0x000048 byte 0x00 (expression)
+>0x000048 byte 0x04 (list)
+>0x000048 byte 0x06 (matrix)
+>0x000048 byte 0x0A (data)
+>0x000048 byte 0x0B (text)
+>0x000048 byte 0x0C (string)
+>0x000048 byte 0x0D (graphic data base)
+>0x000048 byte 0x0E (figure)
+>0x000048 byte 0x10 (picture)
+>0x000048 byte 0x12 (program)
+>0x000048 byte 0x13 (function)
+>0x000048 byte 0x14 (macro)
+>0x000048 byte 0x1C (zipped)
+>0x000048 byte 0x21 (assembler)
+#
+# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
+#
+0x0000016 string Advanced TI-XX Graphing Calculator (FLASH)
+0 string **TIFL** TI-XX Graphing Calculator (FLASH)
+>8 byte >0 - Revision %d
+>>9 byte x \b.%d,
+>12 byte >0 Revision date %02x
+>>13 byte x \b/%02x
+>>14 beshort x \b/%04x,
+>17 string >/0 name: '%s',
+>48 byte 0x74 device: TI-73,
+>48 byte 0x73 device: TI-83+,
+>48 byte 0x98 device: TI-89,
+>48 byte 0x88 device: TI-92+,
+>49 byte 0x23 type: OS upgrade,
+>49 byte 0x24 type: application,
+>49 byte 0x25 type: certificate,
+>49 byte 0x3e type: license,
+>74 lelong >0 size: %ld bytes
+
+# VTi & TiEmu skins (TI Graphing Calculators).
+# From: Romain Lievin (roms at lpg.ticalc.org).
+# Magic Numbers for the VTi skins
+0 string VTI Virtual TI skin
+>3 string v - Version
+>>4 byte >0 \b %c
+>>6 byte x \b.%c
+# Magic Numbers for the TiEmu skins
+0 string TiEmu TiEmu skin
+>6 string v - Version
+>>7 byte >0 \b %c
+>>9 byte x \b.%c
+>>10 byte x \b%c
+
+#------------------------------------------------------------------------------
+# $File: timezone,v 1.11 2009/09/19 16:28:12 christos Exp $
+# timezone: file(1) magic for timezone data
+#
+# from Daniel Quinlan (quinlan at yggdrasil.com)
+# this should work on Linux, SunOS, and maybe others
+# Added new official magic number for recent versions of the Olson code
+0 string TZif timezone data
+>4 byte 0 \b, old version
+>4 byte >0 \b, version %c
+>20 belong 0 \b, no gmt time flags
+>20 belong 1 \b, 1 gmt time flag
+>20 belong >1 \b, %d gmt time flags
+>24 belong 0 \b, no std time flags
+>20 belong 1 \b, 1 std time flag
+>24 belong >1 \b, %d std time flags
+>28 belong 0 \b, no leap seconds
+>28 belong 1 \b, 1 leap second
+>28 belong >1 \b, %d leap seconds
+>32 belong 0 \b, no transition times
+>32 belong 1 \b, 1 transition time
+>32 belong >1 \b, %d transition times
+>36 belong 0 \b, no abbreviation chars
+>36 belong 1 \b, 1 abbreviation char
+>36 belong >1 \b, %d abbreviation chars
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0 old timezone data
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0 old timezone data
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0 old timezone data
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0 old timezone data
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0 old timezone data
+0 string \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0 old timezone data
+
+#------------------------------------------------------------------------------
+# $File: troff,v 1.10 2009/09/19 16:28:12 christos Exp $
+# troff: file(1) magic for *roff
+#
+# updated by Daniel Quinlan (quinlan at yggdrasil.com)
+
+# troff input
+0 search/1 .\\" troff or preprocessor input text
+!:mime text/troff
+0 search/1 '\\" troff or preprocessor input text
+!:mime text/troff
+0 search/1 '.\\" troff or preprocessor input text
+!:mime text/troff
+0 search/1 \\" troff or preprocessor input text
+!:mime text/troff
+0 search/1 ''' troff or preprocessor input text
+!:mime text/troff
+0 regex/20 \^\\.[A-Za-z0-9][A-Za-z0-9][\ \t] troff or preprocessor input text
+!:mime text/troff
+0 regex/20 \^\\.[A-Za-z0-9][A-Za-z0-9]$ troff or preprocessor input text
+!:mime text/troff
+
+# ditroff intermediate output text
+0 search/1 x\ T ditroff output text
+>4 search/1 cat for the C/A/T phototypesetter
+>4 search/1 ps for PostScript
+>4 search/1 dvi for DVI
+>4 search/1 ascii for ASCII
+>4 search/1 lj4 for LaserJet 4
+>4 search/1 latin1 for ISO 8859-1 (Latin 1)
+>4 search/1 X75 for xditview at 75dpi
+>>7 search/1 -12 (12pt)
+>4 search/1 X100 for xditview at 100dpi
+>>8 search/1 -12 (12pt)
+
+# output data formats
+0 string \100\357 very old (C/A/T) troff output data
+
+#------------------------------------------------------------------------------
+# $File: tuxedo,v 1.4 2009/09/19 16:28:13 christos Exp $
+# tuxedo: file(1) magic for BEA TUXEDO data files
+#
+# from Ian Springer <ispringer at hotmail.com>
+#
+0 string \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0 BEA TUXEDO DES mask data
+
+#------------------------------------------------------------------------------
+# $File: typeset,v 1.8 2009/09/19 16:28:13 christos Exp $
+# typeset: file(1) magic for other typesetting
+#
+0 string Interpress/Xerox Xerox InterPress data
+>16 string / (version
+>>17 string >\0 %s)
+
+#------------------------------------------------------------------------------
+# $File: unicode,v 1.5 2009/09/19 16:28:13 christos Exp $
+# Unicode: BOM prefixed text files - Adrian Havill <havill at turbolinux.co.jp>
+# GRR: These types should be recognised in file_ascmagic so these
+# encodings can be treated by text patterns.
+# Missing types are already dealt with internally.
+#
+0 string +/v8 Unicode text, UTF-7
+0 string +/v9 Unicode text, UTF-7
+0 string +/v+ Unicode text, UTF-7
+0 string +/v/ Unicode text, UTF-7
+0 string \335\163\146\163 Unicode text, UTF-8-EBCDIC
+0 string \376\377\000\000 Unicode text, UTF-32, big-endian
+0 string \377\376\000\000 Unicode text, UTF-32, little-endian
+0 string \016\376\377 Unicode text, SCSU (Standard Compression Scheme for Unicode)
+
+#------------------------------------------------------------------------------
+# $File: unknown,v 1.7 2009/09/19 16:28:13 christos Exp $
+# unknown: file(1) magic for unknown machines
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414 and 0x10E is 416; those *are* unknown.
+#
+0 short 0x107 unknown machine executable
+>8 short >0 not stripped
+>15 byte >0 - version %ld
+0 short 0x108 unknown pure executable
+>8 short >0 not stripped
+>15 byte >0 - version %ld
+0 short 0x109 PDP-11 separate I&D
+>8 short >0 not stripped
+>15 byte >0 - version %ld
+0 short 0x10b unknown pure executable
+>8 short >0 not stripped
+>15 byte >0 - version %ld
+0 long 0x10c unknown demand paged pure executable
+>16 long >0 not stripped
+0 long 0x10e unknown readable demand paged pure executable
+
+#------------------------------------------------------------------------------
+# $File: uuencode,v 1.7 2009/09/19 16:28:13 christos Exp $
+# uuencode: file(1) magic for ASCII-encoded files
+#
+
+# GRR: the first line of xxencoded files is identical to that in uuencoded
+# files, but the first character in most subsequent lines is 'h' instead of
+# 'M'. (xxencoding uses lowercase letters in place of most of uuencode's
+# punctuation and survives BITNET gateways better.) If regular expressions
+# were supported, this entry could possibly be split into two with
+# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
+0 search/1 begin\ uuencoded or xxencoded text
+
+# btoa(1) is an alternative to uuencode that requires less space.
+0 search/1 xbtoa\ Begin btoa'd text
+
+# ship(1) is another, much cooler alternative to uuencode.
+# Greg Roelofs, newt at uchicago.edu
+0 search/1 $\012ship ship'd binary text
+
+# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
+# Greg Roelofs, newt at uchicago.edu
+0 search/1 Decode\ the\ following\ with\ bdeco bencoded News text
+
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan at yggdrasil.com
+11 search/1 must\ be\ converted\ with\ BinHex BinHex binary text
+>41 search/1 x \b, version %.3s
+
+# GRR: handle BASE64
+
+#------------------------------------------------------------------------------
+# $File: varied.out,v 1.21 2009/09/19 16:28:13 christos Exp $
+# varied.out: file(1) magic for various USG systems
+#
+# Herewith many of the object file formats used by USG systems.
+# Most have been moved to files for a particular processor,
+# and deleted if they duplicate other entries.
+#
+0 short 0610 Perkin-Elmer executable
+# AMD 29K
+0 beshort 0572 amd 29k coff noprebar executable
+0 beshort 01572 amd 29k coff prebar executable
+0 beshort 0160007 amd 29k coff archive
+# Cray
+6 beshort 0407 unicos (cray) executable
+# Ultrix 4.3
+596 string \130\337\377\377 Ultrix core file
+>600 string >\0 from '%s'
+# BeOS and MAcOS PEF executables
+# From: hplus at zilker.net (Jon Watte)
+0 string Joy!peffpwpc header for PowerPC PEF executable
+#
+# ava assembler/linker Uros Platise <uros.platise at ijs.si>
+0 string avaobj AVR assembler object code
+>7 string >\0 version '%s'
+# gnu gmon magic From: Eugen Dedu <dedu at ese-metz.fr>
+0 string gmon GNU prof performance data
+>4 long x - version %ld
+# From: Dave Pearson <davep at davep.org>
+# Harbour <URL:http://www.harbour-project.org/> HRB files.
+0 string \xc0HRB Harbour HRB file
+>4 short x version %d
+
+# From: Alex Beregszaszi <alex at fsn.hu>
+# 0 string exec BugOS executable
+# 0 string pack BugOS archive
+
+# From: Jason Spence <jspence at lightconsulting.com>
+# Generated by the "examples" in STM's ST40 devkit, and derived code.
+0 lelong 0x13a9f17e ST40 component image format
+>4 string >\0 \b, name '%s'
+
+
+#------------------------------------------------------------------------------
+# $File: varied.script,v 1.6 2009/09/19 16:28:13 christos Exp $
+# varied.script: file(1) magic for various interpreter scripts
+
+0 string #!\ / a
+>3 string >\0 %s script text executable
+0 string #!\t/ a
+>3 string >\0 %s script text executable
+0 string #!/ a
+>2 string >\0 %s script text executable
+0 string #!\ script text executable
+>3 string >\0 for %s
+
+# From: arno <arenevier at fdn.fr>
+# mozilla xpconnect typelib
+# see http://www.mozilla.org/scriptable/typelib_file.html
+0 string XPCOM\nTypeLib\r\n\032 XPConnect Typelib
+>0x10 byte x version %d
+>>0x11 byte x \b.%d
+
+#------------------------------------------------------------------------------
+# $File: vax,v 1.7 2009/09/19 16:28:13 christos Exp $
+# vax: file(1) magic for VAX executable/object and APL workspace
+#
+0 lelong 0101557 VAX single precision APL workspace
+0 lelong 0101556 VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0 lelong 0407 VAX executable
+>16 lelong >0 not stripped
+
+0 lelong 0410 VAX pure executable
+>16 lelong >0 not stripped
+
+0 lelong 0413 VAX demand paged pure executable
+>16 lelong >0 not stripped
+
+0 lelong 0420 VAX demand paged (first page unmapped) pure executable
+>16 lelong >0 not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0 leshort 0570 VAX COFF executable
+>12 lelong >0 not stripped
+>22 leshort >0 - version %ld
+0 leshort 0575 VAX COFF pure executable
+>12 lelong >0 not stripped
+>22 leshort >0 - version %ld
+
+#------------------------------------------------------------------------------
+# $File: vicar,v 1.4 2009/09/19 16:28:13 christos Exp $
+# vicar: file(1) magic for VICAR files.
+#
+# From: Ossama Othman <othman at astrosun.tn.cornell.edu
+# VICAR is JPL's in-house spacecraft image processing program
+# VICAR image
+0 string LBLSIZE= VICAR image data
+>32 string BYTE \b, 8 bits = VAX byte
+>32 string HALF \b, 16 bits = VAX word = Fortran INTEGER*2
+>32 string FULL \b, 32 bits = VAX longword = Fortran INTEGER*4
+>32 string REAL \b, 32 bits = VAX longword = Fortran REAL*4
+>32 string DOUB \b, 64 bits = VAX quadword = Fortran REAL*8
+>32 string COMPLEX \b, 64 bits = VAX quadword = Fortran COMPLEX*8
+# VICAR label file
+43 string SFDU_LABEL VICAR label file
+
+#------------------------------------------------------------------------------
+# $File: virtual,v 1.1 2009/12/25 16:04:30 christos Exp $
+# From: James Nobis <quel at quelrod.net>
+# Microsoft hard disk images for:
+# Virtual Server
+# Virtual PC
+# http://technet.microsoft.com/en-us/virtualserver/bb676673.aspx
+# .vhd
+0 string conectix Microsoft Disk Image, Virtual Server or Virtual PC
+
+# Sun xVM VirtualBox Disk Image
+# string <<< Sun xVM VirtualBox Disk Image >>>
+# .vdi
+0 string \<\<\<\ Sun\ xVM\ VirtualBox\ Disk Sun xVM VirtualBox Disk Image
+
+
+
+#------------------------------------------------------------------------------
+# $File: virtutech,v 1.4 2009/09/19 16:28:13 christos Exp $
+# Virtutech Compressed Random Access File Format
+#
+# From <gustav at virtutech.com>
+0 string \211\277\036\203 Virtutech CRAFF
+>4 belong x v%d
+>20 belong 0 uncompressed
+>20 belong 1 bzipp2ed
+>20 belong 2 gzipped
+>24 belong 0 not clean
+
+#------------------------------------------------------------------------------
+# $File: visx,v 1.5 2009/09/19 16:28:13 christos Exp $
+# visx: file(1) magic for Visx format files
+#
+0 short 0x5555 VISX image file
+>2 byte 0 (zero)
+>2 byte 1 (unsigned char)
+>2 byte 2 (short integer)
+>2 byte 3 (float 32)
+>2 byte 4 (float 64)
+>2 byte 5 (signed char)
+>2 byte 6 (bit-plane)
+>2 byte 7 (classes)
+>2 byte 8 (statistics)
+>2 byte 10 (ascii text)
+>2 byte 15 (image segments)
+>2 byte 100 (image set)
+>2 byte 101 (unsigned char vector)
+>2 byte 102 (short integer vector)
+>2 byte 103 (float 32 vector)
+>2 byte 104 (float 64 vector)
+>2 byte 105 (signed char vector)
+>2 byte 106 (bit plane vector)
+>2 byte 121 (feature vector)
+>2 byte 122 (feature vector library)
+>2 byte 124 (chain code)
+>2 byte 126 (bit vector)
+>2 byte 130 (graph)
+>2 byte 131 (adjacency graph)
+>2 byte 132 (adjacency graph library)
+>2 string .VISIX (ascii text)
+
+#------------------------------------------------------------------------------
+# $File: vms,v 1.6 2009/09/19 16:28:13 christos Exp $
+# vms: file(1) magic for VMS executables (experimental)
+#
+# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt at uchicago.edu)
+
+# GRR 950122: I'm just guessing on these, based on inspection of the headers
+# of three executables each for Alpha and VAX architectures. The VAX files
+# all had headers similar to this:
+#
+# 00000 b0 00 30 00 44 00 60 00 00 00 00 00 30 32 30 35 ..0.D.`.....0205
+# 00010 01 01 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 ................
+#
+0 string \xb0\0\x30\0 VMS VAX executable
+>44032 string PK\003\004 \b, Info-ZIP SFX archive v5.12 w/decryption
+#
+# The AXP files all looked like this, except that the byte at offset 0x22
+# was 06 in some of them and 07 in others:
+#
+# 00000 03 00 00 00 00 00 00 00 ec 02 00 00 10 01 00 00 ................
+# 00010 68 00 00 00 98 00 00 00 b8 00 00 00 00 00 00 00 h...............
+# 00020 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+# 00030 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
+# 00040 00 00 00 00 ff ff ff ff ff ff ff ff 02 00 00 00 ................
+#
+0 belong 0x03000000 VMS Alpha executable
+>75264 string PK\003\004 \b, Info-ZIP SFX archive v5.12 w/decryption
+
+#------------------------------------------------------------------------------
+# $File: vmware,v 1.7 2009/09/19 16:28:13 christos Exp $
+# VMware specific files (deducted from version 1.1 and log file entries)
+# Anthon van der Neut (anthon at mnt.org)
+0 belong 0x4d52564e VMware nvram
+
+#------------------------------------------------------------------------------
+# $File: vorbis,v 1.16 2009/09/19 16:28:13 christos Exp $
+# vorbis: file(1) magic for Ogg/Vorbis files
+#
+# From Felix von Leitner <leitner at fefe.de>
+# Extended by Beni Cherniavsky <cben at crosswinds.net>
+# Further extended by Greg Wooledge <greg at wooledge.org>
+#
+# Most (everything but the number of channels and bitrate) is commented
+# out with `##' as it's not interesting to the average user. The most
+# probable things advanced users would want to uncomment are probably
+# the number of comments and the encoder version.
+#
+# FIXME: The first match has been made a search, so that it can skip
+# over prepended ID3 tags. This will work for MIME type detection, but
+# won't work for detecting other properties of the file (they all need
+# to be made relative to the search). In any case, if the file has ID3
+# tags, the ID3 information will be printed, not the Ogg information,
+# so until that's fixed, this doesn't matter.
+# FIXME[2]: Disable the above for now, since search assumes text mode.
+#
+# --- Ogg Framing ---
+#0 search/1000 OggS Ogg data
+0 string OggS Ogg data
+!:mime application/ogg
+>4 byte !0 UNKNOWN REVISION %u
+##>4 byte 0 revision 0
+>4 byte 0
+##>>14 lelong x (Serial %lX)
+# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net)
+>>28 string \x7fFLAC \b, FLAC audio
+# non-Vorbis content: Theora
+>>28 string \x80theora \b, Theora video
+# non-Vorbis content: Kate
+>>28 string \x80kate\0\0\0\0 \b, Kate
+>>>37 ubyte x v%u
+>>>38 ubyte x \b.%u,
+>>>40 byte 0 utf8 encoding,
+>>>40 byte !0 unknown character encoding,
+>>>60 string >\0 language %s,
+>>>60 string \0 no language set,
+>>>76 string >\0 category %s
+>>>76 string \0 no category set
+# non-Vorbis content: Skeleton
+>>28 string fishead\0 \b, Skeleton
+>>>36 short x v%u
+>>>40 short x \b.%u
+# non-Vorbis content: Speex
+>>28 string Speex\ \ \ \b, Speex audio
+# non-Vorbis content: OGM
+>>28 string \x01video\0\0\0 \b, OGM video
+>>>37 string/c div3 (DivX 3)
+>>>37 string/c divx (DivX 4)
+>>>37 string/c dx50 (DivX 5)
+>>>37 string/c xvid (XviD)
+# --- First vorbis packet - general header ---
+>>28 string \x01vorbis \b, Vorbis audio,
+>>>35 lelong !0 UNKNOWN VERSION %lu,
+##>>>35 lelong 0 version 0,
+>>>35 lelong 0
+>>>>39 ubyte 1 mono,
+>>>>39 ubyte 2 stereo,
+>>>>39 ubyte >2 %u channels,
+>>>>40 lelong x %lu Hz
+# Minimal, nominal and maximal bitrates specified when encoding
+>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff \b,
+# The above tests if at least one of these is specified:
+>>>>>52 lelong !-1
+# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields
+# instead of -1.
+# Vorbis 1.0 uses 0 instead of -1.
+>>>>>>52 lelong !0
+>>>>>>>52 lelong !-1000
+>>>>>>>>52 lelong x <%lu
+>>>>>48 lelong !-1
+>>>>>>48 lelong x ~%lu
+>>>>>44 lelong !-1
+>>>>>>44 lelong !-1000
+>>>>>>>44 lelong !0
+>>>>>>>>44 lelong x >%lu
+>>>>>48 string <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff bps
+# -- Second vorbis header packet - the comments
+# A kludge to read the vendor string. It's a counted string, not a
+# zero-terminated one, so file(1) can't read it in a generic way.
+# libVorbis is the only one existing currently, so I detect specifically
+# it. The interesting value is the cvs date (8 digits decimal).
+# Post-RC1 Ogg files have the second header packet (and thus the version)
+# in a different place, so we must use an indirect offset.
+>>>(84.b+85) string \x03vorbis
+>>>>(84.b+96) string/c Xiphophorus\ libVorbis\ I \b, created by: Xiphophorus libVorbis I
+>>>>>(84.b+120) string >00000000
+# Map to beta version numbers:
+>>>>>>(84.b+120) string <20000508 (<beta1, prepublic)
+>>>>>>(84.b+120) string 20000508 (1.0 beta 1 or beta 2)
+>>>>>>(84.b+120) string >20000508
+>>>>>>>(84.b+120) string <20001031 (beta2-3)
+>>>>>>(84.b+120) string 20001031 (1.0 beta 3)
+>>>>>>(84.b+120) string >20001031
+>>>>>>>(84.b+120) string <20010225 (beta3-4)
+>>>>>>(84.b+120) string 20010225 (1.0 beta 4)
+>>>>>>(84.b+120) string >20010225
+>>>>>>>(84.b+120) string <20010615 (beta4-RC1)
+>>>>>>(84.b+120) string 20010615 (1.0 RC1)
+>>>>>>(84.b+120) string 20010813 (1.0 RC2)
+>>>>>>(84.b+120) string 20010816 (RC2 - Garf tuned v1)
+>>>>>>(84.b+120) string 20011014 (RC2 - Garf tuned v2)
+>>>>>>(84.b+120) string 20011217 (1.0 RC3)
+>>>>>>(84.b+120) string 20011231 (1.0 RC3)
+# Some pre-1.0 CVS snapshots still had "Xiphphorus"...
+>>>>>>(84.b+120) string >20011231 (pre-1.0 CVS)
+# For the 1.0 release, Xiphophorus is replaced by Xiph.Org
+>>>>(84.b+96) string/c Xiph.Org\ libVorbis\ I \b, created by: Xiph.Org libVorbis I
+>>>>>(84.b+117) string >00000000
+>>>>>>(84.b+117) string <20020717 (pre-1.0 CVS)
+>>>>>>(84.b+117) string 20020717 (1.0)
+>>>>>>(84.b+117) string 20030909 (1.0.1)
+>>>>>>(84.b+117) string 20040629 (1.1.0 RC1)
+
+#------------------------------------------------------------------------------
+# $File: vxl,v 1.4 2009/09/19 16:28:13 christos Exp $
+# VXL: file(1) magic for VXL binary IO data files
+#
+# from Ian Scott <scottim at sf.net>
+#
+# VXL is a collection of C++ libraries for Computer Vision.
+# See the vsl chapter in the VXL Book for more info
+# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
+# http:/vxl.sf.net
+
+2 lelong 0x472b2c4e VXL data file,
+>0 leshort >0 schema version no %d
+
+#------------------------------------------------------------------------------
+# $File: warc,v 1.2 2009/09/19 16:28:13 christos Exp $
+# warc: file(1) magic for WARC files
+
+0 string WARC/ WARC Archive
+>5 string x version %.4s
+
+#------------------------------------------------------------------------------
+# weak: file(1) magic for very weak magic entries, disabled by default
+#
+# These entries are so weak that they might interfere identification of
+# other formats. Example include:
+# - Only identify for 1 or 2 bytes
+# - Match against very wide range of values
+# - Match against generic word in some spoken languages (e.g. English)
+
+# Summary: Computer Graphics Metafile
+# Extension: .cgm
+#0 beshort&0xffe0 0x0020 binary Computer Graphics Metafile
+#0 beshort 0x3020 character Computer Graphics Metafile
+
+#0 string =!! Bennet Yee's "face" format
+
+#------------------------------------------------------------------------------
+# $File: windows,v 1.4 2009/09/19 16:28:13 christos Exp $
+# windows: file(1) magic for Microsoft Windows
+#
+# This file is mainly reserved for files where programs
+# using them are run almost always on MS Windows 3.x or
+# above, or files only used exclusively in Windows OS,
+# where there is no better category to allocate for.
+# For example, even though WinZIP almost run on Windows
+# only, it is better to treat them as "archive" instead.
+# For format usable in DOS, such as generic executable
+# format, please specify under "msdos" file.
+#
+
+
+# Summary: Outlook Express DBX file
+# Extension: .dbx
+# Created by: Christophe Monniez
+0 string \xCF\xAD\x12\xFE MS Outlook Express DBX file
+>4 byte =0xC5 \b, message database
+>4 byte =0xC6 \b, folder database
+>4 byte =0xC7 \b, account information
+>4 byte =0x30 \b, offline database
+
+
+# Summary: Windows crash dump
+# Extension: .dmp
+# Created by: Andreas Schuster (http://computer.forensikblog.de/)
+# Reference (1): http://computer.forensikblog.de/en/2008/02/64bit_magic.html
+# Modified by (1): Abel Cheung (Avoid match with first 4 bytes only)
+0 string PAGE
+>4 string DUMP MS Windows 32bit crash dump
+>>0x05c byte 0 \b, no PAE
+>>0x05c byte 1 \b, PAE
+>>0xf88 lelong 1 \b, full dump
+>>0xf88 lelong 2 \b, kernel dump
+>>0xf88 lelong 3 \b, small dump
+>>0x068 lelong x \b, %ld pages
+>4 string DU64 MS Windows 64bit crash dump
+>>0xf98 lelong 1 \b, full dump
+>>0xf98 lelong 2 \b, kernel dump
+>>0xf98 lelong 3 \b, small dump
+>>0x090 lequad x \b, %lld pages
+
+
+# Summary: Vista Event Log
+# Extension: .evtx
+# Created by: Andreas Schuster (http://computer.forensikblog.de/)
+# Reference (1): http://computer.forensikblog.de/en/2007/05/some_magic.html
+0 string ElfFile\0 MS Windows Vista Event Log
+>0x2a leshort x \b, %d chunks
+>>0x10 lelong x \b (no. %d in use)
+>0x18 lelong >1 \b, next record no. %d
+>0x18 lelong =1 \b, empty
+>0x78 lelong &1 \b, DIRTY
+>0x78 lelong &2 \b, FULL
+
+
+# Summary: Windows 3.1 group files
+# Extension: .grp
+# Created by: unknown
+0 string \120\115\103\103 MS Windows 3.1 group files
+
+
+# Summary: Old format help files
+# Extension: .hlp
+# Created by: Dirk Jagdmann <doj at cubic.org>
+0 lelong 0x00035f3f MS Windows 3.x help file
+
+
+# Summary: Hyper terminal
+# Extension: .ht
+# Created by: unknown
+0 string HyperTerminal\
+>15 string 1.0\ --\ HyperTerminal\ data\ file MS Windows HyperTerminal profile
+
+
+# Summary: Windows shortcut
+# Extension: .lnk
+# Created by: unknown
+0 string \114\0\0\0\001\024\002\0\0\0\0\0\300\0\0\0\0\0\0\106 MS Windows shortcut
+
+
+# Summary: Outlook Personal Folders
+# Created by: unknown
+0 lelong 0x4E444221 Microsoft Outlook email folder
+>10 leshort 0x0e (<=2002)
+>10 leshort 0x17 (>=2003)
+
+
+# Summary: Windows help cache
+# Created by: unknown
+0 string \164\146\115\122\012\000\000\000\001\000\000\000 MS Windows help cache
+
+
+# Summary: IE cache file
+# Created by: Christophe Monniez
+0 string Client\ UrlCache\ MMF Internet Explorer cache file
+>20 string >\0 version %s
+
+
+# Summary: Registry files
+# Created by: unknown
+# Modified by (1): Joerg Jenderek
+0 string regf MS Windows registry file, NT/2000 or above
+0 string CREG MS Windows 95/98/ME registry file
+0 string SHCC3 MS Windows 3.1 registry file
+
+
+# Summary: Windows Registry text
+# Extension: .reg
+# Submitted by: Abel Cheung <abelcheung at gmail.com>
+0 string REGEDIT4\r\n\r\n Windows Registry text (Win95 or above)
+0 string Windows\ Registry\ Editor\
+>&0 string Version\ 5.00\r\n\r\n Windows Registry text (Win2K or above)
+
+
+# From: Pal Tamas <folti at balabit.hu>
+# Autorun File
+0 string/c [autorun]\r\n Microsoft Windows Autorun file.
+!:mime application/x-setupscript.
+
+#------------------------------------------------------------------------------
+# $File: wireless,v 1.2 2009/09/19 16:28:13 christos Exp $
+# wireless-regdb: file(1) magic for CRDA wireless-regdb file format
+#
+0 string RGDB CRDA wireless regulatory database file
+>4 belong 19 (Version 1)
+
+#------------------------------------------------------------------------------
+# $File: wordprocessors,v 1.14 2009/09/19 16:28:13 christos Exp $
+# wordprocessors: file(1) magic fo word processors.
+#
+####### PWP file format used on Smith Corona Personal Word Processors:
+2 string \040\040\040\040\040\040\040\040\040\040\040ML4D\040'92 Smith Corona PWP
+>24 byte 2 \b, single spaced
+>24 byte 3 \b, 1.5 spaced
+>24 byte 4 \b, double spaced
+>25 byte 0x42 \b, letter
+>25 byte 0x54 \b, legal
+>26 byte 0x46 \b, A4
+
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0 string \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable file
+>15 byte 0 Optimized for Intel
+>15 byte 1 Optimized for Non-Intel
+1 string WPC (Corel/WP)
+>8 short 257 WordPerfect macro
+>8 short 258 WordPerfect help file
+>8 short 259 WordPerfect keyboard file
+>8 short 266 WordPerfect document
+>8 short 267 WordPerfect dictionary
+>8 short 268 WordPerfect thesaurus
+>8 short 269 WordPerfect block
+>8 short 270 WordPerfect rectangular block
+>8 short 271 WordPerfect column block
+>8 short 272 WordPerfect printer data
+>8 short 275 WordPerfect printer data
+>8 short 276 WordPerfect driver resource data
+>8 short 279 WordPerfect hyphenation code
+>8 short 280 WordPerfect hyphenation data
+>8 short 281 WordPerfect macro resource data
+>8 short 283 WordPerfect hyphenation lex
+>8 short 285 WordPerfect wordlist
+>8 short 286 WordPerfect equation resource data
+>8 short 289 WordPerfect spell rules
+>8 short 290 WordPerfect dictionary rules
+>8 short 295 WordPerfect spell rules (Microlytics)
+>8 short 299 WordPerfect settings file
+>8 short 301 WordPerfect 4.2 document
+>8 short 325 WordPerfect dialog file
+>8 short 332 WordPerfect button bar
+>8 short 513 Shell macro
+>8 short 522 Shell definition
+>8 short 769 Notebook macro
+>8 short 770 Notebook help file
+>8 short 771 Notebook keyboard file
+>8 short 778 Notebook definition
+>8 short 1026 Calculator help file
+>8 short 1538 Calendar help file
+>8 short 1546 Calendar data file
+>8 short 1793 Editor macro
+>8 short 1794 Editor help file
+>8 short 1795 Editor keyboard file
+>8 short 1817 Editor macro resource file
+>8 short 2049 Macro editor macro
+>8 short 2050 Macro editor help file
+>8 short 2051 Macro editor keyboard file
+>8 short 2305 PlanPerfect macro
+>8 short 2306 PlanPerfect help file
+>8 short 2307 PlanPerfect keyboard file
+>8 short 2314 PlanPerfect worksheet
+>8 short 2319 PlanPerfect printer definition
+>8 short 2322 PlanPerfect graphic definition
+>8 short 2323 PlanPerfect data
+>8 short 2324 PlanPerfect temporary printer
+>8 short 2329 PlanPerfect macro resource data
+>8 byte 11 Mail
+>8 short 2818 help file
+>8 short 2821 distribution list
+>8 short 2826 out box
+>8 short 2827 in box
+>8 short 2836 users archived mailbox
+>8 short 2837 archived message database
+>8 short 2838 archived attachments
+>8 short 3083 Printer temporary file
+>8 short 3330 Scheduler help file
+>8 short 3338 Scheduler in file
+>8 short 3339 Scheduler out file
+>8 short 3594 GroupWise settings file
+>8 short 3601 GroupWise directory services
+>8 short 3627 GroupWise settings file
+>8 short 4362 Terminal resource data
+>8 short 4363 Terminal resource data
+>8 short 4395 Terminal resource data
+>8 short 4619 GUI loadable text
+>8 short 4620 graphics resource data
+>8 short 4621 printer settings file
+>8 short 4622 port definition file
+>8 short 4623 print queue parameters
+>8 short 4624 compressed file
+>8 short 5130 Network service msg file
+>8 short 5131 Network service msg file
+>8 short 5132 Async gateway login msg
+>8 short 5134 GroupWise message file
+>8 short 7956 GroupWise admin domain database
+>8 short 7957 GroupWise admin host database
+>8 short 7959 GroupWise admin remote host database
+>8 short 7960 GroupWise admin ADS deferment data file
+>8 short 8458 IntelliTAG (SGML) compiled DTD
+>8 long 18219264 WordPerfect graphic image (1.0)
+>8 long 18219520 WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+
+# Hangul (Korean) Word Processor File
+0 string HWP\ Document\ File Hangul (Korean) Word Processor File 3.0
+# From: Won-Kyu Park <wkpark at kldp.org>
+512 string R\0o\0o\0t\0 Hangul (Korean) Word Processor File 2000
+!:mime application/x-hwp
+
+# CosmicBook, from Beno�t Rouits
+0 string CSBK Ted Neslson's CosmicBook hypertext file
+
+2 string EYWR AmigaWriter file
+
+# chi: file(1) magic for ChiWriter files
+0 string \\1cw\ ChiWriter file
+>5 string >\0 version %s
+0 string \\1cw ChiWriter file
+
+# Quark Express from http://www.garykessler.net/library/file_sigs.html
+2 string IIXPR3 Intel Quark Express Document (English)
+2 string IIXPRa Intel Quark Express Document (Korean)
+2 string MMXPR3 Motorola Quark Express Document (English)
+!:mime application/x-quark-xpress-3
+2 string MMXPRa Motorola Quark Express Document (Korean)
+
+# adobe indesign (document, whatever...) from querkan
+0 belong 0x0606edf5 Adobe InDesign
+>16 string DOCUMENT Document
+
+#------------------------------------------------------------------------------
+# ichitaro456: file(1) magic for Just System Word Processor Ichitaro
+#
+# Contributor kenzo-:
+# Reversed-engineered JS Ichitaro magic numbers
+#
+
+0 string DOC
+>43 byte 0x14 Just System Word Processor Ichitaro v4
+!:mime application/x-ichitaro4
+>144 string JDASH application/x-ichitaro4
+
+0 string DOC
+>43 byte 0x15 Just System Word Processor Ichitaro v5
+!:mime application/x-ichitaro5
+
+0 string DOC
+>43 byte 0x16 Just System Word Processor Ichitaro v6
+!:mime application/x-ichitaro6
+
+#------------------------------------------------------------------------------
+# $File: xdelta,v 1.4 2009/09/19 16:28:13 christos Exp $
+# file(1) magic(5) data for xdelta Josh MacDonald <jmacd at CS.Berkeley.EDU>
+#
+0 string %XDELTA% XDelta binary patch file 0.14
+0 string %XDZ000% XDelta binary patch file 0.18
+0 string %XDZ001% XDelta binary patch file 0.20
+0 string %XDZ002% XDelta binary patch file 1.0
+0 string %XDZ003% XDelta binary patch file 1.0.4
+0 string %XDZ004% XDelta binary patch file 1.1
+
+#------------------------------------------------------------------------------
+# $File: xenix,v 1.9 2009/09/19 16:28:13 christos Exp $
+# xenix: file(1) magic for Microsoft Xenix
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives
+#
+0 string core core file (Xenix)
+0 byte 0x80 8086 relocatable (Microsoft)
+0 leshort 0xff65 x.out
+>2 string __.SYMDEF randomized
+>0 byte x archive
+0 leshort 0x206 Microsoft a.out
+>8 leshort 1 Middle model
+>0x1e leshort &0x10 overlay
+>0x1e leshort &0x2 separate
+>0x1e leshort &0x4 pure
+>0x1e leshort &0x800 segmented
+>0x1e leshort &0x400 standalone
+>0x1e leshort &0x8 fixed-stack
+>0x1c byte &0x80 byte-swapped
+>0x1c byte &0x40 word-swapped
+>0x10 lelong >0 not-stripped
+>0x1e leshort ^0xc000 pre-SysV
+>0x1e leshort &0x4000 V2.3
+>0x1e leshort &0x8000 V3.0
+>0x1c byte &0x4 86
+>0x1c byte &0xb 186
+>0x1c byte &0x9 286
+>0x1c byte &0xa 386
+>0x1f byte <0x040 small model
+>0x1f byte =0x048 large model
+>0x1f byte =0x049 huge model
+>0x1e leshort &0x1 executable
+>0x1e leshort ^0x1 object file
+>0x1e leshort &0x40 Large Text
+>0x1e leshort &0x20 Large Data
+>0x1e leshort &0x120 Huge Objects Enabled
+>0x10 lelong >0 not stripped
+
+0 leshort 0x140 old Microsoft 8086 x.out
+>0x3 byte &0x4 separate
+>0x3 byte &0x2 pure
+>0 byte &0x1 executable
+>0 byte ^0x1 relocatable
+>0x14 lelong >0 not stripped
+
+0 lelong 0x206 b.out
+>0x1e leshort &0x10 overlay
+>0x1e leshort &0x2 separate
+>0x1e leshort &0x4 pure
+>0x1e leshort &0x800 segmented
+>0x1e leshort &0x400 standalone
+>0x1e leshort &0x1 executable
+>0x1e leshort ^0x1 object file
+>0x1e leshort &0x4000 V2.3
+>0x1e leshort &0x8000 V3.0
+>0x1c byte &0x4 86
+>0x1c byte &0xb 186
+>0x1c byte &0x9 286
+>0x1c byte &0x29 286
+>0x1c byte &0xa 386
+>0x1e leshort &0x4 Large Text
+>0x1e leshort &0x2 Large Data
+>0x1e leshort &0x102 Huge Objects Enabled
+
+0 leshort 0x580 XENIX 8086 relocatable or 80286 small model
+
+#------------------------------------------------------------------------------
+# $File: xilinx,v 1.4 2009/09/19 16:28:13 christos Exp $
+# This is Aaron's attempt at a MAGIC file for Xilinx .bit files.
+# Xilinx-Magic at RevRagnarok.com
+# Got the info from FPGA-FAQ 0026
+#
+# First there is the sync header and its length
+0 beshort 0x0009
+>2 belong =0x0ff00ff0
+>>&0 belong =0x0ff00ff0
+>>>&0 beshort =0x0000
+>>>>&0 pstring a Xilinx BIT data
+# Next is a Pascal-style string with the NCD name. We want to capture that.
+>>>>0x0F pstring x - from %s
+# It is followed by a NUL
+>>>>>&1 byte 0x00
+# And then 'b'
+>>>>>&2 string b
+# With the part number:
+#>>>>>&5 string 4v (Virtex4)
+#>>>>>&5 string 2v (Virtex II
+#>>>>>>&0 string !p \b)
+#>>>>>>&0 string p Pro)
+>>>>>&4 pstring x - for %s
+# And then NUL / 'c' / Build Data / NUL / 'd' / Date / NUL / 'e' / Data Length
+>>>>>>&1 byte 0x00
+>>>>>>&2 string c
+>>>>>>&4 pstring x - built %s
+>>>>>>>&1 byte 0x00
+>>>>>>>&2 string d
+>>>>>>>&4 pstring x \b(%s)
+>>>>>>>>&1 byte 0x00
+>>>>>>>>&2 string e
+>>>>>>>>&4 belong x - data length 0x%lx
+
+#------------------------------------------------------------------------------
+# $File: xo65,v 1.4 2009/09/19 16:28:13 christos Exp $
+# xo65 object files
+# From: "Ullrich von Bassewitz" <uz at cc65.org>
+#
+0 string \x55\x7A\x6E\x61 xo65 object,
+>4 leshort x version %d,
+>6 leshort&0x0001 =0x0001 with debug info
+>6 leshort&0x0001 =0x0000 no debug info
+
+# xo65 library files
+0 string \x6E\x61\x55\x7A xo65 library,
+>4 leshort x version %d
+
+# o65 object files
+0 string \x01\x00\x6F\x36\x35 o65
+>6 leshort&0x1000 =0x0000 executable,
+>6 leshort&0x1000 =0x1000 object,
+>5 byte x version %d,
+>6 leshort&0x8000 =0x8000 65816,
+>6 leshort&0x8000 =0x0000 6502,
+>6 leshort&0x2000 =0x2000 32 bit,
+>6 leshort&0x2000 =0x0000 16 bit,
+>6 leshort&0x4000 =0x4000 page reloc,
+>6 leshort&0x4000 =0x0000 byte reloc,
+>6 leshort&0x0003 =0x0000 alignment 1
+>6 leshort&0x0003 =0x0001 alignment 2
+>6 leshort&0x0003 =0x0002 alignment 4
+>6 leshort&0x0003 =0x0003 alignment 256
+
+#------------------------------------------------------------------------------
+# $File: xwindows,v 1.6 2009/09/19 16:28:13 christos Exp $
+# xwindows: file(1) magic for various X/Window system file formats.
+
+# Compiled X Keymap
+# XKM (compiled X keymap) files (including version and byte ordering)
+1 string mkx Compiled XKB Keymap: lsb,
+>0 byte >0 version %d
+>0 byte =0 obsolete
+0 string xkm Compiled XKB Keymap: msb,
+>3 byte >0 version %d
+>0 byte =0 obsolete
+
+# xfsdump archive
+0 string xFSdump0 xfsdump archive
+>8 belong x (version %d)
+
+# Jaleo XFS files
+0 long 395726 Jaleo XFS file
+>4 long x - version %ld
+>8 long x - [%ld -
+>20 long x %ldx
+>24 long x %ldx
+>28 long 1008 YUV422]
+>28 long 1000 RGB24]
+
+# Xcursor data
+# X11 mouse cursor format defined in libXcursor, see
+# http://www.x.org/archive/X11R6.8.1/doc/Xcursor.3.html
+# http://cgit.freedesktop.org/xorg/lib/libXcursor/tree/include/X11/Xcursor/Xcursor.h
+0 string Xcur Xcursor data
+!:mime image/x-xcursor
+>10 leshort x version %hd
+>>8 leshort x \b.%hd
+
+#------------------------------------------------------------------------------
+# $File: zilog,v 1.7 2009/09/19 16:28:13 christos Exp $
+# zilog: file(1) magic for Zilog Z8000.
+#
+# Was it big-endian or little-endian? My Product Specification doesn't
+# say.
+#
+0 long 0xe807 object file (z8000 a.out)
+0 long 0xe808 pure object file (z8000 a.out)
+0 long 0xe809 separate object file (z8000 a.out)
+0 long 0xe805 overlay object file (z8000 a.out)
+
+#------------------------------------------------------------------------------
+# $File: zyxel,v 1.6 2009/09/19 16:28:13 christos Exp $
+# zyxel: file(1) magic for ZyXEL modems
+#
+# From <rob at pe1chl.ampr.org>
+# These are the /etc/magic entries to decode datafiles as used for the
+# ZyXEL U-1496E DATA/FAX/VOICE modems. (This header conforms to a
+# ZyXEL-defined standard)
+
+0 string ZyXEL\002 ZyXEL voice data
+>10 byte 0 - CELP encoding
+>10 byte&0x0B 1 - ADPCM2 encoding
+>10 byte&0x0B 2 - ADPCM3 encoding
+>10 byte&0x0B 3 - ADPCM4 encoding
+>10 byte&0x0B 8 - New ADPCM3 encoding
+>10 byte&0x04 4 with resync
diff --git a/tools/dbgap-mount/Makefile b/tools/dbgap-mount/Makefile
new file mode 100644
index 0000000..9975544
--- /dev/null
+++ b/tools/dbgap-mount/Makefile
@@ -0,0 +1,123 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+
+MODULE = tools/dbgap-mount
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ demo \
+ dbgap-mount-tool
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+ifeq (win,$(OS))
+ DOCAN_LIBS = -lDOKAN
+else
+ DOCAN_LIBS = -lfuse
+endif
+
+ifeq (mac,$(OS))
+ DOCAN_LIBS = -L/usr/local/lib -losxfuse
+endif
+
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# tag
+#
+tag: \
+ $(addsuffix _tag,$(ALL_TOOLS))
+
+.PHONY: tag $(addsuffix _tag,$(ALL_TOOLS))
+
+
+#-------------------------------------------------------------------------------
+# demo
+# test program for new XFS toy
+#
+ZDB_DEMO_SRC = \
+ demo
+
+ZDB_DEMO_OBJ = \
+ $(addsuffix .$(OBJX),$(ZDB_DEMO_SRC))
+
+ZDB_DEMO_LIB = -lkapp -stk-version -lncbi-vdb -lxfs $(DOCAN_LIBS)
+
+$(BINDIR)/demo: $(ZDB_DEMO_OBJ)
+ @echo $(TOP)
+ @echo $(OS)
+ @echo $(HOST_OS)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(ZDB_DEMO_LIB)
+
+demo_tag:
+ @ $(TOP)/build/tag-module.sh $(MODULE) demo $(ZDB_DEMO_OBJ)
+
+#-------------------------------------------------------------------------------
+# demo
+# test program for new XFS toy
+#
+ZDB_TOOL_SRC = \
+ wrap \
+ dbgap-mount-tool
+
+ZDB_TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(ZDB_TOOL_SRC))
+
+# ZDB_TOOL_LIB = -lkapp -lncbi-vdb -lxfs $(DOCAN_LIBS)
+ZDB_TOOL_LIB = -sxfs -skapp -stk-version -sncbi-vdb -skfg $(DOCAN_LIBS)
+
+$(BINDIR)/dbgap-mount-tool: $(ZDB_TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(ZDB_TOOL_LIB)
+
+dbgap-mount-tool_tag:
+ @ $(TOP)/build/tag-module.sh $(MODULE) dbgap-mount-tool $(ZDB_TOOL_OBJ)
+
diff --git a/tools/dbgap-mount/dbgap-mount-tool.c b/tools/dbgap-mount/dbgap-mount-tool.c
new file mode 100644
index 0000000..9fd797e
--- /dev/null
+++ b/tools/dbgap-mount/dbgap-mount-tool.c
@@ -0,0 +1,561 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h> /* KMain */
+#include <kapp/args.h> /* KMain */
+
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h> /* OUTMSG */
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <xfs/model.h>
+#include <xfs/node.h>
+#include <xfs/tree.h>
+#include <xfs/xfs.h>
+
+#include "dbgap-mount-tool.h"
+
+#include <sysalloc.h>
+#include <stdio.h>
+#include <string.h>
+
+/******************************************************************************/
+
+/*)))
+ \\\ Celebrity is here ...
+ (((*/
+
+XFS_EXTERN rc_t CC XFS_InitAll_MHR ( const char * ConfigFile );
+XFS_EXTERN rc_t CC XFS_DisposeAll_MHR ();
+
+static
+rc_t CC
+MakeModel (
+ struct XFSModel ** Model,
+ const char * ProjectId,
+ bool ReadOnly
+)
+{
+ rc_t RCt;
+ struct XFSModel * Mod;
+ struct XFSModelNode * ModNod;
+
+ RCt = 0;
+ Mod = NULL;
+
+ RCt = XFSModelFromScratch ( & Mod, NULL );
+ if ( RCt == 0 ) {
+ RCt = XFSModelAddRootNode ( Mod, "gap-project" );
+ if ( RCt == 0 ) {
+ ModNod = ( struct XFSModelNode * ) XFSModelRootNode ( Mod );
+ if ( ModNod == NULL ) {
+ RCt = XFS_RC ( rcInvalid );
+ }
+ else {
+ RCt = XFSModelNodeSetProperty (
+ ModNod,
+ XFS_MODEL_MODE,
+ ( ReadOnly
+ ? XFS_MODEL_MODE_RO
+ : XFS_MODEL_MODE_RW
+ )
+ );
+ if ( RCt == 0 ) {
+ RCt = XFSModelNodeSetProperty (
+ ModNod,
+ XFS_MODEL_PROJECTID,
+ ProjectId
+ );
+ if ( RCt == 0 ) {
+ * Model = Mod;
+ }
+ }
+
+ }
+ }
+ }
+
+ return RCt;
+}
+
+
+static
+rc_t CC
+DoFukan (
+ const char * ProjectId,
+ const char * MountPoint,
+ const char * LogFile,
+ const char * ProgName,
+ bool Daemonize,
+ bool ReadOnly
+)
+{
+ rc_t RCt;
+ struct XFSModel * TheModel;
+ struct XFSTree * TheTree;
+ struct XFSControl * TheControl;
+ char Lable [ 256 ];
+ size_t NumWr;
+
+ RCt = 0;
+ TheModel = NULL;
+ TheTree = NULL;
+ TheControl = NULL;
+ * Lable = 0;
+ NumWr = 0;
+
+ XFS_CAN ( ProjectId )
+ XFS_CAN ( MountPoint )
+
+
+ /* Some messages good to say
+ */
+ LogMsg ( klogInfo, "Start" );
+ pLogMsg ( klogInfo, "ProjectID: $(project)", "project=%s", ProjectId );
+ pLogMsg ( klogInfo, "MountPoint: $(point)", "point=%s", MountPoint );
+ if ( LogFile != NULL ) {
+ pLogMsg ( klogInfo, "LogFile: $(file)", "file=%s", LogFile );
+ }
+ pLogMsg ( klogInfo, "ReadOnly: $(ro)", "ro=%s", ( ReadOnly ? "true" : "false" ) );
+ pLogMsg ( klogInfo, "Daemonize: $(pokemon)", "pokemon=%s", ( Daemonize ? "true" : "false" ) );
+
+ /* Initializing all depots and heavy gunz
+ */
+ RCt = XFS_InitAll_MHR ( NULL );
+ pLogMsg ( klogDebug, "[XFS_InitAll_MHR][$(rc)]", "rc=%d", RCt );
+ if ( RCt == 0 ) {
+
+ RCt = MakeModel ( & TheModel, ProjectId, ReadOnly );
+ pLogMsg ( klogDebug, "[XFSModelMake][$(rc)]", "rc=%d", RCt );
+ if ( RCt == 0 ) {
+
+ RCt = XFSTreeMake ( TheModel, & TheTree );
+ pLogMsg ( klogDebug, "[XFSTreeMake][$(rc)]", "rc=%d", RCt );
+ if ( RCt == 0 ) {
+
+ RCt = XFSControlMake ( TheTree, & TheControl );
+ pLogMsg ( klogDebug, "[XFSControlMake][$(rc)]", "rc=%d", RCt );
+ if ( RCt == 0 ) {
+
+ XFSControlSetMountPoint ( TheControl, MountPoint );
+
+ RCt = string_printf (
+ Lable,
+ sizeof ( Lable ) - 1,
+ & NumWr,
+ "dbGaP(%s)",
+ ProjectId
+ );
+ XFSControlSetLabel ( TheControl, Lable );
+ if ( LogFile != NULL ) {
+ XFSControlSetLogFile ( TheControl, LogFile );
+ }
+ if ( Daemonize ) {
+ XFSControlDaemonize ( TheControl );
+ }
+
+ LogMsg ( klogDebug, "[XFSStart]" );
+ RCt = XFSStart ( TheControl );
+ pLogMsg ( klogDebug, "[XFSStart][$(rc)]", "rc=%d", RCt );
+ if ( RCt == 0 ) {
+ LogMsg ( klogDebug, "[XFSStop]" );
+ RCt = XFSStop ( TheControl );
+ pLogMsg ( klogDebug, "[XFSStop][$(rc)]", "rc=%d", RCt );
+ }
+ else {
+ LogErr ( klogFatal, RCt, "CRITICAL ERROR: Can not start MOUNTER" );
+ }
+ }
+
+ XFSControlDispose ( TheControl );
+
+ XFSTreeRelease ( TheTree );
+ }
+
+ XFSModelRelease ( TheModel );
+ }
+
+ XFS_DisposeAll_MHR ();
+
+ }
+
+ /* Another message good to say
+ */
+ LogMsg ( klogDebug, "[Exiting]" );
+
+ return RCt;
+} /* DoFukan () */
+
+static
+rc_t CC
+CheckParameters (
+ struct Args * TheArgs,
+ const char ** ProjectId,
+ const char ** MountPoint,
+ bool * ReadOnly
+)
+{
+ rc_t RCt;
+ uint32_t ParamCount;
+ uint32_t Idx;
+ const char * ParamValue;
+
+ RCt = 0;
+ ParamCount = 0;
+ Idx = 0;
+ ParamValue = NULL;
+
+ XFS_CSAN ( ProjectId )
+ XFS_CSAN ( MountPoint )
+ XFS_CSA ( ReadOnly, false )
+ XFS_CAN ( TheArgs )
+ XFS_CAN ( ProjectId )
+ XFS_CAN ( MountPoint )
+ XFS_CAN ( ReadOnly )
+
+ RCt = ArgsParamCount ( TheArgs, & ParamCount );
+ if ( RCt == 0 ) {
+ if ( ParamCount != 2 && ParamCount != 3 ) {
+ RCt = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcInsufficient );
+ }
+ else {
+ if ( ParamCount == 3 ) {
+ RCt = ArgsParamValue (
+ TheArgs,
+ Idx,
+ ( const void ** ) & ParamValue
+ );
+ if ( RCt == 0 ) {
+ if ( strcmp ( PARAM_RO, ParamValue ) == 0 ) {
+ * ReadOnly = true;
+ }
+ else {
+ if ( strcmp ( PARAM_RW, ParamValue ) == 0 ) {
+ * ReadOnly = false;
+ }
+ else {
+ RCt = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcAmbiguous );
+ }
+ }
+ }
+
+ Idx ++;
+ }
+
+ /* Next Param should be ProjectId
+ */
+ if ( RCt == 0 ) {
+ RCt = ArgsParamValue (
+ TheArgs,
+ Idx,
+ ( const void ** ) & ParamValue
+ );
+ if ( RCt == 0 ) {
+ * ProjectId = ParamValue;
+ }
+
+ Idx ++;
+ }
+
+ /* Next Param should be MountPoint
+ */
+ if ( RCt == 0 ) {
+ RCt = ArgsParamValue (
+ TheArgs,
+ Idx,
+ ( const void ** ) & ParamValue
+ );
+ if ( RCt == 0 ) {
+ * MountPoint = ParamValue;
+ }
+
+ Idx ++;
+ }
+ }
+ }
+
+ return RCt;
+} /* CheckParameters () */
+
+static
+rc_t CC
+CheckArgs (
+ struct Args * TheArgs,
+ const char ** LogFile,
+ const char ** ProgName,
+ bool * Daemonize
+)
+{
+ rc_t RCt;
+ const char * OptValue;
+ uint32_t OptCount;
+
+ RCt = 0;
+ OptValue = NULL;
+ OptCount = 0;
+
+ XFS_CSAN ( LogFile )
+ XFS_CSAN ( ProgName )
+ XFS_CSA ( Daemonize, false )
+ XFS_CAN ( TheArgs )
+ XFS_CAN ( LogFile )
+ XFS_CAN ( ProgName )
+ XFS_CAN ( Daemonize )
+
+ RCt = ArgsOptionCount ( TheArgs, OPT_LOGFILE, & OptCount );
+ if ( RCt == 0 && OptCount == 1 ) {
+ RCt = ArgsOptionValue (
+ TheArgs,
+ OPT_LOGFILE,
+ 0,
+ ( const void ** ) & OptValue
+ );
+ if ( RCt == 0 ) {
+ * LogFile = OptValue;
+ }
+ }
+
+ RCt = ArgsOptionCount ( TheArgs, OPT_DAEMONIZE, & OptCount );
+ if ( RCt == 0 ) {
+ * Daemonize = OptCount == 1;
+ }
+
+ RCt = ArgsProgram ( TheArgs, & OptValue, ProgName );
+
+ return RCt;
+} /* CheckArgs () */
+
+static
+rc_t CC
+RunApp ( struct Args * TheArgs )
+{
+ rc_t RCt;
+ const char * ProjectId;
+ const char * MountPoint;
+ const char * LogFile;
+ const char * ProgName;
+ bool ReadOnly;
+ bool Daemonize;
+
+ RCt = 0;
+ ProjectId = NULL;
+ MountPoint = NULL;
+ LogFile = NULL;
+ ProgName = NULL;
+ ReadOnly = false;
+ Daemonize = false;
+
+ XFS_CAN ( TheArgs )
+
+
+
+ /* First we are checking parameters
+ */
+ RCt = CheckParameters (
+ TheArgs,
+ & ProjectId,
+ & MountPoint,
+ & ReadOnly
+ );
+
+ if ( RCt == 0 ) {
+ /* Second we are checking Arguments
+ */
+ RCt = CheckArgs ( TheArgs, & LogFile, & ProgName, & Daemonize );
+ }
+
+ if ( RCt != 0 ) {
+ UsageSummary ( ProgName == NULL ? UsageDefaultName : ProgName );
+ }
+ else {
+ RCt = DoFukan (
+ ProjectId,
+ MountPoint,
+ LogFile,
+ ProgName,
+ Daemonize,
+ ReadOnly
+ );
+ }
+
+ return RCt;
+} /* RunApp () */
+
+static
+rc_t CC
+DoUnmount ( const char * MountPoint )
+{
+ rc_t RCt;
+
+ RCt = 0;
+
+ XFS_CAN ( MountPoint )
+
+ pLogMsg ( klogDebug, "[DoUnmount] [$(point)]", "point=%s", MountPoint );
+
+ XFSUnmountAndDestroy ( MountPoint );
+
+ return RCt;
+} /* DoUnmount () */
+
+/*)))
+ \\\ KApp and Options ...
+ (((*/
+
+struct OptDef ToolOpts [] = {
+ { OPT_DAEMONIZE, ALS_DAEMONIZE, NULL, UsgDaemonize, 1, false, false },
+ { OPT_LOGFILE, ALS_LOGFILE, NULL, UsgLogFile, 1, true, false },
+ { OPT_UNMOUNT, ALS_UNMOUNT, NULL, UsgUnmount, 1, true, false }
+}; /* OptDef */
+
+const char UsageDefaultName[] = "dbgap-mount-tool";
+
+rc_t CC
+UsageSummary ( const char * ProgName )
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options]"
+ " [%s|%s]"
+ " <project-id>"
+ " <mount-point>"
+ "\n"
+ "Or:\n"
+ " %s [options] [unmount-options]"
+ "\n"
+ "\n",
+ ProgName,
+ PARAM_RO,
+ PARAM_RW,
+ ProgName
+ );
+} /* UsageSummary () */
+
+rc_t CC
+Usage ( const struct Args * TheArgs )
+{
+ rc_t RCt;
+ const char * ProgName;
+ const char * FullPath;
+
+ RCt = 0;
+ ProgName = NULL;
+ FullPath = NULL;
+
+ if ( TheArgs == NULL ) {
+ RCt = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ }
+ else {
+ RCt = ArgsProgram ( TheArgs, & FullPath, & ProgName );
+ }
+
+ if ( RCt != 0 ) {
+ ProgName = FullPath = UsageDefaultName;
+ }
+
+ UsageSummary ( ProgName );
+
+ KOutMsg ( "Options:\n" );
+
+ HelpOptionLine (
+ ALS_DAEMONIZE,
+ OPT_DAEMONIZE,
+ PRM_DAEMONIZE,
+ UsgDaemonize
+ );
+
+ HelpOptionLine (
+ ALS_LOGFILE,
+ OPT_LOGFILE,
+ PRM_LOGFILE,
+ UsgLogFile
+ );
+
+ KOutMsg ( "\n" );
+
+ KOutMsg ( "Unmount Options:\n" );
+
+ HelpOptionLine (
+ ALS_UNMOUNT,
+ OPT_UNMOUNT,
+ PRM_UNMOUNT,
+ UsgUnmount
+ );
+
+ KOutMsg ( "\n" );
+ KOutMsg ( "Standard Options:\n" );
+ HelpOptionsStandard ();
+ HelpVersion ( FullPath, KAppVersion () );
+
+ return RCt;
+} /* Usage () */
+
+rc_t CC
+KMain ( int ArgC, char * ArgV [] )
+{
+ rc_t RCt;
+ struct Args * TheArgs;
+ const char * MountPoint;
+
+ RCt = 0;
+ TheArgs = NULL;
+
+ RCt = ArgsMakeAndHandle (
+ & TheArgs,
+ ArgC,
+ ArgV,
+ 1,
+ ToolOpts,
+ sizeof ( ToolOpts ) / sizeof ( OptDef )
+ );
+ if ( RCt == 0 ) {
+ /* First we do check if that is unmount command
+ */
+ RCt = ArgsOptionValue (
+ TheArgs,
+ OPT_UNMOUNT,
+ 0,
+ ( const void ** ) & MountPoint
+ );
+ if ( RCt != 0 ) {
+ RCt = WrapIt ( TheArgs, RunApp );
+ }
+ else {
+ RCt = DoUnmount ( MountPoint );
+ }
+
+ ArgsWhack ( TheArgs );
+ }
+
+ return RCt;
+}
diff --git a/tools/dbgap-mount/dbgap-mount-tool.h b/tools/dbgap-mount/dbgap-mount-tool.h
new file mode 100644
index 0000000..c0ef3c6
--- /dev/null
+++ b/tools/dbgap-mount/dbgap-mount-tool.h
@@ -0,0 +1,72 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _mount_tool_h_
+#define _mount_tool_h_
+
+#include <xfs/xfs-defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*)))
+ ||| Log init/dispose
+(((*/
+
+XFS_EXTERN rc_t CC WrapIt (
+ struct Args * TheArgs,
+ rc_t ( CC * runner ) ( struct Args * TheArgs )
+ );
+
+/*)))
+ \\\ Argumends ... raznye
+ (((*/
+#define OPT_DAEMONIZE "daemonize"
+#define ALS_DAEMONIZE "d"
+#define PRM_DAEMONIZE NULL
+static const char * UsgDaemonize [] = { "Run tool as a daemon", NULL };
+
+#define OPT_LOGFILE "log-file"
+#define ALS_LOGFILE "l"
+#define PRM_LOGFILE "log-file-path"
+static const char * UsgLogFile [] = { "Log file", NULL };
+
+#define OPT_UNMOUNT "unmount"
+#define ALS_UNMOUNT "u"
+#define PRM_UNMOUNT "mount-point"
+static const char * UsgUnmount [] = { "Unmount", NULL };
+
+#define PARAM_RO "ro"
+#define PARAM_RW "rw"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _mount_tool_h_ */
diff --git a/tools/dbgap-mount/demo.c b/tools/dbgap-mount/demo.c
new file mode 100644
index 0000000..0aed2cc
--- /dev/null
+++ b/tools/dbgap-mount/demo.c
@@ -0,0 +1,353 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+#include <kapp/main.h> /* KMain */
+
+#include <klib/text.h>
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/refcount.h>
+#include <klib/rc.h>
+#include <klib/time.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <xfs/model.h>
+#include <xfs/node.h>
+#include <xfs/tree.h>
+#include <xfs/xfs.h>
+
+#include <stdio.h>
+#include <string.h>
+
+/******************************************************************************/
+
+
+#ifdef JOJOBA
+
+static
+void
+SLEPOY ( int Sec )
+{
+
+printf ( "Sleeping %d seconds\n", Sec );
+KSleepMs ( Sec * 1000 );
+
+printf ( " DONE [ Sleeping %d seconds ]\n", Sec );
+
+}
+
+#endif /* JOJOBA */
+
+XFS_EXTERN rc_t CC XFS_InitAll_MHR ( const char * ConfigFile );
+XFS_EXTERN rc_t CC XFS_DisposeAll_MHR ();
+
+static
+rc_t
+MakeModel (
+ struct XFSModel ** Model,
+ const char * ProjectId,
+ bool ReadOnly
+)
+{
+ rc_t RCt;
+ struct XFSModel * Mod;
+ struct XFSModelNode * ModNod;
+
+ RCt = 0;
+ Mod = NULL;
+
+ RCt = XFSModelFromScratch ( & Mod, NULL );
+ if ( RCt == 0 ) {
+ RCt = XFSModelAddRootNode ( Mod, "gap-project" );
+ if ( RCt == 0 ) {
+ ModNod = ( struct XFSModelNode * ) XFSModelRootNode ( Mod );
+ if ( ModNod == NULL ) {
+ RCt = XFS_RC ( rcInvalid );
+ }
+ else {
+ RCt = XFSModelNodeSetProperty (
+ ModNod,
+ XFS_MODEL_MODE,
+ ( ReadOnly
+ ? XFS_MODEL_MODE_RO
+ : XFS_MODEL_MODE_RW
+ )
+ );
+ if ( RCt == 0 ) {
+ RCt = XFSModelNodeSetProperty (
+ ModNod,
+ XFS_MODEL_PROJECTID,
+ ProjectId
+ );
+ if ( RCt == 0 ) {
+ * Model = Mod;
+ }
+ }
+
+ }
+ }
+ }
+
+ return RCt;
+}
+
+
+static
+rc_t run (
+ const char * ProjectId,
+ const char * MountPoint,
+ bool ReadOnly,
+ bool Daemonize
+)
+{
+ rc_t RCt;
+ struct XFSModel * TheModel;
+ struct XFSTree * TheTree;
+ struct XFSControl * TheControl;
+
+ RCt = 0;
+ TheModel = NULL;
+ TheTree = NULL;
+ TheControl = NULL;
+
+ OUTMSG ( ( "<<--- run()\n" ) );
+
+ XFS_InitAll_MHR ( NULL );
+
+ RCt = MakeModel ( & TheModel, ProjectId, ReadOnly );
+
+ printf ( "HA(XFSModelMake)[RC=%d]\n", RCt );
+
+ if ( RCt == 0 ) {
+ RCt = XFSTreeMake ( TheModel, & TheTree );
+
+ printf ( "HA(XFSTreeMake)[RC=%d]\n", RCt );
+
+ if ( RCt == 0 ) {
+ printf ( "HA(XFSControlMake)[RC=%d]\n", RCt );
+
+ RCt = XFSControlMake ( TheTree, & TheControl );
+ printf ( "HE(XFSControlMake)[0x%p][RC=%d]\n", ( void * ) TheControl, RCt );
+
+ if ( RCt == 0 ) {
+
+ XFSControlSetMountPoint ( TheControl, MountPoint );
+ XFSControlSetLabel ( TheControl, "Olaffsen" );
+ XFSControlSetLogFile ( TheControl, NULL );
+
+ if ( ! Daemonize ) {
+ XFSControlSetArg ( TheControl, "-f", "-f" );
+ }
+
+ printf ( "HA(XFSStart)\n" );
+ RCt = XFSStart ( TheControl );
+
+ printf ( "HE(XFSStart)[RC=%d]\n", RCt );
+ if ( RCt == 0 ) {
+ printf ( "HA(XFSStop)\n" );
+ RCt = XFSStop ( TheControl );
+ printf ( "HE(XFSStop)[RC=%d]\n", RCt );
+ }
+ else {
+ printf ( "Can not start FUSE\n" );
+ }
+ }
+
+ XFSControlDispose ( TheControl );
+
+ XFSTreeRelease ( TheTree );
+ }
+
+ XFSModelRelease ( TheModel );
+ }
+
+ XFS_DisposeAll_MHR ();
+
+ OUTMSG ( ( "--->> run()\n" ) );
+
+ return RCt;
+}
+
+/* Here I will temporarily parce arguments, and will attach
+ * toolkit ones later ... test program :)
+ */
+char ProgramName[333];
+char ProjectId [33];
+int ProjectIdInt = 0;
+char MountPoint[333];
+bool ReadOnly = true;
+bool Daemonize = false;
+bool LogToFile = false;
+char LogFile [ 777 ];
+
+#define RO_TAG "ro"
+#define RW_TAG "rw"
+#define DM_TAG "-d"
+
+#define LF_TAG "-l"
+
+static
+void
+RightUsage()
+{
+ printf("\ndbGaP mount tool demo program. Will mount and show content of cart files\n");
+ printf("\nUsage: %s [%s|%s] [%s log_file] [%s] project_id mount_point\n\n\
+Where:\n\
+ project_id - usually integer greater that zero and less than twelve\n\
+ %s - mount in read only mode\n\
+ %s - mount in read-write mode\n\
+ %s - run mounter as daemon\n\
+ mount_point - point to mount\n\
+ log_file - file to log logs\n\
+\n\n", ProgramName, RO_TAG, RW_TAG, LF_TAG, DM_TAG, RO_TAG, RW_TAG, DM_TAG );
+} /* RightUsage() */
+
+static
+bool
+ParseArgs ( int argc, char ** argv )
+{
+ const char * PPU;
+ const char * Arg;
+ int llp;
+
+ Arg = NULL;
+ llp = 0;
+ * ProgramName = 0;
+ * ProjectId = 0;
+ ProjectIdInt = 0;
+ * MountPoint = 0;
+
+ ReadOnly = true;
+ Daemonize = false;
+
+ /* Herer wer arer extractingr programr namer
+ */
+ PPU = strrchr ( * argv, '/' );
+ if ( PPU == NULL ) {
+ PPU = * argv;
+ }
+ else {
+ PPU ++;
+ }
+ strcpy ( ProgramName, PPU );
+
+ /* Herer shouldr ber atr leastr oner argumentr - projectr idr
+ */
+ if ( argc <= 2 ) {
+ printf ( "ERROR : too few arguments\n" );
+ return false;
+ }
+
+ llp = 1;
+ Arg = * ( argv + llp );
+
+ /* firstr paramr couldr ber "ro|rw" orr "-d"
+ */
+ if ( strcmp ( Arg, RO_TAG ) == 0 ) {
+ ReadOnly = true;
+
+ llp ++;
+ }
+ else {
+ ReadOnly = false;
+ if ( strcmp ( Arg, RW_TAG ) == 0 ) {
+
+ llp ++;
+ }
+ }
+
+ /* secondr paramr "-d" orr projectr idr
+ */
+ if ( argc <= llp ) {
+ printf ( "ERROR : too few arguments\n" );
+ return false;
+ }
+ Arg = * ( argv + llp );
+ if ( strcmp ( Arg, DM_TAG ) == 0 ) {
+ Daemonize = true;
+
+ llp ++;
+ }
+
+ /* andr nowr itr isr projectr idr
+ */
+ if ( argc <= llp ) {
+ printf ( "ERROR : too few arguments\n" );
+ return false;
+ }
+ Arg = * ( argv + llp );
+ strcpy ( ProjectId, Arg );
+ /* checkr thatr integerr
+ */
+ ProjectIdInt = atol ( ProjectId );
+ if ( ProjectIdInt <= 0 ) {
+ printf ( "ERROR : invalid project_id '%s'\n", ProjectId );
+ return false;
+ }
+ llp ++;
+
+
+ /* mountr pointr ifr existsr
+ */
+ if ( llp < argc ) {
+ Arg = * ( argv + llp );
+ strcpy ( MountPoint, Arg );
+ llp ++;
+ }
+
+ printf ( "PrI [%d]\n", ProjectIdInt );
+ printf ( "MnP [%s]\n", MountPoint );
+
+
+ return true;
+} /* ParseArgs() */
+
+
+const char UsageDefaultName[] = "Henri Fuseli";
+rc_t CC UsageSummary (const char* progname) { return 0; }
+rc_t CC Usage ( const Args * args ) { return 0; }
+
+rc_t CC KMain(int argc, char *argv[]) {
+
+ // KLogLevelSet ( klogInfo );
+ KLogLevelSet ( klogDebug );
+ // XFSLogInit ( "log.log" );
+
+ if ( ! ParseArgs ( argc, argv ) ) {
+ RightUsage();
+ return 1;
+ }
+
+ return run (
+ ProjectId,
+ MountPoint,
+ ReadOnly,
+ Daemonize
+ );
+}
diff --git a/tools/dbgap-mount/demo.mkfg b/tools/dbgap-mount/demo.mkfg
new file mode 100755
index 0000000..66ab293
--- /dev/null
+++ b/tools/dbgap-mount/demo.mkfg
@@ -0,0 +1,47 @@
+## There is description of Test model
+
+root/type="simple-container"
+root/security="r-xr-xr-x"
+root/children="project,workspace,data"
+
+project/label="Project"
+project/type="kart-collection"
+project/source="/panfs/pan1/trace_work/iskhakov/Tests/dbGaP/data/Project"
+project/security="r-xr-xr-x"
+
+workspace/label="EncryptedWorkspace"
+workspace/type="workspace"
+workspace/security="rwxrwxr-x"
+workspace/source="/panfs/pan1/trace_work/iskhakov/Tests/dbGaP/data/ENC"
+workspace/password="aaa"
+workspace/enctype="AES128"
+
+data/label="Data"
+data/type="simple-container"
+data/children="remote,dir,tar,encfile"
+
+remote/label="RemoteRepository"
+remote/type="remote-repository"
+remote/source="http://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant"
+remote/security="r-xr-xr-x"
+
+dir/label="MirroredDirectory"
+dir/type="directory"
+dir/source="/home/iskhakov/HLAM/"
+dir/security="rwxr-xr-x"
+
+tar/label="TarArchive"
+tar/type="tar-archive"
+tar/source="/home/iskhakov/HLAM/mumu.tar"
+
+readme/label="README.txt"
+readme/type="readme"
+help/text="File was automatically generated"
+help/security="r-xr--r--"
+
+encfile/label="iFILE.txt"
+encfile/type="encrypted-file"
+encfile/source="/home/iskhakov/HLAM/HURI.txt.ncbi_enc"
+encfile/security="r--r--r--"
+encfile/password="aaa"
+encfile/enctype="AES128"
diff --git a/tools/dbgap-mount/unix/wrap.c b/tools/dbgap-mount/unix/wrap.c
new file mode 100644
index 0000000..f89944f
--- /dev/null
+++ b/tools/dbgap-mount/unix/wrap.c
@@ -0,0 +1,44 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/args.h> /* KMain */
+#include <xfs/xfs-defs.h>
+
+#include <sysalloc.h>
+
+
+/* By default should call DoFukan ()
+ */
+LIB_EXPORT
+rc_t CC
+WrapIt (
+ struct Args * TheArgs,
+ rc_t ( CC * runner ) ( struct Args * TheArgs )
+)
+{
+ XFS_CAN ( TheArgs )
+ XFS_CAN ( runner )
+ return runner ( TheArgs );
+} /* WrapIt () */
diff --git a/tools/dbgap-mount/win/wrap.c b/tools/dbgap-mount/win/wrap.c
new file mode 100644
index 0000000..1554901
--- /dev/null
+++ b/tools/dbgap-mount/win/wrap.c
@@ -0,0 +1,344 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/args.h> /* KMain */
+
+#include <klib/text.h>
+#include <klib/out.h> /* OUTMSG */
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <xfs/xfs-defs.h>
+#include <xfs/xlog.h>
+
+#include "../dbgap-mount-tool.h"
+
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* There is some inconvinience. Before KMain is called, some filthy
+ * converts all cool WCHAR paths to uncool linux-style char paths
+ * so we had to go throught all parameters and regenerate command
+ * line with converting into path everything what looks like a path.
+ * or ... what starts with \
+ */
+
+static
+rc_t CC
+_CharToWChar ( WCHAR * Buf, size_t BufSz, const char * Str )
+{
+ XFS_CAN ( Str )
+ XFS_CAN ( Buf )
+
+
+ return mbstowcs ( Buf, Str, strlen ( Str ) ) == - 1
+ ? XFS_RC ( rcInvalid )
+ : 0
+ ;
+} /* _CharToWChar () */
+
+LIB_EXPORT
+rc_t CC
+XFSPathInnerToNative (
+ WCHAR * NativePathBuffer,
+ size_t NativePathBufferSize,
+ const char * InnerPath,
+ ...
+ );
+
+static
+rc_t CC
+_CheckConvert ( const char * Str, WCHAR * Buf, size_t BufSz )
+{
+ rc_t RCt = 0;
+
+ XFS_CAN ( Str )
+ XFS_CAN ( Buf )
+
+ if ( * Str == '/' || ( * Str == '.' && * ( Str + 1 ) == '/' ) ) {
+ /* That is candidate for a path */
+ RCt = XFSPathInnerToNative ( Buf, BufSz, Str );
+ }
+ else {
+ /* Just converting to WCHAR */
+ RCt = _CharToWChar ( Buf, BufSz, Str );
+ }
+
+ return RCt;
+} /* _CheckConvert () */
+
+static
+bool CC
+_IsDaemonizeToken ( const char * Param )
+{
+ const char * Str = Param;
+
+ if ( Str != NULL ) {
+ if ( * Str == '-' ) {
+ Str ++;
+ if ( * Str == '-' ) {
+ Str ++;
+ return strcmp ( Str, OPT_DAEMONIZE ) == 0;
+ }
+ else {
+ return strcmp ( Str, ALS_DAEMONIZE ) == 0;
+ }
+ }
+ }
+
+ return false;
+} /* _IsDaemonizeToken () */
+
+static
+rc_t CC
+_MakeCommandString (
+ struct Args * TheArgs,
+ WCHAR ** Str,
+ WCHAR ** Prog
+)
+{
+ rc_t RCt;
+ uint32_t Cnt;
+ uint32_t Idx;
+ const char * Val;
+ WCHAR BF [ 4096 ];
+ WCHAR BF1 [ 1096 ];
+
+ RCt = 0;
+ Cnt = 0;
+ Idx = 0;
+ Val = NULL;
+ * BF = 0;
+ * BF1 = 0;
+
+ XFS_CSAN ( Str )
+ XFS_CAN ( TheArgs )
+ XFS_CAN ( Str )
+
+ RCt = ArgsArgvCount ( TheArgs, & Cnt );
+ if ( RCt == 0 ) {
+ for ( Idx = 0; Idx < Cnt; Idx ++ ) {
+ ZeroMemory ( BF1, sizeof ( BF1 ) );
+
+ RCt = ArgsArgvValue ( TheArgs, Idx, & Val );
+ if ( RCt != 0 ) {
+ break;
+ }
+
+ if ( _IsDaemonizeToken ( Val ) ) {
+ continue;
+ }
+
+ RCt = _CheckConvert ( Val, BF1, sizeof ( BF1 ) );
+ if ( RCt != 0 ) {
+ break;
+ }
+
+ if ( 0 < Idx ) {
+ wcscat ( BF, L" " );
+ }
+ wcscat ( BF, BF1 );
+ }
+ }
+
+ if ( RCt == 0 ) {
+ ZeroMemory ( BF1, sizeof ( BF1 ) );
+ RCt = ArgsArgvValue ( TheArgs, 0, & Val );
+ if ( RCt == 0 ) {
+ RCt = _CheckConvert ( Val, BF1, sizeof ( BF1 ) );
+ }
+ }
+
+ * Str = _wcsdup ( BF );
+ * Prog = _wcsdup ( BF1 );
+
+ if ( * Str == NULL || * Prog == NULL ) {
+ RCt = XFS_RC ( rcExhausted );
+
+ if ( * Str != NULL ) {
+ free ( * Str );
+ * Str = NULL;
+ }
+
+ if ( * Prog != NULL ) {
+ free ( * Prog );
+ * Prog = NULL;
+ }
+ }
+
+ return 0;
+} /* _MakeCommandString () */
+
+static
+rc_t CC
+_CreateDetached ( LPCTSTR AppName, LPTSTR Cmd )
+{
+ rc_t RCt;
+ BOOL Ret;
+ STARTUPINFO StartInfo;
+ PROCESS_INFORMATION Process;
+ int Err;
+
+ RCt = 0;
+ Ret = FALSE;
+ ZeroMemory ( & StartInfo, sizeof( StartInfo ) );
+ ZeroMemory ( & Process, sizeof( Process ) );
+ Err = 0;
+
+ Ret = CreateProcessW (
+ AppName, // application name
+ Cmd, // command line
+ NULL, // process attributes
+ NULL, // trhead attributes
+ FALSE, // no file handler inheritance
+ DETACHED_PROCESS, // Creation Flags
+ NULL, // Inherit environment
+ NULL, // Inherit CWD
+ & StartInfo, // Startup Info
+ & Process // Process Information
+ );
+ if ( Ret == FALSE ) {
+ Err = GetLastError ();
+ wprintf ( L"CRITICAL ERROR: Can not run in background [%s] Error[%d]\n", AppName, Err );
+ RCt = XFS_RC ( rcInvalid );
+ }
+ else {
+ wprintf ( L"RUN DETACHED\n" );
+ }
+
+ return RCt;
+} /* _CreateDetached () */
+
+static
+rc_t CC
+RunDaemon ( struct Args * TheArgs )
+{
+ rc_t RCt;
+ WCHAR * CmdLine;
+ WCHAR * ProgName;
+
+ RCt = 0;
+ CmdLine = NULL;
+ ProgName = NULL;
+
+ RCt = _MakeCommandString ( TheArgs, & CmdLine, & ProgName );
+ if ( RCt == 0 ) {
+ RCt = _CreateDetached ( ProgName, CmdLine );
+
+ free ( CmdLine );
+ free ( ProgName );
+ }
+
+ return 0;
+} /* RunDaemon () */
+
+static
+rc_t CC
+_SetLog ( struct Args * TheArgs )
+{
+ rc_t RCt;
+ const char * LogFile;
+ uint32_t OptCount;
+
+ RCt = 0;
+ LogFile = NULL;
+ OptCount = 0;
+
+ XFS_CAN ( TheArgs )
+
+ if ( TheArgs != NULL ) {
+ RCt = ArgsOptionCount ( TheArgs, OPT_LOGFILE, & OptCount );
+ if ( RCt == 0 && OptCount == 1 ) {
+ RCt = ArgsOptionValue (
+ TheArgs,
+ OPT_LOGFILE,
+ 0,
+ ( const void ** ) & LogFile
+ );
+ }
+ }
+
+ if ( RCt == 0 ) {
+ if ( LogFile != NULL ) {
+ printf ( "Log File [%s]\n", LogFile );
+ }
+ else {
+/*
+ printf ( "Log File [NULL]\n" );
+*/
+ }
+ RCt = XFSLogInit ( LogFile );
+ }
+
+ return RCt;
+} /* _SetLog () */
+
+/* By default should call DoFukan ()
+ */
+rc_t CC
+WrapIt (
+ struct Args * TheArgs,
+ rc_t ( CC * runner ) ( struct Args * TheArgs )
+)
+{
+ rc_t RCt;
+ uint32_t OptCount;
+
+ RCt = 0;
+ OptCount = 0;
+
+ XFS_CAN ( TheArgs );
+ XFS_CAN ( runner );
+
+ RCt = ArgsOptionCount ( TheArgs, OPT_DAEMONIZE, & OptCount );
+ if ( RCt == 0 ) {
+ if ( OptCount == 1 ) {
+ /* Here we are daemonizing
+ */
+ RCt = RunDaemon ( TheArgs );
+ }
+ else {
+ /* Setting log file
+ */
+ RCt = _SetLog ( TheArgs );
+ if ( RCt == 0 ) {
+ RCt = runner ( TheArgs );
+ }
+ else {
+ LogErr ( klogErr, RCt, "CRITICAL ERROR: Can not initialize log file" );
+ }
+ }
+ }
+
+ /* TODO : that is soo stupid - remove
+ */
+ return RCt;
+} /* WrapIt () */
diff --git a/tools/fastdump/.gitignore b/tools/fastdump/.gitignore
new file mode 100644
index 0000000..2d51571
--- /dev/null
+++ b/tools/fastdump/.gitignore
@@ -0,0 +1,3 @@
+lookup_bin.dat
+special.txt
+vdb_dump_special.txt
diff --git a/tools/fastdump/Makefile b/tools/fastdump/Makefile
new file mode 100644
index 0000000..f39d069
--- /dev/null
+++ b/tools/fastdump/Makefile
@@ -0,0 +1,89 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/fastdump
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ fastdump
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# fastdump
+#
+TOOL_SRC = \
+ helper \
+ index \
+ lookup_writer \
+ lookup_reader \
+ file_printer \
+ merge_sorter \
+ sorter \
+ cmn_iter \
+ raw_read_iter \
+ special_iter \
+ fastq_iter \
+ join \
+ fastdump
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+TOOL_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/fastdump: $(TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TOOL_LIB)
+
diff --git a/tools/fastdump/cmn_iter.c b/tools/fastdump/cmn_iter.c
new file mode 100644
index 0000000..e1c463c
--- /dev/null
+++ b/tools/fastdump/cmn_iter.c
@@ -0,0 +1,287 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cmn_iter.h"
+#include "helper.h"
+
+#include <klib/progressbar.h>
+#include <klib/out.h>
+#include <sra/sraschema.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+typedef struct cmn_iter
+{
+ const VDBManager * mgr;
+ VSchema * schema;
+ const VDatabase * db;
+ const VTable * tbl;
+ const VCursor * cursor;
+ const char * row_range;
+ struct num_gen * ranges;
+ const struct num_gen_iter * row_iter;
+ struct progressbar * progressbar;
+ uint64_t count;
+ int64_t first, row_id;
+} cmn_iter;
+
+
+void destroy_cmn_iter( struct cmn_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ if ( iter->progressbar != NULL )
+ destroy_progressbar( iter->progressbar );
+
+ if ( iter->row_iter != NULL ) num_gen_iterator_destroy( iter->row_iter );
+ if ( iter->ranges != NULL ) num_gen_destroy( iter->ranges );
+ if ( iter->cursor != NULL ) VCursorRelease( iter->cursor );
+ if ( iter->tbl != NULL ) VTableRelease( iter->tbl );
+ if ( iter->db != NULL ) VDatabaseRelease( iter->db );
+ if ( iter->schema != NULL ) VSchemaRelease( iter->schema );
+ if ( iter->mgr != NULL ) VDBManagerRelease( iter->mgr );
+ free( ( void * ) iter );
+ }
+}
+
+
+rc_t make_cmn_iter( cmn_params * params, const char * tblname, struct cmn_iter ** iter )
+{
+ rc_t rc = 0;
+ cmn_iter * i = calloc( 1, sizeof * i );
+ if ( i == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "make_cmn_iter.calloc( %d ) -> %R", ( sizeof * i ), rc );
+ }
+ else
+ {
+ rc = VDBManagerMakeRead( &i->mgr, params->dir );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.VDBManagerMakeRead() -> %R\n", rc );
+ else
+ {
+ rc = VDBManagerMakeSRASchema( i->mgr, &i->schema );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.VDBManagerMakeSRASchema() -> %R\n", rc );
+ else
+ {
+ rc = VDBManagerOpenDBRead( i->mgr, &i->db, i->schema, "%s", params->acc );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.VDBManagerOpenDBRead( '%s' ) -> %R\n", params->acc, rc );
+ else
+ {
+ rc = VDatabaseOpenTableRead( i->db, &i->tbl, "%s", tblname );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.VDBManagerOpenDBRead( '%s', '%s' ) -> %R\n", params->acc, tblname, rc );
+ else
+ {
+ rc = VTableCreateCachedCursorRead( i->tbl, &i->cursor, params->cursor_cache );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.VTableCreateCachedCursorRead() -> %R\n", rc );
+ else
+ {
+ if ( rc == 0 && params->show_progress )
+ make_progressbar( &i->progressbar, 2 );
+ i->row_range = params->row_range;
+ i->first = params->first;
+ i->count = params->count;
+
+ *iter = i;
+ }
+ }
+ }
+ }
+ }
+ }
+ if ( rc != 0 )
+ destroy_cmn_iter( i );
+ return rc;
+}
+
+
+rc_t cmn_iter_add_column( struct cmn_iter * iter, const char * name, uint32_t * id )
+{
+ return add_column( iter->cursor, name, id );
+}
+
+
+int64_t cmn_iter_row_id( const struct cmn_iter * iter )
+{
+ return iter->row_id;
+}
+
+
+uint64_t cmn_iter_row_count( struct cmn_iter * iter )
+{
+ uint64_t res = 0;
+ rc_t rc = num_gen_iterator_count( iter->row_iter, &res );
+ if ( rc != 0 )
+ ErrMsg( "make_cmn_iter.num_gen_iterator_count() -> %R\n", rc );
+ return res;
+}
+
+
+bool cmn_iter_next( struct cmn_iter * iter, rc_t * rc )
+{
+ bool res = num_gen_iterator_next( iter->row_iter, &iter->row_id, rc );
+ if ( res && iter->progressbar != NULL )
+ {
+ uint64_t percent = calc_percent( iter->count, iter->row_id, 2 );
+ update_progressbar( iter->progressbar, percent );
+ }
+ return res;
+}
+
+
+rc_t cmn_iter_range( struct cmn_iter * iter, uint32_t col_id )
+{
+ rc_t rc = VCursorOpen( iter->cursor );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.VCursorOpen() -> %R", rc );
+ else
+ {
+ rc = num_gen_make_sorted( &iter->ranges, true );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.num_gen_make_sorted() -> %R\n", rc );
+ else
+ {
+ if ( iter->row_range != NULL )
+ {
+ rc = num_gen_parse( iter->ranges, iter->row_range );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.num_gen_parse( %s ) -> %R\n", iter->row_range, rc );
+ }
+ else if ( iter->count > 0 )
+ {
+ rc = num_gen_add( iter->ranges, iter->first, iter->count );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.num_gen_add( %ld.%lu ) -> %R\n",
+ iter->first, iter->count, iter->row_range, rc );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorIdRange( iter->cursor, col_id, &iter->first, &iter->count );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.VCursorIdRange() -> %R", rc );
+ else
+ {
+ rc = make_row_iter( iter->ranges, iter->first, iter->count, &iter->row_iter );
+ if ( rc != 0 )
+ ErrMsg( "cmn_iter_range.make_row_iter( %s ) -> %R\n", iter->row_range, rc );
+ }
+ }
+ return rc;
+}
+
+
+rc_t cmn_read_uint64( struct cmn_iter * iter, uint32_t col_id, uint64_t *value )
+{
+ uint32_t elem_bits, boff, row_len;
+ const uint64_t * value_ptr;
+ rc_t rc = VCursorCellDataDirect( iter->cursor, iter->row_id, col_id, &elem_bits,
+ (const void **)&value_ptr, &boff, &row_len );
+ if ( rc != 0 )
+ ErrMsg( "VCursorCellDataDirect( #%ld ) -> %R\n", iter->row_id, rc );
+ else if ( elem_bits != 64 || boff != 0 || row_len < 1 )
+ {
+ ErrMsg( "row#%ld : bits=%d, boff=%d, len=%d\n", iter->row_id, elem_bits, boff, row_len );
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcRow, rcInvalid );
+ }
+ else
+ *value = *value_ptr;
+ return rc;
+}
+
+
+rc_t cmn_read_uint64_array( struct cmn_iter * iter, uint32_t col_id, uint64_t *value,
+ uint32_t num_values, uint32_t * values_read )
+{
+ uint32_t elem_bits, boff, row_len;
+ const uint64_t * value_ptr;
+ rc_t rc = VCursorCellDataDirect( iter->cursor, iter->row_id, col_id, &elem_bits,
+ (const void **)&value_ptr, &boff, &row_len );
+ if ( rc != 0 )
+ ErrMsg( "VCursorCellDataDirect( #%ld ) -> %R\n", iter->row_id, rc );
+ else if ( elem_bits != 64 || boff != 0 || row_len < 1 )
+ {
+ ErrMsg( "row#%ld : bits=%d, boff=%d, len=%d\n", iter->row_id, elem_bits, boff, row_len );
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcRow, rcInvalid );
+ }
+ else
+ {
+ if ( row_len > num_values ) row_len = num_values;
+ * values_read = row_len;
+ memmove( (void *)value, (void *)value_ptr, row_len * 8 );
+ }
+ return rc;
+}
+
+
+rc_t cmn_read_uint32( struct cmn_iter * iter, uint32_t col_id, uint32_t *value )
+{
+ uint32_t elem_bits, boff, row_len;
+ const uint32_t * value_ptr;
+ rc_t rc = VCursorCellDataDirect( iter->cursor, iter->row_id, col_id, &elem_bits,
+ (const void **)&value_ptr, &boff, &row_len );
+ if ( rc != 0 )
+ ErrMsg( "VCursorCellDataDirect( #%ld ) -> %R\n", iter->row_id, rc );
+ else if ( elem_bits != 32 || boff != 0 || row_len < 1 )
+ {
+ ErrMsg( "row#%ld : bits=%d, boff=%d, len=%d\n", iter->row_id, elem_bits, boff, row_len );
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcRow, rcInvalid );
+ }
+ else
+ *value = *value_ptr;
+ return rc;
+}
+
+rc_t cmn_read_String( struct cmn_iter * iter, uint32_t col_id, String *value )
+{
+ uint32_t elem_bits, boff;
+ rc_t rc = VCursorCellDataDirect( iter->cursor, iter->row_id, col_id, &elem_bits,
+ (const void **)&value->addr, &boff, &value->len );
+ if ( rc != 0 )
+ ErrMsg( "VCursorCellDataDirect( #%ld ) -> %R\n", iter->row_id, rc );
+ else if ( elem_bits != 8 || boff != 0 )
+ {
+ ErrMsg( "row#%ld : bits=%d, boff=%d, len=%d\n", iter->row_id, elem_bits, boff, value->len );
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcRow, rcInvalid );
+ }
+ else
+ value->size = value->len;
+ return rc;
+}
diff --git a/tools/fastdump/cmn_iter.h b/tools/fastdump/cmn_iter.h
new file mode 100644
index 0000000..a390b07
--- /dev/null
+++ b/tools/fastdump/cmn_iter.h
@@ -0,0 +1,82 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cmn_iter_
+#define _h_cmn_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+struct cmn_iter;
+
+typedef struct cmn_params
+{
+ KDirectory * dir;
+ const char * acc;
+ const char * row_range;
+ int64_t first;
+ uint64_t count;
+ size_t cursor_cache;
+ bool show_progress;
+ bool show_details;
+} cmn_params;
+
+void destroy_cmn_iter( struct cmn_iter * iter );
+
+rc_t make_cmn_iter( cmn_params * params, const char * tblname, struct cmn_iter ** iter );
+
+rc_t cmn_iter_add_column( struct cmn_iter * iter, const char * name, uint32_t * id );
+rc_t cmn_iter_range( struct cmn_iter * iter, uint32_t col_id );
+
+bool cmn_iter_next( struct cmn_iter * iter, rc_t * rc );
+int64_t cmn_iter_row_id( const struct cmn_iter * iter );
+
+uint64_t cmn_iter_row_count( struct cmn_iter * iter );
+
+rc_t cmn_read_uint64( struct cmn_iter * iter, uint32_t col_id, uint64_t *value );
+rc_t cmn_read_uint64_array( struct cmn_iter * iter, uint32_t col_id, uint64_t *value,
+ uint32_t num_values, uint32_t * values_read );
+rc_t cmn_read_uint32( struct cmn_iter * iter, uint32_t col_id, uint32_t *value );
+rc_t cmn_read_String( struct cmn_iter * iter, uint32_t col_id, String *value );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/fastdump.c b/tools/fastdump/fastdump.c
new file mode 100644
index 0000000..dc82fdb
--- /dev/null
+++ b/tools/fastdump/fastdump.c
@@ -0,0 +1,367 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cmn_iter.h"
+#include "file_printer.h"
+#include "raw_read_iter.h"
+#include "special_iter.h"
+#include "fastq_iter.h"
+#include "lookup_writer.h"
+#include "lookup_reader.h"
+#include "join.h"
+#include "sorter.h"
+#include "helper.h"
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <kfs/directory.h>
+#include <kproc/thread.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+static const char * lookup_usage[] = { "lookup file", NULL };
+#define OPTION_LOOKUP "lookup"
+#define ALIAS_LOOKUP "l"
+
+static const char * range_usage[] = { "row-range", NULL };
+#define OPTION_RANGE "range"
+#define ALIAS_RANGE "R"
+
+static const char * format_usage[] = { "format (special, fastq, lookup, default=special)", NULL };
+#define OPTION_FORMAT "format"
+#define ALIAS_FORMAT "f"
+
+static const char * output_usage[] = { "output-file", NULL };
+#define OPTION_OUTPUT "out"
+#define ALIAS_OUTPUT "o"
+
+static const char * progress_usage[] = { "show progress", NULL };
+#define OPTION_PROGRESS "progress"
+#define ALIAS_PROGRESS "p"
+
+static const char * bufsize_usage[] = { "size of file-buffer ( default=1MB )", NULL };
+#define OPTION_BUFSIZE "bufsize"
+#define ALIAS_BUFSIZE "b"
+
+static const char * curcache_usage[] = { "size of cursor-cache ( default=10MB )", NULL };
+#define OPTION_CURCACHE "curcache"
+#define ALIAS_CURCACHE "c"
+
+static const char * mem_usage[] = { "memory limit for sorting ( default=100MB )", NULL };
+#define OPTION_MEM "mem"
+#define ALIAS_MEM "m"
+
+static const char * temp_usage[] = { "where to put temp. files ( default=curr. dir )", NULL };
+#define OPTION_TEMP "temp"
+#define ALIAS_TEMP "t"
+
+static const char * threads_usage[] = { "how many thread ( default=1 )", NULL };
+#define OPTION_THREADS "threads"
+#define ALIAS_THREADS "e"
+
+static const char * index_usage[] = { "name of index-file", NULL };
+#define OPTION_INDEX "index"
+#define ALIAS_INDEX "i"
+
+static const char * detail_usage[] = { "print details", NULL };
+#define OPTION_DETAILS "details"
+#define ALIAS_DETAILS "x"
+
+OptDef ToolOptions[] =
+{
+ { OPTION_RANGE, ALIAS_RANGE, NULL, range_usage, 1, true, false },
+ { OPTION_LOOKUP, ALIAS_LOOKUP, NULL, lookup_usage, 1, true, false },
+ { OPTION_FORMAT, ALIAS_FORMAT, NULL, format_usage, 1, true, false },
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, false },
+ { OPTION_BUFSIZE, ALIAS_BUFSIZE, NULL, bufsize_usage, 1, true, false },
+ { OPTION_CURCACHE, ALIAS_CURCACHE, NULL, curcache_usage, 1, true, false },
+ { OPTION_MEM, ALIAS_MEM, NULL, mem_usage, 1, true, false },
+ { OPTION_TEMP, ALIAS_TEMP, NULL, temp_usage, 1, true, false },
+ { OPTION_THREADS, ALIAS_THREADS, NULL, threads_usage, 1, true, false },
+ { OPTION_INDEX, ALIAS_INDEX, NULL, index_usage, 1, true, false },
+ { OPTION_PROGRESS, ALIAS_PROGRESS, NULL, progress_usage, 1, false, false },
+ { OPTION_DETAILS, ALIAS_DETAILS, NULL, detail_usage, 1, false, false }
+};
+
+const char UsageDefaultName[] = "fastdump";
+
+rc_t CC UsageSummary( const char * progname )
+{
+ return KOutMsg( "\n"
+ "Usage:\n"
+ " %s <path> [options]\n"
+ "\n", progname );
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ rc_t rc;
+ uint32_t idx, count = ( sizeof ToolOptions ) / ( sizeof ToolOptions[ 0 ] );
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+
+ if ( args == NULL )
+ rc = RC( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary( progname );
+
+ KOutMsg( "Options:\n" );
+ for ( idx = 1; idx < count; ++idx ) /* start with 1, do not advertize row-range-option*/
+ HelpOptionLine( ToolOptions[ idx ].aliases, ToolOptions[ idx ].name, NULL, ToolOptions[ idx ].help );
+
+ HelpOptionsStandard();
+ HelpVersion( fullpath, KAppVersion() );
+ return rc;
+}
+
+/* -------------------------------------------------------------------------------------------- */
+
+typedef struct fd_ctx
+{
+ cmn_params cmn;
+ const char * lookup_filename;
+ const char * output_filename;
+ const char * index_filename;
+ const char * temp_path;
+ size_t buf_size, mem_limit;
+ uint64_t num_threads;
+} fd_ctx;
+
+
+static void init_sorter_params( const fd_ctx * fd_ctx, sorter_params * sp )
+{
+ sp->dir = fd_ctx->cmn.dir;
+ sp->acc = fd_ctx->cmn.acc;
+ sp->output_filename = fd_ctx->output_filename;
+ sp->index_filename = fd_ctx->index_filename;
+ sp->temp_path = fd_ctx->temp_path;
+ sp->src = NULL; /* sorter takes ownership! */
+ sp->prefix = 0;
+ sp->mem_limit = fd_ctx->mem_limit;
+ sp->buf_size = fd_ctx->buf_size;
+ sp->cursor_cache = fd_ctx->cmn.cursor_cache;
+ sp->sort_progress = NULL;
+ sp->num_threads = 0;
+ sp->show_progress = fd_ctx->cmn.show_progress;
+}
+
+/* --------------------------------------------------------------------------------------------
+ produce the lookup-table by iterating over the PRIMARY_ALIGNMENT - table:
+ --------------------------------------------------------------------------------------------
+ reading SEQ_SPOT_ID, SEQ_READ_ID and RAW_READ
+ SEQ_SPOT_ID and SEQ_READ_ID is merged into a 64-bit-key
+ RAW_READ is read as 4na-unpacked ( Schema does not provide 4na-packed for this column )
+ these key-pairs are temporarely stored in a KVector until a limit is reached
+ after that limit is reached they are writen sorted into the file-system as sub-files
+ this repeats until the requested row-range is exhausted ( row_range ... NULL -> all rows )
+ These sub-files are than merge-sorted into the final output-file.
+ This output-file is a binary data-file:
+ content: [KEY][RAW_READ]
+ KEY... 64-bit value as SEQ_SPOT_ID shifted left by 1 bit, zero-bit contains SEQ_READ_ID
+ RAW_READ... 16-bit binary-chunk-lenght, followed by n bytes of packed 4na
+-------------------------------------------------------------------------------------------- */
+static rc_t single_threaded_make_lookup( fd_ctx * fd_ctx )
+{
+ sorter_params sp;
+ struct raw_read_iter * iter;
+
+ init_sorter_params( fd_ctx, &sp );
+ rc_t rc = make_raw_read_iter( &fd_ctx->cmn, &iter );
+ if ( rc == 0 )
+ {
+ sp.src = iter; /* sorter takes ownership! */
+ rc = run_sorter( &sp ); /* sorter.c */
+ }
+ return rc;
+}
+
+
+static rc_t multi_threaded_make_lookup( fd_ctx * fd_ctx )
+{
+ sorter_params sp;
+
+ init_sorter_params( fd_ctx, &sp );
+ sp.num_threads = fd_ctx->num_threads;
+ return run_sorter_pool( &sp ); /* sorter.c */
+}
+
+
+/* --------------------------------------------------------------------------------------------
+ produce special-output ( SPOT_ID,READ,SPOT_GROUP ) by iterating over the SEQUENCE - table:
+ produce fastq-output by iterating over the SEQUENCE - table:
+ --------------------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------------------- */
+
+static rc_t perform_join( fd_ctx * fd_ctx, format_t fmt )
+{
+ rc_t rc = 0;
+ if ( !file_exists( fd_ctx->cmn.dir, "%s", fd_ctx->lookup_filename ) )
+ {
+ const char * temp = fd_ctx->output_filename;
+
+ if ( fd_ctx->cmn.show_progress )
+ KOutMsg( "lookup :" );
+
+ fd_ctx->output_filename = fd_ctx->lookup_filename;
+ if ( fd_ctx->num_threads > 1 )
+ rc = multi_threaded_make_lookup( fd_ctx );
+ else
+ rc = single_threaded_make_lookup( fd_ctx );
+
+ fd_ctx->output_filename = temp;
+ }
+
+ if ( rc == 0 )
+ {
+ join_params jp;
+
+ jp.dir = fd_ctx->cmn.dir;
+ jp.accession = fd_ctx->cmn.acc;
+ jp.lookup_filename = fd_ctx->lookup_filename;
+ jp.index_filename = fd_ctx->index_filename;
+ jp.output_filename = fd_ctx->output_filename;
+ jp.temp_path = fd_ctx->temp_path;
+ jp.join_progress = NULL;
+ jp.buf_size = fd_ctx->buf_size;
+ jp.cur_cache = fd_ctx->cmn.cursor_cache;
+ jp.show_progress = fd_ctx->cmn.show_progress;
+ jp.num_threads = fd_ctx->num_threads;
+ jp.first = 0;
+ jp.count = 0;
+ jp.fmt = fmt;
+
+ rc = execute_join( &jp ); /* join.c */
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------- */
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc;
+ Args * args;
+ uint32_t num_options = sizeof ToolOptions / sizeof ToolOptions [ 0 ];
+
+ rc = ArgsMakeAndHandle ( &args, argc, argv, 1, ToolOptions, num_options );
+ if ( rc != 0 )
+ ErrMsg( "ArgsMakeAndHandle() -> %R", rc );
+ if ( rc == 0 )
+ {
+ fd_ctx fd_ctx;
+ rc = ArgsParamValue( args, 0, (const void **)&fd_ctx.cmn.acc );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue() -> %R", rc );
+ else
+ {
+ const char * format = get_str_option( args, OPTION_FORMAT, NULL );
+ format_t fmt = get_format_t( format );
+ char dflt_lookup[ 4096 ];
+ char dflt_index[ 4096 ];
+ char dflt_output[ 4096 ];
+
+ dflt_lookup[ 0 ] = 0;
+ dflt_index[ 0 ] = 0;
+ dflt_output[ 0 ] = 0;
+
+ fd_ctx.cmn.row_range = get_str_option( args, OPTION_RANGE, NULL );
+ fd_ctx.cmn.cursor_cache = get_size_t_option( args, OPTION_CURCACHE, 5 * 1024 * 1024 );
+ fd_ctx.cmn.show_progress = get_bool_option( args, OPTION_PROGRESS );
+ fd_ctx.cmn.show_details = get_bool_option( args, OPTION_DETAILS );
+ fd_ctx.cmn.count = 0;
+
+ fd_ctx.temp_path = get_str_option( args, OPTION_TEMP, NULL );
+ fd_ctx.output_filename = get_str_option( args, OPTION_OUTPUT, NULL );
+ fd_ctx.lookup_filename = get_str_option( args, OPTION_LOOKUP, NULL );
+ fd_ctx.index_filename = get_str_option( args, OPTION_INDEX, NULL );
+ fd_ctx.buf_size = get_size_t_option( args, OPTION_BUFSIZE, 1024 * 1024 );
+ fd_ctx.mem_limit = get_size_t_option( args, OPTION_MEM, 1024L * 1024 * 100 );
+ fd_ctx.num_threads = get_uint64_t_option( args, OPTION_THREADS, 1 );
+
+ if ( fd_ctx.cmn.show_details )
+ {
+ KOutMsg( "cursor-cache : %ld\n", fd_ctx.cmn.cursor_cache );
+ KOutMsg( "buf-size : %ld\n", fd_ctx.buf_size );
+ KOutMsg( "mem-limit : %ld\n", fd_ctx.mem_limit );
+ KOutMsg( "threadsit : %d\n", fd_ctx.num_threads );
+ KOutMsg( "scratch-path : '%s'\n", fd_ctx.temp_path );
+ }
+
+ if ( fd_ctx.lookup_filename == NULL )
+ {
+ rc = make_prefixed( dflt_lookup, sizeof dflt_lookup, fd_ctx.temp_path,
+ fd_ctx.cmn.acc, ".lookup" );
+ if ( rc == 0 )
+ fd_ctx.lookup_filename = dflt_lookup;
+ }
+
+ if ( fd_ctx.index_filename == NULL )
+ {
+ rc = make_prefixed( dflt_index, sizeof dflt_index, fd_ctx.temp_path,
+ fd_ctx.cmn.acc, ".lookup.idx" );
+ if ( rc == 0 )
+ fd_ctx.index_filename = dflt_index;
+ }
+
+ if ( fd_ctx.output_filename == NULL )
+ {
+ rc = make_prefixed( dflt_output, sizeof dflt_output, NULL,
+ fd_ctx.cmn.acc, ".txt" );
+ if ( rc == 0 )
+ fd_ctx.output_filename = dflt_output;
+ }
+
+ rc = KDirectoryNativeDir( &fd_ctx.cmn.dir );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryNativeDir() -> %R", rc );
+ else
+ {
+ rc = perform_join( &fd_ctx, fmt );
+
+ if ( dflt_lookup[ 0 ] != 0 )
+ KDirectoryRemove( fd_ctx.cmn.dir, true, "%s", dflt_lookup );
+
+ if ( dflt_index[ 0 ] != 0 )
+ KDirectoryRemove( fd_ctx.cmn.dir, true, "%s", dflt_index );
+
+ KDirectoryRelease( fd_ctx.cmn.dir );
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/fastq_iter.c b/tools/fastdump/fastq_iter.c
new file mode 100644
index 0000000..1f1afc3
--- /dev/null
+++ b/tools/fastdump/fastq_iter.c
@@ -0,0 +1,97 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "fastq_iter.h"
+#include "helper.h"
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+typedef struct fastq_iter
+{
+ struct cmn_iter * cmn;
+ uint32_t prim_alig_id, cmp_read_id, quality_id;
+} fastq_iter;
+
+
+void destroy_fastq_iter( struct fastq_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ destroy_cmn_iter( iter->cmn );
+ free( ( void * ) iter );
+ }
+}
+
+rc_t make_fastq_iter( cmn_params * params, struct fastq_iter ** iter )
+{
+ rc_t rc = 0;
+ fastq_iter * i = calloc( 1, sizeof * i );
+ if ( i == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "make_fastq_iter.calloc( %d ) -> %R", ( sizeof * i ), rc );
+ }
+ else
+ {
+ rc = make_cmn_iter( params, "SEQUENCE", &i->cmn );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "PRIMARY_ALIGNMENT_ID", &i->prim_alig_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "CMP_READ", &i->cmp_read_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "(INSDC:quality:text:phred_33)QUALITY", &i->quality_id );
+ if ( rc == 0 )
+ rc = cmn_iter_range( i->cmn, i->prim_alig_id );
+
+ if ( rc != 0 )
+ destroy_fastq_iter( i );
+ else
+ *iter = i;
+ }
+ return rc;
+}
+
+bool get_from_fastq_iter( struct fastq_iter * iter, fastq_rec * rec, rc_t * rc )
+{
+ bool res = cmn_iter_next( iter->cmn, rc );
+ if ( res )
+ {
+ rec->row_id = cmn_iter_row_id( iter->cmn );
+ *rc = cmn_read_uint64_array( iter->cmn, iter->prim_alig_id, rec->prim_alig_id, 2, &rec->num_reads );
+ if ( *rc == 0 )
+ *rc = cmn_read_String( iter->cmn, iter->cmp_read_id, &rec->cmp_read );
+ if ( *rc == 0 )
+ *rc = cmn_read_String( iter->cmn, iter->quality_id, &rec->quality );
+ }
+ return res;
+
+}
+
+uint64_t get_row_count_of_fastq_iter( struct fastq_iter * iter )
+{
+ return cmn_iter_row_count( iter->cmn );
+}
diff --git a/tools/fastdump/fastq_iter.h b/tools/fastdump/fastq_iter.h
new file mode 100644
index 0000000..abc32a5
--- /dev/null
+++ b/tools/fastdump/fastq_iter.h
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_fastq_iter_
+#define _h_fastq_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_cmn_iter_
+#include "cmn_iter.h"
+#endif
+
+struct fastq_iter;
+
+typedef struct fastq_rec
+{
+ int64_t row_id;
+ uint64_t prim_alig_id[ 2 ];
+ uint32_t num_reads;
+ String cmp_read;
+ String quality;
+} fastq_rec;
+
+void destroy_fastq_iter( struct fastq_iter * iter );
+
+rc_t make_fastq_iter( cmn_params * params, struct fastq_iter ** iter );
+
+bool get_from_fastq_iter( struct fastq_iter * iter, fastq_rec * rec, rc_t * rc );
+
+uint64_t get_row_count_of_fastq_iter( struct fastq_iter * iter );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/file_printer.c b/tools/fastdump/file_printer.c
new file mode 100644
index 0000000..1e79216
--- /dev/null
+++ b/tools/fastdump/file_printer.c
@@ -0,0 +1,130 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "file_printer.h"
+#include "helper.h"
+
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+
+typedef struct file_printer
+{
+ struct KFile * f;
+ SBuffer print_buffer;
+ uint64_t file_pos;
+} file_printer;
+
+
+void destroy_file_printer( struct file_printer * printer )
+{
+ if ( printer != NULL )
+ {
+ if ( printer->f != NULL ) KFileRelease( printer->f );
+ release_SBuffer( &printer->print_buffer );
+ free( ( void * ) printer );
+ }
+}
+
+
+rc_t make_file_printer( KDirectory *dir, struct file_printer ** printer,
+ size_t file_buffer_size, size_t print_buffer_size, const char * fmt, ... )
+{
+ rc_t rc;
+ struct KFile * f;
+
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = KDirectoryVCreateFile( dir, &f, false, 0664, kcmInit, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryVCreateFile() -> %R", rc );
+ else
+ {
+ struct KFile * temp_file = f;
+ if ( file_buffer_size > 0 )
+ {
+ rc = KBufFileMakeWrite( &temp_file, f, false, file_buffer_size );
+ KFileRelease( f );
+ if ( rc != 0 )
+ ErrMsg( "KBufFileMakeWrite() -> %R", rc );
+ }
+ if ( rc == 0 )
+ {
+ file_printer * p = calloc( 1, sizeof * p );
+ if ( p == NULL )
+ {
+ KFileRelease( temp_file );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * p ), rc );
+ }
+ else
+ {
+ rc = make_SBuffer( &p->print_buffer, print_buffer_size );
+ if ( rc != 0 )
+ KFileRelease( temp_file );
+ else
+ {
+ p->f = temp_file;
+ *printer = p;
+ }
+ }
+ }
+ }
+
+ va_end ( args );
+ return rc;
+
+}
+
+
+rc_t file_print( struct file_printer * printer, const char * fmt, ... )
+{
+ rc_t rc;
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = print_to_SBufferV( &printer->print_buffer, fmt, args );
+ if ( rc == 0 )
+ {
+ size_t num_writ, to_write;
+ to_write = printer->print_buffer.S.size;
+ const char * src = printer->print_buffer.S.addr;
+ rc = KFileWriteAll( printer->f, printer->file_pos, src, to_write, &num_writ );
+ if ( rc != 0 )
+ ErrMsg( "KFileWriteAll( at %lu ) -> %R", printer->file_pos, rc );
+ else if ( num_writ != to_write )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
+ ErrMsg( "KFileWriteAll( at %lu ) ( %d vs %d ) -> %R", printer->file_pos, to_write, num_writ, rc );
+ }
+ else
+ printer->file_pos += num_writ;
+ }
+
+ va_end ( args );
+ return rc;
+}
diff --git a/tools/fastdump/file_printer.h b/tools/fastdump/file_printer.h
new file mode 100644
index 0000000..83b8fd3
--- /dev/null
+++ b/tools/fastdump/file_printer.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_file_printer_
+#define _h_file_printer_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+struct file_printer;
+
+void destroy_file_printer( struct file_printer * printer );
+
+rc_t make_file_printer( KDirectory *dir, struct file_printer ** printer,
+ size_t file_buffer_size, size_t print_buffer_size, const char * fmt, ... );
+
+rc_t file_print( struct file_printer * printer, const char * fmt, ... );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/helper.c b/tools/fastdump/helper.c
new file mode 100644
index 0000000..a5fd6ac
--- /dev/null
+++ b/tools/fastdump/helper.c
@@ -0,0 +1,673 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "helper.h"
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/progressbar.h>
+#include <klib/time.h>
+#include <klib/out.h>
+#include <kfs/defs.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kproc/thread.h>
+
+rc_t ErrMsg( const char * fmt, ... )
+{
+ rc_t rc;
+ char buffer[ 4096 ];
+ size_t num_writ;
+
+ va_list list;
+ va_start( list, fmt );
+ rc = string_vprintf( buffer, sizeof buffer, &num_writ, fmt, list );
+ if ( rc == 0 )
+ /* rc = KOutMsg( "%s\n", buffer ); */
+ /* rc = pLogErr( klogErr, 1, "$(E)", "E=%s", buffer ); */
+ rc = pLogMsg( klogErr, "$(E)", "E=%s", buffer );
+ va_end( list );
+ return rc;
+}
+
+rc_t CC ArgsOptionCount( const struct Args * self, const char * option_name, uint32_t * count );
+rc_t CC ArgsOptionValue( const struct Args * self, const char * option_name, uint32_t iteration, const void ** value );
+
+const char * get_str_option( const struct Args *args, const char *name, const char * dflt )
+{
+ const char* res = dflt;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void**)&res );
+ if ( rc != 0 ) res = dflt;
+ }
+ return res;
+}
+
+bool get_bool_option( const struct Args *args, const char *name )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ return ( rc == 0 && count > 0 );
+}
+
+
+uint64_t get_uint64_t_option( const struct Args * args, const char *name, uint64_t dflt )
+{
+ uint64_t res = dflt;
+ const char * s = get_str_option( args, name, NULL );
+ if ( s != NULL )
+ {
+ size_t l = string_size( s );
+ if ( l > 0 )
+ {
+ char * endptr;
+ res = strtol( s, &endptr, 0 );
+ }
+ }
+ return res;
+
+}
+
+size_t get_size_t_option( const struct Args * args, const char *name, size_t dflt )
+{
+ size_t res = dflt;
+ const char * s = get_str_option( args, name, NULL );
+ if ( s != NULL )
+ {
+ size_t l = string_size( s );
+ if ( l > 0 )
+ {
+ size_t multipl = 1;
+ switch( s[ l - 1 ] )
+ {
+ case 'k' :
+ case 'K' : multipl = 1024; break;
+ case 'm' :
+ case 'M' : multipl = 1024 * 1024; break;
+ case 'g' :
+ case 'G' : multipl = 1024 * 1024 * 1024; break;
+ }
+
+ if ( multipl > 1 )
+ {
+ char * src = string_dup( s, l - 1 );
+ if ( src != NULL )
+ {
+ char * endptr;
+ res = strtol( src, &endptr, 0 ) * multipl;
+ free( src );
+ }
+ }
+ else
+ {
+ char * endptr;
+ res = strtol( s, &endptr, 0 );
+ }
+ }
+ }
+ return res;
+}
+
+
+rc_t make_SBuffer( SBuffer * buffer, size_t len )
+{
+ rc_t rc = 0;
+ String * S = &buffer->S;
+ S->addr = malloc( len );
+ if ( S->addr == NULL )
+ {
+ S->size = S->len = 0;
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "malloc( %d ) -> %R", ( len ), rc );
+ }
+ else
+ {
+ S->size = 0;
+ S->len = 0;
+ buffer->buffer_size = len;
+ }
+ return rc;
+}
+
+
+void release_SBuffer( SBuffer * buffer )
+{
+ if ( buffer != NULL )
+ {
+ String * S = &buffer->S;
+ if ( S->addr != NULL )
+ free( ( void * ) S->addr );
+ }
+}
+
+
+rc_t print_to_SBufferV( SBuffer * buffer, const char * fmt, va_list args )
+{
+ char * dst = ( char * )buffer->S.addr;
+ size_t num_writ = 0;
+
+ rc_t rc = string_vprintf( dst, buffer->buffer_size, &num_writ, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "string_vprintf() -> %R", rc );
+ buffer->S.len = buffer->S.size = num_writ;
+
+ return rc;
+}
+
+
+rc_t print_to_SBuffer( SBuffer * buffer, const char * fmt, ... )
+{
+ rc_t rc;
+ va_list args;
+
+ va_start( args, fmt );
+ rc = print_to_SBufferV( buffer, fmt, args );
+ va_end( args );
+
+ return rc;
+}
+
+
+rc_t add_column( const VCursor * cursor, const char * name, uint32_t * id )
+{
+ rc_t rc = VCursorAddColumn( cursor, id, name );
+ if ( rc != 0 )
+ ErrMsg( "VCursorAddColumn( '%s' ) -> %R", name, rc );
+ return rc;
+}
+
+
+rc_t make_row_iter( struct num_gen * ranges, int64_t first, uint64_t count,
+ const struct num_gen_iter ** iter )
+{
+ rc_t rc;
+ if ( num_gen_empty( ranges ) )
+ {
+ rc = num_gen_add( ranges, first, count );
+ if ( rc != 0 )
+ ErrMsg( "num_gen_add( %li, %ld ) -> %R", first, count, rc );
+ }
+ else
+ {
+ rc = num_gen_trim( ranges, first, count );
+ if ( rc != 0 )
+ ErrMsg( "num_gen_trim( %li, %ld ) -> %R", first, count, rc );
+ }
+ rc = num_gen_iterator_make( ranges, iter );
+ if ( rc != 0 )
+ ErrMsg( "num_gen_iterator_make() -> %R", rc );
+ return rc;
+}
+
+
+rc_t split_string( String * in, String * p0, String * p1, uint32_t ch )
+{
+ rc_t rc = 0;
+ char * ch_ptr = string_chr( in->addr, in->size, ch );
+ if ( ch_ptr == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcTransfer, rcInvalid );
+ else
+ {
+ p0->addr = in->addr;
+ p0->len = p0->size = ( ch_ptr - p0->addr );
+ p1->addr = ch_ptr + 1;
+ p1->len = p1->size = in->len - ( p0->len + 1 );
+ }
+ return rc;
+}
+
+
+format_t get_format_t( const char * format )
+{
+ format_t res = ft_special;
+ if ( format != NULL && format[ 0 ] != 0 )
+ {
+ String Format, FastqFormat;
+ StringInitCString( &Format, format );
+ StringInitCString( &FastqFormat, "fastq" );
+ if ( 0 == StringCaseCompare ( &Format, &FastqFormat ) )
+ res = ft_fastq;
+ }
+ return res;
+}
+
+
+uint64_t make_key( int64_t seq_spot_id, uint32_t seq_read_id )
+{
+ uint64_t key = seq_spot_id;
+ key <<= 1;
+ key |= ( seq_read_id == 2 ) ? 1 : 0;
+ return key;
+}
+
+
+void pack_4na( const String * unpacked, SBuffer * packed )
+{
+ uint32_t i;
+ char * src = ( char * )unpacked->addr;
+ char * dst = ( char * )packed->S.addr;
+ uint16_t dna_len = ( unpacked->len & 0xFFFF );
+ uint32_t len = 0;
+ dst[ len++ ] = ( dna_len >> 8 );
+ dst[ len++ ] = ( dna_len & 0xFF );
+ for ( i = 0; i < unpacked->len; ++i )
+ {
+ if ( len < packed->buffer_size )
+ {
+ char base = ( src[ i ] & 0x0F );
+ if ( 0 == ( i & 0x01 ) )
+ dst[ len ] = ( base << 4 );
+ else
+ dst[ len++ ] |= base;
+ }
+ }
+ if ( unpacked->len & 0x01 )
+ len++;
+ packed->S.size = packed->S.len = len;
+}
+
+
+static char x4na_to_ASCII[ 16 ] =
+{
+ /* 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F */
+ 'N', 'A', 'C', 'N', 'G', 'N', 'N', 'N', 'T', 'N', 'N', 'N', 'N', 'N', 'N', 'N'
+};
+
+
+void unpack_4na( const String * packed, SBuffer * unpacked )
+{
+ uint32_t i;
+ char * src = ( char * )packed->addr;
+ char * dst = ( char * )unpacked->S.addr;
+ uint32_t dst_idx = 0;
+ uint16_t dna_len = src[ 0 ];
+ dna_len <<= 8;
+ dna_len |= src[ 1 ];
+ for ( i = 2; i < packed->len; ++i )
+ {
+ uint8_t packed_byte = src[ i ];
+ if ( dst_idx < unpacked->buffer_size )
+ dst[ dst_idx++ ] = x4na_to_ASCII[ ( packed_byte >> 4 ) & 0x0F ];
+ if ( dst_idx < unpacked->buffer_size )
+ dst[ dst_idx++ ] = x4na_to_ASCII[ packed_byte & 0x0F ];
+ }
+ unpacked->S.len = unpacked->S.size = dna_len;
+ dst[ dna_len + 2 ] = 0;
+}
+
+
+uint64_t calc_percent( uint64_t max, uint64_t value, uint16_t digits )
+{
+ uint64_t res = value;
+ switch ( digits )
+ {
+ case 1 : res *= 1000; break;
+ case 2 : res *= 10000; break;
+ default : res *= 100; break;
+ }
+ if ( max > 0 ) res /= max;
+ return res;
+}
+
+
+bool file_exists( const KDirectory * dir, const char * fmt, ... )
+{
+ uint32_t pt;
+ va_list list;
+
+ va_start( list, fmt );
+ pt = KDirectoryVPathType( dir, fmt, list );
+ va_end( list );
+
+ return ( pt == kptFile ) ;
+}
+
+
+void join_and_release_threads( Vector * threads )
+{
+ uint32_t i, n = VectorLength( threads );
+ for ( i = VectorStart( threads ); i < n; ++i )
+ {
+ KThread * thread = VectorGet( threads, i );
+ if ( thread != NULL )
+ {
+ KThreadWait( thread, NULL );
+ KThreadRelease( thread );
+ }
+ }
+}
+
+
+typedef struct cf_progress
+{
+ struct progressbar * progressbar;
+ uint64_t total_size;
+ uint64_t current_size;
+ uint32_t current_percent;
+} cf_progress;
+
+rc_t CC Quitting();
+
+static rc_t copy_file( KFile * dst, const KFile * src, uint64_t * dst_pos,
+ size_t buf_size, cf_progress * cfp )
+{
+ rc_t rc = 0;
+ char * buffer = malloc( buf_size );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcPacking, rcMemory, rcExhausted );
+ ErrMsg( "copy_file.malloc( %d ) -> %R", buf_size, rc );
+ }
+ else
+ {
+ uint64_t src_pos = 0;
+ size_t num_trans = 1;
+ while ( rc == 0 && num_trans > 0 )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ size_t num_read;
+ rc = KFileRead( src, src_pos, buffer, buf_size, &num_read );
+ if ( rc != 0 )
+ ErrMsg( "copy_file.KFileRead( at %lu ) -> %R", src_pos, rc );
+ else if ( num_read > 0 )
+ {
+ rc = KFileWrite( dst, *dst_pos, buffer, num_read, &num_trans );
+ if ( rc != 0 )
+ ErrMsg( "copy_file.KFileWrite( at %lu ) -> %R", *dst_pos, rc );
+ else
+ {
+ *dst_pos += num_trans;
+ src_pos += num_trans;
+ if ( cfp != NULL && cfp->progressbar != NULL )
+ {
+ uint32_t percent;
+
+ cfp->current_size += num_trans;
+ percent = calc_percent( cfp->total_size, cfp->current_size, 2 );
+ if ( percent > cfp->current_percent )
+ {
+ uint32_t i;
+ for ( i = cfp->current_percent + 1; i <= percent; ++i )
+ update_progressbar( cfp->progressbar, i );
+ cfp->current_percent = percent;
+ }
+ }
+ }
+ }
+ else
+ num_trans = 0;
+ }
+ }
+ free( buffer );
+ }
+ return rc;
+}
+
+
+static rc_t total_filesize( const KDirectory * dir, const VNamelist * files, uint64_t *total )
+{
+ uint32_t count;
+ rc_t rc = VNameListCount( files, &count );
+ *total = 0;
+ if ( rc != 0 )
+ ErrMsg( "VNameListCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * filename;
+ rc = VNameListGet( files, idx, &filename );
+ if ( rc != 0 )
+ ErrMsg( "VNameListGet( #%d) -> %R", idx, rc );
+ else
+ {
+ uint64_t size;
+ rc_t rc1 = KDirectoryFileSize( dir, &size, "%s", filename );
+ if ( rc1 == 0 )
+ *total += size;
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t concat_files( KDirectory * dir, const VNamelist * files, size_t buf_size,
+ const char * output, bool show_progress )
+{
+ struct KFile * dst;
+ rc_t rc = KDirectoryCreateFile( dir, &dst, false, 0664, kcmInit, "%s", output );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryCreateFile( '%s' ) -> %R", output, rc );
+ else
+ {
+ struct KFile * temp_dst;
+ rc = KBufFileMakeWrite( &temp_dst, dst, false, buf_size );
+ KFileRelease( dst );
+ if ( rc != 0 )
+ ErrMsg( "KBufFileMakeWrite() -> %R", rc );
+ else
+ {
+ cf_progress cfp;
+ uint32_t count;
+
+ dst = temp_dst;
+ if ( show_progress )
+ {
+ cfp.current_size = 0;
+ cfp.current_percent = 0;
+ rc = make_progressbar( &cfp.progressbar, 2 );
+ if ( rc == 0 )
+ rc = total_filesize( dir, files, &cfp.total_size );
+ }
+ else
+ cfp.progressbar = NULL;
+ if ( rc == 0 )
+ {
+ rc = VNameListCount( files, &count );
+ if ( rc != 0 )
+ ErrMsg( "VNameListCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ uint64_t dst_pos = 0;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * filename;
+ rc = VNameListGet( files, idx, &filename );
+ if ( rc != 0 )
+ ErrMsg( "VNameListGet( #%d) -> %R", idx, rc );
+ else
+ {
+ const struct KFile * src;
+ rc_t rc1 = KDirectoryOpenFileRead( dir, &src, "%s", filename );
+ if ( rc1 == 0 )
+ {
+ const struct KFile * temp_src;
+ rc = KBufFileMakeRead( &temp_src, src, buf_size );
+ KFileRelease( src );
+ if ( rc != 0 )
+ ErrMsg( "KBufFileMakeRead() -> %R", rc );
+ else
+ {
+ src = temp_src;
+ rc = copy_file( dst, src, &dst_pos, buf_size, &cfp );
+ }
+ KFileRelease( src );
+ }
+ }
+ }
+ }
+
+ if ( cfp.progressbar != NULL )
+ {
+ destroy_progressbar( cfp.progressbar );
+ KOutMsg( "\n" );
+ }
+ }
+ }
+ KFileRelease( dst );
+ }
+ return rc;
+}
+
+rc_t delete_files( KDirectory * dir, const VNamelist * files )
+{
+ uint32_t count;
+ rc_t rc = VNameListCount( files, &count );
+ if ( rc != 0 )
+ ErrMsg( "VNameListCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * filename;
+ rc = VNameListGet( files, idx, &filename );
+ if ( rc != 0 )
+ ErrMsg( "VNameListGet( #%d) -> %R", idx, rc );
+ else
+ {
+ rc = KDirectoryRemove( dir, true, "%s", filename );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryRemove( '%s' ) -> %R", filename, rc );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t CC progress_thread_func( const KThread *self, void *data )
+{
+ multi_progress * sp = data;
+ struct progressbar * progressbar;
+ uint32_t curr = 0, percent = 0;
+ rc_t rc = make_progressbar( &progressbar, 2 );
+
+ update_progressbar( progressbar, curr );
+ while ( atomic_read( &sp->progress_done ) == 0 )
+ {
+ percent = calc_percent( sp->row_count, atomic_read( &sp->progress_rows ), 2 );
+ if ( percent > curr )
+ {
+ uint32_t i;
+ for ( i = curr + 1; i <= percent; ++i )
+ update_progressbar( progressbar, i );
+ curr = percent;
+ }
+ KSleepMs( 100 );
+ }
+
+ percent = calc_percent( sp->row_count, atomic_read( &sp->progress_rows ), 2 );
+ if ( percent > curr )
+ {
+ uint32_t i;
+ for ( i = curr + 1; i <= percent; ++i )
+ update_progressbar( progressbar, i );
+ curr = percent;
+ }
+
+ destroy_progressbar( progressbar );
+ KOutMsg( "\n" );
+ return rc;
+}
+
+
+void init_progress_data( multi_progress * progress_data, uint64_t row_count )
+{
+ atomic_set( &progress_data->progress_done, 0 );
+ atomic_set( &progress_data->progress_rows, 0 );
+ progress_data->row_count = row_count;
+}
+
+rc_t start_multi_progress( KThread **t, multi_progress * progress_data )
+{
+ rc_t rc = KThreadMake( t, progress_thread_func, progress_data );
+ if ( rc != 0 )
+ ErrMsg( "KThreadMake( progress_thread ) -> %R", rc );
+ return rc;
+}
+
+
+void join_multi_progress( KThread *t, multi_progress * progress_data )
+{
+ if ( t != NULL )
+ {
+ atomic_set( &progress_data->progress_done, 1 );
+ KThreadWait( t, NULL );
+ KThreadRelease( t );
+ }
+}
+
+
+rc_t make_prefixed( char * buffer, size_t bufsize, const char * prefix,
+ const char * path, const char * postfix )
+{
+ rc_t rc;
+ size_t num_writ;
+ if ( prefix != NULL )
+ {
+ uint32_t l = string_measure( prefix, NULL );
+ if ( l == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "make_prefixed.string_measure() = 0 -> %R", rc );
+ }
+ else
+ {
+ if ( postfix == NULL )
+ {
+ if ( prefix[ l-1 ] == '/' )
+ rc = string_printf( buffer, bufsize, &num_writ, "%s%s", prefix, path );
+ else
+ rc = string_printf( buffer, bufsize, &num_writ, "%s/%s", prefix, path );
+ }
+ else
+ {
+ if ( prefix[ l-1 ] == '/' )
+ rc = string_printf( buffer, bufsize, &num_writ, "%s%s%s", prefix, path, postfix );
+ else
+ rc = string_printf( buffer, bufsize, &num_writ, "%s/%s%s", prefix, path, postfix );
+ }
+ }
+ }
+ else
+ {
+ if ( postfix == NULL )
+ rc = string_printf( buffer, bufsize, &num_writ, "%s", path );
+ else
+ rc = string_printf( buffer, bufsize, &num_writ, "%s%s", path, postfix );
+ }
+
+ if ( rc != 0 )
+ ErrMsg( "make_prefixed.string_printf() -> %R", rc );
+ return rc;
+}
diff --git a/tools/fastdump/helper.h b/tools/fastdump/helper.h
new file mode 100644
index 0000000..1341812
--- /dev/null
+++ b/tools/fastdump/helper.h
@@ -0,0 +1,141 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_helper_
+#define _h_helper_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_num_gen_
+#include <klib/num-gen.h>
+#endif
+
+#ifndef _h_vdb_cursor_
+#include <vdb/cursor.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+/*
+ this is in interfaces/cc/XXX/YYY/atomic.h
+ XXX ... the compiler ( cc, gcc, icc, vc++ )
+ YYY ... the architecture ( fat86, i386, noarch, ppc32, x86_64 )
+ */
+#ifndef _h_atomic_
+#include <atomic.h>
+#endif
+
+#ifndef _h_kproc_thread_
+#include <kproc/thread.h>
+#endif
+
+typedef struct SBuffer
+{
+ String S;
+ size_t buffer_size;
+} SBuffer;
+
+
+typedef enum format_t { ft_special, ft_fastq } format_t;
+
+rc_t ErrMsg( const char * fmt, ... );
+
+rc_t make_SBuffer( SBuffer * buffer, size_t len );
+void release_SBuffer( SBuffer * buffer );
+rc_t print_to_SBufferV( SBuffer * buffer, const char * fmt, va_list args );
+rc_t print_to_SBuffer( SBuffer * buffer, const char * fmt, ... );
+
+rc_t add_column( const VCursor * cursor, const char * name, uint32_t * id );
+
+rc_t make_row_iter( struct num_gen * ranges, int64_t first, uint64_t count,
+ const struct num_gen_iter ** iter );
+
+rc_t split_string( String * in, String * p0, String * p1, uint32_t ch );
+
+format_t get_format_t( const char * format );
+
+struct Args;
+const char * get_str_option( const struct Args *args, const char *name, const char * dflt );
+bool get_bool_option( const struct Args *args, const char *name );
+size_t get_size_t_option( const struct Args * args, const char *name, size_t dflt );
+uint64_t get_uint64_t_option( const struct Args * args, const char *name, uint64_t dflt );
+
+uint64_t make_key( int64_t seq_spot_id, uint32_t seq_read_id );
+
+void pack_4na( const String * unpacked, SBuffer * packed );
+void unpack_4na( const String * packed, SBuffer * unpacked );
+
+uint64_t calc_percent( uint64_t max, uint64_t value, uint16_t digits );
+
+bool file_exists( const KDirectory * dir, const char * fmt, ... );
+
+void join_and_release_threads( Vector * threads );
+
+rc_t concat_files( KDirectory * dir, const VNamelist * files, size_t buf_size,
+ const char * output, bool show_progress );
+
+rc_t delete_files( KDirectory * dir, const VNamelist * files );
+
+
+typedef struct multi_progress
+{
+ atomic_t progress_done;
+ atomic_t progress_rows;
+ uint64_t row_count;
+} multi_progress;
+
+void init_progress_data( multi_progress * progress_data, uint64_t row_count );
+rc_t start_multi_progress( KThread **t, multi_progress * progress_data );
+void join_multi_progress( KThread *t, multi_progress * progress_data );
+
+rc_t make_prefixed( char * buffer, size_t bufsize, const char * prefix,
+ const char * path, const char * postfix );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/index.c b/tools/fastdump/index.c
new file mode 100644
index 0000000..4036233
--- /dev/null
+++ b/tools/fastdump/index.c
@@ -0,0 +1,335 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "index.h"
+#include "helper.h"
+
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+typedef struct index_writer
+{
+ struct KFile * f;
+ uint64_t frequency, pos, last_key;
+} index_writer;
+
+
+void release_index_writer( struct index_writer * writer )
+{
+ if ( writer != NULL )
+ {
+ if ( writer->f != NULL ) KFileRelease( writer->f );
+ free( ( void * ) writer );
+ }
+}
+
+
+static rc_t write_value( index_writer * writer, uint64_t value )
+{
+ size_t num_writ;
+ rc_t rc = KFileWrite( writer->f, writer->pos, &value, sizeof value, &num_writ );
+ if ( rc != 0 )
+ ErrMsg( "write_value.KFileWriteAll( key ) -> %R", rc );
+ else if ( num_writ != sizeof value )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
+ ErrMsg( "write_value.KFileWriteAll( key ) -> %R", rc );
+ }
+ else
+ writer->pos += num_writ;
+ return rc;
+}
+
+
+static rc_t write_key_and_offset( index_writer * writer, uint64_t key, uint64_t offset )
+{
+ rc_t rc = write_value( writer, key );
+ if ( rc == 0 )
+ rc = write_value( writer, offset );
+ return rc;
+}
+
+
+rc_t write_key( struct index_writer * writer, uint64_t key, uint64_t offset )
+{
+ rc_t rc = 0;
+ if ( writer == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcInvalid );
+ ErrMsg( "write_index_valuer() -> %R", rc );
+ }
+ else
+ {
+ if ( key > ( writer->last_key + writer->frequency ) )
+ {
+ rc = write_key_and_offset( writer, key, offset );
+ if ( rc == 0 )
+ writer->last_key = key;
+ }
+ }
+ return rc;
+}
+
+
+rc_t make_index_writer( KDirectory * dir, struct index_writer ** writer,
+ size_t buf_size, uint64_t frequency, const char * fmt, ... )
+{
+ rc_t rc;
+ struct KFile * f;
+
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = KDirectoryVCreateFile( dir, &f, false, 0664, kcmInit, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryVCreateFile() -> %R", rc );
+ else
+ {
+ struct KFile * temp_file;
+ rc = KBufFileMakeWrite( &temp_file, f, false, buf_size );
+ KFileRelease( f );
+ if ( rc != 0 )
+ ErrMsg( "KBufFileMakeWrite() -> %R", rc );
+ else
+ {
+ index_writer * w = calloc( 1, sizeof * w );
+ if ( w == NULL )
+ {
+ KFileRelease( temp_file );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * w ), rc );
+ }
+ else
+ {
+ w->f = temp_file;
+ w->frequency = frequency;
+ rc = write_value( w, frequency );
+ if ( rc == 0 )
+ rc = write_key_and_offset( w, 1, 0 );
+
+ if ( rc == 0 )
+ *writer = w;
+ else
+ release_index_writer( w );
+ }
+ }
+ }
+ va_end ( args );
+
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------- */
+
+typedef struct index_reader
+{
+ const struct KFile * f;
+ uint64_t frequency, file_size, max_key;
+} index_reader;
+
+
+void release_index_reader( struct index_reader * reader )
+{
+ if ( reader != NULL )
+ {
+ if ( reader->f != NULL ) KFileRelease( reader->f );
+ free( ( void * ) reader );
+ }
+}
+
+
+static rc_t read_value( struct index_reader * reader, uint64_t pos, uint64_t * value )
+{
+ size_t num_read;
+ rc_t rc = KFileRead( reader->f, pos, ( void *)value, sizeof *value, &num_read );
+ if ( rc != 0 )
+ ErrMsg( "read_value.KFileRead( at %ld ) -> %R", pos, rc );
+ else if ( num_read != sizeof *value )
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcFormat, rcInvalid );
+ return rc;
+}
+
+
+rc_t make_index_reader( KDirectory * dir, struct index_reader ** reader,
+ size_t buf_size, const char * fmt, ... )
+{
+ rc_t rc;
+ const struct KFile * f;
+
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = KDirectoryVOpenFileRead( dir, &f, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryVOpenFileRead() -> %R", rc );
+ else
+ {
+ const struct KFile * temp_file;
+ rc = KBufFileMakeRead( &temp_file, f, buf_size );
+ KFileRelease( f );
+ if ( rc != 0 )
+ {
+ ErrMsg( "KBufFileMakeRead() -> %R", rc );
+ }
+ else
+ {
+ index_reader * r = calloc( 1, sizeof * r );
+ if ( r == NULL )
+ {
+ KFileRelease( temp_file );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * r ), rc );
+ }
+ else
+ {
+ r->f = temp_file;
+ rc = read_value( r, 0, &r->frequency );
+ if ( rc == 0 )
+ rc = KFileSize( temp_file, &r->file_size );
+
+ if ( rc == 0 )
+ {
+ get_max_key( r, &r->max_key );
+ *reader = r;
+ }
+ else
+ release_index_reader( r );
+ }
+ }
+ }
+ va_end ( args );
+ return rc;
+}
+
+
+static uint64_t key_to_pos_guess( const struct index_reader * reader, uint64_t key )
+{
+ uint64_t chunk_id = ( key / reader->frequency );
+ return ( ( sizeof reader->frequency ) + ( chunk_id * ( 2 * ( sizeof reader->frequency ) ) ) );
+}
+
+
+static rc_t read_3( const struct index_reader * reader, uint64_t pos, uint64_t * data, size_t to_read )
+{
+ size_t num_read;
+ rc_t rc = KFileRead( reader->f, pos, ( void *)data, to_read, &num_read );
+ if ( rc != 0 )
+ ErrMsg( "read_3.KFileRead( at %ld ) -> %R", pos, rc );
+ else if ( num_read != to_read )
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcFormat, rcInvalid );
+ return rc;
+}
+
+
+rc_t get_nearest_offset( const struct index_reader * reader, uint64_t key_to_find,
+ uint64_t * key_found, uint64_t * offset )
+{
+ rc_t rc = 0;
+ if ( reader == NULL || key_found == NULL || offset == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcInvalid );
+ ErrMsg( "get_nearest_offset() -> %R", rc );
+ }
+ else
+ {
+ uint64_t data[ 6 ];
+ /*
+ data[ 0 ] ... key0 data[ 1 ] ... offset0
+ data[ 2 ] ... key1 data[ 3 ] ... offset1
+ data[ 4 ] ... key2 data[ 5 ] ... offset2
+ */
+ uint64_t pos = key_to_pos_guess( reader, key_to_find );
+ bool found = false;
+ while ( rc == 0 && !found && pos < reader->file_size )
+ {
+ rc = read_3( reader, pos, data, sizeof data );
+ if ( rc == 0 )
+ {
+ if ( key_to_find >= data[ 0 ] && key_to_find < data[ 2 ] )
+ {
+ /* key_to_find is between key0 and key1 */
+ found = true;
+ *key_found = data[ 0 ];
+ *offset = data[ 1 ];
+ }
+ else if ( key_to_find >= data[ 2 ] && key_to_find < data[ 4 ] )
+ {
+ /* key_to_find is between key1 and key2 */
+ found = true;
+ *key_found = data[ 2 ];
+ *offset = data[ 3 ];
+ }
+ if ( !found )
+ {
+ if ( key_to_find < data[ 0 ] )
+ {
+ /* key_to_find is smaller than our guess */
+ if ( pos > sizeof reader->frequency )
+ pos -= ( 2 * ( sizeof reader->frequency ) );
+ else
+ {
+ found = true;
+ *key_found = data[ 0 ];
+ *offset = data[ 1 ];
+ }
+ }
+ else if ( key_to_find > data[ 4 ] )
+ {
+ /* key_to_find is bigger than our guess */
+ pos += ( 2 * ( sizeof reader->frequency ) );
+ }
+ }
+ }
+ }
+ if ( !found )
+ rc = SILENT_RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ }
+ return rc;
+}
+
+
+rc_t get_max_key( const struct index_reader * reader, uint64_t * max_key )
+{
+ rc_t rc = 0;
+ if ( reader == NULL || max_key == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcInvalid );
+ ErrMsg( "get_nearest_offset() -> %R", rc );
+ }
+ else if ( reader->max_key > 0 )
+ {
+ *max_key = reader->max_key;
+ }
+ else
+ {
+ uint64_t data[ 6 ];
+ uint64_t pos = reader->file_size - ( sizeof data );
+ rc = read_3( reader, pos, data, sizeof data );
+ if ( rc == 0 )
+ *max_key = data[ 4 ];
+ }
+ return rc;
+}
\ No newline at end of file
diff --git a/tools/fastdump/index.h b/tools/fastdump/index.h
new file mode 100644
index 0000000..0a164fa
--- /dev/null
+++ b/tools/fastdump/index.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_index_
+#define _h_index_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+struct index_writer;
+
+void release_index_writer( struct index_writer * writer );
+rc_t make_index_writer( KDirectory * dir, struct index_writer ** writer,
+ size_t buf_size, uint64_t frequency, const char * fmt, ... );
+rc_t write_key( struct index_writer * writer, uint64_t key, uint64_t offset );
+
+struct index_reader;
+
+void release_index_reader( struct index_reader * reader );
+rc_t make_index_reader( KDirectory * dir, struct index_reader ** reader,
+ size_t buf_size, const char * fmt, ... );
+rc_t get_nearest_offset( const struct index_reader * reader, uint64_t key_to_find,
+ uint64_t * key_found, uint64_t * offset );
+
+rc_t get_max_key( const struct index_reader * reader, uint64_t * max_key );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/join.c b/tools/fastdump/join.c
new file mode 100644
index 0000000..3636a47
--- /dev/null
+++ b/tools/fastdump/join.c
@@ -0,0 +1,670 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "join.h"
+#include "lookup_reader.h"
+#include "index.h"
+#include "file_printer.h"
+#include "special_iter.h"
+#include "fastq_iter.h"
+#include "helper.h"
+
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <kproc/thread.h>
+
+#include <stdio.h>
+
+typedef struct join
+{
+ struct lookup_reader * lookup;
+ struct file_printer * printer;
+ SBuffer B1, B2;
+} join;
+
+
+static void release_join_ctx( join * j )
+{
+ if ( j != NULL )
+ {
+ release_lookup_reader( j->lookup );
+ destroy_file_printer( j->printer );
+ release_SBuffer( &j->B1 );
+ release_SBuffer( &j->B2 );
+ }
+}
+
+
+static rc_t init_join( const join_params * jp, struct join *j, struct index_reader * index )
+{
+ rc_t rc;
+
+ j->lookup = NULL;
+ j->printer = NULL;
+ j->B1.S.addr = NULL;
+ j->B2.S.addr = NULL;
+
+ rc = make_lookup_reader( jp->dir, index, &j->lookup, jp->buf_size, "%s", jp->lookup_filename );
+ if ( rc == 0 )
+ {
+ if ( jp->output_filename != NULL )
+ rc = make_file_printer( jp->dir, &j->printer, jp->buf_size, 4096 * 4, "%s", jp->output_filename );
+ if ( rc != 0 )
+ ErrMsg( "init_join().make_file_printer() -> %R", rc );
+ }
+ else
+ ErrMsg( "init_join().make_lookup_reader() -> %R", rc );
+ if ( rc == 0 )
+ {
+ rc = make_SBuffer( &j->B1, 4096 );
+ if ( rc != 0 )
+ ErrMsg( "init_join().make_SBuffer( B1 ) -> %R", rc );
+ }
+ if ( rc == 0 )
+ {
+ rc = make_SBuffer( &j->B2, 4096 );
+ if ( rc != 0 )
+ ErrMsg( "init_join().make_SBuffer( B2 ) -> %R", rc );
+ }
+
+ /* the rc-code of seek_lookup_reader is not checked, because if the row-id to be seeked to is in
+ the range of the fully unaligned data - seek will fail, because the are no alignments = lookup-records
+ in this area !*/
+ if ( rc == 0 && jp->first > 1 )
+ {
+ uint64_t key_to_find = jp->first << 1;
+ uint64_t key_found = 0;
+ rc_t rc1 = seek_lookup_reader( j->lookup, key_to_find, &key_found, true );
+ if ( GetRCState( rc1 ) != rcTooBig && GetRCState( rc1 ) != rcNotFound )
+ rc = rc1;
+ if ( rc != 0 )
+ ErrMsg( "init_join().seek_lookup_reader( %lu ) -> %R", key_to_find, rc );
+ }
+ if ( rc != 0 )
+ release_join_ctx( j );
+ return rc;
+}
+
+
+static void copy_join_params( join_params * dst, const join_params * src )
+{
+ dst->dir = src->dir;
+ dst->accession = src->accession;
+ dst->lookup_filename = src->lookup_filename;
+ dst->index_filename = src->index_filename;
+ dst->output_filename = src->output_filename;
+ dst->temp_path = src->temp_path;
+ dst->join_progress = src->join_progress;
+ dst->buf_size = src->buf_size;
+ dst->cur_cache = src->cur_cache;
+ dst->num_threads = src->num_threads;
+ dst->first = src->first;
+ dst->count = src->count;
+ dst->show_progress = src->show_progress;
+ dst->fmt = src->fmt;
+}
+
+static void init_cmn_params( const join_params * jp, cmn_params * cmn )
+{
+ cmn->dir = jp->dir;
+ cmn->acc = jp->accession;
+ cmn->row_range = NULL;
+ cmn->first = jp->first;
+ cmn->count = jp->count;
+ cmn->cursor_cache = jp->cur_cache;
+ cmn->show_progress = jp->show_progress;
+}
+
+
+static rc_t print_special_1_read( special_rec * rec, join * j )
+{
+ rc_t rc = 0;
+ int64_t row_id = rec->row_id;
+
+ if ( rec->prim_alig_id[ 0 ] == 0 )
+ {
+ /* read is unaligned, print what is in row->cmp_read ( !!! no lookup !!! ) */
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S\t%S\n", row_id, &rec->cmp_read, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S\t%S\n", row_id, &rec->cmp_read, &rec->spot_group );
+ }
+ else
+ {
+ /* read is aligned ( 1 lookup ) */
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ {
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S\t%S\n", row_id, &j->B1.S, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S\t%S\n", row_id, &j->B1.S, &rec->spot_group );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_special_2_reads( special_rec * rec, join * j )
+{
+ rc_t rc = 0;
+ int64_t row_id = rec->row_id;
+
+ if ( rec->prim_alig_id[ 0 ] == 0 )
+ {
+ if ( rec->prim_alig_id[ 1 ] == 0 )
+ {
+ /* both unaligned, print what is in row->cmp_read ( !!! no lookup !!! )*/
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S\t%S\n", row_id, &rec->cmp_read, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S\t%S\n", row_id, &rec->cmp_read, &rec->spot_group );
+ }
+ else
+ {
+ /* A0 is unaligned / A1 is aligned (lookup) */
+ rc = lookup_bases( j->lookup, row_id, 2, &j->B2 );
+ if ( rc == 0 )
+ {
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S%S\t%S\n", row_id, &rec->cmp_read, &j->B2.S, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S%S\t%S\n", row_id, &rec->cmp_read, &j->B2.S, &rec->spot_group );
+ }
+ }
+ }
+ else
+ {
+ if ( rec->prim_alig_id[ 1 ] == 0 )
+ {
+ /* A0 is aligned (lookup) / A1 is unaligned */
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ {
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S%S\t%S\n", row_id, &j->B1.S, &rec->cmp_read, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S%S\t%S\n", row_id, &j->B1.S, &rec->cmp_read, &rec->spot_group );
+ }
+ }
+ else
+ {
+ /* A0 and A1 are aligned (2 lookups)*/
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ rc = lookup_bases( j->lookup, row_id, 2, &j->B2 );
+ if ( rc == 0 )
+ {
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, "%ld\t%S%S\t%S\n", row_id, &j->B1.S, &j->B2.S, &rec->spot_group );
+ else
+ rc = KOutMsg( "%ld\t%S%S\t%S\n", row_id, &j->B1.S, &j->B2.S, &rec->spot_group );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_fastq_1_read( fastq_rec * rec, join * j, const char * acc )
+{
+ rc_t rc = 0;
+ int64_t row_id = rec->row_id;
+
+ if ( rec->prim_alig_id[ 0 ] == 0 )
+ {
+ /* read is unaligned, print what is in row->cmp_read (no lookup)*/
+ const char * fmt = "@%s.%ld %ld length=%d\n%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, rec->cmp_read.len, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, rec->cmp_read.len, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ }
+ else
+ {
+ /* read is aligned, ( 1 lookup ) */
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ {
+ const char * fmt = "@%s.%ld %ld length=%d\n%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, j->B1.S.len, &j->B1.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, j->B1.S.len, &j->B1.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_fastq_2_reads( fastq_rec * rec, join * j, const char * acc )
+{
+ rc_t rc = 0;
+ int64_t row_id = rec->row_id;
+
+ if ( rec->prim_alig_id[ 0 ] == 0 )
+ {
+ if ( rec->prim_alig_id[ 1 ] == 0 )
+ {
+ /* both unaligned, print what is in row->cmp_read (no lookup)*/
+ const char * fmt = "@%s.%ld %ld length=%d\n%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, rec->cmp_read.len, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, rec->cmp_read.len, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+
+ }
+ else
+ {
+ /* A0 is unaligned / A1 is aligned (lookup) */
+ rc = lookup_bases( j->lookup, row_id, 2, &j->B2 );
+ if ( rc == 0 )
+ {
+ const char * fmt = "@%s.%ld %ld length=%d\n%S%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, rec->cmp_read.len + j->B2.S.len, &rec->cmp_read, &j->B2.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, rec->cmp_read.len + j->B2.S.len, &rec->cmp_read, &j->B2.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ }
+ }
+ }
+ else
+ {
+ if ( rec->prim_alig_id[ 1 ] == 0 )
+ {
+ /* A0 is aligned (lookup) / A1 is unaligned */
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ {
+ const char * fmt = "@%s.%ld %ld length=%d\n%S%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, rec->cmp_read.len + j->B1.S.len, &j->B1.S, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, rec->cmp_read.len + j->B1.S.len, &j->B1.S, &rec->cmp_read,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ }
+ }
+ else
+ {
+ /* A0 and A1 are aligned (2 lookups)*/
+ rc = lookup_bases( j->lookup, row_id, 1, &j->B1 );
+ if ( rc == 0 )
+ rc = lookup_bases( j->lookup, row_id, 2, &j->B2 );
+ if ( rc == 0 )
+ {
+ const char * fmt = "@%s.%ld %ld length=%d\n%S%S\n+%s.%ld %ld length=%d\n%S\n";
+ if ( j->printer != NULL )
+ rc = file_print( j->printer, fmt,
+ acc, row_id, row_id, j->B1.S.len + j->B2.S.len, &j->B1.S, &j->B2.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ else
+ rc = KOutMsg( fmt,
+ acc, row_id, row_id, j->B1.S.len + j->B2.S.len, &j->B1.S, &j->B2.S,
+ acc, row_id, row_id, rec->quality.len, &rec->quality );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t extract_row_count_cmn( const join_params * jp, uint64_t * row_count )
+{
+ rc_t rc = 0;
+ cmn_params cmn;
+
+ init_cmn_params( jp, &cmn ); /* above */
+ switch( jp->fmt )
+ {
+ case ft_special : {
+ struct special_iter * iter;
+ rc = make_special_iter( &cmn, &iter ); /* special_iter.c */
+ if ( rc == 0 )
+ {
+ *row_count = get_row_count_of_special_iter( iter );
+ destroy_special_iter( iter );
+ }
+ } break;
+
+ case ft_fastq : {
+ struct fastq_iter * iter;
+ rc = make_fastq_iter( &cmn, &iter ); /* fastq_iter.c */
+ if ( rc == 0 )
+ {
+ *row_count = get_row_count_of_fastq_iter( iter );
+ destroy_fastq_iter( iter );
+ }
+ } break;
+
+ default : break;
+ }
+ return rc;
+}
+
+rc_t CC Quitting();
+
+static rc_t perform_special_join( const join_params * jp, struct index_reader * index )
+{
+ rc_t rc;
+ struct special_iter * iter;
+ cmn_params cmn;
+
+ init_cmn_params( jp, &cmn ); /* above */
+ rc = make_special_iter( &cmn, &iter );
+ if ( rc == 0 )
+ {
+ join j;
+ rc = init_join( jp, &j, index );
+ if ( rc == 0 )
+ {
+ special_rec rec;
+ while ( get_from_special_iter( iter, &rec, &rc ) && rc == 0 )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ if ( rec.num_reads == 1 )
+ rc = print_special_1_read( &rec, &j );
+ else
+ rc = print_special_2_reads( &rec, &j );
+
+ if ( jp->join_progress != NULL )
+ atomic_inc( jp->join_progress );
+ }
+ }
+ release_join_ctx( &j );
+ }
+ else
+ ErrMsg( "init_join() -> %R", rc );
+ destroy_special_iter( iter );
+ }
+ else
+ ErrMsg( "make_special_iter() -> %R", rc );
+ return rc;
+}
+
+
+static rc_t perform_fastq_join( const join_params * jp, struct index_reader * index )
+{
+ rc_t rc;
+ struct fastq_iter * iter;
+ cmn_params cmn;
+
+ init_cmn_params( jp, &cmn ); /* above */
+ rc = make_fastq_iter( &cmn, &iter );
+ if ( rc == 0 )
+ {
+ join j;
+
+ rc = init_join( jp, &j, index );
+ if ( rc == 0 )
+ {
+ fastq_rec rec;
+ uint64_t n = 0;
+
+ while ( get_from_fastq_iter( iter, &rec, &rc ) && rc == 0 )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ if ( rec.num_reads == 1 )
+ rc = print_fastq_1_read( &rec, &j, jp->accession );
+ else
+ rc = print_fastq_2_reads( &rec, &j, jp->accession );
+
+ if ( jp->join_progress != NULL )
+ atomic_inc( jp->join_progress );
+ n++;
+ }
+ }
+ release_join_ctx( &j );
+ }
+ else
+ ErrMsg( "init_join() -> %R", rc );
+ destroy_fastq_iter( iter );
+ }
+ else
+ ErrMsg( "make_fastq_iter() -> %R", rc );
+ return rc;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------ */
+
+typedef struct join_thread_data
+{
+ const join_params * jp;
+ int64_t first;
+ uint64_t count;
+ uint32_t idx;
+} join_thread_data;
+
+
+static const char * leaf_of( const char * src )
+{
+ const char * last_slash = string_rchr( src, string_size ( src ), '/' );
+ if ( last_slash != NULL )
+ return last_slash + 1;
+ return src;
+}
+
+static rc_t make_part_filename( const join_params * jp, char * buffer, size_t bufsize, uint32_t id )
+{
+ rc_t rc;
+ size_t num_writ;
+ if ( jp->temp_path != NULL )
+ {
+ uint32_t l = string_measure( jp->temp_path, NULL );
+ if ( l == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "make_part_filename.string_measure() = 0 -> %R", rc );
+ }
+ else
+ {
+ const char * output_file_leaf = leaf_of( jp->output_filename ); /* above */
+
+ if ( jp->temp_path[ l-1 ] == '/' )
+ rc = string_printf( buffer, bufsize, &num_writ, "%s%s.%d",
+ jp->temp_path, output_file_leaf, id );
+ else
+ rc = string_printf( buffer, bufsize, &num_writ, "%s/%s.%d",
+ jp->temp_path, output_file_leaf, id );
+ }
+ }
+ else
+ rc = string_printf( buffer, bufsize, &num_writ, "%s.%d", jp->output_filename, id );
+
+ if ( rc != 0 )
+ ErrMsg( "make_part_filename.string_printf() -> %R", rc );
+ return rc;
+}
+
+
+static rc_t concat_part_files( const join_params * jp, uint32_t count )
+{
+ struct VNamelist * files;
+ rc_t rc = VNamelistMake( &files, count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ char part_file[ 4096 ];
+ rc = make_part_filename( jp, part_file, sizeof part_file, idx ); /* above */
+ if ( rc == 0 )
+ rc = VNamelistAppend( files, part_file );
+ }
+ if ( rc == 0 )
+ rc = concat_files( jp->dir, files, jp->buf_size, jp->output_filename, jp->show_progress ); /* helper.c */
+ if ( rc == 0 )
+ rc = delete_files( jp->dir, files );
+ VNamelistRelease( files );
+ }
+ return rc;
+}
+
+/* ------------------------------------------------------------------------------------------ */
+
+static rc_t CC cmn_thread_func( const KThread *self, void *data )
+{
+ rc_t rc = 0;
+ join_thread_data * jtd = data;
+ const join_params * jp = jtd->jp;
+ struct index_reader * index = NULL;
+
+ if ( jp->index_filename != NULL )
+ {
+ if ( file_exists( jp->dir, "%s", jp->index_filename ) )
+ rc = make_index_reader( jp->dir, &index, jp->buf_size, "%s", jp->index_filename ); /* index.c */
+ }
+
+ if ( rc == 0 && index != NULL )
+ {
+ char part_file[ 4096 ];
+ rc = make_part_filename( jp, part_file, sizeof part_file, jtd->idx ); /* above */
+ if ( rc == 0 )
+ {
+ join_params cjp;
+
+ copy_join_params( &cjp, jp );
+ cjp.num_threads = 0;
+ cjp.first = jtd->first;
+ cjp.count = jtd->count;
+ cjp.output_filename = part_file;
+ cjp.show_progress = false;
+
+ switch( jp->fmt )
+ {
+ case ft_special : rc = perform_special_join( &cjp, index ); break; /* above */
+ case ft_fastq : rc = perform_fastq_join( &cjp, index ); break; /* above */
+ default : break;
+
+ }
+ }
+ release_index_reader( index ); /* index.c */
+ }
+
+ free( ( void * ) data );
+ return rc;
+}
+
+
+rc_t execute_join( const join_params * jp )
+{
+ rc_t rc = 0;
+
+ if ( jp->show_progress )
+ KOutMsg( "join :" );
+
+ if ( jp->num_threads < 2 )
+ {
+ /* on the main thread */
+ switch( jp->fmt )
+ {
+ case ft_special : rc = perform_special_join( jp, NULL ); break; /* above */
+ case ft_fastq : rc = perform_fastq_join( jp, NULL ); break; /* above */
+ default : break;
+ }
+ }
+ else
+ {
+ uint64_t row_count = 0;
+ rc = extract_row_count_cmn( jp, &row_count ); /* above */
+ if ( rc == 0 && row_count > 0 )
+ {
+ Vector threads;
+ int64_t first = 1;
+ uint64_t i, per_thread = ( row_count / jp->num_threads ) + 1;
+ KThread * progress_thread = NULL;
+ multi_progress progress;
+
+ init_progress_data( &progress, row_count ); /* helper.c */
+ VectorInit( &threads, 0, jp->num_threads );
+
+ if ( jp->show_progress )
+ {
+ join_params * nc_jp = ( join_params * )jp;
+ nc_jp->join_progress = &progress.progress_rows;
+ rc = start_multi_progress( &progress_thread, &progress ); /* helper.c */
+ }
+ for ( i = 0; rc == 0 && i < jp->num_threads; ++i )
+ {
+ join_thread_data * jtd = calloc( 1, sizeof * jtd );
+ if ( jtd != NULL )
+ {
+ KThread * thread;
+
+ jtd->jp = jp;
+ jtd->first = first;
+ jtd->count = per_thread;
+ jtd->idx = i;
+
+ rc = KThreadMake( &thread, cmn_thread_func, jtd );
+ if ( rc != 0 )
+ ErrMsg( "KThreadMake( fastq/special #%d ) -> %R", i, rc );
+ else
+ {
+ rc = VectorAppend( &threads, NULL, thread );
+ if ( rc != 0 )
+ ErrMsg( "VectorAppend( sort-thread #%d ) -> %R", i, rc );
+ }
+ first += per_thread;
+ }
+ }
+
+ join_and_release_threads( &threads ); /* helper.c */
+ join_multi_progress( progress_thread, &progress ); /* helper.c */
+
+ if ( jp->show_progress )
+ KOutMsg( "concat :" );
+
+ rc = concat_part_files( jp, jp->num_threads ); /* above */
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/join.h b/tools/fastdump/join.h
new file mode 100644
index 0000000..83cd4a0
--- /dev/null
+++ b/tools/fastdump/join.h
@@ -0,0 +1,76 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_join_
+#define _h_join_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_atomic_
+#include <atomic.h>
+#endif
+
+#ifndef _h_helper_
+#include "helper.h"
+#endif
+
+typedef struct join_params
+{
+ KDirectory * dir;
+ const char * accession;
+ const char * lookup_filename;
+ const char * index_filename;
+ const char * output_filename;
+ const char * temp_path;
+ atomic_t * join_progress;
+ size_t buf_size, cur_cache, num_threads;
+ int64_t first;
+ uint64_t count;
+ bool show_progress;
+ format_t fmt;
+} join_params;
+
+rc_t execute_join( const join_params * jp );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/line_iter.c b/tools/fastdump/line_iter.c
new file mode 100644
index 0000000..0ccd234
--- /dev/null
+++ b/tools/fastdump/line_iter.c
@@ -0,0 +1,199 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "line_iter.h"
+#include "helper.h"
+
+#include <kfs/file.h>
+
+#define ITER_DONE 0x01
+#define ITER_EOF 0x02
+
+typedef struct line_iter
+{
+ const struct KFile * f;
+ String buffer, content, line;
+ uint64_t pos_in_file;
+ uint32_t state;
+} line_iter;
+
+
+void release_line_iter( struct line_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ if ( iter->f != NULL )
+ KFileRelease( iter->f );
+ if ( iter->buffer.addr != NULL )
+ free( ( void * ) iter->buffer.addr );
+ free( ( void * ) iter );
+ }
+}
+
+
+static void read_line_iter( struct line_iter * iter )
+{
+ if ( iter->content.size > 0 )
+ memmove( (void *)iter->buffer.addr, iter->content.addr, iter->content.size );
+ iter->content.addr = iter->buffer.addr;
+ {
+ char * dst = ( char * )iter->buffer.addr + iter->content.size;
+ size_t num_read;
+ size_t to_read = ( ( iter->buffer.size - 1 ) - iter->content.size );
+ rc_t rc = KFileRead ( iter->f, iter->pos_in_file, dst, iter->buffer.size - iter->content.size, &num_read );
+ if ( rc == 0 )
+ {
+ iter->pos_in_file += num_read;
+ iter->content.size += num_read;
+ if ( num_read < to_read )
+ iter->state |= ITER_EOF;
+ }
+ else
+ iter->state |= ITER_EOF;
+ }
+}
+
+
+static bool slice_iter_content( struct line_iter * iter, size_t by )
+{
+ size_t l;
+ iter->line.addr = iter->content.addr;
+ iter->line.len = by;
+ iter->line.size = by;
+ l = ( by + 1 );
+ iter->content.addr += l;
+ if ( l < iter->content.size )
+ iter->content.size -= l;
+ else
+ iter->content.size = 0;
+ return true;
+}
+
+
+bool advance_line_iter( struct line_iter * iter )
+{
+ bool res = ( 0 == ( iter->state & ITER_DONE ) );
+ if ( res )
+ {
+ if ( iter->content.size == 0 )
+ read_line_iter( iter );
+
+ if ( iter->content.size == 0 && ( iter->state & ITER_EOF ) )
+ {
+ iter->state |= ITER_DONE;
+ res = false;
+ }
+ else
+ {
+ char * newline = string_chr( iter->content.addr, iter->content.size, '\n' );
+ if ( newline == NULL )
+ {
+ if ( iter->state & ITER_EOF )
+ res = slice_iter_content( iter, iter->content.size );
+ else
+ {
+ read_line_iter( iter );
+ res = advance_line_iter( iter ); /* recursion! */
+ }
+ }
+ else
+ res = slice_iter_content( iter, newline - iter->content.addr );
+ }
+ }
+ return res;
+}
+
+
+String * get_line_iter( struct line_iter * iter )
+{
+ String * res = NULL;
+ if ( iter != NULL )
+ {
+ if ( 0 == ( iter->state & ITER_DONE ) )
+ res = &iter->line;
+ }
+ return res;
+}
+
+
+bool is_line_iter_done( const struct line_iter * iter )
+{
+ if ( iter != NULL )
+ return ( iter->state & ITER_DONE );
+ return true;
+}
+
+
+rc_t make_line_iter( const KDirectory *dir, line_iter ** iter,
+ const char * filename, size_t buffer_size )
+{
+ const struct KFile * f;
+ rc_t rc = KDirectoryOpenFileRead( dir, &f, "%s", filename );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryOpenFileRead( '%s' ) -> %R", filename, rc );
+ else
+ {
+ if ( rc == 0 )
+ {
+ line_iter * l = calloc( 1, sizeof * l );
+ if ( l == NULL )
+ {
+ KFileRelease( f );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * l ), rc );
+ }
+ else
+ {
+ l->f = f;
+ l->buffer.addr = malloc( buffer_size );
+ if ( l->buffer.addr == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "malloc( %d ) -> %R", ( buffer_size ), rc );
+ KFileRelease( f );
+ free( ( void * ) l );
+ }
+ else
+ {
+ l->buffer.size = buffer_size;
+ l->buffer.len = buffer_size;
+ l->content.addr = l->buffer.addr;
+ read_line_iter( l );
+ if ( advance_line_iter( l ) )
+ {
+ *iter = l;
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcRange, rcInvalid );
+ release_line_iter( l );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/line_iter.h b/tools/fastdump/line_iter.h
new file mode 100644
index 0000000..b453c4d
--- /dev/null
+++ b/tools/fastdump/line_iter.h
@@ -0,0 +1,60 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_line_iter_
+#define _h_line_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+struct line_iter;
+
+void release_line_iter( struct line_iter * iter );
+bool advance_line_iter( struct line_iter * iter );
+String * get_line_iter( struct line_iter * iter );
+bool is_line_iter_done( const struct line_iter * iter );
+
+rc_t make_line_iter( const KDirectory *dir, struct line_iter ** iter,
+ const char * filename, size_t buffer_size );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/lookup_reader.c b/tools/fastdump/lookup_reader.c
new file mode 100644
index 0000000..85f1b9f
--- /dev/null
+++ b/tools/fastdump/lookup_reader.c
@@ -0,0 +1,360 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "lookup_reader.h"
+#include "helper.h"
+
+#include <klib/printf.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+#include <string.h>
+#include <stdio.h>
+
+typedef struct lookup_reader
+{
+ const struct KFile * f;
+ const struct index_reader * index;
+ SBuffer buf;
+ uint64_t pos;
+} lookup_reader;
+
+
+void release_lookup_reader( struct lookup_reader * reader )
+{
+ if ( reader != NULL )
+ {
+ if ( reader->f != NULL ) KFileRelease( reader->f );
+ release_SBuffer( &reader->buf );
+ free( ( void * ) reader );
+ }
+}
+
+
+rc_t make_lookup_reader( const KDirectory *dir, const struct index_reader * index,
+ struct lookup_reader ** reader, size_t buf_size, const char * fmt, ... )
+{
+ rc_t rc;
+ const struct KFile * f = NULL;
+
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = KDirectoryVOpenFileRead( dir, &f, fmt, args );
+ if ( rc != 0 )
+ {
+ char tmp[ 4096 ];
+ size_t num_writ;
+ rc_t rc1 = string_vprintf( tmp, sizeof tmp, &num_writ, fmt, args );
+ if ( rc1 != 0 )
+ ErrMsg( "make_lookup_reader.KDirectoryVOpenFileRead( '?' ) -> %R", rc );
+ else
+ ErrMsg( "make_lookup_reader.KDirectoryVOpenFileRead( '%s' ) -> %R", tmp, rc );
+ }
+ else
+ {
+ const struct KFile * temp_file = NULL;
+ rc = KBufFileMakeRead( &temp_file, f, buf_size );
+ KFileRelease( f );
+ if ( rc != 0 )
+ {
+ ErrMsg( "make_lookup_reader.KBufFileMakeRead() -> %R", rc );
+ }
+ else
+ {
+ lookup_reader * r = calloc( 1, sizeof * r );
+ if ( r == NULL )
+ {
+ KFileRelease( temp_file );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "make_lookup_reader.calloc( %d ) -> %R", ( sizeof * r ), rc );
+ }
+ else
+ {
+ r->f = temp_file;
+ r->index = index;
+ rc = make_SBuffer( &r->buf, 4096 );
+ if ( rc == 0 )
+ *reader = r;
+ else
+ release_lookup_reader( r );
+ }
+ }
+ }
+ va_end ( args );
+ return rc;
+}
+
+
+static rc_t read_key_and_len( struct lookup_reader * reader, uint64_t pos, uint64_t *key, size_t *len )
+{
+ size_t num_read;
+ char buffer[ 10 ];
+ rc_t rc = KFileRead( reader->f, pos, buffer, sizeof buffer, &num_read );
+ if ( rc != 0 )
+ {
+ ErrMsg( "read_key_and_len.KFileRead( at %ld, to_read %u ) -> %R", pos, sizeof buffer, rc );
+ }
+ else if ( num_read != sizeof buffer )
+ {
+ if ( num_read == 0 )
+ rc = SILENT_RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ else
+ rc = SILENT_RC( rcVDB, rcNoTarg, rcReading, rcFormat, rcInvalid );
+ }
+ else
+ {
+ uint16_t dna_len;
+ size_t packed_len;
+ memmove( key, buffer, sizeof *key );
+ dna_len = buffer[ 8 ];
+ dna_len <<= 8;
+ dna_len |= buffer[ 9 ];
+ packed_len = ( dna_len & 1 ) ? ( dna_len + 1 ) >> 1 : dna_len >> 1;
+ *len = ( ( sizeof *key ) + ( sizeof dna_len ) + packed_len );
+ }
+ return rc;
+}
+
+
+static bool keys_equal( uint64_t key1, uint64_t key2 )
+{
+ bool res = ( key1 == key2 );
+ if ( !res )
+ res = ( ( ( key1 & 0x01 ) == 0 ) && key2 == ( key1 + 1 ) );
+ return res;
+}
+
+static rc_t loop_until_key_found( struct lookup_reader * reader, uint64_t key_to_find,
+ uint64_t *key_found , uint64_t *offset )
+{
+ rc_t rc = 0;
+ bool done = false;
+ uint64_t curr = *offset;
+ while ( !done && rc == 0 )
+ {
+ size_t found_len;
+ rc = read_key_and_len( reader, curr, key_found, &found_len );
+ if ( keys_equal( key_to_find, *key_found ) )
+ {
+ done = true;
+ *offset = curr;
+ }
+ else if ( key_to_find > *key_found )
+ curr += found_len;
+ else
+ {
+ done = true;
+ rc = SILENT_RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t full_table_seek( struct lookup_reader * reader, uint64_t key_to_find, uint64_t * key_found )
+{
+ /* we have no index! search the whole thing... */
+ uint64_t offset = 0;
+ rc_t rc = loop_until_key_found( reader, key_to_find, key_found, &offset );
+ if ( rc == 0 )
+ {
+ if ( keys_equal( key_to_find, *key_found ) )
+ reader->pos = offset;
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ ErrMsg( "seek_lookup_reader( key: %ld ) -> %R", key_to_find, rc );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t indexed_seek( struct lookup_reader * reader, uint64_t key_to_find, uint64_t * key_found, bool exactly )
+{
+ /* we have a index! find set pos to the found offset */
+ uint64_t offset = 0;
+ uint64_t max_key;
+ rc_t rc = get_max_key( reader->index, &max_key );
+ if ( rc == 0 )
+ {
+ if ( key_to_find > max_key )
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcId, rcTooBig );
+ else
+ {
+ rc = get_nearest_offset( reader->index, key_to_find, key_found, &offset ); /* in index.c */
+ if ( rc == 0 )
+ {
+ if ( keys_equal( key_to_find, *key_found ) )
+ reader->pos = offset;
+ else
+ {
+ if ( exactly )
+ {
+ rc = loop_until_key_found( reader, key_to_find, key_found, &offset );
+ if ( rc == 0 )
+ {
+ if ( keys_equal( key_to_find, *key_found ) )
+ reader->pos = offset;
+ else
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ }
+ else
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ }
+ else
+ {
+ reader->pos = offset;
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcId, rcNotFound );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t seek_lookup_reader( struct lookup_reader * reader, uint64_t key_to_find, uint64_t * key_found, bool exactly )
+{
+ rc_t rc = 0;
+ if ( reader == NULL || key_found == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcInvalid );
+ ErrMsg( "seek_lookup_reader() -> %R", rc );
+ }
+ else
+ {
+ if ( reader->index != NULL )
+ {
+ rc = indexed_seek( reader, key_to_find, key_found, exactly );
+ if ( rc != 0 )
+ rc = full_table_seek( reader, key_to_find, key_found );
+ }
+ else
+ rc = full_table_seek( reader, key_to_find, key_found );
+ }
+ return rc;
+}
+
+
+rc_t get_packed_and_key_from_lookup_reader( struct lookup_reader * reader,
+ uint64_t * key, SBuffer * packed_bases )
+{
+ rc_t rc;
+ if ( reader == NULL || key == NULL || packed_bases == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcParam, rcInvalid );
+ ErrMsg( "get_packed_and_key_from_lookup_reader() -> %R", rc );
+ }
+ else
+ {
+ size_t num_read;
+ char buffer1[ 10 ];
+ rc = KFileRead( reader->f, reader->pos, buffer1, sizeof buffer1, &num_read );
+ if ( rc != 0 )
+ ErrMsg( "KFileRead( at %ld, to_read %u ) -> %R", reader->pos, sizeof buffer1, rc );
+ else if ( num_read != sizeof buffer1 )
+ rc = SILENT_RC( rcVDB, rcNoTarg, rcReading, rcFormat, rcInvalid );
+ else
+ {
+ uint16_t dna_len;
+ size_t to_read;
+ char * dst = ( char * )packed_bases->S.addr;
+
+ memmove( key, buffer1, sizeof *key );
+
+ dna_len = buffer1[ 8 ];
+ dna_len <<= 8;
+ dna_len |= buffer1[ 9 ];
+ dst[ 0 ] = buffer1[ 8 ];
+ dst[ 1 ] = buffer1[ 9 ];
+ dst += 2;
+ to_read = ( dna_len & 1 ) ? ( dna_len + 1 ) >> 1 : dna_len >> 1;
+ if ( to_read > ( packed_bases->buffer_size - 2 ) )
+ to_read = ( packed_bases->buffer_size - 2 );
+ if ( rc == 0 )
+ {
+ rc = KFileRead( reader->f, reader->pos + 10, dst, to_read, &num_read );
+ if ( rc != 0 )
+ ErrMsg( "KFileRead( at %ld, to_read %u ) -> %R", reader->pos + 10, to_read, rc );
+ else if ( num_read != to_read )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcReading, rcFormat, rcInvalid );
+ ErrMsg( "KFileRead( %ld ) %d vs %d -> %R", reader->pos + 10, num_read, to_read, rc );
+ }
+ else
+ {
+ packed_bases->S.len = packed_bases->S.size = num_read + 2;
+ reader->pos += ( num_read + 10 );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t get_packed_from_lookup_reader( struct lookup_reader * reader,
+ int64_t * seq_spot_id, uint32_t * seq_read_id, SBuffer * packed_bases )
+{
+ uint64_t key;
+ rc_t rc = get_packed_and_key_from_lookup_reader( reader, &key, packed_bases );
+ if ( rc == 0 )
+ {
+ *seq_spot_id = key >> 1;
+ *seq_read_id = key & 1 ? 2 : 1;
+ }
+ return rc;
+}
+
+
+rc_t get_bases_from_lookup_reader( struct lookup_reader * reader,
+ int64_t * seq_spot_id, uint32_t * seq_read_id, SBuffer * bases )
+{
+ rc_t rc = get_packed_from_lookup_reader( reader, seq_spot_id, seq_read_id, &reader->buf );
+ if ( rc == 0 )
+ unpack_4na( &reader->buf.S, bases );
+ return rc;
+}
+
+
+rc_t lookup_bases( struct lookup_reader * lookup, int64_t row_id, uint32_t read_id, SBuffer * B )
+{
+ int64_t found_seq_spot_id;
+ uint32_t found_seq_read_id;
+ rc_t rc = get_bases_from_lookup_reader( lookup, &found_seq_spot_id, &found_seq_read_id, B );
+ if ( rc == 0 )
+ {
+ if ( found_seq_spot_id != row_id || found_seq_read_id != read_id )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcTransfer, rcInvalid );
+ ErrMsg( "id-mismatch for seq_id = %lu vs. %lu / read_id = %u vs %lu",
+ found_seq_spot_id, row_id, found_seq_read_id, read_id );
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/lookup_reader.h b/tools/fastdump/lookup_reader.h
new file mode 100644
index 0000000..ecf5ce9
--- /dev/null
+++ b/tools/fastdump/lookup_reader.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_lookup_reader_
+#define _h_lookup_reader_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_helper_
+#include "helper.h"
+#endif
+
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_index_
+#include "index.h"
+#endif
+
+struct lookup_reader;
+
+void release_lookup_reader( struct lookup_reader * reader );
+
+rc_t make_lookup_reader( const KDirectory *dir, const struct index_reader * index,
+ struct lookup_reader ** reader, size_t buf_size, const char * fmt, ... );
+
+rc_t seek_lookup_reader( struct lookup_reader * reader, uint64_t key, uint64_t * key_found, bool exactly );
+
+rc_t get_packed_and_key_from_lookup_reader( struct lookup_reader * reader,
+ uint64_t * key, SBuffer * packed_bases );
+
+rc_t get_packed_from_lookup_reader( struct lookup_reader * reader,
+ int64_t * seq_spot_id, uint32_t * seq_read_id, SBuffer * packed_bases );
+
+rc_t get_bases_from_lookup_reader( struct lookup_reader * reader,
+ int64_t * seq_spot_id, uint32_t * seq_read_id, SBuffer * bases );
+
+rc_t lookup_bases( struct lookup_reader * lookup, int64_t row_id, uint32_t read_id, SBuffer * B );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/lookup_writer.c b/tools/fastdump/lookup_writer.c
new file mode 100644
index 0000000..badea64
--- /dev/null
+++ b/tools/fastdump/lookup_writer.c
@@ -0,0 +1,138 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "lookup_writer.h"
+#include "helper.h"
+
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+typedef struct lookup_writer
+{
+ struct KFile * f;
+ struct index_writer * idx;
+ SBuffer buf;
+ uint64_t pos;
+} lookup_writer;
+
+
+void release_lookup_writer( struct lookup_writer * writer )
+{
+ if ( writer != NULL )
+ {
+ if ( writer->f != NULL ) KFileRelease( writer->f );
+ release_SBuffer( &writer->buf );
+ free( ( void * ) writer );
+ }
+}
+
+
+rc_t make_lookup_writer( KDirectory *dir, struct index_writer * idx,
+ struct lookup_writer ** writer, size_t buf_size,
+ const char * fmt, ... )
+{
+ rc_t rc;
+ struct KFile * f;
+
+ va_list args;
+ va_start ( args, fmt );
+
+ rc = KDirectoryVCreateFile( dir, &f, false, 0664, kcmInit, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryVCreateFile() -> %R", rc );
+ else
+ {
+ struct KFile * temp_file;
+ rc = KBufFileMakeWrite( &temp_file, f, false, buf_size );
+ KFileRelease( f );
+ if ( rc != 0 )
+ ErrMsg( "KBufFileMakeWrite() -> %R", rc );
+ else
+ {
+ lookup_writer * w = calloc( 1, sizeof * w );
+ if ( w == NULL )
+ {
+ KFileRelease( temp_file );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * w ), rc );
+ }
+ else
+ {
+ w->f = temp_file;
+ w->idx = idx;
+ rc = make_SBuffer( &w->buf, 4096 );
+ if ( rc == 0 )
+ *writer = w;
+ else
+ release_lookup_writer( w );
+ }
+ }
+ }
+ va_end ( args );
+ return rc;
+}
+
+
+rc_t write_unpacked_to_lookup_writer( struct lookup_writer * writer,
+ int64_t seq_spot_id, uint32_t seq_read_id, const String * bases_as_unpacked_4na )
+{
+ pack_4na( bases_as_unpacked_4na, &writer->buf );
+ return write_packed_to_lookup_writer( writer, make_key( seq_spot_id, seq_read_id ), &writer->buf.S );
+}
+
+rc_t write_packed_to_lookup_writer( struct lookup_writer * writer,
+ uint64_t key, const String * bases_as_packed_4na )
+{
+ size_t num_writ;
+ rc_t rc = KFileWrite( writer->f, writer->pos, &key, sizeof key, &num_writ );
+ if ( rc != 0 )
+ ErrMsg( "KFileWriteAll( key ) -> %R", rc );
+ else if ( num_writ != sizeof key )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
+ ErrMsg( "KFileWriteAll( key ) -> %R", rc );
+ }
+ else
+ {
+ uint64_t start_pos = writer->pos;
+ writer->pos += num_writ;
+ rc = KFileWrite( writer->f, writer->pos, bases_as_packed_4na->addr, bases_as_packed_4na->size, &num_writ );
+ if ( rc != 0 )
+ ErrMsg( "KFileWriteAll( bases ) -> %R", rc );
+ else if ( num_writ != bases_as_packed_4na->size )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcFormat, rcInvalid );
+ ErrMsg( "KFileWriteAll( bases ) -> %R", rc );
+ }
+ else
+ {
+ if ( writer->idx != NULL )
+ rc = write_key( writer->idx, key, start_pos );
+ writer->pos += num_writ;
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/lookup_writer.h b/tools/fastdump/lookup_writer.h
new file mode 100644
index 0000000..9e83051
--- /dev/null
+++ b/tools/fastdump/lookup_writer.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_lookup_writer_
+#define _h_lookup_writer_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_index_
+#include "index.h"
+#endif
+
+struct lookup_writer;
+
+void release_lookup_writer( struct lookup_writer * writer );
+
+rc_t make_lookup_writer( KDirectory *dir, struct index_writer * idx, struct lookup_writer ** writer,
+ size_t buf_size, const char * fmt, ... );
+
+rc_t write_unpacked_to_lookup_writer( struct lookup_writer * writer,
+ int64_t seq_spot_id, uint32_t seq_read_id, const String * bases_as_unpacked_4na );
+
+rc_t write_packed_to_lookup_writer( struct lookup_writer * writer,
+ uint64_t key, const String * bases_as_packed_4na );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/merge_sorter.c b/tools/fastdump/merge_sorter.c
new file mode 100644
index 0000000..2080e8a
--- /dev/null
+++ b/tools/fastdump/merge_sorter.c
@@ -0,0 +1,173 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "merge_sorter.h"
+#include "lookup_reader.h"
+#include "lookup_writer.h"
+#include "index.h"
+#include "helper.h"
+
+typedef struct merge_src
+{
+ struct lookup_reader * reader;
+ uint64_t key;
+ SBuffer packed_bases;
+ rc_t rc;
+} merge_src;
+
+
+typedef struct merge_sorter
+{
+ const merge_sorter_params * params;
+ merge_src * src_list;
+ struct lookup_writer * dst;
+ struct index_writer * idx;
+} merge_sorter;
+
+
+void release_merge_sorter( struct merge_sorter *ms )
+{
+ if ( ms != NULL )
+ {
+ uint32_t i;
+ release_lookup_writer( ms->dst );
+ release_index_writer( ms->idx );
+ if ( ms->src_list != NULL )
+ {
+ for ( i = 0; i < ms->params->count; ++i )
+ {
+ merge_src * src = &ms->src_list[ i ];
+ release_lookup_reader( src->reader );
+ release_SBuffer( &src->packed_bases );
+ }
+ free( ( void * ) ms->src_list );
+ }
+
+ free( ( void * ) ms );
+ }
+}
+
+
+rc_t make_merge_sorter( struct merge_sorter ** ms, const merge_sorter_params * params )
+{
+ rc_t rc = 0;
+ merge_sorter * m = calloc( 1, sizeof * m );
+ if ( m == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * m ), rc );
+ }
+ else
+ {
+ if ( params->index_filename != NULL )
+ rc = make_index_writer( params->dir, &m->idx, params->buf_size,
+ 20000, "%s", params->index_filename );
+
+ if ( rc == 0 )
+ {
+ rc = make_lookup_writer( params->dir, m->idx, &m->dst, params->buf_size,
+ "%s", params->output_filename );
+ if ( rc == 0 )
+ {
+ m->src_list = calloc( params->count, sizeof * m->src_list );
+ if ( m->src_list == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( ( sizeof * m->src_list ) * params->count ), rc );
+ }
+ else
+ {
+ m->params = params;
+ *ms = m;
+ }
+ }
+ }
+ }
+ if ( rc != 0 )
+ release_merge_sorter( m );
+ return rc;
+}
+
+
+rc_t add_merge_sorter_src( struct merge_sorter *ms, const char * filename, uint32_t id )
+{
+ rc_t rc;
+ if ( id >= ms->params->count )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "add_merge_sorter_src() ... invalid id of %d", id );
+ }
+ else
+ {
+ merge_src * src = &ms->src_list[ id ];
+ rc = make_lookup_reader( ms->params->dir, NULL, &src->reader, ms->params->buf_size, "%s", filename );
+ if ( rc == 0 )
+ {
+ rc = make_SBuffer( &src->packed_bases, 4096 );
+ if ( rc == 0 )
+ src->rc = get_packed_and_key_from_lookup_reader( src->reader, &src->key, &src->packed_bases );
+ }
+ }
+ return rc;
+}
+
+
+static merge_src * get_min_merge_src( merge_src * src, uint32_t count )
+{
+ merge_src * res = NULL;
+ uint32_t i;
+ for ( i = 0; i < count; ++i )
+ {
+ merge_src * item = &src[ i ];
+ if ( item->rc == 0 )
+ {
+ if ( res == NULL )
+ res = item;
+ else if ( item->key < res->key )
+ res = item;
+ }
+ }
+ return res;
+}
+
+rc_t CC Quitting();
+
+rc_t run_merge_sorter( struct merge_sorter *ms )
+{
+ rc_t rc = 0;
+ merge_src * to_write = get_min_merge_src( ms->src_list, ms->params->count );
+ while( rc == 0 && to_write != NULL )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = write_packed_to_lookup_writer( ms->dst, to_write->key, &to_write->packed_bases.S );
+ if ( rc == 0 )
+ to_write->rc = get_packed_and_key_from_lookup_reader( to_write->reader, &to_write->key, &to_write->packed_bases );
+ to_write = get_min_merge_src( ms->src_list, ms->params->count );
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastdump/merge_sorter.h b/tools/fastdump/merge_sorter.h
new file mode 100644
index 0000000..fe3352c
--- /dev/null
+++ b/tools/fastdump/merge_sorter.h
@@ -0,0 +1,66 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_merge_sorter_
+#define _h_merge_sorter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+struct merge_sorter;
+
+typedef struct merge_sorter_params
+{
+ KDirectory *dir;
+ const char * output_filename;
+ const char * index_filename;
+ uint32_t count;
+ size_t buf_size;
+} merge_sorter_params;
+
+
+rc_t make_merge_sorter( struct merge_sorter ** ms, const merge_sorter_params * params );
+
+rc_t add_merge_sorter_src( struct merge_sorter *ms, const char * filename, uint32_t id );
+
+void release_merge_sorter( struct merge_sorter *ms );
+
+rc_t run_merge_sorter( struct merge_sorter *ms );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/raw_read_iter.c b/tools/fastdump/raw_read_iter.c
new file mode 100644
index 0000000..ca5ab5e
--- /dev/null
+++ b/tools/fastdump/raw_read_iter.c
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "raw_read_iter.h"
+#include "cmn_iter.h"
+#include "helper.h"
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+typedef struct raw_read_iter
+{
+ struct cmn_iter * cmn;
+ uint32_t seq_spot_id, seq_read_id, raw_read_id;
+} raw_read_iter;
+
+
+void destroy_raw_read_iter( struct raw_read_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ destroy_cmn_iter( iter->cmn );
+ free( ( void * ) iter );
+ }
+}
+
+
+rc_t make_raw_read_iter( cmn_params * params, struct raw_read_iter ** iter )
+{
+
+ rc_t rc = 0;
+ raw_read_iter * i = calloc( 1, sizeof * i );
+ if ( i == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "make_raw_read_iter.calloc( %d ) -> %R", ( sizeof * i ), rc );
+ }
+ else
+ {
+ rc = make_cmn_iter( params, "PRIMARY_ALIGNMENT", &i->cmn );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "SEQ_SPOT_ID", &i->seq_spot_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "SEQ_READ_ID", &i->seq_read_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "(INSDC:4na:bin)RAW_READ", &i->raw_read_id );
+ if ( rc == 0 )
+ rc = cmn_iter_range( i->cmn, i->seq_spot_id );
+
+ if ( rc != 0 )
+ destroy_raw_read_iter( i );
+ else
+ *iter = i;
+ }
+ return rc;
+}
+
+
+bool get_from_raw_read_iter( struct raw_read_iter * iter, raw_read_rec * rec, rc_t * rc )
+{
+ bool res = cmn_iter_next( iter->cmn, rc );
+ if ( res )
+ {
+ *rc = cmn_read_uint64( iter->cmn, iter->seq_spot_id, &rec->seq_spot_id );
+ if ( *rc == 0 )
+ *rc = cmn_read_uint32( iter->cmn, iter->seq_read_id, &rec->seq_read_id );
+ if ( *rc == 0 )
+ *rc = cmn_read_String( iter->cmn, iter->raw_read_id, &rec->raw_read );
+ }
+ return res;
+}
+
+
+uint64_t get_row_count_of_raw_read( struct raw_read_iter * iter )
+{
+ return cmn_iter_row_count( iter->cmn );
+}
diff --git a/tools/fastdump/raw_read_iter.h b/tools/fastdump/raw_read_iter.h
new file mode 100644
index 0000000..11d2229
--- /dev/null
+++ b/tools/fastdump/raw_read_iter.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_raw_read_iter_
+#define _h_raw_read_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_cmn_iter_
+#include "cmn_iter.h"
+#endif
+
+struct raw_read_iter;
+
+typedef struct raw_read_rec
+{
+ uint64_t seq_spot_id;
+ uint32_t seq_read_id;
+ String raw_read;
+} raw_read_rec;
+
+void destroy_raw_read_iter( struct raw_read_iter * iter );
+
+rc_t make_raw_read_iter( cmn_params * params, struct raw_read_iter ** iter );
+
+bool get_from_raw_read_iter( struct raw_read_iter * iter, raw_read_rec * rec, rc_t * rc );
+
+uint64_t get_row_count_of_raw_read( struct raw_read_iter * iter );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/readme.txt b/tools/fastdump/readme.txt
new file mode 100644
index 0000000..20e270c
--- /dev/null
+++ b/tools/fastdump/readme.txt
@@ -0,0 +1,92 @@
+Here is an example how to use the new fastdump-tool:
+
+The usage is in 2 stages:
+( stage 1 ) create a lookup-file from the accession
+ SRRXXXXXX ---> SRRXXXXXX.lookup
+
+( stage 2 ) create the final output from the accession using the lookupfile
+ SRRXXXXXX + SRRXXXXXX.lookup ---> SRRXXXXXX.txt
+
+
+example: accession = SRR833540
+
+================================================================================
+ stage 1:
+================================================================================
+
+(version a)
+create the lookup-file in the current directory, with memory limit of 4 GB
+
+fastdump SRR833540 -f lookup -o SRR833540.lookup -m 4G -p
+
+This will create a number of temporary files in your current directory.
+Make shure you have enough space for that. The lookup-file for this accession
+(SRR833540.lookup) will be about 121 GB in size. You will need double that space
+because of the temporary files. The tool will delete them after it created the
+lookup-file. How much memory should you give to the tool? Look at your
+available memory with 'free -h'. Give it about half as much as your free memory.
+You can give it more, but that will result in memory beeing swaped and that will
+result in a big slow down. One of our machines took about 500 minutes for this,
+without swapping. The '-p' switch turns a percent-bar on.
+
+
+
+(version b)
+create the lookup-file in the current directory, with memory limit of 4 GB on 6 threads
+
+fastdump SRR833540 -f lookup -o SRR833540.lookup -m 4G -e 6 -p
+
+This will create the same output, but much faster. But now you are using 4 GB on
+each of the 6 threads. You will need more than 4 GB * 6 = 24 GB, you will need
+about 35 GB of memory because other parts of the tool need memory too. If you do not
+have that much memory, reduce the amount of memory per thread or the number of threads
+until it fits your machine. You can check how much is actually used with
+'top -u your_username'. If you specify 6 threads, you should see about 600% of
+CPU utilization. If you see less than that you are limited by the speed of the
+filesystem access. Make shure that SRR833540 is local on your filesystem and all
+the references it uses are locally accessible too. This took us about 110 minutes.
+
+
+How do you know the accession is local?
+
+'vdb-dump SRR833540 --info'
+
+If the path points to your local filesystem ( '/home/user/ncbi/...' etc. )
+ ---> you are good to go.
+
+If the path points to a remote url ( 'http://sra-download.ncbi...' etc. )
+ ---> download the accession first, with the prefetch-tool.
+
+How do you know that you have all references locally?
+
+'sra-pileup SRR833540 --function ref'
+
+This will list all references used by the accession.
+If the location points to your local filesystem, your are good to go. If the location
+points to a remote url, download the references with the prefetch-tool.
+
+If after prefetch the accession is still not found locally, you have a configuration issue.
+
+If you have a SSD available, that helps too!
+
+================================================================================
+ stage 2:
+================================================================================
+
+(version a)
+create the lookup-file in the current directory into a file with percent-bar
+
+fastdump SRR833540 -l SRR833540.lookup -o SRR833540.txt -p
+
+
+(version b)
+create the output on stdout ( to be piped into other tools )
+
+fastdump SRR833540 -l SRR833540.lookup
+
+The output will be in this text-format:
+ID<tab>READ<tab>SPOTGROUP
+
+If you want FASTQ instead, add the option '-f fastq'.
+
+
diff --git a/tools/fastdump/sorter.c b/tools/fastdump/sorter.c
new file mode 100644
index 0000000..21d9325
--- /dev/null
+++ b/tools/fastdump/sorter.c
@@ -0,0 +1,538 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "sorter.h"
+#include "lookup_writer.h"
+#include "lookup_reader.h"
+#include "merge_sorter.h"
+#include "helper.h"
+
+#include <klib/vector.h>
+#include <klib/printf.h>
+#include <klib/progressbar.h>
+#include <kproc/thread.h>
+
+/*
+ this is in interfaces/cc/XXX/YYY/atomic.h
+ XXX ... the compiler ( cc, gcc, icc, vc++ )
+ YYY ... the architecture ( fat86, i386, noarch, ppc32, x86_64 )
+ */
+#include <atomic.h>
+
+
+typedef struct sorter
+{
+ sorter_params params;
+ KVector * store;
+ SBuffer buf;
+ uint64_t bytes_in_store;
+ uint32_t sub_file_id;
+} sorter;
+
+
+static void release_sorter( struct sorter * sorter )
+{
+ if ( sorter != NULL )
+ {
+ release_SBuffer( &sorter->buf );
+ if ( sorter->params.src != NULL )
+ destroy_raw_read_iter( sorter->params.src );
+ if ( sorter->store != NULL )
+ KVectorRelease( sorter->store );
+ }
+}
+
+static rc_t init_sorter( struct sorter * sorter, const sorter_params * params )
+{
+ rc_t rc = KVectorMake( &sorter->store );
+ if ( rc != 0 )
+ ErrMsg( "KVectorMake() -> %R", rc );
+ else
+ {
+ rc = make_SBuffer( &sorter->buf, 4096 );
+ if ( rc == 0 )
+ {
+ sorter->params.dir = params->dir;
+ sorter->params.output_filename = params->output_filename;
+ sorter->params.index_filename = NULL;
+ sorter->params.temp_path = params->temp_path;
+ sorter->params.src = params->src;
+ sorter->params.buf_size = params->buf_size;
+ sorter->params.mem_limit = params->mem_limit;
+ sorter->params.prefix = params->prefix;
+ sorter->bytes_in_store = 0;
+ sorter->sub_file_id = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t make_subfilename( const sorter_params * params, uint32_t id, char * buffer, size_t buflen )
+{
+ rc_t rc;
+ size_t num_writ;
+ if ( params->temp_path != NULL )
+ {
+ uint32_t l = string_measure( params->temp_path, NULL );
+ if ( l == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "make_subfilename.string_measure() = 0 -> %R", rc );
+ }
+ else
+ {
+ if ( params->temp_path[ l-1 ] == '/' )
+ rc = string_printf( buffer, buflen, &num_writ, "%ssub_%d_%d.dat",
+ params->temp_path, params->prefix, id );
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "%s/sub_%d_%d.dat",
+ params->temp_path, params->prefix, id );
+ }
+ }
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "sub_%d_%d.dat",
+ params->prefix, id );
+
+ if ( rc != 0 )
+ ErrMsg( "make_subfilename.string_printf() -> %R", rc );
+ return rc;
+}
+
+
+static rc_t make_dst_filename( const sorter_params * params, char * buffer, size_t buflen )
+{
+ rc_t rc;
+ size_t num_writ;
+ if ( params->prefix > 0 )
+ {
+ if ( params->temp_path != NULL )
+ {
+ uint32_t l = string_measure( params->temp_path, NULL );
+ if ( l == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "make_subfilename.string_measure() = 0 -> %R", rc );
+ }
+ else
+ {
+ if ( params->temp_path[ l-1 ] == '/' )
+ rc = string_printf( buffer, buflen, &num_writ, "%stmp_%d.dat",
+ params->temp_path, params->prefix );
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "%s/tmp_%d.dat",
+ params->temp_path, params->prefix );
+ }
+ }
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "tmp_%d.dat", params->prefix );
+ }
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "%s", params->output_filename );
+
+ if ( rc != 0 )
+ ErrMsg( "make_dst_filename.string_printf() -> %R", rc );
+ return rc;
+}
+
+
+static rc_t CC on_store_entry( uint64_t key, const void *value, void *user_data )
+{
+ const String * bases = value;
+ struct lookup_writer * writer = user_data;
+ rc_t rc = write_packed_to_lookup_writer( writer, key, bases );
+ StringWhack( bases );
+ return rc;
+}
+
+
+static rc_t save_store( struct sorter * sorter )
+{
+ rc_t rc = 0;
+ if ( sorter->bytes_in_store > 0 )
+ {
+ char buffer[ 4096 ];
+ struct lookup_writer * writer;
+
+ if ( sorter->params.mem_limit > 0 )
+ {
+ rc = make_subfilename( &sorter->params, sorter->sub_file_id, buffer, sizeof buffer );
+ if ( rc == 0 )
+ sorter->sub_file_id++;
+ }
+ else
+ rc = make_dst_filename( &sorter->params, buffer, sizeof buffer );
+
+ if ( rc == 0 )
+ rc = make_lookup_writer( sorter->params.dir, NULL, &writer, sorter->params.buf_size, "%s", buffer );
+
+ if ( rc == 0 )
+ {
+ rc = KVectorVisitPtr( sorter->store, false, on_store_entry, writer );
+ release_lookup_writer( writer );
+ }
+ if ( rc == 0 )
+ {
+ sorter->bytes_in_store = 0;
+ rc = KVectorRelease( sorter->store );
+ if ( rc != 0 )
+ ErrMsg( "KVectorRelease() -> %R", rc );
+ else
+ {
+ sorter->store = NULL;
+ rc = KVectorMake( &sorter->store );
+ if ( rc != 0 )
+ ErrMsg( "KVectorMake() -> %R", rc );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t write_to_sorter( struct sorter * sorter, int64_t seq_spot_id, uint32_t seq_read_id,
+ const String * unpacked_bases )
+{
+ /* we write it to the store...*/
+ rc_t rc;
+ const String * to_store;
+ pack_4na( unpacked_bases, &sorter->buf );
+ rc = StringCopy( &to_store, &sorter->buf.S );
+ if ( rc != 0 )
+ ErrMsg( "StringCopy() -> %R", rc );
+ else
+ {
+ uint64_t key = make_key( seq_spot_id, seq_read_id );
+ rc = KVectorSetPtr( sorter->store, key, (const void *)to_store );
+ if ( rc != 0 )
+ ErrMsg( "KVectorSetPtr() -> %R", rc );
+ else
+ {
+ size_t item_size = ( sizeof key ) + ( sizeof *to_store ) + to_store->size;
+ sorter->bytes_in_store += item_size;
+ }
+ }
+
+ if ( rc == 0 &&
+ sorter->params.mem_limit > 0 &&
+ sorter->bytes_in_store >= sorter->params.mem_limit )
+ rc = save_store( sorter );
+ return rc;
+}
+
+
+static rc_t delete_sub_files( const sorter_params * params, uint32_t count )
+{
+ rc_t rc = 0;
+ char buffer[ 4096 ];
+ uint32_t i;
+ for ( i = 0; rc == 0 && i < count; ++ i )
+ {
+ rc = make_subfilename( params, i, buffer, sizeof buffer );
+ if ( rc == 0 )
+ rc = KDirectoryRemove( params->dir, true, "%s", buffer );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryRemove( 'sub_%d.dat' ) -> %R", i, rc );
+ }
+ return rc;
+}
+
+
+static rc_t final_merge_sort( const sorter_params * params, uint32_t count )
+{
+ rc_t rc = 0;
+ if ( count > 0 )
+ {
+ char buffer[ 4096 ];
+ rc = make_dst_filename( params, buffer, sizeof buffer );
+ if ( rc == 0 )
+ {
+ merge_sorter_params msp;
+ struct merge_sorter * ms;
+ uint32_t i;
+
+ msp.dir = params->dir;
+ msp.output_filename = buffer;
+ msp.index_filename = params->index_filename;
+ msp.count = count;
+ msp.buf_size = params->buf_size;
+
+ rc = make_merge_sorter( &ms, &msp );
+ for ( i = 0; rc == 0 && i < count; ++i )
+ {
+ char buffer2[ 4096 ];
+ rc = make_subfilename( params, i, buffer2, sizeof buffer2 );
+ if ( rc == 0 )
+ rc = add_merge_sorter_src( ms, buffer2, i );
+ }
+ if ( rc == 0 )
+ rc = run_merge_sorter( ms );
+
+ release_merge_sorter( ms );
+ }
+
+ if ( rc == 0 )
+ rc = delete_sub_files( params, count );
+ }
+ return rc;
+}
+
+rc_t CC Quitting();
+
+rc_t run_sorter( const sorter_params * params )
+{
+ sorter sorter;
+ rc_t rc = init_sorter( &sorter, params );
+ if ( rc == 0 )
+ {
+ raw_read_rec rec;
+ while ( rc == 0 && get_from_raw_read_iter( sorter.params.src, &rec, &rc ) )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = write_to_sorter( &sorter, rec.seq_spot_id, rec.seq_read_id, &rec.raw_read );
+ if ( rc == 0 && params->sort_progress != NULL )
+ atomic_inc( params->sort_progress );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = save_store( &sorter );
+
+ if ( rc == 0 && sorter.params.mem_limit > 0 )
+ rc = final_merge_sort( params, sorter.sub_file_id );
+
+ release_sorter( &sorter );
+ }
+ return rc;
+}
+
+/* -------------------------------------------------------------------------------------------- */
+
+static uint64_t find_out_row_count( const sorter_params * params )
+{
+ rc_t rc;
+ uint64_t res = 0;
+ struct raw_read_iter * iter;
+ cmn_params cp;
+
+ cp.dir = params->dir;
+ cp.acc = params->acc;
+ cp.row_range = NULL;
+ cp.first = 0;
+ cp.count = 0;
+ cp.cursor_cache = params->cursor_cache;
+ cp.show_progress = false;
+
+ rc = make_raw_read_iter( &cp, &iter );
+ if ( rc == 0 )
+ {
+ res = get_row_count_of_raw_read( iter );
+ destroy_raw_read_iter( iter );
+ }
+ return res;
+}
+
+
+static rc_t make_pool_src_filename( const sorter_params * params, uint32_t id,
+ char * buffer, size_t buflen )
+{
+ rc_t rc;
+ size_t num_writ;
+ if ( params->temp_path != NULL )
+ {
+ uint32_t l = string_measure( params->temp_path, NULL );
+ if ( l == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "make_subfilename.string_measure() = 0 -> %R", rc );
+ }
+ else
+ {
+ if ( params->temp_path[ l - 1 ] == '/' )
+ rc = string_printf( buffer, buflen, &num_writ, "%stmp_%d.dat",
+ params->temp_path, id );
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "%s/tmp_%d.dat",
+ params->temp_path, id );
+ }
+ }
+ else
+ rc = string_printf( buffer, buflen, &num_writ, "tmp_%d.dat", id );
+
+ if ( rc != 0 )
+ ErrMsg( "make_pool_src_filename.string_printf() -> %R", rc );
+ return rc;
+}
+
+
+static rc_t delete_tmp_files( const sorter_params * params, uint32_t count )
+{
+ rc_t rc = 0;
+ char buffer[ 4096 ];
+ uint32_t i;
+ for ( i = 0; rc == 0 && i < count; ++ i )
+ {
+ make_pool_src_filename( params, i + 1, buffer, sizeof buffer );
+ if ( rc == 0 )
+ rc = KDirectoryRemove( params->dir, true, "%s", buffer );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryRemove( 'tmp_%d.dat' ) -> %R", rc );
+ }
+ return rc;
+}
+
+
+static rc_t merge_pool_files( const sorter_params * params )
+{
+ rc_t rc;
+ merge_sorter_params msp;
+ struct merge_sorter * ms;
+
+ msp.dir = params->dir;
+ msp.output_filename = params->output_filename;
+ msp.index_filename = params->index_filename;
+ msp.count = params->num_threads;
+ msp.buf_size = params->buf_size;
+
+ rc = make_merge_sorter( &ms, &msp );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; rc == 0 && i < params->num_threads; ++i )
+ {
+ char buffer[ 4096 ];
+ rc = make_pool_src_filename( params, i + 1, buffer, sizeof buffer );
+ if ( rc == 0 )
+ rc = add_merge_sorter_src( ms, buffer, i );
+ }
+ if ( rc == 0 )
+ rc = run_merge_sorter( ms );
+
+ release_merge_sorter( ms );
+ }
+
+ if ( rc == 0 )
+ rc = delete_tmp_files( params, params->num_threads );
+
+ return rc;
+}
+
+static void init_sorter_params( sorter_params * dst, const sorter_params * params, uint32_t prefix )
+{
+ dst->dir = params->dir;
+ dst->output_filename = NULL;
+ dst->index_filename = params->index_filename;
+ dst->temp_path = params->temp_path;
+ dst->src = NULL;
+ dst->prefix = prefix;
+ dst->mem_limit = params->mem_limit;
+ dst->buf_size = params->buf_size;
+}
+
+static void init_cmn_params( cmn_params * dst, const sorter_params * params, uint64_t row_count )
+{
+ dst->dir = params->dir;
+ dst->acc = params->acc;
+ dst->row_range = NULL;
+ dst->first = 1;
+ dst->count = ( row_count / params->num_threads ) + 1;
+ dst->cursor_cache = params->cursor_cache;
+ dst->show_progress = false;
+}
+
+
+static rc_t CC sort_thread_func( const KThread *self, void *data )
+{
+ rc_t rc = 0;
+ sorter_params * params = data;
+ params->index_filename = NULL;
+ rc = run_sorter( params );
+ free( data );
+ return rc;
+}
+
+
+rc_t run_sorter_pool( const sorter_params * params )
+{
+ rc_t rc = 0;
+ uint64_t row_count = find_out_row_count( params );
+ if ( row_count == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ ErrMsg( "multi_threaded_make_lookup: row_count == 0!" );
+ }
+ else
+ {
+ cmn_params cp;
+ Vector threads;
+ KThread * progress_thread = NULL;
+ uint32_t prefix = 1;
+ multi_progress progress;
+
+ init_progress_data( &progress, row_count );
+ VectorInit( &threads, 0, params->num_threads );
+ init_cmn_params( &cp, params, row_count );
+
+ if ( params->show_progress )
+ rc = start_multi_progress( &progress_thread, &progress );
+
+ while ( rc == 0 && cp.first < row_count )
+ {
+ sorter_params * sp = calloc( 1, sizeof *sp );
+ if ( sp != NULL )
+ {
+ init_sorter_params( sp, params, prefix++ );
+ rc = make_raw_read_iter( &cp, &sp->src );
+
+ if ( rc == 0 )
+ {
+ KThread * thread;
+
+ if ( params->show_progress )
+ sp->sort_progress = &progress.progress_rows;
+ rc = KThreadMake( &thread, sort_thread_func, sp );
+ if ( rc != 0 )
+ ErrMsg( "KThreadMake( sort-thread #%d ) -> %R", prefix - 1, rc );
+ else
+ {
+ rc = VectorAppend( &threads, NULL, thread );
+ if ( rc != 0 )
+ ErrMsg( "VectorAppend( sort-thread #%d ) -> %R", prefix - 1, rc );
+ }
+ }
+ cp.first += cp.count;
+ }
+ }
+
+ join_and_release_threads( &threads );
+ /* all sorter-threads are done now, tell the progress-thread to terminate! */
+ join_multi_progress( progress_thread, &progress );
+ rc = merge_pool_files( params );
+ }
+ return rc;
+}
diff --git a/tools/fastdump/sorter.h b/tools/fastdump/sorter.h
new file mode 100644
index 0000000..1c0aa26
--- /dev/null
+++ b/tools/fastdump/sorter.h
@@ -0,0 +1,75 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sorter_
+#define _h_sorter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_atomic_
+#include <atomic.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_raw_read_iter_
+#include "raw_read_iter.h"
+#endif
+
+
+typedef struct sorter_params
+{
+ KDirectory * dir;
+ const char * acc;
+ const char * output_filename;
+ const char * index_filename;
+ const char * temp_path;
+ struct raw_read_iter * src;
+ size_t buf_size, mem_limit, prefix, num_threads, cursor_cache;
+ atomic_t * sort_progress;
+ bool show_progress;
+} sorter_params;
+
+rc_t run_sorter( const sorter_params * params );
+rc_t run_sorter_pool( const sorter_params * params );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/special_iter.c b/tools/fastdump/special_iter.c
new file mode 100644
index 0000000..1187d8e
--- /dev/null
+++ b/tools/fastdump/special_iter.c
@@ -0,0 +1,98 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "special_iter.h"
+#include "helper.h"
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+typedef struct special_iter
+{
+ struct cmn_iter * cmn;
+ uint32_t prim_alig_id, cmp_read_id, spot_group_id;
+} special_iter;
+
+
+void destroy_special_iter( struct special_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ destroy_cmn_iter( iter->cmn );
+ free( ( void * ) iter );
+ }
+}
+
+rc_t make_special_iter( cmn_params * params, struct special_iter ** iter )
+{
+ rc_t rc = 0;
+ special_iter * i = calloc( 1, sizeof * i );
+ if ( i == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "make_special_iter.calloc( %d ) -> %R", ( sizeof * i ), rc );
+ }
+ else
+ {
+ rc = make_cmn_iter( params, "SEQUENCE", &i->cmn );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "PRIMARY_ALIGNMENT_ID", &i->prim_alig_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "CMP_READ", &i->cmp_read_id );
+ if ( rc == 0 )
+ rc = cmn_iter_add_column( i->cmn, "SPOT_GROUP", &i->spot_group_id );
+ if ( rc == 0 )
+ rc = cmn_iter_range( i->cmn, i->prim_alig_id );
+
+ if ( rc != 0 )
+ destroy_special_iter( i );
+ else
+ *iter = i;
+ }
+ return rc;
+}
+
+
+bool get_from_special_iter( struct special_iter * iter, special_rec * rec, rc_t * rc )
+{
+ bool res = cmn_iter_next( iter->cmn, rc );
+ if ( res )
+ {
+ rec->row_id = cmn_iter_row_id( iter->cmn );
+ *rc = cmn_read_uint64_array( iter->cmn, iter->prim_alig_id, rec->prim_alig_id, 2, &rec->num_reads );
+ if ( *rc == 0 )
+ *rc = cmn_read_String( iter->cmn, iter->cmp_read_id, &rec->cmp_read );
+ if ( *rc == 0 )
+ *rc = cmn_read_String( iter->cmn, iter->spot_group_id, &rec->spot_group );
+ }
+ return res;
+
+}
+
+uint64_t get_row_count_of_special_iter( struct special_iter * iter )
+{
+ return cmn_iter_row_count( iter->cmn );
+}
diff --git a/tools/fastdump/special_iter.h b/tools/fastdump/special_iter.h
new file mode 100644
index 0000000..8bb45ba
--- /dev/null
+++ b/tools/fastdump/special_iter.h
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_special_iter_
+#define _h_special_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_cmn_iter_
+#include "cmn_iter.h"
+#endif
+
+struct special_iter;
+
+typedef struct special_rec
+{
+ int64_t row_id;
+ uint64_t prim_alig_id[ 2 ];
+ uint32_t num_reads;
+ String cmp_read;
+ String spot_group;
+} special_rec;
+
+void destroy_special_iter( struct special_iter * iter );
+
+rc_t make_special_iter( cmn_params * params, struct special_iter ** iter );
+
+bool get_from_special_iter( struct special_iter * iter, special_rec * rec, rc_t * rc );
+
+uint64_t get_row_count_of_special_iter( struct special_iter * iter );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/fastdump/todo.txt b/tools/fastdump/todo.txt
new file mode 100644
index 0000000..258aa29
--- /dev/null
+++ b/tools/fastdump/todo.txt
@@ -0,0 +1,3 @@
+* progress-bar in merge ( if asked for )
+* check memory if no memory-limit provided
+* check for space on scratch or current-directory
\ No newline at end of file
diff --git a/tools/fastdump/verify.sh b/tools/fastdump/verify.sh
new file mode 100755
index 0000000..345a188
--- /dev/null
+++ b/tools/fastdump/verify.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+execute()
+{
+ echo "------------------------------------------------------"
+ echo $1
+ eval $1
+ echo "."
+}
+
+ACC1="SRR341578"
+
+# size is about 20 MB
+# special: 2s vs 3.8s, fastq: 2.3s vs 4.7s
+ACC2="SRR1172940"
+
+# size is about 200 MB
+# special: 13s vs 48s, fastq: 17s vs 57s
+ACC3="SRR353895"
+
+# size is about 2 GB
+# special: 1m13s vs 11m25s, fastq: 1m38s vs 11m56s
+ACC4="SRR392046"
+
+#size is about 20 GB
+#special: 21m34s vs ???, fastq: 34m17s vs 124m20s
+ACC5="SRR534041"
+
+ACC_ONLY_1_READ="SRR449498"
+
+SCRATCH="/panfs/traces01/compress/qa/raetzw/fastdump/"
+THREADS="6"
+
+check_special()
+{
+ ACC="$1"
+ FASTDUMP_OUT="$SCRATCH$ACC.fastdump.special.txt"
+ VDB_DUMP_OUT="$SCRATCH$ACC.vdb_dump.special.txt"
+
+ #remove output
+ CMD="rm -rf $FASTDUMP_OUT $VDB_DUMP_OUT"
+ execute "$CMD"
+
+ #produce the output using the lookup-file
+ CMD="time fastdump $ACC -t $SCRATCH -f special -o $FASTDUMP_OUT -e $THREADS -p"
+ execute "$CMD"
+
+ #produce the same output using vdb-dump with internal schema-joins
+ CMD="time vdb-dump $ACC -C SPOT_ID,READ,SPOT_GROUP -f tab > $VDB_DUMP_OUT"
+ execute "$CMD"
+
+ #verify that the output of fastdump via vdb-dump
+ CMD="time diff -q $FASTDUMP_OUT $VDB_DUMP_OUT"
+ execute "$CMD"
+}
+
+check_fastq()
+{
+ ACC="$1"
+ FASTDUMP_OUT="$SCRATCH$ACC.fastdump.fastq.txt"
+ VDB_DUMP_OUT="$SCRATCH$ACC.vdb_dump.fastq.txt"
+
+ #remove output
+ CMD="rm -rf $FASTDUMP_OUT $VDB_DUMP_OUT"
+ execute "$CMD"
+
+ #produce the output using the lookup-file
+ CMD="time fastdump $ACC -t $SCRATCH -f fastq -o $FASTDUMP_OUT -e $THREADS -p"
+ execute "$CMD"
+
+ #produce the same output using vdb-dump with internal schema-joins
+ CMD="time vdb-dump $ACC -f fastq > $VDB_DUMP_OUT"
+ execute "$CMD"
+
+ #verify that the output of fastdump via vdb-dump
+ CMD="time diff -q $FASTDUMP_OUT $VDB_DUMP_OUT"
+ execute "$CMD"
+}
+
+check_special "$ACC2"
+check_fastq "$ACC2"
diff --git a/tools/fastq-dump/Makefile b/tools/fastq-dump/Makefile
new file mode 100644
index 0000000..bf9d6ae
--- /dev/null
+++ b/tools/fastq-dump/Makefile
@@ -0,0 +1,93 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+
+MODULE = tools/fastq-dump
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ fastq-dump-new \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# Common dumper definitions
+#
+DUMP_LIBS = \
+ -lncbi-ngs-c++ \
+ -lngs-c++ \
+ -lncbi-vdb-static \
+ -lkapp \
+ -stk-version
+
+#-------------------------------------------------------------------------------
+# fastq-dump
+#
+FASTQ_DUMP_SRC = \
+ args \
+ filters \
+ fastq-dump
+
+INCDIRS += -I $(TOP)/ngs/ngs-c++
+
+FASTQ_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQ_DUMP_SRC))
+
+$(BINDIR)/fastq-dump-new: $(FASTQ_DUMP_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(DUMP_LIBS)
diff --git a/tools/fastq-dump/args.cpp b/tools/fastq-dump/args.cpp
new file mode 100644
index 0000000..d7455a4
--- /dev/null
+++ b/tools/fastq-dump/args.cpp
@@ -0,0 +1,622 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <sstream>
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+
+#include <string.h>
+
+#include "args.hpp"
+
+using namespace ngs;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* AOptDef empementation */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+AOptDef :: AOptDef ()
+{
+ reset ();
+} /* AOptDef :: AOptDef () */
+
+AOptDef :: AOptDef ( const AOptDef & OptDef )
+{
+ reset ( OptDef );
+} /* AOptDef :: AOptDef () */
+
+AOptDef :: ~AOptDef ()
+{
+ reset ();
+} /* AOptDef :: ~AOptDef () */
+
+AOptDef &
+AOptDef :: operator = ( const AOptDef & OptDef )
+{
+ if ( this != & OptDef ) {
+ reset ( OptDef );
+ }
+
+ return * this;
+} /* AOptDef :: AOptDef () */
+
+void
+AOptDef :: reset ()
+{
+ _M_name . clear ();
+ _M_aliases . clear ();
+ _M_param . clear ();
+ _M_hlp . clear ();
+ _M_max_count = 0;
+ _M_need_value = true;
+ _M_required = true;
+} /* AOptDef :: reset () */
+
+void
+AOptDef :: reset ( const AOptDef & OptDef )
+{
+ _M_name = OptDef . _M_name;
+ _M_aliases = OptDef . _M_aliases;
+ _M_param = OptDef . _M_param;
+ _M_hlp = OptDef . _M_hlp;
+ _M_max_count = OptDef . _M_max_count;
+ _M_need_value = OptDef . _M_need_value;
+ _M_required = OptDef . _M_required;
+} /* AOptDef :: reset () */
+
+bool
+AOptDef :: good () const
+{
+ return ! _M_name . empty ();
+} /* AOptDef :: good () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* AOPBase impementation */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+AOPBase :: AOPBase ()
+: _M_exist ( false )
+{
+ reset ();
+} /* AOPBase () */
+
+AOPBase :: ~AOPBase ()
+{
+ reset ();
+} /* AOPBase :: ~AOPBase () */
+
+void
+AOPBase :: reset ( const String & , Args * , bool )
+{
+ throw ErrorMsg ( "reset: Unimpemented method" );
+} /* AOPBase :: reset () */
+
+void
+AOPBase :: reset ()
+{
+ _M_exist = false;
+ _M_name . clear ();
+ _M_val . clear ();
+} /* AOPBase :: reset () */
+
+void
+AOPBase :: reset ( const AOPBase & Bse )
+{
+ reset ();
+
+ _M_val = Bse . _M_val;
+ _M_name = Bse . _M_name;
+ _M_exist = Bse . _M_exist;
+} /* AOPBase :: reset () */
+
+uint32_t
+AOPBase :: valCount () const
+{
+/* Not sure about it !!!
+ if ( ! exist () ) {
+ throw ErrorMsg ( "valCount: Value not exits" );
+ }
+
+ return _M_val . size ();
+*/
+
+ return exist () ? _M_val . size () : 0;
+} /* AOPBase :: valCount () */
+
+const String &
+AOPBase :: val ( uint32_t idx ) const
+{
+ uint32_t cnt = valCount ();
+
+ if ( cnt <= idx ) {
+ throw ErrorMsg ( "val: Invalid index" );
+ }
+
+ return _M_val [ idx ];
+} /* AOPBase :: val () */
+
+static
+void CC
+__handle_error ( const char * arg, void * data )
+{
+ std :: stringstream str;
+ str << "Can not convert \"" << arg << "\" to int for paramter \"" << ( char * ) data << "\"";
+ throw ErrorMsg ( str . str () );
+} /* __handle_error () */
+
+uint32_t
+AOPBase :: uint32Val ( uint32_t idx ) const
+{
+ return AsciiToU32 (
+ val ( idx ) . c_str (),
+ __handle_error,
+ ( void * ) _M_name . c_str ()
+ );
+} /* AOPBase :: uint32Val () */
+
+int32_t
+AOPBase :: int32Val ( uint32_t idx ) const
+{
+ return AsciiToI32 (
+ val ( idx ) . c_str (),
+ __handle_error,
+ ( void * ) _M_name . c_str ()
+ );
+} /* AOPBase :: int32Val () */
+
+uint64_t
+AOPBase :: uint64Val ( uint32_t idx ) const
+{
+ return AsciiToU64 (
+ val ( idx ) . c_str (),
+ __handle_error,
+ ( void * ) _M_name . c_str ()
+ );
+} /* AOPBase :: uint64Val () */
+
+int64_t
+AOPBase :: int64Val ( uint32_t idx ) const
+{
+ return AsciiToI64 (
+ val ( idx ) . c_str (),
+ __handle_error,
+ ( void * ) _M_name . c_str ()
+ );
+} /* AOPBase :: int64Val () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* AOptVal impementation */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+AOptVal :: AOptVal ()
+: AOPBase ()
+{
+} /* AOptVal :: AOptVal () */
+
+AOptVal :: AOptVal ( const AOptVal & Val )
+: AOPBase ()
+{
+ AOPBase :: reset ( Val );
+} /* AOptVal :: AOptVal () */
+
+AOptVal &
+AOptVal :: operator = ( const AOptVal & Val )
+{
+ if ( this != & Val ) {
+ AOPBase :: reset ( Val );
+ }
+
+ return * this;
+} /* AOptVal :: operator = () */
+
+void
+AOptVal :: reset ( const String & Name, Args * TheArgs, bool needValue )
+{
+ AOPBase :: reset ();
+
+ if ( TheArgs == NULL ) {
+ throw ErrorMsg ( "reset: NULL args passed" );
+ }
+
+ if ( Name . empty () ) {
+ throw ErrorMsg ( "reset: Empty name passed" );
+ }
+
+ uint32_t count = 0;
+ if ( ArgsOptionCount ( TheArgs, Name . c_str (), & count ) != 0 ) {
+ throw ErrorMsg ( String ( "reset: Can not get count for option \"" ) + Name + "\"" );
+ }
+
+ if ( count == 0 ) {
+ return;
+ }
+
+ _M_val . resize ( count );
+ if ( needValue ) {
+ for ( uint32_t i = 0; i < count; i ++ ) {
+ const void * val = NULL;
+ if ( ArgsOptionValue ( TheArgs, Name . c_str (), i, & val ) != 0 ) {
+ std :: stringstream Vsg;
+ Vsg << "reset: Can not get value for option \"" << Name;
+ Vsg << "\" in series " << i;
+ throw ErrorMsg ( Vsg . str () );
+ }
+
+ _M_val [ i ] = val == NULL ? "" : static_cast <char const*> (val);
+ }
+ }
+
+ _M_name = Name;
+ _M_exist = true;
+} /* AOptVal :: reset () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* AParVal impementation */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+AParVal :: AParVal ()
+: AOPBase ()
+{
+} /* AParVal :: AParVal () */
+
+AParVal :: AParVal ( const AParVal & Val )
+: AOPBase ()
+{
+ AOPBase :: reset ( Val );
+} /* AParVal :: AParVal () */
+
+AParVal &
+AParVal :: operator = ( const AParVal & Val )
+{
+ if ( this != & Val ) {
+ AOPBase :: reset ( Val );
+ }
+
+ return * this;
+} /* AParVal :: operator = () */
+
+void
+AParVal :: reset ( const String & Name, Args * TheArgs, bool )
+{
+ AOPBase :: reset ();
+
+ if ( TheArgs == NULL ) {
+ throw ErrorMsg ( "reset: NULL args passed" );
+ }
+
+ uint32_t count = 0;
+ if ( ArgsParamCount ( TheArgs, & count ) != 0 ) {
+ throw ErrorMsg ( "reset: Can not get count for parameters" );
+ }
+
+ if ( count == 0 ) {
+ return;
+ }
+
+ _M_val . resize ( count );
+ for ( uint32_t i = 0; i < count; i ++ ) {
+ const void * val = NULL;
+ if ( ArgsParamValue ( TheArgs, i, & val ) != 0 ) {
+ std :: stringstream Vsg;
+ Vsg << "reset: Can not get parameter in series " << i;
+ throw ErrorMsg ( Vsg . str () );
+ }
+
+ _M_val [ i ] = static_cast <char const*> (val);
+ }
+
+ _M_name = Name;
+ _M_exist = true;
+} /* AParVal :: reset () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* AArgs impementation */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+AArgs :: MArgs AArgs :: _sM_args;
+
+AArgs :: AArgs ()
+: _M_args ( NULL )
+, _M_standards_added ( false )
+, _M_progName ( "" )
+{
+} /* AArgs :: AArgs () */
+
+AArgs :: ~AArgs ()
+{
+ /* We are not disposing Arguments, it should be done manually */
+} /* AArgs :: ~AArgs () */
+
+void
+AArgs :: init ( bool AddStandardOrguments )
+{
+ if ( good () ) {
+ throw ErrorMsg ( "AArgs: We are good" );
+ }
+
+ Args * TempArgs;
+ if ( ArgsMake ( & TempArgs ) != 0 ) {
+ throw ErrorMsg ( "AArgs: Can not make Args" );
+ }
+
+ if ( TempArgs == NULL ) {
+ throw ErrorMsg ( "AArgs: Can not allocate Args" );
+ }
+
+ if ( AddStandardOrguments ) {
+ try {
+ __addStdOpts ( TempArgs );
+ _M_standards_added = true;
+ }
+ catch ( ... ) {
+ __disposeArgs ( TempArgs );
+
+ throw;
+ }
+ }
+
+ _M_args = TempArgs;
+
+ try {
+ __customInit ();
+ }
+ catch ( ... ) {
+ __disposeArgs ( _M_args );
+
+ _M_args = NULL;
+
+ throw;
+ }
+
+ __regArgs ( _M_args, this );
+
+} /* AArgs :: init () */
+
+void
+AArgs :: __customInit ()
+{
+} /* AArgs :: __customInit () */
+
+void
+AArgs :: dispose ()
+{
+ if ( good () ) {
+ __customDispose ();
+
+ Args * TheArgs = _M_args;
+ _M_args = NULL;
+
+ _M_optDefs . clear ();
+ _M_standards_added = false;
+
+ __deregArgs ( TheArgs );
+ __disposeArgs ( TheArgs );
+
+ _M_progName . clear ();
+ }
+} /* AArgs :: dispose () */
+
+void
+AArgs :: __customDispose ()
+{
+} /* AArgs :: __customDispose () */
+
+void
+AArgs :: __disposeArgs ( Args * TheArgs )
+{
+ if ( TheArgs != NULL ) {
+ ArgsWhack ( TheArgs );
+ }
+} /* AArgs :: __disposeArgs () */
+
+void
+AArgs :: addStdOpts ()
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "addStdOpts: Not good" );
+ }
+
+ try {
+ __addStdOpts ( _M_args );
+ }
+ catch ( ... ) {
+ dispose ();
+
+ throw;
+ }
+} /* AArgs :: addStdOpts () */
+
+static
+void
+__toOpt ( const AOptDef & In, OptDef & Out )
+{
+ if ( ! In . good () ) {
+ throw ErrorMsg ( "__toOpt: IN is not good" );
+ }
+
+ memset ( & Out, 0, sizeof ( OptDef ) );
+
+ Out . name = In . getName ();
+ Out . aliases = In . getAliases ();
+ const char * Hlp = In . getHlp ();
+ Out . help = & Hlp;
+ Out . max_count = In . maxCount ();
+ Out . needs_value = In . needValue ();
+ Out . required = In . required ();
+} /* __toOpt () */
+
+void
+AArgs :: addOpt ( const AOptDef & Opt )
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "addOpt: Not good " );
+ }
+
+ struct OptDef TheOpt;
+ __toOpt ( Opt, TheOpt );
+
+ if ( ArgsAddOptionArray ( _M_args, & TheOpt, 1 ) != 0 ) {
+ throw ErrorMsg ( "addOpt: Can not add option" );
+ }
+
+ _M_optDefs . insert ( _M_optDefs . end (), Opt );
+} /* AArgs :: addOpt () */
+
+void
+AArgs :: __addStdOpts ( Args * TheArgs )
+{
+ if ( TheArgs == NULL ) {
+ throw ErrorMsg ( "__addStdOpts: Very not good" );
+ }
+
+ if ( ArgsAddStandardOptions ( TheArgs ) != 0 ) {
+ throw ErrorMsg ( "__addStdOpts: Can not add standard options" );
+ }
+} /* AArgs :: __addStdOpts () */
+
+void
+AArgs :: parse ( int argc, char ** argv )
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "parseArgs: Not good" );
+ }
+
+ if ( ArgsParse ( _M_args, argc, argv ) != 0 ) {
+ throw ErrorMsg ( "parseArgs: Can not parse arguments" );
+ }
+
+ const char * prog;
+ if ( ArgsProgram ( _M_args, NULL, & prog ) != 0 ) {
+ throw ErrorMsg ( "parseArgs: Can not extract Progname" );
+ }
+ _M_progName = prog;
+
+ /*) Here we should handle standard argumends
+ NOTE: help and version are managing authomatically
+ (*/
+ if ( _M_standards_added ) {
+ if ( ArgsHandleStandardOptions ( _M_args ) != 0 ) {
+ throw ErrorMsg ( "parseArgs: Can not handle standard options" );
+ }
+ }
+
+ __customParse ();
+} /* AArgs :: parse () */
+
+void
+AArgs :: __customParse ()
+{
+ /* nothing to do here */
+} /* AArgs :: __customParse () */
+
+void
+AArgs :: __regArgs ( Args * TheArgs, AArgs * TheAArgs )
+{
+ if ( __getArgs ( TheArgs ) != NULL ) {
+ throw ErrorMsg ( "__regArgs: Already registered" );
+ }
+
+ _sM_args [ TheArgs ] = TheAArgs;
+} /* AArgs :: __regArgs () */
+
+AArgs *
+AArgs :: __getArgs ( Args * TheArgs )
+{
+ if ( TheArgs != NULL ) {
+ MArgsI Iter = _sM_args . find ( TheArgs );
+ if ( Iter != _sM_args . end () ) {
+ return ( * Iter ) . second;
+ }
+ }
+ return NULL;
+} /* AArgs :: __getArgs () */
+
+void
+AArgs :: __deregArgs ( Args * TheArgs )
+{
+ if ( TheArgs != NULL ) {
+ MArgsI Iter = _sM_args . find ( TheArgs );
+ if ( Iter != _sM_args . end () ) {
+ _sM_args . erase ( Iter );
+ }
+ }
+} /* AArgs :: __deregArgs () */
+
+AOptVal
+AArgs :: optVal ( const char * name ) const
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "optVal: Not good" );
+ }
+
+ if ( name == NULL ) {
+ throw ErrorMsg ( "optVal: NULL name passed" );
+ }
+
+ AOptVal retVal;
+ retVal . reset ( name, _M_args, optDef ( name ) . needValue () );
+ return retVal;
+} /* AArgs :: optVal () */
+
+AParVal
+AArgs :: parVal () const
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "parVal: Not good" );
+ }
+
+ AParVal retVal;
+ retVal . reset ( "parameters", _M_args, true );
+ return retVal;
+} /* AArgs :: paramVal () */
+
+const AOptDef &
+AArgs :: optDef ( const String & name ) const
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "optDef: Not good" );
+ }
+
+ for (
+ VOptI S = _M_optDefs . begin ();
+ S != _M_optDefs . end ();
+ S ++
+ ) {
+ if ( ( * S ) . getName () == name ) {
+ return * S;
+ }
+ }
+
+ throw ErrorMsg ( String ( "optDef: Can not find definition for opotion \"" ) + name + "\"" );
+} /* AArgs :: optDef () */
+
+void
+AArgs :: usage () const
+{
+ :: Usage ( _M_args );
+} /* AArgs :: Usage () */
diff --git a/tools/fastq-dump/args.hpp b/tools/fastq-dump/args.hpp
new file mode 100644
index 0000000..8fe241e
--- /dev/null
+++ b/tools/fastq-dump/args.hpp
@@ -0,0 +1,330 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_outpost_args_
+#define _h_outpost_args_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <vector>
+#include <map>
+
+#include <ngs/ErrorMsg.hpp>
+#include <ngs/StringRef.hpp>
+
+/* ##########################################################
+ # Big WARNING : those aren't thread safe classes
+ ########################################################## */
+
+/*))
+ // Right namespace?
+((*/
+namespace ngs {
+
+/*)))
+ /// These are simple adapters for methods and structures introduced
+ \\\ in kapp/args.h. I agree, these are looks lame, but I will use
+ /// them ...
+(((*/
+
+/*)) Adapter for OptDef ...
+ ((*/
+class AOptDef {
+private :
+ typedef struct OptDef OptDef;
+
+public :
+ /*) Various constructors and destructors
+ (*/
+ AOptDef ();
+ AOptDef ( const AOptDef & Opt );
+ ~AOptDef ();
+
+ bool good () const;
+
+ AOptDef & operator = ( const AOptDef & Opt );
+
+ void reset ( const AOptDef & Opt );
+ void reset ();
+
+ /*) Various setters/getters
+ (*/
+ inline const char * getName ( ) const
+ {
+ return _M_name . empty ()
+ ? NULL
+ : _M_name . c_str ()
+ ;
+ };
+ inline void setName ( const char * Name = NULL )
+ {
+ if ( Name == NULL )
+ _M_name . clear ();
+ else
+ _M_name = Name;
+ };
+
+ inline const char * getAliases ( ) const
+ {
+ return _M_aliases . empty ()
+ ? NULL
+ : _M_aliases . c_str ()
+ ;
+ };
+ inline void setAliases ( const char * Aliases = NULL )
+ {
+ if ( Aliases == NULL )
+ _M_aliases . clear ();
+ else
+ _M_aliases = Aliases;
+ };
+
+ inline const char * getParam ( ) const
+ {
+ return _M_param . empty ()
+ ? NULL
+ : _M_param . c_str ()
+ ;
+ };
+ inline void setParam ( const char * Param = NULL )
+ {
+ if ( Param == NULL )
+ _M_param . clear ();
+ else
+ _M_param = Param;
+ };
+
+ inline uint16_t maxCount () const
+ {
+ return _M_max_count;
+ };
+ inline void setMaxCount ( uint16_t MaxCount = 0 )
+ {
+ _M_max_count = MaxCount;
+ };
+
+ inline bool needValue () const
+ {
+ return _M_need_value;
+ };
+ inline void setNeedValue ( bool NeedValue = true )
+ {
+ _M_need_value = NeedValue;
+ };
+
+ inline bool required () const
+ {
+ return _M_required;
+ };
+ inline void setRequired ( bool Required = true )
+ {
+ _M_required = Required;
+ };
+
+ inline const char * getHlp () const
+ {
+ return _M_hlp.c_str ();
+ };
+
+ inline void setHlp ( const String & HlpStr = "" )
+ {
+ _M_hlp = HlpStr;
+ };
+private :
+
+ String _M_name;
+ String _M_aliases;
+ String _M_param;
+ String _M_hlp;
+ uint16_t _M_max_count;
+ bool _M_need_value;
+ bool _M_required;
+}; /* class AOptDef */
+
+/*)) Something extra for the same money
+ ((*/
+class AOPBase {
+public :
+ typedef struct Args Args;
+
+ typedef std :: vector < String > VVal;
+ typedef VVal :: const_iterator VValI;
+
+public :
+ AOPBase ();
+ virtual ~AOPBase ();
+
+ virtual void reset (
+ const String & Name,
+ Args * TheArgs,
+ bool needValue
+ ) = 0;
+
+ inline bool exist () const
+ {
+ return _M_exist;
+ };
+
+ inline const String & name () const
+ {
+ return _M_name;
+ };
+
+ inline bool hasVal() const
+ {
+ return valCount () != 0;
+ };
+
+ uint32_t valCount () const;
+ const String & val ( uint32_t idx = 0 ) const;
+ uint32_t uint32Val ( uint32_t idx = 0 ) const;
+ int32_t int32Val ( uint32_t idx = 0 ) const;
+ uint64_t uint64Val ( uint32_t idx = 0 ) const;
+ int64_t int64Val ( uint32_t idx = 0 ) const;
+
+protected :
+ void reset ();
+ void reset ( const AOPBase & Bse );
+
+ bool _M_exist;
+
+ String _M_name;
+
+ VVal _M_val;
+}; /* class AOPBase */
+
+class AOptVal : public AOPBase {
+public :
+ AOptVal ();
+ AOptVal ( const AOptVal & Val );
+
+ AOptVal & operator = ( const AOptVal & Val );
+
+ void reset ( const String & Name, Args * TheArgs, bool needValue );
+}; /* class AOptVal */
+
+class AParVal : public AOPBase {
+public :
+ AParVal ();
+ AParVal ( const AParVal & Val );
+
+ AParVal & operator = ( const AParVal & Val );
+
+ void reset ( const String & Name, Args * TheArgs, bool needValue );
+}; /* class AParVal */
+
+/*)))) Adapter for Args structure.
+ ////
+ \\\\ Nothing new, it fully repeats behaviour of Args** methods.
+ //// There is pattern how to use it :
+ \\\\ a.init (); // initializes Args
+ //// for ( .... ) {
+ \\\\ a.addOpt ( Opt );
+ //// }
+ \\\\ a.parseArgs ( argc, argv );
+ //// a.dispose ();
+((((*/
+class AArgs {
+private :
+ typedef struct Args Args;
+
+ typedef std :: map < Args * , AArgs * > MArgs;
+ typedef MArgs :: iterator MArgsI;
+
+ typedef std :: vector < AOptDef > VOpt;
+ typedef VOpt :: const_iterator VOptI;
+
+ typedef std :: vector < String > VVal;
+ typedef VVal :: const_iterator VValI;
+
+public :
+ AArgs ();
+ virtual ~AArgs ();
+
+ /* Three general stepd to perform : init/parse/dispose
+ */
+ void init ( bool AddStandardOrguments = false );
+ void parse ( int argc, char ** argv );
+ void dispose ();
+
+ /* Are we good ? virtual ... ouch
+ */
+ inline bool good () const { return _M_args != NULL; };
+
+ /* Options handling
+ */
+ void addStdOpts ();
+ void addOpt ( const AOptDef & Opt );
+
+ inline size_t optDefCount () const
+ { return _M_optDefs . size (); };
+ inline const AOptDef & optDef ( size_t i )
+ { return _M_optDefs [ i ]; };
+
+ /* Here is program name
+ */
+ inline const String & prog () const
+ { return _M_progName; };
+
+ /* Here are getters for option and paramter values
+ */
+ AOptVal optVal ( const char * name ) const;
+ AParVal parVal () const;
+
+ void usage () const;
+
+protected :
+ virtual void __customInit ();
+ virtual void __customParse ();
+ virtual void __customDispose ();
+
+private :
+ static MArgs _sM_args;
+
+public :
+ static void __regArgs ( Args * TheArgs, AArgs * TheAArgs );
+ static AArgs * __getArgs ( Args * TheArgs );
+ static void __deregArgs ( Args * TheArgs );
+
+private :
+ const AOptDef & optDef ( const String & name ) const;
+
+ void __disposeArgs ( Args * TheArgs );
+ void __addStdOpts ( Args * TheArgs );
+
+ Args * _M_args;
+ bool _M_standards_added;
+
+ VOpt _M_optDefs;
+
+ String _M_progName;
+}; /* class AArgs */
+
+}; /* namespace ngs */
+
+#endif /* _h_outpost_args_ */
diff --git a/tools/fastq-dump/fastq-dump.cpp b/tools/fastq-dump/fastq-dump.cpp
new file mode 100644
index 0000000..a9ec0a1
--- /dev/null
+++ b/tools/fastq-dump/fastq-dump.cpp
@@ -0,0 +1,641 @@
+#include <ngs/ncbi/NGS.hpp>
+#include <ngs/ReadCollection.hpp>
+
+#include <klib/out.h>
+#include <kfc/defs.h>
+#include <kapp/main.h>
+
+#include <klib/rc.h>
+#include <kfc/rc.h>
+
+#include <sysalloc.h>
+#include <algorithm> /* min */
+
+#include <string.h> /* strcmp () */
+
+#include <algorithm>
+
+#include "args.hpp"
+#include "filters.hpp"
+
+#include "koutstream"
+
+namespace ngs {
+
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Arguments */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+class DumpArgs : public AArgs {
+public :
+ static const char * _sM_minSpotIdName;
+ static const char * _sM_maxSpotIdName;
+ static const char * _sM_spotIdName;
+ static const char * _sM_minReadLengthName;
+ static const char * _sM_categoryName;
+ static const char * _sM_fastaName;
+ static const char * _sM_legacyReportName;
+
+ static const int64_t _sM_minSpotIdDefValue = 1;
+ static const int64_t _sM_maxSpotIdDefValue = 0;
+
+public :
+ typedef AArgs PAPAHEN;
+ typedef Read :: ReadCategory ReadCategory;
+
+public :
+ DumpArgs ();
+ ~DumpArgs ();
+
+ inline const String & accession () const
+ { return _M_accession; };
+
+ inline int64_t minSpotId () const
+ { return _M_minSpotId; };
+ inline int64_t maxSpotId () const
+ { return _M_maxSpotId; };
+
+ inline uint64_t minReadLength () const
+ { return _M_minReadLength; };
+
+ inline ReadCategory category () const
+ { return _M_category; };
+
+ inline bool fastaDump () const
+ { return _M_fasta != 0; };
+
+ inline uint64_t fastaDumpWidth () const
+ { return _M_fasta; };
+
+ inline bool legacyReport () const
+ { return _M_legacyReport; };
+
+protected :
+ void __customInit ();
+ void __customParse ();
+ void __customDispose ();
+
+private :
+ String _M_accession;
+
+ /*) Full Spot Fulters
+ (*/
+ int64_t _M_minSpotId; /* -N | --minSpotId < rowid > */
+ int64_t _M_maxSpotId; /* -X | --maxSpotId < rowid > */
+ uint64_t _M_minReadLength; /* -M | --minReadLen <len> */
+ ReadCategory _M_category; /* -Y | --category */
+ uint64_t _M_fasta; /* -A | --fasta */
+ bool _M_legacyReport; /* -L | --legacy-report */
+};
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* DumpArgs */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+const char * DumpArgs :: _sM_minSpotIdName = "minSpotId";
+const char * DumpArgs :: _sM_maxSpotIdName = "maxSpotId";
+const char * DumpArgs :: _sM_spotIdName = "spotId";
+const char * DumpArgs :: _sM_minReadLengthName = "minReadLength";
+const char * DumpArgs :: _sM_categoryName = "category";
+const char * DumpArgs :: _sM_fastaName = "fasta";
+const char * DumpArgs :: _sM_legacyReportName = "legacy-report";
+
+DumpArgs :: DumpArgs ()
+: AArgs ()
+, _M_accession ( "" )
+, _M_minSpotId ( _sM_minSpotIdDefValue )
+, _M_maxSpotId ( _sM_maxSpotIdDefValue )
+, _M_minReadLength ( 0 )
+, _M_category ( Read :: all )
+, _M_fasta ( 0 )
+, _M_legacyReport ( false )
+{
+} /* DumpArgs :: DumpArgs () */
+
+DumpArgs :: ~DumpArgs ()
+{
+} /* DumpArgs :: ~DumpArgs () */
+
+void
+DumpArgs :: __customInit ()
+{
+ /*) Here we are adding some extra options
+ (*/
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_minSpotIdName );
+ TheOpt . setAliases ( "N" );
+ TheOpt . setParam ( "rowid" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Minimum spot id" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_maxSpotIdName );
+ TheOpt . setAliases ( "X" );
+ TheOpt . setParam ( "rowid" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Maximum spot id" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_spotIdName );
+ TheOpt . setAliases ( "S" );
+ TheOpt . setParam ( "rowid" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Spot id" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_minReadLengthName );
+ TheOpt . setAliases ( "M" );
+ TheOpt . setParam ( "len" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Filter by sequence length >= <len>" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_categoryName );
+ TheOpt . setAliases ( "Y" );
+ TheOpt . setParam ( "alignment" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Reads to dump. Accepts these values : <fullyAligned>, <partiallyAligned>, <aligned>, <unaligned>, <all>. Optional, default value <all> " );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_fastaName );
+ TheOpt . setAliases ( "A" );
+ TheOpt . setParam ( "width" );
+ TheOpt . setNeedValue ( true );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "FASTA only, no qualities, optional line wrap width (set to zero for no wrapping)" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+
+ {
+ AOptDef TheOpt;
+
+ TheOpt . setName ( _sM_legacyReportName );
+ TheOpt . setAliases ( "R" );
+ TheOpt . setNeedValue ( false );
+ TheOpt . setRequired ( false );
+ TheOpt . setHlp ( "Use legacy style 'Written spots' for tool" );
+ TheOpt . setMaxCount ( 1 );
+
+ addOpt ( TheOpt );
+ }
+} /* DumpArgs :: __customInit () */
+
+void
+DumpArgs :: __customDispose ()
+{
+ _M_accession = "";
+ _M_minSpotId = _sM_minSpotIdDefValue;
+ _M_maxSpotId = _sM_maxSpotIdDefValue;
+ _M_minReadLength = 0;
+ _M_category = Read :: all;
+ _M_fasta = 0;
+ _M_legacyReport = false;
+} /* DumpArgs :: __customDispose () */
+
+void
+DumpArgs :: __customParse ()
+{
+ if ( ! good () ) {
+ throw ErrorMsg ( "__customParse::reset: Not good" );
+ }
+
+ uint32_t cnt = parVal () . valCount ();
+ if ( cnt == 0 ) {
+ throw ErrorMsg ( "__customParse: Too few paramters" );
+ }
+
+ _M_accession = parVal () . val ( 0 );
+
+ if ( _M_accession . empty () ) {
+ std :: cerr << "ERROR: <accession> is not defined" << std :: endl;
+ throw ErrorMsg ( "__custromParse: ERROR: <accession> is not defined" );
+ }
+
+ AOptVal optV = optVal ( _sM_spotIdName );
+ int64_t __spotId = 0;
+
+ if ( optV . exist () ) {
+ if ( optVal ( _sM_minSpotIdName ) . exist () ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: parameter \"" ) + _sM_spotIdName + "\" can not coexists with parameter \"" + _sM_minSpotIdName + "\"");
+ }
+
+ if ( optVal ( _sM_maxSpotIdName ) . exist () ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: parameter \"" ) + _sM_spotIdName + "\" can not coexists with parameter \"" + _sM_maxSpotIdName + "\"");
+ }
+
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_spotIdName + "\" values");
+ }
+
+ __spotId = optV . int64Val ();
+ }
+
+ optV = optVal ( _sM_minSpotIdName );
+ if ( optV . exist () ) {
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_minSpotIdName + "\" values");
+ }
+
+ _M_minSpotId = optV . int64Val ();
+ }
+
+ optV = optVal ( _sM_maxSpotIdName );
+ if ( optV . exist () ) {
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_maxSpotIdName + "\" values");
+ }
+
+ _M_maxSpotId = optV . int64Val ();
+ }
+
+ if ( __spotId != 0 ) {
+ _M_minSpotId = __spotId;
+ _M_maxSpotId = __spotId;
+ }
+
+ optV = optVal ( _sM_minReadLengthName );
+ if ( optV . exist () ) {
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_minReadLengthName + "\" values");
+ }
+
+ _M_minReadLength = optV . uint64Val ();
+ }
+
+ _M_category = Read :: all;
+ optV = optVal ( _sM_categoryName );
+ if ( optV . exist () ) {
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_categoryName + "\" values");
+ }
+
+ String __v = optV . val ();
+
+ while ( true ) {
+ if ( __v == "fullyAligned" ) {
+ _M_category = Read :: fullyAligned;
+ break;
+ }
+
+ if ( __v == "partiallyAligned" ) {
+ _M_category = Read :: partiallyAligned;
+ break;
+ }
+
+ if ( __v == "aligned" ) {
+ _M_category = Read :: aligned;
+ break;
+ }
+
+ if ( __v == "unaligned" ) {
+ _M_category = Read :: unaligned;
+ break;
+ }
+
+ if ( __v == "all" ) {
+ _M_category = Read :: all;
+ break;
+ }
+
+ throw ErrorMsg ( String ( "__customParse: ERROR: Invalid value \"" + __v + "\" for option \"" + _sM_categoryName + "\"" ) );
+ }
+ }
+
+ _M_fasta = 0;
+ optV = optVal ( _sM_fastaName );
+ if ( optV . exist () ) {
+ if ( optV . valCount () != 1 ) {
+ throw ErrorMsg ( String ( "__custromParse: ERROR: Too many \"" ) + _sM_fastaName + "\" values");
+ }
+
+ _M_fasta = optV . uint64Val ();
+ }
+
+ _M_legacyReport = optVal ( _sM_legacyReportName ) . exist ();
+
+} /* DumpArgs :: __customParse () */
+
+}; /* namespace ngs */
+
+/*))
+ // KMain, and all other
+((*/
+
+using namespace ngs;
+
+const char UsageDefaultName[] = "fq-d";
+
+rc_t CC
+UsageSummary ( const char * progname )
+{
+ /*) Standard usage of that program
+ (*/
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [Options] <Accession>\n"
+ "\n"
+ "\n"
+ "Use option --help for more information\n"
+ "\n",
+ progname
+ );
+}
+
+rc_t CC
+Usage ( const Args * a )
+{
+ if ( a == NULL ) {
+ throw ngs :: ErrorMsg ( "Usage: NULL args passed" );
+ }
+
+ const char * prog;
+
+ if ( ArgsProgram ( a, NULL, & prog ) != 0 ) {
+ throw ngs :: ErrorMsg ( "Usage: Infalid args passed" );
+ }
+
+ UsageSummary ( prog );
+
+ KOutMsg ( "OPTIONS:\n" );
+
+ HelpOptionsStandard ();
+
+ AArgs * TheArgs = AArgs :: __getArgs ( const_cast < Args * > ( a ) );
+
+ if ( TheArgs == NULL ) {
+ throw ngs :: ErrorMsg ( "Usage: Using unregistered usage" );
+ }
+
+ size_t c = TheArgs -> optDefCount ();
+ for ( size_t i = 0; i < c; i ++ ) {
+ const AOptDef & o = TheArgs -> optDef ( i );
+
+ const char * c [] = { NULL, NULL };
+ c [ 0 ] = o . getHlp ();
+
+ HelpOptionLine (
+ o . getAliases (),
+ o . getName (),
+ o . getParam (),
+ c
+ );
+
+ }
+
+ return 0;
+}
+
+static void run ( const DumpArgs & TheArgs );
+
+rc_t
+KMain ( int argc, char * argv [] )
+{
+ try {
+ DumpArgs TheArgs;
+
+ try {
+ TheArgs . init ( true );
+ TheArgs . parse ( argc, argv );
+ }
+ catch ( ... ) {
+ UsageSummary ( TheArgs . prog () . c_str () );
+ throw;
+ }
+
+ if ( ! TheArgs . good () ) {
+ TheArgs . usage ();
+
+ return 1;
+ }
+
+ run ( TheArgs );
+
+ TheArgs . dispose ();
+ }
+ catch ( std :: exception & E ) {
+ std :: cerr << "Exception handled '" << E.what () << "'" << std :: endl;
+
+ return 1;
+ }
+ catch ( ... ) {
+ std :: cerr << "UNKNOWN exception handled" << std :: endl;
+
+ return 2;
+ }
+
+ return 0;
+} /* KMain () */
+
+static
+void
+setupFilters ( AFilters & Filters, const DumpArgs & TheArgs )
+{
+ if ( TheArgs . minReadLength () != 0 ) {
+ Filters . addLengthFilter ( TheArgs . minReadLength () );
+ }
+} /* setupFilters () */
+
+static
+void
+dumpFastQ (
+ int64_t SpotId,
+ const ngs :: String & CollectionName,
+ const ReadIterator & Iterator
+)
+{
+ /*) We do not check values for arguments validity!
+ (*/
+ StringRef ReadName = Iterator . getReadName ();
+ StringRef Bases = Iterator . getReadBases ();
+ StringRef Qualities = Iterator . getReadQualities ();
+
+ /*) First, we are doint base header
+ (*/
+ kout << "@"
+ << CollectionName
+ << '.'
+ << SpotId
+ << ' '
+ << ReadName
+ << " length="
+ << Bases . size ()
+ << '\n'
+ ;
+
+ /*) Second is going base itsefl
+ (*/
+ kout << Bases
+ << '\n'
+ ;
+
+ /*) Third, header for qualities
+ (*/
+ kout << '+'
+ << CollectionName
+ << '.'
+ << SpotId
+ << ' '
+ << ReadName
+ << " length="
+ << Qualities . size ()
+ << '\n'
+ ;
+
+ /*) Finally there are qualities
+ (*/
+ kout << Qualities
+ << '\n'
+ ;
+} /* dumpFastQ () */
+
+static
+void
+dumpFastA (
+ int64_t SpotId,
+ const ngs :: String & CollectionName,
+ const ReadIterator & Iterator,
+ uint64_t Width
+)
+{
+ /*) We do not check values for arguments validity!
+ (*/
+ StringRef ReadName = Iterator . getReadName ();
+ StringRef Bases = Iterator . getReadBases ();
+
+ uint64_t __l = Bases . size ();
+
+ /*) First, we are doing base header
+ (*/
+ kout << '>'
+ << CollectionName
+ << '.'
+ << SpotId
+ << ' '
+ << ReadName
+ << " length="
+ << __l
+ << '\n'
+ ;
+
+ /*) Second is going base itself by width
+ (*/
+
+ uint64_t __p = 0;
+ const char * __s = Bases . data ();
+
+
+ if ( 0 < Width ) {
+ while ( __p < __l ) {
+ uint64_t __t = std :: min ( Width, __l - __p );
+
+ kout << std :: string ( __s, ( std :: string :: size_type ) __p, ( std :: string :: size_type ) __t ) << "\n" ;
+
+ __p += __t;
+ }
+ }
+ else {
+ kout << __s << "\n" ;
+ }
+
+} /* dumpFastA () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+static
+void
+run ( const DumpArgs & TheArgs )
+{
+ if ( ! TheArgs . good () ) {
+ throw ErrorMsg ( "Invalid arguments" );
+ }
+
+ ngs :: String Acc ( TheArgs . accession () . c_str () );
+ ReadCollection RCol = ncbi :: NGS :: openReadCollection ( Acc );
+
+ int64_t minSpot = TheArgs . minSpotId ();
+ int64_t maxSpot = TheArgs . maxSpotId ();
+
+ if ( minSpot == 0 ) {
+ minSpot = 1;
+ }
+
+ if ( maxSpot == 0 ) {
+ maxSpot = RCol . getReadCount ();
+ }
+
+ if ( maxSpot < minSpot ) {
+ int64_t Id = minSpot;
+ minSpot = maxSpot;
+ maxSpot = Id;
+ }
+
+ ReadIterator Iterator = RCol.getReadRange (
+ minSpot,
+ maxSpot - minSpot + 1,
+ TheArgs . category ()
+ );
+
+ ngs :: String ReadCollectionName = RCol.getName ();
+
+ AFilters Filters ( TheArgs . accession () );
+ setupFilters ( Filters, TheArgs );
+
+ for ( int64_t llp = TheArgs . minSpotId () ; Iterator.nextRead (); llp ++ ) {
+
+ if ( Filters . checkIt ( Iterator ) ) {
+ if ( TheArgs . fastaDump () ) {
+ dumpFastA ( llp, ReadCollectionName, Iterator, TheArgs . fastaDumpWidth () );
+ }
+ else {
+ dumpFastQ ( llp, ReadCollectionName, Iterator );
+ }
+ }
+ }
+
+ kout.flush ();
+
+ std :: cerr << Filters . report ( TheArgs . legacyReport () );
+
+} /* run () */
+
diff --git a/tools/fastq-dump/filters.cpp b/tools/fastq-dump/filters.cpp
new file mode 100644
index 0000000..710a689
--- /dev/null
+++ b/tools/fastq-dump/filters.cpp
@@ -0,0 +1,300 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sysalloc.h>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <ngs/ReadCollection.hpp>
+
+#include <sstream>
+
+#include "filters.hpp"
+
+using namespace std;
+using namespace ngs;
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ // AFilter
+((*/
+AFilter :: AFilter ()
+: _M_rejected ( 0 )
+{
+} /* AFilter :: AFilter () */
+
+AFilter :: ~AFilter ()
+{
+ _M_rejected = 0;
+} /* AFilter :: ~AFilter () */
+
+bool
+AFilter :: checkIt ( const ReadIterator & pos ) const
+{
+ throw ErrorMsg ( ":: checkIt() - is not implemented for class" );
+} /* AFilter :: checkIt () */
+
+String
+AFilter :: report () const
+{
+ if ( _M_rejected != 0 ) {
+ stringstream __s;
+ __s << "Rejected "
+ << _M_rejected
+ << ( _M_rejected == 1 ? " SPOT" : " SPOTS" )
+ ;
+ if ( reason () . empty () ) {
+ __s << " reason unknown";
+ }
+ else {
+ __s << " because " << reason ();
+ }
+
+ return __s . str ();
+ }
+ return "";
+} /* AFilter :: report () */
+
+String
+AFilter :: reason () const
+{
+ return "";
+} /* AFilter :: reason () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* Place for some predefined filters */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ // Num spots readed filter ... needed as counter only
+((*/
+class __NReadFilter : public AFilter {
+public :
+ __NReadFilter ( const String & source );
+
+ bool checkIt ( const ReadIterator & Rit ) const;
+
+ String report () const;
+
+private :
+ String _M_source;
+};
+
+__NReadFilter :: __NReadFilter ( const string & source )
+: _M_source ( source )
+{
+} /* __NReadFilter :: __NReadFilter () */
+
+bool
+__NReadFilter :: checkIt ( const ReadIterator & ) const
+{
+ reject ();
+
+ return true;
+} /* __NReadFilter :: checkIt () */
+
+String
+__NReadFilter :: report () const
+{
+ stringstream __s;
+
+ __s << "Read "
+ << rejected ()
+ << ( rejected () == 1 ? " spot" : " spots" )
+ ;
+
+ if ( ! _M_source . empty () ) {
+ __s << " for " << _M_source;
+ }
+
+ return __s . str ();
+} /* __NReadFilter :: report () */
+
+/*))
+ // Num spots readed filter ... needed as counter only
+((*/
+class __SpotLengthFilter : public AFilter {
+public :
+ __SpotLengthFilter ( uint64_t MinLength );
+
+ bool checkIt ( const ReadIterator & Rit ) const;
+
+protected :
+ String reason () const;
+
+private :
+ uint64_t _M_minLength;
+};
+
+__SpotLengthFilter :: __SpotLengthFilter ( uint64_t MinLength )
+: _M_minLength ( MinLength )
+{
+} /* __SpotLengthFilter :: __SpotLengthFilter () */
+
+bool
+__SpotLengthFilter :: checkIt ( const ReadIterator & Rit ) const
+{
+ uint64_t __l = Rit . getReadBases () . size ();
+ if ( __l < _M_minLength ) {
+ reject ();
+
+ return false;
+ }
+
+ return true;
+} /* __SpotLengthFilter :: checkIt () */
+
+String
+__SpotLengthFilter :: reason () const
+{
+ stringstream __s;
+
+ __s << "SPOTLEN < " << _M_minLength;
+
+ return __s . str ();
+} /* __SpotLengthFilter :: reason () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+/*))
+ // AFilters
+((*/
+AFilters :: AFilters ( const String & source )
+: _M_source ( source )
+, _M_confirmed ( 0 )
+{
+ init ();
+} /* AFilters :: AFilters () */
+
+AFilters :: ~AFilters ()
+{
+ try {
+ dispose ();
+ }
+ catch ( ... ) {
+ /* Ha! */
+ }
+} /* AFitlers :: ~AFilters () */
+
+void
+AFilters :: init ()
+{
+ /* Just dispose all previous content
+ */
+ dispose ();
+
+ /* Here we should add some mondaytory filters
+ */
+ addFilter ( new __NReadFilter ( _M_source ) );
+} /* AFilters :: init () */
+
+void
+AFilters :: dispose ()
+{
+ for ( TVecI __b = _M_filters . begin (); __b != _M_filters . end (); __b ++ ) {
+ AFilter * __f = * __b;
+ if ( __f != NULL ) {
+ delete __f;
+ }
+ * __b = NULL;
+ }
+ _M_filters . clear ();
+
+ _M_confirmed = 0;
+} /* AFilters :: dispose () */
+
+bool
+AFilters :: checkIt ( const ReadIterator & Rit ) const
+{
+ bool __r = __checkIt ( Rit );
+
+ if ( __r ) {
+ _M_confirmed ++;
+ }
+
+ return __r;
+} /* AFilters :: checkIt () */
+
+bool
+AFilters :: __checkIt ( const ReadIterator & Rit ) const
+{
+ for ( TVecCI __b = _M_filters . begin (); __b != _M_filters . end (); __b ++ ) {
+ AFilter * __f = * __b;
+
+ if ( __f != NULL ) {
+ if ( ! __f -> checkIt ( Rit ) ) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+} /* AFilters :: __checkIt () */
+
+void
+AFilters :: addFilter ( AFilter * Flt )
+{
+ if ( Flt != NULL ) {
+ _M_filters . insert ( _M_filters . end (), Flt );
+ }
+} /* AFilters :: addFilter () */
+
+void
+AFilters :: addLengthFilter ( uint64_t minLength )
+{
+ addFilter ( new __SpotLengthFilter ( minLength ) );
+} /* AFilters :: addLengthFilter () */
+
+String
+AFilters :: report ( bool legacyStyle ) const
+{
+ stringstream __s;
+
+ if ( ! legacyStyle ) {
+ for ( TVecCI __b = _M_filters . begin (); __b != _M_filters . end (); __b ++ ) {
+ AFilter * __f = * __b;
+ if ( __f != NULL ) {
+ String __r = __f -> report ();
+ if ( ! __r . empty () ) {
+ __s << __r << "\n";
+ }
+ }
+ }
+ }
+
+ __s << "Written " << _M_confirmed << ( _M_confirmed == 1 ? " spot" : " spots" ) << " for " << _M_source << "\n";
+
+ if ( legacyStyle ) {
+ __s << "Written " << _M_confirmed << ( _M_confirmed == 1 ? " spot" : " spots" ) << " total\n";
+ }
+
+ return __s . str ();
+} /* AFilters :: report () */
diff --git a/tools/fastq-dump/filters.hpp b/tools/fastq-dump/filters.hpp
new file mode 100644
index 0000000..df58c56
--- /dev/null
+++ b/tools/fastq-dump/filters.hpp
@@ -0,0 +1,114 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_outpost_filters_
+#define _h_outpost_filters_
+
+#include <vector>
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <ngs/ErrorMsg.hpp>
+#include <ngs/StringRef.hpp>
+
+/*))) Namespace
+ (((*/
+namespace ngs {
+
+/*))
+ // Some forwards
+((*/
+class ReadIterator;
+
+class AFilter {
+public :
+ AFilter ();
+ virtual ~AFilter ();
+
+ virtual bool checkIt ( const ReadIterator & pos ) const = 0;
+
+ virtual String report () const;
+
+protected :
+ /* That method should be called from 'checkIt()' for stat
+ */
+ inline void reject () const { _M_rejected ++; };
+ inline uint64_t rejected () const { return _M_rejected; };
+
+ virtual String reason () const;
+
+private :
+ mutable uint64_t _M_rejected;
+
+}; /* class AFilter */
+
+class AFilters {
+public :
+ typedef std :: vector < AFilter * > TVec;
+ typedef TVec :: const_iterator TVecCI;
+ typedef TVec :: iterator TVecI;
+
+public :
+ AFilters ( const String & source );
+ virtual ~AFilters ();
+
+ bool checkIt ( const ReadIterator & pos ) const;
+
+ /* Adds new user_defined filter ...
+ */
+ void addFilter ( AFilter * pFilter );
+
+ /* There are some standard predefined filters to add
+ */
+ void addLengthFilter ( uint64_t minLength );
+
+ /* Misc stuff
+ */
+ inline const String & source () const { return _M_source ; }
+
+ String report ( bool legacyStyle = false ) const;
+
+private :
+ void init ();
+ void dispose ();
+
+ bool __checkIt ( const ReadIterator & pos ) const;
+
+private :
+ String _M_source;
+
+ TVec _M_filters;
+
+ mutable uint64_t _M_confirmed;
+}; /* class AFilters */
+
+/*))) Namespace
+ (((*/
+}; /* namespace ngs */
+
+#endif /* _h_outpost_filters_ */
diff --git a/tools/fastq-dump/koutstream b/tools/fastq-dump/koutstream
new file mode 100644
index 0000000..5967f6f
--- /dev/null
+++ b/tools/fastq-dump/koutstream
@@ -0,0 +1,324 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_outpost_koutstream_
+#define _h_outpost_koutstream_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <ios>
+#include <streambuf>
+#include <ostream>
+
+#include <klib/out.h>
+#include <klib/text.h>
+
+/*)))
+ /// Something weird. That class will throw exception if any
+ \\\ error will happen. Overwise, You may comment line to return
+ /// error code instead.
+(((*/
+#define _DO_ALWAYS_THROW_EXCEPTION
+
+#ifdef _DO_ALWAYS_THROW_EXCEPTION
+ /* Using that forward to avoid conflicts with String */
+extern "C" {
+ KLIB_EXTERN rc_t CC string_printf (
+ char *dst,
+ size_t bsize,
+ size_t *num_writ,
+ const char *fmt,
+ ...
+ );
+}
+#endif /* _DO_ALWAYS_THROW_EXCEPTION */
+
+/*\
+|*| That address is responsible for buffered/unbuffered basic_koutbuf
+|*| Uncomment if You does not need buffering on the basic_koutbuf level
+\*/
+
+/*\
+#define _DO_USE_UNBUFFERED_KOUTBUF
+\*/
+
+/*))))
+ <<<< Lurics:
+ >>>> That file created because Kurt want to wrap KOutMsg to 'stream'
+ <<<<
+ >>>> Important notice ... because it is KOutMsg, that class will
+ <<<< associate output sequence only with KOutMsg primitive.
+ >>>> That file contains :
+ <<<< basic_koutbuf - buffer
+ >>>> basic_koutstream - stream
+ <<<< kout - stream forward
+ >>>>
+ ((((*/
+
+/*)))
+ /// I think that is valild name for namespace ...
+(((*/
+namespace ngs {
+
+/*))
+ // Buffer
+((*/
+
+template < typename _CharT, typename _Traits >
+class basic_koutbuf
+ : public std :: basic_streambuf < _CharT, _Traits > {
+
+public :
+ // Typos
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+
+ typedef typename traits_type::int_type int_type;
+
+ typedef std :: allocator < char_type > allocator_type;
+ typedef std :: basic_streambuf < char_type, traits_type > __streambuf_type;
+ typedef basic_koutbuf < char_type, traits_type > __koutbuf_type;
+
+protected :
+
+ /*\ This is not only change
+ \*/
+#ifdef _DO_USE_UNBUFFERED_KOUTBUF
+ static const std :: streamsize _cM_buffer_size = 256;
+#else /* _DO_USE_UNBUFFERED_KOUTBUF */
+ static const std :: streamsize _cM_buffer_size = 4096 * 32;
+#endif /* _DO_USE_UNBUFFERED_KOUTBUF */
+
+ char_type * _M_char;
+
+public :
+
+ /* Constructor/destructor */
+ basic_koutbuf ()
+ : __streambuf_type ()
+ , _M_char ( allocator_type () . allocate ( _cM_buffer_size ) )
+ {
+ this -> setbuf ( _M_char, _cM_buffer_size );
+ __setp ();
+ };
+
+ ~basic_koutbuf ()
+ {
+ try {
+ __sync (); // ?? should we check retval?
+ }
+ catch ( ... ) {
+ // ???? what we should do here ????
+ }
+
+ try {
+ if ( _M_char != NULL ) {
+ allocator_type () . deallocate (
+ _M_char,
+ _cM_buffer_size
+ );
+ }
+ }
+ catch ( ... ) {
+ // ???? nothing to do
+ }
+
+ _M_char = NULL;
+ };
+
+#ifdef _DO_USE_UNBUFFERED_KOUTBUF
+ std :: streamsize xsputn ( const char_type * __s, std :: streamsize __n )
+ {
+ if ( __sync () == - 1 ) {
+ return 0;
+ }
+
+ return __koutmsg ( __s, __n );
+ };
+#else /* _DO_USE_UNBUFFERED_KOUTBUF */
+ std :: streamsize xsputn ( const char_type * __s, std :: streamsize __n )
+ {
+ std :: streamsize __a = this -> epptr () - this -> pptr ();
+
+ if ( __n < __a ) {
+ /*) Here we are adding string to a buffer
+ (*/
+ traits_type :: copy ( this -> pptr (), __s, __n );
+
+ this -> pbump ( __n );
+ }
+ else {
+ /*) We are not too effective ...
+ (*/
+ if ( __sync () == - 1 ) {
+ return 0;
+ }
+
+ std :: streamsize __q = 0;
+
+ while ( __q < __n ) {
+ __a = this -> epptr () - this -> pptr ();
+ std :: streamsize __c = std :: min (
+ __n - __q,
+ __a
+ );
+
+ traits_type :: copy (
+ this -> pbase (),
+ __s + __q,
+ __c
+ );
+ this -> pbump ( __c );
+
+ if ( __sync () == - 1 ) {
+ return 0;
+ }
+
+ __q += __c;
+ }
+ }
+
+ /*) We do never fail :lol:
+ (*/
+ return __n;
+ };
+#endif /* _DO_USE_UNBUFFERED_KOUTBUF */
+
+ int sync ()
+ {
+ return __sync ();
+ };
+
+protected :
+
+ int __sync ()
+ {
+ int __ret = 0;
+
+ std :: streamsize __l = this -> pptr () - this -> pbase ();
+
+ if ( 0 < __l ) {
+ __ret = __koutmsg ( this -> pbase (), __l );
+
+ /*\
+ |*| Don't really know if we shoud check result here
+ \*/
+ __setp ();
+ }
+
+ return __ret;
+ };
+
+ int __koutmsg ( const char_type * __s, std :: streamsize __n )
+ {
+ if ( 0 < __n ) {
+ :: String __t;
+
+ StringInit ( ( & __t ), __s, __n, __n );
+
+ rc_t __rc = KOutMsg ( "%S", & __t );
+ if ( __rc != 0 ) {
+
+#ifdef _DO_ALWAYS_THROW_EXCEPTION
+
+ /* That was requested by Kurt: I shoud throw
+ an exception instead of sending overflow
+ error
+ */
+ char __m [ 4096 ];
+ size_t __n = 0;
+ string_printf ( __m, sizeof ( __m ), & __n, "%R", __rc );
+ throw ErrorMsg ( __m );
+#else
+
+ __n = - 1;
+#endif /* _DO_ALWAYS_THROW_EXCEPTION */
+ }
+ }
+
+ return __n;
+ };
+
+ void __setp ()
+ {
+ /*) the only valid method to set _M_out_cur to zero
+ / also, one char reserved for a zero
+ (*/
+ this -> setp ( _M_char, _M_char + _cM_buffer_size );
+ };
+
+}; /* class basic_koutbuf */
+
+/*))
+ // Stream
+((*/
+template < typename _CharT, typename _Traits >
+class basic_koutstream :
+ public std :: basic_ostream < _CharT, _Traits > {
+
+public :
+ // Typos
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+
+ typedef typename traits_type::int_type int_type;
+
+ typedef basic_koutbuf < char_type, traits_type > __koutbuf_type;
+ typedef std :: basic_ostream < char_type, traits_type > __ostream_type;
+ typedef basic_koutstream < char_type, traits_type > __koutstream_type;
+
+private :
+
+ __koutbuf_type _M_koutbuf;
+
+public :
+
+ /**
+ * Default constructor, and the only constructor
+ **/
+ basic_koutstream () : __ostream_type ( 0 ), _M_koutbuf ()
+ {
+ this -> init ( & _M_koutbuf );
+ };
+
+ virtual ~basic_koutstream ()
+ {
+ };
+
+}; /* class basic_koutstream */
+
+/*)))
+ /// Forwards
+(((*/
+typedef basic_koutstream<char, std :: char_traits < char > > koutstream;
+
+koutstream kout;
+
+} /* namespace ngs */
+
+#endif /* _h_outpost_koutstream_ */
diff --git a/tools/fastq-loader/.gitignore b/tools/fastq-loader/.gitignore
new file mode 100644
index 0000000..f3b5a01
--- /dev/null
+++ b/tools/fastq-loader/.gitignore
@@ -0,0 +1 @@
+fastq-grammar.output
diff --git a/tools/fastq-loader/Makefile b/tools/fastq-loader/Makefile
new file mode 100644
index 0000000..b66001e
--- /dev/null
+++ b/tools/fastq-loader/Makefile
@@ -0,0 +1,166 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/fastq-loader
+
+INT_LIBS = \
+ libfastqloader
+
+ALL_LIBS = \
+ $(INT_LIBS) \
+ $(EXT_LIBS)
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ latf-load
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/all: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all
+
+#-------------------------------------------------------------------------------
+# clean
+#
+INTERM_SRC = \
+ $(SRCDIR)/fastq-lex.c \
+ $(SRCDIR)/fastq-grammar.c \
+ $(SRCDIR)/fastq-tokens.h
+
+clean: stdclean
+
+.PHONY: clean
+
+.PRECIOUS: $(INTERM_SRC)
+
+#-------------------------------------------------------------------------------
+# fastq
+#
+$(ILIBDIR)/libfastqloader: $(ILIBDIR)/libfastqloader.$(LIBX)
+
+FASTQ_SRC = \
+ common-writer \
+ sequence-writer \
+ common-reader \
+ fastq-reader \
+ fastq-grammar \
+ fastq-lex
+
+# flex/bison should only be invoked manually in an environment that ensures the correct versions:
+# bison 2.5, flex 2.5.35
+bison:
+ bison --warnings=error -o $(SRCDIR)/fastq-grammar.c --defines=$(SRCDIR)/fastq-tokens.h -v --no-lines $(SRCDIR)/fastq-grammar.y
+
+ifeq (dbg,$(BUILD))
+ FLEX_DEBUG = -d
+endif
+
+flex:
+ flex $(FLEX_DEBUG) -DYY_BUF_SIZE=16777216 -t $(SRCDIR)/fastq-lex.l | grep -v '^#line' > $(SRCDIR)/fastq-lex.c
+
+FASTQ_OBJ = \
+ $(addsuffix .$(LOBX),$(FASTQ_SRC))
+
+FASTQ_LIB = \
+ -lload \
+ -dkfs \
+ -dklib \
+
+ifneq (win,$(OS))
+ FASTQ_LIB += -dkq
+endif
+
+$(ILIBDIR)/libfastqloader.$(SHLX): $(INTERM_SRC) $(FASTQ_OBJ)
+ $(LD) --dlib -o $@ $^ $(FASTQ_LIB)
+
+$(ILIBDIR)/libfastqloader.$(LIBX): $(INTERM_SRC) $(FASTQ_OBJ)
+ $(LD) --slib -o $@ $^ $(FASTQ_LIB)
+
+#------------------------------------------------------------------------------
+# fastq-load.3
+#
+FASTQ_LOAD_SRC = \
+ fastq-loader \
+ loader-imp \
+ common-writer \
+ sequence-writer \
+ common-reader \
+ $(FASTQ_SRC)
+
+FASTQ_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQ_LOAD_SRC))
+
+FASTQ_LOADER_LIB = \
+ -skapp \
+ -stk-version \
+ -sload \
+ -sncbi-wvdb \
+ -sm
+
+$(BINDIR)/latf-load: $(FASTQ_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(FASTQ_LOADER_LIB)
+
diff --git a/tools/fastq-loader/common-reader-priv.h b/tools/fastq-loader/common-reader-priv.h
new file mode 100644
index 0000000..26a8e19
--- /dev/null
+++ b/tools/fastq-loader/common-reader-priv.h
@@ -0,0 +1,300 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_reader_priv_
+#define _h_common_reader_priv_
+
+#include <loader/common-reader.h>
+
+#include <klib/refcount.h>
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*TODO: add module rcLoader to rc.h? */
+#define RC_MODULE rcAlign
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+#ifndef READERFILE_IMPL
+ #define READERFILE_IMPL struct ReaderFile
+#endif
+
+typedef struct ReaderFile_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+ rc_t ( *destroy ) ( READERFILE_IMPL* self );
+ rc_t ( *getRecord ) ( const READERFILE_IMPL *self, const Record** result );
+ float ( *getProportionalPosition ) ( const READERFILE_IMPL *self );
+ rc_t ( *getReferenceInfo ) ( const READERFILE_IMPL *self, const ReferenceInfo** result );
+ /* end minor version == 0 */
+
+} ReaderFile_vt_v1;
+
+typedef union ReaderFile_vt {
+ ReaderFile_vt_v1* v1;
+} ReaderFile_vt;
+
+struct ReaderFile
+{
+ ReaderFile_vt vt;
+ KRefcount refcount;
+ char* pathname;
+};
+
+/* Init
+ * polymorphic parent constructor
+ */
+rc_t CC ReaderFileInit ( READERFILE_IMPL *self );
+
+/* Whack
+ * destructor
+ */
+rc_t CC ReaderFileWhack ( ReaderFile *self );
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+#ifndef RECORD_IMPL
+ #define RECORD_IMPL struct Record
+#endif
+
+typedef struct Record_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+ rc_t ( *addRef ) ( const RECORD_IMPL* self );
+ rc_t ( *release ) ( const RECORD_IMPL* self );
+ rc_t ( *getSequence ) ( const RECORD_IMPL *self, const Sequence** result );
+ rc_t ( *getAlignment ) ( const RECORD_IMPL *self, const Alignment** result );
+ rc_t ( *getRejected ) ( const RECORD_IMPL *self, const Rejected** result );
+ /* end minor version == 0 */
+
+} Record_vt_v1;
+
+typedef union Record_vt {
+ Record_vt_v1* v1;
+} Record_vt;
+
+struct Record
+{
+ Record_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+#ifndef SEQUENCE_IMPL
+ #define SEQUENCE_IMPL struct Sequence
+#endif
+
+typedef struct Sequence_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+ rc_t ( *addRef ) ( const SEQUENCE_IMPL* self );
+ rc_t ( *release ) ( const SEQUENCE_IMPL* self );
+
+ rc_t ( *getReadLength ) ( const SEQUENCE_IMPL *self, uint32_t *length );
+ rc_t ( *getRead ) ( const SEQUENCE_IMPL *self, char *sequence );
+ rc_t ( *getRead2 ) ( const SEQUENCE_IMPL *self, char *sequence, uint32_t start, uint32_t stop );
+ rc_t ( *getQuality ) ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+ rc_t ( *getSpotGroup ) ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+ rc_t ( *getSpotName ) ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+ bool ( *isColorSpace ) ( const SEQUENCE_IMPL *self );
+ rc_t ( *getCSKey ) ( const SEQUENCE_IMPL *self, char cskey[1] );
+ rc_t ( *getCSReadLength ) ( const SEQUENCE_IMPL *self, uint32_t *length );
+ rc_t ( *getCSRead ) ( const SEQUENCE_IMPL *self, char *sequence );
+ rc_t ( *getCSQuality ) ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+
+ bool ( *wasPaired ) ( const SEQUENCE_IMPL *self );
+ int ( *orientationSelf ) ( const SEQUENCE_IMPL *self );
+ int ( *orientationMate ) ( const SEQUENCE_IMPL *self );
+ bool ( *isFirst ) ( const SEQUENCE_IMPL *self );
+ bool ( *isSecond ) ( const SEQUENCE_IMPL *self );
+ bool ( *isDuplicate ) ( const SEQUENCE_IMPL *self );
+ bool ( *isLowQuality ) ( const SEQUENCE_IMPL *self );
+
+ rc_t ( *getTI ) ( const SEQUENCE_IMPL *self, uint64_t *ti );
+
+ /* end minor version == 0 */
+
+} Sequence_vt_v1;
+
+typedef union Sequence_vt {
+ Sequence_vt_v1* v1;
+} Sequence_vt;
+
+struct Sequence
+{
+ Sequence_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+#ifndef ALIGNMENT_IMPL
+ #define ALIGNMENT_IMPL struct Alignment
+#endif
+
+typedef struct Alignment_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+
+ rc_t ( *addRef ) ( const ALIGNMENT_IMPL* self );
+ rc_t ( *release ) ( const ALIGNMENT_IMPL* self );
+
+ rc_t ( *getRefSeqId ) ( const ALIGNMENT_IMPL *self, int32_t *refSeqId );
+ rc_t ( *getMateRefSeqId ) ( const ALIGNMENT_IMPL *self, int32_t *refSeqId );
+ rc_t ( *getPosition ) ( const ALIGNMENT_IMPL *self, int64_t *pos );
+ rc_t ( *getMatePosition ) ( const ALIGNMENT_IMPL *self, int64_t *pos );
+ rc_t ( *getMapQuality ) ( const ALIGNMENT_IMPL *self, uint8_t *qual );
+ rc_t ( *getAlignmentDetail ) ( const ALIGNMENT_IMPL *self, AlignmentDetail *rslt, uint32_t count, uint32_t *actual, int32_t *firstMatch, int32_t *lastMatch );
+ rc_t ( *getAlignOpCount ) ( const ALIGNMENT_IMPL *self, uint32_t *n );
+ rc_t ( *getInsertSize ) ( const ALIGNMENT_IMPL *self, int64_t *size );
+ rc_t ( *getCG ) ( const ALIGNMENT_IMPL *self, const CGData** result );
+ rc_t ( *getBAMCigar ) ( const ALIGNMENT_IMPL *self, uint32_t const **rslt, uint32_t *length );
+
+ bool ( *isSecondary ) ( const ALIGNMENT_IMPL *self );
+
+ /* end minor version == 0 */
+
+} Alignment_vt_v1;
+
+typedef union Alignment_vt {
+ Alignment_vt_v1* v1;
+} Alignment_vt;
+
+struct Alignment
+{
+ Alignment_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ CGData
+ */
+#ifndef CGDATA_IMPL
+ #define CGDATA_IMPL struct CGData
+#endif
+
+typedef struct CGData_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+
+ rc_t ( *addRef ) ( const CGDATA_IMPL* self );
+ rc_t ( *release ) ( const CGDATA_IMPL* self );
+
+ rc_t ( * getSeqQual ) ( const CGDATA_IMPL* self, char sequence[/* 35 */], uint8_t quality[/* 35 */] );
+ rc_t ( * getCigar ) ( const CGDATA_IMPL* self, uint32_t *cigar, uint32_t cig_max, uint32_t *cig_act );
+ rc_t ( * getAlignGroup ) ( const CGDATA_IMPL* self, char buffer[], size_t max_size, size_t *act_size);
+ /* end minor version == 0 */
+
+} CGData_vt_v1;
+
+typedef union CGData_vt {
+ CGData_vt_v1* v1;
+} CGData_vt;
+
+struct CGData
+{
+ CGData_vt vt;
+};
+
+/*--------------------------------------------------------------------------
+ Rejected
+ */
+
+struct Rejected {
+ KRefcount refcount;
+
+ String source;
+ const char* message;
+ uint64_t line;
+ uint64_t column;
+ bool fatal;
+};
+
+rc_t CC RejectedInit ( Rejected *self );
+
+/*--------------------------------------------------------------------------
+ ReferenceInfo
+ */
+
+#ifndef REFERENCEINFO_IMPL
+ #define REFERENCEINFO_IMPL struct ReferenceInfo
+#endif
+
+typedef struct ReferenceInfo_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+
+ rc_t ( *addRef ) ( const REFERENCEINFO_IMPL* self );
+ rc_t ( *release ) ( const REFERENCEINFO_IMPL* self );
+
+ rc_t ( *getRefSeqCount ) ( const REFERENCEINFO_IMPL* self, uint32_t* count );
+ rc_t ( *getRefSeq ) ( const REFERENCEINFO_IMPL* self, uint32_t n, ReferenceSequence* result );
+ rc_t ( *getReadGroupCount ) ( const REFERENCEINFO_IMPL* self, uint32_t* count );
+ rc_t ( *getReadGroup ) ( const REFERENCEINFO_IMPL* self, unsigned n, ReadGroup* result );
+ rc_t ( *getReadGroupByName ) ( const REFERENCEINFO_IMPL* self, const char* name, ReadGroup* result );
+
+ /* end minor version == 0 */
+
+} ReferenceInfo_vt_v1;
+
+typedef union ReferenceInfo_vt {
+ ReferenceInfo_vt_v1* v1;
+} ReferenceInfo_vt;
+
+struct ReferenceInfo
+{
+ ReferenceInfo_vt vt;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_common_reader_priv_ */
diff --git a/tools/fastq-loader/common-reader.c b/tools/fastq-loader/common-reader.c
new file mode 100644
index 0000000..cde2bcf
--- /dev/null
+++ b/tools/fastq-loader/common-reader.c
@@ -0,0 +1,614 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <loader/common-reader-priv.h>
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include <klib/rc.h>
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+rc_t CC ReaderFileAddRef ( const ReaderFile *self )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "ReaderFile" ) )
+ {
+ case krefLimit:
+ return RC ( RC_MODULE, rcFile, rcAttaching, rcRange, rcExcessive );
+ }
+ }
+ return 0;
+}
+
+rc_t CC ReaderFileRelease ( const ReaderFile *self )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "ReaderFile" ) )
+ {
+ case krefWhack:
+ return self->vt.v1->destroy( (ReaderFile *)self );
+ case krefNegative:
+ return RC ( RC_MODULE, rcFile, rcReleasing, rcRange, rcExcessive );
+ }
+ }
+ return 0;
+}
+
+rc_t CC ReaderFileGetRecord( const ReaderFile *self, const Record** result)
+{
+ assert(self);
+ assert(result);
+ return self->vt.v1->getRecord( self, result );
+}
+
+float CC ReaderFileGetProportionalPosition ( const READERFILE_IMPL *self )
+{
+ assert(self);
+ assert(self->vt.v1->getProportionalPosition);
+ return self->vt.v1->getProportionalPosition( self );
+}
+
+rc_t CC ReaderFileGetReferenceInfo ( const ReaderFile *self, const ReferenceInfo** result )
+{
+ assert(self);
+ assert(self->vt.v1->getReferenceInfo);
+ return self->vt.v1->getReferenceInfo( self, result );
+}
+
+/* Init
+ * polymorphic parent constructor
+ */
+rc_t CC ReaderFileInit ( ReaderFile *self )
+{
+ if ( self == NULL )
+ return RC ( RC_MODULE, rcFileFormat, rcConstructing, rcSelf, rcNull );
+
+ KRefcountInit ( & self -> refcount, 1, "ReaderFile", "ReaderFileInit", "");
+
+ self->pathname = NULL;
+
+ return 0;
+}
+
+rc_t CC ReaderFileWhack ( ReaderFile *self )
+{
+ if ( self == NULL )
+ return RC ( RC_MODULE, rcFileFormat, rcConstructing, rcSelf, rcNull );
+
+ free( self->pathname );
+
+ return 0;
+}
+
+const char* CC ReaderFileGetPathname ( const ReaderFile *self )
+{
+ if ( self == NULL )
+ return NULL;
+ return self->pathname;
+}
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+
+rc_t CC RecordAddRef ( const Record *self )
+{
+ assert(self);
+ assert(self->vt.v1->addRef);
+ return self->vt.v1->addRef(self);
+}
+
+rc_t CC RecordRelease ( const Record *self )
+{
+ assert(self);
+ assert(self->vt.v1->release);
+ return self->vt.v1->release(self);
+}
+
+rc_t CC RecordGetSequence ( const Record *self, const Sequence** result)
+{
+ assert(self);
+ assert(result);
+ assert(self->vt.v1->getSequence);
+ return self->vt.v1->getSequence(self, result);
+}
+
+rc_t CC RecordGetAlignment( const Record *self, const Alignment** result)
+{
+ assert(self);
+ assert(result);
+ assert(self->vt.v1->getAlignment);
+ return self->vt.v1->getAlignment(self, result);
+}
+
+rc_t CC RecordGetRejected ( const Record *self, const Rejected** result)
+{
+ assert(self);
+ assert(result);
+ assert(self->vt.v1->getRejected);
+ return self->vt.v1->getRejected(self, result);
+}
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+rc_t CC SequenceAddRef ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->addRef);
+ return self->vt.v1->addRef(self);
+}
+
+rc_t CC SequenceRelease ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->release);
+ return self->vt.v1->release(self);
+}
+
+rc_t CC SequenceGetReadLength ( const Sequence *self, uint32_t *length )
+{
+ assert(self);
+ assert(length);
+ assert(self->vt.v1->getReadLength);
+ return self->vt.v1->getReadLength(self, length);
+}
+
+rc_t CC SequenceGetRead( const Sequence *self, char *sequence )
+{
+ assert(self);
+ assert(sequence);
+ assert(self->vt.v1->getRead);
+ return self->vt.v1->getRead(self, sequence);
+}
+
+rc_t CC SequenceGetRead2 ( const Sequence *self, char *sequence, uint32_t start, uint32_t stop)
+{
+ assert(self);
+ assert(sequence);
+ assert(self->vt.v1->getRead2);
+ return self->vt.v1->getRead2(self, sequence, start, stop);
+}
+
+rc_t CC SequenceGetQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType)
+{
+ assert(self);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ assert(self->vt.v1->getQuality);
+ return self->vt.v1->getQuality(self, quality, offset, qualType);
+}
+
+rc_t CC SequenceGetSpotGroup ( const Sequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(name);
+ assert(length);
+ assert(self->vt.v1->getSpotGroup);
+ return self->vt.v1->getSpotGroup(self, name, length);
+}
+
+rc_t CC SequenceGetSpotName ( const Sequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(name);
+ assert(length);
+ assert(self->vt.v1->getSpotName);
+ return self->vt.v1->getSpotName(self, name, length);
+}
+
+bool CC SequenceIsColorSpace ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->isColorSpace);
+ return self->vt.v1->isColorSpace(self);
+}
+
+rc_t CC SequenceGetCSKey ( const Sequence *self, char cskey[1] )
+{
+ assert(self);
+ assert(self->vt.v1->getCSKey);
+ return self->vt.v1->getCSKey(self, cskey);
+}
+
+rc_t CC SequenceGetCSReadLength ( const Sequence *self, uint32_t *length )
+{
+ assert(self);
+ assert(self->vt.v1->getCSReadLength);
+ return self->vt.v1->getCSReadLength(self, length);
+}
+
+rc_t CC SequenceGetCSRead( const Sequence *self, char *sequence )
+{
+ assert(self);
+ assert(self->vt.v1->getCSRead);
+ return self->vt.v1->getCSRead(self, sequence);
+}
+
+rc_t CC SequenceGetCSQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType)
+{
+ assert(self);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ assert(self->vt.v1->getCSQuality);
+ return self->vt.v1->getCSQuality(self, quality, offset, qualType);
+}
+
+bool CC SequenceWasPaired ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->wasPaired);
+ return self->vt.v1->wasPaired(self);
+}
+
+int CC SequenceGetOrientationSelf( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->orientationSelf);
+ return self->vt.v1->orientationSelf(self);
+}
+
+int CC SequenceGetOrientationMate( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->orientationMate);
+ return self->vt.v1->orientationMate(self);
+}
+
+bool CC SequenceIsFirst ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->isFirst);
+ return self->vt.v1->isFirst(self);
+}
+
+bool CC SequenceIsSecond ( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->isSecond);
+ return self->vt.v1->isSecond(self);
+}
+
+rc_t SequenceGetTI(Sequence const *self, uint64_t *ti)
+{
+ assert(self);
+ assert(ti);
+ assert(self->vt.v1->getTI);
+ return self->vt.v1->getTI(self, ti);
+}
+
+bool CC SequenceIsDuplicate( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->isDuplicate);
+ return self->vt.v1->isDuplicate(self);
+}
+
+bool CC SequenceIsLowQuality( const Sequence *self )
+{
+ assert(self);
+ assert(self->vt.v1->isLowQuality);
+ return self->vt.v1->isLowQuality(self);
+}
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+
+rc_t CC AlignmentAddRef ( const Alignment *self )
+{
+ assert(self);
+ assert(self->vt.v1->addRef);
+ return self->vt.v1->addRef(self);
+}
+
+rc_t CC AlignmentRelease ( const Alignment *self )
+{
+ assert(self);
+ assert(self->vt.v1->release);
+ return self->vt.v1->release(self);
+}
+
+rc_t CC AlignmentGetRefSeqId ( const Alignment *self, int32_t *refSeqId )
+{
+ assert(self);
+ assert(refSeqId);
+ assert(self->vt.v1->getRefSeqId);
+ return self->vt.v1->getRefSeqId(self, refSeqId);
+}
+
+rc_t CC AlignmentGetMateRefSeqId ( const Alignment *self, int32_t *refSeqId )
+{
+ assert(self);
+ assert(refSeqId);
+ assert(self->vt.v1->getMateRefSeqId);
+ return self->vt.v1->getMateRefSeqId(self, refSeqId);
+}
+
+rc_t CC AlignmentGetPosition ( const Alignment *self, int64_t *pos )
+{
+ assert(self);
+ assert(pos);
+ assert(self->vt.v1->getPosition);
+ return self->vt.v1->getPosition(self, pos);
+}
+
+rc_t CC AlignmentGetMatePosition ( const Alignment *self, int64_t *pos )
+{
+ assert(self);
+ assert(pos);
+ assert(self->vt.v1->getMatePosition);
+ return self->vt.v1->getMatePosition(self, pos);
+}
+
+rc_t CC AlignmentGetMapQuality ( const Alignment *self, uint8_t *qual )
+{
+ assert(self);
+ assert(qual);
+ assert(self->vt.v1->getMapQuality);
+ return self->vt.v1->getMapQuality(self, qual);
+}
+
+rc_t CC AlignmentGetAlignmentDetail ( const Alignment *self,
+ AlignmentDetail *rslt,
+ uint32_t count,
+ uint32_t *actual,
+ int32_t *firstMatch,
+ int32_t *lastMatch )
+{
+ assert(self);
+ assert(self->vt.v1->getAlignmentDetail);
+ return self->vt.v1->getAlignmentDetail(self, rslt, count, actual, firstMatch, lastMatch);
+}
+
+rc_t CC AlignmentGetAlignOpCount ( const Alignment *self, uint32_t *n )
+{
+ assert(self);
+ assert(n);
+ assert(self->vt.v1->getAlignOpCount);
+ return self->vt.v1->getAlignOpCount(self, n);
+}
+
+rc_t CC AlignmentGetInsertSize ( const Alignment *self, int64_t *size )
+{
+ assert(self);
+ assert(size);
+ assert(self->vt.v1->getInsertSize);
+ return self->vt.v1->getInsertSize(self, size);
+}
+
+rc_t AlignmentGetCGData ( const ALIGNMENT_IMPL *self, const CGData** result)
+{
+ assert(self);
+ assert(result);
+ assert(self->vt.v1->getCG);
+ return self->vt.v1->getCG(self, result);
+}
+
+rc_t AlignmentGetBAMCigar ( const ALIGNMENT_IMPL *self, uint32_t const **rslt, uint32_t *length )
+{
+ assert(self);
+ assert(rslt);
+ assert(length);
+ assert(self->vt.v1->getBAMCigar);
+ return self->vt.v1->getBAMCigar(self, rslt, length);
+}
+
+bool AlignmentIsSecondary( const Alignment *self )
+{
+ assert(self);
+ assert(self->vt.v1->isSecondary);
+ return self->vt.v1->isSecondary(self);
+}
+
+/*--------------------------------------------------------------------------
+ * CGData
+ */
+rc_t CC CGDataAddRef ( const CGData *self )
+{
+ assert(self);
+ assert(self->vt.v1->addRef);
+ return self->vt.v1->addRef(self);
+}
+
+rc_t CC CGDataRelease ( const CGData *self )
+{
+ assert(self);
+ assert(self->vt.v1->release);
+ return self->vt.v1->release(self);
+}
+
+/* CGGetSeqQual
+ */
+rc_t CC CGDataGetSeqQual ( const CGData* self,
+ char sequence[/* 35 */],
+ uint8_t quality[/* 35 */] )
+{
+ assert(self);
+ assert(sequence);
+ assert(quality);
+ assert(self->vt.v1->getSeqQual);
+ return self->vt.v1->getSeqQual(self, sequence, quality);
+}
+
+/* CGGetCigar
+ */
+rc_t CC CGDataGetCigar ( const CGData* self,
+ uint32_t *cigar,
+ uint32_t cig_max,
+ uint32_t *cig_act )
+{
+ assert(self);
+ assert(cigar);
+ assert(cig_act);
+ assert(self->vt.v1->getCigar);
+ return self->vt.v1->getCigar(self, cigar, cig_max, cig_act);
+}
+
+/* CGGetAlignGroup
+ */
+rc_t CC CGDataGetAlignGroup ( const CGData* self,
+ char buffer[],
+ size_t max_size,
+ size_t *act_size )
+{
+ assert(self);
+ assert(act_size);
+ assert(self->vt.v1->getAlignGroup);
+ return self->vt.v1->getAlignGroup(self, buffer, max_size, act_size);
+}
+
+/*--------------------------------------------------------------------------
+ * Rejected
+ */
+
+rc_t CC RejectedInit ( Rejected *self )
+{
+ KRefcountInit ( & self -> refcount, 1, "Rejected", "RejectedInit", "");
+ StringInit(&self->source, 0, 0, 0);
+ self->message = 0;
+ self->column = 0;
+ self->line = 0;
+ self->fatal = false;
+ return 0;
+}
+
+static rc_t CC RejectedWhack ( const Rejected *self )
+{
+ free( (void*)self->source.addr );
+ free( (void*)self->message );
+ free( (void*)self );
+ return 0;
+}
+
+rc_t CC RejectedAddRef ( const Rejected *self )
+{
+ assert(self);
+ KRefcountAdd( & self->refcount, "Rejected" );
+ /* TODO: handle rc from KRefcountAdd */
+ return 0;
+}
+
+rc_t CC RejectedRelease ( const Rejected *self )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "Rejected" ) )
+ {
+ case krefWhack:
+ RejectedWhack( self );
+ break;
+ default:
+ /* TODO: handle other values */
+ break;
+ }
+ }
+ return 0;
+}
+
+rc_t CC RejectedGetError( const Rejected* self, const char** text, uint64_t* line, uint64_t* column, bool* fatal )
+{
+ assert(self);
+ assert(text);
+ assert(line);
+ assert(column);
+ *text = self->message;
+ *line = self->line;
+ *column = self->column;
+ *fatal = self->fatal;
+ return 0;
+}
+
+rc_t CC RejectedGetData( const Rejected* self, const void** data, size_t* length )
+{
+ assert(self);
+ assert(data);
+ assert(length);
+ *data = self->source.addr;
+ *length = StringSize( & self->source );
+ return 0;
+}
+
+/*--------------------------------------------------------------------------
+ * ReferenceInfo
+ */
+rc_t CC ReferenceInfoAddRef ( const ReferenceInfo *self )
+{
+ assert(self);
+ assert(self->vt.v1->addRef);
+ return self->vt.v1->addRef(self);
+}
+
+rc_t CC ReferenceInfoRelease ( const ReferenceInfo *self )
+{
+ assert(self);
+ assert(self->vt.v1->release);
+ return self->vt.v1->release(self);
+}
+
+rc_t CC ReferenceInfoGetRefSeqCount ( const ReferenceInfo *self, uint32_t* count )
+{
+ assert(self);
+ assert(self->vt.v1->getRefSeqCount);
+ return self->vt.v1->getRefSeqCount(self, count);
+}
+
+rc_t CC ReferenceInfoGetRefSeq ( const ReferenceInfo *self, uint32_t n, ReferenceSequence *result )
+{
+ assert(self);
+ assert(self->vt.v1->getRefSeq);
+ return self->vt.v1->getRefSeq(self, n, result);
+}
+
+rc_t CC ReferenceInfoGetReadGroupCount ( const ReferenceInfo *self, uint32_t *count )
+{
+ assert(self);
+ assert(self->vt.v1->getReadGroupCount);
+ return self->vt.v1->getReadGroupCount(self, count);
+}
+
+rc_t CC ReferenceInfoGetReadGroup ( const ReferenceInfo *self, unsigned n, ReadGroup *result )
+{
+ assert(self);
+ assert(self->vt.v1->getReadGroup);
+ return self->vt.v1->getReadGroup(self, n, result);
+}
+
+rc_t CC ReferenceInfoGetReadGroupByName ( const ReferenceInfo *self, const char *name, ReadGroup *result )
+{
+ assert(self);
+ assert(self->vt.v1->getReadGroupByName );
+ return self->vt.v1->getReadGroupByName(self, name, result);
+}
diff --git a/tools/fastq-loader/common-reader.h b/tools/fastq-loader/common-reader.h
new file mode 100644
index 0000000..b6cd796
--- /dev/null
+++ b/tools/fastq-loader/common-reader.h
@@ -0,0 +1,486 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_common_reader_
+#define _h_common_reader_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+typedef struct ReaderFile ReaderFile;
+typedef struct Record Record;
+typedef struct Sequence Sequence;
+typedef struct Alignment Alignment;
+typedef struct CGData CGData;
+typedef struct Rejected Rejected;
+typedef struct ReferenceInfo ReferenceInfo;
+
+/*--------------------------------------------------------------------------
+ ReaderFile
+ */
+rc_t CC ReaderFileAddRef ( const ReaderFile *self );
+rc_t CC ReaderFileRelease ( const ReaderFile *self );
+
+/* GetRecord
+ * Parses the next record from the source. At the end of the file, rc == 0, *result == 0.
+ */
+rc_t CC ReaderFileGetRecord( const ReaderFile *self, const Record** result);
+
+/* GetPathname
+ * Returns input's pathname, if applicable.
+ */
+const char* CC ReaderFileGetPathname ( const ReaderFile *self );
+
+/* GetProportionalPosition
+ * get the aproximate proportional position in the input file
+ * this is intended to be useful for computing progress
+ *
+ * NB - does not return rc_t
+ */
+float CC ReaderFileGetProportionalPosition ( const ReaderFile *self );
+
+/* GetReferenceInfo
+ *
+ */
+rc_t CC ReaderFileGetReferenceInfo ( const ReaderFile *self, const ReferenceInfo** result );
+
+/*--------------------------------------------------------------------------
+ Record
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC RecordAddRef ( const Record *self );
+rc_t CC RecordRelease ( const Record *self );
+
+rc_t CC RecordGetRejected ( const Record *self, const Rejected** result);
+rc_t CC RecordGetSequence ( const Record *self, const Sequence** result);
+rc_t CC RecordGetAlignment( const Record *self, const Alignment** result);
+
+/*--------------------------------------------------------------------------
+ Sequence
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC SequenceAddRef ( const Sequence *self );
+rc_t CC SequenceRelease ( const Sequence *self );
+
+/* GetReadLength
+ * get the sequence length
+ * i.e. the number of elements of both sequence and quality
+ *
+ * "length" [ OUT ] - length in bases of query sequence and quality
+ */
+rc_t CC SequenceGetReadLength ( const Sequence *self, uint32_t *length );
+
+/* GetRead
+ * get the sequence data [0..ReadLength)
+ * caller provides buffer of ReadLength bytes
+ *
+ * "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+rc_t CC SequenceGetRead( const Sequence *self, char *sequence );
+
+/* GetRead2
+ * get the sequence data [0..ReadLength)
+ * caller provides buffer of ReadLength bytes
+ *
+ * "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ *
+ * "start" [ IN ] and "stop" [ IN ] - zero-based coordinates, half-closed interval; both have to be within ReadLength
+ */
+rc_t CC SequenceGetRead2 ( const Sequence *self, char *sequence, uint32_t start, uint32_t stop);
+
+enum QualityType {
+ QT_Unknown = 0,
+ QT_Phred,
+ QT_LogOdds
+};
+/* GetQuality
+ * get the raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ * values are unsigned with 0xFF == missing
+ *
+ * "quality" [ OUT ] - return param for quality sequence
+ * held internally, validity is guaranteed for the life of the sequence
+ *
+ * "offset" [ OUT ] - the zero point of quality (33, 64; 0 for binary)
+ *
+ * "qualType" [ OUT ] - quality type (phred, log-odds, unknown)
+ */
+rc_t CC SequenceGetQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType);
+
+/* SequenceGetSpotGroup
+ * get the name of the spot group (e.g. accession)
+ *
+ * "name" [ OUT ] - return param for group name
+ * held internally, validity is guaranteed for the life of the sequence
+ *
+ * "length" [ OUT ] - return the number of bytes in "name"
+ */
+rc_t CC SequenceGetSpotGroup ( const Sequence *self, const char **name, size_t *length );
+
+
+/* SequenceGetSpotName
+ * get the read name and length in bytes
+ *
+ * "name" [ OUT ] - return param for read group name
+ * held internally, validity is guaranteed for the life of the sequence
+ *
+ * "length" [ OUT ] - return the number of bytes in "name"
+ */
+rc_t CC SequenceGetSpotName ( const Sequence *self, const char **name, size_t *length );
+
+/* IsColorSpace
+ * Does the sequence have colorspace info
+ */
+bool CC SequenceIsColorSpace ( const Sequence *self );
+
+/* GetCSKey
+ * get the colorspace key
+ *
+ * "cskey" [ OUT ] - return param
+ *
+ * return: if no colorspace info, RC is 0 but the value of cskey is undefined
+ */
+rc_t CC SequenceGetCSKey ( const Sequence *self, char cskey[1] );
+
+/* GetCSReadLength
+ * get the color space sequence length
+ * i.e. the number of elements of both sequence and quality
+ *
+ * "length" [ OUT ] - length in bases of query sequence and quality
+ */
+rc_t CC SequenceGetCSReadLength ( const Sequence *self, uint32_t *length );
+
+/* GetCSRead
+ * get the color space sequence data [0..ReadLength)
+ * caller provides buffer of ReadLength bytes
+ *
+ * "sequence" [ OUT ] - pointer to a buffer of at least ReadLength bytes
+ */
+rc_t CC SequenceGetCSRead( const Sequence *self, char *sequence );
+
+/* GetCSQuality
+ * get the color spaqce sequence's raw quality data [0..ReadLength) from OQ if possible else from QUAL
+ * values are unsigned with 0xFF == missing
+ *
+ * "quality" [ OUT ] - return param for quality sequence
+ * held internally, validity is guaranteed for the life of the sequence
+ *
+ * "offset" [ OUT ] - the zero point of quality (33, 64; 0 for binary)
+ *
+ * "qualType" [ OUT ] - quality type (phred, log-odds, unknown)
+ */
+rc_t CC SequenceGetCSQuality(const Sequence *self, const int8_t **quality, uint8_t *offset, int *qualType);
+
+
+/* WasPaired
+ * true if read number is present and not 0
+ */
+bool CC SequenceWasPaired ( const Sequence *self );
+
+enum ReadOrientation {
+ ReadOrientationUnknown,
+ ReadOrientationForward,
+ ReadOrientationReverse
+};
+/* SequenceGetOrientationSelf
+ */
+int CC SequenceGetOrientationSelf( const Sequence *self );
+/* SequenceGetOrientationMate
+ */
+int CC SequenceGetOrientationMate( const Sequence *self );
+
+/* IsFirst
+ * fastq: read number is present and equal to 1
+ */
+bool CC SequenceIsFirst ( const Sequence *self );
+/* IsSecond
+ * fastq: read number is present and equal to 2
+ */
+bool CC SequenceIsSecond ( const Sequence *self );
+/* IsDuplicate
+ *
+ */
+bool CC SequenceIsDuplicate( const Sequence *self );
+/* IsLowQuality
+ *
+ */
+bool CC SequenceIsLowQuality( const Sequence *self );
+
+/* RecordGetTI
+ *
+ */
+rc_t SequenceGetTI(Sequence const *self, uint64_t *ti);
+
+/*--------------------------------------------------------------------------
+ Alignment
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC AlignmentAddRef ( const Alignment *self );
+rc_t CC AlignmentRelease ( const Alignment *self );
+
+/* GetRefSeqId
+ * get id of reference sequence
+ * pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ * "refSeqId" [ OUT ] - zero-based id of reference sequence
+ * returns -1 if set is invalid within BAM ( rc may be zero )
+ */
+rc_t CC AlignmentGetRefSeqId ( const Alignment *self, int32_t *refSeqId );
+
+/* GetMateRefSeqId
+ * get id of mate's reference sequence
+ * pass result into BAMFileGetRefSeqById to get the Reference Sequence record
+ *
+ * "refSeqId" [ OUT ] - zero-based id of reference sequence
+ * returns -1 if invalid
+ */
+rc_t CC AlignmentGetMateRefSeqId ( const Alignment *self, int32_t *refSeqId );
+
+/* GetPosition
+ * get the aligned position on the ref. seq.
+ *
+ * "n" [ IN ] - zero-based position index for cases of multiple alignments
+ *
+ * "pos" [ OUT ] - zero-based position on reference sequence
+ * returns -1 if invalid
+ */
+rc_t CC AlignmentGetPosition ( const Alignment *self, int64_t *pos );
+
+/* GetMatePosition
+ * starting coordinate of mate's alignment on ref. seq.
+ *
+ * "pos" [ OUT ] - zero-based position on reference sequence
+ * returns -1 if invalid
+ */
+rc_t CC AlignmentGetMatePosition ( const Alignment *self, int64_t *pos );
+
+/* GetMapQuality
+ * return the quality score of mapping
+ *
+ * "qual" [ OUT ] - return param for quality score
+ */
+rc_t CC AlignmentGetMapQuality ( const Alignment *self, uint8_t *qual );
+
+/* GetAlignmentDetail
+ * get the alignment details
+ *
+ * "rslt" [ OUT, NULL OKAY ] and "count" [ IN ] - array to hold detail records
+ *
+ * "actual" [ OUT, NULL OKAY ] - number of elements written to "rslt"
+ * required if "rslt" is NULL
+ *
+ * "firstMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the first match to the refSeq
+ * or < 0 if invalid
+ *
+ * "lastMatch" [ OUT, NULL OKAY ] - zero-based index into "rslt" of the last match to the refSeq
+ * or < 0 if invalid
+ */
+typedef uint32_t AlignOpType;
+enum AlignOpTypes
+{
+ align_Match = 'M', /* 0 */
+ align_Insert = 'I', /* 1 */
+ align_Delete = 'D', /* 2 */
+ align_Skip = 'N', /* 3 */
+ align_SoftClip = 'S', /* 4 */
+ align_HardClip = 'H', /* 5 */
+ align_Padded = 'P', /* 6 */
+ align_Equal = '=', /* 7 */
+ align_NotEqual = 'X', /* 8 */
+ align_Overlap = 'B' /* Complete Genomics extension */
+};
+
+typedef struct AlignmentDetail AlignmentDetail;
+struct AlignmentDetail
+{
+ int64_t refSeq_pos; /* position on refSeq where this alignment region starts or -1 if NA */
+ int32_t read_pos; /* position on read where this alignment region starts or -1 if NA */
+ uint32_t length; /* length of alignment region */
+ AlignOpType type; /* type of alignment */
+};
+
+rc_t CC AlignmentGetAlignmentDetail ( const Alignment *self,
+ AlignmentDetail *rslt,
+ uint32_t count,
+ uint32_t *actual,
+ int32_t *firstMatch,
+ int32_t *lastMatch );
+
+
+/* GetCigarCount
+ * the number of CIGAR elements
+ * a CIGAR element consists of the pair of matching op code and op length
+ *
+ * "n" [ OUT ] - return param for cigar count
+ */
+rc_t CC AlignmentGetAlignOpCount ( const Alignment *self, uint32_t *n );
+
+
+/* GetInsertSize
+ * distance in bases to start of mate's alignment on ref. seq.
+ *
+ * "size" [ OUT ] - >0 for first in pair, <0 for second
+ */
+rc_t CC AlignmentGetInsertSize ( const Alignment *self, int64_t *size );
+
+/* GetBAMCigar
+ *
+ */
+rc_t CC AlignmentGetBAMCigar(const Alignment *cself, uint32_t const **rslt, uint32_t *length);
+
+/* IsSecondary
+ *
+ */
+bool CC AlignmentIsSecondary( const Alignment *self );
+
+
+/* AlignmentGetCG
+ * rc_t == 0, result == 0 if no CG data
+ */
+rc_t CC AlignmentGetCGData ( const Alignment *self, const CGData** result);
+
+/*--------------------------------------------------------------------------
+ * CGData
+ */
+rc_t CC CGDataAddRef ( const CGData *self );
+rc_t CC CGDataRelease ( const CGData *self );
+
+/* CGGetSeqQual
+ */
+rc_t CC CGDataGetSeqQual ( const CGData* self,
+ char sequence[/* 35 */],
+ uint8_t quality[/* 35 */] );
+
+/* CGGetCigar
+ */
+rc_t CC CGDataGetCigar ( const CGData* self,
+ uint32_t *cigar,
+ uint32_t cig_max,
+ uint32_t *cig_act );
+
+/* CGGetAlignGroup
+ */
+rc_t CC CGDataGetAlignGroup ( const CGData* self,
+ char buffer[],
+ size_t max_size,
+ size_t *act_size );
+
+/*--------------------------------------------------------------------------
+ * Rejected
+ */
+
+/* AddRef
+ * Release
+ */
+rc_t CC RejectedAddRef ( const Rejected *self );
+rc_t CC RejectedRelease ( const Rejected *self );
+
+/* GetError
+ * "text" [ OUT ] - NUL-terminated error message, held internally
+ * "line" [ OUT ] - 1-based line # in the source (0 for binary formats)
+ * "column" [ OUT ] - 1-based column # in the source (offset from the start of the file for binary formats)
+ * "fatal" [ OUT ] - no further parsing should be done (likely an unsupported format)
+ */
+rc_t CC RejectedGetError( const Rejected* self, const char** text, uint64_t* line, uint64_t* column, bool* fatal );
+
+/* GetData
+ * "data" [ OUT ] - raw input representing the rejected record. held internally
+ * "length" [ OUT ] - size of the data buffer
+ */
+rc_t CC RejectedGetData( const Rejected* self, const void** text, size_t* length );
+
+/*--------------------------------------------------------------------------
+ * ReferenceInfo
+ */
+typedef struct ReferenceSequence
+{
+ uint64_t length;
+ const char *name; /* not null unique */
+ const uint8_t *checksum;
+} ReferenceSequence;
+
+typedef struct ReadGroup
+{
+ const char *name; /* not null unique, accession e.g. SRR001138 */
+ const char *platform; /* e.g. ILLUMINA */
+} ReadGroup;
+
+rc_t CC ReferenceInfoAddRef ( const ReferenceInfo *self );
+rc_t CC ReferenceInfoRelease ( const ReferenceInfo *self );
+
+/* GetRefSeqCount
+ * get the number of Reference Sequences refered to in the header
+ * this is not necessarily the number of Reference Sequences referenced
+ * by the alignments
+ */
+rc_t CC ReferenceInfoGetRefSeqCount ( const ReferenceInfo *self, uint32_t* count );
+
+/* GetRefSeq
+ * get the n'th Ref. Seq. where n is [0..RefSeqCount)
+ * the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetRefSeq ( const ReferenceInfo *self, uint32_t n, ReferenceSequence *result );
+
+/* GetReadGroupCount
+ * get the number of Read Groups (accessions, etc.) refered to in the header
+ * this is not necessarily the number of Read Groups referenced
+ * by the alignments
+ */
+rc_t CC ReferenceInfoGetReadGroupCount ( const ReferenceInfo *self, uint32_t *count );
+
+/* GetReadGroup
+ * get the n'th Read Group where n is [0..ReadGroupCount)
+ * the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetReadGroup ( const ReferenceInfo *self, unsigned n, ReadGroup *result );
+
+/* GetReadGroupByName
+ * get a Read Group by its name
+ * the result is populated with pointers that are good for precisely at long as the ReferenceInfo exists.
+ */
+rc_t CC ReferenceInfoGetReadGroupByName ( const ReferenceInfo *self, const char *name, ReadGroup *result );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_common_reader_ */
diff --git a/tools/fastq-loader/common-writer.c b/tools/fastq-loader/common-writer.c
new file mode 100644
index 0000000..4811ce3
--- /dev/null
+++ b/tools/fastq-loader/common-writer.c
@@ -0,0 +1,1654 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sysalloc.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/status.h>
+
+#include <kdb/btree.h>
+
+#include <kapp/progressbar.h>
+#include <kapp/main.h>
+
+#include <kproc/queue.h>
+#include <kproc/thread.h>
+#include <kproc/timeout.h>
+#include <os-native.h>
+
+#include <kfs/file.h>
+#include <kfs/pagefile.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+
+#include "sequence-writer.h"
+#include "common-writer.h"
+#include "common-reader-priv.h"
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#define USE_READER_THREAD (1)
+
+/*--------------------------------------------------------------------------
+ * ctx_value_t, FragmentInfo
+ */
+typedef struct {
+/* uint64_t spotId; */
+ int64_t fragmentOffset;
+ uint16_t fragmentSize;
+ uint16_t seqHash[2];
+ uint8_t unmated: 1,
+ has_a_read: 1,
+ written: 1;
+} ctx_value_t;
+
+#define CTX_VALUE_SET_S_ID(A, B) ((void)(B))
+
+typedef struct FragmentInfo {
+ uint32_t readlen;
+ uint8_t is_bad;
+ uint8_t orientation;
+ uint8_t otherReadNo;
+ uint8_t sglen;
+ uint8_t cskey;
+} FragmentInfo;
+
+#define MMA_ELEM_T ctx_value_t
+#include "mmarray.c"
+#undef MMA_ELEM_T
+
+rc_t OpenKBTree(const CommonWriterSettings* settings, struct KBTree **const rslt, size_t const n, size_t const max)
+{
+ size_t const cacheSize = (((settings->cache_size - (settings->cache_size / 2) - (settings->cache_size / 8)) / max)
+ + 0xFFFFF) & ~((size_t)0xFFFFF);
+ KFile *file = NULL;
+ KDirectory *dir;
+ char fname[4096];
+ rc_t rc;
+
+ rc = KDirectoryNativeDir(&dir);
+ if (rc)
+ return rc;
+
+ rc = string_printf(fname, sizeof(fname), NULL, "%s/key2id.%u.%u", settings->tmpfs, settings->pid, n); if (rc) return rc;
+ STSMSG(1, ("Path for scratch files: %s\n", fname));
+ rc = KDirectoryCreateFile(dir, &file, true, 0600, kcmInit, "%s", fname);
+ KDirectoryRemove(dir, 0, "%s", fname);
+ KDirectoryRelease(dir);
+ if (rc == 0) {
+ rc = KBTreeMakeUpdate(rslt, file, cacheSize,
+ false, kbtOpaqueKey,
+ 1, 255, sizeof ( uint32_t ),
+ NULL
+ );
+ KFileRelease(file);
+ }
+ return rc;
+}
+
+rc_t GetKeyIDOld(const CommonWriterSettings* settings, SpotAssembler* const ctx, uint64_t *const rslt, bool *const wasInserted, char const key[], char const name[], size_t const namelen)
+{
+ size_t const keylen = strlen(key);
+ rc_t rc;
+ uint64_t tmpKey;
+
+ if (ctx->key2id_count == 0) {
+ rc = OpenKBTree(settings, &ctx->key2id[0], 1, 1);
+ if (rc) return rc;
+ ctx->key2id_count = 1;
+ }
+ if (keylen == 0 || memcmp(key, name, keylen) == 0) {
+ /* qname starts with read group; no append */
+ tmpKey = ctx->idCount[0];
+ rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, name, namelen);
+ }
+ else {
+ char sbuf[4096];
+ char *buf = sbuf;
+ char *hbuf = NULL;
+ size_t bsize = sizeof(sbuf);
+ size_t actsize;
+
+ if (keylen + namelen + 2 > bsize) {
+ hbuf = malloc(bsize = keylen + namelen + 2);
+ if (hbuf == NULL)
+ return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+ buf = hbuf;
+ }
+ rc = string_printf(buf, bsize, &actsize, "%s\t%.*s", key, (int)namelen, name);
+
+ tmpKey = ctx->idCount[0];
+ rc = KBTreeEntry(ctx->key2id[0], &tmpKey, wasInserted, buf, actsize);
+ if (hbuf)
+ free(hbuf);
+ }
+ if (rc == 0) {
+ *rslt = tmpKey;
+ if (*wasInserted)
+ ++ctx->idCount[0];
+ }
+ return rc;
+}
+
+static unsigned HashValue(unsigned const len, unsigned char const value[])
+{
+ /* FNV-1a hash with folding */
+ unsigned long long h = 0xcbf29ce484222325ull;
+ unsigned i;
+
+ for (i = 0; i < len; ++i) {
+ int const octet = value[i];
+ h = (h ^ octet) * 0x100000001b3ull;
+ }
+ return (unsigned)(h ^ (h >> 32));
+}
+
+static unsigned HashKey(void const *const key, size_t const keylen)
+{
+ return HashValue(keylen, key) % NUM_ID_SPACES;
+}
+
+static unsigned SeqHashKey(void const *const key, size_t const keylen)
+{
+ return HashValue(keylen, key) % 0x10000;
+}
+
+#define USE_ILLUMINA_NAMING_POUND_NUMBER_SLASH_HACK 1
+
+static size_t GetFixedNameLength(char const name[], size_t const namelen)
+{
+#if USE_ILLUMINA_NAMING_POUND_NUMBER_SLASH_HACK
+ char const *const pound = string_chr(name, namelen, '#');
+
+ if (pound && pound + 2u < name + namelen && pound[1] >= '0' && pound[1] <= '9' && pound[2] == '/') {
+ return (size_t)(pound - name) + 2u;
+ }
+#endif
+ return namelen;
+}
+
+rc_t GetKeyID(CommonWriterSettings *const settings,
+ SpotAssembler *const ctx,
+ uint64_t *const rslt,
+ bool *const wasInserted,
+ char const key[],
+ char const name[],
+ size_t const o_namelen)
+{
+ size_t const namelen = GetFixedNameLength(name, o_namelen);
+
+ if (ctx->key2id_max == 1)
+ return GetKeyIDOld(settings, ctx, rslt, wasInserted, key, name, namelen);
+ else {
+ size_t const keylen = strlen(key);
+ unsigned const h = HashKey(key, keylen);
+ size_t f;
+ size_t e = ctx->key2id_count;
+ uint64_t tmpKey;
+
+ *rslt = 0;
+ {{
+ uint32_t const bucket_value = ctx->key2id_hash[h];
+ unsigned const n = (uint8_t) bucket_value;
+ unsigned const i1 = (uint8_t)(bucket_value >> 8);
+ unsigned const i2 = (uint8_t)(bucket_value >> 16);
+ unsigned const i3 = (uint8_t)(bucket_value >> 24);
+
+ if (n > 0 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i1]) == 0) {
+ f = i1;
+ /*
+ ctx->key2id_hash[h] = (i3 << 24) | (i2 << 16) | (i1 << 8) | n;
+ */
+ goto GET_ID;
+ }
+ if (n > 1 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i2]) == 0) {
+ f = i2;
+ ctx->key2id_hash[h] = (i3 << 24) | (i1 << 16) | (i2 << 8) | n;
+ goto GET_ID;
+ }
+ if (n > 2 && strcmp(key, ctx->key2id_names + ctx->key2id_name[i3]) == 0) {
+ f = i3;
+ ctx->key2id_hash[h] = (i2 << 24) | (i1 << 16) | (i3 << 8) | n;
+ goto GET_ID;
+ }
+ }}
+ f = 0;
+ while (f < e) {
+ size_t const m = (f + e) / 2;
+ size_t const oid = ctx->key2id_oid[m];
+ int const diff = strcmp(key, ctx->key2id_names + ctx->key2id_name[oid]);
+
+ if (diff < 0)
+ e = m;
+ else if (diff > 0)
+ f = m + 1;
+ else {
+ f = oid;
+ goto GET_ID;
+ }
+ }
+ if (ctx->key2id_count < ctx->key2id_max) {
+ size_t const name_max = ctx->key2id_name_max + keylen + 1;
+ KBTree *tree;
+ rc_t rc = OpenKBTree(settings, &tree, ctx->key2id_count + 1, 1); /* ctx->key2id_max); */
+
+ if (rc) return rc;
+
+ if (ctx->key2id_name_alloc < name_max) {
+ size_t alloc = ctx->key2id_name_alloc;
+ void *tmp;
+
+ if (alloc == 0)
+ alloc = 4096;
+ while (alloc < name_max)
+ alloc <<= 1;
+ tmp = realloc(ctx->key2id_names, alloc);
+ if (tmp == NULL)
+ return RC(rcExe, rcName, rcAllocating, rcMemory, rcExhausted);
+ ctx->key2id_names = tmp;
+ ctx->key2id_name_alloc = alloc;
+ }
+ if (f < ctx->key2id_count) {
+ memmove(&ctx->key2id_oid[f + 1], &ctx->key2id_oid[f], (ctx->key2id_count - f) * sizeof(ctx->key2id_oid[f]));
+ }
+ ctx->key2id_oid[f] = ctx->key2id_count;
+ ++ctx->key2id_count;
+ f = ctx->key2id_oid[f];
+ ctx->key2id_name[f] = ctx->key2id_name_max;
+ ctx->key2id_name_max = name_max;
+
+ memmove(&ctx->key2id_names[ctx->key2id_name[f]], key, keylen + 1);
+ ctx->key2id[f] = tree;
+ ctx->idCount[f] = 0;
+ if ((uint8_t)ctx->key2id_hash[h] < 3) {
+ unsigned const n = (uint8_t)ctx->key2id_hash[h] + 1;
+
+ ctx->key2id_hash[h] = (uint32_t)((((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | n);
+ }
+ else {
+ /* the hash function isn't working too well
+ * keep the 3 mru
+ */
+ ctx->key2id_hash[h] = (uint32_t)((((ctx->key2id_hash[h] & ~(0xFFu)) | f) << 8) | 3);
+ }
+ GET_ID:
+ tmpKey = ctx->idCount[f];
+ rc = KBTreeEntry(ctx->key2id[f], &tmpKey, wasInserted, name, namelen);
+ if (rc == 0) {
+ *rslt = (((uint64_t)f) << 32) | tmpKey;
+ if (*wasInserted)
+ ++ctx->idCount[f];
+ assert(tmpKey < ctx->idCount[f]);
+ }
+ return rc;
+ }
+ return RC(rcExe, rcTree, rcAllocating, rcConstraint, rcViolated);
+ }
+}
+
+static int openTempFile(char const path[])
+{
+ int const fd = open(path, O_RDWR|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR);
+ unlink(path);
+ return fd;
+}
+
+static rc_t OpenMMapFile(const CommonWriterSettings* settings, SpotAssembler *const ctx, KDirectory *const dir)
+{
+ char fname[4096];
+ rc_t rc = string_printf(fname, sizeof(fname), NULL, "%s/id2value.%u", settings->tmpfs, settings->pid);
+
+ if (rc == 0) {
+ int const fd = openTempFile(fname);
+ if (fd >= 0)
+ ctx->id2value = MMArrayMake(&rc, fd);
+ else
+ rc = RC(rcExe, rcFile, rcCreating, rcFile, rcNotFound);
+ }
+ return rc;
+}
+
+static rc_t OpenMBankFile(const CommonWriterSettings* settings, SpotAssembler *const ctx, KDirectory *const dir)
+{
+ char fname[4096];
+ rc_t rc = string_printf(fname, sizeof(fname), NULL, "%s/fragments.%u", settings->tmpfs, settings->pid);
+
+ if (rc == 0) {
+ int const fd = openTempFile(fname);
+ if (fd < 0)
+ rc = RC(rcExe, rcFile, rcCreating, rcFile, rcNotFound);
+ else
+ ctx->fragmentFd = fd;
+ }
+ return rc;
+}
+
+rc_t SetupContext(const CommonWriterSettings* settings, SpotAssembler *ctx)
+{
+ rc_t rc = 0;
+
+ memset(ctx, 0, sizeof(*ctx));
+
+ ctx->fragment = calloc(FRAGMENT_HOT_COUNT, sizeof(ctx->fragment[0]));
+ assert(ctx->fragment != NULL);
+ if (ctx->fragment == NULL)
+ abort();
+
+ ctx->pass = 1;
+
+ if (settings->mode == mode_Archive) {
+ KDirectory *dir;
+
+ STSMSG(1, ("Cache size: %uM\n", settings->cache_size / 1024 / 1024));
+
+ rc = KLoadProgressbar_Make(&ctx->progress[0], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[1], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[2], 0); if (rc) return rc;
+ rc = KLoadProgressbar_Make(&ctx->progress[3], 0); if (rc) return rc;
+
+ KLoadProgressbar_Append(ctx->progress[0], 100 * settings->numfiles);
+
+ rc = KDirectoryNativeDir(&dir);
+ if (rc == 0)
+ rc = OpenMMapFile(settings, ctx, dir);
+ if (rc == 0)
+ rc = OpenMBankFile(settings, ctx, dir);
+ KDirectoryRelease(dir);
+ }
+ return rc;
+}
+
+void ContextReleaseMemBank(SpotAssembler *ctx)
+{
+ int i;
+
+ for (i = 0; i < FRAGMENT_HOT_COUNT; ++i)
+ free(ctx->fragment[i].data);
+
+ close(ctx->fragmentFd);
+}
+
+void ContextRelease(SpotAssembler *ctx)
+{
+ KLoadProgressbar_Release(ctx->progress[0], true);
+ KLoadProgressbar_Release(ctx->progress[1], true);
+ KLoadProgressbar_Release(ctx->progress[2], true);
+ KLoadProgressbar_Release(ctx->progress[3], true);
+ MMArrayWhack(ctx->id2value);
+ free(ctx->fragment);
+}
+
+static
+rc_t WriteSoloFragments(const CommonWriterSettings* settings, SpotAssembler* ctx, SequenceWriter *seq)
+{
+ uint32_t i;
+ unsigned j;
+ uint64_t idCount = 0;
+ rc_t rc;
+ KDataBuffer fragBuf;
+ SequenceRecord srec;
+ int const pass = ctx->pass;
+
+ ++ctx->pass;
+ memset(&srec, 0, sizeof(srec));
+
+ rc = KDataBufferMake(&fragBuf, 8, 0);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "KDataBufferMake failed");
+ return rc;
+ }
+ for (idCount = 0, j = 0; j < ctx->key2id_count; ++j) {
+ idCount += ctx->idCount[j];
+ }
+ KLoadProgressbar_Append(ctx->progress[pass], idCount);
+
+ for (idCount = 0, j = 0; j < ctx->key2id_count; ++j) {
+ for (i = 0; i != ctx->idCount[j]; ++i, ++idCount) {
+ uint64_t const keyId = ((uint64_t)j << 32) | i;
+ ctx_value_t *value;
+ unsigned readLen[2];
+ unsigned read = 0;
+ FragmentInfo const *fip;
+ uint8_t const *src;
+
+ value = MMArrayGet(ctx->id2value, &rc, keyId);
+ if (value == NULL)
+ break;
+ KLoadProgressbar_Process(ctx->progress[pass], 1, false);
+
+ if (value->written)
+ continue;
+
+ assert(!value->unmated);
+ if (ctx->fragment[keyId % FRAGMENT_HOT_COUNT].id == keyId) {
+ fip = (FragmentInfo const *)ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data;
+ }
+ else {
+ rc = KDataBufferResize(&fragBuf, (size_t)value->fragmentSize);
+ if (rc == 0) {
+ int64_t const nread = pread(ctx->fragmentFd, fragBuf.base, value->fragmentSize, value->fragmentOffset);
+ if (nread == value->fragmentSize)
+ fip = (FragmentInfo const *)fragBuf.base;
+ else {
+ (void)LOGERR(klogErr, rc = RC(rcExe, rcFile, rcReading, rcData, rcNotFound), "KMemBankRead failed");
+ break;
+ }
+ }
+ else {
+ (void)LOGERR(klogErr, rc, "KDataBufferResize failed");
+ break;
+ }
+ }
+ src = (uint8_t const *)&fip[1];
+
+ readLen[0] = readLen[1] = 0;
+ read = fip->otherReadNo - 1;
+
+ readLen[read] = fip->readlen;
+ rc = SequenceRecordInit(&srec, 2, readLen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceRecordInit failed");
+ break;
+ }
+
+ srec.is_bad[read] = fip->is_bad;
+ srec.orientation[read] = fip->orientation;
+ srec.cskey[read] = fip->cskey;
+ memmove(srec.seq + srec.readStart[read], src, srec.readLen[read]);
+ src += fip->readlen;
+
+ memmove(srec.qual + srec.readStart[read], src, srec.readLen[read]);
+ src += fip->readlen;
+ srec.spotGroup = (char *)src;
+ srec.spotGroupLen = fip->sglen;
+ srec.keyId = keyId;
+
+ rc = SequenceWriteRecord(seq, &srec, ctx->isColorSpace, false, settings->platform,
+ settings->keepMismatchQual, settings->no_real_output, settings->hasTI, settings->QualQuantizer);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+ break;
+ }
+ /*rc = KMemBankFree(frags, id);*/
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ value->written = 1;
+ }
+ }
+ /*printf("DONE_SOLO:\tcnt2=%d\tcnt1=%d\n",fcountBoth,fcountOne);*/
+ KDataBufferWhack(&fragBuf);
+ KDataBufferWhack(&srec.storage);
+ return rc;
+}
+
+void EditAlignedQualities(const CommonWriterSettings* settings, uint8_t qual[], bool const hasMismatch[], unsigned readlen) /* generic */
+{
+ unsigned i;
+
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q = hasMismatch[i] ? settings->alignedQualValue : qual[i];
+
+ qual[i] = q;
+ }
+}
+
+void EditUnalignedQualities(uint8_t qual[], bool const hasMismatch[], unsigned readlen) /* generic */
+{
+ unsigned i;
+
+ for (i = 0; i < readlen; ++i) {
+ uint8_t const q = (qual[i] & 0x7F) | (hasMismatch[i] ? 0x80 : 0);
+
+ qual[i] = q;
+ }
+}
+
+rc_t CheckLimitAndLogError(CommonWriterSettings* settings)
+{
+ ++settings->errCount;
+ if (settings->maxErrCount > 0 && settings->errCount > settings->maxErrCount) {
+ (void)PLOGERR(klogErr, (klogErr, RC(rcAlign, rcFile, rcReading, rcError, rcExcessive),
+ "Number of errors $(cnt) exceeds limit of $(max): Exiting", "cnt=%lu,max=%lu",
+ settings->errCount, settings->maxErrCount));
+ return RC(rcAlign, rcFile, rcReading, rcError, rcExcessive);
+ }
+ return 0;
+}
+
+void RecordNoMatch(const CommonWriterSettings* settings, char const readName[], char const refName[], uint32_t const refPos)
+{
+ if (settings->noMatchLog) {
+ static uint64_t lpos = 0;
+ char logbuf[256];
+ size_t len;
+
+ if (string_printf(logbuf, sizeof(logbuf), &len, "%s\t%s\t%u\n", readName, refName, refPos) == 0) {
+ KFileWrite(settings->noMatchLog, lpos, logbuf, len, NULL);
+ lpos += len;
+ }
+ }
+}
+
+rc_t LogNoMatch(CommonWriterSettings* settings, char const readName[], char const refName[], unsigned rpos, unsigned matches)
+{
+ rc_t const rc = CheckLimitAndLogError(settings);
+ static unsigned count = 0;
+
+ ++count;
+ if (rc) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+ "occurred=%u", count));
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+ "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+ }
+ else if (settings->maxWarnCount_NoMatch == 0 || count < settings->maxWarnCount_NoMatch)
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' contains too few ($(count)) matching bases to reference '$(ref)' at $(pos)",
+ "name=%s,ref=%s,pos=%u,count=%u", readName, refName, rpos, matches));
+ return rc;
+}
+
+rc_t LogDupConflict(CommonWriterSettings* settings, char const readName[])
+{
+ rc_t const rc = CheckLimitAndLogError(settings);
+ static unsigned count = 0;
+
+ ++count;
+ if (rc) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "This is the last warning; this class of warning occurred $(occurred) times",
+ "occurred=%u", count));
+ (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+ "name=%s", readName));
+ }
+ else if (settings->maxWarnCount_DupConflict == 0 || count < settings->maxWarnCount_DupConflict)
+ (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)' is both a duplicate and NOT a duplicate!",
+ "name=%s", readName));
+ return rc;
+}
+
+void COPY_QUAL(uint8_t D[], uint8_t const S[], unsigned const L, bool const R)
+{
+ if (R) {
+ unsigned i;
+ unsigned j;
+
+ for (i = 0, j = L - 1; i != L; ++i, --j)
+ D[i] = S[j];
+ }
+ else
+ memmove(D, S, L);
+}
+
+void COPY_READ(INSDC_dna_text D[], INSDC_dna_text const S[], unsigned const L, bool const R)
+{
+ static INSDC_dna_text const compl[] = {
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , '.', 0 ,
+ '0', '1', '2', '3', 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
+ };
+ if (R) {
+ unsigned i;
+ unsigned j;
+
+ for (i = 0, j = L - 1; i != L; ++i, --j)
+ D[i] = compl[((uint8_t const *)S)[j]];
+ }
+ else
+ memmove(D, S, L);
+}
+
+/*--------------------------------------------------------------------------
+ * ArchiveFile
+ */
+
+void ParseSpotName(char const name[], size_t* namelen)
+{ /* remove trailing #... */
+ const char* hash = string_chr(name, *namelen, '#');
+ if (hash)
+ *namelen = hash - name;
+}
+
+static int8_t LogOddsToPhred1(int8_t logOdds)
+{ /* conversion table copied from interface/ncbi/seq.vschema */
+ static int8_t const toPhred[] = {
+ 0, 1, 1, 2, 2, 3, 3,
+ 4, 4, 5, 5, 6, 7, 8, 9,10,10,
+ 11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,
+ 31,32,33,34,35,36,37,38,39,40
+ };
+ if (logOdds < -6)
+ return 0;
+ if (logOdds > 40)
+ return 40;
+ return toPhred[logOdds + 6];
+}
+
+static void LogOddsToPhred(unsigned const readLen, uint8_t dst[], int8_t const src[], int offset)
+{
+ unsigned i;
+
+ for (i = 0; i < readLen; ++i)
+ dst[i] = LogOddsToPhred1(src[i] - offset);
+}
+
+static void PhredToPhred(unsigned const readLen, uint8_t dst[], int8_t const src[], int offset)
+{
+ unsigned i;
+
+ for (i = 0; i < readLen; ++i)
+ dst[i] = src[i] - offset;
+}
+
+struct ReadResult {
+ float progress;
+ uint64_t recordNo;
+ enum {
+ rr_undefined = 0,
+ rr_sequence,
+ rr_rejected,
+ rr_done,
+ rr_error
+ } type;
+ union {
+ struct sequence {
+ char *name;
+ char *spotGroup;
+ char *seqDNA;
+ unsigned char *quality;
+ uint64_t id;
+ unsigned readLen;
+ unsigned readNo;
+ int mated;
+ int orientation;
+ int bad;
+ int inserted;
+ int colorspace;
+ char cskey;
+ } sequence;
+ struct reject {
+ char *message;
+ uint64_t line;
+ unsigned column;
+ int fatal;
+ } reject;
+ struct error {
+ char const *message;
+ rc_t rc;
+ } error;
+ } u;
+};
+
+static char *getSpotGroup(Sequence const *const sequence)
+{
+ char *rslt = NULL;
+ char const *tmp = NULL;
+ size_t len = 0;
+
+ SequenceGetSpotGroup(sequence, &tmp, &len);
+ if (tmp) {
+ rslt = malloc(len + 1);
+ if (rslt) {
+ memmove(rslt, tmp, len);
+ rslt[len] = '\0';
+ }
+ }
+ else {
+ rslt = malloc(1);
+ if (rslt) {
+ rslt[0] = '\0';
+ }
+ }
+ return rslt;
+}
+
+static char *getName(Sequence const *const sequence, bool const parseSpotName)
+{
+ char *rslt = NULL;
+ char const *tmp = NULL;
+ size_t len = 0;
+
+ SequenceGetSpotName(sequence, &tmp, &len);
+ if (parseSpotName)
+ ParseSpotName(tmp, &len);
+ rslt = malloc(len + 1);
+ if (rslt) {
+ memmove(rslt, tmp, len);
+ rslt[len] = '\0';
+ }
+ return rslt;
+}
+
+static char const kReaderFileGetRecord[] = "ReaderFileGetRecord";
+static char const kRecordGetSequence[] = "RecordGetSequence";
+static char const kRecordGetRejected[] = "RecordGetRejected";
+static char const kRejectedGetError[] = "RejectedGetError";
+static char const kSequenceGetQuality[] = "SequenceGetQuality";
+static char const kGetKeyID[] = "GetKeyID";
+static char const kSequenceGetRead[] = "SequenceGetRead";
+static char const kQuitting[] = "Quitting";
+
+static void readSequence(CommonWriterSettings *const G, SpotAssembler *const ctx, Sequence const *const sequence, struct ReadResult *const rslt)
+{
+ char *seqDNA = NULL;
+ uint8_t *qual = NULL;
+ char *name = NULL;
+ char *spotGroup = NULL;
+ uint32_t readLen = 0;
+ unsigned readNo = 0;
+ int mated = 0;
+ int orientation = 0;
+ int colorspace = 0;
+ char cskey[2];
+ uint64_t keyId = 0;
+ bool wasInserted = 0;
+ bool bad = 0;
+ rc_t rc = 0;
+
+ memset(cskey, 0, sizeof(cskey));
+ colorspace = SequenceIsColorSpace(sequence);
+ orientation = SequenceGetOrientationSelf(sequence);
+ bad = SequenceIsLowQuality(sequence);
+ if (colorspace)
+ rc = SequenceGetCSReadLength(sequence, &readLen);
+ else
+ rc = SequenceGetReadLength(sequence, &readLen);
+ assert(rc == 0);
+ seqDNA = malloc(readLen);
+ qual = malloc(readLen);
+ name = getName(sequence, G->parseSpotName);
+ spotGroup = getSpotGroup(sequence);
+
+ if ( seqDNA == NULL
+ || qual == NULL
+ || name == NULL
+ || spotGroup == NULL
+ )
+ {
+ fprintf(stderr, "OUT OF MEMORY!!!");
+ abort();
+ }
+
+ if (!colorspace) {
+ rc = SequenceGetRead(sequence, seqDNA);
+ }
+ else {
+ SequenceGetCSKey(sequence, cskey);
+ rc = SequenceGetCSRead(sequence, seqDNA);
+ }
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(name)': failed to get sequence", "%s", name));
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kSequenceGetRead;
+ goto CLEANUP;
+ }
+ {
+ int8_t const *squal = NULL;
+ uint8_t qoffset = 0;
+ int qualType = 0;
+
+ if (!colorspace || G->useQUAL)
+ rc = SequenceGetQuality(sequence, &squal, &qoffset, &qualType);
+ else {
+ rc = SequenceGetCSQuality(sequence, &squal, &qoffset, &qualType);
+ qualType = QT_Phred;
+ }
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Spot '$(name)': length of original quality does not match sequence", "name=%s", name));
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kSequenceGetQuality;
+ goto CLEANUP;
+ }
+ if (squal) {
+ if (qualType == QT_Phred)
+ PhredToPhred(readLen, qual, squal, qoffset);
+ else if (qualType == QT_LogOdds)
+ LogOddsToPhred(readLen, qual, squal, qoffset);
+ else
+ memmove(qual, squal, readLen);
+ }
+ else if (!colorspace)
+ memset(qual, 30, readLen);
+ else
+ memset(qual, 0, readLen);
+ }
+ if (SequenceWasPaired(sequence)) {
+ if (SequenceIsFirst(sequence))
+ readNo |= 1;
+ if (SequenceIsSecond(sequence))
+ readNo |= 2;
+ if (readNo == 1 || readNo == 2)
+ mated = 1;
+ }
+ if (!mated)
+ readNo = 1;
+
+ rc = GetKeyID(G, ctx, &keyId, &wasInserted, spotGroup, name, strlen(name));
+ if (rc != 0) {
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kGetKeyID;
+ }
+CLEANUP:
+ if (rslt->type == rr_error) {
+ free(seqDNA);
+ free(qual);
+ free(name);
+ free(spotGroup);
+ }
+ else {
+ rslt->type = rr_sequence;
+ rslt->u.sequence.name = name;
+ rslt->u.sequence.spotGroup = spotGroup;
+ rslt->u.sequence.seqDNA = seqDNA;
+ rslt->u.sequence.quality = qual;
+ rslt->u.sequence.id = keyId;
+ rslt->u.sequence.readLen = readLen;
+ rslt->u.sequence.readNo = readNo;
+ rslt->u.sequence.mated = mated;
+ rslt->u.sequence.orientation = orientation;
+ rslt->u.sequence.bad = bad;
+ rslt->u.sequence.inserted = wasInserted;
+ rslt->u.sequence.colorspace = colorspace;
+ rslt->u.sequence.cskey = cskey[0];
+ }
+ return;
+}
+
+static void freeReadResultSequence(struct ReadResult const *const rslt)
+{
+ free(rslt->u.sequence.name);
+ free(rslt->u.sequence.spotGroup);
+ free(rslt->u.sequence.seqDNA);
+ free(rslt->u.sequence.quality);
+}
+
+static void readRejected(CommonWriterSettings *const G, SpotAssembler *const ctx, Rejected const *const reject, struct ReadResult *const rslt)
+{
+ char const *message;
+ uint64_t line = 0;
+ uint64_t col = 0;
+ bool fatal = 0;
+ rc_t const rc = RejectedGetError(reject, &message, &line, &col, &fatal);
+
+ if (rc == 0) {
+ rslt->type = rr_rejected;
+ rslt->u.reject.message = strdup(message);
+ rslt->u.reject.line = line;
+ rslt->u.reject.column = col;
+ rslt->u.reject.fatal = fatal;
+ }
+ else {
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kRejectedGetError;
+ }
+}
+
+static void freeReadResultRejected(struct ReadResult const *const rslt)
+{
+ free(rslt->u.reject.message);
+}
+
+static void readRecord(CommonWriterSettings *const G, SpotAssembler *const ctx, Record const *const record, struct ReadResult *const rslt)
+{
+ rc_t rc = 0;
+ Rejected const *rej = NULL;
+
+ rc = RecordGetRejected(record, &rej);
+ if (rc == 0 && rej == NULL) {
+ Sequence const *sequence = NULL;
+ rc = RecordGetSequence(record, &sequence);
+ if (rc == 0) {
+ assert(sequence != NULL);
+ readSequence(G, ctx, sequence, rslt);
+ SequenceRelease(sequence);
+ return;
+ }
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kRecordGetSequence;
+ return;
+ }
+ if (rc != 0) {
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kRecordGetRejected;
+ return;
+ }
+ assert(rej != NULL);
+ readRejected(G, ctx, rej, rslt);
+ RejectedRelease(rej);
+}
+
+static struct ReadResult *threadGetNextRecord(CommonWriterSettings *const G, SpotAssembler *const ctx, struct ReaderFile const *reader, uint64_t *reccount)
+{
+ rc_t rc = 0;
+ Record const *record = NULL;
+ struct ReadResult *const rslt = calloc(1, sizeof(*rslt));
+
+ assert(rslt != NULL);
+ if (rslt != NULL) {
+ rslt->progress = ReaderFileGetProportionalPosition(reader);
+ rslt->recordNo = ++*reccount;
+ if (G->maxAlignCount > 0 && rslt->recordNo > G->maxAlignCount) {
+ (void)PLOGMSG(klogDebug, (klogDebug, "reached limit of $(max) records read", "max=%u", (unsigned)G->maxAlignCount));
+ rslt->type = rr_done;
+ return rslt;
+ }
+ rc = ReaderFileGetRecord(reader, &record);
+ if (rc != 0) {
+ rslt->type = rr_error;
+ rslt->u.error.rc = rc;
+ rslt->u.error.message = kReaderFileGetRecord;
+ return rslt;
+ }
+ if (record != NULL) {
+ readRecord(G, ctx, record, rslt);
+ RecordRelease(record);
+ return rslt;
+ }
+ else {
+ rslt->type = rr_done;
+ return rslt;
+ }
+ }
+ abort();
+}
+
+static void freeReadResultError(struct ReadResult const *const rslt)
+{
+ (void)0;
+}
+
+static void freeReadResult(struct ReadResult const *const rslt)
+{
+ if (rslt->type == rr_sequence)
+ freeReadResultSequence(rslt);
+ else if (rslt->type == rr_rejected)
+ freeReadResultRejected(rslt);
+ else if (rslt->type == rr_error)
+ freeReadResultError(rslt);
+}
+
+struct ReadThreadContext {
+ timeout_t tm;
+ KThread *th;
+ KQueue *que;
+ CommonWriterSettings *settings;
+ SpotAssembler *ctx;
+ ReaderFile const *reader;
+ uint64_t reccount;
+};
+
+static rc_t readThread(KThread const *const th, void *const ctx)
+{
+ struct ReadThreadContext *const self = ctx;
+ timeout_t tm;
+ rc_t rc = 0;
+
+ TimeoutInit(&tm, 10000);
+ while (Quitting() == 0) {
+ struct ReadResult *const rr = threadGetNextRecord(self->settings, self->ctx, self->reader, &self->reccount);
+ int const rr_type = rr->type;
+
+ for ( ;; ) {
+ rc = KQueuePush(self->que, rr, &tm);
+ if (rc == 0)
+ break;
+ if ((int)GetRCObject(rc) == rcTimeout) {
+ continue;
+ }
+ break;
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "readThread: failed to push next record into queue");
+ free(rr);
+ break;
+ }
+ else if (rr_type == rr_done) {
+ /* normal exit from end of file */
+ (void)LOGMSG(klogDebug, "readThread done : end of file");
+ break;
+ }
+ }
+ KQueueSeal(self->que);
+ return rc;
+}
+
+static struct ReadResult getNextRecord(struct ReadThreadContext *const self)
+{
+ struct ReadResult rslt;
+
+ memset(&rslt, 0, sizeof(rslt));
+#if USE_READER_THREAD
+ if (self->th == NULL) {
+ TimeoutInit(&self->tm, 1000000);
+ rslt.u.error.rc = KQueueMake(&self->que, 1024);
+ if (rslt.u.error.rc) {
+ rslt.type = rr_error;
+ rslt.u.error.message = "KQueueMake";
+ return rslt;
+ }
+ rslt.u.error.rc = KThreadMake(&self->th, readThread, (void *)self);
+ if (rslt.u.error.rc) {
+ rslt.type = rr_error;
+ rslt.u.error.message = "KThreadMake";
+ return rslt;
+ }
+ }
+ while ((rslt.u.error.rc = Quitting()) == 0) {
+ void *rr = NULL;
+ rslt.u.error.rc = KQueuePop(self->que, &rr, &self->tm);
+ if (rslt.u.error.rc == 0) {
+ memmove(&rslt, rr, sizeof(rslt));
+ free(rr);
+ if (rslt.type == rr_done)
+ goto DONE;
+ return rslt;
+ }
+ if ((int)GetRCObject(rslt.u.error.rc) == rcTimeout) {
+ (void)LOGMSG(klogDebug, "KQueuePop timed out");
+ }
+ else {
+ (void)LOGERR(klogErr, rslt.u.error.rc, "KQueuePop failed");
+ rslt.type = rr_done;
+ goto DONE;
+ }
+ }
+ rslt.type = rr_error;
+ rslt.u.error.message = kQuitting;
+DONE:
+ {
+ rc_t rc = 0;
+ KThreadWait(self->th, &rc);
+ KThreadRelease(self->th);
+ KQueueRelease(self->que);
+ self->que = NULL;
+ self->th = NULL;
+ }
+#else
+ if ((rslt.u.error.rc = Quitting()) == 0) {
+ struct ReadResult *const rr = threadGetNextRecord(self->settings, self->ctx, self->reader, &self->reccount);
+ rslt = *rr;
+ free(rr);
+ }
+ else {
+ rslt.type = rr_error;
+ rslt.u.error.message = kQuitting;
+ }
+#endif
+ return rslt;
+}
+
+rc_t ArchiveFile(const struct ReaderFile *const reader,
+ CommonWriterSettings *const G,
+ struct SpotAssembler *const ctx,
+ struct SequenceWriter *const seq,
+ bool *const had_sequences)
+{
+ KDataBuffer buf;
+ KDataBuffer fragBuf;
+ rc_t rc;
+ SequenceRecord srec;
+ unsigned progress = 0;
+ uint64_t recordsProcessed = 0;
+ uint64_t filterFlagConflictRecords=0; /*** counts number of conflicts between flags 'duplicate' and 'lowQuality' ***/
+#define MAX_WARNINGS_FLAG_CONFLICT 10000 /*** maximum errors to report ***/
+
+ bool isColorSpace = false;
+ bool isNotColorSpace = G->noColorSpace;
+ char const *const fileName = ReaderFileGetPathname(reader);
+ struct ReadThreadContext threadCtx;
+ uint64_t fragmentsAdded = 0;
+ uint64_t spotsCompleted = 0;
+ uint64_t fragmentsEvicted = 0;
+
+ if (ctx->key2id_max == 0) {
+ ctx->key2id_max = 1;
+ }
+
+ memset(&srec, 0, sizeof(srec));
+ memset(&threadCtx, 0, sizeof(threadCtx));
+ threadCtx.settings = G;
+ threadCtx.ctx = ctx;
+ threadCtx.reader = reader;
+
+ rc = KDataBufferMake(&fragBuf, 8, 4096);
+ if (rc)
+ return rc;
+
+ rc = KDataBufferMake(&buf, 16, 0);
+ if (rc)
+ return rc;
+
+ if (rc == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Loading '$(file)'", "file=%s", fileName));
+ }
+
+ *had_sequences = false;
+
+ while (rc == 0) {
+ ctx_value_t *value;
+ struct ReadResult const rr = getNextRecord(&threadCtx);
+
+ if ((unsigned)(rr.progress * 100.0) > progress) {
+ unsigned new_value = rr.progress * 100.0;
+ KLoadProgressbar_Process(ctx->progress[0], new_value - progress, false);
+ progress = new_value;
+ }
+ if (rr.type == rr_done)
+ break;
+ if (rr.type == rr_error) {
+ rc = rr.u.error.rc;
+ if (rr.u.error.message == kQuitting) {
+ (void)LOGMSG(klogInfo, "Exiting read loop");
+ break;
+ }
+ if (rr.u.error.message == kReaderFileGetRecord) {
+ if (GetRCObject(rc) == rcRow && (GetRCState(rc) == rcInvalid || GetRCState(rc) == rcEmpty)) {
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "ArchiveFile: '$(file)' - row $(row)", "file=%s,row=%lu", fileName, rr.recordNo));
+ rc = CheckLimitAndLogError(G);
+ }
+ /* else fail */
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc, "ArchiveFile: $(func) failed", "func=%s", rr.u.error.message));
+ rc = CheckLimitAndLogError(G);
+ }
+ goto LOOP_END;
+ }
+ if (rr.type == rr_rejected) {
+ char const *const message = rr.u.reject.message;
+ uint64_t const line = rr.u.reject.line;
+ uint64_t const col = rr.u.reject.column;
+ bool const fatal = rr.u.reject.fatal;
+
+ (void)PLOGMSG(fatal ? klogErr : klogWarn, (fatal ? klogErr : klogWarn,
+ "$(file):$(l):$(c):$(msg)", "file=%s,l=%lu,c=%lu,msg=%s",
+ fileName, line, col, message));
+ rc = CheckLimitAndLogError(G);
+ if (fatal)
+ rc = RC(rcExe, rcFile, rcParsing, rcFormat, rcUnsupported);
+ goto LOOP_END;
+ }
+ if (rr.type == rr_sequence) {
+ uint64_t const keyId = rr.u.sequence.id;
+ bool const wasInserted = !!rr.u.sequence.inserted;
+ bool const colorspace = !!rr.u.sequence.colorspace;
+ bool const mated = !!rr.u.sequence.mated;
+ unsigned const readNo = rr.u.sequence.readNo;
+ char const *const seqDNA = rr.u.sequence.seqDNA;
+ uint8_t const *const qual = rr.u.sequence.quality;
+ unsigned const readlen = rr.u.sequence.readLen;
+ int const readOrientation = !!rr.u.sequence.orientation;
+ bool const reverse = isColorSpace ? false : (readOrientation == ReadOrientationReverse);
+ char const cskey = rr.u.sequence.cskey;
+ bool const bad = !!rr.u.sequence.bad;
+ char const *const spotGroup = rr.u.sequence.spotGroup;
+ char const *const name = rr.u.sequence.name;
+ int const namelen = strlen(name);
+
+ if (!G->noColorSpace) {
+ if (colorspace) {
+ if (isNotColorSpace) {
+ MIXED_BASE_AND_COLOR:
+ rc = RC(rcApp, rcFile, rcReading, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "File '$(file)' contains base space and color space", "file=%s", fileName));
+ goto LOOP_END;
+ }
+ ctx->isColorSpace = isColorSpace = true;
+ }
+ else if (isColorSpace)
+ goto MIXED_BASE_AND_COLOR;
+ else
+ isNotColorSpace = true;
+ }
+
+ value = MMArrayGet(ctx->id2value, &rc, keyId);
+ if (value == NULL) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "MMArrayGet: failed on id '$(id)'", "id=%u", keyId));
+ goto LOOP_END;
+ }
+ if (wasInserted) {
+ memset(value, 0, sizeof(*value));
+ value->fragmentOffset = -1;
+ value->unmated = !mated;
+ }
+ else {
+ if (mated && value->unmated) {
+ (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)', which was first seen without mate info, now has mate info",
+ "name=%s", name));
+ rc = CheckLimitAndLogError(G);
+ goto LOOP_END;
+ }
+ }
+
+ ++recordsProcessed;
+ if (mated) {
+ if (value->written) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' has already been assigned a spot id", "name=%s", name));
+ }
+ else if (!value->has_a_read) {
+ /* new mated fragment - do spot assembly */
+ unsigned sz;
+ FragmentInfo fi;
+ int64_t const victimId = ctx->fragment[keyId % FRAGMENT_HOT_COUNT].id;
+ void *const victimData = ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data;
+ void *myData = NULL;
+
+ ++fragmentsAdded;
+ value->seqHash[readNo - 1] = SeqHashKey(seqDNA, readlen);
+
+ memset(&fi, 0, sizeof(fi));
+ fi.orientation = readOrientation;
+ fi.otherReadNo = readNo;
+ fi.sglen = strlen(spotGroup);
+ fi.readlen = readlen;
+ fi.cskey = cskey;
+ fi.is_bad = bad;
+ sz = sizeof(fi) + 2*fi.readlen + fi.sglen;
+ myData = malloc(sz);
+ if (myData == NULL) {
+ (void)LOGERR(klogErr, RC(rcExe, rcFile, rcReading, rcMemory, rcExhausted), "OUT OF MEMORY!");
+ abort();
+ goto LOOP_END;
+ }
+ {{
+ uint8_t *dst = (uint8_t*)myData;
+
+ memmove(dst,&fi,sizeof(fi));
+ dst += sizeof(fi);
+ COPY_READ((char *)dst, seqDNA, fi.readlen, reverse);
+ dst += fi.readlen;
+ COPY_QUAL(dst, qual, fi.readlen, reverse);
+ dst += fi.readlen;
+ memmove(dst,spotGroup,fi.sglen);
+ }}
+ ctx->fragment[keyId % FRAGMENT_HOT_COUNT].id = keyId;
+ ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data = myData;
+ value->has_a_read = 1;
+ value->fragmentSize = sz;
+ *had_sequences = true;
+
+ if (victimData != NULL) {
+ ctx_value_t *const victim = MMArrayGet(ctx->id2value, &rc, victimId);
+ if (victim == NULL) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "MMArrayGet: failed on id '$(id)'", "id=%u", victimId));
+ abort();
+ goto LOOP_END;
+ }
+ if (victim->fragmentOffset < 0) {
+ int64_t const pos = ctx->nextFragment;
+ int64_t const nwrit = pwrite(ctx->fragmentFd, victimData, victim->fragmentSize, pos);
+
+ if (nwrit == victim->fragmentSize) {
+ ctx->nextFragment += victim->fragmentSize;
+ victim->fragmentOffset = pos;
+ free(victimData);
+ ++fragmentsEvicted;
+ }
+ else {
+ (void)LOGMSG(klogFatal, "Failed to write fragment data");
+ abort();
+ goto LOOP_END;
+ }
+ }
+ else {
+ (void)LOGMSG(klogFatal, "PROGRAMMER ERROR!!");
+ abort();
+ goto LOOP_END;
+ }
+ }
+ }
+ else {
+ /* might be second fragment */
+ uint64_t const sz = value->fragmentSize;
+ bool freeFip = false;
+ FragmentInfo *fip = NULL;
+
+ if (ctx->fragment[keyId % FRAGMENT_HOT_COUNT].id == keyId) {
+ fip = ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data;
+ freeFip = true;
+ }
+ else {
+ int64_t nread = 0;
+ rc = KDataBufferResize(&fragBuf, (size_t)sz);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed to resize fragment buffer", ""));
+ abort();
+ goto LOOP_END;
+ }
+ nread = pread(ctx->fragmentFd, fragBuf.base, sz, value->fragmentOffset);
+ if (nread == sz) {
+ fip = (FragmentInfo *) fragBuf.base;
+ }
+ else {
+ (void)PLOGMSG(klogFatal, (klogFatal, "Failed to read fragment data; spot:'$(name)'; "
+ "size: $(size); pos: $(pos); read: $(read)", "name=%s,size=%lu,pos=%lu,read=%lu",
+ name, sz, value->fragmentOffset, nread));
+ abort();
+ goto LOOP_END;
+ }
+ }
+ if (readNo != fip->otherReadNo) {
+ /* mate found */
+ unsigned readLen[2];
+ unsigned read1 = 0;
+ unsigned read2 = 1;
+ uint8_t *src = (uint8_t*) fip + sizeof(*fip);
+
+ ++spotsCompleted;
+ value->seqHash[readNo - 1] = SeqHashKey(seqDNA, readlen);
+
+ if (readNo < fip->otherReadNo) {
+ read1 = 1;
+ read2 = 0;
+ }
+ readLen[read1] = fip->readlen;
+ readLen[read2] = readlen;
+ rc = SequenceRecordInit(&srec, 2, readLen);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failed resizing sequence record buffer", ""));
+ goto LOOP_END;
+ }
+ srec.is_bad[read1] = fip->is_bad;
+ srec.orientation[read1] = fip->orientation;
+ srec.cskey[read1] = fip->cskey;
+ memmove(srec.seq + srec.readStart[read1], src, fip->readlen);
+ src += fip->readlen;
+ memmove(srec.qual + srec.readStart[read1], src, fip->readlen);
+ src += fip->readlen;
+
+ srec.orientation[read2] = readOrientation;
+ COPY_READ(srec.seq + srec.readStart[read2],
+ seqDNA,
+ srec.readLen[read2],
+ reverse);
+ COPY_QUAL(srec.qual + srec.readStart[read2],
+ qual,
+ srec.readLen[read2],
+ reverse);
+
+ srec.keyId = keyId;
+ srec.is_bad[read2] = bad;
+ srec.cskey[read2] = cskey;
+
+ srec.spotGroup = (char *)spotGroup;
+ srec.spotGroupLen = strlen(spotGroup);
+ rc = SequenceWriteRecord(seq, &srec, isColorSpace, false, G->platform,
+ G->keepMismatchQual, G->no_real_output, G->hasTI, G->QualQuantizer);
+ if (freeFip) {
+ free(fip);
+ ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data = NULL;
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+ goto LOOP_END;
+ }
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ value->written = 1;
+ }
+ }
+ }
+ else if (value->written) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Spot '$(name)' has already been assigned a spot id", "name=%s", name));
+ }
+ else if (value->has_a_read) {
+ if (ctx->fragment[keyId % FRAGMENT_HOT_COUNT].id == keyId) {
+ free(ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data);
+ ctx->fragment[keyId % FRAGMENT_HOT_COUNT].data = NULL;
+ }
+ (void)PLOGERR(klogWarn, (klogWarn, RC(rcApp, rcFile, rcReading, rcData, rcInconsistent),
+ "Spot '$(name)', which was first seen with mate info, now has no mate info",
+ "name=%s", name));
+ rc = CheckLimitAndLogError(G);
+ }
+ else {
+ /* new unmated fragment - no spot assembly */
+ unsigned readLen[1];
+
+ value->seqHash[0] = SeqHashKey(seqDNA, readlen);
+
+ readLen[0] = readlen;
+ rc = SequenceRecordInit(&srec, 1, readLen);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Failed resizing sequence record buffer");
+ goto LOOP_END;
+ }
+ srec.is_bad[0] = bad;
+ srec.orientation[0] = readOrientation;
+ srec.cskey[0] = cskey;
+ COPY_READ(srec.seq + srec.readStart[0], seqDNA, readlen, false);
+ COPY_QUAL(srec.qual + srec.readStart[0], qual, readlen, false);
+
+ srec.keyId = keyId;
+
+ srec.spotGroup = (char *)spotGroup;
+ srec.spotGroupLen = strlen(spotGroup);
+
+ srec.spotName = (char *)name;
+ srec.spotNameLen = namelen;
+
+ rc = SequenceWriteRecord(seq, &srec, isColorSpace, false, G->platform,
+ G->keepMismatchQual, G->no_real_output, G->hasTI, G->QualQuantizer);
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "SequenceWriteRecord failed");
+ goto LOOP_END;
+ }
+ CTX_VALUE_SET_S_ID(*value, ++ctx->spotId);
+ value->written = 1;
+ *had_sequences = true;
+ }
+ }
+ else
+ abort();
+
+LOOP_END:
+ freeReadResult(&rr);
+ }
+
+ KThreadCancel(threadCtx.th);
+ KThreadWait ( threadCtx.th, NULL );
+ KThreadRelease(threadCtx.th);
+ KQueueRelease(threadCtx.que);
+
+ if (filterFlagConflictRecords > 0) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "$(cnt1) out of $(cnt2) records contained warning : both 'duplicate' and 'lowQuality' flag bits set, only 'duplicate' will be saved", "cnt1=%lu,cnt2=%lu", filterFlagConflictRecords,recordsProcessed));
+ }
+ if (rc == 0 && recordsProcessed == 0) {
+ (void)LOGMSG(klogWarn, (G->limit2config || G->refFilter != NULL) ?
+ "All records from the file were filtered out" :
+ "The file contained no records that were processed.");
+ rc = RC(rcAlign, rcFile, rcReading, rcData, rcEmpty);
+ }
+ if (rc == 0 && threadCtx.reccount > 0) {
+ uint64_t const reccount = threadCtx.reccount - 1;
+ double const percentage = ((double)G->errCount) / reccount;
+ double const allowed = G->maxErrPct/ 100.0;
+ if (percentage > allowed) {
+ rc = RC(rcExe, rcTable, rcClosing, rcData, rcInvalid);
+ (void)PLOGERR(klogErr,
+ (klogErr, rc,
+ "Too many bad records: "
+ "records: $(records), bad records: $(bad_records), "
+ "bad records percentage: $(percentage), "
+ "allowed percentage: $(allowed)",
+ "records=%lu,bad_records=%lu,percentage=%.2f,allowed=%.2f",
+ reccount, G->errCount, percentage, allowed));
+ }
+ }
+ (void)PLOGMSG(klogDebug, (klogDebug, "Fragments added to spot assembler: $(added). Fragments evicted to disk: $(evicted). Spots completed: $(completed)",
+ "added=%lu,evicted=%lu,completed=%lu", fragmentsAdded, fragmentsEvicted, spotsCompleted));
+
+ KDataBufferWhack(&buf);
+ KDataBufferWhack(&fragBuf);
+ KDataBufferWhack(&srec.storage);
+ return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * CommonWriter
+ */
+
+rc_t CommonWriterInit(CommonWriter* self, struct VDBManager *mgr, struct VDatabase *db, const CommonWriterSettings* G)
+{
+ rc_t rc = 0;
+ assert(self);
+ assert(mgr);
+ assert(db);
+
+ memset(self, 0, sizeof(*self));
+ if (G)
+ self->settings = *G;
+
+ {
+ self->seq = malloc(sizeof(*self->seq));
+ if (self->seq == 0)
+ {
+ return RC(rcAlign, rcArc, rcAllocating, rcMemory, rcExhausted);
+ }
+ SequenceWriterInit(self->seq, db);
+
+ rc = SetupContext(&self->settings, &self->ctx);
+ }
+ if (self->settings.tmpfs == NULL)
+ self->settings.tmpfs = "/tmp";
+
+ self->commit = true;
+
+ return rc;
+}
+
+rc_t CommonWriterArchive(CommonWriter *const self,
+ const struct ReaderFile *const reader)
+{
+ rc_t rc;
+ bool has_sequences = false;
+
+ assert(self);
+ rc = ArchiveFile(reader,
+ &self->settings,
+ &self->ctx,
+ self->seq,
+ &has_sequences);
+ if (rc)
+ self->commit = false;
+ else
+ self->had_sequences |= has_sequences;
+
+ self->err_count += self->settings.errCount;
+ return rc;
+}
+
+rc_t CommonWriterComplete(CommonWriter* self, bool quitting, uint64_t maxDistance)
+{
+ rc_t rc=0;
+ /*** No longer need memory for key2id ***/
+ size_t i;
+ for (i = 0; i != self->ctx.key2id_count; ++i) {
+ KBTreeDropBacking(self->ctx.key2id[i]);
+ KBTreeRelease(self->ctx.key2id[i]);
+ self->ctx.key2id[i] = NULL;
+ }
+ free(self->ctx.key2id_names);
+ self->ctx.key2id_names = NULL;
+ /*******************/
+
+ if (self->had_sequences) {
+ if (!quitting) {
+ (void)LOGMSG(klogInfo, "Writing unpaired sequences");
+ rc = WriteSoloFragments(&self->settings, &self->ctx, self->seq);
+ ContextReleaseMemBank(&self->ctx);
+ if (rc == 0) {
+ rc = SequenceDoneWriting(self->seq);
+ }
+ }
+ else
+ ContextReleaseMemBank(&self->ctx);
+ }
+
+ return rc;
+}
+
+rc_t CommonWriterWhack(CommonWriter* self)
+{
+ rc_t rc = 0;
+ assert(self);
+
+ ContextRelease(&self->ctx);
+
+ if (self->seq)
+ {
+ SequenceWhack(self->seq, self->commit);
+ free(self->seq);
+ }
+
+ return rc;
+}
+
diff --git a/tools/fastq-loader/common-writer.h b/tools/fastq-loader/common-writer.h
new file mode 100644
index 0000000..74a2220
--- /dev/null
+++ b/tools/fastq-loader/common-writer.h
@@ -0,0 +1,164 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+
+struct VDBManager;
+struct VDatabase;
+struct KMemBank;
+struct KBTree;
+struct KLoadProgressbar;
+struct ReaderFile;
+struct CommonWriter;
+struct SequenceWriter;
+struct AlignmentWriter;
+struct Reference;
+
+/*--------------------------------------------------------------------------
+ * CommonWriterSettings
+ */
+enum LoaderModes {
+ mode_Archive,
+ mode_Analysis
+};
+
+typedef struct CommonWriterSettings
+{
+ uint64_t numfiles;
+ char const *inpath;
+ char const *outpath;
+ char const *tmpfs;
+
+ struct KFile *noMatchLog;
+
+ char const *schemaPath;
+ char const *schemaIncludePath;
+
+ char const *refXRefPath;
+
+ char const *QualQuantizer;
+
+ char const *refFilter;
+
+ char const* const* refFiles; /* NULL-terminated array pointing to argv */
+
+ char const *headerText;
+
+ uint64_t maxAlignCount;
+ size_t cache_size;
+
+ uint64_t errCount;
+ uint64_t maxErrCount;
+ uint64_t maxErrPct;
+ uint64_t maxWarnCount_NoMatch;
+ uint64_t maxWarnCount_DupConflict;
+ uint64_t pid;
+ uint64_t minMatchCount; /* minimum number of matches to count as an alignment */
+ int minMapQual;
+ enum LoaderModes mode;
+ uint32_t maxSeqLen;
+ bool omit_aligned_reads;
+ bool omit_reference_reads;
+ bool no_real_output;
+ bool expectUnsorted;
+ bool noVerifyReferences;
+ bool onlyVerifyReferences;
+ bool useQUAL;
+ bool limit2config;
+ bool editAlignedQual;
+ bool keepMismatchQual;
+ bool acceptBadDups; /* accept spots with inconsistent PCR duplicate flags */
+ bool acceptNoMatch; /* accept without any matching bases */
+ uint8_t alignedQualValue;
+ bool allUnaligned; /* treat all records as unaligned */
+ bool noColorSpace;
+ bool noSecondary;
+ bool hasTI;
+ bool acceptHardClip;
+ INSDC_SRA_platform_id platform;
+ bool parseSpotName;
+ bool compressQuality;
+ uint64_t maxMateDistance;
+} CommonWriterSettings;
+
+/*--------------------------------------------------------------------------
+ * SpotAssembler
+ */
+
+#define FRAGMENT_HOT_COUNT (1024u * 1024u)
+#define NUM_ID_SPACES (256u)
+
+typedef struct SpotAssembler {
+ const struct KLoadProgressbar *progress[4];
+ struct KBTree *key2id[NUM_ID_SPACES];
+ char *key2id_names;
+ struct MMArray *id2value;
+ int64_t spotId;
+ int64_t nextFragment;
+
+ struct {
+ int64_t id;
+ void *data;
+ } *fragment; /* [FRAGMENT_HOT_COUNT] */
+
+ uint32_t idCount[NUM_ID_SPACES];
+ uint32_t key2id_hash[NUM_ID_SPACES];
+
+ size_t key2id_max;
+ size_t key2id_name_max;
+ size_t key2id_name_alloc;
+ size_t key2id_count;
+
+ size_t key2id_name[NUM_ID_SPACES];
+ /* this array is kept in name order */
+ /* this maps the names to key2id and idCount */
+ size_t key2id_oid[NUM_ID_SPACES];
+
+ int fragmentFd;
+ unsigned pass;
+ bool isColorSpace;
+} SpotAssembler;
+
+/*--------------------------------------------------------------------------
+ * CommonWriter
+ */
+typedef struct CommonWriter {
+ CommonWriterSettings settings;
+ SpotAssembler ctx;
+ struct SequenceWriter* seq;
+ bool had_sequences;
+ unsigned err_count;
+ bool commit;
+} CommonWriter;
+
+rc_t CommonWriterInit(CommonWriter* self, struct VDBManager *mgr, struct VDatabase *db, const CommonWriterSettings* settings);
+
+rc_t CommonWriterArchive(CommonWriter* self, const struct ReaderFile *);
+rc_t CommonWriterComplete(CommonWriter* self, bool quitting, uint64_t maxDistance);
+
+rc_t CommonWriterWhack(CommonWriter* self);
diff --git a/tools/fastq-loader/fastq-grammar.c b/tools/fastq-loader/fastq-grammar.c
new file mode 100644
index 0000000..1c9313f
--- /dev/null
+++ b/tools/fastq-loader/fastq-grammar.c
@@ -0,0 +1,2310 @@
+/* A Bison parser, made by GNU Bison 2.5. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.5"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names. */
+#define yyparse FASTQ_parse
+#define yylex FASTQ_lex
+#define yyerror FASTQ_error
+#define yylval FASTQ_lval
+#define yychar FASTQ_char
+#define yydebug FASTQ_debug
+#define yynerrs FASTQ_nerrs
+
+
+/* Copy the first part of user declarations. */
+
+
+ #include <sysalloc.h>
+ #include <ctype.h>
+ #include <stdlib.h>
+ #include <string.h>
+
+ #include "fastq-parse.h"
+
+ #define YYSTYPE FASTQToken
+ #define YYLEX_PARAM pb->scanner
+ #define YYDEBUG 1
+
+ #include "fastq-tokens.h"
+
+ static void AddQuality(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetReadNumber(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetSpotGroup(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetRead(FASTQParseBlock* pb, const FASTQToken* token);
+
+ static void StartSpotName(FASTQParseBlock* pb, size_t offset);
+ static void GrowSpotName(FASTQParseBlock* pb, const FASTQToken* token);
+ static void StopSpotName(FASTQParseBlock* pb);
+ static void RestartSpotName(FASTQParseBlock* pb);
+ static void SaveSpotName(FASTQParseBlock* pb);
+ static void RevertSpotName(FASTQParseBlock* pb);
+
+ #define UNLEX do { if (yychar != YYEMPTY && yychar != YYEOF) FASTQ_unlex(pb, & yylval); } while (0)
+
+ #define IS_PACBIO(pb) ((pb)->defaultReadNumber == -1)
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 1
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ fqENDOFTEXT = 0,
+ fqRUNDOTSPOT = 258,
+ fqSPOTGROUP = 259,
+ fqNUMBER = 260,
+ fqALPHANUM = 261,
+ fqWS = 262,
+ fqENDLINE = 263,
+ fqBASESEQ = 264,
+ fqCOLORSEQ = 265,
+ fqTOKEN = 266,
+ fqASCQUAL = 267,
+ fqCOORDS = 268,
+ fqUNRECOGNIZED = 269
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations. */
+
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+ int yyi;
+#endif
+{
+ return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 19
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 150
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 24
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 49
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 101
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 146
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 269
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 23, 2, 21, 20, 22, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 15, 2,
+ 2, 18, 17, 2, 16, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 19, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint16 yyprhs[] =
+{
+ 0, 0, 3, 6, 8, 9, 10, 11, 21, 25,
+ 27, 29, 32, 34, 38, 43, 47, 50, 51, 55,
+ 56, 61, 62, 66, 68, 70, 71, 75, 76, 81,
+ 82, 86, 87, 92, 94, 96, 98, 101, 111, 116,
+ 120, 121, 126, 127, 132, 135, 137, 140, 144, 146,
+ 148, 151, 152, 156, 159, 163, 167, 170, 173, 174,
+ 180, 181, 187, 188, 194, 195, 202, 206, 208, 210,
+ 213, 216, 219, 222, 225, 228, 229, 233, 234, 239,
+ 241, 242, 243, 244, 245, 246, 258, 259, 263, 264,
+ 266, 268, 269, 273, 277, 279, 283, 288, 290, 293,
+ 296, 300
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int8 yyrhs[] =
+{
+ 25, 0, -1, 31, 69, -1, 31, -1, -1, -1,
+ -1, 55, 13, 26, 15, 27, 43, 15, 28, 71,
+ -1, 6, 1, 30, -1, 29, -1, 0, -1, 30,
+ 29, -1, 8, -1, 32, 30, 36, -1, 32, 30,
+ 1, 30, -1, 1, 30, 36, -1, 1, 30, -1,
+ -1, 16, 33, 44, -1, -1, 16, 7, 34, 44,
+ -1, -1, 17, 35, 44, -1, 37, -1, 40, -1,
+ -1, 9, 38, 30, -1, -1, 37, 9, 39, 30,
+ -1, -1, 10, 41, 30, -1, -1, 40, 10, 42,
+ 30, -1, 9, -1, 10, -1, 47, -1, 47, 56,
+ -1, 47, 56, 7, 5, 15, 6, 15, 5, 65,
+ -1, 47, 56, 7, 6, -1, 47, 56, 7, -1,
+ -1, 47, 7, 45, 59, -1, -1, 47, 7, 46,
+ 6, -1, 68, 7, -1, 68, -1, 55, 56, -1,
+ 55, 56, 7, -1, 55, -1, 50, -1, 50, 4,
+ -1, -1, 55, 48, 4, -1, 49, 50, -1, 49,
+ 50, 4, -1, 49, 6, 18, -1, 55, 7, -1,
+ 55, 13, -1, -1, 55, 13, 19, 51, 59, -1,
+ -1, 55, 13, 15, 52, 55, -1, -1, 55, 13,
+ 20, 53, 55, -1, -1, 55, 13, 15, 20, 54,
+ 55, -1, 55, 13, 15, -1, 6, -1, 5, -1,
+ 55, 19, -1, 55, 21, -1, 55, 20, -1, 55,
+ 15, -1, 55, 6, -1, 55, 5, -1, -1, 22,
+ 57, 5, -1, -1, 56, 22, 58, 55, -1, 5,
+ -1, -1, -1, -1, -1, -1, 5, 60, 15, 61,
+ 6, 62, 15, 63, 5, 64, 65, -1, -1, 15,
+ 66, 67, -1, -1, 9, -1, 5, -1, -1, 3,
+ 20, 5, -1, 3, 22, 5, -1, 3, -1, 70,
+ 30, 71, -1, 70, 30, 1, 30, -1, 23, -1,
+ 70, 11, -1, 72, 30, -1, 71, 72, 30, -1,
+ 12, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
+ 0, 82, 82, 84, 89, 90, 92, 88, 95, 97,
+ 101, 102, 106, 110, 111, 112, 113, 117, 117, 118,
+ 118, 119, 119, 123, 124, 128, 128, 130, 130, 135,
+ 135, 137, 137, 142, 143, 148, 149, 151, 153, 154,
+ 156, 156, 157, 157, 158, 159, 160, 161, 162, 166,
+ 167, 168, 168, 169, 170, 171, 175, 185, 187, 186,
+ 193, 193, 194, 194, 195, 195, 196, 200, 201, 202,
+ 203, 204, 205, 206, 207, 212, 211, 224, 223, 235,
+ 236, 237, 238, 239, 240, 236, 245, 245, 246, 250,
+ 251, 252, 256, 257, 258, 264, 265, 269, 270, 274,
+ 275, 278
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "fqENDOFTEXT", "error", "$undefined", "fqRUNDOTSPOT", "fqSPOTGROUP",
+ "fqNUMBER", "fqALPHANUM", "fqWS", "fqENDLINE", "fqBASESEQ", "fqCOLORSEQ",
+ "fqTOKEN", "fqASCQUAL", "fqCOORDS", "fqUNRECOGNIZED", "':'", "'@'",
+ "'>'", "'='", "'_'", "'.'", "'-'", "'/'", "'+'", "$accept", "sequence",
+ "$@1", "$@2", "$@3", "endfile", "endline", "readLines", "header", "$@4",
+ "$@5", "$@6", "read", "baseRead", "$@7", "$@8", "csRead", "$@9", "$@10",
+ "inlineRead", "tagLine", "$@11", "$@12", "nameSpotGroup", "$@13",
+ "nameWS", "nameWithCoords", "$@14", "$@15", "$@16", "$@17", "name",
+ "readNumber", "$@18", "$@19", "casava1_8", "$@20", "$@21", "$@22",
+ "$@23", "$@24", "indexSequence", "$@25", "index", "runSpotRead",
+ "qualityLines", "qualityHeader", "quality", "qualityLine", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 58, 64, 62, 61, 95,
+ 46, 45, 47, 43
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 24, 25, 25, 26, 27, 28, 25, 25, 25,
+ 29, 29, 30, 31, 31, 31, 31, 33, 32, 34,
+ 32, 35, 32, 36, 36, 38, 37, 39, 37, 41,
+ 40, 42, 40, 43, 43, 44, 44, 44, 44, 44,
+ 45, 44, 46, 44, 44, 44, 44, 44, 44, 47,
+ 47, 48, 47, 47, 47, 47, 49, 50, 51, 50,
+ 52, 50, 53, 50, 54, 50, 50, 55, 55, 55,
+ 55, 55, 55, 55, 55, 57, 56, 58, 56, 59,
+ 60, 61, 62, 63, 64, 59, 66, 65, 65, 67,
+ 67, 67, 68, 68, 68, 69, 69, 70, 70, 71,
+ 71, 72
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 2, 1, 0, 0, 0, 9, 3, 1,
+ 1, 2, 1, 3, 4, 3, 2, 0, 3, 0,
+ 4, 0, 3, 1, 1, 0, 3, 0, 4, 0,
+ 3, 0, 4, 1, 1, 1, 2, 9, 4, 3,
+ 0, 4, 0, 4, 2, 1, 2, 3, 1, 1,
+ 2, 0, 3, 2, 3, 3, 2, 2, 0, 5,
+ 0, 5, 0, 5, 0, 6, 3, 1, 1, 2,
+ 2, 2, 2, 2, 2, 0, 3, 0, 4, 1,
+ 0, 0, 0, 0, 0, 11, 0, 3, 0, 1,
+ 1, 0, 3, 3, 1, 3, 4, 1, 2, 2,
+ 3, 1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint8 yydefact[] =
+{
+ 0, 10, 0, 68, 0, 12, 17, 21, 0, 9,
+ 0, 3, 0, 0, 16, 0, 19, 0, 0, 1,
+ 11, 97, 2, 0, 0, 74, 73, 4, 72, 69,
+ 71, 70, 25, 29, 15, 23, 24, 8, 0, 94,
+ 67, 18, 35, 0, 49, 48, 45, 22, 98, 0,
+ 0, 13, 0, 0, 0, 27, 31, 20, 0, 0,
+ 40, 75, 36, 67, 53, 0, 50, 56, 57, 0,
+ 46, 44, 0, 101, 95, 0, 14, 5, 26, 30,
+ 0, 0, 92, 93, 0, 0, 0, 39, 77, 55,
+ 54, 66, 58, 62, 52, 47, 96, 0, 99, 0,
+ 28, 32, 79, 41, 43, 76, 0, 38, 0, 64,
+ 0, 0, 0, 100, 33, 34, 0, 0, 0, 78,
+ 0, 61, 59, 63, 6, 81, 0, 65, 0, 0,
+ 0, 7, 82, 88, 0, 86, 37, 83, 91, 0,
+ 90, 89, 87, 84, 88, 85
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ -1, 8, 52, 99, 128, 9, 10, 11, 12, 17,
+ 38, 18, 34, 35, 53, 80, 36, 54, 81, 116,
+ 41, 84, 85, 42, 69, 43, 44, 111, 110, 112,
+ 120, 45, 62, 86, 108, 103, 117, 129, 134, 139,
+ 144, 136, 138, 142, 46, 22, 23, 74, 75
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -73
+static const yytype_int8 yypact[] =
+{
+ 50, -73, 8, -73, 4, -73, 1, -73, 21, -73,
+ 7, 11, 8, 57, 59, 8, -73, 82, 82, -73,
+ -73, -73, -73, 28, 32, -73, -73, -73, -73, -73,
+ -73, -73, -73, -73, -73, 77, 44, -73, 82, 53,
+ -73, -73, 5, 76, 88, 25, 93, -73, -73, 36,
+ 8, -73, 90, 8, 8, -73, -73, -73, 101, 102,
+ 103, -73, 6, 95, 110, 78, -73, -73, 45, 114,
+ 13, -73, 8, -73, 107, 8, -73, -73, -73, -73,
+ 8, 8, -73, -73, 116, 117, 119, 84, -73, -73,
+ -73, -2, -73, -73, -73, -73, -73, 8, -73, 85,
+ -73, -73, 111, -73, -73, -73, 112, -73, 98, -73,
+ 98, 116, 98, -73, -73, -73, 113, 115, 123, 96,
+ 98, 96, -73, 96, -73, -73, 118, 96, 107, 125,
+ 120, 107, -73, 121, 122, -73, -73, -73, 52, 127,
+ -73, -73, -73, -73, 121, -73
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -73, -73, -73, -73, -73, 124, -1, -73, -73, -73,
+ -73, -73, 126, -73, -73, -73, -73, -73, -73, -73,
+ -12, -73, -73, -73, -73, -73, 79, -73, -73, -73,
+ -73, 0, 94, -73, -73, 24, -73, -73, -73, -73,
+ -73, -6, -73, -73, -73, -73, -73, 12, -72
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -81
+static const yytype_int16 yytable[] =
+{
+ 13, 14, 97, -60, -60, 15, 47, 1, 16, -67,
+ -67, 24, 60, 87, 37, 5, 5, -67, 109, -67,
+ 95, 19, 49, -67, -67, -67, 57, 61, 88, -51,
+ 25, 26, 67, 50, 21, 88, 5, 72, 68, 48,
+ 28, 32, 33, 65, 29, 30, 31, 61, 73, 76,
+ 1, 2, 78, 79, 56, 3, 4, 140, 5, 97,
+ 91, 141, 25, 26, 92, 93, 6, 7, 32, 33,
+ 27, 96, 28, 58, 98, 59, 29, 30, 31, 100,
+ 101, 3, 63, 25, 26, 39, 55, 3, 40, 106,
+ 107, 68, 66, 28, 114, 115, 113, 29, 30, 31,
+ 71, 25, 26, 3, 40, 77, 82, 83, 119, -42,
+ 121, 28, 123, 89, 90, 29, 30, 31, 94, 73,
+ 127, 102, 64, 104, 105, 133, -80, 118, 124, 126,
+ 125, 132, 143, 130, 20, 122, 135, 137, 145, 70,
+ 131, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 51
+};
+
+#define yypact_value_is_default(yystate) \
+ ((yystate) == (-73))
+
+#define yytable_value_is_error(yytable_value) \
+ YYID (0)
+
+static const yytype_int16 yycheck[] =
+{
+ 0, 2, 74, 5, 6, 1, 18, 0, 7, 5,
+ 6, 12, 7, 7, 15, 8, 8, 13, 20, 15,
+ 7, 0, 23, 19, 20, 21, 38, 22, 22, 4,
+ 5, 6, 7, 1, 23, 22, 8, 1, 13, 11,
+ 15, 9, 10, 43, 19, 20, 21, 22, 12, 50,
+ 0, 1, 53, 54, 10, 5, 6, 5, 8, 131,
+ 15, 9, 5, 6, 19, 20, 16, 17, 9, 10,
+ 13, 72, 15, 20, 75, 22, 19, 20, 21, 80,
+ 81, 5, 6, 5, 6, 3, 9, 5, 6, 5,
+ 6, 13, 4, 15, 9, 10, 97, 19, 20, 21,
+ 7, 5, 6, 5, 6, 15, 5, 5, 108, 6,
+ 110, 15, 112, 18, 4, 19, 20, 21, 4, 12,
+ 120, 5, 43, 6, 5, 5, 15, 15, 15, 6,
+ 15, 6, 5, 15, 10, 111, 15, 15, 144, 45,
+ 128, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 24
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 0, 1, 5, 6, 8, 16, 17, 25, 29,
+ 30, 31, 32, 55, 30, 1, 7, 33, 35, 0,
+ 29, 23, 69, 70, 30, 5, 6, 13, 15, 19,
+ 20, 21, 9, 10, 36, 37, 40, 30, 34, 3,
+ 6, 44, 47, 49, 50, 55, 68, 44, 11, 30,
+ 1, 36, 26, 38, 41, 9, 10, 44, 20, 22,
+ 7, 22, 56, 6, 50, 55, 4, 7, 13, 48,
+ 56, 7, 1, 12, 71, 72, 30, 15, 30, 30,
+ 39, 42, 5, 5, 45, 46, 57, 7, 22, 18,
+ 4, 15, 19, 20, 4, 7, 30, 72, 30, 27,
+ 30, 30, 5, 59, 6, 5, 5, 6, 58, 20,
+ 52, 51, 53, 30, 9, 10, 43, 60, 15, 55,
+ 54, 55, 59, 55, 15, 15, 6, 55, 28, 61,
+ 15, 71, 6, 5, 62, 15, 65, 15, 66, 63,
+ 5, 9, 67, 5, 64, 65
+};
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. However,
+ YYFAIL appears to be in use. Nevertheless, it is formally deprecated
+ in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+ discussed. */
+
+#define YYFAIL goto yyerrlab
+#if defined YYFAIL
+ /* This is here to suppress warnings from the GCC cpp's
+ -Wunused-macros. Normally we don't worry about that warning, but
+ some users do, and we want to make it easy for users to remove
+ YYFAIL uses, which will produce warnings from Bison 2.5. */
+#endif
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (pb, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
+
+
+/* This macro is provided for backward compatibility. */
+
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, pb)
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value, pb); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FASTQParseBlock* pb)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ FASTQParseBlock* pb;
+#endif
+{
+ if (!yyvaluep)
+ return;
+ YYUSE (pb);
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FASTQParseBlock* pb)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, pb)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ FASTQParseBlock* pb;
+#endif
+{
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+ yytype_int16 *yybottom;
+ yytype_int16 *yytop;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, FASTQParseBlock* pb)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, pb)
+ YYSTYPE *yyvsp;
+ int yyrule;
+ FASTQParseBlock* pb;
+#endif
+{
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ , pb);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule, pb); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+ about the unexpected token YYTOKEN for the state stack whose top is
+ YYSSP.
+
+ Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
+ not large enough to hold the message. In that case, also set
+ *YYMSG_ALLOC to the required number of bytes. Return 2 if the
+ required number of bytes is too large to store. */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+ yytype_int16 *yyssp, int yytoken)
+{
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ /* Internationalized format string. */
+ const char *yyformat = 0;
+ /* Arguments of yyformat. */
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ /* Number of reported tokens (one for the "unexpected", one per
+ "expected"). */
+ int yycount = 0;
+
+ /* There are many possibilities here to consider:
+ - Assume YYFAIL is not used. It's too flawed to consider. See
+ <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+ for details. YYERROR is fine as it does not invoke this
+ function.
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+ tokens because there are none.
+ - The only way there can be no lookahead present (in yychar) is if
+ this state is a consistent state with a default action. Thus,
+ detecting the absence of a lookahead is sufficient to determine
+ that there is no unexpected or expected token to report. In that
+ case, just report a simple "syntax error".
+ - Don't assume there isn't a lookahead just because this state is a
+ consistent state with a default action. There might have been a
+ previous inconsistent state, consistent state with a non-default
+ action, or user semantic action that manipulated yychar.
+ - Of course, the expected token list depends on states to have
+ correct lookahead information, and it depends on the parser not
+ to perform extra reductions after fetching a lookahead from the
+ scanner and before detecting a syntax error. Thus, state merging
+ (from LALR or IELR) and default reductions corrupt the expected
+ token list. However, the list is correct for canonical LR with
+ one exception: it will still contain any token that will not be
+ accepted due to an error action in a later state.
+ */
+ if (yytoken != YYEMPTY)
+ {
+ int yyn = yypact[*yyssp];
+ yyarg[yycount++] = yytname[yytoken];
+ if (!yypact_value_is_default (yyn))
+ {
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. In other words, skip the first -YYN actions for
+ this state because they are default actions. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yyx;
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+ && !yytable_value_is_error (yytable[yyx + yyn]))
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ if (! (yysize <= yysize1
+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
+ }
+ }
+
+ switch (yycount)
+ {
+# define YYCASE_(N, S) \
+ case N: \
+ yyformat = S; \
+ break
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+ }
+
+ yysize1 = yysize + yystrlen (yyformat);
+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+
+ if (*yymsg_alloc < yysize)
+ {
+ *yymsg_alloc = 2 * yysize;
+ if (! (yysize <= *yymsg_alloc
+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+ return 1;
+ }
+
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ {
+ char *yyp = *yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyformat) != '\0')
+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyformat += 2;
+ }
+ else
+ {
+ yyp++;
+ yyformat++;
+ }
+ }
+ return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, FASTQParseBlock* pb)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, pb)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+ FASTQParseBlock* pb;
+#endif
+{
+ YYUSE (yyvaluep);
+ YYUSE (pb);
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (FASTQParseBlock* pb);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (FASTQParseBlock* pb)
+#else
+int
+yyparse (pb)
+ FASTQParseBlock* pb;
+#endif
+#endif
+{
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+ /* Number of syntax errors so far. */
+ int yynerrs;
+
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+ `yyss': related to states.
+ `yyvs': related to semantic values.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
+
+ YYSIZE_T yystacksize;
+
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ yytoken = 0;
+ yyss = yyssa;
+ yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+
+ { UNLEX; return 1; }
+ break;
+
+ case 3:
+
+ { UNLEX; return 1; }
+ break;
+
+ case 4:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); StopSpotName(pb); }
+ break;
+
+ case 5:
+
+ { FASTQScan_inline_sequence(pb); }
+ break;
+
+ case 6:
+
+ { FASTQScan_inline_quality(pb); }
+ break;
+
+ case 7:
+
+ { UNLEX; return 1; }
+ break;
+
+ case 8:
+
+ { UNLEX; return 1; }
+ break;
+
+ case 9:
+
+ { return 0; }
+ break;
+
+ case 17:
+
+ { StartSpotName(pb, 1); }
+ break;
+
+ case 19:
+
+ { StartSpotName(pb, 1 + (yyvsp[(2) - (2)]).tokenLength); }
+ break;
+
+ case 21:
+
+ { StartSpotName(pb, 1); }
+ break;
+
+ case 23:
+
+ { pb->record->seq.is_colorspace = false; }
+ break;
+
+ case 24:
+
+ { pb->record->seq.is_colorspace = true; }
+ break;
+
+ case 25:
+
+ { SetRead(pb, & (yyvsp[(1) - (1)])); }
+ break;
+
+ case 27:
+
+ { SetRead(pb, & (yyvsp[(2) - (2)])); }
+ break;
+
+ case 29:
+
+ { SetRead(pb, & (yyvsp[(1) - (1)])); }
+ break;
+
+ case 31:
+
+ { SetRead(pb, & (yyvsp[(2) - (2)])); }
+ break;
+
+ case 33:
+
+ { SetRead(pb, & (yyvsp[(1) - (1)])); pb->record->seq.is_colorspace = false; }
+ break;
+
+ case 34:
+
+ { SetRead(pb, & (yyvsp[(1) - (1)])); pb->record->seq.is_colorspace = true; }
+ break;
+
+ case 38:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 39:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 40:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (2)])); StopSpotName(pb); }
+ break;
+
+ case 41:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 42:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (2)])); StopSpotName(pb); }
+ break;
+
+ case 43:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 44:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 45:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 47:
+
+ { FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 50:
+
+ { SetSpotGroup(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 51:
+
+ { StopSpotName(pb); }
+ break;
+
+ case 52:
+
+ { SetSpotGroup(pb, &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 54:
+
+ { SetSpotGroup(pb, &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 55:
+
+ { RevertSpotName(pb); FASTQScan_skip_to_eol(pb); }
+ break;
+
+ case 56:
+
+ { /* 'name' without coordinates attached will be ignored if followed by a name with coordinates (see the previous production).
+ however, if not followed, this will be the spot name, so we need to save the 'name's coordinates in case
+ we need to revert to them later (see call to RevertSpotName() above) */
+ SaveSpotName(pb);
+ GrowSpotName(pb, &(yyvsp[(2) - (2)])); /* need to account for white space but it is not part of the spot name */
+ RestartSpotName(pb); /* clean up for the potential nameWithCoords to start here */
+ }
+ break;
+
+ case 57:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); StopSpotName(pb); }
+ break;
+
+ case 58:
+
+ { /* another variation by Illumina, this time "_" is used as " /" */
+ GrowSpotName(pb, &(yyvsp[(2) - (3)]));
+ StopSpotName(pb);
+ GrowSpotName(pb, &(yyvsp[(3) - (3)]));
+ }
+ break;
+
+ case 60:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (3)])); GrowSpotName(pb, &(yyvsp[(3) - (3)]));}
+ break;
+
+ case 62:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (3)])); GrowSpotName(pb, &(yyvsp[(3) - (3)]));}
+ break;
+
+ case 64:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (4)])); GrowSpotName(pb, &(yyvsp[(3) - (4)])); GrowSpotName(pb, &(yyvsp[(4) - (4)]));}
+ break;
+
+ case 66:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (3)])); GrowSpotName(pb, &(yyvsp[(3) - (3)])); StopSpotName(pb); }
+ break;
+
+ case 67:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (1)])); }
+ break;
+
+ case 68:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (1)])); }
+ break;
+
+ case 69:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 70:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 71:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 72:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 73:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 74:
+
+ { GrowSpotName(pb, &(yyvsp[(2) - (2)])); }
+ break;
+
+ case 75:
+
+ { /* in PACBIO fastq, the first '/' and the following digits are treated as a continuation of the spot name, not a read number */
+ if (IS_PACBIO(pb)) pb->spotNameDone = false;
+ GrowSpotName(pb, &(yyvsp[(1) - (1)]));
+ }
+ break;
+
+ case 76:
+
+ {
+ if (!IS_PACBIO(pb)) SetReadNumber(pb, &(yyvsp[(3) - (3)]));
+ GrowSpotName(pb, &(yyvsp[(3) - (3)]));
+ StopSpotName(pb);
+ }
+ break;
+
+ case 77:
+
+ {
+ if (IS_PACBIO(pb)) pb->spotNameDone = false;
+ GrowSpotName(pb, &(yyvsp[(2) - (2)]));
+ }
+ break;
+
+ case 78:
+
+ {
+ if (IS_PACBIO(pb)) StopSpotName(pb);
+ }
+ break;
+
+ case 79:
+
+ { SetReadNumber(pb, &(yyvsp[(1) - (1)])); GrowSpotName(pb, &(yyvsp[(1) - (1)])); StopSpotName(pb); }
+ break;
+
+ case 80:
+
+ { SetReadNumber(pb, &(yyvsp[(1) - (1)])); GrowSpotName(pb, &(yyvsp[(1) - (1)])); StopSpotName(pb); }
+ break;
+
+ case 81:
+
+ { GrowSpotName(pb, &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 82:
+
+ { GrowSpotName(pb, &(yyvsp[(5) - (5)])); if ((yyvsp[(5) - (5)]).tokenLength == 1 && TokenTextPtr(pb, &(yyvsp[(5) - (5)]))[0] == 'Y') pb->record->seq.lowQuality = true; }
+ break;
+
+ case 83:
+
+ { GrowSpotName(pb, &(yyvsp[(7) - (7)])); }
+ break;
+
+ case 84:
+
+ { GrowSpotName(pb, &(yyvsp[(9) - (9)])); }
+ break;
+
+ case 86:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (1)])); FASTQScan_inline_sequence(pb); }
+ break;
+
+ case 89:
+
+ { SetSpotGroup(pb, &(yyvsp[(1) - (1)])); GrowSpotName(pb, &(yyvsp[(1) - (1)])); }
+ break;
+
+ case 90:
+
+ { SetSpotGroup(pb, &(yyvsp[(1) - (1)])); GrowSpotName(pb, &(yyvsp[(1) - (1)])); }
+ break;
+
+ case 92:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (3)])); StopSpotName(pb); SetReadNumber(pb, &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 93:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (3)])); StopSpotName(pb); SetReadNumber(pb, &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 94:
+
+ { GrowSpotName(pb, &(yyvsp[(1) - (1)])); StopSpotName(pb); }
+ break;
+
+ case 101:
+
+ { AddQuality(pb, & (yyvsp[(1) - (1)])); }
+ break;
+
+
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (pb, YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+ yyssp, yytoken)
+ {
+ char const *yymsgp = YY_("syntax error");
+ int yysyntax_error_status;
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ if (yysyntax_error_status == 0)
+ yymsgp = yymsg;
+ else if (yysyntax_error_status == 1)
+ {
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+ if (!yymsg)
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ yysyntax_error_status = 2;
+ }
+ else
+ {
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ yymsgp = yymsg;
+ }
+ }
+ yyerror (pb, yymsgp);
+ if (yysyntax_error_status == 2)
+ goto yyexhaustedlab;
+ }
+# undef YYSYNTAX_ERROR
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, pb);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp, pb);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (pb, YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, pb);
+ }
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp, pb);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+
+
+
+
+
+/* values used in validating quality lines */
+#define MIN_PHRED_33 33
+#define MAX_PHRED_33 126
+#define MIN_PHRED_64 64
+#define MAX_PHRED_64 127
+#define MIN_LOGODDS 59
+#define MAX_LOGODDS 126
+
+void AddQuality(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ uint8_t floor;
+ uint8_t ceiling;
+ const char* format;
+ switch ( pb->qualityFormat )
+ {
+ case FASTQphred33:
+ floor = MIN_PHRED_33;
+ ceiling = MAX_PHRED_33;
+ format = "Phred33";
+ pb -> qualityAsciiOffset = 33;
+ break;
+ case FASTQphred64:
+ floor = MIN_PHRED_64;
+ ceiling = MAX_PHRED_64;
+ format = "Phred64";
+ pb -> qualityAsciiOffset = 64;
+ break;
+ case FASTQlogodds:
+ floor = MIN_LOGODDS;
+ ceiling = MAX_LOGODDS;
+ format = "Logodds";
+ pb -> qualityAsciiOffset = 64;
+ break;
+ default:
+ /* TODO:
+ if qualityAsciiOffset is 0,
+ guess based on the raw values on the first quality line:
+ if all values are above MAX_PHRED_33, qualityAsciiOffset = 64
+ if all values are in MIN_PHRED_33..MAX_PHRED_33, qualityAsciiOffset = 33
+ if any value is below MIN_PHRED_33, abort
+ if the guess is 33 and proven wrong (a raw quality value >MAX_PHRED_33 is encountered and no values below MIN_PHRED_64 ever seen)
+ reopen the file,
+ qualityAsciiOffset = 64
+ try to parse again
+ if a value below MIN_PHRED_64 seen, abort
+ */
+ {
+ char buf[200];
+ sprintf ( buf, "Invalid quality format: %d.", pb->qualityFormat );
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ }
+
+ { /* make sure all qualities fall into the required range */
+ unsigned int i;
+ for (i=0; i < token->tokenLength; ++i)
+ {
+ char ch = TokenTextPtr(pb, token)[i];
+ if (ch < floor || ch > ceiling)
+ {
+ char buf[200];
+ sprintf ( buf, "Invalid quality value ('%c'=%d, position %d): for %s, valid range is from %d to %d.",
+ ch,
+ ch,
+ i,
+ format,
+ floor,
+ ceiling);
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ }
+ }
+
+ if (pb->qualityLength == 0)
+ {
+ pb->qualityOffset = token->tokenStart;
+ pb->qualityLength= token->tokenLength;
+ }
+ else
+ {
+ pb->qualityLength += token->tokenLength;
+ }
+}
+
+void SetReadNumber(FASTQParseBlock* pb, const FASTQToken* token)
+{ /* token is known to be numeric */
+ if (pb->defaultReadNumber != -1)
+ { /* we will only handle 1-digit read numbers for now*/
+ if (token->tokenLength == 1)
+ {
+ switch (TokenTextPtr(pb, token)[0])
+ {
+ case '1':
+ {
+ pb->record->seq.readnumber = 1;
+ break;
+ }
+ case '0':
+ {
+ pb->record->seq.readnumber = pb->defaultReadNumber;
+ break;
+ }
+ default:
+ { /* all secondary read numbers should be the same across an input file */
+ uint8_t readNum = TokenTextPtr(pb, token)[0] - '0';
+ if (pb->secondaryReadNumber == 0) /* this is the first secondary read observed */
+ {
+ pb->secondaryReadNumber = readNum;
+ }
+ else if (pb->secondaryReadNumber != readNum)
+ {
+ char buf[200];
+ sprintf(buf,
+ "Inconsistent secondary read number: previously used %d, now seen %d",
+ pb->secondaryReadNumber, readNum);
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ /* all secondary read numbers are internally represented as 2 */
+ pb->record->seq.readnumber = 2;
+
+ break;
+ }
+ }
+ }
+ else
+ pb->record->seq.readnumber = pb->defaultReadNumber;
+ }
+}
+
+void StartSpotName(FASTQParseBlock* pb, size_t offset)
+{
+ pb->spotNameOffset = offset;
+ pb->spotNameLength = 0;
+}
+
+void SaveSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset_saved = pb->spotNameOffset;
+ pb->spotNameLength_saved = pb->spotNameLength;
+}
+
+void RestartSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset += pb->spotNameLength;
+ pb->spotNameLength = 0;
+}
+
+void RevertSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset = pb->spotNameOffset_saved;
+ pb->spotNameLength = pb->spotNameLength_saved;
+}
+
+void GrowSpotName(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ if (!pb->spotNameDone)
+ {
+ pb->spotNameLength += token->tokenLength;
+ }
+}
+
+void StopSpotName(FASTQParseBlock* pb)
+{ /* there may be more tokens coming, they will not be a part of the spot name */
+ pb->spotNameDone = true;
+}
+
+void SetSpotGroup(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ if ( ! pb->ignoreSpotGroups )
+ {
+ unsigned int nameStart = 0;
+ /* skip possible '#' at the start of spot group name */
+ if ( TokenTextPtr ( pb, token )[0] == '#' )
+ {
+ nameStart = 1;
+ }
+
+ if ( token->tokenLength != 1+nameStart || TokenTextPtr(pb, token)[nameStart] != '0' ) /* ignore spot group 0 */
+ {
+ pb->spotGroupOffset = token->tokenStart + nameStart;
+ pb->spotGroupLength = token->tokenLength - nameStart;
+ }
+ }
+}
+
+void SetRead(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ pb->readOffset = token->tokenStart;
+ pb->readLength = token->tokenLength;
+}
+
diff --git a/tools/fastq-loader/fastq-grammar.y b/tools/fastq-loader/fastq-grammar.y
new file mode 100644
index 0000000..1434c08
--- /dev/null
+++ b/tools/fastq-loader/fastq-grammar.y
@@ -0,0 +1,478 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include <sysalloc.h>
+ #include <ctype.h>
+ #include <stdlib.h>
+ #include <string.h>
+
+ #include "fastq-parse.h"
+
+ #define YYSTYPE FASTQToken
+ #define YYLEX_PARAM pb->scanner
+ #define YYDEBUG 1
+
+ #include "fastq-tokens.h"
+
+ static void AddQuality(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetReadNumber(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetSpotGroup(FASTQParseBlock* pb, const FASTQToken* token);
+ static void SetRead(FASTQParseBlock* pb, const FASTQToken* token);
+
+ static void StartSpotName(FASTQParseBlock* pb, size_t offset);
+ static void GrowSpotName(FASTQParseBlock* pb, const FASTQToken* token);
+ static void StopSpotName(FASTQParseBlock* pb);
+ static void RestartSpotName(FASTQParseBlock* pb);
+ static void SaveSpotName(FASTQParseBlock* pb);
+ static void RevertSpotName(FASTQParseBlock* pb);
+
+ #define UNLEX do { if (yychar != YYEMPTY && yychar != YYEOF) FASTQ_unlex(pb, & yylval); } while (0)
+
+ #define IS_PACBIO(pb) ((pb)->defaultReadNumber == -1)
+%}
+
+%pure-parser
+%parse-param {FASTQParseBlock* pb }
+%lex-param {FASTQParseBlock* pb }
+%error-verbose
+%name-prefix "FASTQ_"
+
+%token fqRUNDOTSPOT
+%token fqSPOTGROUP
+%token fqNUMBER
+%token fqALPHANUM
+%token fqWS
+%token fqENDLINE
+%token fqBASESEQ
+%token fqCOLORSEQ
+%token fqTOKEN
+%token fqASCQUAL
+%token fqCOORDS
+%token fqUNRECOGNIZED
+%token fqENDOFTEXT 0
+
+
+%%
+
+sequence /* have to return the lookahead symbol before returning since it belongs to the next record and cannot be dropped */
+ : readLines qualityLines { UNLEX; return 1; }
+
+ | readLines { UNLEX; return 1; }
+
+/* | qualityLines { UNLEX; return 1; } */
+
+ | name
+ fqCOORDS { GrowSpotName(pb, &$2); StopSpotName(pb); }
+ ':' { FASTQScan_inline_sequence(pb); }
+ inlineRead
+ ':' { FASTQScan_inline_quality(pb); }
+ quality { UNLEX; return 1; }
+
+ | fqALPHANUM error endline { UNLEX; return 1; }
+
+ | endfile { return 0; }
+ ;
+
+endfile
+ : fqENDOFTEXT
+ | endline endfile
+ ;
+
+endline
+ : fqENDLINE
+ ;
+
+readLines
+ : header endline read
+ | header endline error endline
+ | error endline read
+ | error endline
+ ;
+
+header
+ : '@' { StartSpotName(pb, 1); } tagLine
+ | '@' fqWS { StartSpotName(pb, 1 + $2.tokenLength); } tagLine
+ | '>' { StartSpotName(pb, 1); } tagLine
+ ;
+
+read
+ : baseRead { pb->record->seq.is_colorspace = false; }
+ | csRead { pb->record->seq.is_colorspace = true; }
+ ;
+
+baseRead
+ : fqBASESEQ { SetRead(pb, & $1); }
+ endline
+ | baseRead fqBASESEQ { SetRead(pb, & $2); }
+ endline
+ ;
+
+csRead
+ : fqCOLORSEQ { SetRead(pb, & $1); }
+ endline
+ | csRead fqCOLORSEQ { SetRead(pb, & $2); }
+ endline
+ ;
+
+inlineRead
+ : fqBASESEQ { SetRead(pb, & $1); pb->record->seq.is_colorspace = false; }
+ | fqCOLORSEQ { SetRead(pb, & $1); pb->record->seq.is_colorspace = true; }
+ ;
+
+ /*************** tag line rules *****************/
+tagLine
+ : nameSpotGroup
+ | nameSpotGroup readNumber
+
+ | nameSpotGroup readNumber fqWS fqNUMBER ':' fqALPHANUM ':' fqNUMBER indexSequence
+
+ | nameSpotGroup readNumber fqWS fqALPHANUM { FASTQScan_skip_to_eol(pb); }
+ | nameSpotGroup readNumber fqWS { FASTQScan_skip_to_eol(pb); }
+
+ | nameSpotGroup fqWS { GrowSpotName(pb, &$1); StopSpotName(pb); } casava1_8 { FASTQScan_skip_to_eol(pb); }
+ | nameSpotGroup fqWS { GrowSpotName(pb, &$1); StopSpotName(pb); } fqALPHANUM { FASTQScan_skip_to_eol(pb); } /* no recognizable read number */
+ | runSpotRead fqWS { FASTQScan_skip_to_eol(pb); }
+ | runSpotRead { FASTQScan_skip_to_eol(pb); }
+ | name readNumber
+ | name readNumber fqWS { FASTQScan_skip_to_eol(pb); }
+ | name
+ ;
+
+nameSpotGroup
+ : nameWithCoords
+ | nameWithCoords fqSPOTGROUP { SetSpotGroup(pb, &$2); }
+ | name { StopSpotName(pb); } fqSPOTGROUP { SetSpotGroup(pb, &$3); }
+ | nameWS nameWithCoords /* nameWS ignored */
+ | nameWS nameWithCoords fqSPOTGROUP { SetSpotGroup(pb, &$3); } /* nameWS ignored */
+ | nameWS fqALPHANUM '=' { RevertSpotName(pb); FASTQScan_skip_to_eol(pb); }
+ ;
+
+nameWS
+ : name fqWS
+ { /* 'name' without coordinates attached will be ignored if followed by a name with coordinates (see the previous production).
+ however, if not followed, this will be the spot name, so we need to save the 'name's coordinates in case
+ we need to revert to them later (see call to RevertSpotName() above) */
+ SaveSpotName(pb);
+ GrowSpotName(pb, &$2); /* need to account for white space but it is not part of the spot name */
+ RestartSpotName(pb); /* clean up for the potential nameWithCoords to start here */
+ }
+
+nameWithCoords
+ : name fqCOORDS { GrowSpotName(pb, &$2); StopSpotName(pb); }
+ | name fqCOORDS '_'
+ { /* another variation by Illumina, this time "_" is used as " /" */
+ GrowSpotName(pb, &$2);
+ StopSpotName(pb);
+ GrowSpotName(pb, &$3);
+ }
+ casava1_8
+ | name fqCOORDS ':' { GrowSpotName(pb, &$2); GrowSpotName(pb, &$3);} name
+ | name fqCOORDS '.' { GrowSpotName(pb, &$2); GrowSpotName(pb, &$3);} name
+ | name fqCOORDS ':' '.' { GrowSpotName(pb, &$2); GrowSpotName(pb, &$3); GrowSpotName(pb, &$4);} name
+ | name fqCOORDS ':' { GrowSpotName(pb, &$2); GrowSpotName(pb, &$3); StopSpotName(pb); }
+ ;
+
+name
+ : fqALPHANUM { GrowSpotName(pb, &$1); }
+ | fqNUMBER { GrowSpotName(pb, &$1); }
+ | name '_' { GrowSpotName(pb, &$2); }
+ | name '-' { GrowSpotName(pb, &$2); }
+ | name '.' { GrowSpotName(pb, &$2); }
+ | name ':' { GrowSpotName(pb, &$2); }
+ | name fqALPHANUM { GrowSpotName(pb, &$2); }
+ | name fqNUMBER { GrowSpotName(pb, &$2); }
+ ;
+
+readNumber
+ : '/'
+ { /* in PACBIO fastq, the first '/' and the following digits are treated as a continuation of the spot name, not a read number */
+ if (IS_PACBIO(pb)) pb->spotNameDone = false;
+ GrowSpotName(pb, &$1);
+ }
+ fqNUMBER
+ {
+ if (!IS_PACBIO(pb)) SetReadNumber(pb, &$3);
+ GrowSpotName(pb, &$3);
+ StopSpotName(pb);
+ }
+
+ | readNumber '/'
+ {
+ if (IS_PACBIO(pb)) pb->spotNameDone = false;
+ GrowSpotName(pb, &$2);
+ }
+ name
+ {
+ if (IS_PACBIO(pb)) StopSpotName(pb);
+ }
+ ;
+
+casava1_8
+ : fqNUMBER { SetReadNumber(pb, &$1); GrowSpotName(pb, &$1); StopSpotName(pb); }
+ | fqNUMBER { SetReadNumber(pb, &$1); GrowSpotName(pb, &$1); StopSpotName(pb); }
+ ':' { GrowSpotName(pb, &$3); }
+ fqALPHANUM { GrowSpotName(pb, &$5); if ($5.tokenLength == 1 && TokenTextPtr(pb, &$5)[0] == 'Y') pb->record->seq.lowQuality = true; }
+ ':' { GrowSpotName(pb, &$7); }
+ fqNUMBER { GrowSpotName(pb, &$9); }
+ indexSequence
+ ;
+
+indexSequence
+ : ':' { GrowSpotName(pb, &$1); FASTQScan_inline_sequence(pb); } index
+ |
+ ;
+
+index
+ : fqBASESEQ { SetSpotGroup(pb, &$1); GrowSpotName(pb, &$1); }
+ | fqNUMBER { SetSpotGroup(pb, &$1); GrowSpotName(pb, &$1); }
+ |
+ ;
+
+runSpotRead
+ : fqRUNDOTSPOT '.' fqNUMBER { GrowSpotName(pb, &$1); StopSpotName(pb); SetReadNumber(pb, &$3); }
+ | fqRUNDOTSPOT '/' fqNUMBER { GrowSpotName(pb, &$1); StopSpotName(pb); SetReadNumber(pb, &$3); }
+ | fqRUNDOTSPOT { GrowSpotName(pb, &$1); StopSpotName(pb); }
+ ;
+
+ /*************** quality rules *****************/
+
+qualityLines
+ : qualityHeader endline quality
+ | qualityHeader endline error endline
+ ;
+
+qualityHeader
+ : '+'
+ | qualityHeader fqTOKEN
+ ;
+
+quality
+ : qualityLine endline
+ | quality qualityLine endline
+
+qualityLine
+ : fqASCQUAL { AddQuality(pb, & $1); }
+ ;
+
+%%
+
+/* values used in validating quality lines */
+#define MIN_PHRED_33 33
+#define MAX_PHRED_33 126
+#define MIN_PHRED_64 64
+#define MAX_PHRED_64 127
+#define MIN_LOGODDS 59
+#define MAX_LOGODDS 126
+
+void AddQuality(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ uint8_t floor;
+ uint8_t ceiling;
+ const char* format;
+ switch ( pb->qualityFormat )
+ {
+ case FASTQphred33:
+ floor = MIN_PHRED_33;
+ ceiling = MAX_PHRED_33;
+ format = "Phred33";
+ pb -> qualityAsciiOffset = 33;
+ break;
+ case FASTQphred64:
+ floor = MIN_PHRED_64;
+ ceiling = MAX_PHRED_64;
+ format = "Phred64";
+ pb -> qualityAsciiOffset = 64;
+ break;
+ case FASTQlogodds:
+ floor = MIN_LOGODDS;
+ ceiling = MAX_LOGODDS;
+ format = "Logodds";
+ pb -> qualityAsciiOffset = 64;
+ break;
+ default:
+ /* TODO:
+ if qualityAsciiOffset is 0,
+ guess based on the raw values on the first quality line:
+ if all values are above MAX_PHRED_33, qualityAsciiOffset = 64
+ if all values are in MIN_PHRED_33..MAX_PHRED_33, qualityAsciiOffset = 33
+ if any value is below MIN_PHRED_33, abort
+ if the guess is 33 and proven wrong (a raw quality value >MAX_PHRED_33 is encountered and no values below MIN_PHRED_64 ever seen)
+ reopen the file,
+ qualityAsciiOffset = 64
+ try to parse again
+ if a value below MIN_PHRED_64 seen, abort
+ */
+ {
+ char buf[200];
+ sprintf ( buf, "Invalid quality format: %d.", pb->qualityFormat );
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ }
+
+ { /* make sure all qualities fall into the required range */
+ unsigned int i;
+ for (i=0; i < token->tokenLength; ++i)
+ {
+ char ch = TokenTextPtr(pb, token)[i];
+ if (ch < floor || ch > ceiling)
+ {
+ char buf[200];
+ sprintf ( buf, "Invalid quality value ('%c'=%d, position %d): for %s, valid range is from %d to %d.",
+ ch,
+ ch,
+ i,
+ format,
+ floor,
+ ceiling);
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ }
+ }
+
+ if (pb->qualityLength == 0)
+ {
+ pb->qualityOffset = token->tokenStart;
+ pb->qualityLength= token->tokenLength;
+ }
+ else
+ {
+ pb->qualityLength += token->tokenLength;
+ }
+}
+
+void SetReadNumber(FASTQParseBlock* pb, const FASTQToken* token)
+{ /* token is known to be numeric */
+ if (pb->defaultReadNumber != -1)
+ { /* we will only handle 1-digit read numbers for now*/
+ if (token->tokenLength == 1)
+ {
+ switch (TokenTextPtr(pb, token)[0])
+ {
+ case '1':
+ {
+ pb->record->seq.readnumber = 1;
+ break;
+ }
+ case '0':
+ {
+ pb->record->seq.readnumber = pb->defaultReadNumber;
+ break;
+ }
+ default:
+ { /* all secondary read numbers should be the same across an input file */
+ uint8_t readNum = TokenTextPtr(pb, token)[0] - '0';
+ if (pb->secondaryReadNumber == 0) /* this is the first secondary read observed */
+ {
+ pb->secondaryReadNumber = readNum;
+ }
+ else if (pb->secondaryReadNumber != readNum)
+ {
+ char buf[200];
+ sprintf(buf,
+ "Inconsistent secondary read number: previously used %d, now seen %d",
+ pb->secondaryReadNumber, readNum);
+ pb->fatalError = true;
+ yyerror(pb, buf);
+ return;
+ }
+ /* all secondary read numbers are internally represented as 2 */
+ pb->record->seq.readnumber = 2;
+
+ break;
+ }
+ }
+ }
+ else
+ pb->record->seq.readnumber = pb->defaultReadNumber;
+ }
+}
+
+void StartSpotName(FASTQParseBlock* pb, size_t offset)
+{
+ pb->spotNameOffset = offset;
+ pb->spotNameLength = 0;
+}
+
+void SaveSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset_saved = pb->spotNameOffset;
+ pb->spotNameLength_saved = pb->spotNameLength;
+}
+
+void RestartSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset += pb->spotNameLength;
+ pb->spotNameLength = 0;
+}
+
+void RevertSpotName(FASTQParseBlock* pb)
+{
+ pb->spotNameOffset = pb->spotNameOffset_saved;
+ pb->spotNameLength = pb->spotNameLength_saved;
+}
+
+void GrowSpotName(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ if (!pb->spotNameDone)
+ {
+ pb->spotNameLength += token->tokenLength;
+ }
+}
+
+void StopSpotName(FASTQParseBlock* pb)
+{ /* there may be more tokens coming, they will not be a part of the spot name */
+ pb->spotNameDone = true;
+}
+
+void SetSpotGroup(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ if ( ! pb->ignoreSpotGroups )
+ {
+ unsigned int nameStart = 0;
+ /* skip possible '#' at the start of spot group name */
+ if ( TokenTextPtr ( pb, token )[0] == '#' )
+ {
+ nameStart = 1;
+ }
+
+ if ( token->tokenLength != 1+nameStart || TokenTextPtr(pb, token)[nameStart] != '0' ) /* ignore spot group 0 */
+ {
+ pb->spotGroupOffset = token->tokenStart + nameStart;
+ pb->spotGroupLength = token->tokenLength - nameStart;
+ }
+ }
+}
+
+void SetRead(FASTQParseBlock* pb, const FASTQToken* token)
+{
+ pb->readOffset = token->tokenStart;
+ pb->readLength = token->tokenLength;
+}
diff --git a/tools/fastq-loader/fastq-lex.c b/tools/fastq-loader/fastq-lex.c
new file mode 100644
index 0000000..54cc5d6
--- /dev/null
+++ b/tools/fastq-loader/fastq-lex.c
@@ -0,0 +1,2888 @@
+
+
+#define YY_BUF_SIZE 16777216
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+/* %not-for-header */
+
+/* %if-c-only */
+/* %if-not-reentrant */
+/* %endif */
+/* %endif */
+/* %ok-for-header */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* %if-c++-only */
+/* %endif */
+
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c-only */
+
+/* %endif */
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+/* %if-c-only */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+/* %endif */
+
+/* %if-tables-serialization */
+/* %endif */
+/* end standard C headers. */
+
+/* %if-c-or-c++ */
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* %not-for-header */
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+/* %ok-for-header */
+
+/* %not-for-header */
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+/* %ok-for-header */
+
+/* %if-reentrant */
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* %endif */
+
+/* %if-not-reentrant */
+/* %endif */
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE FASTQ_restart(yyin ,yyscanner )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+/* %if-not-reentrant */
+/* %endif */
+
+/* %if-c-only */
+/* %if-not-reentrant */
+/* %endif */
+/* %endif */
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+ * access to the local variable yy_act. Since yyless() is a macro, it would break
+ * existing scanners that call yyless() from OUTSIDE FASTQ_lex.
+ * One obvious solution it to make yy_act a global. I tried that, and saw
+ * a 5% performance hit in a non-yylineno scanner, because yy_act is
+ * normally declared as a register variable-- so it is not worth it.
+ */
+ #define YY_LESS_LINENO(n) \
+ do { \
+ int yyl;\
+ for ( yyl = n; yyl < yyleng; ++yyl )\
+ if ( yytext[yyl] == '\n' )\
+ --yylineno;\
+ }while(0)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+/* %if-c-only */
+ FILE *yy_input_file;
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via FASTQ_restart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* %if-c-only Standard (non-C++) definition */
+/* %not-for-header */
+
+/* %if-not-reentrant */
+/* %endif */
+/* %ok-for-header */
+
+/* %endif */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+/* %if-c-only Standard (non-C++) definition */
+
+/* %if-not-reentrant */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %endif */
+
+void FASTQ_restart (FILE *input_file ,yyscan_t yyscanner );
+void FASTQ__switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+YY_BUFFER_STATE FASTQ__create_buffer (FILE *file,int size ,yyscan_t yyscanner );
+void FASTQ__delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void FASTQ__flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void FASTQ_push_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+void FASTQ_pop_buffer_state (yyscan_t yyscanner );
+
+static void FASTQ_ensure_buffer_stack (yyscan_t yyscanner );
+static void FASTQ__load_buffer_state (yyscan_t yyscanner );
+static void FASTQ__init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
+
+#define YY_FLUSH_BUFFER FASTQ__flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+
+YY_BUFFER_STATE FASTQ__scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
+YY_BUFFER_STATE FASTQ__scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
+YY_BUFFER_STATE FASTQ__scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
+
+/* %endif */
+
+void *FASTQ_alloc (yy_size_t ,yyscan_t yyscanner );
+void *FASTQ_realloc (void *,yy_size_t ,yyscan_t yyscanner );
+void FASTQ_free (void * ,yyscan_t yyscanner );
+
+#define yy_new_buffer FASTQ__create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ FASTQ_ensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ FASTQ__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ FASTQ_ensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ FASTQ__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* %% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here */
+/* Begin user sect3 */
+
+#define FASTQ_wrap(n) 1
+#define YY_SKIP_YYWRAP
+
+#define FLEX_DEBUG
+
+typedef unsigned char YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+/* %if-c-only Standard (non-C++) definition */
+
+static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner);
+static int yy_get_next_buffer (yyscan_t yyscanner );
+static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
+
+/* %endif */
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+/* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
+ yyg->yy_c_buf_p = yy_cp;
+
+/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
+#define YY_NUM_RULES 34
+#define YY_END_OF_BUFFER 35
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[211] =
+ { 0,
+ 32, 32, 35, 12, 34, 9, 12, 34, 33, 34,
+ 12, 33, 34, 6, 12, 34, 8, 12, 34, 7,
+ 8, 12, 34, 12, 34, 8, 12, 34, 3, 12,
+ 34, 12, 34,16394, 2, 12, 34, 1, 12, 34,
+ 8, 12, 34,16394, 8, 12, 34,16394, 9, 12,
+ 34, 13, 34, 12, 13, 34, 34, 34, 17, 34,
+ 34,16400, 34,16398,16400, 34,16398,16400, 34, 23,
+ 34, 23, 34, 27, 34, 24, 27, 34, 26, 34,
+ 26, 27, 34, 27, 34,16409, 24, 27, 34,16409,
+ 21, 34, 21, 34, 18, 34, 20, 34, 18, 34,
+
+ 30, 34, 24, 30, 34, 29, 34, 29, 30, 34,
+ 30, 34,16412, 24, 30, 34,16412, 32, 34, 31,
+ 34, 31, 32, 34, 9, 33, 6, 8, 7, 8,
+ 8, 8202, 8202,16394,16394,16395, 8,16395, 8,16394,
+ 9, 13, 13, 17, 8208, 17, 8208,16400, 8206, 8208,
+ 17, 8206, 8208,16398,16400,16398,16399,16400,16399,16400,
+ 22, 22, 23, 24, 26, 8217, 8217,16409, 24,16409,
+ 21, 18, 20, 18, 19, 19, 29, 8220, 8220,16412,
+ 24,16412, 32, 31, 31, 32, 31, 8, 8202, 8203,
+ 8202, 8203,16395, 8203, 8203, 8206, 8207, 8208, 17, 8206,
+
+ 8207, 8208, 8207, 8208, 17, 8207, 8208, 8, 5, 4
+ } ;
+
+static yyconst flex_int16_t yy_accept[143] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 3, 4, 6, 9, 11, 14,
+ 17, 20, 24, 26, 29, 32, 35, 38, 41, 45,
+ 49, 52, 54, 57, 58, 59, 61, 63, 66, 69,
+ 70, 72, 74, 76, 79, 81, 84, 87, 91, 93,
+ 95, 97, 99, 101, 103, 106, 108, 111, 114, 118,
+ 120, 122, 125, 126, 127, 128, 129, 131, 131, 132,
+ 133, 134, 135, 137, 139, 141, 142, 143, 144, 144,
+ 145, 147, 148, 149, 152, 154, 156, 159, 161, 161,
+
+ 162, 164, 165, 166, 167, 168, 169, 171, 172, 173,
+ 174, 176, 177, 178, 179, 180, 181, 183, 184, 185,
+ 187, 188, 188, 189, 191, 193, 194, 195, 196, 200,
+ 203, 206, 208, 208, 209, 209, 209, 209, 210, 210,
+ 211, 211
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 5, 5, 7, 5, 5, 5, 5, 5,
+ 5, 5, 8, 5, 9, 10, 5, 11, 11, 11,
+ 11, 12, 12, 12, 12, 12, 12, 13, 5, 5,
+ 5, 14, 5, 15, 16, 9, 16, 17, 17, 9,
+ 16, 9, 9, 9, 9, 9, 9, 18, 9, 9,
+ 9, 19, 17, 16, 9, 9, 9, 9, 9, 9,
+ 5, 5, 5, 5, 20, 5, 16, 9, 16, 9,
+
+ 9, 9, 16, 9, 9, 9, 9, 9, 9, 18,
+ 9, 9, 9, 9, 9, 16, 9, 9, 9, 9,
+ 9, 9, 5, 5, 5, 5, 5, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[21] =
+ { 0,
+ 1, 1, 2, 2, 3, 3, 3, 3, 4, 5,
+ 6, 6, 7, 3, 3, 8, 4, 8, 4, 9
+ } ;
+
+static yyconst flex_int16_t yy_base[162] =
+ { 0,
+ 0, 13, 30, 25, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 43, 21, 34, 60, 66, 70, 0,
+ 88, 94, 36, 45, 292, 356, 20, 356, 288, 0,
+ 0, 39, 43, 270, 356, 53, 356, 356, 98, 65,
+ 116, 356, 285, 356, 282, 356, 122, 126, 67, 280,
+ 356, 276, 356, 77, 356, 274, 81, 143, 356, 205,
+ 0, 92, 95, 356, 129, 356, 196, 108, 148, 129,
+ 356, 134, 137, 356, 0, 0, 0, 177, 158, 356,
+ 166, 137, 152, 168, 0, 0, 356, 145, 131, 356,
+ 356, 118, 179, 356, 110, 0, 181, 190, 96, 356,
+
+ 356, 151, 356, 356, 90, 155, 0, 356, 0, 149,
+ 0, 154, 356, 356, 84, 163, 0, 170, 356, 172,
+ 356, 175, 177, 356, 68, 199, 356, 62, 356, 57,
+ 356, 55, 39, 32, 184, 186, 17, 193, 195, 200,
+ 356, 212, 221, 230, 239, 248, 257, 266, 272, 278,
+ 285, 293, 302, 311, 319, 324, 331, 340, 344, 346,
+ 348
+ } ;
+
+static yyconst flex_int16_t yy_def[162] =
+ { 0,
+ 141, 1, 1, 3, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 143, 144, 144, 145, 146, 142, 19,
+ 147, 147, 148, 148, 141, 141, 141, 141, 141, 149,
+ 150, 150, 141, 150, 141, 151, 141, 141, 141, 39,
+ 141, 141, 141, 141, 152, 141, 153, 153, 48, 154,
+ 141, 154, 141, 141, 141, 141, 155, 155, 141, 141,
+ 156, 141, 156, 141, 141, 141, 141, 157, 157, 158,
+ 141, 158, 141, 141, 149, 150, 32, 159, 150, 141,
+ 141, 151, 141, 150, 40, 41, 141, 141, 152, 141,
+ 141, 152, 153, 141, 152, 48, 48, 93, 154, 141,
+
+ 141, 141, 141, 141, 141, 155, 58, 141, 156, 141,
+ 63, 141, 141, 141, 141, 157, 69, 158, 141, 158,
+ 141, 141, 150, 141, 141, 141, 141, 141, 141, 152,
+ 141, 152, 160, 123, 141, 141, 161, 141, 141, 141,
+ 0, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141
+ } ;
+
+static yyconst flex_int16_t yy_nxt[377] =
+ { 0,
+ 26, 27, 28, 29, 26, 27, 30, 26, 31, 26,
+ 32, 32, 33, 26, 26, 31, 34, 31, 31, 26,
+ 35, 73, 36, 51, 52, 73, 37, 38, 39, 139,
+ 40, 41, 42, 43, 36, 41, 51, 52, 71, 72,
+ 39, 136, 40, 45, 45, 46, 45, 71, 72, 77,
+ 77, 135, 48, 78, 78, 80, 81, 131, 49, 129,
+ 48, 54, 55, 56, 127, 54, 53, 54, 55, 56,
+ 124, 58, 59, 60, 82, 76, 97, 98, 102, 61,
+ 62, 62, 102, 104, 105, 63, 114, 61, 64, 65,
+ 66, 67, 104, 69, 64, 65, 66, 67, 100, 69,
+
+ 80, 81, 110, 110, 111, 112, 76, 83, 84, 76,
+ 114, 115, 94, 85, 76, 85, 76, 86, 87, 88,
+ 91, 86, 89, 89, 91, 92, 89, 89, 94, 95,
+ 102, 119, 120, 90, 102, 96, 121, 120, 73, 80,
+ 81, 96, 73, 96, 102, 104, 105, 87, 107, 102,
+ 114, 115, 102, 117, 124, 125, 102, 104, 105, 110,
+ 110, 83, 126, 112, 112, 114, 115, 82, 80, 82,
+ 127, 128, 119, 120, 121, 120, 123, 126, 84, 89,
+ 89, 91, 92, 129, 130, 133, 133, 134, 134, 122,
+ 97, 98, 131, 132, 137, 137, 138, 138, 113, 98,
+
+ 98, 127, 128, 138, 138, 140, 140, 108, 126, 126,
+ 140, 140, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 75, 103, 75, 101, 75,
+ 75, 76, 100, 76, 90, 76, 82, 87, 79, 82,
+ 74, 141, 82, 89, 89, 89, 89, 89, 89, 89,
+
+ 89, 89, 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 106, 106, 106, 106, 106, 106, 106, 106, 109, 141,
+ 141, 109, 116, 116, 116, 116, 116, 116, 116, 116,
+ 118, 118, 118, 118, 118, 118, 118, 118, 118, 78,
+ 78, 133, 133, 137, 137, 25, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141
+ } ;
+
+static yyconst flex_int16_t yy_chk[377] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 27, 2, 15, 15, 27, 2, 2, 2, 137,
+ 2, 3, 3, 3, 4, 3, 16, 16, 23, 23,
+ 4, 134, 4, 14, 14, 14, 14, 24, 24, 32,
+ 32, 133, 14, 33, 33, 36, 36, 132, 14, 130,
+ 14, 17, 17, 17, 128, 17, 18, 18, 18, 18,
+ 125, 18, 19, 19, 40, 40, 49, 49, 54, 19,
+ 19, 19, 54, 57, 57, 19, 115, 19, 21, 21,
+ 21, 21, 105, 21, 22, 22, 22, 22, 99, 22,
+
+ 39, 39, 62, 62, 63, 63, 39, 39, 39, 39,
+ 68, 68, 95, 39, 39, 39, 39, 41, 41, 41,
+ 92, 41, 47, 47, 47, 47, 48, 48, 48, 48,
+ 65, 70, 70, 89, 65, 48, 72, 72, 73, 82,
+ 82, 48, 73, 48, 58, 58, 58, 88, 58, 69,
+ 69, 69, 102, 69, 83, 83, 102, 106, 106, 110,
+ 110, 83, 83, 112, 112, 116, 116, 83, 81, 83,
+ 84, 84, 118, 118, 120, 120, 79, 84, 84, 93,
+ 93, 93, 93, 97, 97, 122, 122, 123, 123, 78,
+ 97, 97, 98, 98, 135, 135, 136, 136, 67, 98,
+
+ 98, 126, 126, 138, 138, 139, 139, 60, 126, 126,
+ 140, 140, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+ 144, 144, 144, 144, 144, 144, 144, 144, 144, 145,
+ 145, 145, 145, 145, 145, 145, 145, 145, 146, 146,
+ 146, 146, 146, 146, 146, 146, 146, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 149, 56, 149, 52, 149,
+ 149, 150, 50, 150, 45, 150, 151, 43, 34, 151,
+ 29, 25, 151, 152, 152, 152, 152, 152, 152, 152,
+
+ 152, 152, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 155, 155, 155, 155, 155, 155, 155, 155, 156, 0,
+ 0, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+ 158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
+ 159, 160, 160, 161, 161, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141
+ } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[35] =
+ { 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0,
+ 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, };
+
+static yyconst flex_int16_t yy_rule_linenum[34] =
+ { 0,
+ 90, 91, 93, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 108, 112, 113, 114, 115, 120, 121, 122,
+ 123, 128, 129, 134, 139, 140, 147, 152, 153, 154,
+ 159, 160, 163
+ } ;
+
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ \
+yy_cp = yyg->yy_full_match; /* restore poss. backed-over text */ \
+yyg->yy_lp = yyg->yy_full_lp; /* restore orig. accepting pos. */ \
+yyg->yy_state_ptr = yyg->yy_full_state; /* restore orig. state */ \
+yy_current_state = *yyg->yy_state_ptr; /* restore curr. state */ \
+++yyg->yy_lp; \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+ #include <sysalloc.h>
+ #include <ctype.h>
+
+ #include <klib/rc.h>
+ #include <klib/log.h>
+
+ #include "fastq-parse.h"
+ #include "fastq-tokens.h"
+
+ #define YYSTYPE FASTQToken
+
+ /* code to populate token with internal values */
+ static void ConsumeToken(FASTQToken* token, FASTQParseBlock* pb);
+ #define YY_USER_ACTION ConsumeToken(yylval, yyextra);
+
+ #define ENDLINE \
+ yyextra -> column=1;\
+ return fqENDLINE;
+
+ #define YY_INPUT(buf, result, max_size) \
+ result = yyextra->input(yyextra, buf, max_size)
+
+ #define ECHO
+
+ static void FASTQ_fatal_error(yyconst char* msg);
+ #define YY_FATAL_ERROR(msg) FASTQ_fatal_error(msg)
+
+#define YY_NO_UNISTD_H 1
+/*%option debug*/
+
+
+
+
+
+
+
+
+
+
+
+/* there are more: =ACMGRSVTWYHKDBN. plus lowercase */
+
+#define INITIAL 0
+#define TAG_LINE 1
+#define SEE_COORDS 2
+#define PAST_COORDS 3
+#define READ_NUMBER 4
+#define NAMEVALUE 5
+#define IN_SEQUENCE 6
+#define QTAG_LINE 7
+#define IN_QUALITY 8
+#define INLINE_SEQUENCE 9
+#define INLINE_QUALITY 10
+#define SKIP_TO_EOL 11
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+/* %if-c-only */
+#include <unistd.h>
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+#endif
+
+#define YY_EXTRA_TYPE FASTQParseBlock*
+
+/* %if-c-only Reentrant structure and macros (non-C++). */
+/* %if-reentrant */
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ yy_state_type *yy_state_buf;
+ yy_state_type *yy_state_ptr;
+ char *yy_full_match;
+ int yy_lp;
+
+ /* These are only needed for trailing context rules,
+ * but there's no conditional variable for that yet. */
+ int yy_looking_for_trail_begin;
+ int yy_full_lp;
+ int *yy_full_state;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+/* %if-c-only */
+
+static int yy_init_globals (yyscan_t yyscanner );
+
+/* %endif */
+
+/* %if-reentrant */
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int FASTQ_lex_init (yyscan_t* scanner);
+
+int FASTQ_lex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
+
+/* %endif */
+
+/* %endif End reentrant structures and macros. */
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int FASTQ_lex_destroy (yyscan_t yyscanner );
+
+int FASTQ_get_debug (yyscan_t yyscanner );
+
+void FASTQ_set_debug (int debug_flag ,yyscan_t yyscanner );
+
+YY_EXTRA_TYPE FASTQ_get_extra (yyscan_t yyscanner );
+
+void FASTQ_set_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
+
+FILE *FASTQ_get_in (yyscan_t yyscanner );
+
+void FASTQ_set_in (FILE * in_str ,yyscan_t yyscanner );
+
+FILE *FASTQ_get_out (yyscan_t yyscanner );
+
+void FASTQ_set_out (FILE * out_str ,yyscan_t yyscanner );
+
+int FASTQ_get_leng (yyscan_t yyscanner );
+
+char *FASTQ_get_text (yyscan_t yyscanner );
+
+int FASTQ_get_lineno (yyscan_t yyscanner );
+
+void FASTQ_set_lineno (int line_number ,yyscan_t yyscanner );
+
+/* %if-bison-bridge */
+
+YYSTYPE * FASTQ_get_lval (yyscan_t yyscanner );
+
+void FASTQ_set_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
+
+/* %endif */
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int FASTQ_wrap (yyscan_t yyscanner );
+#else
+extern int FASTQ_wrap (yyscan_t yyscanner );
+#endif
+#endif
+
+/* %not-for-header */
+
+ static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner);
+
+/* %ok-for-header */
+
+/* %endif */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+/* %if-c-only Standard (non-C++) definition */
+/* %not-for-header */
+
+#ifdef __cplusplus
+static int yyinput (yyscan_t yyscanner );
+#else
+static int input (yyscan_t yyscanner );
+#endif
+/* %ok-for-header */
+
+/* %endif */
+#endif
+
+/* %if-c-only */
+
+ static void yy_push_state (int new_state ,yyscan_t yyscanner);
+
+ static void yy_pop_state (yyscan_t yyscanner );
+
+ static int yy_top_state (yyscan_t yyscanner );
+
+/* %endif */
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* %if-c-only Standard (non-C++) definition */
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
+/* %endif */
+/* %if-c++-only C++ definition */
+/* %endif */
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+/* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+/* %if-c++-only C++ definition \ */\
+/* %endif */
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+/* %if-c-only */
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+#endif
+
+/* %if-tables-serialization structures and prototypes */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %not-for-header */
+
+/* %tables-yydmap generated elements */
+/* %endif */
+/* end tables serialization structures and prototypes */
+
+/* %ok-for-header */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+/* %if-c-only Standard (non-C++) definition */
+
+extern int FASTQ_lex \
+ (YYSTYPE * yylval_param ,yyscan_t yyscanner);
+
+#define YY_DECL int FASTQ_lex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only C++ definition */
+/* %endif */
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+/* %% [6.0] YY_RULE_SETUP definition goes here */
+#define YY_RULE_SETUP \
+ if ( yyleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (yytext[yyleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/* %not-for-header */
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+/* %% [7.0] user's declarations go here */
+
+
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! yyg->yy_state_buf )
+ yyg->yy_state_buf = (yy_state_type *)FASTQ_alloc(YY_STATE_BUF_SIZE ,yyscanner);
+ if ( ! yyg->yy_state_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ_lex()" );
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+/* %if-c-only */
+ yyin = stdin;
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+ if ( ! yyout )
+/* %if-c-only */
+ yyout = stdout;
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ FASTQ_ensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ FASTQ__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ }
+
+ FASTQ__load_buffer_state(yyscanner );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+/* %% [8.0] yymore()-related code goes here */
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+/* %% [9.0] code to set up and find next match goes here */
+ yy_current_state = yyg->yy_start;
+ yy_current_state += YY_AT_BOL();
+
+ yyg->yy_state_ptr = yyg->yy_state_buf;
+ *yyg->yy_state_ptr++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 142 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *yyg->yy_state_ptr++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_current_state != 141 );
+
+yy_find_action:
+/* %% [10.0] code to find the action number goes here */
+ yy_current_state = *--yyg->yy_state_ptr;
+ yyg->yy_lp = yy_accept[yy_current_state];
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( yyg->yy_lp && yyg->yy_lp < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[yyg->yy_lp];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ yyg->yy_looking_for_trail_begin )
+ {
+ if ( yy_act == yyg->yy_looking_for_trail_begin )
+ {
+ yyg->yy_looking_for_trail_begin = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ yyg->yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;
+ yyg->yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;
+ }
+ else
+ {
+ yyg->yy_full_match = yy_cp;
+ yyg->yy_full_state = yyg->yy_state_ptr;
+ yyg->yy_full_lp = yyg->yy_lp;
+ break;
+ }
+ ++yyg->yy_lp;
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--yyg->yy_state_ptr;
+ yyg->yy_lp = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+/* %% [11.0] code for yylineno update goes here */
+
+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+ {
+ int yyl;
+ for ( yyl = 0; yyl < yyleng; ++yyl )
+ if ( yytext[yyl] == '\n' )
+
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+;
+ }
+
+do_action: /* This label is used only to access EOF actions. */
+
+/* %% [12.0] debug code goes here */
+ if ( yy_flex_debug )
+ {
+ if ( yy_act == 0 )
+ fprintf( stderr, "--scanner backing up\n" );
+ else if ( yy_act < 34 )
+ fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
+ (long)yy_rule_linenum[yy_act], yytext );
+ else if ( yy_act == 34 )
+ fprintf( stderr, "--accepting default rule (\"%s\")\n",
+ yytext );
+ else if ( yy_act == 35 )
+ fprintf( stderr, "--(end of buffer or a NUL)\n" );
+ else
+ fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
+ }
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+/* %% [13.0] actions go here */
+case 1:
+YY_RULE_SETUP
+{ BEGIN TAG_LINE; return yytext[0]; }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+{ BEGIN TAG_LINE; return yytext[0]; }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+{ BEGIN QTAG_LINE; return yytext[0]; }
+ YY_BREAK
+
+
+case 4:
+YY_RULE_SETUP
+{ return fqCOORDS; }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+{ return fqRUNDOTSPOT; }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+{ return fqSPOTGROUP; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+{ return fqNUMBER; }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+{ return fqALPHANUM; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+{ return fqWS; }
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+{ return fqBASESEQ; }
+ YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+{ return fqCOLORSEQ; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+{ return yytext[0]; }
+ YY_BREAK
+
+case 13:
+/* rule 13 can match eol */
+YY_RULE_SETUP
+{ BEGIN IN_SEQUENCE; ENDLINE; }
+ YY_BREAK
+
+
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; return fqBASESEQ; }
+ YY_BREAK
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; return fqCOLORSEQ; }
+ YY_BREAK
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; return fqASCQUAL; }
+ YY_BREAK
+case 17:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ BEGIN 0; return fqUNRECOGNIZED; }
+ YY_BREAK
+
+
+
+case 18:
+YY_RULE_SETUP
+{ BEGIN 0; return fqBASESEQ; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+{ BEGIN 0; return fqCOLORSEQ; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+{ BEGIN 0; return fqNUMBER; }
+ YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+
+
+
+case 22:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ return fqTOKEN; /* do not bother to parse the inside of the line */ }
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+{ BEGIN IN_QUALITY; ENDLINE }
+ YY_BREAK
+
+
+
+case 24:
+YY_RULE_SETUP
+{ }
+ YY_BREAK
+
+
+
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+{ return fqASCQUAL; }
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+{ /* if read was split across several lines, expect the same number of lines in quality */
+ if (yyextra->expectedQualityLines <= 1)
+ BEGIN 0;
+ else
+ --yyextra->expectedQualityLines;
+ ENDLINE;
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+{ return yytext[0]; }
+ YY_BREAK
+
+
+
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+{ return fqASCQUAL; }
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+{ return yytext[0]; }
+ YY_BREAK
+
+
+
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+{ BEGIN 0; return fqENDOFTEXT; }
+ YY_BREAK
+
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+{ ENDLINE; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+ECHO;
+ YY_BREAK
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(TAG_LINE):
+ case YY_STATE_EOF(SEE_COORDS):
+ case YY_STATE_EOF(PAST_COORDS):
+ case YY_STATE_EOF(READ_NUMBER):
+ case YY_STATE_EOF(NAMEVALUE):
+ case YY_STATE_EOF(IN_SEQUENCE):
+ case YY_STATE_EOF(QTAG_LINE):
+ case YY_STATE_EOF(IN_QUALITY):
+ case YY_STATE_EOF(INLINE_SEQUENCE):
+ case YY_STATE_EOF(INLINE_QUALITY):
+ case YY_STATE_EOF(SKIP_TO_EOL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * FASTQ_lex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
+ yy_cp = yyg->yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( FASTQ_wrap(yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of FASTQ_lex */
+/* %ok-for-header */
+
+/* %if-c++-only */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %endif */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+/* %if-c-only */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = yyg->yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, (size_t) num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ FASTQ_restart(yyin ,yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) FASTQ_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+/* %if-c-only */
+/* %not-for-header */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+/* %% [15.0] code to get the start state into yy_current_state goes here */
+ yy_current_state = yyg->yy_start;
+ yy_current_state += YY_AT_BOL();
+
+ yyg->yy_state_ptr = yyg->yy_state_buf;
+ *yyg->yy_state_ptr++ = yy_current_state;
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+/* %% [16.0] code to find the next state goes here */
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 142 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *yyg->yy_state_ptr++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+/* %if-c-only */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+/* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 142 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 141);
+ if ( ! yy_is_jam )
+ *yyg->yy_state_ptr++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+/* %if-c-only */
+
+ static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* undo effects of setting up yytext */
+ *yy_cp = yyg->yy_hold_char;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = yyg->yy_n_chars + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+/* %% [18.0] update yylineno here */
+
+ if ( c == '\n' ){
+ --yylineno;
+ }
+
+ yyg->yytext_ptr = yy_bp;
+ yyg->yy_hold_char = *yy_cp;
+ yyg->yy_c_buf_p = yy_cp;
+}
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c-only */
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ FASTQ_restart(yyin ,yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( FASTQ_wrap(yyscanner ) )
+ return EOF;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+/* %% [19.0] update BOL and yylineno */
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+;
+
+ return c;
+}
+/* %if-c-only */
+#endif /* ifndef YY_NO_INPUT */
+/* %endif */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+/* %if-c-only */
+ void FASTQ_restart (FILE * input_file , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ FASTQ_ensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ FASTQ__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ }
+
+ FASTQ__init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
+ FASTQ__load_buffer_state(yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void FASTQ__switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * FASTQ_pop_buffer_state();
+ * FASTQ_push_buffer_state(new_buffer);
+ */
+ FASTQ_ensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ FASTQ__load_buffer_state(yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (FASTQ_wrap()) processing, but the only time this flag
+ * is looked at is after FASTQ_wrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/* %if-c-only */
+static void FASTQ__load_buffer_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+/* %if-c-only */
+ YY_BUFFER_STATE FASTQ__create_buffer (FILE * file, int size , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) FASTQ_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ__create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) FASTQ_alloc(b->yy_buf_size + 2 ,yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ__create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ FASTQ__init_buffer(b,file ,yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with FASTQ__create_buffer()
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void FASTQ__delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ FASTQ_free((void *) b->yy_ch_buf ,yyscanner );
+
+ FASTQ_free((void *) b ,yyscanner );
+}
+
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a FASTQ_restart() or at EOF.
+ */
+/* %if-c-only */
+ static void FASTQ__init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ FASTQ__flush_buffer(b ,yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then FASTQ__init_buffer was _probably_
+ * called from FASTQ_restart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+/* %if-c-only */
+
+ b->yy_is_interactive = 0;
+
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void FASTQ__flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ FASTQ__load_buffer_state(yyscanner );
+}
+
+/* %if-c-or-c++ */
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+void FASTQ_push_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ FASTQ_ensure_buffer_stack(yyscanner);
+
+ /* This block is copied from FASTQ__switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from FASTQ__switch_to_buffer. */
+ FASTQ__load_buffer_state(yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+/* %endif */
+
+/* %if-c-or-c++ */
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+void FASTQ_pop_buffer_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ FASTQ__delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ FASTQ__load_buffer_state(yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+/* %endif */
+
+/* %if-c-or-c++ */
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+/* %if-c-only */
+static void FASTQ_ensure_buffer_stack (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ int num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)FASTQ_alloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ_ensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)FASTQ_realloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ_ensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE FASTQ__scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) FASTQ_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ__scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ FASTQ__switch_to_buffer(b ,yyscanner );
+
+ return b;
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan a string. The next call to FASTQ_lex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * FASTQ__scan_bytes() instead.
+ */
+YY_BUFFER_STATE FASTQ__scan_string (yyconst char * yystr , yyscan_t yyscanner)
+{
+
+ return FASTQ__scan_bytes(yystr,strlen(yystr) ,yyscanner);
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan the given bytes. The next call to FASTQ_lex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE FASTQ__scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) FASTQ_alloc(n ,yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in FASTQ__scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = FASTQ__scan_buffer(buf,n ,yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in FASTQ__scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+/* %endif */
+
+/* %if-c-only */
+ static void yy_push_state (int new_state , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth )
+ {
+ yy_size_t new_size;
+
+ yyg->yy_start_stack_depth += YY_START_STACK_INCR;
+ new_size = yyg->yy_start_stack_depth * sizeof( int );
+
+ if ( ! yyg->yy_start_stack )
+ yyg->yy_start_stack = (int *) FASTQ_alloc(new_size ,yyscanner );
+
+ else
+ yyg->yy_start_stack = (int *) FASTQ_realloc((void *) yyg->yy_start_stack,new_size ,yyscanner );
+
+ if ( ! yyg->yy_start_stack )
+ YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+ }
+
+ yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START;
+
+ BEGIN(new_state);
+}
+
+/* %if-c-only */
+ static void yy_pop_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( --yyg->yy_start_stack_ptr < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]);
+}
+
+/* %if-c-only */
+ static int yy_top_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1];
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+/* %if-c-only */
+static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/* %if-c-only */
+/* %if-reentrant */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE FASTQ_get_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/* %endif */
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int FASTQ_get_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int FASTQ_get_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *FASTQ_get_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *FASTQ_get_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int FASTQ_get_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *FASTQ_get_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/* %if-reentrant */
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void FASTQ_set_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/* %endif */
+
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void FASTQ_set_lineno (int line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ yy_fatal_error( "FASTQ_set_lineno called with no buffer" , yyscanner);
+
+ yylineno = line_number;
+}
+
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void FASTQ_set_column (int column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ yy_fatal_error( "FASTQ_set_column called with no buffer" , yyscanner);
+
+ yycolumn = column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see FASTQ__switch_to_buffer
+ */
+void FASTQ_set_in (FILE * in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = in_str ;
+}
+
+void FASTQ_set_out (FILE * out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = out_str ;
+}
+
+int FASTQ_get_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void FASTQ_set_debug (int bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = bdebug ;
+}
+
+/* %endif */
+
+/* %if-reentrant */
+/* Accessor methods for yylval and yylloc */
+
+/* %if-bison-bridge */
+
+YYSTYPE * FASTQ_get_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void FASTQ_set_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* %endif */
+
+/* User-visible API */
+
+/* FASTQ_lex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+
+int FASTQ_lex_init(yyscan_t* ptr_yy_globals)
+
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) FASTQ_alloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* FASTQ_lex_init_extra has the same functionality as FASTQ_lex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to FASTQ_alloc in
+ * the yyextra field.
+ */
+
+int FASTQ_lex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+
+{
+ struct yyguts_t dummy_yyguts;
+
+ FASTQ_set_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) FASTQ_alloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ FASTQ_set_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* %endif if-c-only */
+
+/* %if-c-only */
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from FASTQ_lex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = 0;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = (char *) 0;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+ yyg->yy_state_buf = 0;
+ yyg->yy_state_ptr = 0;
+ yyg->yy_full_match = 0;
+ yyg->yy_lp = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = (FILE *) 0;
+ yyout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * FASTQ_lex_init()
+ */
+ return 0;
+}
+/* %endif */
+
+/* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */
+/* FASTQ_lex_destroy is for both reentrant and non-reentrant scanners. */
+int FASTQ_lex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ FASTQ__delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ FASTQ_pop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ FASTQ_free(yyg->yy_buffer_stack ,yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ FASTQ_free(yyg->yy_start_stack ,yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ FASTQ_free ( yyg->yy_state_buf , yyscanner);
+ yyg->yy_state_buf = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * FASTQ_lex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+/* %if-reentrant */
+ /* Destroy the main struct (reentrant only). */
+ FASTQ_free ( yyscanner , yyscanner );
+ yyscanner = NULL;
+/* %endif */
+ return 0;
+}
+/* %endif */
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *FASTQ_alloc (yy_size_t size , yyscan_t yyscanner)
+{
+ return (void *) malloc( size );
+}
+
+void *FASTQ_realloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void FASTQ_free (void * ptr , yyscan_t yyscanner)
+{
+ free( (char *) ptr ); /* see FASTQ_realloc() for (char *) cast */
+}
+
+/* %if-tables-serialization definitions */
+/* %define-yytables The name for this specific scanner's tables. */
+#define YYTABLES_NAME "yytables"
+/* %endif */
+
+/* %ok-for-header */
+
+
+
+
+rc_t CC FASTQScan_yylex_init(FASTQParseBlock* sb, bool debug)
+{
+ if (FASTQ_lex_init_extra(sb,&sb->scanner) != 0)
+ {
+ return RC ( rcApp, rcFile, rcParsing, rcMemory, rcExhausted );
+ }
+
+ sb->length = 0;
+ sb->lastToken = NULL;
+ sb->record = NULL;
+ sb->column = 1;
+
+ sb->expectedQualityLines = 0;
+
+ FASTQ_set_debug(debug ? 1 : 0,sb->scanner);
+
+ yy_push_state(INITIAL, sb->scanner);
+
+ return 0;
+}
+
+void CC FASTQScan_yylex_destroy(FASTQParseBlock* sb)
+{
+ if (sb->scanner)
+ {
+ FASTQ_lex_destroy(sb->scanner);
+ }
+ sb->scanner=0;
+}
+
+void CC FASTQScan_inline_sequence(FASTQParseBlock* pb)
+{
+ yy_pop_state(pb->scanner);
+ yy_push_state(INLINE_SEQUENCE, pb->scanner);
+}
+
+void CC FASTQScan_inline_quality(FASTQParseBlock* pb)
+{
+ yy_pop_state(pb->scanner);
+ yy_push_state(INLINE_QUALITY, pb->scanner);
+}
+
+void CC FASTQScan_skip_to_eol(FASTQParseBlock* pb)
+{
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+ if ( yytext[0] != '\n' && yytext[0] != '\r' ) /* not at an EOL already */
+ {
+ yy_push_state(SKIP_TO_EOL, pb->scanner);
+ }
+}
+
+void CC FASTQ_unlex(FASTQParseBlock* pb, FASTQToken* token)
+{
+ size_t i;
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+ for (i = 0; i < token->tokenLength; ++i)
+ {
+ yyunput(TokenTextPtr(pb, token)[token->tokenLength - 1 - i], yyg->yytext_r, pb->scanner);
+ }
+ yyextra -> column -= token->tokenLength;
+ yyextra -> length -= token->tokenLength;
+ KDataBufferResize( & pb->record->source, KDataBufferBytes( & pb->record->source ) - token->tokenLength );
+}
+
+void FASTQ_fatal_error(yyconst char* msg)
+{
+ rc_t rc = RC ( rcApp, rcFile, rcParsing, rcError, rcUnexpected );
+ if (strcmp(msg, "input buffer overflow, can't enlarge buffer because scanner uses REJECT") == 0)
+ pLogErr(klogErr, rc, "line is too long (maximum line length = $(B) bytes)", "B=%d", YY_BUF_SIZE);
+ else
+ LogErr(klogErr, rc, msg);
+ exit(rc);
+}
+
+void ConsumeToken(FASTQToken* token, FASTQParseBlock* pb)
+{
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+
+ token -> tokenStart = KDataBufferBytes( & pb->record->source );
+ token -> tokenLength = yyleng;
+ token -> line_no = yylineno;
+ token -> column_no = pb -> column;
+
+ KDataBufferResize( & pb->record->source, KDataBufferBytes( & pb->record->source ) + token->tokenLength );
+ strncpy((char*)TokenTextPtr(pb, token), yytext, token->tokenLength);
+
+ pb -> column += token->tokenLength;
+ pb -> length += token->tokenLength;
+ pb -> lastToken = token;
+}
diff --git a/tools/fastq-loader/fastq-lex.l b/tools/fastq-loader/fastq-lex.l
new file mode 100644
index 0000000..fee3135
--- /dev/null
+++ b/tools/fastq-loader/fastq-lex.l
@@ -0,0 +1,256 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include <sysalloc.h>
+ #include <ctype.h>
+
+ #include <klib/rc.h>
+ #include <klib/log.h>
+
+ #include "fastq-parse.h"
+ #include "fastq-tokens.h"
+
+ #define YYSTYPE FASTQToken
+
+ /* code to populate token with internal values */
+ static void ConsumeToken(FASTQToken* token, FASTQParseBlock* pb);
+ #define YY_USER_ACTION ConsumeToken(yylval, yyextra);
+
+ #define ENDLINE \
+ yyextra -> column=1;\
+ return fqENDLINE;
+
+ #define YY_INPUT(buf, result, max_size) \
+ result = yyextra->input(yyextra, buf, max_size)
+
+ #define ECHO
+
+ static void FASTQ_fatal_error(yyconst char* msg);
+ #define YY_FATAL_ERROR(msg) FASTQ_fatal_error(msg)
+
+%}
+
+%option never-interactive nounistd yylineno reentrant bison-bridge stack noyywrap
+
+%option prefix="FASTQ_"
+%option extra-type="FASTQParseBlock*"
+
+ /*%option debug*/
+
+%x TAG_LINE
+%x SEE_COORDS
+%x PAST_COORDS
+%x READ_NUMBER
+%x NAMEVALUE
+%x IN_SEQUENCE
+%x QTAG_LINE
+%x IN_QUALITY
+%x INLINE_SEQUENCE
+%x INLINE_QUALITY
+%x SKIP_TO_EOL
+
+ws [ \t]+
+digits [0-9]+
+alphanum [A-Za-z0-9\-]+
+eol (\r\n|\r|\n)
+
+/* there are more: =ACMGRSVTWYHKDBN. plus lowercase */
+base [ACGTacgtNn.]
+cskey [ACGTacgt]
+color [0-3.]
+
+ascqual [\x0E-\x1F \x21-\x7F]+
+
+%%
+
+^@ { BEGIN TAG_LINE; return yytext[0]; }
+^> { BEGIN TAG_LINE; return yytext[0]; }
+
+^\+ { BEGIN QTAG_LINE; return yytext[0]; }
+
+<INITIAL,TAG_LINE>
+{
+ :{digits}:{digits}:{digits}:{digits} { return fqCOORDS; }
+ [SDE]RR{digits}\.{digits} { return fqRUNDOTSPOT; }
+ #[A-Za-z0-9\-_]* { return fqSPOTGROUP; }
+ {digits} { return fqNUMBER; }
+ {alphanum} { return fqALPHANUM; }
+ {ws} { return fqWS; }
+ ^{base}+/{eol} { return fqBASESEQ; }
+ ^{cskey}{color}+/{eol} { return fqCOLORSEQ; }
+ . { return yytext[0]; }
+}
+
+<TAG_LINE>[ \t]*{eol} { BEGIN IN_SEQUENCE; ENDLINE; }
+
+<IN_SEQUENCE>
+{
+ ^{base}+/{eol} { BEGIN 0; return fqBASESEQ; }
+ ^{cskey}{color}+/{eol} { BEGIN 0; return fqCOLORSEQ; }
+ ^{ascqual}/{eol} { BEGIN 0; return fqASCQUAL; }
+ ^.*$ { BEGIN 0; return fqUNRECOGNIZED; }
+}
+
+<INLINE_SEQUENCE>
+{
+ {base}+ { BEGIN 0; return fqBASESEQ; }
+ {cskey}{color}+ { BEGIN 0; return fqCOLORSEQ; }
+ {digits} { BEGIN 0; return fqNUMBER; }
+ {eol} { BEGIN 0; ENDLINE; }
+}
+
+<QTAG_LINE>
+{
+ .+$ { return fqTOKEN; /* do not bother to parse the inside of the line */ }
+ {eol} { BEGIN IN_QUALITY; ENDLINE }
+}
+
+<IN_QUALITY,INLINE_QUALITY>
+{
+ {ws} { }
+}
+
+<IN_QUALITY>
+{
+ ^{ascqual}/{eol} { return fqASCQUAL; }
+ {eol} { /* if read was split across several lines, expect the same number of lines in quality */
+ if (yyextra->expectedQualityLines <= 1)
+ BEGIN 0;
+ else
+ --yyextra->expectedQualityLines;
+ ENDLINE;
+ }
+ . { return yytext[0]; }
+}
+
+<INLINE_QUALITY>
+{
+ {ascqual}/{eol} { return fqASCQUAL; }
+ {eol} { BEGIN 0; ENDLINE; }
+ . { return yytext[0]; }
+}
+
+<SKIP_TO_EOL>
+{
+ .*{eol} { BEGIN 0; ENDLINE; }
+ .* { BEGIN 0; return fqENDOFTEXT; }
+}
+
+{eol} { ENDLINE; }
+
+%%
+
+rc_t CC FASTQScan_yylex_init(FASTQParseBlock* sb, bool debug)
+{
+ if (yylex_init_extra(sb, &sb->scanner) != 0)
+ {
+ return RC ( rcApp, rcFile, rcParsing, rcMemory, rcExhausted );
+ }
+
+ sb->length = 0;
+ sb->lastToken = NULL;
+ sb->record = NULL;
+ sb->column = 1;
+
+ sb->expectedQualityLines = 0;
+
+ yyset_debug(debug ? 1 : 0, sb->scanner);
+
+ yy_push_state(INITIAL, sb->scanner);
+
+ return 0;
+}
+
+void CC FASTQScan_yylex_destroy(FASTQParseBlock* sb)
+{
+ if (sb->scanner)
+ {
+ yylex_destroy(sb->scanner);
+ }
+ sb->scanner=0;
+}
+
+void CC FASTQScan_inline_sequence(FASTQParseBlock* pb)
+{
+ yy_pop_state(pb->scanner);
+ yy_push_state(INLINE_SEQUENCE, pb->scanner);
+}
+
+void CC FASTQScan_inline_quality(FASTQParseBlock* pb)
+{
+ yy_pop_state(pb->scanner);
+ yy_push_state(INLINE_QUALITY, pb->scanner);
+}
+
+void CC FASTQScan_skip_to_eol(FASTQParseBlock* pb)
+{
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+ if ( yytext[0] != '\n' && yytext[0] != '\r' ) /* not at an EOL already */
+ {
+ yy_push_state(SKIP_TO_EOL, pb->scanner);
+ }
+}
+
+void CC FASTQ_unlex(FASTQParseBlock* pb, FASTQToken* token)
+{
+ size_t i;
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+ for (i = 0; i < token->tokenLength; ++i)
+ {
+ yyunput(TokenTextPtr(pb, token)[token->tokenLength - 1 - i], yyg->yytext_r, pb->scanner);
+ }
+ yyextra -> column -= token->tokenLength;
+ yyextra -> length -= token->tokenLength;
+ KDataBufferResize( & pb->record->source, KDataBufferBytes( & pb->record->source ) - token->tokenLength );
+}
+
+void FASTQ_fatal_error(yyconst char* msg)
+{
+ rc_t rc = RC ( rcApp, rcFile, rcParsing, rcError, rcUnexpected );
+ if (strcmp(msg, "input buffer overflow, can't enlarge buffer because scanner uses REJECT") == 0)
+ pLogErr(klogErr, rc, "line is too long (maximum line length = $(B) bytes)", "B=%d", YY_BUF_SIZE);
+ else
+ LogErr(klogErr, rc, msg);
+ exit(rc);
+}
+
+void ConsumeToken(FASTQToken* token, FASTQParseBlock* pb)
+{
+ struct yyguts_t* yyg = (struct yyguts_t*)pb->scanner;
+
+ token -> tokenStart = KDataBufferBytes( & pb->record->source );
+ token -> tokenLength = yyleng;
+ token -> line_no = yylineno;
+ token -> column_no = pb -> column;
+
+ KDataBufferResize( & pb->record->source, KDataBufferBytes( & pb->record->source ) + token->tokenLength );
+ strncpy((char*)TokenTextPtr(pb, token), yytext, token->tokenLength);
+
+ pb -> column += token->tokenLength;
+ pb -> length += token->tokenLength;
+ pb -> lastToken = token;
+}
\ No newline at end of file
diff --git a/tools/fastq-loader/fastq-loader.c b/tools/fastq-loader/fastq-loader.c
new file mode 100644
index 0000000..43f3e7d
--- /dev/null
+++ b/tools/fastq-loader/fastq-loader.c
@@ -0,0 +1,626 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sysalloc.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <ctype.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kapp/log-xml.h>
+#include <align/writer-refseq.h>
+#include <insdc/sra.h>
+#include <sra/sradb.h>
+#include "common-writer.h"
+
+#include "fastq-parse.h"
+
+extern rc_t run(char const argv0[],
+ struct CommonWriterSettings* G,
+ unsigned countReads,
+ const char* reads[],
+ enum FASTQQualityFormat qualityFormat,
+ const int8_t defaultReadNumbers[],
+ bool ignoreSpotGroups);
+
+/* MARK: Arguments and Usage */
+static char const option_input[] = "input";
+static char const option_output[] = "output";
+static char const option_tmpfs[] = "tmpfs";
+static char const option_qual_compress[] = "qual-quant";
+static char const option_cache_size[] = "cache-size";
+static char const option_max_err_count[] = "max-err-count";
+static char const option_max_rec_count[] = "max-rec-count";
+static char const option_platform[] = "platform";
+static char const option_quality[] = "quality";
+static char const option_read[] = "read";
+static char const option_max_err_pct[] = "max-err-pct";
+static char const option_ignore_illumina_tags[] = "ignore-illumina-tags";
+
+#define OPTION_INPUT option_input
+#define OPTION_OUTPUT option_output
+#define OPTION_TMPFS option_tmpfs
+#define OPTION_QCOMP option_qual_compress
+#define OPTION_CACHE_SIZE option_cache_size
+#define OPTION_MAX_ERR_COUNT option_max_err_count
+#define OPTION_MAX_REC_COUNT option_max_rec_count
+#define OPTION_PLATFORM option_platform
+#define OPTION_QUALITY option_quality
+#define OPTION_READ option_read
+#define OPTION_MAX_ERR_PCT option_max_err_pct
+#define OPTION_IGNORE_ILLUMINA_TAGS option_ignore_illumina_tags
+
+#define ALIAS_INPUT "i"
+#define ALIAS_OUTPUT "o"
+#define ALIAS_TMPFS "t"
+#define ALIAS_QCOMP "Q"
+#define ALIAS_MAX_ERR_COUNT "E"
+#define ALIAS_PLATFORM "p"
+#define ALIAS_READ "r"
+/* this alias is deprecated (conflicts with -q for --quiet): */
+#define ALIAS_QUALITY "q"
+
+static
+char const * output_usage[] =
+{
+ "Path and Name of the output database.",
+ NULL
+};
+
+static
+char const * tmpfs_usage[] =
+{
+ "Path to be used for scratch files.",
+ NULL
+};
+
+static
+char const * qcomp_usage[] =
+{
+ "Quality scores quantization level, can be a number (0: none - default, 1: 2bit, 2: 1bit), or a string like '1:10,10:20,20:30,30:-' (which is equivalent to 1).",
+ NULL
+};
+
+static
+char const * cache_size_usage[] =
+{
+ "Set the cache size in MB for the temporary indices",
+ NULL
+};
+
+static
+char const * mrc_usage[] =
+{
+ "Set the maximum number of records to process from the FASTQ file",
+ NULL
+};
+
+static
+char const * mec_usage[] =
+{
+ "Set the maximum number of errors to ignore from the FASTQ file",
+ NULL
+};
+
+static
+char const * use_platform[] =
+{
+ "Platform (ILLUMINA, LS454, SOLID, COMPLETE_GENOMICS, HELICOS, PACBIO, IONTORRENT, CAPILLARY)",
+ NULL
+};
+
+static
+char const * use_quality[] =
+{
+ "Quality encoding (PHRED_33, PHRED_64, LOGODDS)",
+ NULL
+};
+
+/*static
+char const * use_read[] =
+{
+ "Default read number (1 or 2)",
+ NULL
+};*/
+
+static
+char const * use_max_err_pct[] =
+{
+ "acceptable percentage of spots creation errors, default is 5",
+ NULL
+};
+
+static
+char const * use_ignore_illumina_tags[] =
+{
+ "ignore barcodes contained in Illumina-formatted names",
+ NULL
+};
+
+OptDef Options[] =
+{
+ /* order here is same as in param array below!!! */ /* max#, needs param, required */
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, true },
+ { OPTION_TMPFS, ALIAS_TMPFS, NULL, tmpfs_usage, 1, true, false },
+ { OPTION_QCOMP, ALIAS_QCOMP, NULL, qcomp_usage, 1, true, false },
+ { OPTION_CACHE_SIZE, NULL, NULL, cache_size_usage, 1, true, false },
+ { OPTION_MAX_REC_COUNT, NULL, NULL, mrc_usage, 1, true, false },
+ { OPTION_MAX_ERR_COUNT, ALIAS_MAX_ERR_COUNT, NULL, mec_usage, 1, true, false },
+ { OPTION_PLATFORM, ALIAS_PLATFORM, NULL, use_platform, 1, true, false },
+ { OPTION_QUALITY, ALIAS_QUALITY, NULL, use_quality, 1, true, true },
+ { OPTION_MAX_ERR_PCT, NULL, NULL, use_max_err_pct, 1, true, false },
+ { OPTION_IGNORE_ILLUMINA_TAGS, NULL, NULL, use_ignore_illumina_tags, 1, false, false },
+/* { OPTION_READ, ALIAS_READ, NULL, use_read, 0, true, false },*/
+};
+
+const char* OptHelpParam[] =
+{
+ /* order here is same as in OptDef array above!!! */
+ "path",
+ "path-to-file",
+ "phred-score",
+ "mbytes",
+ "count",
+ "count",
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+rc_t UsageSummary (char const * progname)
+{
+ return KOutMsg (
+ "Usage:\n"
+ "\t%s [options] <fastq-file> ...\n"
+ "\n"
+ "Summary:\n"
+ "\tLoad FASTQ formatted data files\n"
+ "\n"
+ "Example:\n"
+ "\t%s -p 454 -o /tmp/SRZ123456 123456-1.fastq 123456-2.fastq\n"
+ "\n"
+ ,progname, progname);
+}
+
+char const UsageDefaultName[] = "fastq-load";
+
+rc_t CC Usage (const Args * args)
+{
+ rc_t rc;
+ int i;
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ const size_t argsQty = sizeof(Options) / sizeof(Options[0]);
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ for(i = 0; i < argsQty; i++ ) {
+ if( Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < argsQty; i++ ) {
+ if( !Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ XMLLogger_Usage();
+ OUTMSG(("\n"));
+ HelpOptionsStandard ();
+ HelpVersion (fullpath, KAppVersion());
+ return rc;
+}
+
+/* MARK: Definitions and Globals */
+
+#define SCHEMAFILE "align/align.vschema"
+
+CommonWriterSettings G;
+
+#ifdef _WIN32
+#include <process.h>
+#else
+#include <unistd.h>
+#endif
+static void set_pid(void)
+{
+ G.pid = getpid();
+}
+
+static bool platform_cmp(char const platform[], char const test[])
+{
+ unsigned i;
+
+ for (i = 0; ; ++i) {
+ int ch1 = test[i];
+ int ch2 = toupper(platform[i]);
+
+ if (ch1 != ch2)
+ break;
+ if (ch1 == 0)
+ return true;
+ }
+ return false;
+}
+
+static INSDC_SRA_platform_id PlatformToId(const char* name)
+{
+ if (name != NULL)
+ {
+ switch (toupper(name[0])) {
+ case 'C':
+ if (platform_cmp(name, "CAPILLARY"))
+ return SRA_PLATFORM_CAPILLARY;
+ if (platform_cmp(name, "COMPLETE GENOMICS") || platform_cmp(name, "COMPLETE_GENOMICS"))
+ return SRA_PLATFORM_COMPLETE_GENOMICS;
+ break;
+ case 'H':
+ if (platform_cmp(name, "HELICOS"))
+ return SRA_PLATFORM_HELICOS;
+ break;
+ case 'I':
+ if (platform_cmp(name, "ILLUMINA"))
+ return SRA_PLATFORM_ILLUMINA;
+ if (platform_cmp(name, "IONTORRENT"))
+ return SRA_PLATFORM_ION_TORRENT;
+ break;
+ case 'L':
+ if (platform_cmp(name, "LS454"))
+ return SRA_PLATFORM_454;
+ break;
+ case 'N':
+ if (platform_cmp(name, "NANOPORE"))
+ return SRA_PLATFORM_OXFORD_NANOPORE;
+ break;
+ case 'O':
+ if (platform_cmp(name, "OXFORD_NANOPORE"))
+ return SRA_PLATFORM_OXFORD_NANOPORE;
+ break;
+ case 'P':
+ if (platform_cmp(name, "PACBIO"))
+ return SRA_PLATFORM_PACBIO_SMRT;
+ break;
+ case 'S':
+ if (platform_cmp(name, "SOLID"))
+ return SRA_PLATFORM_ABSOLID;
+ if (platform_cmp(name, "SANGER"))
+ return SRA_PLATFORM_CAPILLARY;
+ break;
+ default:
+ break;
+ }
+ }
+ return SRA_PLATFORM_UNDEFINED;
+}
+
+static rc_t PathWithBasePath(char rslt[], size_t sz, char const path[], char const base[])
+{
+ size_t const plen = strlen(path);
+ bool const hasBase = base && base[0];
+ bool const isBareName = strchr(path, '/') == NULL;
+
+ if (isBareName && hasBase) {
+ if (string_printf(rslt, sz, NULL, "%s/%s", base, path) == 0)
+ return 0;
+ }
+ else if ( string_copy ( rslt, sz, path, plen ) < sz )
+ return 0;
+
+ {
+ rc_t const rc = RC(rcApp, rcArgv, rcAccessing, rcBuffer, rcInsufficient);
+ (void)LOGERR(klogErr, rc, "The path to the file is too long");
+ return rc;
+ }
+}
+
+rc_t CC KMain (int argc, char * argv[])
+{
+ Args * args;
+ rc_t rc;
+ char *files[256];
+ int8_t defaultReadNumbers[256];
+ char *name_buffer = NULL;
+ size_t next_name = 0;
+ size_t nbsz = 0;
+ char const *value;
+ char *dummy;
+ const XMLLogger* xml_logger = NULL;
+ enum FASTQQualityFormat qualityFormat;
+ bool ignoreSpotGroups;
+
+ memset(&G, 0, sizeof(G));
+
+ G.mode = mode_Archive;
+ G.maxSeqLen = TableWriterRefSeq_MAX_SEQ_LEN;
+ G.schemaPath = SCHEMAFILE;
+ G.omit_aligned_reads = true;
+ G.omit_reference_reads = true;
+ G.minMapQual = 0; /* accept all */
+ G.tmpfs = "/tmp";
+#if _ARCH_BITS == 32
+ G.cache_size = ( size_t ) 1 << 30;
+#else
+ G.cache_size = ( size_t ) 10 << 30;
+#endif
+ G.maxErrCount = 1000;
+ G.maxErrPct = 5;
+ G.acceptNoMatch = true;
+ G.minMatchCount = 0;
+ G.QualQuantizer="0";
+
+ set_pid();
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 2, Options,
+ sizeof Options / sizeof (OptDef), XMLLogger_Args, XMLLogger_ArgsQty);
+
+ while (rc == 0) {
+ uint32_t pcount;
+
+ if( (rc = XMLLogger_Make(&xml_logger, NULL, args)) != 0 ) {
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_TMPFS, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_TMPFS, 0, (const void **)&G.tmpfs);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_OUTPUT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_OUTPUT, 0, (const void **)&G.outpath);
+ if (rc)
+ break;
+ }
+ else if (pcount > 1)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ OUTMSG (("Single output parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+ else {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcInsufficient);
+ OUTMSG (("Output parameter required\n"));
+ MiniUsage (args);
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_QCOMP, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_QCOMP, 0, (const void **)&G.QualQuantizer);
+ if (rc)
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_CACHE_SIZE, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_CACHE_SIZE, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.cache_size = strtoul(value, &dummy, 0) * 1024UL * 1024UL;
+ if (G.cache_size == 0 || G.cache_size == ULONG_MAX) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcIncorrect);
+ OUTMSG (("cache-size: bad value\n"));
+ MiniUsage (args);
+ break;
+ }
+ }
+
+ G.expectUnsorted = true;
+
+ rc = ArgsOptionCount (args, OPTION_MAX_REC_COUNT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_REC_COUNT, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxAlignCount = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MAX_ERR_COUNT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_ERR_COUNT, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxErrCount = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_MAX_ERR_PCT, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_MAX_ERR_PCT, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.maxErrPct = strtoul(value, &dummy, 0);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_PLATFORM, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_PLATFORM, 0, (const void **)&value);
+ if (rc)
+ break;
+ G.platform = PlatformToId(value);
+ if (G.platform == SRA_PLATFORM_UNDEFINED)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcIncorrect);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Invalid platform $(v)",
+ "v=%s", value));
+ break;
+ }
+ }
+ else
+ G.platform = SRA_PLATFORM_UNDEFINED;
+
+ rc = ArgsOptionCount (args, OPTION_QUALITY, &pcount);
+ if (rc)
+ break;
+ if (pcount == 1)
+ {
+ rc = ArgsOptionValue (args, OPTION_QUALITY, 0, (const void **)&value);
+ if (rc)
+ break;
+ if (strcmp(value, "PHRED_33") == 0)
+ qualityFormat = FASTQphred33;
+ else if (strcmp(value, "PHRED_64") == 0)
+ qualityFormat = FASTQphred64;
+ else if (strcmp(value, "LOGODDS") == 0)
+ qualityFormat = FASTQlogodds;
+ else
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcIncorrect);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Invalid quality encoding $(v)",
+ "v=%s", value));
+ break;
+ }
+ }
+ else
+ qualityFormat = 0;
+
+ rc = ArgsOptionCount (args, OPTION_IGNORE_ILLUMINA_TAGS, &pcount);
+ if (rc)
+ break;
+ ignoreSpotGroups = pcount > 0;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc) break;
+ if (pcount == 0)
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcInsufficient);
+ MiniUsage (args);
+ break;
+ }
+ else if (pcount > sizeof(files)/sizeof(files[0])) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ (void)PLOGERR(klogErr, (klogErr, rc, "$(count) input files is too many, $(max) is the limit",
+ "count=%u,max=%u", (unsigned)pcount, (unsigned)(sizeof(files)/sizeof(files[0]))));
+ break;
+ }
+ else {
+ size_t need = G.inpath ? (strlen(G.inpath) + 1) * pcount : 0;
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsParamValue(args, i, (const void **)&value);
+ if (rc) break;
+ need += strlen(value) + 1;
+ }
+ nbsz = need;
+ }
+
+ name_buffer = malloc(nbsz);
+ if (name_buffer == NULL) {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted);
+ break;
+ }
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc == 0) {
+ unsigned i;
+
+ for (i = 0; i < pcount; ++i) {
+ rc = ArgsParamValue(args, i, (const void **)&value);
+ if (rc) break;
+
+ defaultReadNumbers[i] = 0;
+ files[i] = name_buffer + next_name;
+ rc = PathWithBasePath(name_buffer + next_name, nbsz - next_name, value, G.inpath);
+ if (rc) break;
+ next_name += strlen(name_buffer + next_name) + 1;
+ }
+ }
+ else
+ break;
+
+ rc = run(argv[0], &G, pcount, (char const **)files, qualityFormat, defaultReadNumbers, ignoreSpotGroups);
+ break;
+ }
+ free(name_buffer);
+
+ value = G.outpath ? strrchr(G.outpath, '/') : "/???";
+ if( value == NULL ) {
+ value = G.outpath;
+ } else {
+ value++;
+ }
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "load failed",
+ "severity=total,status=failure,accession=%s,errors=%u", value, G.errCount));
+ } else {
+ (void)PLOGMSG(klogInfo, (klogInfo, "loaded",
+ "severity=total,status=success,accession=%s,errors=%u", value, G.errCount));
+ }
+ ArgsWhack(args);
+ XMLLogger_Release(xml_logger);
+ return rc;
+}
diff --git a/tools/fastq-loader/fastq-parse.h b/tools/fastq-loader/fastq-parse.h
new file mode 100644
index 0000000..79a6b76
--- /dev/null
+++ b/tools/fastq-loader/fastq-parse.h
@@ -0,0 +1,169 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_fastq_parse_
+#define _h_fastq_parse_
+
+#include <align/extern.h>
+#include <klib/text.h>
+
+#include <loader/common-reader-priv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum FASTQQualityFormat
+{
+ FASTQunknown,
+ FASTQphred33,
+ FASTQphred64,
+ FASTQlogodds
+};
+
+struct FastqSequence
+{
+ Sequence_vt sequence_vt;
+ KRefcount refcount;
+
+ /* tagline components: */
+ String spotname; /* tag line up to and including coordinates */
+ String spotgroup; /* token following '#' */
+ uint8_t readnumber; /* token following '/' 1 - IsFirst, 2 - IsSecond, 0 - dont know */
+
+ /* not populated at this time: */
+#if 0
+ String rungroup;
+ String fmt_name; /* x and y replaced with $X and $Y */
+ uint8_t coord_num;
+ int32_t coords[16];
+#endif
+
+ /* read bases */
+ String read;
+
+ bool is_colorspace;
+
+ String quality;
+ uint8_t qualityFormat;
+ uint8_t qualityAsciiOffset;
+
+ bool lowQuality;
+};
+
+struct FastqRecord
+{
+ Record dad;
+
+ KDataBuffer source;
+ struct FastqSequence seq;
+ Rejected* rej;
+};
+
+typedef struct FASTQToken
+{
+ size_t tokenStart; /* offset into FASTQParseBlock.record->source */
+ size_t tokenLength;
+ size_t line_no;
+ size_t column_no;
+} FASTQToken;
+
+/* obtain a pointer to the token's text */
+#define TokenTextPtr(pb, token) ((const char*)((pb)->record->source.base) + (token)->tokenStart)
+
+typedef struct FASTQParseBlock
+{
+ void* self;
+ size_t (CC *input)(struct FASTQParseBlock* sb, char* buf, size_t max_size);
+
+ /* inputs for the parser */
+ size_t expectedQualityLines;
+ uint8_t qualityFormat; /* see enum FASTQQualityFormat above */
+ int8_t defaultReadNumber; /* -1: never assign read numbers */
+
+ /* Secondary (>1) read number observed previously (usually 2, sometimes 3).
+ Once one is seen, do not allow any other values in the same input file.
+ 0 = has not seen one yet in this input.
+ Always record as 2 */
+ uint8_t secondaryReadNumber;
+
+ bool ignoreSpotGroups;
+
+ /* temporaries and outputs for the parser */
+ void* scanner;
+ size_t length; /* input characters consumed for the current record */
+ FASTQToken* lastToken;
+ struct FastqRecord* record;
+ size_t column;
+
+ /* all offsets are into record->source */
+ size_t spotNameOffset;
+ size_t spotNameLength;
+ size_t spotNameOffset_saved; /* sometimes needed to revert to older values */
+ size_t spotNameLength_saved;
+ bool spotNameDone;
+
+ size_t spotGroupOffset;
+ size_t spotGroupLength;
+
+ size_t readOffset;
+ size_t readLength;
+
+ size_t qualityOffset;
+ size_t qualityLength;
+ uint8_t qualityAsciiOffset;
+
+ bool fatalError;
+} FASTQParseBlock;
+
+extern rc_t FASTQScan_yylex_init(FASTQParseBlock* context, bool debug);
+extern void FASTQScan_yylex_destroy(FASTQParseBlock* context);
+
+/* explicit FLEX state control for bison*/
+extern void FASTQScan_inline_sequence(FASTQParseBlock* pb);
+extern void FASTQScan_inline_quality(FASTQParseBlock* pb);
+extern void FASTQScan_skip_to_eol(FASTQParseBlock* pb); /*the next token will be EOL or EOF*/
+
+extern void FASTQ_set_lineno (int line_number, void* scanner);
+
+extern int FASTQ_lex(FASTQToken* pb, void * scanner);
+extern void FASTQ_unlex(FASTQParseBlock* pb, FASTQToken* token);
+extern void FASTQ_qualityContext(FASTQParseBlock* pb);
+
+extern int FASTQ_debug; /* set to 1 to print Bison trace */
+
+extern int FASTQ_parse(FASTQParseBlock* pb); /* 0 = end of input, 1 = success, a new record is in context->record, 2 - syntax error */
+
+/* call before parsing every record (FASTQ_parse does so internally; this is for testing the parser) */
+extern void FASTQ_ParseBlockInit(FASTQParseBlock* pb);
+
+extern void FASTQ_error(FASTQParseBlock* pb, const char* msg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_fastq_parse_ */
diff --git a/tools/fastq-loader/fastq-reader.c b/tools/fastq-loader/fastq-reader.c
new file mode 100644
index 0000000..4f2c564
--- /dev/null
+++ b/tools/fastq-loader/fastq-reader.c
@@ -0,0 +1,709 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct FastqReaderFile FastqReaderFile;
+typedef struct FastqRecord FastqRecord;
+typedef struct FastqSequence FastqSequence;
+
+#define READERFILE_IMPL FastqReaderFile
+#define RECORD_IMPL FastqRecord
+#define SEQUENCE_IMPL FastqSequence
+
+#include "fastq-reader.h"
+#include "fastq-parse.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#include <kapp/loader-file.h>
+#include <kfs/directory.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+static rc_t FastqSequenceInit(FastqSequence* self);
+
+/*--------------------------------------------------------------------------
+ * FastqRecord
+ */
+static rc_t FastqRecordAddRef ( const FastqRecord* self );
+static rc_t FastqRecordRelease ( const FastqRecord* self );
+static rc_t FastqRecordGetSequence ( const FastqRecord* self, const Sequence** result);
+static rc_t FastqRecordGetAlignment ( const FastqRecord* self, const Alignment** result);
+static rc_t FastqRecordGetRejected ( const FastqRecord* self, const Rejected** result);
+
+static Record_vt_v1 FastqRecord_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ FastqRecordAddRef,
+ FastqRecordRelease,
+ FastqRecordGetSequence,
+ FastqRecordGetAlignment,
+ FastqRecordGetRejected,
+ /* end minor version == 0 */
+};
+
+static rc_t CC FastqRecordInit ( FastqRecord* self )
+{
+ assert(self);
+ self->dad.vt.v1 = & FastqRecord_vt;
+ KDataBufferMakeBytes ( & self->source, 0 );
+ self->rej = 0;
+ return FastqSequenceInit(& self->seq);
+}
+
+static rc_t FastqRecordWhack( const FastqRecord* cself )
+{
+ rc_t rc = 0;
+ FastqRecord* self = (FastqRecord*)cself;
+ assert(self);
+
+ rc = KDataBufferWhack( & self->source );
+
+ if (rc)
+ RejectedRelease(self->rej);
+ else
+ rc = RejectedRelease(self->rej);
+
+ free(self);
+
+ return rc;
+}
+
+static rc_t FastqRecordAddRef( const FastqRecord* self )
+{
+ assert(self);
+ KRefcountAdd( & self->seq.refcount, "FastqRecord" );
+ /* TODO: handle rc from KRefcountAdd */
+ return 0;
+}
+
+static rc_t FastqRecordRelease( const FastqRecord* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqRecord *self = ( FastqRecord* ) cself;
+ switch ( KRefcountDrop ( & self ->seq.refcount, "FastqRecord" ) )
+ {
+ case krefWhack:
+ FastqRecordWhack( self );
+ break;
+ default:
+ /* TODO: handle other values */
+ break;
+ }
+ }
+ return 0;
+}
+
+static rc_t FastqRecordGetSequence( const FastqRecord* self, const Sequence** result )
+{
+ rc_t rc = 0;
+ assert(result);
+ *result = 0;
+ if (self->rej == 0)
+ {
+ rc = FastqRecordAddRef(self);
+ if (rc == 0)
+ *result = (const Sequence*) & self->seq;
+ }
+ return rc;
+}
+
+static rc_t FastqRecordGetAlignment( const FastqRecord* self, const Alignment** result)
+{
+ *result = 0;
+ return 0;
+}
+
+static rc_t FastqRecordGetRejected( const FastqRecord* self, const Rejected** result)
+{
+ rc_t rc = 0;
+ assert(result);
+ *result = 0;
+ if (self->rej != 0)
+ {
+ rc = RejectedAddRef(self->rej);
+ if (rc == 0)
+ *result = self->rej;
+ }
+ return rc;
+}
+
+/*--------------------------------------------------------------------------
+ * FastqSequence
+ */
+
+static rc_t FastqSequenceAddRef ( const SEQUENCE_IMPL* self );
+static rc_t FastqSequenceRelease ( const SEQUENCE_IMPL* self );
+static rc_t FastqSequenceGetReadLength ( const SEQUENCE_IMPL *self, uint32_t *length );
+static rc_t FastqSequenceGetRead ( const SEQUENCE_IMPL *self, char *sequence );
+static rc_t FastqSequenceGetRead2 ( const SEQUENCE_IMPL *self, char *sequence, uint32_t start, uint32_t stop );
+static rc_t FastqSequenceGetQuality ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+static rc_t FastqSequenceGetSpotGroup ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+static rc_t FastqSequenceGetSpotName ( const SEQUENCE_IMPL *self, const char **name, size_t *length );
+static bool FastqSequenceIsColorSpace ( const SEQUENCE_IMPL *self );
+static rc_t FastqSequenceGetCSKey ( const SEQUENCE_IMPL *self, char cskey[1] );
+static rc_t FastqSequenceGetCSReadLength ( const SEQUENCE_IMPL *self, uint32_t *length );
+static rc_t FastqSequenceGetCSRead ( const SEQUENCE_IMPL *self, char *sequence );
+static rc_t FastqSequenceGetCSQuality ( const SEQUENCE_IMPL *self, const int8_t **quality, uint8_t *offset, int *qualType );
+static bool FastqSequenceRecordWasPaired ( const SEQUENCE_IMPL *self );
+static int FastqSequenceGetOrientationSelf ( const SEQUENCE_IMPL *self );
+static int FastqSequenceGetOrientationMate ( const SEQUENCE_IMPL *self );
+static bool FastqSequenceRecordIsFirst ( const SEQUENCE_IMPL *self );
+static bool FastqSequenceRecordIsSecond ( const SEQUENCE_IMPL *self );
+static bool FastqSequenceIsDuplicate ( const SEQUENCE_IMPL *self );
+static bool FastqSequenceIsLowQuality ( const SEQUENCE_IMPL *self );
+static rc_t FastqSequenceGetTI ( const SEQUENCE_IMPL *self, uint64_t *ti );
+
+static Sequence_vt_v1 FastqSequence_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ FastqSequenceAddRef,
+ FastqSequenceRelease,
+ FastqSequenceGetReadLength,
+ FastqSequenceGetRead,
+ FastqSequenceGetRead2,
+ FastqSequenceGetQuality,
+ FastqSequenceGetSpotGroup,
+ FastqSequenceGetSpotName,
+ FastqSequenceIsColorSpace,
+ FastqSequenceGetCSKey,
+ FastqSequenceGetCSReadLength,
+ FastqSequenceGetCSRead,
+ FastqSequenceGetCSQuality,
+ FastqSequenceRecordWasPaired,
+ FastqSequenceGetOrientationSelf,
+ FastqSequenceGetOrientationMate,
+ FastqSequenceRecordIsFirst,
+ FastqSequenceRecordIsSecond,
+ FastqSequenceIsDuplicate,
+ FastqSequenceIsLowQuality,
+ FastqSequenceGetTI,
+ /* end minor version == 0 */
+};
+
+static
+rc_t
+FastqSequenceInit(FastqSequence* self)
+{
+ self->sequence_vt.v1 = & FastqSequence_vt;
+ KRefcountInit ( & self -> refcount, 1, "FastqSequence", "FastqSequenceInit", "");
+
+ StringInit(&self->spotname, 0, 0, 0);
+ StringInit(&self->spotgroup, 0, 0, 0);
+ self->readnumber = 0;
+ StringInit(&self->read, 0, 0, 0);
+ self->is_colorspace = false;
+ StringInit(&self->quality, 0, 0, 0);
+ self->qualityAsciiOffset = 0;
+ self->lowQuality = false;
+
+ return 0;
+}
+
+static const FastqRecord*
+FastqSequenceToRecord(const FastqSequence* seq)
+{
+ return ( const FastqRecord * ) ( (uint8_t*)seq - offsetof ( FastqRecord, seq ) );
+}
+
+static rc_t FastqSequenceAddRef( const FastqSequence* self )
+{
+ switch (KRefcountAdd( & self->refcount, "FastqSequence" ))
+ {
+ case krefLimit:
+ return RC ( RC_MODULE, rcData, rcAttaching, rcRange, rcExcessive );
+ case krefNegative:
+ return RC ( RC_MODULE, rcData, rcAttaching, rcRefcount, rcInvalid );
+ }
+ return 0;
+}
+
+static rc_t FastqSequenceRelease( const FastqSequence* self )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "FastqSequence" ) )
+ {
+ case krefWhack:
+ return FastqRecordWhack ( FastqSequenceToRecord(self) );
+
+ case krefNegative:
+ return RC ( RC_MODULE, rcData, rcDestroying, rcSelf, rcDestroyed );
+ }
+ }
+
+ return 0;
+
+}
+
+static rc_t FastqSequenceGetReadLength ( const FastqSequence *self, uint32_t *length )
+{
+ assert(self);
+ if ( self->is_colorspace )
+ {
+ *length = 0;
+ }
+ else
+ {
+ *length = self->read.len;
+ }
+ return 0;
+}
+
+static rc_t FastqSequenceGetRead ( const FastqSequence *self, char *sequence )
+{
+ assert(self);
+ assert(sequence);
+ if ( !self->is_colorspace )
+ string_copy(sequence, self->read.len, self->read.addr, self->read.len);
+ return 0;
+}
+
+static rc_t FastqSequenceGetRead2 ( const FastqSequence *self, char *sequence, uint32_t start, uint32_t stop )
+{
+ assert(self);
+ assert(sequence);
+ if ( self->is_colorspace )
+ {
+ return RC( RC_MODULE, rcData, rcAccessing, rcItem, rcEmpty );
+ }
+ else
+ {
+ uint32_t length = self->read.len;
+ if (start >= length || stop >= length || start >= stop)
+ {
+ return RC( RC_MODULE, rcData, rcAccessing, rcRange, rcInvalid);
+ }
+ string_copy(sequence, stop - start, self->read.addr + start, stop - start);
+ }
+ return 0;
+}
+
+static rc_t FastqSequenceGetQuality ( const FastqSequence *self, const int8_t **quality, uint8_t *offset, int *qualType )
+{
+ assert(self);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ *quality = NULL;
+ if ( self->quality.size != 0)
+ {
+ uint32_t length = self->read.len;
+ if (self->quality.size != length)
+ return RC( RC_MODULE, rcData, rcReading, rcData, rcInconsistent);
+
+ *quality = (const int8_t *)self->quality.addr;
+ *offset = self->qualityAsciiOffset;
+ }
+ else
+ {
+ *quality = NULL;
+ *offset = 0;
+ }
+ if ( self->qualityFormat == FASTQlogodds )
+ {
+ *qualType = QT_LogOdds;
+ }
+ else
+ {
+ *qualType = QT_Phred;
+ }
+ return 0;
+}
+
+static rc_t FastqSequenceGetSpotGroup ( const FastqSequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(name);
+ *name = self->spotgroup.addr;
+ *length = self->spotgroup.len;
+ return 0;
+}
+
+static rc_t FastqSequenceGetSpotName ( const FastqSequence *self, const char **name, size_t *length )
+{
+ assert(self);
+ assert(name);
+ *name = self->spotname.addr;
+ *length = self->spotname.len;
+ return 0;
+}
+
+static bool FastqSequenceIsColorSpace ( const FastqSequence *self )
+{
+ assert(self);
+ return self->is_colorspace;
+}
+
+static rc_t FastqSequenceGetCSKey ( const FastqSequence *self, char cskey[1] )
+{
+ assert(self);
+ if (self->is_colorspace)
+ cskey[0] = self->read.addr[0];
+ return 0;
+}
+
+static rc_t FastqSequenceGetCSReadLength ( const FastqSequence *self, uint32_t *length )
+{
+ assert(self);
+ if (self->is_colorspace)
+ *length = self->read.len - 1;
+ return 0;
+}
+
+static rc_t FastqSequenceGetCSRead ( const FastqSequence *self, char *sequence )
+{
+ assert(self);
+ assert(sequence);
+ if ( self->is_colorspace )
+ string_copy(sequence, self->read.len - 1, self->read.addr + 1, self->read.len - 1);
+ return 0;
+}
+
+static rc_t FastqSequenceGetCSQuality ( const FastqSequence *self, const int8_t **quality, uint8_t *offset, int *qualType )
+{
+ assert(self);
+ assert(quality);
+ assert(offset);
+ assert(qualType);
+ *quality = NULL;
+ if ( self->quality.size != 0 && self->is_colorspace )
+ {
+ *quality = (const int8_t *)self->quality.addr + 1;
+ *offset = self->qualityAsciiOffset;
+ }
+ else
+ {
+ *quality = NULL;
+ *offset = 0;
+ }
+ *qualType = QT_Phred;
+ return 0;
+}
+
+static bool FastqSequenceRecordWasPaired ( const FastqSequence *self )
+{
+ assert(self);
+ return self->readnumber != 0;
+}
+
+static int FastqSequenceGetOrientationSelf ( const FastqSequence *self )
+{
+ assert(self);
+ return ReadOrientationUnknown;
+}
+
+static int FastqSequenceGetOrientationMate ( const FastqSequence *self )
+{
+ assert(self);
+ return ReadOrientationUnknown;
+}
+
+static bool FastqSequenceRecordIsFirst ( const FastqSequence *self )
+{
+ assert(self);
+ return self->readnumber == 1;
+}
+
+static bool FastqSequenceRecordIsSecond ( const FastqSequence *self )
+{
+ assert(self);
+ return self->readnumber == 2;
+}
+
+static bool FastqSequenceIsDuplicate ( const SEQUENCE_IMPL *self )
+{
+ assert(self);
+ return 0;
+}
+
+static bool FastqSequenceIsLowQuality ( const SEQUENCE_IMPL *self )
+{
+ assert(self);
+ return self->lowQuality;
+}
+
+static rc_t FastqSequenceGetTI ( const SEQUENCE_IMPL *self, uint64_t *ti )
+{
+ assert(self);
+ return false;
+}
+
+/*--------------------------------------------------------------------------
+ * FastqReaderFile
+ */
+
+static rc_t FastqReaderFileWhack( READERFILE_IMPL* self );
+static rc_t FastqReaderFileGetRecord ( const READERFILE_IMPL *self, const Record** result );
+static float FastqReaderFileGetProportionalPosition ( const READERFILE_IMPL *self );
+static rc_t FastqReaderFileGetReferenceInfo ( const READERFILE_IMPL *self, const ReferenceInfo** result );
+
+static ReaderFile_vt_v1 FastqReaderFile_vt =
+{
+ 1, 0,
+ /* start minor version == 0 */
+ FastqReaderFileWhack,
+ FastqReaderFileGetRecord,
+ FastqReaderFileGetProportionalPosition,
+ FastqReaderFileGetReferenceInfo,
+ /* end minor version == 0 */
+};
+
+struct FastqReaderFile
+{
+ ReaderFile dad;
+
+ FASTQParseBlock pb;
+ const KLoaderFile* reader;
+
+ const char* recordStart; /* raw source of the record being currently parsed */
+ size_t curPos; /* current tokenization position relative to recordStart */
+ bool lastEol;
+ bool eolInserted;
+};
+
+rc_t FastqReaderFileWhack( FastqReaderFile* f )
+{
+ FastqReaderFile* self = (FastqReaderFile*) f;
+
+ FASTQScan_yylex_destroy(& self->pb);
+
+ if (self->reader)
+ KLoaderFile_Release ( self->reader, true );
+
+ ReaderFileWhack( &self->dad );
+
+ free ( self );
+ return 0;
+}
+
+void FASTQ_ParseBlockInit ( FASTQParseBlock* pb )
+{
+ pb->length = 0;
+ pb->spotNameOffset = 0;
+ pb->spotNameLength = 0;
+ pb->spotNameDone = false;
+ pb->spotGroupOffset = 0;
+ pb->spotGroupLength = 0;
+ pb->readOffset = 0;
+ pb->readLength = 0;
+ pb->qualityOffset = 0;
+ pb->qualityLength = 0;
+}
+
+rc_t FastqReaderFileGetRecord ( const FastqReaderFile *f, const Record** result )
+{
+ rc_t rc;
+ FastqReaderFile* self = (FastqReaderFile*) f;
+
+ if (self->pb.fatalError)
+ return 0;
+
+ self->pb.record = (FastqRecord*)malloc(sizeof(FastqRecord));
+ if (self->pb.record == NULL)
+ {
+ rc = RC ( RC_MODULE, rcData, rcAllocating, rcMemory, rcExhausted );
+ return 0;
+ }
+ rc = FastqRecordInit(self->pb.record);
+ if (rc != 0)
+ return rc;
+
+ FASTQ_ParseBlockInit( & self->pb );
+
+ if ( FASTQ_parse( & self->pb ) == 0 && self->pb.record->rej == 0 )
+ { /* normal end of input */
+ RecordRelease((const Record*)self->pb.record);
+ *result = 0;
+ return 0;
+ }
+
+ /*TODO: remove? compensate for an artificially inserted trailing \n */
+ if ( self->eolInserted )
+ {
+ -- self->pb.length;
+ self->eolInserted = false;
+ }
+
+ if (self->pb.record->rej != 0) /* had error(s) */
+ { /* save the complete raw source in the Rejected object */
+ StringInit(& self->pb.record->rej->source, string_dup(self->recordStart, self->pb.length), self->pb.length, (uint32_t)self->pb.length);
+ self->pb.record->rej->fatal = self->pb.fatalError;
+ }
+
+ if (rc == 0 && self->reader != 0)
+ {
+ /* advance the record start pointer beyond the last token */
+ size_t length;
+ rc = KLoaderFile_Read( self->reader, self->pb.length, 0, (const void**)& self->recordStart, & length);
+ if (rc != 0)
+ LogErr(klogErr, rc, "FastqReaderFileGetRecord failed");
+
+ self->curPos -= self->pb.length;
+ }
+
+ StringInit( & self->pb.record->seq.spotname, (const char*)self->pb.record->source.base + self->pb.spotNameOffset, self->pb.spotNameLength, (uint32_t)self->pb.spotNameLength);
+ StringInit( & self->pb.record->seq.spotgroup, (const char*)self->pb.record->source.base + self->pb.spotGroupOffset, self->pb.spotGroupLength, (uint32_t)self->pb.spotGroupLength);
+ StringInit( & self->pb.record->seq.read, (const char*)self->pb.record->source.base + self->pb.readOffset, self->pb.readLength, (uint32_t)self->pb.readLength);
+ StringInit( & self->pb.record->seq.quality, (const char*)self->pb.record->source.base + self->pb.qualityOffset, self->pb.qualityLength, (uint32_t)self->pb.qualityLength);
+ self->pb.record->seq.qualityFormat = self->pb.qualityFormat;
+ self->pb.record->seq.qualityAsciiOffset = self->pb.qualityAsciiOffset;
+
+ if (self->pb.record->seq.readnumber == 0)
+ self->pb.record->seq.readnumber = self->pb.defaultReadNumber;
+
+ *result = (const Record*) self->pb.record;
+
+ return rc;
+}
+
+void CC FASTQ_error(struct FASTQParseBlock* sb, const char* msg)
+{
+ if (sb->record->rej == 0)
+ { /* save the error information in the Rejected object */
+ sb->record->rej = (Rejected*)malloc(sizeof(Rejected));
+ RejectedInit(sb->record->rej);
+
+ sb->record->rej->message = string_dup(msg, strlen(msg));
+ sb->record->rej->line = sb->lastToken->line_no;
+ sb->record->rej->column = sb->lastToken->column_no;
+ }
+ /* subsequent errors in this record will be ignored */
+}
+
+size_t CC FASTQ_input(FASTQParseBlock* pb, char* buf, size_t max_size)
+{
+ FastqReaderFile* self = (FastqReaderFile*)pb->self;
+ size_t length;
+
+ rc_t rc = KLoaderFile_Read( self->reader, 0, self->curPos + max_size, (const void**)& self->recordStart, & length);
+
+ if ( rc != 0 )
+ {
+ LogErr(klogErr, rc, "FASTQ_input failed");
+ return 0;
+ }
+
+ length -= self->curPos;
+ if ( length == 0 ) /* nothing new read = end of file */
+ { /* insert an additional \n before the end of file if missing */
+ if ( !self->lastEol )
+ {
+ buf[0] = '\n';
+ self->eolInserted = true;
+ self->lastEol = true;
+ return 1;
+ }
+ else
+ {
+ return 0; /* signal EOF to flex */
+ }
+ }
+
+ memmove(buf, self->recordStart + self->curPos, length);
+
+ self->lastEol = ( buf[length-1] == '\n' );
+ self->curPos += length;
+
+ return length;
+}
+
+rc_t CC FastqReaderFileMake( const ReaderFile **reader,
+ const KDirectory* dir,
+ const char* file,
+ enum FASTQQualityFormat qualityFormat,
+ int8_t defaultReadNumber,
+ bool ignoreSpotGroups)
+{
+ rc_t rc;
+ FastqReaderFile* self = (FastqReaderFile*) malloc ( sizeof * self );
+ if ( self == NULL )
+ {
+ rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted );
+ }
+ else
+ {
+ memset(self, 0, sizeof(*self));
+ rc = ReaderFileInit ( self );
+ self->dad.vt.v1 = & FastqReaderFile_vt;
+
+ self->dad.pathname = string_dup(file, strlen(file)+1);
+ if ( self->dad.pathname == NULL )
+ {
+ rc = RC ( RC_MODULE, rcFileFormat, rcAllocating, rcMemory, rcExhausted );
+ }
+ else
+ {
+ rc = KLoaderFile_Make( & self->reader, dir, file, 0, true );
+ }
+ if (rc == 0)
+ {
+ self->pb.self = self;
+ self->pb.input = FASTQ_input;
+ self->pb.qualityFormat = qualityFormat;
+ self->pb.defaultReadNumber = defaultReadNumber;
+ self->pb.secondaryReadNumber = 0;
+ self->pb.ignoreSpotGroups = ignoreSpotGroups;
+
+ rc = FASTQScan_yylex_init(& self->pb, false);
+ if (rc == 0)
+ {
+ *reader = (const ReaderFile *) self;
+ }
+ else
+ {
+ KLoaderFile_Release( self->reader, true );
+ ReaderFileRelease( & self->dad );
+ *reader = 0;
+ }
+ }
+ else
+ {
+ ReaderFileRelease( & self->dad );
+ *reader = 0;
+ }
+ }
+
+ return rc;
+}
+
+float FastqReaderFileGetProportionalPosition ( const READERFILE_IMPL *self )
+{
+ return 0.0f;
+}
+
+rc_t FastqReaderFileGetReferenceInfo ( const READERFILE_IMPL *self, const ReferenceInfo** result )
+{
+ *result = NULL;
+ return 0;
+}
+
+
diff --git a/tools/fastq-loader/fastq-reader.h b/tools/fastq-loader/fastq-reader.h
new file mode 100644
index 0000000..758cac9
--- /dev/null
+++ b/tools/fastq-loader/fastq-reader.h
@@ -0,0 +1,57 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_fastq_reader_
+#define _h_fastq_reader_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include "fastq-parse.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+struct ReaderFile;
+
+rc_t CC FastqReaderFileMake( const struct ReaderFile **self,
+ const struct KDirectory* dir,
+ const char* file,
+ enum FASTQQualityFormat qualityFormat,
+ int8_t defaultReadNumber,
+ bool ignoreSpotGroups);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_fastq_reader_ */
diff --git a/tools/fastq-loader/fastq-tokens.h b/tools/fastq-loader/fastq-tokens.h
new file mode 100644
index 0000000..33745fe
--- /dev/null
+++ b/tools/fastq-loader/fastq-tokens.h
@@ -0,0 +1,67 @@
+/* A Bison parser, made by GNU Bison 2.5. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ fqENDOFTEXT = 0,
+ fqRUNDOTSPOT = 258,
+ fqSPOTGROUP = 259,
+ fqNUMBER = 260,
+ fqALPHANUM = 261,
+ fqWS = 262,
+ fqENDLINE = 263,
+ fqBASESEQ = 264,
+ fqCOLORSEQ = 265,
+ fqTOKEN = 266,
+ fqASCQUAL = 267,
+ fqCOORDS = 268,
+ fqUNRECOGNIZED = 269
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
diff --git a/tools/fastq-loader/loader-imp.c b/tools/fastq-loader/loader-imp.c
new file mode 100644
index 0000000..82998cc
--- /dev/null
+++ b/tools/fastq-loader/loader-imp.c
@@ -0,0 +1,256 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kdb/btree.h>
+#include <kdb/meta.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+
+#include <kapp/loader-meta.h>
+#include <kapp/main.h>
+
+#include <kfs/directory.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+#include <insdc/sra.h>
+
+#include "common-reader.h"
+#include "common-writer.h"
+#include "sequence-writer.h"
+
+#include "fastq-reader.h"
+
+rc_t ArchiveFASTQ(CommonWriterSettings* G,
+ VDBManager *mgr,
+ VDatabase *db,
+ unsigned seqFiles,
+ char const *seqFile[],
+ enum FASTQQualityFormat qualityFormat,
+ const int8_t defaultReadNumbers[],
+ bool ignoreSpotGroups)
+{
+ rc_t rc = 0;
+ unsigned i;
+ CommonWriter cw;
+
+ KDirectory *dir;
+ rc = KDirectoryNativeDir(&dir);
+ if (rc != 0)
+ return rc;
+
+ rc = CommonWriterInit( &cw, mgr, db, G);
+ if (rc != 0)
+ {
+ KDirectoryRelease(dir);
+ return rc;
+ }
+
+ for (i = 0; i < seqFiles; ++i) {
+ const ReaderFile *reader;
+ if (G->platform == SRA_PLATFORM_PACBIO_SMRT)
+ rc = FastqReaderFileMake(&reader, dir, seqFile[i], FASTQphred33, -1, ignoreSpotGroups);
+ else
+ rc = FastqReaderFileMake(&reader, dir, seqFile[i], qualityFormat, defaultReadNumbers[i], ignoreSpotGroups);
+
+ if (rc == 0)
+ {
+ rc = CommonWriterArchive( &cw, reader );
+ if (rc != 0)
+ ReaderFileRelease(reader);
+ else
+ rc = ReaderFileRelease(reader);
+ }
+ if (rc != 0)
+ break;
+ }
+ if (rc == 0) {
+ bool const quitting = (Quitting() != 0);
+ rc = CommonWriterComplete(&cw, quitting, 0);
+ }
+ else
+ CommonWriterComplete( &cw, true, 0 );
+
+ G->errCount = cw.err_count;
+
+ if (rc == 0)
+ rc = CommonWriterWhack( &cw );
+ else
+ CommonWriterWhack( &cw );
+
+ if (rc == 0)
+ rc = KDirectoryRelease(dir);
+ else
+ KDirectoryRelease(dir);
+
+ if (rc == 0) {
+ (void)LOGMSG(klogInfo, "Successfully loaded all files");
+ }
+ return rc;
+}
+
+rc_t WriteLoaderSignature(KMetadata *meta, char const progName[])
+{
+ KMDataNode *node;
+ rc_t rc = KMetadataOpenNodeUpdate(meta, &node, "/");
+
+ if (rc == 0) {
+ rc = KLoaderMeta_Write(node, progName, __DATE__, "FASTQ", KAppVersion());
+ KMDataNodeRelease(node);
+ }
+ if (rc) {
+ (void)LOGERR(klogErr, rc, "Cannot update loader meta");
+ }
+ return rc;
+}
+
+rc_t OpenPath(char const path[], KDirectory **dir)
+{
+ KDirectory *p;
+ rc_t rc = KDirectoryNativeDir(&p);
+
+ if (rc == 0) {
+ rc = KDirectoryOpenDirUpdate(p, dir, false, "%s", path);
+ KDirectoryRelease(p);
+ }
+ return rc;
+}
+
+rc_t ConvertDatabaseToUnmapped(VDatabase* db)
+{
+ VTable* tbl;
+ rc_t rc = VDatabaseOpenTableUpdate(db, &tbl, "SEQUENCE");
+ if (rc == 0)
+ {
+ rc = VTableRenameColumn(tbl, false, "CMP_ALTREAD", "ALTREAD");
+ if (rc == 0 || GetRCState(rc) == rcNotFound)
+ rc = VTableRenameColumn(tbl, false, "CMP_READ", "READ");
+/* if (rc == 0 || GetRCState(rc) == rcNotFound)
+ rc = VTableRenameColumn(tbl, false, "CMP_ALTCSREAD", "ALTCSREAD");
+ if (rc == 0 || GetRCState(rc) == rcNotFound)
+ rc = VTableRenameColumn(tbl, false, "CMP_CSREAD", "CSREAD");*/
+ if (GetRCState(rc) == rcNotFound)
+ rc = 0;
+ rc = VTableRelease(tbl);
+ }
+ return rc;
+}
+
+rc_t run ( char const progName[],
+ CommonWriterSettings* G,
+ unsigned seqFiles,
+ const char *seqFile[],
+ uint8_t qualityOffset,
+ const int8_t defaultReadNumbers[],
+ bool ignoreSpotGroups )
+{
+ VDBManager *mgr;
+ rc_t rc;
+ rc_t rc2;
+ char const *db_type = "NCBI:align:db:alignment_sorted";
+/* char const *db_type = "NCBI:align:db:unaligned"; */
+
+ rc = VDBManagerMakeUpdate(&mgr, NULL);
+ if (rc) {
+ (void)LOGERR (klogErr, rc, "failed to create VDB Manager!");
+ }
+ else {
+ VSchema *schema;
+
+ rc = VDBManagerMakeSchema(mgr, &schema);
+ if (rc) {
+ (void)LOGERR (klogErr, rc, "failed to create schema");
+ }
+ else {
+ (void)(rc = VSchemaAddIncludePath(schema, "%s", G->schemaIncludePath));
+ rc = VSchemaParseFile(schema, "%s", G->schemaPath);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "failed to parse schema file $(file)", "file=%s", G->schemaPath));
+ }
+ else {
+ VDatabase *db;
+
+ rc = VDBManagerCreateDB(mgr, &db, schema, db_type, kcmInit + kcmMD5, "%s", G->outpath);
+ rc2 = VSchemaRelease(schema);
+ if (rc2)
+ (void)LOGERR(klogWarn, rc2, "Failed to release schema");
+ if (rc == 0)
+ rc = rc2;
+ if (rc == 0) {
+ rc = ArchiveFASTQ(G, mgr, db, seqFiles, seqFile, qualityOffset, defaultReadNumbers, ignoreSpotGroups);
+ }
+
+ if (rc == 0) {
+ rc = ConvertDatabaseToUnmapped(db);
+ }
+
+ rc2 = VDatabaseRelease(db);
+ if (rc == 0)
+ {
+ if (rc2)
+ (void)LOGERR(klogWarn, rc2, "Failed to close database");
+ rc = rc2;
+ }
+
+ if (rc == 0) {
+ KMetadata *meta;
+ KDBManager *kmgr;
+
+ rc = VDBManagerOpenKDBManagerUpdate(mgr, &kmgr);
+ if (rc == 0) {
+ KDatabase *kdb;
+
+ rc = KDBManagerOpenDBUpdate(kmgr, &kdb, "%s", G->outpath);
+ if (rc == 0) {
+ rc = KDatabaseOpenMetadataUpdate(kdb, &meta);
+ KDatabaseRelease(kdb);
+ }
+ KDBManagerRelease(kmgr);
+ }
+ if (rc == 0) {
+ rc = WriteLoaderSignature(meta, progName);
+ KMetadataRelease(meta);
+ }
+ }
+ }
+ rc2 = VDBManagerRelease(mgr);
+ if (rc2)
+ (void)LOGERR(klogWarn, rc2, "Failed to release VDB Manager");
+ if (rc == 0)
+ rc = rc2;
+ }
+ }
+ return rc;
+}
diff --git a/tools/fastq-loader/mmarray.c b/tools/fastq-loader/mmarray.c
new file mode 100644
index 0000000..5eaca25
--- /dev/null
+++ b/tools/fastq-loader/mmarray.c
@@ -0,0 +1,114 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#define MMA_NUM_CHUNKS_BITS (20u)
+#define MMA_NUM_SUBCHUNKS_BITS ((32u)-(MMA_NUM_CHUNKS_BITS))
+#define MMA_SUBCHUNK_SIZE (1u << MMA_NUM_CHUNKS_BITS)
+#define MMA_SUBCHUNK_COUNT (1u << MMA_NUM_SUBCHUNKS_BITS)
+#define MMA_ELEM_SIZE ((size_t)((sizeof(MMA_ELEM_T) + ((size_t)(3u))) & ~((size_t)(3u))))
+
+typedef struct MMArray {
+ struct mma_map_s {
+ struct mma_submap_s {
+ void *base;
+ } submap[MMA_SUBCHUNK_COUNT];
+ } map[NUM_ID_SPACES];
+ off_t fsize;
+ int fd;
+} MMArray;
+
+static MMArray *MMArrayMake(rc_t *const prc, int fd)
+{
+ MMArray *const self = calloc(1, sizeof(*self));
+
+ if (self) {
+ self->fd = fd;
+ return self;
+ }
+ *prc = RC(rcExe, rcMemMap, rcConstructing, rcMemory, rcExhausted);
+ return NULL;
+}
+
+static MMA_ELEM_T *MMArrayGet(MMArray *const self, rc_t *const prc, uint64_t const element)
+{
+ size_t const chunk = MMA_SUBCHUNK_SIZE * MMA_ELEM_SIZE;
+ unsigned const bin_no = element >> 32;
+ unsigned const subbin = ((uint32_t)element) >> MMA_NUM_CHUNKS_BITS;
+ unsigned const in_bin = (uint32_t)element & (MMA_SUBCHUNK_SIZE - 1);
+
+ while (bin_no < sizeof(self->map)/sizeof(self->map[0])) {
+ MMA_ELEM_T *const next = self->map[bin_no].submap[subbin].base;
+ if (next != NULL)
+ return &next[in_bin];
+ else {
+ off_t const cur_fsize = self->fsize;
+ off_t const new_fsize = cur_fsize + chunk;
+
+ if (ftruncate(self->fd, new_fsize) == 0) {
+ void *const base = mmap(NULL, chunk, PROT_READ|PROT_WRITE,
+ MAP_FILE|MAP_SHARED, self->fd, cur_fsize);
+
+ self->fsize = new_fsize;
+ if (base != MAP_FAILED)
+ self->map[bin_no].submap[subbin].base = base;
+ else {
+ PLOGMSG(klogErr, (klogErr, "Failed to construct map for bin $(bin), subbin $(subbin)", "bin=%u,subbin=%u", bin_no, subbin));
+ *prc = RC(rcExe, rcMemMap, rcConstructing, rcMemory, rcExhausted);
+ return NULL;
+ }
+ }
+ else {
+ *prc = RC(rcExe, rcMemMap, rcResizing, rcSize, rcExcessive);
+ return NULL;
+ }
+ }
+ }
+ *prc = RC(rcExe, rcMemMap, rcResizing, rcId, rcExcessive);
+ return NULL;
+}
+
+static void MMArrayWhack(MMArray *self)
+{
+ size_t const chunk = MMA_SUBCHUNK_SIZE * MMA_ELEM_SIZE;
+ unsigned i;
+
+ for (i = 0; i != sizeof(self->map)/sizeof(self->map[0]); ++i) {
+ unsigned j;
+
+ for (j = 0; j != sizeof(self->map[0].submap)/sizeof(self->map[0].submap[0]); ++j) {
+ if (self->map[i].submap[j].base)
+ munmap(self->map[i].submap[j].base, chunk);
+ }
+ }
+ close(self->fd);
+ free(self);
+}
+
+#undef MMA_NUM_CHUNKS_BITS
+#undef MMA_NUM_SUBCHUNKS_BITS
+#undef MMA_SUBCHUNK_SIZE
+#undef MMA_SUBCHUNK_COUNT
+#undef MMA_ELEM_SIZE
diff --git a/tools/fastq-loader/parsing_rules.txt b/tools/fastq-loader/parsing_rules.txt
new file mode 100755
index 0000000..940f2f1
--- /dev/null
+++ b/tools/fastq-loader/parsing_rules.txt
@@ -0,0 +1,106 @@
+
+This is a summary of parsing rules for fastq files, as implemented in the latf-load tool.
+
+I. Notation
+
+The parsing rules are specified using a variant of Backus-Naur Form notation (BNF). The conventions are:
+
+ Token names are specified in capital letters. Tokens are defined in section II.
+ Names of non-terminals are specified in lowercase. Non-terminals are defined in section III.
+ { A } means "A repeated 0 or more times"
+ [ A ] means "optional A"
+ A | B means "A or B"
+ ( ) parentheses are used to group items
+
+II. Tokens
+
+The following tokens are used in the grammar description.
+
+ ALPHANUM - a sequence of (Latin) letters and decimal digits or dashes, beginning with a letter
+ NUMBER - a sequence of decimal digits
+ WS - a sequence of white space characters (spaces or tabs)
+ EOL - an end of line character (not considered a white space)
+ COORDS - a sequence of 4 decimal numbers, each preceded by ':', e.g. :8:2:342:540
+ SPOTGROUP - '#' followed by a possibly empty sequence of letters, decimal digits, or '_'
+ RUNDOTSPOT - a special identifier representing a spot inside a run, in the format [SDE]RR{digits}.{digits}. An example would be "DRR000123.12"
+ BASES - a sequence of characters representing bases in text notation. Valid characters are A, C, G, T, a, c, g, t, N, n.
+ CSBASES - a sequence of characters representing bases in colorspace notation. The first character has to be one of A, C, G, T, a, c, g, t.
+ The remaining characters have to be '1', '2', '3', or '.'
+ QUAL - a sequence of characters representing qualities. The range of valid characters is determined by quality encoding
+ specified by the command line option --quality, characters with ASCII codes 33-126 for PHRED_33 or 64-127 for PHRED_64, 59-126 for LOGODDS (all ranges inclusive).
+
+In addition, grammar rules use literal tokens in apostrophes, e.g. ':'
+
+III. Parsing rules
+
+1. Input file
+
+ input:
+ { readLines [ qualityLines ] } |
+ { qualityLines } |
+ { name COORDS ':' ( BASES | CSBASES ) ':' QUAL EOL }
+
+Normally, an input file consists of a sequence of reads, each occupying multiple lines which identify read and contain its bases, with or without qualities.
+It is possible to have a file with only qualities specified for every read; in that case the loader must also be given a file with corresponding bases.
+
+An alternative is an "inline" format which has name, bases and qualities of each read on a single line.
+
+
+2. Read
+
+ readLines : ( '@' | '>' ) ( tagLine | runSpotRead ) EOL read
+
+ read : baseRead | csRead
+
+ baseRead : BASES EOL { BASES EOL }
+
+ csRead : CSBASES EOL { CSBASES EOL }
+
+ qualityLines: '+' { TOKEN } EOL quality
+
+ quality: QUAL EOL { QUAL EOL }
+
+A read in a fastq file is identified by its tag line. Tag line is followed by bases in text or colorspace format.
+
+An optional quality specification may follow. The quality specification starts with '+' and its own tag line, which is
+expected to match the tag line of the textually preceding read, although it is not enforced by latf-load.
+
+3. Tag line
+
+ tagLine : nameSpotGroup |
+ nameSpotGroup readNumber WS NUMBER ':' ALPHANUM ':' NUMBER indexSequence |
+ nameSpotGroup readNumber [ WS [ ALPHANUM ] ] |
+ nameSpotGroup WS casava1_8 |
+ nameSpotGroup WS ALPHANUM |
+ runSpotRead [ WS ] |
+ name [ readNumber [ WS ] ]
+
+ nameSpotGroup : [ name WS ] nameWithCoords [ SPOTGROUP ] |
+ name SPOTGROUP |
+ name [ readNumber [ WS ] ] |
+ name WS ALPHANUM '='
+
+ nameWithCoords : name COORDS |
+ name COORDS '_' [ casava1_8 ] |
+ name COORDS [ ':' ] '.' name |
+ name COORDS ':' [ name ]
+
+ name : ( ALPHANUM | NUMBER ) { '_' | '-' | '.' | ':' | ALPHANUM | NUMBER }
+
+ readNumberOrTail : ( readNumber | WS [ casava1_8 ] | WS tail ) { WS tail }
+
+ readNumber : '/' NUMBER { '/' name }
+
+ casava1_8 : NUMBER ':' ALPHANUM ':' NUMBER [ ':' [ ALPHANUM | NUMBER ] ]
+
+ tail : ALPHANUM { NUMBER | ALPHANUM | '_' | '/' | '=' )
+
+ runSpotRead : RUNDOTSPOT [ ( '.' | '/' ) NUMBER ] { tail | NUMBER }
+
+The purpose of the tag line is to identify a read. The components of a tag line may represent run name (possibly including coordinates), spot group, read number, and some additional information which may be of no concern to latf-load.
+Tag lines come in a multitude of variations on the basic fastq format, somewhat loosely defined in e.g. http://en.wikipedia.org/wiki/FASTQ_format
+Parsing rules for the tag line in latf-load have been designed to recognize major variations of the basic tag line format and
+evolved based on format variations encountered in real life submissions.
+
+
+
diff --git a/tools/fastq-loader/sequence-writer.c b/tools/fastq-loader/sequence-writer.c
new file mode 100644
index 0000000..a646059
--- /dev/null
+++ b/tools/fastq-loader/sequence-writer.c
@@ -0,0 +1,366 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <vdb/database.h>
+
+#include <kdb/manager.h>
+
+#include <insdc/sra.h>
+#include <insdc/insdc.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <align/writer-sequence.h>
+
+#include <loader/sequence-writer.h>
+#include <loader/common-reader.h>
+
+/* MARK: SequenceWriter Object */
+
+SequenceWriter *SequenceWriterInit(SequenceWriter *self, VDatabase *db) {
+ memset(self, 0, sizeof(*self));
+ self->db = db;
+ VDatabaseAddRef(db);
+ return self;
+}
+
+rc_t SequenceWriteRecord(SequenceWriter *self,
+ SequenceRecord const *rec,
+ bool color,
+ bool isDup,
+ INSDC_SRA_platform_id platform,
+ bool keepMismatchQual,
+ bool no_real_output,
+ bool hasTI,
+ char const *QualQuantizer
+ )
+{
+ rc_t rc = 0;
+ uint8_t nreads = rec->numreads;
+ unsigned i;
+ unsigned seqLen;
+ int64_t dummyRowId;
+
+ uint8_t readInfo[4096];
+ void *h_readInfo = NULL;
+
+ INSDC_coord_zero *readStart = (void *)readInfo;
+ INSDC_coord_len *readLen;
+ uint8_t *alcnt;
+ INSDC_SRA_xread_type *readType;
+ INSDC_SRA_read_filter *readFilter;
+ bool *mask = NULL;
+ size_t const elemSize = sizeof(alcnt[0]) + sizeof(readType[0])
+ + sizeof(readStart[0]) + sizeof(readLen[0])
+ + sizeof(readFilter[0]);
+
+ TableWriterSeqData data;
+
+ for (i = seqLen = 0; i != nreads; ++i) {
+ seqLen += rec->readLen[i];
+ }
+
+ if (nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]) > sizeof(readInfo))
+ {
+ h_readInfo = malloc(nreads * elemSize + keepMismatchQual * seqLen * sizeof(mask[0]));
+ if (h_readInfo == NULL)
+ return RC(rcAlign, rcTable, rcWriting, rcMemory, rcExhausted);
+ readStart = h_readInfo;
+ }
+ readLen = (INSDC_coord_len *)&readStart[nreads];
+ alcnt = (uint8_t *)&readLen[nreads];
+ readType = (INSDC_SRA_xread_type *)&alcnt[nreads];
+ readFilter = (INSDC_SRA_read_filter *)&readType[nreads];
+
+ if (keepMismatchQual) {
+ mask = (bool *)&readFilter[nreads];
+
+ for (i = 0; i != seqLen; ++i) {
+ mask[i] = (rec->qual[i] & 0x80) != 0;
+ }
+ }
+
+ for (i = 0; i != nreads; ++i) {
+ alcnt[i] = rec->aligned[i] ? 1 : 0;
+ readLen[i] = rec->readLen[i];
+ readStart[i] = rec->readStart[i];
+ readType[i] = readLen[i] ? SRA_READ_TYPE_BIOLOGICAL : SRA_READ_TYPE_TECHNICAL;
+ switch ( rec->orientation[i] )
+ {
+ case ReadOrientationForward:
+ readType[i] |= SRA_READ_TYPE_FORWARD;
+ break;
+ case ReadOrientationReverse:
+ readType[i] |= SRA_READ_TYPE_REVERSE;
+ break;
+ case ReadOrientationUnknown:
+ default:
+ break;
+ }
+ readFilter[i] = isDup ? SRA_READ_FILTER_CRITERIA
+ : rec->is_bad[i] ? SRA_READ_FILTER_REJECT : SRA_READ_FILTER_PASS;
+ }
+
+ memset(&data, 0, sizeof(data));
+
+ data.sequence.buffer = rec->seq;
+ data.sequence.elements = seqLen;
+
+ data.quality.buffer = rec->qual;
+ data.quality.elements = seqLen;
+
+ if (keepMismatchQual) {
+ data.no_quantize_mask.buffer = mask;
+ data.no_quantize_mask.elements = seqLen;
+ }
+
+ data.alignment_count.buffer = alcnt;
+ data.alignment_count.elements = nreads;
+
+ data.nreads = nreads;
+
+ data.read_type.buffer = readType;
+ data.read_type.elements = nreads;
+
+ data.read_start.buffer = readStart;
+ data.read_start.elements = nreads;
+
+ data.read_len.buffer = readLen;
+ data.read_len.elements = nreads;
+
+ data.tmp_key_id = rec->keyId;
+
+ data.spot_group.buffer = rec->spotGroup;
+ data.spot_group.elements = rec->spotGroupLen;
+
+ data.cskey.buffer = rec->cskey;
+ data.cskey.elements = nreads;
+
+ data.read_filter.buffer = readFilter;
+ data.read_filter.elements = nreads;
+
+ data.platform.buffer = &platform;
+ data.platform.elements = 1;
+
+ data.ti.buffer = rec->ti;
+ data.ti.elements = nreads;
+
+ data.spot_name.buffer = rec->spotName;
+ data.spot_name.elements = rec->spotNameLen;
+
+ if (!no_real_output) {
+ if (self->tbl == NULL) {
+ int csoption = (color ? ewseq_co_ColorSpace : 0);
+
+ if(hasTI) csoption |= ewseq_co_TI;
+
+ rc = TableWriterSeq_Make(&self->tbl, self->db,
+ csoption | ewseq_co_NoLabelData | ewseq_co_SpotGroup /*| ewseq_co_SpotName*/, QualQuantizer);
+ }
+ if (rc == 0) {
+ rc = TableWriterSeq_Write(self->tbl, &data, &dummyRowId);
+ }
+ }
+
+ if (h_readInfo)
+ free(h_readInfo);
+
+ return rc;
+}
+
+rc_t SequenceDoneWriting(SequenceWriter *self)
+{
+ return TableWriterSeq_TmpKeyStart(self->tbl);
+}
+
+rc_t SequenceReadKey(const SequenceWriter *cself, int64_t row, uint64_t *keyId)
+{
+ return TableWriterSeq_TmpKey(cself->tbl, row, keyId);
+}
+
+rc_t SequenceUpdateAlignData(SequenceWriter *self, int64_t rowId, unsigned nreads,
+ int64_t const primeId[/* nreads */],
+ uint8_t const algnCnt[/* nreads */])
+{
+ TableWriterData data[2];
+
+ data[0].buffer = primeId; data[0].elements = nreads;
+ data[1].buffer = algnCnt; data[1].elements = nreads;
+
+ return TableWriterSeq_WriteAlignmentData(self->tbl, rowId, &data[0], &data[1]);
+}
+
+void SequenceWhack(SequenceWriter *self, bool commit) {
+ uint64_t dummyRows;
+ /* rc_t rc; */
+
+ VDatabaseRelease(self->db);
+
+ if (self->tbl == NULL)
+ return;
+
+ /* rc = */ TableWriterSeq_Whack(self->tbl, commit, &dummyRows);
+}
+
+/* MARK: SequenceRecord Object */
+static
+rc_t SequenceRecordResize(SequenceRecord *self,
+ KDataBuffer *storage,
+ unsigned numreads,
+ unsigned seqLen)
+{
+ size_t sz;
+ rc_t rc;
+
+ sz = seqLen * (sizeof(self->seq[0]) + sizeof(self->qual[0])) +
+ numreads * (sizeof(self->ti) +
+ sizeof(self->readStart[0]) +
+ sizeof(self->readLen[0]) +
+ sizeof(self->aligned[0]) +
+ sizeof(self->orientation[0]) +
+ sizeof(self->alignmentCount[0]) +
+ sizeof(self->cskey[0])
+ );
+ storage->elem_bits = 8;
+ rc = KDataBufferResize(storage, sz);
+ if (rc)
+ return rc;
+ self->numreads = numreads;
+
+ self->ti = (uint64_t *)storage->base;
+ self->readStart = (uint32_t *)&self->ti[numreads];
+ self->readLen = (uint32_t *)&self->readStart[numreads];
+ self->aligned = (bool *)&self->readLen[numreads];
+ self->orientation = (uint8_t *)&self->aligned[numreads];
+ self->is_bad = (uint8_t *)&self->orientation[numreads];
+ self->alignmentCount = (uint8_t *)&self->is_bad[numreads];
+ self->cskey = (char *)&self->alignmentCount[numreads];
+ self->seq = (char *)&self->cskey[numreads];
+ self->qual = (uint8_t *)&self->seq[seqLen];
+
+ self->spotGroup = NULL;
+ self->spotGroupLen = 0;
+ self->spotName = NULL;
+ self->spotNameLen = 0;
+
+ return 0;
+}
+
+rc_t SequenceRecordInit(SequenceRecord *self, unsigned numreads, unsigned readLen[])
+{
+ unsigned i;
+ unsigned seqlen = 0;
+ rc_t rc;
+
+ for (i = 0; i != numreads; ++i) {
+ seqlen += readLen[i];
+ }
+ rc = SequenceRecordResize(self, &self->storage, numreads, seqlen);
+ if (rc)
+ return rc;
+ memset(self->storage.base, 0, KDataBufferBytes(&self->storage));
+
+ for (seqlen = 0, i = 0; i != numreads; ++i) {
+ self->readLen[i] = readLen[i];
+ self->readStart[i] = seqlen;
+ seqlen += readLen[i];
+ }
+ self->numreads = numreads;
+ memset(self->cskey, 'T', numreads);
+ return 0;
+}
+
+rc_t SequenceRecordAppend(SequenceRecord *self,
+ const SequenceRecord *other
+ )
+{
+ /* save the locations of the original data */
+ unsigned const seq = (uint8_t const *)self->seq - (uint8_t const *)self->storage.base;
+ unsigned const qual = (uint8_t const *)self->qual - (uint8_t const *)self->storage.base;
+ unsigned const cskey = (uint8_t const *)self->cskey - (uint8_t const *)self->storage.base;
+ unsigned const alignmentCount = (uint8_t const *)self->alignmentCount - (uint8_t const *)self->storage.base;
+ unsigned const is_bad = (uint8_t const *)self->is_bad - (uint8_t const *)self->storage.base;
+ unsigned const orientation = (uint8_t const *)self->orientation - (uint8_t const *)self->storage.base;
+ unsigned const aligned = (uint8_t const *)self->aligned - (uint8_t const *)self->storage.base;
+ unsigned const ti = (uint8_t const *)self->ti - (uint8_t const *)self->storage.base;
+ unsigned const readLen = (uint8_t const *)self->readLen - (uint8_t const *)self->storage.base;
+/* unsigned const readStart = (uint8_t const *)self->readStart - (uint8_t const *)self->storage.base;*/
+
+ rc_t rc;
+ unsigned seqlen;
+ unsigned otherSeqlen;
+ unsigned i;
+ unsigned numreads = self->numreads;
+
+ for (seqlen = 0, i = 0; i != numreads; ++i) {
+ seqlen += self->readLen[i];
+ }
+ for (otherSeqlen = 0, i = 0; i != other->numreads; ++i) {
+ otherSeqlen += other->readLen[i];
+ }
+
+ rc = SequenceRecordResize(self, &self->storage, self->numreads + other->numreads, seqlen + otherSeqlen);
+ if (rc)
+ return rc;
+ /* this needs to be reverse order from assignment in Resize function
+ * these regions can overlap
+ */
+ memmove(self->qual, &((uint8_t const *)self->storage.base)[qual], seqlen);
+ memmove(self->seq, &((uint8_t const *)self->storage.base)[seq], seqlen);
+ memmove(self->cskey, &((uint8_t const *)self->storage.base)[cskey], numreads * sizeof(self->cskey[0]));
+ memmove(self->alignmentCount, &((uint8_t const *)self->storage.base)[alignmentCount], numreads * sizeof(self->alignmentCount[0]));
+ memmove(self->is_bad, &((uint8_t const *)self->storage.base)[is_bad], numreads * sizeof(self->is_bad[0]));
+ memmove(self->orientation, &((uint8_t const *)self->storage.base)[orientation], numreads * sizeof(self->orientation[0]));
+ memmove(self->aligned, &((uint8_t const *)self->storage.base)[aligned], numreads * sizeof(self->aligned[0]));
+ memmove(self->readLen, &((uint8_t const *)self->storage.base)[readLen], numreads * sizeof(self->readLen[0]));
+ memmove(self->ti, &((uint8_t const *)self->storage.base)[ti], numreads * sizeof(self->ti[0]));
+
+ memmove(&self->ti[numreads], other->ti, other->numreads * sizeof(self->ti[0]));
+ memmove(&self->readLen[numreads], other->readLen, other->numreads * sizeof(self->readLen[0]));
+ memmove(&self->aligned[numreads], other->aligned, other->numreads * sizeof(self->aligned[0]));
+ memmove(&self->orientation[numreads], other->orientation, other->numreads * sizeof(self->orientation[0]));
+ memmove(&self->is_bad[numreads], other->is_bad, other->numreads * sizeof(self->is_bad[0]));
+ memmove(&self->alignmentCount[numreads], other->alignmentCount, other->numreads * sizeof(self->alignmentCount[0]));
+ memmove(&self->cskey[numreads], other->cskey, other->numreads * sizeof(self->cskey[0]));
+ memmove(&self->seq[seqlen], other->seq, otherSeqlen);
+ memmove(&self->qual[seqlen], other->qual, otherSeqlen);
+
+ for (i = 0, seqlen = 0; i != self->numreads; ++i) {
+ self->readStart[i] = seqlen;
+ seqlen += self->readLen[i];
+ }
+
+ return 0;
+}
diff --git a/tools/fastq-loader/sequence-writer.h b/tools/fastq-loader/sequence-writer.h
new file mode 100644
index 0000000..510a361
--- /dev/null
+++ b/tools/fastq-loader/sequence-writer.h
@@ -0,0 +1,93 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef BAM_LOAD_SEQUENCE_WRITER_H_
+#define BAM_LOAD_SEQUENCE_WRITER_H_ 1
+
+#include <insdc/sra.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <klib/text.h>
+#include <klib/data-buffer.h>
+
+struct TableWriterSeq;
+
+typedef struct s_sequence_record {
+ char *seq;
+ uint8_t *qual;
+ uint32_t *readStart;
+ uint32_t *readLen;
+ uint8_t *orientation;
+ uint8_t *is_bad;
+ uint8_t *alignmentCount;
+ char *spotGroup;
+ bool *aligned;
+ char *cskey;
+ uint64_t *ti;
+ char *spotName;
+ uint64_t keyId;
+ unsigned spotGroupLen;
+ unsigned spotNameLen;
+ KDataBuffer storage;
+ uint8_t numreads;
+} SequenceRecord;
+
+
+rc_t SequenceRecordInit(SequenceRecord *self,
+ unsigned numreads, unsigned readLen[]);
+
+rc_t SequenceRecordAppend(SequenceRecord *self,
+ const SequenceRecord *other);
+
+typedef struct SequenceWriter {
+ VDatabase *db;
+ struct TableWriterSeq const *tbl;
+} SequenceWriter;
+
+SequenceWriter *SequenceWriterInit(SequenceWriter *self, VDatabase *db);
+
+rc_t SequenceWriteRecord(SequenceWriter *self, SequenceRecord const *rec,
+ bool color, bool isDup, INSDC_SRA_platform_id platform,
+ bool keepMismatchQual,
+ bool no_real_output,
+ bool hasTI,
+ char const *QualQuantizer
+ );
+
+rc_t SequenceDoneWriting(SequenceWriter *self);
+rc_t SequenceReadKey(const SequenceWriter *self, int64_t row, uint64_t *key);
+rc_t SequenceUpdateAlignData(SequenceWriter *self, int64_t row, unsigned nreads,
+ const int64_t primeId[/* nreads */],
+ const uint8_t alignCount[/* nreads */]);
+
+void SequenceWhack(SequenceWriter *self, bool commit);
+
+
+#endif /* ndef BAM_LOAD_SEQUENCE_WRITER_H_ */
diff --git a/tools/fuse/Makefile b/tools/fuse/Makefile
new file mode 100644
index 0000000..b650ee0
--- /dev/null
+++ b/tools/fuse/Makefile
@@ -0,0 +1,204 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/fuse
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ remote-fuser \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_XML2))
+
+ifeq (1,$(HAVE_FUSE))
+
+ifeq (64,$(BITS))
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built: it requires a 64-bit system."
+
+endif
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built: " \
+ "it requires 'fuse' library and its development headers."
+
+endif
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built: " \
+ "It requires our internal library 'libkxml'" \
+ "which requires 'libxml2' and its development headers."
+
+endif
+
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra-fuser
+#
+SRA_FUSER_SRC = \
+ zlib-simple \
+ log \
+ node \
+ tar-list \
+ file \
+ tar-file \
+ tar-node \
+ directory \
+ formats \
+ accessor \
+ kfile-accessor \
+ xml \
+ text-file \
+ sra-list \
+ sra-directory \
+ sra-node \
+ sra-fastq \
+ sra-sff \
+ sra-fuser-sys \
+ sra-fuser
+
+SRA_FUSER_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_FUSER_SRC))
+
+LIBXML = -lxml2
+ifdef NCBI
+CFLAGS += -DSRAFUSER_LOGLOCALTIME
+ifeq (linux,$(OS))
+ LIBXML = -X$(LIBXML_LPATH) -lxml2-static
+endif
+ifeq (sun,$(OS))
+ LIBXML = -X$(LIBXML_LPATH) -lxml2-static
+endif
+endif
+
+SRA_FUSER_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lfuse \
+ -lrt
+
+$(BINDIR)/sra-fuser: $(SRA_FUSER_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRA_FUSER_LIB)
+
+#-------------------------------------------------------------------------------
+# remote-fuser
+#
+REMOTE_FUSER_SRC = \
+ log \
+ node \
+ accessor \
+ kfile-accessor \
+ remote-xml \
+ remote-cache \
+ remote-link \
+ remote-file \
+ remote-directory \
+ remote-fuser-sys \
+ remote-fuser
+
+REMOTE_FUSER_OBJ = \
+ $(addsuffix .$(OBJX),$(REMOTE_FUSER_SRC))
+
+LIBXML = -lxml2
+ifdef NCBI
+CFLAGS += -DSRAFUSER_LOGLOCALTIME
+ifeq (linux,$(OS))
+ LIBXML = -X$(LIBXML_LPATH) -lxml2-static
+endif
+ifeq (sun,$(OS))
+ LIBXML = -X$(LIBXML_LPATH) -lxml2-static
+endif
+endif
+
+REMOTE_FUSER_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lfuse \
+ -lrt
+
+$(BINDIR)/remote-fuser: $(REMOTE_FUSER_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(REMOTE_FUSER_LIB)
+
+#-------------------------------------------------------------------------------
+# sra-fuser
+#
+SRA_MAKEIDX_SRC = \
+ zlib-simple \
+ sra-makeidx
+
+SRA_MAKEIDX_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_MAKEIDX_SRC))
+
+SRA_MAKEIDX_LIB = \
+ -lkapp \
+ -stk-version \
+ -lncbi-wvdb \
+ -ssrareader \
+
+$(BINDIR)/sra-makeidx: $(SRA_MAKEIDX_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRA_MAKEIDX_LIB)
+
diff --git a/tools/fuse/accessor.c b/tools/fuse/accessor.c
new file mode 100644
index 0000000..e91ef9a
--- /dev/null
+++ b/tools/fuse/accessor.c
@@ -0,0 +1,134 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <string.h>
+
+#include "accessor.h"
+#include "log.h"
+
+/* used to detect correct object pointers */
+const uint32_t SAccessor_MAGIC = 0xFACE5550;
+
+struct SAccessor {
+ uint32_t magic;
+ char* name;
+ AccessorRead* Read;
+ AccessorRelease* Release;
+};
+
+rc_t SAccessor_Make(const SAccessor** cself, size_t size, const char* name, AccessorRead* read, AccessorRelease* release)
+{
+ rc_t rc = 0;
+ SAccessor* self = NULL;
+
+ if( cself == NULL ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcSelf, rcNull);
+ } else {
+ CALLOC(self, 1, sizeof(*self) + size);
+ if( self == NULL ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ if( (rc = StrDup(name, &self->name)) == 0 ) {
+ self->magic = SAccessor_MAGIC;
+ self->Read = read;
+ self->Release = release;
+ /* shift pointer to after hidden structure */
+ DEBUG_MSG(8, ("%s: %s\n", __func__, self->name));
+ self++;
+ } else {
+ FREE(self);
+ }
+ }
+ *cself = rc ? NULL : self;
+ }
+ return rc;
+}
+
+static
+rc_t SAccessor_ResolveSelf(const SAccessor* self, enum RCContext ctx, SAccessor** resolved)
+{
+ if( self == NULL || resolved == NULL ) {
+ return RC(rcSRA, rcFile, ctx, rcSelf, rcNull);
+ }
+ *resolved = (SAccessor*)--self;
+ /* just to validate that it is full instance */
+ if( (*resolved)->magic != SAccessor_MAGIC ) {
+ *resolved = NULL;
+ return RC(rcSRA, rcFile, ctx, rcSelf, rcCorrupt);
+ }
+ return 0;
+}
+
+
+rc_t SAccessor_Read(const SAccessor* cself, char* buf, size_t size, off_t offset, size_t* num_read)
+{
+ rc_t rc = 0;
+ SAccessor* self = NULL;
+
+ if( buf == NULL || num_read == NULL ) {
+ return RC(rcExe, rcFile, rcReading, rcParam, rcNull);
+ } else if( (rc = SAccessor_ResolveSelf(cself, rcEvaluating, &self)) == 0 ) {
+ DEBUG_MSG(8, ("%s: %s\n", __func__, self->name));
+ if( self->Read ) {
+ *num_read = 0;
+ rc = self->Read(cself, buf, size, offset, num_read);
+ } else {
+ rc = RC(rcExe, rcFile, rcReading, rcInterface, rcUnsupported);
+ }
+ }
+ return rc;
+}
+
+rc_t SAccessor_GetName(const SAccessor* cself, const char** name)
+{
+ rc_t rc = 0;
+ SAccessor* self = NULL;
+
+ if( name == NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcParam, rcInvalid);
+ } else if( (rc = SAccessor_ResolveSelf(cself, rcEvaluating, &self)) == 0 ) {
+ *name = self->name;
+ }
+ return rc;
+}
+
+rc_t SAccessor_Release(const SAccessor* cself)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ SAccessor* self = NULL;
+
+ if( (rc = SAccessor_ResolveSelf(cself, rcReleasing, &self)) == 0 ) {
+ if( self->Release ) {
+ rc = self->Release(cself);
+ }
+ DEBUG_MSG(8, ("%s: %s\n", __func__, self->name));
+ FREE(self->name);
+ FREE(self);
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/accessor.h b/tools/fuse/accessor.h
new file mode 100644
index 0000000..c872216
--- /dev/null
+++ b/tools/fuse/accessor.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_accessor_
+#define _h_sra_fuse_accessor_
+
+#include <unistd.h>
+
+#include <klib/rc.h>
+
+typedef struct SAccessor SAccessor;
+
+typedef rc_t (AccessorRead)(const SAccessor* cself, char* buf, size_t size, off_t offset, size_t* num_read);
+typedef rc_t (AccessorRelease)(const SAccessor* cself);
+
+rc_t SAccessor_Make(const SAccessor** cself, size_t size, const char* name, AccessorRead* read, AccessorRelease* release);
+
+rc_t SAccessor_GetName(const SAccessor* cself, const char** name);
+
+rc_t SAccessor_Read(const SAccessor* cself, char* buf, size_t size, off_t offset, size_t* num_read);
+
+rc_t SAccessor_Release(const SAccessor* cself);
+
+#endif /* _h_sra_fuse_accessor_ */
diff --git a/tools/fuse/debug.h b/tools/fuse/debug.h
new file mode 100644
index 0000000..ba0375d
--- /dev/null
+++ b/tools/fuse/debug.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _services_sra_fuser_debug_h_
+#define _services_sra_fuser_debug_h_
+
+#include <klib/debug.h>
+
+#if _DEBUGGING
+#define DEBUG_MSG_PASTE(a,b) a##b
+#define DEBUG_MSG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(DEBUG_MSG_PASTE(DBG_APP_,flag)), msg)
+#define DEBUG_LINE(flag,fmt,...) DEBUG_MSG(flag, ("%s:%u: " fmt "\n", __func__, __LINE__, __VA_ARGS__))
+
+#define MALLOC(ptr, size) ptr = malloc(size); DEBUG_LINE(10, "%p=malloc(%lu)", ptr, size)
+#define CALLOC(ptr, qty, size) ptr = calloc(qty, size); DEBUG_LINE(10, "%p=calloc(%lu)", ptr, qty * size)
+#define REALLOC(ptr, src, size) ptr = realloc(src, size); DEBUG_LINE(10, "%p=realloc(%p, %lu)", ptr, src, size)
+#define FREE(ptr) free(ptr); if(ptr){DEBUG_LINE(10, "0=free(%p)", ptr);}
+
+#else
+
+#define DEBUG_MSG(flag,msg) ((void)0)
+#define DEBUG_LINE(flag,fmt,...) ((void)0)
+
+#define MALLOC(ptr, size) ptr = malloc(size)
+#define CALLOC(ptr, qty, size) ptr = calloc(qty, size)
+#define REALLOC(ptr, src, size) ptr = realloc(src, size)
+#define FREE(ptr) free(ptr)
+
+#endif
+
+#endif /* _services_sra_fuser_debug_h_ */
diff --git a/tools/fuse/directory.c b/tools/fuse/directory.c
new file mode 100644
index 0000000..fb16c8b
--- /dev/null
+++ b/tools/fuse/directory.c
@@ -0,0 +1,566 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <klib/container.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kproc/lock.h>
+
+typedef struct DirectoryNode DirectoryNode;
+#define FSNODE_IMPL DirectoryNode
+
+#include "log.h"
+#include "xml.h"
+#include "directory.h"
+#include "tar-node.h"
+#include "kfile-accessor.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+
+typedef struct DirNodeChild_struct {
+ BSTNode node;
+ const char* full_name; /* full path to detected file */
+ const char* name; /* file name only within full_name above */
+ const FSNode* child;
+} DirNodeChild;
+
+static
+int64_t DirNodeChild_Sort(const BSTNode *item, const BSTNode *node)
+{
+ return strcmp(((const DirNodeChild*)item)->child->name, ((const DirNodeChild*)node)->child->name);
+}
+
+static
+int64_t DirNodeChild_FindByName(const void *item, const BSTNode *node)
+{
+ return strcmp((const char*)item, ((const DirNodeChild*)node)->child->name);
+}
+
+static
+int64_t DirNodeChild_FindBySrc(const void *item, const BSTNode *node)
+{
+ return strcmp((const char*)item, ((const DirNodeChild*)node)->name);
+}
+
+static
+void DirNodeChild_Whack(BSTNode *node, void *data)
+{
+ DirNodeChild* n = (DirNodeChild*)node;
+
+ if( n != NULL ) {
+ DEBUG_LINE(8, "Releasing auto TAR %s", n->child->name);
+ FSNode_Release(n->child);
+ FREE(n);
+ }
+}
+
+static
+void DirNodeChild_Touch( BSTNode *node, void *data )
+{
+ DirNodeChild* n = (DirNodeChild*)node;
+ BSTree* t = (BSTree*)data;
+ if( FSNode_Touch(n->child) != 0 ) {
+ BSTreeUnlink(t, node);
+ DirNodeChild_Whack(node, NULL);
+ }
+}
+
+struct DirectoryNode {
+ FSNode node;
+ char* path;
+ KTime_t mtime;
+ KRWLock* lock;
+ KTime_t timestamp;
+ /* list of physical files and dirs in 'path' minus those in children list */
+ KNamelist* ls;
+ BSTree children;
+};
+
+struct DirNodeChild_List_Data {
+ rc_t rc;
+ const DirectoryNode* cself;
+ FSNode_Dir_Visit func;
+ void* data;
+};
+
+static
+bool DirNodeChild_List( BSTNode *node, void *data )
+{
+ DirNodeChild* n = (DirNodeChild*)node;
+ struct DirNodeChild_List_Data* d = (struct DirNodeChild_List_Data*)data;
+ const FSNode* ch;
+ bool hidden = true;
+
+ if( ((d->rc = FSNode_FindChild(&d->cself->node, n->child->name, strlen(n->child->name), &ch, &hidden)) == 0 && hidden) ||
+ (GetRCObject(d->rc) == rcName && GetRCState(d->rc) == rcNotFound) ) {
+ d->rc = d->func(n->child->name, d->data);
+ }
+ return d->rc != 0;
+}
+
+static
+rc_t DirectoryNode_Lock(const DirectoryNode* cself, bool exclusive)
+{
+ DEBUG_LINE(8, "Lock DirectoryNode %s %s", cself->path, exclusive ? "write" : "read");
+ return exclusive ? KRWLockAcquireExcl(((DirectoryNode*)cself)->lock) : KRWLockAcquireShared(((DirectoryNode*)cself)->lock);
+}
+
+static
+rc_t DirectoryNode_Unlock(const DirectoryNode* cself)
+{
+ DEBUG_LINE(8, "Unlocking DirectoryNode %s", cself->path);
+ return KRWLockUnlock(((DirectoryNode*)cself)->lock);
+}
+
+static
+rc_t DirectoryNode_IsChild(const DirectoryNode* cself, const char* subpath, const FSNode** node,
+ int64_t (*finder)(const void *item, const BSTNode *node))
+{
+ DirNodeChild* n = (DirNodeChild*)BSTreeFind(&cself->children, subpath, finder);
+ if( n != NULL ) {
+ *node = n->child;
+ } else {
+ *node = NULL;
+ return RC(rcExe, rcFile, rcAccessing, rcName, rcNotFound);
+ }
+ return 0;
+}
+
+static
+rc_t CC DirectoryNode_AddTar( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ rc_t rc = 0;
+
+ if( (type & ~kptAlias) == kptFile && name != NULL ) {
+ size_t lnm = strlen(name);
+
+ if( lnm > 8 && strncmp(&name[lnm - 8], ".tar.xml", 8) == 0 ) {
+ DirectoryNode* self = (DirectoryNode*)data;
+ DirNodeChild* n = (DirNodeChild*)BSTreeFind(&self->children, name, DirNodeChild_FindBySrc);
+ if( n == NULL ) {
+ char resolved[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, resolved, sizeof(resolved), "%s/%s", self->path, name)) == 0 ) {
+ size_t lrs = strlen(resolved);
+ CALLOC(n, 1, sizeof(*n) + lrs + 1);
+ if( n == NULL ) {
+ rc = RC(rcExe, rcArc, rcInserting, rcMemory, rcExhausted);
+ } else {
+ char* x = (char*)&n[1];
+ memmove(x, resolved, lrs);
+ x[lrs] = '\0';
+ n->full_name = x;
+ n->name = &n->full_name[lrs - lnm];
+ if( (rc = TarNode_MakeAuto(&n->child, dir, self->path, name, n->full_name)) != 0 ||
+ (rc = BSTreeInsert(&self->children, &n->node, DirNodeChild_Sort)) != 0 ) {
+ DirNodeChild_Whack(&n->node, NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static
+bool DirectoryNode_LS( const KDirectory *dir, const char *name, void *data )
+{
+ size_t lnm = name ? strlen(name) : 0;
+ bool ret;
+
+ if( lnm > 8 && strncmp(&name[lnm - 8], ".tar.xml", 8) == 0 ) {
+ DirectoryNode* self = (DirectoryNode*)data;
+ ret = BSTreeFind(&self->children, name, DirNodeChild_FindBySrc) == NULL;
+ } else if( lnm > 4 && strncmp(&name[lnm - 4], ".tar", 4) == 0 ) {
+ DirectoryNode* self = (DirectoryNode*)data;
+ const FSNode* child;
+ /* virtual .tar file hides actual .tar file with same name */
+ ret = DirectoryNode_IsChild(self, name, &child, DirNodeChild_FindByName) != 0;
+ } else {
+ ret = true;
+ }
+ return ret;
+}
+
+static
+rc_t DirectoryNode_Touch(const DirectoryNode* cself)
+{
+ rc_t rc = 0;
+
+ if( cself->path != NULL ) {
+ if( (rc = DirectoryNode_Lock(cself, true)) == 0 ) {
+ KDirectory* dir;
+ /* drop disappeared items, update existing */
+ BSTreeForEach(&cself->children, false, DirNodeChild_Touch, (void*)&cself->children);
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ KTime_t dt = 0;
+ if( (rc = KDirectoryDate(dir, &dt, "%s", cself->path)) == 0 && cself->timestamp != dt ) {
+ DirectoryNode* self = (DirectoryNode*)cself;
+ /* re-read directory */
+ ReleaseComplain(KNamelistRelease, self->ls);
+ self->ls = NULL;
+ if( (rc = KDirectoryVisit(dir, false, DirectoryNode_AddTar, self, "%s", self->path)) == 0 ) {
+ rc = KDirectoryList(dir, &self->ls, DirectoryNode_LS, self, "%s", self->path);
+ }
+ self->timestamp = rc == 0 ? dt : 0;
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t DirectoryNode_Attr(const DirectoryNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ *type = kptDir;
+ if( cself->path != NULL ) {
+ KDirectory* dir = NULL;
+ const KDirectory* sub = NULL;
+
+ if( subpath != NULL && (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ const FSNode* child = NULL;
+ if( (rc = DirectoryNode_IsChild(cself, subpath, &child, DirNodeChild_FindByName)) == 0 ) {
+ rc = FSNode_Attr(child, NULL, type, ts, file_sz, access, block_sz);
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ if( child != NULL ) {
+ return rc;
+ }
+ }
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 &&
+ (rc = KDirectoryOpenDirRead(dir, &sub, true, "%s", cself->path)) == 0 ) {
+ const char* path = subpath ? subpath : ".";
+ DEBUG_LINE(8, "Using full name %s/%s", cself->path, path);
+ if( (rc = KDirectoryDate(sub, ts, "%s", path)) == 0 ) {
+ *type = KDirectoryPathType(sub, "%s", path);
+ if( *type != kptBadPath && *type != kptNotFound ) {
+ if( (rc = KDirectoryAccess(sub, access, "%s", path)) == 0 ) {
+ if( *type & kptAlias ) {
+ bool children;
+ if( (rc = FSNode_HasChildren(&cself->node, &children)) == 0 ) {
+ /* if it is pointer to an aliased directory and has no XML children than pass symlink on */
+ if( children == false || subpath != NULL ) {
+ char r[4096];
+ if( (rc = KDirectoryResolveAlias(sub, true, r, sizeof(r), "%s", path)) == 0 ) {
+ DEBUG_LINE(8, "Symlink name %s", r);
+ *file_sz = strlen(r);
+ }
+ } else {
+ /* otherwise remove alias bit */
+ *type = *type & ~kptAlias;
+ }
+ }
+ } else if( *type == kptFile ) {
+ rc = KDirectoryFileSize(sub, file_sz, "%s", path);
+ }
+ }
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, sub);
+ ReleaseComplain(KDirectoryRelease, dir);
+ } else if( subpath != NULL ) {
+ rc = RC(rcExe, rcDirectory, rcEvaluating, rcDirEntry, rcNotFound);
+ }
+ if( subpath == NULL && cself->mtime != 0 ) {
+ *ts = cself->mtime;
+ }
+ return rc;
+}
+
+struct DirectoryNode_DirVisit_Data {
+ FSNode_Dir_Visit func;
+ void* data;
+};
+
+static
+rc_t CC DirectoryNode_DirVisit( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ struct DirectoryNode_DirVisit_Data* d = (struct DirectoryNode_DirVisit_Data*)data;
+ return d->func(name, d->data);
+}
+
+static
+rc_t DirectoryNode_Dir(const DirectoryNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL ) {
+ /* add XML tree children */
+ if( (rc = FSNode_ListChildren(&cself->node, func, data)) == 0 ) {
+ if( (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ if( cself->ls != NULL ) {
+ /* add ls result excluding XML children */
+ uint32_t i = 0, count = 0;
+ rc = KNamelistCount(cself->ls, &count);
+ while(rc == 0 && i < count) {
+ const char* nm = NULL;
+ const FSNode* ch;
+ bool hidden = true;
+ if( (rc = KNamelistGet(cself->ls, i++, &nm)) == 0 &&
+ (((rc = FSNode_FindChild(&cself->node, nm, strlen(nm), &ch, &hidden)) == 0 && hidden) ||
+ (GetRCObject(rc) == rcName && GetRCState(rc) == rcNotFound)) ) {
+ rc = func(nm, data);
+ }
+ }
+ }
+ if( rc == 0 ) {
+ struct DirNodeChild_List_Data d;
+ d.rc = 0;
+ d.cself = cself;
+ d.func = func;
+ d.data = data;
+ /* add detected child nodes excluding XML children */
+ BSTreeDoUntil(&cself->children, false, DirNodeChild_List, &d);
+ rc = d.rc;
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ }
+ }
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ struct DirectoryNode_DirVisit_Data d;
+ d.func = func;
+ d.data = data;
+ DEBUG_LINE(8, "Listing kdir path %s/%s", cself->path, subpath);
+ rc = KDirectoryVisit(dir, false, DirectoryNode_DirVisit, &d, "%s/%s", cself->path, subpath);
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t DirectoryNode_Link(const DirectoryNode* cself, const char* subpath, char* buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+ if( cself->path == NULL ) {
+ rc = RC(rcExe, rcPath, rcAliasing, rcDirEntry, rcUnsupported);
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ if( subpath == NULL ) {
+ DEBUG_LINE(8, "Resolving %s", cself->path);
+ rc = KDirectoryResolveAlias(dir, true, buf, buf_sz, "%s", cself->path);
+ } else {
+ DEBUG_LINE(8, "Resolving %s/%s", cself->path, subpath);
+ rc = KDirectoryResolveAlias(dir, true, buf, buf_sz, "%s/%s", cself->path, subpath);
+ }
+ DEBUG_LINE(8, "Resolved %s", rc == 0 ? buf : NULL);
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t DirectoryNode_Open(const DirectoryNode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ const char* nm = NULL;
+
+ if( (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ const FSNode* child = NULL;
+ if( (rc = DirectoryNode_IsChild(cself, subpath, &child, DirNodeChild_FindByName)) == 0 ) {
+ rc = FSNode_Open(child, NULL, accessor);
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ if( child != NULL ) {
+ return rc;
+ }
+ }
+ if( (rc = FSNode_GetName(&cself->node, &nm)) == 0 ) {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ const KFile* kf = NULL;
+ if( (rc = KDirectoryOpenFileRead(dir, &kf, "%s/%s", cself->path, subpath)) == 0 ) {
+ if( (rc = KFileAccessor_Make(accessor, nm, kf)) != 0 ) {
+ ReleaseComplain(KFileRelease, kf);
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t DirectoryNode_Release(DirectoryNode* self)
+{
+ rc_t rc = 0;
+ if( self != NULL ) {
+ BSTreeWhack(&self->children, DirNodeChild_Whack, NULL);
+ ReleaseComplain(KRWLockRelease, self->lock);
+ ReleaseComplain(KNamelistRelease, self->ls);
+ FREE(self->path);
+ }
+ return rc;
+}
+
+static FSNode_vtbl DirectoryNode_vtbl = {
+ sizeof(DirectoryNode),
+ NULL,
+ DirectoryNode_Touch,
+ DirectoryNode_Attr,
+ DirectoryNode_Dir,
+ DirectoryNode_Link,
+ DirectoryNode_Open,
+ DirectoryNode_Release
+};
+
+
+rc_t DirectoryNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path,
+ KTime_t dflt_ktm, EXMLValidate validate)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || cself == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcConstructing, rcParam, rcNull);
+ } else {
+ char* path = NULL, *name = NULL, name_buf[4096];
+ KTime_t ktm = 0;
+ DirectoryNode* ff = NULL;
+
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &path, NULL)) == 0 ) {
+ if( path[0] == '\0' ) {
+ FREE(path);
+ path = NULL;
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ if( path[0] != '/' ) {
+ char resolved[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, resolved, sizeof(resolved),
+ "%s%s", rel_path, path)) == 0 ) {
+ DEBUG_LINE(8, "%s%s resolved to %s", rel_path, path, resolved);
+ FREE(path);
+ rc = StrDup(resolved, &path);
+ }
+ }
+ if( rc == 0 && validate > eXML_NoCheck ) {
+ uint32_t t = KDirectoryPathType(dir, "%s", path);
+ if( t != kptDir && t != (kptDir | kptAlias) ) {
+ if( validate > eXML_NoFail ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, t == kptNotFound ? rcNotFound : rcInvalid);
+ } else {
+ PLOGMSG(klogErr, (klogErr, "Directory path '$(p)' not found", "p=%s", path));
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "Directory/@path: '");
+ strcat(errmsg, path ? path : "(null)");
+ strcat(errmsg, "'");
+ }
+ if( rc == 0 ) {
+ size_t sz;
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name_buf, sizeof(name_buf), &sz);
+ if( rc == 0 && name_buf[0] != '\0' ) {
+ name = name_buf;
+ } else if( (GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "Directory/@name");
+ } else if( name == NULL ) {
+ if( path == NULL ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ } else {
+ name = strrchr(path, '/');
+ name = name ? name + 1 : path;
+ }
+ }
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(xml_node, "timestamp", &ktm, true)) != 0 ) {
+ strcpy(errmsg, "Directory/@timestamp");
+ }
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0 || strcmp("name", attr_nm) == 0 || strcmp("timestamp", attr_nm) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute Directory/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)&ff, name, &DirectoryNode_vtbl)) == 0 &&
+ (rc = KRWLockMake(&ff->lock)) == 0 ) {
+ ff->path = path;
+ ff->mtime = ktm != 0 ? ktm : (path ? 0 : dflt_ktm);
+ BSTreeInit(&ff->children);
+ } else {
+ strcpy(errmsg, "Directory '");
+ strcat(errmsg, name);
+ strcat(errmsg, "'");
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &ff->node;
+ } else {
+ FREE(path);
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/directory.h b/tools/fuse/directory.h
new file mode 100644
index 0000000..9acc3c5
--- /dev/null
+++ b/tools/fuse/directory.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_directory_
+#define _h_sra_fuse_directory_
+
+#include "node.h"
+
+rc_t DirectoryNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path,
+ KTime_t ts, EXMLValidate validate);
+
+#endif /* _h_sra_fuse_directory_ */
diff --git a/tools/fuse/dump-idx.c b/tools/fuse/dump-idx.c
new file mode 100644
index 0000000..e1a25db
--- /dev/null
+++ b/tools/fuse/dump-idx.c
@@ -0,0 +1,102 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include <kapp/main.h>
+#include <kapp/log.h>
+#include <klib/rc.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+
+#include <sra/sradb.h>
+
+rc_t KMain ( int argc, char *argv [] )
+{
+ rc_t rc = 0;
+ char const *table_dir = NULL;
+ char const *idx_name = NULL;
+ const KDBManager* kmgr = NULL;
+ const KTable* ktbl = NULL;
+ const KIndex* kidx = NULL;
+
+ if( argc < 3 ) {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcPath, rcNull );
+ PLOGERR((klogErr, rc, "Usage:\n $(a) <path> <index-name>", PLOG_S(a), argv[0]));
+ return rc;
+ }
+
+ table_dir = argv[1];
+ idx_name = argv[2];
+
+ rc = KDBManagerMakeRead(&kmgr, NULL);
+ if( rc == 0 ) {
+ rc = KDBManagerOpenTableRead(kmgr, &ktbl, table_dir);
+ if( rc == 0 ) {
+ PLOGMSG((klogInfo, "Table $(p) index $(i)", PLOG_2(PLOG_S(p),PLOG_S(i)), table_dir, idx_name));
+ rc = KTableOpenIndexRead(ktbl, &kidx, idx_name);
+ if( rc == 0 ) {
+ uint64_t off1 = 0, off2 = 0, sz = 0, id_q = 0;
+ int64_t id = 0;
+ while(true) {
+ rc = KIndexFindU64(kidx, off1, &off2, &sz, &id, &id_q);
+ if( rc != 0 ) {
+ break;
+ }
+ PLOGMSG((klogInfo, "$(i) index spot $(s) ($(q)) offset [$(f):$(t)]",
+ PLOG_5(PLOG_S(i),PLOG_I64(s),PLOG_U64(q),PLOG_U64(f),PLOG_U64(t)), idx_name, id, id_q, off2, off2 + sz - 1));
+ off1 = off2 + sz + 1;
+ {{
+ uint64_t f = off2, t = off2 + sz;
+ while( f != t ) {
+ uint64_t o, z;
+ int64_t newid;
+ if( (rc = KIndexFindU64(kidx, f, &o, &z, &newid, &id_q)) != 0 ) {
+ PLOGERR((klogErr, rc, "sub $(f)", PLOG_U64(f), f));
+ break;
+ }
+ if( id != newid ) {
+ PLOGMSG((klogErr, "no match on offset $(f): $(i) <-> $(n)",
+ PLOG_3(PLOG_U64(f),PLOG_I64(i),PLOG_I64(n)), f, id, newid));
+ }
+ f++;
+ }
+ }}
+ }
+ KIndexRelease(kidx);
+ }
+ KTableRelease(ktbl);
+ }
+ KDBManagerRelease(kmgr);
+ }
+ LOGERR(rc == 0 ? klogInfo : klogErr, rc, "Done");
+ return rc;
+}
diff --git a/tools/fuse/file.c b/tools/fuse/file.c
new file mode 100644
index 0000000..a7548a5
--- /dev/null
+++ b/tools/fuse/file.c
@@ -0,0 +1,275 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <krypto/encfile.h>
+#include <krypto/key.h>
+
+typedef struct FileNode FileNode;
+#define FSNODE_IMPL FileNode
+
+#include "log.h"
+#include "xml.h"
+#include "file.h"
+#include "kfile-accessor.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+struct FileNode {
+ FSNode node;
+ char* path;
+ KTime_t mtime;
+ KKey key;
+};
+
+static
+rc_t FileNode_Attr(const FileNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+ KDirectory* dir = NULL;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ } else if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ *type = KDirectoryPathType(dir, "%s", cself->path);
+ DEBUG_LINE(8, "file type %x", *type);
+ if( cself->mtime != 0 ) {
+ *ts = cself->mtime;
+ } else if( (rc = KDirectoryDate(dir, ts, "%s", cself->path)) == 0 ) {
+ DEBUG_LINE(8, "file mtime %u", *ts);
+ }
+ if( rc == 0 && (rc = KDirectoryAccess(dir, access, "%s", cself->path)) == 0 ) {
+ DEBUG_LINE(8, "file access %x", *access);
+ if( *type & kptAlias ) {
+ char r[10240];
+ if( (rc = KDirectoryResolveAlias(dir, true, r, sizeof(r), "%s", cself->path)) == 0 ) {
+ *file_sz = strlen(r);
+ }
+ } else if( *type == kptFile ) {
+ rc = KDirectoryFileSize(dir, file_sz, "%s", cself->path);
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ return rc;
+}
+
+static
+rc_t FileNode_Link(const FileNode* cself, const char* subpath, char* buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+ KDirectory* dir = NULL;
+
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ rc = KDirectoryResolveAlias(dir, true, buf, buf_sz, "%s", cself->path);
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ return rc;
+}
+
+static
+rc_t FileNode_Open(const FileNode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ const KFile* kf = NULL;
+ const KFile* enc_kf = NULL;
+ const KFile* immediate = NULL;
+ if( (rc = KDirectoryOpenFileRead(dir, &kf, "%s", cself->path)) == 0 ) {
+ immediate = kf;
+ if( cself->key.type != kkeyNone ) {
+ /* TODO: what is the correct way to release KFile objects */
+ rc = KEncFileMakeRead (&enc_kf, kf, &cself->key);
+ immediate = enc_kf;
+ }
+ if( rc == 0 ) {
+ if( (rc = KFileAccessor_Make(accessor, cself->node.name, immediate)) != 0 ) {
+ ReleaseComplain(KFileRelease, immediate);
+ }
+ }
+
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t FileNode_Release(FileNode* self)
+{
+ if( self != NULL ) {
+ FREE(self->path);
+ }
+ return 0;
+}
+
+static FSNode_vtbl FileNode_vtbl = {
+ sizeof(FileNode),
+ NULL,
+ NULL,
+ FileNode_Attr,
+ NULL,
+ FileNode_Link,
+ FileNode_Open,
+ FileNode_Release
+};
+
+rc_t FileNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path, EXMLValidate validate)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || cself == NULL || errmsg == NULL || rel_path == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ char* path = NULL, *name = NULL, name_buf[4096], password[4096];
+ KTime_t ktm = 0;
+ FileNode* ff = NULL;
+ size_t password_sz = 0;
+
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &path, NULL)) == 0 ) {
+ if( path[0] == '\0' ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ if( path[0] != '/' ) {
+ char resolved[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, resolved, sizeof(resolved),
+ "%s%s", rel_path, path)) == 0 ) {
+ DEBUG_LINE(8, "%s%s resolved to %s", rel_path, path, resolved);
+ FREE(path);
+ rc = StrDup(resolved, &path);
+ }
+ }
+ if( rc == 0 && validate > eXML_NoCheck ) {
+ uint32_t t = KDirectoryPathType(dir, "%s", path);
+ if( (t != kptFile && t != (kptFile | kptAlias)) &&
+ (t != kptCharDev && t != (kptCharDev | kptAlias)) &&
+ (t != kptBlockDev && t != (kptBlockDev | kptAlias)) &&
+ (t != kptFIFO && t != (kptFIFO | kptAlias)) ) {
+ if( validate > eXML_NoFail ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, t == kptNotFound ? rcNotFound : rcInvalid);
+ } else {
+ PLOGMSG(klogErr, (klogErr, "File path '$(p)' not found", "p=%s", path));
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@path: '");
+ strcat(errmsg, path ? path : "(null)");
+ strcat(errmsg, "'");
+ }
+ if( rc == 0 ) {
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name_buf, sizeof(name_buf), &password_sz);
+ if( rc == 0 && name_buf[0] != '\0' ) {
+ name = name_buf;
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@name");
+ } else if( name == NULL ) {
+ name = strrchr(path, '/');
+ name = name ? name + 1 : path;
+ }
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(xml_node, "timestamp", &ktm, true)) != 0 ) {
+ strcpy(errmsg, "File/@timestamp");
+ }
+ if( rc == 0 ) {
+ rc = KXMLNodeReadAttrCString(xml_node, "password", password, sizeof(password), &password_sz);
+ if( rc == 0 || (GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ rc = 0;
+ password_sz = 0;
+ } else {
+ strcpy(errmsg, "File/@password");
+ }
+ }
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0 || strcmp("name", attr_nm) == 0 ||
+ strcmp("timestamp", attr_nm) == 0 || strcmp("password", attr_nm) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute File/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)&ff, name, &FileNode_vtbl)) == 0 ) {
+ ff->path = path;
+ ff->mtime = ktm;
+ if( password_sz > 0 ) {
+ rc = KKeyInitRead(&ff->key, kkeyAES128, password, password_sz);
+ } else {
+ memset(&ff->key, 0, sizeof ff->key);
+ ff->key.type = kkeyNone;
+ }
+ } else {
+ strcpy(errmsg, "File '");
+ strcat(errmsg, name);
+ strcat(errmsg, "'");
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &ff->node;
+ } else {
+ FREE(path);
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/file.h b/tools/fuse/file.h
new file mode 100644
index 0000000..9f9d2e4
--- /dev/null
+++ b/tools/fuse/file.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_file_
+#define _h_sra_fuse_file_
+
+#include "node.h"
+
+rc_t FileNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path, EXMLValidate validate);
+
+#endif /* _h_sra_fuse_file_ */
diff --git a/tools/fuse/formats.c b/tools/fuse/formats.c
new file mode 100644
index 0000000..cb3d8db
--- /dev/null
+++ b/tools/fuse/formats.c
@@ -0,0 +1,443 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <klib/rc.h>
+#include <klib/checksum.h>
+#include <klib/printf.h>
+#include <kfs/file.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+
+#include <sra/sradb-priv.h>
+
+#include "log.h"
+#include "zlib-simple.h"
+#include "sra-list.h"
+#include "formats.h"
+#include "text-file.h"
+#include "sra-fastq.h"
+#include "sra-sff.h"
+
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+static
+rc_t FileOptions_MakeSuffix(FileOptions* self, const char* suffix, KTime_t ts)
+{
+ rc_t rc = 0;
+
+ if( suffix == NULL ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcParam, rcNull);
+ } else if( strlen(suffix) > FILEOPTIONS_BUFFER - 2 ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcBuffer, rcInsufficient);
+ } else {
+ strcpy(self->suffix, (isalnum(suffix[0]) && suffix[0] != '_') ? "." : "");
+ strcat(self->suffix, suffix);
+ }
+ return rc;
+}
+
+rc_t FileOptions_Make(FileOptions** self, uint32_t count)
+{
+ assert(self != NULL);
+ CALLOC(*self, count, sizeof(**self));
+ if( *self == NULL ) {
+ return RC(rcExe, rcTable, rcAllocating, rcMemory, rcExhausted);
+ }
+ return 0;
+}
+
+void FileOptions_Release(FileOptions* self)
+{
+ if( self != NULL ) {
+ FREE(self);
+ }
+}
+
+rc_t FileOptions_Clone(FileOptions** self, const FileOptions* src, uint32_t count)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || src == NULL ) {
+ rc = RC(rcExe, rcTable, rcCopying, rcParam, rcNull);
+ } else if( (rc = FileOptions_Make(self, count)) == 0 ) {
+ memmove(*self, src, sizeof(**self) * count);
+ }
+ return rc;
+}
+
+rc_t FileOptions_SRAArchive(FileOptions* self, const SRATable* tbl, KTime_t ts, bool lite)
+{
+ rc_t rc = 0;
+
+ if( tbl == NULL || self == NULL ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcParam, rcNull);
+ } else {
+ const KFile* sfa = NULL;
+ const char* ext;
+ if( (rc = SRATableMakeSingleFileArchive(tbl, &sfa, lite, &ext)) == 0 ) {
+ if( (rc = KFileSize(sfa, &self->file_sz)) == 0 &&
+ (rc = FileOptions_MakeSuffix(self, ext, ts)) == 0 ) {
+ self->type = lite ? eSRAFuseFmtArcLite : eSRAFuseFmtArc;
+ self->f.sra.lite = lite;
+ }
+ ReleaseComplain(KFileRelease, sfa);
+ }
+ }
+ return rc;
+}
+
+rc_t FileOptions_SRAArchiveInstant(FileOptions* self, FileOptions* fmd5,
+ const SRAMgr* mgr, const char* accession, const char* path,
+ const bool lite, KTime_t ts, uint64_t size, char md5[32])
+{
+ rc_t rc = 0;
+
+ if( self == NULL || mgr == NULL || accession == NULL || fmd5 == NULL ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcParam, rcNull);
+ } else {
+ const char* ext;
+
+ /* Only support non-lite files, if lite is needed fix this*/
+ /*if (lite)
+ {
+ PLOGERR(klogErr, (klogErr, 0, "lite flag is not supported, get rid of lite flag in xml, in FileOptions_SRAArchiveInstant for path or accession = $(a)", PLOG_S(a), path ? path : accession));
+ abort();
+ }
+ assert(!lite);*/
+ ext = lite ? ".lite.sra" : ".sra";
+
+ if( (rc = FileOptions_MakeSuffix(self, ext, ts)) == 0 ) {
+ self->file_sz = size;
+ self->type = lite ? eSRAFuseFmtArcLite : eSRAFuseFmtArc;
+ self->f.sra.lite = lite;
+ memmove(self->md5, md5, sizeof(self->md5));
+ if( (rc = FileOptions_AttachMD5(self, accession, fmd5)) == 0 ) {
+ rc = FileOptions_UpdateMD5(self, accession);
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t FileOptions_SRAArchiveUpdate(FileOptions* self, const char* name,
+ KTime_t ts, uint64_t size, char md5[32])
+{
+ rc_t rc = 0;
+
+ if( self == NULL || name == NULL ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcParam, rcNull);
+ } else {
+ self->file_sz = size;
+ if( md5 == NULL ) {
+ memset(self->md5, 0, sizeof(self->md5));
+ } else {
+ memmove(self->md5, md5, sizeof(self->md5));
+ }
+ rc = FileOptions_UpdateMD5(self, name);
+ }
+ return rc;
+}
+
+rc_t FileOptions_AttachMD5(FileOptions* self, const char* name, FileOptions* md5)
+{
+ rc_t rc = 0;
+ if( name == NULL || self == NULL || md5 == NULL ) {
+ rc = RC(rcExe, rcFormat, rcAttaching, rcParam, rcInvalid);
+ } else {
+ switch(self->type) {
+ case eSRAFuseFmtFastq:
+ case eSRAFuseFmtFastqGz:
+ md5->type = eSRAFuseFmtFastqMD5;
+ break;
+ case eSRAFuseFmtSFF:
+ case eSRAFuseFmtSFFGz:
+ md5->type = eSRAFuseFmtSFFMD5;
+ break;
+ case eSRAFuseFmtArc:
+ md5->type = eSRAFuseFmtArcMD5;
+ break;
+ case eSRAFuseFmtArcLite:
+ md5->type = eSRAFuseFmtArcLiteMD5;
+ break;
+ default:
+ rc = RC(rcExe, rcFormat, rcReading, rcType, rcUnexpected);
+ }
+ if( rc == 0 ) {
+ char buf[sizeof(md5->suffix)];
+
+ strcpy(buf, self->suffix);
+ strcat(buf, ".md5");
+ if( (rc = FileOptions_MakeSuffix(md5, buf, 0)) == 0 ) {
+ self->md5_file = md5 - self;
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t FileOptions_CalcMD5(FileOptions* self, const char* name, const SRAListNode* sra)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || sra == NULL || name == NULL ) {
+ rc = RC(rcExe, rcFormat, rcProcessing, rcParam, rcInvalid);
+ } else if( self->md5[0] == '\0' ) {
+ const KFile* kfile;
+ if( (rc = FileOptions_OpenFile(self, sra, &kfile)) == 0 ) {
+ MD5State md5;
+ uint64_t pos = 0;
+ uint8_t buffer[256 * 1024];
+ size_t num_read = 0, x;
+
+ MD5StateInit(&md5);
+ do {
+ if( (rc = KFileRead(kfile, pos, buffer, sizeof(buffer), &num_read)) == 0 ) {
+ MD5StateAppend(&md5, buffer, num_read);
+ pos += num_read;
+ }
+ } while(rc == 0 && num_read != 0);
+ if( rc == 0 ) {
+ uint8_t digest[16];
+ char smd5[sizeof(self->md5) + 1];
+ MD5StateFinish(&md5, digest);
+ for(pos = 0, x = 0; rc == 0 && pos < sizeof(digest); pos++) {
+ rc = string_printf(&smd5[x], sizeof(smd5) - x, &num_read, "%02x", digest[pos]);
+ x += num_read;
+ }
+ memmove(self->md5, smd5, sizeof(self->md5));
+ DEBUG_LINE(10, "%s %s %.*s", self->suffix, name, sizeof(self->md5), self->md5);
+ }
+ KFileRelease(kfile);
+ }
+ }
+ return rc;
+}
+
+rc_t FileOptions_UpdateMD5(FileOptions* self, const char* name)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || name == NULL ) {
+ rc = RC(rcExe, rcFormat, rcUpdating, rcParam, rcInvalid);
+ } else if( self->md5_file != 0 ) {
+ FileOptions* md5 = &self[self->md5_file];
+ if( self->md5[0] != '\0' ) {
+ size_t nw;
+ rc = string_printf(md5->f.txt64b, sizeof(md5->f.txt64b), &nw,
+ "%.*s *%s%s\n", sizeof(self->md5), self->md5, name, self->suffix);
+ md5->file_sz = rc ? 0 : nw;
+ } else {
+ md5->f.txt64b[0] = '\0';
+ md5->file_sz = 0;
+ }
+ }
+ return rc;
+}
+
+rc_t FileOptions_OpenFile(const FileOptions* cself, const struct SRAListNode* sra, const KFile** kfile)
+{
+ rc_t rc = 0;
+
+ assert(cself != NULL);
+ assert(kfile != NULL);
+ *kfile = NULL;
+ switch(cself->type) {
+ case eSRAFuseFmtArc:
+ case eSRAFuseFmtArcLite:
+ {{
+ const SRATable* tbl = NULL;
+ if( (rc = SRAListNode_TableOpen(sra, &tbl)) == 0 ) {
+ rc = SRATableMakeSingleFileArchive(tbl, kfile, cself->f.sra.lite, NULL);
+ ReleaseComplain(SRATableRelease, tbl);
+ }
+ }}
+ break;
+
+ case eSRAFuseFmtFastqMD5:
+ case eSRAFuseFmtSFFMD5:
+ case eSRAFuseFmtArcMD5:
+ case eSRAFuseFmtArcLiteMD5:
+ rc = TextFile_Open(kfile, cself);
+ break;
+
+ case eSRAFuseFmtFastq:
+ case eSRAFuseFmtFastqGz:
+ rc = SRAFastqFile_Open(kfile, sra, cself);
+ break;
+
+ case eSRAFuseFmtSFF:
+ case eSRAFuseFmtSFFGz:
+ rc = SRASFFFile_Open(kfile, sra, cself);
+ break;
+ }
+ return rc;
+}
+
+rc_t FileOptions_ParseMeta(FileOptions* self, const KMDataNode* file, const SRATable* tbl, KTime_t ts, const char* suffix)
+{
+ rc_t rc = 0;
+
+ if( file == NULL || self == NULL || suffix == NULL ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcParam, rcNull);
+ } else if( strlen(suffix) > FILEOPTIONS_BUFFER - 2 ) {
+ rc = RC(rcExe, rcFormat, rcReading, rcBuffer, rcInsufficient);
+ } else if( (rc = FileOptions_MakeSuffix(self, suffix, ts)) == 0 ) {
+ const KMDataNode* format = NULL;
+ if( (rc = KMDataNodeOpenNodeRead(file, &format, "Format")) == 0 ) {
+ char fmt_name[32];
+ size_t read = 0;
+ if( (rc = KMDataNodeReadCString(format, fmt_name, sizeof(fmt_name), &read)) == 0 ) {
+ const KMDataNode* tmp = NULL;
+ fmt_name[read] = '\0';
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(file, &tmp, "Size")) == 0 ) {
+ rc = KMDataNodeReadB64(tmp, &self->file_sz);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(file, &tmp, "Buffer")) == 0 ) {
+ rc = KMDataNodeReadB32(tmp, &self->buffer_sz);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(file, &tmp, "Index")) == 0 ) {
+ if( (rc = KMDataNodeReadCString(tmp, self->index, sizeof(self->index) - 1, &read)) == 0 && tbl != NULL ) {
+ const KTable* ktbl = NULL;
+ if( (rc = SRATableGetKTableRead(tbl, &ktbl)) == 0 ) {
+ const KIndex* kidx = NULL;
+ if( (rc = KTableOpenIndexRead(ktbl, &kidx, self->index)) == 0 ) {
+ ReleaseComplain(KIndexRelease, kidx);
+ }
+ ReleaseComplain(KTableRelease, ktbl);
+ }
+ }
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && KMDataNodeOpenNodeRead(file, &tmp, "md5") == 0 ) {
+ rc = KMDataNodeReadCString(tmp, self->md5, sizeof(self->md5), &read);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 ) {
+ if(strcmp(fmt_name, "fastq") == 0 || strcmp(fmt_name, "fastq-gzip") == 0 ) {
+ if( strcmp(fmt_name, "fastq-gzip") == 0 ) {
+ self->type = eSRAFuseFmtFastqGz;
+ self->f.fastq.gzip = true;
+ if( (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/ZlibVersion")) == 0 ) {
+ uint16_t v = 0;
+ rc = KMDataNodeReadB16(tmp, &v);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ if( rc == 0 && v > ZLIB_VERNUM ) {
+ PLOGMSG(klogWarn, (klogWarn, "ZLib version old: $(v) < $(mj).$(mn).$(b)",
+ PLOG_4(PLOG_S(v),PLOG_U8(mj),PLOG_U8(mn),PLOG_U8(b)),
+ ZLIB_VERSION, v & 0xF000, v & 0x0F00, v & 0x00FF));
+ }
+ }
+ } else {
+ self->type = eSRAFuseFmtFastq;
+ }
+
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/accession")) == 0 ) {
+ rc = KMDataNodeReadCString(tmp, self->f.fastq.accession, sizeof(self->f.fastq.accession) - 1, &read);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/minSpotId")) == 0 ) {
+ rc = KMDataNodeReadB64(tmp, &self->f.fastq.minSpotId);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/maxSpotId")) == 0 ) {
+ rc = KMDataNodeReadB64(tmp, &self->f.fastq.maxSpotId);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/colorSpace")) == 0 ) {
+ rc = KMDataNodeReadB8(tmp, &self->f.fastq.colorSpace);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/colorSpaceKey")) == 0 ) {
+ rc = KMDataNodeRead(tmp, 0, &self->f.fastq.colorSpaceKey, 1, &read, NULL);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/origFormat")) == 0 ) {
+ rc = KMDataNodeReadB8(tmp, &self->f.fastq.origFormat);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/printLabel")) == 0 ) {
+ rc = KMDataNodeReadB8(tmp, &self->f.fastq.printLabel);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/printReadId")) == 0 ) {
+ rc = KMDataNodeReadB8(tmp, &self->f.fastq.printReadId);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/clipQuality")) == 0 ) {
+ rc = KMDataNodeReadB8(tmp, &self->f.fastq.clipQuality);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/minReadLen")) == 0 ) {
+ rc = KMDataNodeReadB32(tmp, &self->f.fastq.minReadLen);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/qualityOffset")) == 0 ) {
+ rc = KMDataNodeReadB16(tmp, &self->f.fastq.qualityOffset);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ } else if(strcmp(fmt_name, "SFF") == 0 || strcmp(fmt_name, "SFF-gzip") == 0 ) {
+ if( strcmp(fmt_name, "SFF-gzip") == 0 ) {
+ self->type = eSRAFuseFmtSFFGz;
+ self->f.sff.gzip = true;
+ if( (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/ZlibVersion")) == 0 ) {
+ uint16_t v = 0;
+ rc = KMDataNodeReadB16(tmp, &v);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ if( rc == 0 && v > ZLIB_VERNUM ) {
+ PLOGMSG(klogWarn, (klogWarn, "ZLib version old: $(v) < $(mj).$(mn).$(b)",
+ PLOG_4(PLOG_S(v),PLOG_U8(mj),PLOG_U8(mn),PLOG_U8(b)),
+ ZLIB_VERSION, v & 0xF000, v & 0x0F00, v & 0x00FF));
+ }
+ }
+ } else {
+ self->type = eSRAFuseFmtSFF;
+ }
+
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/accession")) == 0 ) {
+ rc = KMDataNodeReadCString(tmp, self->f.sff.accession, sizeof(self->f.sff.accession) - 1, &read);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/minSpotId")) == 0 ) {
+ rc = KMDataNodeReadB64(tmp, &self->f.sff.minSpotId);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeRead(format, &tmp, "Options/maxSpotId")) == 0 ) {
+ rc = KMDataNodeReadB64(tmp, &self->f.sff.maxSpotId);
+ ReleaseComplain(KMDataNodeRelease, tmp);
+ }
+ } else {
+ rc = RC(rcExe, rcFormat, rcReading, rcFormat, rcUnrecognized);
+ }
+ }
+ }
+ ReleaseComplain(KMDataNodeRelease, format);
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/formats.h b/tools/fuse/formats.h
new file mode 100644
index 0000000..fd472f0
--- /dev/null
+++ b/tools/fuse/formats.h
@@ -0,0 +1,157 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sra_fuse_formats_
+#define _h_sra_fuse_formats_
+
+#include <kfs/file.h>
+#include <kdb/meta.h>
+#include <sra/sradb.h>
+
+#define FILEOPTIONS_BUFFER 32
+
+struct SRAListNode;
+
+/* DO NOT CHANGE SIZE OR ELEMENT ORDER OF THIS STRUCTURE
+ CACHE MAY FAIL! see SRAList_Init */
+typedef struct FileOptionsOld {
+ enum {
+ eOldSRAFuseFmtArc = 0x0001,
+ eOldSRAFuseFmtArcLite = 0x0002,
+ eOldSRAFuseFmtFastq = 0x0004,
+ eOldSRAFuseFmtFastqGz = 0x0008,
+ eOldSRAFuseFmtFastqMD5 = 0x0010,
+ eOldSRAFuseFmtSFF = 0x0020,
+ eOldSRAFuseFmtSFFGz = 0x0040,
+ eOldSRAFuseFmtSFFMD5 = 0x0080,
+ eOldSRAFuseFmtArcMD5 = 0x0100,
+ eOldSRAFuseFmtArcLiteMD5 = 0x0200
+ } type;
+ char suffix[FILEOPTIONS_BUFFER];
+ uint64_t file_sz;
+ KTime_t obsolete; /* not removed because cache is binary */
+ char index[FILEOPTIONS_BUFFER];
+ uint32_t buffer_sz;
+
+ union {
+ char txt64b[FILEOPTIONS_BUFFER * 2];
+ struct {
+ bool lite;
+ } sra;
+ struct {
+ char accession[FILEOPTIONS_BUFFER];
+ uint64_t minSpotId;
+ uint64_t maxSpotId;
+ uint8_t colorSpace;
+ char colorSpaceKey;
+ uint8_t origFormat;
+ uint8_t printLabel;
+ uint8_t printReadId;
+ uint8_t clipQuality;
+ uint32_t minReadLen;
+ uint16_t qualityOffset;
+ bool gzip;
+ } fastq;
+ struct {
+ char accession[FILEOPTIONS_BUFFER];
+ uint64_t minSpotId;
+ uint64_t maxSpotId;
+ bool gzip;
+ } sff;
+ } f;
+} FileOptionsOld;
+
+typedef struct FileOptions {
+ enum {
+ eSRAFuseFmtArc = 0x0001,
+ eSRAFuseFmtArcLite = 0x0002,
+ eSRAFuseFmtFastq = 0x0004,
+ eSRAFuseFmtFastqGz = 0x0008,
+ eSRAFuseFmtFastqMD5 = 0x0010,
+ eSRAFuseFmtSFF = 0x0020,
+ eSRAFuseFmtSFFGz = 0x0040,
+ eSRAFuseFmtSFFMD5 = 0x0080,
+ eSRAFuseFmtArcMD5 = 0x0100,
+ eSRAFuseFmtArcLiteMD5 = 0x0200
+ } type;
+ char suffix[FILEOPTIONS_BUFFER];
+ uint64_t file_sz;
+ KTime_t obsolete; /* not removed because cache is binary */
+ char index[FILEOPTIONS_BUFFER];
+ uint32_t buffer_sz;
+
+ union {
+ char txt64b[FILEOPTIONS_BUFFER * 2];
+ struct {
+ bool lite;
+ } sra;
+ struct {
+ char accession[FILEOPTIONS_BUFFER];
+ uint64_t minSpotId;
+ uint64_t maxSpotId;
+ uint8_t colorSpace;
+ char colorSpaceKey;
+ uint8_t origFormat;
+ uint8_t printLabel;
+ uint8_t printReadId;
+ uint8_t clipQuality;
+ uint32_t minReadLen;
+ uint16_t qualityOffset;
+ bool gzip;
+ } fastq;
+ struct {
+ char accession[FILEOPTIONS_BUFFER];
+ uint64_t minSpotId;
+ uint64_t maxSpotId;
+ bool gzip;
+ } sff;
+ } f;
+ /* added ver this struct 2: */
+ char md5[32];
+ int8_t md5_file; /* index relative to self with array of structs, 0 - no md5 */
+} FileOptions;
+
+rc_t FileOptions_Make(FileOptions** self, uint32_t count);
+void FileOptions_Release(FileOptions* self);
+
+rc_t FileOptions_Clone(FileOptions** self, const FileOptions* src, uint32_t count);
+
+rc_t FileOptions_SRAArchive(FileOptions* self, const SRATable* tbl, KTime_t ts, bool lite);
+rc_t FileOptions_SRAArchiveInstant(FileOptions* self, FileOptions* fmd5,
+ const SRAMgr* mgr, const char* accession, const char* path,
+ const bool lite, KTime_t ts, uint64_t size, char md5[32]);
+rc_t FileOptions_SRAArchiveUpdate(FileOptions* self, const char* name,
+ KTime_t ts, uint64_t size, char md5[32]);
+
+
+rc_t FileOptions_ParseMeta(FileOptions* self, const KMDataNode* file, const SRATable* tbl, KTime_t ts, const char* suffix);
+
+rc_t FileOptions_AttachMD5(FileOptions* self, const char* name, FileOptions* md5);
+rc_t FileOptions_CalcMD5(FileOptions* self, const char* name, const struct SRAListNode* sra);
+rc_t FileOptions_UpdateMD5(FileOptions* self, const char* name);
+
+rc_t FileOptions_OpenFile(const FileOptions* cself, const struct SRAListNode* sra, const KFile** kfile);
+
+#endif /* _h_sra_fuse_formats_ */
diff --git a/tools/fuse/kfile-accessor.c b/tools/fuse/kfile-accessor.c
new file mode 100644
index 0000000..6540198
--- /dev/null
+++ b/tools/fuse/kfile-accessor.c
@@ -0,0 +1,73 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kfs/file.h>
+
+#include "log.h"
+#include "kfile-accessor.h"
+
+typedef struct KFileAccessor_struct {
+ const KFile* file;
+} KFileAccessor;
+
+static
+rc_t KFileAccessor_Read(const SAccessor* cself, char* buf, size_t size, off_t offset, size_t* num_read)
+{
+ rc_t rc = 0;
+ KFileAccessor* self = (KFileAccessor*)cself;
+ size_t actual = 0;
+
+ do {
+ rc = KFileRead(self->file, offset + *num_read, &buf[*num_read], size - *num_read, &actual);
+ if( rc == 0 && actual == 0 ) {
+ /* EOF */
+ break;
+ }
+ *num_read += actual;
+ } while(rc == 0 && *num_read < size);
+ DEBUG_MSG(10, ("From %lu read %lu bytes\n", offset, *num_read));
+ return rc;
+}
+
+static
+rc_t KFileAccessor_Release(const SAccessor* cself)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ KFileAccessor* self = (KFileAccessor*)cself;
+ rc = KFileRelease(self->file);
+ }
+ return rc;
+}
+
+rc_t KFileAccessor_Make(const SAccessor** accessor, const char* name, const KFile* kfile)
+{
+ rc_t rc = 0;
+
+ if( (rc = SAccessor_Make(accessor, sizeof(KFileAccessor), name, KFileAccessor_Read, KFileAccessor_Release)) == 0 ) {
+ ((KFileAccessor*)(*accessor))->file = kfile;
+ }
+ return rc;
+}
diff --git a/tools/fuse/kfile-accessor.h b/tools/fuse/kfile-accessor.h
new file mode 100644
index 0000000..e021bbf
--- /dev/null
+++ b/tools/fuse/kfile-accessor.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_accessor_kfile_
+#define _h_sra_fuse_accessor_kfile_
+
+#include "accessor.h"
+
+rc_t KFileAccessor_Make(const SAccessor** accessor, const char* name, const KFile* kfile);
+
+#endif /* _h_sra_fuse_accessor_kfile_ */
diff --git a/tools/fuse/log.c b/tools/fuse/log.c
new file mode 100644
index 0000000..4431511
--- /dev/null
+++ b/tools/fuse/log.c
@@ -0,0 +1,197 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kfs/directory.h>
+#include <klib/time.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <kproc/thread.h>
+
+#include "log.h"
+#include "debug.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <pthread.h>
+
+static unsigned int g_sync = 0;
+static char* g_path = NULL;
+static int g_fd = -1;
+static KThread* g_thread = NULL;
+static bool g_foreground = false;
+
+rc_t StrDup(const char* src, char** dst)
+{
+ if( src == NULL || dst == NULL ) {
+ return RC(rcExe, rcString, rcCopying, rcParam, rcNull);
+ } else {
+ size_t sz = strlen(src);
+ MALLOC(*dst, sz + 1);
+ if( dst == NULL ) {
+ return RC(rcExe, rcString, rcCopying, rcMemory, rcExhausted);
+ }
+ memmove(*dst, src, sz);
+ (*dst)[sz] = '\0';
+ }
+ return 0;
+}
+
+static
+rc_t LogFileOpen(void)
+{
+ rc_t rc = 0;
+ int old_fd = -1;
+
+ if( g_path != NULL ) {
+ int new_fd = open(g_path, O_WRONLY | O_APPEND | O_CREAT, 0664);
+ if( new_fd < 0 ) {
+ rc = RC(rcExe, rcLog, rcOpening, rcNoObj, rcIncomplete);
+ PLOGERR(klogErr, (klogErr, rc, "'$(s)': $(e)", PLOG_2(PLOG_S(s),PLOG_S(e)), g_path, strerror(errno)));
+ } else {
+ old_fd = g_fd;
+ g_fd = new_fd;
+
+ DEBUG_MSG(1, ("Log file opened '%s'\n", g_path));
+
+ if( g_foreground ) {
+ if( dup2(g_fd, STDOUT_FILENO) < 0) {
+ PLOGMSG(klogErr, (klogErr, "Cannot dup2(stdout) on '$(s)'", PLOG_S(s), g_path));
+ }
+ if( dup2(g_fd, STDERR_FILENO) < 0) {
+ PLOGMSG(klogErr, (klogErr, "Cannot dup2(stderr) on '$(s)'", PLOG_S(s), g_path));
+ }
+ }
+ }
+ }
+ if( old_fd > -1 ) {
+ KSleepMs(2000);
+ close(old_fd);
+ }
+ return rc;
+}
+
+static
+rc_t LogThread( const KThread *self, void *data )
+{
+ PLOGMSG(klogInfo, (klogInfo, "Log rotation thread started with $(s) sec", PLOG_U32(s), g_sync));
+ while( g_sync > 0 ) {
+ KSleepMs(g_sync * 1000);
+ DEBUG_MSG(1, ("Log rotation thread checking %s\n", g_path));
+ if( g_sync < 1 || g_path == NULL ) {
+ break;
+ }
+ LogFileOpen();
+ }
+ LOGMSG(klogInfo, "Log rotation thread ended");
+ return 0;
+}
+
+static
+rc_t LogFileWrite(void *self, const char *buffer, size_t bufsize, size_t *num_writ)
+{
+ rc_t rc = 0;
+
+ *num_writ = bufsize;
+ if( g_fd > -1 ) {
+ char tid[64 * 1024];
+ if( bufsize <= (sizeof(tid) - (1 + 5 + 1 + 15 + 2)) ) {
+ int x = sprintf(tid, "[%i/%x] ", getpid(), (unsigned int)pthread_self());
+ memmove(&tid[x], buffer, bufsize);
+ bufsize += x;
+ if( pwrite(g_fd, tid, bufsize, SEEK_END) != bufsize ) {
+ rc = RC(rcExe, rcLog, rcWriting, rcNoObj, rcIncomplete);
+ }
+ } else {
+ if( pwrite(g_fd, buffer, bufsize, SEEK_END) != bufsize ) {
+ rc = RC(rcExe, rcLog, rcWriting, rcNoObj, rcIncomplete);
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t LogFile_Init(const char* path, unsigned int sync, bool foreground, int* log_fd)
+{
+ rc_t rc = 0;
+
+ if( path != NULL ) {
+ KDirectory *dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ char buf[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, buf, 4096, "%s", path)) == 0 ) {
+ if( (rc = StrDup(buf, &g_path)) == 0 ) {
+ if( (rc = KOutHandlerSet(LogFileWrite, NULL)) == 0 &&
+ (rc = KDbgHandlerSet(LogFileWrite, NULL)) == 0 &&
+ (rc = KLogHandlerSet(LogFileWrite, NULL)) == 0 &&
+ (rc = KLogLibHandlerSet(LogFileWrite, NULL)) == 0 &&
+ (rc = KStsHandlerSet(LogFileWrite, NULL)) == 0 &&
+ (rc = KStsLibHandlerSet(LogFileWrite, NULL)) == 0 ) {
+ g_sync = sync;
+ g_foreground = foreground;
+ if( g_sync > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "Log $(x) rotation set to $(s) seconds",
+ PLOG_2(PLOG_S(x),PLOG_U32(s)), g_path, g_sync));
+ }
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ rc = LogFileOpen();
+ if( rc == 0 && path == NULL && g_sync > 0 ) {
+ if( (rc = KThreadMake(&g_thread, LogThread, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "Log rotation thread");
+ } else {
+ DEBUG_MSG(1, ("Log rotation thread launched %s\n", g_sync));
+ }
+ }
+ if( log_fd != NULL && g_fd != -1) {
+ *log_fd = g_fd;
+ }
+ return rc;
+}
+
+void LogFile_Fini(void)
+{
+ g_sync = 0;
+ if( g_thread != NULL ) {
+ ReleaseComplain(KThreadCancel, g_thread);
+ ReleaseComplain(KThreadRelease, g_thread);
+ }
+ if( g_fd >= 0 ) {
+ close(g_fd);
+ }
+ FREE(g_path);
+ g_path = NULL;
+ g_fd = -1;
+ g_thread = NULL;
+}
diff --git a/tools/fuse/log.h b/tools/fuse/log.h
new file mode 100644
index 0000000..4a42e6d
--- /dev/null
+++ b/tools/fuse/log.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_services_sra_fuser_log_
+#define _h_services_sra_fuser_log_
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include "debug.h"
+
+#define ReleaseComplain(release, obj) \
+ {{ \
+ rc_t t_rc_ = release(obj); \
+ if( t_rc_ != 0 ) { \
+ PLOGERR(klogWarn, (klogWarn, t_rc_, "$(file):$(line):$(func): " #release "(" #obj ")", \
+ "file=%s,line=%u,func=%s", __FILE__, __LINE__, __func__)); \
+ } \
+ }}
+
+rc_t StrDup(const char* src, char** dst);
+
+/*
+ * Set path to logfile and optional (0) log reopen thread timeout
+ * if path is NULL (re)starts watch thread if needed (sync value ignored)
+ */
+rc_t LogFile_Init(const char* path, unsigned int sync, bool foreground, int* log_fd);
+
+void LogFile_Fini(void);
+
+#endif /* _h_services_sra_fuser_log_ */
diff --git a/tools/fuse/node.c b/tools/fuse/node.c
new file mode 100644
index 0000000..4d2f6cf
--- /dev/null
+++ b/tools/fuse/node.c
@@ -0,0 +1,273 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "log.h"
+#include "node.h"
+
+rc_t FSNode_Make(FSNode** self, const char* name, const FSNode_vtbl* vtbl)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || vtbl == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else if( vtbl->Attr == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcInterface, rcInsufficient);
+ } else {
+ const char* x = name;
+ while( rc == 0 && *x != '\0' ) {
+ if( *x < 32 || !isascii(*x) || strchr("\"*/:<>?\\|", *x) != NULL ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ x++;
+ }
+ if( rc == 0 ) {
+ CALLOC(*self, 1, vtbl->type_size + (x - name + 1));
+ if( *self == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ char* x = (char*)(*self);
+ (*self)->vtbl = vtbl;
+ (*self)->name = &x[vtbl->type_size];
+ strcpy(&x[vtbl->type_size], name);
+ }
+ }
+ }
+ return rc;
+}
+
+static
+void FSNode_DropChildren(FSNode* self)
+{
+ if( self != NULL ) {
+ const FSNode* c = self->children;
+ while( c != NULL ) {
+ const FSNode* sib = c->sibling;
+ FSNode_Release(c);
+ c = sib;
+ }
+ self->children = NULL;
+ }
+}
+
+rc_t FSNode_AddChild(FSNode* self, const FSNode* child)
+{
+ rc_t rc = 0;
+ if( self == NULL || child == NULL ) {
+ rc = RC(rcExe, rcNode, rcAttaching, rcParam, rcNull);
+ } else {
+ DEBUG_MSG(8, ("Adding to %s child %s\n", self->name, child->name));
+ if( child->sibling != NULL ) {
+ rc = RC(rcExe, rcDoc, rcAttaching, rcDirEntry, rcAmbiguous);
+ } else if( self->children == NULL ) {
+ self->children = child;
+ } else {
+ const FSNode* ch = self->children;
+ while( rc == 0 && ch != NULL ) {
+ if( strcmp(child->name, ch->name) == 0 ) {
+ rc = RC(rcExe, rcDoc, rcAttaching, rcDirEntry, rcDuplicate);
+ } else if( ch->sibling == NULL ) {
+ ((FSNode*)ch)->sibling = child;
+ break;
+ }
+ ch = ch->sibling;
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t FSNode_GetName(const FSNode* cself, const char** name)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || name == NULL ) {
+ rc = RC(rcExe, rcNode, rcEvaluating, rcParam, rcNull);
+ } else {
+ *name = cself->name;
+ }
+ return rc;
+}
+
+rc_t FSNode_HasChildren(const FSNode* cself, bool* test)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || test == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcListing, rcParam, rcNull);
+ } else {
+ *test = cself->children != NULL;
+ }
+ return rc;
+}
+
+rc_t FSNode_ListChildren(const FSNode* cself, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || func == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcListing, rcParam, rcNull);
+ } else {
+ const FSNode* ch = cself->children;
+ DEBUG_MSG(10, ("Children of %s\n", cself->name));
+ while( rc == 0 && ch != NULL ) {
+ if( ch->vtbl->HasChild ) {
+ rc = FSNode_Dir(ch, NULL, func, data);
+ } else if( (rc = func(ch->name, data)) == 0 ) {
+ DEBUG_MSG(10, ("child '%s'\n", ch->name));
+ }
+ ch = ch->sibling;
+ }
+ }
+ return rc;
+}
+
+rc_t FSNode_FindChild(const FSNode* cself, const char* name, size_t name_len, const FSNode** child, bool* hidden)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || name == NULL || name_len == 0 || child == NULL || hidden == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcSearching, rcParam, rcInvalid);
+ } else {
+ const FSNode* ch = cself->children;
+ *child = NULL;
+ *hidden = false;
+ while( rc == 0 && ch != NULL && *child == NULL ) {
+ if( ch->vtbl->HasChild ) {
+ if( (rc = ch->vtbl->HasChild(ch, name, name_len)) == 0 ) {
+ *hidden = true;
+ *child = ch;
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ } else if( strlen(ch->name) == name_len && strncmp(ch->name, name, name_len) == 0 ) {
+ *child = ch;
+ }
+ ch = ch->sibling;
+ }
+ }
+ if( rc == 0 && *child == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcEvaluating, rcName, rcNotFound);
+ }
+ return rc;
+}
+
+rc_t FSNode_Touch(const FSNode* cself)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL ) {
+ rc = RC(rcExe, rcNode, rcUpdating, rcParam, rcNull);
+ } else if( cself->vtbl->Touch ) {
+ DEBUG_MSG(10, ("%s: %s\n", __func__, cself->name));
+ rc = cself->vtbl->Touch(cself);
+ }
+ return rc;
+}
+
+rc_t FSNode_Attr(const FSNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || type == NULL || ts == NULL ) {
+ rc = RC(rcExe, rcNode, rcClassifying, rcParam, rcNull);
+ } else {
+ DEBUG_MSG(10, ("%s: %s/%s\n", __func__, cself->name, subpath));
+ if( cself->vtbl->Attr ) {
+ rc = cself->vtbl->Attr(cself, subpath, type, ts, file_sz, access, block_sz);
+ } else {
+ rc = RC(rcExe, rcNode, rcClassifying, rcInterface, rcUnsupported);
+ }
+ }
+ return rc;
+}
+
+rc_t FSNode_Dir(const FSNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || func == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcListing, rcParam, rcNull);
+ } else {
+ DEBUG_MSG(10, ("%s: %s/%s\n", __func__, cself->name, subpath));
+ if( cself->vtbl->Dir ) {
+ rc = cself->vtbl->Dir(cself, subpath, func, data);
+ } else {
+ rc = RC(rcExe, rcDirectory, rcListing, rcInterface, rcUnsupported);
+ }
+ }
+ return rc;
+}
+
+rc_t FSNode_Link(const FSNode* cself, const char* subpath, char* buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || buf == NULL || buf_sz < 1 ) {
+ rc = RC(rcExe, rcPath, rcAliasing, rcParam, rcInvalid);
+ } else {
+ DEBUG_MSG(10, ("%s: %s/%s\n", __func__, cself->name, subpath));
+ if( cself->vtbl->Link ) {
+ rc = cself->vtbl->Link(cself, subpath, buf, buf_sz);
+ DEBUG_MSG(10, ("%s: %s\n", __func__, buf));
+ } else {
+ rc = RC(rcExe, rcNode, rcAliasing, rcInterface, rcUnsupported);
+ }
+ }
+ return rc;
+}
+
+rc_t FSNode_Open(const FSNode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || accessor == NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcParam, rcNull);
+ } else {
+ DEBUG_MSG(10, ("%s: %s/%s\n", __func__, cself->name, subpath));
+ if( cself->vtbl->Open ) {
+ rc = cself->vtbl->Open(cself, subpath, accessor);
+ } else {
+ rc = RC(rcExe, rcFile, rcOpening, rcInterface, rcUnsupported);
+ }
+ }
+ return rc;
+}
+
+void FSNode_Release(const FSNode* cself)
+{
+ if( cself != NULL ) {
+ FSNode* self = (FSNode*)cself;
+ FSNode_DropChildren(self);
+ if( self->vtbl->Release ) {
+ ReleaseComplain(self->vtbl->Release, self);
+ }
+ DEBUG_MSG(10, ("Release FSNode %s\n", self->name));
+ FREE(self);
+ }
+}
diff --git a/tools/fuse/node.h b/tools/fuse/node.h
new file mode 100644
index 0000000..8f02a1f
--- /dev/null
+++ b/tools/fuse/node.h
@@ -0,0 +1,108 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_node_
+#define _h_sra_fuse_node_
+
+#include "accessor.h"
+
+struct KDirectory;
+
+typedef struct FSNode_vtbl FSNode_vtbl;
+typedef struct FSNode FSNode;
+
+/* this struct must be 1st element in child objects structs! */
+struct FSNode {
+ const FSNode_vtbl* vtbl;
+ const char* name;
+ const FSNode* children;
+ const FSNode* sibling;
+};
+
+typedef rc_t ( CC * FSNode_Dir_Visit ) ( const char *name, void *data );
+
+#ifndef FSNODE_IMPL
+#define FSNODE_IMPL FSNode
+#endif
+
+struct FSNode_vtbl {
+
+ /* object size */
+ const size_t type_size;
+
+ /* for hidden node asks if a name is within, it doesn't mean that file is really present */
+ rc_t (*HasChild)(const FSNODE_IMPL* cself, const char* name, size_t name_len);
+
+ /* called to update node internal state if found by path search */
+ rc_t (*Touch)(const FSNODE_IMPL* cself);
+
+ /* the only mandatory method for the node */
+ rc_t (*Attr)(const FSNODE_IMPL* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz);
+
+ /* fill lst with subnodes names, terminate with NULL if not filled the list up to lst_sz */
+ rc_t (*Dir)(const FSNODE_IMPL* cself, const char* subpath, FSNode_Dir_Visit func, void* data);
+
+ /* resolve path to real name for a symlink, fill in buf with name */
+ rc_t (*Link)(const FSNODE_IMPL* cself, const char* subpath, char* buf, size_t buf_sz);
+
+ /* open a file for reading */
+ rc_t (*Open)(const FSNODE_IMPL* cself, const char* subpath, const SAccessor** accessor);
+
+ /* releases the object */
+ rc_t (*Release)(FSNODE_IMPL* cself);
+};
+
+/* constructor */
+
+rc_t FSNode_Make(FSNode** self, const char* name, const FSNode_vtbl* vtbl);
+
+/* static methods */
+
+rc_t FSNode_AddChild(FSNode* self, const FSNode* child);
+
+rc_t FSNode_GetName(const FSNode* cself, const char** name);
+
+rc_t FSNode_HasChildren(const FSNode* cself, bool* test);
+
+rc_t FSNode_ListChildren(const FSNode* cself, FSNode_Dir_Visit func, void* data);
+
+rc_t FSNode_FindChild(const FSNode* cself, const char* name, size_t name_len, const FSNode** child, bool* hidden);
+
+/* virtual methods */
+
+rc_t FSNode_Touch(const FSNode* cself);
+
+rc_t FSNode_Attr(const FSNode* cself, const char* subpath, uint32_t* type, KTime_t* ts,
+ uint64_t* file_sz, uint32_t* access, uint64_t* block_sz);
+
+rc_t FSNode_Dir(const FSNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data);
+
+rc_t FSNode_Link(const FSNode* cself, const char* subpath, char* buf, size_t buf_sz);
+
+rc_t FSNode_Open(const FSNode* cself, const char* subpath, const SAccessor** accessor);
+
+void FSNode_Release(const FSNode* self);
+
+#endif /* _h_sra_fuse_node_ */
diff --git a/tools/fuse/remote-cache.c b/tools/fuse/remote-cache.c
new file mode 100644
index 0000000..43ed186
--- /dev/null
+++ b/tools/fuse/remote-cache.c
@@ -0,0 +1,2129 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/cacheteefile.h>
+#include <kproc/lock.h>
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <kapp/main.h>
+
+#include <os-native.h>
+
+#include "remote-cache.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sysalloc.h>
+
+#include "log.h"
+
+/*)))
+ /// Some unusual macroses
+(((*/
+
+/*) There are methods which are using VPath to get schema and host
+ (*/
+
+typedef rc_t ( CC * _PathReader ) (
+ const VPath * self,
+ char * Buffer,
+ size_t BufferSize,
+ size_t * NumRead
+ );
+static
+rc_t CC
+_ReadSomething (
+ const char * Path,
+ char * Buffer,
+ size_t BufferSize,
+ _PathReader Reader
+)
+{
+ rc_t RCt;
+ VFSManager * Manager;
+ VPath * ThePath;
+ size_t NumRead;
+
+ RCt = 0;
+ NumRead = 0;
+ Manager = NULL;
+ ThePath = NULL;
+
+ if ( Path == NULL || Buffer == NULL || BufferSize <= 0 || Reader == NULL ) {
+ return RC ( rcExe, rcPath, rcReading, rcParam, rcNull );
+ }
+
+ * Buffer = 0;
+
+ RCt = VFSManagerMake ( & Manager );
+ if ( RCt == 0 ) {
+ RCt = VFSManagerMakePath ( Manager, & ThePath, Path );
+ if ( RCt == 0 ) {
+ RCt = Reader ( ThePath, Buffer, BufferSize, & NumRead );
+
+ ReleaseComplain ( VPathRelease, ThePath );
+ }
+
+ ReleaseComplain ( VFSManagerRelease, Manager );
+ }
+
+ return RCt;
+} /* _ReadSomething () */
+
+static
+rc_t CC
+_ReadSchema ( const char * Path, char * Buffer, size_t BufferSize )
+{
+ return _ReadSomething ( Path, Buffer, BufferSize, VPathReadScheme );
+} /* _ReadSchema () */
+
+bool CC
+_MatchSchemas ( const char * Schema1, const char * Schema2 )
+{
+ size_t S1Size, S2Size;
+
+ if ( Schema1 == NULL || Schema2 == NULL ) {
+ return false;
+ }
+
+ S1Size = string_size ( Schema1 );
+ S2Size = string_size ( Schema2 );
+
+ if ( S1Size == S2Size ) {
+ if ( string_cmp (
+ Schema1,
+ S1Size,
+ Schema2,
+ S1Size,
+ S1Size
+ ) == 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+} /* _MatchSchemas () */
+
+bool CC
+IsRemotePath ( const char * Path )
+{
+ char Schema [ 256 ];
+ bool IsRemote;
+
+
+ IsRemote = false;
+
+ if ( Path == NULL ) {
+ return false;
+ }
+
+ if ( _ReadSchema ( Path, Schema, sizeof ( Schema ) ) != 0 ) {
+ return false;
+ }
+
+ IsRemote = _MatchSchemas ( Schema, "http" );
+ if ( IsRemote == false ) {
+ IsRemote = _MatchSchemas ( Schema, "https" );
+ }
+
+ return IsRemote;
+} /* IsRemotePath () */
+
+bool CC
+IsLocalPath ( const char * Path )
+{
+ KDirectory * NativeDir;
+ uint32_t PathType;
+
+ NativeDir = NULL;
+ PathType = kptNotFound;
+
+ /* Just checking if Path do exists, and it is a file
+ */
+ if ( Path != NULL ) {
+ if ( KDirectoryNativeDir ( & NativeDir ) == 0 ) {
+ PathType = KDirectoryPathType ( NativeDir, Path );
+
+ KDirectoryRelease ( NativeDir );
+ }
+ }
+
+ return PathType == kptFile;
+} /* IsLocalPath () */
+
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+/* something unusual */
+/* we are going to keep remote connections */
+/*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*/
+
+struct RCacheEntry;
+
+struct _CnEnt {
+ struct _CnEnt * prev;
+ struct _CnEnt * next;
+
+ struct RCacheEntry * entry;
+};
+
+struct _CnPool {
+ struct KLock * mutabor;
+
+ struct _CnEnt * head;
+ struct _CnEnt * tail;
+
+ size_t qty;
+ size_t max_qty;
+};
+
+struct RCacheEntry {
+ BSTNode AsIs;
+
+ KRefcount refcount;
+ KLock * mutabor;
+
+ char * Name;
+ char * Url;
+ char * Path;
+
+ bool is_local;
+ bool is_complete;
+
+ uint64_t actual_size;
+
+ const struct KFile * file;
+
+ struct _CnEnt * cn_entry;
+};
+
+// static const size_t _sConPoolMaxQty = 1024;
+static const size_t _sConPoolMaxQty = 512;
+static struct _CnPool _sConPool;
+
+rc_t CC RCacheEntryAddRef ( struct RCacheEntry * self );
+rc_t CC RCacheEntryRelease ( struct RCacheEntry * self );
+
+static
+rc_t CC
+_CnEntMake ( struct RCacheEntry * Entry )
+{
+ rc_t RCt;
+ struct _CnEnt * Ent;
+
+ RCt = 0;
+ Ent = NULL;
+
+ if ( Entry == NULL ) {
+ return RC ( rcExe, rcData, rcInitializing, rcParam, rcNull );
+ }
+
+ if ( Entry -> cn_entry != NULL ) {
+ return RC ( rcExe, rcData, rcInitializing, rcParam, rcInvalid );
+ }
+
+ Ent = calloc ( 1, sizeof ( struct _CnEnt ) );
+ if ( Ent == NULL ) {
+ return RC ( rcExe, rcData, rcInitializing, rcParam, rcExhausted );
+ }
+
+ RCt = RCacheEntryAddRef ( Entry );
+ if ( RCt == 0 ) {
+ Ent -> next = NULL;
+ Ent -> prev = NULL;
+ Ent -> entry = Entry;
+ Entry -> cn_entry = Ent;
+ }
+ else {
+ free ( Ent );
+ }
+
+ return RCt;
+} /* _CnEntMake () */
+
+static
+rc_t CC
+_CnEntDispose ( struct RCacheEntry * Entry )
+{
+ struct _CnEnt * Ent = NULL;
+
+ if ( Entry != NULL ) {
+ Ent = Entry -> cn_entry;
+ Entry -> cn_entry = NULL;
+
+ if ( Ent != NULL ) {
+ RCacheEntryRelease ( Entry );
+
+ Ent -> entry = NULL;
+ Ent -> prev = NULL;
+ Ent -> next = NULL;
+
+ free ( Ent );
+ }
+ }
+
+ return 0;
+} /* _CnEntDipose () */
+
+static
+rc_t CC
+_CnPoolWhack ()
+{
+ if ( _sConPool . mutabor != NULL ) {
+/*
+RmOutMsg ( "[KLockRelease] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ KLockRelease ( _sConPool . mutabor );
+ _sConPool . mutabor = NULL;
+ }
+
+ _sConPool . head = NULL;
+ _sConPool . tail = NULL;
+ _sConPool . qty = 0;
+ _sConPool . max_qty = _sConPoolMaxQty;
+
+ return 0;
+} /* _CnPoolWhack () */
+
+static
+rc_t CC
+_CnPoolInit ( size_t MaxQty )
+{
+ rc_t RCt;
+
+ RCt = 0;
+
+ RCt = KLockMake ( & ( _sConPool . mutabor ) );
+/*
+RmOutMsg ( "[KLockMake] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ if ( RCt == 0 ) {
+ _sConPool . head = NULL;
+ _sConPool . tail = NULL;
+ _sConPool . qty = 0;
+ _sConPool . max_qty = MaxQty == 0 ? _sConPoolMaxQty : MaxQty;
+ }
+
+ return RCt;
+} /* _CnPoolInit () */
+
+/*|\ _CnPool has only three methods: ToFront, Drop and Prune,
+ |/ where prune is series of drops.
+ |\ I made that comment to show that DLList is not used for
+ |/ purpose
+ |\*/
+static rc_t CC _CnPoolToFront_NoLock ( struct _CnEnt * entry );
+static rc_t CC _CnPoolDrop_NoLock ( struct _CnEnt * entry );
+static rc_t CC _CnPoolPrune_NoLock ( size_t PruneS );
+
+rc_t CC
+_CnPoolToFront_NoLock ( struct _CnEnt * Entry )
+{
+ rc_t RCt = 0;
+
+ if ( Entry == NULL ) {
+ return RC ( rcExe, rcData, rcInserting, rcParam, rcNull );
+ }
+
+ if ( Entry == _sConPool . head ) {
+ return 0;
+ }
+
+/*
+RmOutMsg ( "[_CnPoolToFront_ ] [%p] [ %d]\n", Entry, __LINE__ );
+*/
+
+ /* First we should drop Entry without disconnecting */
+ RCt = _CnPoolDrop_NoLock ( Entry );
+ if ( RCt == 0 ) {
+ /* Second we should Prune old connections */
+ RCt = _CnPoolPrune_NoLock ( 1 );
+ if ( RCt == 0 ) {
+ /* Second we should put Entry at front */
+ if ( _sConPool . head != NULL ) {
+ Entry -> next = _sConPool . head;
+ Entry -> next -> prev = Entry;
+ _sConPool . head = Entry;
+ }
+ else {
+ _sConPool . tail = Entry;
+ }
+ _sConPool . head = Entry;
+ _sConPool . qty ++;
+ }
+ }
+
+ return RCt;
+} /* _CnPooltoFront_NoLock () */
+
+static
+rc_t CC
+_CnPoolToFront ( struct RCacheEntry * Entry )
+{
+ rc_t RCt = 0;
+
+ if ( Entry != NULL ) {
+ if ( Entry -> cn_entry != NULL ) {
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ RCt = KLockAcquire ( _sConPool . mutabor );
+ if ( RCt == 0 ) {
+ RCt = _CnPoolToFront_NoLock ( Entry -> cn_entry );
+
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ KLockUnlock ( _sConPool . mutabor );
+ }
+ }
+ }
+
+ return RCt;
+} /* _CnPoolToFront () */
+
+rc_t CC
+_CnPoolDrop_NoLock ( struct _CnEnt * Entry )
+{
+ rc_t RCt;
+
+ RCt = 0;
+
+ if ( Entry == NULL ) {
+ return RC ( rcExe, rcData, rcRemoving, rcParam, rcNull );
+ }
+
+/*
+RmOutMsg ( "[_CnPoolDrop_] [%p] [ %d]\n", Entry, __LINE__ );
+*/
+
+ if ( Entry -> next == NULL && Entry -> prev == NULL ) {
+ /* Entry is the only member in pool
+ */
+ if ( _sConPool . head == Entry ) {
+ _sConPool . head = _sConPool . tail = NULL;
+ _sConPool . qty = 0;
+ }
+ }
+ else {
+ if ( Entry -> prev == NULL ) {
+ /* Entry is at the head of pool
+ */
+ if ( _sConPool . head != Entry ) {
+ return RC ( rcExe, rcData, rcRemoving, rcParam, rcInvalid );
+ }
+
+ if ( Entry -> next != NULL ) {
+ Entry -> next -> prev = NULL;
+ _sConPool . head = Entry -> next;
+ }
+ else {
+ _sConPool . head = _sConPool . tail = NULL;
+ }
+ }
+ else {
+ if ( Entry -> next == NULL ) {
+ /* Entry is at the tail of pool
+ */
+ if ( _sConPool . tail != Entry ) {
+ return RC ( rcExe, rcData, rcRemoving, rcParam, rcInvalid );
+
+ }
+
+ if ( Entry -> prev != NULL ) {
+ Entry -> prev -> next = NULL;
+ _sConPool . tail = Entry -> prev;
+ }
+ else {
+ _sConPool . head = _sConPool . tail = NULL;
+ }
+ }
+ else {
+ /* Entry is at the middle of pool
+ */
+ Entry -> prev -> next = Entry -> next;
+ Entry -> next -> prev = Entry -> prev;
+ }
+ }
+
+ _sConPool . qty --;
+ Entry -> next = Entry -> prev = NULL;
+ }
+
+ return RCt;
+} /* _CnPoolDrop_NoLock () */
+
+static
+rc_t CC
+_CnPoolDrop ( struct RCacheEntry * Entry )
+{
+ rc_t RCt = 0;
+
+ if ( Entry != NULL ) {
+ if ( Entry -> cn_entry != NULL ) {
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ RCt = KLockAcquire ( _sConPool . mutabor );
+ if ( RCt == 0 ) {
+ RCt = _CnPoolDrop_NoLock ( Entry -> cn_entry );
+
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) _sConPool . mutabor, __LINE__ );
+*/
+ KLockUnlock ( _sConPool . mutabor );
+ }
+ }
+ }
+
+ return RCt;
+} /* _CnPoolDrop () */
+
+rc_t CC
+_CnPoolPrune_NoLock ( size_t PruneS )
+{
+ rc_t RCt = 0;
+
+ size_t max_qty = _sConPool . max_qty - PruneS;
+
+ while ( max_qty < _sConPool . qty ) {
+ RCt = _CnPoolDrop_NoLock ( _sConPool . tail );
+ if ( RCt != 0 ) {
+ break;
+ }
+ }
+
+ return RCt;
+} /* _CnPoolPrune_NoLock () */
+
+/*)))
+ /// Cache ... hmmm
+(((*/
+static KNSManager * _ManagerOfKNS = NULL;
+static BSTree _Cache;
+ /* That lock will be used for adding/searching cache entries */
+static KLock * _CacheLock = NULL;
+
+const char * _CacheEntryClassName = "RCacheEntry_class";
+const char * _CacheDirName = ".cache";
+static char _CacheRoot [ 4096 ];
+static char * _PCacheRoot = NULL;
+static size_t _CacheEntryNo = 0;
+static uint32_t _HttpBlockSize = 0;
+static bool _DisklessMode = false;
+
+/*))
+ // Some extremely useful methods
+((*/
+rc_t CC
+_EGetCachePath (
+ const char * CacheRoot,
+ char * Buffer,
+ size_t BufferSize
+)
+{
+ size_t NumWrit;
+
+ if ( CacheRoot == NULL || Buffer == NULL || BufferSize == 0 ) {
+ return RC ( rcExe, rcString, rcCopying, rcParam, rcNull );
+ }
+
+ return string_printf (
+ Buffer,
+ BufferSize,
+ & NumWrit,
+ "%s/%s",
+ CacheRoot,
+ _CacheDirName
+ );
+} /* _EGetCachePath () */
+
+rc_t CC
+_GetCachePath ( char * Buffer, size_t BufferSize )
+{
+ return _EGetCachePath ( RemoteCachePath (), Buffer, BufferSize );
+} /* _GetCachePath () */
+
+rc_t CC
+_EGetCachePathOld (
+ const char * CacheRoot,
+ char * Buffer,
+ size_t BufferSize
+)
+{
+ size_t NumWrit;
+
+ if ( CacheRoot == NULL || Buffer == NULL || BufferSize == 0 ) {
+ return RC ( rcExe, rcString, rcCopying, rcParam, rcNull );
+ }
+
+ return string_printf (
+ Buffer,
+ BufferSize,
+ & NumWrit,
+ "%s/%s.old",
+ CacheRoot,
+ _CacheDirName
+ );
+} /* _EGetCachePathOld () */
+
+rc_t CC
+_GetCachePathOld ( char * Buffer, size_t BufferSize )
+{
+ return _EGetCachePathOld ( RemoteCachePath (), Buffer, BufferSize );
+} /* _GetCachePathOld () */
+
+rc_t CC
+_CheckCreateDirectory ( const char * Path )
+{
+ rc_t RCt;
+ KDirectory * NativeDir;
+ uint32_t PathType;
+
+ RCt = 0;
+ NativeDir = NULL;
+ PathType = kptNotFound;
+
+ if ( Path == NULL ) {
+ return RC ( rcExe, rcDirectory, rcCreating, rcParam, rcNull );
+ }
+
+ RCt = KDirectoryNativeDir ( & NativeDir );
+ if ( RCt == 0 ) {
+ PathType = KDirectoryPathType ( NativeDir, Path );
+ switch ( PathType ) {
+ case kptNotFound :
+ RmOutMsg ( "Creating directory '%s'\n", Path );
+ RCt = KDirectoryCreateDir (
+ NativeDir,
+ 0777,
+ kcmCreate,
+ Path
+ );
+ break;
+ case kptDir :
+ break;
+ default :
+ /* Somtheing is wrong */
+ RCt = RC ( rcExe, rcDirectory, rcCreating, rcError, rcInvalid );
+ break;
+ }
+
+ ReleaseComplain ( KDirectoryRelease, NativeDir );
+ }
+
+ return RCt;
+} /* _CheckCreateDirectory () */
+
+rc_t CC
+_CheckRemoveDirectory ( const char * Path )
+{
+ rc_t RCt;
+ KDirectory * NativeDir;
+ uint32_t PathType;
+
+ RCt = 0;
+ NativeDir = NULL;
+ PathType = kptNotFound;
+
+ if ( Path == NULL ) {
+ return RC ( rcExe, rcDirectory, rcRemoving, rcParam, rcNull );
+ }
+
+ RCt = KDirectoryNativeDir ( & NativeDir );
+ if ( RCt == 0 ) {
+ PathType = KDirectoryPathType ( NativeDir, Path );
+ switch ( PathType ) {
+ case kptNotFound:
+ /* Everything is good */
+ break;
+ default:
+ RmOutMsg ( "Removing directory '%s'\n", Path );
+ RCt = KDirectoryRemove ( NativeDir, true, Path );
+ break;
+ }
+
+ ReleaseComplain ( KDirectoryRelease, NativeDir );
+ }
+
+ return RCt;
+} /* _CheckRemoveDirectory () */
+
+rc_t CC
+_CheckRemoveOldCacheDirectory ( const char * CacheRoot )
+{
+ rc_t RCt;
+ KDirectory * NativeDir;
+ char CacheDir [ 4096 ];
+ char OldCacheDir [ 4096 ];
+
+ RCt = 0;
+ NativeDir = NULL;
+ * CacheDir = 0;
+ * OldCacheDir = 0;
+
+ if ( CacheRoot == NULL ) {
+ return RC ( rcExe, rcDirectory, rcRemoving, rcParam, rcNull );
+ }
+
+ if ( _EGetCachePath ( CacheRoot, CacheDir, sizeof ( CacheDir ) ) != 0
+ || _EGetCachePathOld ( CacheRoot, OldCacheDir, sizeof ( OldCacheDir ) ) )
+ {
+ return RC ( rcExe, rcDirectory, rcRemoving, rcParam, rcInvalid );
+ }
+
+ RCt = KDirectoryNativeDir ( & NativeDir );
+ if ( RCt == 0 ) {
+ /*) Just because I do not know wahat to do in the case if
+ (*) it is impossible to remove directory I am doing that
+ (*) hookup
+ (*/
+ RCt = _CheckRemoveDirectory ( OldCacheDir );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryRename (
+ NativeDir,
+ true,
+ CacheDir,
+ OldCacheDir
+ );
+ if ( RCt == 0 ) {
+ RCt = _CheckRemoveDirectory ( OldCacheDir );
+ }
+ }
+
+ ReleaseComplain ( KDirectoryRelease, NativeDir );
+ }
+
+ return RCt;
+} /* _CheckRemoveOldCacheDirectory () */
+
+/*
+ * Lyrics: This method will set buffer size for HTTP transport
+ * and return previous value.
+ * That method is thread unsafe, and it is better to set it once
+ * on the time of cache initialization
+ */
+uint32_t CC
+RemoteCacheSetHttpBlockSize ( uint32_t HttpBlockSize )
+{
+ uint32_t RetVal = _HttpBlockSize;
+
+ _HttpBlockSize = HttpBlockSize;
+
+ return RetVal;
+} /* RemoteCacheSetHttpBlockSize () */
+
+/*
+ * Lyrics: Cache initialising: keeping in memory cache path
+ * cache path could be a NULL, and in that case no cacheing
+ * performed
+ */
+rc_t CC
+RemoteCacheInitialize ( const char * Path )
+{
+ rc_t RCt;
+ char Buffer [ 4096 ];
+ struct KDirectory * Directory;
+
+ RCt = 0;
+ * _CacheRoot = 0;
+ * Buffer = 0;
+
+ if ( RemoteCacheIsDisklessMode () ) {
+ LOGMSG ( klogErr, "[RemoteCache] Already initialized in diskless mode" );
+
+ return RC ( rcExe, rcPath, rcInitializing, rcParam, rcNull );
+ }
+
+ /*))
+ // If path is NULL - diskless mode ... we introduced
+ // variable for that ... to avoid confusion
+ ((*/
+ if ( Path == NULL ) {
+ LOGMSG ( klogErr, "[RemoteCache] initializing [diskless]" );
+
+ _DisklessMode = true;
+
+ return 0;
+ }
+
+ PLOGMSG ( klogErr, ( klogErr, "[RemoteCache] initializing [$(f)]", PLOG_S(f), Path ) );
+
+ /* we are checking that cache directory already initialized */
+ if ( _PCacheRoot != NULL ) {
+ return RC ( rcExe, rcPath, rcInitializing, rcSelf, rcExists );
+ }
+
+ RCt = KDirectoryNativeDir ( & Directory );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryResolvePath (
+ Directory,
+ true,
+ _CacheRoot,
+ sizeof ( _CacheRoot ),
+ Path
+ );
+
+ ReleaseComplain ( KDirectoryRelease, Directory );
+ }
+
+ if ( RCt == 0 ) {
+ _PCacheRoot = _CacheRoot;
+ }
+
+ return RCt;
+} /* RemoteCacheInitialize () */
+
+static
+rc_t CC
+_InitKNSManager ()
+{
+ rc_t RCt;
+ KNSManager * Manager;
+ ver_t Ver;
+
+ RCt = 0;
+ Manager = NULL;
+ Ver = KAppVersion ();
+
+ if ( _ManagerOfKNS != NULL ) {
+ return RC ( rcExe, rcNS, rcInitializing, rcSelf, rcInvalid );
+ }
+
+ RCt = KNSManagerMake ( & Manager );
+ if ( RCt == 0 ) {
+ RCt = KNSManagerSetUserAgent (
+ Manager,
+ "sra-toolkit remote-fuser.%V",
+ Ver
+ );
+ if ( RCt == 0 ) {
+ _ManagerOfKNS = Manager;
+ }
+ else {
+ ReleaseComplain ( KNSManagerRelease, Manager );
+ }
+ }
+
+ return RCt;
+} /* _InitKNSManager () */
+
+static
+rc_t CC
+_DisposeKNSManager ()
+{
+ KNSManager * Manager = _ManagerOfKNS;
+
+ _ManagerOfKNS = NULL;
+
+ if ( Manager == NULL ) {
+ return 0;
+ }
+
+ ReleaseComplain ( KNSManagerRelease, Manager );
+
+ return 0;
+} /* _DisposeKNSManager () */
+
+/*
+ * Lyrics: Cache make
+ * Cache initialisation consists from two steps :
+ * Creating directory if it does not exist
+ * Removing content of directory if it is something here
+ */
+rc_t CC
+RemoteCacheCreate ()
+{
+ rc_t RCt;
+ char Buffer [ 4096 ];
+
+ RCt = 0;
+ * Buffer = 0;
+
+ if ( RemoteCacheIsDisklessMode () ) {
+ LOGMSG( klogInfo, "[RemoteCache] entering diskless mode\n" );
+ return 0;
+ }
+
+ LOGMSG( klogInfo, "[RemoteCache] creating\n" );
+
+ /* we shoud do it here */
+ RCt = _CnPoolInit ( 0 ); /* Not sure about 0 8-| */
+ if ( RCt != 0 ) {
+ return RCt;
+ }
+
+ /* standard c=ecks */
+ /* we are checking that cache directory already initialized */
+ if ( _PCacheRoot == NULL ) {
+ return RC ( rcExe, rcPath, rcInitializing, rcSelf, rcNull );
+ }
+
+ /* Checking if CacheRoot directory exists and creating if not */
+ RCt = _CheckCreateDirectory ( _PCacheRoot );
+ if ( RCt == 0 ) {
+ /* Here we are moving old cache path
+ */
+ RCt = _CheckRemoveOldCacheDirectory ( _PCacheRoot );
+ if ( RCt ) {
+ RCt = _EGetCachePath (
+ _PCacheRoot,
+ Buffer,
+ sizeof ( Buffer )
+ );
+ if ( RCt == 0 ) {
+
+ RCt = _CheckCreateDirectory ( Buffer );
+ }
+ }
+ }
+
+ if ( RCt == 0 ) {
+
+ RCt = _InitKNSManager ();
+ if ( RCt == 0 ) {
+
+ /* Initializing BSTree */
+ BSTreeInit ( & _Cache );
+ /* Initializing _CacheLock */
+ RCt = KLockMake ( & _CacheLock );
+/*
+RmOutMsg ( "[KLockMake] [%p] [ %d]\n", ( void * ) _CacheLock, __LINE__ );
+*/
+ }
+ }
+
+ if ( RCt != 0 ) {
+ /* Endangered specie TODO!!! */
+ RemoteCacheDispose ();
+ }
+
+ return RCt;
+} /* RemoteCacheCreate () */
+
+rc_t CC _RCacheEntryDestroy ( struct RCacheEntry * Entry );
+
+void CC
+_RcAcHeEnTrYwHaCk ( BSTNode * Node, void * UnusedParam )
+{
+ if ( Node != NULL ) {
+ _RCacheEntryDestroy ( ( struct RCacheEntry * ) Node );
+ }
+} /* _RcAcHeEnTrYwHaCk () */
+
+/*
+ * Lyrics: Cache finalization
+ * Cache finalization consists from one step(s) :
+ * Removing content of cache directory if it exists and
+ * something is here
+ */
+rc_t CC
+RemoteCacheDispose ()
+{
+ rc_t RCt = 0;
+
+ if ( RemoteCacheIsDisklessMode () ) {
+ LOGMSG( klogInfo, "[RemoteCache] leaving diskless mode\n" );
+ }
+
+ LOGMSG( klogInfo, "[RemoteCache] disposing\n" );
+
+ if ( RemoteCacheIsDisklessMode () ) {
+ _DisklessMode = false;
+
+ return 0;
+ }
+
+ /*) Cache was not initialized
+ (*/
+ if ( _PCacheRoot == NULL ) {
+ return 0;
+ }
+
+ RCt = _CheckRemoveOldCacheDirectory ( _CacheRoot );
+ if ( RCt == 0 ) {
+ * _CacheRoot = 0;
+ _PCacheRoot = NULL;
+ }
+
+ /* Releasing Lock */
+ if ( _CacheLock != NULL ) {
+/*
+RmOutMsg ( "[KLockRelease] [%p] [ %d]\n", ( void * ) _CacheLock, __LINE__ );
+*/
+ ReleaseComplain ( KLockRelease, _CacheLock );
+ _CacheLock = NULL;
+ }
+
+ _DisposeKNSManager ();
+
+ BSTreeWhack ( & _Cache, _RcAcHeEnTrYwHaCk, NULL );
+
+ /* Who does need that check? */
+ _CnPoolWhack ();
+
+ _CacheEntryNo = 0;
+
+ * _CacheRoot = 0;
+ _PCacheRoot = NULL;
+
+ return RCt;
+} /* RemoteCacheDispose () */
+
+/*))
+ // Generates effective name and path for file
+((*/
+rc_t CC
+_RCacheEntryGenerateNameAndPath ( char ** Name, char ** Path )
+{
+ rc_t RCt;
+ char Buffer [ 4096 ];
+ char Buffer2 [ 4096 ];
+ size_t NumWritten;
+ char * TheName;
+ char * ThePath;
+
+ RCt = 0;
+ * Buffer = 0;
+ * Buffer2 = 0;
+ NumWritten = 0;
+ TheName = NULL;
+ ThePath = NULL;
+
+ if ( Name != NULL ) { * Name = NULL; }
+ if ( Path != NULL ) { * Path = NULL; }
+
+ if ( Name == NULL || Path == NULL ) {
+ return RC ( rcExe, rcFile, rcInitializing, rcParam, rcNull );
+ }
+
+ RCt = string_printf (
+ Buffer,
+ sizeof ( Buffer ),
+ & NumWritten,
+ "etwas.%d",
+ _CacheEntryNo + 1
+ );
+ if ( RCt == 0 ) {
+ TheName = string_dup_measure ( Buffer, NULL );
+ if ( TheName == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcInitializing, rcMemory, rcExhausted );
+ }
+ else {
+ RCt = _GetCachePath ( Buffer2, sizeof ( Buffer2 ) );
+ if ( RCt == 0 ) {
+ RCt = string_printf (
+ Buffer,
+ sizeof ( Buffer ),
+ & NumWritten,
+ "%s/%s",
+ Buffer2,
+ TheName
+ );
+ if ( RCt == 0 ) {
+ ThePath = string_dup_measure ( Buffer, NULL );
+ if ( TheName == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcInitializing, rcMemory, rcExhausted );
+ }
+ else {
+ * Name = TheName;
+ * Path = ThePath;
+ }
+ }
+ }
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * Name = NULL;
+ if ( TheName != NULL ) {
+ free ( TheName );
+ }
+ * Path = NULL;
+ if ( ThePath != NULL ) {
+ free ( ThePath );
+ }
+ }
+
+ return RCt;
+} /* _RCacheEntryGenerateNameAndPath () */
+
+/*))
+ // This method will destroy CacheEntry and free all resources
+((*/
+rc_t CC
+_RCacheEntryDestroy ( struct RCacheEntry * self )
+{
+/*
+KOutMsg ( " [GGU] [EntryDestroy]\n" );
+*/
+ if ( self != NULL ) {
+/*
+RmOutMsg ( "++++++DL DESTROY [0x%p] entry\n", self );
+*/
+ _CnPoolDrop ( self );
+ _CnEntDispose ( self );
+
+ /*)) Reverse order. I suppose it will be destoryed only
+ // in particualr cases, so no locking :|
+ ((*/
+ /*) File
+ (*/
+ if ( self -> file != NULL ) {
+/*
+KOutMsg ( "[GGU] [DestroyEnty] [%s]\n", self -> Name );
+*/
+ ReleaseComplain ( KFileRelease, self -> file );
+ self -> file = 0;
+ }
+ /*) Url
+ (*/
+ if ( self -> Url != NULL ) {
+ free ( self -> Url );
+ self -> Url = NULL;
+ }
+ /*) Path
+ (*/
+ if ( self -> Path != NULL ) {
+ free ( self -> Path );
+ self -> Path = NULL;
+ }
+ /*) Name
+ (*/
+ if ( self -> Name != NULL ) {
+ free ( self -> Name );
+ self -> Name = NULL;
+ }
+ /*) mutabor
+ (*/
+ if ( self -> mutabor != NULL ) {
+/*
+RmOutMsg ( "[KLockRelease] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ ReleaseComplain ( KLockRelease, self -> mutabor );
+ self -> mutabor = NULL;
+ }
+ /*) refcount
+ (*/
+ KRefcountWhack ( & ( self -> refcount ), _CacheEntryClassName );
+
+ self -> is_local = false;
+ self -> is_complete = false;
+ self -> actual_size = 0;
+
+ free ( self );
+ }
+
+ return 0;
+} /* _RCacheEntryDestroy () */
+
+/*))
+ // This method will create new CacheEntry
+((*/
+rc_t CC
+_RCacheEntryMake (
+ const char * Url,
+ struct RCacheEntry ** RetEntry
+)
+{
+ rc_t RCt;
+ struct RCacheEntry * Entry;
+
+ RCt = 0;
+ Entry = NULL;
+
+ if ( RetEntry != NULL ) {
+ * RetEntry = NULL;
+ }
+
+ if ( Url == NULL || RetEntry == NULL ) {
+ return RC ( rcExe, rcFile, rcInitializing, rcParam, rcNull );
+ }
+
+ Entry = ( struct RCacheEntry * ) calloc (
+ 1,
+ sizeof ( struct RCacheEntry )
+ );
+ if ( Entry == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcInitializing, rcMemory, rcExhausted );
+ }
+ else {
+ Entry -> is_local = false;
+ Entry -> is_complete = false;
+ Entry -> actual_size = 0;
+
+ if ( ! RemoteCacheIsDisklessMode () ) {
+ /*) It is better do it here, before any allocation
+ (*/
+ RCt = _RCacheEntryGenerateNameAndPath (
+ & ( Entry -> Name ),
+ & ( Entry -> Path )
+ );
+ }
+
+ if ( RCt == 0 ) {
+ /*) refcount
+ (*/
+ KRefcountInit (
+ & ( Entry -> refcount ),
+ 0,
+ _CacheEntryClassName,
+ "_RCacheEntryMake()",
+ Entry -> Name
+ );
+ /*) mutabor
+ (*/
+ RCt = KLockMake ( & ( Entry -> mutabor ) );
+/*
+RmOutMsg ( "[KLockMake] [%p] [ %d]\n", ( void * ) Entry -> mutabor, __LINE__ );
+*/
+
+ if ( RCt == 0 ) {
+ /*) Url
+ (*/
+ Entry -> Url = string_dup_measure ( Url, NULL );
+ if ( Entry -> Url == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcInitializing, rcMemory, rcExhausted );
+ }
+ if ( RCt == 0 ) {
+ /*) File will be opened on demand
+ / Increasing count and assigning value
+ (*/
+ _CacheEntryNo ++;
+ * RetEntry = Entry;
+ }
+ }
+ }
+ }
+
+ if ( RCt != 0 && Entry != NULL ) {
+ _RCacheEntryDestroy ( Entry );
+ }
+
+ return RCt;
+} /* _RCacheEntryMake () */
+
+/*))
+ // Comparator: common case
+((*/
+static
+int64_t CC
+_RcUrLcMp ( const char * Url1, const char * Url2 )
+{
+ if ( Url1 == NULL || Url2 == NULL ) {
+ if ( Url1 != NULL ) {
+ return 4096;
+ }
+ if ( Url2 != NULL ) {
+ return 4096;
+ }
+ return 0;
+ }
+
+ return strcmp ( Url1, Url2 );
+} /* _RcUrLcMp () */
+
+/*))
+ // Comparator: we suppose that 'item' is an Url
+((*/
+static
+int64_t CC
+_RcEnTrYcMp ( const void * item, const BSTNode * node )
+{
+ return _RcUrLcMp (
+ ( const char * ) item,
+ node == NULL
+ ? NULL
+ : ( ( struct RCacheEntry * ) node ) -> Url
+ );
+} /* _RcEnTrYcMp () */
+
+/*))
+ // Sorter for BSTreeInsert
+((*/
+static
+int64_t CC
+_RcNoDeCmP ( const BSTNode * node1, const BSTNode * node2 )
+{
+ return _RcUrLcMp (
+ node1 == NULL
+ ? NULL
+ : ( ( struct RCacheEntry * ) node1 ) -> Url,
+ node2 == NULL
+ ? NULL
+ : ( ( struct RCacheEntry * ) node2 ) -> Url
+ );
+} /* _RcNoDeCmP () */
+
+/*))
+ // This method suppeosed to find or create Entry
+((*/
+rc_t CC
+RemoteCacheFindOrCreateEntry (
+ const char * Url,
+ struct RCacheEntry ** Entry
+)
+{
+ rc_t RCt;
+ struct RCacheEntry * RetEntry;
+
+ RCt = 0;
+ RetEntry = NULL;
+
+ if ( Url == NULL || Entry == NULL ) {
+ return RC ( rcExe, rcPath, rcInitializing, rcParam, rcNull );
+ }
+ * Entry = NULL;
+
+ /*) Diskless mode
+ (*/
+ if ( RemoteCacheIsDisklessMode () ) {
+ RCt = _RCacheEntryMake ( Url, & RetEntry );
+ if ( RCt == 0 ) {
+/*
+RmOutMsg ( "++++++DL CREATE [0x%p][%s] entry\n", RetEntry, Url );
+*/
+ * Entry = RetEntry;
+ }
+
+ return RCt;
+ }
+ /*) Here we are locking
+ (*/
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) _CacheLock, __LINE__ );
+*/
+ RCt = KLockAcquire ( _CacheLock );
+ if ( RCt == 0 ) {
+ /*) Here we are 'looking for' and 'fooking lor'
+ (*/
+ RetEntry = ( struct RCacheEntry * ) BSTreeFind (
+ & _Cache,
+ Url,
+ _RcEnTrYcMp
+ );
+/*
+RmOutMsg ( "++++++ %s entry\n", RetEntry == NULL ? "Creating" : "Loading" );
+*/
+ if ( RetEntry == NULL ) {
+ RCt = _RCacheEntryMake ( Url, & RetEntry );
+ if ( RCt == 0 ) {
+ RCt = BSTreeInsert (
+ & _Cache,
+ ( BSTNode * ) RetEntry,
+ _RcNoDeCmP
+ );
+ }
+ }
+
+ if ( RCt == 0 ) {
+ * Entry = RetEntry;
+ }
+
+ /*) First we are trying to find appropriate entry
+ (*/
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) _CacheLock, __LINE__ );
+*/
+ KLockUnlock ( _CacheLock );
+ }
+
+ return RCt;
+} /* RemoteCacheFindOrCreateEntry () */
+
+const char * CC
+RemoteCachePath ()
+{
+ return RemoteCacheIsDisklessMode() ? NULL : _PCacheRoot;
+} /* RemoteCachePath () */
+
+bool CC
+RemoteCacheIsDisklessMode ()
+{
+ return _DisklessMode;
+} /* RemoteCacheIsDisklessMode () */
+
+/*)))
+ /// Top of the crop methods
+(((*/
+rc_t CC
+RCacheEntryAddRef ( struct RCacheEntry * self )
+{
+ rc_t RCt;
+
+ RCt = 0;
+
+ if ( self != NULL ) {
+/*
+RmOutMsg ( "++++++DL ADDREF [0x%p] entry\n", self );
+*/
+ switch ( KRefcountAdd (
+ & ( self -> refcount ),
+ _CacheEntryClassName
+ ) ) {
+ case krefLimit:
+ RCt = RC ( rcExe, rcFile, rcAttaching, rcRange, rcExcessive );
+ case krefNegative:
+ RCt = RC ( rcExe, rcFile, rcAttaching, rcSelf, rcInvalid );
+ default:
+ break;
+ }
+ }
+
+ return RCt;
+} /* RCacheEntryAddRef () */
+
+rc_t CC
+_RCacheEntryReleaseWithoutLock ( struct RCacheEntry * self )
+{
+ /*)) This method called from special place, so no NULL checks
+ ((*/
+
+ if ( self -> file != NULL ) {
+/*
+KOutMsg ( "[GGU] [ReleaseEntry] [%s]\n", self -> Name );
+*/
+/*
+RmOutMsg ( "|||<-- Releasing [%s][%s]\n", self -> Name, self -> Url );
+*/
+ ReleaseComplain ( KFileRelease, self -> file );
+ self -> file = NULL;
+ }
+
+ return 0;
+} /* _RCacheEntryReleaseWithoutLock () */
+
+rc_t CC
+_RCacheEntryReleaseWithLock ( struct RCacheEntry * self )
+{
+ rc_t RCt = 0;
+
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ RCt = KLockAcquire ( self -> mutabor );
+ if ( RCt == 0 ) {
+ RCt = _RCacheEntryReleaseWithoutLock ( self );
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ KLockUnlock ( self -> mutabor );
+ }
+
+ return RCt;
+} /* _RCacheEntryReleaseWithLock () */
+
+rc_t CC
+RCacheEntryRelease ( struct RCacheEntry * self )
+{
+ rc_t RCt;
+
+ RCt = 0;
+
+/*
+KOutMsg ( " [GGU] [Closing Entry]\n" );
+*/
+ if ( self != NULL ) {
+ if ( RCt == 0 ) {
+ switch ( KRefcountDrop (
+ & ( self -> refcount ),
+ _CacheEntryClassName
+ ) ) {
+ case krefWhack:
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ RCt = KLockAcquire ( self -> mutabor );
+ if ( RCt == 0 ) {
+ _RCacheEntryReleaseWithoutLock ( self );
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ KLockUnlock ( self -> mutabor );
+ if ( RemoteCacheIsDisklessMode () ) {
+ /*
+ RmOutMsg ( "++++++DL RELEASE [0x%p] entry\n", self );
+ */
+ _RCacheEntryDestroy ( self );
+ }
+ }
+ break;
+ case krefNegative:
+ RCt = RC ( rcExe, rcFile, rcReleasing, rcRange, rcExcessive );
+ default:
+ break;
+ }
+
+ }
+ }
+
+ return RCt;
+} /* RCacheEntryRelease () */
+
+rc_t CC
+_RCacheEntryOpenFileReadRemote ( struct RCacheEntry * self )
+{
+ rc_t RCt;
+ struct KDirectory * Directory;
+ const struct KFile * HttpFile, * TeeFile;
+
+ RCt = 0;
+ Directory = NULL;
+ HttpFile = TeeFile = NULL;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcFile, rcOpening, rcParam, rcNull );
+ }
+
+/*
+KOutMsg ( "[GGU] [OpenReadRemote] [%s]\n", self -> Name );
+*/
+
+ if ( ( ! RemoteCacheIsDisklessMode () ) && self -> Path == NULL ) {
+ return RC ( rcExe, rcFile, rcOpening, rcParam, rcNull );
+ }
+
+/*
+RmOutMsg ( "|||<-- Opening [R] [%s][%s]\n", self -> Name, self -> Url );
+RmOutMsg ( " |<-- Cache Entry [%s]\n", self -> Path );
+*/
+
+ RCt = KNSManagerMakeHttpFile (
+ _ManagerOfKNS,
+ & HttpFile,
+ NULL, /* no open connections */
+ 0x01010000,
+ self -> Url
+ );
+ if ( RCt == 0 ) {
+ if ( RemoteCacheIsDisklessMode () ) {
+ self -> file = ( KFile * ) HttpFile;
+ }
+ else {
+ RCt = KDirectoryNativeDir ( & Directory );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryMakeCacheTee (
+ Directory,
+ & TeeFile,
+ HttpFile,
+ _HttpBlockSize, /* blocksize */
+ self -> Path
+ );
+ if ( RCt == 0 ) {
+ self -> file = ( KFile * ) TeeFile;
+
+ /* We should create connection entry for pool
+ */
+ RCt = _CnEntMake ( self );
+ }
+
+ ReleaseComplain ( KDirectoryRelease, Directory );
+ }
+ ReleaseComplain ( KFileRelease, HttpFile );
+ }
+ }
+
+ if ( RCt != 0 ) {
+ if ( self -> file != NULL ) {
+ ReleaseComplain ( KFileRelease, self -> file );
+ self -> file = NULL;
+ }
+
+ _CnEntDispose ( self );
+ }
+
+ if ( RCt == 0 ) {
+ if ( self -> actual_size == 0 ) {
+ RCt = KFileSize ( self -> file, & ( self -> actual_size ) );
+ }
+ }
+
+ return RCt;
+} /* _RCacneEntryOpenFileReadRemote () */
+
+rc_t CC
+_RCacheEntryOpenFileReadLocal ( struct RCacheEntry * self )
+{
+ rc_t RCt;
+ const struct KFile * File;
+ struct KDirectory * Directory;
+
+ RCt = 0;
+ File = NULL;
+ Directory = NULL;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcFile, rcOpening, rcParam, rcNull );
+ }
+
+ if ( self -> Path == NULL ) {
+ return RC ( rcExe, rcFile, rcOpening, rcParam, rcNull );
+ }
+
+/*
+KOutMsg ( "[GGU] [OpenReadLocal] [%s]\n", self -> Name );
+*/
+/*
+RmOutMsg ( "|||<-- Opening [L] [%s][%s]\n", self -> Name, self -> Url );
+RmOutMsg ( " |<-- Cache Entry [%s]\n", self -> Path );
+*/
+
+ RCt = KDirectoryNativeDir ( & Directory );
+ if ( RCt == 0 ) {
+ RCt = KDirectoryOpenFileRead ( Directory, & File, self -> Path );
+ if ( RCt == 0 ) {
+ self -> file = File;
+ }
+
+ ReleaseComplain ( KDirectoryRelease, Directory );
+ }
+
+ if ( RCt == 0 ) {
+ if ( self -> actual_size == 0 ) {
+ RCt = KFileSize ( self -> file, & ( self -> actual_size ) );
+ }
+ }
+
+ return RCt;
+} /* _RCacneEntryOpenFileReadLocal () */
+
+rc_t CC
+_RCacheEntryGetAndCheckFile (
+ struct RCacheEntry * self,
+ const struct KFile ** File,
+ bool * Synchronized
+)
+{
+ rc_t RCt;
+ struct KDirectory * NatDir;
+ bool OpenLocal;
+ bool OpenRemote;
+ bool CloseFile;
+ bool IsComplete;
+
+ RCt = 0;
+ NatDir = NULL;
+ OpenLocal = false;
+ OpenRemote = false;
+ CloseFile = false;
+ IsComplete = false;
+
+ if ( Synchronized != NULL ) {
+ * Synchronized = true;
+ }
+
+ if ( File != NULL ) {
+ * File = NULL;
+ }
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ if ( File == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ if ( Synchronized == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ /* How it is work:
+ *
+ * if file exists, it is complete and local, just open it
+ * any read operation should be unsynchronized.
+ *
+ * if file does not exists, but opened, we should call
+ * IsCacheTeeComplete () and if it is complete we should
+ * close file and open it as regular. Any reed operation
+ * will be unsynchronized.
+ *
+ * all other situations, it is not complete, open tee
+ * all read operations are synchronized.
+ *
+ * if it diskless mode - all operations are synchronized
+ */
+
+ /*) Diskless mode.
+ (*/
+ if ( RemoteCacheIsDisklessMode () ) {
+ if ( self -> file == NULL ) {
+ RCt = _RCacheEntryOpenFileReadRemote ( self );
+ }
+
+ if ( RCt == 0 ) {
+ * File = self -> file;
+ * Synchronized = true;
+ }
+
+ return RCt;
+ }
+
+ /*) Normal mode
+ (*/
+ if ( self -> file == NULL ) {
+ /* Checking if it is known that file complete */
+ if ( self -> is_complete ) {
+ OpenLocal = true;
+ }
+ else {
+ /* Checking if file exist */
+ RCt = KDirectoryNativeDir ( & NatDir );
+ if ( RCt == 0 ) {
+ if ( KDirectoryPathType ( NatDir, self -> Path ) == kptFile ) {
+ OpenLocal = true;
+ }
+ else {
+ OpenRemote = true;
+ }
+
+ ReleaseComplain ( KDirectoryRelease, NatDir );
+ }
+ }
+ }
+ else {
+ /* Checking if it is known that file complete */
+ if ( self -> is_complete ) {
+ if ( ! self -> is_local ) {
+ CloseFile = true;
+ OpenLocal = true;
+ }
+ }
+ else {
+ /* checking completiness is quite heavy operation */
+ RCt = IsCacheTeeComplete ( self -> file, & IsComplete );
+ if ( RCt == 0 ) {
+ if ( IsComplete ) {
+ CloseFile = true;
+ OpenLocal = true;
+ }
+ }
+ }
+ }
+ /*) Stupid checks
+ (*/
+ if ( OpenLocal && OpenRemote ) {
+ RCt = RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ }
+
+ if ( CloseFile && self -> file == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ }
+
+ /*) Here we are trying to animate that object
+ (*/
+ if ( RCt == 0 ) {
+ if ( CloseFile ) {
+ RCt = _RCacheEntryReleaseWithoutLock ( self );
+/*
+RmOutMsg ( "|||<-- Close file [%s][%s] [A=%d]\n", self -> Name, self -> Path, RCt );
+*/
+ }
+
+ if ( OpenLocal ) {
+ self -> is_complete = true;
+ self -> is_local = true;
+ _CnPoolDrop ( self );
+ _CnEntDispose ( self );
+
+
+ RCt = _RCacheEntryOpenFileReadLocal ( self );
+/*
+RmOutMsg ( "|||<-- Open LOCAL file [%s][%s] [A=%d]\n", self -> Name, self -> Path, RCt );
+*/
+ }
+
+ if ( OpenRemote ) {
+ self -> is_complete = false;
+ self -> is_local = false;
+
+ RCt = _RCacheEntryOpenFileReadRemote ( self );
+/*
+RmOutMsg ( "|||<-- Open REMOTE file [%s][%s] [A=%d]\n", self -> Name, self -> Url, RCt );
+*/
+ }
+
+ if ( RCt == 0 ) {
+ /* We should put connection to the front of pool
+ */
+ RCt = _CnPoolToFront ( self );
+ if ( RCt == 0 ) {
+ * File = self -> file;
+ * Synchronized = ! self -> is_local;
+ }
+ }
+ }
+
+ return RCt;
+} /* _RCacheEntryGetAndCheckFile () */
+
+rc_t CC
+_RCacheEntryDoRead (
+ struct RCacheEntry * self,
+ char * Buffer,
+ size_t SizeToRead,
+ uint64_t Offset,
+ size_t * NumReaded
+)
+{
+ rc_t RCt;
+ const struct KFile * File;
+ bool Synchronized;
+
+ RCt = 0;
+ File = NULL;
+ Synchronized = true;
+
+ if ( NumReaded != NULL ) {
+ * NumReaded = 0;
+ }
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ if ( NumReaded == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ }
+
+ if ( SizeToRead == 0 ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ }
+
+ /*) Here we are locking
+ (*/
+/*
+RmOutMsg ( "[KLockAcquire] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ RCt = KLockAcquire ( self -> mutabor );
+ if ( RCt == 0 ) {
+ RCt = _RCacheEntryGetAndCheckFile (
+ self,
+ & File,
+ & Synchronized
+ );
+ if ( RCt == 0 ) {
+ if ( ! Synchronized ) {
+ /*) do not need synchronisation to read local file
+ (*/
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ KLockUnlock ( self -> mutabor );
+ }
+
+ RCt = KFileRead (
+ self -> file,
+ Offset,
+ Buffer,
+ SizeToRead,
+ NumReaded
+ );
+/*
+RmOutMsg ( "|||<-- Reading [%s][%s] [O=%d][S=%d][R=%d][A=%d]\n", self -> Name, self -> Url, Offset, SizeToRead, * NumReaded, RCt );
+*/
+ }
+
+ if ( Synchronized ) {
+/*
+RmOutMsg ( "[KLockUnlock] [%p] [ %d]\n", ( void * ) self -> mutabor, __LINE__ );
+*/
+ KLockUnlock ( self -> mutabor );
+ }
+ }
+
+ if ( RCt != 0 ) {
+ * NumReaded = 0;
+
+/*
+RmOutMsg ( "|||<- Failed to read file [%s][%s] at attempt [+1]\n", self -> Name, self -> Url );
+*/
+ _CnPoolDrop ( self );
+ _CnEntDispose ( self );
+
+ // _RCacheEntryReleaseWithLock ( self );
+ }
+
+ return RCt;
+} /* _RCacheEntryDoRead () */
+
+rc_t CC
+RCacheEntryRead (
+ struct RCacheEntry * self,
+ char * Buffer,
+ size_t SizeToRead,
+ uint64_t Offset,
+ size_t * NumReaded,
+ uint64_t * ActualSize
+)
+{
+ rc_t RCt;
+ int llp;
+ const int NumAttempts = 3;
+
+ RCt = 0;
+ llp = 0;
+
+ if ( self == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ for ( llp = 0; llp < NumAttempts; llp ++ ) {
+ /*) There could be non zero value from previous pass
+ (*/
+ if ( RCt != 0 ) {
+PLOGMSG ( klogErr, ( klogErr, "|||<- Trying to read file $(n) [$(u)] at attempt $(l)", PLOG_3(PLOG_S(n),PLOG_S(u),PLOG_I64(l)), self -> Name, self -> Url, llp + 1 ) );
+ RCt = 0;
+ }
+
+ RCt = _RCacheEntryDoRead (
+ self,
+ Buffer,
+ SizeToRead,
+ Offset,
+ NumReaded
+ );
+/*
+RmOutMsg ( "|||<-- Reading [%s][%s] [O=%d][S=%d][R=%d][A=%d]\n", self -> Name, self -> Url, Offset, SizeToRead, * NumReaded, RCt );
+*/
+ if ( RCt == 0 ) {
+ break;
+ }
+ }
+
+ if ( RCt != 0 ) {
+PLOGMSG ( klogErr, ( klogErr, "|||<- Failed to read file $(n)$(u) after $(l) attempts", PLOG_3(PLOG_S(n),PLOG_S(u),PLOG_I64(l)), self -> Name, self -> Url, llp + 1 ) );
+ }
+
+ if ( RCt == 0 ) {
+ if ( ActualSize != NULL ) {
+ * ActualSize = self -> actual_size;
+ }
+ }
+
+ return RCt;
+} /* RCacheEntryRead () */
+
+/*)))
+ /// That method will read KFile into a memory.
+ \\\ He-he, it will allocate +1 byte array and set 0 to last one.
+ /// It suppose to read text files, so, 0 terminated string
+(((*/
+rc_t CC
+_ReadKFileToMemory (
+ const KFile * File,
+ char ** RetBuffer,
+ uint64_t * RetSize
+)
+{
+ rc_t RCt;
+ char * Buf;
+ size_t BufSize;
+
+ RCt = 0;
+ Buf = NULL;
+ BufSize = 0;
+
+ * RetBuffer = NULL;
+ * RetSize = 0;
+
+ if ( File == NULL || RetBuffer == NULL || RetSize == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ RCt = KFileSize ( File, & BufSize );
+ if ( RCt == 0 ) {
+
+ if ( BufSize != 0 ) {
+
+ Buf = ( char * ) calloc ( BufSize + 1, sizeof ( char ) );
+ if ( Buf == NULL ) {
+ RCt = RC ( rcExe, rcFile, rcAllocating, rcParam, rcNull );
+ }
+ else {
+ RCt = KFileReadExactly ( File, 0, Buf, BufSize );
+ if ( RCt == 0 ) {
+ * ( Buf + BufSize ) = 0;
+ * RetBuffer = Buf;
+ * RetSize = BufSize;
+ }
+ else {
+ free ( Buf );
+ RCt = RC ( rcExe, rcFile, rcReading, rcParam, rcFailed );
+ Buf = NULL;
+ BufSize = 0;
+ }
+ }
+ }
+ else {
+ RCt = RC ( rcExe, rcFile, rcReading, rcParam, rcEmpty );
+ }
+ }
+
+ return RCt;
+} /* _ReadKFileToMemory () */
+
+/*)))
+ /// We need that method because KXML does not read document properly
+ \\\ from KFile over HTTP
+ ///
+(((*/
+rc_t CC
+ReadHttpFileToMemory (
+ const char * Url,
+ char ** RetBuffer,
+ uint64_t * RetSize
+)
+{
+ rc_t RCt;
+ const KFile * File;
+
+ RCt = 0;
+ File = NULL;
+
+ if ( Url == NULL || RetBuffer == NULL || RetSize == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ RCt = KNSManagerMakeHttpFile (
+ _ManagerOfKNS,
+ & File,
+ NULL, /* no open connections */
+ 0x01010000,
+ Url
+ );
+ if ( RCt == 0 ) {
+ RCt = _ReadKFileToMemory ( File, RetBuffer, RetSize );
+
+ ReleaseComplain ( KFileRelease, File );
+ }
+
+ return RCt;
+} /* ReadHttpFileToMemory () */
+
+/*)))
+ /// We need that method because KXML does not read document properly
+ \\\ from KFile over HTTP
+ ///
+(((*/
+rc_t CC
+ReadLocalFileToMemory (
+ const char * FileName,
+ char ** RetBuffer,
+ uint64_t * RetSize
+)
+{
+ rc_t RCt;
+ KDirectory * NativeDir;
+ const KFile * File;
+
+ RCt = 0;
+ NativeDir = NULL;
+ File = NULL;
+
+ RCt = KDirectoryNativeDir ( & NativeDir );
+ if ( RCt == 0 ) {
+
+ RCt = KDirectoryOpenFileRead ( NativeDir, & File, FileName );
+ if ( RCt == 0 ) {
+
+ RCt = _ReadKFileToMemory ( File, RetBuffer, RetSize );
+
+ KFileRelease ( File );
+ }
+
+ KDirectoryRelease ( NativeDir );
+ }
+
+ return RCt;
+} /* ReadLocalFileToMemory () */
+
+rc_t CC
+ExecuteCGI ( const char * CGICommand )
+{
+ rc_t RCt;
+ const KFile * File;
+ uint64_t FileSize, ToRead, Pos;
+ char Buffer [ 4096 ];
+ size_t NumRead, BSize;
+
+ RCt = 0;
+ File = NULL;
+ FileSize = ToRead = Pos = 0;
+ NumRead = 0;
+ BSize = sizeof ( Buffer );
+
+ if ( CGICommand == NULL ) {
+ return RC ( rcExe, rcFile, rcReading, rcParam, rcNull );
+ }
+
+ RCt = KNSManagerMakeHttpFile (
+ _ManagerOfKNS,
+ & File,
+ NULL, /* no open connections */
+ 0x01010000,
+ CGICommand
+ );
+ if ( RCt == 0 ) {
+ RCt = KFileSize ( File, & FileSize );
+ if ( RCt == 0 ) {
+ Pos = 0;
+ NumRead = 0;
+
+ while ( 0 <= FileSize ) {
+ ToRead = FileSize < BSize ? FileSize : BSize ;
+ RCt = KFileRead (
+ File,
+ Pos,
+ Buffer,
+ BSize,
+ & NumRead
+ );
+ if ( RCt != 0 ) {
+ break;
+ }
+
+ Pos += NumRead;
+ FileSize -= NumRead;
+ }
+ }
+
+ ReleaseComplain ( KFileRelease, File );
+ }
+
+ return RCt;
+} /* ExecuteCGI () */
+
+/* just a test */
diff --git a/tools/fuse/remote-cache.h b/tools/fuse/remote-cache.h
new file mode 100644
index 0000000..1635904
--- /dev/null
+++ b/tools/fuse/remote-cache.h
@@ -0,0 +1,169 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_remote_cache_fuser_
+#define _h_remote_cache_fuser_
+
+/*
+ * Lyrics ... because quite exotic requirements of remote file access
+ * which means that we are accessing only files which will be described
+ * in XML file, there are several propositions which were made:
+ * 1) if there -x parameter to fuser contains URL path, we suppose
+ * that fuser is working in REMOTE MODE
+ * 2) REMOTE MODE required parameter cache directory, and all files
+ * will be accessed as CACHEDTEE files.
+ * 3) the XML document, which describes filesystem will contain only
+ * these entries: Directory, File and another XML document.
+ * 4) cached files are valid only on session time, or at the time
+ * while fuser is working. That means that each time when fuser
+ * started, it removes all cached files, if those left from
+ * previous session.
+ * 5) There could be two types of files: plain files and XML
+ * documents, which represents filesystem node. Files are stored
+ * in cache directory, and XML documents are loaded and interpreted
+ * imediately
+ * 6) IMPORTANT: we are not going to initialize and start thread for
+ * SRA_List, as for checking and updating XML_root document thread
+ * 8) I beleive that it could me much easiest way to write designated
+ * application for accessing remote files, however, client wants
+ * it as fuser extention
+ */
+
+/*)))
+ /// MALICIOUS CODE ON
+(((*/
+
+/*))
+ // That method will check if path is remote ... starts from "http"
+((*/
+bool CC IsRemotePath ( const char * Path );
+
+/*))
+ // That method will check if path is local ... exists
+((*/
+bool CC IsLocalPath ( const char * Path );
+
+ /*)))
+ /// Remote cache initialisation and so on
+ (((*/
+/* Lyrics:
+ * We consider that cache is a directory in local filesystem, which
+ * fully defined by it's path. The content of directory is valid only
+ * for session period, from the time of Cache Initialize to Finalize
+ * Once new session is started, the content of cache left from previous
+ * session is dropped.
+ * For a moment we do beleive that we do have only one cache directory
+ * per session, which could be initialized only once
+ * UPDATE: from now we allow non-cacheing or diskless mode. In that case
+ * fuzer will not create any additional files or directories and
+ * will not use cachetee file, but direct HTTP connection
+ */
+
+/* That structure will represent CacheFile
+ */
+struct RCacheEntry;
+
+ /*))
+ // Three methods to work with CacheEntry
+ ((*/
+rc_t CC RCacheEntryAddRef ( struct RCacheEntry * self );
+rc_t CC RCacheEntryRelease ( struct RCacheEntry * self );
+rc_t CC RCacheEntryRead (
+ struct RCacheEntry * self,
+ char * Buffer,
+ size_t BufferSize,
+ uint64_t Offset,
+ size_t * NumRead,
+ uint64_t * ActualSize
+ );
+ /*))
+ // This method will set block size for HTTP transport
+ \\ If user want to use default block size value, 0 should
+ // be used. Will return previous value for block size
+ ((*/
+uint32_t CC RemoteCacheSetHttpBlockSize ( uint32_t HttpBlockSize );
+
+ /*))
+ // This method will set path for local cache dir
+ \\
+ // NOTE: CachePath could be NULL, then it is diskless mode
+ ((*/
+rc_t CC RemoteCacheInitialize ( const char * CachePath );
+ /*))
+ // This method will initialize local cache dir:
+ \\ It will create cache directory if it does not exist
+ // It will remove all leftovers from previous session
+ ((*/
+rc_t CC RemoteCacheCreate ();
+ /*))
+ // This method will finalise cache and destroy it's content
+ ((*/
+rc_t CC RemoteCacheDispose ();
+
+ /*))
+ // Misc methods
+ ((*/
+const char * RemoteCachePath ();
+
+bool RemoteCacheIsDisklessMode ();
+
+rc_t CC RemoteCacheFindOrCreateEntry (
+ const char * Url,
+ struct RCacheEntry ** Entry
+ );
+
+ /*))
+ // Found that interesting
+ ((*/
+rc_t CC ReadHttpFileToMemory (
+ const char * Url,
+ char ** RetBuffer,
+ uint64_t * RetSize
+ );
+
+rc_t CC ReadLocalFileToMemory (
+ const char * FileName,
+ char ** RetBuffer,
+ uint64_t * RetSize
+ );
+
+rc_t CC ExecuteCGI ( const char * CGICommand );
+
+/*)))
+ /// Shamefull macro
+(((*/
+ #define RM_DEAF_LGO
+
+ #ifdef RM_DEAF_LGO
+ #define RmOutMsg KOutMsg
+ #else /* RM_DEAF_LGO */
+ #define RmOutMsg(...)
+ #endif /* RM_DEAF_LGO */
+
+/*)))
+ /// MALICIOUS CODE OFF
+(((*/
+
+#endif /* _h_remote_cache_fuser_ */
diff --git a/tools/fuse/remote-directory.c b/tools/fuse/remote-directory.c
new file mode 100644
index 0000000..487fafe
--- /dev/null
+++ b/tools/fuse/remote-directory.c
@@ -0,0 +1,411 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <klib/container.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kproc/lock.h>
+
+typedef struct DirectoryNode DirectoryNode;
+#define FSNODE_IMPL DirectoryNode
+
+#include "log.h"
+#include "xml.h"
+#include "remote-directory.h"
+#include "kfile-accessor.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+
+typedef struct DirNodeChild_struct {
+ BSTNode node;
+ const char* full_name; /* full path to detected file */
+ const char* name; /* file name only within full_name above */
+ const FSNode* child;
+} DirNodeChild;
+
+
+static
+int64_t DirNodeChild_FindByName(const void *item, const BSTNode *node)
+{
+ return strcmp((const char*)item, ((const DirNodeChild*)node)->child->name);
+}
+
+static
+void DirNodeChild_Whack(BSTNode *node, void *data)
+{
+ DirNodeChild* n = (DirNodeChild*)node;
+
+ if( n != NULL ) {
+ DEBUG_LINE(8, "Releasing auto TAR %s", n->child->name);
+ FSNode_Release(n->child);
+ FREE(n);
+ }
+}
+
+struct DirectoryNode {
+ FSNode node;
+ char* path;
+ KTime_t mtime;
+ KRWLock* lock;
+ KTime_t timestamp;
+ /* list of physical files and dirs in 'path' minus those in children list */
+ KNamelist* ls;
+ BSTree children;
+};
+
+struct DirNodeChild_List_Data {
+ rc_t rc;
+ const DirectoryNode* cself;
+ FSNode_Dir_Visit func;
+ void* data;
+};
+
+static
+bool DirNodeChild_List( BSTNode *node, void *data )
+{
+ DirNodeChild* n = (DirNodeChild*)node;
+ struct DirNodeChild_List_Data* d = (struct DirNodeChild_List_Data*)data;
+ const FSNode* ch;
+ bool hidden = true;
+
+ if( ((d->rc = FSNode_FindChild(&d->cself->node, n->child->name, strlen(n->child->name), &ch, &hidden)) == 0 && hidden) ||
+ (GetRCObject(d->rc) == rcName && GetRCState(d->rc) == rcNotFound) ) {
+ d->rc = d->func(n->child->name, d->data);
+ }
+ return d->rc != 0;
+}
+
+static
+rc_t DirectoryNode_Lock(const DirectoryNode* cself, bool exclusive)
+{
+ DEBUG_LINE(8, "Lock DirectoryNode %s %s", cself->path, exclusive ? "write" : "read");
+ return exclusive ? KRWLockAcquireExcl(((DirectoryNode*)cself)->lock) : KRWLockAcquireShared(((DirectoryNode*)cself)->lock);
+}
+
+static
+rc_t DirectoryNode_Unlock(const DirectoryNode* cself)
+{
+ DEBUG_LINE(8, "Unlocking DirectoryNode %s", cself->path);
+ return KRWLockUnlock(((DirectoryNode*)cself)->lock);
+}
+
+static
+rc_t DirectoryNode_IsChild(const DirectoryNode* cself, const char* subpath, const FSNode** node,
+ int64_t (*finder)(const void *item, const BSTNode *node))
+{
+ DirNodeChild* n = (DirNodeChild*)BSTreeFind(&cself->children, subpath, finder);
+ if( n != NULL ) {
+ *node = n->child;
+ } else {
+ *node = NULL;
+ return RC(rcExe, rcFile, rcAccessing, rcName, rcNotFound);
+ }
+ return 0;
+}
+
+static
+rc_t DirectoryNode_Attr(const DirectoryNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ *type = kptDir;
+ if( cself->path != NULL ) {
+ KDirectory* dir = NULL;
+ const KDirectory* sub = NULL;
+
+ if( subpath != NULL && (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ const FSNode* child = NULL;
+ if( (rc = DirectoryNode_IsChild(cself, subpath, &child, DirNodeChild_FindByName)) == 0 ) {
+ rc = FSNode_Attr(child, NULL, type, ts, file_sz, access, block_sz);
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ if( child != NULL ) {
+ return rc;
+ }
+ }
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 &&
+ (rc = KDirectoryOpenDirRead(dir, &sub, true, "%s", cself->path)) == 0 ) {
+ const char* path = subpath ? subpath : ".";
+ DEBUG_LINE(8, "Using full name %s/%s", cself->path, path);
+ if( (rc = KDirectoryDate(sub, ts, "%s", path)) == 0 ) {
+ *type = KDirectoryPathType(sub, "%s", path);
+ if( *type != kptBadPath && *type != kptNotFound ) {
+ if( (rc = KDirectoryAccess(sub, access, "%s", path)) == 0 ) {
+ if( *type & kptAlias ) {
+ bool children;
+ if( (rc = FSNode_HasChildren(&cself->node, &children)) == 0 ) {
+ /* if it is pointer to an aliased directory and has no XML children than pass symlink on */
+ if( children == false || subpath != NULL ) {
+ char r[4096];
+ if( (rc = KDirectoryResolveAlias(sub, true, r, sizeof(r), "%s", path)) == 0 ) {
+ DEBUG_LINE(8, "Symlink name %s", r);
+ *file_sz = strlen(r);
+ }
+ } else {
+ /* otherwise remove alias bit */
+ *type = *type & ~kptAlias;
+ }
+ }
+ } else if( *type == kptFile ) {
+ rc = KDirectoryFileSize(sub, file_sz, "%s", path);
+ }
+ }
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, sub);
+ ReleaseComplain(KDirectoryRelease, dir);
+ } else if( subpath != NULL ) {
+ rc = RC(rcExe, rcDirectory, rcEvaluating, rcDirEntry, rcNotFound);
+ }
+ if( subpath == NULL && cself->mtime != 0 ) {
+ *ts = cself->mtime;
+ }
+ return rc;
+}
+
+struct DirectoryNode_DirVisit_Data {
+ FSNode_Dir_Visit func;
+ void* data;
+};
+
+static
+rc_t CC DirectoryNode_DirVisit( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ struct DirectoryNode_DirVisit_Data* d = (struct DirectoryNode_DirVisit_Data*)data;
+ return d->func(name, d->data);
+}
+
+static
+rc_t DirectoryNode_Dir(const DirectoryNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL ) {
+ /* add XML tree children */
+ if( (rc = FSNode_ListChildren(&cself->node, func, data)) == 0 ) {
+ if( (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ if( cself->ls != NULL ) {
+ /* add ls result excluding XML children */
+ uint32_t i = 0, count = 0;
+ rc = KNamelistCount(cself->ls, &count);
+ while(rc == 0 && i < count) {
+ const char* nm = NULL;
+ const FSNode* ch;
+ bool hidden = true;
+ if( (rc = KNamelistGet(cself->ls, i++, &nm)) == 0 &&
+ (((rc = FSNode_FindChild(&cself->node, nm, strlen(nm), &ch, &hidden)) == 0 && hidden) ||
+ (GetRCObject(rc) == rcName && GetRCState(rc) == rcNotFound)) ) {
+ rc = func(nm, data);
+ }
+ }
+ }
+ if( rc == 0 ) {
+ struct DirNodeChild_List_Data d;
+ d.rc = 0;
+ d.cself = cself;
+ d.func = func;
+ d.data = data;
+ /* add detected child nodes excluding XML children */
+ BSTreeDoUntil(&cself->children, false, DirNodeChild_List, &d);
+ rc = d.rc;
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ }
+ }
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ struct DirectoryNode_DirVisit_Data d;
+ d.func = func;
+ d.data = data;
+ DEBUG_LINE(8, "Listing kdir path %s/%s", cself->path, subpath);
+ rc = KDirectoryVisit(dir, false, DirectoryNode_DirVisit, &d, "%s/%s", cself->path, subpath);
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ return rc;
+}
+
+
+static
+rc_t DirectoryNode_Open(const DirectoryNode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ const char* nm = NULL;
+
+ if( (rc = DirectoryNode_Lock(cself, false)) == 0 ) {
+ const FSNode* child = NULL;
+ if( (rc = DirectoryNode_IsChild(cself, subpath, &child, DirNodeChild_FindByName)) == 0 ) {
+ rc = FSNode_Open(child, NULL, accessor);
+ }
+ ReleaseComplain(DirectoryNode_Unlock, cself);
+ if( child != NULL ) {
+ return rc;
+ }
+ }
+ if( (rc = FSNode_GetName(&cself->node, &nm)) == 0 ) {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ const KFile* kf = NULL;
+ if( (rc = KDirectoryOpenFileRead(dir, &kf, "%s/%s", cself->path, subpath)) == 0 ) {
+ if( (rc = KFileAccessor_Make(accessor, nm, kf)) != 0 ) {
+ ReleaseComplain(KFileRelease, kf);
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t DirectoryNode_Release(DirectoryNode* self)
+{
+ rc_t rc = 0;
+ if( self != NULL ) {
+ BSTreeWhack(&self->children, DirNodeChild_Whack, NULL);
+ ReleaseComplain(KRWLockRelease, self->lock);
+ ReleaseComplain(KNamelistRelease, self->ls);
+ FREE(self->path);
+ }
+ return rc;
+}
+
+static FSNode_vtbl DirectoryNode_vtbl = {
+ sizeof(DirectoryNode),
+ NULL,
+ NULL,
+ DirectoryNode_Attr,
+ DirectoryNode_Dir,
+ NULL,
+ DirectoryNode_Open,
+ DirectoryNode_Release
+};
+
+
+rc_t RemoteDirectoryNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path, KTime_t dflt_ktm)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || cself == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcConstructing, rcParam, rcNull);
+ } else {
+ char* path = NULL, *name = NULL, name_buf[4096];
+ KTime_t ktm = 0;
+ DirectoryNode* ff = NULL;
+
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &path, NULL)) == 0 ) {
+ if( path[0] != '\0' ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ FREE(path);
+ path = NULL;
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "Directory/@path: '");
+ strcat(errmsg, path ? path : "(null)");
+ strcat(errmsg, "'");
+ }
+ if( rc == 0 ) {
+ size_t sz;
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name_buf, sizeof(name_buf), &sz);
+ if( rc == 0 && name_buf[0] != '\0' ) {
+ name = name_buf;
+ } else if( (GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "Directory/@name");
+ } else if( name == NULL ) {
+ if( path == NULL ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ } else {
+ name = strrchr(path, '/');
+ name = name ? name + 1 : path;
+ }
+ }
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(xml_node, "timestamp", &ktm, true)) != 0 ) {
+ strcpy(errmsg, "Directory/@timestamp");
+ }
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("name", attr_nm) == 0 || strcmp("timestamp", attr_nm) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute Directory/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)&ff, name, &DirectoryNode_vtbl)) == 0 &&
+ (rc = KRWLockMake(&ff->lock)) == 0 ) {
+ ff->path = path;
+ ff->mtime = ktm != 0 ? ktm : (path ? 0 : dflt_ktm);
+ BSTreeInit(&ff->children);
+ } else {
+ strcpy(errmsg, "Directory '");
+ strcat(errmsg, name);
+ strcat(errmsg, "'");
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &ff->node;
+ } else {
+ FREE(path);
+ }
+ }
+ return rc;
+} /* RemoteDirectoryNode_Make () */
diff --git a/tools/fuse/remote-directory.h b/tools/fuse/remote-directory.h
new file mode 100644
index 0000000..bfa0e27
--- /dev/null
+++ b/tools/fuse/remote-directory.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_directory_
+#define _h_sra_fuse_directory_
+
+#include "node.h"
+
+rc_t RemoteDirectoryNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path, KTime_t ts);
+
+#endif /* _h_sra_fuse_directory_ */
diff --git a/tools/fuse/remote-file.c b/tools/fuse/remote-file.c
new file mode 100644
index 0000000..f6b7b83
--- /dev/null
+++ b/tools/fuse/remote-file.c
@@ -0,0 +1,308 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <krypto/encfile.h>
+
+typedef struct RemoteFileNode RemoteFileNode;
+#define FSNODE_IMPL RemoteFileNode
+
+#include "log.h"
+#include "xml.h"
+#include "remote-file.h"
+#include "remote-cache.h"
+#include "kfile-accessor.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+rc_t RemoteFileAccessor_Make(const SAccessor** accessor, const char* name, struct RCacheEntry * rentry, const RemoteFileNode* node);
+
+struct RemoteFileNode {
+ FSNode node;
+ char* path;
+ KTime_t mtime;
+ uint64_t file_sz;
+};
+
+static
+rc_t RemoteFileNode_Attr(const RemoteFileNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ } else {
+ /* Here we are: all attributes from XML */
+ * type = kptFile;
+ * ts = cself -> mtime;
+ * file_sz = cself -> file_sz;
+ * access = 0444;
+ * block_sz = ( 32 * 1024 ); /* <<-- Sorry, I borrowed that
+ * value from KCacheTeeFile
+ */
+ }
+
+ return rc;
+}
+
+static
+rc_t RemoteFileNode_Open(
+ const RemoteFileNode* cself,
+ const char* subpath,
+ const SAccessor** accessor
+)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ struct RCacheEntry * ke = NULL;
+ if ( ( rc = RemoteCacheFindOrCreateEntry( cself->path, &ke )) == 0 ) {
+ if( rc == 0 ) {
+ if ( ( rc = RemoteFileAccessor_Make(
+ accessor,
+ cself->node.name,
+ ke,
+ cself
+ ) ) != 0 ) {
+ ReleaseComplain(RCacheEntryRelease, ke);
+ }
+ }
+
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t RemoteFileNode_Release(RemoteFileNode* self)
+{
+ if( self != NULL ) {
+ FREE(self->path);
+ }
+ return 0;
+}
+
+static FSNode_vtbl RemoteFileNode_vtbl = {
+ sizeof(RemoteFileNode),
+ NULL,
+ NULL,
+ RemoteFileNode_Attr,
+ NULL,
+ NULL, /* Unlike FileNode, there are no links */
+ RemoteFileNode_Open,
+ RemoteFileNode_Release
+};
+
+rc_t RemoteFileNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || cself == NULL || errmsg == NULL || rel_path == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ char* path = NULL, *name = NULL, name_buf[4096];
+ KTime_t ktm = 0;
+ uint64_t fsz = 0;
+ RemoteFileNode* ff = NULL;
+ size_t attribute_sz = 0;
+
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &path, NULL)) == 0 ) {
+ if( path[0] == '\0' ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ } else {
+ /* NOTE: we do not check path for existence */
+ if ( ! IsRemotePath ( path ) ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@path: '");
+ strcat(errmsg, path ? path : "(null)");
+ strcat(errmsg, "'");
+ }
+ if( rc == 0 ) {
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name_buf, sizeof(name_buf), &attribute_sz);
+ if( rc == 0 && name_buf[0] != '\0' ) {
+ name = name_buf;
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@name");
+ } else if( name == NULL ) {
+ name = strrchr(path, '/');
+ name = name ? name + 1 : path;
+ }
+ }
+ if( rc == 0 && (rc = KXMLNodeReadAttrAsU64(xml_node, "size", &fsz)) != 0 ) {
+ strcpy(errmsg, "File/@size");
+ }
+/* Attributes "size" and "timestamp" are mandatory */
+ if ( fsz <= 0 ) {
+ strcpy(errmsg, "File/@size");
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(xml_node, "timestamp", &ktm, true)) != 0 ) {
+ strcpy(errmsg, "File/@timestamp");
+ }
+ if ( ktm == 0 ) {
+ strcpy(errmsg, "File/@timestamp");
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+/* Attributes "size" and "timestamp" are mandatory */
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0
+ || strcmp("name", attr_nm) == 0
+ || strcmp("timestamp", attr_nm) == 0
+ || strcmp("size", attr_nm) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute File/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)&ff, name, &RemoteFileNode_vtbl)) == 0 ) {
+ ff->path = path;
+ ff->mtime = ktm;
+ ff->file_sz = fsz;
+ } else {
+ strcpy(errmsg, "File '");
+ strcat(errmsg, name);
+ strcat(errmsg, "'");
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &ff->node;
+ } else {
+ FREE(path);
+ }
+ }
+ return rc;
+}
+
+/*)))
+ /// Remote file accessor. Read behaviour differs from plain file
+(((*/
+
+typedef struct RemoteFileAccessor_struct {
+ struct RCacheEntry* rentry;
+ struct RemoteFileNode * remote_node;
+} RemoteFileAccessor;
+
+static
+rc_t RemoteFileAccessor_Read(const SAccessor* cself, char* buf, size_t size, off_t offset, size_t* num_read)
+{
+ rc_t rc = 0;
+ RemoteFileAccessor* self = (RemoteFileAccessor*)cself;
+ size_t actual = 0;
+ uint64_t actual_file_sz = self -> remote_node -> file_sz;
+
+ /* Here we are truncating size if it is needed */
+ if ( actual_file_sz < offset + size ) {
+ size = actual_file_sz - offset;
+ }
+ do {
+ rc = RCacheEntryRead (
+ self -> rentry,
+ &buf[*num_read],
+ size - * num_read,
+ offset + * num_read,
+ &actual,
+ &actual_file_sz
+ );
+ if( rc != 0 ) {
+ break;
+ }
+ if( actual == 0 ) {
+ /* EOF */
+ break;
+ }
+
+ if ( actual_file_sz != self -> remote_node -> file_sz ) {
+ self -> remote_node -> file_sz = actual_file_sz;
+ }
+ *num_read += actual;
+ } while(rc == 0 && *num_read < size);
+ DEBUG_MSG(10, ("From %lu read %lu bytes\n", offset, *num_read));
+
+ return rc;
+}
+
+static
+rc_t RemoteFileAccessor_Release(const SAccessor* cself)
+{
+ rc_t rc = 0;
+ if( cself != NULL ) {
+ RemoteFileAccessor* self = (RemoteFileAccessor*)cself;
+ rc = RCacheEntryRelease(self->rentry);
+ }
+ return rc;
+}
+
+rc_t
+RemoteFileAccessor_Make (
+ const SAccessor** accessor,
+ const char* name,
+ struct RCacheEntry * rentry,
+ const RemoteFileNode* node
+)
+{
+ rc_t rc = 0;
+
+ if( (rc = SAccessor_Make(accessor, sizeof(RemoteFileAccessor), name, RemoteFileAccessor_Read, RemoteFileAccessor_Release)) == 0 ) {
+ ((RemoteFileAccessor*)(*accessor))->rentry = rentry;
+ ((RemoteFileAccessor*)(*accessor))->remote_node = ( struct RemoteFileNode * ) node;
+
+ RCacheEntryAddRef ( rentry );
+ }
+ return rc;
+}
diff --git a/tools/fuse/remote-file.h b/tools/fuse/remote-file.h
new file mode 100644
index 0000000..f50a24c
--- /dev/null
+++ b/tools/fuse/remote-file.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_remote_file_
+#define _h_sra_fuse_remote_file_
+
+#include "node.h"
+
+rc_t RemoteFileNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path);
+
+#endif /* _h_sra_fuse_remote_file_ */
diff --git a/tools/fuse/remote-fuser.c b/tools/fuse/remote-fuser.c
new file mode 100644
index 0000000..cd13db3
--- /dev/null
+++ b/tools/fuse/remote-fuser.c
@@ -0,0 +1,206 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/args.h>
+#include <klib/out.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "log.h"
+#include "node.h"
+#include "accessor.h"
+
+#include "remote-xml.h"
+#include "remote-fuser.h"
+#include "remote-cache.h"
+
+typedef struct SRequest_struct {
+ const FSNode* node;
+ const char* subpath;
+} SRequest;
+
+static char* g_work_dir = NULL;
+
+static
+rc_t SRequestMake(SRequest* request, const char* path, bool recur)
+{
+ rc_t rc = 0;
+
+ if( request == NULL ) {
+ rc = RC(rcExe, rcFileDesc, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = XML_FindLock(path, recur, &request->node, &request->subpath);
+ }
+ return rc;
+}
+
+static
+void SRequestRelease(SRequest* request)
+{
+ if( request != NULL ) {
+ XML_FindRelease();
+ }
+}
+
+rc_t Initialize(unsigned int sra_sync, const char* xml_path, const char* cache_dir, const char* heart_beat_url, unsigned int xml_sync, const char* xml_root, uint32_t block_size)
+{
+ rc_t rc = 0;
+ KDirectory* dir = NULL;
+
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ char buf[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, buf, 4096, xml_root)) == 0 ) {
+ /* replace /. at the end to just / */
+ if( strcmp(&buf[strlen(buf) - 2], "/.") == 0 ) {
+ buf[strlen(buf) - 1] = '\0';
+ }
+ /* add / to the end if missing */
+ if( buf[strlen(buf) - 1] != '/' ) {
+ buf[strlen(buf) + 1] = '\0';
+ buf[strlen(buf)] = '/';
+ }
+ if( (rc = StrDup(buf, &g_work_dir)) == 0 ) {
+ DEBUG_MSG(8, ("Current directory set to '%s'\n", g_work_dir));
+ }
+ }
+
+ if ( rc == 0 ) {
+ rc = RemoteCacheInitialize ( cache_dir );
+ if ( rc == 0 ) {
+ RemoteCacheSetHttpBlockSize ( block_size );
+
+ if ( IsLocalPath ( xml_path ) ) {
+ KDirectoryResolvePath(dir, true, buf, 4096, xml_path);
+ rc = XML_Make(dir, g_work_dir, buf, heart_beat_url, xml_sync);
+ }
+ else {
+ rc = XML_Make(dir, g_work_dir, xml_path, heart_beat_url, xml_sync);
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ return rc;
+}
+
+/* =============================================================================== */
+/* system call handlers */
+/* =============================================================================== */
+
+const char UsageDefaultName[] = "remote-fuser";
+
+rc_t CC UsageSummary (const char* progname)
+{
+ return KOutMsg("Usage:\n"
+ "\t%s [options] -o [FUSE options] -x path -m path\n"
+ "\t%s [options] -u -m path\n\n", progname, progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ /* dummy for newer args system will be filled when system is complete!!! */
+ return 0;
+}
+
+void SRA_FUSER_Init(void)
+{
+ rc_t rc = 0;
+ /* reopen log file and start watch thread(s) */
+ if( (rc = LogFile_Init(NULL, 0, true, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "log file");
+ }
+ XML_Init();
+ LOGMSG(klogInfo, "Started");
+}
+
+void SRA_FUSER_Fini(void)
+{
+ XML_Fini();
+ LOGMSG(klogInfo, "Stopped");
+ LogFile_Fini();
+ FREE(g_work_dir);
+}
+
+rc_t SRA_FUSER_GetDir(const char* path, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, true)) == 0 ) {
+ rc = FSNode_Dir(request.node, request.subpath, func, data);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_GetAttr(const char* path, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Attr(request.node, request.subpath, type, ts, file_sz, access, block_sz);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_ResolveLink(const char* path, char* buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Link(request.node, request.subpath, buf, buf_sz);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_OpenNode(const char* path, const void** data)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Open(request.node, request.subpath, (const SAccessor**)data);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_ReadNode(const char* path, const void* data, char *buf, size_t size, off_t offset, size_t* num_read)
+{
+ return SAccessor_Read(data, buf, size, offset, num_read);
+}
+
+rc_t SRA_FUSER_CloseNode(const char* path, const void* data)
+{
+/*
+RmOutMsg (")_)_)_)_)__)_) SRA_FUSER_CloseNode\n" );
+*/
+ return SAccessor_Release(data);
+}
diff --git a/tools/fuse/remote-fuser.h b/tools/fuse/remote-fuser.h
new file mode 100644
index 0000000..80badaf
--- /dev/null
+++ b/tools/fuse/remote-fuser.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_fuser_
+#define _h_sra_fuse_fuser_
+
+#include "node.h"
+
+uint32_t KAppVersion(void);
+
+/* TBH added cache_dir parameter, and xml_root, and block_size */
+rc_t Initialize(unsigned int sra_sync, const char* xml_path,
+ const char* cache_dir, const char* heart_beat_url,
+ unsigned int xml_sync, const char* xml_root,
+ uint32_t block_size);
+/* TBN */
+
+/* FUSE call backs */
+void SRA_FUSER_Init(void);
+void SRA_FUSER_Fini(void);
+
+rc_t SRA_FUSER_GetAttr(const char* path, uint32_t* type, KTime_t* date, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz);
+rc_t SRA_FUSER_GetDir(const char* path, FSNode_Dir_Visit func, void* data);
+rc_t SRA_FUSER_ResolveLink(const char* path, char* buf, size_t buf_sz);
+
+rc_t SRA_FUSER_OpenNode(const char* path, const void** data);
+rc_t SRA_FUSER_ReadNode(const char* path, const void* data, char *buf, size_t size, off_t offset, size_t* num_read);
+rc_t SRA_FUSER_CloseNode(const char* path, const void* data);
+
+#endif /* _h_sra_fuse_fuser_ */
diff --git a/tools/fuse/remote-link.c b/tools/fuse/remote-link.c
new file mode 100644
index 0000000..4354627
--- /dev/null
+++ b/tools/fuse/remote-link.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <krypto/encfile.h>
+
+typedef struct RemoteLinkNode RemoteLinkNode;
+#define FSNODE_IMPL RemoteLinkNode
+
+#include "log.h"
+#include "xml.h"
+#include "remote-link.h"
+#include "remote-cache.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+/**************************************************************
+ * UMBROCHUHVYR
+ * There is some info about links in that application
+ * We suppose that Link is a symbolic link, which have only one
+ * parameter path to the referred node. That path could be :
+ * absolute - in that case node will be searched from root of
+ * XML document describing that directory
+ * relative - in that case node will be searched from current
+ * link location.
+ **************************************************************/
+
+struct RemoteLinkNode {
+ FSNode node;
+ char* path;
+ KTime_t mtime;
+};
+
+static
+rc_t RemoteLinkNode_Attr(const RemoteLinkNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ } else {
+ /* Here we are: all attributes from XML */
+ * type = kptFile | kptAlias;
+ * ts = cself -> mtime;
+ * file_sz = 5;
+ * access = 0777;
+ * block_sz = ( 32 * 1024 ); /* <<-- Sorry, I borrowed that
+ * value from KCacheTeeFile
+ */
+ }
+
+ return rc;
+}
+
+static
+rc_t RemoteLinkNode_Link(
+ const RemoteLinkNode* cself,
+ const char* subpath,
+ char * Buffer,
+ size_t BufferSize
+)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ size_t pathSize = string_measure ( cself -> path, NULL );
+ if ( Buffer == NULL || BufferSize <= pathSize ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcInvalid);
+ }
+ else {
+ string_copy ( Buffer, BufferSize, cself -> path, pathSize );
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t RemoteLinkNode_Release(RemoteLinkNode* self)
+{
+ if( self != NULL ) {
+ FREE(self->path);
+ }
+ return 0;
+}
+
+static FSNode_vtbl RemoteLinkNode_vtbl = {
+ sizeof(RemoteLinkNode),
+ NULL,
+ NULL,
+ RemoteLinkNode_Attr,
+ NULL,
+ RemoteLinkNode_Link,
+ NULL,
+ RemoteLinkNode_Release
+};
+
+rc_t RemoteLinkNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || cself == NULL || errmsg == NULL || rel_path == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ char* path = NULL, *name = NULL, name_buf[4096];
+ KTime_t ktm = 0;
+ RemoteLinkNode* ff = NULL;
+ size_t attribute_sz = 0;
+
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &path, NULL)) == 0 ) {
+ if( path[0] == '\0' ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@path: '");
+ strcat(errmsg, path ? path : "(null)");
+ strcat(errmsg, "'");
+ }
+ if( rc == 0 ) {
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name_buf, sizeof(name_buf), &attribute_sz);
+ if( rc == 0 && name_buf[0] != '\0' ) {
+ name = name_buf;
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "File/@name");
+ } else if( name == NULL ) {
+ name = strrchr(path, '/');
+ name = name ? name + 1 : path;
+ }
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(xml_node, "timestamp", &ktm, true)) != 0 ) {
+ strcpy(errmsg, "File/@timestamp");
+ }
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0
+ || strcmp("name", attr_nm) == 0
+ || strcmp("timestamp", attr_nm) == 0
+ ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute File/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)&ff, name, &RemoteLinkNode_vtbl)) == 0 ) {
+ ff->path = path;
+ ff->mtime = ktm;
+ } else {
+ strcpy(errmsg, "File '");
+ strcat(errmsg, name);
+ strcat(errmsg, "'");
+ }
+ }
+ if( rc == 0 ) {
+ *cself = &ff->node;
+ } else {
+ FREE(path);
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/remote-link.h b/tools/fuse/remote-link.h
new file mode 100644
index 0000000..4322713
--- /dev/null
+++ b/tools/fuse/remote-link.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_remote_link_
+#define _h_sra_fuse_remote_link_
+
+#include "node.h"
+
+rc_t RemoteLinkNode_Make(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path);
+
+#endif /* _h_sra_fuse_remote_link_ */
diff --git a/tools/fuse/remote-xml.c b/tools/fuse/remote-xml.c
new file mode 100644
index 0000000..a94c293
--- /dev/null
+++ b/tools/fuse/remote-xml.c
@@ -0,0 +1,604 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <klib/namelist.h>
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+#include <klib/time.h>
+#include <klib/out.h>
+#include <kproc/lock.h>
+#include <kproc/thread.h>
+#include <kns/manager.h>
+#include <kns/http.h>
+
+#include "log.h"
+#include "remote-xml.h"
+#include "file.h"
+#include "node.h"
+
+#include "remote-file.h"
+#include "remote-directory.h"
+#include "remote-link.h"
+#include "remote-cache.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+static const KXMLMgr* g_xmlmgr = NULL;
+static const FSNode* g_root = NULL;
+static KRWLock* g_lock = NULL;
+static const char* g_start_dir = NULL;
+
+static unsigned int g_xml_sync = 0;
+/* if g_xml_sync == 0 these are not used: */
+static KTime_t g_xml_mtime = 0;
+static char* g_xml_path = NULL;
+static KThread* g_xml_thread = NULL;
+
+static char g_fuse_version [ 128 ];
+static char g_heart_beat_url_complete [ 4096 ];
+static char * g_heart_beat_url = NULL;
+static char * g_heart_beat_url_complete_p = NULL;
+
+static
+rc_t XMLLock(bool exclusive)
+{
+ DEBUG_MSG(10, ("Lock XML tree %s\n", exclusive ? "write" : "read"));
+ return exclusive ? KRWLockAcquireExcl(g_lock) : KRWLockAcquireShared(g_lock);
+}
+
+static
+void XMLUnlock(void)
+{
+ DEBUG_MSG(10, ("Unlocked XML tree\n"));
+ ReleaseComplain(KRWLockUnlock, g_lock);
+}
+
+void XML_FindRelease(void)
+{
+ XMLUnlock();
+}
+
+rc_t XML_FindLock(const char* path, bool recur, const FSNode** node, const char** subpath)
+{
+ rc_t rc = 0;
+ size_t sz = 0;
+ const char* p0 = NULL, *p = NULL;
+ const FSNode* pn = NULL, *n = NULL;
+ bool hidden = false;
+
+ if( path == NULL || node == NULL || subpath == NULL ) {
+ return RC(rcExe, rcPath, rcResolving, rcParam, rcNull);
+ }
+ sz = strlen(path);
+ if( sz == 0 ) {
+ return RC(rcExe, rcPath, rcResolving, rcParam, rcEmpty);
+ }
+ p0 = path;
+ if( (rc = XMLLock(false)) != 0 ) {
+ return rc;
+ }
+ pn = g_root;
+ do {
+ DEBUG_MSG(8, ("Path: '%s'\n", p0));
+ while( *p0 == '/' && *p0 != '\0' ) {
+ p0++;
+ }
+ if( *p0 == '\0' ) {
+ break;
+ }
+ p = strchr(p0, '/');
+ if( p == NULL ) {
+ p = p0 + strlen(p0);
+ }
+ DEBUG_MSG(8, ("Push: '%.*s'\n", p - p0, p0));
+ if( (rc = FSNode_FindChild(pn, p0, p - p0, &n, &hidden)) == 0 ) {
+ if( hidden ) {
+ pn = n;
+ DEBUG_MSG(8, ("Match! hidden '%s' left '%s'\n", pn->name, p0));
+ break;
+ } else {
+ DEBUG_MSG(8, ("Match! '%.*s' left '%s'\n", p - p0, p0, p));
+ }
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ break;
+ }
+ pn = n;
+ p0 = p;
+ } while( rc == 0 && p0 < path + sz );
+
+ if( rc == 0 ) {
+ if( pn == NULL ) {
+ rc = RC(rcExe, rcPath, rcResolving, rcDirEntry, rcNotFound);
+ DEBUG_MSG(10, ("Not found: '%s', in '%s'\n", p0, path));
+ } else {
+ if( (rc = FSNode_Touch(pn)) != 0 ) {
+ PLOGERR(klogWarn, (klogWarn, rc, "touch failed for $(n)", PLOG_S(n), pn->name));
+ rc = 0;
+ }
+ *node = pn;
+ *subpath = (p0 && p0[0] != '\0') ? p0 : NULL;
+#if _DEBUGGING
+ {
+ const char* nm = NULL;
+ FSNode_GetName(pn, &nm);
+ DEBUG_MSG(10, ("Found: '%s', sub '%s'\n", nm, *subpath));
+ }
+#endif
+ }
+ }
+ if( rc != 0 ) {
+ XMLUnlock();
+ }
+ return rc;
+}
+
+static
+rc_t XML_ValidateNode(FSNode* parent, const KXMLNode* n, char* errmsg)
+{
+ rc_t rc = 0;
+ const char* name = NULL;
+ FSNode* fsn = NULL;
+ bool children_allowed = false, should_have_children = false, ignore_children = false;
+
+ if( (rc = KXMLNodeElementName(n, &name)) != 0 ) {
+ return rc;
+ }
+ DEBUG_MSG(8, ("Node: %s\n", name));
+ if( name == NULL ) {
+ return RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcNull);
+ }
+
+ if( strcmp(name, "Directory") == 0 ) {
+ rc = RemoteDirectoryNode_Make(n, &fsn, errmsg, g_start_dir, g_xml_mtime);
+ children_allowed = true;
+ } else if( strcmp(name, "File") == 0 ) {
+ rc = RemoteFileNode_Make(n, &fsn, errmsg, g_start_dir);
+ } else if( strcmp(name, "Link") == 0 ) {
+ rc = RemoteLinkNode_Make(n, &fsn, errmsg, g_start_dir);
+ } else {
+ strcpy(errmsg, name);
+ rc = RC(rcExe, rcDoc, rcValidating, rcTag, rcUnknown);
+ }
+ if( rc == 0 ) {
+ strcpy(errmsg, name);
+ if( fsn == parent || (rc = FSNode_AddChild(parent, fsn)) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodeCountChildNodes(n, &count)) == 0 && count > 0 ) {
+ if( !children_allowed ) {
+ if( fsn != NULL ) {
+ FSNode_GetName(fsn, &name);
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, name);
+ } else if( !ignore_children ) {
+ uint32_t i = 0;
+ const KXMLNode* ch = NULL;
+ while( rc == 0 && i < count ) {
+ if( (rc = KXMLNodeGetNodeRead(n, &ch, i++)) == 0 ) {
+ rc = XML_ValidateNode(fsn, ch, errmsg);
+ ReleaseComplain(KXMLNodeRelease, ch);
+ }
+ }
+ }
+ } else if( count == 0 && should_have_children ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n) may have children", PLOG_S(n), name));
+ }
+ }
+ }
+ return rc;
+} /* XML_ValidateNode() */
+
+static
+rc_t RootNode_Attr(const FSNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ *type = kptDir;
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ }
+ return rc;
+}
+
+static
+rc_t RootNode_Dir(const FSNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ if( subpath != NULL ) {
+ return RC(rcExe, rcFile, rcListing, rcDirEntry, rcNotFound);
+ }
+ return FSNode_ListChildren(cself, func, data);
+}
+
+static const FSNode_vtbl RootNode_vtbl = {
+ sizeof(FSNode),
+ NULL,
+ NULL,
+ RootNode_Attr,
+ RootNode_Dir,
+ NULL,
+ NULL,
+ NULL
+};
+
+/*)))
+ /// I make that method becaue I need also to retrieve version
+(((*/
+static
+rc_t _XML_DocumentOpenAndSomethingElse (
+ const char * Url,
+ const KXMLDoc ** Doc
+)
+{
+ rc_t RCt;
+ char * Buffer;
+ uint64_t BufferSize;
+ const KXMLDoc * XmlDoc;
+ const KXMLNodeset * NodeSet;
+ uint32_t NodeCount;
+ size_t AttrSize;
+ const KXMLNode * Node;
+
+ RCt = 0;
+ Buffer = NULL;
+ BufferSize = 0;
+ XmlDoc = NULL;
+ NodeSet = NULL;
+ NodeCount = AttrSize = 0;
+ Node = NULL;
+
+ if ( Url == NULL || Doc == NULL ) {
+ return RC ( rcXML, rcDoc, rcConstructing, rcParam, rcNull );
+ }
+ * Doc = NULL;
+
+ RCt = IsLocalPath ( Url )
+ ? ReadLocalFileToMemory ( Url, & Buffer, & BufferSize )
+ : ReadHttpFileToMemory ( Url, & Buffer, & BufferSize )
+ ;
+ if ( RCt == 0 ) {
+ RCt = KXMLMgrMakeDocReadFromMemory (
+ g_xmlmgr,
+ & XmlDoc,
+ Buffer,
+ BufferSize
+ );
+ if ( RCt == 0 ) {
+ /* Here we are ... retrieving '/FUSE' node
+ */
+ RCt = KXMLDocOpenNodesetRead (
+ XmlDoc,
+ &NodeSet,
+ "/FUSE"
+ );
+ if ( RCt == 0 ) {
+ RCt = KXMLNodesetCount ( NodeSet, & NodeCount );
+ if ( RCt == 0 ) {
+ if ( NodeCount != 1 ) {
+ RCt = RC ( rcXML, rcDoc, rcConstructing, rcFormat, rcInvalid );
+ }
+ if ( RCt == 0 ) {
+ /* FUSE node is always alone
+ */
+ RCt = KXMLNodesetGetNodeRead (
+ NodeSet,
+ & Node,
+ 0
+ );
+ if ( RCt == 0 ) {
+ RCt = KXMLNodeReadAttrCString (
+ Node,
+ "version",
+ g_fuse_version,
+ sizeof ( g_fuse_version ),
+ & AttrSize
+ );
+ if ( RCt != 0 ) {
+ /* There were no version defined */
+ RmOutMsg ( "WARNING: No version provided\n" );
+ RCt = 0;
+ }
+ else {
+ /* TODO : set version */
+ if ( g_heart_beat_url != NULL ) {
+ RCt = string_printf (
+ g_heart_beat_url_complete,
+ sizeof ( g_heart_beat_url_complete ),
+ & AttrSize,
+ g_heart_beat_url,
+ g_fuse_version
+ );
+ if ( RCt == 0 ) {
+ g_heart_beat_url_complete_p = g_heart_beat_url_complete;
+ }
+ }
+ }
+
+ ReleaseComplain ( KXMLNodeRelease, Node );
+ }
+ }
+ }
+
+ ReleaseComplain ( KXMLNodesetRelease, NodeSet );
+ }
+ }
+
+ free ( Buffer );
+ }
+
+ if ( RCt == 0 ) {
+ * Doc = XmlDoc;
+ }
+ else {
+ ReleaseComplain ( KXMLDocRelease, XmlDoc );
+ }
+
+ return RCt;
+} /* _XML_DocumentOpenAndSomethingElse () */
+
+static
+rc_t XML_Open(const char* path, const FSNode** tree)
+{
+ rc_t rc = 0;
+ char errmsg[4096] = "";
+ const KXMLDoc* xmldoc = NULL;
+
+ PLOGMSG(klogInfo, (klogInfo, "Reading XML file '$(x)'", PLOG_S(x), path));
+ if( (rc = _XML_DocumentOpenAndSomethingElse(path, &xmldoc)) == 0 ) {
+
+ if( (rc = FSNode_Make((FSNode**)tree, "ROOT", &RootNode_vtbl)) == 0 ) {
+ const KXMLNodeset* ns = NULL;
+ if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/FUSE/*")) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
+ if( count == 0 ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcData, rcEmpty);
+ } else {
+ uint32_t i = 0;
+ while(rc == 0 && i < count) {
+ const KXMLNode* n = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(ns, &n, i++)) == 0 ) {
+ errmsg[0] = '\0';
+ rc = XML_ValidateNode((FSNode*)*tree, n, errmsg);
+ ReleaseComplain(KXMLNodeRelease, n);
+ }
+ }
+ }
+ }
+ ReleaseComplain(KXMLNodesetRelease, ns);
+ }
+ }
+ if( rc != 0 ) {
+ FSNode_Release(*tree);
+ *tree = NULL;
+ }
+ ReleaseComplain(KXMLDocRelease, xmldoc);
+ }
+ if( rc == 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "XML file '$(x)' ok", PLOG_S(x), path));
+ } else {
+ if( strlen(errmsg) < 1 ) {
+ strcpy(errmsg, path);
+ }
+ LOGERR(klogErr, rc, errmsg);
+ }
+ return rc;
+}
+
+static
+rc_t XMLThread( const KThread *self, void *data )
+{
+ /* rc_t rc = 0; */
+
+ PLOGMSG(klogInfo, (klogInfo, "Heart beat thread started with $(s) sec", PLOG_U32(s), g_xml_sync));
+
+ do {
+ KSleepMs(g_xml_sync * 1000);
+
+ PLOGMSG(klogInfo, (klogInfo, "Heart beat working $(s)", PLOG_S(s), g_heart_beat_url_complete_p));
+
+ if ( g_heart_beat_url_complete_p != NULL ) {
+ /* rc = */ ExecuteCGI ( g_heart_beat_url_complete_p );
+ }
+ } while( g_xml_sync > 0 );
+ LOGMSG(klogInfo, "Heart beat thread ended");
+ return 0;
+}
+
+rc_t XML_Make(KDirectory* dir, const char* const work_dir, const char* xml_path, const char *heart_beat_url, unsigned int sync)
+{
+ rc_t rc = 0;
+
+ g_xml_sync = sync;
+ if( g_xmlmgr == NULL && (rc = KXMLMgrMakeRead(&g_xmlmgr)) != 0 ) {
+ g_xmlmgr = NULL;
+ LOGERR(klogErr, rc, "XML manager");
+ } else {
+ if( (rc = StrDup(xml_path, &g_xml_path)) == 0 ) {
+ DEBUG_MSG(8, ("XML path set to '%s'\n", g_xml_path));
+ }
+ if ( heart_beat_url != NULL ) {
+ if( (rc = StrDup(heart_beat_url, & g_heart_beat_url) ) == 0 ) {
+ DEBUG_MSG(8, ("Heart Beat path set to '%s'\n", g_heart_beat_url));
+ }
+ }
+ else {
+ g_heart_beat_url = NULL;
+ }
+
+ g_start_dir = work_dir;
+ }
+ if( rc == 0 ) {
+ rc = FSNode_Make((FSNode**)&g_root, "ROOT", &RootNode_vtbl);
+ }
+ return rc;
+}
+
+void FUSER_abort ();
+
+void XML_Init(void)
+{
+ rc_t rc = 0;
+
+ * g_fuse_version = 0;
+ * g_heart_beat_url_complete = 0;
+
+ if( g_lock == NULL && (rc = KRWLockMake(&g_lock)) != 0 ) {
+ g_lock = NULL;
+ LOGERR(klogErr, rc, "XML lock");
+ }
+
+ PLOGMSG(klogInfo, (klogInfo, "XML file is URL '$(x)' ok", PLOG_S(x), g_xml_path));
+
+ rc = RemoteCacheCreate ();
+ if ( rc == 0 ) {
+ rc = XML_Open ( g_xml_path, & g_root );
+ if ( rc == 0 ) {
+ /*) Here we are starting special thtread, only if
+ / users set up URL
+ (*/
+ if ( rc == 0 && g_heart_beat_url_complete_p != NULL ) {
+ if( (rc = KThreadMake(&g_xml_thread, XMLThread, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "XML sync thread");
+ }
+ }
+ else {
+ LOGMSG(klogInfo, "Skipping starting of heart beat thread");
+ }
+ }
+ }
+
+ if ( rc != 0 ) {
+ FUSER_abort ();
+ }
+}
+
+void XML_Fini(void)
+{
+
+
+ g_xml_sync = 0;
+ if( g_xml_thread != NULL ) {
+ ReleaseComplain(KThreadCancel, g_xml_thread);
+ ReleaseComplain(KThreadRelease, g_xml_thread);
+ }
+ ReleaseComplain(KXMLMgrRelease, g_xmlmgr);
+ XMLLock(true);
+ FSNode_Release(g_root);
+ XMLUnlock();
+ ReleaseComplain(KRWLockRelease, g_lock);
+ FREE(g_xml_path);
+
+ RemoteCacheDispose ();
+
+ g_root = NULL;
+ g_lock = NULL;
+ g_start_dir = NULL;
+ g_xml_mtime = 0;
+ g_xml_path = NULL;
+ g_xml_thread = NULL;
+
+ * g_fuse_version = 0;
+ if ( g_heart_beat_url != NULL ) {
+ FREE(g_heart_beat_url);
+ }
+ g_heart_beat_url = NULL;
+ * g_heart_beat_url_complete = 0;
+ g_heart_beat_url_complete_p = NULL;
+}
+
+rc_t XML_MgrGet(const KXMLMgr** xmlmgr)
+{
+ if( xmlmgr == NULL ) {
+ return RC(rcExe, rcDoc, rcAccessing, rcParam, rcNull);
+ }
+ if( g_xmlmgr == NULL ) {
+ return RC(rcExe, rcPath, rcAccessing, rcMgr, rcNull);
+ }
+ *xmlmgr = g_xmlmgr;
+ return 0;
+}
+
+rc_t XML_ParseTimestamp(const KXMLNode* xml_node, const char* attr, KTime_t* timestamp, bool optional)
+{
+ rc_t rc;
+ char ts[128];
+ size_t sz;
+
+ if( (rc = KXMLNodeReadAttrCString(xml_node, attr, ts, sizeof(ts), &sz)) == 0 ) {
+ struct tm tm;
+ memset(&tm, 0, sizeof(tm));
+ if( strptime(ts, "%Y-%m-%dT%H:%M:%S", &tm) != NULL ) {
+ *timestamp = mktime(&tm);
+ } else {
+ rc = RC(rcExe, rcDoc, rcReading, rcAttr, rcInvalid);
+ }
+ } else if( optional && GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
+
+rc_t XML_WriteTimestamp(char* dst, size_t bsize, size_t *num_writ, KTime_t ts)
+{
+ struct tm* tm = localtime(&ts);
+
+ *num_writ = strftime(dst, bsize, "%a %Y-%m-%d %H:%M:%S %Z", tm);
+ if( *num_writ < 1 || *num_writ >= bsize ) {
+ return RC(rcExe, rcDoc, rcWriting, rcBuffer, rcInsufficient);
+ }
+ return 0;
+}
+
+rc_t XML_ParseBool(const KXMLNode* xml_node, const char* attr, bool* val, bool optional)
+{
+ rc_t rc;
+ char b[16];
+ size_t sz;
+
+ if( (rc = KXMLNodeReadAttrCString(xml_node, attr, b, sizeof(b), &sz)) == 0 ) {
+ if( strcasecmp(b, "true") == 0 || strcasecmp(b, "on") == 0 || strcasecmp(b, "yes") == 0 ) {
+ *val = true;
+ } else if( strcasecmp(b, "false") == 0 || strcasecmp(b, "off") == 0 || strcasecmp(b, "no") == 0 ) {
+ *val = false;
+ } else {
+ rc = RC(rcExe, rcDoc, rcReading, rcAttr, rcInvalid);
+ }
+ } else if( optional && GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
diff --git a/tools/fuse/remote-xml.h b/tools/fuse/remote-xml.h
new file mode 100644
index 0000000..5434b9c
--- /dev/null
+++ b/tools/fuse/remote-xml.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_xml_
+#define _h_sra_fuse_xml_
+
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+
+#include "node.h"
+
+typedef uint32_t EXMLValidate;
+enum {
+ eXML_NoCheck = 0,
+ eXML_NoFail,
+ eXML_Full
+};
+
+rc_t XML_Make(KDirectory* dir, const char* const work_dir, const char* xml_path, const char *heart_beat_url, unsigned int sync);
+
+void XML_Init(void);
+
+rc_t XML_FindLock(const char* path, bool recur, const FSNode** node, const char** subpath);
+
+void XML_FindRelease(void);
+
+rc_t XML_MgrGet(const KXMLMgr** xmlmgr);
+
+rc_t XML_ParseTimestamp(const KXMLNode* xml_node, const char* attr, KTime_t* tm, bool optional);
+
+rc_t XML_WriteTimestamp(char* dst, size_t bsize, size_t *num_writ, KTime_t ts);
+
+rc_t XML_ParseBool(const KXMLNode* xml_node, const char* attr, bool* val, bool optional);
+
+void XML_Fini(void);
+
+#endif /* _h_sra_fuse_xml_ */
diff --git a/tools/fuse/sra-directory.c b/tools/fuse/sra-directory.c
new file mode 100644
index 0000000..2d7e53b
--- /dev/null
+++ b/tools/fuse/sra-directory.c
@@ -0,0 +1,107 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sra/sradb-priv.h>
+
+typedef struct SRADirectoryNode SRADirectoryNode;
+#define FSNODE_IMPL SRADirectoryNode
+
+#include "log.h"
+#include "xml.h"
+#include "sra-list.h"
+#include "sra-directory.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+
+struct SRADirectoryNode {
+ FSNode node;
+ const SRAListNode* sra;
+};
+
+static
+rc_t SRADirectoryNode_Attr(const SRADirectoryNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ *type = kptDir;
+ rc = SRAListNode_TableMTime(cself->sra, ts);
+ }
+ return rc;
+}
+
+static
+rc_t SRADirectoryNode_Dir(const SRADirectoryNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ if( subpath != NULL ) {
+ return RC(rcExe, rcSRA, rcEvaluating, rcDirEntry, rcInvalid);
+ }
+ return FSNode_ListChildren(&cself->node, func, data);
+}
+
+static
+rc_t SRADirectoryNode_Release(SRADirectoryNode* self)
+{
+ if( self != NULL ) {
+ SRAListNode_Release(self->sra);
+ }
+ return 0;
+}
+
+static FSNode_vtbl SRADirectoryNode_vtbl = {
+ sizeof(SRADirectoryNode),
+ NULL,
+ NULL,
+ SRADirectoryNode_Attr,
+ SRADirectoryNode_Dir,
+ NULL,
+ NULL,
+ SRADirectoryNode_Release
+};
+
+rc_t SRADirectoryNode_Make(FSNode** self, const char* name, const SRAListNode* sra)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || sra == NULL ) {
+ rc = RC(rcExe, rcDirectory, rcConstructing, rcParam, rcNull);
+ } else {
+ if( (rc = FSNode_Make(self, name, &SRADirectoryNode_vtbl)) == 0 ) {
+ SRAListNode_AddRef(sra);
+ ((SRADirectoryNode*)*self)->sra = sra;
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/sra-directory.h b/tools/fuse/sra-directory.h
new file mode 100644
index 0000000..7a4b7f7
--- /dev/null
+++ b/tools/fuse/sra-directory.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_sra_directory_
+#define _h_sra_fuse_sra_directory_
+
+#include "node.h"
+
+rc_t SRADirectoryNode_Make(FSNode** self, const char* name, const SRAListNode* sra);
+
+#endif /* _h_sra_fuse_sra_directory_ */
diff --git a/tools/fuse/sra-fastq.c b/tools/fuse/sra-fastq.c
new file mode 100644
index 0000000..ea83ef8
--- /dev/null
+++ b/tools/fuse/sra-fastq.c
@@ -0,0 +1,245 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kproc/lock.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+
+#include <sra/sradb-priv.h>
+#include <sra/fastq.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "log.h"
+#include "xml.h"
+#include "sra-list.h"
+#include "sra-fastq.h"
+#include "zlib-simple.h"
+
+typedef struct SRAFastqFile SRAFastqFile;
+#define KFILE_IMPL SRAFastqFile
+#include <kfs/impl.h>
+
+struct SRAFastqFile {
+ KFile dad;
+ uint32_t buffer_sz;
+ uint64_t file_sz;
+ char* gzipped; /* serves as flag and a buffer */
+ KLock* lock;
+ const SRATable* stbl;
+ const KTable* ktbl;
+ const KIndex* kidx;
+ const FastqReader* reader;
+ /* current buf content */
+ uint64_t from;
+ uint64_t size;
+ char* buf;
+};
+
+static
+rc_t SRAFastqFile_Destroy(SRAFastqFile *self)
+{
+ if( KLockAcquire(self->lock) == 0 ) {
+ ReleaseComplain(FastqReaderWhack, self->reader);
+ ReleaseComplain(KIndexRelease, self->kidx);
+ ReleaseComplain(KTableRelease, self->ktbl);
+ ReleaseComplain(SRATableRelease, self->stbl);
+ FREE(self->buf < self->gzipped ? self->buf : self->gzipped);
+ ReleaseComplain(KLockUnlock, self->lock);
+ ReleaseComplain(KLockRelease, self->lock);
+ FREE(self);
+ }
+ return 0;
+}
+
+static
+struct KSysFile* SRAFastqFile_GetSysFile(const SRAFastqFile *self, uint64_t *offset)
+{
+ *offset = 0;
+ return NULL;
+}
+
+static
+rc_t SRAFastqFile_RandomAccess(const SRAFastqFile *self)
+{
+ return 0;
+}
+
+static
+uint32_t SRAFastqFile_Type(const SRAFastqFile *self)
+{
+ return kfdFile;
+}
+
+static
+rc_t SRAFastqFile_Size(const SRAFastqFile *self, uint64_t *size)
+{
+ *size = self->file_sz;
+ return 0;
+}
+
+static
+rc_t SRAFastqFile_SetSize(SRAFastqFile *self, uint64_t size)
+{
+ return RC(rcExe, rcFile, rcUpdating, rcInterface, rcUnsupported);
+}
+
+static
+rc_t SRAFastqFile_Read(const SRAFastqFile* self, uint64_t pos, void *buffer, size_t size, size_t *num_read)
+{
+ rc_t rc = 0;
+
+ if( pos >= self->file_sz ) {
+ *num_read = 0;
+ } else if( (rc = KLockAcquire(self->lock)) == 0 ) {
+ do {
+ if( pos < self->from || pos >= (self->from + self->size) ) {
+ int64_t id = 0;
+ uint64_t id_qty = 0;
+ DEBUG_MSG(10, ("Caching for pos %lu %lu bytes\n", pos, size - *num_read));
+ if( (rc = KIndexFindU64(self->kidx, pos, &((SRAFastqFile*)self)->from, &((SRAFastqFile*)self)->size, &id, &id_qty)) == 0 ) {
+ DEBUG_MSG(10, ("Caching from %lu:%lu, %lu bytes\n", self->from, self->from + self->size - 1, self->size));
+ DEBUG_MSG(10, ("Caching spot %ld, %lu spots\n", id, id_qty));
+ if( (rc = FastqReaderSeekSpot(self->reader, id)) == 0 ) {
+ size_t inbuf = 0, w = 0;
+ char* b = self->buf;
+ uint64_t left = self->buffer_sz;
+ do {
+ if( (rc = FastqReader_GetCurrentSpotSplitData(self->reader, b, left, &w)) != 0 ) {
+ break;
+ }
+ b += w; left -= w; inbuf += w; --id_qty;
+ } while( id_qty > 0 && (rc = FastqReaderNextSpot(self->reader)) == 0);
+ if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted ) {
+ DEBUG_MSG(10, ("No more rows\n"));
+ rc = 0;
+ }
+ DEBUG_MSG(8, ("Cached %u bytes\n", inbuf));
+ if( self->gzipped != NULL ) {
+ size_t compressed = 0;
+ if( (rc = ZLib_DeflateBlock(self->buf, inbuf, self->gzipped, self->buffer_sz, &compressed)) == 0 ) {
+ char* b = self->buf;
+ ((SRAFastqFile*)self)->buf = self->gzipped;
+ ((SRAFastqFile*)self)->gzipped = b;
+ ((SRAFastqFile*)self)->size = compressed;
+ DEBUG_MSG(10, ("gzipped %lu bytes\n", self->size));
+ }
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ off_t from = pos - self->from;
+ size_t q = (self->size - from) > (size - *num_read) ? (size - *num_read) : (self->size - from);
+ DEBUG_MSG(10, ("Copying from %lu %u bytes\n", from, q));
+ memmove(&((char*)buffer)[*num_read], &self->buf[from], q);
+ *num_read = *num_read + q;
+ pos += q;
+ }
+ } while( rc == 0 && *num_read < size && pos < self->file_sz );
+ ReleaseComplain(KLockUnlock, self->lock);
+ }
+ return rc;
+}
+
+static
+rc_t SRAFastqFile_Write(SRAFastqFile *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ)
+{
+ return RC(rcExe, rcFile, rcWriting, rcInterface, rcUnsupported);
+}
+
+static KFile_vt_v1 SRAFastqFile_vtbl = {
+ 1, 1,
+ SRAFastqFile_Destroy,
+ SRAFastqFile_GetSysFile,
+ SRAFastqFile_RandomAccess,
+ SRAFastqFile_Size,
+ SRAFastqFile_SetSize,
+ SRAFastqFile_Read,
+ SRAFastqFile_Write,
+ SRAFastqFile_Type
+};
+
+rc_t SRAFastqFile_Open(const KFile** cself, const SRAListNode* sra, const FileOptions* opt)
+{
+ rc_t rc = 0;
+ SRAFastqFile* self;
+ CALLOC( self, 1, sizeof( *self ) );
+ if( self == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcConstructing, rcMemory, rcExhausted );
+ }
+ else
+ {
+ if ( ( rc = KFileInit( &self->dad, (const KFile_vt*)&SRAFastqFile_vtbl, "SRAFastqFile", "no-name", true, false ) ) == 0 )
+ {
+ if ( ( rc = SRAListNode_TableOpen( sra, &self->stbl ) ) == 0 )
+ {
+ if ( ( rc = SRATableGetKTableRead( self->stbl, &self->ktbl ) ) == 0 )
+ {
+ if ( ( rc = KTableOpenIndexRead( self->ktbl, &self->kidx, opt->index ) ) == 0 )
+ {
+ if ( ( rc = KLockMake( &self->lock ) ) == 0 )
+ {
+ MALLOC( self->buf, opt->buffer_sz * ( opt->f.fastq.gzip ? 2 : 1 ) );
+ if ( self->buf == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcOpening, rcMemory, rcExhausted );
+ }
+ else
+ {
+ self->file_sz = opt->file_sz;
+ self->buffer_sz = opt->buffer_sz;
+ if ( opt->f.fastq.gzip )
+ {
+ self->gzipped = &self->buf[ opt->buffer_sz ];
+ }
+ self->from = ~0; /* reset position beyond file end */
+ rc = FastqReaderMake( &self->reader, self->stbl,
+ opt->f.fastq.accession, opt->f.fastq.colorSpace,
+ opt->f.fastq.origFormat, false, opt->f.fastq.printLabel,
+ opt->f.fastq.printReadId, !opt->f.fastq.clipQuality, false,
+ opt->f.fastq.minReadLen, opt->f.fastq.qualityOffset,
+ opt->f.fastq.colorSpaceKey,
+ opt->f.fastq.minSpotId, opt->f.fastq.maxSpotId );
+ }
+ }
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ *cself = &self->dad;
+ }
+ else
+ {
+ KFileRelease( &self->dad );
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/sra-fastq.h b/tools/fuse/sra-fastq.h
new file mode 100644
index 0000000..d851575
--- /dev/null
+++ b/tools/fuse/sra-fastq.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_fuse_sra_fastq_
+#define _h_sra_fuse_sra_fastq_
+
+#include "node.h"
+
+rc_t SRAFastqFile_Open(const KFile** cself, const SRAListNode* sra, const FileOptions* opt);
+
+#endif /* _h_sra_fuse_sra_fastq_ */
diff --git a/tools/fuse/sra-fuser-test.c b/tools/fuse/sra-fuser-test.c
new file mode 100644
index 0000000..ef4cc79
--- /dev/null
+++ b/tools/fuse/sra-fuser-test.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#define MAX_THREADS 20
+#define CHUNK_SZ 4200
+
+int fin = 0;
+int fout = 0;
+off_t file_sz;
+off_t step;
+
+typedef struct thread_data_struct {
+ int id;
+} thread_data;
+
+void* thread_func(void *v)
+{
+ char buf[CHUNK_SZ];
+ thread_data* data = v;
+ off_t pos = (data->id - 1) * CHUNK_SZ;
+
+ printf("Thread %i started\n", data->id);
+
+ while( pos < file_sz ) {
+ ssize_t i = pread(fin, buf, CHUNK_SZ, pos);
+ if( i < 0 ) {
+ printf("Thread %i %lu:%lu: %s\n", data->id, pos, pos + CHUNK_SZ - 1, strerror(errno));
+ break;
+ }
+ pwrite(fout, buf, i, pos);
+ pos += step;
+ }
+ printf("Thread %i finished\n", data->id);
+ return v;
+}
+
+
+int main (int argc, char* argv[])
+{
+ pthread_t threads[MAX_THREADS];
+ thread_data threads_data[MAX_THREADS];
+ int i, threads_qty = 0;
+ struct stat stat;
+
+ if( argc < 4 ) {
+ printf("\nUsage:\n\ttest num_threads input_file output_file\n\n");
+ return 1;
+ }
+ threads_qty = atoi(argv[1]);
+ if( threads_qty < 2 || threads_qty > MAX_THREADS ) {
+ printf("num_threads out of range: [2:%i]\n", MAX_THREADS);
+ return 2;
+ }
+ if( (fin = open(argv[2], O_RDONLY, 0)) < 0) {
+ printf("Cannot read file '%s': %s\n", argv[2], strerror(errno));
+ return 3;
+ }
+ if( fstat(fin, &stat) != 0 ) {
+ printf("Cannot stat '%s': %s\n", argv[2], strerror(errno));
+ return 3;
+ }
+ printf("File size: %lu bytes\n", stat.st_size);
+
+ if( stat.st_size / threads_qty / CHUNK_SZ < 10 ) {
+ printf("Need bigger file or less threads to test \n");
+ return 5;
+ }
+ if( (fout = creat(argv[3], 0)) < 0 ) {
+ printf("Cannot write file '%s': %s\n", argv[3], strerror(errno));
+ return 4;
+ }
+ file_sz = stat.st_size;
+ step = threads_qty * CHUNK_SZ;
+
+ for(i = 0; i < threads_qty; i++) {
+ threads_data[i].id = i + 1;
+ if( pthread_create(&threads[i], NULL, thread_func, &threads_data[i]) != 0 ) {
+ printf("Cannot pthread_create %i: %s\n", i + 1, strerror(errno));
+ return 14;
+ }
+ }
+
+ for(i = 0; i < threads_qty; i++) {
+ thread_data* data;
+ if( pthread_join(threads[i], (void**)&data) != 0 ) {
+ printf("Cannot pthread_join %i: %s\n", i + 1, strerror(errno));
+ }
+ }
+
+ close(fin);
+ close(fout);
+ return 0;
+}
diff --git a/tools/fuse/sra-fuser.c b/tools/fuse/sra-fuser.c
new file mode 100644
index 0000000..fca5d0e
--- /dev/null
+++ b/tools/fuse/sra-fuser.c
@@ -0,0 +1,195 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/args.h>
+#include <klib/out.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "xml.h"
+#include "sra-fuser.h"
+#include "log.h"
+#include "node.h"
+#include "accessor.h"
+#include "sra-list.h"
+
+typedef struct SRequest_struct {
+ const FSNode* node;
+ const char* subpath;
+} SRequest;
+
+static char* g_work_dir = NULL;
+
+static
+rc_t SRequestMake(SRequest* request, const char* path, bool recur)
+{
+ rc_t rc = 0;
+
+ if( request == NULL ) {
+ rc = RC(rcExe, rcFileDesc, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = XML_FindLock(path, recur, &request->node, &request->subpath);
+ }
+ return rc;
+}
+
+static
+void SRequestRelease(SRequest* request)
+{
+ if( request != NULL ) {
+ XML_FindRelease();
+ }
+}
+
+rc_t Initialize(unsigned int sra_sync, const char* xml_path, unsigned int xml_sync,
+ const char* SRA_cache_path, const char* xml_root, EXMLValidate xml_validate)
+{
+ rc_t rc = 0;
+ KDirectory* dir = NULL;
+
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ char buf[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, buf, 4096, xml_root)) == 0 ) {
+ /* replace /. at the end to just / */
+ if( strcmp(&buf[strlen(buf) - 2], "/.") == 0 ) {
+ buf[strlen(buf) - 1] = '\0';
+ }
+ /* add / to the end if missing */
+ if( buf[strlen(buf) - 1] != '/' ) {
+ buf[strlen(buf) + 1] = '\0';
+ buf[strlen(buf)] = '/';
+ }
+ if( (rc = StrDup(buf, &g_work_dir)) == 0 ) {
+ DEBUG_MSG(8, ("Current directory set to '%s'\n", g_work_dir));
+ }
+ }
+ if( rc == 0 && (rc = SRAList_Make(dir, sra_sync, SRA_cache_path)) != 0 ) {
+ LOGERR(klogErr, rc, "SRA");
+ } else {
+ rc = XML_Make(dir, g_work_dir, xml_path, xml_sync, xml_validate);
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ return rc;
+}
+
+/* =============================================================================== */
+/* system call handlers */
+/* =============================================================================== */
+
+const char UsageDefaultName[] = "sra-fuser";
+
+rc_t CC UsageSummary (const char* progname)
+{
+ return KOutMsg("Usage:\n"
+ "\t%s [options] -o [FUSE options] -x file -m path\n"
+ "\t%s [options] -u -m path\n\n", progname, progname);
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ /* dummy for newer args system will be filled when system is complete!!! */
+ return 0;
+}
+
+void SRA_FUSER_Init(void)
+{
+ rc_t rc = 0;
+ /* reopen log file and start watch thread(s) */
+ if( (rc = LogFile_Init(NULL, 0, true, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "log file");
+ }
+ SRAList_Init(); /* this preceeeds XML_Init */
+ XML_Init(); /* or SRAList may become corrupt */
+ LOGMSG(klogInfo, "Started");
+}
+
+void SRA_FUSER_Fini(void)
+{
+ SRAList_Fini();
+ XML_Fini();
+ LOGMSG(klogInfo, "Stopped");
+ LogFile_Fini();
+ FREE(g_work_dir);
+}
+
+rc_t SRA_FUSER_GetDir(const char* path, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, true)) == 0 ) {
+ rc = FSNode_Dir(request.node, request.subpath, func, data);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_GetAttr(const char* path, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Attr(request.node, request.subpath, type, ts, file_sz, access, block_sz);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_ResolveLink(const char* path, char* buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Link(request.node, request.subpath, buf, buf_sz);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_OpenNode(const char* path, const void** data)
+{
+ rc_t rc = 0;
+ SRequest request;
+
+ if( (rc = SRequestMake(&request, path, false)) == 0 ) {
+ rc = FSNode_Open(request.node, request.subpath, (const SAccessor**)data);
+ SRequestRelease(&request);
+ }
+ return rc;
+}
+
+rc_t SRA_FUSER_ReadNode(const char* path, const void* data, char *buf, size_t size, off_t offset, size_t* num_read)
+{
+ return SAccessor_Read(data, buf, size, offset, num_read);
+}
+
+rc_t SRA_FUSER_CloseNode(const char* path, const void* data)
+{
+ return SAccessor_Release(data);
+}
diff --git a/tools/fuse/sra-fuser.h b/tools/fuse/sra-fuser.h
new file mode 100644
index 0000000..7999745
--- /dev/null
+++ b/tools/fuse/sra-fuser.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_fuser_
+#define _h_sra_fuse_fuser_
+
+#include "node.h"
+
+uint32_t KAppVersion(void);
+
+rc_t Initialize(unsigned int sra_sync, const char* xml_path, unsigned int xml_sync,
+ const char* SRA_cache_path, const char* xml_root, EXMLValidate xml_validate);
+
+/* FUSE call backs */
+void SRA_FUSER_Init(void);
+void SRA_FUSER_Fini(void);
+
+rc_t SRA_FUSER_GetAttr(const char* path, uint32_t* type, KTime_t* date, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz);
+rc_t SRA_FUSER_GetDir(const char* path, FSNode_Dir_Visit func, void* data);
+rc_t SRA_FUSER_ResolveLink(const char* path, char* buf, size_t buf_sz);
+
+rc_t SRA_FUSER_OpenNode(const char* path, const void** data);
+rc_t SRA_FUSER_ReadNode(const char* path, const void* data, char *buf, size_t size, off_t offset, size_t* num_read);
+rc_t SRA_FUSER_CloseNode(const char* path, const void* data);
+
+#endif /* _h_sra_fuse_fuser_ */
diff --git a/tools/fuse/sra-fuser.xsd b/tools/fuse/sra-fuser.xsd
new file mode 100644
index 0000000..1935e51
--- /dev/null
+++ b/tools/fuse/sra-fuser.xsd
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="TAR">
+ <xs:annotation>
+ <xs:documentation>This could be used to create an automatic tar archive within directory specified by a physical Directory node in main fuse.xml file.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+
+ <xs:element name="FUSE">
+ <xs:annotation>
+ <xs:documentation>Main sra-fuser virtual directory structure root.</xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="AllEntries">
+ <xs:sequence>
+ <xs:element name="TAR" type="TARType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="AllEntries">
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="Directory" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="DirectoryType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="File" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="FileType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SRA" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="SRAType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SRAConfig" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="SRAConfigType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="DirectoryType">
+ <xs:annotation>
+ <xs:documentation>If Directory has path attribute it will detect presence of *.tar.xml files
+ with root node TAR (see above) and automatically create .tar file out of detect file's content.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension base="AllEntries">
+ <xs:sequence>
+ <xs:element name="TAR" type="TARType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute ref="name" use="optional" >
+ <xs:annotation>
+ <xs:documentation>Must have name OR path, or both</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="path" type="xs:anyURI" use="optional">
+ <xs:annotation>
+ <xs:documentation>absolute or relative path to a physical directory</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute ref="timestamp" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="FileType">
+ <xs:attribute ref="name" use="optional" >
+ <xs:annotation>
+ <xs:documentation>May be used to override original file name in path</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="path" type="xs:anyURI" use="required">
+ <xs:annotation>
+ <xs:documentation>absolute or relative path to a file</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute ref="timestamp" use="optional" />
+ <xs:attribute name="password" type="xs:string" use="optional" />
+ </xs:complexType>
+
+ <xs:complexType name="SRAType">
+ <xs:attribute name="accession" use="required" type="xs:NCName" >
+ <xs:annotation>
+ <xs:documentation>SRA accession used to open the run</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="path" type="xs:anyURI" use="optional">
+ <xs:annotation>
+ <xs:documentation>path is used for direct opening of the tables, for automatic search do not specify</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <!-- next 5 attributes must always come together if present -->
+ <xs:attribute ref="timestamp" use="optional">
+ <xs:annotation>
+ <xs:documentation>time stamp of the size/md5 attribute values</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="size.sra" type ="xs:nonNegativeInteger" use="optional">
+ <xs:annotation>
+ <xs:documentation>file size in bytes</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="md5.sra" type ="xs:hexBinary" use="optional">
+ <xs:annotation>
+ <xs:documentation>MD5 sum of the file</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="size.lite.sra" type ="xs:nonNegativeInteger" use="optional">
+ <xs:annotation>
+ <xs:documentation>file size in bytes</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="md5.lite.sra" type ="xs:hexBinary" use="optional">
+ <xs:annotation>
+ <xs:documentation>MD5 sum of the file</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="SRAConfigType">
+ <xs:complexContent>
+ <xs:extension base="AllEntries">
+ <xs:annotation>
+ <xs:documentation>Initially all attributes are TRUE, as first config node is encountered only attributes set to TRUE in THAT node are active all others become FALSE</xs:documentation>
+ </xs:annotation>
+ <xs:attribute name="run-directory" type="xs:boolean" use="optional" default="false" >
+ <xs:annotation>
+ <xs:documentation>Create run directory for the SRA node</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="SRA-archive" type="xs:boolean" use="optional" default="false" />
+ <xs:attribute name="SRA-archive-lite" type="xs:boolean" use="optional" default="false" />
+ <xs:attribute name="fastq" type="xs:boolean" use="optional" default="false" />
+ <xs:attribute name="SFF" type="xs:boolean" use="optional" default="false" />
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="TARType">
+ <xs:complexContent>
+ <xs:extension base="TARItemList">
+ <xs:attribute ref="name" use="required">
+ <xs:annotation>
+ <xs:documentation>Ignored in dynamically loaded .tar.xml files, .tar.xml file name is used, ex: data5.tar.xml -> data5.tar</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="TARItem">
+ <xs:attribute name="name" type="xs:anyURI" use="optional" >
+ <xs:annotation>
+ <xs:documentation>Cannot start with '/'. If omitted, portion of path after last '/' is used</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="path" type="xs:anyURI" use="required">
+ <xs:annotation>
+ <xs:documentation>Absolute or relative path to a file. In case of automatic tar relative
+ paths will be resolved to from directory where .tar.xml is located.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute ref="timestamp" use="optional"/>
+ <xs:attribute name="size" use="required" type="xs:nonNegativeInteger">
+ <xs:annotation>
+ <xs:documentation>Actual file size is required to pre-calc resulting file .tar size</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="executable" type="xs:boolean" use="optional" default="false">
+ <xs:annotation>
+ <xs:documentation>Indicate if files has executable type</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="TARItemList">
+ <xs:sequence>
+ <xs:element name="Item" type="TARItem" minOccurs="1" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:attribute name="name" type="xs:NCName"/>
+
+ <xs:attribute name="timestamp" type="xs:dateTime">
+ <xs:annotation>
+ <xs:documentation>Sets timestamp on a node formatted: YYYY-MM-DDTHH:MM:SS</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+</xs:schema>
diff --git a/tools/fuse/sra-list.c b/tools/fuse/sra-list.c
new file mode 100644
index 0000000..48bfeb8
--- /dev/null
+++ b/tools/fuse/sra-list.c
@@ -0,0 +1,1225 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/container.h>
+#include <klib/printf.h>
+#include <klib/refcount.h>
+#include <kxml/xml.h>
+#include <kdb/namelist.h>
+#include <kproc/thread.h>
+#include <kproc/lock.h>
+#include <kproc/cond.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <errno.h>
+#include <pthread.h>
+#include <time.h>
+
+#include <sra/sradb-priv.h>
+#include <sra/impl.h>
+
+#include "log.h"
+#include "xml.h"
+#include "sra-list.h"
+#include "sra-directory.h"
+#include "sra-node.h"
+#include "formats.h"
+
+#include <stdlib.h>
+#include <strtol.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+static KRWLock* g_lock = NULL;
+static BSTree g_list;
+static uint64_t g_version = 0;
+static const SRAMgr* g_sra_mgr = NULL;
+/* hack to prevent opentable collapse */
+static KLock* g_sra_mgr_lock = NULL;
+/* SRA tables states cache file for quick restart */
+static char* g_cache_file = NULL;
+/* tmp name for cache file */
+static char* g_cache_file_tmp = NULL;
+static const uint32_t g_cache_version = 4;
+
+static unsigned int g_sync = 0;
+static KThread* g_thread = NULL;
+/*async update queue and thread */
+static SLList g_queue;
+static volatile uint64_t g_queue_depth;
+static KCondition* g_queue_cond;
+static KThread* g_queue_thread = NULL;
+static KLock* g_queue_lock = NULL;
+static pthread_mutex_t g_refresh_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t g_refresh_cond = PTHREAD_COND_INITIALIZER;
+
+struct SRAListNode {
+ BSTNode dad;
+ atomic32_t refcount;
+ char* accession;
+ char* path;
+ FileOptions* files;
+ uint32_t files_count;
+ KTime_t mtime; /* table mtime */
+ KTime_t utime; /* node update time */
+ uint32_t version; /* source xml version */
+};
+
+typedef struct SRAQueueNode_struct {
+ SLNode dad;
+ SRAListNode* node;
+ KTime_t mtime; /* original node update time */
+} SRAQueueNode;
+
+void CC SRAQueue_Whack( SLNode *n, void *data )
+{
+ if( n != NULL ) {
+ FREE(n);
+ }
+}
+
+static
+rc_t SRAList_Queue_Lock(void)
+{
+ DEBUG_LINE(8, "Lock SRA %s", "queue");
+ return KLockAcquire(g_queue_lock);
+}
+
+static
+void SRAList_Queue_Unlock(void)
+{
+ DEBUG_LINE(8, "Unlock SRA %s", "queue");
+ ReleaseComplain(KLockUnlock, g_queue_lock);
+}
+
+static
+rc_t SRAList_Lock(bool exclusive)
+{
+ DEBUG_LINE(8, "Lock SRA list %s", exclusive ? "write" : "read");
+ return exclusive ? KRWLockAcquireExcl(g_lock) : KRWLockAcquireShared(g_lock);
+}
+
+static
+void SRAList_Unlock(void)
+{
+ DEBUG_LINE(8, "Unlocked SRA list", "");
+ ReleaseComplain(KRWLockUnlock, g_lock);
+}
+
+static
+rc_t SRAList_Mgr(const SRAMgr** mgr)
+{
+ rc_t rc = 0;
+ if( g_sra_mgr_lock == NULL && (rc = KLockMake(&g_sra_mgr_lock)) != 0 ) {
+ g_sra_mgr_lock = NULL;
+ LOGERR(klogErr, rc, "SRA manager lock");
+ } else if( g_sra_mgr == NULL ) {
+ PLOGMSG(klogInfo, (klogInfo, "VDB_CONFIG=$(var)", PLOG_S(var), getenv("VDB_CONFIG")));
+ if( (rc = SRAMgrMakeRead(&g_sra_mgr)) != 0 ) {
+ g_sra_mgr = NULL;
+ LOGERR(klogErr, rc, "SRA manager");
+ } else {
+ DEBUG_LINE(8, "SRA manager created 0x%p", g_sra_mgr);
+ }
+ }
+ if( rc == 0 ) {
+ *mgr = g_sra_mgr;
+ }
+ return rc;
+}
+
+rc_t SRAListNode_TableMTime(const SRAListNode* cself, KTime_t* mtime)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || mtime == NULL ) {
+ rc = RC(rcExe, rcTable, rcResolving, rcParam, rcNull);
+ } else {
+ const SRAMgr* mgr;
+ DEBUG_LINE(10, "%s path '%s'", cself->accession, cself->path);
+ if( (rc = SRAList_Mgr(&mgr)) == 0 ) {
+ rc = SRAMgrGetTableModDate(mgr, mtime, "%s", cself->path ? cself->path : cself->accession);
+ }
+ }
+ return rc;
+}
+
+rc_t SRAListNode_TableOpen(const SRAListNode* cself, const SRATable** tbl)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || tbl == NULL ) {
+ rc = RC(rcExe, rcTable, rcOpening, rcParam, rcNull);
+ } else {
+ const SRAMgr* mgr;
+ DEBUG_LINE(10, "%s path '%s'", cself->accession, cself->path);
+ if( (rc = SRAList_Mgr(&mgr)) == 0 && (rc = KLockAcquire(g_sra_mgr_lock)) == 0 ) {
+ KLogLevel lvl = KLogLevelGet();
+ KLogLevelSet(klogInfo - 1);
+ rc = SRAMgrOpenTableRead(mgr, tbl, "%s", cself->path ? cself->path : cself->accession);
+ KLogLevelSet(lvl);
+ ReleaseComplain(KLockUnlock, g_sra_mgr_lock);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SRAListNode_KConfigReload(void)
+{
+ rc_t rc = 0;
+
+ if( BSTreeFirst(&g_list) != NULL ) {
+ const SRAMgr* mgr;
+ if( (rc = SRAList_Mgr(&mgr)) == 0 && (rc = KLockAcquire(g_sra_mgr_lock)) == 0 ) {
+ DEBUG_LINE(10, "VDB_CONFIG=%s", getenv("VDB_CONFIG"));
+ rc = SRAMgrConfigReload(mgr, NULL);
+ ReleaseComplain(KLockUnlock, g_sra_mgr_lock);
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "SRA config reload with VDB_CONFIG=$(var)", PLOG_S(var), getenv("VDB_CONFIG")));
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRAListNode_AddRef(const SRAListNode* cself)
+{
+ if( cself == NULL ) {
+ return RC(rcExe, rcTable, rcAttaching, rcSelf, rcNull);
+ }
+ atomic32_add(&((SRAListNode*)cself)->refcount, 1);
+ return 0;
+}
+
+void SRAListNode_Release(const SRAListNode* cself)
+{
+ SRAListNode* self = (SRAListNode*)cself;
+ if( self != NULL && atomic32_dec_and_test(&self->refcount) ) {
+ DEBUG_LINE(10, "%s: %s", self->accession, self->path);
+ FREE(self->accession);
+ FREE(self->path);
+ FREE(self->files);
+ FREE(self);
+ }
+}
+
+static
+void SRAList_Whack(BSTNode* node, void* data)
+{
+ SRAListNode_Release((SRAListNode*)node);
+}
+
+static
+void SRAListNode_Version(BSTNode* node, void* data)
+{
+ SRAListNode* n = (SRAListNode*)node;
+ uint32_t* qty = (uint32_t*)data;
+
+ if( n->version < g_version ) {
+ BSTreeUnlink(&g_list, node);
+ SRAListNode_Release(n);
+ *qty = *qty + 1;
+ }
+}
+
+rc_t SRAList_NextVersion(void)
+{
+ rc_t rc = 0;
+ uint32_t qty = 0;
+
+ DEBUG_LINE(8, "SRA setting version to %u", g_version + 1);
+ if( (rc = SRAList_Lock(true)) == 0 ) {
+ g_version++;
+ BSTreeForEach(&g_list, false, SRAListNode_Version, &qty);
+ SRAList_Unlock();
+ DEBUG_LINE(8, "SRA version set to %u, %u runs dropped", g_version, qty);
+ }
+ return rc;
+}
+
+typedef struct SRAListNode_FindData_struct {
+ char* accession;
+ char* path;
+ KTime_t timestamp;
+ struct {
+ int type;
+ const char* ext;
+ uint64_t size;
+ char md5[32 + 1];
+ } attr[2];
+} SRAListNode_FindData;
+
+static
+int64_t SRAListNode_Cmp(const SRAListNode_FindData* l, const SRAListNode* r)
+{
+ int d = strcmp(l->accession, r->accession);
+ if( d == 0 && l->path != r->path ) {
+ if( l->path == NULL && r->path != NULL ) {
+ d = -1024;
+ } else if( l->path != NULL && r->path == NULL ) {
+ d = 1024;
+ } else {
+ d = strcmp(l->path, r->path);
+ }
+ }
+ return d;
+}
+
+static
+int64_t SRAListNode_Find(const void* item, const BSTNode* node)
+{
+ return SRAListNode_Cmp((SRAListNode_FindData*)item, (SRAListNode*)node);
+}
+
+static
+int64_t SRAListNode_Sort(const BSTNode *item, const BSTNode *node)
+{
+ SRAListNode* i = (SRAListNode*)item;
+ SRAListNode_FindData data;
+
+ data.accession = i->accession;
+ data.path = i->path;
+
+ return SRAListNode_Cmp(&data, (SRAListNode*)node);
+}
+
+static
+rc_t SRAListNode_Insert(SRAListNode_FindData* data, uint64_t version, SRAListNode** found)
+{
+ rc_t rc = 0;
+
+ *found = NULL;
+ if( (rc = SRAList_Lock(true)) == 0 ) {
+ *found = (SRAListNode*)BSTreeFind(&g_list, data, SRAListNode_Find);
+ if( *found != NULL ) {
+ DEBUG_LINE(8, "found SRA list node %u. %s, %s", (*found)->version, data->accession, data->path);
+ atomic32_add(&(*found)->refcount, 1); /* for here */
+ if( version > (*found)->version ) {
+ (*found)->version = version;
+ }
+ } else {
+ CALLOC(*found, 1, sizeof(**found));
+ if( *found == NULL ) {
+ rc = RC(rcExe, rcTable, rcInserting, rcMemory, rcExhausted);
+ } else {
+ KRefcountInit(&((*found)->refcount), 1, "SRAListNode", "Make", "");
+ (*found)->accession = data->accession;
+ (*found)->path = data->path;
+ atomic32_set(&(*found)->refcount, 2); /* one for the list and 1 for here */
+ (*found)->version = version;
+ DEBUG_LINE(8, "SRA list new node %u. %s, %s", (*found)->version, (*found)->accession, (*found)->path);
+ BSTreeInsert(&g_list, &(*found)->dad, SRAListNode_Sort);
+ data->accession = NULL;
+ data->path = NULL;
+ }
+ }
+ if( rc == 0 && data->timestamp != 0 && (*found)->mtime != data->timestamp ) {
+ if( (*found)->files_count > 0 ) {
+ uint32_t i, j;
+ for(j = 0; rc == 0 && j < (*found)->files_count; j++) {
+ for(i = 0; rc == 0 && i < sizeof(data->attr) / sizeof(data->attr[0]); i++) {
+ if( (*found)->files[j].type == data->attr[i].type ) {
+ if( (rc = FileOptions_SRAArchiveUpdate(&(*found)->files[j], (*found)->accession,
+ data->timestamp, data->attr[i].size, data->attr[i].md5)) == 0 ) {
+ DEBUG_LINE(10, "updated %s %lu %s", (*found)->accession,
+ data->attr[i].size, data->attr[i].md5);
+ }
+ }
+ }
+ }
+ } else {
+ uint32_t i;
+ const SRAMgr* mgr;
+
+ (*found)->files_count = sizeof(data->attr) / sizeof(data->attr[0]) * 2;
+ if( (rc = FileOptions_Make(&(*found)->files, (*found)->files_count)) == 0 &&
+ (rc = SRAList_Mgr(&mgr)) == 0 ) {
+ for(i = 0; rc == 0 && i < sizeof(data->attr) / sizeof(data->attr[0]); i++) {
+ if( (rc = FileOptions_SRAArchiveInstant(&(*found)->files[i * 2], &(*found)->files[i * 2 + 1],
+ mgr, (*found)->accession, (*found)->path,
+ data->attr[i].type == eSRAFuseFmtArcLite, data->timestamp, data->attr[i].size, data->attr[i].md5)) == 0 ) {
+ DEBUG_LINE(10, "added %s %lu %s", (*found)->accession, data->attr[i].size, data->attr[i].md5);
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ (*found)->mtime = data->timestamp;
+ DEBUG_LINE(10, "set %s timestamp %lu", (*found)->accession, (*found)->mtime);
+ } else if( data->accession == NULL ) {
+ FREE(*found);
+ }
+ }
+ SRAList_Unlock();
+ }
+ return rc;
+}
+
+static
+rc_t SRAListNode_MakeXML(const KXMLNode* xml_node, SRAListNode_FindData* data, char* errmsg, const char* rel_path, EXMLValidate validate)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || data == NULL ) {
+ rc = RC(rcExe, rcTable, rcConstructing, rcParam, rcNull);
+ } else {
+ uint32_t i, has_attrs = 0;
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "accession", &data->accession, NULL)) != 0 || data->accession[0] == '\0') {
+ strcpy(errmsg, "attribute 'accession'");
+ rc = rc ? rc : RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ }
+ if( rc == 0 ) {
+ data->timestamp = 0;
+ if( (rc = XML_ParseTimestamp(xml_node, "timestamp", &data->timestamp, true)) != 0 ) {
+ strcpy(errmsg, "attribute 'timestamp'");
+ } else if( data->timestamp != 0 ) {
+ has_attrs++;
+ }
+ }
+ for(i = 0; rc == 0 && i < sizeof(data->attr) / sizeof(data->attr[0]); i++) {
+ size_t num_read;
+ char b[128];
+
+ if( (rc = string_printf(b, sizeof(b) - 1, NULL, "md5%s", data->attr[i].ext)) == 0 ) {
+ if( (rc = KXMLNodeReadAttrCString(xml_node, b, data->attr[i].md5, sizeof(data->attr[i].md5), &num_read)) == 0 ) {
+ has_attrs++;
+ if( num_read != sizeof(data->attr[i].md5) - 1) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcChecksum, rcInvalid);
+ }
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "attribute 'md5");
+ strcat(errmsg, data->attr[i].ext);
+ strcat(errmsg, "'");
+ } else {
+ if( (rc = string_printf(b, sizeof(b) - 1, NULL, "size%s", data->attr[i].ext)) == 0 ) {
+ if( (rc = KXMLNodeReadAttrCString(xml_node, b, b, sizeof(b), &num_read)) == 0 ) {
+ char* end;
+ has_attrs++;
+ data->attr[i].size = strtou64(b, &end, 10);
+ if( end - b != num_read ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcSize, rcInvalid);
+ }
+ } else if( GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "attribute 'size");
+ strcat(errmsg, data->attr[i].ext);
+ strcat(errmsg, "'");
+ }
+ }
+ }
+ if( rc == 0 && has_attrs != 0 && has_attrs != 3 && has_attrs != 5 ) {
+ if( validate > eXML_NoFail ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ } else {
+ data->timestamp = 0;
+ PLOGMSG(klogErr, (klogErr, "SRA node $(a) attributes incomplete", "a=%s", data->accession));
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = KXMLNodeReadAttrCStr(xml_node, "path", &data->path, "")) == 0 ) {
+ if( data->path[0] == '\0' ) {
+ free(data->path);
+ data->path = NULL;
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ char resolved[4096];
+ size_t num_writ;
+ if( data->path[0] == '/' ) {
+ rc = string_printf(resolved, sizeof(resolved), &num_writ, "%s", data->path);
+ } else if( (rc = KDirectoryResolvePath(dir, true, resolved, sizeof(resolved),
+ "%s%s", rel_path, data->path)) == 0 ) {
+ DEBUG_LINE(8, "%s%s resolved to %s", rel_path, data->path, resolved);
+ }
+ if( rc == 0 && validate > eXML_NoCheck ) {
+ uint32_t typ = KDirectoryPathType(dir, resolved);
+ if( typ != kptDir && typ != (kptDir | kptAlias) &&
+ typ != kptFile && typ != (kptFile | kptAlias)) {
+ if( validate > eXML_NoFail ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, typ == kptNotFound ? rcNotFound : rcInvalid);
+ } else {
+ PLOGMSG(klogErr, (klogErr, "SRA path '$(p)' not found", "p=%s", resolved));
+ }
+ }
+ }
+ if( rc == 0 ) {
+ free(data->path);
+ rc = StrDup(resolved, &data->path);
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ struct KNamelist const* attr = NULL;
+ if( (rc = KXMLNodeListAttr(xml_node, &attr)) == 0 ) {
+ uint32_t i = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && i < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, i++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0 || strcmp("accession", attr_nm) == 0 ||
+ strcmp("timestamp", attr_nm) == 0 ||
+ strncmp("md5.", attr_nm, 4) == 0 || strncmp("size.", attr_nm, 5) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute '");
+ strcat(errmsg, attr_nm);
+ strcat(errmsg, "'");
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRAListNode_Make(const KXMLNode* xml_node, FSNode* parent, SRAConfigFlags flags, char* errmsg,
+ const char* rel_path, EXMLValidate validate)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || parent == NULL || errmsg == NULL || rel_path == NULL ) {
+ rc = RC(rcExe, rcTable, rcUpdating, rcParam, rcNull);
+ } else {
+ SRAListNode_FindData data;
+ memset(&data, 0, sizeof(data));
+ data.attr[0].ext = ".sra";
+ data.attr[0].type = eSRAFuseFmtArc;
+ data.attr[1].ext = ".lite.sra";
+ data.attr[1].type = eSRAFuseFmtArcLite;
+ if( (rc = SRAListNode_MakeXML(xml_node, &data, errmsg, rel_path, validate)) == 0 ) {
+ SRAListNode* found;
+ if( (rc = SRAListNode_Insert(&data, g_version + 1, &found)) == 0 ) {
+ FSNode* d = parent;
+ if( flags & eSRAFuseRunDir ) {
+ if( (rc = SRADirectoryNode_Make(&d, found->accession, found)) == 0 ) {
+ if( (rc = FSNode_AddChild(parent, d)) != 0 ) {
+ FSNode_Release(d);
+ }
+ }
+ }
+ if( rc == 0 ) {
+ rc = SRANode_Make(d, found->accession, found, flags);
+ }
+ }
+ SRAListNode_Release(found);
+ }
+ free(data.accession);
+ free(data.path);
+ }
+ return rc;
+}
+
+static
+rc_t SRAListNode_Update(SRAListNode* self, KTime_t now)
+{
+ rc_t rc = 0;
+ KTime_t ts = 0;
+ /* weekly forced update */
+ bool forced = now != 0 && (now - self->utime) > (60*24*60*60) && self->utime != 0 /* not new */;
+
+ if( (self->mtime == 0 || now != 0) && (rc = SRAListNode_TableMTime(self, &ts)) == 0 ) {
+ if( self->mtime != ts || forced ) {
+ const SRATable* tbl = NULL;
+ FileOptions* new_files = NULL, *old_files = NULL;
+ uint32_t new_files_count = 0;
+ PLOGMSG(klogInfo, (klogInfo, "Updating sra node, self->mtime = $(mtime), self->utime = $(utime), ts = $(ts), now = $(now), forced = $(forced)",
+ PLOG_5(PLOG_I64(mtime), PLOG_I64(utime), PLOG_I64(ts), PLOG_I32(forced), PLOG_I64(now)),
+ (long long)self->mtime,
+ (long long)self->utime,
+ (long long)ts,
+ (int)forced,
+ (long long)now)
+ );
+ if( (rc = SRAListNode_TableOpen(self, &tbl)) == 0 ) {
+ const KMDataNode* meta = NULL;
+ if( SRATableOpenMDataNodeRead(tbl, &meta, "/FUSE/root/File") != 0 ) {
+ rc = SRATableOpenMDataNodeRead(tbl, &meta, "/FUSE");
+ }
+ if( rc == 0 ) {
+ struct KNamelist* files = NULL;
+ DEBUG_LINE(10, "Opened SRA table meta %s '%s'", self->accession, self->path);
+ if( (rc = KMDataNodeListChild(meta, &files)) == 0 ) {
+ uint32_t files_count = 0;
+ if( (rc = KNamelistCount(files, &files_count)) == 0 && files_count > 0 ) {
+ new_files_count = (2 + files_count) * 2; /* (2 are for .sra types + count in meta) + md5 for each in list */
+ if( (rc = FileOptions_Make(&new_files, new_files_count)) == 0 ) {
+ uint32_t f = 0;
+ new_files_count = 4; /* step down for 2 .sra + md5 for them */
+ while( rc == 0 && f < files_count ) {
+ const char *suffix = NULL;
+ if( (rc = KNamelistGet(files, f, &suffix)) == 0 ) {
+ const KMDataNode* fn = NULL;
+ if( (rc = KMDataNodeOpenNodeRead(meta, &fn, suffix)) == 0 ) {
+ DEBUG_LINE(10, "Adding %s file type '%s'", self->accession, suffix);
+ if( (rc = FileOptions_ParseMeta(&new_files[new_files_count], fn, tbl, ts, suffix)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, " node '$(f)'", PLOG_S(f), suffix));
+ rc = 0;
+ } else {
+ if( new_files[new_files_count].md5[0] != '\0' ) {
+ if( (rc = FileOptions_AttachMD5(&new_files[new_files_count],
+ self->accession, &new_files[new_files_count + 1])) != 0 ||
+ (rc = FileOptions_UpdateMD5(&new_files[new_files_count], self->accession)) != 0) {
+ PLOGERR(klogErr, (klogErr, rc, " node md5 '$(f)'", PLOG_S(f), suffix));
+ rc = 0;
+ } else {
+ new_files_count++;
+ }
+ }
+ new_files_count++;
+ }
+ }
+ f++;
+ ReleaseComplain(KMDataNodeRelease, fn);
+ }
+ }
+ }
+ }
+ ReleaseComplain(KNamelistRelease, files);
+ }
+ ReleaseComplain(KMDataNodeRelease, meta);
+ } else {
+ PLOGMSG(klogWarn, (klogWarn, "FUSE meta block not found in '$(t)'", PLOG_S(t), self->accession));
+ rc = 0;
+ }
+ if( rc == 0 ) {
+ if( new_files_count == 0 ) {
+ /* for 2 .sra types + its .md5's */
+ new_files_count = 4;
+ rc = FileOptions_Make(&new_files, new_files_count);
+ }
+ if( rc == 0 ) {
+ /* add information for sra archives */
+ DEBUG_LINE(10, "Adding SRA archive type %s and its .md5", self->accession);
+ if( (rc = FileOptions_SRAArchive(&new_files[0], tbl, ts, false)) == 0 &&
+ (rc = FileOptions_AttachMD5(&new_files[0], self->accession, &new_files[1])) == 0 ) {
+ DEBUG_LINE(10, "Adding SRA lite archive type %s and its .md5", self->accession);
+ if( (rc = FileOptions_SRAArchive(&new_files[2], tbl, ts, true)) == 0 ) {
+ rc = FileOptions_AttachMD5(&new_files[2], self->accession, &new_files[3]);
+ }
+ }
+ }
+ }
+ ReleaseComplain(SRATableRelease, tbl);
+ }
+ old_files = new_files;
+ if( rc == 0 ) {
+ SRAQueueNode* q;
+ MALLOC(q, sizeof(*q));
+ if( q == NULL ) {
+ rc = RC(rcExe, rcTable, rcUpdating, rcMemory, rcExhausted);
+ } else if( (rc = SRAList_Lock(true)) == 0 ) {
+ if( self->mtime != ts || forced ) {
+ self->mtime = ts;
+ old_files = self->files;
+ self->files = new_files;
+ self->files_count = new_files_count;
+#if 0
+ if( self->utime != 0 /* not new */ && g_queue_cond != NULL && (rc = SRAList_Queue_Lock()) == 0 ) {
+ SRAListNode_AddRef(self);
+ q->node = self;
+ q->mtime = self->mtime;
+ SLListPushTail(&g_queue, &q->dad);
+ g_queue_depth++;
+ KConditionSignal(g_queue_cond);
+ SRAList_Queue_Unlock();
+ q = NULL;
+ DEBUG_LINE(10, "%s table queued for async update, queue %lu", self->accession, g_queue_depth);
+ }
+#endif
+ self->utime = now ? now : time(NULL);
+ }
+ SRAList_Unlock();
+ DEBUG_LINE(10, "%s table updated %lu %lu", self->accession, self->mtime, self->utime);
+ }
+ FREE(q);
+ }
+ FileOptions_Release(old_files);
+ } else {
+ DEBUG_LINE(10, "%s table is up-to-date: %lu, updated %lu, now %lu",
+ self->accession, self->mtime, self->utime, time(NULL));
+ rc = RC(rcExe, rcTable, rcUpdating, rcMessage, rcCanceled);
+ }
+ }
+ if( rc != 0 && GetRCState(rc) != rcCanceled ) {
+ PLOGERR(klogErr, (klogErr, rc, "SRA refresh $(a)", PLOG_S(a), self->accession));
+ }
+ return rc;
+}
+
+typedef struct SRAListNode_UpdateData_struct {
+ rc_t rc;
+ KTime_t now;
+ KFile* file;
+ uint64_t pos;
+ uint32_t qty, recs;
+} SRAListNode_UpdateData;
+
+static
+bool SRAListNode_Updater(BSTNode* node, void* data)
+{
+ SRAListNode* n = (SRAListNode*)node;
+ SRAListNode_UpdateData* d = (SRAListNode_UpdateData*)data;
+
+ if( n->version >= g_version ) {
+ if( SRAListNode_Update(n, d->now) == 0 ) {
+ d->qty = d->qty + 1;
+ }
+ }
+ if( d->file != NULL ) {
+ size_t num_writ;
+ uint16_t acc_sz = n->accession ? strlen(n->accession) : 0;
+ uint16_t path_sz = n->path ? strlen(n->path) : 0;
+
+ if( d->recs++ == 0 ) {
+ if( (d->rc = KFileWrite(d->file, d->pos, &g_cache_version, sizeof(g_cache_version), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ }
+ if( (d->rc = KFileWrite(d->file, d->pos, &acc_sz, sizeof(acc_sz), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ if( (d->rc = KFileWrite(d->file, d->pos, n->accession, acc_sz, &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ }
+ if( (d->rc = KFileWrite(d->file, d->pos, &path_sz, sizeof(path_sz), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ if( (d->rc = KFileWrite(d->file, d->pos, n->path, path_sz, &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ }
+ if( (d->rc = KFileWrite(d->file, d->pos, &n->files_count, sizeof(n->files_count), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ if( n->files_count > 0 &&
+ (d->rc = KFileWrite(d->file, d->pos, n->files, n->files_count * sizeof(*(n->files)), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ }
+ if( (d->rc = KFileWrite(d->file, d->pos, &n->mtime, sizeof(n->mtime), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ if( (d->rc = KFileWrite(d->file, d->pos, &n->utime, sizeof(n->utime), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ /* a'la validation: write record id */
+ if( (d->rc = KFileWrite(d->file, d->pos, &d->recs, sizeof(d->recs), &num_writ)) == 0 ) {
+ d->pos += num_writ;
+ }
+ }
+ return g_sync == 0;
+}
+
+void SRAList_PostRefresh()
+{
+ if (pthread_cond_signal(&g_refresh_cond) == -1)
+ assert(0);
+}
+
+static
+rc_t SRAList_Thread(const KThread *self, void *data)
+{
+
+ PLOGMSG(klogInfo, (klogInfo, "SRA sync thread started with $(s) sec", PLOG_U32(s), g_sync));
+ while( g_sync > 0 ) {
+ KDirectory* dir = NULL;
+ SRAListNode_UpdateData data;
+ struct timespec timeout = {0};
+ if (clock_gettime(CLOCK_REALTIME, &timeout) == -1)
+ assert(0);
+ timeout.tv_sec += g_sync;
+ if (pthread_mutex_lock(&g_refresh_mutex) != 0)
+ assert(0);
+ switch (pthread_cond_timedwait(&g_refresh_cond, &g_refresh_mutex, &timeout))
+ {
+ case 0:
+ case ETIMEDOUT:
+ break;
+ default:
+ assert(0);
+ }
+ if (pthread_mutex_unlock(&g_refresh_mutex) != 0)
+ assert(0);
+ LOGMSG(klogInfo, "Begin refreshing sra list");
+ if( g_lock == NULL ) {
+ break;
+ }
+ memset(&data, 0, sizeof(data));
+ data.now = time(NULL);
+ DEBUG_LINE(10, "SRA sync thread with %u sec, updating version %u @ %lu", g_sync, g_version, data.now);
+ if( g_cache_file != NULL ) {
+ DEBUG_LINE(10, "SRA sync thread writing cache file %s", g_cache_file_tmp);
+ if( (data.rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ data.rc = KDirectoryCreateFile(dir, &data.file, false, 0644, kcmInit, "%s", g_cache_file_tmp);
+ }
+ if( data.rc != 0 ) {
+ data.file = NULL;
+ PLOGERR(klogErr, (klogErr, data.rc, "SRA cache file $(s)", PLOG_S(s), g_cache_file_tmp));
+ }
+ }
+ SRAListNode_KConfigReload();
+ /* scan in reverse to avoid reading threads following update */
+ BSTreeDoUntil(&g_list, true, SRAListNode_Updater, &data);
+ if( data.qty > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "SRA sync updated $(q) runs", PLOG_U32(q), data.qty));
+ } else {
+ DEBUG_LINE(10, "SRA sync updated %u runs", data.qty);
+ }
+ if( data.file != NULL ) {
+ rc_t rc;
+ ReleaseComplain(KFileRelease, data.file);
+ rc = KDirectoryRename(dir, true, g_cache_file_tmp, g_cache_file);
+ ReleaseComplain(KDirectoryRelease, dir);
+ data.rc = data.rc ? data.rc : rc;
+ if( data.rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, data.rc, "writing SRA cache file $(s) $(n) records", PLOG_2(PLOG_S(s),PLOG_U32(n)), g_cache_file, data.recs));
+ } else {
+ PLOGMSG(klogInfo, (klogInfo, "created SRA cache file $(s) $(n) records", PLOG_2(PLOG_S(s),PLOG_U32(n)), g_cache_file, data.recs));
+ }
+ }
+ }
+ PLOGMSG(klogInfo, (klogInfo, "SRA sync thread ended v$(s)", PLOG_U64(s), g_version));
+ return 0;
+}
+
+static
+rc_t SRAList_Queue(const KThread *self, void *data)
+{
+ LOGMSG(klogInfo, "SRA queue thread started");
+ while( g_queue_cond != NULL ) {
+ DEBUG_LINE(10, "SRA queue %s", "running");
+ do {
+ SRAQueueNode* q = NULL;
+ if( SRAList_Queue_Lock() == 0 ) {
+ if( g_queue_depth > 0 ) {
+ q = (SRAQueueNode*)SLListPopHead(&g_queue);
+ g_queue_depth--;
+ }
+ SRAList_Queue_Unlock();
+ if( q != NULL ) {
+ if( SRAList_Lock(false) == 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "SRA queue $(s) updating", PLOG_S(s), q->node->accession));
+ if( atomic32_read(&q->node->refcount) == 1 ) {
+ /* restore value of release below will go negative and leak */
+ DEBUG_LINE(10, "SRA queue %s dropped - not updated", q->node->accession);
+ } else if( q->node->mtime == q->mtime ) {
+ /* update only if not changed since it was put into queue */
+ uint32_t i, count = q->node->files_count;
+ FileOptions* opt;
+ if( FileOptions_Clone(&opt, q->node->files, count) == 0 ) {
+ SRAList_Unlock();
+ for(i = 0; i < count; i++) {
+ if( opt[i].md5_file != 0 ) {
+ rc_t rc = FileOptions_CalcMD5(&opt[i], q->node->accession, q->node);
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "SRA queue $(s) while obtaining md5",
+ PLOG_S(s), q->node->accession));
+ } else if( (rc = FileOptions_UpdateMD5(&opt[i], q->node->accession)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "SRA queue $(s) while assigning md5",
+ PLOG_S(s), q->node->accession));
+ }
+ }
+ }
+ if( SRAList_Lock(true) == 0 && q->node->mtime == q->mtime ) {
+ /* actual update if not changed */
+ FREE(q->node->files);
+ q->node->files = opt;
+ q->node->files_count = count;
+ PLOGMSG(klogInfo, (klogInfo, "SRA queue $(s) updated", PLOG_S(s), q->node->accession));
+ } else {
+ FREE(opt);
+ DEBUG_LINE(10, "SRA queue %s changed during - not updated", q->node->accession);
+ }
+ }
+ } else {
+ DEBUG_LINE(10, "SRA queue %s changed - not updated", q->node->accession);
+ }
+ SRAList_Unlock();
+ SRAListNode_Release(q->node);
+ FREE(q);
+ }
+ } else {
+ break;
+ }
+ }
+ } while( g_queue_cond != NULL );
+ if( g_queue_cond != NULL ) {
+ DEBUG_LINE(10, "SRA queue %s", "waiting");
+ SRAList_Queue_Lock();
+ KConditionWait(g_queue_cond, g_queue_lock);
+ SRAList_Queue_Unlock();
+ }
+ }
+ LOGMSG(klogInfo, "SRA queue thread ended");
+ return 0;
+}
+
+rc_t SRAList_Make(KDirectory* dir, unsigned int seconds, const char* cache_path)
+{
+ rc_t rc = 0;
+ BSTreeInit(&g_list);
+ SLListInit(&g_queue);
+ g_sync = seconds;
+
+ assert(dir != NULL);
+
+ if( cache_path != NULL ) {
+ char buf[4096];
+ size_t len;
+ const char* path, *slash = strrchr(cache_path, '/');
+
+ if( slash == NULL ) {
+ slash = cache_path;
+ path = ".";
+ len = 1;
+ } else {
+ path = cache_path;
+ len = slash++ - cache_path;
+ }
+ if( (rc = KDirectoryResolvePath(dir, true, buf, 4096, "%.*s", len, path)) == 0 ) {
+ size_t i = strlen(buf) - 1;
+ while( buf[i] == '.' || buf[i] == '/' ) {
+ i--;
+ }
+ if( i + 2 + strlen(slash) + 4 > sizeof(buf) ) {
+ rc = RC(rcExe, rcPath, rcConstructing, rcBuffer, rcInsufficient);
+ } else {
+ buf[++i] = '/';
+ buf[++i] = '\0';
+ strcat(buf, slash);
+ if( (rc = StrDup(buf, &g_cache_file)) == 0 ) {
+ DEBUG_LINE(10, "SRA cache file path set to '%s'", g_cache_file);
+ strcat(buf, ".tmp");
+ if( (rc = StrDup(buf, &g_cache_file_tmp)) == 0 ) {
+ DEBUG_LINE(10, "SRA tmp cache file path set to '%s'", g_cache_file_tmp);
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+void SRAList_Init(void)
+{
+ rc_t rc = 0;
+
+ if( g_lock == NULL && (rc = KRWLockMake(&g_lock)) != 0 ) {
+ g_lock = NULL;
+ LOGERR(klogErr, rc, "SRA lock");
+ }
+ if( g_queue_cond == NULL && (rc = KConditionMake(&g_queue_cond)) != 0 ) {
+ g_queue_cond = NULL;
+ LOGERR(klogErr, rc, "SRA queue condition");
+ } else if( g_queue_lock == NULL && (rc = KLockMake(&g_queue_lock)) != 0 ) {
+ g_queue_lock = NULL;
+ LOGERR(klogErr, rc, "SRA queue lock");
+ }
+ if( g_cache_file != NULL ) {
+ /* try to load cache */
+ KDirectory* dir = NULL;
+
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ const KFile* f;
+ uint32_t recs = 0;
+
+ if( (rc = KDirectoryOpenFileRead(dir, &f, "%s", g_cache_file)) == 0 ) {
+ uint64_t pos = 0;
+ uint32_t ver = 0, recid;
+ uint16_t obj_sz;
+ size_t num_read = 0;
+ SRAListNode_FindData data;
+ SRAListNode* found;
+
+ assert(sizeof(ver) == sizeof(g_cache_version));
+ do {
+ memset(&data, 0, sizeof(data));
+ if( pos == 0 ) {
+ if( (rc = KFileRead(f, pos, &ver, sizeof(ver), &num_read)) != 0 ||
+ num_read != sizeof(ver) || ver == 0 || ver > g_cache_version ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData,
+ ver != g_cache_version ? rcBadVersion : rcTooShort);
+ break;
+ }
+ pos += num_read;
+ }
+ if( (rc = KFileRead(f, pos, &obj_sz, sizeof(obj_sz), &num_read)) != 0 || num_read != sizeof(obj_sz) ) {
+ if( num_read != 0 ) {
+ /* if num_read is 0 than it is proper EOF */
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ }
+ break;
+ }
+ pos += num_read;
+ MALLOC(data.accession, obj_sz + 1);
+ if( data.accession == NULL ) {
+ rc = RC(rcExe, rcTable, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ if( (rc = KFileRead(f, pos, data.accession, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ data.accession[obj_sz] = '\0';
+ pos += num_read;
+ if( (rc = KFileRead(f, pos, &obj_sz, sizeof(obj_sz), &num_read)) != 0 || num_read != sizeof(obj_sz) ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ if( obj_sz > 0 ) {
+ MALLOC(data.path, obj_sz + 1);
+ if( data.path == NULL ) {
+ rc = RC(rcExe, rcTable, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ if( (rc = KFileRead(f, pos, data.path, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ data.path[obj_sz] = '\0';
+ pos += num_read;
+ }
+ if( (rc = SRAListNode_Insert(&data, 0, &found)) != 0 ) {
+ break;
+ } else if( (rc = SRAList_Lock(true)) == 0 ) {
+ do {
+ obj_sz = sizeof(found->files_count);
+ if( (rc = KFileRead(f, pos, &found->files_count, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ if( found->files_count > 0 ) {
+ if( ver < 4 ) {
+ /* size was different for older version */
+ obj_sz = sizeof(FileOptionsOld) * found->files_count;
+
+ } else {
+ obj_sz = sizeof(*found->files) * found->files_count;
+ }
+ MALLOC(found->files, obj_sz);
+ if( found->files == NULL ) {
+ rc = RC(rcExe, rcTable, rcReading, rcMemory, rcExhausted);
+ break;
+ }
+ if( (rc = KFileRead(f, pos, found->files, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ if( ver < 4 ) {
+ FileOptionsOld* fOld = (FileOptionsOld*)found->files;
+ if( (rc = FileOptions_Make(&found->files, found->files_count)) != 0 ) {
+ FREE(fOld);
+ break;
+ } else {
+ uint32_t i;
+ /* old struct size */
+ obj_sz = sizeof(FileOptionsOld);
+ for(i = 0; i < found->files_count; i++ ) {
+ memmove(&found->files[i], &fOld[i], obj_sz);
+ memset(found->files[i].md5, 0, sizeof(found->files[i].md5));
+ found->files[i].md5_file = 0;
+ }
+ FREE(fOld);
+ }
+ }
+ }
+ obj_sz = sizeof(found->mtime);
+ if( (rc = KFileRead(f, pos, &found->mtime, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ if( ver >= 3 ) {
+ obj_sz = sizeof(found->utime);
+ if( (rc = KFileRead(f, pos, &found->utime, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ }
+ SRAList_Unlock();
+ if( ver == 1 ) {
+ KTime_t l;
+ obj_sz = sizeof(l);
+ if( (rc = KFileRead(f, pos, &l, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ }
+ obj_sz = sizeof(recid);
+ if( (rc = KFileRead(f, pos, &recid, obj_sz, &num_read)) != 0 || num_read != obj_sz ) {
+ rc = rc ? rc : RC(rcExe, rcTable, rcReading, rcData, rcTooShort);
+ break;
+ }
+ pos += num_read;
+ if( ++recs != recid ) {
+ rc = RC(rcExe, rcTable, rcReading, rcData, rcInconsistent);
+ break;
+ }
+ } while(false);
+ }
+ FREE(data.accession);
+ FREE(data.path);
+ SRAListNode_Release(found);
+ } while(rc == 0);
+ ReleaseComplain(KFileRelease, f);
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "reading SRA cache file $(s) $(n) records",
+ PLOG_2(PLOG_S(s),PLOG_U32(n)), g_cache_file, recs));
+ } else if( recs > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "loaded SRA cache file $(s) $(n) records",
+ PLOG_2(PLOG_S(s),PLOG_U32(n)), g_cache_file, recs));
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ if( g_lock != NULL ) {
+ if( g_sync > 0 && (rc = KThreadMake(&g_thread, SRAList_Thread, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "SRA sync thread");
+ }
+ if( g_queue_cond != NULL && g_queue_lock != NULL &&
+ (rc = KThreadMake(&g_queue_thread, SRAList_Queue, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "SRA queue thread");
+ }
+ }
+}
+
+void SRAList_Fini(void)
+{
+ g_sync = 0;
+ if( g_thread != NULL ) {
+ ReleaseComplain(KThreadCancel, g_thread);
+ ReleaseComplain(KThreadRelease, g_thread);
+ }
+ if( g_queue_thread != NULL ) {
+ KCondition* x = g_queue_cond;
+ g_queue_cond = NULL;
+ SRAList_Queue_Lock();
+ KConditionSignal(x);
+ SRAList_Queue_Unlock();
+ ReleaseComplain(KThreadCancel, g_queue_thread);
+ ReleaseComplain(KThreadRelease, g_queue_thread);
+ g_queue_cond = x;
+ g_queue_thread = NULL;
+ }
+ ReleaseComplain(KConditionRelease, g_queue_cond);
+ ReleaseComplain(KLockRelease, g_queue_lock);
+ pthread_cond_destroy(&g_refresh_cond);
+ pthread_mutex_destroy(&g_refresh_mutex);
+ if( g_lock != NULL ) {
+ SRAList_Lock(true);
+ }
+ BSTreeWhack(&g_list, SRAList_Whack, NULL);
+ SLListWhack(&g_queue, SRAQueue_Whack, NULL);
+ if( g_lock != NULL ) {
+ SRAList_Unlock();
+ ReleaseComplain(KRWLockRelease, g_lock);
+ }
+ ReleaseComplain(SRAMgrRelease, g_sra_mgr);
+ ReleaseComplain(KLockRelease, g_sra_mgr_lock);
+ FREE(g_cache_file);
+ FREE(g_cache_file_tmp);
+
+ g_queue_cond = NULL;
+ g_queue_lock = NULL;
+ g_version = 0;
+ g_lock = NULL;
+ g_thread = NULL;
+ g_sra_mgr = NULL;
+}
+
+rc_t SRAListNode_GetType(const SRAListNode* cself, SRAConfigFlags flags, const char* suffix, const FileOptions** options)
+{
+ rc_t rc = 0;
+ if( cself == NULL || suffix == NULL || options == NULL ) {
+ rc = RC(rcExe, rcTable, rcSearching, rcParam, rcNull);
+ } else {
+ if( (rc = SRAListNode_Update((SRAListNode*)cself, 0)) == 0 || GetRCState(rc) == rcCanceled ) {
+ DEBUG_LINE(10, "'%s'", suffix);
+ if( (rc = SRAList_Lock(false)) == 0 ) {
+ size_t i;
+ *options = NULL;
+ for(i = 0; i < cself->files_count; i++) {
+ if( (cself->files[i].type & flags) && strcmp(suffix, cself->files[i].suffix) == 0 ) {
+ *options = &cself->files[i];
+ break;
+ }
+ }
+ SRAList_Unlock();
+ }
+ }
+ }
+ if( rc == 0 && *options == NULL ) {
+ rc = RC(rcExe, rcTable, rcSearching, rcName, rcNotFound);
+ }
+ return rc;
+}
+
+rc_t SRAListNode_ListFiles(const SRAListNode* cself, const char* prefix, int types, FSNode_Dir_Visit func, void* data)
+{
+ rc_t rc = 0;
+ if( cself == NULL ) {
+ rc = RC(rcExe, rcTable, rcListing, rcSelf, rcNull);
+ } else {
+ if( (rc = SRAListNode_Update((SRAListNode*)cself, 0)) == 0 || GetRCState(rc) == rcCanceled ) {
+ DEBUG_LINE(10, "%s", prefix);
+ if( (rc = SRAList_Lock(false)) == 0 ) {
+ char buf[1024];
+ size_t i;
+ for(i = 0; rc == 0 && i < cself->files_count; i++) {
+ if( (cself->files[i].type & types) && cself->files[i].file_sz > 0 ) {
+ strcpy(buf, prefix);
+ strcat(buf, cself->files[i].suffix);
+ rc = func(buf, data);
+ }
+ }
+ SRAList_Unlock();
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/sra-list.h b/tools/fuse/sra-list.h
new file mode 100644
index 0000000..3bc3ef0
--- /dev/null
+++ b/tools/fuse/sra-list.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_sra_list_
+#define _h_sra_fuse_sra_list_
+
+#include <sra/sradb.h>
+
+#include "xml.h"
+#include "formats.h"
+
+typedef enum {
+ eSRAFuseInitial = 0x1000,
+ eSRAFuseRunDir = 0x0001,
+ eSRAFuseFileArc = 0x0002,
+ eSRAFuseFileArcLite = 0x0004,
+ eSRAFuseFileFastq = 0x0008,
+ eSRAFuseFileSFF = 0x0010
+} SRAConfigFlags;
+
+typedef struct SRAListNode SRAListNode;
+
+/*
+ * Initialize run list
+ * if seconds > 0 than a thread is launched to updated run info
+ */
+rc_t SRAList_Make(KDirectory* dir, unsigned int seconds, const char* cache_path);
+
+void SRAList_Init(void);
+
+void SRAList_Fini(void);
+
+/* after processing updated XML set next version so
+ * that runs dropped from XML could be dropped from the list
+ */
+rc_t SRAList_NextVersion(void);
+
+/*
+ * Attaches to parent file nodes based on flags
+ * xml_node is of type SRA with accession and optional path
+ * maintains internal list of SRA objects keyed on acession-path pairs
+ */
+rc_t SRAListNode_Make(const KXMLNode* xml_node, FSNode* parent, SRAConfigFlags flags, char* errmsg,
+ const char* rel_path, EXMLValidate validate);
+
+rc_t SRAListNode_TableMTime(const SRAListNode* cself, KTime_t* mtime);
+
+rc_t SRAListNode_TableOpen(const SRAListNode* cself, const SRATable** tbl);
+
+/*
+ * Get type info based on file extension
+ */
+rc_t SRAListNode_GetType(const SRAListNode* cself, SRAConfigFlags flags, const char* suffix, struct FileOptions const** options);
+
+/*
+ * Get list of files using prefix + suffixes filtering by types
+ */
+rc_t SRAListNode_ListFiles(const SRAListNode* cself, const char* prefix, int types, FSNode_Dir_Visit func, void* data);
+
+rc_t SRAListNode_AddRef(const SRAListNode* cself);
+void SRAListNode_Release(const SRAListNode* cself);
+void SRAList_PostRefresh();
+
+#endif /* _h_sra_fuse_sra_list_ */
diff --git a/tools/fuse/sra-makeidx.c b/tools/fuse/sra-makeidx.c
new file mode 100644
index 0000000..a34b39a
--- /dev/null
+++ b/tools/fuse/sra-makeidx.c
@@ -0,0 +1,955 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/checksum.h>
+#include <klib/rc.h>
+#include <kdb/manager.h>
+#include <kdb/table.h>
+#include <kdb/meta.h>
+#include <kdb/index.h>
+
+#include <sra/wsradb.h>
+#include <sra/sradb-priv.h>
+#include <sra/fastq.h>
+#include <sra/sff.h>
+
+#include "zlib-simple.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+
+uint32_t g_file_block_sz = 32 * 1024;
+const char* g_accession = NULL;
+bool g_dump = false;
+bool g_ungzip = false;
+
+typedef struct SIndexObj_struct {
+ KMDataNode* meta;
+ const char* const file;
+ const char* const format;
+ const char* const index;
+ rc_t (*func)(const SRATable* sratbl, struct SIndexObj_struct* obj, char* buffer, const size_t buffer_sz);
+ uint64_t file_size;
+ uint32_t buffer_sz;
+ uint64_t minSpotId;
+ uint64_t maxSpotId;
+ SLList li;
+ MD5State md5;
+ uint8_t md5_digest[16];
+} SIndexObj;
+
+typedef struct SIndexNode_struct {
+ SLNode n;
+ uint64_t key;
+ uint64_t key_size;
+ int64_t id;
+ uint64_t id_qty;
+} SIndexNode;
+
+typedef struct SIndexData_struct {
+ rc_t rc;
+ KIndex* kidx;
+} SIndexData;
+
+static
+bool InsertIndexData( SLNode *node, void *data )
+{
+ SIndexNode* n = (SIndexNode*)node;
+ SIndexData* d = (SIndexData*)data;
+
+ d->rc = KIndexInsertU64(d->kidx, true, n->key, n->key_size, n->id, n->id_qty);
+ return d->rc == 0 ? false : true;
+}
+
+static
+void WhackIndexData( SLNode *n, void *data )
+{
+ free(n);
+}
+
+static
+rc_t CommitIndex(KTable* ktbl, const char* name, const SLList* li)
+{
+ SIndexData data;
+
+ STSMSG(0, ("Saving index %s", name));
+ data.rc = KTableCreateIndex(ktbl, &data.kidx, kitU64, kcmInit, name);
+ if( data.rc == 0 ) {
+ if( !SLListDoUntil(li, InsertIndexData, &data) ) {
+ data.rc = KIndexCommit(data.kidx);
+ }
+ KIndexRelease(data.kidx);
+ }
+ return data.rc;
+}
+
+rc_t WriteFileMeta(SIndexObj* obj)
+{
+ rc_t rc = 0;
+ KMDataNode* nd = NULL;
+
+ PLOGMSG(klogInfo, (klogInfo, "Meta $(f) on index $(i): file size $(s), buffer $(b)",
+ PLOG_4(PLOG_S(f),PLOG_S(i),PLOG_U64(s),PLOG_U32(b)), obj->file, obj->index, obj->file_size, obj->buffer_sz));
+
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(obj->meta, &nd, "Format")) == 0 ) {
+ KMDataNode* opt = NULL;
+ rc = KMDataNodeWriteCString(nd, obj->format);
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(nd, &opt, "Options")) == 0 ) {
+ KMDataNode* ond = NULL;
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &ond, "accession")) == 0 ) {
+ rc = KMDataNodeWriteCString(ond, g_accession);
+ KMDataNodeRelease(ond);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &ond, "minSpotId")) == 0 ) {
+ rc = KMDataNodeWriteB64(ond, &obj->minSpotId);
+ KMDataNodeRelease(ond);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &ond, "maxSpotId")) == 0 ) {
+ rc = KMDataNodeWriteB64(ond, &obj->maxSpotId);
+ KMDataNodeRelease(ond);
+ }
+ KMDataNodeRelease(opt);
+ }
+ KMDataNodeRelease(nd);
+ }
+
+ if( rc == 0 && obj->file_size > 0 && (rc = KMDataNodeOpenNodeUpdate(obj->meta, &nd, "Size")) == 0 ) {
+ rc = KMDataNodeWriteB64(nd, &obj->file_size);
+ KMDataNodeRelease(nd);
+ }
+
+ if( rc == 0 && obj->buffer_sz > 0 && (rc = KMDataNodeOpenNodeUpdate(obj->meta, &nd, "Buffer")) == 0 ) {
+ rc = KMDataNodeWriteB32(nd, &obj->buffer_sz);
+ KMDataNodeRelease(nd);
+ }
+
+ if( rc == 0 && strlen(obj->index) > 0 && (rc = KMDataNodeOpenNodeUpdate(obj->meta, &nd, "Index")) == 0 ) {
+ rc = KMDataNodeWriteCString(nd, obj->index);
+ KMDataNodeRelease(nd);
+ }
+
+ if( rc == 0 && obj->file_size > 0 && (rc = KMDataNodeOpenNodeUpdate(obj->meta, &nd, "md5")) == 0 ) {
+ char x[5];
+ int i;
+ for( i = 0; rc == 0 && i < sizeof(obj->md5_digest); i++ ) {
+ int l = snprintf(x, 4, "%02x", obj->md5_digest[i]);
+ rc = KMDataNodeAppend(nd, x, l);
+ }
+ KMDataNodeRelease(nd);
+ }
+ return rc;
+}
+
+static
+rc_t SFF_Idx(const SRATable* sratbl, SIndexObj* obj, char* buffer, const size_t buffer_sz)
+{
+ rc_t rc = 0;
+ const SFFReader* reader = NULL;
+
+ if( (rc = SFFReaderMake(&reader, sratbl, g_accession, obj->minSpotId, obj->maxSpotId)) != 0 ) {
+ return rc;
+ } else {
+ size_t written = 0;
+ uint32_t blk = 0;
+ SIndexNode* inode = NULL;
+
+ while( rc == 0 ) {
+ rc = SFFReader_GetNextSpotData(reader, buffer, buffer_sz, &written);
+ if( blk >= g_file_block_sz || (GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted) ) {
+ inode->key_size = blk;
+ SLListPushTail(&obj->li, &inode->n);
+ DEBUG_MSG(5, ("SFF index closed spots %lu, offset %lu, block size %lu\n", inode->id_qty, inode->key, inode->key_size));
+ inode = NULL;
+ if( blk > obj->buffer_sz ) {
+ obj->buffer_sz = blk;
+ }
+ blk = 0;
+ }
+ if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted ) {
+ rc = 0;
+ break;
+ }
+ if( inode == NULL ) {
+ spotid_t spotid = 0;
+ if( (rc = SFFReaderCurrentSpot(reader, &spotid)) != 0 ) {
+ break;
+ }
+ inode = malloc(sizeof(SIndexNode));
+ if( inode == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ break;
+ }
+ inode->key = obj->file_size;
+ inode->key_size = 0;
+ inode->id = spotid;
+ inode->id_qty = 0;
+ DEBUG_MSG(5, ("SFF index opened spot %ld, offset %lu\n", inode->id, inode->key));
+ if( spotid == 1 ) {
+ char hd[10240];
+ size_t hd_sz = 0;
+ if( (rc = SFFReaderHeader(reader, 0, hd, sizeof(hd), &hd_sz)) == 0 ) {
+ obj->file_size += hd_sz;
+ blk += hd_sz;
+ MD5StateAppend(&obj->md5, hd, hd_sz);
+ if( g_dump ) {
+ fwrite(hd, hd_sz, 1, stderr);
+ }
+ }
+ }
+ }
+ obj->file_size += written;
+ blk += written;
+ inode->id_qty++;
+ MD5StateAppend(&obj->md5, buffer, written);
+ if( g_dump ) {
+ fwrite(buffer, written, 1, stderr);
+ }
+ }
+ rc = rc ? rc : Quitting();
+ if( rc != 0 ) {
+ spotid_t spot = 0;
+ SFFReaderCurrentSpot(reader, &spot);
+ PLOGERR(klogErr, (klogErr, rc, "spot $(s)", PLOG_U32(s), spot));
+ }
+ }
+ SFFReaderWhack(reader);
+ return rc;
+}
+
+static
+rc_t SFFGzip_Idx(const SRATable* sratbl, SIndexObj* obj, char* buffer, const size_t buffer_sz)
+{
+ rc_t rc = 0;
+ uint16_t zlib_ver = ZLIB_VERNUM;
+ const SFFReader* reader = NULL;
+
+ if( (rc = SFFReaderMake(&reader, sratbl, g_accession, obj->minSpotId, obj->maxSpotId)) != 0 ) {
+ return rc;
+ } else {
+ size_t written = 0;
+ uint32_t blk = 0, spots_per_block = 0, proj_id_qty = 0;
+ SIndexNode* inode = NULL;
+ size_t z_blk = 0;
+ size_t spots_buf_sz = g_file_block_sz * 100;
+ size_t zbuf_sz = spots_buf_sz + 100;
+
+ char* zbuf = malloc(zbuf_sz);
+ char* spots_buf = malloc(spots_buf_sz);
+ bool eof = false;
+
+ if( zbuf == NULL || spots_buf == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ }
+ while( rc == 0 ) {
+ if( (rc = SFFReader_GetNextSpotData(reader, buffer, buffer_sz, &written)) == 0 ) {
+ if( inode == NULL ) {
+ spotid_t spotid = 0;
+ if( (rc = SFFReaderCurrentSpot(reader, &spotid)) != 0 ) {
+ break;
+ }
+ inode = malloc(sizeof(SIndexNode));
+ if( inode == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ break;
+ }
+ inode->key = obj->file_size;
+ inode->key_size = 0;
+ inode->id = spotid;
+ inode->id_qty = 0;
+ DEBUG_MSG(5, ("%s open key: spot %ld, offset %lu\n", obj->index, inode->id, inode->key));
+ if( spotid == 1 ) {
+ char hd[10240];
+ size_t hd_sz = 0;
+ if( (rc = SFFReaderHeader(reader, 0, hd, sizeof(hd), &hd_sz)) == 0 ) {
+ if( hd_sz + written > spots_buf_sz ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcInsufficient);
+ break;
+ }
+ memmove(&spots_buf[blk], hd, hd_sz);
+ blk += hd_sz;
+ if( g_dump ) {
+ fwrite(hd, hd_sz, 1, stderr);
+ }
+ }
+ }
+
+ }
+ if( blk + written > spots_buf_sz ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcInsufficient);
+ break;
+ }
+ inode->id_qty++;
+ memmove(&spots_buf[blk], buffer, written);
+ blk += written;
+ if( g_dump ) {
+ fwrite(buffer, written, 1, stderr);
+ }
+ }
+ if( (eof = (GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted)) ) {
+ rc = 0;
+ if( inode == NULL ) {
+ break;
+ }
+ }
+ if( rc == 0 && (eof ||
+ (proj_id_qty == 0 && inode->id_qty > (spots_per_block * 0.95)) ||
+ (proj_id_qty > 0 && inode->id_qty >= proj_id_qty) ) ) {
+ rc = ZLib_DeflateBlock(spots_buf, blk, zbuf, zbuf_sz, &z_blk);
+ if( z_blk < g_file_block_sz ) {
+ /* project needed id_qty */
+ proj_id_qty = g_file_block_sz * inode->id_qty / z_blk * 1.05;
+ DEBUG_MSG(5, ("%s: project id qty %lu\n", obj->index, proj_id_qty));
+ } else {
+ DEBUG_MSG(10, ("%s: no projection %lu > %lu\n", obj->index, z_blk, g_file_block_sz));
+ }
+ }
+ if( rc == 0 && (eof || z_blk >= g_file_block_sz) ) {
+ obj->file_size += z_blk;
+ MD5StateAppend(&obj->md5, zbuf, z_blk);
+ inode->key_size = z_blk;
+ SLListPushTail(&obj->li, &inode->n);
+ DEBUG_MSG(5, ("%s close key: spots %lu, size %lu, ratio %hu%%, raw %lu\n",
+ obj->index, inode->id_qty, inode->key_size, (uint16_t)(((float)(blk - z_blk)/blk)*100), blk));
+ spots_per_block = inode->id_qty;
+ inode = NULL;
+ if( blk > obj->buffer_sz ) {
+ obj->buffer_sz = blk;
+ }
+ blk = 0;
+ z_blk = 0;
+ proj_id_qty = 0;
+ }
+ if( eof ) {
+ break;
+ }
+ }
+ rc = rc ? rc : Quitting();
+ if( rc != 0 ) {
+ spotid_t spot = 0;
+ SFFReaderCurrentSpot(reader, &spot);
+ PLOGERR(klogErr, (klogErr, rc, "spot $(s)", PLOG_U32(s), spot));
+ }
+ free(zbuf);
+ free(spots_buf);
+ }
+ if( rc == 0 ) {
+ KMDataNode* opt = NULL, *nd = NULL;
+
+ if( (rc = KMDataNodeOpenNodeUpdate(obj->meta, &opt, "Format/Options")) != 0 ) {
+ return rc;
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "ZlibVersion")) == 0 ) {
+ rc = KMDataNodeWriteB16(nd, &zlib_ver);
+ KMDataNodeRelease(nd);
+ }
+ KMDataNodeRelease(opt);
+ }
+ SFFReaderWhack(reader);
+ return rc;
+}
+
+static
+rc_t Fastq_Idx(const SRATable* sratbl, SIndexObj* obj, char* buffer, const size_t buffer_sz)
+{
+ rc_t rc = 0;
+ const FastqReader* reader = NULL;
+
+ uint8_t colorSpace = false;
+ char* colorSpaceKey = "\0";
+ uint8_t origFormat = false;
+ uint8_t printLabel = true;
+ uint8_t printReadId = true;
+ uint8_t clipQuality = true;
+ uint32_t minReadLen = 0;
+ uint16_t qualityOffset = 0;
+
+ {{
+ const SRAColumn* c = NULL;
+ const uint8_t *platform = SRA_PLATFORM_UNDEFINED;
+ bitsz_t o, z;
+
+ if( (rc = SRATableOpenColumnRead(sratbl, &c, "PLATFORM", sra_platform_id_t)) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAColumnRead(c, 1, (const void **)&platform, &o, &z)) != 0 ) {
+ return rc;
+ }
+ if( *platform == SRA_PLATFORM_ABSOLID ) {
+ colorSpace = true;
+ }
+ SRAColumnRelease(c);
+ }}
+
+ if( (rc = FastqReaderMake(&reader, sratbl, g_accession,
+ colorSpace, origFormat, false, printLabel, printReadId,
+ !clipQuality, minReadLen, qualityOffset, colorSpaceKey[0],
+ obj->minSpotId, obj->maxSpotId)) != 0 ) {
+ return rc;
+ } else {
+ KMDataNode* opt = NULL, *nd = NULL;
+
+ if( (rc = KMDataNodeOpenNodeUpdate(obj->meta, &opt, "Format/Options")) != 0 ) {
+ return rc;
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "colorSpace")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &colorSpace);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "colorSpaceKey")) == 0 ) {
+ rc = KMDataNodeWrite(nd, colorSpaceKey, 1);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "origFormat")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &origFormat);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "printLabel")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &printLabel);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "printReadId")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &printReadId);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "clipQuality")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &clipQuality);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "minReadLen")) == 0 ) {
+ rc = KMDataNodeWriteB32(nd, &minReadLen);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "qualityOffset")) == 0 ) {
+ rc = KMDataNodeWriteB16(nd, &qualityOffset);
+ KMDataNodeRelease(nd);
+ }
+ KMDataNodeRelease(opt);
+ }
+
+ if( rc == 0 ) {
+ size_t written = 0;
+ uint32_t blk = 0;
+ SIndexNode* inode = NULL;
+
+ while( rc == 0 ) {
+ rc = FastqReader_GetNextSpotSplitData(reader, buffer, buffer_sz, &written);
+ if( blk >= g_file_block_sz || (GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted) ) {
+ inode->key_size = blk;
+ SLListPushTail(&obj->li, &inode->n);
+ DEBUG_MSG(5, ("Fastq index closed spots %lu, offset %lu, block size %lu\n",
+ inode->id_qty, inode->key, inode->key_size));
+ inode = NULL;
+ if( blk > obj->buffer_sz ) {
+ obj->buffer_sz = blk;
+ }
+ blk = 0;
+ }
+ if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted ) {
+ rc = 0;
+ break;
+ }
+ if( inode == NULL ) {
+ spotid_t spotid = 0;
+ if( (rc = FastqReaderCurrentSpot(reader, &spotid)) != 0 ) {
+ break;
+ }
+ inode = malloc(sizeof(SIndexNode));
+ if( inode == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ break;
+ }
+ inode->key = obj->file_size;
+ inode->key_size = 0;
+ inode->id = spotid;
+ inode->id_qty = 0;
+ DEBUG_MSG(5, ("Fastq index opened spot %ld, offset %lu\n", inode->id, inode->key));
+ }
+ inode->id_qty++;
+ obj->file_size += written;
+ blk += written;
+ MD5StateAppend(&obj->md5, buffer, written);
+ if( g_dump ) {
+ fwrite(buffer, written, 1, stderr);
+ }
+ }
+ rc = rc ? rc : Quitting();
+ if( rc != 0 ) {
+ spotid_t spot = 0;
+ FastqReaderCurrentSpot(reader, &spot);
+ PLOGERR(klogErr, (klogErr, rc, "spot $(s)", PLOG_U32(s), spot));
+ }
+ }
+ FastqReaderWhack(reader);
+ return rc;
+}
+
+static
+rc_t FastqGzip_Idx(const SRATable* sratbl, SIndexObj* obj, char* buffer, const size_t buffer_sz)
+{
+ rc_t rc = 0;
+ const FastqReader* reader = NULL;
+
+ uint16_t zlib_ver = ZLIB_VERNUM;
+ uint8_t colorSpace = false;
+ char* colorSpaceKey = "\0";
+ uint8_t origFormat = false;
+ uint8_t printLabel = true;
+ uint8_t printReadId = true;
+ uint8_t clipQuality = true;
+ uint32_t minReadLen = 0;
+ uint16_t qualityOffset = 0;
+
+ {{
+ const SRAColumn* c = NULL;
+ const uint8_t *platform = SRA_PLATFORM_UNDEFINED;
+ bitsz_t o, z;
+
+ if( (rc = SRATableOpenColumnRead(sratbl, &c, "PLATFORM", sra_platform_id_t)) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAColumnRead(c, 1, (const void **)&platform, &o, &z)) != 0 ) {
+ return rc;
+ }
+ if( *platform == SRA_PLATFORM_ABSOLID ) {
+ colorSpace = true;
+ }
+ SRAColumnRelease(c);
+ }}
+
+ if( (rc = FastqReaderMake(&reader, sratbl, g_accession,
+ colorSpace, origFormat, false, printLabel, printReadId,
+ !clipQuality, minReadLen, qualityOffset, colorSpaceKey[0],
+ obj->minSpotId, obj->maxSpotId)) != 0 ) {
+ return rc;
+ } else {
+ size_t written = 0;
+ uint32_t blk = 0, spots_per_block = 0, proj_id_qty = 0;
+ SIndexNode* inode = NULL;
+ size_t z_blk = 0;
+ size_t spots_buf_sz = g_file_block_sz * 100;
+ size_t zbuf_sz = spots_buf_sz + 100;
+ char* zbuf = malloc(zbuf_sz);
+ char* spots_buf = malloc(spots_buf_sz);
+ bool eof = false;
+
+ if( zbuf == NULL || spots_buf == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ }
+ while( rc == 0 ) {
+ if( (rc = FastqReader_GetNextSpotSplitData(reader, buffer, buffer_sz, &written)) == 0 ) {
+ if( inode == NULL ) {
+ spotid_t spotid = 0;
+ if( (rc = FastqReaderCurrentSpot(reader, &spotid)) != 0 ) {
+ break;
+ }
+ inode = malloc(sizeof(SIndexNode));
+ if( inode == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ break;
+ }
+ inode->key = obj->file_size;
+ inode->key_size = 0;
+ inode->id = spotid;
+ inode->id_qty = 0;
+ DEBUG_MSG(5, ("%s open key: spot %ld, offset %lu\n", obj->index, inode->id, inode->key));
+ }
+ if( blk + written > spots_buf_sz ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcInsufficient);
+ break;
+ }
+ inode->id_qty++;
+ memmove(&spots_buf[blk], buffer, written);
+ blk += written;
+ if( g_dump ) {
+ fwrite(buffer, written, 1, stderr);
+ }
+ }
+ if( (eof = (GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted)) ) {
+ rc = 0;
+ if( inode == NULL ) {
+ break;
+ }
+ }
+ if( rc == 0 && (eof ||
+ (proj_id_qty == 0 && inode->id_qty > (spots_per_block * 0.95)) ||
+ (proj_id_qty > 0 && inode->id_qty >= proj_id_qty) ) ) {
+ rc = ZLib_DeflateBlock(spots_buf, blk, zbuf, zbuf_sz, &z_blk);
+ if( z_blk < g_file_block_sz ) {
+ /* project needed id_qty */
+ proj_id_qty = g_file_block_sz * inode->id_qty / z_blk * 1.05;
+ DEBUG_MSG(5, ("%s: project id qty %u\n", obj->index, proj_id_qty));
+ } else {
+ DEBUG_MSG(10, ("%s: no projection %u > %u\n", obj->index, z_blk, g_file_block_sz));
+ }
+ }
+ if( rc == 0 && (eof || z_blk >= g_file_block_sz) ) {
+ obj->file_size += z_blk;
+ MD5StateAppend(&obj->md5, zbuf, z_blk);
+ inode->key_size = z_blk;
+ SLListPushTail(&obj->li, &inode->n);
+ DEBUG_MSG(5, ("%s close key: spots %lu, size %lu, ratio %hu%%, raw %u\n",
+ obj->index, inode->id_qty, inode->key_size, (uint16_t)(((float)(blk - z_blk)/blk)*100), blk ));
+ spots_per_block = inode->id_qty;
+ inode = NULL;
+ if( blk > obj->buffer_sz ) {
+ obj->buffer_sz = blk;
+ }
+ blk = 0;
+ z_blk = 0;
+ proj_id_qty = 0;
+ }
+ if( eof ) {
+ break;
+ }
+ }
+ rc = rc ? rc : Quitting();
+ if( rc != 0 ) {
+ spotid_t spot = 0;
+ FastqReaderCurrentSpot(reader, &spot);
+ PLOGERR(klogErr, (klogErr, rc, "spot $(s)", PLOG_U32(s), spot));
+ }
+ free(zbuf);
+ free(spots_buf);
+ }
+ if( rc == 0 ) {
+ KMDataNode* opt = NULL, *nd = NULL;
+
+ if( (rc = KMDataNodeOpenNodeUpdate(obj->meta, &opt, "Format/Options")) != 0 ) {
+ return rc;
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "ZlibVersion")) == 0 ) {
+ rc = KMDataNodeWriteB16(nd, &zlib_ver);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "colorSpace")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &colorSpace);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "colorSpaceKey")) == 0 ) {
+ rc = KMDataNodeWrite(nd, colorSpaceKey, 1);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "origFormat")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &origFormat);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "printLabel")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &printLabel);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "printReadId")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &printReadId);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "clipQuality")) == 0 ) {
+ rc = KMDataNodeWriteB8(nd, &clipQuality);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "minReadLen")) == 0 ) {
+ rc = KMDataNodeWriteB32(nd, &minReadLen);
+ KMDataNodeRelease(nd);
+ }
+ if( rc == 0 && (rc = KMDataNodeOpenNodeUpdate(opt, &nd, "qualityOffset")) == 0 ) {
+ rc = KMDataNodeWriteB16(nd, &qualityOffset);
+ KMDataNodeRelease(nd);
+ }
+ KMDataNodeRelease(opt);
+ }
+ FastqReaderWhack(reader);
+ return rc;
+}
+
+static
+rc_t MakeIndexes(const SRATable* stbl, KTable* ktbl, KMetadata* meta)
+{
+ rc_t rc = 0;
+ int i;
+ char* buffer = NULL;
+ size_t buffer_sz = g_file_block_sz * 100;
+
+ SIndexObj idx[] = {
+ /* meta, file, format, index, func, file_size, buffer_sz, minSpotId, maxSpotId */
+ {NULL, "fastq", "fastq", "fuse-fastq", Fastq_Idx, 0, 0, 0, 0},
+ {NULL, "sff", "SFF", "fuse-sff", SFF_Idx, 0, 0, 0, 0},
+ {NULL, "fastq.gz", "fastq-gzip", "fuse-fastq-gz", FastqGzip_Idx, 0, 0, 0, 0},
+ {NULL, "sff.gz", "SFF-gzip", "fuse-sff-gz", SFFGzip_Idx, 0, 0, 0, 0}
+ };
+
+ for(i = 0; rc == 0 && i < sizeof(idx) / sizeof(idx[0]); i++) {
+ KMDataNode* parent = NULL;
+ if( (rc = KMetadataOpenNodeUpdate(meta, &parent, "/FUSE")) == 0 ) {
+ KMDataNodeDropChild(parent, "root"); /* drop old stuff */
+ if( g_ungzip || strcmp(&idx[i].file[strlen(idx[i].file) - 3], ".gz") == 0 ) {
+ STSMSG(0, ("Preparing index %s", idx[i].index));
+ MD5StateInit(&idx[i].md5);
+ SLListInit(&idx[i].li);
+ KMDataNodeDropChild(parent, "%s.tmp", idx[i].file);
+ if( (rc = KMDataNodeOpenNodeUpdate(parent, &idx[i].meta, "%s.tmp", idx[i].file)) == 0 ) {
+ if( idx[i].func != NULL ) {
+ if( buffer == NULL ) {
+ if( (buffer = malloc(buffer_sz)) == NULL ) {
+ rc = RC(rcExe, rcIndex, rcConstructing, rcMemory, rcExhausted);
+ break;
+ }
+ }
+ rc = idx[i].func(stbl, &idx[i], buffer, buffer_sz);
+ if( rc == 0 ) {
+ MD5StateFinish(&idx[i].md5, idx[i].md5_digest);
+ rc = CommitIndex(ktbl, idx[i].index, &idx[i].li);
+ }
+ }
+ if( rc == 0 ) {
+ rc = WriteFileMeta(&idx[i]);
+ }
+ KMDataNodeRelease(idx[i].meta);
+ }
+ if( GetRCState(rc) == rcUnsupported ) {
+ KMDataNodeDropChild(parent, "%s", idx[i].file);
+ PLOGERR(klogWarn, (klogWarn, rc, "Index $(i) is not supported for this table", PLOG_S(i), idx[i].index));
+ rc = 0;
+ } else if( rc == 0 ) {
+ char f[4096];
+ strcpy(f, idx[i].file);
+ strcat(f, ".tmp");
+ KMDataNodeDropChild(parent, "%s", idx[i].file);
+ rc = KMDataNodeRenameChild(parent, f, idx[i].file);
+ }
+ } else if( !g_ungzip ) {
+ KTableDropIndex(ktbl, idx[i].index);
+ KMDataNodeDropChild(parent, "%s", idx[i].file);
+ }
+ KMDataNodeDropChild(parent, "%s.tmp", idx[i].file);
+ KMDataNodeRelease(parent);
+ }
+ SLListWhack(&idx[i].li, WhackIndexData, NULL);
+ }
+ free(buffer);
+ return rc;
+}
+
+const char* blocksize_usage[] = {"Index block size", NULL};
+const char* accession_usage[] = {"Accession", NULL};
+
+/* this enum must have same order as MainArgs array below */
+enum OptDefIndex {
+ eopt_BlockSize = 0,
+ eopt_Accession,
+ eopt_DumpIndex,
+ eopt_noGzip
+};
+
+OptDef MainArgs[] =
+{
+ /* if you change order in this array, rearrange enum above accordingly! */
+ {"block-size", "b", NULL, blocksize_usage, 1, true, false},
+ {"accession", "a", NULL, accession_usage, 1, true, false},
+ {"hidden-dump", "d", NULL, NULL, 1, false, false},
+ {"hidden-nogzip", "g", NULL, NULL, 1, false, false}
+};
+const char* MainParams[] =
+{
+ /* if you change order in this array, rearrange enum above accordingly! */
+ "size",
+ "accession",
+ NULL,
+ NULL
+};
+const size_t MainArgsQty = sizeof(MainArgs) / sizeof(MainArgs[0]);
+
+const char UsageDefaultName[] = "sra-makeidx";
+
+rc_t CC UsageSummary (const char * name)
+{
+ return 0;
+}
+
+rc_t CC Usage(const Args* args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+ int i;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ OUTMSG(( "\nUsage:\n\t%s [options] <table>\n\n", progname));
+
+ for(i = 0; i < MainArgsQty; i++ ) {
+ if( MainArgs[i].required && MainArgs[i].help ) {
+ HelpOptionLine(MainArgs[i].aliases, MainArgs[i].name, MainParams[i], MainArgs[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < MainArgsQty; i++ ) {
+ if( !MainArgs[i].required && MainArgs[i].help ) {
+ HelpOptionLine(MainArgs[i].aliases, MainArgs[i].name, MainParams[i], MainArgs[i].help);
+ }
+ }
+ OUTMSG(("\n"));
+ HelpOptionsStandard();
+ HelpVersion(fullpath, KAppVersion());
+ return rc;
+}
+rc_t KMain(int argc, char *argv[])
+{
+ rc_t rc = 0;
+ Args* args = NULL;
+ const char* errmsg = NULL, *table_dir = NULL;
+ char accn[1024];
+
+ if( (rc = ArgsMakeAndHandle(&args, argc, argv, 1, MainArgs, MainArgsQty)) == 0 ) {
+ const char* blksz = NULL;
+ uint32_t count, dump = 0, gzip = 0;
+
+ if( (rc = ArgsParamCount(args, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count > 1 ? rcExcessive : rcInsufficient);
+ errmsg = "table";
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_BlockSize].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_BlockSize].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_BlockSize].name, 0, (const void **)&blksz)) != 0 ) {
+ errmsg = MainArgs[eopt_BlockSize].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_Accession].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = MainArgs[eopt_Accession].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args, MainArgs[eopt_Accession].name, 0, (const void **)&g_accession)) != 0 ) {
+ errmsg = MainArgs[eopt_Accession].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_DumpIndex].name, &dump)) != 0 ) {
+ errmsg = MainArgs[eopt_DumpIndex].name;
+
+ } else if( (rc = ArgsOptionCount(args, MainArgs[eopt_noGzip].name, &gzip)) != 0 ) {
+ errmsg = MainArgs[eopt_noGzip].name;
+ }
+ while( rc == 0 ) {
+ long val = 0;
+ char* end = NULL;
+
+ if( blksz != NULL ) {
+ errno = 0;
+ val = strtol(blksz, &end, 10);
+ if( errno != 0 || blksz == end || *end != '\0' || val <= 0 ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ errmsg = MainArgs[eopt_BlockSize].name;
+ break;
+ } else if( val <= 128 || val > (1024 * 1024 * 1024) ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcEmpty);
+ errmsg = "block size invalid";
+ break;
+ }
+ g_file_block_sz = val;
+ }
+ if( (rc = ArgsParamValue(args, 0, (const void **)&table_dir)) != 0 ) {
+ errmsg = "table";
+ break;
+ }
+ if( g_accession == NULL ) {
+ const char* p = strchr(table_dir, '/');
+ size_t l = 0;
+
+ g_accession = accn;
+ if( p == NULL ) {
+ p = strchr(table_dir, '\\');
+ }
+ strncpy(accn, p == NULL ? table_dir : p + 1, sizeof(accn) - 1);
+ if( accn[0] == '\0' ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcEmpty);
+ errmsg = "accession";
+ }
+ l = strlen(accn);
+ if( accn[l - 1] == '/' || accn[l - 1] == '\\') {
+ accn[--l] = '\0';
+ }
+ if( strncmp(&accn[l - 9], ".lite.sra", 9) == 0 ) {
+ accn[l - 9] = '\0';
+ } else if( strncmp(&accn[l - 4], ".sra", 4) == 0 ) {
+ accn[l - 4] = '\0';
+ }
+ }
+ g_dump = dump > 0;
+ g_ungzip = gzip > 0;
+ break;
+ }
+ }
+ if( rc == 0 ) {
+ SRAMgr* smgr = NULL;
+ KDBManager* kmgr = NULL;
+
+ DEBUG_MSG(5, ("table %s, accession %s\n", table_dir, g_accession));
+ if( (rc = SRAMgrMakeUpdate(&smgr, NULL)) == 0 ) {
+ if( (rc = KDBManagerMakeUpdate(&kmgr, NULL)) == 0 ) {
+ bool relock = true;
+ if( (rc = KDBManagerUnlock(kmgr, table_dir)) != 0 ) {
+ relock = false;
+ rc = GetRCState(rc) == rcUnlocked ? 0 : rc;
+ } else {
+ PLOGMSG(klogInfo, (klogInfo, "Table $(p) locked, unlocking", PLOG_S(p), table_dir));
+ }
+ if( rc == 0 ) {
+ KTable* ktbl = NULL;
+ if( (rc = KDBManagerOpenTableUpdate(kmgr, &ktbl, table_dir)) == 0 ) {
+ KMetadata* meta = NULL;
+ if( (rc = KTableOpenMetadataUpdate(ktbl, &meta)) == 0 ) {
+ const SRATable* stbl = NULL;
+ if( (rc = SRAMgrOpenTableRead(smgr, &stbl, table_dir)) == 0 ) {
+ rc = MakeIndexes(stbl, ktbl, meta);
+ SRATableRelease(stbl);
+ }
+ }
+ KMetadataRelease(meta);
+ }
+ KTableRelease(ktbl);
+ }
+ if( rc == 0 && relock ) {
+ rc = KDBManagerLock(kmgr, table_dir);
+ }
+ KDBManagerRelease(kmgr);
+ }
+ SRAMgrRelease(smgr);
+ }
+ }
+ if( rc != 0 && rc != KLogLastErrorCode() ) {
+ if( errmsg ) {
+ Usage(args);
+ }
+ LOGERR(klogErr, rc, errmsg ? errmsg : "stop");
+ }
+ ArgsWhack(args);
+ return rc;
+}
diff --git a/tools/fuse/sra-node.c b/tools/fuse/sra-node.c
new file mode 100644
index 0000000..e138ef3
--- /dev/null
+++ b/tools/fuse/sra-node.c
@@ -0,0 +1,165 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <klib/rc.h>
+#include <kfs/directory.h>
+
+#include <sra/sradb-priv.h>
+
+typedef struct SRANode SRANode;
+#define FSNODE_IMPL SRANode
+
+#include "log.h"
+#include "xml.h"
+#include "sra-list.h"
+#include "formats.h"
+#include "kfile-accessor.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+struct SRANode {
+ FSNode node;
+ SRAConfigFlags flags;
+ const SRAListNode* sra;
+ const char* prefix;
+ size_t prefix_len;
+};
+
+static
+rc_t SRANode_HasChild(const SRANode* cself, const char* name, size_t name_len)
+{
+ rc_t rc = 0;
+
+ if( name == NULL || cself->prefix_len >= name_len || strncmp(cself->prefix, name, cself->prefix_len) != 0 ) {
+ rc = RC(rcExe, rcSRA, rcSearching, rcDirEntry, rcNotFound);
+ } else {
+ const FileOptions* opt;
+ rc = SRAListNode_GetType(cself->sra, cself->flags, &name[cself->prefix_len], &opt);
+ }
+ return rc;
+}
+
+static
+rc_t SRANode_Attr(const SRANode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL || strncmp(cself->prefix, subpath, cself->prefix_len) != 0 ) {
+ rc = RC(rcExe, rcSRA, rcEvaluating, rcDirEntry, rcInvalid);
+ } else {
+ const FileOptions* opt;
+ if( (rc = SRAListNode_GetType(cself->sra, cself->flags, &subpath[cself->prefix_len], &opt)) == 0 &&
+ (rc = SRAListNode_TableMTime(cself->sra, ts)) == 0 ) {
+ *type = kptFile;
+ *file_sz = opt->file_sz;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SRANode_Dir(const SRANode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ if( subpath != NULL ) {
+ return RC(rcExe, rcDirectory, rcListing, rcDirEntry, rcInvalid);
+ }
+ return SRAListNode_ListFiles(cself->sra, cself->prefix, cself->flags, func, data);
+}
+
+static
+rc_t SRANode_Open(const SRANode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( subpath == NULL || strncmp(cself->prefix, subpath, cself->prefix_len) != 0 ) {
+ rc = RC(rcExe, rcSRA, rcEvaluating, rcDirEntry, rcInvalid);
+ } else {
+ const FileOptions* opt;
+ if( (rc = SRAListNode_GetType(cself->sra, cself->flags, &subpath[cself->prefix_len], &opt)) == 0 ) {
+ const KFile* kf = NULL;
+ if( (rc = FileOptions_OpenFile(opt, cself->sra, &kf)) == 0 &&
+ (rc = KFileAccessor_Make(accessor, cself->prefix, kf)) != 0 ) {
+ ReleaseComplain(KFileRelease, kf);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t SRANode_Release(SRANode* self)
+{
+ if( self != NULL ) {
+ SRAListNode_Release(self->sra);
+ }
+ return 0;
+}
+
+static FSNode_vtbl SRANode_vtbl = {
+ sizeof(SRANode),
+ SRANode_HasChild,
+ NULL,
+ SRANode_Attr,
+ SRANode_Dir,
+ NULL,
+ SRANode_Open,
+ SRANode_Release
+};
+
+rc_t SRANode_Make(FSNode* parent, const char* prefix, const SRAListNode* sra, SRAConfigFlags flags)
+{
+ rc_t rc = 0;
+
+ if( parent == NULL || prefix == NULL || sra == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ SRANode* ff = NULL;
+ char buf[128];
+
+ strcpy(buf, "SRA-");
+ strcat(buf, prefix);
+ DEBUG_MSG(8, ("Adding %s\n", buf));
+ if( (rc = FSNode_Make((FSNode**)&ff, buf, &SRANode_vtbl)) == 0 ) {
+ ff->flags |= (flags & eSRAFuseFileArc) ? (eSRAFuseFmtArc | eSRAFuseFmtArcMD5) : 0;
+ ff->flags |= (flags & eSRAFuseFileArcLite) ? (eSRAFuseFmtArcLite | eSRAFuseFmtArcLiteMD5) : 0;
+ ff->flags |= (flags & eSRAFuseFileFastq) ? (eSRAFuseFmtFastq | eSRAFuseFmtFastqGz | eSRAFuseFmtFastqMD5) : 0;
+ ff->flags |= (flags & eSRAFuseFileSFF) ? (eSRAFuseFmtSFF | eSRAFuseFmtSFFGz | eSRAFuseFmtSFFMD5) : 0;
+ ff->prefix = prefix;
+ ff->prefix_len = strlen(prefix);
+ if( (rc = SRAListNode_AddRef(sra)) == 0 ) {
+ ff->sra = sra;
+ rc = FSNode_AddChild(parent, &ff->node);
+ }
+ if( rc != 0 ) {
+ FSNode_Release(&ff->node);
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/sra-node.h b/tools/fuse/sra-node.h
new file mode 100644
index 0000000..7ed2df8
--- /dev/null
+++ b/tools/fuse/sra-node.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_fuse_sra_node_
+#define _h_sra_fuse_sra_node_
+
+#include "node.h"
+
+rc_t SRANode_Make(FSNode* parent, const char* prefix, const SRAListNode* sra, SRAConfigFlags flags);
+
+#endif /* _h_sra_fuse_sra_node_ */
diff --git a/tools/fuse/sra-sff.c b/tools/fuse/sra-sff.c
new file mode 100644
index 0000000..ca2292f
--- /dev/null
+++ b/tools/fuse/sra-sff.c
@@ -0,0 +1,249 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <kproc/lock.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+
+#include <sra/sradb-priv.h>
+#include <sra/sff.h>
+
+#include "log.h"
+#include "xml.h"
+#include "sra-list.h"
+#include "sra-sff.h"
+#include "zlib-simple.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct SRASFFFile SRASFFFile;
+#define KFILE_IMPL SRASFFFile
+#include <kfs/impl.h>
+
+struct SRASFFFile {
+ KFile dad;
+ uint32_t buffer_sz;
+ uint64_t file_sz;
+ char* gzipped; /* serves as flag and a buffer */
+ KLock* lock;
+ const SRATable* stbl;
+ const KTable* ktbl;
+ const KIndex* kidx;
+ const SFFReader* reader;
+ /* current buf content */
+ uint64_t from;
+ uint64_t size;
+ char* buf;
+};
+
+static
+rc_t SRASFFFile_Destroy(SRASFFFile *self)
+{
+ if( KLockAcquire(self->lock) == 0 ) {
+ ReleaseComplain(SFFReaderWhack, self->reader);
+ ReleaseComplain(KIndexRelease, self->kidx);
+ ReleaseComplain(KTableRelease, self->ktbl);
+ ReleaseComplain(SRATableRelease, self->stbl);
+ FREE(self->buf < self->gzipped ? self->buf : self->gzipped);
+ ReleaseComplain(KLockUnlock, self->lock);
+ ReleaseComplain(KLockRelease, self->lock);
+ FREE(self);
+ }
+ return 0;
+}
+
+static
+struct KSysFile* SRASFFFile_GetSysFile(const SRASFFFile *self, uint64_t *offset)
+{
+ *offset = 0;
+ return NULL;
+}
+
+static
+rc_t SRASFFFile_RandomAccess(const SRASFFFile *self)
+{
+ return 0;
+}
+
+static
+uint32_t SRASFFFile_Type(const SRASFFFile *self)
+{
+ return kfdFile;
+}
+
+static
+rc_t SRASFFFile_Size(const SRASFFFile *self, uint64_t *size)
+{
+ *size = self->file_sz;
+ return 0;
+}
+
+static
+rc_t SRASFFFile_SetSize(SRASFFFile *self, uint64_t size)
+{
+ return RC(rcExe, rcFile, rcUpdating, rcInterface, rcUnsupported);
+}
+
+static
+rc_t SRASFFFile_Read(const SRASFFFile* self, uint64_t pos, void *buffer, size_t size, size_t *num_read)
+{
+ rc_t rc = 0;
+
+ if( pos >= self->file_sz ) {
+ *num_read = 0;
+ } else if( (rc = KLockAcquire(self->lock)) == 0 ) {
+ do {
+ if( pos < self->from || pos >= (self->from + self->size) ) {
+ int64_t id = 0;
+ uint64_t id_qty = 0;
+ DEBUG_MSG(8, ("Caching for pos %lu %lu bytes to go\n", pos, size - *num_read));
+ if( (rc = KIndexFindU64(self->kidx, pos, &((SRASFFFile*)self)->from, &((SRASFFFile*)self)->size, &id, &id_qty)) == 0 ) {
+ DEBUG_MSG(10, ("Caching from %lu:%lu %lu bytes\n", self->from, self->from + self->size - 1, self->size));
+ DEBUG_MSG(10, ("Caching spot &ld %lu spots\n", id, id_qty));
+ if( (rc = SFFReaderSeekSpot(self->reader, id)) == 0 ) {
+ size_t inbuf = 0, w = 0;
+ char* b = self->buf;
+ uint64_t left = self->buffer_sz;
+ do {
+ if( id == 1 ) {
+ if( (rc = SFFReaderHeader(self->reader, 0, b, left, &w)) != 0 ) {
+ break;
+ }
+ b += w; left -= w; inbuf += w;
+ DEBUG_MSG(10, ("SFF header cached %lu bytes\n", inbuf));
+ }
+ if( (rc = SFFReader_GetCurrentSpotData(self->reader, b, left, &w)) != 0 ) {
+ break;
+ }
+ b += w; left -= w; inbuf += w; --id_qty;
+ DEBUG_MSG(10, ("SFF spot %ld cached %u bytes\n", id, inbuf));
+ id++;
+ } while( id_qty > 0 && (rc = SFFReaderNextSpot(self->reader)) == 0);
+ if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcExhausted ) {
+ DEBUG_MSG(10, ("No more rows\n"));
+ rc = 0;
+ }
+ DEBUG_MSG(8, ("Cached %u bytes\n", inbuf));
+ if( self->gzipped != NULL ) {
+ size_t compressed = 0;
+ if( (rc = ZLib_DeflateBlock(self->buf, inbuf, self->gzipped, self->buffer_sz, &compressed)) == 0 ) {
+ char* b = self->buf;
+ ((SRASFFFile*)self)->buf = self->gzipped;
+ ((SRASFFFile*)self)->gzipped = b;
+ ((SRASFFFile*)self)->size = compressed;
+ DEBUG_MSG(8, ("gzipped %lu bytes\n", self->size));
+ }
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ off_t from = pos - self->from;
+ size_t q = (self->size - from) > (size - *num_read) ? (size - *num_read) : (self->size - from);
+ DEBUG_MSG(10, ("Copying from %lu %u bytes\n", from, q));
+ memmove(&((char*)buffer)[*num_read], &self->buf[from], q);
+ *num_read = *num_read + q;
+ pos += q;
+ }
+ } while( rc == 0 && *num_read < size && pos < self->file_sz );
+ ReleaseComplain(KLockUnlock, self->lock);
+ }
+ return rc;
+}
+
+static
+rc_t SRASFFFile_Write(SRASFFFile *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ)
+{
+ return RC(rcExe, rcFile, rcWriting, rcInterface, rcUnsupported);
+}
+
+static KFile_vt_v1 SRASFFFile_vtbl = {
+ 1, 1,
+ SRASFFFile_Destroy,
+ SRASFFFile_GetSysFile,
+ SRASFFFile_RandomAccess,
+ SRASFFFile_Size,
+ SRASFFFile_SetSize,
+ SRASFFFile_Read,
+ SRASFFFile_Write,
+ SRASFFFile_Type
+};
+
+rc_t SRASFFFile_Open(const KFile** cself, const SRAListNode* sra, const FileOptions* opt)
+{
+ rc_t rc = 0;
+ SRASFFFile* self;
+
+ CALLOC( self, 1, sizeof( *self ) );
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcConstructing, rcMemory, rcExhausted );
+ }
+ else
+ {
+ if ( ( rc = KFileInit(&self->dad, (const KFile_vt*)&SRASFFFile_vtbl, "SRASFFFile", "no-name", true, false ) ) == 0 )
+ {
+ if ( ( rc = SRAListNode_TableOpen( sra, &self->stbl ) ) == 0 )
+ {
+ if ( ( rc = SRATableGetKTableRead( self->stbl, &self->ktbl ) ) == 0 )
+ {
+ if ( ( rc = KTableOpenIndexRead( self->ktbl, &self->kidx, opt->index ) ) == 0 )
+ {
+ if ( ( rc = KLockMake( &self->lock ) ) == 0 )
+ {
+ MALLOC( self->buf, opt->buffer_sz * ( opt->f.sff.gzip ? 2 : 1 ) );
+ if ( self->buf == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcOpening, rcMemory, rcExhausted );
+ }
+ else
+ {
+ self->file_sz = opt->file_sz;
+ self->buffer_sz = opt->buffer_sz;
+ if ( opt->f.sff.gzip )
+ {
+ self->gzipped = &self->buf[ opt->buffer_sz ];
+ }
+ self->from = ~0; /* reset position beyond file end */
+ rc = SFFReaderMake( &self->reader, self->stbl, opt->f.sff.accession, opt->f.sff.minSpotId, opt->f.sff.maxSpotId );
+ }
+ }
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ *cself = &self->dad;
+ }
+ else
+ {
+ KFileRelease( &self->dad );
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/sra-sff.h b/tools/fuse/sra-sff.h
new file mode 100644
index 0000000..0c00e60
--- /dev/null
+++ b/tools/fuse/sra-sff.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_fuse_sra_sff_
+#define _h_sra_fuse_sra_sff_
+
+#include "node.h"
+
+rc_t SRASFFFile_Open(const KFile** cself, const SRAListNode* sra, const FileOptions* opt);
+
+#endif /* _h_sra_fuse_sra_sff_ */
diff --git a/tools/fuse/tar-file.c b/tools/fuse/tar-file.c
new file mode 100644
index 0000000..df7fc6b
--- /dev/null
+++ b/tools/fuse/tar-file.c
@@ -0,0 +1,127 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <kfs/file.h>
+
+#include <stdlib.h>
+
+#include "log.h"
+#include "tar-list.h"
+#include "tar-file.h"
+
+typedef struct TarFile TarFile;
+#define KFILE_IMPL TarFile
+#include <kfs/impl.h>
+
+struct TarFile {
+ KFile dad;
+ const TarFileList* list;
+};
+
+static
+rc_t TarFile_Destroy(TarFile *self)
+{
+ TarFileList_Release(self->list);
+ FREE(self);
+ return 0;
+}
+
+static
+struct KSysFile* TarFile_GetSysFile(const TarFile *self, uint64_t *offset)
+{
+ *offset = 0;
+ return NULL;
+}
+
+static
+rc_t TarFile_RandomAccess(const TarFile *self)
+{
+ return 0;
+}
+
+static
+uint32_t TarFile_Type(const TarFile *self)
+{
+ return kfdFile;
+}
+
+static
+rc_t TarFile_Size(const TarFile *self, uint64_t *size)
+{
+ return TarFileList_Size(self->list, size);
+}
+
+static
+rc_t TarFile_SetSize(TarFile *self, uint64_t size)
+{
+ return RC(rcExe, rcFile, rcUpdating, rcInterface, rcUnsupported);
+}
+
+static
+rc_t TarFile_Read(const TarFile* self, uint64_t pos, void *buffer, size_t size, size_t *num_read)
+{
+ return TarFileList_Read(self->list, pos, buffer, size, num_read);
+}
+
+static
+rc_t TarFile_Write(TarFile *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ)
+{
+ return RC(rcExe, rcFile, rcWriting, rcInterface, rcUnsupported);
+}
+
+static KFile_vt_v1 TarFile_vtbl = {
+ 1, 1,
+ TarFile_Destroy,
+ TarFile_GetSysFile,
+ TarFile_RandomAccess,
+ TarFile_Size,
+ TarFile_SetSize,
+ TarFile_Read,
+ TarFile_Write,
+ TarFile_Type
+};
+
+rc_t TarFile_Open( const KFile** cself, const TarFileList* list )
+{
+ rc_t rc = 0;
+ TarFile* self;
+
+ CALLOC(self, 1, sizeof(*self));
+
+ if ( self == NULL )
+ {
+ rc = RC(rcExe, rcFile, rcConstructing, rcMemory, rcExhausted);
+ }
+ else if ( ( rc = KFileInit( &self->dad, (const KFile_vt*)&TarFile_vtbl, "TarFile", "no-name", true, false ) ) == 0 &&
+ ( rc = TarFileList_Open( list ) ) == 0 )
+ {
+ self->list = list;
+ *cself = &self->dad;
+ }
+ else
+ {
+ KFileRelease( &self->dad );
+ }
+ return rc;
+}
diff --git a/tools/fuse/tar-file.h b/tools/fuse/tar-file.h
new file mode 100644
index 0000000..b720161
--- /dev/null
+++ b/tools/fuse/tar-file.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_tar_file_
+#define _h_sra_fuse_tar_file_
+
+#include "node.h"
+
+rc_t TarFile_Open(const KFile** cself, const TarFileList* list);
+
+#endif /* _h_sra_fuse_tar_file_ */
diff --git a/tools/fuse/tar-list.c b/tools/fuse/tar-list.c
new file mode 100644
index 0000000..7b06e23
--- /dev/null
+++ b/tools/fuse/tar-list.c
@@ -0,0 +1,598 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/refcount.h>
+#include <kproc/lock.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include "log.h"
+#include "tar-list.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+typedef enum ETar_Format {
+ eTar_Unknown = 0,
+ eTar_Legacy = 1,
+ eTar_OldGNU = 2,
+ eTar_Ustar = 4,
+ eTar_Posix = 5
+} ETar_Format;
+
+/* POSIX "ustar" tar archive member header */
+typedef struct SHeader {
+ char name[100];
+ char mode[8];
+ char uid[8];
+ char gid[8];
+ char size[12];
+ char mtime[12];
+ char checksum[8];
+ char typeflag[1];
+ char linkname[100];
+ char magic[6];
+ char version[2];
+ char uname[32];
+ char gname[32];
+ char devmajor[8];
+ char devminor[8];
+ union {
+ char prefix[155]; /* not valid with old GNU format */
+ struct { /* old GNU format only */
+ char atime[12];
+ char ctime[12];
+ } gt;
+ } x;
+} SHeader;
+
+#define TAR_BLOCK_SIZE (512)
+#define TAR_TAIL_PAD (TAR_BLOCK_SIZE * 2)
+#define TAR_BLOCK_PAD (TAR_BLOCK_SIZE * 20)
+
+union TarBlock {
+ char buffer[TAR_BLOCK_SIZE];
+ SHeader header;
+};
+
+typedef struct TarEntry {
+ BSTNode node;
+ const char* path;
+ const char* name;
+ uint64_t size;
+ KTime_t mtime;
+ bool executable;
+ int16_t name_fmt; /* 0 - fits, +n - split, -n n-blocks */
+ /* file chunks offsets within archive */
+ /* file_header block(s) | file itself | padding to 512 block size */
+ uint64_t start, data, pad, end;
+} TarEntry;
+
+
+static
+void TarEntry_Init(const TarEntry* entry, uint64_t offset, const char* path, const char* name, uint64_t size, KTime_t mtime, bool executable)
+{
+ SHeader* h = NULL;
+ size_t nlen = strlen(name), alloc = 0;
+ TarEntry* e = (TarEntry*)entry;
+
+ e->name = name;
+ e->path = path;
+ e->size = size;
+ e->mtime = mtime;
+ e->executable = executable;
+
+ if(nlen <= sizeof(h->name)) {
+ /* Name fits! */
+ alloc = 1;
+ e->name_fmt = 0;
+ } else if( nlen <= sizeof(h->x.prefix) + 1 + sizeof(h->name) ) {
+ /* Try to split the long name into a prefix and a short name (POSIX) */
+ size_t split = nlen;
+ if(split > sizeof(h->x.prefix)) {
+ split = sizeof(h->x.prefix);
+ }
+ while(split > 0 && e->name[--split] != '/');
+ if(split && nlen - split <= sizeof(h->name) + 1) {
+ alloc = 1;
+ e->name_fmt = split;
+ }
+ }
+ if( alloc == 0 ) {
+ nlen++;
+ /* 2 pieces: 1st long file name header block + name block(s) and second actual file header block */
+ alloc = nlen / TAR_BLOCK_SIZE;
+ alloc += (nlen % TAR_BLOCK_SIZE) ? 1 : 0;
+ alloc += 2;
+ e->name_fmt = -alloc;
+ }
+ e->start = offset;
+ e->data = e->start + alloc * TAR_BLOCK_SIZE;
+ e->pad = e->data + e->size;
+ e->end = e->size % TAR_BLOCK_SIZE;
+ if( e->end != 0 ) {
+ e->end = e->pad + (TAR_BLOCK_SIZE - e->end) - 1;
+ } else {
+ e->end = e->pad - 1;
+ }
+}
+
+/* Convert a number to an octal string padded to the left
+ with [leading] zeros ('0') and having _no_ trailing '\0'. */
+static
+bool TarEntry_NumToOctal(unsigned long val, char* ptr, size_t len)
+{
+ do {
+ ptr[--len] = '0' + (char)(val & 7);
+ val >>= 3;
+ } while(len);
+ return val ? false : true;
+}
+
+static
+bool TarEntry_NumToBase256(uint64_t val, char* ptr, size_t len)
+{
+ do {
+ ptr[--len] = (unsigned char)(val & 0xFF);
+ val >>= 8;
+ } while(len);
+ *ptr |= '\x80'; /* set base-256 encoding flag */
+ return val ? false : true;
+}
+
+
+/* Return 0 (false) if conversion failed; 1 if the value converted to
+ conventional octal representation (perhaps, with terminating '\0'
+ sacrificed), or -1 if the value converted using base-256. */
+static
+int TarEntry_EncodeUint64(uint64_t val, char* ptr, size_t len)
+{
+ if((unsigned long) val == val) {
+ /* Max file size: */
+ if(TarEntry_NumToOctal((unsigned long) val, ptr, len)) {
+ /* 8GB - 1 */
+ return 1;
+ }
+ if(TarEntry_NumToOctal((unsigned long) val, ptr, ++len)) {
+ /* 64GB - 1 */
+ return 1;
+ }
+ }
+ if(TarEntry_NumToBase256(val, ptr, len)) {
+ /* up to 2^94-1 */
+ return -1;
+ }
+ return 0;
+}
+
+static
+bool TarEntry_TarChecksum(TarBlock* block, bool isgnu)
+{
+ SHeader* h = &block->header;
+ size_t i, len = sizeof(h->checksum) - (isgnu ? 2 : 1);
+ unsigned long checksum = 0;
+ const unsigned char* p = (const unsigned char*)block->buffer;
+
+ /* Compute the checksum */
+ memset(h->checksum, ' ', sizeof(h->checksum));
+ for(i = 0; i < sizeof(block->buffer); i++) {
+ checksum += *p++;
+ }
+ /* ustar: '\0'-terminated checksum
+ GNU special: 6 digits, then '\0', then a space [already in place] */
+ if(!TarEntry_NumToOctal(checksum, h->checksum, len)) {
+ return false;
+ }
+ h->checksum[len] = '\0';
+ return true;
+}
+
+static
+rc_t TarEntry_PackName(const TarEntry* e, TarBlock* block)
+{
+ SHeader* h = &block[0].header;
+
+ if( e->name_fmt == 0 ) {
+ strcpy(h->name, e->name);
+ } else if( e->name_fmt > 0 ) {
+ /* to split the long name into a prefix and a short name (POSIX) */
+ memmove(h->x.prefix, e->name, e->name_fmt);
+ memmove(h->name, e->name + e->name_fmt + 1, strlen(e->name) - e->name_fmt - 1);
+ } else {
+ strcpy(h->name, "././@LongLink");
+ TarEntry_NumToOctal(0, h->mode, sizeof(h->mode) - 1);
+ TarEntry_NumToOctal(0, h->uid, sizeof(h->uid) - 1);
+ TarEntry_NumToOctal(0, h->gid, sizeof(h->gid) - 1);
+ /* write terminating '\0' as it can always be made to fit in */
+ if(!TarEntry_EncodeUint64(strlen(e->name) + 1, h->size, sizeof(h->size) - 1)) {
+ return RC(rcExe, rcArc, rcConstructing, rcId, rcOutofrange);
+ }
+ TarEntry_NumToOctal(0, h->mtime, sizeof(h->mtime)- 1);
+ h->typeflag[0] = 'L';
+ /* Old GNU magic protrudes into adjacent version field */
+ memmove(h->magic, "ustar ", 8); /* 2 spaces and '\0'-terminated */
+ TarEntry_TarChecksum(block, true);
+ strcpy((char*)(&block[1]), e->name);
+
+ /* Still, store the initial part in the original header */
+ h = &block[-e->name_fmt - 1].header;
+ memmove(h->name, e->name, sizeof(h->name));
+ }
+ return 0;
+}
+
+static
+rc_t TarEntry_Header(const TarEntry* e, TarBlock* block)
+{
+ rc_t rc = 0;
+ /* Update format as we go */
+
+ ETar_Format fmt = eTar_Ustar;
+ int ok;
+ do {
+ uint32_t size = e->name_fmt < 0 ? -e->name_fmt : 1;
+ SHeader* h = &block[size - 1].header;
+ memset(block, 0, sizeof(*block) * size);
+ if( (rc = TarEntry_PackName(e, block)) != 0 ) {
+ break;
+ }
+ if( !TarEntry_NumToOctal(e->executable ? 00755 : 00644, h->mode, sizeof(h->mode) - 1) ) {
+ rc = RC(rcExe, rcArc, rcConstructing, rcData, rcInvalid);
+ break;
+ }
+ TarEntry_EncodeUint64(0, h->uid, sizeof(h->uid) - 1);
+ TarEntry_EncodeUint64(0, h->gid, sizeof(h->gid) - 1);
+
+ ok = TarEntry_EncodeUint64(e->size, h->size, sizeof(h->size) - 1);
+ if(!ok) {
+ rc = RC(rcExe, rcArc, rcConstructing, rcFile, rcTooBig);
+ break;
+ }
+ if(ok < 0) {
+ fmt = eTar_OldGNU;
+ }
+ if(fmt != eTar_Ustar && h->x.prefix[0]) {
+ /* cannot downgrade to reflect encoding */
+ fmt = eTar_Ustar;
+ }
+ /* Modification time */
+ if (!TarEntry_NumToOctal(e->mtime, h->mtime, sizeof(h->mtime) - 1)) {
+ rc = RC(rcExe, rcArc, rcConstructing, rcId, rcOutofrange);
+ break;
+ }
+ /* limited version: expect only normal files !!! */
+ h->typeflag[0] = '0';
+ /* User and group */
+ memmove(h->uname, "anyone", 6);
+ /* memmove(h->gname, "?????", 5); */
+
+ /* Device nos to complete the ustar header protocol (all fields ok) */
+ if( fmt != eTar_OldGNU ) {
+ TarEntry_NumToOctal(0, h->devmajor, sizeof(h->devmajor) - 1);
+ TarEntry_NumToOctal(0, h->devminor, sizeof(h->devminor) - 1);
+ }
+ if(fmt != eTar_OldGNU) {
+ /* Magic */
+ strcpy(h->magic, "ustar");
+ /* Version (EXCEPTION: not '\0' terminated) */
+ memmove(h->version, "00", 2);
+ } else {
+ /* Old GNU magic protrudes into adjacent version field */
+ memmove(h->magic, "ustar ", 8); /* 2 spaces and '\0'-terminated */
+ }
+
+ if( !TarEntry_TarChecksum(&block[size - 1], fmt == eTar_OldGNU ? true : false) ) {
+ rc = RC(rcExe, rcArc, rcConstructing, rcId, rcOutofrange);
+ }
+ } while(false);
+ return rc;
+}
+
+static
+rc_t TarEntry_Read(const TarEntry* entry, TarBlock* header_buf, const KFile* kfile, uint64_t pos, uint8_t* buffer, const size_t size, size_t* num_read)
+{
+ rc_t rc = 0;
+
+ if( pos < entry->data ) {
+ /* insert tar header */
+ if( (rc = TarEntry_Header(entry, header_buf)) == 0 ) {
+ size_t q = entry->data - pos;
+ if( q > (size - *num_read) ) {
+ q = size - *num_read;
+ }
+ memmove(&buffer[*num_read], &header_buf->buffer[pos - entry->start], q);
+ *num_read = *num_read + q;
+ pos += q;
+ DEBUG_LINE(8, "header: %u bytes", q);
+ }
+ }
+ if( rc == 0 && *num_read < size && pos < entry->pad ) {
+ /* read file data */
+ size_t rd;
+ if( (rc = KFileRead(kfile, pos - entry->data, &buffer[*num_read], size - *num_read, &rd)) == 0 ) {
+ DEBUG_LINE(8, "file: from %lu %u bytes", pos - entry->data, rd);
+ *num_read = *num_read + rd;
+ pos += rd;
+ }
+ }
+ if( rc == 0 && *num_read < size && pos <= entry->end ) {
+ /* pad last block with 0 */
+ size_t q = entry->end - pos + 1;
+ if( q > (size - *num_read) ) {
+ q = size - *num_read;
+ }
+ memset(&buffer[*num_read], 0, q);
+ *num_read = *num_read + q;
+ DEBUG_LINE(8, "padding: %u bytes", q);
+ }
+ return rc;
+}
+
+struct TarFileList {
+ KRefcount refcount;
+ const TarEntry* files;
+ uint32_t count;
+ uint32_t max_count;
+ uint64_t tar_sz;
+ uint16_t tar_10k_pad;
+ char* strings;
+ uint64_t strings_avail;
+ /* used to setup cache in file */
+ uint16_t max_header_blocks;
+ /* current file data/cache */
+ KLock* lock;
+ BSTree btree;
+ TarBlock* header_buf;
+ const TarEntry* cur_entry;
+ const KFile* cur_file;
+};
+
+rc_t TarFileList_Make(const TarFileList** cself, uint32_t max_file_count, const char* name)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || max_file_count == 0 ) {
+ rc = RC(rcExe, rcArc, rcConstructing, rcParam, rcInvalid);
+ } else {
+ TarFileList* l = NULL;
+ uint64_t strings_sz = max_file_count * 2048;
+ *cself = NULL;
+ CALLOC(l, 1, sizeof(*l) + max_file_count * sizeof(*(l->files)) + strings_sz);
+ if( l == NULL ) {
+ /* allocate self + array of entries + 1024 for path and name */
+ rc = RC(rcExe, rcArc, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = KLockMake(&l->lock)) == 0 ) {
+ KRefcountInit(&l->refcount, 1, "TarFileList", "Make", name);
+ l->max_count = max_file_count;
+ l->tar_sz = TAR_TAIL_PAD;
+ l->files = (TarEntry*)&l[1]; /* files array follows self */
+ l->strings_avail = strings_sz;
+ l->strings = (char*)&l->files[l->max_count]; /* string table follows last entry */
+ l->max_header_blocks = 1;
+ *cself = l;
+ }
+ }
+ return rc;
+}
+
+void TarFileList_Release(const TarFileList* cself)
+{
+ if( cself != NULL ) {
+ TarFileList* self = (TarFileList*)cself;
+ if( KLockAcquire(self->lock) == 0 ) {
+ int x = KRefcountDropDep(&self->refcount, "TarFileList");
+ if( atomic32_read(&self->refcount) < 2 ) {
+ self->cur_entry = NULL;
+ ReleaseComplain(KFileRelease, self->cur_file);
+ self->cur_file = NULL;
+ }
+ if( x == krefWhack ) {
+ KRefcountWhack(&self->refcount, "TarFileList");
+ FREE(self->header_buf);
+ BSTreeWhack(&self->btree, NULL, NULL);
+ ReleaseComplain(KLockUnlock, self->lock);
+ ReleaseComplain(KLockRelease, self->lock);
+ FREE(self);
+ } else {
+ ReleaseComplain(KLockUnlock, self->lock);
+ }
+ }
+ }
+}
+
+rc_t TarFileList_Add(const TarFileList* cself, const char* path, const char* name, uint64_t size, KTime_t mtime, bool executable)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || path == NULL || name == NULL ) {
+ rc = RC(rcExe, rcArc, rcRegistering, rcParam, rcInvalid);
+ } else if( (rc = KLockAcquire(cself->lock)) == 0 ) {
+ if( cself->count >= cself->max_count ) {
+ rc = RC(rcExe, rcArc, rcRegistering, rcDirEntry, rcExcessive);
+ } else if( cself->header_buf != NULL ) {
+ rc = RC(rcExe, rcArc, rcRegistering, rcDirEntry, rcReadonly);
+ } else {
+ TarFileList* self = (TarFileList*)cself;
+ size_t lp = strlen(path) + 1, ln = strlen(name) + 1;
+
+ if( lp + ln >= cself->strings_avail ) {
+ rc = RC(rcExe, rcArc, rcRegistering, rcName, rcExcessive);
+ } else {
+ const TarEntry* e = &cself->files[cself->count];
+
+ /* copy path/name to internal buffer */
+ strncpy(cself->strings, path, lp);
+ path = cself->strings;
+ self->strings += lp;
+ self->strings_avail -= lp;
+ strncpy(cself->strings, name, ln);
+ name = cself->strings;
+ self->strings += ln;
+ self->strings_avail -= ln;
+
+ TarEntry_Init(e, cself->tar_sz - TAR_TAIL_PAD, path, name, size, mtime, executable);
+ self->tar_sz += e->end - e->start + 1;
+ self->tar_10k_pad = self->tar_sz % TAR_BLOCK_PAD;
+ if( self->tar_10k_pad != 0 ) {
+ self->tar_10k_pad = TAR_BLOCK_PAD - self->tar_10k_pad;
+ }
+ if( e->name_fmt < 0 && cself->max_header_blocks < -e->name_fmt ) {
+ self->max_header_blocks = -e->name_fmt;
+ }
+ self->count++;
+ }
+ }
+ ReleaseComplain(KLockUnlock, cself->lock);
+ }
+ return rc;
+}
+
+rc_t TarFileList_Size(const TarFileList* cself, uint64_t* file_sz)
+{
+ if( cself == NULL || file_sz == NULL ) {
+ return RC(rcExe, rcArc, rcAccessing, rcParam, rcInvalid);
+ }
+ *file_sz = cself->tar_sz + cself->tar_10k_pad;
+ return 0;
+}
+
+static
+int64_t TarFileList_Sort(const BSTNode *item, const BSTNode *node)
+{
+ const TarEntry* i = (const TarEntry*)item;
+ const TarEntry* n = (const TarEntry*)node;
+
+ if( i->start > n->end ) {
+ return 1;
+ } else if( i->end < n->start ) {
+ return -1;
+ }
+ /* fails on insert! */
+ return 0;
+}
+
+rc_t TarFileList_Open(const TarFileList* cself)
+{
+ rc_t rc = 0;
+ if( cself == NULL ) {
+ rc = RC(rcExe, rcArc, rcOpening, rcParam, rcInvalid);
+ } else if( (rc = KLockAcquire(cself->lock)) == 0 ) {
+ TarFileList* self = (TarFileList*)cself;
+ if( self->header_buf == NULL ) {
+ MALLOC(self->header_buf, self->max_header_blocks * TAR_BLOCK_SIZE);
+ if( self->header_buf == NULL ) {
+ rc = RC(rcExe, rcArc, rcOpening, rcMemory, rcExhausted);
+ } else {
+ /* build file offset search tree */
+ uint32_t i;
+ BSTreeInit(&self->btree);
+ /* adjust last file size to include archive-end of 2 512 blocks + 10k block padding */
+ ((TarEntry*)(self->files + self->count - 1))->end += TAR_TAIL_PAD + self->tar_10k_pad;
+ self->tar_sz += self->tar_10k_pad;
+ self->tar_10k_pad = 0;
+ for(i = 0; rc == 0 && i < self->count; i++) {
+ rc = BSTreeInsertUnique(&self->btree, (BSTNode*)&self->files[i].node, NULL, TarFileList_Sort);
+ }
+ }
+ }
+ if( rc == 0 && KRefcountAddDep(&self->refcount, "TarFileList") != krefOkay ) {
+ rc = RC(rcExe, rcArc, rcOpening, rcRefcount, rcFailed);
+ }
+ ReleaseComplain(KLockUnlock, cself->lock);
+ }
+ return rc;
+}
+
+static
+int64_t TarFileList_Find(const void *item, const BSTNode *node)
+{
+ uint64_t pos = *(uint64_t*)item;
+ const TarEntry* n = (const TarEntry*)node;
+ if( pos < n->start ) {
+ return -1;
+ } else if( pos > n->end ) {
+ return 1;
+ }
+ return 0;
+}
+
+rc_t TarFileList_Read(const TarFileList* cself, uint64_t pos, uint8_t* buffer, size_t size, size_t* num_read)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL ) {
+ rc = RC(rcExe, rcArc, rcReading, rcParam, rcInvalid);
+ } else if( (rc = KLockAcquire(cself->lock)) == 0 ) {
+ *num_read = 0;
+ if( cself->header_buf == NULL ) {
+ rc = RC(rcExe, rcArc, rcReading, rcBuffer, rcNull);
+ } else if( pos < cself->tar_sz ) {
+ while( rc == 0 && *num_read < size && pos < cself->tar_sz ) {
+ if( cself->cur_entry == NULL || pos < cself->cur_entry->start || pos > cself->cur_entry->end ) {
+ KFileRelease(cself->cur_file);
+ ((TarFileList*)cself)->cur_entry = (const TarEntry*)BSTreeFind(&cself->btree, &pos, TarFileList_Find);
+ if( cself->cur_entry != NULL ) {
+ KDirectory* dir;
+ DEBUG_LINE(8, "Open: '%s'", cself->cur_entry->path);
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ if( (rc = KDirectoryOpenFileRead(dir, &((TarFileList*)cself)->cur_file, "%s", cself->cur_entry->path)) == 0 ) {
+ uint64_t size = 0;
+ if( (rc = KFileSize(cself->cur_file, &size)) == 0 ) {
+ if( cself->cur_entry->size != size ) {
+ rc = RC(rcExe, rcArc, rcReading, rcFileDesc, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "Source file size differ in XML $(p)", PLOG_S(p), cself->cur_entry->path));
+ }
+ }
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "$(p)", PLOG_S(p), cself->cur_entry->path));
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ } else {
+ rc = RC(rcExe, rcArc, rcReading, rcOffset, rcInvalid);
+ }
+ }
+ if( rc == 0 ) {
+ size_t rd = *num_read;
+ DEBUG_LINE(8, "Reading: '%s'", cself->cur_entry->path);
+ if( (rc = TarEntry_Read(cself->cur_entry, cself->header_buf, cself->cur_file, pos, buffer, size, num_read)) == 0 ) {
+ DEBUG_LINE(8, "read: %u bytes", *num_read);
+ pos += *num_read - rd;
+ }
+ }
+ }
+ }
+ ReleaseComplain(KLockUnlock, cself->lock);
+#if _DEBUGGING
+ if( rc == 0 && size < *num_read ) {
+ PLOGERR(klogErr, (klogErr, RC(rcExe, rcArc, rcReading, rcData, rcTooLong),
+ "file $(f) at pos $(p): $(s) < $(n)", "p=%lu,s=%lu,n=%lu,f=%s", pos, size, *num_read, cself->cur_entry->path));
+ }
+#endif
+ }
+ return rc;
+}
diff --git a/tools/fuse/tar-list.h b/tools/fuse/tar-list.h
new file mode 100644
index 0000000..7fcfbea
--- /dev/null
+++ b/tools/fuse/tar-list.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_tar_list_
+#define _h_sra_fuse_tar_list_
+
+#include <klib/rc.h>
+
+#define TAR_BLOCK_SIZE (512)
+
+typedef union TarBlock TarBlock;
+
+typedef struct TarFileList TarFileList;
+
+rc_t TarFileList_Make(const TarFileList** cself, uint32_t max_file_count, const char* name);
+
+void TarFileList_Release(const TarFileList* cself);
+
+rc_t TarFileList_Add(const TarFileList* cself, const char* path, const char* name, uint64_t size, KTime_t mtime, bool executable);
+
+rc_t TarFileList_Size(const TarFileList* cself, uint64_t* file_sz);
+
+rc_t TarFileList_Open(const TarFileList* cself);
+
+rc_t TarFileList_Read(const TarFileList* cself, uint64_t pos, uint8_t* buffer, size_t size, size_t* num_read);
+
+#endif /* _h_sra_fuse_tar_list_ */
diff --git a/tools/fuse/tar-node.c b/tools/fuse/tar-node.c
new file mode 100644
index 0000000..e469a87
--- /dev/null
+++ b/tools/fuse/tar-node.c
@@ -0,0 +1,320 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+typedef struct TarNode TarNode;
+#define FSNODE_IMPL TarNode
+
+#include "log.h"
+#include "xml.h"
+#include "tar-node.h"
+#include "tar-list.h"
+#include "tar-file.h"
+#include "kfile-accessor.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+struct TarNode {
+ FSNode node;
+ const TarFileList* files;
+ const char* rel_path;
+ /* used only in case of auto-detected .tar.xml file */
+ KTime_t mtime;
+ const char* xml_path;
+};
+
+static
+rc_t TarNode_MakeFileList(const KXMLNode* xml_node, const TarFileList** files, char* errmsg, const char* rel_path, const char* name)
+{
+ rc_t rc = 0;
+ time_t now = time(NULL);
+ uint32_t count = 0;
+
+ *files = NULL;
+ if( (rc = KXMLNodeCountChildNodes(xml_node, &count)) == 0 ) {
+ if( count == 0 ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcData, rcEmpty);
+ } else if( (rc = TarFileList_Make(files, count, name)) == 0 ) {
+ uint32_t i = 0;
+ while(rc == 0 && i < count) {
+ const KXMLNode* n = NULL;
+ const char* n_name;
+ if( (rc = KXMLNodeGetNodeRead(xml_node, &n, i++)) == 0 && (rc = KXMLNodeElementName(n, &n_name)) == 0 ) {
+ if( strcmp(n_name, "Item") != 0 ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcNode, rcUnexpected);
+ strcpy(errmsg, n_name);
+ } else {
+ size_t sz_read;
+ char path[4096], name[4096];
+ KTime_t ts = now;
+ uint64_t fsz = 0;
+ bool exec = false;
+
+ if( (rc = KXMLNodeReadAttrCString(n, "path", name, sizeof(name), &sz_read)) == 0 ) {
+ if( name[0] == '\0' ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcAttr, rcEmpty);
+ } else if( name[0] == '/' ) {
+ memmove(path, name, sz_read + 1);
+ } else {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 &&
+ (rc = KDirectoryResolvePath(dir, true, path, sizeof(path), "%s/%s", rel_path, name)) == 0 ) {
+ DEBUG_LINE(8, "%s/%s resolved to %s", rel_path, name, path);
+ }
+ KDirectoryRelease(dir);
+ }
+ if( rc != 0 ) {
+ strcpy(errmsg, "TAR/Item/@path");
+ }
+ }
+ if( rc == 0 && (rc = XML_ParseTimestamp(n, "timestamp", &ts, true)) != 0 ) {
+ strcpy(errmsg, "TAR/Item/@timestamp");
+ }
+ if( rc == 0 && (rc = XML_ParseBool(n, "executable", &exec, true)) != 0 ) {
+ strcpy(errmsg, "TAR/Item/@executable");
+ }
+ if( rc == 0 && (rc = KXMLNodeReadAttrAsU64(n, "size", &fsz)) != 0 ) {
+ strcpy(errmsg, "TAR/Item/@size");
+ }
+ if( rc == 0 ) {
+ name[0] = '\0';
+ rc = KXMLNodeReadAttrCString(n, "name", name, sizeof(name), &sz_read);
+ if( (GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) || name[0] == '\0' ) {
+ char* x = strrchr(path, '/');
+ strcpy(name, x ? x + 1 : path);
+ rc = 0;
+ } else if( rc == 0 && name[0] == '/' ) {
+ strcat(errmsg, "Item/@name cannot be absolute");
+ rc = RC(rcExe, rcDoc, rcValidating, rcName, rcInvalid);
+ } else if( rc != 0 ) {
+ strcpy(errmsg, "Item/@name");
+ }
+ }
+ if( rc == 0 ) {
+ const KNamelist* attr = NULL;
+ if( (rc = KXMLNodeListAttr(n, &attr)) == 0 ) {
+ uint32_t j = 0, count = 0;
+ if( (rc = KNamelistCount(attr, &count)) == 0 && count > 0 ) {
+ while( rc == 0 && j < count ) {
+ const char *attr_nm = NULL;
+ if( (rc = KNamelistGet(attr, j++, &attr_nm)) != 0 ) {
+ break;
+ }
+ if( strcmp("path", attr_nm) == 0 || strcmp("name", attr_nm) == 0 ||
+ strcmp("timestamp", attr_nm) == 0 || strcmp("size", attr_nm) == 0 ||
+ strcmp("executable", attr_nm) == 0 ) {
+ continue;
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, "unknown attribute TAR/Item/@");
+ strcat(errmsg, attr_nm);
+ }
+ }
+ ReleaseComplain(KNamelistRelease, attr);
+ }
+ }
+ if( rc == 0 && (rc = TarFileList_Add(*files, path, name, fsz, ts, exec)) != 0 ) {
+ strcpy(errmsg, "adding to TAR");
+ }
+ }
+ ReleaseComplain(KXMLNodeRelease, n);
+ }
+ }
+ if( rc != 0 ) {
+ TarFileList_Release(*files);
+ *files = NULL;
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t TarNode_Touch(const TarNode* cself)
+{
+ rc_t rc = 0;
+
+ if( cself->xml_path != NULL ) {
+ KDirectory* dir = NULL;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ KTime_t dt;
+ if( (rc = KDirectoryDate(dir, &dt, "%s", cself->xml_path)) == 0 ) {
+ if( dt != cself->mtime ) {
+ const KFile* kfile = NULL;
+ DEBUG_MSG(8, ("%s: updating tar %s\n", __func__, cself->xml_path));
+ if( (rc = KDirectoryOpenFileRead(dir, &kfile, "%s", cself->xml_path)) == 0 ) {
+ const KXMLMgr* xmlmgr;
+ if( (rc = XML_MgrGet(&xmlmgr)) == 0 ) {
+ const KXMLDoc* xmldoc = NULL;
+ if( (rc = KXMLMgrMakeDocRead(xmlmgr, &xmldoc, kfile)) == 0 ) {
+ const KXMLNodeset* ns = NULL;
+ if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/TAR")) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
+ if( count != 1 ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcData, rcInvalid);
+ } else {
+ const KXMLNode* n = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(ns, &n, 0)) == 0 ) {
+ char errmsg[4096];
+ const TarFileList* new_files;
+ if( (rc = TarNode_MakeFileList(n, &new_files, errmsg, cself->rel_path, cself->node.name)) != 0 ) {
+ LOGERR(klogErr, rc, errmsg);
+ } else {
+ TarFileList_Release(cself->files);
+ ((TarNode*)cself)->files = new_files;
+ ((TarNode*)cself)->mtime = dt;
+ }
+ ReleaseComplain(KXMLNodeRelease, n);
+ }
+ }
+ }
+ ReleaseComplain(KXMLNodesetRelease, ns);
+ }
+ ReleaseComplain(KXMLDocRelease, xmldoc);
+ }
+ }
+ ReleaseComplain(KFileRelease, kfile);
+ }
+ }
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t TarNode_Attr(const TarNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ } else {
+ *type = kptFile;
+ rc = TarFileList_Size(cself->files, file_sz);
+ if( cself->xml_path != NULL ) {
+ *ts = cself->mtime;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t TarNode_Open(const TarNode* cself, const char* subpath, const SAccessor** accessor)
+{
+ rc_t rc = 0;
+
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcNotFound);
+ } else {
+ const KFile* kf = NULL;
+ if( (rc = TarFile_Open(&kf, cself->files)) == 0 ) {
+ if( (rc = KFileAccessor_Make(accessor, cself->node.name, kf)) != 0 ) {
+ ReleaseComplain(KFileRelease, kf);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SAccessor_Release(*accessor);
+ *accessor = NULL;
+ }
+ return rc;
+}
+
+static
+rc_t TarNode_Release(TarNode* self)
+{
+ if( self != NULL ) {
+ DEBUG_MSG(8, ("%s: %s\n", __func__, self->xml_path));
+ TarFileList_Release(self->files);
+ }
+ return 0;
+}
+
+static FSNode_vtbl TarNode_vtbl = {
+ sizeof(TarNode),
+ NULL,
+ TarNode_Touch,
+ TarNode_Attr,
+ NULL,
+ NULL,
+ TarNode_Open,
+ TarNode_Release
+};
+
+rc_t TarNode_MakeXML(const KXMLNode* xml_node, FSNode** self, char* errmsg, const char* rel_path)
+{
+ rc_t rc = 0;
+
+ if( xml_node == NULL || self == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ char name[4096];
+ size_t sz;
+
+ rc = KXMLNodeReadAttrCString(xml_node, "name", name, sizeof(name), &sz);
+ if( rc != 0 || sz == 0 || name[0] == '\0' ) {
+ strcpy(errmsg, "attribute 'name'");
+ rc = rc ? rc : RC(rcExe, rcDoc, rcValidating, rcAttr, rcInvalid);
+ } else if( (rc = FSNode_Make(self, name, &TarNode_vtbl)) == 0 ) {
+ ((TarNode*)*self)->rel_path = rel_path;
+ strcpy(errmsg, "processing Item(s)");
+ if( (rc = TarNode_MakeFileList(xml_node, &((TarNode*)*self)->files, errmsg, rel_path, (*self)->name)) != 0 ) {
+ FSNode_Release(*self);
+ *self = NULL;
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t TarNode_MakeAuto(const FSNode** cself, const KDirectory* dir, const char* path, const char* file, const char* xml_path)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL || dir == NULL || path == NULL || file == NULL || xml_path == NULL ) {
+ rc = RC(rcExe, rcNode, rcConstructing, rcParam, rcNull);
+ } else {
+ if( (rc = FSNode_Make((FSNode**)cself, file, &TarNode_vtbl)) == 0 ) {
+ ((char*)((*cself)->name))[strlen(file) - 4] = '\0'; /* -= .xml */
+ ((TarNode*)*cself)->xml_path = xml_path;
+ ((TarNode*)*cself)->rel_path = path;
+ if( (rc = FSNode_Touch(*cself)) != 0 ) {
+ FSNode_Release(*cself);
+ *cself = NULL;
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/tar-node.h b/tools/fuse/tar-node.h
new file mode 100644
index 0000000..d8a5552
--- /dev/null
+++ b/tools/fuse/tar-node.h
@@ -0,0 +1,35 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_tar_node_
+#define _h_sra_fuse_tar_node_
+
+#include "node.h"
+
+rc_t TarNode_MakeXML(const KXMLNode* xml_node, FSNode** cself, char* errmsg, const char* rel_path);
+
+rc_t TarNode_MakeAuto(const FSNode** cself, const KDirectory* dir, const char* path, const char* file, const char* xml_path);
+
+#endif /* _h_sra_fuse_tar_node_ */
diff --git a/tools/fuse/text-file.c b/tools/fuse/text-file.c
new file mode 100644
index 0000000..dcde6eb
--- /dev/null
+++ b/tools/fuse/text-file.c
@@ -0,0 +1,134 @@
+/*===========================================================================
+ *
+ * Public DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "log.h"
+#include "formats.h"
+#include "text-file.h"
+
+typedef struct TextFile TextFile;
+#define KFILE_IMPL TextFile
+#include <kfs/impl.h>
+
+struct TextFile {
+ KFile dad;
+ char* data;
+};
+
+static
+rc_t TextFile_Destroy(TextFile *self)
+{
+ FREE(self->data);
+ FREE(self);
+ return 0;
+}
+
+static
+struct KSysFile* TextFile_GetSysFile(const TextFile *self, uint64_t *offset)
+{
+ *offset = 0;
+ return NULL;
+}
+
+static
+rc_t TextFile_RandomAccess(const TextFile *self)
+{
+ return 0;
+}
+
+static
+uint32_t TextFile_Type(const TextFile *self)
+{
+ return kfdFile;
+}
+
+static
+rc_t TextFile_Size(const TextFile *self, uint64_t *size)
+{
+ *size = strlen(self->data);
+ return 0;
+}
+
+static
+rc_t TextFile_SetSize(TextFile *self, uint64_t size)
+{
+ return RC(rcExe, rcFile, rcUpdating, rcInterface, rcUnsupported);
+}
+
+static
+rc_t TextFile_Read(const TextFile *self, uint64_t pos, void *buffer, size_t bsize, size_t *num_read)
+{
+ *num_read = strlen(self->data);
+ if( pos < *num_read ) {
+ *num_read = (*num_read < bsize) ? *num_read : bsize;
+ memmove(buffer, &self->data[pos], *num_read);
+ } else {
+ *num_read = 0;
+ }
+ return 0;
+}
+
+static
+rc_t TextFile_Write(TextFile *self, uint64_t pos, const void *buffer, size_t size, size_t *num_writ)
+{
+ return RC(rcExe, rcFile, rcWriting, rcInterface, rcUnsupported);
+}
+
+static KFile_vt_v1 TextFile_vtbl = {
+ 1, 1,
+ TextFile_Destroy,
+ TextFile_GetSysFile,
+ TextFile_RandomAccess,
+ TextFile_Size,
+ TextFile_SetSize,
+ TextFile_Read,
+ TextFile_Write,
+ TextFile_Type
+};
+
+
+rc_t TextFile_Open( const KFile** cself, const FileOptions* opt )
+{
+ rc_t rc = 0;
+ TextFile* self;
+ CALLOC(self, 1, sizeof(*self));
+ if( self == NULL )
+ {
+ rc = RC(rcExe, rcFile, rcConstructing, rcMemory, rcExhausted );
+ }
+ else if ( ( rc = KFileInit( &self->dad, (const KFile_vt*)&TextFile_vtbl, "TextFile", "no-name", true, false ) ) != 0 ||
+ ( rc = StrDup( opt->f.txt64b, &self->data ) ) != 0 )
+ {
+ KFileRelease( &self->dad );
+ }
+ else
+ {
+ *cself = &self->dad;
+ }
+ return rc;
+}
diff --git a/tools/fuse/text-file.h b/tools/fuse/text-file.h
new file mode 100644
index 0000000..78a6cc1
--- /dev/null
+++ b/tools/fuse/text-file.h
@@ -0,0 +1,36 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_fuse_text_file_
+#define _h_sra_fuse_text_file_
+
+#include <kfs/file.h>
+
+#include "node.h"
+
+rc_t TextFile_Open(const KFile** cself, const FileOptions* opt);
+
+#endif /* _h_sra_fuse_text_file_ */
diff --git a/tools/fuse/unix/remote-fuser-sys.c b/tools/fuse/unix/remote-fuser-sys.c
new file mode 100644
index 0000000..7eaf627
--- /dev/null
+++ b/tools/fuse/unix/remote-fuser-sys.c
@@ -0,0 +1,696 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/directory.h>
+
+#define FUSE_USE_VERSION 25
+#include <fuse.h>
+
+#include "xml.h"
+#include "remote-fuser.h"
+#include "log.h"
+
+#include "remote-cache.h"
+
+#include <atomic.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* we will preserve mount point value */
+static char g_mount_point [ 4096 ];
+
+static struct stat g_mount_point_stat;
+static struct stat g_dflt_file_stat;
+static atomic64_t num_open_files;
+
+static
+int ConvertRC2errno(rc_t rc)
+{
+ switch(GetRCState(rc)) {
+ case rcNoErr:
+ return 0;
+ case rcNotFound:
+ return ENOENT;
+ case rcNull:
+ return EFAULT;
+ case rcInvalid:
+ return EINVAL;
+ case rcInsufficient:
+ return ENAMETOOLONG;
+ case rcReadonly:
+ return EROFS;
+ case rcUnauthorized:
+ return EACCES;
+ case rcCorrupt:
+ default:
+ return EBADF;
+ }
+}
+
+/* Kinda scary thing, but whomknows */
+void FUSER_abort ()
+{
+ LOGMSG(klogInfo, "Aborting remote fuser by request");
+ fuse_unmount ( g_mount_point );
+ exit ( 1 );
+}
+
+void* UX_FUSE_init(void)
+{
+ atomic64_set(&num_open_files, 0);
+ SRA_FUSER_Init();
+ return NULL;
+}
+
+void UX_FUSE_destroy(void* x)
+{
+ uint64_t q = atomic64_read(&num_open_files);
+ if( q > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "$(q) files still opened", PLOG_U64(q), q));
+ }
+ SRA_FUSER_Fini();
+}
+
+struct UX_FUSE_readdir_callback_data {
+ const char *path;
+ void *buf;
+ fuse_fill_dir_t filler;
+};
+
+static
+rc_t CC UX_FUSE_readdir_callback( const char *name, void *data )
+{
+ struct UX_FUSE_readdir_callback_data* d = (struct UX_FUSE_readdir_callback_data*)data;
+ int r = d->filler(d->buf, name, NULL, 0);
+ DEBUG_MSG(10, ("%s %s entry: '%s'\n", __func__, d->path, name));
+ return r != 0 ? RC(rcExe, rcDirectory, rcReading, rcBuffer, rcInsufficient) : 0;
+}
+
+int UX_FUSE_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+ off_t offset, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ struct UX_FUSE_readdir_callback_data data;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+
+ data.path = path;
+ data.filler = filler;
+ data.buf = buf;
+
+ if( (rc = UX_FUSE_readdir_callback(".", &data)) == 0 &&
+ (rc = UX_FUSE_readdir_callback("..", &data)) == 0 ) {
+ rc = SRA_FUSER_GetDir(path, UX_FUSE_readdir_callback, &data);
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_getattr(const char *path, struct stat *stbuf)
+{
+ rc_t rc = 0;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( stbuf == NULL) {
+ rc = RC(rcExe, rcFileDesc, rcClassifying, rcParam, rcNull);
+ } else if( strcmp(path, "/") == 0 ) {
+ /* root is known as mount point */
+ memmove(stbuf, &g_mount_point_stat, sizeof(g_mount_point_stat));
+ } else {
+ uint32_t type = kptBadPath, access = 0;
+ KTime_t ts = 0;
+ uint64_t file_sz = 0, block_sz = 0;
+ if( (rc = SRA_FUSER_GetAttr(path, &type, &ts, &file_sz, &access, &block_sz)) == 0 ) {
+ bool symlink = (type & kptAlias);
+ if( symlink ) {
+ type = type & ~kptAlias;
+ }
+ if( type == kptDir ) {
+ memmove(stbuf, &g_mount_point_stat, sizeof(g_mount_point_stat));
+ stbuf->st_mode = S_IFDIR | (0007555 & (access == 0 ? stbuf->st_mode : access));
+ } else {
+ memmove(stbuf, &g_dflt_file_stat, sizeof(g_dflt_file_stat));
+ if( access == 0 ) {
+ access = stbuf->st_mode;
+ }
+ stbuf->st_mode = 0007555 & (access == 0 ? stbuf->st_mode : access);
+ if( type == kptFile ) {
+ stbuf->st_mode |= S_IFREG;
+ } else if( type == kptCharDev ) {
+ stbuf->st_mode |= S_IFCHR;
+ } else if( type == kptBlockDev ) {
+ stbuf->st_mode |= S_IFBLK;
+ } else if( type == kptFIFO ) {
+ stbuf->st_mode |= S_IFIFO;
+ } else {
+ rc = RC(rcExe, rcFileDesc, rcClassifying, rcDirEntry, rcUnknown);
+ }
+ }
+ if( rc == 0 ) {
+ if( symlink ) {
+ stbuf->st_mode = S_IFLNK | (stbuf->st_mode & 07777);
+ }
+ stbuf->st_size = file_sz;
+ if( ts != 0 ) {
+ stbuf->st_mtime = stbuf->st_atime = stbuf->st_ctime = ts;
+ }
+ if( block_sz > 0 ) {
+ stbuf->st_blksize = block_sz;
+ }
+ DEBUG_MSG(8, ("%s: %s type: %s %lu bytes\n", __func__, path,
+ (S_ISDIR(stbuf->st_mode) ? "dir" : (S_ISLNK(stbuf->st_mode) ? " symlink" : "file")), stbuf->st_size));
+ }
+ }
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_readlink(const char *path, char *buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( buf == NULL ) {
+ rc = RC(rcExe, rcFile, rcAliasing, rcParam, rcNull);
+ } else if( buf_sz < 1 ) {
+ rc = RC(rcExe, rcFile, rcAliasing, rcParam, rcInvalid);
+ } else {
+ rc = SRA_FUSER_ResolveLink(path, buf, buf_sz);
+ if ( rc == 0 ) {
+ if ( * buf == '/' ) {
+ /*) Here we suppose to add mount point to path
+ (*/
+ char TmpBuf [ 4096 ];
+ size_t NumWrit = 0;
+
+ rc = string_printf (
+ TmpBuf,
+ sizeof ( TmpBuf ),
+ & NumWrit,
+ "%s%s",
+ g_mount_point,
+ buf
+ );
+ if ( rc == 0 ) {
+ string_copy_measure ( buf, buf_sz, TmpBuf );
+ }
+ }
+ }
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_open(const char *path, struct fuse_file_info* fi)
+{
+ rc_t rc = 0;
+ uint64_t q;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( fi == NULL) {
+ rc = RC(rcExe, rcFile, rcOpening, rcParam, rcNull);
+ } else if( fi->flags & (O_CREAT | O_EXCL | O_TRUNC | O_APPEND)) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcReadonly);
+ } else {
+ const void* data = NULL;
+ if( (rc = SRA_FUSER_OpenNode(path, &data)) == 0 ) {
+ fi->fh = (uint64_t)data;
+ }
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ q = atomic64_add_and_read(&num_open_files, 1);
+ PLOGMSG(klogInfo, (klogInfo, "opened $(n), total open $(q)", PLOG_2(PLOG_S(n),PLOG_U64(q)), path, q));
+ return 0;
+}
+
+int UX_FUSE_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ const void* data = NULL;
+ size_t num_read = 0;
+
+ DEBUG_MSG(8, ("%s: %s from %lu %lu bytes\n", __func__, path, offset, size));
+ if( fi == NULL || buf == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcNull);
+ } else if( (data = (const void*)fi->fh) == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcCorrupt);
+ } else {
+ rc = SRA_FUSER_ReadNode(path, data, buf, size, offset, &num_read);
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return num_read;
+}
+
+int UX_FUSE_release(const char *path, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ const void* data = NULL;
+ uint64_t q;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( fi == NULL) {
+ rc = RC(rcExe, rcFile, rcReleasing, rcParam, rcNull);
+ } else if( (data = (const void*)fi->fh) == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcCorrupt);
+ } else {
+ rc = SRA_FUSER_CloseNode(path, data);
+ }
+ fi->fh = 0;
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ atomic64_dec(&num_open_files);
+ q = atomic64_read(&num_open_files);
+ PLOGMSG(klogInfo, (klogInfo, "closed $(n), total open $(q)", PLOG_2(PLOG_S(n),PLOG_U64(q)), path, q));
+ return 0;
+}
+
+int UX_FUSE_mknod(const char *path, mode_t m, dev_t d)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_mkdir(const char *path, mode_t m)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_unlink(const char *path)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_rmdir(const char *path)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_symlink(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_rename(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_link(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_chmod(const char *path, mode_t m)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_chown(const char *path, uid_t u, gid_t g)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_truncate(const char *path, off_t o)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_utime(const char *path, struct utimbuf *b)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_write(const char *path, const char *b, size_t s, off_t o, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_flush(const char *path, struct fuse_file_info *fi)
+{
+ return 0;
+}
+
+int UX_FUSE_create(const char *path, mode_t m, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_ftruncate(const char *path, off_t o, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+static
+void CoreUsage(int fd, const char *progName, bool showHelp, bool showVersion, bool fail)
+{
+ /* used only for FUSE built-in help and version printing */
+ struct fuse_operations ops;
+ struct fuse_args args;
+ memset(&args, 0, sizeof(struct fuse_args));
+ fuse_opt_add_arg(&args, progName); /* fake mount point */
+
+
+ if( fd != STDOUT_FILENO ) {
+ /* redirect usage to log file if it was specified */
+ dup2(fd, STDOUT_FILENO);
+ }
+ if( showHelp ) {
+ const char* p = strrchr(progName, '/');
+ if( p++ == NULL ) {
+ p = progName;
+ }
+ UsageSummary(p);
+ if( !fail ) {
+ fuse_opt_add_arg(&args, "-ho");
+ KOutMsg("\n"
+ " -x|--xml-dir <url> XML file with virtual directory structure\n"
+ " string. Local file or valid URL (http)\n"
+ " -m|--mount-point <path> path to a mount directory \n"
+ );
+ KOutMsg(
+ " -u|--unmount Unmount only and exit (only -m required)\n");
+ KOutMsg(
+ " -b|--hard-bot <url> URL where report 'heart-beat' ( version )\n"
+ " optional, if not defined - not report\n"
+ " combination '%%s' will be substituted\n"
+ " with XML file version \n"
+ );
+ KOutMsg("\nOptions:\n"
+ " -e|--cache-dir <path> Path to directory where to store cached\n"
+ " data from remote files\n"
+ " Programm will work in diskless mode\n"
+ " without cacheing if parameter omitted\n");
+ KOutMsg(" -c|--hard-bot-check <minutes> Execute 'heart-beat' URL every <arg> minutes,\n"
+ " inteder larger than 0, default: 30.\n"
+ " -r|--xml-root <path> Base directory for a 'path' attributes in XML.\n"
+ " default: '.'\n"
+ );
+ KOutMsg(
+ " -B|--Blevel <level> Set block size level for HTTP transport.\n"
+ " level is an integer value from 1 to 10,\n"
+ " which correspond to block sizes:\n"
+ " 32K,64K,128K,256K,512K,1M,2M,4M,8M,16M\n"
+ );
+ KOutMsg(
+ " --SRA-check <secs> Check SRA config and runs for update\n"
+ " every <arg> seconds, default: 0 - never.\n" );
+ KOutMsg(
+ " -L|--log-level Logging level as number or enum string. One\n"
+ " of (fatal|sys|int|err|warn|info) or (0-5)\n"
+ " Current/default is warn.\n"
+ " -l|--log-file <path> Use log file specified by path.\n"
+ " -g|--log-reopen <secs> Reopened log file every <arg> seconds\n"
+ " (external log rotation), default: 0 - never.\n"
+ );
+ KOutMsg(
+ #if _DEBUGGING
+ " -+|--debug <Module[-Flag]> Turn on debug output for module. All flags\n"
+ " if not specified.\n"
+ #endif
+ " -v|--verbose Increase the verbosity level of the program.\n"
+ " Use multiple times for more verbosity.\n"
+ " -V|--version Display the version of the program then quit.\n"
+ " -h|--help Output brief explantion for the program.\n"
+ "\n"
+ );
+ }
+ }
+ if( showVersion && !fail ) {
+ HelpVersion(progName, KAppVersion());
+ fuse_opt_add_arg(&args, "--version");
+ }
+ /* force help preceed fuse help */
+ fflush(stdout);
+ /* hack to force fuse lib to output to stdout */
+ dup2(fd, STDERR_FILENO);
+ if( !fail ) {
+ memset(&ops, 0, sizeof(struct fuse_operations));
+ fuse_main(args.argc, args.argv, &ops);
+ }
+ exit(fail ? rcArgv : 0);
+}
+
+/*******************************************************************************
+ * KMain - defined for use with kapp library
+ *******************************************************************************/
+rc_t CC KMain(int argc, char *argv[])
+{
+ int i;
+ rc_t rc;
+
+ bool showHelp = argc < 2, showVersion = false, unmount = false, foreground = false;
+ const char* mount_point = NULL, *xml_path = NULL, *log_file = NULL;
+ const char* xml_root = ".";
+ const char* cache_dir = NULL, *heart_beat_url = NULL;
+ char** fargs = (char**)calloc(argc, sizeof(char*));
+ uint32_t heart_beat_check = 30, log_sync = 0, sra_sync = 0;
+ int log_fd = STDOUT_FILENO;
+ uint32_t block_level = 0, block_size = 0;
+
+#ifdef SRAFUSER_LOGLOCALTIME
+ KLogFmtFlagsSet(klogFmtLocalTimestamp);
+ KLogLibFmtFlagsSet(klogFmtLocalTimestamp);
+ KStsFmtFlagsSet(kstsFmtLocalTimestamp);
+ KStsLibFmtFlagsSet(kstsFmtLocalTimestamp);
+#endif
+
+ for(i = 1; i < argc; i++) {
+ if(!strcmp(argv[i], "-x") || !strcmp(argv[i], "--xml-dir")) {
+ xml_path = argv[++i];
+ } else if(!strcmp(argv[i], "-m") || !strcmp(argv[i], "--mount-point")) {
+ mount_point = argv[++i];
+ } else if(!strcmp(argv[i], "-e") || !strcmp(argv[i], "--cache-dir")) {
+ cache_dir = argv[++i];
+ } else if(!strcmp(argv[i], "-b") || !strcmp(argv[i], "--hard-bot")) {
+ heart_beat_url = argv[++i];
+ } else if(!strcmp(argv[i], "-xs") || !strcmp(argv[i], "-c") || !strcmp(argv[i], "--xml-check")) {
+ heart_beat_check = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-r") || !strcmp(argv[i], "--xml-root")) {
+ xml_root = argv[++i];
+ } else if(!strcmp(argv[i], "-B") || !strcmp(argv[i], "--Blevel")) {
+ block_level = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-ds") || !strcmp(argv[i], "--SRA-check")) {
+ sra_sync = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-u") || !strcmp (argv[i], "--unmount")) {
+ unmount = true;
+ } else if(!strcmp(argv[i], "-L") || !strcmp (argv[i], "--log-level")) {
+ if( i == argc - 1 ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "missing log level");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ } else if( (rc = LogLevelSet(argv[++i])) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "log level $(lvl)", PLOG_S(lvl), argv[i]));
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ } else if(!strcmp(argv[i], "-+") || !strcmp (argv[i], "--debug")) {
+#if _DEBUGGING
+ if( i == argc - 1 ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "missing debug level");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ } else if( (rc = KDbgSetString(argv[++i])) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "debug level $(lvl)", PLOG_S(lvl), argv[i]));
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+#else
+ i++;
+#endif
+ } else if(!strcmp(argv[i], "-lf") || !strcmp(argv[i], "-l") || !strcmp (argv[i], "--log-file")) {
+ log_file = argv[++i];
+ } else if(!strcmp(argv[i], "-ls") || !strcmp(argv[i], "-g") || !strcmp(argv[i], "--log-reopen")) {
+ log_sync = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-V") || !strcmp(argv[i], "--version")) {
+ showVersion = true;
+ } else if(!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) {
+ KStsLevel l = KStsLevelGet();
+ KStsLevelSet(++l);
+ } else if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "-ho") || !strcmp(argv[i], "--help")) {
+ showHelp = true;
+ } else {
+ /* save arg for FUSE */
+ fargs[i] = argv[i];
+ if( !strcmp(argv[i], "-d") || !strcmp(argv[i], "-f") ||
+ (!strcmp(argv[i], "-o") && (i > argc - 1) && !strcmp(argv[i + 1], "debug")) ) {
+ foreground = true;
+ }
+ }
+ }
+ if( showHelp || showVersion ) {
+ CoreUsage(log_fd, argv[0], showHelp, showVersion, false);
+ }
+ if( (rc = LogFile_Init(log_file, log_sync, foreground, &log_fd)) != 0 ) {
+ LOGERR(klogErr, rc, log_file ? log_file : "no log");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ if( mount_point == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient), "mountpoint");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ if( unmount ) {
+ fuse_unmount(mount_point);
+ exit(0);
+ }
+ if( xml_path == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient), "virtual directory XML");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ if ( ! IsRemotePath ( xml_path ) ) {
+ if ( ! IsLocalPath ( xml_path ) ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInvalid), "virtual directory XML file is neither local nor remote");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ }
+ if ( heart_beat_check <= 0 ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInvalid), "heart beat check value");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ if ( block_level != 0 ) {
+ if ( 10 < block_level ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInvalid), "buffering level value");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ block_size = ( 1 << ( block_level - 1 ) ) * 1024 * 32;
+ KOutMsg ( "Buffering level is %d. Using buffe of size %d\n", block_level, block_size );
+ }
+ else {
+ block_size = 0;
+ }
+ if( i != argc ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcExcessive), argv[i]);
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ if( stat(mount_point, &g_mount_point_stat) < 0 ) {
+ PLOGMSG(klogErr, (klogErr, "$(p): $(e)", PLOG_2(PLOG_S(p),PLOG_S(e)), mount_point, strerror(errno)));
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ g_mount_point_stat.st_dev = 0;
+ g_mount_point_stat.st_ino = 0;
+ g_mount_point_stat.st_mode = S_IFDIR | 0555; /* execute read-only */
+ /* find needs more links to search in subdir */
+ g_mount_point_stat.st_nlink = 1024 * 1024 * 1024;
+
+ /* Here we are preserving mount point */
+ string_copy_measure (
+ g_mount_point,
+ sizeof ( g_mount_point ),
+ mount_point
+ );
+
+ /* And here we should initialize some 'stat' structure
+ * BTW, seems that Anton inherited only GID and GID from
+ * original XML file, I think that 'getuid' and 'getgid'
+ * will work here well
+ */
+ memset ( & g_dflt_file_stat, 0, sizeof ( struct stat ) );
+
+ g_dflt_file_stat.st_uid = getuid ();
+ g_dflt_file_stat.st_gid = getgid ();
+ g_dflt_file_stat.st_mode = S_IFREG | 0444; /* read-only */
+ g_dflt_file_stat.st_nlink = 1;
+
+ if( (rc = Initialize(sra_sync, xml_path, cache_dir, heart_beat_url, heart_beat_check * 60, xml_root, block_size)) != 0 ) {
+ LOGERR(klogErr, rc, "at initialization");
+ CoreUsage(log_fd, argv[0], true, false, true);
+ }
+ DEBUG_MSG(8, ("Mount point set to '%s'\n", mount_point));
+
+ {{ /* FUSE start */
+ struct fuse_operations ops;
+ struct fuse_args args;
+
+ memset(&args, 0, sizeof(struct fuse_args));
+ fuse_opt_add_arg(&args, argv[0]);
+ /* mount point for fuse_main */
+ fuse_opt_add_arg(&args, mount_point);
+ /* save mopunt point dir and program stat */
+ for(i = 0; i < argc; i++) {
+ if( fargs[i] ) {
+ fuse_opt_add_arg(&args, fargs[i]);
+ }
+ }
+ free(fargs);
+ memset(&ops, 0, sizeof(struct fuse_operations));
+ ops.init = UX_FUSE_init;
+ ops.destroy = UX_FUSE_destroy;
+ ops.getattr = UX_FUSE_getattr;
+ ops.readdir = UX_FUSE_readdir;
+ ops.readlink = UX_FUSE_readlink;
+ ops.open = UX_FUSE_open;
+ ops.read = UX_FUSE_read;
+ ops.release = UX_FUSE_release;
+ ops.mknod = UX_FUSE_mknod;
+ ops.mkdir = UX_FUSE_mkdir;
+ ops.unlink = UX_FUSE_unlink;
+ ops.rmdir = UX_FUSE_rmdir;
+ ops.symlink = UX_FUSE_symlink;
+ ops.rename = UX_FUSE_rename;
+ ops.link = UX_FUSE_link;
+ ops.chmod = UX_FUSE_chmod;
+ ops.chown = UX_FUSE_chown;
+ ops.truncate = UX_FUSE_truncate;
+ ops.utime = UX_FUSE_utime;
+ ops.write = UX_FUSE_write;
+ ops.flush = UX_FUSE_flush;
+ ops.create = UX_FUSE_create;
+ ops.ftruncate = UX_FUSE_ftruncate;
+ rc = fuse_main(args.argc, args.argv, &ops);
+ }}
+ return rc;
+}
diff --git a/tools/fuse/unix/sra-fuser-sys.c b/tools/fuse/unix/sra-fuser-sys.c
new file mode 100644
index 0000000..5aa5be9
--- /dev/null
+++ b/tools/fuse/unix/sra-fuser-sys.c
@@ -0,0 +1,637 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <kfs/directory.h>
+
+#define FUSE_USE_VERSION 25
+#include <fuse.h>
+
+#include "xml.h"
+#include "sra-fuser.h"
+#include "log.h"
+
+#include <atomic.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+static struct stat g_mount_point_stat;
+static struct stat g_dflt_file_stat;
+static atomic64_t num_open_files;
+
+static
+int ConvertRC2errno(rc_t rc)
+{
+ switch(GetRCState(rc)) {
+ case rcNoErr:
+ return 0;
+ case rcNotFound:
+ return ENOENT;
+ case rcNull:
+ return EFAULT;
+ case rcInvalid:
+ return EINVAL;
+ case rcInsufficient:
+ return ENAMETOOLONG;
+ case rcReadonly:
+ return EROFS;
+ case rcUnauthorized:
+ return EACCES;
+ case rcCorrupt:
+ default:
+ return EBADF;
+ }
+}
+
+void* UX_FUSE_init(void)
+{
+ atomic64_set(&num_open_files, 0);
+ SRA_FUSER_Init();
+ return NULL;
+}
+
+void UX_FUSE_destroy(void* x)
+{
+ uint64_t q = atomic64_read(&num_open_files);
+ if( q > 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "$(q) files still opened", PLOG_U64(q), q));
+ }
+ SRA_FUSER_Fini();
+}
+
+struct UX_FUSE_readdir_callback_data {
+ const char *path;
+ void *buf;
+ fuse_fill_dir_t filler;
+};
+
+static
+rc_t CC UX_FUSE_readdir_callback( const char *name, void *data )
+{
+ struct UX_FUSE_readdir_callback_data* d = (struct UX_FUSE_readdir_callback_data*)data;
+ int r = d->filler(d->buf, name, NULL, 0);
+ DEBUG_MSG(10, ("%s %s entry: '%s'\n", __func__, d->path, name));
+ return r != 0 ? RC(rcExe, rcDirectory, rcReading, rcBuffer, rcInsufficient) : 0;
+}
+
+int UX_FUSE_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+ off_t offset, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ struct UX_FUSE_readdir_callback_data data;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+
+ data.path = path;
+ data.filler = filler;
+ data.buf = buf;
+
+ if( (rc = UX_FUSE_readdir_callback(".", &data)) == 0 &&
+ (rc = UX_FUSE_readdir_callback("..", &data)) == 0 ) {
+ rc = SRA_FUSER_GetDir(path, UX_FUSE_readdir_callback, &data);
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_getattr(const char *path, struct stat *stbuf)
+{
+ rc_t rc = 0;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( stbuf == NULL) {
+ rc = RC(rcExe, rcFileDesc, rcClassifying, rcParam, rcNull);
+ } else if( strcmp(path, "/") == 0 ) {
+ /* root is known as mount point */
+ memmove(stbuf, &g_mount_point_stat, sizeof(g_mount_point_stat));
+ } else {
+ uint32_t type = kptBadPath, access = 0;
+ KTime_t ts = 0;
+ uint64_t file_sz = 0, block_sz = 0;
+ if( (rc = SRA_FUSER_GetAttr(path, &type, &ts, &file_sz, &access, &block_sz)) == 0 ) {
+ bool symlink = (type & kptAlias);
+ if( symlink ) {
+ type = type & ~kptAlias;
+ }
+ if( type == kptDir ) {
+ memmove(stbuf, &g_mount_point_stat, sizeof(g_mount_point_stat));
+ stbuf->st_mode = S_IFDIR | (0007555 & (access == 0 ? stbuf->st_mode : access));
+ } else {
+ memmove(stbuf, &g_dflt_file_stat, sizeof(g_dflt_file_stat));
+ if( access == 0 ) {
+ access = stbuf->st_mode;
+ }
+ stbuf->st_mode = 0007555 & (access == 0 ? stbuf->st_mode : access);
+ if( type == kptFile ) {
+ stbuf->st_mode |= S_IFREG;
+ } else if( type == kptCharDev ) {
+ stbuf->st_mode |= S_IFCHR;
+ } else if( type == kptBlockDev ) {
+ stbuf->st_mode |= S_IFBLK;
+ } else if( type == kptFIFO ) {
+ stbuf->st_mode |= S_IFIFO;
+ } else {
+ rc = RC(rcExe, rcFileDesc, rcClassifying, rcDirEntry, rcUnknown);
+ }
+ }
+ if( rc == 0 ) {
+ if( symlink ) {
+ stbuf->st_mode = S_IFLNK | (stbuf->st_mode & 07777);
+ }
+ stbuf->st_size = file_sz;
+ if( ts != 0 ) {
+ stbuf->st_mtime = stbuf->st_atime = stbuf->st_ctime = ts;
+ }
+ if( block_sz > 0 ) {
+ stbuf->st_blksize = block_sz;
+ }
+ DEBUG_MSG(8, ("%s: %s type: %s %lu bytes\n", __func__, path,
+ (S_ISDIR(stbuf->st_mode) ? "dir" : (S_ISLNK(stbuf->st_mode) ? " symlink" : "file")), stbuf->st_size));
+ }
+ }
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_readlink(const char *path, char *buf, size_t buf_sz)
+{
+ rc_t rc = 0;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( buf == NULL ) {
+ rc = RC(rcExe, rcFile, rcAliasing, rcParam, rcNull);
+ } else if( buf_sz < 1 ) {
+ rc = RC(rcExe, rcFile, rcAliasing, rcParam, rcInvalid);
+ } else {
+ rc = SRA_FUSER_ResolveLink(path, buf, buf_sz);
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return 0;
+}
+
+int UX_FUSE_open(const char *path, struct fuse_file_info* fi)
+{
+ rc_t rc = 0;
+ uint64_t q;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( fi == NULL) {
+ rc = RC(rcExe, rcFile, rcOpening, rcParam, rcNull);
+ } else if( fi->flags & (O_CREAT | O_EXCL | O_TRUNC | O_APPEND)) {
+ rc = RC(rcExe, rcFile, rcOpening, rcDirEntry, rcReadonly);
+ } else {
+ const void* data = NULL;
+ if( (rc = SRA_FUSER_OpenNode(path, &data)) == 0 ) {
+ fi->fh = (uint64_t)data;
+ }
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ q = atomic64_add_and_read(&num_open_files, 1);
+ PLOGMSG(klogInfo, (klogInfo, "opened $(n), total open $(q)", PLOG_2(PLOG_S(n),PLOG_U64(q)), path, q));
+ return 0;
+}
+
+int UX_FUSE_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ const void* data = NULL;
+ size_t num_read = 0;
+
+ DEBUG_MSG(8, ("%s: %s from %lu %lu bytes\n", __func__, path, offset, size));
+ if( fi == NULL || buf == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcNull);
+ } else if( (data = (const void*)fi->fh) == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcCorrupt);
+ } else {
+ rc = SRA_FUSER_ReadNode(path, data, buf, size, offset, &num_read);
+ }
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ return num_read;
+}
+
+int UX_FUSE_release(const char *path, struct fuse_file_info *fi)
+{
+ rc_t rc = 0;
+ const void* data = NULL;
+ uint64_t q;
+
+ DEBUG_MSG(8, ("%s: %s\n", __func__, path));
+ if( fi == NULL) {
+ rc = RC(rcExe, rcFile, rcReleasing, rcParam, rcNull);
+ } else if( (data = (const void*)fi->fh) == NULL ) {
+ rc = RC(rcExe, rcFile, rcReading, rcParam, rcCorrupt);
+ } else {
+ rc = SRA_FUSER_CloseNode(path, data);
+ }
+ fi->fh = 0;
+ if( rc != 0 ) {
+ errno = ConvertRC2errno(rc);
+ PLOGERR(klogErr, (klogErr, rc, "$(f): $(p) - $(e)", PLOG_3(PLOG_S(f),PLOG_S(p),PLOG_S(e)), __func__, path, strerror(errno)));
+ return -errno;
+ }
+ atomic64_dec(&num_open_files);
+ q = atomic64_read(&num_open_files);
+ PLOGMSG(klogInfo, (klogInfo, "closed $(n), total open $(q)", PLOG_2(PLOG_S(n),PLOG_U64(q)), path, q));
+ return 0;
+}
+
+int UX_FUSE_mknod(const char *path, mode_t m, dev_t d)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_mkdir(const char *path, mode_t m)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_unlink(const char *path)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_rmdir(const char *path)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_symlink(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_rename(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_link(const char *path, const char *x)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_chmod(const char *path, mode_t m)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_chown(const char *path, uid_t u, gid_t g)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_truncate(const char *path, off_t o)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_utime(const char *path, struct utimbuf *b)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_write(const char *path, const char *b, size_t s, off_t o, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_flush(const char *path, struct fuse_file_info *fi)
+{
+ return 0;
+}
+
+int UX_FUSE_create(const char *path, mode_t m, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+int UX_FUSE_ftruncate(const char *path, off_t o, struct fuse_file_info *fi)
+{
+ return -EROFS;
+}
+
+static
+void CoreUsage(int fd, const char *progName, bool showHelp, bool showVersion, bool fail, bool forceShowHelp)
+{
+ /* used only for FUSE built-in help and version printing */
+ struct fuse_operations ops;
+ struct fuse_args args;
+ memset(&args, 0, sizeof(struct fuse_args));
+ fuse_opt_add_arg(&args, progName); /* fake mount point */
+
+
+ if( fd != STDOUT_FILENO ) {
+ /* redirect usage to log file if it was specified */
+ dup2(fd, STDOUT_FILENO);
+ }
+ if( showHelp ) {
+ const char* p = strrchr(progName, '/');
+ if( p++ == NULL ) {
+ p = progName;
+ }
+ UsageSummary(p);
+ if( !fail || forceShowHelp ) {
+ fuse_opt_add_arg(&args, "-ho");
+ KOutMsg("\n"
+ " -x|--xml-dir <path> XML file with virtual directory structure\n"
+ " -m|--mount-point <path> path to a mount directory \n"
+ " -u|--unmount Unmount only and exit (only -m required)\n"
+ );
+ KOutMsg("\nOptions:\n"
+ " -c|--xml-check <secs> Check XML for update every <arg> seconds,\n"
+ " default: 0 - never.\n"
+ " -r|--xml-root <path> Base directory for a 'path' attributes in XML.\n"
+ " default: '.'\n"
+ );
+ KOutMsg(
+ " -i|--xml-validate <nocheck|ignore> XML validation on load:\n"
+ " nocheck - do not check presence of dir/file in path attribute;\n"
+ " ignore - only report missing dir/file in path attribute;\n"
+ " default behaivour is to fail loading XML if dir/file is not found.\n"
+ );
+ KOutMsg(
+ " --SRA-check <secs> Check SRA config and runs for update\n"
+ " every <arg> seconds, default: 0 - never.\n"
+ " --SRA-cache <path> Write SRA update info to a file.\n"
+ " Must have --SRA-check option value of non-zero.\n"
+ );
+ KOutMsg(
+ " -L|--log-level Logging level as number or enum string. One\n"
+ " of (fatal|sys|int|err|warn|info) or (0-5)\n"
+ " Current/default is warn.\n"
+ " -l|--log-file <path> Use log file specified by path.\n"
+ " -g|--log-reopen <secs> Reopened log file every <arg> seconds\n"
+ " (external log rotation), default: 0 - never.\n"
+ );
+ KOutMsg(
+ #if _DEBUGGING
+ " -+|--debug <Module[-Flag]> Turn on debug output for module. All flags\n"
+ " if not specified.\n"
+ #endif
+ " -v|--verbose Increase the verbosity level of the program.\n"
+ " Use multiple times for more verbosity.\n"
+ " -V|--version Display the version of the program then quit.\n"
+ " -h|--help Output brief explantion for the program.\n"
+ "\n"
+ );
+ }
+ }
+ if( showVersion && !fail ) {
+ HelpVersion(progName, KAppVersion());
+ fuse_opt_add_arg(&args, "--version");
+ }
+ /* force help preceed fuse help */
+ fflush(stdout);
+ /* hack to force fuse lib to output to stdout */
+ dup2(fd, STDERR_FILENO);
+ if( !fail ) {
+ memset(&ops, 0, sizeof(struct fuse_operations));
+ fuse_main(args.argc, args.argv, &ops);
+ }
+ exit(fail ? rcArgv : 0);
+}
+
+/*******************************************************************************
+ * KMain - defined for use with kapp library
+ *******************************************************************************/
+rc_t CC KMain(int argc, char *argv[])
+{
+ int i;
+ rc_t rc;
+
+ bool missedArgs = argc < 2, showHelp = false, showVersion = false, unmount = false, foreground = false;
+ const char* mount_point = NULL, *xml_path = NULL, *log_file = NULL;
+ const char* sra_cache = NULL, *xml_root = ".";
+ char** fargs = (char**)calloc(argc, sizeof(char*));
+ uint32_t xml_sync = 0, log_sync = 0, sra_sync = 0;
+ EXMLValidate xml_validate = eXML_Full;
+ int log_fd = STDOUT_FILENO;
+
+#ifdef SRAFUSER_LOGLOCALTIME
+ KLogFmtFlagsSet(klogFmtLocalTimestamp);
+ KLogLibFmtFlagsSet(klogFmtLocalTimestamp);
+ KStsFmtFlagsSet(kstsFmtLocalTimestamp);
+ KStsLibFmtFlagsSet(kstsFmtLocalTimestamp);
+#endif
+
+ for(i = 1; i < argc; i++) {
+ if(!strcmp(argv[i], "-x") || !strcmp(argv[i], "--xml-dir")) {
+ xml_path = argv[++i];
+ } else if(!strcmp(argv[i], "-m") || !strcmp(argv[i], "--mount-point")) {
+ mount_point = argv[++i];
+ } else if(!strcmp(argv[i], "-xs") || !strcmp(argv[i], "-c") || !strcmp(argv[i], "--xml-check")) {
+ xml_sync = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-r") || !strcmp(argv[i], "--xml-root")) {
+ xml_root = argv[++i];
+ } else if(!strcmp(argv[i], "-i") || !strcmp(argv[i], "--xml-validate")) {
+ if( i++ == argc - 1 ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "XML validation setting value");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ } else if( !strcmp(argv[i], "ignore") ) {
+ xml_validate = eXML_NoFail;
+ } else if( !strcmp(argv[i], "nocheck") ) {
+ xml_validate = eXML_NoCheck;
+ } else {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc, "XML validation setting value '$(lvl)'", PLOG_S(lvl), argv[i]));
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ } else if(!strcmp(argv[i], "-ds") || !strcmp(argv[i], "--SRA-check")) {
+ sra_sync = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-df") || !strcmp(argv[i], "--SRA-cache")) {
+ sra_cache = argv[++i];
+ } else if(!strcmp(argv[i], "-u") || !strcmp (argv[i], "--unmount")) {
+ unmount = true;
+ } else if(!strcmp(argv[i], "-L") || !strcmp (argv[i], "--log-level")) {
+ if( i == argc - 1 ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "missing log level");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ } else if( (rc = LogLevelSet(argv[++i])) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "log level $(lvl)", PLOG_S(lvl), argv[i]));
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ } else if(!strcmp(argv[i], "-+") || !strcmp (argv[i], "--debug")) {
+#if _DEBUGGING
+ if( i == argc - 1 ) {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "missing debug level");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ } else if( (rc = KDbgSetString(argv[++i])) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "debug level $(lvl)", PLOG_S(lvl), argv[i]));
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+#else
+ i++;
+#endif
+ } else if(!strcmp(argv[i], "-lf") || !strcmp(argv[i], "-l") || !strcmp (argv[i], "--log-file")) {
+ log_file = argv[++i];
+ } else if(!strcmp(argv[i], "-ls") || !strcmp(argv[i], "-g") || !strcmp(argv[i], "--log-reopen")) {
+ log_sync = AsciiToU32(argv[++i], NULL, NULL);
+ } else if(!strcmp(argv[i], "-V") || !strcmp(argv[i], "--version")) {
+ showVersion = true;
+ } else if(!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose")) {
+ KStsLevel l = KStsLevelGet();
+ KStsLevelSet(++l);
+ } else if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "-ho") || !strcmp(argv[i], "--help")) {
+ showHelp = true;
+ } else {
+ /* save arg for FUSE */
+ fargs[i] = argv[i];
+ if( !strcmp(argv[i], "-d") || !strcmp(argv[i], "-f") ||
+ (!strcmp(argv[i], "-o") && (i > argc - 1) && !strcmp(argv[i + 1], "debug")) ) {
+ foreground = true;
+ }
+ }
+ }
+ if( missedArgs ) {
+ CoreUsage(log_fd, argv[0], missedArgs, showVersion, true, true);
+ }
+ if( showHelp || showVersion ) {
+ CoreUsage(log_fd, argv[0], showHelp, showVersion, false, false);
+ }
+ if( (rc = LogFile_Init(log_file, log_sync, foreground, &log_fd)) != 0 ) {
+ LOGERR(klogErr, rc, log_file ? log_file : "no log");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ if( mount_point == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient), "mountpoint");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ if( unmount ) {
+ fuse_unmount(mount_point);
+ exit(0);
+ }
+ if( xml_path == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcInsufficient), "virtual directory XML");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ if( i != argc ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcValidating, rcParam, rcExcessive), argv[i]);
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ if( stat(mount_point, &g_mount_point_stat) < 0 ) {
+ PLOGMSG(klogErr, (klogErr, "$(p): $(e)", PLOG_2(PLOG_S(p),PLOG_S(e)), mount_point, strerror(errno)));
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ g_mount_point_stat.st_dev = 0;
+ g_mount_point_stat.st_ino = 0;
+ g_mount_point_stat.st_mode = S_IFDIR | 0555; /* execute read-only */
+ /* find needs more links to search in subdir */
+ g_mount_point_stat.st_nlink = 1024 * 1024 * 1024;
+
+ if( stat(xml_path, &g_dflt_file_stat) < 0 ) {
+ PLOGMSG(klogErr, (klogErr, "$(p): $(e)", PLOG_2(PLOG_S(p),PLOG_S(e)), xml_path, strerror(errno)));
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ g_dflt_file_stat.st_dev = 0;
+ g_dflt_file_stat.st_ino = 0;
+ g_dflt_file_stat.st_mode = S_IFREG | 0444; /* read-only */
+ g_dflt_file_stat.st_nlink = 1;
+ g_dflt_file_stat.st_rdev = 0;
+ g_dflt_file_stat.st_size = 0;
+ g_dflt_file_stat.st_blksize = 0;
+ g_dflt_file_stat.st_blocks = 0;
+
+ if( (rc = Initialize(sra_sync, xml_path, xml_sync, sra_cache, xml_root, xml_validate)) != 0 ) {
+ LOGERR(klogErr, rc, "at initialization");
+ CoreUsage(log_fd, argv[0], true, false, true, false);
+ }
+ DEBUG_MSG(8, ("Mount point set to '%s'\n", mount_point));
+
+ {{ /* FUSE start */
+ struct fuse_operations ops;
+ struct fuse_args args;
+
+ memset(&args, 0, sizeof(struct fuse_args));
+ fuse_opt_add_arg(&args, argv[0]);
+ /* mount point for fuse_main */
+ fuse_opt_add_arg(&args, mount_point);
+ /* save mopunt point dir and program stat */
+ for(i = 0; i < argc; i++) {
+ if( fargs[i] ) {
+ fuse_opt_add_arg(&args, fargs[i]);
+ }
+ }
+ free(fargs);
+ memset(&ops, 0, sizeof(struct fuse_operations));
+ ops.init = UX_FUSE_init;
+ ops.destroy = UX_FUSE_destroy;
+ ops.getattr = UX_FUSE_getattr;
+ ops.readdir = UX_FUSE_readdir;
+ ops.readlink = UX_FUSE_readlink;
+ ops.open = UX_FUSE_open;
+ ops.read = UX_FUSE_read;
+ ops.release = UX_FUSE_release;
+ ops.mknod = UX_FUSE_mknod;
+ ops.mkdir = UX_FUSE_mkdir;
+ ops.unlink = UX_FUSE_unlink;
+ ops.rmdir = UX_FUSE_rmdir;
+ ops.symlink = UX_FUSE_symlink;
+ ops.rename = UX_FUSE_rename;
+ ops.link = UX_FUSE_link;
+ ops.chmod = UX_FUSE_chmod;
+ ops.chown = UX_FUSE_chown;
+ ops.truncate = UX_FUSE_truncate;
+ ops.utime = UX_FUSE_utime;
+ ops.write = UX_FUSE_write;
+ ops.flush = UX_FUSE_flush;
+ ops.create = UX_FUSE_create;
+ ops.ftruncate = UX_FUSE_ftruncate;
+ rc = fuse_main(args.argc, args.argv, &ops);
+ }}
+ return rc;
+}
diff --git a/tools/fuse/xml.c b/tools/fuse/xml.c
new file mode 100644
index 0000000..cf595fe
--- /dev/null
+++ b/tools/fuse/xml.c
@@ -0,0 +1,516 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <klib/namelist.h>
+#include <klib/container.h>
+#include <klib/log.h>
+#include <kproc/lock.h>
+#include <kproc/thread.h>
+
+#include "log.h"
+#include "xml.h"
+#include "file.h"
+#include "directory.h"
+#include "tar-node.h"
+#include "sra-list.h"
+#include "node.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+static const KXMLMgr* g_xmlmgr = NULL;
+static const FSNode* g_root = NULL;
+static KRWLock* g_lock = NULL;
+static const char* g_start_dir = NULL;
+static uint32_t g_xml_validate = 0;
+
+static unsigned int g_xml_sync = 0;
+/* if g_xml_sync == 0 these are not used: */
+static KTime_t g_xml_mtime = 0;
+static char* g_xml_path = NULL;
+static KThread* g_xml_thread = NULL;
+
+static
+rc_t XMLLock(bool exclusive)
+{
+ DEBUG_MSG(10, ("Lock XML tree %s\n", exclusive ? "write" : "read"));
+ return exclusive ? KRWLockAcquireExcl(g_lock) : KRWLockAcquireShared(g_lock);
+}
+
+static
+void XMLUnlock(void)
+{
+ DEBUG_MSG(10, ("Unlocked XML tree\n"));
+ ReleaseComplain(KRWLockUnlock, g_lock);
+}
+
+void XML_FindRelease(void)
+{
+ XMLUnlock();
+}
+
+rc_t XML_FindLock(const char* path, bool recur, const FSNode** node, const char** subpath)
+{
+ rc_t rc = 0;
+ size_t sz = 0;
+ const char* p0 = NULL, *p = NULL;
+ const FSNode* pn = NULL, *n = NULL;
+ bool hidden = false;
+
+ if( path == NULL || node == NULL || subpath == NULL ) {
+ return RC(rcExe, rcPath, rcResolving, rcParam, rcNull);
+ }
+ sz = strlen(path);
+ if( sz == 0 ) {
+ return RC(rcExe, rcPath, rcResolving, rcParam, rcEmpty);
+ }
+ p0 = path;
+ if( (rc = XMLLock(false)) != 0 ) {
+ return rc;
+ }
+ pn = g_root;
+ do {
+ DEBUG_MSG(8, ("Path: '%s'\n", p0));
+ while( *p0 == '/' && *p0 != '\0' ) {
+ p0++;
+ }
+ if( *p0 == '\0' ) {
+ break;
+ }
+ p = strchr(p0, '/');
+ if( p == NULL ) {
+ p = p0 + strlen(p0);
+ }
+ DEBUG_MSG(8, ("Push: '%.*s'\n", p - p0, p0));
+ if( (rc = FSNode_FindChild(pn, p0, p - p0, &n, &hidden)) == 0 ) {
+ if( hidden ) {
+ pn = n;
+ DEBUG_MSG(8, ("Match! hidden '%s' left '%s'\n", pn->name, p0));
+ break;
+ } else {
+ DEBUG_MSG(8, ("Match! '%.*s' left '%s'\n", p - p0, p0, p));
+ }
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ break;
+ }
+ pn = n;
+ p0 = p;
+ } while( rc == 0 && p0 < path + sz );
+
+ if( rc == 0 ) {
+ if( pn == NULL ) {
+ rc = RC(rcExe, rcPath, rcResolving, rcDirEntry, rcNotFound);
+ DEBUG_MSG(10, ("Not found: '%s', in '%s'\n", p0, path));
+ } else {
+ if( (rc = FSNode_Touch(pn)) != 0 ) {
+ PLOGERR(klogWarn, (klogWarn, rc, "touch failed for $(n)", PLOG_S(n), pn->name));
+ rc = 0;
+ }
+ *node = pn;
+ *subpath = (p0 && p0[0] != '\0') ? p0 : NULL;
+#if _DEBUGGING
+ {
+ const char* nm = NULL;
+ FSNode_GetName(pn, &nm);
+ DEBUG_MSG(10, ("Found: '%s', sub '%s'\n", nm, *subpath));
+ }
+#endif
+ }
+ }
+ if( rc != 0 ) {
+ XMLUnlock();
+ }
+ return rc;
+}
+
+static
+rc_t SRAConfigParse(const KXMLNode* xml_node, SRAConfigFlags* flags, char* errmsg)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ char at[4096];
+ size_t sz;
+ char* attr_name[] = { "run-directory", "SRA-archive", "SRA-archive-lite", "fastq", "SFF" };
+ SRAConfigFlags attr_val[] = { eSRAFuseRunDir, eSRAFuseFileArc, eSRAFuseFileArcLite, eSRAFuseFileFastq, eSRAFuseFileSFF };
+
+ if( *flags & eSRAFuseInitial ) {
+ *flags = 0;
+ }
+ for(i = 0; rc == 0 && i < sizeof(attr_name)/sizeof(attr_name[0]); i++) {
+ if( (rc = KXMLNodeReadAttrCString(xml_node, attr_name[i], at, sizeof(at), &sz)) == 0 ) {
+ if( strcasecmp(at, "true") == 0 ) {
+ *flags = *flags | attr_val[i];
+ } else if( strcasecmp(at, "false") == 0 ) {
+ *flags = *flags & ~(attr_val[i]);
+ } else {
+ strcpy(errmsg, "SRAConfig attribute ");
+ strcat(errmsg, attr_name[i]);
+ strcat(errmsg, " value '");
+ strcat(errmsg, at);
+ strcat(errmsg, "'");
+ rc = RC(rcExe, rcDoc, rcReading, rcData, rcInvalid);
+ }
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t XML_ValidateNode(FSNode* parent, const KXMLNode* n, SRAConfigFlags flags, char* errmsg)
+{
+ rc_t rc = 0;
+ const char* name = NULL;
+ FSNode* fsn = NULL;
+ bool children_allowed = false, should_have_children = false, ignore_children = false;
+
+ if( (rc = KXMLNodeElementName(n, &name)) != 0 ) {
+ return rc;
+ }
+ DEBUG_MSG(8, ("Node: %s\n", name));
+ if( name == NULL ) {
+ return RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcNull);
+ }
+
+ if( strcmp(name, "Directory") == 0 ) {
+ rc = DirectoryNode_Make(n, &fsn, errmsg, g_start_dir, g_xml_mtime, g_xml_validate);
+ children_allowed = true;
+ } else if( strcmp(name, "File") == 0 ) {
+ rc = FileNode_Make(n, &fsn, errmsg, g_start_dir, g_xml_validate);
+ } else if( strcmp(name, "SRA") == 0 ) {
+ if( (rc = SRAListNode_Make(n, parent, flags, errmsg, g_start_dir, g_xml_validate)) == 0 ) {
+ fsn = parent;
+ }
+ } else if( strcmp(name, "TAR") == 0 ) {
+ /* tar nodes do not validate on creation */
+ rc = TarNode_MakeXML(n, &fsn, errmsg, g_start_dir);
+ children_allowed = true;
+ ignore_children = true;
+ } else if( strcmp(name, "SRAConfig") == 0 ) {
+ if( (rc = SRAConfigParse(n, &flags, errmsg)) == 0 ) {
+ fsn = parent;
+ children_allowed = true;
+ should_have_children = true;
+ }
+ } else {
+ strcpy(errmsg, name);
+ rc = RC(rcExe, rcDoc, rcValidating, rcTag, rcUnknown);
+ }
+ if( rc == 0 ) {
+ strcpy(errmsg, name);
+ if( fsn == parent || (rc = FSNode_AddChild(parent, fsn)) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodeCountChildNodes(n, &count)) == 0 && count > 0 ) {
+ if( !children_allowed ) {
+ if( fsn != NULL ) {
+ FSNode_GetName(fsn, &name);
+ }
+ rc = RC(rcExe, rcDoc, rcValidating, rcDirEntry, rcInvalid);
+ strcpy(errmsg, name);
+ } else if( !ignore_children ) {
+ uint32_t i = 0;
+ const KXMLNode* ch = NULL;
+ while( rc == 0 && i < count ) {
+ if( (rc = KXMLNodeGetNodeRead(n, &ch, i++)) == 0 ) {
+ rc = XML_ValidateNode(fsn, ch, flags, errmsg);
+ ReleaseComplain(KXMLNodeRelease, ch);
+ }
+ }
+ }
+ } else if( count == 0 && should_have_children ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n) may have children", PLOG_S(n), name));
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t RootNode_Attr(const FSNode* cself, const char* subpath, uint32_t* type, KTime_t* ts, uint64_t* file_sz, uint32_t* access, uint64_t* block_sz)
+{
+ rc_t rc = 0;
+
+ *type = kptDir;
+ if( subpath != NULL ) {
+ rc = RC(rcExe, rcFile, rcEvaluating, rcDirEntry, rcNotFound);
+ }
+ return rc;
+}
+
+static
+rc_t RootNode_Dir(const FSNode* cself, const char* subpath, FSNode_Dir_Visit func, void* data)
+{
+ if( subpath != NULL ) {
+ return RC(rcExe, rcFile, rcListing, rcDirEntry, rcNotFound);
+ }
+ return FSNode_ListChildren(cself, func, data);
+}
+
+static const FSNode_vtbl RootNode_vtbl = {
+ sizeof(FSNode),
+ NULL,
+ NULL,
+ RootNode_Attr,
+ RootNode_Dir,
+ NULL,
+ NULL,
+ NULL
+};
+
+static
+rc_t XML_Open(const char* path, const FSNode** tree)
+{
+ rc_t rc = 0;
+ char errmsg[4096] = "";
+ KDirectory *dir = NULL;
+
+ PLOGMSG(klogInfo, (klogInfo, "Reading XML file '$(x)'", PLOG_S(x), path));
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ const KFile* file = NULL;
+ if( (rc = KDirectoryOpenFileRead(dir, &file, "%s", path)) == 0 ) {
+ if( (rc = FSNode_Make((FSNode**)tree, "ROOT", &RootNode_vtbl)) == 0 ) {
+ const KXMLDoc* xmldoc = NULL;
+ if( (rc = KXMLMgrMakeDocRead(g_xmlmgr, &xmldoc, file)) == 0 ) {
+ const KXMLNodeset* ns = NULL;
+ if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/FUSE/*")) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
+ if( count == 0 ) {
+ rc = RC(rcExe, rcDoc, rcValidating, rcData, rcEmpty);
+ } else {
+ uint32_t i = 0;
+ while(rc == 0 && i < count) {
+ const KXMLNode* n = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(ns, &n, i++)) == 0 ) {
+ SRAConfigFlags flags = ~0;
+ errmsg[0] = '\0';
+ rc = XML_ValidateNode((FSNode*)*tree, n, flags, errmsg);
+ ReleaseComplain(KXMLNodeRelease, n);
+ }
+ }
+ if( rc == 0 ) {
+ rc = SRAList_NextVersion();
+ }
+ }
+ }
+ ReleaseComplain(KXMLNodesetRelease, ns);
+ }
+ ReleaseComplain(KXMLDocRelease, xmldoc);
+ }
+ if( rc != 0 ) {
+ FSNode_Release(*tree);
+ *tree = NULL;
+ }
+ }
+ ReleaseComplain(KFileRelease, file);
+ }
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ if( rc == 0 ) {
+ PLOGMSG(klogInfo, (klogInfo, "XML file '$(x)' ok", PLOG_S(x), path));
+ } else {
+ if( strlen(errmsg) < 1 ) {
+ strcpy(errmsg, path);
+ }
+ LOGERR(klogErr, rc, errmsg);
+ }
+ return rc;
+}
+
+static
+rc_t XMLThread( const KThread *self, void *data )
+{
+ KDirectory *dir = NULL;
+
+ PLOGMSG(klogInfo, (klogInfo, "XML sync thread started with $(s) sec", PLOG_U32(s), g_xml_sync));
+ do {
+ rc_t rc = 0;
+ KTime_t dt = 0;
+
+ DEBUG_MSG(8, ("XML sync thread checking %s\n", g_xml_path));
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ rc = KDirectoryDate(dir, &dt, "%s", g_xml_path);
+ ReleaseComplain(KDirectoryRelease, dir);
+ }
+ if( rc == 0 ) {
+ if( dt != g_xml_mtime ) {
+ const FSNode* new_root = NULL;
+ PLOGMSG(klogInfo, (klogInfo, "File $(f) changed ($(m) <> $(d)), updating...",
+ PLOG_3(PLOG_S(f),PLOG_I64(m),PLOG_I64(d)), g_xml_path, g_xml_mtime, dt));
+ if( XML_Open(g_xml_path, &new_root) == 0 ) {
+ if( (rc = XMLLock(true)) == 0 ) {
+ const FSNode* old_root = g_root;
+ g_root = new_root;
+ g_xml_mtime = dt;
+ XMLUnlock();
+ FSNode_Release(old_root);
+ PLOGMSG(klogInfo, (klogInfo, "Data from $(f) updated successfully", PLOG_S(f), g_xml_path));
+ }
+ }
+ } else {
+ DEBUG_MSG(8, ("XML sync thread up-to-date %s\n", g_xml_path));
+ }
+ } else {
+ LOGERR(klogErr, rc, g_xml_path);
+ }
+ SRAList_PostRefresh();
+ KSleepMs(g_xml_sync * 1000);
+ } while( g_xml_sync > 0 );
+ LOGMSG(klogInfo, "XML sync thread ended");
+ return 0;
+}
+
+rc_t XML_Make(KDirectory* dir, const char* const work_dir, const char* xml_path, unsigned int sync, uint32_t xml_validate)
+{
+ rc_t rc = 0;
+
+ g_xml_sync = sync;
+ if( g_xmlmgr == NULL && (rc = KXMLMgrMakeRead(&g_xmlmgr)) != 0 ) {
+ g_xmlmgr = NULL;
+ LOGERR(klogErr, rc, "XML manager");
+ } else {
+ char buf[4096];
+ if( (rc = KDirectoryResolvePath(dir, true, buf, 4096, "%s", xml_path)) == 0 ) {
+ if( (rc = StrDup(buf, &g_xml_path)) == 0 ) {
+ DEBUG_MSG(8, ("XML path set to '%s'\n", g_xml_path));
+ }
+ }
+ g_start_dir = work_dir;
+ g_xml_validate = xml_validate;
+ }
+ if( rc == 0 ) {
+ rc = FSNode_Make((FSNode**)&g_root, "ROOT", &RootNode_vtbl);
+ }
+ return rc;
+}
+
+void XML_Init(void)
+{
+ rc_t rc = 0;
+
+ if( g_lock == NULL && (rc = KRWLockMake(&g_lock)) != 0 ) {
+ g_lock = NULL;
+ LOGERR(klogErr, rc, "XML lock");
+ }
+ if( (rc = KThreadMake(&g_xml_thread, XMLThread, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "XML sync thread");
+ }
+}
+
+void XML_Fini(void)
+{
+ g_xml_sync = 0;
+ if( g_xml_thread != NULL ) {
+ ReleaseComplain(KThreadCancel, g_xml_thread);
+ ReleaseComplain(KThreadRelease, g_xml_thread);
+ }
+ ReleaseComplain(KXMLMgrRelease, g_xmlmgr);
+ XMLLock(true);
+ FSNode_Release(g_root);
+ XMLUnlock();
+ ReleaseComplain(KRWLockRelease, g_lock);
+ FREE(g_xml_path);
+
+ g_root = NULL;
+ g_lock = NULL;
+ g_start_dir = NULL;
+ g_xml_mtime = 0;
+ g_xml_path = NULL;
+ g_xml_thread = NULL;
+}
+
+rc_t XML_MgrGet(const KXMLMgr** xmlmgr)
+{
+ if( xmlmgr == NULL ) {
+ return RC(rcExe, rcDoc, rcAccessing, rcParam, rcNull);
+ }
+ if( g_xmlmgr == NULL ) {
+ return RC(rcExe, rcPath, rcAccessing, rcMgr, rcNull);
+ }
+ *xmlmgr = g_xmlmgr;
+ return 0;
+}
+
+rc_t XML_ParseTimestamp(const KXMLNode* xml_node, const char* attr, KTime_t* timestamp, bool optional)
+{
+ rc_t rc;
+ char ts[128];
+ size_t sz;
+
+ if( (rc = KXMLNodeReadAttrCString(xml_node, attr, ts, sizeof(ts), &sz)) == 0 ) {
+ struct tm tm;
+ memset(&tm, 0, sizeof(tm));
+ if( strptime(ts, "%Y-%m-%dT%H:%M:%S", &tm) != NULL ) {
+ *timestamp = mktime(&tm);
+ } else {
+ rc = RC(rcExe, rcDoc, rcReading, rcAttr, rcInvalid);
+ }
+ } else if( optional && GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
+
+rc_t XML_WriteTimestamp(char* dst, size_t bsize, size_t *num_writ, KTime_t ts)
+{
+ struct tm* tm = localtime(&ts);
+
+ *num_writ = strftime(dst, bsize, "%a %Y-%m-%d %H:%M:%S %Z", tm);
+ if( *num_writ < 1 || *num_writ >= bsize ) {
+ return RC(rcExe, rcDoc, rcWriting, rcBuffer, rcInsufficient);
+ }
+ return 0;
+}
+
+rc_t XML_ParseBool(const KXMLNode* xml_node, const char* attr, bool* val, bool optional)
+{
+ rc_t rc;
+ char b[16];
+ size_t sz;
+
+ if( (rc = KXMLNodeReadAttrCString(xml_node, attr, b, sizeof(b), &sz)) == 0 ) {
+ if( strcasecmp(b, "true") == 0 || strcasecmp(b, "on") == 0 || strcasecmp(b, "yes") == 0 ) {
+ *val = true;
+ } else if( strcasecmp(b, "false") == 0 || strcasecmp(b, "off") == 0 || strcasecmp(b, "no") == 0 ) {
+ *val = false;
+ } else {
+ rc = RC(rcExe, rcDoc, rcReading, rcAttr, rcInvalid);
+ }
+ } else if( optional && GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
diff --git a/tools/fuse/xml.h b/tools/fuse/xml.h
new file mode 100644
index 0000000..a945e24
--- /dev/null
+++ b/tools/fuse/xml.h
@@ -0,0 +1,60 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_xml_
+#define _h_sra_fuse_xml_
+
+#include <kxml/xml.h>
+#include <kfs/directory.h>
+
+#include "node.h"
+
+typedef uint32_t EXMLValidate;
+enum {
+ eXML_NoCheck = 0,
+ eXML_NoFail,
+ eXML_Full
+};
+
+rc_t XML_Make(KDirectory* dir, const char* const work_dir, const char* xml_path,
+ unsigned int sync, EXMLValidate xml_validate);
+
+void XML_Init(void);
+
+rc_t XML_FindLock(const char* path, bool recur, const FSNode** node, const char** subpath);
+
+void XML_FindRelease(void);
+
+rc_t XML_MgrGet(const KXMLMgr** xmlmgr);
+
+rc_t XML_ParseTimestamp(const KXMLNode* xml_node, const char* attr, KTime_t* tm, bool optional);
+
+rc_t XML_WriteTimestamp(char* dst, size_t bsize, size_t *num_writ, KTime_t ts);
+
+rc_t XML_ParseBool(const KXMLNode* xml_node, const char* attr, bool* val, bool optional);
+
+void XML_Fini(void);
+
+#endif /* _h_sra_fuse_xml_ */
diff --git a/tools/fuse/zlib-simple.c b/tools/fuse/zlib-simple.c
new file mode 100644
index 0000000..aa671ea
--- /dev/null
+++ b/tools/fuse/zlib-simple.c
@@ -0,0 +1,65 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include "debug.h"
+#include "zlib-simple.h"
+
+rc_t ZLib_DeflateBlock(const char* src, size_t src_sz, char* dst, size_t dst_sz, size_t* written)
+{
+ rc_t rc = 0;
+ z_stream z_strm;
+ int z_err = Z_OK;
+
+ if( src == NULL || dst == NULL || written == NULL ) {
+ rc = RC(rcExe, rcFunction, rcConstructing, rcParam, rcNull);
+ } else {
+ z_strm.next_in = (unsigned char*)src;
+ z_strm.zalloc = Z_NULL;
+ z_strm.zfree = Z_NULL;
+ z_strm.opaque = Z_NULL;
+ z_err = deflateInit2(&z_strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);
+ if( z_err != Z_OK ) {
+ rc = RC(rcExe, rcFunction, rcConstructing, rcInterface, rcUnexpected);
+ DEBUG_MSG(3, ("deflateInit2: %R %d\n", rc, z_err));
+ } else {
+ z_strm.avail_in = src_sz;
+ z_strm.next_out = (unsigned char*)dst;
+ z_strm.avail_out = dst_sz;
+ if( (z_err = deflate(&z_strm, Z_FINISH)) != Z_STREAM_END ) {
+ rc = RC(rcExe, rcFunction, rcExecuting, rcInterface, rcUnexpected);
+ DEBUG_MSG(3, ("deflate(Z_FINISH): %R %d\n", rc, z_err));
+ }
+ *written = dst_sz - z_strm.avail_out;
+ if( (z_err = deflateEnd(&z_strm)) != Z_OK ) {
+ rc = RC(rcExe, rcFunction, rcDestroying, rcInterface, rcUnexpected);
+ DEBUG_MSG(3, ("deflateEnd: %r %d\n", rc, z_err));
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/fuse/zlib-simple.h b/tools/fuse/zlib-simple.h
new file mode 100644
index 0000000..178218d
--- /dev/null
+++ b/tools/fuse/zlib-simple.h
@@ -0,0 +1,33 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_sra_fuse_zlib_simple_
+#define _h_sra_fuse_zlib_simple_
+
+#include <zlib.h>
+
+rc_t ZLib_DeflateBlock(const char* src, size_t src_sz, char* dst, size_t dst_sz, size_t* written);
+
+#endif /* _h_sra_fuse_zlib_simple_ */
diff --git a/tools/general-loader/Makefile b/tools/general-loader/Makefile
new file mode 100644
index 0000000..f852589
--- /dev/null
+++ b/tools/general-loader/Makefile
@@ -0,0 +1,131 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+
+MODULE = tools/general-loader
+
+ALL_LIBS = \
+ general-writer
+
+INT_TOOLS = \
+ gw-dumper
+
+EXT_TOOLS = \
+ general-loader
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(INT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(TEST_BINDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(LIBDIR)/,$(ALL_LIBS)) \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/all: \
+ $(addprefix $(LIBDIR)/,$(ALL_LIBS)) \
+ $(addprefix $(TEST_BINDIR)/,$(INT_TOOLS)) \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# general-writer
+#
+$(LIBDIR)/general-writer: $(LIBDIR)/$(LPFX)general-writer.$(LIBX)
+
+GEN_WRITER_SRC = \
+ general-writer \
+ utf8-like-int-codec
+
+GEN_WRITER_OBJ = \
+ $(addsuffix .$(LOBX),$(GEN_WRITER_SRC))
+
+$(LIBDIR)/$(LPFX)general-writer.$(LIBX): $(GEN_WRITER_OBJ)
+ $(LD) --slib --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^
+
+#-------------------------------------------------------------------------------
+# gw-dumper
+#
+
+$(TEST_BINDIR)/gw-dumper: $(SRCDIR)/gw-dumper.cpp $(SRCDIR)/utf8-like-int-codec.c
+ c++ $(DBG) -o $@ $^ -I$(SRCDIR) -I$(VDB_INCDIR)/os/$(OS) -I$(VDB_INCDIR)
+
+
+#-------------------------------------------------------------------------------
+# general-loader
+#
+GEN_LOAD_SRC = \
+ general-loader \
+ protocol-parser \
+ database-loader \
+ utf8-like-int-codec \
+ main \
+
+GEN_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(GEN_LOAD_SRC))
+
+GEN_LOAD_LIBS = \
+ -sncbi-wvdb-static \
+ -sload \
+ -skapp \
+ -stk-version \
+
+$(BINDIR)/general-loader: $(GEN_LOAD_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(GEN_LOAD_LIBS)
+
diff --git a/tools/general-loader/database-loader.cpp b/tools/general-loader/database-loader.cpp
new file mode 100644
index 0000000..3353ed8
--- /dev/null
+++ b/tools/general-loader/database-loader.cpp
@@ -0,0 +1,894 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "general-loader.hpp"
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/time.h>
+
+#include <kdb/meta.h>
+#include <kdb/table.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+
+#include <kapp/loader-meta.h>
+#include <kapp/main.h>
+
+#include <algorithm>
+
+using namespace std;
+
+///////////// GeneralLoader::DatabaseLoader
+
+GeneralLoader :: DatabaseLoader :: DatabaseLoader ( const std::string& p_programName,
+ const Paths& p_includePaths,
+ const Paths& p_schemas,
+ const std::string& p_dbNameOverride )
+: m_includePaths ( p_includePaths ),
+ m_schemas ( p_schemas ),
+ m_programName ( p_programName ),
+ m_databaseName ( p_dbNameOverride ), // if specified, overrides the database path coming in from the stream
+ m_softwareVersion ( 0 ),
+ m_mgr ( 0 ),
+ m_schema ( 0 ),
+ m_databaseNameOverridden ( ! m_databaseName.empty() )
+{
+ m_databases . insert ( Databases :: value_type ( 0, (VDatabase*)0 ) ); // reserve root database
+}
+
+GeneralLoader :: DatabaseLoader :: ~DatabaseLoader ()
+{
+ m_tables . clear();
+ m_columns . clear ();
+
+ for ( Cursors::iterator it = m_cursors . begin(); it != m_cursors . end(); ++it )
+ {
+ VCursorRelease ( *it );
+ }
+
+ for ( Databases::iterator it = m_databases . begin(); it != m_databases . end(); ++it )
+ {
+ VDatabaseRelease ( it -> second );
+ }
+
+ if ( m_schema != 0 )
+ {
+ VSchemaRelease ( m_schema );
+ m_schema = 0;
+ }
+
+ if ( m_mgr != 0 )
+ {
+ VDBManagerRelease ( m_mgr );
+ m_mgr = 0;
+ }
+}
+
+const GeneralLoader :: DatabaseLoader :: Column*
+GeneralLoader :: DatabaseLoader :: GetColumn ( uint32_t p_columnId ) const
+{
+ Columns::const_iterator curIt = m_columns . find ( p_columnId );
+ if ( curIt != m_columns . end () )
+ {
+ return & curIt -> second;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: UseSchema ( const string& p_file, const string& p_name )
+{
+ pLogMsg ( klogDebug, "database-loader: schema file '$(s1)', name '$(s2)'", "s1=%s,s2=%s",
+ p_file . c_str (), p_name . c_str () );
+
+ rc_t rc = VDBManagerMakeUpdate ( & m_mgr, NULL );
+ if ( rc == 0 )
+ {
+ for ( Paths::const_iterator it = m_includePaths . begin(); it != m_includePaths . end(); ++it )
+ {
+ rc = VDBManagerAddSchemaIncludePath ( m_mgr, "%s", it -> c_str() );
+ if ( rc == 0 )
+ {
+ pLogMsg ( klogDebug,
+ "database-loader: Added schema include path '$(s)'",
+ "s=%s",
+ it -> c_str() );
+ }
+ else if ( GetRCObject ( rc ) == (RCObject)rcPath )
+ {
+ pLogMsg ( klogWarn,
+ "database-loader: Schema include path not found: '$(s)'",
+ "s=%s",
+ it -> c_str() );
+ rc = 0;
+ }
+ else
+ {
+ return rc;
+ }
+ }
+
+ rc = VDBManagerMakeSchema ( m_mgr, & m_schema );
+ if ( rc == 0 )
+ {
+ bool found = false;
+ if ( ! p_file . empty () )
+ {
+ rc = VSchemaParseFile ( m_schema, "%s", p_file . c_str () );
+ if ( rc == 0 )
+ {
+ pLogMsg ( klogDebug,
+ "database-loader: Added schema file '$(s)'",
+ "s=%s",
+ p_file . c_str () );
+ found = true;
+ }
+ else if ( GetRCObject ( rc ) == (RCObject)rcPath && GetRCState ( rc ) == rcNotFound )
+ {
+ pLogMsg ( klogWarn,
+ "database-loader: Schema file not found: '$(s)'",
+ "s=%s",
+ p_file . c_str () );
+ rc = 0;
+ }
+ }
+ // if p_file is empty, there should be other schema files specified externally
+ // through the command line options, in m_schemas
+
+ if ( rc == 0 )
+ {
+ for ( Paths::const_iterator it = m_schemas. begin(); it != m_schemas . end(); ++it )
+ {
+ rc = VSchemaParseFile ( m_schema, "%s", it -> c_str() );
+ if ( rc == 0 )
+ {
+ pLogMsg ( klogDebug,
+ "database-loader: Added schema file '$(s)'",
+ "s=%s",
+ it -> c_str() );
+ found = true;
+ }
+ else if ( GetRCObject ( rc ) == (RCObject)rcPath && GetRCState ( rc ) == rcNotFound )
+ {
+ pLogMsg ( klogWarn,
+ "database-loader: Schema file not found: '$(s)'",
+ "s=%s",
+ it -> c_str() );
+ rc = 0;
+ }
+ }
+ }
+
+ if ( found )
+ {
+ m_schemaName = p_name;
+ }
+ else
+ {
+ rc = RC ( rcVDB, rcMgr, rcCreating, rcSchema, rcNotFound );
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: RemotePath ( const string& p_path )
+{
+ if ( m_databaseNameOverridden )
+ {
+ pLogMsg ( klogWarn,
+ "database-loader: remote path '$(s1)' ignored, overridden to '$(s2)'",
+ "s1=%s,s2=%s",
+ p_path . c_str (), m_databaseName . c_str () );
+ }
+ else
+ {
+ pLogMsg ( klogDebug, "database-loader: remote path '$(s1)'", "s1=%s", p_path . c_str () );
+ m_databaseName = p_path;
+ }
+ return 0;
+}
+
+static
+void
+check_vers_component ( const char * vers, const char * end, long num, unsigned long max, char term )
+{
+ if ( vers == end )
+ throw "bad version";
+ if ( * end != 0 && * end != term )
+ throw "bad version";
+ if ( num < 0 || (unsigned long)num > max )
+ throw "bad version";
+}
+
+static
+ver_t
+string2ver_t ( const char * vers )
+{
+ ver_t ret = 0;
+ char * end;
+ long num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 255, '.' );
+ if ( * end == '.' )
+ {
+ ret = num << 24;
+ vers = end + 1;
+ num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 255, '.' );
+ if ( * end == '.' )
+ {
+ ret |= num << 16;
+ vers = end + 1;
+ num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 0xFFFF, 0 );
+ ret |= num;
+ }
+ }
+ return ret;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: SoftwareName ( const string& p_name, const string& p_version )
+{
+ pLogMsg ( klogDebug, "database-loader: SoftwareName '$(n)', version '$(v)'", "n=%s,v=%s", p_name . c_str(), p_version . c_str() );
+ try
+ {
+ m_softwareVersion = string2ver_t ( p_version.c_str() );
+ }
+ catch (...)
+ {
+ return RC ( rcExe, rcDatabase, rcCreating, rcMessage, rcBadVersion );
+ }
+ m_softwareName = p_name;
+ return 0;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: NewTable ( uint32_t p_tableId, const string& p_tableName )
+{
+ return AddMbrTbl ( p_tableId, 0, p_tableName, p_tableName, kcmCreate | kcmMD5 );
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: NewColumn ( uint32_t p_columnId, uint32_t p_tableId, uint32_t p_elemBits, uint8_t p_flagBits, const string& p_columnName )
+{
+ pLogMsg ( klogDebug, "database-loader: adding column '$(c)'", "c=%s", p_columnName . c_str() );
+
+ rc_t rc = 0;
+ Tables::const_iterator table = m_tables . find ( p_tableId );
+ if ( table != m_tables . end() )
+ {
+ if ( m_columns . find ( p_columnId ) == m_columns . end () )
+ {
+ uint32_t cursor_idx = table -> second . cursorIdx;
+ uint32_t column_idx;
+ rc = VCursorAddColumn ( m_cursors [ cursor_idx ],
+ & column_idx,
+ "%s",
+ p_columnName . c_str() );
+ if ( rc == 0 )
+ {
+ Column col;
+ col . name = p_columnName;
+ col . tableId = p_tableId;
+ col . cursorIdx = cursor_idx;
+ col . columnIdx = column_idx;
+ col . elemBits = p_elemBits;
+ col . flagBits = p_flagBits;
+ m_columns [ p_columnId ] = col;
+ pLogMsg ( klogDebug,
+ "database-loader: tableId = $(t), added column '$(c)', columnIdx = $(i1), elemBits = $(i2), flagBits = $(i3)",
+ "t=%u,c=%s,i1=%u,i2=%u,i3=%u",
+ p_tableId, p_columnName . c_str(), col.columnIdx, col.elemBits, col.flagBits );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcExists );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTable, rcInvalid );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: AddMbrDB ( uint32_t p_objId, uint32_t p_parentId, const std :: string &p_mbrName, const std :: string &p_dbName, uint8_t p_createMode )
+{
+ pLogMsg ( klogDebug,
+ "database-loader: adding database id=$(i) parent=$(p) mbrName='$(m)' dbName='$(n)' mode=$(d)",
+ "m=%s,n=%s,i=%u,p=%u,d=%u",
+ p_objId, p_parentId, p_mbrName . c_str(), p_dbName . c_str (), ( unsigned int ) p_createMode );
+
+ rc_t rc = MakeDatabase ( p_parentId );
+ if ( rc == 0 )
+ {
+ Databases :: const_iterator dad = m_databases . find ( p_parentId );
+ assert ( dad != m_databases . end () );
+
+ if ( m_databases . find ( p_objId ) == m_databases . end () )
+ {
+ VDatabase *db;
+ rc = VDatabaseCreateDB ( dad -> second, & db, p_mbrName . c_str(), p_createMode, "%s", p_dbName . c_str () );
+ if ( rc == 0 )
+ {
+ m_databases . insert ( Databases :: value_type ( p_objId, db ) );
+ m_dbParents . insert ( DatabaseToParent :: value_type ( p_objId, p_parentId ) );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcDatabase, rcExists );
+ }
+ }
+
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: AddMbrTbl ( uint32_t p_tblId, uint32_t p_dbId, const std :: string &p_mbrName, const std :: string &p_tblName, uint8_t p_createMode )
+{
+ pLogMsg ( klogDebug,
+ "database-loader: adding table id=$(i) parent=$(p) mbrName='$(m)' dbName='$(n)' mode=$(d)",
+ "m=%s,n=%s,i=%u,p=%u,d=%u",
+ p_mbrName . c_str(), p_tblName . c_str (), p_tblId, p_dbId, ( unsigned int ) p_createMode );
+
+ rc_t rc = 0;
+ if ( m_tables . find ( p_tblId ) == m_tables . end() )
+ {
+ VTable* table;
+ rc = MakeDatabase ( p_dbId );
+ if ( rc == 0 )
+ {
+ Databases::iterator it = m_databases . find ( p_dbId );
+ if ( it != m_databases . end() )
+ {
+ rc = VDatabaseCreateTable ( it -> second , & table, p_mbrName . c_str (), p_createMode, "%s", p_tblName . c_str ());
+ if ( rc == 0 )
+ {
+ VCursor* cursor;
+ rc = VTableCreateCursorWrite ( table, & cursor, kcmInsert );
+ if ( rc == 0 )
+ {
+ m_cursors . push_back ( cursor );
+ Table t;
+ t . name = p_tblName;
+ t . databaseId = p_dbId;
+ t . cursorIdx = ( uint32_t ) m_cursors . size() - 1;
+ m_tables [ p_tblId ] = t;
+ }
+ rc_t rc2 = VTableRelease ( table );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcDatabase, rcNotFound );
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTable, rcExists );
+ }
+
+ return rc;
+}
+
+static
+rc_t WriteMetadata ( KMetadata* p_meta, const string& p_metadata_node, const string& p_value )
+{
+ KMDataNode* node;
+ rc_t rc = KMetadataOpenNodeUpdate ( p_meta, & node, p_metadata_node . c_str () );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeWrite ( node, p_value . c_str (), p_value . size () );
+
+ rc_t rc2 = KMDataNodeRelease ( node );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: DBMetadataNode ( uint32_t p_objId, const string& p_metadata_node, const string& p_value )
+{
+ pLogMsg ( klogDebug,
+ "database-loader: adding metadata node '$(n)=$(v)' to database $(i)",
+ "n=%s,v=%s,i=%u",
+ p_metadata_node . c_str(), p_value.c_str(), p_objId );
+
+ rc_t rc = 0;
+ Databases::iterator it = m_databases . find ( p_objId );
+ if ( it != m_databases . end() )
+ {
+ struct KMetadata* meta;
+ rc = VDatabaseOpenMetadataUpdate ( it -> second, & meta );
+ if ( rc == 0 )
+ {
+ rc = WriteMetadata ( meta,p_metadata_node, p_value );
+ rc_t rc2 = KMetadataRelease ( meta );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcDatabase, rcNotFound );
+ }
+
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: TblMetadataNode ( uint32_t p_objId, const string& p_metadata_node, const string& p_value )
+{
+ pLogMsg ( klogDebug,
+ "database-loader: adding metadata node '$(n)=$(v)' to table $(i)",
+ "n=%s,v=%s,i=%u",
+ p_metadata_node . c_str(), p_value.c_str(), p_objId );
+
+ rc_t rc = 0;
+ Tables::iterator it = m_tables . find ( p_objId );
+ if ( it != m_tables . end() )
+ {
+ struct VTable* tbl;
+ assert ( m_cursors [ it -> second . cursorIdx ] );
+ rc = VCursorOpenParentUpdate ( m_cursors [ it -> second . cursorIdx ], &tbl );
+ if ( rc == 0 )
+ {
+ struct KMetadata* meta;
+ rc = VTableOpenMetadataUpdate ( tbl, & meta );
+ if ( rc == 0 )
+ {
+ rc = WriteMetadata ( meta,p_metadata_node, p_value );
+ rc_t rc2 = KMetadataRelease ( meta );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ rc_t rc2 = VTableRelease ( tbl );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTable, rcNotFound );
+ }
+
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: ColMetadataNode ( uint32_t p_objId, const string& p_metadata_node, const string& p_value )
+{
+ pLogMsg ( klogDebug,
+ "database-loader: adding metadata node '$(n)=$(v)' to column $(i)",
+ "n=%s,v=%s,i=%u",
+ p_metadata_node . c_str(), p_value.c_str(), p_objId );
+
+ rc_t rc = 0;
+ Columns::iterator it = m_columns . find ( p_objId );
+ if ( it != m_columns . end() )
+ {
+ it -> second . metadata [ p_metadata_node ] = p_value;
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: SaveColumnMetadata ( const Column& p_col )
+{
+ if ( p_col . metadata . size () == 0 )
+ {
+ return 0;
+ }
+
+ assert ( m_tables . find ( p_col . tableId ) != m_tables.end() );
+ const Table& t = m_tables [ p_col . tableId ];
+
+ assert ( m_databases . find ( t . databaseId ) != m_databases.end() );
+ assert ( m_databases . find ( t . databaseId ) -> second != 0 );
+
+ VTable* table;
+ rc_t rc = VDatabaseOpenTableUpdate ( m_databases [ t . databaseId ], & table, t . name . c_str () );
+ if ( rc == 0 )
+ {
+ KTable* ktbl;
+ rc = VTableOpenKTableUpdate ( table, & ktbl );
+ if ( rc == 0 )
+ {
+ KColumn* col;
+ rc = KTableOpenColumnUpdate ( ktbl, & col, p_col . name . c_str () );
+ if ( rc == 0 )
+ {
+ KMetadata *meta;
+ rc = KColumnOpenMetadataUpdate ( col, &meta );
+ if ( rc == 0 )
+ {
+ for ( Column :: Metadata :: const_iterator it = p_col . metadata . begin(); it != p_col . metadata . end(); ++ it )
+ {
+ rc = WriteMetadata ( meta, it -> first . c_str (), it -> second . c_str () );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ }
+ rc_t rc2 = KMetadataRelease ( meta );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ rc_t rc2 = KColumnRelease ( col );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ rc_t rc2 = KTableRelease ( ktbl );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ rc_t rc2 = VTableRelease ( table );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: CursorWrite ( const struct Column& p_col, const void* p_data, size_t p_size )
+{
+ return VCursorWrite ( m_cursors [ p_col . cursorIdx ],
+ p_col . columnIdx,
+ p_col . elemBits,
+ p_data,
+ 0,
+ p_size );
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: CursorDefault ( const struct Column& p_col, const void* p_data, size_t p_size )
+{
+ return VCursorDefault ( m_cursors [ p_col . cursorIdx ],
+ p_col . columnIdx,
+ p_col . elemBits,
+ p_data,
+ 0,
+ p_size );
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: CellData ( uint32_t p_columnId, const void* p_data, size_t p_elemCount )
+{
+ rc_t rc = 0;
+ Columns::const_iterator curIt = m_columns . find ( p_columnId );
+ if ( curIt != m_columns . end () )
+ {
+ const Column& col = curIt -> second;
+ pLogMsg ( klogDebug,
+ "database-loader: columnIdx = $(i), elem size=$(s) bits, elem count=$(c)",
+ "i=%u,s=%u,c=%u",
+ col . columnIdx, col . elemBits, p_elemCount );
+ rc = CursorWrite ( col, p_data, p_elemCount );
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: CellDefault ( uint32_t p_columnId, const void* p_data, size_t p_elemCount )
+{ //TODO: this and Handle_CellData are almost identical - refactor
+ rc_t rc = 0;
+ Columns::const_iterator curIt = m_columns . find ( p_columnId );
+ if ( curIt != m_columns . end () )
+ {
+ const Column& col = curIt -> second;
+ pLogMsg ( klogDebug,
+ "database-loader: columnIdx = $(i), elem size=$(s) bits, elem count=$(c)",
+ "i=%u,s=%u,c=%u",
+ col . columnIdx, col . elemBits, p_elemCount );
+ rc = CursorDefault ( col, p_data, p_elemCount );
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: MakeDatabase( uint32_t p_id )
+{
+ rc_t rc = 0;
+
+ Databases::iterator it = m_databases . find ( p_id );
+ if ( it != m_databases . end() )
+ {
+ VDatabase*& db = it -> second;
+ if ( db == 0 ) // only create once
+ {
+ rc = VDBManagerCreateDB ( m_mgr,
+ & db,
+ m_schema,
+ m_schemaName . c_str (),
+ kcmInit + kcmMD5,
+ "%s",
+ m_databaseName . c_str () );
+ if ( rc == 0 && p_id == 0 )
+ { // populate the root database's metadata
+ struct KMetadata* meta;
+ rc = VDatabaseOpenMetadataUpdate ( db, &meta );
+ if ( rc == 0 )
+ {
+ KMDataNode *node;
+ rc = KMetadataOpenNodeUpdate ( meta, &node, "/" );
+
+ if (rc == 0)
+ {
+ rc = KLoaderMeta_WriteWithVersion ( node, m_programName.c_str(), __DATE__, KAppVersion(), m_softwareName.c_str(), m_softwareVersion );
+ KMDataNodeRelease(node);
+ }
+
+ rc_t rc2 = KMetadataRelease ( meta );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcDatabase, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: OpenStream ()
+{
+ pLogMsg ( klogDebug,
+ "database-loader: Database created, schema spec='$(s)', database='$(d)'",
+ "s=%s,d=%s",
+ m_schemaName . c_str (), m_databaseName . c_str () );
+
+ rc_t rc = MakeDatabase ( 0 );
+ if ( rc == 0 )
+ {
+ for ( Cursors::iterator it = m_cursors . begin(); it != m_cursors . end(); ++it )
+ {
+ rc_t rc = VCursorOpen ( *it );
+ if ( rc != 0 )
+ {
+ return rc;
+ }
+ rc = VCursorOpenRow ( *it );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: CloseStream ()
+{
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+
+ for ( Cursors::iterator it = m_cursors . begin(); it != m_cursors . end(); ++it )
+ {
+ rc = VCursorCloseRow ( *it );
+ if ( rc == 0 )
+ {
+ rc = VCursorCommit ( *it );
+ if ( rc == 0 )
+ {
+ struct VTable* table;
+ rc = VCursorOpenParentUpdate ( *it, &table );
+ if ( rc == 0 )
+ {
+ rc = VCursorRelease ( *it );
+ if ( rc == 0 )
+ {
+ rc = VTableReindex ( table );
+ }
+ }
+ rc2 = VTableRelease ( table );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ }
+ if ( rc != 0 )
+ {
+ break;
+ }
+ }
+ m_cursors . clear ();
+
+ if ( rc == 0 )
+ { // save column-level metadata collected from ColMetadata events
+ for ( Columns::iterator it = m_columns. begin(); it != m_columns. end(); ++it )
+ {
+ rc = SaveColumnMetadata ( it -> second );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ }
+ }
+
+ for ( Databases::iterator it = m_databases . begin(); it != m_databases . end(); ++it )
+ {
+ VDatabaseRelease ( it -> second );
+ }
+ m_databases . clear();
+
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: NextRow ( uint32_t p_tableId )
+{
+ rc_t rc = 0;
+ Tables::const_iterator table = m_tables . find ( p_tableId );
+ if ( table != m_tables . end() )
+ {
+ VCursor * cursor = m_cursors [ table -> second . cursorIdx ];
+ rc = VCursorCommitRow ( cursor );
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow ( cursor );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpenRow ( cursor );
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTable, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: MoveAhead ( uint32_t p_tableId, uint64_t p_count )
+{
+ rc_t rc = 0;
+ Tables::const_iterator table = m_tables . find ( p_tableId );
+ if ( table != m_tables . end() )
+ {
+ VCursor * cursor = m_cursors [ table -> second . cursorIdx ];
+ for ( uint64_t i = 0; i < p_count; ++i )
+ { // for now, simulate proper handling (this will commit the current row and insert count-1 empty rows)
+ rc = VCursorCommitRow ( cursor );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ rc = VCursorCloseRow ( cursor );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ rc = VCursorOpenRow ( cursor );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTable, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: ErrorMessage ( const string & p_text )
+{
+ pLogMsg ( klogErr, "general-loader: error \"$(t)\"", "t=%s", p_text . c_str () );
+ return RC ( rcExe, rcFile, rcReading, rcError, rcExists );
+}
+
+rc_t
+GeneralLoader :: DatabaseLoader :: LogMessage ( const string & p_text )
+{
+ pLogMsg ( klogInfo, "general-loader: log from $(s): \"$(t)\"", "s=%s,t=%s", m_softwareName . c_str (), p_text . c_str () );
+ return 0;
+}
+
+
+/*
+<Log>
+ <status app="sra-stat" message="processed 12%" pid="60234"
+ timestamp="2015-09-21T19:49:45" version="2.5.1" percent="12"/>
+</Log>
+ */
+rc_t
+GeneralLoader :: DatabaseLoader :: ProgressMessage ( const std :: string& p_name, uint32_t p_pid,
+ uint32_t p_timestamp, uint32_t p_version, uint32_t p_percent )
+{
+ KTime kt;
+ KTimeLocal ( &kt, ( KTime_t ) p_timestamp );
+
+ pLogMsg ( klogInfo,
+ "processed $(percent)%"
+ ,
+ "app=%s,pid=%u,timestamp=%lT,version=%V,percent=%u"
+ ,
+ p_name . c_str (),
+ p_pid,
+ & kt,
+ ( ver_t ) p_version,
+ p_percent );
+ return 0;
+}
diff --git a/tools/general-loader/general-loader.cpp b/tools/general-loader/general-loader.cpp
new file mode 100644
index 0000000..74f2512
--- /dev/null
+++ b/tools/general-loader/general-loader.cpp
@@ -0,0 +1,223 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "general-loader.hpp"
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kns/stream.h>
+
+#include <kfs/directory.h>
+
+#include "general-writer.h"
+
+using namespace std;
+
+///////////// GeneralLoader::Reader
+
+GeneralLoader::Reader::Reader( const struct KStream& p_input )
+: m_input ( p_input ),
+ m_buffer ( 0 ),
+ m_bufSize ( 0 ),
+ m_readCount ( 0 )
+{
+ KStreamAddRef ( & m_input );
+}
+
+GeneralLoader::Reader::~Reader()
+{
+ KStreamRelease ( & m_input );
+ free ( m_buffer );
+}
+
+rc_t
+GeneralLoader::Reader::Read( void * p_buffer, size_t p_size )
+{
+ pLogMsg ( klogDebug,
+ "general-loader: reading $(s) bytes, offset=$(o)",
+ "s=%u,o=%lu",
+ ( unsigned int ) p_size, m_readCount );
+
+ m_readCount += p_size;
+ return KStreamReadExactly ( & m_input, p_buffer, p_size );
+}
+
+rc_t
+GeneralLoader::Reader::Read( size_t p_size )
+{
+ if ( p_size > m_bufSize )
+ {
+ m_buffer = realloc ( m_buffer, p_size );
+ if ( m_buffer == 0 )
+ {
+ m_bufSize = 0;
+ m_readCount = 0;
+ return RC ( rcExe, rcFile, rcReading, rcMemory, rcExhausted );
+ }
+ }
+
+ pLogMsg ( klogDebug, "general-loader: reading $(s) bytes", "s=%u", ( unsigned int ) p_size );
+
+ m_readCount += p_size;
+ return KStreamReadExactly ( & m_input, m_buffer, p_size );
+}
+
+void
+GeneralLoader::Reader::Align( uint8_t p_bytes )
+{
+ if ( m_readCount % p_bytes != 0 )
+ {
+ Read ( p_bytes - m_readCount % p_bytes );
+ }
+}
+
+
+///////////// GeneralLoader
+
+GeneralLoader::GeneralLoader ( const std::string& p_programName, const struct KStream& p_input )
+: m_programName ( p_programName ),
+ m_reader ( p_input )
+{
+}
+
+GeneralLoader::~GeneralLoader ()
+{
+}
+
+void
+GeneralLoader::SetTargetOverride( const std::string& p_path )
+{
+ m_targetOverride = p_path;
+}
+
+void
+GeneralLoader::SplitAndAdd( Paths& p_paths, const string& p_path )
+{
+ size_t startPos = 0;
+ size_t colonPos = p_path . find ( ':', startPos );
+ while ( colonPos != string::npos )
+ {
+ p_paths . push_back ( p_path . substr ( startPos, colonPos - startPos ) );
+ startPos = colonPos + 1;
+ colonPos = p_path . find ( ':', startPos );
+ }
+ p_paths . push_back ( p_path . substr ( startPos ) );
+}
+
+void
+GeneralLoader::AddSchemaIncludePath( const string& p_path )
+{
+ SplitAndAdd ( m_includePaths, p_path );
+}
+
+void
+GeneralLoader::AddSchemaFile( const string& p_path )
+{
+ SplitAndAdd ( m_schemas, p_path );
+}
+
+rc_t
+GeneralLoader::Run()
+{
+ bool packed;
+ rc_t rc = ReadHeader ( packed );
+ if ( rc == 0 )
+ {
+ DatabaseLoader loader ( m_programName, m_includePaths, m_schemas, m_targetOverride );
+ if ( packed )
+ {
+ PackedProtocolParser p;
+ rc = p . ParseEvents ( m_reader, loader );
+ }
+ else
+ {
+ UnpackedProtocolParser p;
+ rc = p . ParseEvents ( m_reader, loader );
+ }
+
+ if ( rc != 0 && ! loader . GetDatabaseName() . empty () )
+ {
+ KDirectory* wd;
+ KDirectoryNativeDir ( & wd );
+ KDirectoryRemove ( wd, true, loader . GetDatabaseName() . c_str () );
+ KDirectoryRelease ( wd );
+ }
+ }
+
+ return rc;
+}
+
+rc_t
+GeneralLoader::ReadHeader ( bool& p_packed )
+{
+ struct gw_header_v1 header;
+
+ rc_t rc = m_reader . Read ( & header, sizeof header );
+ if ( rc == 0 )
+ {
+ if ( strncmp ( header . dad . signature, GeneralLoaderSignatureString, sizeof ( header . dad . signature ) ) != 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcHeader, rcCorrupt );
+ }
+ else
+ {
+ switch ( header . dad . endian )
+ {
+ case GW_GOOD_ENDIAN:
+ if ( header . dad . version > GW_CURRENT_VERSION ) /* > comparison so it can read multiple versions */
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcHeader, rcBadVersion );
+ }
+ else
+ {
+ rc = 0;
+ }
+ break;
+ case GW_REVERSE_ENDIAN:
+ LogMsg ( klogErr, "general-loader event: Detected reverse endianness (not yet supported)" );
+ rc = RC ( rcExe, rcFile, rcReading, rcFormat, rcUnsupported );
+ //TODO: apply byte order correction before checking the version number
+ break;
+ default:
+ rc = RC ( rcExe, rcFile, rcReading, rcFormat, rcInvalid );
+ break;
+ }
+ }
+ }
+
+ if ( rc == 0 && header . dad . hdr_size > sizeof header )
+ {
+ rc = m_reader . Read ( header . dad . hdr_size - sizeof header );
+ }
+
+ if ( rc == 0 )
+ {
+ p_packed = header. packing != 0;
+ }
+
+ return rc;
+}
diff --git a/tools/general-loader/general-loader.hpp b/tools/general-loader/general-loader.hpp
new file mode 100644
index 0000000..314e782
--- /dev/null
+++ b/tools/general-loader/general-loader.hpp
@@ -0,0 +1,243 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _sra_tools_hpp_general_loader_
+#define _sra_tools_hpp_general_loader_
+
+#include <klib/defs.h>
+
+#include <string>
+#include <vector>
+#include <map>
+
+struct KStream;
+struct VCursor;
+struct VDatabase;
+struct VDBManager;
+struct VSchema;
+
+#define GeneralLoaderSignatureString GW_SIGNATURE
+
+class GeneralLoader
+{
+public:
+ static const uint32_t MaxPackedString = 256;
+
+public:
+ GeneralLoader ( const std :: string& p_programName, const struct KStream& p_input );
+ ~GeneralLoader ();
+
+ void AddSchemaIncludePath( const std::string& p_path );
+ void AddSchemaFile( const std::string& p_file );
+ void SetTargetOverride( const std::string& p_path );
+
+ rc_t Run ();
+
+private:
+
+ typedef std::vector < std::string > Paths;
+
+private:
+
+ class Reader
+ {
+ public:
+ Reader( const struct KStream& p_input );
+ ~Reader();
+
+ // read into caller's buffer
+ rc_t Read( void * p_buffer, size_t p_size );
+
+ // if rc == 0, there are p_size bytes available through GetBuffer until the next call to Read
+ rc_t Read( size_t p_size );
+
+ const void* GetBuffer() const { return m_buffer; }
+
+ void Align( uint8_t p_bytes = 4 );
+
+ uint64_t GetReadCount() { return m_readCount; }
+
+ private:
+ const struct KStream& m_input;
+ void* m_buffer;
+ size_t m_bufSize;
+ uint64_t m_readCount;
+ };
+
+ class DatabaseLoader
+ {
+ public:
+ struct Table
+ {
+ std :: string name;
+ uint32_t databaseId; // key into Databases
+ uint32_t cursorIdx;
+ };
+
+ struct Column
+ {
+ std :: string name;
+
+ uint32_t tableId; // key into Tables
+ uint32_t cursorIdx; // index into Cursors
+ uint32_t columnIdx; // index in the VCursor
+ uint32_t elemBits;
+ uint32_t flagBits;
+
+ typedef std :: map < std :: string, std :: string > Metadata;
+ Metadata metadata;
+
+ bool IsCompressed () const { return ( flagBits & 1 ) == 1; }
+ };
+
+ public:
+ DatabaseLoader ( const std :: string& p_programName, const Paths& p_includePaths, const Paths& p_schemas, const std::string& p_dbNameOverride = std::string() );
+ ~DatabaseLoader();
+
+ rc_t UseSchema ( const std :: string& p_file, const std :: string& p_name );
+ rc_t RemotePath ( const std :: string& p_path );
+ rc_t SoftwareName ( const std :: string& p_softwareName, const std :: string& p_version );
+ rc_t NewTable ( uint32_t p_tableId, const std :: string& p_tableName );
+ rc_t NewColumn ( uint32_t p_columnId,
+ uint32_t p_tableId,
+ uint32_t p_elemBits,
+ uint8_t p_flags,
+ const std :: string& p_columnName );
+
+ rc_t DBMetadataNode ( uint32_t p_objId, const std :: string& p_metadata_node, const std :: string& p_value );
+ rc_t TblMetadataNode ( uint32_t p_objId, const std :: string& p_metadata_node, const std :: string& p_value );
+ rc_t ColMetadataNode ( uint32_t p_objId, const std :: string& p_metadata_node, const std :: string& p_value );
+
+ rc_t AddMbrDB ( uint32_t p_objId, uint32_t p_parentId, const std :: string &mbr_name, const std :: string &db_name, uint8_t p_create_mode );
+ rc_t AddMbrTbl ( uint32_t p_objId, uint32_t p_parentId, const std :: string &mbr_name, const std :: string &db_name, uint8_t p_create_mode );
+
+ rc_t CellData ( uint32_t p_columnId, const void* p_data, size_t p_elemCount );
+ rc_t CellDefault ( uint32_t p_columnId, const void* p_data, size_t p_elemCount );
+ rc_t NextRow ( uint32_t p_tableId );
+ rc_t MoveAhead ( uint32_t p_tableId, uint64_t p_count );
+ rc_t ErrorMessage ( const std :: string& p_text );
+ rc_t LogMessage ( const std :: string& p_text );
+ rc_t ProgressMessage ( const std :: string& p_name, uint32_t p_pid, uint32_t p_timestamp, uint32_t p_version, uint32_t p_percent );
+ rc_t OpenStream ();
+ rc_t CloseStream ();
+
+ const std :: string& GetDatabaseName() const { return m_databaseName; }
+ const Column* GetColumn ( uint32_t p_columnId ) const;
+
+ private:
+ // Active Cursors
+ typedef std::vector < struct VCursor * > Cursors;
+
+ // from TableId to Table
+ typedef std::map < uint32_t, Table > Tables;
+
+ // from ColumnId to Column
+ typedef std::map < uint32_t, Column > Columns;
+
+ // From database id to VDatabase. id == 0 for the root database.
+ typedef std::map < uint32_t, VDatabase* > Databases;
+
+ // From database id to parent database id
+ typedef std::map < uint32_t, uint32_t > DatabaseToParent;
+
+ private:
+ rc_t MakeDatabase ( uint32_t p_id );
+ rc_t CursorWrite ( const Column& p_col, const void* p_data, size_t p_size );
+ rc_t CursorDefault ( const Column& p_col, const void* p_data, size_t p_size );
+ rc_t SaveColumnMetadata ( const Column& p_col );
+
+ private:
+ Paths m_includePaths;
+ Paths m_schemas;
+
+ std :: string m_programName;
+ std :: string m_databaseName;
+ std :: string m_schemaName;
+
+ std :: string m_softwareName;
+ ver_t m_softwareVersion;
+
+ Cursors m_cursors;
+ Tables m_tables;
+ Columns m_columns;
+ Databases m_databases;
+ DatabaseToParent m_dbParents;
+
+ struct VDBManager* m_mgr;
+ struct VSchema* m_schema;
+
+ bool m_databaseNameOverridden;
+ };
+
+ class ProtocolParser
+ {
+ public:
+ virtual rc_t ParseEvents ( Reader&, DatabaseLoader& ) = 0;
+
+ protected:
+ template <typename TEvent> rc_t ReadEvent ( Reader& p_reader, TEvent& p_event );
+ };
+
+ class UnpackedProtocolParser : public ProtocolParser
+ {
+ public:
+ virtual rc_t ParseEvents ( Reader&, DatabaseLoader& );
+ };
+
+ class PackedProtocolParser : public ProtocolParser
+ {
+ public:
+ virtual rc_t ParseEvents ( Reader&, DatabaseLoader& );
+
+ private:
+ // read p_dataSize bytes and use one of the decoder functions in utf8-like-int-codec.h to unpack a sequence of integer values,
+ // stored in m_unpackingBuf as a collection of bytes
+ template < typename T_uintXX > rc_t UncompressInt ( Reader& p_reader, uint16_t p_dataSize, int ( * p_decode ) ( uint8_t const* buf_start, uint8_t const* buf_xend, T_uintXX* ret_decoded ) );
+
+ rc_t ParseData ( Reader& p_reader, DatabaseLoader& p_dbLoader, uint32_t p_columnId, uint32_t p_dataSize );
+
+ std::vector<uint8_t> m_unpackingBuf;
+ };
+
+private:
+ GeneralLoader(const GeneralLoader&);
+ GeneralLoader& operator = ( const GeneralLoader&);
+
+ rc_t ReadHeader ( bool& p_packed );
+
+ void CleanUp ();
+
+ static void SplitAndAdd( Paths& p_paths, const std::string& p_path );
+
+private:
+ std::string m_programName;
+ Reader m_reader;
+ Paths m_includePaths;
+ Paths m_schemas;
+ std::string m_targetOverride;
+};
+
+#endif
diff --git a/tools/general-loader/general-writer.cpp b/tools/general-loader/general-writer.cpp
new file mode 100644
index 0000000..7658597
--- /dev/null
+++ b/tools/general-loader/general-writer.cpp
@@ -0,0 +1,1172 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "general-writer.hpp"
+#include "utf8-like-int-codec.h"
+
+#include <iterator>
+#include <cstdlib>
+#include <iomanip>
+
+#include <time.h>
+#include <unistd.h>
+#include <assert.h>
+#include <string.h>
+
+#define PROGRESS_EVENT 0
+
+namespace ncbi
+{
+
+#if GW_CURRENT_VERSION <= 2
+ typedef :: gwp_1string_evt_v1 gwp_1string_evt;
+ typedef :: gwp_2string_evt_v1 gwp_2string_evt;
+ typedef :: gwp_column_evt_v1 gwp_column_evt;
+ typedef :: gwp_data_evt_v1 gwp_data_evt;
+ typedef :: gwp_1string_evt_U16_v1 gwp_1string_evt_U16;
+ typedef :: gwp_2string_evt_U16_v1 gwp_2string_evt_U16;
+ typedef :: gwp_data_evt_U16_v1 gwp_data_evt_U16;
+#else
+#error "unrecognized GW version"
+#endif
+
+ // ask the general-loader to use this when naming its output
+ void GeneralWriter :: setRemotePath ( const std :: string & remote_db )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case header_written:
+ new_state = remote_name_sent;
+ break;
+ case schema_sent:
+ new_state = remote_name_and_schema_sent;
+ break;
+ case software_name_sent:
+ new_state = remote_name_and_software_name_sent;
+ break;
+ case schema_and_software_name_sent:
+ new_state = remote_name_schema_and_software_name_sent;
+ break;
+ default:
+ throw "state violation setting remote path";
+ }
+
+ size_t str_size = remote_db . size ();
+ if ( str_size > 0x10000 )
+ throw "remote path too long";
+
+ gwp_1string_evt_U16 hdr;
+ init ( hdr, 0, evt_remote_path2 );
+ set_size ( hdr, str_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( remote_db . data (), str_size );
+
+ state = new_state;
+ }
+
+ // tell the general-loader to use this pre-defined schema
+ void GeneralWriter :: useSchema ( const std :: string & schema_file_name,
+ const std :: string & schema_db_spec )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case header_written:
+ new_state = schema_sent;
+ break;
+ case remote_name_sent:
+ new_state = remote_name_and_schema_sent;
+ break;
+ case software_name_sent:
+ new_state = schema_and_software_name_sent;
+ break;
+ case remote_name_and_software_name_sent:
+ new_state = remote_name_schema_and_software_name_sent;
+ break;
+ default:
+ throw "state violation using schema";
+ }
+
+ size_t str1_size = schema_file_name . size ();
+ if ( str1_size > 0x10000 )
+ throw "schema path too long";
+
+ size_t str2_size = schema_db_spec . size ();
+ if ( str2_size > 0x10000 )
+ throw "schema spec too long";
+
+ gwp_2string_evt_U16 hdr;
+ init ( hdr, 0, evt_use_schema2 );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( schema_file_name . data (), str1_size );
+ internal_write ( schema_db_spec . data (), str2_size );
+
+ state = new_state;
+ }
+
+ void GeneralWriter :: setSoftwareName ( const std :: string & name,
+ const std :: string & version )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case header_written:
+ new_state = software_name_sent;
+ break;
+ case remote_name_sent:
+ new_state = remote_name_and_software_name_sent;
+ break;
+ case schema_sent:
+ new_state = schema_and_software_name_sent;
+ break;
+ case remote_name_and_schema_sent:
+ new_state = remote_name_schema_and_software_name_sent;
+ break;
+ default:
+ throw "state violation using schema";
+ }
+
+ size_t str1_size = name . size ();
+ if ( str1_size > 0x100 )
+ throw "name too long";
+
+ size_t str2_size = version . size ();
+ if ( str2_size > 0x100 )
+ throw "version too long";
+
+ gwp_2string_evt_v1 hdr;
+ init ( hdr, 0, evt_software_name );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( name . data (), str1_size );
+ internal_write ( version . data (), str2_size );
+
+ state = new_state;
+ }
+
+
+ int GeneralWriter :: addTable ( const std :: string &table_name )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case schema_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_schema_and_software_name_sent:
+ new_state = have_table;
+ break;
+ case have_table:
+ case have_column:
+ new_state = state;
+ break;
+ default:
+ throw "state violation adding table";
+ }
+
+ // create a pair between the outer db id ( 0 ) and this table name
+ // this pair will act as an unique key of tables, whereas table_name
+ // itself can be repeated if multiple databases are in use
+ int_dbtbl tbl ( 0, table_name );
+
+ // prediction this is the index
+ int id = ( int ) tables.size() + 1;
+ if ( id > 256 )
+ throw "maximum number of tables exceeded";
+
+ // make sure we never record a table name twice under the same db
+ std :: pair < std :: map < int_dbtbl, int > :: iterator, bool > result =
+ table_name_idx.insert ( std :: pair < int_dbtbl, int > ( tbl, id ) );
+
+ // if first time
+ if ( result.second )
+ {
+ tables.push_back ( tbl );
+
+ size_t str_size = table_name . size ();
+ if ( str_size > 0x10000 )
+ throw "maximum table name length exceeded";
+
+ gwp_1string_evt_U16 hdr;
+ init ( hdr, id, evt_new_table2 );
+ set_size ( hdr, str_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( table_name.data (), str_size );
+
+ state = new_state;
+ }
+
+ // 1 based table id
+ return result.first->second;
+ }
+
+ int GeneralWriter :: addColumn ( int table_id,
+ const std :: string &column_name, uint32_t elem_bits, uint8_t flag_bits )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case have_table:
+ case have_column:
+ new_state = have_column;
+ break;
+ default:
+ throw "state violation adding column";
+ }
+
+ if ( table_id <= 0 || ( size_t ) table_id > tables.size () )
+ throw "Invalid table id";
+
+ // the thing to insert into map
+ // even if the caller wants us to use integer compaction,
+ // it must be with a size we know how to use
+ if ( ( flag_bits & 1 ) != 0 )
+ {
+ switch ( elem_bits )
+ {
+ case 16:
+ case 32:
+ case 64:
+ break;
+ default:
+ flag_bits ^= 1;
+ }
+ }
+
+ int_stream stream ( table_id, column_name, elem_bits, flag_bits );
+
+ // prediction this is the index
+ int id = ( int ) streams.size() + 1;
+ if ( id > 256 )
+ throw "maximum number of columns exceeded";
+
+ // make sure we never record a column-spec twice
+ std :: pair < std :: map < int_stream, int > :: iterator, bool > result =
+ column_name_idx.insert ( std :: pair < int_stream, int > ( stream, id ) );
+
+ // if first time
+ if ( result.second )
+ {
+ streams.push_back ( stream );
+
+ size_t str_size = column_name . size ();
+ if ( str_size > 256 )
+ throw "maximum column spec length exceeded";
+
+ // TBD - write new column stream event to stream
+ gwp_column_evt hdr;
+ init ( hdr, id, evt_new_column );
+ set_table_id ( hdr, table_id );
+ set_elem_bits ( hdr, elem_bits );
+ hdr.flag_bits = flag_bits;
+ set_name_size ( hdr, str_size );
+
+ // write header & data
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( column_name.data (), str_size );
+
+ state = new_state;
+ }
+
+ // 1 based stream id
+ return result.first->second;
+ }
+
+ int GeneralWriter :: dbAddDatabase ( int db_id, const std :: string &mbr_name,
+ const std :: string &db_name, uint8_t create_mode )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case schema_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_schema_and_software_name_sent:
+ new_state = have_table;
+ break;
+ case have_table:
+ case have_column:
+ new_state = state;
+ break;
+ default:
+ throw "state violation adding db";
+ }
+
+ // zero ( 0 ) is a valid db_id
+ if ( db_id < 0 || ( size_t ) db_id > dbs.size () )
+ throw "Invalid database id";
+
+ int_dbtbl db ( db_id, db_name );
+
+ // prediction this is the index
+ int id = ( int ) dbs.size() + 1;
+ if ( id > 256 )
+ throw "maximum number of databases exceeded";
+
+ // make sure we never record a table name twice under the same db
+ std :: pair < std :: map < int_dbtbl, int > :: iterator, bool > result =
+ db_name_idx.insert ( std :: pair < int_dbtbl, int > ( db, id ) );
+
+ // if first time
+ if ( result.second )
+ {
+ dbs.push_back ( db );
+
+ size_t str_size = mbr_name . size ();
+ if ( str_size > 0x100 )
+ throw "maximum member name length exceeded";
+
+ str_size = db_name . size ();
+ if ( str_size > 0x100 )
+ throw "maximum db name length exceeded";
+
+ gwp_add_mbr_evt_v1 hdr;
+ init ( hdr, id, evt_add_mbr_db );
+ set_db_id ( hdr, db_id );
+ set_size1 ( hdr, mbr_name.size () );
+ set_size2 ( hdr, db_name.size () );
+ set_create_mode ( hdr, create_mode );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( mbr_name.data (), mbr_name.size () );
+ internal_write ( db_name.data (), db_name.size () );
+
+ state = new_state;
+ }
+
+ // 1 based db id
+ return result.first->second;
+ }
+
+ int GeneralWriter :: dbAddTable ( int db_id, const std :: string &mbr_name,
+ const std :: string &table_name, uint8_t create_mode )
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case schema_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_schema_and_software_name_sent:
+ new_state = have_table;
+ break;
+ case have_table:
+ case have_column:
+ new_state = state;
+ break;
+ default:
+ throw "state violation adding db_table";
+ }
+
+ // zero ( 0 ) is a valid db_id
+ if ( db_id < 0 || ( size_t ) db_id > dbs.size () )
+ throw "Invalid database id";
+
+ // create a pair between the outer db id ( 0 ) and this table name
+ // this pair will act as an unique key of tables, whereas table_name
+ // itself can be repeated if multiple databases are in use
+ int_dbtbl tbl ( db_id, table_name );
+
+ // prediction this is the index
+ int id = ( int ) tables.size() + 1;
+ if ( id > 256 )
+ throw "maximum number of tables exceeded";
+
+ // make sure we never record a table name twice under the same db
+ std :: pair < std :: map < int_dbtbl, int > :: iterator, bool > result =
+ table_name_idx.insert ( std :: pair < int_dbtbl, int > ( tbl, id ) );
+
+ // if first time
+ if ( result.second )
+ {
+ tables.push_back ( tbl );
+
+ size_t str_size = mbr_name . size ();
+ if ( str_size > 0x100 )
+ throw "maximum member name length exceeded";
+
+ str_size = table_name . size ();
+ if ( str_size > 0x100 )
+ throw "maximum table name length exceeded";
+
+ gwp_add_mbr_evt_v1 hdr;
+ init ( hdr, id, evt_add_mbr_tbl );
+ set_db_id ( hdr, db_id );
+ set_size1 ( hdr, mbr_name.size () );
+ set_size2 ( hdr, table_name.size () );
+ set_create_mode ( hdr, create_mode );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( mbr_name.data (), mbr_name.size () );
+ internal_write ( table_name.data (), table_name.size () );
+
+ state = new_state;
+ }
+
+ // 1 based table id
+ return result.first->second;
+ }
+
+
+
+ void GeneralWriter :: open ()
+ {
+ stream_state new_state = uninitialized;
+
+ switch ( state )
+ {
+ case have_column:
+ new_state = opened;
+ break;
+ case opened:
+ return;
+ default:
+ throw "state violation opening stream";
+ }
+
+ gwp_evt_hdr hdr;
+ init ( hdr, 0, evt_open_stream );
+
+ // write header
+ write_event ( & hdr, sizeof hdr );
+
+ state = new_state;
+ }
+
+ void GeneralWriter :: setDBMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value )
+ {
+ // zero ( 0 ) is a valid db_id
+ if ( obj_id < 0 || ( size_t ) obj_id > dbs.size () )
+ throw "Invalid database id";
+
+ size_t str1_size = node_path . size ();
+ if ( str1_size > STRING_LIMIT_16 )
+ throw "DB_path too long";
+
+ size_t str2_size = value . size ();
+ if ( str2_size > STRING_LIMIT_16 )
+ throw "value too long";
+
+ if ( str1_size <= STRING_LIMIT_8 && str2_size <= STRING_LIMIT_8 )
+ {
+ // use 8-bit sizes
+ gwp_2string_evt_v1 hdr;
+ init ( hdr, obj_id, evt_db_metadata_node );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+ else
+ {
+ // use 16-bit sizes
+ gwp_2string_evt_U16_v1 hdr;
+ init ( hdr, obj_id, evt_db_metadata_node2 );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+
+ internal_write ( node_path . data (), str1_size );
+ internal_write ( value . data (), str2_size );
+ }
+
+ void GeneralWriter :: setTblMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value )
+ {
+ if ( obj_id <= 0 || ( size_t ) obj_id > tables.size () )
+ throw "Invalid table id";
+
+ size_t str1_size = node_path . size ();
+ if ( str1_size > STRING_LIMIT_16 )
+ throw "tbl_path too long";
+
+ size_t str2_size = value . size ();
+ if ( str2_size > STRING_LIMIT_16 )
+ throw "value too long";
+
+ if ( str1_size <= STRING_LIMIT_8 && str2_size <= STRING_LIMIT_8 )
+ {
+ // use 8-bit sizes
+ gwp_2string_evt_v1 hdr;
+ init ( hdr, obj_id, evt_tbl_metadata_node );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+ else
+ {
+ // use 16-bit sizes
+ gwp_2string_evt_U16_v1 hdr;
+ init ( hdr, obj_id, evt_tbl_metadata_node2 );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+
+ internal_write ( node_path . data (), str1_size );
+ internal_write ( value . data (), str2_size );
+
+ }
+ void GeneralWriter :: setColMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value )
+ {
+ if ( obj_id <= 0 || ( size_t ) obj_id > streams.size () )
+ throw "Invalid column id";
+
+ size_t str1_size = node_path . size ();
+ if ( str1_size > STRING_LIMIT_16 )
+ throw "tbl_path too long";
+
+ size_t str2_size = value . size ();
+ if ( str2_size > STRING_LIMIT_16 )
+ throw "value too long";
+
+ if ( str1_size <= STRING_LIMIT_8 && str2_size <= STRING_LIMIT_8 )
+ {
+ // use 8-bit sizes
+ gwp_2string_evt_v1 hdr;
+ init ( hdr, obj_id, evt_col_metadata_node );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+ else
+ {
+ // use 16-bit sizes
+ gwp_2string_evt_U16_v1 hdr;
+ init ( hdr, obj_id, evt_col_metadata_node2 );
+ set_size1 ( hdr, str1_size );
+ set_size2 ( hdr, str2_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+
+ internal_write ( node_path . data (), str1_size );
+ internal_write ( value . data (), str2_size );
+ }
+
+
+ void GeneralWriter :: columnDefault ( int stream_id, uint32_t elem_bits, const void *data, uint32_t elem_count )
+ {
+ switch ( state )
+ {
+ case opened:
+ break;
+ default:
+ throw "state violation setting column default";
+ }
+
+ if ( stream_id < 0 )
+ throw "Stream_id is not valid";
+ if ( stream_id > ( int ) streams.size () )
+ throw "Stream_id is out of bounds";
+
+ if ( elem_bits == 0 )
+ return;
+
+ if ( data == 0 && elem_count != 0 )
+ throw "Invalid data ptr";
+
+ if ( elem_bits != streams [ stream_id - 1 ] . elem_bits )
+ throw "Invalid elem_bits";
+
+ size_t num_bytes = ( ( size_t ) elem_bits * elem_count + 7 ) / 8;
+ if ( num_bytes == 0 )
+ {
+ gwp_evt_hdr_v1 eh;
+ init ( eh, stream_id, evt_empty_default );
+ write_event ( & eh, sizeof eh );
+ }
+ else
+ {
+ if ( num_bytes <= 256 )
+ {
+ gwp_data_evt chunk;
+ init ( chunk, stream_id, evt_cell_default );
+ set_size ( chunk, num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+ else if ( num_bytes <= 0x10000 )
+ {
+ gwp_data_evt_U16 chunk;
+ init ( chunk, stream_id, evt_cell_default2 );
+ set_size ( chunk, num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+ else
+ {
+ throw "default cell-data exceeds maximum";
+ }
+ internal_write ( data, num_bytes );
+ }
+ }
+
+ template < class T >
+ int encode_int ( T val, uint8_t * start, uint8_t * end );
+
+ template <>
+ int encode_int < uint16_t > ( uint16_t val, uint8_t * start, uint8_t * end )
+ {
+ int ret = encode_uint16 ( val, start, end );
+ if ( ret > 0 )
+ {
+ uint16_t val2;
+ int ret2 = decode_uint16 ( start, start + ret, & val2 );
+ assert ( ret == ret2 && val == val2 );
+ }
+ return ret;
+ }
+
+ template <>
+ int encode_int < uint32_t > ( uint32_t val, uint8_t * start, uint8_t * end )
+ {
+ int ret = encode_uint32 ( val, start, end );
+ if ( ret > 0 )
+ {
+ uint32_t val2;
+ int ret2 = decode_uint32 ( start, start + ret, & val2 );
+ assert ( ret == ret2 && val == val2 );
+ }
+ return ret;
+ }
+
+ template <>
+ int encode_int < uint64_t > ( uint64_t val, uint8_t * start, uint8_t * end )
+ {
+ int ret = encode_uint64 ( val, start, end );
+ if ( ret > 0 )
+ {
+ uint64_t val2;
+ int ret2 = decode_uint64 ( start, start + ret, & val2 );
+ assert ( ret == ret2 && val == val2 );
+ }
+ return ret;
+ }
+
+ struct encode_result { uint32_t num_elems, num_bytes; };
+
+ const size_t bsize = 0x10000;
+
+ template < class T > static
+ encode_result encode_buffer ( uint8_t * buffer, const void * data, uint32_t first, uint32_t elem_count )
+ {
+ uint8_t * start = buffer;
+ uint8_t * end = buffer + bsize;
+ const T * input = ( const T * ) data;
+
+ uint32_t i;
+ for ( i = first; i < elem_count; ++ i )
+ {
+ int num_writ = encode_int < T > ( input [ i ], start, end );
+ if ( num_writ <= 0 )
+ {
+ if ( num_writ < 0 )
+ throw "error encoding integer data";
+ break;
+ }
+ start += num_writ;
+ }
+
+ if ( start == buffer )
+ throw "INTERNAL ERROR: no data to encode";
+
+ encode_result rslt;
+ rslt . num_elems = i;
+ rslt . num_bytes = start - buffer;
+
+ return rslt;
+ }
+
+ void GeneralWriter :: write ( int stream_id, uint32_t elem_bits, const void *data, uint32_t elem_count )
+ {
+ switch ( state )
+ {
+ case opened:
+ break;
+ default:
+ throw "state violation writing column data";
+ }
+
+ if ( stream_id < 0 )
+ throw "Stream_id is not valid";
+ if ( stream_id > ( int ) streams.size () )
+ throw "Stream_id is out of bounds";
+
+ if ( elem_bits == 0 || elem_count == 0 )
+ return;
+
+ if ( data == 0 )
+ throw "Invalid data ptr";
+
+ const int_stream & s = streams [ stream_id - 1 ];
+
+ if ( elem_bits != s . elem_bits )
+ throw "Invalid elem_bits";
+
+ bool compact_int = ( s . flag_bits & 1 ) != 0;
+
+ const uint8_t * dp = ( const uint8_t * ) data;
+
+ if ( compact_int )
+ {
+ uint32_t elem;
+ encode_result rslt;
+ encode_result ( * encode ) ( uint8_t * buffer, const void * data, uint32_t first, uint32_t elem_count );
+
+ switch ( elem_bits )
+ {
+ case 16:
+ encode = encode_buffer < uint16_t >;
+ break;
+ case 32:
+ encode = encode_buffer < uint32_t >;
+ break;
+ case 64:
+ encode = encode_buffer < uint64_t >;
+ break;
+ default:
+ throw "INTERNAL ERROR: corrupt element bits";
+ }
+
+ for ( elem = 0; elem < elem_count; elem = rslt . num_elems )
+ {
+ rslt = ( * encode ) ( packing_buffer, data, elem, elem_count );
+ if ( rslt . num_bytes <= 256 )
+ {
+ assert ( rslt . num_bytes != 0 );
+ gwp_data_evt chunk;
+ init ( chunk, stream_id, evt_cell_data );
+ set_size ( chunk, rslt . num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+ else
+ {
+ gwp_data_evt_U16 chunk;
+ init ( chunk, stream_id, evt_cell_data2 );
+ set_size ( chunk, rslt . num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+ internal_write ( packing_buffer, rslt . num_bytes );
+ }
+ }
+ else
+ {
+ size_t num_bytes = ( ( size_t ) elem_bits * elem_count + 7 ) / 8;
+
+ while ( num_bytes >= 0x10000 )
+ {
+ gwp_data_evt_U16 chunk;
+ init ( chunk, stream_id, evt_cell_data2 );
+ set_size ( chunk, 0x10000 );
+ write_event ( & chunk . dad, sizeof chunk );
+ internal_write ( dp, 0x10000 );
+ num_bytes -= 0x10000;
+ dp += 0x10000;
+ }
+
+ if ( num_bytes <= 256 )
+ {
+ gwp_data_evt chunk;
+ init ( chunk, stream_id, evt_cell_data );
+ set_size ( chunk, num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+ else
+ {
+ gwp_data_evt_U16 chunk;
+ init ( chunk, stream_id, evt_cell_data2 );
+ set_size ( chunk, num_bytes );
+ write_event ( & chunk . dad, sizeof chunk );
+ }
+
+ internal_write ( data, num_bytes );
+ }
+ }
+
+ void GeneralWriter :: nextRow ( int table_id )
+ {
+ switch ( state )
+ {
+ case opened:
+ break;
+ default:
+ throw "state violation advancing to next row";
+ }
+
+ if ( table_id < 0 || ( size_t ) table_id > tables.size () )
+ throw "Invalid table id";
+
+ gwp_evt_hdr hdr;
+ init ( hdr, table_id, evt_next_row );
+ write_event ( & hdr, sizeof hdr );
+ }
+
+
+ void GeneralWriter :: moveAhead ( int table_id, uint64_t nrows )
+ {
+ switch ( state )
+ {
+ case opened:
+ break;
+ default:
+ throw "state violation moving ahead nrows";
+ }
+
+ if ( table_id < 0 || ( size_t ) table_id > tables.size () )
+ throw "Invalid table id";
+
+ gwp_move_ahead_evt_v1 hdr;
+ init ( hdr, table_id, evt_move_ahead );
+ set_nrows ( hdr, nrows );
+ write_event ( & hdr . dad, sizeof hdr );
+ }
+
+ void GeneralWriter :: logError ( const std :: string & msg )
+ {
+ switch ( state )
+ {
+ case header_written:
+ case remote_name_sent:
+ case schema_sent:
+ case software_name_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_and_software_name_sent:
+ case schema_and_software_name_sent:
+ case remote_name_schema_and_software_name_sent:
+ case have_table:
+ case have_column:
+ case opened:
+ case error:
+ break;
+ default:
+ return;
+ }
+
+ gwp_1string_evt_U16 hdr;
+ init ( hdr, 0, evt_errmsg2 );
+
+ const char * msg_data = msg . data ();
+ size_t str_size = msg . size ();
+ if ( str_size == 0 )
+ {
+ msg_data = "ERROR: (NO MSG)";
+ str_size = strlen ( msg_data );
+ }
+ else if ( str_size > 0x10000 )
+ str_size = 0x10000;
+
+ set_size ( hdr, str_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( msg_data, str_size );
+ }
+
+ void GeneralWriter :: logMsg ( const std :: string &msg )
+ {
+ switch ( state )
+ {
+ case header_written:
+ case remote_name_sent:
+ case schema_sent:
+ case software_name_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_and_software_name_sent:
+ case schema_and_software_name_sent:
+ case remote_name_schema_and_software_name_sent:
+ case have_table:
+ case have_column:
+ case opened:
+ break;
+ default:
+ return;
+ }
+
+ size_t str_size = msg . size ();
+ if ( str_size == 0 )
+ return;
+
+ if ( str_size > 0x10000 )
+ str_size = 0x10000;
+
+ gwp_1string_evt_U16 hdr;
+ init ( hdr, 0, evt_logmsg );
+
+ set_size ( hdr, str_size );
+ write_event ( & hdr . dad, sizeof hdr );
+ internal_write ( msg . data (), str_size );
+ }
+
+ void GeneralWriter :: progMsg ( const std :: string & name, uint32_t version,
+ uint64_t done, uint64_t total )
+ {
+ switch ( state )
+ {
+ case opened:
+ break;
+ default:
+ return;
+ }
+
+ size_t str_size = name . size ();
+ if ( str_size == 0 )
+ throw "zero-length app-name";
+ if ( str_size > 0x100 )
+ str_size = 0x100;
+
+ // timestamp
+ time_t timestamp = time ( NULL );
+
+ if ( total == 0 )
+ throw "illegal total value: would divide by zero";
+ if ( done > total )
+ throw "illegal done value: greater than total";
+
+ // calculate percentage done
+ double fpercent = ( double ) done / total;
+ assert ( fpercent >= 0.0 && fpercent <= 100.0 );
+ uint8_t percent = ( uint8_t ) ( fpercent * 100 );
+
+ gwp_status_evt_v1 hdr;
+ init ( hdr, 0, evt_progmsg );
+ set_pid ( hdr, pid );
+ set_version ( hdr, version );
+ set_timestamp ( hdr, ( uint32_t ) timestamp );
+ set_size ( hdr, str_size );
+ set_percent ( hdr, percent );
+
+ write_event ( &hdr . dad, sizeof hdr );
+ internal_write ( name.data (), str_size );
+ }
+
+ void GeneralWriter :: endStream ()
+ {
+ switch ( state )
+ {
+ case header_written:
+ case remote_name_sent:
+ case schema_sent:
+ case software_name_sent:
+ case remote_name_and_schema_sent:
+ case remote_name_and_software_name_sent:
+ case schema_and_software_name_sent:
+ case remote_name_schema_and_software_name_sent:
+ case have_table:
+ case have_column:
+ case opened:
+ case error:
+ break;
+ default:
+ return;
+ }
+
+ gwp_evt_hdr hdr;
+ init ( hdr, 0, evt_end_stream );
+ write_event ( & hdr, sizeof hdr );
+
+ state = closed;
+
+ flush ();
+ }
+
+
+ // Constructors
+ GeneralWriter :: GeneralWriter ( const std :: string &out_path )
+ : out ( out_path.c_str(), std::ofstream::binary )
+ , evt_count ( 0 )
+ , byte_count ( 0 )
+ , pid ( getpid () )
+ , packing_buffer ( 0 )
+ , output_buffer ( 0 )
+ , output_bsize ( 0 )
+ , output_marker ( 0 )
+ , out_fd ( -1 )
+ , state ( uninitialized )
+ {
+ packing_buffer = new uint8_t [ bsize ];
+ writeHeader ();
+ }
+
+
+ // Constructors
+ GeneralWriter :: GeneralWriter ( int _out_fd, size_t buffer_size )
+ : evt_count ( 0 )
+ , byte_count ( 0 )
+ , pid ( getpid () )
+ , packing_buffer ( 0 )
+ , output_buffer ( 0 )
+ , output_bsize ( buffer_size )
+ , output_marker ( 0 )
+ , out_fd ( _out_fd )
+ , state ( uninitialized )
+ {
+ packing_buffer = new uint8_t [ bsize ];
+ output_buffer = new uint8_t [ buffer_size ];
+ writeHeader ();
+ }
+
+ GeneralWriter :: ~GeneralWriter ()
+ {
+ try
+ {
+ endStream ();
+ }
+ catch ( ... )
+ {
+ }
+
+ delete [] output_buffer;
+ delete [] packing_buffer;
+
+ output_bsize = output_marker = 0;
+ output_buffer = packing_buffer = 0;
+ }
+
+ bool GeneralWriter :: int_stream :: operator < ( const int_stream &s ) const
+ {
+ if ( table_id != s.table_id )
+ return table_id < s.table_id;
+ return column_name.compare ( s.column_name ) < 0;
+ }
+
+ GeneralWriter :: int_stream :: int_stream ( int _table_id, const std :: string &_column_name, uint32_t _elem_bits, uint8_t _flag_bits )
+ : table_id ( _table_id )
+ , column_name ( _column_name )
+ , elem_bits ( _elem_bits )
+ , flag_bits ( _flag_bits )
+ {
+ }
+
+ bool GeneralWriter :: int_dbtbl :: operator < ( const int_dbtbl &db ) const
+ {
+ if ( db_id != db.db_id )
+ return db_id < db.db_id;
+ return obj_name.compare ( db.obj_name ) < 0;
+ }
+
+ GeneralWriter :: int_dbtbl :: int_dbtbl ( int _db_id, const std :: string &_obj_name )
+ : db_id ( _db_id )
+ , obj_name ( _obj_name )
+ {
+ }
+
+ // Private methods
+
+ uint32_t GeneralWriter :: getPid ()
+ {
+ return ( uint32_t ) pid;
+ }
+
+ void GeneralWriter :: writeHeader ()
+ {
+ :: gw_header_v1 hdr;
+ init ( hdr );
+ internal_write ( & hdr, sizeof hdr );
+ state = header_written;
+
+ }
+
+ void GeneralWriter :: flush ()
+ {
+ if ( out_fd < 0 )
+ out . flush ();
+ else
+ {
+ ssize_t num_writ;
+ for ( size_t total = 0; total < output_marker; total += num_writ )
+ {
+ num_writ = :: write ( out_fd, & output_buffer [ total ], output_marker - total );
+ if ( num_writ < 0 )
+ throw "Error writing to fd";
+ if ( num_writ == 0 )
+ throw "Transfer incomplete writing to fd";
+ }
+
+ output_marker = 0;
+ }
+ }
+
+ void GeneralWriter :: internal_write ( const void * data, size_t num_bytes )
+ {
+ if ( out_fd < 0 )
+ {
+ out.write ( ( const char * ) data, num_bytes );
+ byte_count += num_bytes;
+ }
+ else
+ {
+ size_t total;
+ const uint8_t * p = ( const uint8_t * ) data;
+ for ( total = 0; total < num_bytes; )
+ {
+ size_t avail = output_bsize - output_marker;
+ if ( avail == 0 )
+ {
+ flush ();
+ avail = output_bsize - output_marker;
+ }
+
+ size_t to_write = num_bytes - total;
+ if ( to_write > avail )
+ to_write = avail;
+
+ assert ( to_write != 0 );
+ memmove ( & output_buffer [ output_marker ], & p [ total ], to_write );
+ output_marker += to_write;
+ total += to_write;
+ }
+
+ byte_count += total;
+ }
+ }
+
+ void GeneralWriter :: write_event ( const gwp_evt_hdr * e, size_t evt_size )
+ {
+#if PROGRESS_EVENT
+ uint64_t ec = evt_count;
+ if ( ( ec % 10000 ) == 0 )
+ {
+ if ( ( ec % 500000 ) == 0 )
+ std :: cerr << "\n% [" << std :: setw ( 12 ) << byte_count << "] " << std :: setw ( 9 ) << ec + 1 << ' ';
+ std :: cerr << '.';
+ }
+#endif
+ ++ evt_count;
+
+ assert ( evt ( * e ) != evt_bad_event );
+ assert ( evt ( * e ) < evt_max_id );
+
+ internal_write ( e, evt_size );
+ }
+
+}
diff --git a/tools/general-loader/general-writer.h b/tools/general-loader/general-writer.h
new file mode 100644
index 0000000..59feb3c
--- /dev/null
+++ b/tools/general-loader/general-writer.h
@@ -0,0 +1,1081 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_general_writer_
+#define _h_general_writer_
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+#include <string.h>
+#endif
+
+
+/*----------------------------------------------------------------------
+ * event codes
+ */
+
+enum gw_evt_id
+{
+ evt_bad_event,
+
+ evt_errmsg, /* convey processing error msg */
+ evt_end_stream, /* cleanly terminates a stream */
+
+ evt_remote_path, /* sets remote output path */
+ evt_use_schema, /* conveys schema usage */
+ evt_new_table, /* create a new table */
+ evt_new_column, /* create a new column in tbl */
+ evt_open_stream, /* open stream for data flow */
+
+ evt_cell_default, /* set/reset cell default val */
+ evt_cell_data, /* write/append data cell */
+ evt_next_row, /* move to next row in table */
+ evt_move_ahead, /* move ahead by N rows */
+
+ evt_errmsg2,
+ evt_remote_path2,
+ evt_use_schema2,
+ evt_new_table2,
+ evt_cell_default2, /* packed default <= 64K bytes */
+ evt_cell_data2, /* packed data <= 64K bytes */
+ evt_empty_default, /* set cell default to empty */
+
+ /* BEGIN VERSION 2 MESSAGES */
+ evt_software_name, /* sets software name */
+ evt_db_metadata_node, /* uses gw(p)_2string_evt_v1 */
+ evt_tbl_metadata_node,
+ evt_col_metadata_node,
+ evt_db_metadata_node2, /* uses gwp_2string_evt_U16 */
+ evt_tbl_metadata_node2,
+ evt_col_metadata_node2,
+
+ evt_add_mbr_db,
+ evt_add_mbr_tbl,
+
+ evt_logmsg,
+ evt_progmsg,
+
+ evt_max_id /* must be last */
+};
+
+#define GW_SIGNATURE "NCBIgnld"
+#define GW_GOOD_ENDIAN 1
+#define GW_REVERSE_ENDIAN ( 1 << 24 )
+#define GW_CURRENT_VERSION 2
+
+//These are not to change
+#define STRING_LIMIT_8 0x100
+#define STRING_LIMIT_16 0x10000
+#define ID_LOWER_LIMIT 0
+#define ID_UPPER_LIMIT 255
+
+/********************************
+ * DESCRIPTION OF STREAM EVENTS *
+ ********************************
+
+ *. BYTE ORDER
+ All binary data are in origination-host-native byte order.
+ The originating host indicates its byte order in the stream header.
+ Two byte-orders are supported: little-endian and big-endian.
+
+ *. PACKING
+ The preferred mode of operation for reduction of network bandwidth
+ is "packed". In this mode, the event structures use single-byte members
+ whenever possible, and there is no word alignment within the stream.
+ In addition, events with integer data can utilize a packing algorithm
+ to reduce the bandwidth consumed when the values are typically small
+ with regard to the stated type.
+
+ Packed mode is useful from C and C++ where there is ample support
+ from the language itself. Non-packed mode is more natural for languages
+ such as Python and Java and uses word-size members within structs and
+ does not perform any integer data packing.
+
+ NB - packed mode makes use of knowing that zero-length items
+ are invalid and should not be sent, and so stores length-1 wherever
+ a length is required, thus giving a range of 1..256 rather than
+ 0..255 for a single byte. The same is true for ids.
+
+ 1. STREAM HEADER
+ The stream starts with a header appropriate for the protocol
+ version in use. For version 1, use a "gw_header_v1".
+
+ Every stream header must have the standard "gw_header" as its
+ base definition. This portion presents an 8-character signature
+ to identify the type of stream, followed immediately by an integer
+ indicating originating-host byte order. The receiver must verify that
+ this value is either GW_GOOD_ENDIAN or GW_REVERSE_ENDIAN; any other
+ value means the stream is either not of this protocol or corrupt.
+ A value of GW_REVERSE_ENDIAN implies that the receiver must perform
+ byte-swapping on all word values within all events and their data.
+ This is likely to be a nearly untenable task by any but the
+ general-loader, where the latter has access to type information.
+
+ The value presented for version must be >= 1 and <= GW_CURRENT_VERSION.
+ A value of 0 must be rejected as not conforming to protocol while a
+ value > GW_CURRENT_VERSION cannot be processed.
+
+ The v1 value for "packing" currently allows for two values: 0 and 1,
+ where 0 means that no packing will be used and 1 indicates packed
+ events will be used. This affects how all subsequent events are to
+ be sent and received.
+
+ 2. SET REMOTE PATH [ OPTIONAL ]
+ In the not-packed case, use "gw_1string_evt".
+ GW_SET_ID_EVT ( & evt.dad, 0, evt_remote_path );
+ evt.sz = strlen ( path );
+ follow with the bytes in path
+ write ( path, strlen ( path ) );
+ end with 0..3 bytes of value 0 to realign stream to 4-byte boundary.
+
+ In the packed case where strlen ( path ) <= 256, use "gwp_1string_evt".
+ GWP_SET_ID_EVT ( & evt.dad, 0, evt_remote_path );
+ evt.sz = strlen ( path ) - 1;
+ follow with the bytes in path
+ write ( path, strlen ( path ) );
+
+ In the packed case where strlen ( path ) > 0x100 but <= 0x10000, use "gwp_1string_evt_U16"
+ GWP_SET_ID_EVT ( & evt.dad, 0, evt_remote_path2 );
+ evt.sz = strlen ( path ) - 1;
+ follow with the bytes in path
+ write ( path, strlen ( path ) );
+
+ MORE TO COME...
+
+ */
+
+
+/*======================================================================
+ * version 1
+ */
+
+/* gw_header
+ * common to all versions
+ */
+struct gw_header
+{
+ char signature [ 8 ]; /* = GW_SIGNATURE */
+ uint32_t endian; /* = GW_GOOD_ENDIAN or GW_REVERSE_ENDIAN */
+ uint32_t version; /* 0 < version <= GW_CURRENT_VERSION */
+ uint32_t hdr_size; /* the size of the entire header, including alignment */
+};
+
+/* gw_header_v1
+ * v1 header
+ */
+struct gw_header_v1
+{
+ gw_header dad;
+ uint32_t packing; /* 0 = no packing, 1 = byte packing */
+};
+
+
+/*----------------------------------------------------------------------
+ * full-size ( not packed ) events
+ */
+
+/* gw_evt_hdr
+ * common header to not-packed v1 events
+ *
+ * used as-is for events:
+ * { evt_end_stream, evt_open_stream, evt_next_row }
+ */
+struct gw_evt_hdr_v1
+{
+ uint32_t id_evt; /* bits 0..23 = id, bits 24..31 = event code */
+};
+
+/* gw_1string_evt_v1
+ * event to convey a single string of information
+ *
+ * used for events:
+ * { evt_errmsg, evt_remote_path, evt_new_table }
+ */
+struct gw_1string_evt_v1
+{
+ gw_evt_hdr_v1 dad; /* common header : id = 0 or new table id > 0 */
+ uint32_t sz; /* size of string in bytes - NO trailing NUL byte */
+ /* char str [ sz ]; * string data. *
+ char align [ 0..3 ]; * ( ( 4 - sizeof str % 4 ) % 4 ) zeros to align */
+};
+
+/* gw_2string_evt
+ * event used to send a pair of strings
+ *
+ * used for events:
+ * { evt_use_schema }
+ */
+struct gw_2string_evt_v1
+{
+ gw_evt_hdr_v1 dad; /* common header : id = 0 */
+ uint32_t sz1; /* size of string 1 in bytes, NO trailing NUL byte */
+ uint32_t sz2; /* size of string 2 in bytes, NO trailing NUL byte */
+ /* char str [ sz1+sz2 ]; * string data. *
+ char align [ 0..3 ]; * ( ( 4 - sizeof str % 4 ) % 4 ) zeros */
+};
+
+/* gw_column_evt
+ * event used to create a new column
+ *
+ * used for events:
+ * { evt_new_column }
+ */
+struct gw_column_evt_v1
+{
+ gw_evt_hdr_v1 dad; /* common header : id = new column id > 0 */
+ uint32_t table_id; /* id of column's table */
+ uint32_t elem_bits; /* the size of each element in data type */
+ uint32_t name_sz; /* the size in bytes of column "name" ( spec ) */
+ /* char name [ name_sz ]; * the column name/spec. *
+ char align [ 0..3 ]; * ( ( 4 - sizeof name % 4 ) % 4 ) zeros */
+};
+
+/* gw_data_evt
+ * event used to transfer cell data
+ *
+ * used for events:
+ * { evt_cell_default, evt_cell_data }
+ */
+struct gw_data_evt_v1
+{
+ gw_evt_hdr_v1 dad; /* common header : id = column id */
+ uint32_t elem_count; /* the number of elements in data */
+ /* uint8_t data [ x ]; * event data. actual size is: *
+ * ( ( elem_count * col . elem_bits ) + 7 ) / 8 *
+ char align [ 0..3 ]; * ( ( 4 - sizeof data % 4 ) % 4 ) zeros */
+};
+
+/* gw_move_ahead_evt_v1
+ */
+struct gw_move_ahead_evt_v1
+{
+ gw_evt_hdr_v1 dad; /* common header : id = column id */
+ uint32_t nrows [ 2 ]; /* the number of rows to move ahead */
+};
+
+struct gw_add_mbr_evt_v1
+{
+ gw_evt_hdr_v1 dad;
+ uint32_t db_id;
+ uint32_t mbr_sz;
+ uint32_t name_sz;
+ uint8_t create_mode;
+};
+
+struct gw_status_evt_v1
+{
+ gw_evt_hdr_v1 dad;
+ uint32_t version;
+ uint32_t timestamp;
+ uint32_t pid;
+ uint32_t name_sz;
+ uint32_t percent;
+};
+
+/*----------------------------------------------------------------------
+ * packed events
+ * used for C/C++ level operations
+ */
+
+/* gwp_evt_hdr
+ * common header to packed v1 events
+ *
+ * given that id 0 is illegal, this structure does not allocate a
+ * code for it, but rather stores all ids as id-1, i.e. 1..256 => 0..255.
+ *
+ * used as-is for events:
+ * { evt_end_stream, evt_open_stream, evt_next_row }
+ */
+struct gwp_evt_hdr_v1
+{
+ uint8_t _evt; /* event code from enum */
+ uint8_t _id; /* ids 1..256 represented as 0..255 */
+};
+
+/* gwp_1string_evt
+ * event to convey a single string of information
+ *
+ * used for events:
+ * { evt_errmsg, evt_remote_path, evt_new_table }
+ */
+struct gwp_1string_evt_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = 0 or new table id > 0 */
+ uint8_t sz; /* size of string - 1 in bytes - NO trailing NUL */
+ /* char str [ sz+1 ]; * string data */
+};
+
+/* gwp_2string_evt
+ * event used to send a pair of strings
+ *
+ * used for events:
+ * { evt_use_schema }
+ */
+struct gwp_2string_evt_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = 0 */
+ uint8_t sz1; /* size of string 1 - 1 in bytes, NO trailing NUL */
+ uint8_t sz2; /* size of string 2 - 1 in bytes, NO trailing NUL */
+ /* char str[ sz1+sz2+2 ]; * string data. */
+};
+
+/* gwp_column_evt
+ * event used to create a new column
+ *
+ * used for events:
+ * { evt_new_column }
+ */
+struct gwp_column_evt_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = new column id > 0 */
+ uint8_t table_id; /* id - 1 of column's table */
+ uint8_t elem_bits; /* the size - 1 of each element in data type */
+ uint8_t flag_bits; /* bit[0] = 1 means uses integer element packing */
+ uint8_t name_sz; /* the size - 1 in bytes of column "name" ( spec ) */
+ /* char name [ name_sz+1 ]; the column name/spec. */
+};
+
+/* gwp_data_evt
+ * event used to transfer cell data
+ *
+ * used for events:
+ * { evt_cell_default, evt_cell_data }
+ */
+struct gwp_data_evt_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = column id */
+ uint8_t sz; /* the size - 1 of data in bytes */
+ /* uint8_t data [ sz+1 ]; * event data. */
+};
+
+/* gwp_move_ahead_evt_v1
+ */
+struct gwp_move_ahead_evt_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = column id */
+ uint16_t nrows [ 4 ]; /* the number of rows to move ahead */
+};
+
+
+/* SPECIAL VERSIONS WITH 16-BIT SIZE FIELDS */
+
+/* gwp_1string_evt_U16
+ * event to convey a single string of information
+ *
+ * used for events:
+ * { evt_errmsg2, evt_remote_path2, evt_new_table2 }
+ *
+ * ...whenever size of string > 256
+ */
+struct gwp_1string_evt_U16_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = 0 or new table id > 0 */
+ uint16_t sz; /* size of string - 1 in bytes - NO trailing NUL */
+ /* char str [ sz+1 ]; * string data. */
+};
+
+/* gwp_2string_evt_U16
+ * event used to send a pair of strings
+ *
+ * used for events:
+ * { evt_use_schema2 }
+ *
+ * ...whenever size of any string > 256
+ */
+struct gwp_2string_evt_U16_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = 0 */
+ uint16_t sz1; /* size of string 1 - 1 in bytes, NO trailing NUL */
+ uint16_t sz2; /* size of string 2 - 1 in bytes, NO trailing NUL */
+ /* char str[ sz1+sz2+2 ]; * string data. */
+};
+
+
+/* gwp_data_evt_16
+ * event used to transfer cell data
+ *
+ * used for events:
+ * { evt_cell_default2, evt_cell_data2 }
+ */
+struct gwp_data_evt_U16_v1
+{
+ gwp_evt_hdr_v1 dad; /* common header : id = column id */
+ uint16_t sz; /* the size - 1 of data in bytes */
+ /* uint8_t data [ sz+1 ]; * event data. */
+};
+
+struct gwp_add_mbr_evt_v1
+{
+ gwp_evt_hdr_v1 dad;
+ uint8_t db_id;
+ uint8_t mbr_sz;
+ uint8_t name_sz;
+ uint8_t create_mode;
+};
+
+struct gwp_status_evt_v1
+{
+ gwp_evt_hdr_v1 dad;
+ uint32_t version;
+ uint32_t timestamp;
+ uint32_t pid;
+ uint8_t name_sz;
+ uint8_t percent;
+};
+
+#ifdef __cplusplus
+/*======================================================================
+ * support for C++
+ */
+
+#include <string.h>
+#include <assert.h>
+
+namespace ncbi
+{
+ // gw_header
+ inline void init ( :: gw_header & hdr )
+ {
+ memmove ( hdr . signature, GW_SIGNATURE, sizeof hdr . signature );
+ hdr . endian = GW_GOOD_ENDIAN;
+ hdr . version = GW_CURRENT_VERSION;
+ hdr . hdr_size = sizeof ( :: gw_header );
+ }
+
+ inline void init ( :: gw_header & hdr, size_t hdr_size )
+ {
+ init ( hdr );
+ hdr . hdr_size = ( uint32_t ) hdr_size;
+ }
+
+ // gw_header_v1
+ inline void init ( :: gw_header_v1 & hdr )
+ { init ( hdr . dad, sizeof ( :: gw_header_v1 ) ); hdr . packing = 1; }
+
+ inline void init ( :: gw_header_v1 & hdr, const :: gw_header & dad )
+ { hdr . dad = dad; hdr . packing = 0; }
+
+
+
+ // gw_evt_hdr
+ inline void init ( :: gw_evt_hdr_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ assert ( id < 0x1000000 );
+ assert ( evt != evt_bad_event );
+ assert ( evt < evt_max_id );
+
+ hdr . id_evt = ( id & 0xFFFFFF ) | ( ( uint32_t ) evt << 24 );
+ }
+
+ inline uint32_t id ( const :: gw_evt_hdr_v1 & self )
+ { return self . id_evt & 0xFFFFFF; }
+
+ inline gw_evt_id evt ( const :: gw_evt_hdr_v1 & self )
+ { return ( gw_evt_id ) ( self . id_evt >> 24 ); }
+
+
+ // recording string size
+ inline void set_string_size ( uint32_t & sz, size_t bytes )
+ {
+ assert ( bytes != 0 );
+ assert ( sizeof bytes == 4 || ( bytes >> 32 ) == 0 );
+ sz = ( uint32_t ) bytes;
+ }
+
+ // gw_1string_evt
+ inline void init ( :: gw_1string_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ { init ( hdr . dad, id, evt ); hdr . sz = 0; }
+
+ inline void init ( :: gw_1string_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ { hdr . dad = dad; hdr . sz = 0; }
+
+ inline size_t size ( const :: gw_1string_evt_v1 & self )
+ { return self . sz; }
+
+ inline void set_size ( :: gw_1string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz, bytes ); }
+
+
+ // gw_2string_evt
+ inline void init ( :: gw_2string_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline void init ( :: gw_2string_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline size_t size1 ( const gw_2string_evt_v1 & self )
+ { return self . sz1; }
+
+ inline size_t size2 ( const gw_2string_evt_v1 & self )
+ { return self . sz2; }
+
+ inline void set_size1 ( :: gw_2string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz1, bytes ); }
+
+ inline void set_size2 ( :: gw_2string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz2, bytes ); }
+
+ // gw_column_evt
+ inline void init ( :: gw_column_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . table_id = hdr . elem_bits = hdr . name_sz = 0;
+ }
+
+ inline void init ( :: gw_column_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . table_id = hdr . elem_bits = hdr . name_sz = 0;
+ }
+
+ inline uint32_t table_id ( const :: gw_column_evt_v1 & self )
+ { return self . table_id; }
+
+ inline uint32_t elem_bits ( const :: gw_column_evt_v1 & self )
+ { return self . elem_bits; }
+
+ inline uint8_t flag_bits ( const :: gw_column_evt_v1 & self )
+ { return 0; }
+
+ inline size_t name_size ( const :: gw_column_evt_v1 & self )
+ { return self . name_sz; }
+
+ inline void set_table_id ( :: gw_column_evt_v1 & self, uint32_t table_id )
+ {
+ assert ( table_id != 0 );
+ self . table_id = table_id;
+ }
+
+ inline void set_elem_bits ( :: gw_column_evt_v1 & self, uint32_t elem_bits )
+ {
+ assert ( elem_bits != 0 );
+ self . elem_bits = elem_bits;
+ }
+
+ inline void set_name_size ( :: gw_column_evt_v1 & self, size_t name_size )
+ { set_string_size ( self . name_sz, name_size ); }
+
+
+ // gw_data_evt
+ inline void init ( :: gw_data_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ { init ( hdr . dad, id, evt ); hdr . elem_count = 0; }
+
+ inline void init ( :: gw_data_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ { hdr . dad = dad; hdr . elem_count = 0; }
+
+ inline uint32_t elem_count ( const :: gw_data_evt_v1 & self )
+ { return self . elem_count; }
+
+ inline void set_elem_count ( :: gw_data_evt_v1 & self, uint32_t elem_count )
+ {
+ assert ( elem_count != 0 );
+ self . elem_count = elem_count;
+ }
+
+ // gw_move_ahead_evt_v1
+ inline void init ( :: gw_move_ahead_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ memset ( & hdr . nrows, 0, sizeof hdr . nrows );
+ }
+
+ inline void init ( :: gw_move_ahead_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ memset ( & hdr . nrows, 0, sizeof hdr . nrows );
+ }
+
+ inline uint64_t get_nrows ( const :: gw_move_ahead_evt_v1 & self )
+ {
+ uint64_t nrows;
+ memmove ( & nrows, & self . nrows, sizeof nrows );
+ return nrows;
+ }
+
+ inline void set_nrows ( :: gw_move_ahead_evt_v1 & self, uint64_t nrows )
+ {
+ memmove ( & self . nrows, & nrows, sizeof self . nrows );
+ }
+
+ // gw_add_mbr_evt
+ inline void init ( :: gw_add_mbr_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . db_id = hdr . mbr_sz = hdr . name_sz = hdr . create_mode = 0;
+ }
+
+ inline void init ( :: gw_add_mbr_evt_v1 & hdr, const :: gw_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . db_id = hdr . mbr_sz = hdr . name_sz = hdr . create_mode = 0;
+ }
+
+ inline uint32_t db_id ( const gw_add_mbr_evt_v1 & self )
+ { return self . db_id; }
+
+ inline void set_db_id ( :: gw_add_mbr_evt_v1 & self, uint8_t db_id )
+ {
+ assert ( db_id >= 0 );
+ self . db_id = db_id;
+ }
+
+ inline size_t size1 ( const gw_add_mbr_evt_v1 & self )
+ { return ( size_t ) self . mbr_sz; }
+
+ inline size_t size2 ( const gw_add_mbr_evt_v1 & self )
+ { return ( size_t ) self . name_sz; }
+
+ inline void set_size1 ( :: gw_add_mbr_evt_v1 & self, size_t bytes )
+ {
+ set_string_size ( self . mbr_sz, bytes );
+ }
+
+ inline void set_size2 ( :: gw_add_mbr_evt_v1 & self, size_t bytes )
+ {
+ set_string_size ( self . name_sz, bytes );
+ }
+
+ inline uint8_t create_mode ( const gw_add_mbr_evt_v1 & self )
+ { return self . create_mode; }
+
+ inline void set_create_mode ( :: gw_add_mbr_evt_v1 & self, uint8_t mode )
+ {
+ self . create_mode = mode;
+ }
+
+ // gw_status_evt
+ inline void init ( :: gw_status_evt_v1 &hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . version = hdr . timestamp = hdr . pid = hdr . name_sz = hdr . percent = 0;
+ }
+
+ inline void init ( :: gw_status_evt_v1 &hdr, const :: gw_evt_hdr_v1 &dad )
+ {
+ hdr . dad = dad;
+ hdr . version = hdr . timestamp = hdr . pid = hdr . name_sz = hdr . percent = 0;
+ }
+
+ inline void set_version ( :: gw_status_evt_v1 &self, uint32_t version )
+ {
+ assert ( version > 0 );
+ self . version = version;
+ }
+
+ inline uint32_t version ( const :: gw_status_evt_v1 &self )
+ { return self . version; }
+
+ inline void set_timestamp ( :: gw_status_evt_v1 &self, uint32_t timestamp )
+ {
+ assert ( timestamp > 0 );
+ self . timestamp = timestamp;
+ }
+
+ inline uint32_t timestamp ( const :: gw_status_evt_v1 &self )
+ { return self . timestamp; }
+
+ inline void set_pid ( :: gw_status_evt_v1 &self, uint32_t pid )
+ {
+ assert ( pid > 0 );
+ self . pid = pid;
+ }
+
+ inline uint32_t pid ( const :: gw_status_evt_v1 &self )
+ { return self . pid; }
+
+ inline void set_size ( :: gw_status_evt_v1 &self, size_t bytes )
+ {
+ set_string_size ( self . name_sz, bytes );
+ }
+
+ inline size_t size ( const :: gw_status_evt_v1 &self )
+ { return ( size_t ) self . name_sz; }
+
+ inline void set_percent ( :: gw_status_evt_v1 &self, uint32_t percent )
+ {
+ self . percent = percent;
+ }
+
+ inline uint32_t percent ( const :: gw_status_evt_v1 &self )
+ { return self . percent; }
+
+ ////////// packed events //////////
+
+ // gwp_evt_hdr
+ inline void init ( :: gwp_evt_hdr_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ // allow zero, but treat as 256
+ assert ( id <= 0x100 );
+ assert ( evt != evt_bad_event );
+ assert ( evt < evt_max_id );
+
+ hdr . _evt = ( uint8_t ) evt;
+ hdr . _id = ( uint8_t ) ( id - 1 );
+ }
+
+ inline uint32_t id ( const :: gwp_evt_hdr_v1 & self )
+ { return ( uint32_t ) self . _id + 1; }
+
+ inline gw_evt_id evt ( const :: gwp_evt_hdr_v1 & self )
+ { return ( gw_evt_id ) self . _evt; }
+
+
+ // recording string size
+ inline void set_string_size ( uint8_t & sz, size_t bytes )
+ {
+ assert ( bytes != 0 );
+ assert ( bytes <= 0x100 );
+ sz = ( uint8_t ) ( bytes - 1 );
+ }
+
+ // gwp_1string_evt
+ inline void init ( :: gwp_1string_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz = 0;
+ }
+
+ inline void init ( :: gwp_1string_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz = 0;
+ }
+
+ inline size_t size ( const :: gwp_1string_evt_v1 & self )
+ { return ( size_t ) self . sz + 1; }
+
+ inline void set_size ( :: gwp_1string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz, bytes ); }
+
+
+ // gwp_2string_evt
+ inline void init ( :: gwp_2string_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline void init ( :: gwp_2string_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline size_t size1 ( const gwp_2string_evt_v1 & self )
+ { return ( size_t ) self . sz1 + 1; }
+
+ inline size_t size2 ( const gwp_2string_evt_v1 & self )
+ { return ( size_t ) self . sz2 + 1; }
+
+ inline void set_size1 ( :: gwp_2string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz1, bytes ); }
+
+ inline void set_size2 ( :: gwp_2string_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz2, bytes ); }
+
+
+ // gwp_column_evt
+ inline void init ( :: gwp_column_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . table_id = hdr . elem_bits = hdr . name_sz = 0;
+ }
+
+ inline void init ( :: gwp_column_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . table_id = hdr . elem_bits = hdr . name_sz = 0;
+ }
+
+ inline uint32_t table_id ( const :: gwp_column_evt_v1 & self )
+ { return ( uint32_t ) self . table_id + 1; }
+
+ inline uint32_t elem_bits ( const :: gwp_column_evt_v1 & self )
+ { return ( uint32_t ) self . elem_bits + 1; }
+
+ inline uint8_t flag_bits ( const :: gwp_column_evt_v1 & self )
+ { return self . flag_bits; }
+
+ inline size_t name_size ( const :: gwp_column_evt_v1 & self )
+ { return ( size_t ) self . name_sz + 1; }
+
+ inline void set_table_id ( :: gwp_column_evt_v1 & self, uint32_t table_id )
+ {
+ assert ( table_id != 0 );
+ assert ( table_id <= 0x100 );
+ self . table_id = ( uint8_t ) ( table_id - 1 );
+ }
+
+ inline void set_elem_bits ( :: gwp_column_evt_v1 & self, uint32_t elem_bits )
+ {
+ assert ( elem_bits != 0 );
+ assert ( elem_bits <= 0x100 );
+ self . elem_bits = ( uint8_t ) ( elem_bits - 1 );
+ }
+
+ inline void set_name_size ( :: gwp_column_evt_v1 & self, size_t name_size )
+ { set_string_size ( self . name_sz, name_size ); }
+
+
+ // gwp_data_evt
+ inline void init ( :: gwp_data_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz = 0;
+ }
+
+ inline void init ( :: gwp_data_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz = 0;
+ }
+
+ inline uint32_t size ( const :: gwp_data_evt_v1 & self )
+ { return ( uint32_t ) self . sz + 1; }
+
+ inline void set_size ( :: gwp_data_evt_v1 & self, size_t bytes )
+ { set_string_size ( self . sz, bytes ); }
+
+
+ // gwp_move_ahead_evt_v1
+ inline void init ( :: gwp_move_ahead_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ memset ( & hdr . nrows, 0, sizeof hdr . nrows );
+ }
+
+ inline void init ( :: gwp_move_ahead_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ memset ( & hdr . nrows, 0, sizeof hdr . nrows );
+ }
+
+ inline uint64_t get_nrows ( const :: gwp_move_ahead_evt_v1 & self )
+ {
+ uint64_t nrows;
+ memmove ( & nrows, & self . nrows, sizeof nrows );
+ return nrows;
+ }
+
+ inline void set_nrows ( :: gwp_move_ahead_evt_v1 & self, uint64_t nrows )
+ {
+ memmove ( & self . nrows, & nrows, sizeof self . nrows );
+ }
+
+
+ // recording string size
+ inline void set_string_size ( uint16_t & sz, size_t bytes )
+ {
+ assert ( bytes != 0 );
+ assert ( bytes <= 0x10000 );
+ sz = ( uint16_t ) ( bytes - 1 );
+ }
+
+ // gwp_1string_evt_U16
+ inline void init ( :: gwp_1string_evt_U16_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz = 0;
+ }
+
+ inline void init ( :: gwp_1string_evt_U16_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz = 0;
+ }
+
+ inline size_t size ( const :: gwp_1string_evt_U16_v1 & self )
+ { return ( size_t ) self . sz + 1; }
+
+ inline void set_size ( :: gwp_1string_evt_U16_v1 & self, size_t bytes )
+ { set_string_size ( self . sz, bytes ); }
+
+
+ // gwp_2string_evt
+ inline void init ( :: gwp_2string_evt_U16_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline void init ( :: gwp_2string_evt_U16_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz1 = hdr . sz2 = 0;
+ }
+
+ inline size_t size1 ( const gwp_2string_evt_U16_v1 & self )
+ { return ( size_t ) self . sz1 + 1; }
+
+ inline size_t size2 ( const gwp_2string_evt_U16_v1 & self )
+ { return ( size_t ) self . sz2 + 1; }
+
+ inline void set_size1 ( :: gwp_2string_evt_U16_v1 & self, size_t bytes )
+ { set_string_size ( self . sz1, bytes ); }
+
+ inline void set_size2 ( :: gwp_2string_evt_U16_v1 & self, size_t bytes )
+ { set_string_size ( self . sz2, bytes ); }
+
+
+ // gwp_data_evt
+ inline void init ( :: gwp_data_evt_U16_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . sz = 0;
+ }
+
+ inline void init ( :: gwp_data_evt_U16_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . sz = 0;
+ }
+
+ inline uint32_t size ( const :: gwp_data_evt_U16_v1 & self )
+ { return ( uint32_t ) self . sz + 1; }
+
+ inline void set_size ( :: gwp_data_evt_U16_v1 & self, size_t bytes )
+ { set_string_size ( self . sz, bytes ); }
+
+
+ // gwp_add_mbr_evt
+ inline void init ( :: gwp_add_mbr_evt_v1 & hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . db_id = hdr . mbr_sz = hdr . name_sz = hdr . create_mode = 0;
+ }
+
+ inline void init ( :: gwp_add_mbr_evt_v1 & hdr, const :: gwp_evt_hdr_v1 & dad )
+ {
+ hdr . dad = dad;
+ hdr . db_id = hdr . mbr_sz = hdr . name_sz = hdr . create_mode = 0;
+ }
+
+ inline uint8_t db_id ( const gwp_add_mbr_evt_v1 & self )
+ { return self . db_id; }
+
+
+ inline void set_db_id ( :: gwp_add_mbr_evt_v1 & self, uint8_t db_id )
+ {
+ assert ( db_id >= 0 );
+ self . db_id = db_id;
+ }
+
+ inline size_t size1 ( const gwp_add_mbr_evt_v1 & self )
+ { return ( size_t ) self . mbr_sz + 1; }
+
+ inline size_t size2 ( const gwp_add_mbr_evt_v1 & self )
+ { return ( size_t ) self . name_sz + 1; }
+
+ inline void set_size1 ( :: gwp_add_mbr_evt_v1 & self, size_t bytes )
+ {
+ set_string_size ( self . mbr_sz, bytes );
+ }
+
+ inline void set_size2 ( :: gwp_add_mbr_evt_v1 & self, size_t bytes )
+ {
+ set_string_size ( self . name_sz, bytes );
+ }
+
+ inline uint8_t create_mode ( const gwp_add_mbr_evt_v1 & self )
+ { return self . create_mode; }
+
+ inline void set_create_mode ( :: gwp_add_mbr_evt_v1 & self, uint8_t mode )
+ {
+ self . create_mode = mode;
+ }
+
+ // gwp_status_evt
+ inline void init ( :: gwp_status_evt_v1 &hdr, uint32_t id, gw_evt_id evt )
+ {
+ init ( hdr . dad, id, evt );
+ hdr . version = hdr . timestamp = 0;
+ hdr . name_sz = hdr . percent = 0;
+ }
+
+ inline void init ( :: gwp_status_evt_v1 &hdr, const :: gwp_evt_hdr_v1 &dad )
+ {
+ hdr . dad = dad;
+ hdr . version = hdr . timestamp = 0;
+ hdr . name_sz = hdr . percent = 0;
+ }
+
+ inline void set_pid ( :: gwp_status_evt_v1 &self, int pid )
+ {
+ assert ( pid > 0 );
+ self . pid = ( uint32_t ) pid;
+ }
+
+ inline uint32_t pid ( const :: gwp_status_evt_v1 &self )
+ { return self . pid; }
+
+
+ inline void set_version ( :: gwp_status_evt_v1 &self, uint32_t version )
+ {
+ assert ( version != 0 );
+ self . version = version;
+ }
+
+ inline uint32_t version ( const :: gwp_status_evt_v1 &self )
+ { return self . version; }
+
+ inline void set_timestamp ( :: gwp_status_evt_v1 &self, uint32_t timestamp )
+ {
+ assert ( timestamp != 0 );
+ self . timestamp = timestamp;
+ }
+
+ inline uint32_t timestamp ( const :: gwp_status_evt_v1 &self )
+ { return self . timestamp; }
+
+ inline void set_size ( :: gwp_status_evt_v1 &self, size_t bytes )
+ {
+ set_string_size ( self . name_sz, bytes );
+ }
+
+ inline size_t size ( const :: gwp_status_evt_v1 &self )
+ { return ( size_t ) self . name_sz + 1; }
+
+ inline void set_percent ( :: gwp_status_evt_v1 &self, uint32_t percent )
+ {
+ self . percent = percent;
+ }
+
+ inline uint32_t percent ( const :: gwp_status_evt_v1 &self )
+ { return self . percent; }
+
+}
+#endif
+
+
+#endif /*_h_general_writer_*/
diff --git a/tools/general-loader/general-writer.hpp b/tools/general-loader/general-writer.hpp
new file mode 100644
index 0000000..5c98ebd
--- /dev/null
+++ b/tools/general-loader/general-writer.hpp
@@ -0,0 +1,210 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_general_writer_
+#define _hpp_general_writer_
+
+#ifndef _h_general_writer_
+#include "general-writer.h"
+#endif
+
+#include <iostream>
+#include <string>
+#include <stdint.h>
+#include <vector>
+#include <fstream>
+#include <map>
+
+#include <string.h>
+
+namespace ncbi
+{
+#if GW_CURRENT_VERSION <= 2
+ typedef :: gwp_evt_hdr_v1 gwp_evt_hdr;
+#else
+#error "unrecognized GW version"
+#endif
+
+ class GeneralWriter
+ {
+ public:
+
+ // ask the general-loader to use this when naming its output
+ void setRemotePath ( const std :: string & remote_db );
+
+ void setSoftwareName ( const std :: string & name,
+ const std :: string & version );
+
+ // tell the general-loader to use this pre-defined schema
+ void useSchema ( const std :: string & schema_file_name,
+ const std :: string & schema_db_spec );
+
+ // add a new table
+ // the table-id is returned
+ int addTable ( const std :: string &table_name );
+
+ // add a column to an existing table
+ // the column-id is returned
+ int addColumn ( int table_id, const std :: string &column_name, uint32_t elem_bits, uint8_t flags = 0 );
+
+ // when the column is known to have integer data, use this method
+ // it will utilize payload packing for reduced bandwidth
+ inline int addIntegerColumn ( int table_id, const std :: string &column_name, uint32_t elem_bits )
+ { return addColumn ( table_id, column_name, elem_bits, 1 ); }
+
+ int dbAddDatabase ( int db_id, const std :: string &mbr_name,
+ const std :: string &db_name, uint8_t create_mode );
+
+ int dbAddTable ( int db_id, const std :: string &mbr_name,
+ const std :: string &tbl_name, uint8_t create_mode );
+
+ // ensure there are atleast one table and one column
+ // set GeneralWriter to open state
+ // write out open_stream event header
+ void open ();
+
+ // add or set metadata on a specific object
+ // where obj_id == 0 => outer database, and
+ // any other positive id means the database, table or column
+ void setDBMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value );
+ void setTblMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value );
+ void setColMetadataNode ( int obj_id,
+ const std :: string & node_path,
+ const std :: string & value );
+
+ // generates a chunk of cell data
+ // MUST be entire default value in one event
+ void columnDefault ( int stream_id, uint32_t elem_bits, const void *data, uint32_t elem_count );
+
+ // generate a chunk of cell data
+ // may be repeated as often as necessary to complete a single cell's data
+ void write ( int stream_id, uint32_t elem_bits, const void *data, uint32_t elem_count );
+
+ // commit and close current row, move to next row
+ void nextRow ( int table_id );
+
+ // commit and close current row, move ahead by nrows
+ void moveAhead ( int table_id, uint64_t nrows );
+
+ // indicate some sort of exception
+ void logError ( const std :: string & msg );
+
+ // XML logging for general-loader
+ void logMsg ( const std :: string &msg );
+
+ // indicate progress
+ void progMsg ( const std :: string &name,
+ uint32_t version, uint64_t done, uint64_t total );
+
+ // generates an end event
+ // puts object into state that will reject any further transmissions
+ void endStream ();
+
+ // out_fd writes to an open file descriptor ( generally stdout )
+ // out_path initializes output stream for writing to a file
+ GeneralWriter ( int out_fd, size_t buffer_size = 32 * 1024 );
+ GeneralWriter ( const std :: string & out_path );
+
+ // output stream is flushed and closed
+ ~ GeneralWriter ();
+
+ private:
+
+ void writeHeader ();
+ void internal_write ( const void *data, size_t num_bytes );
+ void write_event ( const gwp_evt_hdr * evt, size_t evt_size );
+ void flush ();
+ uint32_t getPid ();
+
+ struct int_stream
+ {
+ bool operator < ( const int_stream &s ) const;
+ int_stream ( int table_id, const std :: string &column_name, uint32_t elem_bits, uint8_t flag_bits );
+
+ int table_id;
+ std :: string column_name;
+ uint32_t elem_bits;
+ uint8_t flag_bits;
+ };
+
+ struct int_dbtbl
+ {
+ bool operator < ( const int_dbtbl &db ) const;
+ int_dbtbl ( int db_id, const std :: string &obj_name );
+
+ int db_id;
+ std :: string obj_name;
+ };
+
+ std :: ofstream out;
+
+ std :: map < int_dbtbl, int > db_name_idx;
+ std :: map < int_dbtbl, int > table_name_idx;
+ std :: map < int_stream, int > column_name_idx;
+
+ std :: vector < int_stream > streams;
+ std :: vector < int_dbtbl > tables;
+ std :: vector < int_dbtbl > dbs;
+
+ uint64_t evt_count;
+ uint64_t byte_count;
+
+ int pid;
+
+ uint8_t * packing_buffer;
+
+ uint8_t * output_buffer;
+ size_t output_bsize;
+ size_t output_marker;
+
+ int out_fd;
+
+ enum stream_state
+ {
+ uninitialized,
+ header_written,
+ remote_name_sent,
+ schema_sent,
+ software_name_sent,
+ remote_name_and_schema_sent,
+ remote_name_and_software_name_sent,
+ schema_and_software_name_sent,
+ remote_name_schema_and_software_name_sent,
+ have_table,
+ have_column,
+ opened,
+ closed,
+ error
+ };
+ stream_state state;
+ };
+}
+
+#endif // _hpp_general_writer_
diff --git a/tools/general-loader/gw-dumper.cpp b/tools/general-loader/gw-dumper.cpp
new file mode 100644
index 0000000..9525317
--- /dev/null
+++ b/tools/general-loader/gw-dumper.cpp
@@ -0,0 +1,1785 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "general-writer.h"
+#include "utf8-like-int-codec.h"
+
+#include <kfs/defs.h>
+
+#include <iostream>
+#include <vector>
+
+#include <stdio.h>
+#include <string.h>
+#include <byteswap.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+using namespace ncbi;
+
+namespace gw_dump
+{
+ static bool display;
+ static uint32_t verbose;
+ static uint64_t event_num;
+ static uint64_t jump_event;
+ static uint64_t end_event;
+ static uint64_t foffset;
+
+ struct tbl_entry
+ {
+ tbl_entry ( const std :: string & _name )
+ : row_id ( 1 )
+ , member_name ( _name )
+ , tbl_name ( _name )
+ {
+ }
+
+ tbl_entry ( const std :: string & _member_name, const std :: string & _tbl_name )
+ : row_id ( 1 )
+ , member_name ( _member_name )
+ , tbl_name ( _tbl_name )
+ {
+ }
+
+ int64_t row_id;
+ std :: string member_name;
+ std :: string tbl_name;
+ };
+
+ static std :: vector < tbl_entry > tbl_entries;
+
+ struct db_entry
+ {
+ db_entry ( const std :: string & _member_name, const std :: string & _db_name )
+ : row_id ( 1 )
+ , member_name ( _member_name )
+ , db_name ( _db_name )
+ {
+ }
+
+ int64_t row_id;
+ std :: string member_name;
+ std :: string db_name;
+ };
+
+ static std :: vector < db_entry > db_entries;
+
+
+ struct col_entry
+ {
+ col_entry ( uint32_t _table_id, const std :: string & name, uint32_t _elem_bits, uint8_t _flag_bits = 0 )
+ : table_id ( _table_id )
+ , spec ( name )
+ , elem_bits ( _elem_bits )
+ , flag_bits ( _flag_bits )
+ {
+ }
+
+ ~ col_entry () {}
+
+ uint32_t table_id;
+ std :: string spec;
+ uint32_t elem_bits;
+ uint8_t flag_bits;
+ };
+ static std :: vector < col_entry > col_entries;
+
+ static
+ size_t readFILE ( void * buffer, size_t elem_size, size_t elem_count, FILE * in )
+ {
+ size_t num_read = fread ( buffer, elem_size, elem_count, in );
+ foffset += num_read * elem_size;
+ return num_read;
+ }
+
+ /* read_1string
+ */
+ template < class T > static
+ char * read_1string ( const T & eh, FILE * in )
+ {
+ size_t string_size = size ( eh );
+ char * string_buffer = new char [ string_size ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size, in );
+ if ( num_read != string_size )
+ {
+ delete [] string_buffer;
+ throw "failed to read string data";
+ }
+
+ return string_buffer;
+ }
+
+ template <>
+ char * read_1string < :: gw_1string_evt_v1 > ( const :: gw_1string_evt_v1 & eh, FILE * in )
+ {
+ size_t string_size_uint32 = ( size ( eh ) + 3 ) / 4;
+ uint32_t * string_buffer = new uint32_t [ string_size_uint32 ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size_uint32, in );
+ if ( num_read != string_size_uint32 )
+ {
+ delete [] string_buffer;
+ throw "failed to read string data";
+ }
+
+ return ( char * ) string_buffer;
+ }
+
+ template <>
+ char * read_1string < :: gw_status_evt_v1 > ( const :: gw_status_evt_v1 & eh, FILE * in )
+ {
+ size_t string_size_uint32 = ( size ( eh ) + 3 ) / 4;
+ uint32_t * string_buffer = new uint32_t [ string_size_uint32 ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size_uint32, in );
+ if ( num_read != string_size_uint32 )
+ {
+ delete [] string_buffer;
+ throw "failed to read string data";
+ }
+
+ return ( char * ) string_buffer;
+ }
+
+ /* whack_1string
+ */
+ template < class T > static
+ void whack_1string ( const T & eh, char * string_buffer )
+ {
+ delete [] string_buffer;
+ }
+
+ template <>
+ void whack_1string < :: gw_1string_evt_v1 > ( const :: gw_1string_evt_v1 & eh, char * string_buffer )
+ {
+ uint32_t * buffer = ( uint32_t * ) string_buffer;
+ delete [] buffer;
+ }
+
+ /* read_2string
+ */
+ template < class T > static
+ char * read_2string ( const T & eh, FILE * in )
+ {
+ size_t string_size = size1 ( eh ) + size2 ( eh );
+ char * string_buffer = new char [ string_size ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size, in );
+ if ( num_read != string_size )
+ {
+ delete [] string_buffer;
+ throw "failed to read dual string data";
+ }
+
+ return string_buffer;
+ }
+
+ template <>
+ char * read_2string < :: gw_2string_evt_v1 > ( const :: gw_2string_evt_v1 & eh, FILE * in )
+ {
+ size_t string_size_uint32 = ( size1 ( eh ) + size2 ( eh ) + 3 ) / 4;
+ uint32_t * string_buffer = new uint32_t [ string_size_uint32 ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size_uint32, in );
+ if ( num_read != string_size_uint32 )
+ {
+ delete [] string_buffer;
+ throw "failed to read dual string data";
+ }
+
+ return ( char * ) string_buffer;
+ }
+
+ /* whack_2string
+ */
+ template < class T > static
+ void whack_2string ( const T & eh, char * string_buffer )
+ {
+ delete [] string_buffer;
+ }
+
+ template <>
+ void whack_2string < :: gw_2string_evt_v1 > ( const :: gw_2string_evt_v1 & eh, char * string_buffer )
+ {
+ uint32_t * buffer = ( uint32_t * ) string_buffer;
+ delete [] buffer;
+ }
+
+ /* read_colname
+ */
+ template < class T > static
+ char * read_colname ( const T & eh, FILE * in )
+ {
+ size_t string_size = name_size ( eh );
+ char * string_buffer = new char [ string_size ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size, in );
+ if ( num_read != string_size )
+ {
+ delete [] string_buffer;
+ throw "failed to read column name";
+ }
+
+ return string_buffer;
+ }
+
+ template <>
+ char * read_colname < :: gw_column_evt_v1 > ( const :: gw_column_evt_v1 & eh, FILE * in )
+ {
+ size_t string_size_uint32 = ( name_size ( eh ) + 3 ) / 4;
+ uint32_t * string_buffer = new uint32_t [ string_size_uint32 ];
+ size_t num_read = readFILE ( string_buffer, sizeof string_buffer [ 0 ], string_size_uint32, in );
+ if ( num_read != string_size_uint32 )
+ {
+ delete [] string_buffer;
+ throw "failed to read column name";
+ }
+
+ return ( char * ) string_buffer;
+ }
+
+ /* whack_colname
+ */
+ template < class T > static
+ void whack_colname ( const T & eh, char * string_buffer )
+ {
+ delete [] string_buffer;
+ }
+
+ template <>
+ void whack_colname < :: gw_column_evt_v1 > ( const :: gw_column_evt_v1 & eh, char * string_buffer )
+ {
+ uint32_t * buffer = ( uint32_t * ) string_buffer;
+ delete [] buffer;
+ }
+
+
+ /* check_move_ahead
+ */
+ template < class T > static
+ void check_move_ahead ( const T & eh )
+ {
+ if ( id ( eh . dad ) == 0 )
+ throw "bad table id within move-ahead event (null)";
+ if ( id ( eh . dad ) > tbl_entries . size () )
+ throw "bad table id within move-ahead event";
+ }
+
+ /* dump_move_ahead
+ */
+ template < class D, class T > static
+ void dump_move_ahead ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( eh . nrows, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read move-ahead event";
+
+ check_move_ahead ( eh );
+
+ // advance row-id
+ tbl_entry & te = tbl_entries [ id ( eh . dad ) - 1 ];
+ te . row_id += get_nrows ( eh );
+
+ if ( display )
+ {
+ const std :: string & tbl_name = te . tbl_name;
+
+ std :: cout
+ << event_num << ": move-ahead\n"
+ << " table_id = " << id ( eh . dad ) << " ( \"" << tbl_name << "\" )\n"
+ << " nrows = " << get_nrows ( eh ) << '\n'
+ << " row_id = " << te . row_id << '\n'
+ ;
+ }
+ }
+
+
+ /* check_next_row
+ * all:
+ * 0 < id <= count(tbls)
+ */
+ template < class T > static
+ void check_next_row ( const T & eh )
+ {
+ if ( id ( eh ) == 0 )
+ throw "bad table id within next-row event (null)";
+ if ( id ( eh ) > tbl_entries . size () )
+ throw "bad table id within next-row event";
+ }
+
+ /* dump_next_row
+ */
+ template < class T > static
+ void dump_next_row ( FILE * in, const T & eh )
+ {
+ check_next_row ( eh );
+
+ // advance row-id
+ tbl_entry & te = tbl_entries [ id ( eh ) - 1 ];
+ ++ te . row_id;
+
+ if ( display )
+ {
+ const std :: string & tbl_name = te . tbl_name;
+
+ std :: cout
+ << event_num << ": next-row\n"
+ << " table_id = " << id ( eh ) << " ( \"" << tbl_name << "\" )\n"
+ << " row_id = " << te . row_id << '\n'
+ ;
+ }
+ }
+
+ /* check_empty_default
+ */
+ template < class T > static
+ void check_empty_default ( const T & eh )
+ {
+ if ( id ( eh ) == 0 )
+ throw "bad cell event id (null)";
+ if ( id ( eh ) > col_entries . size () )
+ throw "bad cell event id";
+ }
+
+ /* dump_empty_default
+ */
+ template < class T > static
+ void dump_empty_default ( FILE * in, const T & eh )
+ {
+ check_empty_default ( eh );
+
+ if ( display )
+ {
+ const col_entry & entry = col_entries [ id ( eh ) - 1 ];
+ const std :: string & tbl_name = tbl_entries [ entry . table_id - 1 ] . tbl_name;
+
+ std :: cout
+ << event_num << ": cell-default\n"
+ << " stream_id = " << id ( eh ) << " ( " << tbl_name << " . " << entry . spec << " )\n"
+ << " elem_bits = " << entry . elem_bits << '\n'
+ << " elem_count = 0 ( empty )\n"
+ ;
+ }
+ }
+
+
+ /* check_cell_event
+ * all:
+ * 0 < id <= count ( columns )
+ */
+ template < class T > static
+ void check_cell_event ( const T & eh )
+ {
+ if ( id ( eh . dad ) == 0 )
+ throw "bad cell event id (null)";
+ if ( id ( eh . dad ) > col_entries . size () )
+ throw "bad cell event id";
+ }
+
+ /* check_int_packing
+ * deeply check contents for adherance to protocol
+ */
+ template < class T >
+ int decode_int ( const uint8_t * start, const uint8_t * end, T * decoded );
+
+ template <>
+ int decode_int < uint16_t > ( const uint8_t * start, const uint8_t * end, uint16_t * decoded )
+ {
+ return decode_uint16 ( start, end, decoded );
+ }
+
+ template <>
+ int decode_int < uint32_t > ( const uint8_t * start, const uint8_t * end, uint32_t * decoded )
+ {
+ return decode_uint32 ( start, end, decoded );
+ }
+
+ template <>
+ int decode_int < uint64_t > ( const uint8_t * start, const uint8_t * end, uint64_t * decoded )
+ {
+ return decode_uint64 ( start, end, decoded );
+ }
+
+ template < class T > static
+ size_t check_int_packing ( const uint8_t * data_buffer, size_t data_size )
+ {
+ const uint8_t * start = data_buffer;
+ const uint8_t * end = data_buffer + data_size;
+
+ size_t unpacked_size;
+ for ( unpacked_size = 0; start < end; unpacked_size += sizeof ( T ) )
+ {
+ T decoded;
+ int num_read = decode_int < T > ( start, end, & decoded );
+ if ( num_read <= 0 )
+ {
+ switch ( num_read )
+ {
+ case CODEC_INSUFFICIENT_BUFFER:
+ throw "truncated data in packed integer buffer";
+ case CODEC_INVALID_FORMAT:
+ throw "corrupt data in packed integer buffer";
+ case CODEC_UNKNOWN_ERROR:
+ throw "unknown error in packed integer buffer";
+ default:
+ throw "INTERNAL ERROR: decode_uintXX returned invalid error code";
+ }
+ }
+ start += num_read;
+ }
+
+ return unpacked_size;
+ }
+
+
+ /* dump_cell_event
+ */
+ template < class D, class T > static
+ void dump_cell_event ( FILE * in, const D & e, const char * type )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read cell event";
+
+ check_cell_event ( eh );
+
+ size_t data_size = size ( eh );
+ uint8_t * data_buffer = new uint8_t [ data_size ];
+ num_read = readFILE ( data_buffer, sizeof data_buffer [ 0 ], data_size, in );
+ if ( num_read != data_size )
+ {
+ delete [] data_buffer;
+ throw "failed to read cell data";
+ }
+
+ bool packed_int = false;
+ size_t unpacked_size = data_size;
+ const col_entry & entry = col_entries [ id ( eh . dad ) - 1 ];
+
+ if ( ( entry . flag_bits & 1 ) != 0 )
+ {
+ size_t data_size = size ( eh );
+
+ switch ( entry . elem_bits )
+ {
+ case 16:
+ unpacked_size = check_int_packing < uint16_t > ( data_buffer, data_size );
+ break;
+ case 32:
+ unpacked_size = check_int_packing < uint32_t > ( data_buffer, data_size );
+ break;
+ case 64:
+ unpacked_size = check_int_packing < uint64_t > ( data_buffer, data_size );
+ break;
+ default:
+ throw "bad element size for packed integer";
+ }
+
+ packed_int = true;
+ }
+
+ if ( display )
+ {
+ const std :: string & tbl_name = tbl_entries [ entry . table_id - 1 ] . tbl_name;
+
+ std :: cout
+ << event_num << ": cell-" << type << '\n'
+ << " stream_id = " << id ( eh . dad ) << " ( " << tbl_name << " . " << entry . spec << " )\n"
+ << " elem_bits = " << entry . elem_bits << '\n'
+ ;
+ if ( packed_int )
+ {
+ std :: cout
+ << " elem_count = " << ( unpacked_size * 8 ) / entry . elem_bits
+ << " ( " << unpacked_size << " bytes, " << data_size << " packed )\n"
+ ;
+ }
+ else
+ {
+ std :: cout
+ << " elem_count = " << ( data_size * 8 ) / entry . elem_bits << " ( " << data_size << " bytes )\n"
+ ;
+ }
+ }
+
+ delete [] data_buffer;
+ }
+
+ template <>
+ void dump_cell_event < gw_evt_hdr_v1, gw_data_evt_v1 > ( FILE * in, const gw_evt_hdr_v1 & e, const char * type )
+ {
+ gw_data_evt_v1 eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . elem_count, sizeof eh - sizeof ( gw_evt_hdr_v1 ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read cell event";
+
+ check_cell_event ( eh );
+
+ const col_entry & entry = col_entries [ id ( eh . dad ) - 1 ];
+
+ size_t data_size_uint32 = ( ( uint64_t ) entry . elem_bits * elem_count ( eh ) + 31 ) / 32;
+ uint32_t * data_buffer = new uint32_t [ data_size_uint32 ];
+ num_read = readFILE ( data_buffer, sizeof data_buffer [ 0 ], data_size_uint32, in );
+ if ( num_read != data_size_uint32 )
+ {
+ delete [] data_buffer;
+ throw "failed to read cell data";
+ }
+
+ if ( display )
+ {
+ const std :: string & tbl_name = tbl_entries [ entry . table_id - 1 ] . tbl_name;
+
+ std :: cout
+ << event_num << ": cell-" << type << '\n'
+ << " stream_id = " << id ( eh . dad ) << " ( " << tbl_name << " . " << entry . spec << " )\n"
+ << " elem_bits = " << entry . elem_bits << '\n'
+ << " elem_count = " << elem_count ( eh ) << '\n'
+ ;
+ }
+
+ delete [] data_buffer;
+ }
+
+
+ /* check_open_stream
+ */
+ static
+ void check_open_stream ( const gw_evt_hdr_v1 & eh )
+ {
+ if ( id ( eh ) != 0 )
+ throw "non-zero id within open-stream event";
+ }
+
+ static
+ void check_open_stream ( const gwp_evt_hdr_v1 & eh )
+ {
+ }
+
+
+ /* dump_open_stream
+ */
+ template < class T > static
+ void dump_open_stream ( FILE * in, const T & eh )
+ {
+ check_open_stream ( eh );
+
+ if ( display )
+ {
+ std :: cout
+ << event_num << ": open-stream\n"
+ ;
+ }
+ }
+
+
+ /* check_new_column
+ * all:
+ * id == count ( columns ) + 1
+ * 0 < table_id <= count ( tbls )
+ * length ( name-spec ) != 0
+ * packed:
+ * flags in { 0, 1 }
+ */
+ static
+ void check_new_column ( const gw_column_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) == 0 )
+ throw "bad column/stream id";
+ if ( ( size_t ) id ( eh . dad ) <= col_entries . size () )
+ throw "column id already specified";
+ if ( ( size_t ) id ( eh . dad ) - 1 > col_entries . size () )
+ throw "column id out of order";
+ if ( table_id ( eh ) == 0 )
+ throw "bad column table-id (null)";
+ if ( table_id ( eh ) > tbl_entries . size () )
+ throw "bad column table-id";
+ if ( name_size ( eh ) == 0 )
+ throw "empty column name";
+ }
+
+ static
+ void check_new_column ( const gwp_column_evt_v1 & eh )
+ {
+ if ( ( size_t ) id ( eh . dad ) <= col_entries . size () )
+ throw "column id already specified";
+ if ( ( size_t ) id ( eh . dad ) - 1 > col_entries . size () )
+ throw "column id out of order";
+ if ( table_id ( eh ) == 0 )
+ throw "bad column table-id (null)";
+ if ( table_id ( eh ) > tbl_entries . size () )
+ throw "bad column table-id";
+ if ( name_size ( eh ) == 0 )
+ throw "empty column name";
+
+ if ( ( eh . flag_bits & 0xFE ) != 0 )
+ throw "uninitialized flag_bits";
+ }
+
+
+ /* dump_new_column
+ */
+ template < class D, class T > static
+ void dump_new_column ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . table_id, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read new-column event";
+
+ check_new_column ( eh );
+
+ char * string_buffer = read_colname ( eh, in );
+ std :: string name ( string_buffer, name_size ( eh ) );
+ col_entries . push_back ( col_entry ( table_id ( eh ), name, elem_bits ( eh ), flag_bits ( eh ) ) );
+
+ if ( display )
+ {
+ const std :: string & tbl_name = tbl_entries [ table_id ( eh ) - 1 ] . tbl_name;
+
+ std :: cout
+ << event_num << ": new-column\n"
+ << " table_id = " << table_id ( eh ) << " ( \"" << tbl_name << "\" )\n"
+ << " column_name [ " << name_size ( eh ) << " ] = \"" << name << "\"\n"
+ ;
+ }
+
+ whack_colname ( eh, string_buffer );
+ }
+
+ /* check_new_table
+ * all:
+ * id == count ( tbls ) + 1
+ * length ( name ) != 0
+ */
+ template < class T > static
+ void check_new_table ( const T & eh )
+ {
+ if ( id ( eh . dad ) == 0 )
+ throw "bad table id";
+ if ( ( size_t ) id ( eh . dad ) <= tbl_entries . size () )
+ throw "table id already specified";
+ if ( ( size_t ) id ( eh . dad ) - 1 > tbl_entries . size () )
+ throw "table id out of order";
+ if ( size ( eh ) == 0 )
+ throw "empty table name";
+ }
+
+ /* dump_new_table
+ */
+ template < class D, class T > static
+ void dump_new_table ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read new-table event";
+
+ check_new_table ( eh );
+
+ char * string_buffer = read_1string ( eh, in );
+ std :: string name ( string_buffer, size ( eh ) );
+ tbl_entries . push_back ( tbl_entry ( name ) );
+
+ if ( display )
+ {
+ std :: cout
+ << event_num << ": new-table\n"
+ << " table_name [ " << size ( eh ) << " ] = \"" << name << "\"\n"
+ ;
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* check_use_schema
+ * non-packed:
+ * id == 0
+ * all:
+ * length ( schema-path ) != 0
+ * length ( schema-spec ) != 0
+ */
+ template < class T > static
+ void check_use_schema ( const T & eh )
+ {
+ if ( size1 ( eh ) == 0 )
+ throw "empty schema file path";
+ if ( size2 ( eh ) == 0 )
+ throw "empty schema spec";
+ }
+
+ template < >
+ void check_use_schema < gw_2string_evt_v1 > ( const gw_2string_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "non-zero table id";
+ if ( size1 ( eh ) == 0 )
+ throw "empty schema file path";
+ if ( size2 ( eh ) == 0 )
+ throw "empty schema spec";
+ }
+
+ /* dump_use_schema
+ */
+ template < class D, class T > static
+ void dump_use_schema ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz1, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read use-schema event";
+
+ check_use_schema ( eh );
+
+ char * string_buffer = read_2string ( eh, in );
+
+ if ( display )
+ {
+ std :: string schema_file_name ( string_buffer, size1 ( eh ) );
+ std :: string schema_db_spec ( & string_buffer [ size1 ( eh ) ], size2 ( eh ) );
+ std :: cout
+ << event_num << ": use-schema\n"
+ << " schema_file_name [ " << size1 ( eh ) << " ] = \"" << schema_file_name << "\"\n"
+ << " schema_db_spec [ " << size2 ( eh ) << " ] = \"" << schema_db_spec << "\"\n"
+ ;
+ }
+
+ whack_2string ( eh, string_buffer );
+ }
+
+ /* check_software_name
+ * non-packed:
+ * id == 0
+ * all:
+ * length ( schema-path ) != 0
+ * length ( schema-spec ) != 0
+ */
+
+ void check_vers_component ( const char * vers, const char * end, long num, unsigned long max, char term )
+ {
+ if ( vers == end )
+ throw "bad version";
+ if ( * end != 0 && * end != term )
+ throw "bad version";
+ if ( num < 0 || num > max )
+ throw "bad version";
+ }
+
+ void check_vers ( const char * vers )
+ {
+ char * end;
+ long num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 255, '.' );
+ if ( * end == '.' )
+ {
+ vers = end + 1;
+ num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 255, '.' );
+ if ( * end == '.' )
+ {
+ vers = end + 1;
+ num = strtol ( vers, & end, 10 );
+ check_vers_component ( vers, end, num, 0xFFFF, 0 );
+ }
+ }
+ }
+
+ template < class T > static
+ void check_software_name ( const T & eh )
+ {
+ if ( size1 ( eh ) == 0 )
+ throw "empty software name";
+ if ( size2 ( eh ) == 0 )
+ throw "empty version";
+ }
+
+ template < >
+ void check_software_name < gw_2string_evt_v1 > ( const gw_2string_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "non-zero table id";
+ if ( size1 ( eh ) == 0 )
+ throw "empty software name";
+ if ( size2 ( eh ) == 0 )
+ throw "empty version";
+ }
+
+ /* dump_software_name
+ */
+ template < class D, class T > static
+ void dump_software_name ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz1, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read software_name event";
+
+ check_software_name ( eh );
+
+ char * string_buffer = read_2string ( eh, in );
+ std :: string software_name ( string_buffer, size1 ( eh ) );
+ std :: string version ( & string_buffer [ size1 ( eh ) ], size2 ( eh ) );
+
+ check_vers ( version . c_str () );
+
+ if ( display )
+ {
+ std :: cout
+ << event_num << ": software-name\n"
+ << " software_name [ " << size1 ( eh ) << " ] = \"" << software_name << "\"\n"
+ << " version [ " << size2 ( eh ) << " ] = \"" << version << "\"\n"
+ ;
+ }
+
+ whack_2string ( eh, string_buffer );
+ }
+
+ /* check_metadata_node
+ *
+ */
+ template < class T > static
+ void check_metadata_node ( const T & eh )
+ {
+ if ( size1 ( eh ) == 0 )
+ throw "empty metadata node";
+ if ( size2 ( eh ) == 0 )
+ throw "empty value";
+ }
+
+ template <>
+ void check_metadata_node < gw_2string_evt_v1 > ( const gw_2string_evt_v1 & eh )
+ {
+ if ( size1 ( eh ) == 0 )
+ throw "empty metadata node";
+ if ( size2 ( eh ) == 0 )
+ throw "empty value";
+ }
+
+ /* dump_metadata_node
+ */
+ template < class D, class T > static
+ void dump_metadata_node ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz1, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read metadata_node event";
+
+ check_metadata_node ( eh );
+
+ char *string_buffer = read_2string ( eh, in );
+ std :: string node_path ( string_buffer, size1 ( eh ) );
+ std :: string value ( & string_buffer [ size1 ( eh ) ], size2 ( eh ) );
+
+ if ( display )
+ {
+ std :: cout
+ << event_num << ": metadata-node\n"
+ << " metadata_node [ " << size1 ( eh ) << " ] = \"" << node_path << "\"\n"
+ << " value [ " << size2 ( eh ) << " ] = \"" << value << "\"\n";
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* check_add_mbr
+ *
+ */
+ template < class T > static
+ void check_add_mbr ( const T & eh )
+ {
+ if ( db_id ( eh ) < 0 || db_id ( eh ) > db_entries . size () )
+ throw "invalid database id";
+ if ( size1 ( eh ) == 0 )
+ throw "empty member node";
+ if ( size2 ( eh ) == 0 )
+ throw "empty value";
+ switch ( create_mode ( eh ) & kcmValueMask )
+ {
+ // only allowed mode values
+ // or throw an exception
+ case kcmOpen:
+ case kcmInit:
+ case kcmCreate:
+ break;
+ default:
+ throw "invalid create mode";
+ }
+ if ( ( create_mode ( eh ) & ( kcmBitMask & ~ kcmMD5 & ~ kcmParents ) ) != 0 )
+ throw "invalid create mode";
+ }
+
+ template <>
+ void check_add_mbr < gw_add_mbr_evt_v1 > ( const gw_add_mbr_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "non-zero table id";
+ if ( db_id ( eh ) < 0 || db_id ( eh ) > db_entries . size () )
+ throw "invalid database id";
+ if ( size1 ( eh ) == 0 )
+ throw "empty member name";
+ if ( size2 ( eh ) == 0 )
+ throw "empty db/tbl name";
+ switch ( create_mode ( eh ) & kcmValueMask )
+ {
+ // only allowed mode values
+ // or throw an exception
+ case kcmOpen:
+ case kcmInit:
+ case kcmCreate:
+ break;
+ default:
+ throw "invalid create mode";
+ }
+ if ( ( create_mode ( eh ) & ( kcmBitMask & ~ kcmMD5 & ~ kcmParents ) ) != 0 )
+ throw "invalid create mode";
+ }
+
+ /* dump_add_mbr
+ */
+ template < class D, class T > static
+ void dump_add_mbr ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . db_id, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read add_mbr event";
+
+ check_add_mbr ( eh );
+
+ uint32_t dbid = db_id ( eh );
+ char *string_buffer = read_2string ( eh, in );
+ std :: string member_name ( string_buffer, size1 ( eh ) );
+ std :: string db_tbl_name ( & string_buffer [ size1 ( eh ) ], size2 ( eh ) );
+ uint8_t cmode = create_mode ( eh );
+
+ switch ( evt ( eh . dad ) )
+ {
+ case evt_add_mbr_db:
+ db_entries . push_back ( db_entry ( member_name, db_tbl_name ) );
+ break;
+ case evt_add_mbr_tbl:
+ tbl_entries . push_back ( tbl_entry ( member_name, db_tbl_name ) );
+ break;
+ default:
+ throw "logic error";
+ }
+
+ if ( display )
+ {
+ std :: cout
+ << event_num << ": add-member\n"
+ << " db_id [ " << dbid << " ]\n"
+ << " add_mbr [ " << size1 ( eh ) << " ] = \"" << member_name << "\"\n"
+ << " db/tbl [ " << size2 ( eh ) << " ] = \"" << db_tbl_name << "\"\n"
+ << " create_mode [ "
+ << ( uint32_t ) cmode
+ << " ] ( ";
+ switch ( cmode & kcmValueMask )
+ {
+ case kcmOpen:
+ std :: cout << "kcmOpen";
+ break;
+ case kcmInit:
+ std :: cout << "kcmInit";
+ break;
+ case kcmCreate:
+ std :: cout << "kcmCreate";
+ break;
+ }
+ if ( ( cmode & kcmParents ) != 0 )
+ std :: cout << ", kcmParents";
+ if ( ( cmode & kcmMD5 ) != 0 )
+ std :: cout << ", kcmMD5";
+ std :: cout << " )\n";
+ }
+
+ whack_2string ( eh, string_buffer );
+ }
+
+ /* check_remote_path
+ * non-packed:
+ * id == 0
+ * all:
+ * length ( remote-path ) != 0
+ */
+ template < class T > static
+ void check_remote_path ( const T & eh )
+ {
+ if ( size ( eh ) == 0 )
+ throw "empty remote path";
+ }
+
+ template <>
+ void check_remote_path < gw_1string_evt_v1 > ( const gw_1string_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "non-zero table id";
+ if ( size ( eh ) == 0 )
+ throw "empty remote path";
+ }
+
+ /* dump_remote_path
+ */
+ template < class D, class T > static
+ void dump_remote_path ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read remote-path event";
+
+ check_remote_path ( eh );
+
+ char * string_buffer = read_1string ( eh, in );
+
+ if ( display )
+ {
+ std :: string path ( string_buffer, size ( eh ) );
+ std :: cout
+ << event_num << ": remote-path\n"
+ << " remote_db_name [ " << size ( eh ) << " ] = \"" << path << "\"\n"
+ ;
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* check_end_stream
+ * non-packed:
+ * id == 0
+ */
+ static
+ void check_end_stream ( const gw_evt_hdr_v1 & eh )
+ {
+ if ( id ( eh ) != 0 )
+ throw "non-zero id within end-stream event";
+ }
+
+ static
+ void check_end_stream ( const gwp_evt_hdr_v1 & eh )
+ {
+ }
+
+ /* dump_end_stream
+ */
+ template < class T > static
+ bool dump_end_stream ( FILE * in, const T & eh )
+ {
+ check_end_stream ( eh );
+ if ( display )
+ {
+ std :: cout
+ << "END\n"
+ ;
+ }
+ return false;
+ }
+
+ /* check_errmsg
+ * non-packed
+ * id == 0
+ * all:
+ * length ( msg ) != 0
+ */
+ template < class T > static
+ void check_errmsg ( const T & eh )
+ {
+ if ( size ( eh ) == 0 )
+ throw "empty error message";
+ }
+
+ template <>
+ void check_errmsg < gw_1string_evt_v1 > ( const gw_1string_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "bad error-message id ( should be 0 )";
+ if ( size ( eh ) == 0 )
+ throw "empty error message";
+ }
+
+ /* dump_errmsg
+ */
+ template < class D, class T > static
+ void dump_errmsg ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read error-message event";
+
+ check_errmsg ( eh );
+
+ char * string_buffer = read_1string ( eh, in );
+
+ if ( display )
+ {
+ std :: string msg ( string_buffer, size ( eh ) );
+
+ std :: cout
+ << event_num << ": error-message\n"
+ << " msg [ " << size ( eh ) << " ] = \"" << msg << "\"\n"
+ ;
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* check_logmsg
+ * non-packed
+ * id == 0
+ * all:
+ * length ( msg ) != 0
+ */
+ template < class T > static
+ void check_logmsg ( const T & eh )
+ {
+ if ( size ( eh ) == 0 )
+ throw "empty log message";
+ }
+
+ template <>
+ void check_logmsg < gw_1string_evt_v1 > ( const gw_1string_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "bad log-message id ( should be 0 )";
+ if ( size ( eh ) == 0 )
+ throw "empty log message";
+ }
+
+ /* dump_logmsg
+ */
+ template < class D, class T > static
+ void dump_logmsg ( FILE * in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & eh . sz, sizeof eh - sizeof ( D ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read log-message event";
+
+ check_logmsg ( eh );
+
+ char * string_buffer = read_1string ( eh, in );
+
+ if ( display )
+ {
+ std :: string msg ( string_buffer, size ( eh ) );
+
+ std :: cout
+ << event_num << ": log-message\n"
+ << " msg [ " << size ( eh ) << " ] = \"" << msg << "\"\n"
+ ;
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* check_progmsg
+ * non-packed
+ * id == 0
+ * all:
+ * length ( msg ) != 0
+ * pid != 0
+ * timestamp > 0
+ * version > 0
+ * percent > 0 && < 100
+ */
+ template < class T > static
+ void check_progmsg ( const T & eh )
+ {
+ if ( size ( eh ) == 0 )
+ throw "empty prog message";
+ if ( pid ( eh ) == 0 )
+ throw "invalid pid";
+ if ( timestamp ( eh ) == 0 )
+ throw "empty timestamp";
+ if ( version ( eh ) == 0 )
+ throw "invalid version number";
+ if ( percent ( eh ) < 0 || percent ( eh ) > 100 )
+ throw "invalid percent";
+ }
+
+ template <>
+ void check_progmsg < gw_status_evt_v1 > ( const gw_status_evt_v1 & eh )
+ {
+ if ( id ( eh . dad ) != 0 )
+ throw "bad prog-message id ( should be 0 )";
+ if ( size ( eh ) == 0 )
+ throw "empty prog message";
+ if ( pid ( eh ) == 0 )
+ throw "invlaid pid";
+ if ( timestamp ( eh ) == 0 )
+ throw "empty timestamp";
+ if ( version ( eh ) == 0 )
+ throw "invalid version number";
+ if ( percent ( eh ) < 0 || percent ( eh ) > 100 )
+ throw "invalid percent";
+ }
+
+ /* dump-progmsg
+ */
+ template < class D, class T > static
+ void dump_progmsg ( FILE *in, const D & e )
+ {
+ T eh;
+ init ( eh, e );
+
+ size_t num_read = readFILE ( & ( & eh . dad ) [ 1 ], sizeof eh - sizeof eh . dad, 1, in );
+ if ( num_read != 1 )
+ throw "failed to read prog-message event";
+
+ check_progmsg ( eh );
+
+ char *string_buffer = read_1string ( eh, in );
+ std :: string app_name ( string_buffer, size ( eh ) );
+ uint32_t _pid = pid ( eh );
+ uint32_t _timestamp = timestamp ( eh );
+ uint32_t _version = version ( eh );
+ uint32_t _percent = percent ( eh );
+
+ if ( display )
+ {
+ time_t ts = ( time_t ) _timestamp;
+ char time_str [ 256 ];
+ asctime_r ( localtime ( & ts ), time_str );
+ size_t len = strlen ( time_str );
+ while ( len > 0 && time_str [ len - 1 ] == '\n' )
+ time_str [ -- len ] = 0;
+
+ std :: cout
+ << event_num << ": prog-msg\n"
+ << " app [ " << app_name << " ] \n"
+ << " message [ proccessed " << _percent << "% ] \n"
+ << " pid [ " << _pid << " ]\n"
+ << " timestamp [ " << time_str << " ( " << _timestamp << " ) ] \n"
+ << " version [ " << ( _version >> 24 ) << '.' << ( ( _version >> 16 ) & 0xFF ) << '.' << ( _version & 0xFFFF ) << " ] \n"
+ << " percent [ " << _percent << " ]\n ";
+ }
+
+ whack_1string ( eh, string_buffer );
+ }
+
+ /* dump_v1_event
+ * the events are not packed
+ */
+ static
+ bool dump_v1_event ( FILE * in )
+ {
+ if ( jump_event == event_num )
+ display = true;
+ else if ( end_event == event_num )
+ display = false;
+
+ gw_evt_hdr_v1 e;
+ memset ( & e, 0, sizeof e );
+
+ size_t num_read = readFILE ( & e, sizeof e, 1, in );
+ if ( num_read != 1 )
+ {
+ int ch = fgetc ( in );
+ if ( ch == EOF )
+ throw "EOF before end-stream";
+
+ throw "failed to read event";
+ }
+ switch ( evt ( e ) )
+ {
+ case evt_bad_event:
+ throw "illegal event id - possibly block of zeros";
+ case evt_errmsg:
+ dump_errmsg < gw_evt_hdr_v1, gw_1string_evt_v1 > ( in, e );
+ break;
+ case evt_end_stream:
+ return dump_end_stream ( in, e );
+ case evt_remote_path:
+ dump_remote_path < gw_evt_hdr_v1, gw_1string_evt_v1 > ( in, e );
+ break;
+ case evt_use_schema:
+ dump_use_schema < gw_evt_hdr_v1, gw_2string_evt_v1 > ( in, e );
+ break;
+ case evt_new_table:
+ dump_new_table < gw_evt_hdr_v1, gw_1string_evt_v1 > ( in, e );
+ break;
+ case evt_new_column:
+ dump_new_column < gw_evt_hdr_v1, gw_column_evt_v1 > ( in, e );
+ break;
+ case evt_open_stream:
+ dump_open_stream ( in, e );
+ break;
+ case evt_cell_default:
+ dump_cell_event < gw_evt_hdr_v1, gw_data_evt_v1 > ( in, e, "default" );
+ break;
+ case evt_cell_data:
+ dump_cell_event < gw_evt_hdr_v1, gw_data_evt_v1 > ( in, e, "data" );
+ break;
+ case evt_next_row:
+ dump_next_row ( in, e );
+ break;
+ case evt_move_ahead:
+ dump_move_ahead < gw_evt_hdr_v1, gw_move_ahead_evt_v1 > ( in, e );
+ break;
+ case evt_errmsg2:
+ case evt_remote_path2:
+ case evt_use_schema2:
+ case evt_new_table2:
+ case evt_cell_default2:
+ case evt_cell_data2:
+ throw "packed event id within non-packed stream";
+ case evt_empty_default:
+ dump_empty_default < gw_evt_hdr_v1 > ( in, e );
+ break;
+
+ // add in new message handlers for version 2
+ case evt_software_name:
+ dump_software_name < gw_evt_hdr_v1, gw_2string_evt_v1 > ( in, e );
+ break;
+ case evt_db_metadata_node:
+ dump_metadata_node < gw_evt_hdr_v1, gw_2string_evt_v1 > ( in, e );
+ break;
+ case evt_tbl_metadata_node:
+ dump_metadata_node < gw_evt_hdr_v1, gw_2string_evt_v1 > ( in, e );
+ break;
+ case evt_col_metadata_node:
+ dump_metadata_node < gw_evt_hdr_v1, gw_2string_evt_v1 > ( in, e );
+ break;
+ case evt_db_metadata_node2:
+ case evt_tbl_metadata_node2:
+ case evt_col_metadata_node2:
+ throw "packed event id within non-packed stream";
+ case evt_add_mbr_db:
+ dump_add_mbr < gw_evt_hdr_v1, gw_add_mbr_evt_v1 > ( in, e );
+ break;
+ case evt_add_mbr_tbl:
+ dump_add_mbr < gw_evt_hdr_v1, gw_add_mbr_evt_v1 > ( in, e );
+ break;
+
+ case evt_logmsg:
+ dump_logmsg < gw_evt_hdr_v1, gw_1string_evt_v1 > ( in, e );
+ break;
+ case evt_progmsg:
+ dump_progmsg < gw_evt_hdr_v1, gw_status_evt_v1 > ( in, e );
+ break;
+
+ default:
+ throw "unrecognized event id";
+ }
+ return true;
+ }
+
+ /* dump_v1_packed_event
+ * the events are all packed
+ */
+ static
+ bool dump_v1_packed_event ( FILE * in )
+ {
+ if ( jump_event == event_num )
+ display = true;
+ else if ( end_event == event_num )
+ display = false;
+
+ gwp_evt_hdr_v1 e;
+ memset ( & e, 0, sizeof e );
+
+ size_t num_read = readFILE ( & e, sizeof e, 1, in );
+ if ( num_read != 1 )
+ {
+ int ch = fgetc ( in );
+ if ( ch == EOF )
+ throw "EOF before end-stream";
+
+ throw "failed to read event";
+ }
+ switch ( evt ( e ) )
+ {
+ case evt_bad_event:
+ throw "illegal event id - possibly block of zeros";
+ case evt_errmsg:
+ dump_errmsg < gwp_evt_hdr_v1, gwp_1string_evt_v1 > ( in, e );
+ break;
+ case evt_end_stream:
+ return dump_end_stream ( in, e );
+ case evt_remote_path:
+ dump_remote_path < gwp_evt_hdr_v1, gwp_1string_evt_v1 > ( in, e );
+ break;
+ case evt_use_schema:
+ dump_use_schema < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_new_table:
+ dump_new_table < gwp_evt_hdr_v1, gwp_1string_evt_v1 > ( in, e );
+ break;
+ case evt_new_column:
+ dump_new_column < gwp_evt_hdr_v1, gwp_column_evt_v1 > ( in, e );
+ break;
+ case evt_open_stream:
+ dump_open_stream ( in, e );
+ break;
+ case evt_cell_default:
+ dump_cell_event < gwp_evt_hdr_v1, gwp_data_evt_v1 > ( in, e, "default" );
+ break;
+ case evt_cell_data:
+ dump_cell_event < gwp_evt_hdr_v1, gwp_data_evt_v1 > ( in, e, "data" );
+ break;
+ case evt_next_row:
+ dump_next_row ( in, e );
+ break;
+ case evt_move_ahead:
+ dump_move_ahead < gwp_evt_hdr_v1, gwp_move_ahead_evt_v1 > ( in, e );
+ break;
+ case evt_errmsg2:
+ dump_errmsg < gwp_evt_hdr_v1, gwp_1string_evt_U16_v1 > ( in, e );
+ break;
+ case evt_remote_path2:
+ dump_remote_path < gwp_evt_hdr_v1, gwp_1string_evt_U16_v1 > ( in, e );
+ break;
+ case evt_use_schema2:
+ dump_use_schema < gwp_evt_hdr_v1, gwp_2string_evt_U16_v1 > ( in, e );
+ break;
+ case evt_new_table2:
+ dump_new_table < gwp_evt_hdr_v1, gwp_1string_evt_U16_v1 > ( in, e );
+ break;
+ case evt_cell_default2:
+ dump_cell_event < gwp_evt_hdr_v1, gwp_data_evt_U16_v1 > ( in, e, "default" );
+ break;
+ case evt_cell_data2:
+ dump_cell_event < gwp_evt_hdr_v1, gwp_data_evt_U16_v1 > ( in, e, "data" );
+ break;
+ case evt_empty_default:
+ dump_empty_default < gwp_evt_hdr_v1 > ( in, e );
+ break;
+
+ // add in new message handlers for version 2
+ case evt_software_name:
+ dump_software_name < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_db_metadata_node:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_tbl_metadata_node:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_col_metadata_node:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_db_metadata_node2:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_tbl_metadata_node2:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_col_metadata_node2:
+ dump_metadata_node < gwp_evt_hdr_v1, gwp_2string_evt_v1 > ( in, e );
+ break;
+ case evt_add_mbr_db:
+ dump_add_mbr < gwp_evt_hdr_v1, gwp_add_mbr_evt_v1 > ( in, e );
+ break;
+ case evt_add_mbr_tbl:
+ dump_add_mbr < gwp_evt_hdr_v1, gwp_add_mbr_evt_v1 > ( in, e );
+ break;
+ case evt_logmsg:
+ dump_logmsg < gwp_evt_hdr_v1, gwp_1string_evt_U16_v1 > ( in, e );
+ break;
+ case evt_progmsg:
+ dump_progmsg < gwp_evt_hdr_v1, gwp_status_evt_v1 > ( in, e );
+ break;
+
+ default:
+ throw "unrecognized packed event id";
+ }
+ return true;
+ }
+
+ static
+ void check_v1_header ( const gw_header_v1 & hdr )
+ {
+ if ( hdr . packing > 1 )
+ throw "bad packing spec";
+ }
+
+ static
+ void dump_v1_header ( FILE * in, const gw_header & dad, bool & packed )
+ {
+ gw_header_v1 hdr;
+ init ( hdr, dad );
+
+ size_t num_read = readFILE ( & hdr . packing, sizeof hdr - sizeof ( gw_header ), 1, in );
+ if ( num_read != 1 )
+ throw "failed to read v1 header";
+
+ check_v1_header ( hdr );
+
+ if ( hdr . packing )
+ packed = true;
+
+ if ( display )
+ {
+ std :: cout
+ << "header: version " << hdr . dad . version << '\n'
+ << " hdr_size = " << hdr . dad . hdr_size << '\n'
+ << " packing = " << hdr . packing << '\n'
+ ;
+ }
+ }
+
+ static
+ void check_header ( const gw_header & hdr )
+ {
+ if ( memcmp ( hdr . signature, GW_SIGNATURE, sizeof hdr . signature ) != 0 )
+ throw "bad header signature";
+ if ( hdr . endian != GW_GOOD_ENDIAN )
+ {
+ if ( hdr . endian != GW_REVERSE_ENDIAN )
+ throw "bad header byte order";
+ throw "reversed header byte order";
+ }
+ if ( hdr . version < 1 )
+ throw "bad header version";
+ if ( hdr . version > GW_CURRENT_VERSION )
+ throw "unknown header version";
+ }
+
+ static
+ uint32_t dump_header ( FILE * in, bool & packed )
+ {
+ gw_header hdr;
+ size_t num_read = readFILE ( & hdr, sizeof hdr, 1, in );
+ if ( num_read != 1 )
+ throw "failed to read header";
+
+ check_header ( hdr );
+
+ switch ( hdr . version )
+ {
+ case 1:
+ case 2:
+ dump_v1_header ( in, hdr, packed );
+ break;
+ default:
+ throw "UNIMPLEMENTED: missing new version dumper";
+ }
+ return hdr . version;
+ }
+
+ static
+ void dump ( FILE * in )
+ {
+ foffset = 0;
+
+ bool packed = false;
+ uint32_t version = dump_header ( in, packed );
+
+ event_num = 1;
+ switch ( version )
+ {
+ case 1:
+ case 2:
+
+ if ( packed )
+ {
+ while ( dump_v1_packed_event ( in ) )
+ ++ event_num;
+ }
+ else
+ {
+ while ( dump_v1_event ( in ) )
+ ++ event_num;
+ }
+ break;
+ }
+
+ int ch = fgetc ( in );
+ if ( ch != EOF )
+ throw "excess data after end-stream";
+ }
+
+ static
+ const char * nextArg ( int & i, int argc, char * argv [] )
+ {
+ if ( ++ i >= argc )
+ throw "expected argument";
+ return argv [ i ];
+ }
+
+ static
+ const char * nextArg ( const char * & argp, int & i, int argc, char * argv [] )
+ {
+ const char * arg = argp;
+ argp = "\0";
+
+ if ( arg [ 1 ] != 0 )
+ return arg + 1;
+
+ return nextArg ( i, argc, argv );
+ }
+
+ static
+ uint64_t atoU64 ( const char * str )
+ {
+ char * end;
+ long i = strtol ( str, & end, 0 );
+ if ( end [ 0 ] != 0 )
+ throw "badly formed number";
+ if ( i < 0 )
+ throw "number out of bounds";
+ return ( uint64_t ) i;
+ }
+
+ static
+ void help ( const char * tool_path )
+ {
+ const char * tool_name = strrchr ( tool_path, '/' );
+ if ( tool_name ++ == NULL )
+ tool_name = tool_path;
+
+ std :: cout
+ << '\n'
+ << "Usage:\n"
+ << " " << tool_name << " [options] [<stream-file> ...]\n"
+ << '\n'
+ << "Summary:\n"
+ << " This is a tool to analyze and display the contents of a stream produced by\n"
+ << " the \"general-writer\" library.\n"
+ << '\n'
+ << " Input may be taken from stdin ( DEFAULT ) or from one or more stream-files.\n"
+ << '\n'
+ << "Options:\n"
+ << " -j event-num jump to numbered event before displaying.\n"
+ << " ( event numbers are 1-based, so the first event is 1. )\n"
+ << " -N event-count display a limited number of events and then go quiet.\n"
+ << " -v increase verbosity. Use multiple times for increased verbosity.\n"
+ << " ( currently this only enables or disables display. )\n"
+ << " -h display this help message\n"
+ << '\n'
+ << tool_path << '\n'
+ ;
+ }
+
+ static
+ void run ( int argc, char * argv [] )
+ {
+ uint32_t num_files = 0;
+
+ for ( int i = 1; i < argc; ++ i )
+ {
+ const char * arg = argv [ i ];
+ if ( arg [ 0 ] != '-' )
+ argv [ ++ num_files ] = ( char * ) arg;
+ else do switch ( ( ++ arg ) [ 0 ] )
+ {
+ case 'v':
+ ++ verbose;
+ break;
+ case 'j':
+ jump_event = atoU64 ( nextArg ( arg, i, argc, argv ) );
+ break;
+ case 'N':
+ end_event = atoU64 ( nextArg ( arg, i, argc, argv ) );
+ break;
+ case 'h':
+ case '?':
+ help ( argv [ 0 ] );
+ return;
+ default:
+ throw "unrecognized option";
+ }
+ while ( arg [ 1 ] != 0 );
+ }
+
+ if ( verbose && jump_event == 0 )
+ display = true;
+
+ end_event += jump_event;
+
+ if ( num_files == 0 )
+ dump ( stdin );
+ else for ( uint32_t i = 1; i <= num_files; ++ i )
+ {
+ FILE * in = fopen ( argv [ i ], "rb" );
+ if ( in == 0 )
+ std :: cerr << "WARNING: failed to open input file: \"" << argv [ i ] << '\n';
+ else
+ {
+ dump ( in );
+ fclose ( in );
+ }
+ }
+ }
+}
+
+int main ( int argc, char * argv [] )
+{
+ int status = 1;
+ try
+ {
+ gw_dump :: run ( argc, argv );
+ status = 0;
+ }
+ catch ( const char x [] )
+ {
+ std :: cerr
+ << "ERROR: offset "
+ << gw_dump :: foffset
+ << ": event "
+ << gw_dump :: event_num
+ << ": "
+ << x
+ << '\n'
+ ;
+ }
+ catch ( ... )
+ {
+ std :: cerr
+ << "ERROR: offset "
+ << gw_dump :: foffset
+ << ": event "
+ << gw_dump :: event_num
+ << ": unknown error\n"
+ ;
+ }
+
+ return status;
+}
diff --git a/tools/general-loader/main.cpp b/tools/general-loader/main.cpp
new file mode 100644
index 0000000..a9c9484
--- /dev/null
+++ b/tools/general-loader/main.cpp
@@ -0,0 +1,239 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "general-loader.hpp"
+
+#include <sysalloc.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include <iostream>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/log-xml.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kns/stream.h>
+
+static char const option_include_paths[] = "include";
+#define OPTION_INCLUDE_PATHS option_include_paths
+#define ALIAS_INCLUDE_PATHS "I"
+static
+char const * include_paths_usage[] =
+{
+ "Additional directories to search for schema include files. Can specify multiple paths separated by ':'.",
+ NULL
+};
+
+static char const option_schemas[] = "schema";
+#define OPTION_SCHEMAS option_schemas
+#define ALIAS_SCHEMAS "S"
+static
+char const * schemas_usage[] =
+{
+ "Schema file to use. Can specify multiple files separated by ':'.",
+ NULL
+};
+
+static char const option_target[] = "target";
+#define OPTION_TARGET option_target
+#define ALIAS_TARGET "T"
+static
+char const * target_usage[] =
+{
+ "Database file to create. Overrides any remote path specifications coming from the input stream",
+ NULL
+};
+
+OptDef Options[] =
+{
+ /* order here is same as in param array below!!! */
+ /* max#, needs param, required */
+ { OPTION_INCLUDE_PATHS, ALIAS_INCLUDE_PATHS, NULL, include_paths_usage, 0, true, false },
+ { OPTION_SCHEMAS, ALIAS_SCHEMAS, NULL, schemas_usage, 0, true, false },
+ { OPTION_TARGET, ALIAS_TARGET, NULL, target_usage, 1, true, false },
+};
+
+const char* OptHelpParam[] =
+{
+ /* order here is same as in OptDef array above!!! */
+ "path(s)",
+ "path(s)",
+ "path",
+ "",
+};
+
+rc_t UsageSummary (char const * progname)
+{
+ return KOutMsg (
+ "Usage:\n"
+ "\t%s [options] \n"
+ "\n"
+ "Summary:\n"
+ "\tPopulate a VDB database from standard input\n"
+ "\n"
+ ,progname);
+}
+
+char const UsageDefaultName[] = "general-loader";
+
+rc_t CC Usage (const Args * args)
+{
+ rc_t rc;
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ const size_t argsQty = sizeof(Options) / sizeof(Options[0]);
+ for(size_t i = 0; i < argsQty; i++ ) {
+ if( Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(size_t i = 0; i < argsQty; i++ ) {
+ if( !Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ XMLLogger_Usage();
+
+ HelpOptionsStandard ();
+ HelpVersion (fullpath, KAppVersion());
+ return rc;
+}
+
+rc_t CC KMain (int argc, char * argv[])
+{
+ Args * args;
+ uint32_t pcount;
+ const XMLLogger* xml_logger = NULL;
+ rc_t rc = ArgsMakeAndHandle (&args, argc, argv, 2
+ , Options, sizeof Options / sizeof (OptDef)
+ , XMLLogger_Args, XMLLogger_ArgsQty);
+
+ if ( rc == 0 )
+ {
+ rc = XMLLogger_Make(&xml_logger, NULL, args);
+ if (rc == 0)
+ {
+ rc = ArgsParamCount (args, &pcount);
+ if ( rc == 0 )
+ {
+ if ( pcount != 0 )
+ {
+ rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive);
+ MiniUsage (args);
+ }
+ else
+ {
+ const KStream *std_in;
+ rc = KStreamMakeStdIn ( & std_in );
+ if ( rc == 0 )
+ {
+ KStream* buffered;
+ rc = KStreamMakeBuffered ( &buffered, std_in, 0 /*input-only*/, 0 /*use default size*/ );
+ if ( rc == 0 )
+ {
+ GeneralLoader loader ( argv[0], *buffered );
+
+ rc = ArgsOptionCount (args, OPTION_INCLUDE_PATHS, &pcount);
+ if ( rc == 0 )
+ {
+ for ( uint32_t i = 0 ; i < pcount; ++i )
+ {
+ const void* value;
+ rc = ArgsOptionValue (args, OPTION_INCLUDE_PATHS, i, &value);
+ if ( rc != 0 )
+ {
+ break;
+ }
+ loader . AddSchemaIncludePath ( static_cast <char const*> (value) );
+ }
+ }
+
+ rc = ArgsOptionCount (args, OPTION_SCHEMAS, &pcount);
+ if ( rc == 0 )
+ {
+ for ( uint32_t i = 0 ; i < pcount; ++i )
+ {
+ const void* value;
+ rc = ArgsOptionValue (args, OPTION_SCHEMAS, i, &value);
+ if ( rc != 0 )
+ {
+ break;
+ }
+ loader . AddSchemaFile( static_cast <char const*> (value) );
+ }
+ }
+
+ rc = ArgsOptionCount (args, OPTION_TARGET, &pcount);
+ if ( rc == 0 && pcount == 1 )
+ {
+ const void* value;
+ rc = ArgsOptionValue (args, OPTION_TARGET, 0, &value);
+ if ( rc == 0 )
+ {
+ loader . SetTargetOverride ( static_cast <char const*> (value) );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = loader . Run();
+ }
+ KStreamRelease ( buffered );
+ }
+ KStreamRelease ( std_in );
+ }
+ }
+ }
+ }
+ }
+
+ if ( rc != 0)
+ {
+ LOGERR ( klogErr, rc, "load failed" );
+ }
+
+ ArgsWhack(args);
+ XMLLogger_Release(xml_logger);
+ return rc;
+}
diff --git a/tools/general-loader/protocol-parser.cpp b/tools/general-loader/protocol-parser.cpp
new file mode 100644
index 0000000..398e3a9
--- /dev/null
+++ b/tools/general-loader/protocol-parser.cpp
@@ -0,0 +1,1048 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "general-loader.hpp"
+
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include "general-writer.h"
+#include "utf8-like-int-codec.h"
+
+using namespace std;
+
+///////////// GeneralLoader::ProtocolParser
+
+template <typename TEvent>
+rc_t
+GeneralLoader :: ProtocolParser :: ReadEvent ( Reader& p_reader, TEvent& p_event )
+{ // read the part of p_event that is outside of p_event.dad (event header)
+ if ( sizeof p_event > sizeof p_event . dad )
+ {
+ char * start = (char*) & p_event . dad;
+ start += sizeof p_event . dad;
+ return p_reader . Read ( start, sizeof p_event - sizeof p_event . dad );
+ }
+ return 0;
+};
+
+///////////// GeneralLoader::UnpackedProtocolParser
+
+rc_t
+GeneralLoader :: UnpackedProtocolParser :: ParseEvents ( Reader& p_reader, DatabaseLoader& p_dbLoader )
+{
+ rc_t rc;
+ do
+ {
+ p_reader . Align ();
+
+ struct gw_evt_hdr_v1 evt_header;
+ rc = p_reader . Read ( & evt_header, sizeof ( evt_header ) );
+ if ( rc != 0 )
+ {
+ break;
+ }
+
+ switch ( ncbi :: evt ( evt_header ) )
+ {
+ case evt_use_schema:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Use-Schema" );
+
+ gw_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t schema_file_size = ncbi :: size1 ( evt );
+ size_t schema_name_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( schema_file_size + schema_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . UseSchema ( string ( ( const char * ) p_reader . GetBuffer (), schema_file_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + schema_file_size, schema_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_remote_path:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Remote-Path" );
+
+ gw_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t database_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( database_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . RemotePath ( string ( ( const char * ) p_reader . GetBuffer (), database_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_software_name:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Software-Name" );
+
+ gw_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t name_size = ncbi :: size1 ( evt );
+ size_t version_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( name_size + version_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . SoftwareName ( string ( ( const char * ) p_reader . GetBuffer (), name_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + name_size, version_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_db_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: DB-Metadata-Node, id=$(i)", "i=%u", objId );
+
+ gw_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . DBMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_tbl_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Tbl-Metadata-Node, id=$(i)", "i=%u", objId );
+
+ gw_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . TblMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_col_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Col-Metadata-Node, id=$(i)", "i=%u", objId );
+
+ gw_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ColMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_new_table:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: New-Table, id=$(i)", "i=%u", tableId );
+
+ gw_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t table_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( table_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . NewTable ( tableId, string ( ( const char * ) p_reader . GetBuffer (), table_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_new_column:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: New-Column, id=$(i)", "i=%u", columnId );
+
+ gw_column_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t col_name_size = ncbi :: name_size ( evt );
+ rc = p_reader . Read ( col_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . NewColumn ( columnId,
+ ncbi :: table_id ( evt ),
+ ncbi :: elem_bits ( evt ),
+ ncbi :: flag_bits ( evt ),
+ string ( ( const char * ) p_reader . GetBuffer (), col_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_add_mbr_db:
+ {
+ uint32_t db_id = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Add-Mbr-DB, id=$(i)", "i=%u", db_id );
+
+ gw_add_mbr_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ uint32_t parent_id = ncbi :: db_id ( evt );
+ size_t db_mbr_size = ncbi :: size1 ( evt );
+ size_t db_name_size = ncbi :: size2 ( evt );
+ uint8_t create_mode = ncbi :: create_mode ( evt );
+ rc = p_reader . Read ( db_mbr_size + db_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . AddMbrDB ( db_id,
+ parent_id,
+ string ( ( const char * ) p_reader . GetBuffer (), db_mbr_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + db_mbr_size, db_name_size ),
+ create_mode );
+ }
+ }
+ }
+ break;
+
+ case evt_add_mbr_tbl:
+ {
+ uint32_t db_tbl_id = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Add-Mbr-Table, id=$(i)", "i=%u", db_tbl_id );
+
+ gw_add_mbr_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ uint32_t parent_id = ncbi :: db_id ( evt );
+ size_t db_mbr_size = ncbi :: size1 ( evt );
+ size_t db_name_size = ncbi :: size2 ( evt );
+ uint8_t create_mode = ncbi :: create_mode ( evt );
+ rc = p_reader . Read ( db_mbr_size + db_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . AddMbrTbl ( db_tbl_id,
+ parent_id,
+ string ( ( const char * ) p_reader . GetBuffer (), db_mbr_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + db_mbr_size, db_name_size ),
+ create_mode );
+ }
+ }
+ }
+ break;
+
+ case evt_cell_data:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Data, id=$(i)", "i=%u", columnId );
+
+ gw_data_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ const DatabaseLoader :: Column* col = p_dbLoader . GetColumn ( columnId );
+ if ( col != 0 )
+ {
+ size_t elem_count = ncbi :: elem_count ( evt );
+ rc = p_reader . Read ( ( col -> elemBits * elem_count + 7 ) / 8 );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . CellData ( columnId, p_reader. GetBuffer (), elem_count );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ }
+ }
+ break;
+
+ case evt_cell_default:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Default, id=$(i)", "i=%u", columnId );
+
+ gw_data_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ const DatabaseLoader :: Column* col = p_dbLoader . GetColumn ( columnId );
+ if ( col != 0 )
+ {
+ size_t elem_count = ncbi :: elem_count ( evt );
+ rc = p_reader . Read ( ( col -> elemBits * elem_count + 7 ) / 8 );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . CellDefault ( columnId, p_reader. GetBuffer (), elem_count );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ }
+ }
+ break;
+
+ case evt_empty_default:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-EmptyDefault, id=$(i)", "i=%u", columnId );
+ rc = p_dbLoader . CellDefault ( columnId, 0, 0 );
+ }
+ break;
+
+ case evt_open_stream:
+ LogMsg ( klogDebug, "protocol-parser event: Open-Stream" );
+ rc = p_dbLoader . OpenStream ();
+ break;
+
+ case evt_end_stream:
+ LogMsg ( klogDebug, "protocol-parser event: End-Stream" );
+ return p_dbLoader . CloseStream ();
+
+ case evt_next_row:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Next-Row, id=$(i)", "i=%u", tableId );
+ rc = p_dbLoader . NextRow ( tableId );
+ }
+ break;
+
+ case evt_move_ahead:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Move-Ahead, id=$(i)", "i=%u", tableId );
+
+ gw_move_ahead_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . MoveAhead ( tableId, ncbi :: get_nrows ( evt ) );
+ }
+ }
+ break;
+
+ case evt_errmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Error-Message" );
+
+ gw_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t message_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( message_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ErrorMessage ( string ( ( const char * ) p_reader . GetBuffer (), message_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_logmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Log-Message" );
+
+ gw_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t message_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( message_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . LogMessage ( string ( ( const char * ) p_reader . GetBuffer (), message_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_progmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Progress-Message" );
+
+ gw_status_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t name_sz = ncbi :: size ( evt );
+ uint32_t pid = ncbi :: pid ( evt );
+ uint32_t version = ncbi :: version ( evt );
+ uint32_t timestamp = ncbi :: timestamp ( evt );
+ uint32_t percent = ncbi :: percent ( evt );
+
+ rc = p_reader . Read ( name_sz );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ProgressMessage ( string ( ( const char * ) p_reader . GetBuffer (), name_sz ),
+ pid,
+ timestamp,
+ version,
+ percent );
+ }
+ }
+ }
+ break;
+
+ default:
+ pLogMsg ( klogErr,
+ "unexpected general-loader event at $(o): $(e)",
+ "o=%lu,e=%i",
+ ( unsigned long ) p_reader . GetReadCount(), ( int ) ncbi :: evt ( evt_header ) );
+ rc = RC ( rcExe, rcFile, rcReading, rcData, rcUnexpected );
+ break;
+ }
+ }
+ while ( rc == 0 );
+
+ return rc;
+}
+
+///////////// GeneralLoader::PackedProtocolParser
+
+template < typename T_uintXX >
+rc_t
+GeneralLoader :: PackedProtocolParser :: UncompressInt ( Reader& p_reader, uint16_t p_dataSize, int (*p_decode) ( uint8_t const* buf_start, uint8_t const* buf_xend, T_uintXX* ret_decoded ) )
+{
+ m_unpackingBuf . clear();
+ // reserve enough for the best-packed case, when each element is represented with 1 byte
+ m_unpackingBuf . reserve ( sizeof ( T_uintXX ) * p_dataSize );
+
+ const uint8_t* buf_begin = reinterpret_cast<const uint8_t*> ( p_reader . GetBuffer() );
+ const uint8_t* buf_end = buf_begin + p_dataSize;
+ while ( buf_begin < buf_end )
+ {
+ T_uintXX ret_decoded;
+ int numRead = p_decode ( buf_begin, buf_end, &ret_decoded );
+ if ( numRead <= 0 )
+ {
+ pLogMsg ( klogErr, "protocol-parser: decode_uintXX() returned $(i)", "i=%i", numRead );
+ return RC ( rcExe, rcFile, rcReading, rcData, rcCorrupt );
+ }
+
+ for ( size_t i = 0; i < sizeof ( T_uintXX ); ++i )
+ {
+ m_unpackingBuf . push_back ( reinterpret_cast<const uint8_t*> ( & ret_decoded ) [ i ] );
+ }
+
+ buf_begin += numRead;
+ }
+
+ return 0;
+}
+
+rc_t
+GeneralLoader :: PackedProtocolParser :: ParseData ( Reader& p_reader, DatabaseLoader& p_dbLoader, uint32_t p_columnId, uint32_t p_dataSize )
+{
+ rc_t rc = 0;
+ const DatabaseLoader :: Column* col = p_dbLoader . GetColumn ( p_columnId );
+ if ( col != 0 )
+ {
+ rc = p_reader . Read ( p_dataSize );
+ if ( rc == 0 )
+ {
+ if ( col -> IsCompressed () )
+ {
+ switch ( col -> elemBits )
+ {
+ case 16:
+ rc = UncompressInt ( p_reader, p_dataSize, decode_uint16 );
+ break;
+ case 32:
+ rc = UncompressInt ( p_reader, p_dataSize, decode_uint32 );
+ break;
+ case 64:
+ rc = UncompressInt ( p_reader, p_dataSize, decode_uint64 );
+ break;
+ default:
+ LogMsg ( klogErr, "protocol-parser: bad element size for packed integer" );
+ rc = RC ( rcExe, rcFile, rcReading, rcData, rcInvalid );
+ break;
+ }
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . CellData ( p_columnId, m_unpackingBuf . data(), m_unpackingBuf . size() * 8 / col -> elemBits );
+ }
+ }
+ else
+ {
+ rc = p_dbLoader . CellData ( p_columnId, p_reader. GetBuffer (), p_dataSize * 8 / col -> elemBits );
+ }
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ return rc;
+}
+
+rc_t
+GeneralLoader :: PackedProtocolParser :: ParseEvents( Reader& p_reader, DatabaseLoader& p_dbLoader )
+{
+ rc_t rc;
+ do
+ {
+ struct gwp_evt_hdr_v1 evt_header;
+ rc = p_reader . Read ( & evt_header, sizeof ( evt_header ) );
+ if ( rc != 0 )
+ {
+ break;
+ }
+
+ switch ( ncbi :: evt ( evt_header ) )
+ {
+ case evt_use_schema:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Use-Schema (packed)" );
+
+ gwp_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t schema_file_size = ncbi :: size1 ( evt );
+ size_t schema_name_size = ncbi :: size2 ( evt );
+
+ rc = p_reader . Read ( schema_file_size + schema_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . UseSchema ( string ( ( const char * ) p_reader . GetBuffer (), schema_file_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + schema_file_size, schema_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_use_schema2:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Use-Schema2" );
+
+ gwp_2string_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t schema_file_size = ncbi :: size1 ( evt );
+ size_t schema_name_size = ncbi :: size2 ( evt );
+
+ rc = p_reader . Read ( schema_file_size + schema_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . UseSchema ( string ( ( const char * ) p_reader . GetBuffer (), schema_file_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + schema_file_size, schema_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_remote_path:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Remote-Path (packed)" );
+
+ gwp_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t database_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( database_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . RemotePath ( string ( ( const char * ) p_reader . GetBuffer (), database_name_size ) );
+ }
+ }
+ }
+ break;
+ case evt_remote_path2:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Remote-Path2" );
+
+ gwp_1string_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t database_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( database_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . RemotePath ( string ( ( const char * ) p_reader . GetBuffer (), database_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_software_name:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Software-Name (packed)" );
+
+ gwp_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t name_size = ncbi :: size1 ( evt );
+ size_t version_size = ncbi :: size2 ( evt );
+
+ rc = p_reader . Read ( name_size + version_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . SoftwareName ( string ( ( const char * ) p_reader . GetBuffer (), name_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + name_size, version_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_db_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ if ( objId == 256 ) // a special case for the root database; same as 0
+ {
+ objId = 0;
+ }
+ pLogMsg ( klogDebug, "protocol-parser event: Metadata-Node (packed), id=$(i)", "i=%u", objId );
+
+ gwp_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . DBMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_tbl_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Tbl-Metadata-Node (packed), id=$(i)", "i=%u", objId );
+
+ gwp_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . TblMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_col_metadata_node:
+ {
+ uint32_t objId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Col-Metadata-Node (packed), id=$(i)", "i=%u", objId );
+
+ gwp_2string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t node_size = ncbi :: size1 ( evt );
+ size_t value_size = ncbi :: size2 ( evt );
+ rc = p_reader . Read ( node_size + value_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ColMetadataNode ( objId,
+ string ( ( const char * ) p_reader . GetBuffer (), node_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + node_size, value_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_new_table:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: New-Table (packed), id=$(i)", "i=%u", tableId );
+
+ gwp_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t table_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( table_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . NewTable ( tableId, string ( ( const char * ) p_reader . GetBuffer (), table_name_size ) );
+ }
+ }
+ }
+ break;
+ case evt_new_table2:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: New-Table2, id=$(i)", "i=%u", tableId );
+
+ gwp_1string_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t table_name_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( table_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . NewTable ( tableId, string ( ( const char * ) p_reader . GetBuffer (), table_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_new_column:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: New-Column (packed), id=$(i)", "i=%u", columnId );
+
+ gwp_column_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t col_name_size = ncbi :: name_size ( evt );
+ rc = p_reader . Read ( col_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . NewColumn ( columnId,
+ ncbi :: table_id ( evt ),
+ ncbi :: elem_bits ( evt ),
+ ncbi :: flag_bits ( evt ),
+ string ( ( const char * ) p_reader . GetBuffer (), col_name_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_add_mbr_db:
+ {
+ uint32_t db_id = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Add-Mbr-DB ( packed ), id=$(i)", "i=%u", db_id );
+
+ gwp_add_mbr_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ uint32_t parent_id = ncbi :: db_id ( evt );
+ size_t db_mbr_size = ncbi :: size1 ( evt );
+ size_t db_name_size = ncbi :: size2 ( evt );
+ uint8_t create_mode = ncbi :: create_mode ( evt );
+ rc = p_reader . Read ( db_mbr_size + db_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . AddMbrDB ( db_id,
+ parent_id,
+ string ( ( const char * ) p_reader . GetBuffer (), db_mbr_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + db_mbr_size, db_name_size ),
+ create_mode );
+ }
+ }
+ }
+ break;
+
+ case evt_add_mbr_tbl:
+ {
+ uint32_t db_tbl_id = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Add-Mbr-Table ( packed ), id=$(i)", "i=%u", db_tbl_id );
+
+ gwp_add_mbr_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ uint32_t parent_id = ncbi :: db_id ( evt );
+ size_t db_mbr_size = ncbi :: size1 ( evt );
+ size_t db_name_size = ncbi :: size2 ( evt );
+ uint8_t create_mode = ncbi :: create_mode ( evt );
+ rc = p_reader . Read ( db_mbr_size + db_name_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . AddMbrTbl ( db_tbl_id,
+ parent_id,
+ string ( ( const char * ) p_reader . GetBuffer (), db_mbr_size ),
+ string ( ( const char * ) p_reader . GetBuffer () + db_mbr_size, db_name_size ),
+ create_mode );
+ }
+ }
+ }
+ break;
+
+ case evt_open_stream:
+ LogMsg ( klogDebug, "protocol-parser event: Open-Stream (packed)" );
+ rc = p_dbLoader . OpenStream ();
+ break;
+
+ case evt_end_stream:
+ LogMsg ( klogDebug, "protocol-parser event: End-Stream (packed)" );
+ return p_dbLoader . CloseStream ();
+
+ case evt_cell_data:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Data (packed), id=$(i)", "i=%u", columnId );
+
+ gwp_data_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ rc = ParseData ( p_reader, p_dbLoader, columnId, ncbi :: size ( evt ) );
+ }
+ }
+ break;
+
+ case evt_cell_data2:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Data2, id=$(i)", "i=%u", columnId );
+
+ gwp_data_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ rc = ParseData ( p_reader, p_dbLoader, columnId, ncbi :: size ( evt ) );
+ }
+ }
+ break;
+
+ case evt_cell_default:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Default (packed), id=$(i)", "i=%u", columnId );
+
+ gwp_data_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ const DatabaseLoader :: Column* col = p_dbLoader . GetColumn ( columnId );
+ if ( col != 0 )
+ {
+ size_t dataSize = ncbi :: size ( evt );
+ rc = p_reader . Read ( dataSize );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . CellDefault ( columnId, p_reader. GetBuffer (), dataSize * 8 / col -> elemBits );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ }
+ }
+ break;
+
+ case evt_cell_default2:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-Default2, id=$(i)", "i=%u", columnId );
+
+ gwp_data_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ { // same as above - refactor
+ const DatabaseLoader :: Column* col = p_dbLoader . GetColumn ( columnId );
+ if ( col != 0 )
+ {
+ size_t dataSize = ncbi :: size ( evt );
+ rc = p_reader . Read ( dataSize );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . CellDefault ( columnId, p_reader. GetBuffer (), dataSize * 8 / col -> elemBits );
+ }
+ }
+ else
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcColumn, rcNotFound );
+ }
+ }
+ }
+ break;
+
+ case evt_empty_default:
+ {
+ uint32_t columnId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Cell-EmptyDefault (packed), id=$(i)", "i=%u", columnId );
+ rc = p_dbLoader . CellDefault ( columnId, 0, 0 );
+ }
+ break;
+
+ case evt_next_row:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Next-Row (packed), id=$(i)", "i=%u", tableId );
+ rc = p_dbLoader . NextRow ( tableId );
+ }
+ break;
+
+ case evt_move_ahead:
+ {
+ uint32_t tableId = ncbi :: id ( evt_header );
+ pLogMsg ( klogDebug, "protocol-parser event: Move-Ahead (packed), id=$(i)", "i=%u", tableId );
+
+ gwp_move_ahead_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . MoveAhead ( tableId, ncbi :: get_nrows ( evt ) );
+ }
+ }
+ break;
+
+ case evt_errmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Error-Message (packed)" );
+
+ gwp_1string_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t message_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( message_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ErrorMessage ( string ( ( const char * ) p_reader . GetBuffer (), message_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_errmsg2:
+ {
+ LogMsg ( klogDebug, "protocol-parser event: Error-Message2" );
+
+ gwp_1string_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t message_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( message_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ErrorMessage ( string ( ( const char * ) p_reader . GetBuffer (), message_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_logmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event ( packed ): Log-Message" );
+
+ gwp_1string_evt_U16_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t message_size = ncbi :: size ( evt );
+ rc = p_reader . Read ( message_size );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . LogMessage ( string ( ( const char * ) p_reader . GetBuffer (), message_size ) );
+ }
+ }
+ }
+ break;
+
+ case evt_progmsg:
+ {
+ LogMsg ( klogDebug, "protocol-parser event ( packed ): Progress-Message" );
+
+ gwp_status_evt_v1 evt;
+ rc = ReadEvent ( p_reader, evt );
+ if ( rc == 0 )
+ {
+ size_t name_sz = ncbi :: size ( evt );
+ uint32_t pid = ncbi :: pid ( evt );
+ uint32_t version = ncbi :: version ( evt );
+ uint32_t timestamp = ncbi :: timestamp ( evt );
+ uint32_t percent = ncbi :: percent ( evt );
+
+ rc = p_reader . Read ( name_sz );
+ if ( rc == 0 )
+ {
+ rc = p_dbLoader . ProgressMessage ( string ( ( const char * ) p_reader . GetBuffer (), name_sz ),
+ pid,
+ timestamp,
+ version,
+ percent );
+ }
+ }
+ }
+ break;
+
+ default:
+ pLogMsg ( klogErr,
+ "unexpected general-loader event at $(o): $(e)",
+ "o=%lu,e=%i",
+ ( unsigned long ) p_reader . GetReadCount(), ( int ) ncbi :: evt ( evt_header ) );
+ rc = RC ( rcExe, rcFile, rcReading, rcData, rcUnexpected );
+ break;
+ }
+ }
+ while ( rc == 0 );
+
+ return rc;
+}
+
diff --git a/tools/general-loader/utf8-like-int-codec.c b/tools/general-loader/utf8-like-int-codec.c
new file mode 100644
index 0000000..e4e73b0
--- /dev/null
+++ b/tools/general-loader/utf8-like-int-codec.c
@@ -0,0 +1,687 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "utf8-like-int-codec.h"
+
+#define NOT_ENCODED_SEQUENCE 0xFFu
+
+#define MAX_VALUE_BYTE_1 0x7F
+#define MAX_VALUE_BYTE_2 0x7FF
+#define MAX_VALUE_BYTE_3 0xFFFF
+#define MAX_VALUE_BYTE_4 0x1FFFFF
+#define MAX_VALUE_BYTE_5 0x3FFFFFF
+#define MAX_VALUE_BYTE_6 0x7FFFFFFF
+#define MAX_VALUE_BYTE_7 0xFFFFFFFFF
+
+
+int encode_uint16 ( uint16_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend )
+{
+ size_t dst_buf_size = buf_xend - buf_start;
+ int ret = CODEC_UNKNOWN_ERROR;
+
+ /* optimization: process 1-byte case in the very beginning */
+ if (value_to_encode <= MAX_VALUE_BYTE_1)
+ {
+ if ( dst_buf_size < 1 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = (uint8_t)value_to_encode;
+ ret = 1;
+ }
+ else if ( value_to_encode <= MAX_VALUE_BYTE_2 )
+ {
+ /* 1-byte case is processed already, so starting from 2-byte one */
+ if ( dst_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xC0 | (uint8_t)(value_to_encode >> 6);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 2;
+ }
+ else /* encoding will take at least 3 bytes which is pointless - writing directly */
+ {
+ if (dst_buf_size < 3)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = NOT_ENCODED_SEQUENCE;
+ buf_start[1] = (uint8_t)( value_to_encode >> 8 );
+ buf_start[2] = (uint8_t)( value_to_encode );
+
+ ret = 3;
+ }
+
+ return ret;
+}
+
+int decode_uint16 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint16_t* ret_decoded )
+{
+ size_t src_buf_size = buf_xend - buf_start;
+ int ret = CODEC_INVALID_FORMAT;
+
+ if (src_buf_size < 1)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ if ( (int8_t)buf_start[0] >= 0 )
+ {
+ *ret_decoded = buf_start[0];
+ return 1;
+ }
+
+ /*neg_ch = ~ buf_start[0];*/
+ /*
+ neg_ch | buf_start[0]
+ invalid: 01nnnnnn >= 0x40 | 10xxxxxx < 0xC0
+ valid:
+ 2-byte: 001nnnnn >= 0x20 | 110xxxxx < 0xE0
+ 3-byte: 0001nnnn >= 0x10 | 1110xxxx < 0xF0
+ 4-byte: 00001nnn >= 0x08 | 11110xxx < 0xF8
+ 5-byte: 000001nn >= 0x04 | 111110xx < 0xFC
+ 6-byte: 0000001n >= 0x02 | 1111110x < 0xFE
+ 7-byte: 00000001 >= 0x01 | 11111110 < 0xFF
+
+ So, no need to have neg_ch to achieve the filtering
+ */
+
+ /* invalid 1st byte */
+ if ( buf_start[0] < 0xC0 )
+ return CODEC_INVALID_FORMAT;
+ else if ( buf_start[0] < 0xE0 )
+ {
+ if ( src_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x1F;
+ uint8_t byte1;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ *ret_decoded = (uint16_t)byte0 << 6 |
+ (uint16_t)byte1;
+
+ ret = 2;
+ }
+ }
+ else if ( buf_start[0] == NOT_ENCODED_SEQUENCE )
+ {
+ if ( src_buf_size < 3 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ *ret_decoded = (uint16_t)buf_start[1] << 8 |
+ (uint16_t)buf_start[2];
+
+ ret = 3;
+ }
+
+ return ret;
+}
+
+
+int encode_uint32 ( uint32_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend )
+{
+ size_t dst_buf_size = buf_xend - buf_start;
+ int ret = CODEC_UNKNOWN_ERROR;
+
+ if (value_to_encode <= MAX_VALUE_BYTE_1)
+ {
+ if ( dst_buf_size < 1 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = (uint8_t)value_to_encode;
+ ret = 1;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_2)
+ {
+ if ( dst_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xC0 | (uint8_t)(value_to_encode >> 6);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 2;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_3)
+ {
+ if ( dst_buf_size < 3 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xE0 | (uint8_t)(value_to_encode >> 12);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 3;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_4)
+ {
+ if ( dst_buf_size < 4 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xF0 | (uint8_t)(value_to_encode >> 18);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 12 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[3] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 4;
+ }
+ else /* encoding will take at least 5 bytes which is pointless - writing directly */
+ {
+ if (dst_buf_size < 5)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = NOT_ENCODED_SEQUENCE;
+ buf_start[1] = (uint8_t)( value_to_encode >> 24 );
+ buf_start[2] = (uint8_t)( value_to_encode >> 16 );
+ buf_start[3] = (uint8_t)( value_to_encode >> 8 );
+ buf_start[4] = (uint8_t)( value_to_encode );
+
+ ret = 5;
+ }
+
+ return ret;
+}
+
+int decode_uint32 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint32_t* ret_decoded )
+{
+ size_t src_buf_size = buf_xend - buf_start;
+ int ret = CODEC_INVALID_FORMAT;
+
+ if (src_buf_size < 1)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ /* 1-byte sequence */
+ if ( (int8_t)buf_start[0] >= 0 )
+ {
+ *ret_decoded = buf_start[0];
+ return 1;
+ }
+
+ /*neg_ch = ~ buf_start[0];*/
+ /*
+ neg_ch | buf_start[0]
+ invalid: 01nnnnnn >= 0x40 | 10xxxxxx < 0xC0
+ valid:
+ 2-byte: 001nnnnn >= 0x20 | 110xxxxx < 0xE0
+ 3-byte: 0001nnnn >= 0x10 | 1110xxxx < 0xF0
+ 4-byte: 00001nnn >= 0x08 | 11110xxx < 0xF8
+ 5-byte: 000001nn >= 0x04 | 111110xx < 0xFC
+ 6-byte: 0000001n >= 0x02 | 1111110x < 0xFE
+ 7-byte: 00000001 >= 0x01 | 11111110 < 0xFF
+
+ So, no need to have neg_ch to achieve the filtering
+ */
+
+ /* invalid 1st byte */
+ if ( buf_start[0] < 0xC0 )
+ return CODEC_INVALID_FORMAT;
+ /* 2-byte sequence */
+ else if ( buf_start[0] < 0xE0 )
+ {
+ if ( src_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x1F;
+ uint8_t byte1;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ *ret_decoded = (uint32_t)byte0 << 6 |
+ (uint32_t)byte1;
+
+ ret = 2;
+ }
+ }
+ /* 3-byte sequence */
+ else if ( buf_start[0] < 0xF0 )
+ {
+ if ( src_buf_size < 3 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x0F;
+ uint8_t byte1, byte2;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ *ret_decoded = (uint32_t)byte0 << 12 |
+ (uint32_t)byte1 << 6 |
+ (uint32_t)byte2;
+
+ ret = 3;
+ }
+ }
+ /* 4-byte sequence */
+ else if ( buf_start[0] < 0xF8 )
+ {
+ if ( src_buf_size < 4 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x07;
+ uint8_t byte1, byte2, byte3;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ if ( ( buf_start[3] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte3 = buf_start[3] & 0x3F;
+
+ *ret_decoded = (uint32_t)byte0 << 18 |
+ (uint32_t)byte1 << 12 |
+ (uint32_t)byte2 << 6 |
+ (uint32_t)byte3;
+
+ ret = 4;
+ }
+ }
+ else if ( buf_start[0] == NOT_ENCODED_SEQUENCE )
+ {
+ if ( src_buf_size < 5 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ *ret_decoded = (uint32_t)buf_start[1] << 24 |
+ (uint32_t)buf_start[2] << 16 |
+ (uint32_t)buf_start[3] << 8 |
+ (uint32_t)buf_start[4];
+
+ ret = 5;
+ }
+
+ return ret;
+}
+
+
+int encode_uint64 ( uint64_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend )
+{
+ size_t dst_buf_size = buf_xend - buf_start;
+ int ret = CODEC_UNKNOWN_ERROR;
+
+ if (value_to_encode <= MAX_VALUE_BYTE_1)
+ {
+ if ( dst_buf_size < 1 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = (uint8_t)value_to_encode;
+ ret = 1;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_2)
+ {
+ if ( dst_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xC0 | (uint8_t)(value_to_encode >> 6);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 2;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_3)
+ {
+ if ( dst_buf_size < 3 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xE0 | (uint8_t)(value_to_encode >> 12);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 3;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_4)
+ {
+ if ( dst_buf_size < 4 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xF0 | (uint8_t)(value_to_encode >> 18);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 12 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[3] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 4;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_5)
+ {
+ if ( dst_buf_size < 5 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xF8 | (uint8_t)(value_to_encode >> 24);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 18 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode >> 12 & 0x3F);
+ buf_start[3] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[4] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 5;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_6)
+ {
+ if ( dst_buf_size < 6 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xFC | (uint8_t)(value_to_encode >> 30);
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 24 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode >> 18 & 0x3F);
+ buf_start[3] = 0x80 | (uint8_t)(value_to_encode >> 12 & 0x3F);
+ buf_start[4] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[5] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 6;
+ }
+ else if (value_to_encode <= MAX_VALUE_BYTE_7)
+ {
+ if ( dst_buf_size < 7 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = 0xFE;/* | (uint8_t)(value_to_encode >> 36);*/ /* this shift will always give 0 */
+ buf_start[1] = 0x80 | (uint8_t)(value_to_encode >> 30 & 0x3F);
+ buf_start[2] = 0x80 | (uint8_t)(value_to_encode >> 24 & 0x3F);
+ buf_start[3] = 0x80 | (uint8_t)(value_to_encode >> 18 & 0x3F);
+ buf_start[4] = 0x80 | (uint8_t)(value_to_encode >> 12 & 0x3F);
+ buf_start[5] = 0x80 | (uint8_t)(value_to_encode >> 6 & 0x3F);
+ buf_start[6] = 0x80 | (uint8_t)(value_to_encode & 0x3F);
+
+ ret = 7;
+ }
+ else /* there is a limitation - cannot encode in more than 7 bytes, writing directly now */
+ {
+ if (dst_buf_size < 9)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ buf_start[0] = NOT_ENCODED_SEQUENCE;
+ buf_start[1] = (uint8_t)( value_to_encode >> 56 );
+ buf_start[2] = (uint8_t)( value_to_encode >> 48 );
+ buf_start[3] = (uint8_t)( value_to_encode >> 40 );
+ buf_start[4] = (uint8_t)( value_to_encode >> 32 );
+ buf_start[5] = (uint8_t)( value_to_encode >> 24 );
+ buf_start[6] = (uint8_t)( value_to_encode >> 16 );
+ buf_start[7] = (uint8_t)( value_to_encode >> 8 );
+ buf_start[8] = (uint8_t)( value_to_encode );
+
+ ret = 9;
+ }
+
+ return ret;
+}
+
+int decode_uint64 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint64_t* ret_decoded )
+{
+ size_t src_buf_size = buf_xend - buf_start;
+ int ret = CODEC_INVALID_FORMAT;
+
+ if (src_buf_size < 1)
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ /* 1-byte sequence */
+ if ( (int8_t)buf_start[0] >= 0 )
+ {
+ *ret_decoded = buf_start[0];
+ return 1;
+ }
+
+ /*neg_ch = ~ buf_start[0];*/
+ /*
+ neg_ch | buf_start[0]
+ invalid: 01nnnnnn >= 0x40 | 10xxxxxx < 0xC0
+ valid:
+ 2-byte: 001nnnnn >= 0x20 | 110xxxxx < 0xE0
+ 3-byte: 0001nnnn >= 0x10 | 1110xxxx < 0xF0
+ 4-byte: 00001nnn >= 0x08 | 11110xxx < 0xF8
+ 5-byte: 000001nn >= 0x04 | 111110xx < 0xFC
+ 6-byte: 0000001n >= 0x02 | 1111110x < 0xFE
+ 7-byte: 00000001 >= 0x01 | 11111110 < 0xFF
+
+ So, no need to have neg_ch to achieve the filtering
+ */
+
+ /* invalid 1st byte */
+ if ( buf_start[0] < 0xC0 )
+ return CODEC_INVALID_FORMAT;
+ /* 2-byte sequence */
+ else if ( buf_start[0] < 0xE0 )
+ {
+ if ( src_buf_size < 2 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x1F;
+ uint8_t byte1;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte0 << 6 |
+ (uint64_t)byte1;
+
+ ret = 2;
+ }
+ }
+ /* 3-byte sequence */
+ else if ( buf_start[0] < 0xF0 )
+ {
+ if ( src_buf_size < 3 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x0F;
+ uint8_t byte1, byte2;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte0 << 12 |
+ (uint64_t)byte1 << 6 |
+ (uint64_t)byte2;
+
+ ret = 3;
+ }
+ }
+ /* 4-byte sequence */
+ else if ( buf_start[0] < 0xF8 )
+ {
+ if ( src_buf_size < 4 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x07;
+ uint8_t byte1, byte2, byte3;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ if ( ( buf_start[3] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte3 = buf_start[3] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte0 << 18 |
+ (uint64_t)byte1 << 12 |
+ (uint64_t)byte2 << 6 |
+ (uint64_t)byte3;
+
+ ret = 4;
+ }
+ }
+ /* 5-byte sequence */
+ else if ( buf_start[0] < 0xFC )
+ {
+ if ( src_buf_size < 5 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x03;
+ uint8_t byte1, byte2, byte3, byte4;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ if ( ( buf_start[3] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte3 = buf_start[3] & 0x3F;
+
+ if ( ( buf_start[4] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte4 = buf_start[4] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte0 << 24 |
+ (uint64_t)byte1 << 18 |
+ (uint64_t)byte2 << 12 |
+ (uint64_t)byte3 << 6 |
+ (uint64_t)byte4;
+
+ ret = 5;
+ }
+ }
+ /* 6-byte sequence */
+ else if ( buf_start[0] < 0xFE )
+ {
+ if ( src_buf_size < 6 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte0 = buf_start[0] & 0x01;
+ uint8_t byte1, byte2, byte3, byte4, byte5;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ if ( ( buf_start[3] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte3 = buf_start[3] & 0x3F;
+
+ if ( ( buf_start[4] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte4 = buf_start[4] & 0x3F;
+
+ if ( ( buf_start[5] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte5 = buf_start[5] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte0 << 30 |
+ (uint64_t)byte1 << 24 |
+ (uint64_t)byte2 << 18 |
+ (uint64_t)byte3 << 12 |
+ (uint64_t)byte4 << 6 |
+ (uint64_t)byte5;
+
+ ret = 6;
+ }
+ }
+ /* 6-byte sequence */
+ else if ( buf_start[0] == 0xFE )
+ {
+ if ( src_buf_size < 7 )
+ return CODEC_INSUFFICIENT_BUFFER;
+ else
+ {
+ uint8_t byte1, byte2, byte3, byte4, byte5, byte6;
+
+ if ( ( buf_start[1] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte1 = buf_start[1] & 0x3F;
+
+ if ( ( buf_start[2] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte2 = buf_start[2] & 0x3F;
+
+ if ( ( buf_start[3] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte3 = buf_start[3] & 0x3F;
+
+ if ( ( buf_start[4] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte4 = buf_start[4] & 0x3F;
+
+ if ( ( buf_start[5] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte5 = buf_start[5] & 0x3F;
+
+ if ( ( buf_start[6] & 0xC0 ) != 0x80 )
+ return CODEC_INVALID_FORMAT;
+ byte6 = buf_start[6] & 0x3F;
+
+ *ret_decoded = (uint64_t)byte1 << 30 |
+ (uint64_t)byte2 << 24 |
+ (uint64_t)byte3 << 18 |
+ (uint64_t)byte4 << 12 |
+ (uint64_t)byte5 << 6 |
+ (uint64_t)byte6;
+
+ ret = 7;
+ }
+ }
+ else /* if ( buf_start[0] == NOT_ENCODED_SEQUENCE ) */
+ {
+ if ( src_buf_size < 9 )
+ return CODEC_INSUFFICIENT_BUFFER;
+
+ *ret_decoded = (uint64_t)buf_start[1] << 56 |
+ (uint64_t)buf_start[2] << 48 |
+ (uint64_t)buf_start[3] << 40 |
+ (uint64_t)buf_start[4] << 32 |
+ (uint64_t)buf_start[5] << 24 |
+ (uint64_t)buf_start[6] << 16 |
+ (uint64_t)buf_start[7] << 8 |
+ (uint64_t)buf_start[8];
+
+ ret = 9;
+ }
+
+ return ret;
+}
diff --git a/tools/general-loader/utf8-like-int-codec.h b/tools/general-loader/utf8-like-int-codec.h
new file mode 100644
index 0000000..0b579ac
--- /dev/null
+++ b/tools/general-loader/utf8-like-int-codec.h
@@ -0,0 +1,69 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_utf8_like_int_codec_
+#define _h_utf8_like_int_codec_
+
+#include <stdint.h>
+#include <stdlib.h> /* size_t on linux */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+{
+ CODEC_INSUFFICIENT_BUFFER = 0,
+ CODEC_INVALID_FORMAT = -1,
+ CODEC_UNKNOWN_ERROR = -2
+};
+
+/*
+all encode_uintXX return:
+ value <= 0: error: one of CODEC_* above
+ value > 0: success: number of bytes written to buf_start
+
+all decode_uintXX return:
+ value <= 0: error: one of CODEC_* above
+ value > 0: success: number of bytes read from buf_start
+*/
+
+int encode_uint16 ( uint16_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend );
+int decode_uint16 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint16_t* ret_decoded );
+
+int encode_uint32 ( uint32_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend );
+int decode_uint32 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint32_t* ret_decoded );
+
+int encode_uint64 ( uint64_t value_to_encode, uint8_t* buf_start, uint8_t* buf_xend );
+int decode_uint64 ( uint8_t const* buf_start, uint8_t const* buf_xend, uint64_t* ret_decoded );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_utf8_like_int_codec_ */
+
diff --git a/tools/kar/Makefile b/tools/kar/Makefile
new file mode 100644
index 0000000..caf443e
--- /dev/null
+++ b/tools/kar/Makefile
@@ -0,0 +1,99 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/kar
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ kar \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#----------------------------------------------------------------
+# kar
+#
+
+KAR_SRC = \
+ kar-args \
+ kar
+
+KAR_OBJ = \
+ $(addsuffix .$(OBJX),$(KAR_SRC))
+
+KAR_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/kar: $(KAR_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(KAR_LIB)
+
+
+#----------------------------------------------------------------
+# sra-kar
+#
+
+SRA_KAR_SRC = \
+ sra-kar
+
+SRA_KAR_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_KAR_SRC))
+
+SRA_KAR_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+$(BINDIR)/sra-kar: $(SRA_KAR_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRA_KAR_LIB)
+
+
diff --git a/tools/kar/kar-args.c b/tools/kar/kar-args.c
new file mode 100644
index 0000000..5fd9646
--- /dev/null
+++ b/tools/kar/kar-args.c
@@ -0,0 +1,428 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "kar-args.h"
+
+#include <klib/rc.h>
+#include <kfs/sra.h>
+#include <klib/log.h>
+#include <klib/out.h>
+
+#include <kapp/main.h>
+
+
+static const char * create_usage[] = { "Create a new archive.", NULL };
+static const char * test_usage[] = { "Check the structural validity of an archive", NULL };
+static const char * extract_usage[] = { "Extract the contents of an archive into a directory.", NULL };
+static const char * force_usage[] =
+{ "(no parameter) this will cause the extract or",
+ "create to over-write existing files unless",
+ "they are write-protected. Without this",
+ "option the program will fail if the archive",
+ "already exists for a create or the target",
+ "directory exists for an extract", NULL };
+static const char * longlist_usage[] =
+{ "more information will be given on each file",
+ "in test/list mode.", NULL };
+static const char * directory_usage[] =
+{ "The next token on the command line is the",
+ "name of the directory to extract to or create",
+ "from", NULL };
+static const char * stdout_usage[] = { "Direct output to stdout", NULL };
+static const char * md5_usage[] = { "create md5sum-compatible checksum file", NULL };
+
+
+OptDef Options [] =
+{
+ { OPTION_CREATE, ALIAS_CREATE, NULL, create_usage, 1, true, false },
+ { OPTION_TEST, ALIAS_TEST, NULL, test_usage, 1, true, false },
+ { OPTION_EXTRACT, ALIAS_EXTRACT, NULL, extract_usage, 1, true, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false },
+ { OPTION_LONGLIST, ALIAS_LONGLIST, NULL, longlist_usage, 0, false, false },
+ { OPTION_DIRECTORY, ALIAS_DIRECTORY, NULL, directory_usage, 1, true, false },
+ { OPTION_STDOUT, ALIAS_STDOUT, NULL, stdout_usage, 1, true, false },
+ { OPTION_MD5, NULL, NULL, md5_usage, 1, false, false }
+};
+
+const char UsageDefaultName[] = "kar";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("Usage:\n"
+ " %s [OPTIONS] -%s|--%s <Archive> -%s|--%s <Directory> [Filter ...]\n"
+ " %s [OPTIONS] -%s|--%s <Archive> -%s|--%s <Directory>\n"
+ " %s [OPTIONS] -%s|--%s|--%s <Archive>\n"
+ "\n"
+ "Summary:\n"
+ " Create, extract from, or test an archive.\n"
+ "\n",
+ progname, ALIAS_CREATE, OPTION_CREATE, ALIAS_DIRECTORY, OPTION_DIRECTORY,
+ progname, ALIAS_EXTRACT, OPTION_EXTRACT, ALIAS_DIRECTORY, OPTION_DIRECTORY,
+ progname, ALIAS_TEST, OPTION_TEST, OPTION_LONGLIST);
+}
+
+rc_t CC Usage (const Args * args)
+{
+ static const char archive[] = "archive";
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ OUTMSG (("Archive Command:\n"
+ " All of these options require the next token on the command line to be\n"
+ " the name of the archive\n\n"));
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine (ALIAS_CREATE, OPTION_CREATE, archive, create_usage);
+ HelpOptionLine (ALIAS_EXTRACT, OPTION_EXTRACT, archive, extract_usage);
+ HelpOptionLine (ALIAS_TEST, OPTION_TEST, archive, test_usage);
+ OUTMSG (("\n"
+ "Archive:\n"
+ " Path to a file that will/does hold the archive of other files.\n"
+ " This can be a full or relative path.\n"
+ "\n"
+ "Directory:\n"
+ " Required for create or extract command, ignored for test command.\n"
+ " This can be a full or relative path.\n"
+ "\n"
+ "Filters:\n"
+ " When present these act as include filters.\n"
+ " Any file name will be included in the extracted files, created archive\n"
+ " or test operation listing\n"
+ " Any directory will be included as well as its contents\n"
+ "\n"
+ "Options:\n"));
+ HelpOptionLine (ALIAS_DIRECTORY, OPTION_DIRECTORY, "Directory", directory_usage);
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+ HelpOptionLine (ALIAS_LONGLIST, OPTION_LONGLIST, NULL, longlist_usage);
+
+ HelpOptionsStandard ();
+
+ HelpOptionLine (ALIAS_STDOUT, OPTION_STDOUT, NULL, stdout_usage);
+ HelpOptionLine ( NULL, OPTION_MD5, NULL, md5_usage);
+
+ OUTMSG (("\n"
+ "Use examples:"
+ "\n"
+ " To create an archive named 'example.sra' that contains the same\n"
+ " contents as a subdirectory 'example' of the current directory\n"
+ "\n"
+ " $ %s --%s example.sra --%s example\n",
+ progname, OPTION_CREATE, OPTION_DIRECTORY));
+
+ OUTMSG (("\n"
+ " To replace an existing archive named 'example.sra' with another that contains\n"
+ " the same contents as a subdirectory 'example' of the current directory\n"
+ "\n"
+ " $ %s -%s -%s example.sra -%s example\n",
+ progname, ALIAS_FORCE, ALIAS_CREATE, ALIAS_DIRECTORY));
+
+ OUTMSG (("\n"
+ " To examine in detail the contents of an archive named 'example.sra'\n"
+ "\n"
+ " $ %s --%s --%s example.sra\n",
+ progname, OPTION_LONGLIST, OPTION_TEST));
+
+ OUTMSG (("\n"
+ " To extract the files from an archive named 'example.sra' into\n"
+ " a subdirectory 'example' of the current directory.\n"
+ " NOTE: all extracted files will be read only.\n"
+ "\n"
+ " $ %s --%s example.sra --%s example\n",
+ progname, OPTION_EXTRACT, OPTION_DIRECTORY));
+
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+static
+rc_t parse_params_int ( Params *p, const Args *args )
+{
+ rc_t rc;
+
+ uint32_t count;
+
+ /* Parameters */
+ rc = ArgsParamCount ( args, &count );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to retrieve parameter count" );
+ return rc;
+ }
+ else
+ {
+ uint32_t i;
+ const char *value;
+
+ p -> mem_count = count;
+
+ for ( i = 0; i < count; ) /*Increment in value insertion into members*/
+ {
+ rc = ArgsParamValue ( args, i, ( const void ** ) &value );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to retrieve parameter value" );
+ return rc;
+ }
+
+ p -> members [ ++i ] = value;
+ }
+ }
+
+ /* Bool Options */
+ rc = ArgsOptionCount ( args, OPTION_LONGLIST, &count );
+ if ( rc == 0 && count != 0 )
+ p -> long_list = true;
+
+ rc = ArgsOptionCount ( args, OPTION_FORCE, &count );
+ if ( rc == 0 && count != 0 )
+ p -> force = true;
+
+ rc = ArgsOptionCount ( args, OPTION_STDOUT, &count );
+ if ( rc == 0 && count != 0 )
+ p -> stdout = true;
+
+ rc = ArgsOptionCount ( args, OPTION_MD5, &count );
+ if ( rc == 0 && count != 0 )
+ p -> md5sum = true;
+
+ /* Options */
+ rc = ArgsOptionCount ( args, OPTION_CREATE, & p -> c_count );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to verify 'create' option" );
+ return rc;
+ }
+
+ /* grab the p->archive_path as an option parameter if p->c_count > 0 */
+ if ( p -> c_count > 0 )
+ {
+ rc = ArgsOptionValue (args, OPTION_CREATE, 0, (const void **) & p -> archive_path );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to access 'create' archive path" );
+ return rc;
+ }
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_EXTRACT, &p -> x_count );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to verify 'extract' option" );
+ return rc;
+ }
+
+ /* grab the p->archive_path as an option parameter if p->x_count > 0 */
+ if ( p -> x_count > 0 )
+ {
+ rc = ArgsOptionValue (args, OPTION_EXTRACT, 0, (const void **) & p -> archive_path );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to access 'extract' archive path" );
+ return rc;
+ }
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_TEST, &p -> t_count );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to verify 'test' option" );
+ return rc;
+ }
+
+ /* grab the p->archive_path as an option parameter if p->t_count > 0 */
+ if ( p -> t_count > 0 )
+ {
+ rc = ArgsOptionValue (args, OPTION_TEST, 0, (const void **) & p -> archive_path );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to access 'test' archive path" );
+ return rc;
+ }
+ }
+
+ /* need to grab the directory option */
+ rc = ArgsOptionCount ( args, OPTION_DIRECTORY, &p -> dir_count );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to verify 'directory' option" );
+ return rc;
+ }
+
+ if ( p -> dir_count > 0 )
+ {
+ rc = ArgsOptionValue ( args, OPTION_DIRECTORY, 0, ( const void ** ) &p -> directory_path );
+ if ( rc != 0 )
+ {
+ LogErr ( klogFatal, rc, "Failed to access directory path" );
+ return rc;
+ }
+ }
+
+ return rc;
+}
+
+rc_t parse_params ( Params *p, Args *args, int argc, char * argv [] )
+{
+ rc_t rc;
+
+ p -> members = ( const char ** ) argv;
+ p -> archive_path = "";
+ p -> directory_path = "";
+ p -> mem_count = 0;
+ p -> dir_count = 0;
+ p -> c_count = 0;
+ p -> x_count = 0;
+ p -> t_count = 0;
+ p -> long_list = false;
+ p -> force = false;
+ p -> stdout = false;
+
+ rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ Options, sizeof Options / sizeof ( Options [ 0 ] ) );
+ if ( rc == 0 )
+ {
+ rc = parse_params_int ( p, args );
+
+ if ( rc == 0 )
+ rc = validate_params ( p );
+
+ }
+
+ return rc;
+}
+
+rc_t validate_params ( Params *p )
+{
+ rc_t rc = 0;
+ uint32_t i;
+
+ /* must have a valid mode */
+ uint32_t cxt_count = p -> c_count + p -> x_count + p -> t_count;
+ if ( cxt_count == 0 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcInsufficient );
+ LogErr ( klogErr, rc, "Require at least one option of create|extract|test" );
+ return rc;
+ }
+ else if ( cxt_count > 1 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcExcessive );
+ LogErr ( klogErr, rc, "Too many option parameters" );
+ return rc;
+ }
+
+ /* if member count > 0, must be in create mode */
+ if ( p -> mem_count > 0 )
+ {
+ if ( p -> c_count == 0 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcInvalid );
+ LogErr ( klogErr, rc, "Must use create option" );
+ return rc;
+ }
+ }
+
+ /* if creating, must have a directory OR member count > 0 */
+ if ( p -> c_count != 0 )
+ {
+ if ( ! ( p -> mem_count != 0 || p -> dir_count != 0 ) )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcInsufficient );
+ LogErr ( klogErr, rc, "Must provide an input directory or file paths when creating " );
+ return rc;
+ }
+ }
+
+ /* if extracting, must have a directory */
+ if ( p -> x_count != 0 )
+ {
+ if ( p -> dir_count == 0 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcInvalid );
+ LogErr ( klogErr, rc, "Must provide a directory path when extracting" );
+ return rc;
+ }
+ }
+
+ /* test the archive path */
+
+
+ /* TBD stdout and md5 */
+
+ /* if we have parameter list, check each parameter for non-NULL and non-empty */
+ for ( i = 1; i <= p -> mem_count; ++ i )
+ {
+ const char * mbr = p -> members [ i ];
+ if ( mbr == NULL )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcNull );
+ LogErr ( klogErr, rc, " " );
+ return rc;
+ }
+
+ if ( mbr [ 0 ] == 0 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcNull );
+ LogErr ( klogErr, rc, " " );
+ return rc;
+ }
+ }
+
+ /* if we have a directory, check non-NULL and non-empty */
+ if ( p -> dir_count != 0 )
+ {
+ if ( p -> directory_path == NULL )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcNull );
+ LogErr ( klogErr, rc, " " );
+ return rc;
+ }
+
+ if ( p -> directory_path [ 0 ] == 0 )
+ {
+ rc = RC ( rcApp, rcArgv, rcParsing, rcParam, rcNull );
+ LogErr ( klogErr, rc, " " );
+ return rc;
+ }
+ }
+
+ return rc;
+}
+
diff --git a/tools/kar/kar-args.h b/tools/kar/kar-args.h
new file mode 100644
index 0000000..a8ff986
--- /dev/null
+++ b/tools/kar/kar-args.h
@@ -0,0 +1,98 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _h_kar_args_
+#define _h_kar_args_
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+
+
+#define OPTION_CREATE "create"
+#define OPTION_EXTRACT "extract"
+#define OPTION_TEST "test"
+#define OPTION_FORCE "force"
+#define OPTION_LONGLIST "long-list"
+#define OPTION_DIRECTORY "directory"
+#define OPTION_STDOUT "stdout"
+#define OPTION_MD5 "md5"
+/*TBD - add alignment option */
+
+
+#define ALIAS_CREATE "c"
+#define ALIAS_EXTRACT "x"
+#define ALIAS_TEST "t"
+#define ALIAS_FORCE "f"
+#define ALIAS_LONGLIST "l"
+#define ALIAS_DIRECTORY "d"
+#define ALIAS_STDOUT "Z"
+
+
+struct Args;
+
+typedef struct Params Params;
+struct Params
+{
+ /* standalone files & directories that can be added to archive under create mode */
+ const char ** members;
+
+ /* path to archive being built or accessed */
+ const char *archive_path;
+
+ /* path to directory either for creating or extracting an archive */
+ const char *directory_path;
+
+ /* the number of members given for creating an archive */
+ uint32_t mem_count;
+
+ /* the number of times the directory option was specified */
+ uint32_t dir_count;
+
+ /* temporary information used for param validation and mode determination */
+ uint32_t c_count;
+ uint32_t x_count;
+ uint32_t t_count;
+
+ /* modifier to test mode for creating a long listing */
+ bool long_list;
+
+ /* modifier to create mode for overwriting an existing archive,
+ or to extract mode to overwrite an existing output directory */
+ bool force;
+
+ /* output to stdout */
+ bool stdout;
+
+ /*modifier to create mode to create an md5sum compatible auxilary file*/
+ bool md5sum;
+};
+
+
+rc_t parse_params ( Params *p, struct Args *args, int argc, char * argv [] );
+rc_t validate_params ( Params *p );
+
+#endif /*_h_kar_args_*/
diff --git a/tools/kar/kar.c b/tools/kar/kar.c
new file mode 100644
index 0000000..46c9990
--- /dev/null
+++ b/tools/kar/kar.c
@@ -0,0 +1,2063 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "kar-args.h"
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/vector.h>
+#include <klib/container.h>
+#include <klib/sort.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/time.h>
+#include <sysalloc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/toc.h>
+#include <kfs/sra.h>
+#include <kfs/md5.h>
+
+#include <kapp/main.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <endian.h>
+#include <byteswap.h>
+
+
+/*******************************************************************************
+ * Globals + Forwards + Declarations + Definitions
+ */
+
+static uint64_t num_files;
+static uint64_t max_size = 0;
+static uint64_t max_offset = 0;
+static uint32_t max_size_fw;
+static uint32_t max_offset_fw;
+
+
+typedef struct KARDir KARDir;
+
+typedef struct KAREntry KAREntry;
+struct KAREntry
+{
+ BSTNode dad;
+
+ KTime_t mod_time;
+
+ const char *name;
+ KARDir *parentDir;
+
+ uint32_t access_mode;
+
+ uint8_t type;
+};
+
+struct KARDir
+{
+ KAREntry dad;
+
+ BSTree contents;
+};
+
+typedef struct KARFile KARFile;
+struct KARFile
+{
+ KAREntry dad;
+
+ uint64_t byte_size;
+ uint64_t byte_offset;
+};
+
+typedef KARFile **KARFilePtrArray;
+
+typedef struct KARArchiveFile KARArchiveFile;
+struct KARArchiveFile
+{
+ uint64_t starting_pos;
+ uint64_t pos;
+ KFile * archive;
+};
+
+typedef struct KARAlias KARAlias;
+struct KARAlias
+{
+ KAREntry dad;
+
+ KAREntry * resolved;
+ const char *link;
+};
+
+
+enum
+{
+ ktocentrytype_unknown = -1,
+ ktocentrytype_notfound,
+ ktocentrytype_dir,
+ ktocentrytype_file,
+ ktocentrytype_chunked,
+ ktocentrytype_softlink,
+ ktocentrytype_hardlink,
+ ktocentrytype_emptyfile,
+ ktocentrytype_zombiefile
+};
+
+enum PrintMode
+{
+ pm_normal,
+ pm_longlist
+};
+
+typedef struct KARPrintMode KARPrintMode;
+struct KARPrintMode
+{
+ enum PrintMode pm;
+ uint32_t indent;
+};
+
+
+static rc_t kar_scan_directory ( const KDirectory *dir, BSTree *tree, const char *path );
+static size_t kar_entry_full_path ( const KAREntry * entry, const char * root_dir, char * buffer, size_t bsize );
+
+
+/*******************************************************************************
+ * Reporting functions
+ */
+
+static void kar_print ( BSTNode *node, void *data );
+
+static
+void printEntry ( const KAREntry *entry, KARPrintMode *kpm )
+{
+ char buffer [ 4096 ];
+ size_t bsize = sizeof buffer;
+
+ size_t num_writ = kar_entry_full_path ( entry, NULL, buffer, bsize );
+ if ( num_writ >= bsize )
+ {
+ rc_t rc = RC (rcExe, rcPath, rcWriting, rcBuffer, rcInsufficient);
+ pLogErr ( klogErr, rc, "Failed to write path for entry '$(name)'",
+ "name=%s", entry -> name );
+ exit ( 3 );
+ }
+
+ switch ( kpm -> pm )
+ {
+ case pm_normal:
+ KOutMsg ( "%s", buffer );
+ break;
+ case pm_longlist:
+ {
+ KTime tm;
+ KTimeLocal ( &tm, entry -> mod_time );
+
+ KOutMsg ( "%04u-%02u-%02u %02u:%02u:%02u %s",
+
+ tm . year, tm . month + 1, tm . day + 1,
+ tm . hour, tm . minute, tm . second, buffer);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+static
+uint32_t get_field_width ( uint64_t num )
+{
+ uint64_t count;
+ if ( num == 0 )
+ return 3;
+
+ for ( count = 0; num != 0; ++ count )
+ num /= 10;
+
+ return count;
+}
+
+static
+void printFile ( const KARFile *file, KARPrintMode *kpm )
+{
+ if ( kpm -> pm == pm_longlist )
+ {
+ if ( file -> byte_size == 0 )
+ KOutMsg ( "%*c ", max_size_fw, '-' );
+ else
+ KOutMsg ( "%*lu ", max_size_fw, file -> byte_size );
+
+ KOutMsg ( "%*lu ", max_offset_fw, file -> byte_offset );
+ }
+
+ printEntry ( ( KAREntry * ) file, kpm );
+ KOutMsg ( "\n" );
+}
+
+static
+void printDir ( const KARDir *dir, KARPrintMode *kpm )
+{
+ if ( kpm -> pm == pm_longlist )
+ {
+ KOutMsg ( "%*c ", max_size_fw, '-' );
+ KOutMsg ( "%*c ", max_offset_fw, '-' );
+ }
+
+ printEntry ( & dir -> dad, kpm );
+ KOutMsg ( "\n" );
+ BSTreeForEach ( &dir -> contents, false, kar_print, kpm );
+}
+
+static
+void printAlias ( const KARAlias *alias, KARPrintMode *kpm, uint8_t type )
+{
+ if ( kpm -> pm == pm_longlist )
+ {
+ KOutMsg ( "% *u ", max_size_fw, string_size ( alias -> link ) );
+ KOutMsg ( "% *c ", max_offset_fw, '-' );
+ printEntry ( ( KAREntry * ) alias, kpm );
+ KOutMsg ( " -> %s", alias -> link );
+ }
+ else
+ printEntry ( ( KAREntry * ) alias, kpm );
+
+ KOutMsg ( "\n" );
+}
+
+/*
+static
+void printFile_tree ( const KARFile * file, uint32_t *indent )
+{
+ KOutMsg ( "%*s%s [ %lu, %lu ]\n", *indent, "", file -> dad . name, file -> byte_offset, file -> byte_size );
+}
+
+static
+void printDir_tree ( const KARDir *dir, uint32_t *indent )
+{
+ KOutMsg ( "%*s%s\n", *indent, "", dir -> dad . name );
+ *indent += 4;
+ BSTreeForEach ( &dir -> contents, false, kar_print, indent );
+ *indent -= 4;
+}
+*/
+static
+void print_mode ( uint32_t grp )
+{
+ char r = ( grp & 4 ) ? 'r' : '-';
+ char w = ( grp & 2 ) ? 'w' : '-';
+ char x = ( grp & 1 ) ? 'x' : '-';
+
+ KOutMsg ( "%c%c%c", r, w, x );
+}
+
+static
+void kar_print ( BSTNode *node, void *data )
+{
+ const KAREntry *entry = ( KAREntry * ) node;
+
+
+ KARPrintMode *kpm = ( KARPrintMode * ) data;
+
+ switch ( kpm -> pm )
+ {
+ case pm_normal:
+ {
+ switch ( entry -> type )
+ {
+ case kptFile:
+ printFile ( ( KARFile * ) entry, kpm );
+ break;
+ case kptDir:
+ printDir ( ( KARDir * ) entry, kpm );
+ break;
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ printAlias ( ( KARAlias * ) entry, kpm, entry -> type );
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case pm_longlist:
+ {
+ switch ( entry -> type )
+ {
+ case kptFile:
+ KOutMsg ( "-" );
+ print_mode ( ( entry -> access_mode >> 6 ) & 7 );
+ print_mode ( ( entry -> access_mode >> 3 ) & 7 );
+ print_mode ( entry -> access_mode & 7 );
+ KOutMsg ( " " );
+ printFile ( ( KARFile * ) entry, kpm );
+ break;
+ case kptDir:
+ KOutMsg ( "d" );
+ print_mode ( ( entry -> access_mode >> 6 ) & 7 );
+ print_mode ( ( entry -> access_mode >> 3 ) & 7 );
+ print_mode ( entry -> access_mode & 7 );
+ KOutMsg ( " " );
+ printDir ( ( KARDir * ) entry, kpm );
+ break;
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ KOutMsg ( "l" );
+ print_mode ( ( entry -> access_mode >> 6 ) & 7 );
+ print_mode ( ( entry -> access_mode >> 3 ) & 7 );
+ print_mode ( entry -> access_mode & 7 );
+ KOutMsg ( " " );
+ printAlias ( ( KARAlias * ) entry, kpm, entry -> type );
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+}
+
+
+
+/*******************************************************************************
+ * Create
+ */
+
+
+/********** KAREntry */
+
+static
+void kar_entry_whack ( BSTNode *node, void *data )
+{
+ KAREntry *entry = ( KAREntry * ) node;
+
+ /* do the cleanup */
+ switch ( entry -> type )
+ {
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ free ( ( void * ) ( ( KARAlias * ) entry ) -> link );
+ break;
+ }
+
+ free ( entry );
+}
+
+static
+rc_t kar_entry_create ( KAREntry ** rtn, size_t entry_size,
+ const KDirectory * dir, const char * name, uint32_t type )
+{
+ rc_t rc;
+
+ size_t name_len = strlen ( name ) + 1;
+ KAREntry * entry = calloc ( 1, entry_size + name_len );
+ if ( entry == NULL )
+ {
+ rc = RC (rcExe, rcNode, rcAllocating, rcMemory, rcExhausted);
+ pLogErr ( klogErr, rc, "Failed to allocated memory for entry '$(name)'",
+ "name=%s", name );
+ }
+ else
+ {
+ /* location for string copy */
+ char * dst = & ( ( char * ) entry ) [ entry_size ];
+
+ /* sanity check */
+ assert ( entry_size >= sizeof * entry );
+
+ /* populate the name by copying to the end of structure */
+ memmove ( dst, name, name_len );
+ entry -> name = dst;
+
+ entry -> type = type;
+
+ rc = KDirectoryAccess ( dir, & entry -> access_mode, "%s", entry -> name );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to get access mode for entry '$(name)'",
+ "name=%s", entry -> name );
+ }
+ else
+ {
+ rc = KDirectoryDate ( dir, &entry -> mod_time, "%s", entry -> name );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to get modification for entry '$(name)'",
+ "name=%s", entry -> name );
+ }
+ else
+ {
+ * rtn = entry;
+ return 0;
+ }
+ }
+
+ free ( entry );
+ }
+
+ * rtn = NULL;
+ return rc;
+}
+
+static
+rc_t kar_entry_inflate ( KAREntry **rtn, size_t entry_size, const char *name, size_t name_len,
+ uint64_t mod_time, uint32_t access_mode, uint8_t type )
+{
+ rc_t rc;
+ KAREntry * entry;
+
+ STATUS ( STAT_QA, "inflating entry for '%s' with name_len: %u + entry_size: %u",
+ name, ( uint32_t ) name_len, ( uint32_t ) entry_size );
+ entry = calloc ( 1, entry_size + name_len + 1 );
+ if ( entry == NULL )
+ {
+ rc = RC (rcExe, rcNode, rcAllocating, rcMemory, rcExhausted);
+ pLogErr ( klogErr, rc, "Failed to allocated memory for entry '$(name)'",
+ "name=%s", name );
+ }
+ else
+ {
+ /* location for string copy */
+ char * dst = & ( ( char * ) entry ) [ entry_size ];
+
+ /* sanity check */
+ assert ( entry_size >= sizeof * entry );
+
+ /* populate the name by copying to the end of structure */
+ memmove ( dst, name, name_len + 1 );
+
+ entry -> name = dst;
+ entry -> mod_time = mod_time;
+ entry -> access_mode = access_mode;
+ entry -> type = type;
+
+ *rtn = entry;
+ STATUS ( STAT_QA, "finished inflating entry for '%s'", entry -> name );
+ return 0;
+ }
+
+ free ( entry );
+
+ * rtn = NULL;
+ return rc;
+}
+
+static
+void kar_entry_link_parent_dir ( BSTNode *node, void *data )
+{
+ KAREntry *entry = ( KAREntry * ) node ;
+
+ entry -> parentDir = ( KARDir * ) data;
+
+ if ( entry -> type == kptDir )
+ {
+ KARDir *dir = ( KARDir * ) entry;
+ BSTreeForEach ( &dir -> contents, false, kar_entry_link_parent_dir, dir );
+ }
+}
+
+static
+void kar_entry_insert_file ( BSTNode *node, void *data )
+{
+ KAREntry *entry = ( KAREntry * ) node ;
+
+ switch ( entry -> type )
+ {
+ case kptFile:
+ {
+ KARFile ** file_array = data;
+ file_array [ num_files ++ ] = ( KARFile * ) entry;
+ break;
+ }
+ case kptDir:
+ {
+ KARDir *dir = ( KARDir * ) entry;
+ BSTreeForEach ( &dir -> contents, false, kar_entry_insert_file, data );
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+static
+int64_t CC kar_entry_cmp ( const BSTNode *item, const BSTNode *n )
+{
+ /* TODO - ensure that this is consistent with the ordering in kfs/toc */
+ const KAREntry *a = ( const KAREntry * ) item;
+ const KAREntry *b = ( const KAREntry * ) n;
+
+ return strcmp ( a -> name, b -> name );
+}
+
+static
+int64_t CC kar_entry_sort_size ( const void *a, const void *b, void *ignore )
+{
+ /* Only KARFiles should make it here */
+ const KARFile *f1 = * ( const KARFile ** ) a;
+ const KARFile *f2 = * ( const KARFile ** ) b;
+
+ return ( int64_t ) f1 -> byte_size - ( int64_t ) f2 -> byte_size;
+}
+
+/********** BSTree population */
+
+static
+rc_t kar_add_file ( const KDirectory *dir, const char *name, void *data )
+{
+ KARFile *file;
+ rc_t rc = kar_entry_create ( ( KAREntry ** ) & file, sizeof * file, dir, name, kptFile );
+ if ( rc == 0 )
+ {
+ rc = KDirectoryFileSize ( dir, &file -> byte_size, "%s", file -> dad . name );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to get file size for file '$(name)'",
+ "name=%s", file -> dad . name );
+ }
+ else
+ {
+ rc = BSTreeInsert ( ( BSTree * ) data, &file -> dad . dad, kar_entry_cmp );
+ if ( rc == 0 )
+ {
+ ++ num_files;
+ return 0;
+ }
+
+
+ pLogErr ( klogErr, rc, "Failed to insert file '$(name)' into tree",
+ "name=%s", file -> dad . name );
+
+ }
+
+ free ( file );
+ }
+
+ return rc;
+}
+
+
+static
+rc_t kar_add_dir ( const KDirectory *parent_dir, const char *name, void *data )
+{
+ KARDir * dir;
+ rc_t rc = kar_entry_create ( ( KAREntry ** ) & dir, sizeof * dir, parent_dir, name, kptDir );
+ if ( rc == 0 )
+ {
+ /* BSTree is already initialized, but it doesn't hurt to be thorough */
+ BSTreeInit ( & dir -> contents );
+
+ rc = BSTreeInsert ( ( BSTree* ) data, &dir -> dad . dad, kar_entry_cmp );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to insert directory '$(name)' into tree",
+ "name=%s", dir -> dad . name );
+ }
+ else
+ {
+ /* the name passed to us was that of a child directory.
+ we need to recursively process it - so open up the child directory. */
+ const KDirectory * child_dir;
+ rc = KDirectoryOpenDirRead ( parent_dir, & child_dir, false, "%s", name );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to open directory '$(name)' for scanning",
+ "name=%s", dir -> dad . name );
+ }
+ else
+ {
+ /* recursively scan this directory to populate tree */
+ rc = kar_scan_directory ( child_dir, & dir -> contents, "." );
+
+ KDirectoryRelease ( child_dir );
+
+ if ( rc == 0 )
+ return 0;
+
+ pLogErr ( klogErr, rc, "Failed to scan directory '$(name)'",
+ "name=%s", dir -> dad . name );
+ }
+ }
+
+ free ( dir );
+ }
+
+ return rc;
+}
+
+
+static
+rc_t kar_add_alias ( const KDirectory *dir, const char *name, void *data, uint32_t type )
+{
+ KARAlias *alias;
+ rc_t rc = kar_entry_create ( ( KAREntry ** ) & alias, sizeof * alias, dir, name, type );
+ if ( rc == 0 )
+ {
+ char resolved [ 4096 ];
+ rc = KDirectoryResolveAlias ( dir, false, resolved, sizeof resolved, "%s", name );
+ if ( rc == 0 )
+ {
+ size_t rsize = string_size ( resolved );
+ char * copy = malloc ( rsize + 1 );
+ if ( copy == NULL )
+ {
+ rc = RC (rcExe, rcNode, rcAllocating, rcMemory, rcExhausted);
+ pLogErr ( klogErr, rc, "Failed to allocated memory for entry '$(name)'",
+ "name=%s", name );
+ }
+ else
+ {
+ string_copy ( copy, rsize + 1, resolved, rsize );
+ alias -> link = copy;
+
+ rc = BSTreeInsert ( ( BSTree * ) data, &alias -> dad . dad, kar_entry_cmp );
+ if ( rc == 0 )
+ return 0;
+
+
+ pLogErr ( klogErr, rc, "Failed to insert file '$(name)' into tree",
+ "name=%s", alias -> dad . name );
+
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t CC kar_populate_tree ( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ /* We have a KDirectory* to the directory being visited, plus an entry description,
+ giving the type and name of the entry. In addition, we have the data pointer
+ we sent in, which is either a BSTree* or a custom structure holding more data. */
+
+ switch ( type )
+ {
+ case kptFile:
+ return kar_add_file ( dir, name, data );
+
+ case kptDir:
+ return kar_add_dir ( dir, name, data );
+
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ return kar_add_alias ( dir, name, data, type );
+
+ default:
+ LogMsg ( klogWarn, "Unsupported file type" );
+ }
+
+ return 0;
+}
+
+/********** File searching */
+
+static
+rc_t kar_scan_directory ( const KDirectory *dir, BSTree *tree, const char *path )
+{
+ /* In this case, the directory itself is NOT added to the tree,
+ but only its contents. Use a shallow (non-recursive) "Visit()"
+ to list contents and process each in turn. */
+
+ rc_t rc = KDirectoryVisit ( dir, false, kar_populate_tree, tree, "%s", path );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to scan directory $(directory)",
+ "directory=%s", path );
+ }
+
+ return rc;
+}
+
+static
+rc_t kar_scan_path ( const KDirectory *dir, BSTree *tree, const char *path )
+{
+ /* At this point, we have a directory and a path.
+ if the path is a simple name, with no directory components before the leaf,
+ then the leaf can be added as above. But for all leading directories in the
+ path, we have to call ourselves recursively to discover the directory if it
+ Exists, or create it if it doesn't, in order to build our way down to the leaf. */
+ return -1;
+}
+
+/********** md5 */
+
+static
+rc_t kar_md5 ( KDirectory *wd, KFile **archive, const char *path, KCreateMode mode )
+{
+ rc_t rc = 0;
+ KFile *md5_f;
+
+ /* create the *.md5 file to hold md5sum-compatible checksum */
+ rc = KDirectoryCreateFile ( wd, &md5_f, false, 0664, mode, "%s.md5", path );
+ if ( rc )
+ PLOGERR (klogFatal, (klogFatal, rc, "unable to create md5 file [$(A).md5]", PLOG_S(A), path));
+ else
+ {
+ KMD5SumFmt *fmt;
+
+ /* create md5 formatter to write to md5_f */
+ rc = KMD5SumFmtMakeUpdate ( &fmt, md5_f );
+ if ( rc )
+ LOGERR (klogErr, rc, "failed to make KMD5SumFmt");
+ else
+ {
+ KMD5File *kmd5_f;
+
+ size_t size = string_size ( path );
+ const char *fname = string_rchr ( path, size, '/' );
+ if ( fname ++ == NULL )
+ fname = path;
+
+ /* KMD5SumFmtMakeUpdate() took over ownership of "md5_f" */
+ md5_f = NULL;
+
+ /* create a file that knows how to calculate md5 as data
+ are written-through to archive, and then write digest
+ result to fmt, using "fname" as description. */
+ rc = KMD5FileMakeWrite ( &kmd5_f, * archive, fmt, fname );
+ KMD5SumFmtRelease ( fmt );
+ if ( rc )
+ LOGERR (klogErr, rc, "failed to make KMD5File");
+ else
+ {
+ /* success */
+ *archive = KMD5FileToKFile ( kmd5_f );
+ return 0;
+ }
+ }
+
+ /* error cleanup */
+ KFileRelease ( md5_f );
+ }
+
+ return rc;
+}
+
+/********** write to toc and archive */
+
+static
+uint64_t align_offset ( uint64_t offset, uint64_t alignment )
+{
+ uint64_t mask = alignment - 1;
+ return ( offset + mask ) & ~ mask;
+}
+
+static
+void kar_write_header_v1 ( KARArchiveFile * af, uint64_t toc_size )
+{
+ rc_t rc;
+ size_t num_writ, hdr_size;
+
+ KSraHeader hdr;
+ memmove ( hdr.ncbi, "NCBI", sizeof hdr.ncbi );
+ memmove ( hdr.sra, ".sra", sizeof hdr.sra );
+
+ hdr.byte_order = eSraByteOrderTag;
+
+ hdr.version = 1;
+
+ /* calculate header size based upon version */
+ hdr_size = sizeof hdr - sizeof hdr . u + sizeof hdr . u . v1;
+
+ /* TBD - don't use hard-coded alignment - get it from cmdline */
+ hdr.u.v1.file_offset = align_offset ( hdr_size + toc_size, 4 );
+ af -> starting_pos = hdr . u . v1 . file_offset;
+
+ rc = KFileWriteAll ( af -> archive, af -> pos, &hdr, hdr_size, &num_writ );
+ if ( rc != 0 || num_writ != hdr_size )
+ {
+ if ( rc == 0 )
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+
+ LogErr ( klogInt, rc, "Failed to write header" );
+ exit(5);
+ }
+
+ af -> pos += num_writ;
+}
+
+
+static
+rc_t CC kar_write_archive ( void *param, const void *buffer,
+ size_t bytes, size_t *num_writ )
+{
+ rc_t rc = 0;
+
+ KARArchiveFile * self = param;
+
+ rc = KFileWriteAll ( self -> archive, self -> pos, buffer, bytes, num_writ );
+ self -> pos += * num_writ;
+
+ return rc;
+}
+
+static
+rc_t CC kar_persist ( void *param, const void *node,
+ size_t *num_writ, PTWriteFunc write, void *write_param );
+
+static
+rc_t kar_persist_karentry ( const KAREntry * entry, int type_code,
+ size_t * num_writ, PTWriteFunc write, void *write_param )
+{
+ rc_t rc = 0;
+ size_t total_written, total_expected;
+
+ uint16_t legacy_name_len;
+ uint8_t legacy_type_code = ( uint8_t ) type_code;
+
+ /* actual length of the string in bytes */
+ size_t name_len = strlen ( entry -> name );
+
+ STATUS ( STAT_QA, "%s: '%.*s'"
+ , __func__
+ , ( uint32_t ) name_len, entry -> name
+ );
+
+ if ( name_len > UINT16_MAX )
+ return RC (rcExe, rcNode, rcWriting, rcPath, rcExcessive);
+
+ legacy_name_len = ( uint16_t ) name_len;
+
+ /* determine size */
+ total_expected
+ = sizeof legacy_name_len
+ + name_len
+ + sizeof entry -> mod_time
+ + sizeof entry -> access_mode
+ + sizeof legacy_type_code
+ ;
+
+ /* if just determining toc size - return */
+ if ( write == NULL )
+ {
+ * num_writ = total_expected;
+
+ return 0;
+ }
+
+ /* check */
+ total_written = 0;
+ rc = ( * write ) ( write_param, &legacy_name_len, sizeof legacy_name_len, num_writ );
+ if ( rc == 0 )
+ {
+ total_written = * num_writ;
+ rc = ( * write ) ( write_param, entry -> name, name_len, num_writ );
+ if ( rc == 0 )
+ {
+ total_written += * num_writ;
+ rc = ( * write ) ( write_param, &entry -> mod_time, sizeof entry -> mod_time, num_writ );
+ if ( rc == 0 )
+ {
+ total_written += * num_writ;
+ rc = ( * write ) ( write_param, &entry -> access_mode, sizeof entry -> access_mode, num_writ );
+ if ( rc == 0 )
+ {
+ total_written += * num_writ;
+ rc = ( * write ) ( write_param, &legacy_type_code, sizeof legacy_type_code, num_writ );
+ if ( rc == 0 )
+ total_written += * num_writ;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 && total_written != total_expected )
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncorrect );
+
+ * num_writ = total_written;
+
+ return rc;
+}
+
+static
+rc_t kar_persist_karfile ( const KARFile * entry, size_t *num_writ, PTWriteFunc write, void *write_param )
+{
+ size_t total_expected, total_written;
+ rc_t rc = kar_persist_karentry ( & entry -> dad,
+ entry -> byte_size == 0 ? ktocentrytype_emptyfile : ktocentrytype_file,
+ num_writ, write, write_param );
+ if ( rc == 0 )
+ {
+ total_written = * num_writ;
+
+ /* empty files are given a special type in the toc */
+ if ( entry -> byte_size == 0 )
+ total_expected = total_written;
+ else
+ {
+ /* determine size */
+ total_expected
+ = total_written /* from KAREntry */
+ + sizeof entry -> byte_offset /* specific to KARFile */
+ + sizeof entry -> byte_size
+ ;
+
+ /* if determining size of toc - return */
+ if ( write == NULL )
+ {
+ * num_writ = total_expected;
+ return 0;
+ }
+
+ /* actually write the toc file entry */
+ rc = ( * write ) ( write_param, &entry -> byte_offset, sizeof entry -> byte_offset, num_writ );
+ if ( rc == 0 )
+ {
+ total_written += * num_writ;
+ rc = ( * write ) ( write_param, &entry -> byte_size, sizeof entry -> byte_size, num_writ );
+ if ( rc == 0 )
+ total_written += *num_writ;
+ }
+ }
+ }
+
+ if ( rc == 0 && total_written != total_expected )
+ {
+ STATUS ( STAT_QA, "total_written ( %zu ) != total_expected ( %zu )", total_written, total_expected );
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncorrect );
+ }
+
+ *num_writ = total_written;
+
+ return rc;
+}
+
+
+static
+rc_t kar_persist_kardir ( const KARDir * entry, size_t *num_writ, PTWriteFunc write, void *write_param )
+{
+ rc_t rc = kar_persist_karentry ( & entry -> dad, ktocentrytype_dir, num_writ, write, write_param );
+ if ( rc == 0 )
+ {
+ size_t entry_writ = * num_writ;
+ rc = BSTreePersist ( &entry -> contents, num_writ, write, write_param, kar_persist, NULL );
+ if ( rc == 0 )
+ * num_writ += entry_writ;
+ }
+
+ return rc;
+}
+
+static
+rc_t kar_persist_karalias ( const KARAlias *entry, size_t *num_writ, PTWriteFunc write, void *write_param )
+{
+ size_t total_expected, total_written;
+ rc_t rc = kar_persist_karentry ( & entry -> dad, ktocentrytype_softlink, num_writ, write, write_param );
+ if ( rc == 0 )
+ {
+ size_t link_size = string_size ( entry -> link );
+ uint16_t legacy_link_len = ( uint16_t ) link_size;
+
+ if ( link_size > UINT16_MAX )
+ return RC (rcExe, rcNode, rcWriting, rcPath, rcExcessive);
+
+ total_written = * num_writ;
+
+ /* determine size */
+ total_expected
+ = total_written /* from KAREntry */
+ + sizeof legacy_link_len
+ + link_size /* specific to KARAlias */
+ ;
+
+ /* if determining size of toc - return */
+ if ( write == NULL )
+ {
+ * num_writ = total_expected;
+ return 0;
+ }
+
+ /* actually write the toc file entry */
+ rc = ( * write ) ( write_param, &legacy_link_len, sizeof legacy_link_len, num_writ );
+ if ( rc == 0 )
+ {
+ total_written += * num_writ;
+
+ rc = ( * write ) ( write_param, entry -> link, link_size, num_writ );
+ if ( rc == 0 )
+ total_written += * num_writ;
+ }
+ }
+
+ if ( rc == 0 && total_written != total_expected )
+ {
+ STATUS ( STAT_QA, "total_written ( %zu ) != total_expected ( %zu )", total_written, total_expected );
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncorrect );
+ }
+
+ *num_writ = total_written;
+
+ return rc;
+}
+
+static
+rc_t CC kar_persist ( void *param, const void *node,
+ size_t *num_writ, PTWriteFunc write, void *write_param )
+{
+ rc_t rc = Quitting ();
+ const KAREntry * entry = ( const KAREntry * ) node;
+
+ if ( rc != 0 )
+ return rc;
+
+ STATUS ( STAT_QA, "%s called", __func__ );
+
+ switch ( entry -> type )
+ {
+ case kptFile:
+ {
+ STATUS ( STAT_QA, "file entry" );
+ rc = kar_persist_karfile ( ( const KARFile* ) entry, num_writ, write, write_param );
+ return rc;
+ }
+ case kptDir:
+ {
+ STATUS ( STAT_QA, "directory entry" );
+ rc = kar_persist_kardir ( ( const KARDir* ) entry, num_writ, write, write_param );
+ break;
+ }
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ STATUS ( STAT_USR, "alias entry" );
+ rc = kar_persist_karalias ( ( const KARAlias * ) entry, num_writ, write, write_param );
+ break;
+ default:
+ STATUS ( 0, "unknown entry type: id %u", entry -> type );
+ break;
+ }
+
+ return rc;
+}
+
+static
+uint64_t kar_eval_toc_size ( const BSTree * tree )
+{
+ rc_t rc;
+ size_t toc_size = 0;
+ STATUS ( STAT_QA, "evaluating toc size" );
+ rc = BSTreePersist ( tree, & toc_size, NULL, NULL, kar_persist, NULL );
+ if ( rc != 0 )
+ {
+ LogErr ( klogInt, rc, "Failed to determine TOC size" );
+ exit(5);
+ }
+ STATUS ( STAT_QA, "toc size reported as %lu bytes", toc_size );
+
+ return toc_size;
+}
+
+static
+void kar_write_toc ( KARArchiveFile * af, const BSTree * tree )
+{
+ rc_t rc;
+ size_t toc_size = 0;
+
+ STATUS ( STAT_QA, "writing toc" );
+ rc = BSTreePersist ( tree, & toc_size, kar_write_archive, af, kar_persist, NULL );
+ if ( rc != 0 )
+ {
+ LogErr ( klogInt, rc, "Failed to determine TOC size" );
+ exit(5);
+ }
+
+ STATUS ( STAT_QA, "toc written" );
+}
+
+
+static
+rc_t kar_prepare_toc ( const BSTree *tree, KARFilePtrArray *file_array_ptr )
+{
+ rc_t rc = 0;
+
+ /* create an array of KARFile* that will be sorted by size */
+ KARFilePtrArray file_array = calloc ( num_files, sizeof * file_array );
+ if ( file_array == NULL )
+ rc = RC ( rcExe, rcBuffer, rcAllocating, rcMemory, rcExhausted );
+ else
+ {
+ uint64_t i, offset;
+
+ /* pass back output param */
+ * file_array_ptr = file_array;
+
+ num_files = 0; /* global */
+
+ /* now fill the array with KARFile* by walking the tree again */
+ BSTreeForEach ( tree, false, kar_entry_insert_file, file_array );
+
+ /* now, sort the array based upon size - use <klib/sort.h> */
+ ksort ( file_array, num_files, sizeof * file_array, kar_entry_sort_size, NULL );
+
+ /* now you can assign offsets to the files in the array */
+ for ( i = offset = 0; i < num_files; ++ i )
+ {
+ KARFile *f = file_array [ i ];
+ f -> byte_offset = offset;
+
+ offset += f -> byte_size;
+
+ /* perform aligning to boundary */
+ offset = align_offset ( offset, 4 );
+ }
+ }
+
+ return rc;
+}
+
+static
+size_t kar_entry_full_path ( const KAREntry * entry, const char * root_dir, char * buffer, size_t bsize )
+{
+ size_t offset = 0;
+ if ( entry -> parentDir != NULL )
+ {
+ offset = kar_entry_full_path ( & entry -> parentDir -> dad, root_dir, buffer, bsize );
+ if ( offset < bsize )
+ buffer [ offset ++ ] = '/';
+ }
+ else if ( root_dir != NULL && root_dir [ 0 ] != 0 )
+ {
+ offset = string_copy_measure ( buffer, bsize, root_dir );
+ if ( buffer [ offset - 1 ] != '/' && offset < bsize )
+ buffer [ offset ++ ] = '/';
+ }
+
+ return string_copy_measure ( & buffer [ offset ], bsize - offset, entry -> name ) + offset;
+}
+
+static
+void kar_write_file ( KARArchiveFile *af, const KDirectory *wd, const KARFile *file, const char * root_dir )
+{
+ rc_t rc;
+ char *buffer;
+ size_t num_read, align_size;
+ uint64_t pos = 0;
+ char align_buffer [ 4 ] = "0000";
+ size_t bsize = 128 * 1024 * 1024;
+
+ const KFile *f;
+
+ char filename [ 4096 ];
+ size_t path_size;
+
+ if ( file -> byte_size == 0 )
+ return;
+
+ if ( bsize > file -> byte_size )
+ bsize = file -> byte_size;
+
+ STATUS ( STAT_QA, "writing file '%s'", file -> dad . name );
+
+ path_size = kar_entry_full_path ( & file -> dad, root_dir, filename, sizeof filename );
+ if ( path_size == sizeof filename )
+ {
+ /* path name was somehow too long */
+ rc = RC ( rcExe, rcFile, rcWriting, rcMemory, rcExhausted );
+ LogErr ( klogInt, rc, "File path was too long" );
+ exit (5);
+ }
+
+ STATUS ( STAT_QA, "opening: full path is '%s'", filename );
+ rc = KDirectoryOpenFileRead ( wd, &f, "%s", filename );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogInt, rc, "Failed to open file $(fname)", "fname=%s", file -> dad . name );
+ exit (6);
+ }
+
+ STATUS ( STAT_QA, "allocating buffer of %,zu bytes", bsize );
+ buffer = malloc ( bsize );
+ if ( buffer == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcMemory, rcExhausted );
+ pLogErr ( klogInt, rc, "Failed to open file $(fname)", "fname=%s", file -> dad . name );
+ exit ( 7 );
+ }
+
+ /* establish current position */
+ align_size = align_offset ( af -> pos, 4 ) - af -> pos;
+ if ( align_size != 0 )
+ rc = KFileWriteAll ( af -> archive, af -> pos, align_buffer, align_size, NULL );
+
+ af -> pos = af -> starting_pos + file -> byte_offset;
+
+ while ( rc == 0 && pos < file -> byte_size )
+ {
+ size_t num_writ, to_read = bsize;
+
+ if ( pos + to_read > file -> byte_size )
+ to_read = ( size_t ) ( file -> byte_size - pos );
+
+ STATUS ( STAT_QA, "about to read at offset %lu from input file '%s'", pos, filename );
+ rc = KFileReadAll ( f, pos, buffer, to_read, & num_read );
+ if ( rc != 0 || num_read == 0 )
+ break;
+
+ STATUS ( STAT_QA, "about to write %zu bytes to archive", num_read );
+ rc = KFileWriteAll ( af -> archive, af -> pos, buffer, num_read, & num_writ );
+ if ( rc != 0 || num_writ != num_read )
+ {
+ /* error */
+ break;
+ }
+
+ af -> pos += num_writ;
+ pos += num_read;
+ }
+
+ STATUS ( STAT_PRG, "freeing memory" );
+ free ( buffer );
+
+ STATUS ( STAT_QA, "closing '%s'", filename );
+ KFileRelease ( f );
+}
+
+static
+rc_t kar_make ( const KDirectory * wd, KFile *archive, const BSTree *tree, const char * root_dir )
+{
+ rc_t rc = 0;
+
+ KARFilePtrArray file_array;
+
+ rc = kar_prepare_toc ( tree, &file_array );
+ if ( rc == 0 )
+ {
+ uint64_t i, toc_size;
+ KARArchiveFile af;
+ /* evaluate toc size */
+ toc_size = kar_eval_toc_size ( tree );
+
+ af . starting_pos = 0;
+ af . pos = 0;
+ af . archive = archive;
+
+ /*write header */
+ kar_write_header_v1 ( & af, toc_size );
+
+ /* write toc */
+ kar_write_toc ( & af, tree );
+
+ /* write each of the files in order */
+ STATUS ( STAT_QA, "about to write %u files", num_files );
+ for ( i = 0; i < num_files; ++ i )
+ {
+ STATUS ( STAT_QA, "writing file %u: '%s'", i, file_array [ i ] -> dad . name );
+ kar_write_file ( & af, wd, file_array [ i ], root_dir );
+ }
+
+ free ( file_array );
+ }
+
+ return rc;
+}
+
+
+/********** main create execution */
+
+
+static
+rc_t kar_create ( const Params *p )
+{
+ rc_t rc;
+
+ KDirectory *wd;
+
+ rc = KDirectoryNativeDir ( &wd );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "Failed to create working directory" );
+ else
+ {
+ KFile *archive;
+ KCreateMode mode = ( p -> force ? kcmInit : kcmCreate ) | kcmParents;
+ rc = KDirectoryCreateFile ( wd, &archive, false, 0666, mode,
+ "%s", p -> archive_path );
+ if ( rc != 0 )
+ {
+ pLogErr ( klogErr, rc, "Failed to create archive $(archive)",
+ "archive=%s", p -> archive_path );
+ }
+ else
+ {
+ if ( p -> md5sum )
+ rc = kar_md5 ( wd, &archive, p -> archive_path, mode );
+
+ if ( rc == 0 )
+ {
+ BSTree tree;
+ BSTreeInit ( & tree );
+
+ /* build contents by walking input directory if given,
+ and adding the individual members if given */
+ if ( p -> dir_count != 0 )
+ {
+ rc = kar_scan_directory ( wd, & tree, p -> directory_path );
+ if ( rc == 0 )
+ {
+ uint64_t i;
+ for ( i = 1; rc == 0 && i <= p -> mem_count; ++ i )
+ rc = kar_scan_path ( wd, & tree, p -> members [ i ] );
+
+ if ( rc == 0 )
+ {
+ BSTreeForEach ( &tree, false, kar_entry_link_parent_dir, NULL );
+
+ rc = kar_make ( wd, archive, &tree, p -> directory_path );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "Failed to build archive" );
+ }
+ }
+ }
+
+ BSTreeWhack ( & tree, kar_entry_whack, NULL );
+ }
+
+ KFileRelease ( archive );
+ }
+
+ KDirectoryRelease ( wd );
+ }
+
+ return rc;
+}
+
+/*******************************************************************************
+ * Test / Extract
+ */
+
+static
+uint64_t kar_verify_header ( const KFile *archive, KSraHeader *hdr )
+{
+ rc_t rc;
+
+ size_t num_read;
+
+
+ STSMSG (1, ("Verifying header\n"));
+
+ rc = KFileReadAll ( archive, 0, hdr, sizeof * hdr, &num_read );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed to access archive file");
+ exit ( 1 );
+ }
+
+ if ( num_read < sizeof * hdr - sizeof hdr -> u )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcOffset, rcInvalid );
+ LOGERR (klogErr, rc, "corrupt archive file - invalid header");
+ exit ( 1 );
+ }
+
+ /* verify "ncbi" and "sra" members */
+ if ( memcmp ( hdr -> ncbi, "NCBI", sizeof hdr -> ncbi ) != 0 ||
+ memcmp ( hdr -> sra, ".sra", sizeof hdr -> sra ) != 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcFormat, rcInvalid );
+ LOGERR (klogErr, rc, "invalid file format");
+ exit ( 1 );
+ }
+
+ /* test "byte_order".
+ this is allowed to be either eSraByteOrderTag or eSraByteOrderReverse.
+ anything else, is garbage */
+ if ( hdr -> byte_order != eSraByteOrderTag && hdr -> byte_order != eSraByteOrderReverse )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcByteOrder, rcInvalid );
+ LOGERR (klogErr, rc, "failed to access archive file - invalid byte order");
+ exit ( 1 );
+ }
+
+ if ( hdr -> byte_order == eSraByteOrderReverse )
+ {
+ hdr -> version = bswap_32 ( hdr -> version );
+ }
+
+ /* test version */
+ if ( hdr -> version == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcInterface, rcInvalid );
+ LOGERR (klogErr, rc, "invalid version");
+ exit ( 1 );
+ }
+
+ if ( hdr -> version > 1 )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcInterface, rcUnsupported );
+ LOGERR (klogErr, rc, "version not supported");
+ exit ( 1 );
+ }
+
+ /* test actual size against specific header version */
+ if ( num_read < sizeof * hdr - sizeof hdr -> u + sizeof hdr -> u . v1 )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcOffset, rcIncorrect );
+ LOGERR (klogErr, rc, "failed to read header");
+ exit ( 1 );
+ }
+
+ return num_read;
+}
+
+static
+size_t toc_data_copy ( void * dst, size_t dst_size, const uint8_t * toc_data, size_t toc_data_size, size_t offset )
+{
+ if ( offset + dst_size > toc_data_size )
+ {
+ rc_t rc = RC ( rcExe, rcFile, rcValidating, rcOffset, rcInvalid );
+ LOGERR (klogErr, rc, "toc offset out of bounds");
+ exit ( 3 );
+ }
+
+ memmove ( dst, & toc_data [ offset ], dst_size );
+ return offset + dst_size;
+}
+
+static
+int64_t kar_alias_find_link ( const void *item, const BSTNode *node )
+{
+ const char *link = ( const char * ) item;
+ KAREntry *entry = ( KAREntry * ) node;
+
+ uint64_t link_size = string_size ( link );
+ uint64_t name_size = string_size ( entry -> name );
+
+ return string_cmp ( item, link_size, entry -> name, name_size, link_size );
+}
+
+
+static
+void kar_alias_link_type ( BSTNode *node, void *data )
+{
+ /* archive fake root directory node */
+ const KARDir * root = ( const KARDir * ) data;
+
+ const KARDir *dir;
+ KAREntry *entry = ( KAREntry * ) node;
+
+ if ( entry -> type == kptDir )
+ {
+ /* need to go recursive on contents */
+ dir = ( const KARDir * ) entry;
+ BSTreeForEach ( &dir -> contents, false, kar_alias_link_type, ( void * ) root );
+ }
+ else if ( entry -> type == kptAlias )
+ {
+ const KAREntry *e;
+
+ size_t lsize;
+ const char *link, *end;
+ KARAlias *alias = ( KARAlias * ) entry;
+
+ link = alias -> link;
+ lsize = string_size ( link );
+ end = link + lsize;
+
+ /* if the link is an absolute path, it's outside of archive */
+ if ( link [ 0 ] == '/' )
+ return;
+
+ /* establish root for search */
+ dir = entry -> parentDir;
+ if ( dir == NULL )
+ dir = root;
+ e = & dir -> dad;
+
+ /* walk the path */
+ while ( e != NULL && link < end )
+ {
+ /* get the segment */
+ const char *seg = link;
+ char *sep = string_chr ( link, lsize, '/' );
+ if ( sep == NULL )
+ link = end;
+ else
+ {
+ *sep = 0;
+ link = sep + 1;
+ }
+
+ /* if the segment is empty, then we saw '/'.
+ if the segment is a single '.', then it means same thing */
+ if ( seg [ 0 ] == 0 ||
+ ( seg [ 0 ] == '.' && seg [ 1 ] == 0 ) )
+ {
+ /* do nothing */
+ }
+ else if ( seg [ 0 ] == '.' && seg [ 1 ] == '.' && seg [ 2 ] == 0 )
+ {
+ /* move up to parent */
+ if ( e == & root -> dad )
+ e = NULL;
+ else
+ {
+ e = & e -> parentDir -> dad;
+ if ( e == NULL )
+ e = & root -> dad;
+ }
+ }
+ else
+ {
+ rc_t rc;
+
+ while ( e != NULL && e -> type == kptAlias )
+ {
+ assert ( ( ( KARAlias * ) e ) -> resolved == NULL );
+ kar_alias_link_type ( ( BSTNode * ) & e -> dad, ( void * ) root );
+ e = ( ( KARAlias * ) e ) -> resolved;
+ }
+
+ if ( e -> type == ( kptDir | kptAlias ) )
+ {
+ assert ( ( ( KARAlias * ) e ) -> resolved != NULL );
+ e = ( ( KARAlias * ) e ) -> resolved;
+ }
+
+ /* move down */
+ if ( e -> type == kptDir )
+ {
+ dir = ( KARDir * ) e;
+ e = ( KAREntry * ) BSTreeFind ( & dir -> contents, seg, kar_alias_find_link );
+
+ while ( e != NULL && ( e -> type & kptAlias ) != 0 )
+ {
+ if ( ( ( const KARAlias * ) e ) -> resolved == NULL )
+ break;
+ e = ( ( const KARAlias * ) e ) -> resolved;
+ }
+ }
+ else
+ {
+ e = NULL;
+ rc = RC ( rcExe, rcPath, rcValidating, rcPath, rcInvalid );
+ LOGERR (klogErr, rc, "unable to locate symlink reference");
+ }
+ }
+
+ if ( sep != NULL )
+ *sep = '/';
+ }
+
+ if ( e != NULL )
+ {
+ assert ( link == end );
+ alias -> dad . type = e -> type | kptAlias;
+ alias -> resolved = ( KAREntry * ) e;
+ }
+ }
+}
+
+static
+void kar_inflate_toc ( PBSTNode *node, void *data )
+{
+ rc_t rc = 0;
+
+ size_t offset = 0;
+ const uint8_t * toc_data = node -> data . addr;
+ char buffer [ 4096 ], * name = buffer;
+ uint16_t name_len = 0;
+ uint64_t mod_time = 0;
+ uint32_t access_mode = 0;
+ uint8_t type_code = 0;
+
+ offset = toc_data_copy ( & name_len, sizeof name_len, toc_data, node -> data . size, offset );
+ if ( name_len >= sizeof buffer )
+ {
+ name = malloc ( name_len + 1 );
+ if ( name == NULL )
+ exit ( 10 );
+ }
+ offset = toc_data_copy ( name, name_len, toc_data, node -> data . size, offset );
+ name [ name_len ] = 0;
+ STATUS ( STAT_QA, "inflating '%s'", name );
+ offset = toc_data_copy ( & mod_time, sizeof mod_time, toc_data, node -> data . size, offset );
+ offset = toc_data_copy ( & access_mode, sizeof access_mode, toc_data, node -> data . size, offset );
+ offset = toc_data_copy ( & type_code, sizeof type_code, toc_data, node -> data . size, offset );
+
+ switch ( type_code )
+ {
+ case ktocentrytype_file:
+ {
+ KARFile *file;
+
+ rc = kar_entry_inflate ( ( KAREntry ** ) &file, sizeof *file, name, name_len,
+ mod_time, access_mode, kptFile );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed inflate KARFile");
+ exit ( 3 );
+ }
+
+ offset = toc_data_copy ( & file -> byte_offset, sizeof file -> byte_offset, toc_data, node -> data . size, offset );
+ toc_data_copy ( & file -> byte_size, sizeof file -> byte_size, toc_data, node -> data . size, offset );
+
+ if ( file -> byte_size > max_size )
+ max_size = file -> byte_size;
+ if ( file -> byte_offset > max_offset )
+ max_offset = file -> byte_offset;
+
+ STATUS ( STAT_QA, "inserting '%s'", file -> dad . name );
+ rc = BSTreeInsert ( ( BSTree * ) data, &file -> dad . dad, kar_entry_cmp );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed insert KARFile into tree");
+ exit ( 3 );
+ }
+
+ break;
+ }
+ case ktocentrytype_emptyfile:
+ {
+ KARFile *file;
+
+ rc = kar_entry_inflate ( ( KAREntry ** ) &file, sizeof *file, name, name_len,
+ mod_time, access_mode, kptFile );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed inflate KARFile");
+ exit ( 3 );
+ }
+
+ file -> byte_offset = 0;
+ file -> byte_size = 0;
+
+ STATUS ( STAT_QA, "inserting '%s'", file -> dad . name );
+ rc = BSTreeInsert ( ( BSTree * ) data, &file -> dad . dad, kar_entry_cmp );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed insert KARFile into tree");
+ exit ( 3 );
+ }
+
+ break;
+ }
+ case ktocentrytype_dir:
+ {
+ KARDir *dir;
+ PBSTree *ptree;
+
+ rc = kar_entry_inflate ( ( KAREntry ** ) &dir, sizeof *dir, name, name_len, mod_time, access_mode, kptDir );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed inflate KARDir");
+ exit ( 3 );
+ }
+
+ BSTreeInit ( &dir -> contents );
+
+
+ rc = PBSTreeMake ( & ptree, & toc_data [ offset ], node -> data . size - offset, false );
+ if ( rc != 0 )
+ LOGERR (klogErr, rc, "failed make PBSTree");
+ else
+ {
+ PBSTreeForEach ( ptree, false, kar_inflate_toc, &dir -> contents );
+
+ PBSTreeWhack ( ptree );
+ }
+
+ rc = BSTreeInsert ( ( BSTree * ) data, &dir -> dad . dad, kar_entry_cmp );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed insert KARDir into tree");
+ exit ( 3 );
+ }
+
+ break;
+ }
+ case ktocentrytype_softlink:
+ {
+ KARAlias *alias;
+
+ rc = kar_entry_inflate ( ( KAREntry ** ) &alias, sizeof *alias, name, name_len, mod_time, access_mode, kptAlias );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed inflate KARAlias");
+ exit ( 3 );
+ }
+
+ /* need to reuse name* for soft-link string */
+ if ( name != buffer )
+ free ( name );
+
+ offset = toc_data_copy ( & name_len, sizeof name_len, toc_data, node -> data . size, offset );
+ name = malloc ( name_len + 1 );
+ if ( name == NULL )
+ exit ( 10 );
+ offset = toc_data_copy ( name, name_len, toc_data, node -> data . size, offset );
+ name [ name_len ] = 0;
+
+ alias -> link = name;
+ name = buffer;
+
+ rc = BSTreeInsert ( ( BSTree * ) data, &alias -> dad . dad, kar_entry_cmp );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed insert KARAlias into tree");
+ exit ( 3 );
+ }
+ break;
+ }
+ default:
+ STATUS ( 0, "unknown entry type: id %u", type_code );
+ break;
+ }
+
+ if ( name != buffer )
+ free ( name );
+}
+
+static
+rc_t kar_extract_toc ( const KFile *archive, BSTree *tree, uint64_t *toc_pos, const size_t toc_size )
+{
+ rc_t rc = 0;
+
+ char *buffer;
+ buffer = malloc ( toc_size );
+ if ( buffer == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcAllocating, rcMemory, rcExhausted );
+ LOGERR (klogErr, rc, "failed allocate memory");
+ }
+ else
+ {
+ size_t num_read;
+
+ rc = KFileReadAll ( archive, *toc_pos, buffer, toc_size, &num_read );
+ if ( rc != 0 )
+ {
+ LOGERR (klogErr, rc, "failed to access archive file");
+ exit ( 2 );
+ }
+
+ if ( num_read < toc_size )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcOffset, rcInsufficient );
+ LOGERR (klogErr, rc, "failed to read header");
+ }
+ else
+ {
+ PBSTree *ptree;
+
+ rc = PBSTreeMake ( &ptree, buffer, num_read, false );
+ if ( rc != 0 )
+ LOGERR (klogErr, rc, "failed make PBSTree");
+ else
+ {
+ PBSTreeForEach ( ptree, false, kar_inflate_toc, tree );
+
+ PBSTreeWhack ( ptree );
+ }
+ }
+
+ free ( buffer );
+ }
+
+ return rc;
+}
+
+typedef struct extract_block extract_block;
+struct extract_block
+{
+ uint64_t extract_pos;
+
+ KDirectory *cdir;
+ const KFile *archive;
+
+ rc_t rc;
+
+};
+
+static bool CC kar_extract ( BSTNode *node, void *data );
+
+static
+rc_t extract_file ( const KARFile *src, const extract_block *eb )
+{
+ KFile *dst;
+ char *buffer;
+ uint64_t num_writ;
+
+ rc_t rc = KDirectoryCreateFile ( eb -> cdir, &dst, false, 0200,
+ kcmCreate, "%s", src -> dad . name );
+ if ( rc != 0 )
+ {
+ pLogErr (klogErr, rc, "failed extract to file '$(fname)'", "fname=%s", src -> dad . name );
+ exit ( 4 );
+ }
+
+ buffer = malloc ( src -> byte_size );
+ if ( buffer == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcAllocating, rcMemory, rcExhausted );
+ pLogErr (klogErr, rc, "failed to allocate '$(mem)'", "mem=%lu", src -> byte_size );
+ exit ( 4 );
+ }
+
+ rc = KFileReadExactly ( eb -> archive, src -> byte_offset + eb -> extract_pos, buffer, src -> byte_size );
+ if ( rc != 0 )
+ {
+ pLogErr (klogErr, rc, "failed to read from archive '$(fname)'", "fname=%s", src -> dad . name );
+ exit ( 4 );
+ }
+
+ rc = KFileWriteAll ( dst, 0, buffer, src -> byte_size, &num_writ );
+ if ( rc != 0 )
+ {
+ pLogErr (klogErr, rc, "failed to write to file '$(fname)'", "fname=%s", src -> dad . name );
+ exit ( 4 );
+ }
+ if ( num_writ < src -> byte_size )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ pLogErr (klogErr, rc, "failed to write to file '$(fname)'", "fname=%s", src -> dad . name );
+ exit ( 4 );
+ }
+
+ KFileRelease ( dst );
+
+ free ( buffer );
+
+ return rc;
+}
+
+static
+rc_t extract_dir ( const KARDir *src, const extract_block *eb )
+{
+ rc_t rc;
+
+ STATUS ( STAT_QA, "extracting dir: %s", src -> dad . name );
+ rc = KDirectoryCreateDir ( eb -> cdir, 0700, kcmCreate, "%s", src -> dad . name );
+ if ( rc == 0 )
+ {
+ extract_block c_eb = *eb;
+ rc = KDirectoryOpenDirUpdate ( eb -> cdir, &c_eb . cdir, false, "%s", src -> dad . name );
+ if ( rc == 0 )
+ {
+ BSTreeDoUntil ( &src -> contents, false, kar_extract, &c_eb );
+
+ KDirectoryRelease ( c_eb . cdir );
+ }
+ }
+ return rc;
+}
+
+static
+rc_t extract_alias ( const KARAlias *src, const extract_block *eb )
+{
+ return KDirectoryCreateAlias ( eb -> cdir, 0777, kcmCreate, src -> link, src -> dad . name );
+}
+
+static
+bool CC kar_extract ( BSTNode *node, void *data )
+{
+ const KAREntry *entry = ( KAREntry * ) node;
+ extract_block *eb = ( extract_block * ) data;
+ eb -> rc = 0;
+ STATUS ( STAT_QA, "Entry to extract: %s", entry -> name );
+
+ switch ( entry -> type )
+ {
+ case kptFile:
+ eb -> rc = extract_file ( ( const KARFile * ) entry, eb );
+ break;
+ case kptDir:
+ eb -> rc = extract_dir ( ( const KARDir * ) entry, eb );
+ break;
+ case kptAlias:
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ eb -> rc = extract_alias ( ( const KARAlias * ) entry, eb );
+ if ( eb -> rc != 0 )
+ return true;
+ else
+ return false;
+ /* TBD - need to mdify the timestamp of the symlink without dereferencing using lutimes - requires library code handling*/
+ /* should not get down below to setaccess or setdate */
+ break;
+ default:
+ break;
+ }
+
+ if ( eb -> rc == 0 )
+ eb -> rc = KDirectorySetAccess ( eb -> cdir, false, entry -> access_mode, 0777, "%s", entry -> name );
+ if ( eb -> rc == 0 )
+ eb -> rc = KDirectorySetDate ( eb -> cdir, false, entry -> mod_time, "%s", entry -> name );
+
+ if ( eb -> rc != 0 )
+ return true;
+
+ return false;
+}
+
+static
+rc_t kar_test_extract ( const Params *p )
+{
+ rc_t rc;
+
+ KDirectory *wd;
+
+ STSMSG (1, ("Extracting kar\n"));
+
+ rc = KDirectoryNativeDir ( &wd );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "Failed to create working directory" );
+ else
+ {
+ const KFile *archive;
+ rc = KDirectoryOpenFileRead ( wd, &archive, p -> archive_path );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "Failed to open archive" );
+ else
+ {
+ KARDir root;
+ BSTree *tree;
+ KSraHeader hdr;
+ uint64_t toc_pos, toc_size, file_offset;
+
+ toc_pos = kar_verify_header ( archive, &hdr );
+ file_offset = hdr . u . v1 . file_offset;
+ toc_size = file_offset - toc_pos;
+
+ memset ( & root, 0, sizeof root );
+ root . dad . type = kptDir;
+
+ tree = & root . contents;
+ BSTreeInit ( tree );
+
+ STATUS ( STAT_QA, "extracting toc" );
+ rc = kar_extract_toc ( archive, tree, &toc_pos, toc_size );
+ if ( rc == 0 )
+ {
+ BSTreeForEach ( tree, false, kar_entry_link_parent_dir, NULL );
+
+ /* find what the alias points to */
+ BSTreeForEach ( tree, false, kar_alias_link_type, &root );
+
+ /* Finish test */
+ if ( p -> x_count == 0 )
+ {
+ KARPrintMode kpm;
+ STATUS ( STAT_QA, "Test Mode" );
+
+ max_size_fw = get_field_width ( max_size );
+ max_offset_fw = get_field_width ( max_offset );
+
+ kpm . indent = 0;
+
+ if ( p -> long_list )
+ {
+ KOutMsg ( "TypeAccess Size Offset ModDateTime Path Name\n" );
+ kpm . pm = pm_longlist;
+ }
+ else
+ kpm . pm = pm_normal;
+
+ BSTreeForEach ( tree, false, kar_print, &kpm );
+ }
+ else
+ {
+ extract_block eb;
+ /* begin extracting */
+ STATUS ( STAT_QA, "Extract Mode" );
+ eb . archive = archive;
+ eb . extract_pos = file_offset;
+ eb . rc = 0;
+
+ STATUS ( STAT_QA, "creating directory from path: %s", p -> directory_path );
+ rc = KDirectoryCreateDir ( wd, 0777, kcmInit, "%s", p -> directory_path );
+ if ( rc == 0 )
+ {
+ STATUS ( STAT_QA, "opening directory" );
+ rc = KDirectoryOpenDirUpdate ( wd, &eb . cdir, false, "%s", p -> directory_path );
+ if ( rc == 0 )
+ {
+ BSTreeDoUntil ( tree, false, kar_extract, &eb );
+ rc = eb . rc;
+ }
+
+ KDirectoryRelease ( eb . cdir );
+ }
+ }
+ }
+
+ BSTreeWhack ( tree, kar_entry_whack, NULL );
+ KFileRelease ( archive );
+ }
+
+ KDirectoryRelease ( wd );
+ }
+
+ return rc;
+}
+
+/*******************************************************************************
+ * Startup
+ */
+
+static
+rc_t run ( const Params *p )
+{
+ if ( p -> c_count != 0 )
+ return kar_create ( p );
+
+ if ( p -> x_count != 0 )
+ return kar_test_extract ( p );
+
+ assert ( p -> t_count != 0 );
+ return kar_test_extract ( p );
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Params params;
+ Args *args = NULL;
+
+ rc_t rc = parse_params ( ¶ms, args, argc, argv );
+ if ( rc == 0 )
+ {
+ rc = run ( ¶ms );
+
+ ArgsWhack ( args );
+ }
+
+ if ( rc == 0 )
+ STSMSG (1, ("Success: Exiting kar\n"));
+
+ return rc;
+}
+
diff --git a/tools/kar/sra-kar.c b/tools/kar/sra-kar.c
new file mode 100644
index 0000000..7d91b6e
--- /dev/null
+++ b/tools/kar/sra-kar.c
@@ -0,0 +1,431 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#define USE_FORCE 0
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/status.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sra/sradb.h>
+#include <sra/sradb-priv.h>
+
+#include <kapp/args.h>
+
+
+#include <assert.h>
+
+typedef struct srakar_parms srakar_parms;
+struct srakar_parms
+{
+ KDirectory * dir;
+ const char *src_path;
+ const char *dst_path;
+ bool lite;
+ bool force;
+};
+
+static
+rc_t copy_file (const KFile * fin, KFile *fout)
+{
+ rc_t rc;
+ uint8_t buff [64 * 1024];
+ size_t num_read;
+ uint64_t inpos;
+ uint64_t outpos;
+ uint64_t fsize;
+
+ assert (fin != NULL);
+ assert (fout != NULL);
+
+ inpos = 0;
+ outpos = 0;
+
+ rc = KFileSize (fin, &fsize);
+ if (rc != 0)
+ return rc;
+
+ do
+ {
+ rc = KFileRead (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc != 0)
+ {
+ PLOGERR (klogErr, (klogErr, rc,
+ "Failed to read from directory structure in creating archive at $(P)",
+ PLOG_U64(P), inpos));
+ break;
+ }
+ else if (num_read > 0)
+ {
+ size_t to_write;
+
+ inpos += (uint64_t)num_read;
+
+ to_write = num_read;
+ while (to_write > 0)
+ {
+ size_t num_writ;
+ rc = KFileWrite (fout, outpos, buff, num_read, &num_writ);
+ if (rc != 0)
+ {
+ PLOGERR (klogErr, (klogErr, rc,
+ "Failed to write to archive in creating archive at $(P)",
+ PLOG_U64(P), outpos));
+ break;
+ }
+ outpos += num_writ;
+ to_write -= num_writ;
+ }
+ }
+ if (rc != 0)
+ break;
+ } while (num_read != 0);
+ return rc;
+}
+static
+rc_t run ( srakar_parms *pb )
+{
+ KFile * outfile;
+ rc_t rc;
+
+ const SRAMgr *mgr;
+
+ rc = SRAMgrMakeRead ( & mgr );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to open SRAMgr" );
+ else
+ {
+ const SRATable *tbl;
+ rc = SRAMgrOpenTableRead ( mgr, & tbl, "%s", pb -> src_path );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to open SRATable '$(spec)'", "spec=%s",
+ pb -> src_path ));
+ else
+ {
+ rc = KDirectoryCreateFile (pb->dir, &outfile, false, 0446,
+ kcmParents | ( pb->force ? kcmInit : kcmCreate) , "%s", pb->dst_path);
+ if (rc == 0)
+ {
+ const KFile * archive;
+
+ rc = SRATableMakeSingleFileArchive (tbl, &archive, pb->lite,
+ NULL);
+ if (rc == 0)
+ {
+ rc = copy_file (archive, outfile);
+ KFileRelease (archive);
+ }
+ KFileRelease (outfile);
+ }
+ SRATableRelease ( tbl );
+ }
+ SRAMgrRelease (mgr);
+ }
+/*
+ rc = KDirectoryCreateFile (pb->dir, &outfile, false, 0446, kcmParents | ( pb->force ? kcmInit : kcmCreate) , "%s", pb->dst_path);
+
+ if (rc == 0)
+ {
+ const SRAMgr *mgr;
+
+ rc = SRAMgrMakeRead ( & mgr );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to open SRAMgr" );
+ else
+ {
+ const SRATable *tbl;
+ rc = SRAMgrOpenTableRead ( mgr, & tbl, "%s", pb -> src_path );
+ if ( rc != 0 )
+ PLOGERR ( klogInt, (klogInt, rc, "failed to open SRATable '$(spec)'", "spec=%s", pb -> src_path ));
+ else
+ {
+ const KFile * archive;
+
+ rc = SRATableMakeSingleFileArchive (tbl, &archive, pb->lite, NULL);
+ if (rc == 0)
+ {
+ rc = copy_file (archive, outfile);
+ KFileRelease (archive);
+ }
+ SRATableRelease ( tbl );
+ }
+ SRAMgrRelease (mgr);
+ }
+ KFileRelease (outfile);
+ }
+*/
+ return rc;
+}
+
+/* Usage
+ */
+#define OPTION_LITE "lite"
+#define ALIAS_LITE "l"
+static const char * lite_usage[] = { "output an abbreviated version of the table", NULL };
+
+#if USE_FORCE
+#define OPTION_FORCE "force"
+#define ALIAS_FORCE "f"
+static const char * force_usage[] = { "replace an existing archive if present", NULL };
+#endif
+static
+OptDef Options[] =
+{
+#if USE_FORCE
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 1, false, false },
+#endif
+ { OPTION_LITE, ALIAS_LITE, NULL, lite_usage, 1, false, false }
+};
+
+
+static
+KLogLevel default_log_level;
+
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [options] table [archive]\n"
+ "\n"
+ "Summary:\n"
+ " Create a single file archive from an SRA database table.\n"
+ " The archive name can be given or will be derived from the\n"
+ " name of the table.\n"
+ "\n", progname);
+}
+
+const char UsageDefaultName[] = "sra-kar";
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine (ALIAS_LITE, OPTION_LITE, NULL, lite_usage);
+#if USE_FORCE
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+#endif
+ HelpOptionsStandard ();
+ HelpVersion (fullpath, KAppVersion());
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+ rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ default_log_level = KLogLevelGet();
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc == 0)
+ {
+ do
+ {
+ srakar_parms pb;
+ KDirectory * pwd;
+ const char * name;
+ uint32_t pcount;
+ char archive_name [256];
+
+ rc = KDirectoryNativeDir (&pwd);
+ if (rc)
+ break;
+
+ pb.lite = false;
+ pb.force = false;
+ pb.dir = pwd;
+
+ rc = ArgsOptionCount (args, OPTION_LITE, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 1)
+ {
+ STSMSG (1, ("Using lite option"));
+ pb.lite = true;
+ }
+
+#if USE_FORCE
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 1)
+ {
+ STSMSG (1, ("Using force option"));
+ pb.force = true;
+ }
+#endif
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0)
+ {
+ KOutMsg ("missing source table\n");
+ MiniUsage (args);
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcInsufficient);
+ break;
+ }
+ else if (pcount > 2)
+ {
+ KOutMsg ("Too many parameters\n");
+ MiniUsage (args);
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcExcessive);
+ break;
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&pb.src_path);
+ if (rc)
+ {
+ KOutMsg ("failure to get source path/name\n");
+ break;
+ }
+
+ pb.dst_path = archive_name;
+
+ name = string_rchr (pb.src_path, string_size (pb.src_path), '/');
+ if (name == NULL)
+ name = pb.src_path;
+
+ if (pcount == 1)
+ {
+ size_t size;
+
+ rc = string_printf (archive_name, sizeof (archive_name), & size,
+ "%s%s", name, pb.lite ? ".lite.sra" : ".sra");
+ if ( rc != 0 )
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcInsufficient);
+ PLOGERR (klogFatal, (klogFatal, rc, "Failure building archive name $(P)", "P=%s", archive_name));
+ break;
+ }
+ }
+ else
+ {
+ rc = ArgsParamValue (args, 1, (const void **)&pb.dst_path);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "failure to get destination path");
+ break;
+ }
+ }
+
+ if (rc == 0)
+ {
+ KPathType kpt;
+
+ kpt = KDirectoryPathType (pwd, "%s", pb.dst_path);
+
+ switch (kpt & ~kptAlias)
+ {
+ case kptNotFound:
+ /* found nothing so assume its a valid new file name
+ * not gonna tweak extensions at this point but that can be upgraded */
+ break;
+ case kptFile:
+ /* got a file name, use it - would need force... */
+ if (pb.force == false)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcBusy);
+ PLOGERR (klogFatal, (klogFatal, rc,
+ "Output file already exists $(P)",
+ "P=%s", archive_name));
+ }
+ break;
+
+ case kptDir:
+ {
+ size_t size;
+
+ rc = string_printf (archive_name, sizeof (archive_name), & size,
+ "%s/%s%s", pb.dst_path, name, pb.lite ? ".lite.sra" : ".sra");
+ if ( rc != 0 )
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcInsufficient);
+ PLOGERR (klogFatal, (klogFatal, rc, "Failure building archive name $(P)", "P=%s", archive_name));
+ break;
+ }
+ pb.dst_path = archive_name;
+ break;
+ }
+ default:
+ rc = RC (rcExe, rcArgv, rcParsing, rcPath, rcInvalid);
+ break;
+ }
+ if (rc == 0)
+ {
+ STSMSG (1,("Creating archive (%s) from table (%s)\n", pb.dst_path, pb.src_path));
+
+ rc = run (&pb);
+ STSMSG (5, ("Run exits with %d %R\n", rc, rc));
+ }
+ }
+
+ } while (0);
+ }
+ STSMSG (1, ("Exit status %u %R", rc, rc));
+ return rc;
+}
diff --git a/tools/keyring-srv/Makefile b/tools/keyring-srv/Makefile
new file mode 100644
index 0000000..1295f11
--- /dev/null
+++ b/tools/keyring-srv/Makefile
@@ -0,0 +1,110 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/keyring-srv
+
+INT_LIBS = \
+
+ALL_LIBS = \
+ $(INT_LIBS) \
+ $(EXT_LIBS)
+
+EXT_TOOLS = \
+ keyring-srv
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#------------------------------------------------------------------------------
+# keyring-srv
+#
+KEYRING_SRV_SRC = \
+ keyring-srv \
+ keyring-data \
+ keyring-database \
+ keyring-srv-main \
+
+KEYRING_SRV_OBJ = \
+ $(addsuffix .$(OBJX),$(KEYRING_SRV_SRC))
+
+KEYRING_SRV_LIB = \
+ -skapp \
+ -stk-version \
+ -lncbi-wvdb \
+
+
+$(BINDIR)/keyring-srv: $(KEYRING_SRV_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(KEYRING_SRV_LIB)
+
diff --git a/tools/keyring-srv/keyring-data.c b/tools/keyring-srv/keyring-data.c
new file mode 100644
index 0000000..58cdeac
--- /dev/null
+++ b/tools/keyring-srv/keyring-data.c
@@ -0,0 +1,346 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "keyring-data.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <klib/rc.h>
+
+rc_t KeyRingDataInit ( KeyRingData* self )
+{
+ BSTreeInit( & self->projects );
+ BSTreeInit( & self->objects );
+ self->next_projectId = 0;
+ self->next_objectId = 0;
+ return 0;
+}
+
+void KeyRingDataWhack ( KeyRingData* self )
+{
+ BSTreeWhack ( & self->projects, ProjectWhack, NULL );
+ BSTreeWhack ( & self->objects, ObjectWhack, NULL );
+}
+
+static int64_t CC FindProject ( const void *item, const BSTNode *n )
+{
+ return StringCompare((const String*)item, ((const Project*)n)->name);
+}
+static int64 CC SortProjects ( const BSTNode *item, const BSTNode *n )
+{
+ return StringCompare(((const Project*)item)->name, ((const Project*)n)->name);
+}
+
+const Project* KeyRingDataGetProject (const KeyRingData* data, const String* name)
+{
+ return (const Project*)BSTreeFind(&data->projects, name, FindProject);
+}
+
+rc_t KeyRingDataInsertProject (ProjectTable* data,
+ uint32_t p_id,
+ const String* name,
+ const String* download_ticket,
+ const String* encryption_key)
+{
+ rc_t rc = 0;
+ Project* p = (Project*) malloc(sizeof(Project));
+ if (p != NULL)
+ {
+ rc = ProjectInit(p, p_id, name, download_ticket, encryption_key);
+ if (rc == 0)
+ {
+ rc = BSTreeInsert(data, &p->dad, SortProjects);
+ if (rc != 0)
+ ProjectWhack(&p->dad, NULL);
+ }
+ if (rc != 0)
+ free(p);
+ }
+ else
+ rc = RC ( rcApp, rcDatabase, rcUpdating, rcMemory, rcExhausted );
+ return rc;
+}
+
+rc_t KeyRingDataAddProject(KeyRingData* data, const String* name, const String* download_ticket, const String* encryption_key)
+{
+ rc_t rc = 0;
+ Project* p;
+
+ p = (Project*)BSTreeFind(&data->projects, name, FindProject);
+ if (p != NULL)
+ {
+ bool rewrite = false;
+ String* dl = NULL;
+ String* enc = NULL;
+ if (StringCompare(p->download_ticket, download_ticket) != 0)
+ {
+ dl = p->download_ticket;
+ rc = StringCopy((const String**)&p->download_ticket, download_ticket);
+ if (rc == 0)
+ rewrite = true;
+ else
+ dl = NULL;
+ }
+ if (rc == 0 && StringCompare(p->encryption_key, encryption_key) != 0)
+ {
+ enc = p->encryption_key;
+ rc = StringCopy((const String**)&p->encryption_key, encryption_key);
+ if (rc == 0)
+ rewrite = true;
+ else
+ enc = NULL;
+ }
+ if (rc == 0 && rewrite)
+ {
+ if (dl)
+ StringWhack(dl);
+ if (enc)
+ StringWhack(enc);
+ }
+ }
+ else /* insert new */
+ {
+ rc = KeyRingDataInsertProject (&data->projects, data->next_projectId, name, download_ticket, encryption_key);
+ if (rc == 0)
+ ++data->next_projectId;
+ }
+ return rc;
+}
+
+rc_t ProjectInit ( Project* self, uint32_t p_id, const String* name, const String* download_ticket, const String* encryption_key )
+{
+ rc_t rc = 0;
+ memset(self, 0, sizeof(Project));
+ self->id = p_id;
+ rc = StringCopy((const String**)&self->name, name);
+ if (rc == 0)
+ {
+ rc = StringCopy((const String**)&self->download_ticket, download_ticket);
+ if (rc == 0)
+ {
+ rc = StringCopy((const String**)&self->encryption_key, encryption_key);
+ if (rc != 0)
+ StringWhack(self->download_ticket);
+ }
+ else
+ StringWhack(self->name);
+ }
+ return rc;
+}
+
+void ProjectWhack ( BSTNode *n, void *data )
+{
+ Project* self = (Project*)n;
+ StringWhack(self->name);
+ StringWhack(self->download_ticket);
+ StringWhack(self->encryption_key);
+ free(self);
+}
+
+rc_t ObjectInit ( Object* self,
+ uint32_t p_id,
+ const String* p_name,
+ const String* p_project,
+ const String* p_display_name,
+ uint64_t p_size,
+ const String* p_checksum,
+ const String* p_encryption_key)
+{
+ rc_t rc = 0;
+ memset(self, 0, sizeof(Project));
+ self->id = p_id;
+ rc = StringCopy((const String**)&self->name, p_name);
+ if (rc == 0)
+ {
+ rc = StringCopy((const String**)&self->project, p_project);
+ if (rc == 0)
+ {
+ rc = StringCopy((const String**)&self->display_name, p_display_name);
+ if (rc == 0)
+ {
+ self->size = p_size;
+ rc = StringCopy((const String**)&self->checksum, p_checksum);
+ if (rc == 0)
+ {
+ rc = StringCopy((const String**)&self->encryption_key, p_encryption_key);
+ if (rc != 0)
+ StringWhack(self->checksum);
+ }
+ if (rc != 0)
+ StringWhack(self->display_name);
+ }
+ if (rc != 0)
+ StringWhack(self->project);
+ }
+ if (rc != 0)
+ StringWhack(self->name);
+ }
+ return rc;
+}
+
+void ObjectWhack ( BSTNode *n, void *data )
+{
+ Object* self = (Object*)n;
+ StringWhack(self->name);
+ StringWhack(self->project);
+ StringWhack(self->display_name);
+ StringWhack(self->checksum);
+ StringWhack(self->encryption_key);
+ free(self);
+}
+
+static int64_t CC FindObject( const void *item, const BSTNode *n )
+{
+ return StringCompare((const String*)item, ((const Object*)n)->name);
+}
+static int64_t CC SortObjects( const BSTNode *item, const BSTNode *n )
+{
+ return StringCompare(((const Project*)item)->name, ((const Object*)n)->name);
+}
+
+rc_t KeyRingDataInsertObject(ObjectTable* data,
+ uint32_t p_id,
+ const String* name,
+ const String* project,
+ const String* display_name,
+ uint64_t size,
+ const String* checksum,
+ const String* encryption_key)
+{
+ rc_t rc = 0;
+ Object* obj = (Object*) malloc(sizeof(Object));
+ if (obj != NULL)
+ {
+ rc = ObjectInit(obj, p_id, name, project, display_name, size, checksum, encryption_key);
+ if (rc == 0)
+ {
+ rc = BSTreeInsert(data, &obj->dad, SortObjects);
+ if (rc != 0)
+ ProjectWhack(&obj->dad, NULL);
+ }
+ else
+ free(obj);
+ }
+ else
+ rc = RC ( rcApp, rcDatabase, rcUpdating, rcMemory, rcExhausted );
+ return rc;
+}
+
+
+rc_t KeyRingDataAddObject (KeyRingData* data,
+ const String* name,
+ const String* project,
+ const String* display_name,
+ uint64_t size,
+ const String* checksum,
+ const String* encryption_key)
+{
+ rc_t rc = 0;
+ Object* obj;
+
+ obj = (Object*)BSTreeFind(&data->objects, name, FindObject);
+ if (obj != NULL)
+ {
+ bool rewrite = false;
+ String* proj = NULL;
+ String* disp = NULL;
+ String* csum = NULL;
+ String* encr = NULL;
+ if (StringCompare(obj->project, project) != 0)
+ {
+ proj = obj->project;
+ rc = StringCopy((const String**)&obj->project, project);
+ if (rc == 0)
+ rewrite = true;
+ else
+ proj = NULL;
+ }
+ if (StringCompare(obj->display_name, display_name) != 0)
+ {
+ disp = obj->display_name;
+ rc = StringCopy((const String**)&obj->display_name, display_name);
+ if (rc == 0)
+ rewrite = true;
+ else
+ disp = NULL;
+ }
+ if (size != obj->size)
+ {
+ obj->size = size;
+ rewrite = true;
+ }
+ if (StringCompare(obj->checksum, checksum) != 0)
+ {
+ csum = obj->checksum;
+ rc = StringCopy((const String**)&obj->checksum, checksum);
+ if (rc == 0)
+ rewrite = true;
+ else
+ csum = NULL;
+ }
+ if (StringCompare(obj->encryption_key, encryption_key) != 0)
+ {
+ encr = obj->encryption_key;
+ rc = StringCopy((const String**)&obj->encryption_key, encryption_key);
+ if (rc == 0)
+ rewrite = true;
+ else
+ encr = NULL;
+ }
+ if (rc == 0 && rewrite)
+ {
+ if (proj)
+ StringWhack(proj);
+ if (disp)
+ StringWhack(disp);
+ if (csum)
+ StringWhack(csum);
+ if (encr)
+ StringWhack(encr);
+ }
+ }
+ else /* insert new */
+ {
+ rc = KeyRingDataInsertObject(&data->objects,
+ data->next_objectId,
+ name,
+ project,
+ display_name,
+ size,
+ checksum,
+ encryption_key);
+ if (rc == 0)
+ ++data->next_objectId;
+ }
+ return rc;
+}
+
+const Object* KeyRingDataGetObject (const KeyRingData* data, const String* name)
+{
+ return (const Object*)BSTreeFind(&data->objects, name, FindObject);
+}
diff --git a/tools/keyring-srv/keyring-data.h b/tools/keyring-srv/keyring-data.h
new file mode 100644
index 0000000..6e58316
--- /dev/null
+++ b/tools/keyring-srv/keyring-data.h
@@ -0,0 +1,130 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_keyring_data_
+#define _h_keyring_data_
+
+#include <klib/defs.h>
+#include <klib/container.h>
+#include <klib/text.h>
+
+struct VDatabase;
+
+typedef struct Project Project;
+struct Project
+{
+ BSTNode dad;
+
+ uint32_t id;
+ String* name;
+ /*TODO: replace Strings with key-ids */
+ String* download_ticket;
+ String* encryption_key;
+};
+extern rc_t ProjectInit ( Project* self,
+ uint32_t p_id,
+ const String* p_name,
+ const String* p_download_ticket,
+ const String* p_encyption_key );
+extern void ProjectWhack ( BSTNode *n, void *data );
+
+typedef struct Object Object;
+struct Object
+{
+ BSTNode dad;
+
+ uint32_t id;
+ String* name;
+ String* project;
+ String* display_name;
+ uint64_t size;
+ String* checksum;
+ /*TODO: replace String with key-id */
+ String* encryption_key;
+};
+extern rc_t ObjectInit ( Object* self,
+ uint32_t id,
+ const String* name,
+ const String* project,
+ const String* display_name,
+ uint64_t size,
+ const String* checksum,
+ const String* encryption_key);
+extern void ObjectWhack ( BSTNode *n, void *data );
+
+typedef BSTree ProjectTable;
+typedef BSTree ObjectTable;
+
+typedef struct KeyRingData KeyRingData;
+struct KeyRingData
+{
+ ProjectTable projects;
+ ObjectTable objects;
+
+ uint32_t next_projectId;
+ uint32_t next_objectId;
+};
+
+extern rc_t KeyRingDataInit ( KeyRingData* self );
+extern void KeyRingDataWhack ( KeyRingData* self ); /* does not call free(self) */
+
+/* make sure does not exist, assign an id*/
+extern rc_t KeyRingDataAddProject (KeyRingData* data,
+ const String* name,
+ const String* download_ticket,
+ const String* encryption_key);
+
+/* known to be new, id assigned*/
+extern rc_t KeyRingDataInsertProject (ProjectTable* data,
+ uint32_t p_id,
+ const String* name,
+ const String* download_ticket,
+ const String* encryption_key);
+
+extern const Project* KeyRingDataGetProject (const KeyRingData* data, const String* name);
+
+/* make sure does not exist, assign an id*/
+extern rc_t KeyRingDataAddObject (KeyRingData* data,
+ const String* name,
+ const String* project,
+ const String* display_name,
+ uint64_t size,
+ const String* checksum,
+ const String* encryption_key);
+/* known to be new, id assigned*/
+extern rc_t KeyRingDataInsertObject(ObjectTable* data,
+ uint32_t p_id,
+ const String* name,
+ const String* project,
+ const String* display_name,
+ uint64_t size,
+ const String* checksum,
+ const String* encryption_key);
+
+extern const Object* KeyRingDataGetObject (const KeyRingData* data, const String* name);
+
+
+#endif /* _h_keyring_data_ */
diff --git a/tools/keyring-srv/keyring-database.c b/tools/keyring-srv/keyring-database.c
new file mode 100644
index 0000000..0816a7d
--- /dev/null
+++ b/tools/keyring-srv/keyring-database.c
@@ -0,0 +1,441 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "keyring-database.h"
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/cursor.h>
+
+#include "keyring-data.h"
+
+static const char schema_text[] =
+"version 1; "
+
+" table projects : MyProjects #1 { "
+" extern column U32 id = .id;"
+" physical column U32 .id = id;"
+
+" extern column ascii name = .name;"
+" physical column ascii .name = name;"
+
+" extern column ascii download_ticket = .download_ticket;"
+" physical column ascii .download_ticket = download_ticket;"
+
+" extern column ascii encryption_key = .encryption_key;"
+" physical column ascii .encryption_key = encryption_key;"
+" };"
+
+" table objects : MyObjects #1 { "
+" extern column U32 id = .id;"
+" physical column U32 .id = id;"
+
+" extern column ascii name = .name;"
+" physical column ascii .name = name;"
+
+" extern column ascii project = .project;"
+" physical column ascii .project = project;"
+
+" extern column ascii display_name = .display_name;"
+" physical column ascii .display_name = display_name;"
+
+" extern column U64 size = .size;"
+" physical column U64 .size = size;"
+
+" extern column ascii checksum = .checksum;"
+" physical column ascii .checksum = checksum;"
+
+" extern column ascii encryption_key = .encryption_key;"
+" physical column ascii .encryption_key = encryption_key;"
+" };"
+
+" table keys : MyKeys #1 { "
+" physical column U32 .id;"
+" physical column ascii .value;"
+" };"
+"database keyring : KEYRING #1 { "
+" table objects: MyObjects #1 object_inst;"
+" table projects: MyProjects #1 project_inst;"
+" table keys : MyKeys #1 keys_inst;"
+"};";
+
+static rc_t SaveProjects( const ProjectTable* data, VDatabase* db );
+static rc_t SaveObjects ( const ObjectTable* data, VDatabase* db );
+static rc_t LoadProjects( ProjectTable* data, const VDatabase* db );
+static rc_t LoadObjects ( ObjectTable* data, const VDatabase* db );
+
+rc_t KeyRingDatabaseSave ( struct KeyRingData* self, struct KDirectory* wd, const char* path )
+{
+ rc_t rc;
+ VDBManager* vdbMgr;
+ rc = VDBManagerMakeUpdate( &vdbMgr, wd );
+ if (rc == 0)
+ {
+ VSchema* schema;
+ rc = VDBManagerMakeSchema(vdbMgr, &schema);
+ if (rc == 0)
+ {
+ rc = VSchemaParseText ( schema, "keyring_schema", schema_text, string_measure(schema_text, NULL) );
+ if (rc == 0)
+ { /* create a database */
+ VDatabase* db;
+ rc = VDBManagerCreateDB(vdbMgr, & db, schema, "keyring:KEYRING", kcmCreate | kcmMD5, path);
+ if (rc == 0)
+ {
+ rc_t rc2;
+ rc = SaveProjects(&self->projects, db);
+ if (rc == 0)
+ rc = SaveObjects(&self->objects, db);
+ /*TODO: SaveKeys */
+ rc2 = VDatabaseRelease(db);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ }
+ VSchemaRelease(schema);
+ }
+ VDBManagerRelease(vdbMgr);
+ }
+
+ return rc;
+}
+
+rc_t KeyRingDatabaseLoad ( struct KeyRingData* self, const struct KDirectory* dir, const char* path )
+{
+ VDBManager* innerMgr;
+ rc_t rc = VDBManagerMakeUpdate( &innerMgr, (KDirectory*)dir );
+ if (rc == 0)
+ {
+ rc_t rc2;
+ const VDatabase* db;
+ rc = VDBManagerOpenDBRead(innerMgr, & db, NULL, "%s", path);
+ if (rc == 0)
+ {
+ rc = LoadProjects(&self->projects, db);
+ if (rc == 0)
+ rc = LoadObjects(&self->objects, db);
+ /*TODO: LoadKeys */
+ rc2 = VDatabaseRelease(db);
+ if (rc == 0)
+ rc = rc2;
+ }
+ rc2 = VDBManagerRelease(innerMgr);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ return rc;
+}
+
+static
+rc_t SaveProjects( const ProjectTable* data, VDatabase* db )
+{
+ VTable* tbl;
+ rc_t rc = VDatabaseCreateTable(db, &tbl, "project_inst", kcmCreate | kcmMD5, "PROJECTS");
+ if (rc == 0)
+ {
+ rc_t rc2;
+ VCursor *cur;
+ rc = VTableCreateCursorWrite( tbl, &cur, kcmInsert );
+ if (rc == 0)
+ {
+ uint32_t id_idx, name_idx, dl_idx, enc_idx;
+ rc = VCursorAddColumn( cur, &id_idx, "id" );
+ rc = VCursorAddColumn( cur, &name_idx, "name" );
+ rc = VCursorAddColumn( cur, &dl_idx, "download_ticket" );
+ rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" );
+ if (rc == 0)
+ {
+ rc = VCursorOpen( cur );
+ if (rc == 0)
+ {
+ const Project* p = (const Project*)BSTreeFirst(data);
+ while (rc == 0 && p != NULL)
+ {
+ rc = VCursorOpenRow( cur );
+
+ if (rc == 0) rc = VCursorWrite( cur, id_idx, sizeof(p->id) * 8, &p->id, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, name_idx, StringLength(p->name) * 8, p->name->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, dl_idx, StringLength(p->download_ticket) * 8, p->download_ticket->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, enc_idx, StringLength(p->encryption_key) * 8, p->encryption_key->addr, 0, 1);
+
+ if (rc == 0) rc = VCursorCommitRow( cur );
+ if (rc == 0) rc = VCursorCloseRow( cur );
+
+ p = (const Project*)BSTNodeNext(&p->dad);
+ }
+ if (rc == 0)
+ rc = VCursorCommit( cur );
+ }
+ }
+ rc2 = VCursorRelease(cur);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ rc2 = VTableRelease(tbl);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+static
+rc_t SaveObjects ( const ObjectTable* data, VDatabase* db )
+{
+ VTable* tbl;
+ rc_t rc = VDatabaseCreateTable(db, &tbl, "object_inst", kcmCreate | kcmMD5, "OBJECTS");
+ if (rc == 0)
+ {
+ rc_t rc2;
+ VCursor *cur;
+ rc = VTableCreateCursorWrite( tbl, &cur, kcmInsert );
+ if (rc == 0)
+ {
+ uint32_t id_idx, name_idx, proj_idx, dname_idx, size_idx, csum_idx, enc_idx;
+ if (rc == 0) rc = VCursorAddColumn( cur, &id_idx, "id" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &name_idx, "name" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &proj_idx, "project" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &dname_idx, "display_name" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &size_idx, "size" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &csum_idx, "checksum" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" );
+
+ if (rc == 0)
+ {
+ rc = VCursorOpen( cur );
+ if (rc == 0)
+ {
+ const Object* obj = (const Object*)BSTreeFirst(data);
+ while (rc == 0 && obj != NULL)
+ {
+ rc = VCursorOpenRow( cur );
+
+ if (rc == 0) rc = VCursorWrite( cur, id_idx, sizeof(obj->id) * 8, &obj->id, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, name_idx, StringLength(obj->name) * 8, obj->name->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, proj_idx, StringLength(obj->project) * 8, obj->project->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, dname_idx, StringLength(obj->display_name) * 8, obj->display_name->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, size_idx, sizeof(obj->size) * 8, &obj->size, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, csum_idx, StringLength(obj->encryption_key) * 8, obj->encryption_key->addr, 0, 1);
+ if (rc == 0) rc = VCursorWrite( cur, enc_idx, StringLength(obj->encryption_key) * 8, obj->encryption_key->addr, 0, 1);
+
+ if (rc == 0) rc = VCursorCommitRow( cur );
+ if (rc == 0) rc = VCursorCloseRow( cur );
+
+ obj = (const Object*)BSTNodeNext(&obj->dad);
+ }
+ if (rc == 0) rc = VCursorCommit( cur );
+ }
+ }
+ rc2 = VCursorRelease(cur);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ rc2 = VTableRelease(tbl);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+static size_t CursorCacheSize = 32*1024;
+
+static
+bool HasData(const VTable* tbl)
+{
+ bool ret = false;
+ KNamelist *names;
+ if (VTableListCol(tbl, &names) == 0)
+ {
+ uint32_t n;
+ ret = KNamelistCount( names, &n ) == 0 && n > 0;
+ }
+ KNamelistRelease( names );
+ return ret;
+}
+
+static
+rc_t LoadProjects( ProjectTable* data, const VDatabase* db )
+{
+ const VTable* tbl;
+ rc_t rc = VDatabaseOpenTableRead(db, &tbl, "PROJECTS");
+ if (rc == 0)
+ {
+ rc_t rc2;
+ const VCursor *cur;
+
+ rc = VTableCreateCachedCursorRead( tbl, &cur, CursorCacheSize );
+ if (rc == 0)
+ {
+ uint32_t id_idx, name_idx, dl_idx, enc_idx;
+ rc = VCursorAddColumn( cur, &id_idx, "id" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &name_idx, "name" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &dl_idx, "download_ticket" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" );
+ if (rc == 0 && HasData(tbl))
+ {
+ rc = VCursorOpen( cur );
+ if (rc == 0)
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange( cur, 0, &first, &count );
+ if (rc == 0)
+ {
+ uint64_t i;
+ for (i=0; i < count; ++i)
+ {
+ const void* ptr;
+ uint32_t elem_count;
+ uint32_t id;
+ String name;
+ String download_ticket;
+ String encryption_key;
+
+ rc = VCursorSetRowId(cur, first + i);
+ if (rc == 0) rc = VCursorOpenRow( cur );
+
+ if (rc == 0) rc = VCursorCellData( cur, id_idx, NULL, &ptr, NULL, NULL);
+ if (rc == 0) id = *(uint32_t*)ptr;
+ if (rc == 0) rc = VCursorCellData( cur, name_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&name, (const char*)ptr, elem_count, elem_count);
+ if (rc == 0) rc = VCursorCellData( cur, dl_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&download_ticket, (const char*)ptr, elem_count, elem_count);
+ if (rc == 0) rc = VCursorCellData( cur, enc_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&encryption_key, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = KeyRingDataInsertProject(data, id, &name, &download_ticket, &encryption_key);
+ if (rc == 0) rc = VCursorCloseRow( cur );
+ if (rc != 0)
+ break;
+ }
+ }
+ }
+ }
+ rc2 = VCursorRelease(cur);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ rc2 = VTableRelease(tbl);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+static
+rc_t LoadObjects ( ObjectTable* data, const VDatabase* db )
+{
+ const VTable* tbl;
+ rc_t rc = VDatabaseOpenTableRead(db, &tbl, "OBJECTS");
+ if (rc == 0)
+ {
+ rc_t rc2;
+ const VCursor *cur;
+
+ rc = VTableCreateCachedCursorRead( tbl, &cur, CursorCacheSize );
+ if (rc == 0)
+ {
+ uint32_t id_idx, name_idx, proj_idx, dname_idx, size_idx, csum_idx, enc_idx;
+ if (rc == 0) rc = VCursorAddColumn( cur, &id_idx, "id" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &name_idx, "name" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &proj_idx, "project" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &dname_idx, "display_name" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &size_idx, "size" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &csum_idx, "checksum" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" );
+ if (rc == 0 && HasData(tbl))
+ {
+ rc = VCursorOpen( cur );
+ if (rc == 0)
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange( cur, 0, &first, &count );
+ if (rc == 0)
+ {
+ uint64_t i;
+ for (i=0; i < count; ++i)
+ {
+ const void* ptr;
+ uint32_t elem_count;
+ uint32_t id;
+ String name;
+ String project;
+ String display_name;
+ uint64_t size;
+ String checksum;
+ String encryption_key;
+
+ rc = VCursorSetRowId(cur, first + i);
+ if (rc == 0) rc = VCursorOpenRow( cur );
+
+ if (rc == 0) rc = VCursorCellData( cur, id_idx, NULL, &ptr, NULL, NULL);
+ if (rc == 0) id = *(uint32_t*)ptr;
+
+ if (rc == 0) rc = VCursorCellData( cur, name_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&name, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = VCursorCellData( cur, proj_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&project, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = VCursorCellData( cur, dname_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&display_name, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = VCursorCellData( cur, size_idx, NULL, &ptr, NULL, NULL);
+ if (rc == 0) size = *(uint32_t*)ptr;
+
+ if (rc == 0) rc = VCursorCellData( cur, enc_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&encryption_key, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = VCursorCellData( cur, csum_idx, NULL, &ptr, NULL, &elem_count);
+ if (rc == 0) StringInit(&checksum, (const char*)ptr, elem_count, elem_count);
+
+ if (rc == 0) rc = KeyRingDataInsertObject(data, id, &name, &project, &display_name, size, &checksum, &encryption_key);
+ if (rc == 0) rc = VCursorCloseRow( cur );
+ if (rc != 0)
+ break;
+ }
+ }
+ }
+ }
+ rc2 = VCursorRelease(cur);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ rc2 = VTableRelease(tbl);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
diff --git a/tools/keyring-srv/keyring-database.h b/tools/keyring-srv/keyring-database.h
new file mode 100644
index 0000000..3af12ab
--- /dev/null
+++ b/tools/keyring-srv/keyring-database.h
@@ -0,0 +1,45 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_keyring_database_
+#define _h_keyring_database_
+
+#include <klib/rc.h>
+
+struct KDirectory;
+struct KeyRingData;
+
+/*
+ * Save into a (non-archived) directory
+ */
+extern rc_t KeyRingDatabaseSave ( struct KeyRingData* self, struct KDirectory* dir, const char* path );
+
+/*
+ * Load from a directory (possibly archived/encrypted)
+*/
+extern rc_t KeyRingDatabaseLoad ( struct KeyRingData* self, const struct KDirectory* dir, const char* path);
+
+#endif /* _h_keyring_database_ */
diff --git a/tools/keyring-srv/keyring-srv-main.c b/tools/keyring-srv/keyring-srv-main.c
new file mode 100644
index 0000000..d005ecb
--- /dev/null
+++ b/tools/keyring-srv/keyring-srv-main.c
@@ -0,0 +1,333 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+/* KeyRing Server process
+ * - install an IPC socket listener (name = "vdb-keyring")
+ * - listen for incoming IPC connections
+ * - handle IPC requests
+ * Request format:
+ * <uint16_t length><body>
+ * Request body:
+ * - "I" - init
+ * - "X" - shutDown
+ * - "PA<uint8 length>name<uint8 length>dl_ticket<uint8 length>enc_key" - add project
+ * Response format:
+ * <uint8_t length><body>
+ * Response body:
+ * - "IY" init successful
+ * - "IN" init failed (bad password?)
+ */
+
+#include "keyring-srv.h"
+
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+
+#include <kproc/thread.h>
+
+#include <kns/manager.h>
+#include <kns/socket.h>
+#include <kns/endpoint.h>
+#include <kns/stream.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/lockfile.h>
+
+#include <vfs/keyring-priv.h>
+
+#include <kapp/args.h>
+
+#ifndef MAX_PATH
+#define MAX_PATH 4096
+#endif
+
+static rc_t WorkerThreadFn ( const KThread *self, void *data );
+
+static bool shutDown = false;
+
+/*TODO: add pid to log messages? */
+static const char* initMsgSuccess = "\x02IY";
+static const char* initMsgFailure = "\x02IN";
+
+char keyRingFileName[MAX_PATH];
+KKeyRing* keyring = NULL;
+
+static
+rc_t
+Server( KNSManager* mgr )
+{
+ rc_t rc = 0;
+ KEndPoint ep;
+ String name;
+
+ CONST_STRING(&name, KEYRING_IPC_NAME);
+ rc = KNSManagerInitIPCEndpoint(mgr, &ep, &name);
+ if (rc == 0)
+ {
+ KSocket* listener;
+ rc = KNSMakeListener ( &listener, &ep );
+ if (rc == 0)
+ {
+ shutDown = false;
+ while (!shutDown && rc == 0)
+ {
+ KStream* stream;
+ LogMsg ( klogInfo, "KeyringServer: listening");
+ rc = KNSListen ( listener, &stream ); /* may not return from here if no more incoming connections arrive */
+ if (rc == 0)
+ {
+ KThread* worker;
+ LogMsg ( klogInfo, "KeyringServer: detected connection");
+ rc = KThreadMake ( &worker, WorkerThreadFn, stream);
+ if (rc == 0 && worker != NULL)
+ {
+ KThreadWait(worker, NULL);
+ LogMsg ( klogInfo, "KeyringServer: out of worker");
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KThreadMake failed");
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KNSListen failed");
+ }
+ LogMsg ( klogInfo, "KeyringServer: shutting down");
+
+ /* TODO: make sure no incoming messages get dropped (stop accepting connections? wait for all active threads to exit?)
+ - lock the server */
+
+ if (keyring != NULL)
+ {
+ KeyRingRelease(keyring);
+ keyring = NULL;
+ }
+
+ KSocketRelease(listener);
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KNSMakeListener failed");
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KNSManagerInitIPCEndpoint failed");
+ LogMsg ( klogInfo, "KeyringServer: listener shut down");
+ return rc;
+}
+
+static
+rc_t
+WorkerThreadFn ( const KThread *self, void *data )
+{
+ KStream* stream = (KStream*)data;
+ char buf[256];
+ size_t num;
+ rc_t rc = KStreamReadAll(stream, buf, 1, &num);
+ if (rc == 0)
+ {
+ if (num == 1)
+ {
+ size_t toRead = (unsigned char)buf[0];
+ pLogMsg(klogInfo, "KeyringServer: worker received length=$(l)\n", "l=%d", toRead);
+ rc = KStreamReadAll(stream, buf, toRead, &num);
+ if (rc == 0)
+ {
+ /*pLogMsg(klogInfo, "KeyringServer: worker received msg='$(buf)'\n", "buf=%.*s", num, buf);*/
+ switch (buf[0])
+ {
+ case 'I':
+ if (buf[0] == 'I') /* init */
+ {
+ LogMsg ( klogInfo, "KeyringServer: received Init");
+
+ if (keyring == 0)
+ {
+ const KFile* std_in;
+
+ rc = KFileMakeStdIn ( &std_in );
+ if (rc == 0)
+ {
+ KFile* std_out;
+ rc = KFileMakeStdOut ( &std_out );
+ if (rc == 0)
+ {
+ rc = KeyRingOpen(&keyring, keyRingFileName, std_in, std_out);
+ if (rc == 0)
+ {
+ LogMsg ( klogInfo, "KeyringServer: Init successful");
+ pLogMsg(klogInfo, "KeyringServer: sending '$(buf)'\n", "buf=%.*s", string_size(initMsgSuccess), initMsgSuccess);
+ rc = KStreamWrite(stream, initMsgSuccess, string_size(initMsgSuccess), NULL);
+ }
+ else
+ {
+ rc_t rc2;
+ LogErr(klogErr, rc, "KeyringServer: Init failed");
+ rc2 = KStreamWrite(stream, initMsgFailure, string_size(initMsgFailure), NULL);
+ if (rc == 0)
+ rc = rc2;
+ }
+ KFileRelease(std_out);
+ }
+ KFileRelease(std_in);
+ }
+ }
+ else
+ { /* already running */
+ LogMsg ( klogInfo, "KeyringServer: Init successful");
+ rc = KStreamWrite(stream, initMsgSuccess, string_size(initMsgSuccess), NULL);
+ }
+ }
+ break;
+ case 'X':
+ if (buf[0] == 'X') /* shutDown */
+ {
+ LogMsg ( klogInfo, "KeyringServer: received Shutdown");
+ shutDown = true;
+ }
+ break;
+ case 'P': /* project */
+ if (toRead > 1 && buf[1] == 'A') /* Add */
+ {
+ String pkey;
+ String dlkey;
+ String enckey;
+
+ size_t idx = 2;
+ /*TODO: make sure idx is in range*/
+ StringInit(&pkey, buf + idx + 1, buf[idx], buf[idx]);
+ pkey.len = string_len(pkey.addr, pkey.size);
+
+ idx += pkey.size + 1;
+ /*TODO: make sure idx is in range*/
+ StringInit(&dlkey, buf + idx + 1, buf[idx], buf[idx]);
+ dlkey.len = string_len(dlkey.addr, dlkey.size);
+
+ idx += dlkey.size + 1;
+ /*TODO: make sure idx is in range*/
+ StringInit(&enckey, buf + idx + 1, buf[idx], buf[idx]);
+ enckey.len = string_len(enckey.addr, enckey.size);
+
+ pLogMsg(klogInfo,
+ "KeyringServer: received Project Add(pkey='$(pkey)',dlkey='$(dlkey)',enckey='$(.....)')'\n",
+ "pkey=%.*s,dlkey=%.*s,enckey=%.*s",
+ pkey.len, pkey.addr, dlkey.len, dlkey.addr, enckey.len, enckey.addr);
+
+ rc = KeyRingAddProject(keyring, &pkey, &dlkey, &enckey);
+ if (rc != 0)
+ LogErr(klogErr, rc, "KeyringServer: KeyRingAddProject() failed");
+ }
+ break;
+ default:
+ LogMsg ( klogInfo, "KeyringServer: unrecognised message received");
+ break;
+ }
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KStreamRead(body) failed");
+ }
+ else /* end of stream = the client closed the connection */
+ LogMsg(klogInfo, "KeyringServer: worker received EOF\n");
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KStreamRead(length) failed");
+ LogMsg ( klogInfo, "KeyringServer: worker done");
+ return KThreadRelease(self);
+}
+
+
+rc_t UsageSummary (char const * progname)
+{
+ return 0;
+}
+
+char const UsageDefaultName[] = "keyring-srv";
+
+rc_t CC Usage (const Args * args)
+{
+ return 0;
+}
+
+/*TODO: handle signals */
+/*TODO: handle stale lock files */
+
+rc_t CC KMain (int argc, char * argv[])
+{
+ rc_t rc = 0;
+ KDirectory* wd;
+
+ KLogLevelSet(klogInfo);
+ LogMsg ( klogInfo, "KeyringServer: starting");
+
+ rc = KDirectoryNativeDir (&wd);
+ if (rc == 0)
+ {
+ KFile* lockedFile;
+ const char* dataDir;
+
+ char lockFileName[MAX_PATH];
+ if (argc < 2 || argv[1] == NULL)
+ dataDir = KeyRingDefaultDataDir;
+ else
+ dataDir = argv[1];
+ rc = string_printf(lockFileName, sizeof(lockFileName)-1, NULL, "%s/keyring_lock", dataDir);
+ if (rc == 0)
+ {
+ rc = KDirectoryCreateExclusiveAccessFile(wd, &lockedFile, true, 0600, kcmOpen, "%s", lockFileName);
+ if (rc == 0)
+ {
+ KNSManager* mgr;
+ rc = KNSManagerMake(&mgr);
+ if (rc == 0)
+ {
+ rc = string_printf(keyRingFileName, sizeof(keyRingFileName)-1, NULL, "%s/keyring", dataDir);
+ if (rc == 0)
+ rc = Server(mgr);
+ KNSManagerRelease(mgr);
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KNSManagerMake failed");
+ KFileRelease(lockedFile);
+ LogMsg ( klogInfo, "KeyringServer: removing lock file.");
+ KDirectoryRemove(wd, true, "%s", lockFileName);
+ }
+ else
+ { /*TODO: check for stale lock file*/
+ LogMsg ( klogInfo, "KeyringServer: another instance appears to be running.");
+ rc = 0;
+ }
+ }
+ else
+ LogErr ( klogErr, rc, "KeyringServer: failed to build the lock file name" );
+
+ KDirectoryRelease(wd);
+ }
+ else
+ LogErr(klogErr, rc, "KeyringServer: KDirectoryNativeDir failed");
+
+ LogMsg ( klogInfo, "KeyringServer: finishing");
+
+ return rc;
+}
+
diff --git a/tools/keyring-srv/keyring-srv.c b/tools/keyring-srv/keyring-srv.c
new file mode 100644
index 0000000..d899d43
--- /dev/null
+++ b/tools/keyring-srv/keyring-srv.c
@@ -0,0 +1,522 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "keyring-srv.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <klib/text.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+#include <kfs/toc.h>
+#include <kfs/arc.h>
+#include <kfs/tar.h>
+#include <kfs/impl.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+
+#include "keyring-data.h"
+#include "keyring-database.h"
+
+static rc_t KeyRingInit ( KKeyRing* self, const char* path );
+static rc_t KeyRingWhack ( KKeyRing* self );
+static rc_t CreateDatabase ( KKeyRing* self );
+static rc_t OpenDatabase ( KKeyRing* self );
+
+#define MaxPwdSize 512
+
+struct KKeyRing {
+ KRefcount refcount;
+
+ KDirectory* wd;
+ char* path;
+ char passwd[MaxPwdSize];
+
+ KeyRingData* data;
+};
+
+/* location of the temporary database (pre archiving+encryption */
+const char tmp_path[] = "keyring.temp";
+
+/* returns a NUL-terminated password fitting in the buffer */
+static
+rc_t
+ReadPassword(const struct KFile* pwd_in, size_t* last_pos, char* buf, size_t buf_size)
+{
+string_copy(buf, buf_size, "screwuahole", string_size("screwuahole")); return 0;
+
+ rc_t rc = 0;
+ size_t i =0;
+ do
+ {
+ size_t num_read;
+ if (i == buf_size)
+ return RC(rcApp, rcEncryptionKey, rcReading, rcParam, rcTooLong);
+
+ rc = KFileRead( pwd_in, *last_pos, & buf[i], 1, &num_read );
+ if (rc == 0)
+ {
+ if (num_read != 1)
+ return RC(rcApp, rcEncryptionKey, rcReading, rcSize, rcInvalid);
+
+ if (buf[i] == '\n')
+ {
+ buf[i] = 0;
+ ++ *last_pos;
+ break;
+ }
+ }
+ ++ *last_pos;
+ ++ i;
+ }
+ while(rc == 0);
+ return rc;
+}
+
+static
+rc_t GetNewPassword(const struct KFile* pwd_in, struct KFile* pwd_out, char* buf)
+{
+ rc_t rc = KFileWrite ( pwd_out, 0, KR_PWD_PROMPT_1, string_measure(KR_PWD_PROMPT_1, NULL), NULL);
+ if (rc == 0)
+ {
+ char buf1[MaxPwdSize];
+ size_t last_pos = 0;
+ rc = ReadPassword(pwd_in, & last_pos, buf1, MaxPwdSize);
+ if (rc == 0)
+ {
+ rc = KFileWrite ( pwd_out,
+ string_measure(KR_PWD_PROMPT_1, NULL),
+ KR_PWD_PROMPT_2, string_measure(KR_PWD_PROMPT_2, NULL), NULL );
+ if (rc == 0)
+ {
+ char buf2[MaxPwdSize];
+ rc = ReadPassword(pwd_in, & last_pos, buf2, sizeof(buf2));
+ if (rc == 0)
+ {
+ size_t pwd_size = string_measure(buf1, NULL);
+ if (string_cmp(buf1, pwd_size, buf2, string_measure(buf2, NULL), MaxPwdSize) != 0)
+ rc = RC(rcApp, rcEncryptionKey, rcCreating, rcParam, rcInconsistent);
+ else
+ string_copy(buf, MaxPwdSize, buf1, pwd_size + 1);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t GetPassword(const struct KFile* pwd_in, struct KFile* pwd_out, char* buf)
+{
+ rc_t rc = KFileWrite ( pwd_out, 0, KR_PWD_PROMPT_1, string_measure(KR_PWD_PROMPT_1, NULL), NULL);
+ if (rc == 0)
+ {
+ char buf1[MaxPwdSize];
+ size_t last_pos = 0;
+ rc = ReadPassword(pwd_in, & last_pos, buf1, MaxPwdSize);
+ if (rc == 0)
+ string_copy(buf, MaxPwdSize, buf1, string_measure(buf1, NULL) + 1);
+ }
+ return rc;
+}
+
+rc_t KeyRingOpen(KKeyRing** self, const char* path, const struct KFile* pwd_in, struct KFile* pwd_out)
+{
+ rc_t rc;
+ assert(self && path && pwd_in && pwd_out);
+
+ *self = (KKeyRing*) malloc(sizeof(**self));
+ if (*self)
+ {
+ rc = KeyRingInit(*self, path);
+ if (rc == 0)
+ {
+ rc = KeyRingAddRef(*self);
+ if (rc == 0)
+ {
+ KDirectory* wd;
+ rc = KDirectoryNativeDir(&wd);
+ if (rc == 0)
+ { /* open the database */
+ if (KDirectoryPathType(wd, "%s", (*self)->path) == kptFile)
+ rc = GetPassword(pwd_in, pwd_out, (*self)->passwd);
+ else /* does not exist; create first */
+ {
+ rc = GetNewPassword(pwd_in, pwd_out, (*self)->passwd);
+ if (rc == 0)
+ rc = CreateDatabase(*self);
+ }
+ if (rc == 0)
+ rc = OpenDatabase(*self);
+
+ {
+ rc_t rc2;
+ rc2 = KDirectoryRelease(wd);
+ if (rc == 0)
+ rc = rc2;
+ }
+ }
+ }
+
+ if (rc != 0)
+ {
+ KeyRingWhack(*self);
+ *self = NULL;
+ }
+ }
+ else
+ {
+ free(*self);
+ *self = NULL;
+ }
+ }
+ else
+ rc = RC ( rcApp, rcDatabase, rcOpening, rcMemory, rcExhausted );
+
+ return rc;
+}
+
+rc_t KeyRingInit ( KKeyRing* self, const char* path )
+{
+ rc_t rc;
+
+ memset ( self, 0, sizeof * self );
+ KRefcountInit ( & self -> refcount, 0, "KKeyRing", "init", "" );
+
+ rc = KDirectoryNativeDir(&self->wd);
+ if (rc == 0)
+ {
+ self->path = string_dup(path, string_size(path));
+ if (self->path)
+ {
+ self->data = (KeyRingData*) malloc(sizeof(*self->data));
+ if (self->data)
+ {
+ rc = KeyRingDataInit ( self->data );
+ if (rc != 0)
+ free(self->data);
+ }
+ else
+ rc = RC ( rcApp, rcDatabase, rcOpening, rcMemory, rcExhausted );
+
+ if (rc != 0)
+ free(self->path);
+ }
+ else
+ rc = RC ( rcApp, rcDatabase, rcOpening, rcMemory, rcExhausted );
+
+ if (rc != 0)
+ KDirectoryRelease(self->wd);
+ }
+
+ return rc;
+}
+
+rc_t KeyRingWhack(KKeyRing* self)
+{
+ KeyRingDataWhack( self->data );
+ free(self->data);
+ free(self->path);
+ KDirectoryRelease(self->wd);
+ free(self);
+ return 0;
+}
+
+rc_t KeyRingAddRef(KKeyRing* self)
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "KKeyRing" ) )
+ {
+ case krefLimit:
+ return RC ( rcApp, rcEncryptionKey, rcAttaching, rcRange, rcExcessive );
+ }
+ }
+ return 0;
+}
+
+rc_t KeyRingRelease(KKeyRing* self)
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "KKeyRing" ) )
+ {
+ case krefWhack:
+ KeyRingWhack ( self );
+ break;
+ case krefNegative:
+ return RC ( rcApp, rcEncryptionKey, rcReleasing, rcRange, rcExcessive );
+ }
+ }
+ return 0;
+}
+
+static
+rc_t copy_file (const KFile * fin, KFile *fout)
+{
+ rc_t rc;
+ uint8_t buff [64 * 1024];
+ size_t num_read;
+ uint64_t inpos;
+ uint64_t outpos;
+
+ assert (fin != NULL);
+ assert (fout != NULL);
+
+ inpos = 0;
+ outpos = 0;
+
+ do
+ {
+ rc = KFileRead (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc != 0)
+ {
+ PLOGERR (klogErr, (klogErr, rc,
+ "Failed to read from directory structure in creating archive at $(P)",
+ PLOG_U64(P), inpos));
+ break;
+ }
+ else if (num_read > 0)
+ {
+ size_t to_write;
+
+ inpos += (uint64_t)num_read;
+
+ to_write = num_read;
+ while (to_write > 0)
+ {
+ size_t num_writ;
+ rc = KFileWrite (fout, outpos, buff, num_read, &num_writ);
+ if (rc != 0)
+ {
+ PLOGERR (klogErr, (klogErr, rc,
+ "Failed to write to archive in creating archive at $(P)",
+ PLOG_U64(P), outpos));
+ break;
+ }
+ outpos += num_writ;
+ to_write -= num_writ;
+ }
+ }
+ if (rc != 0)
+ break;
+ } while (num_read != 0);
+ return rc;
+}
+
+rc_t ArchiveAndEncrypt(KDirectory* wd, const char* inpath, const char* outpath, const char* passwd)
+{
+ const KDirectory* d;
+ rc_t rc = KDirectoryOpenDirRead (wd, &d, false, "%s", inpath);
+ if (rc == 0)
+ {
+ const KFile* infile;
+ rc_t rc2;
+
+ rc = KDirectoryOpenTocFileRead (d, &infile, 4, NULL, NULL, NULL);
+ if (rc == 0)
+ {
+ KFile* outfile;
+
+ /* if the file exists, add write access */
+ KDirectorySetAccess( wd, false, 0600, 0777, "%s", outpath );
+ rc = KDirectoryCreateFile(wd, &outfile, false, 0600, kcmCreate|kcmInit, "%s", outpath);
+ if ( rc == 0 )
+ {
+ KFile* enc_outfile;
+ KKey key;
+ rc = KKeyInitRead(&key, kkeyAES256, passwd, string_measure(passwd, NULL));
+ if ( rc == 0 )
+ rc = KEncFileMakeWrite(&enc_outfile, outfile, &key);
+
+ if (rc == 0)
+ rc = copy_file(infile, enc_outfile);
+
+ rc2 = KFileRelease(outfile);
+ if (rc == 0)
+ rc = rc2;
+ /* remove write access */
+ rc2 = KDirectorySetAccess( wd, false, 0400, 0777, "%s", outpath );
+ if (rc == 0)
+ rc = rc2;
+ rc2 = KFileRelease(enc_outfile);
+ if (rc == 0)
+ rc = rc2;
+ }
+ rc2 = KFileRelease(infile);
+ if (rc == 0)
+ rc = rc2;
+ }
+ rc2 = KDirectoryRelease(d);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+rc_t CreateDatabase(KKeyRing* self)
+{ /* database is presumed write-locked */
+ rc_t rc;
+
+ assert(self);
+
+ KDirectoryRemove(self->wd, true, "%s", tmp_path); /* in case exists */
+ rc = KeyRingDatabaseSave(self->data, self->wd, tmp_path);
+ if (rc == 0)
+ {
+ rc_t rc2;
+ rc = ArchiveAndEncrypt(self->wd, tmp_path, self->path, self->passwd);
+
+ rc2 = KDirectoryRemove(self->wd, true, "%s", tmp_path);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+rc_t OpenDatabase(KKeyRing* self)
+{
+ rc_t rc;
+ const KFile* enc_infile;
+
+ assert(self);
+ rc = KDirectoryOpenFileRead(self->wd, &enc_infile, "%s", self->path);
+ if ( rc == 0)
+ {
+ rc_t rc2;
+ const KFile* infile;
+ KKey key;
+ rc = KKeyInitRead(&key, kkeyAES256, self->passwd, string_measure(self->passwd, NULL));
+ if ( rc == 0 )
+ {
+ rc = KEncFileMakeRead (&infile, enc_infile, &key);
+ if (rc == 0)
+ {
+ const KDirectory* arc;
+ rc = KDirectoryOpenArcDirRead_silent_preopened(self->wd, &arc, true, "/keyring", tocKFile, (void*)infile, KArcParseSRA, NULL, NULL);
+ if (rc == 0)
+ {
+ /* Hack: we violate the KDirectory object interface in order for VDBManagerMakeUpdate to succeed,
+ since it would refuse to open a read-only dir (i.e. archive);
+ We will only read from the object, though.
+ */
+ ((KDirectory*)arc)->read_only = false;
+ rc = KeyRingDatabaseLoad(self->data, arc, "/keyring");
+ rc2 = KDirectoryRelease(arc);
+ if (rc == 0)
+ rc = rc2;
+ }
+ rc2 = KFileRelease(infile);
+ if (rc == 0)
+ rc = rc2;
+ }
+ }
+
+ rc2 = KFileRelease(enc_infile);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+rc_t KeyRingAddProject(KKeyRing* self, const String* name, const String* download_ticket, const String* encryption_key)
+{
+ rc_t rc = 0;
+
+ assert(self && name && download_ticket && encryption_key);
+
+ /*TODO: write-lock database */
+ rc = KeyRingDataAddProject(self->data, name, download_ticket, encryption_key);
+ if (rc == 0)
+ rc = CreateDatabase(self);
+ /*TODO: unlock database */
+ return rc;
+}
+
+rc_t KeyRingGetProject(KKeyRing* self, const String* name, String* download_ticket, String* encryption_key)
+{
+ rc_t rc = 0;
+ const Project* p;
+
+ assert(self && name && download_ticket && encryption_key);
+
+ p = KeyRingDataGetProject(self->data, name);
+ if (p != NULL)
+ {
+ StringInit(download_ticket, p->download_ticket->addr, p->download_ticket->len, p->download_ticket->size);
+ StringInit(encryption_key, p->encryption_key->addr, p->encryption_key->len, p->encryption_key->size);
+ }
+ else
+ rc = RC(rcApp, rcDatabase, rcSearching, rcName, rcNotFound);
+ return rc;
+}
+
+rc_t KeyRingAddObject(KKeyRing* self,
+ const struct String* object_name,
+ const struct String* project_name,
+ const struct String* display_name,
+ uint64_t size,
+ const struct String* checksum)
+{
+ rc_t rc = 0;
+ const Project* p;
+
+ assert(self && object_name && project_name && display_name && checksum);
+
+ /*TODO: write-lock database */
+ p = KeyRingDataGetProject(self->data, project_name);
+ if (p != NULL)
+ {
+ rc = KeyRingDataAddObject(self->data, object_name, project_name, display_name, size, checksum, p->encryption_key);
+ if (rc == 0)
+ rc = CreateDatabase(self);
+ }
+ else
+ rc = RC(rcApp, rcDatabase, rcSearching, rcName, rcNotFound);
+ /*TODO: unlock database */
+
+ return rc;
+}
+
+rc_t KeyRingGetKey(KKeyRing* self, const struct String* object_name, struct String* encryption_key)
+{
+ rc_t rc = 0;
+ const Object* obj;
+
+ assert(self && object_name && encryption_key);
+
+ obj = KeyRingDataGetObject(self->data, object_name);
+ if (obj != NULL)
+ StringInit(encryption_key, obj->encryption_key->addr, obj->encryption_key->len, obj->encryption_key->size);
+ else
+ rc = RC(rcApp, rcDatabase, rcSearching, rcName, rcNotFound);
+ return rc;
+}
diff --git a/tools/keyring-srv/keyring-srv.h b/tools/keyring-srv/keyring-srv.h
new file mode 100644
index 0000000..11dea86
--- /dev/null
+++ b/tools/keyring-srv/keyring-srv.h
@@ -0,0 +1,101 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_keyring_srv_
+#define _h_keyring_srv_
+
+#include <klib/rc.h>
+#include <klib/refcount.h>
+
+struct KFile;
+struct String;
+
+typedef struct KKeyRing KKeyRing;
+struct KKeyRing;
+
+#define KR_PWD_PROMPT_1 "Password:\n"
+#define KR_PWD_PROMPT_2 "Retype Password:\n"
+
+/* KeyRingOpen
+ * kr - [ OUT ] the keyring object
+ * path - [ IN ] the POSIX path to the database file
+ * pwd_in - [ IN ] a file object to read database password from
+ * pwd_out - [ IN ] a file object to print password prompts to
+ *
+ * If the database file exists, will prompt to pwd_out for a password, read the password from pwd_in, and use the password to open the database
+ * If the database file does not exist, will prompt for a password twice and create the database if passwords match
+ *
+ * returns:
+ * - database file exists, the supplied password is incorrect
+ * - database file does not exist, passwords do not match
+ */
+extern rc_t KeyRingOpen(KKeyRing** kr, const char* path, const struct KFile* pwd_in, struct KFile* pwd_out);
+
+/* KeyRingAddRef
+ */
+extern rc_t KeyRingAddRef(KKeyRing* kr);
+
+/* KeyRingRelease
+ */
+extern rc_t KeyRingRelease(KKeyRing* kr);
+
+/* KeyRingAddProject
+ * Saves the project with associated download ticket and encryption key.
+ * If the project under this name already exists, the ticket/key will be overwritten as necessary.
+ * Will update the database file. May block/timeout if the file is locked.
+ */
+extern rc_t KeyRingAddProject(KKeyRing* kr,
+ const struct String* name,
+ const struct String* download_ticket,
+ const struct String* encryption_key);
+
+/* KeyRingGetProject
+ * Retrieves a project's download ticket and encryption key by the project's name.
+ * (TODO: Keys are returned as pointers into shared memory)
+ * (TODO: Should it check if the database file needs to be reloaded?)
+ */
+extern rc_t KeyRingGetProject(KKeyRing* kr, const struct String* name, struct String* download_ticket, struct String* encryption_key);
+
+/* KeyRingAddObject
+ * Saves an object in association with a project.
+ * If the project under this name already exists, it will be overwritten as necessary.
+ * Will update the database file. May block/timeout if the file is locked.
+ */
+extern rc_t KeyRingAddObject(KKeyRing* kr,
+ const struct String* object_name,
+ const struct String* project_name,
+ const struct String* display_name,
+ uint64_t size,
+ const struct String* checksum);
+
+/* KeyRingGetKey
+ * Retrieves an encryption key associated with the given object.
+ * (TODO: Keys are returned as pointers into shared memory)
+ * (TODO: Should it check if the database file needs to be reloaded?)
+ */
+extern rc_t KeyRingGetKey(KKeyRing* kr, const struct String* object_name, struct String* encryption_key);
+
+#endif /* _h_keyring_srv_ */
diff --git a/tools/kget/Makefile b/tools/kget/Makefile
new file mode 100644
index 0000000..2fbc1f4
--- /dev/null
+++ b/tools/kget/Makefile
@@ -0,0 +1,77 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/kget
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ kget
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# kget
+#
+TOOL_SRC = \
+ kget
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+TOOL_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/kget: $(TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TOOL_LIB)
+
diff --git a/tools/kget/examples.sh b/tools/kget/examples.sh
new file mode 100755
index 0000000..67cf37b
--- /dev/null
+++ b/tools/kget/examples.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+execute()
+{
+ echo "------------------------------------------------------"
+ echo $1
+ eval $1
+ echo "."
+}
+
+ACC="NC_011748.1"
+URL=`srapath $ACC`
+CACHEFILE="cache.dat"
+PROXY="localhost:8080"
+
+echo "example number 1: show the size of the remote file ( HEAD request )"
+execute "time kget $URL --show-size"
+
+echo "example number 2: download the remote file, no buffering, no cachefile"
+echo " in 32k blocks, using HTTPFile, filename extracted from URL"
+execute "time kget $URL"
+
+echo "example number 3: download the remote file, wget-style: without partial requests"
+echo " filename extracted from URL"
+execute "time kget $URL --full"
+
+echo "example number 4: download the remote file, no buffering, no cachefile"
+echo " in 32k blocks, using HTTPFile, filename different from URL"
+execute "time kget $URL some_reference.dat"
+
+echo "example number 5: download the remote file, no buffering, no cachefile"
+echo " in 32k blocks, using ReliableHTTPFile"
+execute "time kget $URL some_reference.dat --reliable"
+
+echo "example number 6: download the remote file, no buffering, no cachefile"
+echo " in 128k blocks, using HTTPFile"
+#blocksize of 128 kilobyte can be expressed as '128k' or '131072' or '0x020000'
+execute "time kget $URL --block-size 128k"
+
+echo "example number 7: download the remote file, no cachefile"
+echo " in 32k blocks, wraped in a buffer-file with 128k blocks"
+execute "time kget $URL --buffer 128k"
+
+echo "example number 8: download the remote file, using a cache-file "
+echo " ( dflt cache-blocksize of 128 k ) in 32k blocks, "
+execute "rm -f $CACHEFILE"
+execute "time kget $URL --cache $CACHEFILE"
+
+echo "example number 9: download the remote file, using a cache-file"
+echo " ( cache-blocksize of 256 k ) in 32k blocks, "
+execute "rm -f $CACHEFILE"
+execute "time kget $URL --cache $CACHEFILE --cache-block 256k"
+
+echo "example number 10: download the remote file, no buffering, no cachefile"
+echo " in 32k blocks, but requests are made in random order"
+execute "time kget $URL --random"
+
+#enable this example only after updating the PROXY-variable
+#and actually having a running proxy there!
+#echo "example number X: download the remote file, using a proxy"
+#echo " in 32k blocks, "
+#execute "time kget $URL --proxy $PROXY"
diff --git a/tools/kget/kget.c b/tools/kget/kget.c
new file mode 100644
index 0000000..da9bf79
--- /dev/null
+++ b/tools/kget/kget.c
@@ -0,0 +1,941 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/time.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/cacheteefile.h>
+//#include <kfs/big_block_reader.h>
+
+#include <kns/manager.h>
+#include <kns/kns-mgr-priv.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <kproc/timeout.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/*===========================================================================
+
+ kget is a works like a simple version of wget
+
+ =========================================================================== */
+
+const char UsageDefaultName[] = "kget";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s <path> [<path> ...] [options]\n"
+ "\n", progname);
+}
+
+
+#define OPTION_VERB "verb"
+#define ALIAS_VERB "b"
+static const char * verb_usage[] = { "execute verbose", NULL };
+
+#define OPTION_BLOCK "block-size"
+#define ALIAS_BLOCK "s"
+static const char * block_usage[] = { "how many bytes per block", NULL };
+
+#define OPTION_SHOW "show-size"
+#define ALIAS_SHOW "w"
+static const char * show_usage[] = { "query size of remote file first", NULL };
+
+#define OPTION_CACHE "cache"
+#define ALIAS_CACHE "c"
+static const char * cache_usage[] = { "wrap the remote-file into a KCacheTeeFile", NULL };
+
+#define OPTION_CACHE_BLK "cache-block"
+static const char * cache_blk_usage[] = { "blocksize inside a KCacheTeeFile", NULL };
+
+#define OPTION_PROXY "proxy"
+static const char * proxy_usage[] = { "use a proxy to download remote file", NULL };
+
+#define OPTION_RAND "random"
+#define ALIAS_RAND "r"
+static const char * random_usage[] = { "request blocks in random order", NULL };
+
+#define OPTION_REP "repeat"
+#define ALIAS_REP "e"
+static const char * repeat_usage[] = { "request blocks with repeats if in random order", NULL };
+
+#define OPTION_CREPORT "report"
+#define ALIAS_CREPORT "p"
+static const char * creport_usage[] = { "report cache usage", NULL };
+
+#define OPTION_COMPLETE "complete"
+static const char * complete_usage[] = { "check if 1st parameter is a complete", NULL };
+
+#define OPTION_TRUNC "truncate"
+static const char * truncate_usage[] = { "truncate the file ( 1st parameter ) / remove trailing cache-bitmap", NULL };
+
+#define OPTION_START "start"
+static const char * start_usage[] = { "offset where to read from", NULL };
+
+#define OPTION_COUNT "count"
+static const char * count_usage[] = { "number of bytes to read", NULL };
+
+#define OPTION_PROGRESS "progress"
+static const char * progress_usage[] = { "show progress", NULL };
+
+#define OPTION_RELIABLE "reliable"
+static const char * reliable_usage[] = { "use reliable version of http-file", NULL };
+
+#define OPTION_BUFFER "buffer"
+#define ALIAS_BUFFER "u"
+static const char * buffer_usage[] = { "wrap remote file into KBufFile with this buffer-size", NULL };
+
+#define OPTION_SLEEP "sleep"
+#define ALIAS_SLEEP "i"
+static const char * sleep_usage[] = { "sleep inbetween requests by this amount of ms", NULL };
+
+#define OPTION_TIMEOUT "timeout"
+#define ALIAS_TIMEOUT "m"
+static const char * timeout_usage[] = { "use timed read with tis amount of ms as timeout", NULL };
+
+#define OPTION_CCOMPL "cache-complete"
+#define ALIAS_CCOMPL "a"
+static const char * ccompl_usage[] = { "check completeness on open cacheteefile", NULL };
+
+#define OPTION_FULL "full"
+#define ALIAS_FULL "f"
+static const char * full_usage[] = { "download via one http-request, not partial requests in a loop", NULL };
+
+OptDef MyOptions[] =
+{
+/* name alias fkt usage-txt, cnt, needs value, required */
+ { OPTION_VERB, ALIAS_VERB, NULL, verb_usage, 1, false, false },
+ { OPTION_BLOCK, ALIAS_BLOCK, NULL, block_usage, 1, true, false },
+ { OPTION_SHOW, ALIAS_SHOW, NULL, show_usage, 1, false, false },
+ { OPTION_CACHE, ALIAS_CACHE, NULL, cache_usage, 1, true, false },
+ { OPTION_CACHE_BLK, NULL, NULL, cache_blk_usage, 1, true, false },
+ { OPTION_PROXY, NULL, NULL, proxy_usage, 1, true, false },
+ { OPTION_RAND, ALIAS_RAND, NULL, random_usage, 1, false, false },
+ { OPTION_REP, ALIAS_REP, NULL, repeat_usage, 1, false, false },
+ { OPTION_CREPORT, ALIAS_CREPORT, NULL, creport_usage, 1, false, false },
+ { OPTION_BUFFER, ALIAS_BUFFER, NULL, buffer_usage, 1, true, false },
+ { OPTION_SLEEP, ALIAS_SLEEP, NULL, sleep_usage, 1, true, false },
+ { OPTION_TIMEOUT, ALIAS_TIMEOUT, NULL, timeout_usage, 1, true, false },
+ { OPTION_COMPLETE, NULL, NULL, complete_usage, 1, false, false },
+ { OPTION_CCOMPL, ALIAS_CCOMPL, NULL, ccompl_usage, 1, false, false },
+ { OPTION_TRUNC, NULL, NULL, truncate_usage, 1, false, false },
+ { OPTION_START, NULL, NULL, start_usage, 1, true, false },
+ { OPTION_COUNT, NULL, NULL, count_usage, 1, true, false },
+ { OPTION_PROGRESS, NULL, NULL, progress_usage, 1, false, false },
+ { OPTION_RELIABLE, NULL, NULL, reliable_usage, 1, false, false },
+ { OPTION_FULL, ALIAS_FULL, NULL, full_usage, 1, false, false }
+};
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ uint32_t i;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+
+ HelpOptionsStandard ();
+ for ( i = 0; i < sizeof ( MyOptions ) / sizeof ( MyOptions[ 0 ] ); ++i )
+ HelpOptionLine ( MyOptions[i].aliases, MyOptions[i].name, NULL, MyOptions[i].help );
+
+ return rc;
+}
+
+typedef struct fetch_ctx
+{
+ const char *url;
+ const char *destination;
+ const char *cache_file;
+ const char * proxy;
+ size_t blocksize;
+ size_t start, count;
+ size_t buffer_size;
+ size_t sleep_time;
+ size_t timeout_time;
+ size_t cache_blk;
+ bool verbose;
+ bool show_filesize;
+ bool random;
+ bool with_repeats;
+ bool show_curl_version;
+ bool report_cache;
+ bool check_cache_complete;
+ bool check_completeness;
+ bool truncate_cache;
+ bool local_read_only;
+ bool show_progress;
+ bool reliable;
+ bool full_download;
+} fetch_ctx;
+
+
+static rc_t src_2_dst( const KFile *src, KFile *dst, char * buffer,
+ uint64_t pos, size_t * num_read, fetch_ctx * ctx )
+{
+ rc_t rc;
+ size_t n_transfer = ( ctx->count == 0 ? ctx->blocksize : ctx->count );
+
+ if ( ctx->timeout_time == 0 )
+ rc = KFileReadAll ( src, pos, buffer, n_transfer, num_read );
+ else
+ {
+ timeout_t tm;
+ rc = TimeoutInit ( &tm, ctx->timeout_time );
+ if ( rc == 0 )
+ rc = KFileTimedReadAll ( src, pos, buffer, n_transfer, num_read, &tm );
+ }
+ if ( rc == 0 && *num_read > 0 )
+ {
+ size_t num_writ;
+ rc = KFileWriteAll ( dst, pos, buffer, *num_read, &num_writ );
+ }
+ return rc;
+}
+
+
+static rc_t block_loop_in_order( const KFile *src, KFile *dst, char * buffer,
+ uint64_t * bytes_copied, fetch_ctx * ctx )
+{
+ rc_t rc = 0;
+ uint64_t pos = 0;
+ uint32_t blocks = 0;
+ size_t num_read = 1;
+ KOutMsg( "copy-mode : linear read/write\n" );
+ while ( rc == 0 && num_read > 0 )
+ {
+ rc = src_2_dst( src, dst, buffer, pos, &num_read, ctx );
+ if ( rc == 0 ) pos += num_read;
+ if ( ctx->show_progress && ( ( blocks & 0x0F ) == 0 ) ) KOutMsg( "." );
+ blocks++;
+ if ( ctx->sleep_time > 0 ) KSleepMs( ctx->sleep_time );
+ }
+ *bytes_copied = pos;
+ if ( ctx->show_progress ) KOutMsg( "\n" );
+ KOutMsg( "%d blocks a %d bytes\n", blocks, ctx->blocksize );
+ return rc;
+}
+
+
+
+static uint32_t randr( uint32_t min, uint32_t max )
+{
+ double scaled = ( ( double )rand() / RAND_MAX );
+ return ( ( max - min + 1 ) * scaled ) + min;
+}
+
+
+static rc_t block_loop_random( const KFile *src, KFile *dst, char * buffer,
+ uint64_t *bytes_copied, fetch_ctx * ctx )
+{
+ uint64_t src_size;
+ rc_t rc = KFileSize ( src, &src_size );
+ KOutMsg( "copy-mode : random blocks\n" );
+ if ( rc == 0 )
+ {
+ rc = KFileSetSize ( dst, src_size );
+ if ( rc == 0 )
+ {
+ uint32_t block_count = ( src_size / ctx->blocksize ) + 1;
+ uint32_t * block_vector = malloc( block_count * ( sizeof * block_vector ) );
+ if ( block_vector != NULL )
+ {
+ uint32_t loop;
+
+ /* fill the block_vector with ascending numbers */
+ for ( loop = 0; loop < block_count; loop++ )
+ block_vector[ loop ] = loop;
+
+ /* randomize them */
+ for ( loop = 0; loop < block_count; loop++ )
+ {
+ uint32_t src_idx = randr( 0, block_count - 1 );
+ uint32_t dst_idx = randr( 0, block_count - 1 );
+ /* swap it... */
+ uint32_t tmp = block_vector[ dst_idx ];
+ block_vector[ dst_idx ] = block_vector[ src_idx ];
+ block_vector[ src_idx ] = tmp;
+ }
+
+ for ( loop = 0; rc == 0 && loop < block_count; loop++ )
+ {
+ size_t num_read;
+ uint64_t pos = ctx->blocksize;
+ pos *= block_vector[ loop ];
+ rc = src_2_dst( src, dst, buffer, pos, &num_read, ctx );
+ if ( rc == 0 ) *bytes_copied += num_read;
+ if ( ctx->show_progress && ( ( loop & 0x0F ) == 0 ) ) KOutMsg( "." );
+ if ( ctx->sleep_time > 0 ) KSleepMs( ctx->sleep_time );
+
+ }
+ free( block_vector );
+ if ( ctx->show_progress ) KOutMsg( "\n" );
+ KOutMsg( "%d blocks a %d bytes\n", loop, ctx->blocksize );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t copy_file( const KFile * src, KFile * dst, fetch_ctx * ctx )
+{
+ rc_t rc = 0;
+ size_t buffer_size = ( ctx->count == 0 ? ctx->blocksize : ctx->count );
+ char * buffer = malloc( buffer_size );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcPacking, rcMemory, rcExhausted );
+ KOutMsg( "cant make buffer of size %u\n", buffer_size );
+ }
+ else
+ {
+ uint64_t bytes_copied = 0;
+ if ( ctx->count == 0 )
+ {
+ if ( ctx->random )
+ rc = block_loop_random( src, dst, buffer, &bytes_copied, ctx );
+ else
+ rc = block_loop_in_order( src, dst, buffer, &bytes_copied, ctx );
+ }
+ else
+ {
+ size_t num_read;
+ rc = src_2_dst( src, dst, buffer, ctx->start, &num_read, ctx );
+ if ( rc == 0 ) bytes_copied = num_read;
+ }
+ KOutMsg( "%lu bytes copied\n", bytes_copied );
+ free( buffer );
+ }
+ return rc;
+}
+
+
+#define CACHE_TEE_DEFAULT_BLOCKSIZE ( 32 * 1024 * 4 )
+
+static rc_t fetch_cached( KDirectory *dir, const KFile *src, KFile *dst, fetch_ctx *ctx )
+{
+ size_t bs = ctx->cache_blk == 0 ? CACHE_TEE_DEFAULT_BLOCKSIZE : ctx->cache_blk;
+ rc_t rc = KOutMsg( "persistent cache created : '%s' (blk-size: %d)\n", ctx->cache_file, bs );
+ if ( rc == 0 )
+ {
+ const KFile *tee; /* this is the file that forks persistent_content with remote */
+ rc = KDirectoryMakeCacheTee ( dir, /* the KDirectory for the the sparse-file */
+ &tee, /* the newly created cache-tee-file */
+ src, /* the file that we are wrapping ( usually the remote http-file ) */
+ ctx->cache_blk, /* how big one block in the cache-tee-file will be */
+ ctx->cache_file ); /* the sparse-file we use write to */
+ if ( rc == 0 )
+ {
+ KOutMsg( "cache tee created\n" );
+ rc = copy_file( tee, dst, ctx );
+ KFileRelease( tee );
+ }
+ }
+ return rc;
+}
+
+
+static void extract_name( char ** dst, const char * url )
+{
+ char * last_slash = string_rchr ( url, string_size( url ), '/' );
+ if ( last_slash == NULL )
+ *dst = string_dup_measure( "out.bin", NULL );
+ else
+ *dst = string_dup_measure( last_slash + 1, NULL );
+}
+
+
+static rc_t fetch_from( KDirectory *dir, fetch_ctx *ctx, char * outfile,
+ const KFile * src )
+{
+ uint64_t file_size;
+ rc_t rc = KFileSize( src, &file_size );
+ if ( rc != 0 )
+ KOutMsg( "cannot disover src-size >%R<\n", rc );
+ else
+ {
+ KFile *dst;
+ KOutMsg( "src-size = %lu\n", file_size );
+ rc = KDirectoryCreateFile ( dir, &dst, false, 0664, kcmInit, outfile );
+ if ( rc == 0 )
+ {
+ KOutMsg( "dst >%s< created\n", outfile );
+ if ( rc == 0 )
+ {
+ if ( ctx->cache_file != NULL )
+ rc = fetch_cached( dir, src, dst, ctx );
+ else
+ rc = copy_file( src, dst, ctx );
+ }
+ KFileRelease( dst );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t make_remote_file( struct KNSManager * kns_mgr, const KFile ** src, fetch_ctx * ctx )
+{
+ rc_t rc;
+
+ KNSManagerSetVerbose( kns_mgr, ctx->verbose );
+ if ( ctx->reliable )
+ rc = KNSManagerMakeReliableHttpFile( kns_mgr, src, NULL, 0x01010000, ctx->url );
+ else
+ rc = KNSManagerMakeHttpFile( kns_mgr, src, NULL, 0x01010000, ctx->url );
+
+ if ( rc != 0 )
+ {
+ if ( ctx->reliable )
+ (void)LOGERR( klogInt, rc, "KNSManagerMakeReliableHttpFile() failed" );
+ else
+ (void)LOGERR( klogInt, rc, "KNSManagerMakeHttpFile() failed" );
+ }
+ else
+ {
+ if ( ctx->buffer_size > 0 )
+ {
+ const KFile * temp_file;
+ rc = KBufFileMakeRead ( & temp_file, *src, ctx->buffer_size );
+ if ( rc == 0 )
+ {
+ KOutMsg( "remote-file wrapped in new big-block-reader of size %d\n", ctx->buffer_size );
+ KFileRelease ( *src );
+ *src = temp_file;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t fetch( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = 0;
+ char * outfile;
+ const KFile * remote;
+ struct KNSManager * kns_mgr;
+
+ if ( ctx->destination == NULL )
+ extract_name( &outfile, ctx->url );
+ else
+ outfile = string_dup_measure( ctx->destination, NULL );
+
+ KOutMsg( "fetching: >%s<\n", ctx->url );
+ KOutMsg( "into : >%s<\n", outfile );
+ if ( ctx->count > 0 )
+ KOutMsg( "range : %u.%u\n", ctx->start, ctx->count );
+
+ rc = KNSManagerMake ( &kns_mgr );
+ if ( rc != 0 )
+ (void)LOGERR( klogInt, rc, "KNSManagerMake() failed" );
+ else
+ {
+ if ( ctx->proxy != NULL )
+ {
+ rc = KNSManagerSetHTTPProxyPath( kns_mgr, "%s", ctx->proxy );
+ if ( rc != 0 )
+ (void)LOGERR( klogInt, rc, "KNSManagerSetHTTPProxyPath() failed" );
+ }
+ if ( rc == 0 )
+ {
+ rc = make_remote_file( kns_mgr, &remote, ctx );
+ if ( rc == 0 )
+ {
+ rc = fetch_from( dir, ctx, outfile, remote );
+ KFileRelease( remote );
+ }
+ }
+ KNSManagerRelease( kns_mgr );
+ }
+
+ free( outfile );
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+static rc_t show_size( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = KOutMsg( "source: >%s<\n", ctx->url );
+ if ( rc == 0 )
+ {
+ struct KNSManager * kns_mgr;
+ rc = KNSManagerMake ( &kns_mgr );
+ if ( rc != 0 )
+ (void)LOGERR( klogInt, rc, "KNSManagerMake() failed" );
+ else
+ {
+ const KFile * remote;
+ rc = make_remote_file( kns_mgr, &remote, ctx );
+ if ( rc == 0 )
+ {
+ uint64_t file_size;
+ rc = KFileSize( remote, &file_size );
+ KOutMsg( "file-size = %u\n", file_size );
+ KFileRelease( remote );
+ }
+ KNSManagerRelease( kns_mgr );
+ }
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+/* check cache completeness on raw file in the filesystem */
+static rc_t check_cache_complete( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = KOutMsg( "checking if this cache file >%s< is complete\n", ctx->url );
+ if ( rc == 0 )
+ {
+ const KFile *f;
+ rc = KDirectoryOpenFileRead( dir, &f, "%s", ctx->url );
+ if ( rc == 0 )
+ {
+ bool is_complete;
+ rc = IsCacheFileComplete( f, &is_complete );
+ if ( rc != 0 )
+ KOutMsg( "error performing IsCacheFileComplete() %R\n", rc );
+ else
+ {
+ if ( is_complete )
+ KOutMsg( "the file is complete\n" );
+ else
+ {
+ float percent = 0;
+ uint64_t bytes_cached;
+ rc = GetCacheCompleteness( f, &percent, &bytes_cached );
+ if ( rc == 0 )
+ KOutMsg( "the file is %f%% complete ( %lu bytes are cached )\n", percent, bytes_cached );
+ }
+ }
+ KFileRelease( f );
+ }
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+static rc_t fetch_loop( const KFile * src, fetch_ctx *ctx )
+{
+ rc_t rc = 0;
+ size_t buffer_size = ( ctx->count == 0 ? ctx->blocksize : ctx->count );
+ char * buffer = malloc( buffer_size );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcPacking, rcMemory, rcExhausted );
+ KOutMsg( "cant make buffer of size %u\n", buffer_size );
+ }
+ else
+ {
+ uint64_t pos = 0;
+ size_t num_read = 0;
+ do
+ {
+ rc = KFileReadAll( src, pos, buffer, buffer_size, &num_read );
+ if ( rc == 0 )
+ pos += num_read;
+ } while ( rc == 0 && num_read > 0 );
+ KOutMsg( "%lu bytes copied\n", pos );
+ free( buffer );
+ }
+ return rc;
+}
+
+
+/* check cache completeness on a open cacheteefile */
+static rc_t check_cache_completeness( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = KOutMsg( "check if IsCacheTeeComplete() works as intended\n" );
+ if ( rc == 0 )
+ {
+ struct KNSManager * kns_mgr;
+ rc = KNSManagerMake ( &kns_mgr );
+ if ( rc != 0 )
+ (void)LOGERR( klogInt, rc, "KNSManagerMake() failed" );
+ else
+ {
+ const KFile * remote;
+ rc = make_remote_file( kns_mgr, &remote, ctx );
+ if ( rc == 0 )
+ {
+ const KFile *tee; /* this is the file that forks persistent_content with remote */
+ rc = KDirectoryMakeCacheTee ( dir, /* the KDirectory for the the sparse-file */
+ &tee, /* the newly created cache-tee-file */
+ remote, /* the file that we are wrapping ( usually the remote http-file ) */
+ ctx->cache_blk, /* how big one block in the cache-tee-file will be */
+ ctx->cache_file ); /* the sparse-file we use write to */
+ if ( rc == 0 )
+ rc = fetch_loop( tee, ctx );
+ if ( rc == 0 )
+ {
+
+ bool complete = false;
+ rc = IsCacheTeeComplete( tee, &complete );
+ KOutMsg( "IsCacheTeeComplete() -> %R, complete = %s\n", rc, complete ? "YES" : "NO" );
+ KFileRelease( tee );
+ }
+ KFileRelease( remote );
+ }
+ KNSManagerRelease( kns_mgr );
+ }
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+/* check cache completeness on a open cacheteefile */
+static rc_t full_download( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = KOutMsg( "make full download without partial access\n" );
+ if ( rc == 0 )
+ {
+ struct KNSManager * kns_mgr;
+ rc = KNSManagerMake ( &kns_mgr );
+ if ( rc != 0 )
+ (void)LOGERR( klogInt, rc, "KNSManagerMake() failed" );
+ else
+ {
+ struct URLBlock url;
+ URLBlockInit( &url );
+ rc = ParseUrl( &url, ctx->url, string_size( ctx->url ) );
+ if ( rc == 0 )
+ {
+ KClientHttp * http;
+ rc = url.tls ?
+ KNSManagerMakeClientHttps( kns_mgr, &http, NULL, 0x01010000, &url.host, url.port ):
+ KNSManagerMakeClientHttp( kns_mgr, &http, NULL, 0x01010000, &url.host, url.port );
+ if ( rc == 0 )
+ {
+ KClientHttpRequest * req;
+ KOutMsg( "connection open!\n" );
+ rc = KClientHttpMakeRequest( http, &req, ctx->url );
+ if ( rc == 0 )
+ {
+ KClientHttpResult *rslt;
+
+ KOutMsg( "request made!\n" );
+
+ KClientHttpRequestConnection( req, true );
+ KClientHttpRequestSetNoCache( req );
+
+ rc = KClientHttpRequestGET( req, &rslt );
+ if ( rc == 0 )
+ {
+ uint32_t result_code;
+ size_t msg_size;
+ char buffer[ 4096 * 32 ]; /* 128k */
+
+ KOutMsg( "reply received!\n" );
+ rc = KClientHttpResultStatus( rslt, &result_code, buffer, sizeof buffer, &msg_size );
+ if ( rc == 0 )
+ {
+ struct KStream *content;
+ KOutMsg( "result-code = %d\n", result_code );
+ if ( result_code == 200 )
+ {
+ rc = KClientHttpResultGetInputStream( rslt, &content );
+ if ( rc == 0 )
+ {
+ KFile *dst;
+ char * outfile;
+
+ if ( ctx->destination == NULL )
+ extract_name( &outfile, ctx->url );
+ else
+ string_dup_measure( ctx->destination, NULL );
+
+ rc = KDirectoryCreateFile ( dir, &dst, false, 0664, kcmInit, outfile );
+ if ( rc == 0 )
+ {
+ KOutMsg( "dst >%s< created\n", outfile );
+ if ( rc == 0 )
+ {
+ uint64_t pos = 0;
+ size_t num_read;
+ struct timeout_t timeout;
+
+ TimeoutInit( &timeout, 2000 );
+ do
+ {
+ rc = KStreamTimedRead( content, buffer, sizeof buffer, &num_read, &timeout );
+ if ( rc == 0 )
+ {
+ size_t num_writ;
+ rc = KFileWriteAll( dst, pos, buffer, num_read, &num_writ );
+ pos += num_read;
+ }
+ } while ( rc == 0 && num_read > 0 );
+
+ KOutMsg( "%d bytes read!\n", pos );
+ }
+ KFileRelease( dst );
+ }
+ free( outfile );
+ KStreamRelease( content );
+ }
+ }
+ }
+ KClientHttpResultRelease( rslt );
+ }
+ KClientHttpRequestRelease( req );
+ }
+ KClientHttpRelease ( http );
+ }
+ }
+ KNSManagerRelease( kns_mgr );
+ }
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+static rc_t truncate_cache( KDirectory *dir, fetch_ctx *ctx )
+{
+ rc_t rc = 0;
+ KFile *f;
+
+ KOutMsg( "truncating this cache file >%s< (from it's trailing bitmap)\n", ctx->url );
+
+ rc = KDirectoryOpenFileWrite( dir, &f, true, "%s", ctx->url );
+ if ( rc == 0 )
+ {
+ rc = TruncateCacheFile( f );
+ if ( rc == 0 )
+ KOutMsg( "the file was truncated\n" );
+ else
+ KOutMsg( "the file was not truncated: %R\n", rc );
+ KFileRelease( f );
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t get_bool( Args * args, const char *option, bool *value )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option, &count );
+ *value = ( rc == 0 && count > 0 );
+ return rc;
+}
+
+
+rc_t get_str( Args * args, const char *option, const char ** value )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option, &count );
+ *value = NULL;
+ if ( rc == 0 && count > 0 )
+ rc = ArgsOptionValue( args, option, 0, (const void **)value );
+ return rc;
+}
+
+
+rc_t get_size_t( Args * args, const char *option, size_t *value, size_t dflt )
+{
+ const char * s;
+ rc_t rc = get_str( args, option, &s );
+ *value = dflt;
+ if ( rc == 0 && s != NULL )
+ {
+ size_t l = string_size( s );
+ if ( l == 0 )
+ *value = dflt;
+ else
+ {
+ size_t multipl = 1;
+ switch( s[ l - 1 ] )
+ {
+ case 'k' :
+ case 'K' : multipl = 1024; break;
+ case 'm' :
+ case 'M' : multipl = 1024 * 1024; break;
+ case 'g' :
+ case 'G' : multipl = 1024 * 1024 * 1024; break;
+ }
+
+ if ( multipl > 1 )
+ {
+ char * src = string_dup( s, l - 1 );
+ if ( src != NULL )
+ {
+ char * endptr;
+ *value = strtol( src, &endptr, 0 ) * multipl;
+ free( src );
+ }
+ else
+ *value = dflt;
+ }
+ else
+ {
+ char * endptr;
+ *value = strtol( s, &endptr, 0 );
+ }
+ }
+ }
+ else
+ *value = dflt;
+ return rc;
+}
+
+
+rc_t get_fetch_ctx( Args * args, fetch_ctx * ctx )
+{
+ rc_t rc = 0;
+ uint32_t count;
+
+ ctx->url = NULL;
+ ctx->verbose = false;
+ rc = ArgsParamCount( args, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ rc = ArgsParamValue( args, 0, (const void **)&ctx->url );
+ if ( rc == 0 )
+ {
+ if ( count > 1 )
+ rc = ArgsParamValue( args, 1, (const void **)&ctx->destination );
+ else
+ ctx->destination = NULL;
+ }
+ }
+
+ if ( rc == 0 ) rc = get_bool( args, OPTION_VERB, &ctx->verbose );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_SHOW, &ctx->show_filesize );
+ if ( rc == 0 ) rc = get_str( args, OPTION_CACHE, &ctx->cache_file );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_CACHE_BLK, &ctx->cache_blk, 0 );
+ if ( rc == 0 ) rc = get_str( args, OPTION_PROXY, &ctx->proxy );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_RAND, &ctx->random );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_REP, &ctx->with_repeats );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_CREPORT, &ctx->report_cache );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_BLOCK, &ctx->blocksize, ( 32 * 1024 ) );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_BUFFER, &ctx->buffer_size, 0 );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_SLEEP, &ctx->sleep_time, 0 );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_TIMEOUT, &ctx->timeout_time, 0 );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_COMPLETE, &ctx->check_cache_complete );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_CCOMPL, &ctx->check_completeness );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_TRUNC, &ctx->truncate_cache );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_START, &ctx->start, 0 );
+ if ( rc == 0 ) rc = get_size_t( args, OPTION_COUNT, &ctx->count, 0 );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_PROGRESS, &ctx->show_progress );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_RELIABLE, &ctx->reliable );
+ if ( rc == 0 ) rc = get_bool( args, OPTION_FULL, &ctx->full_download );
+
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ MyOptions, sizeof ( MyOptions ) / sizeof ( OptDef ) );
+ if ( rc == 0 )
+ {
+ fetch_ctx ctx;
+
+ rc = get_fetch_ctx( args, &ctx );
+ if ( rc == 0 )
+ {
+ if ( ctx.url == NULL )
+ KOutMsg( "URL is missing!\n" );
+ else
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir ( &dir );
+ if ( rc == 0 )
+ {
+ if ( ctx.check_cache_complete )
+ rc = check_cache_complete( dir, &ctx );
+ else if ( ctx.check_completeness )
+ rc = check_cache_completeness( dir, &ctx );
+ else if ( ctx.truncate_cache )
+ rc = truncate_cache( dir, &ctx );
+ else if ( ctx.show_filesize )
+ rc = show_size( dir, &ctx );
+ else if ( ctx.full_download )
+ rc = full_download( dir, &ctx );
+ else
+ rc = fetch( dir, &ctx );
+
+ KDirectoryRelease ( dir );
+ }
+ }
+ }
+ ArgsWhack ( args );
+ }
+ else
+ KOutMsg( "ArgsMakeAndHandle() failed %R\n", rc );
+
+ return rc;
+}
diff --git a/tools/kqsh/.gitignore b/tools/kqsh/.gitignore
new file mode 100644
index 0000000..e601f91
--- /dev/null
+++ b/tools/kqsh/.gitignore
@@ -0,0 +1,7 @@
+*.vers.h
+kqsh-kdb.c
+kqsh-kdb.h
+kqsh-vdb.c
+kqsh-vdb.h
+kqsh-sra.c
+kqsh-sra.h
diff --git a/tools/kqsh/Makefile b/tools/kqsh/Makefile
new file mode 100644
index 0000000..1d62078
--- /dev/null
+++ b/tools/kqsh/Makefile
@@ -0,0 +1,207 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/kqsh
+
+include $(TOP)/build/Makefile.env
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ kqsh
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs kqsh-thunks
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs kqsh-thunks
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+ @ rm -f $(SRCDIR)/kqsh-[kv]db.[ch]
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# kqsh-thunks
+#
+KDB_THUNK_SRC = \
+ manager.h \
+ database.h \
+ table.h \
+ column.h \
+ index.h \
+ meta.h \
+ namelist.h
+
+KDB_THUNK_INCS = \
+ $(addprefix kdb/,$(KDB_THUNK_SRC))
+
+KDB_THUNK_DEPS = \
+ $(addprefix $(ITF)/,$(KDB_THUNK_INCS)) \
+ kqsh-thunk.pl \
+ Makefile
+
+KDB_THUNK_OBJ = \
+ :KDBManager=mgr \
+ :KDatabase=db \
+ :KTable=tbl \
+ :KColumn=col \
+ :KColumnBlob=blob \
+ :KIndex=idx \
+ :KMetadata=meta \
+ :KMDataNode=node
+
+kqsh-kdb.c: $(KDB_THUNK_DEPS)
+ perl kqsh-thunk.pl -mkdb -I$(ITF) $(addprefix -i,$(KDB_THUNK_INCS)) \
+ $(KDB_THUNK_OBJ) -h kqsh-kdb.h -c $@ || rm $@
+
+kqsh-kdb.h: kqsh-kdb.c
+
+VDB_THUNK_SRC = \
+ manager.h \
+ database.h \
+ schema.h \
+ table.h \
+ cursor.h
+
+VDB_THUNK_INCS = \
+ $(addprefix vdb/,$(VDB_THUNK_SRC))
+
+VDB_THUNK_DEPS = \
+ $(addprefix $(ITF)/,$(VDB_THUNK_INCS)) \
+ kqsh-thunk.pl \
+ Makefile
+
+VDB_THUNK_OBJ = \
+ :VDBManager=mgr \
+ VSchemaRuntimeTable=srtt \
+ VSchema=schema \
+ VTypedecl=td \
+ VTypedesc=tdesc \
+ :VDatabase=db \
+ :VTable=tbl \
+ :VCursor=curs
+
+kqsh-vdb.c: $(VDB_THUNK_DEPS)
+ perl kqsh-thunk.pl -mvdb -I$(ITF) $(addprefix -i,$(VDB_THUNK_INCS)) \
+ $(VDB_THUNK_OBJ) -h kqsh-vdb.h -c $@ || rm $@
+
+kqsh-vdb.h: kqsh-vdb.c
+
+SRA_THUNK_SRC = \
+ sradb.h \
+ wsradb.h \
+ sraschema.h
+
+SRA_THUNK_INCS = \
+ $(addprefix sra/,$(SRA_THUNK_SRC))
+
+SRA_THUNK_DEPS = \
+ $(addprefix $(ITF)/,$(SRA_THUNK_INCS)) \
+ kqsh-thunk.pl \
+ Makefile
+
+SRA_THUNK_OBJ = \
+ :SRAMgr=mgr \
+ SRANamelist=nmlist \
+ :SRATable=tbl \
+ SRAColumn=col \
+ VDBManager=vmgr
+
+kqsh-sra.c: $(SRA_THUNK_DEPS)
+ perl kqsh-thunk.pl -msra -I$(ITF) $(addprefix -i,$(SRA_THUNK_INCS)) \
+ $(SRA_THUNK_OBJ) -h kqsh-sra.h -c $@ || rm $@
+
+kqsh-sra.h: kqsh-sra.c
+
+kqsh-thunks: kqsh-kdb.h kqsh-vdb.h kqsh-sra.h
+
+#-------------------------------------------------------------------------------
+# kqsh-load
+# special rules to tell kqsh how to load libraries
+#
+
+#KQSH_LIBNAMES = \
+ -DLIBKDB=$(LPFX)kdb.$(SHLX) \
+ -DLIBWKDB=$(LPFX)wkdb.$(SHLX) \
+ -DLIBVDB=$(LPFX)vdb.$(SHLX) \
+ -DLIBWVDB=$(LPFX)wvdb.$(SHLX) \
+ -DLIBSRADB=$(LPFX)sradb.$(SHLX) \
+ -DLIBWSRADB=$(LPFX)wsradb.$(SHLX)
+
+KQSH_LIBNAMES = \
+ -DLIBNCBI_VDB=$(LPFX)ncbi-vdb.$(SHLX) \
+ -DLIBNCBI_WVDB=$(LPFX)ncbi-wvdb.$(SHLX)
+
+kqsh-load.$(OBJX): $(SRCDIR)/kqsh-load.c
+ $(CC) -o $@ $(OPT) $(KQSH_LIBNAMES) -D_LOGGING $<
+
+
+#-------------------------------------------------------------------------------
+# kqsh - query shell
+#
+KQSH_SRC = \
+ kqsh-print \
+ kqsh-tok \
+ kqsh-parse \
+ kqsh-alter \
+ kqsh-close \
+ kqsh-help \
+ kqsh-load \
+ kqsh-open \
+ kqsh-create \
+ kqsh-show \
+ kqsh-write \
+ kqsh-kdb \
+ kqsh-vdb \
+ kqsh-sra \
+ kqsh
+
+KQSH_OBJ = \
+ $(addsuffix .$(OBJX),$(KQSH_SRC))
+
+KQSH_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/kqsh: $(KQSH_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(KQSH_LIB)
diff --git a/tools/kqsh/kqsh-alter.c b/tools/kqsh/kqsh-alter.c
new file mode 100644
index 0000000..3df5743
--- /dev/null
+++ b/tools/kqsh/kqsh-alter.c
@@ -0,0 +1,347 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* alter cursor
+ * 'alter <cursor> add column [ ( <typedecl> ) ] NAME;'
+ *
+ * all data after the 'column' keyword are gathered into
+ * ( typedecl, name ) pairs. we are going to allow comma
+ * separation, but otherwise just gather everything up to
+ * the semi-colon.
+ */
+static
+rc_t kqsh_alter_cursor_add_column ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *cursor )
+{
+ rc_t rc;
+
+ do
+ {
+ size_t i;
+ uint32_t idx;
+ char coldecl [ 256 ];
+
+ for ( i = 0; i < sizeof coldecl - 1; )
+ {
+ /* end of column */
+ if ( t -> id == eSemiColon || t -> id == eComma )
+ break;
+
+ /* accumulate */
+ i += string_copy ( & coldecl [ i ],
+ sizeof coldecl - i, t -> str . addr, t -> str . size );
+
+ next_token ( tbl, src, t );
+ }
+
+ /* the name needs to fit in our buffer */
+ if ( i == sizeof coldecl - 1 )
+ {
+ rc = RC ( rcExe, rcCursor, rcUpdating, rcName, rcExcessive );
+ if ( interactive )
+ {
+ kqsh_printf ( "this is really hard to believe, but you managed to request\n"
+ "a column with a %u byte expression. please stop trying to abuse me.\n",
+ ( unsigned int ) i );
+ }
+ else
+ {
+ LOGERR ( klogErr, rc, "failed to add column to cursor" );
+ }
+ return rc;
+ }
+
+ /* perform the task */
+ rc = _VCursorAddColumn ( cursor -> u . obj, & idx, coldecl );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "cannot add column '$(expr)' to cursor '$(curs)'",
+ "expr=%s,curs=%.*s"
+ , coldecl
+ , ( int ) cursor -> name . size, cursor -> name . addr));
+ }
+
+ else if ( interactive )
+ {
+ kqsh_printf ( "added column '%s' ( idx %u ) to cursor '%N' ( %p )\n"
+ , coldecl
+ , idx
+ , cursor
+ , cursor -> u . obj
+ );
+ }
+ }
+ while ( t -> id == eComma );
+
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ return 0;
+}
+
+static
+rc_t kqsh_alter_cursor_add ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *cursor )
+{
+ switch ( t -> id )
+ {
+ case kw_column:
+ return kqsh_alter_cursor_add_column ( tbl, src, next_token ( tbl, src, t ), cursor );
+ }
+
+ return expected ( t, klogErr, "column" );
+}
+
+static
+rc_t kqsh_alter_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *cursor )
+{
+ switch ( t -> id )
+ {
+ case kw_add:
+ return kqsh_alter_cursor_add ( tbl, src, next_token ( tbl, src, t ), cursor );
+ }
+
+ return expected ( t, klogErr, "add" );
+}
+
+/* alter schema add path
+ * 'alter <schema> add include [ path ] STRING'
+ * 'alter <schema> add path STRING'
+ */
+static
+rc_t kqsh_alter_schema_add_path ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ rc_t rc;
+ String path;
+ struct VSchema *schema = ( void* ) sym -> u . obj;
+
+ switch ( t -> id )
+ {
+ case eString:
+ case eEscapedString:
+ path = t -> str;
+ path . addr += 1;
+ path . size -= 2;
+ break;
+
+ case eUntermString:
+ case eUntermEscapedString:
+ CONST_STRING ( & t -> str, "<unterminated string>" );
+ default:
+ return expected ( t, klogErr, "path string" );
+ }
+
+ /* consume semi-colon */
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ rc = _VSchemaAddIncludePath ( schema, "%.*s", ( int ) path . size, path . addr );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "cannot add search path '$(path)' to schema '$(name)'",
+ "path=%.*s,name=%.*s"
+ , ( int ) path . size, path . addr
+ , ( int ) sym -> name . size, sym -> name . addr));
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "added search path '%S' to schema '%N' ( %p )\n",
+ & path, sym, schema );
+ }
+
+ return rc;
+}
+
+/* alter schema add text
+ * 'alter <schema> add text STRING'
+ */
+static
+rc_t kqsh_alter_schema_add_text ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ rc_t rc;
+ String text;
+ struct VSchema *schema = ( void* ) sym -> u . obj;
+
+ switch ( t -> id )
+ {
+ case eString:
+ case eEscapedString:
+ text = t -> str;
+ text . addr += 1;
+ text . size -= 2;
+ break;
+
+ case eUntermString:
+ case eUntermEscapedString:
+ CONST_STRING ( & t -> str, "<unterminated string>" );
+ default:
+ return expected ( t, klogErr, "schema text string" );
+ }
+
+ /* consume semi-colon */
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ /* parse text */
+ rc = _VSchemaParseText ( schema, "kqsh-console", text . addr, text . size );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "cannot add text into schema '$(name)'",
+ "name=%.*s", ( int ) sym -> name . size, sym -> name . addr));
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "added text to schema '%N' ( %p )\n", sym, schema );
+ }
+
+ return rc;
+}
+
+/* alter schema add
+ */
+static
+rc_t kqsh_alter_schema_add ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *schema )
+{
+ switch ( t -> id )
+ {
+ case kw_include:
+ if ( next_token ( tbl, src, t ) -> id == kw_path )
+ case kw_path:
+ next_token ( tbl, src, t );
+ return kqsh_alter_schema_add_path ( tbl, src, t, schema );
+ case kw_text:
+ return kqsh_alter_schema_add_text ( tbl, src, next_token ( tbl, src, t ), schema );
+ }
+
+ return expected ( t, klogErr, "include, path or text" );
+}
+
+
+/* alter schema load
+ * 'alter <schema> load STRING'
+ */
+static
+rc_t kqsh_alter_schema_load ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ rc_t rc;
+ String path;
+ struct VSchema *schema = ( void* ) sym -> u . obj;
+
+ switch ( t -> id )
+ {
+ case eString:
+ case eEscapedString:
+ path = t -> str;
+ path . addr += 1;
+ path . size -= 2;
+ break;
+
+ case eUntermString:
+ case eUntermEscapedString:
+ CONST_STRING ( & t -> str, "<unterminated string>" );
+ default:
+ return expected ( t, klogErr, "path string" );
+ }
+
+ /* consume semi-colon */
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ rc = _VSchemaParseFile ( schema, "%.*s", ( int ) path . size, path . addr );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "cannot load file '$(path)' into schema '$(name)'",
+ "path=%.*s,name=%.*s"
+ , ( int ) path . size, path . addr
+ , ( int ) sym -> name . size, sym -> name . addr));
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "loaded file '%S' into schema '%N' ( %p )\n",
+ & path, sym, schema );
+ }
+
+ return rc;
+}
+
+/* alter schema
+ */
+static
+rc_t kqsh_alter_schema ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *schema )
+{
+ switch ( t -> id )
+ {
+ case kw_add:
+ return kqsh_alter_schema_add ( tbl, src, next_token ( tbl, src, t ), schema );
+ case kw_load:
+ return kqsh_alter_schema_load ( tbl, src, next_token ( tbl, src, t ), schema );
+ }
+
+ return expected ( t, klogErr, "add or load" );
+}
+
+
+/* alter
+ */
+rc_t kqsh_alter ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ KSymbol *sym = t -> sym;
+
+ switch ( t -> id )
+ {
+ case kw_cursor:
+ if ( next_token ( tbl, src, t ) -> id != obj_VCursor )
+ break;
+ sym = t -> sym;
+ case obj_VCursor:
+ return kqsh_alter_cursor ( tbl, src, next_token ( tbl, src, t ), sym );
+
+ case kw_schema:
+ if ( next_token ( tbl, src, t ) -> id != obj_VSchema )
+ break;
+ sym = t -> sym;
+ case obj_VSchema:
+ return kqsh_alter_schema ( tbl, src, next_token ( tbl, src, t ), sym );
+ }
+
+ return expected ( t, klogErr, "cursor or schema" );
+}
diff --git a/tools/kqsh/kqsh-close.c b/tools/kqsh/kqsh-close.c
new file mode 100644
index 0000000..244a407
--- /dev/null
+++ b/tools/kqsh/kqsh-close.c
@@ -0,0 +1,186 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+#include "kqsh-sra.h"
+
+#include <klib/container.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* close row
+ */
+static
+rc_t kqsh_close_row ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ rc_t rc = 0;
+ KSymbol *curs;
+
+ /* accept optional "on" keyword */
+ if ( next_token ( tbl, src, t ) -> id == kw_on )
+ next_token ( tbl, src, t );
+
+ /* expect cursor object */
+ switch ( t -> id )
+ {
+ case obj_VCursor:
+ curs = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "cursor" );
+ }
+
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ switch ( curs -> type )
+ {
+ case obj_VCursor:
+ rc = _VCursorCloseRow ( curs -> u . obj );
+ break;
+ }
+
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to close row on cursor '$(name)' ( $(addr) )"
+ , "name=%.*s,addr=0x%zX"
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "closed row on cursor '%N' ( %p )\n"
+ , curs, curs -> u . obj );
+ }
+
+ return rc;
+}
+
+
+/* whackobj
+ * whacks created/opened objects
+ */
+void CC kqsh_whackobj ( BSTNode *n, void *ignore )
+{
+ KSymbol *sym = ( KSymbol* ) n;
+
+ switch ( sym -> type )
+ {
+ case obj_KDBManager:
+ _KDBManagerRelease ( sym -> u . obj );
+ break;
+ case obj_VDBManager:
+ _VDBManagerRelease ( sym -> u . obj );
+ break;
+ case obj_SRAManager:
+ _SRAMgrRelease ( sym -> u . obj );
+ break;
+ case obj_VSchema:
+ _VSchemaRelease ( sym -> u . obj );
+ break;
+
+ case obj_KTable:
+ _KTableRelease ( sym -> u . obj );
+ break;
+ case obj_VTable:
+ _VTableRelease ( sym -> u . obj );
+ break;
+
+ case obj_VCursor:
+ _VCursorRelease ( sym -> u . obj );
+ break;
+ }
+
+ KSymbolWhack ( & sym -> n, ignore );
+}
+
+/* close
+ */
+rc_t kqsh_close ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ KSymbol *sym;
+
+ /* handle close row */
+ if ( t -> id == kw_row )
+ return kqsh_close_row ( tbl, src, t );
+
+ /* expect normal object */
+ sym = t -> sym;
+
+ if ( sym == NULL || t -> id < rsrv_first )
+ return expected ( t, klogErr, "object id" );
+
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ if ( sym -> type >= obj_first )
+ {
+ if ( interactive )
+ {
+ const char *type;
+ switch ( sym -> type )
+ {
+ case obj_KDBManager:
+ type = "kdb manager"; break;
+ case obj_VDBManager:
+ type = "vdb manager"; break;
+ case obj_VSchema:
+ type = "schema"; break;
+ case obj_KTable:
+ case obj_VTable:
+ type = "table"; break;
+ case obj_VCursor:
+ type = "cursor"; break;
+ default:
+ type = "object";
+ }
+
+ kqsh_printf ( "closing %s '%N' ( %p )\n", type, sym, sym -> u . obj );
+ }
+
+ KSymTableRemoveSymbol ( tbl, sym );
+ kqsh_whackobj ( & sym -> n, NULL );
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "reserved object '%N' is not open\n", sym );
+ }
+
+ return 0;
+}
diff --git a/tools/kqsh/kqsh-create.c b/tools/kqsh/kqsh-create.c
new file mode 100644
index 0000000..290b02e
--- /dev/null
+++ b/tools/kqsh/kqsh-create.c
@@ -0,0 +1,680 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+#include "kqsh-sra.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* create cursor
+ *
+ * 'create cursor ID on TBL [ for update ];'
+ */
+static
+rc_t kqsh_create_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t, uint32_t mode )
+{
+ rc_t rc = 0;
+
+ void *obj;
+ String name;
+ bool for_write;
+ uint32_t obj_type;
+ KSymbol *using, *existing;
+
+ /* looking for a cursor name */
+ switch ( t -> id )
+ {
+ case eIdent:
+ case obj_VCursor:
+ name = t -> str;
+ existing = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "cursor name" );
+ }
+
+ /* get table */
+ if ( next_token ( tbl, src, t ) -> id != kw_on )
+ return expected ( t, klogErr, "on");
+
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case obj_VTable:
+ obj_type = obj_VCursor;
+ using = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "cursor capable table" );
+ }
+
+ /* look for update flag */
+ for_write = false;
+ if ( next_token ( tbl, src, t ) -> id == kw_for )
+ {
+ if ( next_token ( tbl, src, t ) -> id != kw_update )
+ return expected ( t, klogErr, "update" );
+ if ( read_only )
+ {
+ rc = RC ( rcExe, rcTable, rcOpening, rcMgr, rcReadonly );
+ if ( interactive )
+ {
+ kqsh_printf ( "you are executing in read-only mode.\n"
+ "cannot create cursor for write.\n"
+ "you can relaunch kqsh with the '-u' option to enable updates.\n"
+ );
+ }
+ else
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to create cursor '$(name)'",
+ "name=%.*s", ( int ) name . size, name . addr ));
+ }
+ return rc;
+ }
+
+ for_write = true;
+ next_token ( tbl, src, t );
+ }
+
+ /* now we're done parsing */
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ if ( existing != NULL ) switch ( mode )
+ {
+ case kcmOpen:
+ if ( interactive )
+ {
+ kqsh_printf ( "opened cursor '%N' ( %p )\n"
+ , existing, existing -> u . obj );
+ }
+ return 0;
+ case kcmInit:
+ kqsh_whackobj ( & existing -> n, NULL );
+ break;
+ case kcmCreate:
+ rc = RC ( rcExe, rcTable, rcOpening, rcCursor, rcExists );
+ if ( interactive )
+ kqsh_printf ( "cursor '%N' already exists.\n", existing );
+ else
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "cursor '$(name)' could not be created",
+ "name=%.*s", ( int ) existing -> name . size, existing -> name . addr ));
+ }
+ return rc;
+ }
+
+ /* create the cursor */
+ switch ( using -> type )
+ {
+ case obj_VTable:
+ rc = for_write ?
+ _VTableCreateCursorWrite ( ( void* ) using -> u . obj, ( VCursor** ) & obj, kcmInsert ):
+ _VTableCreateCursorRead ( using -> u . obj, ( const VCursor** ) & obj );
+ break;
+ }
+
+ if ( rc == 0 )
+ {
+ KSymbol *sym;
+
+ /* create symbol */
+ rc = KSymTableCreateSymbol ( tbl, & sym, & name, obj_type, obj );
+ if ( rc == 0 )
+ {
+ if ( interactive )
+ {
+ kqsh_printf ( "created cursor '%N' ( %p )\n"
+ , sym, sym -> u . obj );
+ }
+ return 0;
+ }
+
+ /* whack instance */
+ switch ( obj_type )
+ {
+ case obj_VCursor:
+ _VCursorRelease ( obj );
+ break;
+ }
+ }
+
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to create cursor '$(name)' on $(targ)"
+ , "name=%.*s,targ=%.*s"
+ , ( int ) name . size, name . addr
+ , ( int ) using -> name . size, using -> name . addr ));
+
+ return rc;
+}
+
+/* create table
+ *
+ * 'create table PATH [ as ID ] [ with schema ID[.ID] ] [ using ID ];'
+ */
+static
+rc_t kqsh_create_table ( KSymTable *tbl, KTokenSource *src, KToken *t, uint32_t mode )
+{
+ rc_t rc = 0;
+ /* bool have_as; */
+ String path, name;
+
+ KSymbol *schema;
+ String schema_tbl;
+ char schema_tbl_str [ 256 ];
+
+ KSymbol *using, *existing;
+
+ void *obj;
+ uint32_t obj_type = 0;
+
+ /* looking for a table path */
+ if ( t -> id != eString )
+ return expected ( t, klogErr, "table path string or name string" );
+ StringSubstr ( & t -> str, & path, 1, t -> str . len - 2 );
+
+ /* look for kqsh object id */
+ if ( next_token ( tbl, src, t ) -> id != kw_as )
+ {
+ /* not renamed - take path leaf as kqsh variable name */
+ const char *slash = string_rchr ( path . addr, path . size, '/' );
+ if ( slash ++ == NULL )
+ name = path;
+ else
+ {
+ size_t size = path . size - ( slash - path . addr );
+ StringInit ( & name, slash, size, string_len ( slash, size ) );
+ }
+
+ existing = KSymTableFind ( tbl, & name );
+ /* have_as = false; */
+ }
+
+ /* require a name of some sort, allow redefine for the moment */
+ else if ( next_token ( tbl, src, t ) -> id != eIdent && t -> sym == NULL )
+ return expected ( t, klogErr, "table id" );
+ else
+ {
+ name = t -> str;
+ existing = t -> sym;
+ next_token ( tbl, src, t );
+ /* have_as = true; */
+ }
+
+ /* check to see if name is in use */
+ if ( existing != NULL )
+ {
+ KMetadata *meta;
+
+ /* use a kludgy test for being open for update */
+ switch ( existing -> type )
+ {
+ case obj_KTable:
+ rc = _KTableOpenMetadataUpdate ( ( void* ) existing -> u . obj, & meta );
+ break;
+ case obj_VTable:
+ rc = _VTableOpenMetadataUpdate ( ( void* ) existing -> u . obj, & meta );
+ break;
+ default:
+ return expected ( t, klogErr, "table id" );
+ }
+
+ _KMetadataRelease ( meta );
+ if ( rc != 0 )
+ {
+ /* table is open, but is ( most likely ) read-only */
+ if ( interactive )
+ kqsh_printf ( "table '%N' is currently open for read", existing );
+ else
+ {
+ rc = RC ( rcExe, rcTable, rcCreating, rcTable, rcBusy );
+ PLOGERR ( klogErr, (klogErr, rc, "cannot create table '$(name)'", "name=%.*s"
+ , ( int ) name . size, name . addr ));
+ return rc;
+ }
+ }
+ }
+
+ /* look for schema spec */
+ schema = NULL;
+ CONST_STRING ( & schema_tbl, "" );
+ if ( t -> id == kw_with )
+ {
+ /* should see keyword 'schema' */
+ if ( next_token ( tbl, src, t ) -> id == kw_schema )
+ next_token ( tbl, src, t );
+
+ /* accept any id, but look for schema object */
+ if ( t -> id == obj_VSchema )
+ {
+ schema = t -> sym;
+ if ( next_token ( tbl, src, t ) -> id == ePeriod )
+ {
+ if ( next_token ( tbl, src, t ) -> id != eIdent && t -> sym == NULL )
+ return expected ( t, klogErr, "schema table id" );
+ schema_tbl = t -> str;
+ next_token ( tbl, src, t );
+ }
+ }
+ else if ( t -> id != eIdent && t -> sym == NULL )
+ return expected ( t, klogErr, "schema table id" );
+ else
+ {
+ schema_tbl = t -> str;
+ next_token ( tbl, src, t );
+ }
+ }
+
+ /* look for 'using' clause' */
+ using = NULL;
+ if ( t -> id == kw_using )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case obj_KDBManager:
+ /* if table exists but is not a KTable, it's an error */
+ if ( existing != NULL ) switch ( existing -> type )
+ {
+ case obj_KTable:
+ break;
+ case obj_VTable:
+ return expected ( t, klogErr, "vdb manager or database" );
+ }
+ /* both schema and tbl name require vdb+ manager */
+ if ( schema != NULL && schema_tbl . len != 0 )
+ return expected ( t, klogErr, "schema capable manager" );
+ /* schema alone could be mgr with default name
+ or db where table name collides with kqsh id */
+ if ( schema != NULL )
+ return expected ( t, klogErr, "schema capable manager or database" );
+ /* no schema but tbl name requires database */
+ if ( schema_tbl . len != 0 )
+ return expected ( t, klogErr, "schema capable database" );
+
+ /* this is the target object */
+ using = t -> sym;
+ break;
+
+ case obj_VDBManager:
+ /* if table exists but is not a VTable, it's an error */
+ if ( existing != NULL ) switch ( existing -> type )
+ {
+ case obj_KTable:
+ return expected ( t, klogErr, "kdb manager or database" );
+ case obj_VTable:
+ break;
+ }
+ /* neither schema nor tbl requires kdb mgr or db */
+ if ( schema == NULL && schema_tbl . len == 0 )
+ return expected ( t, klogErr, "kdb manager or database" );
+ /* table name alone requires vdb+ database */
+ if ( schema == NULL )
+ return expected ( t, klogErr, "schema capable database" );
+
+ /* schema alone implies default table
+ schema plus table name is standard */
+ using = t -> sym;
+ break;
+
+#if 0
+ case obj_VDatabase:
+ /* if table exists but is not a VTable, it's an error */
+ if ( existing != NULL ) switch ( existing -> type )
+ {
+ case obj_KTable:
+ return expected ( t, klogErr, "kdb manager or database" );
+ case obj_VTable:
+ break;
+ }
+ /* neither schema nor tbl requires kdb mgr or db */
+ if ( schema == NULL && schema_tbl . len == 0 )
+ return expected ( t, klogErr, "kdb manager or database" );
+ /* schema alone is reinterpreted as table name */
+ if ( schema_tbl . len == 0 )
+ {
+ schema_tbl = schema -> name;
+ schema = NULL;
+ }
+ /* schema plus table name requires vdb+ manager */
+ else if ( schema != NULL )
+ return expected ( t, klogErr, "schema capable manager" );
+
+ /* database with no schema but table name */
+ using = t -> sym;
+ break;
+#endif
+ default:
+ if ( schema == NULL )
+ {
+ return expected ( t, klogErr, ( schema_tbl . len == 0 ) ?
+ "kdb manager or database" : "schema capable database" );
+ }
+
+ return expected ( t, klogErr, ( schema_tbl . len == 0 ) ?
+ "schema capable manager or database" : "schema capable manager" );
+ }
+
+ next_token ( tbl, src, t );
+ }
+
+ /* expect target object */
+ if ( using == NULL )
+ {
+ if ( schema == NULL )
+ {
+ return expected ( t, klogErr, ( schema_tbl . len == 0 ) ?
+ "kdb manager or database" : "schema capable database" );
+ }
+
+ return expected ( t, klogErr, ( schema_tbl . len == 0 ) ?
+ "schema capable manager or database" : "schema capable manager" );
+ }
+
+ /* close off statement */
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ /* if in read-only mode, this whole thing will fail */
+ if ( read_only )
+ {
+ rc = RC ( rcExe, rcTable, rcOpening, rcMgr, rcReadonly );
+ if ( interactive )
+ {
+ kqsh_printf ( "you are executing in read-only mode.\n"
+ "table creation is not supported.\n"
+ "you can relaunch kqsh with the '-u' option to enable updates.\n"
+ );
+ }
+ else
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to create table '$(path)' as '$(name)'",
+ "path=%.*s,name=%.*s"
+ , ( int ) path . size, path . addr
+ , ( int ) name . size, name . addr ));
+ }
+ return rc;
+ }
+
+ /* prepare schema table string */
+ if ( schema_tbl . size >= sizeof schema_tbl_str )
+ {
+ rc = RC ( rcExe, rcTable, rcCreating, rcString, rcExcessive );
+ PLOGERR ( klogErr, (klogErr, rc, "schema name length = $(len)", "len=%zu", schema_tbl . size ));
+ return rc;
+ }
+ string_copy ( schema_tbl_str, sizeof schema_tbl_str,
+ schema_tbl . addr, schema_tbl . size );
+
+
+ /* handle existing table */
+ if ( existing != NULL ) switch ( mode )
+ {
+ case kcmOpen:
+ if ( interactive )
+ {
+ kqsh_printf ( "opened table '%N' ( %p )\n"
+ , existing, existing -> u . obj );
+ }
+ return 0;
+ case kcmInit:
+ kqsh_whackobj ( & existing -> n, NULL );
+ break;
+ case kcmCreate:
+ rc = RC ( rcExe, rcTable, rcCreating, rcTable, rcExists );
+ if ( interactive )
+ kqsh_printf ( "table '%N' is already open", existing );
+ else
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "table '$(name)' could not be created",
+ "name=%.*s", ( int ) existing -> name . size, existing -> name . addr ));
+ }
+ return rc;
+ }
+
+ /* dispatch */
+ switch ( using -> type )
+ {
+ case obj_KDBManager:
+ obj_type = obj_KTable;
+ rc = _KDBManagerCreateTable ( ( void* ) using -> u . obj, ( KTable** ) & obj,
+ mode | kcmParents,"%.*s", ( int ) path . size, path . addr );
+ break;
+ case obj_VDBManager:
+ obj_type = obj_VTable;
+ assert ( schema != NULL );
+ rc = _VDBManagerCreateTable ( ( void* ) using -> u . obj, ( VTable** ) & obj,
+ schema -> u . obj, schema_tbl_str [ 0 ] ? schema_tbl_str : NULL,
+ mode | kcmParents,"%.*s", ( int ) path . size, path . addr );
+ break;
+ }
+
+ if ( rc == 0 )
+ {
+ KSymbol *sym;
+
+ /* create symbol */
+ rc = KSymTableCreateSymbol ( tbl, & sym, & name, obj_type, obj );
+ if ( rc == 0 )
+ {
+ if ( interactive )
+ {
+ kqsh_printf ( "created table '%N' ( %p )\n"
+ , sym, sym -> u . obj );
+ }
+ return 0;
+ }
+
+ /* whack instance */
+ switch ( obj_type )
+ {
+ case obj_KTable:
+ _KTableRelease ( obj );
+ break;
+ case obj_VTable:
+ _VTableRelease ( obj );
+ break;
+ }
+ }
+
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to create table '$(name)' using $(targ)"
+ , "name=%.*s,targ=%.*s"
+ , ( int ) name . size, name . addr
+ , ( int ) using -> name . size, using -> name . addr ));
+
+ return rc;
+}
+
+
+/* create schema
+ *
+ * 'create schema [ as ] ID [ using MGR ];'
+ */
+static
+rc_t kqsh_create_schema ( KSymTable *tbl, KTokenSource *src, KToken *t, uint32_t mode )
+{
+ rc_t rc = 0;
+ String name;
+ KSymbol *existing;
+ const KSymbol *mgr;
+ struct VSchema *schema;
+
+ /* shouldn't be here, but don't choke on it */
+ if ( t -> id == kw_as )
+ next_token ( tbl, src, t );
+
+ /* get schema object name */
+ switch ( t -> id )
+ {
+ case eIdent:
+ case obj_VSchema:
+ name = t -> str;
+ existing = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "schema name" );
+ }
+
+ /* there is no implicit mgr yet */
+ mgr = NULL;
+
+ /* get using clause */
+ if ( next_token ( tbl, src, t ) -> id == kw_using )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case obj_VDBManager:
+ case obj_SRAManager:
+ mgr = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "open vdb or sra manager" );
+ }
+
+ next_token ( tbl, src, t );
+ }
+ else if ( mgr == NULL )
+ {
+ return expected ( t, klogErr, "using" );
+ }
+
+ /* expect ';' */
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ /* if the schema already exists, then look at mode */
+ if ( existing != NULL ) switch ( mode )
+ {
+ case kcmOpen:
+ if ( interactive )
+ {
+ kqsh_printf ( "opened schema '%N' ( %p )\n"
+ , existing, existing -> u . obj );
+ }
+ return 0;
+ case kcmInit:
+ kqsh_whackobj ( & existing -> n, NULL );
+ break;
+ case kcmCreate:
+ rc = RC ( rcExe, rcSchema, rcCreating, rcSchema, rcExists );
+ if ( interactive )
+ kqsh_printf ( "schema '%N' already exists", existing );
+ else
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "schema '$(name)' could not be created",
+ "name=%.*s", ( int ) existing -> name . size, existing -> name . addr ));
+ }
+ return rc;
+ }
+
+ /* now process the request */
+ switch ( mgr -> type )
+ {
+ case obj_VDBManager:
+ rc = _VDBManagerMakeSchema ( mgr -> u . obj, & schema );
+ break;
+ case obj_SRAManager:
+ rc = _SRAMgrMakeSRASchema ( mgr -> u . obj, & schema );
+ break;
+ }
+
+ if ( rc == 0 )
+ {
+ KSymbol *sym;
+
+ /* create symbol */
+ rc = KSymTableCreateSymbol ( tbl, & sym, & name, obj_VSchema, schema );
+ if ( rc == 0 )
+ {
+ if ( interactive )
+ {
+ kqsh_printf ( "created schema '%N' ( %p )\n"
+ , sym, sym -> u . obj );
+ }
+ return 0;
+ }
+
+ /* whack instance */
+ _VSchemaRelease ( schema );
+ }
+
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to create schema '$(name)' using $(mgr)"
+ , "name=%.*s,mgr=%.*s"
+ , ( int ) name . size, name . addr
+ , ( int ) mgr -> name . size, mgr -> name . addr ));
+
+ return rc;
+}
+
+/* create
+ */
+rc_t kqsh_create ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ uint32_t mode = kcmCreate;
+
+ if ( t -> id == kw_or )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case kw_replace:
+ mode = kcmInit;
+ break;
+ case kw_open:
+ mode = kcmOpen;
+ break;
+ default:
+ return expected ( t, klogErr, "replace or open" );
+ }
+
+ next_token ( tbl, src, t );
+ }
+
+ switch ( t -> id )
+ {
+ case kw_cursor:
+ return kqsh_create_cursor ( tbl, src, next_token ( tbl, src, t ), mode );
+ case kw_schema:
+ return kqsh_create_schema ( tbl, src, next_token ( tbl, src, t ), mode );
+ case kw_table:
+ return kqsh_create_table ( tbl, src, next_token ( tbl, src, t ), mode );
+ }
+
+ return expected ( t, klogErr, "cursor, schema or table" );
+}
diff --git a/tools/kqsh/kqsh-help.c b/tools/kqsh/kqsh-help.c
new file mode 100644
index 0000000..49edeb7
--- /dev/null
+++ b/tools/kqsh/kqsh-help.c
@@ -0,0 +1,1292 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+
+#include <klib/container.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* alias
+ */
+static
+rc_t kqsh_help_alias ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create a new name for an existing object\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+
+/* alter
+ */
+static
+rc_t kqsh_help_alter_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "alter a cursor\n"
+ "\n"
+ "usage:\n"
+ " 'alter <cursor> add column [ ( TYPEDECL ) ] NAME;'\n"
+ "\n"
+ " the 'alter <cursor> add' command allows addition of columns\n"
+ " before the cursor has been opened for use.\n"
+ );
+
+ return 0;
+}
+static
+rc_t kqsh_help_alter_schema ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "alter an open schema\n"
+ "\n%s%s%s%s",
+ "usage:\n"
+ " 'alter <schema> add include [ path ] PATH;'\n"
+ " 'alter <schema> add path PATH;'\n"
+ " 'alter <schema> load PATH;'\n"
+ "\n",
+ " the 'alter <schema> add' command allows addition of new\n"
+ " search paths that affect loading and schema include directives.\n"
+ "\n",
+ " the 'alter <schema> load' command will load schema from the\n"
+ " indicated file.\n",
+ "\n"
+ " the keywords 'alter schema' may be used instead of 'alter' alone.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_alter ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ case kw_cursor:
+ return kqsh_help_alter_cursor ( tbl, src, t );
+ case kw_schema:
+ return kqsh_help_alter_schema ( tbl, src, t );
+
+ default:
+ return expected ( t, klogWarn, "cursor or schema" );
+ }
+ }
+
+ printf ( "alter an open object\n"
+ "\n%s%s",
+ "usage:\n"
+ " alter <vdb manager>...\n"
+ " alter <sra manager> ...\n"
+ " alter <cursor> ...\n"
+ " alter <schema> ...\n"
+ "\n",
+ " the alter command is used to modify open objects in some way.\n"
+ "\n"
+ " type 'help alter <object>;' for more information about that command.\n"
+ );
+
+ return 0;
+}
+
+
+/* close
+ */
+static
+rc_t kqsh_help_close ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "close an open object or cursor row\n"
+ "\n"
+ "usage:\n"
+ " 'close ID;'\n"
+ " 'close row [ on ] <cursor>;\n"
+ );
+
+ return 0;
+}
+
+
+/* create
+ */
+static
+rc_t kqsh_help_create_column ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create or open a stand-alone column using kdb manager (OBSCURE)\n"
+ "\n"
+ "usage:\n"
+ " 'create column PATH [ as ID ] [ using KDB-MGR ];'\n"
+ "\n"
+ " create a column using implicit or named kdb manager.\n"
+ " type 'help create;' for information on create semantics.\n"
+ "\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_create_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create a row cursor upon a table\n"
+ "\n"
+ "usage:\n"
+ " 'create cursor ID on TBL [ for update ];'\n"
+ "\n"
+ " create a named cursor on the given table. the default cursor mode is\n"
+ " read-only, but may be used for write 'for update' is specified.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_create_database ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create or open a databse\n"
+ "\n%s%s",
+ "usage:\n"
+ " 'create database PATH [ as ID ] [ using KDB-MGR ];'\n"
+ " 'create database PATH [ as ID ]\n"
+ " [ with ] schema ID.ID [ using MGR ];'\n"
+ " 'create database ID [ as ID ] [ using KDB-DB ];'\n"
+ " 'create database ID [ as ID ]\n"
+ " [ with ] schema ID [ using DB ];'\n"
+ "\n",
+ " create a database using implicit or named manager or database.\n"
+ " type 'help create;' for information on create semantics.\n"
+ " when using a database schema, the target object may be any\n"
+ " manager or database above kdb level.\n"
+ "\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_create_schema ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create an empty schema object\n"
+ "\n"
+ "usage:\n"
+ " 'create schema as ID [ using MGR ];'\n"
+ "\n"
+ " create a new schema populated only by intrinsic definitions.\n"
+ " the manager used must be above kdb level.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_create_table ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "create or open a table\n"
+ "\n%s%s",
+ "usage:\n"
+ " 'create table PATH [ as ID ] [ using KDB-MGR ];'\n"
+ " 'create table PATH [ as ID ]\n"
+ " [ with ] schema ID.ID [ using MGR ];'\n"
+ " 'create table ID [ as ID ] [ using KDB-DB ];'\n"
+ " 'create table ID [ as ID ]\n"
+ " [ with ] schema ID [ using DB ];'\n"
+ "\n",
+ " create a table using implicit or named manager or database.\n"
+ " type 'help create;' for information on create semantics.\n"
+ " when using a table schema, the target object may be any\n"
+ " manager or database above kdb level.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_create ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ case kw_column:
+ return kqsh_help_create_column ( tbl, src, t );
+ case kw_cursor:
+ return kqsh_help_create_cursor ( tbl, src, t );
+ case kw_database:
+ return kqsh_help_create_database ( tbl, src, t );
+ case kw_schema:
+ return kqsh_help_create_schema ( tbl, src, t );
+ case kw_table:
+ return kqsh_help_create_table ( tbl, src, t );
+
+ default:
+ return expected ( t, klogWarn, "column, cursor, database, schema, table or ;" );
+ }
+ }
+
+ printf ( "create a new object or open/reinitialize an existing one\n"
+ "\n%s%s%s%s",
+ "usage:\n"
+ " create ... - create a new object or fail if it already exists.\n"
+ " create or replace ... - create a new object or reinitialize existing one.\n"
+ " create or open ... - create a new object or open existing one for update.\n"
+ "\n",
+ " create column ...\n"
+ " create cursor ...\n"
+ " create database ...\n"
+ " create schema ...\n"
+ " create table ...\n"
+ "\n",
+ " the create command is used primarily to create new objects, but may\n"
+ " also be used to open and optionally reinitialize certain types of\n"
+ " existing objects, namely database, tables and columns.\n"
+ "\n",
+ "semantic variations on databases, tables or columns:\n"
+ " create or open - create if not there, open otherwise [ open ( O_CREAT ) ]\n"
+ " create or init - create if not there, reinitialize otherwise [ open ( O_CREAT | O_TRUNC ) ]\n"
+ "\n"
+ " type 'help create <object>;' for more information about that command.\n"
+ );
+
+ return 0;
+}
+
+/* delete
+ */
+static
+rc_t kqsh_help_delete ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "delete rows or nodes\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+
+/* drop
+ */
+static
+rc_t kqsh_help_drop ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "remove an object from the file system\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+
+/* execute
+ */
+static
+rc_t kqsh_help_execute ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "run a kqsh script in a sub-scope\n"
+ );
+
+ return 0;
+}
+
+
+/* help
+ */
+static
+rc_t kqsh_help_help ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "print help\n"
+ "\n"
+ "usage:\n"
+ " 'help <topic>;'\n"
+ );
+
+ return 0;
+}
+
+
+/* open
+ */
+static
+rc_t kqsh_help_open_mgr ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "open a library manager\n"
+ "\n%s%s%s",
+ "usage:\n"
+ " 'open kdb [ manager ] [ as ID ];'\n"
+ " 'open vdb [ manager ] [ as ID ];'\n"
+ " 'open sra [ manager ] [ as ID ];'\n"
+ " 'open sra path [ manager ] [ as ID ];'\n"
+ "\n",
+ " this command opens a manager object for the indicated library,\n"
+ " dynamically loading the library if required. the library operational\n"
+ " mode (read-only or update) is selected at kqsh launch time by using\n"
+ " the '-u' switch for update (default is read-only).\n"
+ "\n",
+ " the sra manager can optionally work with a path manager to convert\n"
+ " table accession strings into runtime paths. type 'help open sra;' for\n"
+ " more information.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_open_path_mgr ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ case kw_manager:
+ return kqsh_help_open_mgr ( tbl, src, t );
+
+ case kw_path:
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ case kw_manager:
+ break;
+ default:
+ return expected ( t, klogWarn, "manager" );
+ }
+ }
+ break;
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "open a library or path manager\n"
+ "\n%s%s%s%s%s",
+ "usage:\n"
+ " 'open sra [ manager ] [ as ID ];'\n"
+ " 'open sra path [ manager ] [ as ID ];'\n"
+ "\n",
+ " this command opens a manager object for the indicated library,\n"
+ " dynamically loading the library if required. the library operational\n"
+ " mode (read-only or update) is selected at kqsh launch time by using\n"
+ " the '-u' switch for update (default is read-only).\n"
+ "\n",
+ " the path manager may be opened along with its related db manager.\n"
+ " its purpose is to transform object paths given in open commands from\n"
+ " accessions into runtime paths. for example:\n"
+ "\n",
+ " > 'open sra manager; open sra path manager;'\n"
+ " > 'open table \"SRR000001\" using sramgr;'\n"
+ "\n",
+ " the commands above will open the sra manager under its default name,\n"
+ " then open the installation specific sra path manager and associate the\n"
+ " two, such that the next open table command will convert the given path\n"
+ " from an accession 'SRR000001' to a full file system path.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_open_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "open a cursor\n"
+ "\n"
+ "usage:\n"
+ " 'open ID at ROW;'\n"
+ "\n"
+ " this command will cause a cursor to be opened at the given starting row.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_open_row ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "open a row on cursor\n"
+ "\n"
+ "usage:\n"
+ " 'open row [ ROW ] [ on ] <cursor>;'\n"
+ "\n"
+ " this command will cause a cursor row to be opened.\n"
+ "\n"
+ " if no row id is specified, the current cursor row marker will be used.\n"
+ " otherwise, the cursor marker will be preset to given row id before the\n"
+ " row is opened.\n"
+ "\n"
+ " if the cursor row is already open, the command will succeed provided\n"
+ " that the current row id matches the requested row id.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_open ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ case kw_sra:
+ return kqsh_help_open_path_mgr ( tbl, src, t );
+ case kw_kdb:
+ case kw_vdb:
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ case kw_manager:
+ break;
+ return expected ( t, klogWarn, "manager" );
+ }
+ }
+ case kw_manager:
+ return kqsh_help_open_mgr ( tbl, src, t );
+
+ case kw_cursor:
+ return kqsh_help_open_cursor ( tbl, src, t );
+
+ case kw_row:
+ return kqsh_help_open_row ( tbl, src, t );
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "open an existing object\n"
+ "\n"
+ "usage:\n"
+ " 'open kdb [ manager ] [ as ID ];'\n"
+ " 'open vdb [ manager ] [ as ID ];'\n"
+ " 'open sra [ manager ] [ as ID ];'\n"
+ " 'open sra path [ manager ] [ as ID ];'\n"
+ " 'open column' ...\n"
+ " 'open database' ...\n"
+ " 'open metadata' ...\n"
+ " 'open row' ...\n"
+ " 'open schema' ...\n"
+ " 'open table' ...\n"
+ " 'open cursor' ...\n"
+ "\n"
+ " type 'help open manager;' for more information about those commands,\n"
+ " type 'help open <object>;' for more information about remaining command.\n"
+ );
+
+ return 0;
+}
+
+/* quit aka exit
+ */
+static
+rc_t kqsh_help_quit ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "exit kqsh\n"
+ "\n"
+ "usage:\n"
+ " 'quit;'\n"
+ " 'exit;'\n"
+ );
+
+ return 0;
+}
+
+#define kqsh_help_exit( tbl, src, t ) \
+ kqsh_help_quit ( tbl, src, t )
+
+
+/* rename
+ */
+static
+rc_t kqsh_help_rename ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "rename an object within file system\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+
+/* show
+ */
+static
+rc_t kqsh_help_show_mgr ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "show library manager properties\n"
+ "\n"
+ "usage:\n"
+ " 'show <mgr> version;'\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_show_path_mgr ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ case kw_manager:
+ return kqsh_help_show_mgr ( tbl, src, t );
+
+ case kw_path:
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ case kw_manager:
+ break;
+ default:
+ return expected ( t, klogWarn, "manager" );
+ }
+ }
+ break;
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+ else
+ {
+ return kqsh_help_show_mgr ( tbl, src, t );
+ }
+
+ printf ( "show path manager properties\n"
+ "\n"
+ "usage:\n"
+ " NO USAGE AVAILABLE\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_show_schema ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "inspect an open schema\n"
+ "\n"
+ "usage:\n"
+ " 'show <schema>;'\n"
+ " 'show <schema> types;'\n"
+ " 'show <schema> typesets;'\n"
+ " 'show <schema> formats;'\n"
+ " 'show <schema> constants;'\n"
+ " 'show <schema> functions;'\n"
+ " 'show <schema> columns;'\n"
+ " 'show <schema> tables;'\n"
+ " 'show <schema> databases;'\n"
+ " 'show <schema> . NAME;'\n"
+ " 'show <schema> . NAME # VERSION;'\n"
+ "\n"
+ " this command allows inspection of schema contents by listing object\n"
+ " names or dumping their declarations.\n"
+ );
+
+ return 0;
+}
+
+static
+rc_t kqsh_help_show ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ case kw_sra:
+ return kqsh_help_show_path_mgr ( tbl, src, t );
+
+ case kw_kdb:
+ case kw_vdb:
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ case kw_manager:
+ break;
+ return expected ( t, klogWarn, "manager" );
+ }
+ }
+ case kw_manager:
+ return kqsh_help_show_mgr ( tbl, src, t );
+
+ case kw_schema:
+ return kqsh_help_show_schema ( tbl, src, t );
+
+ default:
+ return expected ( t, klogWarn, "object or ;" );
+ }
+ }
+
+ printf ( "display an object\n"
+ "\n"
+ "usage:\n"
+ " 'show manager ...'\n"
+ " 'show schema ...'\n"
+ "\n"
+ " type 'help show manager;' for more information about those commands,\n"
+ " type 'help show <object>;' for more information about remaining command.\n"
+ );
+
+ return 0;
+}
+
+/* write
+ */
+static
+rc_t kqsh_help_write ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "write or append row data to column or node\n"
+ "%s%s%s%s%s",
+ "\n"
+ "usage:\n"
+ " 'write <cursor>.<column> ROW'\n"
+ " 'write <cursor>.IDX ROW'\n"
+ "\n",
+ "ROW:\n"
+ " STRING - character data\n"
+ " <bin-elem> - non-character datum\n"
+ " '[' <bin-elems> ']' - a vector of non-character data\n"
+ "\n",
+ "bin-elem:\n"
+ " BOOLEAN - the constants 'true' or 'false'\n"
+ " INTEGER - signed or unsigned integer value\n"
+ " FLOAT - floating point value\n"
+ "\n",
+ "bin-elems:\n"
+ " <bin-elem> [ ',' <bin-elems> ]\n"
+ "\n",
+ " specify an open cursor and column by name or ordinal index.\n"
+ " the row data given will be appended to that column.\n"
+ );
+
+ return 0;
+}
+
+
+/* use
+ */
+static
+rc_t kqsh_help_use ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "make object the implicit target of 'using' clause\n"
+ " THIS FEATURE IS NOT YET IMPLEMENTED.\n"
+ );
+
+ return 0;
+}
+
+
+/* macro for generating switch statements */
+#define KQSH_HELP_KEYWORD( topic ) \
+ case kw_ ## topic: return kqsh_help_ ## topic ( tbl, src, t )
+
+/* commands
+ */
+static
+rc_t kqsh_help_commands ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ KQSH_HELP_KEYWORD ( alias );
+ KQSH_HELP_KEYWORD ( alter );
+ KQSH_HELP_KEYWORD ( close );
+ KQSH_HELP_KEYWORD ( create );
+ KQSH_HELP_KEYWORD ( delete );
+ KQSH_HELP_KEYWORD ( drop );
+ KQSH_HELP_KEYWORD ( execute );
+ KQSH_HELP_KEYWORD ( exit );
+ KQSH_HELP_KEYWORD ( help );
+ KQSH_HELP_KEYWORD ( open );
+ KQSH_HELP_KEYWORD ( quit );
+ KQSH_HELP_KEYWORD ( rename );
+ KQSH_HELP_KEYWORD ( show );
+ KQSH_HELP_KEYWORD ( use );
+ KQSH_HELP_KEYWORD ( write );
+
+ default:
+ return expected ( t, klogWarn, "command topic" );
+ }
+ }
+
+ printf ( "kqsh commands:\n"
+ "%s%s%s",
+ " alter - alter an open object\n"
+ " close - close an open object\n"
+ " create - create a new object\n"
+ " execute - execute a kqsh script in a new scope\n"
+ " help - print this list\n"
+ " open - open an existing object\n"
+ " quit - exit shell\n"
+ " show - display object data\n"
+ " write - write a row of data to a column\n"
+ "\n",
+ "unimplemented commands:\n"
+ " alias - create a new name to an file system object\n"
+ " delete - delete rows or nodes\n"
+ " drop - remove an object from the file system\n"
+ " rename - rename an object within file system\n"
+ " use - make object the implicit target of 'using' clause\n"
+ "\n",
+ " type 'help <command>;' for more information about that command.\n"
+ );
+
+ return 0;
+}
+
+/* kdb
+ */
+static
+rc_t kqsh_help_kdb ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "kdb objects:\n"
+ " kdb manager - root object of kdb\n"
+ " kdb database - raw, physical database\n"
+ " kdb table - raw, physical table\n"
+ " kdb column - raw, physical column with opaque data\n"
+ " kdb metadata - associated with manager, database, table and column\n"
+ "\n"
+ " NB - in some tables with early version columns, metadata may not be present.\n"
+ );
+
+ return 0;
+}
+
+
+/* vdb
+ */
+static
+rc_t kqsh_help_vdb ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "vdb objects:\n"
+ " vdb manager - root object of vdb\n"
+ " vdb schema - describes other objects\n"
+ " vdb database - can contain tables, indices and sub-databases\n"
+ " vdb table - can contain columns and indices\n"
+ " vdb cursor - a group of user-selected columns\n"
+ "\n"
+ " the vdb manager builds upon the kdb manager. it allows use\n"
+ " and definition of schema objects which describe the shape and\n"
+ " behavior of other objects that may be created or opened under vdb.\n"
+ );
+
+ return 0;
+}
+
+
+/* sra
+ */
+static
+rc_t kqsh_help_sra ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+ default:
+ return expected ( t, klogWarn, ";" );
+ }
+ }
+
+ printf ( "sra objects:\n"
+ " sra manager - root object of sra\n"
+ " sra path manager - installation specific path translator\n"
+ " sra table - can contain columns and indices\n"
+ "\n"
+ " the sra manager builds upon the vdb manager. it has a pre-defined\n"
+ " schema within the sra domain and the objects provide some interface\n"
+ " refinements of their vdb counterparts.\n"
+ "\n"
+ " not all installations will have an sra path manager for translating\n"
+ " paths given to the open command. when not available or used, open paths\n"
+ " will be used as given.\n"
+ );
+
+ return 0;
+}
+
+
+/* objects
+ */
+static
+rc_t kqsh_help_objects ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ KQSH_HELP_KEYWORD ( kdb );
+ KQSH_HELP_KEYWORD ( vdb );
+ KQSH_HELP_KEYWORD ( sra );
+
+#if 0
+ KQSH_HELP_KEYWORD ( column );
+ KQSH_HELP_KEYWORD ( database );
+ KQSH_HELP_KEYWORD ( metadata );
+ KQSH_HELP_KEYWORD ( schema );
+ KQSH_HELP_KEYWORD ( table );
+#endif
+
+ default:
+ return expected ( t, klogWarn, "object class" );
+ }
+ }
+
+ printf ( "kqsh objects:\n"
+ " kdb ...\n"
+ " vdb ...\n"
+ " sra ...\n"
+ " column\n"
+ " cursor\n"
+ " database\n"
+ " metadata\n"
+ " schema\n"
+ " table\n"
+ "\n"
+ " type 'help <object>;' for more information about that object.\n"
+ );
+
+ return 0;
+}
+
+/* kqsh
+ */
+rc_t kqsh_help ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ /* this is one command where we don't insist on a trailing ';'
+ because the user might just be getting it figured out */
+ if ( ! interactive || KTokenSourceAvail ( src ) > 1 )
+ {
+ /* this command could still block */
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eEndOfInput:
+ case eSemiColon:
+ break;
+
+ KQSH_HELP_KEYWORD ( commands );
+ KQSH_HELP_KEYWORD ( objects );
+
+ KQSH_HELP_KEYWORD ( alias );
+ KQSH_HELP_KEYWORD ( alter );
+ KQSH_HELP_KEYWORD ( close );
+ KQSH_HELP_KEYWORD ( create );
+ KQSH_HELP_KEYWORD ( delete );
+ KQSH_HELP_KEYWORD ( drop );
+ KQSH_HELP_KEYWORD ( execute );
+ KQSH_HELP_KEYWORD ( help );
+ KQSH_HELP_KEYWORD ( open );
+ KQSH_HELP_KEYWORD ( quit );
+ KQSH_HELP_KEYWORD ( rename );
+ KQSH_HELP_KEYWORD ( show );
+ KQSH_HELP_KEYWORD ( use );
+ KQSH_HELP_KEYWORD ( write );
+
+ KQSH_HELP_KEYWORD ( kdb );
+ KQSH_HELP_KEYWORD ( vdb );
+ KQSH_HELP_KEYWORD ( sra );
+
+#if 0
+ KQSH_HELP_KEYWORD ( column );
+ KQSH_HELP_KEYWORD ( database );
+ KQSH_HELP_KEYWORD ( metadata );
+ KQSH_HELP_KEYWORD ( schema );
+ KQSH_HELP_KEYWORD ( table );
+#endif
+
+ default:
+ return expected ( t, klogWarn, "help topic" );
+ }
+ }
+
+ /* general help */
+ printf ( "kqsh help:\n"
+ "\n"
+ " topics:\n"
+ " commands -- list shell commands\n"
+ " objects -- list objects and their usage\n"
+ "\n"
+ " the command processor expects a semi-colon ( ';' ) to process each command.\n"
+ " this is not intended to be irritating, but the shell itself is NOT line oriented\n"
+ " which requires a statement terminator. the 'help' and 'quit' commands are the only\n"
+ " exceptions to this rule.\n"
+ "\n"
+ " type 'help <topic>;' for more information about that topic.\n"
+ );
+
+ return 0;
+}
diff --git a/tools/kqsh/kqsh-load.c b/tools/kqsh/kqsh-load.c
new file mode 100644
index 0000000..88c32c5
--- /dev/null
+++ b/tools/kqsh/kqsh-load.c
@@ -0,0 +1,410 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+#include "kqsh-sra.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <kdb/manager.h>
+#include <vdb/manager.h>
+
+#include <kfs/directory.h>
+#include <kfs/dyload.h>
+#include <klib/log.h>
+#include <klib/vector.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* library names on disk */
+#define LIBSTR2( str ) # str
+#define LIBSTR( str ) LIBSTR2 ( str )
+
+#if defined LIBKDB
+
+#define LIBKDBSTR LIBSTR ( LIBKDB )
+#define LIBWKDBSTR LIBSTR ( LIBWKDB )
+#define LIBVDBSTR LIBSTR ( LIBVDB )
+#define LIBWVDBSTR LIBSTR ( LIBWVDB )
+#define LIBSRADBSTR LIBSTR ( LIBSRADB )
+#define LIBWSRADBSTR LIBSTR ( LIBWSRADB )
+
+#elif defined LIBNCBI_VDB
+
+#define LIBKDBSTR LIBSTR ( LIBNCBI_VDB )
+#define LIBWKDBSTR LIBSTR ( LIBNCBI_WVDB )
+#define LIBVDBSTR LIBSTR ( LIBNCBI_VDB )
+#define LIBWVDBSTR LIBSTR ( LIBNCBI_WVDB )
+#define LIBSRADBSTR LIBSTR ( LIBNCBI_VDB )
+#define LIBWSRADBSTR LIBSTR ( LIBNCBI_WVDB )
+
+#else
+#error need a library name
+#endif
+
+/* dynamic loader */
+static KDyld *dl;
+
+
+/* init_libpath
+ * initialize the library path
+ */
+rc_t kqsh_init_libpath ( void )
+{
+ return KDyldMake ( & dl );
+}
+
+
+/* whack_libpath
+ */
+void kqsh_whack_libpath ( void )
+{
+ KDyldRelease ( dl );
+ dl = NULL;
+}
+
+/* update_libpath
+ */
+rc_t kqsh_update_libpath ( const char *path )
+{
+ const char *end;
+ for ( end = strchr ( path, ':' ); end != NULL; end = strchr ( path = end + 1, ':' ) )
+ {
+ if ( path < end )
+ KDyldAddSearchPath ( dl, "%.*s", ( int ) ( end - path ), path );
+ }
+
+ if ( path [ 0 ] != 0 )
+ KDyldAddSearchPath ( dl, path );
+
+ return 0;
+}
+
+
+/* system_libpath
+ */
+rc_t kqsh_system_libpath ( void )
+{
+ const char *LD_LIBRARY_PATH = getenv ( "LD_LIBRARY_PATH" );
+
+ if ( LD_LIBRARY_PATH == NULL )
+ return 0;
+
+ return kqsh_update_libpath ( LD_LIBRARY_PATH );
+}
+
+/* load_lib
+ * loads the library
+ * fetches function to make manager
+ */
+static
+rc_t kqsh_load_lib ( KDylib **lib, const char *libname, char *path, size_t path_size )
+{
+ rc_t rc = KDyldLoadLib ( dl, lib, libname );
+ if ( rc == 0 )
+ {
+ /* return path to caller */
+ rc = KDylibFullPath ( * lib, path, path_size );
+ if ( rc != 0 )
+ path [ 0 ] = 0;
+
+ return 0;
+ }
+
+ return rc;
+}
+
+static
+rc_t kqsh_import_sym ( const KDylib *lib, fptr_t *addr, const char *name )
+{
+ KSymAddr *sym;
+ rc_t rc = KDylibSymbol ( lib, & sym, name );
+ if ( rc == 0 )
+ {
+ KSymAddrAsFunc ( sym, addr );
+ KSymAddrRelease ( sym );
+ }
+ return rc;
+}
+
+#if 0
+static
+void kqsh_set_lib_log_handler ( const KDylib *lib )
+{
+ const KWrtHandler *handler = KLogHandlerGet ();
+ rc_t ( CC * klogLibHandlerSet ) ( KWrtWriter writer, void *data );
+ rc_t rc = kqsh_import_sym ( lib, ( fptr_t* ) & klogLibHandlerSet, "KLogLibHandlerSet" );
+ if ( rc == 0 )
+ {
+ rc_t ( CC * klogLibFmtHandlerSetDefault ) ( void );
+ rc = kqsh_import_sym ( lib, ( fptr_t* ) & klogLibFmtHandlerSetDefault, "KLogLibFmtHandlerSetDefault" );
+ if ( rc == 0 )
+ {
+ ( * klogLibHandlerSet ) ( handler -> writer, handler -> data );
+ ( * klogLibFmtHandlerSetDefault ) ();
+ }
+ }
+}
+#endif
+
+static
+rc_t kqsh_import_lib ( kqsh_libdata *libdata, const char *libname )
+{
+ /* load the library */
+ char path [ 4096 ];
+ rc_t rc = kqsh_load_lib ( & libdata -> lib, libname, path, sizeof path );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to load library '$(lib)'", "lib=%s", libname ));
+ else
+ {
+ int i;
+ bool done_update = read_only;
+ fptr_t *vt = libdata -> cvt;
+ const char *msg, **msgv = & libdata -> msg [ 1 ];
+#if 0
+ /* tell library to log to stderr */
+ kqsh_set_lib_log_handler ( libdata -> lib );
+#endif
+ /* import first symbol according to operating mode */
+ msg = msgv [ read_only ? -1 : 0 ];
+ rc = kqsh_import_sym ( libdata -> lib, & vt [ 0 ], msg );
+
+ /* import remaining symbols */
+ for ( i = 1; rc == 0; ++ i )
+ {
+ /* detect end of list */
+ msg = msgv [ i ];
+ if ( msgv [ i ] == NULL )
+ {
+ /* exit if both const and update sides done */
+ if ( done_update )
+ {
+ if ( interactive )
+ kqsh_printf ( "loaded library '%s'\n", path );
+ return 0;
+ }
+
+ /* switch to update side */
+ vt = libdata -> wvt;
+ msgv = libdata -> wmsg;
+ done_update = true;
+ i = -1;
+ continue;
+ }
+
+ /* import symbol */
+ rc = kqsh_import_sym ( libdata -> lib, & vt [ i ], msg );
+ }
+
+ /* failed to find symbol */
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to resolve symbol $(msg) in library '$(path)'"
+ , "msg=%s,path=%s", msg, path ));
+ }
+
+ return rc;
+}
+
+/* load
+ * expects "t" to describe a library class, i.e.
+ * 'open <lib> mgr...'
+ * ^
+ */
+rc_t kqsh_load ( struct KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ rc_t rc = 0;
+ void *mgr;
+ String name;
+ uint32_t type;
+ const char *libtype;
+ KSymbol *existing;
+
+ /* for loading library */
+ struct { kqsh_libdata *data; const char *ro, *rw; } libs [ 3 ] =
+ {
+ { & kdb_data, LIBKDBSTR, LIBWKDBSTR },
+ { & vdb_data, LIBVDBSTR, LIBWVDBSTR },
+ { & sra_data, LIBSRADBSTR, LIBWSRADBSTR }
+ };
+
+ uint32_t lib_idx;
+
+ /* select which library */
+ switch ( t -> id )
+ {
+ case kw_kdb:
+ CONST_STRING ( & name, "kmgr" );
+ libtype = "kdb";
+ lib_idx = 0;
+ type = obj_KDBManager;
+ break;
+ case kw_vdb:
+ CONST_STRING ( & name, "vmgr" );
+ libtype = "vdb";
+ lib_idx = 1;
+ type = obj_VDBManager;
+ break;
+ case kw_sra:
+ CONST_STRING ( & name, "sramgr" );
+ libtype = "sra";
+ lib_idx = 2;
+ type = obj_SRAManager;
+ break;
+ default:
+ return expected ( t, klogErr, "kdb, vdb or sra" );
+ }
+
+ /* treat 'manager' as optional - it's understood */
+ if ( next_token ( tbl, src, t ) -> id == kw_manager )
+ next_token ( tbl, src, t );
+
+ /* capture optional manager name */
+ switch ( t -> id )
+ {
+ case kw_as:
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eIdent:
+ break;
+
+ case rsrv_kmgr:
+ case obj_KDBManager:
+ if ( type == obj_KDBManager )
+ break;
+ return expected ( t, klogErr, "identifier" );
+
+ case rsrv_vmgr:
+ case obj_VDBManager:
+ if ( type == obj_VDBManager )
+ break;
+
+ case rsrv_sramgr:
+ case obj_SRAManager:
+ if ( type == obj_SRAManager )
+ break;
+
+ default:
+ return expected ( t, klogErr, "identifier" );
+ }
+
+ name = t -> str;
+ existing = t -> sym;
+
+ next_token ( tbl, src, t );
+ break;
+
+ default:
+ existing = KSymTableFind ( tbl, & name );
+ }
+
+ /* process existing */
+ if ( existing != NULL && existing -> type >= obj_first )
+ {
+ kqsh_printf ( "%s manager '%N' ( %p ) is already open.\n",
+ libtype, existing, existing -> u . obj );
+ libs [ lib_idx ] . data -> dflt = existing;
+ return 0;
+ }
+
+ /* load library if required */
+ if ( libs [ lib_idx ] . data -> lib == NULL )
+ {
+ uint32_t i;
+ for ( i = 0; i <= lib_idx; ++ i )
+ {
+ rc = kqsh_import_lib ( libs [ i ] . data,
+ read_only ? libs [ i ] . ro : libs [ i ] . rw );
+ if ( rc != 0 )
+ return rc;
+ }
+ }
+
+ /* create mgr object */
+ switch ( type )
+ {
+ case obj_KDBManager:
+ rc = _KDBManagerMake ( ( struct KDBManager** ) & mgr, NULL );
+ break;
+ case obj_VDBManager:
+ rc = _VDBManagerMake ( ( struct VDBManager** ) & mgr, NULL );
+ break;
+ case obj_SRAManager:
+ rc = _SRAMgrMake ( ( struct SRAMgr** ) & mgr, NULL );
+ break;
+ }
+
+ if ( rc == 0 )
+ {
+ KSymbol *sym;
+
+ /* create symbol */
+ rc = KSymTableCreateSymbol ( tbl, & sym, & name, type, mgr );
+ if ( rc == 0 )
+ {
+ libs [ lib_idx ] . data -> dflt = sym;
+ if ( interactive )
+ {
+ kqsh_printf ( "opened %s manager '%N' ( %p ) for %s\n"
+ , libtype
+ , sym, sym -> u . obj
+ , read_only ? "read" : "update" );
+ }
+ return 0;
+ }
+
+ /* whack instance */
+ switch ( type )
+ {
+ case obj_KDBManager:
+ _KDBManagerRelease ( ( const void* ) mgr );
+ break;
+ case obj_VDBManager:
+ _VDBManagerRelease ( ( const void* ) mgr );
+ break;
+ case obj_SRAManager:
+ _SRAMgrRelease ( ( const void* ) mgr );
+ break;
+ }
+ }
+
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to open $(type) manager '$(name)' for $(mode)"
+ , "type=%s,name=%.*s,mode=%s"
+ , libtype
+ , ( int ) name . size, name . addr
+ , read_only ? "read" : "update" ));
+
+ return rc;
+}
diff --git a/tools/kqsh/kqsh-open.c b/tools/kqsh/kqsh-open.c
new file mode 100644
index 0000000..2ea2687
--- /dev/null
+++ b/tools/kqsh/kqsh-open.c
@@ -0,0 +1,199 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* open cursor
+ * open ID;
+ */
+static
+rc_t kqsh_open_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ rc_t rc;
+ KSymbol *sym = t -> sym;
+
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ rc = _VCursorOpen ( sym -> u . obj );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to open cursor '$(name)' ( $(addr) )"
+ , "name=%.*s,addr=0x%zX"
+ , ( int ) sym -> name . size, sym -> name . addr
+ , ( size_t ) sym -> u . obj ));
+ }
+ else if ( interactive )
+ {
+ kqsh_printf ( "opened cursor '%N' ( %p )\n"
+ , sym, sym -> u . obj );
+ }
+
+ return rc;
+}
+
+static
+rc_t kqsh_open_row ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ rc_t rc = 0;
+ KSymbol *curs;
+ int64_t row_id;
+ bool has_row_id = false;
+ bool negate = false;
+
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ case eMinus:
+ negate = true;
+ case ePlus:
+ next_token ( tbl, src, t );
+ break;
+ }
+
+ switch ( t -> id )
+ {
+ case eHex:
+ if ( negate )
+ LOGMSG ( klogWarn, "negative hex integer" );
+ case eDecimal:
+ case eOctal:
+ rc = KTokenToI64 ( t, & row_id );
+ if ( rc != 0 )
+ return expected ( t, klogErr, "integer row id" );
+ if ( negate )
+ row_id = - row_id;
+ has_row_id = true;
+ next_token ( tbl, src, t );
+ break;
+ default:
+ if ( negate )
+ return expected ( t, klogErr, "integer row id" );
+ }
+
+ if ( t -> id == kw_on )
+ next_token ( tbl, src, t );
+
+ switch ( t -> id )
+ {
+ case obj_VCursor:
+ curs = t -> sym;
+ break;
+ default:
+ return expected ( t, klogErr, "cursor" );
+ }
+
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ if ( has_row_id )
+ {
+ switch ( curs -> type )
+ {
+ case obj_VCursor:
+ rc = _VCursorSetRowId ( curs -> u . obj, row_id );
+ break;
+ }
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to open row $(id) on cursor '$(name)' ( $(addr) )"
+ , "id=%ld,name=%.*s,addr=0x%zX"
+ , row_id
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ return rc;
+ }
+ }
+
+ switch ( curs -> type )
+ {
+ case obj_VCursor:
+ rc = _VCursorOpenRow ( curs -> u . obj );
+ break;
+ }
+
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to open row on cursor '$(name)' ( $(addr) )"
+ , "name=%.*s,addr=0x%zX"
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ }
+ else if ( interactive )
+ {
+ if ( has_row_id )
+ {
+ kqsh_printf ( "opened row %ld on cursor '%N' ( %p )\n"
+ , row_id, curs, curs -> u . obj );
+ }
+ else
+ {
+ kqsh_printf ( "opened row on cursor '%N' ( %p )\n"
+ , curs, curs -> u . obj );
+ }
+ }
+
+ return rc;
+}
+
+/* open
+ */
+rc_t kqsh_open ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ switch ( t -> id )
+ {
+ case kw_kdb:
+ case kw_vdb:
+ case kw_sra:
+ /* handle open manager as a load library */
+ return kqsh_load ( tbl, src, t );
+
+ case kw_row:
+ return kqsh_open_row ( tbl, src, t );
+
+ case obj_VCursor:
+ return kqsh_open_cursor ( tbl, src, t );
+ }
+
+ return expected ( t, klogErr, "manager or cursor or row" );
+}
diff --git a/tools/kqsh/kqsh-parse.c b/tools/kqsh/kqsh-parse.c
new file mode 100644
index 0000000..8c0fbec
--- /dev/null
+++ b/tools/kqsh/kqsh-parse.c
@@ -0,0 +1,198 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* kqsh_execute
+ *
+ * 'execute' PATH ';'
+ */
+static
+rc_t kqsh_execute ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ String path;
+
+ if ( t -> id != eString )
+ return expected ( t, klogErr, "file path" );
+
+ path = t -> str;
+ path . addr += 1;
+ path . size -= 2;
+ path . len -= 2;
+
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ return kqsh_exec_file ( tbl, & path );
+}
+
+
+/* macro for generating switch statements */
+#define KQSH_CMD_KEYWORD( cmd ) \
+ case kw_ ## cmd: \
+ rc = kqsh_ ## cmd ( tbl, src, next_token ( tbl, src, & t ) ); \
+ break
+
+/* case for unimplemented commands */
+#define UNIMPL_CMD_KEYWORD( cmd ) \
+ case kw_ ## cmd: ( void ) 0
+
+/* kqsh
+ * main loop for shell
+ */
+static
+rc_t kqsh_parse ( KSymTable *tbl, KTokenSource *src, kqsh_stack *frame )
+{
+ rc_t rc;
+ KToken t;
+
+ for ( rc = 0, frame -> cmd_num = 1; rc == 0; ++ frame -> cmd_num )
+ {
+ /* check for signals */
+ rc = Quitting ();
+ if ( rc != 0 )
+ break;
+
+ /* issue prompt */
+ /* the prompt should allow db.db.tbl.obj stack or 'kqsh' when empty */
+ if ( interactive )
+ kqsh_printf ( "\nkqsh|%F> ", frame );
+
+ /* process input */
+ next_token ( tbl, src, & t );
+ if ( interactive )
+ kqsh_printf ( "\n" );
+
+ switch ( t . id )
+ {
+ case eEndOfInput:
+ return 0;
+ case eSemiColon:
+ break;
+
+ case eHash:
+ while ( 1 )
+ {
+ KTokenizerNext ( kLineTokenizer, src, & t );
+ if ( t . id == eEndOfLine || t . id == eEndOfInput )
+ break;
+ }
+ break;
+
+ /* implemented commands */
+ KQSH_CMD_KEYWORD ( alter );
+ KQSH_CMD_KEYWORD ( close );
+ KQSH_CMD_KEYWORD ( create );
+ KQSH_CMD_KEYWORD ( execute );
+ KQSH_CMD_KEYWORD ( open );
+ KQSH_CMD_KEYWORD ( show );
+ KQSH_CMD_KEYWORD ( write );
+
+ /* unimplemented commands */
+ UNIMPL_CMD_KEYWORD ( alias );
+ UNIMPL_CMD_KEYWORD ( delete );
+ UNIMPL_CMD_KEYWORD ( drop );
+ UNIMPL_CMD_KEYWORD ( insert );
+ UNIMPL_CMD_KEYWORD ( rename );
+ UNIMPL_CMD_KEYWORD ( update );
+ UNIMPL_CMD_KEYWORD ( use );
+ if ( interactive )
+ kqsh_printf ( "the %S command is not yet implemented.\n", & t . str );
+ rc = RC ( rcExe, rcNoTarg, rcExecuting, rcFunction, rcIncomplete );
+ break;
+
+ /* help and quit are special
+ in that they don't require a semi-colon
+ and thus can't use look-ahead which might block */
+ case kw_help:
+ rc = kqsh_help ( tbl, src, & t );
+ break;
+ case kw_exit:
+ case kw_quit:
+ return 0;
+
+ default:
+ rc = expected ( & t, klogErr, "command" );
+ }
+
+ /* tolerate errors in interactive mode */
+ if ( rc != 0 && interactive )
+ {
+ KTokenSourceConsume ( src );
+ rc = 0;
+ }
+ }
+
+ return rc;
+}
+
+
+rc_t kqsh ( KSymTable *tbl, KTokenSource *src )
+{
+ rc_t rc;
+ BSTree scope;
+
+ kqsh_stack frame;
+ static kqsh_stack const *stk = NULL;
+
+ frame . prev = stk;
+ stk = & frame;
+
+ BSTreeInit ( & scope );
+
+ rc = KSymTablePushScope ( tbl, & scope );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to initialize symbol table" );
+ else
+ {
+ rc = kqsh_parse ( tbl, src, & frame );
+
+ KSymTablePopScope ( tbl );
+ BSTreeWhack ( & scope, kqsh_whackobj, NULL );
+ }
+
+ stk = frame . prev;
+
+ return rc;
+}
diff --git a/tools/kqsh/kqsh-print.c b/tools/kqsh/kqsh-print.c
new file mode 100644
index 0000000..696bcbc
--- /dev/null
+++ b/tools/kqsh/kqsh-print.c
@@ -0,0 +1,170 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+
+#include <klib/symbol.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+
+/* printf
+ * understands printing KSymbol
+ */
+static
+int kqsh_print_frame ( const kqsh_stack *frame )
+{
+ assert ( frame != NULL );
+
+ if ( frame -> prev != NULL )
+ {
+ int status = kqsh_print_frame ( frame -> prev );
+ if ( status != 0 )
+ return status;
+ return KOutMsg ( ".%u", frame -> cmd_num );
+ }
+
+ return KOutMsg ( "%u", frame -> cmd_num );
+}
+
+static
+int kqsh_vprintf ( const char *format, va_list args )
+{
+ int status;
+ const char *start, *end;
+
+ for ( status = 0, start = end = format; * end != 0; ++ end )
+ {
+ /* const String *s; */
+
+ switch ( * end )
+ {
+ case '%':
+ if ( end > start )
+ {
+ status = KOutMsg ( "%.*s", ( uint32_t ) ( end - start ), start );
+ if ( status != 0 )
+ break;
+ }
+ switch ( * ( ++ end ) )
+ {
+ case 'd':
+ status = KOutMsg ( "%d", va_arg ( args, int ) );
+ break;
+ case 'u':
+ status = KOutMsg ( "%u", va_arg ( args, unsigned int ) );
+ break;
+ case 'x':
+ status = KOutMsg ( "%x", va_arg ( args, unsigned int ) );
+ break;
+ case 'X':
+ status = KOutMsg ( "%X", va_arg ( args, unsigned int ) );
+ break;
+ case 'f':
+ status = KOutMsg ( "%f", va_arg ( args, double ) );
+ break;
+ case 'l':
+ switch ( * ( ++ end ) )
+ {
+ case 'd':
+ status = KOutMsg ( "%ld", va_arg ( args, int64_t ) );
+ break;
+ case 'u':
+ status = KOutMsg ( "%lu", va_arg ( args, uint64_t ) );
+ break;
+ case 'x':
+ status = KOutMsg ( "%lx", va_arg ( args, uint64_t ) );
+ break;
+ case 'X':
+ status = KOutMsg ( "%lX", va_arg ( args, uint64_t ) );
+ break;
+ }
+ break;
+ case 'p':
+ status = KOutMsg ( "0x%lX", va_arg ( args, size_t ) );
+ break;
+ case 's':
+ status = KOutMsg ( "%s", va_arg ( args, const char* ) );
+ break;
+ case '.':
+ if ( end [ 1 ] == '*' && end [ 2 ] == 's' )
+ {
+ end += 2;
+ status = va_arg ( args, int );
+ status = KOutMsg ( "%.*s", status, va_arg ( args, const char* ) );
+ break;
+ }
+ /* not handling anything else */
+ status = KOutMsg ( "%%." );
+ break;
+ case 'S':
+ status = KOutMsg ( "%S", va_arg ( args, const String* ) );
+ break;
+ case 'N':
+ status = KOutMsg ( "%N", va_arg ( args, const KSymbol* ) );
+ break;
+ case 'F':
+ status = kqsh_print_frame ( va_arg ( args, const kqsh_stack* ) );
+ break;
+ case '%':
+ status = KOutMsg ( "%%" );
+ break;
+ }
+
+ start = end + 1;
+ break;
+ }
+
+ if ( status < 0 )
+ break;
+ }
+
+ if ( status >= 0 && end > start )
+ status = KOutMsg ( "%.*s", ( uint32_t ) ( end - start ), start );
+
+ fflush ( stdout );
+
+ return status;
+}
+
+int kqsh_printf ( const char *format, ... )
+{
+ int status;
+ va_list args;
+
+ va_start ( args, format );
+ status = kqsh_vprintf ( format, args );
+ va_end ( args );
+
+ return status;
+}
diff --git a/tools/kqsh/kqsh-priv.h b/tools/kqsh/kqsh-priv.h
new file mode 100644
index 0000000..eb40a01
--- /dev/null
+++ b/tools/kqsh/kqsh-priv.h
@@ -0,0 +1,151 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kqsh_priv_
+#define _h_kqsh_priv_
+
+#ifndef _h_klib_token_
+#include <klib/token.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct Vector;
+struct BSTNode;
+struct KDylib;
+struct KSymTable;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * library data
+ */
+typedef struct kqsh_libdata kqsh_libdata;
+struct kqsh_libdata
+{
+ /* library */
+ struct KDylib *lib;
+
+ /* default manager */
+ struct KSymbol *dflt;
+
+ /* const messages */
+ const char **msg;
+ fptr_t *cvt;
+
+ /* update messages */
+ const char **wmsg;
+ fptr_t *wvt;
+};
+
+/*--------------------------------------------------------------------------
+ * kqsh
+ */
+
+/* globals
+ * "read_only" - true if update operations are not available
+ *
+ * "interactive" - true if (apparently) using console interface
+ *
+ * "*_data" - data for the individual libraries
+ */
+extern bool read_only;
+extern bool interactive;
+extern kqsh_libdata kdb_data;
+extern kqsh_libdata vdb_data;
+extern kqsh_libdata sra_data;
+
+/* stack frame
+ * for recursive kqsh'ing
+ */
+typedef struct kqsh_stack kqsh_stack;
+struct kqsh_stack
+{
+ const kqsh_stack *prev;
+ uint32_t cmd_num;
+};
+
+/* kqsh
+ * main shell
+ */
+rc_t kqsh ( struct KSymTable *tbl, KTokenSource *src );
+rc_t kqsh_exec_file ( struct KSymTable *tbl, const String *path );
+
+/* kqsh-print
+ * understands printing KSymbol
+ */
+int kqsh_printf ( const char *format, ... );
+
+/* kqsh-alter
+ */
+rc_t kqsh_alter ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-close
+ */
+void CC kqsh_whackobj ( struct BSTNode *n, void *ignore );
+rc_t kqsh_close ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-help
+ * help for commands and objects
+ */
+rc_t kqsh_help ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-load
+ * dylib loading and manager open
+ */
+rc_t kqsh_init_libpath ( void );
+void kqsh_whack_libpath ( void );
+rc_t kqsh_update_libpath ( const char *path );
+rc_t kqsh_system_libpath ( void );
+rc_t kqsh_load ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-open
+ * create and open described objects
+ */
+rc_t kqsh_create ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+rc_t kqsh_open ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-show
+ */
+rc_t kqsh_show ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+/* kqsh-write
+ */
+rc_t kqsh_write ( struct KSymTable *tbl, KTokenSource *src, KToken *t );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kqsh_priv_ */
diff --git a/tools/kqsh/kqsh-show.c b/tools/kqsh/kqsh-show.c
new file mode 100644
index 0000000..141493e
--- /dev/null
+++ b/tools/kqsh/kqsh-show.c
@@ -0,0 +1,290 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+
+#include <vdb/schema.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*--------------------------------------------------------------------------
+ * KDBManager
+ */
+
+static
+rc_t kqsh_show_kmgr_version ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ rc_t rc;
+ uint32_t vers;
+
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ rc = _KDBManagerVersion ( sym -> u . obj, & vers );
+ if ( rc == 0 )
+ {
+ if ( ( vers & 0xFFFF ) != 0 )
+ kqsh_printf ( "kdb manager '%N' v%u.%u.%u\n", sym, vers >> 24, ( vers >> 16 ) & 0xFF, vers & 0xFFFF );
+ else
+ kqsh_printf ( "kdb manager '%N' v%u.%u\n", sym, vers >> 24, ( vers >> 16 ) & 0xFF );
+ }
+ else
+ {
+ PLOGERR ( klogInt, (klogInt, rc, "failed to obtain version of kdb manager '$(name)'",
+ "name=%.*s", ( int ) sym -> name . size, sym -> name . addr ));
+ }
+
+ return rc;
+}
+
+static
+rc_t kqsh_show_kmgr ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ switch ( t -> id )
+ {
+ case kw_version:
+ return kqsh_show_kmgr_version ( tbl, src, next_token ( tbl, src, t ), sym );
+ }
+
+ return expected ( t, klogErr, "version" );
+}
+
+/*--------------------------------------------------------------------------
+ * VDBManager
+ */
+
+static
+rc_t kqsh_show_vmgr_version ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ rc_t rc;
+ uint32_t vers;
+
+ if ( t -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+
+ rc = _VDBManagerVersion ( sym -> u . obj, & vers );
+ if ( rc == 0 )
+ {
+ if ( ( vers & 0xFFFF ) != 0 )
+ kqsh_printf ( "vdb manager '%N' v%u.%u.%u\n", sym, vers >> 24, ( vers >> 16 ) & 0xFF, vers & 0xFFFF );
+ else
+ kqsh_printf ( "vdb manager '%N' v%u.%u\n", sym, vers >> 24, ( vers >> 16 ) & 0xFF );
+ }
+ else
+ {
+ PLOGERR ( klogInt, (klogInt, rc, "failed to obtain version of vdb manager '$(name)'",
+ "name=%.*s", ( int ) sym -> name . size, sym -> name . addr ));
+ }
+
+ return rc;
+}
+
+static
+rc_t kqsh_show_vmgr ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym )
+{
+ switch ( t -> id )
+ {
+ case kw_version:
+ return kqsh_show_vmgr_version ( tbl, src, next_token ( tbl, src, t ), sym );
+ }
+
+ return expected ( t, klogErr, "version" );
+}
+
+/*--------------------------------------------------------------------------
+ * VSchema
+ */
+
+static
+rc_t CC kqsh_flush_schema ( void *f, const void *buffer, size_t bsize )
+{
+ size_t num_writ, total;
+
+ for ( total = 0; total < bsize; total += num_writ )
+ {
+ num_writ = fwrite ( buffer, 1, bsize, f );
+ if ( num_writ == 0 )
+ return RC ( rcExe, rcFile, rcWriting, rcNoObj, rcUnknown );
+ }
+
+ return 0;
+}
+
+static
+rc_t kqsh_dump_schema ( KSymbol *sym, uint32_t mode, const String *decl )
+{
+ rc_t rc;
+ char buffer [ 256 ];
+
+ if ( decl -> size != 0 )
+ {
+ string_copy ( buffer, sizeof buffer, decl -> addr, decl -> size );
+ buffer [ sizeof buffer - 1 ] = 0;
+ }
+
+ if ( interactive )
+ putchar ( '\n' );
+
+ rc = _VSchemaDump ( sym -> u . obj, mode,
+ decl -> size ? buffer : NULL, kqsh_flush_schema, stdout );
+
+ if ( rc != 0 )
+ {
+ printf ( "\n\n\n***** ABORTED *****\n\n" );
+ PLOGERR ( klogInt, (klogInt, rc, "failed to dump schema '$(name)'",
+ "name=%.*s", ( int ) sym -> name . size, sym -> name . addr ));
+ }
+
+ if ( interactive )
+ putchar ( '\n' );
+
+ return rc;
+}
+
+enum VSchemaDumpClass
+{
+ sdcTypes = 1,
+ sdcTypesets,
+ sdcFormats,
+ sdcConstants,
+ sdcFunctions,
+ sdcColumns,
+ sdcTables,
+ sdcDatabases
+};
+
+static
+rc_t kqsh_show_schema ( KSymTable *tbl, KTokenSource *src, KToken *t, KSymbol *sym, uint32_t mode )
+{
+ String decl;
+ CONST_STRING ( & decl, "" );
+
+ switch ( t -> id )
+ {
+ case eSemiColon:
+ break;
+ case kw_types:
+ mode |= sdcTypes << 8;
+ break;
+ case kw_typesets:
+ mode |= sdcTypesets << 8;
+ break;
+ case kw_formats:
+ mode |= sdcFormats << 8;
+ break;
+ case kw_constants:
+ mode |= sdcConstants << 8;
+ break;
+ case kw_functions:
+ mode |= sdcFunctions << 8;
+ break;
+ case kw_columns:
+ mode |= sdcColumns << 8;
+ break;
+ case kw_tables:
+ mode |= sdcTables << 8;
+ break;
+ case kw_databases:
+ mode |= sdcDatabases << 8;
+ break;
+ case ePeriod:
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ {
+ decl = t -> str;
+ while ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ decl . size = t -> str . addr + t -> str . size - decl . addr;
+ decl . len = string_len ( decl . addr, decl . size );
+ break;
+ }
+ default:
+ return expected ( t, klogErr, "formats or types or typesets or constants or functions or columns or tables or databases" );
+ }
+
+ return kqsh_dump_schema ( sym, mode, & decl );
+}
+
+/*--------------------------------------------------------------------------
+ * kqsh
+ */
+
+/* show
+ */
+rc_t kqsh_show ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ uint32_t mode = sdmPrint;
+ KSymbol *sym = t -> sym;
+
+ switch ( t -> id )
+ {
+ case kw_manager:
+ sym = next_token ( tbl, src, t ) -> sym;
+ switch ( t -> id )
+ {
+ case obj_KDBManager:
+ return kqsh_show_kmgr ( tbl, src, next_token ( tbl, src, t ), sym );
+ case obj_VDBManager:
+ return kqsh_show_vmgr ( tbl, src, next_token ( tbl, src, t ), sym );
+ }
+ break;
+ case obj_KDBManager:
+ return kqsh_show_kmgr ( tbl, src, next_token ( tbl, src, t ), sym );
+ case obj_VDBManager:
+ return kqsh_show_vmgr ( tbl, src, next_token ( tbl, src, t ), sym );
+
+ case kw_compact:
+ mode = sdmCompact;
+ if ( next_token ( tbl, src, t ) -> id != kw_schema )
+ {
+ if ( t -> id != obj_VSchema )
+ break;
+ sym = t -> sym;
+ return kqsh_show_schema ( tbl, src, next_token ( tbl, src, t ), sym, mode );
+ }
+ /* no break */
+ case kw_schema:
+ if ( next_token ( tbl, src, t ) -> id != obj_VSchema )
+ break;
+ sym = t -> sym;
+ case obj_VSchema:
+ return kqsh_show_schema ( tbl, src, next_token ( tbl, src, t ), sym, mode );
+ }
+
+ return expected ( t, klogErr, "object" );
+}
+
diff --git a/tools/kqsh/kqsh-thunk.pl b/tools/kqsh/kqsh-thunk.pl
new file mode 100755
index 0000000..429ab55
--- /dev/null
+++ b/tools/kqsh/kqsh-thunk.pl
@@ -0,0 +1,662 @@
+#!/usr/bin/perl
+#============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+#
+#
+
+sub lower_case_sym
+{
+ my $sym;
+ my $in = @_ [ 0 ];
+
+ # split at leading lower case
+ if ( $in =~ /^([^A-Z]*)([A-Z].*)/ )
+ {
+ $sym = $1;
+ $in = $2;
+ }
+ else
+ {
+ return $in;
+ }
+
+ while ( $in )
+ {
+ # split off series of leading upper case
+ if ( $in =~ /^([A-Z][A-Z]*)([A-Z][^A-Z].*)/ )
+ {
+ $sym and $sym .= "_";
+ $sym .= lc $1;
+ $in = $2;
+ }
+
+ # lower case next word
+ if ( $in =~ /^([A-Z][^A-Z][^A-Z]*)([A-Z].*)/ )
+ {
+ $sym and $sym .= "_";
+ $sym .= lc $1;
+ $in = $2;
+ }
+ else
+ {
+ $sym and $sym .= "_";
+ $sym .= lc $in;
+ $in = '';
+ }
+ }
+
+ return $sym;
+}
+
+my @classes;
+$num_classes = 0;
+
+my @inc_paths;
+my @src_files;
+
+my $h_out;
+my $c_out;
+my $module;
+
+while ( $arg = shift )
+{
+ if ( $arg =~ /-(..*)/ )
+ {
+ $arg = $1;
+ while ( $arg =~ /(.)(.*)/ )
+ {
+ $sw = $1;
+ $arg = $2;
+
+ if ( $sw eq "I" )
+ {
+ $arg or $arg = shift;
+ $arg or die "expected include path";
+ push @inc_paths, split ( ':', $arg );
+ $arg = '';
+ }
+ elsif ( $sw eq "i" )
+ {
+ $arg or $arg = shift;
+ $arg or die "expected interface file path";
+ push @src_files, split ( ':', $arg );
+ $arg = '';
+ }
+ elsif ( $sw eq "h" )
+ {
+ $arg or $arg = shift;
+ $arg or die "expected h file path";
+ $h_out = $arg;
+ $arg = '';
+ }
+ elsif ( $sw eq "c" )
+ {
+ $arg or $arg = shift;
+ $arg or die "expected c file path";
+ $c_out = $arg;
+ $arg = '';
+ }
+ elsif ( $sw eq "m" )
+ {
+ $arg or $arg = shift;
+ $arg or die "expected module name";
+ $module = $arg;
+ $arg = '';
+ }
+ else
+ {
+ print STDERR "unrecognized switch: '$sw'\n";
+ exit 3;
+ }
+ }
+ }
+ else
+ {
+ if ( $arg =~ /:(..*)/ )
+ {
+ $classes [ $num_classes ] [ 2 ] = 1;
+ $arg = $1;
+ }
+ else
+ {
+ $classes [ $num_classes ] [ 2 ] = 0;
+ }
+
+ if ( $arg =~ /(.[^=]*)=(..*)/ )
+ {
+ $classes [ $num_classes ] [ 0 ] = $1;
+ $classes [ $num_classes ] [ 1 ] = lower_case_sym $2;
+ }
+ else
+ {
+ $classes [ $num_classes ] [ 0 ] = $arg;
+ $classes [ $num_classes ] [ 1 ] = lower_case_sym $arg;
+ }
+
+ ++ $num_classes;
+ }
+}
+
+$num_paths = scalar @inc_paths;
+$num_files = scalar @src_files;
+
+# validate parameters
+$num_classes or die "no object class specified";
+$module or die "no module name specified";
+
+# open output files
+if ( $h_out )
+{
+ open $H, ">$h_out" or die "failed to open file '$h_out' for output";
+}
+if ( $c_out )
+{
+ open $C, ">$c_out" or die "failed to open file '$c_out' for output";
+}
+else
+{
+ $C = STDOUT;
+}
+
+if ( $src_file )
+{
+ open $in, $src_file;
+}
+else
+{
+ $in = STDIN;
+}
+
+# create function accumulator
+my @funcs;
+$num_funcs = 0;
+
+# process files
+for ( $fidx = 0; $fidx == 0 || $fidx < $num_files; ++ $fidx )
+{
+ # open files or stdin
+ if ( $num_files )
+ {
+ # file to open
+ $src_file = $src_files [ $fidx ];
+
+ # locate it first
+ $st = stat $src_file;
+ for ( $i = 0; ! $st && $i < $num_paths; ++ $i )
+ {
+ $inc_path = $inc_paths [ $i ];
+ $st = stat "$inc_path/$src_file";
+ $st and $src_file = "$inc_path/$src_file";
+ }
+
+ # open input file
+ open $IN, $src_file or die "failed to open file '$src_file' for input";
+ }
+ else
+ {
+ $IN = STDIN;
+ }
+
+ while ( $line = <$IN> )
+ {
+ chomp $line;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+
+ if ( ! $line )
+ {
+ # skip empty lines
+ }
+ elsif ( $line =~/^extern.*/ )
+ {
+ # skip over open of 'extern "C"'
+ }
+ elsif ( $line =~/^[#}].*/ )
+ {
+ # skip over preprocessor lines
+ # and close of 'extern "C"'
+ }
+ elsif ( $line =~ /^typedef .*/ )
+ {
+ # skip over typedefs
+ }
+ else
+ {
+ # consume comments here
+ while ( $line =~ /^(.*)\/\*(.*)$/ )
+ {
+ $line = $1;
+ $cmt = $2;
+ until ( ! $cmt || $cmt =~ /^.*\*\/(.*)$/ )
+ {
+ $cmt = <$IN>;
+ }
+
+ $line and $1 and $line .= " ";
+ $line .= "$1";
+
+ chomp $line;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ }
+ if ( ! $line )
+ {
+ # skip of comment line was empty
+ }
+ else
+ {
+ # assemble line
+ until ( $line =~ /^(.*;)(.*)$/ )
+ {
+ $cont = <$IN>;
+ chomp $cont;
+ $cont =~ s/^\s+//;
+ $cont =~ s/\s+$//;
+ $line .= " $cont";
+ }
+
+ # look for a function prototype
+ if ( $line =~ /^[A-Z]+_EXTERN ([^\(]+)\s+CC ([A-Za-z_][A-Za-z0-9_]*)\s*\(\s*(.*)\s+\);/ ||
+ $line =~ /^[A-Z]+_EXTERN ([^\(]+\*+)CC ([A-Za-z_][A-Za-z0-9_]*)\s*\(\s*(.*)\s+\);/ ||
+ $line =~ /^([^\(]+)\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(\s*(.*)\s+\);/ ||
+ $line =~ /^([^\(]+\*+)([A-Za-z_][A-Za-z0-9_]*)\s*\(\s*(.*)\s+\);/ )
+ {
+ $rt = $1;
+ $func = $2;
+ $formals = $3;
+
+ $msg = '';
+ $cid = 0;
+ $cls = '';
+ $dual = 0;
+
+ for ( $i = 0; ! $msg && $i < $num_classes; ++ $i )
+ {
+ $cls = $classes [ $i ] [ 0 ];
+ if ( $func =~ /^$cls(..*)/ )
+ {
+ $cid = $i;
+ $msg = $1;
+ $dual = $classes [ $i ] [ 2 ];
+ }
+ }
+
+ $penult = '';
+ $vararg = '';
+ $update = 0;
+ $params = '';
+ $tformals = '';
+
+ $formals2 = '';
+ $tmplist = $formals;
+ while ( $tmplist =~ /([^\(]*\()([^\)]*)(\).*)/ )
+ {
+ $formals2 .= $1;
+ $pparms = $2;
+ $tmplist = $3;
+ $pparms =~ s/,/#/g;
+ $formals2 .= "$pparms";
+ }
+ $formals2 .= $tmplist;
+
+ @paramlist = split ( ',', $formals2 );
+ while ( $param = shift @paramlist )
+ {
+ # trim parameter
+ $param =~ s/^\s+//;
+ $param =~ s/\s+$//;
+
+ # catch vararg parameter
+ if ( $param eq '...' )
+ {
+ $vararg = $penult;
+ $params .= ", args";
+ $tformals = '';
+ }
+ else
+ {
+ # correct hidden commas
+ $param =~ s/#/,/g;
+
+ # strip off vector expr
+ if ( $param =~ /([^\[]*)\s*(\[.*\])$/ )
+ {
+ $param = $1;
+ $vect = $2;
+ }
+
+
+ # strip off param name
+ if ( $param =~ /^(.*)\s*(\([^\(]*\))$/ )
+ {
+ $param = $1;
+ $pparms = $2;
+ $param =~ /^(.*)\(\s*CC\s*\*\s*([A-Za-z0-9_]+)\s*\)/ or die "failed to determine name of parameter '$param'";
+ $param = "$1( CC * ) $pparms";
+ $penult = $2;
+ }
+ else
+ {
+ $param =~ /(.*[^A-Za-z0-9_]+)([A-Za-z0-9_]+)$/ or die "failed to determine name of parameter '$param'";
+ $param = $1;
+ $penult = $2;
+ }
+
+ $params and $params .= ", ";
+ $params .= $penult;
+
+
+ # process typedecl
+ $param =~ s/\s+$//;
+ if ( $param =~ /(.*)\s+(\*+)$/ )
+ {
+ $param = "$1$2";
+ }
+ $vect and $param .= " $vect";
+ $tformals and $tformals .= ", ";
+ $tformals .= $param;
+
+ # finally, decide if the function is for read or update
+ if ( $param =~ /^$cls/ || $param =~ /^struct\s+$cls\*+/ )
+ {
+ $update = $dual;
+ }
+ }
+ }
+
+ $funcs [ $num_funcs ] [ 0 ] = $cid;
+ $funcs [ $num_funcs ] [ 1 ] = $msg;
+ $funcs [ $num_funcs ] [ 2 ] = $rt;
+ $funcs [ $num_funcs ] [ 3 ] = $formals;
+ $funcs [ $num_funcs ] [ 4 ] = $tformals;
+ $funcs [ $num_funcs ] [ 5 ] = $vararg;
+ $funcs [ $num_funcs ] [ 6 ] = $params;
+ $funcs [ $num_funcs ] [ 7 ] = $update;
+
+ ++ $num_funcs;
+ }
+ }
+ }
+ }
+
+ if ( $num_files )
+ {
+ close $IN;
+ $IN = '';
+ }
+}
+
+# generate text into arrays
+my @msgs;
+my @cvt;
+my @wmsgs;
+my @wvt;
+my @decls;
+my @thunks;
+$mgr = 'mgr';
+
+for ( $num_thunks = 0, $num_ro = 0, $i = 0; $i < $num_funcs; ++ $i )
+{
+ # extract information
+ $cid = $funcs [ $i ] [ 0 ];
+ $msg = $funcs [ $i ] [ 1 ];
+ $rt = $funcs [ $i ] [ 2 ];
+ $formals = $funcs [ $i ] [ 3 ];
+ $tformals = $funcs [ $i ] [ 4 ];
+ $vararg = $funcs [ $i ] [ 5 ];
+ $params = $funcs [ $i ] [ 6 ];
+ $update = $funcs [ $i ] [ 7 ];
+
+ $cls = $classes [ $cid ] [ 0 ];
+ $prefix = $classes [ $cid ] [ 1 ];
+ $dual = $classes [ $cid ] [ 2 ];
+
+ # constructor flag
+ $constructor = 3;
+
+ # msg symbol
+ $sym = "$cls$msg";
+ $tname = "_$sym";
+
+ # vt
+ $vt = $module;
+ $update == 0 and $vt .= "_cvt";
+ $update == 1 and $vt .= "_wvt";
+
+ # vt member
+ $vt_mbr = $prefix;
+ $vt_mbr .= '_';
+ if ( $dual && ( $msg eq "MakeRead" || $msg eq "MakeUpdate" ) )
+ {
+ # detect special library constructor
+ if ( $tformals =~ /^$cls\*\*,/ )
+ {
+ $constructor = 2;
+ $vt = $module . "_cvt";
+ $vt_mbr .= "make";
+ $tname = "_$cls" . "Make";
+ }
+ elsif ( $tformals =~ /^const\s+$cls\*\*,/ )
+ {
+ $constructor = 0;
+ $vt_mbr .= "make";
+ }
+ elsif ( $tformals =~ /^const\s+$cls\*\*$/ )
+ {
+ $constructor = 1;
+ $vt_mbr .= "make";
+ }
+ else
+ {
+ $vararg and $vt_mbr .= "v_";
+ $vt_mbr .= lower_case_sym $msg;
+ }
+ }
+ else
+ {
+ $vararg and $vt_mbr .= "v_";
+ $vt_mbr .= lower_case_sym $msg;
+ }
+
+ # vt function
+ $vt_func = "$rt ( CC * $vt_mbr ) ( $tformals )";
+
+ # dispatch
+ $disp = "( * $vt . f . $vt_mbr ) ( $params )";
+
+ # function declaration
+ $decl = "$rt $tname ( $formals )";
+
+ # thunk
+ $thunk = "$decl\n{\n";
+ if ( $vararg )
+ {
+ $thunk .= " $rt ret;\n va_list args;\n va_start ( args, $vararg );\n";
+ $thunk .= " assert ( $vt . f . $vt_mbr != NULL );\n";
+ $thunk .= " ret = $disp;\n va_end ( args );\n return ret;\n";
+ }
+ else
+ {
+ $thunk .= " assert ( $vt . f . $vt_mbr != NULL );\n";
+ $thunk .= " return $disp;\n";
+ }
+ $thunk .= "}";
+
+ # handle library constructors specially
+ if ( $constructor == 0 )
+ {
+ $msgs [ 0 ] = $sym;
+ }
+ elsif ( $constructor == 1 )
+ {
+ my $subst_sym;
+ $subst_sym = $sym .= "WithDir";
+ $msgs [ 0 ] = $subst_sym;
+ }
+ elsif ( $constructor == 2 )
+ {
+ $msgs [ 1 ] = $sym;
+ $cvt [ 0 ] = $vt_func;
+ $decls [ 0 ] = $decl;
+ $thunks [ 0 ] = $thunk;
+ @pnames = split ( ',', $params );
+ $mgr = $pnames [ 0 ];
+ }
+ elsif ( $vararg )
+ {
+ $decls [ $num_thunks + 1 ] = $decl;
+ $thunks [ $num_thunks + 1 ] = $thunk;
+ ++ $num_thunks;
+ }
+ elsif ( $update == 1 )
+ {
+ push @wmsgs, $sym;
+ push @wvt, $vt_func;
+
+ $decls [ $num_thunks + 1 ] = $decl;
+ $thunks [ $num_thunks + 1 ] = $thunk;
+ ++ $num_thunks;
+ }
+ else
+ {
+ $msgs [ $num_ro + 2 ] = $sym;
+ $cvt [ $num_ro + 1 ] = $vt_func;
+ ++ $num_ro;
+
+ $decls [ $num_thunks + 1 ] = $decl;
+ $thunks [ $num_thunks + 1 ] = $thunk;
+ ++ $num_thunks;
+ }
+}
+
+# create warning comment
+$warn_cmt = "/* THIS IS AN AUTO-GENERATED FILE - DO NOT EDIT */\n";
+
+# write include file
+if ( $h_out )
+{
+ $def = "_h_$h_out";
+ $def =~ s/\.h$//;
+ $def .= '_';
+ $def =~ s/[\/-]/_/g;
+ print $H "$warn_cmt\n#ifndef $def\n#define $def\n\n";
+
+ while ( $src_file = shift @src_files )
+ {
+ $src_def = "_h_$src_file";
+ $src_def =~ s/\.h$//;
+ $src_def .= '_';
+ $src_def =~ s/[\/-]/_/g;
+ print $H "#ifndef $src_def\n#include <$src_file>\n#endif\n\n";
+ }
+
+ print $H "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n";
+
+ while ( $decl = shift @decls )
+ {
+ print $H "$decl;\n"
+ }
+
+ print $H "\n#ifdef __cplusplus\n}\n#endif\n\n";
+
+ print $H "#endif /* $def */\n";
+
+ close $H;
+}
+
+# write thunk file
+if ( $h_out )
+{
+ print $C "$warn_cmt\n#include \"$h_out\"\n";
+}
+else
+{
+ print $C "$warn_cmt\n#include \"kqsh-$module.h\"\n";
+}
+print $C "#include \"kqsh-priv.h\"\n";
+print $C "#include <klib/rc.h>\n";
+print $C "#include <assert.h>\n\n";
+
+# read-only messages
+print $C "static const char *$module" . "_msgs [] =\n{\n";
+while ( $msg = shift @msgs )
+{
+ print $C " \"$msg\",\n";
+}
+print $C " NULL\n};\n\n";
+
+# read-only vtable
+print $C "static union\n{\n";
+print $C " fptr_t slots [ sizeof $module" . "_msgs / sizeof $module" . "_msgs [ 0 ] - 2 ];\n\n";
+print $C " struct\n {\n";
+while ( $vt_func = shift @cvt )
+{
+ print $C " $vt_func;\n"
+}
+print $C " } f;\n\n} $module" . "_cvt;\n\n";
+
+# update messages
+print $C "static const char *$module" . "_wmsgs [] =\n{\n";
+while ( $msg = shift @wmsgs )
+{
+ print $C " \"$msg\",\n";
+}
+print $C " NULL\n};\n\n";
+
+# update vtable
+print $C "static union\n{\n";
+print $C " fptr_t slots [ sizeof $module" . "_wmsgs / sizeof $module" . "_wmsgs [ 0 ] - 1 ];\n\n";
+print $C " struct\n {\n";
+while ( $vt_func = shift @wvt )
+{
+ print $C " $vt_func;\n"
+}
+print $C " } f;\n\n} $module" . "_wvt;\n\n";
+
+# libdata
+print $C "kqsh_libdata $module" . "_data =\n{\n";
+print $C " NULL, NULL,\n";
+print $C " $module" . "_msgs, $module" . "_cvt . slots,\n";
+print $C " $module" . "_wmsgs, $module" . "_wvt . slots\n";
+print $C "};\n\n";
+
+# special library construct thunk
+$thunk = shift @thunks;
+ at lines = split ( '\n', $thunk );
+print $C $lines [ 0 ] . "\n{\n";
+print $C " if ( sizeof $module" . "_cvt . slots != sizeof $module" . "_cvt . f ||\n";
+print $C " sizeof $module" . "_wvt . slots != sizeof $module" . "_wvt . f )\n";
+print $C " {\n";
+print $C " * $mgr = NULL;\n";
+print $C " return RC ( rcExe, rcMgr, rcConstructing, rcInterface, rcCorrupt );\n";
+print $C " }\n\n";
+print $C $lines [ 2 ] . "\n";
+print $C $lines [ 3 ] . "\n";
+print $C "}\n\n";
+
+# remainder of thunks
+while ( $thunk = shift @thunks )
+{
+ print $C "$thunk\n\n";
+}
diff --git a/tools/kqsh/kqsh-tok.c b/tools/kqsh/kqsh-tok.c
new file mode 100644
index 0000000..0be5a65
--- /dev/null
+++ b/tools/kqsh/kqsh-tok.c
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-tok.h"
+#include "kqsh-priv.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <kfs/dyload.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* next_token
+ */
+KToken *next_token ( struct KSymTable const *tbl, KTokenSource *src, KToken *t )
+{
+ if ( KTokenizerNext ( kDefaultTokenizer, src, t ) -> id == eIdent )
+ {
+ KSymbol *sym = KSymTableFind ( tbl, & t -> str );
+ t -> sym = sym;
+ if ( sym != NULL )
+ t -> id = sym -> type;
+ }
+
+ return t;
+}
+
+KToken *next_shallow_token ( struct KSymTable const *tbl, KTokenSource *src, KToken *t )
+{
+ if ( KTokenizerNext ( kDefaultTokenizer, src, t ) -> id == eIdent || t -> id == eName )
+ {
+ KSymbol *sym = KSymTableFindShallow ( tbl, & t -> str );
+ t -> sym = sym;
+ if ( sym != NULL )
+ t -> id = sym -> type;
+ }
+
+ return t;
+}
+
+/* expected
+ */
+rc_t expected ( const KToken *self, KLogLevel lvl, const char *expected )
+{
+ String eof;
+ const String *str = & self -> str;
+
+ if ( self -> id == eEndOfInput )
+ {
+ CONST_STRING ( & eof, "EOF" );
+ str = & eof;
+ }
+
+ if ( interactive )
+ kqsh_printf ( "expected '%s' but found '%S'\n", expected, str );
+ else
+ {
+ PLOGMSG ( lvl, ( lvl, "$(file):$(lineno): "
+ "expected '$(expected)' but found '$(found)'",
+ "file=%.*s,lineno=%u,expected=%s,found=%.*s"
+ , ( int ) self -> txt -> path . size, self -> txt -> path . addr
+ , self -> lineno
+ , expected
+ , ( int ) str -> size, str -> addr ));
+ }
+
+ return RC ( rcExe, rcText, rcParsing, rcToken, rcUnexpected );
+}
diff --git a/tools/kqsh/kqsh-tok.h b/tools/kqsh/kqsh-tok.h
new file mode 100644
index 0000000..121899f
--- /dev/null
+++ b/tools/kqsh/kqsh-tok.h
@@ -0,0 +1,155 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_kqsh_tok_
+#define _h_kqsh_tok_
+
+#ifndef _h_klib_token_
+#include <klib/token.h>
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KSymTable;
+
+
+/*--------------------------------------------------------------------------
+ * kqsh tokens
+ */
+enum kqsh_tokens
+{
+ /* alphabetical list of commands */
+ kw_add = eNumSymtabIDs,
+ kw_alias,
+ kw_alter,
+ kw_as,
+ kw_at,
+ kw_close,
+ kw_column,
+ kw_columns,
+ kw_commands,
+ kw_compact,
+ kw_constants,
+ kw_create,
+ kw_cursor,
+ kw_database,
+ kw_databases,
+ kw_delete,
+ kw_drop,
+ kw_execute,
+ kw_exit,
+ kw_for,
+ kw_formats,
+ kw_functions,
+ kw_help,
+ kw_include,
+ kw_initialize,
+ kw_insert,
+ kw_kdb,
+ kw_library,
+ kw_load,
+ kw_manager,
+ kw_metadata,
+ kw_objects,
+ kw_on,
+ kw_open,
+ kw_or,
+ kw_path,
+ kw_quit,
+ kw_rename,
+ kw_replace,
+ kw_row,
+ kw_schema,
+ kw_show,
+ kw_sra,
+ kw_table,
+ kw_tables,
+ kw_text,
+ kw_types,
+ kw_typesets,
+ kw_update,
+ kw_use,
+ kw_using,
+ kw_version,
+ kw_vdb,
+ kw_with,
+ kw_write,
+
+ rsrv_first,
+ /* reserved names */
+ rsrv_kmgr = rsrv_first,
+ rsrv_vmgr,
+ rsrv_sramgr,
+ rsrv_srapath,
+
+ obj_first,
+ /* object types */
+ obj_KDBManager = obj_first,
+ obj_VDBManager,
+ obj_SRAManager,
+ obj_VSchema,
+ obj_KTable,
+ obj_VTable,
+ obj_VCursor,
+
+ /* accepted abbreviations */
+ kw_col = kw_column,
+ kw_cols = kw_columns,
+ kw_db = kw_database,
+ kw_dbs = kw_databases,
+ kw_exec = kw_execute,
+ kw_init = kw_initialize,
+ kw_lib = kw_library,
+ kw_mgr = kw_manager,
+ kw_tbl = kw_table
+};
+
+/* next_token
+ */
+KToken *next_token ( struct KSymTable const *tbl, KTokenSource *src, KToken *t );
+KToken *next_shallow_token ( struct KSymTable const *tbl, KTokenSource *src, KToken *t );
+
+/* expected
+ */
+rc_t expected ( const KToken *self, KLogLevel lvl, const char *expected );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_kqsh_tok_ */
diff --git a/tools/kqsh/kqsh-write.c b/tools/kqsh/kqsh-write.c
new file mode 100644
index 0000000..2e63262
--- /dev/null
+++ b/tools/kqsh/kqsh-write.c
@@ -0,0 +1,321 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+#include "kqsh-kdb.h"
+#include "kqsh-vdb.h"
+
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <kfs/directory.h>
+#include <klib/log.h>
+#include <klib/vector.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* write_cursor_xxx
+ */
+static
+rc_t kqsh_write_cursor_array ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc,
+ rc_t ( * write ) ( KSymTable*, KTokenSource*, KToken*, const KSymbol*, uint32_t, const VTypedesc* ) )
+{
+ rc_t rc;
+
+ /* allow empty array */
+ if ( next_token ( tbl, src, t ) -> id == eRightSquare )
+ return 0;
+
+ /* write elements */
+ while ( 1 )
+ {
+ /* write the element */
+ rc = ( * write ) ( tbl, src, t, curs, idx, desc );
+ if ( rc != 0 )
+ break;
+
+ /* punctuation */
+ if ( next_token ( tbl, src, t ) -> id != eComma )
+ break;
+
+ /* next element */
+ next_token ( tbl, src, t );
+ }
+
+ /* expect ']' */
+ if ( rc == 0 && t -> id != eRightSquare )
+ rc = expected ( t, klogErr, "]" );
+
+ return rc;
+}
+
+static
+rc_t kqsh_write_cursor_bool ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ if ( t -> id == eLeftSquare )
+ return kqsh_write_cursor_array ( tbl, src, t, curs, idx, desc, kqsh_write_cursor_bool );
+
+ assert ( desc -> intrinsic_bits == 8 );
+ return -1;
+}
+
+static
+rc_t kqsh_write_cursor_uint ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ if ( t -> id == eLeftSquare )
+ return kqsh_write_cursor_array ( tbl, src, t, curs, idx, desc, kqsh_write_cursor_uint );
+ return -1;
+}
+
+static
+rc_t kqsh_write_cursor_int ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ if ( t -> id == eLeftSquare )
+ return kqsh_write_cursor_array ( tbl, src, t, curs, idx, desc, kqsh_write_cursor_int );
+ return -1;
+}
+
+static
+rc_t kqsh_write_cursor_float ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ if ( t -> id == eLeftSquare )
+ return kqsh_write_cursor_array ( tbl, src, t, curs, idx, desc, kqsh_write_cursor_float );
+ return -1;
+}
+
+static
+rc_t kqsh_write_cursor_ascii ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ rc_t rc;
+
+ switch ( t -> id )
+ {
+ case eUntermString:
+ case eUntermEscapedString:
+ return expected ( t, klogErr, "terminated string" );
+ case eString:
+ rc = _VCursorWrite ( ( void* ) curs -> u . obj, idx, 8, t -> str . addr + 1, 0, t -> str . len - 2 );
+ if ( rc == 0 )
+ return 0;
+ break;
+ case eEscapedString:
+ rc = 0;
+ break;
+ default:
+ return expected ( t, klogErr, "string" );
+ }
+
+ if ( rc == 0 )
+ {
+ char buffer [ 256 ], *p = buffer;
+ size_t size = sizeof buffer;
+ if ( t -> str . size >= sizeof buffer )
+ {
+ p = malloc ( size = t -> str . size + 1 );
+ if ( p == NULL )
+ rc = RC ( rcExe, rcCursor, rcWriting, rcMemory, rcExhausted );
+ }
+
+ if ( rc == 0 )
+ {
+ rc = KTokenToString ( t, p, size, & size );
+ if ( rc == 0 )
+ rc = _VCursorWrite ( ( void* ) curs -> u . obj, idx, 8, p, 0, size );
+ if ( p != buffer )
+ free ( p );
+ }
+ }
+
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to write string '$(str)' to cursor '$(curs)' ( $(addr) )"
+ , "str=%.*s,curs=%.*s,addr=0x%zX"
+ , ( int ) t -> str . size, t -> str . addr
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ }
+
+ return rc;
+}
+
+static
+rc_t kqsh_write_cursor_unicode ( KSymTable *tbl, KTokenSource *src, KToken *t,
+ const KSymbol *curs, uint32_t idx, const VTypedesc *desc )
+{
+ if ( desc -> intrinsic_bits == 8 )
+ return kqsh_write_cursor_ascii ( tbl, src, t, curs, idx, desc );
+
+ return -1;
+}
+
+/* write_cursor
+ */
+static
+rc_t kqsh_write_cursor ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+ VTypedecl td;
+ VTypedesc desc;
+
+ /* have cursor object */
+ KSymbol *curs = t -> sym;
+
+ /* error if read-only */
+ if ( read_only )
+ {
+ rc = RC ( rcExe, rcCursor, rcWriting, rcCursor, rcReadonly );
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to write to cursor '$(curs)' ( $(addr) )"
+ , "curs=%.*s,addr=0x%zX"
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ return rc;
+ }
+
+ /* separator */
+ if ( next_token ( tbl, src, t ) -> id != ePeriod )
+ return expected ( t, klogErr, ". <colname> or IDX" );
+
+ /* get column spec */
+ switch ( next_token ( tbl, src, t ) -> id )
+ {
+ /* take integer index */
+ case eDecimal:
+ case eHex:
+ case eOctal:
+ rc = KTokenToU32 ( t, & idx );
+ if ( rc != 0 )
+ return expected ( t, klogErr, "integer column index" );
+ break;
+
+ /* take column name */
+ default:
+ if ( t -> sym == NULL )
+ return expected ( t, klogErr, "column name" );
+ case eIdent:
+ switch ( curs -> type )
+ {
+ case obj_VCursor:
+ rc = _VCursorGetColumnIdx ( curs -> u . obj, & idx, "%.*s",
+ ( int ) t -> str . size, t -> str . addr );
+ break;
+ }
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to write to column '$(col)' on cursor '$(curs)' ( $(addr) )"
+ , "col=%.*s,curs=%.*s,addr=0x%zX"
+ , ( int ) t -> str . size, t -> str . addr
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ return rc;
+ }
+ break;
+ }
+
+ /* access column object */
+ switch ( curs -> type )
+ {
+ case obj_VCursor:
+ rc = _VCursorDatatype ( curs -> u . obj, idx, & td, & desc );
+ break;
+ }
+
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc,
+ "failed to access datatype of column $(idx) on cursor '$(curs)' ( $(addr) )"
+ , "idx=%u,curs=%.*s,addr=0x%zX"
+ , idx
+ , ( int ) curs -> name . size, curs -> name . addr
+ , ( size_t ) curs -> u . obj ));
+ return rc;
+ }
+
+ /* move on to first token of row */
+ next_token ( tbl, src, t );
+
+ /* switch on datatype */
+ switch ( desc . domain )
+ {
+ case vtdBool:
+ rc = kqsh_write_cursor_bool ( tbl, src, t, curs, idx, & desc );
+ break;
+ case vtdUint:
+ rc = kqsh_write_cursor_uint ( tbl, src, t, curs, idx, & desc );
+ break;
+ case vtdInt:
+ rc = kqsh_write_cursor_int ( tbl, src, t, curs, idx, & desc );
+ break;
+ case vtdFloat:
+ rc = kqsh_write_cursor_float ( tbl, src, t, curs, idx, & desc );
+ break;
+ case vtdAscii:
+ rc = kqsh_write_cursor_ascii ( tbl, src, t, curs, idx, & desc );
+ break;
+ case vtdUnicode:
+ rc = kqsh_write_cursor_unicode ( tbl, src, t, curs, idx, & desc );
+ break;
+ }
+
+ /* expect semicolon */
+ if ( rc == 0 )
+ {
+ if ( next_token ( tbl, src, t ) -> id != eSemiColon )
+ return expected ( t, klogErr, ";" );
+ }
+
+ return rc;
+}
+
+
+/* write
+ */
+rc_t kqsh_write ( KSymTable *tbl, KTokenSource *src, KToken *t )
+{
+ switch ( t -> id )
+ {
+ case obj_VCursor:
+ return kqsh_write_cursor ( tbl, src, t );
+ }
+
+ return expected ( t, klogErr, "cursor" );
+}
diff --git a/tools/kqsh/kqsh.c b/tools/kqsh/kqsh.c
new file mode 100644
index 0000000..dec7860
--- /dev/null
+++ b/tools/kqsh/kqsh.c
@@ -0,0 +1,516 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "kqsh-priv.h"
+#include "kqsh-tok.h"
+
+#include <klib/container.h>
+#include <klib/symbol.h>
+#include <klib/symtab.h>
+#include <klib/token.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+bool read_only;
+bool interactive;
+
+
+/* exec_file
+ * execute a named file
+ */
+rc_t kqsh_exec_file ( KSymTable *tbl, const String *path )
+{
+ KDirectory *wd;
+ rc_t rc = KDirectoryNativeDir ( & wd );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to open working directory" );
+ else
+ {
+ const KFile *f;
+ rc = KDirectoryOpenFileRead ( wd, & f, "%.*s"
+ , ( int ) path -> size, path -> addr );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open file '$(path)'", "path=%.*s"
+ , ( int ) path -> size, path -> addr ));
+ }
+ else
+ {
+ const KMMap *mm;
+ rc = KMMapMakeRead ( & mm, f );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to map file '$(path)'", "path=%.*s"
+ , ( int ) path -> size, path -> addr ));
+ }
+ else
+ {
+ const void *addr;
+ rc = KMMapAddrRead ( mm, & addr );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to obtain mmap addr" );
+ else
+ {
+ size_t size;
+ rc = KMMapSize ( mm, & size );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to obtain mmap size" );
+ else
+ {
+ String text;
+ KTokenText tt;
+ KTokenSource src;
+
+ StringInit ( & text, addr, ( size_t ) size,
+ string_len ( addr, ( size_t ) size ) );
+ KTokenTextInit ( & tt, & text, path );
+ KTokenSourceInit ( & src, & tt );
+
+ rc = kqsh ( tbl, & src );
+ }
+ }
+
+ KMMapRelease ( mm );
+ }
+
+ KFileRelease ( f );
+ }
+
+ KDirectoryRelease ( wd );
+ }
+
+ return rc;
+}
+
+/* init_symtable
+ * initialize tool table
+ */
+static
+rc_t kqsh_init_keywords ( KSymTable *tbl )
+{
+ int i;
+ static struct
+ {
+ const char *keyword;
+ int id;
+ } kw [] =
+ {
+#define KEYWORD( word ) \
+ { # word, kw_ ## word }
+#define RESERVED( word ) \
+ { # word, rsrv_ ## word }
+
+ /* keywords */
+ KEYWORD ( add ),
+ KEYWORD ( alias ),
+ KEYWORD ( alter ),
+ KEYWORD ( as ),
+ KEYWORD ( at ),
+ KEYWORD ( close ),
+ KEYWORD ( column ),
+ KEYWORD ( columns ),
+ KEYWORD ( commands ),
+ KEYWORD ( compact ),
+ KEYWORD ( constants ),
+ KEYWORD ( create ),
+ KEYWORD ( cursor ),
+ KEYWORD ( database ),
+ KEYWORD ( databases ),
+ KEYWORD ( delete ),
+ KEYWORD ( drop ),
+ KEYWORD ( execute ),
+ KEYWORD ( exit ),
+ KEYWORD ( for ),
+ KEYWORD ( formats ),
+ KEYWORD ( functions ),
+ KEYWORD ( help ),
+ KEYWORD ( include ),
+ KEYWORD ( initialize ),
+ KEYWORD ( insert ),
+ KEYWORD ( kdb ),
+ KEYWORD ( library ),
+ KEYWORD ( load ),
+ KEYWORD ( manager ),
+ KEYWORD ( metadata ),
+ KEYWORD ( objects ),
+ KEYWORD ( on ),
+ KEYWORD ( open ),
+ KEYWORD ( or ),
+ KEYWORD ( path ),
+ KEYWORD ( quit ),
+ KEYWORD ( rename ),
+ KEYWORD ( replace ),
+ KEYWORD ( row ),
+ KEYWORD ( schema ),
+ KEYWORD ( show ),
+ KEYWORD ( sra ),
+ KEYWORD ( table ),
+ KEYWORD ( tables ),
+ KEYWORD ( text ),
+ KEYWORD ( types ),
+ KEYWORD ( typesets ),
+ KEYWORD ( update ),
+ KEYWORD ( use ),
+ KEYWORD ( using ),
+ KEYWORD ( version ),
+ KEYWORD ( vdb ),
+ KEYWORD ( with ),
+ KEYWORD ( write ),
+
+ /* reserved names */
+ RESERVED ( kmgr ),
+ RESERVED ( vmgr ),
+ RESERVED ( sramgr ),
+ RESERVED ( srapath ),
+
+ /* abbreviations */
+ KEYWORD ( col ),
+ KEYWORD ( cols ),
+ KEYWORD ( db ),
+ KEYWORD ( dbs ),
+ KEYWORD ( exec ),
+ KEYWORD ( init ),
+ KEYWORD ( lib ),
+ KEYWORD ( mgr ),
+ KEYWORD ( tbl )
+
+#undef KEYWORD
+#undef RESERVED
+ };
+
+
+ /* define keywords */
+ for ( i = 0; i < sizeof kw / sizeof kw [ 0 ]; ++ i )
+ {
+ rc_t rc;
+
+ String name;
+ StringInitCString ( & name, kw [ i ] . keyword );
+ rc = KSymTableCreateSymbol ( tbl, NULL, & name, kw [ i ] . id, NULL );
+ if ( rc != 0 )
+ return rc;
+ }
+
+ return 0;
+}
+
+static
+rc_t kqsh_init_symtable ( KSymTable *tbl, BSTree *intrinsic )
+{
+ rc_t rc = KSymTablePushScope ( tbl, intrinsic );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to initialize symbol table" );
+ else
+ {
+ rc = kqsh_init_keywords ( tbl );
+
+ KSymTablePopScope ( tbl );
+ }
+
+ return rc;
+}
+
+
+/* whackobj
+ * whacks created/opened objects
+ */
+static
+rc_t CC kqsh_read_stdin ( void *data, KTokenText *tt, size_t save )
+{
+ rc_t rc;
+ size_t num_read;
+ const KFile *self = ( const void* ) data;
+
+ /* manage stdin for the process */
+ static uint64_t pos;
+ static char buff [ 4096 ];
+
+ /* save any characters not yet consumed */
+ if ( save != 0 )
+ {
+ assert ( save < sizeof buff );
+ memmove ( buff, & tt -> str . addr [ tt -> str . size - save ], save );
+ }
+
+ /* read as many characters as are available */
+ rc = KFileRead ( self, pos, & buff [ save ], sizeof buff - save, & num_read );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "failed to read stdin" );
+ else
+ {
+ /* reset the buffer in "tt" */
+ tt -> str . addr = buff;
+ tt -> str . size = save + num_read;
+ tt -> str . len = string_len ( buff, save + num_read );
+ pos += num_read;
+ }
+
+ return rc;
+}
+
+/* init_console
+ */
+static
+rc_t kqsh_init_console ( KTokenText *console )
+{
+ const KFile *std_in;
+ rc_t rc = KFileMakeStdIn ( & std_in );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "failed to init stdin" );
+ else
+ {
+ KTokenTextInitCString ( console, "", "stdin" );
+ console -> read = kqsh_read_stdin;
+ console -> data = ( void* ) std_in;
+
+ if ( KFileType ( std_in ) == kfdCharDev )
+ interactive = true;
+ }
+ return rc;
+}
+
+#define OPTION_UPDATE "update"
+#define OPTION_LIBPATH "lib-path"
+#define ALIAS_UPDATE "u"
+#define ALIAS_LIBPATH "l"
+
+static const char * update_usage[] = { "use update managers", NULL };
+static const char * libpath_usage[] = { "add to load library path", NULL };
+
+OptDef MyOptions [] =
+{
+ { OPTION_UPDATE, ALIAS_UPDATE, NULL, update_usage, 0, false, false },
+ { OPTION_LIBPATH, ALIAS_LIBPATH, NULL, libpath_usage, 0, true, false }
+};
+
+const char UsageDefaultName[] = "kqsh";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [ options ] [ file ... ]\n"
+ "\n", progname);
+}
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine (ALIAS_UPDATE, OPTION_UPDATE, NULL, update_usage);
+
+ HelpOptionLine (ALIAS_LIBPATH, OPTION_LIBPATH, "path", libpath_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+static
+rc_t kqsh_main ( int argc, char *argv [] )
+{
+ rc_t rc;
+ Args *args;
+
+ rc = ArgsMakeAndHandle ( & args, argc, argv, 1, MyOptions,
+ sizeof MyOptions / sizeof MyOptions [ 0 ] );
+ if ( rc == 0 ) do
+ {
+ uint32_t ix;
+ uint32_t pcount;
+ const char * pc;
+
+ /* did anyone ask to open update managers? */
+ rc = ArgsOptionCount ( args, OPTION_UPDATE, & pcount );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to retrieve '$(option)' option count", "option=" OPTION_UPDATE ) );
+ break;
+ }
+
+ /* record zero count as read-only */
+ read_only = ( pcount == 0 );
+
+ /* did anyone ask to add a custom library search path? */
+ rc = ArgsOptionCount ( args, OPTION_LIBPATH, & pcount );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to retrieve '$(option)' option count", "option=" OPTION_LIBPATH ) );
+ break;
+ }
+
+ /* add each path in order */
+ for ( ix = 0; ix < pcount; ++ ix )
+ {
+ rc = ArgsOptionValue ( args, OPTION_LIBPATH, ix, (const void **)& pc );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to retrieve '$(option)' option value [ $(idx) ]", "option=" OPTION_LIBPATH ",idx=%u", ix ) );
+ break;
+ }
+
+ rc = kqsh_update_libpath ( pc );
+ if ( rc != 0 )
+ break;
+ }
+
+ /* add system library path */
+ if ( rc == 0 )
+ rc = kqsh_system_libpath ();
+ if ( rc == 0 )
+ {
+ KSymTable tbl;
+
+ BSTree intrinsic;
+ BSTreeInit ( & intrinsic );
+
+ rc = KSymTableInit ( & tbl, & intrinsic );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to initialize symbol table" );
+ else
+ {
+ rc = kqsh_init_symtable ( & tbl, & intrinsic );
+ while ( rc == 0 )
+ {
+ rc = ArgsParamCount ( args, & pcount );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "failed to retrieve parameter count" );
+ break;
+ }
+
+ if ( pcount == 0 )
+ {
+ KTokenText console;
+
+ rc = kqsh_init_console ( & console );
+ if ( rc == 0 )
+ {
+ KTokenSource src;
+
+ KTokenSourceInit ( & src, & console );
+
+ if ( interactive )
+ {
+ uint32_t vers = KAppVersion ();
+
+ kqsh_printf ( "\nkqsh version %u.%u"
+ , ( vers >> 24 )
+ , ( vers >> 16 ) & 0xFF );
+ if ( ( vers & 0xFFFF ) != 0 )
+ kqsh_printf ( ".%u", vers & 0xFFFF );
+ }
+
+ rc = kqsh ( & tbl, & src );
+ KFileRelease ( console . data );
+ }
+ }
+
+ else for ( ix = 1; ix <= pcount; ++ ix )
+ {
+ const char *file = argv [ ix ];
+
+ String path;
+ StringInitCString ( & path, file );
+
+ rc = kqsh_exec_file ( & tbl, & path );
+ if ( rc != 0 )
+ break;
+ }
+
+ KSymTableWhack ( & tbl );
+ break; /* never really loop */
+ }
+
+ BSTreeWhack ( & intrinsic, KSymbolWhack, NULL );
+ }
+ }
+
+ } while ( 0 );
+
+ return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc;
+
+ KLogHandlerSetStdErr ();
+ KLogLibHandlerSetStdErr ();
+
+ rc = kqsh_init_libpath ();
+ if ( rc == 0 )
+ {
+ read_only = true;
+ rc = kqsh_main ( argc, argv );
+ kqsh_whack_libpath ();
+ }
+ return rc;
+}
diff --git a/tools/nenctool/Makefile b/tools/nenctool/Makefile
new file mode 100644
index 0000000..44f6c73
--- /dev/null
+++ b/tools/nenctool/Makefile
@@ -0,0 +1,119 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+USE_GCC_IF_ICC = 1
+
+TOP ?= $(abspath ../..)
+MODULE = tools/nenctool
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ nenctool
+
+ifeq ($(OS),linux)
+EXT_TOOLS += \
+ nenctest
+endif
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# nenctool
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+NENCTOOL_SRC = \
+ nenctool
+
+NENCTOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(NENCTOOL_SRC))
+
+NENCTOOL_LIB = \
+ -lkapp \
+ -stk-version \
+ -lvfs \
+ -lkns \
+ -lkrypto \
+ -lkfg \
+ -lkfs \
+ -lkq \
+ -lkproc \
+ -lklib
+
+$(BINDIR)/nenctool: $(NENCTOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(NENCTOOL_LIB)
+
+
+#-------------------------------------------------------------------------------
+# nenctest
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+NENCTEST_SRC = \
+ nenctest
+
+NENCTEST_OBJ = \
+ $(addsuffix .$(OBJX),$(NENCTEST_SRC))
+
+NENCTEST_LIB = \
+ -lkapp \
+ -stk-version \
+ -lvfs \
+ -lkns \
+ -lkrypto \
+ -lkfg \
+ -lkfs \
+ -lkq \
+ -lkproc \
+ -lklib
+
+$(BINDIR)/nenctest: $(NENCTEST_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(NENCTEST_LIB)
+
diff --git a/tools/nenctool/nenctest.c b/tools/nenctool/nenctest.c
new file mode 100644
index 0000000..dd2dca3
--- /dev/null
+++ b/tools/nenctool/nenctest.c
@@ -0,0 +1,489 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <krypto/testciphermgr.h>
+#include <krypto/encfile.h>
+#include <kfs/file.h>
+
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h>
+
+#include <assert.h>
+
+#define OPTION_FORCE "force"
+#define ALIAS_FORCE "f"
+static
+const char * force_usage[] =
+{ "force overwrite of existing files", NULL };
+
+
+#define OPTION_CIPHER "cipher"
+#define ALIAS_CIPHER "c"
+static
+const char * cipher_usage[] =
+{ "choose cipher version ",
+ "0-byte oritented vector",
+ "1-vector",
+ "2-vector register",
+ "3-aes-ni",
+ "not all implementatons exist on all platforms",
+ NULL };
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false },
+ { OPTION_CIPHER, ALIAS_CIPHER, NULL, cipher_usage, 1, true, false }
+};
+
+
+
+/* Usage
+ */
+const char UsageDefaultName [] = "nencvalid";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] <source-file-path> <destination-file-path>\n"
+ "\n"
+ "Summary:\n"
+ " Copy a file from the first parameter to the second parameter\n"
+ " Encryption, decryption, or re-encryption are the expected purpose.\n"
+ " This is a version of nenctool with some testing features added.\n"
+ " The first added feature is some level of cipher implementation\n"
+ " selection.\n"
+ "\n", progname);
+}
+
+static
+const char * first_usage[] =
+{
+ "The path to a file either in native format",
+ NULL
+};
+
+static
+const char * second_usage[] =
+{
+ "in 'file' URI scheme or in 'ncbi-file'",
+ "URI scheme.",
+ "\"ncbi-file\" scheme adds a query to the \"file\" scheme",
+ "where 'enc' or 'encrypt' means the file is encrypted",
+ "and 'pwfile=<path>' points to a file to get the password",
+ "or 'pwfd=<fd>' refers to a file descriptor from which to",
+ "read a password.",
+ NULL
+};
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Parameters:\n");
+
+ HelpParamLine ("source-file-path", first_usage);
+ HelpParamLine ("destination-file-path", second_usage);
+
+ KOutMsg ("\nOptions:\n");
+
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+ HelpOptionLine (ALIAS_CIPHER, OPTION_CIPHER, "implementation", cipher_usage);
+
+ HelpOptionsStandard ();
+
+ OUTMSG (("\n"
+ "ncbi-file uri syntax:\n"
+ " 'ncbi-file' uris are based on a combination of the standard\n"
+ " 'file' and 'http' syntax familiar to browser users.\n"
+ " Enclosing questions marks are probably necessary.\n"
+ "\n"
+ " URI syntax is 'scheme:'hierarchical-part'?'query'#'fragment'\n"
+ " scheme:\n"
+ " ncbi-file\n"
+ " hierarchical-part:\n"
+ " this is the same as for scheme file and can be the native form or\n"));
+ OUTMSG ((" the ncbi 'posix' format that matches most flavors of Unix.\n"
+ " Environment variables and short hands such as '~' are not interpreted.\n"
+ " query:\n"
+ " Zero or two symbols separated by the '&'. The whole query can be omitted.\n"
+ " enc or encrypt\n"
+ " pwfile='path to a file containing a password'\n"
+ " pwfd='file descriptor where the password can be read'\n"
+ " If the encrypt is present exactly one of the other two must be present.\n"
+ " fragment:\n"
+ " No fragment is permitted.\n"));
+ OUTMSG (("\n"
+ "password contents:\n"
+ " The file or file descriptor containing the password is read enough to satisfy\n"
+ " the following restriction. The password is terminated by the end of file,\n"
+ " a carriage return or a line feed. The length must be no more than 4096 bytes.\n"
+ " The password file should have limited read access to protect it.\n"));
+
+
+ OUTMSG (("\n"
+ "Use examples:"
+ "\n"
+ " To encrypt a create a file named 'example' with a password from a file\n"
+ " named 'password-file' to a file named 'example.nenc' all in the current\n"
+ " directory:\n"
+ "\n"
+ " $ %s example \"ncbi-file:example.nenc?encrypt&pwfile=password-file\"\n",
+ progname));
+ OUTMSG (("\n"
+ " To decrypt a file named 'example.nenc' with a password from a file\n"
+ " named 'password-file' to a file named 'example' in directories implied\n"
+ " in the command:\n"
+ "\n"
+ " $ %s \"ncbi-file:/home/user/downloads/example.nenc?encrypt&pwfile=/home/user/password-file\" example\n",
+ progname));
+ OUTMSG (("\n"
+ " To change the encryption of a file from one password to another:\n"
+ "\n"
+ " $ %s \"ncbi-file:/home/user/downloads/example.nenc?encrypt&pwfile=old-password-file\" \\\n"
+ " \"ncbi-file:example.nenc?encrypt&pwfile=/home/user/new-password-file\"\n",
+ progname));
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+static
+rc_t copy_file (const char * src, const char * dst, const KFile * fin, KFile *fout)
+{
+ rc_t rc;
+ uint8_t buff [64 * 1024];
+ size_t num_read;
+ uint64_t inpos;
+ uint64_t outpos;
+
+ assert (src);
+ assert (dst);
+ assert (fin);
+ assert (fout);
+
+ inpos = 0;
+ outpos = 0;
+
+#if 1
+ for (inpos = 0; ; inpos += num_read)
+ {
+ rc = Quitting ();
+ if (rc)
+ {
+ LOGMSG (klogFatal, "Received quit");
+ break;
+ }
+ else
+ {
+ rc = KFileReadAll (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to read from file $(F) at $(P)",
+ "F=%s,P=%lu", src, inpos));
+ break;
+ }
+ else if (num_read)
+ {
+ size_t num_writ;
+
+ rc = KFileWriteAll (fout, inpos, buff, num_read, &num_writ);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ else if (num_writ != num_read)
+ {
+ rc = RC (rcExe, rcFile, rcWriting, rcFile, rcInsufficient);
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write all to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ }
+ else
+ break;
+ }
+ }
+#else
+ do
+ {
+ rc = Quitting ();
+ if (rc)
+ {
+ LOGMSG (klogFatal, "Received quit");
+ break;
+ }
+ rc = KFileRead (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to read from file $(F) at $(P)",
+ "F=%s,P=%lu", src, inpos));
+ break;
+ }
+ else if (num_read > 0)
+ {
+ size_t to_write;
+
+ inpos += (uint64_t)num_read;
+
+ STSMSG (2, ("Read %zu bytes to %lu", num_read, inpos));
+
+ to_write = num_read;
+ while (to_write > 0)
+ {
+ size_t num_writ;
+ rc = KFileWrite (fout, outpos, buff, num_read, &num_writ);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ outpos += num_writ;
+ to_write -= num_writ;
+ }
+ }
+ if (rc)
+ break;
+ } while (num_read != 0);
+#endif
+ return rc;
+}
+
+
+static
+rc_t nenctest (const char * srcstr, const char * dststr, bool force)
+{
+ VFSManager * mgr;
+ rc_t rc;
+
+ rc = VFSManagerMake (&mgr);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to create file system manager");
+ else
+ {
+ VPath * srcpath;
+
+ rc = VFSManagerMakePath (mgr, &srcpath, "%s", srcstr);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to parse source path '$(path)'",
+ "path=%s", srcstr));
+ else
+ {
+ VPath * dstpath;
+
+ rc = VFSManagerMakePath (mgr, &dstpath, "%s", dststr);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to parse destination path '$(path)'",
+ "path=%s", dststr));
+ else
+ {
+ const KFile * srcfile;
+
+ rc = VFSManagerOpenFileRead (mgr, &srcfile, srcpath);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to open source path '$(path)'",
+ "path=%s", srcstr));
+ else
+ {
+ KFile * dstfile;
+
+ rc = VFSManagerCreateFile (mgr, &dstfile, false, 0666,
+ kcmParents | (force ? kcmInit : kcmCreate),
+ dstpath);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to open destination path '$(path)'",
+ "path=%s", dststr));
+ else
+ {
+ rc = copy_file (srcstr, dststr, srcfile, dstfile);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to copy '$(S)' to '$(D)'",
+ "S=%s,D=%s", srcstr, dststr));
+
+ VFSManagerRemove (mgr, true, dstpath);
+ }
+
+ KFileRelease (dstfile);
+ }
+ KFileRelease (srcfile);
+ }
+ VPathRelease (dstpath);
+ }
+ VPathRelease (srcpath);
+ }
+ VFSManagerRelease (mgr);
+ }
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args* args = NULL;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+ if (rc == 0)
+ {
+ uint32_t pcount;
+ bool force;
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine force option");
+ else
+ {
+ force = (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_CIPHER, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine cipher option");
+ else
+ {
+ if (pcount)
+ {
+ const char * value;
+
+ rc = ArgsOptionValue (args, OPTION_CIPHER, 0, (const void **)&value);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine cipher value");
+ else
+ {
+ if (value[1])
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ else
+ switch (value[0])
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ KCipherSubType = value[0] - '0';
+ break;
+ default:
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ break;
+ }
+ if (rc)
+ LOGERR (klogErr, rc, "bad value for cipher implmentation");
+ }
+ }
+ if (rc == 0)
+ {
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to count parameters");
+ else
+ {
+ if (pcount != 2)
+ MiniUsage (args);
+ else
+ {
+ const char * src;
+
+ rc = ArgsParamValue (args, 0, (const void **)&src);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to get source parameter");
+ else
+ {
+ const char * dst;
+ rc = ArgsParamValue (args, 1, (const void **)&dst);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to get destination parameter");
+ else
+ {
+ rc = nenctest (src, dst, force);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ArgsWhack (args);
+ }
+ STSMSG (1, ("exiting: %R (%u)", rc, rc));
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/nenctool/nenctool.c b/tools/nenctool/nenctool.c
new file mode 100644
index 0000000..985a9ac
--- /dev/null
+++ b/tools/nenctool/nenctool.c
@@ -0,0 +1,435 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <krypto/encfile.h>
+#include <kfs/file.h>
+
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h>
+
+#include <assert.h>
+
+#define OPTION_FORCE "force"
+#define ALIAS_FORCE "f"
+static
+const char * force_usage[] =
+{ "force overwrite of existing files", NULL };
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false }
+};
+
+
+
+/* Usage
+ */
+const char UsageDefaultName [] = "nencvalid";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] <source-file-path> <destination-file-path>\n"
+ "\n"
+ "Summary:\n"
+ " Copy a file from the first parameter to the second parameter\n"
+ " Encryption, decryption, or re-encryption are the expected purpose.\n"
+ "\n", progname);
+}
+
+static
+const char * first_usage[] =
+{
+ "The path to a file either in native format",
+ NULL
+};
+
+static
+const char * second_usage[] =
+{
+ "in 'file' URI scheme or in 'ncbi-file'",
+ "URI scheme.",
+ "\"ncbi-file\" scheme adds a query to the \"file\" scheme",
+ "where 'enc' or 'encrypt' means the file is encrypted",
+ "and 'pwfile=<path>' points to a file to get the password",
+ "or 'pwfd=<fd>' refers to a file descriptor from which to",
+ "read a password.",
+ NULL
+};
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Parameters:\n");
+
+ HelpParamLine ("source-file-path", first_usage);
+ HelpParamLine ("destination-file-path", second_usage);
+
+ KOutMsg ("\nOptions:\n");
+
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+
+ HelpOptionsStandard ();
+
+ OUTMSG (("\n"
+ "ncbi-file uri syntax:\n"
+ " 'ncbi-file' uris are based on a combination of the standard\n"
+ " 'file' and 'http' syntax familiar to browser users.\n"
+ " Enclosing questions marks are probably necessary.\n"
+ "\n"
+ " URI syntax is 'scheme:'hierarchical-part'?'query'#'fragment'\n"
+ " scheme:\n"
+ " ncbi-file\n"
+ " hierarchical-part:\n"
+ " this is the same as for scheme file and can be the native form or\n"));
+ OUTMSG ((" the ncbi 'posix' format that matches most flavors of Unix.\n"
+ " Environment variables and short hands such as '~' are not interpreted.\n"
+ " query:\n"
+ " Zero or two symbols separated by the '&'. The whole query can be omitted.\n"
+ " enc or encrypt\n"
+ " pwfile='path to a file containing a password'\n"
+ " pwfd='file descriptor where the password can be read'\n"
+ " If the encrypt is present exactly one of the other two must be present.\n"
+ " fragment:\n"
+ " No fragment is permitted.\n"));
+ OUTMSG (("\n"
+ "password contents:\n"
+ " The file or file descriptor containing the password is read enough to satisfy\n"
+ " the following restriction. The password is terminated by the end of file,\n"
+ " a carriage return or a line feed. The length must be no more than 4096 bytes.\n"
+ " The password file should have limited read access to protect it.\n"));
+
+
+ OUTMSG (("\n"
+ "Use examples:"
+ "\n"
+ " To encrypt a create a file named 'example' with a password from a file\n"
+ " named 'password-file' to a file named 'example.nenc' all in the current\n"
+ " directory:\n"
+ "\n"
+ " $ %s example \"ncbi-file:example.nenc?encrypt&pwfile=password-file\"\n",
+ progname));
+ OUTMSG (("\n"
+ " To decrypt a file named 'example.nenc' with a password from a file\n"
+ " named 'password-file' to a file named 'example' in directories implied\n"
+ " in the command:\n"
+ "\n"
+ " $ %s \"ncbi-file:/home/user/downloads/example.nenc?encrypt&pwfile=/home/user/password-file\" example\n",
+ progname));
+ OUTMSG (("\n"
+ " To change the encryption of a file from one password to another:\n"
+ "\n"
+ " $ %s \"ncbi-file:/home/user/downloads/example.nenc?encrypt&pwfile=old-password-file\" \\\n"
+ " \"ncbi-file:example.nenc?encrypt&pwfile=/home/user/new-password-file\"\n",
+ progname));
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+static
+rc_t copy_file (const char * src, const char * dst, const KFile * fin, KFile *fout)
+{
+ rc_t rc;
+ uint8_t buff [64 * 1024];
+ size_t num_read;
+ uint64_t inpos;
+ uint64_t outpos;
+
+ assert (src);
+ assert (dst);
+ assert (fin);
+ assert (fout);
+
+ inpos = 0;
+ outpos = 0;
+
+#if 1
+ for (inpos = 0; ; inpos += num_read)
+ {
+ rc = Quitting ();
+ if (rc)
+ {
+ LOGMSG (klogFatal, "Received quit");
+ break;
+ }
+ else
+ {
+ rc = KFileReadAll (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to read from file $(F) at $(P)",
+ "F=%s,P=%lu", src, inpos));
+ break;
+ }
+ else if (num_read)
+ {
+ size_t num_writ;
+
+ rc = KFileWriteAll (fout, inpos, buff, num_read, &num_writ);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ else if (num_writ != num_read)
+ {
+ rc = RC (rcExe, rcFile, rcWriting, rcFile, rcInsufficient);
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write all to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ }
+ else
+ break;
+ }
+ }
+#else
+ do
+ {
+ rc = Quitting ();
+ if (rc)
+ {
+ LOGMSG (klogFatal, "Received quit");
+ break;
+ }
+ rc = KFileRead (fin, inpos, buff, sizeof (buff), &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to read from file $(F) at $(P)",
+ "F=%s,P=%lu", src, inpos));
+ break;
+ }
+ else if (num_read > 0)
+ {
+ size_t to_write;
+
+ inpos += (uint64_t)num_read;
+
+ STSMSG (2, ("Read %zu bytes to %lu", num_read, inpos));
+
+ to_write = num_read;
+ while (to_write > 0)
+ {
+ size_t num_writ;
+ rc = KFileWrite (fout, outpos, buff, num_read, &num_writ);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write to file $(F) at $(P)",
+ "F=%s,P=%lu", dst, outpos));
+ break;
+ }
+ outpos += num_writ;
+ to_write -= num_writ;
+ }
+ }
+ if (rc)
+ break;
+ } while (num_read != 0);
+#endif
+ return rc;
+}
+
+
+static
+rc_t nenctool (const char * srcstr, const char * dststr, bool force)
+{
+ VFSManager * mgr;
+ rc_t rc;
+
+ rc = VFSManagerMake (&mgr);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to create file system manager");
+ else
+ {
+ VPath * srcpath;
+
+ rc = VFSManagerMakePath (mgr, &srcpath, "%s", srcstr);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to parse source path '$(path)'",
+ "path=%s", srcstr));
+ else
+ {
+ VPath * dstpath;
+
+ rc = VFSManagerMakePath (mgr, &dstpath, "%s", dststr);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to parse destination path '$(path)'",
+ "path=%s", dststr));
+ else
+ {
+ const KFile * srcfile;
+
+ rc = VFSManagerOpenFileRead (mgr, &srcfile, srcpath);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "Failed to open source path '$(path)'",
+ "path=%s", srcstr));
+ else
+ {
+ KFile * dstfile;
+
+ rc = VFSManagerCreateFile (mgr, &dstfile, false, 0666,
+ kcmParents | (force ? kcmInit : kcmCreate),
+ dstpath);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to open destination path '$(path)'",
+ "path=%s", dststr));
+ else
+ {
+ rc = copy_file (srcstr, dststr, srcfile, dstfile);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to copy '$(S)' to '$(D)'",
+ "S=%s,D=%s", srcstr, dststr));
+
+ VFSManagerRemove (mgr, true, dstpath);
+ }
+
+ KFileRelease (dstfile);
+ }
+ KFileRelease (srcfile);
+ }
+ VPathRelease (dstpath);
+ }
+ VPathRelease (srcpath);
+ }
+ VFSManagerRelease (mgr);
+ }
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args* args = NULL;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+ if (rc == 0)
+ {
+ uint32_t pcount;
+ bool force;
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine force option");
+ else
+ {
+ force = (pcount > 0);
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to count parameters");
+ else
+ {
+ if (pcount != 2) {
+ MiniUsage (args);
+ rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcInsufficient);
+ }
+ else
+ {
+ const char * src;
+
+ rc = ArgsParamValue (args, 0, (const void **)&src);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to get source parameter");
+ else
+ {
+ const char * dst;
+ rc = ArgsParamValue (args, 1, (const void **)&dst);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to get destination parameter");
+ else
+ {
+ rc = nenctool (src, dst, force);
+ }
+ }
+ }
+ }
+ }
+ ArgsWhack (args);
+ }
+ STSMSG (1, ("exiting: %R (%u)", rc, rc));
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/nencvalid/Makefile b/tools/nencvalid/Makefile
new file mode 100644
index 0000000..606062f
--- /dev/null
+++ b/tools/nencvalid/Makefile
@@ -0,0 +1,88 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/nencvalid
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ nencvalid
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# nencvalid
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+NENCVALID_SRC = \
+ nencvalid
+
+NENCVALID_OBJ = \
+ $(addsuffix .$(OBJX),$(NENCVALID_SRC))
+
+NENCVALID_LIB = \
+ -lkapp \
+ -ltk-version \
+ -lvfs \
+ -lkns \
+ -lkrypto \
+ -lkfg \
+ -lkfs \
+ -lkq \
+ -lkproc \
+ -lklib
+
+$(BINDIR)/nencvalid: $(NENCVALID_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(NENCVALID_LIB)
+
+
+
+
diff --git a/tools/nencvalid/nencvalid.c b/tools/nencvalid/nencvalid.c
new file mode 100644
index 0000000..bcd9391
--- /dev/null
+++ b/tools/nencvalid/nencvalid.c
@@ -0,0 +1,593 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/out.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <assert.h>
+#include <stdlib.h>
+
+#define OPTION_DECRYPT_BIN_COMPATIBILITY "compatibility-mode"
+/* "decrypt.bin" */
+
+static
+OptDef Options[] =
+{
+ /* private option for decrypt.bin script */
+ { OPTION_DECRYPT_BIN_COMPATIBILITY, NULL, NULL, NULL, 0, false, false }
+};
+
+enum CompatibilityModeExitCode
+{
+ CMEC_NO_ERROR = 0,
+ CMEC_BAD_TYPE = 100,
+ CMEC_BAD_HEADER = 101,
+ CMEC_TRUNCATED = 102,
+ CMEC_EXCESS = 103,
+ CMEC_NO_CHECKSUM = 104,
+ CMEC_NO_PASSWORD = 105,
+ CMEC_BAD_CHECKSUM = 106
+};
+
+/* Usage
+ */
+const char UsageDefaultName [] = "nencvalid";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] <file-path> [ <file-path> ...]\n"
+ "\n"
+ "Summary:\n"
+ " Validate the consistency of NCBI format encrypted files\n"
+ "\n", progname);
+}
+
+static
+const char * param_usage[] =
+{
+ "A file in an NCBI encrypted file format.",
+ "The first version encrypted file format",
+ "needs a password to validate the content",
+ "while the second version does not. If the",
+ "ncbi-file uri format is used if you ask",
+ "file decryption (encrypt in the query)",
+ "the validation will be on the decrypted",
+ "file which might not be the intention.",
+ "The password if needed for validation will",
+ "have to be in the standard NCBI VDB",
+ "configuration as 'krypto/pwfile'.", NULL
+};
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Parameters:\n");
+
+ HelpParamLine ("file-path", param_usage);
+
+ KOutMsg ("\nOptions:\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+static rc_t wga_log_error (const char * path, rc_t rc, bool decrypt_bin_compatible)
+{
+ switch (GetRCObject(rc))
+ {
+ case rcSize:
+ switch (GetRCState(rc))
+ {
+ case rcExcessive:
+ if (decrypt_bin_compatible)
+ exit (CMEC_EXCESS);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "probably mis-concatenated file '$(P)'",
+ "P=%s", path));
+ return rc;
+
+ case rcInsufficient:
+ if (decrypt_bin_compatible)
+ exit (CMEC_TRUNCATED);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "probably truncated file '$(P)'",
+ "P=%s", path));
+ return rc;
+
+ default:
+ break;
+ }
+ break;
+
+ case rcChecksum:
+ switch (GetRCState(rc))
+ {
+ case rcInvalid:
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_CHECKSUM);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "checksum of contents '$(P)'",
+ "P=%s", path));
+ return rc;
+
+ case rcNull:
+ if (decrypt_bin_compatible)
+ exit (CMEC_NO_CHECKSUM);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "checksum of contents without password '$(P)'",
+ "P=%s", path));
+ return 0;
+
+ default:
+ break;
+ }
+ break;
+
+ case rcConstraint:
+ switch (GetRCState(rc))
+ {
+ case rcCorrupt:
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_CHECKSUM);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "checksum of contents '$(P)'",
+ "P=%s", path));
+ return rc;
+
+ default:
+ break;
+ }
+ break;
+
+ case rcEncryption:
+ switch (GetRCState(rc))
+ {
+ case rcNull:
+ if (decrypt_bin_compatible)
+ exit (CMEC_NO_PASSWORD);
+ LOGERR (klogWarn, rc, "length validated but content not checked without a password");
+ return 0;
+
+ case rcNotFound:
+ if (decrypt_bin_compatible)
+ exit (CMEC_NO_CHECKSUM);
+ LOGERR (klogWarn, rc, "length validated but content not has no checksum");
+ return 0;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with non-specified error file "
+ "'$(P)'", "P=%s", path));
+ return rc;
+}
+
+static rc_t nencvalidWGAEncValidate (const char * path, const KFile * file, VFSManager * mgr, bool decrypt_bin_compatible)
+{
+ rc_t rc;
+ size_t pwz;
+ char pw [8192];
+
+ rc = VFSManagerGetKryptoPassword (mgr, pw, sizeof (pw) - 1, &pwz);
+
+ if (rc)
+ {
+ if (GetRCObject(rc) == rcEncryptionKey && GetRCState(rc) == rcNotFound)
+ { /* krypto/pwfile not found in the configuration; will proceed without decryption */
+ LOGERR (klogWarn, rc, "no password file configured file content will not be validated");
+
+ /* configuration did not contain a password file so set it to nul */
+ pw[0] = '\0';
+ pwz = 0;
+ rc = 0;
+ }
+ else
+ LOGERR (klogInt, rc, "unable to read password file");
+ }
+
+ if (rc == 0)
+ {
+ rc = WGAEncValidate (file, pw, pwz);
+ if (rc)
+ rc = wga_log_error (path, rc, decrypt_bin_compatible);
+ }
+ return rc;
+}
+
+
+/*
+ * do out thing on a single file name
+ */
+static
+rc_t HandleOneFile (VFSManager * mgr, const char * path, bool decrypt_bin_compatible)
+{
+ rc_t rc;
+ VPath * vpath;
+
+ rc = VFSManagerMakePath (mgr, &vpath, "%s", path);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to parse path "
+ "parameter '$(P)'", "P=%s", path));
+
+ else
+ {
+ const KFile * file;
+
+ rc = VFSManagerOpenFileRead (mgr, &file, vpath);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to parse path "
+ "parameter '$(P)'", "P=%s", path));
+
+ else
+ {
+ size_t buffread;
+ const KFile * buffile;
+
+ rc = KBufFileMakeRead (&buffile, file, 64*1024);
+ if (rc)
+ LOGERR (klogInt, rc, "unable to buffer file");
+ else
+ {
+ /* the two current encrypted file types have an 8 byte signature (magic(
+ * at the beginning of the file. If these 8 don't match we don't even call it
+ * an encrypted file at all */
+ char buffer [8];
+
+ rc = KFileRead (buffile, 0, buffer, sizeof buffer, &buffread);
+ if (rc)
+ LOGERR (klogInt, rc, "Unable to read file signature");
+ else
+ {
+ if (buffread < sizeof buffer)
+ {
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_TYPE);
+ else
+ {
+ rc = RC (rcExe, rcFile, rcValidating, rcHeader, rcWrongType);
+ LOGERR (klogErr, rc, "File too short to be encrypted file");
+ }
+ }
+ else
+ {
+ rc = KFileIsEnc (buffer, sizeof buffer);
+
+ switch (GetRCState(rc))
+ {
+ case 0:
+ case rcInsufficient:
+ rc = KEncFileValidate (buffile);
+ if (rc)
+ {
+ switch (GetRCObject(rc))
+ {
+ /* unsuable header */
+ case rcHeader:
+ case rcByteOrder:
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_HEADER);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with a bad header file '$(P)'",
+ "P=%s", path));
+ break;
+
+ case rcFile:
+ switch (GetRCState(rc))
+ {
+ /* bad block count in the footer: guess it was a truncataiont
+ * an inconvienent point */
+ case rcCorrupt:
+ /* block read was neither a block nor a footer */
+ case rcInsufficient:
+ if (decrypt_bin_compatible)
+ exit (CMEC_TRUNCATED);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "probably truncated file '$(P)'",
+ "P=%s", path));
+
+ break;
+ default:
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with non-specified error file "
+ "'$(P)'", "P=%s", path));
+
+ break;
+ }
+ break;
+
+ case rcCrc:
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_CHECKSUM);
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with good length but bad checksum file "
+ "'$(P)'", "P=%s", path));
+ break;
+
+ default:
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with non-specified error file "
+ "'$(P)'", "P=%s", path));
+ break;
+ }
+ }
+ else
+ STSMSG (1, ("validated file content and size for '%s'\n", path));
+ break;
+
+ case rcWrongType:
+ rc = KFileIsWGAEnc (buffer, buffread);
+ switch (GetRCState(rc))
+ {
+ case 0:
+ rc = nencvalidWGAEncValidate (path, buffile, mgr, decrypt_bin_compatible);
+ break;
+
+ case rcWrongType:
+ if (decrypt_bin_compatible)
+ exit (CMEC_BAD_TYPE);
+ STSMSG (1, ("'%s' is not an encrypted file", path));
+ break;
+
+ default:
+ break;
+ }
+
+ default:
+ if (rc)
+ PLOGERR (klogErr,(klogErr, rc, "failed to validate "
+ "with non-specified error file "
+ "'$(P)'", "P=%s", path));
+ break;
+ }
+ }
+ }
+ KFileRelease (buffile);
+ }
+ KFileRelease (file);
+ }
+ VPathRelease (vpath);
+ }
+ if (rc)
+ STSMSG (1, ("failed validation '%s'", path));
+ else
+ STSMSG (1, ("passed validation '%s'", path));
+
+ return rc;
+}
+
+
+/*
+ * params are file names so retrienve them one by one and process them
+ */
+static __inline__
+rc_t HandleParams (VFSManager * mgr, Args * args, uint32_t pcount)
+{
+ rc_t rc;
+ rc_t orc;
+ uint32_t ix;
+
+ rc = orc = 0;
+ for (ix = 0; (ix < pcount); ++ix)
+ {
+ const char * pc;
+
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ PLOGERR (klogErr,
+ (klogErr, rc, "failed to retrieve "
+ "parameter '$(P)'", "P=%u", ix));
+ else
+ {
+ /*
+ * we will return rc but use orc to handle
+ * the return error code form the first found error on a parameter
+ * though we will continue to process all file parameters
+ */
+ orc = HandleOneFile (mgr, pc, false);
+ if (rc == 0)
+ rc = orc;
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * handle the command line options then handle the file name parameters
+ */
+static __inline__
+rc_t HandleOptions (Args * args)
+{
+ uint32_t pcount;
+ rc_t rc;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to count parameters");
+
+ else
+ {
+ if (pcount == 0) {
+ MiniUsage(args);
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ }
+ else
+ {
+ uint32_t ocount;
+
+ rc = ArgsOptionCount (args, OPTION_QUIET, &ocount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to retrieve quiet option");
+
+ else
+ {
+ bool quiet;
+
+ quiet = (ocount != 0);
+
+ rc = ArgsOptionCount (args, OPTION_DECRYPT_BIN_COMPATIBILITY, &ocount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to retrieve compatibility option");
+
+ else
+ {
+ VFSManager * mgr;
+
+ rc = VFSManagerMake (&mgr);
+ if (rc)
+ LOGERR (klogErr, rc, "failed to open file system manager");
+
+ else
+ {
+ bool decrypt_bin_compatible;
+
+ if (ocount == 0)
+ decrypt_bin_compatible = false;
+
+ else
+ decrypt_bin_compatible = true;
+
+
+ if (quiet)
+ {
+ KStsLevelSet (0);
+ KLogLevelSet (0);
+ }
+ else if (!decrypt_bin_compatible)
+ {
+ if (KStsLevelGet() == 0)
+ KStsLevelSet(1);
+ }
+
+
+ if (decrypt_bin_compatible)
+ {
+ if (pcount > 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ LOGERR (0, rc, "compatibility mode can only handle one file parameter");
+ }
+ else
+ {
+ const char * pc;
+
+ rc = ArgsParamValue (args, 0, (const void **)&pc);
+ if (rc)
+ LOGERR (0, rc, "unable to retrieve file parameter");
+
+ if (rc == 0)
+ rc = HandleOneFile (mgr, pc, true);
+ }
+ }
+ else
+ {
+ rc = HandleParams (mgr, args, pcount);
+ }
+
+ VFSManagerRelease (mgr);
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args* args = NULL;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 1, Options, sizeof Options / sizeof (Options[0]) );
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+ if (rc == 0)
+ {
+ rc = HandleOptions (args);
+
+ ArgsWhack (args);
+ }
+ STSMSG (2,("exiting: %R (%u)", rc, rc));
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/ngs-pileup/Makefile b/tools/ngs-pileup/Makefile
new file mode 100644
index 0000000..b52f71d
--- /dev/null
+++ b/tools/ngs-pileup/Makefile
@@ -0,0 +1,82 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+
+MODULE = tools/ngs-pileup
+
+INT_TOOLS = \
+ ngs-pileup \
+
+EXT_TOOLS = \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# ngs-pileup
+#
+NGS_PILEUP_SRC = \
+ ngs-pileup \
+ main \
+
+INCDIRS += -I $(TOP)/ngs/ngs-c++
+
+NGS_PILEUP_OBJ = \
+ $(addsuffix .$(OBJX),$(NGS_PILEUP_SRC))
+
+NGS_PILEUP_LIBS = \
+ -sncbi-ngs-c++ \
+ -sncbi-vdb-static \
+ -sngs-c++ \
+ -skapp \
+ -stk-version \
+
+$(BINDIR)/ngs-pileup: $(NGS_PILEUP_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(NGS_PILEUP_LIBS)
+
diff --git a/tools/ngs-pileup/main.cpp b/tools/ngs-pileup/main.cpp
new file mode 100644
index 0000000..8a22a17
--- /dev/null
+++ b/tools/ngs-pileup/main.cpp
@@ -0,0 +1,152 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ngs-pileup.hpp"
+
+#include <ngs/ErrorMsg.hpp>
+
+#include <kapp/main.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <sysalloc.h>
+#include <string.h>
+
+#include <iostream>
+
+#define OPTION_REF "aligned-region"
+#define ALIAS_REF "r"
+const char * ref_usage[] = { "Filter by position on genome.",
+ "Name can either be file specific or canonical",
+ "(ex: \"chr1\" or \"1\").",
+ "\"from\" and \"to\" are 1-based coordinates",
+ NULL };
+
+OptDef options[] =
+{ /*name, alias, hfkt, usage-help, maxcount, needs value, required */
+ { OPTION_REF, ALIAS_REF, NULL, ref_usage, 0, true, false },
+};
+
+
+const char UsageDefaultName[] = "ngs-pileup";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s <path> [options]\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+ KOutMsg ( "Options:\n" );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ Args * args;
+
+ rc_t rc = ArgsMakeAndHandle( &args, argc, argv, 1, options, sizeof options / sizeof options [ 0 ] );
+ if ( rc == 0 )
+ {
+ try
+ {
+ NGS_Pileup::Settings settings;
+
+ uint32_t pcount;
+
+ rc = ArgsOptionCount ( args, OPTION_REF, &pcount );
+ if ( pcount > 1 )
+ {
+ throw ngs :: ErrorMsg ( "multiple positions are not supported at this point" );
+ }
+ if ( pcount == 1 )
+ {
+ const void * value;
+ rc = ArgsOptionValue ( args, OPTION_REF, 0, & value );
+ if ( rc != 0 )
+ {
+ throw ngs :: ErrorMsg ( "ArgsOptionValue (" OPTION_REF ") failed" );
+ }
+ settings . AddReference ( static_cast <char const*> (value) );
+ }
+
+ rc = ArgsParamCount ( args, &pcount );
+ if ( rc == 0 )
+ {
+ if ( pcount > 1 )
+ {
+ throw ngs :: ErrorMsg ( "multiple accessions are not supported at this point" );
+ }
+
+ settings . output = & std::cout;
+
+ void const *value;
+ rc = ArgsParamValue ( args, 0, &value );
+ if ( rc == 0 )
+ {
+ settings . AddInput ( static_cast <char const*> (value) );
+
+ NGS_Pileup ( settings ) . Run ();
+ }
+ else
+ {
+ throw ngs :: ErrorMsg ( "ArgsParamValue failed" );
+ }
+ }
+ }
+ catch (ngs :: ErrorMsg& ex)
+ {
+ std :: cerr << "Program aborted: " << ex.what() << std::endl;
+ exit ( -1 );
+ }
+
+ ArgsWhack( args );
+ }
+
+ return 0;
+}
+
diff --git a/tools/ngs-pileup/ngs-pileup.cpp b/tools/ngs-pileup/ngs-pileup.cpp
new file mode 100644
index 0000000..fdee801
--- /dev/null
+++ b/tools/ngs-pileup/ngs-pileup.cpp
@@ -0,0 +1,206 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ngs-pileup.hpp"
+
+#include <iostream>
+
+#include <ngs/ncbi/NGS.hpp>
+#include <ngs/ReadCollection.hpp>
+#include <ngs/PileupIterator.hpp>
+
+using namespace std;
+
+struct NGS_Pileup::TargetReference
+{
+ typedef pair < int64_t, int64_t > Slice;
+ typedef vector < Slice > Slices;
+ typedef vector < ngs :: Reference > Targets;
+ typedef vector < ngs :: PileupIterator> Pileups;
+
+ string m_canonicalName;
+ Slices m_slices;
+ Targets m_targets;
+ Pileups m_pileups;
+ bool m_complete;
+
+ TargetReference ( ngs :: Reference p_ref )
+ : m_canonicalName ( p_ref . getCanonicalName() ), m_complete ( true )
+ {
+ AddReference ( p_ref );
+ }
+ TargetReference ( ngs :: Reference p_ref,
+ int64_t p_first,
+ int64_t p_last )
+ : m_canonicalName ( p_ref . getCanonicalName() ), m_complete ( false )
+ {
+ AddReference ( p_ref );
+ }
+ ~TargetReference ()
+ {
+ }
+
+ void AddSlice ( int64_t p_first, int64_t p_last )
+ {
+ }
+ void MakeComplete ()
+ {
+ m_complete = true;
+ m_slices . clear();
+ }
+
+ void AddReference ( ngs :: Reference p_ref )
+ {
+ m_targets. push_back ( p_ref );
+ }
+
+ void Process ( ostream& out )
+ {
+ int64_t firstPos = 0;
+ int64_t lastPos = m_targets . front () . getLength () - 1;
+
+ // create pileup iterators
+ for ( Targets::iterator i = m_targets.begin(); i != m_targets.end(); ++i )
+ {
+ m_pileups . push_back ( i -> getPileups ( ngs::Alignment::all ) );
+ }
+
+ int64_t curPos = firstPos;
+ while ( curPos <= lastPos )
+ {
+ uint32_t total_depth = 0;
+ for ( Pileups :: iterator i = m_pileups . begin (); i != m_pileups. end (); ++i )
+ {
+ bool next = i -> nextPileup ();
+ assert ( next );
+ total_depth += i -> getPileupDepth ();
+ }
+
+ if ( total_depth > 0 )
+ {
+ out << m_canonicalName
+ << '\t' << ( curPos + 1 ) // convert to 1-based position to emulate samtools
+ << '\t' << total_depth
+ << endl;
+ }
+
+ ++ curPos;
+ }
+ }
+};
+
+class NGS_Pileup::TargetReferences : public vector < TargetReference >
+{
+public :
+ void AddComplete ( ngs :: Reference ref )
+ {
+ string name = ref . getCanonicalName ();
+ for ( iterator i = begin(); i != end (); ++ i )
+ {
+ if ( i -> m_canonicalName == name )
+ {
+ i -> AddReference ( ref );
+ return;
+ }
+ }
+ // not found - add new reference
+ push_back ( TargetReference ( ref ) );
+ }
+};
+
+NGS_Pileup::NGS_Pileup ( const Settings& p_settings )
+: m_settings( p_settings )
+{
+}
+
+static
+bool FindReference ( const NGS_Pileup :: Settings :: References & requested, const ngs :: Reference & ref )
+{
+ for ( NGS_Pileup :: Settings :: References :: const_iterator i = requested . begin();
+ i != requested . end ();
+ ++i )
+ {
+ if ( i->m_name == ref . getCanonicalName () || i->m_name == ref . getCommonName () )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void
+NGS_Pileup::Run () const
+{
+ TargetReferences references;
+
+ // build the set of target references
+ for ( Settings :: Inputs :: const_iterator i = m_settings . inputs . begin();
+ i != m_settings . inputs . end ();
+ ++i )
+ {
+ ngs :: ReadCollection col = ncbi :: NGS :: openReadCollection ( *i );
+ ngs :: ReferenceIterator refIt = col . getReferences ();
+ while ( refIt . nextReference () )
+ {
+ if ( m_settings . references . empty () ) // all references requested
+ {
+ /* need to create a Reference object that is not attached to the iterator, so as
+ it is not invalidated on the next call to refIt.NextReference() */
+ references . AddComplete ( col . getReference ( refIt. getCommonName () ) );
+ }
+ else if ( FindReference ( m_settings . references, refIt ) )
+ {
+ //TODO: handle slices
+ references . AddComplete ( col . getReference ( refIt. getCommonName () ) );
+ }
+ }
+ }
+
+ ostream & out ( m_settings . output != (ostream*)0 ? * m_settings . output : cout );
+
+ // walk the references and output pileups
+ for ( TargetReferences :: iterator i = references . begin(); i != references . end (); ++i )
+ {
+ i -> Process ( out );
+ }
+}
+
+//// NGS_Pileup::Settings
+
+void
+NGS_Pileup::Settings::AddReference ( const string& commonOrCanonicalName )
+{
+ references . push_back ( ReferenceSlice ( commonOrCanonicalName ) );
+}
+
+void
+NGS_Pileup::Settings::AddReferenceSlice ( const string& commonOrCanonicalName,
+ int64_t firstPos,
+ int64_t lastPos )
+{
+ references . push_back ( ReferenceSlice ( commonOrCanonicalName, firstPos, lastPos ) );
+}
+
diff --git a/tools/ngs-pileup/ngs-pileup.hpp b/tools/ngs-pileup/ngs-pileup.hpp
new file mode 100644
index 0000000..0fb7a37
--- /dev/null
+++ b/tools/ngs-pileup/ngs-pileup.hpp
@@ -0,0 +1,97 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _sra_tools_hpp_ngs_pileup_
+#define _sra_tools_hpp_ngs_pileup_
+
+#include <klib/defs.h>
+
+#include <string>
+#include <vector>
+
+namespace ngs
+{
+ class Reference;
+}
+
+class NGS_Pileup
+{
+public:
+ struct Settings
+ {
+ struct ReferenceSlice
+ {
+ ReferenceSlice( const std::string& p_name ) /* entire reference */
+ : m_name ( p_name ),
+ m_firstPos ( 0 ),
+ m_lastPos ( 0 ),
+ m_full ( true )
+ {
+ }
+ ReferenceSlice( const std::string& p_name,
+ int64_t p_firstPos,
+ int64_t p_lastPos )
+ : m_name ( p_name ),
+ m_firstPos ( p_firstPos ),
+ m_lastPos ( p_lastPos ),
+ m_full ( false )
+ {
+ }
+
+ std::string m_name;
+ int64_t m_firstPos;
+ int64_t m_lastPos;
+ bool m_full;
+ };
+
+ void AddInput ( const std::string& accession ) { inputs . push_back ( accession ); }
+ void AddReference ( const std::string& commonOrCanonicalName );
+ void AddReferenceSlice ( const std::string& commonOrCanonicalName,
+ int64_t firstPos,
+ int64_t lastPos );
+
+
+ typedef std::vector < std::string > Inputs;
+ typedef std::vector < ReferenceSlice > References;
+
+ Inputs inputs;
+ std::ostream* output;
+ References references;
+ };
+
+public:
+ NGS_Pileup ( const Settings& p_settings );
+
+ void Run () const;
+
+private:
+ struct TargetReference;
+ class TargetReferences;
+
+ Settings m_settings;
+};
+
+#endif
diff --git a/tools/pacbio-load/.gitignore b/tools/pacbio-load/.gitignore
new file mode 100644
index 0000000..e40acaf
--- /dev/null
+++ b/tools/pacbio-load/.gitignore
@@ -0,0 +1,7 @@
+*.vers.h
+*.bin
+*.txt
+*.sh
+*.h5
+dst
+pacbio1
diff --git a/tools/pacbio-load/Makefile b/tools/pacbio-load/Makefile
new file mode 100644
index 0000000..5c0d4d4
--- /dev/null
+++ b/tools/pacbio-load/Makefile
@@ -0,0 +1,117 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/pacbio-load
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ pacbio-load
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# where to find hdf5 libs
+#
+ifdef NCBI
+ifeq (dbg,$(BUILD))
+ LIBHDF5_LPATH = $(NCBI)/hdf5/Debug/lib
+else
+ LIBHDF5_LPATH = $(NCBI)/hdf5/Release/lib
+endif
+endif
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_HDF5))
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built:" \
+ "It requires our internal library 'libkdf5'" \
+ "which requires 'libhdf5' and its development headers."
+endif
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-copy
+# vdb copy tool
+#
+PACBIO_LOAD_SRC = \
+ pl-context \
+ pl-tools \
+ pl-zmw \
+ pl-basecalls_cmn \
+ pl-sequence \
+ pl-consensus \
+ pl-passes \
+ pl-metrics \
+ pl-regions \
+ pl-progress \
+ pacbio-load
+
+PACBIO_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(PACBIO_LOAD_SRC))
+
+PACBIO_LOAD_LIB = \
+ -skapp \
+ -stk-version \
+ -skdf5 \
+ -sload \
+ -shdf5 \
+ -sncbi-wvdb \
+ -sm \
+
+ifdef HDF5_LIBDIR
+ PACBIO_LOAD_LIB += $(addprefix -L,$(HDF5_LIBDIR))
+endif
+
+$(BINDIR)/pacbio-load: $(PACBIO_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(PACBIO_LOAD_LIB)
diff --git a/tools/pacbio-load/pacbio-load.c b/tools/pacbio-load/pacbio-load.c
new file mode 100644
index 0000000..ef9b14e
--- /dev/null
+++ b/tools/pacbio-load/pacbio-load.c
@@ -0,0 +1,650 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data", the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties", express or implied", including
+* warranties of performance", merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-context.h"
+#include "pl-tools.h"
+#include "pl-zmw.h"
+#include "pl-basecalls_cmn.h"
+#include "pl-sequence.h"
+#include "pl-consensus.h"
+#include "pl-passes.h"
+#include "pl-metrics.h"
+
+#include <klib/out.h>
+#include <klib/namelist.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kdb/meta.h>
+#include <kdb/database.h>
+
+#include <vdb/vdb-priv.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <sra/sraschema.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/loader-meta.h>
+
+#include <hdf5/kdf5.h>
+
+#include <kfs/arrayfile.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+const char UsageDefaultName[] = "pacbio-load";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ OUTMSG ( ("\n"
+ "Usage:\n"
+ " %s <hdf5-file> -o<target>\n"
+ "\n", progname) );
+ return 0;
+}
+
+static const char* schema_usage[] = { "schema-name to be used", NULL };
+static const char* output_usage[] = { "target to be created", NULL };
+static const char* force_usage[] = { "forces an existing target to be overwritten", NULL };
+static const char* tabs_usage[] = { "load only these tabs (SCPM), dflt=all",
+ " S...Sequence",
+ " C...Consensus",
+ " P...Passes",
+ " M...Metrics", NULL };
+static const char* progress_usage[] = { "show load-progress", NULL };
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine ( ALIAS_OUTPUT, OPTION_OUTPUT, "output", output_usage );
+
+ HelpOptionLine ( ALIAS_SCHEMA, OPTION_SCHEMA, "schema", schema_usage );
+ HelpOptionLine ( ALIAS_FORCE, OPTION_FORCE, "force", force_usage );
+ HelpOptionLine ( ALIAS_TABS, OPTION_TABS, "tabs", tabs_usage );
+ HelpOptionLine ( ALIAS_WITH_PROGRESS, OPTION_WITH_PROGRESS,
+ "load-progress", progress_usage );
+ XMLLogger_Usage();
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+ return rc;
+}
+
+static bool pacbio_is_schema_dflt( const char * schema )
+{
+ size_t asize = string_size ( schema );
+ size_t bsize = string_size ( DFLT_SCHEMA );
+ uint32_t max_chars = ( asize > bsize ) ? asize : bsize;
+ return ( string_cmp ( schema, asize, DFLT_SCHEMA, bsize, max_chars ) == 0 );
+}
+
+
+static rc_t pacbio_extract_path( const KDirectory *dir, const char *schema_name,
+ char * dst, size_t dst_len )
+{
+ rc_t rc = KDirectoryResolvePath ( dir, true, dst, dst_len, "%s", schema_name );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot resolve path to schema-file '$(name)'",
+ "name=%s", schema_name ));
+ else
+ {
+ char *ptr = strrchr ( dst, '/' );
+ if ( ptr == 0 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ PLOGERR( klogErr, ( klogErr, rc, "cannot extract the path of '$(name)'",
+ "name=%s", schema_name ));
+ }
+ else
+ *ptr = 0;
+ }
+ return rc;
+}
+
+
+static rc_t pacbio_load_schema( KDirectory * wd, VDBManager * vdb_mgr, VSchema ** schema, const char * schema_name )
+{
+ rc_t rc;
+
+ if ( pacbio_is_schema_dflt( schema_name ) )
+ {
+ rc = VDBManagerMakeSRASchema ( vdb_mgr, schema );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot create sra-schema" );
+
+ if ( rc == 0 )
+ {
+ rc = VSchemaParseFile ( *schema, "%s", schema_name );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot parse schema file '$(schema)'",
+ "schema=%s", schema_name ) );
+ }
+ }
+ else
+ {
+ rc = VDBManagerMakeSchema ( vdb_mgr, schema );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot create sra-schema" );
+ else
+ {
+ char path[ 4096 ];
+ rc = pacbio_extract_path( wd, schema_name, path, sizeof path );
+ if ( rc == 0 )
+ {
+ rc = VSchemaAddIncludePath ( *schema, "%s", path );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot add schema-include-path '$(path)'",
+ "path=%s", path ) );
+ else
+ {
+ rc = VSchemaParseFile ( *schema, "%s", schema_name );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot parse schema file '$(schema)'",
+ "schema=%s", schema_name ) );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t pacbio_meta_entry( VDatabase * db, const char * toolname )
+{
+ KMetadata* meta = NULL;
+ rc_t rc = VDatabaseOpenMetadataUpdate( db, &meta );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "Cannot open database-metadata" );
+ }
+ else
+ {
+ KMDataNode *node = NULL;
+
+ rc = KMetadataOpenNodeUpdate( meta, &node, "/" );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "Cannot open database-metadata-root" );
+ }
+ else
+ {
+ rc = KLoaderMeta_Write( node, toolname, __DATE__, "PacBio HDF5", KAppVersion() );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "Cannot write pacbio metadata node" );
+ }
+ KMDataNodeRelease( node );
+ }
+ KMetadataRelease( meta );
+ }
+ return rc;
+}
+
+
+/* the context that has the context of all 4 sub-tables (SEQUENCE,CONSENSU,PASSES,METRICS) */
+typedef struct seq_con_pas_met
+{
+ seq_ctx sequence; /* from pl-sequence.h */
+ con_ctx consensus; /* from pl-consensus.h */
+ pas_ctx passes; /* from pl-passes.h */
+ met_ctx metrics; /* from pl-metrics.h */
+} seq_con_pas_met;
+
+
+/* we have to pass in the first hdf5-source, because prepare of sequences needs it */
+static rc_t pacbio_prepare( VDatabase * database, seq_con_pas_met * dst, KDirectory * first_src, ld_context *lctx )
+{
+ rc_t rc;
+
+ dst->sequence.cursor = NULL;
+ dst->consensus.cursor = NULL;
+ dst->passes.cursor = NULL;
+ dst->metrics.cursor = NULL;
+
+ rc = prepare_seq( database, &dst->sequence, first_src, lctx ); /* pl-sequence.c */
+ if ( rc == 0 )
+ rc = prepare_consensus( database, &dst->consensus, lctx ); /* pl-consensus.c */
+ if ( rc == 0 )
+ rc = prepare_passes( database, &dst->passes, lctx ); /* pl-passes.c */
+ if ( rc == 0 )
+ rc = prepare_metrics( database, &dst->metrics, lctx ); /* pl-metrics.c */
+ return rc;
+}
+
+
+static rc_t pacbio_load_src( context *ctx, seq_con_pas_met * dst, KDirectory * src, bool * consensus_present )
+{
+ rc_t rc1, rc = 0;
+
+ if ( ctx_ld_sequence( ctx ) )
+ rc = load_seq_src( &dst->sequence, src ); /* pl-sequence.c */
+
+ if ( rc == 0 && ctx_ld_consensus( ctx ) )
+ {
+ rc1 = load_consensus_src( &dst->consensus, src ); /* pl-consensus.c */
+ if ( rc1 == 0 )
+ *consensus_present = true;
+ else
+ LOGMSG( klogWarn, "the consensus-group is missing" );
+ }
+
+ if ( rc == 0 && ctx_ld_passes( ctx ) && *consensus_present )
+ {
+ rc1 = load_passes_src( &dst->passes, src ); /* pl-passes.c */
+ if ( rc1 != 0 )
+ LOGMSG( klogWarn, "the passes-table is missing" );
+ }
+
+ if ( rc == 0 && ctx_ld_metrics( ctx ) && *consensus_present )
+ {
+ rc1 = load_metrics_src( &dst->metrics, src ); /* pl-metrics.c */
+ if ( rc1 != 0 )
+ LOGMSG( klogWarn, "the metrics-table is missing" );
+ }
+ return rc;
+}
+
+
+static rc_t pacbio_finish( seq_con_pas_met * dst )
+{
+ rc_t rc = finish_seq( &dst->sequence ); /* pl-sequence.c */
+ if ( rc == 0 )
+ rc = finish_consensus( &dst->consensus ); /* pl-consensus.c */
+ if ( rc == 0 )
+ rc = finish_passes( &dst->passes ); /* pl-passes.c */
+ if ( rc == 0 )
+ rc = finish_metrics( &dst->metrics ); /* pl-metrics.c */
+ return rc;
+}
+
+
+static rc_t pacbio_get_hdf5_src( KDirectory * wd, const VNamelist * path_list, uint32_t idx, KDirectory ** hdf5_src )
+{
+ const char * src_path;
+ rc_t rc = VNameListGet ( path_list, idx, &src_path );
+ if ( rc == 0 && src_path != NULL )
+ {
+ rc = MakeHDF5RootDir ( wd, hdf5_src, false, src_path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot open hdf5-source-file '$(srcfile)'",
+ "srcfile=%s", src_path ) );
+ }
+ }
+ return rc;
+}
+
+
+static bool pacbio_has_MultiParts( KDirectory * hdf5_src )
+{
+ uint32_t pt = KDirectoryPathType ( hdf5_src, "MultiPart/Parts" );
+ return ( pt == kptDataset );
+}
+
+
+static rc_t pacbio_get_MultiParts( KDirectory * hdf5_src, VNamelist * parts )
+{
+ struct KFile const *f; /* the fake "file" from a HDF5-dir */
+ rc_t rc = KDirectoryOpenFileRead ( hdf5_src, &f, "MultiPart/Parts" );
+ if ( rc == 0 )
+ {
+ struct KArrayFile *af; /* the arrayfile made from f */
+ rc = MakeHDF5ArrayFile ( f, &af );
+ if ( rc == 0 )
+ {
+ uint8_t dimensionality;
+ rc = KArrayFileDimensionality ( af, &dimensionality );
+ if ( rc == 0 && dimensionality == 1 )
+ {
+ uint64_t extents[ 1 ];
+ rc = KArrayFileDimExtents ( af, dimensionality, extents );
+ if ( rc == 0 )
+ {
+ uint64_t pos[ 1 ];
+ for ( pos[ 0 ] = 0; pos[ 0 ] < extents[ 0 ] && rc == 0; pos[ 0 ] += 1 )
+ {
+ char buffer[ 1024 ];
+ uint64_t num_read;
+ rc = KArrayFileRead_v ( af, 1, pos, buffer, sizeof buffer, &num_read );
+ if ( rc == 0 )
+ rc = VNamelistAppend ( parts, buffer );
+ }
+ }
+ }
+ KArrayFileRelease( af );
+ }
+ KFileRelease( f );
+ }
+ return rc;
+}
+
+
+static rc_t pacbio_load_multipart( context * ctx, KDirectory * wd, VDatabase * database,
+ KDirectory ** hdf5_src, bool * consensus_present,
+ ld_context * lctx, uint32_t count )
+{
+ seq_con_pas_met dst;
+ uint32_t idx = 0;
+ /* the loop is complicated, because pacbio_prepare needs the first hdf5-src opened ! */
+ rc_t rc = pacbio_prepare( database, &dst, *hdf5_src, lctx );
+ while ( idx < count && rc == 0 )
+ {
+ rc = pacbio_load_src( ctx, &dst, *hdf5_src, consensus_present );
+ idx++;
+ if ( rc == 0 && idx < count )
+ {
+ KDirectoryRelease ( *hdf5_src );
+ rc = pacbio_get_hdf5_src( wd, ctx->src_paths, idx, hdf5_src );
+ }
+ }
+ pacbio_finish( &dst );
+ KDirectoryRelease ( *hdf5_src );
+ return rc;
+}
+
+
+static rc_t add_unique_to_namelist( const VNamelist * src, VNamelist * dst, int32_t idx )
+{
+ const char * s;
+ rc_t rc = VNameListGet( src, idx, &s );
+ if ( rc == 0 && s != NULL && s[ 0 ] != 0 )
+ {
+ uint32_t found;
+ rc_t rc2 = VNamelistIndexOf( dst, s, &found );
+ if ( GetRCState( rc2 ) == rcNotFound )
+ rc = VNamelistAppend( dst, s );
+ }
+ return rc;
+}
+
+static rc_t pacbio_load( context *ctx, KDirectory * wd, ld_context *lctx, const char * toolname )
+{
+ VDBManager * vdb_mgr = NULL;
+ VSchema * schema = NULL;
+ VDatabase * database = NULL;
+
+ rc_t rc = VDBManagerMakeUpdate ( &vdb_mgr, wd );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot create vdb-update-manager" );
+ }
+
+ if ( rc == 0 )
+ rc = pacbio_load_schema( wd, vdb_mgr, &schema, ctx->schema_name );
+
+
+ /* creates the output vdb database */
+ if ( rc == 0 )
+ {
+ KCreateMode cmode = kcmMD5 | kcmParents;
+ if ( ctx->force )
+ cmode |= kcmInit;
+ else
+ cmode |= kcmCreate;
+ rc = VDBManagerCreateDB( vdb_mgr, &database, schema,
+ PACBIO_SCHEMA_DB, cmode, "%s", ctx->dst_path );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create output-database '$(dst)'",
+ "dst=%s", ctx->dst_path ) );
+ }
+
+
+ /* creates the 4 output vdb tables... SEQUENCE, CONSENSUS, PASSES and METRICS */
+ if ( rc == 0 )
+ {
+ bool consensus_present = false;
+ VNamelist * to_process;
+ rc = VNamelistMake ( &to_process, 5 );
+ if ( rc == 0 )
+ {
+ KDirectory * hdf5_src;
+ uint32_t count, idx;
+
+ rc = VNameListCount ( ctx->src_paths, &count );
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ rc = pacbio_get_hdf5_src( wd, ctx->src_paths, 0, &hdf5_src );
+ if ( rc == 0 )
+ {
+ if ( pacbio_has_MultiParts( hdf5_src ) )
+ {
+ VNamelist * parts;
+ rc = VNamelistMake ( &parts, 5 );
+ if ( rc == 0 )
+ {
+ rc = pacbio_get_MultiParts( hdf5_src, parts );
+ if ( rc == 0 )
+ {
+ uint32_t p_count, p_idx;
+ rc = VNameListCount ( parts, &p_count );
+ for ( p_idx = 0; rc == 0 && p_idx < p_count; ++p_idx )
+ rc = add_unique_to_namelist( parts, to_process, p_idx );
+ }
+ VNamelistRelease ( parts );
+ }
+ }
+ else
+ rc = add_unique_to_namelist( ctx->src_paths, to_process, idx );
+ KDirectoryRelease( hdf5_src );
+ }
+ }
+ VNamelistRelease ( ctx->src_paths );
+ ctx->src_paths = to_process;
+
+ if ( rc == 0 )
+ {
+ rc = VNameListCount ( ctx->src_paths, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ ctx_show( ctx );
+ rc = pacbio_get_hdf5_src( wd, ctx->src_paths, 0, &hdf5_src );
+ if ( rc == 0 )
+ rc = pacbio_load_multipart( ctx, wd, database, &hdf5_src, &consensus_present, lctx, count );
+ }
+ }
+
+ }
+
+ if ( !consensus_present )
+ VDatabaseDropTable ( database, "CONSENSUS" );
+ }
+
+ if ( rc == 0 )
+ seq_report_totals( lctx );
+
+ if ( rc == 0 )
+ rc = pacbio_meta_entry( database, toolname );
+
+ if ( database != NULL )
+ VDatabaseRelease ( database );
+
+ if ( schema != NULL )
+ VSchemaRelease ( schema );
+
+ if ( vdb_mgr != NULL )
+ VDBManagerRelease ( vdb_mgr );
+ return rc;
+}
+
+
+static rc_t pacbio_check_sourcefile( const KDirectory * dir, char ** path )
+{
+ rc_t rc = 0;
+ uint32_t src_path_type = KDirectoryPathType ( dir, "%s", *path );
+ if ( ( src_path_type & kptFile ) == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcValidating, rcItem, rcNotFound );
+ LOGERR( klogErr, rc, "source-file not found" );
+ }
+ else
+ {
+ if ( ( src_path_type & kptAlias ) != 0 )
+ {
+ char resolved[ 4096 ];
+ rc = KDirectoryResolveAlias ( dir, true, resolved,
+ sizeof resolved, "%s", *path );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot resolve srcfile-link" );
+ }
+ else
+ {
+ free( *path );
+ *path = string_dup_measure ( resolved, NULL );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t pacbio_check_sourcefile_list( const KDirectory * dir, VNamelist ** list )
+{
+ VNamelist * temp;
+ rc_t rc = VNamelistMake ( &temp, 5 );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+ rc = VNameListCount ( *list, &count );
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * name = NULL;
+ rc = VNameListGet ( *list, idx, &name );
+ if ( rc == 0 && name != NULL )
+ {
+ char * path = string_dup_measure ( name, NULL );
+ rc = pacbio_check_sourcefile( dir, &path );
+ if ( rc == 0 )
+ rc = VNamelistAppend ( temp, path );
+ }
+ }
+ if ( rc == 0 )
+ {
+ rc = VNamelistRelease ( *list );
+ *list = temp;
+ }
+ }
+ return rc;
+}
+
+
+OptDef MyOptions[] =
+{
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 5, true, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 1, false, false },
+ { OPTION_WITH_PROGRESS, ALIAS_WITH_PROGRESS, NULL, progress_usage, 1, false, false },
+ { OPTION_TABS, ALIAS_TABS, NULL, tabs_usage, 1, true, false },
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, true }
+};
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 2,
+ MyOptions, sizeof MyOptions / sizeof ( OptDef ),
+ XMLLogger_Args, XMLLogger_ArgsQty );
+
+ KLogHandlerSetStdErr();
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "error creating internal structure" );
+ }
+ else
+ {
+ KDirectory * wd;
+ rc = KDirectoryNativeDir ( &wd );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "error creating internal structure" );
+ }
+ else
+ {
+ ld_context lctx;
+ lctx_init( &lctx );
+ rc = XMLLogger_Make( &lctx.xml_logger, wd, args );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "error creating internal structure" );
+ }
+ else
+ {
+ context ctx;
+ rc = ctx_init( args, &ctx );
+ if ( rc == 0 )
+ {
+ rc = pacbio_check_sourcefile_list( wd, &ctx.src_paths );
+ if ( rc == 0 )
+ {
+ lctx.with_progress = ctx.with_progress;
+ lctx.dst_path = ctx.dst_path;
+ lctx.cache_content = false;
+ lctx.check_src_obj = false;
+
+ rc = KLoadProgressbar_Make( &lctx.xml_progress, 0 );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot create LoadProgressBar" );
+ }
+ else
+ rc = pacbio_load( &ctx, wd, &lctx, argv[ 0 ] );
+
+ }
+ ctx_free( &ctx );
+ }
+ }
+ KDirectoryRelease ( wd );
+ lctx_free( &lctx );
+ }
+ ArgsWhack ( args );
+ }
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-basecalls_cmn.c b/tools/pacbio-load/pl-basecalls_cmn.c
new file mode 100644
index 0000000..7980d3c
--- /dev/null
+++ b/tools/pacbio-load/pl-basecalls_cmn.c
@@ -0,0 +1,97 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-basecalls_cmn.h"
+#include <sysalloc.h>
+
+void init_BaseCalls_cmn( BaseCalls_cmn *tab )
+{
+ zmw_init( &tab->zmw );
+ init_array_file( &tab->Basecall );
+ init_array_file( &tab->QualityValue );
+ init_array_file( &tab->DeletionQV );
+ init_array_file( &tab->DeletionTag );
+ init_array_file( &tab->InsertionQV );
+ init_array_file( &tab->SubstitutionQV );
+ init_array_file( &tab->SubstitutionTag );
+}
+
+
+void close_BaseCalls_cmn( BaseCalls_cmn *tab )
+{
+ zmw_close( &tab->zmw );
+ free_array_file( &tab->Basecall );
+ free_array_file( &tab->QualityValue );
+ free_array_file( &tab->DeletionQV );
+ free_array_file( &tab->DeletionTag );
+ free_array_file( &tab->InsertionQV );
+ free_array_file( &tab->SubstitutionQV );
+ free_array_file( &tab->SubstitutionTag );
+}
+
+
+rc_t open_BaseCalls_cmn( const KDirectory *hdf5_dir, BaseCalls_cmn *tab,
+ const bool num_passes, const char * path,
+ bool cache_content, bool supress_err_msg )
+{
+ rc_t rc;
+
+ init_BaseCalls_cmn( tab );
+ rc = zmw_open( hdf5_dir, &tab->zmw, num_passes, path, supress_err_msg );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->Basecall, path, "Basecall",
+ BASECALL_BITSIZE, BASECALL_COLS,
+ true, cache_content, supress_err_msg );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->QualityValue, path, "QualityValue",
+ QUALITY_VALUE_BITSIZE, QUALITY_VALUE_COLS,
+ true, cache_content, supress_err_msg );
+ if ( rc == 0 )
+ {
+ open_element( hdf5_dir, &tab->DeletionQV, path, "DeletionQV",
+ DELETION_QV_BITSIZE, DELETION_QV_COLS,
+ true, cache_content, true );
+
+ open_element( hdf5_dir, &tab->DeletionTag, path, "DeletionTag",
+ DELETION_TAG_BITSIZE, DELETION_TAG_COLS,
+ true, cache_content, true );
+
+ open_element( hdf5_dir, &tab->InsertionQV, path, "InsertionQV",
+ INSERTION_QV_BITSIZE, INSERTION_QV_COLS,
+ true, cache_content, true );
+
+ open_element( hdf5_dir, &tab->SubstitutionQV, path, "SubstitutionQV",
+ SUBSTITUTION_QV_BITZISE, SUBSTITUTION_QV_COLS,
+ true, cache_content, true );
+
+ open_element( hdf5_dir, &tab->SubstitutionTag, path, "SubstitutionTag",
+ SUBSTITUTION_TAG_BITSIZE, SUBSTITUTION_TAG_COLS,
+ true, cache_content, true );
+ }
+ if ( rc != 0 )
+ close_BaseCalls_cmn( tab ); /* releases only initialized elements */
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-basecalls_cmn.h b/tools/pacbio-load/pl-basecalls_cmn.h
new file mode 100644
index 0000000..f9965cc
--- /dev/null
+++ b/tools/pacbio-load/pl-basecalls_cmn.h
@@ -0,0 +1,60 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_basecalls_cmn_
+#define _h_pl_basecalls_cmn_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-zmw.h"
+#include <klib/rc.h>
+
+typedef struct BaseCalls_cmn
+{
+ zmw_tab zmw;
+ af_data Basecall;
+ af_data QualityValue;
+ af_data DeletionQV;
+ af_data DeletionTag;
+ af_data InsertionQV;
+ af_data SubstitutionQV;
+ af_data SubstitutionTag;
+} BaseCalls_cmn;
+
+
+void init_BaseCalls_cmn( BaseCalls_cmn *tab );
+void close_BaseCalls_cmn( BaseCalls_cmn *tab );
+rc_t open_BaseCalls_cmn( const KDirectory *hdf5_dir, BaseCalls_cmn *tab,
+ const bool num_passes, const char * path,
+ bool cache_content, bool supress_err_msg );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-consensus.c b/tools/pacbio-load/pl-consensus.c
new file mode 100644
index 0000000..c2c2565
--- /dev/null
+++ b/tools/pacbio-load/pl-consensus.c
@@ -0,0 +1,472 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-consensus.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+const char * consensus_tab_names[] =
+{
+ /* base-space */
+ "READ",
+ "QUALITY",
+ "NREADS",
+ "READ_TYPE",
+ "READ_START",
+ "READ_LEN",
+ "(INSDC:SRA:platform_id)PLATFORM",
+ "READ_FILTER",
+
+ /* consensus-space */
+ "HOLE_NUMBER",
+ "HOLE_STATUS",
+ "HOLE_XY",
+ "NUM_PASSES",
+ "INSERTION_QV",
+ "DELETION_QV",
+ "DELETION_TAG",
+ "SUBSTITUTION_QV",
+ "SUBSTITUTION_TAG"
+};
+
+
+static bool check_Consensus_totalcount( BaseCalls_cmn *tab, const uint64_t expected )
+{
+ bool res = check_table_count( &tab->Basecall, "Basecall", expected );
+ if ( res )
+ res = check_table_count( &tab->QualityValue, "QualityValue", expected );
+
+ if ( res )
+ {
+ if ( tab->DeletionQV.extents != NULL )
+ res = check_table_count( &tab->DeletionQV, "DeletionQV", expected );
+
+ if ( tab->DeletionTag.extents != NULL )
+ res = check_table_count( &tab->DeletionTag, "DeletionTag", expected );
+
+ if ( tab->InsertionQV.extents != NULL )
+ res = check_table_count( &tab->InsertionQV, "InsertionQV", expected );
+
+ if ( tab->SubstitutionQV.extents != NULL )
+ res = check_table_count( &tab->SubstitutionQV, "SubstitutionQV", expected );
+
+ if ( tab->SubstitutionTag.extents != NULL )
+ res = check_table_count( &tab->SubstitutionTag, "SubstitutionTag", expected );
+ }
+
+ return res;
+}
+
+
+static rc_t consensus_load_zero_bases( VCursor *cursor, const uint32_t *col_idx )
+{
+ uint32_t dummy_src;
+ INSDC_SRA_read_filter filter = SRA_READ_FILTER_CRITERIA;
+
+ rc_t rc = vdb_write_value( cursor, col_idx[ consensus_tab_READ ],
+ &dummy_src, BASECALL_BITSIZE, 0, "consensus.Basecall" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_QUALITY ],
+ &dummy_src, QUALITY_VALUE_BITSIZE, 0, "QualityValue" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_INSERTION_QV ],
+ &dummy_src, INSERTION_QV_BITSIZE, 0, "consensus.InsertionQV" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_DELETION_QV ],
+ &dummy_src, DELETION_QV_BITSIZE, 0, "consensus.DeletionQV" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_DELETION_TAG ],
+ &dummy_src, DELETION_TAG_BITSIZE, 0, "consensus.DeletionTag" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_SUBSTITUTION_QV ],
+ &dummy_src, SUBSTITUTION_QV_BITZISE, 0, "consensus.SubstitutionQV" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_SUBSTITUTION_TAG ],
+ &dummy_src, SUBSTITUTION_TAG_BITSIZE, 0, "consensus.SubstitutionTag" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_READ_FILTER ],
+ &filter, sizeof filter * 8, 1, "consensus.READ_FILTER" );
+ return rc;
+}
+
+
+static rc_t consensus_load_spot_bases( VCursor *cursor, BaseCalls_cmn *tab,
+ const uint32_t *col_idx, zmw_row * spot )
+{
+ rc_t rc = 0;
+ uint32_t column_idx, dummy_src;
+
+ /* we make a buffer to store NumEvent 8-bit-values
+ (that is so far the biggest value we have to read per DNA-BASE) */
+ char * buffer = malloc( spot->NumEvent );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+ PLOGERR( klogErr, ( klogErr, rc, "cannot allocate $(numbytes) to read seq-data",
+ "numbytes=%u", spot->NumEvent ) );
+ }
+ if ( rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ consensus_tab_READ ],
+ &tab->Basecall, buffer, spot->offset, spot->NumEvent,
+ BASECALL_BITSIZE, "consensus.Basecall" );
+ if ( rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ consensus_tab_QUALITY ],
+ &tab->QualityValue, buffer, spot->offset, spot->NumEvent,
+ QUALITY_VALUE_BITSIZE, "consensus.QualityValue" );
+
+ if ( rc == 0 )
+ {
+ column_idx = col_idx[ consensus_tab_INSERTION_QV ];
+ if ( tab->InsertionQV.extents != NULL )
+ rc = transfer_bits( cursor, column_idx,
+ &tab->InsertionQV, buffer, spot->offset, spot->NumEvent,
+ INSERTION_QV_BITSIZE, "consensus.InsertionQV" );
+ else
+ rc = vdb_write_value( cursor, column_idx,
+ &dummy_src, INSERTION_QV_BITSIZE, 0, "consensus.InsertionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ column_idx = col_idx[ consensus_tab_DELETION_QV ];
+ if ( tab->DeletionQV.extents != NULL )
+ rc = transfer_bits( cursor, column_idx,
+ &tab->DeletionQV, buffer, spot->offset, spot->NumEvent,
+ DELETION_QV_BITSIZE, "consensus.DeletionQV" );
+ else
+ rc = vdb_write_value( cursor, column_idx,
+ &dummy_src, DELETION_QV_BITSIZE, 0, "consensus.DeletionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ column_idx = col_idx[ consensus_tab_DELETION_TAG ];
+ if ( tab->DeletionTag.extents != NULL )
+ rc = transfer_bits( cursor, column_idx,
+ &tab->DeletionTag, buffer, spot->offset, spot->NumEvent,
+ DELETION_TAG_BITSIZE, "consensus.DeletionTag" );
+ else
+ rc = vdb_write_value( cursor, column_idx,
+ &dummy_src, DELETION_TAG_BITSIZE, 0, "consensus.DeletionTag" );
+ }
+
+ if ( rc == 0 )
+ {
+ column_idx = col_idx[ consensus_tab_SUBSTITUTION_QV ];
+ if ( tab->SubstitutionQV.extents != NULL )
+ rc = transfer_bits( cursor, column_idx,
+ &tab->SubstitutionQV, buffer, spot->offset, spot->NumEvent,
+ SUBSTITUTION_QV_BITZISE, "consensus.SubstitutionQV" );
+ else
+ rc = vdb_write_value( cursor, column_idx,
+ &dummy_src, SUBSTITUTION_QV_BITZISE, 0, "consensus.SubstitutionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ column_idx = col_idx[ consensus_tab_SUBSTITUTION_TAG ];
+ if ( tab->SubstitutionTag.extents != NULL )
+ rc = transfer_bits( cursor, column_idx,
+ &tab->SubstitutionTag, buffer, spot->offset, spot->NumEvent,
+ SUBSTITUTION_TAG_BITSIZE, "consensus.SubstitutionTag" );
+ else
+ rc = vdb_write_value( cursor, column_idx,
+ &dummy_src, SUBSTITUTION_TAG_BITSIZE, 0, "consensus.SubstitutionTag" );
+ }
+
+ if ( buffer != NULL )
+ free( buffer );
+ return rc;
+}
+
+
+static rc_t consensus_load_spot( VCursor *cursor, const uint32_t *col_idx,
+ region_type_mapping *mapping, zmw_row * spot,
+ void * data )
+{
+ rc_t rc = 0;
+ if ( spot->NumEvent > 0 )
+ {
+ BaseCalls_cmn *tab = (BaseCalls_cmn *)data;
+ rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot open consensus-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ consensus_tab_HOLE_NUMBER ],
+ spot->HoleNumber, "consensus.HOLE_NUMBER" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ consensus_tab_HOLE_STATUS ],
+ spot->HoleStatus, "consensus.HOLE_STATUS" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ consensus_tab_HOLE_XY ],
+ &spot->HoleXY, HOLE_XY_BITSIZE, 2, "consensus.HOLE_XY" );
+
+ /* has to be read ... from "PulseData/ConsensusBaesCalls/Passes/NumPasses" */
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ consensus_tab_NUM_PASSES ],
+ spot->NumPasses, "consensus.NUM_PASSES" );
+
+ if ( rc == 0 )
+ {
+ if ( spot->NumEvent > 0 )
+ rc = consensus_load_spot_bases( cursor, tab, col_idx, spot );
+ else
+ rc = consensus_load_zero_bases( cursor, col_idx );
+ }
+
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ consensus_tab_NREADS ],
+ 1, "consensus.NREADS" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ consensus_tab_READ_START ],
+ 0, "consensus.READ_START" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ consensus_tab_READ_LEN ],
+ spot->NumEvent, "consensus.READ_LEN" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ consensus_tab_READ_TYPE ],
+ SRA_READ_TYPE_BIOLOGICAL, "consensus.READ_TYPE" );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot commit consensus-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot close consensus-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+
+ }
+ }
+ return rc;
+}
+
+
+static rc_t consensus_loader( ld_context *lctx, KDirectory * hdf5_src, VCursor * cursor, const char * table_name )
+{
+ uint32_t col_idx[ consensus_tab_count ];
+ rc_t rc = add_columns( cursor, consensus_tab_count, -1, col_idx, consensus_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open cursor on consensus-table" );
+
+ else
+ {
+ BaseCalls_cmn ConsensusTab;
+ const INSDC_SRA_platform_id platform = SRA_PLATFORM_PACBIO_SMRT;
+
+ rc = VCursorDefault ( cursor, col_idx[ consensus_tab_PLATFORM ],
+ sizeof platform * 8, &platform, 0, 1 );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot set cursor-default on consensus-table for platform-column" );
+ else
+ {
+ const INSDC_SRA_read_filter filter = SRA_READ_FILTER_PASS;
+ rc = VCursorDefault ( cursor, col_idx[ consensus_tab_READ_FILTER ],
+ sizeof filter * 8, &filter, 0, 1 );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot set cursor-default on consensus-table for read-filter-column" );
+ }
+
+ if ( rc == 0 )
+ rc = open_BaseCalls_cmn( hdf5_src, &ConsensusTab, true,
+ "PulseData/ConsensusBaseCalls", lctx->cache_content, true );
+
+ if ( rc == 0 )
+ {
+ uint64_t total_bases = zmw_total( &ConsensusTab.zmw );
+ uint64_t total_spots = ConsensusTab.zmw.NumEvent.extents[ 0 ];
+
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading consensus-table ( $(bases) bases / $(spots) spots ):",
+ "bases=%lu,spots=%lu", total_bases, total_spots ));
+ KLogLevelSet( tmp_lvl );
+
+ if ( check_Consensus_totalcount( &ConsensusTab, total_bases ) )
+ {
+ rc = zmw_for_each( &ConsensusTab.zmw, &lctx->xml_progress, cursor,
+ lctx->with_progress, col_idx, NULL,
+ true, consensus_load_spot, &ConsensusTab );
+ }
+ else
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ }
+ close_BaseCalls_cmn( &ConsensusTab );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* HDF5-Groups and tables used to load the CONSENSUS-table */
+static const char * consensus_groups_to_check[] =
+{
+ "PulseData",
+ "PulseData/ConsensusBaseCalls",
+ "PulseData/ConsensusBaseCalls/ZMW",
+ "PulseData/ConsensusBaseCalls/Passes",
+ NULL
+};
+
+
+static const char * consensus_tables_to_check[] =
+{
+ "PulseData/ConsensusBaseCalls/Basecall",
+ "PulseData/ConsensusBaseCalls/DeletionQV",
+ "PulseData/ConsensusBaseCalls/DeletionTag",
+ "PulseData/ConsensusBaseCalls/InsertionQV",
+ "PulseData/ConsensusBaseCalls/QualityValue",
+ "PulseData/ConsensusBaseCalls/SubstitutionQV",
+ "PulseData/ConsensusBaseCalls/SubstitutionTag",
+ "PulseData/ConsensusBaseCalls/ZMW/HoleNumber",
+ "PulseData/ConsensusBaseCalls/ZMW/HoleStatus",
+ "PulseData/ConsensusBaseCalls/ZMW/HoleXY",
+ "PulseData/ConsensusBaseCalls/ZMW/NumEvent",
+ "PulseData/ConsensusBaseCalls/Passes/NumPasses",
+ NULL
+};
+
+
+static const char * consensus_schema_template = "CONSENSUS";
+static const char * consensus_table_to_create = "CONSENSUS";
+
+
+rc_t prepare_consensus( VDatabase * database, con_ctx * sctx, ld_context *lctx )
+{
+ rc_t rc = prepare_table( database, &sctx->cursor,
+ consensus_schema_template, consensus_table_to_create ); /* pl-tools.c ... this creates the cursor */
+ if ( rc == 0 )
+ {
+ rc = add_columns( sctx->cursor, consensus_tab_count, -1, sctx->col_idx, consensus_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( sctx->cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot open cursor on consensus-table" );
+ }
+ else
+ {
+ const INSDC_SRA_platform_id platform = SRA_PLATFORM_PACBIO_SMRT;
+
+ rc = VCursorDefault ( sctx->cursor, sctx->col_idx[ consensus_tab_PLATFORM ],
+ sizeof platform * 8, &platform, 0, 1 );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot set cursor-default on consensus-table for platform-column" );
+ }
+ else
+ {
+ const INSDC_SRA_read_filter filter = SRA_READ_FILTER_PASS;
+ rc = VCursorDefault ( sctx->cursor, sctx->col_idx[ consensus_tab_READ_FILTER ],
+ sizeof filter * 8, &filter, 0, 1 );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot set cursor-default on consensus-table for read-filter-column" );
+ }
+ else
+ {
+ sctx->lctx = lctx;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t load_consensus_src( con_ctx * sctx, KDirectory * hdf5_src )
+{
+ BaseCalls_cmn ConsensusTab;
+
+ rc_t rc = 0;
+ if ( sctx->lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, consensus_groups_to_check,
+ consensus_tables_to_check, false );
+ if ( rc == 0 )
+ rc = open_BaseCalls_cmn( hdf5_src, &ConsensusTab, true,
+ "PulseData/ConsensusBaseCalls", sctx->lctx->cache_content, true );
+ if ( rc == 0 )
+ {
+ uint64_t total_bases = zmw_total( &ConsensusTab.zmw );
+ uint64_t total_spots = ConsensusTab.zmw.NumEvent.extents[ 0 ];
+
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading consensus-table ( $(bases) bases / $(spots) spots ):",
+ "bases=%lu,spots=%lu", total_bases, total_spots ));
+ KLogLevelSet( tmp_lvl );
+
+ if ( !check_Consensus_totalcount( &ConsensusTab, total_bases ) )
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ else
+ rc = zmw_for_each( &ConsensusTab.zmw, &sctx->lctx->xml_progress, sctx->cursor,
+ sctx->lctx->with_progress, sctx->col_idx, NULL,
+ true, consensus_load_spot, &ConsensusTab );
+ close_BaseCalls_cmn( &ConsensusTab );
+ }
+ return rc;
+}
+
+
+rc_t finish_consensus( con_ctx * sctx )
+{
+ VCursorRelease( sctx->cursor );
+ return 0;
+}
+
+
+rc_t load_consensus( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx )
+{
+ rc_t rc = 0;
+ if ( lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, consensus_groups_to_check,
+ consensus_tables_to_check, false );
+ if ( rc == 0 )
+ rc = load_table( database, hdf5_src, lctx, consensus_schema_template,
+ consensus_table_to_create, consensus_loader );
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-consensus.h b/tools/pacbio-load/pl-consensus.h
new file mode 100644
index 0000000..5b38745
--- /dev/null
+++ b/tools/pacbio-load/pl-consensus.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_consensus_
+#define _h_pl_consensus_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-zmw.h"
+#include "pl-basecalls_cmn.h"
+#include <klib/rc.h>
+#include <insdc/sra.h>
+
+/* enumeration of the columns of the consensus-table */
+enum
+{
+ /* base-space */
+ consensus_tab_READ = 0,
+ consensus_tab_QUALITY,
+ consensus_tab_NREADS,
+ consensus_tab_READ_TYPE,
+ consensus_tab_READ_START,
+ consensus_tab_READ_LEN,
+ consensus_tab_PLATFORM,
+ consensus_tab_READ_FILTER,
+
+ /* consensus-space */
+ consensus_tab_HOLE_NUMBER,
+ consensus_tab_HOLE_STATUS,
+ consensus_tab_HOLE_XY,
+ consensus_tab_NUM_PASSES,
+ consensus_tab_INSERTION_QV,
+ consensus_tab_DELETION_QV,
+ consensus_tab_DELETION_TAG,
+ consensus_tab_SUBSTITUTION_QV,
+ consensus_tab_SUBSTITUTION_TAG,
+ consensus_tab_count
+};
+
+
+typedef struct con_ctx
+{
+ VCursor * cursor;
+ ld_context *lctx;
+ uint32_t col_idx[ consensus_tab_count ];
+} con_ctx;
+
+rc_t prepare_consensus( VDatabase * database, con_ctx * sctx, ld_context *lctx );
+rc_t load_consensus_src( con_ctx * sctx, KDirectory * hdf5_src );
+rc_t finish_consensus( con_ctx * sctx );
+
+rc_t load_consensus( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-context.c b/tools/pacbio-load/pl-context.c
new file mode 100644
index 0000000..431b909
--- /dev/null
+++ b/tools/pacbio-load/pl-context.c
@@ -0,0 +1,211 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-context.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+static char * ctx_set_str( const char *src, const char *dflt )
+{
+ char * res = NULL;
+ if ( src != NULL && src[0] != 0 )
+ res = string_dup_measure ( src, NULL );
+ else if ( dflt != NULL && dflt[0] != 0 )
+ res = string_dup_measure ( dflt, NULL );
+ return res;
+}
+
+
+static rc_t ctx_get_params( const Args * args, context *ctx )
+{
+ uint32_t idx, count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "ArgsParamCount failed" );
+ else
+ {
+ if ( count < 1 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ LOGERR( klogErr, rc, "hdf5-source-file missing" );
+ Usage ( args );
+ }
+ else for ( idx = 0; idx < count; ++idx )
+ {
+ const char *parameter = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)¶meter );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "error reading commandline-parameter" );
+ else
+ rc = VNamelistAppend ( ctx->src_paths, parameter );
+ }
+ }
+ return rc;
+}
+
+
+static bool ctx_get_bool( const Args *args, const char *name, const bool def )
+{
+ uint32_t count = 0;
+ if ( ArgsOptionCount( args, name, &count ) == 0 )
+ return ( count > 0 );
+ else
+ return def;
+}
+
+
+static const char* ctx_get_str( const Args *args, const char *name, const char *def )
+{
+ const char * res = def;
+ uint32_t count = 0;
+ if ( ArgsOptionCount( args, name, &count ) == 0 && count > 0 )
+ {
+ if ( ArgsOptionValue( args, name, 0, (const void **)&res ) != 0 )
+ res = def;
+ }
+ return res;
+}
+
+
+void ctx_free( context *ctx )
+{
+ if ( ctx->dst_path != NULL )
+ free( ctx->dst_path );
+ if ( ctx->schema_name != NULL )
+ free( ctx->schema_name );
+ if ( ctx->tabs != NULL )
+ free( ctx->tabs );
+ VNamelistRelease ( ctx->src_paths );
+}
+
+
+rc_t ctx_init( const Args * args, context *ctx )
+{
+ rc_t rc;
+
+ ctx->dst_path = NULL;
+ ctx->schema_name = NULL;
+ ctx->tabs = NULL;
+ ctx->force = false;
+ ctx->with_progress = false;
+
+ rc = VNamelistMake ( &ctx->src_paths, 5 );
+ if ( rc == 0 )
+ {
+ rc = ctx_get_params( args, ctx );
+ if ( rc == 0 )
+ {
+ ctx->force = ctx_get_bool( args, OPTION_FORCE, false );
+ ctx->with_progress = ctx_get_bool( args, OPTION_WITH_PROGRESS, false );
+ ctx->schema_name = ctx_set_str( ctx_get_str( args, OPTION_SCHEMA, DFLT_SCHEMA ), DFLT_SCHEMA );
+ ctx->dst_path = ctx_set_str( ctx_get_str( args, OPTION_OUTPUT, NULL ), NULL );
+ ctx->tabs = ctx_set_str( ctx_get_str( args, OPTION_TABS, NULL ), NULL );
+ }
+ if ( rc == 0 )
+ {
+ if ( ctx->dst_path == NULL )
+ {
+ rc = RC( rcExe, rcArgv, rcReading, rcParam, rcInvalid );
+ LOGMSG( klogErr, "vdb-output-directory missing!" );
+ }
+ }
+ }
+ if ( rc != 0 )
+ ctx_free( ctx );
+ return rc;
+}
+
+
+rc_t ctx_show( context * ctx )
+{
+ rc_t rc;
+ uint32_t idx, count;
+
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+
+ LOGMSG( klogInfo, "pacbio-load:" );
+
+ rc = VNameListCount ( ctx->src_paths, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * name = NULL;
+ rc = VNameListGet ( ctx->src_paths, idx, &name );
+ if ( rc == 0 && name != NULL )
+ PLOGMSG( klogInfo, ( klogInfo, " from : '$(SRC)'", "SRC=%s", name ));
+ }
+ }
+
+ PLOGMSG( klogInfo, ( klogInfo, " into : '$(SRC)'", "SRC=%s", ctx->dst_path ));
+ PLOGMSG( klogInfo, ( klogInfo, " schema : '$(SRC)'", "SRC=%s", ctx->schema_name ));
+ if ( ctx->force )
+ LOGMSG( klogInfo, " force : 'yes'" );
+ else
+ LOGMSG( klogInfo, " force : 'no'" );
+ if ( ctx->tabs != NULL )
+ PLOGMSG( klogInfo, ( klogInfo, " tabs : '$(SRC)'", "SRC=%s", ctx->tabs ));
+
+ KLogLevelSet( tmp_lvl );
+ return rc;
+}
+
+
+static bool ctx_ld_module( context * ctx, const char c )
+{
+ if ( ctx->tabs == NULL )
+ return true;
+ else
+ return ( strchr( ctx->tabs, c ) != NULL );
+}
+
+
+bool ctx_ld_sequence( context * ctx )
+{
+ return ctx_ld_module( ctx, 'S' );
+}
+
+
+bool ctx_ld_consensus( context * ctx )
+{
+ return ctx_ld_module( ctx, 'C' );
+}
+
+
+bool ctx_ld_passes( context * ctx )
+{
+ return ctx_ld_module( ctx, 'P' );
+}
+
+
+bool ctx_ld_metrics( context * ctx )
+{
+ return ctx_ld_module( ctx, 'M' );
+}
diff --git a/tools/pacbio-load/pl-context.h b/tools/pacbio-load/pl-context.h
new file mode 100644
index 0000000..abca8de
--- /dev/null
+++ b/tools/pacbio-load/pl-context.h
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pl_context_
+#define _h_pl_context_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/namelist.h>
+
+#include <kapp/args.h>
+
+
+#define OPTION_SCHEMA "schema"
+#define OPTION_FORCE "force"
+#define OPTION_TABS "tabs"
+#define OPTION_WITH_PROGRESS "with_progressbar"
+#define OPTION_OUTPUT "output"
+
+#define ALIAS_SCHEMA "S"
+#define ALIAS_FORCE "f"
+#define ALIAS_TABS "t"
+#define ALIAS_WITH_PROGRESS "p"
+#define ALIAS_OUTPUT "o"
+
+#define DFLT_SCHEMA "sra/pacbio.vschema"
+#define PACBIO_SCHEMA_DB "NCBI:SRA:PacBio:smrt:db"
+
+
+/* *******************************************************************
+the parameter-context contains all informations needed to load
+******************************************************************* */
+typedef struct context
+{
+ char *dst_path; /* the vdb-database-path to create */
+ char *schema_name; /* name of a schema-file to use", if different from std */
+ char *tabs; /* load only these tabs... */
+ VNamelist * src_paths; /* list of source-paths */
+ bool force; /* if true", overwrite eventually existing output-db */
+ bool with_progress; /* if true", use the pl_progressbar */
+} context;
+
+
+rc_t ctx_init( const Args * args, context *ctx );
+void ctx_free( context *ctx );
+
+rc_t ctx_show( context * ctx );
+bool ctx_ld_sequence( context * ctx );
+bool ctx_ld_consensus( context * ctx );
+bool ctx_ld_passes( context * ctx );
+bool ctx_ld_metrics( context * ctx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-metrics.c b/tools/pacbio-load/pl-metrics.c
new file mode 100644
index 0000000..30d70ac
--- /dev/null
+++ b/tools/pacbio-load/pl-metrics.c
@@ -0,0 +1,779 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-metrics.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+const char * metrics_tab_names[] =
+{
+ "BASE_FRACTION",
+ "BASE_IPD",
+ "BASE_RATE",
+ "BASE_WIDTH",
+ "CHAN_BASE_QV",
+ "CHAN_DEL_QV",
+ "CHAN_INS_QV",
+ "CHAN_SUB_QV",
+ "LOCAL_BASE_RATE",
+ "DARK_BASE_RATE",
+ "HQ_RGN_START_TIME",
+ "HQ_RGN_END_TIME",
+ "HQ_RGN_SNR",
+ "PRODUCTIVITY",
+ "READ_SCORE",
+ "READ_BASE_QV",
+ "READ_DEL_QV",
+ "READ_INS_QV",
+ "READ_SUB_QV"
+};
+
+
+typedef struct Metrics_src
+{
+ af_data BaseFraction;
+ af_data BaseIpd;
+ af_data BaseRate;
+ af_data BaseWidth;
+ af_data CmBasQV;
+ af_data CmDelQV;
+ af_data CmInsQV;
+ af_data CmSubQV;
+ af_data LocalBaseRate;
+ af_data DarkBaseRate;
+ af_data HQRegionStartTime;
+ af_data HQRegionEndTime;
+ af_data HQRegionSNR;
+ af_data Productivity;
+ af_data ReadScore;
+ af_data RmBasQV;
+ af_data RmDelQV;
+ af_data RmInsQV;
+ af_data RmSubQV;
+} Metrics_src;
+
+
+static void init_Metrics_src( Metrics_src *tab )
+{
+ init_array_file( &tab->BaseFraction );
+ init_array_file( &tab->BaseIpd );
+ init_array_file( &tab->BaseRate );
+ init_array_file( &tab->BaseWidth );
+ init_array_file( &tab->CmBasQV );
+ init_array_file( &tab->CmDelQV );
+ init_array_file( &tab->CmInsQV );
+ init_array_file( &tab->CmSubQV );
+ init_array_file( &tab->LocalBaseRate );
+ init_array_file( &tab->DarkBaseRate );
+ init_array_file( &tab->HQRegionStartTime );
+ init_array_file( &tab->HQRegionEndTime );
+ init_array_file( &tab->HQRegionSNR );
+ init_array_file( &tab->Productivity );
+ init_array_file( &tab->ReadScore );
+ init_array_file( &tab->RmBasQV );
+ init_array_file( &tab->RmDelQV );
+ init_array_file( &tab->RmInsQV );
+ init_array_file( &tab->RmSubQV );
+}
+
+
+static void close_Metrics_src( Metrics_src *tab )
+{
+ free_array_file( &tab->BaseFraction );
+ free_array_file( &tab->BaseIpd );
+ free_array_file( &tab->BaseRate );
+ free_array_file( &tab->BaseWidth );
+ free_array_file( &tab->CmBasQV );
+ free_array_file( &tab->CmDelQV );
+ free_array_file( &tab->CmInsQV );
+ free_array_file( &tab->CmSubQV );
+ free_array_file( &tab->LocalBaseRate );
+ free_array_file( &tab->DarkBaseRate );
+ free_array_file( &tab->HQRegionStartTime );
+ free_array_file( &tab->HQRegionEndTime );
+ free_array_file( &tab->HQRegionSNR );
+ free_array_file( &tab->Productivity );
+ free_array_file( &tab->ReadScore );
+ free_array_file( &tab->RmBasQV );
+ free_array_file( &tab->RmDelQV );
+ free_array_file( &tab->RmInsQV );
+ free_array_file( &tab->RmSubQV );
+}
+
+
+static rc_t open_Metrics_src( const KDirectory *hdf5_dir, Metrics_src *tab,
+ const char * path, bool cache_content )
+{
+ rc_t rc, rc_none;
+ init_Metrics_src( tab );
+
+ rc = open_element( hdf5_dir, &tab->BaseFraction, path, "BaseFraction",
+ BASE_FRACTION_BITSIZE, BASE_FRACTION_COLS,
+ true, cache_content, false );
+
+ /* it is ok if BaseIpd is missing !!! */
+ if ( rc == 0 )
+ {
+ rc_none = open_element( hdf5_dir, &tab->BaseIpd, path, "BaseIpd",
+ BASE_IPD_BITSIZE, BASE_IPD_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> BaseIpd is missing" );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->BaseRate, path, "BaseRate",
+ BASE_RATE_BITSIZE, BASE_RATE_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->BaseWidth, path, "BaseWidth",
+ BASE_WIDTH_BITSIZE, BASE_WIDTH_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->CmBasQV, path, "CmBasQv",
+ CM_BAS_QV_BITSIZE, CM_BAS_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->CmDelQV, path, "CmDelQv",
+ CM_DEL_QV_BITSIZE, CM_DEL_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->CmInsQV, path, "CmInsQv",
+ CM_INS_QV_BITSIZE, CM_INS_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->CmSubQV, path, "CmSubQv",
+ CM_SUB_QV_BITSIZE, CM_SUB_QV_COLS,
+ true, cache_content, false );
+
+ if ( rc == 0 )
+ {
+ /* it is ok if LocalBaseRate is missing !!! */
+ rc_none = open_element( hdf5_dir, &tab->LocalBaseRate, path, "LocalBaseRate",
+ LOCAL_BASE_RATE_BITSIZE, LOCAL_BASE_RATE_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> LocalBaseRate is missing" );
+ }
+
+ /* it is ok if DarkBaseRate is missing !!! */
+ rc_none = open_element( hdf5_dir, &tab->DarkBaseRate, path, "DarkBaseRate",
+ DARK_BASE_RATE_BITSIZE, DARK_BASE_RATE_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> DarkBaseRate is missing" );
+ }
+
+ /* it is ok if HQRegionStartTime is missing !!! */
+ rc_none = open_element( hdf5_dir, &tab->HQRegionStartTime, path, "HQRegionStartTime",
+ HQ_REGION_START_TIME_BITSIZE, HQ_REGION_START_TIME_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> HQRegionStartTime is missing" );
+ }
+
+ /* it is ok if HQRegionEndTime is missing !!! */
+ rc_none = open_element( hdf5_dir, &tab->HQRegionEndTime, path, "HQRegionEndTime",
+ HQ_REGION_END_TIME_BITSIZE, HQ_REGION_END_TIME_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> HQRegionEndTime is missing" );
+ }
+
+ /* it is ok of HQRegionSNR is missing !!! ( discovered 12/16/2011 )*/
+ rc_none = open_element( hdf5_dir, &tab->HQRegionSNR, path, "HQRegionSNR",
+ HQ_REGION_SNR_BITSIZE, HQ_REGION_SNR_COLS,
+ true, cache_content, true );
+ if ( rc_none != 0 )
+ {
+ print_log_info( "metrics -> HQRegionSNR is missing" );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->Productivity, path, "Productivity",
+ PRODUCTIVITY_BITSIZE, PRODUCTIVITY_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->ReadScore, path, "ReadScore",
+ READ_SCORE_BITSIZE, READ_SCORE_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->RmBasQV, path, "RmBasQv",
+ RM_BAS_QV_BITSIZE, RM_BAS_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->RmDelQV, path, "RmDelQv",
+ RM_DEL_QV_BITSIZE, RM_DEL_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->RmInsQV, path, "RmInsQv",
+ RM_INS_QV_BITSIZE, RM_INS_QV_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->RmSubQV, path, "RmSubQv",
+ RM_SUB_QV_BITSIZE, RM_SUB_QV_COLS,
+ true, cache_content, false );
+ if ( rc != 0 )
+ close_Metrics_src( tab );
+ return rc;
+}
+
+
+static bool check_Metrics_ext( af_data *af, bool *needed, uint64_t *expected,
+ const char * s )
+{
+ bool res = true;
+
+ if ( *needed )
+ {
+ *expected = af->extents[ 0 ];
+ *needed = false;
+ }
+ else
+ res = check_table_count( af, s, *expected );
+ return res;
+}
+
+static bool check_Metrics_extents( Metrics_src *tab )
+{
+ bool res = true;
+ bool needed = true;
+ uint64_t expected = 0;
+
+ if ( tab->BaseFraction.rc == 0 && res )
+ res = check_Metrics_ext( &tab->BaseFraction, &needed, &expected, "BaseFraction" );
+
+ if ( tab->BaseIpd.rc == 0 && res )
+ res = check_Metrics_ext( &tab->BaseIpd, &needed, &expected, "BaseIpd" );
+
+ if ( tab->BaseRate.rc == 0 && res )
+ res = check_Metrics_ext( &tab->BaseRate, &needed, &expected, "BaseRate" );
+
+ if ( tab->BaseWidth.rc == 0 && res )
+ res = check_Metrics_ext( &tab->BaseWidth, &needed, &expected, "BaseWidth" );
+
+ if ( tab->CmBasQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->CmBasQV, &needed, &expected, "CmBasQV" );
+
+ if ( tab->CmDelQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->CmDelQV, &needed, &expected, "CmDelQV" );
+
+ if ( tab->CmInsQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->CmInsQV, &needed, &expected, "CmInsQV" );
+
+ if ( tab->CmSubQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->CmSubQV, &needed, &expected, "CmSubQV" );
+
+ if ( tab->LocalBaseRate.rc == 0 && res )
+ res = check_Metrics_ext( &tab->LocalBaseRate, &needed, &expected, "LocalBaseRate" );
+
+ if ( tab->DarkBaseRate.rc == 0 && res )
+ res = check_Metrics_ext( &tab->DarkBaseRate, &needed, &expected, "DarkBaseRate" );
+
+ if ( tab->HQRegionStartTime.rc == 0 && res )
+ res = check_Metrics_ext( &tab->HQRegionStartTime, &needed, &expected, "HQRegionStartTime" );
+
+ if ( tab->HQRegionEndTime.rc == 0 && res )
+ res = check_Metrics_ext( &tab->HQRegionEndTime, &needed, &expected, "HQRegionEndTime" );
+
+ if ( tab->HQRegionSNR.rc == 0 && res )
+ res = check_Metrics_ext( &tab->HQRegionSNR, &needed, &expected, "HQRegionSNR" );
+
+ if ( tab->Productivity.rc == 0 && res )
+ res = check_Metrics_ext( &tab->Productivity, &needed, &expected, "Productivity" );
+
+ if ( tab->ReadScore.rc == 0 && res )
+ res = check_Metrics_ext( &tab->ReadScore, &needed, &expected, "ReadScore" );
+
+ if ( tab->RmBasQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->RmBasQV, &needed, &expected, "RmBasQV" );
+
+ if ( tab->RmDelQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->RmDelQV, &needed, &expected, "RmDelQV" );
+
+ if ( tab->RmInsQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->RmInsQV, &needed, &expected, "RmInsQV" );
+
+ if ( tab->RmSubQV.rc == 0 && res )
+ res = check_Metrics_ext( &tab->RmSubQV, &needed, &expected, "RmSubQV" );
+
+ return res;
+}
+
+
+#define METRICS_BLOCK_SIZE 1024
+
+typedef struct metrics_block
+{
+ float BaseFraction[ METRICS_BLOCK_SIZE ][4];
+ float BaseIpd[ METRICS_BLOCK_SIZE ];
+ float BaseRate[ METRICS_BLOCK_SIZE ];
+ float BaseWidth[ METRICS_BLOCK_SIZE ];
+ float CmBasQV[ METRICS_BLOCK_SIZE ][4];
+ float CmDelQV[ METRICS_BLOCK_SIZE ][4];
+ float CmInsQV[ METRICS_BLOCK_SIZE ][4];
+ float CmSubQV[ METRICS_BLOCK_SIZE ][4];
+ float LocalBaseRate[ METRICS_BLOCK_SIZE ];
+ float DarkBaseRate[ METRICS_BLOCK_SIZE ];
+ float HQRegionStartTime[ METRICS_BLOCK_SIZE ];
+ float HQRegionEndTime[ METRICS_BLOCK_SIZE ];
+ float HQRegionSNR[ METRICS_BLOCK_SIZE ][4];
+ uint8_t Productivity[ METRICS_BLOCK_SIZE ];
+ float ReadScore[ METRICS_BLOCK_SIZE ];
+ float RmBasQV[ METRICS_BLOCK_SIZE ];
+ float RmDelQV[ METRICS_BLOCK_SIZE ];
+ float RmInsQV[ METRICS_BLOCK_SIZE ];
+ float RmSubQV[ METRICS_BLOCK_SIZE ];
+ uint64_t n_read;
+} metrics_block;
+
+
+
+static rc_t metrics_block_read_from_src( Metrics_src *tab,
+ const uint64_t total_rows,
+ const uint64_t pos,
+ metrics_block * block )
+{
+ rc_t rc = 0 ;
+ uint64_t to_read = METRICS_BLOCK_SIZE;
+ uint64_t read;
+
+ block->n_read = 0;
+ if ( ( pos + to_read ) >= total_rows )
+ to_read = ( total_rows - pos );
+
+ if ( tab->BaseFraction.rc == 0 )
+ rc = array_file_read_dim2( &tab->BaseFraction, pos,
+ &block->BaseFraction[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->BaseFraction[0][0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->BaseIpd.rc == 0 )
+ rc = array_file_read_dim1( &tab->BaseIpd, pos,
+ &block->BaseIpd[0],
+ to_read, &read );
+ else
+ memset( &block->BaseIpd[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->BaseRate.rc == 0 )
+ rc = array_file_read_dim1( &tab->BaseRate, pos,
+ &block->BaseRate[0],
+ to_read, &read );
+ else
+ memset( &block->BaseRate[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->BaseWidth.rc == 0 )
+ rc = array_file_read_dim1( &tab->BaseWidth, pos,
+ &block->BaseWidth[0],
+ to_read, &read );
+ else
+ memset( &block->BaseWidth[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->CmBasQV.rc == 0 )
+ rc = array_file_read_dim2( &tab->CmBasQV, pos,
+ &block->CmBasQV[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->CmBasQV[0][0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->CmDelQV.rc == 0 )
+ rc = array_file_read_dim2( &tab->CmDelQV, pos,
+ &block->CmDelQV[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->CmDelQV[0][0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->CmInsQV.rc == 0 )
+ rc = array_file_read_dim2( &tab->CmInsQV, pos,
+ &block->CmInsQV[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->CmInsQV[0][0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->CmSubQV.rc == 0 )
+ rc = array_file_read_dim2( &tab->CmSubQV, pos,
+ &block->CmSubQV[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->CmSubQV[0][0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->LocalBaseRate.rc == 0 )
+ rc = array_file_read_dim1( &tab->LocalBaseRate, pos,
+ &block->LocalBaseRate[0],
+ to_read, &read );
+ else
+ memset( &block->LocalBaseRate[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->DarkBaseRate.rc == 0 )
+ rc = array_file_read_dim1( &tab->DarkBaseRate, pos,
+ &block->DarkBaseRate[0],
+ to_read, &read );
+ else
+ memset( &block->DarkBaseRate[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->HQRegionStartTime.rc == 0 )
+ rc = array_file_read_dim1( &tab->HQRegionStartTime, pos,
+ &block->HQRegionStartTime[0],
+ to_read, &read );
+ else
+ memset( &block->HQRegionStartTime[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->HQRegionEndTime.rc == 0 )
+ rc = array_file_read_dim1( &tab->HQRegionEndTime, pos,
+ &block->HQRegionEndTime[0],
+ to_read, &read );
+ else
+ memset( &block->HQRegionEndTime[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->HQRegionSNR.rc == 0 )
+ rc = array_file_read_dim2( &tab->HQRegionSNR, pos,
+ &block->HQRegionSNR[0][0],
+ to_read, 4, &read );
+ else
+ memset( &block->HQRegionSNR[0], 0, to_read * 4 * sizeof( float ) );
+
+ if ( rc == 0 && tab->Productivity.rc == 0 )
+ rc = array_file_read_dim1( &tab->Productivity, pos,
+ &block->Productivity[0],
+ to_read, &read );
+ else
+ memset( &block->Productivity[0], 0, to_read * sizeof( uint8_t ) );
+
+ if ( rc == 0 && tab->ReadScore.rc == 0 )
+ rc = array_file_read_dim1( &tab->ReadScore, pos,
+ &block->ReadScore[0],
+ to_read, &read );
+ else
+ memset( &block->ReadScore[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->RmBasQV.rc == 0 )
+ rc = array_file_read_dim1( &tab->RmBasQV, pos,
+ &block->RmBasQV[0],
+ to_read, &read );
+ else
+ memset( &block->RmBasQV[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->RmDelQV.rc == 0 )
+ rc = array_file_read_dim1( &tab->RmDelQV, pos,
+ &block->RmDelQV[0],
+ to_read, &read );
+ else
+ memset( &block->RmDelQV[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->RmInsQV.rc == 0 )
+ rc = array_file_read_dim1( &tab->RmInsQV, pos,
+ &block->RmInsQV[0],
+ to_read, &read );
+ else
+ memset( &block->RmInsQV[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 && tab->RmSubQV.rc == 0 )
+ rc = array_file_read_dim1( &tab->RmSubQV, pos,
+ &block->RmSubQV[0],
+ to_read, &read );
+ else
+ memset( &block->RmSubQV[0], 0, to_read * sizeof( float ) );
+
+ if ( rc == 0 )
+ block->n_read = read;
+ return rc;
+}
+
+
+static rc_t metrics_load( VCursor *cursor, metrics_block *block,
+ const uint32_t idx, uint32_t *col_idx )
+{
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open metrics-row" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_BASE_FRACTION ],
+ &block->BaseFraction[idx][0], 32, 4,
+ "metrics.BaseFraction" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_BASE_IPD ],
+ block->BaseIpd[idx], "metrics.BaseIpd" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_BASE_RATE ],
+ block->BaseRate[idx], "metrics.BaseRate" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_BASE_WIDTH ],
+ block->BaseWidth[idx], "metrics.BaseWidth" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_CHAN_BASE_QV ],
+ &block->CmBasQV[idx][0], CM_BAS_QV_BITSIZE, 4,
+ "metrics.CmBasQv" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_CHAN_DEL_QV ],
+ &block->CmDelQV[idx][0], CM_DEL_QV_BITSIZE, 4,
+ "metrics.CmDelQv" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_CHAN_INS_QV ],
+ &block->CmInsQV[idx][0], CM_INS_QV_BITSIZE, 4,
+ "metrics.CmInsQv" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_CHAN_SUB_QV ],
+ &block->CmSubQV[idx][0], CM_SUB_QV_BITSIZE, 4,
+ "metrics.CmSubQv" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_LOCAL_BASE_RATE ],
+ block->LocalBaseRate[idx],
+ "metrics.LocalBaseRate" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_DARK_BASE_RATE ],
+ block->DarkBaseRate[idx],
+ "metrics.DarkBaseRate" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_HQ_RGN_START_TIME ],
+ block->HQRegionStartTime[idx],
+ "metrics.HQRegionStartTime" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_HQ_RGN_END_TIME ],
+ block->HQRegionEndTime[idx],
+ "metrics.HQRegionEndTime" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ metrics_tab_HQ_RGN_SNR ],
+ &block->HQRegionSNR[idx][0], HQ_REGION_SNR_BITSIZE, 4,
+ "metrics.HQRegionSNR" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ metrics_tab_PRODUCTIVITY ],
+ block->Productivity[idx],
+ "metrics.Productivity" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_READ_SCORE ],
+ block->ReadScore[idx],
+ "metrics.ReadScore" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_READ_BASE_QV ],
+ block->RmBasQV[idx],
+ "metrics.RmBasQV" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_READ_DEL_QV ],
+ block->RmDelQV[idx],
+ "metrics.RmDelQV" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_READ_INS_QV ],
+ block->RmInsQV[idx],
+ "metrics.RmInsQV" );
+ if ( rc == 0 )
+ rc = vdb_write_float32( cursor, col_idx[ metrics_tab_READ_SUB_QV ],
+ block->RmSubQV[idx],
+ "metrics.RmSubQV" );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot commit metrics-row" );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot close metrics-row" );
+ }
+
+ return rc;
+}
+
+
+static rc_t metrics_load_loop( ld_context *lctx, VCursor * cursor, Metrics_src *tab,
+ uint32_t *col_idx )
+{
+ rc_t rc = 0;
+ KLogLevel tmp_lvl;
+ metrics_block block;
+ pl_progress *progress;
+ uint64_t pos = 0;
+ uint64_t total_rows = tab->BaseFraction.extents[0];
+
+ pl_progress_make( &progress, total_rows );
+ rc = progress_chunk( &lctx->xml_progress, total_rows );
+
+ tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading metrics-table ( $(rows) rows ) :",
+ "rows=%lu", total_rows ));
+ KLogLevelSet( tmp_lvl );
+
+ while( pos < total_rows && rc == 0 )
+ {
+ rc = metrics_block_read_from_src( tab, total_rows, pos, &block );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < block.n_read && rc == 0; ++i )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ /* to be replaced with progressbar action... */
+ rc = metrics_load( cursor, &block, i, col_idx );
+ if ( rc == 0 )
+ {
+ rc = progress_step( lctx->xml_progress );
+ if ( lctx->with_progress )
+ pl_progress_increment( progress, 1 );
+ }
+ }
+ else
+ LOGERR( klogErr, rc, "...loading metrics interrupted" );
+ }
+ pos += block.n_read;
+ }
+ }
+
+ pl_progress_destroy( progress );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommit( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot commit cursor on metrics-tab" );
+ }
+ return rc;
+}
+
+
+static rc_t metrics_loader( ld_context *lctx, KDirectory * hdf5_src, VCursor * cursor, const char * table_name )
+{
+ uint32_t col_idx[ metrics_tab_count ];
+ rc_t rc = add_columns( cursor, metrics_tab_count, -1, col_idx, metrics_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open cursor on metrics-tab" );
+ else
+ {
+ Metrics_src Metrics;
+ rc = open_Metrics_src( hdf5_src, &Metrics,
+ "PulseData/BaseCalls/ZMWMetrics",
+ lctx->cache_content );
+ if ( rc == 0 )
+ {
+ if ( check_Metrics_extents( &Metrics ) )
+ rc = metrics_load_loop( lctx, cursor, &Metrics, col_idx );
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ close_Metrics_src( &Metrics );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* HDF5-Groups and tables used to load the METRICS-table */
+static const char * metrics_groups_to_check[] =
+{
+ "PulseData/BaseCalls/ZMWMetrics",
+ NULL
+};
+
+
+static const char * metrics_schema_template = "ZMW_METRICS";
+static const char * metrics_table_to_create = "ZMW_METRICS";
+
+rc_t prepare_metrics( VDatabase * database, met_ctx * sctx, ld_context *lctx )
+{
+ rc_t rc = prepare_table( database, &sctx->cursor,
+ metrics_schema_template, metrics_table_to_create ); /* pl-tools.c ... this creates the cursor */
+ if ( rc == 0 )
+ rc = add_columns( sctx->cursor, metrics_tab_count, -1, sctx->col_idx, metrics_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( sctx->cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot open cursor on metrics-tab" );
+ }
+ else
+ {
+ sctx->lctx = lctx;
+ }
+ }
+ return rc;
+}
+
+
+rc_t load_metrics_src( met_ctx * sctx, KDirectory * hdf5_src )
+{
+ Metrics_src Metrics;
+ rc_t rc = 0;
+
+ if ( sctx->lctx->check_src_obj )
+ /* in case of metrics any combination of columns can be missing... */
+ rc = check_src_objects( hdf5_src, metrics_groups_to_check, NULL, false );
+
+ if ( rc == 0 )
+ rc = open_Metrics_src( hdf5_src, &Metrics, "PulseData/BaseCalls/ZMWMetrics",
+ sctx->lctx->cache_content );
+ if ( rc == 0 )
+ {
+ if ( check_Metrics_extents( &Metrics ) )
+ rc = metrics_load_loop( sctx->lctx, sctx->cursor, &Metrics, sctx->col_idx );
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ close_Metrics_src( &Metrics );
+ }
+ return rc;
+}
+
+
+rc_t finish_metrics( met_ctx * sctx )
+{
+ VCursorRelease( sctx->cursor );
+ return 0;
+}
+
+
+rc_t load_metrics( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx )
+{
+ rc_t rc = 0;
+ if ( lctx->check_src_obj )
+ /* in case of metrics any combination of columns can be missing... */
+ rc = check_src_objects( hdf5_src, metrics_groups_to_check,
+ NULL, false );
+
+ if ( rc == 0 )
+ rc = load_table( database, hdf5_src, lctx, metrics_schema_template,
+ metrics_table_to_create, metrics_loader );
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-metrics.h b/tools/pacbio-load/pl-metrics.h
new file mode 100644
index 0000000..b52c269
--- /dev/null
+++ b/tools/pacbio-load/pl-metrics.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_metrics_
+#define _h_pl_metrics_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-progress.h"
+#include <kapp/main.h>
+#include <klib/rc.h>
+
+/* enumeration of the columns of the metrics-table */
+enum
+{
+ /* metrix-space */
+ metrics_tab_BASE_FRACTION,
+ metrics_tab_BASE_IPD,
+ metrics_tab_BASE_RATE,
+ metrics_tab_BASE_WIDTH,
+ metrics_tab_CHAN_BASE_QV,
+ metrics_tab_CHAN_DEL_QV,
+ metrics_tab_CHAN_INS_QV,
+ metrics_tab_CHAN_SUB_QV,
+ metrics_tab_LOCAL_BASE_RATE,
+ metrics_tab_DARK_BASE_RATE,
+ metrics_tab_HQ_RGN_START_TIME,
+ metrics_tab_HQ_RGN_END_TIME,
+ metrics_tab_HQ_RGN_SNR,
+ metrics_tab_PRODUCTIVITY,
+ metrics_tab_READ_SCORE,
+ metrics_tab_READ_BASE_QV,
+ metrics_tab_READ_DEL_QV,
+ metrics_tab_READ_INS_QV,
+ metrics_tab_READ_SUB_QV,
+ metrics_tab_count
+};
+
+
+typedef struct met_ctx
+{
+ VCursor * cursor;
+ ld_context *lctx;
+ uint32_t col_idx[ metrics_tab_count ];
+} met_ctx;
+
+
+rc_t prepare_metrics( VDatabase * database, met_ctx * sctx, ld_context *lctx );
+rc_t load_metrics_src( met_ctx * sctx, KDirectory * hdf5_src );
+rc_t finish_metrics( met_ctx * sctx );
+
+rc_t load_metrics( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-passes.c b/tools/pacbio-load/pl-passes.c
new file mode 100644
index 0000000..83fb195
--- /dev/null
+++ b/tools/pacbio-load/pl-passes.c
@@ -0,0 +1,437 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-passes.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+const char * passes_tab_names[] =
+{
+ "ADAPTER_HIT_BEFORE",
+ "ADAPTER_HIT_AFTER",
+ "PASS_DIRECTION",
+ "PASS_NUM_BASES",
+ "PASS_START_BASE"
+};
+
+
+typedef struct Passes_src
+{
+ af_data AdapterHitBefore;
+ af_data AdapterHitAfter;
+ af_data PassDirection;
+ af_data PassNumBases;
+ af_data PassStartBase;
+} Passes_src;
+
+
+static void init_Passes_src( Passes_src *tab )
+{
+ init_array_file( &tab->AdapterHitBefore );
+ init_array_file( &tab->AdapterHitAfter );
+ init_array_file( &tab->PassDirection );
+ init_array_file( &tab->PassNumBases );
+ init_array_file( &tab->PassStartBase );
+}
+
+
+static void close_Passes_src( Passes_src *tab )
+{
+ free_array_file( &tab->AdapterHitBefore );
+ free_array_file( &tab->AdapterHitAfter );
+ free_array_file( &tab->PassDirection );
+ free_array_file( &tab->PassNumBases );
+ free_array_file( &tab->PassStartBase );
+}
+
+static rc_t open_Passes_src( const KDirectory *hdf5_dir, Passes_src *tab,
+ const char * path, bool cache_content )
+{
+ rc_t rc;
+
+ init_Passes_src( tab );
+
+ rc = open_element( hdf5_dir, &tab->AdapterHitBefore, path, "AdapterHitBefore",
+ ADAPTER_HIT_BEFORE_BITSIZE, ADAPTER_HIT_BEFORE_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->AdapterHitAfter, path, "AdapterHitAfter",
+ ADAPTER_HIT_AFTER_BITSIZE, ADAPTER_HIT_AFTER_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->PassDirection, path, "PassDirection",
+ PASS_DIRECTION_BITSIZE, PASS_DIRECTION_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->PassNumBases, path, "PassNumBases",
+ PASS_NUM_BASES_BITSIZE, PASS_NUM_BASES_COLS,
+ true, cache_content, false );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->PassStartBase, path, "PassStartBase",
+ PASS_START_BASE_BITSIZE, PASS_START_BASE_COLS,
+ true, cache_content, false );
+ if ( rc != 0 )
+ close_Passes_src( tab );
+ return rc;
+}
+
+
+static bool check_Passes_ext( af_data *af, bool *needed, uint64_t *expected,
+ const char * s )
+{
+ bool res = true;
+
+ if ( *needed )
+ {
+ *expected = af->extents[ 0 ];
+ *needed = false;
+ }
+ else
+ res = check_table_count( af, s, *expected );
+ return res;
+}
+
+
+static bool check_Passes_extents( Passes_src *tab )
+{
+ bool res = true;
+ bool needed = true;
+ uint64_t expected = 0;
+
+ if ( tab->AdapterHitBefore.rc == 0 && res )
+ res = check_Passes_ext( &tab->AdapterHitBefore, &needed, &expected, "AdapterHitBefore" );
+
+ if ( tab->AdapterHitAfter.rc == 0 && res )
+ res = check_Passes_ext( &tab->AdapterHitAfter, &needed, &expected, "AdapterHitAfter" );
+
+ if ( tab->PassDirection.rc == 0 && res )
+ res = check_Passes_ext( &tab->PassDirection, &needed, &expected, "PassDirection" );
+
+ if ( tab->PassNumBases.rc == 0 && res )
+ res = check_Passes_ext( &tab->PassNumBases, &needed, &expected, "PassNumBases" );
+
+ if ( tab->PassStartBase.rc == 0 && res )
+ res = check_Passes_ext( &tab->PassStartBase, &needed, &expected, "PassStartBase" );
+
+ return res;
+}
+
+
+#define PASS_BLOCK_SIZE 1024
+
+typedef struct pass_block
+{
+ uint8_t AdapterHitBefore[ PASS_BLOCK_SIZE ];
+ uint8_t AdapterHitAfter[ PASS_BLOCK_SIZE ];
+ uint8_t PassDirection[ PASS_BLOCK_SIZE ];
+ uint32_t PassNumBases[ PASS_BLOCK_SIZE ];
+ uint32_t PassStartBase[ PASS_BLOCK_SIZE ];
+ uint64_t n_read;
+} pass_block;
+
+
+static rc_t pass_block_read_from_src( Passes_src *tab,
+ const uint64_t total_passes,
+ const uint64_t pos,
+ pass_block * block )
+{
+ rc_t rc = 0;
+ uint64_t to_read = PASS_BLOCK_SIZE;
+ uint64_t read;
+
+ block->n_read = 0;
+ if ( ( pos + to_read ) >= total_passes )
+ to_read = ( total_passes - pos );
+
+ if ( tab->AdapterHitBefore.rc == 0 )
+ rc = array_file_read_dim1( &tab->AdapterHitBefore, pos,
+ &block->AdapterHitBefore[0],
+ to_read, &read );
+ else
+ memset( &block->AdapterHitBefore[0], 0, to_read * sizeof( uint8_t ) );
+
+
+ if ( rc == 0 && tab->AdapterHitAfter.rc == 0 )
+ rc = array_file_read_dim1( &tab->AdapterHitAfter, pos,
+ &block->AdapterHitAfter[0],
+ to_read, &read );
+ else
+ memset( &block->AdapterHitAfter[0], 0, to_read * sizeof( uint8_t ) );
+
+ if ( rc == 0 && tab->PassDirection.rc == 0 )
+ rc = array_file_read_dim1( &tab->PassDirection, pos,
+ &block->PassDirection[0],
+ to_read, &read );
+ else
+ memset( &block->PassDirection[0], 0, to_read * sizeof( uint8_t ) );
+
+ if ( rc == 0 && tab->PassNumBases.rc == 0 )
+ rc = array_file_read_dim1( &tab->PassNumBases, pos,
+ &block->PassNumBases[0],
+ to_read, &read );
+ else
+ memset( &block->PassNumBases[0], 0, to_read * sizeof( uint32_t ) );
+
+ if ( rc == 0 && tab->PassStartBase.rc == 0 )
+ rc = array_file_read_dim1( &tab->PassStartBase, pos,
+ &block->PassStartBase[0],
+ to_read, &read );
+ else
+ memset( &block->PassStartBase[0], 0, to_read * sizeof( uint32_t ) );
+
+ if ( rc == 0 )
+ block->n_read = read;
+
+ return rc;
+}
+
+
+static rc_t passes_load_pass( VCursor *cursor, pass_block *block,
+ const uint32_t idx, uint32_t *col_idx )
+{
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open passes-row" );
+
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor,
+ col_idx[ passes_tab_ADAPTER_HIT_BEFORE ],
+ block->AdapterHitBefore[ idx ],
+ "passes.AdapterHitBefore" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor,
+ col_idx[ passes_tab_ADAPTER_HIT_AFTER ],
+ block->AdapterHitAfter[ idx ],
+ "passes.AdapterHitAfter" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor,
+ col_idx[ passes_tab_PASS_DIRECTION ],
+ block->PassDirection[ idx ],
+ "passes.PassDirection" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor,
+ col_idx[ passes_tab_PASS_NUM_BASES ],
+ block->PassNumBases[ idx ],
+ "passes.PassNumBases" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor,
+ col_idx[ passes_tab_PASS_START_BASE ],
+ block->PassStartBase[ idx ],
+ "passes.PassStartBase" );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot commit passes-row" );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot close passes-row" );
+ }
+
+ return rc;
+}
+
+
+static rc_t passes_load_loop( ld_context *lctx, VCursor * cursor, Passes_src *tab,
+ uint32_t *col_idx )
+{
+ rc_t rc = 0;
+ KLogLevel tmp_lvl;
+ pass_block block;
+ pl_progress *progress;
+ uint64_t pos = 0;
+ uint64_t total_passes = tab->AdapterHitBefore.extents[0];
+
+ pl_progress_make( &progress, total_passes );
+ rc = progress_chunk( &lctx->xml_progress, total_passes );
+
+ tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading passes-table ( $(rows) rows ) :",
+ "rows=%lu", total_passes ));
+ KLogLevelSet( tmp_lvl );
+
+ while( pos < total_passes && rc == 0 )
+ {
+ rc = pass_block_read_from_src( tab, total_passes, pos, &block );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < block.n_read && rc == 0; ++i )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = passes_load_pass( cursor, &block, i, col_idx );
+ if ( rc == 0 )
+ {
+ rc = progress_step( lctx->xml_progress );
+ if ( lctx->with_progress )
+ pl_progress_increment( progress, 1 );
+ }
+ }
+ else
+ LOGERR( klogErr, rc, "...loading passes interrupted" );
+ }
+ pos += block.n_read;
+ }
+ }
+
+ pl_progress_destroy( progress );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommit( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot commit cursor on PASSES-tab" );
+ }
+ return rc;
+}
+
+
+static rc_t passes_loader( ld_context * lctx, KDirectory * hdf5_src, VCursor * cursor, const char * table_name )
+{
+ uint32_t col_idx[ passes_tab_count ];
+ rc_t rc = add_columns( cursor, passes_tab_count, -1, col_idx, passes_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open cursor on PASSES-tab" );
+ else
+ {
+ Passes_src Passes;
+ rc = open_Passes_src( hdf5_src, &Passes,
+ "PulseData/ConsensusBaseCalls/Passes",
+ lctx->cache_content );
+ if ( rc == 0 )
+ {
+ if ( check_Passes_extents( &Passes ) )
+ rc = passes_load_loop( lctx, cursor, &Passes, col_idx );
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ close_Passes_src( &Passes );
+ }
+ }
+ }
+ return rc;
+}
+
+/* HDF5-Groups and tables used to load the PASSES-table */
+static const char * passes_groups_to_check[] =
+{
+ "PulseData/ConsensusBaseCalls/Passes",
+ NULL
+};
+
+static const char * passes_tables_to_check[] =
+{
+ "PulseData/ConsensusBaseCalls/Passes/AdapterHitAfter",
+ "PulseData/ConsensusBaseCalls/Passes/AdapterHitBefore",
+ "PulseData/ConsensusBaseCalls/Passes/PassDirection",
+ "PulseData/ConsensusBaseCalls/Passes/PassNumBases",
+ "PulseData/ConsensusBaseCalls/Passes/PassStartBase",
+ NULL
+};
+
+static const char * passes_schema_template = "PASSES";
+static const char * passes_table_to_create = "PASSES";
+
+
+rc_t prepare_passes( VDatabase * database, pas_ctx * sctx, ld_context *lctx )
+{
+ rc_t rc = prepare_table( database, &sctx->cursor,
+ passes_schema_template, passes_table_to_create ); /* pl-tools.c ... this creates the cursor */
+ if ( rc == 0 )
+ {
+ rc = add_columns( sctx->cursor, passes_tab_count, -1, sctx->col_idx, passes_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( sctx->cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot open cursor on PASSES-tab" );
+ }
+ else
+ {
+ sctx->lctx = lctx;
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t load_passes_src( pas_ctx * sctx, KDirectory * hdf5_src )
+{
+ Passes_src Passes;
+ rc_t rc = 0;
+
+ if ( sctx->lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, passes_groups_to_check,
+ passes_tables_to_check, false );
+ if ( rc == 0 )
+ rc = open_Passes_src( hdf5_src, &Passes, "PulseData/ConsensusBaseCalls/Passes",
+ sctx->lctx->cache_content );
+ if ( rc == 0 )
+ {
+ if ( check_Passes_extents( &Passes ) )
+ rc = passes_load_loop( sctx->lctx, sctx->cursor, &Passes, sctx->col_idx );
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ close_Passes_src( &Passes );
+ }
+ return rc;
+}
+
+
+rc_t finish_passes( pas_ctx * sctx )
+{
+ VCursorRelease( sctx->cursor );
+ return 0;
+}
+
+
+rc_t load_passes( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx )
+{
+ rc_t rc = 0;
+ if ( lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, passes_groups_to_check,
+ passes_tables_to_check, false );
+ if ( rc == 0 )
+ rc = load_table( database, hdf5_src, lctx, passes_schema_template,
+ passes_table_to_create, passes_loader );
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-passes.h b/tools/pacbio-load/pl-passes.h
new file mode 100644
index 0000000..6bb6c1c
--- /dev/null
+++ b/tools/pacbio-load/pl-passes.h
@@ -0,0 +1,70 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_passes_
+#define _h_pl_passes_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-progress.h"
+#include <klib/rc.h>
+#include <kapp/main.h>
+
+/* enumeration of the columns of the passes-table */
+enum
+{
+ /* consensus-space */
+ passes_tab_ADAPTER_HIT_BEFORE,
+ passes_tab_ADAPTER_HIT_AFTER,
+ passes_tab_PASS_DIRECTION,
+ passes_tab_PASS_NUM_BASES,
+ passes_tab_PASS_START_BASE,
+ passes_tab_count
+};
+
+
+typedef struct pas_ctx
+{
+ VCursor * cursor;
+ ld_context *lctx;
+ uint32_t col_idx[ passes_tab_count ];
+} pas_ctx;
+
+
+rc_t prepare_passes( VDatabase * database, pas_ctx * sctx, ld_context *lctx );
+rc_t load_passes_src( pas_ctx * sctx, KDirectory * hdf5_src );
+rc_t finish_passes( pas_ctx * sctx );
+
+
+rc_t load_passes( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-progress.c b/tools/pacbio-load/pl-progress.c
new file mode 100644
index 0000000..f905614
--- /dev/null
+++ b/tools/pacbio-load/pl-progress.c
@@ -0,0 +1,195 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+typedef struct pl_progress
+{
+ bool initialized;
+ uint8_t fract_digits;
+ uint64_t count;
+ uint64_t position;
+ uint16_t percent;
+} pl_progress;
+
+
+static uint8_t pl_calc_fract_digits( const uint64_t count )
+{
+ uint8_t res = 0;
+ if ( count > 10000 )
+ {
+ if ( count > 100000 )
+ res = 2;
+ else
+ res = 1;
+ }
+ return res;
+}
+
+
+rc_t pl_progress_make( pl_progress ** pb, const uint64_t count )
+{
+ if ( pb == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ (*pb) = calloc( 1, sizeof( struct pl_progress ) );
+ if ( *pb == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (*pb)->count = count;
+ (*pb)->fract_digits = pl_calc_fract_digits( count );
+ (*pb)->position = 0;
+ return 0;
+}
+
+
+rc_t pl_progress_destroy( pl_progress * pb )
+{
+ if ( pb == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+ free( pb );
+ return KOutMsg( "\n" );
+ return 0;
+}
+
+
+static void progess_0a( const uint16_t percent )
+{
+ KOutMsg( "| %2u%%", percent );
+}
+
+
+static void progess_0( const uint16_t percent )
+{
+ if ( percent & 1 )
+ KOutMsg( "\b\b\b\b- %2u%%", percent );
+ else
+ KOutMsg( "\b\b\b%2u%%", percent );
+}
+
+
+static void progess_1a( const uint16_t percent )
+{
+ uint16_t p1 = percent / 10;
+ uint16_t p0 = percent - ( p1 * 10 );
+ KOutMsg( "| %2u.%01u%%", p1, p0 );
+}
+
+
+static void progess_1( const uint16_t percent )
+{
+ uint16_t p1 = percent / 10;
+ uint16_t p0 = percent - ( p1 * 10 );
+ if ( ( p1 & 1 )&&( p0 == 0 ) )
+ KOutMsg( "\b\b\b\b\b\b- %2u.%01u%%", p1, p0 );
+ else
+ KOutMsg( "\b\b\b\b\b%2u.%01u%%", p1, p0 );
+}
+
+
+static void progess_2a( const uint16_t percent )
+{
+ uint16_t p1 = percent / 100;
+ uint16_t p0 = percent - ( p1 * 100 );
+ KOutMsg( "| %2u.%02u%%", p1, p0 );
+}
+
+
+static void progess_2( const uint16_t percent )
+{
+ uint16_t p1 = percent / 100;
+ uint16_t p0 = percent - ( p1 * 100 );
+ if ( ( p1 & 1 )&&( p0 == 0 ) )
+ KOutMsg( "\b\b\b\b\b\b\b- %2u.%02u%%", p1, p0 );
+ else
+ KOutMsg( "\b\b\b\b\b\b%2u.%02u%%", p1, p0 );
+}
+
+
+uint32_t calc_percent( pl_progress * pb )
+{
+ uint32_t res = 0;
+ uint32_t factor = 100;
+ if ( pb->fract_digits > 0 )
+ {
+ if ( pb->fract_digits > 1 )
+ factor = 10000;
+ else
+ factor = 1000;
+ }
+
+ if ( pb->count > 0 )
+ {
+ if ( pb->position >= pb->count )
+ res = factor;
+ else
+ {
+ uint64_t temp = pb->position;
+ temp *= factor;
+ temp /= pb->count;
+ res = (uint32_t) temp;
+ }
+ }
+ return res;
+}
+
+
+rc_t pl_progress_increment( pl_progress * pb, const uint64_t step )
+{
+ uint32_t percent;
+ if ( pb == NULL )
+ return RC( rcVDB, rcNoTarg, rcParsing, rcSelf, rcNull );
+
+ pb->position += step;
+ percent = calc_percent( pb );
+ if ( pb->initialized )
+ {
+ if ( pb->percent != percent )
+ {
+ pb->percent = percent;
+ switch( pb->fract_digits )
+ {
+ case 0 : progess_0( percent ); break;
+ case 1 : progess_1( percent ); break;
+ case 2 : progess_2( percent ); break;
+ }
+ }
+ }
+ else
+ {
+ pb->percent = percent;
+ switch( pb->fract_digits )
+ {
+ case 0 : progess_0a( percent ); break;
+ case 1 : progess_1a( percent ); break;
+ case 2 : progess_2a( percent ); break;
+ }
+ pb->initialized = true;
+ }
+ return 0;
+}
diff --git a/tools/pacbio-load/pl-progress.h b/tools/pacbio-load/pl-progress.h
new file mode 100644
index 0000000..e4c05b6
--- /dev/null
+++ b/tools/pacbio-load/pl-progress.h
@@ -0,0 +1,70 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pl_progress_
+#define _h_pl_progress_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct pl_progress pl_progress;
+
+/*--------------------------------------------------------------------------
+ * make_progressbar
+ *
+ * creates a progressbar with zero-values inside
+ * does not output anything
+ */
+rc_t pl_progress_make( pl_progress ** pb, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * destroy_progressbar
+ *
+ * destroy's the progressbar
+ * does not output anything
+ */
+rc_t pl_progress_destroy( pl_progress * pb );
+
+
+/*--------------------------------------------------------------------------
+ * update_progressbar
+ *
+ * sets the progressbar to a specific percentage
+ * outputs only if the percentage has changed from the last call
+ * the precentage is in 1/10-th of a percent ( 21,6% = 216 )
+ * expects the percents in increasing order ( does not jump back )
+ * writes a growing bar made from '-'-chars every 2nd percent
+ */
+rc_t pl_progress_increment( pl_progress * pb, const uint64_t step );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-regions.c b/tools/pacbio-load/pl-regions.c
new file mode 100644
index 0000000..4a4ea28
--- /dev/null
+++ b/tools/pacbio-load/pl-regions.c
@@ -0,0 +1,1048 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-regions.h"
+#include <insdc/sra.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+enum
+{
+ pacbio_idx_spot_id = 0,
+ pacbio_idx_type,
+ pacbio_idx_start,
+ pacbio_idx_end,
+ pacbio_idx_score
+};
+
+
+/* HDF5-Groups and tables used to use the REGIONS-table */
+static const char * region_groups_to_check[] =
+{
+ "PulseData",
+ NULL
+};
+
+static const char * region_tables_to_check[] =
+{
+ "PulseData/Regions",
+ NULL
+};
+
+
+void rgn_stat_init( regions_stat * stat )
+{
+ stat->inserts = 0;
+ stat->expands_a = 0;
+ stat->expands_i = 0;
+ stat->inserts_spots = 0;
+ stat->expands_spots = 0;
+ stat->end_gap = 0;
+ stat->overlapps = 0;
+ stat->removed = 0;
+}
+
+
+void rgn_init( regions *rgn )
+{
+ init_array_file( &rgn->hdf5_regions );
+
+ VectorInit ( &rgn->read_Regions, 0, 5 );
+ VectorInit ( &rgn->sort_Regions, 0, 5 );
+ VectorInit ( &rgn->stock_Regions, 0, 5 );
+
+ rgn->data_32 = NULL;
+ rgn->data_32_len = 0;
+ rgn->data_8 = NULL;
+ rgn->data_8_len = 0;
+
+ rgn->offset = 0;
+ rgn->spot_id = 0;
+ rgn->spot_len = 0;
+ rgn->hq_rgn.start = 0;
+ rgn->hq_rgn.end = 0;
+
+ rgn_stat_init( &( rgn->stat ) );
+
+ rgn->complete_table = NULL;
+ rgn->table_index = NULL;
+}
+
+
+static void CC region_whack( void * item, void * data )
+{
+ free( item );
+}
+
+
+static rc_t rgn_vector_move( Vector * src, Vector * dst )
+{
+ rc_t rc = 0;
+ while ( VectorLength( src ) > 0 && rc == 0 )
+ {
+ region *ptr;
+ rc = VectorRemove ( src, 0, (void**)&ptr );
+ if ( rc == 0 )
+ rc = VectorAppend ( dst, NULL, ptr );
+ }
+ return rc;
+}
+
+
+void rgn_free( regions *rgn )
+{
+ free_array_file( &rgn->hdf5_regions );
+
+ VectorWhack ( &rgn->read_Regions, region_whack, NULL );
+ VectorWhack ( &rgn->sort_Regions, region_whack, NULL );
+ VectorWhack ( &rgn->stock_Regions, region_whack, NULL );
+
+ if ( rgn->data_32 != NULL )
+ free( rgn->data_32 );
+ if ( rgn->data_8 != NULL )
+ free( rgn->data_8 );
+
+ if ( rgn->complete_table != NULL )
+ free( rgn->complete_table );
+ if ( rgn->table_index != NULL )
+ free( rgn->table_index );
+}
+
+
+static
+int64_t CC rgn_sort_callback( const void *p1, const void *p2, void * data )
+{
+ regions *rgn = ( regions * ) data;
+ int32_t idx1 = *( int32_t * ) p1;
+ int32_t idx2 = *( int32_t * ) p2;
+ int32_t spot_id1 = rgn->complete_table[ idx1 * RGN_COLUMN_COUNT ];
+ int32_t spot_id2 = rgn->complete_table[ idx2 * RGN_COLUMN_COUNT ];
+ if ( spot_id1 == spot_id2 )
+ return ( idx1 - idx2 );
+ return ( spot_id1 - spot_id2 );
+}
+
+
+static
+rc_t rgn_read_complete_table( regions *rgn )
+{
+ rc_t rc;
+ uint32_t rowcount = rgn->hdf5_regions.extents[ 0 ];
+ uint32_t rowsize = sizeof( int32_t ) * RGN_COLUMN_COUNT;
+
+ rgn->complete_table = malloc( rowcount * rowsize );
+ if ( rgn->complete_table == NULL )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcMemory, rcExhausted );
+ else
+ {
+ rgn->table_index = malloc( sizeof( uint32_t ) * rowcount );
+ if ( rgn->table_index == NULL )
+ {
+ free( rgn->complete_table );
+ rgn->complete_table = NULL;
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcMemory, rcExhausted );
+ }
+ else
+ {
+ uint64_t n_read = 0;
+
+ /* now let's read the whole table... */
+ rc = array_file_read_dim2( &(rgn->hdf5_regions), 0, rgn->complete_table,
+ rowcount, RGN_COLUMN_COUNT, &n_read );
+ if ( rc == 0 )
+ {
+ uint32_t idx, first_spot_id;
+
+ first_spot_id = rgn->complete_table[ pacbio_idx_spot_id ];
+ if ( first_spot_id != 0 )
+ {
+ /* in case the file we are loading is part of a multi-file submission */
+ for ( idx = 0; idx < rowcount; ++idx )
+ rgn->complete_table[ ( idx * RGN_COLUMN_COUNT ) + pacbio_idx_spot_id ] -= first_spot_id;
+ }
+
+ /* first let's fill the index, first with ascending row-id's */
+ for ( idx = 0; idx < rowcount; ++idx )
+ rgn->table_index[ idx ] = idx;
+
+ /* now sort the index-array by the content's spot-id's */
+ ksort ( rgn->table_index, rowcount, sizeof( uint32_t ),
+ rgn_sort_callback, rgn );
+
+ /* left here to print a debug-output of the sorted table-index */
+ /*
+ for ( idx = rowcount - 128; idx < rowcount; ++idx )
+ OUTMSG(( "idx[%i] = %i -> %i\n",
+ idx, rgn->table_index[ idx ],
+ rgn->complete_table[ rgn->table_index[ idx ] * RGN_COLUMN_COUNT ] ));
+ */
+
+ /* the table and the index is now ready to use... */
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_open( const KDirectory *hdf5_dir, regions *rgn )
+{
+ rc_t rc;
+ rgn_init( rgn );
+ /* check if the necessary groups/tables are there */
+ rc = check_src_objects( hdf5_dir, region_groups_to_check,
+ region_tables_to_check, false );
+ if ( rc == 0 )
+ {
+ /* open the region-table... */
+ rc = open_element( hdf5_dir, &rgn->hdf5_regions,
+ region_groups_to_check[ 0 ], "Regions",
+ REGIONS_BITSIZE, REGIONS_COLS, true, false, true );
+ if ( rc == 0 )
+ rc = rgn_read_complete_table( rgn );
+ }
+ if ( rc != 0 )
+ rgn_free( rgn );
+ return rc;
+}
+
+
+static rc_t rgn_get_or_make( Vector * stock, region ** r )
+{
+ rc_t rc = 0;
+ /* take it out of the stock or make a new one... */
+ if ( VectorLength( stock ) > 0 )
+ rc = VectorRemove ( stock, 0, (void**)r );
+ else
+ *r = malloc( sizeof ** r );
+
+ if ( *r == NULL )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcMemory, rcExhausted );
+ return rc;
+}
+
+
+static int64_t CC rgn_sort_by_start( const void *item, const void *n )
+{
+ region * v1 = ( region * )item;
+ region * v2 = ( region * )n;
+ if ( v1 -> start != v2 -> start )
+ return ( v1->start - v2->start );
+ return ( v1->end - v2->end );
+}
+
+
+static rc_t rgn_store_bio_or_adapter( Vector * stock, Vector * to,
+ const int32_t * block, int32_t sra_read_type )
+{
+ rc_t rc = 0;
+
+ if ( block[ pacbio_idx_start ] < block[ pacbio_idx_end ] )
+ {
+ region * a_region;
+ rc = rgn_get_or_make( stock, &a_region );
+ if ( rc == 0 )
+ {
+ a_region->spot_id = block[ pacbio_idx_spot_id ];
+ a_region->type = sra_read_type;
+ a_region->start = block[ pacbio_idx_start ];
+ a_region->end = block[ pacbio_idx_end ];
+
+ /* see every region shorter as MIN_BIOLOGICAL_LEN
+ as a technical (adapter) region */
+ if ( ( a_region->end - a_region->start ) <= MIN_BIOLOGICAL_LEN )
+ a_region->type = SRA_READ_TYPE_TECHNICAL;
+
+ a_region->filter = SRA_READ_FILTER_PASS;
+ rc = VectorInsert ( to, a_region, NULL, rgn_sort_by_start );
+ }
+ }
+ return rc;
+}
+
+static rc_t rgn_store_block( Vector * stock, Vector * to, hq_region * hq,
+ const int32_t * block, region_type_mapping *mapping,
+ bool *have_high_quality )
+{
+ rc_t rc = 0;
+ int32_t type = block[ pacbio_idx_type ];
+
+ if ( mapping->rgn_type_hq >=0 && type == mapping->rgn_type_hq )
+ {
+ /* it is an error if we have more than one high-quality-region! */
+ assert ( ! * have_high_quality );
+
+ if ( * have_high_quality )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(* have_high_quality) in rgn_store_block()'" );
+ return rc;
+ }
+
+ hq->start = block[ pacbio_idx_start ];
+ hq->end = block[ pacbio_idx_end ];
+ * have_high_quality = true;
+ }
+ else if ( mapping->rgn_type_ga >= 0 && type == mapping->rgn_type_ga )
+ { /* so far do nothing with the "global accuracy" region */
+ }
+ else if ( mapping->rgn_type_adapter >= 0 && type == mapping->rgn_type_adapter )
+ { /* it is an adapter */
+ rc = rgn_store_bio_or_adapter( stock, to, block, SRA_READ_TYPE_TECHNICAL );
+ }
+ else if ( mapping->rgn_type_insert >= 0 && type == mapping->rgn_type_insert )
+ { /* it is an insert */
+ rc = rgn_store_bio_or_adapter( stock, to, block, SRA_READ_TYPE_BIOLOGICAL );
+ }
+ else
+ { /* the type is unknown */
+ ( mapping->count_of_unknown_rgn_types )++;
+ /*
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "( region type is unknown ) in rgn_store_block()'" );
+ */
+ }
+ return rc;
+}
+
+
+/* inserts the generated region into the sort_Regions */
+static rc_t rgn_generate( Vector * stock, Vector * dst,
+ const int32_t spot_id, const uint32_t start, const uint32_t len )
+{
+ region * a_region;
+ rc_t rc = rgn_get_or_make( stock, &a_region );
+ if ( rc == 0 )
+ {
+ a_region->spot_id = spot_id;
+ a_region->type = SRA_READ_TYPE_TECHNICAL; /*means "i dont know"*/
+ a_region->start = start;
+ a_region->end = start + len;
+ a_region->filter = SRA_READ_FILTER_CRITERIA;
+ rc = VectorInsert ( dst, a_region, NULL, rgn_sort_by_start );
+ }
+ return rc;
+}
+
+
+/* *************************************************************
+declares all regions inside and touching the HQ-Regions as
+ SRA_READ_FILTER_PASS outside becomes SRA_READ_FILTER_CRITERIA;
+************************************************************* */
+#if 0
+static rc_t rgn_apply_filter( Vector * stock, Vector * v, hq_region * hq,
+ const int32_t spot_id, const uint32_t spot_len )
+{
+ rc_t rc = 0;
+
+ if ( hq->start == 0 && hq->end == 0 )
+ {
+ /* we have no HQ-Region, discard everything and create one
+ READ for the whole spot, that will be TECHNICAL... */
+ rgn_vector_move( v, stock );
+
+ if ( spot_len > 0 )
+ /* inserts the generated region into the sort_Regions */
+ rc = rgn_generate( stock, v, spot_id, 0, spot_len );
+ }
+ else
+ {
+ uint32_t i, count = VectorLength ( v );
+ for ( i = 0; i < count; ++ i )
+ {
+ region * a_region = VectorGet ( v, i );
+ if ( a_region != NULL )
+ {
+ bool set_invalid = ( ( a_region->end <= hq->start ) ||
+ ( a_region->start >= hq->end ) );
+ if ( set_invalid )
+ {
+ /* the region is before the hq-region
+ ---> set to SRA_READ_FILTER_CRITERIA */
+ a_region->filter = SRA_READ_FILTER_CRITERIA;
+ a_region->type = SRA_READ_TYPE_TECHNICAL;
+ }
+ else
+ {
+ /* the region intersects with the hq-region
+ ---> set to SRA_READ_FILTER_PASS */
+ a_region->filter = SRA_READ_FILTER_PASS;
+ }
+ }
+ }
+ }
+ return rc;
+}
+#endif
+
+static bool rgn_expand_last_rgn_by_1( Vector * v, int32_t *expands_a, int32_t *expands_i )
+{
+ region * a_region = VectorLast ( v );
+ bool res = ( a_region != NULL );
+ if ( res )
+ {
+ a_region->end += 1;
+ if ( a_region->type == SRA_READ_TYPE_TECHNICAL )
+ (*expands_a)++;
+ else
+ (*expands_i)++;
+ }
+ return res;
+}
+
+
+/* *************************************************************
+if gap is 1, expand previous region by 1 (correct off-by-1)
+fill in gaps > 1 ( regions are not consecutive )
+correct overlapping regions
+fill in a gap at the end, if the last region does not reach spotlen
+
+ INTPUT : rgn->read_Regions
+ OUTPUT : rgn->sort_Regions
+************************************************************* */
+static rc_t rgn_correct( Vector * stock, Vector * from, Vector * to,
+ const uint32_t spot_id, const uint32_t spot_len,
+ regions_stat * stats )
+{
+ rc_t rc;
+ int32_t start, expands_a = 0, expands_i = 0, inserts = 0;
+ uint32_t i, count = VectorLength ( from );
+
+ for ( rc = 0, start = 0, i = 0; i < count && rc == 0; ++ i )
+ {
+ region * a_region;
+
+ /* take the region out of rgn->read_Regions*/
+ rc = VectorRemove ( from, 0, (void**)&a_region );
+ if ( rc == 0 )
+ {
+ int32_t gap_len = ( a_region->start - start );
+
+ if ( gap_len == 1 )
+ {
+ /* the gap-length is one, try to expand the previous region */
+ if ( !rgn_expand_last_rgn_by_1( to, &expands_a, &expands_i ) )
+ {
+ /* there is no previous region ! */
+ rc = rgn_generate( stock, to, spot_id, start, gap_len );
+ }
+ }
+ else if ( gap_len > 1 )
+ {
+ /* generate a artificial gap in the middle or the start of the spot */
+ rc = rgn_generate( stock, to, spot_id, start, gap_len );
+ inserts++;
+ }
+ else if ( gap_len < 0 )
+ {
+ /* a negative gap would be an error in the sorting of the regions,
+ or an overlapp of regions */
+ if ( ( a_region->start - gap_len ) > a_region->end )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "((a_region->start-gap_len)>a_region->end) in rgn_correct()'" );
+ }
+ else /** move the start point ***/
+ {
+ a_region->start -= gap_len;
+ stats->overlapps++;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VectorInsert ( to, a_region, NULL, rgn_sort_by_start );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "VectorInsert(rgn_sort_by_start) in rgn_correct()'" );
+ start = a_region->end;
+ }
+ else
+ {
+ rc_t rc1 = VectorInsert( stock, a_region, NULL, NULL );
+ if ( rc1 != 0 )
+ LOGERR( klogErr, rc, "VectorInsert(NULL) in rgn_correct()'" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* if the last region does not reach to the end of the spot */
+ if ( start < spot_len )
+ {
+ int32_t gap_len = ( spot_len - start );
+ if ( gap_len == 1 )
+ {
+ /* !!! this can also happen if spot_len == 1 !!! */
+ /* the gap-length is one, try to expand the previous region */
+ if ( ! rgn_expand_last_rgn_by_1( to, &expands_a, &expands_i ) )
+ {
+ /* there is no previous region ! */
+ rc = rgn_generate( stock, to, spot_id, start, gap_len );
+ stats->end_gap++;
+ }
+ }
+ else if ( gap_len > 0 )
+ {
+ /* fill the gap to the end... */
+ rc = rgn_generate( stock, to, spot_id, start, gap_len );
+ stats->end_gap++;
+ }
+ else if ( gap_len < 0 )
+ {
+ /* a negative gap would be an error in the sorting of the regions,
+ or an overlapp of regions */
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(gap_len<0) in rgn_correct()'" );
+ }
+ }
+ }
+
+ /* do some statistics */
+ if ( ( expands_i + expands_a ) > 0 )
+ {
+ stats->expands_a += expands_a;
+ stats->expands_i += expands_i;
+ stats->expands_spots++;
+ }
+ if ( inserts > 0 )
+ {
+ stats->inserts += inserts;
+ stats->inserts_spots++;
+ }
+
+ return rc;
+}
+
+
+/* *************************************************************
+tries to merge overlapping adapter-regions...
+( uses rgn->read_Regions as scratch-pad )
+
+ INTPUT : rgn->sort_Regions
+ OUTPUT : rgn->sort_Regions
+************************************************************* */
+static rc_t rgn_merge_consecutive_regions( Vector * stock, Vector * from, Vector * to )
+{
+ rc_t rc = 0;
+ uint32_t i, count = VectorLength ( from );
+ region * a_region = NULL;
+ region * prev_region = NULL;
+
+ for ( i = 0; i < count && rc == 0; ++ i )
+ {
+ /* take the region out of rgn->sort_Regions*/
+ rc = VectorRemove ( from, 0, (void**)&a_region );
+ if ( rc == 0 )
+ {
+ bool copy = true;
+ if ( prev_region != NULL )
+ {
+ if ( ( a_region->start <= prev_region->end ) &&
+ ( a_region->type == prev_region->type ) &&
+ ( a_region->filter == prev_region->filter ) )
+ {
+ prev_region->end = a_region->end;
+ /* put the now unused region back into the stock */
+ VectorAppend ( stock, NULL, a_region );
+ /* and keep prev-region! */
+ copy = false;
+ }
+ }
+ if ( copy )
+ {
+ prev_region = a_region;
+ rc = VectorInsert ( to, a_region, NULL, rgn_sort_by_start );
+ }
+ }
+ }
+ return rc;
+}
+
+/* *************************************************************
+tests that the spot-len is covered with regions that
+are not overlapping, have no gaps, start is ascending
+the regions to check are in rgn->sort_Regions
+************************************************************* */
+static rc_t rgn_check( const Vector * v, const uint32_t spot_len )
+{
+ rc_t rc = 0;
+ uint32_t i, count = VectorLength ( v );
+ region * a_region = NULL;
+ int32_t start = 0;
+
+ /* special case, if the spot is empty there are not regions */
+ if ( spot_len == 0 )
+ {
+ if ( count != 0 )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(spot_len == 0)&&(count!=0) in region-check()'" );
+ }
+ return rc;
+ }
+
+ /* check that we have at least one region in the spot */
+ if ( count < 1 )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(count<1) in region-check()'" );
+ }
+
+ for ( i = 0; i < count && rc == 0; ++ i )
+ {
+ a_region = VectorGet ( v, i );
+ if ( a_region == NULL )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(a_region==NULL) in region-check()'" );
+ }
+ else
+ {
+ /* check that the region has no gap and is not overlapping */
+ if ( a_region->start != start )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ PLOGERR( klogErr, ( klogErr, rc, "(a_region->start($(rstart))!=start($(start))) in region-check()'",
+ "rstart=%u,start=%u", a_region->start, start ) );
+ }
+ else
+ {
+ /* check that the region is ascending */
+ if ( a_region->end < start )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(a_region->end<start) in region-check()'" );
+ }
+ start = a_region->end;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* check that the region is fully covered */
+ if ( a_region->end != spot_len )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ LOGERR( klogErr, rc, "(a_region->end!=spot_len) in region-check()'" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_load( regions *rgn, const uint32_t spot_id,
+ region_type_mapping *mapping, const uint32_t spot_len )
+{
+ rc_t rc;
+ uint64_t row_count = rgn->hdf5_regions.extents[ 0 ];
+
+ /* predefine that we have no HQ-regions read */
+ rgn->hq_rgn.start = 0;
+ rgn->hq_rgn.end = 0;
+
+ /* clear out the read and the sorted vector */
+ rc = rgn_vector_move( &rgn->read_Regions, &rgn->stock_Regions );
+ if ( rc == 0 )
+ rc = rgn_vector_move( &rgn->sort_Regions, &rgn->stock_Regions );
+
+ if ( rc == 0 )
+ {
+ if ( !( rgn->spot_id == 0 || rgn->spot_id == ( spot_id - 1 ) ) )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcParam, rcInvalid );
+ }
+
+ if ( rc == 0 )
+ {
+ int32_t * block;
+ bool have_high_quality = false;
+ do
+ {
+ int32_t idx = rgn->table_index[ rgn->offset ];
+ block = &( rgn->complete_table[ idx * RGN_COLUMN_COUNT ] );
+ if ( block[ pacbio_idx_spot_id ] == spot_id )
+ {
+ rc = rgn_store_block( &(rgn->stock_Regions), &(rgn->read_Regions),
+ &(rgn->hq_rgn), block,
+ mapping, & have_high_quality );
+ if ( rc == 0 )
+ rgn->offset++;
+ }
+
+ } while( rc == 0 &&
+ block[ pacbio_idx_spot_id ] == spot_id &&
+ rgn->offset < row_count );
+ rgn->spot_id = spot_id;
+ rgn->spot_len = spot_len;
+ }
+
+ if ( rc == 0 )
+ {
+#if 0 /**** does not seem to match PacBio ***/
+ /* changes READ_FILTER and READ_TYPE if a region is completely
+ outside of the hq-region... ( if we have one )
+ if there is none the whole spot becomes one CRITERIA/TECHNICAL-read */
+ rc = rgn_apply_filter( &(rgn->stock_Regions), &(rgn->read_Regions),
+ &(rgn->hq_rgn), rgn->spot_id, rgn->spot_len );
+#endif
+
+
+ /* INPUT : rgn->read_Regions / OUTPUT : rgn->sort_Regions */
+ /* fills gaps, corrects off-by-1-errors and overlapping regions */
+ if ( rc == 0 )
+ rc = rgn_correct( &(rgn->stock_Regions),
+ &(rgn->read_Regions), &(rgn->sort_Regions),
+ rgn->spot_id, rgn->spot_len, &(rgn->stat) );
+
+ /* INPUT : rgn->sort_Regions / OUTPUT : rgn->read_Regions */
+ /* merges consecutive regions if READ_TYPE/READ_FILTER are the same */
+ if ( rc == 0 )
+ rc = rgn_merge_consecutive_regions( &(rgn->stock_Regions),
+ &(rgn->sort_Regions),
+ &(rgn->read_Regions) );
+
+ /* INPUT : rgn->read_Regions */
+ /* checks that the whole spot is covered, no overlapps/gaps occur,
+ regions have to be sorted in ascending order */
+
+ if ( rc == 0 )
+ rc = rgn_check( &(rgn->read_Regions), rgn->spot_len );
+
+ }
+ return rc;
+}
+
+
+static rc_t rgn_resize_data_32( regions *rgn )
+{
+ rc_t rc = 0;
+ size_t needed_len;
+
+ needed_len = ( sizeof( *rgn->data_32 ) * VectorLength( &rgn->read_Regions ) );
+ if ( rgn->data_32 == NULL )
+ {
+ rgn->data_32 = malloc( needed_len );
+ }
+ else if ( rgn->data_32_len < VectorLength( &rgn->read_Regions ) )
+ {
+ rgn->data_32 = realloc ( rgn->data_32, needed_len );
+ }
+ if ( rgn->data_32 == NULL )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcMemory, rcExhausted );
+ else
+ rgn->data_32_len = VectorLength( &rgn->read_Regions );
+ return rc;
+}
+
+
+void rgn_set_filter_value_for_all( regions *rgn, const uint32_t filter_value )
+{
+ uint32_t i, n = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < n; ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ if ( a_region != NULL )
+ a_region->filter = filter_value;
+ }
+}
+
+
+static rc_t rgn_resize_data_8( regions *rgn )
+{
+ rc_t rc = 0;
+ size_t needed_len;
+
+ needed_len = ( sizeof( *rgn->data_8 ) * VectorLength( &rgn->read_Regions ) );
+ needed_len = (needed_len + 3 ) & ~3; /** to make valgrind happy ***/
+ if ( rgn->data_8 == NULL )
+ {
+ rgn->data_8 = malloc( needed_len );
+ }
+ else if ( rgn->data_8_len < VectorLength( &rgn->read_Regions ) )
+ {
+ rgn->data_8 = realloc ( rgn->data_8, needed_len );
+ }
+ if ( rgn->data_8 == NULL )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcMemory, rcExhausted );
+ else
+ rgn->data_8_len = VectorLength( &rgn->read_Regions );
+ return rc;
+}
+
+
+rc_t rgn_start_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_32( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint32_t *ptr = rgn->data_32;
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ if ( a_region != NULL )
+ ptr[ i ] = a_region->start;
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_len_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_32( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint32_t *ptr = rgn->data_32;
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ if ( a_region != NULL )
+ ptr[ i ] = ( a_region->end - a_region->start );
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_type_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_8( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint8_t *ptr = rgn->data_8;
+
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ if ( a_region != NULL )
+ ptr[ i ] = a_region->type;
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_filter_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_8( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint8_t *ptr = rgn->data_8;
+
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ if ( a_region != NULL )
+ ptr[ i ] = a_region->filter;
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_label_start_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_32( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint32_t *ptr = rgn->data_32;
+ uint32_t value;
+
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ value = label_lowquality_start; /* default value */
+ if ( a_region != NULL )
+ switch( a_region->type )
+ {
+ case SRA_READ_TYPE_BIOLOGICAL :
+ value = label_insert_start;
+ break;
+ case SRA_READ_TYPE_TECHNICAL :
+ value = label_adapter_start;
+/*
+ if ( a_region->filter == SRA_READ_FILTER_PASS )
+ value = label_adapter_start;
+ else
+ value = label_lowquality_start;
+*/
+ break;
+ }
+ ptr[ i ] = value;
+ }
+ }
+ return rc;
+}
+
+
+rc_t rgn_label_len_data( regions *rgn, uint32_t *count )
+{
+ rc_t rc = rgn_resize_data_32( rgn );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ uint32_t *ptr = rgn->data_32;
+ uint32_t value;
+
+ *count = VectorLength( &rgn->read_Regions );
+ for ( i = 0; i < (*count); ++i )
+ {
+ region * a_region = VectorGet ( &rgn->read_Regions, i );
+ value = label_lowquality_len; /* default value */
+ if ( a_region != NULL )
+ switch ( a_region->type )
+ {
+ case SRA_READ_TYPE_BIOLOGICAL :
+ value = label_insert_len;
+ break;
+ case SRA_READ_TYPE_TECHNICAL :
+ value = label_adapter_len;
+/*
+ if ( a_region->filter == SRA_READ_FILTER_PASS )
+ value = label_adapter_len;
+ else
+ value = label_lowquality_len;
+*/
+ break;
+ }
+ ptr[ i ] = value;
+ }
+ }
+ return rc;
+}
+
+
+static const char rgn_string_adapter[] = "Adapter";
+static const char rgn_string_insert[] = "Insert";
+static const char rgn_string_hq[] = "HQRegion";
+static const char rgn_string_ga[] = "GlobalAccuracy";
+
+
+static int rgn_str_cmp( const char *a, const char *b )
+{
+ size_t asize = string_size ( a );
+ size_t bsize = string_size ( b );
+ return strcase_cmp ( a, asize, b, bsize, ( asize > bsize ) ? asize : bsize );
+}
+
+
+static rc_t rgn_set_type_code( int32_t *dst, const uint32_t type_idx )
+{
+ if ( *dst == -1 )
+ {
+ *dst = type_idx;
+ return 0;
+ }
+ else
+ return RC( rcExe, rcNoTarg, rcLoading, rcName, rcDuplicate );
+}
+
+
+static rc_t rgn_type_string( const char *type_string, uint32_t type_idx,
+ region_type_mapping *mapping )
+{
+ if ( rgn_str_cmp( type_string, rgn_string_adapter ) == 0 )
+ return rgn_set_type_code( &(mapping->rgn_type_adapter), type_idx );
+
+ if ( rgn_str_cmp( type_string, rgn_string_insert ) == 0 )
+ return rgn_set_type_code( &(mapping->rgn_type_insert), type_idx );
+
+ if ( rgn_str_cmp( type_string, rgn_string_hq ) == 0 )
+ return rgn_set_type_code( &(mapping->rgn_type_hq), type_idx );
+
+ if ( rgn_str_cmp( type_string, rgn_string_ga ) == 0 )
+ return rgn_set_type_code( &(mapping->rgn_type_ga), type_idx );
+
+ return RC( rcExe, rcNoTarg, rcLoading, rcName, rcUnknown );
+}
+
+
+/* read the mapping out of the region-types out of a string... */
+rc_t rgn_extract_type_mappings( const KNamelist *rgn_names,
+ region_type_mapping *mapping, bool check_completenes )
+{
+ rc_t rc = 0;
+ uint32_t count, idx;
+
+ mapping->rgn_type_adapter = -1;
+ mapping->rgn_type_insert = -1;
+ mapping->rgn_type_hq = -1;
+ mapping->rgn_type_ga = -1;
+
+ rc = KNamelistCount ( rgn_names, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *name;
+ rc = KNamelistGet ( rgn_names, idx, &name );
+ if ( rc == 0 )
+ rgn_type_string( name, idx, mapping );
+ }
+
+ if ( rc == 0 && check_completenes )
+ {
+ if ( mapping->rgn_type_adapter == -1 ||
+ mapping->rgn_type_insert == -1 ||
+ mapping->rgn_type_hq == -1 )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcName, rcIncomplete );
+ }
+
+ mapping->count_of_unknown_rgn_types = 0;
+ return rc;
+}
+
+
+
+rc_t rgn_show_type_mappings( region_type_mapping *mapping )
+{
+ rc_t rc;
+ if ( mapping == NULL )
+ rc = RC( rcExe, rcNoTarg, rcLoading, rcParam, rcInvalid );
+ else
+ rc = KOutMsg( "rgn-type-mapping->adapter = %i\n", mapping->rgn_type_adapter );
+ if ( rc == 0 )
+ rc = KOutMsg( "rgn-type-mapping->insert = %i\n", mapping->rgn_type_insert );
+ if ( rc == 0 )
+ rc = KOutMsg( "rgn-type-mapping->high_qual = %i\n", mapping->rgn_type_hq );
+ if ( rc == 0 )
+ rc = KOutMsg( "rgn-type-mapping->globe_acc = %i\n", mapping->rgn_type_ga );
+ return rc;
+}
+
diff --git a/tools/pacbio-load/pl-regions.h b/tools/pacbio-load/pl-regions.h
new file mode 100644
index 0000000..464ac5e
--- /dev/null
+++ b/tools/pacbio-load/pl-regions.h
@@ -0,0 +1,140 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_regions_
+#define _h_pl_regions_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include <klib/vector.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <insdc/sra.h>
+
+
+#define RGN_COLUMN_COUNT 5
+#define MIN_BIOLOGICAL_LEN 10
+
+typedef struct region_type_mapping
+{
+ int32_t rgn_type_adapter; /* technical */
+ int32_t rgn_type_insert; /* biological */
+ int32_t rgn_type_hq; /* HighQualityRegion */
+ int32_t rgn_type_ga; /* GlobalAccuracy ??? */
+
+ uint64_t count_of_unknown_rgn_types;
+} region_type_mapping;
+
+
+typedef struct region
+{
+ int32_t spot_id;
+ int32_t type;
+ int32_t start;
+ int32_t end;
+ int32_t filter;
+} region;
+
+
+typedef struct regions_stat
+{
+ uint32_t inserts;
+ uint32_t inserts_spots;
+ uint32_t expands_a;
+ uint32_t expands_i;
+ uint32_t expands_spots;
+ uint32_t end_gap;
+ uint32_t overlapps;
+ uint32_t removed;
+} regions_stat;
+
+
+typedef struct hq_region
+{
+ uint32_t start;
+ uint32_t end;
+} hq_region;
+
+
+typedef struct regions
+{
+ af_data hdf5_regions;
+ Vector read_Regions;
+ Vector sort_Regions;
+ Vector stock_Regions;
+ hq_region hq_rgn;
+ uint64_t offset;
+ uint32_t spot_id;
+ uint32_t spot_len;
+ uint32_t * data_32;
+ uint8_t * data_8;
+ size_t data_32_len;
+ size_t data_8_len;
+
+ regions_stat stat;
+
+ int32_t * complete_table;
+ int32_t * table_index;
+} regions;
+
+
+void rgn_init( regions *rgn );
+void rgn_free( regions *rgn );
+
+static const char def_label[] = "AdapterInsertLowQuality";
+static const size_t def_label_len = 23;
+
+static const uint32_t label_adapter_start = 0;
+static const uint32_t label_adapter_len = 7;
+static const uint32_t label_insert_start = 7;
+static const uint32_t label_insert_len = 6;
+static const uint32_t label_lowquality_start = 13;
+static const uint32_t label_lowquality_len = 10;
+
+rc_t rgn_open( const KDirectory *hdf5_dir, regions *rgn );
+
+rc_t rgn_load( regions *rgn, const uint32_t spot_id,
+ region_type_mapping *mapping, const uint32_t spot_len );
+
+void rgn_set_filter_value_for_all( regions *rgn, const uint32_t filter_value );
+
+rc_t rgn_start_data( regions *rgn, uint32_t *count );
+rc_t rgn_len_data( regions *rgn, uint32_t *count );
+rc_t rgn_type_data( regions *rgn, uint32_t *count );
+rc_t rgn_filter_data( regions *rgn, uint32_t *count );
+rc_t rgn_label_start_data( regions *rgn, uint32_t *count );
+rc_t rgn_label_len_data( regions *rgn, uint32_t *count );
+
+rc_t rgn_extract_type_mappings( const KNamelist *rgn_names, region_type_mapping *mapping, bool check_completenes );
+rc_t rgn_show_type_mappings( region_type_mapping *mapping );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-sequence.c b/tools/pacbio-load/pl-sequence.c
new file mode 100644
index 0000000..050bc17
--- /dev/null
+++ b/tools/pacbio-load/pl-sequence.c
@@ -0,0 +1,928 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-sequence.h"
+#include "pl-regions.h"
+#include <kfs/kfs-priv.h> /* access to getmeta of KArrayfile*/
+#include <sra/pacbio.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+const char * seq_tab_names[] =
+{
+ /* base-space */
+ "READ",
+ "QUALITY",
+ "NREADS",
+ "(INSDC:SRA:platform_id)PLATFORM",
+ "LABEL",
+ "LABEL_START",
+ "LABEL_LEN",
+ "READ_TYPE",
+ "READ_START",
+ "READ_LEN",
+ "CLIP_QUALITY_LEFT",
+ "CLIP_QUALITY_RIGHT",
+ "READ_FILTER",
+
+ /* pulse-space */
+ "PRE_BASE_FRAMES",
+ "WIDTH_IN_FRAMES",
+ "(U16)PULSE_INDEX",
+ "PULSE_INDEX",
+ "HOLE_NUMBER",
+ "HOLE_STATUS",
+ "HOLE_XY",
+ "INSERTION_QV",
+ "DELETION_QV",
+ "DELETION_TAG",
+ "SUBSTITUTION_QV",
+ "SUBSTITUTION_TAG"
+};
+
+
+static void init_BaseCalls( BaseCalls *tab )
+{
+ init_BaseCalls_cmn( &tab->cmn );
+ rgn_init( &tab->rgn );
+ init_array_file( &tab->PreBaseFrames );
+ init_array_file( &tab->PulseIndex );
+ init_array_file( &tab->WidthInFrames );
+}
+
+
+static void close_BaseCalls( BaseCalls *tab )
+{
+ close_BaseCalls_cmn( &tab->cmn );
+ rgn_free( &tab->rgn );
+ free_array_file( &tab->PreBaseFrames );
+ free_array_file( &tab->PulseIndex );
+ free_array_file( &tab->WidthInFrames );
+}
+
+
+static rc_t open_BaseCalls( const KDirectory *hdf5_dir, BaseCalls *tab,
+ const char * path, bool cache_content, bool * rgn_present )
+{
+ rc_t rc;
+
+ init_BaseCalls( tab );
+ rc = open_BaseCalls_cmn( hdf5_dir, &tab->cmn, false, path, cache_content, false );
+ if ( rc == 0 )
+ {
+ rc_t rc1 = rgn_open( hdf5_dir, &tab->rgn );
+ if ( rgn_present != NULL )
+ *rgn_present = ( rc1 == 0 );
+
+ open_element( hdf5_dir, &tab->PreBaseFrames, path, "PreBaseFrames",
+ PRE_BASE_FRAMES_BITSIZE, PRE_BASE_FRAMES_COLS,
+ true, cache_content, true );
+
+ if ( rc == 0 )
+ {
+ rc = open_element( hdf5_dir, &tab->PulseIndex, path, "PulseIndex",
+ PULSE_INDEX_BITSIZE_16, PULSE_INDEX_COLS,
+ false, cache_content, false );
+ /* try again if it is not 16 bit! */
+ if ( rc != 0 )
+ rc = open_element( hdf5_dir, &tab->PulseIndex, path, "PulseIndex",
+ PULSE_INDEX_BITSIZE_32, PULSE_INDEX_COLS,
+ true, cache_content, false );
+ }
+
+ open_element( hdf5_dir, &tab->WidthInFrames, path, "WidthInFrames",
+ WIDTH_IN_FRAMES_BITSIZE, WIDTH_IN_FRAMES_COLS,
+ true, cache_content, true );
+
+ if ( rc != 0 )
+ close_BaseCalls( tab ); /* releases only initialized elements */
+ }
+ return rc;
+}
+
+
+static bool check_BaseCall_totalcount( BaseCalls *tab, const uint64_t expected )
+{
+ bool res = true;
+
+ if ( tab->PreBaseFrames.rc == 0 )
+ res = check_table_count( &tab->PreBaseFrames, "PreBaseFrames", expected );
+
+ if ( res && tab->PulseIndex.rc == 0 )
+ res = check_table_count( &tab->PulseIndex, "PulseIndex", expected );
+
+ if ( res && tab->WidthInFrames.rc == 0 )
+ res = check_table_count( &tab->WidthInFrames, "WidthInFrames", expected );
+
+ if ( res && tab->cmn.Basecall.rc == 0 )
+ res = check_table_count( &tab->cmn.Basecall, "Basecall", expected );
+
+ if ( res && tab->cmn.DeletionQV.rc == 0 )
+ res = check_table_count( &tab->cmn.DeletionQV, "DeletionQV", expected );
+
+ if ( res && tab->cmn.DeletionTag.rc == 0 )
+ res = check_table_count( &tab->cmn.DeletionTag, "DeletionTag", expected );
+
+ if ( res && tab->cmn.InsertionQV.rc == 0 )
+ res = check_table_count( &tab->cmn.InsertionQV, "InsertionQV", expected );
+
+ if ( res && tab->cmn.QualityValue.rc == 0 )
+ res = check_table_count( &tab->cmn.QualityValue, "QualityValue", expected );
+
+ if ( res && tab->cmn.SubstitutionQV.rc == 0 )
+ res = check_table_count( &tab->cmn.SubstitutionQV, "SubstitutionQV", expected );
+
+ if ( res && tab->cmn.SubstitutionTag.rc == 0 )
+ res = check_table_count( &tab->cmn.SubstitutionTag, "SubstitutionTag", expected );
+ return res;
+}
+
+
+static rc_t seq_load_zero_bases( VCursor *cursor, BaseCalls *tab,
+ const uint32_t *col_idx )
+{
+ uint32_t dummy_src;
+ rc_t rc = vdb_write_value( cursor, col_idx[ seq_tab_READ ],
+ &dummy_src, BASECALL_BITSIZE, 0, "seq.Basecall" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_QUALITY ],
+ &dummy_src, QUALITY_VALUE_BITSIZE, 0, "seq.QualityValue" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_INSERTION_QV ],
+ &dummy_src, INSERTION_QV_BITSIZE, 0, "seq.InsertionQV" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_DELETION_QV ],
+ &dummy_src, DELETION_QV_BITSIZE, 0, "seq.DeletionQV" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_DELETION_TAG ],
+ &dummy_src, DELETION_TAG_BITSIZE, 0, "seq.DeletionTag" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_SUBSTITUTION_QV ],
+ &dummy_src, SUBSTITUTION_QV_BITZISE, 0, "seq.SubstitutionQV" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_SUBSTITUTION_TAG ],
+ &dummy_src, SUBSTITUTION_TAG_BITSIZE, 0, "seq.SubstitutionTag" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_PRE_BASE_FRAMES ],
+ &dummy_src, PRE_BASE_FRAMES_BITSIZE, 0, "seq.PreBaseFrames" );
+
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_WIDTH_IN_FRAMES ],
+ &dummy_src, WIDTH_IN_FRAMES_BITSIZE, 0, "seq.WidthInFrames" );
+
+ if ( rc == 0 )
+ {
+ if ( tab->PulseIndex.element_bits == PULSE_INDEX_BITSIZE_16 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_PULSE_INDEX_16 ],
+ &dummy_src, PULSE_INDEX_BITSIZE_16, 0, "seq.PulseIndex16" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_PULSE_INDEX_32 ],
+ &dummy_src, PULSE_INDEX_BITSIZE_32, 0, "seq.PulseIndex32" );
+ }
+ return rc;
+}
+
+
+static rc_t seq_load_spot_bases( VCursor *cursor, BaseCalls *tab,
+ const uint32_t *col_idx, zmw_row * spot )
+{
+ rc_t rc = 0;
+ size_t n_bytes = spot->NumEvent * 4;
+
+ /* we make a buffer to store NumEvent 32-bit-values
+ (that is so far the biggest value we have to read per DNA-BASE) */
+ char * buffer = malloc( n_bytes );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+ PLOGERR( klogErr, ( klogErr, rc, "cannot allocate $(nbytes) bytes to read seq-data",
+ "nbytes=%u", n_bytes ) );
+ }
+
+ if ( rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_READ ],
+ &tab->cmn.Basecall, buffer, spot->offset, spot->NumEvent,
+ BASECALL_BITSIZE, "seq.Basecall" );
+
+ if ( rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_QUALITY ],
+ &tab->cmn.QualityValue, buffer, spot->offset, spot->NumEvent,
+ QUALITY_VALUE_BITSIZE, "seq.QualityValue" );
+
+ /* this is all optional! ( but we are writing zero's into it if we have no source ... )---> */
+ if ( rc == 0 )
+ {
+ if ( tab->cmn.InsertionQV.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_INSERTION_QV ],
+ &tab->cmn.InsertionQV, buffer, spot->offset, spot->NumEvent,
+ INSERTION_QV_BITSIZE, "seq.InsertionQV" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_INSERTION_QV ],
+ buffer, INSERTION_QV_BITSIZE, 0, "seq.InsertionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->cmn.DeletionQV.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_DELETION_QV ],
+ &tab->cmn.DeletionQV, buffer, spot->offset, spot->NumEvent,
+ DELETION_QV_BITSIZE, "seq.DeletionQV" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_DELETION_QV ],
+ buffer, DELETION_QV_BITSIZE, 0, "seq.DeletionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->cmn.DeletionTag.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_DELETION_TAG ],
+ &tab->cmn.DeletionTag, buffer, spot->offset, spot->NumEvent,
+ DELETION_TAG_BITSIZE, "seq.DeletionTag" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_DELETION_TAG ],
+ buffer, DELETION_TAG_BITSIZE, 0, "seq.DeletionTag" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->cmn.SubstitutionQV.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_SUBSTITUTION_QV ],
+ &tab->cmn.SubstitutionQV, buffer, spot->offset, spot->NumEvent,
+ SUBSTITUTION_QV_BITZISE, "seq.SubstitutionQV" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_SUBSTITUTION_QV ],
+ buffer, SUBSTITUTION_QV_BITZISE, 0, "seq.SubstitutionQV" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->cmn.SubstitutionTag.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_SUBSTITUTION_TAG ],
+ &tab->cmn.SubstitutionTag, buffer, spot->offset, spot->NumEvent,
+ SUBSTITUTION_TAG_BITSIZE, "seq.SubstitutionTag" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_SUBSTITUTION_TAG ],
+ buffer, SUBSTITUTION_TAG_BITSIZE, 0, "seq.SubstitutionTag" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->PreBaseFrames.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_PRE_BASE_FRAMES ],
+ &tab->PreBaseFrames, buffer, spot->offset, spot->NumEvent,
+ PRE_BASE_FRAMES_BITSIZE, "seq.PreBaseFrames" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_PRE_BASE_FRAMES ],
+ buffer, PRE_BASE_FRAMES_BITSIZE, 0, "seq.PreBaseFrames" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( tab->WidthInFrames.rc == 0 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_WIDTH_IN_FRAMES ],
+ &tab->WidthInFrames, buffer, spot->offset, spot->NumEvent,
+ WIDTH_IN_FRAMES_BITSIZE, "seq.WidthInFrames" );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_WIDTH_IN_FRAMES ],
+ buffer, WIDTH_IN_FRAMES_BITSIZE, 0, "seq.WidthInFrames" );
+ }
+ /* <--- this is all optional! */
+
+
+ if ( rc == 0 )
+ {
+ if ( tab->PulseIndex.element_bits == PULSE_INDEX_BITSIZE_16 )
+ rc = transfer_bits( cursor, col_idx[ seq_tab_PULSE_INDEX_16 ],
+ &tab->PulseIndex, buffer, spot->offset, spot->NumEvent,
+ PULSE_INDEX_BITSIZE_16, "seq.PulsIndex16" );
+ else
+ rc = transfer_bits( cursor, col_idx[ seq_tab_PULSE_INDEX_32 ],
+ &tab->PulseIndex, buffer, spot->offset, spot->NumEvent,
+ PULSE_INDEX_BITSIZE_32, "seq.PulsIndex32" );
+ }
+
+ if ( buffer != NULL )
+ free( buffer );
+ return rc;
+}
+
+
+static rc_t seq_load_read_desc( VCursor *cursor, const uint32_t *col_idx,
+ region_type_mapping *mapping,
+ zmw_row * spot, BaseCalls *tab )
+{
+ uint32_t n;
+ /* take the spot-descriptors out of the region-table
+ and write them... */
+
+ rc_t rc = rgn_load( &tab->rgn, spot->spot_nr, mapping, spot->NumEvent );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_load( spot #$(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+
+ if ( rc == 0 )
+ {
+ uint32_t filter_value = SRA_READ_FILTER_PASS;
+ if ( spot->HoleStatus != SRA_PACBIO_HOLE_SEQUENCING )
+ {
+ filter_value = SRA_READ_FILTER_CRITERIA;
+ }
+ rgn_set_filter_value_for_all( &tab->rgn, filter_value );
+ }
+
+ if ( rc == 0 )
+ {
+ /* write the READ_START - vector */
+ rc = rgn_start_data( &tab->rgn, &n );
+
+/*
+ if ( n > 255 )
+ OUTMSG(( "spot #%lu has %u READS\n", spot->spot_nr, n ));
+*/
+
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_start_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_READ_START ],
+ tab->rgn.data_32, 32, n, "seq.READ_START" );
+ }
+
+ /* write the READ_LEN - vector */
+ if ( rc == 0 )
+ {
+ rc = rgn_len_data( &tab->rgn, &n );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_len_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_READ_LEN ],
+ tab->rgn.data_32, 32, n, "seq.READ_LEN" );
+ }
+
+ /* write the READ_TYPE - vector */
+ if ( rc == 0 )
+ {
+ rc = rgn_type_data( &tab->rgn, &n );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_type_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_READ_TYPE ],
+ tab->rgn.data_8, 8, n, "seq.READ_TYPE" );
+
+ }
+
+ /* write the READ_FILTER - vector */
+ if ( rc == 0 )
+ {
+ rc = rgn_filter_data( &tab->rgn, &n );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_filter_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_READ_FILTER ],
+ tab->rgn.data_8, 8, n, "seq.READ_FILTER" );
+ }
+
+
+ /* write the LABEL ( a constant string defined in pl-regions.h" ) */
+ if ( rc == 0 )
+ {
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_LABEL ],
+ (void*)def_label, 8, def_label_len, "seq.LABEL" );
+ }
+
+ /* write the LABEL_START ( index into LABEL for every read ) */
+ if ( rc == 0 )
+ {
+ rc = rgn_label_start_data( &tab->rgn, &n );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_label_start_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_LABEL_START ],
+ tab->rgn.data_32, 32, n, "seq.LABEL_START" );
+ }
+
+ /* write the LABEL_LEN ( index into LABEL for every read ) */
+ if ( rc == 0 )
+ {
+ rc = rgn_label_len_data( &tab->rgn, &n );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "rgn_label_len_data( $(spotnr) ) failed",
+ "spotnr=%u", spot->spot_nr ) );
+ else
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_LABEL_LEN ],
+ tab->rgn.data_32, 32, n, "seq.LABEL_LEN" );
+ }
+
+ /* write how many regions(pacbio)/reads(ncbi) this spot has */
+ if ( rc == 0 )
+ {
+ if ( n > 255 )
+ n = 255;
+ rc = vdb_write_uint8( cursor, col_idx[ seq_tab_NREADS ],
+ (uint8_t)n, "seq.NREADS" );
+ }
+
+ /* write hq-start/hq-end into CLIP_QUALITY_LEFT/RIGHT */
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_CLIP_QUALITY_LEFT ],
+ tab->rgn.hq_rgn.start, "seq.CLIP_QUALITY_LEFT" );
+
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_CLIP_QUALITY_RIGHT ],
+ tab->rgn.hq_rgn.end, "seq.CLIP_QUALITY_RIGHT" );
+
+ return rc;
+}
+
+
+static rc_t seq_load_one_spot( VCursor *cursor, const uint32_t *col_idx,
+ zmw_row * spot, BaseCalls *tab )
+{
+ rc_t rc = vdb_write_uint32( cursor, col_idx[ seq_tab_READ_START ],
+ 0, "seq.READ_START" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_READ_LEN ],
+ spot->NumEvent, "seq.READ_LEN" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ seq_tab_READ_TYPE ],
+ SRA_READ_TYPE_BIOLOGICAL, "seq.READ_TYPE" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ seq_tab_READ_FILTER ],
+ SRA_READ_FILTER_PASS, "seq.READ_FILTER" );
+ /* write the LABEL ( a constant string defined in pl-regions.h" ) */
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_LABEL ],
+ (void*)def_label, 8, def_label_len, "seq.LABEL" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_LABEL_START ],
+ label_insert_start, "seq.LABEL_START" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_LABEL_LEN ],
+ label_insert_len, "seq.LABEL_LEN" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ seq_tab_NREADS ],
+ 1, "seq.NREADS" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_CLIP_QUALITY_LEFT ],
+ 1, "seq.CLIP_QUALITY_LEFT" );
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_CLIP_QUALITY_RIGHT ],
+ spot->NumEvent -1, "seq.CLIP_QUALITY_RIGHT" );
+ return rc;
+}
+
+
+static rc_t seq_load_spot( VCursor *cursor, const uint32_t *col_idx,
+ region_type_mapping *mapping, zmw_row * spot,
+ void * data )
+{
+ BaseCalls *tab = (BaseCalls *)data;
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot open seq-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+
+ if ( rc == 0 )
+ rc = vdb_write_uint32( cursor, col_idx[ seq_tab_HOLE_NUMBER ],
+ spot->HoleNumber, "seq.HOLE_NUMBER" );
+ if ( rc == 0 )
+ rc = vdb_write_uint8( cursor, col_idx[ seq_tab_HOLE_STATUS ],
+ spot->HoleStatus, "seq.HOLE_STATUS" );
+ if ( rc == 0 )
+ rc = vdb_write_value( cursor, col_idx[ seq_tab_HOLE_XY ],
+ &spot->HoleXY, HOLE_XY_BITSIZE, 2, "seq.HOLE_XY" );
+
+ if ( rc == 0 )
+ {
+ /* we load the bases / quality-values and other data belonging
+ to this hole(bacbio)/spot(ncbi) */
+ if ( spot->NumEvent > 0 )
+ rc = seq_load_spot_bases( cursor, tab, col_idx, spot );
+ else
+ rc = seq_load_zero_bases( cursor, tab, col_idx );
+
+ /* we try to divide the spot into regions(pacbio)/reads(ncbi) */
+ if ( rc == 0 )
+ {
+ if ( mapping != NULL )
+ rc = seq_load_read_desc( cursor, col_idx, mapping, spot, tab );
+ else
+ rc = seq_load_one_spot( cursor, col_idx, spot, tab );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot commit seq-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot close seq-row on spot# $(spotnr)",
+ "spotnr=%u", spot->spot_nr ) );
+ }
+ return rc;
+}
+
+
+static void seq_load_info( regions_stat * stat )
+{
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+
+ if ( stat->expands_a > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "adapter expanded: $(times) ( in $(spots) spots )",
+ "times=%u,spots=%u",
+ stat->expands_a, stat->expands_spots ));
+ if ( stat->expands_i > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "insert expanded : $(times) ( in $(spots) spots )",
+ "times=%u,spots=%u",
+ stat->expands_i, stat->expands_spots ));
+ if ( stat->inserts > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "regions inserted: $(times) ( in $(spots) spots )",
+ "times=%u,spots=%u",
+ stat->inserts, stat->inserts_spots ));
+ if ( stat->end_gap > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "end-gap inserted: $(times)",
+ "times=%u", stat->end_gap ));
+ if ( stat->overlapps > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "overlapping rngs: $(times)",
+ "times=%u", stat->overlapps ));
+ if ( stat->removed > 0 )
+ PLOGMSG( klogInfo, ( klogInfo,
+ "removed rgns : $(times)",
+ "times=%u", stat->removed ));
+
+ KLogLevelSet( tmp_lvl );
+}
+
+
+
+void seq_report_totals( ld_context *lctx )
+{
+ const char* accession;
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+
+ accession = strrchr( lctx->dst_path, '/' );
+ if( accession == NULL )
+ accession = lctx->dst_path;
+ else
+ accession++;
+
+ PLOGMSG( klogInfo, ( klogInfo, "loaded",
+ "severity=total,status=success,accession=%s,spot_count=%lu,base_count=%lu,bad_spots=0",
+ accession, lctx->total_seq_spots, lctx->total_seq_bases ));
+
+ KLogLevelSet( tmp_lvl );
+}
+
+
+static rc_t seq_loader( ld_context *lctx, KDirectory * hdf5_src, VCursor * cursor, const char * table_name )
+{
+ BaseCalls BaseCallsTab;
+ bool rgn_present;
+
+ /* opens all hdf5-tables, which are needed to load the sequence-table */
+ rc_t rc = open_BaseCalls( hdf5_src, &BaseCallsTab,
+ "PulseData/BaseCalls", lctx->cache_content, &rgn_present );
+ if ( rc == 0 )
+ {
+ /* calculates the total number of bases, according to the zmw-table */
+ uint64_t total_bases = zmw_total( &BaseCallsTab.cmn.zmw );
+ /* calculates the total number of spots, according to the zmw-table */
+ uint64_t total_spots = BaseCallsTab.cmn.zmw.NumEvent.extents[ 0 ];
+
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading sequence-table ( $(bases) bases / $(spots) spots ):",
+ "bases=%lu,spots=%lu", total_bases, total_spots ));
+ KLogLevelSet( tmp_lvl );
+
+ /* checks that all tables, which are loaded do have the correct
+ number of values (the number that the zmw-table requests) */
+ if ( check_BaseCall_totalcount( &BaseCallsTab, total_bases ) )
+ {
+ region_type_mapping mapping;
+
+ if ( rgn_present )
+ {
+ const KNamelist *region_types;
+ /* read the meta-data-entry "RegionTypes" of the hdf5-regions-table
+ into a KNamelist */
+ rc = KArrayFileGetMeta ( BaseCallsTab.rgn.hdf5_regions.af, "RegionTypes", ®ion_types );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot read Regions.RegionTypes" );
+ }
+ else
+ {
+ /* extract the region-type-mapping out of the read KNamelist */
+ rc = rgn_extract_type_mappings( region_types, &mapping, false );
+ KNamelistRelease ( region_types );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot map regions-types" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* holds the vdb-column-index for every column we write */
+ uint32_t col_idx[ seq_tab_count ];
+ int32_t to_exclude;
+
+ /* depending on the bit-size of the PulseIndex-table in HDF5
+ exclude the opposite column from VDB */
+ if ( BaseCallsTab.PulseIndex.element_bits == PULSE_INDEX_BITSIZE_16 )
+ to_exclude = seq_tab_PULSE_INDEX_32;
+ else
+ to_exclude = seq_tab_PULSE_INDEX_16;
+
+ /* add all columns to the vdb-cursor */
+ rc = add_columns( cursor, seq_tab_count, to_exclude, col_idx, seq_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot open cursor on seq-table" );
+ else
+ {
+ const uint8_t platform = SRA_PLATFORM_PACBIO_SMRT;
+
+ rc = VCursorDefault ( cursor, col_idx[ seq_tab_PLATFORM ], 8, &platform, 0, 1 );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot set cursor-default on seq-table for platform-column" );
+ else
+ {
+ region_type_mapping *mapping_ptr = NULL;
+
+ if ( rgn_present )
+ {
+ mapping_ptr = &mapping;
+ }
+ /* call for every spot the function >seq_load_spot< */
+ rc = zmw_for_each( &BaseCallsTab.cmn.zmw, &lctx->xml_progress, cursor,
+ lctx->with_progress, col_idx, mapping_ptr, false, seq_load_spot, &BaseCallsTab );
+ }
+ }
+ }
+ }
+
+ if ( rgn_present )
+ {
+ seq_load_info( &BaseCallsTab.rgn.stat );
+
+ if ( mapping.count_of_unknown_rgn_types > 0 )
+ {
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+
+ PLOGMSG( klogInfo, ( klogInfo,
+ "$(times) x unknown region types encountered",
+ "times=%i", mapping.count_of_unknown_rgn_types ) );
+ KLogLevelSet( tmp_lvl );
+
+ }
+ }
+
+ lctx->total_seq_bases += total_bases;
+ lctx->total_seq_spots += total_spots;
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ close_BaseCalls( &BaseCallsTab );
+ }
+
+ return rc;
+}
+
+
+/* HDF5-Groups and tables used to load the PULSE-table */
+static const char * seq_groups_to_check[] =
+{
+ "PulseData",
+ "PulseData/BaseCalls",
+ "PulseData/BaseCalls/ZMW",
+ NULL
+};
+
+static const char * seq_tables_to_check[] =
+{
+ "PulseData/BaseCalls/Basecall",
+ "PulseData/BaseCalls/DeletionQV",
+ "PulseData/BaseCalls/DeletionTag",
+ "PulseData/BaseCalls/InsertionQV",
+ "PulseData/BaseCalls/PreBaseFrames",
+ "PulseData/BaseCalls/PulseIndex",
+ "PulseData/BaseCalls/QualityValue",
+ "PulseData/BaseCalls/SubstitutionQV",
+ "PulseData/BaseCalls/SubstitutionTag",
+ "PulseData/BaseCalls/WidthInFrames",
+ "PulseData/BaseCalls/ZMW/HoleNumber",
+ "PulseData/BaseCalls/ZMW/HoleStatus",
+ "PulseData/BaseCalls/ZMW/HoleXY",
+ "PulseData/BaseCalls/ZMW/NumEvent",
+ NULL
+};
+
+
+static const char * seq_schema_template = "SEQUENCE";
+static const char * seq_table_to_create = "SEQUENCE";
+
+
+/* special case for SEQUENCE: in order to prepare the cursor correctly, we have to know the first HDF5-source-obj !*/
+rc_t prepare_seq( VDatabase * database, seq_ctx * sctx, KDirectory * hdf5_src, ld_context *lctx )
+{
+ rc_t rc = prepare_table( database, &sctx->cursor, seq_schema_template, seq_table_to_create ); /* pl-tools.c ... this creates the cursor */
+ sctx->src_open = false;
+ if ( rc == 0 )
+ {
+ rc = open_BaseCalls( hdf5_src, &sctx->BaseCallsTab, "PulseData/BaseCalls", lctx->cache_content, &sctx->rgn_present );
+ if ( rc == 0 )
+ {
+ int32_t to_exclude;
+
+ /* depending on the bit-size of the PulseIndex-table in HDF5
+ exclude the opposite column from VDB */
+ if ( sctx->BaseCallsTab.PulseIndex.element_bits == PULSE_INDEX_BITSIZE_16 )
+ to_exclude = seq_tab_PULSE_INDEX_32;
+ else
+ to_exclude = seq_tab_PULSE_INDEX_16;
+
+ /* add all columns to the vdb-cursor */
+ rc = add_columns( sctx->cursor, seq_tab_count, to_exclude, sctx->col_idx, seq_tab_names );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( sctx->cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot open cursor on seq-table" );
+ }
+ else
+ {
+ const uint8_t platform = SRA_PLATFORM_PACBIO_SMRT;
+
+ rc = VCursorDefault ( sctx->cursor, sctx->col_idx[ seq_tab_PLATFORM ], 8, &platform, 0, 1 );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot set cursor-default on seq-table for platform-column" );
+ }
+ else
+ {
+ sctx->src_open = true;
+ sctx->lctx = lctx;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t load_seq_src( seq_ctx * sctx, KDirectory * hdf5_src )
+{
+ rc_t rc = 0;
+ if ( sctx->lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, seq_groups_to_check, seq_tables_to_check, true );
+
+ if ( rc == 0 && !sctx->src_open )
+ rc = open_BaseCalls( hdf5_src, &sctx->BaseCallsTab, "PulseData/BaseCalls", sctx->lctx->cache_content, &sctx->rgn_present );
+ if ( rc == 0 )
+ {
+ /* calculates the total number of bases, according to the zmw-table */
+ uint64_t total_bases = zmw_total( &sctx->BaseCallsTab.cmn.zmw );
+ /* calculates the total number of spots, according to the zmw-table */
+ uint64_t total_spots = sctx->BaseCallsTab.cmn.zmw.NumEvent.extents[ 0 ];
+
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ PLOGMSG( klogInfo, ( klogInfo,
+ "loading sequence-table ( $(bases) bases / $(spots) spots ):",
+ "bases=%lu,spots=%lu", total_bases, total_spots ));
+ KLogLevelSet( tmp_lvl );
+
+ /* checks that all tables, which are loaded do have the correct
+ number of values (the number that the zmw-table requests) */
+ if ( !check_BaseCall_totalcount( &sctx->BaseCallsTab, total_bases ) )
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ else
+ {
+ region_type_mapping mapping;
+
+ if ( sctx->rgn_present )
+ {
+ const KNamelist *region_types;
+ /* read the meta-data-entry "RegionTypes" of the hdf5-regions-table
+ into a KNamelist */
+ rc = KArrayFileGetMeta ( sctx->BaseCallsTab.rgn.hdf5_regions.af, "RegionTypes", ®ion_types );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot read Regions.RegionTypes" );
+ }
+ else
+ {
+ /* extract the region-type-mapping out of the read KNamelist */
+ rc = rgn_extract_type_mappings( region_types, &mapping, false );
+ KNamelistRelease ( region_types );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "cannot map regions-types" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ region_type_mapping *mapping_ptr = NULL;
+
+ if ( sctx->rgn_present )
+ mapping_ptr = &mapping;
+
+ /* call for every spot the function >seq_load_spot< */
+ rc = zmw_for_each( &sctx->BaseCallsTab.cmn.zmw, &sctx->lctx->xml_progress, sctx->cursor,
+ sctx->lctx->with_progress, sctx->col_idx, mapping_ptr, false,
+ seq_load_spot, &sctx->BaseCallsTab );
+ }
+
+ if ( sctx->rgn_present )
+ seq_load_info( &sctx->BaseCallsTab.rgn.stat );
+
+ sctx->lctx->total_seq_bases += total_bases;
+ sctx->lctx->total_seq_spots += total_spots;
+ }
+ close_BaseCalls( &sctx->BaseCallsTab );
+ sctx->src_open = false;
+ }
+ return rc;
+}
+
+
+rc_t finish_seq( seq_ctx * sctx )
+{
+ VCursorRelease( sctx->cursor );
+ return 0;
+}
+
+
+rc_t load_seq( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx )
+{
+ rc_t rc = 0;
+ if ( lctx->check_src_obj )
+ rc = check_src_objects( hdf5_src, seq_groups_to_check, seq_tables_to_check, true );
+ if ( rc == 0 )
+ /* in pl-tools.c */
+ rc = load_table( database, hdf5_src, lctx, seq_schema_template,
+ seq_table_to_create, seq_loader );
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-sequence.h b/tools/pacbio-load/pl-sequence.h
new file mode 100644
index 0000000..f093859
--- /dev/null
+++ b/tools/pacbio-load/pl-sequence.h
@@ -0,0 +1,110 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_sequence_
+#define _h_pl_sequence_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-zmw.h"
+#include "pl-basecalls_cmn.h"
+#include "pl-regions.h"
+#include <klib/rc.h>
+#include <insdc/sra.h>
+
+/* enumeration of the columns of the pulse-table */
+enum
+{
+ /* base-space */
+ seq_tab_READ = 0,
+ seq_tab_QUALITY,
+ seq_tab_NREADS,
+ seq_tab_PLATFORM,
+
+ seq_tab_LABEL,
+ seq_tab_LABEL_START,
+ seq_tab_LABEL_LEN,
+ seq_tab_READ_TYPE,
+ seq_tab_READ_START,
+ seq_tab_READ_LEN,
+ seq_tab_CLIP_QUALITY_LEFT,
+ seq_tab_CLIP_QUALITY_RIGHT,
+ seq_tab_READ_FILTER,
+
+ /* pulse-space */
+ seq_tab_PRE_BASE_FRAMES,
+ seq_tab_WIDTH_IN_FRAMES,
+ seq_tab_PULSE_INDEX_16,
+ seq_tab_PULSE_INDEX_32,
+ seq_tab_HOLE_NUMBER,
+ seq_tab_HOLE_STATUS,
+ seq_tab_HOLE_XY,
+ seq_tab_INSERTION_QV,
+ seq_tab_DELETION_QV,
+ seq_tab_DELETION_TAG,
+ seq_tab_SUBSTITUTION_QV,
+ seq_tab_SUBSTITUTION_TAG,
+ seq_tab_count
+};
+
+
+typedef struct BaseCalls
+{
+ BaseCalls_cmn cmn;
+ regions rgn;
+ af_data PreBaseFrames;
+ af_data PulseIndex;
+ af_data WidthInFrames;
+} BaseCalls;
+
+
+typedef struct seq_ctx
+{
+ VCursor * cursor;
+ ld_context *lctx;
+ BaseCalls BaseCallsTab;
+ uint32_t col_idx[ seq_tab_count ];
+ bool rgn_present;
+ bool src_open;
+} seq_ctx;
+
+
+/* special case for SEQUENCE: in order to prepare the cursor correctly, we have to know the first HDF5-source-obj !*/
+rc_t prepare_seq( VDatabase * database, seq_ctx * sctx, KDirectory * hdf5_src, ld_context *lctx );
+rc_t load_seq_src( seq_ctx * sctx, KDirectory * hdf5_src );
+rc_t finish_seq( seq_ctx * sctx );
+
+void seq_report_totals( ld_context *lctx );
+
+rc_t load_seq( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-tools.c b/tools/pacbio-load/pl-tools.c
new file mode 100644
index 0000000..5e51c7c
--- /dev/null
+++ b/tools/pacbio-load/pl-tools.c
@@ -0,0 +1,624 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-tools.h"
+#include <klib/printf.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <kdb/database.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+
+void lctx_init( ld_context * lctx )
+{
+ lctx->xml_logger = NULL;
+ lctx->xml_progress = NULL;
+ lctx->with_progress = false;
+ lctx->total_printed = false;
+ lctx->cache_content = false;
+ lctx->check_src_obj = false;
+ lctx->total_seq_bases = 0;
+ lctx->total_seq_spots = 0;
+}
+
+
+void lctx_free( ld_context * lctx )
+{
+ if ( lctx->xml_logger != NULL )
+ {
+ XMLLogger_Release( lctx->xml_logger );
+ lctx->xml_logger = NULL;
+ }
+ if ( lctx->xml_progress != NULL )
+ {
+ KLoadProgressbar_Release( lctx->xml_progress, false );
+ lctx->xml_progress = NULL;
+ }
+}
+
+
+rc_t check_src_objects( const KDirectory *hdf5_dir,
+ const char ** groups,
+ const char **tables,
+ bool show_not_found )
+{
+ rc_t rc = 0;
+ uint16_t idx = 0;
+ uint32_t pt;
+
+ if ( groups != NULL )
+ {
+ while ( groups[ idx ] != NULL && rc == 0 )
+ {
+ pt = KDirectoryPathType ( hdf5_dir, "%s", groups[idx] );
+ if ( pt != kptDir )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ if ( show_not_found )
+ PLOGERR( klogErr, ( klogErr, rc, "hdf5-group '$(grp)' not found",
+ "grp=%s", groups[ idx ] ) );
+ else
+ PLOGERR( klogWarn, ( klogWarn, rc, "hdf5-group '$(grp)' not found",
+ "grp=%s", groups[ idx ] ) );
+ }
+ else
+ idx++;
+ }
+ }
+
+ idx = 0;
+ if ( tables != NULL && rc == 0 )
+ {
+ while ( tables[ idx ] != NULL && rc == 0 )
+ {
+ pt = KDirectoryPathType ( hdf5_dir, "%s", tables[idx] );
+ if ( pt != kptDataset )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ if ( show_not_found )
+ PLOGERR( klogErr, ( klogErr, rc, "hdf5-table '$(tbl)' not found",
+ "tbl=%s", tables[ idx ] ) );
+ else
+ PLOGERR( klogWarn, ( klogWarn, rc, "hdf5-table '$(tbl)' not found",
+ "tbl=%s", tables[ idx ] ) );
+ }
+ else
+ idx++;
+ }
+ }
+
+ return rc;
+}
+
+
+void init_array_file( af_data * af )
+{
+ af->f = NULL;
+ af->af = NULL;
+ af->extents = NULL;
+ af->rc = -1;
+ af->content = NULL;
+}
+
+
+void free_array_file( af_data * af )
+{
+ if ( af->af != NULL )
+ {
+ KArrayFileRelease( af->af );
+ af->af = NULL;
+ }
+ if ( af->f != NULL )
+ {
+ KFileRelease( af->f );
+ af->f = NULL;
+ }
+ if ( af->extents != NULL )
+ {
+ free( af->extents );
+ af->extents = NULL;
+ }
+ if ( af->content != NULL )
+ {
+ free( af->content );
+ af->content = NULL;
+ }
+}
+
+
+static rc_t read_cache_content( af_data * af )
+{
+ rc_t rc = 0;
+ uint64_t filesize = ( af->element_bits >> 3 ) * ( af->extents[ 0 ] );
+ if ( af->dimensionality == 2 )
+ filesize *= af->extents[ 1 ];
+ af->content = malloc( filesize );
+ if ( af->content == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted );
+ else
+ {
+ uint64_t pos2[ 2 ];
+ uint64_t read2[ 2 ];
+ uint64_t count2[ 2 ];
+ rc_t rc;
+
+ pos2[ 0 ] = 0;
+ pos2[ 1 ] = 0;
+ count2[ 0 ] = af->extents[ 0 ];
+ if ( af->dimensionality == 2 )
+ count2[ 1 ] = af->extents[ 1 ];
+ else
+ count2[ 1 ] = 0;
+
+ rc = KArrayFileRead ( af->af, af->dimensionality, pos2,
+ af->content, count2, read2 );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "error reading arrayfile-data int cache" );
+ }
+ return rc;
+}
+
+
+rc_t open_array_file( const KDirectory *dir,
+ const char *name,
+ af_data * af,
+ const uint64_t expected_element_bits,
+ const uint64_t expected_cols,
+ bool disp_wrong_bitsize,
+ bool cache_content,
+ bool supress_err_msg )
+{
+ rc_t rc;
+
+ init_array_file( af );
+ /* open the requested "File" (actually a hdf5-table) as KFile
+ the works because the given KDirectory is a HDF5-Directory */
+ rc = KDirectoryOpenFileRead ( dir, &af->f, "%s", name );
+ if ( rc != 0 )
+ {
+ if ( !supress_err_msg )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot open hdf5-dataset '$(name)'",
+ "name=%s", name ) );
+ }
+ return rc;
+ }
+ /* cast the KFile into a KArrayFile */
+ rc = MakeHDF5ArrayFile ( af->f, &af->af );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot open hdf5-arrayfile '$(name)'",
+ "name=%s", name ) );
+ free_array_file( af );
+ return rc;
+ }
+ /* detect the dimensionality of the array-file */
+ rc = KArrayFileDimensionality ( af->af, &af->dimensionality );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot retrieve dimensionality on '$(name)'",
+ "name=%s", name ) );
+ free_array_file( af );
+ return rc;
+ }
+ /* make a array to hold the extent in every dimension */
+ af->extents = malloc( af->dimensionality * ( sizeof ( uint64_t ) ) );
+ if ( af->extents == NULL )
+ {
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted );
+ PLOGERR( klogErr, ( klogErr, rc, "cannot allocate enough memory for extents of '$(name)'",
+ "name=%s", name ) );
+ free_array_file( af );
+ return rc;
+ }
+ /* read the actuall extents into the created array */
+ rc = KArrayFileDimExtents ( af->af, af->dimensionality, af->extents );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot retrieve extents of '$(name)'",
+ "name=%s", name ) );
+ free_array_file( af );
+ return rc;
+ }
+ /* request the size of the element in bits */
+ rc = KArrayFileElementSize ( af->af, &af->element_bits );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot retrieve element-size of '$(name)'",
+ "name=%s", name ) );
+ free_array_file( af );
+ return rc;
+ }
+ /* compare the discovered bit-size with the expected one */
+ if ( af->element_bits != expected_element_bits )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+
+ /* display the wrong bitsize only if wanted
+ ( this function can be called to probe the bitsize:
+ in this case the wrong one should not be shown as an error )*/
+ if ( disp_wrong_bitsize )
+ PLOGERR( klogErr, ( klogErr, rc, "unexpected element-bits of $(bsize) in '$(name)'",
+ "bsize=%lu,name=%s", af->element_bits, name ) );
+
+ free_array_file( af );
+ return rc;
+ }
+
+ /* not generic, we handle only dimensionality of 1 and 2 */
+ if ( expected_cols == 1 )
+ {
+ /* the dimensionality has to be 1 in this case */
+ if ( af->dimensionality != 1 )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ PLOGERR( klogErr, ( klogErr, rc, "unexpected dimensionality of $(dim) in '$(name)'",
+ "dim=%lu,name=%s", af->dimensionality, name ) );
+ free_array_file( af );
+ return rc;
+ }
+ }
+ else
+ {
+ /* the dimensionality has to be 2 in this case */
+ if ( af->dimensionality != 2 )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ PLOGERR( klogErr, ( klogErr, rc, "unexpected dimensionality of $(dim) in '$(name)'",
+ "dim=%lu,name=%s", af->dimensionality, name ) );
+ free_array_file( af );
+ return rc;
+ }
+ else
+ {
+ if ( af->extents[ 1 ] != expected_cols )
+ {
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ PLOGERR( klogErr, ( klogErr, rc, "unexpected extent[1] of $(ext) in '$(name)'",
+ "ext=%lu,name=%s", af->extents[ 1 ], name ) );
+ free_array_file( af );
+ return rc;
+ }
+ }
+ }
+ if ( rc == 0 && cache_content )
+ {
+ rc = read_cache_content( af );
+ }
+ return rc;
+}
+
+
+/* assembles the 'absolute' path to the requested array-file before opening it */
+rc_t open_element( const KDirectory *hdf5_dir,
+ af_data *element,
+ const char * path,
+ const char * name,
+ const uint64_t expected_element_bits,
+ const uint64_t expected_cols,
+ bool disp_wrong_bitsize,
+ bool cache_content,
+ bool supress_err_msg )
+{
+ char src_path[ 64 ];
+ size_t num_writ;
+
+ element->rc = string_printf ( src_path, sizeof src_path, &num_writ, "%s/%s", path, name );
+ if ( element->rc != 0 )
+ LOGERR( klogErr, element->rc, "cannot assemble hdf5-element-name" );
+ else
+ element->rc = open_array_file( hdf5_dir, src_path, element,
+ expected_element_bits, expected_cols,
+ disp_wrong_bitsize,
+ cache_content,
+ supress_err_msg );
+ return element->rc;
+}
+
+
+/* we are reading data from an array-file,
+ the underlying array-file knows the size of an element */
+rc_t array_file_read_dim1( af_data * af, const uint64_t pos,
+ void *dst, const uint64_t count,
+ uint64_t *n_read )
+{
+ rc_t rc = 0;
+ if ( af->content == NULL )
+ rc = KArrayFileRead ( af->af, 1, &pos, dst, &count, n_read );
+ else
+ {
+ if ( ( pos + count ) > af->extents[ 0 ] )
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ else
+ {
+ uint64_t buf_idx = ( af->element_bits >> 3 ) * pos;
+ size_t num = ( af->element_bits >> 3 ) * count;
+ char * src = af->content;
+ src+=buf_idx;
+ memmove( dst, src, num );
+ *n_read = count;
+ }
+ }
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "error reading arrayfile-data (1 dim)" );
+ return rc;
+}
+
+
+/* we are reading values in 2 dimensions from the array-file */
+rc_t array_file_read_dim2( af_data * af, const uint64_t pos,
+ void *dst, const uint64_t count,
+ const uint64_t ext2, uint64_t *n_read )
+{
+ rc_t rc = 0;
+ if ( af->content == NULL )
+ {
+ uint64_t pos2[ 2 ];
+ uint64_t read2[ 2 ];
+ uint64_t count2[ 2 ];
+ rc_t rc;
+
+ pos2[ 0 ] = pos;
+ pos2[ 1 ] = 0;
+ count2[ 0 ] = count;
+ count2[ 1 ] = ext2;
+ rc = KArrayFileRead ( af->af, 2, pos2, dst, count2, read2 );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "error reading arrayfile-data (2 dim)" );
+ *n_read = read2[ 0 ];
+ }
+ else
+ {
+ if ( ( pos + count ) > af->extents[ 0 ] )
+ rc = RC ( rcExe, rcNoTarg, rcLoading, rcData, rcInconsistent );
+ else
+ {
+ uint64_t buf_idx = ( af->element_bits >> 3 ) * pos * af->extents[ 1 ];
+ size_t num = ( af->element_bits >> 3 ) * count * af->extents[ 1 ];
+ char * src = af->content;
+ src+=buf_idx;
+ memmove( dst, src, num );
+ *n_read = count * af->extents[ 1 ];
+ }
+ }
+ return rc;
+}
+
+
+rc_t add_columns( VCursor * cursor, uint32_t count, int32_t exclude_this,
+ uint32_t * idx_vector, const char ** names )
+{
+ rc_t rc = 0;
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ if ( i != exclude_this )
+ {
+ rc = VCursorAddColumn( cursor, &(idx_vector[i]), "%s", names[i] );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot add column '$(name)' to vdb-cursor",
+ "name=%s", names[i] ) );
+ }
+ }
+ return rc;
+}
+
+bool check_table_count( af_data *tab, const char * name,
+ const uint64_t expected )
+{
+ bool res = ( tab->extents != NULL );
+ if ( res )
+ {
+ res = ( tab->extents[ 0 ] == expected );
+ if ( !res )
+ {
+ rc_t rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ PLOGERR( klogErr, ( klogErr, rc, "'$(name)'.count != expected",
+ "name=%s", name ) );
+ }
+ }
+ else
+ {
+ PLOGMSG( klogWarn, ( klogWarn, "Table ... '$(name)' not found", "name=%s", name ) );
+ }
+ return res;
+}
+
+
+rc_t transfer_bits( VCursor *cursor, const uint32_t col_idx,
+ af_data *src, char * buffer, const uint64_t offset, const uint64_t count,
+ const uint32_t n_bits, const char * explanation )
+{
+ uint64_t n_read;
+ rc_t rc = array_file_read_dim1( src, offset, buffer, count, &n_read );
+ if ( rc == 0 )
+ {
+ if ( count != n_read )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ PLOGERR( klogErr, ( klogErr, rc, "cannot read enought data from hdf5-table for '$(name)'",
+ "name=%s", explanation ) );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorWrite( cursor, col_idx, n_bits, buffer, 0, count );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot write data to vdb for '$(name)'",
+ "name=%s", explanation ) );
+ }
+ }
+ return rc;
+}
+
+
+rc_t vdb_write_value( VCursor *cursor, const uint32_t col_idx,
+ void * src, const uint32_t n_bits,
+ const uint32_t n_elem, const char *explanation )
+{
+ rc_t rc = VCursorWrite( cursor, col_idx, n_bits, src, 0, n_elem );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot write data to vdb for '$(name)'",
+ "name=%s", explanation ) );
+ return rc;
+}
+
+
+rc_t vdb_write_uint32( VCursor *cursor, const uint32_t col_idx,
+ uint32_t value, const char *explanation )
+{
+ return vdb_write_value( cursor, col_idx, &value, 32, 1, explanation );
+}
+
+
+rc_t vdb_write_uint16( VCursor *cursor, const uint32_t col_idx,
+ uint16_t value, const char *explanation )
+{
+ return vdb_write_value( cursor, col_idx, &value, 16, 1, explanation );
+}
+
+
+rc_t vdb_write_uint8( VCursor *cursor, const uint32_t col_idx,
+ uint8_t value, const char *explanation )
+{
+ return vdb_write_value( cursor, col_idx, &value, 8, 1, explanation );
+}
+
+
+rc_t vdb_write_float32( VCursor *cursor, const uint32_t col_idx,
+ float value, const char *explanation )
+{
+ return vdb_write_value( cursor, col_idx, &value, 32, 1, explanation );
+}
+
+
+rc_t prepare_table( VDatabase * database, VCursor ** cursor,
+ const char * template_name,
+ const char * table_name )
+{
+ VTable * table;
+ rc_t rc = VDatabaseCreateTable( database, &table, template_name,
+ kcmInit | kcmMD5 | kcmParents, "%s", table_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create vdb-table '$(name)'",
+ "name=%s", table_name ) );
+ }
+ else
+ {
+ rc = VTableCreateCursorWrite( table, cursor, kcmInsert );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create vdb-cursor for '$(name)'",
+ "name=%s", table_name ) );
+ }
+ VTableRelease( table );
+ }
+ return rc;
+}
+
+
+rc_t load_table( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx,
+ const char * template_name, const char * table_name, loader_func func )
+{
+ VTable * table;
+ rc_t rc = VDatabaseCreateTable( database, &table, template_name,
+ kcmInit | kcmMD5 | kcmParents, "%s", table_name );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create vdb-table '$(name)'",
+ "name=%s", table_name ) );
+ else
+ {
+ VCursor * cursor;
+ rc = VTableCreateCursorWrite( table, &cursor, kcmInsert );
+ if ( rc != 0 )
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create vdb-cursor for '$(name)'",
+ "name=%s", table_name ) );
+ else
+ {
+ VTableRelease( table );
+ rc = func( lctx, hdf5_src, cursor, table_name ); /* the callback does the job! */
+ VCursorRelease( cursor );
+ }
+ }
+ return rc;
+}
+
+
+rc_t progress_chunk( const KLoadProgressbar ** xml_progress, const uint64_t chunk )
+{
+ rc_t rc;
+ /* release the old progressbar... */
+ if ( *xml_progress != NULL )
+ {
+ KLoadProgressbar_Release( *xml_progress, false );
+ *xml_progress = NULL;
+ }
+ rc = KLoadProgressbar_Make( xml_progress, 0 );
+ if ( rc == 0 )
+ rc = KLoadProgressbar_Append( *xml_progress, chunk );
+ else
+ LOGERR( klogErr, rc, "cannot make KLoadProgressbar" );
+
+ return rc;
+}
+
+
+rc_t progress_step( const KLoadProgressbar * xml_progress )
+{
+ if ( xml_progress != NULL )
+ return KLoadProgressbar_Process( xml_progress, 1, false );
+ else
+ return 0;
+}
+
+
+void print_log_info( const char * info )
+{
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+ LOGMSG( klogInfo, info );
+ KLogLevelSet( tmp_lvl );
+}
+
+
+/* was once intended to make the SEQ-table a alias to the CONSENSU-table,
+ this step was removed, but the decision could be reinstate again
+ because of that the function to do so is still here */
+rc_t pacbio_make_alias( VDatabase * vdb_db,
+ const char *existing_obj, const char *alias_to_create )
+{
+ KDatabase *kdb;
+ rc_t rc = VDatabaseOpenKDatabaseUpdate ( vdb_db, & kdb );
+ if ( rc == 0 )
+ {
+ rc = KDatabaseAliasTable ( kdb, existing_obj, alias_to_create );
+ KDatabaseRelease ( kdb );
+ }
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-tools.h b/tools/pacbio-load/pl-tools.h
new file mode 100644
index 0000000..5b8618f
--- /dev/null
+++ b/tools/pacbio-load/pl-tools.h
@@ -0,0 +1,291 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pl_tools_
+#define _h_pl_tools_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <kfs/file.h>
+#include <kfs/arrayfile.h>
+#include <hdf5/kdf5.h>
+#include <kapp/log-xml.h>
+#include <kapp/progressbar.h>
+
+/* for zmw */
+#define HOLE_NUMBER_BITSIZE 32
+#define HOLE_NUMBER_COLS 1
+
+#define HOLE_STATUS_BITSIZE 8
+#define HOLE_STATUS_COLS 1
+
+#define HOLE_XY_BITSIZE 16
+#define HOLE_XY_COLS 2
+
+#define NUMEVENT_BITSIZE 32
+#define NUMEVENT_COLS 1
+
+#define NUMPASSES_BITSIZE 32
+#define NUMPASSES_COLS 1
+
+/* for BaseCalls_cmn */
+#define BASECALL_BITSIZE 8
+#define BASECALL_COLS 1
+
+#define QUALITY_VALUE_BITSIZE 8
+#define QUALITY_VALUE_COLS 1
+
+#define DELETION_QV_BITSIZE 8
+#define DELETION_QV_COLS 1
+
+#define DELETION_TAG_BITSIZE 8
+#define DELETION_TAG_COLS 1
+
+#define INSERTION_QV_BITSIZE 8
+#define INSERTION_QV_COLS 1
+
+#define SUBSTITUTION_QV_BITZISE 8
+#define SUBSTITUTION_QV_COLS 1
+
+#define SUBSTITUTION_TAG_BITSIZE 8
+#define SUBSTITUTION_TAG_COLS 1
+
+/* for regions */
+#define REGIONS_BITSIZE 32
+#define REGIONS_COLS 5
+
+/* for sequence */
+#define PRE_BASE_FRAMES_BITSIZE 16
+#define PRE_BASE_FRAMES_COLS 1
+
+#define PULSE_INDEX_BITSIZE_16 16
+#define PULSE_INDEX_BITSIZE_32 32
+#define PULSE_INDEX_COLS 1
+
+#define WIDTH_IN_FRAMES_BITSIZE 16
+#define WIDTH_IN_FRAMES_COLS 1
+
+/* for metrics */
+#define BASE_FRACTION_BITSIZE 32
+#define BASE_FRACTION_COLS 4
+
+#define BASE_IPD_BITSIZE 32
+#define BASE_IPD_COLS 1
+
+#define BASE_RATE_BITSIZE 32
+#define BASE_RATE_COLS 1
+
+#define BASE_WIDTH_BITSIZE 32
+#define BASE_WIDTH_COLS 1
+
+#define CM_BAS_QV_BITSIZE 32
+#define CM_BAS_QV_COLS 4
+
+#define CM_DEL_QV_BITSIZE 32
+#define CM_DEL_QV_COLS 4
+
+#define CM_INS_QV_BITSIZE 32
+#define CM_INS_QV_COLS 4
+
+#define CM_SUB_QV_BITSIZE 32
+#define CM_SUB_QV_COLS 4
+
+#define LOCAL_BASE_RATE_BITSIZE 32
+#define LOCAL_BASE_RATE_COLS 1
+
+#define DARK_BASE_RATE_BITSIZE 32
+#define DARK_BASE_RATE_COLS 1
+
+#define HQ_REGION_START_TIME_BITSIZE 32
+#define HQ_REGION_START_TIME_COLS 1
+
+#define HQ_REGION_END_TIME_BITSIZE 32
+#define HQ_REGION_END_TIME_COLS 1
+
+#define HQ_REGION_SNR_BITSIZE 32
+#define HQ_REGION_SNR_COLS 4
+
+#define PRODUCTIVITY_BITSIZE 8
+#define PRODUCTIVITY_COLS 1
+
+#define READ_SCORE_BITSIZE 32
+#define READ_SCORE_COLS 1
+
+#define RM_BAS_QV_BITSIZE 32
+#define RM_BAS_QV_COLS 1
+
+#define RM_DEL_QV_BITSIZE 32
+#define RM_DEL_QV_COLS 1
+
+#define RM_INS_QV_BITSIZE 32
+#define RM_INS_QV_COLS 1
+
+#define RM_SUB_QV_BITSIZE 32
+#define RM_SUB_QV_COLS 1
+
+/* for passes */
+#define ADAPTER_HIT_AFTER_BITSIZE 8
+#define ADAPTER_HIT_AFTER_COLS 1
+
+#define ADAPTER_HIT_BEFORE_BITSIZE 8
+#define ADAPTER_HIT_BEFORE_COLS 1
+
+#define PASS_DIRECTION_BITSIZE 8
+#define PASS_DIRECTION_COLS 1
+
+#define PASS_NUM_BASES_BITSIZE 32
+#define PASS_NUM_BASES_COLS 1
+
+#define PASS_START_BASE_BITSIZE 32
+#define PASS_START_BASE_COLS 1
+
+typedef struct ld_context
+{
+ const XMLLogger* xml_logger;
+ const KLoadProgressbar *xml_progress;
+ const char *dst_path;
+ uint64_t total_seq_bases;
+ uint64_t total_seq_spots;
+ bool with_progress;
+ bool total_printed;
+ bool cache_content;
+ bool check_src_obj;
+} ld_context;
+
+
+void lctx_init( ld_context * lctx );
+void lctx_free( ld_context * lctx );
+
+
+rc_t check_src_objects( const KDirectory *hdf5_dir,
+ const char ** groups,
+ const char **tables,
+ bool show_not_found );
+
+typedef struct af_data
+{
+ struct KFile const *f; /* the fake "file" from a HDF5-dir */
+ struct KArrayFile *af; /* the arrayfile made from f */
+ rc_t rc;
+ uint8_t dimensionality; /* how many dimensions the HDF5-dataset has */
+ uint64_t * extents; /* the extension in every dimension */
+ uint64_t element_bits; /* how big in bits is the element */
+ void * content; /* read the whole thing into memory */
+} af_data;
+
+
+void init_array_file( af_data * af );
+void free_array_file( af_data * af );
+
+rc_t open_array_file( const KDirectory *dir,
+ const char *name,
+ af_data * af,
+ const uint64_t expected_element_bits,
+ const uint64_t expected_cols,
+ bool disp_wrong_bitsize,
+ bool cache_content,
+ bool supress_err_msg );
+
+rc_t open_element( const KDirectory *hdf5_dir,
+ af_data *element,
+ const char * path,
+ const char * name,
+ const uint64_t expected_element_bits,
+ const uint64_t expected_cols,
+ bool disp_wrong_bitsize,
+ bool cache_content,
+ bool supress_err_msg );
+
+rc_t array_file_read_dim1( af_data * af, const uint64_t pos,
+ void *dst, const uint64_t count,
+ uint64_t *n_read );
+
+rc_t array_file_read_dim2( af_data * af, const uint64_t pos,
+ void *dst, const uint64_t count,
+ const uint64_t ext2, uint64_t *n_read );
+
+rc_t add_columns( VCursor * cursor, uint32_t count, int32_t exclude_this,
+ uint32_t * idx_vector, const char ** names );
+
+bool check_table_count( af_data *tab, const char * name,
+ const uint64_t expected );
+
+rc_t transfer_bits( VCursor *cursor, const uint32_t col_idx,
+ af_data *src, char * buffer, const uint64_t offset, const uint64_t count,
+ const uint32_t n_bits, const char * explanation );
+
+rc_t vdb_write_value( VCursor *cursor, const uint32_t col_idx,
+ void * src, const uint32_t n_bits,
+ const uint32_t n_elem, const char *explanation );
+
+rc_t vdb_write_uint32( VCursor *cursor, const uint32_t col_idx,
+ uint32_t value, const char *explanation );
+
+rc_t vdb_write_uint16( VCursor *cursor, const uint32_t col_idx,
+ uint16_t value, const char *explanation );
+
+rc_t vdb_write_uint8( VCursor *cursor, const uint32_t col_idx,
+ uint8_t value, const char *explanation );
+
+rc_t vdb_write_float32( VCursor *cursor, const uint32_t col_idx,
+ float value, const char *explanation );
+
+typedef rc_t (*loader_func)( ld_context *lctx,
+ KDirectory * hdf5_src, VCursor * cursor,
+ const char * table_name );
+
+rc_t prepare_table( VDatabase * database, VCursor ** cursor,
+ const char * template_name,
+ const char * table_name );
+
+rc_t load_table( VDatabase * database, KDirectory * hdf5_src, ld_context *lctx,
+ const char * template_name, const char * table_name,
+ loader_func func );
+
+rc_t progress_chunk( const KLoadProgressbar ** xml_progress, const uint64_t chunk );
+rc_t progress_step( const KLoadProgressbar * xml_progress );
+
+void print_log_info( const char * info );
+
+rc_t pacbio_make_alias( VDatabase * vdb_db,
+ const char *existing_obj, const char *alias_to_create );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/pl-zmw.c b/tools/pacbio-load/pl-zmw.c
new file mode 100644
index 0000000..6322c57
--- /dev/null
+++ b/tools/pacbio-load/pl-zmw.c
@@ -0,0 +1,221 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "pl-zmw.h"
+#include <sysalloc.h>
+
+void zmw_init( zmw_tab *tab )
+{
+ init_array_file( &tab->HoleNumber );
+ init_array_file( &tab->HoleStatus );
+ init_array_file( &tab->HoleXY );
+ init_array_file( &tab->NumEvent );
+ init_array_file( &tab->NumPasses );
+}
+
+
+void zmw_close( zmw_tab *tab )
+{
+ free_array_file( &tab->HoleNumber );
+ free_array_file( &tab->HoleStatus );
+ free_array_file( &tab->HoleXY );
+ free_array_file( &tab->NumEvent );
+ free_array_file( &tab->NumPasses );
+}
+
+
+rc_t zmw_open( const KDirectory *hdf5_dir, zmw_tab *tab,
+ const bool num_passes, const char * path, bool supress_err_msg )
+{
+ rc_t rc;
+
+ zmw_init( tab );
+ rc = open_element( hdf5_dir, &tab->HoleNumber, path, "ZMW/HoleNumber",
+ HOLE_NUMBER_BITSIZE, HOLE_NUMBER_COLS, true, false, supress_err_msg );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->HoleStatus, path, "ZMW/HoleStatus",
+ HOLE_STATUS_BITSIZE, HOLE_STATUS_COLS, true, false, supress_err_msg );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->HoleXY, path, "ZMW/HoleXY",
+ HOLE_XY_BITSIZE, HOLE_XY_COLS, true, false, supress_err_msg );
+ if ( rc == 0 )
+ rc = open_element( hdf5_dir, &tab->NumEvent, path, "ZMW/NumEvent",
+ NUMEVENT_BITSIZE, NUMEVENT_COLS, true, false, supress_err_msg );
+ if ( rc == 0 && num_passes )
+ rc = open_element( hdf5_dir, &tab->NumPasses, path, "Passes/NumPasses",
+ NUMPASSES_BITSIZE, NUMPASSES_COLS, true, false, supress_err_msg );
+
+ if ( rc != 0 )
+ zmw_close( tab ); /* releases only initialized elements */
+ return rc;
+}
+
+
+uint64_t zmw_total( zmw_tab *tab )
+{
+ rc_t rc = 0;
+ uint64_t res = 0, pos = 0;
+ uint64_t num_entries = tab->NumEvent.extents[0];
+
+ while( pos < num_entries && rc == 0 )
+ {
+ uint64_t n_read, to_read = ZMW_BLOCK_SIZE;
+ uint32_t d[ ZMW_BLOCK_SIZE ];
+
+ if ( ( pos + to_read ) >= num_entries )
+ to_read = ( num_entries - pos );
+ rc = array_file_read_dim1( &tab->NumEvent, pos, d, to_read, &n_read );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ pos+=n_read;
+ for ( i = 0; i < n_read; ++i )
+ res += d[ i ];
+ }
+ }
+ return res;
+}
+
+
+rc_t zmw_read_block( zmw_tab *tab, zmw_block * block,
+ const uint64_t total_spots,
+ const uint64_t pos,
+ const bool with_num_passes )
+{
+ rc_t rc;
+ uint64_t to_read = ZMW_BLOCK_SIZE;
+ uint64_t read_NumEvent, read_HoleNumber, read_HoleStatus,
+ read_HoleXY, read_NumPasses;
+
+ block->n_read = 0;
+ if ( ( pos + to_read ) >= total_spots )
+ to_read = ( total_spots - pos );
+ rc = array_file_read_dim1( &tab->NumEvent, pos, &block->NumEvent[0],
+ to_read, &read_NumEvent );
+ if ( rc == 0 )
+ rc = array_file_read_dim1( &tab->HoleNumber, pos, &block->HoleNumber[0],
+ to_read, &read_HoleNumber );
+ if ( rc == 0 )
+ rc = array_file_read_dim1( &tab->HoleStatus, pos, &block->HoleStatus[0],
+ to_read, &read_HoleStatus );
+ if ( rc == 0 )
+ rc = array_file_read_dim2( &tab->HoleXY, pos, &block->HoleXY[0],
+ to_read, 2, &read_HoleXY );
+ if ( rc == 0 && with_num_passes )
+ rc = array_file_read_dim1( &tab->NumPasses, pos, &block->NumPasses[0],
+ to_read, &read_NumPasses );
+ if ( rc == 0 )
+ {
+ if ( ( read_NumEvent != read_HoleNumber ) ||
+ ( read_NumEvent != read_HoleStatus ) ||
+ ( read_NumEvent != read_HoleXY ) )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ LOGERR( klogErr, rc, "Diff in NumEvents/HoleNumber/HoleStatus/HoleXY" );
+ }
+ else
+ {
+ if ( with_num_passes && read_NumEvent != read_NumPasses )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ LOGERR( klogErr, rc, "Diff in NumEvents/NumPasses" );
+ }
+ else
+ block->n_read = read_NumEvent;
+ }
+ }
+ return rc;
+}
+
+
+void zmw_block_row( zmw_block * block, zmw_row * row,
+ const uint32_t idx )
+{
+ row->NumEvent = block->NumEvent[ idx ];
+ row->HoleNumber = block->HoleNumber[ idx ];
+ row->HoleStatus = block->HoleStatus[ idx ];
+ row->HoleXY[ 0 ] = block->HoleXY[ idx * 2 ];
+ row->HoleXY[ 1 ] = block->HoleXY[ idx * 2 + 1 ];
+ row->NumPasses = block->NumPasses[ idx ];
+}
+
+
+
+rc_t zmw_for_each( zmw_tab *tab, const KLoadProgressbar ** xml_progress, VCursor * cursor,
+ bool with_progress, const uint32_t *col_idx, region_type_mapping *mapping,
+ const bool with_num_passes, zmw_on_row on_row, void * data )
+{
+ zmw_block block;
+ zmw_row row;
+ pl_progress *progress;
+ uint64_t pos = 0;
+ uint64_t total_rows = tab->NumEvent.extents[0];
+
+ rc_t rc = progress_chunk( xml_progress, total_rows );
+ if ( with_progress )
+ pl_progress_make( &progress, total_rows );
+ row.spot_nr = 0;
+ row.offset = 0;
+ while( pos < total_rows && rc == 0 )
+ {
+ rc = zmw_read_block( tab, &block, total_rows, pos, with_num_passes );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < block.n_read && rc == 0; ++i )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ zmw_block_row( &block, &row, i );
+ rc = on_row( cursor, col_idx, mapping, &row, data );
+ if ( rc == 0 )
+ {
+ rc = progress_step( *xml_progress );
+ if ( with_progress )
+ pl_progress_increment( progress, 1 );
+ }
+ row.offset += block.NumEvent[ i ];
+ row.spot_nr ++;
+ }
+ else
+ LOGERR( klogErr, rc, "...loading ZMW-table interrupted" );
+ }
+ pos += block.n_read;
+ }
+ }
+
+ if ( with_progress )
+ pl_progress_destroy( progress );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommit( cursor );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "cannot commit vdb-cursor on ZMW-table" );
+ }
+ return rc;
+}
diff --git a/tools/pacbio-load/pl-zmw.h b/tools/pacbio-load/pl-zmw.h
new file mode 100644
index 0000000..aebf7dd
--- /dev/null
+++ b/tools/pacbio-load/pl-zmw.h
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_pl_zmw_
+#define _h_pl_zmw_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pl-tools.h"
+#include "pl-progress.h"
+#include "pl-regions.h"
+#include <kapp/main.h>
+#include <klib/rc.h>
+
+typedef struct zmw_tab
+{
+ af_data HoleNumber;
+ af_data HoleStatus;
+ af_data HoleXY;
+ af_data NumEvent;
+ af_data NumPasses;
+} zmw_tab;
+
+
+#define ZMW_BLOCK_SIZE 8192
+
+typedef struct zmw_block
+{
+ uint32_t NumEvent[ ZMW_BLOCK_SIZE ];
+ uint32_t HoleNumber[ ZMW_BLOCK_SIZE ];
+ uint8_t HoleStatus[ ZMW_BLOCK_SIZE ];
+ uint16_t HoleXY[ ZMW_BLOCK_SIZE * 2 ];
+ uint32_t NumPasses[ ZMW_BLOCK_SIZE ];
+ uint64_t n_read;
+} zmw_block;
+
+
+typedef struct zmw_row
+{
+ uint64_t offset;
+ uint64_t spot_nr;
+
+ uint32_t NumEvent;
+ uint32_t HoleNumber;
+ uint16_t HoleXY[ 2 ];
+ uint8_t HoleStatus;
+ uint32_t NumPasses;
+} zmw_row;
+
+
+typedef rc_t (*zmw_on_row)( VCursor *cursor, const uint32_t *col_idx,
+ region_type_mapping *mapping,
+ zmw_row *row, void * data );
+
+
+void zmw_init( zmw_tab *tab );
+void zmw_close( zmw_tab *tab );
+
+rc_t zmw_open( const KDirectory *hdf5_dir, zmw_tab *tab,
+ const bool num_passes, const char * path, bool supress_err_msg );
+
+uint64_t zmw_total( zmw_tab *tab );
+
+rc_t zmw_read_block( zmw_tab *tab, zmw_block * block,
+ const uint64_t total_spots,
+ const uint64_t pos,
+ const bool with_num_passes );
+
+void zmw_block_row( zmw_block * block, zmw_row * row,
+ const uint32_t idx );
+
+
+rc_t zmw_for_each( zmw_tab *tab, const KLoadProgressbar ** xml_progress, VCursor * cursor,
+ bool with_progress, const uint32_t *col_idx, region_type_mapping *mapping,
+ const bool with_num_passes, zmw_on_row on_row, void * data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/pacbio-load/verify/ins_nl.pl b/tools/pacbio-load/verify/ins_nl.pl
new file mode 100755
index 0000000..f523787
--- /dev/null
+++ b/tools/pacbio-load/verify/ins_nl.pl
@@ -0,0 +1,15 @@
+#!/usr/bin/perl -w
+
+my $buffer = "";
+my $F_pos;
+my $F_in;
+
+open ( F_pos, $ARGV[1] ) or die "Could not open $ARGV[1]: $!\n";
+open ( F_in, $ARGV[0] ) or die "Could not open $ARGV[0]: $!\n";
+binmode( F_in );
+foreach $line ( <F_pos> )
+{
+ chomp ( $line ); # remove the newline from $line.
+ read ( F_in, $buffer, $line ); # read as many bytes as the line says...
+ print "$buffer\n";
+}
diff --git a/tools/pacbio-load/verify/ins_nl_1.pl b/tools/pacbio-load/verify/ins_nl_1.pl
new file mode 100755
index 0000000..9856a02
--- /dev/null
+++ b/tools/pacbio-load/verify/ins_nl_1.pl
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+my $buffer = "";
+my $F_pos;
+my $F_in;
+my $firstvalue;
+
+open ( F_pos, $ARGV[1] ) or die "Could not open $ARGV[1]: $!\n";
+open ( F_in, $ARGV[0] ) or die "Could not open $ARGV[0]: $!\n";
+binmode( F_in );
+foreach $line ( <F_pos> )
+{
+ chomp ( $line ); # remove the newline from $line.
+ read ( F_in, $buffer, $line ); # read as many bytes as the line says...
+ @charbuf = split( //, $buffer ); # split the buffer into an array of char's
+ $firstvalue = 1;
+ foreach ( @charbuf )
+ {
+ if ( $firstvalue == 1 )
+ {
+ printf ( "%d", ord( $_ ) );
+ $firstvalue = 0;
+ }
+ else
+ {
+ printf ( ", %d", ord( $_ ) );
+ }
+ }
+ print "\n";
+}
diff --git a/tools/pacbio-load/verify/ins_nl_2.pl b/tools/pacbio-load/verify/ins_nl_2.pl
new file mode 100755
index 0000000..a78f2fd
--- /dev/null
+++ b/tools/pacbio-load/verify/ins_nl_2.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+my $buffer = "";
+my $F_pos;
+my $F_in;
+my $nr;
+my $intval;
+
+open ( F_pos, $ARGV[1] ) or die "Could not open $ARGV[1]: $!\n";
+open ( F_in, $ARGV[0] ) or die "Could not open $ARGV[0]: $!\n";
+binmode( F_in );
+foreach $line ( <F_pos> )
+{
+ chomp ( $line ); # remove the newline from $line.
+ read ( F_in, $buffer, $line * 2 ); # read as many int16's as the line says...
+ for ( $nr = 0; $nr < $line; $nr++ )
+ {
+ if ( $nr > 0 ) { print ", "; }
+ # take 2 bytes (int16) from the buffer
+ $intval = substr( $buffer, $nr * 2, 2 );
+ print ( unpack( S, $intval ) ); # S ... unsigned int16
+ }
+ print "\n";
+}
diff --git a/tools/pacbio-load/verify/ins_nl_4.pl b/tools/pacbio-load/verify/ins_nl_4.pl
new file mode 100755
index 0000000..1f6e9a7
--- /dev/null
+++ b/tools/pacbio-load/verify/ins_nl_4.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl -w
+
+my $buffer = "";
+my $F_pos;
+my $F_in;
+my $nr;
+my $intval;
+
+open ( F_pos, $ARGV[1] ) or die "Could not open $ARGV[1]: $!\n";
+open ( F_in, $ARGV[0] ) or die "Could not open $ARGV[0]: $!\n";
+binmode( F_in );
+foreach $line ( <F_pos> )
+{
+ chomp ( $line ); # remove the newline from $line.
+ read ( F_in, $buffer, $line * 4 ); # read as many int32's as the line says...
+ for ( $nr = 0; $nr < $line; $nr++ )
+ {
+ if ( $nr > 0 ) { print ", "; }
+ # take 4 bytes (int32) from the buffer
+ $intval = substr( $buffer, $nr * 4, 4 );
+ print ( unpack( L, $intval ) ); # L ... unsigned int32
+ }
+ print "\n";
+}
diff --git a/tools/pacbio-load/verify/ins_nl_f.pl b/tools/pacbio-load/verify/ins_nl_f.pl
new file mode 100755
index 0000000..85aaa95
--- /dev/null
+++ b/tools/pacbio-load/verify/ins_nl_f.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -w
+
+my $buffer = "";
+my $F_in;
+my $nr;
+my $floatbuf;
+my $floatval;
+
+open ( F_in, $ARGV[0] ) or die "Could not open $ARGV[0]: $!\n";
+binmode( F_in );
+while ( <F_in> )
+{
+ if ( read ( F_in, $buffer, 16 ) == 16 ) # read 16 bytes = 4 x float 32
+ {
+ print "[";
+ for ( $nr = 0; $nr < 4; $nr++ )
+ {
+ if ( $nr > 0 ) { print ", "; }
+ # take 4 bytes (float32) from the buffer
+ $floatbuf = substr( $buffer, $nr * 4, 4 );
+ $floatval = unpack( 'f', $floatbuf ); # f ... float int32-bit
+ print $floatval;
+ }
+ print "]\n";
+ }
+}
+close ( F_in );
diff --git a/tools/pileup-stats/Makefile b/tools/pileup-stats/Makefile
new file mode 100644
index 0000000..13f0d18
--- /dev/null
+++ b/tools/pileup-stats/Makefile
@@ -0,0 +1,81 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/pileup-stats
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ pileup-stats
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# pileup-stats
+#
+PILEUP_STATS_SRC = \
+ pileup-stats
+
+PILEUP_STATS_OBJ = \
+ $(addsuffix .$(OBJX),$(PILEUP_STATS_SRC))
+
+PILEUP_STATS_LIB = \
+ -L$(LIBDIR) \
+ -L$(NGS_LIBDIR) \
+ -sgeneral-writer \
+ -sncbi-ngs-c++ \
+ -sncbi-vdb-static \
+ -sngs-c++ \
+ -skapp \
+ -stk-version \
+
+
+$(BINDIR)/pileup-stats: $(PILEUP_STATS_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(PILEUP_STATS_LIB)
diff --git a/tools/pileup-stats/pileup-stats.cpp b/tools/pileup-stats/pileup-stats.cpp
new file mode 100644
index 0000000..85ee80e
--- /dev/null
+++ b/tools/pileup-stats/pileup-stats.cpp
@@ -0,0 +1,776 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../general-loader/general-writer.hpp"
+
+#include <ngs/ncbi/NGS.hpp>
+#include <ngs/ReadCollection.hpp>
+#include <ngs/Reference.hpp>
+#include <ngs/Alignment.hpp>
+#include <ngs/Pileup.hpp>
+#include <ngs/PileupEvent.hpp>
+
+#include <kapp/main.h>
+#include <klib/printf.h>
+#include <klib/sra-release-version.h>
+#include <iomanip>
+
+#define DFLT_BUFFER_SIZE ( 32 * 1024 )
+
+#include <arch-impl.h>
+
+#include <iostream>
+#include <string.h>
+#include <ctype.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+
+using namespace ngs;
+
+namespace ncbi
+{
+ enum
+ {
+ col_RUN_NAME,
+ col_REFERENCE_SPEC,
+ col_REF_POS_TRANS,
+ col_DEPTH,
+ col_MISMATCH_COUNTS,
+ col_INSERTION_COUNTS,
+ col_DELETION_COUNT,
+
+ num_columns
+ };
+
+ static int tbl_id;
+ static int column_id [ num_columns ];
+ static uint8_t integer_column_flag_bits = 1; // pack integers by default
+ static int64_t zrow_id;
+
+ static uint32_t depth_cutoff = 1; // do not output if depth <= this value
+ static uint32_t event_cutoff = 1;
+ static uint32_t num_significant_bits = 4;
+
+ static uint32_t verbosity;
+ static bool use_gw_logmessage = true; // log via general-writer API rather than stderr
+
+ const bool need_write_true = false;
+
+ inline
+ uint32_t filter_significant_bits ( uint32_t val )
+ {
+ if ( val != 0 )
+ {
+ // we find the most significant bit in value
+ // which will be 0..31 for non-zero values
+ // from which we subtract the number of significant bits
+ // being retained ( - 1 to account for 0-based index )
+ //
+ // e.g.:
+ // val = 0x31, num_significant_bits = 4
+ // uint32_msbit ( val ) => 5, meaning the most significant bit is 5,
+ // which says there are 6 significant bits in total. we only want to
+ // keep 4, however.
+ // mask_index = 5 - ( 4 - 1 ) => 2
+ // 0xFFFFFFFF << mask_index => 0xFFFFFFFC
+ // val then becomes 0x30
+ int mask_index = uint32_msbit ( val ) - ( int ) ( num_significant_bits - 1 );
+ if ( mask_index > 0 )
+ {
+ // this is a positive quantity
+ assert ( mask_index <= 31 );
+ val = val & ( 0xFFFFFFFF << mask_index );
+ }
+ }
+
+ return val;
+ }
+
+ static
+ void run (
+ GeneralWriter & out,
+ const String & runName, const String & refName, PileupIterator & pileup, uint64_t refLength, uint64_t refLengthSubTotal, uint64_t refLengthTotal )
+ {
+ int64_t ref_zpos, last_writ = 0;
+ bool need_write = false;
+
+ for ( ref_zpos = -1; pileup . nextPileup (); ++ ref_zpos, ++ zrow_id )
+ {
+ if ( ref_zpos < 0 )
+ {
+ last_writ = ref_zpos = pileup . getReferencePosition ();
+ int64_t ref_pos_trans = ref_zpos - zrow_id;
+ out . columnDefault ( column_id [ col_REF_POS_TRANS ], 64, & ref_pos_trans, 1 );
+ need_write = need_write_true;
+ }
+
+ switch ( verbosity )
+ {
+ case 0:
+ break;
+ case 1:
+ if ( ( ref_zpos % 1000000 ) == 0 )
+ {
+ if ( ncbi :: use_gw_logmessage )
+ out . progMsg ( refName, KAppVersion(), ref_zpos + refLengthSubTotal , refLengthTotal );
+ else
+ std :: cerr << "# " << std :: setw ( 9 ) << ref_zpos << '\n';
+ }
+ break;
+ default:
+ if ( ( ref_zpos % 5000 ) == 0 )
+ {
+ if ( ncbi :: use_gw_logmessage )
+ out . progMsg ( refName, KAppVersion(), ref_zpos + refLengthSubTotal , refLengthTotal );
+ else
+ {
+ if ( ( ref_zpos % 500000 ) == 0 )
+ std :: cerr << "\n# " << std :: setw ( 9 ) << ref_zpos << ' ';
+ std :: cerr << '.';
+ }
+ }
+ }
+
+ uint32_t ref_base_idx = 0;
+ bool ref_ambiguous = false;
+ char ref_base = pileup . getReferenceBase ();
+ switch ( toupper ( ref_base ) )
+ {
+ case 'A': break;
+ case 'C': ref_base_idx = 1; break;
+ case 'G': ref_base_idx = 2; break;
+ case 'T': ref_base_idx = 3; break;
+ default:
+ ref_base_idx = 0;
+ ref_ambiguous = true;
+ }
+
+ uint32_t depth = pileup . getPileupDepth ();
+
+ uint32_t mismatch_counts [ 4 ];
+ memset ( mismatch_counts, 0, sizeof mismatch_counts );
+
+ uint32_t ins_counts [ 4 ];
+ memset ( ins_counts, 0, sizeof ins_counts );
+
+ uint32_t del_cnt = 0;
+
+ if ( depth > depth_cutoff )
+ {
+ char mismatch;
+ uint32_t mismatch_idx;
+
+ while ( pileup . nextPileupEvent () )
+ {
+ PileupEvent :: PileupEventType et = pileup . getEventType ();
+ switch ( et & 7 )
+ {
+ case PileupEvent :: match:
+
+ if ( ! ref_ambiguous )
+ {
+ handle_N_in_mismatch:
+ if ( ( et & PileupEvent :: insertion ) != 0 )
+ ++ ins_counts [ ref_base_idx ];
+ break;
+ }
+ // intentional fall-through
+
+ case PileupEvent :: mismatch:
+ mismatch = pileup . getAlignmentBase ();
+ mismatch_idx = 0;
+ switch ( toupper ( mismatch ) )
+ {
+ case 'A': break;
+ case 'C': mismatch_idx = 1; break;
+ case 'G': mismatch_idx = 2; break;
+ case 'T': mismatch_idx = 3; break;
+ default:
+ // treat N by removing this event from depth
+ -- depth;
+ goto handle_N_in_mismatch;
+ }
+
+ // first, assert that mismatch_idx cannot be ref_base_idx
+ assert ( ref_ambiguous || mismatch_idx != ref_base_idx );
+
+ // count insertions
+ if ( ( et & PileupEvent :: insertion ) != 0 )
+ ++ ins_counts [ mismatch_idx ];
+ // count the mismatches
+ ++ mismatch_counts [ mismatch_idx ];
+ break;
+
+ case PileupEvent :: deletion:
+ if ( pileup . getEventIndelType () == PileupEvent :: normal_indel )
+ ++ del_cnt;
+ else
+ -- depth;
+ break;
+ }
+ }
+ }
+
+ if ( depth > depth_cutoff )
+ {
+ int i;
+
+ if ( del_cnt <= event_cutoff )
+ del_cnt = 0;
+
+ bool have_mismatch = false;
+ for ( i = 0; i < 4; ++ i )
+ {
+ if ( mismatch_counts [ i ] <= event_cutoff )
+ mismatch_counts [ i ] = 0;
+ else
+ have_mismatch = true;
+ }
+
+ bool have_inserts = false;
+ for ( i = 0; i < 4; ++ i )
+ {
+ if ( ins_counts [ i ] <= event_cutoff )
+ ins_counts [ i ] = 0;
+ else
+ have_inserts = true;
+ }
+
+ if ( num_significant_bits != 0 )
+ {
+ depth = filter_significant_bits ( depth );
+ del_cnt = filter_significant_bits ( del_cnt );
+ for ( i = 0; i < 4; ++ i )
+ mismatch_counts [ i ] = filter_significant_bits ( mismatch_counts [ i ] );
+ for ( i = 0; i < 4; ++ i )
+ ins_counts [ i ] = filter_significant_bits ( ins_counts [ i ] );
+ }
+
+
+ if ( ref_zpos > last_writ )
+ out . moveAhead ( tbl_id, ref_zpos - last_writ );
+ out . write ( column_id [ col_DEPTH ], sizeof depth * 8, & depth, 1 );
+ if ( have_mismatch )
+ out . write ( column_id [ col_MISMATCH_COUNTS ], sizeof mismatch_counts [ 0 ] * 8, mismatch_counts, 4 );
+ if ( have_inserts )
+ out . write ( column_id [ col_INSERTION_COUNTS ], sizeof ins_counts [ 0 ] * 8, ins_counts, 4 );
+ if ( del_cnt != 0 )
+ out . write ( column_id [ col_DELETION_COUNT ], sizeof del_cnt * 8, & del_cnt, 1 );
+ out . nextRow ( tbl_id );
+ last_writ = ref_zpos + 1;
+ }
+ else if ( need_write )
+ {
+ out . nextRow ( tbl_id );
+ need_write = false;
+ }
+
+ }
+ if ( ref_zpos > last_writ )
+ out . moveAhead ( tbl_id, ref_zpos - last_writ );
+ }
+
+ static
+ void prepareOutput ( GeneralWriter & out, const String & runName )
+ {
+ // add table
+ tbl_id = out . addTable ( "STATS" );
+
+ // add each column
+ column_id [ col_RUN_NAME ] = out . addColumn ( tbl_id, "RUN_NAME", 8 );
+ column_id [ col_REFERENCE_SPEC ] = out . addColumn ( tbl_id, "REFERENCE_SPEC", 8 );
+ column_id [ col_REF_POS_TRANS ] = out . addColumn ( tbl_id, "REF_POS_TRANS", 64, 0 );
+ column_id [ col_DEPTH ] = out . addColumn ( tbl_id, "DEPTH", 32, integer_column_flag_bits );
+ column_id [ col_MISMATCH_COUNTS ] = out . addColumn ( tbl_id, "MISMATCH_COUNTS", 32, integer_column_flag_bits );
+ column_id [ col_INSERTION_COUNTS ] = out . addColumn ( tbl_id, "INSERTION_COUNTS", 32, integer_column_flag_bits );
+ column_id [ col_DELETION_COUNT ] = out . addColumn ( tbl_id, "DELETION_COUNT", 32, integer_column_flag_bits );
+
+ // open the stream
+ out . open ();
+
+ // set default values
+ out . columnDefault ( column_id [ col_RUN_NAME ], 8, runName . data (), runName . size () );
+ out . columnDefault ( column_id [ col_DEPTH ], 32, "", 0 );
+ out . columnDefault ( column_id [ col_MISMATCH_COUNTS ], 32, "", 0 );
+ out . columnDefault ( column_id [ col_INSERTION_COUNTS ], 32, "", 0 );
+ out . columnDefault ( column_id [ col_DELETION_COUNT ], 32, "", 0 );
+ }
+
+ static
+ void set_software ( GeneralWriter & out )
+ {
+ char vers_str [ 64 ];
+ ver_t version = KAppVersion ();
+ string_printf ( vers_str, sizeof vers_str, NULL, "%V", version );
+ out . setSoftwareName ( "pileup-stats", vers_str );
+ }
+
+ static
+ void run ( const char * spec, const char *outfile, const char *_remote_db, size_t buffer_size, Alignment :: AlignmentCategory cat )
+ {
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ if ( verbosity > 0 )
+ std :: cerr << "# Opening run '" << spec << "'\n";
+ }
+ ReadCollection obj = ncbi :: NGS :: openReadCollection ( spec );
+ String runName = obj . getName ();
+
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ if ( verbosity > 0 )
+ {
+ std :: cerr << "# Preparing version " << GW_CURRENT_VERSION << " pipe to stdout\n";
+ if ( ( integer_column_flag_bits & 1 ) != 0 )
+ std :: cerr << "# USING INTEGER PACKING\n";
+ }
+ }
+
+ std :: string remote_db;
+ if ( _remote_db == NULL )
+ remote_db = runName + ".pileup_stat";
+ else
+ remote_db = _remote_db;
+
+ GeneralWriter *outp = ( outfile == NULL ) ?
+ new GeneralWriter ( 1, buffer_size ) : new GeneralWriter ( outfile );
+
+ try
+ {
+ GeneralWriter &out = *outp;
+
+ // set software node
+ set_software ( out );
+
+ // add remote db event
+ out . setRemotePath ( remote_db );
+
+ // use schema
+ out . useSchema ( "align/pileup-stats.vschema", "NCBI:pileup:db:pileup_stats #1" );
+
+ prepareOutput ( out, runName );
+ if ( verbosity > 0 )
+ {
+ if ( ncbi :: use_gw_logmessage )
+ out . logMsg ( "Accessing all references" );
+ else
+ std :: cerr << "# Accessing all references\n";
+ }
+
+
+
+ // get the total number of references
+ uint64_t totalRefLength = 0;
+ {
+ ReferenceIterator rf = obj . getReferences ();
+ while ( rf . nextReference () )
+ totalRefLength += rf . getLength ();
+ }
+
+ ReferenceIterator ref = obj . getReferences ();
+
+ uint64_t refLengthSubTotal = 0;
+ while ( ref . nextReference () )
+ {
+ String refName = ref . getCanonicalName ();
+
+ //get the length of the reference so that progress can be given
+ uint64_t refLength = ref . getLength ();
+
+ if ( verbosity > 0 )
+ {
+ if ( ncbi :: use_gw_logmessage )
+ out . logMsg ( "Processing reference '" + refName + "'" );
+ else
+ std :: cerr << "# Processing reference '" << refName << "'\n";
+ }
+ out . columnDefault ( column_id [ col_REFERENCE_SPEC ], 8, refName . data (), refName . size () );
+
+ if ( verbosity > 0 )
+ {
+ if ( ncbi :: use_gw_logmessage )
+ out . logMsg ( "Accessing all pileups" );
+ else
+ std :: cerr << "# Accessing all pileups\n";
+ }
+ PileupIterator pileup = ref . getPileups ( cat );
+ run ( out, runName, refName, pileup, refLength, refLengthSubTotal, totalRefLength );
+
+ refLengthSubTotal += refLength;
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ if ( verbosity > 1 )
+ std :: cerr << '\n';
+ }
+ }
+ }
+ catch ( ErrorMsg & x )
+ {
+ outp -> logError ( x . what () );
+ delete outp;
+ throw;
+ }
+ catch ( const char x [] )
+ {
+ outp -> logError ( x );
+ delete outp;
+ throw;
+ }
+ catch ( ... )
+ {
+ outp -> logError ( "unknown exception" );
+ delete outp;
+ throw;
+ }
+ delete outp;
+ }
+}
+
+extern "C"
+{
+ rc_t CC Usage ( struct Args const * args )
+ {
+ return 0;
+ }
+
+ const char UsageDefaultName [] = "pileup-stats";
+
+ static
+ const char * getArg ( int & i, int argc, char * argv [] )
+ {
+
+ if ( ++ i == argc )
+ throw "Missing argument";
+
+ return argv [ i ];
+ }
+
+ static
+ const char * findArg ( const char* &arg, int & i, int argc, char * argv [] )
+ {
+ if ( arg [ 1 ] != 0 )
+ {
+ const char * next = arg + 1;
+ arg = "\0";
+ return next;
+ }
+
+ return getArg ( i, argc, argv );
+ }
+
+ static void handle_help ( const char *appName )
+ {
+ const char *appLeaf = strrchr ( appName, '/' );
+ if ( appLeaf ++ == 0 )
+ appLeaf = appName;
+
+ ver_t vers = KAppVersion ();
+
+ std :: cout
+ << '\n'
+ << "Usage:\n"
+ << " " << appLeaf << " [options] <accession>"
+ << "\n\n"
+ << "Options:\n"
+ << " -o|--output-file file for output\n"
+ << " (default pipe to stdout)\n"
+ << " -r|--remote-db name of remote database to create\n"
+ << " (default <accession>.pileup_stat)\n"
+ << " -x|--depth-cutoff cutoff for depth <= value (default 1)\n"
+ << " -e|--event-cutoff cutoff for number of events > value (default " << ncbi::event_cutoff << ")\n"
+ << " -p|--num-significant-bits number of significant bits for depth and counts to store (default " << ncbi::num_significant_bits << ")\n"
+ << " -a|--align-category the types of alignments to pile up:\n"
+ << " { primary, secondary, all } (default primary)\n"
+ << " --buffer-size bytes size of output pipe buffer - default " << DFLT_BUFFER_SIZE/1024 << "K bytes\n"
+ << " -U|--unpack-integer don't pack integers in output pipe - uses more bandwidth\n"
+ << " -h|--help output brief explanation of the program\n"
+ << " -v|--verbose increase the verbosity of the program.\n"
+ << " -V|--version display the version of the program then quit.\n"
+ << " use multiple times for more verbosity.\n"
+ << " --log-stderr log via stderr rather than general-writer API (default - general-writer API)\n"
+ << '\n'
+ << appName << " : "
+ << ( vers >> 24 )
+ << '.'
+ << ( ( vers >> 16 ) & 0xFF )
+ << '.'
+ << ( vers & 0xFFFF )
+ << '\n'
+ << '\n'
+ ;
+ }
+
+ static void handle_version ( const char *progname )
+ {
+ ::ver_t vers = ::KAppVersion();
+
+ HelpVersion ( progname, vers );
+ }
+
+ static void CC handle_error ( const char *arg, void *message )
+ {
+ throw ( const char * ) message;
+ }
+
+ rc_t CC UsageSummary ( const char * progname ) {
+ handle_help ( progname );
+ return 0;
+ }
+
+ rc_t CC KMain ( int argc, char *argv [] )
+ {
+ rc_t rc = -1;
+ Alignment :: AlignmentCategory cat = Alignment :: primaryAlignment;
+ size_t buffer_size = DFLT_BUFFER_SIZE;
+ try
+ {
+ int num_runs = 0;
+ const char *outfile = NULL;
+ const char *remote_db = NULL;
+
+ for ( int i = 1; i < argc; ++ i )
+ {
+ const char * arg = argv [ i ];
+ if ( arg [ 0 ] != '-' )
+ {
+ // have an input run
+ argv [ ++ num_runs ] = ( char* ) arg;
+ }
+ else do switch ( ( ++ arg ) [ 0 ] )
+ {
+ case 'o':
+ outfile = findArg ( arg, i, argc, argv );
+ break;
+ case 'r':
+ remote_db = findArg ( arg, i, argc, argv );
+ break;
+ case 'x':
+ ncbi :: depth_cutoff = AsciiToU32 ( findArg ( arg, i, argc, argv ),
+ handle_error, ( void * ) "Invalid depth cutoff" );
+ break;
+ case 'e':
+ ncbi :: event_cutoff = AsciiToU32 ( findArg ( arg, i, argc, argv ),
+ handle_error, ( void * ) "Invalid event cutoff" );
+ break;
+ case 'p':
+ ncbi :: num_significant_bits = AsciiToU32 ( findArg ( arg, i, argc, argv ),
+ handle_error, ( void * ) "Invalid num-significant-bits" );
+ break;
+ case 'a':
+ {
+ const char * atype = findArg ( arg, i, argc, argv );
+ if ( strcmp ( atype, "all" ) == 0 )
+ cat = Alignment :: all;
+ else if ( strcmp ( atype, "primary" ) == 0 ||
+ strcmp ( atype, "primaryAlignment" ) == 0 )
+ cat = Alignment :: primaryAlignment;
+ else if ( strcmp ( atype, "secondary" ) == 0 ||
+ strcmp ( atype, "secondaryAlignment" ) == 0 )
+ cat = Alignment :: secondaryAlignment;
+ else
+ {
+ throw "Invalid alignment category";
+ }
+ break;
+ }
+ case 'U':
+ ncbi :: integer_column_flag_bits = 0;
+ break;
+ case 'v':
+ ++ ncbi :: verbosity;
+ break;
+ case 'h':
+ case '?':
+ handle_help ( argv [ 0 ] );
+ return 0;
+ case 'V':
+ handle_version ( argv [ 0 ] );
+ return 0;
+ case 'L': // eat it and do nothing
+ findArg ( arg, i, argc, argv );
+ break;
+ case 'z': // eat it and do nothing
+ findArg ( arg, i, argc, argv );
+ break;
+ case '-':
+ ++ arg;
+ if ( strcmp ( arg, "output-file" ) == 0 )
+ {
+ outfile = getArg ( i, argc, argv );
+ }
+ else if ( strcmp ( arg, "remote-db" ) == 0 )
+ {
+ remote_db = getArg ( i, argc, argv );
+ }
+ else if ( strcmp ( arg, "buffer-size" ) == 0 )
+ {
+ const char * str = getArg ( i, argc, argv );
+
+ char * end;
+ long new_buffer_size = strtol ( str, & end, 0 );
+ if ( new_buffer_size < 0 || str == ( const char * ) end || end [ 0 ] != 0 )
+ throw "Invalid buffer argument";
+
+ buffer_size = new_buffer_size;
+ }
+ else if ( strcmp ( arg, "depth-cutoff" ) == 0 )
+ {
+ ncbi :: depth_cutoff = AsciiToU32 ( getArg ( i, argc, argv ),
+ handle_error, ( void * ) "Invalid depth cutoff" );
+ }
+ else if ( strcmp ( arg, "event-cutoff" ) == 0 )
+ {
+ ncbi :: event_cutoff = AsciiToU32 ( getArg ( i, argc, argv ),
+ handle_error, ( void * ) "Invalid event cutoff" );
+ }
+ else if ( strcmp ( arg, "num-significant-bits" ) == 0 )
+ {
+ ncbi :: num_significant_bits = AsciiToU32 ( getArg ( i, argc, argv ),
+ handle_error, ( void * ) "Invalid num-significant-bits" );
+ }
+ else if ( strcmp ( arg, "align-category" ) == 0 )
+ {
+ const char * atype = getArg ( i, argc, argv );
+ if ( strcmp ( atype, "all" ) == 0 )
+ cat = Alignment :: all;
+ else if ( strcmp ( atype, "primary" ) == 0 ||
+ strcmp ( atype, "primaryAlignment" ) == 0 )
+ cat = Alignment :: primaryAlignment;
+ else if ( strcmp ( atype, "secondary" ) == 0 ||
+ strcmp ( atype, "secondaryAlignment" ) == 0 )
+ cat = Alignment :: secondaryAlignment;
+ else
+ {
+ throw "Invalid alignment category";
+ }
+ }
+ else if ( strcmp ( arg, "unpack-integer" ) == 0 )
+ {
+ ncbi :: integer_column_flag_bits = 0;
+ }
+ else if ( strcmp ( arg, "verbose" ) == 0 )
+ {
+ ++ ncbi :: verbosity;
+ }
+ else if ( strcmp ( arg, "log-stderr" ) == 0 )
+ {
+ ncbi :: use_gw_logmessage = false;
+ }
+ else if ( strcmp ( arg, "help" ) == 0 )
+ {
+ handle_help ( argv [ 0 ] );
+ return 0;
+ }
+ else if ( strcmp ( arg, "version" ) == 0 )
+ {
+ handle_version ( argv [ 0 ] );
+ return 0;
+ }
+ else if ( strcmp ( arg, "log-level" ) == 0 )
+ {
+ /* eat it and do nothing */
+ getArg ( i, argc, argv );
+ }
+ else if ( strcmp ( arg, "xml-log" ) == 0 )
+ {
+ /* eat it and do nothing */
+ getArg ( i, argc, argv );
+ }
+ else if ( strcmp ( arg, "xml-log-fd" ) == 0 )
+ {
+ /* eat it and do nothing */
+ getArg ( i, argc, argv );
+ }
+ else if ( strcmp ( arg, "version" ) == 0 )
+ {
+ handle_version ( argv [ 0 ] );
+ return 0;
+ }
+ else
+ {
+ throw "Invalid Argument";
+ }
+
+ arg = "\0";
+
+ break;
+ default:
+ throw "Invalid argument";
+ }
+ while ( arg [ 1 ] != 0 );
+ }
+
+ if ( num_runs > 1 )
+ throw "only one run may be processed at a time";
+ for ( int i = 1; i <= num_runs; ++ i )
+ {
+ ncbi :: run ( argv [ i ], outfile, remote_db, buffer_size, cat );
+ }
+
+ rc = 0;
+ }
+ catch ( ErrorMsg & x )
+ {
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ std :: cerr
+ << "ERROR: "
+ << argv [ 0 ]
+ << ": "
+ << x . what ()
+ << '\n'
+ ;
+ }
+ }
+ catch ( const char x [] )
+ {
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ std :: cerr
+ << "ERROR: "
+ << argv [ 0 ]
+ << ": "
+ << x
+ << '\n'
+ ;
+ }
+ }
+ catch ( ... )
+ {
+ if ( ! ncbi :: use_gw_logmessage )
+ {
+ std :: cerr
+ << "ERROR: "
+ << argv [ 0 ]
+ << ": unknown\n"
+ ;
+ }
+ }
+
+ return rc;
+ }
+}
diff --git a/tools/prefetch/Makefile b/tools/prefetch/Makefile
new file mode 100644
index 0000000..c8e43dd
--- /dev/null
+++ b/tools/prefetch/Makefile
@@ -0,0 +1,93 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/prefetch
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ prefetch \
+# aget
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# prefetch
+#
+PREFETCH_SRC = \
+ prefetch \
+ kfile-no-q
+
+PREFETCH_OBJ = \
+ $(addsuffix .$(OBJX),$(PREFETCH_SRC))
+
+PREFETCH_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+
+$(BINDIR)/prefetch: $(PREFETCH_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(PREFETCH_LIB)
+
+#-------------------------------------------------------------------------------
+# aget
+#
+GET_SRC = \
+ aget \
+ getAscp
+
+GET_OBJ = \
+ $(addsuffix .$(OBJX),$(GET_SRC))
+
+$(BINDIR)/aget: $(GET_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(PREFETCH_LIB)
+
diff --git a/tools/prefetch/kfile-no-q.c b/tools/prefetch/kfile-no-q.c
new file mode 100644
index 0000000..073220a
--- /dev/null
+++ b/tools/prefetch/kfile-no-q.c
@@ -0,0 +1,215 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "kfile-no-q.h"
+
+#include <kapp/main.h>
+
+#include <klib/log.h>
+#include <klib/status.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/arc.h>
+#include <kfs/sra.h>
+
+#include <assert.h>
+#include <string.h>
+
+#define READ_CACHE_BLOCK_SIZE (1024*1024)
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define STS_FIN 3
+
+typedef rc_t ( * FileProcessFn ) ( const KDirectory_v1 * dir, const char * name );
+
+typedef struct {
+ FileProcessFn processFn;
+
+ bool elimQuals;
+} VisitParams;
+
+static
+bool qual_col_filter ( const KDirectory * self, const char * path, void * data )
+{
+ if ( strstr(path, "col/QUALITY") == NULL )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+static
+rc_t sort_none (const KDirectory * self, struct Vector * v)
+{
+ return 0;
+}
+
+static
+rc_t visit_cb ( const KDirectory * self, uint32_t type, const char * name, void * data )
+{
+ rc_t rc = 0;
+ VisitParams * params = data;
+
+ assert(params);
+
+ if (params->processFn == NULL)
+ return rc;
+
+ if (type == kptFile)
+ {
+ if (params->elimQuals)
+ {
+ char path[PATH_MAX];
+ rc = KDirectoryResolvePath ( self, true, path, sizeof path, name );
+
+ if (rc == 0 && ( strstr(path, "/col/QUALITY/") == NULL ) )
+ {
+ rc = params->processFn(self, name);
+ }
+ }
+ else
+ {
+ rc = params->processFn(self, name);
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t file_read ( const KDirectory * dir, const char * name )
+{
+ rc_t rc;
+ const KFile * kfile;
+ char buffer[READ_CACHE_BLOCK_SIZE];
+ uint64_t pos = 0;
+ uint64_t prevPos = 0;
+ size_t num_read;
+
+
+ rc = KDirectoryOpenFileRead ( dir, &kfile, name );
+ if (rc != 0)
+ return rc;
+
+ do {
+ bool print = pos - prevPos > 200000000;
+ rc = Quitting();
+
+ if (rc == 0) {
+ if (print) {
+ STSMSG(STS_FIN,
+ ("Reading %lu bytes from pos. %lu", READ_CACHE_BLOCK_SIZE, pos));
+ }
+ rc = KFileRead(kfile,
+ pos, buffer, READ_CACHE_BLOCK_SIZE, &num_read);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "KFileRead failed for file $(name)",
+ "name=%S", name));
+ }
+ else {
+ pos += num_read;
+ }
+
+ if (print) {
+ prevPos = pos;
+ }
+ }
+ } while (rc == 0 && num_read > 0);
+
+ KFileRelease(kfile);
+
+ return rc;
+}
+
+rc_t CC KSraFileNoQuals( const struct KFile * self,
+ const struct KFile ** kfile )
+{
+ rc_t rc;
+ struct KDirectory * kdir_native, * kdir_virtual;
+ const struct KFile * new_kfile;
+
+ assert(self != NULL);
+ assert(kfile != NULL);
+
+ rc = KDirectoryNativeDir(&kdir_native);
+ if (rc != 0)
+ {
+ return rc;
+ }
+
+ rc = KDirectoryOpenArcDirRead_silent_preopened ( kdir_native, (const struct KDirectory **)&kdir_virtual, false, "/virtual", tocKFile,
+ ( void* ) self, KArcParseSRA, NULL, NULL );
+ if (rc == 0)
+ {
+ rc = KDirectoryOpenTocFileRead (kdir_virtual, &new_kfile, sraAlign4Byte, qual_col_filter, NULL, sort_none );
+ KDirectoryRelease (kdir_virtual);
+
+ if (rc == 0)
+ {
+ *kfile = new_kfile;
+ }
+ }
+
+ KDirectoryRelease (kdir_native);
+
+ return 0;
+}
+
+rc_t CC KSraReadCacheFile( const struct KFile * self, bool elimQuals )
+{
+ rc_t rc;
+ struct KDirectory * kdir_native, * kdir_virtual;
+
+
+ assert(self != NULL);
+
+ rc = KDirectoryNativeDir(&kdir_native);
+ if (rc != 0)
+ {
+ return rc;
+ }
+
+ rc = KDirectoryOpenArcDirRead_silent_preopened ( kdir_native, (const struct KDirectory **)&kdir_virtual, false, "/virtual", tocKFile,
+ ( void* ) self, KArcParseSRA, NULL, NULL );
+ if (rc == 0)
+ {
+ VisitParams params;
+ params.elimQuals = elimQuals;
+ params.processFn = &file_read;
+
+ rc = KDirectoryVisit(kdir_virtual, true, visit_cb, ¶ms, ".");
+ KDirectoryRelease (kdir_virtual);
+ }
+
+ KDirectoryRelease (kdir_native);
+
+ return 0;
+}
diff --git a/tools/prefetch/kfile-no-q.h b/tools/prefetch/kfile-no-q.h
new file mode 100644
index 0000000..c123720
--- /dev/null
+++ b/tools/prefetch/kfile-no-q.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_kfile_no_q_
+#define _h_kfile_no_q_
+
+#include <klib/rc.h>
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+
+
+rc_t CC KSraFileNoQuals( const struct KFile * self,
+ const struct KFile ** kfile );
+
+rc_t CC KSraReadCacheFile( const struct KFile * self, bool elimQuals );
+
+
+#endif /* _h_kfile_no_q_ */
diff --git a/tools/prefetch/prefetch.c b/tools/prefetch/prefetch.c
new file mode 100644
index 0000000..d02e794
--- /dev/null
+++ b/tools/prefetch/prefetch.c
@@ -0,0 +1,3679 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/********** includes **********/
+
+#include <kapp/args-conv.h> /* ArgsConvFilepath */
+#include <kapp/main.h> /* KAppVersion */
+
+#include <kdb/manager.h> /* kptDatabase */
+
+#include <kfg/config.h> /* KConfig */
+#include <kfg/kart.h> /* Kart */
+#include <kfg/repository.h> /* KRepositoryMgr */
+
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/dependencies.h> /* VDBDependencies */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/vdb-priv.h> /* VDatabaseIsCSRA */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+#include <vfs/resolver.h> /* VResolver */
+
+#include <kns/ascp.h> /* ascp_locate */
+#include <kns/manager.h>
+#include <kns/stream.h> /* KStreamRelease */
+#include <kns/kns-mgr-priv.h>
+#include <kns/http.h>
+
+#include <kfs/file.h> /* KFile */
+#include <kfs/gzip.h> /* KFileMakeGzipForRead */
+#include <kfs/subfile.h> /* KFileMakeSubRead */
+#include <kfs/cacheteefile.h> /* KDirectoryMakeCacheTee */
+
+#include <klib/container.h> /* BSTree */
+#include <klib/data-buffer.h> /* KDataBuffer */
+#include <klib/log.h> /* PLOGERR */
+#include <klib/out.h> /* KOutMsg */
+#include <klib/printf.h> /* string_printf */
+#include <klib/rc.h>
+#include <klib/status.h> /* STSMSG */
+#include <klib/text.h> /* String */
+
+#include <strtol.h> /* strtou64 */
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <stdlib.h> /* free */
+#include <string.h> /* memset */
+#include <time.h> /* time */
+
+#include <stdio.h> /* printf */
+
+#include "kfile-no-q.h"
+
+#define DISP_RC(rc, err) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, err))
+
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt,rc, "$(msg): $(name)","msg=%s,name=%s",msg,name)))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define STS_TOP 0
+#define STS_INFO 1
+#define STS_DBG 2
+#define STS_FIN 3
+
+#define USE_CURL 0
+#define ALLOW_STRIP_QUALS 0
+
+#define rcResolver rcTree
+static bool NotFoundByResolver(rc_t rc) {
+ if (GetRCModule(rc) == rcVFS) {
+ if (GetRCTarget(rc) == rcResolver) {
+ if (GetRCContext(rc) == rcResolving) {
+ if (GetRCState(rc) == rcNotFound) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+typedef enum {
+ eOrderSize,
+ eOrderOrig
+} EOrder;
+typedef enum {
+ eForceNo, /* do not download found and complete objects */
+ eForceYes,/* force download of found and complete objects */
+ eForceYES /* force download; ignore lockes */
+} EForce;
+typedef enum {
+ eRunTypeUnknown,
+ eRunTypeList, /* list sizes */
+ eRunTypeDownload,
+ eRunTypeGetSize /* download ordered by sizes */
+} ERunType;
+typedef struct {
+ const VPath *path;
+ const String *str;
+} VPathStr;
+typedef struct {
+ BSTNode n;
+ char *path;
+} TreeNode;
+typedef struct {
+ ERunType type;
+ char *name;
+
+ VPathStr local;
+ const String *cache;
+ VPathStr remote;
+
+ const KFile *file;
+ uint64_t remoteSz;
+
+ bool undersized; /* remoteSz < min allowed size */
+ bool oversized; /* remoteSz >= max allowed size */
+
+ bool existing; /* the path is a path to an existing local file */
+
+ /* path to the resolved object : absolute path or resolved(local or cache) */
+ VPathStr path;
+
+ VPath *accession;
+ uint64_t project;
+
+ const KartItem *kartItem;
+
+ VResolver *resolver;
+} Resolved;
+typedef struct {
+ Args *args;
+ bool check_all;
+
+ bool list_kart;
+ bool list_kart_numbered;
+ bool list_kart_sized;
+ EOrder order;
+
+ const char *rows;
+
+ EForce force;
+ KConfig *cfg;
+ KDirectory *dir;
+
+ const KRepositoryMgr *repoMgr;
+ const VDBManager *mgr;
+ VFSManager *vfsMgr;
+ KNSManager *kns;
+
+ VResolver *resolver;
+
+ void *buffer;
+ size_t bsize;
+
+ bool undersized; /* remoteSz < min allowed size */
+ bool oversized; /* remoteSz >= max allowed size */
+
+ BSTree downloaded;
+
+ size_t minSize;
+ size_t maxSize;
+ uint64_t heartbeat;
+
+ bool noAscp;
+ bool noHttp;
+
+ bool forceAscpFail;
+
+ bool ascpChecked;
+ const char *ascp;
+ const char *asperaKey;
+ String *ascpMaxRate;
+ const char *ascpParams; /* do not free! */
+
+ bool stripQuals; /* this will download file without quality columns */
+ bool eliminateQuals; /* this will download cache file with eliminated quality columns which could filled later */
+
+#if _DEBUGGING
+ const char *textkart;
+#endif
+} Main;
+typedef struct {
+ /* "plain" command line argument */
+ const char *desc;
+
+ const KartItem *item;
+
+#if _DEBUGGING
+ const char *textkart;
+#endif
+
+ Resolved resolved;
+ int number;
+
+ bool isDependency;
+
+ Main *main; /* just a pointer, no refcount here, don't release it */
+} Item;
+typedef struct {
+ const char *obj;
+ bool done;
+ Kart *kart;
+ bool isKart;
+} Iterator;
+typedef struct {
+ BSTNode n;
+ Item *i;
+} KartTreeNode;
+/********** String extension **********/
+static rc_t StringRelease(const String *self) {
+ free((String*)self);
+ return 0;
+}
+
+static char* StringCheck(const String *self, rc_t rc) {
+ if (rc == 0 && self != NULL
+ && self->addr != NULL && self->len != 0 && self->addr[0] != '\0')
+ {
+ return string_dup(self->addr, self->size);
+ }
+ return NULL;
+}
+
+static
+bool _StringIsXYZ(const String *self, const char **withoutScheme, const char * scheme, size_t scheme_size)
+{
+ const char *dummy = NULL;
+
+ assert(self && self->addr);
+
+ if (withoutScheme == NULL) {
+ withoutScheme = &dummy;
+ }
+
+ *withoutScheme = NULL;
+
+ if (string_cmp(self->addr, self->len, scheme, scheme_size,
+ scheme_size) == 0)
+ {
+ *withoutScheme = self->addr + scheme_size;
+ return true;
+ }
+ return false;
+}
+
+static
+bool _StringIsFasp(const String *self, const char **withoutScheme)
+{
+ const char fasp[] = "fasp://";
+ return _StringIsXYZ ( self, withoutScheme, fasp, sizeof fasp - 1 );
+}
+
+static
+bool _StringIsHttps(const String *self, const char **withoutScheme)
+{
+ const char https[] = "https://";
+ return _StringIsXYZ ( self, withoutScheme, https, sizeof https - 1 );
+}
+/********** KFile extension **********/
+static
+rc_t _KFileOpenRemote(const KFile **self, KNSManager *kns, const char *path)
+{
+ rc_t rc = 0;
+ assert(self);
+ if (*self != NULL) {
+ return 0;
+ }
+ rc = KNSManagerMakeReliableHttpFile(kns, self, NULL, 0x01010000, path);
+ return rc;
+}
+
+/********** KDirectory extension **********/
+static rc_t _KDirectoryMkTmpPrefix(const KDirectory *self,
+ const String *prefix, char *out, size_t sz)
+{
+ size_t num_writ = 0;
+ rc_t rc = string_printf(out, sz, &num_writ, "%S.tmp", prefix);
+ if (rc != 0) {
+ DISP_RC2(rc, "string_printf(tmp)", prefix->addr);
+ return rc;
+ }
+
+ if (num_writ > sz) {
+ rc = RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad string_printf($(s).tmp) result", "s=%S", prefix));
+ return rc;
+ }
+
+ return rc;
+}
+
+static rc_t _KDirectoryMkTmpName(const KDirectory *self,
+ const String *prefix, char *out, size_t sz)
+{
+ rc_t rc = 0;
+ int i = 0;
+
+ assert(prefix);
+
+ while (rc == 0) {
+ size_t num_writ = 0;
+ rc = string_printf(out, sz, &num_writ,
+ "%S.tmp.%d.tmp", prefix, rand() % 100000);
+ if (rc != 0) {
+ DISP_RC2(rc, "string_printf(tmp.rand)", prefix->addr);
+ break;
+ }
+
+ if (num_writ > sz) {
+ rc = RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad string_printf($(s).tmp.rand) result", "s=%S", prefix));
+ return rc;
+ }
+ if (KDirectoryPathType(self, "%s", out) == kptNotFound) {
+ break;
+ }
+ if (++i > 999) {
+ rc = RC(rcExe, rcFile, rcCopying, rcName, rcUndefined);
+ PLOGERR(klogInt, (klogInt, rc,
+ "cannot generate unique tmp file name for $(name)", "name=%S",
+ prefix));
+ return rc;
+ }
+ }
+
+ return rc;
+}
+
+static rc_t _KDirectoryMkLockName(const KDirectory *self,
+ const String *prefix, char *out, size_t sz)
+{
+ rc_t rc = 0;
+ size_t num_writ = 0;
+
+ assert(prefix);
+
+ rc = string_printf(out, sz, &num_writ, "%S.lock", prefix);
+ DISP_RC2(rc, "string_printf(lock)", prefix->addr);
+
+ if (rc == 0 && num_writ > sz) {
+ rc = RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad string_printf($(s).lock) result", "s=%S", prefix));
+ return rc;
+ }
+
+ return rc;
+}
+
+static
+rc_t _KDirectoryCleanCache(KDirectory *self, const String *local)
+{
+ rc_t rc = 0;
+
+ char cache[PATH_MAX] = "";
+ size_t num_writ = 0;
+
+ assert(self && local && local->addr);
+
+ if (rc == 0) {
+ rc = string_printf(cache, sizeof cache, &num_writ, "%S.cache", local);
+ DISP_RC2(rc, "string_printf(.cache)", local->addr);
+ }
+
+ if (rc == 0 && KDirectoryPathType(self, "%s", cache) != kptNotFound) {
+ STSMSG(STS_DBG, ("removing %s", cache));
+ rc = KDirectoryRemove(self, false, "%s", cache);
+ }
+
+ return rc;
+}
+
+static rc_t _KDirectoryClean(KDirectory *self, const String *cache,
+ const char *lock, const char *tmp, bool rmSelf)
+{
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+
+ char tmpName[PATH_MAX] = "";
+ const char *dir = tmpName;
+ const char *tmpPfx = NULL;
+ size_t tmpPfxLen = 0;
+
+ assert(self && cache);
+
+ rc = _KDirectoryMkTmpPrefix(self, cache, tmpName, sizeof tmpName);
+ if (rc == 0) {
+ char *slash = strrchr(tmpName, '/');
+ if (slash != NULL) {
+ if (strlen(tmpName) == slash + 1 - tmpName) {
+ rc = RC(rcExe,
+ rcDirectory, rcSearching, rcDirectory, rcIncorrect);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad file name $(path)", "path=%s", tmpName));
+ }
+ else {
+ *slash = '\0';
+ tmpPfx = slash + 1;
+ }
+ }
+ else {
+ rc = RC(rcExe, rcDirectory, rcSearching, rcChar, rcNotFound);
+ PLOGERR(klogInt, (klogInt, rc,
+ "cannot extract directory from $(path)", "path=%s", dir));
+ }
+ tmpPfxLen = strlen(tmpPfx);
+ }
+
+ if (tmp != NULL && KDirectoryPathType(self, "%s", tmp) != kptNotFound) {
+ rc_t rc3 = 0;
+ STSMSG(STS_DBG, ("removing %s", tmp));
+ rc3 = KDirectoryRemove(self, false, "%s", tmp);
+ if (rc2 == 0 && rc3 != 0) {
+ rc2 = rc3;
+ }
+ }
+
+ assert(cache);
+ if (rmSelf && KDirectoryPathType(self, "%s", cache->addr) != kptNotFound) {
+ rc_t rc3 = 0;
+ STSMSG(STS_DBG, ("removing %S", cache));
+ rc3 = KDirectoryRemove(self, false, "%S", cache);
+ if (rc2 == 0 && rc3 != 0) {
+ rc2 = rc3;
+ }
+ }
+
+ if (rc == 0) {
+ uint32_t count = 0;
+ uint32_t i = 0;
+ KNamelist *list = NULL;
+ STSMSG(STS_DBG, ("listing %s for old temporary files", dir));
+ rc = KDirectoryList(self, &list, NULL, NULL, "%s", dir);
+ DISP_RC2(rc, "KDirectoryList", dir);
+
+ if (rc == 0) {
+ rc = KNamelistCount(list, &count);
+ DISP_RC2(rc, "KNamelistCount(KDirectoryList)", dir);
+ }
+
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char *name = NULL;
+ rc = KNamelistGet(list, i, &name);
+ if (rc != 0) {
+ DISP_RC2(rc, "KNamelistGet(KDirectoryList)", dir);
+ }
+ else {
+ if (strncmp(name, tmpPfx, tmpPfxLen) == 0) {
+ rc_t rc3 = 0;
+ STSMSG(STS_DBG, ("removing %s", name));
+ rc3 = KDirectoryRemove(self, false,
+ "%s%c%s", dir, '/', name);
+ if (rc2 == 0 && rc3 != 0) {
+ rc2 = rc3;
+ }
+ }
+ }
+ }
+
+ RELEASE(KNamelist, list);
+ }
+
+ if (lock != NULL && KDirectoryPathType(self, "%s", lock) != kptNotFound) {
+ rc_t rc3 = 0;
+ STSMSG(STS_DBG, ("removing %s", lock));
+ rc3 = KDirectoryRemove(self, false, "%s", lock);
+ if (rc2 == 0 && rc3 != 0) {
+ rc2 = rc3;
+ }
+ }
+
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+
+ return rc;
+}
+
+/********** VResolver extension **********/
+static rc_t V_ResolverRemote(const VResolver *self,
+ VRemoteProtocols protocols, struct VPath const * accession,
+ struct VPath const ** remote, struct VPath const ** cache)
+{
+ return VResolverQuery(self, protocols, accession, NULL, remote, cache);
+}
+
+static rc_t V_ResolverLocal(const VResolver *self,
+ struct VPath const * accession, struct VPath const ** path )
+{
+ return VResolverQuery(self, 0, accession, path, NULL, NULL);
+}
+
+static rc_t _VResolverRemote(VResolver *self, VRemoteProtocols protocols,
+ const char *name, const VPath *vaccession,
+ const VPath **vremote, const String **remote,
+ const String **cache)
+{
+ rc_t rc = 0;
+ const VPath *vcache = NULL;
+ assert(vaccession && vremote);
+ if (*vremote != NULL) {
+ RELEASE(VPath, *vremote);
+ }
+ rc = V_ResolverRemote(self, protocols, vaccession, vremote, &vcache);
+ if (rc == 0) {
+ char path[PATH_MAX] = "";
+ size_t len = 0;
+ rc = VPathReadUri(*vremote, path, sizeof path, &len);
+ DISP_RC2(rc, "VPathReadUri(VResolverRemote)", name);
+ if (rc == 0) {
+ String local_str;
+ char *query = string_chr(path, len, '?');
+ if (query != NULL) {
+ *query = '\0';
+ }
+ StringInit(&local_str, path, len, (uint32_t)len);
+ RELEASE(String, *remote);
+ rc = StringCopy(remote, &local_str);
+ DISP_RC2(rc, "StringCopy(VResolverRemote)", name);
+ }
+ }
+ else if (NotFoundByResolver(rc)) {
+ PLOGERR(klogErr, (klogErr, rc, "'$(acc)' cannot be found.",
+ "acc=%s", name));
+ }
+ else {
+ DISP_RC2(rc, "Cannot resolve remote", name);
+ }
+ if (rc == 0 && cache != NULL) {
+ String path_str;
+ if (vcache == NULL) {
+ rc = RC(rcExe, rcResolver, rcResolving, rcPath, rcNotFound);
+ PLOGERR(klogInt, (klogInt, rc, "cannot get cache location "
+ "for $(acc).", /* Try to cd out of protected repository.", */
+ "acc=%s" , name));
+ }
+ if (rc == 0) {
+ rc = VPathGetPath(vcache, &path_str);
+ DISP_RC2(rc, "VPathGetPath(VResolverCache)", name);
+ }
+ if (rc == 0) {
+ if (*cache != NULL) {
+ free((void*)*cache);
+ }
+ rc = StringCopy(cache, &path_str);
+ DISP_RC2(rc, "StringCopy(VResolverCache)", name);
+ }
+ }
+ RELEASE(VPath, vcache);
+ return rc;
+}
+
+/********** VPathStr **********/
+static rc_t VPathStrFini(VPathStr *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ VPathRelease(self->path);
+
+ RELEASE(String, self->str);
+
+ memset(self, 0, sizeof *self);
+
+ return rc;
+}
+
+static
+rc_t VPathStrInitStr(VPathStr *self, const char *str, size_t len)
+{
+ String s;
+ assert(self);
+ if (len == 0) {
+ len = string_size(str);
+ }
+ StringInit(&s, str, len, (uint32_t)len);
+ VPathStrFini(self);
+ return StringCopy(&self->str, &s);
+}
+
+/********** TreeNode **********/
+static int64_t CC bstCmp(const void *item, const BSTNode *n) {
+ const char* path = item;
+ const TreeNode* sn = (const TreeNode*) n;
+
+ assert(path && sn && sn->path);
+
+ return strcmp(path, sn->path);
+}
+
+static int64_t CC bstSort(const BSTNode* item, const BSTNode* n) {
+ const TreeNode* sn = (const TreeNode*) item;
+
+ return bstCmp(sn->path, n);
+}
+
+static void CC bstWhack(BSTNode* n, void* ignore) {
+ TreeNode* sn = (TreeNode*) n;
+
+ assert(sn);
+
+ free(sn->path);
+
+ memset(sn, 0, sizeof *sn);
+
+ free(sn);
+}
+
+/********** NumIterator **********/
+
+typedef enum {
+ eNIBegin,
+ eNINumber,
+ eNIInterval,
+ eNIDash,
+ eNIComma,
+ eNIBad,
+ eNIForever,
+ eNIEnd
+} ENumIteratorState;
+typedef struct {
+ ENumIteratorState state;
+ bool skip;
+ const char *s;
+ int32_t crnt;
+ int32_t intEnd;
+} NumIterator;
+static void NumIteratorInit(NumIterator *self, const char *row) {
+ assert(self);
+ memset(self, 0, sizeof *self);
+ self->crnt = self->intEnd = -1;
+ self->s = row;
+}
+
+static int32_t NumIteratorGetNum(NumIterator *self) {
+ int32_t n = 0;
+ for (n = 0; *(self->s) >= '0' && *(self->s) <= '9'; ++(self->s)) {
+ n = n * 10 + *(self->s) - '0';
+ }
+ return n;
+}
+
+static bool NumIteratorNext(NumIterator *self, int64_t crnt) {
+ char c = '\0';
+ assert(self);
+ while (true) {
+ self->skip = false;
+ switch (self->state) {
+ case eNIBegin:
+ case eNIComma:
+ if (self->s == NULL || *(self->s) == '\0') {
+ if (self->state == eNIBegin) {
+ self->state = eNIForever;
+ continue;
+ }
+ else {
+ self->state = eNIEnd;
+ continue;
+ }
+ }
+ c = *(self->s);
+ ++(self->s);
+ if (c == ',') {
+ self->state = eNIComma;
+ continue;
+ }
+ else if (c == '-') {
+ self->state = eNIDash;
+ continue;
+ }
+ else if (c >= '0' && c <= '9') {
+ --(self->s);
+ self->crnt = NumIteratorGetNum(self);
+ self->state = eNINumber;
+ if (self->crnt < crnt) {
+ continue;
+ }
+ else {
+ if (self->crnt > crnt) {
+ self->skip = true;
+ }
+ return true;
+ }
+ continue;
+ }
+ else {
+ self->state = eNIBad;
+ continue;
+ }
+ case eNIInterval:
+ if (crnt <= self->intEnd) {
+ return true;
+ }
+ /* no break here */
+ case eNINumber:
+ if (self->crnt >= crnt) {
+ if (self->crnt > crnt) {
+ self->skip = true;
+ }
+ return true;
+ }
+ if (self->s == NULL || *(self->s) == '\0') {
+ self->state = eNIEnd;
+ continue;
+ }
+ c = *(self->s);
+ ++(self->s);
+ if (c == ',') {
+ self->state = eNIComma;
+ continue;
+ }
+ else if (c == '-') {
+ self->state = eNIDash;
+ continue;
+ }
+ else {
+ self->state = eNIBad;
+ continue;
+ }
+ case eNIDash:
+ if (self->s == NULL || *(self->s) == '\0') {
+ self->state = eNIForever;
+ continue;
+ }
+ c = *(self->s);
+ ++(self->s);
+ if (c == ',' || c == '-') {
+ self->state = eNIForever;
+ continue;
+ }
+ else if (c >= '0' && c <= '9') {
+ --(self->s);
+ self->intEnd = NumIteratorGetNum(self);
+ self->state = eNIInterval;
+ if (crnt <= self->intEnd) {
+ return true;
+ }
+ else {
+ continue;
+ }
+ }
+ else {
+ self->state = eNIBad;
+ continue;
+ }
+ case eNIForever:
+ return true;
+ case eNIBad:
+ case eNIEnd:
+ return false;
+ }
+ }
+}
+
+/********** Resolved **********/
+static rc_t ResolvedFini(Resolved *self) {
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+
+ assert(self);
+
+ rc = VPathStrFini(&self->local);
+ rc2 = VPathStrFini(&self->remote);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ rc2 = VPathStrFini(&self->path);
+
+ RELEASE(KFile, self->file);
+ RELEASE(VPath, self->accession);
+ RELEASE(VResolver, self->resolver);
+
+ RELEASE(KartItem, self->kartItem);
+
+ RELEASE(String, self->cache);
+
+ free(self->name);
+
+ memset(self, 0, sizeof *self);
+
+ return rc != 0 ? rc : rc2;
+}
+
+static void ResolvedReset(Resolved *self, ERunType type) {
+ assert(self);
+
+ memset(self, 0, sizeof *self);
+
+ self->type = type;
+}
+
+/** isLocal is set to true when the object is found locally.
+ i.e. does not need need not be [re]downloaded */
+static rc_t ResolvedLocal(const Resolved *self,
+ const KDirectory *dir, bool *isLocal, EForce force)
+{
+ rc_t rc = 0;
+ uint64_t sRemote = 0;
+ uint64_t sLocal = 0;
+ const KFile *local = NULL;
+ char path[PATH_MAX] = "";
+
+ assert(isLocal && self);
+
+ *isLocal = false;
+
+ if (self->local.str == NULL) {
+ return 0;
+ }
+
+ rc = VPathReadPath(self->local.path, path, sizeof path, NULL);
+ DISP_RC(rc, "VPathReadPath");
+
+ if (rc == 0 && (KDirectoryPathType(dir, "%s", path) & ~kptAlias) != kptFile)
+ {
+ if (force == eForceNo) {
+ STSMSG(STS_TOP,
+ ("%s (not a file) is found locally: consider it complete",
+ path));
+ *isLocal = true;
+ }
+ else {
+ STSMSG(STS_TOP,
+ ("%s (not a file) is found locally and will be redownloaded",
+ path));
+ }
+ return 0;
+ }
+
+ if (rc == 0) {
+ if (! _StringIsFasp(self->remote.str, NULL) && self->file != NULL) {
+ rc = KFileSize(self->file, &sRemote);
+ DISP_RC2(rc, "KFileSize(remote)", self->name);
+ }
+ else {
+ sRemote = self->remoteSz;
+ }
+ }
+
+ if (rc == 0) {
+ rc = KDirectoryOpenFileRead(dir, &local, "%s", path);
+ DISP_RC2(rc, "KDirectoryOpenFileRead", path);
+ }
+
+ if (rc == 0) {
+ rc = KFileSize(local, &sLocal);
+ DISP_RC2(rc, "KFileSize", path);
+ }
+
+ if (rc == 0) {
+ if (sRemote == 0) {
+ if (sLocal != 0) {
+ if (force == eForceNo) {
+ *isLocal = true;
+ STSMSG(STS_INFO, ("%s (%,lu) is found", path, sLocal));
+ }
+ else {
+ STSMSG(STS_INFO,
+ ("%s (%,lu) is found and will be redownloaded",
+ path, sLocal));
+ }
+ }
+ else if (sLocal == 0) {
+ STSMSG(STS_INFO,
+ ("an empty %s (%,lu) is found and will be redownloaded",
+ path, sLocal));
+ }
+ }
+ else if (sRemote == sLocal) {
+ if (force == eForceNo) {
+ *isLocal = true;
+ STSMSG(STS_INFO, ("%s (%,lu) is found and is complete",
+ path, sLocal));
+ }
+ else {
+ STSMSG(STS_INFO, ("%s (%,lu) is found and will be redownloaded",
+ path, sLocal));
+ }
+ }
+ else {
+ STSMSG(STS_TOP, ("%s (%,lu) is incomplete. Expected size is %,lu. "
+ "It will be re-downloaded", path, sLocal, sRemote));
+ }
+ }
+
+ RELEASE(KFile, local);
+
+ return rc;
+}
+
+/********** Main **********/
+static bool MainUseAscp(Main *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ if (self->ascpChecked) {
+ return self->ascp != NULL;
+ }
+
+ self->ascpChecked = true;
+
+ if (self->noAscp) {
+ return false;
+ }
+
+ rc = ascp_locate(&self->ascp, &self->asperaKey, true, true);
+ return rc == 0 && self->ascp && self->asperaKey;
+}
+
+static bool MainHasDownloaded(const Main *self, const char *local) {
+ TreeNode *sn = NULL;
+
+ assert(self);
+
+ sn = (TreeNode*) BSTreeFind(&self->downloaded, local, bstCmp);
+
+ return sn != NULL;
+}
+
+static rc_t MainDownloaded(Main *self, const char *path) {
+ TreeNode *sn = NULL;
+
+ assert(self);
+
+ if (MainHasDownloaded(self, path)) {
+ return 0;
+ }
+
+ sn = calloc(1, sizeof *sn);
+ if (sn == NULL) {
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ sn->path = string_dup_measure(path, NULL);
+ if (sn->path == NULL) {
+ bstWhack((BSTNode*) sn, NULL);
+ sn = NULL;
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ BSTreeInsert(&self->downloaded, (BSTNode*)sn, bstSort);
+
+ return 0;
+}
+
+static rc_t MainDownloadFile(Resolved *self,
+ Main *main, const char *to)
+{
+ rc_t rc = 0;
+ KFile *out = NULL;
+ size_t num_read = 0;
+ uint64_t opos = 0;
+ size_t num_writ = 0;
+ uint64_t pos = 0;
+#if USE_KFILE_FOR_HTTP_DOWNLOADS
+ uint64_t prevPos = 0;
+#endif
+
+ assert(self && main);
+ assert(!main->eliminateQuals);
+
+ if (rc == 0) {
+ STSMSG(STS_DBG, ("creating %s", to));
+ rc = KDirectoryCreateFile(main->dir, &out,
+ false, 0664, kcmInit | kcmParents, "%s", to);
+ DISP_RC2(rc, "Cannot OpenFileWrite", to);
+ }
+
+ assert(self->remote.str);
+
+ if (self->file == NULL) {
+ rc = _KFileOpenRemote(&self->file, main->kns, self->remote.str->addr);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to open file for $(path)",
+ "path=%S", self->remote.str));
+ }
+ }
+
+ if (main->stripQuals)
+ {
+ const KFile * kfile;
+
+ rc = KSraFileNoQuals(self->file, &kfile);
+ if (rc == 0)
+ {
+ KFileRelease(self->file);
+ self->file = kfile;
+ }
+ }
+
+ STSMSG(STS_INFO, ("%S -> %s", self->remote.str, to));
+#if USE_KFILE_FOR_HTTP_DOWNLOADS
+ do {
+ bool print = pos - prevPos > 200000000;
+ rc = Quitting();
+
+ if (rc == 0) {
+ if (print) {
+ STSMSG(STS_FIN,
+ ("Reading %lu bytes from pos. %lu", main->bsize, pos));
+ }
+ rc = KFileRead(self->file,
+ pos, main->buffer, main->bsize, &num_read);
+ if (rc != 0) {
+ DISP_RC2(rc, "Cannot KFileRead", self->remote.str->addr);
+ }
+ else {
+ pos += num_read;
+ }
+
+ if (print) {
+ prevPos = pos;
+ }
+ }
+
+ if (rc == 0 && num_read > 0) {
+ rc = KFileWrite(out, opos, main->buffer, num_read, &num_writ);
+ DISP_RC2(rc, "Cannot KFileWrite", to);
+ opos += num_writ;
+ }
+ } while (rc == 0 && num_read > 0);
+
+#else
+ {
+ ver_t http_vers = 0x01010000;
+ KClientHttpRequest * kns_req = NULL;
+ rc = KNSManagerMakeClientRequest ( main -> kns,
+ & kns_req, http_vers, NULL, "%S", self -> remote . str );
+ DISP_RC2
+ ( rc, "Cannot KNSManagerMakeClientRequest", self -> remote . str );
+
+ if ( rc == 0 ) {
+ KClientHttpResult * rslt = NULL;
+ rc = KClientHttpRequestGET ( kns_req, & rslt );
+ DISP_RC2
+ ( rc, "Cannot KClientHttpRequestGET", self -> remote . str );
+
+ if ( rc == 0 ) {
+ KStream * s = NULL;
+ rc = KClientHttpResultGetInputStream ( rslt, & s );
+ DISP_RC2 ( rc, "Cannot KClientHttpResultGetInputStream",
+ self -> remote . str );
+
+ while ( rc == 0 ) {
+ rc = KStreamRead
+ ( s, main -> buffer, main -> bsize, & num_read );
+ if ( rc != 0 || num_read == 0) {
+ DISP_RC2 ( rc, "Cannot KStreamRead",
+ self -> remote . str );
+ break;
+ }
+
+ rc = KFileWriteAll
+ ( out, opos, main -> buffer, num_read, & num_writ);
+ DISP_RC2 ( rc, "Cannot KFileWrite", to );
+ if ( rc == 0 && num_writ != num_read ) {
+ rc = RC ( rcExe,
+ rcFile, rcCopying, rcTransfer, rcIncomplete );
+ }
+ opos += num_writ;
+ }
+
+ RELEASE ( KStream, s );
+ }
+
+ RELEASE ( KClientHttpResult, rslt );
+ }
+
+ RELEASE ( KClientHttpRequest, kns_req );
+ }
+#endif
+
+ RELEASE(KFile, out);
+
+ if (rc == 0) {
+ STSMSG(STS_INFO, ("%s (%ld)", to, pos));
+ }
+
+ return rc;
+}
+
+static rc_t MainDownloadCacheFile(Resolved *self,
+ Main *main, const char *to, bool elimQuals)
+{
+ rc_t rc = 0;
+ const KFile *out = NULL;
+
+ assert(self && main);
+ assert(!main->stripQuals);
+
+ assert(self->remote.str);
+
+ if (self->file == ((void*)0)) {
+ rc = _KFileOpenRemote(&self->file, main->kns, self->remote.str->addr);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to open file for $(path)",
+ "path=%S", self->remote.str));
+ return rc;
+ }
+ }
+
+ rc = KDirectoryMakeCacheTee(main->dir, &out, self->file, 0, "%s", to);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to open cache file for $(path)",
+ "path=%S", to));
+ return rc;
+ }
+
+ STSMSG(STS_INFO, ("%S -> %s", self->remote.str, to));
+
+ rc = KSraReadCacheFile( out, elimQuals );
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to read cache file at $(path)",
+ "path=%S", to));
+ }
+
+ RELEASE(KFile, out);
+
+ if (rc != 0) {
+ return rc;
+ }
+
+ if (rc == 0) {
+ STSMSG(STS_INFO, ("%s", to));
+ }
+
+ return rc;
+}
+
+/* https://sra-download.ncbi.nlm.nih.gov/srapub/SRR125365.sra
+anonftp at ftp-private.ncbi.nlm.nih.gov:/sra/sra-instant/reads/ByR.../SRR125365.sra
+*/
+static rc_t MainDownloadAscp(const Resolved *self, Main *main,
+ const char *to)
+{
+ const char *src = NULL;
+ AscpOptions opt;
+
+ assert(self && self->remote.str && self->remote.str->addr
+ && main && main->ascp && main->asperaKey);
+
+ memset(&opt, 0, sizeof opt);
+
+ if (!_StringIsFasp(self->remote.str, &src)) {
+ return RC(rcExe, rcFile, rcCopying, rcSchema, rcInvalid);
+ }
+
+ if (main->ascpParams != NULL) {
+ opt.ascp_options = main->ascpParams;
+ }
+ else if (main->ascpMaxRate != NULL) {
+ size_t sz = string_copy(opt.target_rate, sizeof opt.target_rate,
+ main->ascpMaxRate->addr, main->ascpMaxRate->size);
+ if (sz < sizeof opt.target_rate) {
+ return RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+ }
+ }
+
+ opt.name = self->name;
+ opt.src_size = self->remoteSz;
+ opt.heartbeat = main->heartbeat;
+ opt.quitting = Quitting;
+
+ return aspera_get(main->ascp, main->asperaKey, src, to, &opt);
+}
+
+static rc_t MainDownload(Resolved *self, Main *main, bool isDependency) {
+ bool canceled = false;
+ rc_t rc = 0;
+ KFile *flock = NULL;
+
+ char tmp[PATH_MAX] = "";
+ char lock[PATH_MAX] = "";
+
+ assert(self
+ && self->cache && self->cache->size && self->cache->addr && main);
+
+ if (main->force != eForceYES &&
+ MainHasDownloaded(main, self->cache->addr))
+ {
+ STSMSG(STS_INFO, ("%s has just been downloaded", self->cache->addr));
+ return 0;
+ }
+
+ if (rc == 0) {
+ rc = _KDirectoryMkLockName(main->dir, self->cache, lock, sizeof lock);
+ }
+
+ if (rc == 0 && !main->eliminateQuals) {
+ rc = _KDirectoryMkTmpName(main->dir, self->cache, tmp, sizeof tmp);
+ }
+
+ if (KDirectoryPathType(main->dir, "%s", lock) != kptNotFound) {
+ if (main->force != eForceYES) {
+ KTime_t date = 0;
+ rc = KDirectoryDate(main->dir, &date, "%s", lock);
+ if (rc == 0) {
+ time_t t = time(NULL) - date;
+ if (t < 60 * 60 * 24) { /* 24 hours */
+ STSMSG(STS_DBG, ("%s found: canceling download", lock));
+ rc = RC(rcExe, rcFile, rcCopying, rcLock, rcExists);
+ PLOGERR(klogWarn, (klogWarn, rc,
+ "Lock file $(file) exists: download canceled",
+ "file=%s", lock));
+ return rc;
+ }
+ else {
+ STSMSG(STS_DBG, ("%s found and ignored as too old", lock));
+ rc = _KDirectoryClean(main->dir,
+ self->cache, NULL, NULL, true);
+ }
+ }
+ else {
+ STSMSG(STS_DBG, ("%s found", lock));
+ DISP_RC2(rc, "KDirectoryDate", lock);
+ }
+ }
+ else {
+ STSMSG(STS_DBG, ("%s found and forced to be ignored", lock));
+ rc = _KDirectoryClean(main->dir, self->cache, NULL, NULL, true);
+ }
+ }
+ else {
+ STSMSG(STS_DBG, ("%s not found", lock));
+ }
+
+ if (rc == 0) {
+ STSMSG(STS_DBG, ("creating %s", lock));
+ rc = KDirectoryCreateFile(main->dir, &flock,
+ false, 0664, kcmInit | kcmParents, "%s", lock);
+ DISP_RC2(rc, "Cannot OpenFileWrite", lock);
+ }
+
+ assert(!main->noAscp || !main->noHttp);
+
+ if (rc == 0) {
+ bool ascp = _StringIsFasp(self->remote.str, NULL);
+ if (ascp) {
+ STSMSG(STS_TOP, (" Downloading via fasp..."));
+ if (main->forceAscpFail) {
+ rc = 1;
+ }
+ else if (main->eliminateQuals) {
+ LOGMSG(klogErr, "Cannot eliminate qualities during fasp download");
+ rc = 1;
+ }
+ else if (main->eliminateQuals) {
+ LOGMSG(klogErr, "Cannot remove QUALITY columns during fasp download");
+ rc = 1;
+ }
+ else {
+ rc = MainDownloadAscp(self, main, tmp);
+ }
+ if (rc == 0) {
+ STSMSG(STS_TOP, (" fasp download succeed"));
+ }
+ else {
+ rc_t rc = Quitting();
+ if (rc != 0) {
+ canceled = true;
+ }
+ else {
+ STSMSG(STS_TOP, (" fasp download failed"));
+ }
+ }
+ }
+ if (!ascp || (rc != 0 && GetRCObject(rc) != rcMemory
+ && !canceled && !main->noHttp))
+ {
+ bool https = _StringIsHttps(self->remote.str, NULL);
+ STSMSG(STS_TOP, (" Downloading via %s...", https ? "https" : "http"));
+ if (ascp) {
+ assert(self->resolver);
+ {
+ rc_t rc2 = VPathStrFini(&self->remote);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ RELEASE(KFile, self->file);
+ rc = _VResolverRemote(self->resolver,
+ 0, self->name, self->accession,
+ &self->remote.path, &self->remote.str, &self->cache);
+ }
+ if (rc == 0) {
+ /* when eliminateQuals is specified we will try newer algorithm for downloading files via cache,
+ but filter out qualities for main file, not for dependencies */
+ if (main->eliminateQuals) {
+ rc = MainDownloadCacheFile(self, main, self->cache->addr, main->eliminateQuals && !isDependency);
+ }
+ else {
+ rc = MainDownloadFile(self, main, tmp);
+ }
+ }
+ }
+ }
+
+ RELEASE(KFile, flock);
+
+ if (rc == 0 && !main->eliminateQuals) {
+ STSMSG(STS_DBG, ("renaming %s -> %S", tmp, self->cache));
+ rc = KDirectoryRename(main->dir, true, tmp, self->cache->addr);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc, "cannot rename $(from) to $(to)",
+ "from=%s,to=%S", tmp, self->cache));
+ }
+ }
+
+ if (rc == 0) {
+ rc = MainDownloaded(main, self->cache->addr);
+ }
+
+ if (rc == 0 && !main->eliminateQuals) {
+ rc_t rc2 = _KDirectoryCleanCache(main->dir, self->cache);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ {
+ rc_t rc2 = _KDirectoryClean(main->dir, self->cache, lock, main->eliminateQuals ? NULL : tmp, rc != 0);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ return rc;
+}
+
+static rc_t _VDBManagerSetDbGapCtx(const VDBManager *self, VResolver *resolver)
+{
+ if (resolver == NULL) {
+ return 0;
+ }
+
+ return VDBManagerSetResolver(self, resolver);
+}
+
+static rc_t MainDependenciesList(const Main *self,
+ const Resolved *resolved, const VDBDependencies **deps)
+{
+ rc_t rc = 0;
+ bool isDb = true;
+ const VDatabase *db = NULL;
+ const String *str = NULL;
+ KPathType type = kptNotFound;
+
+ assert(self && resolved && deps);
+
+ str = resolved->path.str;
+ assert(str && str->addr);
+
+ rc = _VDBManagerSetDbGapCtx(self->mgr, resolved->resolver);
+
+ STSMSG(STS_DBG, ("Listing '%S's dependencies...", str));
+
+ type = VDBManagerPathType(self->mgr, "%s", resolved->name) & ~kptAlias;
+ if (type != kptDatabase) {
+ if (type == kptTable) {
+ STSMSG(STS_DBG, ("...'%S' is a table", str));
+ }
+ else {
+ STSMSG(STS_DBG,
+ ("...'%S' is not recognized as a database or a table", str));
+ }
+ return 0;
+ }
+
+ rc = VDBManagerOpenDBRead(self->mgr, &db, NULL, "%s", resolved->name);
+ if (rc != 0) {
+ if (rc == SILENT_RC(rcDB, rcMgr, rcOpening, rcDatabase, rcIncorrect)) {
+ isDb = false;
+ rc = 0;
+ }
+ else if (rc ==
+ SILENT_RC(rcKFG, rcEncryptionKey, rcRetrieving, rcItem, rcNotFound))
+ {
+ STSMSG(STS_TOP, ("Cannot open encrypted file '%s'", resolved->name));
+ isDb = false;
+ rc = 0;
+ }
+ DISP_RC2(rc, "Cannot open database", resolved->name);
+ }
+
+ if (rc == 0 && isDb) {
+ bool all = self->check_all || self->force != eForceNo;
+ rc = VDatabaseListDependencies(db, deps, !all);
+ DISP_RC2(rc, "VDatabaseListDependencies", resolved->name);
+ }
+
+ RELEASE(VDatabase, db);
+
+ return rc;
+}
+
+/********** Item **********/
+static rc_t ItemRelease(Item *self) {
+ rc_t rc = 0;
+
+ if (self == NULL) {
+ return 0;
+ }
+
+ rc = ResolvedFini(&self->resolved);
+ RELEASE(KartItem, self->item);
+
+ memset(self, 0, sizeof *self);
+
+ free(self);
+
+ return rc;
+}
+
+static rc_t ItemInit(Item *self, const char *obj) {
+ assert(self);
+ self->desc = obj;
+ return 0;
+}
+
+static char* ItemName(const Item *self) {
+ char *c = NULL;
+ assert(self);
+ if (self->desc != NULL) {
+ return string_dup_measure(self->desc, NULL);
+ }
+ else {
+ rc_t rc = 0;
+ const String *elem = NULL;
+ assert(self->item);
+
+ rc = KartItemItemDesc(self->item, &elem);
+ c = StringCheck(elem, rc);
+ if (c != NULL) {
+ return c;
+ }
+
+ rc = KartItemAccession(self->item, &elem);
+ c = StringCheck(elem, rc);
+ if (c != NULL) {
+ return c;
+ }
+
+ rc = KartItemItemId(self->item, &elem);
+ return StringCheck(elem, rc);
+ }
+}
+
+static
+rc_t _KartItemToVPath(const KartItem *self, const VFSManager *vfs, VPath **path)
+{
+ uint64_t oid = 0;
+ rc_t rc = KartItemItemIdNumber(self, &oid);
+ if (rc == 0) {
+ rc = VFSManagerMakeOidPath(vfs, path, (uint32_t)oid);
+ }
+ else {
+ char path_str[PATH_MAX] = "";
+ const String *accession = NULL;
+ rc = KartItemAccession(self, &accession);
+ if (rc == 0) {
+ rc =
+ string_printf(path_str, sizeof path_str, NULL, "%S", accession);
+ }
+ if (rc == 0) {
+ rc = VFSManagerMakePath(vfs, path, path_str);
+ }
+ }
+ return rc;
+}
+
+static rc_t _ItemSetResolverAndAssessionInResolved(Item *item,
+ VResolver *resolver, const KConfig *cfg, const KRepositoryMgr *repoMgr,
+ const VFSManager *vfs)
+{
+ Resolved *resolved = NULL;
+ rc_t rc = 0;
+
+ assert(item && resolver && cfg && repoMgr && vfs);
+
+ resolved = &item->resolved;
+
+ if (item->desc != NULL) {
+ rc = VFSManagerMakePath(vfs, &resolved->accession, "%s", item->desc);
+ DISP_RC2(rc, "VFSManagerMakePath", item->desc);
+ if (rc == 0) {
+ rc = VResolverAddRef(resolver);
+ }
+ if (rc == 0) {
+ resolved->resolver = resolver;
+ }
+ }
+ else {
+ rc = KartItemProjIdNumber(item->item, &resolved->project);
+ if (rc != 0) {
+ DISP_RC(rc, "KartItemProjIdNumber");
+ return rc;
+ }
+ rc = _KartItemToVPath(item->item, vfs, &resolved->accession);
+ if (rc != 0) {
+ DISP_RC(rc, "invalid kart file row");
+ return rc;
+ }
+ else {
+ const KRepository *p_protected = NULL;
+ rc = KRepositoryMgrGetProtectedRepository(repoMgr,
+ (uint32_t)resolved->project, &p_protected);
+ if (rc == 0) {
+ rc = KRepositoryMakeResolver(p_protected,
+ &resolved->resolver, cfg);
+ if (rc != 0) {
+ DISP_RC(rc, "KRepositoryMakeResolver");
+ return rc;
+ }
+ else {
+ VResolverCacheEnable(resolved->resolver, vrAlwaysEnable);
+ }
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc,
+ "project '$(P)': cannot find protected repository", "P=%d",
+ resolved->project));
+ }
+ RELEASE(KRepository, p_protected);
+ }
+ }
+
+ return rc;
+}
+
+/* resolve locations */
+static rc_t _ItemResolveResolved(VResolver *resolver,
+ VRemoteProtocols protocols, Item *item,
+ const KRepositoryMgr *repoMgr, const KConfig *cfg,
+ const VFSManager *vfs, KNSManager *kns, size_t minSize, size_t maxSize)
+{
+ Resolved *resolved = NULL;
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+
+ uint32_t i;
+ bool has_proto [ eProtocolMask + 1 ];
+ memset ( has_proto, 0, sizeof has_proto );
+ for ( i = 0; i < eProtocolMaxPref; ++ i )
+ has_proto [ ( protocols >> ( i * 3 ) ) & eProtocolMask ] = true;
+
+ assert(resolver && item);
+
+ resolved = &item->resolved;
+
+ VPathStrFini(&resolved->local);
+ VPathStrFini(&resolved->remote);
+
+ assert(resolved->accession == NULL);
+
+ rc = _ItemSetResolverAndAssessionInResolved(item,
+ resolver, cfg, repoMgr, vfs);
+
+ if (rc == 0) {
+ rc = V_ResolverLocal(resolved->resolver,
+ resolved->accession, &resolved->local.path);
+ if (rc == 0) {
+ rc = VPathMakeString(resolved->local.path, &resolved->local.str);
+ DISP_RC2(rc, "VPathMakeString(VResolverLocal)", resolved->name);
+ }
+ else if (NotFoundByResolver(rc)) {
+ rc = 0;
+ }
+ else {
+ DISP_RC2(rc, "VResolverLocal", resolved->name);
+ }
+ }
+
+ if (rc == 0) {
+ rc2 = 0;
+ resolved->remoteSz = 0;
+ assert(item->main);
+ if ((minSize > 0 || maxSize > 0 || item->main->order == eOrderSize)
+ && has_proto [ eProtocolFasp ])
+ {
+ rc2 = _VResolverRemote(resolved->resolver, 0,
+ resolved->name, resolved->accession, &resolved->remote.path,
+ &resolved->remote.str, &resolved->cache);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ else {
+ rc_t rc3 = 0;
+ if (resolved->file == NULL) {
+ rc3 = _KFileOpenRemote(&resolved->file,
+ kns, resolved->remote.str->addr);
+ DISP_RC2(rc3,
+ "cannot open remote file", resolved->remote.str->addr);
+ }
+
+ if (rc3 == 0 && resolved->file != NULL) {
+ rc3 = KFileSize(resolved->file, &resolved->remoteSz);
+ if (rc3 != 0) {
+ DISP_RC2(rc3, "cannot get remote file size",
+ resolved->remote.str->addr);
+ }
+ else if (resolved->remoteSz >= maxSize) {
+ return rc;
+ }
+ else if (resolved->remoteSz < minSize) {
+ return rc;
+ }
+ }
+ }
+ }
+
+ if (rc2 == 0) {
+ rc2 = _VResolverRemote(resolved->resolver, protocols,
+ resolved->name, resolved->accession, &resolved->remote.path,
+ &resolved->remote.str, &resolved->cache);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ if (rc == 0) {
+ rc2 = 0;
+ if (resolved->file == NULL) {
+ assert(resolved->remote.str);
+ if (!_StringIsFasp(resolved->remote.str, NULL)) {
+ rc2 = _KFileOpenRemote(
+ &resolved->file, kns, resolved->remote.str->addr);
+ }
+ }
+ if (rc2 == 0 && resolved->file != NULL && resolved->remoteSz == 0) {
+ rc2 = KFileSize(resolved->file, &resolved->remoteSz);
+ DISP_RC2(rc2, "KFileSize(remote)", resolved->name);
+ }
+ }
+ }
+
+ return rc;
+}
+
+/* Resolved: resolve locations */
+static rc_t ItemInitResolved(Item *self, VResolver *resolver, KDirectory *dir,
+ bool ascp, const KRepositoryMgr *repoMgr, const KConfig *cfg,
+ const VFSManager *vfs, KNSManager *kns, size_t minSize, size_t maxSize)
+{
+ Resolved *resolved = NULL;
+ rc_t rc = 0;
+ VRemoteProtocols protocols = ascp ? eProtocolFaspHttpHttps : 0;
+
+ assert(self);
+
+ resolved = &self->resolved;
+ resolved->name = ItemName(self);
+
+ assert(resolved->type != eRunTypeUnknown);
+
+ if (!self->isDependency &&
+ self->desc != NULL) /* object name is specified (not kart item) */
+ {
+ KPathType type = KDirectoryPathType(dir, "%s", self->desc) & ~kptAlias;
+ if (type == kptFile || type == kptDir) {
+ rc = VPathStrInitStr(&resolved->path, self->desc, 0);
+ resolved->existing = true;
+ if (resolved->type != eRunTypeDownload) {
+ uint64_t s = -1;
+ const KFile *f = NULL;
+ rc = KDirectoryOpenFileRead(dir, &f, "%s", self->desc);
+ if (rc == 0) {
+ rc = KFileSize(f, &s);
+ }
+ if (s != -1) {
+ resolved->remoteSz = s;
+ }
+ else {
+ OUTMSG(("%s\tunknown\n", self->desc));
+ }
+ RELEASE(KFile, f);
+ }
+ else {
+ STSMSG(STS_TOP, ("'%s' is a local non-kart file", self->desc));
+ }
+ return 0;
+ }
+ }
+
+ rc = _ItemResolveResolved(resolver, protocols, self,
+ repoMgr, cfg, vfs, kns, minSize, maxSize);
+
+ STSMSG(STS_DBG, ("Resolve(%s) = %R:", resolved->name, rc));
+ STSMSG(STS_DBG, ("local(%s)",
+ resolved->local.str ? resolved->local.str->addr : "NULL"));
+ STSMSG(STS_DBG, ("cache(%s)",
+ resolved->cache ? resolved->cache->addr : "NULL"));
+ STSMSG(STS_DBG, ("remote(%s:%,ld)",
+ resolved->remote.str ? resolved->remote.str->addr : "NULL",
+ resolved->remoteSz));
+
+ if (rc == 0) {
+ if (resolved->remoteSz >= maxSize) {
+ resolved->oversized = true;
+ return rc;
+ }
+ if (resolved->remoteSz < minSize) {
+ resolved->undersized = true;
+ return rc;
+ }
+
+ if (resolved->local.str == NULL
+ && (resolved->cache == NULL || resolved->remote.str == NULL))
+ {
+ rc = RC(rcExe, rcPath, rcValidating, rcParam, rcNull);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad VResolverResolve($(acc)) result",
+ "acc=%s", resolved->name));
+ }
+ }
+
+ return rc;
+}
+
+/* resolve: locate */
+static rc_t ItemResolve(Item *item, int32_t row) {
+ Resolved *self = NULL;
+ static int n = 0;
+ rc_t rc = 0;
+ bool ascp = false;
+
+ assert(item && item->main);
+
+ self = &item->resolved;
+ assert(self->type);
+
+ ++n;
+ if (row > 0 &&
+ item->desc == NULL) /* desc is NULL for kart items */
+ {
+ n = row;
+ }
+
+ item->number = n;
+
+ ascp = MainUseAscp(item->main);
+ if (self->type == eRunTypeList) {
+ ascp = false;
+ }
+
+ rc = ItemInitResolved(item, item->main->resolver, item->main->dir, ascp,
+ item->main->repoMgr, item->main->cfg, item->main->vfsMgr,
+ item->main->kns, item->main->minSize, item->main->maxSize);
+
+ return rc;
+}
+
+static bool maxSzPrntd = false;
+
+static void logMaxSize(size_t maxSize) {
+ if (maxSzPrntd) {
+ return;
+ }
+
+ maxSzPrntd = true;
+
+ if (maxSize == 0) {
+/* OUTMSG(("Maximum file size download limit is unlimited\n")); */
+ return;
+ }
+
+ if (maxSize / 1024 < 10) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "Maximum file size download limit is $(size)B\n",
+ "size=%zu", maxSize));
+ return;
+ }
+
+ maxSize /= 1024;
+ if (maxSize / 1024 < 10) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "Maximum file size download limit is $(size)KB\n",
+ "size=%zu", maxSize));
+ return;
+ }
+
+ maxSize /= 1024;
+ if (maxSize / 1024 < 10) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "Maximum file size download limit is $(size)MB\n",
+ "size=%zu", maxSize));
+ return;
+ }
+
+ maxSize /= 1024;
+ if (maxSize / 1024 < 10) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "Maximum file size download limit is $(size)GB\n",
+ "size=%zu", maxSize));
+ return;
+ }
+
+ maxSize /= 1024;
+ PLOGMSG(klogWarn, (klogWarn,
+ "Maximum file size download limit is $(size)TB\n",
+ "size=%zu", maxSize));
+}
+
+static void logBigFile(int n, const char *name, size_t size) {
+ if (size / 1024 < 10) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zuB) is larger than maximum allowed: skipped\n",
+ n, name, size));
+ return;
+ }
+
+ size /= 1024;
+ if (size / 1024 < 10) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zuKB) is larger than maximum allowed: skipped\n",
+ n, name, size));
+ return;
+ }
+
+ size /= 1024;
+ if (size / 1024 < 10) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zuMB) is larger than maximum allowed: skipped\n",
+ n, name, size));
+ return;
+ }
+
+ size /= 1024;
+ if (size / 1024 < 10) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zuGB) is larger than maximum allowed: skipped\n",
+ n, name, size));
+ return;
+ }
+
+ size /= 1024;
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zuTB) is larger than maximum allowed: skipped\n",
+ n, name, size));
+}
+
+/* download if not found; obey size restriction */
+static rc_t ItemDownload(Item *item) {
+ bool isLocal = false;
+ int n = 0;
+ rc_t rc = 0;
+ Resolved *self = NULL;
+ assert(item && item->main);
+ n = item->number;
+ self = &item->resolved;
+ assert(self->type);
+
+ if (rc == 0) {
+ bool skip = false;
+ if (self->existing) { /* the path is a path to an existing local file */
+ rc = VPathStrInitStr(&self->path, item->desc, 0);
+ return rc;
+ }
+ if (self->undersized) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zu KB) is smaller than minimum allowed: skipped\n",
+ n, self->name, self->remoteSz / 1024));
+ skip = true;
+ }
+ else if (self->oversized) {
+ logMaxSize(item->main->maxSize);
+ logBigFile(n, self->name, self->remoteSz);
+ skip = true;
+ }
+
+ rc = ResolvedLocal(self, item->main->dir, &isLocal,
+ skip ? eForceNo : item->main->force);
+
+ if (rc == 0) {
+ if (skip && !isLocal) {
+ return rc;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ if (isLocal) {
+ STSMSG(STS_TOP, ("%d) '%s' is found locally", n, self->name));
+ if (self->local.str != NULL) {
+ VPathStrFini(&self->path);
+ rc = StringCopy(&self->path.str, self->local.str);
+ }
+ }
+ else if (!_StringIsFasp(self->remote.str, NULL)
+ && item->main->noHttp)
+ {
+ rc = RC(rcExe, rcFile, rcCopying, rcFile, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc,
+ "cannot download '$(name)' using requested transport",
+ "name=%s", self->name));
+ }
+ else {
+ STSMSG(STS_TOP, ("%d) Downloading '%s'...", n, self->name));
+ rc = MainDownload(self, item->main, item->isDependency);
+ if (rc == 0) {
+ STSMSG(STS_TOP,
+ ("%d) '%s' was downloaded successfully", n, self->name));
+ if (self->cache != NULL) {
+ VPathStrFini(&self->path);
+ rc = StringCopy(&self->path.str, self->cache);
+ }
+ }
+ else if (rc != SILENT_RC(rcExe,
+ rcProcess, rcExecuting, rcProcess, rcCanceled))
+ {
+ STSMSG(STS_TOP, ("%d) failed to download %s", n, self->name));
+ }
+ }
+ }
+ else {
+ STSMSG(STS_TOP, ("%d) cannot locate '%s'", n, self->name));
+ }
+
+ return rc;
+}
+
+static rc_t ItemPrintSized(const Item *self, int32_t row, size_t size) {
+ rc_t rc = 0;
+ const String *projId = NULL;
+ const String *itemId = NULL;
+ const String *accession = NULL;
+ const String *name = NULL;
+ const String *itemDesc = NULL;
+ assert(self && row);
+ if (self->desc != NULL) { /* object */
+ OUTMSG(("%d\t%s\t%,zuB\n", row, self->desc, size));
+ }
+ else { /* kart item */
+ if (rc == 0) {
+ rc = KartItemProjId(self->item, &projId);
+ }
+ if (rc == 0) {
+ rc = KartItemItemId(self->item, &itemId);
+ }
+ if (rc == 0) {
+ rc = KartItemAccession(self->item, &accession);
+ }
+ if (rc == 0) {
+ rc = KartItemName(self->item, &name);
+ }
+ if (rc == 0) {
+ rc = KartItemItemDesc(self->item, &itemDesc);
+ }
+ if (rc == 0) {
+ rc = OUTMSG(("%d\t%S|%S|%S|%S|%S\t%,zuB\n",
+ row, projId, itemId, accession, name, itemDesc, size));
+ }
+ }
+
+ return rc;
+}
+
+/* resolve: locate; download if not found */
+static rc_t ItemResolveResolvedAndDownloadOrProcess(Item *self, int32_t row) {
+ rc_t rc = ItemResolve(self, row);
+ if (rc != 0) {
+ return rc;
+ }
+
+ assert(self);
+
+ if (self->resolved.type == eRunTypeList) {
+ return ItemPrintSized(self, row, self->resolved.remoteSz);
+ }
+ else if (self->resolved.type != eRunTypeDownload) {
+ return rc;
+ }
+
+ return ItemDownload(self);
+}
+
+static rc_t ItemDownloadDependencies(Item *item) {
+ Resolved *resolved = NULL;
+ rc_t rc = 0;
+ const VDBDependencies *deps = NULL;
+ uint32_t count = 0;
+ uint32_t i = 0;
+
+ assert(item && item->main);
+
+ resolved = &item->resolved;
+
+ assert(resolved);
+
+ if (resolved->path.str != NULL) {
+ rc = MainDependenciesList(item->main, resolved, &deps);
+ }
+
+ /* resolve dependencies (refseqs) */
+ if (rc == 0 && deps != NULL) {
+ rc = VDBDependenciesCount(deps, &count);
+ if (rc == 0) {
+ STSMSG(STS_TOP, ("'%s' has %d%s dependenc%s", resolved->name,
+ count, item->main->check_all ? "" : " unresolved",
+ count == 1 ? "y" : "ies"));
+ }
+ else {
+ DISP_RC2(rc, "Failed to check %s's dependencies", resolved->name);
+ }
+ }
+
+ for (i = 0; i < count && rc == 0; ++i) {
+ bool local = true;
+ const char *seq_id = NULL;
+
+ if (rc == 0) {
+ rc = VDBDependenciesLocal(deps, &local, i);
+ DISP_RC2(rc, "VDBDependenciesLocal", resolved->name);
+ if (local) {
+ continue;
+ }
+ }
+
+ if (rc == 0) {
+ rc = VDBDependenciesSeqId(deps, &seq_id, i);
+ DISP_RC2(rc, "VDBDependenciesSeqId", resolved->name);
+ }
+
+ if (rc == 0) {
+ size_t num_writ = 0;
+ char ncbiAcc[512] = "";
+
+ assert(seq_id);
+
+ rc = string_printf(ncbiAcc, sizeof ncbiAcc, &num_writ,
+ "ncbi-acc:%s?vdb-ctx=refseq", seq_id);
+ DISP_RC2(rc, "string_printf(?vdb-ctx=refseq)", seq_id);
+ if (rc == 0 && num_writ > sizeof ncbiAcc) {
+ rc = RC(rcExe, rcFile, rcCopying, rcBuffer, rcInsufficient);
+ PLOGERR(klogInt, (klogInt, rc,
+ "bad string_printf($(s)?vdb-ctx=refseq) result",
+ "s=%s", seq_id));
+ }
+
+ if (rc == 0) {
+ Item *ditem = calloc(1, sizeof *ditem);
+ if (ditem == NULL) {
+ return RC(rcExe,
+ rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ ditem->desc = ncbiAcc;
+ ditem->main = item->main;
+ ditem->isDependency = true;
+
+ ResolvedReset(&ditem->resolved, eRunTypeDownload);
+
+ rc = ItemResolveResolvedAndDownloadOrProcess(ditem, 0);
+
+ RELEASE(Item, ditem);
+ }
+ }
+ }
+
+ RELEASE(VDBDependencies, deps);
+
+ return rc;
+}
+
+static bool ResolvedResetLocalFileAccession(
+ Resolved *self, const Main *main, const char *path)
+{
+ rc_t rc = 0;
+
+ assert(self);
+
+ if (!self->existing) {
+ /* need to check remote vdbcache when accession (no path) is specified */
+ return true;
+ }
+
+ RELEASE(VPath, self->accession);
+ rc = VFSManagerMakePath(main->vfsMgr, &self->accession, "%s", path);
+ if (rc != 0) {
+ DISP_RC2(rc, "VFSManagerMakePath", path);
+ return rc;
+ }
+
+ if (!VPathIsAccessionOrOID(self->accession)) {
+ /* self->accession is not an accession but a path:
+ let's try to get the accession */
+ VPath *acc = NULL;
+ rc = VFSManagerExtractAccessionOrOID(
+ main->vfsMgr, &acc, self->accession);
+ if (rc == 0) {
+ char buffer[99] = "";
+ VPathReadPath(acc, buffer, sizeof buffer, NULL);
+ STSMSG(STS_INFO, ("Accession for '%s' = '%s': "
+ "checking vdbcache", path, buffer));
+
+ RELEASE(VPath, self->accession);
+ self->accession = acc;
+ }
+ else {
+ STSMSG(STS_TOP, ("Cannot extract accession for "
+ "'%s': skipped vdbcache download", path));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static rc_t ItemResetRemoteToVdbcacheIfVdbcacheRemoteExists(
+ Item *self, char *remotePath, size_t remotePathLen, bool *exists)
+{
+ rc_t rc = 0;
+ size_t len = 0;
+ Resolved *resolved = NULL;
+ VPath *cremote = NULL;
+ assert(self && self->main && exists);
+ resolved = &self->resolved;
+ assert(resolved);
+ *exists = false;
+ if (resolved->remote.path == NULL) {
+#define TODO 1
+ rc_t rc = TODO;
+ DISP_RC(rc, "UNKNOWN REMOTE LOCATION WHEN TRYING TO FIND VDBCACHE");
+ return rc;
+ }
+ rc = VFSManagerMakePathWithExtension(self->main->vfsMgr,
+ &cremote, resolved->remote.path, ".vdbcache");
+ if (rc != 0) {
+ if (resolved->remote.str != NULL) {
+ DISP_RC2(rc, "VFSManagerMakePathWithExtension",
+ resolved->remote.str->addr);
+ }
+ else {
+ DISP_RC(rc, "VFSManagerMakePathWithExtension(remote)");
+ }
+ return rc;
+ }
+ rc = VPathReadUri(cremote, remotePath, remotePathLen, &len);
+ if (rc == 0) {
+ RELEASE(KFile, resolved->file);
+ rc = _KFileOpenRemote(&resolved->file, self->main->kns, remotePath);
+ if (rc == 0) {
+ char *query = string_chr(remotePath, len, '?');
+ if (query != NULL) {
+ *query = '\0';
+ }
+ STSMSG(STS_DBG, ("'%s' exists", remotePath));
+ STSMSG(STS_TOP, ("'%s' has remote vdbcache", resolved->name));
+ *exists = true;
+ rc = VPathStrInitStr(&resolved->remote, remotePath, len);
+ DISP_RC2(rc, "StringCopy(Remote.vdbcache)", remotePath);
+ resolved->remote.path = cremote;
+ cremote = NULL;
+ }
+ else if (rc == SILENT_RC(rcNS, rcFile, rcOpening, rcFile, rcNotFound)) {
+ STSMSG(STS_DBG, ("'%s' does not exist", remotePath));
+ *exists = false;
+ STSMSG(STS_TOP, ("'%s' has no remote vdbcache", resolved->name));
+ rc = 0;
+ }
+ else if
+ (rc == SILENT_RC(rcNS, rcFile, rcOpening, rcFile, rcUnauthorized))
+ {
+ STSMSG(STS_DBG, (
+ "Access to '%s's vdbcahe file is forbidden or it does not exist"
+ , resolved->name));
+ *exists = false;
+ STSMSG(STS_TOP, ("'%s' has no remote vdbcache", resolved->name));
+ rc = 0;
+ }
+ else {
+ DISP_RC2(rc, "Failed to check vdbcache", resolved->name);
+ }
+ }
+ RELEASE(VPath, cremote);
+ return rc;
+}
+
+static rc_t MainDetectVdbcacheCachePath(const Main *self,
+ const String *runCache, const VPath **runCachePath,
+ const String **vdbcacheCache)
+{
+ rc_t rc = 0;
+
+ VPath *vlocal = NULL;
+ VPath *clocal = NULL;
+
+ if (runCache == NULL && (runCachePath == NULL || *runCachePath == NULL))
+ {
+ rc_t rc = TODO;
+ DISP_RC(rc, "UNKNOWN CACHE LOCATION WHEN TRYING TO FIND VDBCACHE");
+ return rc;
+ }
+
+ if (runCachePath != NULL && *runCachePath != NULL) {
+ vlocal = (VPath*)*runCachePath;
+ }
+ else {
+ rc = VFSManagerMakePath(self->vfsMgr, &vlocal, "%S", runCache);
+ if (rc != 0) {
+ DISP_RC2(rc, "VFSManagerMakePath", runCache->addr);
+ return rc;
+ }
+ }
+
+ rc = VFSManagerMakePathWithExtension(
+ self->vfsMgr, &clocal, vlocal, ".vdbcache");
+ DISP_RC2(rc, "VFSManagerMakePathWithExtension", runCache->addr);
+
+ if (rc == 0) {
+ rc = VPathMakeString(clocal, vdbcacheCache);
+ }
+
+ RELEASE(VPath, clocal);
+
+ if (runCachePath == NULL) {
+ RELEASE(VPath, vlocal);
+ }
+ else if (*runCachePath == NULL) {
+ *runCachePath = vlocal;
+ }
+
+ return rc;
+}
+
+static bool MainNeedDownload(const Main *self, const String *local,
+ const char *remotePath, const KFile *remote, size_t *remoteSz)
+{
+ KPathType type = kptNotFound;
+ assert(self && local);
+ type = KDirectoryPathType(self->dir, "%s", local->addr) & ~kptAlias;
+ if (type == kptNotFound) {
+ return false;
+ }
+ if (type != kptFile) {
+ if (self->force == eForceNo) {
+ STSMSG(STS_TOP, (
+ "%S (not a file) is found locally: consider it complete",
+ local));
+ return false;
+ }
+ else {
+ STSMSG(STS_TOP, (
+ "%S (not a file) is found locally and will be redownloaded",
+ local));
+ return true;
+ }
+ }
+ else if (self->force != eForceNo) {
+ return true;
+ }
+ else {
+ rc_t rc = 0;
+ size_t sLocal = 0;
+ assert(remoteSz);
+ rc = KFileSize(remote, remoteSz);
+ DISP_RC2(rc, "KFileSize(remote.vdbcache)", remotePath);
+ if (rc != 0) {
+ return true;
+ }
+ {
+ const KFile *f = NULL;
+ rc = KDirectoryOpenFileRead(self->dir, &f, "%S", local);
+ if (rc != 0) {
+ DISP_RC2(rc, "KDirectoryOpenFileRead", local->addr);
+ return true;
+ }
+ rc = KFileSize(f, &sLocal);
+ if (rc != 0) {
+ DISP_RC2(rc, "KFileSize", local->addr);
+ }
+ RELEASE(KFile, f);
+ if (rc != 0) {
+ return true;
+ }
+ }
+ if (sLocal == *remoteSz) {
+ STSMSG(STS_INFO, ("%S (%,lu) is found", local, sLocal));
+ return false;
+ }
+ else {
+ STSMSG(STS_INFO,
+ ("%S (%,lu) is found and will be redownloaded", local, sLocal));
+ return true;
+ }
+ }
+}
+
+static rc_t ItemDownloadVdbcache(Item *item) {
+ rc_t rc = 0;
+ Resolved *resolved = NULL;
+ bool checkRemote = true;
+ bool remoteExists = false;
+ char remotePath[PATH_MAX] = "";
+ const String *local = NULL;
+ const String *cache = NULL;
+ bool localExists = false;
+ bool download = true;
+ assert(item && item->main);
+ resolved = &item->resolved;
+ if (!resolved) {
+ STSMSG(STS_TOP,
+ ("CANNOT DOWNLOAD VDBCACHE FOR UNRESOLVED ITEM '%s'", item->desc));
+ /* TODO error? */
+ return 0;
+ }
+ {
+ bool csra = false;
+ const VDatabase *db = NULL;
+ KPathType type = VDBManagerPathType
+ (item->main->mgr, "%S", resolved->path.str) & ~kptAlias;
+ if (type == kptTable) {
+ STSMSG(STS_INFO, ("'%S' is a table", resolved->path.str));
+ }
+ else if (type != kptDatabase) {
+ STSMSG(STS_INFO, ("'%S' is not recognized as a database or a table",
+ resolved->path.str));
+ }
+ else {
+ rc_t rc = VDBManagerOpenDBRead(item->main->mgr,
+ &db, NULL, "%S", resolved->path.str);
+ if (rc == 0) {
+ csra = VDatabaseIsCSRA(db);
+ }
+ RELEASE(VDatabase, db);
+ if (csra) {
+ STSMSG(STS_INFO, ("'%s' is cSRA", resolved->name));
+ }
+ else {
+ STSMSG(STS_INFO, ("'%s' is not cSRA", resolved->name));
+ }
+ if (!csra) {
+ return 0;
+ }
+ }
+ }
+ if (resolved->remote.str == NULL ||
+ _StringIsFasp(resolved->remote.str, NULL))
+ {
+ if (item->main->noHttp) {
+ /* fasp download
+ return 0; ignore fasp-only transpot */
+ }
+ if (resolved->resolver == NULL) {
+ rc = VResolverAddRef(item->main->resolver);
+ if (rc == 0) {
+ resolved->resolver = item->main->resolver;
+ }
+ assert(!rc && resolved->resolver);
+ }
+ {
+ const char *path = item->desc;
+ if (path == NULL && resolved->path.str != NULL) {
+ path = resolved->path.str->addr;
+ }
+ checkRemote
+ = ResolvedResetLocalFileAccession(resolved, item->main, path);
+ }
+ if (checkRemote) {
+ rc_t rc2 = VPathStrFini(&resolved->remote);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ RELEASE(KFile, resolved->file);
+ rc = _VResolverRemote(resolved->resolver, 0,
+ resolved->name, resolved->accession, &resolved->remote.path,
+ &resolved->remote.str, &resolved->cache);
+ }
+ }
+ if (!checkRemote) {
+ return 0;
+ }
+ if (rc == 0) {
+ rc = ItemResetRemoteToVdbcacheIfVdbcacheRemoteExists(
+ item, remotePath, sizeof remotePath, &remoteExists);
+ }
+ if (!remoteExists) {
+ return 0;
+ }
+ {
+ bool cacheExists = false;
+ if (resolved->existing) {
+ /* resolved->path.str is a local file path */
+ rc = MainDetectVdbcacheCachePath(item->main,
+ resolved->path.str, &resolved->path.path, &local);
+ assert(local);
+ localExists = (VDBManagerPathType(item->main->mgr, "%S", local)
+ & ~kptAlias) != kptNotFound;
+ STSMSG(STS_DBG, ("'%S' %sexist%s", local,
+ localExists ? "" : "does not ", localExists ? "s" : ""));
+ }
+ /* check vdbcache file cache location and its existence */
+ rc = MainDetectVdbcacheCachePath(item->main,
+ resolved->cache, NULL, &cache);
+ cacheExists = (VDBManagerPathType(item->main->mgr, "%S", cache)
+ & ~kptAlias) != kptNotFound;
+ STSMSG(STS_DBG, ("'%S' %sexist%s", cache,
+ cacheExists ? "" : "does not ", cacheExists ? "s" : ""));
+ if (!localExists) {
+ localExists = cacheExists;
+ }
+ }
+ if (!remoteExists) {
+ return 0;
+ }
+ if (localExists) {
+ download = MainNeedDownload(item->main, local ? local : cache,
+ remotePath, resolved->file, &resolved->remoteSz);
+ }
+ RELEASE(String, local);
+ RELEASE(String, resolved->cache);
+ resolved->cache = cache;
+ if (download && rc == 0) {
+
+ /* ignore fasp transport request while ascp vdbcache address is unknown */
+ item->main->noHttp = false;
+
+ rc = MainDownload(&item->resolved, item->main, item->isDependency);
+ if (rc == 0) {
+ if (local && StringCompare(local, cache) != 0) {
+ STSMSG(STS_DBG, ("Removing '%S'", local));
+ /* TODO rm local vdbcache file
+ if full path is specified and it is not the cache path
+ rc = KDirectoryRemove(item->main->dir, false, "%S", local);
+ */
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t ItemPostDownload(Item *item, int32_t row) {
+ rc_t rc = 0;
+ Resolved *resolved = NULL;
+ KPathType type = kptNotFound;
+ assert(item);
+ resolved = &item->resolved;
+ if (resolved->type == eRunTypeList) {
+ return rc;
+ }
+ else if (resolved->oversized) {
+ item->main->oversized = true;
+ }
+ else if (resolved->undersized) {
+ item->main->undersized = true;
+ }
+
+ if (resolved->path.str != NULL) {
+ assert(item->main);
+ rc = _VDBManagerSetDbGapCtx(item->main->mgr, resolved->resolver);
+ type = VDBManagerPathType
+ (item->main->mgr, "%s", resolved->name) & ~kptAlias;
+ if (type != kptDatabase) {
+ if (type == kptTable) {
+ STSMSG(STS_DBG, ("...'%S' is a table", resolved->path.str));
+ }
+ else {
+ STSMSG(STS_DBG, ("...'%S' is not recognized "
+ "as a database or a table", resolved->path.str));
+ }
+ return rc;
+ }
+ else {
+ STSMSG(STS_DBG, ("...'%S' is a database", resolved->path.str));
+ }
+ }
+
+ rc = ItemDownloadDependencies(item);
+ if (true) {
+ rc_t rc2 = Quitting();
+ if (rc2 == 0) {
+ rc2 = ItemDownloadVdbcache(item);
+ }
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
+
+static rc_t ItemProcess(Item *item, int32_t row) {
+ rc_t rc = 0;
+
+ assert(item);
+
+ /* resolve: locate; download if not found */
+ rc = ItemResolveResolvedAndDownloadOrProcess(item, row);
+
+ if (item->resolved.type != eRunTypeDownload) {
+ return rc;
+ }
+
+ if (rc == 0) {
+ rc = ItemPostDownload(item, row);
+ }
+
+ return rc;
+}
+
+/*********** Iterator **********/
+static
+rc_t IteratorInit(Iterator *self, const char *obj, const Main *main)
+{
+ rc_t rc = 0;
+
+ KPathType type = kptNotFound;
+
+ assert(self && main);
+ memset(self, 0, sizeof *self);
+
+#if _DEBUGGING
+ if (obj == NULL && main->textkart) {
+ type = KDirectoryPathType(main->dir, "%s", main->textkart);
+ if ((type & ~kptAlias) != kptFile) {
+ rc = RC(rcExe, rcFile, rcOpening, rcFile, rcNotFound);
+ DISP_RC(rc, main->textkart);
+ return rc;
+ }
+ rc = KartMakeText(main->dir, main->textkart, &self->kart,
+ &self->isKart);
+ if (rc != 0) {
+ if (!self->isKart) {
+ rc = 0;
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "'$(F)' is not a text kart file",
+ "F=%s", main->textkart));
+ }
+ }
+ return rc;
+ }
+#endif
+
+ assert(obj);
+ type = KDirectoryPathType(main->dir, "%s", obj);
+ if ((type & ~kptAlias) == kptFile) {
+ type = VDBManagerPathType(main->mgr, "%s", obj);
+ if ((type & ~kptAlias) == kptFile) {
+ rc = KartMake(main->dir, obj, &self->kart, &self->isKart);
+ if (!self->isKart) {
+ rc = 0;
+ }
+ }
+ }
+
+ if (rc == 0 && !self->isKart) {
+ self->obj = obj;
+ }
+
+ return rc;
+}
+
+static rc_t IteratorNext(Iterator *self, Item **next, bool *done) {
+ rc_t rc = 0;
+
+ assert(self && next && done);
+
+ *next = NULL;
+
+ if (self->done) {
+ *done = true;
+ return 0;
+ }
+
+ *done = false;
+
+ *next = calloc(1, sizeof **next);
+ if (*next == NULL) {
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ if (self->isKart) {
+ rc = KartMakeNextItem(self->kart, &(*next)->item);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Invalid kart file: cannot read next row");
+ }
+ else if ((*next)->item == NULL) {
+ RELEASE(Item, *next);
+ *next = NULL;
+ *done = true;
+ }
+
+ if (rc == 0 && *done) {
+ self->done = true;
+ }
+ }
+ else {
+ rc = ItemInit(*next, self->obj);
+
+ self->done = true;
+ }
+
+ return rc;
+}
+
+static void IteratorFini(Iterator *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ RELEASE(Kart, self->kart);
+}
+
+/*********** Command line arguments **********/
+
+static size_t _sizeFromString(const char *val) {
+ size_t s = 0;
+
+ for (s = 0; *val != '\0'; ++val) {
+ if (*val < '0' || *val > '9') {
+ break;
+ }
+ s = s * 10 + *val - '0';
+ }
+
+ if (*val == '\0' || *val == 'k' || *val == 'K') {
+ s *= 1024L;
+ }
+ else if (*val == 'b' || *val == 'B') {
+ }
+ else if (*val == 'm' || *val == 'M') {
+ s *= 1024L * 1024;
+ }
+ else if (*val == 'g' || *val == 'G') {
+ s *= 1024L * 1024 * 1024;
+ }
+ else if (*val == 't' || *val == 'T') {
+ s *= 1024L * 1024 * 1024 * 1024;
+ }
+ else if (*val == 'u' || *val == 'U') { /* unlimited */
+ s = 0;
+ }
+
+ return s;
+}
+
+#define ASCP_OPTION "ascp-path"
+#define ASCP_ALIAS "a"
+static const char* ASCP_USAGE[] =
+{ "path to ascp program and private key file (asperaweb_id_dsa.putty)", NULL };
+
+#define ASCP_PAR_OPTION "ascp-options"
+#define ASCP_PAR_ALIAS NULL
+static const char* ASCP_PAR_USAGE[] =
+{ "arbitrary options to pass to ascp command line", NULL };
+
+#define CHECK_ALL_OPTION "check-all"
+#define CHECK_ALL_ALIAS "c"
+static const char* CHECK_ALL_USAGE[] = { "double-check all refseqs", NULL };
+
+#define FORCE_OPTION "force"
+#define FORCE_ALIAS "f"
+static const char* FORCE_USAGE[] = {
+ "force object download - one of: no, yes, all.",
+ "no [default]: skip download if the object if found and complete;",
+ "yes: download it even if it is found and is complete;", "all: ignore lock "
+ "files (stale locks or it is being downloaded by another process: "
+ "use at your own risk!)", NULL };
+
+#define FAIL_ASCP_OPTION "FAIL-ASCP"
+#define FAIL_ASCP_ALIAS "F"
+static const char* FAIL_ASCP_USAGE[] = {
+ "force ascp download fail to test ascp->http download combination" };
+
+#define LIST_OPTION "list"
+#define LIST_ALIAS "l"
+static const char* LIST_USAGE[] = { "list the content of a kart file", NULL };
+
+#define NM_L_OPTION "numbered-list"
+#define NM_L_ALIAS "n"
+static const char* NM_L_USAGE[] =
+{ "list the content of a kart file with kart row numbers", NULL };
+
+#define MINSZ_OPTION "min-size"
+#define MINSZ_ALIAS "N"
+static const char* MINSZ_USAGE[] =
+{ "minimum file size to download in KB (inclusive).", NULL };
+
+#define ORDR_OPTION "order"
+#define ORDR_ALIAS "o"
+static const char* ORDR_USAGE[] = { "kart prefetch order: one of: kart, size.",
+ "(in kart order, by file size: smallest first), default: size", NULL };
+
+#define HBEAT_OPTION "progress"
+#define HBEAT_ALIAS "p"
+static const char* HBEAT_USAGE[] = {
+ "time period in minutes to display download progress",
+ "(0: no progress), default: 1", NULL };
+
+#define ROWS_OPTION "rows"
+#define ROWS_ALIAS "R"
+static const char* ROWS_USAGE[] =
+{ "kart rows (default all).", "row list should be ordered", NULL };
+
+#define SZ_L_OPTION "list-sizes"
+#define SZ_L_ALIAS "s"
+static const char* SZ_L_USAGE[] =
+{ "list the content of a kart file with target file sizes", NULL };
+
+#define TRANS_OPTION "transport"
+#define TRASN_ALIAS "t"
+static const char* TRANS_USAGE[] = { "transport: one of: fasp; http; both.",
+ "(fasp only; http only; first try fasp (ascp), "
+ "use http if cannot download using fasp).",
+ "Default: both", NULL };
+
+#define DEFAULT_MAX_FILE_SIZE "20G"
+#define SIZE_OPTION "max-size"
+#define SIZE_ALIAS "X"
+static const char* SIZE_USAGE[] = {
+ "maximum file size to download in KB (exclusive).",
+ "Default: " DEFAULT_MAX_FILE_SIZE, NULL };
+
+#if ALLOW_STRIP_QUALS
+#define STRIP_QUALS_OPTION "strip-quals"
+#define STRIP_QUALS_ALIAS NULL
+static const char* STRIP_QUALS_USAGE[] =
+{ "remove QUALITY column from all tables", NULL };
+#endif
+
+#define ELIM_QUALS_OPTION "eliminate-quals"
+#define ELIM_QUALS_ALIAS NULL
+static const char* ELIM_QUALS_USAGE[] =
+{ "don't download QUALITY column", NULL };
+
+#if _DEBUGGING
+#define TEXTKART_OPTION "text-kart"
+static const char* TEXTKART_USAGE[] =
+{ "To read a textual format kart file (DEBUG ONLY)", NULL };
+#endif
+
+static OptDef Options[] = {
+ /* needs_value required*/
+ { FORCE_OPTION , FORCE_ALIAS , NULL, FORCE_USAGE , 1, true, false }
+ ,{ TRANS_OPTION , TRASN_ALIAS , NULL, TRANS_USAGE , 1, true, false }
+ ,{ LIST_OPTION , LIST_ALIAS , NULL, LIST_USAGE , 1, false,false }
+ ,{ NM_L_OPTION , NM_L_ALIAS , NULL, NM_L_USAGE , 1, false,false }
+ ,{ SZ_L_OPTION , SZ_L_ALIAS , NULL, SZ_L_USAGE , 1, false,false }
+ ,{ ROWS_OPTION , ROWS_ALIAS , NULL, ROWS_USAGE , 1, true, false }
+ ,{ MINSZ_OPTION , MINSZ_ALIAS , NULL, MINSZ_USAGE , 1, true ,false }
+ ,{ SIZE_OPTION , SIZE_ALIAS , NULL, SIZE_USAGE , 1, true ,false }
+ ,{ ORDR_OPTION , ORDR_ALIAS , NULL, ORDR_USAGE , 1, true ,false }
+ ,{ ASCP_OPTION , ASCP_ALIAS , NULL, ASCP_USAGE , 1, true ,false }
+ ,{ ASCP_PAR_OPTION , ASCP_PAR_ALIAS , NULL, ASCP_PAR_USAGE, 1, true ,false }
+ ,{ HBEAT_OPTION , HBEAT_ALIAS , NULL, HBEAT_USAGE , 1, true, false }
+ ,{ FAIL_ASCP_OPTION , FAIL_ASCP_ALIAS , NULL, FAIL_ASCP_USAGE, 1, false, false}
+#if ALLOW_STRIP_QUALS
+ ,{ STRIP_QUALS_OPTION , STRIP_QUALS_ALIAS , NULL, STRIP_QUALS_USAGE , 1, false, false }
+#endif
+ ,{ ELIM_QUALS_OPTION , ELIM_QUALS_ALIAS , NULL, ELIM_QUALS_USAGE , 1, false, false }
+#if _DEBUGGING
+ ,{ TEXTKART_OPTION , NULL , NULL, TEXTKART_USAGE , 1, true , false}
+#endif
+ ,{ CHECK_ALL_OPTION , CHECK_ALL_ALIAS , NULL, CHECK_ALL_USAGE, 1, false, false}
+};
+
+static ParamDef Parameters[] = { { ArgsConvFilepath } };
+
+static rc_t MainProcessArgs(Main *self, int argc, char *argv[]) {
+ rc_t rc = 0;
+
+ uint32_t pcount = 0;
+
+ assert(self);
+
+ rc = ArgsMakeAndHandle2(&self->args, argc, argv,
+ Parameters, sizeof Parameters / sizeof Parameters[0],
+ 1, Options, sizeof Options / sizeof Options[0]);
+ if (rc != 0) {
+ DISP_RC(rc, "ArgsMakeAndHandle");
+ return rc;
+ }
+
+ do {
+/* FORCE_OPTION goes first */
+ rc = ArgsOptionCount (self->args, FORCE_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" FORCE_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ const char *val = NULL;
+ rc = ArgsOptionValue(self->args, FORCE_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" FORCE_OPTION "' argument value");
+ break;
+ }
+ if (val == NULL || val[0] == '\0') {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc,
+ "Unrecognized '" FORCE_OPTION "' argument value");
+ break;
+ }
+ switch (val[0]) {
+ case 'n':
+ case 'N':
+ self->force = eForceNo;
+ break;
+ case 'y':
+ case 'Y':
+ self->force = eForceYes;
+ break;
+ case 'a':
+ case 'A':
+ self->force = eForceYES;
+ break;
+ default:
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc,
+ "Unrecognized '" FORCE_OPTION "' argument value");
+ break;
+ }
+ if (rc != 0) {
+ break;
+ }
+ }
+
+/* CHECK_ALL_OPTION goes after FORCE_OPTION */
+ rc = ArgsOptionCount(self->args, CHECK_ALL_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" CHECK_ALL_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0 || self->force != eForceNo) {
+ self->check_all = true;
+ }
+
+/******* LIST OPTIONS BEGIN ********/
+/* LIST_OPTION */
+ rc = ArgsOptionCount(self->args, LIST_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" LIST_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ self->list_kart = true;
+ }
+
+/* NM_L_OPTION */
+ rc = ArgsOptionCount(self->args, NM_L_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" NM_L_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ self->list_kart = self->list_kart_numbered = true;
+ }
+
+/* SZ_L_OPTION */
+ rc = ArgsOptionCount(self->args, SZ_L_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" SZ_L_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) { /* self->list_kart is not set here! */
+ self->list_kart_sized = true;
+ }
+/******* LIST OPTIONS END ********/
+
+/* ASCP_OPTION */
+ rc = ArgsOptionCount(self->args, ASCP_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" ASCP_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ const char *val = NULL;
+ rc = ArgsOptionValue(self->args, ASCP_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" ASCP_OPTION "' argument value");
+ break;
+ }
+ if (val != NULL) {
+ char *sep = strchr(val, '|');
+ if (sep == NULL) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc,
+ "ascp-path expected in the following format:\n"
+ "--" ASCP_OPTION " \"<ascp-binary|private-key-file>\"\n"
+ "Examples:\n"
+ "--" ASCP_OPTION " \"/usr/bin/ascp|/etc/asperaweb_id_dsa.putty\"\n"
+ "--" ASCP_OPTION " \"C:\\Program Files\\Aspera\\ascp.exe|C:\\Program Files\\Aspera\\etc\\asperaweb_id_dsa.putty\"\n");
+ break;
+ }
+ else {
+ self->ascp = string_dup(val, sep - val);
+ self->asperaKey = string_dup_measure(sep + 1, NULL);
+ self->ascpChecked = true;
+ }
+ }
+ }
+
+/* ASCP_PAR_OPTION */
+ rc = ArgsOptionCount(self->args, ASCP_PAR_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" ASCP_PAR_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(self->args,
+ ASCP_PAR_OPTION, 0, (const void **)&self->ascpParams);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" ASCP_PAR_OPTION "' argument value");
+ break;
+ }
+ }
+
+/* FAIL_ASCP_OPTION */
+ rc = ArgsOptionCount(self->args, FAIL_ASCP_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" FAIL_ASCP_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ self->forceAscpFail = true;
+ }
+
+/* HBEAT_OPTION */
+ rc = ArgsOptionCount(self->args, HBEAT_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" HBEAT_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ double f;
+ const char *val = NULL;
+ rc = ArgsOptionValue(self->args, HBEAT_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" HBEAT_OPTION "' argument value");
+ break;
+ }
+ f = atof(val) * 60000;
+ self->heartbeat = (uint64_t)f;
+ }
+
+/* ORDR_OPTION */
+ rc = ArgsOptionCount(self->args, ORDR_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" ORDR_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ const char *val = NULL;
+ rc = ArgsOptionValue(self->args, ORDR_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" ORDR_OPTION "' argument value");
+ break;
+ }
+ if (val != NULL && val[0] == 's') {
+ self->order = eOrderSize;
+ }
+ else {
+ self->order = eOrderOrig;
+ }
+ }
+
+/* ROWS_OPTION */
+ rc = ArgsOptionCount(self->args, ROWS_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" ROWS_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(self->args, ROWS_OPTION, 0, (const void **)&self->rows);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" ROWS_OPTION "' argument value");
+ break;
+ }
+ }
+
+/* MINSZ_OPTION */
+ {
+ const char *val = "0";
+ rc = ArgsOptionCount(self->args, MINSZ_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" MINSZ_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(self->args, MINSZ_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" MINSZ_OPTION "' argument value");
+ break;
+ }
+ }
+ self->minSize = _sizeFromString(val);
+ }
+
+/* SIZE_OPTION */
+ {
+ const char *val = DEFAULT_MAX_FILE_SIZE;
+ rc = ArgsOptionCount(self->args, SIZE_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr,
+ rc, "Failure to get '" SIZE_OPTION "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(self->args, SIZE_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" SIZE_OPTION "' argument value");
+ break;
+ }
+ }
+ self->maxSize = _sizeFromString(val);
+ if (self->maxSize == 0) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Maximum requested file size is zero");
+ break;
+ }
+ }
+
+ if (self->maxSize > 0 && self->minSize > self->maxSize) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Minimum file size is larger than maximum");
+ break;
+ }
+
+/* TRANS_OPTION */
+ rc = ArgsOptionCount(self->args, TRANS_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" TRANS_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ bool ok = false;
+ const char *val = NULL;
+ rc = ArgsOptionValue
+ (self->args, TRANS_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" TRANS_OPTION "' argument value");
+ break;
+ }
+ assert(val);
+ switch (val[0]) {
+ case 'a':
+ case 'f': {
+ const char ascp[] = "ascp";
+ const char fasp[] = "fasp";
+ if (string_cmp(val, string_measure(val, NULL),
+ ascp, sizeof ascp - 1, sizeof ascp - 1) == 0
+ ||
+ string_cmp(val, string_measure(val, NULL),
+ fasp, sizeof fasp - 1, sizeof fasp - 1) == 0
+ ||
+ (val[0] == 'a' && val[1] == '\0'))
+ {
+ self->noHttp = true;
+ ok = true;
+ }
+ break;
+ }
+ case 'h': {
+ const char http[] = "http";
+ if (string_cmp(val, string_measure(val, NULL),
+ http, sizeof http - 1, sizeof http - 1) == 0
+ || val[1] == '\0')
+ {
+ self->noAscp = true;
+ ok = true;
+ }
+ break;
+ }
+ }
+ if (!ok) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Bad '" TRANS_OPTION "' argument value");
+ break;
+ }
+ }
+
+#if ALLOW_STRIP_QUALS
+/* STRIP_QUALS_OPTION */
+ rc = ArgsOptionCount(self->args, STRIP_QUALS_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" STRIP_QUALS_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ self->stripQuals = true;
+ }
+#endif
+
+/* ELIM_QUALS_OPTION */
+ rc = ArgsOptionCount(self->args, ELIM_QUALS_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" ELIM_QUALS_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ self->eliminateQuals = true;
+ }
+
+#if ALLOW_STRIP_QUALS
+ if (self->stripQuals && self->eliminateQuals) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Cannot set both '" STRIP_QUALS_OPTION "' and '" ELIM_QUALS_OPTION "'");
+ break;
+ }
+#endif
+
+#if _DEBUGGING
+/* TEXTKART_OPTION */
+ rc = ArgsOptionCount(self->args, TEXTKART_OPTION, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" TEXTKART_OPTION "' argument");
+ break;
+ }
+
+ if (pcount > 0) {
+ const char *val = NULL;
+ rc = ArgsOptionValue(self->args, TEXTKART_OPTION, 0, (const void **)&val);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" TEXTKART_OPTION "' argument value");
+ break;
+ }
+ self->textkart = val;
+ }
+#endif
+ } while (false);
+
+ STSMSG(STS_FIN, ("heartbeat = %ld Milliseconds", self->heartbeat));
+
+ return rc;
+}
+
+const char UsageDefaultName[] = "prefetch";
+rc_t CC UsageSummary(const char *progname) {
+ return OUTMSG((
+ "Usage:\n"
+ " %s [options] <SRA accession | kart file> [...]\n"
+ " Download SRA or dbGaP files and their dependencies\n"
+ "\n"
+ " %s [options] <SRA file> [...]\n"
+ " Check SRA file for missed dependencies "
+ "and download them\n"
+ "\n"
+ " %s --list <kart file> [...]\n"
+ " List the content of a kart file\n\n"
+ , progname, progname, progname));
+}
+
+rc_t CC Usage(const Args *args) {
+ rc_t rc = 0;
+ int i = 0;
+
+ const char *progname = UsageDefaultName;
+ const char *fullpath = UsageDefaultName;
+
+ if (args == NULL) {
+ rc = RC(rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+ }
+ else {
+ rc = ArgsProgram(args, &fullpath, &progname);
+ }
+ if (rc != 0) {
+ progname = fullpath = UsageDefaultName;
+ }
+
+ UsageSummary(progname);
+ OUTMSG(("\n"));
+
+ OUTMSG(("Options:\n"));
+ for (i = 0; i < sizeof(Options) / sizeof(Options[0]); i++ ) {
+ const char *param = NULL;
+
+ if (Options[i].aliases != NULL) {
+ if (strcmp(Options[i].aliases, FAIL_ASCP_ALIAS) == 0) {
+ continue; /* debug option */
+ }
+ if (strcmp(Options[i].aliases, ASCP_ALIAS) == 0) {
+ param = "ascp-binary|private-key-file";
+ }
+ else if (strcmp(Options[i].aliases, FORCE_ALIAS) == 0 ||
+ strcmp(Options[i].aliases, HBEAT_ALIAS) == 0 ||
+ strcmp(Options[i].aliases, HBEAT_ALIAS) == 0 ||
+ strcmp(Options[i].aliases, ORDR_ALIAS) == 0 ||
+ strcmp(Options[i].aliases, TRASN_ALIAS) == 0)
+ {
+ param = "value";
+ }
+ else if (strcmp(Options[i].aliases, ROWS_ALIAS) == 0) {
+ param = "rows";
+ }
+ else if (strcmp(Options[i].aliases, SIZE_ALIAS) == 0
+ || strcmp(Options[i].aliases, MINSZ_ALIAS) == 0)
+ {
+ param = "size";
+ }
+ }
+ else if (strcmp(Options[i].name, ASCP_PAR_OPTION) == 0) {
+ param = "value";
+ }
+#if _DEBUGGING
+ else if (strcmp(Options[i].name, TEXTKART_OPTION) == 0) {
+ param = "value";
+ }
+#endif
+
+ if (Options[i].aliases != NULL &&
+ (strcmp(Options[i].aliases, TRASN_ALIAS) == 0 ||
+ strcmp(Options[i].aliases, CHECK_ALL_ALIAS) == 0))
+ {
+ OUTMSG(("\n"));
+ }
+
+ HelpOptionLine(Options[i].aliases, Options[i].name,
+ param, Options[i].help);
+ }
+
+ OUTMSG(("\n"));
+ HelpOptionsStandard();
+ HelpVersion(fullpath, KAppVersion());
+
+ return rc;
+}
+
+/******************************************************************************/
+
+/********** KartTreeNode **********/
+static void CC bstKrtWhack(BSTNode *n, void *ignore) {
+ KartTreeNode *sn = (KartTreeNode*) n;
+
+ assert(sn);
+
+ ItemRelease(sn->i);
+
+ memset(sn, 0, sizeof *sn);
+
+ free(sn);
+}
+
+static int64_t CC bstKrtSort(const BSTNode *item, const BSTNode *n) {
+ const KartTreeNode *sn1 = (const KartTreeNode*)item;
+ const KartTreeNode *sn2 = (const KartTreeNode*)n;
+
+ assert(sn1 && sn2 && sn1->i && sn2->i);
+
+ if (sn1->i->resolved.remoteSz < sn2->i->resolved.remoteSz)
+ return -1;
+ else if (sn1->i->resolved.remoteSz > sn2->i->resolved.remoteSz)
+ return 1;
+
+ return 0;
+}
+
+static void CC bstKrtDownload(BSTNode *n, void *data) {
+ rc_t rc = 0;
+
+ const KartTreeNode *sn = (const KartTreeNode*) n;
+ assert(sn && sn->i);
+
+ rc = ItemDownload(sn->i);
+
+ if (rc == 0) {
+ rc = ItemPostDownload(sn->i, sn->i->number);
+ }
+}
+
+/*********** Finalize Main object **********/
+static rc_t MainFini(Main *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ RELEASE(KConfig, self->cfg);
+ RELEASE(VResolver, self->resolver);
+ RELEASE(VDBManager, self->mgr);
+ RELEASE(KDirectory, self->dir);
+ RELEASE(KRepositoryMgr, self->repoMgr);
+ RELEASE(KNSManager, self->kns);
+ RELEASE(VFSManager, self->vfsMgr);
+ RELEASE(Args, self->args);
+
+ BSTreeWhack(&self->downloaded, bstWhack, NULL);
+
+ free(self->buffer);
+
+ free((void*)self->ascp);
+ free((void*)self->asperaKey);
+ free(self->ascpMaxRate);
+
+ memset(self, 0, sizeof *self);
+
+ return rc;
+}
+
+/*********** Initialize Main object **********/
+static rc_t MainInit(int argc, char *argv[], Main *self) {
+ rc_t rc = 0;
+
+ assert(self);
+ memset(self, 0, sizeof *self);
+
+ self->heartbeat = 60000;
+/* self->heartbeat = 69; */
+
+ BSTreeInit(&self->downloaded);
+
+ if (rc == 0) {
+ rc = MainProcessArgs(self, argc, argv);
+ }
+
+ if (rc == 0) {
+ self->bsize = 1024 * 1024;
+ self->buffer = malloc(self->bsize);
+ if (self->buffer == NULL) {
+ rc = RC(rcExe, rcData, rcAllocating, rcMemory, rcExhausted);
+ }
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerMake(&self->vfsMgr);
+ DISP_RC(rc, "VFSManagerMake");
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VFSManagerGetKNSMgr (self->vfsMgr, & self->kns);
+ DISP_RC(rc, "VFSManagerGetKNSMgr");
+ }
+
+ if (rc == 0) {
+ VResolver *resolver = NULL;
+ rc = VFSManagerGetResolver(self->vfsMgr, &resolver);
+ DISP_RC(rc, "VFSManagerGetResolver");
+ VResolverRemoteEnable(resolver, vrAlwaysEnable);
+ VResolverCacheEnable(resolver, vrAlwaysEnable);
+ RELEASE(VResolver, resolver);
+ }
+
+ if (rc == 0) {
+ rc = KConfigMake(&self->cfg, NULL);
+ DISP_RC(rc, "KConfigMake");
+ }
+
+ if (rc == 0) {
+ rc = KConfigMakeRepositoryMgrRead(self->cfg, &self->repoMgr);
+ DISP_RC(rc, "KConfigMakeRepositoryMgrRead");
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerMakeResolver(self->vfsMgr, &self->resolver, self->cfg);
+ DISP_RC(rc, "VFSManagerMakeResolver");
+ }
+
+ if (rc == 0) {
+ VResolverRemoteEnable(self->resolver, vrAlwaysEnable);
+ VResolverCacheEnable(self->resolver, vrAlwaysEnable);
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerMakeRead(&self->mgr, NULL);
+ DISP_RC(rc, "VDBManagerMakeRead");
+ }
+
+ if (rc == 0) {
+ rc = KDirectoryNativeDir(&self->dir);
+ DISP_RC(rc, "KDirectoryNativeDir");
+ }
+
+ if (rc == 0) {
+ srand((unsigned)time(NULL));
+ }
+
+ return rc;
+}
+
+/*********** Process one command line argument **********/
+static rc_t MainRun(Main *self, const char *arg, const char *realArg) {
+ ERunType type = eRunTypeDownload;
+ rc_t rc = 0;
+ Iterator it;
+ assert(self && realArg);
+ memset(&it, 0, sizeof it);
+
+ if (rc == 0) {
+ rc = IteratorInit(&it, arg, self);
+ }
+
+ if (self->list_kart_sized) {
+ type = eRunTypeList;
+ }
+ else if (self->order == eOrderSize) {
+ if (rc == 0 && it.kart == NULL) {
+ type = eRunTypeDownload;
+ }
+ else {
+ type = eRunTypeGetSize;
+ }
+ }
+ else {
+ type = eRunTypeDownload;
+ }
+
+ if (rc == 0) {
+ BSTree trKrt;
+ BSTreeInit(&trKrt);
+ if (self->list_kart) {
+ if (it.kart != NULL) {
+ if (self->list_kart_numbered) {
+ rc = KartPrintNumbered(it.kart);
+ }
+ else {
+ rc = KartPrint(it.kart);
+ }
+ }
+ else {
+ PLOGMSG(klogWarn, (klogWarn,
+ "'$(F)' is invalid or not a kart file",
+ "F=%s", realArg));
+ }
+ }
+ else {
+ size_t total = 0;
+ const char *row = self->rows;
+ int64_t n = 1;
+ NumIterator nit;
+ NumIteratorInit(&nit, row);
+ if (type == eRunTypeList) {
+ self->maxSize = ~0;
+ if (it.kart != NULL) {
+ OUTMSG((
+ "row\tproj-id|item-id|accession|name|item-desc\tsize\n"));
+ }
+ }
+ else {
+ if (it.kart != NULL) {
+ OUTMSG(("Downloading kart file '%s'\n", realArg));
+ if (type == eRunTypeGetSize) {
+ OUTMSG(("Checking sizes of kart files...\n"));
+ }
+ }
+ OUTMSG(("\n"));
+ }
+
+ for (n = 1; ; ++n) {
+ rc_t rc2 = 0;
+ rc_t rc3 = 0;
+ bool done = false;
+ Item *item = NULL;
+ rc_t rcq = Quitting();
+ if (rcq != 0) {
+ if (rc == 0) {
+ rc = rcq;
+ }
+ break;
+ }
+ rc2 = IteratorNext(&it, &item, &done);
+ if (rc2 != 0 || done) {
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ break;
+ }
+ done = ! NumIteratorNext(&nit, n);
+ if (done) {
+ break;
+ }
+ if (!nit.skip) {
+ item->main = self;
+ ResolvedReset(&item->resolved, type);
+
+ rc3 = ItemProcess(item, (int32_t)n);
+ if (rc3 != 0) {
+ if (rc == 0) {
+ rc = rc3;
+ }
+ }
+ else {
+ if (item->resolved.undersized &&
+ type == eRunTypeGetSize)
+ {
+ STSMSG(STS_TOP,
+ ("%d) '%s' (%,zu KB) is smaller than minimum allowed: skipped\n",
+ n, item->resolved.name, item->resolved.remoteSz / 1024));
+ }
+ else if (item->resolved.oversized &&
+ type == eRunTypeGetSize)
+ {
+ logMaxSize(self->maxSize);
+ logBigFile(n, item->resolved.name,
+ item->resolved.remoteSz);
+ }
+ else {
+ total += item->resolved.remoteSz;
+
+ if (item != NULL) {
+ if (type == eRunTypeGetSize) {
+ KartTreeNode *sn = calloc(1, sizeof *sn);
+ if (sn == NULL) {
+ return RC(rcExe, rcStorage,
+ rcAllocating, rcMemory, rcExhausted);
+ }
+ if (item->resolved.remoteSz == 0) {
+ /* remoteSz is unknown:
+ add it to the end of download list preserving kart order */
+ item->resolved.remoteSz
+ = (~0ul >> 1) + n + 1;
+ }
+ sn->i = item;
+ item = NULL;
+ BSTreeInsert(&trKrt, (BSTNode*)sn,
+ bstKrtSort);
+ }
+ }
+ }
+ }
+ }
+
+ RELEASE(Item, item);
+ }
+
+ if (type == eRunTypeList) {
+ if (it.kart != NULL && total > 0) {
+ OUTMSG(("--------------------\ntotal\t%,zuB\n\n", total));
+ }
+ }
+ else if (type == eRunTypeGetSize) {
+ OUTMSG(("\nDownloading the files...\n\n", realArg));
+ BSTreeForEach(&trKrt, false, bstKrtDownload, NULL);
+ }
+ }
+ BSTreeWhack(&trKrt, bstKrtWhack, NULL);
+ }
+ if (it.isKart) {
+ if (self->list_kart) {
+ rc_t rc2 = OUTMSG(("\n"));
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ }
+ else if (rc == 0) {
+ uint16_t number = 0;
+ rc = KartItemsProcessed(it.kart, &number);
+ if (rc == 0 && number == 0) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "kart file '$(F)' is empty", "F=%s", realArg));
+ }
+ }
+ }
+ IteratorFini(&it);
+
+ return rc;
+}
+
+/*********** Main **********/
+rc_t CC KMain(int argc, char *argv[]) {
+ rc_t rc = 0;
+ bool insufficient = false;
+ uint32_t pcount = 0;
+
+ Main pars;
+ rc = MainInit(argc, argv, &pars);
+
+ if (rc == 0) {
+ rc = ArgsParamCount(pars.args, &pcount);
+ }
+ if (rc == 0 && pcount == 0) {
+#if _DEBUGGING
+ if (!pars.textkart)
+#endif
+ rc = UsageSummary(UsageDefaultName);
+ insufficient = true;
+ }
+
+ if (rc == 0) {
+ uint32_t i = ~0;
+
+#if _DEBUGGING
+ if (pars.textkart) {
+ rc = MainRun(&pars, NULL, pars.textkart);
+ }
+#endif
+
+ for (i = 0; i < pcount; ++i) {
+ const char *obj = NULL;
+ rc_t rc2 = ArgsParamValue(pars.args, i, (const void **)&obj);
+ DISP_RC(rc2, "ArgsParamValue");
+ if (rc2 == 0) {
+ rc2 = MainRun(&pars, obj, obj);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ }
+ }
+
+ if (pars.undersized || pars.oversized) {
+ OUTMSG(("\n"));
+ if (pars.undersized) {
+ OUTMSG((
+ "Download of some files was skipped because they are too small\n"
+ ));
+ }
+ if (pars.oversized) {
+ OUTMSG((
+ "Download of some files was skipped because they are too large\n"
+ ));
+ }
+ OUTMSG((
+ "You can change size download limit by setting\n"
+ "--" MINSZ_OPTION " and --" SIZE_OPTION " command line arguments\n"
+ ));
+ }
+ }
+
+ {
+ rc_t rc2 = MainFini(&pars);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ if ( rc == 0 && insufficient ) {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ }
+
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/.gitignore b/tools/qual-recalib-stat/.gitignore
new file mode 100644
index 0000000..c1e9d15
--- /dev/null
+++ b/tools/qual-recalib-stat/.gitignore
@@ -0,0 +1,3 @@
+*.sh
+*.txt
+stat-table
diff --git a/tools/qual-recalib-stat/Makefile b/tools/qual-recalib-stat/Makefile
new file mode 100644
index 0000000..598a156
--- /dev/null
+++ b/tools/qual-recalib-stat/Makefile
@@ -0,0 +1,84 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/qual-recalib-stat
+
+INT_TOOLS = \
+ qual-recalib-stat
+
+EXT_TOOLS = \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-config
+#
+Q_RECAL_STAT_SRC = \
+ namelist_tools \
+ context \
+ columns \
+ ref_exclude \
+ spot_position \
+ stat_mod_2 \
+ reader \
+ writer \
+ qual-recalib-stat
+
+Q_RECAL_STAT_OBJ = \
+ $(addsuffix .$(OBJX),$(Q_RECAL_STAT_SRC))
+
+Q_RECAL_STAT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/qual-recalib-stat: $(Q_RECAL_STAT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(Q_RECAL_STAT_LIB)
diff --git a/tools/qual-recalib-stat/columns.c b/tools/qual-recalib-stat/columns.c
new file mode 100644
index 0000000..d606822
--- /dev/null
+++ b/tools/qual-recalib-stat/columns.c
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "columns.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <klib/log.h>
+
+rc_t add_column( const VCursor *cursor, col *column, const char *name )
+{
+ rc_t rc = VCursorAddColumn ( cursor, &column->idx, "%s", name );
+ if ( rc != 0 )
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorAddColumn($(name)) failed", "name=%s", name ) );
+ return rc;
+}
+
+
+rc_t add_columns( const VCursor *cursor,
+ col *columns, const char **names, uint32_t n_columns )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ for ( idx = 0; idx < n_columns && rc == 0; ++idx )
+ {
+ rc = add_column( cursor, &columns[ idx ], names[ idx ] );
+ }
+ return rc;
+}
+
+
+rc_t read_cell( const VCursor *my_cursor,
+ int64_t row_id,
+ col *column,
+ const char * name )
+{
+ rc_t rc = VCursorCellDataDirect ( my_cursor, row_id,
+ column->idx, &column->elem_bits, &column->base,
+ &column->bit_offset, &column->row_len );
+ if ( rc != 0 )
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorCellDataDirect($(name),$(rowid)) failed",
+ "name=%s,rowid=%lu", name, row_id ) );
+ return rc;
+}
+
+
+rc_t read_cells( const VCursor *my_cursor, int64_t row_id,
+ col *columns, const char **names, uint32_t n_columns )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ for ( idx = 0; idx < n_columns && rc == 0; ++idx )
+ {
+ rc = read_cell( my_cursor, row_id, &columns[ idx ], names[ idx ] );
+ }
+ return rc;
+}
+
+
+rc_t write_to_cursor( VCursor * cursor, uint32_t idx, uint32_t bsize,
+ void * src, uint32_t count, const char * name )
+{
+ rc_t rc = VCursorWrite( cursor, idx, bsize, src, 0, count );
+ if ( rc != 0 )
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorWrite($(name)) failed", "name=%s", name ) );
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/columns.h b/tools/qual-recalib-stat/columns.h
new file mode 100644
index 0000000..44e85c5
--- /dev/null
+++ b/tools/qual-recalib-stat/columns.h
@@ -0,0 +1,67 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_columns_
+#define _h_columns_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <vdb/cursor.h>
+
+typedef struct col
+{
+ uint32_t idx;
+ uint32_t elem_bits;
+ uint32_t bit_offset;
+ uint32_t row_len;
+ const void * base;
+} col;
+
+
+rc_t add_column( const VCursor *cursor, col *column, const char *name );
+
+rc_t add_columns( const VCursor *cursor,
+ col *columns, const char **names, uint32_t n_columns );
+
+rc_t read_cell( const VCursor *my_cursor,
+ int64_t row_id,
+ col *column,
+ const char * name );
+
+rc_t read_cells( const VCursor *my_cursor, int64_t row_id,
+ col *columns, const char **names, uint32_t n_columns );
+
+rc_t write_to_cursor( VCursor * cursor, uint32_t idx, uint32_t bsize,
+ void * src, uint32_t count, const char * name );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/context.c b/tools/qual-recalib-stat/context.c
new file mode 100644
index 0000000..0eb462a
--- /dev/null
+++ b/tools/qual-recalib-stat/context.c
@@ -0,0 +1,330 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "context.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+/*
+ * helper-function to set a string inside the context
+ * ( makes a copy ) with error detection
+*/
+static rc_t context_set_str( char **dst, const char *src )
+{
+ size_t len;
+ if ( dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ if ( *dst != NULL )
+ {
+ free( *dst );
+ *dst = NULL;
+ }
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ *dst = string_dup_measure ( src, &len );
+
+ if ( len == 0 )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcItem, rcEmpty );
+ if ( *dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcMemory, rcExhausted );
+ return 0;
+}
+
+
+/*
+ * generates a new context, initializes values
+*/
+rc_t context_init( context **ctx )
+{
+ rc_t rc;
+
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ (*ctx) = (p_context)calloc( 1, sizeof **ctx );
+ if ( *ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+
+ /* because of calloc the context is zero'd out
+ default-values can be set here: */
+
+ rc = num_gen_make( &((*ctx)->row_generator) );
+ if ( rc != 0 )
+ OUTMSG(( "num_gen_make() failed %r\n", rc ));
+ return rc;
+}
+
+
+/*
+ * destroys a context, frees all pointers the context owns
+*/
+rc_t context_destroy( p_context ctx )
+{
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcParam, rcNull );
+
+ if ( ctx->src_path != NULL )
+ {
+ free( (void*)ctx->src_path );
+ ctx->src_path = NULL;
+ }
+ if ( ctx->output_file_path != NULL )
+ {
+ free( (void*)ctx->output_file_path );
+ ctx->output_file_path = NULL;
+ }
+ if ( ctx->output_mode != NULL )
+ {
+ free( (void*)ctx->output_mode );
+ ctx->output_mode = NULL;
+ }
+ if ( ctx->src_schema_list != NULL )
+ {
+ KNamelistRelease( ctx->src_schema_list );
+ ctx->src_schema_list = NULL;
+ }
+ num_gen_destroy( ctx->row_generator );
+ free( ctx );
+ return 0;
+}
+
+
+/*
+ * clear's the number-generator and sets the given intervall
+*/
+rc_t context_set_range( p_context ctx,
+ const int64_t first, const uint64_t count )
+{
+ rc_t rc = num_gen_clear( ctx->row_generator );
+ if ( rc == 0 )
+ rc = num_gen_add( ctx->row_generator, first, count );
+ return rc;
+}
+
+
+/*
+ * performs the range check to trim the internal number
+ * generator to the given range
+*/
+rc_t context_range_check( p_context ctx,
+ const int64_t first, const uint64_t count )
+{
+ return num_gen_range_check( ctx->row_generator, first, count );
+}
+
+
+/*
+ * helper-function to set the source-path
+*/
+static rc_t context_set_src_path( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->src_path), src );
+}
+
+/*
+ * helper-function to set the output-path
+*/
+static rc_t context_set_out_file_path( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->output_file_path), src );
+}
+
+
+/*
+ * helper-function to set the output-mode
+*/
+static rc_t context_set_out_mode( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->output_mode), src );
+}
+
+
+/*
+ * helper-function to set path to exclude-db
+*/
+static rc_t context_set_exclude_path( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->exclude_file_path), src );
+}
+
+
+static rc_t context_set_row_range( p_context ctx, const char *src )
+{
+ if ( ( ctx == NULL )||( src == NULL ) )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ return num_gen_parse( ctx->row_generator, src );
+}
+
+
+static bool context_check_if_usage_necessary( p_context ctx )
+{
+ if ( ctx == NULL ) return false;
+ if ( ctx->src_path == NULL )
+ ctx->usage_requested = true;
+ return ctx->usage_requested;
+}
+
+
+static rc_t context_evaluate_arguments( const Args *my_args, p_context ctx )
+{
+ uint32_t count, idx;
+
+ rc_t rc = ArgsParamCount( my_args, &count );
+ if ( rc != 0 )
+ {
+ OUTMSG(( "ArgsParamCount() failed %R\n", rc ));
+ return rc;
+ }
+
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *value = NULL;
+ rc = ArgsParamValue( my_args, idx, (const void **)&value );
+ if ( rc != 0 )
+ {
+ OUTMSG(( "ArgsParamValue() failed %R\n", rc ));
+ }
+ else
+ {
+ switch( idx )
+ {
+ case 0 : rc = context_set_src_path( ctx, value );
+ if ( rc != 0 )
+ OUTMSG(( "context_set_src_path() failed %R\n", rc ));
+ break;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static bool context_get_bool_option( const Args *my_args,
+ const char *name,
+ const bool def )
+{
+ bool res = def;
+ uint32_t count = 0;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( rc == 0 && count > 0 )
+ res = true;
+ return res;
+}
+
+
+static const char* context_get_str_option( const Args *my_args,
+ const char *name )
+{
+ const char* res = NULL;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&res );
+ }
+ return res;
+}
+
+
+static uint32_t context_get_int_option( const Args *my_args,
+ const char *name,
+ const uint32_t def )
+{
+ uint32_t count, res = def;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ const char *s;
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&s );
+ if ( rc == 0 ) res = atoi( s );
+ }
+ return res;
+}
+
+
+/*
+ * returns the number of schema's given on the commandline
+*/
+uint32_t context_schema_count( p_context ctx )
+{
+ uint32_t res = 0;
+ if ( ctx != NULL )
+ if ( ctx->src_schema_list != 0 )
+ {
+ uint32_t count;
+ if ( KNamelistCount( ctx->src_schema_list, &count ) == 0 )
+ res = count;
+ }
+ return res;
+}
+
+
+static void context_evaluate_options( const Args *my_args, p_context ctx )
+{
+ if ( my_args == NULL ) return;
+ if ( ctx == NULL ) return;
+
+ ctx->show_progress = context_get_bool_option( my_args, OPTION_SHOW_PROGRESS, false );
+ ctx->info = context_get_bool_option( my_args, OPTION_INFO, false );
+ ctx->ignore_mismatch = context_get_bool_option( my_args, OPTION_IGNORE_MISMATCH, false );
+ context_set_row_range( ctx, context_get_str_option( my_args, OPTION_ROWS ) );
+ nlt_make_namelist_from_string( &(ctx->src_schema_list),
+ context_get_str_option( my_args, OPTION_SCHEMA ) );
+ context_set_out_file_path( ctx, context_get_str_option( my_args, OPTION_OUTFILE ) );
+ context_set_out_mode( ctx, context_get_str_option( my_args, OPTION_OUTMODE ) );
+ if ( ctx->output_mode == NULL )
+ context_set_out_mode( ctx, "file" );
+ ctx->gc_window = context_get_int_option( my_args, OPTION_GCWINDOW, 7 );
+ context_set_exclude_path( ctx, context_get_str_option( my_args, OPTION_EXCLUDE ) );
+}
+
+
+/*
+ * reads all arguments and options, fills the context
+ * with copies (if strings) of this data
+*/
+rc_t context_capture_arguments_and_options( const Args * args, p_context ctx )
+{
+ rc_t rc;
+
+ rc = context_evaluate_arguments( args, ctx );
+ if ( rc != 0 )
+ {
+ OUTMSG(( "context_evaluate_arguments() failed %R\n", rc ));
+ }
+ else
+ {
+ context_evaluate_options( args, ctx );
+ context_check_if_usage_necessary( ctx );
+
+ rc = ArgsHandleLogLevel( args );
+ if ( rc != 0 )
+ OUTMSG(( "ArgsHandleLogLevel() failed %R\n", rc ));
+ }
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/context.h b/tools/qual-recalib-stat/context.h
new file mode 100644
index 0000000..cfb7ad2
--- /dev/null
+++ b/tools/qual-recalib-stat/context.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_context_
+#define _h_context_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <kapp/args.h>
+#include <klib/namelist.h>
+#include <klib/out.h>
+#include <klib/num-gen.h>
+#include "namelist_tools.h"
+
+#define OPTION_ROWS "rows"
+#define OPTION_SCHEMA "schema"
+#define OPTION_SHOW_PROGRESS "show_progress"
+#define OPTION_OUTFILE "output_file"
+#define OPTION_OUTMODE "mode"
+#define OPTION_GCWINDOW "gcwindow"
+#define OPTION_EXCLUDE "exclude"
+#define OPTION_INFO "info"
+#define OPTION_IGNORE_MISMATCH "ignore_mismatch"
+
+#define ALIAS_ROWS "R"
+#define ALIAS_SCHEMA "S"
+#define ALIAS_SHOW_PROGRESS "p"
+#define ALIAS_OUTFILE "o"
+#define ALIAS_OUTMODE "m"
+#define ALIAS_GCWINDOW "g"
+#define ALIAS_EXCLUDE "x"
+#define ALIAS_INFO "i"
+#define ALIAS_IGNORE_MISMATCH "n"
+
+/* *******************************************************************
+the context contains all informations needed to execute the run
+******************************************************************* */
+typedef struct context
+{
+ /* read from commandline */
+ char *src_path;
+ char *output_file_path;
+ char *output_mode;
+ char *exclude_file_path;
+ const KNamelist *src_schema_list;
+ struct num_gen * row_generator;
+ bool usage_requested;
+ bool show_progress;
+ bool info;
+ bool ignore_mismatch;
+ uint32_t gc_window;
+} context;
+typedef context* p_context;
+
+
+/*
+ * generates a new context, initializes values
+*/
+rc_t context_init( context **ctx );
+
+
+/*
+ * destroys a context, frees all pointers the context owns
+*/
+rc_t context_destroy( p_context ctx );
+
+
+/*
+ * performs the range check to trim the internal number
+ * generator to the given range
+*/
+rc_t context_range_check( p_context ctx,
+ const int64_t first, const uint64_t count );
+
+
+rc_t context_set_range( p_context ctx,
+ const int64_t first, const uint64_t count );
+
+/*
+ * returns the number of schema's given on the commandline
+*/
+uint32_t context_schema_count( p_context ctx );
+
+
+/*
+ * reads all arguments and options, fills the context
+ * with copies (if strings) of this data
+*/
+rc_t context_capture_arguments_and_options( const Args * args, p_context ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/fasta_dump.pl b/tools/qual-recalib-stat/fasta_dump.pl
new file mode 100755
index 0000000..25c9c0a
--- /dev/null
+++ b/tools/qual-recalib-stat/fasta_dump.pl
@@ -0,0 +1,81 @@
+#!/usr/bin/perl -w
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+use File::Path;
+
+my $nargs = scalar @ARGV;
+
+if ( $nargs < 2 )
+{
+ print( "\n-------------------------------------------------------------------------\n" );
+ print( "USAGE: fasta_dump.pl src bases\n" );
+ print( "src ... absolute-path to a reference-table\n" );
+ print( "bases ... how many bases to dump\n" );
+ print( "-------------------------------------------------------------------------\n\n" );
+}
+else
+{
+ my $ref = $ARGV[ 0 ];
+ my $cnt = $ARGV[ 1 ];
+ my $len = 79;
+ my ( $n_rows, $cmd, $row, $s, $line );
+
+ #calculate how many rows have to be dumped...
+ {
+ use integer;
+ $n_rows = ( $cnt / 5000 ) + 1;
+ }
+
+ #dump the sequence-name
+ $cmd = "vdb-dump $ref -C SEQ_ID -f csv -R 1";
+ open ( DUMP, "-|", "$cmd" ) or die "$cmd failed";
+ while ( ( $row = <DUMP> ), defined( $row ) )
+ {
+ chomp( $row );
+ print( ">$row\n" );
+ }
+ close ( DUMP );
+
+ #dump the rows
+ $cmd = "vdb-dump $ref -C READ -f tab -R 1-$n_rows";
+ open ( DUMP, "-|", "$cmd" ) or die "$cmd failed";
+ while ( ( $row = <DUMP> ), defined( $row ) )
+ {
+ chomp( $row );
+ $s .= $row;
+ while( length( $s ) >= $len )
+ {
+ $line = substr( $s, 0, $len, "" );
+ print( "$line\n" );
+
+ }
+ }
+ close ( DUMP );
+
+ #dump the remainder of bases
+ if ( length( $s ) > 0 )
+ {
+ print( "$s\n" );
+ }
+}
\ No newline at end of file
diff --git a/tools/qual-recalib-stat/namelist_tools.c b/tools/qual-recalib-stat/namelist_tools.c
new file mode 100644
index 0000000..270449b
--- /dev/null
+++ b/tools/qual-recalib-stat/namelist_tools.c
@@ -0,0 +1,187 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "namelist_tools.h"
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+int nlt_strcmp( const char* s1, const char* s2 )
+{
+ size_t n1 = string_size ( s1 );
+ size_t n2 = string_size ( s2 );
+ return string_cmp ( s1, n1, s2, n2, ( n1 < n2 ) ? n2 : n1 );
+}
+
+
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src )
+{
+ VNamelist *v_names;
+ rc_t rc = VNamelistMake ( &v_names, 5 );
+ if ( rc == 0 )
+ {
+ char * s = string_dup_measure ( src, NULL );
+ if ( s )
+ {
+ uint32_t str_begin = 0;
+ uint32_t str_end = 0;
+ char c;
+ do
+ {
+ c = s[ str_end ];
+ if ( c == ',' || c == 0 )
+ {
+ if ( str_begin < str_end )
+ {
+ char c_temp = c;
+ s[ str_end ] = 0;
+ rc = VNamelistAppend ( v_names, &(s[str_begin]) );
+ s[ str_end ] = c_temp;
+ }
+ str_begin = str_end + 1;
+ }
+ str_end++;
+ } while ( c != 0 && rc == 0 );
+ free( s );
+ }
+ rc = VNamelistToConstNamelist ( v_names, list );
+ VNamelistRelease( v_names );
+ }
+ return rc;
+}
+
+bool nlt_is_name_in_namelist( const KNamelist *list,
+ const char *name_to_find )
+{
+ uint32_t count, idx;
+ bool res = false;
+ if ( list == NULL || name_to_find == NULL )
+ return res;
+ if ( KNamelistCount( list, &count ) == 0 )
+ {
+ for ( idx = 0; idx < count && res == false; ++idx )
+ {
+ const char *item_name;
+ if ( KNamelistGet( list, idx, &item_name ) == 0 )
+ {
+ if ( nlt_strcmp( item_name, name_to_find ) == 0 )
+ res = true;
+ }
+ }
+ }
+ return res;
+}
+
+/*
+ - list1 and list2 containts strings
+ - if one of the strings in list2 is contained ( partial match, strstr() )
+ in one of the strings in list1 the function returns true...
+*/
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 )
+{
+ uint32_t count1;
+ bool res = false;
+ if ( list1 == NULL || list2 == NULL )
+ return res;
+ if ( KNamelistCount( list1, &count1 ) == 0 )
+ {
+ uint32_t idx1;
+ for ( idx1 = 0; idx1 < count1 && res == false; ++idx1 )
+ {
+ const char *string1;
+ if ( KNamelistGet( list1, idx1, &string1 ) == 0 )
+ {
+ uint32_t count2;
+ if ( KNamelistCount( list2, &count2 ) == 0 )
+ {
+ uint32_t idx2;
+ for ( idx2 = 0; idx2 < count2 && res == false; ++idx2 )
+ {
+ const char *string2;
+ if ( KNamelistGet( list2, idx2, &string2 ) == 0 )
+ {
+ if ( strstr( string1, string2 ) != NULL )
+ res = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return res;
+}
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove )
+{
+ rc_t rc = 0;
+ uint32_t count;
+
+ if ( source == NULL || dest == NULL || to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ *dest = NULL;
+ rc = KNamelistCount( source, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ VNamelist *cleaned;
+ rc = VNamelistMake ( &cleaned, count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( source, idx, &s );
+ if ( rc == 0 )
+ {
+ if ( !nlt_is_name_in_namelist( to_remove, s ) )
+ rc = VNamelistAppend ( cleaned, s );
+ }
+ rc = VNamelistToConstNamelist ( cleaned, dest );
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove )
+{
+ rc_t rc = 0;
+ const KNamelist *to_remove;
+
+ if ( source == NULL || dest == NULL || items_to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ rc = nlt_make_namelist_from_string( &to_remove, items_to_remove );
+ if ( rc == 0 )
+ {
+ rc = nlt_remove_names_from_namelist( source, dest, to_remove );
+ KNamelistRelease( to_remove );
+ }
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/namelist_tools.h b/tools/qual-recalib-stat/namelist_tools.h
new file mode 100644
index 0000000..7392a3c
--- /dev/null
+++ b/tools/qual-recalib-stat/namelist_tools.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_namelist_tools_
+#define _h_namelist_tools_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/namelist.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+int nlt_strcmp( const char* s1, const char* s2 );
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src );
+bool nlt_is_name_in_namelist( const KNamelist *list, const char *name_to_find );
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 );
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove );
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/qual-recalib-stat.c b/tools/qual-recalib-stat/qual-recalib-stat.c
new file mode 100644
index 0000000..c72fbae
--- /dev/null
+++ b/tools/qual-recalib-stat/qual-recalib-stat.c
@@ -0,0 +1,418 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/num-gen.h>
+#include <klib/progressbar.h>
+
+#include "context.h"
+#include "stat_mod_2.h"
+#include "reader.h"
+#include "writer.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+const char UsageDefaultName[] = "qual-recalib-stat";
+
+static const char * rows_usage[] = { "set of rows to be analyzed (default = all)", NULL };
+static const char * schema_usage[] = { "schema-names", NULL };
+static const char * show_progress_usage[] = { "show progress in percent while analyzing", NULL };
+static const char * outfile_usage[] = { "file to write output into", NULL };
+static const char * outmode_usage[] = { "where to write [file,db,tab] (dflt = file)", NULL };
+static const char * gcwindow_usage[] = { "how many bases are counted (dflt = 7)", NULL };
+static const char * exclude_usage[] = { "path to db with ref-positions to be excluded", NULL };
+static const char * info_usage[] = { "display info's after the process", NULL };
+static const char * ignore_mismatch_usage[] = { "ignore mismatches", NULL };
+
+OptDef MyOptions[] =
+{
+ { OPTION_ROWS, ALIAS_ROWS, NULL, rows_usage, 1, true, false },
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 5, true, false },
+ { OPTION_SHOW_PROGRESS, ALIAS_SHOW_PROGRESS, NULL, show_progress_usage, 1, false, false },
+ { OPTION_OUTFILE, ALIAS_OUTFILE, NULL, outfile_usage, 1, true, false },
+ { OPTION_OUTMODE, ALIAS_OUTMODE, NULL, outmode_usage, 1, true, false },
+ { OPTION_GCWINDOW, ALIAS_GCWINDOW, NULL, gcwindow_usage, 1, true, false },
+ { OPTION_EXCLUDE, ALIAS_EXCLUDE, NULL, exclude_usage, 1, true, false },
+ { OPTION_INFO, ALIAS_INFO, NULL, info_usage, 1, false, false },
+ { OPTION_IGNORE_MISMATCH, ALIAS_IGNORE_MISMATCH, NULL, ignore_mismatch_usage, 1, false, false }
+};
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ( "\n"
+ "Usage:\n"
+ " %s <path> [options]\n"
+ "\n", progname );
+}
+
+
+rc_t CC Usage( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram( args, &fullpath, &progname );
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary( progname );
+ KOutMsg ("Options:\n");
+ HelpOptionLine ( ALIAS_ROWS, OPTION_ROWS, "rows", rows_usage );
+ HelpOptionLine ( ALIAS_SCHEMA, OPTION_SCHEMA, "schema", schema_usage );
+ HelpOptionLine ( ALIAS_SHOW_PROGRESS, OPTION_SHOW_PROGRESS, NULL, show_progress_usage );
+ HelpOptionLine ( ALIAS_OUTFILE, OPTION_OUTFILE, NULL, outfile_usage );
+ HelpOptionLine ( ALIAS_OUTMODE, OPTION_OUTMODE, NULL, outmode_usage );
+ HelpOptionLine ( ALIAS_GCWINDOW, OPTION_GCWINDOW, NULL, gcwindow_usage );
+ HelpOptionLine ( ALIAS_EXCLUDE, OPTION_EXCLUDE, NULL, exclude_usage );
+ HelpOptionLine ( ALIAS_INFO, OPTION_INFO, NULL, info_usage );
+ HelpOptionLine ( ALIAS_IGNORE_MISMATCH, OPTION_IGNORE_MISMATCH, NULL, ignore_mismatch_usage );
+ HelpOptionsStandard();
+ HelpVersion( fullpath, KAppVersion() );
+ return rc;
+}
+
+static uint8_t calc_fract_digits( const struct num_gen_iter *iter )
+{
+ uint8_t res = 0;
+ uint64_t count;
+ if ( num_gen_iterator_count( iter, &count ) == 0 )
+ {
+ if ( count > 10000 )
+ {
+ if ( count > 100000 )
+ res = 2;
+ else
+ res = 1;
+ }
+ }
+ return res;
+}
+
+
+static rc_t read_loop( statistic * data,
+ context *ctx,
+ statistic_reader *reader,
+ const VCursor *my_cursor )
+{
+ int64_t first;
+ uint64_t count;
+ rc_t rc = query_reader_rowrange( reader, &first, &count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "query_statistic_rowrange() failed\n" );
+ else
+ {
+ if ( num_gen_empty( ctx->row_generator ) )
+ {
+ rc = num_gen_add( ctx->row_generator, first, count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "num_gen_add() failed() failed\n" );
+ }
+ else
+ {
+ rc = num_gen_trim( ctx->row_generator, first, count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "num_gen_trim() failed() failed\n" );
+ }
+
+ if ( rc == 0 )
+ {
+ const struct num_gen_iter *iter;
+ rc = num_gen_iterator_make( ctx->row_generator, &iter );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "num_gen_iterator_make() failed\n" );
+ else
+ {
+ int64_t row_id;
+ uint8_t fract_digits = calc_fract_digits( iter );
+ struct progressbar * progress;
+
+
+ rc = make_progressbar( &progress, fract_digits );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "make_progressbar() failed\n" );
+ else
+ {
+ uint32_t percent;
+ row_input row_data;
+
+ while ( num_gen_iterator_next( iter, &row_id, &rc ) && rc == 0 )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ /* ******************************************** */
+ rc = reader_get_data( reader, &row_data, row_id );
+ if ( rc == 0 )
+ {
+ rc = extract_statistic_from_row( data, &row_data, row_id );
+ }
+ /* ******************************************** */
+ if ( ctx->show_progress &&
+ num_gen_iterator_percent( iter, fract_digits, &percent ) == 0 )
+ {
+ update_progressbar( progress, percent );
+ }
+ }
+ }
+ destroy_progressbar( progress );
+ if ( ctx->show_progress )
+ OUTMSG(( "\n" ));
+ }
+ num_gen_iterator_destroy( iter );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t read_statistic_from_table( statistic * data,
+ KDirectory *dir,
+ context *ctx,
+ const VDatabase *my_database,
+ const char *table_name )
+{
+ const VTable *my_table;
+ rc_t rc = VDatabaseOpenTableRead( my_database, &my_table, "%s", table_name );
+ if ( rc != 0 )
+ {
+ LogErr( klogInt, rc, "VDatabaseOpenTableRead() failed\n" );
+ }
+ else
+ {
+ const VCursor *my_cursor;
+ rc = VTableCreateCursorRead( my_table, &my_cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VTableCreateCursorRead() failed\n" );
+ else
+ {
+/*
+ spot_pos sequence;
+
+ rc = make_spot_pos( &sequence, my_database );
+ if ( rc == 0 )
+ {
+*/
+ statistic_reader reader;
+
+/*
+ rc = make_statistic_reader( &reader, &sequence, dir, my_cursor,
+ ctx->exclude_file_path, ctx->info );
+*/
+ rc = make_statistic_reader( &reader, NULL, dir, my_cursor,
+ ctx->exclude_file_path, ctx->info );
+
+ if ( rc == 0 )
+ {
+ /* ******************************************************* */
+ rc = read_loop( data, ctx, &reader, my_cursor );
+ /* ******************************************************* */
+ whack_reader( &reader );
+ }
+/*
+ whack_spot_pos( &sequence );
+ }
+*/
+ VCursorRelease( my_cursor );
+ }
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+static rc_t gather_statistic( statistic * data,
+ KDirectory *dir,
+ context *ctx )
+{
+ VDBManager *my_manager;
+ /* because this tool is linked against the write-version
+ of vdb and kdb, there is no Read-Manager available... */
+ rc_t rc = VDBManagerMakeUpdate ( &my_manager, dir );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerMakeUpdate() failed\n" );
+ else
+ {
+ const VDatabase *my_database;
+ rc = VDBManagerOpenDBRead( my_manager, &my_database, NULL, "%s", ctx->src_path );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerOpenDBRead() failed\n" );
+ else
+ {
+ /* ******************************************************* */
+ rc = read_statistic_from_table( data, dir, ctx, my_database,
+ "PRIMARY_ALIGNMENT" );
+ /* ******************************************************* */
+ VDatabaseRelease( my_database );
+ }
+ VDBManagerRelease( my_manager );
+ }
+ return rc;
+}
+
+
+static rc_t gater_and_write( context *ctx )
+{
+ KDirectory *dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "KDirectoryNativeDir() failed\n" );
+ else
+ {
+ statistic data;
+ rc = make_statistic( &data, ctx->gc_window, ctx->ignore_mismatch );
+ if ( rc == 0 )
+ {
+ rc = gather_statistic( &data, dir, ctx ); /* <--- the meat */
+ if ( rc == 0 )
+ {
+ uint64_t written;
+
+ if ( ctx->show_progress )
+ {
+ OUTMSG(( "%lu statistic-entries gathered\n", data.entries ));
+ OUTMSG(( "max. cycles per read = %u\n", data.max_cycle ));
+ }
+
+ switch( ctx->output_mode[ 0 ] )
+ {
+ case 'f' : if ( ctx->output_file_path != NULL )
+ {
+ rc = write_output_file( dir, &data,
+ ctx->output_file_path, &written );
+ if ( rc == 0 && ctx->info )
+ {
+ OUTMSG(( "%lu lines written to '%s'\n",
+ written, ctx->output_file_path ));
+ }
+ }
+ else
+ OUTMSG(( "the output-path is missing!\n" ));
+ break;
+
+ case 'd' : rc = write_statistic_into_db( dir, &data,
+ ctx->src_schema_list, ctx->src_path, &written,
+ ctx->show_progress );
+ if ( rc == 0 && ctx->info )
+ {
+ OUTMSG(( "%lu rows written to database\n", written ));
+ }
+ break;
+
+ case 't' : if ( ctx->output_file_path != NULL )
+ {
+ rc = write_statistic_into_tab( dir, &data,
+ ctx->src_schema_list, ctx->output_file_path, &written,
+ ctx->show_progress );
+ if ( rc == 0 && ctx->info )
+ {
+ OUTMSG(( "%lu rows written to table\n", written ));
+ }
+ }
+ else
+ {
+ OUTMSG(( "the output-path is missing!\n" ));
+ }
+ break;
+ }
+ }
+ whack_statistic( &data );
+ }
+ KDirectoryRelease( dir );
+ }
+ return rc;
+}
+
+
+rc_t CC KMain( int argc, char * argv[] )
+{
+ Args * args;
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ MyOptions, sizeof MyOptions / sizeof ( OptDef ) );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "ArgsMakeAndHandle() failed\n" );
+ else
+ {
+ context *ctx;
+ KLogHandlerSetStdErr();
+ rc = context_init( &ctx );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "context_init() failed\n" );
+ else
+ {
+ rc = context_capture_arguments_and_options( args, ctx );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "context_capture_arguments_and_options() failed\n" );
+ else
+ {
+ if ( ctx->usage_requested ) {
+ MiniUsage( args );
+ rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcInsufficient);
+ }
+ else
+ {
+ switch( ctx->output_mode[ 0 ] )
+ {
+ case 'd' :
+ case 't' : if ( context_schema_count( ctx ) == 0 )
+ {
+ OUTMSG(( "cannot write, schema-file is missing:\n" ));
+ Usage( args );
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ }
+ }
+ if ( rc == 0 )
+ {
+ /* ************************* */
+ rc = gater_and_write( ctx );
+ /* ************************* */
+ }
+ }
+ }
+ context_destroy ( ctx );
+ }
+ ArgsWhack ( args );
+ }
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/reader.c b/tools/qual-recalib-stat/reader.c
new file mode 100644
index 0000000..fe32a69
--- /dev/null
+++ b/tools/qual-recalib-stat/reader.c
@@ -0,0 +1,241 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "reader.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static const char * ridx_names[ N_RIDX ] =
+{
+ "RAW_READ",
+ "QUALITY",
+ "(bool)HAS_MISMATCH",
+ "SEQ_SPOT_ID",
+ "SPOT_GROUP",
+ "SEQ_SPOT_GROUP",
+ "REF_ORIENTATION",
+ "READ_LEN",
+ "SEQ_READ_ID",
+ "(bool)HAS_REF_OFFSET",
+ "REF_OFFSET",
+ "REF_POS",
+ "REF_SEQ_ID",
+ "REF_LEN"
+};
+
+static rc_t make_vector( void ** ptr, uint32_t *len, uint32_t new_len )
+{
+ rc_t rc = 0;
+
+ *len = new_len;
+ *ptr = calloc( 1, new_len );
+ if ( *ptr == NULL )
+ {
+ *len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to make large enough exclude-vector\n" );
+ }
+ return rc;
+}
+
+
+static rc_t expand_and_clear_vector( void **v, uint32_t *len, uint32_t new_len, bool clear )
+{
+ rc_t rc = 0;
+ if ( *v != NULL )
+ {
+ if ( *len < new_len )
+ {
+ *len += new_len;
+ *v = realloc( *v, *len );
+ if ( *v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to expand (uint8_t)vector\n" );
+ }
+ }
+ if ( rc == 0 && clear )
+ memset( *v, 0, *len );
+ }
+ return rc;
+}
+
+
+rc_t make_statistic_reader( statistic_reader *self,
+ spot_pos *sequence,
+ KDirectory *dir,
+ const VCursor * cursor,
+ const char * exclude_db,
+ bool info )
+{
+ rc_t rc;
+
+ memset( &self->rd_col, 0, sizeof self->rd_col );
+ self->cursor = cursor;
+ self->ref_exclude_used = false;
+ self->exclude_vector = NULL;
+ self->exclude_vector_len = 0;
+ self->active_exclusions = 0;
+ self->sequence = sequence;
+
+ rc = add_columns( cursor, self->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed in reader\n" );
+ }
+ if ( rc == 0 )
+ if ( exclude_db != NULL )
+ {
+ make_ref_exclude( &self->exclude, dir, exclude_db, info );
+ rc = make_vector( (void**)&self->exclude_vector, &self->exclude_vector_len, 512 );
+ self->ref_exclude_used = true;
+ }
+
+ return rc;
+}
+
+
+void whack_reader( statistic_reader *self )
+{
+ if ( self->ref_exclude_used )
+ {
+ whack_ref_exclude( &self->exclude );
+ if ( self->exclude_vector != NULL )
+ {
+ free( self->exclude_vector );
+ }
+ }
+}
+
+
+void reader_set_spot_pos( statistic_reader *self, spot_pos * sequence )
+{
+ self->sequence = sequence;
+}
+
+rc_t query_reader_rowrange( statistic_reader *self, int64_t *first, uint64_t * count )
+{
+ rc_t rc = VCursorIdRange ( self->cursor, self->rd_col[ RIDX_READ ].idx,
+ first, count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorIdRange() failed in reader\n" );
+ return rc;
+}
+
+
+rc_t reader_get_data( statistic_reader *self, row_input * row_data,
+ uint64_t row_id )
+{
+ rc_t rc = read_cells( self->cursor, row_id, self->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ bool * reverse;
+
+ row_data->spotgroup = (char *)self->rd_col[ RIDX_SPOT_GROUP ].base;
+ row_data->spotgroup_len = self->rd_col[ RIDX_SPOT_GROUP ].row_len;
+
+ row_data->seq_spotgroup = (char *)self->rd_col[ RIDX_SEQ_SPOT_GROUP ].base;
+ row_data->seq_spotgroup_len = self->rd_col[ RIDX_SEQ_SPOT_GROUP ].row_len;
+
+ row_data->read = (char *)self->rd_col[ RIDX_READ ].base;
+ row_data->read_len = self->rd_col[ RIDX_READ ].row_len;
+
+ row_data->quality = (uint8_t *)self->rd_col[ RIDX_QUALITY ].base;
+ row_data->quality_len = self->rd_col[ RIDX_QUALITY ].row_len;
+
+ row_data->has_mismatch = (bool *)self->rd_col[ RIDX_HAS_MISMATCH ].base;
+ row_data->has_mismatch_len = self->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+
+ row_data->has_roffs = (bool *)self->rd_col[ RIDX_HAS_REF_OFFSET ].base;
+ row_data->has_roffs_len = self->rd_col[ RIDX_HAS_REF_OFFSET ].row_len;
+
+ row_data->roffs = (int32_t *)self->rd_col[ RIDX_REF_OFFSET ].base;
+ row_data->roffs_len = self->rd_col[ RIDX_REF_OFFSET ].row_len;
+
+ reverse = (bool *)self->rd_col[ RIDX_REF_ORIENTATION ].base;
+ row_data->reversed = *reverse;
+
+ row_data->seq_read_id = *( ( uint32_t * )self->rd_col[ RIDX_SEQ_READ_ID ].base );
+ row_data->spot_id = *( ( uint32_t * )self->rd_col[ RIDX_SEQ_SPOT_ID ].base );
+ row_data->base_pos_offset = 0;
+ row_data->ref_len = *( ( uint32_t *)self->rd_col[ RIDX_REF_LEN ].base );
+#ifdef LOOKUP_ALL_SEQ_READ_ID
+ if ( row_data->seq_read_id > 0 )
+#else
+ if ( row_data->seq_read_id > 1 )
+#endif
+ {
+ if ( self->sequence != NULL )
+ {
+ query_spot_pos( self->sequence, row_data->seq_read_id,
+ row_data->spot_id, &(row_data->base_pos_offset) );
+ }
+ }
+
+ if ( self->ref_exclude_used )
+ {
+ String s_ref_name;
+
+ const char * ref_name_base = ( const char * )self->rd_col[ RIDX_REF_SEQ_ID ].base;
+ uint32_t ref_name_len = self->rd_col[ RIDX_REF_SEQ_ID ].row_len;
+ int32_t ref_offset = *( ( int32_t *)self->rd_col[ RIDX_REF_POS ].base );
+ uint32_t ref_len = *( ( uint32_t *)self->rd_col[ RIDX_REF_LEN ].base );
+
+ StringInit( &s_ref_name, ref_name_base, ref_name_len, ref_name_len );
+
+ /* make the ref-exclude-vector longer if necessary */
+ rc = expand_and_clear_vector( (void**)&self->exclude_vector,
+ &self->exclude_vector_len,
+ ref_len,
+ true );
+ if ( rc == 0 )
+ {
+ rc = get_ref_exclude( &self->exclude,
+ &s_ref_name,
+ ref_offset,
+ ref_len,
+ self->exclude_vector,
+ &self->active_exclusions );
+ if ( rc == 0 )
+ {
+ row_data->exclude = self->exclude_vector;
+ row_data->exclude_len = ref_len;
+ }
+ }
+ }
+ else
+ {
+ row_data->exclude = NULL;
+ row_data->exclude_len = 0;
+ }
+ }
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/reader.h b/tools/qual-recalib-stat/reader.h
new file mode 100644
index 0000000..7dea1c7
--- /dev/null
+++ b/tools/qual-recalib-stat/reader.h
@@ -0,0 +1,88 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_stat_reader_
+#define _h_stat_reader_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <vdb/cursor.h>
+#include "columns.h"
+#include "ref_exclude.h"
+#include "stat_mod_2.h"
+#include "spot_position.h"
+
+#define RIDX_READ 0
+#define RIDX_QUALITY 1
+#define RIDX_HAS_MISMATCH 2
+#define RIDX_SEQ_SPOT_ID 3
+#define RIDX_SPOT_GROUP 4
+#define RIDX_SEQ_SPOT_GROUP 5
+#define RIDX_REF_ORIENTATION 6
+#define RIDX_READ_LEN 7
+#define RIDX_SEQ_READ_ID 8
+#define RIDX_HAS_REF_OFFSET 9
+#define RIDX_REF_OFFSET 10
+#define RIDX_REF_POS 11
+#define RIDX_REF_SEQ_ID 12
+#define RIDX_REF_LEN 13
+#define N_RIDX 14
+
+typedef struct statistic_reader
+{
+ ref_exclude exclude;
+ uint8_t *exclude_vector;
+ uint32_t exclude_vector_len;
+ uint32_t active_exclusions;
+ bool ref_exclude_used;
+ const VCursor *cursor;
+ col rd_col[ N_RIDX ];
+ spot_pos * sequence;
+} statistic_reader;
+
+rc_t make_statistic_reader( statistic_reader *self,
+ spot_pos *sequence,
+ KDirectory *dir,
+ const VCursor * cursor,
+ const char * exclude_db,
+ bool info );
+
+void whack_reader( statistic_reader *self );
+
+void reader_set_spot_pos( statistic_reader *self, spot_pos * sequence );
+
+rc_t query_reader_rowrange( statistic_reader *self, int64_t *first, uint64_t * count );
+
+rc_t reader_get_data( statistic_reader *self, row_input * row_data, uint64_t row_id );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/ref_exclude.c b/tools/qual-recalib-stat/ref_exclude.c
new file mode 100644
index 0000000..a154585
--- /dev/null
+++ b/tools/qual-recalib-stat/ref_exclude.c
@@ -0,0 +1,561 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ref_exclude.h"
+#include "columns.h"
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAXLEN_COLUMN "MAX_SEQ_LEN"
+#define HITS_COLUMN "HITS"
+#define HITMAP_TAB "HITMAP"
+
+
+typedef struct trans_node
+{
+ BSTNode node;
+ String chromosome;
+ String translation;
+} trans_node;
+
+
+static trans_node * make_trans_node( const char * chromosome, const char * translation )
+{
+ trans_node * res = calloc( 1, sizeof * res );
+ if ( res != NULL )
+ {
+ StringInitCString( &(res->chromosome), chromosome );
+ StringInitCString( &(res->translation), translation );
+ }
+ return res;
+}
+
+
+static void CC whack_trans_node( BSTNode *n, void *data )
+{
+ free( n );
+}
+
+
+static int64_t CC trans_node_find( const void *item, const BSTNode *n )
+{
+ trans_node * node = ( trans_node * ) n;
+ return StringCompare ( ( String * ) item, &node->chromosome );
+}
+
+
+#define N_TRANS_NODES 24
+
+static const char * chromosomes[ N_TRANS_NODES ] =
+{
+ "CM000663.1",
+ "CM000664.1",
+ "CM000665.1",
+ "CM000666.1",
+ "CM000667.1",
+ "CM000668.1",
+ "CM000669.1",
+ "CM000670.1",
+ "CM000671.1",
+ "CM000672.1",
+ "CM000673.1",
+ "CM000675.1",
+ "CM000674.1",
+ "CM000676.1",
+ "CM000677.1",
+ "CM000678.1",
+ "CM000679.1",
+ "CM000680.1",
+ "CM000681.1",
+ "CM000682.1",
+ "CM000683.1",
+ "CM000684.1",
+ "CM000685.1",
+ "CM000686.1"
+};
+
+
+static const char * translations[ N_TRANS_NODES ] =
+{
+ "NC_000001.10",
+ "NC_000002.11",
+ "NC_000003.11",
+ "NC_000004.11",
+ "NC_000005.9",
+ "NC_000006.11",
+ "NC_000007.13",
+ "NC_000008.10",
+ "NC_000009.11",
+ "NC_000010.10",
+ "NC_000011.9",
+ "NC_000013.10",
+ "NC_000012.11",
+ "NC_000014.8",
+ "NC_000015.9",
+ "NC_000016.9",
+ "NC_000017.10",
+ "NC_000018.9",
+ "NC_000019.9",
+ "NC_000020.10",
+ "NC_000021.8",
+ "NC_000022.10",
+ "NC_000023.10",
+ "NC_000024.9"
+};
+
+
+static int64_t CC trans_node_sort( const BSTNode *item, const BSTNode *n )
+{
+ trans_node * rn1 = ( trans_node* ) item;
+ trans_node * rn2 = ( trans_node* ) n;
+ return StringCompare ( &rn1->chromosome, &rn2->chromosome );
+}
+
+
+static rc_t insert_trans_nodes( BSTree *tree )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+ for ( idx = 0; idx < N_TRANS_NODES && rc == 0; ++idx )
+ {
+ trans_node * node = make_trans_node( chromosomes[ idx ], translations[ idx ] );
+ if ( node != NULL )
+ {
+ rc = BSTreeInsert ( tree, (BSTNode *)node, trans_node_sort );
+ }
+ }
+ return rc;
+}
+
+/******************************************************************************/
+
+typedef struct ref_node
+{
+ BSTNode node;
+ const String *name;
+ bool valid;
+ const VDatabase *db;
+ const VTable *tab;
+ const VCursor *cur;
+ uint32_t hits_idx;
+ uint32_t read_len;
+ uint64_t bytes_requested;
+ uint64_t active_positions;
+} ref_node;
+
+
+static rc_t detect_read_len( ref_node *node )
+{
+ const VCursor *temp_cursor;
+ rc_t rc = VTableCreateCursorRead ( node->tab, &temp_cursor );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to create cursor on table $(tab_name)",
+ "tab_name=%S", node->name ) );
+ }
+ else
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn ( temp_cursor, &idx, MAXLEN_COLUMN );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to add column $(col_name) to cursor for table $(db_name).$(tab_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ MAXLEN_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ rc = VCursorOpen( temp_cursor );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to open cursor for table $(db_name).$(tab_name to read $(col_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ MAXLEN_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ uint32_t elem_bits, boff, row_len;
+ const void *base;
+ rc = VCursorCellDataDirect ( temp_cursor, 1, idx,
+ &elem_bits, &base, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to read $(col_name) from 1st row in table $(db_name).$(tab_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ MAXLEN_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ node->read_len = *((uint32_t *)base);
+ if ( node->read_len == 0 )
+ {
+ rc = RC( rcApp, rcNoTarg, rcReading, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "$(col_name) == 0 discoverd in table $(db_name).$(tab_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ MAXLEN_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ }
+ }
+ }
+ VCursorRelease( temp_cursor );
+ }
+ return rc;
+}
+
+
+static rc_t prepare_ref_node( ref_node * node )
+{
+ rc_t rc = VTableCreateCursorRead ( node->tab, &node->cur );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to create cursor on table $(db_name).$(tab_name)",
+ "db_name=%S,tab_name=%s",
+ node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ rc = VCursorAddColumn ( node->cur, &node->hits_idx, HITS_COLUMN );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to add column $(col_name) to cursor for table $(db_name).$(tab_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ HITS_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ rc = VCursorOpen( node->cur );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to open cursor for table $(tab_name)",
+ "tab_name=%S", node->name ) );
+ }
+ else
+ {
+ node->valid = true;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static ref_node * make_ref_node( ref_exclude *exclude, const String * s )
+{
+ ref_node * res = calloc( 1, sizeof * res );
+ if ( res != NULL )
+ {
+ if ( StringCopy ( &res->name, s ) != 0 )
+ {
+ free( res );
+ res = NULL;
+ }
+ }
+ if ( res != NULL && exclude->path != NULL )
+ {
+ char buf[ 1024 ];
+ size_t num_writ;
+ rc_t rc = string_printf ( buf, sizeof buf, &num_writ,
+ "%s/%S", exclude->path, s );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to assemble path to exclude-table $(tab_name)",
+ "tab_name=%S", s ) );
+ }
+ else
+ {
+ rc = VDBManagerOpenDBRead ( exclude->mgr, &res->db, NULL, "%s", buf );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to open exclude-table $(db_name)",
+ "db_name=%s", buf ) );
+ /*
+ it can be OK if the database/table cannot be found!
+ */
+ rc = 0;
+ }
+ else
+ {
+ rc = VDatabaseOpenTableRead ( res->db, &res->tab, "HITMAP" );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to open exclude-table 'HITMAP' in $(db_name)",
+ "db_name=%s", buf ) );
+ /*
+ it can be OK if the database/table cannot be found!
+ */
+ rc = 0;
+ }
+ else
+ {
+ rc = detect_read_len( res );
+ if ( rc == 0 )
+ {
+ rc = prepare_ref_node( res );
+ }
+ }
+ }
+ }
+ }
+ return res;
+}
+
+
+static rc_t read_from_ref_node( ref_node * node,
+ int32_t ref_offset, uint32_t ref_len,
+ uint8_t *exclude_vector,
+ uint32_t *active )
+{
+ rc_t rc = 0;
+ uint64_t row_id = ( ref_offset / node->read_len ) + 1;
+ uint8_t *dst = exclude_vector;
+ uint32_t remaining = ref_len;
+ uint32_t src_ofs = ref_offset % node->read_len;
+
+ while ( remaining > 0 && rc == 0 )
+ {
+ uint32_t elem_bits, boff, rlen;
+ const uint8_t *src;
+ rc = VCursorCellDataDirect ( node->cur, row_id, node->hits_idx,
+ &elem_bits, (const void**)&src, &boff, &rlen );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error to read $(col_name) from 1st row in table $(db_name).$(tab_name)",
+ "col_name=%s,db_name=%S,tab_name=%s",
+ HITS_COLUMN, node->name, HITMAP_TAB ) );
+ }
+ else
+ {
+ if ( src_ofs >= rlen )
+ {
+ rc = RC( rcApp, rcNoTarg, rcReading, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "error: try to read more data than are in var-loc $(tab_name)",
+ "tab_name=%S", node->name ) );
+ }
+ else
+ {
+ uint32_t to_copy = ( rlen - src_ofs );
+ if ( to_copy > remaining )
+ {
+ to_copy = remaining;
+ }
+ src += src_ofs;
+
+ memmove( dst, src, to_copy );
+ dst += to_copy;
+ remaining -= to_copy;
+ src_ofs = 0;
+ row_id ++;
+
+ node->bytes_requested += to_copy;
+ }
+ }
+ }
+ *active = 0;
+ if ( rc == 0 )
+ {
+ for ( src_ofs = 0; src_ofs < ref_len; ++src_ofs )
+ {
+ if ( exclude_vector[ src_ofs ] > 0 )
+ {
+ ( *active )++;
+ }
+ }
+ }
+
+ return rc;
+}
+
+
+static void CC whack_ref_node( BSTNode *n, void *data )
+{
+ ref_node * node = ( ref_node * )n;
+ bool * info = ( bool * )data;
+
+ if ( *info )
+ {
+ OUTMSG(( "node >%S< used for %lu bytes (%lu active)\n",
+ node->name, node->bytes_requested, node->active_positions ));
+ }
+
+ if ( node->cur != NULL )
+ {
+ VCursorRelease( node->cur );
+ }
+ if ( node->tab != NULL )
+ {
+ VTableRelease( node->tab );
+ }
+ if ( node->name != NULL )
+ {
+ StringWhack ( node->name );
+ }
+ free( n );
+}
+
+
+static int64_t CC ref_node_find( const void *item, const BSTNode *n )
+{
+ ref_node * node = ( ref_node * ) n;
+ return StringCompare ( ( String * ) item, node->name );
+}
+
+
+static ref_node * find_ref_node( ref_exclude *exclude, const String * s )
+{
+ BSTNode *node;
+
+ if ( exclude->last_used_ref_node != NULL )
+ {
+ ref_node * node = ( ref_node * )exclude->last_used_ref_node;
+ if ( StringCompare ( s, node->name ) == 0 )
+ return node;
+ }
+
+ node = BSTreeFind ( &exclude->ref_nodes, s, ref_node_find );
+ if ( node == NULL )
+ return NULL;
+ else
+ {
+ exclude->last_used_ref_node = node;
+ return ( ref_node * ) node;
+ }
+}
+
+
+rc_t make_ref_exclude( ref_exclude *exclude, KDirectory *dir,
+ const char * path, bool info )
+{
+ rc_t rc;
+
+ BSTreeInit( &exclude->ref_nodes );
+ BSTreeInit( &exclude->translations );
+
+ exclude->last_used_ref_node = NULL;
+ exclude->info = info;
+ rc = VDBManagerMakeUpdate ( &exclude->mgr, dir );
+ if ( rc != 0 )
+ {
+ LogErr( klogInt, rc, "VDBManagerMakeUpdate() in make_ref_exclude() failed\n" );
+ }
+ else
+ {
+ insert_trans_nodes( &exclude->translations );
+ exclude->path = string_dup_measure ( path, NULL );
+ }
+ return rc;
+}
+
+
+static int64_t CC ref_node_sort( const BSTNode *item, const BSTNode *n )
+{
+ ref_node * rn1 = ( ref_node* ) item;
+ ref_node * rn2 = ( ref_node* ) n;
+ return StringCompare ( rn1->name, rn2->name );
+}
+
+
+static rc_t find_or_make_by_name( ref_exclude *exclude,
+ const String * name,
+ ref_node ** node )
+{
+ rc_t rc = 0;
+ *node = find_ref_node( exclude, name );
+ if ( *node == NULL )
+ {
+ /* if not found: make such a node... */
+ *node = make_ref_node( exclude, name );
+ if ( *node == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ }
+ else
+ {
+ /* if node was successfully made, insert it into our tree */
+ rc = BSTreeInsert ( &exclude->ref_nodes, (BSTNode *)( *node ), ref_node_sort );
+ }
+ }
+ return rc;
+}
+
+rc_t get_ref_exclude( ref_exclude *exclude,
+ const String * name,
+ int32_t ref_offset, uint32_t ref_len,
+ uint8_t *exclude_vector,
+ uint32_t *active )
+{
+ rc_t rc = 0;
+ ref_node *node = NULL;
+
+ /* look if we already have a node with the given name */
+ trans_node *t_node = ( trans_node * )BSTreeFind ( &exclude->translations, name, trans_node_find );
+ if ( t_node != NULL )
+ {
+ rc = find_or_make_by_name( exclude, &t_node->translation, &node );
+ }
+ else
+ {
+ rc = find_or_make_by_name( exclude, name, &node );
+ }
+
+ if ( rc == 0 && node->valid )
+ {
+ /* read the necessary row(s) and fill it into the exclude_vector */
+ rc = read_from_ref_node( node, ref_offset, ref_len, exclude_vector, active );
+ if ( rc == 0 )
+ {
+ node->active_positions += *active;
+ }
+ }
+ return rc;
+}
+
+
+rc_t whack_ref_exclude( ref_exclude *exclude )
+{
+ BSTreeWhack ( &exclude->ref_nodes, whack_ref_node, &exclude->info );
+ BSTreeWhack ( &exclude->translations, whack_trans_node, NULL );
+ if ( exclude->mgr != NULL )
+ VDBManagerRelease( exclude->mgr );
+ if ( exclude->path != NULL )
+ free( exclude->path );
+ return 0;
+}
diff --git a/tools/qual-recalib-stat/ref_exclude.h b/tools/qual-recalib-stat/ref_exclude.h
new file mode 100644
index 0000000..a957ce9
--- /dev/null
+++ b/tools/qual-recalib-stat/ref_exclude.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ref_exclude_
+#define _h_ref_exclude_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <kfs/directory.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+typedef struct ref_exclude
+{
+ BSTree ref_nodes;
+ BSTree translations;
+ VDBManager *mgr;
+ char * path;
+ void * last_used_ref_node;
+ bool info;
+} ref_exclude;
+
+
+rc_t make_ref_exclude( ref_exclude *exclude, KDirectory *dir,
+ const char * path, bool info );
+
+
+rc_t get_ref_exclude( ref_exclude *exclude,
+ const String * name,
+ int32_t ref_offset, uint32_t ref_len,
+ uint8_t *exclude_vector,
+ uint32_t *active );
+
+rc_t whack_ref_exclude( ref_exclude *exclude );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/ref_grab.pl b/tools/qual-recalib-stat/ref_grab.pl
new file mode 100755
index 0000000..e71f2a4
--- /dev/null
+++ b/tools/qual-recalib-stat/ref_grab.pl
@@ -0,0 +1,82 @@
+#!/usr/bin/perl -w
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+use File::Path;
+
+my $nargs = scalar @ARGV;
+
+if ( $nargs < 2 )
+{
+ print( "\n-------------------------------------------------------------------------\n" );
+ print( "USAGE: ref_grab.pl src position bases\n" );
+ print( "src ... absolute-path to a reference-table\n" );
+ print( "position ... from what absolute positoin in the reference to grab\n" );
+ print( "bases ... how many bases to grab\n" );
+ print( "-------------------------------------------------------------------------\n\n" );
+}
+else
+{
+ my $ref = $ARGV[ 0 ];
+ my $cnt = $ARGV[ 1 ];
+ my $len = 79;
+ my ( $n_rows, $cmd, $row, $s, $line );
+
+ #calculate how many rows have to be dumped...
+ {
+ use integer;
+ $n_rows = ( $cnt / 5000 ) + 1;
+ }
+
+ #dump the sequence-name
+ $cmd = "vdb-dump $ref -C SEQ_ID -f csv -R 1";
+ open ( DUMP, "-|", "$cmd" ) or die "$cmd failed";
+ while ( ( $row = <DUMP> ), defined( $row ) )
+ {
+ chomp( $row );
+ print( ">$row\n" );
+ }
+ close ( DUMP );
+
+ #dump the rows
+ $cmd = "vdb-dump $ref -C READ -f tab -R 1-$n_rows";
+ open ( DUMP, "-|", "$cmd" ) or die "$cmd failed";
+ while ( ( $row = <DUMP> ), defined( $row ) )
+ {
+ chomp( $row );
+ $s .= $row;
+ while( length( $s ) >= $len )
+ {
+ $line = substr( $s, 0, $len, "" );
+ print( "$line\n" );
+
+ }
+ }
+ close ( DUMP );
+
+ #dump the remainder of bases
+ if ( length( $s ) > 0 )
+ {
+ print( "$s\n" );
+ }
+}
\ No newline at end of file
diff --git a/tools/qual-recalib-stat/spot_position.c b/tools/qual-recalib-stat/spot_position.c
new file mode 100644
index 0000000..dd3ac1f
--- /dev/null
+++ b/tools/qual-recalib-stat/spot_position.c
@@ -0,0 +1,121 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "spot_position.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static const char * sidx_names[ N_SIDX ] =
+{
+ "READ_START"
+};
+
+
+rc_t make_spot_pos( spot_pos *self,
+ const VDatabase * db )
+{
+ rc_t rc = VDatabaseOpenTableRead( db, &self->table, "SEQUENCE" );
+ if ( rc != 0 )
+ {
+ LogErr( klogInt, rc, "VDatabaseOpenTableRead(SEQUENCE) failed\n" );
+ self->table = NULL;
+ self->cursor = NULL;
+ }
+ else
+ {
+ rc = VTableCreateCursorRead( self->table, &self->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VTableCreateCursorRead(SEQUENCE) failed\n" );
+ else
+ {
+ rc = add_columns( self->cursor, self->columns, sidx_names, N_SIDX );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( self->cursor );
+ if ( rc != 0 )
+ {
+ LogErr( klogInt, rc, "cannot open cursor on SEQUENCE\n" );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t query_spot_pos( spot_pos *self,
+ const uint32_t seq_read_id,
+ const uint64_t spot_id,
+ uint32_t *pos_offset )
+{
+ rc_t rc;
+ if ( self->cursor == NULL )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcNull );
+ LogErr( klogInt, rc, "cannot query spot-position, cursor is NULL\n" );
+ }
+ else
+ {
+ rc = read_cells( self->cursor, spot_id, self->columns, sidx_names, N_SIDX );
+ if ( rc == 0 )
+ {
+ const uint32_t * rd_start = self->columns[ SIDX_READ_START ].base;
+ uint32_t rd_start_len = self->columns[ SIDX_READ_START ].row_len;
+ if ( seq_read_id > rd_start_len )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "asking for read_start of read #$(read_nr) but we only have $(n_read) reads at row #$(row_nr)",
+ "read_nr=%u,n_read=%u,row_nr=%lu", seq_read_id, rd_start_len, spot_id ) );
+ }
+ else
+ {
+ *pos_offset = rd_start[ seq_read_id - 1 ];
+ /*
+ OUTMSG(( "SPOT_ID %lu / SEQ_READ_ID %u ---> %u\n",
+ spot_id, seq_read_id, *pos_offset ));
+ */
+ }
+ }
+ else
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "cannot read sequence row #$(row_nr)", "row_nr=%lu", spot_id ) );
+ }
+ }
+ return rc;
+}
+
+
+void whack_spot_pos( spot_pos *self )
+{
+ if ( self->cursor != NULL )
+ VCursorRelease( self->cursor );
+ if ( self->table != NULL )
+ VTableRelease( self->table );
+}
diff --git a/tools/qual-recalib-stat/spot_position.h b/tools/qual-recalib-stat/spot_position.h
new file mode 100644
index 0000000..e6e9953
--- /dev/null
+++ b/tools/qual-recalib-stat/spot_position.h
@@ -0,0 +1,68 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_spot_position_
+#define _h_spot_position_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include "columns.h"
+
+
+#define SIDX_READ_START 0
+#define N_SIDX 1
+
+
+typedef struct spot_pos
+{
+ const VTable *table;
+ const VCursor *cursor;
+ col columns[ N_SIDX ];
+} spot_pos;
+
+
+rc_t make_spot_pos( spot_pos *self, const VDatabase * db );
+
+rc_t query_spot_pos( spot_pos *self,
+ const uint32_t seq_read_id,
+ const uint64_t spot_id,
+ uint32_t *pos_offset );
+
+void whack_spot_pos( spot_pos *self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/stat_mod.c b/tools/qual-recalib-stat/stat_mod.c
new file mode 100644
index 0000000..4cd927f
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod.c
@@ -0,0 +1,883 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "stat_mod.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static const char * ridx_names[ N_RIDX ] =
+{
+ "READ",
+ "QUALITY",
+ "HAS_MISMATCH",
+ "SPOT_GROUP",
+ "SEQ_SPOT_GROUP",
+ "REF_ORIENTATION",
+ "READ_LEN",
+ "SEQ_READ_ID",
+ "HAS_REF_OFFSET",
+ "REF_OFFSET",
+ "REF_POS",
+ "REF_SEQ_ID",
+ "REF_LEN"
+};
+
+
+static const char * widx_names[ N_WIDX ] =
+{
+ "SPOT_GROUP",
+ "KMER",
+ "ORIG_QUAL",
+ "TOTAL_COUNT",
+ "MISMATCH_COUNT",
+ "CYCLE",
+ "HPRUN",
+ "GC_CONTENT"
+};
+
+typedef struct qual
+{
+ uint32_t mismatches;
+ uint32_t count;
+} qual;
+
+
+typedef struct pos_vector
+{
+ uint32_t len;
+ struct qual *v;
+} pos_vector;
+
+
+typedef struct spotgrp
+{
+ BSTNode node;
+ const String *name;
+ pos_vector dimers[N_DIMER_VALUES][N_QUAL_VALUES][N_GC_VALUES][N_HP_VALUES];
+} spotgrp;
+
+
+static const uint8_t char_2_base_bin[26] =
+{
+ /* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z*/
+ 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0
+};
+
+
+static const char * dimer_2_ascii[] =
+{ "AA", "AC", "AG", "AT",
+ "CA", "CC", "CG", "CT",
+ "GA", "GC", "GG", "GT",
+ "TA", "TC", "TG", "TT", "XX" };
+
+
+static void CC whack_spotgroup( BSTNode *n, void *data )
+{
+ spotgrp * sg = ( spotgrp * )n;
+ uint8_t dimer_idx;
+ for ( dimer_idx = 0; dimer_idx < N_DIMER_VALUES; ++dimer_idx )
+ {
+ uint8_t qual_idx;
+ for ( qual_idx = 0; qual_idx < N_QUAL_VALUES; ++qual_idx )
+ {
+ uint8_t gc_idx;
+ for ( gc_idx = 0; gc_idx < N_GC_VALUES; ++gc_idx )
+ {
+ uint8_t hp_idx;
+ for ( hp_idx = 0; hp_idx < N_HP_VALUES; ++hp_idx )
+ {
+ pos_vector *pv = &sg->dimers[dimer_idx][qual_idx][gc_idx][hp_idx];
+ if ( pv->v != NULL )
+ free( pv->v );
+ }
+ }
+ }
+ }
+ if ( sg->name != NULL )
+ StringWhack ( sg->name );
+ free( n );
+}
+
+
+rc_t make_statistic( statistic *data, uint32_t gc_window,
+ KDirectory *dir, const char * exclude_db )
+{
+ rc_t rc = 0;
+ BSTreeInit( &data->spotgroups );
+ data->last_used_spotgroup = NULL;
+ memset( &data->rd_col, 0, sizeof data->rd_col );
+ make_ref_exclude( &data->exclude, dir, exclude_db );
+ data->gc_window = gc_window;
+
+ data->exclude_vector_len = 512;
+ data->exclude_vector = calloc( 1, data->exclude_vector_len );
+ if ( data->exclude_vector == NULL )
+ {
+ data->exclude_vector_len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to make large enough exclude-vector\n" );
+ }
+
+ if ( rc == 0 )
+ {
+ data->case_vector_len = 512;
+ data->case_vector = calloc( 1, data->case_vector_len );
+ if ( data->case_vector == NULL )
+ {
+ data->case_vector_len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to make large enough case-vector\n" );
+ }
+ }
+
+ return rc;
+}
+
+
+void whack_statistic( statistic *data )
+{
+ BSTreeWhack ( &data->spotgroups, whack_spotgroup, NULL );
+ whack_ref_exclude( &data->exclude );
+ if ( data->exclude_vector != NULL )
+ {
+ free( data->exclude_vector );
+ data->exclude_vector = NULL;
+ data->exclude_vector_len = 0;
+ }
+ if ( data->case_vector != NULL )
+ {
+ free( data->case_vector );
+ data->case_vector = NULL;
+ data->case_vector_len = 0;
+ }
+}
+
+
+static spotgrp * make_spotgrp( const char *src, const size_t len )
+{
+ spotgrp * res = calloc( 1, sizeof * res );
+ if ( res != NULL )
+ {
+ String s;
+ StringInit( &s, src, len, len );
+ if ( StringCopy ( &res->name, &s ) != 0 )
+ {
+ free( res );
+ res = NULL;
+ }
+ }
+ return res;
+}
+
+
+static int64_t CC spotgroup_find( const void *item, const BSTNode *n )
+{
+ spotgrp * sg = ( spotgrp* ) n;
+ return StringCompare ( ( String* ) item, sg->name );
+}
+
+
+static spotgrp * find_spotgrp( statistic *data, const char *src, const size_t len )
+{
+ String s;
+ BSTNode *node;
+
+ StringInit( &s, src, len, len );
+ if ( data->last_used_spotgroup != NULL )
+ {
+ spotgrp * sg = ( spotgrp* )data->last_used_spotgroup;
+ if ( StringCompare ( &s, sg->name ) == 0 )
+ return sg;
+ }
+
+ node = BSTreeFind ( &data->spotgroups, &s, spotgroup_find );
+ if ( node == NULL )
+ return NULL;
+ else
+ {
+ data->last_used_spotgroup = node;
+ return ( spotgrp *) node;
+ }
+}
+
+
+static uint8_t dimer_2_bin( const char * dimer )
+{
+ uint8_t res = 0;
+ char c0 = dimer[ 0 ];
+ char c1 = dimer[ 1 ];
+ if ( c0 == 'N' || c1 == 'N' )
+ res = 16;
+ else
+ {
+ if ( c0 >= 'A' && c0 <= 'Z' )
+ res |= char_2_base_bin[ (uint8_t)( c0 - 'A' ) ];
+ res <<= 2;
+ if ( c1 >= 'A' && c1 <= 'Z' )
+ res |= char_2_base_bin[ (uint8_t)( c1 - 'A' ) ];
+ }
+ return res;
+}
+
+
+static rc_t spotgroup_enter_values( spotgrp * sg,
+ stat_row * row,
+ uint8_t dimer_idx,
+ uint8_t rd_case,
+ uint32_t base_pos_offset )
+{
+ rc_t rc = 0;
+ pos_vector *pv;
+ uint32_t base_pos = row->base_pos + base_pos_offset;
+
+ if ( row->quality >= N_QUAL_VALUES )
+ row->quality = N_QUAL_VALUES - 1;
+ if ( row->gc_content >= N_GC_VALUES )
+ row->gc_content = N_GC_VALUES - 1;
+ if ( row->hp_run >= N_HP_VALUES )
+ row->hp_run = N_HP_VALUES - 1;
+
+ pv = &sg->dimers[ dimer_idx ][ row->quality ][ row->gc_content ][ row->hp_run ];
+ if ( pv->len == 0 )
+ {
+ /* vector was not used before */
+ pv->len = ( ( base_pos + 1 ) / POS_VECTOR_INC ) + 1;
+ pv->len *= POS_VECTOR_INC;
+ pv->v = calloc( pv->len, sizeof pv->v[0] );
+ if ( pv->v == NULL )
+ {
+ rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted );
+ }
+ }
+ else if ( pv->len < ( base_pos + 1 ) )
+ {
+ void * tmp;
+ /* vector has to be increased */
+ uint32_t org_len = pv->len;
+ pv->len = ( ( base_pos + 1 ) / POS_VECTOR_INC ) + 1;
+ pv->len *= POS_VECTOR_INC;
+ /* prevent from leaking memory by capturing the new pointer in temp. var. */
+ tmp = realloc( pv->v, pv->len * ( sizeof pv->v[0] ) );
+ if ( tmp == NULL )
+ {
+ rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted );
+ }
+ else
+ {
+ pv->v = tmp;
+ /* the added part has to be set to zero */
+ qual *to_zero = pv->v;
+ to_zero += org_len;
+ memset( to_zero, 0, ( pv->len - org_len ) * ( sizeof pv->v[0] ) );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ qual *q = &pv->v[ base_pos ];
+ switch( rd_case )
+ {
+ case CASE_MISMATCH : q->mismatches++; /* no break intented! */
+ case CASE_MATCH : q->count++;
+ break;
+ }
+ }
+ else
+ {
+ pv->len = 0;
+ }
+ return rc;
+}
+
+
+static int64_t CC spotgroup_sort( const BSTNode *item, const BSTNode *n )
+{
+ spotgrp * sg1 = ( spotgrp* ) item;
+ spotgrp * sg2 = ( spotgrp* ) n;
+ return StringCompare ( sg1->name, sg2->name );
+}
+
+
+static rc_t expand_and_clear_vector( uint8_t **v, uint32_t *len, uint32_t new_len )
+{
+ rc_t rc = 0;
+ if ( *len < new_len )
+ {
+ *len += new_len;
+ *v = realloc( *v, *len );
+ if ( *v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to expand (uint8_t)vector\n" );
+ }
+ }
+ if ( rc == 0 )
+ memset( *v, 0, *len );
+ return rc;
+}
+
+
+static rc_t get_exlude_vector( statistic * data, uint32_t *ref_len )
+{
+ /* we need: REF_OFFSET, REF_LEN and REF_NAME for that */
+ rc_t rc;
+ String s_ref_name;
+
+ const char * ref_name_base = ( const char * )data->rd_col[ RIDX_REF_SEQ_ID ].base;
+ uint32_t ref_name_len = data->rd_col[ RIDX_REF_SEQ_ID ].row_len;
+
+ int32_t ref_offset = *( ( int32_t *)data->rd_col[ RIDX_REF_POS ].base );
+ *ref_len = *( ( uint32_t *)data->rd_col[ RIDX_REF_LEN ].base );
+
+ StringInit( &s_ref_name, ref_name_base, ref_name_len, ref_name_len );
+
+ /* make the ref-exclude-vector longer if necessary */
+ rc = expand_and_clear_vector( &data->exclude_vector,
+ &data->exclude_vector_len,
+ *ref_len );
+ if ( rc == 0 )
+ rc = get_ref_exclude( &data->exclude,
+ &s_ref_name,
+ ref_offset,
+ *ref_len,
+ data->exclude_vector );
+
+ return rc;
+}
+
+
+static rc_t walk_exclude_vector( statistic * data,
+ uint32_t n_bases,
+ uint32_t ref_len )
+{
+ rc_t rc = 0;
+ /* we need: HAS_REF_OFFSET, REF_OFFSET and HAS_MISMATCH for that */
+
+ const char * has_roffs = ( const char * )data->rd_col[ RIDX_HAS_REF_OFFSET ].base;
+ uint32_t has_roffs_len = data->rd_col[ RIDX_HAS_REF_OFFSET ].row_len;
+
+ const int32_t * roffs = ( const int32_t * )data->rd_col[ RIDX_REF_OFFSET ].base;
+ uint32_t roffs_len = data->rd_col[ RIDX_REF_OFFSET ].row_len;
+
+ const char * has_mm = ( const char * )data->rd_col[ RIDX_HAS_MISMATCH ].base;
+ uint32_t has_mm_len = data->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+
+ if ( has_roffs_len != n_bases || has_mm_len != n_bases )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of bases does not match length of HAS_REF_OFFSET or HAS_MISMATCH\n" );
+ }
+ else
+ {
+ /* we count how many REF_OFFSETS have to be there... */
+ uint32_t hro_count = 0;
+ uint32_t idx;
+ for ( idx = 0; idx < n_bases; ++idx )
+ {
+ if ( has_roffs[ idx ] == '1' )
+ hro_count++;
+ }
+ if ( hro_count != roffs_len )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of HAS_REF_OFFSET=1 does not match length of REF_OFFSET\n" );
+ }
+ }
+
+ /* */
+ if ( rc == 0 )
+ {
+ int32_t ref_idx = 0;
+ uint32_t base_idx = 0;
+ uint32_t roffs_idx = 0;
+ while ( ref_idx < (int32_t)ref_len )
+ {
+ /* before we handle the reference, apply the ref-offset to the
+ iterator ( in this case: ref_idx ) */
+ if ( has_roffs[ base_idx ] == '1' )
+ {
+ /* this handles the left-clipping (... ref_idx < 0 )*/
+ for ( ref_idx += roffs[ roffs_idx++ ]; ref_idx < 0; ++ref_idx )
+ {
+ data->case_vector[ base_idx++ ] = CASE_IGNORE;
+ }
+ }
+ assert( ref_idx >= 0 );
+ /* all the calculation is only done to put the IGNORE-flags
+ into the right base-position (if necessary): */
+ if ( data->exclude_vector[ ref_idx++ ] > 0 )
+ data->case_vector[ base_idx ] = CASE_IGNORE;
+ base_idx++;
+ }
+ /* walk backwards from the end to apply right-clipping */
+ assert( n_bases > 0 );
+ base_idx = n_bases - 1;
+ while ( base_idx > 0 && has_mm[ base_idx ] == '1' )
+ {
+ data->case_vector[ base_idx-- ] = CASE_IGNORE;
+ }
+ }
+
+ /* enter the mis-matches into the case-vector,
+ but only where the base-position is not ignored... */
+ if ( rc == 0 )
+ {
+ uint32_t base_idx;
+ for ( base_idx = 0; base_idx < n_bases; ++base_idx )
+ {
+ if ( has_mm[ base_idx ] == '1' &&
+ data->case_vector[ base_idx ] != CASE_IGNORE )
+ {
+ data->case_vector[ base_idx ] = CASE_MISMATCH;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static const char base_complement[26] =
+{
+ /* ABCDEFGHIJKLMNOPQRSTUVWXYZ*/
+ "TBGDEFCHIJKLMNOPQRSAUVWXYZ"
+};
+
+
+static char complement( const char base )
+{
+ if ( base >= 'A' && base <= 'Z' )
+ return base_complement[ base - 'A' ];
+ else
+ return 'N';
+}
+
+
+static void reverse_read_and_case( statistic * data,
+ char * rd_ptr,
+ uint8_t *qual_ptr,
+ uint32_t n_bases )
+{
+ uint32_t p1;
+ uint32_t p2 = n_bases - 1;
+ uint32_t n = ( n_bases / 2 );
+ for ( p1 = 0; p1 < n; ++p1, --p2 )
+ {
+ char rd_temp = rd_ptr[ p1 ];
+ uint8_t c_temp = data->case_vector[ p1 ];
+ uint8_t q_temp = qual_ptr[ p1 ];
+
+ rd_ptr[ p1 ] = complement( rd_ptr[ p2 ] );
+ data->case_vector[ p1 ] = data->case_vector[ p2 ];
+ qual_ptr[ p1 ] = qual_ptr[ p2 ];
+
+ rd_ptr[ p2 ] = complement( rd_temp );
+ data->case_vector[ p2 ] = c_temp;
+ qual_ptr[ p2 ] = q_temp;
+ }
+ /* don't forget to complement the base in the middle (if n_bases is odd) */
+ if ( n_bases & 1 )
+ rd_ptr[ n ] = complement( rd_ptr[ n ] );
+}
+
+
+static rc_t loop_through_base_calls( spotgrp *sg,
+ uint32_t gc_window,
+ char * read_ptr,
+ uint32_t n_bases,
+ uint8_t * qual_ptr,
+ uint8_t * case_ptr,
+ uint32_t base_pos_offset )
+{
+ rc_t rc = 0;
+ char prev_char = 0;
+ stat_row row;
+ char *gc_ptr = read_ptr;
+ memset( &row, 0, sizeof row );
+
+ for ( row.base_pos = 0; row.base_pos < ( n_bases - 1 ) && rc == 0; ++row.base_pos )
+ {
+ /* calculate the hp-run-count */
+ if ( prev_char == *read_ptr )
+ {
+ row.hp_run++;
+ assert( row.hp_run <= n_bases );
+ }
+ else
+ {
+ prev_char = *read_ptr;
+ row.hp_run = 0;
+ }
+
+ /* advance the "window" */
+ if ( row.base_pos >= ( gc_window + 1 ) )
+ {
+ if ( *gc_ptr == 'G' || *gc_ptr == 'C' )
+ {
+ assert( row.gc_content > 0 );
+ row.gc_content--;
+ }
+ gc_ptr++;
+ }
+
+ if ( case_ptr[0] != CASE_IGNORE && case_ptr[1] != CASE_IGNORE )
+ {
+ row.quality = *qual_ptr;
+ rc = spotgroup_enter_values( sg,
+ &row,
+ dimer_2_bin( read_ptr ),
+ *case_ptr,
+ base_pos_offset );
+ }
+
+ /* handle the current base-position after the record was entered
+ because we do not include the current base into the gc-content */
+ if ( *read_ptr == 'G' || *read_ptr == 'C' )
+ row.gc_content++;
+
+ qual_ptr++;
+ read_ptr++;
+ case_ptr++;
+ }
+ return rc;
+}
+
+
+static rc_t extract_spotgroup_statistic( statistic * data,
+ spotgrp *sg,
+ uint32_t n_bases )
+{
+ uint32_t ref_len, base_pos_offset = 0;
+ char *read_ptr = ( char * )data->rd_col[ RIDX_READ ].base;
+ uint8_t *qual_ptr = ( uint8_t * )data->rd_col[ RIDX_QUALITY ].base;
+
+ /* (1) ... get the exclusion-list for this read */
+ rc_t rc = get_exlude_vector( data, &ref_len );
+
+ /* (2) ... make the case-vector longer if necessary */
+ if ( rc == 0 )
+ {
+ rc = expand_and_clear_vector( &data->case_vector,
+ &data->case_vector_len,
+ n_bases );
+ }
+
+ /* (3) ... walk the exclusion-list and Mismatch-vector to build the case-vector */
+ if ( rc == 0 )
+ {
+ rc = walk_exclude_vector( data, n_bases, ref_len );
+ }
+
+ /* (4) ... if we have to, we reverse case-vector and revers/complement the read-vector */
+ if ( rc == 0 )
+ {
+ const bool * reverse = data->rd_col[ RIDX_REF_ORIENTATION ].base;
+ if ( *reverse )
+ {
+ reverse_read_and_case( data, read_ptr, qual_ptr, n_bases );
+ }
+ }
+
+ /* (5) ... check if we are in SEQ_READ_ID == 2 */
+ if ( *( ( uint32_t * )data->rd_col[ RIDX_SEQ_READ_ID ].base ) == 2 )
+ {
+ base_pos_offset = n_bases;
+ }
+ /* TBD: make it more general for more than 2 reads per spot of different sized reads */
+
+ /* (6) ... */
+ if ( rc == 0 )
+ {
+ rc = loop_through_base_calls( sg, data->gc_window, read_ptr, n_bases,
+ qual_ptr, data->case_vector, base_pos_offset );
+ }
+ return rc;
+}
+
+
+static rc_t extract_statistic_from_row( statistic * data )
+{
+ rc_t rc = 0;
+ spotgrp *sg;
+
+ /* first try the SPOT_GROUP column (correct for newer db's) */
+ const char * spotgrp_base = data->rd_col[ RIDX_SPOT_GROUP ].base;
+ uint32_t spotgrp_len = data->rd_col[ RIDX_SPOT_GROUP ].row_len;
+ if ( spotgrp_len < 1 || *spotgrp_base == 0 )
+ {
+ /* if empty try with SEQ_SPOT_GROUP column (correct for older db's) */
+ spotgrp_base = data->rd_col[ RIDX_SEQ_SPOT_GROUP ].base;
+ spotgrp_len = data->rd_col[ RIDX_SEQ_SPOT_GROUP ].row_len;
+ }
+
+ sg = find_spotgrp( data, spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ {
+ sg = make_spotgrp( spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted );
+ else
+ rc = BSTreeInsert ( &data->spotgroups, (BSTNode *)sg, spotgroup_sort );
+ }
+ if ( rc == 0 )
+ {
+ uint32_t n_bases = data->rd_col[ RIDX_READ ].row_len;
+ uint32_t qual_len = data->rd_col[ RIDX_QUALITY ].row_len;
+ uint32_t hmis_len = data->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+
+ if ( ( n_bases == qual_len ) && ( n_bases == hmis_len ) )
+ {
+ rc = extract_spotgroup_statistic( data, sg, n_bases );
+ }
+ else
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid );
+ LogErr( klogInt, rc, "number of bases, quality and has_mismatch is not the same\n" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_and_extract_statistic_from_row( statistic * data, const VCursor *my_cursor,
+ const int64_t row_id )
+{
+ rc_t rc = read_cells( my_cursor, row_id, data->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ rc = extract_statistic_from_row( data );
+ }
+ return rc;
+}
+
+
+rc_t query_statistic_rowrange( statistic * data, const VCursor *my_cursor,
+ int64_t *first, uint64_t * count )
+{
+ rc_t rc = VCursorIdRange ( my_cursor, data->rd_col[ RIDX_READ ].idx, first, count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorIdRange() failed\n" );
+ return rc;
+}
+
+
+rc_t open_statistic_cursor( statistic * data, const VCursor *my_cursor )
+{
+ rc_t rc = add_columns( my_cursor, data->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( my_cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed\n" );
+ }
+ return rc;
+}
+
+
+typedef struct iter_ctx
+{
+ bool ( CC * f ) ( stat_row * row, void *data );
+ void * data;
+ uint64_t n;
+} iter_ctx;
+
+
+static void CC spotgroup_iter( BSTNode *n, void *data )
+{
+ spotgrp *sg = ( spotgrp * ) n;
+ iter_ctx *ctx = ( iter_ctx * )data;
+ bool run = true;
+ const char * name = sg->name->addr;
+ uint8_t dimer_idx;
+ for ( dimer_idx = 0; dimer_idx < N_DIMER_VALUES && run; ++dimer_idx )
+ {
+ uint8_t qual_idx;
+ for ( qual_idx = 0; qual_idx < N_QUAL_VALUES && run ; ++qual_idx )
+ {
+ uint8_t gc_idx;
+ for ( gc_idx = 0; gc_idx < N_GC_VALUES && run ; ++gc_idx )
+ {
+ uint8_t hp_idx;
+ for ( hp_idx = 0; hp_idx < N_HP_VALUES && run ; ++hp_idx )
+ {
+ pos_vector *pv = &sg->dimers[dimer_idx][qual_idx][gc_idx][hp_idx];
+ if ( pv->v != NULL )
+ {
+ uint32_t pos_idx;
+ for ( pos_idx = 0; pos_idx < pv->len && run; ++pos_idx )
+ {
+ qual *q = &pv->v[pos_idx];
+ if ( q->count > 0 )
+ {
+ stat_row row;
+ /* the parameters */
+ row.spotgroup = (char *)name;
+ row.dimer = (char *)dimer_2_ascii[dimer_idx];
+ row.quality = qual_idx;
+ row.hp_run = hp_idx;
+ row.gc_content = gc_idx;
+ row.base_pos = pos_idx;
+
+ /* the counters */
+ row.count = q->count;
+ row.mismatch_count = q->mismatches;
+
+ run = ctx->f( &row, ctx->data );
+ ctx->n++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data )
+{
+ iter_ctx ctx;
+ ctx.f = f;
+ ctx.data = f_data;
+ ctx.n = 0;
+ BSTreeForEach ( &data->spotgroups, false, spotgroup_iter, &ctx );
+ return ctx.n;
+}
+
+
+/************** WRITER **********************************************/
+static rc_t open_writer_cursor( statistic_writer *writer )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ for ( idx = 0; idx < N_WIDX && rc == 0; ++idx )
+ {
+ rc = add_column( writer->cursor, &writer->wr_col[ idx ], widx_names[ idx ] );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed\n" );
+ }
+ return rc;
+}
+
+
+rc_t make_statistic_writer( statistic_writer *writer, VCursor * cursor )
+{
+ writer->cursor = cursor;
+ memset( &writer->wr_col, 0, sizeof writer->wr_col );
+ return open_writer_cursor( writer );
+}
+
+
+typedef struct writer_ctx
+{
+ statistic_writer *writer;
+ rc_t rc;
+} writer_ctx;
+
+
+static bool CC write_cb( stat_row * row, void * data )
+{
+ writer_ctx * ctx = ( writer_ctx * ) data;
+ col * cols = ( col * )&ctx->writer->wr_col;
+ VCursor * cursor = ctx->writer->cursor;
+
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen() failed\n" );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_SPOT_GROUP ].idx, 8,
+ row->spotgroup, string_size( row->spotgroup ),
+ widx_names[ WIDX_SPOT_GROUP ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_KMER ].idx, 8,
+ row->dimer, string_size( row->dimer ),
+ widx_names[ WIDX_KMER ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_ORIG_QUAL ].idx, 8,
+ &row->quality, 1, widx_names[ WIDX_ORIG_QUAL ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_CYCLE ].idx, 32,
+ &row->base_pos, 1, widx_names[ WIDX_CYCLE ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_TOTAL_COUNT ].idx, 32,
+ &row->count, 1, widx_names[ WIDX_TOTAL_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_MISMATCH_COUNT ].idx, 32,
+ &row->mismatch_count, 1,
+ widx_names[ WIDX_MISMATCH_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_HPRUN ].idx, 32,
+ &row->hp_run, 1, widx_names[ WIDX_HPRUN ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_GC_CONTENT ].idx, 32,
+ &row->gc_content, 1, widx_names[ WIDX_GC_CONTENT ] );
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommitRow() failed\n" );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCloseRow() failed\n" );
+ }
+
+ ctx->rc = rc;
+ return ( rc == 0 );
+}
+
+
+rc_t write_statistic( statistic_writer *writer, statistic *data,
+ uint64_t * written )
+{
+ writer_ctx ctx;
+ uint64_t count;
+
+ ctx.writer = writer;
+ ctx.rc = 0;
+ count = foreach_statistic( data, write_cb, &ctx );
+ if ( written != NULL ) *written = count;
+
+ return ctx.rc;
+}
+
+
+rc_t whack_statistic_writer( statistic_writer *writer )
+{
+ rc_t rc = VCursorCommit( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommit() failed\n" );
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/stat_mod.h b/tools/qual-recalib-stat/stat_mod.h
new file mode 100644
index 0000000..9bec173
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod.h
@@ -0,0 +1,148 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_stat_mod_
+#define _h_stat_mod_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <vdb/cursor.h>
+#include "ref_exclude.h"
+#include "columns.h"
+
+#define N_QUAL_VALUES 40
+#define N_DIMER_VALUES 17
+#define N_GC_VALUES 8
+#define N_HP_VALUES 16
+
+#define POS_VECTOR_INC 50
+
+#define RIDX_READ 0
+#define RIDX_QUALITY 1
+#define RIDX_HAS_MISMATCH 2
+#define RIDX_SPOT_GROUP 3
+#define RIDX_SEQ_SPOT_GROUP 4
+#define RIDX_REF_ORIENTATION 5
+#define RIDX_READ_LEN 6
+#define RIDX_SEQ_READ_ID 7
+#define RIDX_HAS_REF_OFFSET 8
+#define RIDX_REF_OFFSET 9
+#define RIDX_REF_POS 10
+#define RIDX_REF_SEQ_ID 11
+#define RIDX_REF_LEN 12
+#define N_RIDX 13
+
+#define WIDX_SPOT_GROUP 0
+#define WIDX_KMER 1
+#define WIDX_ORIG_QUAL 2
+#define WIDX_TOTAL_COUNT 3
+#define WIDX_MISMATCH_COUNT 4
+#define WIDX_CYCLE 5
+#define WIDX_HPRUN 6
+#define WIDX_GC_CONTENT 7
+#define N_WIDX 8
+
+#define CASE_MATCH 0
+#define CASE_IGNORE 1
+#define CASE_MISMATCH 2
+
+
+typedef struct stat_row
+{
+ char * spotgroup;
+ char * dimer;
+ uint8_t quality;
+ uint32_t base_pos;
+ uint32_t count;
+ uint32_t mismatch_count;
+ uint32_t hp_run;
+ uint32_t gc_content;
+} stat_row;
+
+
+typedef struct statistic
+{
+ BSTree spotgroups;
+ col rd_col[ N_RIDX ];
+
+ ref_exclude exclude;
+ uint32_t gc_window;
+
+ uint8_t *exclude_vector;
+ uint32_t exclude_vector_len;
+
+ uint8_t *case_vector;
+ uint32_t case_vector_len;
+
+ void * last_used_spotgroup;
+} statistic;
+
+
+typedef struct statistic_writer
+{
+ VCursor *cursor;
+ col wr_col[ N_WIDX ];
+} statistic_writer;
+
+
+/*************** the READER ***************/
+rc_t make_statistic( statistic *data, uint32_t gc_window,
+ KDirectory *dir, const char * exclude_db );
+
+rc_t open_statistic_cursor( statistic * data, const VCursor *my_cursor );
+
+rc_t query_statistic_rowrange( statistic * data, const VCursor *my_cursor,
+ int64_t *first, uint64_t * count );
+
+rc_t read_and_extract_statistic_from_row( statistic * data,
+ const VCursor *my_cursor, const int64_t row_id );
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data );
+
+void whack_statistic( statistic *data );
+
+
+/*************** the WRITER ***************/
+rc_t make_statistic_writer( statistic_writer *writer, VCursor * cursor );
+
+rc_t write_statistic( statistic_writer *writer, statistic *data,
+ uint64_t * written );
+
+rc_t whack_statistic_writer( statistic_writer *writer );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/stat_mod_1.c b/tools/qual-recalib-stat/stat_mod_1.c
new file mode 100644
index 0000000..f4df109
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod_1.c
@@ -0,0 +1,962 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "stat_mod_1.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static const char * ridx_names[ N_RIDX ] =
+{
+ "RAW_READ",
+ "QUALITY",
+ "HAS_MISMATCH",
+ "SEQ_SPOT_ID",
+ "SPOT_GROUP",
+ "SEQ_SPOT_GROUP",
+ "REF_ORIENTATION",
+ "READ_LEN",
+ "SEQ_READ_ID",
+ "HAS_REF_OFFSET",
+ "REF_OFFSET",
+ "REF_POS",
+ "REF_SEQ_ID",
+ "REF_LEN"
+};
+
+
+static const char * widx_names[ N_WIDX ] =
+{
+ "SPOT_GROUP",
+ "KMER",
+ "ORIG_QUAL",
+ "TOTAL_COUNT",
+ "MISMATCH_COUNT",
+ "CYCLE",
+ "HPRUN",
+ "GC_CONTENT"
+};
+
+
+typedef struct counter
+{
+ uint32_t mismatches;
+ uint32_t count;
+} counter;
+
+
+typedef struct counter_vector
+{
+ counter *v;
+ uint32_t n_counters;
+} counter_vector;
+
+
+typedef struct spotgrp
+{
+ BSTNode node;
+ const String *name;
+ counter_vector cnv[ N_DIMER_VALUES ][ N_GC_VALUES ][ N_HP_VALUES ][ N_QUAL_VALUES ];
+} spotgrp;
+
+
+static const uint8_t char_2_base_bin[26] =
+{
+ /* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z*/
+ 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4
+};
+
+
+static uint8_t dimer_2_bin( char c0, char c1 )
+{
+ uint8_t res = 16;
+
+ if ( c0 >= 'A' && c0 <= 'Z' && c1 >= 'A' && c1 <= 'Z' )
+ {
+ uint8_t t1 = char_2_base_bin[ (uint8_t)( c0 - 'A' ) ];
+ uint8_t t2 = char_2_base_bin[ (uint8_t)( c1 - 'A' ) ];
+ if ( t1 < 4 && t2 < 4 )
+ {
+ res = t1;
+ res <<= 2;
+ res |= t2;
+ }
+ }
+ return res;
+}
+
+
+static const char * dimer_2_ascii[] =
+{ "AA", "AC", "AG", "AT",
+ "CA", "CC", "CG", "CT",
+ "GA", "GC", "GG", "GT",
+ "TA", "TC", "TG", "TT", "XX" };
+
+
+/******************************************************************************
+ for the spot-group ( tree-node ), contains a tree of counter's
+******************************************************************************/
+static void CC whack_spotgroup( BSTNode *n, void *data )
+{
+ spotgrp * sg = ( spotgrp * )n;
+ uint32_t idx, count;
+ count = ( ( sizeof sg->cnv ) / sizeof( sg->cnv[0] ) );
+ for ( idx = 0; idx < count; ++idx )
+ {
+ counter_vector * cv = (counter_vector *)&( sg->cnv[ idx ] );
+ if ( cv->v != NULL )
+ {
+ free( cv->v );
+ }
+ }
+ if ( sg->name != NULL )
+ StringWhack ( sg->name );
+ free( n );
+}
+
+
+static spotgrp * make_spotgrp( const char *src, const size_t len )
+{
+ spotgrp * sg = calloc( 1, sizeof sg[ 0 ] );
+ if ( sg != NULL )
+ {
+ String s;
+ StringInit( &s, src, len, len );
+ if ( StringCopy ( &sg->name, &s ) != 0 )
+ {
+ free( sg );
+ sg = NULL;
+ }
+ }
+ return sg;
+}
+
+
+static int64_t CC spotgroup_find( const void *item, const BSTNode *n )
+{
+ spotgrp * sg = ( spotgrp* ) n;
+ return StringCompare ( ( String* ) item, sg->name );
+}
+
+
+static spotgrp * find_spotgroup( statistic *data, const char *src, const size_t len )
+{
+ String s;
+ BSTNode *node;
+
+ StringInit( &s, src, len, len );
+ if ( data->last_used_spotgroup != NULL )
+ {
+ spotgrp * sg = ( spotgrp* )data->last_used_spotgroup;
+ if ( StringCompare ( &s, sg->name ) == 0 )
+ return sg;
+ }
+
+ node = BSTreeFind ( &data->spotgroups, &s, spotgroup_find );
+ if ( node == NULL )
+ return NULL;
+ else
+ {
+ data->last_used_spotgroup = node;
+ return ( spotgrp *) node;
+ }
+}
+
+
+static rc_t spotgroup_enter_values( spotgrp * spotgroup,
+ const uint8_t quality,
+ const uint8_t dimer_code,
+ const uint8_t gc_content,
+ const uint8_t hp_run,
+ const uint32_t cycle,
+ const uint8_t rd_case,
+ const uint64_t row_id )
+{
+ rc_t rc = 0;
+ uint8_t q = quality;
+ uint8_t d = dimer_code;
+ uint8_t g = gc_content;
+ uint8_t h = hp_run;
+ counter_vector * cv;
+
+ if ( q >= N_QUAL_VALUES ) q = ( N_QUAL_VALUES - 1 );
+ if ( d >= N_DIMER_VALUES ) d = ( N_DIMER_VALUES - 1 );
+ if ( g >= N_GC_VALUES ) g = ( N_GC_VALUES - 1 );
+ if ( h >= N_HP_VALUES ) h = ( N_HP_VALUES - 1 );
+ cv = &( spotgroup->cnv[ d ][ g ][ h ][ q ] );
+
+ if ( cv->v == NULL )
+ {
+ /* the counter-block was not used before at all */
+ cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+ cv->v = calloc( cv->n_counters, sizeof cv->v[0] );
+ if ( cv->v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "calloc() failed at row#$(row_nr) cycle#$(cycle)",
+ "row_nr=%lu,cycle=%u", row_id, cycle ) );
+ }
+ }
+ else
+ {
+ if ( cycle >= cv->n_counters )
+ {
+ /* the counter-block has to be extended */
+ void * tmp;
+ uint32_t org_len = cv->n_counters;
+ cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+ /* prevent from leaking memory by capturing the new pointer in temp. var. */
+ tmp = realloc( cv->v, cv->n_counters * ( sizeof cv->v[0] ) );
+ if ( tmp == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "realloc() failed at row#$(row_nr) cycle#$(cycle)",
+ "row_nr=%lu,cycle=%u", row_id, cycle ) );
+ }
+ else
+ {
+ /* the added part has to be set to zero */
+ counter * to_zero_out = tmp;
+ to_zero_out += org_len;
+ memset( to_zero_out, 0, ( cv->n_counters - org_len ) * ( sizeof *to_zero_out ) );
+ cv->v = tmp;
+ }
+ }
+ }
+ assert( cycle < cv->n_counters );
+
+ if ( rc == 0 )
+ {
+ counter * cnt = &( cv->v[ cycle ] );
+ switch( rd_case )
+ {
+ case CASE_MISMATCH : cnt->mismatches++; /* no break intented! */
+ case CASE_MATCH : cnt->count++;
+ break;
+ }
+ }
+ return rc;
+}
+
+
+static int64_t CC spotgroup_sort( const BSTNode *item, const BSTNode *n )
+{
+ spotgrp * sg1 = ( spotgrp* ) item;
+ spotgrp * sg2 = ( spotgrp* ) n;
+ return StringCompare ( sg1->name, sg2->name );
+}
+
+
+/******************************************************************************
+ for the statistic ( tree-node ), contains a tree of spot-groups's
+******************************************************************************/
+static rc_t make_vector( void ** ptr, uint32_t *len, uint32_t new_len )
+{
+ rc_t rc = 0;
+
+ *len = new_len;
+ *ptr = calloc( 1, new_len );
+ if ( *ptr == NULL )
+ {
+ *len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to make large enough exclude-vector\n" );
+ }
+ return rc;
+}
+
+
+rc_t make_statistic( statistic *data, uint32_t gc_window, uint8_t cycle_offset,
+ KDirectory *dir, const char * exclude_db,
+ bool info, bool ignore_mismatches )
+{
+ rc_t rc = 0;
+ memset( data, 0, sizeof *data );
+ BSTreeInit( &data->spotgroups );
+ data->last_used_spotgroup = NULL;
+ data->sequence = NULL;
+ data->ignore_mismatches = ignore_mismatches;
+ memset( &data->rd_col, 0, sizeof data->rd_col );
+ if ( exclude_db != NULL )
+ {
+ make_ref_exclude( &data->exclude, dir, exclude_db, info );
+ data->ref_exclude_used = true;
+ }
+ data->gc_window = gc_window;
+ if ( data->gc_window >= N_GC_VALUES )
+ {
+ data->gc_window = ( N_GC_VALUES - 1 );
+ }
+ data->cycle_offset = cycle_offset;
+ if ( data->cycle_offset > 1 )
+ {
+ data->cycle_offset = 1;
+ }
+
+ if ( rc == 0 && data->ref_exclude_used )
+ {
+ rc = make_vector( (void**)&data->exclude_vector, &data->exclude_vector_len, 512 );
+ }
+ if ( rc == 0 )
+ {
+ rc = make_vector( (void**)&data->case_vector, &data->case_vector_len, 512 );
+ }
+ return rc;
+}
+
+
+void set_spot_pos_statistic( statistic *data, spot_pos * sequence )
+{
+ data->sequence = sequence;
+}
+
+
+void whack_statistic( statistic *data )
+{
+ BSTreeWhack ( &data->spotgroups, whack_spotgroup, NULL );
+ if ( data->ref_exclude_used )
+ {
+ whack_ref_exclude( &data->exclude );
+ }
+ if ( data->exclude_vector != NULL )
+ {
+ free( data->exclude_vector );
+ }
+ if ( data->case_vector != NULL )
+ {
+ free( data->case_vector );
+ }
+}
+
+
+static rc_t expand_and_clear_vector( void **v, uint32_t *len, uint32_t new_len, bool clear )
+{
+ rc_t rc = 0;
+ if ( *v != NULL )
+ {
+ if ( *len < new_len )
+ {
+ *len += new_len;
+ *v = realloc( *v, *len );
+ if ( *v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to expand (uint8_t)vector\n" );
+ }
+ }
+ if ( rc == 0 && clear )
+ memset( *v, 0, *len );
+ }
+ return rc;
+}
+
+
+static rc_t get_exlude_vector( statistic * data, uint32_t *ref_len )
+{
+ /* we need: REF_OFFSET, REF_LEN and REF_NAME for that */
+ rc_t rc = 0;
+
+ if ( data->ref_exclude_used )
+ {
+ String s_ref_name;
+ const char * ref_name_base = ( const char * )data->rd_col[ RIDX_REF_SEQ_ID ].base;
+ uint32_t ref_name_len = data->rd_col[ RIDX_REF_SEQ_ID ].row_len;
+
+ int32_t ref_offset = *( ( int32_t *)data->rd_col[ RIDX_REF_POS ].base );
+ *ref_len = *( ( uint32_t *)data->rd_col[ RIDX_REF_LEN ].base );
+
+ StringInit( &s_ref_name, ref_name_base, ref_name_len, ref_name_len );
+
+ /* make the ref-exclude-vector longer if necessary */
+ rc = expand_and_clear_vector( (void**)&data->exclude_vector,
+ &data->exclude_vector_len,
+ *ref_len,
+ true );
+ if ( rc == 0 )
+ rc = get_ref_exclude( &data->exclude,
+ &s_ref_name,
+ ref_offset,
+ *ref_len,
+ data->exclude_vector,
+ &data->active_exclusions );
+ }
+
+ return rc;
+}
+
+
+static rc_t walk_exclude_vector( statistic * data,
+ uint32_t n_bases,
+ uint32_t ref_len )
+{
+ rc_t rc = 0;
+ /* we need: HAS_REF_OFFSET, REF_OFFSET and HAS_MISMATCH for that */
+
+ const char * has_roffs = ( const char * )data->rd_col[ RIDX_HAS_REF_OFFSET ].base;
+ uint32_t has_roffs_len = data->rd_col[ RIDX_HAS_REF_OFFSET ].row_len;
+
+ const int32_t * roffs = ( const int32_t * )data->rd_col[ RIDX_REF_OFFSET ].base;
+ uint32_t roffs_len = data->rd_col[ RIDX_REF_OFFSET ].row_len;
+
+ const char * has_mm = ( const char * )data->rd_col[ RIDX_HAS_MISMATCH ].base;
+ uint32_t has_mm_len = data->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+
+ if ( has_roffs_len != n_bases || has_mm_len != n_bases )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of bases does not match length of HAS_REF_OFFSET or HAS_MISMATCH\n" );
+ }
+ else
+ {
+ /* we count how many REF_OFFSETS have to be there... */
+ uint32_t hro_count = 0;
+ uint32_t idx;
+ for ( idx = 0; idx < n_bases; ++idx )
+ {
+ if ( has_roffs[ idx ] == '1' )
+ hro_count++;
+ }
+ if ( hro_count != roffs_len )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of HAS_REF_OFFSET=1 does not match length of REF_OFFSET\n" );
+ }
+ }
+
+ /* */
+ if ( rc == 0 )
+ {
+ int32_t ref_idx = 0;
+ uint32_t base_idx;
+ uint32_t roffs_idx = 0;
+
+ /* walk backwards from the end to apply right-clipping */
+ assert( n_bases > 0 );
+ base_idx = n_bases - 1;
+ while ( base_idx > 0 && has_mm[ base_idx ] == '1' )
+ {
+ data->case_vector[ base_idx-- ] = CASE_IGNORE;
+ n_bases--;
+ }
+
+ base_idx = 0;
+ while ( ref_idx < (int32_t)ref_len && base_idx < n_bases )
+ {
+ /* before we handle the reference, apply the ref-offset to the
+ iterator ( in this case: ref_idx ) */
+ if ( has_roffs[ base_idx ] == '1' )
+ {
+ int32_t roffs_value = roffs[ roffs_idx++ ];
+ /* this handles the left-clipping and inserts */
+ if ( roffs_value < 0 )
+ {
+ while( roffs_value++ < 0 )
+ {
+ data->case_vector[ base_idx++ ] = CASE_IGNORE;
+ }
+ }
+ else
+ {
+ ref_idx += roffs_value;
+ }
+ }
+ assert( ref_idx >= 0 );
+ /* right now ref_idx and base_idx points to corresponding positions */
+
+ /* all the calculation is only done to put the IGNORE-flags
+ into the right base-position (if necessary): */
+ if ( data->exclude_vector[ ref_idx++ ] > 0 )
+ {
+ data->case_vector[ base_idx ] = CASE_IGNORE;
+ }
+ else
+ {
+ /* enter the mis-matches into the case-vector */
+ if ( has_mm[ base_idx ] == '1' )
+ {
+ data->case_vector[ base_idx ] = CASE_MISMATCH;
+ }
+ }
+ ++base_idx;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t loop_through_base_calls( spotgrp *sg,
+ uint32_t gc_window,
+ uint8_t cycle_offset,
+ char * read_ptr, /* points at begin of array */
+ uint32_t n_bases,
+ uint8_t * qual_ptr, /* points at begin of array */
+ uint8_t * case_ptr, /* points at begin of array */
+ uint32_t base_pos_offset,
+ const int64_t row_id,
+ const int32_t ofs )
+{
+ rc_t rc = 0;
+ uint32_t base_pos;
+ char prev_char = 0;
+ char * gc_ptr = read_ptr;
+ uint8_t gc_content = 0;
+ uint8_t hp_run = 0;
+ bool enter_value;
+
+ for ( base_pos = 0; base_pos < ( n_bases - 1 ) && rc == 0; ++base_pos )
+ {
+ /* calculate the hp-run-count */
+ if ( prev_char == *read_ptr )
+ {
+ hp_run++;
+ assert( hp_run <= n_bases );
+ }
+ else
+ {
+ prev_char = *read_ptr;
+ hp_run = 0;
+ }
+
+ /* advance the "window" */
+ if ( base_pos >= ( gc_window + 1 ) )
+ {
+ if ( *gc_ptr == 'G' || *gc_ptr == 'C' )
+ {
+ assert( gc_content > 0 );
+ gc_content--;
+ }
+ gc_ptr++;
+ }
+
+ if ( case_ptr != NULL )
+ {
+ enter_value = ( case_ptr[0] != CASE_IGNORE && case_ptr[ofs] != CASE_IGNORE );
+ }
+ else
+ {
+ enter_value = true;
+ }
+
+ if ( enter_value )
+ {
+ uint8_t case_value = CASE_MATCH;
+ if ( case_ptr != NULL )
+ {
+ case_value = case_ptr[1];
+ }
+ rc = spotgroup_enter_values( sg,
+ qual_ptr[1],
+ dimer_2_bin( read_ptr[0], read_ptr[1] ),
+ gc_content,
+ hp_run,
+ base_pos + base_pos_offset + cycle_offset,
+ case_value,
+ row_id );
+ }
+
+ /* handle the current base-position after the record was entered
+ because we do not include the current base into the gc-content */
+ if ( *read_ptr == 'G' || *read_ptr == 'C' )
+ gc_content++;
+
+ qual_ptr += ofs;
+ read_ptr++;
+ if ( case_ptr != NULL )
+ {
+ case_ptr += ofs;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t extract_spotgroup_statistic( statistic * data,
+ spotgrp *sg,
+ uint32_t n_bases,
+ const int64_t row_id )
+{
+ uint32_t ref_len, seq_read_id, base_pos_offset = 0;
+ char *read_ptr = ( char * )data->rd_col[ RIDX_READ ].base;
+ uint8_t *qual_ptr = ( uint8_t * )data->rd_col[ RIDX_QUALITY ].base;
+ const bool * reverse = data->rd_col[ RIDX_REF_ORIENTATION ].base;
+
+ /* (1) ... make the case-vector longer if necessary */
+ rc_t rc = expand_and_clear_vector( (void**)&data->case_vector,
+ &data->case_vector_len,
+ n_bases,
+ true );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "expand_and_clear_vector( case_vector ) failed at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+
+ /* (2) ... get the exclusion-list for this read */
+ if ( data->ref_exclude_used )
+ {
+ rc = get_exlude_vector( data, &ref_len );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "get_exlude_vector() failed at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+
+ /* (3) ... walk the exclusion-list and Mismatch-vector to build the case-vector */
+ if ( rc == 0 )
+ {
+ rc = walk_exclude_vector( data, n_bases, ref_len );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "walk_exclude_vector failed at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+ }
+ }
+ else
+ {
+ if ( !data->ignore_mismatches )
+ {
+ const char * has_mm = ( const char * )data->rd_col[ RIDX_HAS_MISMATCH ].base;
+ uint32_t has_mm_len = data->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+ uint32_t base_idx;
+ for ( base_idx = 0; base_idx < n_bases && base_idx < has_mm_len; ++base_idx )
+ {
+ if ( has_mm[ base_idx ] == '1' )
+ {
+ data->case_vector[ base_idx ] = CASE_MISMATCH;
+ }
+ }
+ }
+ }
+
+ /* (4) ... query the base-postion of this read in the spot from the SEQUENCE-table */
+ seq_read_id = *( ( uint32_t * )data->rd_col[ RIDX_SEQ_READ_ID ].base );
+#ifdef LOOKUP_ALL_SEQ_READ_ID
+ if ( seq_read_id > 0 )
+#else
+ if ( seq_read_id > 1 )
+#endif
+ {
+ uint32_t spot_id = *( ( uint32_t * )data->rd_col[ RIDX_SEQ_SPOT_ID ].base );
+ rc = query_spot_pos( data->sequence, seq_read_id, spot_id, &base_pos_offset );
+ }
+
+ /* (5) ... looping throuhg the bases ( forward/backward ) */
+ if ( rc == 0 )
+ {
+
+ if ( *reverse )
+ {
+ uint8_t * loc_case_vector = data->case_vector + ( n_bases - 1 );
+ qual_ptr += ( n_bases - 1 );
+ rc = loop_through_base_calls( sg, data->gc_window, data->cycle_offset,
+ read_ptr, n_bases, qual_ptr, loc_case_vector,
+ base_pos_offset, row_id, -1 );
+
+ }
+ else
+ {
+ rc = loop_through_base_calls( sg, data->gc_window, data->cycle_offset,
+ read_ptr, n_bases, qual_ptr, data->case_vector,
+ base_pos_offset, row_id, +1 );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t extract_statistic_from_row( statistic * data, const int64_t row_id )
+{
+ rc_t rc = 0;
+ spotgrp *sg;
+
+ /* first try the SPOT_GROUP column (correct for newer db's) */
+ const char * spotgrp_base = data->rd_col[ RIDX_SPOT_GROUP ].base;
+ uint32_t spotgrp_len = data->rd_col[ RIDX_SPOT_GROUP ].row_len;
+ if ( spotgrp_len < 1 || *spotgrp_base == 0 )
+ {
+ /* if empty try with SEQ_SPOT_GROUP column (correct for older db's) */
+ spotgrp_base = data->rd_col[ RIDX_SEQ_SPOT_GROUP ].base;
+ spotgrp_len = data->rd_col[ RIDX_SEQ_SPOT_GROUP ].row_len;
+ }
+
+ sg = find_spotgroup( data, spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ {
+ sg = make_spotgrp( spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ {
+ rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "make_spotgrp failed at row $(row_nr)", "row_nr=%lu", row_id ) );
+ }
+ else
+ {
+ rc = BSTreeInsert ( &data->spotgroups, (BSTNode *)sg, spotgroup_sort );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "BSTreeInsert( new spotgroup ) at row $(row_nr)", "row_nr=%lu", row_id ) );
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ uint32_t n_bases = data->rd_col[ RIDX_READ ].row_len;
+ uint32_t qual_len = data->rd_col[ RIDX_QUALITY ].row_len;
+ uint32_t hmis_len = data->rd_col[ RIDX_HAS_MISMATCH ].row_len;
+
+ if ( ( n_bases == qual_len ) && ( n_bases == hmis_len ) )
+ {
+ rc = extract_spotgroup_statistic( data, sg, n_bases, row_id );
+ }
+ else
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "number of bases, quality and has_mismatch is not the same at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_and_extract_statistic_from_row( statistic * data, const VCursor *my_cursor,
+ const int64_t row_id )
+{
+ rc_t rc = read_cells( my_cursor, row_id, data->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ rc = extract_statistic_from_row( data, row_id );
+ }
+ return rc;
+}
+
+
+rc_t query_statistic_rowrange( statistic * data, const VCursor *my_cursor,
+ int64_t *first, uint64_t * count )
+{
+ rc_t rc = VCursorIdRange ( my_cursor, data->rd_col[ RIDX_READ ].idx, first, count );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorIdRange() failed\n" );
+ return rc;
+}
+
+
+rc_t open_statistic_cursor( statistic * data, const VCursor *my_cursor )
+{
+ rc_t rc = add_columns( my_cursor, data->rd_col, ridx_names, N_RIDX );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( my_cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed\n" );
+ }
+ return rc;
+}
+
+
+typedef struct iter_ctx
+{
+ bool ( CC * f ) ( stat_row * row, void *data );
+ void * data;
+ const char * name;
+ bool run;
+ stat_row row;
+ uint64_t n;
+} iter_ctx;
+
+
+static bool CC spotgroup_iter( BSTNode *n, void *data )
+{
+ spotgrp *sg = ( spotgrp * ) n;
+ iter_ctx *ctx = ( iter_ctx * )data;
+
+ ctx->row.spotgroup = (char *)sg->name->addr;
+ for ( ctx->row.quality = 0; ctx->row.quality < N_QUAL_VALUES && ctx->run; ++ctx->row.quality )
+ {
+ uint8_t dimer_nr;
+ for ( dimer_nr = 0; dimer_nr < N_DIMER_VALUES && ctx->run; ++dimer_nr )
+ {
+ ctx->row.dimer = (char *)dimer_2_ascii[ dimer_nr ];
+ for( ctx->row.gc_content = 0; ctx->row.gc_content < N_GC_VALUES; ++ctx->row.gc_content )
+ {
+ for ( ctx->row.hp_run = 0; ctx->row.hp_run < N_HP_VALUES && ctx->run; ++ctx->row.hp_run )
+ {
+ uint32_t pos;
+ counter_vector * cv = &sg->cnv[ dimer_nr ][ ctx->row.gc_content ][ ctx->row.hp_run ][ ctx->row.quality ];
+ for ( pos = 0; pos < cv->n_counters; ++pos )
+ {
+ counter * c = &cv->v[ pos ];
+ if ( c->count > 0 )
+ {
+ ctx->row.base_pos = pos;
+ ctx->row.count = c->count;
+ ctx->row.mismatch_count = c->mismatches;
+
+ ctx->run = ctx->f( &ctx->row, ctx->data );
+ ctx->n++;
+ }
+ }
+ }
+ }
+ }
+ }
+ return( !ctx->run );
+}
+
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data )
+{
+ iter_ctx ctx;
+ ctx.f = f;
+ ctx.data = f_data;
+ ctx.run = true;
+ ctx.n = 0;
+ BSTreeDoUntil ( &data->spotgroups, false, spotgroup_iter, &ctx );
+ return ctx.n;
+}
+
+
+/************** WRITER **********************************************/
+static rc_t open_writer_cursor( statistic_writer *writer )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ for ( idx = 0; idx < N_WIDX && rc == 0; ++idx )
+ {
+ rc = add_column( writer->cursor, &writer->wr_col[ idx ], widx_names[ idx ] );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed\n" );
+ }
+ return rc;
+}
+
+
+rc_t make_statistic_writer( statistic_writer *writer, VCursor * cursor )
+{
+ writer->cursor = cursor;
+ memset( &writer->wr_col, 0, sizeof writer->wr_col );
+ return open_writer_cursor( writer );
+}
+
+
+typedef struct writer_ctx
+{
+ statistic_writer *writer;
+ rc_t rc;
+} writer_ctx;
+
+
+static bool CC write_cb( stat_row * row, void * data )
+{
+ writer_ctx * ctx = ( writer_ctx * ) data;
+ col * cols = ( col * )&ctx->writer->wr_col;
+ VCursor * cursor = ctx->writer->cursor;
+
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen() failed\n" );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_SPOT_GROUP ].idx, 8,
+ row->spotgroup, string_size( row->spotgroup ),
+ widx_names[ WIDX_SPOT_GROUP ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_KMER ].idx, 8,
+ row->dimer, string_size( row->dimer ),
+ widx_names[ WIDX_KMER ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_ORIG_QUAL ].idx, 8,
+ &row->quality, 1, widx_names[ WIDX_ORIG_QUAL ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_CYCLE ].idx, 32,
+ &row->base_pos, 1, widx_names[ WIDX_CYCLE ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_TOTAL_COUNT ].idx, 32,
+ &row->count, 1, widx_names[ WIDX_TOTAL_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_MISMATCH_COUNT ].idx, 32,
+ &row->mismatch_count, 1,
+ widx_names[ WIDX_MISMATCH_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_HPRUN ].idx, 32,
+ &row->hp_run, 1, widx_names[ WIDX_HPRUN ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_GC_CONTENT ].idx, 32,
+ &row->gc_content, 1, widx_names[ WIDX_GC_CONTENT ] );
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommitRow() failed\n" );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCloseRow() failed\n" );
+ }
+
+ ctx->rc = rc;
+ return ( rc == 0 );
+}
+
+
+rc_t write_statistic( statistic_writer *writer, statistic *data,
+ uint64_t * written )
+{
+ writer_ctx ctx;
+ uint64_t count;
+
+ ctx.writer = writer;
+ ctx.rc = 0;
+ count = foreach_statistic( data, write_cb, &ctx );
+ if ( written != NULL ) *written = count;
+
+ return ctx.rc;
+}
+
+
+rc_t whack_statistic_writer( statistic_writer *writer )
+{
+ rc_t rc = VCursorCommit( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommit() failed\n" );
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/stat_mod_1.h b/tools/qual-recalib-stat/stat_mod_1.h
new file mode 100644
index 0000000..82cfa1c
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod_1.h
@@ -0,0 +1,160 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_stat_mod_
+#define _h_stat_mod_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <vdb/cursor.h>
+#include "ref_exclude.h"
+#include "columns.h"
+#include "spot_position.h"
+
+#define N_QUAL_VALUES 41
+#define N_DIMER_VALUES 17
+#define N_GC_VALUES 16
+#define N_HP_VALUES 25
+#define COUNTER_BLOCK_SIZE 100
+
+#define RIDX_READ 0
+#define RIDX_QUALITY 1
+#define RIDX_HAS_MISMATCH 2
+#define RIDX_SEQ_SPOT_ID 3
+#define RIDX_SPOT_GROUP 4
+#define RIDX_SEQ_SPOT_GROUP 5
+#define RIDX_REF_ORIENTATION 6
+#define RIDX_READ_LEN 7
+#define RIDX_SEQ_READ_ID 8
+#define RIDX_HAS_REF_OFFSET 9
+#define RIDX_REF_OFFSET 10
+#define RIDX_REF_POS 11
+#define RIDX_REF_SEQ_ID 12
+#define RIDX_REF_LEN 13
+#define N_RIDX 14
+
+#define WIDX_SPOT_GROUP 0
+#define WIDX_KMER 1
+#define WIDX_ORIG_QUAL 2
+#define WIDX_TOTAL_COUNT 3
+#define WIDX_MISMATCH_COUNT 4
+#define WIDX_CYCLE 5
+#define WIDX_HPRUN 6
+#define WIDX_GC_CONTENT 7
+#define N_WIDX 8
+
+#define CASE_MATCH 0
+#define CASE_IGNORE 1
+#define CASE_MISMATCH 2
+
+
+typedef struct stat_row
+{
+ char * spotgroup;
+ char * dimer;
+ uint8_t quality;
+ uint32_t base_pos;
+ uint32_t count;
+ uint32_t mismatch_count;
+ uint8_t hp_run;
+ uint8_t gc_content;
+} stat_row;
+
+
+typedef struct statistic
+{
+ BSTree spotgroups; /* the tree contains 'spotgrp'-node, it collects the statistic */
+ col rd_col[ N_RIDX ]; /* a list of vdb-columns, the input-data per read */
+
+ bool ref_exclude_used; /* flag indicating that the (VARLOC) exclude-vector is in use */
+ bool ignore_mismatches;
+
+ ref_exclude exclude;
+ uint32_t gc_window;
+ uint8_t cycle_offset;
+
+ uint8_t *exclude_vector;
+ uint32_t exclude_vector_len;
+ uint32_t active_exclusions;
+
+ uint8_t *case_vector;
+ uint32_t case_vector_len;
+
+ void * last_used_spotgroup;
+
+ spot_pos * sequence;
+} statistic;
+
+
+typedef struct statistic_writer
+{
+ VCursor *cursor;
+ col wr_col[ N_WIDX ];
+} statistic_writer;
+
+
+/*************** the READER ***************/
+rc_t make_statistic( statistic *data,
+ uint32_t gc_window, uint8_t cycle_offset,
+ KDirectory *dir, const char * exclude_db,
+ bool info, bool ignore_mismatches );
+
+void set_spot_pos_statistic( statistic *data, spot_pos * sequence );
+
+rc_t open_statistic_cursor( statistic * data, const VCursor *my_cursor );
+
+rc_t query_statistic_rowrange( statistic * data, const VCursor *my_cursor,
+ int64_t *first, uint64_t * count );
+
+rc_t read_and_extract_statistic_from_row( statistic * data,
+ const VCursor *my_cursor, const int64_t row_id );
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data );
+
+void whack_statistic( statistic *data );
+
+
+/*************** the WRITER ***************/
+rc_t make_statistic_writer( statistic_writer *writer, VCursor * cursor );
+
+rc_t write_statistic( statistic_writer *writer, statistic *data,
+ uint64_t * written );
+
+rc_t whack_statistic_writer( statistic_writer *writer );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/stat_mod_2.c b/tools/qual-recalib-stat/stat_mod_2.c
new file mode 100644
index 0000000..a9d1f92
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod_2.c
@@ -0,0 +1,1041 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "stat_mod_2.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+typedef struct counter
+{
+ uint32_t mismatches;
+ uint32_t count;
+} counter;
+
+
+typedef struct counter_vector
+{
+ counter *v;
+ uint32_t n_counters;
+} counter_vector;
+
+#define USE_JUDY 1
+
+typedef struct spotgrp
+{
+ BSTNode node;
+ const String *name;
+#ifdef USE_JUDY
+ KVector *v;
+#else
+ counter_vector cnv[ N_MAX_QUAL_VALUES ][ N_READS ][ N_DIMER_VALUES ][ N_GC_VALUES ][ N_HP_VALUES ][ N_QUAL_VALUES ];
+#endif
+} spotgrp;
+
+
+static const uint8_t char_2_base_bin[26] =
+{
+ /* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z*/
+ 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4
+};
+
+
+/*
+ AA ... 0 CA ... 5 GA ... 10 TA ... 15 NA ... 20
+ AC ... 1 CC ... 6 GC ... 11 TC ... 16 NC ... 21
+ AG ... 2 CG ... 7 GG ... 12 TG ... 17 NG ... 22
+ AT ... 3 CT ... 8 GT ... 13 TT ... 18 NT ... 23
+ AN ... 4 CN ... 9 GN ... 14 TN ... 19 NN ... 24
+
+ dimer-code = ( lookup( co ) * 5 ) + lookup( c1 )
+ dimer-code = 0 ... 24
+*/
+static uint8_t dimer_2_bin( char c0, char c1 )
+{
+ uint8_t lookup0, lookup1;
+
+ if ( c0 >= 'A' && c0 <= 'Z' )
+ {
+ lookup0 = char_2_base_bin[ (uint8_t)( c0 - 'A' ) ];
+ }
+ else
+ {
+ lookup0 = 4;
+ }
+
+ if ( c1 >= 'A' && c1 <= 'Z' )
+ {
+ lookup1 = char_2_base_bin[ (uint8_t)( c1 - 'A' ) ];
+ }
+ else
+ {
+ lookup1 = 4;
+ }
+
+ return ( ( lookup0 << 2 ) + lookup0 ) + lookup1;
+}
+
+static const char * dimer_2_ascii[] =
+{ "AA", "AC", "AG", "AT", "AN",
+ "CA", "CC", "CG", "CT", "CN",
+ "GA", "GC", "GG", "GT", "GN",
+ "TA", "TC", "TG", "TT", "TN",
+ "NA", "NC", "NG", "NT", "NN" };
+
+/********************************************************************************
+ 6666.5555.5555.5544.4444.4444.3333.3333.3322.2222.2222.1111.1111.1100.0000.0000
+ 3210.9876.5432.1098.7654.3210.9876.5432.1098.7654.3210.9876.5432.1098.7654.3210
+ CCCC CCCC CCCC CCCC CCCC CCCC CCCC CCCC RRRR RRDD DDDG GGGH HHHH MMMM MMQQ QQQQ
+
+ C ... cycle ( 32 bit )
+ R ... nread ( 6 bit )
+ D ... dimer ( 5 bit )
+ G ... gc-content ( 4 bit )
+ H ... hp-run ( 5 bit )
+ M ... max. qual ( 6 bit )
+ Q ... quality ( 6 bit )
+*********************************************************************************/
+#ifdef USE_JUDY
+
+static uint64_t encode_key( const uint32_t pos,
+ const uint8_t max_q,
+ const uint8_t nread,
+ const uint8_t dimer,
+ const uint8_t gc,
+ const uint8_t hp,
+ const uint8_t qual )
+{
+ uint64_t res = pos;
+ res <<= 6;
+ res |= ( nread & 0x3F );
+ res <<= 5;
+ res |= ( dimer & 0x1F );
+ res <<= 4;
+ res |= ( gc & 0xF );
+ res <<= 5;
+ res |= ( hp & 0x1F );
+ res <<= 6;
+ res |= ( max_q & 0x3F );
+ res <<= 6;
+ res |= ( qual & 0x3F );
+ return res;
+}
+
+
+static void decode_key( const uint64_t key,
+ uint32_t *pos,
+ uint8_t *max_q,
+ uint8_t *nread,
+ uint8_t *dimer,
+ uint8_t *gc,
+ uint8_t *hp,
+ uint8_t *qual )
+{
+ uint64_t temp = key;
+ *qual = temp & 0x3F;
+ temp >>= 6;
+ *max_q = temp & 0x3F;
+ temp >>= 6;
+ *hp = temp & 0x1F;
+ temp >>= 5;
+ *gc = temp & 0xF;
+ temp >>= 4;
+ *dimer = temp & 0x1F;
+ temp >>= 5;
+ *nread = temp & 0x3F;
+ temp >>= 6;
+ *pos = temp & 0xFFFFFFFF;
+}
+
+
+typedef struct two_counters
+{
+ uint32_t total;
+ uint32_t mismatch;
+} two_counters;
+
+typedef union counter_union
+{
+ uint64_t value;
+ two_counters counters;
+} counter_union;
+
+
+static bool set_counter( KVector *v,
+ const uint32_t pos,
+ const uint8_t max_q,
+ const uint8_t nread,
+ const uint8_t dimer,
+ const uint8_t gc,
+ const uint8_t hp,
+ const uint8_t qual,
+ bool mismatch )
+{
+ bool res = false;
+ counter_union u;
+ uint64_t key = encode_key( pos, max_q, nread, dimer, gc, hp, qual );
+ if ( KVectorGetU64 ( v, key, &(u.value) ) == 0 )
+ {
+ u.counters.total++;
+ if ( mismatch )
+ {
+ u.counters.mismatch++;
+ }
+ }
+ else
+ {
+ u.counters.total = 1;
+ res = true;
+ if ( mismatch )
+ {
+ u.counters.mismatch = 1;
+ }
+ else
+ {
+ u.counters.mismatch = 0;
+ }
+ }
+ KVectorSetU64 ( v, key, u.value );
+ return res;
+}
+
+#if 0
+static void get_counter( KVector *v,
+ const uint32_t pos,
+ const uint8_t max_q,
+ const uint8_t nread,
+ const uint8_t dimer,
+ const uint8_t gc,
+ const uint8_t hp,
+ const uint8_t qual,
+ uint32_t *total,
+ uint32_t *mismatch )
+{
+ counter_union u;
+ uint64_t key = encode_key( pos, max_q, nread, dimer, gc, hp, qual );
+ if ( KVectorGetU64 ( v, key, &(u.value) ) == 0 )
+ {
+ *total = u.counters.total;
+ *mismatch = u.counters.mismatch;
+ }
+ else
+ {
+ *total = 0;
+ *mismatch = 0;
+ }
+}
+#endif
+
+#endif
+
+/******************************************************************************
+ for the spot-group ( tree-node ), contains a tree of counter's
+******************************************************************************/
+static void CC whack_spotgroup( BSTNode *n, void *data )
+{
+ spotgrp * sg = ( spotgrp * )n;
+
+#ifdef USE_JUDY
+ KVectorRelease ( sg->v );
+#else
+ uint32_t idx, count;
+ count = ( ( sizeof sg->cnv ) / sizeof( sg->cnv[0] ) );
+ for ( idx = 0; idx < count; ++idx )
+ {
+ counter_vector * cv = (counter_vector *)&( sg->cnv[ idx ] );
+ if ( cv->v != NULL )
+ {
+ free( cv->v );
+ }
+ }
+#endif
+
+ if ( sg->name != NULL )
+ StringWhack ( sg->name );
+ free( n );
+}
+
+
+static spotgrp * make_spotgrp( const char *src, const size_t len )
+{
+ spotgrp * sg = calloc( 1, sizeof sg[ 0 ] );
+ if ( sg != NULL )
+ {
+ String s;
+ StringInit( &s, src, len, len );
+ if ( StringCopy ( &sg->name, &s ) != 0 )
+ {
+ free( sg );
+ sg = NULL;
+ }
+#ifdef USE_JUDY
+ else
+ {
+ KVectorMake ( &sg->v );
+ }
+#endif
+ }
+ return sg;
+}
+
+
+static int64_t CC spotgroup_find( const void *item, const BSTNode *n )
+{
+ spotgrp * sg = ( spotgrp* ) n;
+ return StringCompare ( ( String* ) item, sg->name );
+}
+
+
+static spotgrp * find_spotgroup( statistic *data, const char *src, const size_t len )
+{
+ String s;
+ BSTNode *node;
+
+ StringInit( &s, src, len, len );
+ if ( data->last_used_spotgroup != NULL )
+ {
+ spotgrp * sg = ( spotgrp* )data->last_used_spotgroup;
+ if ( StringCompare ( &s, sg->name ) == 0 )
+ return sg;
+ }
+
+ node = BSTreeFind ( &data->spotgroups, &s, spotgroup_find );
+ if ( node == NULL )
+ return NULL;
+ else
+ {
+ data->last_used_spotgroup = node;
+ return ( spotgrp *) node;
+ }
+}
+
+
+static rc_t spotgroup_enter_values( spotgrp * spotgroup,
+ uint64_t *entries,
+ const uint8_t quality,
+ const uint8_t dimer_code,
+ const uint8_t gc_content,
+ const uint8_t hp_run,
+ const uint8_t max_quality,
+ const uint8_t n_read,
+ const uint32_t cycle,
+ const uint8_t rd_case,
+ const uint64_t row_id )
+{
+ rc_t rc = 0;
+ uint8_t q = quality;
+ uint8_t d = dimer_code;
+ uint8_t g = gc_content;
+ uint8_t h = hp_run;
+ uint8_t m = max_quality;
+ uint8_t n = n_read;
+
+#ifdef USE_JUDY
+ bool mismatch;
+#else
+ counter_vector * cv;
+#endif
+
+ if ( q >= N_QUAL_VALUES ) q = ( N_QUAL_VALUES - 1 );
+ if ( d >= N_DIMER_VALUES ) d = ( N_DIMER_VALUES - 1 );
+ if ( g >= N_GC_VALUES ) g = ( N_GC_VALUES - 1 );
+ if ( h >= N_HP_VALUES ) h = ( N_HP_VALUES - 1 );
+ if ( m >= N_MAX_QUAL_VALUES ) m = ( N_MAX_QUAL_VALUES - 1 );
+ if ( n >= N_READS ) n = ( N_READS - 1 );
+
+
+#ifdef USE_JUDY
+ mismatch = false;
+ switch( rd_case )
+ {
+ case CASE_MISMATCH : mismatch = true; /* no break intented! */
+ case CASE_MATCH : if ( set_counter( spotgroup->v, cycle, m, n, d, g, h, q, mismatch ) )
+ {
+ (*entries)++;
+ }
+ break;
+ }
+#else
+ cv = &( spotgroup->cnv[ m ][ n ][ d ][ g ][ h ][ q ] );
+
+ if ( cv->v == NULL )
+ {
+ /* the counter-block was not used before at all */
+ cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+ cv->v = calloc( cv->n_counters, sizeof cv->v[0] );
+ if ( cv->v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "calloc() failed at row#$(row_nr) cycle#$(cycle)",
+ "row_nr=%lu,cycle=%u", row_id, cycle ) );
+ }
+ }
+ else
+ {
+ if ( cycle >= cv->n_counters )
+ {
+ /* the counter-block has to be extended */
+ void * tmp;
+ uint32_t org_len = cv->n_counters;
+ cv->n_counters = ( ( cycle / COUNTER_BLOCK_SIZE ) + 1 ) * COUNTER_BLOCK_SIZE;
+ /* prevent from leaking memory by capturing the new pointer in temp. var. */
+ tmp = realloc( cv->v, cv->n_counters * ( sizeof cv->v[0] ) );
+ if ( tmp == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "realloc() failed at row#$(row_nr) cycle#$(cycle)",
+ "row_nr=%lu,cycle=%u", row_id, cycle ) );
+ }
+ else
+ {
+ /* the added part has to be set to zero */
+ counter * to_zero_out = tmp;
+ to_zero_out += org_len;
+ memset( to_zero_out, 0, ( cv->n_counters - org_len ) * ( sizeof *to_zero_out ) );
+ cv->v = tmp;
+ }
+ }
+ }
+ assert( cycle < cv->n_counters );
+
+ if ( rc == 0 )
+ {
+ counter * cnt = &( cv->v[ cycle ] );
+ switch( rd_case )
+ {
+ case CASE_MISMATCH : cnt->mismatches++; /* no break intented! */
+ case CASE_MATCH : if ( cnt->count == 0 )
+ {
+ (*entries)++;
+ }
+ cnt->count++;
+ break;
+ }
+ }
+#endif
+ return rc;
+}
+
+
+static int64_t CC spotgroup_sort( const BSTNode *item, const BSTNode *n )
+{
+ spotgrp * sg1 = ( spotgrp* ) item;
+ spotgrp * sg2 = ( spotgrp* ) n;
+ return StringCompare ( sg1->name, sg2->name );
+}
+
+
+/******************************************************************************
+ for the statistic ( tree-node ), contains a tree of spot-groups's
+******************************************************************************/
+static rc_t make_vector( void ** ptr, uint32_t *len, uint32_t new_len )
+{
+ rc_t rc = 0;
+
+ *len = new_len;
+ *ptr = calloc( 1, new_len );
+ if ( *ptr == NULL )
+ {
+ *len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to make large enough exclude-vector\n" );
+ }
+ return rc;
+}
+
+
+rc_t make_statistic( statistic *data,
+ uint32_t gc_window,
+ bool ignore_mismatches )
+{
+ rc_t rc = 0;
+ memset( data, 0, sizeof *data );
+ BSTreeInit( &data->spotgroups );
+ data->last_used_spotgroup = NULL;
+ data->ignore_mismatches = ignore_mismatches;
+ data->gc_window = gc_window;
+ if ( data->gc_window >= N_GC_VALUES )
+ {
+ data->gc_window = ( N_GC_VALUES - 1 );
+ }
+ if ( rc == 0 )
+ {
+ rc = make_vector( (void**)&data->case_vector, &data->case_vector_len, 512 );
+ }
+ return rc;
+}
+
+
+void whack_statistic( statistic *data )
+{
+ BSTreeWhack ( &data->spotgroups, whack_spotgroup, NULL );
+ if ( data->case_vector != NULL )
+ {
+ free( data->case_vector );
+ }
+}
+
+
+static rc_t expand_and_clear_vector( void **v, uint32_t *len, uint32_t new_len, bool clear )
+{
+ rc_t rc = 0;
+ if ( *v != NULL )
+ {
+ if ( *len < new_len )
+ {
+ *len += new_len;
+ *v = realloc( *v, *len );
+ if ( *v == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LogErr( klogInt, rc, "failed to expand (uint8_t)vector\n" );
+ }
+ }
+ if ( rc == 0 && clear )
+ memset( *v, 0, *len );
+ }
+ return rc;
+}
+
+#if 0
+static rc_t walk_exclude_vector( statistic * data,
+ uint32_t n_bases,
+ row_input * row_data )
+{
+ rc_t rc = 0;
+
+ if ( row_data->has_roffs_len != n_bases ||
+ row_data->has_mismatch_len != n_bases )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of bases does not match length of HAS_REF_OFFSET or HAS_MISMATCH\n" );
+ }
+ else
+ {
+ /* we count how many REF_OFFSETS have to be there... */
+ uint32_t hro_count = 0;
+ uint32_t idx;
+ for ( idx = 0; idx < n_bases; ++idx )
+ {
+ if ( row_data->has_roffs[ idx ] )
+ hro_count++;
+ }
+ if ( hro_count != row_data->roffs_len )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LogErr( klogInt, rc, "number of HAS_REF_OFFSET=1 does not match length of REF_OFFSET\n" );
+ }
+ }
+
+ /* */
+ if ( rc == 0 )
+ {
+ int32_t ref_idx = 0;
+ uint32_t base_idx;
+ uint32_t roffs_idx = 0;
+
+ /* walk backwards from the end to apply right-clipping */
+ assert( n_bases > 0 );
+ base_idx = n_bases - 1;
+ while ( base_idx > 0 && row_data->has_mismatch[ base_idx ] )
+ {
+ data->case_vector[ base_idx-- ] = CASE_IGNORE;
+ n_bases--;
+ }
+
+ base_idx = 0;
+ while ( ref_idx < (int32_t)row_data->exclude_len && base_idx < n_bases )
+ {
+ /* before we handle the reference, apply the ref-offset to the
+ iterator ( in this case: ref_idx ) */
+ if ( row_data->has_roffs[ base_idx ] )
+ {
+ int32_t roffs_value = row_data->roffs[ roffs_idx++ ];
+ /* this handles the left-clipping and inserts */
+ if ( roffs_value < 0 )
+ {
+ while( roffs_value++ < 0 )
+ {
+ data->case_vector[ base_idx++ ] = CASE_IGNORE;
+ }
+ }
+ else
+ {
+ ref_idx += roffs_value;
+ }
+ }
+ assert( ref_idx >= 0 );
+ /* right now ref_idx and base_idx points to corresponding positions */
+
+ /* all the calculation is only done to put the IGNORE-flags
+ into the right base-position (if necessary): */
+ if ( row_data->exclude[ ref_idx++ ] > 0 )
+ {
+ data->case_vector[ base_idx ] = CASE_IGNORE;
+ }
+ else
+ {
+ /* enter the mis-matches into the case-vector */
+ if ( row_data->has_mismatch[ base_idx ] )
+ {
+ data->case_vector[ base_idx ] = CASE_MISMATCH;
+ }
+ }
+ ++base_idx;
+ }
+ }
+ return rc;
+}
+#endif
+
+static rc_t loop_through_base_calls( spotgrp *sg,
+ uint64_t *entries,
+ uint32_t gc_window,
+ char * read_ptr, /* points at begin of array */
+ uint32_t n_bases,
+ uint8_t * qual_ptr, /* points at begin of array */
+ uint8_t * case_ptr, /* points at begin of array */
+ uint32_t base_pos_offset,
+ uint8_t n_read, /* the number of the read (0/1) */
+ const int64_t row_id,
+ const int32_t ofs )
+{
+ rc_t rc = 0;
+ uint32_t base_pos;
+ char prev_char;
+ char * gc_ptr = read_ptr;
+ uint8_t gc_content = 0;
+ uint8_t hp_run = 0;
+ uint8_t max_qual_value = 0;
+ bool enter_value;
+ uint8_t *saved_qual_ptr = qual_ptr;
+
+ /* calculate the max. quality value, befor we loop through the bases a 2nd time */
+ for ( base_pos = 0; base_pos < n_bases; ++base_pos )
+ {
+ if ( max_qual_value < *qual_ptr )
+ {
+ max_qual_value = *qual_ptr;
+ }
+ qual_ptr += ofs; /* because of going from forward or reverse */
+ }
+ /* restore qual_ptr */
+ qual_ptr = saved_qual_ptr;
+
+ prev_char = 'N';
+ for ( base_pos = 0; base_pos < n_bases && rc == 0; ++base_pos )
+ {
+ /* calculate the hp-run-count */
+ if ( prev_char == *read_ptr )
+ {
+ hp_run++;
+ assert( hp_run <= n_bases );
+ }
+ else
+ {
+ hp_run = 0;
+ }
+
+ /* advance the "window" */
+ if ( base_pos >= ( gc_window + 1 ) )
+ {
+ if ( *gc_ptr == 'G' || *gc_ptr == 'C' )
+ {
+ assert( gc_content > 0 );
+ gc_content--;
+ }
+ gc_ptr++;
+ }
+
+ if ( case_ptr != NULL )
+ {
+ enter_value = ( case_ptr[0] != CASE_IGNORE && case_ptr[ofs] != CASE_IGNORE );
+ }
+ else
+ {
+ enter_value = true;
+ }
+
+ if ( enter_value )
+ {
+ uint8_t case_value = CASE_MATCH;
+ if ( case_ptr != NULL )
+ {
+ case_value = case_ptr[ 1 ];
+ }
+ rc = spotgroup_enter_values( sg, entries,
+ *qual_ptr,
+ dimer_2_bin( prev_char, *read_ptr ),
+ gc_content,
+ hp_run,
+ max_qual_value,
+ n_read,
+ base_pos + base_pos_offset,
+ case_value,
+ row_id );
+ }
+
+ /* handle the current base-position after the record was entered
+ because we do not include the current base into the gc-content */
+ if ( *read_ptr == 'G' || *read_ptr == 'C' )
+ gc_content++;
+
+ qual_ptr += ofs;
+ prev_char = *read_ptr;
+ read_ptr++;
+ if ( case_ptr != NULL )
+ {
+ case_ptr += ofs;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t extract_spotgroup_statistic( statistic * data,
+ spotgrp *sg,
+ uint32_t n_bases,
+ row_input * row_data,
+ const int64_t row_id )
+{
+ /* (1) ... make the case-vector longer if necessary */
+ rc_t rc = expand_and_clear_vector( (void**)&data->case_vector,
+ &data->case_vector_len,
+ n_bases,
+ true );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "expand_and_clear_vector( case_vector ) failed at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+
+#if 1
+ if (rc == 0 && !data->ignore_mismatches) {
+ unsigned si;
+ unsigned ri;
+ unsigned j;
+
+ for (si = ri = j = 0; si < n_bases && ri < row_data->ref_len; ) {
+ if (row_data->has_roffs[si]) {
+ int const offset = row_data->roffs[j++];
+
+ if (offset < 0) {
+ unsigned const n = -offset;
+ unsigned k;
+
+ /* set inserts to ignore (handles left soft clip) */
+ for (k = 0; k < n && si + k < n_bases; ++k)
+ data->case_vector[si + k] = CASE_IGNORE;
+ si += k;
+ continue;
+ }
+ ri += offset;
+ }
+ if (row_data->read[si] == 'N' || (row_data->exclude && row_data->exclude[ri]))
+ data->case_vector[si] = CASE_IGNORE;
+ else if (row_data->has_mismatch[si])
+ data->case_vector[si] = CASE_MISMATCH;
+ else
+ data->case_vector[si] = CASE_MATCH;
+ ++si;
+ ++ri;
+ }
+ /* handle right soft clip */
+ for ( ; si < n_bases; ++si)
+ data->case_vector[si] = CASE_IGNORE;
+ }
+#else
+ /* (2) ... get the exclusion-list for this read */
+ if ( row_data->exclude != NULL )
+ {
+ /* (3) ... walk the exclusion-list and Mismatch-vector to build the case-vector */
+ if ( rc == 0 )
+ {
+ rc = walk_exclude_vector( data, n_bases, row_data );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "walk_exclude_vector failed at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+ }
+ }
+ else
+ {
+ if ( !data->ignore_mismatches )
+ {
+ uint32_t base_idx;
+
+ for ( base_idx = 0;
+ base_idx < n_bases && base_idx < row_data->has_mismatch_len;
+ ++base_idx )
+ {
+ if ( row_data->has_mismatch[ base_idx ] )
+ {
+ data->case_vector[ base_idx ] = CASE_MISMATCH;
+ }
+ }
+ /* handle left soft clip */
+ for ( base_idx = 0;
+ base_idx < n_bases && base_idx < row_data->has_mismatch_len;
+ ++base_idx )
+ {
+ if (!row_data->has_mismatch[base_idx]) {
+ break;
+ }
+ data->case_vector[base_idx] = CASE_IGNORE;
+ }
+ /* handle right soft clip */
+ for ( base_idx = 0;
+ base_idx < n_bases && base_idx < row_data->has_mismatch_len;
+ ++base_idx )
+ {
+ if (!row_data->has_mismatch[row_data->has_mismatch_len - base_idx - 1]) {
+ break;
+ }
+ data->case_vector[row_data->has_mismatch_len - base_idx - 1] = CASE_IGNORE;
+ }
+ }
+ }
+#endif
+
+ /* (4) ... looping throuhg the bases ( forward/backward ) */
+ if ( rc == 0 )
+ {
+ uint8_t *qual_ptr = row_data->quality;
+ if ( row_data->reversed )
+ {
+ uint8_t * loc_case_vector = data->case_vector + ( n_bases - 1 );
+ qual_ptr += ( n_bases - 1 );
+ rc = loop_through_base_calls( sg, &data->entries,
+ data->gc_window, row_data->read, n_bases, qual_ptr, loc_case_vector,
+ row_data->base_pos_offset, row_data->seq_read_id - 1, row_id, -1 );
+
+ }
+ else
+ {
+ rc = loop_through_base_calls( sg, &data->entries,
+ data->gc_window, row_data->read, n_bases, qual_ptr, data->case_vector,
+ row_data->base_pos_offset, row_data->seq_read_id - 1, row_id, +1 );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( n_bases > data->max_cycle )
+ {
+ data->max_cycle = n_bases;
+ }
+ }
+
+ return rc;
+}
+
+
+rc_t extract_statistic_from_row( statistic * data,
+ row_input * row_data,
+ const int64_t row_id )
+{
+ rc_t rc = 0;
+ spotgrp *sg;
+
+ /* first try the SPOT_GROUP column (correct for newer db's) */
+ char * spotgrp_base = row_data->spotgroup;
+ uint32_t spotgrp_len = row_data->spotgroup_len;
+ /* first try the SPOT_GROUP column (correct for newer db's) */
+ if ( spotgrp_len < 1 || *spotgrp_base == 0 )
+ {
+ /* if empty try with SEQ_SPOT_GROUP column (correct for older db's) */
+ spotgrp_base = row_data->seq_spotgroup;
+ spotgrp_len = row_data->seq_spotgroup_len;
+ }
+
+ sg = find_spotgroup( data, spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ {
+ sg = make_spotgrp( spotgrp_base, spotgrp_len );
+ if ( sg == NULL )
+ {
+ rc = RC( rcApp, rcSelf, rcConstructing, rcMemory, rcExhausted );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "make_spotgrp failed at row $(row_nr)", "row_nr=%lu", row_id ) );
+ }
+ else
+ {
+ rc = BSTreeInsert ( &data->spotgroups, (BSTNode *)sg, spotgroup_sort );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "BSTreeInsert( new spotgroup ) at row $(row_nr)", "row_nr=%lu", row_id ) );
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ uint32_t n_bases = row_data->read_len;
+
+ if ( ( n_bases == row_data->quality_len ) &&
+ ( n_bases == row_data->has_mismatch_len ) )
+ {
+ rc = extract_spotgroup_statistic( data, sg, n_bases, row_data, row_id );
+ }
+ else
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "number of bases, quality and has_mismatch is not the same at row $(row_nr)",
+ "row_nr=%lu", row_id ) );
+ }
+ }
+ return rc;
+}
+
+
+typedef struct iter_ctx
+{
+ bool ( CC * f ) ( stat_row * row, void *data );
+ void * data;
+ const char * name;
+ bool run;
+ stat_row row;
+ uint64_t n;
+ uint32_t max_cycle;
+} iter_ctx;
+
+
+#ifdef USE_JUDY
+static rc_t CC counter_visit( uint64_t key, uint64_t value, void * data )
+{
+ uint8_t q, dimer, gc, hp, mq, nr;
+ uint32_t pos;
+ iter_ctx *ctx = ( iter_ctx * )data;
+ counter_union u;
+
+ decode_key( key, &pos, &mq, &nr, &dimer, &gc, &hp, &q );
+ u.value = value;
+
+ ctx->row.dimer = (char *)dimer_2_ascii[ dimer ];
+ ctx->row.quality = q;
+ ctx->row.gc_content = gc;
+ ctx->row.hp_run = hp;
+ ctx->row.max_qual_value = mq;
+ ctx->row.n_read = nr;
+ ctx->row.base_pos = pos;
+ ctx->row.count = u.counters.total;
+ ctx->row.mismatch_count = u.counters.mismatch;
+
+ ctx->run = ctx->f( &ctx->row, ctx->data );
+ ctx->n++;
+ return 0;
+}
+#endif
+
+
+static bool CC spotgroup_iter( BSTNode *n, void *data )
+{
+ spotgrp *sg = ( spotgrp * ) n;
+ iter_ctx *ctx = ( iter_ctx * )data;
+
+#ifndef USE_JUDY
+ uint8_t q, dimer, gc, hp, mq, nr;
+ uint32_t pos;
+#endif
+
+ ctx->row.spotgroup = (char *)sg->name->addr;
+
+#ifdef USE_JUDY
+ KVectorVisitU64 ( sg->v, false, counter_visit, data );
+#else
+ for ( pos = 0; pos <= ctx->max_cycle; ++pos )
+ {
+ for ( nr = 0; nr < N_READS; ++nr )
+ {
+ for ( dimer = 0; dimer < N_DIMER_VALUES; ++dimer )
+ {
+ for( gc = 0; gc < N_GC_VALUES; ++gc )
+ {
+ for ( hp = 0; hp < N_HP_VALUES; ++hp )
+ {
+ for ( mq = 0; mq < N_MAX_QUAL_VALUES; ++mq )
+ {
+ for ( q = 0; q < N_QUAL_VALUES; ++q )
+ {
+ counter_vector * cv = &sg->cnv[ mq ][ nr ][ dimer ][ gc ][ hp ][ q ];
+ if ( cv != NULL )
+ {
+ if ( pos < cv->n_counters )
+ {
+ counter * c = &cv->v[ pos ];
+ if ( c->count > 0 )
+ {
+ ctx->row.dimer = (char *)dimer_2_ascii[ dimer ];
+ ctx->row.quality = q;
+ ctx->row.gc_content = gc;
+ ctx->row.hp_run = hp;
+ ctx->row.max_qual_value = mq;
+ ctx->row.n_read = nr;
+ ctx->row.base_pos = pos;
+ ctx->row.count = c->count;
+ ctx->row.mismatch_count = c->mismatches;
+
+ ctx->run = ctx->f( &ctx->row, ctx->data );
+ ctx->n++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ return( !ctx->run );
+}
+
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data )
+{
+ iter_ctx ctx;
+ ctx.n = 0;
+ if ( f != NULL )
+ {
+ ctx.f = f;
+ ctx.data = f_data;
+ ctx.max_cycle = data->max_cycle;
+ ctx.run = true;
+ BSTreeDoUntil ( &data->spotgroups, false, spotgroup_iter, &ctx );
+ }
+ return ctx.n;
+}
diff --git a/tools/qual-recalib-stat/stat_mod_2.h b/tools/qual-recalib-stat/stat_mod_2.h
new file mode 100644
index 0000000..cc19d3a
--- /dev/null
+++ b/tools/qual-recalib-stat/stat_mod_2.h
@@ -0,0 +1,141 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_stat_mod_
+#define _h_stat_mod_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/vector.h>
+#include <vdb/cursor.h>
+#include "columns.h"
+
+#define N_QUAL_VALUES 41
+#define N_DIMER_VALUES 25
+#define N_GC_VALUES 8
+#define N_HP_VALUES 8
+#define N_READS 2
+#define N_MAX_QUAL_VALUES 41
+#define COUNTER_BLOCK_SIZE 100
+
+#define CASE_MATCH 0
+#define CASE_IGNORE 1
+#define CASE_MISMATCH 2
+
+
+typedef struct row_input
+{
+ char * spotgroup;
+ uint32_t spotgroup_len;
+
+ char * seq_spotgroup;
+ uint32_t seq_spotgroup_len;
+
+ char * read;
+ uint32_t read_len;
+
+ uint8_t * quality;
+ uint32_t quality_len;
+
+ bool * has_mismatch;
+ uint32_t has_mismatch_len;
+
+ bool * has_roffs;
+ uint32_t has_roffs_len;
+
+ int32_t * roffs;
+ uint32_t roffs_len;
+
+ uint8_t * exclude;
+ uint32_t exclude_len;
+
+ bool reversed;
+ uint32_t seq_read_id;
+ uint32_t spot_id;
+ uint32_t base_pos_offset;
+ uint32_t ref_len;
+} row_input;
+
+
+typedef struct stat_row
+{
+ char * spotgroup;
+ char * dimer;
+ uint8_t quality;
+ uint32_t base_pos;
+ uint32_t count;
+ uint32_t mismatch_count;
+ uint8_t hp_run;
+ uint8_t gc_content;
+ uint8_t max_qual_value;
+ uint8_t n_read;
+} stat_row;
+
+
+typedef struct statistic
+{
+ BSTree spotgroups; /* the tree contains 'spotgrp'-node, it collects the statistic */
+
+ bool ignore_mismatches;
+
+ uint32_t gc_window;
+
+ uint8_t *case_vector;
+ uint32_t case_vector_len;
+
+ void * last_used_spotgroup;
+ uint64_t entries;
+ uint32_t max_cycle;
+} statistic;
+
+
+/*************** the STATISTIC GATHERER ***************/
+rc_t make_statistic( statistic *data,
+ uint32_t gc_window,
+ bool ignore_mismatches );
+
+
+rc_t extract_statistic_from_row( statistic * data,
+ row_input * row_data,
+ const int64_t row_id );
+
+uint64_t foreach_statistic( statistic * data,
+ bool ( CC * f ) ( stat_row * row, void * f_data ), void *f_data );
+
+void whack_statistic( statistic *data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/qual-recalib-stat/writer.c b/tools/qual-recalib-stat/writer.c
new file mode 100644
index 0000000..b133358
--- /dev/null
+++ b/tools/qual-recalib-stat/writer.c
@@ -0,0 +1,480 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "writer.h"
+
+#include <klib/printf.h>
+#include <klib/progressbar.h>
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+static const char * widx_names[ N_WIDX ] =
+{
+ "SPOT_GROUP",
+ "KMER",
+ "ORIG_QUAL",
+ "TOTAL_COUNT",
+ "MISMATCH_COUNT",
+ "CYCLE",
+ "HPRUN",
+ "GC_CONTENT",
+ "MAX_QUAL",
+ "NREAD"
+};
+
+
+static rc_t open_writer_cursor( statistic_writer *writer )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+
+ for ( idx = 0; idx < N_WIDX && rc == 0; ++idx )
+ {
+ rc = add_column( writer->cursor, &writer->wr_col[ idx ], widx_names[ idx ] );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen failed\n" );
+ }
+ return rc;
+}
+
+
+static rc_t make_statistic_writer( statistic_writer *writer, VCursor * cursor )
+{
+ memset( &writer->wr_col, 0, sizeof writer->wr_col );
+ writer->cursor = cursor;
+ return open_writer_cursor( writer );
+}
+
+
+typedef struct writer_ctx
+{
+ statistic_writer *writer;
+ rc_t rc;
+
+ struct progressbar * progress;
+ uint64_t entries;
+ uint64_t n;
+ uint8_t fract_digits;
+} writer_ctx;
+
+
+static uint8_t progressbar_calc_fract_digits( const uint64_t count )
+{
+ uint8_t res = 0;
+ if ( count > 10000 )
+ {
+ if ( count > 100000 )
+ res = 2;
+ else
+ res = 1;
+ }
+ return res;
+}
+
+static uint32_t progressbar_percent( const uint64_t count, const uint64_t value,
+ const uint8_t fract_digits )
+{
+ uint32_t factor = 100;
+ uint32_t res = 0;
+
+ if ( fract_digits > 0 )
+ {
+ if ( fract_digits > 1 )
+ factor = 10000;
+ else
+ factor = 1000;
+ }
+
+ if ( count > 0 )
+ {
+ if ( value >= count )
+ res = factor;
+ else
+ {
+ uint64_t temp = value;
+ temp *= factor;
+ temp /= count;
+ res = (uint16_t) temp;
+ }
+ }
+ return res;
+}
+
+
+static bool CC write_cb( stat_row * row, void * data )
+{
+ writer_ctx * ctx = ( writer_ctx * ) data;
+ col * cols = ( col * )&ctx->writer->wr_col;
+ VCursor * cursor = ctx->writer->cursor;
+
+ rc_t rc = VCursorOpenRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorOpen() failed\n" );
+
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_SPOT_GROUP ].idx, 8,
+ row->spotgroup, string_size( row->spotgroup ),
+ widx_names[ WIDX_SPOT_GROUP ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_KMER ].idx, 8,
+ row->dimer, string_size( row->dimer ),
+ widx_names[ WIDX_KMER ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_ORIG_QUAL ].idx, 8,
+ &row->quality, 1, widx_names[ WIDX_ORIG_QUAL ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_CYCLE ].idx, 32,
+ &row->base_pos, 1, widx_names[ WIDX_CYCLE ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_TOTAL_COUNT ].idx, 32,
+ &row->count, 1, widx_names[ WIDX_TOTAL_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_MISMATCH_COUNT ].idx, 32,
+ &row->mismatch_count, 1,
+ widx_names[ WIDX_MISMATCH_COUNT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_HPRUN ].idx, 32,
+ &row->hp_run, 1, widx_names[ WIDX_HPRUN ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_GC_CONTENT ].idx, 32,
+ &row->gc_content, 1, widx_names[ WIDX_GC_CONTENT ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_MAX_QUAL ].idx, 8,
+ &row->max_qual_value, 1, widx_names[ WIDX_MAX_QUAL ] );
+ if ( rc == 0 )
+ rc = write_to_cursor( cursor, cols[ WIDX_NREAD ].idx, 8,
+ &row->n_read, 1, widx_names[ WIDX_NREAD ] );
+
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommitRow() failed\n" );
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCloseRow( cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCloseRow() failed\n" );
+ }
+
+ ctx->rc = rc;
+ if ( ctx->progress != NULL && rc == 0 )
+ {
+ uint32_t percent = progressbar_percent( ctx->entries, ++( ctx->n ), ctx->fract_digits );
+ update_progressbar( ctx->progress, percent );
+ }
+
+ return ( rc == 0 );
+}
+
+
+static rc_t write_statistic( statistic_writer *writer, statistic *data,
+ uint64_t * written, bool show_progress )
+{
+ writer_ctx ctx;
+ uint64_t count;
+
+ ctx.writer = writer;
+ ctx.rc = 0;
+ ctx.progress = NULL;
+
+ if ( show_progress )
+ {
+ ctx.entries = data->entries;
+ ctx.fract_digits = progressbar_calc_fract_digits( ctx.entries );
+ make_progressbar( &ctx.progress, ctx.fract_digits );
+ ctx.n = 0;
+ }
+
+ count = foreach_statistic( data, write_cb, &ctx );
+
+ if ( show_progress )
+ {
+ destroy_progressbar( ctx.progress );
+ OUTMSG(( "\n" ));
+ }
+
+ if ( written != NULL ) *written = count;
+
+ return ctx.rc;
+}
+
+
+static rc_t whack_statistic_writer( statistic_writer *writer )
+{
+ rc_t rc = VCursorCommit( writer->cursor );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VCursorCommit() failed\n" );
+ return rc;
+}
+
+
+typedef struct write_ctx
+{
+ KFile *out;
+ uint64_t pos;
+ uint64_t lines;
+
+ struct progressbar *progress;
+ uint64_t entries;
+ uint8_t fract_digits;
+} write_ctx;
+
+
+static bool CC write_to_file_cb( stat_row * row, void * f_data )
+{
+ write_ctx * wctx = ( write_ctx * ) f_data;
+ char buffer[ 256 ];
+ size_t num_writ;
+
+ rc_t rc = string_printf ( buffer, sizeof buffer, &num_writ,
+ "%s\t%u\t%u\t%s\t%u\t%u\t%u\t%u\t%u\t%u\n",
+ row->spotgroup,
+ row->base_pos,
+ row->n_read,
+ row->dimer,
+ row->gc_content,
+ row->hp_run,
+ row->max_qual_value,
+ row->quality,
+ row->count,
+ row->mismatch_count );
+
+ if ( rc == 0 )
+ {
+ size_t f_writ;
+ rc = KFileWrite ( wctx->out, wctx->pos, buffer, num_writ, &f_writ );
+ if ( rc == 0 )
+ {
+ uint32_t percent = progressbar_percent( wctx->entries, ++wctx->lines, wctx->fract_digits );
+ update_progressbar( wctx->progress, percent );
+ wctx->pos += f_writ;
+ }
+ }
+ return ( rc == 0 );
+}
+
+
+rc_t write_output_file( KDirectory *dir, statistic * data,
+ const char * path, uint64_t * written )
+{
+ write_ctx wctx;
+ rc_t rc;
+
+ if ( written != NULL )
+ {
+ *written = 0;
+ }
+ wctx.out = NULL;
+ wctx.pos = 0;
+ wctx.lines = 0;
+ rc = KDirectoryCreateFile ( dir, &wctx.out, false, 0664, kcmInit, "%s", path );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "KDirectoryCreateFile() failed\n" );
+ else
+ {
+ char buffer[ 256 ];
+ size_t num_writ;
+ rc = string_printf ( buffer, sizeof buffer, &num_writ,
+ "SPOTGROUP\tCYCLE\tNRead\tDIMER\tGC_CONTENT\tHP_RUN\tMaxQ\tQuality\tTOTAL\tMISMATCH\n" );
+ if ( rc == 0 )
+ {
+ size_t f_writ;
+ rc = KFileWrite ( wctx.out, wctx.pos, buffer, num_writ, &f_writ );
+ if ( rc == 0 )
+ {
+ if ( written != NULL ) *written = f_writ;
+ wctx.pos += f_writ;
+
+ wctx.entries = data->entries;
+ wctx.fract_digits = progressbar_calc_fract_digits( wctx.entries );
+ make_progressbar( &wctx.progress, wctx.fract_digits );
+
+ foreach_statistic( data, write_to_file_cb, &wctx );
+
+ destroy_progressbar( wctx.progress );
+ OUTMSG(( "\n" ));
+
+ KFileRelease ( wctx.out );
+ if ( written != NULL )
+ {
+ *written = wctx.lines;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t make_schema( const KNamelist * schema_list,
+ VDBManager *my_manager, VSchema ** schema )
+{
+ rc_t rc = VDBManagerMakeSchema ( my_manager, schema );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerMakeSchema() failed\n" );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( schema_list, &count );
+ if ( rc !=0 )
+ LogErr( klogInt, rc, "KNamelistCount(schema-list) failed\n" );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * name;
+ rc = KNamelistGet ( schema_list, i, &name );
+ if ( rc !=0 )
+ LogErr( klogInt, rc, "KNamelistGet(schema-list) failed\n" );
+ else
+ {
+ rc = VSchemaParseFile ( *schema, "%s", name );
+ if ( rc !=0 )
+ LogErr( klogInt, rc, "VSchemaParseFile() failed\n" );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t write_statistic_cmn( VTable * my_table, statistic * data,
+ uint64_t * written, bool show_progress )
+{
+ VCursor *my_cursor;
+ rc_t rc = VTableCreateCursorWrite( my_table, &my_cursor, kcmInsert );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VTableCreateCursorWrite() failed\n" );
+ else
+ {
+ statistic_writer writer;
+ rc = make_statistic_writer( &writer, my_cursor );
+ if ( rc == 0 )
+ {
+ rc = write_statistic( &writer, data, written, show_progress );
+ if ( rc == 0 )
+ rc = whack_statistic_writer( &writer );
+ }
+ VCursorRelease( my_cursor );
+ }
+ return rc;
+}
+
+
+rc_t write_statistic_into_tab( KDirectory *dir, statistic * data,
+ const KNamelist *schema_list, const char *output_file_path,
+ uint64_t * written, bool show_progress )
+{
+ VDBManager *my_manager;
+ rc_t rc;
+
+ if ( written != NULL ) *written = 0;
+ rc = VDBManagerMakeUpdate ( &my_manager, dir );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerMakeUpdate() failed\n" );
+ else
+ {
+ VSchema * my_schema;
+ rc = make_schema( schema_list, my_manager, &my_schema );
+ if ( rc == 0 )
+ {
+ VTable * my_table;
+ rc = VDBManagerCreateTable( my_manager, &my_table, my_schema,
+ "NCBI:align:tbl:qstat",
+ kcmInit | kcmParents,
+ "%s", output_file_path );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerCreateTable() failed\n" );
+ else
+ {
+ rc = write_statistic_cmn( my_table, data, written, show_progress );
+ VTableRelease( my_table );
+ }
+ VSchemaRelease( my_schema );
+ }
+ VDBManagerRelease( my_manager );
+ }
+ return rc;
+}
+
+
+rc_t write_statistic_into_db( KDirectory *dir, statistic * data,
+ const KNamelist *schema_list, const char *src_path,
+ uint64_t * written, bool show_progress )
+{
+ VDBManager *my_manager;
+ rc_t rc;
+
+ if ( written != NULL ) *written = 0;
+ rc = VDBManagerMakeUpdate ( &my_manager, dir );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerMakeUpdate() failed\n" );
+ else
+ {
+ VSchema * my_schema;
+ rc = make_schema( schema_list, my_manager, &my_schema );
+ if ( rc == 0 )
+ {
+ VDatabase *my_database;
+ rc = VDBManagerOpenDBUpdate( my_manager, &my_database,
+ my_schema, "%s", src_path );
+ if ( rc != 0 )
+ LogErr( klogInt, rc, "VDBManagerOpenDBUpdate() failed\n" );
+ else
+ {
+ VTable * my_table;
+ rc = VDatabaseCreateTable( my_database, &my_table,
+ "QUAL_STAT",
+ kcmOpen | kcmParents,
+ "QUAL_STAT" );
+ if ( rc !=0 )
+ LogErr( klogInt, rc, "VDatabaseCreateTable() failed\n" );
+ else
+ {
+ rc = write_statistic_cmn( my_table, data, written, show_progress );
+ VTableRelease( my_table );
+ }
+ VDatabaseRelease( my_database );
+ }
+ VSchemaRelease( my_schema );
+ }
+ VDBManagerRelease( my_manager );
+ }
+ return rc;
+}
diff --git a/tools/qual-recalib-stat/writer.h b/tools/qual-recalib-stat/writer.h
new file mode 100644
index 0000000..7dffc3f
--- /dev/null
+++ b/tools/qual-recalib-stat/writer.h
@@ -0,0 +1,79 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_stat_writer_
+#define _h_stat_writer_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <kfs/directory.h>
+#include <vdb/cursor.h>
+#include <vdb/schema.h>
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+#include "columns.h"
+#include "stat_mod_2.h"
+
+#define WIDX_SPOT_GROUP 0
+#define WIDX_KMER 1
+#define WIDX_ORIG_QUAL 2
+#define WIDX_TOTAL_COUNT 3
+#define WIDX_MISMATCH_COUNT 4
+#define WIDX_CYCLE 5
+#define WIDX_HPRUN 6
+#define WIDX_GC_CONTENT 7
+#define WIDX_MAX_QUAL 8
+#define WIDX_NREAD 9
+#define N_WIDX 10
+
+typedef struct statistic_writer
+{
+ VCursor *cursor;
+ col wr_col[ N_WIDX ];
+} statistic_writer;
+
+
+rc_t write_output_file( KDirectory *dir, statistic * data,
+ const char * path, uint64_t * written );
+
+rc_t write_statistic_into_tab( KDirectory *dir, statistic * data,
+ const KNamelist *schema_list, const char *output_file_path,
+ uint64_t * written, bool show_progress );
+
+rc_t write_statistic_into_db( KDirectory *dir, statistic * data,
+ const KNamelist *schema_list, const char *src_path,
+ uint64_t * written, bool show_progress );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/rd-filter-redact/Makefile b/tools/rd-filter-redact/Makefile
new file mode 100644
index 0000000..d37a9d9
--- /dev/null
+++ b/tools/rd-filter-redact/Makefile
@@ -0,0 +1,95 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/rd-filter-redact
+
+INT_TOOLS = \
+ test-read-write-cursor
+
+EXT_TOOLS = \
+ read-filter-redact
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# read-filter-redact
+#
+READ_FILTER_REDACT_SRC = \
+ read-filter-redact \
+
+READ_FILTER_REDACT_OBJ = \
+ $(addsuffix .$(OBJX),$(READ_FILTER_REDACT_SRC))
+
+READ_FILTER_REDACT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/read-filter-redact: $(READ_FILTER_REDACT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(READ_FILTER_REDACT_LIB)
+
+#-------------------------------------------------------------------------------
+# test-read-write-cursor
+#
+TEST_READ_WRITE_CURSOR_SRC = \
+ test-read-write-cursor \
+
+TEST_READ_WRITE_CURSOR_OBJ = \
+ $(addsuffix .$(OBJX),$(TEST_READ_WRITE_CURSOR_SRC))
+
+TEST_READ_WRITE_CURSOR_LIB = \
+ -lkapp \
+ -stk-version \
+ -lncbi-wvdb \
+
+$(BINDIR)/test-read-write-cursor: $(TEST_READ_WRITE_CURSOR_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TEST_READ_WRITE_CURSOR_LIB)
+
diff --git a/tools/rd-filter-redact/rd-filter-redact.c b/tools/rd-filter-redact/rd-filter-redact.c
new file mode 100644
index 0000000..64063b5
--- /dev/null
+++ b/tools/rd-filter-redact/rd-filter-redact.c
@@ -0,0 +1,1350 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ */
+
+#include <kapp/main.h> /* KMain */
+#include <kapp/log.h> /* plogmsg */
+#include <kfs/file.h> /* KFile */
+#include <klib/rc.h> /* GetRCState */
+#include <sra/wsradb.h> /* SRAMgr */
+#include <sra/sradb-priv.h> /* SRATableGetKTableUpdate */
+#include <vdb/types.h> /* vdb_uint8_t */
+#include <kdb/database.h> /* KDBManagerMakeUpdate */
+#include <kdb/table.h> /* KTableRelease */
+#include <ctype.h> /* isdigit */
+#include <string.h> /* memset */
+#include <stdio.h> /* sscanf */
+#include <assert.h>
+#include <sys/stat.h> /* umask */
+
+#include <stdlib.h> /* system */
+
+
+typedef struct Context
+{
+ const char* file_path;
+ const char* table_path;
+ const char * schema_path;
+
+ KDirectory * pwd;
+ VDBManager * mgr;
+ VSchema * schema;
+ VTable * table;
+
+
+ const KFile * file;
+
+
+
+ bool force;
+
+} Context
+
+struct SArgs {
+};
+struct SData {
+ SRATable* _wrTbl;
+ const SRATable* _rdTbl;
+ const SRAColumn* _origFilterCol;
+ const SRAColumn* _NReadsCol;
+ const char* _origFilterColName;
+ bool _existedRD_FILTER;
+ bool _locked;
+};
+
+
+
+static KDirectory* __SpotIteratorDirectory = NULL;
+/** SpotIterator: iterate spot numbers from 1 to max;
+input spots to reduct from the file */
+struct SpotIterator {
+ spotid_t m_crnSpotId;
+ spotid_t m_maxSpotId;
+
+ spotid_t m_spotToReduct;
+
+ const char* m_filename;
+ size_t m_line;
+ const KFile* m_file;
+ size_t m_filePos;
+ bool m_eof;
+
+ char m_buffer[512];
+ size_t m_inBuffer;
+ char m_ch;
+ bool m_hasCh;
+};
+
+/** Init the static directory object */
+static rc_t SpotIteratorInitDirectory (void)
+{
+ if (__SpotIteratorDirectory)
+ {
+ return 0;
+ }
+ else
+ {
+ rc_t rc = KDirectoryNativeDir(&__SpotIteratorDirectory);
+ if (rc != 0)
+ {
+ logerr(klogErr, rc, "while calling KDirectoryNativeDir");
+ }
+ return rc;
+ }
+}
+
+static
+bool PathExists (const KDirectory * dir, KPathType desired_type, const char * path, ...)
+{
+ KPathType found_type;
+ bool found;
+ va_list args;
+
+ va_start (args, path);
+
+ found_type = KDirectoryVPathType (dir, path, args);
+ found_type &= ~kptAlias;
+
+ found = (found_type == desired_type)
+
+ va_end (args);
+ return found;
+}
+
+
+
+/** Check file existance */
+static bool SpotIteratorFileExists(const char* path, ...)
+{
+ bool found = false;
+ if (SpotIteratorInitDirectory() == 0)
+ {
+ uint32_t type
+ va_list args;
+ va_start(args, path);
+
+ type = KDirectoryVPathType(__SpotIteratorDirectory, path, args);
+ found = (type != kptNotFound);
+ va_end(args);
+ }
+ return found;
+}
+
+static bool SpotIteratorBufferAdd(struct SpotIterator* self, char ch)
+{
+ assert(self);
+
+ if (self->m_inBuffer >= (sizeof self->m_buffer - 1))
+ {
+ return false;
+ }
+
+ self->m_buffer[self->m_inBuffer++] = ch;
+ self->m_buffer[self->m_inBuffer] = '\0';
+
+ return true;
+}
+
+/** Read a character from the input file */
+static rc_t SpotIteratorFileReadWithEof(struct SpotIterator* self,
+ void* buffer, size_t bsize)
+{
+ rc_t rc = 0;
+ size_t num_read = 0;
+
+ assert(self);
+
+ rc = KFileRead(self->m_file, self->m_filePos, buffer, bsize, &num_read);
+ if (rc == 0)
+ {
+ if (num_read == 0)
+ {
+ self->m_eof = true;
+ }
+ else
+ {
+ self->m_filePos += num_read;
+ }
+ }
+ else
+ {
+ plogerr(klogErr, rc, "on line $(lineno) while reading file '$(path)'",
+ PLOG_U64(lineno) ",path=%s", self->m_line, self->m_filename);
+ }
+
+ return rc;
+}
+
+/** Read a line from the input file */
+static rc_t SpotIteratorReadLine(struct SpotIterator* self)
+{
+ rc_t rc = 0;
+ bool ok = true; /* ok means 'no input buffer overflow' */
+
+ /* to skip leading/traling spaces */
+ enum ELane
+ {
+ eBefore,
+ eIn,
+ eAfter
+ } state = eBefore;
+
+ if (self->m_eof) {
+ return rc;
+ }
+
+ assert(self);
+
+ ++self->m_line;
+ self->m_inBuffer = 0;
+
+ /* get back the saved character */
+ if (self->m_hasCh) {
+ SpotIteratorBufferAdd(self, self->m_ch);
+ if (!isblank(self->m_ch)) {
+ state = eIn;
+ }
+ self->m_hasCh = false;
+ }
+
+ while (ok && !self->m_eof) /* do until in-buffer overflow or EOF*/{
+ char ch = 0;
+ /* get next characted */
+ if ((rc = SpotIteratorFileReadWithEof(self, &ch, 1)) != 0) {
+ return rc;
+ }
+
+ if (!self->m_eof) {
+ /* treat leading/trailing spaces */
+ switch (state) {
+ /* skip leading spaces */
+ case eBefore:
+ if (isblank(ch)) {
+ continue;
+ }
+ else {
+ state = eIn;
+ }
+ break;
+ case eIn:
+ if (isblank(ch)) {
+ state = eAfter;
+ continue;
+ }
+ break;
+ /* skip trailing spaces */
+ case eAfter:
+ if (isblank(ch)) {
+ continue;
+ }
+ else if (ch != '\n' && ch != '\r') {
+ rc = RC(rcExe, rcFile, rcReading, rcChar, rcUnexpected);
+ plogerr(klogErr, rc, "bad symbol '$(char)' "
+ "on line $(lineno) in file '$(path)': '$(line)...'",
+ "char=%c," PLOG_U64(lineno) ",path=%s,line=%s",
+ ch, self->m_line, self->m_filename, self->m_buffer);
+ return rc;
+ }
+ break;
+ }
+
+ /* add next non-blank characted */
+ if ((ok = SpotIteratorBufferAdd(self, ch))) {
+ /* all combinations as "\r", "\n", "\r\n", "\n\r" are considered as EOL */
+ if (ch == '\n' || ch == '\r') {
+ char c1 = 0;
+ if ((rc = SpotIteratorFileReadWithEof(self, &c1, 1)) != 0) {
+ return rc;
+ }
+ if (self->m_eof) {
+ break;
+ }
+ else if ((c1 != '\n' && c1 != '\r') || (ch == c1)) {
+ /* save the character when EOL is a single character (WINDOWS) */
+ self->m_ch = c1;
+ self->m_hasCh = true;
+ break;
+ }
+ else {
+ ok = SpotIteratorBufferAdd(self, c1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* remove EOL */
+ if (ok) {
+ bool done = false;
+
+ while (self->m_inBuffer > 0 && !done) {
+ switch (self->m_buffer[self->m_inBuffer - 1]) {
+ case '\n': case '\r':
+ self->m_buffer[--self->m_inBuffer] = '\0';
+ break;
+ default:
+ done = true;
+ break;
+ }
+ }
+ }
+ else {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcTooLong);
+ plogerr(klogErr, rc,
+ "on line $(lineno) while reading file '$(path)': '$(line)...'",
+ PLOG_U64(lineno) ",path=%s,line=%s",
+ self->m_line, self->m_filename, self->m_buffer);
+ }
+
+ return rc;
+}
+
+/** Get next spot from the input file */
+static rc_t SpotIteratorReadSpotToRedact(struct SpotIterator* self)
+{
+ rc_t rc = 0;
+
+ assert(self);
+
+ while (rc == 0 && ! self->m_eof) {
+ rc = SpotIteratorReadLine(self);
+
+ /* skip empty lines */
+ if ((rc == 0) && (self->m_inBuffer > 0)) {
+ spotid_t spot = 0;
+
+ /* make sure the line contains digits only */
+ int i = 0;
+ for (i = 0; i < self->m_inBuffer; ++i) {
+ if (!isdigit(self->m_buffer[i])) {
+ rc = RC(rcExe, rcFile, rcReading, rcChar, rcUnexpected);
+ plogerr(klogErr, rc, "character '$(char)' on line $(lineno)"
+ " while reading file '$(path)': '$(line)'",
+ "char=%c," PLOG_U64(lineno) ",path=%s,line=%s",
+ self->m_buffer[i], self->m_line,
+ self->m_filename, self->m_buffer);
+ return rc;
+ }
+ }
+
+ sscanf(self->m_buffer, "%uld", &spot);
+
+ if (spot == 0) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ plogerr(klogErr, rc,
+ "bad spot id '0' on line $(lineno) "
+ "while reading file '$(path)': '$(line)'",
+ PLOG_U64(lineno) ",path=%s,line=%s",
+ self->m_line, self->m_filename, self->m_buffer);
+ }
+ else if (spot == self->m_spotToReduct) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ plogerr(klogErr, rc, "duplicated spot id '$(spot)' "
+ "on line $(lineno) while reading file '$(path)': '$(line)'",
+ PLOG_U32(spot) "," PLOG_U64(lineno) ",path=%s,line=%s",
+ spot, self->m_line, self->m_filename, self->m_buffer);
+ }
+ else if (spot < self->m_spotToReduct) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ plogerr(klogErr, rc, "File '$(path)' is unsorted. "
+ "$(id) < $(last). See line $(lineno): '$(line)'",
+ "path=%s," PLOG_U32(id) "," PLOG_U32(last) ","
+ PLOG_U64(lineno) ",line=%s",
+ self->m_filename, spot, self->m_spotToReduct,
+ self->m_line, self->m_buffer);
+ }
+ else if (spot > self->m_maxSpotId) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ plogerr(klogErr, rc, "spotId $(spot) on line $(lineno) "
+ "of file '$(path)' is bigger that the max spotId $(max): "
+ "'$(line)'",
+ PLOG_U32(spot) "," PLOG_U64(lineno) ",path=%s,"
+ PLOG_U32(max) ",line=%s",
+ spot, self->m_line, self->m_filename, self->m_maxSpotId,
+ self->m_buffer);
+ }
+ else {
+ self->m_spotToReduct = spot;
+ self->m_inBuffer = 0;
+ }
+ break;
+ }
+ }
+
+ return rc;
+}
+
+static rc_t SpotIteratorInit(struct SpotIterator* self,
+ const SRATable* tbl, const char* redactFileName)
+{
+ rc_t rc = 0;
+
+ assert(self && tbl && redactFileName);
+
+ memset(self, 0, sizeof *self);
+
+ self->m_crnSpotId = 1;
+
+ rc = SRATableMaxSpotId(tbl, &self->m_maxSpotId);
+ if (rc != 0) {
+ logerr(klogErr, rc, "while calling SRATableMaxSpotId");
+ }
+ else {
+ plogmsg(klogInfo,
+ "MaxSpotId = $(spot)", PLOG_U32(spot), self->m_maxSpotId);
+ }
+
+ if (rc == 0) {
+ rc = SpotIteratorInitDirectory();
+ }
+
+ if (rc == 0) {
+ self->m_filename = redactFileName;
+ plogmsg(klogInfo, "Opening '$(path)'", "path=%s", self->m_filename);
+ rc = KDirectoryOpenFileRead(
+ __SpotIteratorDirectory, &self->m_file, "%s", self->m_filename);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "while opening file '$(path)'", "path=%s", self->m_filename);
+ }
+ }
+
+ if (rc == 0) {
+ rc = SpotIteratorReadSpotToRedact(self);
+ }
+
+ return rc;
+}
+
+/** Get next spot id, check whether it should be redacted.
+Returns false if maxSpotId reached */
+static bool SpotIteratorNext(struct SpotIterator* self, rc_t* rc,
+ spotid_t* spot, bool* toRedact)
+{
+ bool hasNext = false;
+
+ assert(self && rc && spot && toRedact);
+
+ *rc = 0;
+ *toRedact = false;
+
+ if (self->m_crnSpotId <= self->m_maxSpotId) {
+ hasNext = true;
+ *spot = self->m_crnSpotId++;
+ }
+
+ if (*spot == self->m_spotToReduct) {
+ *toRedact = true;
+ *rc = SpotIteratorReadSpotToRedact(self);
+ if (*rc != 0) {
+ hasNext = false;
+ }
+ }
+
+ return hasNext;
+}
+
+static rc_t SpotIteratorDestroy(struct SpotIterator* self)
+{
+ assert(self);
+ KDirectoryRelease(__SpotIteratorDirectory);
+ __SpotIteratorDirectory = NULL;
+ return KFileRelease(self->m_file);
+}
+
+/** The main data structure */
+
+static rc_t SDataInit(struct SData* self,
+ const char* tablePath, const SRAMgr* rdMgr, rc_t rc)
+{
+ SRAMgr* wrMgr = NULL;
+
+ assert(self);
+ memset(self, 0, sizeof *self);
+ if (rc)
+ { return rc; }
+
+ rc = SRAMgrMakeUpdate(&wrMgr, NULL);
+ if (rc != 0) {
+ logerr(klogErr, rc, "while calling SRAMgrMakeUpdate");
+ }
+ else {
+ plogmsg(klogInfo,
+ "Opening Table $(path) for read", "path=%s", tablePath);
+ rc = SRAMgrOpenTableRead(rdMgr, &self->_rdTbl, "%s", tablePath);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "cannot open table $(path) for read", "path=%s", tablePath);
+ }
+ }
+
+ if (rc == 0) {
+ plogmsg(klogInfo,
+ "Opening Table $(path) for update", "path=%s", tablePath);
+ rc = SRAMgrOpenTableUpdate(wrMgr, &self->_wrTbl, "%s", tablePath);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "cannot open table $(path) for update", "path=%s", tablePath);
+ }
+ }
+
+ SRAMgrRelease(wrMgr);
+
+ return rc;
+}
+
+static rc_t SDataPrepareCols(struct SData* self,
+ const char* rdFilterName, const char* readFilterName)
+{
+ rc_t rc = 0;
+
+ assert(self);
+
+ if (rc == 0) {
+ const char name[] = "NREADS";
+ rc = SRATableOpenColumnRead(self->_rdTbl,
+ &self->_NReadsCol, name, vdb_uint8_t);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ rc = 0;
+ }
+ else {
+ plogerr(klogErr, rc,
+ "while calling SRATableOpenColumnRead($name)", "name=%s",
+ name);
+ }
+ }
+ }
+
+ /* It the physical column exists, open it */
+ if (rc == 0) {
+ rc = SRATableOpenColumnRead(self->_rdTbl,
+ &self->_origFilterCol, rdFilterName, sra_read_filter_t);
+ if (rc == 0) {
+ plogmsg(klogDebug1,
+ "Found '$(name)' column", "name=%s", rdFilterName);
+ self->_existedRD_FILTER = true;
+ self->_origFilterColName = rdFilterName;
+ }
+ else if (GetRCState(rc) == rcNotFound) {
+ plogmsg(klogDebug1,
+ "Column '$(name)' does not exist", "name=%s", rdFilterName);
+ rc = 0;
+ }
+ else {
+ plogerr(klogErr, rc, "while calling SRATableOpenColumnRead($name)",
+ "name=%s", rdFilterName);
+ }
+ }
+
+ /* Otherwise open the virtual one */
+ if (rc == 0 && ! self->_existedRD_FILTER) {
+ rc = SRATableOpenColumnRead(self->_rdTbl,
+ &self->_origFilterCol, readFilterName, sra_read_filter_t);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "while calling SRATableOpenColumnRead($name)", "name=%s",
+ readFilterName);
+ }
+ }
+
+ return rc;
+}
+
+/** Keeps track when to cut the blob */
+struct SBlob {
+ bool m_new;
+ spotid_t m_maxSpotId;
+ const struct SData* m_data;
+};
+
+static rc_t SBlobInit(struct SBlob* self,
+ const struct SData* data, const struct SpotIterator* it)
+{
+ rc_t rc = 0;
+ bool newColumn = true;
+
+ assert(self && data && it);
+
+ memset(self, 0, sizeof *self);
+
+ if (data->_existedRD_FILTER) {
+ /* blob range will be read from the existing blob */
+ newColumn = false;
+ }
+
+ self->m_new = newColumn;
+ self->m_maxSpotId = it->m_maxSpotId;
+ self->m_data = data;
+
+ return rc;
+}
+
+static rc_t SBlobGetRange(const struct SBlob* self,
+ spotid_t id, spotid_t* last)
+{
+ rc_t rc = 0;
+ spotid_t first = 0;
+
+ assert(self && last);
+
+ if (self->m_new) {
+ first = (id & ~0xFFFF) + 1;
+ *last = first + 0xFFFF;
+ if (*last > self->m_maxSpotId) {
+ *last = self->m_maxSpotId;
+ }
+ plogmsg(klogDebug1, "New blob range for spot $(id) is "
+ "$(first) - $(last) ($(xfirst) - $(xlast))",
+ PLOG_U32(id) "," PLOG_U32(first) "," PLOG_U32(last) ","
+ PLOG_X32(xfirst) "," PLOG_X32(xlast),
+ id, first, *last, first, *last);
+ }
+ else {
+ assert(self->m_data && self->m_data->_origFilterCol);
+ rc = SRAColumnGetRange(self->m_data->_origFilterCol, id, &first, last);
+ if (rc != 0) {
+ plogerr(klogErr, rc, "Cannot SRAColumnGetRange $(id)",
+ PLOG_U32(id), id);
+ }
+ else {
+ plogmsg(klogDebug1, "Existing blob range for spot $(id) is "
+ "$(first) - $(last) ($(xfirst) - $(xlast))",
+ PLOG_U32(id) "," PLOG_U32(first) "," PLOG_U32(last) ","
+ PLOG_X32(xfirst) "," PLOG_X32(xlast),
+ id, first, *last, first, *last);
+ }
+ }
+
+ return rc;
+}
+
+static rc_t SDataUpdate(struct SData* self,
+ const char* newColName, const char* redactFileName,
+ spotid_t* redactedSpots, spotid_t* all)
+{
+ struct SBlob blob;
+ uint8_t filter[32];
+ rc_t rc = 0, rc2 = 0;
+ uint32_t colIdx = 0;
+ spotid_t spot = 0, last = 0;
+ bool toRedact = false;
+ struct SpotIterator it;
+
+ assert(self && redactedSpots && all);
+
+ memset(filter, SRA_READ_FILTER_REDACTED, sizeof filter);
+
+ if ((rc = SpotIteratorInit(&it, self->_rdTbl, redactFileName))
+ == 0)
+ {
+ rc = SRATableOpenColumnWrite
+ (self->_wrTbl, &colIdx, NULL, newColName, sra_read_filter_t);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "cannot open Column $(path) for Write", "path=%s", newColName);
+ return rc;
+ }
+ }
+ else {
+ return rc;
+ }
+
+ rc = SBlobInit(&blob, self, &it);
+ if (rc != 0) {
+ return rc;
+ }
+
+ while (rc == 0 && SpotIteratorNext(&it, &rc, &spot, &toRedact)) {
+ bitsz_t offset = 0, size = 0;
+ const void *base = NULL;
+ uint8_t nReads = 0;
+
+ if (rc != 0) {
+ break;
+ }
+
+ plogmsg(klogDebug2, "Spot $(spot): $(action)",
+ PLOG_U32(spot) ",action=%s",
+ spot, toRedact ? "redact" : "original");
+
+ /* GET NEXT BLOB RANGE */
+ if (spot == 1 || spot > last) {
+ rc = SBlobGetRange(&blob, spot, &last);
+ if (rc != 0) {
+ break;
+ }
+ }
+
+ assert(spot <= last);
+
+ /* GET NREADS */
+ if ((rc = SRAColumnRead
+ (self->_NReadsCol, spot, &base, &offset, &size)) != 0)
+ {
+ logerr(klogErr, rc, "cannot SRAColumnRead");
+ break;
+ }
+ else if (offset != 0 || size != sizeof nReads * 8) {
+ rc = RC(rcExe, rcColumn, rcReading, rcData, rcInvalid);
+ plogerr(klogErr, rc,
+ "Bad SRAColumnRead(\"NREADS\", $(spot)) result",
+ PLOG_U32(spot), spot);
+ }
+ else {
+ nReads = *((uint8_t*) base);
+ if (spot == 1) {
+ if (nReads == 1) {
+ plogmsg(klogInfo, "The first spot has $(nreads) read",
+ "nreads=%d", nReads);
+ }
+ else {
+ plogmsg(klogInfo, "The first spot has $(nreads) reads",
+ "nreads=%d", nReads);
+ }
+ }
+ }
+
+ /* GET READ_FILTER */
+ if (toRedact) {
+ base = filter;
+ ++(*redactedSpots);
+ }
+ else {
+ if ((rc = SRAColumnRead(self->_origFilterCol,
+ spot, &base, &offset, &size)) != 0)
+ {
+ plogerr(klogErr, rc,
+ "while calling SRAColumnRead($(name))", "name=%s",
+ "READ_FILTER");
+ break;
+ }
+ else if (offset != 0
+ || size != sizeof (uint8_t) * 8 * nReads)
+ {
+ rc = RC(rcExe, rcColumn, rcReading, rcData, rcInvalid);
+ plogerr(klogErr, rc, "Bad SRAColumnRead($(spot)) result",
+ PLOG_U32(spot), spot);
+ }
+ }
+
+ if ((rc = SRATableOpenSpot(self->_wrTbl, spot)) != 0) {
+ plogerr(klogErr, rc, "cannot open Spot $(id)", PLOG_U32(id), spot);
+ break;
+ }
+ if ((rc = SRATableWriteIdxColumn(self->_wrTbl,
+ colIdx, base, 0, sizeof (uint8_t) * 8 * nReads)) != 0)
+ {
+ logerr(klogErr, rc, "cannot SRATableWriteIdxColumn");
+ break;
+ }
+ if ((rc = SRATableCloseSpot(self->_wrTbl)) != 0) {
+ logerr(klogErr, rc, "cannot SRATableCloseSpot");
+ break;
+ }
+
+ /* CUT THE BLOB */
+ if (spot == last) {
+ rc = SRATableCloseCursor(self->_wrTbl);
+ if (rc != 0) {
+ plogerr(klogErr, rc, "cannot SRATableCloseCursor $(id)",
+ PLOG_U32(id), spot);
+ break;
+ }
+ }
+ }
+
+ rc2 = SpotIteratorDestroy(&it);
+ if (rc == 0)
+ { rc = rc2; }
+
+ *all = spot;
+
+ return rc;
+}
+
+static rc_t SDataDestroy(struct SData* self, bool commit) {
+ rc_t rc = 0, rc2 = 0;
+ assert(self);
+
+ rc2 = SRAColumnRelease(self->_origFilterCol);
+ self->_origFilterCol = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+
+ rc2 = SRAColumnRelease(self->_NReadsCol);
+ self->_NReadsCol = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+
+ rc2 = SRATableRelease(self->_rdTbl);
+ self->_rdTbl = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+
+ if (commit && rc == 0) {
+ rc = SRATableCommit(self->_wrTbl);
+ }
+
+ rc2 = SRATableRelease(self->_wrTbl);
+ self->_wrTbl = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+
+ return rc;
+}
+
+/** Command line arguments */
+
+
+static bool __BadLogLevel = false;
+static const char *__dummy4NextLogLevel(void *data)
+{
+ __BadLogLevel = true;
+ return "info";
+}
+
+static KLogLevel __defaultLogLevel;
+
+static void Usage(const char *argv0, const char *msg, ...)
+{
+ if (msg) {
+ va_list args;
+ va_start(args, msg);
+ vfprintf(stderr, msg, args);
+ fprintf(stderr, "\n\n");
+ va_end(args);
+ }
+
+ fprintf(stderr, "Usage:\n"
+ "%s -D <table> -F <file> [ -l <level> ]\n"
+ "\t-D --table-path\tSRA Table directory path\n"
+ "\t-F --file \tFile containing SpotId-s to redact\n"
+ "\t-f --force \tForce overwriting of already redacted table\n"
+ "\t-l --level \t"
+ "Log level: 0-13 or fatal|sys|int|err|warn|info|debug[1-10].",
+ argv0);
+
+ {
+ char logLevel[64];
+ rc_t rc = KLogLevelExplain
+ (__defaultLogLevel, logLevel, sizeof logLevel, NULL);
+ if (rc == 0) {
+ fprintf(stderr, " Default: %s", logLevel);
+ }
+ }
+
+ fprintf(stderr, "\n");
+}
+
+/** Get command line key with argument */
+static bool GetArg(int* argI, int argc, char* argv[],
+ const char* shortArg, const char* longArg,
+ const char** out, const char* error, rc_t* errorRc)
+{
+ bool found = false;
+
+ assert(argI && (*argI < argc) && longArg && argv && out && errorRc);
+
+ if (strcmp(argv[*argI], longArg) == 0) {
+ found = true;
+ }
+ else if (shortArg && (strcmp(argv[*argI], shortArg) == 0)) {
+ found = true;
+ }
+ if (!found) {
+ return false;
+ }
+
+ if ((*argI + 1) >= argc) {
+ Usage(argv[0], error);
+ *errorRc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ }
+ else {
+ *out = argv[++(*argI)];
+ }
+
+ return true;
+}
+
+#define OPTION_TABLE "table-path"
+#define ALIAS_TABLE "D"
+
+#define OPTION_FILE "file"
+#define ALIAS_FILE "F"
+
+#define OPTION_SCHEMA "schema"
+#define ALIAS_SCHEMA "S"
+
+#define OPTION_FORCE "force"
+#define ALIAS_FORCE "F"
+
+OptDef Options[] =
+{
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, true },
+ { OPTION_FILE, ALIAS_FILE, NULL, file_usage, 1, true, true },
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 1, true, true },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false }
+};
+
+
+static
+rc_t open_and_run (Context * context)
+{
+ KDirectory * pwd;
+ rc_t rc;
+
+ rc = KDirectoryNativeDir (&pwd);
+ if (rc)
+ LOGERR (klogFatal, rc, "Unable to open file system");
+ else
+ {
+ if (PathExists (pwd, kptDile, context->file_path))
+ {
+ if (PathExists (pwd, kptDile, context->file_path))
+ {
+ VDBManager * vmgr;
+
+ rc = VDBManagerMakeUpdate (&vmgr, pwd);
+ if (rc)
+ LOGERR (kptInt, "Failed to create a database manager");
+ else
+ {
+ VSchema * vschema;
+
+ rc = VDBManagerMakeSchema (vmgr, &vschema);
+ if (rc)
+ LOGERR (kptInt, "Failed to create schema");
+ else
+ {
+ rc = VSchemaParseFile (vschema, args->schema);
+ if (rc)
+ PLOGERR (klogFatal, (klogFatal,
+ "Unable to parse schema file ($S)",
+ "S=%s", args->schema));
+ else
+ {
+ VTable * vtable;
+ rc = VDBManagerOpenTableUpdate (vmgr, &vtable, SCHEMA, args->table);
+ if (rc)
+ PLOGERR (klogFatal, (klogFatal, "Unable to open table ($T)",
+ "T=%s", args->table));
+ else
+ {
+
+
+ VTableRelease (vtable);
+ }
+ }
+ VSchemaRelease (vschema);
+ }
+ VDBManagerRelease (vmgr);
+ }
+ }
+ else
+ PLOGERR (kptFatal, (kptFatal, "table paramaeter is not a table directory ($F)",
+ "F=%s", args->table));
+ }
+ else
+ PLOGERR (kptFatal, (kptFatal, "file paramaeter is not a file ($F)",
+ "F=%s", context->file_path));
+
+
+
+ KPathType pt;
+
+ pt = KDirectoryPathType (arg->file);
+ if ((pt & ~kptAlias) != kptFile)
+ else
+ {
+ }
+ KDirectoryRelease (pwd);
+ }
+ return rc;
+}
+
+ rc_t rc = 0;
+
+ spotid_t all = 0, redacted = 0;
+ bool locked = false;
+
+ SRAMgr* rdMgr = NULL;
+ KTable* ktbl = NULL;
+
+ struct SData data;
+
+ const char readFilterName [] = "READ_FILTER";
+ const char rdFilterName [] = "RD_FILTER";
+ const char readFilterNameNew[] = "TMP_READ_FILTER";
+ const char rdFilterNameNew [] = "TMP_RD_FILTER";
+ const char colNameSave [] = "RD_FILTER_BAK";
+
+ const char* redactFileName = NULL;
+ const char* tablePath = NULL;
+
+ struct SArgs args;
+
+ /* PARSE COMMAND LINE, MAKE SURE INPUTS EXIST */
+ rc = SArgsMake(&args, argc, argv);
+ if (rc)
+ { return rc; }
+
+ tablePath = args._table;
+ redactFileName = args.file;
+
+ /* WAS THIS RUN ALREADY REDUCTED ? */
+ if (! args._force
+ && SpotIteratorFileExists("%s/col/%s", tablePath, colNameSave))
+ {
+ rc = RC(rcExe, rcTable, rcOpening, rcColumn, rcExists);
+ plogerr(klogErr, rc,
+ "'$(path)' was redacted already", "path=%s", tablePath);
+ }
+
+ umask(2);
+
+ /* OPEN THE MANAGER */
+ if (rc == 0) {
+ rc = SRAMgrMakeUpdate(&rdMgr, NULL);
+ if (rc != 0) {
+ logerr(klogErr, rc, "while calling SRAMgrMakeUpdate(rd)");
+ }
+ }
+
+ /* UNLOCK THE RUN */
+ if (rc == 0) {
+ rc = SRAMgrUnlock(rdMgr, "%s", tablePath);
+ if (rc) {
+ if (GetRCState(rc) == rcUnlocked) {
+ plogmsg(klogInfo,
+ "'$(path)' was not locked", "path=%s", tablePath);
+ rc = 0;
+ }
+ else {
+ plogerr(klogErr, rc, "while calling SRAMgrUnlock($(path))",
+ "path=%s", tablePath);
+ }
+ }
+ else {
+ plogmsg(klogInfo, "'$(path)' was unlocked", "path=%s", tablePath);
+ locked = true;
+ }
+ }
+
+ /* INITIALIZE */
+ rc = SDataInit(&data, tablePath, rdMgr, rc);
+
+ if (rc == 0) {
+ logmsg(klogDebug2, "Calling SRATableGetKTableUpdate");
+ rc = SRATableGetKTableUpdate(data._wrTbl, &ktbl);
+ if (rc != 0) {
+ logerr(klogErr, rc, "while calling SRATableGetKTableUpdate");
+ }
+ }
+
+ /* OPEN INPUT COLUMNS */
+ if (rc == 0) {
+ rc = SDataPrepareCols(&data, rdFilterName, readFilterName);
+ }
+
+ if (rc == 0) {
+ /* just for fun, tell ktable to drop this column */
+ KTableDropColumn(ktbl, "%s", rdFilterNameNew);
+ KTableDropColumn(ktbl, "%s", colNameSave);
+
+ /* THE MAIN WORKING FUNCTION */
+ rc = SDataUpdate
+ (&data, readFilterNameNew, redactFileName, &redacted, &all);
+ }
+
+ /* CLEANUP */
+
+ {
+ rc_t rc2 = SDataDestroy(&data, rc == 0);
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ /* REMAME THE PHYSICAL COLUMNS */
+ if (rc == 0) {
+ if (data._existedRD_FILTER) {
+ plogmsg(klogDebug1, "Renaming '$(from)' to '$(to)'",
+ "from=%s,to=%s", rdFilterName, colNameSave);
+ rc = KTableRenameColumn(ktbl, rdFilterName, colNameSave);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "while renaming column from '$(from)' to '$(to)'",
+ "from=%s,to=%s", rdFilterName, colNameSave);
+ }
+ }
+ if (rc == 0) {
+ plogmsg(klogDebug1, "Renaming '$(from)' to '$(to)'",
+ "from=%s,to=%s",
+ rdFilterNameNew, rdFilterName);
+ rc = KTableRenameColumn(ktbl, rdFilterNameNew, rdFilterName);
+ if (rc != 0) {
+ plogerr(klogErr, rc,
+ "while renaming column from '$(from)' to '$(to)'",
+ "from=%s,to=%s", rdFilterNameNew, rdFilterName);
+ }
+ }
+ }
+ else if (ktbl) {
+ rc_t rc2 = KTableDropColumn(ktbl, "%s", rdFilterNameNew);
+ if (rc2 != 0) {
+ plogerr(klogErr, rc2, "while dropping column '$(name)'",
+ "name=%s", rdFilterNameNew);
+ }
+ }
+
+ {
+ rc_t rc2 = KTableRelease(ktbl);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ if (locked) {
+ rc_t rc2 = 0;
+ plogmsg(klogInfo, "Relocking '$(path)'", "path=%s", tablePath);
+ rc2 = SRAMgrLock(rdMgr, "%s", tablePath);
+ if (rc2 != 0) {
+ plogerr(klogErr, rc2, "while calling SRAMgrLock($(path))",
+ "path=%s", tablePath);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+ }
+
+ {
+ rc_t rc2 = SRAMgrRelease(rdMgr);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ if (rc == 0) {
+ plogmsg(klogInfo, "'$(path)': redacted $(redacted) spots out of $(all)",
+ "path=%s," PLOG_U32(redacted) "," PLOG_U32(all),
+ tablePath, redacted, all);
+ }
+ else {
+ plogmsg(klogInfo, "Failed to redact '$(path)'", "path=%s", tablePath);
+ }
+
+ return rc;
+}
+
+
+static
+rc_t run (Context * context)
+{
+ rc_t rc;
+
+ return rc;
+}
+
+
+static
+rc_t open_and_run (Context * context)
+{
+ KDirectory * pwd;
+ rc_t rc;
+
+ /* first get a toe hold in the file system */
+ rc = KDirectoryNativeDir (&context->pwd);
+ if (rc)
+ LOGERR (klogFatal, rc, "Unable to open file system");
+ else
+ {
+ /* try to open the file of redactions */
+ rc = KDirectoryOpenFileRead (context->pwd, &context->file, "%s", conext->file_path);
+ if (rc)
+ PLOGERR (kptFatal, (kptFatal, rc, "Failed to open redactions file ($(F))",
+ context->file_path));
+ else
+ {
+ /* okay we've got the non-data base stuff up so get
+ * a toe hold in the VDatabase */
+ rc = VDBManagerMakeUpdate (&context->mgr, context->pwd);
+ if (rc)
+ LOGERR (kptInt, "Failed to create a database manager");
+ else
+ {
+ /* build a schema object */
+ rc = VDBManagerMakeSchema (context->mgr, &ontext->schema);
+ if (rc)
+ LOGERR (kptInt, "Failed to create schema");
+ else
+ {
+ /* fill it with the specified schema */
+ rc = VSchemaParseFile (context->schema, "%s", context->schema_path);
+ if (rc)
+ PLOGERR (klogFatal, (klogFatal,
+ "Unable to parse schema file ($S)",
+ "S=%s", args->schema));
+ else
+ {
+ /* now open the table with that schema */
+ rc = VDBManagerOpenTableUpdate (context->mgr, &context->table,
+ context->schema, "%s", context->table_path);
+ if (rc)
+ PLOGERR (klogFatal, (klogFatal, "Unable to open table ($T)",
+ "T=%s", args->table));
+ else
+ {
+ /* most stuff is open */
+ rc = run (context);
+
+ VTableRelease (context->table);
+ }
+ }
+ VSchemaRelease (context->schema);
+ }
+ VDBManagerRelease (context->mgr);
+ }
+ KFileRelease (context->file);
+ }
+ }
+ return rc;
+}
+
+rc_t KMain(int argc, char* argv[])
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (Options[0]));
+ if (rc)
+ LOGERR (klogFatal, rc, "Failure reading command line");
+ else do
+ {
+ Context context;
+ uint32_t pcount;
+
+ /* force option: Replace extisting redact column */
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure parsing force name");
+ break;
+ }
+ if ((context.force = (pcount > 0)) != false)
+ STSMSG (1, ("Using force option"));
+
+ /* table path parameter */
+ rc = ArgsOptionCount (args, OPTION_TABLE, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure parsing table name");
+ break;
+ }
+ if (pcount < 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR (klogFatal, rc, "Missing table parameter");
+ break;
+ }
+ if (pcount > 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR (klogFatal, rc, "Too many table parameters");
+ break;
+ }
+ rc = ArgsOptionValue (args, OPTION_TABLE, 0, (const void **)&sargs.table);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure retrieving table name");
+ break;
+ }
+
+ /* file path parameter */
+ rc = ArgsOptionCount (args, OPTION_FILE, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure parsing file name");
+ break;
+ }
+ if (pcount < 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR (klogFatal, rc, "Missing file parameter");
+ break;
+ }
+ if (pcount > 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR (klogFatal, rc, "Too many file parameters");
+ break;
+ }
+ rc = ArgsOptionValue (args, OPTION_FILE, 0, (const void **)&context.file_path);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure retrieving file name");
+ break;
+ }
+
+
+ /* schema path parameter */
+ rc = ArgsOptionCount (args, OPTION_SCHEMA, &pcount);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure parsing schema name");
+ break;
+ }
+ if (pcount < 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR (klogFatal, rc, "Missing schema parameter");
+ break;
+ }
+ if (pcount > 1)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR (klogFatal, rc, "Too many schema parameters");
+ break;
+ }
+ rc = ArgsOptionValue (args, OPTION_SCHEMA, 0, (const void **)&context.schema_path);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failure retrieving schema name");
+ break;
+ }
+
+ /* now that we have parameter values: open the file and table
+ * then run */
+ rc = open_and_run (&context);
+
+ KArgsRelease (args);
+
+ } while (0);
+
+ if (rc)
+ LOGERR (klogErr, rc, "Exiting with an error");
+ else
+ STSMSG (1, ("Exiting %R\n", rc));
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/rd-filter-redact/read-filter-redact.c b/tools/rd-filter-redact/read-filter-redact.c
new file mode 100644
index 0000000..c82c9c2
--- /dev/null
+++ b/tools/rd-filter-redact/read-filter-redact.c
@@ -0,0 +1,861 @@
+/*******************************************************************************
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ */
+
+#include <kapp/main.h>
+
+#include <sra/wsradb.h> /* spotid_t */
+#include <sra/sradb-priv.h> /* SRASchemaMake */
+
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/table.h> /* VDBTable */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/schema.h> /* VSchemaRelease */
+
+#include <kdb/manager.h> /* KDBPathType */
+
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFile */
+
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/status.h> /* STSMSG */
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h> /* RC */
+#include <os-native.h>
+
+#include <assert.h>
+#include <ctype.h> /* isblank */
+#include <stdio.h> /* sscanf */
+#include <stdlib.h> /* exit */
+#include <string.h> /* memset */
+
+#define DISP_RC(rc,msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+
+static KDirectory* __SpotIteratorDirectory = NULL;
+
+typedef struct CmdLine {
+ const char* table;
+ const char* file;
+} CmdLine;
+typedef struct SpotIterator {
+ spotid_t crnSpotId;
+ spotid_t spotToReduct;
+
+ const char* filename;
+ const KFile* file;
+
+ uint64_t maxSpotId;
+
+ char buffer[256];
+ size_t inBuffer; /* characters in buffer */
+
+ size_t filePos;
+ bool eof;
+ size_t line;
+
+ bool hasCh;
+ char ch;
+} SpotIterator;
+typedef struct Db {
+ const char* table;
+
+ VDBManager* mgr;
+ VTable *tbl;
+
+ const VCursor *rCursor;
+ uint32_t rFilterIdx;
+
+ VCursor *wCursor;
+ uint32_t wIdx;
+
+ bool locked;
+
+ spotid_t nSpots;
+ spotid_t redactedSpots;
+} Db;
+/** Init the static directory object */
+static rc_t SpotIteratorInitDirectory(void) {
+ if (__SpotIteratorDirectory) {
+ return 0;
+ }
+ else {
+ rc_t rc = KDirectoryNativeDir(&__SpotIteratorDirectory);
+ DISP_RC(rc, "while calling KDirectoryNativeDir");
+ return rc;
+ }
+}
+
+/** Check file existance */
+static bool SpotIteratorFileExists(const char* path, ...) {
+ bool found = false;
+
+ if (SpotIteratorInitDirectory() == 0) {
+ va_list args;
+ va_start(args, path);
+ {
+ uint32_t type
+ = KDirectoryVPathType(__SpotIteratorDirectory, path, args);
+ found = (type != kptNotFound);
+ va_end(args);
+ }
+ }
+
+ return found;
+}
+
+static bool SpotIteratorBufferAdd(SpotIterator* self, char ch)
+{
+ assert(self);
+
+ if (self->inBuffer >= (sizeof self->buffer - 1))
+ { return false; }
+
+ self->buffer[self->inBuffer++] = ch;
+ self->buffer[self->inBuffer] = '\0';
+
+ return true;
+}
+
+/** Read a character from input file */
+static rc_t SpotIteratorFileReadCharWithEof(SpotIterator* self,
+ char* buffer)
+{
+ rc_t rc = 0;
+ size_t num_read = 0;
+
+ assert(self);
+
+ /* get back the saved character */
+ if (self->hasCh) {
+ buffer[0] = self->ch;
+ self->hasCh = false;
+ }
+ else {
+ rc = KFileRead(self->file, self->filePos, buffer, 1, &num_read);
+ if (rc == 0) {
+ if (num_read == 0) {
+ self->eof = true;
+ }
+ else { self->filePos += num_read; }
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc,
+ "on line $(lineno) while reading file '$(path)'",
+ PLOG_U64(lineno) ",path=%s", self->line, self->filename));
+ }
+ }
+
+ return rc;
+}
+
+/** Read a line from input file */
+static rc_t SpotIteratorReadLine(SpotIterator* self)
+{
+ rc_t rc = 0;
+ bool overflow = false; /* input buffer overflow */
+
+ /* to skip leading/traling spaces */
+ enum ELane {
+ eBefore,
+ eIn,
+ eAfter
+ } state = eBefore;
+
+ if (self->eof) {
+ return rc;
+ }
+
+ assert(self);
+
+ ++self->line;
+ self->inBuffer = 0;
+
+ while (!overflow && !self->eof) /* do until in-buffer overflow or EOF*/{
+ char ch = 0;
+ /* get next characted */
+ if ((rc = SpotIteratorFileReadCharWithEof(self, &ch)) != 0) {
+ return rc;
+ }
+
+ if (!self->eof) {
+ /* treat leading/trailing spaces */
+ switch (state) {
+ /* skip leading spaces */
+ case eBefore:
+ if (isblank(ch)) {
+ continue;
+ }
+ else {
+ state = eIn;
+ }
+ break;
+ case eIn:
+ if (isblank(ch)) {
+ state = eAfter;
+ continue;
+ }
+ break;
+ /* skip trailing spaces */
+ case eAfter:
+ if (isblank(ch)) {
+ continue;
+ }
+ else if (ch != '\n' && ch != '\r') {
+ rc = RC(rcExe, rcFile, rcReading, rcChar, rcUnexpected);
+ PLOGERR(klogErr, (klogErr, rc, "bad symbol '$(char)' "
+ "on line $(lineno) in file '$(path)': '$(line)...'",
+ "char=%c," PLOG_U64(lineno) ",path=%s,line=%s",
+ ch, self->line, self->filename, self->buffer))
+ ;
+ return rc;
+ }
+ break;
+ }
+
+ /* add next non-blank characted */
+ overflow = !SpotIteratorBufferAdd(self, ch);
+ if (!overflow) {
+ /* all combinations as "\r", "\n", "\r\n", "\n\r" are considered as EOL */
+ if (ch == '\n' || ch == '\r') {
+ char c1 = 0;
+ if ((rc = SpotIteratorFileReadCharWithEof(self, &c1)) != 0)
+ {
+ return rc;
+ }
+ if (self->eof) {
+ break;
+ }
+ else if ((c1 != '\n' && c1 != '\r') || (ch == c1)) {
+ /* save the character when EOL is a single character (WINDOWS):
+ will be get back in SpotIteratorFileReadCharWithEof */
+ self->ch = c1;
+ self->hasCh = true;
+ break;
+ }
+ else {
+ overflow = !SpotIteratorBufferAdd(self, c1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* remove EOL */
+ if (!overflow) {
+ bool done = false;
+
+ while (self->inBuffer > 0 && !done) {
+ switch (self->buffer[self->inBuffer - 1]) {
+ case '\n': case '\r':
+ self->buffer[--self->inBuffer] = '\0';
+ break;
+ default:
+ done = true;
+ break;
+ }
+ }
+ }
+ else {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcTooLong);
+ PLOGERR(klogErr, (klogErr, rc,
+ "on line $(lineno) while reading file '$(path)': '$(line)...'",
+ PLOG_U64(lineno) ",path=%s,line=%s",
+ self->line, self->filename, self->buffer));
+ }
+
+ return rc;
+}
+
+/** Get next spot from input file */
+static rc_t SpotIteratorReadSpotToRedact(SpotIterator* self)
+{
+ rc_t rc = 0;
+
+ assert(self);
+
+ while (rc == 0 && ! self->eof) {
+ rc = SpotIteratorReadLine(self);
+
+ /* skip empty lines */
+ if ((rc == 0) && (self->inBuffer > 0)) {
+ spotid_t spot = 0;
+
+ /* make sure the line contains digits only */
+ int i = 0;
+ for (i = 0; i < self->inBuffer; ++i) {
+ if (!isdigit(self->buffer[i])) {
+ rc = RC(rcExe, rcFile, rcReading, rcChar, rcUnexpected);
+ PLOGERR(klogErr, (klogErr, rc,
+ "character '$(char)' on line $(lineno)"
+ " while reading file '$(path)': '$(line)'",
+ "char=%c," PLOG_U64(lineno) ",path=%s,line=%s",
+ self->buffer[i], self->line,
+ self->filename, self->buffer));
+ return rc;
+ }
+ }
+
+ sscanf(self->buffer, "%ld", &spot);
+
+ if (spot == 0) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc,
+ "bad spot id '0' on line $(lineno) "
+ "while reading file '$(path)': '$(line)'",
+ PLOG_U64(lineno) ",path=%s,line=%s",
+ self->line, self->filename, self->buffer));
+ }
+ else if (spot == self->spotToReduct) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "duplicated spot id '$(spot)' "
+ "on line $(lineno) while reading file '$(path)': '$(line)'",
+ PLOG_U32(spot) "," PLOG_U64(lineno) ",path=%s,line=%s",
+ spot, self->line, self->filename, self->buffer));
+ }
+ else if (spot < self->spotToReduct) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "File '$(path)' is unsorted. "
+ "$(id) < $(last). See line $(lineno): '$(line)'",
+ "path=%s," PLOG_U32(id) "," PLOG_U32(last) ","
+ PLOG_U64(lineno) ",line=%s",
+ self->filename, spot, self->spotToReduct,
+ self->line, self->buffer));
+ }
+ else if (spot > self->maxSpotId) {
+ rc = RC(rcExe, rcFile, rcReading, rcString, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc,
+ "spotId $(spot) on line $(lineno) "
+ "of file '$(path)' is bigger that the max spotId $(max): "
+ "'$(line)'",
+ PLOG_U32(spot) "," PLOG_U64(lineno) ",path=%s,"
+ PLOG_U32(max) ",line=%s",
+ spot, self->line, self->filename, self->maxSpotId,
+ self->buffer));
+ }
+ else {
+ self->spotToReduct = spot;
+ self->inBuffer = 0;
+ }
+ break;
+ }
+ }
+
+ return rc;
+}
+
+
+static rc_t SpotIteratorInit(const char* redactFileName,
+ const Db* db, SpotIterator* self)
+{
+ rc_t rc = 0;
+ int64_t first = 0;
+
+ assert(self && db);
+
+ memset(self, 0, sizeof *self);
+
+ self->crnSpotId = 1;
+
+ rc = VCursorIdRange
+ (db->rCursor, db->rFilterIdx, &first, &self->maxSpotId);
+ DISP_RC(rc, "while calling VCursorIdRange");
+
+ self->spotToReduct = first - 1;
+
+ if (rc == 0) {
+ rc = SpotIteratorInitDirectory();
+ }
+
+ if (rc == 0) {
+ self->filename = redactFileName;
+ rc = KDirectoryOpenFileRead
+ (__SpotIteratorDirectory, &self->file, "%s", self->filename);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while opening file '$(path)'", "path=%s", self->filename));
+ }
+ }
+
+ if (rc == 0) {
+ rc = SpotIteratorReadSpotToRedact(self);
+ }
+
+ return rc;
+}
+
+static rc_t SpotIteratorDestroy(SpotIterator* it)
+{
+ rc_t rc = 0;
+
+ assert(it);
+
+ rc = KFileRelease(it->file);
+
+ it->file = NULL;
+ it->inBuffer = 0;
+ it->hasCh = false;
+
+ {
+ rc_t rc2 = KDirectoryRelease(__SpotIteratorDirectory);
+ if (rc == 0)
+ { rc = rc2; }
+ __SpotIteratorDirectory = NULL;
+ }
+
+ return rc;
+}
+
+/** Get next spot id, check whether it should be redacted.
+Returns false if maxSpotId reached */
+static bool SpotIteratorNext(SpotIterator* self, rc_t* rc,
+ int64_t* spot, bool* toRedact)
+{
+ bool hasNext = false;
+
+ assert(self && rc && spot && toRedact);
+
+ *rc = 0;
+ *toRedact = false;
+
+ if (self->crnSpotId <= self->maxSpotId) {
+ hasNext = true;
+ *spot = self->crnSpotId++;
+ }
+
+ if (*spot == self->spotToReduct) {
+ *toRedact = true;
+ *rc = SpotIteratorReadSpotToRedact(self);
+ if (*rc != 0) {
+ hasNext = false;
+ }
+ }
+
+ return hasNext;
+}
+
+static rc_t DbInit(rc_t rc, const CmdLine* args, Db* db)
+{
+ const char name[] = "READ_FILTER";
+
+ assert(args && db);
+
+ memset(db, 0, sizeof *db);
+
+ if (rc != 0)
+ { return rc; }
+
+ db->table = args->table;
+
+ if (rc == 0) {
+ rc = VDBManagerMakeUpdate(&db->mgr, NULL);
+ DISP_RC(rc, "while calling VDBManagerMakeUpdate");
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerWritable(db->mgr, args->table);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcLocked)
+ {
+ rc = VDBManagerUnlock(db->mgr, args->table);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while calling VDBManagerUnlock('$(table)')",
+ "table=%s", args->table));
+ }
+ db->locked = true;
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while calling VDBManagerWritable('$(table)')",
+ "table=%s", args->table));
+ if (rc == RC(rcDB, rcPath, rcAccessing, rcPath, rcReadonly)) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "N.B. It is possible '$(table)' was not locked properly"
+ , "table=%s", args->table));
+ }
+ }
+ }
+ }
+
+ if (rc == 0) {
+ db->locked = true; /* has to be locked in production mode */
+ rc = VDBManagerOpenTableUpdate (db->mgr, &db->tbl, NULL, args->table);
+ if (rc != 0) {
+ VDatabase *vdb;
+ rc_t rc2 = VDBManagerOpenDBUpdate ( db->mgr, &vdb, NULL , args->table );
+ if( rc2 == 0) {
+ rc2 = VDatabaseOpenTableUpdate ( vdb, &db->tbl, "SEQUENCE" );
+ if (rc2 == 0 ) rc = 0;
+ VDatabaseRelease ( vdb );
+ }
+ }
+ if(rc != 0){
+ PLOGERR(klogErr, (klogErr, rc,
+ "while opening VTable '$(table)'", "table=%s", args->table));
+ }
+ }
+ if( rc == 0) {
+ rc = VTableCreateCursorRead(db->tbl, &db->rCursor);
+ DISP_RC(rc, "while creating read cursor");
+ if (rc == 0) {
+ rc = VCursorAddColumn(db->rCursor, &db->rFilterIdx, "%s", name);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while adding $(name) to read cursor", "name=%s", name));
+ }
+ }
+ if (rc == 0) {
+ rc = VCursorOpen(db->rCursor);
+ DISP_RC(rc, "while opening read cursor");
+ }
+ }
+ if (rc == 0) {
+ rc = VTableCreateCursorWrite(db->tbl, &db->wCursor, kcmInsert);
+ DISP_RC(rc, "while creating write cursor");
+ if (rc == 0) {
+ rc = VCursorAddColumn(db->wCursor, &db->wIdx, "%s", name);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while adding $(name) to write cursor", "name=%s", name));
+ }
+ }
+ if (rc == 0) {
+ rc = VCursorOpen(db->wCursor);
+ DISP_RC(rc, "while opening write cursor");
+ }
+ }
+
+ return rc;
+}
+
+static rc_t DbDestroy(Db* db)
+{
+ rc_t rc = 0;
+
+ assert(db);
+
+ {
+ rc_t rc2 = VCursorRelease(db->rCursor);
+ db->rCursor = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ {
+ rc_t rc2 = VCursorRelease(db->wCursor);
+ db->wCursor = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ {
+ rc_t rc2 = VTableRelease(db->tbl);
+ db->tbl = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ if (db->locked) {
+ rc_t rc2 = VDBManagerLock(db->mgr, "%s", db->table);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ {
+ rc_t rc2 = VDBManagerRelease(db->mgr);
+ db->mgr = NULL;
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ return rc;
+}
+
+static rc_t Work(Db* db, SpotIterator* it)
+{
+ rc_t rc = 0;
+ bool toRedact = false;
+ int64_t row_id = 0;
+ spotid_t nSpots = 0;
+ spotid_t redactedSpots = 0;
+
+ uint8_t filter[64];
+ memset(filter, SRA_READ_FILTER_REDACTED, sizeof filter);
+
+ assert(it);
+
+ while (rc == 0 && SpotIteratorNext(it, &rc, &row_id, &toRedact)) {
+ uint8_t nreads = 0;
+ char bufferIn[64];
+ void* buffer = NULL;
+ uint32_t row_len = 0;
+
+ rc = Quitting();
+
+ ++nSpots;
+
+ if (rc == 0) {
+ uint32_t elem_bits = 8;
+ rc = VCursorReadDirect(db->rCursor, row_id, db->rFilterIdx,
+ elem_bits, bufferIn, sizeof bufferIn, &row_len);
+ DISP_RC(rc, "while reading READ_FILTER");
+ nreads = row_len;
+ }
+ if (toRedact) {
+ buffer = filter;
+ ++redactedSpots;
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("Redacting spot %d: %d reads\n",row_id,nreads));
+ }
+ else {
+ buffer = bufferIn;
+ }
+ if (rc == 0) {
+ rc = VCursorOpenRow(db->wCursor);
+ DISP_RC(rc, "while opening row to write");
+ if (rc == 0) {
+ rc = VCursorWrite
+ (db->wCursor, db->wIdx, 8 * nreads, buffer, 0, 1);
+ DISP_RC(rc, "while writing READ_FILTER");
+ }
+ if (rc == 0) {
+ rc = VCursorCommitRow(db->wCursor);
+ DISP_RC(rc, "while committing row");
+ }
+ if (rc == 0) {
+ rc = VCursorCloseRow(db->wCursor);
+ DISP_RC(rc, "while closing row");
+ }
+ }
+ }
+
+ db->nSpots = nSpots;
+ db->redactedSpots = redactedSpots;
+
+ if (rc == 0) {
+ rc = VCursorCommit(db->wCursor);
+ DISP_RC(rc, "while committing cursor");
+ }
+
+ return rc;
+}
+
+static rc_t Run(const CmdLine* args)
+{
+ rc_t rc = 0;
+
+ Db db;
+ SpotIterator it;
+
+ assert(args);
+
+ if (!SpotIteratorFileExists(args->file)) {
+ rc = RC(rcExe, rcFile, rcOpening, rcFile, rcNotFound);
+ PLOGERR(klogErr,
+ (klogErr, rc, "Cannot find '$(path)'", "path=%s", args->file));
+ }
+ else if (!SpotIteratorFileExists(args->table)) {
+ rc = RC(rcExe, rcTable, rcOpening, rcTable, rcNotFound);
+ PLOGERR(klogErr,
+ (klogErr, rc, "Cannot find '$(path)'", "path=%s", args->table));
+ }
+
+ {
+ rc_t rc2 = DbInit(rc, args, &db);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ if (rc == 0) {
+ rc = SpotIteratorInit(args->file, &db, &it);
+ }
+
+ if (rc == 0) {
+ rc = Work(&db, &it);
+ }
+
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo,
+ "Success: redacted $(redacted) spots out of $(all)",
+ "redacted=%d,all=%d", db.redactedSpots, db.nSpots));
+ }
+
+ {
+ rc_t rc2 = SpotIteratorDestroy(&it);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ {
+ rc_t rc2 = DbDestroy(&db);
+ if (rc == 0)
+ { rc = rc2; }
+ }
+
+ return rc;
+}
+
+#define OPTION_FILE "file"
+#define ALIAS_FILE "F"
+
+static const char* file_usage []
+ = { "File containing SpotId-s to redact" , NULL };
+
+OptDef Options[] = {
+ { OPTION_FILE , ALIAS_FILE , NULL, file_usage, 1, true , true }
+};
+
+rc_t CC UsageSummary (const char* progname)
+{
+ return KOutMsg (
+ "Usage:\n"
+ " %s [Options] -" ALIAS_FILE " <file> <table>\n", progname);
+}
+
+const char UsageDefaultName[] = "rd-filter-redact";
+
+rc_t CC Usage(const Args* args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine(ALIAS_FILE, OPTION_FILE, "file", file_usage);
+
+ HelpOptionsStandard();
+
+ HelpVersion(fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+static rc_t CmdLineInit(const Args* args, CmdLine* cmdArgs)
+{
+ rc_t rc = 0;
+
+ assert(args && cmdArgs);
+
+ memset(cmdArgs, 0, sizeof *cmdArgs);
+
+ while (rc == 0) {
+ uint32_t pcount = 0;
+
+ /* file path parameter */
+ rc = ArgsOptionCount(args, OPTION_FILE, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing file name");
+ break;
+ }
+ if (pcount < 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "Missing file parameter");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many file parameters");
+ break;
+ }
+ rc = ArgsOptionValue (args, OPTION_FILE, 0, (const void **)&cmdArgs->file);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving file name");
+ break;
+ }
+
+ /* table path parameter */
+ rc = ArgsParamCount(args, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing table name");
+ break;
+ }
+ if (pcount < 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "Missing table parameter");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many table parameters");
+ break;
+ }
+ rc = ArgsParamValue(args, 0, (const void **)&cmdArgs->table);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving table name");
+ break;
+ }
+
+ break;
+ }
+
+ if (rc != 0) {
+ MiniUsage (args);
+ }
+
+ return rc;
+}
+
+rc_t CC KMain(int argc, char* argv[])
+{
+ rc_t rc = 0;
+ Args* args = NULL;
+
+ CmdLine cmdArgs;
+
+ LogLevelSet("info");
+
+ rc = ArgsMakeAndHandle
+ (&args, argc, argv, 1, Options, sizeof Options / sizeof(Options[0]));
+
+ if (rc == 0) {
+ rc = CmdLineInit(args, &cmdArgs);
+ }
+
+ if (rc == 0) {
+ rc = Run(&cmdArgs);
+ }
+
+ ArgsWhack(args);
+
+ if (rc == RC(rcVDB, rcTable, rcOpening, rcSchema, rcNotFound))
+ { exit(10); }
+
+ return rc;
+}
+
+/************************************ EOF ****************** ******************/
diff --git a/tools/rd-filter-redact/test-read-write-cursor.c b/tools/rd-filter-redact/test-read-write-cursor.c
new file mode 100644
index 0000000..bcee0a1
--- /dev/null
+++ b/tools/rd-filter-redact/test-read-write-cursor.c
@@ -0,0 +1,220 @@
+/******************************************************************************/
+#include <kapp/main.h>
+
+#include <sra/wsradb.h> /* spotid_t */
+
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/table.h> /* VDBTable */
+#include <vdb/cursor.h> /* VCursor */
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFile */
+
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/status.h> /* STSMSG */
+#include <klib/debug.h> /* KDbgSetString */
+#include <klib/rc.h> /* RC */
+
+#include <ctype.h> /* isblank */
+#include <string.h> /* memset */
+#include <stdio.h> /* sscanf */
+#include <assert.h>
+
+#define DISP_RC(lvl,rc,msg) (void)((rc == 0) ? 0 : LOGERR(lvl, rc, msg))
+#define DISP_RC_INT(rc,msg) DISP_RC(klogInt,rc,msg)
+
+const char UsageDefaultName[] = "test-read-write-cursor";
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t CC Usage(const Args* args) { return 0; }
+
+rc_t CC KMain(int argc, char* argv[])
+{
+ const char table[] = "/home/klymenka/REDACT-IN";
+ const char name[] = "READ_FILTER";
+
+ rc_t rc = 0;
+
+ bool locked = false;
+
+ VDBManager* mgr;
+ VTable *tbl;
+ const VCursor *rCursor = NULL;
+
+ int i;
+
+ LogLevelSet("info");
+
+ for (i = 1; i < argc; ++i) {
+ if (!strcmp(argv[i], "-+")) {
+ if (++i <= argc) {
+#if _DEBUGGING
+ KDbgSetString(argv[i]);
+#endif
+ }
+ }
+ }
+
+ /*KDbgSetString("VDB");*/
+
+ if (rc == 0) {
+/* +01: ManagerMake */
+ LOGMSG(klogInfo, "VDBManagerMakeUpdate");
+ rc = VDBManagerMakeUpdate(&mgr, NULL);
+ DISP_RC_INT(rc, "while calling VDBManagerMakeUpdate");
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerWritable(mgr, "%s", table);
+ if (GetRCState(rc) == rcLocked) {
+ LOGMSG(klogInfo, "VDBManagerUnlock");
+ rc = VDBManagerUnlock(mgr, "%s", table);
+ DISP_RC_INT(rc, "while calling VDBManagerUnlock");
+ locked = true;
+ }
+ }
+
+ if (rc == 0) {
+/* +02: OpenTable */
+ PLOGMSG(klogInfo, (klogInfo,
+ "VDBManagerOpenTableUpdate(\"$(t)\")", "t=%s", table));
+ rc = VDBManagerOpenTableUpdate
+ (mgr, &tbl, NULL, "%s", table);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while opening VTable '$(path)'", "path=%s", table));
+ }
+ }
+
+ if (rc == 0) {
+/* +03: CreateCursorRead */
+ LOGMSG(klogInfo, "VDBManagerUnlock");
+ rc = VTableCreateCursorRead(tbl, &rCursor);
+ DISP_RC_INT(rc, "while creating read cursor");
+
+#if 1
+ if (rc == 0) {
+ uint32_t idx;
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorAddColumn(read cursor, \"$(n)\")", "n=%s", name));
+ rc = VCursorAddColumn(rCursor, &idx, "%s", name);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while adding $(name) to read cursor", "name=%s", name));
+ }
+ }
+#endif
+ if (rc == 0) {
+ LOGMSG(klogInfo, "VCursorOpen(read cursor)");
+ rc = VCursorOpen(rCursor);
+ DISP_RC_INT(rc, "while opening read cursor");
+ }
+ }
+
+ if (rc == 0) {
+ VCursor *cursor;
+ uint32_t idx;
+/* +04: CreateCursorWrite */
+ LOGMSG(klogInfo, "VTableCreateCursorWrite");
+ rc = VTableCreateCursorWrite(tbl, &cursor, kcmInsert);
+ DISP_RC_INT(rc, "while creating write cursor");
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorAddColumn(write cursor, \"$(n)\")", "n=%s", name));
+ rc = VCursorAddColumn(cursor, &idx, "%s", name);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "while adding $(name) to write cursor", "name=%s", name));
+ }
+ }
+ if (rc == 0) {
+ LOGMSG(klogInfo, "VCursorOpen(write cursor)");
+ rc = VCursorOpen(cursor);
+ DISP_RC_INT(rc, "while opening write cursor");
+ }
+#if 1
+ for (i = 0; i < 3 && rc == 0; ++i) {
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorOpenRow(write cursor) $(i)", "i=%d", i));
+ rc = VCursorOpenRow(cursor);
+ DISP_RC_INT(rc, "while opening row to write");
+ }
+ if (rc == 0) {
+ char buffer[1];
+ char b;
+ switch (i) {
+ case 0:
+ buffer[0] = SRA_READ_FILTER_CRITERIA;
+ buffer[0] = SRA_READ_FILTER_REJECT;
+ break;
+ case 1:
+ buffer[0] = SRA_READ_FILTER_REJECT;
+ buffer[0] = SRA_READ_FILTER_CRITERIA;
+ break;
+ case 2:
+ buffer[0] = SRA_READ_FILTER_REDACTED;
+ break;
+ }
+ buffer[0] = SRA_READ_FILTER_PASS;
+ b = buffer[0];
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorWrite('$(v)') $(i)", "v=%s,i=%d",
+ b == SRA_READ_FILTER_REDACTED ? "SRA_READ_FILTER_REDACTED" :
+ "?",
+ i));
+ rc = VCursorWrite(cursor, idx, 8, buffer, 0, 1);
+ DISP_RC_INT(rc, "while writing");
+ }
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorCommitRow(write cursor) $(i)", "i=%d", i));
+ rc = VCursorCommitRow(cursor);
+ DISP_RC_INT(rc, "while committing row");
+ }
+ PLOGMSG(klogInfo, (klogInfo,
+ "VCursorCloseRow(write cursor) $(i)", "i=%d", i));
+ {
+ rc_t rc2 = VCursorCloseRow(cursor);
+ DISP_RC_INT(rc2, "while closing row");
+ if (rc == 0)
+ { rc = rc2; }
+ }
+ }
+#endif
+ LOGMSG(klogInfo, "VCursorRelease(read cursor)");
+/* -03: CreateCursorRead */
+ VCursorRelease(rCursor);
+ if (rc == 0) {
+ LOGMSG(klogInfo, "VCursorCommit(write cursor)");
+ rc = VCursorCommit(cursor);
+ DISP_RC_INT(rc, "while committing cursor");
+ }
+ LOGMSG(klogInfo, "VCursorRelease(write cursor)");
+/* -04: CreateCursorWrite */
+ VCursorRelease(cursor);
+ }
+
+ LOGMSG(klogInfo, "VTableRelease");
+/* -02: OpenTable */
+ VTableRelease(tbl);
+ LOGMSG(klogInfo, "VDBManagerLock");
+ if (locked) {
+ rc_t rc2 = VDBManagerLock(mgr, "%s", table);
+ DISP_RC_INT(rc2, "while VDBManagerLock");
+ }
+
+/* -01: ManagerMake */
+ LOGMSG(klogInfo, "VDBManagerRelease");
+ VDBManagerRelease(mgr);
+
+ if (rc == 0) {
+ LOGMSG(klogInfo, "SUCCESS");
+ }
+ else { LOGMSG(klogInfo, "FAILURE"); }
+
+ return rc;
+}
diff --git a/tools/sra-dump/.gitignore b/tools/sra-dump/.gitignore
new file mode 100644
index 0000000..c97f963
--- /dev/null
+++ b/tools/sra-dump/.gitignore
@@ -0,0 +1 @@
+*.sh
diff --git a/tools/sra-dump/Makefile b/tools/sra-dump/Makefile
new file mode 100644
index 0000000..2f3ac7c
--- /dev/null
+++ b/tools/sra-dump/Makefile
@@ -0,0 +1,128 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-dump
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ fastq-dump \
+ sff-dump \
+ illumina-dump \
+ abi-dump
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# Common dumper definitions
+#
+DUMP_COMMON_SRC = \
+ factory \
+ fasta_dump \
+ core
+
+DUMP_COMMON_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+#-------------------------------------------------------------------------------
+# fastq-dump
+#
+FASTQ_DUMP_SRC = \
+ $(DUMP_COMMON_SRC) \
+ fastq
+
+FASTQ_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQ_DUMP_SRC))
+
+$(BINDIR)/fastq-dump: $(FASTQ_DUMP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(DUMP_COMMON_LIB)
+
+#-------------------------------------------------------------------------------
+# sff-dump
+#
+SFF_DUMP_SRC = \
+ $(DUMP_COMMON_SRC) \
+ sff
+
+SFF_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(SFF_DUMP_SRC))
+
+$(BINDIR)/sff-dump: $(SFF_DUMP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(DUMP_COMMON_LIB)
+
+#-------------------------------------------------------------------------------
+# illumina-dump
+#
+ILLUMINA_DUMP_SRC = \
+ $(DUMP_COMMON_SRC) \
+ illumina
+
+ILLUMINA_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(ILLUMINA_DUMP_SRC))
+
+$(BINDIR)/illumina-dump: $(ILLUMINA_DUMP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(DUMP_COMMON_LIB)
+
+#-------------------------------------------------------------------------------
+# abi-dump
+#
+ABI_DUMP_SRC = \
+ $(DUMP_COMMON_SRC) \
+ abi
+
+ABI_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(ABI_DUMP_SRC))
+
+$(BINDIR)/abi-dump: $(ABI_DUMP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(DUMP_COMMON_LIB)
+
diff --git a/tools/sra-dump/abi.c b/tools/sra-dump/abi.c
new file mode 100644
index 0000000..cc7c9ff
--- /dev/null
+++ b/tools/sra-dump/abi.c
@@ -0,0 +1,907 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/container.h>
+#include <klib/printf.h>
+#include <kapp/main.h>
+
+#include <sra/sradb.h>
+#include <sra/abi.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "core.h"
+#include "debug.h"
+
+#define DATABUFFERINITSIZE 10240
+
+/* ============== Absolid read type (bio/tech) filter ============================ */
+
+typedef struct Absolid2BioFilter_struct {
+ const AbsolidReader* reader;
+} Absolid2BioFilter;
+
+/* leave only up to 2 first bio reads */
+static
+rc_t Absolid2BioFilter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask)
+{
+ rc_t rc = 0;
+ Absolid2BioFilter* self = (Absolid2BioFilter*)cself;
+
+ if( self == NULL || key == NULL ) {
+ rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid);
+ } else {
+ if( (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) {
+ uint32_t num_reads = 0;
+ if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ uint32_t q, readId;
+ make_readmask(new_mask);
+ SRAReadTypes read_type = SRA_READ_TYPE_TECHNICAL;
+
+ clear_readmask(new_mask);
+ for(q = 0, readId = 0; rc == 0 && readId < num_reads && q < 2; readId++) {
+ if( (rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, &read_type, NULL, NULL, NULL, NULL)) == 0 ) {
+ if( read_type & SRA_READ_TYPE_BIOLOGICAL ) {
+ set_readmask(new_mask, readId);
+ q++;
+ }
+ }
+ }
+ *key = "";
+ copy_readmask(new_mask, readmask);
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ *key = NULL;
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct Absolid2BioFilterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ const AbsolidReader* reader;
+} Absolid2BioFilterFactory;
+
+static
+rc_t Absolid2BioFilterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ Absolid2BioFilterFactory* self = (Absolid2BioFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = AbsolidReaderMake(&self->reader, self->table, self->accession,
+ false, false, 0, 0, 0, false);
+ }
+ return rc;
+}
+
+static
+rc_t Absolid2BioFilterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ Absolid2BioFilterFactory* self = (Absolid2BioFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(Absolid2BioFilter), Absolid2BioFilter_GetKey, NULL, NULL, NULL)) == 0 ) {
+ ((Absolid2BioFilter*)(*splitter))->reader = self->reader;
+ }
+ }
+ return rc;
+}
+
+static
+void Absolid2BioFilterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ Absolid2BioFilterFactory* self = (Absolid2BioFilterFactory*)cself;
+ AbsolidReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t Absolid2BioFilterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table)
+{
+ rc_t rc = 0;
+ Absolid2BioFilterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterSpot, sizeof(*obj),
+ Absolid2BioFilterFactory_Init,
+ Absolid2BioFilterFactory_NewObj,
+ Absolid2BioFilterFactory_Release)) == 0 ) {
+ obj = (Absolid2BioFilterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ return rc;
+}
+
+/* ============== Absolid label assigning ============================ */
+
+typedef struct AbsolidLabelerFilter_struct {
+ const AbsolidReader* reader;
+ bool is_platform_cs_native;
+ SRASplitter_Keys keys[8];
+ size_t key_sz[8];
+} AbsolidLabelerFilter;
+
+static
+rc_t AbsolidLabelerFilter_GetKeySet(const SRASplitter* cself, const SRASplitter_Keys** key, uint32_t* keys, spotid_t spot, const readmask_t* readmask)
+{
+ rc_t rc = 0;
+ AbsolidLabelerFilter* self = (AbsolidLabelerFilter*)cself;
+
+ if( self == NULL || key == NULL ) {
+ rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid);
+ } else {
+ *keys = 0;
+ if( rc == 0 && (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) {
+ uint32_t num_reads = 0;
+ if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ uint32_t readId, q;
+ const char* read_label;
+ INSDC_coord_len read_label_sz = 0;
+ INSDC_coord_len read_len = 0;
+
+ *key = self->keys;
+ *keys = sizeof(self->keys) / sizeof(self->keys[0]);
+ for(q = 0; q < *keys; q++) {
+ clear_readmask(self->keys[q].readmask);
+ }
+ for(q = 0, readId = 0; rc == 0 && readId < num_reads; readId++) {
+ if( !isset_readmask(readmask, readId) ) {
+ continue;
+ }
+ rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, NULL, &read_label, &read_label_sz, NULL, &read_len);
+ if( read_len == 0 ) {
+ continue;
+ }
+ if( self->is_platform_cs_native ) {
+ uint32_t i;
+ for(i = 0; i < *keys; i++) {
+ if( read_label_sz == self->key_sz[i] && strncmp(read_label, self->keys[i].key, read_label_sz) == 0 ) {
+ set_readmask(self->keys[i].readmask, readId);
+ break;
+ }
+ }
+ if( i >= *keys ) {
+ rc = RC(rcExe, rcNode, rcExecuting, rcTag, rcUnexpected);
+ }
+ } else {
+ /* since prev filter leaves only 2 first bio reads labels F3 and R3 wil be used */
+ set_readmask(self->keys[q].readmask, readId);
+ }
+ q++;
+ }
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct AbsolidLabelerFilterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ bool is_platform_cs_native;
+ const AbsolidReader* reader;
+} AbsolidLabelerFilterFactory;
+
+static
+rc_t AbsolidLabelerFilterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ AbsolidLabelerFilterFactory* self = (AbsolidLabelerFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = AbsolidReaderMake(&self->reader, self->table, self->accession,
+ false, false, 0, 0, 0, false);
+ }
+ return rc;
+}
+
+static
+rc_t AbsolidLabelerFilterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ AbsolidLabelerFilterFactory* self = (AbsolidLabelerFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(AbsolidLabelerFilter), NULL, AbsolidLabelerFilter_GetKeySet, NULL, NULL)) == 0 ) {
+ ((AbsolidLabelerFilter*)(*splitter))->reader = self->reader;
+ ((AbsolidLabelerFilter*)(*splitter))->is_platform_cs_native = self->is_platform_cs_native;
+ ((AbsolidLabelerFilter*)(*splitter))->keys[0].key = "F3";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[1].key = "R3";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[2].key = "F5-P2";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[3].key = "F5-BC";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[4].key = "F5-RNA";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[5].key = "F5-DNA";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[6].key = "F3-DNA";
+ ((AbsolidLabelerFilter*)(*splitter))->keys[7].key = "BC";
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[0] = 2;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[1] = 2;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[2] = 5;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[3] = 5;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[4] = 6;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[5] = 6;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[6] = 6;
+ ((AbsolidLabelerFilter*)(*splitter))->key_sz[7] = 2;
+ }
+ }
+ return rc;
+}
+
+static
+void AbsolidLabelerFilterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ AbsolidLabelerFilterFactory* self = (AbsolidLabelerFilterFactory*)cself;
+ AbsolidReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t AbsolidLabelerFilterFactory_Make(const SRASplitterFactory** cself, const char* accession,
+ const SRATable* table, bool is_platform_cs_native)
+{
+ rc_t rc = 0;
+ AbsolidLabelerFilterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterRead, sizeof(*obj),
+ AbsolidLabelerFilterFactory_Init,
+ AbsolidLabelerFilterFactory_NewObj,
+ AbsolidLabelerFilterFactory_Release)) == 0 ) {
+ obj = (AbsolidLabelerFilterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ obj->is_platform_cs_native = is_platform_cs_native;
+ }
+ return rc;
+}
+
+/* ============== Absolid min read length splitter ============================ */
+
+char* AbsolidReadLenFilter_key_buf = NULL;
+
+typedef struct AbsolidReadLenFilter_struct {
+ const AbsolidReader* reader;
+} AbsolidReadLenFilter;
+
+
+/* skip all reads with len < minreadlen */
+static
+rc_t AbsolidReadLenFilter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask)
+{
+ rc_t rc = 0;
+ AbsolidReadLenFilter* self = (AbsolidReadLenFilter*)cself;
+
+ if( self == NULL || key == NULL ) {
+ rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid);
+ } else {
+ *key = "";
+
+ if( rc == 0 && (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) {
+ uint32_t num_reads = 0;
+ if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ uint32_t readId;
+ make_readmask(new_mask);
+ INSDC_coord_len read_len = 0;
+
+ clear_readmask(new_mask);
+ for(readId = 0; rc == 0 && readId < num_reads; readId++) {
+ if( !isset_readmask(readmask, readId) ) {
+ continue;
+ }
+ rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, NULL, NULL, NULL, NULL, &read_len);
+ if( rc == 0 && read_len > 0 ) {
+ set_readmask(new_mask, readId);
+ }
+ }
+ copy_readmask(new_mask, readmask);
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ *key = NULL;
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct AbsolidReadLenFilterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ bool clip;
+ uint32_t minReadLen;
+ const AbsolidReader* reader;
+} AbsolidReadLenFilterFactory;
+
+static
+rc_t AbsolidReadLenFilterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ AbsolidReadLenFilterFactory* self = (AbsolidReadLenFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = AbsolidReaderMake(&self->reader, self->table, self->accession,
+ false, !self->clip, self->minReadLen, 0, 0, false);
+ }
+ return rc;
+}
+
+static
+rc_t AbsolidReadLenFilterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ AbsolidReadLenFilterFactory* self = (AbsolidReadLenFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(AbsolidReadLenFilter), AbsolidReadLenFilter_GetKey, NULL, NULL, NULL)) == 0 ) {
+ ((AbsolidReadLenFilter*)(*splitter))->reader = self->reader;
+ }
+ }
+ return rc;
+}
+
+static
+void AbsolidReadLenFilterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ AbsolidReadLenFilterFactory* self = (AbsolidReadLenFilterFactory*)cself;
+ AbsolidReaderWhack(self->reader);
+ free(AbsolidReadLenFilter_key_buf);
+ }
+}
+
+static
+rc_t AbsolidReadLenFilterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table,
+ bool clip, uint32_t minReadLen)
+{
+ rc_t rc = 0;
+ AbsolidReadLenFilterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterSpot, sizeof(*obj),
+ AbsolidReadLenFilterFactory_Init,
+ AbsolidReadLenFilterFactory_NewObj,
+ AbsolidReadLenFilterFactory_Release)) == 0 ) {
+ obj = (AbsolidReadLenFilterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ obj->minReadLen = minReadLen;
+ obj->clip = clip;
+ }
+ return rc;
+}
+
+/* ============== Absolid quality filter ============================ */
+
+typedef struct AbsolidQFilter_struct {
+ const AbsolidReader* reader;
+ KDataBuffer* b;
+} AbsolidQFilter;
+
+
+/* filter out reads by leading/trialing quality */
+static
+rc_t AbsolidQFilter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask)
+{
+ rc_t rc = 0;
+ AbsolidQFilter* self = (AbsolidQFilter*)cself;
+
+ if( self == NULL || key == NULL ) {
+ rc = RC(rcExe, rcNode, rcExecuting, rcParam, rcInvalid);
+ } else {
+ uint32_t num_reads = 0;
+
+ if( (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) {
+ if( (rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ uint32_t readId;
+ make_readmask(new_mask);
+ INSDC_coord_len read_len = 0;
+ static char const* const colorStr = "..........";
+ static const int xLen = 10;
+
+ clear_readmask(new_mask);
+ for(readId = 0; rc == 0 && readId < num_reads; readId++) {
+ if( (rc = AbsolidReader_SpotReadInfo(self->reader, readId + 1, NULL, NULL, NULL, NULL, &read_len)) == 0 ) {
+ IF_BUF((AbsolidReaderBase(self->reader, readId + 1, self->b->base, KDataBufferBytes(self->b), NULL)), self->b, read_len) {
+ const char* b = self->b->base;
+ if( strncmp(&b[1], colorStr, xLen) == 0 && strcmp(&b[read_len - xLen + 1], colorStr) == 0 ) {
+ continue;
+ }
+ }
+ set_readmask(new_mask, readId);
+ }
+ }
+ *key = "";
+ copy_readmask(new_mask, readmask);
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ *key = NULL;
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct AbsolidQFilterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ bool clip;
+ const AbsolidReader* reader;
+ KDataBuffer buf;
+} AbsolidQFilterFactory;
+
+static
+rc_t AbsolidQFilterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ AbsolidQFilterFactory* self = (AbsolidQFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = KDataBufferMakeBytes(&self->buf, DATABUFFERINITSIZE)) == 0 ) {
+ rc = AbsolidReaderMake(&self->reader, self->table, self->accession,
+ false, self->clip, 0, 0, 0, false);
+ }
+ return rc;
+}
+
+static
+rc_t AbsolidQFilterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ AbsolidQFilterFactory* self = (AbsolidQFilterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcExe, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(AbsolidQFilter), AbsolidQFilter_GetKey, NULL, NULL, NULL)) == 0 ) {
+ ((AbsolidQFilter*)(*splitter))->reader = self->reader;
+ ((AbsolidQFilter*)(*splitter))->b = &self->buf;
+ }
+ }
+ return rc;
+}
+
+static
+void AbsolidQFilterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ AbsolidQFilterFactory* self = (AbsolidQFilterFactory*)cself;
+ KDataBufferWhack(&self->buf);
+ AbsolidReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t AbsolidQFilterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table, bool clip)
+{
+ rc_t rc = 0;
+ AbsolidQFilterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcExe, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterSpot, sizeof(*obj),
+ AbsolidQFilterFactory_Init,
+ AbsolidQFilterFactory_NewObj,
+ AbsolidQFilterFactory_Release)) == 0 ) {
+ obj = (AbsolidQFilterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ obj->clip = clip;
+ }
+ return rc;
+}
+
+/* ============== Absolid formatter object ============================ */
+
+typedef struct AbsolidFormatterSplitter_struct {
+ const AbsolidReader* reader;
+ char pfx[10 * 1024];
+ int pfx_sz;
+ KDataBuffer* hb;
+ KDataBuffer* b;
+} AbsolidFormatterSplitter;
+
+static
+rc_t AbsolidFormatterSplitter_Dump(const SRASplitter* cself, spotid_t spot, const readmask_t* readmask)
+{
+ rc_t rc = 0;
+ AbsolidFormatterSplitter* self = (AbsolidFormatterSplitter*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = AbsolidReaderSeekSpot(self->reader, spot)) == 0 ) {
+ const char* prefix;
+ size_t head_sz, writ = 0;
+ uint32_t num_reads, readId;
+
+ rc = AbsolidReader_SpotInfo(self->reader, NULL, NULL, NULL, &num_reads);
+
+ for(readId = 1; rc == 0 && readId <= num_reads; readId++) {
+ if( !isset_readmask(readmask, readId - 1) ) {
+ continue;
+ }
+ if( (rc = AbsolidReaderSpotName(self->reader, &prefix, &head_sz, NULL, NULL)) == 0 ) {
+ if( head_sz != self->pfx_sz || memcmp(self->pfx, prefix, head_sz) != 0 ) {
+ if( head_sz >= sizeof(self->pfx) ) {
+ rc = RC(rcSRA, rcString, rcCopying, rcBuffer, rcInsufficient);
+ } else {
+ self->pfx_sz = head_sz;
+ memmove(self->pfx, prefix, head_sz);
+ IF_BUF((string_printf(self->hb->base, KDataBufferBytes(self->hb), &head_sz,
+ "#\n# Title: %.*s\n#\n", self->pfx_sz, self->pfx)), self->hb, head_sz);
+ }
+ } else {
+ head_sz = 0;
+ }
+ }
+ if( rc == 0 ) {
+ char* h = self->hb->base;
+ IF_BUF((AbsolidReaderHeader(self->reader, readId, &h[head_sz],
+ KDataBufferBytes(self->hb) - head_sz - 1, &writ)), self->hb, writ + head_sz + 1) {
+ head_sz += writ;
+ h[head_sz++] = '\n';
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, ".csfasta")) == 0 ) {
+ IF_BUF((AbsolidReaderBase(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, "_QV.qual")) == 0 ) {
+ IF_BUF((AbsolidReaderQuality(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, "_intensity.ScaledFTC.fasta")) == 0 ) {
+ IF_BUF((AbsolidReaderSignalFTC(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, "_intensity.ScaledCY3.fasta")) == 0 ) {
+ IF_BUF((AbsolidReaderSignalCY3(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, "_intensity.ScaledTXR.fasta")) == 0 ) {
+ IF_BUF((AbsolidReaderSignalTXR(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (rc = SRASplitter_FileActivate(cself, "_intensity.ScaledCY5.fasta")) == 0 ) {
+ IF_BUF((AbsolidReaderSignalCY5(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 && (rc = SRASplitter_FileWrite(cself, 0, self->hb->base, head_sz)) == 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct AbsolidFormatterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ bool orig;
+ bool clip;
+ const AbsolidReader* reader;
+ KDataBuffer hbuf;
+ KDataBuffer buf;
+} AbsolidFormatterFactory;
+
+static
+rc_t AbsolidFormatterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ AbsolidFormatterFactory* self = (AbsolidFormatterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = KDataBufferMakeBytes(&self->hbuf, DATABUFFERINITSIZE)) == 0 &&
+ (rc = KDataBufferMakeBytes(&self->buf, DATABUFFERINITSIZE)) == 0 ) {
+ rc = AbsolidReaderMake(&self->reader, self->table, self->accession,
+ self->orig, !self->clip, 0, 0, 0, true);
+ }
+ return rc;
+}
+
+static
+rc_t AbsolidFormatterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ AbsolidFormatterFactory* self = (AbsolidFormatterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(AbsolidFormatterSplitter), NULL, NULL, AbsolidFormatterSplitter_Dump, NULL)) == 0 ) {
+ ((AbsolidFormatterSplitter*)(*splitter))->reader = self->reader;
+ ((AbsolidFormatterSplitter*)(*splitter))->pfx[0] = '\0';
+ ((AbsolidFormatterSplitter*)(*splitter))->pfx_sz = 0;
+ ((AbsolidFormatterSplitter*)(*splitter))->hb = &self->hbuf;
+ ((AbsolidFormatterSplitter*)(*splitter))->b = &self->buf;
+
+ }
+ }
+ return rc;
+}
+
+static
+void AbsolidFormatterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ AbsolidFormatterFactory* self = (AbsolidFormatterFactory*)cself;
+ KDataBufferWhack(&self->hbuf);
+ KDataBufferWhack(&self->buf);
+ AbsolidReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t AbsolidFormatterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table, bool orig, bool clip)
+{
+ rc_t rc = 0;
+ AbsolidFormatterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterFormat, sizeof(*obj),
+ AbsolidFormatterFactory_Init,
+ AbsolidFormatterFactory_NewObj,
+ AbsolidFormatterFactory_Release)) == 0 ) {
+ obj = (AbsolidFormatterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ obj->orig = orig;
+ obj->clip = clip;
+ }
+ return rc;
+}
+
+/* ### External entry points ##################################################### */
+const char UsageDefaultName[] = "abi-dump";
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+struct AbsolidArgs_struct {
+ bool is_platform_cs_native;
+
+ uint32_t minReadLen;
+ bool applyClip;
+ bool dumpOrigFmt;
+ bool qual_filter;
+} AbsolidArgs;
+
+rc_t AbsolidDumper_Release(const SRADumperFmt* fmt)
+{
+ if( fmt == NULL ) {
+ return RC(rcExe, rcFormatter, rcDestroying, rcParam, rcInvalid);
+ }
+ return 0;
+}
+
+bool AbsolidDumper_AddArg(const SRADumperFmt* fmt, GetArg* f, int* i, int argc, char *argv[])
+{
+ const char* arg = NULL;
+
+ if( fmt == NULL || f == NULL || i == NULL || argv == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid), "null param");
+ return false;
+ } else if( f(fmt, "M", "minReadLen", i, argc, argv, &arg) ) {
+ AbsolidArgs.minReadLen = AsciiToU32(arg, NULL, NULL);
+ } else if( f(fmt, "W", "noclip", i, argc, argv, NULL) ) {
+ AbsolidArgs.applyClip = false;
+ } else if( f(fmt, "F", "origfmt", i, argc, argv, NULL) ) {
+ AbsolidArgs.dumpOrigFmt = true;
+ } else if( f(fmt, "B", "noDotReads", i, argc, argv, NULL) ) {
+ AbsolidArgs.qual_filter = true;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+rc_t AbsolidDumper_Factories(const SRADumperFmt* fmt, const SRASplitterFactory** factory)
+{
+ rc_t rc = 0;
+ const SRASplitterFactory* parent = NULL, *child = NULL;
+
+ if( fmt == NULL || factory == NULL ) {
+ return RC(rcExe, rcFormatter, rcReading, rcParam, rcInvalid);
+ }
+ *factory = NULL;
+
+ {
+ const SRAColumn* c = NULL;
+ if( (rc = SRATableOpenColumnRead(fmt->table, &c, "PLATFORM", sra_platform_id_t)) == 0 ) {
+ const INSDC_SRA_platform_id* platform;
+ bitsz_t o, z;
+ if( (rc = SRAColumnRead(c, 1, (const void **)&platform, &o, &z)) == 0 ) {
+ if( *platform == SRA_PLATFORM_ABSOLID ) {
+ AbsolidArgs.is_platform_cs_native = true;
+ }
+ }
+ SRAColumnRelease(c);
+ } else if( GetRCState(rc) == rcNotFound && GetRCObject(rc) == ( enum RCObject )rcColumn ) {
+ rc = 0;
+ }
+ }
+
+ if( rc == 0 ) {
+ if( (rc = Absolid2BioFilterFactory_Make(&child, fmt->accession, fmt->table)) == 0 ) {
+ if( parent != NULL ) {
+ if( (rc = SRASplitterFactory_AddNext(parent, child)) != 0 ) {
+ SRASplitterFactory_Release(child);
+ } else {
+ parent = child;
+ }
+ } else {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = AbsolidLabelerFilterFactory_Make(&child, fmt->accession, fmt->table, AbsolidArgs.is_platform_cs_native)) == 0 ) {
+ if( parent != NULL ) {
+ if( (rc = SRASplitterFactory_AddNext(parent, child)) != 0 ) {
+ SRASplitterFactory_Release(child);
+ } else {
+ parent = child;
+ }
+ } else {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ if( rc == 0 && AbsolidArgs.minReadLen > 0 ) {
+ if( (rc = AbsolidReadLenFilterFactory_Make(&child, fmt->accession, fmt->table,
+ AbsolidArgs.applyClip, AbsolidArgs.minReadLen)) == 0 ) {
+ if( parent != NULL ) {
+ if( (rc = SRASplitterFactory_AddNext(parent, child)) != 0 ) {
+ SRASplitterFactory_Release(child);
+ } else {
+ parent = child;
+ }
+ } else {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ if( rc == 0 && AbsolidArgs.qual_filter ) {
+ if( (rc = AbsolidQFilterFactory_Make(&child, fmt->accession, fmt->table, AbsolidArgs.applyClip)) == 0 ) {
+ if( parent != NULL ) {
+ if( (rc = SRASplitterFactory_AddNext(parent, child)) != 0 ) {
+ SRASplitterFactory_Release(child);
+ } else {
+ parent = child;
+ }
+ } else {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = AbsolidFormatterFactory_Make(&child, fmt->accession, fmt->table,
+ AbsolidArgs.dumpOrigFmt, AbsolidArgs.applyClip)) == 0 ) {
+ if( parent != NULL ) {
+ if( (rc = SRASplitterFactory_AddNext(parent, child)) != 0 ) {
+ SRASplitterFactory_Release(child);
+ }
+ } else {
+ *factory = child;
+ }
+ }
+ }
+ return rc;
+}
+
+/* main entry point of the file */
+rc_t SRADumper_Init(SRADumperFmt* fmt)
+{
+ static const SRADumperFmt_Arg arg[] =
+ {
+ {"M", "minReadLen", "len", {"Minimum read length to output, default is 25", NULL}},
+ {"W", "noclip", NULL, {"Do not clip quality left and right for spot", NULL}},
+ {"F", "origfmt", NULL, {"Excludes SRR accession on defline", NULL}},
+ {"B", "noDotReads", NULL, {"Do not output reads consisting mostly of dots", NULL}},
+ {NULL, NULL, NULL, {NULL}}
+ };
+ AbsolidArgs.is_platform_cs_native = false;
+ AbsolidArgs.minReadLen = 25;
+ AbsolidArgs.applyClip = true;
+ AbsolidArgs.dumpOrigFmt = false;
+ AbsolidArgs.qual_filter = false;
+
+ if( fmt == NULL ) {
+ return RC(rcExe, rcFileFormat, rcConstructing, rcParam, rcNull);
+ }
+ fmt->release = AbsolidDumper_Release;
+ fmt->arg_desc = arg;
+ fmt->add_arg = AbsolidDumper_AddArg;
+ fmt->get_factory = AbsolidDumper_Factories;
+ fmt->gzip = true;
+ fmt->bzip2 = true;
+
+ return 0;
+}
diff --git a/tools/sra-dump/core.c b/tools/sra-dump/core.c
new file mode 100644
index 0000000..7dae0b4
--- /dev/null
+++ b/tools/sra-dump/core.c
@@ -0,0 +1,1717 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/table.h> /* VTableRelease */
+#include <kfg/config.h> /* KConfigDisableUserSettings */
+
+#include <vdb/manager.h> /* VDBManagerRelease */
+#include <vdb/vdb-priv.h> /* VDBManagerDisablePagemapThread() */
+#include <kdb/manager.h> /* for different path-types */
+#include <vdb/dependencies.h> /* UIError */
+#include <vdb/report.h>
+#include <vdb/database.h>
+
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/report.h> /* ReportInit */
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/text.h>
+
+#include <kapp/main.h>
+#include <kfs/directory.h>
+#include <sra/sradb-priv.h>
+#include <sra/types.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "debug.h"
+#include "core.h"
+#include "fasta_dump.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/* ### checks to see if NREADS <= nreads_max defined in factory.h ##################################################### */
+
+typedef struct MaxNReadsValidator_struct
+{
+ const SRAColumn* col;
+ uint64_t rejected_spots;
+} MaxNReadsValidator;
+
+
+static rc_t MaxNReadsValidator_GetKey( const SRASplitter* cself,
+ const char** key, spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ MaxNReadsValidator* self = ( MaxNReadsValidator* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ const void* nreads = NULL;
+ bitsz_t o = 0, sz = 0;
+ uint64_t nn = 0;
+
+ *key = "";
+ if ( self->col != NULL )
+ {
+ rc = SRAColumnRead( self->col, spot, &nreads, &o, &sz );
+ if ( rc == 0 )
+ {
+ switch( sz )
+ {
+ case 8:
+ nn = *((const uint8_t*)nreads);
+ break;
+ case 16:
+ nn = *((const uint16_t*)nreads);
+ break;
+ case 32:
+ nn = *((const uint32_t*)nreads);
+ break;
+ case 64:
+ nn = *((const uint64_t*)nreads);
+ break;
+ default:
+ rc = RC( rcSRA, rcNode, rcExecuting, rcData, rcUnexpected );
+ break;
+ }
+ if ( nn > nreads_max )
+ {
+ clear_readmask( readmask );
+ self->rejected_spots ++;
+ PLOGMSG(klogWarn, (klogWarn, "too many reads $(nreads) at spot id $(row), maximum $(max) supported, skipped",
+ PLOG_3(PLOG_U64(nreads),PLOG_I64(row),PLOG_U32(max)), nn, spot, nreads_max));
+ }
+ else if ( nn == nreads_max - 1 )
+ {
+ PLOGMSG(klogWarn, (klogWarn, "too many reads $(nreads) at spot id $(row), truncated to $(max)",
+ PLOG_3(PLOG_U64(nreads),PLOG_I64(row),PLOG_U32(max)), nn + 1, spot, nreads_max));
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t MaxNReadsValidator_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ MaxNReadsValidator* self = ( MaxNReadsValidator* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else if ( !g_legacy_report )
+ {
+ if ( self->rejected_spots > 0 )
+ rc = KOutMsg( "Rejected %lu SPOTS because of to many READS\n", self->rejected_spots );
+ }
+ return rc;
+}
+
+
+typedef struct MaxNReadsValidatorFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col;
+} MaxNReadsValidatorFactory;
+
+
+static rc_t MaxNReadsValidatorFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ MaxNReadsValidatorFactory* self = ( MaxNReadsValidatorFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRATableOpenColumnRead( self->table, &self->col, "NREADS", NULL );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcNotFound || GetRCState( rc ) == rcExists )
+ {
+ rc = 0;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t MaxNReadsValidatorFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ MaxNReadsValidatorFactory* self = ( MaxNReadsValidatorFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof(MaxNReadsValidator),
+ MaxNReadsValidator_GetKey, NULL, NULL, MaxNReadsValidator_Release );
+ if ( rc == 0 )
+ {
+ MaxNReadsValidator * filter = ( MaxNReadsValidator * )( * splitter );
+ filter->col = self->col;
+ filter->rejected_spots = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void MaxNReadsValidatorFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ MaxNReadsValidatorFactory* self = ( MaxNReadsValidatorFactory* )cself;
+ SRAColumnRelease( self->col );
+ }
+}
+
+
+static rc_t MaxNReadsValidatorFactory_Make( const SRASplitterFactory** cself, const SRATable* table )
+{
+ rc_t rc = 0;
+ MaxNReadsValidatorFactory* obj = NULL;
+
+ if( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ MaxNReadsValidatorFactory_Init,
+ MaxNReadsValidatorFactory_NewObj,
+ MaxNReadsValidatorFactory_Release);
+ if ( rc == 0 )
+ {
+ obj = ( MaxNReadsValidatorFactory* )*cself;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+/* ### READ_FILTER splitter/filter ##################################################### */
+
+enum EReadFilterSplitter_names
+{
+ EReadFilterSplitter_pass = 0,
+ EReadFilterSplitter_reject,
+ EReadFilterSplitter_criteria,
+ EReadFilterSplitter_redacted,
+ EReadFilterSplitter_unknown,
+ EReadFilterSplitter_max
+};
+
+
+typedef struct ReadFilterSplitter_struct
+{
+ const SRAColumn* col_rdf;
+ SRAReadFilter read_filter;
+ SRASplitter_Keys keys[5];
+} ReadFilterSplitter;
+
+
+static rc_t ReadFilterSplitter_GetKeySet( const SRASplitter* cself,
+ const SRASplitter_Keys** key, uint32_t* keys, spotid_t spot, const readmask_t* readmask )
+{
+ rc_t rc = 0;
+ ReadFilterSplitter* self = ( ReadFilterSplitter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ const INSDC_SRA_read_filter* rdf;
+ bitsz_t o = 0, sz = 0;
+
+ *keys = 0;
+ if ( self->col_rdf != NULL )
+ {
+ rc = SRAColumnRead( self->col_rdf, spot, (const void **)&rdf, &o, &sz );
+ if ( rc == 0 && sz > 0 )
+ {
+ int32_t j, i = sz / sizeof( INSDC_SRA_read_filter ) / 8;
+ *key = self->keys;
+ *keys = sizeof( self->keys ) / sizeof( self->keys[ 0 ] );
+ for ( j = 0; j < *keys; j++ )
+ {
+ clear_readmask( self->keys[ j ].readmask );
+ }
+ while ( i > 0 )
+ {
+ i--;
+ if ( self->read_filter != 0xFF && self->read_filter != rdf[i] )
+ {
+ /* skip by filter value != to command line */
+ }
+ else if ( rdf[ i ] == SRA_READ_FILTER_PASS )
+ {
+ set_readmask( self->keys[ EReadFilterSplitter_pass ].readmask, i );
+ }
+ else if ( rdf[ i ] == SRA_READ_FILTER_REJECT )
+ {
+ set_readmask( self->keys[ EReadFilterSplitter_reject ].readmask, i );
+ }
+ else if( rdf[ i ] == SRA_READ_FILTER_CRITERIA )
+ {
+ set_readmask( self->keys[ EReadFilterSplitter_criteria ].readmask, i );
+ }
+ else if( rdf[ i ] == SRA_READ_FILTER_REDACTED )
+ {
+ set_readmask( self->keys[ EReadFilterSplitter_redacted ].readmask, i );
+ }
+ else
+ {
+ set_readmask( self->keys[ EReadFilterSplitter_unknown ].readmask, i );
+ PLOGMSG( klogWarn, ( klogWarn,
+ "unknown READ_FILTER value $(value) at spot id $(row)",
+ PLOG_2( PLOG_U8( value ), PLOG_I64( row ) ), rdf[ i ], spot ) );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct ReadFilterSplitterFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col_rdf;
+ SRAReadFilter read_filter;
+} ReadFilterSplitterFactory;
+
+
+static rc_t ReadFilterSplitterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ ReadFilterSplitterFactory* self = ( ReadFilterSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRATableOpenColumnRead( self->table, &self->col_rdf, "READ_FILTER", sra_read_filter_t );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ LOGMSG( klogWarn, "Column READ_FILTER was not found, param ignored" );
+ rc = 0;
+ }
+ else if ( GetRCState( rc ) == rcExists )
+ {
+ rc = 0;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t ReadFilterSplitterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ ReadFilterSplitterFactory* self = ( ReadFilterSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof(ReadFilterSplitter), NULL,
+ ReadFilterSplitter_GetKeySet, NULL, NULL );
+ if ( rc == 0 )
+ {
+ ( (ReadFilterSplitter*)(*splitter) )->col_rdf = self->col_rdf;
+ ( (ReadFilterSplitter*)(*splitter) )->read_filter = self->read_filter;
+ ( (ReadFilterSplitter*)(*splitter) )->keys[ EReadFilterSplitter_pass ].key = "pass";
+ ( (ReadFilterSplitter*)(*splitter) )->keys[ EReadFilterSplitter_reject ].key = "reject";
+ ( (ReadFilterSplitter*)(*splitter) )->keys[ EReadFilterSplitter_criteria ].key = "criteria";
+ ( (ReadFilterSplitter*)(*splitter) )->keys[ EReadFilterSplitter_redacted ].key = "redacted";
+ ( (ReadFilterSplitter*)(*splitter) )->keys[ EReadFilterSplitter_unknown ].key = "unknown";
+ }
+ }
+ return rc;
+}
+
+
+static void ReadFilterSplitterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ ReadFilterSplitterFactory* self = ( ReadFilterSplitterFactory* )cself;
+ SRAColumnRelease( self->col_rdf );
+ }
+}
+
+
+static rc_t ReadFilterSplitterFactory_Make( const SRASplitterFactory** cself,
+ const SRATable* table, SRAReadFilter read_filter )
+{
+ rc_t rc = 0;
+ ReadFilterSplitterFactory* obj = NULL;
+
+ if ( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterRead, sizeof( *obj ),
+ ReadFilterSplitterFactory_Init,
+ ReadFilterSplitterFactory_NewObj,
+ ReadFilterSplitterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( ReadFilterSplitterFactory* ) *cself;
+ obj->table = table;
+ obj->read_filter = read_filter;
+ }
+ }
+ return rc;
+}
+
+
+/* ### SPOT_GROUP splitter/filter ##################################################### */
+
+typedef struct SpotGroupSplitter_struct
+{
+ char cur_key[ 256 ];
+ const SRAColumn* col;
+ char* const* spot_group;
+ uint64_t rejected_spots;
+ bool split;
+} SpotGroupSplitter;
+
+
+static rc_t SpotGroupSplitter_GetKey( const SRASplitter* cself,
+ const char** key, spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ SpotGroupSplitter* self = ( SpotGroupSplitter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ *key = self->cur_key;
+ if ( self->col != NULL )
+ {
+ const char* g = NULL;
+ bitsz_t o = 0, sz = 0;
+ rc = SRAColumnRead( self->col, spot, (const void **)&g, &o, &sz );
+ if ( rc == 0 && sz > 0 )
+ {
+ sz /= 8;
+ /* truncate trailing \0 */
+ while ( sz > 0 && g[ sz - 1 ] == '\0' )
+ {
+ sz--;
+ }
+ if ( sz > sizeof( self->cur_key ) - 1 )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ int i;
+ bool found = false;
+ memmove( self->cur_key, g, sz );
+ self->cur_key[ sz ] = '\0';
+ for ( i = 0; self->spot_group[ i ] != NULL; i++ )
+ {
+ if ( strcmp( self->cur_key, self->spot_group[ i ] ) == 0 )
+ {
+ found = true;
+ break;
+ }
+ }
+ if ( self->spot_group[ 0 ] != NULL && !found )
+ {
+ /* list not empty and not in list -> skip */
+ self->rejected_spots ++;
+ *key = NULL;
+ }
+ else if ( !self->split )
+ {
+ *key = "";
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t SpotGroupSplitter_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ SpotGroupSplitter* self = ( SpotGroupSplitter* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else if ( !g_legacy_report )
+ {
+ if ( self->rejected_spots > 0 )
+ rc = KOutMsg( "Rejected %lu SPOTS because of spotgroup filtering\n", self->rejected_spots );
+ }
+ return rc;
+}
+
+typedef struct SpotGroupSplitterFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col;
+ bool split;
+ char* const* spot_group;
+} SpotGroupSplitterFactory;
+
+
+static rc_t SpotGroupSplitterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ SpotGroupSplitterFactory* self = ( SpotGroupSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRATableOpenColumnRead( self->table, &self->col, "SPOT_GROUP", vdb_ascii_t );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ LOGMSG(klogWarn, "Column SPOT_GROUP was not found, param ignored");
+ rc = 0;
+ }
+ else if ( GetRCState( rc ) == rcExists )
+ {
+ rc = 0;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t SpotGroupSplitterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ SpotGroupSplitterFactory* self = ( SpotGroupSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( SpotGroupSplitter ),
+ SpotGroupSplitter_GetKey, NULL, NULL, SpotGroupSplitter_Release );
+ if ( rc == 0 )
+ {
+ SpotGroupSplitter * filter = ( SpotGroupSplitter * )( * splitter );
+ filter->col = self->col;
+ filter->split = self->split;
+ filter->spot_group = self->spot_group;
+ filter->rejected_spots = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void SpotGroupSplitterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ SpotGroupSplitterFactory* self = ( SpotGroupSplitterFactory* )cself;
+ SRAColumnRelease( self->col );
+ }
+}
+
+
+static rc_t SpotGroupSplitterFactory_Make( const SRASplitterFactory** cself,
+ const SRATable* table, bool split, char* const spot_group[] )
+{
+ rc_t rc = 0;
+ SpotGroupSplitterFactory* obj = NULL;
+
+ if ( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ SpotGroupSplitterFactory_Init,
+ SpotGroupSplitterFactory_NewObj,
+ SpotGroupSplitterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( SpotGroupSplitterFactory* ) *cself;
+ obj->table = table;
+ obj->split = split;
+ obj->spot_group = spot_group;
+ }
+ }
+ return rc;
+}
+
+/* ### Common dumper code ##################################################### */
+
+
+static rc_t SRADumper_DumpRun( const SRATable* table,
+ spotid_t minSpotId, spotid_t maxSpotId, const SRASplitterFactory* factories, uint64_t * num_spots )
+{
+ rc_t rc = 0, rcr = 0;
+ spotid_t spot = 0;
+
+ /* !!! make_readmask is a MACRO defined in factory.h !!! */
+ make_readmask( readmask );
+ const SRASplitter* root_splitter = NULL;
+
+ if ( num_spots != NULL ) *num_spots = 0;
+
+ rc = SRASplitterFactory_NewObj( factories, &root_splitter );
+
+ for ( spot = minSpotId; rc == 0 && spot <= maxSpotId; spot++ )
+ {
+ reset_readmask( readmask );
+ /* SRASplitter_AddSpot() defined in factory.c */
+ rc = SRASplitter_AddSpot( root_splitter, spot, readmask );
+ if ( rc == 0 )
+ {
+ if ( num_spots != NULL ) (*num_spots)++;
+ rc = Quitting();
+ }
+ else
+ {
+ if ( ( GetRCModule( rc ) == rcXF ) &&
+ ( GetRCTarget( rc ) == rcFunction ) &&
+ ( GetRCContext( rc ) == rcExecuting ) &&
+ ( GetRCObject( rc ) == ( enum RCObject )rcData ) &&
+ ( GetRCState( rc ) == rcInconsistent ) )
+ {
+ rc = 0;
+ }
+ }
+ }
+ rcr = SRASplitter_Release( root_splitter );
+
+ return rc ? rc : rcr;
+}
+
+
+static const SRADumperFmt_Arg KMainArgs[] =
+{
+ { NULL, "no-user-settings", NULL, { "Internal Only", NULL } },
+ { "A", "accession", "accession", { "Replaces accession derived from <path> in filename(s) and deflines (only for single table dump)", NULL } },
+ { "O", "outdir", "path", { "Output directory, default is working directory ( '.' )", NULL } },
+ { "Z", "stdout", NULL, { "Output to stdout, all split data become joined into single stream", NULL } },
+ { NULL, "gzip", NULL, { "Compress output using gzip", NULL } },
+ { NULL, "bzip2", NULL, { "Compress output using bzip2", NULL } },
+ { "N", "minSpotId", "rowid", { "Minimum spot id", NULL } },
+ { "X", "maxSpotId", "rowid", { "Maximum spot id", NULL } },
+ { "G", "spot-group", NULL, { "Split into files by SPOT_GROUP (member name)", NULL } },
+ { NULL, "spot-groups", "[list]", { "Filter by SPOT_GROUP (member): name[,...]", NULL } },
+ { "R", "read-filter", "[filter]", { "Split into files by READ_FILTER value",
+ "optionally filter by a value: pass|reject|criteria|redacted", NULL } },
+ { "T", "group-in-dirs", NULL, { "Split into subdirectories instead of files", NULL } },
+ { "K", "keep-empty-files", NULL, { "Do not delete empty files", NULL } },
+ { NULL, "table", "table-name", { "Table name within cSRA object, default is \"SEQUENCE\"", NULL } },
+
+ { NULL, "disable-multithreading", NULL, { "disable multithreading", NULL } },
+
+ { "h", "help", NULL, { "Output a brief explanation of program usage", NULL } },
+ { "V", "version", NULL, { "Display the version of the program", NULL } },
+
+ { "L", "log-level", "level", { "Logging level as number or enum string",
+ "One of (fatal|sys|int|err|warn|info) or (0-5)",
+ "Current/default is warn", NULL } },
+ { "v", "verbose", NULL, { "Increase the verbosity level of the program",
+ "Use multiple times for more verbosity", NULL } },
+ { NULL, OPTION_REPORT, NULL, { "Control program execution environment report generation (if implemented).",
+ "One of (never|error|always). Default is error", NULL } },
+#if _DEBUGGING
+ { "+", "debug", "Module[-Flag]",{ "Turn on debug output for module",
+ "All flags if not specified", NULL } },
+#endif
+
+ { NULL, "legacy-report", NULL, { "use legacy style 'Written N spots' for tool" } },
+ { NULL, NULL, NULL, { NULL } } /* terminator */
+};
+
+
+rc_t CC Usage ( const Args * args )
+{
+ return fasta_dump_usage ( args );
+}
+
+
+void CC SRADumper_PrintArg( const SRADumperFmt_Arg* arg )
+{
+ /* ??? */
+}
+
+
+static void CoreUsage( const char* prog, const SRADumperFmt* fmt, bool brief, int exit_status )
+{
+ OUTMSG(( "\n"
+ "Usage:\n"
+ " %s [options] <path> [<path>...]\n"
+ " %s [options] <accession>\n"
+ "\n", prog, prog));
+
+ if ( !brief )
+ {
+ if ( fmt->usage )
+ {
+ rc_t rc = fmt->usage( fmt, KMainArgs, 1 );
+ if ( rc != 0 )
+ {
+ LOGERR(klogErr, rc, "Usage print failed");
+ }
+ }
+ else
+ {
+ int k, i;
+ const SRADumperFmt_Arg* d[ 2 ] = { KMainArgs, NULL };
+
+ d[ 1 ] = fmt->arg_desc;
+ for ( k = 0; k < ( sizeof( d ) / sizeof( d[0] ) ); k++ )
+ {
+ for ( i = 1;
+ d[k] != NULL && ( d[ k ][ i ].abbr != NULL || d[ k ][ i ].full != NULL );
+ ++ i )
+ {
+ if ( ( !fmt->gzip && strcmp( d[ k ][ i ].full, "gzip" ) == 0 ) ||
+ ( !fmt->bzip2 && strcmp (d[ k ][ i ].full, "bzip2" ) == 0 ) )
+ {
+ continue;
+ }
+ if ( k > 0 && i == 0 )
+ {
+ OUTMSG(("\nFormat options:\n\n"));
+ }
+ HelpOptionLine( d[ k ][ i ].abbr, d[ k ][ i ].full,
+ d[ k ][ i ].param, (const char**)( d[ k ][ i ].descr ) );
+ if ( k == 0 && i == 0 )
+ {
+ OUTMSG(( "\nOptions:\n\n" ));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ OUTMSG(( "Use option --help for more information\n" ));
+ }
+ HelpVersion( prog, KAppVersion() );
+ exit( exit_status );
+}
+
+
+static rc_t SRADumper_ArgsValidate( const char* prog, const SRADumperFmt* fmt )
+{
+ rc_t rc = 0;
+ int k, i;
+
+ /* set default log level */
+ const char* default_log_level = "warn";
+ rc = LogLevelSet( default_log_level );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "default log level to '$(lvl)'",
+ PLOG_S( lvl ), default_log_level ) );
+ CoreUsage( prog, fmt, true, EXIT_FAILURE );
+ }
+ for ( i = 0; KMainArgs[ i ].abbr != NULL; i++ )
+ {
+ for ( k = 0; fmt->arg_desc != NULL && fmt->arg_desc[ k ].abbr != NULL; k++ )
+ {
+ if ( strcmp( fmt->arg_desc[ k ].abbr, KMainArgs[ i ].abbr ) == 0 ||
+ ( fmt->arg_desc[ k ].full != NULL && strcmp( fmt->arg_desc[ k ].full, KMainArgs[ i ].full ) == 0 ) )
+ {
+ rc = RC(rcExe, rcArgv, rcValidating, rcParam, rcDuplicate);
+ }
+ }
+ }
+ return rc;
+}
+
+
+bool CC SRADumper_GetArg( const SRADumperFmt* fmt, char const* const abbr, char const* const full,
+ int* i, int argc, char *argv[], const char** value )
+{
+ rc_t rc = 0;
+ const char* arg = argv[*i];
+ while ( *arg == '-' && *arg != '\0')
+ {
+ arg++;
+ }
+ if ( abbr != NULL && strcmp(arg, abbr) == 0 )
+ {
+ SRA_DUMP_DBG( 9, ( "GetArg key: '%s'\n", arg ) );
+ arg = arg + strlen( abbr );
+ if ( value != NULL && arg[0] == '\0' && (*i + 1) < argc )
+ {
+ arg = NULL;
+ if ( argv[ *i + 1 ][ 0 ] != '-' )
+ {
+ /* advance only if next is not an option with '-' */
+ *i = *i + 1;
+ arg = argv[ *i ];
+ }
+ }
+ else
+ {
+ arg = NULL;
+ }
+ }
+ else if ( full != NULL && strcmp( arg, full ) == 0 )
+ {
+ SRA_DUMP_DBG( 9, ( "GetArg key: '%s'\n", arg ) );
+ arg = NULL;
+ if ( value != NULL && ( *i + 1 ) < argc )
+ {
+ if ( argv[ *i + 1 ][ 0 ] != '-' )
+ {
+ /* advance only if next is not an option with '-' */
+ *i = *i + 1;
+ arg = argv[ *i ];
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+
+ SRA_DUMP_DBG( 9, ( "GetArg val: '%s'\n", arg ) );
+ if ( value == NULL && arg != NULL )
+ {
+ rc = RC( rcApp, rcArgv, rcAccessing, rcParam, rcUnexpected );
+ }
+ else if ( value != NULL )
+ {
+ if ( arg == NULL && *value == '\0' )
+ {
+ rc = RC( rcApp, rcArgv, rcAccessing, rcParam, rcNotFound );
+ }
+ else if ( arg != NULL && arg[0] != '\0' )
+ {
+ *value = arg;
+ }
+ }
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "$(a0)$(a1)$(a2)$(f0)$(f1): $(v)",
+ PLOG_3(PLOG_S(a0),PLOG_S(a1),PLOG_S(a2))","PLOG_3(PLOG_S(f0),PLOG_S(f1),PLOG_S(v)),
+ abbr ? "-": "", abbr ? abbr : "", abbr ? ", " : "", full ? "--" : "", full ? full : "", arg));
+ CoreUsage( argv[ 0 ], fmt, true, EXIT_FAILURE );
+ }
+ return rc == 0 ? true : false;
+}
+
+
+static bool reportToUserSffFromNot454Run(rc_t rc, char* argv0, bool silent) {
+ assert( argv0 );
+ if ( rc == SILENT_RC( rcSRA, rcFormatter, rcConstructing,
+ rcData, rcUnsupported ) )
+ {
+ const char* name = strpbrk( argv0, "/\\" );
+ const char* last_name = name;
+ if ( last_name )
+ {
+ ++last_name;
+ }
+ while ( name )
+ {
+ name = strpbrk( last_name, "/\\" );
+ if ( name )
+ {
+ last_name = name;
+ if ( last_name )
+ {
+ ++last_name;
+ }
+ }
+ }
+ name = last_name ? last_name : argv0;
+ if ( strcmp( "sff-dump", name ) == 0 )
+ {
+ if (!silent) {
+ OUTMSG((
+ "This run cannot be transformed into SFF format.\n"
+ "Conversion cannot be completed because the source lacks\n"
+ "one or more of the data series required by the SFF format.\n"
+ "You should be able to dump it as FASTQ by running fastq-dump.\n"
+ "\n"));
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+
+static int str_cmp( const char *a, const char *b )
+{
+ size_t asize = string_size ( a );
+ size_t bsize = string_size ( b );
+ return strcase_cmp ( a, asize, b, bsize, ( asize > bsize ) ? asize : bsize );
+}
+
+static bool database_contains_table_name( const VDBManager * vmgr, const char * acc_or_path, const char * tablename )
+{
+ bool res = false;
+ if ( ( vmgr != NULL ) && ( acc_or_path != NULL ) && ( tablename != NULL ) )
+ {
+ const VDatabase * db;
+ rc_t rc = VDBManagerOpenDBRead( vmgr, &db, NULL, "%s", acc_or_path );
+ if ( rc == 0 )
+ {
+ KNamelist * tbl_names;
+ rc = VDatabaseListTbl( db, &tbl_names );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( tbl_names, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0 && !res; ++idx )
+ {
+ const char *tbl_name;
+ rc = KNamelistGet( tbl_names, idx, &tbl_name );
+ if ( rc == 0 )
+ {
+ res = ( str_cmp( tbl_name, tablename ) == 0 );
+ }
+ }
+ }
+ KNamelistRelease( tbl_names );
+ }
+ VDatabaseRelease( db );
+ }
+ }
+ return res;
+}
+
+
+static const char * consensus_table_name = "CONSENSUS";
+
+/*******************************************************************************
+ * KMain - defined for use with kapp library
+ *******************************************************************************/
+rc_t CC KMain ( int argc, char* argv[] )
+{
+ rc_t rc = 0;
+ int i;
+ const char* arg;
+ uint64_t total_spots_read = 0;
+ uint64_t total_spots_written = 0;
+
+ const VDBManager* vmgr = NULL;
+ const SRAMgr* sraMGR = NULL;
+ SRADumperFmt fmt;
+
+ bool to_stdout = false, do_gzip = false, do_bzip2 = false;
+ char const* outdir = NULL;
+ spotid_t minSpotId = 1;
+ spotid_t maxSpotId = 0x7FFFFFFFFFFFFFFF; /* 9,223,372,036,854,775,807 max int64_t value !!! ~0 is wrong !!! */
+ bool sub_dir = false;
+ bool keep_empty = false;
+ const char* table_path[10240];
+ int table_path_qty = 0;
+
+ char const* D_option = NULL;
+ char const* P_option = NULL;
+ char P_option_buffer[4096];
+ const char* accession = NULL;
+ const char* table_name = NULL;
+
+ bool spot_group_on = false;
+ bool no_mt = false;
+ int spot_groups = 0;
+ char* spot_group[128] = {NULL};
+ bool read_filter_on = false;
+ SRAReadFilter read_filter = 0xFF;
+
+ /* for the fasta-ouput of fastq-dump: branch out completely of 'common' code */
+ if ( fasta_dump_requested( argc, argv ) )
+ {
+ return fasta_dump( argc, argv );
+ }
+
+ /* Prepare for the worst: report this information after disaster */
+ ReportBuildDate ( __DATE__ );
+
+ memset( &fmt, 0, sizeof( fmt ) );
+ rc = SRADumper_Init( &fmt ); /* !!!dirty dirty trick!!! function is defined in abi.c AND fastq.c AND illumina.c AND sff.c !!! */
+ if ( rc != 0 )
+ {
+ LOGERR(klogErr, rc, "formatter initialization");
+ return 100;
+ }
+ else if ( fmt.get_factory == NULL )
+ {
+ rc = RC( rcExe, rcFormatter, rcValidating, rcInterface, rcNull );
+ LOGERR( klogErr, rc, "formatter factory" );
+ return 101;
+ }
+ else
+ {
+ rc = SRADumper_ArgsValidate( argv[0], &fmt ); /* above in this file */
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "formatter args list" );
+ return 102;
+ }
+ }
+
+ if ( argc < 2 )
+ {
+ CoreUsage( argv[0], &fmt, true, EXIT_FAILURE ); /* above in this file */
+ return 0;
+ }
+
+ /* now looping through argv[], ignoring args-parsing via kapp!!! */
+ for ( i = 1; i < argc; i++ )
+ {
+ arg = argv[ i ];
+ if ( arg[ 0 ] != '-' )
+ {
+ uint32_t k;
+ for ( k = 0; k < table_path_qty; k++ )
+ {
+ if ( strcmp( arg, table_path[ k ] ) == 0 )
+ {
+ break;
+ }
+ }
+ if ( k >= table_path_qty )
+ {
+ if ( ( table_path_qty + 1 ) >= ( sizeof( table_path ) / sizeof( table_path[ 0 ] ) ) )
+ {
+ rc = RC( rcExe, rcArgv, rcReading, rcBuffer, rcInsufficient );
+ goto Catch;
+ }
+ table_path[ table_path_qty++ ] = arg;
+ }
+ continue;
+ }
+ arg = NULL;
+ if ( SRADumper_GetArg( &fmt, "L", "log-level", &i, argc, argv, &arg ) )
+ {
+ rc = LogLevelSet( arg );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "log level $(lvl)", PLOG_S( lvl ), arg ) );
+ goto Catch;
+ }
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, "disable-multithreading", &i, argc, argv, NULL ) )
+ {
+ no_mt = true;
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, OPTION_REPORT, &i, argc, argv, &arg ) )
+ {
+ }
+ else if ( SRADumper_GetArg( &fmt, "+", "debug", &i, argc, argv, &arg ) )
+ {
+#if _DEBUGGING
+ rc = KDbgSetString( arg );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "debug level $(lvl)", PLOG_S( lvl ), arg ) );
+ goto Catch;
+ }
+#endif
+ }
+ else if ( SRADumper_GetArg( &fmt, "H", "help", &i, argc, argv, NULL ) ||
+ SRADumper_GetArg( &fmt, "?", "h", &i, argc, argv, NULL ) )
+ {
+ CoreUsage( argv[ 0 ], &fmt, false, EXIT_SUCCESS );
+
+ }
+ else if ( SRADumper_GetArg( &fmt, "V", "version", &i, argc, argv, NULL ) )
+ {
+ HelpVersion ( argv[ 0 ], KAppVersion() );
+ return 0;
+ }
+ else if ( SRADumper_GetArg( &fmt, "v", NULL, &i, argc, argv, NULL ) )
+ {
+ KStsLevelAdjust( 1 );
+
+ }
+ else if ( SRADumper_GetArg( &fmt, "D", "table-path", &i, argc, argv, &D_option ) )
+ {
+ LOGMSG( klogErr, "option -D is deprecated, see --help" );
+ }
+ else if ( SRADumper_GetArg( &fmt, "P", "path", &i, argc, argv, &P_option ) )
+ {
+ LOGMSG( klogErr, "option -P is deprecated, see --help" );
+
+ }
+ else if ( SRADumper_GetArg( &fmt, "A", "accession", &i, argc, argv, &accession ) )
+ {
+ }
+ else if ( SRADumper_GetArg( &fmt, "O", "outdir", &i, argc, argv, &outdir ) )
+ {
+ }
+ else if ( SRADumper_GetArg( &fmt, "Z", "stdout", &i, argc, argv, NULL ) )
+ {
+ to_stdout = true;
+ }
+ else if ( fmt.gzip && SRADumper_GetArg( &fmt, NULL, "gzip", &i, argc, argv, NULL ) )
+ {
+ do_gzip = true;
+ }
+ else if ( fmt.bzip2 && SRADumper_GetArg( &fmt, NULL, "bzip2", &i, argc, argv, NULL ) )
+ {
+ do_bzip2 = true;
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, "table", &i, argc, argv, &table_name ) )
+ {
+ }
+ else if ( SRADumper_GetArg( &fmt, "N", "minSpotId", &i, argc, argv, &arg ) )
+ {
+ minSpotId = AsciiToU64( arg, NULL, NULL );
+ }
+ else if ( SRADumper_GetArg( &fmt, "X", "maxSpotId", &i, argc, argv, &arg ) )
+ {
+ maxSpotId = AsciiToU64( arg, NULL, NULL );
+ }
+ else if ( SRADumper_GetArg( &fmt, "G", "spot-group", &i, argc, argv, NULL ) )
+ {
+ spot_group_on = true;
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, "spot-groups", &i, argc, argv, NULL ) )
+ {
+ if ( i + 1 < argc && argv[ i + 1 ][ 0 ] != '-' )
+ {
+ int f = 0, t = 0;
+ i++;
+ while ( argv[ i ][ t ] != '\0' )
+ {
+ if ( argv[ i ][ t ] == ',' )
+ {
+ if ( t - f > 0 )
+ {
+ spot_group[ spot_groups++ ] = string_dup( &argv[ i ][ f ], t - f );
+ }
+ f = t + 1;
+ }
+ t++;
+ }
+ if ( t - f > 0 )
+ {
+ spot_group[ spot_groups++ ] = string_dup( &argv[ i ][ f ], t - f );
+ }
+ if ( spot_groups < 1 )
+ {
+ rc = RC( rcApp, rcArgv, rcReading, rcParam, rcEmpty );
+ PLOGERR( klogErr, ( klogErr, rc, "$(p)", PLOG_S( p ), argv[ i - 1 ] ) );
+ CoreUsage( argv[ 0 ], &fmt, false, EXIT_FAILURE );
+ }
+ spot_group[ spot_groups ] = NULL;
+ }
+ }
+ else if ( SRADumper_GetArg( &fmt, "R", "read-filter", &i, argc, argv, NULL ) )
+ {
+ read_filter_on = true;
+ if ( i + 1 < argc && argv[ i + 1 ][ 0 ] != '-' )
+ {
+ i++;
+ if ( read_filter != 0xFF )
+ {
+ rc = RC( rcApp, rcArgv, rcReading, rcParam, rcDuplicate );
+ PLOGERR( klogErr, ( klogErr, rc, "$(p): $(o)",
+ PLOG_2( PLOG_S( p ),PLOG_S( o ) ), argv[ i - 1 ], argv[ i ] ) );
+ CoreUsage( argv[ 0 ], &fmt, false, EXIT_FAILURE );
+ }
+ if ( strcasecmp( argv[ i ], "pass" ) == 0 )
+ {
+ read_filter = SRA_READ_FILTER_PASS;
+ }
+ else if ( strcasecmp( argv[ i ], "reject" ) == 0 )
+ {
+ read_filter = SRA_READ_FILTER_REJECT;
+ }
+ else if ( strcasecmp( argv[ i ], "criteria" ) == 0 )
+ {
+ read_filter = SRA_READ_FILTER_CRITERIA;
+ }
+ else if ( strcasecmp( argv[ i ], "redacted" ) == 0 )
+ {
+ read_filter = SRA_READ_FILTER_REDACTED;
+ }
+ else
+ {
+ /* must be accession */
+ i--;
+ }
+ }
+ }
+ else if ( SRADumper_GetArg( &fmt, "T", "group-in-dirs", &i, argc, argv, NULL ) )
+ {
+ sub_dir = true;
+ }
+ else if ( SRADumper_GetArg( &fmt, "K", "keep-empty-files", &i, argc, argv, NULL ) )
+ {
+ keep_empty = true;
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, "no-user-settings", &i, argc, argv, NULL ) )
+ {
+ KConfigDisableUserSettings ();
+ }
+ else if ( SRADumper_GetArg( &fmt, NULL, "legacy-report", &i, argc, argv, NULL ) )
+ {
+ g_legacy_report = true;
+ }
+ else if ( fmt.add_arg && fmt.add_arg( &fmt, SRADumper_GetArg, &i, argc, argv ) )
+ {
+ }
+ else
+ {
+ rc = RC( rcApp, rcArgv, rcReading, rcParam, rcIncorrect );
+ PLOGERR( klogErr, ( klogErr, rc, "$(p)", PLOG_S( p ), argv[ i ] ) );
+ CoreUsage( argv[ 0 ], &fmt, false, EXIT_FAILURE );
+ }
+ }
+
+ if ( to_stdout )
+ {
+ if ( outdir != NULL || sub_dir || keep_empty ||
+ spot_group_on || ( read_filter_on && read_filter == 0xFF ) )
+ {
+ LOGMSG( klogWarn, "stdout mode is set, some options are ignored" );
+ spot_group_on = false;
+ if ( read_filter == 0xFF )
+ {
+ read_filter_on = false;
+ }
+ }
+ KOutHandlerSetStdErr();
+ KStsHandlerSetStdErr();
+ KLogHandlerSetStdErr();
+ ( void ) KDbgHandlerSetStdErr();
+ }
+
+ if ( do_gzip && do_bzip2 )
+ {
+ rc = RC( rcApp, rcArgv, rcReading, rcParam, rcAmbiguous );
+ LOGERR( klogErr, rc, "output compression method" );
+ CoreUsage( argv[ 0 ], &fmt, false, EXIT_FAILURE );
+ }
+
+ if ( minSpotId > maxSpotId )
+ {
+ spotid_t temp = maxSpotId;
+ maxSpotId = minSpotId;
+ minSpotId = temp;
+ }
+
+ if ( table_path_qty == 0 )
+ {
+ if ( D_option != NULL && D_option[ 0 ] != '\0' )
+ {
+ /* support deprecated '-D' option */
+ table_path[ table_path_qty++ ] = D_option;
+ }
+ else if ( accession == NULL || accession[ 0 ] == '\0' )
+ {
+ /* must have accession to proceed */
+ rc = RC( rcExe, rcArgv, rcValidating, rcParam, rcEmpty );
+ LOGERR( klogErr, rc, "expected accession" );
+ goto Catch;
+ }
+ else if ( P_option != NULL && P_option[ 0 ] != '\0' )
+ {
+ /* support deprecated '-P' option */
+ i = snprintf( P_option_buffer, sizeof( P_option_buffer ), "%s/%s", P_option, accession );
+ if ( i < 0 || i >= sizeof( P_option_buffer ) )
+ {
+ rc = RC( rcExe, rcArgv, rcValidating, rcParam, rcExcessive );
+ LOGERR( klogErr, rc, "path too long" );
+ goto Catch;
+ }
+ table_path[ table_path_qty++ ] = P_option_buffer;
+ }
+ else
+ {
+ table_path[ table_path_qty++ ] = accession;
+ }
+ }
+
+ rc = SRAMgrMakeRead( &sraMGR ); /* !!! in libsra !!! */
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "failed to open SRA manager" );
+ goto Catch;
+ }
+ else
+ {
+ rc = SRASplitterFactory_FilerInit( to_stdout, do_gzip, do_bzip2, sub_dir, keep_empty, outdir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "failed to initialize files" );
+ goto Catch;
+ }
+ }
+
+ {
+ rc_t rc2 = SRAMgrGetVDBManagerRead( sraMGR, &vmgr );
+ if ( rc2 != 0 )
+ {
+ LOGERR( klogErr, rc2, "while calling SRAMgrGetVDBManagerRead" );
+ }
+ else
+ {
+ if ( no_mt )
+ {
+ rc2 = VDBManagerDisablePagemapThread ( vmgr );
+ if ( rc2 != 0 )
+ {
+ LOGERR( klogErr, rc2, "disabling multithreading failed" );
+ }
+ }
+ }
+ rc2 = ReportSetVDBManager( vmgr );
+ }
+
+
+ /* loop tables */
+ for ( i = 0; i < table_path_qty; i++ )
+ {
+ const SRASplitterFactory* fact_head = NULL;
+ spotid_t smax, smin;
+ int path_type;
+
+ SRA_DUMP_DBG( 5, ( "table path '%s', name '%s'\n", table_path[ i ], table_name ) );
+
+ /* because of PacBio: if no table_name is given ---> open the 'CONSENSUS' table implicitly!
+ we first have to lookup the Object-Type, if it is a Database we have to look if it contains
+ a CONSENSUS-table ( only PacBio-Runs have one ! )...
+ */
+
+ path_type = ( VDBManagerPathType ( vmgr, "%s", table_path[ i ] ) & ~ kptAlias );
+ switch ( path_type )
+ {
+ case kptDatabase : ; /* types defined in <kdb/manager.h> */
+ case kptPrereleaseTbl : ;
+ case kptTable : break;
+
+ default : rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ PLOGERR( klogErr, ( klogErr, rc,
+ "the path '$(p)' cannot be opened as database or table",
+ "p=%s", table_path[ i ] ) );
+ continue;
+ break;
+ }
+
+
+ if ( path_type == kptDatabase )
+ {
+ const char * table_to_open = table_name;
+ if ( table_to_open == NULL && database_contains_table_name( vmgr, table_path[ i ], consensus_table_name ) )
+ {
+ table_to_open = consensus_table_name;
+ }
+ if ( table_to_open != NULL )
+ {
+ rc = SRAMgrOpenAltTableRead( sraMGR, &fmt.table, table_to_open, "%s", table_path[ i ] ); /* from sradb-priv.h */
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "failed to open '$(path):$(table)'", "path=%s,table=%s",
+ table_path[ i ], table_to_open ) );
+ continue;
+ }
+ }
+
+ }
+
+ ReportResetObject( table_path[ i ] );
+
+ if ( fmt.table == NULL )
+ {
+ rc = SRAMgrOpenTableRead( sraMGR, &fmt.table, "%s", table_path[ i ] );
+ if ( rc != 0 )
+ {
+ if ( UIError( rc, NULL, NULL ) )
+ {
+ UITableLOGError( rc, NULL, true );
+ }
+ else
+ {
+ PLOGERR( klogErr, ( klogErr, rc,
+ "failed to open '$(path)'", "path=%s", table_path[ i ] ) );
+ }
+ continue;
+ }
+ }
+
+ /* infer accession from table_path if missing or more than one table */
+ fmt.accession = table_path_qty > 1 ? NULL : accession;
+ if ( fmt.accession == NULL || fmt.accession[ 0 ] == 0 )
+ {
+ char * basename;
+ char *ext;
+ size_t l;
+ bool is_url = false;
+
+ strcpy( P_option_buffer, table_path[ i ] );
+
+ basename = strchr ( P_option_buffer, ':' );
+ if ( basename )
+ {
+ ++basename;
+ if ( basename [0] == '\0' )
+ basename = P_option_buffer;
+ else
+ is_url = true;
+ }
+ else
+ basename = P_option_buffer;
+
+ if ( is_url )
+ {
+ ext = strchr ( basename, '#' );
+ if ( ext )
+ ext[ 0 ] = '\0';
+ ext = strchr ( basename, '?' );
+ if ( ext )
+ ext[ 0 ] = '\0';
+ }
+
+
+ l = strlen( basename );
+ while ( strchr( "\\/", basename[ l - 1 ] ) != NULL )
+ {
+ basename[ --l ] = '\0';
+ }
+ fmt.accession = strrchr( basename, '/' );
+ if ( fmt.accession++ == NULL )
+ {
+ fmt.accession = basename;
+ }
+
+ /* cut off [.lite].[c]sra[.nenc||.ncbi_enc] if any */
+ ext = strrchr( fmt.accession, '.' );
+ if ( ext != NULL )
+ {
+ if ( strcasecmp( ext, ".nenc" ) == 0 || strcasecmp( ext, ".ncbi_enc" ) == 0 )
+ {
+ *ext = '\0';
+ ext = strrchr( fmt.accession, '.' );
+ }
+ if ( ext != NULL && ( strcasecmp( ext, ".sra" ) == 0 || strcasecmp( ext, ".csra" ) == 0 ) )
+ {
+ *ext = '\0';
+ ext = strrchr( fmt.accession, '.' );
+ if ( ext != NULL && strcasecmp( ext, ".lite" ) == 0 )
+ {
+ *ext = '\0';
+ }
+ }
+ }
+ }
+
+ SRA_DUMP_DBG( 5, ( "accession: '%s'\n", fmt.accession ) );
+ rc = SRASplitterFactory_FilerPrefix( accession ? accession : fmt.accession );
+
+ while ( rc == 0 )
+ {
+ /* sort out the spot id range */
+ rc = SRATableMaxSpotId( fmt.table, &smax );
+ if ( rc != 0 )
+ break;
+ rc = SRATableMinSpotId( fmt.table, &smin );
+ if ( rc != 0 )
+ break;
+
+ {
+ const struct VTable* tbl = NULL;
+ rc_t rc2 = SRATableGetVTableRead( fmt.table, &tbl );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ rc2 = ReportResetTable( table_path[i], tbl );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ VTableRelease( tbl ); /* SRATableGetVTableRead adds Reference to tbl! */
+ }
+
+ /* test if we have to dump anything... */
+ if ( smax < minSpotId || smin > maxSpotId )
+ {
+ break;
+ }
+ if ( smax > maxSpotId )
+ {
+ smax = maxSpotId;
+ }
+ if ( smin < minSpotId )
+ {
+ smin = minSpotId;
+ }
+
+ /* hack to reduce looping in AddSpot: needs redesign to pass nreads along through tree */
+ if ( true ) /* ??? */
+ {
+ const SRAColumn* c = NULL;
+
+ nreads_max = NREADS_MAX; /* global variables defined in factory.h */
+ quality_N_limit = 0;
+
+ rc = SRATableOpenColumnRead( fmt.table, &c, "PLATFORM", sra_platform_id_t );
+ if ( rc == 0 )
+ {
+ const INSDC_SRA_platform_id *platform;
+ bitsz_t o, z;
+ rc = SRAColumnRead( c, 1, (const void **)&platform, &o, &z );
+ if ( rc == 0 && platform != NULL )
+ {
+ /* platform constands in insdc/sra.h */
+ switch( *platform )
+ {
+ case SRA_PLATFORM_454 : quality_N_limit = 30; nreads_max = 8; break;
+ case SRA_PLATFORM_ION_TORRENT : ;
+ case SRA_PLATFORM_ILLUMINA : quality_N_limit = 35; nreads_max = 8; break;
+ case SRA_PLATFORM_ABSOLID : quality_N_limit = 25; nreads_max = 8; break;
+
+ case SRA_PLATFORM_PACBIO_SMRT : if ( fmt.split_files )
+ {
+ /* only if we split into files we limit the number of reads */
+ nreads_max = 32;
+ }
+ break;
+
+ default : nreads_max = 8; break; /* for unknown platforms */
+ }
+ }
+ SRAColumnRelease( c );
+ }
+ else if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == ( enum RCObject )rcColumn )
+ {
+ rc = 0;
+ }
+ }
+
+ /* table dependent */
+ rc = fmt.get_factory( &fmt, &fact_head );
+ if ( rc != 0 )
+ {
+ break;
+ }
+ if ( fact_head == NULL )
+ {
+ rc = RC( rcExe, rcFormatter, rcResolving, rcInterface, rcNull );
+ break;
+ }
+
+ if ( rc == 0 && ( spot_group_on || spot_groups > 0 ) )
+ {
+ const SRASplitterFactory* f = NULL;
+ rc = SpotGroupSplitterFactory_Make( &f, fmt.table, spot_group_on, spot_group );
+ if ( rc == 0 )
+ {
+ rc = SRASplitterFactory_AddNext( f, fact_head );
+ if ( rc == 0 )
+ {
+ fact_head = f;
+ }
+ else
+ {
+ SRASplitterFactory_Release( f );
+ }
+ }
+ }
+
+ if ( rc == 0 && read_filter_on )
+ {
+ const SRASplitterFactory* f = NULL;
+ rc = ReadFilterSplitterFactory_Make( &f, fmt.table, read_filter );
+ if ( rc == 0 )
+ {
+ rc = SRASplitterFactory_AddNext( f, fact_head );
+ if ( rc == 0 )
+ {
+ fact_head = f;
+ }
+ else
+ {
+ SRASplitterFactory_Release( f );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* this filter takes over head of chain to be first and kill off bad NREADS */
+ const SRASplitterFactory* f = NULL;
+ rc = MaxNReadsValidatorFactory_Make( &f, fmt.table );
+ if ( rc == 0 )
+ {
+ rc = SRASplitterFactory_AddNext( f, fact_head );
+ if ( rc == 0 )
+ {
+ fact_head = f;
+ }
+ else
+ {
+ SRASplitterFactory_Release( f );
+ }
+ }
+ }
+
+ rc = SRASplitterFactory_Init( fact_head );
+ if ( rc == 0 )
+ {
+ uint64_t spots_read;
+
+ /* ********************************************************** */
+ rc = SRADumper_DumpRun( fmt.table, smin, smax, fact_head, &spots_read );
+ /* ********************************************************** */
+ if ( rc == 0 )
+ {
+ uint64_t spots_written = 0, file = 0;
+
+ SRASplitterFactory_FilerReport( &spots_written, &file );
+ if ( !g_legacy_report )
+ {
+ OUTMSG(( "Read %lu spots for %s\n", spots_read, table_path[ i ] ));
+ }
+ OUTMSG(( "Written %lu spots for %s\n", spots_written - total_spots_written, table_path[ i ] ));
+
+ if ( to_stdout && spots_written > 0 )
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "$(t) biggest file has $(n) spots",
+ PLOG_2( PLOG_S( t ), PLOG_U64( n ) ), table_path[ i ], file ));
+ }
+ total_spots_written = spots_written;
+ total_spots_read += spots_read;
+ }
+ }
+ break;
+ }
+
+ SRASplitterFactory_Release( fact_head );
+ SRATableRelease( fmt.table );
+ fmt.table = NULL;
+ if ( rc == 0 )
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "$(path)$(dot)$(table) $(spots) spots",
+ PLOG_4(PLOG_S(path),PLOG_S(dot),PLOG_S(table),PLOG_U32(spots)),
+ table_path[ i ], table_name ? ":" : "", table_name ? table_name : "", smax - smin + 1 ) );
+ }
+ else if (!reportToUserSffFromNot454Run(rc, argv [0], false)) {
+ PLOGERR( klogErr, ( klogErr, rc, "failed $(path)$(dot)$(table)",
+ PLOG_3(PLOG_S(path),PLOG_S(dot),PLOG_S(table)),
+ table_path[ i ], table_name ? ":" : "", table_name ? table_name : "" ) );
+ }
+ }
+
+Catch:
+ if ( fmt.release )
+ {
+ rc_t rr = fmt.release( &fmt );
+ if ( rr != 0 )
+ {
+ SRA_DUMP_DBG( 1, ( "formatter release error %R\n", rr ) );
+ }
+ }
+
+ for ( i = 0; i < spot_groups; i++ )
+ {
+ free( spot_group[ i ] );
+ }
+ SRASplitterFiler_Release();
+ SRAMgrRelease( sraMGR );
+ VDBManagerRelease( vmgr );
+
+ if ( g_legacy_report )
+ {
+ OUTMSG(( "Written %lu spots total\n", total_spots_written ));
+ }
+ else if ( table_path_qty > 1 )
+ {
+ OUTMSG(( "Read %lu spots total\n", total_spots_read ));
+ OUTMSG(( "Written %lu spots total\n", total_spots_written ));
+ }
+
+ /* Report execution environment if necessary */
+ if (rc != 0 && reportToUserSffFromNot454Run(rc, argv [0], true)) {
+ ReportSilence();
+ }
+ {
+ rc_t rc2 = ReportFinalize( rc );
+ if ( rc == 0 )
+ {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-dump/core.h b/tools/sra-dump/core.h
new file mode 100644
index 0000000..079884c
--- /dev/null
+++ b/tools/sra-dump/core.h
@@ -0,0 +1,74 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_tools_dump_core
+#define _h_tools_dump_core
+
+#include <klib/rc.h>
+
+#include "factory.h"
+
+typedef struct SRADumperFmt_Arg_struct {
+ const char* abbr; /* NULL here means end of list */
+ /* next 3 can be NULL */
+ const char* full;
+ const char* param;
+ const char* descr[10];
+} SRADumperFmt_Arg;
+
+typedef struct SRADumperFmt SRADumperFmt;
+
+/**
+ * Setup formatter interfaces
+ */
+rc_t SRADumper_Init(SRADumperFmt* fmt);
+
+typedef bool CC GetArg(const SRADumperFmt* fmt, char const* const abbr, char const* const full,
+ int* i, int argc, char *argv[], const char** value);
+
+struct SRADumperFmt
+{
+ /* optional pointer to formatter arguments, NULL terminated array otherwise */
+ const SRADumperFmt_Arg* arg_desc;
+
+ /* optional - prints custom help page */
+ rc_t (*usage)(const SRADumperFmt* fmt, const SRADumperFmt_Arg* core_args, int first );
+ /* optional */
+ rc_t (*release)(const SRADumperFmt* fmt);
+ /* optional process current arg and advance i by number of processed args */
+ bool (*add_arg)(const SRADumperFmt* fmt, GetArg* f, int* i, int argc, char *argv[]);
+
+ /* mandatory return head of factories implemented in module, factories released by caller! */
+ rc_t (*get_factory)(const SRADumperFmt* fmt, const SRASplitterFactory** factory);
+
+ /* set by parent code, do not change!!! */
+ const char* accession;
+ const SRATable* table;
+ bool gzip;
+ bool bzip2;
+ bool split_files; /* tell the core that the implementation splits into files... */
+};
+
+#endif /* _h_tools_dump_core */
diff --git a/tools/sra-dump/debug.h b/tools/sra-dump/debug.h
new file mode 100644
index 0000000..c9d1e56
--- /dev/null
+++ b/tools/sra-dump/debug.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_sra_dump_debug_h_
+#define _tools_sra_dump_debug_h_
+
+#include <klib/debug.h>
+
+#define SRA_DUMP_DBG_PASTE(a,b) a##b
+#define SRA_DUMP_DBG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(SRA_DUMP_DBG_PASTE(DBG_APP_,flag)), msg)
+
+#endif /* _tools_sra_dump_debug_h_ */
diff --git a/tools/sra-dump/factory.c b/tools/sra-dump/factory.c
new file mode 100644
index 0000000..771788b
--- /dev/null
+++ b/tools/sra-dump/factory.c
@@ -0,0 +1,1069 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <kfs/directory.h>
+#include <kfs/buffile.h>
+#include <kfs/gzip.h>
+#include <kfs/bzip.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "factory.h"
+#include "debug.h"
+
+#define DUMPER_MAX_KEY_LENGTH 63
+#define DUMPER_MAX_TREE_DEPTH 100
+#define DUMPER_MAX_OPEN_FILES 100
+
+#define OUTPUT_BUFFER_SIZE ( 128 * 1024 )
+
+uint32_t nreads_max = 0;
+uint32_t quality_N_limit = 0;
+bool g_legacy_report = false;
+
+typedef struct SRASplitterFile_struct {
+ SLNode dad;
+ char* key;
+ KDirectory* dir;
+ char* name;
+ KFile* file;
+ time_t opened;
+ uint64_t pos;
+ /* keep track of number of spots written to file */
+ spotid_t curr_spot;
+ uint64_t spot_qty;
+} SRASplitterFile;
+
+typedef struct SRASplitterFiler_struct {
+ /* TBD - reorder structure to avoid premature ageing of compiler and CPU */
+ char* prefix;
+ KFile* kf_stdout;
+ bool key_as_dir;
+ bool keep_empty;
+ bool do_gzip;
+ bool do_bzip2;
+ const char* arc_extension;
+ KDirectory* dir;
+
+ /* TBD - this should be a BSTree */
+ SLList files;
+
+ /* list of keys to construct a path */
+ int path_tail; /* count of elements in path array */
+ int path_len; /* cumulative length of path in array */
+ const char* path[DUMPER_MAX_TREE_DEPTH];
+ char key_buf[DUMPER_MAX_TREE_DEPTH * (DUMPER_MAX_KEY_LENGTH + 3) + 10];
+ /* holds opened files */
+ SRASplitterFile* open[DUMPER_MAX_OPEN_FILES];
+ /* keep track of number of spots written to file */
+ spotid_t curr_spot;
+ uint64_t spot_qty;
+} SRASplitterFiler;
+
+SRASplitterFiler* g_filer = NULL;
+
+static
+void CC SRASplitterFiler_WhackFile( SLNode *node, void *data )
+{
+ SRASplitterFile* file = (SRASplitterFile*)node;
+ bool* d = (bool*)data;
+
+ SRA_DUMP_DBG(5, ("Close file: '%s%s'\n", file->key, g_filer->arc_extension));
+ if( file->spot_qty == 0 ) {
+ /* truncate file which didn't get actual spots written */
+ KFileSetSize(file->file, 0);
+ }
+ KFileRelease(file->file);
+ if( !*d ) {
+ uint64_t sz = ~0;
+ if( KDirectoryFileSize(file->dir, &sz, "%s%s", file->name, g_filer->arc_extension) == 0 ) {
+ if( file->spot_qty == 0 || sz == 0 ) {
+ SRA_DUMP_DBG(5, ("Delete empty file: '%s%s'\n", file->key, g_filer->arc_extension));
+ KDirectoryRemove(file->dir, false, "%s%s", file->name, g_filer->arc_extension);
+ }
+ }
+ }
+ if( file->dir != g_filer->dir ) {
+ KDirectoryRelease(file->dir);
+ }
+ free(file->key);
+ free(file->name);
+ free(file);
+}
+
+static
+void CC SRASplitterFiler_StatFile( SLNode *node, void *data )
+{
+ SRASplitterFile* file = (SRASplitterFile*)node;
+ uint64_t* d = (uint64_t*)data;
+
+ if( *d < file->spot_qty ) {
+ *d = file->spot_qty;
+ }
+}
+
+void SRASplitterFiler_Release(void)
+{
+ if( g_filer != NULL ) {
+ SLListWhack(&g_filer->files, SRASplitterFiler_WhackFile, &g_filer->keep_empty);
+ KFileRelease(g_filer->kf_stdout);
+ KDirectoryRelease(g_filer->dir);
+ free(g_filer->prefix);
+ free(g_filer);
+ g_filer = NULL;
+ }
+}
+
+void SRASplitterFactory_FilerReport(uint64_t* total, uint64_t* biggest_file)
+{
+ if( g_filer != NULL ) {
+ if( total != NULL ) {
+ *total = g_filer->spot_qty;
+ }
+ if( biggest_file != NULL ) {
+ SLListForEach(&g_filer->files, SRASplitterFiler_StatFile, biggest_file);
+ }
+ }
+}
+
+static
+rc_t SRASplitterFiler_PushKey(const char* key)
+{
+ if( g_filer == NULL || key == NULL ) {
+ return RC(rcExe, rcFile, rcAttaching, rcParam, rcNull);
+ }
+ if( g_filer->path_tail == sizeof(g_filer->path) - 1 ) {
+ return RC(rcExe, rcFile, rcAttaching, rcDirEntry, rcTooLong);
+ }
+ if( g_filer->key_as_dir ) {
+ /* skip initial non-letters */
+ while( !isalnum(*key) && *key != '\0' ) {
+ ++key;
+ }
+ }
+ g_filer->path[g_filer->path_tail++] = key;
+ g_filer->path_len += strlen(key) + 1;
+ return 0;
+}
+
+static
+rc_t SRASplitterFiler_PopKey(void)
+{
+ if( g_filer->path_tail == 0 ) {
+ return RC(rcExe, rcFile, rcDetaching, rcDirEntry, rcTooShort);
+ }
+ g_filer->path_len -= strlen(g_filer->path[--g_filer->path_tail]) + 1;
+ return 0;
+}
+
+static
+rc_t SRASplitterFiler_OpenFile(SRASplitterFile* file, bool initial)
+{
+ rc_t rc = 0;
+
+ if( file == NULL || (initial && file->file != NULL) ) {
+ rc = RC(rcExe, rcFile, rcOpening, rcParam, rcInvalid);
+ } else if( initial || file->file == NULL ) {
+ int i, vacancy = -1;
+ time_t oldest = 0;
+
+ for(i = 0; i < DUMPER_MAX_OPEN_FILES; i++) {
+ if(g_filer->open[i] == NULL ) {
+ vacancy = i;
+ break;
+ }
+ if(g_filer->open[i]->opened < oldest || oldest == 0 ) {
+ oldest = g_filer->open[i]->opened;
+ vacancy = i;
+ }
+ }
+ if( g_filer->open[vacancy] != NULL ) {
+ SRA_DUMP_DBG(5, ("Close file[%i]: %lu '%s%s'\n", vacancy,
+ g_filer->open[vacancy]->opened, g_filer->open[vacancy]->key, g_filer->arc_extension));
+ KFileRelease(g_filer->open[vacancy]->file);
+ g_filer->open[vacancy]->file = NULL;
+ g_filer->open[vacancy] = NULL;
+ }
+ if( g_filer->kf_stdout ) {
+ SRA_DUMP_DBG(5, ("attach to pre-opened stdout: '%s'\n", file->key));
+ rc = KFileAddRef(g_filer->kf_stdout);
+ file->file = g_filer->kf_stdout;
+ } else if( initial ) {
+ SRA_DUMP_DBG(5, ("Create file: '%s%s'\n", file->key, g_filer->arc_extension));
+ if( (rc = KDirectoryCreateFile(file->dir, &file->file, false, 0664, kcmInit,
+ "%s%s", file->name, g_filer->arc_extension)) == 0 ) {
+ if( g_filer->do_gzip ) {
+ KFile* gz;
+ if( (rc = KFileMakeGzipForWrite(&gz, file->file)) == 0 ) {
+ KFileRelease(file->file);
+ file->file = gz;
+ }
+ } else if( g_filer->do_bzip2 ) {
+ KFile* bz;
+ if( (rc = KFileMakeBzip2ForWrite(&bz, file->file)) == 0 ) {
+ KFileRelease(file->file);
+ file->file = bz;
+ }
+ }
+ }
+ } else if( file->file == NULL ) {
+ SRA_DUMP_DBG(5, ("Reopen file: '%s%s'\n", file->key, g_filer->arc_extension));
+ /* position is rememebered since last time */
+ if( (rc = KDirectoryOpenFileWrite(file->dir, &file->file, false,
+ "%s%s", file->name, g_filer->arc_extension)) == 0 ) {
+#if ! SUPPORT_MULTI_SESSION_GZIP_FILES
+ if( g_filer->do_gzip || g_filer->do_bzip2 ) {
+ /* compressed files cannot (currently) be re-opened until we support multi-session compression */
+ rc = RC(rcExe, rcFile, rcOpening, rcConstraint, rcViolated);
+ }
+#else
+ if( g_filer->do_gzip ) {
+ KFile* gz;
+ if( (rc = KFileMakeGzipForAppend(&gz, file->file)) == 0 ) {
+ KFileRelease(file->file);
+ file->file = gz;
+ }
+ } else if( g_filer->do_bzip2 ) {
+ KFile* bz;
+ if( (rc = KFileMakeBzip2ForWrite(&bz, file->file)) == 0 ) {
+ KFileRelease(file->file);
+ file->file = bz;
+ }
+ }
+#endif
+ }
+ }
+#if OUTPUT_BUFFER_SIZE
+ if( rc == 0 && !g_filer->kf_stdout ) {
+ /* attach buffer */
+ KFile *buf = NULL;
+ if( (rc = KBufFileMakeWrite(&buf, file->file, false, OUTPUT_BUFFER_SIZE)) == 0 ) {
+ KFileRelease(file->file);
+ file->file = buf;
+ } else {
+#if _DEBUGGING
+ /* we only want to see this in debug */
+ PLOGERR(klogErr, (klogErr, rc, "creating buffer for file '$(s)$(e)'",
+ PLOG_2(PLOG_S(s),PLOG_S(e)), file->key, g_filer->arc_extension));
+#else
+ rc = 0;
+#endif
+ }
+ }
+#endif
+ if( rc == 0 ) {
+ g_filer->open[vacancy] = file;
+ file->opened = time(NULL);
+ SRA_DUMP_DBG(5, ("Opened file[%i]: %lu '%s%s'\n",
+ vacancy, file->opened, file->key, g_filer->arc_extension));
+ }
+ }
+ return rc;
+}
+
+static
+bool CC SRASplitterFiler_GetCurrFile_FindByKey( SLNode *node, void *data )
+{
+ SRASplitterFile** d = (SRASplitterFile**)data;
+ SRASplitterFile* file = (SRASplitterFile*)node;
+
+ if( strcmp(file->key, g_filer->key_buf) == 0 ) {
+ *d = file;
+ return true;
+ }
+ return false;
+}
+
+static
+rc_t SRASplitterFiler_FixFSName(const char* name, char** fname)
+{
+ /* replace invalid chars with '_' in name */
+ char* nn = strdup(name);
+
+ if( nn == NULL ) {
+ return RC(rcExe, rcFile, rcOpening, rcMemory, rcExhausted);
+ }
+ *fname = nn;
+ while(*nn != '\0' ) {
+ if( strchr("\\/?:*(){}[]^%\"\'<>|`", *nn) != NULL ) {
+ *nn = '_';
+ }
+ nn++;
+/*TODO: use it!*/
+ }
+ return 0;
+}
+
+static
+rc_t SRASplitterFiler_GetCurrFile(const SRASplitterFile** out_file)
+{
+ rc_t rc = 0;
+ int i;
+ char* key = g_filer->key_buf; /* shortcut */
+ SRASplitterFile* file = NULL;
+
+ if( out_file == NULL ) {
+ return RC(rcExe, rcFile, rcOpening, rcParam, rcInvalid);
+ } else if( g_filer->kf_stdout ) {
+ strcpy(key, "stdout");
+ } else {
+ /* prepare the key
+ if key_as_dir true, key will be prefix/path[i]/(path[i+1]..)/suffix
+ otherwise key will be prefix_path[i](_path[i+1]..)_?suffix
+ */
+ key[0] = '\0';
+ for(i = 0; i < g_filer->path_tail; i++ ) {
+ if( g_filer->path[i][0] == '\0' ) {
+ continue;
+ }
+ if( g_filer->key_as_dir ) {
+ if( i != 0 ) {
+ strcat(key, "/");
+ }
+ strcat(key, g_filer->path[i]);
+ } else {
+ if( i != 0 && isalnum(g_filer->path[i][0]) ) {
+ strcat(key, "_");
+ }
+ strcat(key, g_filer->path[i]);
+ }
+ }
+ }
+ if( !SLListDoUntil( &g_filer->files, SRASplitterFiler_GetCurrFile_FindByKey, &file ) ) {
+ SRA_DUMP_DBG(5, ("New file: '%s'\n", key));
+ file = calloc(1, sizeof(*file));
+ key = strdup(key);
+ if( file == NULL || key == NULL ) {
+ free(file);
+ free(key);
+ rc = RC(rcExe, rcFile, rcResolving, rcMemory, rcExhausted);
+ } else {
+ file->key = key;
+ if( g_filer->key_as_dir ) {
+ KDirectory* sub = g_filer->dir;
+ for(i = 0; rc == 0 && i < (g_filer->path_tail - 1); i++ ) {
+ if( g_filer->path[i][0] != '\0' ) {
+ char* ndir = NULL;
+ if( (rc = SRASplitterFiler_FixFSName(g_filer->path[i], &ndir)) == 0 ) {
+ if( (rc = KDirectoryCreateDir(sub, 0775, kcmCreate, "%s", ndir)) == 0 ||
+ (GetRCObject(rc) == ( enum RCObject )rcDirectory && GetRCState(rc) == rcExists) ) {
+ if( (rc = KDirectoryOpenDirUpdate(sub, &file->dir, true, "%s", ndir)) == 0 ) {
+ KDirectoryRelease(i == 0 ? NULL : sub);
+ sub = file->dir;
+ }
+ }
+ free(ndir);
+ }
+ }
+ }
+ rc = SRASplitterFiler_FixFSName(&file->key[strlen(file->key) - strlen(g_filer->path[g_filer->path_tail - 1])], &file->name);
+ } else {
+ file->dir = g_filer->dir;
+ rc = SRASplitterFiler_FixFSName(file->key, &file->name);
+ }
+ if( rc == 0 && (rc = SRASplitterFiler_OpenFile(file, true)) == 0 ) {
+ SLListPushTail(&g_filer->files, &file->dad);
+ } else {
+ SRASplitterFiler_WhackFile(&file->dad, &g_filer->keep_empty);
+ }
+ }
+ } else {
+ SRA_DUMP_DBG(5, ("Curr file key '%s': '%s'\n", key, file->name));
+ rc = SRASplitterFiler_OpenFile(file, false);
+ }
+ *out_file = rc ? NULL : file;
+ return rc;
+}
+
+rc_t SRASplitterFactory_FilerPrefix(const char* prefix)
+{
+ rc_t rc = 0;
+
+ if( g_filer == NULL ) {
+ rc = RC(rcExe, rcFile, rcUpdating, rcSelf, rcNotOpen);
+ } else if( prefix == NULL || strcmp(prefix, g_filer->prefix) != 0 ) {
+ if( (rc = SRASplitterFiler_PopKey()) == 0 ) {
+ free(g_filer->prefix);
+ g_filer->prefix = strdup(prefix ? prefix : "");
+ if( g_filer->prefix == NULL ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ rc = SRASplitterFiler_PushKey(g_filer->prefix);
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitterFactory_FilerInit(bool to_stdout, bool gzip, bool bzip2, bool key_as_dir, bool keep_empty, const char* path, ...)
+{
+ rc_t rc = 0;
+
+ if( g_filer != NULL ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcSelf, rcExists);
+ } else if( gzip && bzip2 ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcParam, rcAmbiguous);
+ } else if( (g_filer = calloc(1, sizeof(*g_filer))) == NULL ) {
+ rc = RC(rcExe, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ g_filer->key_as_dir = to_stdout ? false : key_as_dir;
+ g_filer->keep_empty = to_stdout ? true : keep_empty;
+ g_filer->do_gzip = gzip;
+ g_filer->do_bzip2 = bzip2;
+ g_filer->arc_extension = gzip ? ".gz" : (bzip2 ? ".bz2" : "");
+ SLListInit(&g_filer->files);
+ /* push empty prefix */
+ g_filer->prefix = strdup("");
+ if( (rc = SRASplitterFiler_PushKey(g_filer->prefix)) == 0 &&
+ (rc = KDirectoryNativeDir(&g_filer->dir)) == 0 ) {
+ if( to_stdout ) {
+ if( (rc = KFileMakeStdOut(&g_filer->kf_stdout)) == 0 ) {
+ KFile *buf = NULL;
+ if( gzip ) {
+ KFile* gz;
+ if( (rc = KFileMakeGzipForWrite(&gz, g_filer->kf_stdout)) == 0 ) {
+ KFileRelease(g_filer->kf_stdout);
+ g_filer->kf_stdout = gz;
+ }
+ } else if( bzip2 ) {
+ KFile* bz;
+ if( (rc = KFileMakeBzip2ForWrite(&bz, g_filer->kf_stdout)) == 0 ) {
+ KFileRelease(g_filer->kf_stdout);
+ g_filer->kf_stdout = bz;
+ }
+ }
+#if OUTPUT_BUFFER_SIZE
+ if ( rc == 0 ) {
+ if( (rc = KBufFileMakeWrite(&buf, g_filer->kf_stdout, false, OUTPUT_BUFFER_SIZE)) == 0 ) {
+ KFileRelease(g_filer->kf_stdout);
+ g_filer->kf_stdout = buf;
+ } else {
+#if _DEBUGGING
+ /* we only want to see this in debug */
+ LOGERR(klogErr, rc, "creating buffer for stdout");
+#else
+ rc = 0;
+#endif
+ }
+ }
+#endif
+ }
+ } else if( path != NULL ) {
+ va_list args;
+ va_start(args, path);
+ if( (rc = KDirectoryVCreateDir(g_filer->dir, 0775, kcmCreate | kcmParents, path, args)) == 0 ||
+ (GetRCObject(rc) == ( enum RCObject )rcDirectory && GetRCState(rc) == rcExists) ) {
+ KDirectory* sub = NULL;
+ va_end(args);
+ va_start(args, path);
+ if( (rc = KDirectoryVOpenDirUpdate(g_filer->dir, &sub, true, path, args)) == 0 ) {
+ KDirectoryRelease(g_filer->dir);
+ g_filer->dir = sub;
+ }
+ }
+ va_end(args);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SRASplitterFiler_PopKey();
+ SRASplitterFiler_Release();
+ }
+ return rc;
+}
+
+/* ### Base splitter code ##################################################### */
+
+/* used to detect correct object pointers */
+const uint32_t SRASplitterFactory_MAGIC = 0xFACE3693;
+
+struct SRASplitterFactory {
+ uint32_t magic;
+ ESRASplitterTypes type;
+ const SRASplitterFactory* next;
+ SRASplitterFactory_Init_Func* Init;
+ SRASplitterFactory_NewObj_Func* NewObj;
+ SRASplitterFactory_Release_Func* Release;
+};
+
+/* used to detect correct object pointers */
+const uint32_t SRASplitter_MAGIC = 0xFACE5325;
+
+typedef struct SRASplitter_Child SRASplitter_Child;
+
+struct SRASplitter {
+ uint32_t magic;
+ ESRASplitterTypes type;
+ const SRASplitterFactory* next_fact;
+ SRASplitter_GetKey_Func* GetKey;
+ SRASplitter_GetKeySet_Func* GetKeySet;
+ SRASplitter_Dump_Func* Dump;
+ SRASplitter_Release_Func* Release;
+ BSTree children;
+ SRASplitter_Child* last_found;
+};
+
+struct SRASplitter_Child {
+ BSTNode node;
+ char key[DUMPER_MAX_KEY_LENGTH + 1];
+ bool is_splitter; /* next union selector */
+ union {
+ /* chained key->splitter for self type of eSplitterRead and eSplitterSpot */
+ const SRASplitter* splitter;
+ /* file object for self type of eSplitterFormat */
+ const SRASplitterFile* file;
+ } child;
+};
+
+static
+rc_t SRASplitter_Child_Make(SRASplitter_Child** child, const char* key)
+{
+ if( child == NULL || key == NULL ) {
+ return RC(rcExe, rcNode, rcAllocating, rcParam, rcNull);
+ }
+ if( strlen(key) > DUMPER_MAX_KEY_LENGTH ) {
+ return RC(rcExe, rcNode, rcAllocating, rcTag, rcTooLong);
+ }
+ *child = calloc(1, sizeof(**child));
+ if( *child == NULL ) {
+ return RC(rcExe, rcNode, rcAllocating, rcMemory, rcExhausted);
+ }
+ strcpy((*child)->key, key);
+ return 0;
+}
+
+static
+rc_t SRASplitter_Child_MakeSplitter(SRASplitter_Child** child, const char* key, const SRASplitter* splitter)
+{
+ rc_t rc = 0;
+
+ if( splitter == NULL ) {
+ rc = RC(rcExe, rcNode, rcAllocating, rcParam, rcNull);
+ } else if( (rc = SRASplitter_Child_Make(child, key)) == 0 ) {
+ (*child)->is_splitter = true;
+ (*child)->child.splitter = splitter;
+ }
+ return rc;
+}
+
+static
+rc_t SRASplitter_Child_MakeFile(SRASplitter_Child** child, const char* key, const SRASplitterFile* file)
+{
+ rc_t rc = 0;
+
+ if( file == NULL ) {
+ rc = RC(rcExe, rcNode, rcAllocating, rcParam, rcNull);
+ } else if( (rc = SRASplitter_Child_Make(child, key)) == 0 ) {
+ (*child)->is_splitter = false;
+ (*child)->child.file = file;
+ }
+ return rc;
+}
+
+static
+void CC SRASplitter_Child_Whack(BSTNode* node, void* data)
+{
+ const SRASplitter_Child* n = (const SRASplitter_Child*)node;
+ if( n->is_splitter ) {
+ rc_t rc = 0;
+ if( (rc = SRASplitter_Release(n->child.splitter)) != 0 ) {
+ LOGERR(klogErr, rc, "SRASplitter_Release");
+ }
+ }
+ free(node);
+}
+
+static
+int64_t CC SRASplitter_Child_Cmp(const BSTNode* item, const BSTNode* node)
+{
+ const SRASplitter_Child* i = (const SRASplitter_Child*)item;
+ const SRASplitter_Child* n = (const SRASplitter_Child*)node;
+ return strcmp(i->key, n->key);
+}
+
+static
+int64_t CC SRASplitter_Child_Find(const void* item, const BSTNode* node)
+{
+ const char* key = (const char*)item;
+ const SRASplitter_Child* n = (const SRASplitter_Child*)node;
+ return strcmp(key, n->key);
+}
+
+static /* not virtual, self is direct pointer to base type here !!! */
+rc_t SRASplitter_FindNextSplitter(SRASplitter* self, const char* key)
+{
+ rc_t rc = 0;
+
+ if( self->last_found == NULL || strcmp(self->last_found->key, key) ) {
+ self->last_found = (SRASplitter_Child*)BSTreeFind( &self->children, key, SRASplitter_Child_Find );
+ if( self->last_found == NULL ) {
+ /* create new child using next factory in chain */
+ const SRASplitter* splitter = NULL;
+ SRA_DUMP_DBG(5, ("New splitter on key '%s'\n", key));
+ if( (rc = SRASplitterFactory_NewObj(self->next_fact, &splitter)) == 0 ) {
+ if( (rc = SRASplitter_Child_MakeSplitter(&self->last_found, key, splitter)) == 0 ) {
+ if( (rc = BSTreeInsertUnique(&self->children, &self->last_found->node, NULL, SRASplitter_Child_Cmp)) != 0 ) {
+ SRASplitter_Child_Whack(&self->last_found->node, NULL);
+ self->last_found = NULL;
+ }
+ } else {
+ SRASplitter_Release(splitter);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static /* not virtual, self is direct pointer to base type here !!! */
+rc_t SRASplitter_FindNextFile(SRASplitter* self, const char* key)
+{
+ rc_t rc = 0;
+
+ if( self->last_found == NULL || strcmp(self->last_found->key, key) != 0 ) {
+ self->last_found = (SRASplitter_Child*)BSTreeFind(&self->children, key, SRASplitter_Child_Find);
+ if( self->last_found == NULL ) {
+ /* create new child using global filer */
+ const SRASplitterFile* file = NULL;
+ SRA_DUMP_DBG(5, ("New file on key '%s'\n", key));
+ if( (rc = SRASplitterFiler_GetCurrFile(&file)) == 0 ) {
+ if( (rc = SRASplitter_Child_MakeFile(&self->last_found, key, file)) == 0 ) {
+ if( (rc = BSTreeInsertUnique(&self->children, &self->last_found->node, NULL, SRASplitter_Child_Cmp)) != 0 ) {
+ SRASplitter_Child_Whack(&self->last_found->node, NULL);
+ self->last_found = NULL;
+ }
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ /* make sure file is opened */
+ rc = SRASplitterFiler_OpenFile((SRASplitterFile*)(self->last_found->child.file), false);
+ }
+ return rc;
+}
+
+rc_t SRASplitter_Make(const SRASplitter** cself, size_t type_size,
+ SRASplitter_GetKey_Func* getkey,
+ SRASplitter_GetKeySet_Func* get_keyset,
+ SRASplitter_Dump_Func* dump,
+ SRASplitter_Release_Func* release)
+{
+ SRASplitter* self = NULL;
+
+ if( cself == NULL ) {
+ return RC(rcExe, rcType, rcAllocating, rcParam, rcNull);
+ }
+ self = calloc(1, type_size + sizeof(*self));
+ if( self == NULL ) {
+ return RC(rcExe, rcType, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->magic = SRASplitter_MAGIC;
+ BSTreeInit(&self->children);
+ self->GetKey = getkey;
+ self->GetKeySet = get_keyset;
+ self->Dump = dump;
+ self->Release = release;
+
+ /* shift pointer to after hidden structure */
+ self++;
+ *cself = self;
+ return 0;
+}
+
+static
+rc_t SRASplitter_ResolveSelf(const SRASplitter* self, enum RCContext ctx, SRASplitter** resolved)
+{
+ if( self == NULL || resolved == NULL ) {
+ return RC(rcExe, rcType, ctx, rcSelf, rcNull);
+ }
+ *resolved = (SRASplitter*)--self;
+ /* just to validate that it is full instance */
+ if( (*resolved)->magic != SRASplitter_MAGIC ) {
+ *resolved = NULL;
+ return RC(rcExe, rcType, ctx, rcMemory, rcCorrupt);
+ }
+ return 0;
+}
+
+rc_t SRASplitter_AddSpot( const SRASplitter * cself, spotid_t spot, readmask_t * readmask )
+{
+ SRASplitter * self = NULL;
+ rc_t rc = SRASplitter_ResolveSelf( cself, rcExecuting, &self );
+ if ( rc == 0 )
+ {
+ if ( self->type == eSplitterRead )
+ {
+ const SRASplitter_Keys* keys = NULL;
+ uint32_t key_qty = 0;
+ int32_t i, j, k;
+ make_readmask( used_readmasks );
+
+ clear_readmask( used_readmasks );
+ rc = self->GetKeySet( cself, &keys, &key_qty, spot, readmask );
+
+ for ( i = 0; rc == 0 && i < key_qty; i++ )
+ {
+ if ( keys[ i ].key != NULL && !isset_readmask( used_readmasks, i ) )
+ {
+ make_readmask( local_readmask );
+ copy_readmask( keys[ i ].readmask, local_readmask );
+ /* merge readmasks from duplicate keys in array */
+ for ( j = i + 1; j < key_qty; j++ )
+ {
+ if ( keys[ i ].key == keys[ j ].key || strcmp( keys[ i ].key, keys[ j ].key ) == 0 )
+ {
+ set_readmask( used_readmasks, j );
+ for ( k = 0; k < nreads_max; k++ )
+ {
+ local_readmask[ k ] |= keys[ j ].readmask[ k ];
+ }
+ }
+ }
+ /* leave reads only allowed by previous object in chain */
+#ifndef EUGNES_LOOP_FIX
+ for ( j = 0, k = 0; k < nreads_max; k++ )
+ {
+ local_readmask[ k ] &= readmask[ k ];
+ if ( isset_readmask( local_readmask, k ) )
+ {
+ j++;
+ }
+ }
+ if ( j > 0 )
+#endif
+ {
+ rc = SRASplitter_FindNextSplitter( self, keys[ i ].key );
+ if ( rc == 0 )
+ {
+ /* push spot to next splitter in chain */
+ rc = SRASplitterFiler_PushKey( self->last_found->key );
+ if ( rc == 0 )
+ {
+ /* here comes RECURSION!!! */
+ rc_t rc2;
+ rc = SRASplitter_AddSpot( self->last_found->child.splitter, spot, local_readmask );
+ rc2 = SRASplitterFiler_PopKey();
+ rc = rc ? rc : rc2;
+ }
+ }
+ }
+ }
+ }
+ }
+ else if ( self->type == eSplitterSpot )
+ {
+ const char* key = NULL;
+ make_readmask( new_readmask );
+ copy_readmask( readmask, new_readmask );
+ rc = self->GetKey( cself, &key, spot, new_readmask );
+ if ( rc == 0 && key != NULL )
+ {
+ int32_t j, k;
+ /* leave reads only allowed by previous object in chain */
+#ifndef EUGNES_LOOP_FIX
+ for( j = 0, k = 0; k < nreads_max; k++ )
+ {
+ readmask[ k ] &= new_readmask[ k ];
+ if ( isset_readmask( readmask, k ) )
+ {
+ j++;
+ }
+ }
+ if ( j > 0 )
+#endif
+ {
+ rc = SRASplitter_FindNextSplitter( self, key );
+ if ( rc == 0 )
+ {
+ /* push spot to next splitter in chain */
+ rc = SRASplitterFiler_PushKey( self->last_found->key );
+ if ( rc == 0 )
+ {
+ /* here comes RECURSION!!! */
+ rc_t rc2;
+ rc = SRASplitter_AddSpot( self->last_found->child.splitter, spot, readmask );
+ rc2 = SRASplitterFiler_PopKey();
+ rc = rc ? rc : rc2;
+ }
+ }
+ }
+ }
+ }
+ else if ( self->type == eSplitterFormat )
+ {
+ rc = self->Dump( cself, spot, readmask );
+ }
+ else
+ {
+ rc = RC( rcExe, rcFile, rcExecuting, rcInterface, rcUnsupported );
+ }
+ }
+ return rc;
+}
+
+
+rc_t SRASplitter_Release(const SRASplitter* cself)
+{
+ rc_t rc = 0;
+ SRASplitter* self = NULL;
+
+ if( cself != NULL ) {
+ if( (rc = SRASplitter_ResolveSelf(cself, rcExecuting, &self)) == 0 ) {
+ if( self->Release ) {
+ rc = self->Release(cself);
+ }
+ BSTreeWhack( &self->children, SRASplitter_Child_Whack, NULL );
+ free(self);
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitter_FileActivate(const SRASplitter* cself, const char* key)
+{
+ rc_t rc = 0, rc2 = 0;
+ SRASplitter* self = NULL;
+
+ if( (rc = SRASplitter_ResolveSelf(cself, rcExecuting, &self)) == 0 ) {
+ if( (rc = SRASplitterFiler_PushKey(key)) == 0 ) {
+ /* sets self->last_found */
+ rc = SRASplitter_FindNextFile(self, key);
+ rc2 = SRASplitterFiler_PopKey();
+ rc = rc ? rc : rc2;
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitter_FileWrite( const SRASplitter* cself, spotid_t spot, const void* buf, size_t size )
+{
+ SRASplitter* self = NULL;
+
+ rc_t rc = SRASplitter_ResolveSelf( cself, rcWriting, &self );
+ if ( rc == 0 )
+ {
+ if ( self->last_found == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcWriting, rcDirEntry, rcUnknown );
+ }
+ else if ( buf != NULL && size > 0 )
+ {
+ size_t writ = 0;
+ SRASplitterFile* f = ( SRASplitterFile* )( self->last_found->child.file );
+ rc = KFileWrite( f->file, f->pos, buf, size, &writ );
+ if ( rc == 0 )
+ {
+ f->pos += writ;
+ if ( f->curr_spot != spot && spot != 0 )
+ {
+ f->curr_spot = spot;
+ f->spot_qty = f->spot_qty + 1;
+ }
+ if ( g_filer->curr_spot != spot && spot != 0 )
+ {
+ g_filer->curr_spot = spot;
+ g_filer->spot_qty = g_filer->spot_qty + 1;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitter_FileWritePos( const SRASplitter* cself, spotid_t spot,
+ uint64_t pos, const void* buf, size_t size )
+{
+ SRASplitter* self = NULL;
+
+ rc_t rc = SRASplitter_ResolveSelf( cself, rcWriting, &self );
+ if ( rc == 0 )
+ {
+ if ( self->last_found == NULL )
+ {
+ rc = RC( rcExe, rcFile, rcWriting, rcDirEntry, rcUnknown );
+ }
+ else if ( buf != NULL && size > 0 )
+ {
+ const SRASplitterFile* f = self->last_found->child.file;
+ /* remember last position */
+ uint64_t old_pos = f->pos;
+ ( ( SRASplitterFile* ) f )->pos = pos;
+ /* write to requested position */
+ rc = SRASplitter_FileWrite( cself, spot, buf, size );
+ if ( f->pos < old_pos )
+ {
+ /* revert to last position if wrote less than it was */
+ ( ( SRASplitterFile* ) f )->pos = old_pos;
+ }
+ }
+ }
+ return rc;
+}
+
+/* ### Common splitter factory code ##################################################### */
+
+rc_t SRASplitterFactory_Make(const SRASplitterFactory** cself, ESRASplitterTypes type, size_t type_size,
+ SRASplitterFactory_Init_Func* init, SRASplitterFactory_NewObj_Func* newObj,
+ SRASplitterFactory_Release_Func* release)
+{
+ SRASplitterFactory* self = NULL;
+
+ if( cself == NULL || newObj == NULL ) {
+ return RC(rcExe, rcType, rcAllocating, rcParam, rcNull);
+ }
+ self = calloc(1, type_size + sizeof(*self));
+ if( self == NULL ) {
+ return RC(rcExe, rcType, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->magic = SRASplitterFactory_MAGIC;
+ self->type = type;
+ self->Init = init;
+ self->NewObj = newObj;
+ self->Release = release;
+
+ /* shift pointer to after hidden structure */
+ self++;
+ *cself = self;
+ return 0;
+}
+
+static
+rc_t SRASplitterFactory_ResolveSelf(const SRASplitterFactory* self, enum RCContext ctx, SRASplitterFactory** resolved)
+{
+ if( self == NULL || resolved == NULL ) {
+ return RC(rcExe, rcType, ctx, rcSelf, rcNull);
+ }
+ *resolved = (SRASplitterFactory*)--self;
+ /* just to validate that it is full instance */
+ if( (*resolved)->magic != SRASplitterFactory_MAGIC ) {
+ *resolved = NULL;
+ return RC(rcExe, rcType, ctx, rcMemory, rcCorrupt);
+ }
+ return 0;
+}
+
+void SRASplitterFactory_Release(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ SRASplitterFactory* self = NULL;
+
+ if( cself != NULL ) {
+ if( (rc = SRASplitterFactory_ResolveSelf(cself, rcReleasing, &self)) == 0 ) {
+ SRASplitterFactory_Release(self->next);
+ if( self->Release != NULL ) {
+ self->Release(cself);
+ }
+ free(self);
+ }
+ }
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "SRASplitterFactory");
+ }
+}
+
+ESRASplitterTypes SRASplitterFactory_GetType(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ SRASplitterFactory* self = NULL;
+
+ if( (rc = SRASplitterFactory_ResolveSelf(cself, rcClassifying, &self)) == 0 ) {
+ return self->type;
+ }
+ LOGERR(klogErr, rc, "SRASplitterFactory");
+ return 0;
+}
+
+rc_t SRASplitterFactory_AddNext(const SRASplitterFactory* cself, const SRASplitterFactory* next)
+{
+ rc_t rc = 0;
+ SRASplitterFactory* self = NULL;
+
+ if( (rc = SRASplitterFactory_ResolveSelf(cself, rcAttaching, &self)) == 0 ) {
+ if( self->type == eSplitterFormat && next != NULL ) {
+ /* formatter must be last in chain */
+ rc = RC(rcExe, rcType, rcAttaching, rcConstraint, rcViolated);
+ } else {
+ SRASplitterFactory_Release(self->next);
+ self->next = next;
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ SRASplitterFactory* self = NULL;
+
+ if( (rc = SRASplitterFactory_ResolveSelf(cself, rcConstructing, &self)) == 0 ) {
+ if( self->Init ) {
+ rc = self->Init(cself);
+ }
+ if( rc == 0 ) {
+ if( self->next != NULL ) {
+ rc = SRASplitterFactory_Init(self->next);
+ } else if( self->type != eSplitterFormat ) {
+ /* formatter must be last in chain */
+ rc = RC(rcExe, rcType, rcConstructing, rcConstraint, rcViolated);
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRASplitterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ SRASplitterFactory* self = NULL;
+
+ if( (rc = SRASplitterFactory_ResolveSelf(cself, rcConstructing, &self)) == 0 ) {
+ if( (rc = self->NewObj(cself, splitter)) == 0 ) {
+ SRASplitter* sp = NULL;
+ if( (rc = SRASplitter_ResolveSelf(*splitter, rcConstructing, &sp)) == 0 ) {
+ sp->type = self->type;
+ if( (self->type == eSplitterSpot && (!sp->GetKey || sp->GetKeySet || sp->Dump) ) ||
+ (self->type == eSplitterRead && ( sp->GetKey || !sp->GetKeySet || sp->Dump) ) ||
+ (self->type == eSplitterFormat && ( sp->GetKey || sp->GetKeySet || !sp->Dump) ) ) {
+ SRASplitter_Release(*splitter);
+ *splitter = NULL;
+ rc = RC(rcExe, rcType, rcAllocating, rcInterface, rcInvalid);
+ } else if(self->type != eSplitterFormat) {
+ sp->next_fact = self->next;
+ }
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-dump/factory.h b/tools/sra-dump/factory.h
new file mode 100644
index 0000000..dd9d105
--- /dev/null
+++ b/tools/sra-dump/factory.h
@@ -0,0 +1,194 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_tools_dump_factory
+#define _h_tools_dump_factory
+
+#include <klib/rc.h>
+#include <kfs/file.h>
+#include <klib/data-buffer.h>
+#include <sra/sradb.h>
+
+#define DATABUFFER_INC_SZ 4096
+
+/* KDataBuffer is used as byte buffer-only here! */
+#define IF_BUF(expr, buf, writ) \
+ while( (rc = (expr)) != 0 && \
+ (GetRCObject(rc) == rcMemory || GetRCObject(rc) == ( enum RCObject )rcBuffer) && \
+ (GetRCState(rc) == rcInsufficient || GetRCState(rc) == rcExhausted) ) { \
+ SRA_DUMP_DBG(10, ("\n%s grow buffer from %u to %u\n", __func__, buf->elem_count, writ + DATABUFFER_INC_SZ)); \
+ if( (rc = KDataBufferResize(buf, writ + DATABUFFER_INC_SZ)) != 0 ) { \
+ break; \
+ } \
+ } \
+ if( rc == 0 )
+
+typedef enum {
+ eSplitterSpot = 1,
+ eSplitterRead,
+ eSplitterFormat /* in splitters chain this type must be the last instance and must write to file(s) */
+} ESRASplitterTypes;
+
+typedef struct SRASplitter SRASplitter;
+
+#define NREADS_MAX (8*1024)
+typedef uint8_t readmask_t;
+extern uint32_t nreads_max;
+
+/* new hack to realize changed requirement for quality-filter */
+#define DEF_QUAL_N_LIMIT 10
+extern uint32_t quality_N_limit;
+
+extern bool g_legacy_report;
+
+#define make_readmask(m) readmask_t m[NREADS_MAX]
+#define copy_readmask(src,dst) (memmove(dst, src, sizeof(readmask_t) * nreads_max))
+#define reset_readmask(m) (memset(m, ~0, sizeof(readmask_t) * nreads_max))
+#define clear_readmask(m) (memset(m, 0, sizeof(readmask_t) * nreads_max))
+#define set_readmask(m,id) (id < nreads_max ? (m)[id] = 1 : 0)
+#define unset_readmask(m,id) (id < nreads_max ? (m)[id] = 0 : 0)
+#define get_readmask(m,id) (id < nreads_max ? ((m)[id]) : 0)
+#define isset_readmask(m,id) (id < nreads_max ? (m)[id] != 0 : false)
+
+typedef struct SRASplitter_Keys_struct {
+ const char* key;
+ make_readmask(readmask);
+} SRASplitter_Keys;
+
+/* for eSpot splitter: returns pointer to key and (optionally) modified readmask, based on spotid and readmask
+ key == NULL stops further processing of the spot, char* key alloc and dealloc must be handled by splitter itself
+ */
+typedef rc_t (SRASplitter_GetKey_Func)(const SRASplitter* self, const char** key, spotid_t spot, readmask_t* readmask);
+
+/* for eRead splitter:
+ returns array of keys and readmasks used array portion count in keys, based on spotid and readmask,
+ on return keys shows number of array key[] elements used, keys == 0 stops further processing of the spot,
+ elements with key.key == NULL OR key.readmask == 0 are skipped
+ key alloc and dealloc must be handled by splitter itself
+*/
+typedef rc_t (SRASplitter_GetKeySet_Func)(const SRASplitter* self, const SRASplitter_Keys** key, uint32_t* keys, spotid_t spot, const readmask_t* readmask);
+
+/* writes data to file(s) using SRASplitter_File* functions, based on spot and readmask
+ do NOT open or create any files directly here, use SRASplitter_FileXXX functions only!
+*/
+typedef rc_t (SRASplitter_Dump_Func)(const SRASplitter* self, spotid_t spot, const readmask_t* readmask);
+
+/* optional method to free splitter resources, object distruction is handled automatically, do NOT free self! */
+typedef rc_t (SRASplitter_Release_Func)(const SRASplitter* self);
+
+/**
+ * Base type constructor, must be called when constructing custom splitter type
+ */
+rc_t SRASplitter_Make(const SRASplitter** self, size_t type_size, /* sizeof(derived object) */
+ /* mandatory only for eSpot splitter, must be NULL for other types */
+ SRASplitter_GetKey_Func*,
+ /* mandatory only for eRead splitter, must be NULL for other types */
+ SRASplitter_GetKeySet_Func*,
+ /* mandatory only for eFormat splitter, must be NULL for other types */
+ SRASplitter_Dump_Func*,
+ /* optional destructor, do NOT free self! */
+ SRASplitter_Release_Func* release);
+/**
+ * Base type destructor
+ */
+rc_t SRASplitter_Release(const SRASplitter* self);
+
+/**
+ * Add spot to processing chain
+ */
+rc_t SRASplitter_AddSpot(const SRASplitter* self, spotid_t spot, readmask_t* readmask);
+
+/**
+ * File access routines
+ */
+/* key [IN] - usually file type extension: .sff, .fastq, _nse.txt, etc */
+rc_t SRASplitter_FileActivate(const SRASplitter* self, const char* key);
+/* CAREFULL!!! these operates on last active file
+ spot can be zero to indicate file header/footer
+ which no considered as actual data and file treated as empty if no actual spots is written
+ */
+rc_t SRASplitter_FileWrite( const SRASplitter* cself, spotid_t spot, const void* buf, size_t size );
+rc_t SRASplitter_FileWritePos( const SRASplitter* cself, spotid_t spot, uint64_t pos, const void* buf, size_t size );
+
+typedef struct SRASplitterFactory SRASplitterFactory;
+
+typedef rc_t (SRASplitterFactory_Init_Func)(const SRASplitterFactory* self);
+typedef rc_t (SRASplitterFactory_NewObj_Func)(const SRASplitterFactory* self, const SRASplitter** splitter);
+typedef void (SRASplitterFactory_Release_Func)(const SRASplitterFactory* self);
+
+
+/**
+ * Initialize factories file handler object.
+ * Must be called BEFORE 1st call to SRASplitterFactory_Init
+ *
+ * key_as_dir [IN] - if true, subdirs created for each splitting level: SPOT_GROUP/1/prefix.fastq
+ * if false, single file is used in split chain: prefix_SPOT_GROUP_1.fastq
+ * prefix [IN] - file name prefix, usually run id (accession)
+ * path, ... [IN] - path to directory where file will reside
+ */
+rc_t SRASplitterFactory_FilerInit(bool to_stdout, bool gzip, bool bzip2, bool key_as_dir, bool keep_empty, const char* path, ...);
+/* this only works correctly on top of the splitter tree !! */
+rc_t SRASplitterFactory_FilerPrefix(const char* prefix);
+void SRASplitterFactory_FilerReport(uint64_t* total, uint64_t* biggest_file);
+void SRASplitterFiler_Release(void);
+
+/**
+ * Create factory object
+ */
+rc_t SRASplitterFactory_Make(const SRASplitterFactory** self, ESRASplitterTypes type, size_t type_size,
+ /* optional method to initialize self */
+ SRASplitterFactory_Init_Func* init,
+ /* mandatory method to spawn new SRASplitter object */
+ SRASplitterFactory_NewObj_Func* newObj,
+ /* optional destructor, should NOT free self!!! */
+ SRASplitterFactory_Release_Func* release);
+
+/**
+ * Releases Factory and all chained factories
+ */
+void SRASplitterFactory_Release(const SRASplitterFactory* self);
+
+/**
+ * Get Factory type
+ */
+ESRASplitterTypes SRASplitterFactory_GetType(const SRASplitterFactory* self);
+
+/**
+ * Chain "next" factory after "self", releases old chain if present
+ */
+rc_t SRASplitterFactory_AddNext(const SRASplitterFactory* self, const SRASplitterFactory* next);
+
+/**
+ * Initialize a chain of factories. Factories must be chaind properly before init.
+ * Type chain must look like (eSpot|eRead)*, eFormat.
+ */
+rc_t SRASplitterFactory_Init(const SRASplitterFactory* self);
+
+/**
+ * Create new instance of factory kind, point splitter to next factory in chain
+ */
+rc_t SRASplitterFactory_NewObj(const SRASplitterFactory* self, const SRASplitter** splitter);
+
+#endif /* _h_tools_dump_factory */
diff --git a/tools/sra-dump/fasta_dump.c b/tools/sra-dump/fasta_dump.c
new file mode 100644
index 0000000..2ef3ac9
--- /dev/null
+++ b/tools/sra-dump/fasta_dump.c
@@ -0,0 +1,752 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/printf.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/buffile.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+
+#include <vdb/manager.h>
+
+#include <align/manager.h>
+#include <align/reference.h>
+
+#include <sra/srapath.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+static bool string_ends_with( const char * s, const char * pattern )
+{
+ const char * found = strstr ( s, pattern );
+ if ( found == NULL )
+ return false;
+ else
+ {
+ size_t len_string = string_size ( s );
+ size_t len_pattern = string_size ( pattern );
+ size_t found_at = ( found - s );
+ return ( found_at == ( len_string - len_pattern ) );
+ }
+}
+
+
+static char * fasta_ref = "--fastaref";
+
+/* we have to test if argv[0] ends in 'fastq-dump' or 'fastq-dump.exe',
+ and we have an argument called '--fasta' */
+bool fasta_dump_requested( int argc, char* argv[] )
+{
+ if ( string_ends_with( argv[ 0 ], "fastq-dump" ) ||
+ string_ends_with( argv[ 0 ], "fastq-dump.exe" ) )
+ {
+ int i;
+ for ( i = 1; i < argc; ++i )
+ {
+ if ( strcmp( argv[ i ], fasta_ref ) == 0 )
+ return true;
+ }
+ }
+
+ return false;
+}
+
+#define OPTION_OUTF "outfile"
+#define ALIAS_OUTF "o"
+
+#define OPTION_WIDTH "width"
+#define ALIAS_WIDTH "w"
+
+#define OPTION_GZIP "gzip"
+#define ALIAS_GZIP NULL
+
+#define OPTION_BZIP "bzip2"
+#define ALIAS_BZIP NULL
+
+#define OPTION_REFNAME "refname"
+#define ALIAS_REFNAME "r"
+
+#define OPTION_FROM "from"
+#define ALIAS_FROM "N"
+
+#define OPTION_LENGTH "length"
+#define ALIAS_LENGTH "X"
+
+#define OPTION_FAREF "fastaref"
+#define ALIAS_FAREF NULL
+
+
+OptDef MyOptions[] =
+{
+ /*name, alias, hfkt, usage-help, maxcount, needs value, required */
+ { OPTION_OUTF, ALIAS_OUTF, NULL, NULL, 1, true, false },
+ { OPTION_WIDTH, ALIAS_WIDTH, NULL, NULL, 1, true, false },
+ { OPTION_GZIP, ALIAS_GZIP, NULL, NULL, 1, false, false },
+ { OPTION_BZIP, ALIAS_BZIP, NULL, NULL, 1, false, false },
+ { OPTION_REFNAME, ALIAS_REFNAME, NULL, NULL, 0, true, false },
+ { OPTION_FROM, ALIAS_FROM, NULL, NULL, 1, true, false },
+ { OPTION_LENGTH, ALIAS_LENGTH, NULL, NULL, 1, true, false },
+ { OPTION_FAREF, ALIAS_FAREF, NULL, NULL, 1, false, false }
+};
+
+
+/* =========================================================================================== */
+
+
+/* GLOBAL VARIABLES */
+struct {
+ KWrtWriter org_writer;
+ void* org_data;
+ KFile* kfile;
+ uint64_t pos;
+} g_out_writer = { NULL };
+
+
+/* =========================================================================================== */
+
+static rc_t get_str_option( const Args *args, const char *name, const char ** res )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ *res = NULL;
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else
+ {
+ if ( count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void **)res );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionValue() failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t get_bool_option( const Args *args, const char *name, bool *res, const bool def )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ *res = true;
+ }
+ else
+ {
+ *res = def;
+ }
+ return rc;
+}
+
+
+static rc_t get_int_option( const Args *args, const char *name, uint32_t *res, const uint32_t def )
+{
+ const char * s;
+ rc_t rc = get_str_option( args, name, &s );
+ *res = def;
+ if ( rc == 0 && s != NULL )
+ {
+ *res = atoi( s );
+ }
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t CC BufferedWriter ( void* self, const char* buffer, size_t bufsize, size_t* num_writ )
+{
+ rc_t rc = 0;
+
+ assert( buffer != NULL );
+ assert( num_writ != NULL );
+
+ do {
+ rc = KFileWrite( g_out_writer.kfile, g_out_writer.pos, buffer, bufsize, num_writ );
+ if ( rc == 0 )
+ {
+ buffer += *num_writ;
+ bufsize -= *num_writ;
+ g_out_writer.pos += *num_writ;
+ }
+ } while ( rc == 0 && bufsize > 0 );
+ return rc;
+}
+
+
+static rc_t set_stdout_to( bool gzip, bool bzip2, const char * filename, size_t bufsize )
+{
+ rc_t rc = 0;
+ if ( gzip && bzip2 )
+ {
+ rc = RC( rcApp, rcFile, rcConstructing, rcParam, rcAmbiguous );
+ }
+ else
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ else
+ {
+ KFile *of;
+ rc = KDirectoryCreateFile ( dir, &of, false, 0664, kcmInit, "%s", filename );
+ if ( rc == 0 )
+ {
+ KFile *buf;
+ if ( gzip )
+ {
+ KFile *gz;
+ rc = KFileMakeGzipForWrite( &gz, of );
+ if ( rc == 0 )
+ {
+ KFileRelease( of );
+ of = gz;
+ }
+ }
+ if ( bzip2 )
+ {
+ KFile *bz;
+ rc = KFileMakeBzip2ForWrite( &bz, of );
+ if ( rc == 0 )
+ {
+ KFileRelease( of );
+ of = bz;
+ }
+ }
+
+ rc = KBufFileMakeWrite( &buf, of, false, bufsize );
+ if ( rc == 0 )
+ {
+ g_out_writer.kfile = buf;
+ g_out_writer.org_writer = KOutWriterGet();
+ g_out_writer.org_data = KOutDataGet();
+ rc = KOutHandlerSet( BufferedWriter, &g_out_writer );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ KFileRelease( of );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
+
+
+static void release_stdout_redirection( void )
+{
+ KFileRelease( g_out_writer.kfile );
+ if( g_out_writer.org_writer != NULL )
+ {
+ KOutHandlerSet( g_out_writer.org_writer, g_out_writer.org_data );
+ }
+ g_out_writer.org_writer = NULL;
+}
+
+
+static rc_t CC write_to_FILE( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+
+/* =========================================================================================== */
+
+typedef struct fasta_options
+{
+ uint32_t width;
+ bool gzip;
+ bool bzip;
+ const char * outfile;
+ INSDC_coord_zero from;
+ INSDC_coord_len length;
+} fasta_options;
+
+
+static rc_t get_fasta_options( Args * args, fasta_options *opts )
+{
+ rc_t rc = get_int_option( args, OPTION_WIDTH, &opts->width, 80 );
+
+ if ( rc == 0 )
+ rc = get_str_option( args, OPTION_OUTF, &opts->outfile );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_GZIP, &opts->gzip, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_BZIP, &opts->bzip, false );
+
+ if ( rc == 0 )
+ {
+ uint32_t x;
+ rc = get_int_option( args, OPTION_FROM, &x, 0 );
+ if ( rc == 0 )
+ opts->from = x;
+ }
+
+ if ( rc == 0 )
+ {
+ uint32_t x;
+ rc = get_int_option( args, OPTION_LENGTH, &x, 0 );
+ if ( rc == 0 )
+ opts->length = x;
+ }
+
+ return rc;
+}
+
+/* =========================================================================================== */
+
+#if TOOLS_USE_SRAPATH != 0
+static bool is_this_a_filesystem_path( const char * path )
+{
+ bool res = false;
+ size_t i, n = string_size ( path );
+ for ( i = 0; i < n && !res; ++i )
+ {
+ char c = path[ i ];
+ res = ( c == '.' || c == '/' || c == '\\' );
+ }
+ return res;
+}
+#endif
+
+#if TOOLS_USE_SRAPATH != 0
+static char *translate_accession( SRAPath *my_sra_path,
+ const char *accession,
+ const size_t bufsize )
+{
+ rc_t rc;
+ char * res = calloc( 1, bufsize );
+ if ( res == NULL ) return NULL;
+
+ rc = SRAPathFind( my_sra_path, accession, res, bufsize );
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ free( res );
+ return NULL;
+ }
+ else if ( GetRCState( rc ) == rcInsufficient )
+ {
+ free( res );
+ return translate_accession( my_sra_path, accession, bufsize * 2 );
+ }
+ else if ( rc != 0 )
+ {
+ free( res );
+ return NULL;
+ }
+ return res;
+}
+#endif
+
+#if TOOLS_USE_SRAPATH != 0
+static rc_t resolve_accession( const KDirectory *my_dir, char ** path )
+{
+ SRAPath *my_sra_path;
+ rc_t rc = 0;
+
+ if ( strchr ( *path, '/' ) != NULL )
+ return 0;
+
+ rc = SRAPathMake( &my_sra_path, my_dir );
+ if ( rc != 0 )
+ {
+ if ( GetRCState ( rc ) != rcNotFound || GetRCTarget ( rc ) != rcDylib )
+ {
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "SRAPathMake() failed" );
+ }
+ else
+ rc = 0;
+ }
+ else
+ {
+ if ( !SRAPathTest( my_sra_path, *path ) )
+ {
+ char *buf = translate_accession( my_sra_path, *path, 64 );
+ if ( buf != NULL )
+ {
+ free( (char*)(*path) );
+ *path = buf;
+ }
+ }
+ SRAPathRelease( my_sra_path );
+ }
+ return rc;
+}
+#endif
+
+/* =========================================================================================== */
+
+
+typedef struct fasta_ctx
+{
+ KDirectory *dir;
+ const VDBManager *vdb_mgr;
+ const AlignMgr *almgr;
+} fasta_ctx;
+
+
+static rc_t dump_reference_loop( fasta_options *opts, const ReferenceObj* refobj )
+{
+ rc_t rc = 0;
+ uint8_t * buffer = malloc( opts->width + 2 );
+ if ( buffer == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcListing, rcMemory, rcExhausted );
+ LOGERR( klogInt, rc, "allocating reference-buffer failed!" );
+ }
+ else
+ {
+ INSDC_coord_zero pos = opts->from;
+ INSDC_coord_len w = opts->length;
+
+ while ( w > 0 && rc == 0 )
+ {
+ INSDC_coord_len written;
+ INSDC_coord_len to_read = ( w > opts->width ? opts->width : w );
+ rc = ReferenceObj_Read( refobj, pos, to_read, buffer, &written );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceObj_Read() failed" );
+ else
+ {
+ OUTMSG(( "%.*s\n", written, buffer ));
+ w -= written;
+ pos += written;
+ }
+ }
+ free( buffer );
+ }
+ return rc;
+}
+
+
+static rc_t dump_reference( fasta_options *opts, const ReferenceObj* refobj )
+{
+ const char * name;
+ rc_t rc = ReferenceObj_Name( refobj, &name );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceObj_Name() failed!" );
+ else
+ {
+ INSDC_coord_len seq_len;
+ rc = ReferenceObj_SeqLength( refobj, &seq_len );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceObj_SeqLength() failed!" );
+ else
+ {
+ if ( opts->from == 0 )
+ {
+ if ( opts->length == 0 )
+ opts->length = seq_len;
+ }
+ else
+ {
+ if ( opts->length == 0 )
+ opts->length = ( seq_len - opts->from );
+ }
+ if ( opts->from >= seq_len )
+ {
+ rc = RC( rcExe, rcNoTarg, rcListing, rcParam, rcInvalid );
+ LOGERR( klogInt, rc, "reference-start-point beyond reference-end!" );
+ }
+ else
+ {
+ if ( opts->from + opts->length > seq_len )
+ opts->length = ( seq_len - opts->from );
+ OUTMSG(( ">%s|from %u|%u bases\n", name, opts->from, opts->from + opts->length -1 ));
+ rc = dump_reference_loop( opts, refobj );
+ }
+ }
+ }
+ return 0;
+}
+
+
+static rc_t dump_all_reference( fasta_options *opts, const ReferenceList* reflist )
+{
+ uint32_t count;
+ rc_t rc = ReferenceList_Count( reflist, &count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceList_Count() failed!" );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const ReferenceObj* refobj;
+ rc = ReferenceList_Get( reflist, &refobj, i );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceList_Get() failed!" );
+ else
+ rc = dump_reference( opts, refobj );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t foreach_refname( Args * args, fasta_options *opts, fasta_ctx *ctx, const char * path )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, OPTION_REFNAME, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionCount( REFNAME ) failed" );
+ }
+ else
+ {
+ const ReferenceList* reflist;
+
+ rc = ReferenceList_MakePath( &reflist, ctx->vdb_mgr, path,
+ ereferencelist_usePrimaryIds, 0, NULL, 0 );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceList_MakePath() failed!" );
+ else
+ {
+ if ( count == 0 )
+ {
+ /* dump all references... */
+ rc = dump_all_reference( opts, reflist );
+ }
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * refname;
+ rc = ArgsOptionValue( args, OPTION_REFNAME, 0, (const void **)&refname );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionValue( REFNAME ) failed" );
+ }
+ else
+ {
+ const ReferenceObj* refobj;
+ rc = ReferenceList_Find( reflist, &refobj, refname, string_size( refname ) );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ReferenceList_Find() failed" );
+ else
+ rc = dump_reference( opts, refobj );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t foreach_argument( Args * args, fasta_options *opts, fasta_ctx *ctx )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ else
+ {
+ uint32_t idx;
+ if ( count < 1 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcListing, rcParam, rcEmpty );
+ LOGERR( klogInt, rc, "no source-files given!" );
+ }
+ else
+ {
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *param = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)¶m );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ArgsParamvalue() failed" );
+ else
+ {
+ char *path = string_dup_measure ( param, NULL );
+ if ( path == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcListing, rcMemory, rcExhausted );
+ LOGERR( klogInt, rc, "allocating path to source-file failed!" );
+ }
+ else
+ {
+
+#if TOOLS_USE_SRAPATH != 0
+ if ( !is_this_a_filesystem_path( path ) )
+ {
+ rc = resolve_accession( ctx->dir, &path );
+ }
+#endif
+
+ if ( rc == 0 )
+ {
+ rc = foreach_refname( args, opts, ctx, path );
+ }
+ free( path );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t fasta_main( Args * args, fasta_options *opts )
+{
+ rc_t rc;
+ fasta_ctx ctx;
+
+ memset( &ctx, 0, sizeof ctx );
+ rc = KDirectoryNativeDir( &ctx.dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ else
+ {
+ rc = VDBManagerMakeRead ( &ctx.vdb_mgr, ctx.dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ else
+ {
+ rc = AlignMgrMakeRead ( &ctx.almgr );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "AlignMgrMake() failed" );
+ else
+ {
+ rc = foreach_argument( args, opts, &ctx );
+ AlignMgrRelease ( ctx.almgr );
+ }
+ VDBManagerRelease( ctx.vdb_mgr );
+ }
+ KDirectoryRelease( ctx.dir );
+ }
+ return rc;
+}
+
+/* =========================================================================================== */
+
+
+rc_t fasta_dump( int argc, char* argv[] )
+{
+ rc_t rc = KOutHandlerSet( write_to_FILE, stdout );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ else
+ {
+ Args * args;
+
+ KLogHandlerSetStdErr();
+ rc = ArgsMakeAndHandle( &args, argc, argv, 1,
+ MyOptions, sizeof MyOptions / sizeof MyOptions [ 0 ] );
+ if ( rc == 0 )
+ {
+ fasta_options opts;
+ rc = get_fasta_options( args, &opts );
+ if ( rc == 0 )
+ {
+ if ( opts.outfile != NULL )
+ {
+ rc = set_stdout_to( opts.gzip,
+ opts.bzip,
+ opts.outfile,
+ 32 * 1024 );
+ }
+
+ if ( rc == 0 )
+ {
+ /* ============================== */
+ rc = fasta_main( args, &opts );
+ /* ============================== */
+ }
+
+ if ( opts.outfile != NULL )
+ release_stdout_redirection();
+ }
+ ArgsWhack( args );
+ }
+ }
+ return rc;
+}
+
+
+static const char * outf_usage[] = { "output to stdout if omitted", NULL };
+static const char * width_usage[] = { "default = 80 bases", NULL };
+static const char * gzip_usage[] = { "for file and stdout", NULL };
+static const char * bzip_usage[] = { "for file and stdout", NULL };
+static const char * refname_usage[] = { "multiple ref's permitted", NULL };
+static const char * from_usage[] = { "zero-based", NULL };
+static const char * length_usage[] = { NULL };
+
+rc_t CC fasta_dump_usage ( const Args * args )
+{
+ rc_t rc;
+ const char * fullname = "fastq-dump";
+ const char * progname = fullname;
+
+ if ( args == NULL )
+ rc = RC( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram( args, &fullname, &progname );
+
+ KOutMsg( "\nUsage:\n"
+ " %s <path> [options]\n"
+ "\n", progname );
+
+ KOutMsg( "Options:\n" );
+
+ HelpOptionLine( ALIAS_OUTF, OPTION_OUTF, "output-file", outf_usage );
+ HelpOptionLine( ALIAS_WIDTH, OPTION_WIDTH, "bases per line", width_usage );
+ HelpOptionLine( ALIAS_GZIP, OPTION_GZIP, "output gzipped", gzip_usage );
+ HelpOptionLine( ALIAS_BZIP, OPTION_BZIP, "output bzipped", bzip_usage );
+ HelpOptionLine( ALIAS_REFNAME, OPTION_REFNAME, "reference to dump", refname_usage );
+ HelpOptionLine( ALIAS_FROM, OPTION_FROM, "start-offset", from_usage );
+ HelpOptionLine( ALIAS_LENGTH, OPTION_LENGTH, "length of sequence", length_usage );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullname, KAppVersion() );
+ return rc;
+}
diff --git a/tools/sra-dump/fasta_dump.h b/tools/sra-dump/fasta_dump.h
new file mode 100644
index 0000000..9d3fe8a
--- /dev/null
+++ b/tools/sra-dump/fasta_dump.h
@@ -0,0 +1,36 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_fasta_dump_hdr_
+#define _h_fasta_dump_hdr_
+
+
+bool fasta_dump_requested( int argc, char* argv[] );
+
+rc_t fasta_dump( int argc, char* argv[] );
+
+rc_t CC fasta_dump_usage ( const Args * args );
+
+#endif
diff --git a/tools/sra-dump/fastq.c b/tools/sra-dump/fastq.c
new file mode 100644
index 0000000..7f37f4b
--- /dev/null
+++ b/tools/sra-dump/fastq.c
@@ -0,0 +1,3800 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/container.h>
+#include <klib/text.h>
+#include <kapp/main.h>
+
+#include <sra/sradb.h>
+#include <sra/types.h>
+#include <sra/fastq.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <strtol.h>
+
+#include "core.h"
+#include "debug.h"
+
+#define DATABUFFERINITSIZE 10240
+
+typedef struct TAlignedRegion_struct
+{
+ const char* name;
+ uint32_t name_len;
+ /* 1-based, 0 - means not set */
+ uint64_t from;
+ uint64_t to;
+} TAlignedRegion;
+
+
+typedef struct TMatepairDistance_struct
+{
+ uint64_t from;
+ uint64_t to;
+} TMatepairDistance;
+
+
+struct FastqArgs_struct
+{
+ bool is_platform_cs_native;
+
+ int maxReads;
+ bool skipTechnical;
+
+ uint32_t minReadLen;
+ bool applyClip;
+ bool dumpOrigFmt;
+ bool dumpBase;
+ bool dumpCs;
+ bool readIds;
+ bool SuppressQualForCSKey; /* added Jan 15th 2014 ( a new fastq-variation! ) */
+ int offset;
+ bool qual_filter;
+ bool qual_filter1;
+ const char* b_deffmt;
+ SLList* b_defline;
+ const char* q_deffmt;
+ SLList* q_defline;
+ const char *desiredCsKey;
+ bool split_files;
+ bool split_3;
+ bool split_spot;
+ uint64_t fasta;
+ const char* file_extension;
+ bool aligned;
+ bool unaligned;
+ TAlignedRegion* alregion;
+ uint32_t alregion_qty;
+ bool mp_dist_unknown;
+ TMatepairDistance* mp_dist;
+ uint32_t mp_dist_qty;
+} FastqArgs;
+
+
+typedef enum DefNodeType_enum
+{
+ DefNode_Unknown = 0,
+ DefNode_Text = 1,
+ DefNode_Optional,
+ DefNode_Accession,
+ DefNode_SpotId,
+ DefNode_SpotName,
+ DefNode_SpotGroup,
+ DefNode_SpotLen,
+ DefNode_ReadId,
+ DefNode_ReadName,
+ DefNode_ReadLen,
+ DefNode_Last
+} DefNodeType;
+
+
+typedef struct DefNode_struct
+{
+ SLNode node;
+ DefNodeType type;
+ union
+ {
+ SLList* optional;
+ char* text;
+ } data;
+} DefNode;
+
+
+typedef struct DeflineData_struct
+{
+ rc_t rc;
+ bool optional;
+ union
+ {
+ spotid_t* id;
+ struct
+ {
+ const char* s;
+ size_t sz;
+ } str;
+ uint32_t* u32;
+ } values[ DefNode_Last ];
+ char* buf;
+ size_t buf_sz;
+ size_t* writ;
+} DeflineData;
+
+
+static bool CC Defline_Builder( SLNode *node, void *data )
+{
+ DefNode* n = ( DefNode* )node;
+ DeflineData* d = ( DeflineData* )data;
+ char s[ 256 ];
+ size_t w;
+ int x = 0;
+
+ s[ 0 ] = '\0';
+ switch ( n->type )
+ {
+ case DefNode_Optional :
+ d->optional = true;
+ w = *d->writ;
+ *d->writ = 0;
+ SLListDoUntil( n->data.optional, Defline_Builder, data );
+ x = ( *d->writ == 0 ) ? 0 : 1;
+ d->optional = false;
+ *d->writ = w;
+ if ( x > 0 )
+ {
+ SLListDoUntil( n->data.optional, Defline_Builder, data );
+ }
+ break;
+
+ case DefNode_Text :
+ if ( d->optional )
+ {
+ break;
+ }
+ d->values[n->type].str.s = n->data.text;
+ d->values[n->type].str.sz = strlen( n->data.text );
+
+ case DefNode_Accession :
+ case DefNode_SpotName :
+ case DefNode_SpotGroup :
+ case DefNode_ReadName :
+ if ( d->values[n->type].str.s != NULL )
+ {
+ x = d->values[ n->type ].str.sz;
+ if ( x < sizeof( s ) )
+ {
+ strncpy( s, d->values[ n->type ].str.s, x );
+ s[ x ] = '\0';
+ *d->writ = *d->writ + x;
+ }
+ else
+ {
+ d->rc = RC( rcExe, rcNamelist, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ }
+ break;
+
+ case DefNode_SpotId :
+ if ( d->values[ n->type ].id != NULL &&
+ ( !d->optional || *d->values[ n->type ].id > 0 ) )
+ {
+ x = snprintf( s, sizeof( s ), "%ld", *d->values[ n->type ].id );
+ if ( x < 0 || x >= sizeof( s ) )
+ {
+ d->rc = RC( rcExe, rcNamelist, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ *d->writ = *d->writ + x;
+ }
+ }
+ break;
+
+ case DefNode_ReadId :
+ case DefNode_SpotLen :
+ case DefNode_ReadLen :
+ if ( d->values[ n->type] .u32 != NULL &&
+ ( !d->optional || *d->values[ n->type ].u32 > 0 ) )
+ {
+ x = snprintf( s, sizeof( s ), "%u", *d->values[ n->type ].u32 );
+ if ( x < 0 || x >= sizeof( s ) )
+ {
+ d->rc = RC( rcExe, rcNamelist, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ *d->writ = *d->writ + x;
+ }
+ }
+ break;
+
+ default:
+ d->rc = RC( rcExe, rcNamelist, rcExecuting, rcId, rcInvalid );
+ } /* switch */
+
+ if ( d->rc == 0 && !d->optional && n->type != DefNode_Optional )
+ {
+ if ( *d->writ < d->buf_sz )
+ {
+ strcat( d->buf, s );
+ }
+ else
+ {
+ d->rc = RC( rcExe, rcNamelist, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ }
+ return d->rc != 0;
+}
+
+
+static rc_t Defline_Bind( DeflineData* data, const char* accession,
+ spotid_t* spotId, const char* spot_name, size_t spotname_sz,
+ const char* spot_group, size_t sgrp_sz, uint32_t* spot_len,
+ uint32_t* readId, const char* read_name, INSDC_coord_len rlabel_sz,
+ INSDC_coord_len* read_len )
+{
+ if ( data == NULL )
+ {
+ return RC( rcExe, rcNamelist, rcExecuting, rcMemory, rcInsufficient );
+ }
+ data->values[ DefNode_Unknown ].str.s = NULL;
+ data->values[ DefNode_Text ].str.s = NULL;
+ data->values[ DefNode_Optional ].str.s = NULL;
+ data->values[ DefNode_Accession ].str.s = accession;
+ data->values[ DefNode_Accession ].str.sz = strlen( accession );
+ data->values[ DefNode_SpotId ].id = spotId;
+ data->values[ DefNode_SpotName ].str.s = spot_name;
+ data->values[ DefNode_SpotName ].str.sz = spotname_sz;
+ data->values[ DefNode_SpotGroup ].str.s = spot_group;
+ data->values[ DefNode_SpotGroup ].str.sz = sgrp_sz;
+ data->values[ DefNode_SpotLen ].u32 = spot_len;
+ data->values[ DefNode_ReadId ].u32 = readId;
+ data->values[ DefNode_ReadName ].str.s = read_name;
+ data->values[ DefNode_ReadName ].str.sz = rlabel_sz;
+ data->values[ DefNode_ReadLen ].u32 = read_len;
+ return 0;
+}
+
+
+static rc_t Defline_Build( const SLList* def, DeflineData* data, char* buf,
+ size_t buf_sz, size_t* writ )
+{
+ if ( data == NULL )
+ {
+ return RC( rcExe, rcNamelist, rcExecuting, rcMemory, rcInsufficient );
+ }
+
+ data->rc = 0;
+ data->optional = false;
+ data->buf = buf;
+ data->buf_sz = buf_sz;
+ data->writ = writ;
+
+ data->buf[ 0 ] = '\0';
+ *data->writ = 0;
+
+ SLListDoUntil( def, Defline_Builder, data );
+ return data->rc;
+}
+
+
+static rc_t DeflineNode_Add( SLList* list, DefNode** node,
+ DefNodeType type, const char* text, size_t text_sz )
+{
+ rc_t rc = 0;
+
+ *node = calloc( 1, sizeof( **node ) );
+ if ( *node == NULL )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcMemory, rcExhausted );
+ }
+ else if ( type == DefNode_Text && ( text == NULL || text_sz == 0 ) )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcParam, rcInvalid );
+ }
+ else
+ {
+ ( *node )->type = type;
+ if ( type == DefNode_Text )
+ {
+ ( *node )->data.text = string_dup( text, text_sz );
+ if ( ( *node )->data.text == NULL )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcMemory, rcExhausted );
+ free( *node );
+ }
+ }
+ else if ( type == DefNode_Optional )
+ {
+ ( *node )->data.optional = malloc( sizeof( SLList ) );
+ if ( ( *node )->data.optional == NULL )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcMemory, rcExhausted );
+ free( *node );
+ }
+ else
+ {
+ SLListInit( ( *node )->data.optional );
+ }
+ }
+ if ( rc == 0 )
+ {
+ SLListPushTail( list, &( *node )->node );
+ }
+ }
+ return rc;
+}
+
+
+static void Defline_Release( SLList* list );
+
+
+static void CC DeflineNode_Whack( SLNode* node, void* data )
+{
+ if ( node != NULL )
+ {
+ DefNode* n = (DefNode*)node;
+ if ( n->type == DefNode_Text )
+ {
+ free( n->data.text );
+ }
+ else if ( n->type == DefNode_Optional )
+ {
+ Defline_Release( n->data.optional );
+ }
+ free( node );
+ }
+}
+
+
+static void Defline_Release( SLList* list )
+{
+ if ( list != NULL )
+ {
+ SLListForEach( list, DeflineNode_Whack, NULL );
+ free( list );
+ }
+}
+
+
+#if _DEBUGGING
+static void CC Defline_Dump( SLNode* node, void* data )
+{
+ DefNode* n = ( DefNode* )node;
+ const char* s = NULL, *t;
+ if ( n->type == DefNode_Text )
+ {
+ s = n->data.text;
+ }
+ switch ( n->type )
+ {
+ case DefNode_Unknown : t = "Unknown"; break;
+ case DefNode_Text : t = "Text"; break;
+ case DefNode_Optional : t = "Optional"; break;
+ case DefNode_Accession : t = "Accession"; break;
+ case DefNode_SpotId : t = "SpotId"; break;
+ case DefNode_SpotName : t = "SpotName"; break;
+ case DefNode_SpotGroup : t = "SpotGroup"; break;
+ case DefNode_SpotLen : t = "SpotLen"; break;
+ case DefNode_ReadId : t = "ReadId"; break;
+ case DefNode_ReadName : t = "ReadName"; break;
+ case DefNode_ReadLen : t = "ReadLen"; break;
+ default : t = "ERROR";
+ }
+
+ SRA_DUMP_DBG( 3, ( "%s type %s", data, t ) );
+ if ( s )
+ {
+ SRA_DUMP_DBG( 3, ( ": '%s'", s ) );
+ }
+ SRA_DUMP_DBG( 3, ( "\n" ) );
+ if ( n->type == DefNode_Optional )
+ {
+ SLListForEach( n->data.optional, Defline_Dump, "+-->" );
+ }
+}
+#endif
+
+
+static rc_t Defline_Parse( SLList** def, const char* line )
+{
+ rc_t rc = 0;
+ size_t i, sz, text = 0, opt_vars = 0;
+ DefNode* node;
+ SLList* list = NULL;
+
+ if ( def == NULL || line == NULL )
+ {
+ return RC( rcExe, rcNamelist, rcConstructing, rcParam, rcInvalid );
+ }
+ *def = malloc( sizeof( SLList ) );
+ if ( *def == NULL )
+ {
+ return RC( rcExe, rcNamelist, rcConstructing, rcMemory, rcExhausted );
+ }
+ sz = strlen( line );
+ list = *def;
+ SLListInit( list );
+
+ for ( i = 0; rc == 0 && i < sz; i++ )
+ {
+ if ( line[ i ] == '[' )
+ {
+ if ( ( i + 1 ) < sz && line[ i + 1 ] == '[' )
+ {
+ i++;
+ }
+ else
+ {
+ if ( list != *def )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcFormat, rcIncorrect );
+ }
+ else if ( i > text )
+ {
+ rc = DeflineNode_Add( list, &node, DefNode_Text, &line[text], i - text );
+ }
+ if ( rc == 0 )
+ {
+ rc = DeflineNode_Add( list, &node, DefNode_Optional, NULL, 0 );
+ if ( rc == 0 )
+ {
+ opt_vars = 0;
+ list = node->data.optional;
+ text = i + 1;
+ }
+ }
+ }
+ }
+ else if ( line[ i ] == ']' )
+ {
+ if ( ( i + 1 ) < sz && line[ i + 1 ] == ']' )
+ {
+ i++;
+ }
+ else
+ {
+ if ( list == *def )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcFormat, rcIncorrect );
+ }
+ else
+ {
+ if ( opt_vars < 1 )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcConstraint, rcEmpty );
+ }
+ else if ( i > text )
+ {
+ rc = DeflineNode_Add( list, &node, DefNode_Text, &line[text], i - text );
+ }
+ list = *def;
+ text = i + 1;
+ }
+ }
+ }
+ else if ( line[ i ] == '$' )
+ {
+ if ( ( i + 1 ) < sz && line[ i + 1 ] == '$' )
+ {
+ i++;
+ }
+ else
+ {
+ DefNodeType type = DefNode_Unknown;
+ switch ( line[ ++i] )
+ {
+ case 'a' :
+ switch( line[ ++i ] )
+ {
+ case 'c': type = DefNode_Accession; break;
+ }
+ break;
+
+ case 's' :
+ switch ( line[ ++i ] )
+ {
+ case 'i': type = DefNode_SpotId; break;
+ case 'n': type = DefNode_SpotName; break;
+ case 'g': type = DefNode_SpotGroup; break;
+ case 'l': type = DefNode_SpotLen; break;
+ }
+ break;
+ case 'r' :
+ switch( line[ ++i ] )
+ {
+ case 'i': type = DefNode_ReadId; break;
+ case 'n': type = DefNode_ReadName; break;
+ case 'l': type = DefNode_ReadLen; break;
+ }
+ break;
+ }
+ if ( type == DefNode_Unknown )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcName, rcUnrecognized );
+ }
+ else
+ {
+ if ( ( i - 2 ) > text )
+ {
+ rc = DeflineNode_Add( list, &node, DefNode_Text, &line[ text ], i - text - 2 );
+ }
+ if ( rc == 0 )
+ {
+ rc = DeflineNode_Add( list, &node, type, NULL, 0 );
+ if ( rc == 0 )
+ {
+ opt_vars++;
+ text = i + 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ if ( list != *def )
+ {
+ rc = RC( rcExe, rcNamelist, rcConstructing, rcFormat, rcInvalid );
+ }
+ else if ( i > text )
+ {
+ rc = DeflineNode_Add( list, &node, DefNode_Text, &line[ text ], i - text );
+ }
+ }
+ if ( rc != 0 )
+ {
+ i = i < sz ? i : sz;
+ PLOGERR( klogErr, ( klogErr, rc, "$(l1) -->$(c)<-- $(l2)",
+ "l1=%.*s,c=%c,l2=%.*s", i - 1, line, line[ i - 1 ], sz - i, &line[ i ] ) );
+ }
+#if _DEBUGGING
+ SRA_DUMP_DBG( 3, ( "| defline\n" ) );
+ SLListForEach( *def, Defline_Dump, "+->" );
+#endif
+ return rc;
+}
+
+/* ### ALIGNMENT_COUNT based filtering ##################################################### */
+
+typedef struct AlignedFilter_struct
+{
+ const SRAColumn* col;
+ uint64_t rejected_reads;
+ bool aligned;
+ bool unaligned;
+} AlignedFilter;
+
+
+static rc_t AlignedFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ AlignedFilter* self = ( AlignedFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ *key = "";
+ if ( self->col != NULL )
+ {
+ const uint8_t* ac = NULL;
+ bitsz_t o = 0, sz = 0;
+ rc = SRAColumnRead( self->col, spot, (const void **)&ac, &o, &sz );
+ if ( rc == 0 && sz > 0 )
+ {
+ sz = sz / 8 / sizeof( *ac );
+ for( o = 0; o < sz; o++ )
+ {
+ if ( ( self->aligned && !self->unaligned && ac[ o ] == 0 ) ||
+ ( self->unaligned && !self->aligned && ac[ o ] != 0 ) )
+ {
+ unset_readmask( readmask, o );
+ self->rejected_reads ++;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t AlignedFilter_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ AlignedFilter* self = ( AlignedFilter* )cself;
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ if ( self->rejected_reads > 0 && !g_legacy_report )
+ rc = KOutMsg( "Rejected %lu READS because of aligned/unaligned filter\n", self->rejected_reads );
+ }
+ return rc;
+}
+
+typedef struct AlignedFilterFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col;
+ bool aligned;
+ bool unaligned;
+} AlignedFilterFactory;
+
+
+static rc_t AlignedFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ AlignedFilterFactory* self = ( AlignedFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRATableOpenColumnRead( self->table, &self->col, "ALIGNMENT_COUNT", vdb_uint8_t );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ LOGMSG( klogWarn, "Column ALIGNMENT_COUNT was not found, param ignored" );
+ rc = 0;
+ }
+ else if ( GetRCState( rc ) == rcExists )
+ {
+ rc = 0;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t AlignedFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ AlignedFilterFactory* self = ( AlignedFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( AlignedFilter ),
+ AlignedFilter_GetKey, NULL, NULL, AlignedFilter_Release );
+ if ( rc == 0 )
+ {
+ AlignedFilter * filter = ( AlignedFilter * )( * splitter );
+ filter->col = self->col;
+ filter->aligned = self->aligned;
+ filter->unaligned = self->unaligned;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void AlignedFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ AlignedFilterFactory* self = ( AlignedFilterFactory* )cself;
+ SRAColumnRelease( self->col );
+ }
+}
+
+
+static rc_t AlignedFilterFactory_Make( const SRASplitterFactory** cself,
+ const SRATable* table, bool aligned, bool unaligned )
+{
+ rc_t rc = 0;
+ AlignedFilterFactory* obj = NULL;
+
+ if ( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ AlignedFilterFactory_Init,
+ AlignedFilterFactory_NewObj,
+ AlignedFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( AlignedFilterFactory* )*cself;
+ obj->table = table;
+ obj->aligned = aligned;
+ obj->unaligned = unaligned;
+ }
+ }
+ return rc;
+}
+
+
+/* ### alignment region filtering ##################################################### */
+
+typedef struct AlignRegionFilter_struct
+{
+ const SRAColumn* col_pos;
+ const SRAColumn* col_name;
+ const SRAColumn* col_seqid;
+ const TAlignedRegion* alregion;
+ uint64_t rejected_spots;
+ uint32_t alregion_qty;
+} AlignRegionFilter;
+
+
+static rc_t AlignRegionFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ AlignRegionFilter* self = ( AlignRegionFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ *key = "";
+ reset_readmask( readmask );
+ if ( self->col_name || self->col_seqid )
+ {
+ bool match = false;
+ uint32_t i;
+ const char* nm, *si;
+ bitsz_t o, nm_len = 0, si_len = 0;
+
+ if ( self->col_name )
+ {
+ rc = SRAColumnRead( self->col_name, spot, (const void **)&nm, &o, &nm_len );
+ if ( rc == 0 && nm_len > 0 )
+ nm_len /= 8;
+ }
+ if ( rc == 0 && self->col_seqid )
+ {
+ rc = SRAColumnRead( self->col_seqid, spot, (const void **)&si, &o, &si_len );
+ if ( rc == 0 && si_len > 0 )
+ si_len /= 8;
+ }
+ for ( i = 0; rc == 0 && i < self->alregion_qty; i++ )
+ {
+ if ( ( self->alregion[i].name_len == nm_len &&
+ strncasecmp( self->alregion[ i ].name, nm, nm_len ) == 0 ) ||
+ ( self->alregion[i].name_len == si_len &&
+ strncasecmp(self->alregion[i].name, si, si_len) == 0 ) )
+ {
+ if ( self->col_pos )
+ {
+ INSDC_coord_zero* pos;
+ bitsz_t nreads, j;
+ rc = SRAColumnRead( self->col_pos, spot, ( const void ** )&pos, &o, &nreads );
+ if ( rc == 0 && nreads > 0 )
+ {
+ nreads = nreads / sizeof(*pos) / 8;
+ for ( i = 0; !match && i < self->alregion_qty; i++ )
+ {
+ for ( j = 0; j < nreads; j++ )
+ {
+ if ( self->alregion[i].from <= pos[j] &&
+ pos[j] <= self->alregion[i].to )
+ {
+ match = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ match = true;
+ }
+ break;
+ }
+ }
+ if ( !match )
+ {
+ clear_readmask( readmask );
+ self->rejected_spots ++;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t AlignRegionFilter_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ AlignRegionFilter* self = ( AlignRegionFilter* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ if ( self->rejected_spots > 0 && !g_legacy_report )
+ rc = KOutMsg( "Rejected %lu SPOTS because of AlignRegionFilter\n", self->rejected_spots );
+ }
+ return rc;
+}
+
+
+typedef struct AlignRegionFilterFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col_pos;
+ const SRAColumn* col_name;
+ const SRAColumn* col_seqid;
+ TAlignedRegion* alregion;
+ uint32_t alregion_qty;
+} AlignRegionFilterFactory;
+
+
+static rc_t AlignRegionFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ AlignRegionFilterFactory* self = ( AlignRegionFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+
+#define COLNF(v,n,t) (!(rc == 0 && ((rc = SRATableOpenColumnRead(self->table, &v, n, t)) == 0 || \
+ GetRCState(rc) == rcExists)) && GetRCState(rc) == rcNotFound)
+
+ if ( COLNF( self->col_name, "REF_NAME", vdb_ascii_t ) )
+ {
+ SRAColumnRelease( self->col_name );
+ self->col_name = NULL;
+ rc = 0;
+ }
+
+ if ( COLNF( self->col_seqid, "REF_SEQ_ID", vdb_ascii_t ) )
+ {
+ SRAColumnRelease( self->col_seqid );
+ self->col_seqid = NULL;
+ rc = 0;
+ }
+
+ if ( self->col_name == NULL && self->col_seqid == NULL )
+ {
+ LOGMSG( klogWarn, "None of columns REF_NAME or REF_SEQ_ID was found, no region filtering" );
+ }
+ else
+ {
+ bool range_used = false;
+ uint32_t i;
+ /* see if there are any actual ranges set and open col only if yes */
+ for ( i = 0; i < self->alregion_qty; i++ )
+ {
+ if ( self->alregion[ i ].from != 0 || self->alregion[ i ].to != 0 )
+ {
+ range_used = true;
+ break;
+ }
+ }
+ if ( range_used )
+ {
+ if ( COLNF( self->col_pos, "REF_POS", "INSDC:coord:zero" ) )
+ {
+ LOGMSG( klogWarn, "Column REF_POS is not found, no region position filtering" );
+ rc = 0;
+ }
+ else
+ {
+ for ( i = 0; i < self->alregion_qty; i++ )
+ {
+ if ( self->alregion[ i ].from > 0 )
+ {
+ self->alregion[ i ].from--;
+ }
+ if ( self->alregion[ i ].to > 0 )
+ {
+ self->alregion[ i ].to--;
+ }
+ else if ( self->alregion[ i ].to == 0 )
+ {
+ self->alregion[ i ].to = ~0;
+ }
+ }
+ }
+ }
+ }
+ }
+#undef COLNF
+ return rc;
+}
+
+
+static rc_t AlignRegionFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ AlignRegionFilterFactory* self = ( AlignRegionFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( AlignRegionFilter ),
+ AlignRegionFilter_GetKey, NULL, NULL, AlignRegionFilter_Release );
+ if ( rc == 0 )
+ {
+ AlignRegionFilter * filter = ( AlignRegionFilter * )( * splitter );
+ filter->col_pos = self->col_pos;
+ filter->col_name = self->col_name;
+ filter->col_seqid = self->col_seqid;
+ filter->alregion = self->alregion;
+ filter->alregion_qty = self->alregion_qty;
+ filter->rejected_spots = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void AlignRegionFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ AlignRegionFilterFactory* self = ( AlignRegionFilterFactory* )cself;
+ SRAColumnRelease( self->col_pos );
+ SRAColumnRelease( self->col_name );
+ SRAColumnRelease( self->col_seqid );
+ }
+}
+
+
+static rc_t AlignRegionFilterFactory_Make( const SRASplitterFactory** cself,
+ const SRATable* table, TAlignedRegion* alregion, uint32_t alregion_qty )
+{
+ rc_t rc = 0;
+ AlignRegionFilterFactory* obj = NULL;
+
+ if ( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ AlignRegionFilterFactory_Init,
+ AlignRegionFilterFactory_NewObj,
+ AlignRegionFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( AlignRegionFilterFactory* )*cself;
+ obj->table = table;
+ obj->alregion = alregion;
+ obj->alregion_qty = alregion_qty;
+ }
+ }
+ return rc;
+}
+
+/* ### alignment meta-pair distance filtering ##################################################### */
+
+typedef struct AlignPairDistanceFilter_struct
+{
+ const SRAColumn* col_tlen;
+ const TMatepairDistance* mp_dist;
+ uint64_t rejected_reads;
+ bool mp_dist_unknown;
+ uint32_t mp_dist_qty;
+} AlignPairDistanceFilter;
+
+
+static rc_t AlignPairDistanceFilter_GetKey( const SRASplitter* cself,
+ const char** key, spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ AlignPairDistanceFilter* self = ( AlignPairDistanceFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ *key = "";
+ reset_readmask( readmask );
+ if ( self->col_tlen )
+ {
+ uint32_t i, j;
+ bitsz_t o, nreads;
+ int32_t* tlen;
+ rc = SRAColumnRead( self->col_tlen, spot, (const void **)&tlen, &o, &nreads );
+ if ( rc == 0 )
+ {
+ nreads = nreads / sizeof(*tlen) / 8;
+ for ( i = 0; i < self->mp_dist_qty; i++ )
+ {
+ for ( j = 0; j < nreads; j++ )
+ {
+ if ( ( tlen[ j ] == 0 && !self->mp_dist_unknown) ||
+ ( tlen[ j ] != 0 &&
+ ( tlen[ j ] < self->mp_dist[ i ].from || self->mp_dist[ i ].to < tlen[ j ] ) ) )
+ {
+ unset_readmask( readmask, j );
+ self->rejected_reads ++;
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t AlignPairDistanceFilter_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ AlignPairDistanceFilter* self = ( AlignPairDistanceFilter* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcNode, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ if ( self->rejected_reads > 0 && !g_legacy_report )
+ rc = KOutMsg( "Rejected %lu READS because of AlignPairDistanceFilter\n", self->rejected_reads );
+ }
+ return rc;
+}
+
+typedef struct AlignPairDistanceFilterFactory_struct
+{
+ const SRATable* table;
+ const SRAColumn* col_tlen;
+ bool mp_dist_unknown;
+ TMatepairDistance* mp_dist;
+ uint32_t mp_dist_qty;
+} AlignPairDistanceFilterFactory;
+
+
+static rc_t AlignPairDistanceFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ AlignPairDistanceFilterFactory* self = ( AlignPairDistanceFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRATableOpenColumnRead( self->table, &self->col_tlen, "TEMPLATE_LEN", "I32" );
+ if( !( rc == 0 || GetRCState( rc ) == rcExists ) && GetRCState( rc ) == rcNotFound )
+ {
+ LOGMSG( klogWarn, "Column TLEN was not found, no distance filtering" );
+ self->col_tlen = NULL;
+ rc = 0;
+ }
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < self->mp_dist_qty; i++ )
+ {
+ if ( self->mp_dist[ i ].to == 0 )
+ {
+ self->mp_dist[ i ].to = ~0;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t AlignPairDistanceFilterFactory_NewObj( const SRASplitterFactory* cself,
+ const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ AlignPairDistanceFilterFactory* self = ( AlignPairDistanceFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( AlignPairDistanceFilter ),
+ AlignPairDistanceFilter_GetKey, NULL, NULL, AlignPairDistanceFilter_Release );
+ if ( rc == 0 )
+ {
+ AlignPairDistanceFilter * filter = ( AlignPairDistanceFilter * )( * splitter );
+ filter->col_tlen = self->col_tlen;
+ filter->mp_dist_unknown = self->mp_dist_unknown;
+ filter->mp_dist = self->mp_dist;
+ filter->mp_dist_qty = self->mp_dist_qty;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void AlignPairDistanceFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ AlignPairDistanceFilterFactory* self = ( AlignPairDistanceFilterFactory* )cself;
+ SRAColumnRelease( self->col_tlen );
+ }
+}
+
+
+static rc_t AlignPairDistanceFilterFactory_Make( const SRASplitterFactory** cself,
+ const SRATable* table, bool mp_dist_unknown, TMatepairDistance* mp_dist, uint32_t mp_dist_qty )
+{
+ rc_t rc = 0;
+ AlignPairDistanceFilterFactory* obj = NULL;
+
+ if ( cself == NULL || table == NULL )
+ {
+ rc = RC( rcSRA, rcType, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ AlignPairDistanceFilterFactory_Init,
+ AlignPairDistanceFilterFactory_NewObj,
+ AlignPairDistanceFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( AlignPairDistanceFilterFactory* ) *cself;
+ obj->table = table;
+ obj->mp_dist_unknown = mp_dist_unknown;
+ obj->mp_dist = mp_dist;
+ obj->mp_dist_qty = mp_dist_qty;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ read type (bio/tech) filter ============================ */
+
+typedef struct FastqBioFilter_struct
+{
+ const FastqReader* reader;
+ uint64_t rejected_reads;
+} FastqBioFilter;
+
+
+/* filter out non-bio reads */
+static rc_t FastqBioFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqBioFilter* self = ( FastqBioFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0;
+
+ *key = NULL;
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ if ( rc == 0 )
+ {
+ uint32_t readId;
+ SRA_DUMP_DBG( 3, ( "%s %u row reads: ", __func__, spot ) );
+ for (readId = 0; rc == 0 && readId < num_reads; readId++ )
+ {
+ if ( isset_readmask( readmask, readId ) )
+ {
+ SRAReadTypes read_type;
+ rc = FastqReader_SpotReadInfo( self->reader, readId + 1, &read_type,
+ NULL, NULL, NULL, NULL);
+ if ( rc == 0 )
+ {
+ if ( !( read_type & SRA_READ_TYPE_BIOLOGICAL ) )
+ {
+ unset_readmask( readmask, readId );
+ self->rejected_reads ++;
+ }
+ else
+ {
+ SRA_DUMP_DBG( 3, ( " %u", readId ) );
+ }
+ }
+ }
+ }
+ *key = "";
+ SRA_DUMP_DBG( 3, ( " key '%s'\n", *key ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqBioFilter_Release( const SRASplitter * cself )
+{
+ rc_t rc = 0;
+ FastqBioFilter * self = ( FastqBioFilter * )cself;
+
+ if ( self == NULL )
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ else
+ {
+ if ( self->rejected_reads > 0 && !g_legacy_report )
+ rc = KOutMsg( "Rejected %lu READS because of filtering out non-biological READS\n", self->rejected_reads );
+ }
+ return rc;
+}
+
+
+typedef struct FastqBioFilterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+} FastqBioFilterFactory;
+
+
+static rc_t FastqBioFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqBioFilterFactory* self = ( FastqBioFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0) ;
+ }
+ return rc;
+}
+
+
+static rc_t FastqBioFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqBioFilterFactory* self = ( FastqBioFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( FastqBioFilter ),
+ FastqBioFilter_GetKey, NULL, NULL, FastqBioFilter_Release );
+ if ( rc == 0 )
+ {
+ FastqBioFilter * filter = ( FastqBioFilter * )( * splitter );
+ filter->reader = self->reader;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void FastqBioFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqBioFilterFactory* self = ( FastqBioFilterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ }
+}
+
+
+static rc_t FastqBioFilterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqBioFilterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ FastqBioFilterFactory_Init,
+ FastqBioFilterFactory_NewObj,
+ FastqBioFilterFactory_Release );
+
+ if ( rc == 0 )
+ {
+ obj = ( FastqBioFilterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ number of reads filter ============================ */
+
+typedef struct FastqRNumberFilter_struct
+{
+ const FastqReader* reader;
+ uint64_t rejected_reads;
+} FastqRNumberFilter;
+
+
+static rc_t FastqRNumberFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqRNumberFilter* self = ( FastqRNumberFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0;
+
+ *key = NULL;
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ if ( rc == 0 )
+ {
+ int readId, q;
+
+ SRA_DUMP_DBG( 3, ( "%s %u row reads: ", __func__, spot ) );
+ for ( readId = 0, q = 0; readId < num_reads; readId++ )
+ {
+ if ( isset_readmask( readmask, readId ) )
+ {
+ if ( ++q > FastqArgs.maxReads )
+ {
+ unset_readmask( readmask, 1 << readId );
+ }
+ else
+ {
+ SRA_DUMP_DBG( 3, ( " %u", readId ) );
+ }
+ }
+ }
+ *key = "";
+ SRA_DUMP_DBG( 3, ( " key '%s'\n", *key ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqRNumberFilter_Release( const SRASplitter* cself )
+{
+ rc_t rc = 0;
+ FastqRNumberFilter * self = ( FastqRNumberFilter * )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ if ( self->rejected_reads > 0 && !g_legacy_report )
+ rc = KOutMsg( "Rejected %lu READS because of max. number of READS = %u\n", self->rejected_reads, FastqArgs.maxReads );
+ }
+ return rc;
+}
+
+typedef struct FastqRNumberFilterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+} FastqRNumberFilterFactory;
+
+
+static rc_t FastqRNumberFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqRNumberFilterFactory* self = ( FastqRNumberFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0 );
+ }
+ return rc;
+}
+
+
+static rc_t FastqRNumberFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqRNumberFilterFactory* self = ( FastqRNumberFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( FastqRNumberFilter ),
+ FastqRNumberFilter_GetKey, NULL, NULL, FastqRNumberFilter_Release );
+ if ( rc == 0 )
+ {
+ FastqRNumberFilter * filter = ( FastqRNumberFilter * )( * splitter );
+ filter->reader = self->reader;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void FastqRNumberFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqRNumberFilterFactory* self = ( FastqRNumberFilterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ }
+}
+
+
+static rc_t FastqRNumberFilterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqRNumberFilterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ FastqRNumberFilterFactory_Init,
+ FastqRNumberFilterFactory_NewObj,
+ FastqRNumberFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( FastqRNumberFilterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+/* ============== FASTQ quality filter ============================ */
+
+typedef struct FastqQFilter_struct
+{
+ const FastqReader * reader;
+ KDataBuffer * buffer_for_read_column;
+ KDataBuffer * buffer_for_quality;
+ uint64_t rejected_spots;
+ uint64_t rejected_reads;
+} FastqQFilter;
+
+
+#define MIN_QUAL_FOR_RULE_3 ( 33 + 2 )
+
+static bool QFilter_Test_new( const char * read, const char * quality, uint32_t readlen, uint32_t minlen, char N_char )
+{
+ uint32_t idx, cnt, cnt1, start;
+ char b0;
+
+ /* 1st criteria : READ has to be longer than the minlen */
+ if ( readlen < minlen ) return false;
+
+ /* 2nd criteria : READ does not contain any N's in the first minlen bases */
+ for ( idx = 0; idx < minlen; ++idx )
+ {
+ if ( read[ idx ] == N_char ) return false;
+ }
+
+ start = ( N_char == '.' ) ? 1 : 0;
+ /* 3rd criteria : QUALITY values are all 2 or higher in the first minlen values */
+ for ( idx = start; idx < minlen; ++idx )
+ {
+ if ( quality[ idx ] < MIN_QUAL_FOR_RULE_3 ) return false;
+ }
+
+ /* 4th criteria : READ contains more than one type of base in the first minlen bases */
+ b0 = read[ 0 ];
+ for ( idx = 1, cnt = 1; idx < minlen; ++idx )
+ {
+ if ( read[ idx ] == b0 ) cnt++;
+ }
+ if ( cnt == minlen ) return false;
+
+ /* 5th criteria : READ does not contain more than 50% N's in its whole length */
+ cnt = ( readlen / 2 );
+ for ( idx = 0, cnt1 = 0; idx < readlen; ++idx )
+ {
+ if ( read[ idx ] == N_char ) cnt1++;
+ }
+ if ( cnt1 > cnt ) return false;
+
+ /* 6th criteria : READ does not contain values other than ACGTN in its whole length */
+ if ( N_char != '.' )
+ {
+ for ( idx = 0; idx < readlen; ++idx )
+ {
+ if ( ! ( ( read[ idx ] == 'A' ) || ( read[ idx ] == 'C' ) || ( read[ idx ] == 'G' ) ||
+ ( read[ idx ] == 'T' ) || ( read[ idx ] == 'N' ) ) )
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+static bool QFilter_Test_old( const char * read, uint32_t readlen, bool cs_native )
+{
+ static char const* const baseStr = "NNNNNNNNNN";
+ static char const* const colorStr = "..........";
+ static const uint32_t strLen = 10;
+ uint32_t xLen = readlen < strLen ? readlen : strLen;
+
+ if ( cs_native )
+ {
+ if ( strncmp( &read[ 1 ], colorStr, xLen ) == 0 || strcmp( &read[ readlen - xLen + 1 ], colorStr ) == 0 )
+ return false;
+ }
+ else
+ {
+ if ( strncmp( read, baseStr, xLen ) == 0 || strcmp( &read[ readlen - xLen ], baseStr ) == 0 )
+ return false;
+ }
+ return true;
+}
+
+
+/* filter out reads by leading/trialing quality */
+static rc_t FastqQFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqQFilter* self = ( FastqQFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0, spot_len;
+
+ *key = NULL;
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, &spot_len, &num_reads );
+ if ( rc == 0 )
+ {
+ SRA_DUMP_DBG( 3, ( "%s %u row reads: ", __func__, spot ) );
+ if ( FastqArgs.split_spot )
+ {
+ uint32_t readId;
+ INSDC_coord_len read_len;
+ for ( readId = 0; rc == 0 && readId < num_reads; readId++ )
+ {
+ if ( isset_readmask( readmask, readId ) )
+ {
+ rc = FastqReader_SpotReadInfo( self->reader, readId + 1, NULL, NULL, NULL, NULL, &read_len );
+ if ( rc == 0 )
+ {
+ /* FastqReaderBase() in libsra! libs/sra/fastq.h
+ IF_BUF ... very, very bad macro defined in factory.h !!
+ it combines reading from table with resizing of a KDatabuffer in a loop until rc == 0 is reached!
+ */
+ IF_BUF( ( FastqReaderBase( self->reader, readId + 1,
+ self->buffer_for_read_column->base,
+ KDataBufferBytes( self->buffer_for_read_column ), NULL) ),
+ self->buffer_for_read_column, read_len )
+ {
+ const char * b = self->buffer_for_read_column->base;
+ bool filter_passed = true;
+
+ if ( FastqArgs.qual_filter1 )
+ {
+ if ( quality_N_limit > 0 )
+ {
+ IF_BUF( ( FastqReaderQuality( self->reader, readId + 1,
+ self->buffer_for_quality->base,
+ KDataBufferBytes( self->buffer_for_quality ), NULL) ),
+ self->buffer_for_quality, read_len )
+ {
+ const char * q = self->buffer_for_quality->base;
+ char N_char = FastqArgs.is_platform_cs_native ? '.' : 'N';
+ filter_passed = QFilter_Test_new( b, q, read_len, quality_N_limit, N_char );
+ }
+ }
+ }
+ else
+ filter_passed = QFilter_Test_old( b, read_len, FastqArgs.is_platform_cs_native );
+
+ if ( filter_passed )
+ SRA_DUMP_DBG( 3, ( " %u", readId ) );
+ else
+ {
+ unset_readmask( readmask, readId );
+ /* READ did not pass filter */
+ self->rejected_reads ++;
+ }
+ }
+ }
+ }
+ }
+ *key = "";
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderBase( self->reader, 0, self->buffer_for_read_column->base,
+ KDataBufferBytes( self->buffer_for_read_column ), NULL ) ), self->buffer_for_read_column, spot_len )
+ {
+ const char* b = self->buffer_for_read_column->base;
+ bool filter_passed = true;
+
+ if ( FastqArgs.qual_filter1 )
+ {
+ if ( quality_N_limit > 0 )
+ {
+ IF_BUF( ( FastqReaderQuality( self->reader, 0, self->buffer_for_quality->base,
+ KDataBufferBytes( self->buffer_for_quality ), NULL ) ), self->buffer_for_quality, spot_len )
+ {
+ const char * q = self->buffer_for_quality->base;
+ char N_char = FastqArgs.is_platform_cs_native ? '.' : 'N';
+ filter_passed = QFilter_Test_new( b, q, spot_len, quality_N_limit, N_char );
+ }
+ }
+ }
+ else
+ filter_passed = QFilter_Test_old( b, spot_len, FastqArgs.is_platform_cs_native );
+
+ if ( filter_passed )
+ {
+ *key = "";
+ SRA_DUMP_DBG( 3, ( " whole spot" ) );
+ }
+ else
+ {
+ /* SPOT did not pass filter */
+ self->rejected_spots ++;
+ }
+ }
+ }
+ SRA_DUMP_DBG( 3, ( " key '%s'\n", *key ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqQFilter_Release( const SRASplitter * cself )
+{
+ rc_t rc = 0;
+ FastqQFilter* self = ( FastqQFilter* )cself;
+
+ if ( self == NULL )
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ else if ( !g_legacy_report )
+ {
+ if ( self->rejected_reads > 0 )
+ rc = KOutMsg( "Rejected %lu READS because of Quality-Filtering\n", self->rejected_reads );
+ if ( rc == 0 && self->rejected_spots > 0 )
+ rc = KOutMsg( "Rejected %lu SPOTS because of Quality-Filtering\n", self->rejected_spots );
+
+ }
+ return rc;
+}
+
+
+typedef struct FastqQFilterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+ KDataBuffer kdbuf;
+ KDataBuffer kdbuf2;
+} FastqQFilterFactory;
+
+
+static rc_t FastqQFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqQFilterFactory* self = ( FastqQFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = KDataBufferMakeBytes( &self->kdbuf, DATABUFFERINITSIZE );
+ if ( rc == 0 )
+ {
+ rc = KDataBufferMakeBytes( &self->kdbuf2, DATABUFFERINITSIZE );
+ if ( rc == 0 )
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0 );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqQFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqQFilterFactory* self = ( FastqQFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( FastqQFilter ), FastqQFilter_GetKey, NULL, NULL, FastqQFilter_Release );
+ if ( rc == 0 )
+ {
+ FastqQFilter * filter = ( FastqQFilter * )( * splitter );
+ filter->reader = self->reader;
+ filter->buffer_for_read_column = &self->kdbuf;
+ filter->buffer_for_quality = &self->kdbuf2;
+ filter->rejected_spots = 0;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void FastqQFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqQFilterFactory* self = ( FastqQFilterFactory* )cself;
+ KDataBufferWhack( &self->kdbuf );
+ KDataBufferWhack( &self->kdbuf2 );
+ FastqReaderWhack( self->reader );
+ }
+}
+
+
+static rc_t FastqQFilterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqQFilterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ FastqQFilterFactory_Init,
+ FastqQFilterFactory_NewObj,
+ FastqQFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( FastqQFilterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ min read length filter ============================ */
+
+
+typedef struct FastqReadLenFilter_struct
+{
+ const FastqReader* reader;
+ uint64_t rejected_spots;
+ uint64_t rejected_reads;
+} FastqReadLenFilter;
+
+
+static rc_t FastqReadLenFilter_GetKey( const SRASplitter* cself, const char** key,
+ spotid_t spot, readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqReadLenFilter* self = ( FastqReadLenFilter* )cself;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0, spot_len = 0;
+
+ *key = NULL;
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, &spot_len, &num_reads );
+ if ( rc == 0 )
+ {
+ SRA_DUMP_DBG( 3, ( "%s %u row reads:", __func__, spot ) );
+ if ( FastqArgs.split_spot )
+ {
+ uint32_t readId;
+ INSDC_coord_len read_len = 0;
+ for ( readId = 0; rc == 0 && readId < num_reads; readId++ )
+ {
+ if ( isset_readmask( readmask, readId ) )
+ {
+ rc = FastqReader_SpotReadInfo( self->reader, readId + 1, NULL, NULL, NULL, NULL, &read_len );
+ if ( rc == 0 )
+ {
+ if ( read_len < FastqArgs.minReadLen )
+ {
+ unset_readmask( readmask, readId );
+ self->rejected_reads ++;
+ }
+ else
+ {
+ SRA_DUMP_DBG( 3, ( " %u", readId ) );
+ }
+ }
+ }
+ }
+ *key = "";
+ }
+ else
+ {
+ if ( spot_len >= FastqArgs.minReadLen )
+ {
+ *key = "";
+ SRA_DUMP_DBG( 3, ( " whole spot" ) );
+ }
+ else
+ self->rejected_spots ++;
+ }
+ SRA_DUMP_DBG( 3, ( "\n" ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqReadLenFilter_Release( const SRASplitter * cself )
+{
+ rc_t rc = 0;
+ FastqReadLenFilter * self = ( FastqReadLenFilter* )cself;
+
+ if ( self == NULL )
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ else if ( !g_legacy_report )
+ {
+ if ( self->rejected_reads > 0 )
+ rc = KOutMsg( "Rejected %lu READS because READLEN < %u\n", self->rejected_reads, FastqArgs.minReadLen );
+ if ( self->rejected_spots > 0 && rc == 0 )
+ rc = KOutMsg( "Rejected %lu SPOTS because SPOTLEN < %u\n", self->rejected_spots, FastqArgs.minReadLen );
+ }
+ return rc;
+}
+
+
+typedef struct FastqReadLenFilterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+} FastqReadLenFilterFactory;
+
+
+static rc_t FastqReadLenFilterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqReadLenFilterFactory* self = ( FastqReadLenFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0 );
+ }
+ return rc;
+}
+
+
+static rc_t FastqReadLenFilterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqReadLenFilterFactory* self = ( FastqReadLenFilterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( FastqReadLenFilter ),
+ FastqReadLenFilter_GetKey, NULL, NULL, FastqReadLenFilter_Release );
+ if ( rc == 0 )
+ {
+ FastqReadLenFilter * filter = ( FastqReadLenFilter* )( *splitter );
+ filter->reader = self->reader;
+ filter->rejected_spots = 0;
+ filter->rejected_reads = 0;
+ }
+ }
+ return rc;
+}
+
+
+static void FastqReadLenFilterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqReadLenFilterFactory* self = ( FastqReadLenFilterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ }
+}
+
+
+static rc_t FastqReadLenFilterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqReadLenFilterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterSpot, sizeof( *obj ),
+ FastqReadLenFilterFactory_Init,
+ FastqReadLenFilterFactory_NewObj,
+ FastqReadLenFilterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( FastqReadLenFilterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ read splitter ============================ */
+
+char* FastqReadSplitter_key_buf = NULL;
+
+
+typedef struct FastqReadSplitter_struct
+{
+ const FastqReader* reader;
+ SRASplitter_Keys* keys;
+ uint32_t keys_max;
+} FastqReadSplitter;
+
+
+static rc_t FastqReadSplitter_GetKeySet( const SRASplitter* cself, const SRASplitter_Keys** key,
+ uint32_t* keys, spotid_t spot, const readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqReadSplitter* self = ( FastqReadSplitter* )cself;
+ const size_t key_offset = 5;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0;
+
+ *keys = 0;
+ if ( FastqReadSplitter_key_buf == NULL )
+ {
+ /* initial alloc key_buf: " 1\0 2\0...\0 9\0 10\0 11\0...\03220..\08192\0" */
+ if ( nreads_max > 9999 )
+ {
+ /* key_offset and sprintf format size are insufficient for keys longer than 4 digits */
+ rc = RC( rcExe, rcNode, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ FastqReadSplitter_key_buf = malloc( nreads_max * key_offset );
+ if ( FastqReadSplitter_key_buf == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcMemory, rcExhausted );
+ }
+ else
+ {
+ /* fill buffer w/keys */
+ int i;
+ char* p = FastqReadSplitter_key_buf;
+ for ( i = 1; rc == 0 && i <= nreads_max; i++ )
+ {
+ if ( sprintf( p, "%4u", i ) <= 0 )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcTransfer, rcIncomplete );
+ }
+ p += key_offset;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ if ( rc == 0 )
+ {
+ uint32_t readId, good = 0;
+
+ SRA_DUMP_DBG( 3, ( "%s %u row reads:", __func__, spot ) );
+ for ( readId = 0; rc == 0 && readId < num_reads; readId++ )
+ {
+ rc = FastqReader_SpotReadInfo( self->reader, readId + 1, NULL, NULL, NULL, NULL, NULL );
+ if ( !isset_readmask( readmask, readId ) )
+ {
+ continue;
+ }
+ if ( self->keys_max < ( good + 1 ) )
+ {
+ void* p = realloc( self->keys, sizeof( *self->keys ) * ( good + 1 ) );
+ if ( p == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcMemory, rcExhausted );
+ break;
+ }
+ else
+ {
+ self->keys = p;
+ self->keys_max = good + 1;
+ }
+ }
+ self->keys[ good ].key = &FastqReadSplitter_key_buf[ readId * key_offset ];
+ while ( self->keys[ good ].key[ 0 ] == ' ' && self->keys[ good ].key[0] != '\0' )
+ {
+ self->keys[ good ].key++;
+ }
+ clear_readmask( self->keys[ good ].readmask );
+ set_readmask( self->keys[good].readmask, readId );
+ SRA_DUMP_DBG( 3, ( " key['%s']+=%u", self->keys[ good ].key, readId ) );
+ good++;
+ }
+ if ( rc == 0 )
+ {
+ *key = self->keys;
+ *keys = good;
+ }
+ SRA_DUMP_DBG( 3, ( "\n" ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+rc_t FastqReadSplitter_Release( const SRASplitter* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqReadSplitter* self = ( FastqReadSplitter* )cself;
+ free( self->keys );
+ }
+ return 0;
+}
+
+
+typedef struct FastqReadSplitterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+} FastqReadSplitterFactory;
+
+
+static rc_t FastqReadSplitterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqReadSplitterFactory* self = ( FastqReadSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0 );
+ }
+ return rc;
+}
+
+
+static rc_t FastqReadSplitterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqReadSplitterFactory* self = ( FastqReadSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( FastqReadSplitter ), NULL,
+ FastqReadSplitter_GetKeySet, NULL, FastqReadSplitter_Release );
+ if ( rc == 0 )
+ {
+ ( (FastqReadSplitter*)(*splitter) )->reader = self->reader;
+ }
+ }
+ return rc;
+}
+
+
+static void FastqReadSplitterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ FastqReadSplitterFactory* self = ( FastqReadSplitterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ free( FastqReadSplitter_key_buf );
+ FastqReadSplitter_key_buf = NULL;
+ }
+}
+
+
+static rc_t FastqReadSplitterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqReadSplitterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterRead, sizeof( *obj ),
+ FastqReadSplitterFactory_Init,
+ FastqReadSplitterFactory_NewObj,
+ FastqReadSplitterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( FastqReadSplitterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ 3 read splitter ============================ */
+
+char* Fastq3ReadSplitter_key_buf = NULL;
+
+typedef struct Fastq3ReadSplitter_struct
+{
+ const FastqReader* reader;
+ SRASplitter_Keys keys[ 2 ];
+} Fastq3ReadSplitter;
+
+
+/* if all active reads len >= minreadlen, reads are splitted into separate files, otherwise on single key "" is returnded for all reads */
+static rc_t Fastq3ReadSplitter_GetKeySet( const SRASplitter* cself, const SRASplitter_Keys** key,
+ uint32_t* keys, spotid_t spot, const readmask_t* readmask )
+{
+ rc_t rc = 0;
+ Fastq3ReadSplitter* self = ( Fastq3ReadSplitter* )cself;
+ const size_t key_offset = 5;
+
+ if ( self == NULL || key == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcParam, rcInvalid );
+ }
+ else
+ {
+ uint32_t num_reads = 0;
+
+ *keys = 0;
+ if ( Fastq3ReadSplitter_key_buf == NULL )
+ {
+ /* initial alloc key_buf: " 1\0 2\0...\0 9\0 10\0 11\0...\03220..\08192\0" */
+ if ( nreads_max > 9999 )
+ {
+ /* key_offset and sprintf format size are insufficient for keys longer than 4 digits */
+ rc = RC( rcExe, rcNode, rcExecuting, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ Fastq3ReadSplitter_key_buf = malloc( nreads_max * key_offset );
+ if ( Fastq3ReadSplitter_key_buf == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcMemory, rcExhausted );
+ }
+ else
+ {
+ /* fill buffer w/keys */
+ int i;
+ char* p = Fastq3ReadSplitter_key_buf;
+ for ( i = 1; rc == 0 && i <= nreads_max; i++ )
+ {
+ if ( sprintf( p, "%4u", i ) <= 0 )
+ {
+ rc = RC( rcExe, rcNode, rcExecuting, rcTransfer, rcIncomplete );
+ }
+ p += key_offset;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ if ( rc == 0 )
+ {
+ uint32_t readId, good = 0;
+ const uint32_t max_reads = sizeof( self->keys ) /sizeof( self->keys[ 0 ] );
+
+ SRA_DUMP_DBG( 3, ( "%s %u row reads:", __func__, spot ) );
+ for ( readId = 0; rc == 0 && readId < num_reads && good < max_reads; readId++ )
+ {
+ rc = FastqReader_SpotReadInfo( self->reader, readId + 1, NULL, NULL, NULL, NULL, NULL );
+ if ( !isset_readmask( readmask, readId ) )
+ {
+ continue;
+ }
+ self->keys[ good ].key = &Fastq3ReadSplitter_key_buf[ good * key_offset ];
+ while ( self->keys[ good ].key[ 0 ] == ' ' && self->keys[good].key[ 0 ] != '\0' )
+ {
+ self->keys[ good ].key++;
+ }
+ clear_readmask( self->keys[ good ].readmask );
+ set_readmask( self->keys[ good ].readmask, readId );
+ SRA_DUMP_DBG( 3, ( " key['%s']+=%u", self->keys[ good ].key, readId ) );
+ good++;
+ }
+ if ( rc == 0 )
+ {
+ *key = self->keys;
+ *keys = good;
+ if ( good != max_reads )
+ {
+ /* some are short -> reset keys to same value for all valid reads */
+ /* run has just one read -> no suffix */
+ /* or single file was requested */
+ for ( readId = 0; readId < good; readId++ )
+ {
+ self->keys[ readId ].key = "";
+ }
+ SRA_DUMP_DBG( 3, ( " all keys joined to ''" ) );
+ }
+ }
+ SRA_DUMP_DBG( 3, ( "\n" ) );
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct Fastq3ReadSplitterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+} Fastq3ReadSplitterFactory;
+
+
+static rc_t Fastq3ReadSplitterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ Fastq3ReadSplitterFactory* self = ( Fastq3ReadSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ /* preserve orig spot format to save on conversions */
+ FastqArgs.is_platform_cs_native, false, FastqArgs.fasta > 0, false,
+ false, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, '\0', 0, 0 );
+ }
+ return rc;
+}
+
+
+static rc_t Fastq3ReadSplitterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ Fastq3ReadSplitterFactory* self = ( Fastq3ReadSplitterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make( splitter, sizeof( Fastq3ReadSplitter ),
+ NULL, Fastq3ReadSplitter_GetKeySet, NULL, NULL );
+ if ( rc == 0 )
+ {
+ ( (Fastq3ReadSplitter*)(*splitter) )->reader = self->reader;
+ }
+ }
+ return rc;
+}
+
+
+static void Fastq3ReadSplitterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ Fastq3ReadSplitterFactory* self = ( Fastq3ReadSplitterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ free( Fastq3ReadSplitter_key_buf );
+ }
+}
+
+
+static rc_t Fastq3ReadSplitterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ Fastq3ReadSplitterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterRead, sizeof( *obj ),
+ Fastq3ReadSplitterFactory_Init,
+ Fastq3ReadSplitterFactory_NewObj,
+ Fastq3ReadSplitterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = ( Fastq3ReadSplitterFactory* )*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ============== FASTQ formatter object ============================ */
+
+
+typedef struct FastqFormatterSplitter_struct
+{
+ const char* accession;
+ const FastqReader* reader;
+ KDataBuffer* b[ 5 ];
+ size_t bsz[ 5 ]; /* fifth is for fasta line wrap */
+} FastqFormatterSplitter;
+
+
+static rc_t FastqFormatterSplitter_WrapLine( const KDataBuffer* src, size_t src_sz,
+ KDataBuffer* dst, size_t* dst_sz, const uint64_t width )
+{
+ rc_t rc = 0;
+ size_t sz = src_sz + ( src_sz - 1 ) / width;
+
+ if ( KDataBufferBytes( dst ) < sz )
+ {
+ SRA_DUMP_DBG( 10, ( "%s grow buffer from %u to %u\n", __func__, KDataBufferBytes( dst ), sz + 10 ) );
+ rc = KDataBufferResize( dst, sz + 10 );
+ }
+ if ( rc == 0 )
+ {
+ const char* s = src->base;
+ char* d = dst->base;
+ *dst_sz = sz = src_sz;
+ while ( sz > 0 )
+ {
+ memmove( d, s, sz > width ? width : sz );
+ if ( sz <= width )
+ {
+ break;
+ }
+ d += width;
+ *d++ = '\n';
+ *dst_sz = *dst_sz + 1;
+ s += width;
+ sz -= width;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqFormatterSplitter_DumpByRead( const SRASplitter* cself, spotid_t spot, const readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqFormatterSplitter* self = ( FastqFormatterSplitter* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ rc = SRASplitter_FileActivate( cself, FastqArgs.file_extension );
+ if ( rc == 0 )
+ {
+ DeflineData def_data;
+ const char* spot_name = NULL, *spot_group = NULL, *read_name = NULL;
+ uint32_t readIdx, spot_len = 0;
+ uint32_t num_reads, readId, k;
+ size_t sname_sz, sgrp_sz;
+ INSDC_coord_len rlabel_sz = 0, read_len = 0;
+
+ if ( FastqArgs.b_defline || FastqArgs.q_defline )
+ {
+ rc = FastqReader_SpotInfo( self->reader, &spot_name, &sname_sz, &spot_group, &sgrp_sz, &spot_len, &num_reads );
+ }
+ else
+ {
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ }
+
+ for ( readId = 1, readIdx = 1; rc == 0 && readId <= num_reads; readId++, readIdx++ )
+ {
+ if ( !isset_readmask( readmask, readId - 1 ) )
+ {
+ continue;
+ }
+ if ( FastqArgs.b_defline || FastqArgs.q_defline )
+ {
+ rc = FastqReader_SpotReadInfo( self->reader, readId, NULL, &read_name, &rlabel_sz, NULL, &read_len );
+ if ( rc == 0 )
+ {
+ rc = Defline_Bind( &def_data, self->accession, &spot, spot_name, sname_sz, spot_group, sgrp_sz,
+ &spot_len, &readIdx, read_name, rlabel_sz, &read_len );
+ }
+ }
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.b_defline )
+ {
+ IF_BUF( ( Defline_Build( FastqArgs.b_defline, &def_data, self->b[0]->base,
+ KDataBufferBytes( self->b[0] ), &self->bsz[0] ) ), self->b[0], self->bsz[0] );
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderBaseName( self->reader, readId, &FastqArgs.dumpCs, self->b[0]->base,
+ KDataBufferBytes( self->b[0] ), &self->bsz[0] ) ), self->b[0], self->bsz[0] );
+ }
+ }
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.fasta > 0 )
+ {
+ IF_BUF( ( FastqReaderBase( self->reader, readId, self->b[4]->base, KDataBufferBytes( self->b[4] ),
+ &self->bsz[4] ) ), self->b[4], self->bsz[4] )
+ {
+ rc = FastqFormatterSplitter_WrapLine( self->b[4], self->bsz[4], self->b[1], &self->bsz[1], FastqArgs.fasta );
+ }
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderBase( self->reader, readId, self->b[1]->base,
+ KDataBufferBytes( self->b[1] ), &self->bsz[1] ) ), self->b[1], self->bsz[1] );
+ }
+ }
+ if ( !FastqArgs.fasta && rc == 0 )
+ {
+ if ( FastqArgs.q_defline )
+ {
+ IF_BUF( ( Defline_Build( FastqArgs.q_defline, &def_data, self->b[2]->base,
+ KDataBufferBytes( self->b[2] ), &self->bsz[2] ) ), self->b[2], self->bsz[2] );
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderQualityName( self->reader, readId, &FastqArgs.dumpCs, self->b[2]->base,
+ KDataBufferBytes( self->b[2] ), &self->bsz[2] ) ), self->b[2], self->bsz[2] );
+ }
+ if ( rc == 0 )
+ {
+ IF_BUF( ( FastqReaderQuality( self->reader, readId, self->b[3]->base,
+ KDataBufferBytes( self->b[3] ), &self->bsz[3] ) ), self->b[3], self->bsz[3] );
+ }
+ }
+ else if ( ( (char*)(self->b[0]->base))[0] == '@' )
+ {
+ ( (char*)(self->b[0]->base) )[0] = '>';
+ }
+ for ( k = 0; rc == 0 && k < ( FastqArgs.fasta ? 2 : 4); k++ )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, self->b[ k ]->base, self->bsz[ k ] );
+ if ( rc == 0 )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, "\n", 1 );
+ }
+ }
+ }
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t Fasta_dump( const SRASplitter* cself, FastqFormatterSplitter* self, spotid_t spot, uint32_t columns )
+{
+ uint32_t readId;
+ rc_t rc = FastqFormatterSplitter_WrapLine( self->b[4], self->bsz[4], self->b[1], &self->bsz[1], columns );
+ for ( readId = 0; rc == 0 && readId < 2; readId++ )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, self->b[readId]->base, self->bsz[ readId ] );
+ if ( rc == 0 )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, "\n", 1 );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqFormatterSplitter_DumpBySpot( const SRASplitter* cself, spotid_t spot, const readmask_t* readmask )
+{
+ rc_t rc = 0;
+ FastqFormatterSplitter* self = ( FastqFormatterSplitter* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderSeekSpot( self->reader, spot );
+ if ( rc == 0 )
+ {
+ uint32_t num_reads, readId;
+
+ rc = FastqReader_SpotInfo( self->reader, NULL, NULL, NULL, NULL, NULL, &num_reads );
+ for ( readId = 0; rc == 0 && readId < num_reads; readId++ )
+ {
+ /* if any read in readmask is not set - skip whole spot */
+ if ( !isset_readmask( readmask, readId ) )
+ {
+ return 0;
+ }
+ }
+ if ( rc == 0 )
+ {
+ rc = SRASplitter_FileActivate( cself, FastqArgs.file_extension );
+ if ( rc == 0 )
+ {
+ DeflineData def_data;
+ const char* spot_name = NULL, *spot_group = NULL;
+ uint32_t spot_len = 0;
+ size_t writ, sname_sz, sgrp_sz;
+ const int base_i = FastqArgs.fasta ? 4 : 1;
+
+ if ( FastqArgs.b_defline || FastqArgs.q_defline )
+ {
+ rc = FastqReader_SpotInfo( self->reader, &spot_name, &sname_sz,
+ &spot_group, &sgrp_sz, &spot_len, NULL );
+ if ( rc == 0 )
+ {
+ rc = Defline_Bind( &def_data, self->accession, &spot, spot_name,
+ sname_sz, spot_group, sgrp_sz,
+ &spot_len, &readId, NULL, 0, &spot_len );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.b_defline )
+ {
+ IF_BUF( ( Defline_Build( FastqArgs.b_defline, &def_data, self->b[0]->base,
+ KDataBufferBytes( self->b[0] ), &self->bsz[0] ) ), self->b[0], self->bsz[0] );
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderBaseName( self->reader, 0, &FastqArgs.dumpCs, self->b[0]->base,
+ KDataBufferBytes( self->b[0] ), &self->bsz[0] ) ), self->b[0], self->bsz[0] );
+ }
+ self->bsz[ base_i ] = 0;
+ if ( !FastqArgs.fasta && rc == 0 )
+ {
+ if ( FastqArgs.q_defline )
+ {
+ IF_BUF( ( Defline_Build( FastqArgs.q_defline, &def_data, self->b[2]->base,
+ KDataBufferBytes( self->b[2] ), &self->bsz[2] ) ), self->b[2], self->bsz[2] );
+ }
+ else
+ {
+ IF_BUF( ( FastqReaderQualityName( self->reader, 0, &FastqArgs.dumpCs, self->b[2]->base,
+ KDataBufferBytes( self->b[2] ), &self->bsz[2] ) ), self->b[2], self->bsz[2] );
+ }
+ self->bsz[3] = 0;
+ }
+ else if ( ( (char*)(self->b[0]->base) )[0] == '@' )
+ {
+ ( (char*)(self->b[0]->base) )[0] = '>';
+ }
+ }
+
+ for ( readId = 1; rc == 0 && readId <= num_reads; readId++ )
+ {
+ IF_BUF( ( FastqReaderBase( self->reader, readId, &( (char*)(self->b[base_i]->base) )[ self->bsz[ base_i ] ],
+ KDataBufferBytes( self->b[ base_i ] ) - self->bsz[ base_i ], &writ) ), self->b[ base_i ], self->bsz[ base_i ] + writ )
+ {
+ self->bsz[base_i] += writ;
+ if ( !FastqArgs.fasta )
+ {
+ IF_BUF( ( FastqReaderQuality( self->reader, readId, &( (char*)(self->b[3]->base) )[ self->bsz[3] ],
+ KDataBufferBytes( self->b[3] ) - self->bsz[3], &writ ) ), self->b[3], self->bsz[3] + writ )
+ {
+ self->bsz[ 3 ] += writ;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.fasta > 0 )
+ {
+ /* special printint of fasta-output ( line-wrap... ) */
+ rc = Fasta_dump( cself, self, spot, FastqArgs.fasta );
+ }
+ else
+ {
+ for ( readId = 0; rc == 0 && readId < 4; readId++ )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, self->b[readId]->base, self->bsz[ readId ] );
+ if ( rc == 0 )
+ {
+ rc = SRASplitter_FileWrite( cself, spot, "\n", 1 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ else if ( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound )
+ {
+ SRA_DUMP_DBG( 3, ( "%s skipped %u row\n", __func__, spot ) );
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+typedef struct FastqFormatterFactory_struct
+{
+ const char* accession;
+ const SRATable* table;
+ const FastqReader* reader;
+ KDataBuffer buf[ 5 ]; /* fifth is for fasta line wrap */
+} FastqFormatterFactory;
+
+
+static rc_t FastqFormatterFactory_Init( const SRASplitterFactory* cself )
+{
+ rc_t rc = 0;
+ FastqFormatterFactory* self = ( FastqFormatterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = FastqReaderMake( &self->reader, self->table, self->accession,
+ FastqArgs.dumpCs, FastqArgs.dumpOrigFmt, FastqArgs.fasta > 0, FastqArgs.dumpCs,
+ FastqArgs.readIds, !FastqArgs.applyClip, FastqArgs.SuppressQualForCSKey, 0,
+ FastqArgs.offset, FastqArgs.desiredCsKey[ 0 ], 0, 0 );
+ if ( rc == 0 )
+ {
+ int i;
+ for( i = 0; rc == 0 && i < sizeof( self->buf ) / sizeof( self->buf[ 0 ] ); i++ )
+ {
+ rc = KDataBufferMakeBytes( &self->buf[ i ], DATABUFFERINITSIZE );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t FastqFormatterFactory_NewObj( const SRASplitterFactory* cself, const SRASplitter** splitter )
+{
+ rc_t rc = 0;
+ FastqFormatterFactory* self = ( FastqFormatterFactory* )cself;
+
+ if ( self == NULL )
+ {
+ rc = RC( rcExe, rcType, rcExecuting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitter_Make ( splitter, sizeof( FastqFormatterSplitter ), NULL, NULL,
+ FastqArgs.split_spot ?
+ FastqFormatterSplitter_DumpByRead :
+ FastqFormatterSplitter_DumpBySpot, NULL );
+ if ( rc == 0 )
+ {
+ int i;
+ ( (FastqFormatterSplitter*)(*splitter) )->accession = self->accession;
+ ( (FastqFormatterSplitter*)(*splitter) )->reader = self->reader;
+ for ( i = 0; i < sizeof( self->buf ) / sizeof( self->buf[ 0 ] ); i++ )
+ {
+ ( (FastqFormatterSplitter*)(*splitter) )->b[ i ] = &self->buf[ i ];
+ }
+ }
+ }
+ return rc;
+}
+
+
+static void FastqFormatterFactory_Release( const SRASplitterFactory* cself )
+{
+ if ( cself != NULL )
+ {
+ int i;
+ FastqFormatterFactory* self = ( FastqFormatterFactory* )cself;
+ FastqReaderWhack( self->reader );
+ for ( i = 0; i < sizeof( self->buf ) / sizeof( self->buf[ 0 ] ); i++ )
+ {
+ KDataBufferWhack( &self->buf[ i ] );
+ }
+ }
+}
+
+
+static rc_t FastqFormatterFactory_Make( const SRASplitterFactory** cself,
+ const char* accession, const SRATable* table )
+{
+ rc_t rc = 0;
+ FastqFormatterFactory* obj = NULL;
+
+ if ( cself == NULL || accession == NULL || table == NULL )
+ {
+ rc = RC( rcExe, rcType, rcConstructing, rcParam, rcNull );
+ }
+ else
+ {
+ rc = SRASplitterFactory_Make( cself, eSplitterFormat, sizeof( *obj ),
+ FastqFormatterFactory_Init,
+ FastqFormatterFactory_NewObj,
+ FastqFormatterFactory_Release );
+ if ( rc == 0 )
+ {
+ obj = (FastqFormatterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ }
+ return rc;
+}
+
+
+/* ### External entry points ##################################################### */
+
+
+const char UsageDefaultName[] = "fastq-dump";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return 0;
+}
+
+#define H_splip_sot 0
+#define H_clip 1
+#define H_minReadLen 2
+#define H_qual_filter 3
+#define H_skip_tech 4
+#define H_split_files 5
+#define H_split_3 6
+#define H_dumpcs 7
+#define H_dumpbase 8
+#define H_offset 9
+#define H_fasta 10
+#define H_origfmt 11
+#define H_readids 12
+#define H_helicos 13
+#define H_defline_seq 14
+#define H_defline_qual 15
+#define H_aligned 16
+#define H_unaligned 17
+#define H_aligned_region 18
+#define H_matepair_distance 19
+#define H_qual_filter_1 20
+#define H_SuppressQualForCSKey 21
+
+rc_t FastqDumper_Usage( const SRADumperFmt* fmt, const SRADumperFmt_Arg* core_args, int first )
+{
+ int i, j;
+ /* known core options */
+ const SRADumperFmt_Arg* core[ 13 ];
+
+ memset( (void*)core, 0, sizeof( core ) );
+ for ( i = first; core_args[i].abbr != NULL || core_args[ i ].full != NULL; i++ )
+ {
+ const char* nm = core_args[ i ].abbr;
+ nm = nm ? nm : core_args[ i ].full;
+ if ( strcmp( nm, "A" ) == 0 )
+ {
+ core[ 0 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "O" ) == 0 )
+ {
+ core[ 1 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "N" ) == 0 )
+ {
+ core[ 2 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "X" ) == 0 )
+ {
+ core[ 3 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "G" ) == 0 )
+ {
+ core[ 4 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "spot-groups" ) == 0 )
+ {
+ core[ 5 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "R" ) == 0 )
+ {
+ core[ 6 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "T" ) == 0 )
+ {
+ core[ 7 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "K" ) == 0 )
+ {
+ core[ 8 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "table" ) == 0 )
+ {
+ core[ 9 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "Z" ) == 0 )
+ {
+ core[ 10 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "gzip" ) == 0 )
+ {
+ core[ 11 ] = &core_args[ i ];
+ }
+ else if ( strcmp( nm, "bzip2" ) == 0 )
+ {
+ core[ 12 ] = &core_args[ i ];
+ }
+ }
+
+#define OARG(arg,msg) (arg ? HelpOptionLine((arg)->abbr, (arg)->full, (arg)->param, \
+ msg ? msg : (const char**)((arg)->descr)) : ((void)(0)))
+
+ OUTMSG(( "INPUT\n" ));
+ OARG( core[ 0 ], NULL );
+ OARG( core[ 9 ], NULL );
+
+ OUTMSG(( "\nPROCESSING\n" ));
+ OUTMSG(( "\nRead Splitting Sequence data may be used in raw form or\n"));
+ OUTMSG(( " split into individual reads\n" ));
+ OARG( &fmt->arg_desc[ 0 ], NULL);
+
+ OUTMSG(( "\nFull Spot Filters Applied to the full spot independently\n" ));
+ OUTMSG(( " of --%s\n", fmt->arg_desc[0].full ));
+ OARG( core[ 2 ], NULL );
+ OARG( core[ 3 ], NULL );
+ OARG( core[ 5 ], NULL );
+ OARG( &fmt->arg_desc[ 1 ], NULL );
+
+ OUTMSG(( "\nCommon Filters Applied to spots when --%s is not\n",
+ fmt->arg_desc[0].full ));
+ OUTMSG(( " set, otherwise - to individual reads\n" ));
+ OARG( &fmt->arg_desc[ 2 ], NULL );
+ OARG( core[ 6 ], NULL );
+ OARG( &fmt->arg_desc[ 3 ], NULL );
+ OARG( &fmt->arg_desc[ H_qual_filter_1 ], NULL );
+
+ OUTMSG(( "\nFilters based on alignments Filters are active when alignment\n" ));
+ OUTMSG(( " data are present\n" ));
+ OARG( &fmt->arg_desc[ 16 ], NULL );
+ OARG( &fmt->arg_desc[ 17 ], NULL );
+ OARG( &fmt->arg_desc[ 18 ], NULL );
+ OARG( &fmt->arg_desc[ 19 ], NULL );
+
+ OUTMSG(( "\nFilters for individual reads Applied only with --%s set\n",
+ fmt->arg_desc[0].full ));
+ OARG( &fmt->arg_desc[ 4 ], NULL );
+
+ OUTMSG(( "\nOUTPUT\n" ));
+ OARG( core[ 1 ], NULL );
+ OARG( core[ 10 ], NULL );
+ OARG( core[ 11 ], NULL );
+ OARG( core[ 12 ], NULL);
+
+ OUTMSG(( "\nMultiple File Options Setting these options will produce more\n" ));
+ OUTMSG(( " than 1 file, each of which will be suffixed\n" ));
+ OUTMSG(( " according to splitting criteria.\n" ));
+ OARG( &fmt->arg_desc[ 5 ], NULL );
+ OARG( &fmt->arg_desc[ 6 ], NULL );
+ OARG( core[ 4 ], NULL );
+ OARG( core[ 6 ], NULL );
+ OARG( core[ 7 ], NULL );
+ OARG( core[ 8 ], NULL );
+
+ OUTMSG(( "\nFORMATTING\n" ));
+ OUTMSG(( "\nSequence\n" ));
+ OARG( &fmt->arg_desc[ 7 ], NULL );
+ OARG( &fmt->arg_desc[ 8 ], NULL );
+
+ OUTMSG(( "\nQuality\n" ));
+ OARG( &fmt->arg_desc[ 9 ], NULL );
+ OARG( &fmt->arg_desc[ 10 ], NULL );
+ OARG( &fmt->arg_desc[ H_SuppressQualForCSKey ], NULL ); /* added Jan 15th 2014 ( a new fastq-variation! ) */
+
+ OUTMSG(( "\nDefline\n" ));
+ OARG( &fmt->arg_desc[ 11 ], NULL );
+ OARG( &fmt->arg_desc[ 12 ], NULL );
+ OARG( &fmt->arg_desc[ 13 ], NULL );
+ OARG( &fmt->arg_desc[ 14 ], NULL );
+ OARG( &fmt->arg_desc[ 15 ], NULL );
+
+ OUTMSG(( "OTHER:\n" ));
+ for ( i = first; core_args[ i ].abbr != NULL || core_args[ i ].full != NULL; i++ )
+ {
+ bool print = true;
+ for ( j = 0; j < sizeof( core ) / sizeof( core[ 0 ] ); j++ )
+ {
+ if ( core[ j ] == &core_args[ i ] )
+ {
+ print = false;
+ break;
+ }
+ }
+ if ( print )
+ {
+ OARG( &core_args[ i ], NULL );
+ }
+ }
+ return 0;
+}
+
+
+rc_t FastqDumper_Release( const SRADumperFmt* fmt )
+{
+ if ( fmt == NULL )
+ {
+ return RC( rcExe, rcFormatter, rcDestroying, rcParam, rcInvalid );
+ }
+ else
+ {
+ Defline_Release( FastqArgs.b_defline );
+ Defline_Release( FastqArgs.q_defline );
+ free( FastqArgs.alregion );
+ }
+ return 0;
+}
+
+
+bool FastqDumper_AddArg( const SRADumperFmt* fmt, GetArg* f, int* i, int argc, char *argv[] )
+{
+ const char* arg = NULL;
+
+ if ( fmt == NULL || f == NULL || i == NULL || argv == NULL )
+ {
+ LOGERR( klogErr, RC( rcExe, rcArgv, rcReading, rcParam, rcInvalid ), "null param" );
+ return false;
+ }
+ else if ( f( fmt, "M", "minReadLen", i, argc, argv, &arg ) )
+ {
+ FastqArgs.minReadLen = AsciiToU32( arg, NULL, NULL );
+ }
+ else if ( f( fmt, "W", "clip", i, argc, argv, NULL ) )
+ {
+ FastqArgs.applyClip = true;
+ }
+ else if ( f( fmt, "SU", "suppress-qual-for-cskey", i, argc, argv, NULL ) )
+ {
+ FastqArgs.SuppressQualForCSKey = true;
+ }
+ else if ( f( fmt, "F", "origfmt", i, argc, argv, NULL ) )
+ {
+ FastqArgs.dumpOrigFmt = true;
+ }
+ else if ( f( fmt, "C", "dumpcs", i, argc, argv, NULL ) )
+ {
+ int k = ( *i ) + 1;
+ FastqArgs.dumpCs = true;
+ if ( k < argc && strlen( argv[ k ] ) == 1 && strchr( "acgtACGT", argv[ k ][ 0 ] ) != NULL )
+ {
+ FastqArgs.desiredCsKey = argv[ k ];
+ *i = k;
+ }
+ }
+ else if ( f( fmt, "B", "dumpbase", i, argc, argv, NULL ) )
+ {
+ FastqArgs.dumpBase = true;
+ }
+ else if ( f( fmt, "Q", "offset", i, argc, argv, &arg ) )
+ {
+ FastqArgs.offset = AsciiToU32( arg, NULL, NULL );
+ }
+ else if ( f( fmt, "I", "readids", i, argc, argv, NULL ) )
+ {
+ FastqArgs.readIds = true;
+ }
+ else if ( f( fmt, "E", "qual-filter", i, argc, argv, NULL ) )
+ {
+ FastqArgs.qual_filter = true;
+ }
+ else if ( f( fmt, "E1", "qual-filter-1", i, argc, argv, NULL ) )
+ {
+ FastqArgs.qual_filter1 = true;
+ }
+ else if ( f( fmt, "DB", "defline-seq", i, argc, argv, &arg ) )
+ {
+ FastqArgs.b_deffmt = arg;
+ }
+ else if ( f( fmt, "DQ", "defline-qual", i, argc, argv, &arg ) )
+ {
+ FastqArgs.q_deffmt = arg;
+ }
+ else if ( f( fmt, "TR", "skip-technical", i, argc, argv, NULL ) )
+ {
+ FastqArgs.skipTechnical = true;
+ }
+ else if ( f( fmt, "SF", "split-files", i, argc, argv, NULL ) )
+ {
+ SRADumperFmt * nc_fmt = ( SRADumperFmt * )fmt;
+ FastqArgs.split_spot = true;
+ FastqArgs.split_files = true;
+ nc_fmt->split_files = true;
+ }
+ else if ( f( fmt, NULL, "split-3", i, argc, argv, NULL ) )
+ {
+ FastqArgs.split_3 = true;
+ FastqArgs.split_spot = true;
+ FastqArgs.maxReads = 2;
+ FastqArgs.skipTechnical = true;
+ }
+ else if ( f( fmt, "SL", "split-spot", i, argc, argv, NULL ) )
+ {
+ FastqArgs.split_spot = true;
+ }
+ else if ( f( fmt, "HS", "helicos", i, argc, argv, NULL ) )
+ {
+ FastqArgs.b_deffmt = "@$sn";
+ FastqArgs.q_deffmt = "+";
+ }
+ else if ( f( fmt, "FA", "fasta", i, argc, argv, NULL ) )
+ {
+ int k = (*i) + 1;
+ FastqArgs.fasta = 70;
+ if ( k < argc && isdigit( argv[ k ][ 0 ] ) )
+ {
+ char* endp = NULL;
+ errno = 0;
+ FastqArgs.fasta = strtou64( argv[ k ], &endp, 10 );
+ if ( errno != 0 || endp == NULL || *endp != '\0' )
+ {
+ return false;
+ }
+ *i = k;
+ if ( FastqArgs.fasta == 0 )
+ {
+ FastqArgs.fasta = ~0;
+ }
+ }
+ FastqArgs.file_extension = ".fasta";
+ }
+ else if ( f( fmt, NULL, "aligned", i, argc, argv, NULL ) )
+ {
+ FastqArgs.aligned = true;
+ }
+ else if ( f( fmt, NULL, "unaligned", i, argc, argv, NULL ) )
+ {
+ FastqArgs.unaligned = true;
+ }
+ else if ( f( fmt, NULL, "aligned-region", i, argc, argv, &arg ) )
+ {
+ /* name[:[from][-[to]]] */
+ TAlignedRegion* r = realloc( FastqArgs.alregion, sizeof( *FastqArgs.alregion ) * ++FastqArgs.alregion_qty );
+ if ( r == NULL )
+ {
+ return false;
+ }
+ FastqArgs.alregion = r;
+ r = &FastqArgs.alregion[ FastqArgs.alregion_qty - 1 ];
+ r->name = strchr( arg, ':' );
+ r->from = 0;
+ r->to = 0;
+ if ( r->name == NULL )
+ {
+ r->name = arg;
+ r->name_len = strlen( arg );
+ }
+ else
+ {
+ const char* c;
+ uint64_t* v;
+
+ r->name_len = r->name - arg;
+ c = r->name;
+ r->name = arg;
+
+ v = &r->from;
+ while ( *++c != '\0')
+ {
+ if ( *c == '-' )
+ {
+ v = &r->to;
+ }
+ else if ( *c == '+' )
+ {
+ if ( *v != 0 )
+ {
+ return false;
+ }
+ }
+ else if ( !isdigit( *c ) )
+ {
+ return false;
+ }
+ else
+ {
+ *v = *v * 10 + ( *c - '0' );
+ }
+ }
+ if ( r->from > r->to && r->to != 0 )
+ {
+ uint64_t x = r->from;
+ r->from = r->to;
+ r->to = x;
+ }
+ }
+ }
+ else if ( f( fmt, NULL, "matepair-distance", i, argc, argv, &arg ) )
+ {
+ /* from[-to] | [from]-to | unknown */
+ if ( strcmp( arg, "unknown" ) == 0 )
+ {
+ FastqArgs.mp_dist_unknown = true;
+ }
+ else
+ {
+ uint64_t* v;
+ TMatepairDistance* p = realloc( FastqArgs.mp_dist, sizeof( *FastqArgs.mp_dist ) * ++FastqArgs.mp_dist_qty );
+ if ( p == NULL )
+ {
+ return false;
+ }
+ FastqArgs.mp_dist = p;
+ p = &FastqArgs.mp_dist[ FastqArgs.mp_dist_qty - 1 ];
+ p->from = 0;
+ p->to = 0;
+
+ v = &p->from;
+ while ( *++arg != '\0' )
+ {
+ if ( *arg == '-' )
+ {
+ v = &p->to;
+ }
+ else if ( *arg == '+' )
+ {
+ if ( *v != 0 )
+ {
+ return false;
+ }
+ }
+ else if ( !isdigit( *arg ) )
+ {
+ return false;
+ }
+ else
+ {
+ *v = *v * 10 + ( *arg - '0' );
+ }
+ }
+ if ( p->from > p->to && p->to != 0 )
+ {
+ uint64_t x = p->from;
+ p->from = p->to;
+ p->to = x;
+ }
+ if ( p->from == 0 && p->to == 0 )
+ {
+ FastqArgs.mp_dist_qty--;
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+ return true;
+}
+
+
+rc_t FastqDumper_Factories( const SRADumperFmt* fmt, const SRASplitterFactory** factory )
+{
+ rc_t rc = 0;
+ const SRASplitterFactory* parent = NULL, *child = NULL;
+
+ if ( fmt == NULL || factory == NULL )
+ {
+ return RC( rcExe, rcFormatter, rcReading, rcParam, rcInvalid );
+ }
+ *factory = NULL;
+ {
+ const SRAColumn* c = NULL;
+ rc = SRATableOpenColumnRead( fmt->table, &c, "PLATFORM", sra_platform_id_t );
+ if ( rc == 0 )
+ {
+ const INSDC_SRA_platform_id * platform;
+ bitsz_t o, z;
+ rc = SRAColumnRead( c, 1, ( const void ** )&platform, &o, &z );
+ if ( rc == 0 )
+ {
+ if ( !FastqArgs.dumpCs && !FastqArgs.dumpBase )
+ {
+ if ( platform != NULL && *platform == SRA_PLATFORM_ABSOLID )
+ {
+ FastqArgs.dumpCs = true;
+ }
+ else
+ {
+ FastqArgs.dumpBase = true;
+ }
+ }
+ if ( platform != NULL && *platform == SRA_PLATFORM_ABSOLID )
+ {
+ FastqArgs.is_platform_cs_native = true;
+ }
+ }
+ SRAColumnRelease( c );
+ }
+ else if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == ( enum RCObject )rcColumn )
+ {
+ rc = 0;
+ }
+ }
+
+ if ( ( FastqArgs.aligned || FastqArgs.unaligned ) && !( FastqArgs.aligned && FastqArgs.unaligned ) )
+ {
+ rc = AlignedFilterFactory_Make( &child, fmt->table, FastqArgs.aligned, FastqArgs.unaligned );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release(child);
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( FastqArgs.alregion_qty > 0 )
+ {
+ rc = AlignRegionFilterFactory_Make( &child, fmt->table, FastqArgs.alregion, FastqArgs.alregion_qty );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( FastqArgs.mp_dist_unknown || FastqArgs.mp_dist_qty > 0 )
+ {
+ rc = AlignPairDistanceFilterFactory_Make( &child, fmt->table,
+ FastqArgs.mp_dist_unknown, FastqArgs.mp_dist, FastqArgs.mp_dist_qty);
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release(child);
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( rc == 0 && FastqArgs.skipTechnical && FastqArgs.split_spot )
+ {
+ rc = FastqBioFilterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( rc == 0 && FastqArgs.maxReads > 0 )
+ {
+ rc = FastqRNumberFilterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( rc == 0 && ( FastqArgs.qual_filter || FastqArgs.qual_filter1 ) )
+ {
+ rc = FastqQFilterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = FastqReadLenFilterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.split_3 )
+ {
+ rc = Fastq3ReadSplitterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ else if ( FastqArgs.split_files )
+ {
+ rc = FastqReadSplitterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release(child);
+ }
+ else
+ {
+ parent = child;
+ }
+ }
+ else
+ {
+ parent = child;
+ *factory = parent;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( FastqArgs.b_deffmt != NULL )
+ {
+ rc = Defline_Parse( &FastqArgs.b_defline, FastqArgs.b_deffmt );
+ }
+ if ( FastqArgs.q_deffmt != NULL )
+ {
+ rc = Defline_Parse( &FastqArgs.q_defline, FastqArgs.q_deffmt );
+ }
+ if ( rc == 0 )
+ {
+ rc = FastqFormatterFactory_Make( &child, fmt->accession, fmt->table );
+ if ( rc == 0 )
+ {
+ if ( parent != NULL )
+ {
+ rc = SRASplitterFactory_AddNext( parent, child );
+ if ( rc != 0 )
+ {
+ SRASplitterFactory_Release( child );
+ }
+ }
+ else
+ {
+ *factory = child;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+/* main entry point of the file */
+rc_t SRADumper_Init( SRADumperFmt* fmt )
+{
+ static const SRADumperFmt_Arg arg[] =
+ {
+
+ /* DO NOT ADD IN THE MIDDLE ORDER IS IMPORTANT IN USAGE FUNCTION ABOVE!!! */
+ {NULL, "split-spot", NULL, {"Split spots into individual reads", NULL}}, /* H_splip_sot = 0 */
+
+ {"W", "clip", NULL, {"Clip adapter sequences", NULL}}, /* H_clip = 1 */
+
+ {"M", "minReadLen", "len", {"Filter by sequence length >= <len>", NULL}}, /* H_minReadLen = 2 */
+ {"E", "qual-filter", NULL, {"Filter used in early 1000 Genomes data:", /* H_qual_filter = 3 */
+ "no sequences starting or ending with >= 10N", NULL}},
+
+ {NULL, "skip-technical", NULL, {"Dump only biological reads", NULL}}, /* H_skip_tech = 4 */
+
+ {NULL, "split-files", NULL, {"Dump each read into a separate file." /* H_split_files = 5 */
+ "Files will receive suffix corresponding to read number", NULL}},
+
+ /* DO NOT ADD IN THE MIDDLE ORDER IS IMPORTANT IN USAGE FUNCTION ABOVE!!! */
+ {NULL, "split-3", NULL, {"Legacy 3-file splitting for mate-pairs:", /* H_split_3 = 6 */
+ "First 2 biological reads satisfying dumping conditions",
+ "are placed in files *_1.fastq and *_2.fastq",
+ "If only one biological read is present - it is placed in *.fastq",
+ "Biological reads 3 and above are ignored.", NULL}},
+
+ {"C", "dumpcs", "[cskey]", {"Formats sequence using color space (default for SOLiD)," /* H_dumpcs = 7 */
+ "\"cskey\" may be specified for translation", NULL}},
+ {"B", "dumpbase", NULL, {"Formats sequence using base space (default for other than SOLiD).", NULL}}, /* H_dumpbase = 8 */
+
+ /* DO NOT ADD IN THE MIDDLE ORDER IS IMPORTANT IN USAGE FUNCTION ABOVE!!! */
+ {"Q", "offset", "integer", {"Offset to use for quality conversion, default is 33", NULL}}, /* H_offset = 9 */
+ {NULL, "fasta", "[line width]", {"FASTA only, no qualities, optional line wrap width (set to zero for no wrapping)", NULL}}, /* H_fasta = 10 */
+
+ {"F", "origfmt", NULL, {"Defline contains only original sequence name", NULL}}, /* H_origfmt = 11 */
+ {"I", "readids", NULL, {"Append read id after spot id as 'accession.spot.readid' on defline", NULL}}, /* H_readids = 12 */
+ {NULL, "helicos", NULL, {"Helicos style defline", NULL}}, /* H_helicos = 13 */
+ {NULL, "defline-seq", "fmt", {"Defline format specification for sequence.", NULL}}, /* H_defline_seq = 14 */
+ {NULL, "defline-qual", "fmt", {"Defline format specification for quality.", /* H_defline_qual = 15 */
+ "<fmt> is a string of characters and/or variables. The variables can be one of:",
+ "$ac - accession, $si - spot id, $sn - spot name, $sg - spot group (barcode),",
+ "$sl - spot length in bases, $ri - read number, $rn - read name, $rl - read length in bases.",
+ "'[]' could be used for an optional output: if all vars in [] yield empty values whole group is not printed.",
+ "Empty value is empty string or 0 for numeric variables.",
+ "Ex: @$sn[_$rn]/$ri - '_$rn' is omitted if name is empty\n", NULL}},
+
+ {NULL, "aligned", NULL, {"Dump only aligned sequences", NULL}}, /* H_aligned = 16 */
+ {NULL, "unaligned", NULL, {"Dump only unaligned sequences", NULL}}, /* H_unaligned = 17 */
+
+ /* DO NOT ADD IN THE MIDDLE ORDER IS IMPORTANT IN USAGE FUNCTION ABOVE!!! */
+ {NULL, "aligned-region", "name[:from-to]", {"Filter by position on genome.", /* H_aligned_region = 18 */
+ "Name can either be accession.version (ex: NC_000001.10) or",
+ "file specific name (ex: \"chr1\" or \"1\").",
+ "\"from\" and \"to\" are 1-based coordinates", NULL}},
+ {NULL, "matepair-distance", "from-to|unknown", {"Filter by distance beiween matepairs.", /* H_matepair-distance = 19 */
+ "Use \"unknown\" to find matepairs split between the references.",
+ "Use from-to to limit matepair distance on the same reference", NULL}},
+
+ {NULL, "qual-filter-1", NULL, {"Filter used in current 1000 Genomes data", NULL}}, /* H_qual_filter_1 = 20 */
+
+ {NULL, "suppress-qual-for-cskey", NULL, {"supress quality-value for cskey", NULL}}, /* H_SuppressQualForCSKey = 21 */
+
+ {NULL, NULL, NULL, {NULL}}
+ };
+
+ if ( fmt == NULL )
+ {
+ return RC( rcExe, rcFileFormat, rcConstructing, rcParam, rcNull );
+ }
+
+ memset( &FastqArgs, 0, sizeof( FastqArgs ) );
+ FastqArgs.is_platform_cs_native = false;
+ FastqArgs.maxReads = 0;
+ FastqArgs.skipTechnical = false;
+ FastqArgs.minReadLen = 1;
+ FastqArgs.applyClip = false;
+ FastqArgs.SuppressQualForCSKey = false; /* added Jan 15th 2014 ( a new fastq-variation! ) */
+ FastqArgs.dumpOrigFmt = false;
+ FastqArgs.dumpBase = false;
+ FastqArgs.dumpCs = false;
+ FastqArgs.readIds = false;
+ FastqArgs.offset = 33;
+ FastqArgs.desiredCsKey = "";
+ FastqArgs.qual_filter = false;
+ FastqArgs.b_deffmt = NULL;
+ FastqArgs.b_defline = NULL;
+ FastqArgs.q_deffmt = NULL;
+ FastqArgs.q_defline = NULL;
+ FastqArgs.split_files = false;
+ FastqArgs.split_3 = false;
+ FastqArgs.split_spot = false;
+ FastqArgs.fasta = 0;
+ FastqArgs.file_extension = ".fastq";
+ FastqArgs.aligned = false;
+ FastqArgs.unaligned = false;
+ FastqArgs.alregion = NULL;
+ FastqArgs.alregion_qty = 0;
+ FastqArgs.mp_dist = NULL;
+ FastqArgs.mp_dist_unknown = false;
+ FastqArgs.mp_dist_qty = 0;
+
+ fmt->usage = FastqDumper_Usage;
+ fmt->release = FastqDumper_Release;
+ fmt->arg_desc = arg;
+ fmt->add_arg = FastqDumper_AddArg;
+ fmt->get_factory = FastqDumper_Factories;
+ fmt->gzip = true;
+ fmt->bzip2 = true;
+ fmt->split_files = false;
+
+ return 0;
+}
diff --git a/tools/sra-dump/illumina.c b/tools/sra-dump/illumina.c
new file mode 100644
index 0000000..56bfef2
--- /dev/null
+++ b/tools/sra-dump/illumina.c
@@ -0,0 +1,536 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <kapp/main.h>
+
+#include <sra/sradb.h>
+#include <sra/illumina.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "debug.h"
+#include "core.h"
+
+#define DATABUFFERINITSIZE 10240
+
+typedef enum {
+ eRead = 0x01,
+ eQual1_S = 0x02,
+ eQual1_M = 0x04,
+ eQual4 = 0x08,
+ eIntensity = 0x10,
+ eNoise = 0x20,
+ eSignal = 0x40,
+ eQSeq_S = 0x80,
+ eQSeq_M = 0x100
+} EIlluminaOptions;
+
+struct IlluminaArgs_struct {
+ EIlluminaOptions opt;
+} IlluminaArgs;
+
+
+/* ============== Illumina tile/lane splitter based on uint32_t pointer ============================ */
+typedef enum {
+ eIlluminaLaneSplitter = 1,
+ eIlluminaTileSplitter = 2
+} TIlluminaLaneSplitterType;
+
+typedef struct IlluminaU32Splitter_struct {
+ TIlluminaLaneSplitterType type;
+ const IlluminaReader* reader;
+ char key[128];
+} IlluminaU32Splitter;
+
+static
+rc_t IlluminaU32Splitter_GetKey(const SRASplitter* cself, const char** key, spotid_t spot, readmask_t* readmask)
+{
+ rc_t rc = 0;
+ IlluminaU32Splitter* self = (IlluminaU32Splitter*)cself;
+
+ if( self == NULL || key == NULL ) {
+ rc = RC(rcSRA, rcNode, rcExecuting, rcParam, rcInvalid);
+ } else {
+ *key = self->key;
+ self->key[0] = '\0';
+ if( (rc = IlluminaReaderSeekSpot(self->reader, spot)) == 0 ) {
+ int w;
+ INSDC_coord_val val;
+ switch( self->type ) {
+ case eIlluminaLaneSplitter:
+ w = 1;
+ rc = IlluminaReader_SpotInfo(self->reader, NULL, NULL, &val, NULL, NULL, NULL, NULL, NULL);
+ break;
+ case eIlluminaTileSplitter:
+ w = 4;
+ rc = IlluminaReader_SpotInfo(self->reader, NULL, NULL, NULL, &val, NULL, NULL, NULL, NULL);
+ break;
+ default:
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcInvalid);
+ }
+ if( rc == 0 ) {
+ sprintf(self->key, "%0*d", w, val);
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ *key = NULL;
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct IlluminaU32SplitterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ TIlluminaLaneSplitterType type;
+ const IlluminaReader* reader;
+} IlluminaU32SplitterFactory;
+
+static
+rc_t IlluminaU32SplitterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ IlluminaU32SplitterFactory* self = (IlluminaU32SplitterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else {
+ rc = IlluminaReaderMake(&self->reader, self->table, self->accession, true, false, false, false, false, false, false, 0, 0);
+ }
+ return rc;
+}
+
+static
+rc_t IlluminaU32SplitterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ IlluminaU32SplitterFactory* self = (IlluminaU32SplitterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(IlluminaU32Splitter), IlluminaU32Splitter_GetKey, NULL, NULL, NULL)) == 0 ) {
+ ((IlluminaU32Splitter*)(*splitter))->reader = self->reader;
+ ((IlluminaU32Splitter*)(*splitter))->type = self->type;
+ }
+ }
+ return rc;
+}
+
+static
+void IlluminaU32SplitterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ IlluminaU32SplitterFactory* self = (IlluminaU32SplitterFactory*)cself;
+ IlluminaReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t IlluminaU32SplitterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table, TIlluminaLaneSplitterType type)
+{
+ rc_t rc = 0;
+ IlluminaU32SplitterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterSpot, sizeof(*obj),
+ IlluminaU32SplitterFactory_Init,
+ IlluminaU32SplitterFactory_NewObj,
+ IlluminaU32SplitterFactory_Release)) == 0 ) {
+ obj = (IlluminaU32SplitterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ switch(type) {
+ case eIlluminaLaneSplitter:
+ case eIlluminaTileSplitter:
+ obj->type = type;
+ break;
+ default:
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcInvalid);
+ }
+ }
+ return rc;
+}
+
+/* ============== Illumina formatter object ============================ */
+
+typedef struct IlluminaFormatterSplitter_struct {
+ const IlluminaReader* reader;
+ KDataBuffer* b;
+} IlluminaFormatterSplitter;
+
+static
+rc_t IlluminaFormatterSplitter_Dump(const SRASplitter* cself, spotid_t spot, const readmask_t* readmask)
+{
+ rc_t rc = 0;
+ IlluminaFormatterSplitter* self = (IlluminaFormatterSplitter*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = IlluminaReaderSeekSpot(self->reader, spot)) == 0 ) {
+ size_t writ = 0;
+
+ if( rc == 0 && (IlluminaArgs.opt & eRead) &&
+ (rc = SRASplitter_FileActivate(cself, "seq.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderBase(self->reader, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eQual1_S) &&
+ (rc = SRASplitter_FileActivate(cself, "qcal.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderQuality1(self->reader, 0, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eQual1_M) ) {
+ uint32_t num_reads = 0;
+ if( (rc = IlluminaReader_SpotInfo(self->reader, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ int readId;
+ char key[128];
+ for(readId = 1; rc == 0 && readId <= num_reads; readId++) {
+ sprintf(key, "%u_qcal.txt", readId);
+ if( (rc = SRASplitter_FileActivate(cself, key)) == 0 ) {
+ IF_BUF((IlluminaReaderQuality1(self->reader, readId, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eQual4) && (rc = SRASplitter_FileActivate(cself, "prb.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderQuality4(self->reader, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eIntensity) && (rc = SRASplitter_FileActivate(cself, "int.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderIntensity(self->reader, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eNoise) && (rc = SRASplitter_FileActivate(cself, "nse.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderNoise(self->reader, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eSignal) && (rc = SRASplitter_FileActivate(cself, "sig2.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderSignal(self->reader, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eQSeq_S) && (rc = SRASplitter_FileActivate(cself, "qseq.txt")) == 0 ) {
+ IF_BUF((IlluminaReaderQSeq(self->reader, 0, true, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ if( rc == 0 && (IlluminaArgs.opt & eQSeq_M) ) {
+ uint32_t num_reads = 0;
+ if( (rc = IlluminaReader_SpotInfo(self->reader, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &num_reads)) == 0 ) {
+ uint32_t readId;
+ char key[128];
+ for(readId = 1; rc == 0 && readId <= num_reads; readId++) {
+ sprintf(key, "%u_qseq.txt", readId);
+ if( (rc = SRASplitter_FileActivate(cself, key)) == 0 ) {
+ IF_BUF((IlluminaReaderQSeq(self->reader, readId, true, self->b->base, KDataBufferBytes(self->b) - 1, &writ)), self->b, writ) {
+ if( writ > 0 ) {
+ ((char*)(self->b->base))[writ] = '\n';
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ + 1);
+ }
+ }
+ }
+ }
+ }
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+typedef struct IlluminaFormatterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ const IlluminaReader* reader;
+ KDataBuffer buf;
+} IlluminaFormatterFactory;
+
+
+/* refactored June 13 2014 by Wolfgang to fix a mysterious bug on windows where b_qseq resolved into false on windows
+ and true on posix! The original code was this:
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = IlluminaReaderMake(&self->reader, self->table, self->accession,
+ IlluminaArgs.opt & eRead, IlluminaArgs.opt & (eQual1_S | eQual1_M), IlluminaArgs.opt & eQual4,
+ IlluminaArgs.opt & eIntensity, IlluminaArgs.opt & eNoise, IlluminaArgs.opt & eSignal,
+ IlluminaArgs.opt & (eQSeq_S | eQSeq_M), 0, 0)) == 0 ) {
+ rc = KDataBufferMakeBytes(&self->buf, DATABUFFERINITSIZE);
+ }
+
+ Anton's old, more dense version should do the same, but it does not on Windows!
+
+ eQSeq_M is an enum, defined at the top of this file to have the value 0x100.
+ It will be type-casted into bool because that is the type IlluminaReaderMake() wants.
+ ( bool )eQSeq_M is true for GCC/LLVM and false for the MS-compiler!
+ Casting enum's directly without comparison into boolean does not work for the MS-compiler.
+*/
+static rc_t IlluminaFormatterFactory_Init( const SRASplitterFactory * cself )
+{
+ rc_t rc = 0;
+ IlluminaFormatterFactory * self = ( IlluminaFormatterFactory * )cself;
+
+ if ( self == NULL )
+ rc = RC( rcSRA, rcType, rcConstructing, rcParam, rcNull );
+ else
+ {
+ bool b_read = ( ( IlluminaArgs.opt & eRead ) != 0 );
+ bool b_qual1 = ( ( IlluminaArgs.opt & ( eQual1_S | eQual1_M ) ) != 0 );
+ bool b_qual4 = ( ( IlluminaArgs.opt & eQual4 ) != 0 );
+ bool b_intensity = ( ( IlluminaArgs.opt & eIntensity ) != 0 );
+ bool b_noise = ( ( IlluminaArgs.opt & eNoise ) != 0 );
+ bool b_signal = ( ( IlluminaArgs.opt & eSignal ) != 0 );
+ bool b_qseq = ( ( IlluminaArgs.opt & ( eQSeq_S | eQSeq_M ) ) != 0 );
+ rc = IlluminaReaderMake( &self->reader,
+ self->table,
+ self->accession,
+ b_read,
+ b_qual1,
+ b_qual4,
+ b_intensity,
+ b_noise,
+ b_signal,
+ b_qseq,
+ 0,
+ 0 );
+ if ( rc == 0 )
+ rc = KDataBufferMakeBytes( &self->buf, DATABUFFERINITSIZE );
+ }
+ return rc;
+}
+
+
+static
+rc_t IlluminaFormatterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ IlluminaFormatterFactory* self = (IlluminaFormatterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(IlluminaFormatterSplitter), NULL, NULL, IlluminaFormatterSplitter_Dump, NULL)) == 0 ) {
+ ((IlluminaFormatterSplitter*)(*splitter))->reader = self->reader;
+ ((IlluminaFormatterSplitter*)(*splitter))->b = &self->buf;
+ }
+ }
+ return rc;
+}
+
+static
+void IlluminaFormatterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ IlluminaFormatterFactory* self = (IlluminaFormatterFactory*)cself;
+ IlluminaReaderWhack(self->reader);
+ KDataBufferWhack(&self->buf);
+ }
+}
+
+static
+rc_t IlluminaFormatterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table)
+{
+ rc_t rc = 0;
+ IlluminaFormatterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterFormat, sizeof(*obj),
+ IlluminaFormatterFactory_Init,
+ IlluminaFormatterFactory_NewObj,
+ IlluminaFormatterFactory_Release)) == 0 ) {
+ obj = (IlluminaFormatterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ return rc;
+}
+
+/* ### External entry points ##################################################### */
+const char UsageDefaultName[] = "illumina-dump";
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t IlluminaDumper_Release(const SRADumperFmt* fmt)
+{
+ if( fmt == NULL ) {
+ return RC(rcExe, rcFormatter, rcDestroying, rcParam, rcInvalid);
+ }
+ return 0;
+}
+
+bool IlluminaDumper_AddArg(const SRADumperFmt* fmt, GetArg* f, int* i, int argc, char *argv[])
+{
+ const char* arg = NULL;
+ const char* qseq = "2";
+
+ if( fmt == NULL || f == NULL || i == NULL || argv == NULL ) {
+ LOGERR(klogErr, RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid), "null param");
+ return false;
+ } else if( f(fmt, "r", "read", i, argc, argv, NULL) ) {
+ IlluminaArgs.opt |= eRead;
+ } else if( f(fmt, "x", "qseq", i, argc, argv, &qseq) ) {
+ uint32_t q = AsciiToU32(qseq, NULL, NULL);
+ if( q == 1 ) {
+ IlluminaArgs.opt |= eQSeq_S;
+ IlluminaArgs.opt &= ~eQSeq_M;
+ } else if( q == 2 ) {
+ IlluminaArgs.opt |= eQSeq_M;
+ IlluminaArgs.opt &= ~eQSeq_S;
+ } else {
+ return false;
+ }
+ } else if( f(fmt, "q", "qual1", i, argc, argv, &arg) ) {
+ uint32_t q = AsciiToU32(arg, NULL, NULL);
+ if( q == 1 ) {
+ IlluminaArgs.opt |= eQual1_S;
+ IlluminaArgs.opt &= ~eQual1_M;
+ } else if( q == 2 ) {
+ IlluminaArgs.opt |= eQual1_M;
+ IlluminaArgs.opt &= ~eQual1_S;
+ } else {
+ return false;
+ }
+ } else if( f(fmt, "p", "qual4", i, argc, argv, NULL) ) {
+ IlluminaArgs.opt |= eQual4;
+ } else if( f(fmt, "i", "intensity", i, argc, argv, NULL) ) {
+ IlluminaArgs.opt |= eIntensity;
+ } else if( f(fmt, "n", "noise", i, argc, argv, NULL) ) {
+ IlluminaArgs.opt |= eNoise;
+ } else if( f(fmt, "s", "signal", i, argc, argv, NULL) ) {
+ IlluminaArgs.opt |= eSignal;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+rc_t IlluminaDumper_Factories(const SRADumperFmt* fmt, const SRASplitterFactory** factory)
+{
+ rc_t rc = 0;
+ const SRASplitterFactory* f_lane = NULL, *f_tile = NULL, *f_fmt = NULL;
+
+ if( fmt == NULL || factory == NULL ) {
+ return RC(rcExe, rcFormatter, rcReading, rcParam, rcInvalid);
+ }
+ *factory = NULL;
+
+ if( IlluminaArgs.opt == 0 ) {
+ IlluminaArgs.opt = eRead | eQual1_S;
+ }
+
+ if( (rc = IlluminaU32SplitterFactory_Make(&f_lane, fmt->accession, fmt->table, eIlluminaLaneSplitter)) == 0 ) {
+ if( (rc = IlluminaU32SplitterFactory_Make(&f_tile, fmt->accession, fmt->table, eIlluminaTileSplitter)) == 0 ) {
+ if( (rc = IlluminaFormatterFactory_Make(&f_fmt, fmt->accession, fmt->table)) == 0 ) {
+ if( (rc = SRASplitterFactory_AddNext(f_tile, f_fmt)) == 0 ) {
+ f_fmt = NULL;
+ if( (rc = SRASplitterFactory_AddNext(f_lane, f_tile)) == 0 ) {
+ f_tile = NULL;
+ *factory = f_lane;
+ }
+ }
+ }
+ }
+ }
+ if( rc != 0 ) {
+ SRASplitterFactory_Release(f_lane);
+ SRASplitterFactory_Release(f_tile);
+ SRASplitterFactory_Release(f_fmt);
+ }
+ return rc;
+}
+
+/* main entry point of the file */
+rc_t SRADumper_Init(SRADumperFmt* fmt)
+{
+ static const SRADumperFmt_Arg arg[] =
+ {
+ {"r", "read", NULL, {"Output READ: \"seq\", default is on", NULL}},
+ {"q", "qual1", "1|2", {"Output QUALITY, whole spot (1) or split by reads (2): \"qcal\", default is 1", NULL}},
+ {"p", "qual4", NULL, {"Output full QUALITY: \"prb\", default is off", NULL}},
+ {"i", "intensity", NULL, {"Output INTENSITY, if present: \"int\", default is off", NULL}},
+ {"n", "noise", NULL, {"Output NOISE, if present: \"nse\", default is off", NULL}},
+ {"s", "signal", NULL, {"Output SIGNAL, if present: \"sig2\", default is off", NULL}},
+ {"x", "qseq", "1|2", {"Output QSEQ format: whole spot (1) or split by reads: \"qseq\", default is off", NULL}},
+ {NULL, NULL, NULL, {NULL}}
+ };
+
+ IlluminaArgs.opt = 0;
+
+ if( fmt == NULL ) {
+ return RC(rcExe, rcFileFormat, rcConstructing, rcParam, rcNull);
+ }
+ fmt->release = IlluminaDumper_Release;
+ fmt->arg_desc = arg;
+ fmt->add_arg = IlluminaDumper_AddArg;
+ fmt->get_factory = IlluminaDumper_Factories;
+ fmt->gzip = true;
+ fmt->bzip2 = true;
+
+ return 0;
+}
diff --git a/tools/sra-dump/sff.c b/tools/sra-dump/sff.c
new file mode 100644
index 0000000..930f43f
--- /dev/null
+++ b/tools/sra-dump/sff.c
@@ -0,0 +1,200 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/log.h>
+
+#include <kapp/main.h>
+#include <sra/sradb.h>
+#include <sra/sff.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+
+#include "debug.h"
+#include "core.h"
+
+#define DATABUFFERINITSIZE 10240
+
+typedef struct SFFFormatterSplitter_struct {
+ const SFFReader* reader;
+ spotid_t spots;
+ KDataBuffer* b;
+} SFFFormatterSplitter;
+
+static const char* SFFFormatterSplitter_Dump_Ext = ".sff";
+
+static
+rc_t SFFFormatterSplitter_Dump(const SRASplitter* cself, spotid_t spot, const readmask_t* readmask)
+{
+ rc_t rc = 0;
+ SFFFormatterSplitter* self = (SFFFormatterSplitter*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcNode, rcExecuting, rcParam, rcNull);
+ } else {
+ size_t writ = 0;
+
+ if( (rc = SRASplitter_FileActivate(cself, SFFFormatterSplitter_Dump_Ext)) == 0 ) {
+ if( self->spots == 0 ) {
+ IF_BUF((SFFReaderHeader(self->reader, 0, self->b->base, KDataBufferBytes(self->b), &writ)), self->b, writ) {
+ rc = SRASplitter_FileWrite(cself, 0, self->b->base, writ);
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = SFFReaderSeekSpot(self->reader, spot)) == 0 ) {
+ IF_BUF((SFFReader_GetCurrentSpotData(self->reader, self->b->base, KDataBufferBytes(self->b), &writ)), self->b, writ) {
+ rc = SRASplitter_FileWrite(cself, spot, self->b->base, writ);
+ self->spots++;
+ }
+ } else if( GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound ) {
+ SRA_DUMP_DBG (3, ("%s skipped %u row\n", __func__, spot));
+ self->spots++;
+ rc = 0;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SFFFormatterSplitter_Release(const SRASplitter* cself)
+{
+ rc_t rc = 0;
+ SFFFormatterSplitter* self = (SFFFormatterSplitter*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcNode, rcReleasing, rcSelf, rcNull);
+ } else if( (rc = SRASplitter_FileActivate(cself, SFFFormatterSplitter_Dump_Ext)) == 0 ) {
+ if( self->spots > 0 ) {
+ size_t writ = 0;
+ /* tweak SFF file header with real number of reads per file */
+ IF_BUF((SFFReaderHeader(self->reader, self->spots, self->b->base, KDataBufferBytes(self->b), &writ)), self->b, writ) {
+ rc = SRASplitter_FileWritePos(cself, 0, 0, self->b->base, writ);
+ }
+ }
+ }
+ return rc;
+}
+
+typedef struct SFFFormatterFactory_struct {
+ const char* accession;
+ const SRATable* table;
+ const SFFReader* reader;
+ KDataBuffer kdbuf;
+} SFFFormatterFactory;
+
+static
+rc_t SFFFormatterFactory_Init(const SRASplitterFactory* cself)
+{
+ rc_t rc = 0;
+ SFFFormatterFactory* self = (SFFFormatterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = KDataBufferMakeBytes(&self->kdbuf, DATABUFFERINITSIZE)) == 0 ) {
+ rc = SFFReaderMake(&self->reader, self->table, self->accession, 0, 0);
+ }
+ return rc;
+}
+
+static
+rc_t SFFFormatterFactory_NewObj(const SRASplitterFactory* cself, const SRASplitter** splitter)
+{
+ rc_t rc = 0;
+ SFFFormatterFactory* self = (SFFFormatterFactory*)cself;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcType, rcExecuting, rcParam, rcNull);
+ } else {
+ if( (rc = SRASplitter_Make(splitter, sizeof(SFFFormatterSplitter), NULL, NULL, SFFFormatterSplitter_Dump, SFFFormatterSplitter_Release)) == 0 ) {
+ ((SFFFormatterSplitter*)(*splitter))->reader = self->reader;
+ ((SFFFormatterSplitter*)(*splitter))->b = &self->kdbuf;
+ }
+ }
+ return rc;
+}
+
+static
+void SFFFormatterFactory_Release(const SRASplitterFactory* cself)
+{
+ if( cself != NULL ) {
+ SFFFormatterFactory* self = (SFFFormatterFactory*)cself;
+ KDataBufferWhack(&self->kdbuf);
+ SFFReaderWhack(self->reader);
+ }
+}
+
+static
+rc_t SFFFormatterFactory_Make(const SRASplitterFactory** cself, const char* accession, const SRATable* table)
+{
+ rc_t rc = 0;
+ SFFFormatterFactory* obj = NULL;
+
+ if( cself == NULL || accession == NULL || table == NULL ) {
+ rc = RC(rcSRA, rcType, rcConstructing, rcParam, rcNull);
+ } else if( (rc = SRASplitterFactory_Make(cself, eSplitterFormat, sizeof(*obj),
+ SFFFormatterFactory_Init,
+ SFFFormatterFactory_NewObj,
+ SFFFormatterFactory_Release)) == 0 ) {
+ obj = (SFFFormatterFactory*)*cself;
+ obj->accession = accession;
+ obj->table = table;
+ }
+ return rc;
+}
+
+/* ### External entry points ##################################################### */
+const char UsageDefaultName[] = "sff-dump";
+rc_t CC UsageSummary (const char * progname)
+{
+ return 0;
+}
+
+rc_t SFFDumper_Factories(const SRADumperFmt* fmt, const SRASplitterFactory** factory)
+{
+ if( fmt == NULL || factory == NULL ) {
+ return RC(rcExe, rcFormatter, rcReading, rcParam, rcInvalid);
+ }
+ *factory = NULL;
+ return SFFFormatterFactory_Make(factory, fmt->accession, fmt->table);
+}
+
+/* main entry point of the file */
+rc_t SRADumper_Init(SRADumperFmt* fmt)
+{
+ if( fmt == NULL ) {
+ return RC(rcExe, rcFileFormat, rcConstructing, rcParam, rcNull);
+ }
+ fmt->release = NULL;
+ fmt->arg_desc = NULL;
+ fmt->add_arg = NULL;
+ fmt->get_factory = SFFDumper_Factories;
+ fmt->gzip = false;
+ fmt->bzip2 = false;
+
+ return 0;
+}
diff --git a/tools/sra-dump/sra-dump.c b/tools/sra-dump/sra-dump.c
new file mode 100644
index 0000000..573ac8c
--- /dev/null
+++ b/tools/sra-dump/sra-dump.c
@@ -0,0 +1,1011 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <sra/sradb.h>
+#include <sra/srapath.h>
+#include <sra/types.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+typedef struct sradump_parms sradump_parms;
+struct sradump_parms
+{
+ const char *src_path;
+
+ const char **columns;
+ uint32_t column_cnt;
+
+ spotid_t start, stop;
+};
+
+typedef struct column_map column_map;
+struct column_map
+{
+ const char *name;
+ void ( * dump ) ( const void *base, bitsz_t row_bits );
+ const SRAColumn *col;
+ VTypedecl td;
+ uint32_t elem_size;
+};
+
+/* dump_row
+ */
+static
+void dump_text ( const void *base, bitsz_t row_bits )
+{
+ const unsigned char *data = base;
+ uint32_t i, count = row_bits >> 3;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ if ( isprint ( data [ i ] ) )
+ OUTMSG(( "%c", data [ i ] ));
+ else
+ OUTMSG(( "\\x%2x", data [ i ] ));
+ }
+}
+
+static
+void dump_I8 ( const void *base, bitsz_t row_bits )
+{
+ const int8_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 3;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%d", sep, data [ i ] ));
+}
+
+static
+void dump_U8 ( const void *base, bitsz_t row_bits )
+{
+ const uint8_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 3;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%u", sep, data [ i ] ));
+}
+
+static
+void dump_I16 ( const void *base, bitsz_t row_bits )
+{
+ const int16_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 4;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%d", sep, data [ i ] ));
+}
+
+static
+void dump_U16 ( const void *base, bitsz_t row_bits )
+{
+ const uint16_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 4;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%u", sep, data [ i ] ));
+}
+
+static
+void dump_I32 ( const void *base, bitsz_t row_bits )
+{
+ const int32_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 5;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%d", sep, data [ i ] ));
+}
+
+static
+void dump_U32 ( const void *base, bitsz_t row_bits )
+{
+ const uint32_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 5;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%u", sep, data [ i ] ));
+}
+
+static
+void dump_I64 ( const void *base, bitsz_t row_bits )
+{
+ const int64_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 6;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%ld", sep, data [ i ] ));
+}
+
+static
+void dump_U64 ( const void *base, bitsz_t row_bits )
+{
+ const uint64_t *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 6;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%lu", sep, data [ i ] ));
+}
+
+static
+void dump_F32 ( const void *base, bitsz_t row_bits )
+{
+ const float *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 5;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%f", sep, data [ i ] ));
+}
+
+static
+void dump_F64 ( const void *base, bitsz_t row_bits )
+{
+ const double *data = base;
+ const char *sep = "";
+ uint32_t i, count = row_bits >> 6;
+
+ for ( i = 0; i < count; sep = ",", ++ i )
+ OUTMSG(( "%s%f", sep, data [ i ] ));
+}
+
+
+#define CASE( x ) \
+ case x: p = # x; break
+
+static
+void dump_platform ( const void *base, bitsz_t row_bits )
+{
+ const char *p = NULL;
+ const uint8_t *data = base;
+ if ( row_bits == 8 ) switch ( data [ 0 ] )
+ {
+ CASE ( SRA_PLATFORM_UNDEFINED );
+ CASE ( SRA_PLATFORM_454 );
+ CASE ( SRA_PLATFORM_ILLUMINA );
+ CASE ( SRA_PLATFORM_ABSOLID );
+ CASE ( SRA_PLATFORM_COMPLETE_GENOMICS );
+ CASE ( SRA_PLATFORM_HELICOS );
+ default:
+ OUTMSG(( "%u", data [ 0 ] ));
+ return;
+ }
+ OUTMSG(( "%s", p ));
+}
+
+static
+void dump_readtype ( const void *base, bitsz_t row_bits )
+{
+ const char *sep = "";
+ const uint8_t *data = base;
+ uint32_t i, count = row_bits >> 3;
+ for ( i = 0; i < count; sep = ",", ++ i )
+ {
+ const char *p;
+ switch ( data [ i ] )
+ {
+ CASE ( SRA_READ_TYPE_TECHNICAL );
+ CASE ( SRA_READ_TYPE_BIOLOGICAL );
+ CASE ( SRA_READ_TYPE_TECHNICAL|SRA_READ_TYPE_FORWARD );
+ CASE ( SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_FORWARD );
+ CASE ( SRA_READ_TYPE_TECHNICAL|SRA_READ_TYPE_REVERSE );
+ CASE ( SRA_READ_TYPE_BIOLOGICAL|SRA_READ_TYPE_REVERSE );
+ default:
+ OUTMSG(( "%s%u", sep, data [ 0 ] ));
+ continue;
+ }
+ OUTMSG(( "%s%s", sep, p ));
+ }
+}
+
+static
+void dump_readfilt ( const void *base, bitsz_t row_bits )
+{
+ const char *sep = "";
+ const uint8_t *data = base;
+ uint32_t i, count = row_bits >> 3;
+ for ( i = 0; i < count; sep = ",", ++ i )
+ {
+ const char *p;
+ switch ( data [ i ] )
+ {
+ CASE ( SRA_READ_FILTER_PASS );
+ CASE ( SRA_READ_FILTER_REJECT );
+ CASE ( SRA_READ_FILTER_CRITERIA );
+ CASE ( SRA_READ_FILTER_REDACTED );
+ default:
+ OUTMSG(( "%s%u", sep, data [ 0 ] ));
+ continue;
+ }
+ OUTMSG(( "%s%s", sep, p ));
+ }
+}
+
+#undef CASE
+
+
+static
+rc_t dump_row ( const sradump_parms *pb, const column_map *cm, uint32_t count, spotid_t row )
+{
+ rc_t rc;
+ uint32_t i;
+
+ for ( rc = 0, i = 0; rc == 0 && i < count; ++ i )
+ {
+ const void *base;
+ bitsz_t boff, row_bits;
+
+ /* read data */
+ rc = SRAColumnRead ( cm [ i ] . col, row, & base, & boff, & row_bits );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, rc, "failed to read column '$(name)' row $(row)",
+ "name=%s,row=%u", cm [ i ] . name, row ));
+ break;
+ }
+
+ /* cannot deal with non-byte-aligned data */
+ if ( boff != 0 || ( row_bits & 7 ) != 0 )
+ {
+ rc = RC ( rcExe, rcColumn, rcReading, rcType, rcUnsupported );
+ PLOGERR ( klogInt, (klogInt, rc, "non-byte-aligned data in column '$(name)' row $(row)",
+ "name=%s,row=%u", cm [ i ] . name, row ));
+ break;
+ }
+
+ /* write cell header - TBD - improve column alignment for readability */
+ OUTMSG(( "%u. %s: ", row, cm [ i ] . name ));
+
+ /* write cell data */
+ if ( cm [ i ] . td . dim == 1 )
+ ( cm [ i ] . dump ) ( base, row_bits );
+ else
+ {
+ const char *sep;
+ const uint8_t *data = base;
+ uint32_t elem_bits = cm [ i ] . elem_size;
+ uint32_t j, row_len = ( uint32_t ) ( row_bits / elem_bits );
+
+ for ( sep = "{", j = 0; j < row_len; sep = "},{", ++ j )
+ {
+ OUTMSG(( "%s", sep ));
+ ( cm [ i ] . dump ) ( & data [ j * elem_bits >> 3 ], elem_bits );
+ }
+
+ OUTMSG(( "}" ));
+ }
+
+ OUTMSG(( "\n" ));
+ }
+
+ return rc;
+}
+
+static
+rc_t dump_table ( const sradump_parms *pb, const column_map *cm, uint32_t count )
+{
+ rc_t rc;
+ spotid_t row;
+
+ for ( rc = 0, row = pb -> start; row <= pb -> stop; ++ row )
+ {
+ rc = Quitting();
+ if ( rc != 0 )
+ break;
+ rc = dump_row ( pb, cm, count, row );
+ if ( rc != 0 )
+ break;
+ }
+
+ return rc;
+}
+
+static
+const char *s_454_default [] =
+{
+ "(INSDC:SRA:platform_id)PLATFORM",
+ "(U8)NREADS",
+ "(INSDC:SRA:xread_type)READ_TYPE",
+ "(NCBI:SRA:Segment)READ_SEG",
+ "(NCBI:SRA:Segment)LABEL_SEG",
+ "(ascii)LABEL",
+ "(INSDC:SRA:read_filter)READ_FILTER",
+ "(ascii)SPOT_GROUP",
+
+ "(INSDC:dna:text)FLOW_CHARS",
+ "(INSDC:dna:text)KEY_SEQUENCE",
+ "(INSDC:dna:text)LINKER_SEQUENCE",
+ "(INSDC:dna:text)READ",
+ "(INSDC:quality:phred)QUALITY",
+ "(INSDC:coord:one)CLIP_ADAPTER_LEFT",
+ "(INSDC:coord:one)CLIP_ADAPTER_RIGHT",
+ "(INSDC:coord:one)CLIP_QUALITY_LEFT",
+ "(INSDC:coord:one)CLIP_QUALITY_RIGHT",
+ "(NCBI:isamp1)SIGNAL",
+ "(INSDC:position:one)POSITION"
+};
+
+static
+const char *s_Illumina_default [] =
+{
+ "(INSDC:SRA:platform_id)PLATFORM"
+ , "(U8)NREADS"
+ , "(INSDC:SRA:xread_type)READ_TYPE"
+ , "(NCBI:SRA:Segment)READ_SEG"
+ , "(NCBI:SRA:Segment)LABEL_SEG"
+ , "(ascii)LABEL"
+ , "(INSDC:SRA:read_filter)READ_FILTER"
+ , "(ascii)SPOT_GROUP"
+
+ , "(INSDC:dna:text)READ"
+ , "(NCBI:qual4)QUALITY:QUALITY"
+ , "(INSDC:quality:phred)PHYS_QUALITY:QUALITY"
+ , "(INSDC:quality:phred)QUALITY2"
+#if ENABLE_INTENSITY_COPY
+ , "(NCBI:fsamp4)INTENSITY"
+#endif
+};
+
+static
+const char *s_ABI_default [] =
+{
+ " (INSDC:SRA:platform_id)PLATFORM"
+ , "(U8)NREADS"
+ , "(INSDC:SRA:xread_type)READ_TYPE"
+ , "(NCBI:SRA:Segment)READ_SEG"
+ , "(NCBI:SRA:Segment)LABEL_SEG"
+ , "(ascii)LABEL"
+ , "(INSDC:SRA:read_filter)READ_FILTER"
+ , "(ascii)SPOT_GROUP"
+
+ , "(INSDC:dna:text)CS_KEY"
+ , "(INSDC:color:text)CSREAD"
+ , "(INSDC:quality:phred)QUALITY"
+#if ENABLE_INTENSITY_COPY
+ , "(NCBI:fsamp4)SIGNAL"
+#endif
+};
+
+static
+const char *s_fastq_default [] =
+{
+ "(INSDC:SRA:platform_id)PLATFORM",
+ "(U8)NREADS",
+ "(INSDC:SRA:xread_type)READ_TYPE",
+ "(NCBI:SRA:Segment)READ_SEG",
+ "(NCBI:SRA:Segment)LABEL_SEG",
+ "(ascii)LABEL",
+ "(INSDC:SRA:read_filter)READ_FILTER",
+ "(ascii)SPOT_GROUP",
+
+ "(INSDC:dna:text)READ",
+ "(INSDC:quality:phred)QUALITY"
+};
+
+static
+rc_t get_default_columns ( sradump_parms *pb, const SRATable *tbl )
+{
+ const SRAColumn *col;
+ rc_t rc = SRATableOpenColumnRead ( tbl, & col, "PLATFORM", sra_platform_id_t );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to determine table platform" );
+ else
+ {
+ const void *base;
+ bitsz_t boff, row_bits;
+ rc = SRAColumnRead ( col, 1, & base, & boff, & row_bits );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to read table platform" );
+ else if ( boff != 0 || ( row_bits & 7 ) != 0 )
+ {
+ rc = RC ( rcExe, rcColumn, rcReading, rcData, rcCorrupt );
+ PLOGERR ( klogInt, (klogInt, rc, "bit offset $(boff), row bits $(bits)",
+ "boff=%u,bits=%u", ( uint32_t ) boff, ( uint32_t ) row_bits ));
+ }
+ else
+ {
+ const uint8_t *platform_id = base;
+ switch ( platform_id [ 0 ] )
+ {
+ case SRA_PLATFORM_UNDEFINED:
+ rc = RC ( rcExe, rcTable, rcReading, rcType, rcInvalid );
+ LOGERR ( klogInt, rc, "table platform undefined" );
+ break;
+ case SRA_PLATFORM_454:
+ pb -> columns = s_454_default;
+ pb -> column_cnt = sizeof s_454_default / sizeof s_454_default [ 0 ];
+ break;
+ case SRA_PLATFORM_ILLUMINA:
+ pb -> columns = s_Illumina_default;
+ pb -> column_cnt = sizeof s_Illumina_default / sizeof s_Illumina_default [ 0 ];
+ break;
+ case SRA_PLATFORM_ABSOLID:
+ pb -> columns = s_ABI_default;
+ pb -> column_cnt = sizeof s_ABI_default / sizeof s_ABI_default [ 0 ];
+ break;
+ default:
+ pb -> columns = s_fastq_default;
+ pb -> column_cnt = sizeof s_fastq_default / sizeof s_fastq_default [ 0 ];
+ }
+ }
+
+ SRAColumnRelease ( col );
+ }
+
+ return rc;
+}
+
+
+typedef struct basetype basetype;
+struct basetype
+{
+ BSTNode n;
+ void ( * dump ) ( const void *base, bitsz_t row_bits );
+ uint32_t type_id;
+};
+
+static
+void CC basetype_whack ( BSTNode *n, void *ignore )
+{
+ free ( n );
+}
+
+static
+int64_t CC basetype_cmp ( const void *item, const BSTNode *n )
+{
+ const VTypedecl *td = item;
+ const basetype *bt = ( const basetype* ) n;
+
+ return (int64_t) td -> type_id - (int64_t) bt -> type_id;
+}
+
+static
+int64_t CC basetype_sort ( const BSTNode *item, const BSTNode *n )
+{
+ const basetype *td = ( const basetype* ) item;
+ const basetype *bt = ( const basetype* ) n;
+
+ return (int64_t) td -> type_id - (int64_t) bt -> type_id;
+}
+
+static
+rc_t build_basetypes ( BSTree *ttree, const VDatatypes *dt )
+{
+ struct
+ {
+ const char *name;
+ void ( * dump ) ( const void *base, bitsz_t row_bits );
+ }
+ types [] =
+ {
+ { "I8", dump_I8 },
+ { "U8", dump_U8 },
+ { "I16", dump_I16 },
+ { "U16", dump_U16 },
+ { "I32", dump_I32 },
+ { "U32", dump_U32 },
+ { "I64", dump_I64 },
+ { "U64", dump_U64 },
+ { "F32", dump_F32 },
+ { "F64", dump_F64 },
+ { "utf8", dump_text },
+ { "ascii", dump_text },
+
+ /* special case types */
+ { "INSDC:SRA:platform_id", dump_platform },
+ { "NCBI:SRA:platform_id", dump_platform },
+ { "INSDC:SRA:xread_type", dump_readtype },
+ { "INSDC:SRA:read_type", dump_readtype },
+ { "NCBI:SRA:read_type", dump_readtype },
+ { "INSDC:SRA:read_filter", dump_readfilt },
+ { "NCBI:SRA:read_filter", dump_readfilt }
+ };
+
+ rc_t rc;
+ uint32_t i, count = sizeof types / sizeof types [ 0 ];
+
+ BSTreeInit ( ttree );
+
+ for ( rc = 0, i = 0; i < count; ++ i )
+ {
+ VTypedef def;
+ basetype *bt = malloc ( sizeof * bt );
+ if ( bt == NULL )
+ {
+ rc = RC ( rcExe, rcType, rcAllocating, rcMemory, rcExhausted );
+ LOGERR ( klogSys, rc, "failed to populate basetypes table" );
+ break;
+ }
+ rc = VDatatypesResolveTypename ( dt, & def, types [ i ] . name );
+ if ( rc != 0 )
+ {
+ free ( bt );
+ PLOGERR ( klogInt, (klogInt, rc, "failed to resolve typename '$(typename)'",
+ "typename=%s", types [ i ] . name ));
+ break;
+ }
+
+ bt -> dump = types [ i ] . dump;
+ bt -> type_id = def . type_id;
+
+ BSTreeInsert ( ttree, & bt -> n, basetype_sort );
+ }
+
+ return rc;
+}
+
+static
+rc_t open_column ( const VDatatypes *dt, const SRATable *tbl,
+ const BSTree *ttree, column_map *cm, const char *colspec )
+{
+ rc_t rc;
+ VTypedef def;
+
+ int len;
+ const char *iname;
+ char inamebuff [ 128 ];
+
+ /* convert column spec to typedecl and name */
+ char tdbuffer [ 128 ];
+ const char *typedecl = NULL;
+ const char *end = strchr ( colspec, ')' );
+ if ( end != NULL )
+ {
+ const char *begin = strchr ( colspec, '(' );
+ if ( begin != NULL && begin < end )
+ {
+ /* the colspec is now the name */
+ colspec = end;
+
+ /* trim whitespace */
+ while ( isspace ( ( ++ colspec ) [ 0 ] ) )
+ ( void ) 0;
+ while ( ++ begin < end && isspace ( begin [ 0 ] ) )
+ ( void ) 0;
+ while ( begin < end && isspace ( end [ -1 ] ) )
+ -- end;
+
+ /* create a copy to allow for a NUL byte */
+ len = snprintf ( tdbuffer, sizeof tdbuffer,
+ "%.*s", ( int ) ( end - begin ), begin );
+ if ( len < 0 || len >= sizeof tdbuffer )
+ {
+ rc = RC ( rcExe, rcColumn, rcOpening, rcString, rcExcessive );
+ return rc;
+ }
+
+ typedecl = tdbuffer;
+ }
+ }
+
+ /* convert name to iname and extname */
+ iname = colspec;
+ colspec = strchr ( colspec, ':' );
+ if ( colspec == NULL )
+ colspec = iname;
+ else
+ {
+ len = snprintf ( inamebuff, sizeof inamebuff, "%.*s",
+ ( int ) ( colspec - iname ), iname );
+ if ( len < 0 || len >= sizeof inamebuff )
+ {
+ rc = RC ( rcExe, rcColumn, rcOpening, rcString, rcExcessive );
+ return rc;
+ }
+
+ iname = inamebuff;
+ ++ colspec;
+ }
+
+ /* record the name */
+ cm -> name = colspec;
+
+ /* open the column */
+ rc = SRATableOpenColumnRead ( tbl, & cm -> col, iname, typedecl );
+ if ( rc != 0 )
+ return rc;
+
+ /* read its datatype */
+ rc = SRAColumnDatatype ( cm -> col, & cm -> td, & def );
+ if ( rc == 0 )
+ {
+ const basetype *bt;
+
+ /* get its element size */
+ cm -> elem_size = VTypedefSizeof ( & def ) * cm -> td . dim;
+
+ /* try to find the actual type */
+ bt = ( const basetype* ) BSTreeFind ( ttree, & cm -> td, basetype_cmp );
+ if ( bt == NULL )
+ {
+ /* find the intrinsic type
+ NB - this code treats ascii as intrinsic */
+ rc = VDatatypesToIntrinsic ( ( const VDatatypes*) SRATableGetSchema(tbl), & cm -> td );
+ if ( rc == 0 )
+ bt = ( const basetype* ) BSTreeFind ( ttree, & cm -> td, basetype_cmp );
+ }
+
+ if ( bt == NULL )
+ rc = RC ( rcExe, rcColumn, rcOpening, rcType, rcUnsupported );
+ else
+ {
+ cm -> dump = bt -> dump;
+ return 0;
+ }
+ }
+
+ SRAColumnRelease ( cm -> col );
+ cm -> col = NULL;
+ return rc;
+}
+
+static
+rc_t sra_dump ( sradump_parms *pb, const VDatatypes *dt, const SRATable *tbl )
+{
+ BSTree ttree;
+ rc_t rc = build_basetypes ( & ttree, dt );
+ if ( rc == 0 )
+ {
+ if ( pb -> column_cnt == 0 )
+ rc = get_default_columns ( pb, tbl );
+ if ( rc == 0 )
+ {
+ uint32_t count = pb -> column_cnt;
+ const char **columns = pb -> columns;
+ column_map *cm = malloc ( sizeof * cm * count );
+ if ( cm == NULL )
+ rc = RC ( rcExe, rcTable, rcReading, rcMemory, rcExhausted );
+ else
+ {
+
+ uint32_t i;
+ uint32_t count2 = count;
+
+ for ( i = count = 0; rc == 0 && i < count2; ++ i )
+ {
+ rc = open_column ( dt, tbl, & ttree, & cm [ count ], columns [ i ] );
+ if ( rc == 0 )
+ ++ count;
+ else switch ( GetRCState ( rc ) )
+ {
+ case rcNotFound:
+ case rcUnsupported:
+ case rcExcessive:
+ rc = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ spotid_t max_spot;
+ rc = SRATableMaxSpotId ( tbl, & max_spot );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to read max spot id" );
+ else
+ {
+ if ( pb -> start == 0 )
+ pb -> start = 1;
+ if ( pb -> stop == 0 || pb -> stop > max_spot )
+ pb -> stop = max_spot;
+
+ rc = dump_table ( pb, cm, count );
+ }
+ }
+
+ for ( i = 0; i < count; ++ i )
+ SRAColumnRelease ( cm [ i ] . col );
+
+ free (cm);
+ }
+ }
+
+ BSTreeWhack ( & ttree, basetype_whack, NULL );
+ }
+ return rc;
+}
+
+static
+rc_t run ( sradump_parms *pb )
+{
+ const SRAMgr *mgr;
+ rc_t rc = SRAMgrMakeRead ( & mgr );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to open SRAMgr" );
+ else
+ {
+ const VDatatypes *dt;
+ rc = SRAMgrOpenDatatypesRead ( mgr, & dt );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to open VDatatypes" );
+ else
+ {
+ const SRATable *tbl;
+ rc = SRAMgrOpenTableRead ( mgr, & tbl, "%s", pb -> src_path );
+ if ( rc != 0 )
+ PLOGERR ( klogInt,
+ ( klogInt, rc, "failed to open SRATable '$(spec)'", "spec=%s", pb -> src_path));
+ else
+ {
+ rc = sra_dump ( pb, dt, tbl );
+ SRATableRelease ( tbl );
+ }
+
+ VDatatypesRelease ( dt );
+ }
+
+ SRAMgrRelease ( mgr );
+ }
+
+ return rc;
+}
+
+/* Usage
+ */
+static
+KLogLevel default_log_level;
+
+
+#define OPTION_START "start"
+#define OPTION_STOP "stop"
+#define ALIAS_START ""
+#define ALIAS_STOP ""
+
+static const
+char * start_usage[] =
+{
+ "beginning spot id (default 1)", NULL
+};
+
+
+static const
+char * stop_usage[] =
+{
+ "ending spot id (default max)", NULL
+};
+
+
+static
+OptDef Options[] =
+{
+ { OPTION_START, ALIAS_START, NULL, start_usage, 1, true, false},
+ { OPTION_STOP, ALIAS_STOP, NULL, stop_usage, 1, true, false}
+};
+
+
+const char UsageDefaultName[] = "sra-dump";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [ options ] table [ column-spec ... ]\n"
+ "\n"
+ "Summary:\n"
+ " Dump all data in table for specified or all columns\n"
+ "\n", progname );
+}
+
+static
+const char * name_param[] =
+{
+ "NAME", "simple column name", NULL
+};
+
+
+static
+const char * typedecl_param[] =
+{
+ "(typedecl)NAME", "specifically typed column name", NULL
+};
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ OUTMSG (( "Options:\n" ));
+
+ OUTMSG (("table:\n"
+ " path to table or accession id within NCBI\n"
+ "\n"
+ "column-spec:\n"));
+
+ HelpParamLine (name_param[0], name_param+1);
+ HelpParamLine (typedecl_param[0], typedecl_param+1);
+
+ OUTMSG (( "\nOptions:\n" ));
+
+ HelpOptionLine (ALIAS_START, OPTION_START, "ID", start_usage);
+
+ HelpOptionLine (ALIAS_STOP, OPTION_STOP, "ID", stop_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ default_log_level = KLogLevelGet();
+
+ rc = KStsHandlerSetStdErr();
+ if (rc)
+ return rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+
+ sradump_parms pb;
+
+ memset (&pb, 0, sizeof pb);
+
+ rc = ArgsOptionCount (args, OPTION_START, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 1)
+ {
+ const char * pc;
+
+ rc = ArgsOptionValue (args, OPTION_START, 0, (const void **)&pc);
+ if (rc)
+ break;
+
+ pb.start = AsciiToU32 (pc, NULL, NULL);
+ }
+
+ rc = ArgsOptionCount (args, OPTION_STOP, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 1)
+ {
+ const char * pc;
+
+ rc = ArgsOptionValue (args, OPTION_STOP, 0, (const void **)&pc);
+ if (rc)
+ break;
+
+ pb.stop = AsciiToU32 (pc, NULL, NULL);
+ }
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0) {
+ OUTMSG (("missing source table\n"));
+ rc = MiniUsage (args);
+ ArgsWhack(args);
+ exit(EXIT_FAILURE);
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&pb.src_path);
+ if (rc)
+ break;
+
+ pb.column_cnt = pcount - 1; /* pcount is used below */
+
+ if (pb.column_cnt) {
+ pb.columns = malloc (pb.column_cnt * sizeof (const char *));
+ if (pb.columns == NULL)
+ rc = RC (rcExe, rcArgv, rcParsing, rcMemory, rcExhausted);
+ }
+ else
+ pb.columns = NULL;
+
+ {
+ uint32_t ix;
+ const char ** ppc;
+
+ ppc = pb.columns;
+ for (ix = 1; ix < pcount; ix++)
+ {
+ rc = ArgsParamValue (args, ix, (const void **)ppc);
+ if (rc)
+ break;
+ ppc++;
+ }
+
+ if (rc == 0)
+ {
+ rc = run (&pb);
+ }
+
+ if ( pcount != 1 )
+ /* brain damaged windows compiler warned about next line */
+ free ( (void*)pb.columns );
+ }
+ } while (0);
+
+ ArgsWhack (args);
+ }
+ return rc;
+}
+
+
diff --git a/tools/sra-load/Makefile b/tools/sra-load/Makefile
new file mode 100644
index 0000000..2426b09
--- /dev/null
+++ b/tools/sra-load/Makefile
@@ -0,0 +1,209 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-load
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ fastq-load \
+ illumina-load \
+ srf-load \
+ abi-load \
+ sff-load \
+ helicos-load \
+ pacbio-loadxml
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+ifeq (1,$(HAVE_XML2))
+
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+else
+
+all std: $(ALL_TOOLS)
+
+$(ALL_TOOLS):
+ @ echo "NOTE - $(@F) cannot be built:" \
+ "It requires our internal library 'libkxml'" \
+ "which requires 'libxml2' and its development headers."
+endif
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# loader
+#
+LOADER_SRC = \
+ pstring \
+ common-xml \
+ experiment-xml \
+ run-xml \
+ loader-file \
+ loader-fmt \
+ sra-writer \
+ loader
+
+LOADER_OBJ = \
+ $(addsuffix .$(OBJX),$(LOADER_SRC))
+
+LIBXML = -lkxfs -lkxml -lxml2
+
+LOADER_LIB = \
+ -lkapp \
+ -stk-version \
+ -lload \
+ -sncbi-wvdb \
+ $(LIBXML) \
+ -lm
+
+
+#------------------------------------------------------------------------------
+# sff-load
+#
+SFF_LOAD_SRC = \
+ $(LOADER_SRC) \
+ writer-454 \
+ writer-ion-torrent \
+ sff-fmt
+
+SFF_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(SFF_LOAD_SRC))
+
+$(BINDIR)/sff-load: $(SFF_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# fastq-load
+#
+FASTQ_LOAD_SRC = \
+ $(LOADER_SRC) \
+ writer-illumina \
+ writer-454 \
+ writer-ion-torrent \
+ fastq-fmt
+
+FASTQ_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(FASTQ_LOAD_SRC))
+
+$(BINDIR)/fastq-load: $(FASTQ_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# srf-load
+#
+SRF_LOAD_SRC = \
+ $(LOADER_SRC) \
+ srf \
+ srf-fmt \
+ writer-illumina \
+ ztr-illumina \
+ srf-illumina \
+ writer-absolid \
+ ztr-absolid \
+ ztr-huffman \
+ srf-absolid
+
+SRF_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(SRF_LOAD_SRC))
+
+$(BINDIR)/srf-load: $(SRF_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# abi-load
+#
+ABSOLID_LOAD_SRC = \
+ $(LOADER_SRC) \
+ writer-absolid \
+ absolid-fmt
+
+ABSOLID_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(ABSOLID_LOAD_SRC))
+
+$(BINDIR)/abi-load: $(ABSOLID_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# illumina-load
+#
+ILLUMINA_LOAD_SRC = \
+ $(LOADER_SRC) \
+ writer-illumina \
+ illumina-fmt
+
+ILLUMINA_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(ILLUMINA_LOAD_SRC))
+
+$(BINDIR)/illumina-load: $(ILLUMINA_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# helicos-load
+#
+HELICOS_LOAD_SRC = \
+ $(LOADER_SRC) \
+ writer-helicos \
+ helicos-fmt
+
+HELICOS_LOAD_OBJ = \
+ $(addsuffix .$(OBJX),$(HELICOS_LOAD_SRC))
+
+$(BINDIR)/helicos-load: $(HELICOS_LOAD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
+
+#------------------------------------------------------------------------------
+# pacbio-loadxml
+#
+PACBIO_LOADXML_SRC = \
+ $(LOADER_SRC) \
+ pacbio-fmt
+
+PACBIO_LOADXML_OBJ = \
+ $(addsuffix .$(OBJX),$(PACBIO_LOADXML_SRC))
+
+$(BINDIR)/pacbio-loadxml: $(PACBIO_LOADXML_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(LOADER_LIB)
diff --git a/tools/sra-load/absolid-fmt.c b/tools/sra-load/absolid-fmt.c
new file mode 100644
index 0000000..5490cc9
--- /dev/null
+++ b/tools/sra-load/absolid-fmt.c
@@ -0,0 +1,573 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+
+typedef struct AbiLoaderFmt AbiLoaderFmt;
+#define SRALOADERFMT_IMPL AbiLoaderFmt
+#include "loader-fmt.h"
+
+#include "pstring.h"
+#include "writer-absolid.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <assert.h>
+
+typedef enum EFileType_enum {
+ eNotSet = -1,
+ eCSFasta,
+ eQuality,
+ eSignalFTC,
+ eSignalCY3,
+ eSignalTXR,
+ eSignalCY5,
+ eFileTypeMax
+} EFileType;
+
+typedef struct AbiFileInfo_struct {
+ /* parsed data from file for a single spot */
+ bool ready; /* if data is filled from file */
+ /* header */
+ EFileType file_type;
+ pstring name_prefix;
+ /* spot data */
+ EAbisolidReadType read_type;
+ pstring name; /* name suffix */
+ long coord[3]; /* panel, x, y - sort-merge keys */
+ pstring data;
+ char cs_key; /* only for csfasta file type */
+
+ const SRALoaderFile* file;
+ /* file line buffer */
+ const char* line; /* not NULL if contains unprocessed data */
+ size_t line_len;
+} AbiFileInfo;
+
+struct AbiLoaderFmt {
+ SRALoaderFmt dad;
+ bool skip_signal;
+ const SRAWriteAbsolid* writer;
+ AbsolidRead read[ABSOLID_FMT_MAX_NUM_READS];
+};
+
+static
+void AbiFileInfo_init(AbiFileInfo* file)
+{
+ file->ready = false;
+ file->read_type = eAbisolidReadType_Unknown;
+ pstring_clear(&file->name);
+ memset(file->coord, 0, sizeof(file->coord));
+ pstring_clear(&file->data);
+ file->cs_key = '\0';
+}
+
+/* reads 1 line from given file
+ * if file->line pointer is not NULL line is in buffer already, nothing is read
+ * failes on error or if line empty and not optional
+ */
+static
+rc_t file_read_line(AbiFileInfo* file, bool optional)
+{
+ rc_t rc = 0;
+
+ if( file->line == NULL ) {
+ if( (rc = SRALoaderFileReadline(file->file, (const void**)&file->line, &file->line_len)) == 0 ) {
+ if( file->line == NULL || file->line_len == 0 ) {
+ if( !optional ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcString, rcInsufficient);
+ }
+ }
+ if( rc == 0 && file->line != NULL ) {
+ if( file->line_len > 0 ) {
+ const char* e = file->line + file->line_len;
+ /* right trim */
+ while( --e >= file->line ) {
+ if( !isspace(*e) ) {
+ break;
+ }
+ file->line_len--;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static
+bool is_csfasta(const char* str, const size_t len)
+{
+ const char* s = str, *end = s + len;
+
+ if( s == end || strchr("ACGTacgt", *s++) == NULL ) {
+ return false;
+ }
+ while( s != end ) {
+ if( strchr("0123.", *s++) == NULL ) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static
+bool is_quality(const char* str, const size_t len)
+{
+ const char* s = str, *end = s + len;
+
+ while( s != end ) {
+ if( strchr("-+0123456789 ", *s++) == NULL ) {
+ return false;
+ }
+ }
+ return len != 0;
+}
+
+static
+bool is_signal(const char* str, const size_t len)
+{
+ const char* s = str, *end = s + len;
+
+ while( s != end ) {
+ if( strchr("-+.0123456789Ee ", *s++) == NULL ) {
+ return false;
+ }
+ }
+ return len != 0;
+}
+
+static
+rc_t read_signal(const char* data, size_t data_sz, pstring* str)
+{
+ rc_t rc = 0;
+ double d;
+ const char* c = data, *end = data + data_sz;
+
+ pstring_clear(str);
+ while( rc == 0 && c != end ) {
+ char* next;
+ errno = 0;
+ d = strtod(c, &next);
+ if( errno != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcOutofrange);
+ } else if( d == 0 && c == next ) {
+ break;
+ } else {
+ float f = d;
+ c = next;
+ rc = pstring_append(str, &f, sizeof(f));
+ }
+ }
+ return rc;
+}
+
+static
+rc_t parse_suffix(const char* s, size_t len, AbiFileInfo* file)
+{
+ rc_t rc = 0;
+ int i;
+ const char* p = s, *end = p + len;
+
+ assert(s && file);
+ while( isspace(*p) && p < end ) { ++p; }
+ if( (rc = pstring_assign(&file->name, p, end - p)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading name");
+ }
+ if( file->name.len <= 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFile, rcInvalid);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=expected not empty name after '>'");
+ }
+ p = strrchr(file->name.data, '_');
+ if( p != NULL ) {
+ file->read_type = AbsolidRead_Suffix2ReadType(p + 1);
+ } else {
+ file->read_type = eAbisolidReadType_Unknown;
+ }
+ /* in native form each file has single read: 1st or 2nd. Can't be whole spot, so label must be always found */
+ if( file->read_type <= eAbisolidReadType_SPOT ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "read name suffix is not recognized: '$(name)'", "name=%.*s",
+ file->name.len, file->name.data);
+ }
+ file->name.len -= strlen(AbisolidReadType2ReadLabel[file->read_type]) + 1;
+ /* try to get panel, x, y from name, format: \D*(\d+)\D+(\d+)\D+(\d+) */
+ p = file->name.data + file->name.len;
+ for(i = 2; rc == 0 && i >= 0; i--) {
+ /* reverse parse */
+ while( !isdigit(*--p) && p >= file->name.data );
+ while( isdigit(*--p) && p >= file->name.data );
+ errno = 0;
+ file->coord[i] = strtol(p + 1, NULL, 10);
+ if( errno != 0 ) {
+ file->coord[i] = 0;
+ }
+ }
+ return rc;
+}
+
+/* reads from a file data for a sinlge spot, data may be partial */
+static
+rc_t read_next_spot(AbiLoaderFmt* self, AbiFileInfo* file)
+{
+ rc_t rc = 0;
+
+ if( file->ready ) {
+ /* data still not used */
+ return 0;
+ }
+ AbiFileInfo_init(file);
+ do {
+ if( (rc = file_read_line(file, true)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading more data");
+ } else if( file->line == NULL ) {
+ return 0; /* eof */
+ }
+ if( file->line[0] != '#' ) {
+ break;
+ } else {
+ const char* p = file->line, *end = p + file->line_len;
+ while( isspace(*++p) && p < end );
+ if( strncasecmp(p, "Title:", 6) == 0 ) {
+ p += 5;
+ while( isspace(*++p) && p < end );
+ if( p < end ) {
+ if( (rc = pstring_assign(&file->name_prefix, p, end - p)) != 0 ){
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading Title");
+ }
+ }
+ }
+ file->line = NULL;
+ }
+ } while( true );
+ if( file->line[0] != '>' ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFile, rcInvalid);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=expected '>'");
+ } else {
+ if( (rc = parse_suffix(&file->line[1], file->line_len - 1, file)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading name suffix");
+ }
+ file->line = NULL;
+ if( (rc = file_read_line(file, false)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading data line");
+ }
+ if( file->file_type == eNotSet ) {
+ if( is_csfasta(file->line, file->line_len) ) {
+ file->file_type = eCSFasta;
+ } else if( is_quality(file->line, file->line_len) ) {
+ file->file_type = eQuality;
+ } else if( is_signal(file->line, file->line_len) ) {
+ const char* fname, *p;
+ if( (rc = SRALoaderFileName(file->file, &fname)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=file name");
+ }
+ /* skip path if present */
+ p = strrchr(fname, '/');
+ p = p ? p : fname;
+ if( strstr(p, "FTC") != NULL ) {
+ file->file_type = eSignalFTC;
+ } else if( strstr(p, "CY3") != NULL ) {
+ file->file_type = eSignalCY3;
+ } else if( strstr(p, "TXR") != NULL ) {
+ file->file_type = eSignalTXR;
+ } else if( strstr(p, "CY5") != NULL ) {
+ file->file_type = eSignalCY5;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=signal type by file name");
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading data line");
+ }
+ }
+ switch( file->file_type ) {
+ case eCSFasta:
+ if( !is_csfasta(file->line, file->line_len) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading csfasta");
+ }
+ file->cs_key = file->line[0];
+ if( (rc = pstring_assign(&file->data, &file->line[1], file->line_len - 1)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=copying csfasta");
+ }
+ break;
+ case eQuality:
+ if( (rc = pstring_assign(&file->data, file->line, file->line_len) != 0 ) ||
+ (rc = pstring_quality_convert(&file->data, eExperimentQualityEncoding_Decimal, 0, -1, 0x7F)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting quality");
+ }
+ break;
+ case eSignalFTC:
+ case eSignalCY3:
+ case eSignalTXR:
+ case eSignalCY5:
+ if( (rc = read_signal(file->line, file->line_len, &file->data)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting signal");
+ }
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFileFormat, rcUnknown);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=processing data line");
+ break;
+ }
+ file->line = NULL;
+ file->ready = true;
+ }
+#if _DEBUGGING
+ DEBUG_MSG(3, ("READ: type:%i, pfx:%s, rd_typ:%s, name:'%s', %li:%li:%li",
+ file->file_type, file->name_prefix.data, AbisolidReadType2ReadLabel[file->read_type],
+ file->name.data, file->coord[0], file->coord[1], file->coord[2]));
+ if( file->cs_key ) {
+ DEBUG_MSG(3, (", cs_key %c, data [%u] '%.*s'\n",
+ file->cs_key, file->data.len, file->data.len, file->data.data));
+ } else {
+ DEBUG_MSG(3, (", data length: %u\n", file->data.len));
+ }
+#endif
+ return 0;
+}
+
+static
+rc_t AbiLoaderFmt_WriteData(AbiLoaderFmt* self, uint32_t argc, const SRALoaderFile* const argv[], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t i, origin;
+ AbiFileInfo* files = NULL;
+ bool done;
+ pstring spotname;
+
+ if( (files = calloc(argc, sizeof(*files))) == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcMemory, rcInsufficient);
+ }
+ for(i = 0; rc == 0 && i < argc; i++) {
+ AbiFileInfo* file = &files[i];
+ AbiFileInfo_init(file);
+ file->file = argv[i];
+ file->file_type = eNotSet;
+ }
+ do {
+ done = true;
+ for(i = 0; rc == 0 && i < argc; i++) {
+ AbiFileInfo* file = &files[i];
+ if( (rc = read_next_spot(self, file)) != 0 || !file->ready ) {
+ continue;
+ }
+ done = false;
+ }
+ if( rc != 0 || done ) {
+ break;
+ }
+ /* find read with min coords */
+ origin = argc;
+ for(i = 0; i < argc; i++) {
+ AbiFileInfo* file = &files[i];
+ if( file->ready && (origin == argc ||
+ file->coord[0] < files[origin].coord[0] ||
+ (file->coord[0] == files[origin].coord[0] &&
+ file->coord[1] < files[origin].coord[1]) ||
+ (file->coord[0] == files[origin].coord[0] &&
+ file->coord[1] == files[origin].coord[1] &&
+ file->coord[2] < files[origin].coord[2]) ) ) {
+ origin = i;
+ }
+ }
+ assert(origin != argc);
+ /* collect spot reads, matching by spot name
+ * spot data may be split across multiple files
+ */
+ for(i = 0; i < sizeof(self->read) / sizeof(self->read[0]); i++) {
+ AbsolidRead_Init(&self->read[i]);
+ }
+ rc = SRAWriteAbsolid_MakeName(&files[origin].name_prefix, &files[origin].name, &spotname);
+ for(i = 0; rc == 0 && i < argc; i++) {
+ AbiFileInfo* file = &files[i];
+ if( file->ready ) {
+ pstring tmpname;
+ if( (rc = SRAWriteAbsolid_MakeName(&file->name_prefix, &file->name, &tmpname)) == 0 ) {
+ if( pstring_cmp(&spotname, &tmpname) == 0 ) {
+ int read_number = AbisolidReadType2ReadNumber[file->read_type];
+ switch( file->file_type ) {
+ case eNotSet:
+ case eFileTypeMax:
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFileFormat, rcUnknown);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=merging spot data");
+ break;
+ case eCSFasta:
+ if( self->read[read_number].seq.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=sequence");
+ } else {
+ self->read[read_number].cs_key = file->cs_key;
+ rc = pstring_copy(&self->read[read_number].seq, &file->data);
+ }
+ break;
+ case eQuality:
+ if( self->read[read_number].qual.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=quality");
+ } else {
+ rc = pstring_copy(&self->read[read_number].qual, &file->data);
+ }
+ break;
+ case eSignalFTC:
+ if( !self->skip_signal ) {
+ if( self->read[read_number].fxx.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=FTC");
+ } else {
+ self->read[read_number].fs_type = eAbisolidFSignalType_FTC;
+ rc = pstring_copy(&self->read[read_number].fxx, &file->data);
+ }
+ }
+ break;
+ case eSignalCY3:
+ if( !self->skip_signal ) {
+ if( self->read[read_number].cy3.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=CY3");
+ } else {
+ rc = pstring_copy(&self->read[read_number].cy3, &file->data);
+ }
+ }
+ break;
+ case eSignalTXR:
+ if( !self->skip_signal ) {
+ if( self->read[read_number].txr.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=TXR");
+ } else {
+ rc = pstring_copy(&self->read[read_number].txr, &file->data);
+ }
+ }
+ break;
+ case eSignalCY5:
+ if( !self->skip_signal ) {
+ if( self->read[read_number].cy5.len > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=CY5");
+ } else {
+ rc = pstring_copy(&self->read[read_number].cy5, &file->data);
+ }
+ }
+ break;
+ }
+ if( rc == 0 ) {
+ const char* l = AbisolidReadType2ReadLabel[file->read_type];
+ rc = pstring_assign(&self->read[read_number].label, l, strlen(l));
+ }
+ file->ready = false;
+ }
+ }
+ }
+ }
+ /* replace -1 quality for '.' to 0 */
+ for(i = 0; rc == 0 && i < ABSOLID_FMT_MAX_NUM_READS; i++) {
+ int j;
+ for(j = 0; rc == 0 && j < self->read[i].qual.len; j++ ) {
+ if( self->read[i].qual.data[j] == -1 ) {
+ if( self->read[i].seq.data[j] == '.' ) {
+ self->read[i].qual.data[j] = 0;
+ } else {
+ SRALoaderFile_LOG(files[0].file, klogErr, rc, "$(msg)", "msg=quality is -1 not for '.'");
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ rc = SRAWriteAbsolid_Write(self->writer, argv[0], &spotname, NULL,
+ self->read[0].label.len > 0 ? &self->read[0] : NULL,
+ self->read[1].label.len > 0 ? &self->read[1] : NULL);
+ }
+ } while( rc == 0 );
+ free(files);
+ return rc;
+}
+
+static
+rc_t AbiLoaderFmt_Whack(AbiLoaderFmt *self, SRATable** table)
+{
+ SRAWriteAbsolid_Whack(self->writer, table);
+ free(self);
+ return 0;
+}
+
+const char UsageDefaultName[] = "abi-load";
+
+static
+rc_t AbiLoaderFmt_Version (const AbiLoaderFmt* self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "AB SOLiD native";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 vtAbiLoaderFmt =
+{
+ 1, 0,
+ AbiLoaderFmt_Whack,
+ AbiLoaderFmt_Version,
+ NULL,
+ AbiLoaderFmt_WriteData
+};
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ AbiLoaderFmt* fmt;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ *self = NULL;
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( (rc = SRAWriteAbsolid_Make(&fmt->writer, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ } else if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtAbiLoaderFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ }
+ /* Set result or free obj */
+ if( rc != 0 ) {
+ AbiLoaderFmt_Whack(fmt, NULL);
+ } else {
+ fmt->skip_signal = (config->columnFilter & (efltrSIGNAL | efltrDEFAULT));
+ *self = &fmt->dad;
+ }
+ return rc;
+}
diff --git a/tools/sra-load/common-xml.c b/tools/sra-load/common-xml.c
new file mode 100644
index 0000000..5c9439d
--- /dev/null
+++ b/tools/sra-load/common-xml.c
@@ -0,0 +1,871 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/container.h>
+#include <sra/types.h>
+#include <os-native.h>
+
+#include "common-xml.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+static
+rc_t parse_READ_LABEL(const KXMLNode* READ_SPEC, ReadSpecXML_read* read)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+
+ if( (rc = KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "READ_LABEL")) == 0 ) {
+ rc = KXMLNodeReadCStr(node, &read->read_label, NULL);
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "READ_LABEL");
+ } else if( strlen(read->read_label) == 0 ) {
+ free(read->read_label);
+ read->read_label = NULL;
+ }
+ KXMLNodeRelease(node);
+ } else {
+ /* label is optional */
+ rc = 0;
+ }
+ return rc;
+}
+
+static
+rc_t parse_READ_CLASS(const KXMLNode* READ_SPEC, ReadSpecXML_read* read)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+ char* rclass = NULL;
+
+ if( (rc = KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "READ_CLASS")) == 0 ) {
+ rc = KXMLNodeReadCStr(node, &rclass, NULL);
+ KXMLNodeRelease(node);
+ }
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "READ_CLASS");
+ } else if( strcmp(rclass, "Application Read") == 0 ) {
+ read->read_class = SRA_READ_TYPE_BIOLOGICAL;
+ } else if( strcmp(rclass, "Technical Read") == 0 ) {
+ read->read_class = SRA_READ_TYPE_TECHNICAL;
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "READ_CLASS: $(c)", PLOG_S(c), rclass));
+ }
+ free(rclass);
+ return rc;
+}
+
+static
+rc_t parse_READ_TYPE(const KXMLNode* READ_SPEC, ReadSpecXML_read* read)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+ char* rtype = NULL;
+
+ if( (rc = KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "READ_TYPE")) == 0 ) {
+ rc = KXMLNodeReadCStr(node, &rtype, "Forward");
+ KXMLNodeRelease(node);
+ }
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "READ_TYPE");
+ } else if( strcmp(rtype, "Forward") == 0 ) {
+ read->read_type = rdsp_Forward_rt;
+ } else if( strcmp(rtype, "Reverse") == 0 ) {
+ read->read_type = rdsp_Reverse_rt;
+ } else if( strcmp(rtype, "Adapter") == 0 ) {
+ read->read_type = rdsp_Adapter_rt;
+ } else if( strcmp(rtype, "Primer") == 0 ) {
+ read->read_type = rdsp_Primer_rt;
+ } else if( strcmp(rtype, "Linker") == 0 ) {
+ read->read_type = rdsp_Linker_rt;
+ } else if( strcmp(rtype, "BarCode") == 0 ) {
+ read->read_type = rdsp_BarCode_rt;
+ } else if( strcmp(rtype, "Other") == 0 ) {
+ read->read_type = rdsp_Other_rt;
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "READ_CLASS: $(c)", PLOG_S(c), rtype));
+ }
+ free(rtype);
+ return rc;
+}
+
+static
+rc_t parse_RELATIVE_ORDER(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t* counter)
+{
+ rc_t rc1 = 0, rc2 = 0;
+ const KXMLNode *node = NULL;
+
+ if( KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "RELATIVE_ORDER") != 0 ) {
+ return 0;
+ }
+ *counter = *counter + 1;
+ read->coord.relative_order.follows = -1; /* not set */
+ read->coord.relative_order.precedes = -1; /* not set */
+ rc1 = KXMLNodeReadAttrAsI16(node, "follows_read_index", &read->coord.relative_order.follows);
+ rc2 = KXMLNodeReadAttrAsI16(node, "precedes_read_index", &read->coord.relative_order.precedes);
+ KXMLNodeRelease(node);
+ if( (rc1 != 0 && GetRCState(rc1) != rcNotFound) || (rc2 != 0 && GetRCState(rc2) != rcNotFound) ) {
+ rc1 = rc1 ? rc1 : rc2;
+ LOGERR(klogErr, rc1, "RELATIVE_ORDER attributes");
+ } else if( (read->coord.relative_order.follows < 0 && read->coord.relative_order.precedes < 0) ||
+ (read->coord.relative_order.follows >= 0 && read->coord.relative_order.precedes >= 0) ) {
+ rc1 = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ LOGERR(klogErr, rc1, "RELATIVE_ORDER attributes");
+ } else {
+ rc1 = 0;
+ read->coord_type = rdsp_RelativeOrder_ct;
+ }
+ return rc1;
+}
+
+static
+rc_t parse_BASE_COORD(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t* counter)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+
+ if( KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "BASE_COORD") != 0 ) {
+ return 0;
+ }
+ *counter = *counter + 1;
+ rc = KXMLNodeReadAsI16(node, &read->coord.start_coord);
+ KXMLNodeRelease(node);
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "BASE_COORD");
+ } else if( read->coord.start_coord < 1 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "BASE_COORD: $(b)", PLOG_I32(b), read->coord.start_coord));
+ } else {
+ read->coord_type = rdsp_BaseCoord_ct;
+ }
+ return rc;
+}
+
+static
+rc_t parse_CYCLE_COORD(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t* counter)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+
+ if( KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "CYCLE_COORD") != 0 ) {
+ return 0;
+ }
+ *counter = *counter + 1;
+ rc = KXMLNodeReadAsI16(node, &read->coord.start_coord);
+ KXMLNodeRelease(node);
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "CYCLE_COORD");
+ } else if( read->coord.start_coord < 1 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "CYCLE_COORD: $(b)", PLOG_I32(b), read->coord.start_coord));
+ } else {
+ read->coord_type = rdsp_CycleCoord_ct;
+ }
+ return rc;
+}
+
+rc_t parse_BASECALL_TABLE_add(ReadSpecXML_read_BASECALL_TABLE* table, const ReadSpecXML_read_BASECALL* src, const char* bc)
+{
+ rc_t rc = 0;
+
+ if( table->size == table->count ) {
+ const int inc = 20;
+ ReadSpecXML_read_BASECALL* nt = realloc(table->table, (table->size + inc) * sizeof(*src));
+ if( nt == NULL ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ table->size += inc;
+ table->table = nt;
+ }
+ }
+ if( rc == 0 ) {
+ uint32_t i;
+ for(i = 0; rc == 0 && i < table->count; i++) {
+ if( strcmp(table->table[i].basecall, bc) == 0 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcDuplicate);
+ }
+ }
+ }
+ if( rc == 0 ) {
+ table->table[table->count].basecall = bc ? strdup(bc) : NULL;
+ table->table[table->count].read_group_tag = src->read_group_tag ? strdup(src->read_group_tag) : NULL;
+ table->table[table->count].min_match = src->min_match;
+ table->table[table->count].max_mismatch = src->max_mismatch;
+ table->table[table->count].match_edge = src->match_edge;
+ if( table->table[table->count].basecall == NULL ||
+ (src->read_group_tag != NULL && table->table[table->count].read_group_tag == NULL) ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else {
+ uint32_t k = strlen(table->table[table->count].basecall);
+ k += src->max_mismatch;
+ switch(src->match_edge) {
+ case match_edge_End:
+ if( table->match_end < k ) {
+ table->match_end = k;
+ }
+ break;
+ case match_edge_Start:
+ case match_edge_Full:
+ if( table->match_start < k ) {
+ table->match_start = k;
+ }
+ break;
+ }
+
+ rc = AgrepMake(&table->table[table->count].agrep,
+ AGREP_PATTERN_4NA |
+ AGREP_ALG_MYERS |
+ AGREP_EXTEND_BETTER, table->table[table->count].basecall);
+ }
+ table->count++;
+ }
+ return rc;
+}
+
+static
+rc_t parse_BASECALL_new4na(ReadSpecXML_read_BASECALL_TABLE* table, const ReadSpecXML_read_BASECALL* bc)
+{
+ rc_t rc = 0;
+
+ if( table == NULL || bc == NULL || bc->basecall[0] == '\0' ||
+ strspn(bc->basecall, "ACGTURYSWKMBDHVNacgturyswkmbdhvn.-") != strlen(bc->basecall) ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ }
+ if( rc == 0 ) {
+ char r[4096];
+ size_t l = strlen(bc->basecall);
+
+ if( l >= sizeof(r) ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcBuffer, rcInsufficient);
+ } else {
+ int i;
+ for(i = 0; i < l; i++) {
+ if( bc->match_edge == match_edge_End ) {
+ /* need to reverse BC because match will happen on reversed seq */
+ r[i] = bc->basecall[l - i - 1];
+ } else {
+ r[i] = bc->basecall[i];
+ }
+ /*r[i] = isalpha(r[i]) ? toupper(r[i]) : 'N';*/
+ }
+ r[i] = '\0';
+ rc = parse_BASECALL_TABLE_add(table, bc, r);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t parse_EXPECTED_BASECALL(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t* counter)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+ ReadSpecXML_read_BASECALL bc;
+
+ if( KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "EXPECTED_BASECALL") != 0 ) {
+ return 0;
+ }
+ *counter = *counter + 1;
+ if( (rc = KXMLNodeReadCStr(node, &bc.basecall, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "EXPECTED_BASECALL value");
+ } else if( (rc = KXMLNodeReadAttrAsU32(node, "default_length", &read->coord.expected_basecalls.default_length)) != 0 &&
+ GetRCState(rc) != rcNotFound ) {
+ LOGERR(klogErr, rc, "EXPECTED_BASECALL 'default_length' attribute");
+ } else if( (rc = KXMLNodeReadAttrAsU32(node, "base_coord", &read->coord.expected_basecalls.base_coord)) != 0 &&
+ GetRCState(rc) != rcNotFound ) {
+ LOGERR(klogErr, rc, "EXPECTED_BASECALL 'base_coord' attribute");
+ } else {
+ bc.read_group_tag = NULL;
+ bc.min_match = strlen(bc.basecall);
+ /* allow 10% mismatches */
+ bc.max_mismatch = bc.min_match * 0.1;
+ bc.match_edge = match_edge_Full;
+ if( (rc = parse_BASECALL_new4na(&read->coord.expected_basecalls, &bc)) == 0 ) {
+ read->coord_type = rdsp_ExpectedBaseCall_ct;
+ }
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "EXPECTED_BASECALL '$(c)'", PLOG_S(c), bc.basecall));
+ }
+ free(bc.basecall);
+ KXMLNodeRelease(node);
+ return rc;
+}
+
+static
+rc_t parse_BASECALL(const KXMLNode* node, ReadSpecXML_read_BASECALL_TABLE* table)
+{
+ rc_t rc = 0;
+ char* match_edge = NULL;
+ ReadSpecXML_read_BASECALL bc;
+
+
+ memset(&bc, 0, sizeof(bc));
+ if( (rc = KXMLNodeReadCStr(node, &bc.basecall, NULL)) != 0 ) {
+ LOGERR(klogErr, rc, "BASECALL");
+ return rc;
+ }
+ rc = KXMLNodeReadAttrCStr(node, "read_group_tag", &bc.read_group_tag, NULL);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "BASECALL @read_group_tag");
+ return rc;
+ }
+ rc = KXMLNodeReadAttrAsU32(node, "min_match", &bc.min_match);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "BASECALL @min_match");
+ return rc;
+ } else if(bc.min_match > strlen(bc.basecall)) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "BASECALL @min_match more than basecall length: $(bc)", PLOG_S(bc), bc.basecall));
+ return rc;
+ } else if( bc.min_match == 0 ) {
+ bc.min_match = strlen(bc.basecall);
+ }
+ rc = KXMLNodeReadAttrAsU32(node, "max_mismatch", &bc.max_mismatch);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "BASECALL @max_mismatch");
+ return rc;
+ } else if(bc.max_mismatch >= strlen(bc.basecall)) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "BASECALL @max_mismatch value too big: $(bc)", PLOG_S(bc), bc.basecall));
+ return rc;
+ }
+ if( (bc.min_match + bc.max_mismatch) < strlen(bc.basecall) ) {
+ if( bc.min_match != 0 ) {
+ PLOGMSG(klogWarn, (klogWarn, "BASECALL @min_match is too small: $(bc)", PLOG_S(bc), bc.basecall));
+ }
+ bc.min_match = strlen(bc.basecall) - bc.max_mismatch;
+ }
+ rc = KXMLNodeReadAttrCStr(node, "match_edge", &match_edge, NULL);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "BASECALL @match_edge");
+ } else if( match_edge == NULL || strcmp(match_edge, "full") == 0 ) {
+ bc.match_edge = match_edge_Full;
+ } else if( strcmp(match_edge, "start") == 0 ) {
+ bc.match_edge = match_edge_Start;
+ } else if( strcmp(match_edge, "end") == 0 ) {
+ bc.match_edge = match_edge_End;
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "BASECALL @match_edge: $(c)", PLOG_S(c), match_edge));
+ }
+ free(match_edge);
+
+ if( (rc = parse_BASECALL_new4na(table, &bc)) != 0 ) {
+ LOGERR(klogErr, rc, "BASECALL");
+ }
+ free(bc.basecall);
+ free(bc.read_group_tag);
+ return rc;
+}
+
+static
+rc_t parse_EXPECTED_BASECALL_TABLE(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t* counter)
+{
+ rc_t rc = 0;
+ const KXMLNode* EXPECTED_BASECALL_TABLE;
+ const KXMLNodeset* BASECALLS;
+
+ if( KXMLNodeGetFirstChildNodeRead(READ_SPEC, &EXPECTED_BASECALL_TABLE, "EXPECTED_BASECALL_TABLE") != 0 ) {
+ return 0;
+ }
+ *counter = *counter + 1;
+
+ if( (rc = KXMLNodeReadAttrAsU32(EXPECTED_BASECALL_TABLE, "default_length", &read->coord.expected_basecalls.default_length)) != 0 &&
+ GetRCState(rc) != rcNotFound ) {
+ LOGERR(klogErr, rc, "EXPECTED_BASECALL_TABLE 'default_length' attribute");
+ } else if( (rc = KXMLNodeReadAttrAsU32(EXPECTED_BASECALL_TABLE, "base_coord", &read->coord.expected_basecalls.base_coord)) != 0 &&
+ GetRCState(rc) != rcNotFound ) {
+ LOGERR(klogErr, rc, "EXPECTED_BASECALL_TABLE 'base_coord' attribute");
+ } else if( (rc = KXMLNodeOpenNodesetRead(EXPECTED_BASECALL_TABLE, &BASECALLS, "BASECALL")) == 0 ) {
+ uint32_t count = 0;
+ KXMLNodesetCount(BASECALLS, &count);
+ if( count > 0 ) {
+ uint32_t i, tagged;
+ for(i = 0; rc == 0 && i < count; i++) {
+ const KXMLNode* BASECALL = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(BASECALLS, &BASECALL, i)) == 0 ) {
+ if( (rc = parse_BASECALL(BASECALL, &read->coord.expected_basecalls)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "BASECALL $(i)", PLOG_U32(i), i));
+ }
+ KXMLNodeRelease(BASECALL);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "BASECALL node #$(i)", PLOG_U32(i), i));
+ }
+ }
+ for(i = 0, tagged = 0; rc == 0 && i < read->coord.expected_basecalls.count; i++) {
+ if( read->coord.expected_basecalls.table[i].read_group_tag != NULL ) {
+ tagged++;
+ }
+ }
+ if( tagged > 0 ) {
+ if( read->coord.expected_basecalls.count != tagged ) {
+ LOGMSG(klogWarn, "mixed tagged/untagged BASECALLs in table");
+ } else {
+ read->coord.expected_basecalls.pooled = true;
+ }
+ }
+ if( rc == 0 ) {
+ read->coord_type = rdsp_ExpectedBaseCallTable_ct;
+ } else {
+ free(read->coord.expected_basecalls.table);
+ }
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcIncomplete);
+ LOGERR(klogErr, rc, "need at least one BASECALL element");
+ }
+ KXMLNodesetRelease(BASECALLS);
+ } else {
+ LOGERR(klogErr, rc, "missing element(s) BASECALL");
+ }
+ KXMLNodeRelease(EXPECTED_BASECALL_TABLE);
+ return rc;
+}
+
+static
+rc_t parse_READ_SPEC(const KXMLNode* READ_SPEC, ReadSpecXML_read* read, uint32_t index)
+{
+ rc_t rc = 0;
+ uint32_t coord = 0;
+
+ if( (rc = parse_READ_LABEL(READ_SPEC, read)) != 0 ||
+ (rc = parse_READ_CLASS(READ_SPEC, read)) != 0 ||
+ (rc = parse_READ_TYPE(READ_SPEC, read)) != 0 ||
+ (rc = parse_RELATIVE_ORDER(READ_SPEC, read, &coord)) != 0 ||
+ (rc = parse_BASE_COORD(READ_SPEC, read, &coord)) != 0 ||
+ (rc = parse_CYCLE_COORD(READ_SPEC, read, &coord)) != 0 ||
+ (rc = parse_EXPECTED_BASECALL(READ_SPEC, read, &coord)) != 0 ||
+ (rc = parse_EXPECTED_BASECALL_TABLE(READ_SPEC, read, &coord)) != 0 ) {
+ return rc;
+ }
+ if( coord != 1 || read->coord_type == 0) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "bad or missing coordinate descriptor in read #$(index)",
+ PLOG_U32(index), index));
+ }
+ return rc;
+}
+
+static
+rc_t parse_READ_INDEX(const KXMLNode* READ_SPEC, uint32_t* index)
+{
+ rc_t rc = 0;
+ const KXMLNode* node = NULL;
+
+ if( (rc = KXMLNodeGetFirstChildNodeRead(READ_SPEC, &node, "READ_INDEX")) == 0 ) {
+ if( (rc = KXMLNodeReadAsU32(node, index)) != 0 ) {
+ LOGERR(klogErr, rc, "READ_INDEX");
+ }
+ KXMLNodeRelease(node);
+ } else {
+ LOGERR(klogErr, rc, "missing required node READ_INDEX");
+ }
+ return rc;
+}
+
+static
+rc_t XMLNode_get_subnode(const KXMLNode* node, const char* child, const KXMLNode** sub)
+{
+ rc_t rc = 0;
+ const KXMLNodeset* ns = NULL;
+
+ *sub = NULL;
+ if( (rc = KXMLNodeOpenNodesetRead(node, &ns, child)) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) {
+ if( count == 0 ) {
+ rc = RC(rcExe, rcFormatter, rcParsing, rcNode, rcNotFound);
+ } else if( count > 1 ) {
+ rc = RC(rcExe, rcFormatter, rcParsing, rcNode, rcDuplicate);
+ } else {
+ rc = KXMLNodesetGetNodeRead(ns, sub, 0);
+ }
+ }
+ KXMLNodesetRelease(ns);
+ }
+ return rc;
+}
+
+rc_t XMLNode_get_strnode(const KXMLNode* node, const char* child, bool optional, char** value)
+{
+ rc_t rc = 0;
+ const KXMLNode* n = NULL;
+
+ *value = NULL;
+ if( (rc = XMLNode_get_subnode(node, child, &n)) == 0 ) {
+ if( (rc = KXMLNodeReadCStr(n, value, NULL)) == 0 && *value != NULL && **value != '\0' ) {
+ /* rtrim and ltrim */
+ char* start = *value, *end;
+ while( *start != '\0' && isspace(*start) ) {
+ start++;
+ }
+ for(end = start; *end != '\0'; end++){}
+ while( --end > start && isspace(*end) ){}
+ memmove(*value, start, end - start + 1);
+ (*value)[end - start + 1] = '\0';
+ }
+ KXMLNodeRelease(n);
+ } else if( optional && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
+
+static
+rc_t XMLNode_get_u32node(const KXMLNode* node, const char* child, bool optional, uint32_t* value)
+{
+ rc_t rc = 0;
+ const KXMLNode* n = NULL;
+
+ if( (rc = XMLNode_get_subnode(node, child, &n)) == 0 ) {
+ rc = KXMLNodeReadAsU32(n, value);
+ KXMLNodeRelease(n);
+ } else if( optional && GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ }
+ return rc;
+}
+
+rc_t PlatformXML_Make(const PlatformXML** cself, const KXMLNode* node, uint32_t* spot_length)
+{
+ rc_t rc = 0;
+ PlatformXML* platform;
+ const KXMLNodeset* ns = NULL;
+
+ platform = calloc(1, sizeof(*platform));
+ if( platform != NULL ) {
+ platform->id = SRA_PLATFORM_UNDEFINED;
+ if( (rc = KXMLNodeOpenNodesetRead(node, &ns, "PLATFORM/*")) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcFormatter, rcConstructing, rcTag, count ? rcExcessive : rcNotFound);
+ } else {
+ const KXMLNode* n = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(ns, &n, 0)) == 0 ) {
+ const char* name = NULL;
+ if( (rc = KXMLNodeElementName(n, &name)) == 0 ) {
+ DEBUG_MSG (4, ("PLATFORM: %s\n", name));
+ if( strcmp(name, "LS454") == 0 ) {
+ if( (rc = XMLNode_get_strnode(n, "KEY_SEQUENCE", true, &platform->param.ls454.key_sequence)) == 0 &&
+ (rc = XMLNode_get_strnode(n, "FLOW_SEQUENCE", true, &platform->param.ls454.flow_sequence)) == 0 &&
+ (rc = XMLNode_get_u32node(n, "FLOW_COUNT", true, &platform->param.ls454.flow_count)) == 0 ) {
+ platform->id = SRA_PLATFORM_454;
+ if( platform->param.ls454.key_sequence == NULL || platform->param.ls454.key_sequence[0] == '\0' ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n)/KEY_SEQUENCE is not specified", PLOG_S(n), name));
+ free(platform->param.ls454.key_sequence);
+ platform->param.ls454.key_sequence = NULL;
+ }
+ if( platform->param.ls454.flow_sequence == NULL || platform->param.ls454.flow_sequence[0] == '\0' ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n)/FLOW_SEQUENCE is not specified", PLOG_S(n), name));
+ free(platform->param.ls454.flow_sequence);
+ platform->param.ls454.flow_sequence = NULL;
+ } else if( platform->param.ls454.flow_count % strlen(platform->param.ls454.flow_sequence) != 0 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcId, rcInconsistent);
+ } else {
+ char* flows = platform->param.ls454.flow_sequence;
+ platform->param.ls454.flow_sequence = malloc(platform->param.ls454.flow_count + 1);
+ if( platform->param.ls454.flow_sequence != NULL ) {
+ uint32_t i = platform->param.ls454.flow_count / strlen(flows);
+ platform->param.ls454.flow_sequence[0] = '\0';
+ while( i > 0 ) {
+ strcat(platform->param.ls454.flow_sequence, flows);
+ i--;
+ }
+ free(flows);
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ }
+ }
+ } else if( strcmp(name, "ION_TORRENT") == 0 ) {
+ if( (rc = XMLNode_get_strnode(n, "KEY_SEQUENCE", true, &platform->param.ion_torrent.key_sequence)) == 0 &&
+ (rc = XMLNode_get_strnode(n, "FLOW_SEQUENCE", true, &platform->param.ion_torrent.flow_sequence)) == 0 &&
+ (rc = XMLNode_get_u32node(n, "FLOW_COUNT", true, &platform->param.ion_torrent.flow_count)) == 0 ) {
+ platform->id = SRA_PLATFORM_ION_TORRENT;
+ if( platform->param.ion_torrent.key_sequence == NULL || platform->param.ion_torrent.key_sequence[0] == '\0' ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n)/KEY_SEQUENCE is not specified", PLOG_S(n), name));
+ free(platform->param.ion_torrent.key_sequence);
+ platform->param.ion_torrent.key_sequence = NULL;
+ }
+ if( platform->param.ion_torrent.flow_sequence == NULL || platform->param.ion_torrent.flow_sequence[0] == '\0' ) {
+ PLOGMSG(klogWarn, (klogWarn, "$(n)/FLOW_SEQUENCE is not specified", PLOG_S(n), name));
+ free(platform->param.ion_torrent.flow_sequence);
+ platform->param.ion_torrent.flow_sequence = NULL;
+ } else if( platform->param.ion_torrent.flow_count % strlen(platform->param.ion_torrent.flow_sequence) != 0 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcId, rcInconsistent);
+ } else {
+ char* flows = platform->param.ion_torrent.flow_sequence;
+ platform->param.ion_torrent.flow_sequence = malloc(platform->param.ion_torrent.flow_count + 1);
+ if( platform->param.ion_torrent.flow_sequence != NULL ) {
+ uint32_t i = platform->param.ion_torrent.flow_count / strlen(flows);
+ platform->param.ion_torrent.flow_sequence[0] = '\0';
+ while( i > 0 ) {
+ strcat(platform->param.ion_torrent.flow_sequence, flows);
+ i--;
+ }
+ free(flows);
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ }
+ }
+ } else if( strcmp(name, "ILLUMINA") == 0 ) {
+ if( (rc = XMLNode_get_u32node(n, "SEQUENCE_LENGTH", false, spot_length)) != 0 &&
+ GetRCState(rc) == rcNotFound ) {
+ rc = XMLNode_get_u32node(n, "CYCLE_COUNT", true, spot_length);
+ }
+ if( rc == 0 ) {
+ platform->id = SRA_PLATFORM_ILLUMINA;
+ }
+ } else if( strcmp(name, "HELICOS") == 0 ) {
+ if( (rc = XMLNode_get_strnode(n, "FLOW_SEQUENCE", true, &platform->param.helicos.flow_sequence)) == 0 &&
+ (rc = XMLNode_get_u32node(n, "FLOW_COUNT", true, &platform->param.helicos.flow_count)) == 0 ) {
+ platform->id = SRA_PLATFORM_HELICOS;
+ }
+ } else if( strcmp(name, "ABI_SOLID") == 0 ) {
+ if( (rc = XMLNode_get_u32node(n, "SEQUENCE_LENGTH", false, spot_length)) != 0 &&
+ GetRCState(rc) == rcNotFound ) {
+ rc = XMLNode_get_u32node(n, "CYCLE_COUNT", true, spot_length);
+ }
+ if( rc == 0 ) {
+ platform->id = SRA_PLATFORM_ABSOLID;
+ }
+ } else if( strcmp(name, "PACBIO_SMRT") == 0 ) {
+ platform->id = SRA_PLATFORM_PACBIO_SMRT;
+ } else if( strcmp(name, "COMPLETE_GENOMICS") == 0 ) {
+ platform->id = SRA_PLATFORM_COMPLETE_GENOMICS;
+ } else if( strcmp(name, "CAPILLARY") == 0 ) {
+ platform->id = SRA_PLATFORM_CAPILLARY;
+ } else if( strcmp(name, "OXFORD_NANOPORE") == 0 ) {
+ platform->id = SRA_PLATFORM_OXFORD_NANOPORE;
+ }
+
+ if( rc != 0 || platform->id == SRA_PLATFORM_UNDEFINED ) {
+ rc = rc ? rc : RC(rcExe, rcFormatter, rcConstructing, rcId, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc, "PLATFORM '$(n)'", PLOG_S(n), name));
+ }
+ }
+ KXMLNodeRelease(n);
+ }
+ }
+ KXMLNodesetRelease(ns);
+ }
+ if( rc == 0 ) {
+ *cself = platform;
+ } else {
+ PlatformXML_Whack(platform);
+ }
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ return rc;
+}
+
+void PlatformXML_Whack(const PlatformXML* cself)
+{
+ if( cself != NULL ) {
+ PlatformXML* self = (PlatformXML*)cself;
+ switch(self->id) {
+ case SRA_PLATFORM_454:
+ free(self->param.ls454.key_sequence);
+ free(self->param.ls454.flow_sequence);
+ break;
+ case SRA_PLATFORM_ION_TORRENT:
+ free(self->param.ion_torrent.key_sequence);
+ free(self->param.ion_torrent.flow_sequence);
+ break;
+ case SRA_PLATFORM_ILLUMINA:
+ break;
+ case SRA_PLATFORM_HELICOS:
+ free(self->param.helicos.flow_sequence);
+ break;
+ case SRA_PLATFORM_ABSOLID:
+ break;
+ case SRA_PLATFORM_PACBIO_SMRT:
+ break;
+ case SRA_PLATFORM_COMPLETE_GENOMICS:
+ break;
+ case SRA_PLATFORM_CAPILLARY:
+ break;
+ case SRA_PLATFORM_OXFORD_NANOPORE:
+ break;
+ case SRA_PLATFORM_UNDEFINED:
+ break;
+ }
+ free(self);
+ }
+}
+
+rc_t ReadSpecXML_Make(const ReadSpecXML** cself, const KXMLNode* node, const char* path, uint32_t* spot_length)
+{
+ rc_t rc = 0;
+ ReadSpecXML* obj;
+
+ assert(node != NULL);
+
+ obj = calloc(1, sizeof(*obj));
+ if( obj != NULL ) {
+ const KXMLNodeset* READ_SPECS = NULL;
+ const KXMLNode* nsplen = NULL;
+ obj->nreads = 0;
+ obj->reads = &obj->spec[1]; /* set actual read to next one after fake fixed size read */
+ if( (rc = KXMLNodeGetFirstChildNodeRead(node, &nsplen, "%s/SPOT_DECODE_SPEC/SPOT_LENGTH", path)) == 0 ) {
+ rc = KXMLNodeReadAsU32(nsplen, spot_length);
+ KXMLNodeRelease(nsplen);
+ }
+ if( rc != 0 ) {
+ if( GetRCState(rc) != rcNotFound) {
+ LOGERR(klogErr, rc, "node SPOT_LENGTH");
+ } else {
+ rc = 0;
+ }
+ }
+ if( rc == 0 &&
+ (rc = KXMLNodeOpenNodesetRead(node, &READ_SPECS, "%s/SPOT_DECODE_SPEC/READ_SPEC", path)) == 0 ) {
+ if( (rc = KXMLNodesetCount(READ_SPECS, &obj->nreads)) != 0 || obj->nreads < 1 || obj->nreads > SRALOAD_MAX_READS ) {
+ rc = rc ? rc : RC(rcExe, rcFormatter, rcConstructing, rcTag, obj->nreads ? rcExcessive : rcNotFound);
+ } else {
+ const uint8_t class_none = ~0;
+ uint32_t i;
+ for(i = 0; i < obj->nreads; i++) {
+ /* set all read's mandatory READ_CLASS to 'unset' value */
+ obj->reads[i].read_class = class_none;
+ }
+ for(i = 0; rc == 0 && i < obj->nreads; i++) {
+ const KXMLNode* READ_SPEC = NULL;
+ uint32_t index = ~0;
+ if( (rc = KXMLNodesetGetNodeRead(READ_SPECS, &READ_SPEC, i)) == 0 &&
+ (rc = parse_READ_INDEX(READ_SPEC, &index)) == 0 ) {
+ if( obj->reads[index].read_class == class_none ) {
+ if( (rc = parse_READ_SPEC(READ_SPEC, &obj->reads[index], index)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "READ_INDEX $(i)", PLOG_U32(i), index));
+ }
+ }
+ KXMLNodeRelease(READ_SPEC);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "READ_SPEC node #$(i)", PLOG_U32(i), i));
+ }
+ }
+ if(rc == 0) {
+ for(i = 0; i < obj->nreads; i++) {
+ if(obj->reads[i].read_class == class_none ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "missing READ_SPEC for READ_INDEX #$(i)", PLOG_U32(i), i));
+ } else {
+ switch(obj->reads[i].coord_type) {
+ case rdsp_RelativeOrder_ct:
+ if( obj->nreads == 1 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "#$(i) single RELATIVE_ORDER not allowed", PLOG_U32(i), i));
+ } else if( i > 0 && obj->reads[i - 1].coord_type != rdsp_ExpectedBaseCall_ct &&
+ obj->reads[i - 1].coord_type != rdsp_ExpectedBaseCallTable_ct ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "#$(i) RELATIVE_ORDER cannot follow read of $(type) type",
+ PLOG_2(PLOG_U32(i),PLOG_S(type)), i,
+ obj->reads[i - 1].coord_type == rdsp_BaseCoord_ct ? "BASE_COORD" :
+ obj->reads[i - 1].coord_type == rdsp_CycleCoord_ct ? "CYCLE_COORD" :
+ obj->reads[i - 1].coord_type == rdsp_RelativeOrder_ct ? "RELATIVE_ORDER" : "????"));
+ } else if( (obj->reads[i].coord.relative_order.follows >= 0 &&
+ (i == 0 || obj->reads[i].coord.relative_order.follows != i - 1)) ||
+ (obj->reads[i].coord.relative_order.precedes >= 0 &&
+ (i == obj->nreads - 1 || obj->reads[i].coord.relative_order.precedes != i + 1)) ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "#$(i) RELATIVE_ORDER attribute value(s)", PLOG_U32(i), i));
+ }
+ break;
+ case rdsp_BaseCoord_ct:
+ case rdsp_CycleCoord_ct:
+ if( i == 0 && obj->reads[i].coord.start_coord != 1 ) {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "#$(i) 1st read coordinate must be 1", PLOG_U32(i), i));
+ }
+ break;
+ case rdsp_ExpectedBaseCall_ct:
+ case rdsp_ExpectedBaseCallTable_ct:
+ break;
+ default:
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcData, rcUnexpected);
+ PLOGERR(klogErr, (klogErr, rc, "read #$(i) type", PLOG_U32(i), i));
+ break;
+ }
+ }
+ }
+ }
+ }
+ KXMLNodesetRelease(READ_SPECS);
+ }
+ } else {
+ rc = RC(rcExe, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ if( rc == 0 ) {
+ obj->spec[0].coord_type = rdsp_FIXED_BRACKET_ct;
+ obj->spec[0].read_class = SRA_READ_TYPE_TECHNICAL;
+ obj->spec[0].read_type = rdsp_Other_rt;
+ obj->spec[0].coord.start_coord = 1;
+ obj->spec[obj->nreads + 1].coord_type = rdsp_FIXED_BRACKET_ct;
+ obj->spec[obj->nreads + 1].read_class = SRA_READ_TYPE_TECHNICAL;
+ obj->spec[obj->nreads + 1].read_type = rdsp_Other_rt;
+ obj->spec[obj->nreads + 1].coord.start_coord = 0;
+ *cself = obj;
+ } else {
+ ReadSpecXML_Whack(obj);
+ }
+ return rc;
+}
+
+void ReadSpecXML_Whack(const ReadSpecXML* cself)
+{
+ if( cself != NULL ) {
+ uint32_t i, j;
+ ReadSpecXML* self = (ReadSpecXML*)cself;
+
+ for(i = 0; i < self->nreads; i++) {
+ free(self->reads[i].read_label);
+ switch(self->reads[i].coord_type) {
+ case rdsp_ExpectedBaseCall_ct:
+ case rdsp_ExpectedBaseCallTable_ct:
+ for(j = 0; j < self->reads[i].coord.expected_basecalls.count; j++) {
+ free(self->reads[i].coord.expected_basecalls.table[j].basecall);
+ free(self->reads[i].coord.expected_basecalls.table[j].read_group_tag);
+ AgrepWhack(self->reads[i].coord.expected_basecalls.table[j].agrep);
+ }
+ free(self->reads[i].coord.expected_basecalls.table);
+ break;
+ default:
+ break;
+ }
+ }
+ free(self);
+ }
+}
diff --git a/tools/sra-load/common-xml.h b/tools/sra-load/common-xml.h
new file mode 100644
index 0000000..918a142
--- /dev/null
+++ b/tools/sra-load/common-xml.h
@@ -0,0 +1,183 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_common_xml_
+#define _sra_load_common_xml_
+
+#include <kxml/xml.h>
+#include <search/grep.h>
+#include <sra/sradb.h>
+
+#define SRALOAD_MAX_READS 32
+
+rc_t XMLNode_get_strnode(const KXMLNode* node, const char* child, bool optional, char** value);
+
+typedef struct PlatformXML_struct {
+ SRAPlatforms id;
+ union {
+ struct {
+ char* key_sequence; /* optional */
+ char* flow_sequence; /* optional */
+ uint32_t flow_count; /* optional */
+ } ls454;
+
+ struct {
+ char* key_sequence; /* optional */
+ char* flow_sequence; /* optional */
+ uint32_t flow_count; /* optional */
+ } ion_torrent;
+
+ struct {
+ char* flow_sequence; /* optional */
+ uint32_t flow_count; /* optional */
+ } helicos;
+ } param;
+} PlatformXML;
+
+rc_t PlatformXML_Make(const PlatformXML** cself, const KXMLNode* node, uint32_t* spot_length);
+
+void PlatformXML_Whack(const PlatformXML* cself);
+
+typedef struct ReadSpecXML_read_BASECALL_struct {
+ char* basecall;
+ char* read_group_tag;
+ uint32_t min_match;
+ uint32_t max_mismatch;
+ enum {
+ match_edge_Full = 1,
+ match_edge_Start,
+ match_edge_End
+ } match_edge;
+ Agrep* agrep;
+} ReadSpecXML_read_BASECALL;
+
+typedef struct ReadSpecXML_read_BASECALL_TABLE_struct {
+ uint32_t default_length;
+ uint32_t base_coord;
+ ReadSpecXML_read_BASECALL* table;
+ uint32_t size; /* allocated structures qty */
+ uint32_t count; /* used structures qty */
+ bool pooled; /* true disables search if member is present from run */
+ uint16_t match_start; /* length of longest bc with match_edge="start" */
+ uint16_t match_end; /* length of longest bc with match_edge="end" */
+} ReadSpecXML_read_BASECALL_TABLE;
+
+typedef struct ReadSpecXML_read_struct {
+ char* read_label; /* asciiz */
+ SRAReadTypes read_class;
+ enum {
+ rdsp_Forward_rt = 1,
+ rdsp_Reverse_rt,
+ rdsp_Adapter_rt,
+ rdsp_Primer_rt,
+ rdsp_Linker_rt,
+ rdsp_BarCode_rt,
+ rdsp_Other_rt
+ } read_type;
+
+ enum {
+ /* order is important !!! */
+ rdsp_FIXED_BRACKET_ct = 1, /* special fixed size type */
+ rdsp_RelativeOrder_ct,
+ rdsp_BaseCoord_ct,
+ rdsp_CycleCoord_ct,
+ rdsp_ExpectedBaseCall_ct,
+ rdsp_ExpectedBaseCallTable_ct
+ } coord_type;
+
+ union {
+ struct {
+ int16_t follows;
+ int16_t precedes;
+ } relative_order;
+ /* starting position for *_COORD types */
+ int16_t start_coord;
+ /* EXPECTED_BASECALL is a table of 1 element, unless IUPAC is used in values */
+ ReadSpecXML_read_BASECALL_TABLE expected_basecalls;
+ } coord;
+} ReadSpecXML_read;
+
+typedef struct ReadSpecXML_struct {
+ uint32_t nreads;
+ ReadSpecXML_read spec[SRALOAD_MAX_READS + 2];
+ ReadSpecXML_read* reads;
+} ReadSpecXML;
+
+rc_t ReadSpecXML_Make(const ReadSpecXML** cself, const KXMLNode* node, const char* path, uint32_t* spot_length);
+
+void ReadSpecXML_Whack(const ReadSpecXML* cself);
+
+typedef enum {
+ eExperimentQualityType_Undefined = 0,
+ eExperimentQualityType_Phred,
+ eExperimentQualityType_LogOdds,
+ eExperimentQualityType_Other
+} ExperimentQualityType;
+
+typedef enum {
+ eExperimentQualityEncoding_Undefined = 0,
+ eExperimentQualityEncoding_Ascii,
+ eExperimentQualityEncoding_Decimal,
+ eExperimentQualityEncoding_Hexadecimal
+} ExperimentQualityEncoding;
+
+/*
+
+The value 'default' is same as '' or NULL in terms coding and represents default group (member) in SRA.
+
+We use value of these data elements as SPOT_GROUP (barcode, member, etc) column value.
+Rules (whichever is present in order of importance):
+
+1. Run.xml: /RUN/DATA_BLOCK/ attribute member_name. (must have POOL to set read lengths).
+2. Barcode in spot name in file data. (if not explicitly chosen [below] must have pool, otherwise fail)(must have POOL to set read lengths).
+3. Experiment.xml: /EXPERIMENT/DESIGN/SAMPLE_DESCRIPTOR/POOL elements MEMBER. Match subsequences to determine SPOT_GROUP value.
+4. No SPOT_GROUP column
+
+Than <RUN_ATTRIBUTE> with <TAG> case-insensitive value of �read_name_barcode_proc_directive� comes in with case-insensitive <VALUE> values:
+
+1. RUN_ATTRIBUTE not present at all � use rules above.
+2. 'interpret_as_spotgroup' (use_file_spot_name) � use data from file�s spot names. Force rule #2. (new addition)
+3. �use_table_in_experiment� � use POOL table from experiment.xml. Force rule #3.
+4. �ignore� � do not write anything to SPOT_GROUP column. Force rule #4
+
+*/
+
+typedef enum {
+ eBarcodeRule_not_set = 0,
+ eBarcodeRule_use_file_spot_name,
+ eBarcodeRule_use_table_in_experiment,
+ eBarcodeRule_ignore_barcode
+} ExperimentBarcodeRule;
+
+typedef struct RunAttributes_struct {
+ uint32_t spot_length;
+ const PlatformXML* platform;
+ const ReadSpecXML* reads;
+ ExperimentBarcodeRule barcode_rule;
+ ExperimentQualityType quality_type;
+ uint8_t quality_offset;
+} RunAttributes;
+
+#endif /* _sra_load_common_xml_ */
diff --git a/tools/sra-load/debug.h b/tools/sra-load/debug.h
new file mode 100644
index 0000000..48dc6b8
--- /dev/null
+++ b/tools/sra-load/debug.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_sra_load_debug_h_
+#define _tools_sra_load_debug_h_
+
+#include <klib/debug.h>
+
+#define DEBUG_MSG_PASTE(a,b) a##b
+#define DEBUG_MSG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(DEBUG_MSG_PASTE(DBG_APP_,flag)), msg)
+
+#endif /* _tools_sra_load_debug_h_ */
diff --git a/tools/sra-load/experiment-xml.c b/tools/sra-load/experiment-xml.c
new file mode 100644
index 0000000..2e7569b
--- /dev/null
+++ b/tools/sra-load/experiment-xml.c
@@ -0,0 +1,1255 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/container.h>
+#include <klib/trie.h>
+#include <sra/types.h>
+#include <os-native.h>
+
+#include "experiment-xml.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#define MAX_POOL_MEMBER_BASECALLS 64
+#define MAX_SPOT_DESCRIPTOR_READS (SRALOAD_MAX_READS + 2)
+
+typedef struct PoolReadSpec_struct {
+ int16_t start;
+ int16_t length;
+ /* chosen basecalls for EXPECTED_BASECALL_TABLE for defined member_name, NULL-terminated array */
+ const ReadSpecXML_read_BASECALL* item[MAX_POOL_MEMBER_BASECALLS];
+ int32_t score;
+} PoolReadSpec;
+
+typedef struct PoolMember_struct {
+ BSTNode node;
+ const char *name;
+ PoolReadSpec spec[MAX_SPOT_DESCRIPTOR_READS];
+} PoolMember;
+
+struct ExperimentXML {
+ uint32_t spot_length;
+ const PlatformXML* platform;
+ ProcessingXML processing;
+ const ReadSpecXML* reads;
+ BSTree* member_pool;
+ PoolMember* member_null;
+ SLList member_stats;
+};
+
+static
+void CC PoolMember_Whack(BSTNode* node, void* data)
+{
+ if( node != NULL ) {
+ const PoolMember* n = (const PoolMember*)node;
+ free((void*)n->name);
+ free(node);
+ }
+}
+
+static
+int64_t CC PoolMember_StrCmp(const char* s1, const char* s2)
+{
+ if( s1 == NULL && s2 == NULL ) {
+ return 0;
+ } else if( s1 == NULL ) {
+ return -32767;
+ } else if( s2 == NULL ) {
+ return 32768;
+ }
+ return strcmp(s1, s2);
+}
+
+static
+int64_t CC PoolMember_Cmp(const BSTNode* item, const BSTNode* node)
+{
+ const PoolMember* i = (const PoolMember*)item;
+ const PoolMember* n = (const PoolMember*)node;
+
+ return PoolMember_StrCmp(i->name, n->name);
+}
+
+static
+int64_t CC PoolMember_FindByName(const void* item, const BSTNode* node)
+{
+ const char* name = (const char*)item;
+ const PoolMember* n = (const PoolMember*)node;
+
+ return PoolMember_StrCmp(name, n->name);
+}
+
+#if _DEBUGGING
+static
+void CC PoolMember_Dump( BSTNode *node, void *data )
+{
+ const PoolMember* n = (const PoolMember*)node;
+ const ExperimentXML* self = (const ExperimentXML*)data;
+ int r;
+
+ DEBUG_MSG(9, ("Member '%s'\n", n->name));
+
+ for(r = 0; r <= self->reads->nreads + 1; r++) {
+ DEBUG_MSG(9, ("Read %d [%hd:%hd]", r + 1, n->spec[r].start, n->spec[r].length));
+ if( self->reads->spec[r].coord_type == rdsp_ExpectedBaseCall_ct ) {
+ DEBUG_MSG(9, (" ebc:'%s'", n->spec[r].item[0]->basecall));
+ } else if( self->reads->spec[r].coord_type == rdsp_ExpectedBaseCallTable_ct ) {
+ int i = -1;
+ while( n->spec[r].item[++i] != NULL ) {
+ DEBUG_MSG(9, (" bc:'%s', tag:'%s';", n->spec[r].item[i]->basecall, n->spec[r].item[i]->read_group_tag));
+ }
+ }
+ DEBUG_MSG(9, ("\n"));
+ }
+}
+#endif
+
+static
+rc_t PoolMember_Add(ExperimentXML* self, const char* name)
+{
+ rc_t rc = 0;
+ PoolMember* member = NULL;
+
+ if( self == NULL) {
+ return RC(rcSRA, rcFormatter, rcAllocating, rcSelf, rcNull);
+ }
+ member = calloc(1, sizeof(*member));
+ if( member == NULL ) {
+ return RC(rcSRA, rcFormatter, rcAllocating, rcMemory, rcExhausted);
+ }
+ if( name == NULL ) {
+ if( self->member_null == NULL ) {
+ self->member_null = member;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcAllocating, rcId, rcDuplicate);
+ }
+ } else {
+ member->name = strdup(name);
+ if( member->name == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ if( self->member_pool == NULL ) {
+ self->member_pool = calloc(1, sizeof(BSTree));
+ if( self->member_pool == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ BSTreeInit(self->member_pool);
+ }
+ }
+ if( rc == 0 ) {
+ rc = BSTreeInsertUnique(self->member_pool, &member->node, NULL, PoolMember_Cmp);
+ }
+ }
+ }
+ if( rc == 0 ) {
+ uint32_t i;
+ for(i = 0; i <= self->reads->nreads + 1; i++) {
+ switch(self->reads->spec[i].coord_type) {
+ case rdsp_FIXED_BRACKET_ct:
+ member->spec[i].start = self->reads->spec[i].coord.start_coord - 1;
+ member->spec[i].length = (i == 0 ? 0 : -1);
+ break;
+ case rdsp_RelativeOrder_ct:
+ member->spec[i].start = -1;
+ member->spec[i].length = -1;
+ break;
+
+ case rdsp_BaseCoord_ct:
+ case rdsp_CycleCoord_ct:
+ member->spec[i].start = self->reads->spec[i].coord.start_coord - 1;
+ member->spec[i].length = -1;
+ break;
+
+ case rdsp_ExpectedBaseCall_ct:
+ if( name == NULL || name[0] == '\0' ) {
+ member->spec[i].start = self->reads->spec[i].coord.expected_basecalls.base_coord;
+ member->spec[i].length = self->reads->spec[i].coord.expected_basecalls.default_length;
+ }
+ if( member->spec[i].start == 0 ) {
+ member->spec[i].start = -1;
+ }
+ member->spec[i].item[0] = self->reads->spec[i].coord.expected_basecalls.table;
+ if( member->spec[i].length == 0 ) {
+ member->spec[i].length = strlen(member->spec[i].item[0]->basecall);
+ }
+ break;
+
+ case rdsp_ExpectedBaseCallTable_ct:
+ if( name == NULL || name[0] == '\0' ) {
+ member->spec[i].start = self->reads->spec[i].coord.expected_basecalls.base_coord;
+ member->spec[i].length = self->reads->spec[i].coord.expected_basecalls.default_length;
+ }
+ if( member->spec[i].start == 0 ) {
+ member->spec[i].start = -1;
+ }
+ if( member->spec[i].length == 0 ) {
+ member->spec[i].length = (!self->reads->spec[i].coord.expected_basecalls.pooled || name == NULL) ? -1 : 0;
+ }
+ break;
+ }
+ }
+ } else {
+ PoolMember_Whack(&member->node, NULL);
+ }
+ return rc;
+}
+
+static
+rc_t PoolMember_AddBasecalls(const ExperimentXML* self, const char* member, int readid, const ReadSpecXML_read_BASECALL* basecalls[])
+{
+ rc_t rc = 0;
+
+ if( self == NULL || basecalls == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcParam, rcNull);
+ } else if( self->reads->reads[readid].coord_type != rdsp_ExpectedBaseCallTable_ct ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcId, rcIncorrect);
+ } else {
+ PoolMember* pm = (PoolMember*)BSTreeFind(self->member_pool, member, PoolMember_FindByName);
+ if( pm == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)'", PLOG_S(m), member));
+ } else {
+ int k = -1, i = -1;
+ while( pm->spec[readid + 1].item[++k] != NULL );
+ while( rc == 0 && basecalls[++i] != NULL ) {
+ if( k >= MAX_POOL_MEMBER_BASECALLS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcTooLong);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' basecalls", PLOG_S(m), member));
+ } else {
+ pm->spec[readid + 1].item[k++] = basecalls[i];
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t parse_POOL(const KXMLNode* EXPERIMENT, ExperimentXML* obj)
+{
+ rc_t rc = 0;
+
+ /* create unspecified member -> NULL */
+ if( (rc = PoolMember_Add(obj, NULL)) == 0 ) {
+ const KXMLNodeset* MEMBERS;
+ if( (rc = KXMLNodeOpenNodesetRead(EXPERIMENT, &MEMBERS, "DESIGN/SAMPLE_DESCRIPTOR/POOL/MEMBER")) == 0 ) {
+ uint32_t i, num_members = 0;
+ if( (rc = KXMLNodesetCount(MEMBERS, &num_members)) == 0 && num_members > 0 ) {
+ /* create default member -> '' */
+ rc = PoolMember_Add(obj, "");
+ for(i = 0; rc == 0 && i < num_members; i++) {
+ const KXMLNode* MEMBER;
+ if( (rc = KXMLNodesetGetNodeRead(MEMBERS, &MEMBER, i)) == 0 ) {
+ char* member_name = NULL;
+ if( (rc = KXMLNodeReadAttrCStr(MEMBER, "member_name", &member_name, NULL)) == 0 ) {
+ const KXMLNodeset* LABELS;
+ if( strcasecmp(member_name, "default") == 0 ) {
+ member_name[0] = '\0';
+ }
+ if( member_name[0] != '\0' ) {
+ if( (rc = PoolMember_Add(obj, member_name)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)'", PLOG_S(m), member_name));
+ }
+ }
+ if( rc == 0 && (rc = KXMLNodeOpenNodesetRead(MEMBER, &LABELS, "READ_LABEL")) == 0 ) {
+ uint32_t l, num_labels = 0;
+ KXMLNodesetCount(LABELS, &num_labels);
+ if( num_labels > 0 ) {
+ const ReadSpecXML_read_BASECALL* basecalls[MAX_POOL_MEMBER_BASECALLS];
+ for(l = 0; rc == 0 && l < num_labels; l++) {
+ const KXMLNode* LABEL;
+ if( (rc = KXMLNodesetGetNodeRead(LABELS, &LABEL, l)) == 0 ) {
+ char* label = NULL, *tag = NULL;
+ if( (rc = KXMLNodeReadCStr(LABEL, &label, NULL)) != 0 || label == NULL || label[0] == '\0' ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcConstructing, rcData, rcEmpty);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL value", PLOG_S(m), member_name));
+ } else {
+ if( (rc = KXMLNodeReadAttrCStr(LABEL, "read_group_tag", &tag, NULL)) != 0 ) {
+ if( GetRCState(rc) != rcNotFound ) {
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL '$(l)' 'read_group_tag' attribute",
+ PLOG_2(PLOG_S(m),PLOG_S(l)), member_name, label));
+ } else {
+ rc = 0;
+ }
+ } else if( tag != NULL && tag[0] == '\0' ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcEmpty);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL '$(l)' 'read_group_tag' attribute",
+ PLOG_2(PLOG_S(m),PLOG_S(l)), member_name, label));
+ }
+ if( rc == 0 ) {
+ /* find read_spec based on label and update basecall table */
+ uint32_t r, read_found = 0;
+ for(r = 0; rc == 0 && r < obj->reads->nreads; r++) {
+ if( obj->reads->reads[r].read_label != NULL && strcmp(label, obj->reads->reads[r].read_label) == 0 ) {
+ read_found++;
+ if( tag != NULL && tag[0] != '\0' ) {
+ if( obj->reads->reads[r].coord_type != rdsp_ExpectedBaseCallTable_ct ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc,
+ "MEMBER '$(m)' READ_LABEL '$(l)' READ_SPEC must have EXPECTED_BASECALL_TABLE type",
+ PLOG_2(PLOG_S(m),PLOG_S(l)), member_name, label));
+ } else {
+ uint32_t b, bcall_found = 0;
+ memset(basecalls, 0, sizeof(basecalls));
+ /* find tag in table */
+ for(b = 0; rc == 0 && b < obj->reads->reads[r].coord.expected_basecalls.count; b++) {
+ if( obj->reads->reads[r].coord.expected_basecalls.table[b].read_group_tag != NULL &&
+ strcmp(tag, obj->reads->reads[r].coord.expected_basecalls.table[b].read_group_tag) == 0 ) {
+ if( bcall_found >= MAX_POOL_MEMBER_BASECALLS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcExcessive);
+ PLOGERR(klogErr, (klogErr, rc,
+ "MEMBER '$(m)' READ_LABEL '$(l)' read_group_tag='$(t)' too many basecalls",
+ PLOG_3(PLOG_S(m),PLOG_S(l),PLOG_S(t)), member_name, label, tag));
+ }
+ basecalls[bcall_found++] = &obj->reads->reads[r].coord.expected_basecalls.table[b];
+ }
+ }
+ if( rc == 0 && bcall_found == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL '$(l)' read_group_tag='$(t)' in READ_SPEC",
+ PLOG_3(PLOG_S(m),PLOG_S(l),PLOG_S(t)), member_name, label, tag));
+ } else {
+ rc = PoolMember_AddBasecalls(obj, member_name, r, basecalls);
+ }
+ }
+ }
+ }
+ }
+ if( read_found == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL '$(l)' in READ_SPEC", PLOG_2(PLOG_S(l),PLOG_S(m)), label, member_name));
+ } else if( read_found > 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL '$(l)' in READ_SPEC", PLOG_2(PLOG_S(l),PLOG_S(m)), label, member_name));
+ }
+ }
+ }
+ free(tag);
+ free(label);
+ KXMLNodeRelease(LABEL);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER '$(m)' READ_LABEL #$(i)", PLOG_2(PLOG_S(m),PLOG_U32(i)), member_name, l));
+ }
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "missing READ_LABEL element(s) in MEMBER '$(m)'", PLOG_S(m), member_name));
+ }
+ KXMLNodesetRelease(LABELS);
+ }
+ free(member_name);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "'member_name' in MEMBER node #$(i)", PLOG_U32(i), i));
+ }
+ KXMLNodeRelease(MEMBER);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "MEMBER node #$(i)", PLOG_U32(i), i));
+ }
+ }
+ } else if( rc != 0 ) {
+ LOGERR(klogErr, rc, "POOL/MEMBER(s)");
+ }
+ KXMLNodesetRelease(MEMBERS);
+ } else {
+ LOGERR(klogErr, rc, "POOL/MEMBER(s)");
+ }
+ }
+#if _DEBUGGING
+ PoolMember_Dump(&obj->member_null->node, obj);
+ BSTreeForEach(obj->member_pool, false, PoolMember_Dump, obj);
+#endif
+ return rc;
+}
+
+typedef struct ExpectedTableMatch_struct {
+ /* in */
+ const char* seq;
+ uint32_t len;
+ const char* tag;
+ enum {
+ etm_Forward = 1,
+ etm_Reverse,
+ etm_Both
+ } direction;
+ bool left_adjusted;
+ /* out */
+ AgrepMatch match;
+ ReadSpecXML_read_BASECALL* bc;
+} ExpectedTableMatch;
+
+static
+bool Experiment_ExpectedTableMatch(const ReadSpecXML_read_BASECALL_TABLE* table, ExpectedTableMatch* data)
+{
+ uint32_t i;
+
+ assert(table && data && data->seq );
+
+ data->match.score = -1;
+ for(i = 0; i < table->count; i++) {
+ AgrepMatch match;
+ ReadSpecXML_read_BASECALL* bc = &table->table[i];
+
+ if( data->tag != NULL && strcmp(data->tag, bc->read_group_tag) != 0 ) {
+ continue;
+ }
+ if( data->direction != etm_Both ) {
+ if( bc->match_edge == match_edge_End ) {
+ if( data->direction == etm_Forward ) {
+ continue;
+ }
+ } else if( data->direction != etm_Forward ) {
+ continue;
+ }
+ }
+ match.score = -1;
+ if( data->left_adjusted ) {
+ if( AgrepFindFirst(bc->agrep, bc->max_mismatch, data->seq, data->len, &match) ) {
+ if( data->direction == etm_Reverse ) {
+ int32_t right_tail = data->len - match.position - strlen(bc->basecall);
+ if( right_tail > bc->max_mismatch - match.score ) {
+ match.score = -1;
+ } else if( match.position > 0 ) {
+ match.score += right_tail;
+ match.length += right_tail;
+ match.position = 0;
+ }
+ } else {
+ if( match.position > bc->max_mismatch - match.score ) {
+ match.score = -1;
+ } else if( match.position > 0 ) {
+ match.score += match.position;
+ match.length += match.position;
+ match.position = 0;
+ }
+ }
+ }
+ } else {
+ AgrepFindBest(bc->agrep, bc->max_mismatch, data->seq, data->len, &match);
+ }
+ if( !(match.score < 0) ) {
+ DEBUG_MSG(3, ("agrep match bc %s, min: %u, max: %u, edge: %s%s, [%d:%d] score %d\n", bc->basecall, bc->min_match, bc->max_mismatch,
+ bc->match_edge == match_edge_Full ? "Full" : (bc->match_edge == match_edge_Start ? "Start" : "End"),
+ data->left_adjusted ? " left adjusted" : "",
+ match.position, match.length, match.score));
+ if( (data->match.score < 0 || data->match.score > match.score) ) {
+ memmove(&data->match, &match, sizeof(data->match));
+ data->bc = bc;
+ }
+ }
+ }
+ return !(data->match.score < 0);
+}
+
+static
+rc_t Experiment_FillRead(const ReadSpecXML_read* spec, PoolReadSpec* pool,
+ const char** tag, const uint32_t nreads, int16_t start, const char* bases, uint32_t nbases)
+{
+ rc_t rc = 0;
+
+ switch(spec->coord_type) {
+ case rdsp_RelativeOrder_ct:
+ if( pool[-1].length >= 0 ) {
+ if( pool[-1].start >= 0 ) {
+ pool->start = pool[-1].start + pool[-1].length;
+ } else {
+ pool->start = start;
+ }
+ } else {
+ pool->start = -1;
+ }
+ pool->length = -1;
+ if( nreads > 1 ) {
+ if( (rc = Experiment_FillRead(spec + 1, pool + 1, tag + 1, nreads - 1, start, bases, nbases)) != 0 ) {
+ break;
+ }
+ }
+ if( pool->start < 0 ) {
+ pool->start = pool[1].start;
+ }
+ pool->length = pool[1].start - pool->start;
+ break;
+
+ case rdsp_BaseCoord_ct:
+ case rdsp_CycleCoord_ct:
+ pool->start = spec->coord.start_coord - 1;
+ pool->length = -1;
+ if( nreads > 1 ) {
+ if( (rc = Experiment_FillRead(spec + 1, pool + 1, tag + 1, nreads - 1, pool->start, bases, nbases)) != 0 ) {
+ break;
+ }
+ }
+ pool->length = pool[1].start - pool->start;
+ break;
+
+ case rdsp_ExpectedBaseCall_ct:
+ case rdsp_ExpectedBaseCallTable_ct:
+ {{
+ int32_t gap;
+ if( spec->coord.expected_basecalls.base_coord > 0 ) {
+ pool->start = spec->coord.expected_basecalls.base_coord - 1;
+ start = pool->start;
+ } else {
+ pool->start = -1;
+ }
+ pool->length = -1;
+ pool->item[0] = NULL;
+ pool->score = -1;
+ if( spec->coord.expected_basecalls.match_start > 0 ) {
+ uint32_t i, stop = nbases;
+ ExpectedTableMatch data;
+ /* find terminator, if any */
+ for(i = 1; i < nreads; i++) {
+ if( spec[i].coord_type == rdsp_BaseCoord_ct ||
+ spec[i].coord_type == rdsp_CycleCoord_ct ||
+ spec[i].coord_type == rdsp_FIXED_BRACKET_ct ) {
+ stop = spec[i].coord.start_coord - 1;
+ break;
+ }
+ }
+ data.seq = &bases[start];
+ data.len = stop - start;
+ data.tag = *tag;
+ data.direction = etm_Forward;
+ data.left_adjusted = !(pool->start < 0) || !(pool[-1].length < 0);
+ DEBUG_MSG(3, ("agrep find read %u fwd in: '%.*s' = %u\n", nreads, data.len, data.seq, data.len));
+ if( Experiment_ExpectedTableMatch(&spec->coord.expected_basecalls, &data) ) {
+ DEBUG_MSG(3, ("agrep found from %hd match %d:%d - %d '%s' in '%.*s...' \n",
+ start, data.match.position, data.match.length,
+ data.match.score, data.bc->basecall,
+ start + data.match.position + data.match.length * 3 + data.match.score, &bases[start]));
+ pool->start = start + data.match.position;
+ pool->length = data.match.length;
+ pool->item[0] = data.bc;
+ pool->score = data.match.score;
+ start = pool->start + pool->length;
+ } else {
+ DEBUG_MSG(3, ("agrep nothing found\n"));
+ }
+ }
+ if( pool[-1].length >= 0 && pool->length < 0 && spec->coord.expected_basecalls.match_end == 0 ) {
+ pool->length = spec->coord.expected_basecalls.default_length;
+ start += pool->length;
+ }
+ if( nreads > 1 ) {
+ if( (rc = Experiment_FillRead(spec + 1, pool + 1, tag + 1, nreads - 1, start, bases, nbases)) != 0 ) {
+ break;
+ }
+ }
+ if( spec->coord.expected_basecalls.match_end > 0 ) {
+ /* match_end can have a better match even if match_start found smth before
+ normally table has start or end match edge, not both */
+ char r[4096];
+ uint32_t i;
+ ExpectedTableMatch data;
+
+ data.len = pool[1].start - start;
+ DEBUG_MSG(3, ("agrep find read %u rev in: '%.*s' = %u\n", nreads, data.len, &bases[start], data.len));
+ if( data.len > sizeof(r) ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcBuffer, rcInsufficient);
+ break;
+ }
+ for(i = 0; i < data.len; i++) {
+ /* reverse a portion of seq */
+ r[i] = bases[pool[1].start - i - 1];
+ }
+ data.seq = r;
+ data.tag = *tag;
+ data.direction = etm_Reverse;
+ data.left_adjusted = spec[1].coord_type != rdsp_RelativeOrder_ct && pool[1].start > 0;
+ DEBUG_MSG(3, ("agrep find read %u rev in: '%.*s' = %u\n", nreads, data.len, data.seq, data.len));
+ if( Experiment_ExpectedTableMatch(&spec->coord.expected_basecalls, &data) ) {
+ DEBUG_MSG(3, ("agrep found rev from %hd match %d:%d - %d '%s' in '%.*s' \n",
+ start, data.match.position, data.match.length, data.match.score,
+ data.bc->basecall, data.len, &bases[pool[1].start - data.len]));
+ if( pool->length < 0 || data.match.score < pool->score ) {
+ pool->start = pool[1].start - data.match.position - data.match.length;
+ pool->length = data.match.length;
+ pool->item[0] = data.bc;
+ pool->score = data.match.score;
+ }
+ } else {
+ DEBUG_MSG(3, ("agrep nothing found rev\n"));
+ }
+ }
+ if( pool->length < 0 ) {
+ pool->length = spec->coord.expected_basecalls.default_length;
+ }
+ if( pool->start < 0 ) {
+ pool->start = pool[1].start - pool->length;
+ }
+ gap = pool[1].start - (pool->start + pool->length);
+ if( gap > 0 ) {
+ /* right gap */
+ if( spec[1].coord_type == rdsp_RelativeOrder_ct ) {
+ /* adjust right read's start to the tail of current read */
+ pool[1].start -= gap;
+ pool[1].length += gap;
+ gap = 0;
+ } else if( spec[1].coord_type >= rdsp_ExpectedBaseCall_ct &&
+ spec[1].coord.expected_basecalls.base_coord <= 0 && pool[1].item[0] != NULL ) {
+ /* move left read's start to left as much as possible */
+ int32_t left = pool[1].item[0]->max_mismatch - pool[1].score;
+ if( left > 0 ) {
+ if( left > gap ) {
+ left = gap;
+ }
+ pool[1].length += left;
+ pool[1].score += left;
+ pool[1].start -= left;
+ gap -= left;
+ }
+ }
+ if( gap > 0 && pool->item[0] != NULL ) {
+ /* add gap to end of self */
+ int32_t left = pool->item[0]->max_mismatch - pool->score;
+ if( left > 0 ) {
+ if( left > gap ) {
+ left = gap;
+ }
+ pool->length += left;
+ pool->score += left;
+ }
+ }
+ }
+ break;
+ }}
+ default:
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcItem, rcUnexpected);
+ break;
+ }
+ return rc;
+}
+
+typedef struct PoolMember_FindReverse_Data_struct {
+ const char* tags[MAX_SPOT_DESCRIPTOR_READS];
+ uint8_t nreads;
+ const PoolMember* member;
+} PoolMember_FindReverse_Data;
+
+static
+bool CC PoolMember_FindReverse(BSTNode* n, void* d)
+{
+ const PoolMember* node = (const PoolMember*)n;
+ PoolMember_FindReverse_Data* data = (PoolMember_FindReverse_Data*)d;
+ int r, j, found;
+
+ for(r = 1; r <= data->nreads; r++) {
+ /* comparing pointers here because tags contains same pointers */
+ if( node->spec[r].item[0] == NULL && data->tags[r] == NULL ) {
+ continue;
+ }
+ found = 0;
+ for(j = 0; node->spec[r].item[j] != NULL; j++ ) {
+ if( node->spec[r].item[j]->read_group_tag == data->tags[r] ) {
+ found = 1;
+ break;
+ }
+ }
+ if( found == 0 ) {
+ return false;
+ }
+ }
+ data->member = node;
+ return true;
+}
+
+static
+rc_t Experiment_FillSegAgrep(const ExperimentXML* self, PoolReadSpec* pool, const PoolMember* src,
+ uint32_t nbases, const char* bases,
+ const char** const new_member_name)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ PoolMember_FindReverse_Data data;
+
+ /* close left and right brackets tech reads as spot terminators */
+ pool[0].start = 0;
+ pool[0].length = 0;
+ pool[self->reads->nreads + 1].start = nbases;
+ pool[self->reads->nreads + 1].length = 0;
+
+ /* setup known tags if it is predefined member search */
+ for(i = 0; i <= self->reads->nreads + 1; i++) {
+ data.tags[i] = src->spec[i].item[0] ? src->spec[i].item[0]->read_group_tag : NULL;
+ }
+ /* start from read, not bracket read */
+ rc = Experiment_FillRead(self->reads->reads, &pool[1], &data.tags[1], self->reads->nreads, 0, bases, nbases);
+
+ if( rc != 0 ) {
+ DEBUG_MSG(3, ("ERROR: %R\n", rc));
+ }
+ DEBUG_MSG(3, ("%s: bases %u: '%.*s'\n", new_member_name ? *new_member_name : NULL, nbases, nbases, bases));
+ for(i = 1; i <= self->reads->nreads; i++) {
+ const char* b = NULL;
+ if( pool[i].start >= 0 ) {
+ b = &bases[pool[i].start];
+ }
+ DEBUG_MSG(3, ("Read %u. [%hd:%hd] - '%.*s'",
+ i, pool[i].start, pool[i].length, pool[i].length < 0 ? 0 : pool[i].length, b));
+ if( self->reads->spec[i].coord_type == rdsp_FIXED_BRACKET_ct ) {
+ DEBUG_MSG(3, (" terminator???"));
+ }
+ if( self->reads->spec[i].coord_type >= rdsp_ExpectedBaseCall_ct ) {
+ if( pool[i].item[0] ) {
+ if( pool[i].item[0]->match_edge == match_edge_End ) {
+ DEBUG_MSG(3, (" in reverse"));
+ }
+ DEBUG_MSG(3, (" matches %s", pool[i].item[0]->basecall));
+ if( pool[i].item[0]->read_group_tag ) {
+ DEBUG_MSG(3, (" tagged %s", pool[i].item[0]->read_group_tag));
+ }
+ DEBUG_MSG(3, (" with %d mismatches", pool[i].score));
+ } else {
+ DEBUG_MSG(3, (" no match"));
+ }
+ }
+ DEBUG_MSG(3, ("\n"));
+ }
+
+ if( rc == 0 && new_member_name != NULL ) {
+ data.nreads = self->reads->nreads;
+ data.member = NULL;
+ for(i = 1; i <= self->reads->nreads; i++) {
+ if( self->reads->spec[i].coord_type == rdsp_ExpectedBaseCallTable_ct && pool[i].item[0] != NULL ) {
+ data.tags[i] = pool[i].item[0]->read_group_tag;
+ } else {
+ data.tags[i] = NULL;
+ }
+ }
+ if( BSTreeDoUntil(self->member_pool, false, PoolMember_FindReverse, &data) ) {
+ *new_member_name = data.member->name;
+ DEBUG_MSG(2, ("Assigned member_name '%s'\n", *new_member_name));
+ } else {
+#if _DEBUGGING
+ DEBUG_MSG(2, ("member_name reverse lookup failed for tags:"));
+ for(i = 1; i <= self->reads->nreads; i++) {
+ DEBUG_MSG(2, (" '%s'", data.tags[i]));
+ }
+ DEBUG_MSG(2, ("\n"));
+#endif
+ }
+ }
+ return rc;
+}
+
+rc_t Experiment_MemberSeg(const ExperimentXML* self,
+ const char* const file_member_name, const char* const data_block_member_name,
+ uint32_t nbases, const char* bases,
+ SRASegment* seg, const char** const new_member_name)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ PoolReadSpec pool[MAX_SPOT_DESCRIPTOR_READS];
+
+ if( self == NULL || bases == NULL || seg == NULL || new_member_name == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcParam, rcNull);
+ } else if( nbases < 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcEmpty);
+ }
+
+ if( rc == 0 ) {
+ const char* mm = NULL;
+ switch(self->processing.barcode_rule) {
+ case eBarcodeRule_not_set:
+ mm = data_block_member_name ? data_block_member_name : file_member_name;
+ break;
+
+ case eBarcodeRule_use_file_spot_name:
+ mm = file_member_name;
+ break;
+
+ case eBarcodeRule_use_table_in_experiment:
+ case eBarcodeRule_ignore_barcode:
+ mm = NULL;
+ break;
+ }
+ if( self->member_pool == NULL || self->processing.barcode_rule == eBarcodeRule_ignore_barcode ) {
+ if( (rc = Experiment_FillSegAgrep(self, pool, self->member_null, nbases, bases, NULL)) == 0 ) {
+ *new_member_name = mm;
+ }
+ } else if( mm == NULL ) {
+ *new_member_name = NULL;
+ rc = Experiment_FillSegAgrep(self, pool, self->member_null, nbases, bases, new_member_name);
+ } else {
+ PoolMember* pm = (PoolMember*)BSTreeFind(self->member_pool, mm, PoolMember_FindByName);
+ if( pm == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc, "specified member_name '$(m)'", PLOG_S(m), mm));
+ } else {
+ if( (rc = Experiment_FillSegAgrep(self, pool, pm, nbases, bases, NULL)) == 0 ) {
+ *new_member_name = mm;
+ }
+ }
+ }
+ }
+
+ if( rc == 0 ) {
+ int32_t new_bases = 0;
+
+ for(i = 1; i <= self->reads->nreads; i++) {
+ if( pool[i].start < 0 || pool[i].length < 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcIncomplete);
+ PLOGERR(klogErr, (klogErr, rc, "Read #$(i) boundaries", PLOG_U32(i), i));
+ } else if( i == 1 ) {
+ if( pool[i].start != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "Read #$(i) do not start at 0", PLOG_U32(i), i));
+ }
+ } else {
+ int16_t delta = pool[i].start - pool[i - 1].length - pool[i - 1].start;
+ /* try to close gap by failng back to default length IF:
+ prev read was EXPECTED_BASECALL OR
+ EXPECTED_BASECALL_TABLE and there an BASECALL chosen
+ AND
+ defailt_length != 0 (was set)
+ */
+ if( delta != 0 &&
+ (self->reads->spec[i - 1].coord_type == rdsp_ExpectedBaseCall_ct ||
+ (self->reads->spec[i - 1].coord_type == rdsp_ExpectedBaseCallTable_ct && pool[i - 1].item[0] != NULL)) &&
+ self->reads->spec[i - 1].coord.expected_basecalls.default_length > 0 ) {
+ new_bases -= pool[i - 1].length;
+ pool[i - 1].length = self->reads->spec[i - 1].coord.expected_basecalls.default_length;
+ DEBUG_MSG(2, ("trying to close delta %hi for read %u: length reset default %hi\n", delta, i - 1, pool[i - 1].length));
+ if( pool[i - 1].item[0] != NULL && pool[i - 1].item[0]->read_group_tag != NULL ) {
+ DEBUG_MSG(2, ("member_name '%s' reset to ''\n", *new_member_name));
+ *new_member_name = NULL;
+ }
+ delta = pool[i].start - pool[i - 1].length - pool[i - 1].start;
+ new_bases += pool[i - 1].length;
+ seg[i - 2].len = pool[i - 1].length;
+ }
+ if( delta > 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "Gap between reads #$(p) and #$(i)", PLOG_2(PLOG_U32(p),PLOG_U32(i)), i - 1, i));
+ } else if( delta < 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "Reads #$(p) and #$(i) overlap", PLOG_2(PLOG_U32(p),PLOG_U32(i)), i - 1, i));
+ }
+ }
+ seg[i - 1].start = pool[i].start;
+ seg[i - 1].len = pool[i].length;
+ new_bases += pool[i].length;
+ }
+ if( rc == 0 && (new_bases < 0 || nbases != new_bases) ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc, "total read length $(c)", PLOG_U32(c), new_bases));
+ }
+ if( rc != 0 ) {
+ char err_buf[8192], *p = err_buf;
+ size_t max = sizeof(err_buf);
+
+ for(i = 1; i <= self->reads->nreads; i++) {
+ int x = snprintf(p, max, "[%hd:%d, len = %hd", pool[i].start, pool[i].start + pool[i].length, pool[i].length);
+ if( x > 0 && x < max ) {
+ max -= x;
+ p += x;
+ if( self->reads->spec[i].coord_type == rdsp_ExpectedBaseCallTable_ct ) {
+ if( pool[i].item[0] != NULL ) {
+ if( pool[i].item[0]->read_group_tag != NULL ) {
+ x = snprintf(p, max, ", matched tag '%s', mismatches %d]", pool[i].item[0]->read_group_tag, pool[i].score);
+ } else {
+ x = snprintf(p, max, ", mismatches %d]", pool[i].score);
+ }
+ } else {
+ x = snprintf(p, max, ", no match]");
+ }
+ } else {
+ x = snprintf(p, max, "]");
+ }
+ }
+ if( x <= 0 || x >= max ) {
+ max = strlen(err_buf);
+ err_buf[max - 4] = '\0';
+ strcat(err_buf, "... ");
+ break;
+ }
+ max -= x;
+ p += x;
+ }
+ PLOGMSG(klogErr, (klogErr, "segments: $(seg) spot length actual: $(actual), calculated $(calc)",
+ "seg=%s,actual=%u,calc=%d", err_buf, nbases, new_bases));
+ }
+ }
+ return rc;
+}
+
+rc_t Experiment_MemberSegSimple(const ExperimentXML* self,
+ const char* const file_member_name, const char* const data_block_member_name,
+ const char** const new_member_name)
+{
+ rc_t rc = 0;
+ if( self == NULL || new_member_name == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcParam, rcNull);
+ } else {
+ switch(self->processing.barcode_rule) {
+ case eBarcodeRule_not_set:
+ *new_member_name = data_block_member_name ? data_block_member_name : file_member_name;
+ break;
+
+ case eBarcodeRule_use_file_spot_name:
+ *new_member_name = file_member_name;
+ break;
+
+ case eBarcodeRule_use_table_in_experiment:
+ case eBarcodeRule_ignore_barcode:
+ *new_member_name = NULL;
+ break;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t Experiment_Apply_RUN_ATTRIBUTES(const ExperimentXML* cself, RunAttributes* attr, uint32_t spot_length)
+{
+ rc_t rc = 0;
+
+ if( cself == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcEvaluating, rcSelf, rcNull);
+ } else if( attr != NULL ) {
+ ExperimentXML* obj = (ExperimentXML*)cself;
+
+ obj->processing.barcode_rule = attr->barcode_rule;
+ if( attr->quality_offset != '\0' ) {
+ obj->processing.quality_offset = attr->quality_offset;
+ }
+ if( attr->quality_type != eExperimentQualityType_Undefined ) {
+ obj->processing.quality_type = attr->quality_type;
+ }
+ obj->spot_length = attr->spot_length ? attr->spot_length : spot_length;
+ if( obj->spot_length == 0 &&
+ (obj->platform->id == SRA_PLATFORM_ILLUMINA || obj->platform->id == SRA_PLATFORM_ABSOLID) ) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "SPOT_LENGTH is not found or specified as $(l)", PLOG_U32(l), obj->spot_length));
+ }
+ }
+ return rc;
+}
+
+rc_t Experiment_Make(const ExperimentXML** self, const KXMLDoc* doc, RunAttributes* attr)
+{
+ rc_t rc = 0;
+ ExperimentXML* obj = NULL;
+ const KXMLNodeset* ns = NULL;
+ uint32_t p_spot_length = 0, r_spot_length = 0;
+
+ if( self == NULL || doc == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ obj = calloc(1, sizeof(*obj));
+ if( obj == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ if( (rc = KXMLDocOpenNodesetRead(doc, &ns, "/EXPERIMENT_SET/EXPERIMENT | /EXPERIMENT")) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KXMLNodesetCount(ns, &count)) == 0 && count != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcTag, count ? rcExcessive : rcNotFound);
+ LOGERR(klogErr, rc, "EXPERIMENT");
+ } else {
+ const KXMLNode* EXPERIMENT = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(ns, &EXPERIMENT, 0)) == 0 ) {
+ if( (rc = PlatformXML_Make(&obj->platform, EXPERIMENT, &p_spot_length)) == 0 ) {
+ if( attr->platform != NULL ) {
+ if( obj->platform->id != attr->platform->id ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "EXPERIMENT and RUN platforms differ");
+ } else {
+ PlatformXML_Whack(obj->platform);
+ obj->platform = attr->platform;
+ /* take ownership */
+ attr->platform = NULL;
+ }
+ }
+ if( rc == 0 ) {
+ if( attr->reads == NULL ) {
+ if( (rc = ReadSpecXML_Make(&obj->reads, EXPERIMENT, "DESIGN/SPOT_DESCRIPTOR", &r_spot_length)) != 0 ) {
+ LOGERR(klogErr, rc, "EXPERIMENT/.../READ_SPEC");
+ }
+ } else {
+ obj->reads = attr->reads;
+ /* take ownership */
+ attr->reads = NULL;
+ }
+ if( rc == 0 && (rc = parse_POOL(EXPERIMENT, obj)) == 0 ) {
+ rc = Experiment_Apply_RUN_ATTRIBUTES(obj, attr, r_spot_length ? r_spot_length : p_spot_length);
+ }
+ if( rc == 0 && p_spot_length != 0 && r_spot_length != 0 && p_spot_length != r_spot_length ) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "in EXPERIMENT sequence length (cycle count) in PLATFORM $(p) differ"
+ " from SPOT_LENGTH $(l) in SPOT_DECODE_SPEC",
+ PLOG_2(PLOG_U32(p),PLOG_U32(l)), p_spot_length, r_spot_length));
+ }
+ }
+ } else {
+ LOGERR(klogErr, rc, "EXPERIMENT/PLATFORM");
+ }
+ KXMLNodeRelease(EXPERIMENT);
+ }
+ }
+ KXMLNodesetRelease(ns);
+ }
+ if( rc != 0 ) {
+ *self = NULL;
+ Experiment_Whack(obj);
+ } else {
+ *self = obj;
+ }
+ return rc;
+}
+
+rc_t Experiment_GetPlatform(const ExperimentXML* cself, const PlatformXML** platform)
+{
+ rc_t rc = 0;
+ if( cself == NULL || platform == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *platform = cself->platform;
+ }
+ return rc;
+}
+
+rc_t Experiment_GetProcessing(const ExperimentXML* cself, const ProcessingXML** processing)
+{
+ rc_t rc = 0;
+ if( cself == NULL || processing == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *processing = &cself->processing;
+ }
+ return rc;
+}
+
+rc_t Experiment_GetReadNumber(const ExperimentXML* cself, uint8_t* nreads)
+{
+ rc_t rc = 0;
+ if( cself == NULL || nreads == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *nreads = cself->reads->nreads;
+ }
+ return rc;
+}
+
+rc_t Experiment_GetSpotLength(const ExperimentXML* cself, uint32_t* spot_length)
+{
+ rc_t rc = 0;
+ if( cself == NULL || spot_length == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *spot_length= cself->spot_length;
+ }
+ return rc;
+}
+
+rc_t Experiment_GetRead(const ExperimentXML* cself, uint8_t read_id, const ReadSpecXML_read** read_spec)
+{
+ rc_t rc = 0;
+ if( cself == NULL || read_spec == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else if( read_id >= cself->reads->nreads ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcId, rcOutofrange);
+ } else {
+ *read_spec = &(cself->reads->reads[read_id]);
+ }
+ return rc;
+}
+
+typedef struct PoolMember_FindByTag_Data_struct {
+ /* in */
+ const char* tag;
+ uint8_t readid;
+ /* out */
+ const char* member_name;
+} PoolMember_FindByTag_Data;
+
+static
+bool CC PoolMember_FindByTag(BSTNode *node, void *data)
+{
+ PoolMember_FindByTag_Data* d = (PoolMember_FindByTag_Data*)data;
+ const PoolMember* n = (const PoolMember*)node;
+ int i = 0;
+
+ const ReadSpecXML_read_BASECALL* bc = n->spec[d->readid].item[i];
+ while( bc != NULL ) {
+ if( strcmp(bc->read_group_tag, d->tag) == 0 ) {
+ d->member_name = n->name;
+ return true;
+ }
+ bc = n->spec[d->readid].item[++i];
+ }
+ return false;
+}
+
+rc_t Experiment_FindReadInTable(const ExperimentXML* cself, uint8_t read_id, const char* key, const char** basecall, const char** member_name)
+{
+ rc_t rc = 0;
+ if( cself == NULL || key == NULL || (basecall == NULL && member_name == NULL) ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else if( read_id >= cself->reads->nreads ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcId, rcOutofrange);
+ } else {
+ const ReadSpecXML_read* read_spec = &(cself->reads->reads[read_id++]);
+ if( read_spec->coord_type != rdsp_ExpectedBaseCallTable_ct ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcName, rcNotFound);
+ } else {
+ ExpectedTableMatch match;
+
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcName, rcNotFound);
+ /* try to find key as basecall */
+ match.seq = key;
+ match.len = strlen(key);
+ match.tag = NULL;
+ match.direction = etm_Both;
+ match.left_adjusted = true;
+ if( Experiment_ExpectedTableMatch(&read_spec->coord.expected_basecalls, &match) ) {
+ rc = 0;
+ if( basecall != NULL ) {
+ *basecall = match.bc->basecall;
+ }
+ if( member_name != NULL ) {
+ if( cself->member_pool != NULL ) {
+ PoolMember_FindByTag_Data data;
+ data.readid = read_id;
+ data.tag = match.bc->read_group_tag;
+ if( BSTreeDoUntil(cself->member_pool, false, PoolMember_FindByTag, &data) ) {
+ *member_name = data.member_name;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcSelf, rcCorrupt);
+ }
+ } else {
+ *member_name = NULL;
+ }
+ }
+ } else if( cself->member_pool != NULL ) {
+ /* try to find key as member_name */
+ PoolMember* pm = (PoolMember*)BSTreeFind(cself->member_pool, key, PoolMember_FindByName);
+ if( pm != NULL ) {
+ rc = 0;
+ if( member_name != NULL ) {
+ *member_name = pm->name;
+ }
+ if( basecall != NULL ) {
+ if( pm->spec[read_id].item[0] != NULL ) {
+ *basecall = pm->spec[read_id].item[0]->basecall;
+ if( pm->spec[read_id].item[1] != NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcData, rcAmbiguous);
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcData, rcViolated);
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t Experiment_HasPool(const ExperimentXML* cself, bool* has_pool)
+{
+ rc_t rc = 0;
+ if( cself == NULL || has_pool == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *has_pool = cself->member_pool != NULL;
+ }
+ return rc;
+}
+
+rc_t Experiment_ReadSegDefault(const ExperimentXML* self, SRASegment* seg)
+{
+ rc_t rc = 0;
+
+ /* TBD to do memberseg call based on junk seq of known length */
+ if( self == NULL || seg == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcResolving, rcParam, rcNull);
+ } else if( self->spot_length == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ } else {
+ uint32_t i;
+ int32_t spot_len = self->spot_length;
+
+ i = self->reads->nreads;
+ do {
+ int16_t len = 0;
+ --i;
+ switch(self->reads->reads[i].coord_type) {
+ case rdsp_RelativeOrder_ct:
+ if( i == 0 ) {
+ len = spot_len;
+ } else {
+ len = 0;
+ }
+ break;
+ case rdsp_BaseCoord_ct:
+ case rdsp_CycleCoord_ct:
+ len = spot_len - (self->reads->reads[i].coord.start_coord - 1);
+ break;
+ case rdsp_ExpectedBaseCall_ct:
+ case rdsp_ExpectedBaseCallTable_ct:
+ if( self->reads->reads[i].coord.expected_basecalls.base_coord > 0 ) {
+ len = spot_len - (self->reads->reads[i].coord.expected_basecalls.base_coord - 1);
+ }
+ len += self->reads->reads[i].coord.expected_basecalls.default_length;
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnexpected);
+ LOGERR(klogErr, rc, "read type in default");
+ break;
+ }
+ spot_len -= len;
+ if( spot_len < 0 || len < 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "cumulative read lengths and SEQUENCE_LENGTH");
+ return rc;
+ } else {
+ seg[i].start = spot_len;
+ seg[i].len = len;
+ }
+ } while( i > 0 );
+ }
+ return rc;
+}
+
+void Experiment_Whack(const ExperimentXML* cself)
+{
+ if( cself != NULL ) {
+ ExperimentXML* self = (ExperimentXML*)cself;
+
+ free(self->processing.quality_scorer);
+ ReadSpecXML_Whack(self->reads);
+ BSTreeWhack(self->member_pool, PoolMember_Whack, NULL);
+ free(self->member_pool);
+ PoolMember_Whack(&self->member_null->node, NULL);
+ PlatformXML_Whack(self->platform);
+ free(self);
+ }
+}
diff --git a/tools/sra-load/experiment-xml.h b/tools/sra-load/experiment-xml.h
new file mode 100644
index 0000000..8ab869d
--- /dev/null
+++ b/tools/sra-load/experiment-xml.h
@@ -0,0 +1,77 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_experiment_xml_
+#define _sra_load_experiment_xml_
+
+#include "common-xml.h"
+
+typedef struct ProcessingXML_struct {
+ char* quality_scorer;
+ ExperimentQualityType quality_type;
+ uint8_t quality_offset;
+ ExperimentBarcodeRule barcode_rule;
+
+} ProcessingXML;
+
+typedef struct ExperimentXML ExperimentXML;
+
+/* Make spot descriptor information structure based on XML file
+ */
+rc_t Experiment_Make(const ExperimentXML** self, const KXMLDoc* doc, RunAttributes* attr);
+
+rc_t Experiment_GetPlatform(const ExperimentXML* cself, const PlatformXML** platform);
+
+rc_t Experiment_GetProcessing(const ExperimentXML* cself, const ProcessingXML** processing);
+
+rc_t Experiment_GetReadNumber(const ExperimentXML* cself, uint8_t* nreads);
+
+rc_t Experiment_GetSpotLength(const ExperimentXML* cself, uint32_t* spot_length);
+
+/* ZERO-based read_id here! */
+rc_t Experiment_GetRead(const ExperimentXML* cself, uint8_t read_id, const ReadSpecXML_read** read_spec);
+
+/* find in read (EXPECTED_BASECALL_TABLE type ONLY) basecall and/or member_name by bases or mamber_name
+ * on of basecall or member_name must be not NULL
+ */
+rc_t Experiment_FindReadInTable(const ExperimentXML* cself, uint8_t read_id, const char* key, const char** basecall, const char** member_name);
+
+rc_t Experiment_HasPool(const ExperimentXML* cself, bool* has_pool);
+
+rc_t Experiment_ReadSegDefault(const ExperimentXML* self, SRASegment* seg);
+
+rc_t Experiment_MemberSeg(const ExperimentXML* self,
+ const char* const file_member_name, const char* const data_block_member_name,
+ uint32_t nbases, const char* bases,
+ SRASegment* seg, const char** const new_member_name);
+
+rc_t Experiment_MemberSegSimple(const ExperimentXML* self,
+ const char* const file_member_name, const char* const data_block_member_name,
+ const char** const new_member_name);
+
+
+void Experiment_Whack(const ExperimentXML* cself);
+
+#endif /* _sra_load_experiment_xml_ */
diff --git a/tools/sra-load/fastq-fmt.c b/tools/sra-load/fastq-fmt.c
new file mode 100644
index 0000000..fef25cd
--- /dev/null
+++ b/tools/sra-load/fastq-fmt.c
@@ -0,0 +1,701 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+
+typedef struct FastqLoaderFmt FastqLoaderFmt;
+#define SRALOADERFMT_IMPL FastqLoaderFmt
+#include "loader-fmt.h"
+
+#include "writer-illumina.h"
+#include "writer-454.h"
+#include "writer-ion-torrent.h"
+#include "experiment-xml.h"
+#include "debug.h"
+
+typedef struct FileReadData_struct {
+ bool ready; /* if data is filled from file */
+ pstring name;
+ pstring barcode;
+ IlluminaRead read;
+} FileReadData;
+
+typedef struct FastqFileInfo_struct {
+ const SRALoaderFile* file;
+ /* parsed data from file for single spot */
+ FileReadData spot[2]; /* 2nd element is used for 8 line format file only */
+
+ int qualType;
+ ExperimentQualityEncoding qualEnc;
+ uint8_t qualOffset;
+ int8_t qualMin;
+ int8_t qualMax;
+
+ /* file line buffer */
+ const char* line; /* not NULL if contains unprocessed data */
+ size_t line_len;
+} FastqFileInfo;
+
+struct FastqLoaderFmt {
+ SRALoaderFmt dad;
+ const SRAWriterIllumina* wIllumina;
+ const SRAWriter454* w454;
+ const SRAWriterIonTorrent* wIonTorrent;
+
+ const ProcessingXML* processing;
+ int64_t spots_bad_allowed;
+ int64_t spots_bad_count;
+};
+
+static
+void FileReadData_init(FileReadData* read, bool name_only)
+{
+ pstring_clear(&read->name);
+ pstring_clear(&read->barcode);
+ IlluminaRead_Init(&read->read, name_only);
+ if( !name_only ) {
+ read->ready = false;
+ }
+}
+
+/* reads 1 line from given file
+ * if file->line pointer is not NULL line is in buffer already, nothing is read
+ * failes on error or if line empty and not optional
+ */
+static
+rc_t file_read_line(FastqFileInfo* file, bool optional)
+{
+ rc_t rc = 0;
+static unsigned long lineNo=0;
+
+ if( file->line == NULL ) {
+ if( (rc = SRALoaderFileReadline(file->file, (const void**)&file->line, &file->line_len)) == 0 ) {
+ if( file->line == NULL || file->line_len == 0 ) {
+ if( !optional ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcString, rcInsufficient);
+ }
+ }
+ if( rc == 0 && file->line != NULL ) {
+ if( file->line_len > 0 ) {
+ const char* e = file->line + file->line_len;
+ /* right trim */
+ while( --e >= file->line ) {
+ if( *e!=0 && !isspace(*e) ) {
+ break;
+ }
+ file->line_len--;
+ }
+ }
+ }
+ }
+ ++lineNo;
+ }
+ return rc;
+}
+
+/*
+ * compare seq to quality length ignoring traling spaces, no leading spaces expected
+ */
+static
+bool match_seq_to_qual(const char* seq, size_t seq_len, const char* qual, size_t qual_len)
+{
+ char *space = NULL;
+
+ /* cut trailing spaces */
+ while( seq_len > 0 && seq[seq_len - 1] == ' ') {
+ seq_len--;
+ }
+ while( qual_len > 0 && qual[qual_len - 1] == ' ') {
+ qual_len--;
+ }
+ space = memchr(qual, ' ', qual_len);
+ if( space != NULL ) {
+ /* spaced numbers form: count numbers */
+ int spaceCount = 1;
+ do {
+ if( (space = memchr(space, ' ', qual_len - (space - qual))) != NULL ) {
+ spaceCount++;
+ space++;
+ }
+ } while( space != NULL );
+ qual_len = spaceCount;
+ }
+ return seq_len == qual_len;
+}
+
+/* parses name as a given word number (1-based) in a str of size len
+ * looks for name(#barcode)?([\/.]\d)?
+ * returns score of found parts
+ * score == 0 word not found
+ */
+static
+uint8_t parse_spot_name(const SRALoaderFile* file, FileReadData* spot, const char* str, size_t len, uint8_t word_number)
+{
+ uint8_t w, score = 0;
+ const char* name, *name_end;
+
+ name = name_end = str;
+ /* set name_end to end of word_number-th word */
+ for(w = 1; w <= word_number || name_end == NULL; w++ ) {
+ /* skip consecutive spaces */
+ while( *name_end == ' ' && name_end != &str[len] ) {
+ name_end++;
+ }
+ name = name_end;
+ name_end = memchr(name, ' ', len - (name_end - str));
+ if( name_end == NULL ) {
+ if( w == word_number ) {
+ name_end = &str[len];
+ }
+ break;
+ }
+ }
+ if( name != name_end && name_end != NULL ) {
+ char* x;
+ rc_t rc;
+
+ /* init only name portion */
+ FileReadData_init(spot, true);
+ --name_end; /* goto last char */
+ if( isdigit(name_end[0])&& (name_end[-1] == '\\' || name_end[-1] == '/' )) {
+ score++;
+ spot->read.read_id = name_end[0] - '0';
+ name_end -= 2;
+ } else if( isdigit(*name_end) && name_end[-1] == '.' ) {
+ int q = 0;
+ if( memrchr(name, '#', name_end - name) != NULL ) {
+ /* have barode -> this is read id */
+ q = 4;
+ } else {
+ /* may a read id, check to see if 4 coords follow */
+ const char* end = name_end - 1;
+ while( --end >= name ) {
+ if( strchr(":|_", *end) != NULL ) {
+ q++;
+ } else if( !isdigit(*end) ) {
+ break;
+ }
+ }
+ }
+ if( q == 4 ) {
+ score++;
+ spot->read.read_id = name_end[0] - '0';
+ name_end -= 2;
+ }
+ }
+ if( (x = memrchr(name, '#', name_end - name)) != NULL ) {
+ score++;
+ if( (rc = pstring_assign(&spot->barcode, x + 1, name_end - x)) != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "barcode $(b)", "b=%.*s", name_end - x, x + 1);
+ return 0;
+ }
+ if( pstring_strcmp(&spot->barcode, "0") == 0 ) {
+ pstring_clear(&spot->barcode);
+ } else if( spot->barcode.len >= 4 &&
+ (strncmp(spot->barcode.data, "0/1_", 4) == 0 || strncmp(spot->barcode.data, "0/2_", 4) == 0) ) {
+ spot->read.read_id = spot->barcode.data[2] - '0';
+ pstring_assign(&spot->barcode, &spot->barcode.data[4], spot->barcode.len - 4);
+ }
+ name_end = --x;
+ }
+ score++;
+ if( (rc = pstring_assign(&spot->name, name, name_end - name + 1)) != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "spot name $(n)", "n=%.*s", name_end - name + 1, name);
+ return 0;
+ }
+ /* search for _R\d\D in name and use it as read id, remove from name or spot won't assemble */
+ x = spot->name.data;
+ while( (x = strrchr(x, 'R')) != NULL ) {
+ if( x != spot->name.data && *(x - 1) == '_' && isdigit(*(x + 1)) && !isalnum(*(x + 2)) ) {
+ score++;
+ if(spot->read.read_id == -1){
+ spot->read.read_id = *(x + 1) - '0';
+ }
+ strcpy(x - 1, x + 2);
+ spot->name.len -= 4;
+ break;
+ }
+ x++;
+ }
+ /* find last '=' and use only whatever is to the left of it */
+ if( (x = memrchr(spot->name.data, '=', spot->name.len)) != NULL ) {
+ rc = pstring_assign(&spot->name, spot->name.data, (x - spot->name.data) );
+ }
+ }
+ return score;
+}
+
+/*
+ * in a single line form tries to grab last to chunks defined by sep into seq and qual
+ * ignores spaces adjucent to sep
+ * normally line would look like "name sep seq sep sep qual"
+ */
+static
+bool find_seq_qual_by_sep(FastqLoaderFmt* self, FastqFileInfo* file, const char sep)
+{
+ const char* seq = NULL, *qual = NULL;
+ size_t seq_len = 0, qual_len = 0;
+
+ FileReadData_init(file->spot, false);
+ qual = memrchr(file->line, sep, file->line_len);
+ if( qual != NULL ) {
+ seq = memrchr(file->line, sep, qual - file->line);
+ if( seq != NULL ) {
+ if( parse_spot_name(file->file, file->spot, file->line, seq - file->line, 1) != 0 ) {
+ /* skip leading spaces */
+ do {
+ seq = seq + 1;
+ } while( *seq == ' ' && seq < (file->line + file->line_len) );
+ seq_len = qual - seq;
+ do {
+ qual = qual + 1;
+ } while( *qual == ' ' && qual < (file->line + file->line_len) );
+ qual_len = file->line_len - (qual - file->line);
+ if( *seq != sep && *seq != ' ' && seq_len != 0 &&
+ *qual != sep && *qual != ' ' && qual_len != 0 ) {
+ if( match_seq_to_qual(seq, seq_len, qual, qual_len) ) {
+ rc_t rc;
+ if( (rc = pstring_assign(&file->spot->read.seq, seq, seq_len)) == 0 ) {
+ if( pstring_is_fasta(&file->spot->read.seq) ) {
+ if( (rc = pstring_assign(&file->spot->read.qual, qual, qual_len)) == 0 ) {
+ file->spot->read.qual_type = file->qualType;
+ return true;
+ }
+ }
+ file->spot->read.seq.len = 0;
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=storing read data");
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+}
+
+/*
+ * read fasta or quality, which maybe wrapped on 70th column width,
+ * into asciiZ buffer
+ */
+static
+rc_t read_multiline_seq_or_qual(FastqFileInfo* file, const char stop, pstring* str)
+{
+ rc_t rc = 0;
+ bool append = false, optional = false;
+
+ while( rc == 0 ) {
+ if( (rc = file_read_line(file, optional)) == 0 ) {
+ if( optional && (file->line == NULL || (file->line_len > 0 && file->line[0] == stop)) ) {
+ /* eof or next line is defline -> stop, line stays in buffer */
+ break;
+ }
+ if( append && memchr(str->data, ' ', str->len) != NULL ) {
+ rc = pstring_append(str, " ", 1);
+ }
+ if( rc == 0 && (rc = pstring_append(str, file->line, file->line_len)) == 0 ) {
+ file->line = NULL; /* line processed */
+ optional = true;
+ }
+ append = true;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t read_spot_data_3lines(FastqFileInfo* file, FileReadData* sd, uint8_t best_word, uint8_t best_score, int qualType)
+{
+ rc_t rc = 0;
+
+ file->line = NULL; /* discard defline */
+ /* read sequence */
+ if( (rc = read_multiline_seq_or_qual(file, '+', &sd->read.seq)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading sequence data");
+ }
+ if( !pstring_is_fasta(&sd->read.seq) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=expected sequence data");
+ }
+ /* next defline */
+ if( (rc = file_read_line(file, false)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading quality defline");
+ }
+ if( file->line[0] != '+' ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=expected '+' on quality defline");
+ }
+ if( file->line_len != 1 ) { /* there may be just '+' on quality defline */
+ FileReadData d;
+ uint8_t score = parse_spot_name(file->file, &d, &file->line[1], file->line_len - 1, best_word);
+ /* sometimes quality defline may NOT contain barcode and readid, so score will be lower than bestscore,
+ but must be at least == 1 with none empty line, which means that name was found */
+ if( score < 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=spot name not found");
+ }
+ if( pstring_cmp(&sd->name, &d.name) != 0 ||
+ (score == best_score && (pstring_cmp(&sd->barcode, &d.barcode) != 0 || sd->read.read_id != d.read.read_id)) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=quality defline do not match sequence defline");
+ }
+ }
+ file->line = NULL; /* discard defline */
+ if( (rc = read_multiline_seq_or_qual(file, '@', &sd->read.qual)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=failed to read quality");
+ }
+ if( sd->read.qual.len <= 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcEmpty);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=quality");
+ }
+ sd->read.qual_type = qualType;
+ sd->ready = true;
+ return 0;
+}
+
+/* reads from a file data for a sinlge spot, data may be partial */
+static
+rc_t read_next_spot(FastqLoaderFmt* self, FastqFileInfo* file)
+{
+ rc_t rc = 0;
+
+ if( file->spot->ready ) {
+ /* data still not used */
+ return 0;
+ }
+ FileReadData_init(file->spot, false);
+ FileReadData_init(&file->spot[1], false);
+ if( (rc = file_read_line(file, true)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading more data");
+ } else if( file->line == NULL ) {
+ return 0; /* eof */
+ }
+ if( find_seq_qual_by_sep(self, file, ':') || find_seq_qual_by_sep(self, file, ' ') ) {
+ /* single line forms */
+ file->line = NULL; /* line consumed */
+ file->spot->ready = true;
+ } else if( file->line[0] == '>' || file->line[0] == '@' ) {
+ /* 4 or 8 line format */
+ FileReadData sd;
+ uint8_t word = 0, best_word = 0;
+ uint8_t score = 0, best_score = 0;
+ /* find and parse spot name on defline */
+ do {
+ score = parse_spot_name(file->file, &sd, &file->line[1], file->line_len - 1, ++word);
+ if( score > best_score ) {
+ if( (rc = pstring_copy(&file->spot->name, &sd.name)) != 0 ||
+ (rc = pstring_copy(&file->spot->barcode, &sd.barcode)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=copying read name");
+ }
+ file->spot->read.read_id = sd.read.read_id;
+ best_score = score;
+ best_word = word; /* used below for quality defline parsing */
+ }
+
+ } while(score != 0);
+ if( best_score == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcId, rcNotFound);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=spot name not detected");
+ }
+ if( file->line[0] == '@' ) {
+ if( (rc = read_spot_data_3lines(file, file->spot, best_word, best_score, file->qualType)) != 0 ) {
+ return rc;
+ }
+ /* now we MAY have 5th line in buffer so we can check if it's 2nd read for 8 lines format */
+ if( file->line_len != 0 && file->line != NULL && file->line[0] == '@' ) {
+ /* try to find read id on next line */
+ FileReadData_init(&file->spot[1], false);
+ if( parse_spot_name(file->file, &file->spot[1], &file->line[1], file->line_len - 1, best_word) == best_score ) {
+ if( pstring_cmp(&file->spot->name, &file->spot[1].name) == 0 &&
+ pstring_cmp(&file->spot->barcode, &file->spot[1].barcode) == 0 &&
+ file->spot->read.read_id != file->spot[1].read.read_id ) {
+ /* since it is different read id with same name and barcode, fill up second read */
+ if( (rc = read_spot_data_3lines(file, &file->spot[1], best_word, best_score, file->qualType)) != 0 ) {
+ return rc;
+ }
+ }
+ }
+ }
+ } else {
+ /* 2 line seq or quality form */
+ file->line = NULL; /* line consumed */
+ /* read sequence/quality */
+ if( (rc = read_multiline_seq_or_qual(file, '>', &file->spot->read.seq)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading seq/qual data");
+ }
+ if( file->spot->read.seq.len == 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=empty string reading seq/qual data");
+ } else if( !pstring_is_fasta(&file->spot->read.seq) ) {
+ /* swap */
+ if( (rc = pstring_copy(&file->spot->read.qual, &file->spot->read.seq)) == 0 ) {
+ file->spot->read.qual_type = file->qualType;
+ pstring_clear(&file->spot->read.seq);
+ }
+ }
+ file->spot->ready = true;
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFile, rcInvalid);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=file corrupt or format unknown");
+ }
+ if( rc == 0 ) {
+ int k;
+ for(k = 0; k < 2; k++) {
+ FileReadData* rd = &file->spot[k];
+ if( rd->ready && rd->read.qual_type != ILLUMINAWRITER_COLMASK_NOTSET ) {
+ if( file->qualOffset == 0 ) {
+ /* detect and remember */
+ file->qualOffset = 33;
+ file->qualMax = 94;
+ rc = pstring_quality_convert(&rd->read.qual, file->qualEnc, file->qualOffset, file->qualMin, file->qualMax);
+ if( GetRCState(rc) == rcOutofrange ) {
+ file->qualOffset = 64;
+ file->qualMax = 61;
+ rc = pstring_quality_convert(&rd->read.qual, file->qualEnc, file->qualOffset, file->qualMin, file->qualMax);
+ }
+ } else {
+ if(file->qualOffset == 33) file->qualMax = 94;
+ rc = pstring_quality_convert(&rd->read.qual, file->qualEnc, file->qualOffset, file->qualMin, file->qualMax);
+ }
+ if( rc != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting quality");
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+static
+rc_t FastqLoaderFmt_WriteData(FastqLoaderFmt* self, uint32_t argc, const SRALoaderFile* const argv[], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t i, g = 0;
+ FastqFileInfo* files = NULL;
+ bool done;
+ static IlluminaSpot spot;
+
+ if( (files = calloc(argc, sizeof(*files))) == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcMemory, rcInsufficient);
+ }
+
+ for(i = 0; rc == 0 && i < argc; i++) {
+ ExperimentQualityType qType;
+ FastqFileInfo* file = &files[i];
+
+ file->file = argv[i];
+ FileReadData_init(file->spot, false);
+ FileReadData_init(&file->spot[1], false);
+ if( (rc = SRALoaderFile_QualityScoringSystem(file->file, &qType)) == 0 &&
+ (rc = SRALoaderFile_QualityEncoding(file->file, &file->qualEnc)) == 0 &&
+ (rc = SRALoaderFile_AsciiOffset(file->file, &file->qualOffset)) == 0 ) {
+
+ file->qualType = ILLUMINAWRITER_COLMASK_NOTSET;
+
+ if( qType == eExperimentQualityType_Undefined ) {
+ qType = self->processing->quality_type;
+ file->qualOffset = self->processing->quality_offset;
+ }
+ switch(qType) {
+ case eExperimentQualityType_LogOdds:
+ case eExperimentQualityType_Other:
+ if( self->w454 != NULL || self->wIonTorrent != NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcInvalid);
+ LOGERR(klogInt, rc, "quality type other than Phred is not supported for this PLATFORM");
+ }
+ file->qualMin = -40;
+ file->qualMax = 41;
+ file->qualType = ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS1;
+ break;
+ default:
+ SRALoaderFile_LOG(file->file, klogWarn, rc,
+ "quality_scoring_system attribute not set for this file, using Phred as default", NULL);
+ case eExperimentQualityType_Phred:
+ file->qualType = ILLUMINAWRITER_COLMASK_QUALITY_PHRED;
+ file->qualMin = 0;
+ file->qualMax = (self->wIllumina) ? 61: 127;
+ break;
+ }
+ }
+ }
+ do {
+ done = true;
+ for(i = 0; rc == 0 && i < argc; i++) {
+ FastqFileInfo* file = &files[i];
+ if( (rc = read_next_spot(self, file)) != 0 || !file->spot->ready ) {
+ continue;
+ }
+ done = false;
+#if _DEBUGGING
+ {{
+ FileReadData* ss = file->spot;
+ do {
+ DEBUG_MSG(3, ("file-%u: name:'%s', bc:%s, rd:%i, flt:%hu, seq '%.*s', qual %u bytes\n",
+ i + 1, ss->name.data, ss->barcode.data, ss->read.read_id, ss->read.filter,
+ ss->read.seq.len, ss->read.seq.data, ss->read.qual.len));
+ if( ss == &file->spot[1]){ break; }
+ ss = file->spot[1].ready ? &file->spot[1] : NULL;
+ } while( ss != NULL );
+ }}
+#endif
+ }
+ if( rc != 0 || done ) {
+ break;
+ }
+ /* collect spot reads, matching by spot name
+ * spot data may be split across multiple files
+ */
+ IlluminaSpot_Init(&spot);
+ for(i = 0; rc == 0 && i < argc; i++) {
+ FileReadData* fspot = files[i].spot[0].ready ? &files[i].spot[0] : NULL;
+ while(rc == 0 && fspot != NULL ) {
+ rc = IlluminaSpot_Add(&spot, &fspot->name, &fspot->barcode, &fspot->read);
+ if( rc == 0 ) {
+ g = i;
+ fspot->ready = false;
+ } else if( GetRCState(rc) == rcIgnored ) {
+ rc = 0;
+ } else {
+ SRALoaderFile_LOG(files[i].file, klogErr, rc, "$(msg)", "msg=adding data to spot");
+ }
+ if( fspot == &files[i].spot[1]) { break; }
+ fspot = files[i].spot[1].ready ? &files[i].spot[1] : NULL;
+ }
+ }
+ if( rc == 0 ) {
+ if( self->wIllumina != NULL ) {
+ if( (rc = SRAWriterIllumina_Write(self->wIllumina, argv[0], &spot)) != 0 &&
+ GetRCTarget(rc) == rcFormatter && GetRCContext(rc) == rcValidating ) {
+ SRALoaderFile_LOG(files[g].file, klogWarn, rc, "$(msg) $(spot_name)", "msg=bad spot,spot_name=%.*s",
+ spot.name->len, spot.name->data);
+ self->spots_bad_count++;
+ if( self->spots_bad_allowed < 0 ||
+ self->spots_bad_count <= self->spots_bad_allowed ) {
+ rc = 0;
+ }
+ }
+ } else if( spot.nreads != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnsupported);
+ SRALoaderFile_LOG(files[g].file, klogErr, rc, "$(msg)", "msg=multiple reads for this platform");
+ } else if( self->wIonTorrent != NULL ) {
+ rc = SRAWriterIonTorrent_WriteRead(self->wIonTorrent, argv[0], spot.name,
+ spot.reads[0].seq, spot.reads[0].qual, NULL, NULL, 0, 0, 0, 0);
+ } else {
+ rc = SRAWriter454_WriteRead(self->w454, argv[0], spot.name,
+ spot.reads[0].seq, spot.reads[0].qual, NULL, NULL, 0, 0, 0, 0);
+ }
+ }
+ } while( rc == 0 );
+ free(files);
+ *spots_bad_count = self->spots_bad_count;
+ return rc;
+}
+
+static
+rc_t FastqLoaderFmt_Whack(FastqLoaderFmt *self, SRATable** table)
+{
+ SRAWriterIllumina_Whack(self->wIllumina, table);
+ SRAWriter454_Whack(self->w454, table);
+ SRAWriterIonTorrent_Whack(self->wIonTorrent, table);
+ free(self);
+ return 0;
+}
+
+const char UsageDefaultName[] = "fastq-load";
+
+static
+rc_t FastqLoaderFmt_Version (const FastqLoaderFmt* self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "Fastq";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 vtFastqLoaderFmt =
+{
+ 1, 0,
+ FastqLoaderFmt_Whack,
+ FastqLoaderFmt_Version,
+ NULL,
+ FastqLoaderFmt_WriteData
+};
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ FastqLoaderFmt* fmt;
+ const PlatformXML* platform;
+ const ProcessingXML* processing;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ *self = NULL;
+
+ if( (rc = Experiment_GetProcessing(config->experiment, &processing)) != 0 ||
+ (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ return rc;
+ }
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( platform->id == SRA_PLATFORM_454 ) {
+ if( rc == 0 && (rc = SRAWriter454_Make(&fmt->w454, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize 454 writer");
+ }
+ } else if( platform->id == SRA_PLATFORM_ION_TORRENT ) {
+ if( rc == 0 && (rc = SRAWriterIonTorrent_Make(&fmt->wIonTorrent, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize Ion Torrent writer");
+ }
+ } else if( (rc = SRAWriterIllumina_Make(&fmt->wIllumina, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize Illumina writer");
+ }
+ if( rc == 0 && (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtFastqLoaderFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ }
+ if( rc != 0 ) {
+ FastqLoaderFmt_Whack(fmt, NULL);
+ } else {
+ fmt->processing = processing;
+ fmt->spots_bad_allowed = config->spots_bad_allowed;
+ fmt->spots_bad_count = 0;
+ *self = &fmt->dad;
+ }
+ return rc;
+}
diff --git a/tools/sra-load/helicos-fmt.c b/tools/sra-load/helicos-fmt.c
new file mode 100644
index 0000000..c82a0c2
--- /dev/null
+++ b/tools/sra-load/helicos-fmt.c
@@ -0,0 +1,273 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <assert.h>
+
+typedef struct HelicosLoaderFmt HelicosLoaderFmt;
+#define SRALOADERFMT_IMPL HelicosLoaderFmt
+#include "loader-fmt.h"
+
+#include "pstring.h"
+#include "writer-helicos.h"
+#include "debug.h"
+
+typedef enum EFileType_enum {
+ eNotSet = -1,
+ eCSFasta,
+ eQuality,
+ eSignalFTC,
+ eSignalCY3,
+ eSignalTXR,
+ eSignalCY5,
+ eFileTypeMax
+} EFileType;
+
+typedef struct HelicosFileInfo_struct {
+ /* parsed data from file for a single spot */
+ bool ready; /* if data is filled from file */
+ /* spot data */
+ pstring name;
+ pstring sequence;
+ pstring quality;
+
+ const SRALoaderFile* file;
+ /* file line buffer */
+ const char* line; /* not NULL if contains unprocessed data */
+ size_t line_len;
+} HelicosFileInfo;
+
+struct HelicosLoaderFmt {
+ SRALoaderFmt dad;
+ const SRAWriterHelicos* writer;
+};
+
+static
+void HelicosFileInfo_init(HelicosFileInfo* file)
+{
+ file->ready = false;
+ pstring_clear(&file->name);
+ pstring_clear(&file->sequence);
+ pstring_clear(&file->quality);
+}
+
+/* reads 1 line from given file
+ * if file->line pointer is not NULL line is in buffer already, nothing is read
+ * failes on error or if line empty and not optional
+ */
+static
+rc_t file_read_line(HelicosFileInfo* file, bool optional)
+{
+ rc_t rc = 0;
+
+ if( file->line == NULL ) {
+ if( (rc = SRALoaderFileReadline(file->file, (const void**)&file->line, &file->line_len)) == 0 ) {
+ if( file->line == NULL || file->line_len == 0 ) {
+ if( !optional ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcString, rcInsufficient);
+ }
+ }
+ if( rc == 0 && file->line != NULL ) {
+ if( file->line_len > 0 ) {
+ const char* e = file->line + file->line_len;
+ /* right trim */
+ while( --e >= file->line ) {
+ if( !isspace(*e) ) {
+ break;
+ }
+ file->line_len--;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+/* reads from a file data for a sinlge spot, data may be partial */
+static
+rc_t read_next_spot(HelicosLoaderFmt* self, HelicosFileInfo* file)
+{
+ rc_t rc = 0;
+
+ if( file->ready ) {
+ /* data still not used */
+ return 0;
+ }
+ HelicosFileInfo_init(file);
+ if( (rc = file_read_line(file, true)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading more data");
+ } else if( file->line == NULL ) {
+ return 0; /* eof */
+ }
+ if( file->line[0] == '@' ) { /*** fastq format **/
+ if( (rc = pstring_assign(&file->name, &file->line[1], file->line_len - 1)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading name");
+ }
+ file->line = NULL;
+ if( (rc = file_read_line(file, false)) != 0 || file->line_len > sizeof(file->sequence.data)-1 ||
+ (rc = pstring_assign(&file->sequence, file->line, file->line_len)) != 0 ||
+ !pstring_is_fasta(&file->sequence) ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading sequence");
+ }
+ file->line = NULL;
+ if( (rc = file_read_line(file, false)) != 0 ||
+ file->line[0] != '+' || file->line_len != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading quality defline");
+ }
+ file->line = NULL;
+ if( (rc = file_read_line(file, false)) != 0 || file->line_len > sizeof(file->quality.data)-1 ||
+ (rc = pstring_assign(&file->quality, file->line, file->line_len)) != 0 ||
+ (rc = pstring_quality_convert(&file->quality, eExperimentQualityEncoding_Ascii, 33, 0, 0x7F)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading quality");
+ }
+ file->line = NULL;
+ file->ready = true;
+ } else if( file->line[0] == '>' ) { /** fasta format **/
+ if( (rc = pstring_assign(&file->name, &file->line[1], file->line_len - 1)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading name");
+ }
+ file->line = NULL;
+ if( (rc = file_read_line(file, false)) != 0 || file->line_len > sizeof(file->sequence.data)-1 ||
+ (rc = pstring_assign(&file->sequence, file->line, file->line_len)) != 0 ||
+ !pstring_is_fasta(&file->sequence) ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading sequence");
+ }
+ file->line = NULL;
+ file->quality.len = file->sequence.len;
+ memset(file->quality.data,14,file->quality.len);
+ file->ready = true;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFile, rcInvalid);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=expected '@'");
+ }
+#if _DEBUGGING
+ DEBUG_MSG(3, ("READ: name:'%s', seq[%u]:'%s', qual[%u]\n", file->name.data,
+ file->sequence.len, file->sequence.data, file->quality.len)); /*
+ DEBUG_MSG(3, ("READ: name:'%s', seq[%u]:'%s', qual[%u]:'%s'\n", file->name.data,
+ file->sequence.len, file->sequence.data, file->quality.len, file->quality.data));*/
+#endif
+ return 0;
+}
+
+static
+rc_t HelicosLoaderFmt_WriteData(HelicosLoaderFmt* self, uint32_t argc, const SRALoaderFile* const argv[], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ HelicosFileInfo* files = NULL;
+ bool done;
+
+ if( (files = calloc(argc, sizeof(*files))) == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcMemory, rcInsufficient);
+ }
+ for(i = 0; rc == 0 && i < argc; i++) {
+ HelicosFileInfo* file = &files[i];
+ HelicosFileInfo_init(file);
+ file->file = argv[i];
+ }
+ do {
+ done = true;
+ for(i = 0; rc == 0 && i < argc; i++) {
+ HelicosFileInfo* file = &files[i];
+ if( (rc = read_next_spot(self, file)) == 0 && file->ready ) {
+ done = false;
+ rc = SRAWriterHelicos_Write(self->writer, argv[0], &file->name, &file->sequence, &file->quality);
+ file->ready = false;
+ }
+ }
+ } while( rc == 0 && !done );
+ free(files);
+ return rc;
+}
+
+static
+rc_t HelicosLoaderFmt_Whack(HelicosLoaderFmt *self, SRATable** table)
+{
+ SRAWriterHelicos_Whack(self->writer, table);
+ free(self);
+ return 0;
+}
+
+const char UsageDefaultName[] = "helicos-load";
+
+static
+rc_t HelicosLoaderFmt_Version (const HelicosLoaderFmt* self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "Helicos";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 vtHelicosLoaderFmt =
+{
+ 1, 0,
+ HelicosLoaderFmt_Whack,
+ HelicosLoaderFmt_Version,
+ NULL,
+ HelicosLoaderFmt_WriteData
+};
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ HelicosLoaderFmt* fmt;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ *self = NULL;
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( (rc = SRAWriterHelicos_Make(&fmt->writer, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ } else if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtHelicosLoaderFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ }
+ /* Set result or free obj */
+ if( rc != 0 ) {
+ HelicosLoaderFmt_Whack(fmt, NULL);
+ } else {
+ *self = &fmt->dad;
+ }
+ return rc;
+}
diff --git a/tools/sra-load/illumina-fmt.c b/tools/sra-load/illumina-fmt.c
new file mode 100644
index 0000000..64e472b
--- /dev/null
+++ b/tools/sra-load/illumina-fmt.c
@@ -0,0 +1,848 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <assert.h>
+
+typedef struct IlluminaLoaderFmt IlluminaLoaderFmt;
+#define SRALOADERFMT_IMPL IlluminaLoaderFmt
+#include "loader-fmt.h"
+
+#include "writer-illumina.h"
+#include "debug.h"
+
+typedef enum EIlluminaNativeFileType_enum {
+ eIlluminaNativeFileTypeNotSet = 0,
+ eIlluminaNativeFileTypeQuality4 = 0x01,
+ eIlluminaNativeFileTypeQSeq = 0x02,
+ eIlluminaNativeFileTypeFasta = 0x04,
+ eIlluminaNativeFileTypeNoise = 0x08,
+ eIlluminaNativeFileTypeIntensity = 0x10,
+ eIlluminaNativeFileTypeSignal = 0x20
+} EIlluminaNativeFileType;
+
+struct {
+ EIlluminaNativeFileType type;
+ const char* key[3];
+} const file_types[] = {
+ /* order important, see WritaData loop */
+ { eIlluminaNativeFileTypeSignal,
+ { "_sig2.", NULL } },
+ { eIlluminaNativeFileTypeIntensity,
+ { "_int.", NULL } },
+ { eIlluminaNativeFileTypeNoise,
+ { "_nse.", NULL } },
+ { eIlluminaNativeFileTypeFasta,
+ { "_seq.", NULL } },
+ { eIlluminaNativeFileTypeQSeq,
+ { "_qseq.", ".qseq", NULL } },
+ { eIlluminaNativeFileTypeQuality4,
+ { "_prb.", NULL } }
+};
+
+typedef struct IlluminaFileInfo_struct {
+ /* parsed data from file for a single spot */
+ bool ready; /* if data is filled from file */
+ EIlluminaNativeFileType type;
+ struct IlluminaFileInfo_struct* prev;
+ struct IlluminaFileInfo_struct* next;
+
+ /* spot data */
+ pstring name;
+ pstring barcode;
+ long coord[4]; /* lane, tile, x, y - sort-merge keys */
+
+ IlluminaRead read;
+
+ const SRALoaderFile* file;
+ /* file line buffer */
+ const char* line; /* not NULL if contains unprocessed data */
+ size_t line_len;
+} IlluminaFileInfo;
+
+static
+void IlluminaFileInfo_init(IlluminaFileInfo* file)
+{
+ assert(file);
+ file->ready = false;
+ pstring_clear(&file->name);
+ memset(file->coord, 0, sizeof(file->coord));
+ IlluminaRead_Init(&file->read, false);
+}
+
+/* reads 1 line from given file
+ * if file->line pointer is not NULL line is in buffer already, nothing is read
+ * failes on error or if line empty and not optional
+ */
+static
+rc_t file_read_line(IlluminaFileInfo* file, bool optional)
+{
+ rc_t rc = 0;
+
+ if( file->line == NULL ) {
+ if( (rc = SRALoaderFileReadline(file->file, (const void**)&file->line, &file->line_len)) == 0 ) {
+ if( file->line == NULL || file->line_len == 0 ) {
+ if( !optional ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcString, rcInsufficient);
+ }
+ }
+ if( rc == 0 && file->line != NULL ) {
+ if( file->line_len > 0 ) {
+ const char* e = file->line + file->line_len;
+ /* right trim */
+ while( --e >= file->line ) {
+ if( !isspace(*e) ) {
+ break;
+ }
+ file->line_len--;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+/*
+ * assumes tab separated file:
+ * first 2 postiions concatinated with "_" into spot prefix
+ * nextg 4 postiions concatinated with ":" into spot id: lane:tile:x:y
+ * 7th (index) ignored
+ * 8th is read id
+ * 9th fasta
+ * 10th quality
+ * 11th (optional) read filter
+ */
+static
+rc_t parse_qseq(IlluminaFileInfo* file, const char* data, size_t data_sz)
+{
+ rc_t rc = 0;
+ const char* t, *str = data, *end = data + data_sz;
+ int tabs = 0;
+ do {
+ if( (t = memchr(str, '\t', end - str)) != NULL ) {
+ switch(++tabs) {
+ case 1:
+ rc = pstring_assign(&file->name, str, t - str);
+ break;
+ case 2:
+ if( (rc = pstring_append(&file->name, "_", 1)) == 0 ) {
+ rc = pstring_append(&file->name, str, t - str);
+ }
+ break;
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ errno = 0;
+ file->coord[tabs - 3] = strtol(str, NULL, 10);
+ if( errno != 0 ) {
+ file->coord[tabs - 3] = 0;
+ }
+ if( (rc = pstring_append(&file->name, ":", 1)) == 0 ) {
+ rc = pstring_append(&file->name, str, t - str);
+ }
+ break;
+ case 7:
+ if( t - str != 1 || (*str != '0' && *str != '1') ) {
+ rc = pstring_assign(&file->barcode, str, t - str);
+ }
+ break;
+ case 8:
+ if( t - str != 1 || !isdigit(*str) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ } else {
+ file->read.read_id = *str - '0';
+ if( file->read.read_id == 0 ) {
+ file->read.read_id = ILLUMINAWRITER_READID_NONE;
+ }
+ }
+ break;
+ case 9:
+ rc = pstring_assign(&file->read.seq, str, t - str);
+ break;
+ case 10:
+ file->read.qual_type = ILLUMINAWRITER_COLMASK_QUALITY_PHRED;
+ rc = pstring_assign(&file->read.qual, str, t - str);
+ break;
+ }
+ str = ++t;
+ }
+ } while( rc == 0 && t != NULL && str < end );
+
+ if( rc == 0 ) {
+ if( tabs == 9 ) {
+ file->read.qual_type = ILLUMINAWRITER_COLMASK_QUALITY_PHRED;
+ rc = pstring_assign(&file->read.qual, str, end - str);
+ } else if( tabs == 10 ) {
+ if( end - str != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ } else if( *str == '1' ) {
+ file->read.filter = SRA_READ_FILTER_PASS;
+ } else if( *str == '0' ) {
+ file->read.filter = SRA_READ_FILTER_REJECT;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ }
+ if( rc == 0 ) {
+ if( file->read.seq.len != file->read.qual.len ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ } else {
+ rc = pstring_quality_convert(&file->read.qual, eExperimentQualityEncoding_Ascii, 64, 0, 0x7F);
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t read_quality(const char* data, size_t data_sz, IlluminaRead* read)
+{
+ rc_t rc = 0;
+
+ if( (rc = pstring_assign(&read->qual, data, data_sz)) == 0 ) {
+ if( (rc = pstring_quality_convert(&read->qual, eExperimentQualityEncoding_Decimal, 0, -128, 127)) == 0 ) {
+ read->qual_type = ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t read_spot_coord(IlluminaFileInfo* file, const char* data, size_t data_sz, const char** tail)
+{
+ rc_t rc = 0;
+ const char* t, *str = data, *end = data + data_sz;
+ int tabs = 0;
+
+ if( tail ) {
+ *tail = NULL;
+ }
+ do {
+ if( (t = memchr(str, '\t', end - str)) != NULL ) {
+ switch(++tabs) {
+ case 1:
+ errno = 0;
+ file->coord[0] = strtol(str, NULL, 10);
+ if( errno != 0 ) {
+ file->coord[0] = 0;
+ }
+ rc = pstring_assign(&file->name, str, t - str);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ errno = 0;
+ file->coord[tabs - 1] = strtol(str, NULL, 10);
+ if( errno != 0 ) {
+ file->coord[tabs - 1] = 0;
+ }
+ if( (rc = pstring_append(&file->name, ":", 1)) == 0 ) {
+ rc = pstring_append(&file->name, str, t - str);
+ }
+ if( tail ) {
+ *tail = t + 1;
+ }
+ break;
+ }
+ str = ++t;
+ }
+ } while( rc == 0 && t != NULL && str < end && tabs < 4 );
+
+ if( tabs < 4 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcTooShort);
+ }
+ return rc;
+}
+
+static
+rc_t read_signal(const char* data, size_t data_sz, pstring* str)
+{
+ rc_t rc = 0;
+ double d;
+ const char* c = data, *end = data + data_sz;
+ float* f = (float*)str->data;
+ float* fend = (float*)(str->data + sizeof(str->data));
+
+ while( rc == 0 && c != end ) {
+ char* next;
+ errno = 0;
+ d = strtod(c, &next);
+ if( errno != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcOutofrange);
+ } else if( d == 0 && c == next ) {
+ break;
+ } else {
+ c = next;
+ if( f >= fend ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcBuffer, rcInsufficient);
+ }
+ *f++ = d;
+ }
+ }
+ if( rc == 0 ) {
+ str->len = (f - (float*)str->data) * sizeof(*f);
+ if( str->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcEmpty);
+ }
+ }
+ return rc;
+}
+
+/* reads from a file data for a sinlge spot, data may be partial */
+static
+rc_t read_next_spot(const char* blk_pfx, IlluminaFileInfo* file)
+{
+ rc_t rc = 0;
+ const char* tail = file->line;
+
+ if( file->ready ) {
+ /* data still not used */
+ return 0;
+ }
+ IlluminaFileInfo_init(file);
+ if( (rc = file_read_line(file, true)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading more data");
+ } else if( file->line == NULL ) {
+ return 0; /* eof */
+ }
+ switch( file->type ) {
+ case eIlluminaNativeFileTypeQSeq:
+ if( (rc = parse_qseq(file, file->line, file->line_len)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading qseq");
+ }
+ break;
+
+ case eIlluminaNativeFileTypeFasta:
+ case eIlluminaNativeFileTypeNoise:
+ case eIlluminaNativeFileTypeIntensity:
+ case eIlluminaNativeFileTypeSignal:
+ {{
+ /* read only common first 4 coords into name and prepend with DATA_BLOCK/@name */
+ if( (rc = read_spot_coord(file, file->line, file->line_len, &tail)) == 0 ) {
+ if( blk_pfx != NULL ) {
+ pstring tmp_name;
+ if( (rc = pstring_copy(&tmp_name, &file->name)) == 0 &&
+ (rc = pstring_assign(&file->name, blk_pfx, strlen(blk_pfx))) == 0 &&
+ (rc = pstring_append(&file->name, ":", 1)) == 0 ) {
+ rc = pstring_concat(&file->name, &tmp_name);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading spot coord");
+ }
+ break;
+ }}
+
+ case eIlluminaNativeFileTypeQuality4:
+ if( (rc = read_quality(file->line, file->line_len, &file->read)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading quality");
+ } else if( (rc = pstring_assign(&file->name, blk_pfx, strlen(blk_pfx))) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=name for quality 4");
+ }
+ break;
+
+ default:
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFileFormat, rcUnknown);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=processing data line");
+ break;
+ }
+
+ /* process tail (after coords) for some file types */
+ file->line_len -= tail - file->line; /* length of tail */
+ switch( file->type ) {
+ case eIlluminaNativeFileTypeQSeq:
+ case eIlluminaNativeFileTypeQuality4:
+ default:
+ /* completely processed before */
+ break;
+
+ case eIlluminaNativeFileTypeFasta:
+ if( (rc = pstring_assign(&file->read.seq, tail, file->line_len)) != 0 ||
+ !pstring_is_fasta(&file->read.seq) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcCorrupt);
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=reading fasta");
+ }
+ break;
+
+ case eIlluminaNativeFileTypeNoise:
+ if( (rc = read_signal(tail, file->line_len, &file->read.noise)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting noise");
+ }
+ break;
+
+ case eIlluminaNativeFileTypeIntensity:
+ if( (rc = read_signal(tail, file->line_len, &file->read.intensity)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting intensity");
+ }
+ break;
+
+ case eIlluminaNativeFileTypeSignal:
+ if( (rc = read_signal(tail, file->line_len, &file->read.signal)) != 0 ) {
+ return SRALoaderFile_LOG(file->file, klogErr, rc, "$(msg)", "msg=converting signal");
+ }
+ break;
+ }
+ file->line = NULL;
+ file->ready = true;
+#if _DEBUGGING
+ DEBUG_MSG(3, ("name:'%s' [%li:%li:%li:%li]\n", file->name.data,
+ file->coord[0], file->coord[1], file->coord[2], file->coord[3]));
+ if( file->read.seq.len ) {
+ DEBUG_MSG(3, ("seq:'%.*s'\n", file->read.seq.len, file->read.seq.data));
+ }
+ if( file->read.qual.len ) {
+ DEBUG_MSG(3, ("qual{0x%x}: %u bytes\n", file->read.qual_type, file->read.qual.len));
+ }
+#endif
+ return 0;
+}
+
+struct IlluminaLoaderFmt {
+ SRALoaderFmt dad;
+ const SRAWriterIllumina* writer;
+ bool skip_intensity;
+ bool skip_signal;
+ bool skip_noise;
+ int64_t spots_bad_allowed;
+ int64_t spots_bad_count;
+};
+
+typedef struct FGroup_struct {
+ SLNode dad;
+ pstring key; /* part of filename w/o path up to ftypes value above */
+ const char* blk_pfx;
+ EIlluminaNativeFileType mask;
+ IlluminaFileInfo* files;
+} FGroup;
+
+typedef struct FGroup_Find_data_struct {
+ FGroup* found;
+ pstring key;
+} FGroup_Find_data;
+
+bool FGroup_Find( SLNode *node, void *data )
+{
+ FGroup* n = (FGroup*)node;
+ FGroup_Find_data* d = (FGroup_Find_data*)data;
+ IlluminaFileInfo* file = n->files;
+
+ while( file != NULL ) {
+ if( pstring_cmp(&file->name, &d->key) == 0 ) {
+ d->found = n;
+ return true;
+ }
+ file = file->next;
+ }
+ if( pstring_cmp(&d->key, &n->key) == 0 ) {
+ d->found = n;
+ return true;
+ }
+ return false;
+}
+
+void FGroup_Validate( SLNode *node, void *data )
+{
+ rc_t* rc = (rc_t*)data;
+ static EIlluminaNativeFileType mask = eIlluminaNativeFileTypeNotSet;
+ FGroup* n = (FGroup*)node;
+ IlluminaFileInfo* file = n->files;
+
+ DEBUG_MSG(3, ("==> group: '%s'\n", n->key.data));
+ while( file != NULL ) {
+ DEBUG_MSG(3, ("file: type %u '%s'\n", file->type, file->name.data));
+ if( mask == eIlluminaNativeFileTypeNotSet ) {
+ mask = n->mask;
+ if( !(mask & (eIlluminaNativeFileTypeFasta | eIlluminaNativeFileTypeQSeq)) ) {
+ *rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcNotFound);
+ SRALoaderFile_LOG(file->file, klogErr, *rc, "file group '$(p)*': sequence data", PLOG_S(p) , n->key.data);
+ }
+ if( (mask & eIlluminaNativeFileTypeFasta) && (mask & eIlluminaNativeFileTypeQSeq) ) {
+ *rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ SRALoaderFile_LOG(file->file, klogErr, *rc, "file group '$(p)*': _seq and _qseq", PLOG_S(p) , n->key.data);
+ }
+ if( !(mask & eIlluminaNativeFileTypeQuality4) && !(mask & eIlluminaNativeFileTypeQSeq) ) {
+ *rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcNotFound);
+ SRALoaderFile_LOG(file->file, klogErr, *rc, "file group '$(p)*': quality data", PLOG_S(p) , n->key.data);
+ }
+ } else if( mask != n->mask ) {
+ *rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ SRALoaderFile_LOG(file->file, klogErr, *rc, "file group '$(p)*': no match in spot names on 1st lines across files in group",
+ PLOG_S(p) , n->key.data);
+ }
+ file = file->next;
+ }
+ DEBUG_MSG(3, ("<== group: '%s'\n", n->key.data));
+}
+
+void FGroup_Whack(SLNode *n, void *data )
+{
+ if( n != NULL ) {
+ FGroup* node = (FGroup*)n;
+ IlluminaFileInfo* file = node->files;
+
+ while( file != NULL ) {
+ IlluminaFileInfo* x = file;
+ file = file->next;
+ free(x);
+ }
+ free(node);
+ }
+}
+
+typedef struct FGroup_Parse_data_struct {
+ rc_t rc;
+ IlluminaLoaderFmt* self;
+ IlluminaSpot spot;
+} FGroup_Parse_data;
+
+bool FGroup_Parse( SLNode *n, void *d )
+{
+ FGroup_Parse_data* data = (FGroup_Parse_data*)d;
+ FGroup* g = (FGroup*)n;
+ bool done;
+ const SRALoaderFile* data_block_ref = NULL;
+
+ data->rc = 0;
+ do {
+ IlluminaFileInfo* file = g->files;
+ done = true;
+ while( data->rc == 0 && file != NULL ) {
+ if( (data->rc = read_next_spot(g->blk_pfx, file)) == 0 && file->ready ) {
+ done = false;
+ }
+ file = file->next;
+ }
+ if( data->rc != 0 || done ) {
+ break;
+ }
+ /* collect spot reads, matching by spot name
+ * spot data may be split across multiple files
+ */
+ IlluminaSpot_Init(&data->spot);
+ file = g->files;
+ while( data->rc == 0 && file != NULL ) {
+ if( file->ready ) {
+ if( (file->type == eIlluminaNativeFileTypeNoise && data->self->skip_noise) ||
+ (file->type == eIlluminaNativeFileTypeIntensity && data->self->skip_intensity) ||
+ (file->type == eIlluminaNativeFileTypeSignal && data->self->skip_signal) ) {
+ file->ready = false;
+ } else {
+ data_block_ref = file->file;
+ if( file->type == eIlluminaNativeFileTypeQSeq && (g->mask & eIlluminaNativeFileTypeQuality4) ) {
+ /* drop quality1 from qseq data */
+ pstring_clear(&file->read.qual);
+ } else if( file->type == eIlluminaNativeFileTypeQuality4 ) {
+ IlluminaFileInfo* neib = file->next ? file->next : file->prev;
+ /* need to fix spotname to be same cause prb do not have any name in it */
+ if( (data->rc = pstring_copy(&file->name, &neib->name)) != 0 ) {
+ SRALoaderFile_LOG(file->file, klogErr, data->rc, "$(msg) '$(n)'", "msg=syncing prb spot name,n=%s", neib->name.data);
+ }
+ }
+ if( data->rc == 0 ) {
+ data->rc = IlluminaSpot_Add(&data->spot, &file->name, &file->barcode, &file->read);
+ if( data->rc == 0 ) {
+ file->ready = false;
+ } else {
+ if( GetRCState(data->rc) == rcIgnored ) {
+ SRALoaderFile_LOG(file->file, klogWarn, data->rc, "$(msg) '$(s1)' <> '$(s2)'",
+ "msg=spot name mismatch,s1=%.*s,s2=%.*s",
+ data->spot.name->len, data->spot.name->data, file->name.len, file->name.data);
+ data->self->spots_bad_count++;
+ /* skip spot for all files in a group */
+ file = g->files;
+ while( file != NULL ) {
+ file->ready = false;
+ SRALoaderFile_LOG(file->file, klogWarn, data->rc,
+ "$(msg) '$(n)'", "msg=skipped spot,n=%s", file->name.data);
+ file = file->next;
+ }
+ if( data->self->spots_bad_allowed >= 0 &&
+ data->self->spots_bad_count > data->self->spots_bad_allowed ) {
+ data->rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInvalid);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ file = file->next;
+ }
+ if( GetRCState(data->rc) == rcIgnored ) {
+ data->rc = 0;
+ continue;
+ }
+ if( data->rc == 0 ) {
+ data->rc = SRAWriterIllumina_Write(data->self->writer, data_block_ref, &data->spot);
+ }
+ } while( data->rc == 0 );
+ return data->rc != 0;
+}
+
+static
+rc_t IlluminaLoaderFmt_WriteData(IlluminaLoaderFmt* self, uint32_t argc, const SRALoaderFile* const argv[], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t t, i, k, ftype_q = sizeof(file_types) / sizeof(file_types[0]);
+ SLList files;
+ IlluminaFileInfo* file = NULL;
+
+ SLListInit(&files);
+
+ /* group files using spotname, for _prb. file name prefix is used,
+ files reviewed by type detected from name and ordered by file_type array */
+ for(t = 0; rc == 0 && t < ftype_q; t++) {
+ for(i = 0; rc == 0 && i < argc; i++) {
+ const char* fname, *blk_pfx;
+ int prefix_len = 0;
+ ERunFileType ftype;
+ EIlluminaNativeFileType type = eIlluminaNativeFileTypeNotSet;
+ FGroup_Find_data data;
+
+ if( (rc = SRALoaderFileName(argv[i], &fname)) != 0 ) {
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "reading file name", NULL);
+ break;
+ }
+ if( (rc = SRALoaderFile_FileType(argv[i], &ftype)) != 0 ) {
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "reading file type", NULL);
+ break;
+ }
+ if( (rc = SRALoaderFileBlockName(argv[i], &blk_pfx)) != 0 ) {
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "reading DATA_BLOCK/@name", NULL);
+ break;
+ }
+ if( blk_pfx == NULL ) {
+ blk_pfx = "";
+ }
+ {{
+ /* skip path if present */
+ const char* p = strrchr(fname, '/');
+ fname = p ? p + 1 : fname;
+ p = NULL;
+ for(k = 0; type == eIlluminaNativeFileTypeNotSet && k < ftype_q; k++) {
+ const char* const* e = file_types[k].key;
+ while( *e != NULL ) {
+ p = strstr(fname, *e++);
+ if( p != NULL ) {
+ type = file_types[k].type;
+ break;
+ }
+ }
+ }
+ if( p != NULL ) {
+ prefix_len = p - fname;
+ }
+ }}
+ if( ftype == rft_IlluminaNativeSeq ) {
+ type = eIlluminaNativeFileTypeFasta;
+ } else if( ftype == rft_IlluminaNativePrb ) {
+ type = eIlluminaNativeFileTypeQuality4;
+ } else if( ftype == rft_IlluminaNativeInt ) {
+ type = eIlluminaNativeFileTypeIntensity;
+ } else if( ftype == rft_IlluminaNativeQseq ) {
+ type = eIlluminaNativeFileTypeQSeq;
+ }
+ if( type == eIlluminaNativeFileTypeNotSet ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "detecting file type by file name", NULL);
+ break;
+ }
+ if( type != file_types[t].type ) {
+ /* one type at a time */
+ continue;
+ }
+ DEBUG_MSG(3, ("file '%s' type set to %d\n", fname, type));
+ file = calloc(1, sizeof(*file));
+ if( file == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcMemory, rcExhausted);
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "allocating file object", NULL);
+ break;
+ }
+ IlluminaFileInfo_init(file);
+ file->file = argv[i];
+ file->type = type;
+
+ if( file->type == eIlluminaNativeFileTypeQuality4 ) {
+ /* in _prb there is no spotname inside so use file prefix */
+ rc = pstring_assign(&data.key, fname, prefix_len);
+ } else {
+ /* try to get 1st spot so group can be organized by spot name */
+ if( (rc = read_next_spot(blk_pfx, file)) != 0 || !file->ready ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcReading, rcData, rcNotFound);
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "reading 1st spot", NULL);
+ break;
+ }
+ rc = pstring_copy(&data.key, &file->name);
+ }
+
+ data.found = NULL;
+ if( SLListDoUntil(&files, FGroup_Find, &data) && data.found != NULL ) {
+ IlluminaFileInfo* ss = data.found->files;
+
+ while( rc == 0 && file != NULL ) {
+ if( ss->type != eIlluminaNativeFileTypeQSeq && ss->type == file->type ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFile, rcDuplicate);
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "type of file for lane", NULL);
+ } else if( ss->next != NULL ) {
+ ss = ss->next;
+ } else {
+ ss->next = file;
+ file->prev = ss;
+ data.found->mask |= file->type;
+ file = NULL;
+ }
+ }
+ } else {
+ data.found = calloc(1, sizeof(*data.found));
+ if( data.found == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcMemory, rcInsufficient);
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "preparing file group", NULL);
+ break;
+ } else {
+ if( (rc = pstring_assign(&data.found->key, fname, prefix_len)) != 0 ) {
+ SRALoaderFile_LOG(argv[i], klogErr, rc, "setting file group key", NULL);
+ FGroup_Whack(&data.found->dad, NULL);
+ break;
+ } else {
+ FGroup* curr = (FGroup*)SLListHead(&files), *prev = NULL;
+ data.found->blk_pfx = blk_pfx;
+ data.found->files = file;
+ data.found->mask = file->type;
+ /* group inserted into list by coords in 1st spot */
+ while( curr != NULL ) {
+ if( curr->files[0].coord[0] > file->coord[0] ||
+ (curr->files[0].coord[0] == file->coord[0] &&
+ curr->files[0].coord[1] > file->coord[1]) ) {
+ data.found->dad.next = &curr->dad;
+ if( prev == NULL ) {
+ files.head = &data.found->dad;
+ } else {
+ prev->dad.next = &data.found->dad;
+ }
+ break;
+ }
+ prev = curr;
+ curr = (FGroup*)curr->dad.next;
+ }
+ if( curr == NULL ) {
+ SLListPushTail(&files, &data.found->dad);
+ }
+ file = NULL;
+ }
+ }
+ }
+ }
+ }
+ if( rc == 0 ) {
+ SLListForEach(&files, FGroup_Validate, &rc);
+ }
+ if( rc == 0 ) {
+ FGroup_Parse_data data;
+ data.self = self;
+ if( SLListDoUntil(&files, FGroup_Parse, &data) ) {
+ rc = data.rc;
+ }
+ } else {
+ free(file);
+ }
+ SLListWhack(&files, FGroup_Whack, NULL);
+ *spots_bad_count = self->spots_bad_count;
+ return rc;
+}
+
+static
+rc_t IlluminaLoaderFmt_Whack(IlluminaLoaderFmt *self, SRATable** table)
+{
+ SRAWriterIllumina_Whack(self->writer, table);
+ free(self);
+ return 0;
+}
+
+const char UsageDefaultName[] = "illumina-load";
+
+static
+rc_t IlluminaLoaderFmt_Version (const IlluminaLoaderFmt* self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "Illumina native";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 vtIlluminaLoaderFmt =
+{
+ 1, 0,
+ IlluminaLoaderFmt_Whack,
+ IlluminaLoaderFmt_Version,
+ NULL,
+ IlluminaLoaderFmt_WriteData
+};
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ IlluminaLoaderFmt* fmt;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ *self = NULL;
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( (rc = SRAWriterIllumina_Make(&fmt->writer, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ } else if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtIlluminaLoaderFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ }
+ if( rc != 0 ) {
+ IlluminaLoaderFmt_Whack(fmt, NULL);
+ } else {
+ fmt->skip_signal = (config->columnFilter & (efltrSIGNAL | efltrDEFAULT));
+ fmt->skip_noise = (config->columnFilter & (efltrNOISE | efltrDEFAULT));
+ fmt->skip_intensity = (config->columnFilter & (efltrINTENSITY | efltrDEFAULT));
+ fmt->spots_bad_allowed = config->spots_bad_allowed;
+ fmt->spots_bad_count = 0;
+ *self = &fmt->dad;
+ }
+ return rc;
+}
diff --git a/tools/sra-load/loader-file.c b/tools/sra-load/loader-file.c
new file mode 100644
index 0000000..feeff1a
--- /dev/null
+++ b/tools/sra-load/loader-file.c
@@ -0,0 +1,191 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*/
+#include <klib/rc.h>
+
+#include "loader-file.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+struct SRALoaderFile
+{
+ const DataBlock* data_block;
+ const DataBlockFileAttr* file_attr;
+ const KLoaderFile *lfile;
+};
+
+rc_t SRALoaderFile_IsEof(const SRALoaderFile* cself, bool* eof)
+{
+ return KLoaderFile_IsEof(cself ? cself->lfile : NULL, eof);
+}
+
+rc_t SRALoaderFile_LOG(const SRALoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ rc = KLoaderFile_VLOG(cself ? cself->lfile : NULL, lvl, rc, msg, fmt, args);
+ va_end(args);
+ return rc;
+}
+
+rc_t SRALoaderFile_Offset(const SRALoaderFile* cself, uint64_t* offset)
+{
+ return KLoaderFile_Offset(cself ? cself->lfile : NULL, offset);
+}
+
+rc_t SRALoaderFileReadline(const SRALoaderFile* cself, const void** buffer, size_t* length)
+{
+ return KLoaderFile_Readline(cself ? cself->lfile : NULL, buffer, length);
+}
+
+rc_t SRALoaderFileRead(const SRALoaderFile* cself, size_t advance, size_t size, const void** buffer, size_t* length)
+{
+ return KLoaderFile_Read(cself ? cself->lfile : NULL, advance, size, buffer, length);
+}
+
+rc_t SRALoaderFileName(const SRALoaderFile *cself, const char **name)
+{
+ return KLoaderFile_Name(cself ? cself->lfile : NULL, name);
+}
+
+rc_t SRALoaderFileFullName(const SRALoaderFile *cself, const char **name)
+{
+ return KLoaderFile_FullName(cself ? cself->lfile : NULL, name);
+}
+
+rc_t SRALoaderFileResolveName(const SRALoaderFile *self, char *resolved, size_t rsize)
+{
+ return KLoaderFile_ResolveName(self ? self->lfile : NULL, resolved, rsize);
+}
+
+rc_t SRALoaderFileBlockName ( const SRALoaderFile *cself, const char **block_name )
+{
+ if( cself == NULL || block_name == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *block_name = cself->data_block->name;
+ return 0;
+}
+
+rc_t SRALoaderFileMemberName(const SRALoaderFile *cself, const char **member_name)
+{
+ if( cself == NULL || member_name == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *member_name = cself->data_block->member_name;
+ return 0;
+}
+
+rc_t SRALoaderFileSector( const SRALoaderFile *cself, int64_t* sector)
+{
+ if( cself == NULL || sector == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *sector = cself->data_block->sector;
+ return 0;
+}
+
+rc_t SRALoaderFileRegion( const SRALoaderFile *cself, int64_t* region)
+{
+ if( cself == NULL || region == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *region = cself->data_block->region;
+ return 0;
+}
+
+rc_t SRALoaderFile_QualityScoringSystem( const SRALoaderFile *cself, ExperimentQualityType* quality_scoring_system )
+{
+ if( cself == NULL || quality_scoring_system == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *quality_scoring_system = cself->file_attr->quality_scoring_system;
+ return 0;
+}
+
+rc_t SRALoaderFile_QualityEncoding( const SRALoaderFile *cself, ExperimentQualityEncoding* quality_encoding )
+{
+ if( cself == NULL || quality_encoding == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *quality_encoding = cself->file_attr->quality_encoding;
+ return 0;
+}
+
+rc_t SRALoaderFile_AsciiOffset( const SRALoaderFile *cself, uint8_t* ascii_offset )
+{
+ if( cself == NULL || ascii_offset == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *ascii_offset = cself->file_attr->ascii_offset;
+ return 0;
+}
+
+rc_t SRALoaderFile_FileType( const SRALoaderFile *cself, ERunFileType* filetype )
+{
+ if( cself == NULL || filetype == NULL ) {
+ return RC(rcSRA, rcFile, rcAccessing, rcParam, rcNull);
+ }
+ *filetype = cself->file_attr->filetype;
+ return 0;
+}
+
+rc_t SRALoaderFile_Release(const SRALoaderFile* cself)
+{
+ rc_t rc = 0;
+
+ if( cself ) {
+ SRALoaderFile* self = (SRALoaderFile*)cself;
+ /* may return md5 check error here */
+ rc = KLoaderFile_Release(self->lfile, false);
+ free(self);
+ }
+ return rc;
+}
+
+rc_t SRALoaderFile_Make(const SRALoaderFile **cself, const KDirectory* dir, const char* filename,
+ const DataBlock* block, const DataBlockFileAttr* fileattr, const uint8_t* md5_digest, bool read_ahead)
+{
+ rc_t rc = 0;
+ SRALoaderFile* obj;
+
+ if( cself == NULL || block == NULL || fileattr == NULL ) {
+ rc = RC(rcSRA, rcFile, rcConstructing, rcParam, rcNull);
+ } else {
+ if( (obj = calloc(1, sizeof(*obj))) == NULL ) {
+ rc = RC(rcSRA, rcFile, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = KLoaderFile_Make(&obj->lfile, dir, filename, md5_digest, read_ahead)) == 0 ) {
+ obj->data_block = block;
+ obj->file_attr = fileattr;
+ *cself = obj;
+ }
+ if( rc != 0 ) {
+ *cself = NULL;
+ SRALoaderFile_Release(obj);
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-load/loader-file.h b/tools/sra-load/loader-file.h
new file mode 100644
index 0000000..261eb32
--- /dev/null
+++ b/tools/sra-load/loader-file.h
@@ -0,0 +1,113 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_file_
+#define _sra_load_file_
+
+#include <klib/defs.h>
+#include <klib/log.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kapp/loader-file.h>
+
+#include "run-xml.h"
+
+/*--------------------------------------------------------------------------
+* SRA reader buffered input file
+*/
+typedef struct SRALoaderFile SRALoaderFile;
+
+rc_t SRALoaderFile_Make(const SRALoaderFile **cself, const KDirectory* dir, const char* filename,
+ const DataBlock* block, const DataBlockFileAttr* fileattr, const uint8_t* md5_digest, bool read_ahead);
+
+rc_t SRALoaderFile_Release(const SRALoaderFile* cself);
+
+/* returns true if eof is reached and buffer is empty */
+rc_t SRALoaderFile_IsEof(const SRALoaderFile* cself, bool* eof);
+
+/* print error msg file file info and return original!! rc
+ if msg is NULL fmt is not used so call with NULL, NULL if no msg needs to be printed */
+rc_t SRALoaderFile_LOG(const SRALoaderFile* cself, KLogLevel lvl, rc_t rc, const char *msg, const char *fmt, ...);
+
+/* returns current buffer position in file */
+rc_t SRALoaderFile_Offset(const SRALoaderFile* cself, uint64_t* offset);
+
+/* file name */
+rc_t SRALoaderFileName ( const SRALoaderFile *cself, const char **name );
+
+rc_t SRALoaderFileFullName(const SRALoaderFile *cself, const char **name);
+
+rc_t SRALoaderFileResolveName(const SRALoaderFile *self, char *resolved, size_t rsize);
+
+/* DATA_BLOCK name attribute */
+rc_t SRALoaderFileBlockName ( const SRALoaderFile *cself, const char **block_name );
+
+/* DATA_BLOCK member_name attribute */
+rc_t SRALoaderFileMemberName ( const SRALoaderFile *cself, const char **member_name );
+
+/* DATA_BLOCK sector attribute */
+rc_t SRALoaderFileSector( const SRALoaderFile *cself, int64_t* sector);
+
+/* DATA_BLOCK region attribute */
+rc_t SRALoaderFileRegion( const SRALoaderFile *cself, int64_t* region);
+
+/* FILE @quality_scoring_system */
+rc_t SRALoaderFile_QualityScoringSystem( const SRALoaderFile *scelf, ExperimentQualityType* quality_scoring_system );
+
+/* FILE @quality_encoding */
+rc_t SRALoaderFile_QualityEncoding( const SRALoaderFile *cself, ExperimentQualityEncoding* quality_encoding );
+
+/* FILE @ascii_offset */
+rc_t SRALoaderFile_AsciiOffset( const SRALoaderFile *cself, uint8_t* ascii_offset );
+
+/* FILE @filetype */
+rc_t SRALoaderFile_FileType( const SRALoaderFile *cself, ERunFileType* filetype );
+
+/* Readline
+ * makes next line from a file available in buffer.
+ * eligable EOL symbols are: \n (unix), \r (older mac), \r\n (win)
+ * EOL symbol(s) never included in buffer length.
+ * if there is no EOL at EOF - not an error.
+ * fails if internal buffer is insufficient.
+ * buffer is NULL on EOF
+ * rc state of (rcString rcTooLong) means line was too long
+ * you may copy line and readline again for the tail of the line
+ *
+ * "buffer" [ OUT ] and "length" [ OUT ] - returned line and it's length
+ */
+rc_t SRALoaderFileReadline(const SRALoaderFile* cself, const void** buffer, size_t* length);
+
+/* Read
+* reads "size" bytes from file and makes them available through "buffer"
+* if "advance" is > 0 than before reading skips "advance" bytes in file
+* if "size" == 0 then nothing is read and available "length" bytes is returned in "buffer"
+*
+* "buffer" [ OUT ] - pointer to read bytes, "buffer" NULL means EOF
+* "length" [ OUT ] - number of read bytes, normally == size,
+ if less than requested size, rc is [rcBuffer,rcInsufficient], advance and read more!
+*/
+rc_t SRALoaderFileRead(const SRALoaderFile* cself, size_t advance, size_t size, const void** buffer, size_t* length);
+
+#endif /* _sra_load_file_ */
diff --git a/tools/sra-load/loader-fmt.c b/tools/sra-load/loader-fmt.c
new file mode 100644
index 0000000..2e11457
--- /dev/null
+++ b/tools/sra-load/loader-fmt.c
@@ -0,0 +1,165 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include "loader-fmt.h"
+
+rc_t SRALoaderFmtInit( SRALoaderFmt *self, const SRALoaderFmt_vt *vt )
+{
+ rc_t rc = 0;
+
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcSelf, rcNull);
+ } else if( vt == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcInterface, rcNull);
+ } else {
+ switch( vt->v1.maj ) {
+ case 0:
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcInterface, rcInvalid);
+ break;
+ case 1:
+ if( vt->v1.destroy == NULL || vt->v1.version == NULL ||
+ (vt->v1.write_data == NULL && vt->v1.exec_prep == NULL) ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcInterface, rcInvalid);
+ }
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcInterface, rcBadVersion);
+ break;
+ }
+ }
+ if( rc == 0 ) {
+ self->vt = vt;
+ } else if( KLogLastErrorCode() != rc ) {
+ PLOGERR( klogInt, (klogInt, rc, "failed to initialize loader formatter version $(maj).$(min)",
+ "maj=%u,min=%u", vt ? vt->v1.maj : 0, vt ? vt->v1.min : 0));
+ }
+ return rc;
+}
+
+rc_t SRALoaderFmtRelease ( const SRALoaderFmt *cself, SRATable** table )
+{
+ rc_t rc = 0;
+
+ if( cself != NULL ) {
+ SRALoaderFmt *self = (SRALoaderFmt*)cself;
+ switch( self->vt->v1.maj ) {
+ case 1:
+ rc = self->vt ->v1.destroy(self, table);
+ break;
+
+ default:
+ rc = RC(rcSRA, rcFormatter, rcDestroying, rcInterface, rcBadVersion);
+ PLOGERR( klogInt, (klogInt, rc, "failed to release loader formatter with interface version $(maj).$(min)",
+ "maj=%u,min=%u", self->vt->v1.maj, self->vt->v1.min));
+ break;
+ }
+ }
+ return rc;
+}
+
+rc_t SRALoaderFmtVersion ( const SRALoaderFmt *self, uint32_t *vers, const char** name )
+{
+ rc_t rc = 0;
+
+ if( self == NULL || vers == NULL || name == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcParam, rcNull);
+ } else {
+ *vers = 0;
+ *name = NULL;
+ switch( self->vt->v1.maj ) {
+ case 1:
+ rc = self->vt->v1.version(self, vers, name);
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcAccessing, rcInterface, rcBadVersion);
+ PLOGERR( klogInt, (klogInt, rc, "failed to read loader formatter version with interface version $(maj).$(min)",
+ "maj=%u,min=%u", self ? self->vt->v1.maj : 0, self ? self->vt->v1.min : 0));
+ break;
+ }
+ }
+ return rc;
+}
+
+rc_t SRALoaderFmtWriteData ( SRALoaderFmt *self, uint32_t argc, const SRALoaderFile *const argv [], int64_t* spots_bad_count )
+{
+ rc_t rc = 0;
+
+ if( self == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ } else if( argv == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcArgv, rcNull);
+ } else if( argc == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcArgv, rcEmpty);
+ } else if( spots_bad_count == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcParam, rcNull);
+ } else {
+ switch( self->vt->v1.maj ) {
+ case 1:
+ if( self->vt->v1.write_data == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcCreating, rcInterface, rcNull);
+ } else {
+ rc = self->vt->v1.write_data(self, argc, argv, spots_bad_count);
+ }
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcInterface, rcBadVersion);
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to load data with interface version $(maj).$(min)",
+ "maj=%u,min=%u", self ? self->vt->v1.maj : 0, self ? self->vt->v1.min : 0));
+ break;
+ }
+ }
+ return rc;
+}
+
+rc_t SRALoaderFmtExecPrep(const SRALoaderFmt *self, const TArgs* args, const SInput* input,
+ const char** path, const char* eargs[], size_t max_eargs)
+{
+ rc_t rc = 0;
+
+ if( self == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcCreating, rcSelf, rcNull);
+ } else if( args == NULL || input == NULL || path == NULL || eargs == NULL || max_eargs == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcCreating, rcParam, rcInvalid);
+ } else {
+ switch( self->vt->v1.maj ) {
+ case 1:
+ if( self->vt->v1.exec_prep == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcCreating, rcInterface, rcNull);
+ } else {
+ rc = self->vt->v1.exec_prep(self, args, input, path, eargs, max_eargs);
+ }
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcCreating, rcInterface, rcBadVersion);
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to load data with interface version $(maj).$(min)",
+ "maj=%u,min=%u", self ? self->vt->v1.maj : 0, self ? self->vt->v1.min : 0));
+ break;
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-load/loader-fmt.h b/tools/sra-load/loader-fmt.h
new file mode 100644
index 0000000..9ef888c
--- /dev/null
+++ b/tools/sra-load/loader-fmt.h
@@ -0,0 +1,171 @@
+/*=======================================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_loader_fmt_
+#define _sra_load_loader_fmt_
+
+#include <kfs/directory.h>
+#include <kapp/args.h>
+#include <kapp/log-xml.h>
+
+#include "loader-file.h"
+#include "experiment-xml.h"
+
+typedef struct ResultXML {
+ char *file;
+ char *name;
+ char *region;
+ char *sector;
+ char *member_name;
+} ResultXML;
+
+typedef struct ExpectedXML {
+ uint8_t number_of_results;
+ ResultXML **result;
+} ExpectedXML;
+
+typedef struct TArgs_struct {
+ const char *_runXmlPath;
+ const char* _input_path;
+ uint32_t _input_unpacked; /* as bool */
+ uint32_t _no_read_ahead; /* as bool */
+
+ const char *_experimentXmlPath;
+ const char *_target;
+ uint32_t _force_target; /* as bool */
+
+ int64_t _spots_to_run;
+ int64_t _spots_bad_allowed;
+ int _spots_bad_allowed_percentage;
+
+ const char* _expectedXmlPath;
+ int _intensities; /* trie state: 0 - default, 1 - on, 2 - off */
+
+ Args* args;
+ const XMLLogger* _xml_log;
+ RunXML* _run;
+ const KDirectory* _input_dir;
+ const ExperimentXML* _experiment;
+ const ExpectedXML* _expected;
+ SRAMgr* _sra_mgr;
+} TArgs;
+
+typedef struct SInput_struct {
+ struct {
+ const SRALoaderFile** files;
+ uint32_t count;
+ } *blocks;
+ uint32_t count;
+} SInput;
+
+/* Filter output columns */
+enum ESRAColumnFilter {
+ efltrINTENSITY = 0x01,
+ efltrNOISE = 0x02,
+ efltrSIGNAL = 0x04,
+ efltrDEFAULT = 0x08 /* if this bit is set FE must decide for itself ignoring other bits!! */
+};
+
+typedef struct SRALoaderConfig_struct {
+ /* if spots_to_run >= 0 then reader must stop after writing given number of spots */
+ int64_t spots_to_run;
+ int64_t spots_bad_allowed;
+ /* combination of SRAColumnFilter values. If the corresponding bit is set then the column should be skipped */
+ uint64_t columnFilter;
+ const ExperimentXML* experiment;
+ const char* table_path;
+ SRAMgr* sra_mgr;
+ bool force_table_overwrite;
+} SRALoaderConfig;
+
+
+typedef union SRALoaderFmt_vt SRALoaderFmt_vt;
+
+typedef struct SRALoaderFmt_struct {
+ const SRALoaderFmt_vt *vt;
+} SRALoaderFmt;
+
+#ifndef SRALOADERFMT_IMPL
+#define SRALOADERFMT_IMPL SRALoaderFmt
+#endif
+
+typedef struct SRALoaderFmt_vt_v1_struct {
+ /* version == 1.x */
+ uint32_t maj;
+ uint32_t min;
+
+ /* start minor version == 0 */
+ rc_t ( * destroy ) ( SRALOADERFMT_IMPL *self, SRATable** table );
+ rc_t ( * version ) ( const SRALOADERFMT_IMPL *self, uint32_t *vers, const char** name );
+ rc_t ( * exec_prep ) (const SRALOADERFMT_IMPL *self, const TArgs* args, const SInput* input,
+ const char** path, const char* eargs[], size_t max_eargs);
+ rc_t ( * write_data ) ( SRALOADERFMT_IMPL *self, uint32_t argc, const SRALoaderFile *const argv [], int64_t* spots_bad_count );
+ /* end minor version == 0 */
+
+} SRALoaderFmt_vt_v1;
+
+union SRALoaderFmt_vt {
+ SRALoaderFmt_vt_v1 v1;
+};
+
+/* Make
+ * allocate object based on SRALoaderFmt type and initialize it both using
+ * SRALoaderFmtInit and SRALoaderConfig data
+ */
+rc_t SRALoaderFmtMake( SRALoaderFmt **self, const SRALoaderConfig *config );
+
+/* Init
+ * initialize a newly allocated loader object
+ */
+rc_t SRALoaderFmtInit( SRALoaderFmt *self, const SRALoaderFmt_vt *vt);
+
+rc_t SRALoaderFmtRelease ( const SRALoaderFmt *self, SRATable** table );
+
+/* Version
+ * return 4-part version code: 0xMMmmrrrr, where
+ * MM = major release
+ * mm = minor release
+ * rrrr = bug-fix release
+ */
+rc_t SRALoaderFmtVersion ( const SRALoaderFmt *self, uint32_t *vers, const char** name );
+
+/* WriteData
+ * reader will parse data from input files and write them to table
+ * a row at a time.
+ *
+ * "table" [ IN ] - an open, writable table with no open columns.
+ * the reader should open columns with the appropriate data type
+ * based upon its format and input files as determined during construction
+ *
+ * "argc" [ IN ] and "argv" [ IN ] - input files positionally
+ * corresponding to information given in reader configuration
+ * data in XML node.
+ */
+rc_t SRALoaderFmtWriteData ( SRALoaderFmt *self, uint32_t argc, const SRALoaderFile *const argv [], int64_t* spots_bad_count );
+
+rc_t SRALoaderFmtExecPrep (const SRALoaderFmt *self, const TArgs* args, const SInput* input,
+ const char** path, const char* eargs[], size_t max_eargs);
+
+#endif /* _sra_load_loader_fmt_ */
diff --git a/tools/sra-load/loader.c b/tools/sra-load/loader.c
new file mode 100644
index 0000000..d721263
--- /dev/null
+++ b/tools/sra-load/loader.c
@@ -0,0 +1,1135 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <kxml/xml.h>
+#include <kfs/md5.h>
+#include <kfs/arc.h>
+#include <kfs/tar.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kdb/meta.h>
+#include <kapp/loader-meta.h>
+#include <sra/wsradb.h>
+
+#include <os-native.h>
+
+#include "debug.h"
+#include "loader-fmt.h"
+#include "run-xml.h"
+#include "experiment-xml.h"
+#include "loader-file.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+#include <limits.h>
+
+static KDirectory* s_Directory = NULL;
+static const KXMLMgr *s_XmlMgr = NULL;
+
+enum TArgsIndex {
+ targs_RunXML = 0,
+ targs_InputPath,
+ targs_InputUnpacked,
+ targs_InputNoCache,
+ targs_ExperimentXML,
+ targs_Target,
+ targs_ForceTarget,
+ targs_SpotsNumber,
+ targs_BadSpotsNumber,
+ targs_BadSpotPercentage,
+ targs_ExpectedXML,
+ targs_Intensities,
+ targs_ArgsQty
+};
+
+const char* usage_text[targs_ArgsQty][5] = {
+ { "path to run.xml describing input files", NULL },
+ { "input files location, default '.'", NULL },
+ { "input files are unpacked", NULL },
+ { "disable input files threaded caching", NULL },
+ { "path to experiment.xml", NULL },
+ { "target location", NULL },
+ { "force target overwrite", NULL },
+ { "process only given number of spots from input", NULL },
+ { "acceptable number of spot creation errors, default is 50", NULL },
+ { "acceptable percentage of spots creation errors, default is 5", NULL },
+ { "path to expected.xml", NULL },
+ { "[on | off] load intensity data, default is off. For ",
+ " Illumina: signal, intensity, noise;",
+ " AB SOLiD: signal(s);",
+ " LS454: signal, position (for SFF files this option is ON by default).", NULL },
+};
+
+OptDef TArgsDef[] =
+{
+ /* if you change order in this array, rearrange enum and usage_text above accordingly! */
+ {"run-xml", "r", NULL, usage_text[targs_RunXML], 1, true, true},
+ {"input-path", "i", NULL, usage_text[targs_InputPath], 1, true, false},
+ {"input-unpacked", "u", NULL, usage_text[targs_InputUnpacked], 1, false, false},
+ {"input-no-threads", "t", NULL, usage_text[targs_InputNoCache], 1, false, false},
+ {"experiment", "e", NULL, usage_text[targs_ExperimentXML], 1, true, true},
+ {"output-path", "o", NULL, usage_text[targs_Target], 1, true, true},
+ {"force", "f", NULL, usage_text[targs_ForceTarget], 1, false, false},
+ {"spots-number", "n", NULL, usage_text[targs_SpotsNumber], 1, true, false},
+ {"bad-spot-number", "bE", NULL, usage_text[targs_BadSpotsNumber], 1, true, false},
+ {"bad-spot-percentage", "p", NULL, usage_text[targs_BadSpotPercentage], 1, true, false},
+ {"expected", "x", NULL, usage_text[targs_ExpectedXML], 1, true, false},
+ {"intensities", "s", NULL, usage_text[targs_Intensities], 1, true, false}
+};
+
+rc_t CC UsageSummary (const char * progname)
+{
+ OUTMSG(( "\nUsage:\n\t%s [options] -r run.xml -e experiment.xml -o output-path\n\n", progname));
+ return 0;
+}
+
+rc_t Usage( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+ int i;
+
+ if(args == NULL) {
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ } else {
+ rc = ArgsProgram (args, &fullpath, &progname);
+ }
+ if(rc != 0 ) {
+ progname = fullpath = UsageDefaultName;
+ }
+ UsageSummary(progname);
+
+ for(i = 0; i < targs_ArgsQty; i++ ) {
+ if( TArgsDef[i].required && TArgsDef[i].help[0] != NULL ) {
+ HelpOptionLine(TArgsDef[i].aliases, TArgsDef[i].name, NULL, TArgsDef[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < targs_ArgsQty; i++ ) {
+ if( !TArgsDef[i].required && TArgsDef[i].help[0] != NULL ) {
+ HelpOptionLine(TArgsDef[i].aliases, TArgsDef[i].name, NULL, TArgsDef[i].help);
+ }
+ }
+ XMLLogger_Usage();
+ OUTMSG(("\n"));
+ HelpOptionsStandard();
+ HelpVersion(fullpath, KAppVersion());
+ return rc;
+}
+
+static
+rc_t TArgsParse(TArgs *args, int argc, char *argv[])
+{
+ rc_t rc = 0;
+ uint32_t count;
+ char* end = NULL;
+ const char* errmsg = NULL;
+ const char* spot_qty = NULL, *bad_spots = NULL;
+ const char *bad_percent = NULL, *intense = NULL;
+
+ assert(args && argv);
+
+ /* no parameters accepted */
+ if( (rc = ArgsParamCount(args->args, &count)) != 0 || count != 0 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcUnexpected);
+ ArgsParamValue(args->args, 0, (const void **)&errmsg);
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_RunXML].name, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = TArgsDef[targs_RunXML].name;
+ } else if( (rc = ArgsOptionValue(args->args, TArgsDef[targs_RunXML].name, 0, (const void **)&args->_runXmlPath)) != 0 ) {
+ errmsg = TArgsDef[targs_RunXML].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_ExperimentXML].name, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = TArgsDef[targs_ExperimentXML].name;
+ } else if( (rc = ArgsOptionValue(args->args, TArgsDef[targs_ExperimentXML].name, 0, (const void **)&args->_experimentXmlPath)) != 0 ) {
+ errmsg = TArgsDef[targs_ExperimentXML].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_Target].name, &count)) != 0 || count != 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, count ? rcExcessive : rcInsufficient);
+ errmsg = TArgsDef[targs_Target].name;
+ } else if( (rc = ArgsOptionValue(args->args, TArgsDef[targs_Target].name, 0, (const void **)&args->_target)) != 0 ) {
+ errmsg = TArgsDef[targs_Target].name;
+
+ /* optional */
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_InputPath].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_InputPath].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_InputPath].name, 0, (const void **)&args->_input_path)) != 0 ) {
+ errmsg = TArgsDef[targs_InputPath].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_InputUnpacked].name, &args->_input_unpacked)) != 0 ) {
+ errmsg = TArgsDef[targs_InputUnpacked].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_InputNoCache].name, &args->_no_read_ahead)) != 0 ) {
+ errmsg = TArgsDef[targs_InputNoCache].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_ForceTarget].name, &args->_force_target)) != 0 ) {
+ errmsg = TArgsDef[targs_ForceTarget].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_SpotsNumber].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_SpotsNumber].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_SpotsNumber].name, 0, (const void **)&spot_qty)) != 0 ) {
+ errmsg = TArgsDef[targs_SpotsNumber].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_BadSpotsNumber].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_BadSpotsNumber].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_BadSpotsNumber].name, 0, (const void **)&bad_spots)) != 0 ) {
+ errmsg = TArgsDef[targs_BadSpotsNumber].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_BadSpotPercentage].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_BadSpotPercentage].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_BadSpotPercentage].name, 0, (const void **)&bad_percent)) != 0 ) {
+ errmsg = TArgsDef[targs_BadSpotPercentage].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_ExpectedXML].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_ExpectedXML].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_ExpectedXML].name, 0, (const void **)&args->_expectedXmlPath)) != 0 ) {
+ errmsg = TArgsDef[targs_ExpectedXML].name;
+
+ } else if( (rc = ArgsOptionCount(args->args, TArgsDef[targs_Intensities].name, &count)) != 0 || count > 1 ) {
+ rc = rc ? rc : RC(rcExe, rcArgv, rcParsing, rcParam, rcExcessive);
+ errmsg = TArgsDef[targs_Intensities].name;
+ } else if( count > 0 && (rc = ArgsOptionValue(args->args, TArgsDef[targs_Intensities].name, 0, (const void **)&intense)) != 0 ) {
+ errmsg = TArgsDef[targs_Intensities].name;
+ }
+ while( rc == 0 ) {
+ long val = 0;
+ if( args->_input_path == NULL ) {
+ args->_input_path = "./";
+ if( (rc = KDirectoryAddRef(s_Directory)) == 0 ) {
+ args->_input_dir = s_Directory;
+ } else {
+ errmsg = TArgsDef[targs_InputPath].name;
+ break;
+ }
+ } else if( (rc = KDirectoryOpenDirRead(s_Directory, &args->_input_dir, true, args->_input_path)) != 0 ) {
+ errmsg = TArgsDef[targs_InputPath].name;
+ break;
+ }
+
+ if( spot_qty != NULL ) {
+ errno = 0;
+ val = strtol(spot_qty, &end, 10);
+ if( errno != 0 || spot_qty == end || *end != '\0' || val <= 0 ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ errmsg = TArgsDef[targs_SpotsNumber].name;
+ break;
+ }
+ args->_spots_to_run = val;
+ }
+ if( bad_spots != NULL ) {
+ errno = 0;
+ val = strtol(bad_spots, &end, 10);
+ if( errno != 0 || bad_spots == end || *end != '\0' || val < 0 ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ errmsg = TArgsDef[targs_BadSpotsNumber].name;
+ break;
+ }
+ args->_spots_bad_allowed = val;
+ }
+ if( bad_percent != NULL ) {
+ errno = 0;
+ val = strtol(bad_percent, &end, 10);
+ if( errno != 0 || bad_percent == end || *end != '\0' || val < 0 || val > 100 ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ errmsg = TArgsDef[targs_BadSpotPercentage].name;
+ break;
+ }
+ args->_spots_bad_allowed_percentage = val;
+ }
+ if( intense != NULL ) {
+ if( strcasecmp(intense, "on") == 0 ) {
+ args->_intensities = 1;
+ } else if( strcasecmp(intense, "off") == 0 ) {
+ args->_intensities = 2;
+ } else {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcInvalid);
+ errmsg = TArgsDef[targs_Intensities].name;
+ break;
+ }
+ }
+ break;
+ }
+ if( rc != 0 ) {
+ Usage(args->args);
+ LOGERR(klogErr, rc, errmsg ? errmsg : "check command line");
+ }
+ return rc;
+}
+
+static
+void TArgsRelease(const TArgs* cself)
+{
+ if(cself) {
+ TArgs* self = (TArgs*)cself;
+ RunXML_Whack(self->_run);
+ Experiment_Whack(self->_experiment);
+ KDirectoryRelease(self->_input_dir);
+ ArgsWhack(self->args);
+ SRAMgrRelease(self->_sra_mgr);
+ XMLLogger_Release(self->_xml_log);
+ free(self);
+ }
+}
+
+static
+rc_t TArgsMake(TArgs **args, int argc, char *argv[])
+{
+ rc_t rc = 0;
+ TArgs* r;
+
+ assert(args && argv);
+
+ if( (r = calloc(1, sizeof(*r))) == NULL) {
+ rc = RC(rcExe, rcArgv, rcAllocating, rcMemory, rcExhausted);
+ } else if( (rc = ArgsMakeAndHandle(&r->args, argc, argv, 2, TArgsDef, targs_ArgsQty, XMLLogger_Args, XMLLogger_ArgsQty)) == 0 &&
+ (rc = XMLLogger_Make(&r->_xml_log, s_Directory, r->args)) == 0 ) {
+ r->_force_target = false;
+ r->_spots_to_run = -1;
+ r->_spots_bad_allowed = 50;
+ r->_spots_bad_allowed_percentage = 5;
+ r->_input_unpacked = false;
+ if( argc > 1 ) {
+ rc = TArgsParse(r, argc, argv);
+ } else {
+ MiniUsage(r->args);
+ exit(0);
+ }
+ }
+ if( rc == 0 ) {
+ *args = r;
+ } else {
+ TArgsRelease(r);
+ *args = NULL;
+ }
+ return rc;
+}
+
+static rc_t read_required_node_data_cstr(const KXMLNode *node,
+ const char *attr, char **string)
+{
+ rc_t rc = attr == NULL ?
+ KXMLNodeReadCStr(node, string, NULL) :
+ KXMLNodeReadAttrCStr(node, attr, string, NULL);
+
+ if (rc && GetRCState(rc) == rcNotFound) {
+ const char *name = NULL;
+ if( (rc = KXMLNodeElementName(node, &name)) == 0 ) {
+ if (attr == NULL) {
+ PLOGERR(klogErr, (klogErr, rc, "XML node $(name)", "name=%s", name));
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "XML attribute $(name)/@$(attr)",
+ "name=%s,attr=%s", name, attr));
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t read_optional_node_data_cstr(const KXMLNode *node,
+ const char *attr, char **string)
+{
+ rc_t rc = attr == NULL ?
+ KXMLNodeReadCStr(node, string, NULL) :
+ KXMLNodeReadAttrCStr(node, attr, string, "");
+
+ if (rc) {
+ if (GetRCState(rc) == rcNotFound) {
+ rc = 0;
+ }
+ else {
+ const char *name = NULL;
+ if( (rc = KXMLNodeElementName(node, &name)) == 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "XML attribute $(name)/@$(attr)",
+ "name=%s,attr=%s", name, attr));
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t ResultXML_make(ResultXML **rslt, const KXMLNode *Result)
+{
+ rc_t rc = 0;
+ ResultXML *r = NULL;
+
+ assert(rslt && Result);
+
+ r = calloc(1, sizeof *r);
+ if (r == NULL) {
+ rc = RC(rcExe, rcXmlDoc, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ if (rc == 0) {
+ rc = read_required_node_data_cstr(Result, "file", &r->file);
+ }
+
+ if (rc == 0) {
+ rc = read_required_node_data_cstr(Result, "name", &r->name);
+ }
+
+ if (rc == 0) {
+ rc = read_required_node_data_cstr(Result, "sector", &r->sector);
+ }
+
+ if (rc == 0) {
+ rc = read_required_node_data_cstr(Result, "region", &r->region);
+ }
+
+ if (rc == 0) {
+ rc = read_optional_node_data_cstr(Result, "member_name", &r->member_name);
+ }
+
+ if (rc) {
+ free(r);
+ }
+ else {
+ *rslt = r;
+ }
+
+ return rc;
+}
+
+static rc_t ExpectedXMLWhack(const ExpectedXML *r)
+{
+ return 0;
+}
+
+static rc_t ExpectedXMLMake(const ExpectedXML **rslt,
+ const KXMLNode *Expected)
+{
+ rc_t rc = 0;
+ const KXMLNodeset *Results = NULL;
+ if (rslt == NULL) {
+ return RC(rcExe, rcXmlDoc, rcConstructing, rcParam, rcNull);
+ }
+ *rslt = NULL;
+ if (Expected == NULL) {
+ return RC(rcExe, rcXmlDoc, rcConstructing, rcParam, rcNull);
+ }
+ rc = KXMLNodeOpenNodesetRead(Expected, &Results, "Result");
+ if (rc == 0) {
+ ExpectedXML *r = calloc(1, sizeof *r);
+ if (r == NULL) {
+ rc = RC(rcExe, rcXmlDoc, rcAllocating, rcMemory, rcExhausted);
+ }
+ else {
+ uint32_t num = 0;
+ rc = KXMLNodesetCount(Results, &num);
+ if (rc == 0 && num > 0) {
+ r->number_of_results = num;
+ r->result = calloc(1, num * sizeof r->result[0]);
+ if (r->result == NULL) {
+ rc = RC(rcExe, rcXmlDoc, rcAllocating, rcMemory, rcExhausted);
+ free(r);
+ }
+ else {
+ int i = 0;
+ for (i = 0; rc == 0 && i < num; ++i) {
+ const KXMLNode *Result = NULL;
+ rc = KXMLNodesetGetNodeRead(Results, &Result, i);
+ if (rc == 0) {
+ rc = ResultXML_make(&r->result[i], Result);
+ }
+ }
+ if (rc == 0) {
+ *rslt = r;
+ }
+ else {
+ ExpectedXMLWhack(r);
+ }
+ }
+ }
+ }
+ }
+ else if (GetRCState(rc) != rcNotFound) {
+ LOGERR(klogErr, rc, "Cannot read Result node");
+ }
+ return rc;
+}
+
+static rc_t s_KXMLDocMake(const KXMLDoc **doc, const char *path)
+{
+ rc_t rc = 0;
+ const KFile *file = NULL;
+ if (doc == NULL || path == NULL) {
+ return RC(rcExe, rcXmlDoc, rcConstructing, rcParam, rcNull);
+ }
+ if (rc == 0) {
+ rc = KDirectoryOpenFileRead(s_Directory, &file, "%s", path);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc, "Cannot open file $(file)", "file=%s", path));
+ }
+ }
+ if (rc == 0) {
+ rc = KXMLMgrMakeDocRead(s_XmlMgr, doc, file);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc, "Cannot make XML document from $(file)",
+ "file=%s", path));
+ }
+ }
+ KFileRelease(file);
+ return rc;
+}
+
+static rc_t KXMLNodeMakeFromDoc(const KXMLNode **node, const KXMLDoc *doc,
+ const char *root)
+{
+ rc_t rc = 0;
+ const KXMLNodeset *ns = NULL;
+ if (node == NULL || doc == NULL || root == NULL) {
+ return RC(rcExe, rcXmlDoc, rcConstructing, rcParam, rcNull);
+ }
+ if (rc == 0) {
+ rc = KXMLDocOpenNodesetRead(doc, &ns, root);
+ }
+ if (rc == 0) {
+ uint32_t count = 0;
+ rc = KXMLNodesetCount(ns, &count);
+ if (rc == 0) {
+ if (count == 0) {
+ rc = RC(rcExe, rcXmlDoc, rcReading, rcNode, rcNotFound);
+ PLOGERR(klogErr, (klogErr, rc, "$(path)", "path=%s", root));
+ }
+ else if (count > 1) {
+ rc = RC(rcExe, rcXmlDoc, rcParsing, rcData, rcExcessive);
+ PLOGERR(klogErr, (klogErr, rc,
+ "too many data $(node) nodes", "node=%s", root));
+ }
+ }
+ }
+ if (rc == 0) {
+ rc = KXMLNodesetGetNodeRead(ns, node, 0);
+ }
+ KXMLNodesetRelease(ns);
+ return rc;
+}
+
+static rc_t KXMLNodeMakeFromFile(const KXMLNode **node, const char *path,
+ const char *root)
+{
+ rc_t rc = 0;
+ const KXMLDoc *doc = NULL;
+ const char *rootPath = "/";
+ if (node == NULL || path == NULL) {
+ return RC(rcExe, rcXmlDoc, rcConstructing, rcParam, rcNull);
+ }
+ rc = s_KXMLDocMake(&doc, path);
+ if (rc == 0) {
+ if (root != NULL) {
+ rootPath = root;
+ }
+ rc = KXMLNodeMakeFromDoc(node, doc, rootPath);
+ }
+ KXMLDocRelease(doc);
+ return rc;
+}
+
+static
+rc_t TArgsParseRunXml(TArgs *args)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+ const KXMLDoc *doc = NULL;
+ assert(args);
+ if (args->_runXmlPath == NULL) {
+ return rc;
+ }
+ if (rc == 0) {
+ rc = s_KXMLDocMake(&doc, args->_runXmlPath);
+ }
+ if (rc == 0) {
+ rc= KXMLNodeMakeFromDoc(&node, doc, "/RUN_SET/RUN | /RUN");
+ }
+ if (rc == 0) {
+ rc = RunXML_Make(&args->_run, node);
+ }
+ KXMLNodeRelease(node);
+ KXMLDocRelease(doc);
+ return rc;
+}
+
+static rc_t TArgsParseExpectedXml(TArgs *self)
+{
+ rc_t rc = 0;
+ const KXMLNode *node = NULL;
+ assert(self);
+ if (self->_expectedXmlPath == NULL) {
+ return rc;
+ }
+ if (rc == 0) {
+ rc = KXMLNodeMakeFromFile(&node, self->_expectedXmlPath, "//Expected");
+ }
+ if (rc == 0) {
+ rc = ExpectedXMLMake(&self->_expected, node);
+ }
+ KXMLNodeRelease(node);
+ return rc;
+}
+
+static rc_t TArgsParseXmls(TArgs *self)
+{
+ rc_t rc = 0;
+ const KXMLDoc *doc = NULL;
+
+ if( (rc = TArgsParseRunXml(self)) == 0 &&
+ (rc = s_KXMLDocMake(&doc, self->_experimentXmlPath)) == 0 &&
+ (rc = Experiment_Make(&self->_experiment, doc, &self->_run->attributes)) == 0 ) {
+ rc = TArgsParseExpectedXml(self);
+ }
+ KXMLDocRelease(doc);
+ return rc;
+}
+
+static rc_t TArgsLogResultTotal(const TArgs *self, rc_t status, uint64_t spotCount, uint64_t baseCount, int64_t bad_spot_count)
+{
+ rc_t rc = 0;
+ int i = 0;
+ const char* accession, *state;
+ KLogLevel tmp_lvl;
+
+ if (self == NULL) {
+ return rc;
+ }
+
+ accession = strrchr(self->_target, '/');
+ if( accession == NULL ) {
+ accession = self->_target;
+ } else {
+ accession++;
+ }
+ state = status == 0 ? "success" : "failure";
+ /* raise log level in order to print stats */
+ tmp_lvl = KLogLevelGet();
+ KLogLevelSet(klogInfo);
+ for(i = 0; self->_expected != NULL && i < self->_expected->number_of_results && rc == 0; i++) {
+ ResultXML *f = self->_expected->result[i];
+ PLOGMSG(klogInfo, (klogInfo, "loaded",
+ "severity=result,status=%s,accession=%s,spot_count=%lu,base_count=%lu,"
+ "file=%s,name=%s,region=%s,sector=%s,member_name=%s",
+ state, accession, spotCount, baseCount,
+ f->file, f->name, f->region, f->sector, f->member_name ? f->member_name : ""));
+ }
+ if(status == 0) {
+ PLOGMSG(klogInfo, (klogInfo, "loaded",
+ "severity=total,status=%s,accession=%s,spot_count=%lu,base_count=%lu,bad_spots=%ld",
+ state, accession, spotCount, baseCount, bad_spot_count));
+ } else {
+ PLOGERR(klogErr, (klogErr, status, "load failed: $(reason_short)",
+ "severity=total,status=%s,accession=%s",
+ state, accession));
+ }
+ KLogLevelSet(tmp_lvl);
+ return rc;
+}
+
+static
+void SInput_Release(const SInput* cself)
+{
+ if(cself) {
+ SInput* self = (SInput*)cself;
+ uint32_t i;
+ for(i = 0; i < self->count; i++) {
+ /* actual files must be released elsewhere */
+ free(self->blocks[i].files);
+ }
+ free(self->blocks);
+ free(self);
+ }
+}
+
+typedef struct SInputOpen_TarVisitData_struct {
+ uint32_t alloc;
+ char** files;
+ uint32_t count;
+
+} SInputOpen_TarVisitData;
+
+static
+rc_t SInputOpen_TarVisit(const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ rc_t rc = 0;
+
+ if( type == kptFile ) {
+ SInputOpen_TarVisitData* d = (SInputOpen_TarVisitData*)data;
+
+ if( d->alloc <= d->count ) {
+ void* p;
+ d->alloc = d->files == NULL ? 1024 : (d->alloc * 2);
+ if( (p = realloc(d->files, d->alloc * sizeof(*d->files))) == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ d->files = p;
+ }
+ }
+ if( rc == 0 ) {
+ char buf[1024];
+ if( (rc = KDirectoryResolvePath(dir, true, buf, sizeof(buf), "%s", name)) == 0 ) {
+ d->files[d->count++] = strdup(buf);
+ if( d->files[d->count - 1] == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SInputOpen(const SInput **cself, TArgs *args)
+{
+ rc_t rc = 0;
+ SInput *self = calloc(1, sizeof(*self));
+ uint32_t file_qty = 0;
+
+ if(self == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ self->blocks = calloc(args->_run->datablock_count, sizeof(*(self->blocks)));
+ if(self->blocks == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ uint32_t i, ccdirs_qty = 0;
+ struct {
+ const char* uid;
+ const KDirectory* xdir;
+ } ccdirs[1024];
+
+ memset(ccdirs, 0, sizeof(ccdirs));
+ self->count = args->_run->datablock_count;
+ for(i = 0; rc == 0 && i < self->count; i++) {
+ const DataBlock* b = &args->_run->datablocks[i];
+ uint32_t f, j;
+ char fname[10240];
+
+ self->blocks[i].files = calloc(b->files_count, sizeof(*(self->blocks->files)));
+ if(self->blocks == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ continue;
+ }
+ self->blocks[i].count = b->files_count;
+ for(f = 0, j = 0; rc == 0 && j < b->files_count; j++ ) {
+ int fnlen = strlen(b->files[j].filename);
+ if( b->files[j].cc_xml != NULL ) {
+ const KDirectory* fdir = args->_input_dir;
+ if( !args->_input_unpacked ) {
+ uint32_t cd;
+ for(cd = 0; cd < ccdirs_qty; cd++) {
+ if( strcmp(ccdirs[cd].uid, b->files[j].cc_xml) == 0 ) {
+ break;
+ }
+ }
+ if( cd >= ccdirs_qty ) {
+ const KFile* kf = NULL;
+ if( ccdirs_qty + 1 > sizeof(ccdirs) / sizeof(ccdirs[0]) ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcNamelist, rcTooLong);
+ } else if( (rc = KDirectoryOpenFileRead(args->_input_dir, &kf, "%s.xml", b->files[j].cc_xml)) == 0) {
+ char base_path[4096];
+ int r = snprintf(base_path, sizeof base_path, "%s/", b->files[j].cc_xml);
+ if (r >= sizeof base_path) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcFile, rcTooLong);
+ } else if ((rc = KDirectoryOpenXTocDirRead(args->_input_dir, &ccdirs[ccdirs_qty].xdir, false, kf, "%s", base_path)) == 0 ) {
+ cd = ccdirs_qty++;
+ ccdirs[cd].uid = b->files[j].cc_xml;
+ KFileRelease(kf);
+ }
+ }
+ }
+ fdir = ccdirs[cd].xdir;
+ }
+ if( rc == 0 ) {
+ char* fn = strdup(b->files[j].cc_path);
+ if( fn == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ rc = SRALoaderFile_Make(&self->blocks[i].files[f++], fdir, fn, b, &b->files[j].attr,
+ NULL, !args->_no_read_ahead);
+ file_qty++;
+ free(fn);
+ }
+ }
+ continue;
+ }
+ if( fnlen >= sizeof(fname) ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcFile, rcTooLong);
+ PLOGERR(klogErr, (klogErr, rc, "$(file)", PLOG_S(file), b->files[j].filename));
+ continue;
+ }
+ strcpy(fname, b->files[j].filename);
+ /* compressed archives supposed to be decompressed beforehand */
+ if( fnlen > 7 && strcmp(&fname[fnlen - 7], ".tar.gz") == 0 ) {
+ fnlen -= 3;
+ fname[fnlen] = '\0';
+ } else if( fnlen > 4 && strcmp(&fname[fnlen - 4], ".tgz") == 0 ) {
+ fname[fnlen - 2] = 'a';
+ fname[fnlen - 1] = 'r';
+ } else if( fnlen > 7 && strcmp(&fname[fnlen - 7], ".tar.bz2") == 0 ) {
+ fnlen -= 4;
+ fname[fnlen] = '\0';
+ }
+ if( strcmp(&fname[fnlen - 4], ".tar") == 0 ) {
+ const KDirectory* tar;
+ if( (rc = KDirectoryOpenArcDirRead(args->_input_dir, &tar, true, fname,
+ tocKFile, KArcParseTAR, NULL, NULL)) == 0 ) {
+ uint32_t k;
+ void* p;
+ SInputOpen_TarVisitData data = {0, NULL, 0};
+
+ if( (rc = KDirectoryVisit(tar, true, SInputOpen_TarVisit, &data, ".")) != 0 ) {
+ continue;
+ }
+ if( data.count == 0 ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcFile, rcEmpty);
+ PLOGERR(klogErr,(klogErr, rc, "Empty tar $(file)", PLOG_S(file), fname));
+ continue;
+ }
+ self->blocks[i].count += data.count - 1; /* minus tar file */
+ p = realloc(self->blocks[i].files, self->blocks[i].count * sizeof(*(self->blocks->files)));
+ if( p == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ continue;
+ }
+ self->blocks[i].files = p;
+ for(k = 0; k < data.count; k++) {
+ rc = SRALoaderFile_Make(&self->blocks[i].files[f++], tar, data.files[k], b, &b->files[j].attr,
+ NULL, !args->_no_read_ahead);
+ file_qty++;
+ }
+ free(data.files);
+ KDirectoryRelease(tar);
+ }
+ } else {
+ char* fn = strdup(fname);
+ if( fn == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ rc = SRALoaderFile_Make(&self->blocks[i].files[f++], args->_input_dir, fn, b, &b->files[j].attr,
+ b->files[j].md5_digest, !args->_no_read_ahead);
+ file_qty++;
+ free(fn);
+ }
+ }
+ }
+ }
+ for(i = 0; i < ccdirs_qty; i++) {
+ KDirectoryRelease(ccdirs[i].xdir);
+ }
+ }
+ }
+ if( rc == 0 && file_qty < 1 ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "no files to load");
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ SInput_Release(self);
+ }
+ return rc;
+}
+
+static
+rc_t WriteSoftwareVersionsMeta(SRATable* table, const char *argv0, uint32_t fe_version, const char* fe_name)
+{
+ rc_t rc = 0;
+ KMDataNode *node = NULL;
+
+ assert(table);
+
+ if( (rc = SRATableOpenMDataNodeUpdate(table, &node, "/")) == 0 ) {
+ rc = KLoaderMeta_Write(node, argv0, __DATE__, fe_name, fe_version);
+ }
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "Cannot update loader meta");
+ }
+ KMDataNodeRelease(node);
+ return rc;
+}
+
+rc_t KMain(int argc, char *argv[])
+{
+ rc_t rc = 0, lastRc = 0;
+
+ TArgs *args = NULL;
+ const SInput *input = NULL;
+ SRATable* table = NULL;
+ SRALoaderFmt* fe = NULL;
+
+ SRALoaderConfig feInput;
+ memset(&feInput, 0, sizeof feInput);
+
+ /* Initialize statics */
+ if (rc == 0) {
+ rc = KDirectoryNativeDir(&s_Directory);
+ }
+ /* Parse command line arguments */
+ if (rc == 0) {
+ rc = TArgsMake(&args, argc, argv);
+ }
+ if( rc == 0 &&
+ (rc = SRAMgrMakeUpdate(&args->_sra_mgr, NULL)) == 0 &&
+ (rc = SRAMgrSetMD5Mode(args->_sra_mgr, true)) == 0 ) {
+ rc = KXMLMgrMakeRead(&s_XmlMgr);
+ }
+ if( rc == 0 && (rc = TArgsParseXmls(args)) == 0) {
+ if( args->_intensities == 2 ) {
+ feInput.columnFilter = efltrINTENSITY | efltrNOISE | efltrSIGNAL;
+ } else if( args->_intensities == 1 ) {
+ feInput.columnFilter = 0;
+ } else {
+ feInput.columnFilter = efltrDEFAULT;
+ }
+ feInput.spots_to_run = args->_spots_to_run;
+ feInput.spots_bad_allowed = args->_spots_bad_allowed;
+ feInput.experiment = args->_experiment;
+ feInput.sra_mgr = args->_sra_mgr;
+ feInput.table_path = args->_target;
+ feInput.force_table_overwrite = args->_force_target;
+
+ rc = SRALoaderFmtMake(&fe, &feInput);
+ }
+ if (rc == 0) {
+ rc = SInputOpen(&input, args);
+ }
+ if(rc == 0) {
+ if( fe->vt->v1.exec_prep ) {
+ const char* efile = NULL;
+ const char* eargs[64];
+ uint32_t i = 1, j, qty = 0, x = 0;
+ char extra[1024];
+
+ eargs[i++] = "-L";
+ eargs[i++] = KLogGetParamStrings()[KLogLevelGet()];
+ qty = KStsLevelGet();
+ while(qty-- > 0 ) {
+ eargs[i++] = "-v";
+ }
+#if _DEBUGGING
+ if( ArgsOptionCount(args->args, "+", &qty) == 0 ) {
+ uint32_t j;
+ for(j = 0; j < qty; j++) {
+ const char* v;
+ if( ArgsOptionValue(args->args, "+", j, (const void **)&v) == 0 ) {
+ eargs[i++] = "-+";
+ eargs[i++] = v;
+ }
+ }
+ }
+ if( ArgsOptionCount(args->args, "debug", &qty) == 0) {
+ uint32_t j;
+ for(j = 0; j < qty; j++) {
+ const char* v;
+ if( ArgsOptionValue(args->args, "debug", j, (const void **)&v) == 0 ) {
+ eargs[i++] = "-+";
+ eargs[i++] = v;
+ }
+ }
+ }
+#endif
+ for(j = 0; j < XMLLogger_ArgsQty; j++) {
+ const char* v;
+ if( XMLLogger_Args[j].aliases != NULL &&
+ ArgsOptionCount(args->args, XMLLogger_Args[j].aliases, &qty) == 0 &&
+ qty > 0 &&
+ ArgsOptionValue(args->args, XMLLogger_Args[j].aliases, 0, (const void **)&v) == 0 ) {
+ eargs[i++] = &extra[x];
+ extra[x++] = '-';
+ extra[x++] = '-';
+ strcpy(&extra[x], XMLLogger_Args[j].name);
+ x += strlen(XMLLogger_Args[j].name);
+ eargs[i++] = v;
+ } else if( XMLLogger_Args[j].name != NULL &&
+ ArgsOptionCount(args->args, XMLLogger_Args[j].name, &qty) == 0 &&
+ qty > 0 &&
+ ArgsOptionValue(args->args, XMLLogger_Args[j].name, 0, (const void **)&v) == 0 ) {
+ eargs[i++] = &extra[x];
+ extra[x++] = '-';
+ extra[x++] = '-';
+ strcpy(&extra[x], XMLLogger_Args[j].name);
+ x += strlen(XMLLogger_Args[j].name);
+ eargs[i++] = v;
+ }
+
+ }
+ eargs[i] = NULL;
+
+ if( (rc = SRALoaderFmtExecPrep(fe, args, input, &efile, eargs + i, sizeof(eargs) / sizeof(eargs[0]) - i)) == 0 ) {
+ eargs[0] = efile;
+#if _DEBUGGING
+ DEBUG_MSG(3, ("execv: '%s", efile));
+ for(i = 0; eargs[i] != NULL; i++) {
+ DEBUG_MSG(3, (" %s", eargs[i]));
+ }
+ DEBUG_MSG(3, ("'\n"));
+#endif
+ execv(efile, (char* const*)eargs);
+ rc = RC(rcExe, rcFormatter, rcExecuting, rcInterface, rcFailed);
+ PLOGERR(klogErr, (klogErr, rc, "front-end exec: $(errno)", "errno=%s", strerror(errno)));
+ }
+ } else {
+ rc_t rc2 = 0;
+ uint64_t spotCount = 0;
+ uint64_t numBases = 0;
+ int64_t bad_spot_count = 0;
+ uint32_t fe_vers = 0;
+ const char* fe_name;
+
+ rc = SRALoaderFmtVersion(fe, &fe_vers, &fe_name);
+ if(rc == 0) {
+ uint32_t i, j;
+ for(i = 0; rc == 0 && i < input->count; i++) {
+ rc = SRALoaderFmtWriteData(fe, input->blocks[i].count, input->blocks[i].files, &bad_spot_count);
+ for(j = 0; j < input->blocks[i].count; j++) {
+ bool eof = true;
+ if( rc == 0 && SRALoaderFile_IsEof(input->blocks[i].files[j], &eof) == 0 ) {
+ if( args->_spots_to_run < 0 && eof != true ) {
+ const char* fn;
+ SRALoaderFileName(input->blocks[i].files[j], &fn);
+ rc2 = RC(rcExe, rcFormatter, rcReading, rcFile, rcExcessive);
+ PLOGERR(klogErr, (klogErr, rc2, "File $(file) not completely parsed", PLOG_S(file), fn));
+ }
+ }
+ SRALoaderFile_Release(input->blocks[i].files[j]);
+ }
+ if( GetRCObject(rc) == rcTransfer && GetRCState(rc) == rcDone ) {
+ /* interrupted by requested spot count */
+ rc = 0;
+ break;
+ }
+ rc = rc ? rc : rc2;
+ }
+ }
+ /* release object to make sure it free's it's data and commits */
+ rc2 = SRALoaderFmtRelease(fe, &table);
+ rc = rc ? rc : rc2;
+ fe = NULL;
+
+ if( rc == 0 && table != NULL ) {
+ /* Write versions */
+ if (rc == 0) {
+ rc = WriteSoftwareVersionsMeta(table, argv[0], fe_vers, fe_name);
+ }
+ if (rc == 0) {
+ rc = SRATableCommit(table);
+ if( GetRCObject(rc) == (enum RCObject)rcCursor && GetRCState(rc) == rcNotOpen ) {
+ rc = 0;
+ }
+ }
+ if (rc == 0) {
+ rc = SRATableSpotCount(table, &spotCount);
+ if (rc == 0) {
+ rc = SRATableBaseCount(table, &numBases);
+ }
+ if(rc == 0) {
+ if(spotCount > 0) {
+ double percentage = ((double)bad_spot_count) / spotCount;
+ double allowed = args->_spots_bad_allowed_percentage / 100.0;
+ if(percentage > allowed ||
+ (feInput.spots_bad_allowed >= 0 && bad_spot_count > feInput.spots_bad_allowed)) {
+ rc = RC(rcExe, rcTable, rcClosing, rcData, rcInvalid);
+ PLOGERR(klogErr,
+ (klogErr, rc,
+ "Too many bad spots: "
+ "spots: $(spots), bad spots: $(bad_spots), "
+ "bad spots percentage: $(percentage), "
+ "allowed percentage: $(allowed), "
+ "allowed count: $(bad_allowed)",
+ "spots=%d,bad_spots=%li,percentage=%.2f,allowed=%.2f,bad_allowed=%li",
+ spotCount, bad_spot_count,
+ percentage, allowed, feInput.spots_bad_allowed));
+ }
+ }
+ }
+ }
+ if( rc == 0) {
+ rc = SRATableRelease(table);
+ table = NULL;
+ }
+ }
+ if(rc == 0) {
+ if(spotCount == 0) {
+ rc = RC(rcExe, rcFormatter, rcClosing, rcTable, rcEmpty);
+ LOGERR(klogErr, rc, "0 spots were loaded after successful front-end run");
+ }
+ }
+ rc2 = TArgsLogResultTotal(args, rc, spotCount, numBases, bad_spot_count);
+ rc = rc ? rc : rc2;
+ }
+
+ if( rc != 0 ) {
+ if( table ) {
+ rc_t status = SRATableRelease(table);
+ table = NULL;
+ if(status == 0) {
+ /* should go away as soon as cursor transactions are in place */
+ status = SRAMgrDropTable(args->_sra_mgr, true, args->_target);
+ }
+ if(status != 0) {
+ lastRc = KLogLastErrorCode();
+ LOGERR(klogInt, status, "cannot DropRun after load failure");
+ }
+ }
+ }
+ }
+
+ /* make sure the error was reported */
+ if( rc != 0 &&
+ rc != SILENT_RC(rcExe, rcProcess, rcExecuting, rcProcess, rcCanceled) &&
+ rc != SILENT_RC(rcExe, rcProcess, rcExecuting, rcTransfer, rcDone)) {
+ if (lastRc == 0) {
+ lastRc = KLogLastErrorCode();
+ }
+ if (rc != lastRc) {
+ LOGERR(klogInt, rc, "no message text available");
+ }
+ }
+ SInput_Release(input);
+ SRALoaderFmtRelease(fe, NULL);
+ TArgsRelease(args);
+ KDirectoryRelease(s_Directory);
+ KXMLMgrRelease(s_XmlMgr);
+
+ return rc;
+}
diff --git a/tools/sra-load/pacbio-fmt.c b/tools/sra-load/pacbio-fmt.c
new file mode 100644
index 0000000..fb51c8c
--- /dev/null
+++ b/tools/sra-load/pacbio-fmt.c
@@ -0,0 +1,141 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+#include <os-native.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+
+typedef struct PacBioLoaderXmlFmt PacBioLoaderXmlFmt;
+#define SRALOADERFMT_IMPL PacBioLoaderXmlFmt
+#include "loader-fmt.h"
+
+#include "debug.h"
+
+struct PacBioLoaderXmlFmt {
+ SRALoaderFmt dad;
+};
+
+static
+rc_t PacBioLoaderXmlFmt_ExecPrep(const PacBioLoaderXmlFmt *self, const TArgs* args, const SInput* input,
+ const char** path, const char* eargs[], size_t max_eargs)
+{
+ rc_t rc = 0;
+ uint32_t i = 0;
+ ERunFileType type = rft_Unknown;
+
+ *path = "pacbio-load";
+
+ /* accept only single file submissions */
+ if( input->count != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcExecuting, rcParam, input->count ? rcExcessive : rcInsufficient);
+ } else if( input->blocks[0].count != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcExecuting, rcParam, input->blocks[0].count ? rcExcessive : rcInsufficient);
+ } else if( (rc = SRALoaderFile_FileType(input->blocks[0].files[0], &type)) == 0 && type != rft_PacBio_HDF5 ) {
+ rc = RC(rcSRA, rcFormatter, rcExecuting, rcFormat, rcUnsupported);
+ } else {
+ char resolved[4096];
+ size_t il = string_copy_measure(resolved, sizeof(resolved), args->_input_path);
+ resolved[il++] = '/';
+ if( (rc = SRALoaderFileResolveName(input->blocks[0].files[0], &resolved[il], sizeof(resolved) - il)) == 0 ) {
+ eargs[i] = strdup(resolved);
+ if( eargs[i++] == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcExecuting, rcMemory, rcExhausted);
+ }
+ }
+ if( rc == 0 ) {
+ eargs[i++] = "-o";
+ eargs[i++] = args->_target;
+
+ if( args->_force_target ) {
+ eargs[i++] = "-f";
+ }
+ eargs[i] = NULL;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t PacBioLoaderXmlFmt_Whack(PacBioLoaderXmlFmt *self, SRATable** table)
+{
+ free(self);
+ return 0;
+}
+
+const char UsageDefaultName[] = "pacbio-loadxml";
+
+static
+rc_t PacBioLoaderXmlFmt_Version (const PacBioLoaderXmlFmt* self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "PacBioXml";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 vtPacBioLoaderXmlFmt =
+{
+ 1, 0,
+ PacBioLoaderXmlFmt_Whack,
+ PacBioLoaderXmlFmt_Version,
+ PacBioLoaderXmlFmt_ExecPrep,
+ NULL
+};
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ const PlatformXML* platform;
+
+ if( self == NULL || config == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ } else if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ } else if( platform->id != SRA_PLATFORM_PACBIO_SMRT ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcInvalid);
+ LOGERR(klogInt, rc, "platform type");
+ } else {
+ PacBioLoaderXmlFmt* fmt;
+
+ *self = NULL;
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&vtPacBioLoaderXmlFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ PacBioLoaderXmlFmt_Whack(fmt, NULL);
+ } else {
+ *self = &fmt->dad;
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-load/pstring.c b/tools/sra-load/pstring.c
new file mode 100644
index 0000000..6966393
--- /dev/null
+++ b/tools/sra-load/pstring.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/wsradb.h>
+#include <sra/types.h>
+
+#include "common-xml.h"
+#include "pstring.h"
+#include "debug.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+rc_t pstring_clear(pstring* str)
+{
+ if( str == NULL ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcParam, rcNull);
+ }
+ str->data[0] = '\0';
+ str->len = 0;
+ return 0;
+}
+
+
+rc_t pstring_copy(pstring* dst, const pstring* src)
+{
+ if( src == NULL ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcParam, rcNull);
+ }
+ return pstring_assign(dst, src->data, src->len);
+}
+
+rc_t pstring_assign(pstring* str, const void* data, const size_t data_sz)
+{
+ if( str == NULL || data == NULL ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcParam, rcNull);
+ } else if( data_sz > sizeof(str->data) - 1 ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcBuffer, rcInsufficient);
+ }
+ memmove(str->data, data, data_sz);
+ str->len = data_sz;
+ str->data[str->len] = '\0';
+ return 0;
+}
+
+rc_t pstring_concat(pstring* dst, const pstring* src)
+{
+ return pstring_append(dst, src->data, src->len);
+}
+
+rc_t pstring_append(pstring* str, const void* data, const size_t data_sz)
+{
+ if( str == NULL || data == NULL ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcParam, rcNull);
+ } else if( str->len + data_sz > sizeof(str->data) - 1 ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcBuffer, rcInsufficient);
+ }
+ memmove(&str->data[str->len], data, data_sz);
+ str->len += data_sz;
+ str->data[str->len] = '\0';
+ return 0;
+}
+
+rc_t pstring_append_chr(pstring* str, char c, size_t count)
+{
+ if( str == NULL ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcParam, rcNull);
+ } else if( str->len + count > sizeof(str->data) - 1 ) {
+ return RC(rcSRA, rcFormatter, rcCopying, rcBuffer, rcInsufficient);
+ }
+ memset(&str->data[str->len], c, count);
+ str->len += count;
+ str->data[str->len] = '\0';
+ return 0;
+}
+
+int pstring_cmp(const pstring* str1, const pstring* str2)
+{
+ int r = str1->len - str2->len;
+ return r ? r : memcmp(str1->data, str2->data, str1->len);
+}
+
+int pstring_strcmp(const pstring* str1, const char* str2)
+{
+ int r = str1->len - strlen(str2);
+ return r ? r : memcmp(str1->data, str2, str1->len);
+}
+
+bool pstring_is_fasta(const pstring* str)
+{
+ if( str != NULL ) {
+ const char* s = str->data;
+ const char* end = s + str->len;
+ while( s != end ) {
+ if( strchr("ACGTNactgn.", *s++) == NULL ) {
+ return false;
+ }
+ }
+ return str->len != 0;
+ }
+ return false;
+}
+
+bool pstring_is_csfasta(const pstring* str)
+{
+ if( str != NULL ) {
+ const char* s = str->data;
+ const char* end = s + str->len;
+
+ if( s == end || strchr("ACGTacgt", *s++) == NULL ) {
+ return false;
+ }
+ while( s != end ) {
+ if( strchr("0123.", *s++) == NULL ) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+rc_t pstring_quality_convert(pstring* qstr, ExperimentQualityEncoding enc, const uint8_t offset, const int8_t min, const int8_t max)
+{
+ rc_t rc = 0;
+ char* c, *end, *next;
+ pstring qbin;
+
+ if( qstr == NULL || min > max ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcParam, rcInvalid);
+ }
+ errno = 0;
+ c = qstr->data;
+ end = qstr->data + qstr->len;
+ pstring_clear(&qbin);
+ if(enc == eExperimentQualityEncoding_Undefined) {
+ if(memchr(c, ' ', qstr->len) != NULL || memchr(c, '\t', qstr->len) != NULL){
+ enc = eExperimentQualityEncoding_Decimal;
+ } else {
+ enc = eExperimentQualityEncoding_Ascii;
+ }
+ }
+
+
+ while( rc == 0 && c < end ) {
+ long q;
+ switch(enc) {
+ case eExperimentQualityEncoding_Decimal:
+ case eExperimentQualityEncoding_Hexadecimal:
+ /* spaced numbers form */
+ errno = 0;
+ q = strtol(c, &next, enc == eExperimentQualityEncoding_Decimal ? 10 : 16);
+ if( q == 0 && c == next ) {
+ /* no more digits in line */
+ goto DONE; /*** need do break while loop as well ***/
+ }
+ c = next;
+ break;
+ case eExperimentQualityEncoding_Ascii:
+ /* textual form with offset */
+ q = (long)(*c++) - offset;
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcUnrecognized);
+ break;
+ }
+ if( rc == 0 ) {
+ if( errno != 0 || q < min || q > max ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcOutofrange);
+ } else {
+ rc = pstring_append_chr(&qbin, (int8_t)q, 1);
+ }
+ }
+ }
+DONE:
+ if( rc == 0 ) {
+ rc = pstring_copy(qstr, &qbin);
+ }
+ return rc;
+}
diff --git a/tools/sra-load/pstring.h b/tools/sra-load/pstring.h
new file mode 100644
index 0000000..67a2142
--- /dev/null
+++ b/tools/sra-load/pstring.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_pstring_
+#define _sra_load_pstring_
+
+#include <klib/rc.h>
+
+typedef struct pstring_struct {
+ uint16_t len;
+ char data[64 * 1024];
+} pstring;
+
+rc_t pstring_clear(pstring* str);
+
+rc_t pstring_copy(pstring* dst, const pstring* src);
+
+rc_t pstring_assign(pstring* str, const void* data, const size_t data_sz);
+
+rc_t pstring_concat(pstring* dst, const pstring* src);
+
+rc_t pstring_append(pstring* str, const void* data, const size_t data_sz);
+
+rc_t pstring_append_chr(pstring* str, char c, size_t count);
+
+int pstring_cmp(const pstring* str1, const pstring* str2);
+
+int pstring_strcmp(const pstring* str1, const char* str2);
+
+bool pstring_is_fasta(const pstring* str);
+
+bool pstring_is_csfasta(const pstring* str);
+
+rc_t pstring_quality_convert(pstring* qstr, ExperimentQualityEncoding enc, const uint8_t offset, const int8_t min, const int8_t max);
+
+#endif /* _sra_load_pstring_ */
diff --git a/tools/sra-load/run-xml.c b/tools/sra-load/run-xml.c
new file mode 100644
index 0000000..320ff4c
--- /dev/null
+++ b/tools/sra-load/run-xml.c
@@ -0,0 +1,487 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <os-native.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "run-xml.h"
+
+void DataBlockFile_Whack(DataBlockFile* self)
+{
+ if( self ) {
+ free(self->filename);
+ free(self->md5_digest);
+ free(self->cc_xml);
+ free(self->cc_path);
+ }
+}
+
+void DataBlock_Whack(DataBlock* self)
+{
+ if( self ) {
+ uint32_t i;
+ for(i = 0; i < self->files_count; i++) {
+ DataBlockFile_Whack(&self->files[i]);
+ }
+ free(self->files);
+ free(self->name);
+ free(self->member_name);
+ }
+}
+
+rc_t RunXML_Whack(const RunXML *cself)
+{
+ if( cself ) {
+ RunXML* self = (RunXML*)cself;
+ uint32_t i = 0;
+ for(i = 0; i < self->datablock_count; i++) {
+ DataBlock_Whack(&self->datablocks[i]);
+ }
+ free(self->datablocks);
+ PlatformXML_Whack(self->attributes.platform);
+ ReadSpecXML_Whack(self->attributes.reads);
+ free(self);
+ }
+ return 0;
+}
+
+static
+const struct {
+ const char* name;
+ ERunFileType type;
+} file_types[] = {
+ /* generic types giving us no useful information about file */
+ { "tab", rft_Unknown },
+ { "454_native", rft_Unknown },
+ { "454_native_seq", rft_Unknown },
+ { "454_native_qual", rft_Unknown },
+ { "Illumina_native", rft_Unknown },
+ { "Illumina_native_fastq", rft_Unknown },
+ { "Illumina_native_scarf", rft_Unknown },
+ { "SOLiD_native", rft_Unknown },
+ { "bam", rft_Unknown },
+ { "sra", rft_Unknown },
+ { "kar", rft_Unknown },
+ /* more specific information about file content */
+ { "fastq", rft_Fastq },
+ { "srf", rft_SRF },
+ { "sff", rft_SFF },
+ { "Helicos_native", rft_HelicosNative },
+ { "Illumina_native_seq", rft_IlluminaNativeSeq },
+ { "Illumina_native_prb", rft_IlluminaNativePrb },
+ { "Illumina_native_int", rft_IlluminaNativeInt },
+ { "Illumina_native_qseq", rft_IlluminaNativeQseq },
+ { "SOLiD_native_csfasta", rft_ABINativeCSFasta },
+ { "SOLiD_native_qual", rft_ABINativeQuality },
+ { "PacBio_HDF5", rft_PacBio_HDF5 }
+};
+
+static
+rc_t parse_FILE(const KXMLNode* FILE, DataBlockFile* file)
+{
+ rc_t rc = 0;
+ char* filetype = NULL, *checksum_method = NULL, *checksum = NULL;
+ char* quality_scoring_system = NULL, *quality_encoding = NULL, *ascii_offset = NULL;
+
+ if( (rc = KXMLNodeReadAttrCStr(FILE, "filename", &file->filename, NULL)) != 0 ||
+ file->filename == NULL || file->filename[0] == '\0' ) {
+ LOGERR(klogErr, rc, "FILE @filename");
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "filetype", &filetype, NULL)) != 0 ||
+ filetype == NULL || filetype[0] == '\0' ) {
+ rc = rc ? rc : RC(rcExe, rcStorage, rcConstructing, rcTag, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @filetype", PLOG_S(file), file->filename));
+
+/* <!-- custom pipeline attributes, not from schema! */
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "upload_id", &file->cc_xml, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @upload_id", PLOG_S(file), file->filename));
+ } else if( file->cc_xml != NULL && file->cc_xml[0] == '\0' ) {
+ rc = RC(rcExe, rcStorage, rcConstructing, rcTag, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @upload_id", PLOG_S(file), file->filename));
+
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "cc_path", &file->cc_path, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @cc_path", PLOG_S(file), file->filename));
+ } else if( ((file->cc_path == NULL || file->cc_path[0] == '\0') && file->cc_xml != NULL) ||
+ (file->cc_path != NULL && file->cc_xml == NULL) ) {
+ rc = RC(rcExe, rcStorage, rcConstructing, rcTag, file->cc_xml ? rcEmpty : rcUnexpected);
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @cc_path", PLOG_S(file), file->filename));
+/* --> */
+
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "quality_scoring_system", &quality_scoring_system, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @quality_scoring_system", PLOG_S(file), file->filename));
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "quality_encoding", &quality_encoding, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @quality_encoding", PLOG_S(file), file->filename));
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "ascii_offset", &ascii_offset, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @ascii_offset", PLOG_S(file), file->filename));
+
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "checksum_method", &checksum_method, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @checksum_method", PLOG_S(file), file->filename));
+ } else if( (rc = KXMLNodeReadAttrCStr(FILE, "checksum", &checksum, NULL)) != 0 &&
+ !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @checksum", PLOG_S(file), file->filename));
+ } else if( checksum_method != NULL && strcasecmp(checksum_method, "MD5") != 0 ) {
+ rc = RC(rcExe, rcStorage, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc, "FILE $(file) @checksum_method", PLOG_S(file), file->filename));
+ } else {
+ rc_t rc1 = 0, rc2 = 0, rc3 = 0, rc4 = 0;
+ if( quality_scoring_system != NULL ) {
+ if( quality_encoding == NULL ) {
+ rc1 = RC(rcExe, rcStorage, rcConstructing, rcParam, rcIncomplete);
+ PLOGERR(klogErr, (klogErr, rc1, "FILE $(file) @quality_encoding is required if @quality_scoring_system is specified",
+ PLOG_S(file), file->filename));
+ } else if( strcmp(quality_scoring_system, "phred") == 0 ) {
+ file->attr.quality_scoring_system = eExperimentQualityType_Phred;
+ } else if( strcmp(quality_scoring_system, "log-odds") == 0 ) {
+ file->attr.quality_scoring_system = eExperimentQualityType_LogOdds;
+ } else {
+ rc1 = RC(rcExe, rcStorage, rcConstructing, rcAttr, rcOutofrange);
+ PLOGERR(klogErr, (klogErr, rc1, "FILE $(file) @quality_scoring_system", PLOG_S(file), file->filename));
+ }
+ }
+ if( quality_encoding != NULL ) {
+ if( quality_scoring_system == NULL ) {
+ rc2 = RC(rcExe, rcStorage, rcConstructing, rcParam, rcIncomplete);
+ PLOGERR(klogErr, (klogErr, rc2, "FILE $(file) @quality_scoring_system is required if @quality_encoding is specified",
+ PLOG_S(file), file->filename));
+ } else if( strcmp(quality_encoding, "ascii") == 0 ) {
+ file->attr.quality_encoding = eExperimentQualityEncoding_Ascii;
+ if( ascii_offset == NULL ) {
+ rc2 = RC(rcExe, rcStorage, rcConstructing, rcParam, rcIncomplete);
+ PLOGERR(klogErr, (klogErr, rc2, "FILE $(file) @ascii_offset is required if @quality_encoding is 'ascii'",
+ PLOG_S(file), file->filename));
+ } else if( strcmp(ascii_offset, "!") == 0 || strcmp(ascii_offset, "@") == 0 ) {
+ file->attr.ascii_offset = ascii_offset[0];
+ } else {
+ rc2 = RC(rcExe, rcStorage, rcConstructing, rcAttr, rcOutofrange);
+ PLOGERR(klogErr, (klogErr, rc2, "FILE $(file) @ascii_offset", PLOG_S(file), file->filename));
+ }
+ } else if( strcmp(quality_encoding, "decimal") == 0 ) {
+ file->attr.quality_encoding = eExperimentQualityEncoding_Decimal;
+ } else if( strcmp(quality_encoding, "hexadecimal") == 0 ) {
+ file->attr.quality_encoding = eExperimentQualityEncoding_Hexadecimal;
+ } else {
+ rc2 = RC(rcExe, rcStorage, rcConstructing, rcAttr, rcOutofrange);
+ PLOGERR(klogErr, (klogErr, rc2, "FILE $(file) @quality_encoding", PLOG_S(file), file->filename));
+ }
+ }
+ if( ascii_offset != NULL ) {
+ if( file->attr.quality_encoding != eExperimentQualityEncoding_Ascii ) {
+ PLOGMSG(klogWarn, (klogWarn, "FILE $(file) @ascii_offset ignored since @quality_encoding is $(reason)",
+ PLOG_2(PLOG_S(reason),PLOG_S(file)),
+ file->attr.quality_encoding == eExperimentQualityEncoding_Undefined ? "undefined" : "not ascii", file->filename));
+ }
+ }
+ if( checksum_method == NULL && checksum != NULL ) {
+ PLOGMSG(klogWarn, (klogWarn, "FILE $(file) @checksum ignored since @checksum_method is not defined", PLOG_S(file), file->filename));
+ free(checksum);
+ checksum = NULL;
+ }
+ if( checksum != NULL ) {
+ if( strlen(checksum) != (16 * 2) ) {
+ /* MD5 sum is 16 bytes in hex format (2 hex digits per byte) */
+ rc3 = RC(rcExe, rcStorage, rcConstructing, rcData, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc3, "FILE $(file) MD5 @checksum", PLOG_S(file), file->filename));
+ } else if( (file->md5_digest = malloc(16 * sizeof(uint8_t))) == NULL ) {
+ rc3 = RC(rcExe, rcStorage, rcConstructing, rcMemory, rcExhausted);
+ PLOGERR(klogErr, (klogErr, rc3, "FILE $(file) MD5 @checksum allocation", PLOG_S(file), file->filename));
+ } else {
+ int i = 0;
+ char digit[3];
+ unsigned int xdig;
+
+ digit[2] = '\0';
+ for(i = 0; rc3 == 0 && i < 16; i++) {
+ digit[0] = tolower(checksum[2 * i]);
+ digit[1] = tolower(checksum[2 * i + 1]);
+ if(!isxdigit(digit[0]) || !isxdigit(digit[1])) {
+ rc3 = RC(rcExe, rcStorage, rcConstructing, rcData, rcInvalid);
+ PLOGERR(klogErr, (klogErr, rc3, "FILE $(file) MD5 @checksum $(digits)",
+ PLOG_2(PLOG_S(file),PLOG_S(digits)), file->filename, digit));
+ } else {
+ sscanf(digit, "%x", &xdig);
+ file->md5_digest[i] = xdig;
+ }
+ }
+ }
+ }
+ if( filetype != NULL ) {
+ int i;
+ for(i = 0; i < sizeof(file_types) / sizeof(file_types[0]); i++) {
+ if( strcmp(filetype, file_types[i].name) == 0 ) {
+ file->attr.filetype = file_types[i].type;
+ break;
+ }
+ }
+ if( file->attr.filetype == 0 ) {
+ rc4 = RC(rcExe, rcStorage, rcConstructing, rcAttr, rcOutofrange);
+ PLOGERR(klogErr, (klogErr, rc4, "FILE $(file) @filetype '$(type)'",
+ PLOG_2(PLOG_S(file),PLOG_S(type)), file->filename, filetype));
+ }
+ }
+ rc = rc1 ? rc1 : (rc2 ? rc2 : (rc3 ? rc3 : rc4));
+ }
+ free(filetype);
+ free(checksum_method);
+ free(checksum);
+ free(quality_scoring_system);
+ free(quality_encoding);
+ free(ascii_offset);
+ return rc;
+}
+
+static
+rc_t parse_DATA_BLOCK(const KXMLNode* DATA_BLOCK, DataBlock* datablock)
+{
+ rc_t rc = 0;
+ const KXMLNodeset* FILES;
+
+ rc = KXMLNodeReadAttrCStr(DATA_BLOCK, "name", &datablock->name, NULL);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "DATA_BLOCK @name");
+ return rc;
+ }
+ rc = KXMLNodeReadAttrCStr(DATA_BLOCK, "member_name", &datablock->member_name, NULL);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "DATA_BLOCK @member_name");
+ return rc;
+ }
+ if( datablock->member_name != NULL && strcasecmp(datablock->member_name, "default") == 0 ) {
+ datablock->member_name[0] = '\0';
+ }
+ datablock->serial = ~0; /* file w/o serial pushed to end of list */
+ rc = KXMLNodeReadAttrAsU32(DATA_BLOCK, "serial", &datablock->serial);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "DATA_BLOCK @serial");
+ return rc;
+ }
+ datablock->sector = -1;
+ rc = KXMLNodeReadAttrAsU64(DATA_BLOCK, "sector", (uint64_t*)&datablock->sector);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "DATA_BLOCK @sector");
+ return rc;
+ }
+ datablock->region = -1;
+ rc = KXMLNodeReadAttrAsU64(DATA_BLOCK, "region", (uint64_t*)&datablock->region);
+ if( rc != 0 && !(GetRCObject(rc) == (enum RCObject)rcAttr && GetRCState(rc) == rcNotFound) ) {
+ LOGERR(klogErr, rc, "DATA_BLOCK @region");
+ return rc;
+ }
+
+ if( (rc = KXMLNodeOpenNodesetRead(DATA_BLOCK, &FILES, "FILES/FILE")) == 0) {
+ if( (rc = KXMLNodesetCount(FILES, &datablock->files_count)) != 0) {
+ LOGERR(klogErr, rc, "reading FILES/FILE node(s)");
+ } else if( datablock->files_count < 1 ) {
+ rc = RC(rcExe, rcStorage, rcConstructing, rcData, rcIncomplete);
+ LOGERR(klogErr, rc, "FILES/FILE at least one node is required");
+ } else if( (datablock->files = calloc(datablock->files_count, sizeof(*datablock->files))) == NULL ) {
+ rc = RC(rcExe, rcStorage, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogErr, rc, "allocating FILES/FILE");
+ } else {
+ uint32_t i = 0;
+ for(i = 0; rc == 0 && i < datablock->files_count; i++) {
+ const KXMLNode *FILE = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(FILES, &FILE, i)) == 0 ) {
+ rc = parse_FILE(FILE, &datablock->files[i]);
+ KXMLNodeRelease(FILE);
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "reading FILES/FILE $(i)", PLOG_U32(i), i));
+ }
+ }
+ }
+ KXMLNodesetRelease(FILES);
+ }
+ return rc;
+}
+
+rc_t RunXML_Make(RunXML** rslt, const KXMLNode* RUN)
+{
+ rc_t rc = 0;
+ const KXMLNodeset* nset = NULL;
+ RunXML* obj = NULL;
+ uint32_t p_spot_length = 0, r_spot_length = 0;
+
+ if(rslt == NULL || RUN == NULL) {
+ return RC(rcExe, rcStorage, rcConstructing, rcParam, rcNull);
+ }
+ *rslt = NULL;
+ obj = calloc(1, sizeof(*obj));
+ if( obj == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ if( (rc = PlatformXML_Make(&obj->attributes.platform, RUN, &p_spot_length)) != 0 ) {
+ if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ } else {
+ LOGERR(klogErr, rc, "RUN/PLATFORM");
+ }
+ }
+ if( rc == 0 && (rc = ReadSpecXML_Make(&obj->attributes.reads, RUN, "SPOT_DESCRIPTOR", &r_spot_length)) != 0 ) {
+ if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ } else {
+ LOGERR(klogErr, rc, "RUN/.../READ_SPEC");
+ }
+ }
+ obj->attributes.spot_length = r_spot_length ? r_spot_length : p_spot_length;
+ if( rc == 0 && p_spot_length != 0 && r_spot_length != 0 && p_spot_length != r_spot_length ) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "in RUN sequence length (cycle count) in PLATFORM $(p) differ"
+ " from SPOT_LENGTH $(l) in SPOT_DECODE_SPEC",
+ PLOG_2(PLOG_U32(p),PLOG_U32(l)), p_spot_length, r_spot_length));
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = KXMLNodeOpenNodesetRead(RUN, &nset, "DATA_BLOCK")) == 0) {
+ if( (rc = KXMLNodesetCount(nset, &obj->datablock_count)) == 0 && obj->datablock_count > 0 ) {
+ obj->datablocks = calloc(obj->datablock_count, sizeof(*obj->datablocks));
+ if( obj->datablocks == NULL ) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ } else {
+ uint32_t i = 0;
+ for(i = 0; rc == 0 && i < obj->datablock_count; i++) {
+ const KXMLNode *DATA_BLOCK = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(nset, &DATA_BLOCK, i)) == 0 ) {
+ rc = parse_DATA_BLOCK(DATA_BLOCK, &obj->datablocks[i]);
+ KXMLNodeRelease(DATA_BLOCK);
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "reading DATA_BLOCK $(i)", PLOG_U32(i), i));
+ }
+ }
+ if( rc == 0 ) {
+ /* serial ascending sort */
+ bool swapped = true;
+ while(swapped) {
+ swapped = false;
+ for(i = 1; i < obj->datablock_count; i++) {
+ if( obj->datablocks[i].serial < obj->datablocks[i - 1].serial ) {
+ DataBlock db;
+ memmove(&db, &obj->datablocks[i], sizeof(db));
+ memmove(&obj->datablocks[i], &obj->datablocks[i - 1], sizeof(db));
+ memmove(&obj->datablocks[i - 1], &db, sizeof(db));
+ swapped = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ KXMLNodesetRelease(nset);
+ } else {
+ LOGERR(klogErr, rc, "DATA_BLOCK node(s)");
+ }
+ }
+
+ if( rc == 0 ) {
+ if( (rc = KXMLNodeOpenNodesetRead(RUN, &nset, "RUN_ATTRIBUTES/RUN_ATTRIBUTE")) == 0) {
+ uint32_t num_attr = 0;
+ if( (rc = KXMLNodesetCount(nset, &num_attr)) == 0) {
+ uint32_t i = 0;
+ for(i = 0; rc == 0 && i < num_attr; i++) {
+ const KXMLNode* RUN_ATTRIBUTE = NULL;
+ if( (rc = KXMLNodesetGetNodeRead(nset, &RUN_ATTRIBUTE, i)) == 0 ) {
+ const KXMLNode* TAG = NULL, *VALUE = NULL;
+ if( (rc = KXMLNodeGetFirstChildNodeRead(RUN_ATTRIBUTE, &TAG, "TAG")) == 0 &&
+ (rc = KXMLNodeGetFirstChildNodeRead(RUN_ATTRIBUTE, &VALUE, "VALUE")) == 0 ) {
+ char* tag = NULL, *value = NULL;
+ if( (rc = KXMLNodeReadCStr(TAG, &tag, NULL)) == 0 &&
+ (rc = KXMLNodeReadCStr(VALUE, &value, NULL)) == 0 ) {
+ if( strcasecmp(tag, "read_name_barcode_proc_directive") == 0 ) {
+ if( value == NULL || value[0] == '\0' ) {
+ obj->attributes.barcode_rule = eBarcodeRule_not_set;
+ } else if (strcasecmp(value, "interpret_as_spotgroup") == 0 || strcasecmp(value, "use_file_spot_name") == 0) {
+ obj->attributes.barcode_rule = eBarcodeRule_use_file_spot_name;
+ } else if (strcasecmp(value, "use_table_in_experiment") == 0) {
+ obj->attributes.barcode_rule = eBarcodeRule_use_table_in_experiment;
+ } else if(strcasecmp(value, "ignore") == 0) {
+ obj->attributes.barcode_rule = eBarcodeRule_ignore_barcode;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcAttr, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc, "RUN_ATTRIBUTE['$(t)'] VALUE='$(v)'", PLOG_2(PLOG_S(t),PLOG_S(v)), tag, value));
+ }
+ } else if( strcasecmp(tag, "quality_scoring_system") == 0 ) {
+ if( value != NULL ) {
+ if( strcasecmp(value, "phred") == 0 ) {
+ obj->attributes.quality_type = eExperimentQualityType_Phred;
+ } else if( strcasecmp(value, "logodds") == 0 || strcasecmp(value, "log odds") == 0 ) {
+ obj->attributes.quality_type = eExperimentQualityType_LogOdds;
+ } else if( strcasecmp(value, "other") == 0 ) {
+ obj->attributes.quality_type = eExperimentQualityType_Other;
+ }
+ }
+ if( obj->attributes.quality_type == eExperimentQualityType_Undefined ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcAttr, rcUnrecognized);
+ PLOGERR(klogErr, (klogErr, rc, "RUN_ATTRIBUTE['$(t)'] VALUE='$(v)'", PLOG_2(PLOG_S(t),PLOG_S(v)), tag, value));
+ }
+ } else if( strcasecmp(tag, "quality_book_char") == 0 ) {
+ if( value != NULL && value[0] != '\0' ) {
+ obj->attributes.quality_offset = value[0];
+ } else {
+ PLOGMSG(klogWarn, (klogWarn, "RUN_ATTRIBUTE['$(t)'] VALUE='$(v)' ignored", PLOG_2(PLOG_S(t),PLOG_S(v)), tag, value));
+ }
+ }
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "RUN_ATTRIBUTE[$(i)]/VALUE", PLOG_U32(i), i));
+ }
+ free(value);
+ free(tag);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "RUN_ATTRIBUTE[$(i)]", PLOG_U32(i), i));
+ }
+ KXMLNodeRelease(VALUE);
+ KXMLNodeRelease(TAG);
+ KXMLNodeRelease(RUN_ATTRIBUTE);
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "RUN_ATTRIBUTE $(i)", PLOG_U32(i), i));
+ }
+ }
+ }
+ KXMLNodesetRelease(nset);
+ } else if( GetRCState(rc) == rcNotFound ) {
+ rc = 0;
+ } else {
+ LOGERR(klogErr, rc, "RUN_ATTRIBUTES/RUN_ATTRIBUTE node(s)");
+ }
+ }
+ if (rc == 0) {
+ *rslt = obj;
+ } else {
+ RunXML_Whack(obj);
+ }
+ return rc;
+}
diff --git a/tools/sra-load/run-xml.h b/tools/sra-load/run-xml.h
new file mode 100644
index 0000000..b46172b
--- /dev/null
+++ b/tools/sra-load/run-xml.h
@@ -0,0 +1,90 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_tools_run_xml_
+#define _sra_tools_run_xml_
+
+#ifndef _h_klib_container_
+#include <klib/container.h>
+#endif
+
+#include "common-xml.h"
+
+typedef enum ERunFileType_enum {
+ rft_Unknown = 1,
+ rft_Fastq,
+ rft_SRF,
+ rft_SFF,
+ rft_HelicosNative,
+ rft_IlluminaNativeSeq,
+ rft_IlluminaNativePrb,
+ rft_IlluminaNativeInt,
+ rft_IlluminaNativeQseq,
+ rft_ABINativeCSFasta,
+ rft_ABINativeQuality,
+ rft_PacBio_HDF5
+} ERunFileType;
+
+typedef struct DataBlockFileAttr_struct {
+ ERunFileType filetype;
+ ExperimentQualityType quality_scoring_system;
+ ExperimentQualityEncoding quality_encoding;
+ uint8_t ascii_offset;
+} DataBlockFileAttr;
+
+typedef struct DataBlockFile_struct {
+ DataBlockFileAttr attr;
+ char* filename;
+ uint8_t* md5_digest;
+ char* cc_xml;
+ char* cc_path;
+} DataBlockFile;
+
+typedef struct DataBlock_struct {
+ char* name;
+ char* member_name;
+ int64_t sector;
+ int64_t region;
+ uint32_t serial;
+ uint32_t files_count;
+ DataBlockFile* files;
+} DataBlock;
+
+typedef struct RunXML {
+ uint32_t datablock_count;
+ DataBlock* datablocks;
+ /* known/used run attribuites */
+ RunAttributes attributes;
+} RunXML;
+
+void DataBlockFile_Whack(DataBlockFile* self);
+
+void DataBlock_Whack(DataBlock* self);
+
+rc_t RunXML_Make(RunXML **rslt, const KXMLNode *RUN);
+
+rc_t RunXML_Whack(const RunXML *cself);
+
+#endif /* _sra_tools_run_xml_ */
diff --git a/tools/sra-load/sff-fmt.c b/tools/sra-load/sff-fmt.c
new file mode 100644
index 0000000..c4eb22f
--- /dev/null
+++ b/tools/sra-load/sff-fmt.c
@@ -0,0 +1,491 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+#include <sra/sff-file.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct SFFLoaderFmt SFFLoaderFmt;
+
+#define SRALOADERFMT_IMPL SFFLoaderFmt
+#include "loader-fmt.h"
+
+#include "writer-454.h"
+#include "writer-ion-torrent.h"
+#include "debug.h"
+
+#include <byteswap.h>
+
+struct SFFLoaderFmt {
+ SRALoaderFmt dad; /* base type -> must be first in struct */
+ const SRAWriter454* w454;
+ const SRAWriterIonTorrent* wIonTorrent;
+ bool skip_signal;
+ uint32_t curr_read_number;
+
+ /* file buffer data */
+ const char* file_name;
+ const uint8_t* file_buf;
+ size_t file_advance;
+ uint64_t index_correction; /* used in case of concatinated files */
+
+ /* spot data */
+ SFFCommonHeader header;
+ pstring flow_chars;
+ pstring key_seq;
+
+ SFFReadHeader read_header;
+ pstring name;
+ pstring signal;
+ pstring position;
+ pstring read;
+ pstring quality;
+};
+
+static
+rc_t SFFLoaderFmt_ReadBlock(SFFLoaderFmt* self, const SRALoaderFile* file, size_t size, const char* location, bool silent)
+{
+ size_t read = 0;
+ rc_t rc = SRALoaderFileRead(file, self->file_advance, size, (const void**)&self->file_buf, &read);
+ self->file_advance = 0;
+ if( rc == 0 && (size > 0 && (self->file_buf == NULL || read < size)) ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+ }
+ if( rc != 0 && !silent ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "$(l), needed $(needed) got $(got) bytes",
+ PLOG_3(PLOG_S(l),PLOG_U32(needed),PLOG_U32(got)), location, size, read);
+ }
+ return rc;
+}
+
+static
+rc_t SFFLoaderFmtReadCommonHeader(SFFLoaderFmt* self, const SRALoaderFile *file)
+{
+ rc_t rc = 0;
+ bool skiped_idx_pad = false;
+ uint16_t head_sz;
+ SFFCommonHeader prev_head;
+ pstring prev_flow_chars;
+ pstring prev_key_seq;
+
+ if( (rc = SRALoaderFile_Offset(file, &self->index_correction)) != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "Reading initial file position", NULL);
+ return rc;
+ }
+SkipIndexPad:
+ self->index_correction += self->file_advance;
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, SFFCommonHeader_size, NULL, true)) != 0) {
+ SRALoaderFile_LOG(file, klogErr, rc, "common header, needed $(needed) bytes",
+ PLOG_U32(needed), SFFCommonHeader_size);
+ return rc;
+ }
+ if( self->header.magic_number != 0 ) {
+ /* next file in stream, remember prev to sync to each */
+ memmove(&prev_head, &self->header, sizeof(SFFCommonHeader));
+ pstring_copy(&prev_flow_chars, &self->flow_chars);
+ pstring_copy(&prev_key_seq, &self->key_seq);
+ } else {
+ prev_head.magic_number = 0;
+ prev_head.index_length = 0;
+ }
+
+ memmove(&self->header, self->file_buf, SFFCommonHeader_size);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ self->header.magic_number = bswap_32(self->header.magic_number);
+ self->header.version = bswap_32(self->header.version);
+ self->header.index_offset = bswap_64(self->header.index_offset);
+ self->header.index_length = bswap_32(self->header.index_length);
+ self->header.number_of_reads = bswap_32(self->header.number_of_reads);
+ self->header.header_length = bswap_16(self->header.header_length);
+ self->header.key_length = bswap_16(self->header.key_length);
+ self->header.num_flows_per_read = bswap_16(self->header.num_flows_per_read);
+#endif
+
+ if( self->header.magic_number != (('.'<<24)|('s'<<16)|('f'<<8)|('f'<<0)) ) {
+ if( !skiped_idx_pad && prev_head.magic_number != 0 ) {
+ /* possible concatination of 2 files with index at EOF and padded to 8 bytes with header values not padded,
+ try skipping padding and reread */
+ uint32_t pad = 8 - prev_head.index_length % 8;
+ if( pad != 0 ) {
+ self->file_advance += pad;
+ DEBUG_MSG(5, ("%s: trying to skip over %u bytes index section padding\n", self->file_name, pad));
+ skiped_idx_pad = true;
+ goto SkipIndexPad;
+ }
+ }
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnrecognized);
+ SRALoaderFile_LOG(file, klogErr, rc, "magic number: $(m)", PLOG_U32(m), self->header.magic_number);
+ return rc;
+ }
+ if( self->header.version != 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcBadVersion);
+ SRALoaderFile_LOG(file, klogErr, rc, "format version $(v)", PLOG_U32(v), self->header.version);
+ return rc;
+ }
+ if( self->header.flowgram_format_code != SFFFormatCodeUI16Hundreths ) {
+ /* NOTE: add a case here if flowgram coding gets new version to support different */
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnsupported);
+ SRALoaderFile_LOG(file, klogErr, rc, "common header flowgram format code", NULL);
+ return rc;
+ }
+ if( self->header.index_length % 8 != 0 ) {
+ DEBUG_MSG(5, ("%s: index_length field value is not 8 byte padded: %u\n", self->file_name, self->header.index_length));
+ }
+ head_sz = SFFCommonHeader_size + self->header.num_flows_per_read + self->header.key_length;
+ head_sz += (head_sz % 8) ? (8 - (head_sz % 8)) : 0;
+ if( head_sz != self->header.header_length ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcFormat, rcInvalid);
+ SRALoaderFile_LOG(file, klogErr, rc, "header length $(h) <> $(s) ", PLOG_2(PLOG_U16(h),PLOG_U16(s)),
+ self->header.header_length, head_sz);
+ return rc;
+ }
+ /* read flow chars and key */
+ self->file_advance = SFFCommonHeader_size;
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, head_sz - SFFCommonHeader_size, "common header", false)) != 0) {
+ return rc;
+ }
+ self->file_advance = head_sz - SFFCommonHeader_size;
+
+ if( (rc = pstring_assign(&self->flow_chars, self->file_buf, self->header.num_flows_per_read)) != 0 ||
+ (rc = pstring_assign(&self->key_seq, self->file_buf + self->header.num_flows_per_read, self->header.key_length)) != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "reading flows/key sequence", NULL);
+ return rc;
+ }
+ if( prev_head.magic_number != 0 ) {
+ /* next file's common header must match previous file's common header, partially */
+ if( prev_head.key_length != self->header.key_length ||
+ prev_head.num_flows_per_read != self->header.num_flows_per_read ||
+ pstring_cmp(&prev_flow_chars, &self->flow_chars) != 0 ||
+ pstring_cmp(&prev_key_seq, &self->key_seq) != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInconsistent);
+ SRALoaderFile_LOG(file, klogErr, rc, "previous file common header differ in flows/key sequence", NULL);
+ }
+ }
+ if( rc == 0 ) {
+ if( self->w454 ) {
+ rc = SRAWriter454_WriteHead(self->w454, &self->flow_chars, &self->key_seq);
+ } else {
+ rc = SRAWriterIonTorrent_WriteHead(self->wIonTorrent, &self->flow_chars, &self->key_seq);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SFFLoaderFmtReadDataHeader(SFFLoaderFmt* self, const SRALoaderFile* file)
+{
+ rc_t rc = 0;
+ uint16_t head_sz = 0;
+
+ /* Make sure the entire fixed portion of Read Header section is in the file buffer window */
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, SFFReadHeader_size, "read header", false)) != 0 ) {
+ return rc;
+ }
+ memmove(&self->read_header, self->file_buf, SFFReadHeader_size);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ self->read_header.header_length = bswap_16(self->read_header.header_length);
+ self->read_header.name_length = bswap_16(self->read_header.name_length);
+ self->read_header.number_of_bases = bswap_32(self->read_header.number_of_bases);
+ self->read_header.clip_quality_left = bswap_16(self->read_header.clip_quality_left);
+ self->read_header.clip_quality_right = bswap_16(self->read_header.clip_quality_right);
+ self->read_header.clip_adapter_left = bswap_16(self->read_header.clip_adapter_left);
+ self->read_header.clip_adapter_right = bswap_16(self->read_header.clip_adapter_right);
+#endif
+
+ head_sz = SFFReadHeader_size + self->read_header.name_length;
+ head_sz += (head_sz % 8) ? (8 - (head_sz % 8)) : 0;
+ if( head_sz != self->read_header.header_length ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcFormat, rcInvalid);
+ SRALoaderFile_LOG(file, klogErr, rc, "read header length $(h) != $(s)", PLOG_2(PLOG_U16(h),PLOG_U16(s)),
+ self->header.header_length, head_sz);
+ return rc;
+ }
+ /* read name */
+ self->file_advance = SFFReadHeader_size;
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, head_sz - SFFReadHeader_size, "read header", false)) != 0) {
+ return rc;
+ }
+ self->file_advance = head_sz - SFFReadHeader_size;
+
+ if( (rc = pstring_assign(&self->name, self->file_buf, self->read_header.name_length)) != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "copying read name", NULL);
+ }
+ return rc;
+}
+
+static
+rc_t SFFLoaderFmtReadData(SFFLoaderFmt* self, const SRALoaderFile* file)
+{
+ rc_t rc = 0;
+ uint32_t i;
+
+ /* calc signal chunk size */
+ size_t signal_sz = self->header.num_flows_per_read * sizeof(uint16_t);
+ /* plus position, read, quality */
+ size_t sz = signal_sz + self->read_header.number_of_bases * 3;
+ /* + padding */
+ sz += (sz % 8) ? (8 - (sz % 8)) : 0;
+
+ /* adjust the buffer window to full data block size */
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, sz, "read data", false)) != 0 ) {
+ return rc;
+ }
+ self->file_advance = sz;
+
+ if( !self->skip_signal ) {
+ rc = pstring_assign(&self->signal, self->file_buf, signal_sz);
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ if( rc == 0 ) {
+ uint16_t* sig = (uint16_t*)self->signal.data;
+ for(i = 0; i < self->header.num_flows_per_read; i++) {
+ sig[i] = bswap_16(sig[i]);
+ }
+ }
+#endif
+ }
+
+ if( rc == 0 ) {
+ const uint8_t* pos = self->file_buf + signal_sz;
+
+ if( !self->skip_signal ) {
+ INSDC_coord_one *p;
+ /* reset buffer to proper size */
+ pstring_clear(&self->position);
+ rc = pstring_append_chr(&self->position, 0, self->read_header.number_of_bases * sizeof(*p));
+ p = (INSDC_coord_one*)&self->position.data[0];
+ p[0] = pos[0];
+ for(i = 1; i < self->read_header.number_of_bases; i++) {
+ p[i] = p[i - 1] + pos[i];
+ }
+ }
+ if( rc == 0 ) {
+ pos += self->read_header.number_of_bases;
+ rc = pstring_assign(&self->read, pos, self->read_header.number_of_bases);
+ /*for(i = 0; i< self->read.len; i++ ) {
+ self->read.data[i] = tolower(self->read.data[i]);
+ }*/
+ }
+ if( rc == 0 ) {
+ pos += self->read_header.number_of_bases;
+ rc = pstring_assign(&self->quality, pos, self->read_header.number_of_bases);
+ }
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "copying read data", NULL);
+ }
+ return rc;
+}
+
+/**
+ * SFFLoaderFmtSkipIndex - skip through indexes section if current position in file is indexes offset from header
+ */
+static
+rc_t SFFLoaderFmtSkipIndex(SFFLoaderFmt* self, const SRALoaderFile* file)
+{
+ rc_t rc = 0;
+ uint64_t pos;
+ /* advance whatever and read file position */
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, 0, "index", false)) == 0 &&
+ (rc = SRALoaderFile_Offset(file, &pos)) == 0 ) {
+ if( pos == (self->header.index_offset + self->index_correction) ) {
+ /* skip */
+ size_t leftover;
+ self->file_advance += self->header.index_length;
+ DEBUG_MSG(5, ("%s: indexes skipped at 0x%016X, %u bytes\n",
+ self->file_name, pos, self->header.index_length));
+ /* try to get more data while skipping index */
+ if( (rc = SRALoaderFileRead(file, self->file_advance, 16, (const void**)&self->file_buf, &leftover)) == 0 ) {
+ if( self->file_buf != NULL && leftover < 8 ) {
+ /* smth short is read! possible last chunk in file was index and it was padded to 8 bytes,
+ while in header index_length field value was not padded */
+ if( leftover == (8 - self->header.index_length % 8) ) {
+ /* read out padding */
+ if( (rc = SRALoaderFileRead(file, leftover, 0, (const void**)&self->file_buf, &leftover)) == 0 ) {
+ if( self->file_buf == NULL ) {
+ /* ok EOF! */
+ DEBUG_MSG(5, ("%s: ignored extra %u bytes index section padding\n",
+ self->file_name, 8 - self->header.index_length % 8));
+ }
+ }
+ }
+ }
+ }
+ self->file_advance = 0;
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SFFLoaderFmtWriteDataFile(SFFLoaderFmt* self, const SRALoaderFile* file)
+{
+ rc_t rc = 0;
+
+ while( rc == 0 ) {
+ if( self->curr_read_number == 0 ) {
+ if( (rc = SFFLoaderFmtReadCommonHeader(self, file)) == 0 ) {
+ DEBUG_MSG (5, ("%s: Common header ok: %u reads\n", self->file_name, self->header.number_of_reads));
+ DEBUG_MSG (8, ("%s: flow_chars: [%hu] %s\n", self->file_name, self->header.num_flows_per_read, self->flow_chars.data));
+ DEBUG_MSG (8, ("%s: key_seq: [%hu] %s\n", self->file_name, self->header.key_length, self->key_seq.data));
+ } else if( GetRCObject(rc) == (enum RCObject)rcData && GetRCState(rc) == rcIgnored ) {
+ rc = 0;
+ break;
+ }
+ }
+ if( rc == 0 && self->header.number_of_reads != 0 &&
+ (rc = SFFLoaderFmtSkipIndex(self, file)) == 0 &&
+ (rc = SFFLoaderFmtReadDataHeader(self, file)) == 0 &&
+ (rc = SFFLoaderFmtReadData(self, file)) == 0 ) {
+ if( self->w454 ) {
+ rc = SRAWriter454_WriteRead(self->w454, file, &self->name, &self->read, &self->quality,
+ self->skip_signal ? NULL : &self->signal,
+ self->skip_signal ? NULL : &self->position,
+ self->read_header.clip_quality_left, self->read_header.clip_quality_right,
+ self->read_header.clip_adapter_left, self->read_header.clip_adapter_right);
+ } else {
+ rc = SRAWriterIonTorrent_WriteRead(self->wIonTorrent, file, &self->name, &self->read, &self->quality,
+ self->skip_signal ? NULL : &self->signal,
+ self->skip_signal ? NULL : &self->position,
+ self->read_header.clip_quality_left, self->read_header.clip_quality_right,
+ self->read_header.clip_adapter_left, self->read_header.clip_adapter_right);
+ }
+ if( rc == 0 ) {
+ ++self->curr_read_number;
+ }
+ }
+ if( rc != 0 && (GetRCObject(rc) != rcTransfer && GetRCState(rc) != rcDone) ) {
+ SRALoaderFile_LOG(file, klogErr, rc, "on or about read #$(i)", PLOG_U32(i), self->curr_read_number + 1);
+ } else if( self->curr_read_number == self->header.number_of_reads ) {
+ DEBUG_MSG(5, ("%s: done loading declared %u reads\n", self->file_name, self->curr_read_number));
+ self->curr_read_number = 0;
+ /* will skip indexes if they are at eof */
+ if( (rc = SFFLoaderFmtSkipIndex(self, file)) == 0 ) {
+ /* This should be the end of file and/or beginning of next */
+ if( (rc = SFFLoaderFmt_ReadBlock(self, file, 0, "EOF", false)) == 0 ) {
+ if( self->file_buf == NULL ) {
+ DEBUG_MSG(5, ("%s: EOF detected\n", self->file_name));
+ self->index_correction = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+const char UsageDefaultName[] = "sff-load";
+
+static
+rc_t SFFLoaderFmtVersion( const SFFLoaderFmt*self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "SFF";
+ return 0;
+}
+
+static
+rc_t SFFLoaderFmtDestroy(SFFLoaderFmt* self, SRATable** table)
+{
+ SRAWriter454_Whack(self->w454, table);
+ SRAWriterIonTorrent_Whack(self->wIonTorrent, table);
+ free(self);
+ return 0;
+}
+
+static
+rc_t SFFLoaderFmtWriteData(SFFLoaderFmt* self, uint32_t argc, const SRALoaderFile* const argv[], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t idx = 0;
+
+ for(idx = 0; rc == 0 && idx < argc; idx ++) {
+ if( (rc = SRALoaderFileName(argv[idx], &self->file_name)) == 0 ) {
+ self->curr_read_number = 0;
+ rc = SFFLoaderFmtWriteDataFile(self, argv[idx]);
+ }
+ }
+ return rc;
+}
+
+static SRALoaderFmt_vt_v1 vtSFFLoaderFmt =
+{
+ 1,
+ 0,
+ SFFLoaderFmtDestroy,
+ SFFLoaderFmtVersion,
+ NULL,
+ SFFLoaderFmtWriteData
+};
+
+rc_t SFFLoaderFmtMake(SRALoaderFmt** self, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SFFLoaderFmt* obj = NULL;
+ const PlatformXML* platform;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcSelf, rcNull);
+ }
+ *self = NULL;
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ return rc;
+ }
+ obj = calloc(1, sizeof(SFFLoaderFmt));
+ if(obj == NULL) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ if( (rc = SRALoaderFmtInit(&obj->dad, (const SRALoaderFmt_vt*)&vtSFFLoaderFmt)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ } else {
+ if( platform->id == SRA_PLATFORM_454 ) {
+ if( (rc = SRAWriter454_Make(&obj->w454, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ }
+ } else {
+ if( (rc = SRAWriterIonTorrent_Make(&obj->wIonTorrent, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize Ion Torrent writer");
+ }
+ }
+ }
+ if(rc == 0) {
+ obj->skip_signal = (config->columnFilter & efltrSIGNAL) && !(config->columnFilter & efltrDEFAULT);
+ *self = &obj->dad;
+ } else {
+ free(obj);
+ }
+ return rc;
+}
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ return SFFLoaderFmtMake(self, config);
+}
diff --git a/tools/sra-load/sra-writer.c b/tools/sra-load/sra-writer.c
new file mode 100644
index 0000000..bbfcb5b
--- /dev/null
+++ b/tools/sra-load/sra-writer.c
@@ -0,0 +1,370 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <klib/rc.h>
+#include <klib/status.h>
+#include <klib/log.h>
+#include <sra/types.h>
+#include <sra/wsradb.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "loader-fmt.h"
+#include "sra-writer.h"
+
+#define SRAWRITER_MAX_READS 256
+
+struct SRAWriter {
+ const SRALoaderConfig* config;
+ int64_t spots_to_run;
+
+ SRATable* table;
+ uint8_t nreads;
+ bool defaults;
+
+ uint32_t col_spot_group_id;
+ uint32_t col_read_start_id;
+ uint32_t col_read_len_id;
+ SRASegment read_segs[SRAWRITER_MAX_READS];
+};
+
+rc_t SRAWriter_Make( SRAWriter** self, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriter* obj = NULL;
+ uint8_t nreads;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetReadNumber(config->experiment, &nreads)) != 0 ) {
+ return rc;
+ }
+ obj = calloc(1, sizeof(*obj));
+ if( obj == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ }
+ obj->config = config;
+ obj->nreads = nreads;
+ obj->spots_to_run = config->spots_to_run;
+ *self = obj;
+ return 0;
+}
+
+void SRAWriter_Whack(SRAWriter* self, SRATable** table)
+{
+ if( self != NULL ) {
+ if( table != NULL ) {
+ *table = self->table;
+ } else {
+ SRATableRelease(self->table);
+ }
+ free(self);
+ }
+}
+
+rc_t SRAWriter_CreateTable(SRAWriter* self, const char* schema)
+{
+ rc_t rc = 0;
+
+ assert(self->table == NULL);
+ if( self == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ } else {
+retry:
+ rc = SRAMgrCreateTable(self->config->sra_mgr, &self->table, schema, "%s", self->config->table_path);
+ if( GetRCObject(rc) == (enum RCObject)rcTable && GetRCState(rc) == rcExists && self->config->force_table_overwrite ) {
+ if( (rc = SRAMgrDropTable(self->config->sra_mgr, true, "%s", self->config->table_path)) == 0 ) {
+ goto retry;
+ }
+ }
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to create table with schema $(schema)", PLOG_S(schema), schema));
+ } else {
+ DEBUG_MSG (7, ("Created table with schema '%s'\n", schema));
+ }
+ return rc;
+}
+
+rc_t SRAWriter_OpenColumnWrite(SRAWriter* self, uint32_t *idx, const char *name, const char *datatype)
+{
+ if( self == NULL ) {
+ return RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ }
+ return SRATableOpenColumnWrite(self->table, idx, NULL, name, datatype);
+}
+
+rc_t SRAWriter_NewSpot(SRAWriter* self, spotid_t *id)
+{
+ rc_t rc = 0;
+ spotid_t s;
+
+ if( self == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ } else {
+ id = id ? id : &s;
+ rc = SRATableNewSpot(self->table, id);
+ if(rc == 0 ) {
+ DEBUG_MSG(3, ("writing spot %lu data\n", *id));
+ }
+ if( (*id % 2000000) == 0 ) {
+ PLOGMSG(klogInt, (klogInfo, "spot $(spot_count)", "severity=status,spot_count=%u", *id));
+ }
+ }
+ return rc;
+}
+
+rc_t SRAWriter_WriteIdxColumn(SRAWriter* self, uint32_t idx, const void *base, uint64_t bytes, bool as_dflt)
+{
+ if( self == NULL ) {
+ return RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ }
+ if( as_dflt ) {
+ return SRATableSetIdxColumnDefault(self->table, idx, base, 0, bytes * 8);
+ }
+ return SRATableWriteIdxColumn(self->table, idx, base, 0, bytes * 8);
+}
+
+rc_t SRAWriter_CloseSpot(SRAWriter* self)
+{
+ rc_t rc = 0;
+ if( self == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ } else {
+ if( (rc = SRATableCloseSpot(self->table)) == 0 ) {
+ rc = Quitting();
+ if( self->spots_to_run > 0 ) {
+ self->spots_to_run--;
+ }
+ if( rc == 0 && self->spots_to_run == 0 ) {
+ rc = RC( rcSRA, rcFormatter, rcWriting, rcTransfer, rcDone);
+ }
+ }
+ }
+ return rc;
+}
+
+/* if data is NULL no default value is written, only column is open */
+static
+rc_t SRAWriter_WDflt(SRAWriter* self, const char *cname, const char *type, const void *data, size_t size)
+{
+ rc_t rc = 0;
+ uint32_t ci = 0;
+
+ if( (rc = SRATableOpenColumnWrite(self->table, &ci, 0, cname, type)) != 0 && GetRCState(rc) != rcExists ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to open column $(column)", PLOG_S(column), cname));
+ } else if( data != NULL && (rc = SRATableSetIdxColumnDefault(self->table, ci, data, 0, size * 8)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write default to column $(column)", PLOG_S(column), cname));
+ } else if( strcmp(cname, "SPOT_GROUP") == 0 ) {
+ self->col_spot_group_id = ci;
+ } else if( strcmp(cname, "READ_START") == 0 ) {
+ self->col_read_start_id = ci;
+ } else if( strcmp(cname, "READ_LEN") == 0 ) {
+ self->col_read_len_id = ci;
+ }
+ return rc;
+}
+
+rc_t SRAWriter_WriteDefaults(SRAWriter* self)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ const PlatformXML* plat;
+ char labels[10240] = "\0";
+ INSDC_SRA_xread_type read_types[SRAWRITER_MAX_READS];
+ INSDC_coord_zero label_start[SRAWRITER_MAX_READS];
+ INSDC_coord_len label_len[SRAWRITER_MAX_READS];
+ bool has_read_seg = false;
+ INSDC_coord_zero read_start[SRAWRITER_MAX_READS];
+ INSDC_coord_len read_len[SRAWRITER_MAX_READS];
+
+ if( self == NULL ) {
+ return RC( rcSRA, rcFormatter, rcWriting, rcSelf, rcNull);
+ }
+ if( self->defaults ) {
+ return 0;
+ }
+ ((SRAWriter*)self)->defaults = true;
+
+ if( (rc = Experiment_GetPlatform(self->config->experiment, &plat)) == 0 ) {
+ SRASegment read_segs[SRAWRITER_MAX_READS];
+ if( (rc = Experiment_ReadSegDefault(self->config->experiment, read_segs)) == 0 ) {
+ has_read_seg = true;
+ for (i = 0; i != self->nreads; ++i) {
+ read_start[i] = read_segs[i].start;
+ read_len[i] = read_segs[i].len;
+ }
+ } else if( GetRCObject(rc) == (enum RCObject)rcData && GetRCState(rc) == rcUnsupported ) {
+ rc = 0;
+ }
+ }
+ for(i = 0; rc == 0 && i < self->nreads; i++) {
+ const ReadSpecXML_read* rspec = NULL;
+ if( (rc = Experiment_GetRead(self->config->experiment, i, &rspec)) != 0 ) {
+ continue;
+ }
+ label_start[i] = strlen(labels);
+ label_len[i] = 0;
+ if( rspec->read_label != NULL ) {
+ label_len[i] = strlen(rspec->read_label);
+ strncat(labels, rspec->read_label, label_len[i]);
+ }
+ read_types[i] = rspec->read_class;
+ }
+
+ if( rc == 0 ) {
+ uint8_t platform = plat->id;
+#if _DEBUGGING
+ DEBUG_MSG (7, ("Default: %hu reads per spot, labels: '%s'\n", self->nreads, labels));
+ for( i = 0; i < self->nreads; i++) {
+ DEBUG_MSG (5, ("Default: Read %u. %s: Label: [%2u:%2u]",
+ i + 1, ( read_types[i] & SRA_READ_TYPE_BIOLOGICAL ) ? " Bio" : "Tech",
+ label_start[i], label_len[i]));
+ if( has_read_seg ) {
+ DEBUG_MSG (5, (" Seg: [%3u:%3u]", read_start[i], read_len[i]));
+ }
+ DEBUG_MSG (5, ("\n"));
+ }
+#endif
+ /* TBD: SPOT_GROUP on demand, remove NREADS!! */
+ if( (rc = SRAWriter_WDflt(self, "PLATFORM", sra_platform_id_t, &platform, sizeof(platform))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "NREADS", vdb_uint8_t, &self->nreads, sizeof(self->nreads))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "LABEL", vdb_ascii_t, labels, strlen(labels))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "LABEL_START", "INSDC:coord:zero", label_start, self->nreads * sizeof(label_start[0]))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "LABEL_LEN", vdb_uint32_t, label_len, self->nreads * sizeof(label_len[0]))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "READ_TYPE", sra_read_type_t, read_types, self->nreads * sizeof(read_types[0]))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "SPOT_GROUP", vdb_ascii_t, "", 0)) != 0 ||
+ (rc = SRAWriter_WDflt(self, "READ_START", "INSDC:coord:zero", has_read_seg ? read_start : NULL, self->nreads * sizeof(read_start[0]))) != 0 ||
+ (rc = SRAWriter_WDflt(self, "READ_LEN", vdb_uint32_t, has_read_seg ? read_len : NULL, self->nreads * sizeof(read_len[0]))) != 0 ) {
+ return rc;
+ }
+ }
+ return rc;
+}
+
+rc_t SRAWriter_WriteSpotSegment(SRAWriter* self, const SRALoaderFile* file,
+ const char* file_member_name, uint32_t nbases, const char* bases)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || file == NULL || bases == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcMultiplexing, rcParam, rcNull);
+ } else if ( self->col_spot_group_id == 0 || self->col_read_start_id == 0 || self->col_read_len_id == 0 ) {
+ rc = RC( rcSRA, rcFormatter, rcMultiplexing, rcSelf, rcCorrupt);
+ } else {
+ const char* data_block_member_name = NULL;
+ const char* assigned_member_name = NULL;
+
+ DEBUG_MSG (5, ("file spot member_name '%s'\n", file_member_name));
+ if( file_member_name != NULL &&
+ (strcasecmp(file_member_name, "default") == 0 || strcasecmp(file_member_name, "0") == 0) ) {
+ file_member_name = "";
+ }
+ rc = SRALoaderFileMemberName(file, &data_block_member_name);
+ DEBUG_MSG (5, ("data block member_name '%s'\n", data_block_member_name));
+
+ if( rc == 0 && (rc = Experiment_MemberSeg(self->config->experiment, file_member_name, data_block_member_name,
+ nbases, bases, ((SRAWriter*)self)->read_segs, &assigned_member_name)) == 0 ) {
+ DEBUG_MSG (5, ("Assigned member '%s'\n", assigned_member_name));
+ if( assigned_member_name != NULL ) {
+ if( (rc = SRATableWriteIdxColumn(self->table, self->col_spot_group_id, assigned_member_name, 0, strlen(assigned_member_name) * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=SPOT_GROUP"));
+ }
+ }
+ if( rc == 0 ) {
+ int32_t read_start[SRAWRITER_MAX_READS];
+ uint32_t read_len[SRAWRITER_MAX_READS];
+ int i;
+
+ for (i = 0; i < self->nreads; i++) {
+ read_start[i] = self->read_segs[i].start;
+ read_len[i] = self->read_segs[i].len;
+ }
+
+ if( (rc = SRATableWriteIdxColumn(self->table, self->col_read_start_id, read_start, 0, sizeof(read_start[0]) * self->nreads * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_START"));
+ } else if( (rc = SRATableWriteIdxColumn(self->table, self->col_read_len_id, read_len, 0, sizeof(read_len[0]) * self->nreads * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_LEN"));
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t SRAWriter_WriteSpotSegmentSimple(SRAWriter* self, const SRALoaderFile* file, const char* file_member_name, const SRASegment* read_seg)
+{
+ rc_t rc = 0;
+
+ if( self == NULL || file == NULL ) {
+ rc = RC( rcSRA, rcFormatter, rcMultiplexing, rcParam, rcNull);
+ } else if ( self->col_spot_group_id == 0 || self->col_read_start_id == 0 || self->col_read_len_id == 0 ) {
+ rc = RC( rcSRA, rcFormatter, rcMultiplexing, rcSelf, rcCorrupt);
+ } else {
+ const char* data_block_member_name = NULL;
+ const char* assigned_member_name = NULL;
+
+ DEBUG_MSG (5, ("file spot member_name '%s'\n", file_member_name));
+ if( file_member_name != NULL &&
+ (strcasecmp(file_member_name, "default") == 0 || strcasecmp(file_member_name, "0") == 0) ) {
+ file_member_name = "";
+ }
+ rc = SRALoaderFileMemberName(file, &data_block_member_name);
+ DEBUG_MSG (5, ("data block member_name '%s'\n", data_block_member_name));
+
+ if( rc == 0 && (rc = Experiment_MemberSegSimple(self->config->experiment, file_member_name, data_block_member_name,
+ &assigned_member_name)) == 0 ) {
+ DEBUG_MSG (5, ("Assigned member '%s'\n", assigned_member_name));
+ if( assigned_member_name != NULL ) {
+ if( (rc = SRATableWriteIdxColumn(self->table, self->col_spot_group_id, assigned_member_name, 0, strlen(assigned_member_name) * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=SPOT_GROUP"));
+ }
+ }
+ if( rc == 0 ) {
+ int32_t read_start[SRAWRITER_MAX_READS];
+ uint32_t read_len[SRAWRITER_MAX_READS];
+ int i;
+
+ for (i = 0; i < self->nreads; i++) {
+ read_start[i] = read_seg[i].start;
+ read_len[i] = read_seg[i].len;
+ }
+
+ if( (rc = SRATableWriteIdxColumn(self->table, self->col_read_start_id, read_start, 0, sizeof(read_start[0]) * self->nreads * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_START"));
+ } else if( (rc = SRATableWriteIdxColumn(self->table, self->col_read_len_id, read_len, 0, sizeof(read_len[0]) * self->nreads * 8 )) != 0 ) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_LEN"));
+ }
+ }
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-load/sra-writer.h b/tools/sra-load/sra-writer.h
new file mode 100644
index 0000000..bae5bb2
--- /dev/null
+++ b/tools/sra-load/sra-writer.h
@@ -0,0 +1,92 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_sra_writer_
+#define _sra_load_sra_writer_
+
+#include <sra/sradb.h>
+
+typedef struct SRAWriter SRAWriter;
+
+/* Make SRAWriter from configuration
+ */
+rc_t SRAWriter_Make( SRAWriter** self, const SRALoaderConfig* config);
+
+rc_t SRAWriter_CreateTable(SRAWriter* self, const char* schema);
+
+rc_t SRAWriter_OpenColumnWrite(SRAWriter* self, uint32_t *idx, const char *name, const char *datatype);
+
+#define COL_OPEN(colid, name, type) \
+ if( (rc = SRAWriter_OpenColumnWrite(self->base, &colid, name, type)) != 0 ) { \
+ if( GetRCState(rc) != rcExists ) { \
+ LOGERR(klogInt, rc, "failed to open column " name " of type " type); \
+ return rc; \
+ } \
+ rc = 0; \
+ }
+
+rc_t SRAWriter_NewSpot(SRAWriter* self, spotid_t *id);
+
+rc_t SRAWriter_WriteIdxColumn(SRAWriter* self, uint32_t idx, const void *base, uint64_t bytes, bool as_dflt);
+
+#define COL_WRITE(colid, name, pstring) \
+ if( colid != 0 ) { \
+ if( (rc = SRAWriter_WriteIdxColumn(cself->base, colid, pstring.data, pstring.len, false)) != 0 ) { \
+ LOGERR(klogInt, rc, "failed to write column " name); \
+ return rc; \
+ } \
+ }
+
+#define COL_WRITE_DEFAULT(colid, name, pstring) \
+ if( colid != 0 ) { \
+ if( (rc = SRAWriter_WriteIdxColumn(cself->base, colid, pstring.data, pstring.len, true)) != 0 ) { \
+ LOGERR(klogInt, rc, "failed to write default to column " name); \
+ return rc; \
+ } \
+ }
+
+rc_t SRAWriter_CloseSpot(SRAWriter* self);
+
+/* Writes default values ONLY ONCE to common SRATable columns
+ * bases_per_spot [IN, OPTIONAL] - 0 ignored, otherwise used in default READ_SEG calculations
+ */
+rc_t SRAWriter_WriteDefaults(SRAWriter* self);
+
+/* WriteSpotSegment
+ * Will determine SPOT_GROUP and READ_SEG values and write them to table to current spot
+ *
+ * file [IN] - current file
+ * member_name [IN,NULL] - value extracted from a spotname if present
+ * bases [IN] - 2na FASTA string
+ * nbases [IN] - bases number (length)
+ * read_seg [OUT,OPTIONAL] - calculated READ_SEG values
+ */
+rc_t SRAWriter_WriteSpotSegment(SRAWriter* self, const SRALoaderFile* file, const char* file_member_name, uint32_t nbases, const char* bases);
+
+rc_t SRAWriter_WriteSpotSegmentSimple(SRAWriter* self, const SRALoaderFile* file, const char* file_member_name, const SRASegment* read_seg);
+
+void SRAWriter_Whack(SRAWriter* self, SRATable** table);
+
+#endif /* _sra_load_sra_writer_ */
diff --git a/tools/sra-load/srf-absolid.c b/tools/sra-load/srf-absolid.c
new file mode 100644
index 0000000..a938766
--- /dev/null
+++ b/tools/sra-load/srf-absolid.c
@@ -0,0 +1,497 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kapp/main.h>
+
+typedef struct SRFAbsolidLoaderFmt SRFAbsolidLoaderFmt;
+
+#define SRALOADERFMT_IMPL SRFAbsolidLoaderFmt
+#include "loader-fmt.h"
+
+#include "srf.h"
+#include "ztr-absolid.h"
+#include "srf-fmt.h"
+#include "pstring.h"
+#include "writer-absolid.h"
+#include "debug.h"
+
+#include <endian.h>
+#include <byteswap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <assert.h>
+
+typedef struct fe_context_t_struct {
+ SRF_context ctx;
+ bool skip_signal;
+ const SRAWriteAbsolid* writer;
+
+ pstring name_prefix;
+
+ struct {
+ uint8_t nreads;
+ uint16_t start[ABSOLID_FMT_MAX_NUM_READS+1];
+ pstring label[ABSOLID_FMT_MAX_NUM_READS+1];
+ char cs_key[ABSOLID_FMT_MAX_NUM_READS+1];
+ EAbisolidReadType type[ABSOLID_FMT_MAX_NUM_READS+1];
+ } region;
+} fe_context_t;
+
+static
+rc_t set_label_type(const char* label, pstring* name, EAbisolidReadType* type)
+{
+ rc_t rc = 0;
+
+ assert(name && type);
+
+ *type = AbsolidRead_Suffix2ReadType(label);
+
+ if( *type == eAbisolidReadType_Unknown ) {
+ DEBUG_MSG(3, ("read label is not recognized: '%s'\n", label));
+ } else {
+ const char* l = AbisolidReadType2ReadLabel[*type];
+ rc = pstring_assign(name, l, strlen(l));
+ }
+ return rc;
+}
+
+static
+rc_t fe_new_region(fe_context_t *self, size_t region_count, const region_t region[])
+{
+ rc_t rc = 0;
+ int i;
+
+ self->region.nreads = region_count / 2;
+ DEBUG_MSG(3, ("REGION: %u -> %u reads\n", region_count, self->region.nreads));
+ if( self->region.nreads <= 0 || self->region.nreads > ABSOLID_FMT_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnsupported);
+ SRALoaderFile_LOG(self->ctx.file, klogErr, rc, "read count $(c)", PLOG_U8(c), self->region.nreads);
+ }
+ for(i = 0; rc == 0 && i < self->region.nreads ; i++ ) {
+ int j = i * 2 + 1;
+ self->region.start[i] = region[j].start;
+ if( (rc = set_label_type(region[j].name, &self->region.label[i], &self->region.type[i])) != 0 ) {
+ break;
+ }
+ self->region.cs_key[i] = region[j - 1].name[0];
+ DEBUG_MSG(3, ("REGION[%u]: '%s', %u, '%c', start: %u\n",
+ i, self->region.label[i].data, self->region.type[i], self->region.cs_key[i], self->region.start[i]));
+ switch(region[j].type) {
+ case Biological:
+ case Normal:
+ case Paired:
+ case Technical:
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ SRALoaderFile_LOG(self->ctx.file, klogErr, rc, "read #$(read_id) type mismatch; expected $(expected), got $(got)",
+ "read_id=%u,expected=%s,got=%u", i, "(B|N|P|T)", region[j].type);
+ return rc;
+ }
+ }
+ if( rc == 0 &&
+ self->region.nreads > 1 && self->region.type[0] == self->region.type[1] ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcDuplicate);
+ SRALoaderFile_LOG(self->ctx.file, klogErr, rc, "both reads have same type", NULL);
+ }
+ return rc;
+}
+
+static
+rc_t parse_v1_header(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size)
+{
+ rc_t rc = 0;
+ size_t parsed;
+ char prefixType;
+ uint32_t counter;
+ ztr_raw_t ztr_raw;
+ ztr_t ztr;
+ enum ztr_chunk_type type;
+ fe_context_t* fe = (fe_context_t*)ctx;
+
+ if( (rc = SRF_ParseDataChunk(data, size, &parsed, &fe->name_prefix, &prefixType, &counter)) != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse SRF chunk", NULL);
+ }
+ DEBUG_MSG(3, ("HEADER PREFIX: '%s'\n", fe->name_prefix.data));
+ if((rc = ABI_ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed)) != 0) {
+ return rc;
+ }
+ if((rc = ABI_ZTR_ParseHeader(ztr_ctx)) != 0) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse ZTR header", NULL);
+ }
+ while(rc == 0 && !ABI_ZTR_BufferIsEmpty(ztr_ctx)) {
+ if((rc = ABI_ZTR_ParseBlock(ztr_ctx, &ztr_raw)) != 0) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to parse ZTR chunk", NULL);
+ }
+ if((rc = ABI_ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "parse_v1_header - failed to process ZTR chunk", NULL);
+ }
+ if(type == REGN) {
+ rc = fe_new_region(fe, ztr.region->count, ztr.region->region);
+ }
+ if(*(void **)&ztr != NULL) {
+ free(*(void **)&ztr);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t fe_new_read(fe_context_t *self, pstring *readId, EAbisolidReadType* type, pstring* label)
+{
+ rc_t rc = 0;
+ pstring name_suffix;
+ const char* p;
+
+ assert(self && readId && type && label);
+ DEBUG_MSG(3, ("READ_LABEL: '%s'\n", readId->data));
+ /* spot name suffix may end with '_(F|R).+' */
+ p = strrchr(readId->data, '_');
+ if( p != NULL ) {
+ rc = set_label_type(p + 1, label, type);
+ if( rc == 0 && *type > eAbisolidReadType_SPOT) {
+ /* cut label */
+ readId->len -= label->len + 1;
+ }
+ } else {
+ pstring_clear(label);
+ *type = eAbisolidReadType_SPOT;
+ }
+ if( rc == 0 && (rc = pstring_copy(&name_suffix, readId)) == 0 ) {
+ rc = SRAWriteAbsolid_MakeName(&self->name_prefix, &name_suffix, readId);
+ }
+ return rc;
+}
+
+static
+rc_t parse_v1_read(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size)
+{
+ rc_t rc = 0;
+ size_t i, parsed;
+ ztr_raw_t ztr_raw;
+ ztr_t ztr;
+ enum ztr_chunk_type type;
+ fe_context_t* fe = (fe_context_t*)ctx;
+
+ uint8_t flags;
+ pstring readId;
+ EAbisolidReadType read_type;
+ pstring label;
+
+ AbsolidRead read[ABSOLID_FMT_MAX_NUM_READS];
+
+ if( fe->region.nreads == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcNotFound);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "missing region chunk before 1st read chunk", NULL);
+ }
+ if( (rc = SRF_ParseReadChunk(data, size, &parsed, &flags, &readId)) != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rc);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "SRF parsing failure", NULL);
+ }
+ ABI_ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed);
+
+ /* readId will have spotname */
+ if( (rc = fe_new_read(fe, &readId, &read_type, &label)) != 0 ) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "parsing spot name suffix", NULL);
+ }
+ for(i = 0; i < sizeof(read) / sizeof(read[0]); i++) {
+ AbsolidRead_Init(&read[i]);
+ }
+ while(!ABI_ZTR_BufferIsEmpty(ztr_ctx)) {
+ if( (rc = ABI_ZTR_ParseBlock(ztr_ctx, &ztr_raw)) != 0 ||
+ (rc = ABI_ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "ZTR parsing failure", NULL);
+ break;
+ }
+ switch (type) {
+ case BASE:
+ if(ztr.sequence->datatype != i8) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "read: expected 8-bit datatype", NULL);
+ } else if( read_type > eAbisolidReadType_SPOT ) {
+ int read_number = AbisolidReadType2ReadNumber[read_type];
+ if( (rc = pstring_assign(&read[read_number].seq, ztr.sequence->data, ztr.sequence->datasize)) == 0 ) {
+ /* grab 1st, may be the only cs_key */
+ read[read_number].cs_key = fe->region.cs_key[0];
+ for(i = 1; i < fe->region.nreads; i++) {
+ if( read_type == fe->region.type[i] ) {
+ read[read_number].cs_key = fe->region.cs_key[i];
+ break;
+ }
+ }
+ SRF_set_read_filter(&read[read_number].filter, flags);
+ rc = pstring_copy(&read[read_number].label, &label);
+ DEBUG_MSG(3, ("SRF READ: '%s'\n", read[read_number].seq.data));
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying read", NULL);
+ }
+ } else {
+ for(i = 0; rc == 0 && i < fe->region.nreads; i++) {
+ int read_number = AbisolidReadType2ReadNumber[fe->region.type[i]];
+ size_t len = (i + 1 >= fe->region.nreads ? ztr.sequence->datasize : fe->region.start[i + 1]) - fe->region.start[i];
+ rc = pstring_assign(&read[read_number].seq, &ztr.sequence->data[fe->region.start[i]], len);
+ read[read_number].cs_key = fe->region.cs_key[i];
+ SRF_set_read_filter(&read[read_number].filter, flags);
+ if( fe->region.label[i].len != 0 ) {
+ rc = pstring_copy(&read[read_number].label, &fe->region.label[i]);
+ }
+ DEBUG_MSG(3, ("SRF READ[%u]: '%s'\n", i, read[read_number].seq.data));
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying reads", NULL);
+ }
+ }
+ break;
+ case CNF1:
+ if(ztr.quality1->datatype != i8) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "quality: expected 8-bit datatype", NULL);
+ } else if( read_type > eAbisolidReadType_SPOT ) {
+ int read_number = AbisolidReadType2ReadNumber[read_type];
+ if( (rc = pstring_assign(&read[read_number].qual, ztr.quality1->data, ztr.quality1->datasize)) == 0 ) {
+ DEBUG_MSG(3, ("SRF QUAL: %u bytes\n", read[read_number].qual.len));
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying quality", NULL);
+ }
+ } else {
+ for(i = 0; rc == 0 && i < fe->region.nreads; i++) {
+ int read_number = AbisolidReadType2ReadNumber[fe->region.type[i]];
+ size_t len = (i + 1 >= fe->region.nreads ? ztr.quality1->datasize : fe->region.start[i + 1]) - fe->region.start[i];
+ rc = pstring_assign(&read[read_number].qual, &ztr.quality1->data[fe->region.start[i]], len);
+ DEBUG_MSG(3, ("SRF QUAL[%u]: %u bytes\n", i, read[read_number].qual.len));
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying qualities", NULL);
+ }
+ }
+ break;
+ case SAMP:
+ if( !fe->skip_signal ) {
+ size_t i;
+ int stype = ABSOLID_FMT_COLMASK_NOTSET;
+ if(ztr.signal->datatype != f32) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "signal: expected 32-bit float datatype", NULL);
+ } else if( (ztr.signal->datasize % sizeof(float)) != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "signal: size not 32-bit float aligned", NULL);
+ } else if (ztr.signal->channel == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcIncomplete);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "SIGNAL column: missing channel type", NULL);
+ } else if(strcmp(ztr.signal->channel, "0FAM") == 0) {
+ stype = ABSOLID_FMT_COLMASK_FAM;
+ } else if(strcmp(ztr.signal->channel, "1CY3") == 0) {
+ stype = ABSOLID_FMT_COLMASK_CY3;
+ } else if(strcmp(ztr.signal->channel, "2TXR") == 0) {
+ stype = ABSOLID_FMT_COLMASK_TXR;
+ } else if(strcmp(ztr.signal->channel, "3CY5") == 0) {
+ stype = ABSOLID_FMT_COLMASK_CY5;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "SIGNAL column: unexpected channel type", NULL);
+ }
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ for(i = 0; rc == 0 && i < ztr.signal->datasize; i += 4) {
+ uint32_t* r = (uint32_t*)&ztr.signal->data[i];
+ *r = bswap_32(*r);
+ }
+#endif
+ if( rc == 0 ) {
+ if( read_type > eAbisolidReadType_SPOT ) {
+ int read_number = AbisolidReadType2ReadNumber[read_type];
+ pstring* d = NULL;
+ switch(stype) {
+ case ABSOLID_FMT_COLMASK_FAM:
+ read[read_number].fs_type = eAbisolidFSignalType_FAM;
+ d = &read[read_number].fxx;
+ break;
+ case ABSOLID_FMT_COLMASK_CY3:
+ d = &read[read_number].cy3;
+ break;
+ case ABSOLID_FMT_COLMASK_TXR:
+ d = &read[read_number].txr;
+ break;
+ case ABSOLID_FMT_COLMASK_CY5:
+ d = &read[read_number].cy5;
+ break;
+ }
+ if( d ) {
+ rc = pstring_assign(d, ztr.signal->data, ztr.signal->datasize);
+ DEBUG_MSG(3, ("SRF SIGNAL[%s]: %u bytes\n", ztr.signal->channel, d->len));
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnrecognized);
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying signal", NULL);
+ }
+ } else {
+ if( fe->region.nreads <= 0 || fe->region.nreads > ABSOLID_FMT_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnsupported);
+ SRALoaderFile_LOG(fe->ctx.file, klogErr, rc, "read count $(c)", PLOG_U8(c), fe->region.nreads);
+ }
+
+ for(i = 0; rc == 0 && i < fe->region.nreads; i++) {
+ pstring* d = NULL;
+ int read_number = AbisolidReadType2ReadNumber[fe->region.type[i]];
+ size_t len = (i + 1 >= fe->region.nreads) ? ztr.signal->datasize : (fe->region.start[i + 1] * sizeof(float));
+ len -= fe->region.start[i] * sizeof(float);
+ switch(stype) {
+ case ABSOLID_FMT_COLMASK_FAM:
+ read[read_number].fs_type = eAbisolidFSignalType_FAM;
+ d = &read[read_number].fxx;
+ break;
+ case ABSOLID_FMT_COLMASK_CY3:
+ d = &read[read_number].cy3;
+ break;
+ case ABSOLID_FMT_COLMASK_TXR:
+ d = &read[read_number].txr;
+ break;
+ case ABSOLID_FMT_COLMASK_CY5:
+ d = &read[read_number].cy5;
+ break;
+ }
+ if( d ) {
+ rc = pstring_assign(d, &ztr.signal->data[fe->region.start[i] * sizeof(float)], len);
+ DEBUG_MSG(3, ("SRF SIGNAL[%s]: %u bytes\n", ztr.signal->channel, d->len));
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnrecognized);
+ }
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "copying signals", NULL);
+ }
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ if(type != none && type != ignore) {
+ free(*(void **)&ztr);
+ }
+ }
+ if(rc == 0) {
+ if( read_type <= eAbisolidReadType_SPOT ) {
+ rc = SRAWriteAbsolid_Write(fe->writer, ctx->file, &readId, NULL, &read[0], &read[1]);
+ } else {
+ switch( AbisolidReadType2ReadNumber[read_type] ) {
+ case 0:
+ rc = SRAWriteAbsolid_Write(fe->writer, ctx->file, &readId, NULL, &read[0], NULL);
+ break;
+ case 1:
+ rc = SRAWriteAbsolid_Write(fe->writer, ctx->file, &readId, NULL, NULL, &read[1]);
+ break;
+ default:
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnsupported);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "more than 2 reads", NULL);
+ break;
+ }
+ }
+ }
+ return rc;
+}
+
+struct SRFAbsolidLoaderFmt {
+ SRALoaderFmt dad;
+ fe_context_t fe;
+};
+
+static
+rc_t SRFAbsolidLoaderFmt_WriteData(SRFAbsolidLoaderFmt *self, uint32_t argc, const SRALoaderFile *const argv [], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t i;
+
+ for(i = 0; rc == 0 && i < argc; i++) {
+ self->fe.ctx.file = argv[i];
+ if( (rc = SRALoaderFileName(argv[i], &self->fe.ctx.file_name)) == 0 ) {
+ rc = SRF_parse(&self->fe.ctx, parse_v1_header, parse_v1_read, ABI_ZTR_CreateContext, ABI_ZTR_ContextRelease);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SRFAbsolidLoaderFmt_Whack(SRFAbsolidLoaderFmt* self, SRATable** table)
+{
+ SRAWriteAbsolid_Whack(self->fe.writer, table);
+ free(self);
+ return 0;
+}
+
+static
+rc_t SRFAbsolidLoaderFmt_Version( const SRFAbsolidLoaderFmt* self, uint32_t* vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "AB SOLiD SRF";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 SRFAbsolidLoaderFmt_vt_v1 =
+{
+ 1, 0,
+ SRFAbsolidLoaderFmt_Whack,
+ SRFAbsolidLoaderFmt_Version,
+ NULL,
+ SRFAbsolidLoaderFmt_WriteData
+};
+
+rc_t SRFABSolidLoaderFmt_Make(SRALoaderFmt** self, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRFAbsolidLoaderFmt* fmt;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&SRFAbsolidLoaderFmt_vt_v1)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ } else if( (rc = SRAWriteAbsolid_Make(&fmt->fe.writer, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ }
+ if( rc == 0 ) {
+ fmt->fe.skip_signal = (config->columnFilter & (efltrSIGNAL | efltrDEFAULT));
+ *self = &fmt->dad;
+ } else {
+ free(fmt);
+ }
+ return rc;
+}
diff --git a/tools/sra-load/srf-fmt.c b/tools/sra-load/srf-fmt.c
new file mode 100644
index 0000000..52a59ec
--- /dev/null
+++ b/tools/sra-load/srf-fmt.c
@@ -0,0 +1,267 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "srf.h"
+#include "ztr.h"
+#include "srf-fmt.h"
+#include "experiment-xml.h"
+#include "debug.h"
+
+
+const char UsageDefaultName[] = "srf-load";
+
+extern rc_t SRFIlluminaLoaderFmt_Make(SRALoaderFmt **self, const SRALoaderConfig *config);
+
+extern rc_t SRFABSolidLoaderFmt_Make(SRALoaderFmt **self, const SRALoaderConfig *config);
+
+rc_t SRALoaderFmtMake(SRALoaderFmt **self, const SRALoaderConfig *config)
+{
+ rc_t rc = 0;
+ const PlatformXML* platform;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) == 0 ) {
+ switch(platform->id) {
+ case SRA_PLATFORM_ILLUMINA:
+ rc = SRFIlluminaLoaderFmt_Make(self, config);
+ break;
+ case SRA_PLATFORM_ABSOLID:
+ rc = SRFABSolidLoaderFmt_Make(self, config);
+ break;
+
+ default:
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcFormat, rcUnknown);
+ }
+ }
+ return rc;
+}
+
+/* BIGGER than internal SRALoaderFile buffer chunks handling
+ * skips 'skipover' bytes in buffer and makes 'bsize' bytes available via 'data',
+ * caller may want to skip 'skipover' returned back after 'data' is used
+ * call with all params zero to deallocated internal buffer
+ */
+static
+rc_t SRF_parse_prepdata(SRF_context* ctx, uint64_t bsize, const uint8_t** data, size_t* skipover)
+{
+ rc_t rc = 0;
+ static size_t big_buffer_sz = 0;
+ static uint8_t* big_buffer = NULL;
+
+ if( ctx == NULL && bsize == 0 && data == NULL && skipover == NULL ) {
+ free(big_buffer);
+ big_buffer = NULL;
+ big_buffer_sz = 0;
+ return 0;
+ }
+ assert(ctx != NULL), assert(data != NULL), assert(skipover != NULL);
+
+ /* prepare bsize bytes in buffer */
+ rc = SRALoaderFileRead(ctx->file, *skipover, bsize, (const void**)&ctx->file_buf, &ctx->file_buf_sz);
+ if( rc != 0 || ctx->file_buf == NULL || ctx->file_buf_sz == 0 || ctx->file_buf_sz > bsize ) {
+ if( GetRCObject(rc) != (enum RCObject)rcBuffer || GetRCState(rc) != rcInsufficient ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcParsing, rcData, ctx->file_buf_sz > bsize ? rcExcessive : rcInsufficient);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "expected $(expected) bytes chunk", PLOG_U64(expected), bsize);
+ return rc;
+ }
+ rc = 0;
+ }
+ if( ctx->file_buf_sz == bsize ) {
+ /* data fitted in file buffer, use it directly */
+ *data = ctx->file_buf;
+ *skipover = bsize;
+ } else {
+ size_t to_read = bsize, inbuf = 0;
+
+ DEBUG_MSG(3, ("file buffer overflow on chunk %lu bytes\n", bsize));
+ if( big_buffer_sz < bsize ) {
+ uint8_t* d = realloc(big_buffer, bsize);
+ DEBUG_MSG(3, ("grow internal chunk buffer to %lu bytes\n", bsize));
+ if (d == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "reading chunk of $(bytes) bytes", PLOG_U64(bytes), bsize);
+ } else {
+ big_buffer = d;
+ big_buffer_sz = bsize;
+ }
+ }
+ while( rc == 0 && to_read > 0 ) {
+ size_t x = to_read > ctx->file_buf_sz ? ctx->file_buf_sz : to_read;
+ memmove(&big_buffer[inbuf], ctx->file_buf, x);
+ to_read -= x;
+ inbuf += x;
+ rc = SRALoaderFileRead(ctx->file, x, to_read, (const void**)&ctx->file_buf, &ctx->file_buf_sz);
+ if( rc != 0 || ((ctx->file_buf == NULL || ctx->file_buf_sz == 0) && to_read > 0) ) {
+ if( GetRCObject(rc) != (enum RCObject)rcBuffer || GetRCState(rc) != rcInsufficient ) {
+ rc = rc ? rc : RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "expected $(expected) bytes of $(chunk) chunk",
+ PLOG_2(PLOG_U64(expected),PLOG_U64(chunk)), to_read, bsize);
+ return rc;
+ }
+ rc = 0;
+ }
+ }
+ *data = big_buffer;
+ *skipover = 0;
+ }
+ return rc;
+}
+
+rc_t SRF_parse(SRF_context *ctx, SRF_parse_header_func* header, SRF_parse_read_func* read,
+ rc_t (*zcreate)(ZTR_Context **ctx), rc_t (*zrelease)(ZTR_Context *self))
+{
+ rc_t rc = 0;
+ bool first_block = true;
+ enum SRF_ChunkTypes type = SRF_ChunkTypeUnknown;
+ uint64_t bsize;
+ size_t dataOffset;
+ size_t skipover = 0;
+ ZTR_Context *ztr_ctx = NULL;
+ const char* errmsg;
+
+ while( rc == 0 ) {
+ errmsg = NULL;
+ /* SRF_ParseChunk needs 5-16 bytes to be in buffer */
+ if( (rc = SRALoaderFileRead(ctx->file, skipover, 16, (const void**)&ctx->file_buf, &ctx->file_buf_sz)) != 0 ) {
+ errmsg = "chunk start";
+ break;
+ }
+ if( ctx->file_buf == NULL ) {
+ /* EOF */
+ break;
+ }
+ rc = SRF_ParseChunk(ctx->file_buf, ctx->file_buf_sz, &bsize, &type, &dataOffset);
+ if( rc == rcInvalid ) {
+ /* not a chunk; might be an index pointer, if so then skip it */
+ skipover = 8;
+ /* reset to start in case files were concatinated */
+ first_block = true;
+ rc = 0;
+ continue;
+ } else if( rc != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rc);
+ errmsg = "chunk head";
+ break;
+ }
+ if( first_block && type != SRF_ChunkTypeContainer ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt);
+ errmsg = "expected SRF container header";
+ break;
+ }
+ if( type == SRF_ChunkTypeIndex ) {
+ /* index is at least 16 bytes */
+ if( ctx->file_buf_sz < 16 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+ errmsg = "index chunk";
+ break;
+ }
+ /* rest of the chunk index ignored */
+ skipover = bsize;
+ } else if( type == SRF_ChunkTypeXML ) {
+ /* ignore XML chunk */
+ skipover = bsize;
+ } else {
+ const uint8_t* data;
+ bsize -= dataOffset;
+ skipover = dataOffset;
+ if( (rc = SRF_parse_prepdata(ctx, bsize, &data, &skipover)) == 0 ) {
+ switch (type) {
+ case SRF_ChunkTypeContainer:
+ {{
+ unsigned versMajor = 0;
+ unsigned versMinor = 0;
+ char contType = '\0';
+ if( (rc = SRF_ParseContainerHeader(data, bsize, &versMajor, &versMinor, &contType, NULL, NULL)) != 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rc);
+ errmsg = "container header";
+ }
+ if(versMajor != 1) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcBadVersion);
+ } else if(contType != 'Z') {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ errmsg = "container type";
+ }
+ SRALoaderFile_LOG(ctx->file, klogInfo, 0, "parsing SRF v$(vers)", "vers=%u.%u", versMajor, versMinor);
+ first_block = false;
+ }}
+ break;
+
+ case SRF_ChunkTypeHeader:
+ if (ztr_ctx != NULL) {
+ (*zrelease)(ztr_ctx);
+ ztr_ctx = NULL;
+ }
+ if( (rc = (*zcreate)(&ztr_ctx)) == 0) {
+ rc = (*header)(ctx, ztr_ctx, data, bsize);
+ }
+ break;
+
+ case SRF_ChunkTypeRead:
+ rc = (*read)(ctx, ztr_ctx, data, bsize);
+ break;
+
+ default:
+ /* this is impossible */
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ errmsg = "unexpected chunk type";
+ break;
+ }
+ }
+ }
+ }
+ SRF_parse_prepdata(NULL, 0, NULL, NULL); /* free internal buffer */
+ (*zrelease)(ztr_ctx);
+ if( rc != 0 ) {
+ if( errmsg ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "$(msg) - chunk type '$(type)'",
+ PLOG_2(PLOG_C(type),PLOG_S(msg)), type, errmsg);
+ } else {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "chunk type '$(type)'", PLOG_C(type), type);
+ }
+ }
+ return rc;
+}
+
+void SRF_set_read_filter(uint8_t* filter, int SRF_flags)
+{
+ assert(filter != NULL);
+
+ if( ( SRF_flags & SRF_READ_WITHDRAWN ) != 0 ) {
+ *filter = SRA_READ_FILTER_REJECT;
+ } else if( ( SRF_flags & SRF_READ_BAD ) != 0 ) {
+ *filter = SRA_READ_FILTER_CRITERIA;
+ } else {
+ *filter = SRA_READ_FILTER_PASS;
+ }
+}
diff --git a/tools/sra-load/srf-fmt.h b/tools/sra-load/srf-fmt.h
new file mode 100644
index 0000000..f9ea3cf
--- /dev/null
+++ b/tools/sra-load/srf-fmt.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_srf_fmt_
+#define _sra_load_srf_fmt_
+
+#include "loader-fmt.h"
+
+typedef struct SRF_context_struct {
+ const SRALoaderFile *file;
+ const char* file_name;
+ const uint8_t* file_buf;
+ size_t file_buf_sz;
+} SRF_context;
+
+typedef rc_t (SRF_parse_header_func)(SRF_context* ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size);
+typedef rc_t (SRF_parse_read_func)(SRF_context* ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size);
+
+rc_t SRF_parse(SRF_context* ctx, SRF_parse_header_func* header, SRF_parse_read_func* read,
+ rc_t (*create)(ZTR_Context **ctx), rc_t (*release)(ZTR_Context *self));
+
+void SRF_set_read_filter(uint8_t* filter, int SRF_flags);
+
+#endif /* _sra_load_srf_fmt_ */
diff --git a/tools/sra-load/srf-illumina.c b/tools/sra-load/srf-illumina.c
new file mode 100644
index 0000000..05716ea
--- /dev/null
+++ b/tools/sra-load/srf-illumina.c
@@ -0,0 +1,453 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+typedef struct SRFIlluminaLoaderFmt SRFIlluminaLoaderFmt;
+
+#define SRALOADERFMT_IMPL SRFIlluminaLoaderFmt
+#include "loader-fmt.h"
+
+#include "srf.h"
+#include "ztr.h"
+#include "srf-fmt.h"
+#include "ztr-illumina.h"
+#include "writer-illumina.h"
+#include "debug.h"
+
+typedef struct fe_context_t_struct {
+
+ SRF_context ctx;
+ bool skip_intensity;
+ bool skip_signal;
+ bool skip_noise;
+
+ const uint8_t *defered;
+ uint32_t defered_len;
+
+ const SRAWriterIllumina* writer;
+
+ pstring name_prefix;
+
+ IlluminaRead read;
+
+ ztr_t sequence;
+ ztr_t quality1;
+ ztr_t quality4;
+ ztr_t signal;
+ ztr_t noise;
+ ztr_t intensity;
+} fe_context_t;
+
+static
+rc_t fe_new_read(fe_context_t *self, int flags, pstring *readId )
+{
+ rc_t rc;
+ char *suffix;
+ pstring readName, spotGroup;
+ static IlluminaSpot spot;
+
+ /* look for spot group */
+ suffix = strchr(readId->data, '#');
+ if( suffix != NULL ) {
+ readId->len = suffix++ - readId->data;
+ if( (rc = pstring_assign(&spotGroup, suffix, strlen(suffix))) != 0 ) {
+ SRALoaderFile_LOG(self->ctx.file, klogInt, rc,
+ "extracting barcode from spot '$(spotname)'", "spotname=%s", readId->data);
+ return rc;
+ }
+ } else {
+ pstring_clear(&spotGroup);
+ }
+
+ /* build the read name from prefix (self->name_prefix) and read id */
+ if(self->name_prefix.len > 0 ) {
+ if( (rc = pstring_copy(&readName, &self->name_prefix)) == 0 ) {
+ if( isdigit(readName.data[readName.len - 1]) ) {
+ rc = pstring_append(&readName, ":", 1);
+ }
+ if( rc == 0 ) {
+ rc = pstring_concat(&readName, readId);
+ }
+ }
+ } else {
+ rc = pstring_copy(&readName, readId);
+ }
+ if( rc != 0 ) {
+ SRALoaderFile_LOG(self->ctx.file, klogErr, rc,
+ "preparing spot name $(spotname)", "spotname=%s", readId->data);
+ return rc;
+ }
+ SRF_set_read_filter(&self->read.filter, flags);
+
+ IlluminaSpot_Init(&spot);
+ if( (rc = IlluminaSpot_Add(&spot, &readName, &spotGroup, &self->read)) == 0 ) {
+ rc = SRAWriterIllumina_Write(self->writer, self->ctx.file, &spot);
+ }
+ return rc;
+}
+
+static
+rc_t parse_header(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size)
+{
+ rc_t rc = 0;
+ size_t parsed;
+ char prefixType;
+ uint32_t counter;
+ ztr_raw_t ztr_raw;
+ ztr_t ztr;
+ enum ztr_chunk_type type;
+ fe_context_t* fe = (fe_context_t*)ctx;
+
+ rc = SRF_ParseDataChunk(data, size, &parsed, &fe->name_prefix, &prefixType, &counter);
+ if(rc) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ }
+ if(fe->defered != NULL) {
+ free((void *)fe->defered);
+ fe->defered = NULL;
+ }
+ if(parsed == size)
+ return 0;
+
+ rc = ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed);
+ if(rc)
+ return rc;
+
+ if((rc = ZTR_ParseHeader(ztr_ctx)) != 0) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ }
+
+ while (rc == 0 && !ZTR_BufferIsEmpty(ztr_ctx)) {
+ if((rc = ZTR_ParseBlock(ztr_ctx, &ztr_raw)) != 0) {
+ if(GetRCState(rc) == rcInsufficient && GetRCObject(rc) == (enum RCObject)rcData)
+ rc = ZTR_BufferGetRemainder(ztr_ctx, &fe->defered, &fe->defered_len);
+ break;
+ }
+
+ if((rc = ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ break;
+ }
+ if(*(void **)&ztr != NULL)
+ free(*(void **)&ztr);
+
+ if(ztr_raw.meta != NULL)
+ free(ztr_raw.meta);
+ if(ztr_raw.data != NULL)
+ free(ztr_raw.data);
+ }
+ return rc;
+}
+
+static
+rc_t parse_read(SRF_context *ctx, ZTR_Context *ztr_ctx, const uint8_t *data, size_t size)
+{
+ rc_t rc = 0;
+ size_t parsed;
+ uint8_t flags;
+ pstring readId;
+ ztr_raw_t ztr_raw;
+ ztr_t ztr;
+ enum ztr_chunk_type type;
+ fe_context_t* fe = (fe_context_t*)ctx;
+
+ *(void **)&fe->sequence =
+ *(void **)&fe->quality1 =
+ *(void **)&fe->quality4 =
+ *(void **)&fe->signal =
+ *(void **)&fe->intensity =
+ *(void **)&fe->noise = NULL;
+
+ rc = SRF_ParseReadChunk(data, size, &parsed, &flags, &readId);
+ if(rc) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rc);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ }
+ if(fe->defered != NULL)
+ ZTR_AddToBuffer(ztr_ctx, fe->defered, fe->defered_len);
+ ZTR_AddToBuffer(ztr_ctx, data + parsed, size - parsed);
+ if(fe->defered == NULL) {
+ rc = ZTR_ParseBlock(ztr_ctx, &ztr_raw);
+ if(rc == 0)
+ goto PARSE_BLOCK;
+ rc = ZTR_ParseHeader(ztr_ctx);
+ if(rc) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ }
+ }
+
+ while (!ZTR_BufferIsEmpty(ztr_ctx)) {
+ rc = ZTR_ParseBlock(ztr_ctx, &ztr_raw);
+ PARSE_BLOCK:
+ if(rc != 0 || (rc = ZTR_ProcessBlock(ztr_ctx, &ztr_raw, &ztr, &type)) != 0 ) {
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "corrupt", NULL);
+ }
+
+ switch (type) {
+ case READ:
+ if(ztr.sequence->datatype != i8) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "invalid data type for sequence data", NULL);
+ }
+ fe->sequence = ztr;
+ break;
+ case QUALITY1:
+ if(ztr.quality1->datatype != i8) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "invalid data type for quality1 data", NULL);
+ }
+ fe->quality1 = ztr;
+ break;
+ case QUALITY4:
+ if(ztr.quality4->datatype != i8) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected);
+ return SRALoaderFile_LOG(ctx->file, klogErr, rc, "invalid data type for quality4 data", NULL);
+ }
+ fe->quality4 = ztr;
+ break;
+ case SIGNAL4:
+ if(ztr.signal4->Type != NULL && strncmp(ztr.signal4->Type, "SLXI", 4) == 0 ) {
+ if( !fe->skip_intensity ) {
+ fe->intensity = ztr;
+ } else if(ztr.signal4){
+ if(ztr.signal4->data) free(ztr.signal4->data);
+ free(ztr.signal4);
+ }
+ } else if(ztr.signal4->Type != NULL && strncmp(ztr.signal4->Type, "SLXN", 4) == 0 ) {
+ if( !fe->skip_noise ) {
+ fe->noise = ztr;
+ } else if(ztr.signal4){
+ if(ztr.signal4->data) free(ztr.signal4->data);
+ free(ztr.signal4);
+ }
+ } else if( !fe->skip_signal ) {
+ fe->signal = ztr;
+ } else if(ztr.signal4){
+ if(ztr.signal4->data) free(ztr.signal4->data);
+ free(ztr.signal4);
+ }
+ break;
+
+ default:
+ free(*(void **)&ztr);
+
+ case none:
+ case ignore:
+ if(ztr_raw.data) {
+ free(ztr_raw.data);
+ }
+ break;
+ }
+ if(ztr_raw.meta){
+ free(ztr_raw.meta);
+ ztr_raw.meta=NULL;
+ }
+ }
+
+ while(rc == 0) {
+ if(*(void **)&fe->sequence == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcConstraint, rcViolated);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "missing sequence data", NULL);
+ break;
+ }
+ if(*(void **)&fe->quality4 == NULL && *(void **)&fe->quality1 == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcConstraint, rcViolated);
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "missing quality data", NULL);
+ break;
+ }
+
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, BASE, fe->sequence, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.seq, fe->sequence.sequence->data, fe->sequence.sequence->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress sequence data", NULL);
+ break;
+ }
+
+ if( *(void **)&fe->quality4 != NULL ) {
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, CNF4, fe->quality4, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.qual, fe->quality4.quality4->data, fe->quality4.quality4->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress quality4 data", NULL);
+ break;
+ }
+ fe->read.qual_type = ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4;
+ } else if( *(void **)&fe->quality1 != NULL ) {
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, CNF1, fe->quality1, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.qual, fe->quality1.quality1->data, fe->quality1.quality4->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress quality1 data", NULL);
+ break;
+ }
+ fe->read.qual_type = ILLUMINAWRITER_COLMASK_QUALITY_PHRED;
+ }
+ if( *(void **)&fe->signal != NULL ) {
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, SMP4, fe->signal, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.signal, fe->signal.signal4->data, fe->signal.signal4->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress signal data", NULL);
+ break;
+ }
+ }
+ if( *(void **)&fe->intensity != NULL ) {
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, SMP4, fe->intensity, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.intensity, fe->intensity.signal4->data, fe->intensity.signal4->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress intensity data", NULL);
+ break;
+ }
+ }
+ if( *(void **)&fe->noise != NULL ) {
+ if( (rc = ILL_ZTR_Decompress(ztr_ctx, SMP4, fe->noise, fe->sequence)) != 0 ||
+ (rc = pstring_assign(&fe->read.noise, fe->noise.signal4->data, fe->noise.signal4->datasize)) != 0 ) {
+ SRALoaderFile_LOG(ctx->file, klogErr, rc, "failed to decompress noise data", NULL);
+ break;
+ }
+ }
+ rc = fe_new_read(fe, flags, &readId);
+ break;
+ }
+ if(fe->sequence.sequence) {
+ if(fe->sequence.sequence->data)
+ free(fe->sequence.sequence->data);
+ free(fe->sequence.sequence);
+ }
+ if(fe->quality1.quality1) {
+ if(fe->quality1.quality1->data)
+ free(fe->quality1.quality1->data);
+ free(fe->quality1.quality1);
+ }
+ if(fe->quality4.quality4) {
+ if(fe->quality4.quality4->data)
+ free(fe->quality4.quality4->data);
+ free(fe->quality4.quality4);
+ }
+ if(fe->signal.signal4) {
+ if(fe->signal.signal4->data)
+ free(fe->signal.signal4->data);
+ free(fe->signal.signal4);
+ }
+ if(fe->intensity.signal4) {
+ if(fe->intensity.signal4->data)
+ free(fe->intensity.signal4->data);
+ free(fe->intensity.signal4);
+ }
+ if(fe->noise.signal4) {
+ if(fe->noise.signal4->data)
+ free(fe->noise.signal4->data);
+ free(fe->noise.signal4);
+ }
+ return rc;
+}
+
+struct SRFIlluminaLoaderFmt {
+ SRALoaderFmt dad;
+ fe_context_t fe;
+};
+
+static
+rc_t SRFIlluminaLoaderFmt_WriteData(SRFIlluminaLoaderFmt *self, uint32_t argc, const SRALoaderFile *const argv [], int64_t* spots_bad_count)
+{
+ rc_t rc = 0;
+ uint32_t i;
+
+ for(i = 0; rc == 0 && i < argc; i++) {
+ self->fe.ctx.file = argv[i];
+ if( (rc = SRALoaderFileName(argv[i], &self->fe.ctx.file_name)) == 0 ) {
+ rc = SRF_parse(&self->fe.ctx, parse_header, parse_read, ZTR_CreateContext, ZTR_ContextRelease);
+ }
+ }
+ return rc;
+}
+
+static
+rc_t SRFIlluminaLoaderFmt_Whack(SRFIlluminaLoaderFmt *self, SRATable** table)
+{
+ SRAWriterIllumina_Whack(self->fe.writer, table);
+ free(self);
+ return 0;
+}
+
+static
+rc_t SRFIlluminaLoaderFmt_Version( const SRFIlluminaLoaderFmt *self, uint32_t *vers, const char** name )
+{
+ *vers = KAppVersion();
+ *name = "Illumina SRF";
+ return 0;
+}
+
+static SRALoaderFmt_vt_v1 SRFIlluminaLoaderFmt_vt_v1 =
+{
+ 1, 0,
+ SRFIlluminaLoaderFmt_Whack,
+ SRFIlluminaLoaderFmt_Version,
+ NULL,
+ SRFIlluminaLoaderFmt_WriteData
+};
+
+rc_t SRFIlluminaLoaderFmt_Init(SRFIlluminaLoaderFmt* self, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+
+ self->fe.skip_signal = (config->columnFilter & (efltrSIGNAL | efltrDEFAULT));
+ self->fe.skip_noise = (config->columnFilter & (efltrNOISE | efltrDEFAULT));
+ self->fe.skip_intensity = (config->columnFilter & (efltrINTENSITY | efltrDEFAULT));
+
+ if( (rc = SRAWriterIllumina_Make(&self->fe.writer, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize writer");
+ }
+ return rc;
+}
+
+rc_t SRFIlluminaLoaderFmt_Make(SRALoaderFmt** self, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRFIlluminaLoaderFmt* fmt;
+
+ if( self == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ fmt = calloc(1, sizeof(*fmt));
+ if(fmt == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ LOGERR(klogInt, rc, "failed to initialize; out of memory");
+ return rc;
+ }
+ if( (rc = SRFIlluminaLoaderFmt_Init(fmt, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize");
+ } else if( (rc = SRALoaderFmtInit(&fmt->dad, (const SRALoaderFmt_vt*)&SRFIlluminaLoaderFmt_vt_v1)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize parent object");
+ }
+ if( rc == 0 ) {
+ *self = &fmt->dad;
+ } else {
+ free(fmt);
+ }
+ return rc;
+}
diff --git a/tools/sra-load/srf.c b/tools/sra-load/srf.c
new file mode 100644
index 0000000..904cde6
--- /dev/null
+++ b/tools/sra-load/srf.c
@@ -0,0 +1,229 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <klib/rc.h>
+
+#include "debug.h"
+#include "srf.h"
+#include "ztr.h"
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <memory.h>
+#include <stdio.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <assert.h>
+
+enum RCState SRF_ParseChunk(const uint8_t *src, size_t srclen, uint64_t *size, enum SRF_ChunkTypes *type, size_t *data)
+{
+ assert(size);
+ assert(type);
+ assert(data);
+
+ *size = 0;
+ *type = SRF_ChunkTypeUnknown;
+ *data = 0;
+
+ if(srclen == 0) {
+ return rcInsufficient;
+ }
+ *type = src[0];
+ switch(*type) {
+ case 'S':
+ if (srclen < 8) {
+ return rcInsufficient;
+ }
+ if (*(const uint32_t *)src != *(const uint32_t *)("SSRF")) {
+ return rcInvalid;
+ }
+ *size = (((((src[4] << 8) | src[5]) << 8) | src[6]) << 8) | src[7];
+ *data = 8;
+ break;
+ case 'I':
+ if(srclen >= 16) {
+ *size = (((((((((((((src[8] << 8) | src[9]) << 8) | src[10]) << 8) | src[11]) << 8) |
+ src[12]) << 8) | src[13]) << 8) | src[14]) << 8) | src[15];
+ }
+ break;
+ case 'X':
+ case 'H':
+ case 'R':
+ if (srclen < 5) {
+ return rcInsufficient;
+ }
+ *size = (((((src[1] << 8) | src[2]) << 8) | src[3]) << 8) | src[4];
+ *data = 5;
+ break;
+ default:
+ return rcInvalid;
+ }
+ return 0;
+}
+
+int SRF_ParseContainerHeader(const uint8_t *src, uint64_t src_length,
+ unsigned *versMajor, unsigned *versMinor,
+ char *contType, pstring *baseCaller, pstring *baseCallerVersion)
+{
+ const uint8_t *vers = src + 1;
+
+ src += *src + 1;
+
+ if (versMajor != NULL) {
+ *versMajor = 0;
+
+ while (vers != src && *vers != '.') {
+ if (*vers > '9' || *vers < '0')
+ return rcInvalid;
+ *versMajor = *versMajor * 10 + *vers - '0';
+ ++vers;
+ }
+ if (versMinor != NULL) {
+ *versMinor = 0;
+
+ if (vers != src && *vers == '.')
+ ++vers;
+ while (vers != src) {
+ if (*vers > '9' || *vers < '0')
+ return rcInvalid;
+ *versMinor = *versMinor * 10 + *vers - '0';
+ ++vers;
+ }
+ }
+ }
+
+ if (contType != NULL)
+ *contType = *src;
+ ++src;
+
+ if (baseCaller != NULL) {
+ if( pstring_assign(baseCaller, src, *src + 1) != 0 ) {
+ return rcInsufficient;
+ }
+ }
+ src += *src + 1;
+
+ if (baseCallerVersion != NULL) {
+ if( pstring_assign(baseCallerVersion, src, *src + 1) != 0 ) {
+ return rcInsufficient;
+ }
+ }
+ return 0;
+}
+
+int SRF_ParseDataChunk(const uint8_t *src, size_t src_length, size_t *parsed_length, pstring *prefix,
+ char *prefixType, uint32_t *counter)
+{
+ const uint8_t *const endp = src + src_length;
+ assert(src);
+ assert(parsed_length);
+
+ if (counter != NULL)
+ *counter = 0;
+ if (prefix != NULL)
+ pstring_clear(prefix);
+
+ if (src_length < 2)
+ return rcInsufficient;
+
+ if (prefixType != NULL)
+ *prefixType = *src;
+ ++src;
+ if (*src == 0)
+ ++src;
+ else if (src + *src + 1 > endp)
+ return rcInsufficient;
+ else {
+ if (prefix != NULL) {
+ if( pstring_assign(prefix, src + 1, *src) != 0 ) {
+ return rcInsufficient;
+ }
+ }
+ src += *src + 1;
+ }
+#if 1
+ switch (endp - src) {
+ case 0:
+ break;
+ case 4:
+ if (counter != NULL)
+ *counter = (((((src[0] << 8) | src[1]) << 8) | src[2]) << 8) | src[3];
+ src += 4;
+ break;
+ default:
+ if (endp - src < 8)
+ return rcInsufficient;
+ if (memcmp(src, ZTR_SIG, 8) != 0) {
+ if (counter != NULL)
+ *counter = (((((src[0] << 8) | src[1]) << 8) | src[2]) << 8) | src[3];
+ src += 4;
+ }
+ break;
+ }
+#else
+ if (!ZTR_IsSignature(src, endp - src)) {
+ if (src + 4 > endp)
+ return rcInsufficient;
+ if (counter != NULL)
+ *counter = (((((src[0] << 8) | src[1]) << 8) | src[2]) << 8) | src[3];
+ src += 4;
+ }
+#endif
+ *parsed_length = src_length - (endp - src);
+ return 0;
+}
+
+int SRF_ParseReadChunk(const uint8_t *src, size_t src_length, size_t *parsed_length, uint8_t *flags, pstring *id)
+{
+ const uint8_t* const endp = src + src_length;
+
+ assert(src);
+ assert(parsed_length);
+ assert(flags);
+ assert(id);
+
+ *flags = 0;
+ pstring_clear(id);
+
+ if(src_length < 2) {
+ return rcInsufficient;
+ }
+ *flags = *src++;
+ if(*src == '\0') {
+ ++src;
+ } else if(src + *src + 1 > endp) {
+ return rcInsufficient;
+ } else {
+ if( pstring_assign(id, src + 1, *src) != 0 ) {
+ return rcInsufficient;
+ }
+ src += *src + 1;
+ }
+ *parsed_length = src_length - (endp - src);
+ if( *flags != 0 ) {
+ DEBUG_MSG(5, ("SRF_FLAGS='%02X'\n", (int)(*flags)));
+ }
+ return 0;
+}
diff --git a/tools/sra-load/srf.h b/tools/sra-load/srf.h
new file mode 100644
index 0000000..b918120
--- /dev/null
+++ b/tools/sra-load/srf.h
@@ -0,0 +1,146 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_srf_
+#define _sra_load_srf_
+
+#include "writer-illumina.h"
+
+#define SRF_READ_BAD (1U << 0)
+#define SRF_READ_WITHDRAWN (1U << 1)
+
+#define SRF_CONTAINER_HEADER_MIN_SIZE (8)
+#define SRF_BLOCK_HEADER_MIN_SIZE (5)
+
+enum SRF_ChunkTypes {
+ SRF_ChunkTypeUnknown = '?',
+ SRF_ChunkTypeContainer = 'S',
+ SRF_ChunkTypeIndex = 'I',
+ SRF_ChunkTypeHeader = 'H',
+ SRF_ChunkTypeRead = 'R',
+ SRF_ChunkTypeXML = 'X'
+};
+
+/* SRF_ParseChunk
+ try to parse an SRF chunk
+
+ returns:
+ 0: no error
+ rcInsufficient: not enough src data to parse;
+ provide more data or declare an error
+ rcInvalid: the data is invalid
+
+ Parameters:
+ src [in, required]: the bytes to parse
+ srclen: the number of bytes parsable
+ size [out, required]: the total size of the chunk
+ the next chunk starts at src + size
+ type [out, required]: the type of chunk found
+ data [out, required]: the start of any inner data
+ in the chunk
+*/
+enum RCState SRF_ParseChunk(const uint8_t *src,
+ size_t srclen,
+ uint64_t *size,
+ enum SRF_ChunkTypes *type,
+ size_t *data);
+
+/* SRF_ParseContainerHeader
+ try to parse an SRF Container Header
+
+ Returns:
+ 0: no error
+ rcInsufficient: not enough data
+ rcInvalid: data invalid
+
+ Parameters:
+ src [in, required]: the bytes to parse
+ src_length: the length of src
+ versMajor, versMinor [out, optional]: SRF version
+ contType [out, optional]: type of the data contained in
+ this SRF; *contType should be 'Z' per the spec.
+ baseCaller [out, optional]: the base caller program that
+ generated the contained data
+ baseCallerVersion [out, optional]: the version of
+ base caller program
+ */
+int SRF_ParseContainerHeader(const uint8_t *src,
+ uint64_t src_length,
+ unsigned *versMajor,
+ unsigned *versMinor,
+ char *contType,
+ pstring *baseCaller,
+ pstring *baseCallerVersion);
+
+/* SRF_ParseDataChunk
+ try to parse an SRF data chunk (i.e. block header type = 'H')
+
+ Returns:
+ 0: no error
+ rcInsufficient: not enough data
+ rcInvalid: data invalid
+
+ Parameters:
+ src [in, required]: the bytes to parse
+ src_length: the length of src
+ parsed_length [out, required]: length of SRF data in
+ this chunk; the bytes src[parsed_length..src_length],
+ if any, are ZTR.
+ prefix [out, optional]: (pstring) read name prefix, if any
+ prefixType [out, optional]: read name prefix type 'E' or 'I'
+ counter [out, optional]: initial value of counter, only
+ relevant if prefixType == 'I'
+ */
+int SRF_ParseDataChunk(const uint8_t *src,
+ size_t src_length,
+ size_t *parsed_length,
+ pstring *prefix,
+ char *prefixType,
+ uint32_t *counter);
+
+/* SRF_ParseReadChunk
+ try to parse an SRF read chunk (i.e. block header type = 'R')
+
+ Returns:
+ 0: no error
+ rcInsufficient: not enough data
+ rcInvalid: data invalid
+
+ Parameters:
+ src [in, required]: the bytes to parse
+ src_length: the length of src
+ parsed_length [out, required]: length of SRF data in
+ this chunk; the bytes src[parsed_length..src_length],
+ if any, are ZTR.
+ flags [out, optional]: read flags
+ id [out, optional]: read Id
+ */
+int SRF_ParseReadChunk(const uint8_t *src,
+ size_t src_length,
+ size_t *parsed_length,
+ uint8_t *flags,
+ pstring *id);
+
+#endif /* _sra_load_srf_ */
diff --git a/tools/sra-load/writer-454.c b/tools/sra-load/writer-454.c
new file mode 100644
index 0000000..0b1992c
--- /dev/null
+++ b/tools/sra-load/writer-454.c
@@ -0,0 +1,262 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <insdc/insdc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "writer-454.h"
+#include "sra-writer.h"
+
+struct SRAWriter454 {
+ SRAWriter* base;
+ pstring flows;
+ uint32_t flow_count;
+ pstring keys;
+
+ uint32_t ci_flowc;
+ uint32_t ci_keys;
+ uint32_t ci_name;
+ uint32_t ci_read;
+ uint32_t ci_qual;
+ uint32_t ci_signal;
+ uint32_t ci_position;
+ uint32_t ci_q_left;
+ uint32_t ci_q_right;
+ uint32_t ci_a_left;
+ uint32_t ci_a_right;
+};
+
+rc_t SRAWriter454_Make(const SRAWriter454** cself, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriter454* self;
+ const PlatformXML* platform;
+
+ if( cself == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ return rc;
+ }
+ if( platform->id != SRA_PLATFORM_454 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "platform type");
+ return rc;
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize base writer");
+ } else {
+ if( platform->param.ls454.flow_sequence != NULL ) {
+ rc = pstring_assign(&self->flows, platform->param.ls454.flow_sequence,
+ strlen(platform->param.ls454.flow_sequence));
+ }
+ if( rc == 0 && platform->param.ls454.key_sequence != NULL ) {
+ rc = pstring_assign(&self->keys, platform->param.ls454.key_sequence,
+ strlen(platform->param.ls454.key_sequence));
+ }
+ self->flow_count = platform->param.ls454.flow_count;
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ SRAWriter454_Whack(self, NULL);
+ }
+ return rc;
+}
+
+void SRAWriter454_Whack(const SRAWriter454* cself, SRATable** table)
+{
+ if( cself != NULL ) {
+ SRAWriter454* self = (SRAWriter454*)cself;
+ SRAWriter_Whack(self->base, table);
+ free(self);
+ }
+}
+
+static
+rc_t SRAWriter454_Open(const SRAWriter454* cself, bool sig_and_pos)
+{
+ rc_t rc = 0;
+ SRAWriter454* self = (SRAWriter454*)cself;
+
+ if( cself->ci_name == 0 ) {
+ INSDC_coord_one d = 0;
+ pstring x;
+
+ if( (rc = SRAWriter_CreateTable(self->base, "NCBI:SRA:_454_:tbl:v2")) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteDefaults(self->base)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to write table defaults");
+ return rc;
+ }
+ COL_OPEN(self->ci_name, "NAME", vdb_ascii_t);
+ COL_OPEN(self->ci_read, "READ", insdc_fasta_t);
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_phred_t);
+ COL_OPEN(self->ci_q_left, "CLIP_QUALITY_LEFT", "INSDC:coord:one");
+ COL_OPEN(self->ci_q_right, "CLIP_QUALITY_RIGHT", "INSDC:coord:one");
+ COL_OPEN(self->ci_a_left, "CLIP_ADAPTER_LEFT", "INSDC:coord:one");
+ COL_OPEN(self->ci_a_right, "CLIP_ADAPTER_RIGHT", "INSDC:coord:one");
+ COL_OPEN(self->ci_flowc, "FLOW_CHARS", insdc_fasta_t);
+ COL_OPEN(self->ci_keys, "KEY_SEQUENCE", insdc_fasta_t);
+
+ COL_WRITE_DEFAULT(self->ci_flowc, "FLOW_CHARS", self->flows);
+ COL_WRITE_DEFAULT(self->ci_keys, "KEY_SEQUENCE", self->keys);
+ if( (rc = pstring_assign(&x, &d, sizeof(d))) == 0 ) {
+ COL_WRITE_DEFAULT(self->ci_q_left, "CLIP_QUALITY_LEFT", x);
+ COL_WRITE_DEFAULT(self->ci_q_right, "CLIP_QUALITY_RIGHT", x);
+ COL_WRITE_DEFAULT(self->ci_a_left, "CLIP_ADAPTER_LEFT", x);
+ COL_WRITE_DEFAULT(self->ci_a_right, "CLIP_ADAPTER_RIGHT", x);
+ }
+ }
+ if( sig_and_pos && (cself->ci_signal == 0 || cself->ci_position == 0) ) {
+ COL_OPEN(self->ci_signal, "SIGNAL", ncbi_isamp1_t);
+ COL_OPEN(self->ci_position, "POSITION", "INSDC:position:one");
+ }
+ return rc;
+}
+
+rc_t SRAWriter454_WriteHead(const SRAWriter454* cself, const pstring* flow_chars, const pstring* key_sequence)
+{
+ rc_t rc = 0;
+
+ if( (rc = SRAWriter454_Open(cself, false)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to create table");
+ return rc;
+ }
+ if( flow_chars && flow_chars->len != 0 ) {
+ if( cself->flows.len != 0 && pstring_cmp(&cself->flows, flow_chars) != 0 ) {
+ PLOGMSG(klogWarn, (klogWarn, "file FLOW_SEQUENCE do not match experiment: $(s)", PLOG_S(s), flow_chars->data));
+ }
+ /* update flow_count so signal data length will match below */
+ ((SRAWriter454*)cself)->flow_count = flow_chars->len;
+ COL_WRITE_DEFAULT(cself->ci_flowc, "FLOW_CHARS", (*flow_chars));
+ }
+ if( key_sequence && key_sequence->len != 0 ) {
+ if( cself->keys.len != 0 && pstring_cmp(&cself->keys, key_sequence) != 0 ) {
+ PLOGMSG(klogWarn, (klogWarn, "file KEY_SEQUENCE do not match experiment: $(s)", PLOG_S(s), key_sequence->data));
+ }
+ COL_WRITE_DEFAULT(cself->ci_keys, "KEY_SEQUENCE", (*key_sequence));
+ }
+ return 0;
+}
+
+rc_t SRAWriter454_WriteRead(const SRAWriter454* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality,
+ const pstring* signal, const pstring* position,
+ INSDC_coord_one q_left, INSDC_coord_one q_right,
+ INSDC_coord_one a_left, INSDC_coord_one a_right)
+{
+ rc_t rc = 0;
+ SRAWriter454* self =(SRAWriter454*)cself;
+
+ assert(self != NULL);
+ assert(data_block_ref != NULL);
+
+ DEBUG_MSG(3, ("spot name '%s'\n", name ? name->data : NULL));
+
+ if( (rc = SRAWriter454_Open(cself, signal || position)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to open table");
+ return rc;
+ }
+ if( !name || name->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "spot name");
+ }
+ if( !sequence || sequence->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "sequence");
+ } else if( !quality || sequence->len != quality->len ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, quality ? rcInconsistent : rcEmpty);
+ LOGERR(klogErr, rc, "quality");
+ }
+ if( signal && signal->len / self->flow_count != sizeof(uint16_t) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "signal and flow chars");
+ }
+ if( position && position->len / sequence->len != sizeof(INSDC_position_one) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "sequence and position");
+ }
+ if( q_left < 0 || (sequence && q_left > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip quality left and sequence");
+ }
+ if( q_right < 0 || (sequence && q_right > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip quality right and sequence");
+ }
+ if( a_left < 0 || (sequence && a_left > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip adapter left and sequence");
+ }
+ if( a_right < 0 || (sequence && a_right > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip adapter right and sequence");
+ }
+ if( rc != 0 || (rc = SRAWriter_NewSpot(self->base, NULL)) != 0 ) {
+ return rc;
+ }
+ COL_WRITE(self->ci_name, "NAME", (*name));
+ COL_WRITE(self->ci_read, "READ", (*sequence));
+ COL_WRITE(self->ci_qual, "QUALITY", (*quality));
+ COL_WRITE(self->ci_signal, "SIGNAL", (*signal));
+ COL_WRITE(self->ci_position, "POSITION", (*position));
+
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_q_left, &q_left, sizeof(q_left), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_QUALITY_LEFT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_q_right, &q_right, sizeof(q_right), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_QUALITY_RIGHT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_a_left, &a_left, sizeof(a_left), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_ADAPTER_LEFT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_a_right, &a_right, sizeof(a_right), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_ADAPTER_RIGHT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteSpotSegment(self->base, data_block_ref, NULL, sequence->len, sequence->data)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ return SRAWriter_CloseSpot(self->base);
+}
diff --git a/tools/sra-load/writer-454.h b/tools/sra-load/writer-454.h
new file mode 100644
index 0000000..5bca626
--- /dev/null
+++ b/tools/sra-load/writer-454.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_writer_454_
+#define _sra_load_writer_454_
+
+#include "loader-fmt.h"
+#include "pstring.h"
+
+typedef struct SRAWriter454 SRAWriter454;
+
+rc_t SRAWriter454_Make(const SRAWriter454** cself, const SRALoaderConfig* config);
+
+void SRAWriter454_Whack(const SRAWriter454* cself, SRATable** table);
+
+rc_t SRAWriter454_WriteHead(const SRAWriter454* cself, const pstring* flow_chars, const pstring* key_sequence);
+
+rc_t SRAWriter454_WriteRead(const SRAWriter454* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality,
+ const pstring* signal, const pstring* position,
+ INSDC_coord_one q_left, INSDC_coord_one q_right,
+ INSDC_coord_one a_left, INSDC_coord_one a_right);
+
+#endif /* _sra_load_writer_454_ */
diff --git a/tools/sra-load/writer-absolid.c b/tools/sra-load/writer-absolid.c
new file mode 100644
index 0000000..294b030
--- /dev/null
+++ b/tools/sra-load/writer-absolid.c
@@ -0,0 +1,501 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/wsradb.h>
+#include <sra/types.h>
+
+#include "debug.h"
+#include "writer-absolid.h"
+#include "sra-writer.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+const int AbisolidReadType2ReadNumber [] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1};
+const char *AbisolidReadType2ReadLabel [] = {"", "", "F3", "R3", "F5-P2", "F5-BC", "F5-RNA", "F5-DNA", "F3-DNA", "BC"};
+
+void AbsolidRead_Init(AbsolidRead* read)
+{
+ if( read ) {
+ pstring_clear(&read->label);
+ read->cs_key = 0;
+ pstring_clear(&read->seq);
+ pstring_clear(&read->qual);
+ read->fs_type = eAbisolidFSignalType_NotSet;
+ pstring_clear(&read->fxx);
+ pstring_clear(&read->cy3);
+ pstring_clear(&read->txr);
+ pstring_clear(&read->cy5);
+ read->filter = 0;
+ }
+}
+
+EAbisolidReadType AbsolidRead_Suffix2ReadType(const char* s)
+{
+ EAbisolidReadType type;
+ size_t len;
+
+ assert(s != NULL);
+
+ len = strlen(s);
+ if( len == 0 ) {
+ type = eAbisolidReadType_SPOT;
+ } else if( len > 1 && strcmp(&s[len - 2], "F3") == 0 ) {
+ type = eAbisolidReadType_F3;
+ } else if( len > 1 && strcmp(&s[len - 2], "R3") == 0 ) {
+ type = eAbisolidReadType_R3;
+ } else if( len > 4 && strcmp(&s[len - 5], "F5-P2") == 0 ) {
+ type = eAbisolidReadType_F5_P2;
+ } else if( len > 4 && strcmp(&s[len - 5], "F5-BC") == 0 ) {
+ type = eAbisolidReadType_F5_BC;
+ } else if( len > 5 && strcmp(&s[len - 6], "F5-RNA") == 0 ) {
+ type = eAbisolidReadType_F5_RNA;
+ } else if( len > 5 && strcmp(&s[len - 6], "F5-DNA") == 0 ) {
+ type = eAbisolidReadType_F5_DNA;
+ } else if( len > 5 && strcmp(&s[len - 6], "F3-DNA") == 0 ) {
+ type = eAbisolidReadType_F3_DNA;
+ } else if( len > 1 && strcmp(&s[len - 2], "BC") == 0 ) {
+ type = eAbisolidReadType_BC;
+ } else {
+ int i;
+ for(i = 0; i < len; i++) {
+ if( !isdigit(s[i]) ) {
+ break;
+ }
+ }
+ type = i < len ? eAbisolidReadType_Unknown : eAbisolidReadType_SPOT;
+ }
+ return type;
+}
+
+struct SRAWriteAbsolid {
+ SRAWriter* base;
+ const PlatformXML* platform;
+ uint8_t nreads;
+ SRASegment read_seg[ABSOLID_FMT_MAX_NUM_READS];
+
+ uint32_t ci_name;
+ uint32_t ci_cs_key;
+ uint32_t ci_label;
+ uint32_t ci_label_start;
+ uint32_t ci_label_len;
+ uint32_t ci_csread;
+ uint32_t ci_qual;
+ uint32_t ci_fxx;
+ uint32_t ci_cy3;
+ uint32_t ci_txr;
+ uint32_t ci_cy5;
+ uint32_t ci_read_filter;
+};
+
+rc_t SRAWriteAbsolid_Make(const SRAWriteAbsolid** cself, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriteAbsolid* self;
+ const PlatformXML* platform;
+ const ReadSpecXML_read* read;
+ uint32_t sequence_length;
+ uint8_t nreads;
+
+ if( cself == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ||
+ (rc = Experiment_GetSpotLength(config->experiment, &sequence_length)) != 0 ||
+ (rc = Experiment_GetReadNumber(config->experiment, &nreads)) != 0 ) {
+ return rc;
+ }
+ if( platform->id != SRA_PLATFORM_ABSOLID ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "platform type");
+ return rc;
+ }
+ if( nreads > ABSOLID_FMT_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ PLOGERR(klogErr, (klogErr, rc, "expected up to $(max) reads", "max=%u", ABSOLID_FMT_MAX_NUM_READS));
+ return rc;
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ return rc;
+ }
+ if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize base writer");
+ } else if( (rc = Experiment_GetRead(config->experiment, 0, &read)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to get read 1 descriptor");
+ } else if( read->coord_type != rdsp_RelativeOrder_ct && read->coord_type != rdsp_BaseCoord_ct ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "1st read can be BASE_COORD or RELATIVE_ORDER only");
+ } else if( read->read_type != rdsp_Forward_rt && read->read_type != rdsp_Reverse_rt ) {
+ LOGMSG(klogWarn, "expected 1st read to be of type 'Forward' or 'Reverse'");
+ }
+ self->read_seg[0].start = 0;
+ self->read_seg[0].len = sequence_length;
+
+ if( rc == 0 && nreads >= ABSOLID_FMT_MAX_NUM_READS ) {
+ if( nreads > ABSOLID_FMT_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ LOGERR(klogErr, rc, "more than 2 reads");
+ } else if( (rc = Experiment_GetRead(config->experiment, 1, &read)) != 0 ) {
+ LOGERR(klogErr, rc, "failed to get read 2 descriptor");
+ } else if( read->coord_type != rdsp_BaseCoord_ct ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "2nd read can be BASE_COORD only");
+ } else if( read->read_type != rdsp_Forward_rt && read->read_type != rdsp_Reverse_rt ) {
+ LOGMSG(klogWarn, "expected 2ndt read to be of type 'Forward' or 'Reverse'");
+ }
+ if( rc == 0 ) {
+ self->read_seg[1].start = read->coord.start_coord - 1;
+ self->read_seg[1].len = sequence_length - self->read_seg[1].start;
+ self->read_seg[0].len = self->read_seg[1].start;
+ }
+ }
+#if _DEBUGGING
+ DEBUG_MSG(3, ("%s READ_SEG[%hu,%hu]\n", __func__, self->read_seg[0].start, self->read_seg[0].len));
+ if( nreads > 1 ) {
+ DEBUG_MSG(3, ("%s READ_SEG[%hu,%hu]\n", __func__, self->read_seg[1].start, self->read_seg[1].len));
+ }
+#endif
+ if( rc == 0 ) {
+ self->platform = platform;
+ self->nreads = nreads;
+ *cself = self;
+ } else {
+ SRAWriteAbsolid_Whack(self, NULL);
+ }
+ return rc;
+}
+
+rc_t SRAWriteAbsolid_MakeName(const pstring* prefix, const pstring* suffix, pstring* name)
+{
+ rc_t rc = 0;
+ if( prefix == NULL || name == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcParam, rcNull);
+ } else if( (rc = pstring_copy(name, prefix)) == 0 ) {
+ if( suffix && suffix->len > 0 ) {
+ if( name->len > 0 && name->data[name->len - 1] != '_' && suffix->data[0] != '_' ) {
+ rc = pstring_append(name, "_", 1);
+ }
+ if( rc == 0 ) {
+ pstring_concat(name, suffix);
+ }
+ }
+ }
+ if( rc != 0 ) {
+ LOGERR(klogErr, rc, "preparing spot name");
+ }
+ return rc;
+}
+
+void SRAWriteAbsolid_Whack(const SRAWriteAbsolid* cself, SRATable** table)
+{
+ if( cself != NULL ) {
+ SRAWriteAbsolid* self = (SRAWriteAbsolid*)cself;
+ SRAWriter_Whack(self->base, table);
+ free(self);
+ }
+}
+
+typedef struct AbsolidSpot_struct {
+ const pstring* spot_name;
+ uint32_t nreads;
+ pstring label;
+ SRASegment read_seg[ABSOLID_FMT_MAX_NUM_READS];
+ INSDC_coord_zero label_start[ABSOLID_FMT_MAX_NUM_READS];
+ uint32_t label_len[ABSOLID_FMT_MAX_NUM_READS];
+ char cs_key[ABSOLID_FMT_MAX_NUM_READS];
+ pstring seq;
+ pstring qual;
+ EAbisolidFSignalType fs_type;
+ pstring fxx;
+ pstring cy3;
+ pstring txr;
+ pstring cy5;
+ uint8_t filter[ABSOLID_FMT_MAX_NUM_READS];
+} AbsolidSpot;
+
+static
+void AbsolidSpot_Init(AbsolidSpot* spot, const pstring* spot_name,
+ const uint16_t nreads, const SRASegment* read_seg)
+{
+ assert(spot != NULL);
+ assert(spot_name != NULL);
+ assert(nreads != 0);
+
+ spot->spot_name = spot_name;
+ pstring_clear(&spot->label);
+ memmove(spot->read_seg, read_seg, sizeof(spot->read_seg[0]) * nreads);
+ memset(spot->label_start, 0, sizeof(spot->label_start[0]) * nreads);
+ memset(spot->label_len, 0, sizeof(spot->label_len[0]) * nreads);
+ memset(spot->cs_key, 0, sizeof(spot->cs_key[0]) * nreads);
+ pstring_clear(&spot->seq);
+ pstring_clear(&spot->qual);
+ spot->fs_type = eAbisolidFSignalType_NotSet;
+ pstring_clear(&spot->fxx);
+ pstring_clear(&spot->cy3);
+ pstring_clear(&spot->txr);
+ pstring_clear(&spot->cy5);
+ memset(spot->filter, 0, sizeof(spot->filter[0]) * nreads);
+}
+
+static
+rc_t AbsolidSpot_AddRead(AbsolidSpot* spot, const int id, const AbsolidRead* read)
+{
+ rc_t rc = 0;
+ const char* what = NULL;
+
+ if( read == NULL ) {
+ if( id == 0 ) {
+ spot->read_seg[id].start = 0;
+ spot->label_start[id] = 0;
+ } else {
+ spot->read_seg[id].start = spot->read_seg[id - 1].start + spot->read_seg[id - 1].len;
+ spot->label_start[id] = spot->label_start[id - 1] + spot->label_len[id - 1];
+ }
+ spot->read_seg[id].len = 0;
+ spot->label_len[id] = 0;
+ spot->cs_key[id] = (id % 2) ? 'G' : 'T';
+ spot->filter[id] = SRA_READ_FILTER_REJECT;
+ } else {
+ if( read->seq.len != spot->read_seg[id].len ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ what = "length do not match experiment";
+ } else if( read->qual.len != read->seq.len ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ what = "quality length";
+ } else if( spot->fs_type != eAbisolidFSignalType_NotSet && spot->fs_type != read->fs_type ) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInconsistent);
+ what = "signal structure";
+ } else if( read->fs_type != eAbisolidFSignalType_NotSet ) {
+ if( read->fxx.len / read->seq.len != sizeof(float) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ what = read->fs_type == eAbisolidFSignalType_FTC ? "signal FTC length" : "signal FAM length";
+ } else if( read->cy3.len / read->seq.len != sizeof(float) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ what = "signal CY3 length";
+ } else if( read->txr.len / read->seq.len != sizeof(float) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ what = "signal TXR length";
+ } else if( read->cy5.len / read->seq.len != sizeof(float) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ what = "signal CY5 length";
+ }
+ }
+ if( rc == 0 ) {
+ if( (rc = pstring_concat(&spot->seq, &read->seq)) == 0 &&
+ (rc = pstring_concat(&spot->qual, &read->qual)) == 0 &&
+ (rc = pstring_concat(&spot->label, &read->label)) == 0 ) {
+ if( id == 0 ) {
+ spot->read_seg[id].start = 0;
+ spot->label_start[id] = 0;
+ } else {
+ spot->read_seg[id].start = spot->read_seg[id - 1].start + spot->read_seg[id - 1].len;
+ spot->label_start[id] = spot->label_start[id - 1] + spot->label_len[id - 1];
+ }
+ spot->label_len[id] = read->label.len;
+ spot->cs_key[id] = read->cs_key;
+ spot->filter[id] = read->filter;
+ if( read->fs_type != eAbisolidFSignalType_NotSet &&
+ (rc = pstring_concat(&spot->fxx, &read->fxx)) == 0 &&
+ (rc = pstring_concat(&spot->cy3, &read->cy3)) == 0 &&
+ (rc = pstring_concat(&spot->txr, &read->txr)) == 0 &&
+ (rc = pstring_concat(&spot->cy5, &read->cy5)) == 0 &&
+ id == 0 ) {
+ spot->fs_type = read->fs_type;
+ }
+ }
+ }
+ }
+ if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "read '$(label)' $(problem) in spot '$(spot_name)'",
+ "label=%.*s,problem=%s,spot_name=%s", read->label.len, read->label.data, what, spot->spot_name->data));
+ }
+ return rc;
+}
+
+rc_t SRAWriteAbsolid_Write(const SRAWriteAbsolid* cself, const SRALoaderFile* file,
+ const pstring* spot_name, const pstring* spot_group,
+ const AbsolidRead* f3, const AbsolidRead* r3)
+{
+ rc_t rc = 0;
+ uint32_t nreads = ((f3 ? 1 : 0) + (r3 ? 1 : 0));
+ AbsolidSpot spot;
+
+ assert(cself != NULL);
+ assert(sizeof(cself->read_seg) == sizeof(spot.read_seg));
+ assert(file != NULL);
+ assert(spot_name);
+
+ DEBUG_MSG(3, ("spot name '%s', group '%s'\n", spot_name->data, spot_group ? spot_group->data : NULL));
+
+ if( nreads == 0 || nreads > cself->nreads ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcExcessive);
+ PLOGERR(klogErr, (klogErr, rc, "read count do not match experiment in spot $(spot): $(c)",
+ "spot=%s,c=%u", spot_name->data, nreads));
+ return rc;
+ }
+
+ AbsolidSpot_Init(&spot, spot_name, cself->nreads, cself->read_seg);
+ if( cself->nreads == 1 ) {
+ rc = AbsolidSpot_AddRead(&spot, 0, f3 ? f3 : r3);
+ } else if( cself->nreads == 2 ) {
+ rc = AbsolidSpot_AddRead(&spot, 0, f3);
+ rc = rc ? rc : AbsolidSpot_AddRead(&spot, 1, r3);
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcFunction, rcCorrupt);
+ PLOGERR(klogInt, (klogInt, rc, "cannot handle reads: $(n) > 2!!!", "n=%hu", cself->nreads));
+ return rc;
+ }
+ if( rc == 0 && cself->ci_name == 0 ) {
+ SRAWriteAbsolid* self =(SRAWriteAbsolid*)cself;
+ if( (rc = SRAWriter_CreateTable(cself->base, "NCBI:SRA:ABI:tbl:v2")) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteDefaults(cself->base)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to write table defaults");
+ return rc;
+ }
+ COL_OPEN(self->ci_name, "NAME", vdb_ascii_t);
+ COL_OPEN(self->ci_cs_key, "CS_KEY", insdc_fasta_t);
+ COL_OPEN(self->ci_csread, "CSREAD", insdc_csfasta_t);
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_phred_t);
+ COL_OPEN(self->ci_read_filter, "READ_FILTER", sra_read_filter_t);
+
+ if( spot.label.len != 0 ) {
+ COL_OPEN(self->ci_label, "LABEL", vdb_ascii_t);
+ COL_OPEN(self->ci_label_start, "LABEL_START", "INSDC:coord:zero");
+ COL_OPEN(self->ci_label_len, "LABEL_LEN", "U32");
+ }
+ if( spot.fs_type != eAbisolidFSignalType_NotSet ) {
+ if( spot.fs_type == eAbisolidFSignalType_FTC ) {
+ COL_OPEN(self->ci_fxx, "FTC", ncbi_fsamp1_t);
+ } else {
+ COL_OPEN(self->ci_fxx, "FAM", ncbi_fsamp1_t);
+ }
+ COL_OPEN(self->ci_cy3, "CY3", ncbi_fsamp1_t);
+ COL_OPEN(self->ci_txr, "TXR", ncbi_fsamp1_t);
+ COL_OPEN(self->ci_cy5, "CY5", ncbi_fsamp1_t);
+ }
+ }
+ if( rc != 0 || (rc = SRAWriter_NewSpot(cself->base, NULL)) != 0 ) {
+ return rc;
+ }
+#if _DEBUGGING
+ {{
+ uint32_t i;
+
+ DEBUG_MSG(13, ("NAME: '%.*s'\n", spot.spot_name->len, spot.spot_name->data));
+ DEBUG_MSG(13, ("CSREAD: len:%u %.*s\n", spot.seq.len, spot.seq.len, spot.seq.data));
+ DEBUG_MSG(13, ("QUAL: len:%u", spot.qual.len));
+ for(i = 0; i < spot.qual.len; i++ ) {
+ DEBUG_MSG(13, (" %i", spot.qual.data[i]));
+ }
+ DEBUG_MSG(13, ("\nLABEL: '%.*s'\n", spot.label.len, spot.label.data));
+ for(i = 0; i < cself->nreads; i++) {
+ DEBUG_MSG(13, ("READ_%02u ", i));
+ DEBUG_MSG(13, ("READ_SEG: [%2u,%2u] ", spot.read_seg[i].start, spot.read_seg[i].len));
+ DEBUG_MSG(13, ("LABEL_SEG: [%2u,%2u] ", spot.label_start[i], spot.label_len[i]));
+ DEBUG_MSG(13, ("CS_KEY: %c ", spot.cs_key[i]));
+ DEBUG_MSG(13, ("READ_FLT: %s", spot.filter[i] == SRA_READ_FILTER_PASS ? "PASS" : "REJECT"));
+ DEBUG_MSG(13, ("\n"));
+ }
+ if( spot.fs_type != eAbisolidFSignalType_NotSet ) {
+ float* f;
+ DEBUG_MSG(13, ("FXX len:%u", spot.fxx.len));
+ f = (float*)spot.fxx.data;
+ for(i = 0; i < spot.fxx.len / sizeof(*f); i++) {
+ DEBUG_MSG(13, (" %f", f[i]));
+ }
+ DEBUG_MSG(13, ("\nCY3: len%u:", spot.cy3.len));
+ f = (float*)spot.cy3.data;
+ for(i = 0; i < spot.cy3.len / sizeof(*f); i++) {
+ DEBUG_MSG(13, (" %f", f[i]));
+ }
+ DEBUG_MSG(13, ("\nTXR: len:%u:", spot.txr.len));
+ f = (float*)spot.txr.data;
+ for(i = 0; i < spot.txr.len / sizeof(*f); i++) {
+ DEBUG_MSG(13, (" %f", f[i]));
+ }
+ DEBUG_MSG(13, ("\nCY5: len:%u", spot.cy5.len));
+ f = (float*)spot.cy5.data;
+ for(i = 0; i < spot.cy5.len / sizeof(*f); i++) {
+ DEBUG_MSG(13, (" %f", f[i]));
+ }
+ DEBUG_MSG(13, ("\n"));
+ }
+ }}
+#endif
+ /* this column is the one that is most likely to fail as it is required to be unique
+ * so we put it first so that we can still close the spot if it fails
+ */
+ COL_WRITE(cself->ci_name, "NAME", (*spot_name));
+ COL_WRITE(cself->ci_csread, "CSREAD", spot.seq);
+ COL_WRITE(cself->ci_qual, "QUALITY", spot.qual);
+ if( cself->ci_fxx != 0 ) {
+ if( spot.fs_type == eAbisolidFSignalType_FTC ) {
+ COL_WRITE(cself->ci_fxx, "FTC", spot.fxx);
+ } else {
+ COL_WRITE(cself->ci_fxx, "FAM", spot.fxx);
+ }
+ COL_WRITE(cself->ci_cy3, "CY3", spot.cy3);
+ COL_WRITE(cself->ci_txr, "TXR", spot.txr);
+ COL_WRITE(cself->ci_cy5, "CY5", spot.cy5);
+ }
+ if( (rc = SRAWriter_WriteSpotSegmentSimple(cself->base, file, spot_group ? spot_group->data : NULL, spot.read_seg)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ if( cself->ci_label != 0 ) {
+ COL_WRITE(cself->ci_label, "LABEL", spot.label);
+ rc = SRAWriter_WriteIdxColumn(cself->base, cself->ci_label_start, spot.label_start, cself->nreads * sizeof(spot.label_start[0]), false);
+ if(rc) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write '$(column)' column", "column=LABEL_START"));
+ return rc;
+ }
+ rc = SRAWriter_WriteIdxColumn(cself->base, cself->ci_label_len, spot.label_len, cself->nreads * sizeof(spot.label_len[0]), false);
+ if(rc) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write '$(column)' column", "column=LABEL_LEN"));
+ return rc;
+ }
+ }
+
+ rc = SRAWriter_WriteIdxColumn(cself->base, cself->ci_cs_key, spot.cs_key, cself->nreads * sizeof(spot.cs_key[0]), false);
+ if(rc) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write '$(column)' column", "column=CS_KEY"));
+ return rc;
+ }
+ rc = SRAWriter_WriteIdxColumn(cself->base, cself->ci_read_filter, spot.filter, cself->nreads * sizeof(spot.filter[0]), false);
+ if(rc) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_FILTER"));
+ return rc;
+ }
+ return SRAWriter_CloseSpot(cself->base);
+}
diff --git a/tools/sra-load/writer-absolid.h b/tools/sra-load/writer-absolid.h
new file mode 100644
index 0000000..2384977
--- /dev/null
+++ b/tools/sra-load/writer-absolid.h
@@ -0,0 +1,94 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_writer_absolid_
+#define _sra_load_writer_absolid_
+
+#include "loader-fmt.h"
+#include "pstring.h"
+
+#define ABSOLID_FMT_MAX_NUM_READS 2
+
+#define ABSOLID_FMT_COLMASK_NOTSET 0x00
+#define ABSOLID_FMT_COLMASK_READ 0x01
+#define ABSOLID_FMT_COLMASK_QUALITY 0x02
+#define ABSOLID_FMT_COLMASK_FTC 0x04
+#define ABSOLID_FMT_COLMASK_FAM 0x08
+#define ABSOLID_FMT_COLMASK_CY3 0x10
+#define ABSOLID_FMT_COLMASK_TXR 0x20
+#define ABSOLID_FMT_COLMASK_CY5 0x40
+
+typedef enum EAbisolidReadType_enum {
+ eAbisolidReadType_Unknown = 0,
+ eAbisolidReadType_SPOT = 1,
+ eAbisolidReadType_F3 = 2,
+ eAbisolidReadType_R3 = 3,
+ eAbisolidReadType_F5_P2 = 4,
+ eAbisolidReadType_F5_BC = 5,
+ eAbisolidReadType_F5_RNA = 6,
+ eAbisolidReadType_F5_DNA = 7,
+ eAbisolidReadType_F3_DNA = 8,
+ eAbisolidReadType_BC = 9
+} EAbisolidReadType;
+
+extern const int AbisolidReadType2ReadNumber [];
+extern const char *AbisolidReadType2ReadLabel [];
+
+typedef enum EAbisolidFSignalType_enum {
+ eAbisolidFSignalType_NotSet = 0,
+ eAbisolidFSignalType_FAM = 1,
+ eAbisolidFSignalType_FTC = 2
+} EAbisolidFSignalType;
+
+typedef struct AbsolidRead_struct {
+ pstring label;
+ char cs_key;
+ pstring seq;
+ pstring qual;
+ EAbisolidFSignalType fs_type;
+ pstring fxx;
+ pstring cy3;
+ pstring txr;
+ pstring cy5;
+ SRAReadFilter filter;
+} AbsolidRead;
+
+void AbsolidRead_Init(AbsolidRead* read);
+
+EAbisolidReadType AbsolidRead_Suffix2ReadType(const char* s);
+
+typedef struct SRAWriteAbsolid SRAWriteAbsolid;
+
+rc_t SRAWriteAbsolid_Make(const SRAWriteAbsolid** cself, const SRALoaderConfig* config);
+
+rc_t SRAWriteAbsolid_MakeName(const pstring* prefix, const pstring* suffix, pstring* name);
+
+void SRAWriteAbsolid_Whack(const SRAWriteAbsolid* cself, SRATable** table);
+
+rc_t SRAWriteAbsolid_Write(const SRAWriteAbsolid* cself, const SRALoaderFile* file,
+ const pstring* spot_name, const pstring* spot_group,
+ const AbsolidRead* f3, const AbsolidRead* r3);
+
+#endif /* _sra_load_writer_absolid_ */
diff --git a/tools/sra-load/writer-helicos.c b/tools/sra-load/writer-helicos.c
new file mode 100644
index 0000000..2935826
--- /dev/null
+++ b/tools/sra-load/writer-helicos.c
@@ -0,0 +1,135 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/types.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "writer-helicos.h"
+#include "sra-writer.h"
+
+struct SRAWriterHelicos {
+ SRAWriter* base;
+
+ uint32_t ci_name;
+ uint32_t ci_read;
+ uint32_t ci_qual;
+};
+
+rc_t SRAWriterHelicos_Make(const SRAWriterHelicos** cself, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriterHelicos* self;
+ const PlatformXML* platform;
+
+ if( cself == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ return rc;
+ }
+ if( platform->id != SRA_PLATFORM_HELICOS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "platform type");
+ return rc;
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize base writer");
+ }
+
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ SRAWriterHelicos_Whack(self, NULL);
+ }
+ return rc;
+}
+
+void SRAWriterHelicos_Whack(const SRAWriterHelicos* cself, SRATable** table)
+{
+ if( cself != NULL ) {
+ SRAWriterHelicos* self = (SRAWriterHelicos*)cself;
+ SRAWriter_Whack(self->base, table);
+ free(self);
+ }
+}
+
+rc_t SRAWriterHelicos_Write(const SRAWriterHelicos* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality)
+{
+ rc_t rc = 0;
+ SRAWriterHelicos* self =(SRAWriterHelicos*)cself;
+
+ assert(self != NULL);
+ assert(data_block_ref != NULL);
+
+ DEBUG_MSG(3, ("spot name '%s'\n", name ? name->data : NULL));
+
+ if( self->ci_name == 0 ) {
+ if( (rc = SRAWriter_CreateTable(self->base, "NCBI:SRA:Helicos:tbl:v2")) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteDefaults(self->base)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to write table defaults");
+ return rc;
+ }
+ COL_OPEN(self->ci_name, "NAME", vdb_ascii_t);
+ COL_OPEN(self->ci_read, "READ", insdc_fasta_t);
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_phred_t);
+ }
+ if( !name || name->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "spot name");
+ }
+ if( !sequence || sequence->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "sequence");
+ } else if( !quality || sequence->len != quality->len ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, quality ? rcInconsistent : rcEmpty);
+ LOGERR(klogErr, rc, "quality");
+ }
+ if( rc != 0 || (rc = SRAWriter_NewSpot(self->base, NULL)) != 0 ) {
+ return rc;
+ }
+ COL_WRITE(self->ci_name, "NAME", (*name));
+ COL_WRITE(self->ci_read, "READ", (*sequence));
+ COL_WRITE(self->ci_qual, "QUALITY", (*quality));
+ if( (rc = SRAWriter_WriteSpotSegment(self->base, data_block_ref, NULL, sequence->len, sequence->data)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ return SRAWriter_CloseSpot(self->base);
+}
diff --git a/tools/sra-load/writer-helicos.h b/tools/sra-load/writer-helicos.h
new file mode 100644
index 0000000..a8a9f93
--- /dev/null
+++ b/tools/sra-load/writer-helicos.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_writer_454_
+#define _sra_load_writer_454_
+
+#include "loader-fmt.h"
+#include "pstring.h"
+
+typedef struct SRAWriterHelicos SRAWriterHelicos;
+
+rc_t SRAWriterHelicos_Make(const SRAWriterHelicos** cself, const SRALoaderConfig* config);
+
+void SRAWriterHelicos_Whack(const SRAWriterHelicos* cself, SRATable** table);
+
+rc_t SRAWriterHelicos_Write(const SRAWriterHelicos* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality);
+
+#endif /* _sra_load_writer_454_ */
diff --git a/tools/sra-load/writer-illumina.c b/tools/sra-load/writer-illumina.c
new file mode 100644
index 0000000..febfe41
--- /dev/null
+++ b/tools/sra-load/writer-illumina.c
@@ -0,0 +1,720 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/types.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "writer-illumina.h"
+#include "sra-writer.h"
+
+void IlluminaRead_Init(IlluminaRead* read, bool name_only)
+{
+ assert(read != NULL);
+ read->read_id = ILLUMINAWRITER_READID_NONE;
+ if( !name_only ) {
+ pstring_clear(&read->seq);
+ read->qual_type = ILLUMINAWRITER_COLMASK_NOTSET;
+ pstring_clear(&read->qual);
+ pstring_clear(&read->noise);
+ pstring_clear(&read->intensity);
+ pstring_clear(&read->signal);
+ read->filter = SRA_READ_FILTER_PASS;
+ }
+}
+
+void IlluminaSpot_Init(IlluminaSpot* spot)
+{
+ memset(spot, 0, sizeof(*spot));
+ spot->qual_type = ILLUMINAWRITER_COLMASK_NOTSET;
+}
+
+static
+rc_t IlluminaSpot_Set(IlluminaSpot* spot, int r, const pstring* name, const pstring* barcode, const IlluminaRead* read)
+{
+ rc_t rc = 0;
+ if( r >= ILLUMINAWRITER_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcCopying, rcData, rcOutofrange);
+ } else {
+ DEBUG_MSG(3, ("starting spot '%s' bc:'%s'\n", name->data, barcode->data));
+ spot->name = name;
+ spot->barcode = barcode;
+ spot->reads[r].read_id = read->read_id;
+ spot->reads[r].seq = read->seq.len > 0 ? &read->seq : NULL;
+ if( (read->qual_type == ILLUMINAWRITER_COLMASK_QUALITY_PHRED) ||
+ (read->qual_type == ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS1) ||
+ (read->qual_type == ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4) ) {
+ spot->qual_type = read->qual_type;
+ spot->reads[r].qual = &read->qual;
+ } else if( read->qual_type != ILLUMINAWRITER_COLMASK_NOTSET ) {
+ rc = RC(rcSRA, rcFormatter, rcCopying, rcRange, rcUnrecognized);
+ }
+ spot->reads[r].noise = read->noise.len > 0 ? &read->noise : NULL;
+ spot->reads[r].intensity = read->intensity.len > 0 ? &read->intensity : NULL;
+ spot->reads[r].signal = read->signal.len > 0 ? &read->signal : NULL;
+ spot->reads[r].filter = &read->filter;
+ }
+ return rc;
+}
+
+static
+rc_t IlluminaSpot_Append(IlluminaSpot* spot, int r, const pstring* barcode, const IlluminaRead* read, const char** field)
+{
+ rc_t rc = 0;
+ /* spot->name and spot->reads[r].read_id assumed to be matched with read before call!!! */
+ if( r >= ILLUMINAWRITER_MAX_NUM_READS ) {
+ *field = "number of reads";
+ return RC(rcSRA, rcFormatter, rcCopying, rcData, rcOutofrange);
+ }
+ if( (spot->barcode == NULL && barcode != NULL) ||
+ (spot->barcode != NULL && barcode == NULL) ||
+ (spot->barcode != barcode && pstring_cmp(spot->barcode, barcode) != 0) ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ *field = "barcode";
+ return rc;
+ }
+ if( read->seq.len > 0 ) {
+ if( spot->reads[r].seq ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ *field = "sequence";
+ return rc;
+ } else {
+ spot->reads[r].seq = &read->seq;
+ }
+ }
+ if( read->qual_type != ILLUMINAWRITER_COLMASK_NOTSET ) {
+ if( spot->reads[r].qual ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ *field = "quality";
+ return rc;
+ }
+ if( spot->qual_type != ILLUMINAWRITER_COLMASK_NOTSET && spot->qual_type != read->qual_type ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ *field = "quality type";
+ return rc;
+ }
+ spot->qual_type = read->qual_type;
+ spot->reads[r].qual = &read->qual;
+ }
+
+ if( read->noise.len > 0 ) {
+ if( spot->reads[r].noise ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ *field = "noise";
+ return rc;
+ } else {
+ spot->reads[r].noise = &read->noise;
+ }
+ }
+ if( read->intensity.len > 0 ) {
+ if( spot->reads[r].intensity ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ *field = "intensity";
+ return rc;
+ } else {
+ spot->reads[r].intensity = &read->intensity;
+ }
+ }
+ if( read->signal.len > 0 ) {
+ if( spot->reads[r].signal ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcDuplicate);
+ *field = "signal";
+ return rc;
+ } else {
+ spot->reads[r].signal = &read->signal;
+ }
+ }
+ if( spot->reads[r].filter != NULL ) {
+ if( *(spot->reads[r].filter) != read->filter ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ *field = "read_filter";
+ return rc;
+ }
+ } else {
+ spot->reads[r].filter = &read->filter;
+ }
+ return rc;
+}
+
+rc_t IlluminaSpot_Add(IlluminaSpot* spot, const pstring* name, const pstring* barcode, const IlluminaRead* read)
+{
+ rc_t rc = 0;
+
+ if( spot->nreads == 0 ) {
+ rc = IlluminaSpot_Set(spot, spot->nreads++, name, barcode, read);
+ } else if( pstring_cmp(spot->name, name) == 0 ) {
+ /* look if same read_id was already seen in this spot */
+ int32_t k;
+ for(k = 0; k < spot->nreads; k++) {
+ if( spot->reads[k].read_id == read->read_id ) {
+ const char* field;
+ rc = IlluminaSpot_Append(spot, k, barcode, read, &field);
+ if( GetRCState(rc) == rcDuplicate && read->read_id == ILLUMINAWRITER_READID_NONE ) {
+ /* may be it is the case when readids are missing on defline and these are separate reads */
+ k = spot->nreads + 1;
+ rc = 0;
+ } else if( rc != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "$(field) for spot '$(s)'", PLOG_2(PLOG_S(field),PLOG_S(s)), field, spot->name->data));
+ }
+ break;
+ }
+ }
+ if( rc == 0 && k >= spot->nreads ) {
+ /* read was not found, adddind new read to this spot */
+ rc = IlluminaSpot_Set(spot, spot->nreads++, name, barcode, read);
+ }
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcIgnored);
+ }
+ return rc;
+}
+
+struct SRAWriterIllumina {
+ SRAWriter* base;
+ const SRALoaderConfig* config;
+ const PlatformXML* platform;
+ uint8_t nreads;
+
+ SRASegment read_seg[ILLUMINAWRITER_MAX_NUM_READS];
+ int16_t barcode_read_id;
+ bool fixed_read_seg;
+ const ReadSpecXML_read* last_read;
+ uint32_t sequence_length;
+
+ uint16_t col_mask;
+ uint32_t ci_name;
+ uint32_t ci_read;
+ uint32_t ci_qual;
+ uint32_t ci_signal;
+ uint32_t ci_noise;
+ uint32_t ci_intensity;
+ uint32_t ci_read_filter;
+
+};
+
+rc_t SRAWriterIllumina_Make(const SRAWriterIllumina** cself, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriterIllumina* self;
+ const PlatformXML* platform;
+ const ReadSpecXML_read* last_read;
+ int32_t spot_len;
+ uint32_t sequence_length;
+ uint8_t nreads;
+
+ if( cself == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ||
+ (rc = Experiment_GetReadNumber(config->experiment, &nreads)) != 0 ||
+ (rc = Experiment_GetSpotLength(config->experiment, &sequence_length)) != 0 ||
+ (rc = Experiment_GetRead(config->experiment, nreads - 1, &last_read)) != 0 ) {
+ return rc;
+ }
+ if( platform->id != SRA_PLATFORM_ILLUMINA ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "platform type");
+ return rc;
+ }
+ if( nreads > ILLUMINAWRITER_MAX_NUM_READS ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ PLOGERR(klogErr, (klogErr, rc, "more than $(max) reads", PLOG_U8(max), (uint8_t)ILLUMINAWRITER_MAX_NUM_READS));
+ return rc;
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ return rc;
+ }
+ if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize base writer");
+ }
+ self->config = config;
+ self->platform = platform;
+ self->nreads = nreads;
+ self->barcode_read_id = ILLUMINAWRITER_READID_NONE;
+ self->last_read = last_read;
+ self->fixed_read_seg = true;
+ self->col_mask = ILLUMINAWRITER_COLMASK_NOTSET;
+ self->sequence_length = sequence_length;
+ spot_len = sequence_length;
+
+ do {
+ const ReadSpecXML_read* read_spec;
+ int16_t len = 0;
+ --nreads;
+ if( (rc = Experiment_GetRead(config->experiment, nreads, &read_spec)) != 0 ) {
+ break;
+ }
+ if( read_spec->read_type == rdsp_BarCode_rt ) {
+ if( self->barcode_read_id == ILLUMINAWRITER_READID_NONE ) {
+ self->barcode_read_id = nreads;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcDuplicate);
+ LOGERR(klogErr, rc, "only on BarCode READ_TYPE per spot supported");
+ break;
+ }
+ }
+ if( self->fixed_read_seg ) {
+ switch(read_spec->coord_type) {
+ case rdsp_BaseCoord_ct:
+ case rdsp_CycleCoord_ct:
+ len = spot_len - read_spec->coord.start_coord + 1;
+ break;
+ case rdsp_ExpectedBaseCall_ct:
+ case rdsp_ExpectedBaseCallTable_ct:
+ if( read_spec->coord.expected_basecalls.default_length > 0 ) {
+ len = read_spec->coord.expected_basecalls.default_length;
+ } else {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ }
+ break;
+ case rdsp_RelativeOrder_ct:
+ if( nreads == 0 ) {
+ len = spot_len - 1 + 1; /* as if BASE_COORD == 1 */
+ break;
+ }
+ default:
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcUnsupported);
+ }
+ if( rc == 0 ) {
+ spot_len -= len;
+ if( spot_len < 0 || len <= 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "SPOT_DECODE_SPEC and SEQUENCE_LENGTH");
+ } else {
+ SRASegment* seg = &self->read_seg[nreads];
+ seg->start = spot_len;
+ seg->len = len;
+ DEBUG_MSG(3, ("#%u read fixed length = %i\n", nreads, len));
+ }
+ } else if( GetRCState(rc) == rcUnsupported ) {
+ self->fixed_read_seg = false;
+ DEBUG_MSG(3, ("not fixed spot segmentation"));
+ rc = 0;
+ }
+ }
+ } while( rc == 0 && nreads > 0 );
+
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ SRAWriterIllumina_Whack(self, NULL);
+ }
+ return rc;
+}
+
+void SRAWriterIllumina_Whack(const SRAWriterIllumina* cself, SRATable** table)
+{
+ if( cself != NULL ) {
+ SRAWriterIllumina* self = (SRAWriterIllumina*)cself;
+ SRAWriter_Whack(self->base, table);
+ free(self);
+ }
+}
+
+typedef struct IlluminaWriterSpot_struct {
+ pstring name;
+ const char* spot_group;
+ uint16_t col_mask;
+ bool adjust_last_read_len;
+ pstring seq;
+ pstring qual;
+ pstring noise;
+ pstring intensity;
+ pstring signal;
+ SRAReadFilter filter[ILLUMINAWRITER_MAX_NUM_READS+1];
+} IlluminaWriterSpot;
+
+static
+rc_t SRAWriterIllumina_Check(SRAWriterIllumina* self,
+ IlluminaSpot* spot, IlluminaWriterSpot* final)
+{
+ rc_t rc = 0;
+ bool done, inject_barcode = false;
+ int32_t i, flt_qty, spot_len;
+ const char* what = NULL, *member_basecall = NULL;
+
+ assert(self != NULL);
+ assert(spot != NULL);
+ assert(final != NULL);
+
+ /* reorder reads ascending by file's read_ids */
+ do {
+ IlluminaSpot tmp;
+ done = true;
+ for(i = 1; i < spot->nreads; i++) {
+ if( spot->reads[i].read_id < spot->reads[i - 1].read_id ) {
+ memmove(&tmp.reads[0], &spot->reads[i], sizeof(tmp.reads[0]));
+ memmove(&spot->reads[i], &spot->reads[i - 1], sizeof(tmp.reads[0]));
+ memmove(&spot->reads[i - 1], &tmp.reads[0], sizeof(tmp.reads[0]));
+ done = false;
+ }
+ }
+ } while( !done );
+
+ /* get total spot length in bases */
+ spot_len = 0;
+ for(i = 0; rc == 0 && i < spot->nreads; i++) {
+ if( spot->reads[i].seq == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcNotFound);
+ what = "sequence";
+ } else {
+ spot_len += spot->reads[i].seq->len;
+ if( spot->reads[i].qual == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcNotFound);
+ what = "quality";
+ }
+ }
+ }
+ if( rc == 0 ) {
+ if( spot->name == NULL || spot->name->len < 1 ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcEmpty);
+ what = "spot name";
+ } else {
+ rc = pstring_copy(&final->name, spot->name);
+ }
+ }
+ if( rc == 0 ) {
+ final->spot_group = NULL;
+ if( spot->barcode != NULL && spot->barcode->len > 0 ) {
+ if( self->barcode_read_id != ILLUMINAWRITER_READID_NONE ) {
+ rc = Experiment_FindReadInTable(self->config->experiment, self->barcode_read_id,
+ spot->barcode->data, &member_basecall, &final->spot_group);
+ if( GetRCState(rc) == rcNotFound ) {
+ /* experiment knows nothing about this barcode, so may be they assigned membership themselves, reset */
+ member_basecall = NULL;
+ final->spot_group = NULL;
+ rc = 0;
+ } else if( rc != 0 ) {
+ what = "barcode";
+ }
+ }
+ if( final->spot_group == NULL ) {
+ /* reset back to file value */
+ final->spot_group = spot->barcode->data;
+ }
+ if( member_basecall == NULL && pstring_is_fasta(spot->barcode) ) {
+ /* keep original barcode from file if it is fasta */
+ member_basecall = spot->barcode->data;
+ }
+ }
+ }
+ if( rc == 0 ) {
+ final->adjust_last_read_len = false;
+ if( self->sequence_length != spot_len ) {
+ uint16_t barc_len = member_basecall ? strlen(member_basecall) : 0;
+ if ((self->sequence_length != (spot_len + barc_len))
+
+ || (self->barcode_read_id == ILLUMINAWRITER_READID_NONE))
+ /* Otherwise inject_barcode is set
+ and when it is inserted below, it uses read_seg[self->barcode_read_id].
+ I.e. barcode_read_id should be >= 0
+ while ILLUMINAWRITER_READID_NONE == -1 */
+
+ {
+ if( spot_len > self->sequence_length ) {
+ what = "spot too long";
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcExcessive);
+ PLOGERR(klogErr, (klogErr, rc,
+ "cumulative length of reads data in file(s): $(l) is greater than"
+ " spot length declared in experiment: $(e) in spot '$(spot)'",
+ "l=%d,e=%u,spot=%.*s", spot_len, self->sequence_length,
+ (uint32_t)spot->name->len, spot->name->data));
+ } else if( self->fixed_read_seg && (self->last_read->read_class & SRA_READ_TYPE_BIOLOGICAL) &&
+ spot_len > (self->sequence_length - self->read_seg[self->nreads - 1].len) &&
+ (self->barcode_read_id == ILLUMINAWRITER_READID_NONE ||
+ self->sequence_length - spot_len != self->read_seg[self->barcode_read_id].len) ) {
+ final->adjust_last_read_len = true;
+ } else {
+ what = "spot too short";
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ PLOGERR(klogErr, (klogErr, rc,
+ "cumulative length of reads data in file(s): $(l) is less than"
+ " spot length declared in experiment: $(e), most probably $(x) is absent in spot '$(spot)'",
+ "l=%d,e=%u,spot=%.*s,x=%s", spot_len, self->sequence_length,
+ (uint32_t)spot->name->len, spot->name->data,
+ (self->barcode_read_id == ILLUMINAWRITER_READID_NONE ||
+ self->sequence_length - spot_len != self->read_seg[self->barcode_read_id].len) ? "mate-pair" : "barcode" ));
+ }
+ } else {
+ spot_len += barc_len;
+ inject_barcode = true;
+ DEBUG_MSG(3, ("barcode needs to be injected into spot data\n"));
+ }
+ }
+ }
+
+ /* prepare seq/qual/signal/noise/intensity */
+ pstring_clear(&final->seq);
+ pstring_clear(&final->qual);
+ pstring_clear(&final->noise);
+ pstring_clear(&final->intensity);
+ pstring_clear(&final->signal);
+ final->col_mask = ILLUMINAWRITER_COLMASK_READ | spot->qual_type;
+ for(flt_qty = i = 0; rc == 0 && i < spot->nreads; i++, flt_qty++) {
+ /* presence of seq and qual data is checked above */
+ if( (rc = pstring_concat(&final->seq, spot->reads[i].seq)) != 0 ) {
+ what = "sequence";
+ break;
+ } else if( (rc = pstring_concat(&final->qual, spot->reads[i].qual)) != 0 ) {
+ what = "quality";
+ break;
+ }
+ if( spot->reads[i].signal != NULL ) {
+ if( (rc = pstring_concat(&final->signal, spot->reads[i].signal)) != 0 ) {
+ what = "signal";
+ break;
+ }
+ final->col_mask |= ILLUMINAWRITER_COLMASK_SIGNAL;
+ }
+ if( spot->reads[i].noise != NULL ) {
+ if( (rc = pstring_concat(&final->noise, spot->reads[i].noise)) != 0 ) {
+ what = "noise";
+ break;
+ }
+ final->col_mask |= ILLUMINAWRITER_COLMASK_NOISE;
+ }
+ if( spot->reads[i].intensity != NULL ) {
+ if( (rc = pstring_concat(&final->intensity, spot->reads[i].intensity)) != 0 ) {
+ what = "intensity";
+ break;
+ }
+ final->col_mask |= ILLUMINAWRITER_COLMASK_INTENSITY;
+ }
+ if( spot->reads[i].filter != NULL && i == 0 ) {
+ final->col_mask |= ILLUMINAWRITER_COLMASK_RDFILTER;
+ } else if( ((final->col_mask & ILLUMINAWRITER_COLMASK_RDFILTER) && spot->reads[i].filter == NULL) ||
+ (!(final->col_mask & ILLUMINAWRITER_COLMASK_RDFILTER) && spot->reads[i].filter != NULL) ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ what = "read filter";
+ break;
+ }
+ if( spot->reads[i].filter != NULL ) {
+ final->filter[flt_qty] = *(spot->reads[i].filter);
+ }
+ }
+ if( rc == 0 &&
+ (final->qual.len / final->seq.len) != ((final->col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4) ? 4 : 1) ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ what = "quality length vs sequence";
+ }
+ if( rc == 0 &&
+ ((final->col_mask & ILLUMINAWRITER_COLMASK_SIGNAL) && (final->signal.len != self->sequence_length * 16)) ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ what = "signal data length";
+ }
+ if( rc == 0 &&
+ ((final->col_mask & ILLUMINAWRITER_COLMASK_NOISE) && (final->noise.len != self->sequence_length * 16)) ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ what = "noise data length";
+ }
+ if( rc == 0 &&
+ ((final->col_mask & ILLUMINAWRITER_COLMASK_INTENSITY) && (final->intensity.len != self->sequence_length * 16)) ) {
+ rc = RC(rcSRA, rcFormatter, rcValidating, rcData, rcInconsistent);
+ what = "intensity data length";
+ }
+
+ if( rc == 0 && inject_barcode ) {
+ /* insert barcode into spot data using read_seg information */
+ /* verified above to be present, to be fasta, and length as in XML */
+ INSDC_coord_zero from = self->read_seg[self->barcode_read_id].start;
+ INSDC_coord_len l = self->read_seg[self->barcode_read_id].len;
+ INSDC_coord_len carry = final->seq.len - from;
+ const uint32_t qual_x = ((final->col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4) ? 4 : 1);
+ pstring tmp;
+
+ DEBUG_MSG(3, ("injecting barcodr as read %i [%i,%u] \n", self->barcode_read_id, from, l));
+ final->seq.len = from;
+ final->qual.len = from * qual_x;
+ if( (rc = pstring_assign(&tmp, &final->seq.data[final->seq.len], carry)) != 0 ||
+ (rc = pstring_append(&final->seq, member_basecall, l)) != 0 ||
+ (rc = pstring_concat(&final->seq, &tmp)) != 0 ) {
+ what = "inserting barcode into sequence";
+ } else if( (rc = pstring_assign(&tmp, &final->qual.data[final->qual.len], carry * qual_x)) != 0 ||
+ (rc = pstring_append_chr(&final->qual, 1, l * qual_x)) != 0 ||
+ (rc = pstring_concat(&final->qual, &tmp)) != 0 ) {
+ what = "inserting barcode into quality";
+ }
+ if( rc == 0 && (final->col_mask & ILLUMINAWRITER_COLMASK_SIGNAL) ) {
+ final->signal.len = from * 16;
+ if( (rc = pstring_assign(&tmp, &final->signal.data[final->signal.len], carry * 16)) != 0 ||
+ (rc = pstring_append_chr(&final->signal, 0, l * 16)) != 0 ||
+ (rc = pstring_concat(&final->signal, &tmp)) != 0 ) {
+ what = "inserting barcode into signal";
+ }
+ }
+ if( rc == 0 && (final->col_mask & ILLUMINAWRITER_COLMASK_INTENSITY) ) {
+ final->intensity.len = from * 16;
+ if( (rc = pstring_assign(&tmp, &final->intensity.data[final->intensity.len], carry * 16)) != 0 ||
+ (rc = pstring_append_chr(&final->intensity, 0, l * 16)) != 0 ||
+ (rc = pstring_concat(&final->intensity, &tmp)) != 0 ) {
+ what = "inserting barcode into intensity";
+ }
+ }
+ if( rc == 0 && (final->col_mask & ILLUMINAWRITER_COLMASK_NOISE) ) {
+ final->noise.len = from * 16;
+ if( (rc = pstring_assign(&tmp, &final->noise.data[final->noise.len], carry * 16)) != 0 ||
+ (rc = pstring_append_chr(&final->noise, 0, l * 16)) != 0 ||
+ (rc = pstring_concat(&final->noise, &tmp)) != 0 ) {
+ what = "inserting barcode into noise";
+ }
+ }
+ for(i = flt_qty - 1; rc == 0 && i >= self->barcode_read_id; i--) {
+ final->filter[i + 1] = final->filter[i];
+ }
+ final->filter[self->barcode_read_id] = final->filter[0];
+ flt_qty++;
+ }
+ /* propogate filter value in case number of reads in files is less than in XML */
+ for(i = flt_qty; rc == 0 && i < self->nreads; i++) {
+ final->filter[i] = final->filter[0];
+ }
+
+#if _DEBUGGING
+ DEBUG_MSG(3, ("Ready: READ: %s\n", final->seq.data));
+ DEBUG_MSG(3, ("Ready: QUAL%c:", (final->col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4) ? '4' : '1'));
+ for(i = 0; i < final->qual.len; i++ ) {
+ DEBUG_MSG(3, (" %i", final->qual.data[i]));
+ }
+ DEBUG_MSG(3, ("\nReady: SGRUP: %s\n", final->spot_group));
+ for(i = 0; i < self->nreads; i++ ) {
+ DEBUG_MSG(3, ("Ready: READ_FLT[%u]: %s\n", i, final->filter[i] == SRA_READ_FILTER_PASS ? "PASS" : "REJECT"));
+ }
+#endif
+ if( rc != 0 && rc != KLogLastErrorCode() ) {
+ PLOGERR(klogErr, (klogErr, rc, "$(msg) in spot '$(spot)'", "msg=%s,spot=%.*s", what, spot->name->len, spot->name->data));
+ }
+ return rc;
+}
+
+rc_t SRAWriterIllumina_Write(const SRAWriterIllumina* cself, const SRALoaderFile* data_block_ref, IlluminaSpot* spot)
+{
+ rc_t rc = 0;
+ SRAWriterIllumina* self =(SRAWriterIllumina*)cself;
+ IlluminaWriterSpot final;
+
+ assert(self != NULL);
+ assert(data_block_ref != NULL);
+
+ DEBUG_MSG(3, ("spot name '%s', group '%s'\n", spot->name->data, spot->barcode ? spot->barcode->data : NULL));
+
+ if( (rc = SRAWriterIllumina_Check(self, spot, &final)) != 0 ) {
+ return rc;
+ }
+ if( self->col_mask == ILLUMINAWRITER_COLMASK_NOTSET ) {
+ const char* schema;
+
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4 ) {
+ schema = "NCBI:SRA:Illumina:tbl:q4:v2";
+ } else if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS1 ) {
+ schema = "NCBI:SRA:Illumina:tbl:q1:v2";
+ } else if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_PHRED ) {
+ schema = "NCBI:SRA:Illumina:tbl:phred:v2";
+ } else {
+ rc = RC(rcExe, rcTable, rcCreating, rcType, rcUnknown);
+ return rc;
+ }
+ if( (rc = SRAWriter_CreateTable(self->base, schema)) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteDefaults(self->base)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to write table defaults");
+ return rc;
+ }
+ COL_OPEN(self->ci_name, "NAME", vdb_ascii_t);
+ COL_OPEN(self->ci_read, "READ", insdc_fasta_t);
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4 ) {
+ COL_OPEN(self->ci_qual, "QUALITY", ncbi_qual4_t);
+ } else if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS1 ) {
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_logodds_t);
+ } else if( final.col_mask & ILLUMINAWRITER_COLMASK_QUALITY_PHRED ) {
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_phred_t);
+ }
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_SIGNAL ) {
+ COL_OPEN(self->ci_signal, "SIGNAL", ncbi_fsamp4_t);
+ }
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_NOISE ) {
+ COL_OPEN(self->ci_noise, "NOISE", ncbi_fsamp4_t);
+ }
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_INTENSITY ) {
+ COL_OPEN(self->ci_intensity, "INTENSITY", ncbi_fsamp4_t);
+ }
+ if( final.col_mask & ILLUMINAWRITER_COLMASK_RDFILTER ) {
+ COL_OPEN(self->ci_read_filter, "READ_FILTER", sra_read_filter_t);
+ }
+ self->col_mask = final.col_mask;
+ }
+ if( self->col_mask != final.col_mask ) {
+ rc = RC(rcSRA, rcFormatter, rcReading, rcData, rcInconsistent);
+ LOGERR(klogInt, rc, "columns do not match to 1st spot");
+ return rc;
+ }
+ if( (rc = SRAWriter_NewSpot(self->base, NULL)) != 0 ) {
+ return rc;
+ }
+ COL_WRITE(self->ci_name, "NAME", final.name);
+ COL_WRITE(self->ci_read, "READ", final.seq);
+ COL_WRITE(self->ci_qual, "QUALITY", final.qual);
+ COL_WRITE(self->ci_noise, "NOISE", final.noise);
+ COL_WRITE(self->ci_intensity, "INTENSITY", final.intensity);
+ COL_WRITE(self->ci_signal, "SIGNAL", final.signal);
+
+ if( self->fixed_read_seg ) {
+ uint16_t tmp = 0;
+ if( final.adjust_last_read_len ) {
+ tmp = cself->read_seg[cself->nreads - 1].len;
+ self->read_seg[cself->nreads - 1].len -= cself->sequence_length - final.seq.len;
+ }
+ if( (rc = SRAWriter_WriteSpotSegmentSimple(self->base, data_block_ref, final.spot_group, cself->read_seg)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ if( final.adjust_last_read_len ) {
+ self->read_seg[cself->nreads - 1].len = tmp;
+ }
+ } else {
+ if( (rc = SRAWriter_WriteSpotSegment(self->base, data_block_ref, final.spot_group, final.seq.len, final.seq.data)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ }
+ if( self->ci_read_filter != 0 ) {
+ rc = SRAWriter_WriteIdxColumn(self->base, self->ci_read_filter, final.filter, self->nreads * sizeof(final.filter[0]), false);
+ if(rc) {
+ PLOGERR(klogInt, (klogInt, rc, "failed to write $(column) column", "column=READ_FILTER"));
+ return rc;
+ }
+ }
+ return SRAWriter_CloseSpot(self->base);
+}
diff --git a/tools/sra-load/writer-illumina.h b/tools/sra-load/writer-illumina.h
new file mode 100644
index 0000000..ca7eae5
--- /dev/null
+++ b/tools/sra-load/writer-illumina.h
@@ -0,0 +1,92 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_writer_illumina_
+#define _sra_load_writer_illumina_
+
+#include "loader-fmt.h"
+#include "pstring.h"
+
+#define ILLUMINAWRITER_MAX_NUM_READS 5
+/* these readids have special meaning,
+ * from file we can get only single digit positive readid so they never overlap
+ * readid == -1 from file means no read id was found, must be whole spot data or single read submission
+ */
+#define ILLUMINAWRITER_READID_NONE -1
+
+#define ILLUMINAWRITER_COLMASK_NOTSET 0x00
+#define ILLUMINAWRITER_COLMASK_READ 0x01
+#define ILLUMINAWRITER_COLMASK_QUALITY_PHRED 0x02
+#define ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS1 0x04
+#define ILLUMINAWRITER_COLMASK_QUALITY_LOGODDS4 0x08
+#define ILLUMINAWRITER_COLMASK_SIGNAL 0x10
+#define ILLUMINAWRITER_COLMASK_NOISE 0x20
+#define ILLUMINAWRITER_COLMASK_INTENSITY 0x40
+#define ILLUMINAWRITER_COLMASK_RDFILTER 0x80
+
+
+typedef struct IlluminaRead_struct {
+ int16_t read_id;
+ pstring seq;
+ int qual_type;
+ pstring qual;
+ pstring noise;
+ pstring intensity;
+ pstring signal;
+ SRAReadFilter filter;
+} IlluminaRead;
+
+void IlluminaRead_Init(IlluminaRead* read, bool name_only);
+
+typedef struct IlluminaSpot_struct {
+ const pstring* name;
+ const pstring* barcode;
+ int32_t nreads;
+ int qual_type;
+ struct {
+ int16_t read_id;
+ const pstring* seq;
+ const pstring* qual;
+ const pstring* noise;
+ const pstring* intensity;
+ const pstring* signal;
+ const SRAReadFilter* filter;
+ } reads[ILLUMINAWRITER_MAX_NUM_READS];
+} IlluminaSpot;
+
+void IlluminaSpot_Init(IlluminaSpot* spot);
+
+rc_t IlluminaSpot_Add(IlluminaSpot* spot, const pstring* name, const pstring* barcode, const IlluminaRead* read);
+
+
+typedef struct SRAWriterIllumina SRAWriterIllumina;
+
+rc_t SRAWriterIllumina_Make(const SRAWriterIllumina** cself, const SRALoaderConfig* config);
+
+void SRAWriterIllumina_Whack(const SRAWriterIllumina* cself, SRATable** table);
+
+rc_t SRAWriterIllumina_Write(const SRAWriterIllumina* cself, const SRALoaderFile* data_block_ref, IlluminaSpot* spot);
+
+#endif /* _sra_load_writer_illumina_ */
diff --git a/tools/sra-load/writer-ion-torrent.c b/tools/sra-load/writer-ion-torrent.c
new file mode 100644
index 0000000..174020c
--- /dev/null
+++ b/tools/sra-load/writer-ion-torrent.c
@@ -0,0 +1,262 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <sra/types.h>
+#include <insdc/insdc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "writer-ion-torrent.h"
+#include "sra-writer.h"
+
+struct SRAWriterIonTorrent {
+ SRAWriter* base;
+ pstring flows;
+ uint32_t flow_count;
+ pstring keys;
+
+ uint32_t ci_flowc;
+ uint32_t ci_keys;
+ uint32_t ci_name;
+ uint32_t ci_read;
+ uint32_t ci_qual;
+ uint32_t ci_signal;
+ uint32_t ci_position;
+ uint32_t ci_q_left;
+ uint32_t ci_q_right;
+ uint32_t ci_a_left;
+ uint32_t ci_a_right;
+};
+
+rc_t SRAWriterIonTorrent_Make(const SRAWriterIonTorrent** cself, const SRALoaderConfig* config)
+{
+ rc_t rc = 0;
+ SRAWriterIonTorrent* self;
+ const PlatformXML* platform;
+
+ if( cself == NULL || config == NULL ) {
+ return RC(rcSRA, rcFormatter, rcConstructing, rcParam, rcNull);
+ }
+ if( (rc = Experiment_GetPlatform(config->experiment, &platform)) != 0 ) {
+ return rc;
+ }
+ if( platform->id != SRA_PLATFORM_ION_TORRENT ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "platform type");
+ return rc;
+ }
+ self = calloc(1, sizeof(*self));
+ if( self == NULL ) {
+ rc = RC(rcSRA, rcFormatter, rcConstructing, rcMemory, rcExhausted);
+ } else if( (rc = SRAWriter_Make(&self->base, config)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to initialize base writer");
+ } else {
+ if( platform->param.ion_torrent.flow_sequence != NULL ) {
+ rc = pstring_assign(&self->flows, platform->param.ion_torrent.flow_sequence,
+ strlen(platform->param.ion_torrent.flow_sequence));
+ }
+ if( rc == 0 && platform->param.ion_torrent.key_sequence != NULL ) {
+ rc = pstring_assign(&self->keys, platform->param.ion_torrent.key_sequence,
+ strlen(platform->param.ion_torrent.key_sequence));
+ }
+ self->flow_count = platform->param.ion_torrent.flow_count;
+ }
+ if( rc == 0 ) {
+ *cself = self;
+ } else {
+ SRAWriterIonTorrent_Whack(self, NULL);
+ }
+ return rc;
+}
+
+void SRAWriterIonTorrent_Whack(const SRAWriterIonTorrent* cself, SRATable** table)
+{
+ if( cself != NULL ) {
+ SRAWriterIonTorrent* self = (SRAWriterIonTorrent*)cself;
+ SRAWriter_Whack(self->base, table);
+ free(self);
+ }
+}
+
+static
+rc_t SRAWriterIonTorrent_Open(const SRAWriterIonTorrent* cself, bool sig_and_pos)
+{
+ rc_t rc = 0;
+ SRAWriterIonTorrent* self = (SRAWriterIonTorrent*)cself;
+
+ if( cself->ci_name == 0 ) {
+ INSDC_coord_one d = 0;
+ pstring x;
+
+ if( (rc = SRAWriter_CreateTable(self->base, "NCBI:SRA:IonTorrent:tbl:v2")) != 0 ) {
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteDefaults(self->base)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to write table defaults");
+ return rc;
+ }
+ COL_OPEN(self->ci_name, "NAME", vdb_ascii_t);
+ COL_OPEN(self->ci_read, "READ", insdc_fasta_t);
+ COL_OPEN(self->ci_qual, "QUALITY", insdc_phred_t);
+ COL_OPEN(self->ci_q_left, "CLIP_QUALITY_LEFT", "INSDC:coord:one");
+ COL_OPEN(self->ci_q_right, "CLIP_QUALITY_RIGHT", "INSDC:coord:one");
+ COL_OPEN(self->ci_a_left, "CLIP_ADAPTER_LEFT", "INSDC:coord:one");
+ COL_OPEN(self->ci_a_right, "CLIP_ADAPTER_RIGHT", "INSDC:coord:one");
+ COL_OPEN(self->ci_flowc, "FLOW_CHARS", insdc_fasta_t);
+ COL_OPEN(self->ci_keys, "KEY_SEQUENCE", insdc_fasta_t);
+
+ COL_WRITE_DEFAULT(self->ci_flowc, "FLOW_CHARS", self->flows);
+ COL_WRITE_DEFAULT(self->ci_keys, "KEY_SEQUENCE", self->keys);
+ if( (rc = pstring_assign(&x, &d, sizeof(d))) == 0 ) {
+ COL_WRITE_DEFAULT(self->ci_q_left, "CLIP_QUALITY_LEFT", x);
+ COL_WRITE_DEFAULT(self->ci_q_right, "CLIP_QUALITY_RIGHT", x);
+ COL_WRITE_DEFAULT(self->ci_a_left, "CLIP_ADAPTER_LEFT", x);
+ COL_WRITE_DEFAULT(self->ci_a_right, "CLIP_ADAPTER_RIGHT", x);
+ }
+ }
+ if( sig_and_pos && (cself->ci_signal == 0 || cself->ci_position == 0) ) {
+ COL_OPEN(self->ci_signal, "SIGNAL", ncbi_isamp1_t);
+ COL_OPEN(self->ci_position, "POSITION", "INSDC:position:one");
+ }
+ return rc;
+}
+
+rc_t SRAWriterIonTorrent_WriteHead(const SRAWriterIonTorrent* cself, const pstring* flow_chars, const pstring* key_sequence)
+{
+ rc_t rc = 0;
+
+ if( (rc = SRAWriterIonTorrent_Open(cself, false)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to create table");
+ return rc;
+ }
+ if( flow_chars && flow_chars->len != 0 ) {
+ if( cself->flows.len != 0 && pstring_cmp(&cself->flows, flow_chars) != 0 ) {
+ PLOGMSG(klogWarn, (klogWarn, "file FLOW_SEQUENCE do not match experiment: $(s)", PLOG_S(s), flow_chars->data));
+ }
+ /* update flow_count so signal data length will match below */
+ ((SRAWriterIonTorrent*)cself)->flow_count = flow_chars->len;
+ COL_WRITE_DEFAULT(cself->ci_flowc, "FLOW_CHARS", (*flow_chars));
+ }
+ if( key_sequence && key_sequence->len != 0 ) {
+ if( cself->keys.len != 0 && pstring_cmp(&cself->keys, key_sequence) != 0 ) {
+ PLOGMSG(klogWarn, (klogWarn, "file KEY_SEQUENCE do not match experiment: $(s)", PLOG_S(s), key_sequence->data));
+ }
+ COL_WRITE_DEFAULT(cself->ci_keys, "KEY_SEQUENCE", (*key_sequence));
+ }
+ return 0;
+}
+
+rc_t SRAWriterIonTorrent_WriteRead(const SRAWriterIonTorrent* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality,
+ const pstring* signal, const pstring* position,
+ INSDC_coord_one q_left, INSDC_coord_one q_right,
+ INSDC_coord_one a_left, INSDC_coord_one a_right)
+{
+ rc_t rc = 0;
+ SRAWriterIonTorrent* self =(SRAWriterIonTorrent*)cself;
+
+ assert(self != NULL);
+ assert(data_block_ref != NULL);
+
+ DEBUG_MSG(3, ("spot name '%s'\n", name ? name->data : NULL));
+
+ if( (rc = SRAWriterIonTorrent_Open(cself, signal || position)) != 0 ) {
+ LOGERR(klogInt, rc, "failed to open table");
+ return rc;
+ }
+ if( !name || name->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "spot name");
+ }
+ if( !sequence || sequence->len == 0 ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcEmpty);
+ LOGERR(klogErr, rc, "sequence");
+ } else if( !quality || sequence->len != quality->len ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, quality ? rcInconsistent : rcEmpty);
+ LOGERR(klogErr, rc, "quality");
+ }
+ if( signal && signal->len / self->flow_count != sizeof(uint16_t) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "signal and flow chars");
+ }
+ if( position && position->len / sequence->len != sizeof(INSDC_position_one) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "sequence and position");
+ }
+ if( q_left < 0 || (sequence && q_left > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip quality left and sequence");
+ }
+ if( q_right < 0 || (sequence && q_right > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip quality right and sequence");
+ }
+ if( a_left < 0 || (sequence && a_left > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip adapter left and sequence");
+ }
+ if( a_right < 0 || (sequence && a_right > sequence->len) ) {
+ rc = RC(rcSRA, rcFormatter, rcWriting, rcData, rcInconsistent);
+ LOGERR(klogErr, rc, "clip adapter right and sequence");
+ }
+ if( rc != 0 || (rc = SRAWriter_NewSpot(self->base, NULL)) != 0 ) {
+ return rc;
+ }
+ COL_WRITE(self->ci_name, "NAME", (*name));
+ COL_WRITE(self->ci_read, "READ", (*sequence));
+ COL_WRITE(self->ci_qual, "QUALITY", (*quality));
+ COL_WRITE(self->ci_signal, "SIGNAL", (*signal));
+ COL_WRITE(self->ci_position, "POSITION", (*position));
+
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_q_left, &q_left, sizeof(q_left), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_QUALITY_LEFT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_q_right, &q_right, sizeof(q_right), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_QUALITY_RIGHT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_a_left, &a_left, sizeof(a_left), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_ADAPTER_LEFT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteIdxColumn(self->base, self->ci_a_right, &a_right, sizeof(a_right), false)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=CLIP_ADAPTER_RIGHT"));
+ return rc;
+ }
+ if( (rc = SRAWriter_WriteSpotSegment(self->base, data_block_ref, NULL, sequence->len, sequence->data)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "failed to write $(column) column", "column=SPOT_GROUP/READ_SEG"));
+ return rc;
+ }
+ return SRAWriter_CloseSpot(self->base);
+}
diff --git a/tools/sra-load/writer-ion-torrent.h b/tools/sra-load/writer-ion-torrent.h
new file mode 100644
index 0000000..004e443
--- /dev/null
+++ b/tools/sra-load/writer-ion-torrent.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_writer_ion_torrent_
+#define _sra_load_writer_ion_torrent_
+
+#include "loader-fmt.h"
+#include "pstring.h"
+
+typedef struct SRAWriterIonTorrent SRAWriterIonTorrent;
+
+rc_t SRAWriterIonTorrent_Make(const SRAWriterIonTorrent** cself, const SRALoaderConfig* config);
+
+void SRAWriterIonTorrent_Whack(const SRAWriterIonTorrent* cself, SRATable** table);
+
+rc_t SRAWriterIonTorrent_WriteHead(const SRAWriterIonTorrent* cself, const pstring* flow_chars, const pstring* key_sequence);
+
+rc_t SRAWriterIonTorrent_WriteRead(const SRAWriterIonTorrent* cself, const SRALoaderFile* data_block_ref,
+ const pstring* name, const pstring* sequence, const pstring* quality,
+ const pstring* signal, const pstring* position,
+ INSDC_coord_one q_left, INSDC_coord_one q_right,
+ INSDC_coord_one a_left, INSDC_coord_one a_right);
+
+#endif /* _sra_load_writer_ion_torrent_ */
diff --git a/tools/sra-load/ztr-absolid.c b/tools/sra-load/ztr-absolid.c
new file mode 100644
index 0000000..8ef2e56
--- /dev/null
+++ b/tools/sra-load/ztr-absolid.c
@@ -0,0 +1,656 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#include "ztr-absolid.h"
+#include "debug.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define BE2H16(X) (bswap_16(X))
+#define BE2H32(X) (bswap_32(X))
+#else
+#define BE2H16(X) (X)
+#define BE2H32(X) (X)
+#endif
+
+struct ZTR_Context {
+ int versMajor;
+ int versMinor;
+ size_t current, buflen;
+ const uint8_t *buf;
+};
+
+#define METANAME_COMP strcmp
+
+static size_t strendlen(const char *src, const char *end) {
+ size_t n = 0;
+
+ while (*src && src != end) {
+ ++src;
+ ++n;
+ }
+ return n;
+}
+
+static int count_pairs(const char *src, uint32_t len) {
+ int i, j;
+
+ for (j = i = 0; i != len; ++i) {
+ if (*src++ == 0)
+ ++j;
+ }
+ return j >> 1;
+}
+
+#if 0
+static const char *meta_getValueForName(const nvp_t *meta, int count, const char *name) {
+ int i;
+
+ for (i = 0; i != count; ++i) {
+ if (meta[i].name != NULL && METANAME_COMP(meta[i].name, name) == 0)
+ return meta[i].value;
+ }
+ return NULL;
+}
+#endif
+
+static const char *meta_getValueForNameAndRemove(nvp_t *meta, int count, const char *name) {
+ int i;
+
+ for (i = 0; i != count; ++i) {
+ if (meta[i].name != NULL && METANAME_COMP(meta[i].name, name) == 0) {
+ meta[i].name = NULL;
+ return meta[i].value;
+ }
+ }
+ return NULL;
+}
+
+static void parse_meta(nvp_t *meta, int count, const char *metadata, const char *end) {
+ int i, j;
+
+ for (i = 0; i != count && metadata <= end; ++i) {
+ j = strendlen(metadata, end);
+ if (j == 0)
+ break;
+ meta[i].name = metadata;
+ metadata += j; ++metadata;
+ meta[i].value = metadata;
+ metadata += strendlen(metadata, end); ++metadata;
+ }
+}
+
+bool ABI_ZTR_BufferIsEmpty(const ZTR_Context *ctx) {
+ return (ctx->buf == NULL || ctx->buflen == 0 || ctx->current == ctx->buflen) ? true : false;
+}
+
+static int isZTRchunk(const uint8_t type[4]) {
+ static const char *types[] = {
+ "BASE",
+ "BPOS",
+ "CLIP",
+ "CNF1",
+ "CNF4",
+ "COMM",
+ "CR32",
+ "HUFF",
+ "REGN",
+ "SAMP",
+ "SMP4",
+ "TEXT"
+ };
+ int i;
+
+ for (i = 0; i != sizeof(types) / sizeof(types[0]); ++i)
+ if (*(const uint32_t *)type == *(const uint32_t *)types[i])
+ return 1;
+
+ return 0;
+}
+
+rc_t ABI_ZTR_ParseBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw) {
+ assert(ctx);
+ assert(ztr_raw);
+
+ memset(ztr_raw, 0, sizeof(*ztr_raw));
+
+ if (ABI_ZTR_BufferIsEmpty(ctx))
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcEmpty );
+
+ if (ctx->current + 4 > ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+
+ *(uint32_t *)(ztr_raw->type) = *(uint32_t *)(ctx->buf + ctx->current);
+ ctx->current += 4;
+ if (ctx->current + 4 >= ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+ if (!isZTRchunk(ztr_raw->type))
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt);
+
+ ztr_raw->metalength = BE2H32(*(uint32_t *)(ctx->buf + ctx->current));
+ ctx->current += 4;
+ if (ztr_raw->metalength != 0) {
+ if (ctx->current + ztr_raw->metalength > ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+
+ ztr_raw->meta = ctx->buf + ctx->current;
+ ctx->current += ztr_raw->metalength;
+ if (memchr(ztr_raw->meta, 0, ztr_raw->metalength) == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+ }
+ if (ctx->current + 4 > ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+
+ ztr_raw->datalength = BE2H32(*(uint32_t *)(ctx->buf + ctx->current));
+ ctx->current += 4;
+ if (ztr_raw->datalength != 0) {
+ if (ctx->current + ztr_raw->datalength > ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+
+ ztr_raw->data = ctx->buf + ctx->current;
+ ctx->current += ztr_raw->datalength;
+ }
+ return 0;
+}
+
+#if ZTR_USE_EXTRA_META
+rc_t ABI_ZTR_ProcessBlock(ZTR_Context *ctx, const ztr_raw_t *ztr_raw, ztr_t *dst, enum ztr_chunk_type *chunkType, nvp_t **extraMeta, int *extraMetaCount)
+#else
+rc_t ABI_ZTR_ProcessBlock(ZTR_Context *ctx, const ztr_raw_t *ztr_raw, ztr_t *dst, enum ztr_chunk_type *chunkType)
+#endif
+{
+ rc_t rc;
+ const uint8_t *ptype;
+ uint8_t format;
+ size_t metasize, datasize;
+ const uint8_t *data;
+ const char *metadata;
+ int count;
+ enum ztr_chunk_type type;
+ enum ztr_data_type datatype = i8;
+ nvp_t *meta = NULL;
+ ztr_t ztr;
+ int padded = 0;
+
+ assert(ctx);
+ assert(ztr_raw);
+ assert(dst);
+ assert(chunkType);
+
+ *chunkType = none;
+ *(void **)dst = NULL;
+ *(void **)&ztr = NULL;
+
+ ptype = ztr_raw->type;
+ count = 0;
+ metasize = ztr_raw->metalength;
+ if (metasize != 0) {
+ metadata = (char *)ztr_raw->meta;
+ assert(metadata);
+ count = count_pairs(metadata, metasize);
+ if (count < 0)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+ if (count != 0) {
+ meta = malloc(sizeof(*meta) * count);
+ if (meta == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ parse_meta(meta, count, metadata, metadata + metasize);
+ }
+ else
+ meta = NULL;
+ }
+
+ if (memcmp(ptype, "BASE", 4) == 0) {
+ type = BASE;
+ datatype = i8;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "BPOS", 4) == 0) {
+ type = BPOS;
+ datatype = i32;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "CLIP", 4) == 0) {
+ type = CLIP;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "CNF1", 4) == 0) {
+ type = CNF1;
+ datatype = i8;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "CNF4", 4) == 0) {
+ type = CNF4;
+ datatype = i8;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "COMM", 4) == 0) {
+ type = COMM;
+ }
+ else if (memcmp(ptype, "CR32", 4) == 0) {
+ type = CR32;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "HUFF", 4) == 0) {
+ type = HUFF;
+ }
+ else if (memcmp(ptype, "REGN", 4) == 0) {
+ type = REGN;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "SAMP", 4) == 0) {
+ type = SAMP;
+ datatype = i16;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "SMP4", 4) == 0) {
+ type = SMP4;
+ datatype = i16v4;
+ padded = 1;
+ }
+ else if (memcmp(ptype, "TEXT", 4) == 0) {
+ type = TEXT;
+ }
+ else {
+ type = unknown;
+ DEBUG_MSG(1, ("$(func) - '$(type)' chunk unrecognized", "func=ZTR_ProcessBlock,type=%.*s\n", 4, & ztr_raw->type ));
+ }
+ {
+ metadata = meta_getValueForNameAndRemove(meta, count, "VALTYPE");
+
+ if (metadata != NULL) {
+ if (strcmp(metadata, "16 bit integer") == 0)
+ datatype = i16;
+ else if (strcmp(metadata, "32 bit integer") == 0)
+ datatype = i32;
+ else if (strcmp(metadata, "32 bit IEEE float") == 0)
+ datatype = f32;
+ else if (strcmp(metadata, "64 bit IEEE float") == 0)
+ datatype = f64;
+ }
+ }
+ datasize = ztr_raw->datalength;
+ if (datasize == 0)
+ data = NULL;
+ else
+ {
+ static const char zero[8];
+
+ data = ztr_raw->data;
+ assert(data);
+ format = *data;
+ switch (format) {
+ case 0:
+ if (padded) {
+ switch (datatype) {
+ case i16:
+ case i16v4:
+ if (memcmp(data, zero, 2) == 0)
+ padded = 2;
+ break;
+ case i32:
+ case f32:
+ if (memcmp(data, zero, 4) == 0)
+ padded = 4;
+ break;
+ case f64:
+ if (memcmp(data, zero, 8) == 0)
+ padded = 8;
+ break;
+ default:
+ break;
+ }
+ data += padded;
+ datasize -= padded;
+ }
+ else {
+ data += 1;
+ datasize -= 1;
+ }
+ break;
+ default:
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected );
+ PLOGERR ( klogWarn, ( klogWarn, rc,
+ "$(func) - '$(type)' unexpected ZTR chunk format '$(format)'",
+ "func=ZTR_ProcessBlock,type=%.*s,format=%02X", 4,
+ & ztr_raw->type, format ));
+ return rc;
+ break;
+ }
+ }
+
+ switch (type) {
+ case BASE:
+ ztr.sequence = malloc(sizeof(*ztr.sequence));
+ if (ztr.sequence == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.sequence->datatype = datatype;
+ ztr.sequence->datasize = datasize;
+ ztr.sequence->charset = (char *)meta_getValueForNameAndRemove(meta, count, "CSET");
+ ztr.sequence->data = (uint8_t *)data;
+ break;
+ case BPOS:
+ ztr.position = malloc(sizeof(*ztr.position));
+ if (ztr.position == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.position->datatype = datatype;
+ ztr.position->datasize = datasize;
+ ztr.position->data = (uint8_t *)data;
+ break;
+ case CLIP:
+ ztr.clip = malloc(sizeof(ztr.clip));
+ if (ztr.clip == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.clip->left = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3];
+ ztr.clip->right = (((((data[4] << 8) | data[5]) << 8) | data[6]) << 8) | data[7];
+ break;
+ case CNF1:
+ ztr.quality1 = malloc(sizeof(*ztr.quality1));
+ if (ztr.quality1 == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.quality1->datatype = datatype;
+ ztr.quality1->datasize = datasize;
+ if ((ztr.quality1->scale = (char *)meta_getValueForNameAndRemove(meta, count, "SCALE")) == NULL)
+ ztr.quality1->scale = "PH";
+ ztr.quality1->data = (uint8_t *)data;
+ break;
+ case CNF4:
+ metadata = meta_getValueForNameAndRemove(meta, count, "SCALE");
+ ztr.quality4 = malloc(sizeof(*ztr.quality4));
+ if (ztr.quality4 == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.quality4->datatype = datatype;
+ ztr.quality4->datasize = datasize;
+ if ((ztr.quality4->scale = (char *)meta_getValueForNameAndRemove(meta, count, "SCALE")) == NULL)
+ ztr.quality4->scale = "PH";
+ ztr.quality4->data = (uint8_t *)data;
+ break;
+ case COMM:
+ ztr.comment = malloc(sizeof(*ztr.comment) + datasize);
+ if (ztr.comment == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ *chunkType = type;
+ ztr.comment->size = datasize;
+ ztr.comment->text = (char *)data;
+ break;
+ case CR32:
+ *chunkType = ignore;
+#if 0
+ if (ctx->checksum != ((((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]))
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+ PLOGERR (( klogErr, rc, "$(func) - checksum error", "func=ZTR_ProcessBlock" ));
+ return rc;
+ }
+ ctx->checksum = 0;
+#endif
+ break;
+ case HUFF:
+ *chunkType = ignore;
+ break;
+ case REGN:
+ {
+ int region_count;
+ int n;
+
+ metadata = meta_getValueForNameAndRemove(meta, count, "NAME");
+ if (metadata) {
+ const char *cp;
+
+ region_count = 1;
+ if (metadata[strlen(metadata) - 1] == ';')
+ region_count = 0;
+ for (cp = metadata; (cp = strchr(cp, ';')) != NULL; ++cp)
+ ++region_count;
+ }
+ else
+ region_count = 0;
+ ztr.region = NULL;
+ n = (size_t)(&ztr.region->region[region_count]) + (metadata ? (strlen(metadata) + 1) : 0);
+ ztr.region = malloc(n);
+ if (ztr.region == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.region->count = region_count;
+ if (region_count > 0) {
+ char *temp = (char *)&ztr.region->region[region_count];
+ int i, st;
+
+ strcpy(temp, metadata);
+ for (i = st = 0; *temp != '\0'; ++temp) {
+ switch (st) {
+ case 0:
+ if (!isspace(*temp)) {
+ ztr.region->region[i].name = temp;
+ ++st;
+ }
+ break;
+ case 1:
+ if (*temp == ':') {
+ char *cp = temp - 1;
+
+ while (isspace(*cp))
+ *cp-- = '\0';
+ *temp = '\0';
+ ++st;
+ }
+ break;
+ case 2:
+ if (!isspace(*temp)) {
+ ztr.region->region[i].type = *temp;
+ if (i == region_count - 1)
+ ztr.region->region[0].start = 0;
+ else
+ switch (datatype) {
+ case i16:
+ ztr.region->region[i + 1].start = BE2H16(((const int16_t *)data)[i]);
+ break;
+ case i32:
+ ztr.region->region[i + 1].start = BE2H32(((const int32_t *)data)[i]);
+ break;
+ default:
+ break;
+ }
+ ++i;
+ ++st;
+ }
+ break;
+ case 3:
+ if (*temp == ';')
+ st = 0;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case SAMP:
+ ztr.signal = malloc(sizeof(*ztr.signal));
+ if (ztr.signal == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.signal->datatype = datatype;
+ ztr.signal->datasize = datasize;
+ metadata = meta_getValueForNameAndRemove(meta, count, "OFFS");
+ ztr.signal->offset = metadata == NULL ? 0 : strtol(metadata, NULL, 0);
+ ztr.signal->channel = (char *)meta_getValueForNameAndRemove(meta, count, "TYPE");
+ ztr.signal->data = (uint8_t *)data;
+ break;
+ case SMP4:
+ ztr.signal4 = malloc(sizeof(*ztr.signal4));
+ if (ztr.signal4 == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.signal4->datatype = datatype;
+ ztr.signal4->datasize = datasize;
+ metadata = meta_getValueForNameAndRemove(meta, count, "OFFS");
+ ztr.signal->offset = metadata == NULL ? 0 : strtol(metadata, NULL, 0);
+ ztr.signal4->data = (uint8_t *)data;
+ break;
+#if ZTR_USE_TEXT_CHUNK
+ case TEXT:
+ {
+ int n;
+ const char *const end = (const char *)(data + datasize);
+ const char *cp;
+
+ for (cp = (const char *)data, n = 0; cp < end; ++n) {
+ size_t len = strendlen(cp, end);
+
+ if (len == 0)
+ break;
+ cp += len + 1;
+ len = strendlen(cp, end);
+ cp += len + 1;
+ }
+ if (n != 0) {
+ int i;
+
+ ztr.xmeta = malloc(sizeof(*ztr.xmeta) + (n - 1) * sizeof(nvp_t));
+ if (ztr.xmeta == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ *chunkType = type;
+ ztr.xmeta->count = n;
+ for (i = 0, cp = (const char *)data; i != n; ++i) {
+ size_t len = strendlen(cp, end);
+
+ if (len == 0)
+ break;
+ ztr.xmeta->data[i].name = cp;
+ cp += len + 1;
+ ztr.xmeta->data[i].value = cp;
+ len = strendlen(cp, end);
+ cp += len + 1;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ *chunkType = ignore;
+ break;
+ }
+ *dst = ztr;
+#if ZTR_USE_EXTRA_META
+ if (extraMeta != NULL && extraMetaCount != NULL) {
+ int i, j, k;
+
+ for (k = j = i = 0; i != count; ++i)
+ if (meta[i].name != NULL) {
+ k += strlen(meta[i].name) + strlen(meta[i].value) + 2;
+ ++j;
+ }
+ *extraMetaCount = 0;
+ *extraMeta = NULL;
+ if (j > 0) {
+ *extraMeta = malloc(sizeof(nvp_t) * j + k);
+ if (*extraMeta != NULL) {
+ char *temp = (char *)(*extraMeta + j);
+
+ for (j = i = 0; i != count; ++i)
+ if (meta[i].name != NULL) {
+ strcpy(temp, meta[i].name);
+ (*extraMeta)[j].name = temp;
+ temp += strlen(temp) + 1;
+ strcpy(temp, meta[i].value);
+ (*extraMeta)[j].value = temp;
+ temp += strlen(temp) + 1;
+ }
+ }
+ }
+ }
+#endif
+ if (meta != NULL)
+ free(meta);
+ return 0;
+}
+
+rc_t ABI_ZTR_CreateContext(ZTR_Context **ctx)
+{
+ assert(ctx);
+
+ if ((*ctx = malloc(sizeof(**ctx))) == NULL)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+
+ memset(*ctx, 0, sizeof(**ctx));
+ return 0;
+}
+
+rc_t ABI_ZTR_AddToBuffer(ZTR_Context *ctx, const uint8_t *data, uint32_t datasize) {
+ assert(ctx);
+ ctx->current = 0;
+ ctx->buf = data;
+ ctx->buflen = datasize;
+ return 0;
+}
+
+
+rc_t ABI_ZTR_ParseHeader(ZTR_Context *ctx) {
+ assert(ctx);
+
+ if (ctx->current + 10 > ctx->buflen)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+
+ if (memcmp(ctx->buf + ctx->current, ZTR_SIG, 8) != 0)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+
+ if ((ctx->versMajor = ((uint8_t *)(ctx->buf + ctx->current))[8]) != 1)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcBadVersion );
+
+ ctx->versMinor = ((uint8_t *)(ctx->buf + ctx->current))[9];
+ ctx->current += 10;
+ return 0;
+}
+
+rc_t ABI_ZTR_ContextRelease(ZTR_Context *self) {
+ if (self != NULL) {
+ free(self);
+ }
+ return 0;
+}
diff --git a/tools/sra-load/ztr-absolid.h b/tools/sra-load/ztr-absolid.h
new file mode 100644
index 0000000..bfb1cc6
--- /dev/null
+++ b/tools/sra-load/ztr-absolid.h
@@ -0,0 +1,124 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_ztr_absolid_
+#define _sra_load_ztr_absolid_
+
+#include <klib/defs.h>
+
+#include "ztr.h"
+
+typedef struct ztr_raw_t {
+ uint8_t type[4];
+ size_t metalength, datalength;
+ const uint8_t *meta, *data;
+} ztr_raw_t;
+
+/* allocate and initialize a ZTR parser context
+caller is responsible to free resulting pointer
+
+return 1 if context can't be allocated,
+0 for no error.
+*/
+rc_t ABI_ZTR_CreateContext(ZTR_Context **ctx);
+
+/* add some bytes to context's input buffer
+ the caller is responsible for ensuring that
+ the pointer remains valid until the bytes
+ are consumed. the caller is responsible for
+ free'ing it. the context will simply forget
+ the bytes when it has consumed them all.
+
+ returns 1 if data can't be added to the buffer chain,
+ 0 for no error.
+*/
+rc_t ABI_ZTR_AddToBuffer(ZTR_Context *ctx, const uint8_t *data, uint32_t datasize);
+
+bool ABI_ZTR_BufferIsEmpty(const ZTR_Context *ctx);
+
+/* parse a ZTR header from the input buffer
+returns 0 if no error, 1 otherwise
+*/
+rc_t ABI_ZTR_ParseHeader(ZTR_Context *ctx);
+
+/* parse a ZTR block from the input buffer
+ returns
+ 0: no error
+ 1: not valid ZTR
+ 2: out of memory
+
+ the caller is responsible for free'ing ztr_raw->meta and
+ ztr_raw->data when it is no longer needed
+*/
+rc_t ABI_ZTR_ParseBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw);
+
+/* cook a ztr_raw_t to produce a ztr_t
+ sets defaults, processes meta data, etc.
+
+ returns
+ 0: no error
+ 1: not valid ZTR
+ 2: out of memory
+
+Parameters:
+ ctx [in]: the context returned from ZTR_CreateContext
+ ztr_raw [in]: the structure filled in by ZTR_ParseBlock
+ ztr [out]: the resulting data object
+ chunkType [out]: how to interpret the data object
+ if chunkType is none or unknown, it is probably an error
+ if chunkType is ignore, then the chunk was valid and known
+ but of no interest to you, e.g. a huffman dictionary chunk
+ extraMeta [out optional]: any unprocessed name-value pairs
+ extraMetaCount [out optional]: the number of unprocessed name-value pairs
+
+ NB. ztr and its pointers refer to ztr_raw, so don't free
+ ztr_raw before you are done with ztr
+
+ ztr can be free'ed in one-fell-swoop
+ *extraMeta can be free'ed in one-fell-swoop
+*/
+#if ZTR_USE_EXTRA_META
+
+rc_t ABI_ZTR_ProcessBlock(ZTR_Context *ctx,
+ const ztr_raw_t *ztr_raw,
+ ztr_t *ztr,
+ enum ztr_chunk_type *chunkType,
+ nvp_t **extraMeta,
+ int *extraMetaCount);
+
+#else
+
+rc_t ABI_ZTR_ProcessBlock(ZTR_Context *ctx,
+ const ztr_raw_t *ztr_raw,
+ ztr_t *ztr,
+ enum ztr_chunk_type *chunkType);
+#endif
+
+/* free a context created by ZTR_CreateContext
+ do this when done processing the ZTR stream.
+*/
+rc_t ABI_ZTR_ContextRelease(ZTR_Context *ctx);
+
+#endif /* _sra_load_ztr_absolid_ */
diff --git a/tools/sra-load/ztr-huffman.c b/tools/sra-load/ztr-huffman.c
new file mode 100644
index 0000000..2587cc6
--- /dev/null
+++ b/tools/sra-load/ztr-huffman.c
@@ -0,0 +1,664 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/sort.h>
+#include <klib/rc.h>
+
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <memory.h>
+#include <byteswap.h>
+#include <endian.h>
+
+#include <assert.h>
+#include <stdio.h>
+
+#include "ztr-huffman.h"
+
+typedef uint8_t *sym_t;
+
+struct decode_table_t {
+ int sig_bits;
+ bitsz_t sym_len;
+ sym_t symbol;
+ decode_table_t *next;
+};
+
+static void assign(uint8_t *dst, const uint16_t code[32], int len) {
+ len = (len + 7) >> 3;
+
+ while (len--)
+ *dst++ = *code++;
+}
+
+static void inc(uint16_t code[32], int len) {
+ int c;
+
+ --len;
+ code[len >> 3] += 0x80 >> (len & 7);
+ len >>= 3;
+ c = code[len] >> 8;
+ while (len && c) {
+ code[len] &= 0xFF;
+ --len;
+ ++code[len];
+ c = code[len] >> 8;
+ }
+}
+
+struct index_t {
+ uint16_t i, len;
+};
+
+static int64_t idx_cmp(const void *A, const void *B, void * ignored) {
+ const struct index_t *a = A;
+ const struct index_t *b = B;
+
+ if ( a->len != b->len )
+ return (int64_t)a->len - (int64_t)b->len;
+
+ return (int64_t)a->i - (int64_t)b->i;
+}
+
+#if 0
+static void huffman_codes(uint8_t **codes, const uint8_t length[256]) {
+ struct index_t idx[256];
+ size_t total_len;
+ int i;
+ uint16_t code[32];
+ uint8_t *cp = (uint8_t *)&codes[256];
+
+ for (total_len = 0, i = 0; i != 256; ++i) {
+ total_len += ((idx[i].len = length[i]) + 7) >> 3;
+ idx[i].i = i;
+ }
+ ksort(idx, 256, sizeof(*idx), idx_cmp, NULL);
+ for (i = 0; i != 256 && idx[i].len == 0; ++i)
+ ;
+ memset(code, 0, 32);
+ for ( ; i != 256; ++i) {
+ uint16_t j = idx[i].i, n = idx[i].len;
+ codes[j] = cp;
+ assign(cp, code, n);
+ inc(code, n);
+ cp += (n + 7) >> 3;
+ }
+}
+#endif
+
+static void huffman_codes257(uint8_t **codes, const uint8_t length[257]) {
+ struct index_t idx[257];
+ size_t total_len;
+ int i;
+ uint16_t code[32];
+ uint8_t *cp = (uint8_t *)&codes[257];
+
+ for (total_len = 0, i = 0; i != 257; ++i) {
+ total_len += ((idx[i].len = length[i]) + 7) >> 3;
+ idx[i].i = i;
+ }
+ ksort(idx, 257, sizeof(*idx), idx_cmp, NULL);
+ for (i = 0; i != 257 && idx[i].len == 0; ++i)
+ ;
+ memset(code, 0, 32);
+ for ( ; i != 257; ++i) {
+ uint16_t j = idx[i].i, n = idx[i].len;
+ codes[j] = cp;
+ assign(cp, code, n);
+ inc(code, n);
+ cp += (n + 7) >> 3;
+ }
+}
+
+static void huffman_codes19(uint8_t **codes, const uint8_t length[19]) {
+ struct index_t idx[19];
+ size_t total_len;
+ int i;
+ uint16_t code[32];
+ uint8_t *cp = (uint8_t *)&codes[19];
+
+ for (total_len = 0, i = 0; i != 19; ++i) {
+ total_len += ((idx[i].len = length[i]) + 7) >> 3;
+ idx[i].i = i;
+ }
+ ksort(idx, 19, sizeof(*idx), idx_cmp, NULL);
+ for (i = 0; i != 19 && idx[i].len == 0; ++i)
+ ;
+ memset(code, 0, 32);
+ for ( ; i != 19; ++i) {
+ uint8_t j = idx[i].i, n = idx[i].len;
+ codes[j] = cp;
+ assign(cp, code, n);
+ inc(code, n);
+ cp += (n + 7) >> 3;
+ }
+}
+
+static uint16_t get_bits1(const uint8_t *data, int *bp, int bc) {
+ uint16_t val = *(uint16_t *)(data + (*bp >> 3));
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+ val = bswap_16(val);
+#endif
+ val >>= *bp & 0x07;
+ val &= (1 << bc) - 1;
+ *bp += bc;
+ return val;
+}
+
+static uint32_t get_bits4(const uint8_t *data, int *bp, int bc) {
+ uint32_t val = *(uint32_t *)(data + (*bp >> 3));
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+ val = bswap_32(val);
+#endif
+ val >>= *bp & 0x07;
+ val &= (1L << bc) - 1;
+ *bp += bc;
+ return val;
+}
+
+#if 0
+static int get_bits(const uint8_t *data, int *bp, int bc) {
+ uint32_t val = get_bits4(data, bp, bc);
+
+ fprintf(stderr, "%02X/%u\n", val, bc);
+ return val;
+}
+#else
+#define get_bits get_bits4
+#endif
+
+static rc_t build_table(
+ decode_table_t *tbl,
+ uint8_t *pcode,
+ bitsz_t len,
+ const sym_t sym,
+ bitsz_t sym_len
+) {
+ int i, code = *pcode, mask;
+ static const uint8_t rev[] =
+ "\x00\x80\x40\xc0\x20\xa0\x60\xe0\x10\x90\x50\xd0\x30\xb0\x70\xf0"
+ "\x08\x88\x48\xc8\x28\xa8\x68\xe8\x18\x98\x58\xd8\x38\xb8\x78\xf8"
+ "\x04\x84\x44\xc4\x24\xa4\x64\xe4\x14\x94\x54\xd4\x34\xb4\x74\xf4"
+ "\x0c\x8c\x4c\xcc\x2c\xac\x6c\xec\x1c\x9c\x5c\xdc\x3c\xbc\x7c\xfc"
+ "\x02\x82\x42\xc2\x22\xa2\x62\xe2\x12\x92\x52\xd2\x32\xb2\x72\xf2"
+ "\x0a\x8a\x4a\xca\x2a\xaa\x6a\xea\x1a\x9a\x5a\xda\x3a\xba\x7a\xfa"
+ "\x06\x86\x46\xc6\x26\xa6\x66\xe6\x16\x96\x56\xd6\x36\xb6\x76\xf6"
+ "\x0e\x8e\x4e\xce\x2e\xae\x6e\xee\x1e\x9e\x5e\xde\x3e\xbe\x7e\xfe"
+ "\x01\x81\x41\xc1\x21\xa1\x61\xe1\x11\x91\x51\xd1\x31\xb1\x71\xf1"
+ "\x09\x89\x49\xc9\x29\xa9\x69\xe9\x19\x99\x59\xd9\x39\xb9\x79\xf9"
+ "\x05\x85\x45\xc5\x25\xa5\x65\xe5\x15\x95\x55\xd5\x35\xb5\x75\xf5"
+ "\x0d\x8d\x4d\xcd\x2d\xad\x6d\xed\x1d\x9d\x5d\xdd\x3d\xbd\x7d\xfd"
+ "\x03\x83\x43\xc3\x23\xa3\x63\xe3\x13\x93\x53\xd3\x33\xb3\x73\xf3"
+ "\x0b\x8b\x4b\xcb\x2b\xab\x6b\xeb\x1b\x9b\x5b\xdb\x3b\xbb\x7b\xfb"
+ "\x07\x87\x47\xc7\x27\xa7\x67\xe7\x17\x97\x57\xd7\x37\xb7\x77\xf7"
+ "\x0f\x8f\x4f\xcf\x2f\xaf\x6f\xef\x1f\x9f\x5f\xdf\x3f\xbf\x7f\xff";
+
+ if (len > 8) {
+ int j = rev[code];
+
+ if (tbl[j].next == NULL)
+ tbl[j].next = calloc(256, sizeof(decode_table_t));
+ if (tbl[j].next == NULL)
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+
+ tbl[j].sig_bits = 8;
+ return build_table(tbl[j].next, pcode + 1, len - 8, sym, sym_len);
+ }
+ code &= (mask = (0xFF00 >> len) & 0xFF);
+ for (i = code; i != 256; ++i) {
+ int j = rev[i];
+
+ if ((i & mask) != code)
+ break;
+ assert(tbl[j].sig_bits == 0);
+ tbl[j].sym_len = sym ? sym_len : 1;
+ tbl[j].symbol = sym;
+ tbl[j].sig_bits = len;
+ }
+ return 0;
+}
+
+static void fixup_table(decode_table_t *dt, decode_table_t *root) {
+ int i;
+
+ for (i = 0; i != 256; ++i) {
+ if (dt[i].next)
+ fixup_table(dt[i].next, root);
+ else
+ dt[i].next = root;
+ }
+}
+
+static void free_table(decode_table_t *dt, decode_table_t *root) {
+ int i;
+
+ for (i = 0; i != 256; ++i) {
+ if (dt[i].next && dt[i].next != root)
+ free_table(dt[i].next, root);
+ }
+ free(dt);
+}
+
+
+static const uint8_t symbols[290] =
+ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+ "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
+ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
+
+static void decode_zlib_length_codes(uint8_t *length, const uint8_t *data, int *bp, size_t datasize) {
+ uint8_t length19[19];
+ int llc, dc, clc;
+ uint8_t storage19[19 * sizeof(uint8_t *) + 19 * 32];
+ uint8_t **codes19;
+ decode_table_t dt1[256];
+ static const uint8_t ndx[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
+ int i, n;
+ int bits = datasize << 3;
+
+ codes19 = (uint8_t **)storage19;
+ memset(length19, 0, sizeof(length19));
+ memset(storage19, 0, sizeof(storage19));
+
+ llc = get_bits1(data, bp, 5) + 257;
+ dc = get_bits1(data, bp, 5) + 1;
+ clc = get_bits1(data, bp, 4) + 4;
+
+ for (i = 0; i != clc; ++i)
+ length19[ndx[i]] = get_bits(data, bp, 3);
+
+ huffman_codes19(codes19, length19);
+ memset(dt1, 0, sizeof(dt1));
+ for (i = 0; i != 19; ++i) {
+ if (codes19[i] != NULL)
+ build_table(dt1, codes19[i], length19[i], (sym_t)(symbols + i), 8);
+ }
+ fixup_table(dt1, dt1);
+ i = 0;
+ while (bits > *bp) {
+ uint8_t code;
+ const decode_table_t *cp;
+ int bc = 8;
+
+ if (bits - *bp < 8)
+ bc = bits - *bp;
+ code = get_bits1(data, bp, bc);
+ cp = dt1 + code;
+ /* fprintf(stderr, "%02X/%u\n", code & ((1L << cp->sig_bits) - 1), cp->sig_bits); */
+ *bp -= bc - cp->sig_bits;
+
+ switch (cp->symbol[0]) {
+ case 16:
+ n = get_bits1(data, bp, 2) + 3;
+ memset(length + i, length[i - 1], n);
+ i += n;
+ break;
+ case 17:
+ n = get_bits1(data, bp, 3) + 3;
+ memset(length + i, 0, n);
+ i += n;
+ break;
+ case 18:
+ n = get_bits1(data, bp, 7) + 11;
+ memset(length + i, 0, n);
+ i += n;
+ break;
+ default:
+ length[i++] = cp->symbol[0];
+ break;
+ }
+ if (i >= llc)
+ break;
+ }
+ assert(i == llc);
+ i = 0;
+ while (bits > *bp) {
+ uint8_t code;
+ const decode_table_t *cp;
+ int bc = 8;
+
+ if (bits - *bp < 8)
+ bc = bits - *bp;
+ code = get_bits1(data, bp, bc);
+ cp = dt1 + code;
+ /* fprintf(stderr, "%02X/%u\n", code & ((1L << cp->sig_bits) - 1), cp->sig_bits); */
+ *bp -= bc - cp->sig_bits;
+
+ switch (cp->symbol[0]) {
+ case 16:
+ n = get_bits1(data, bp, 2) + 3;
+ i += n;
+ break;
+ case 17:
+ n = get_bits1(data, bp, 3) + 3;
+ i += n;
+ break;
+ case 18:
+ n = get_bits1(data, bp, 7) + 11;
+ i += n;
+ break;
+ default:
+ ++i;
+ break;
+ }
+ if (i >= dc)
+ break;
+ }
+ assert(i == dc);
+}
+
+rc_t handle_huffman_codes(ztr_huffman_table *y, const uint8_t *data, size_t datasize) {
+ int bc = 0;
+ int i, j;
+ uint8_t storage[257 * sizeof(uint8_t *) + 257 * 32];
+ uint8_t **codes;
+
+ codes = (uint8_t **)storage;
+
+ get_bits1(data, &bc, 1);
+
+ switch (get_bits1(data, &bc, 2)) {
+ default:
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ case 2:
+ y->tblcnt = 1;
+ break;
+ case 3:
+ y->tblcnt = get_bits(data, &bc, get_bits1(data, &bc, 4) + 1) + 1;
+ break;
+ }
+ y->tbl = calloc(y->tblcnt, sizeof(*y->tbl));
+ for (i = 0; i != y->tblcnt; ++i) {
+ uint8_t length[289];
+
+ memset(length, 0, sizeof(length));
+ memset(storage, 0, sizeof(storage));
+ decode_zlib_length_codes(length, data, &bc, datasize);
+ huffman_codes257(codes, length);
+ y->tbl[i] = calloc(257, sizeof(decode_table_t));
+ for (j = 0; j != 256; ++j) {
+ if (codes[j] != NULL)
+ build_table(y->tbl[i], codes[j], length[j], (sym_t)(symbols + j), 8);
+ }
+ if (codes[256] != NULL)
+ build_table(y->tbl[i], codes[256], length[256], (sym_t)0, 0);
+ }
+ y->bits_left = (datasize << 3) - bc;
+
+ return 0;
+}
+
+rc_t handle_special_huffman_codes(ztr_huffman_table *y, int which_one) {
+ typedef uint8_t length_array[257];
+
+ static const length_array special0 =
+ {
+ 5, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 2, 14, 2, 14, 14, 14, 3, 14, 14, 14, 14, 14, 14, 4, 14,
+ 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 6
+ };
+ static const length_array special1 =
+ {
+ 7, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 2, 8, 2, 8, 15, 15, 3, 8, 15, 15, 8, 15, 8, 4, 15,
+ 15, 15, 8, 8, 2, 15, 8, 8, 15, 8, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 11
+ };
+ static const length_array special2 =
+ {
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 6, 15, 15, 6, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 3, 11, 8, 15, 15, 15, 15, 10, 15, 15, 15, 15, 6, 9, 7, 15,
+ 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 10, 15, 15, 15, 10,
+ 15, 9, 10, 10, 15, 10, 11, 11, 10, 8, 15, 15, 15, 10, 9, 15,
+ 15, 15, 15, 10, 9, 15, 15, 10, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 4, 7, 6, 5, 3, 6, 6, 5, 4, 15, 8, 5, 6, 4, 4,
+ 6, 15, 5, 4, 4, 5, 7, 6, 10, 6, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15
+ };
+ int i, j;
+ uint8_t storage[257 * sizeof(uint8_t *) + 257 * 32];
+ uint8_t **codes;
+ const uint8_t *special;
+
+ codes = (uint8_t **)storage;
+
+ switch (which_one) {
+ case 0:
+ special = special0;
+ break;
+ case 1:
+ special = special1;
+ break;
+ case 2:
+ special = special2;
+ break;
+ default:
+ assert (which_one >= 0 && which_one < 3);
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ }
+
+ if (y->tbl)
+ return 0;
+ y->tbl = calloc(y->tblcnt, sizeof(*y->tbl));
+ y->tblcnt = 1;
+
+ for (i = 0; i != y->tblcnt; ++i) {
+ memset(storage, 0, sizeof(storage));
+ huffman_codes257(codes, special);
+ y->tbl[i] = calloc(257, sizeof(decode_table_t));
+ for (j = 0; j != 256; ++j) {
+ if (codes[j] != NULL)
+ build_table(y->tbl[i], codes[j], special[j], (sym_t)(symbols + j), 8);
+ }
+ if (codes[256] != NULL)
+ build_table(y->tbl[i], codes[256], special[256], (sym_t)0, 0);
+ }
+ y->bits_left = 0;
+
+ return 0;
+}
+
+rc_t decompress_huffman(const ztr_huffman_table *tbl, uint8_t **Data, size_t *datasize) {
+#if 0
+ const uint8_t *src = *Data;
+ size_t srclen = *datasize, dstlen = 0;
+ size_t sbits, dalloc;
+ uint8_t *dst, *Dst;
+ int bp, tblNo = 0, n = tbl->tblcnt;
+ const decode_table_t *cp = tbl->tbl[0];
+
+ bp = 8 - tbl->bits_left;
+ src += 2; srclen -= 2;
+
+ Dst = dst = malloc(dalloc = srclen << 1);
+ if (Dst != NULL) {
+ sbits = srclen << 3;
+ while (sbits) {
+ uint8_t code;
+ int bc = 8;
+
+ if (sbits < 8)
+ bc = sbits;
+ code = get_bits1(src, &bp, bc);
+ cp += code;
+
+ bp -= bc - cp->sig_bits;
+ sbits -= cp->sig_bits;
+ src += bp >> 3;
+ bp &= 7;
+
+ if (cp->symbol == NULL) {
+ if (cp->next == NULL) {
+ break;
+ }
+ }
+ else {
+ if (++dstlen == dalloc) {
+ void *temp;
+
+ temp = realloc(Dst, dalloc <<= 1);
+ if (temp == NULL)
+ goto NoMem;
+
+ Dst = temp;
+ dst = Dst + dstlen - 1;
+ }
+ tblNo = (tblNo + 1) % n;
+ *dst++ = *cp->symbol;
+ }
+ cp = cp->next;
+ if (cp == NULL)
+ cp = tbl->tbl[tblNo];
+ }
+ free((void *)*Data);
+ *Data = Dst;
+ *datasize = dstlen;
+ return 0;
+ }
+#else
+ const uint8_t *src = *Data;
+ size_t srclen = *datasize, dstlen = 0;
+ const uint8_t *endp = src + srclen;
+ size_t dalloc;
+ uint8_t *dst, *Dst;
+ int tblNo = 0, n = tbl->tblcnt;
+ const decode_table_t *cp = tbl->tbl[0];
+ uint16_t code;
+ int bits = tbl->bits_left;
+
+ src += 2; srclen -= 2;
+ code = (*src++) >> (8 - bits);
+
+ Dst = dst = malloc(dalloc = srclen << 2);
+ if (Dst != NULL) {
+ while (src != endp) {
+ if (bits < 8) {
+ code |= ((uint16_t)(*src++)) << bits;
+ bits += 8;
+ }
+ PROCESS_BITS:
+ cp += code & 0xFF;
+
+ bits -= cp->sig_bits;
+ code >>= cp->sig_bits;
+
+ if (cp->symbol == NULL) {
+ cp = cp->next;
+ if (cp)
+ continue;
+ assert(src == endp && bits < 8);
+ bits = 0;
+ break;
+ }
+ if (++dstlen == dalloc) {
+ void *temp;
+
+ temp = realloc(Dst, dalloc <<= 1);
+ if (temp == NULL)
+ goto NoMem;
+
+ Dst = temp;
+ dst = Dst + dstlen - 1;
+ }
+ *dst++ = *cp->symbol;
+ tblNo = (tblNo + 1) % n;
+ cp = tbl->tbl[tblNo];
+ }
+ if (bits)
+ goto PROCESS_BITS;
+ free((void *)*Data);
+ *Data = Dst;
+ *datasize = dstlen;
+ return 0;
+ }
+#endif
+NoMem:
+ free((void *)*Data);
+ *Data = NULL;
+ *datasize = 0;
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+}
+
+rc_t free_huffman_table(ztr_huffman_table *tbl) {
+ int i;
+
+ for (i = 0; i != tbl->tblcnt; ++i) {
+ free_table(tbl->tbl[i], tbl->tbl[i]);
+ }
+ free(tbl->tbl);
+ return 0;
+}
diff --git a/tools/sra-load/ztr-huffman.h b/tools/sra-load/ztr-huffman.h
new file mode 100644
index 0000000..3da48b4
--- /dev/null
+++ b/tools/sra-load/ztr-huffman.h
@@ -0,0 +1,45 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_ztr_huffman_
+#define _sra_load_ztr_huffman_
+
+typedef struct decode_table_t decode_table_t;
+
+typedef struct ztr_huffman_table {
+ int bits_left;
+ int tblcnt;
+ decode_table_t **tbl;
+} ztr_huffman_table;
+
+rc_t handle_huffman_codes(ztr_huffman_table *tbl, const uint8_t *data, size_t datasize);
+
+rc_t handle_special_huffman_codes(ztr_huffman_table *y, int which_one);
+
+rc_t decompress_huffman(const ztr_huffman_table *tbl, uint8_t **Data, size_t *datasize);
+
+rc_t free_huffman_table(ztr_huffman_table *);
+
+#endif /* _sra_load_ztr_huffman_ */
diff --git a/tools/sra-load/ztr-illumina.c b/tools/sra-load/ztr-illumina.c
new file mode 100644
index 0000000..6c21d56
--- /dev/null
+++ b/tools/sra-load/ztr-illumina.c
@@ -0,0 +1,1367 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <os-native.h>
+
+#include <stdlib.h>
+
+#include <string.h>
+#include <ctype.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <assert.h>
+
+#include "ztr-illumina.h"
+#include "ztr-huffman.h"
+#include "debug.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+
+#define ltoh16(X) (X)
+#define ltoh32(X) (X)
+
+#define btoh16(X) (bswap_16(X))
+#define btoh32(X) (bswap_32(X))
+
+#else
+
+#define ltoh16(X) (bswap_16(X))
+#define ltoh32(X) (bswap_32(X))
+
+#define btoh16(X) (X)
+#define btoh32(X) (X)
+
+#endif
+
+struct ZTR_Context {
+ int versMajor;
+ int versMinor;
+ uint32_t checksum;
+ ztr_huffman_table huffman_table[128], special[3];
+ size_t current, buflen[2];
+ const uint8_t *buf[2];
+};
+
+static int ztr_read(ZTR_Context *ctx, void *Dst, size_t n) {
+ char *dst = Dst;
+ size_t i, j = 0;
+
+ assert(ctx);
+ do {
+ if (n == 0 || ctx->buf[0] == NULL)
+ break;
+ i = ctx->buflen[0] - ctx->current;
+ if (i > n)
+ i = n;
+ memmove(dst + j, ctx->buf[0] + ctx->current, i);
+ ctx->current += i;
+ n -= i;
+ j += i;
+ if (ctx->current == ctx->buflen[0]) {
+ ctx->current = 0;
+ ctx->buflen[0] = ctx->buflen[1];
+ ctx->buf[0] = ctx->buf[1];
+ ctx->buflen[1] = 0;
+ ctx->buf[1] = NULL;
+ }
+ } while (1);
+
+ return j;
+}
+
+#define METANAME_COMP strcmp
+
+static size_t strendlen(const char *src, const char *end) {
+ size_t n = 0;
+
+ while (*src && src != end) {
+ ++src;
+ ++n;
+ }
+ return n;
+}
+
+static int count_pairs(const char *src, uint32_t len) {
+ int i, j;
+
+ for (j = i = 0; i != len; ++i) {
+ if (*src++ == 0)
+ ++j;
+ }
+ return (j % 2 == 0) ? (j >> 1) : 0;
+}
+
+#if 0
+static const char *meta_getValueForName(const nvp_t *meta, int count, const char *name) {
+ int i;
+
+ for (i = 0; i != count; ++i) {
+ if (meta[i].name != NULL && METANAME_COMP(meta[i].name, name) == 0)
+ return meta[i].value;
+ }
+ return NULL;
+}
+#endif
+
+static const char *meta_getValueForNameAndRemove(nvp_t *meta, int count, const char *name) {
+ int i;
+
+ for (i = 0; i != count; ++i) {
+ if (meta[i].name != NULL && METANAME_COMP(meta[i].name, name) == 0) {
+ meta[i].name = NULL;
+ return meta[i].value;
+ }
+ }
+ return NULL;
+}
+
+static void parse_meta(nvp_t *meta, int count, const char *metadata, const char *end) {
+ int i, j;
+
+ for (i = 0; i != count && metadata <= end; ++i) {
+ j = strendlen(metadata, end);
+ if (j == 0)
+ break;
+ meta[i].name = metadata;
+ metadata += j; ++metadata;
+ meta[i].value = metadata;
+ metadata += strendlen(metadata, end); ++metadata;
+ }
+}
+
+bool ILL_ZTR_BufferIsEmpty(const ZTR_Context *ctx) {
+ return (ctx->buf[0] == NULL || ctx->buflen[0] == 0) ? true : false;
+}
+
+static int isZTRchunk(const uint8_t type[4]) {
+ static const char *types[] = {
+ "BASE",
+ "BPOS",
+ "CLIP",
+ "CNF1",
+ "CNF4",
+ "COMM",
+ "CR32",
+ "HUFF",
+ "REGN",
+ "SAMP",
+ "SMP4",
+ "TEXT"
+ };
+ int i;
+
+ for (i = 0; i != sizeof(types) / sizeof(types[0]); ++i)
+ if (*(const uint32_t *)type == *(const uint32_t *)types[i])
+ return 1;
+
+ return 0;
+}
+
+static rc_t parse_block(ZTR_Context *ctx, ztr_raw_t *ztr_raw) {
+ if (ztr_read(ctx, &ztr_raw->type, 4) != 4)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+
+ if (!isZTRchunk(ztr_raw->type))
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+
+ if (ztr_read(ctx, &ztr_raw->metalength, 4) != 4)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+
+ if (ztr_raw->metalength != 0) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ ztr_raw->metalength = bswap_32(ztr_raw->metalength);
+#endif
+ ztr_raw->meta = malloc(ztr_raw->metalength);
+
+ if (ztr_raw->meta == NULL)
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+
+ if (ztr_read(ctx, ztr_raw->meta, ztr_raw->metalength) != ztr_raw->metalength)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+ }
+
+ if (ztr_read(ctx, &ztr_raw->datalength, 4) != 4)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+
+ if (ztr_raw->datalength != 0) {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ ztr_raw->datalength = bswap_32(ztr_raw->datalength);
+#endif
+ ztr_raw->data = malloc(ztr_raw->datalength+1); /*** overallocating **/
+
+ if (ztr_raw->data == NULL)
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+
+ if (ztr_read(ctx, ztr_raw->data, ztr_raw->datalength) != ztr_raw->datalength)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient);
+ }
+
+ return 0;
+}
+
+rc_t ILL_ZTR_ParseBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw)
+{
+ rc_t rc = 0;
+ uint32_t current, len[2];
+ const uint8_t *buf[2];
+
+ assert(ctx);
+ assert(ztr_raw);
+
+ memset(ztr_raw, 0, sizeof(*ztr_raw));
+
+ if (ctx->buf[0] == NULL || ctx->buflen[0] == 0 || ctx->current == ctx->buflen[0] + ctx->buflen[1])
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcEmpty );
+
+ /* save input buffer state for restoration upon error exit */
+ current = ctx->current;
+ len[0] = ctx->buflen[0];
+ len[1] = ctx->buflen[1];
+ buf[0] = ctx->buf[0];
+ buf[1] = ctx->buf[1];
+
+ rc = parse_block(ctx, ztr_raw);
+ if (rc) {
+ /* clean up and restore buffer state */
+ if (ztr_raw->data)
+ free (ztr_raw->data);
+ if (ztr_raw->meta)
+ free (ztr_raw->meta);
+
+ ctx->current = current;
+ ctx->buflen[0] = len[0];
+ ctx->buflen[1] = len[1];
+ ctx->buf[0] = buf[0];
+ ctx->buf[1] = buf[1];
+ }
+ return rc;
+}
+
+static rc_t undo_mode_4(uint8_t **Data, size_t *datasize) {
+ const uint8_t *src = *Data, *end;
+ size_t srclen = *datasize, dstlen = 0;
+ size_t dalloc;
+ uint8_t *dst, *Dst;
+ uint8_t dup = 0;
+ uint8_t esize;
+ rc_t rc = 0;
+ int st = 0;
+ int i;
+
+ esize = src[1];
+ if (esize < 1 || srclen % esize != 0) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ return rc;
+ }
+ if (esize > 2) {
+ src += esize; srclen -= esize;
+ }
+ else {
+ src += 2; srclen -= 2;
+ if (srclen == 0) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ return rc;
+ }
+ }
+ Dst = dst = malloc(dalloc = srclen << 4);
+ if (Dst == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+ return rc;
+ }
+
+ end = src + srclen;
+ while (src != end) {
+ size_t out = esize;
+
+ if (st == 2)
+ out *= (dup = *src);
+ if ((dstlen += out) >= dalloc) {
+ void *temp;
+ size_t n = dst - Dst;
+
+ while (dalloc < dstlen)
+ dalloc <<= 1;
+ temp = realloc(Dst, dalloc);
+ if (temp == NULL) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+ break;
+ }
+ Dst = temp;
+ dst = Dst + n;
+ }
+ switch (st) {
+ case 0:
+ st = 1;
+ memmove(dst, src, esize);
+ break;
+ case 1:
+ if (memcmp(dst, src, esize) == 0)
+ st = 2;
+ dst += esize;
+ memmove(dst, src, esize);
+ break;
+ case 2:
+ st = 0;
+ dst += esize;
+ for (i = 0; i != dup; ++i) {
+ memmove(dst, src - esize, esize);
+ dst += esize;
+ }
+ break;
+ }
+ src += esize;
+ }
+
+ free((void *)*Data);
+ *Data = Dst;
+ *datasize = dstlen;
+ return rc;
+}
+
+static rc_t undo_mode_79(uint8_t **Data, size_t *datasize) {
+ uint8_t scratch[4 * 1024];
+ const uint8_t *src = *Data;
+ size_t srclen = *datasize;
+ uint8_t *dst0, *dst1, *Dst;
+ rc_t rc = 0;
+ int i, j, k, n;
+
+ if (srclen == 0) {
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ return rc;
+ }
+ assert(srclen % 4 == 0);
+ assert(srclen < sizeof(scratch));
+
+ Dst = *Data;
+ Dst[0] = 0;
+ n = (srclen >> 2) - 1;
+ dst0 = scratch;
+ dst1 = dst0 + n;
+ src += 4;
+ for (k = i = j = 0; i != n; ++i, k += 3, j += 4) {
+ dst0[i + 0] = src[j + 0];
+ dst1[k + 0] = src[j + 1];
+ dst1[k + 1] = src[j + 2];
+ dst1[k + 2] = src[j + 3];
+ }
+
+ memmove(Dst + 1, scratch, n << 2);
+ *Data = Dst;
+ *datasize = (n << 2) + 1;
+ return rc;
+}
+
+#if 0
+static rc_t undo_mode_80(uint8_t **Data, size_t *datasize, const uint8_t *sequence, size_t basecount) {
+ uint16_t temp[4 * 1024];
+ uint16_t *A = temp;
+ uint16_t *C = A + basecount;
+ uint16_t *G = C + basecount;
+ uint16_t *T = G + basecount;
+ uint8_t *dst;
+ int i, n;
+ const uint16_t *u;
+
+ assert(basecount < 1024);
+ dst = *Data;
+ *dst = 0;
+ u = (const uint16_t *)(dst + 8);
+ for (n = basecount, i = 0; i != n; ++i, u += 4) {
+ switch (sequence[i]) {
+ default:
+ case 'A':
+ case 'a':
+ A[i] = btoh16(u[0]);
+ C[i] = btoh16(u[1]);
+ G[i] = btoh16(u[2]);
+ T[i] = btoh16(u[3]);
+ break;
+ case 'C':
+ case 'c':
+ C[i] = btoh16(u[0]);
+ A[i] = btoh16(u[1]);
+ G[i] = btoh16(u[2]);
+ T[i] = btoh16(u[3]);
+ break;
+ case 'G':
+ case 'g':
+ G[i] = btoh16(u[0]);
+ A[i] = btoh16(u[1]);
+ C[i] = btoh16(u[2]);
+ T[i] = btoh16(u[3]);
+ break;
+ case 'T':
+ case 't':
+ T[i] = btoh16(u[0]);
+ A[i] = btoh16(u[1]);
+ C[i] = btoh16(u[2]);
+ G[i] = btoh16(u[3]);
+ break;
+ }
+ }
+ memmove(dst + 2, temp, 8 * basecount);
+ *datasize = 2 + 8 * basecount;
+ return 0;
+}
+#else
+static rc_t undo_mode_80(uint8_t **Data, size_t *datasize, const uint8_t *sequence, size_t basecount, long offset) {
+ const uint16_t *u = (const uint16_t *)(*Data + 8);
+ int i;
+ float *Dst = malloc(sizeof(Dst[0]) * 4 * basecount);
+ float *dst = Dst;
+
+ if (dst == NULL)
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+
+ for (i = 0; i != basecount; ++i, u += 4, dst += 4) {
+ switch (sequence[i]) {
+ default:
+ case 'A':
+ case 'a':
+ dst[0] = (long)btoh16(u[0]) - offset;
+ dst[1] = (long)btoh16(u[1]) - offset;
+ dst[2] = (long)btoh16(u[2]) - offset;
+ dst[3] = (long)btoh16(u[3]) - offset;
+ break;
+ case 'C':
+ case 'c':
+ dst[1] = (long)btoh16(u[0]) - offset;
+ dst[0] = (long)btoh16(u[1]) - offset;
+ dst[2] = (long)btoh16(u[2]) - offset;
+ dst[3] = (long)btoh16(u[3]) - offset;
+ break;
+ case 'G':
+ case 'g':
+ dst[2] = (long)btoh16(u[0]) - offset;
+ dst[0] = (long)btoh16(u[1]) - offset;
+ dst[1] = (long)btoh16(u[2]) - offset;
+ dst[3] = (long)btoh16(u[3]) - offset;
+ break;
+ case 'T':
+ case 't':
+ dst[3] = (long)btoh16(u[0]) - offset;
+ dst[0] = (long)btoh16(u[1]) - offset;
+ dst[1] = (long)btoh16(u[2]) - offset;
+ dst[2] = (long)btoh16(u[3]) - offset;
+ break;
+ }
+ }
+ free(*Data);
+ *Data = (void *)Dst;
+ *datasize = sizeof(dst[0]) * 4 * basecount;
+ return 0;
+}
+#endif
+
+static void swab16(const void *Src, void *Dst, size_t len) {
+ const uint16_t *src = Src;
+ uint16_t *dst = Dst;
+ size_t n = len >> 1;
+ size_t i;
+
+ assert((len & 1) == 0);
+ for (i = 0; i != n; ++i)
+ dst[i] = bswap_16(src[i]);
+}
+
+static void swab32(const void *Src, void *Dst, size_t len) {
+ const uint32_t *src = Src;
+ uint32_t *dst = Dst;
+ size_t n = len >> 2;
+ size_t i;
+
+ assert((len & 3) == 0);
+ for (i = 0; i != n; ++i)
+ dst[i] = bswap_32(src[i]);
+}
+
+static void swab64(const void *Src, void *Dst, size_t len) {
+ const uint64_t *src = Src;
+ uint64_t *dst = Dst;
+ size_t n = len >> 3;
+ size_t i;
+
+ assert((len & 7) == 0);
+ for (i = 0; i != n; ++i)
+ dst[i] = bswap_64(src[i]);
+}
+
+static rc_t fixup_read(uint8_t *read, size_t bases) {
+ int i;
+
+ for (i = 0; i != bases; ++i)
+ switch (read[i]) {
+ case 'A':
+ case 'C':
+ case 'G':
+ case 'T':
+ case 'a':
+ case 'c':
+ case 'g':
+ case 't':
+ break;
+ default:
+ read[i] = 'N';
+ break;
+ }
+ return 0;
+}
+
+static rc_t fixup_quality4(uint8_t *qual, const uint8_t *read, size_t bases) {
+ uint8_t src[4 * 1024];
+ const uint8_t *src0 = src; /* called */
+ const uint8_t *src1 = src0 + bases; /* not called */
+ int i, j, k;
+
+ assert(bases < 1024);
+ memmove(src, qual, bases * 4);
+
+ for (k = j = i = 0; i != bases; ++i, j += 3, k += 4) {
+ switch (read[i]) {
+ default:
+ case 'A':
+ case 'a':
+ qual[k + 0] = src0[i];
+ qual[k + 1] = src1[j + 0];
+ qual[k + 2] = src1[j + 1];
+ qual[k + 3] = src1[j + 2];
+ break;
+ case 'C':
+ case 'c':
+ qual[k + 0] = src1[j + 0];
+ qual[k + 1] = src0[i];
+ qual[k + 2] = src1[j + 1];
+ qual[k + 3] = src1[j + 2];
+ break;
+ case 'G':
+ case 'g':
+ qual[k + 0] = src1[j + 0];
+ qual[k + 1] = src1[j + 1];
+ qual[k + 2] = src0[i];
+ qual[k + 3] = src1[j + 2];
+ break;
+ case 'T':
+ case 't':
+ qual[k + 0] = src1[j + 0];
+ qual[k + 1] = src1[j + 1];
+ qual[k + 2] = src1[j + 2];
+ qual[k + 3] = src0[i];
+ break;
+ }
+ }
+ return 0;
+}
+
+static rc_t fixup_trace_reorder(float *dst, const uint16_t *src, long offset, size_t bases) {
+ size_t i, j;
+ const uint16_t *A = src;
+ const uint16_t *C = A + bases;
+ const uint16_t *G = C + bases;
+ const uint16_t *T = G + bases;
+
+ for (j = i = 0; i < bases; ++i, j += 4) {
+ dst[j + 0] = ((long)A[i] - offset);
+ dst[j + 1] = ((long)C[i] - offset);
+ dst[j + 2] = ((long)G[i] - offset);
+ dst[j + 3] = ((long)T[i] - offset);
+ }
+
+ return 0;
+}
+
+static rc_t fixup_trace(float *dst, const uint16_t *src, long offset, size_t bases) {
+ size_t i;
+
+ /*
+ float x;
+ float y;
+ int t;
+
+ y = clip(x + offset, 0, 64k);
+ t = rint(y);
+ write(t & 0xFFFF)
+ */
+
+ if (offset == 0) {
+ for (i = 0; i != bases * 4; ++i)
+ dst[i] = src[i];
+ return 0;
+ }
+ for (i = 0; i != bases * 4; ++i)
+ dst[i] = ((long)src[i] - offset);
+ return 0;
+}
+
+rc_t ILL_ZTR_Decompress(ZTR_Context *ctx, enum ztr_chunk_type type, ztr_t ztr, const ztr_t base) {
+ int padded = 1;
+ size_t *datasize;
+ uint8_t **data;
+ enum ztr_data_type datatype;
+ static char zero[8];
+ rc_t rc = 0;
+
+ if (ztr.sequence == NULL)
+ return 0;
+ switch (type) {
+ case BASE:
+ data = &ztr.sequence->data;
+ datasize = &ztr.sequence->datasize;
+ datatype = ztr.sequence->datatype;
+ break;
+ case BPOS:
+ data = &ztr.position->data;
+ datasize = &ztr.position->datasize;
+ datatype = ztr.position->datatype;
+ break;
+ case CNF1:
+ data = &ztr.quality1->data;
+ datasize = &ztr.quality1->datasize;
+ datatype = ztr.quality1->datatype;
+ break;
+ case CNF4:
+ data = &ztr.quality4->data;
+ datasize = &ztr.quality4->datasize;
+ datatype = ztr.quality4->datatype;
+ break;
+ case SAMP:
+ data = &ztr.signal->data;
+ datasize = &ztr.signal->datasize;
+ datatype = ztr.signal->datatype;
+ break;
+ case SMP4:
+ data = &ztr.signal4->data;
+ datasize = &ztr.signal4->datasize;
+ datatype = ztr.signal4->datatype;
+ break;
+ default:
+ return 0;
+ }
+ assert(*datasize);
+ assert(*data);
+
+ if ((*data)[0] == 0x4D) {
+ switch ((*data)[1]) {
+ case 1:
+ rc = handle_special_huffman_codes(&ctx->special[0], 0);
+ if (rc == 0)
+ rc = decompress_huffman(&ctx->special[0], data, datasize);
+ if (rc == 0)
+ (*data)[0] = 0;
+ break;
+ case 2:
+ rc = handle_special_huffman_codes(&ctx->special[1], 1);
+ if (rc == 0)
+ rc = decompress_huffman(&ctx->special[1], data, datasize);
+ if (rc == 0)
+ (*data)[0] = 0;
+ break;
+ case 3:
+ rc = handle_special_huffman_codes(&ctx->special[2], 2);
+ if (rc == 0)
+ rc = decompress_huffman(&ctx->special[2], data, datasize);
+ if (rc == 0)
+ (*data)[0] = 0;
+ break;
+ default:
+ if ((*data)[1] < 128)
+ rc = RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ else
+ rc = decompress_huffman(&ctx->huffman_table[(*data)[1] - 128], data, datasize);
+ }
+ }
+ while (rc == 0) {
+ switch (**data) {
+ case 0:
+ switch (datatype) {
+ case i16:
+ case i16v4:
+ if (memcmp(*data, zero, 2) == 0)
+ padded = 2;
+ *datasize -= padded;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ swab16((*data) + padded, *data, *datasize);
+#else
+ memmove(*data, (*data) + padded, *datasize);
+#endif
+ break;
+ case i32:
+ case f32:
+ if (memcmp(*data, zero, 4) == 0)
+ padded = 4;
+ *datasize -= padded;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ swab32((*data) + padded, *data, *datasize);
+#else
+ memmove(*data, (*data) + padded, *datasize);
+#endif
+ break;
+ case f64:
+ if (memcmp(*data, zero, 8) == 0)
+ padded = 8;
+ *datasize -= padded;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ swab64((*data) + padded, *data, *datasize);
+#else
+ memmove(*data, (*data) + padded, *datasize);
+#endif
+ break;
+ default:
+ *datasize -= padded;
+ memmove(*data, (*data) + padded, *datasize);
+ break;
+ }
+ switch (type) {
+ case BASE:
+ rc = fixup_read(*data, *datasize);
+ break;
+ case CNF4:
+ rc = fixup_quality4(*data, base.sequence->data, base.sequence->datasize);
+ break;
+ case SMP4:
+ {
+ float *dst = malloc(sizeof(*dst) * 4 * base.sequence->datasize);
+ if (dst == NULL)
+ return RC(rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted);
+
+ if (ztr.signal4->Type != NULL && memcmp("SLXN", ztr.signal4->Type, 5) == 0)
+ rc = fixup_trace_reorder(dst, (const uint16_t *)*data, ztr.signal4->offset, base.sequence->datasize);
+ else
+ rc = fixup_trace(dst, (const uint16_t *)*data, ztr.signal4->offset, base.sequence->datasize);
+ free(*data);
+ *data = ( uint8_t* ) dst;
+ *datasize = sizeof(*dst) * 4 * base.sequence->datasize;
+ }
+ break;
+ default:
+ break;
+ }
+ return rc;
+ case 4:
+ rc = undo_mode_4(data, datasize);
+ if (rc)
+ return rc;
+ break;
+ case 79:
+ rc = undo_mode_79(data, datasize);
+ if (rc)
+ return rc;
+ break;
+ case 80:
+ if (base.sequence->data == NULL || base.sequence->datasize == 0) {
+ **(uint16_t **)data = 0;
+ memmove(*data + 2, *data + 8, *datasize - 8);
+ *datasize -= 6;
+ }
+ else {
+ rc = undo_mode_80(data, datasize, base.sequence->data, base.sequence->datasize, ztr.signal4->offset);
+ if (rc == 0)
+ ztr.signal4->datatype = f32;
+ return rc;
+ }
+ break;
+ default:
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcUnexpected );
+ PLOGERR ( klogInt, ( klogInt, rc, "$(func) - don't know how to handle format '$(format)'",
+ "func=ZTR_Decompress,format=%02X", *data ));
+ }
+ }
+ return rc;
+}
+
+#if ZTR_USE_EXTRA_META
+rc_t ILL_ZTR_ProcessBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw, ztr_t *dst, enum ztr_chunk_type *chunkType, nvp_t **extraMeta, int *extraMetaCount)
+#else
+rc_t ILL_ZTR_ProcessBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw, ztr_t *dst, enum ztr_chunk_type *chunkType)
+#endif
+{
+ rc_t rc;
+ const uint8_t *ptype;
+ size_t metasize, datasize;
+ uint8_t *data;
+ const char *metadata;
+ int count;
+ enum ztr_chunk_type type = 0;
+ enum ztr_data_type datatype = 0;
+ nvp_t *meta = NULL;
+ ztr_t ztr;
+
+ assert(ctx);
+ assert(ztr_raw);
+ assert(dst);
+ assert(chunkType);
+
+ *chunkType = none;
+ *(void **)dst = NULL;
+ *(void **)&ztr = NULL;
+
+ ptype = ztr_raw->type;
+ count = 0;
+ metasize = ztr_raw->metalength;
+ if (metasize != 0) {
+ metadata = (char *)ztr_raw->meta;
+
+ count = count_pairs(metadata, metasize);
+ if (count < 0) {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk metadata malformed pairs",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+
+ if (count == 0)
+ meta = NULL;
+ else {
+ meta = calloc(count, sizeof(*meta));
+ if (meta == NULL) {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogSys, ( klogSys, rc, "$(func) - '$(type)' chunk metadata pair",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ parse_meta(meta, count, metadata, metadata + metasize);
+ }
+ }
+
+ if (memcmp(ptype, "BASE", 4) == 0) {
+ type = BASE;
+ datatype = i8;
+ }
+ else if (memcmp(ptype, "BPOS", 4) == 0) {
+ type = BPOS;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "CLIP", 4) == 0) {
+ type = CLIP;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "CNF1", 4) == 0) {
+ type = CNF1;
+ datatype = i8;
+ }
+ else if (memcmp(ptype, "CNF4", 4) == 0) {
+ type = CNF4;
+ datatype = i8;
+ }
+ else if (memcmp(ptype, "COMM", 4) == 0) {
+ type = COMM;
+ }
+ else if (memcmp(ptype, "CR32", 4) == 0) {
+ type = CR32;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "HUFF", 4) == 0) {
+ type = HUFF;
+ }
+ else if (memcmp(ptype, "REGN", 4) == 0) {
+ type = REGN;
+ datatype = i32;
+ }
+ else if (memcmp(ptype, "SAMP", 4) == 0) {
+ type = SAMP;
+ datatype = i16;
+ }
+ else if (memcmp(ptype, "SMP4", 4) == 0) {
+ type = SMP4;
+ datatype = i16v4;
+ }
+ else if (memcmp(ptype, "TEXT", 4) == 0) {
+ type = TEXT;
+ }
+
+ metadata = meta_getValueForNameAndRemove(meta, count, "VALTYPE");
+ if (metadata != NULL) {
+ if (strcmp(metadata, "16 bit integer") == 0)
+ datatype = i16;
+ else if (strcmp(metadata, "32 bit integer") == 0)
+ datatype = i32;
+ else if (strcmp(metadata, "32 bit IEEE float") == 0)
+ datatype = f32;
+ else if (strcmp(metadata, "64 bit IEEE float") == 0)
+ datatype = f64;
+ }
+
+ datasize = ztr_raw->datalength;
+ data = ztr_raw->data;
+#if 0
+ if (datasize > 0 && *data == 0x4D) {
+ if (data[1] < 128)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ rc = decompress_huffman(&ctx->huffman_table[data[1] - 128], (const uint8_t **)&data, &datasize);
+ if (rc)
+ return rc;
+ ztr_raw->datalength = datasize;
+ ztr_raw->data = (uint8_t *)data;
+ }
+#endif
+
+ switch (type) {
+ case BASE:
+ ztr.sequence = malloc(sizeof(*ztr.sequence));
+ if (ztr.sequence == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.sequence->datatype = datatype;
+ ztr.sequence->datasize = datasize;
+ ztr.sequence->charset = (char *)meta_getValueForNameAndRemove(meta, count, "CSET");
+ ztr.sequence->data = (uint8_t *)data;
+ break;
+ case BPOS:
+ ztr.position = malloc(sizeof(*ztr.position));
+ if (ztr.position == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.position->datatype = datatype;
+ ztr.position->datasize = datasize;
+ ztr.position->data = (uint8_t *)data;
+ break;
+ case CLIP:
+ ztr.clip = malloc(sizeof(ztr.clip));
+ if (ztr.clip == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.clip->left = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3];
+ ztr.clip->right = (((((data[4] << 8) | data[5]) << 8) | data[6]) << 8) | data[7];
+ break;
+ case CNF1:
+ ztr.quality1 = malloc(sizeof(*ztr.quality1));
+ if (ztr.quality1 == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.quality1->datatype = datatype;
+ ztr.quality1->datasize = datasize;
+ if ((ztr.quality1->scale = (char *)meta_getValueForNameAndRemove(meta, count, "SCALE")) == NULL)
+ ztr.quality1->scale = "PH";
+ ztr.quality1->data = (uint8_t *)data;
+ break;
+ case CNF4:
+ ztr.quality4 = malloc(sizeof(*ztr.quality4));
+ if (ztr.quality4 == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.quality4->datatype = datatype;
+ ztr.quality4->datasize = datasize;
+ if ((ztr.quality4->scale = (char *)meta_getValueForNameAndRemove(meta, count, "SCALE")) == NULL)
+ ztr.quality4->scale = "PH";
+ ztr.quality4->data = (uint8_t *)data;
+ break;
+ case COMM:
+ ztr.comment = malloc(sizeof(*ztr.comment) + datasize);
+ if (ztr.comment == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.comment->size = datasize;
+ ztr.comment->text = (char *)data;
+ break;
+#if ZTR_USE_TEXT_CHUNK
+#else
+ case TEXT:
+#endif
+ case CR32:
+ *chunkType = ignore;
+#if 0
+ if (ctx->checksum != ((((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]))
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - checksum error", "func=ZTR_ProcessBlock" ));
+ return rc;
+ }
+ ctx->checksum = 0;
+#endif
+ break;
+ case HUFF:
+ *chunkType = ignore;
+ if (data[1] < 128)
+ return RC(rcSRA, rcFormatter, rcParsing, rcData, rcInvalid);
+ rc = handle_huffman_codes(&ctx->huffman_table[data[1] - 128], data + 2, datasize - 2);
+ if (rc)
+ return rc;
+ break;
+ case REGN:
+ {
+ int region_count;
+ int n;
+
+ metadata = meta_getValueForNameAndRemove(meta, count, "NAME");
+ if (metadata) {
+ const char *cp;
+
+ region_count = 1;
+ if (metadata[strlen(metadata) - 1] == ';')
+ region_count = 0;
+ for (cp = metadata; (cp = strchr(cp, ';')) != NULL; ++cp)
+ ++region_count;
+ }
+ else
+ region_count = 0;
+ switch (datatype) {
+ case i16:
+ if ((datasize & 1) != 0) {
+ --datasize;
+ data = ((uint8_t *)data) + 1;
+ }
+ if ((datasize >> 1) < (region_count - 1)) {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+ PLOGERR ( klogSys, ( klogSys, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ break;
+ case i32:
+ if ((datasize & 1) != 0) {
+ --datasize;
+ data = ((uint8_t *)data) + 1;
+ }
+ if ((datasize >> 2) < (region_count - 1)) {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+ PLOGERR ( klogSys, ( klogSys, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ break;
+ default:
+ break;
+ }
+ ztr.region = NULL;
+ n = (size_t)(&ztr.region->region[region_count]) + (metadata ? (strlen(metadata) + 1) : 0);
+ ztr.region = malloc(n);
+ if (ztr.region == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogSys, ( klogSys, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.region->count = region_count;
+ if (region_count > 0) {
+ char *temp = (char *)&ztr.region->region[region_count];
+ int i, st;
+
+ strcpy(temp, metadata);
+ for (i = st = 0; *temp != '\0'; ++temp) {
+ switch (st) {
+ case 0:
+ if (!isspace(*temp)) {
+ ztr.region->region[i].name = temp;
+ ++st;
+ }
+ break;
+ case 1:
+ if (*temp == ':') {
+ char *cp = temp - 1;
+
+ while (isspace(*cp))
+ *cp-- = '\0';
+ *temp = '\0';
+ ++st;
+ }
+ break;
+ case 2:
+ if (!isspace(*temp)) {
+ ztr.region->region[i].type = *temp;
+ if (i == region_count - 1)
+ ztr.region->region[0].start = 0;
+ else
+ switch (datatype) {
+ case i16:
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ ztr.region->region[i + 1].start = bswap_16(((const int16_t *)data)[i]);
+#else
+ ztr.region->region[i + 1].start = ((const int16_t *)data)[i];
+#endif
+ break;
+ case i32:
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ ztr.region->region[i + 1].start = bswap_32(((const int32_t *)data)[i]);
+#else
+ ztr.region->region[i + 1].start = ((const int32_t *)data)[i];
+#endif
+ break;
+ default:
+ break;
+ }
+ ++i;
+ ++st;
+ }
+ break;
+ case 3:
+ if (*temp == ';')
+ st = 0;
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case SAMP:
+ ztr.signal = malloc(sizeof(*ztr.signal));
+ if (ztr.signal == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.signal->datatype = datatype;
+ ztr.signal->datasize = datasize;
+ metadata = (char *)meta_getValueForNameAndRemove(meta, count, "OFFS");
+ ztr.signal->offset = metadata == NULL ? 0 : strtol(metadata, 0, 0);
+ ztr.signal->channel = (char *)meta_getValueForNameAndRemove(meta, count, "TYPE");
+ ztr.signal->data = (uint8_t *)data;
+ break;
+ case SMP4:
+ ztr.signal4 = malloc(sizeof(*ztr.signal4));
+ if (ztr.signal4 == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.signal4->datatype = datatype;
+ ztr.signal4->datasize = datasize;
+ metadata = (char *)meta_getValueForNameAndRemove(meta, count, "OFFS");
+ ztr.signal->offset = metadata == NULL ? 0 : strtol(metadata, 0, 0);
+ ztr.signal4->Type = (char *)meta_getValueForNameAndRemove(meta, count, "TYPE");
+ ztr.signal4->data = (uint8_t *)data;
+ break;
+#if ZTR_USE_TEXT_CHUNK
+ case TEXT:
+ {
+ int n;
+ const char *const end = (const char *)(data + datasize);
+ const char *cp;
+
+ for (cp = (const char *)data, n = 0; cp < end; ++n) {
+ size_t len = strendlen(cp, end);
+
+ if (len == 0)
+ break;
+ cp += len + 1;
+ len = strendlen(cp, end);
+ cp += len + 1;
+ }
+ if (n != 0) {
+ int i;
+
+ ztr.xmeta = malloc(sizeof(*ztr.xmeta) + (n - 1) * sizeof(nvp_t));
+ if (ztr.xmeta == NULL)
+ {
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - '$(type)' chunk data",
+ "func=ZTR_ProcessBlock,type=%.*s", 4, & ztr_raw->type ));
+ return rc;
+ }
+ *chunkType = type;
+ ztr.xmeta->count = n;
+ for (i = 0, cp = (const char *)data; i != n; ++i) {
+ size_t len = strendlen(cp, end);
+
+ if (len == 0)
+ break;
+ ztr.xmeta->data[i].name = cp;
+ cp += len + 1;
+ ztr.xmeta->data[i].value = cp;
+ len = strendlen(cp, end);
+ cp += len + 1;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ *chunkType = unknown;
+ DEBUG_MSG(1, ("$(func) - chunk '$(type)' unrecognized", "func=ZTR_ProcessBlock,type=%.*s\n", 4, & ztr_raw->type ));
+ break;
+ }
+
+ *dst = ztr;
+#if ZTR_USE_EXTRA_META
+ if (extraMeta != NULL && extraMetaCount != NULL) {
+ int i, j, k;
+
+ for (k = j = i = 0; i != count; ++i)
+ if (meta[i].name != NULL) {
+ k += strlen(meta[i].name) + strlen(meta[i].value) + 2;
+ ++j;
+ }
+ *extraMetaCount = 0;
+ *extraMeta = NULL;
+ if (j > 0) {
+ *extraMeta = malloc(sizeof(nvp_t) * j + k);
+ if (*extraMeta != NULL) {
+ char *temp = (char *)(*extraMeta + j);
+
+ for (j = i = 0; i != count; ++i)
+ if (meta[i].name != NULL) {
+ strcpy(temp, meta[i].name);
+ (*extraMeta)[j].name = temp;
+ temp += strlen(temp) + 1;
+ strcpy(temp, meta[i].value);
+ (*extraMeta)[j].value = temp;
+ temp += strlen(temp) + 1;
+ }
+ }
+ }
+ }
+#endif
+ if (meta != NULL)
+ free(meta);
+ return 0;
+}
+
+rc_t ILL_ZTR_CreateContext(ZTR_Context **ctx)
+{
+ rc_t rc;
+
+ assert(ctx);
+
+ *ctx = malloc(sizeof(**ctx));
+ if (*ctx)
+ {
+ memset(*ctx, 0, sizeof(**ctx));
+ return 0;
+ }
+
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func)", "func=ZTR_CreateContext" ));
+ return rc;
+}
+
+rc_t ILL_ZTR_AddToBuffer(ZTR_Context *ctx, const uint8_t *data, uint32_t datasize)
+{
+ rc_t rc;
+
+ assert(ctx);
+ if (ctx->buf[0] == NULL) {
+ ctx->current = 0;
+ ctx->buf[0] = data;
+ ctx->buflen[0] = datasize;
+ return 0;
+ }
+ if (ctx->buf[1] == NULL) {
+ ctx->buf[1] = data;
+ ctx->buflen[1] = datasize;
+ return 0;
+ }
+
+ rc = RC ( rcSRA, rcFormatter, rcParsing, rcBuffer, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func) - both buffers are in use",
+ "func=ZTR_AddToBuffer" ));
+ return rc;
+}
+
+
+rc_t ILL_ZTR_ParseHeader(ZTR_Context *ctx)
+{
+ uint8_t src[10];
+ int len;
+
+ assert(ctx);
+
+ len = ztr_read(ctx, src, 10);
+ if (len != 10)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcInsufficient );
+
+ if (memcmp(src, ZTR_SIG, 8) != 0)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcCorrupt );
+
+ if ((ctx->versMajor = src[8]) != 1)
+ return RC ( rcSRA, rcFormatter, rcParsing, rcData, rcBadVersion );
+
+ ctx->versMinor = src[9];
+
+ return 0;
+}
+
+rc_t ILL_ZTR_ContextRelease(ZTR_Context *self) {
+ int i;
+
+ if (self != NULL)
+ {
+ for (i = 0; i != 128; ++i) {
+ free_huffman_table(self->huffman_table + i);
+ }
+ free(self);
+ }
+ return 0;
+}
+
+rc_t ILL_ZTR_BufferGetRemainder(ZTR_Context *ctx, const uint8_t **data, uint32_t *datasize)
+{
+ assert(ctx);
+ assert(data);
+ assert(datasize);
+
+ *data = NULL;
+ *datasize = ctx->buflen[0] + ctx->buflen[1] - ctx->current;
+ if (*datasize != 0) {
+ void *r = malloc(*datasize);
+ if (r == NULL)
+ {
+ rc_t rc = RC ( rcSRA, rcFormatter, rcParsing, rcMemory, rcExhausted );
+ PLOGERR ( klogErr, ( klogErr, rc, "$(func)", "func=ZTR_BufferGetRemainder" ));
+ return rc;
+ }
+ ztr_read(ctx, r, *datasize);
+ *data = r;
+ }
+ return 0;
+}
diff --git a/tools/sra-load/ztr-illumina.h b/tools/sra-load/ztr-illumina.h
new file mode 100644
index 0000000..575348b
--- /dev/null
+++ b/tools/sra-load/ztr-illumina.h
@@ -0,0 +1,136 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _sra_load_ztr_illumina_
+#define _sra_load_ztr_illumina_
+
+#include <klib/defs.h>
+
+#include "ztr.h"
+
+typedef struct ztr_raw_t {
+ uint8_t type[4];
+ size_t metalength, datalength;
+ uint8_t *meta, *data;
+} ztr_raw_t;
+
+/* allocate and initialize a ZTR parser context
+ caller is responsible to free resulting pointer
+
+ return 1 if context can't be allocated,
+ 0 for no error.
+ */
+rc_t ILL_ZTR_CreateContext(ZTR_Context **ctx);
+
+/* add some bytes to context's input buffer
+ the caller is responsible for ensuring that
+ the pointer remains valid until the bytes
+ are consumed. the caller is responsible for
+ free'ing it. the context will simply forget
+ the bytes when it has consumed them all.
+
+ returns 1 if data can't be added to the buffer chain,
+ 0 for no error.
+ */
+rc_t ILL_ZTR_AddToBuffer(ZTR_Context *ctx, const uint8_t *data, uint32_t datasize);
+
+/* get a copy of any unconsumed input bytes from the context.
+ the bytes are consumed in the process. the caller is
+ responsible for free'ing the resulting pointer.
+ the resulting pointer is should be sent in to AddToBuffer
+ when more bytes are available.
+
+ returns 1 if the *data can't be allocated, 0 for no error.
+ */
+rc_t ILL_ZTR_BufferGetRemainder(ZTR_Context *ctx, const uint8_t **data, uint32_t *datasize);
+
+bool ILL_ZTR_BufferIsEmpty(const ZTR_Context *ctx);
+
+/* parse a ZTR header from the input buffer
+ returns 0 if no error, 1 otherwise
+ */
+rc_t ILL_ZTR_ParseHeader(ZTR_Context *ctx);
+
+/* parse a ZTR block from the input buffer
+ returns
+ 0: no error
+ 1: not valid ZTR
+ 2: out of memory
+
+ the caller is responsible for free'ing ztr_raw->meta and
+ ztr_raw->data when it is no longer needed
+ */
+rc_t ILL_ZTR_ParseBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw);
+
+/* cook a ztr_raw_t to produce a ztr_t
+ sets defaults, processes meta data, etc.
+
+ returns
+ 0: no error
+ 1: not valid ZTR
+ 2: out of memory
+
+ Parameters:
+ ctx [in]: the context returned from ZTR_CreateContext
+ ztr_raw [in]: the structure filled in by ZTR_ParseBlock
+ ztr [out]: the resulting data object
+ chunkType [out]: how to interpret the data object
+ if chunkType is none or unknown, it is probably an error
+ if chunkType is ignore, then the chunk was valid and known
+ but of no interest to you, e.g. a huffman dictionary chunk
+ extraMeta [out optional]: any unprocessed name-value pairs
+ extraMetaCount [out optional]: the number of unprocessed name-value pairs
+
+ NB. ztr and its pointers refer to ztr_raw, so don't free
+ ztr_raw before you are done with ztr
+
+ ztr can be free'ed in one-fell-swoop
+ *extraMeta can be free'ed in one-fell-swoop
+ */
+#if ZTR_USE_EXTRA_META
+ rc_t ILL_ZTR_ProcessBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw, ztr_t *ztr,
+ enum ztr_chunk_type *chunkType, nvp_t **extraMeta, int *extraMetaCount);
+#else
+ rc_t ILL_ZTR_ProcessBlock(ZTR_Context *ctx, ztr_raw_t *ztr_raw, ztr_t *ztr,
+ enum ztr_chunk_type *chunkType);
+#endif
+
+/* free a context created by ZTR_CreateContext
+ do this when done processing the ZTR stream.
+ */
+rc_t ILL_ZTR_ContextRelease(ZTR_Context *ctx);
+
+rc_t ILL_ZTR_Decompress(ZTR_Context *ctx, enum ztr_chunk_type type, ztr_t ztr, const ztr_t base);
+
+#define ZTR_CreateContext ILL_ZTR_CreateContext
+#define ZTR_ContextRelease ILL_ZTR_ContextRelease
+#define ZTR_AddToBuffer ILL_ZTR_AddToBuffer
+#define ZTR_BufferGetRemainder ILL_ZTR_BufferGetRemainder
+#define ZTR_BufferIsEmpty ILL_ZTR_BufferIsEmpty
+#define ZTR_ParseHeader ILL_ZTR_ParseHeader
+#define ZTR_ParseBlock ILL_ZTR_ParseBlock
+#define ZTR_ProcessBlock ILL_ZTR_ProcessBlock
+
+#endif /* _sra_load_ztr_illumina_ */
diff --git a/tools/sra-load/ztr.h b/tools/sra-load/ztr.h
new file mode 100644
index 0000000..4265121
--- /dev/null
+++ b/tools/sra-load/ztr.h
@@ -0,0 +1,182 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#ifndef _sra_load_ztr_
+#define _sra_load_ztr_
+
+#define ZTR_USE_TEXT_CHUNK 0
+#define ZTR_USE_EXTRA_META 0
+
+#define ZTR_SIG "\xaeZTR\r\n\x1A\n"
+/* does buffer contain a ZTR signature?
+ */
+#define ZTR_IsSignature(X, N) ((N >= 8) && (memcmp(X, ZTR_SIG, 8) == 0) ? 1 : 0)
+
+#define METANAME_IS_CASE_SENSITIVE 1
+
+enum ztr_data_type {
+ i8,
+ i16,
+ i32,
+ f32,
+ f64,
+ vector4 = 16,
+ i8v4 = i8 | vector4,
+ i16v4 = i16 | vector4,
+ i32v4 = i32 | vector4,
+ f32v4 = f32 | vector4,
+ f64v4 = f64 | vector4
+};
+
+enum ztr_chunk_type {
+ none,
+ unknown,
+ ignore,
+ BASE,
+ BPOS,
+ CLIP,
+ CNF1,
+ CNF4,
+ REGN,
+ SAMP,
+ SMP4,
+ TEXT,
+ COMM,
+ CR32,
+ HUFF,
+
+ READ = BASE,
+ POSITION = BPOS,
+ QUALITY1 = CNF1,
+ QUALITY4 = CNF4,
+ READ_STRUCTURE = REGN,
+ SIGNAL1 = SAMP,
+ SIGNAL4 = SMP4
+};
+
+enum region_type {
+ Biological = 'B',
+ Duplicate = 'D',
+ Explicit = 'E',
+ Inverted = 'I',
+ Normal = 'N',
+ Paired = 'P',
+ Technical = 'T'
+};
+
+typedef struct region_t region_t;
+struct region_t {
+ int start;
+ enum region_type type;
+ char *name;
+};
+
+struct ztr_sequence_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+ char *charset;
+};
+
+struct ztr_position_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+};
+
+struct ztr_clip_t {
+ uint32_t left, right;
+};
+
+struct ztr_quality1_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+ char *scale;
+};
+
+struct ztr_quality4_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+ char *scale;
+};
+
+struct ztr_comment_t {
+ size_t size;
+ char *text;
+};
+
+struct ztr_region_t {
+ size_t count;
+ region_t region[1];
+};
+
+struct ztr_signal_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+ char *channel;
+ long offset;
+};
+
+struct ztr_signal4_t {
+ enum ztr_data_type datatype;
+ size_t datasize;
+ uint8_t *data;
+ char *Type;
+ long offset;
+};
+
+typedef struct nvp_t {
+ const char *name,
+ *value;
+} nvp_t;
+
+#if ZTR_USE_TEXT_CHUNK
+struct ztr_xmetadata_t {
+ size_t count;
+ nvp_t data[1];
+};
+#endif
+
+typedef union ztr_t {
+ struct ztr_sequence_t *sequence; /* chunk type 'BASE' */
+ struct ztr_position_t *position; /* chunk type 'BPOS' */
+ struct ztr_clip_t *clip; /* chunk type 'CLIP' */
+ struct ztr_quality1_t *quality1; /* chunk type 'CNF1' */
+ struct ztr_quality4_t *quality4; /* chunk type 'CNF4' */
+ struct ztr_comment_t *comment; /* chunk type 'COMM' */
+ struct ztr_region_t *region; /* chunk type 'REGN' */
+ struct ztr_signal_t *signal; /* chunk type 'SAMP' */
+ struct ztr_signal4_t *signal4; /* chunk type 'SMP4' */
+#if ZTR_USE_TEXT_CHUNK
+ struct ztr_xmetadata_t *xmeta; /* chunk type 'TEXT' */
+#endif
+} ztr_t;
+
+typedef struct ZTR_Context ZTR_Context;
+
+#endif /* _sra_load_ztr_ */
diff --git a/tools/sra-pileup/.gitignore b/tools/sra-pileup/.gitignore
new file mode 100644
index 0000000..c112998
--- /dev/null
+++ b/tools/sra-pileup/.gitignore
@@ -0,0 +1,2 @@
+*.txt
+*.sh
diff --git a/tools/sra-pileup/4na_ascii.c b/tools/sra-pileup/4na_ascii.c
new file mode 100644
index 0000000..6a1d02a
--- /dev/null
+++ b/tools/sra-pileup/4na_ascii.c
@@ -0,0 +1,95 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <os-native.h>
+#include <insdc/sra.h>
+
+/***************************************
+ N (0x4E) n (0x6E) <--> 0x0
+ A (0x41) a (0x61) <--> 0x1
+ C (0x43) c (0x63) <--> 0x2
+ M (0x4D) m (0x6D) <--> 0x3
+ G (0x47) g (0x67) <--> 0x4
+ R (0x52) r (0x72) <--> 0x5
+ S (0x53) s (0x73) <--> 0x6
+ V (0x56) v (0x76) <--> 0x7
+ T (0x54) t (0x74) <--> 0x8
+ W (0x57) w (0x77) <--> 0x9
+ Y (0x59) y (0x79) <--> 0xA
+ H (0x48) h (0x68) <--> 0xB
+ K (0x4B) k (0x6B) <--> 0xC
+ D (0x44) d (0x64) <--> 0xD
+ B (0x42) b (0x62) <--> 0xE
+ N (0x4E) n (0x6E) <--> 0xF
+***************************************/
+
+
+static char _4na_2_ascii_tab[] =
+{
+/* 0x0 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F */
+ 'N', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', 'N',
+ 'n', 'a', 'c', 'm', 'g', 'r', 's', 'v', 't', 'w', 'y', 'h', 'k', 'd', 'b', 'n'
+};
+
+
+/***************************************
+ N (0x4E) n (0x6E) <--> 0x0
+ A (0x41) a (0x61) <--> 0x0
+ C (0x43) c (0x63) <--> 0x1
+ M (0x4D) m (0x6D) <--> 0x0
+ G (0x47) g (0x67) <--> 0x2
+ R (0x52) r (0x72) <--> 0x0
+ S (0x53) s (0x73) <--> 0x0
+ V (0x56) v (0x76) <--> 0x0
+ T (0x54) t (0x74) <--> 0x3
+ W (0x57) w (0x77) <--> 0x0
+ Y (0x59) y (0x79) <--> 0x0
+ H (0x48) h (0x68) <--> 0x0
+ K (0x4B) k (0x6B) <--> 0x0
+ D (0x44) d (0x64) <--> 0x0
+ B (0x42) b (0x62) <--> 0x0
+ N (0x4E) n (0x6E) <--> 0x0
+***************************************/
+
+
+static uint32_t _4na_2_index_tab[] =
+{
+/* 0x0 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F */
+ 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+};
+
+
+/* ------------------------------------------------------------------------------------- */
+
+char _4na_to_ascii( INSDC_4na_bin c, bool reverse )
+{
+ return _4na_2_ascii_tab[ ( c & 0x0F ) | ( reverse ? 0x10 : 0 ) ];
+}
+
+uint32_t _4na_to_index( INSDC_4na_bin c )
+{
+ return _4na_2_index_tab[ ( c & 0x0F ) ];
+}
diff --git a/tools/sra-pileup/4na_ascii.h b/tools/sra-pileup/4na_ascii.h
new file mode 100644
index 0000000..8146778
--- /dev/null
+++ b/tools/sra-pileup/4na_ascii.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_4na_ascii_
+#define _h_4na_ascii_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <os-native.h>
+#include <insdc/sra.h>
+
+char _4na_to_ascii( INSDC_4na_bin c, bool reverse );
+uint32_t _4na_to_index( INSDC_4na_bin c );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_4na_ascii_ */
diff --git a/tools/sra-pileup/Makefile b/tools/sra-pileup/Makefile
new file mode 100644
index 0000000..11b7207
--- /dev/null
+++ b/tools/sra-pileup/Makefile
@@ -0,0 +1,133 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-pileup
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ sra-pileup \
+ sam-dump
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra-pileup
+#
+TOOL_SRC = \
+ dyn_string \
+ cmdline_cmn \
+ out_redir \
+ perf_log \
+ reref \
+ cg_tools \
+ report_deletes \
+ ref_regions \
+ 4na_ascii \
+ ref_walker_0 \
+ ref_walker \
+ walk_debug \
+ pileup_counters \
+ pileup_index \
+ pileup_indels \
+ pileup_varcount \
+ pileup_stat \
+ pileup_v2 \
+ sra-pileup
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+TOOL_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/sra-pileup: $(TOOL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TOOL_LIB)
+
+
+#-------------------------------------------------------------------------------
+# sam-dump
+#
+SAMDUMP3_SRC = \
+ inputfiles \
+ perf_log \
+ rna_splice_log \
+ sam-dump-opts \
+ out_redir \
+ sam-hdr \
+ sam-hdr1 \
+ matecache \
+ read_fkt \
+ sam-aligned \
+ sam-unaligned \
+ md_flag \
+ cg_tools \
+ sam-dump \
+ sam-dump3
+
+SAMDUMP3_OBJ = \
+ $(addsuffix .$(OBJX),$(SAMDUMP3_SRC))
+
+SAMDUMP3_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+ifdef NCBI
+CFLAGS += -DNCBI
+endif
+
+$(BINDIR)/sam-dump: $(SAMDUMP3_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SAMDUMP3_LIB)
+
diff --git a/tools/sra-pileup/cg_tools.c b/tools/sra-pileup/cg_tools.c
new file mode 100644
index 0000000..b1ccab7
--- /dev/null
+++ b/tools/sra-pileup/cg_tools.c
@@ -0,0 +1,1723 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cg_tools.h"
+#include "debug.h"
+#include <klib/out.h>
+
+#include <klib/printf.h>
+#include <sysalloc.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+
+static void SetCigOp( CigOps * dst, char op, uint32_t oplen )
+{
+ dst->op = op;
+ dst->oplen = oplen;
+ switch( op )
+ { /*MX= DN B IS PH*/
+
+ case 'M' :
+ case 'X' :
+ case '=' : dst->ref_sign = +1;
+ dst->seq_sign = +1;
+ break;
+
+ case 'D' :
+ case 'N' : dst->ref_sign = +1;
+ dst->seq_sign = 0;
+ break;
+
+ case 'B' : dst->ref_sign = -1;
+ dst->seq_sign = 0;
+ break;
+
+ case 'S' :
+ case 'I' : dst->ref_sign = 0;
+ dst->seq_sign = +1;
+ break;
+
+ case 'P' :
+ case 'H' :
+ case 0 : dst->ref_sign= 0; /* terminating op */
+ dst->seq_sign= 0;
+ break;
+
+ default : assert( 0 );
+ break;
+ }
+}
+
+
+int32_t ExplodeCIGAR( CigOps dst[], uint32_t len, char const cigar[], uint32_t ciglen )
+{
+ uint32_t i;
+ uint32_t j;
+ int32_t opLen;
+
+ for ( i = j = opLen = 0; i < ciglen; ++i )
+ {
+ if ( isdigit( cigar[ i ] ) )
+ {
+ opLen = opLen * 10 + cigar[ i ] - '0';
+ }
+ else
+ {
+ assert( isalpha( cigar[ i ] ) );
+ SetCigOp( dst + j, cigar[ i ], opLen );
+ opLen = 0;
+ j++;
+ }
+ }
+ SetCigOp( dst + j, 0, 0 );
+ j++;
+ return j;
+}
+
+
+typedef struct cgOp_s
+{
+ uint16_t length;
+ uint8_t type; /* 0: match, 1: insert, 2: delete */
+ char code;
+} cgOp;
+
+
+static void print_CG_cigar( int line, cgOp const op[], unsigned const ops, unsigned const gap[ 3 ] )
+{
+#if _DEBUGGING
+ unsigned i;
+
+ SAM_DUMP_DBG( 3, ( "%5i: ", line ) );
+ for ( i = 0; i < ops; ++i )
+ {
+ if ( gap && ( i == gap[ 0 ] || i == gap[ 1 ] || i == gap[ 2 ] ) )
+ {
+ SAM_DUMP_DBG( 3, ( "%u%c", op[ i ].length, tolower( op[ i ].code ) ) );
+ }
+ else
+ {
+ SAM_DUMP_DBG( 3, ( "%u%c", op[ i ].length, toupper( op[ i ].code ) ) );
+ }
+ }
+ SAM_DUMP_DBG( 3, ( "\n" ) );
+#endif
+}
+
+
+/* gap contains the indices of the wobbles in op
+ * gap[0] is between read 1 and 2; it is the 'B'
+ * gap[1] is between read 2 and 3; it is an 'N'
+ * gap[2] is between read 3 and 4; it is an 'N'
+ */
+
+typedef struct cg_cigar_temp
+{
+ unsigned gap[ 3 ];
+ cgOp cigOp[ MAX_READ_LEN ];
+ unsigned opCnt;
+ unsigned S_adjust;
+ unsigned CG_adjust;
+ bool has_ref_offset_type;
+} cg_cigar_temp;
+
+
+static rc_t CIGAR_to_CG_Ops( const cg_cigar_input * input,
+ cg_cigar_temp * tmp )
+{
+ unsigned i;
+ unsigned ops = 0;
+ unsigned gapno;
+
+ tmp->opCnt = 0;
+ tmp->S_adjust = 0;
+ tmp->CG_adjust = 0;
+ tmp->has_ref_offset_type = false;
+ for ( i = 0; i < input->p_cigar.len; ++ops )
+ {
+ char opChar = 0;
+ int opLen = 0;
+ int n;
+
+ for ( n = 0; ( ( n + i ) < input->p_cigar.len ) && ( isdigit( input->p_cigar.ptr[ n + i ] ) ); n++ )
+ {
+ opLen = opLen * 10 + input->p_cigar.ptr[ n + i ] - '0';
+ }
+
+ if ( ( n + i ) < input->p_cigar.len )
+ {
+ opChar = input->p_cigar.ptr[ n + i ];
+ n++;
+ }
+
+ if ( ( ops + 1 ) >= MAX_READ_LEN )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+
+ i += n;
+
+ tmp->cigOp[ ops ].length = opLen;
+ tmp->cigOp[ ops ].code = opChar;
+ switch ( opChar )
+ {
+ case 'M' :
+ case '=' :
+ case 'X' : tmp->cigOp[ ops ].type = 0;
+ break;
+
+ case 'S' : tmp->S_adjust += opLen;
+ case 'I' : tmp->cigOp[ ops ].type = 1;
+ tmp->cigOp[ ops ].code = 'I';
+ break;
+ case 'N': tmp->has_ref_offset_type = true;
+ case 'D': tmp->cigOp[ ops ].type = 2;
+ break;
+
+ default : return RC( rcExe, rcData, rcReading, rcConstraint, rcViolated );
+ }
+ }
+
+ tmp->opCnt = ops;
+ tmp->gap[ 0 ] = tmp->gap[ 1 ] = tmp->gap[ 2 ] = ops;
+ print_CG_cigar( __LINE__, tmp->cigOp, ops, NULL );
+
+
+ if ( ops < 3 )
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+
+ {
+ unsigned fwd = 0; /* 5 10 10 10 */
+ unsigned rev = 0; /* 10 10 10 5 */
+ unsigned acc; /* accumulated length */
+
+ if ( ( input->seq_req_id == 1 && !input->orientation ) ||
+ ( input->seq_req_id == 2 && input->orientation ) )
+ {
+ for ( i = 0, acc = 0; i < ops && acc <= 5; ++i )
+ {
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc == 5 && tmp->cigOp[ i + 1 ].type == 1 )
+ {
+ fwd = i + 1;
+ break;
+ }
+ else if ( acc > 5 )
+ {
+ unsigned const right = acc - 5;
+ unsigned const left = tmp->cigOp[ i ].length - right;
+
+ memmove( &tmp->cigOp[ i + 2 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 2;
+ tmp->cigOp[ i ].length = left;
+ tmp->cigOp[ i + 2 ].length = right;
+
+ tmp->cigOp[ i + 1 ].type = 1;
+ tmp->cigOp[ i + 1 ].code = 'B';
+ tmp->cigOp[ i + 1 ].length = 0;
+
+ fwd = i + 1;
+ break;
+ }
+ }
+ }
+ }
+ else if ( ( input->seq_req_id == 2 && !input->orientation ) ||
+ ( input->seq_req_id == 1 && input->orientation ) )
+ {
+ for ( i = ops, acc = 0; i > 0 && acc <= 5; )
+ {
+ --i;
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc == 5 && tmp->cigOp[ i ].type == 1 )
+ {
+ rev = i;
+ break;
+ }
+ else if ( acc > 5 )
+ {
+ unsigned const left = acc - 5;
+ unsigned const right = tmp->cigOp[ i ].length - left;
+
+ memmove( &tmp->cigOp[ i + 2 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 2;
+ tmp->cigOp[ i ].length = left;
+ tmp->cigOp[ i + 2 ].length = right;
+
+ tmp->cigOp[ i + 1 ].type = 1;
+ tmp->cigOp[ i + 1 ].code = 'B';
+ tmp->cigOp[ i + 1 ].length = 0;
+
+ rev = i + 1;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* fprintf(stderr, "guessing layout\n"); */
+ for ( i = 0, acc = 0; i < ops && acc <= 5; ++i )
+ {
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc == 5 && tmp->cigOp[ i + 1 ].type == 1 )
+ {
+ fwd = i + 1;
+ }
+ }
+ }
+ for ( i = ops, acc = 0; i > 0 && acc <= 5; )
+ {
+ --i;
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc == 5 && tmp->cigOp[i].type == 1 )
+ {
+ rev = i;
+ }
+ }
+ }
+ if ( !tmp->has_ref_offset_type && (( fwd == 0 && rev == 0 ) || ( fwd != 0 && rev != 0 ) ))
+ {
+ for ( i = 0; i < ops; ++i )
+ {
+ if ( tmp->cigOp[ i ].type == 2 )
+ {
+ tmp->cigOp[ i ].code = 'N';
+ tmp->CG_adjust += tmp->cigOp[ i ].length;
+ }
+ }
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+ }
+ }
+ if ( fwd && tmp->cigOp[ fwd ].type == 1 )
+ {
+ for ( i = ops, acc = 0; i > fwd + 1; )
+ {
+ --i;
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc >= 10 )
+ {
+ if ( acc > 10 )
+ {
+ unsigned const r = 10 + tmp->cigOp[ i ].length - acc;
+ unsigned const l = tmp->cigOp[ i ].length - r;
+
+ if ( ops + 2 >= MAX_READ_LEN )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &tmp->cigOp[ i + 2 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 2;
+ tmp->cigOp[ i + 2 ].length = r;
+ tmp->cigOp[ i ].length = l;
+
+ tmp->cigOp[ i + 1 ].length = 0;
+ tmp->cigOp[ i + 1 ].type = 2;
+ tmp->cigOp[ i + 1 ].code = 'N';
+ i += 2;
+ }
+ else if ( i - 1 > fwd )
+ {
+ if ( tmp->cigOp[ i - 1 ].type == 2 )
+ tmp->cigOp[ i - 1 ].code = 'N';
+ else
+ {
+ if ( ops + 1 >= MAX_READ_LEN )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &tmp->cigOp[ i + 1 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 1;
+ tmp->cigOp[ i ].length = 0;
+ tmp->cigOp[ i ].type = 2;
+ tmp->cigOp[ i ].code = 'N';
+ i += 1;
+ }
+ }
+ acc = 0;
+ }
+ }
+ }
+ /** change I to B+M **/
+ tmp->cigOp[ fwd ].code = 'B';
+ memmove( &tmp->cigOp[ fwd + 1 ], &tmp->cigOp[ fwd ], ( ops - fwd ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 1;
+ tmp->cigOp[ fwd + 1 ].code = 'M';
+ tmp->opCnt = ops;
+ /** set the gaps now **/
+ for ( gapno = 3, i = ops; gapno > 1 && i > 0; )
+ {
+ --i;
+ if ( tmp->cigOp[ i ].code == 'N' )
+ tmp->gap[ --gapno ] = i;
+ }
+ tmp->gap[ 0 ] = fwd;
+ print_CG_cigar( __LINE__, tmp->cigOp, ops, tmp->gap );
+ return 0;
+ }
+ if ( rev && tmp->cigOp[ rev ].type == 1 )
+ {
+ for ( acc = i = 0; i < rev; ++i )
+ {
+ if ( tmp->cigOp[ i ].type != 2 )
+ {
+ acc += tmp->cigOp[ i ].length;
+ if ( acc >= 10 )
+ {
+ if ( acc > 10 )
+ {
+ unsigned const l = 10 + tmp->cigOp[ i ].length - acc;
+ unsigned const r = tmp->cigOp[ i ].length - l;
+
+ if ( ops + 2 >= MAX_READ_LEN )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &tmp->cigOp[ i + 2 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 2;
+ tmp->cigOp[ i + 2 ].length = r;
+ tmp->cigOp[ i ].length = l;
+
+ tmp->cigOp[ i + 1 ].length = 0;
+ tmp->cigOp[ i + 1 ].type = 2;
+ tmp->cigOp[ i + 1 ].code = 'N';
+ rev += 2;
+ i += 2;
+ }
+ else if ( i + 1 < rev )
+ {
+ if ( tmp->cigOp[ i + 1 ].type == 2 )
+ tmp->cigOp[ i + 1 ].code = 'N';
+ else
+ {
+ if ( ops + 1 >= MAX_READ_LEN )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &tmp->cigOp[ i + 1 ], &tmp->cigOp[ i ], ( ops - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 1;
+ tmp->cigOp[ i + 1 ].length = 0;
+ tmp->cigOp[ i + 1 ].type = 2;
+ tmp->cigOp[ i + 1 ].code = 'N';
+ rev += 1;
+ i += 1;
+ }
+ }
+ acc = 0;
+ }
+ }
+ }
+ for ( gapno = 3, i = 0; gapno > 1 && i < ops; ++i )
+ {
+ if ( tmp->cigOp[ i ].code == 'N' )
+ tmp->gap[ --gapno ] = i;
+ }
+ tmp->gap[ 0 ] = rev;
+ tmp->cigOp[ rev ].code = 'B';
+ memmove( &tmp->cigOp[ rev + 1 ], &tmp->cigOp[ rev ], ( ops - rev ) * sizeof( tmp->cigOp[ 0 ] ) );
+ ops += 1;
+ tmp->cigOp[ rev + 1 ].code = 'M';
+ tmp->opCnt = ops;
+ print_CG_cigar( __LINE__, tmp->cigOp, ops, tmp->gap );
+ return 0;
+ }
+ }
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+}
+
+
+static rc_t adjust_cigar( const cg_cigar_input * input, cg_cigar_temp * tmp, cg_cigar_output * output )
+{
+ rc_t rc = 0;
+ unsigned i, j;
+
+ print_CG_cigar( __LINE__, tmp->cigOp, tmp->opCnt, NULL );
+
+ /* remove zero length ops */
+ for ( j = i = 0; i < tmp->opCnt; )
+ {
+ if ( tmp->cigOp[ j ].length == 0 )
+ {
+ ++j;
+ --(tmp->opCnt);
+ continue;
+ }
+ tmp->cigOp[ i++ ] = tmp->cigOp[ j++ ];
+ }
+
+ print_CG_cigar( __LINE__, tmp->cigOp, tmp->opCnt, NULL );
+
+ if ( input->edit_dist_available )
+ {
+ int const adjusted = input->edit_dist + tmp->S_adjust - tmp->CG_adjust;
+ output->edit_dist = adjusted > 0 ? adjusted : 0;
+ SAM_DUMP_DBG( 4, ( "NM: before: %u, after: %u(+%u-%u)\n", input->edit_dist, output->edit_dist, tmp->S_adjust, tmp->CG_adjust ) );
+ }
+ else
+ {
+ output->edit_dist = input->edit_dist;
+ }
+
+ /* merge adjacent ops */
+ for ( i = tmp->opCnt; i > 1; )
+ {
+ --i;
+ if ( tmp->cigOp[ i - 1 ].code == tmp->cigOp[ i ].code )
+ {
+ tmp->cigOp[ i - 1 ].length += tmp->cigOp[ i ].length;
+ memmove( &tmp->cigOp[ i ], &tmp->cigOp[ i + 1 ], ( tmp->opCnt - 1 - i ) * sizeof( tmp->cigOp[ 0 ] ) );
+ --(tmp->opCnt);
+ }
+ }
+ print_CG_cigar( __LINE__, tmp->cigOp, tmp->opCnt, NULL );
+ for ( i = j = 0; i < tmp->opCnt && rc == 0; ++i )
+ {
+ size_t sz;
+ rc = string_printf( &output->cigar[ j ], sizeof( output->cigar ) - j, &sz, "%u%c", tmp->cigOp[ i ].length, tmp->cigOp[ i ].code );
+ j += sz;
+ }
+ output->cigar_len = j;
+ return rc;
+}
+
+
+rc_t make_cg_cigar( const cg_cigar_input * input, cg_cigar_output * output )
+{
+ rc_t rc;
+ cg_cigar_temp tmp;
+ memset( &tmp, 0, sizeof tmp );
+
+ rc = CIGAR_to_CG_Ops( input, &tmp );
+ if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcFormat )
+ {
+ memmove( &output->cigar[ 0 ], &input->p_cigar.ptr[ 0 ], input->p_cigar.len );
+ output->cigar_len = input->p_cigar.len;
+ output->cigar[ output->cigar_len ] = 0;
+ output->edit_dist = input->edit_dist;
+ output->p_cigar.ptr = output->cigar;
+ output->p_cigar.len = output->cigar_len;
+ rc = 0;
+ }
+ else if ( rc == 0 )
+ {
+ if ( tmp.CG_adjust == 0 && !tmp.has_ref_offset_type)
+ {
+ if ( tmp.gap[ 0 ] < tmp.opCnt )
+ tmp.CG_adjust = tmp.cigOp[ tmp.gap[ 0 ] ].length;
+
+ if ( tmp.gap[ 1 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 1 ] ].length;
+
+ if ( tmp.gap[ 2 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 2 ] ].length;
+ }
+
+ rc = adjust_cigar( input, &tmp, output );
+ }
+ return rc;
+}
+
+
+static char merge_M_type_ops( char a, char b )
+{ /*MX=*/
+ char c = 0;
+ switch( b )
+ {
+ case 'X' : switch( a )
+ {
+ case '=' : c = 'X'; break;
+ case 'X' : c = 'M'; break; /**we don't know - 2X may create '=' **/
+ case 'M' : c = 'M'; break;
+ }
+ break;
+ case 'M' : c = 'M'; break;
+ case '=' : c = a; break;
+ }
+ assert( c != 0 );
+ return c;
+}
+
+
+static size_t fmt_cigar_elem( char * dst, uint32_t cig_oplen, char cig_op )
+{
+ size_t num_writ;
+ rc_t rc = string_printf ( dst, 11, &num_writ, "%d%c", cig_oplen, cig_op );
+ assert ( rc == 0 && num_writ > 1 );
+ return num_writ;
+}
+
+uint32_t CombineCIGAR( char dst[], CigOps const seqOp[], uint32_t seq_len,
+ uint32_t refPos, CigOps const refOp[], uint32_t ref_len )
+{
+ bool done = false;
+ uint32_t ciglen = 0, last_ciglen = 0, last_cig_oplen = 0;
+ int32_t si = 0, ri = 0;
+ char last_cig_op = '0'; /* never used operation, forces a mismatch in MACRO_BUILD_CIGAR */
+ CigOps seq_cop = { 0, 0, 0, 0 }, ref_cop = { 0, 0, 0, 0 };
+ int32_t seq_pos = 0; /** seq_pos is tracked roughly - with every extraction from seqOp **/
+ int32_t ref_pos = 0; /** ref_pos is tracked precisely - with every delta and consumption in cigar **/
+ int32_t delta = refPos; /*** delta in relative positions of seq and ref **/
+ /*** when delta < 0 - rewind or extend the reference ***/
+ /*** wher delta > 0 - skip reference ***/
+#define MACRO_BUILD_CIGAR(OP,OPLEN) \
+ if( last_cig_oplen > 0 && last_cig_op == OP){ \
+ last_cig_oplen += OPLEN; \
+ ciglen = last_ciglen + fmt_cigar_elem( dst + last_ciglen, last_cig_oplen,last_cig_op ); \
+ } else { \
+ last_ciglen = ciglen; \
+ last_cig_oplen = OPLEN; \
+ last_cig_op = OP; \
+ ciglen = ciglen + fmt_cigar_elem( dst + last_ciglen, last_cig_oplen, last_cig_op ); \
+ }
+ while( !done )
+ {
+ while ( delta < 0 )
+ {
+ ref_pos += delta; /** we will make it to back up this way **/
+ if( ri > 0 )
+ { /** backing up on ref if possible ***/
+ int avail_oplen = refOp[ ri - 1 ].oplen - ref_cop.oplen;
+ if ( avail_oplen > 0 )
+ {
+ if ( ( -delta ) <= avail_oplen * ref_cop.ref_sign )
+ { /*** rewind within last operation **/
+ ref_cop.oplen -= delta;
+ delta -= delta * ref_cop.ref_sign;
+ }
+ else
+ { /*** rewind the whole ***/
+ ref_cop.oplen += avail_oplen;
+ delta += avail_oplen * ref_cop.ref_sign;
+ }
+ }
+ else
+ {
+ ri--;
+ /** pick the previous as used up **/
+ ref_cop = refOp[ri-1];
+ ref_cop.oplen =0;
+ }
+ }
+ else
+ { /** extending the reference **/
+ SetCigOp( &ref_cop, '=', ref_cop.oplen - delta );
+ delta = 0;
+ }
+ ref_pos -= delta;
+ }
+ if ( ref_cop.oplen == 0 )
+ { /*** advance the reference ***/
+ ref_cop = refOp[ri++];
+ if ( ref_cop.oplen == 0 )
+ { /** extending beyond the reference **/
+ SetCigOp( &ref_cop,'=', 1000 );
+ }
+ assert( ref_cop.oplen > 0 );
+ }
+ if ( delta > 0 )
+ { /*** skip refOps ***/
+ ref_pos += delta; /** may need to back up **/
+ if ( delta >= ref_cop.oplen )
+ { /** full **/
+ delta -= ref_cop.oplen * ref_cop.ref_sign;
+ ref_cop.oplen = 0;
+ }
+ else
+ { /** partial **/
+ ref_cop.oplen -= delta;
+ delta -= delta * ref_cop.ref_sign;
+ }
+ ref_pos -= delta; /** if something left - restore ***/
+ continue;
+ }
+
+ /*** seq and ref should be synchronized here **/
+ assert( delta == 0 );
+ if ( seq_cop.oplen == 0 )
+ { /*** advance sequence ***/
+ if ( seq_pos < seq_len )
+ {
+ seq_cop = seqOp[ si++ ];
+ assert( seq_cop.oplen > 0 );
+ seq_pos += seq_cop.oplen * seq_cop.seq_sign;
+ }
+ else
+ {
+ done=true;
+ }
+ }
+
+ if( !done )
+ {
+ int seq_seq_step = seq_cop.oplen * seq_cop.seq_sign; /** sequence movement**/
+ int seq_ref_step = seq_cop.oplen * seq_cop.ref_sign; /** influence of sequence movement on intermediate reference **/
+ int ref_seq_step = ref_cop.oplen * ref_cop.seq_sign; /** movement of the intermediate reference ***/
+ int ref_ref_step = ref_cop.oplen * ref_cop.ref_sign; /** influence of the intermediate reference movement on final reference ***/
+ assert( ref_ref_step >= 0 ); /** no B in the reference **/
+ if ( seq_ref_step <= 0 )
+ { /** BSIPH in the sequence against anything ***/
+ MACRO_BUILD_CIGAR( seq_cop.op, seq_cop.oplen );
+ seq_cop.oplen = 0;
+ delta = seq_ref_step; /** if negative - will force rewind next cycle **/
+ }
+ else if ( ref_ref_step <= 0 )
+ { /** MX=DN against SIPH in the reference***/
+ if ( ref_seq_step == 0 )
+ { /** MX=DN against PH **/
+ MACRO_BUILD_CIGAR( ref_cop.op,ref_cop.oplen);
+ ref_cop.oplen = 0;
+ }
+ else
+ {
+ int min_len = ( seq_cop.oplen < ref_cop.oplen ) ? seq_cop.oplen : ref_cop.oplen;
+ if( seq_seq_step == 0 )
+ { /** DN agains SI **/
+ MACRO_BUILD_CIGAR( 'P', min_len );
+ }
+ else
+ { /** MX= agains SI ***/
+ MACRO_BUILD_CIGAR( ref_cop.op,min_len );
+ }
+ seq_cop.oplen -= min_len;
+ ref_cop.oplen -= min_len;
+ }
+ }
+ else
+ {
+ /*MX=DN against MX=DN*/
+ int min_len = ( seq_cop.oplen < ref_cop.oplen ) ? seq_cop.oplen : ref_cop.oplen;
+ if ( seq_seq_step == 0 )
+ { /* DN against MX=DN */
+ if ( ref_seq_step == 0 )
+ { /** padding DN against DN **/
+ MACRO_BUILD_CIGAR( 'P', min_len );
+ ref_cop.oplen -= min_len;
+ seq_cop.oplen -= min_len;
+ }
+ else
+ { /* DN against MX= **/
+ MACRO_BUILD_CIGAR( seq_cop.op, min_len );
+ seq_cop.oplen -= min_len;
+ }
+ }
+ else if ( ref_cop.seq_sign == 0 )
+ { /* MX= against DN - always wins */
+ MACRO_BUILD_CIGAR( ref_cop.op, min_len );
+ ref_cop.oplen -= min_len;
+ }
+ else
+ { /** MX= against MX= ***/
+ char curr_op = merge_M_type_ops( seq_cop.op, ref_cop.op );
+ /* or otherwise merge_M_type_ops() will be called twice by the macro! */
+ MACRO_BUILD_CIGAR( curr_op, min_len );
+ ref_cop.oplen -= min_len;
+ seq_cop.oplen -= min_len;
+ }
+ ref_pos += min_len;
+ }
+ }
+ }
+ return ciglen;
+}
+
+
+typedef struct cg_merger
+{
+ char newSeq[ MAX_READ_LEN ];
+ char newQual[ MAX_READ_LEN ];
+ char tags[ MAX_CG_CIGAR_LEN * 2 ];
+} cg_merger;
+
+
+rc_t merge_cg_cigar( const cg_cigar_input * input, cg_cigar_output * output )
+{
+ rc_t rc;
+ cg_cigar_temp tmp;
+ memset( &tmp, 0, sizeof tmp );
+
+ rc = CIGAR_to_CG_Ops( input, &tmp );
+ if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcFormat )
+ {
+ memmove( &output->cigar[ 0 ], &input->p_cigar.ptr[ 0 ], input->p_cigar.len );
+ output->cigar_len = input->p_cigar.len;
+ output->cigar[ output->cigar_len ] = 0;
+ output->edit_dist = input->edit_dist;
+ rc = 0;
+ }
+ else if ( rc == 0 )
+ {
+
+ if ( tmp.CG_adjust == 0 && !tmp.has_ref_offset_type )
+ {
+ if ( tmp.gap[ 0 ] < tmp.opCnt )
+ tmp.CG_adjust = tmp.cigOp[ tmp.gap[ 0 ] ].length;
+
+ if ( tmp.gap[ 1 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 1 ] ].length;
+
+ if ( tmp.gap[ 2 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 2 ] ].length;
+ }
+
+ rc = adjust_cigar( input, &tmp, output );
+
+ }
+ return rc;
+}
+
+
+rc_t make_cg_merge( const cg_cigar_input * input, cg_cigar_output * output )
+{
+ rc_t rc;
+ cg_cigar_temp tmp;
+ memset( &tmp, 0, sizeof tmp );
+
+ rc = CIGAR_to_CG_Ops( input, &tmp );
+ if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcFormat )
+ {
+ memmove( &output->cigar[ 0 ], &input->p_cigar.ptr[ 0 ], input->p_cigar.len );
+ output->cigar_len = input->p_cigar.len;
+ output->cigar[ output->cigar_len ] = 0;
+ output->edit_dist = input->edit_dist;
+ rc = 0;
+ }
+ else if ( rc == 0 )
+ {
+
+ if ( tmp.CG_adjust == 0 && !tmp.has_ref_offset_type )
+ {
+ if ( tmp.gap[ 0 ] < tmp.opCnt )
+ tmp.CG_adjust = tmp.cigOp[ tmp.gap[ 0 ] ].length;
+
+ if ( tmp.gap[ 1 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 1 ] ].length;
+
+ if ( tmp.gap[ 2 ] < tmp.opCnt )
+ tmp.CG_adjust += tmp.cigOp[ tmp.gap[ 2 ] ].length;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ uint32_t const B_len = tmp.cigOp[ tmp.gap[ 0 ] ].length;
+ uint32_t const B_at = tmp.gap[ 0 ] < tmp.gap[ 2 ] ? 5 : 30;
+
+ if ( 0 < B_len && B_len < 5 )
+ {
+ memmove( output->newSeq, input->p_read.ptr, MAX_READ_LEN );
+ memmove( output->newQual, input->p_quality.ptr, MAX_READ_LEN );
+
+ output->p_read.ptr = output->newSeq;
+ output->p_read.len = ( MAX_READ_LEN - B_len );
+
+ output->p_quality.ptr = output->newQual;
+ output->p_quality.len = ( MAX_READ_LEN - B_len );
+
+ output->p_tags.ptr = output->tags;
+ output->p_tags.len = 0;
+
+ /* nBnM -> nB0M */
+ tmp.cigOp[ tmp.gap[ 0 ] + 1 ].length -= B_len;
+ if ( tmp.gap[ 0 ] < tmp.gap[ 2 ] )
+ {
+ size_t written;
+ rc = string_printf( output->tags, sizeof( output->tags ), &written,
+ "GC:Z:%uS%uG%uS\tGS:Z:%.*s\tGQ:Z:%.*s",
+ 5 - B_len, B_len, 30 - B_len, 2 * B_len, &output->newSeq[ 5 - B_len ], 2 * B_len, &output->newQual[ 5 - B_len ] );
+ if ( rc == 0 )
+ output->p_tags.len = written;
+ memmove( &tmp.cigOp[ tmp.gap[ 0 ] ],
+ &tmp.cigOp[ tmp.gap[ 0 ] + 1 ],
+ ( tmp.opCnt - ( tmp.gap[ 0 ] + 1 ) ) * sizeof( tmp.cigOp[ 0 ] ) );
+ --tmp.opCnt;
+ }
+ else
+ {
+ size_t written;
+ rc = string_printf( output->tags, sizeof( output->tags ), &written,
+ "GC:Z:%uS%uG%uS\tGS:Z:%.*s\tGQ:Z:%.*s",
+ 30 - B_len, B_len, 5 - B_len, 2 * B_len, &output->newSeq[ 30 - B_len ], 2 * B_len, &output->newQual[ 30 - B_len ] );
+ if ( rc == 0 )
+ output->p_tags.len = written;
+ memmove( &tmp.cigOp[ tmp.gap[ 0 ] ],
+ &tmp.cigOp[ tmp.gap[ 0 ] + 1 ],
+ ( tmp.opCnt - ( tmp.gap[ 0 ] + 1 ) ) * sizeof( tmp.cigOp[ 0 ] ) );
+ --tmp.opCnt;
+ }
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = B_at; i < B_at + B_len; ++i )
+ {
+ uint32_t const Lq = output->newQual[ i - B_len ];
+ uint32_t const Rq = output->newQual[ i ];
+
+ if ( Lq <= Rq )
+ {
+ output->newSeq[ i - B_len ] = output->newSeq[ i ];
+ output->newQual[ i - B_len ] = Rq;
+ }
+ else
+ {
+ output->newSeq[ i ] = output->newSeq[ i - B_len ];
+ output->newQual[ i ] = Lq;
+ }
+ }
+ memmove( &output->newSeq [ B_at ], &output->newSeq [ B_at + B_len ], MAX_READ_LEN - B_at - B_len );
+ memmove( &output->newQual[ B_at ], &output->newQual[ B_at + B_len ], MAX_READ_LEN - B_at - B_len );
+ }
+ }
+ else
+ {
+ uint32_t i, len = tmp.cigOp[ tmp.gap[ 0 ] ].length;
+
+ tmp.cigOp[ tmp.gap[ 0 ] ].code = 'I';
+ for ( i = tmp.gap[ 0 ] + 1; i < tmp.opCnt && len > 0; ++i )
+ {
+ if ( tmp.cigOp[ i ].length <= len )
+ {
+ len -= tmp.cigOp[ i ].length;
+ tmp.cigOp[ i ].length = 0;
+ }
+ else
+ {
+ tmp.cigOp[ i ].length -= len;
+ len = 0;
+ }
+ }
+ tmp.CG_adjust -= tmp.cigOp[ tmp.gap[ 0 ] ].length;
+ }
+ }
+
+ if ( rc == 0 )
+ rc = adjust_cigar( input, &tmp, output );
+
+ return rc;
+}
+
+
+/* A-->0x00, C-->0x01 G-->0x02 T-->0x03 */
+
+static const uint8_t ASCII_to_2na[] = {
+/* 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F */
+ 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F */
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F */
+ 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F */
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static uint8_t compress_4_bases_to_byte( uint8_t * bases )
+{
+ uint8_t res = ASCII_to_2na[ bases[ 0 ] & 0x7F ];
+ res <<= 2;
+ res |= ASCII_to_2na[ bases[ 1 ] & 0x7F ];
+ res <<= 2;
+ res |= ASCII_to_2na[ bases[ 2 ] & 0x7F ];
+ res <<= 2;
+ res |= ASCII_to_2na[ bases[ 3 ] & 0x7F ];
+ return res;
+}
+
+
+static const uint8_t compressed_to_fwd_reverse_0[] = {
+
+ /* 0000.0000 0x00 ... AAAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.0001 0x01 ... AAAC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0000.0010 0x02 ... AAAG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.0011 0x03 ... AAAT */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.0100 0x04 ... AACA */ RNA_SPLICE_UNKNOWN,
+ /* 0000.0101 0x05 ... AACC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.0110 0x06 ... AACG */ RNA_SPLICE_UNKNOWN,
+ /* 0000.0111 0x07 ... AACT */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1000 0x08 ... AAGA */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1001 0x09 ... AAGC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.1010 0x0A ... AAGG */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1011 0x0B ... AAGT */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1100 0x0C ... AATA */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1101 0x0D ... AATC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0000.1110 0x0E ... AATG */ RNA_SPLICE_UNKNOWN,
+ /* 0000.1111 0x0F ... AATT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0001.0000 0x10 ... ACAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.0001 0x11 ... ACAC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0001.0010 0x12 ... ACAG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.0011 0x13 ... ACAT */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.0100 0x14 ... ACCA */ RNA_SPLICE_UNKNOWN,
+ /* 0001.0101 0x15 ... ACCC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.0110 0x16 ... ACCG */ RNA_SPLICE_UNKNOWN,
+ /* 0001.0111 0x17 ... ACCT */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1000 0x18 ... ACGA */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1001 0x19 ... ACGC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.1010 0x1A ... ACGG */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1011 0x1B ... ACGT */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1100 0x1C ... ACTA */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1101 0x1D ... ACTC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0001.1110 0x1E ... ACTG */ RNA_SPLICE_UNKNOWN,
+ /* 0001.1111 0x1F ... ACTT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0010.0000 0x20 ... AGAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.0001 0x21 ... AGAC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0010.0010 0x22 ... AGAG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.0011 0x23 ... AGAT */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.0100 0x24 ... AGCA */ RNA_SPLICE_UNKNOWN,
+ /* 0010.0101 0x25 ... AGCC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.0110 0x26 ... AGCG */ RNA_SPLICE_UNKNOWN,
+ /* 0010.0111 0x27 ... AGCT */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1000 0x28 ... AGGA */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1001 0x29 ... AGGC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.1010 0x2A ... AGGG */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1011 0x2B ... AGGT */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1100 0x2C ... AGTA */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1101 0x2D ... AGTC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0010.1110 0x2E ... AGTG */ RNA_SPLICE_UNKNOWN,
+ /* 0010.1111 0x2F ... AGTT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0011.0000 0x30 ... ATAA */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.0001 0x31 ... ATAC */ RNA_SPLICE_FWD, /* MINOR forward */
+ /* 0011.0010 0x32 ... ATAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.0011 0x33 ... ATAT */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.0100 0x34 ... ATCA */ RNA_SPLICE_UNKNOWN,
+ /* 0011.0101 0x35 ... ATCC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.0110 0x36 ... ATCG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0011.0111 0x37 ... ATCT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0011.1000 0x38 ... ATGA */ RNA_SPLICE_UNKNOWN,
+ /* 0011.1001 0x39 ... ATGC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.1010 0x3A ... ATGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0011.1011 0x3B ... ATGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0011.1100 0x3C ... ATTA */ RNA_SPLICE_UNKNOWN,
+ /* 0011.1101 0x3D ... ATTC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0011.1110 0x3E ... ATTG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0011.1111 0x3F ... ATTT */ ( RNA_SPLICE_REV | 0x20 ),
+
+ /* 0100.0000 0x40 ... CAAA */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.0001 0x41 ... CAAC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0100.0010 0x42 ... CAAG */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.0011 0x43 ... CAAT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.0100 0x44 ... CACA */ RNA_SPLICE_UNKNOWN,
+ /* 0100.0101 0x45 ... CACC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.0110 0x46 ... CACG */ RNA_SPLICE_UNKNOWN,
+ /* 0100.0111 0x47 ... CACT */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1000 0x48 ... CAGA */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1001 0x49 ... CAGC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.1010 0x4A ... CAGG */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1011 0x4B ... CAGT */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1100 0x4C ... CATA */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1101 0x4D ... CATC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0100.1110 0x4E ... CATG */ RNA_SPLICE_UNKNOWN,
+ /* 0100.1111 0x4F ... CATT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0101.0000 0x50 ... CCAA */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.0001 0x51 ... CCAC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0101.0010 0x52 ... CCAG */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.0011 0x53 ... CCAT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.0100 0x54 ... CCCA */ RNA_SPLICE_UNKNOWN,
+ /* 0101.0101 0x55 ... CCCC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.0110 0x56 ... CCCG */ RNA_SPLICE_UNKNOWN,
+ /* 0101.0111 0x57 ... CCCT */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1000 0x58 ... CCGA */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1001 0x59 ... CCGC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.1010 0x5A ... CCGG */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1011 0x5B ... CCGT */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1100 0x5C ... CCTA */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1101 0x5D ... CCTC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0101.1110 0x5E ... CCTG */ RNA_SPLICE_UNKNOWN,
+ /* 0101.1111 0x5F ... CCTT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0110.0000 0x60 ... CGAA */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.0001 0x61 ... CGAC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0110.0010 0x62 ... CGAG */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.0011 0x63 ... CGAT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.0100 0x64 ... CGCA */ RNA_SPLICE_UNKNOWN,
+ /* 0110.0101 0x65 ... CGCC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.0110 0x66 ... CGCG */ RNA_SPLICE_UNKNOWN,
+ /* 0110.0111 0x67 ... CGCT */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1000 0x68 ... CGGA */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1001 0x69 ... CGGC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.1010 0x6A ... CGGG */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1011 0x6B ... CGGT */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1100 0x6C ... CGTA */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1101 0x6D ... CGTC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0110.1110 0x6E ... CGTG */ RNA_SPLICE_UNKNOWN,
+ /* 0110.1111 0x6F ... CGTT */ RNA_SPLICE_UNKNOWN,
+
+ /* 0111.0000 0x70 ... CTAA */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0111.0001 0x71 ... CTAC */ RNA_SPLICE_REV, /* MAJOR reverse */
+ /* 0111.0010 0x72 ... CTAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 0111.0011 0x73 ... CTAT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0111.0100 0x74 ... CTCA */ RNA_SPLICE_UNKNOWN,
+ /* 0111.0101 0x75 ... CTCC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0111.0110 0x76 ... CTCG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0111.0111 0x77 ... CTCT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0111.1000 0x78 ... CTGA */ RNA_SPLICE_UNKNOWN,
+ /* 0111.1001 0x79 ... CTGC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0111.1010 0x7A ... CTGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0111.1011 0x7B ... CTGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 0111.1100 0x7C ... CTTA */ RNA_SPLICE_UNKNOWN,
+ /* 0111.1101 0x7D ... CTTC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 0111.1110 0x7E ... CTTG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 0111.1111 0x7F ... CTTT */ ( RNA_SPLICE_REV | 0x20 ),
+
+ /* 1000.0000 0x80 ... GAAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1000.0001 0x81 ... GAAC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1000.0010 0x82 ... GAAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1000.0011 0x83 ... GAAT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1000.0100 0x84 ... GACA */ RNA_SPLICE_UNKNOWN,
+ /* 1000.0101 0x85 ... GACC */ RNA_SPLICE_UNKNOWN,
+ /* 1000.0110 0x86 ... GACG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1000.0111 0x87 ... GACT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1000.1000 0x88 ... GAGA */ RNA_SPLICE_UNKNOWN,
+ /* 1000.1001 0x89 ... GAGC */ RNA_SPLICE_UNKNOWN,
+ /* 1000.1010 0x8A ... GAGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1000.1011 0x8B ... GAGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1000.1100 0x8C ... GATA */ RNA_SPLICE_UNKNOWN,
+ /* 1000.1101 0x8D ... GATC */ RNA_SPLICE_UNKNOWN,
+ /* 1000.1110 0x8E ... GATG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1000.1111 0x8F ... GATT */ ( RNA_SPLICE_REV | 0x20 ),
+
+ /* 1001.0000 0x90 ... GCAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1001.0001 0x91 ... GCAC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1001.0010 0x92 ... GCAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1001.0011 0x93 ... GCAT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1001.0100 0x94 ... GCCA */ RNA_SPLICE_UNKNOWN,
+ /* 1001.0101 0x95 ... GCCC */ RNA_SPLICE_UNKNOWN,
+ /* 1001.0110 0x96 ... GCCG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1001.0111 0x97 ... GCCT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1001.1000 0x98 ... GCGA */ RNA_SPLICE_UNKNOWN,
+ /* 1001.1001 0x99 ... GCGC */ RNA_SPLICE_UNKNOWN,
+ /* 1001.1010 0x9A ... GCGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1001.1011 0x9B ... GCGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1001.1100 0x9C ... GCTA */ RNA_SPLICE_UNKNOWN,
+ /* 1001.1101 0x9D ... GCTC */ RNA_SPLICE_UNKNOWN,
+ /* 1001.1110 0x9E ... GCTG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1001.1111 0x9F ... GCTT */ ( RNA_SPLICE_REV | 0x20 ),
+
+ /* 1010.0000 0xA0 ... GGAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1010.0001 0xA1 ... GGAC */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1010.0010 0xA2 ... GGAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1010.0011 0xA3 ... GGAT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1010.0100 0xA4 ... GGCA */ RNA_SPLICE_UNKNOWN,
+ /* 1010.0101 0xA5 ... GGCC */ RNA_SPLICE_UNKNOWN,
+ /* 1010.0110 0xA6 ... GGCG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1010.0111 0xA7 ... GGCT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1010.1000 0xA8 ... GGGA */ RNA_SPLICE_UNKNOWN,
+ /* 1010.1001 0xA9 ... GGGC */ RNA_SPLICE_UNKNOWN,
+ /* 1010.1010 0xAA ... GGGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1010.1011 0xAB ... GGGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1010.1100 0xAC ... GGTA */ RNA_SPLICE_UNKNOWN,
+ /* 1010.1101 0xAD ... GGTC */ RNA_SPLICE_UNKNOWN,
+ /* 1010.1110 0xAE ... GGTG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1010.1111 0xAF ... GGTT */ ( RNA_SPLICE_REV | 0x20 ),
+
+ /* 1011.0000 0xB0 ... GTAA */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1011.0001 0xB1 ... GTAC */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1011.0010 0xB2 ... GTAG */ RNA_SPLICE_FWD, /* MAJOR forward */
+ /* 1011.0011 0xB3 ... GTAT */ RNA_SPLICE_REV, /* MINOR reverse */
+ /* 1011.0100 0xB4 ... GTCA */ RNA_SPLICE_UNKNOWN,
+ /* 1011.0101 0xB5 ... GTCC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1011.0110 0xB6 ... GTCG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1011.0111 0xB7 ... GTCT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1011.1000 0xB8 ... GTGA */ RNA_SPLICE_UNKNOWN,
+ /* 1011.1001 0xB9 ... GTGC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1011.1010 0xBA ... GTGG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1011.1011 0xBB ... GTGT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1011.1100 0xBC ... GTTA */ RNA_SPLICE_UNKNOWN,
+ /* 1011.1101 0xBD ... GTTC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1011.1110 0xBE ... GTTG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1011.1111 0xBF ... GTTT */ ( RNA_SPLICE_REV | 0x10 ),
+
+ /* 1100.0000 0xC0 ... TAAA */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0001 0xC1 ... TAAC */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0010 0xC2 ... TAAG */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0011 0xC3 ... TAAT */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0100 0xC4 ... TACA */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0101 0xC5 ... TACC */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0110 0xC6 ... TACG */ RNA_SPLICE_UNKNOWN,
+ /* 1100.0111 0xC7 ... TACT */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1000 0xC8 ... TAGA */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1001 0xC9 ... TAGC */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1010 0xCA ... TAGG */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1011 0xCB ... TAGT */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1100 0xCC ... TATA */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1101 0xCD ... TATC */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1110 0xCE ... TATG */ RNA_SPLICE_UNKNOWN,
+ /* 1100.1111 0xCF ... TATT */ RNA_SPLICE_UNKNOWN,
+
+ /* 1101.0000 0xE0 ... TCAA */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0001 0xE1 ... TCAC */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0010 0xE2 ... TCAG */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0011 0xE3 ... TCAT */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0100 0xE4 ... TCCA */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0101 0xE5 ... TCCC */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0110 0xE6 ... TCCG */ RNA_SPLICE_UNKNOWN,
+ /* 1101.0111 0xE7 ... TCCT */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1000 0xE8 ... TCGA */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1001 0xE9 ... TCGC */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1010 0xEA ... TCGG */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1011 0xEB ... TCGT */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1100 0xEC ... TCTA */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1101 0xED ... TCTC */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1110 0xEE ... TCTG */ RNA_SPLICE_UNKNOWN,
+ /* 1101.1111 0xEF ... TCTT */ RNA_SPLICE_UNKNOWN,
+
+ /* 1111.0000 0xF0 ... TTAA */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1111.0001 0xF1 ... TTAC */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1111.0010 0xF2 ... TTAG */ ( RNA_SPLICE_FWD | 0x10 ),
+ /* 1111.0011 0xF3 ... TTAT */ ( RNA_SPLICE_REV | 0x10 ),
+ /* 1111.0100 0xF4 ... TTCA */ RNA_SPLICE_UNKNOWN,
+ /* 1111.0101 0xF5 ... TTCC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1111.0110 0xF6 ... TTCG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1111.0111 0xF7 ... TTCT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1111.1000 0xF8 ... TTGA */ RNA_SPLICE_UNKNOWN,
+ /* 1111.1001 0xF9 ... TTGC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1111.1010 0xFA ... TTGG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1111.1011 0xFB ... TTGT */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1111.1100 0xFC ... TTTA */ RNA_SPLICE_UNKNOWN,
+ /* 1111.1101 0xFD ... TTTC */ ( RNA_SPLICE_REV | 0x20 ),
+ /* 1111.1110 0xFE ... TTTG */ ( RNA_SPLICE_FWD | 0x20 ),
+ /* 1111.1111 0xFF ... TTTT */ ( RNA_SPLICE_REV | 0x20 )
+};
+
+
+/*************************************************************
+ RNA-splice detector:
+
+ base 0 1 ....... n-2 n-1 direction
+
+ G T A G forward
+ A T A C forward
+
+ C T A C reverse
+ G T A T reverse
+
+
+ =========================================================
+
+ zero mismatches ( aka full matches ) :
+
+ ATAC ... MINOR [0x31]=RNA_SPLICE_FWD
+ CTAC ... MAJOR [0x71]=RNA_SPLICE_REV
+ GTAG ... MAJOR [0xB2]=RNA_SPLICE_FWD
+ GTAT ... MINOR [0xB3]=RNA_SPLICE_REV
+
+ =========================================================
+
+ one mismatch:
+
+ ATAC ... MINOR, forward
+
+ *
+ CTAC ( is also MAJOR reverse ... )
+ GTAC ( is alow MAJOR reverse, 1 mismatch )
+ TTAC ( is alow MAJOR reverse, 1 mismatch )
+
+ *
+ AAAC [0x01]=( RNA_SPLICE_FWD | 0x10 )
+ ACAC [0x11]=( RNA_SPLICE_FWD | 0x10 )
+ AGAC [0x21]=( RNA_SPLICE_FWD | 0x10 )
+
+ *
+ ATCC [0x35]=( RNA_SPLICE_FWD | 0x10 )
+ ATGC [0x39]=( RNA_SPLICE_FWD | 0x10 )
+ ATTC [0x3D]=( RNA_SPLICE_FWD | 0x10 )
+
+ *
+ ATAA [0x30]=( RNA_SPLICE_FWD | 0x10 )
+ ATAG ( is also MAJOR forward, 1 mismatch )
+ ATAT [0x33]=( RNA_SPLICE_FWD | 0x10 )
+
+ -----------------------------------------------------------
+ CTAC ... MAJOR, reverse
+
+ *
+ ATAC ( is also MINOR forward, full match )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ TTAC [0xF1]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ CAAC [0x41]=( RNA_SPLICE_REV | 0x10 )
+ CCAC [0x51]=( RNA_SPLICE_REV | 0x10 )
+ CGAC [0x61]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ CTCC [0x75]=( RNA_SPLICE_REV | 0x10 )
+ CTGC [0x79]=( RNA_SPLICE_REV | 0x10 )
+ CTTC [0x7D]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ CTAA [0x70]=( RNA_SPLICE_REV | 0x10 )
+ CTAG ( is also MAJOR forward, 1 mismatch )
+ CTAT [0x73]=( RNA_SPLICE_REV | 0x10 )
+
+ -----------------------------------------------------------
+ GTAG ... MAJOR, forward
+
+ *
+ ATAG [0x32]=( RNA_SPLICE_FWD | 0x10 )
+ CTAG [0x72]=( RNA_SPLICE_FWD | 0x10 )
+ TTAG [0xF2]=( RNA_SPLICE_FWD | 0x10 )
+
+ *
+ GAAG [0x82]=( RNA_SPLICE_FWD | 0x10 )
+ GCAG [0x92]=( RNA_SPLICE_FWD | 0x10 )
+ GGAG [0xA2]=( RNA_SPLICE_FWD | 0x10 )
+
+ *
+ GTCG [0xB6]=( RNA_SPLICE_FWD | 0x10 )
+ GTGG [0xBA]=( RNA_SPLICE_FWD | 0x10 )
+ GTTG [0xBE]=( RNA_SPLICE_FWD | 0x10 )
+
+ *
+ GTAA [0xB0]=( RNA_SPLICE_FWD | 0x10 )
+ GTAC [0xB1]=( RNA_SPLICE_FWD | 0x10 )
+ GTAT ( is also MINOR reverse, full match )
+
+ -----------------------------------------------------------
+ GTAT ... MINOR, reverse
+
+ *
+ ATAT ( is also MINOR forward, 1 mismatch )
+ CTAT ( is also MAJOR reverse, 1 mismatch )
+ TTAT [0xF3]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ GAAT [0x83]=( RNA_SPLICE_REV | 0x10 )
+ GCAT [0x93]=( RNA_SPLICE_REV | 0x10 )
+ GGAT [0xA3]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ GTCT [0xB7]=( RNA_SPLICE_REV | 0x10 )
+ GTGT [0xBB]=( RNA_SPLICE_REV | 0x10 )
+ GTTT [0xBF]=( RNA_SPLICE_REV | 0x10 )
+
+ *
+ GTAA ( is also MAJOR forward, 1 mismatch )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ GTAG ( is also MAJOR forward, full match )
+
+ =========================================================
+
+ two mismatches:
+
+ ATAC ... MINOR, forward
+
+ * *
+ CTAC ( is also MAJOR reverse, full match )
+ CTCC ( is also MAJOR reverse, 1 mismatch )
+ CTGC ( is also MAJOR reverse, 1 mismatch )
+ CTTC ( is also MAJOR reverse, 1 mismatch )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ GTCC ( is also MAJOR reverse, 2 mismatches )
+ GTGC ( is also MAJOR reverse, 2 mismatches )
+ GTTC ( is also MAJOR reverse, 2 mismatches )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTCC ( is also MAJOR reverse, 2 mismatches )
+ TTGC ( is also MAJOR reverse, 2 mismatches )
+ TTTC ( is also MAJOR reverse, 2 mismatches )
+
+ **
+ AAAC ( is also MAJOR forward, 1 mismatch )
+ AACC [0x05]=( RNA_SPLICE_FWD | 0x20 )
+ AAGC [0x09]=( RNA_SPLICE_FWD | 0x20 )
+ AATC [0x0D]=( RNA_SPLICE_FWD | 0x20 )
+ ACAC ( is also MINOR forward, 1 mismatch )
+ ACCC [0x15]=( RNA_SPLICE_FWD | 0x20 )
+ ACGC [0x19]=( RNA_SPLICE_FWD | 0x20 )
+ ACTC [0x1D]=( RNA_SPLICE_FWD | 0x20 )
+ AGAC ( is also MINOR forward, 1 mismatch )
+ AGCC [0x25]=( RNA_SPLICE_FWD | 0x20 )
+ AGGC [0x29]=( RNA_SPLICE_FWD | 0x20 )
+ AGTC [0x2D]=( RNA_SPLICE_FWD | 0x20 )
+
+ * *
+ CTAA ( is also MAJOR reverse, 1 mismatch )
+ CTAC ( is also MAJOR reverse, full match )
+ CTAG ( is also MAJOR forward, 1 mismatch )
+ CTAT ( is also MAJOR reverse, 1 mismatch )
+ GTAA ( is also MAJOR forward, 1 mismatch )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ GTAG ( is also MAJOR forward, full match )
+ GTAT ( is also MINOR reverse, full match )
+ TTAA ( is also MAJOR reverse, 2 mismatches )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTAG ( is also MAJOR forward, 1 mismatch )
+ TTAT ( is also MINOR reverse, 1 mismatch )
+
+ * *
+ AAAA [0x00]=( RNA_SPLICE_FWD | 0x20 )
+ AAAC ( is also MAJOR forward, 1 mismatch )
+ AAAG [0x02]=( RNA_SPLICE_FWD | 0x20 )
+ AAAT [0x03]=( RNA_SPLICE_FWD | 0x20 )
+ ACAA [0x10]=( RNA_SPLICE_FWD | 0x20 )
+ ACAC ( is also MINOR forward, 1 mismatch )
+ ACAG [0x12]=( RNA_SPLICE_FWD | 0x20 )
+ ACAT [0x13]=( RNA_SPLICE_FWD | 0x20 )
+ AGAA [0x20]=( RNA_SPLICE_FWD | 0x20 )
+ AGAC ( is also MINOR forward, 1 mismatch )
+ AGAG [0x22]=( RNA_SPLICE_FWD | 0x20 )
+ AGAT [0x23]=( RNA_SPLICE_FWD | 0x20 )
+
+ -----------------------------------------------------------
+ CTAC ... MAJOR, reverse
+
+ * *
+ ATAC ( is also MINOR forward, full match )
+ ATCC ( is also MINOR forward, 1 mismatch )
+ ATGC ( is also MINOR forward, 1 mismatch )
+ ATTC ( is also MINOR forward, 1 mismatch )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ GTCC [0xB5]=( RNA_SPLICE_REV | 0x20 )
+ GTGC [0xB9]=( RNA_SPLICE_REV | 0x20 )
+ GTTC [0xBD]=( RNA_SPLICE_REV | 0x20 )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTCC [0xF5]=( RNA_SPLICE_REV | 0x20 )
+ TTGC [0xF9]=( RNA_SPLICE_REV | 0x20 )
+ TTTC [0xFD]=( RNA_SPLICE_REV | 0x20 )
+
+ **
+ CAAC ( is also MAJOR reverse, 1 mismatch )
+ CACC [0x45]=( RNA_SPLICE_REV | 0x20 )
+ CAGC [0x49]=( RNA_SPLICE_REV | 0x20 )
+ CATC [0x4D]=( RNA_SPLICE_REV | 0x20 )
+ CCAC ( is also MAJOR reverse, 1 mismatch )
+ CCCC [0x55]=( RNA_SPLICE_REV | 0x20 )
+ CCGC [0x59]=( RNA_SPLICE_REV | 0x20 )
+ CCTC [0x5D]=( RNA_SPLICE_REV | 0x20 )
+ CGAC ( is also MAJOR reverse, 1 mismatch )
+ CGCC [0x65]=( RNA_SPLICE_REV | 0x20 )
+ CGGC [0x69]=( RNA_SPLICE_REV | 0x20 )
+ CGTC [0x6D]=( RNA_SPLICE_REV | 0x20 )
+
+ * *
+ ATAA ( is also MINOR forward, 1 mismatch )
+ ATAC ( is also MINOR forward, full match )
+ ATAG ( is also MAJOR forward, 1 mismatch )
+ ATAT ( is also MINOR forward, 1 mismatch )
+ GTAA ( is also MAJOR forward, 1 mismatch )
+ GTAC ( is also MAJOR forward, 1 mismatch )
+ GTAG ( is also MAJOR forward, full match )
+ GTAT ( is also MINOR reverse, full match )
+ TTAA ( is also MAJOR forward, 2 mismatches )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTAG ( is also MAJOR forward, 1 mismatch )
+ TTAT ( is also MINOR reverse, 1 mismatch )
+
+ * *
+ CAAA [0x40]=( RNA_SPLICE_REV | 0x20 )
+ CAAC ( is also MAJOR reverse, 1 mismatch )
+ CAAG [0x42]=( RNA_SPLICE_REV | 0x20 )
+ CAAT [0x43]=( RNA_SPLICE_REV | 0x20 )
+ CCAA [0x50]=( RNA_SPLICE_REV | 0x20 )
+ CCAC ( is also MAJOR reverse, 1 mismatch )
+ CCAG [0x52]=( RNA_SPLICE_REV | 0x20 )
+ CCAT [0x53]=( RNA_SPLICE_REV | 0x20 )
+ CGAA [0x60]=( RNA_SPLICE_REV | 0x20 )
+ CGAC ( is also MAJOR reverse, 1 mismatch )
+ CGAG [0x62]=( RNA_SPLICE_REV | 0x20 )
+ CGAT [0x63]=( RNA_SPLICE_REV | 0x20 )
+
+ -----------------------------------------------------------
+ GTAG ... MAJOR, forward
+
+ * *
+ ATAG ( is also MAJOR forward, 1 mismatch )
+ ATCG [0x36]=( RNA_SPLICE_FWD | 0x20 )
+ ATGG [0x3A]=( RNA_SPLICE_FWD | 0x20 )
+ ATTG [0x3E]=( RNA_SPLICE_FWD | 0x20 )
+ CTAG ( is also MAJOR forward, 1 mismatch )
+ CTCG [0x76]=( RNA_SPLICE_FWD | 0x20 )
+ CTGG [0x7A]=( RNA_SPLICE_FWD | 0x20 )
+ CTTG [0x7E]=( RNA_SPLICE_FWD | 0x20 )
+ TTAG ( is also MAJOR forward, 1 mismatch )
+ TTCG [0xF6]=( RNA_SPLICE_FWD | 0x20 )
+ TTGG [0xFA]=( RNA_SPLICE_FWD | 0x20 )
+ TTTG [0xFE]=( RNA_SPLICE_FWD | 0x20 )
+
+ **
+ GAAG ( is also MAJOR forward, 1 mismatch )
+ GACG [0x86]=( RNA_SPLICE_FWD | 0x20 )
+ GAGG [0x8A]=( RNA_SPLICE_FWD | 0x20 )
+ GATG [0x8E]=( RNA_SPLICE_FWD | 0x20 )
+ GCAG ( is also MAJOR forward, 1 mismatch )
+ GCCG [0x96]=( RNA_SPLICE_FWD | 0x20 )
+ GCGG [0x9A]=( RNA_SPLICE_FWD | 0x20 )
+ GCTG [0x9E]=( RNA_SPLICE_FWD | 0x20 )
+ GGAG ( is also MAJOR forward, 1 mismatch )
+ GGCG [0xA6]=( RNA_SPLICE_FWD | 0x20 )
+ GGGG [0xAA]=( RNA_SPLICE_FWD | 0x20 )
+ GGTG [0xAE]=( RNA_SPLICE_FWD | 0x20 )
+
+ * *
+ ATAA ( is also MINOR forward, 1 mismatch )
+ ATAC ( is also MINOR forward, full match )
+ ATAG ( is also MAJOR forward, 1 mismatch )
+ ATAT ( is also MINOR forward, 1 mismatch )
+ CTAA ( is also MAJOR reverse, 1 mismatch )
+ CTAC ( is also MAJOR reverse, full match )
+ CTAG ( is also MAJOR forward, 1 mismatch )
+ CTAT ( is also MAJOR reverse, 1 mismatch )
+ TTAA [0xF0]=( RNA_SPLICE_FWD | 0x20 )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTAG ( is also MAJOR forward, 1 mismatch )
+ TTAT ( is also MINOR reverse, 1 mismatch )
+
+ * *
+ GAAA [0x80]=( RNA_SPLICE_FWD | 0x20 )
+ GAAC [0x81]=( RNA_SPLICE_FWD | 0x20 )
+ GAAG ( is also MAJOR forward, 1 mismatch )
+ GAAT ( is also MINOR reverse, 1 mismatch )
+ GCAA [0x90]=( RNA_SPLICE_FWD | 0x20 )
+ GCAC [0x91]=( RNA_SPLICE_FWD | 0x20 )
+ GCAG ( is also MAJOR forward, 1 mismatch )
+ GCAT ( is also MINOR reverse, 1 mismatch )
+ GGAA [0xA0]=( RNA_SPLICE_FWD | 0x20 )
+ GGAC [0xA1]=( RNA_SPLICE_FWD | 0x20 )
+ GGAG ( is also MAJOR forward, 1 mismatch )
+ GGAT ( is also MINOR reverse, 1 mismatch )
+
+ -----------------------------------------------------------
+ GTAT ... MINOR, reverse
+
+ * *
+ ATAT ( is also MINOR forward, 1 mismatch )
+ ATCT [0x37]=( RNA_SPLICE_REV | 0x20 )
+ ATGT [0x3B]=( RNA_SPLICE_REV | 0x20 )
+ ATTT [0x3F]=( RNA_SPLICE_REV | 0x20 )
+ CTAT ( is also MAJOR reverse, 1 mismatch )
+ CTCT [0x77]=( RNA_SPLICE_REV | 0x20 )
+ CTGT [0x7B]=( RNA_SPLICE_REV | 0x20 )
+ CTTT [0x7F]=( RNA_SPLICE_REV | 0x20 )
+ TTAT ( is also MINOR reverse, 1 mismatch )
+ TTCT [0xF7]=( RNA_SPLICE_REV | 0x20 )
+ TTGT [0xFB]=( RNA_SPLICE_REV | 0x20 )
+ TTTT [0xFF]=( RNA_SPLICE_REV | 0x20 )
+
+ **
+ GAAT ( is also MINOR reverse, 1 mismatch )
+ GACT [0x87]=( RNA_SPLICE_REV | 0x20 )
+ GAGT [0x8B]=( RNA_SPLICE_REV | 0x20 )
+ GATT [0x8F]=( RNA_SPLICE_REV | 0x20 )
+ GCAT ( is also MINOR reverse, 1 mismatch )
+ GCCT [0x97]=( RNA_SPLICE_REV | 0x20 )
+ GCGT [0x9B]=( RNA_SPLICE_REV | 0x20 )
+ GCTT [0x9F]=( RNA_SPLICE_REV | 0x20 )
+ GGAT ( is also MINOR reverse, 1 mismatch )
+ GGCT [0xA7]=( RNA_SPLICE_REV | 0x20 )
+ GGGT [0xAB]=( RNA_SPLICE_REV | 0x20 )
+ GGTT [0xAF]=( RNA_SPLICE_REV | 0x20 )
+
+ * *
+ ATAA ( is also MINOR forward, 1 mismatch )
+ ATAC ( is also MINOR forward, full match )
+ ATAG ( is also MAJOR forward, 1 mismatch )
+ ATAT ( is also MINOR forward, 1 mismatch )
+ CTAA ( is also MAJOR reverse, 1 mismatch )
+ CTAC ( is also MAJOR reverse, full match )
+ CTAG ( is also MAJOR forward, 1 mismatch )
+ CTAT ( is also MAJOR reverse, 1 mismatch )
+ TTAA ( is also MAJOR forward, 2 mismatches )
+ TTAC ( is also MAJOR reverse, 1 mismatch )
+ TTAG ( is also MAJOR forward, 1 mismatch )
+ TTAT ( is also MINOR reverse, 1 mismatch )
+
+ * *
+ GAAA ( is also MAJOR forward, 2 mismatches )
+ GAAC ( is also MAJOR forward, 2 mismatches )
+ GAAG ( is also MAJOR forward, 1 mismatch )
+ GAAT ( is also MINOR reverse, 1 mismatch )
+ GCAA ( is also MAJOR forward, 2 mismatches )
+ GCAC ( is also MAJOR forward, 2 mismatches )
+ GCAG ( is also MAJOR forward, 1 mismatch )
+ GCAT ( is also MINOR reverse, 1 mismatch )
+ GGAA ( is also MAJOR forward, 2 mismatches )
+ GGAC ( is also MAJOR forward, 2 mismatches )
+ GGAG ( is also MAJOR forward, 1 mismatch )
+ GGAT ( is also MINOR reverse, 1 mismatch )
+
+*************************************************************/
+
+rc_t check_rna_splicing_candidates_against_ref( struct ReferenceObj const * ref_obj,
+ uint32_t splice_level, /* 0, 1, 2 ... allowed mismatches */
+ INSDC_coord_zero pos,
+ rna_splice_candidates * candidates )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+ for ( idx = 0; idx < candidates->count && rc == 0; ++idx )
+ {
+ uint8_t splice[ 4 ];
+ INSDC_coord_len written;
+ rna_splice_candidate * rsc = &candidates->candidates[ idx ];
+ INSDC_coord_zero rd_pos = ( pos + rsc->ref_offset );
+ rc = ReferenceObj_Read( ref_obj, rd_pos, 2, splice, &written );
+ if ( rc == 0 && written == 2 )
+ {
+ rd_pos += ( rsc->len - 2 );
+ rc = ReferenceObj_Read( ref_obj, rd_pos, 2, &splice[ 2 ], &written );
+ if ( rc == 0 && written == 2 )
+ {
+ uint8_t compressed = compress_4_bases_to_byte( splice ); /* 4 bases --> 1 byte */
+ uint8_t match = compressed_to_fwd_reverse_0[ compressed ]; /* table lookup */
+ uint8_t mismatches = ( match >> 4 );
+
+ if ( mismatches <= splice_level )
+ {
+ rsc->matched = match;
+
+ if ( ( match & RNA_SPLICE_FWD ) == RNA_SPLICE_FWD )
+ candidates->fwd_matched++;
+ else if ( ( match & RNA_SPLICE_REV ) == RNA_SPLICE_REV )
+ candidates->rev_matched++;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t discover_rna_splicing_candidates( uint32_t cigar_len, const char * cigar, uint32_t min_len, rna_splice_candidates * candidates )
+{
+ rc_t rc = 0;
+ candidates->cigops_len = ( cigar_len / 2 ) + 1;
+ candidates->cigops = malloc( ( sizeof * candidates->cigops ) * candidates->cigops_len );
+ if ( candidates->cigops == NULL )
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ uint32_t ref_offset = 0;
+ int32_t op_idx;
+ CigOps * cigops = candidates->cigops;
+
+ candidates->n_cigops = ExplodeCIGAR( cigops, candidates->cigops_len, cigar, cigar_len );
+ candidates->count = 0;
+ for ( op_idx = 0; op_idx < ( candidates->n_cigops - 1 ); op_idx++ )
+ {
+ char op_code = cigops[ op_idx ].op;
+ uint32_t op_len = cigops[ op_idx ].oplen;
+ if ( (op_code == 'D' || op_code == 'N') && op_len >= min_len && candidates->count < MAX_RNA_SPLICE_CANDIDATES )
+ {
+ rna_splice_candidate * rsc = &candidates->candidates[ candidates->count++ ];
+ rsc->ref_offset = ref_offset;
+ rsc->len = op_len;
+ rsc->op_idx = op_idx;
+ rsc->matched = RNA_SPLICE_UNKNOWN; /* we dont know that yet, caller has to do that ( sam-aligned.c ) */
+ }
+ if ( op_code == 'M' || op_code == 'X' || op_code == '=' || op_code == 'D' || op_code == 'N' )
+ ref_offset += op_len;
+ }
+ }
+ return rc;
+}
+
+
+
+rc_t change_rna_splicing_cigar( uint32_t cigar_len, char * cigar, rna_splice_candidates * candidates, uint32_t * NM_adjustment )
+{
+ rc_t rc = 0;
+ uint32_t winner, sum_of_n_lengths = 0;
+ int32_t idx, dst;
+ CigOps * cigops = candidates->cigops;
+
+ /* handle the special case that we do have forward and reverse candidates in one alignement, that cannot be!
+ we declare a winner ( the direction that occurs most ), zero out the looser(s) and give a warning */
+ if ( candidates->fwd_matched > candidates->rev_matched )
+ winner = RNA_SPLICE_FWD;
+ else
+ winner = RNA_SPLICE_REV;
+
+ for ( idx = 0; idx < candidates->count; ++idx )
+ {
+ rna_splice_candidate * rsc = &candidates->candidates[ idx ];
+ if ( ( rsc->matched & 0x0F ) == winner && cigops[ rsc->op_idx ].op == 'D' )
+ {
+ cigops[ rsc->op_idx ].op = 'N';
+ sum_of_n_lengths += rsc->len;
+ }
+ }
+
+ for ( idx = 0, dst = 0; idx < ( candidates->n_cigops - 1 ) && rc == 0; ++idx )
+ {
+ size_t sz;
+ rc = string_printf( &cigar[ dst ], cigar_len + 1 - dst, &sz, "%u%c", cigops[ idx ].oplen, cigops[ idx ].op );
+ dst += sz;
+ }
+ if ( NM_adjustment != NULL )
+ *NM_adjustment = sum_of_n_lengths;
+ return rc;
+}
+rc_t cg_canonical_print_cigar( const char * cigar, size_t cigar_len)
+{
+ rc_t rc;
+ if ( cigar_len > 0 )
+ {
+ int i,total_cnt,cnt;
+ char op;
+ for(i=0,cnt=0,op=0,cnt=0;i<cigar_len;i++){
+ if(isdigit(cigar[i])){
+ cnt=cnt*10+(cigar[i]-'0');
+ } else if(isalpha(cigar[i])){
+ if(op=='\0'){ /** first op **/
+ total_cnt=cnt;
+ } else if(op==cigar[i]){ /** merging consequitive ops **/
+ total_cnt+=cnt;
+ } else {
+ if(total_cnt > 0) KOutMsg( "%d%c", total_cnt,op );
+ total_cnt=cnt;
+ }
+ op=cigar[i];
+ cnt=0;
+ } else {
+ assert(0); /*** should never happen inside this function ***/
+ }
+ }
+ if(total_cnt && op) KOutMsg( "%d%c", total_cnt,op );
+ }
+ else
+ rc = KOutMsg( "*" );
+ return rc;
+}
+
diff --git a/tools/sra-pileup/cg_tools.h b/tools/sra-pileup/cg_tools.h
new file mode 100644
index 0000000..9f7bd66
--- /dev/null
+++ b/tools/sra-pileup/cg_tools.h
@@ -0,0 +1,137 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cgtools_
+#define _h_cgtools_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/rc.h>
+#include <insdc/sra.h>
+#include <insdc/sra.h>
+#include <align/reference.h>
+
+#define MAX_CG_CIGAR_LEN ( ( 11 * 35 ) + 1 )
+#define MAX_GC_LEN ( ( 11 * 3 ) + 1 )
+#define MAX_READ_LEN ( 35 )
+
+
+typedef struct ptr_len
+{
+ const char * ptr;
+ uint32_t len;
+} ptr_len;
+
+typedef struct cg_cigar_input
+{
+ ptr_len p_cigar;
+ ptr_len p_read;
+ ptr_len p_quality;
+
+ bool orientation;
+ INSDC_coord_one seq_req_id;
+ bool edit_dist_available;
+ int32_t edit_dist;
+} cg_cigar_input;
+
+
+typedef struct cg_cigar_output
+{
+ char cigar[ MAX_CG_CIGAR_LEN ];
+ uint32_t cigar_len;
+
+ ptr_len p_cigar;
+ ptr_len p_read;
+ ptr_len p_quality;
+ ptr_len p_tags;
+
+ char newSeq[ MAX_READ_LEN ];
+ char newQual[ MAX_READ_LEN ];
+ char tags[ MAX_CG_CIGAR_LEN * 2 ];
+
+ int32_t edit_dist;
+} cg_cigar_output;
+
+
+rc_t make_cg_cigar( const cg_cigar_input * input, cg_cigar_output * output );
+
+rc_t make_cg_merge( const cg_cigar_input * input, cg_cigar_output * output );
+
+
+typedef struct CigOps
+{
+ char op;
+ int8_t ref_sign; /* 0;+1;-1; ref_offset = ref_sign * offset */
+ int8_t seq_sign; /* 0;+1;-1; seq_offset = seq_sign * offset */
+ uint32_t oplen;
+} CigOps;
+
+
+int32_t ExplodeCIGAR( CigOps dst[], uint32_t len, char const cigar[], uint32_t ciglen );
+
+uint32_t CombineCIGAR( char dst[], CigOps const seqOp[], uint32_t seq_len,
+ uint32_t refPos, CigOps const refOp[], uint32_t ref_len );
+
+#define RNA_SPLICE_UNKNOWN 0
+#define RNA_SPLICE_FWD 1
+#define RNA_SPLICE_REV 2
+
+typedef struct rna_splice_candidate
+{
+ uint32_t ref_offset;
+ uint32_t len;
+ uint32_t op_idx;
+ uint32_t matched; /* 0..unknown, 1..fwd, 2..rev */
+} rna_splice_candidate;
+
+
+#define MAX_RNA_SPLICE_CANDIDATES 20
+
+typedef struct rna_splice_candidates
+{
+ rna_splice_candidate candidates[ MAX_RNA_SPLICE_CANDIDATES ];
+ CigOps * cigops;
+ uint32_t count, fwd_matched, rev_matched, cigops_len;
+ int32_t n_cigops;
+} rna_splice_candidates;
+
+
+rc_t discover_rna_splicing_candidates( uint32_t cigar_len, const char * cigar, uint32_t min_len, rna_splice_candidates * candidates );
+
+rc_t check_rna_splicing_candidates_against_ref( struct ReferenceObj const * ref_obj,
+ uint32_t splice_level,
+ INSDC_coord_zero pos,
+ rna_splice_candidates * candidates );
+
+rc_t change_rna_splicing_cigar( uint32_t cigar_len, char * cigar, rna_splice_candidates * candidates, uint32_t * NM_adjustment );
+rc_t cg_canonical_print_cigar( const char * cigar, size_t cigar_len);
+
+#endif
diff --git a/tools/sra-pileup/cmdline_cmn.c b/tools/sra-pileup/cmdline_cmn.c
new file mode 100644
index 0000000..c9cc9e5
--- /dev/null
+++ b/tools/sra-pileup/cmdline_cmn.c
@@ -0,0 +1,711 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cmdline_cmn.h"
+
+#include <kapp/args.h>
+
+#include <vdb/report.h> /* ReportResetTable */
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+
+#include <sra/srapath.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+const char * ref_usage[] = { "Filter by position on genome.",
+ "Name can either be file specific name",
+ "(ex: \"chr1\" or \"1\").",
+ "\"from\" and \"to\" are 1-based coordinates",
+ NULL };
+
+const char * outf_usage[] = { "Output will be written to this file",
+ "instead of std-out", NULL };
+
+const char * table_usage[] = { "Which alignment table(s) to use (p|s|e):",
+ "p - primary, s - secondary, e - evidence-interval",
+ "(default = p)", NULL };
+
+const char * gzip_usage[] = { "Compress output using gzip", NULL };
+
+const char * bzip_usage[] = { "Compress output using bzip2", NULL };
+
+const char * inf_usage[] = { "File with all input-parameters / options", NULL };
+
+const char * schema_usage[] = { "optional schema-file to be used", NULL };
+
+const char * no_mt_usage[] = { "disable multithreading", NULL };
+
+const char * timing_usage[] = { "write timing log-file", NULL };
+
+#define OPTION_OUTF "outfile"
+#define ALIAS_OUTF "o"
+
+#define OPTION_TABLE "table"
+#define ALIAS_TABLE "t"
+
+#define OPTION_GZIP "gzip"
+#define ALIAS_GZIP NULL
+
+#define OPTION_BZIP "bzip2"
+#define ALIAS_BZIP NULL
+
+#define OPTION_INF "infile"
+#define ALIAS_INF "f"
+
+#define OPTION_SCHEMA "schema"
+#define ALIAS_SCHEMA "S"
+
+#define OPTION_NO_MT "disable-multithreading"
+#define OPTION_TIMING "timing"
+
+OptDef CommonOptions[] =
+{
+ /*name, alias, hfkt, usage-help, maxcount, needs value, required */
+ { OPTION_REF, ALIAS_REF, NULL, ref_usage, 0, true, false },
+ { OPTION_OUTF, ALIAS_OUTF, NULL, outf_usage, 1, true, false },
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, false },
+ { OPTION_GZIP, ALIAS_GZIP, NULL, gzip_usage, 1, false, false },
+ { OPTION_BZIP, ALIAS_BZIP, NULL, bzip_usage, 1, false, false },
+ { OPTION_INF, ALIAS_INF, NULL, inf_usage, 0, true, false },
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 1, true, false },
+ { OPTION_NO_MT, NULL, NULL, no_mt_usage, 1, false, false },
+ { OPTION_TIMING, NULL, NULL, timing_usage, 1, true, false }
+};
+
+
+/* =========================================================================================== */
+
+static rc_t get_str_option( const Args *args, const char *name, const char ** res )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ *res = NULL;
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else
+ {
+ if ( count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void **)res );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionValue() failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t get_bool_option( const Args *args, const char *name, bool *res, const bool def )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ *res = true;
+ }
+ else
+ {
+ *res = def;
+ }
+ return rc;
+}
+
+/* =========================================================================================== */
+
+rc_t get_common_options( Args * args, common_options *opts )
+{
+ rc_t rc = get_str_option( args, OPTION_OUTF, &opts->output_file );
+
+ if ( rc == 0 )
+ rc = get_str_option( args, OPTION_INF, &opts->input_file );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_GZIP, &opts->gzip_output, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_BZIP, &opts->bzip_output, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_NO_MT, &opts->no_mt, false );
+
+ if ( rc == 0 )
+ rc = get_str_option( args, OPTION_SCHEMA, &opts->schema_file );
+
+ if ( rc == 0 )
+ rc = get_str_option( args, OPTION_TIMING, &opts->timing_file );
+
+ if ( rc == 0 )
+ {
+ const char * table2use = NULL;
+ rc = get_str_option( args, OPTION_TABLE, &table2use );
+ opts->tab_select = primary_ats;
+ if ( rc == 0 && table2use != NULL )
+ {
+ size_t l = string_size ( table2use );
+ opts->tab_select = 0;
+ if ( ( string_chr ( table2use, l, 'p' ) != NULL )||
+ ( string_chr ( table2use, l, 'P' ) != NULL ) )
+ { opts->tab_select |= primary_ats; };
+
+ if ( ( string_chr ( table2use, l, 's' ) != NULL )||
+ ( string_chr ( table2use, l, 'S' ) != NULL ) )
+ { opts->tab_select |= secondary_ats; };
+
+ if ( ( string_chr ( table2use, l, 'e' ) != NULL )||
+ ( string_chr ( table2use, l, 'E' ) != NULL ) )
+ { opts->tab_select |= evidence_ats; };
+ }
+ }
+
+ return rc;
+}
+
+void print_common_helplines( void )
+{
+ HelpOptionLine ( ALIAS_REF, OPTION_REF, "name[:from-to]", ref_usage );
+ HelpOptionLine ( ALIAS_OUTF, OPTION_OUTF, "output-file", outf_usage );
+ HelpOptionLine ( ALIAS_TABLE, OPTION_TABLE, "shortcut", table_usage );
+ HelpOptionLine ( ALIAS_BZIP, OPTION_BZIP, NULL, bzip_usage );
+ HelpOptionLine ( ALIAS_GZIP, OPTION_GZIP, NULL, gzip_usage );
+ HelpOptionLine ( NULL, OPTION_NO_MT, NULL, no_mt_usage );
+ HelpOptionLine ( NULL, OPTION_TIMING, NULL, timing_usage );
+}
+
+
+OptDef * CommonOptions_ptr( void )
+{
+ return &CommonOptions[ 0 ];
+}
+
+size_t CommonOptions_count( void )
+{
+ return ( sizeof CommonOptions / sizeof CommonOptions [ 0 ] );
+}
+
+
+/* =========================================================================================== */
+
+#if 0
+static int cmp_pchar( const char * a, const char * b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+#endif
+
+/* =========================================================================================== */
+
+
+rc_t init_ref_regions( BSTree * tree, Args * args )
+{
+ uint32_t count;
+ rc_t rc;
+
+ BSTreeInit( tree );
+ rc = ArgsOptionCount( args, OPTION_REF, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * s;
+ rc = ArgsOptionValue( args, OPTION_REF, i, (const void **)&s );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "ArgsOptionValue() failed" );
+ else
+ rc = parse_and_add_region( tree, s );
+ }
+ }
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+#if TOOLS_USE_SRAPATH != 0
+static bool is_this_a_filesystem_path( const char * path )
+{
+ bool res = false;
+ size_t i, n = string_size ( path );
+ for ( i = 0; i < n && !res; ++i )
+ {
+ char c = path[ i ];
+ res = ( c == '.' || c == '/' || c == '\\' );
+ }
+ return res;
+}
+#endif
+
+#if TOOLS_USE_SRAPATH != 0
+static char *translate_accession( SRAPath *my_sra_path,
+ const char *accession,
+ const size_t bufsize )
+{
+ rc_t rc;
+ char * res = calloc( 1, bufsize );
+ if ( res == NULL ) return NULL;
+
+ rc = SRAPathFind( my_sra_path, accession, res, bufsize );
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ free( res );
+ return NULL;
+ }
+ else if ( GetRCState( rc ) == rcInsufficient )
+ {
+ free( res );
+ return translate_accession( my_sra_path, accession, bufsize * 2 );
+ }
+ else if ( rc != 0 )
+ {
+ free( res );
+ return NULL;
+ }
+ return res;
+}
+#endif
+
+#if TOOLS_USE_SRAPATH != 0
+static rc_t resolve_accession( const KDirectory *my_dir, char ** path )
+{
+ SRAPath *my_sra_path;
+ rc_t rc = 0;
+
+ if ( strchr ( *path, '/' ) != NULL )
+ return 0;
+
+ rc = SRAPathMake( &my_sra_path, my_dir );
+ if ( rc != 0 )
+ {
+ if ( GetRCState ( rc ) != rcNotFound || GetRCTarget ( rc ) != rcDylib )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "SRAPathMake() failed" );
+ }
+ }
+ else
+ rc = 0;
+ }
+ else
+ {
+ if ( !SRAPathTest( my_sra_path, *path ) )
+ {
+ char *buf = translate_accession( my_sra_path, *path, 64 );
+ if ( buf != NULL )
+ {
+ free( (char*)(*path) );
+ *path = buf;
+ }
+ }
+ SRAPathRelease( my_sra_path );
+ }
+ return rc;
+}
+#endif
+
+
+/* =========================================================================================== */
+
+
+/****************************************************************************************
+ splits an argument
+
+ example: "/path/file=grp1" into path = "/path/file" and attribute = "grp1"
+ or
+ example: "/path/file" into path = "/path/file" and attribute = NULL
+
+****************************************************************************************/
+static rc_t split_argument( const char *argument, char ** path, char ** attribute, char delim )
+{
+ if ( argument == NULL || path == NULL || attribute == NULL )
+ return RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ char * delim_ptr = string_chr ( argument, string_size ( argument ), delim );
+ if ( delim_ptr == NULL )
+ {
+ *path = string_dup_measure( argument, NULL );
+ *attribute = NULL;
+ }
+ else
+ {
+ size_t len = string_size( argument );
+ size_t len1 = ( delim_ptr - argument );
+ *path = string_dup ( argument, len1 );
+ if ( delim_ptr < argument + len - 1 )
+ *attribute = string_dup ( delim_ptr + 1, len - ( len1 + 1 ) );
+ else
+ *attribute = NULL;
+ }
+ }
+ return 0;
+}
+
+
+static rc_t split_vpath_into_path_and_readgroup( VPath *vpath, const char *argument, char ** path, char ** attribute )
+{
+ size_t zz;
+ char readgroup_buffer[ 256 ];
+ rc_t rc1 = VPathOption( vpath, vpopt_readgroup, readgroup_buffer, sizeof readgroup_buffer - 1, &zz );
+ if ( rc1 == 0 )
+ *attribute = string_dup( readgroup_buffer, zz );
+ *path = string_dup( argument, string_size( argument ) );
+ return 0;
+}
+
+
+static rc_t test_split_vpath_into_path_and_readgroup( VPath *vpath, const char *argument, char ** path, char ** attribute )
+{
+ rc_t rc = 0;
+#if 1
+ if ( VPathFromUri ( vpath ) )
+ rc = split_vpath_into_path_and_readgroup ( vpath, argument, path, attribute );
+ else
+ rc = split_argument ( argument, path, attribute, '=' );
+#else
+ VPUri_t uri_type = VPathGetUri_t( vpath );
+ switch ( uri_type )
+ {
+ default:
+ case vpuri_invalid:
+ rc = RC( rcExe, rcParam, rcAccessing, rcPath, rcInvalid );
+ break;
+
+ case vpuri_not_supported:
+ rc = RC( rcExe, rcParam, rcAccessing, rcPath, rcUnsupported );
+ break;
+
+ case vpuri_none:
+ rc = split_argument( argument, path, attribute, '=' );
+ break;
+
+ case vpuri_ncbi_vfs:
+ case vpuri_file:
+ case vpuri_ncbi_acc:
+ case vpuri_http:
+ rc = split_vpath_into_path_and_readgroup( vpath, argument, path, attribute );
+ break;
+ }
+#endif
+ return rc;
+}
+
+
+static rc_t split_argument_into_path_and_readgroup( const char *argument, char ** path, char ** attribute )
+{
+ rc_t rc;
+ char * colon_ptr = string_chr ( argument, string_size ( argument ), ':' );
+ if ( colon_ptr == NULL )
+ {
+ /* we do not have a colon in the argument, that means: there is no uri-syntax involved
+ ---> we can split the "old fashioned way" at the equal-sign */
+ rc = split_argument( argument, path, attribute, '=' );
+ }
+ else
+ {
+ VFSManager * mgr;
+ rc_t rc = VFSManagerMake ( & mgr );
+
+ *path = NULL;
+ *attribute = NULL;
+
+ if ( rc == 0 )
+ {
+ VPath * vpath;
+ rc = VFSManagerMakePath ( mgr, &vpath, "%s", argument );
+ if ( rc == 0 )
+ {
+ rc = test_split_vpath_into_path_and_readgroup( vpath, argument, path, attribute );
+ VPathRelease( vpath );
+ }
+
+ VFSManagerRelease ( mgr );
+ }
+ }
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+rc_t foreach_argument( Args * args, KDirectory *dir, bool div_by_spotgrp, bool * empty,
+ rc_t ( CC * on_argument ) ( const char * path, const char * spot_group, void * data ), void * data )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else
+ {
+ uint32_t idx;
+ if ( empty != NULL )
+ {
+ *empty = ( count == 0 );
+ }
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *param = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)¶m );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamvalue() failed" );
+ }
+ else
+ {
+
+ char * path = NULL;
+ char * spot_group = NULL;
+
+ rc = split_argument_into_path_and_readgroup( param, &path, &spot_group );
+ if ( rc == 0 && path != NULL )
+ {
+ /* in case there is no spotgroup-override from the commandline AND
+ the option to divide by spot-group is set, let spot_group point
+ to an empty string ---> divide by original spot-group! */
+ if ( spot_group == NULL && div_by_spotgrp )
+ {
+ spot_group = calloc( 1, 1 );
+ }
+
+#if TOOLS_USE_SRAPATH != 0
+ if ( !is_this_a_filesystem_path( path ) )
+ {
+ rc = resolve_accession( dir, &path );
+ }
+#endif
+
+ if ( rc == 0 )
+ {
+ rc = on_argument( path, spot_group, data );
+ }
+
+ free( path );
+ if ( spot_group != NULL )
+ free( spot_group );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t prepare_whole_file( prepare_ctx * ctx )
+{
+ rc_t rc = 0;
+ if ( ctx->reflist != NULL )
+ {
+ uint32_t count;
+ rc = ReferenceList_Count( ctx->reflist, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceList_Count() failed" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ rc = ReferenceList_Get( ctx->reflist, &ctx->refobj, idx );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceList_Get() failed" );
+ }
+ else
+ {
+ rc = ctx->on_section( ctx, NULL );
+ if ( rc == 0 )
+ ReferenceObj_Release( ctx->refobj );
+ }
+ }
+ }
+ }
+ else
+ {
+ ctx->refobj = NULL;
+ rc = ctx->on_section( ctx, NULL );
+ }
+ return rc;
+}
+
+
+static rc_t CC prepare_region_cb( const char * name, const struct reference_range * range, void * data )
+{
+ prepare_ctx * ctx = ( prepare_ctx * )data;
+ rc_t rc = ReferenceList_Find( ctx->reflist, &ctx->refobj, name, string_size( name ) );
+ if ( rc != 0 )
+ {
+ rc = 0;
+ }
+ else
+ {
+ rc = ctx->on_section( ctx, range );
+ if ( rc == 0 )
+ ReferenceObj_Release( ctx->refobj );
+ }
+ return rc;
+}
+
+
+static rc_t prepare_db_table( prepare_ctx *ctx,
+ const VDBManager *vdb_mgr,
+ VSchema *vdb_schema,
+ const char * path )
+{
+ rc_t rc;
+ ctx->db = NULL;
+ ctx->seq_tab = NULL;
+
+ rc = VDBManagerOpenDBRead ( vdb_mgr, &ctx->db, vdb_schema, "%s", path );
+ if ( rc != 0 )
+ {
+ rc = VDBManagerOpenTableRead ( vdb_mgr, &ctx->seq_tab, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "failed to open '$(path)'", "path=%s", path ) );
+ }
+ else {
+ ReportResetTable(path, ctx->seq_tab);
+ }
+ }
+ else
+ {
+ rc = VDatabaseOpenTableRead( ctx->db, &ctx->seq_tab, "SEQUENCE" );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDatabaseOpenTableRead( SEQUENCE ) failed" );
+ }
+ else
+ {
+ ReportResetDatabase( path, ctx->db );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t prepare_reflist( prepare_ctx *ctx )
+{
+ rc_t rc = 0;
+ ctx->reflist = NULL;
+ if ( ctx->db != NULL )
+ {
+ uint32_t reflist_options = ereferencelist_4na;
+
+ if ( ctx->use_primary_alignments )
+ reflist_options |= ereferencelist_usePrimaryIds;
+
+ if ( ctx->use_secondary_alignments )
+ reflist_options |= ereferencelist_useSecondaryIds;
+
+ if ( ctx->use_evidence_alignments )
+ reflist_options |= ereferencelist_useEvidenceIds;
+
+ rc = ReferenceList_MakeDatabase( &ctx->reflist, ctx->db, reflist_options, 0, NULL, 0 );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceList_MakeDatabase() failed" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t prepare_ref_iter( prepare_ctx *ctx,
+ const VDBManager *vdb_mgr,
+ VSchema *vdb_schema,
+ const char * path,
+ BSTree * regions )
+{
+ rc_t rc = prepare_db_table( ctx, vdb_mgr, vdb_schema, path );
+ if ( rc == 0 )
+ {
+ rc = prepare_reflist( ctx );
+ if( rc == 0 )
+ {
+ if ( ctx->reflist == NULL || count_ref_regions( regions ) == 0 )
+ {
+ /* the user has not specified a reference-range : use the whole file... */
+ rc = prepare_whole_file( ctx );
+ }
+ else
+ {
+ /* pick only the requested ranges... */
+ rc = foreach_ref_region( regions, prepare_region_cb, ctx ); /* ref_regions.c */
+ }
+ }
+ if ( ctx->reflist != NULL )
+ {
+ ReferenceList_Release( ctx->reflist );
+ }
+ }
+ VTableRelease ( ctx->seq_tab );
+ VDatabaseRelease ( ctx->db );
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+rc_t parse_inf_file( Args * args )
+{
+ return Args_parse_inf_file( args, OPTION_INF );
+}
diff --git a/tools/sra-pileup/cmdline_cmn.h b/tools/sra-pileup/cmdline_cmn.h
new file mode 100644
index 0000000..364bfcc
--- /dev/null
+++ b/tools/sra-pileup/cmdline_cmn.h
@@ -0,0 +1,150 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cmdline_cmn_
+#define _h_cmdline_cmn_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ref_regions.h"
+
+#include <kapp/args.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/container.h>
+
+#include <kfs/directory.h>
+/* #include <sra/srapath.h> */
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+
+#include <align/iterator.h>
+#include <align/reference.h>
+
+#include <strtol.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#define OPTION_REF "aligned-region"
+#define ALIAS_REF "r"
+
+typedef uint8_t align_tab_select;
+enum { primary_ats = 1, secondary_ats = 2, evidence_ats = 4 };
+
+typedef struct common_options
+{
+ bool gzip_output;
+ bool bzip_output;
+ bool no_mt;
+ align_tab_select tab_select;
+ const char * output_file;
+ const char * input_file;
+ const char * schema_file;
+ const char * timing_file;
+} common_options;
+
+
+void print_common_helplines( void );
+
+rc_t get_common_options( Args * args, common_options *opts );
+OptDef * CommonOptions_ptr( void );
+size_t CommonOptions_count( void );
+
+/* get ref-ranges from the command-line and iterate them... */
+rc_t init_ref_regions( BSTree * regions, Args * args );
+
+rc_t foreach_argument( Args * args, KDirectory *dir, bool div_by_spotgrp, bool * empty,
+ rc_t ( CC * on_argument ) ( const char * path, const char * spot_group, void * data ), void * data );
+
+
+typedef struct pileup_col_ids
+{
+ uint32_t idx_quality;
+ uint32_t idx_ref_orientation;
+ uint32_t idx_read_filter;
+ uint32_t idx_template_len;
+} pileup_col_ids;
+
+
+typedef struct prepare_ctx
+{
+ ReferenceIterator *ref_iter;
+ PlacementSetIterator *plset_iter;
+ const VDatabase *db;
+ const VTable *seq_tab;
+
+ const VCursor *prim_cur;
+ const VCursor *sec_cur;
+ const VCursor *ev_cur;
+
+ pileup_col_ids *prim_cur_ids;
+ pileup_col_ids *sec_cur_ids;
+ pileup_col_ids *ev_cur_ids;
+
+ const ReferenceList *reflist;
+ const ReferenceObj *refobj;
+ const char * spot_group;
+ bool omit_qualities;
+ bool read_tlen;
+ bool use_primary_alignments;
+ bool use_secondary_alignments;
+ bool use_evidence_alignments;
+ void * data;
+ const char *path;
+ rc_t ( CC * on_section ) ( struct prepare_ctx * ctx, const struct reference_range * range );
+} prepare_ctx;
+
+
+
+rc_t prepare_ref_iter( prepare_ctx *ctx,
+ const VDBManager *vdb_mgr,
+ VSchema *vdb_schema,
+ const char * path,
+ BSTree * regions );
+
+rc_t prepare_plset_iter( prepare_ctx *ctx,
+ const VDBManager *vdb_mgr,
+ VSchema *vdb_schema,
+ const char * path,
+ BSTree * ranges );
+
+
+rc_t parse_inf_file( Args * args );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_cmdline_cmn_ */
diff --git a/tools/sra-pileup/debug.h b/tools/sra-pileup/debug.h
new file mode 100644
index 0000000..d1a321b
--- /dev/null
+++ b/tools/sra-pileup/debug.h
@@ -0,0 +1,34 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _tools_sam_dump_debug_h_
+#define _tools_sam_dump_debug_h_
+
+#include <klib/debug.h>
+
+#define SAM_DUMP_DBG_PASTE(a,b) a##b
+#define SAM_DUMP_DBG(flag,msg) DBGMSG(DBG_APP,DBG_FLAG(SAM_DUMP_DBG_PASTE(DBG_APP_,flag)), msg)
+
+#endif /* _tools_sam_dump_debug_h_ */
diff --git a/tools/sra-pileup/dyn_string.c b/tools/sra-pileup/dyn_string.c
new file mode 100644
index 0000000..c8f5348
--- /dev/null
+++ b/tools/sra-pileup/dyn_string.c
@@ -0,0 +1,206 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "dyn_string.h"
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+
+typedef struct dyn_string
+{
+ char * data;
+ size_t allocated;
+ size_t data_len;
+} dyn_string;
+
+
+rc_t allocated_dyn_string ( struct dyn_string **self, size_t size )
+{
+ rc_t rc = 0;
+ struct dyn_string * res = malloc( sizeof *res );
+ *self = NULL;
+ if ( res == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ res->data_len = 0;
+ res->data = malloc( size );
+ if ( res->data != NULL )
+ res->allocated = size;
+ else
+ {
+ res->allocated = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ if ( rc != 0 )
+ free( res );
+ else
+ *self = res;
+ }
+ return rc;
+}
+
+
+void free_dyn_string ( struct dyn_string *self )
+{
+ free( self->data );
+ self->data = NULL;
+ self->allocated = 0;
+ self->data_len = 0;
+ free( ( void * ) self );
+}
+
+
+void reset_dyn_string( struct dyn_string *self )
+{
+ self->data_len = 0;
+}
+
+
+rc_t expand_dyn_string( struct dyn_string *self, size_t new_size )
+{
+ rc_t rc = 0;
+ if ( new_size > self->allocated )
+ {
+ self->data = realloc ( self->data, new_size );
+ if ( self->data != NULL )
+ {
+ self->allocated = new_size;
+ }
+ else
+ {
+ self->allocated = 0;
+ self->data_len = 0;
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ }
+ return rc;
+}
+
+
+rc_t add_char_2_dyn_string( struct dyn_string *self, const char c )
+{
+ /* does nothing if self->data_len + 2 < self->allocated */
+ rc_t rc = expand_dyn_string( self, self->data_len + 2 );
+ if ( rc == 0 )
+ {
+ self->data[ self->data_len++ ] = c;
+ self->data[ self->data_len ] = 0;
+ }
+ return rc;
+}
+
+
+char * dyn_string_char( struct dyn_string *self, uint32_t idx )
+{
+ return( &self->data[ idx ] );
+}
+
+
+rc_t add_string_2_dyn_string( struct dyn_string *self, const char * s )
+{
+ rc_t rc;
+ size_t size = string_size ( s );
+ /* does nothing if self->data_len + size + 1 < self->allocated */
+ rc = expand_dyn_string( self, self->data_len + size + 1 );
+ if ( rc == 0 )
+ {
+ string_copy ( &(self->data[ self->data_len ]), self->allocated, s, size );
+ self->data_len += size;
+ self->data[ self->data_len ] = 0;
+ }
+ return rc;
+}
+
+
+rc_t add_dyn_string_2_dyn_string( struct dyn_string *self, struct dyn_string *other )
+{
+ rc_t rc = 0;
+ size_t size = other->data_len;
+ if ( size > 0 )
+ {
+ /* does nothing if self->data_len + size + 1 < self->allocated */
+ rc = expand_dyn_string( self, self->data_len + size + 1 );
+ if ( rc == 0 )
+ {
+ string_copy ( &(self->data[ self->data_len ]), self->allocated, other->data, size );
+ self->data_len += size;
+ self->data[ self->data_len ] = 0;
+ }
+ }
+ return rc;
+
+}
+
+
+rc_t print_2_dyn_string( struct dyn_string * self, const char *fmt, ... )
+{
+ rc_t rc = 0;
+ bool not_enough;
+
+ do
+ {
+ size_t num_writ;
+ va_list args;
+ va_start ( args, fmt );
+ rc = string_vprintf ( &(self->data[ self->data_len ]),
+ self->allocated - ( self->data_len + 1 ),
+ &num_writ,
+ fmt,
+ args );
+ va_end ( args );
+
+ if ( rc == 0 )
+ {
+ self->data_len += num_writ;
+ self->data[ self->data_len ] = 0;
+ }
+ not_enough = ( GetRCState( rc ) == rcInsufficient );
+ if ( not_enough )
+ {
+ rc = expand_dyn_string( self, self->allocated + ( num_writ * 2 ) );
+ }
+ } while ( not_enough && rc == 0 );
+ return rc;
+}
+
+
+rc_t print_dyn_string( struct dyn_string * self )
+{
+ if ( self != NULL )
+ return KOutMsg( "%.*s", self->data_len, self->data );
+ else
+ return 0;
+}
+
+
+size_t dyn_string_len( struct dyn_string * self )
+{
+ if ( self != NULL )
+ return self->data_len;
+ else
+ return 0;
+}
diff --git a/tools/sra-pileup/dyn_string.h b/tools/sra-pileup/dyn_string.h
new file mode 100644
index 0000000..f3806d6
--- /dev/null
+++ b/tools/sra-pileup/dyn_string.h
@@ -0,0 +1,55 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_dyn_string_
+#define _h_dyn_string_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+
+struct dyn_string;
+
+rc_t allocated_dyn_string ( struct dyn_string **self, size_t size );
+void free_dyn_string ( struct dyn_string *self );
+
+void reset_dyn_string( struct dyn_string *self );
+rc_t expand_dyn_string( struct dyn_string *self, size_t new_size );
+rc_t add_char_2_dyn_string( struct dyn_string *self, const char c );
+char * dyn_string_char( struct dyn_string *self, uint32_t idx );
+rc_t add_string_2_dyn_string( struct dyn_string *self, const char * s );
+rc_t add_dyn_string_2_dyn_string( struct dyn_string *self, struct dyn_string *other );
+rc_t print_2_dyn_string( struct dyn_string * self, const char *fmt, ... );
+rc_t print_dyn_string( struct dyn_string * self );
+size_t dyn_string_len( struct dyn_string * self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* dyn_string_ */
diff --git a/tools/sra-pileup/inputfiles.c b/tools/sra-pileup/inputfiles.c
new file mode 100644
index 0000000..a232677
--- /dev/null
+++ b/tools/sra-pileup/inputfiles.c
@@ -0,0 +1,377 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "inputfiles.h"
+
+#include <sra/sraschema.h> /* VDBManagerMakeSRASchema */
+#include <vdb/schema.h> /* VSchemaRelease */
+
+#include <kdb/manager.h>
+#include <kfs/file.h>
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+static void free_input_database( input_database * id )
+{
+ if ( id->path != NULL ) free( id->path );
+ if ( id->db != NULL ) VDatabaseRelease( id->db );
+ if ( id->reflist != NULL ) ReferenceList_Release( id->reflist );
+ if ( id->prim_ctx != NULL ) free( id->prim_ctx );
+ if ( id->sec_ctx != NULL ) free( id->sec_ctx );
+ if ( id->ev_ctx != NULL ) free( id->ev_ctx );
+ free( id );
+}
+
+
+static void free_input_table( input_table * it )
+{
+ if ( it->path != NULL ) free( it->path );
+ if ( it->tab != NULL ) VTableRelease( it->tab );
+ free( it );
+}
+
+
+static rc_t append_database( input_files *self, const VDatabase * db,
+ const char * path, uint32_t reflist_options, bool show_err )
+{
+ const ReferenceList *reflist;
+ rc_t rc = ReferenceList_MakeDatabase( &reflist, db, reflist_options, 0, NULL, 0 );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot create reflist for '$(t)'", "t=%s", path ) );
+ }
+ else
+ {
+ input_database * id = calloc( sizeof * id, 1 );
+ if ( id == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "cannot create input-database structure" );
+ }
+ else
+ {
+ uint32_t idx;
+
+ id->db = db;
+ id->reflist = reflist;
+ id->path = string_dup( path, string_size( path ) );
+
+ rc = VectorAppend( &self->dbs, &idx, id );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot append db '$(t)' to inputfiles", "t=%s", path ) );
+ free_input_database( id );
+ }
+ else
+ {
+ ++(self->database_count);
+ id->db_idx = idx;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t append_table( input_files *self, const VTable *tab, const char * path )
+{
+ rc_t rc = 0;
+ input_table * it = calloc( sizeof * it, 1 );
+ if ( it == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "cannot create input-table structure" );
+ }
+ else
+ {
+ it->path = string_dup( path, string_size( path ) );
+ it->tab = tab;
+
+ rc = VectorAppend( &self->tabs, NULL, it );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot append tab '$(t)' to inputfiles", "t=%s", path ) );
+ free_input_table( it );
+ }
+ else
+ {
+ ++(self->table_count);
+ }
+ }
+ return rc;
+}
+
+
+static int cmp_pchar( const char * a, const char * b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+
+static rc_t contains_ref_and_alignments( const VDatabase * db, const char * path, bool * res, bool show_err )
+{
+ KNamelist *tables;
+ rc_t rc = VDatabaseListTbl ( db, &tables );
+ if ( rc != 0 )
+ {
+ if ( show_err )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "VDatabaseListTbl() failed on '$(t)'", "t=%s", path ) );
+ }
+ }
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( tables, &count );
+ if ( rc != 0 )
+ {
+ if ( show_err )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "KNamelistCount on Table-Names-List failed on '$(t)'", "t=%s", path ) );
+ }
+ }
+ else
+ {
+ uint32_t idx;
+ bool has_ref = false;
+ bool has_alignment = false;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * tabname;
+ rc = KNamelistGet ( tables, idx, &tabname );
+ if ( rc != 0 )
+ {
+ if ( show_err )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "KNamelistGet on Table-Names-List failed on '$(t)'", "t=%s", path ) );
+ }
+ }
+ else
+ {
+ if ( cmp_pchar( tabname, "REFERENCE" ) == 0 )
+ has_ref = true;
+ if ( cmp_pchar( tabname, "PRIMARY_ALIGNMENT" ) == 0 )
+ has_alignment = true;
+ }
+ }
+ *res = ( has_ref && has_alignment );
+ }
+ KNamelistRelease( tables );
+ }
+ return rc;
+}
+
+
+static rc_t open_database( input_files *self, const VDBManager *mgr,
+ const char * path, uint32_t reflist_options, bool show_err )
+{
+ const VDatabase * db;
+ rc_t rc = VDBManagerOpenDBRead( mgr, &db, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ if ( show_err )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open db '$(t)'", "t=%s", path ) );
+ }
+ }
+ else
+ {
+ bool has_alignments = false;
+ rc = contains_ref_and_alignments( db, path, &has_alignments, show_err );
+ if ( rc == 0 )
+ {
+ if ( has_alignments )
+ {
+ rc = append_database( self, db, path, reflist_options, show_err );
+ }
+ else
+ {
+ const VTable *tab;
+ rc = VDatabaseOpenTableRead ( db, &tab, "SEQUENCE" );
+ if ( rc != 0 )
+ {
+ if ( show_err )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open table SEQUENCE for '$(t)'", "t=%s", path ) );
+ }
+ }
+ else
+ {
+ rc = append_table( self, tab, path );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t open_table( input_files *self, const VDBManager *mgr, const char * path, bool show_error )
+{
+ const VTable * tab;
+
+ rc_t rc = VDBManagerOpenTableRead( mgr, &tab, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ struct VSchema* schema = NULL;
+ rc = VDBManagerMakeSRASchema( mgr, &schema );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot MakeSRASchema" );
+ }
+ else
+ {
+ rc = VDBManagerOpenTableRead( mgr, &tab, schema, "%s", path );
+ if ( rc != 0 )
+ {
+ if ( show_error )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open tab '$(t)'", "t=%s", path ) );
+ }
+ }
+ VSchemaRelease( schema );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = append_table( self, tab, path );
+
+ return rc;
+}
+
+
+static rc_t is_unknown( input_files *self, const char * path )
+{
+ rc_t rc = VNamelistAppend( self->not_found, path );
+ if ( rc == 0 )
+ ++( self->not_found_count );
+ return rc;
+}
+
+
+static rc_t split_input_files( input_files *self, const VDBManager *mgr,
+ const VNamelist * src, uint32_t reflist_options )
+{
+ uint32_t src_count;
+ rc_t rc = VNameListCount( src, &src_count );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "VNameListCount failed" );
+ }
+ else
+ {
+ uint32_t src_idx;
+ for ( src_idx = 0; src_idx < src_count && rc == 0 ; ++src_idx )
+ {
+ const char * path;
+ rc = VNameListGet( src, src_idx, &path );
+ if ( rc == 0 && path != NULL )
+ {
+ int path_type = VDBManagerPathType ( mgr, "%s", path );
+ if ( rc == 0 )
+ {
+ switch( path_type )
+ {
+ case kptDatabase : rc = open_database( self, mgr, path, reflist_options, true ); break;
+
+ case kptPrereleaseTbl :
+ case kptTable : rc = open_table( self, mgr, path, true ); break;
+
+ default : rc = is_unknown( self, path ); break;
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t discover_input_files( input_files **self, const VDBManager *mgr,
+ const VNamelist * src, uint32_t reflist_options )
+{
+ rc_t rc = 0;
+
+ input_files * ipf = calloc( sizeof * ipf, 1 );
+ *self = NULL;
+ if ( ipf == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "cannot create inputfiles structure" );
+ }
+ else
+ {
+ rc = VNamelistMake( &( ipf->not_found ), 5 );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot create inputfiles.not_found structure" );
+ else
+ {
+ VectorInit( &( ipf->dbs ), 0, 5 );
+ VectorInit( &( ipf->tabs ), 0, 5 );
+ rc = split_input_files( ipf, mgr, src, reflist_options );
+ }
+ if ( rc != 0 )
+ release_input_files( ipf );
+ else
+ *self = ipf;
+ }
+ return rc;
+}
+
+
+static void CC db_whack( void * item, void * data )
+{
+ input_database * id = ( input_database * )item;
+ free_input_database( id );
+}
+
+
+static void CC tab_whack( void * item, void * data )
+{
+ input_table * it = ( input_table * )item;
+ free( it->path );
+ VTableRelease( it->tab );
+ free( it );
+}
+
+
+void release_input_files( input_files *self )
+{
+ VectorWhack( &self->dbs, db_whack, NULL );
+ VectorWhack( &self->tabs, tab_whack, NULL );
+ VNamelistRelease( self->not_found );
+ free( self );
+}
diff --git a/tools/sra-pileup/inputfiles.h b/tools/sra-pileup/inputfiles.h
new file mode 100644
index 0000000..4698785
--- /dev/null
+++ b/tools/sra-pileup/inputfiles.h
@@ -0,0 +1,99 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_inputfiles_
+#define _h_inputfiles_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/namelist.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+
+#include <align/reference.h>
+#include <align/manager.h>
+
+/*
+ the VNamelist of input-files/accessions/uri's is tested one at a time
+ if it is: a database, a table or cannot be found
+ in case of a database : a vdb-db-handle is opened
+ in case of a table : a vdb-tab-handle is opened
+ in case of not found : name is put into the not-found list
+*/
+
+
+typedef struct input_database
+{
+ uint32_t db_idx;
+ char * path;
+ const VDatabase * db;
+ const ReferenceList *reflist;
+ void * prim_ctx;
+ void * sec_ctx;
+ void * ev_ctx;
+} input_database;
+
+
+typedef struct input_table
+{
+ char * path;
+ const VTable * tab;
+} input_table;
+
+
+
+typedef struct input_files
+{
+ uint32_t database_count;
+ uint32_t table_count;
+ uint32_t not_found_count;
+
+ Vector dbs;
+ Vector tabs;
+ VNamelist * not_found;
+} input_files;
+
+
+
+rc_t discover_input_files( input_files **self, const VDBManager *mgr,
+ const VNamelist * src, uint32_t reflist_options );
+
+void release_input_files( input_files *self );
+
+#endif
diff --git a/tools/sra-pileup/make_opt.pl b/tools/sra-pileup/make_opt.pl
new file mode 100755
index 0000000..cc2a7c9
--- /dev/null
+++ b/tools/sra-pileup/make_opt.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl -w
+
+my $ref = $ARGV[ 0 ];
+my $start = $ARGV[ 1 ];
+my $length = $ARGV[ 2 ];
+my $space = $ARGV[ 3 ];
+my $count = $ARGV[ 4 ];
+
+for ( my $i = 0; $i < $count; $i++ )
+{
+ printf "-r %s:%d-%d\n", $ref, $start, $start + $length;
+ $start += $space;
+}
diff --git a/tools/sra-pileup/matecache.c b/tools/sra-pileup/matecache.c
new file mode 100644
index 0000000..bbe2e9c
--- /dev/null
+++ b/tools/sra-pileup/matecache.c
@@ -0,0 +1,439 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "matecache.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+
+void release_matecache( matecache * const self )
+{
+ if ( self != NULL )
+ {
+ if ( self->per_file != NULL )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < self->count; ++idx )
+ {
+ if ( self->per_file[ idx ].same_ref_64 != NULL )
+ KVectorRelease( self->per_file[ idx ].same_ref_64 );
+ if ( self->per_file[ idx ].same_ref_16 != NULL )
+ KVectorRelease( self->per_file[ idx ].same_ref_16 );
+
+ if ( self->per_file[ idx ].unaligned_64_a != NULL )
+ KVectorRelease( self->per_file[ idx ].unaligned_64_a );
+ if ( self->per_file[ idx ].unaligned_64_b != NULL )
+ KVectorRelease( self->per_file[ idx ].unaligned_64_b );
+ }
+ free( self->per_file );
+ }
+ free( self );
+ }
+}
+
+
+rc_t make_matecache( matecache **self, uint32_t count )
+{
+ rc_t rc = 0;
+
+ matecache * mc = calloc( sizeof * mc, 1 );
+ *self = NULL;
+ if ( mc == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "cannot create matecache structure" );
+ }
+ else
+ {
+ mc->count = count;
+ mc->per_file = calloc( sizeof *(mc->per_file), count );
+ if ( mc->per_file == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "cannot create matecache internal structure" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ rc = KVectorMake( &( mc->per_file[ idx ].same_ref_64 ) );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot create KVector (same-ref) U64" );
+ else
+ {
+ rc = KVectorMake( &( mc->per_file[ idx ].same_ref_16 ) );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot create KVector (same-ref) U16" );
+ else
+ {
+ rc = KVectorMake( &( mc->per_file[ idx ].unaligned_64_a ) );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot create KVector (unaligned a) U64" );
+ else
+ {
+ rc = KVectorMake( &( mc->per_file[ idx ].unaligned_64_b ) );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot create KVector (unaligned b) U64" );
+ }
+ }
+ }
+ }
+ if ( rc == 0 )
+ *self = mc;
+ }
+ if ( rc != 0 )
+ release_matecache( mc );
+ }
+ return rc;
+}
+
+#if 0
+static int32_t calc_tlen( uint32_t self_pos, uint32_t mate_pos,
+ uint32_t self_len, uint32_t mate_len, uint32_t read_num )
+{
+ int32_t res = 0;
+ unsigned const self_left = self_pos;
+ unsigned const mate_left = mate_pos;
+ unsigned const self_right = self_left + self_len;
+ unsigned const mate_right = mate_left + mate_len;
+ unsigned const leftmost = (self_left < mate_left ) ? self_left : mate_left;
+ unsigned const rightmost = (self_right > mate_right) ? self_right : mate_right;
+ unsigned const tlen = rightmost - leftmost;
+
+ /* The standard says, "The leftmost segment has a plus sign and the rightmost has a minus sign." */
+ if ( ( self_left <= mate_left && self_right >= mate_right ) /* mate fully contained within self or */
+ || ( mate_left <= self_left && mate_right >= self_right ) ) /* self fully contained within mate; */
+ {
+ if ( self_left < mate_left || ( read_num == 1 && self_left == mate_left ) )
+ res = tlen;
+ else
+ res = -tlen;
+ }
+ else if ( ( self_right == mate_right && mate_left == leftmost ) /* both are rightmost, but mate is leftmost */
+ || self_right == rightmost )
+ {
+ res = -tlen;
+ }
+ else
+ res = tlen;
+
+ return res;
+}
+#endif
+
+static rc_t matecache_check( const matecache * const self, uint32_t db_idx, matecache_per_file ** mcpf )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ (void)LOGERR( klogErr, rc, "cannot insert into same-ref-cache" );
+ }
+ else if ( db_idx < self->count )
+ {
+ *mcpf = &self->per_file[ db_idx ];
+ if ( mcpf == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "cannot insert into same-ref-cache" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t matecache_insert_same_ref( matecache * const self,
+ uint32_t db_idx, int64_t key, INSDC_coord_zero ref_pos, uint32_t flags, INSDC_coord_len tlen )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ uint64_t ref_pos_and_tlen = ref_pos;
+ ref_pos_and_tlen <<= 32;
+ ref_pos_and_tlen |= tlen;
+ rc = KVectorSetU64( mcpf->same_ref_64, key, ref_pos_and_tlen );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot insert into KVector (same-ref) U64" );
+ else
+ {
+ rc = KVectorSetU16( mcpf->same_ref_16, key, flags );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot insert into KVector (same-ref) U16" );
+ }
+ if ( rc == 0 )
+ {
+ mcpf->stat_same_ref.count++;
+ if ( mcpf->stat_same_ref.count > mcpf->maxcount_same_ref )
+ mcpf->maxcount_same_ref = mcpf->stat_same_ref.count;
+ mcpf->stat_same_ref.inserts++;
+ }
+ }
+ return rc;
+}
+
+
+rc_t matecache_lookup_same_ref( const matecache * const self, uint32_t db_idx, int64_t key,
+ INSDC_coord_zero *ref_pos, uint32_t *flags, INSDC_coord_len *tlen )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ uint64_t value64;
+ mcpf->stat_same_ref.lookups++;
+ rc = KVectorGetU64( mcpf->same_ref_64, key, &value64 );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcNotFound )
+ (void)LOGERR( klogErr, rc, "cannot retrieve value (same-ref) U64" );
+ }
+ else
+ {
+ uint16_t value16;
+ rc = KVectorGetU16( mcpf->same_ref_16, key, &value16 );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcNotFound )
+ (void)LOGERR( klogErr, rc, "cannot retrieve value (same-ref) U16" );
+ }
+ else
+ {
+ *ref_pos = ( value64 >> 32 );
+ *tlen = ( value64 & 0xFFFFFFFF );
+ *flags = value16;
+ mcpf->stat_same_ref.finds++;
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t matecache_remove_same_ref( matecache * const self, uint32_t db_idx, int64_t key )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ rc = KVectorUnset( mcpf->same_ref_64, key );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot remove from same-ref-cache (64bit)" );
+ else
+ {
+ rc = KVectorUnset( mcpf->same_ref_16, key );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot remove from same-ref-cache (16bit)" );
+ }
+ if ( rc == 0 && mcpf->stat_same_ref.count > 0 )
+ mcpf->stat_same_ref.count--;
+ }
+ return rc;
+}
+
+
+static rc_t matecache_clear_same_ref_per_file( matecache_per_file * const mcpf )
+{
+ rc_t rc = KVectorRelease( mcpf->same_ref_64 );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot release same-ref-cache (64bit)" );
+ else
+ {
+ rc = KVectorRelease( mcpf->same_ref_16 );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot release same-ref-cache (16bit)" );
+ else
+ {
+ rc = KVectorMake( &mcpf->same_ref_64 );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot make same-ref-cache (64bit)" );
+ else
+ {
+ rc = KVectorMake( &mcpf->same_ref_16 );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot make same-ref-cache (16bit)" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t matecache_clear_same_ref( matecache * const self )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ (void)LOGERR( klogErr, rc, "cannot clear same-ref-cache" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < self->count && rc == 0; ++idx )
+ {
+ rc = matecache_clear_same_ref_per_file( &self->per_file[ idx ] );
+ }
+ self->flashes++;
+ }
+ return rc;
+}
+
+
+rc_t matecache_report( const matecache * const self )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ {
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ (void)LOGERR( klogErr, rc, "cannot report same-ref-cache" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < self->count && rc == 0; ++idx )
+ {
+ rc = KOutMsg( "on same reference:\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].maxcount = %,lu\n", idx, self->per_file[ idx ].maxcount_same_ref );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].inserts = %,lu\n", idx, self->per_file[ idx ].stat_same_ref.inserts );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].lookups = %,lu\n", idx, self->per_file[ idx ].stat_same_ref.lookups );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].finds = %,lu\n", idx, self->per_file[ idx ].stat_same_ref.finds );
+ if ( rc == 0 )
+ rc = KOutMsg( "unaligned:\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].count = %,lu\n", idx, self->per_file[ idx ].stat_unaligned.count );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].lookups = %,lu\n", idx, self->per_file[ idx ].stat_unaligned.lookups );
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache[ %u ].finds = %,lu\n", idx, self->per_file[ idx ].stat_unaligned.finds );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "matecache.flashes = %,lu\n", idx, self->flashes );
+ }
+ return rc;
+}
+
+
+rc_t matecache_insert_unaligned( matecache * const self,
+ uint32_t db_idx, int64_t key, INSDC_coord_zero ref_pos, uint32_t ref_idx, int64_t seq_id )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ uint64_t ref_pos_and_ref_idx = ref_pos;
+ ref_pos_and_ref_idx <<= 32;
+ ref_pos_and_ref_idx |= ref_idx;
+ rc = KVectorSetU64( mcpf->unaligned_64_a, key, ref_pos_and_ref_idx );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot insert into KVector (unaligned a) U64" );
+ else
+ {
+ rc = KVectorSetU64( mcpf->unaligned_64_b, key, seq_id );
+ if ( rc != 0 )
+ (void)LOGERR( klogErr, rc, "cannot insert into KVector (unaligned b) U64" );
+ }
+ if ( rc == 0 )
+ {
+ mcpf->stat_unaligned.count++;
+ mcpf->stat_unaligned.inserts++;
+ }
+ }
+ return rc;
+}
+
+
+rc_t matecache_lookup_unaligned( const matecache * const self, uint32_t db_idx, int64_t key,
+ INSDC_coord_zero * const ref_pos, uint32_t * const ref_idx, int64_t * const seq_id )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ uint64_t value64_a;
+ mcpf->stat_unaligned.lookups++;
+ rc = KVectorGetU64( mcpf->unaligned_64_a, key, &value64_a );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcNotFound )
+ (void)LOGERR( klogErr, rc, "cannot retrieve value (unaligned a) U64" );
+ }
+ else
+ {
+ uint64_t value64_b;
+ rc = KVectorGetU64( mcpf->unaligned_64_b, key, &value64_b );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcNotFound )
+ (void)LOGERR( klogErr, rc, "cannot retrieve value (unaligned b) U64" );
+ }
+ else
+ {
+ *seq_id = ( int64_t )value64_b;
+ *ref_pos = ( value64_a >> 32 );
+ *ref_idx = ( value64_a & 0xFFFFFFFF );
+ mcpf->stat_unaligned.finds++;
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct visit_ctx
+{
+ rc_t ( CC * f ) ( int64_t seq_id, int64_t al_id, void * user_data );
+ void * user_data;
+} visit_ctx;
+
+
+static rc_t CC on_seq_id( uint64_t key, int64_t value, void *user_data )
+{
+ visit_ctx * vctx = user_data;
+ return vctx->f( value, ( int64_t )key, vctx->user_data );
+}
+
+
+rc_t foreach_unaligned_entry( const matecache * const self,
+ uint32_t db_idx,
+ rc_t ( CC * f ) ( int64_t seq_id, int64_t al_id, void * user_data ),
+ void * user_data )
+{
+ matecache_per_file * mcpf = NULL;
+ rc_t rc = matecache_check( self, db_idx, &mcpf );
+ if ( rc == 0 )
+ {
+ visit_ctx vctx;
+ vctx.f = f;
+ vctx.user_data = user_data;
+ rc = KVectorVisitI64 ( mcpf->unaligned_64_b, false, on_seq_id, &vctx );
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/matecache.h b/tools/sra-pileup/matecache.h
new file mode 100644
index 0000000..0b8d9df
--- /dev/null
+++ b/tools/sra-pileup/matecache.h
@@ -0,0 +1,119 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_matecache_
+#define _h_matecache_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <insdc/sra.h>
+
+typedef struct matecache_stat
+{
+ uint64_t count;
+ uint64_t lookups;
+ uint64_t finds;
+ uint64_t inserts;
+} matecache_stat;
+
+
+typedef struct matecache_per_file
+{
+ KVector *same_ref_64; /* ref-pos and ref-idx */
+ KVector *same_ref_16; /* flags */
+
+ KVector *unaligned_64_a; /* ref-pos and ref-idx */
+ KVector *unaligned_64_b; /* seq_spot_id */
+
+ matecache_stat stat_same_ref;
+ matecache_stat stat_unaligned;
+ uint64_t maxcount_same_ref;
+} matecache_per_file;
+
+
+typedef struct matecache
+{
+ matecache_per_file *per_file;
+ uint32_t count;
+ uint32_t flashes;
+} matecache;
+
+
+/* general cache functions */
+
+rc_t make_matecache( matecache **self, uint32_t count );
+
+void release_matecache( matecache * const self );
+
+rc_t matecache_clear_same_ref( matecache * const self );
+
+rc_t matecache_report( const matecache * const self );
+
+
+/* cache functions for aligned mates on the same reference */
+
+rc_t matecache_insert_same_ref( matecache * const self,
+ uint32_t db_idx, int64_t key, INSDC_coord_zero ref_pos, uint32_t flags, INSDC_coord_len tlen );
+
+rc_t matecache_lookup_same_ref( const matecache * const self, uint32_t db_idx, int64_t key,
+ INSDC_coord_zero *ref_pos, uint32_t *flags, INSDC_coord_len *tlen );
+
+rc_t matecache_remove_same_ref( matecache * const self, uint32_t db_idx, int64_t key );
+
+
+/* cache functions for half aligned mates */
+
+/*
+ db_idx ... index, what input-file did the alignment come from
+ key ... row-id of aligned half
+ pos ... position of the aligned half
+ flags ... sam-flags of the aligned half
+ ref_idx ... idx of reference the aligned half aligns to
+*/
+
+rc_t matecache_insert_unaligned( matecache * const self,
+ uint32_t db_idx, int64_t key, INSDC_coord_zero ref_pos, uint32_t ref_idx, int64_t seq_id );
+
+rc_t matecache_lookup_unaligned( const matecache * const self, uint32_t db_idx, int64_t key,
+ INSDC_coord_zero * const ref_pos, uint32_t * const ref_idx, int64_t * const seq_id );
+
+rc_t foreach_unaligned_entry( const matecache * const self,
+ uint32_t db_idx,
+ rc_t ( CC * f ) ( int64_t seq_id, int64_t al_id, void * user_data ),
+ void * user_data );
+
+
+#endif
diff --git a/tools/sra-pileup/md_flag.c b/tools/sra-pileup/md_flag.c
new file mode 100644
index 0000000..491d475
--- /dev/null
+++ b/tools/sra-pileup/md_flag.c
@@ -0,0 +1,268 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/printf.h>
+#include <klib/out.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "md_flag.h"
+
+struct cigar_t
+{
+ char * op;
+ int * count;
+ size_t size, length;
+};
+
+
+static void init_cigar_t( struct cigar_t * c, size_t size )
+{
+ if ( c != NULL )
+ {
+ c->size = 0;
+ c->length = 0;
+ c->op = malloc( sizeof( c->op[ 0 ] ) * size );
+ if ( c->op != NULL )
+ {
+ c->count = malloc( sizeof( c->count[ 0 ] ) * size );
+ if ( c->count != NULL )
+ c->size = size;
+ else
+ free( ( void * ) c->op );
+ }
+ }
+}
+
+static void resize_cigar_t( struct cigar_t * c, size_t new_size )
+{
+ if ( c != NULL )
+ {
+ if ( c->size == 0 )
+ init_cigar_t( c, new_size );
+ else if ( c->size < new_size )
+ {
+ char * temp_op = c->op;
+ c->op = realloc( c->op, sizeof( c->op[ 0 ] ) * new_size );
+ if ( c->op != NULL )
+ {
+ int * temp_count = c->count;
+ c->count = realloc( c->count, sizeof( c->count[ 0 ] ) * new_size );
+ if ( c->count != NULL )
+ c->size = new_size;
+ else
+ c->count = temp_count;
+ }
+ else
+ c->op = temp_op;
+ }
+ }
+}
+
+static void append_to_cigar_t( struct cigar_t * c, char op, int count )
+{
+ if ( c->length < c->size )
+ {
+ c->op[ c->length ] = op;
+ c->count[ c->length ++ ] = count;
+ }
+}
+
+void parse_cigar_t( struct cigar_t * c, const char * cigar_str )
+{
+ if ( c != NULL && cigar_str != NULL && cigar_str[ 0 ] != 0 )
+ {
+ resize_cigar_t( c, strlen( cigar_str ) );
+ if ( c->size > 0 )
+ {
+ int count = 0;
+ while ( *cigar_str != 0 && c->length < c->size )
+ {
+ if ( isdigit( *cigar_str ) )
+ {
+ count = ( count * 10 ) + ( *cigar_str - '0' );
+ }
+ else
+ {
+ if ( count == 0 ) count = 1;
+ append_to_cigar_t( c, *cigar_str, count );
+ count = 0;
+ }
+ cigar_str++;
+ }
+ }
+ }
+}
+
+struct cigar_t * make_cigar_t( const char * cigar_str, const size_t cigar_len )
+{
+ struct cigar_t * res = malloc( sizeof * res );
+ if ( res != NULL )
+ {
+ size_t size;
+ if ( cigar_str != NULL && cigar_str[ 0 ] != 0 && cigar_len > 0 )
+ size = cigar_len;
+ else
+ size = 1024;
+ init_cigar_t( res, size );
+ if ( res->size == size )
+ parse_cigar_t( res, cigar_str );
+ }
+ return res;
+}
+
+
+void free_cigar_t( struct cigar_t * c )
+{
+ if ( c != NULL )
+ {
+ if ( c->op != NULL )
+ {
+ free( ( void * ) c->op );
+ c->op = NULL;
+ }
+ if ( c->count != NULL )
+ {
+ free( ( void * ) c->count );
+ c->count = NULL;
+ }
+ free( ( void * ) c );
+ }
+}
+
+
+static rc_t kout_delete( int count, int *match_count,
+ const uint8_t * ref, const INSDC_coord_len ref_len, int *ref_idx )
+{
+ rc_t rc = 0;
+
+ if ( *match_count > 0 )
+ {
+ rc = KOutMsg( "%d", *match_count );
+ *match_count = 0;
+ }
+
+ if ( rc == 0 )
+ {
+ if ( ( *ref_idx + count ) < ref_len )
+ {
+ rc = KOutMsg( "^%.*s", count, &(ref[ *ref_idx ] ) );
+ (*ref_idx) += count;
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcItem, rcIncomplete );
+ }
+ return rc;
+}
+
+
+static rc_t kout_match( int count, int *match_count,
+ const char * read, size_t read_len, int *read_idx,
+ const uint8_t *ref, const INSDC_coord_len ref_len, int *ref_idx )
+{
+ rc_t rc = 0;
+ int i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ if ( *read_idx < read_len && *ref_idx < ref_len )
+ {
+ if ( read[ (*read_idx)++ ] == ref[ *ref_idx ] )
+ {
+ (*match_count)++;
+ }
+ else
+ {
+ rc = KOutMsg( "%d%c", *match_count, ref[ *ref_idx ] );
+ *match_count = 0;
+ }
+ (*ref_idx)++;
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcItem, rcIncomplete );
+ }
+ return rc;
+}
+
+
+static rc_t kout_tag( const struct cigar_t * c,
+ const char * read,
+ const size_t read_len,
+ const uint8_t * ref,
+ const INSDC_coord_len ref_len )
+{
+ rc_t rc = 0;
+ if ( c != NULL && read != NULL && read_len > 0 && ref != NULL && ref_len > 0 )
+ {
+ rc = KOutMsg( "\tMD:Z:" );
+ if ( rc == 0 )
+ {
+ int read_idx = 0;
+ int ref_idx = 0;
+ int match_count = 0;
+ int cigar_idx;
+ for ( cigar_idx = 0; cigar_idx < c->length && rc == 0; ++cigar_idx )
+ {
+ int count = c->count[ cigar_idx ];
+ switch ( c->op[ cigar_idx ] )
+ {
+ case 'D' : rc = kout_delete( count, &match_count, ref, ref_len, &ref_idx ); break;
+
+ case 'I' : read_idx += count; break;
+
+ case 'M' : rc = kout_match( count, &match_count, read, read_len, &read_idx, ref, ref_len, &ref_idx ); break;
+ }
+ }
+ if ( rc == 0 && match_count > 0 )
+ rc = KOutMsg( "%d", match_count );
+ }
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcIncomplete );
+ return rc;
+}
+
+
+rc_t kout_md_tag_from_cigar_string( const char * cigar_str,
+ const size_t cigar_len,
+ const char * read,
+ const size_t read_len,
+ const uint8_t * ref,
+ const INSDC_coord_len ref_len )
+{
+ rc_t rc = 0;
+ struct cigar_t * cigar = make_cigar_t( cigar_str, cigar_len );
+ if ( cigar == NULL )
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcItem, rcIncomplete );
+ else
+ {
+ rc = kout_tag( cigar, read, read_len, ref, ref_len );
+ free_cigar_t( cigar );
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/md_flag.h b/tools/sra-pileup/md_flag.h
new file mode 100644
index 0000000..f430e94
--- /dev/null
+++ b/tools/sra-pileup/md_flag.h
@@ -0,0 +1,48 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_md_flag_
+#define _h_md_flag_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/rc.h>
+#include <insdc/insdc.h>
+
+rc_t kout_md_tag_from_cigar_string( const char * cigar_str,
+ const size_t cigar_len,
+ const char * read,
+ const size_t read_len,
+ const uint8_t * ref,
+ const INSDC_coord_len ref_len );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/sra-pileup/out_redir.c b/tools/sra-pileup/out_redir.c
new file mode 100644
index 0000000..c089d78
--- /dev/null
+++ b/tools/sra-pileup/out_redir.c
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "out_redir.h"
+
+#include <kfs/directory.h>
+#include <kfs/buffile.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+#include <sysalloc.h>
+
+static rc_t CC out_redir_callback( void * self, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+ out_redir * redir = ( out_redir * )self;
+ rc_t rc = KFileWriteAll( redir->kfile, redir->pos, buffer, bufsize, num_writ );
+ if ( rc == 0 )
+ redir->pos += *num_writ;
+ return rc;
+}
+
+
+rc_t init_out_redir( out_redir * self, enum out_redir_mode mode, const char * filename, size_t bufsize )
+{
+ rc_t rc;
+ KFile *output_file;
+
+ if ( filename != NULL )
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ else
+ {
+ rc = KDirectoryCreateFile ( dir, &output_file, false, 0664, kcmInit, "%s", filename );
+ KDirectoryRelease( dir );
+ }
+ }
+ else
+ rc = KFileMakeStdOut ( &output_file );
+
+ if ( rc == 0 )
+ {
+ KFile *temp_file;
+
+ /* wrap the output-file in compression, if requested */
+ switch ( mode )
+ {
+ case orm_gzip : rc = KFileMakeGzipForWrite( &temp_file, output_file ); break;
+ case orm_bzip2 : rc = KFileMakeBzip2ForWrite( &temp_file, output_file ); break;
+ case orm_uncompressed : break;
+ }
+ if ( rc == 0 )
+ {
+ if ( mode != orm_uncompressed )
+ {
+ KFileRelease( output_file );
+ output_file = temp_file;
+ }
+
+ /* wrap the output/compressed-file in buffering, if requested */
+ if ( bufsize != 0 )
+ {
+ rc = KBufFileMakeWrite( &temp_file, output_file, false, bufsize );
+ if ( rc == 0 )
+ {
+ KFileRelease( output_file );
+ output_file = temp_file;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ self->kfile = output_file;
+ self->org_writer = KOutWriterGet();
+ self->org_data = KOutDataGet();
+ self->pos = 0;
+ rc = KOutHandlerSet( out_redir_callback, self );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+void release_out_redir( out_redir * self )
+{
+ KFileRelease( self->kfile );
+ if( self->org_writer != NULL )
+ {
+ KOutHandlerSet( self->org_writer, self->org_data );
+ }
+ self->org_writer = NULL;
+}
+
diff --git a/tools/sra-pileup/out_redir.h b/tools/sra-pileup/out_redir.h
new file mode 100644
index 0000000..6eacab5
--- /dev/null
+++ b/tools/sra-pileup/out_redir.h
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_out_redir_
+#define _h_out_redir_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+
+enum out_redir_mode
+{
+ orm_uncompressed = 0,
+ orm_gzip,
+ orm_bzip2
+};
+
+
+/* GLOBAL VARIABLES */
+typedef struct out_redir
+{
+ KWrtWriter org_writer;
+ void* org_data;
+ KFile* kfile;
+ uint64_t pos;
+} out_redir;
+
+
+rc_t init_out_redir( out_redir * self, enum out_redir_mode mode, const char * filename, size_t bufsize );
+
+void release_out_redir( out_redir * self );
+
+#endif
diff --git a/tools/sra-pileup/perf_log.c b/tools/sra-pileup/perf_log.c
new file mode 100644
index 0000000..e21b475
--- /dev/null
+++ b/tools/sra-pileup/perf_log.c
@@ -0,0 +1,273 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/time.h>
+#include <klib/printf.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <stdarg.h>
+
+typedef struct perf_log perf_log;
+struct perf_log
+{
+ KFile * perf_log_file;
+ KTime time_stamp;
+ const char * tool_name;
+ const char * section_name;
+ const char * sub_section_name;
+
+ KTime_t tool_start;
+ KTime_t section_start;
+ KTime_t sub_section_start;
+ KTime_t chunk_start;
+
+ uint64_t file_pos;
+ uint64_t counter;
+ uint64_t limit;
+};
+
+
+const char * perf_log_unknown = "unknown";
+
+static const char * value_or_unknown( const char * value )
+{
+ const char * s;
+ if ( value == NULL ) s = perf_log_unknown; else s = value;
+ return s;
+}
+
+
+static void perf_log_write_args( struct perf_log * pl, const char *fmt, va_list vargs )
+{
+ if ( pl != NULL )
+ {
+ char buffer[ 1024 ];
+ size_t num_writ;
+ rc_t rc = string_vprintf ( buffer, sizeof buffer, &num_writ, fmt, vargs );
+ if ( rc == 0 )
+ {
+ size_t num_writ_2;
+ rc = KFileWriteAll ( pl->perf_log_file, pl->file_pos, buffer, num_writ, &num_writ_2 );
+ if ( rc == 0 )
+ pl->file_pos += num_writ_2;
+ }
+ }
+}
+
+
+static void perf_log_write( struct perf_log * pl, const char *fmt, ... )
+{
+ if ( pl != NULL )
+ {
+ va_list args;
+
+ va_start ( args, fmt );
+ perf_log_write_args ( pl, fmt, args );
+ va_end ( args );
+ }
+}
+
+
+static void write_tool_start( struct perf_log * pl )
+{
+ KTime t;
+ KTimeLocal ( &t, pl->tool_start );
+ perf_log_write( pl, "start >%s< at %T\n", value_or_unknown( pl->tool_name ), &t );
+}
+
+
+static void write_tool_end( struct perf_log * pl )
+{
+ KTime_t tool_end = KTimeStamp();
+ KTime t;
+ KTimeLocal ( &t, tool_end );
+ perf_log_write( pl, "end.. >%s< at %T ( %lu seconds )\n",
+ value_or_unknown( pl->tool_name ), &t, ( tool_end - pl->tool_start ) );
+}
+
+struct perf_log * make_perf_log( const char * filename, const char * toolname )
+{
+ struct perf_log * res = NULL;
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir ( &dir );
+ if ( rc == 0 )
+ {
+ KFile * f;
+ rc = KDirectoryCreateFile ( dir, &f, false, 0664, kcmInit, "%s", filename );
+ if ( rc == 0 )
+ {
+ res = malloc( sizeof * res );
+ if ( res != NULL )
+ {
+ res->perf_log_file = f;
+ KTimeLocal ( &res->time_stamp, KTimeStamp() );
+ if ( toolname != NULL )
+ res->tool_name = string_dup_measure ( toolname, NULL );
+ else
+ res->tool_name = NULL;
+ res->section_name = NULL;
+ res->sub_section_name = NULL;
+ res->tool_start = KTimeStamp();
+ res->section_start = res->tool_start;
+ res->sub_section_start = res->tool_start;
+ res->chunk_start = res->tool_start;
+
+ res->file_pos = 0;
+ res->counter = 0;
+ res->limit = 10000;
+ write_tool_start( res );
+ }
+ else
+ KFileRelease ( f );
+ }
+ KDirectoryRelease ( dir );
+ }
+ return res;
+}
+
+
+void free_perf_log( struct perf_log * pl )
+{
+ if ( pl != NULL )
+ {
+ write_tool_end( pl );
+ KFileRelease ( pl->perf_log_file );
+ if ( pl->tool_name != NULL ) free( ( void * )pl->tool_name );
+ free( ( void * ) pl );
+ }
+}
+
+
+void perf_log_start_section( struct perf_log * pl, const char * section_name )
+{
+ if ( pl != NULL )
+ {
+ KTime t;
+ pl->section_start = KTimeStamp();
+ KTimeLocal ( &t, pl->section_start );
+
+ if ( pl->section_name != NULL ) free( ( void * ) pl->section_name );
+ if ( section_name != NULL )
+ pl->section_name = string_dup_measure ( section_name, NULL );
+ else
+ pl->section_name = NULL;
+
+ perf_log_write( pl, "start [%s] at %T\n",
+ value_or_unknown( pl->section_name ), &t );
+ }
+}
+
+
+void perf_log_end_section( struct perf_log * pl )
+{
+ if ( pl != NULL )
+ {
+ KTime_t section_end = KTimeStamp();
+ KTime t;
+ KTimeLocal ( &t, section_end );
+ perf_log_write( pl, "end.. [%s] at %T ( %lu seconds )\n",
+ value_or_unknown( pl->section_name ), &t, ( section_end - pl->section_start ) );
+
+ if ( pl->section_name != NULL )
+ {
+ free( ( void * ) pl->section_name );
+ pl->section_name = NULL;
+ }
+ }
+}
+
+
+void perf_log_start_sub_section( struct perf_log * pl, const char * sub_section_name )
+{
+ if ( pl != NULL )
+ {
+ KTime t;
+ pl->sub_section_start = KTimeStamp();
+ pl->chunk_start = pl->sub_section_start;
+ pl->counter = 0;
+ KTimeLocal ( &t, pl->sub_section_start );
+
+ if ( pl->sub_section_name != NULL ) free( ( void * ) pl->sub_section_name );
+ if ( sub_section_name != NULL )
+ pl->sub_section_name = string_dup_measure ( sub_section_name, NULL );
+ else
+ pl->sub_section_name = NULL;
+
+ perf_log_write( pl, "start (%s) at %T\n",
+ value_or_unknown( pl->sub_section_name ), &t );
+ }
+}
+
+
+void perf_log_end_sub_section( struct perf_log * pl )
+{
+ if ( pl != NULL )
+ {
+ KTime_t sub_section_end = KTimeStamp();
+ KTime t;
+ KTimeLocal ( &t, sub_section_end );
+ perf_log_write( pl, "end.. (%s) at %T ( %lu seconds )\n",
+ value_or_unknown( pl->sub_section_name ), &t, ( sub_section_end - pl->sub_section_start ) );
+
+ if ( pl->sub_section_name != NULL )
+ {
+ free( ( void * ) pl->sub_section_name );
+ pl->sub_section_name = NULL;
+ }
+ }
+}
+
+
+static uint64_t lpm( uint64_t seconds, uint64_t written )
+{
+ uint64_t res = 0;
+ if ( seconds > 0 )
+ res = ( written * 60 ) / seconds;
+ return res;
+}
+
+
+void perf_log_line( struct perf_log * pl, uint64_t pos )
+{
+ if ( pl != NULL )
+ {
+ pl->counter++;
+ if ( pl->counter > pl->limit )
+ {
+ KTime_t chunk_end = KTimeStamp();
+ uint64_t seconds = ( chunk_end - pl->chunk_start );
+
+ perf_log_write( pl, "%lu lines in %lu seconds, at %lu, lpm = %lu\n",
+ pl->limit, seconds, pos, lpm( seconds, pl->counter ) );
+
+ pl->counter = 0;
+ pl->chunk_start = chunk_end;
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/sra-pileup/perf_log.h b/tools/sra-pileup/perf_log.h
new file mode 100644
index 0000000..7ca9d13
--- /dev/null
+++ b/tools/sra-pileup/perf_log.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_perf_log_
+#define _h_perf_log_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct perf_log;
+
+struct perf_log * make_perf_log( const char * filename, const char * toolname );
+void free_perf_log( struct perf_log * pl );
+
+void perf_log_start_section( struct perf_log * pl, const char * section_name );
+void perf_log_end_section( struct perf_log * pl );
+
+void perf_log_start_sub_section( struct perf_log * pl, const char * sub_section_name );
+void perf_log_end_sub_section( struct perf_log * pl );
+
+void perf_log_line( struct perf_log * pl, uint64_t pos );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_perf_log_ */
diff --git a/tools/sra-pileup/pileup_counters.c b/tools/sra-pileup/pileup_counters.c
new file mode 100644
index 0000000..b490139
--- /dev/null
+++ b/tools/sra-pileup/pileup_counters.c
@@ -0,0 +1,447 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+static uint32_t percent( uint32_t v1, uint32_t v2 )
+{
+ uint32_t sum = v1 + v2;
+ uint32_t res = 0;
+ if ( sum > 0 )
+ res = ( ( v1 * 100 ) / sum );
+ return res;
+}
+
+typedef struct indel_fragment
+{
+ BSTNode node;
+ const char * bases;
+ uint32_t len;
+ uint32_t count;
+} indel_fragment;
+
+
+static indel_fragment * make_indel_fragment( const char * bases, uint32_t len )
+{
+ indel_fragment * res = malloc( sizeof * res );
+ if ( res != NULL )
+ {
+ res->bases = string_dup ( bases, len );
+ if ( res->bases == NULL )
+ {
+ free( res );
+ res = NULL;
+ }
+ else
+ {
+ res->len = len;
+ res->count = 1;
+ }
+ }
+ return res;
+}
+
+
+static void CC free_indel_fragment( BSTNode * n, void * data )
+{
+ indel_fragment * fragment = ( indel_fragment * ) n;
+ if ( fragment != NULL )
+ {
+ free( ( void * ) fragment->bases );
+ free( fragment );
+ }
+}
+
+
+static void free_fragments( BSTree * fragments )
+{
+ BSTreeWhack ( fragments, free_indel_fragment, NULL );
+}
+
+
+typedef struct find_fragment_ctx
+{
+ const char * bases;
+ uint32_t len;
+} find_fragment_ctx;
+
+
+static int64_t CC cmp_fragment_vs_find_ctx( const void *item, const BSTNode *n )
+{
+ const indel_fragment * fragment = ( const indel_fragment * )n;
+ const find_fragment_ctx * fctx = ( const find_fragment_ctx * )item;
+ return string_cmp ( fctx->bases, fctx->len, fragment->bases, fragment->len, -1 );
+}
+
+
+static int64_t CC cmp_fragment_vs_fragment( const BSTNode *item, const BSTNode *n )
+{
+ const indel_fragment * f1 = ( const indel_fragment * )item;
+ const indel_fragment * f2 = ( const indel_fragment * )n;
+ return string_cmp ( f1->bases, f1->len, f2->bases, f2->len, -1 );
+}
+
+
+static void count_indel_fragment( BSTree * fragments, const INSDC_4na_bin *bases, uint32_t len )
+{
+ find_fragment_ctx fctx;
+
+ fctx.bases = malloc( len );
+ if ( fctx.bases != NULL )
+ {
+ indel_fragment * fragment;
+ uint32_t i;
+
+ fctx.len = len;
+ for ( i = 0; i < len; ++i )
+ ( ( char * )fctx.bases )[ i ] = _4na_to_ascii( bases[ i ], false );
+
+ fragment = ( indel_fragment * ) BSTreeFind ( fragments, &fctx, cmp_fragment_vs_find_ctx );
+ if ( fragment == NULL )
+ {
+ fragment = make_indel_fragment( fctx.bases, len );
+ if ( fragment != NULL )
+ {
+ rc_t rc = BSTreeInsert ( fragments, ( BSTNode * )fragment, cmp_fragment_vs_fragment );
+ if ( rc != 0 )
+ free_indel_fragment( ( BSTNode * )fragment, NULL );
+ }
+ }
+ else
+ fragment->count++;
+
+ free( ( void * ) fctx.bases );
+ }
+}
+
+
+typedef struct walk_fragment_ctx
+{
+ rc_t rc;
+ uint32_t n;
+} walk_fragment_ctx;
+
+
+static void CC on_fragment( BSTNode *n, void *data )
+{
+ walk_fragment_ctx * wctx = data;
+ const indel_fragment * fragment = ( const indel_fragment * )n;
+ if ( wctx->rc == 0 )
+ {
+ if ( wctx->n == 0 )
+ wctx->rc = KOutMsg( "%u-%.*s", fragment->count, fragment->len, fragment->bases );
+ else
+ wctx->rc = KOutMsg( "|%u-%.*s", fragment->count, fragment->len, fragment->bases );
+ wctx->n++;
+ }
+}
+
+
+static rc_t print_fragments( BSTree * fragments )
+{
+ walk_fragment_ctx wctx;
+ wctx.rc = 0;
+ wctx.n = 0;
+ BSTreeForEach ( fragments, false, on_fragment, &wctx );
+ return wctx.rc;
+}
+
+/* =========================================================================================== */
+
+typedef struct pileup_counters
+{
+ uint32_t matches;
+ uint32_t mismatches[ 4 ];
+ uint32_t inserts;
+ uint32_t deletes;
+ uint32_t forward;
+ uint32_t reverse;
+ uint32_t starting;
+ uint32_t ending;
+ BSTree insert_fragments;
+ BSTree delete_fragments;
+} pileup_counters;
+
+
+static void clear_counters( pileup_counters * counters )
+{
+ uint32_t i;
+
+ counters->matches = 0;
+ for ( i = 0; i < 4; ++i )
+ counters->mismatches[ i ] = 0;
+ counters->inserts = 0;
+ counters->deletes = 0;
+ counters->forward = 0;
+ counters->reverse = 0;
+ counters->starting = 0;
+ counters->ending = 0;
+ BSTreeInit( &(counters->insert_fragments) );
+ BSTreeInit( &(counters->delete_fragments) );
+}
+
+
+static void walk_counter_state( ReferenceIterator *ref_iter, int32_t state, bool reverse,
+ pileup_counters * counters )
+{
+ if ( ( state & align_iter_invalid ) == align_iter_invalid )
+ return;
+
+ if ( ( state & align_iter_skip ) != align_iter_skip )
+ {
+ if ( ( state & align_iter_match ) == align_iter_match )
+ (counters->matches)++;
+ else
+ {
+ char c = _4na_to_ascii( state, false );
+ switch( c )
+ {
+ case 'A' : ( counters->mismatches[ 0 ] )++; break;
+ case 'C' : ( counters->mismatches[ 1 ] )++; break;
+ case 'G' : ( counters->mismatches[ 2 ] )++; break;
+ case 'T' : ( counters->mismatches[ 3 ] )++; break;
+ }
+ }
+ }
+
+ if ( reverse )
+ (counters->reverse)++;
+ else
+ (counters->forward)++;
+
+ if ( ( state & align_iter_insert ) == align_iter_insert )
+ {
+ const INSDC_4na_bin *bases;
+ uint32_t n = ReferenceIteratorBasesInserted ( ref_iter, &bases );
+ (counters->inserts) += n;
+ count_indel_fragment( &(counters->insert_fragments), bases, n );
+ }
+
+ if ( ( state & align_iter_delete ) == align_iter_delete )
+ {
+ const INSDC_4na_bin *bases;
+ INSDC_coord_zero ref_pos;
+ uint32_t n = ReferenceIteratorBasesDeleted ( ref_iter, &ref_pos, &bases );
+ if ( bases != NULL )
+ {
+ (counters->deletes) += n;
+ count_indel_fragment( &(counters->delete_fragments), bases, n );
+ free( (void *) bases );
+ }
+ }
+
+ if ( ( state & align_iter_first ) == align_iter_first )
+ ( counters->starting)++;
+
+ if ( ( state & align_iter_last ) == align_iter_last )
+ ( counters->ending)++;
+}
+
+
+static rc_t print_counter_line( const char * ref_name,
+ INSDC_coord_zero ref_pos,
+ INSDC_4na_bin ref_base,
+ uint32_t depth,
+ pileup_counters * counters )
+{
+ char c = _4na_to_ascii( ref_base, false );
+
+ rc_t rc = KOutMsg( "%s\t%u\t%c\t%u\t", ref_name, ref_pos + 1, c, depth );
+
+ if ( rc == 0 && counters->matches > 0 )
+ rc = KOutMsg( "%u", counters->matches );
+
+ if ( rc == 0 /* && counters->mismatches[ 0 ] > 0 */ )
+ rc = KOutMsg( "\t%u-A", counters->mismatches[ 0 ] );
+
+ if ( rc == 0 /* && counters->mismatches[ 1 ] > 0 */ )
+ rc = KOutMsg( "\t%u-C", counters->mismatches[ 1 ] );
+
+ if ( rc == 0 /* && counters->mismatches[ 2 ] > 0 */ )
+ rc = KOutMsg( "\t%u-G", counters->mismatches[ 2 ] );
+
+ if ( rc == 0 /* && counters->mismatches[ 3 ] > 0 */ )
+ rc = KOutMsg( "\t%u-T", counters->mismatches[ 3 ] );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\tI:" );
+ if ( rc == 0 )
+ rc = print_fragments( &(counters->insert_fragments) );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\tD:" );
+ if ( rc == 0 )
+ rc = print_fragments( &(counters->delete_fragments) );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\t%u%%", percent( counters->forward, counters->reverse ) );
+
+ if ( rc == 0 && counters->starting > 0 )
+ rc = KOutMsg( "\tS%u", counters->starting );
+
+ if ( rc == 0 && counters->ending > 0 )
+ rc = KOutMsg( "\tE%u", counters->ending );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ free_fragments( &(counters->insert_fragments) );
+ free_fragments( &(counters->delete_fragments) );
+
+ return rc;
+}
+
+
+/* ........................................................................................... */
+
+
+static rc_t CC walk_counters_enter_ref_pos( walk_data * data )
+{
+ clear_counters( data->data );
+ return 0;
+}
+
+static rc_t CC walk_counters_exit_ref_pos( walk_data * data )
+{
+ rc_t rc = print_counter_line( data->ref_name, data->ref_pos, data->ref_base, data->depth, data->data );
+ return rc;
+}
+
+static rc_t CC walk_counters_placement( walk_data * data )
+{
+ walk_counter_state( data->ref_iter, data->state, data->xrec->reverse, data->data );
+ return 0;
+}
+
+rc_t walk_counters( ReferenceIterator *ref_iter, pileup_options *options )
+{
+ walk_data data;
+ walk_funcs funcs;
+ pileup_counters counters;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = NULL;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_counters_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_counters_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_counters_placement;
+
+ return walk_0( &data, &funcs );
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t print_mismatches_line( const char * ref_name,
+ INSDC_coord_zero ref_pos,
+ uint32_t depth,
+ uint32_t min_mismatch_percent,
+ pileup_counters * counters )
+{
+ rc_t rc = 0;
+ if ( depth > 0 )
+ {
+ uint32_t total_mismatches = counters->mismatches[ 0 ] +
+ counters->mismatches[ 1 ] +
+ counters->mismatches[ 2 ] +
+ counters->mismatches[ 3 ];
+ if ( total_mismatches * 100 >= min_mismatch_percent * depth)
+ {
+ rc = KOutMsg( "%s\t%u\t%u\t%u\n", ref_name, ref_pos + 1, depth, total_mismatches );
+ }
+ }
+
+ free_fragments( &(counters->insert_fragments) );
+ free_fragments( &(counters->delete_fragments) );
+
+ return rc;
+}
+
+
+/* ........................................................................................... */
+
+
+static rc_t CC walk_mismatches_enter_ref_pos( walk_data * data )
+{
+ clear_counters( data->data );
+ return 0;
+}
+
+static rc_t CC walk_mismatches_exit_ref_pos( walk_data * data )
+{
+ rc_t rc = print_mismatches_line( data->ref_name, data->ref_pos,
+ data->depth, data->options->min_mismatch, data->data );
+ return rc;
+}
+
+static rc_t CC walk_mismatches_placement( walk_data * data )
+{
+ walk_counter_state( data->ref_iter, data->state, data->xrec->reverse, data->data );
+ return 0;
+}
+
+
+rc_t walk_mismatches( ReferenceIterator *ref_iter, pileup_options * options )
+{
+ walk_data data;
+ walk_funcs funcs;
+ pileup_counters counters;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = NULL;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_mismatches_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_mismatches_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_mismatches_placement;
+
+ return walk_0( &data, &funcs );
+}
diff --git a/tools/sra-pileup/pileup_counters.h b/tools/sra-pileup/pileup_counters.h
new file mode 100644
index 0000000..f70f3a7
--- /dev/null
+++ b/tools/sra-pileup/pileup_counters.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_counters_
+#define _h_pileup_counters_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t walk_counters( ReferenceIterator *ref_iter, pileup_options *options );
+rc_t walk_mismatches( ReferenceIterator *ref_iter, pileup_options * options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_counters_ */
diff --git a/tools/sra-pileup/pileup_indels.c b/tools/sra-pileup/pileup_indels.c
new file mode 100644
index 0000000..ea10cea
--- /dev/null
+++ b/tools/sra-pileup/pileup_indels.c
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+typedef struct indel_counters
+{
+ uint32_t coverage;
+ uint32_t deletes;
+ uint32_t inserts;
+} indel_counters;
+
+
+static rc_t CC walk_indels_enter_ref_pos( walk_data * data )
+{
+ indel_counters * vc = data->data;
+ memset( vc, 0, sizeof *vc );
+ return 0;
+}
+
+
+static rc_t CC walk_indels_exit_ref_pos( walk_data * data )
+{
+ rc_t rc = 0;
+ if ( data->depth > 0 )
+ {
+ indel_counters * vc = data->data;
+ if ( ( vc -> deletes + vc -> inserts ) > 0 )
+ {
+ char ref_base = _4na_to_ascii( data->ref_base, false );
+
+/*
+ A ... ref-name
+ B ... ref-pos
+ C ... ref-base
+ D ... coverage
+
+ E ... total deletes
+ F ... total insertes
+ A B C D E F
+*/
+ rc = KOutMsg( "%s\t%u\t%c\t%u\t%u\t%u\n",
+ data->ref_name, data->ref_pos + 1, ref_base, data->depth,
+ vc->deletes, vc->inserts );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t CC walk_indels_placement( walk_data * data )
+{
+ int32_t state = data->state;
+ if ( ( state & align_iter_invalid ) != align_iter_invalid )
+ {
+ indel_counters * vc = data->data;
+
+ if ( ( state & align_iter_skip ) == align_iter_skip )
+ ( vc->deletes ) ++;
+
+ if ( ( state & align_iter_insert ) == align_iter_insert )
+ ( vc->inserts )++;
+ }
+ return 0;
+}
+
+
+rc_t walk_indels( ReferenceIterator *ref_iter, pileup_options * options )
+{
+ walk_data data;
+ walk_funcs funcs;
+
+ indel_counters v_counters;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &v_counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = NULL;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_indels_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_indels_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_indels_placement;
+
+ return walk_0( &data, &funcs );
+}
diff --git a/tools/sra-pileup/pileup_indels.h b/tools/sra-pileup/pileup_indels.h
new file mode 100644
index 0000000..2eefc1c
--- /dev/null
+++ b/tools/sra-pileup/pileup_indels.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_indels_
+#define _h_pileup_indels_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t walk_indels( ReferenceIterator *ref_iter, pileup_options * options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_indels_ */
diff --git a/tools/sra-pileup/pileup_index.c b/tools/sra-pileup/pileup_index.c
new file mode 100644
index 0000000..7534c85
--- /dev/null
+++ b/tools/sra-pileup/pileup_index.c
@@ -0,0 +1,122 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+static uint32_t percent( uint32_t v1, uint32_t v2 )
+{
+ uint32_t sum = v1 + v2;
+ uint32_t res = 0;
+ if ( sum > 0 )
+ res = ( ( v1 * 100 ) / sum );
+ return res;
+}
+
+
+typedef struct index_counters
+{
+ uint32_t base_counts[ 4 ]; /* 0...A, 1...C, 2...G, 3...T */
+ uint32_t inserts;
+ uint32_t deletes;
+ uint32_t forward;
+ uint32_t reverse;
+} index_counters;
+
+
+static rc_t CC walk_index_enter_ref_pos( walk_data * data )
+{
+ index_counters * ic = data->data;
+ memset( ic, 0, sizeof *ic );
+ return 0;
+}
+
+
+static rc_t CC walk_index_exit_ref_pos( walk_data * data )
+{
+ index_counters * ic = data->data;
+ if ( ic->forward + ic->reverse == 0 )
+ return 0;
+ else
+ return KOutMsg( "%s\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\n",
+ data->ref_name, data->ref_pos + 1,
+ ic->base_counts[ 0 ], ic->base_counts[ 1 ], ic->base_counts[ 2 ], ic->base_counts[ 3 ],
+ ic->inserts, ic->deletes, percent( ic->forward, ic->reverse ) );
+}
+
+
+static rc_t CC walk_index_placement( walk_data * data )
+{
+ int32_t state = data->state;
+ if ( ( state & align_iter_invalid ) != align_iter_invalid )
+ {
+ index_counters * ic = data->data;
+
+ if ( ( state & align_iter_skip ) == align_iter_skip )
+ ( ic->deletes ) ++;
+ else
+ ic->base_counts[ _4na_to_index( state ) ] ++;
+
+ if ( data->xrec->reverse )
+ ( ic->reverse )++;
+ else
+ ( ic->forward )++;
+
+ if ( ( state & align_iter_insert ) == align_iter_insert )
+ ( ic->inserts )++;
+ }
+ return 0;
+}
+
+
+rc_t walk_index( ReferenceIterator *ref_iter, pileup_options * options )
+{
+ walk_data data;
+ walk_funcs funcs;
+ index_counters i_counters;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &i_counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = NULL;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_index_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_index_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_index_placement;
+
+ return walk_0( &data, &funcs );
+}
diff --git a/tools/sra-pileup/pileup_index.h b/tools/sra-pileup/pileup_index.h
new file mode 100644
index 0000000..7e07bc9
--- /dev/null
+++ b/tools/sra-pileup/pileup_index.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_index_
+#define _h_pileup_index_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t walk_index( ReferenceIterator *ref_iter, pileup_options * options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_index_ */
diff --git a/tools/sra-pileup/pileup_options.h b/tools/sra-pileup/pileup_options.h
new file mode 100644
index 0000000..9b02adc
--- /dev/null
+++ b/tools/sra-pileup/pileup_options.h
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_options_
+#define _h_pileup_options_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ref_regions.h"
+#include "cmdline_cmn.h"
+
+typedef struct pileup_options
+{
+ common_options cmn; /* from cmdline_cmn.h */
+ bool process_dups;
+ bool omit_qualities;
+ bool read_tlen;
+ bool no_skip;
+ bool show_id;
+ bool div_by_spotgrp;
+ bool depth_per_spotgrp;
+ bool use_seq_name;
+ uint32_t minmapq;
+ uint32_t min_mismatch;
+ uint32_t merge_dist;
+ uint32_t source_table;
+ uint32_t function; /* sra_pileup_samtools, sra_pileup_counters, sra_pileup_stat,
+ sra_pileup_report_ref, sra_pileup_report_ref_ext, sra_pileup_debug, etc */
+ struct skiplist * skiplist; /* from ref_regions.h */
+} pileup_options;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* pileup_options_ */
diff --git a/tools/sra-pileup/pileup_stat.c b/tools/sra-pileup/pileup_stat.c
new file mode 100644
index 0000000..8e74124
--- /dev/null
+++ b/tools/sra-pileup/pileup_stat.c
@@ -0,0 +1,391 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+#include <klib/sort.h>
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+static uint32_t percent( uint32_t v1, uint32_t v2 )
+{
+ uint32_t sum = v1 + v2;
+ uint32_t res = 0;
+ if ( sum > 0 )
+ res = ( ( v1 * 100 ) / sum );
+ return res;
+}
+
+typedef struct tlen_array
+{
+ uint32_t * values;
+ uint32_t capacity;
+ uint32_t members;
+ uint32_t zeros;
+} tlen_array;
+
+
+static rc_t init_tlen_array( tlen_array * a, uint32_t init_capacity )
+{
+ rc_t rc = 0;
+ a->values = malloc( sizeof ( a->values[ 0 ] ) * init_capacity );
+ if ( a->values == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted );
+ else
+ {
+ a->capacity = init_capacity;
+ a->members = 0;
+ a->zeros = 0;
+ }
+ return rc;
+}
+
+
+static void finish_tlen_array( tlen_array * a )
+{
+ if ( a->values != NULL )
+ {
+ free( a->values );
+ a->values = NULL;
+ }
+}
+
+
+static rc_t realloc_tlen_array( tlen_array * a, uint32_t new_depth )
+{
+ rc_t rc = 0;
+ if ( new_depth > a->capacity )
+ {
+ void * p = realloc( a->values, ( sizeof ( a->values[ 0 ] ) ) * new_depth );
+ if ( a->values == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcMemory, rcExhausted );
+ else
+ {
+ a->values = p;
+ a->capacity = new_depth;
+ }
+ }
+ return rc;
+}
+
+
+static void remove_from_tlen_array( tlen_array * a, uint32_t count )
+{
+ if ( count > 0 )
+ {
+ if ( a->members < count )
+ a->members = 0;
+ else
+ {
+ a->members -= count;
+ memmove( &(a->values[ 0 ]), &(a->values[ count ]), a->members * ( sizeof a->values[ 0 ] ) );
+ }
+ }
+}
+
+
+static bool add_tlen_to_array( tlen_array * a, uint32_t value )
+{
+ bool res = ( value != 0 );
+ if ( !res )
+ a->zeros++;
+ else
+ a->values[ a->members++ ] = value;
+ return res;
+}
+
+
+#define INIT_WINDOW_SIZE 50
+#define MAX_SEQLEN_COUNT 500000
+
+typedef struct strand
+{
+ uint32_t alignment_count, window_size, window_max, seq_len_accu_count;
+ uint64_t seq_len_accu;
+ tlen_array tlen_w; /* tlen accumulater for all alignmnts starting/ending in window ending at current position */
+ tlen_array tlen_l; /* array holding the length of all position-slices in the window */
+ tlen_array zeros;
+} strand;
+
+
+typedef struct stat_counters
+{
+ strand pos;
+ strand neg;
+} stat_counters;
+
+
+static rc_t prepare_strand( strand * strand, uint32_t initial_size )
+{
+ rc_t rc = init_tlen_array( &strand->tlen_w, initial_size );
+ if ( rc == 0 )
+ rc = init_tlen_array( &strand->tlen_l, initial_size );
+ if ( rc == 0 )
+ rc = init_tlen_array( &strand->zeros, initial_size );
+ if ( rc == 0 )
+ {
+ strand->window_size = 0;
+ strand->window_max = INIT_WINDOW_SIZE;
+ strand->seq_len_accu_count = 0;
+ strand->seq_len_accu = 0;
+ }
+ return rc;
+}
+
+
+static rc_t prepare_stat_counters( stat_counters * counters, uint32_t initial_size )
+{
+ rc_t rc = prepare_strand( &counters->pos, initial_size );
+ if ( rc == 0 )
+ rc = prepare_strand( &counters->neg, initial_size );
+ return rc;
+}
+
+
+static void finish_strand( strand * strand )
+{
+ finish_tlen_array( &strand->tlen_w );
+ finish_tlen_array( &strand->tlen_l );
+ finish_tlen_array( &strand->zeros );
+}
+
+
+static void finish_stat_counters( stat_counters * counters )
+{
+ finish_strand( &counters->pos );
+ finish_strand( &counters->neg );
+}
+
+
+static rc_t realloc_strand( strand * strand, uint32_t new_depth )
+{
+ rc_t rc = realloc_tlen_array( &strand->tlen_w, strand->tlen_w.members + new_depth );
+ if ( rc == 0 )
+ rc = realloc_tlen_array( &strand->tlen_l, strand->tlen_l.members + new_depth );
+ if ( rc == 0 )
+ rc = realloc_tlen_array( &strand->zeros, strand->zeros.members + new_depth );
+ strand->alignment_count = 0;
+ return rc;
+}
+
+
+static void on_new_ref_position_strand( strand * strand )
+{
+ if ( ( strand->seq_len_accu_count < MAX_SEQLEN_COUNT ) && ( strand->seq_len_accu_count > 0 ) )
+ {
+ uint64_t w = ( strand->seq_len_accu / strand->seq_len_accu_count );
+ if ( w > strand->window_max )
+ strand->window_max = w;
+ }
+
+ if ( strand->window_size >= strand->window_max )
+ {
+ uint32_t to_remove = strand->tlen_l.values[ 0 ];
+ remove_from_tlen_array( &strand->tlen_w, to_remove );
+ remove_from_tlen_array( &strand->tlen_l, 1 );
+
+ to_remove = strand->zeros.values[ 0 ];
+ strand->tlen_w.zeros -= to_remove;
+ remove_from_tlen_array( &strand->zeros, 1 );
+ }
+ else
+ strand->window_size++;
+ strand->tlen_l.values[ strand->tlen_l.members++ ] = 0;
+ strand->zeros.values[ strand->zeros.members++ ] = 0;
+}
+
+
+static uint32_t medium( tlen_array * a )
+{
+ if ( a->members == 0 )
+ return 0;
+ else
+ return a->values[ a->members >> 1 ];
+}
+
+
+static uint32_t percentil( tlen_array * a, uint32_t p )
+{
+ if ( a->members == 0 )
+ return 0;
+ else
+ return a->values[ ( a->members * p ) / 100 ];
+}
+
+
+static rc_t print_header_line( void )
+{
+ return KOutMsg( "\nREFNAME----\tREFPOS\tREFBASE\tDEPTH\tSTRAND%%\tTL+#0\tTL+10%%\tTL+MED\tTL+90%%\tTL-#0\tTL-10%%\tTL-MED\tTL-90%%\n\n" );
+}
+
+
+/* ........................................................................................... */
+
+
+static rc_t CC walk_stat_enter_ref_window( walk_data * data )
+{
+ stat_counters * counters = data->data;
+ counters->pos.tlen_w.members = 0;
+ counters->pos.tlen_l.members = 0;
+ counters->neg.tlen_w.members = 0;
+ counters->neg.tlen_l.members = 0;
+ return 0;
+}
+
+
+static rc_t CC walk_stat_enter_ref_pos( walk_data * data )
+{
+ rc_t rc;
+ stat_counters * counters = data->data;
+
+ on_new_ref_position_strand( &counters->pos );
+ on_new_ref_position_strand( &counters->neg );
+
+ rc = realloc_strand( &counters->pos, data->depth );
+ if ( rc == 0 )
+ rc = realloc_strand( &counters->neg, data->depth );
+
+ return rc;
+}
+
+
+static rc_t CC walk_stat_exit_ref_pos( walk_data * data )
+{
+ char c = _4na_to_ascii( data->ref_base, false );
+ stat_counters * counters = data->data;
+
+ /* REF-NAME, REF-POS, REF-BASE, DEPTH */
+ rc_t rc = KOutMsg( "%s\t%u\t%c\t%u\t", data->ref_name, data->ref_pos + 1, c, data->depth );
+
+ /* STRAND-ness */
+ if ( rc == 0 )
+ rc = KOutMsg( "%u%%\t", percent( counters->pos.alignment_count, counters->neg.alignment_count ) );
+
+ /* TLEN-Statistic for sliding window, only starting/ending placements */
+ if ( rc == 0 )
+ {
+ tlen_array * a = &counters->pos.tlen_w;
+ if ( a->members > 1 )
+ ksort_uint32_t ( a->values, a->members );
+
+ rc = KOutMsg( "%u\t%u\t%u\t%u\t", a->zeros, percentil( a, 10 ), medium( a ), percentil( a, 90 ) );
+ if ( rc == 0 )
+ {
+ a = &counters->neg.tlen_w;
+ if ( a->members > 1 )
+ ksort_uint32_t ( a->values, a->members );
+ rc = KOutMsg( "%u\t%u\t%u\t%u\t", a->zeros, percentil( a, 10 ), medium( a ), percentil( a, 90 ) );
+ }
+ }
+
+/*
+ KOutMsg( "( %u,%u )\t", counters->pos.window_max, counters->neg.window_max );
+ KOutMsg( "< %u.%u, %u.%u ( %u.%u, %u.%u ) >",
+ counters->pos.tlen_w.members, counters->pos.tlen_w.capacity, counters->neg.tlen_w.members, counters->neg.tlen_w.capacity,
+ counters->pos.tlen_l.members, counters->pos.tlen_l.capacity, counters->neg.tlen_l.members, counters->neg.tlen_l.capacity );
+*/
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ return rc;
+}
+
+
+static void walk_strand_placement( strand * strand, int32_t tlen, INSDC_coord_len seq_len )
+{
+ tlen_array * a;
+ uint32_t value = ( tlen < 0 ) ? -tlen : tlen;
+ if ( add_tlen_to_array( &strand->tlen_w, value ) )
+ a = &strand->tlen_l;
+ else
+ a = &strand->zeros;
+ a->values[ a->members - 1 ]++;
+
+ if ( strand->seq_len_accu_count < MAX_SEQLEN_COUNT )
+ {
+ strand->seq_len_accu += seq_len;
+ strand->seq_len_accu_count++;
+ }
+}
+
+
+static rc_t CC walk_stat_placement( walk_data * data )
+{
+ int32_t state = data->state;
+ if ( ( state & align_iter_invalid ) != align_iter_invalid )
+ {
+ bool reverse = data->xrec->reverse;
+ stat_counters * counters = data->data;
+ strand * strand = ( reverse ) ? &counters->neg : &counters->pos;
+
+ strand->alignment_count++;
+
+ /* for TLEN-statistic on starting/ending placements at this pos */
+ if ( ( ( state & align_iter_last ) == align_iter_last )&&( reverse ) )
+ walk_strand_placement( strand, data->xrec->tlen, data->rec->len );
+ else if ( ( ( state & align_iter_first ) == align_iter_first )&&( !reverse ) )
+ walk_strand_placement( strand, data->xrec->tlen, data->rec->len );
+ }
+ return 0;
+}
+
+
+rc_t walk_stat( ReferenceIterator *ref_iter, pileup_options *options )
+{
+ walk_data data;
+ walk_funcs funcs;
+ stat_counters counters;
+
+ rc_t rc = print_header_line();
+ if ( rc == 0 )
+ rc = prepare_stat_counters( &counters, 1024 );
+ if ( rc == 0 )
+ {
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = walk_stat_enter_ref_window;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_stat_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_stat_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_stat_placement;
+
+ rc = walk_0( &data, &funcs );
+
+ finish_stat_counters( &counters );
+ }
+ return rc;
+}
\ No newline at end of file
diff --git a/tools/sra-pileup/pileup_stat.h b/tools/sra-pileup/pileup_stat.h
new file mode 100644
index 0000000..7575822
--- /dev/null
+++ b/tools/sra-pileup/pileup_stat.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_stat_
+#define _h_pileup_stat_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t walk_stat( ReferenceIterator *ref_iter, pileup_options *options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_stat_ */
diff --git a/tools/sra-pileup/pileup_v2.c b/tools/sra-pileup/pileup_v2.c
new file mode 100644
index 0000000..015bf6a
--- /dev/null
+++ b/tools/sra-pileup/pileup_v2.c
@@ -0,0 +1,382 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+#include <kapp/args.h>
+
+#include "pileup_options.h"
+#include "dyn_string.h"
+#include "ref_walker.h"
+#include "4na_ascii.h"
+
+/*
+static rc_t CC pileup_test_enter_ref( ref_walker_data * rwd )
+{
+ return KOutMsg( "\nentering >%s<\n", rwd->ref_name );
+}
+
+static rc_t CC pileup_test_exit_ref( ref_walker_data * rwd )
+{
+ return KOutMsg( "exit >%s<\n", rwd->ref_name );
+}
+
+static rc_t CC pileup_test_enter_ref_window( ref_walker_data * rwd )
+{
+ return KOutMsg( " enter window >%s< [ %,lu ... %,lu ]\n", rwd->ref_name, rwd->ref_start, rwd->ref_end );
+}
+
+static rc_t CC pileup_test_exit_ref_window( ref_walker_data * rwd )
+{
+ return KOutMsg( " exit window >%s< [ %,lu ... %,lu ]\n", rwd->ref_name, rwd->ref_start, rwd->ref_end );
+}
+
+static rc_t CC pileup_test_enter_ref_pos( ref_walker_data * rwd )
+{
+ return KOutMsg( " enter pos [ %,lu ], d=%u\n", rwd->pos, rwd->depth );
+}
+
+static rc_t CC pileup_test_exit_ref_pos( ref_walker_data * rwd )
+{
+ return KOutMsg( " exit pos [ %,lu ], d=%u\n", rwd->pos, rwd->depth );
+}
+
+static rc_t CC pileup_test_enter_spot_group( ref_walker_data * rwd )
+{
+ return KOutMsg( " enter spot-group [ %,lu ], %.*s\n", rwd->pos, rwd->spot_group_len, rwd->spot_group );
+}
+
+static rc_t CC pileup_test_exit_spot_group( ref_walker_data * rwd )
+{
+ return KOutMsg( " exit spot-group [ %,lu ], %.*s\n", rwd->pos, rwd->spot_group_len, rwd->spot_group );
+}
+
+static rc_t CC pileup_test_alignment( ref_walker_data * rwd )
+{
+ rc_t rc = KOutMsg( " alignment\t" );
+ if ( rc == 0 )
+ {
+ if ( !rwd->valid )
+ {
+ KOutMsg( "invalid" );
+ }
+ else
+ {
+ KOutMsg( "%s%s", rwd->reverse ? "<" : ">", rwd->match ? "." : "!" );
+ }
+ }
+ KOutMsg( "\n" );
+ return rc;
+}
+
+static rc_t pileup_test( Args * args, pileup_options *options )
+{
+ struct ref_walker * walker;
+ rc_t rc = ref_walker_create( &walker );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+ rc = ArgsParamCount( args, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * src = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&src );
+ if ( rc == 0 && src != NULL )
+ rc = ref_walker_add_source( walker, src );
+ }
+
+ if ( rc == 0 )
+ {
+ rc = ArgsOptionCount( args, OPTION_REF, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * s = NULL;
+ rc = ArgsOptionValue( args, OPTION_REF, idx, (const void **)&s );
+ if ( rc == 0 && s != NULL )
+ rc = ref_walker_parse_and_add_range( walker, s );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ ref_walker_callbacks callbacks =
+ { pileup_test_enter_ref,
+ pileup_test_exit_ref,
+ pileup_test_enter_ref_window,
+ pileup_test_exit_ref_window,
+ pileup_test_enter_ref_pos,
+ pileup_test_exit_ref_pos,
+ pileup_test_enter_spot_group,
+ pileup_test_exit_spot_group,
+ pileup_test_alignment };
+ rc = ref_walker_set_callbacks( walker, &callbacks );
+ }
+
+ if ( rc == 0 )
+ rc = ref_walker_walk( walker, NULL );
+
+ ref_walker_destroy( walker );
+ }
+ return rc;
+}
+*/
+
+
+/* =========================================================================================== */
+
+
+typedef struct pileup_v2_ctx
+{
+ struct dyn_string * bases;
+ struct dyn_string * qual;
+ bool print_qual;
+ bool div_by_spotgrp;
+ bool debug;
+} pileup_v2_ctx;
+
+
+static rc_t CC pileup_v2_enter_ref_pos( ref_walker_data * rwd )
+{
+ pileup_v2_ctx * ctx = rwd->data;
+ /* make shure that bases/qual have the necessary length ( depth * 2 ) */
+ uint32_t l = ( rwd->depth * 2 );
+ rc_t rc = expand_dyn_string( ctx->bases, l );
+ if ( rc == 0 )
+ reset_dyn_string( ctx->bases );
+ if ( rc == 0 && ctx->print_qual )
+ {
+ rc = expand_dyn_string( ctx->qual, l );
+ if ( rc == 0 )
+ reset_dyn_string( ctx->qual );
+ }
+ return rc;
+}
+
+
+static rc_t CC pileup_v2_exit_ref_pos( ref_walker_data * rwd )
+{
+ pileup_v2_ctx * ctx = rwd->data;
+ rc_t rc = KOutMsg( "%s\t%u\t%c\t%u\t", rwd->ref_name, rwd->pos + 1, rwd->ascii_ref_base, rwd->depth );
+ if ( rc == 0 )
+ rc = print_dyn_string( ctx->bases );
+ if ( rc == 0 && ctx->print_qual )
+ {
+ rc = KOutMsg( "\t" );
+ if ( rc == 0 )
+ rc = print_dyn_string( ctx->qual );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t CC pileup_v2_enter_spot_group( ref_walker_data * rwd )
+{
+ rc_t rc = 0;
+ pileup_v2_ctx * ctx = rwd->data;
+ if ( ctx->div_by_spotgrp )
+ {
+ if ( dyn_string_len( ctx->bases ) > 0 )
+ rc = add_char_2_dyn_string( ctx->bases, '\t' );
+ if ( rc == 0 && ctx->print_qual && dyn_string_len( ctx->qual ) > 0 )
+ rc = add_char_2_dyn_string( ctx->qual, '\t' );
+ }
+ return rc;
+}
+
+
+static rc_t CC pileup_v2_alignment( ref_walker_data * rwd )
+{
+ rc_t rc = 0;
+ pileup_v2_ctx * ctx = rwd->data;
+
+ if ( !rwd->valid )
+ {
+ rc = add_char_2_dyn_string( ctx->bases, '?' );
+ if ( rc == 0 && ctx->print_qual )
+ rc = add_char_2_dyn_string( ctx->qual, '?' );
+ }
+ else
+ {
+ if ( rwd->first )
+ {
+ char s[ 3 ];
+ int32_t c = rwd->mapq + 33;
+ if ( c > '~' ) { c = '~'; }
+ if ( c < 33 ) { c = 33; }
+ s[ 0 ] = '^';
+ s[ 1 ] = c;
+ s[ 2 ] = 0;
+ rc = add_string_2_dyn_string( ctx->bases, s );
+ }
+
+
+ if ( rc == 0 )
+ {
+ if ( rwd->skip )
+ {
+ if ( rwd->reverse )
+ rc = add_char_2_dyn_string( ctx->bases, '<' );
+ else
+ rc = add_char_2_dyn_string( ctx->bases, '>' );
+ }
+ else
+ {
+ if ( rwd->match )
+ rc = add_char_2_dyn_string( ctx->bases, ( rwd->reverse ? ',' : '.' ) );
+ else
+ rc = add_char_2_dyn_string( ctx->bases, rwd->ascii_alignment_base );
+ }
+ }
+
+ if ( rc == 0 && rwd->ins )
+ {
+ uint32_t i, n = rwd->ins_bases_count;
+
+ rc = print_2_dyn_string( ctx->bases, "+%u", rwd->ins_bases_count );
+ for ( i = 0; i < n && rc == 0; ++i )
+ rc = add_char_2_dyn_string( ctx->bases, _4na_to_ascii( rwd->ins_bases[ i ], rwd->reverse ) );
+ }
+
+ if ( rc == 0 && rwd->del && rwd->del_bases_count > 0 && rwd->del_bases != NULL )
+ {
+ uint32_t i, n = rwd->del_bases_count;
+ rc = print_2_dyn_string( ctx->bases, "-%u", n );
+ for ( i = 0; i < n && rc == 0; ++i )
+ rc = add_char_2_dyn_string( ctx->bases, _4na_to_ascii( rwd->del_bases[ i ], rwd->reverse ) );
+ }
+
+ if ( rc == 0 && rwd->last )
+ rc = add_char_2_dyn_string( ctx->bases, '$' );
+
+ if ( rc == 0 && ctx->print_qual )
+ {
+ rc = add_char_2_dyn_string( ctx->qual, rwd->quality );
+ }
+ }
+
+ return rc;
+}
+
+
+rc_t pileup_v2( Args * args, pileup_options *options )
+{
+ struct ref_walker * walker;
+
+ /* create walker */
+ rc_t rc = ref_walker_create( &walker );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+
+ /* add sources to walker */
+ rc = ArgsParamCount( args, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * src = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&src );
+ if ( rc == 0 && src != NULL )
+ rc = ref_walker_add_source( walker, src );
+ }
+
+ /* add ranges to walker */
+ if ( rc == 0 )
+ {
+ rc = ArgsOptionCount( args, OPTION_REF, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * s = NULL;
+ rc = ArgsOptionValue( args, OPTION_REF, idx, (const void **)&s );
+ if ( rc == 0 && s != NULL )
+ rc = ref_walker_parse_and_add_range( walker, s );
+ }
+ }
+
+ /* set callbacks for walker */
+ if ( rc == 0 )
+ {
+ ref_walker_callbacks callbacks =
+ { NULL,
+ NULL,
+ NULL,
+ NULL,
+ pileup_v2_enter_ref_pos,
+ pileup_v2_exit_ref_pos,
+ pileup_v2_enter_spot_group,
+ NULL,
+ pileup_v2_alignment };
+ rc = ref_walker_set_callbacks( walker, &callbacks );
+ }
+
+ /* translate the commandline options into walker 'INTERESTS' */
+ if ( rc == 0 )
+ {
+ uint32_t interest = RW_INTEREST_INDEL | RW_INTEREST_BASE;
+
+ if ( options->process_dups ) interest |= RW_INTEREST_DUPS;
+ if ( !options->omit_qualities ) interest |= RW_INTEREST_QUAL;
+ if ( !options->no_skip ) interest |= RW_INTEREST_SKIP;
+ if ( options->show_id ) interest |= RW_INTEREST_DEBUG;
+ if ( options->use_seq_name ) interest |= RW_INTEREST_SEQNAME;
+ if ( options->cmn.tab_select & primary_ats ) interest |= RW_INTEREST_PRIM;
+ if ( options->cmn.tab_select & secondary_ats ) interest |= RW_INTEREST_SEC;
+ if ( options->cmn.tab_select & evidence_ats ) interest |= RW_INTEREST_EV;
+
+ rc = ref_walker_set_interest( walker, interest );
+ if ( rc == 0 )
+ rc = ref_walker_set_min_mapq( walker, options->minmapq );
+ }
+
+ /* let the walker call the callbacks while iterating over the sources/ranges */
+ if ( rc == 0 )
+ {
+ pileup_v2_ctx ctx;
+ memset( &ctx, 0, sizeof ctx );
+ rc = allocated_dyn_string ( &ctx.bases, 1000 );
+ if ( rc == 0 )
+ {
+ rc = allocated_dyn_string ( &ctx.qual, 1000 );
+ if ( rc == 0 )
+ {
+ ctx.print_qual = !options->omit_qualities;
+ ctx.div_by_spotgrp = options->div_by_spotgrp;
+ ctx.debug = options->show_id;
+
+ /***********************************/
+ rc = ref_walker_walk( walker, &ctx );
+ /***********************************/
+
+ free_dyn_string ( ctx.qual );
+ }
+ free_dyn_string ( ctx.bases );
+ }
+ }
+
+ /* destroy the walker */
+ ref_walker_destroy( walker );
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/pileup_v2.h b/tools/sra-pileup/pileup_v2.h
new file mode 100644
index 0000000..7b1313c
--- /dev/null
+++ b/tools/sra-pileup/pileup_v2.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_v2_
+#define _h_pileup_v2_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t pileup_v2( Args * args, pileup_options *options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_v2_ */
diff --git a/tools/sra-pileup/pileup_varcount.c b/tools/sra-pileup/pileup_varcount.c
new file mode 100644
index 0000000..d5834cf
--- /dev/null
+++ b/tools/sra-pileup/pileup_varcount.c
@@ -0,0 +1,139 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+typedef struct var_counters
+{
+ uint32_t coverage;
+ uint32_t base_counts[ 4 ]; /* 0...A, 1...C, 2...G, 3...T */
+ uint32_t deletes;
+ uint32_t inserts;
+ uint32_t insert_after[ 4 ]; /* 0...A, 1...C, 2...G, 3...T */
+} var_counters;
+
+
+static rc_t CC walk_varcount_enter_ref_pos( walk_data * data )
+{
+ var_counters * vc = data->data;
+ memset( vc, 0, sizeof *vc );
+ return 0;
+}
+
+
+static rc_t CC walk_varcount_exit_ref_pos( walk_data * data )
+{
+ if ( data->depth == 0 )
+ return 0;
+ else
+ {
+ var_counters * vc = data->data;
+ char ref_base = _4na_to_ascii( data->ref_base, false );
+
+/*
+ A ... ref-name
+ B ... ref-pos
+ C ... ref-base
+ D ... coverage
+
+ E ... A ( if mismatch )
+ F ... C ( if mismatch )
+ G ... G ( if mismatch )
+ H ... T ( if mismatch )
+
+ I ... total deletes
+ J ... total inserts
+
+ K ... inserts after A
+ L ... inserts after C
+ M ... inserts after G
+ N ... inserts after T
+
+ A B C D E F G H I J K L M N
+*/
+ return KOutMsg( "%s\t%u\t%c\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\t%u\n",
+ data->ref_name, data->ref_pos + 1, ref_base, data->depth,
+
+ vc->base_counts[ 0 ], vc->base_counts[ 1 ], vc->base_counts[ 2 ], vc->base_counts[ 3 ],
+ vc->deletes, vc->inserts,
+ vc->insert_after[ 0 ], vc->insert_after[ 1 ], vc->insert_after[ 2 ], vc->insert_after[ 3 ] );
+ }
+}
+
+
+static rc_t CC walk_varcount_placement( walk_data * data )
+{
+ int32_t state = data->state;
+ if ( ( state & align_iter_invalid ) != align_iter_invalid )
+ {
+ var_counters * vc = data->data;
+ uint32_t idx = _4na_to_index( state );
+
+ if ( ( state & align_iter_skip ) == align_iter_skip )
+ ( vc->deletes ) ++;
+ else if ( ( state & align_iter_match ) != align_iter_match )
+ vc->base_counts[ idx ] ++;
+
+ if ( ( state & align_iter_insert ) == align_iter_insert )
+ {
+ ( vc->inserts )++;
+ vc->insert_after[ idx ] ++;
+ }
+ }
+ return 0;
+}
+
+
+rc_t walk_varcount( ReferenceIterator *ref_iter, pileup_options * options )
+{
+ walk_data data;
+ walk_funcs funcs;
+
+ var_counters v_counters;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+ data.data = &v_counters;
+
+ funcs.on_enter_ref = NULL;
+ funcs.on_exit_ref = NULL;
+
+ funcs.on_enter_ref_window = NULL;
+ funcs.on_exit_ref_window = NULL;
+
+ funcs.on_enter_ref_pos = walk_varcount_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_varcount_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = NULL;
+ funcs.on_exit_spotgroup = NULL;
+
+ funcs.on_placement = walk_varcount_placement;
+
+ return walk_0( &data, &funcs );
+}
diff --git a/tools/sra-pileup/pileup_varcount.h b/tools/sra-pileup/pileup_varcount.h
new file mode 100644
index 0000000..a89ca9a
--- /dev/null
+++ b/tools/sra-pileup/pileup_varcount.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_pileup_varcount_
+#define _h_pileup_varcount_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t walk_varcount( ReferenceIterator *ref_iter, pileup_options * options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_pileup_varcount_ */
diff --git a/tools/sra-pileup/read_fkt.c b/tools/sra-pileup/read_fkt.c
new file mode 100644
index 0000000..4f2ae53
--- /dev/null
+++ b/tools/sra-pileup/read_fkt.c
@@ -0,0 +1,718 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "read_fkt.h"
+#include <sysalloc.h>
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+rc_t read_bool( int64_t row_id, const VCursor * cursor, uint32_t idx, bool *res, bool dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) bool",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const bool * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) bool failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_bool_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const bool **res, uint32_t *res_len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) bool ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ bool * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( res_len != NULL )
+ *res_len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_uint8( int64_t row_id, const VCursor * cursor, uint32_t idx, uint8_t *res, uint8_t dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) uint8",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const uint8_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) char_ptr failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_uint8_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const uint8_t **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) uint8 ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const uint8_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) char_ptr failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_uint32( int64_t row_id, const VCursor * cursor, uint32_t idx, uint32_t *res, uint32_t dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) uint32",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ uint32_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) uint32_t failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_uint32_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const uint32_t **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) uint32 ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ uint32_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) uint32_t (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_int32( int64_t row_id, const VCursor * cursor, uint32_t idx, int32_t *res, int32_t dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) int32",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ int32_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) uint32_t failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_int32_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const int32_t **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) int32 ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ int32_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) uint32_t (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_int64( int64_t row_id, const VCursor * cursor, uint32_t idx, int64_t *res, int64_t dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) int64",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const int64_t *value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) int64 failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_int64_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const int64_t **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) int64 ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ int64_t * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) uint64_t (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_char_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const char **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) char ptr",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const char * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) char_ptr failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_INSDC_coord_zero( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_zero *res, INSDC_coord_zero dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_zero",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ INSDC_coord_zero * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_zero failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_INSDC_coord_zero_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_coord_zero **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_zero (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const INSDC_coord_zero * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_zero (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_INSDC_coord_one( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_one *res, INSDC_coord_one dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_one",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ INSDC_coord_one * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_one failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_INSDC_coord_one_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_one **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_one (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ INSDC_coord_one * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_one (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_INSDC_coord_len( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_len *res, INSDC_coord_len dflt, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_len",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ INSDC_coord_len * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_len failed",
+ "tr=%li,ti=%u,hi=$u", row_id, idx, hint ) );
+ }
+ else
+ {
+ *res = ( row_len > 0 ) ? *value : dflt;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_INSDC_coord_len_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_coord_len **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_coord_len (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const INSDC_coord_len * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_coord_len (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+
+rc_t read_INSDC_read_type_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_read_type **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_read_type (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const INSDC_read_type * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_read_type (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_INSDC_read_filter_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_read_filter **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_read_filter (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const INSDC_read_filter * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_read_filter (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+rc_t read_INSDC_dna_text_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_dna_text **res, uint32_t *len, const char * hint )
+{
+ rc_t rc;
+ if ( idx == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcItem, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "column idx invalid at row#$(tr) . $(hi) ) INSDC_dna_text (ptr)",
+ "tr=%li,hi=%s", row_id, hint ) );
+ }
+ else
+ {
+ const INSDC_dna_text * value;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect( cursor, row_id, idx, &elem_bits, (const void**)&value, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorCellDataDirect( row#$(tr) . idx#$(ti) . $(hi) ) INSDC_dna_text (ptr) failed",
+ "tr=%li,ti=%u,hi=%s", row_id, idx, hint ) );
+ }
+ else
+ {
+ if ( row_len > 0 )
+ *res = value;
+ if ( len != NULL )
+ *len = row_len;
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------------------------------------------------- */
+
+bool namelist_contains( const KNamelist *names, const char * a_name )
+{
+ bool res = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( names, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t idx;
+ size_t a_name_len = string_size( a_name );
+ for ( idx = 0; idx < count && rc == 0 && !res; ++idx )
+ {
+ const char * s;
+ rc = KNamelistGet( names, idx, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ size_t s_len = string_size( s );
+ size_t max_len = a_name_len > s_len ? a_name_len : s_len;
+ int cmp = string_cmp( a_name, a_name_len, s, s_len, max_len );
+ if ( cmp == 0 )
+ res = true;
+ }
+ }
+ }
+ return res;
+}
+
+
+rc_t add_column( const VCursor * cursor, const char *colname, uint32_t * idx )
+{
+ rc_t rc = VCursorAddColumn( cursor, idx, "%s", colname );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorAddColumn( $(cn) ) failed", "cn=%s", colname ) );
+ }
+ return rc;
+}
+
+
+static const char * col_name_without_type( const char * colname )
+{
+ const char * res = colname;
+ const char * s = string_chr( colname, string_size( colname ), ')' );
+ if ( s != NULL )
+ res = ++s;
+ return res;
+}
+
+void add_opt_column( const VCursor * cursor, const KNamelist *names, const char *colname, uint32_t * idx )
+{
+ bool available = namelist_contains( names, col_name_without_type( colname ) );
+ if ( available )
+ {
+ rc_t rc = VCursorAddColumn( cursor, idx, "%s", colname );
+ if ( rc != 0 )
+ *idx = COL_NOT_AVAILABLE;
+ }
+ else
+ {
+ *idx = COL_NOT_AVAILABLE;
+ }
+}
diff --git a/tools/sra-pileup/read_fkt.h b/tools/sra-pileup/read_fkt.h
new file mode 100644
index 0000000..6ba6fa8
--- /dev/null
+++ b/tools/sra-pileup/read_fkt.h
@@ -0,0 +1,82 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_read_fkt_
+#define _h_read_fkt_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <vdb/cursor.h>
+#include <insdc/sra.h>
+
+#define COL_NOT_AVAILABLE 0xFFFFFFFF
+#define INVALID_COLUMN 0xFFFFFFFF
+
+rc_t read_bool( int64_t row_id, const VCursor * cursor, uint32_t idx, bool *res, bool dflt, const char * hint );
+rc_t read_bool_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const bool **res, uint32_t *res_len, const char * hint );
+
+rc_t read_uint8( int64_t row_id, const VCursor * cursor, uint32_t idx, uint8_t *res, uint8_t dflt, const char * hint );
+rc_t read_uint8_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const uint8_t **res, uint32_t *len, const char * hint );
+
+rc_t read_uint32( int64_t row_id, const VCursor * cursor, uint32_t idx, uint32_t *res, uint32_t dflt, const char * hint );
+rc_t read_uint32_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const uint32_t **res, uint32_t *len, const char * hint );
+
+rc_t read_int32( int64_t row_id, const VCursor * cursor, uint32_t idx, int32_t *res, int32_t dflt, const char * hint );
+rc_t read_int32_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const int32_t **res, uint32_t *len, const char * hint );
+
+rc_t read_int64( int64_t row_id, const VCursor * cursor, uint32_t idx, int64_t *res, int64_t dflt, const char * hint );
+rc_t read_int64_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const int64_t **res, uint32_t *len, const char * hint );
+
+rc_t read_char_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const char **res, uint32_t *len, const char * hint );
+
+rc_t read_INSDC_coord_zero( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_zero *res, INSDC_coord_zero dflt, const char * hint );
+rc_t read_INSDC_coord_zero_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_coord_zero **res, uint32_t *len, const char * hint );
+
+rc_t read_INSDC_coord_one( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_one *res, INSDC_coord_one dflt, const char * hint );
+rc_t read_INSDC_coord_one_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_one **res, uint32_t *len, const char * hint );
+
+rc_t read_INSDC_coord_len( int64_t row_id, const VCursor * cursor, uint32_t idx, INSDC_coord_len *res, INSDC_coord_len dflt, const char * hint );
+rc_t read_INSDC_coord_len_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_coord_len **res, uint32_t *len, const char * hint );
+
+rc_t read_INSDC_read_type_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_read_type **res, uint32_t *len, const char * hint );
+rc_t read_INSDC_read_filter_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_read_filter **res, uint32_t *len, const char * hint );
+rc_t read_INSDC_dna_text_ptr( int64_t row_id, const VCursor * cursor, uint32_t idx, const INSDC_dna_text **res, uint32_t *len, const char * hint );
+
+bool namelist_contains( const KNamelist * names, const char * a_name );
+rc_t add_column( const VCursor * cursor, const char *colname, uint32_t * idx );
+void add_opt_column( const VCursor * cursor, const KNamelist *names, const char *colname, uint32_t * idx );
+
+#endif
diff --git a/tools/sra-pileup/ref_regions.c b/tools/sra-pileup/ref_regions.c
new file mode 100644
index 0000000..c628927
--- /dev/null
+++ b/tools/sra-pileup/ref_regions.c
@@ -0,0 +1,825 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "ref_regions.h"
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/vector.h>
+#include <klib/container.h>
+
+#include <stdlib.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <strtol.h>
+
+/* =========================================================================================== */
+
+
+static int cmp_pchar( const char * a, const char * b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+
+struct skip_range
+{
+ uint64_t start;
+ uint64_t end;
+} skip_range;
+
+
+static struct skip_range * make_skip_range( const uint64_t start, const uint64_t end )
+{
+ struct skip_range *res = calloc( 1, sizeof *res );
+ if ( res != NULL )
+ {
+ res->start = start;
+ res->end = end;
+ }
+ return res;
+}
+
+
+/* =========================================================================================== */
+
+struct reference_range
+{
+ uint64_t start;
+ uint64_t end;
+ Vector skip;
+} reference_range;
+
+
+static struct reference_range * make_range( const uint64_t start, const uint64_t end )
+{
+ struct reference_range *res = calloc( 1, sizeof *res );
+ if ( res != NULL )
+ {
+ res->start = start;
+ res->end = end;
+ VectorInit ( &res->skip, 0, 5 );
+ }
+ return res;
+}
+
+
+static void CC release_skip( void * item, void * data ) { free( item ); }
+
+static void free_range( struct reference_range * self )
+{
+ VectorWhack ( &self->skip, release_skip, NULL );
+ free( self );
+}
+
+static int64_t cmp_range( const struct reference_range * a, const struct reference_range * b )
+{
+ if ( a != NULL && b != NULL )
+ {
+ if ( a->start < b->start )
+ return -1;
+ else if ( a->start > b->start )
+ return 1;
+ else if ( a->end < b->end )
+ return -1;
+ else if ( a->end > b->end )
+ return 1;
+ else
+ return 0;
+ }
+ return 1; /* question from ukrainch: so, cmp_range cannot be used for sorting? */
+}
+
+
+static bool range_overlapp( const struct reference_range * a, const struct reference_range * b )
+{
+ if ( a != NULL && b != NULL )
+ return ( !( ( b->end < a->start ) || ( b->start > a->end ) ) );
+ return false;
+}
+
+
+static uint64_t range_distance( const struct reference_range * a, const struct reference_range * b )
+{
+ if ( a != NULL && b != NULL )
+ return ( b->start - a->end );
+ return 0;
+}
+
+/* =========================================================================================== */
+
+struct reference_region
+{
+ BSTNode node;
+ const char * name;
+ Vector ranges;
+} reference_region;
+
+
+static struct reference_region * make_reference_region( const char *name )
+{
+ struct reference_region *res = calloc( sizeof *res, 1 );
+ if ( res != NULL )
+ {
+ res->name = string_dup_measure ( name, NULL );
+ VectorInit ( &res->ranges, 0, 5 );
+ }
+ return res;
+}
+
+
+static int64_t CC cmp_range_wrapper( const void *item, const void *n )
+{ return cmp_range( item, n ); }
+
+
+static rc_t add_ref_region_range( struct reference_region * self, const uint64_t start, const uint64_t end )
+{
+ rc_t rc = 0;
+ struct reference_range *r = make_range( start, end );
+ if ( r == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ rc = VectorInsert ( &self->ranges, r, NULL, cmp_range_wrapper );
+ if ( rc != 0 )
+ free( r );
+ }
+ return rc;
+}
+
+
+#define RR_NAME 1
+#define RR_START 2
+#define RR_END 3
+
+
+static void put_c( char *s, size_t size, size_t *dst, char c )
+{
+ if ( *dst < ( size - 1 ) )
+ s[ *dst ] = c;
+ (*dst)++;
+}
+
+static void finish_txt( char *s, size_t size, size_t *dst )
+{
+ if ( *dst > size )
+ s[ size - 1 ] = 0;
+ else
+ s[ *dst ] = 0;
+ *dst = 0;
+}
+
+static uint64_t finish_num( char *s, size_t size, size_t *dst )
+{
+ uint64_t res = 0;
+ char *endp;
+ finish_txt( s, size, dst );
+ res = strtou64( s, &endp, 10 );
+ return res;
+}
+
+
+/* s = refname:1000-2000 */
+static void parse_definition( const char *s, char * name, size_t len,
+ uint64_t *start, uint64_t *end )
+{
+ size_t n = string_size( s );
+
+ *start = 0;
+ *end = 0;
+ name[ 0 ] = 0;
+ if ( n > 0 )
+ {
+ size_t i, st, dst = 0;
+ char tmp[ 4096 ];
+ st = RR_NAME;
+ for ( i = 0; i < n; ++i )
+ {
+ char c = s[ i ];
+ switch( st )
+ {
+ case RR_NAME : if ( c == ':' )
+ {
+ finish_txt( name, len, &dst );
+ st = RR_START;
+ }
+ else
+ {
+ put_c( name, len, &dst, c );
+ }
+ break;
+
+ case RR_START : if ( c == '-' )
+ {
+ *start = finish_num( tmp, sizeof tmp, &dst );
+ st = RR_END;
+ }
+ else if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+
+ case RR_END : if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+ }
+ }
+ switch( st )
+ {
+ case RR_NAME : finish_txt( name, len, &dst );
+ break;
+
+ case RR_START : *start = finish_num( tmp, sizeof tmp, &dst );
+ break;
+
+ case RR_END : *end = finish_num( tmp, sizeof tmp, &dst );
+ break;
+ }
+ }
+}
+
+
+static void CC release_ranges_wrapper( void * item, void * data ) { free_range( item ); }
+
+static void free_reference_region( struct reference_region * self )
+{
+ free( (void*)self->name );
+ VectorWhack ( &self->ranges, release_ranges_wrapper, NULL );
+ free( self );
+}
+
+
+static void merge_overlapping_ranges( struct reference_region * self )
+{
+ uint32_t n = VectorLength( &self->ranges );
+ uint32_t i = 0;
+ struct reference_range * a = NULL;
+ while ( i < n )
+ {
+ struct reference_range * b = VectorGet ( &self->ranges, i );
+ bool remove = false;
+ if ( a != NULL )
+ {
+ remove = range_overlapp( a, b );
+ if ( remove )
+ {
+ struct reference_range * r;
+ a->end = b->end;
+ VectorRemove ( &self->ranges, i, (void**)&r );
+ free( r );
+ n--;
+ }
+ }
+ if ( !remove )
+ {
+ a = b;
+ ++i;
+ }
+ }
+}
+
+
+static void merge_close_ranges_and_create_filter( struct reference_region * self, uint64_t merge_diff )
+{
+ uint32_t n = VectorLength( &self->ranges );
+ uint32_t i = 0;
+ struct reference_range * a = NULL;
+ while ( i < n )
+ {
+ struct reference_range * b = VectorGet ( &self->ranges, i );
+ bool remove = false;
+ if ( a != NULL )
+ {
+ /* get the distance between a and b */
+ uint64_t d = range_distance( a, b );
+ remove = ( d < merge_diff );
+ if ( remove )
+ {
+ struct reference_range * r;
+
+ /* add the gap to the skip-vector of a */
+ struct skip_range * sr = make_skip_range( a->end + 1, b->start - 1 );
+ VectorAppend ( &( a->skip ), NULL, sr );
+
+ /* expand a to merge with b */
+ a->end = b->end;
+
+ /* remove b */
+ VectorRemove ( &self->ranges, i, (void**)&r );
+ free( r );
+ n--;
+ }
+ }
+ if ( !remove )
+ {
+ a = b;
+ ++i;
+ }
+ }
+}
+
+
+/* =========================================================================================== */
+
+static int64_t CC reference_vs_pchar_wrapper( const void *item, const BSTNode *n )
+{
+ const struct reference_region * r = ( const struct reference_region * )n;
+ return cmp_pchar( (const char *)item, r->name );
+}
+
+static struct reference_region * find_reference_region( BSTree * regions, const char * name )
+{
+ return ( struct reference_region * ) BSTreeFind ( regions, name, reference_vs_pchar_wrapper );
+}
+
+static int64_t CC ref_vs_ref_wrapper( const BSTNode *item, const BSTNode *n )
+{
+ const struct reference_region * a = ( const struct reference_region * )item;
+ const struct reference_region * b = ( const struct reference_region * )n;
+ return cmp_pchar( a->name, b->name );
+}
+
+
+rc_t add_region( BSTree * regions, const char * name, const uint64_t start, const uint64_t end )
+{
+ rc_t rc;
+
+ struct reference_region * r = find_reference_region( regions, name );
+ if ( r == NULL )
+ {
+ r = make_reference_region( name );
+ if ( r == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ rc = add_ref_region_range( r, start, end );
+ if ( rc == 0 )
+ rc = BSTreeInsert ( regions, (BSTNode *)r, ref_vs_ref_wrapper );
+ if ( rc != 0 )
+ free_reference_region( r );
+ }
+ else
+ {
+ rc = add_ref_region_range( r, start, end );
+ }
+ return rc;
+}
+
+
+rc_t parse_and_add_region( BSTree * regions, const char * s )
+{
+ uint64_t start, end;
+ char name[ 4096 ];
+ parse_definition( s, name, sizeof name, &start, &end );
+ if ( name[ 0 ] == 0 )
+ return RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ return add_region( regions, name, start, end );
+}
+
+
+/* =========================================================================================== */
+
+
+static void CC slice_report_wrapper( BSTNode *n, void *data )
+{
+ const struct reference_region * r = ( const struct reference_region * )n;
+ uint32_t nr = VectorLength( &( r->ranges ) );
+
+ KOutMsg( "\n-[%s]:\n", r->name );
+ if ( nr == 0 )
+ KOutMsg( " no ranges!\n" );
+ else
+ {
+ uint32_t i, j;
+ for ( i = 0; i < nr; ++i )
+ {
+ const struct reference_range * rr = ( const struct reference_range * ) VectorGet ( &( r->ranges ), i );
+ uint32_t ns = VectorLength( &( rr->skip ) );
+ KOutMsg( " %u ... %u\n", rr->start, rr->end );
+ for ( j = 0; j < ns; ++j )
+ {
+ const struct skip_range * sr = ( const struct skip_range * ) VectorGet ( &( rr->skip ), j );
+ KOutMsg( " ___skip %u ... %u\n", sr->start, sr->end );
+ }
+ }
+ }
+}
+
+
+void slice_report( BSTree * regions )
+{
+ KOutMsg( "\n\nstart slice-report:\n" );
+ BSTreeForEach ( regions, false, slice_report_wrapper, NULL );
+ KOutMsg( "\nend slice-report\n\n" );
+}
+
+static void CC check_refrange_wrapper( BSTNode *n, void *data )
+{
+ struct reference_region * rr = ( struct reference_region * )n;
+ uint64_t * merge_diff = data;
+ merge_overlapping_ranges( rr );
+ if ( *merge_diff > 0 )
+ merge_close_ranges_and_create_filter( rr, *merge_diff );
+}
+
+
+void check_ref_regions( BSTree * regions, uint64_t merge_diff )
+{
+ BSTreeForEach ( regions, false, check_refrange_wrapper, &merge_diff );
+}
+
+
+/* =========================================================================================== */
+
+
+static void CC release_ref_region_wrapper( BSTNode *n, void * data )
+{
+ free_reference_region( ( struct reference_region * ) n );
+}
+
+
+void free_ref_regions( BSTree * regions )
+{
+ BSTreeWhack ( regions, release_ref_region_wrapper, NULL );
+}
+
+
+/* =========================================================================================== */
+
+
+static void CC count_ref_region_wrapper( BSTNode *n, void *data )
+{
+ struct reference_region * r = ( struct reference_region * ) n;
+ uint32_t * count = ( uint32_t * ) data;
+ *count += VectorLength( &(r->ranges) );
+}
+
+
+uint32_t count_ref_regions( BSTree * regions )
+{
+ uint32_t res = 0;
+ BSTreeForEach ( regions, false, count_ref_region_wrapper, &res );
+ return res;
+}
+
+
+/* =========================================================================================== */
+
+
+typedef struct foreach_ref_region_func
+{
+ rc_t ( CC * on_region ) ( const char * name, const struct reference_range * range, void *data );
+ void * data;
+ rc_t rc;
+} foreach_ref_region_func;
+
+
+static bool CC foreach_ref_region_wrapper( BSTNode *n, void *data )
+{
+ struct reference_region * r = ( struct reference_region * ) n;
+ foreach_ref_region_func * func = ( foreach_ref_region_func * )data;
+
+ if ( func->rc == 0 )
+ {
+ uint32_t i, v_count = VectorLength( &( r->ranges ) );
+
+ for ( i = 0; i < v_count && func->rc == 0; ++i )
+ {
+ struct reference_range * rr = VectorGet ( &( r->ranges ), i );
+ func->rc = func->on_region( r->name, rr, func->data );
+ }
+ }
+ return ( func->rc != 0 );
+}
+
+
+rc_t foreach_ref_region( BSTree * regions,
+ rc_t ( CC * on_region ) ( const char * name, const struct reference_range * range, void *data ),
+ void *data )
+{
+ foreach_ref_region_func func;
+
+ func.on_region = on_region;
+ func.data = data;
+ func.rc = 0;
+ BSTreeDoUntil ( regions, false, foreach_ref_region_wrapper, &func );
+ return func.rc;
+}
+
+
+/* =========================================================================================== */
+
+
+const struct reference_region * get_first_ref_node( const BSTree * regions )
+{
+ return ( const struct reference_region * ) BSTreeFirst ( regions );
+}
+
+
+const struct reference_region * get_next_ref_node( const struct reference_region * node )
+{
+ return ( const struct reference_region * ) BSTNodeNext( ( const BSTNode * ) node );
+}
+
+
+const char * get_ref_node_name( const struct reference_region * node )
+{
+ return ( node->name );
+}
+
+
+uint32_t get_ref_node_range_count( const struct reference_region * node )
+{
+ return VectorLength( &( node->ranges ) );
+}
+
+
+const struct reference_range * get_ref_range( const struct reference_region * node, uint32_t idx )
+{
+ const struct reference_range * res = NULL;
+ if ( node != NULL )
+ {
+ uint32_t n = VectorLength( &( node->ranges ) );
+ if ( ( idx >=0 ) && ( idx < n ) )
+ {
+ res = ( const struct reference_range * ) VectorGet ( &( node->ranges ), idx );
+ }
+ }
+ return res;
+}
+
+
+uint64_t get_ref_range_start( const struct reference_range * range )
+{
+ uint64_t res = 0;
+ if ( range != NULL )
+ res = range->start;
+ return res;
+}
+
+
+uint64_t get_ref_range_end( const struct reference_range * range )
+{
+ uint64_t res = 0;
+ if ( range != NULL )
+ res = range->end;
+ return res;
+}
+
+
+/* =========================================================================================== */
+
+
+struct skiplist_ref_node
+{
+ BSTNode node;
+ const char * name;
+ int32_t current_id;
+ const struct skip_range * current_skip_range;
+ Vector skip_ranges; /* holds skip_range structs */
+} skiplist_ref_node;
+
+
+struct skiplist
+{
+ BSTree nodes; /* a tree of skiplist_ref_node 's */
+ uint32_t node_count;
+ struct skiplist_ref_node * current;
+} skiplist;
+
+
+/* helper func to detect if the given reference_region has ranges to be skiped */
+static bool reference_region_has_skip_ranges( const struct reference_region * r )
+{
+ bool res = false;
+ if ( r != NULL )
+ {
+ uint32_t i, n = VectorLength( &r->ranges );
+ for ( i = 0; i < n && !res; ++i )
+ {
+ const struct reference_range * rr = VectorGet ( &( r->ranges ), i );
+ if ( rr != NULL )
+ {
+ if ( VectorLength( &rr->skip ) > 0 ) res = true;
+ }
+ }
+ }
+ return res;
+}
+
+
+/* helper to create a skiplist-node, walk the given the ref-region fo find and enter all skip positions */
+static struct skiplist_ref_node * make_skiplist_ref_node( const struct reference_region * r )
+{
+ struct skiplist_ref_node * res = calloc( 1, sizeof *res );
+ if ( res != NULL )
+ {
+ uint32_t i, n = VectorLength( &r->ranges );
+ res->name = string_dup_measure ( r->name, NULL );
+ VectorInit ( &res->skip_ranges, 0, 5 );
+ /* walk the ranges-Vector of the reference-region */
+ for ( i = 0; i < n; ++i )
+ {
+ const struct reference_range * rr = VectorGet ( &( r->ranges ), i );
+ /* walk the skip-Vector of the reference-range */
+ uint32_t j, n1 = VectorLength( &rr->skip );
+ for ( j = 0; j < n1; ++j )
+ {
+ const struct skip_range * sr = VectorGet ( &( rr->skip ), j );
+ if ( sr != NULL )
+ {
+ struct skip_range * csr = make_skip_range( sr->start, sr->end );
+ if ( csr != NULL )
+ VectorAppend ( &( res->skip_ranges ), NULL, csr );
+ }
+ }
+ }
+ res->current_id = 0;
+ res->current_skip_range = VectorGet ( &( res->skip_ranges ), 0 );
+ }
+ return res;
+}
+
+
+/* helper call back for BSTreeInsert into skiplist->nodes */
+static int64_t CC srn_vs_srn_wrapper( const BSTNode *item, const BSTNode *n )
+{
+ const struct skiplist_ref_node * a = ( const struct skiplist_ref_node * )item;
+ const struct skiplist_ref_node * b = ( const struct skiplist_ref_node * )n;
+ return cmp_pchar( a->name, b->name );
+}
+
+
+/* call back for each reference-region to generate eventually a skiplist_ref_node */
+static void CC visit_region_node_for_skiplist( BSTNode *n, void *data )
+{
+ const struct reference_region * r = ( const struct reference_region * ) n;
+ struct skiplist * skl = ( struct skiplist * ) data;
+ if ( r != NULL && skl != NULL )
+ {
+ /* walk the reference-region, detect if we even have something to skip in here */
+ if ( reference_region_has_skip_ranges( r ) )
+ {
+ struct skiplist_ref_node * srn = make_skiplist_ref_node( r );
+ if ( srn != NULL )
+ {
+ BSTreeInsert ( &(skl->nodes), ( BSTNode * )srn, srn_vs_srn_wrapper );
+ skl->node_count++;
+ }
+ }
+ }
+}
+
+struct skiplist * skiplist_make( BSTree * regions )
+{
+ struct skiplist *res = calloc( 1, sizeof *res );
+ if ( res != NULL )
+ {
+ BSTreeInit( &(res->nodes) );
+ res->current = NULL;
+ res->node_count = 0;
+
+ /* walk the given regions-tree to generate the skip-list */
+ BSTreeForEach ( regions, false, visit_region_node_for_skiplist, res );
+ if ( res->node_count == 0 )
+ {
+ skiplist_release( res );
+ res = NULL;
+ }
+ }
+ return res;
+}
+
+
+static void CC release_skiplist_entry( BSTNode * n, void * data )
+{
+ struct skiplist_ref_node * node = ( struct skiplist_ref_node * )n;
+ if ( node->name != NULL ) free( ( void * ) node->name );
+ VectorWhack ( &node->skip_ranges, release_skip, NULL ); /* wrapper callback reused from above */
+ free( ( void * ) node );
+}
+
+
+void skiplist_release( struct skiplist * list )
+{
+ if ( list != NULL )
+ {
+ BSTreeWhack ( &(list->nodes), release_skiplist_entry, NULL );
+ free( ( void * ) list );
+ }
+}
+
+
+static int64_t CC pchar_vs_srn_cmp( const void * item, const BSTNode * n )
+{
+ const char * name = item;
+ const struct skiplist_ref_node * b = ( const struct skiplist_ref_node * )n;
+ return cmp_pchar( name, b->name );
+
+}
+
+
+void skiplist_enter_ref( struct skiplist * list, const char * name )
+{
+ if ( list != NULL )
+ {
+ if ( name == NULL )
+ list->current = NULL;
+ else
+ {
+ struct skiplist_ref_node * cur_node = ( struct skiplist_ref_node * )BSTreeFind ( &( list->nodes ), name, pchar_vs_srn_cmp );
+ list->current = cur_node;
+ if ( cur_node != NULL )
+ {
+ cur_node->current_id = 0;
+ cur_node->current_skip_range = VectorGet ( &( cur_node->skip_ranges ), 0 );
+ }
+ }
+ }
+}
+
+
+bool skiplist_is_skip_position( struct skiplist * list, uint64_t pos )
+{
+ if ( list != NULL )
+ {
+ struct skiplist_ref_node * cur_node = list->current;
+ if ( cur_node != NULL )
+ {
+ const struct skip_range * curr_skip_range = cur_node->current_skip_range;
+ if ( curr_skip_range != NULL )
+ {
+ if ( pos < curr_skip_range->start ) return false;
+ if ( pos <= curr_skip_range->end ) return true;
+ cur_node->current_id++;
+ cur_node->current_skip_range = VectorGet ( &( cur_node->skip_ranges ), cur_node->current_id );
+ }
+ }
+ }
+ return false;
+}
+
+
+static void CC skiplist_report_cb( BSTNode *n, void *data )
+{
+ const struct skiplist_ref_node * node = ( const struct skiplist_ref_node * )n;
+ uint32_t nr = VectorLength( &( node->skip_ranges ) );
+
+ KOutMsg( "\n-[%s]:\n", node->name );
+ if ( n == 0 )
+ KOutMsg( " no ranges!\n" );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < nr; ++i )
+ {
+ const struct skip_range * sr = ( const struct skip_range * ) VectorGet ( &( node->skip_ranges ), i );
+ KOutMsg( " %u ... %u\n", sr->start, sr->end );
+ }
+ }
+}
+
+
+void skiplist_report( const struct skiplist * list )
+{
+ if ( list != NULL )
+ {
+ KOutMsg( "\n\nstart skiplist-report:\n" );
+ BSTreeForEach ( &( list->nodes ), false, skiplist_report_cb, NULL );
+ KOutMsg( "\nend skiplist-report\n\n" );
+ }
+}
diff --git a/tools/sra-pileup/ref_regions.h b/tools/sra-pileup/ref_regions.h
new file mode 100644
index 0000000..178c3b2
--- /dev/null
+++ b/tools/sra-pileup/ref_regions.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ref_regions_
+#define _h_ref_regions_
+
+#include <klib/container.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct reference_range;
+struct reference_region;
+struct skiplist;
+
+rc_t parse_and_add_region( BSTree * regions, const char * s );
+rc_t add_region( BSTree * regions, const char * name, const uint64_t start, const uint64_t end );
+void check_ref_regions( BSTree * regions, uint64_t merge_diff );
+void free_ref_regions( BSTree * regions );
+uint32_t count_ref_regions( BSTree * regions );
+rc_t foreach_ref_region( BSTree * regions,
+ rc_t ( CC * on_region ) ( const char * name, const struct reference_range * range, void *data ),
+ void *data );
+
+
+const struct reference_region * get_first_ref_node( const BSTree * regions );
+const struct reference_region * get_next_ref_node( const struct reference_region * node );
+const char * get_ref_node_name( const struct reference_region * node );
+uint32_t get_ref_node_range_count( const struct reference_region * node );
+
+
+const struct reference_range * get_ref_range( const struct reference_region * node, uint32_t idx );
+uint64_t get_ref_range_start( const struct reference_range * range );
+uint64_t get_ref_range_end( const struct reference_range * range );
+
+
+struct skiplist * skiplist_make( BSTree * regions );
+void skiplist_release( struct skiplist * list );
+void skiplist_enter_ref( struct skiplist * list, const char * name );
+bool skiplist_is_skip_position( struct skiplist * list, uint64_t pos );
+void skiplist_report( const struct skiplist * list );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ref_regions_ */
diff --git a/tools/sra-pileup/ref_walker.c b/tools/sra-pileup/ref_walker.c
new file mode 100644
index 0000000..0833854
--- /dev/null
+++ b/tools/sra-pileup/ref_walker.c
@@ -0,0 +1,1028 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ref_regions.h"
+#include "ref_walker.h"
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/out.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+
+#include <align/manager.h>
+#include <align/reference.h>
+#include <align/iterator.h>
+
+#include <sra/sraschema.h>
+
+#include <stdlib.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <string.h>
+
+
+
+/* ================================================================================================ */
+
+
+/***************************************
+ N (0x4E) n (0x6E) <--> 0x0
+ A (0x41) a (0x61) <--> 0x1
+ C (0x43) c (0x63) <--> 0x2
+ M (0x4D) m (0x6D) <--> 0x3
+ G (0x47) g (0x67) <--> 0x4
+ R (0x52) r (0x72) <--> 0x5
+ S (0x53) s (0x73) <--> 0x6
+ V (0x56) v (0x76) <--> 0x7
+ T (0x54) t (0x74) <--> 0x8
+ W (0x57) w (0x77) <--> 0x9
+ Y (0x59) y (0x79) <--> 0xA
+ H (0x48) h (0x68) <--> 0xB
+ K (0x4B) k (0x6B) <--> 0xC
+ D (0x44) d (0x64) <--> 0xD
+ B (0x42) b (0x62) <--> 0xE
+ N (0x4E) n (0x6E) <--> 0xF
+***************************************/
+
+
+static char _4na_2_ascii_tab[] =
+{
+/* 0x0 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F */
+ 'N', 'A', 'C', 'M', 'G', 'R', 'S', 'V', 'T', 'W', 'Y', 'H', 'K', 'D', 'B', 'N',
+ 'n', 'a', 'c', 'm', 'g', 'r', 's', 'v', 't', 'w', 'y', 'h', 'k', 'd', 'b', 'n'
+};
+
+
+static char _4na_to_ascii( INSDC_4na_bin c, bool reverse )
+{
+ return _4na_2_ascii_tab[ ( c & 0x0F ) | ( reverse ? 0x10 : 0 ) ];
+}
+
+
+/* ================================================================================================ */
+
+
+struct ref_walker
+{
+ /* objects that stay alive during the livetime of the ref-walker */
+ KDirectory * dir;
+ const VDBManager * vmgr;
+ VSchema * vschema;
+ const AlignMgr * amgr;
+ VFSManager * vfs_mgr;
+ PlacementRecordExtendFuncs cb_block;
+ struct skiplist * skiplist;
+
+ /* options for the Reference-Iterator */
+ int32_t min_mapq;
+ uint32_t interest;
+ uint64_t merge_diff;
+ bool prepared;
+ char * spot_group;
+
+ /* manages the sources and regions requested */
+ VNamelist * sources;
+ BSTree regions;
+
+ /* enter/exit reference */
+ rc_t ( CC * on_enter_ref ) ( ref_walker_data * rwd );
+ rc_t ( CC * on_exit_ref ) ( ref_walker_data * rwd );
+
+ /* enter/exit reference-window */
+ rc_t ( CC * on_enter_ref_window ) ( ref_walker_data * rwd );
+ rc_t ( CC * on_exit_ref_window ) ( ref_walker_data * rwd );
+
+ /* enter/exit reference-pos */
+ rc_t ( CC * on_enter_ref_pos ) ( ref_walker_data * rwd );
+ rc_t ( CC * on_exit_ref_pos ) ( ref_walker_data * rwd );
+
+ /* enter/exit spot-group */
+ rc_t ( CC * on_enter_spot_group ) ( ref_walker_data * rwd );
+ rc_t ( CC * on_exit_spot_group ) ( ref_walker_data * rwd );
+
+ /* alignment */
+ rc_t ( CC * on_alignment ) ( ref_walker_data * rwd );
+
+ /* callbacks for different events */
+} ref_walker;
+
+
+static void ref_walker_release( struct ref_walker * self )
+{
+ KDirectoryRelease( self->dir );
+ VDBManagerRelease( self->vmgr );
+ VSchemaRelease( self->vschema );
+ AlignMgrRelease ( self->amgr );
+ VFSManagerRelease ( self->vfs_mgr );
+ VNamelistRelease ( self->sources );
+ free_ref_regions( &self->regions );
+ free( ( void * )self->spot_group );
+ if ( self->skiplist != NULL ) skiplist_release( self->skiplist );
+}
+
+
+/* ================================================================================================ */
+/* data/callbacks used by Reference-iterator */
+
+
+typedef struct walker_col_ids
+{
+ uint32_t idx_quality;
+ uint32_t idx_ref_orientation;
+ uint32_t idx_read_filter;
+ uint32_t idx_template_len;
+} walker_col_ids;
+
+
+typedef struct walker_rec
+{
+ bool reverse; /* orientation towards reference ( false...in ref-orientation / true...reverse) */
+ int32_t tlen; /* template-len, for statistical analysis */
+ uint8_t * quality; /* ptr to quality... ( for sam-output ) */
+} walker_rec;
+
+
+static rc_t read_base_and_len( struct VCursor const *curs,
+ uint32_t column_idx,
+ int64_t row_id,
+ const void ** base,
+ uint32_t * len )
+{
+ uint32_t elem_bits, boff, len_intern;
+ const void * ptr;
+ rc_t rc = VCursorCellDataDirect ( curs, row_id, column_idx, &elem_bits, &ptr, &boff, &len_intern );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorCellDataDirect() failed" );
+ }
+ else
+ {
+ if ( len != NULL ) *len = len_intern;
+ if ( base != NULL ) *base = ptr;
+ }
+ return rc;
+}
+
+
+static rc_t CC populate_data( void *obj, const PlacementRecord *placement,
+ struct VCursor const *curs, INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len,
+ void *data, void * placement_ctx )
+{
+ walker_rec * rec = obj;
+ struct ref_walker * walker = data;
+ walker_col_ids * col_ids = placement_ctx;
+ rc_t rc = 0;
+
+ rec->quality = NULL;
+ if ( !( walker->interest & RW_INTEREST_DUPS ) )
+ {
+ const uint8_t * read_filter;
+ uint32_t read_filter_len;
+ rc = read_base_and_len( curs, col_ids->idx_read_filter, placement->id,
+ (const void **)&read_filter, &read_filter_len );
+ if ( rc == 0 )
+ {
+ if ( ( *read_filter == SRA_READ_FILTER_REJECT )||
+ ( *read_filter == SRA_READ_FILTER_CRITERIA ) )
+ {
+ rc = RC( rcAlign, rcType, rcAccessing, rcId, rcIgnored );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ const bool * orientation;
+ rc = read_base_and_len( curs, col_ids->idx_ref_orientation, placement->id,
+ (const void **)&orientation, NULL );
+ if ( rc == 0 )
+ rec->reverse = *orientation;
+ }
+
+ if ( rc == 0 && ( walker->interest & RW_INTEREST_QUAL ) )
+ {
+ const uint8_t * quality;
+ uint32_t quality_len;
+
+ rc = read_base_and_len( curs, col_ids->idx_quality, placement->id,
+ (const void **)&quality, &quality_len );
+ if ( rc == 0 )
+ {
+ rec->quality = ( uint8_t * )rec;
+ rec->quality += sizeof ( * rec );
+ memmove( rec->quality, quality, quality_len );
+ }
+ }
+
+ if ( rc == 0 && ( walker->interest & RW_INTEREST_TLEN ) )
+ {
+ const int32_t * tlen;
+ uint32_t tlen_len;
+
+ rc = read_base_and_len( curs, col_ids->idx_template_len, placement->id,
+ (const void **)&tlen, &tlen_len );
+ if ( rc == 0 && tlen_len > 0 )
+ rec->tlen = *tlen;
+ else
+ rec->tlen = 0;
+ }
+ else
+ rec->tlen = 0;
+
+ return rc;
+}
+
+
+static rc_t CC alloc_size( struct VCursor const *curs, int64_t row_id, size_t * size,
+ void *data, void * placement_ctx )
+{
+ rc_t rc = 0;
+ walker_rec * rec;
+ struct ref_walker * walker = data;
+ walker_col_ids * col_ids = placement_ctx;
+ *size = ( sizeof *rec );
+
+ if ( walker->interest & RW_INTEREST_QUAL )
+ {
+ uint32_t q_len;
+ rc = read_base_and_len( curs, col_ids->idx_quality, row_id, NULL, &q_len );
+ if ( rc == 0 )
+ *size += q_len;
+ }
+ return rc;
+}
+
+
+/* ================================================================================================ */
+
+
+static rc_t ref_walker_init( struct ref_walker * self )
+{
+ rc_t rc = KDirectoryNativeDir( &self->dir );
+ if ( rc == 0 )
+ rc = VDBManagerMakeRead ( &self->vmgr, self->dir );
+ if ( rc == 0 )
+ rc = VDBManagerMakeSRASchema( self->vmgr, &self->vschema );
+ if ( rc == 0 )
+ rc = AlignMgrMakeRead ( &self->amgr );
+ if ( rc == 0 )
+ rc = VFSManagerMake ( &self->vfs_mgr );
+ if ( rc == 0 )
+ rc = VNamelistMake ( &self->sources, 10 );
+
+ self->cb_block.data = self;
+ self->cb_block.destroy = NULL;
+ self->cb_block.populate = populate_data;
+ self->cb_block.alloc_size = alloc_size;
+ self->cb_block.fixed_size = 0;
+
+ BSTreeInit( &self->regions );
+ self->interest = RW_INTEREST_PRIM;
+ self->skiplist = 0;
+ self->merge_diff = 0;
+
+ if ( rc != 0 )
+ ref_walker_release( self );
+ return rc;
+}
+
+
+/* ================================================================================================ */
+
+
+rc_t ref_walker_create( struct ref_walker ** self )
+{
+ rc_t rc;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ struct ref_walker * o = calloc( 1, sizeof **self );
+ *self = NULL;
+ if ( o == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ rc = ref_walker_init( o );
+ if ( rc == 0 )
+ {
+ *self = o;
+ }
+ else
+ free( ( void * )o );
+ }
+ }
+ return rc;
+}
+
+
+/* ================================================================================================ */
+
+
+rc_t ref_walker_set_min_mapq( struct ref_walker * self, int32_t min_mapq )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ self->min_mapq = min_mapq;
+ return 0;
+}
+
+
+rc_t ref_walker_set_spot_group( struct ref_walker * self, const char * spot_group )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ self->spot_group = string_dup ( spot_group, string_size( spot_group ) );
+ return 0;
+}
+
+
+rc_t ref_walker_set_merge_diff( struct ref_walker * self, uint64_t merge_diff )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ self->merge_diff = merge_diff;
+ return 0;
+}
+
+rc_t ref_walker_set_interest( struct ref_walker * self, uint32_t interest )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ self->interest = interest;
+ return 0;
+}
+
+
+rc_t ref_walker_get_interest( struct ref_walker * self, uint32_t * interest )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ if ( interest == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcParam, rcNull );
+ *interest = self->interest;
+ return 0;
+}
+
+/* ================================================================================================ */
+
+
+rc_t ref_walker_set_callbacks( struct ref_walker * self, ref_walker_callbacks * callbacks )
+{
+ if ( self == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcSelf, rcNull );
+ if ( callbacks == NULL )
+ return RC( rcApp, rcNoTarg, rcAccessing, rcParam, rcNull );
+
+ self->on_enter_ref = callbacks->on_enter_ref;
+ self->on_exit_ref = callbacks->on_exit_ref;
+ self->on_enter_ref_window = callbacks->on_enter_ref_window;
+ self->on_exit_ref_window = callbacks->on_exit_ref_window;
+ self->on_enter_ref_pos = callbacks->on_enter_ref_pos;
+ self->on_exit_ref_pos = callbacks->on_exit_ref_pos;
+ self->on_enter_spot_group = callbacks->on_enter_spot_group;
+ self->on_exit_spot_group = callbacks->on_exit_spot_group;
+ self->on_alignment = callbacks->on_alignment;
+
+ return 0;
+}
+
+
+/* ================================================================================================ */
+
+
+rc_t ref_walker_add_source( struct ref_walker * self, const char * src )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ else
+ rc = VNamelistAppend ( self->sources, src );
+ return rc;
+}
+
+
+rc_t ref_walker_parse_and_add_range( struct ref_walker * self, const char * range )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ else
+ rc = parse_and_add_region( &self->regions, range );
+ return rc;
+}
+
+
+rc_t ref_walker_add_range( struct ref_walker * self, const char * name, const uint64_t start, const uint64_t end )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ else
+ rc = add_region( &self->regions, name, start, end );
+ return rc;
+}
+
+
+static rc_t ref_walker_prepare_1_src( struct ref_walker * self, const char * name )
+{
+ VPath * path = NULL;
+ const VPath * local_cache = NULL;
+ const KFile * remote_file = NULL;
+ rc_t rc = VFSManagerResolveSpec ( self->vfs_mgr, name, &path, &remote_file, &local_cache, true );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot resolve '$(n)' via VFSManager", "n=%s", name ) );
+ }
+ else
+ {
+ char buffer[ 4096 ];
+ size_t num_read;
+ rc = VPathReadPath ( path, buffer, sizeof buffer, &num_read );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot read path from vpath for '$(n)'", "n=%s", name ) );
+ }
+ else
+ {
+ if ( rc == 0 )
+ {
+ int path_type = ( VDBManagerPathType ( self->vmgr, "%s", buffer ) & ~ kptAlias );
+ if ( path_type == kptDatabase )
+ {
+ const ReferenceList * reflist;
+ uint32_t options = ( ereferencelist_usePrimaryIds |
+ ereferencelist_useSecondaryIds |
+ ereferencelist_useEvidenceIds );
+ rc = ReferenceList_MakePath( &reflist, self->vmgr, name, options, 0, NULL, 0 );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "cannot create ReferenceList for '$(n)'", "n=%s", name ) );
+ }
+ else
+ {
+ uint32_t count;
+ rc = ReferenceList_Count( reflist, &count );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogErr, ( klogErr, rc, "ReferenceList_Count() for '$(n)' failed", "n=%s", name ) );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const ReferenceObj * refobj;
+ rc = ReferenceList_Get( reflist, &refobj, idx );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceList_Get() failed" );
+ }
+ else
+ {
+ const char * seqid;
+ rc = ReferenceObj_SeqId( refobj, &seqid );
+ if ( rc == 0 )
+ {
+ INSDC_coord_len seqlen;
+ rc = ReferenceObj_SeqLength( refobj, &seqlen );
+ if ( rc == 0 )
+ {
+ rc = add_region( &self->regions, seqid, 0, seqlen - 1 );
+ }
+ }
+ ReferenceObj_Release( refobj );
+ }
+ }
+ }
+ ReferenceList_Release( reflist );
+ }
+ }
+ }
+ }
+ KFileRelease( remote_file );
+ VPathRelease ( local_cache );
+ VPathRelease ( path );
+ }
+ return rc;
+}
+
+
+static rc_t ref_walker_prepare( struct ref_walker * self )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ uint32_t s_count = 0;
+ rc = VNameListCount ( self->sources, &s_count );
+ if ( rc == 0 && s_count > 0 )
+ {
+ uint32_t r_count = count_ref_regions( &self->regions );
+ if ( r_count == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < s_count && rc == 0; ++idx )
+ {
+ const char * name = NULL;
+ rc = VNameListGet ( self->sources, idx, &name );
+ if ( rc == 0 && name != NULL )
+ rc = ref_walker_prepare_1_src( self, name );
+ }
+ }
+ }
+ check_ref_regions( &self->regions, self->merge_diff );
+ if ( self->merge_diff > 0 )
+ self->skiplist = skiplist_make( &self->regions );
+ self->prepared = ( rc == 0 );
+ }
+ return rc;
+}
+
+
+static uint32_t ref_walker_make_reflist_options( struct ref_walker * self )
+{
+ uint32_t res = ereferencelist_4na;
+
+ if ( self->interest & RW_INTEREST_PRIM )
+ res |= ereferencelist_usePrimaryIds;
+
+ if ( self->interest & RW_INTEREST_SEC )
+ res |= ereferencelist_useSecondaryIds;
+
+ if ( self->interest & RW_INTEREST_EV )
+ res |= ereferencelist_useEvidenceIds;
+
+ return res;
+}
+
+
+static rc_t make_cursor_ids( Vector * cursor_id_vector, walker_col_ids ** cursor_ids )
+{
+ rc_t rc;
+ walker_col_ids * ids = malloc( sizeof * ids );
+ if ( ids == NULL )
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcMemory, rcExhausted );
+ else
+ {
+ rc = VectorAppend ( cursor_id_vector, NULL, ids );
+ if ( rc != 0 )
+ free( ids );
+ else
+ *cursor_ids = ids;
+ }
+ return rc;
+}
+
+#define COL_QUALITY "QUALITY"
+#define COL_REF_ORIENTATION "REF_ORIENTATION"
+#define COL_READ_FILTER "READ_FILTER"
+#define COL_TEMPLATE_LEN "TEMPLATE_LEN"
+
+static rc_t add_required_columns( struct ref_walker * self, const VTable *tbl, const VCursor ** cursor,
+ walker_col_ids * cursor_ids )
+{
+ rc_t rc = VTableCreateCursorRead ( tbl, cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VTableCreateCursorRead() failed" );
+ }
+
+ if ( rc == 0 && ( self->interest & RW_INTEREST_QUAL ) )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_quality, COL_QUALITY );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(QUALITY) failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_ref_orientation, COL_REF_ORIENTATION );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(REF_ORIENTATION) failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_read_filter, COL_READ_FILTER );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(READ_FILTER) failed" );
+ }
+ }
+
+ if ( rc == 0 && ( self->interest & RW_INTEREST_TLEN ) )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_template_len, COL_TEMPLATE_LEN );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(TEMPLATE_LEN) failed" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t ref_walker_add_iterator( struct ref_walker * self, const char * ref_name,
+ uint64_t start, uint64_t end, const char * src_name, Vector * cur_id_vector,
+ const VDatabase *db, const ReferenceObj * ref_obj, ReferenceIterator * ref_iter,
+ const char * table_name, align_id_src id_selector )
+{
+ walker_col_ids * cursor_ids;
+ rc_t rc = make_cursor_ids( cur_id_vector, &cursor_ids );
+ if ( rc == 0 )
+ {
+ const VTable *tbl;
+ rc_t rc = VDatabaseOpenTableRead ( db, &tbl, "%s", table_name );
+ if ( rc == 0 )
+ {
+ const VCursor *cursor;
+ rc = add_required_columns( self, tbl, &cursor, cursor_ids );
+ if ( rc == 0 )
+ {
+ rc = ReferenceIteratorAddPlacements ( ref_iter, /* the outer ref-iter */
+ ref_obj, /* the ref-obj for this chromosome */
+ start - 1, /* start ( zero-based ) */
+ ( end - start ) + 1, /* length */
+ NULL, /* ref-cursor */
+ cursor, /* align-cursor */
+ id_selector, /* which id's */
+ self->spot_group, /* what read-group */
+ cursor_ids /* placement-context */
+ );
+ VCursorRelease( cursor );
+ }
+ VTableRelease ( tbl );
+ }
+ }
+ return rc;
+}
+
+
+#define TBL_PRIM "PRIMARY_ALIGNMENT"
+#define TBL_SEC "SECONDARY_ALIGNMENT"
+#define TBL_EV "EVIDENCE_ALIGNMENT"
+
+rc_t CC Quitting( void );
+
+static rc_t ref_walker_walk_alignment( struct ref_walker * self,
+ ReferenceIterator * ref_iter,
+ const PlacementRecord * rec,
+ ref_walker_data * rwd )
+{
+ rc_t rc;
+
+ /* cast the generic record comming from the iterator into the tool-specific one */
+ walker_rec * xrec = PlacementRecordCast ( rec, placementRecordExtension1 );
+
+ /* get all the state of the ref_iter out */
+ rwd->state = ReferenceIteratorState ( ref_iter, &rwd->seq_pos );
+ rwd->valid = ( ( rwd->state & align_iter_invalid ) == 0 );
+
+ rwd->first = ( ( rwd->state & align_iter_first ) == align_iter_first );
+ rwd->last = ( ( rwd->state & align_iter_last ) == align_iter_last );
+
+ rwd->match = ( ( rwd->state & align_iter_match ) == align_iter_match );
+ rwd->skip = ( ( rwd->state & align_iter_skip ) == align_iter_skip );
+
+ rwd->reverse = xrec->reverse;
+
+ if ( self->interest & RW_INTEREST_BASE )
+ {
+ rwd->bin_alignment_base = ( rwd->state & 0x0F );
+ if ( !rwd->match )
+ rwd->ascii_alignment_base = _4na_to_ascii( rwd->state, rwd->reverse );
+ else
+ rwd->ascii_alignment_base = rwd->ascii_ref_base;
+ }
+
+ if ( self->interest & RW_INTEREST_QUAL )
+ {
+ if ( rwd->skip )
+ rwd->quality = ( xrec->quality[ rwd->seq_pos + 1 ] + 33 );
+ else
+ rwd->quality = ( xrec->quality[ rwd->seq_pos ] + 33 );
+ }
+
+ rwd->mapq = rec->mapq;
+
+ if ( self->interest & RW_INTEREST_INDEL )
+ {
+ rwd->ins = ( ( rwd->state & align_iter_insert ) == align_iter_insert );
+ rwd->del = ( ( rwd->state & align_iter_delete ) == align_iter_delete );
+
+ if ( rwd->ins )
+ rwd->ins_bases_count = ReferenceIteratorBasesInserted ( ref_iter, &rwd->ins_bases );
+ if ( rwd->del )
+ rwd->del_bases_count = ReferenceIteratorBasesDeleted ( ref_iter, &rwd->del_ref_pos, &rwd->del_bases );
+ }
+
+ if ( self->interest & RW_INTEREST_DEBUG )
+ {
+ rwd->alignment_id = rec->id;
+ rwd->alignment_start_pos = rec->pos;
+ rwd->alignment_len = rec->len;
+ }
+
+ rc = self->on_alignment( rwd );
+
+ if ( self->interest & RW_INTEREST_INDEL && rwd->del && ( rwd->del_bases_count > 0 ) )
+ free( ( void * )rwd->del_bases );
+
+ return rc;
+}
+
+
+/* free all cursor-ids-blocks created in parallel with the alignment-cursor */
+static void CC cur_id_vector_entry_whack( void *item, void *data )
+{
+ walker_col_ids * ids = item;
+ free( ids );
+}
+
+static rc_t ref_walker_walk_ref_range( struct ref_walker * self, ref_walker_data * rwd )
+{
+ ReferenceIterator * ref_iter;
+ rc_t rc = AlignMgrMakeReferenceIterator ( self->amgr, &ref_iter, &self->cb_block, self->min_mapq ); /* align/iterator.h */
+ if ( rc == 0 )
+ {
+ /* construct the reference iterator */
+
+ uint32_t idx, count;
+ uint32_t reflist_options = ref_walker_make_reflist_options( self ); /* above */
+ Vector cur_id_vector;
+ VectorInit ( &cur_id_vector, 0, 12 );
+
+ rc = VNameListCount ( self->sources, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * src_name = NULL;
+ rc = VNameListGet ( self->sources, idx, &src_name );
+ if ( rc == 0 && src_name != NULL )
+ {
+ const VDatabase *db;
+ rc = VDBManagerOpenDBRead ( self->vmgr, &db, self->vschema, "%s", src_name );
+ if ( rc == 0 )
+ {
+ const ReferenceList * ref_list;
+ rc = ReferenceList_MakeDatabase( &ref_list, db, reflist_options, 0, NULL, 0 );
+ if ( rc == 0 )
+ {
+ const ReferenceObj * ref_obj;
+ rc = ReferenceList_Find( ref_list, &ref_obj, rwd->ref_name, string_size( rwd->ref_name ) );
+ if ( rc == 0 )
+ {
+ INSDC_coord_len len;
+ rc = ReferenceObj_SeqLength( ref_obj, &len );
+ if ( rc == 0 )
+ {
+ if ( rwd->ref_start == 0 )
+ rwd->ref_start = 1;
+ if ( ( rwd->ref_end == 0 )||( rwd->ref_end > len + 1 ) )
+ rwd->ref_end = ( len - rwd->ref_start ) + 1;
+
+ if ( self->interest & RW_INTEREST_PRIM )
+ rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name,
+ &cur_id_vector, db, ref_obj, ref_iter, TBL_PRIM, primary_align_ids );
+
+ if ( rc == 0 && ( self->interest & RW_INTEREST_SEC ) )
+ rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name,
+ &cur_id_vector, db, ref_obj, ref_iter, TBL_SEC, secondary_align_ids );
+
+ if ( rc == 0 && ( self->interest & RW_INTEREST_EV ) )
+ rc = ref_walker_add_iterator( self, rwd->ref_name, rwd->ref_start, rwd->ref_end, src_name,
+ &cur_id_vector, db, ref_obj, ref_iter, TBL_EV, evidence_align_ids );
+
+ }
+ ReferenceObj_Release( ref_obj );
+ }
+ ReferenceList_Release( ref_list );
+ }
+ VDatabaseRelease( db );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* walk the reference iterator */
+
+ /* because in this strategy, each ref-iter contains only 1 ref-obj, no need for a loop */
+ struct ReferenceObj const * ref_obj;
+ rc = ReferenceIteratorNextReference( ref_iter, NULL, NULL, &ref_obj );
+ if ( rc == 0 && ref_obj != NULL )
+ {
+
+ if ( self->interest & RW_INTEREST_SEQNAME )
+ rc = ReferenceObj_Name( ref_obj, &rwd->ref_name );
+ else
+ rc = ReferenceObj_SeqId( ref_obj, &rwd->ref_name );
+
+ if ( rc == 0 )
+ {
+ INSDC_coord_zero first_pos;
+ INSDC_coord_len len;
+ rc_t rc_w = 0, rc_p;
+ while ( rc == 0 && rc_w == 0 )
+ {
+ rc_w = ReferenceIteratorNextWindow ( ref_iter, &first_pos, &len );
+ if ( rc_w == 0 )
+ {
+ rc_p = 0;
+ while( rc == 0 && rc_p == 0 )
+ {
+ rc_p = ReferenceIteratorNextPos ( ref_iter, ( self->interest & RW_INTEREST_SKIP ) );
+ if ( rc_p == 0 )
+ {
+ rc = ReferenceIteratorPosition ( ref_iter, &rwd->pos, &rwd->depth, &rwd->bin_ref_base );
+ if ( rwd->depth > 0 && rc == 0 )
+ {
+ rc_t rc_sg = 0;
+ bool skip = false;
+
+ if ( self->skiplist != NULL )
+ skip = skiplist_is_skip_position( self->skiplist, rwd->pos + 1 );
+
+ if ( !skip )
+ {
+ rwd->ascii_ref_base = _4na_to_ascii( rwd->bin_ref_base, false );
+ if ( self->on_enter_ref_pos != NULL )
+ rc = self->on_enter_ref_pos( rwd );
+
+ while ( rc_sg == 0 && rc == 0 )
+ {
+ rc_sg = ReferenceIteratorNextSpotGroup ( ref_iter, &rwd->spot_group, &rwd->spot_group_len );
+ if ( rc_sg == 0 )
+ {
+ rc_t rc_pr = 0;
+ if ( self->on_enter_spot_group != NULL )
+ rc = self->on_enter_spot_group( rwd );
+
+ while ( rc == 0 && rc_pr == 0 )
+ {
+ const PlacementRecord * rec;
+ rc_pr = ReferenceIteratorNextPlacement ( ref_iter, &rec );
+ if ( rc_pr == 0 && self->on_alignment != NULL )
+ rc = ref_walker_walk_alignment( self, ref_iter, rec, rwd );
+ }
+
+ if ( self->on_exit_spot_group != NULL )
+ rc = self->on_exit_spot_group( rwd );
+ }
+ }
+ if ( self->on_exit_ref_pos != NULL )
+ rc = self->on_exit_ref_pos( rwd );
+ }
+ }
+ rc = Quitting();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ReferenceIteratorRelease ( ref_iter );
+
+ /* free cur_id_vector */
+ VectorWhack ( &cur_id_vector, cur_id_vector_entry_whack, NULL );
+ }
+ return rc;
+}
+
+
+static rc_t ref_walker_walk_ref_region( struct ref_walker * self,
+ const struct reference_region * region, ref_walker_data * rwd )
+{
+ rc_t rc = 0;
+ uint32_t idx, count = get_ref_node_range_count( region );
+ rwd->ref_name = get_ref_node_name( region );
+
+ rwd->ref_start = 0;
+ rwd->ref_end = 0;
+ rwd->pos = 0;
+ rwd->depth = 0;
+ rwd->bin_ref_base = 0;
+ rwd->ascii_ref_base = 0;
+ rwd->spot_group = NULL;
+ rwd->spot_group_len = 0;
+ rwd->state = 0;
+ rwd->reverse = 0;
+
+ if ( self->on_enter_ref != NULL )
+ rc = self->on_enter_ref( rwd );
+
+ if ( rc == 0 )
+ {
+ if ( self->skiplist != NULL )
+ skiplist_enter_ref( self->skiplist, rwd->ref_name );
+
+ for ( idx = 0; idx < count; ++ idx )
+ {
+ const struct reference_range * range = get_ref_range( region, idx );
+ if ( range != NULL )
+ {
+ rwd->ref_start = get_ref_range_start( range );
+ rwd->ref_end = get_ref_range_end( range );
+ if ( self->on_enter_ref_window != NULL )
+ rc = self->on_enter_ref_window( rwd );
+ if ( rc == 0 )
+ {
+ rc = ref_walker_walk_ref_range( self, rwd );
+ if ( rc == 0 && self->on_exit_ref_window != NULL )
+ rc = self->on_exit_ref_window( rwd );
+ }
+ rwd->ref_start = 0;
+ rwd->ref_end = 0;
+ }
+ }
+
+ if ( self->on_exit_ref != NULL )
+ rc = self->on_exit_ref( rwd );
+ }
+ rwd->ref_name = NULL;
+
+ return rc;
+}
+
+
+rc_t ref_walker_walk( struct ref_walker * self, void * data )
+{
+ rc_t rc = 0;
+ if ( self == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ if ( !self->prepared )
+ rc = ref_walker_prepare( self );
+
+ if ( rc == 0 && self->prepared )
+ {
+ const struct reference_region * region = get_first_ref_node( &self->regions );
+ while ( region != NULL && rc == 0 )
+ {
+ ref_walker_data rwd; /* this record will be passed to all the enter/exit callback's */
+ rwd.data = data;
+
+ rc = ref_walker_walk_ref_region( self, region, &rwd );
+ if ( rc == 0 )
+ region = get_next_ref_node( region );
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t ref_walker_destroy( struct ref_walker * self )
+{
+ rc_t rc = 0;
+ if ( self != NULL )
+ {
+ ref_walker_release( self );
+ free( ( void * ) self );
+ }
+ return rc;
+}
+
diff --git a/tools/sra-pileup/ref_walker.h b/tools/sra-pileup/ref_walker.h
new file mode 100644
index 0000000..db109a9
--- /dev/null
+++ b/tools/sra-pileup/ref_walker.h
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ref_walker_
+#define _h_ref_walker_
+
+#include <klib/container.h>
+#include <insdc/sra.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ref_walker;
+
+
+/* create the ref-walker ( not ref-counted ) */
+rc_t ref_walker_create( struct ref_walker ** self );
+
+#define RW_INTEREST_INDEL 0x0001
+#define RW_INTEREST_DEBUG 0x0002
+#define RW_INTEREST_BASE 0x0004
+#define RW_INTEREST_QUAL 0x0008
+#define RW_INTEREST_SKIP 0x0010
+#define RW_INTEREST_DUPS 0x0020
+#define RW_INTEREST_TLEN 0x0040
+#define RW_INTEREST_SEQNAME 0x0080
+#define RW_INTEREST_PRIM 0x0100
+#define RW_INTEREST_SEC 0x0200
+#define RW_INTEREST_EV 0x0400
+
+typedef struct ref_walker_data
+{
+ /* for the reference - level */
+ const char * ref_name;
+ uint64_t ref_start;
+ uint64_t ref_end;
+
+ /* for the position - level */
+ INSDC_coord_zero pos;
+ uint32_t depth;
+ INSDC_4na_bin bin_ref_base;
+ char ascii_ref_base;
+
+ /* for the spot-group - level */
+ const char * spot_group;
+ size_t spot_group_len;
+
+ /* for the alignment - level */
+ int32_t state, mapq;
+ INSDC_4na_bin bin_alignment_base;
+ char ascii_alignment_base;
+ char quality;
+ INSDC_coord_zero seq_pos;
+ bool ins, del, reverse, first, last, skip, match, valid;
+
+ /* indels for alignment */
+ const INSDC_4na_bin * ins_bases;
+ uint32_t ins_bases_count;
+
+ INSDC_coord_zero del_ref_pos;
+ const INSDC_4na_bin * del_bases;
+ uint32_t del_bases_count;
+
+ /* for debugging purpose */
+ uint64_t alignment_id;
+ uint32_t alignment_start_pos;
+ uint32_t alignment_len;
+
+ void * data;
+} ref_walker_data;
+
+
+typedef rc_t ( CC * ref_walker_callback )( ref_walker_data * rwd );
+
+
+typedef struct ref_walker_callbacks
+{
+ ref_walker_callback on_enter_ref;
+ ref_walker_callback on_exit_ref;
+
+ ref_walker_callback on_enter_ref_window;
+ ref_walker_callback on_exit_ref_window;
+
+ ref_walker_callback on_enter_ref_pos;
+ ref_walker_callback on_exit_ref_pos;
+
+ ref_walker_callback on_enter_spot_group;
+ ref_walker_callback on_exit_spot_group;
+
+ ref_walker_callback on_alignment;
+} ref_walker_callbacks;
+
+
+/* set boolean / numeric parameters */
+rc_t ref_walker_set_min_mapq( struct ref_walker * self, int32_t min_mapq );
+rc_t ref_walker_set_spot_group( struct ref_walker * self, const char * spot_group );
+rc_t ref_walker_set_merge_diff( struct ref_walker * self, uint64_t merge_diff );
+rc_t ref_walker_set_interest( struct ref_walker * self, uint32_t interest );
+rc_t ref_walker_get_interest( struct ref_walker * self, uint32_t * interest );
+
+/* set callbacks */
+rc_t ref_walker_set_callbacks( struct ref_walker * self, ref_walker_callbacks * callbacks );
+
+/* add_sources and ranges */
+rc_t ref_walker_add_source( struct ref_walker * self, const char * src );
+
+rc_t ref_walker_parse_and_add_range( struct ref_walker * self, const char * range );
+
+rc_t ref_walker_add_range( struct ref_walker * self, const char * name, const uint64_t start, const uint64_t end );
+
+
+/* walk the sources/ranges by calling the supplied call-backs, passing data to the callbacks */
+rc_t ref_walker_walk( struct ref_walker * self, void * data );
+
+
+/* destroy the ref-walker */
+rc_t ref_walker_destroy( struct ref_walker * self );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ref_walker_ */
diff --git a/tools/sra-pileup/ref_walker_0.c b/tools/sra-pileup/ref_walker_0.c
new file mode 100644
index 0000000..a620ec0
--- /dev/null
+++ b/tools/sra-pileup/ref_walker_0.c
@@ -0,0 +1,231 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ref_walker_0.h"
+
+rc_t CC Quitting( void );
+
+static rc_t walk_placements( walk_data * data, walk_funcs * funcs )
+{
+ rc_t rc;
+ do
+ {
+ rc = ReferenceIteratorNextPlacement ( data->ref_iter, &data->rec );
+ if ( GetRCState( rc ) != rcDone )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextPlacement() failed" );
+ }
+ else
+ {
+ data->state = ReferenceIteratorState ( data->ref_iter, &data->seq_pos );
+ data->xrec = ( tool_rec * ) PlacementRecordCast ( data->rec, placementRecordExtension1 );
+ if ( funcs->on_placement != NULL )
+ rc = funcs->on_placement( data );
+ }
+ }
+ } while ( rc == 0 );
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+static rc_t walk_spot_group( walk_data * data, walk_funcs * funcs )
+{
+ rc_t rc;
+ do
+ {
+ rc = ReferenceIteratorNextSpotGroup ( data->ref_iter, &data->spotgroup, &data->spotgroup_len );
+ if ( GetRCState( rc ) != rcDone )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextPos() failed" );
+ }
+ else
+ {
+ if ( funcs->on_enter_spotgroup != NULL )
+ rc = funcs->on_enter_spotgroup( data );
+ if ( rc == 0 )
+ rc = walk_placements( data, funcs );
+ if ( rc == 0 && funcs->on_exit_spotgroup != NULL )
+ rc = funcs->on_exit_spotgroup( data );
+ }
+ }
+ } while ( rc == 0 );
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+static rc_t walk_ref_pos( walk_data * data, walk_funcs * funcs )
+{
+ rc_t rc;
+ do
+ {
+ rc = ReferenceIteratorNextPos ( data->ref_iter, !data->options->no_skip );
+ if ( GetRCState( rc ) != rcDone )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextPos() failed" );
+ }
+ else
+ {
+ rc = ReferenceIteratorPosition ( data->ref_iter, &data->ref_pos, &data->depth, &data->ref_base );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorPosition() failed" );
+ }
+ else if ( data->depth > 0 )
+ {
+ bool skip = false;
+
+ if ( data->options->skiplist != NULL )
+ skip = skiplist_is_skip_position( data->options->skiplist, data->ref_pos + 1 );
+
+ if ( !skip )
+ {
+ if ( funcs->on_enter_ref_pos != NULL )
+ rc = funcs->on_enter_ref_pos( data );
+ if ( rc == 0 )
+ rc = walk_spot_group( data, funcs );
+ if ( rc == 0 && funcs->on_exit_ref_pos != NULL )
+ rc = funcs->on_exit_ref_pos( data );
+ }
+ }
+ }
+ if ( rc == 0 ) { rc = Quitting(); }
+ }
+ } while ( rc == 0 );
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+static rc_t walk_ref_window( walk_data * data, walk_funcs * funcs )
+{
+ rc_t rc;
+ do
+ {
+ rc = ReferenceIteratorNextWindow ( data->ref_iter, &data->ref_window_start, &data->ref_window_len );
+ if ( GetRCState( rc ) != rcDone )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextWindow() failed" );
+ }
+ else
+ {
+ if ( funcs->on_enter_ref_window != NULL )
+ rc = funcs->on_enter_ref_window( data );
+ if ( rc == 0 )
+ rc = walk_ref_pos( data, funcs );
+ if ( rc == 0 && funcs->on_exit_ref_window != NULL )
+ rc = funcs->on_exit_ref_window( data );
+ }
+ }
+ } while ( rc == 0 );
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+rc_t walk_0( walk_data * data, walk_funcs * funcs )
+{
+ rc_t rc;
+
+ data->ref_start = 0;
+ data->ref_len = 0;
+ data->ref_name = NULL;
+ data->ref_obj = NULL;
+ data->ref_window_start = 0;
+ data->ref_window_len = 0;
+ data->ref_pos = 0;
+ data->depth = 0;
+ data->ref_base = 0;
+ data->spotgroup = NULL;
+ data->spotgroup_len = 0;
+ data->rec = NULL;
+ data->xrec = NULL;
+ data->state = 0;
+ data->seq_pos = 0;
+
+ do
+ {
+ rc = ReferenceIteratorNextReference( data->ref_iter, &data->ref_start, &data->ref_len, &data->ref_obj );
+ if ( GetRCState( rc ) != rcDone )
+ {
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextReference() failed" );
+ }
+ else if ( data->ref_obj != NULL )
+ {
+ if ( data->options->use_seq_name )
+ rc = ReferenceObj_Name( data->ref_obj, &data->ref_name );
+ else
+ rc = ReferenceObj_SeqId( data->ref_obj, &data->ref_name );
+
+ if ( data->options->skiplist != NULL )
+ skiplist_enter_ref( data->options->skiplist, data->ref_name );
+
+ if ( rc != 0 )
+ {
+ if ( data->options->use_seq_name )
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_Name() failed" );
+ }
+ else
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
+ }
+ }
+ else
+ {
+ rc = ReferenceObj_SeqLength( data->ref_obj, &data->ref_len );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_SeqLength() failed" );
+ }
+ else
+ {
+ if ( funcs->on_enter_ref != NULL )
+ rc = funcs->on_enter_ref( data );
+ if ( rc == 0 )
+ rc = walk_ref_window( data, funcs );
+ if ( rc == 0 && funcs->on_exit_ref != NULL )
+ rc = funcs->on_exit_ref( data );
+ }
+ }
+ }
+ }
+ } while ( rc == 0 );
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ if ( GetRCState( rc ) == rcCanceled ) { rc = 0; }
+ return rc;
+}
diff --git a/tools/sra-pileup/ref_walker_0.h b/tools/sra-pileup/ref_walker_0.h
new file mode 100644
index 0000000..e7c0253
--- /dev/null
+++ b/tools/sra-pileup/ref_walker_0.h
@@ -0,0 +1,107 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_ref_walker_0_
+#define _h_ref_walker_0_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "pileup_options.h"
+
+#include <insdc/sra.h>
+
+#include <stdlib.h>
+#include <sysalloc.h>
+#include <string.h>
+#include <os-native.h>
+
+typedef struct tool_rec tool_rec;
+struct tool_rec
+{
+ bool reverse; /* orientation towards reference ( false...in ref-orientation / true...reverse) */
+ int32_t tlen; /* template-len, for statistical analysis */
+ uint32_t quality_len;
+ uint8_t * quality; /* ptr to quality... ( for sam-output ) */
+};
+
+
+typedef struct walk_data walk_data;
+struct walk_data
+{
+ void *data; /* opaque pointer to data passed to each function */
+ ReferenceIterator *ref_iter; /* the global reference-iter */
+ pileup_options *options; /* the tool-options */
+ struct ReferenceObj const * ref_obj; /* the current reference-object */
+ const char * ref_name; /* the name of the current reference */
+ INSDC_coord_zero ref_start; /* start of the current reference */
+ INSDC_coord_len ref_len; /* length of the current reference */
+ INSDC_coord_zero ref_window_start; /* start of the current reference-window */
+ INSDC_coord_len ref_window_len; /* length of the current reference-window */
+ INSDC_coord_zero ref_pos; /* current position on the reference */
+ uint32_t depth; /* coverage at the current position */
+ INSDC_4na_bin ref_base; /* reference-base at the current position */
+ const char * spotgroup; /* name of the current spotgroup ( can be NULL! ) */
+ size_t spotgroup_len; /* length of the name of the current spotgroup ( can be 0 ) */
+ const PlacementRecord *rec; /* current placement-record */
+ tool_rec * xrec; /* current extended placement-record (orientation, quality...) */
+ int32_t state; /* state of the current placement at the current ref-pos ( bitmasked!) */
+ INSDC_coord_zero seq_pos; /* position inside the alignment at the current ref-pos */
+};
+
+
+typedef struct walk_funcs walk_funcs;
+struct walk_funcs
+{
+ /* changing reference */
+ rc_t ( CC * on_enter_ref ) ( walk_data * data );
+ rc_t ( CC * on_exit_ref ) ( walk_data * data );
+
+ /* changing reference-window */
+ rc_t ( CC * on_enter_ref_window ) ( walk_data * data );
+ rc_t ( CC * on_exit_ref_window ) ( walk_data * data );
+
+ /* changing reference-position */
+ rc_t ( CC * on_enter_ref_pos ) ( walk_data * data );
+ rc_t ( CC * on_exit_ref_pos ) ( walk_data * data );
+
+ /* changing spot-group */
+ rc_t ( CC * on_enter_spotgroup ) ( walk_data * data );
+ rc_t ( CC * on_exit_spotgroup ) ( walk_data * data );
+
+ /* on each alignment */
+ rc_t ( CC * on_placement ) ( walk_data * data );
+};
+
+
+rc_t walk_0( walk_data * data, walk_funcs * funcs );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_ref_walker_0_ */
diff --git a/tools/sra-pileup/report_deletes.c b/tools/sra-pileup/report_deletes.c
new file mode 100644
index 0000000..21e376e
--- /dev/null
+++ b/tools/sra-pileup/report_deletes.c
@@ -0,0 +1,259 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "report_deletes.h"
+#include "cg_tools.h"
+
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <kfs/file.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+
+#include <kdb/manager.h>
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+rc_t CC Quitting ( void );
+
+static rc_t cigar_loop( const VCursor *cur,
+ uint32_t cigar_idx,
+ int64_t first,
+ uint64_t count,
+ uint32_t min_len )
+{
+ rc_t rc = 0;
+ int64_t row_id, last_row = ( first + count );
+ rna_splice_candidates candidates;
+
+ for ( row_id = first; ( row_id < last_row ) && ( rc == 0 ) && ( Quitting() == 0 ); row_id++ )
+ {
+ const char * cigar;
+ uint32_t row_len;
+ rc = VCursorCellDataDirect ( cur, row_id, cigar_idx, NULL, ( const void ** )&cigar, NULL, &row_len );
+ if ( rc == 0 )
+ {
+ candidates.count = 0;
+ candidates.fwd_matched = 0;
+ candidates.rev_matched = 0;
+
+ rc = discover_rna_splicing_candidates( row_len, cigar, min_len, &candidates );
+ if ( rc == 0 && candidates.count > 0 )
+ {
+ rc = KOutMsg( "%d rna-splice-candidates at row #%ld : %.*s\n", candidates.count, row_id, row_len, cigar );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t report_deletes_db( const VDBManager *vdb_mgr,
+ const char * path,
+ uint32_t min_len )
+{
+ const VDatabase *db;
+ rc_t rc = VDBManagerOpenDBRead( vdb_mgr, &db, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr,
+ ( klogInt, rc, "cannot open database $(db_name)", "db_name=%s", path ) );
+ }
+ else
+ {
+ const VTable *tab;
+ rc = VDatabaseOpenTableRead( db, &tab, "PRIMARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open table PRIMARY_ALIGNMENT" );
+ }
+ else
+ {
+ const VCursor *cur;
+ rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open cursor on table PRIMARY_ALIGNMENT" );
+ }
+ else
+ {
+ uint32_t cigar_idx;
+ rc = VCursorAddColumn( cur, &cigar_idx, "CIGAR_SHORT" );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot add CIGAR_SHORT to cursor" );
+ }
+ else
+ {
+ rc = VCursorOpen( cur );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open cursor" );
+ }
+ else
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange ( cur, cigar_idx, &first, &count );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot detect row-range" );
+ }
+ else
+ {
+ rc = cigar_loop( cur, cigar_idx, first, count, min_len );
+ }
+ }
+ }
+ VCursorRelease( cur );
+ }
+ VTableRelease( tab );
+ }
+ VDatabaseRelease( db );
+ }
+ return rc;
+}
+
+
+static rc_t report_deletes_spec( const VDBManager *vdb_mgr,
+ VFSManager * vfs_mgr,
+ const char * spec,
+ uint32_t min_len )
+{
+ rc_t rc = KOutMsg( "\nreporting deletes of '%s'\n", spec );
+ if ( rc == 0 )
+ {
+ VPath * path = NULL;
+ const VPath * local_cache = NULL;
+ const KFile * remote_file = NULL;
+ rc = VFSManagerResolveSpec ( vfs_mgr, spec, &path, &remote_file, &local_cache, true );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot resolve spec via VFSManager" );
+ }
+ else
+ {
+ char buffer[ 4096 ];
+ size_t num_read;
+ rc = VPathReadPath ( path, buffer, sizeof buffer, &num_read );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot read path from vpath" );
+ }
+ else
+ {
+ int path_type = ( VDBManagerPathType ( vdb_mgr, "%s", buffer ) & ~ kptAlias );
+ switch( path_type )
+ {
+ case kptDatabase : rc = report_deletes_db( vdb_mgr, buffer, min_len ); break;
+
+ case kptTable : KOutMsg( "cannot report deletes on a table-object\n" );
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "cannot report references on a table-object" );
+ break;
+
+ default : KOutMsg( "the given object is not a vdb-database\n" );
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "the given object is not a vdb-database" );
+ break;
+ }
+ }
+ KFileRelease( remote_file );
+ VPathRelease ( local_cache );
+ VPathRelease ( path );
+ }
+ }
+ return rc;
+
+}
+
+
+rc_t report_deletes( Args * args, uint32_t min_len )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ const VDBManager *vdb_mgr;
+ rc = VDBManagerMakeRead ( &vdb_mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ }
+ else
+ {
+ VFSManager * vfs_mgr;
+ rc = VFSManagerMake ( &vfs_mgr );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot make vfs-manager" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *param = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)¶m );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamvalue() failed" );
+ }
+ else
+ {
+ rc = report_deletes_spec( vdb_mgr, vfs_mgr, param, min_len );
+ }
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+ VDBManagerRelease( vdb_mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/report_deletes.h b/tools/sra-pileup/report_deletes.h
new file mode 100644
index 0000000..9cc12ac
--- /dev/null
+++ b/tools/sra-pileup/report_deletes.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_report_deletes_
+#define _h_report_deletes_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <kapp/args.h>
+#include <klib/rc.h>
+
+rc_t report_deletes( Args * args, uint32_t min_len );
+
+#endif
diff --git a/tools/sra-pileup/reref.c b/tools/sra-pileup/reref.c
new file mode 100644
index 0000000..65f75ed
--- /dev/null
+++ b/tools/sra-pileup/reref.c
@@ -0,0 +1,550 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "reref.h"
+
+#include <klib/text.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+
+#include <align/reference.h>
+
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+#if 0
+
+typedef struct report_row_ctx
+{
+ uint32_t prim_idx;
+ uint32_t sec_idx;
+ int64_t row_id;
+} report_row_ctx;
+
+
+static rc_t report_ref_row( const VCursor *cur, report_row_ctx * row_ctx )
+{
+ rc_t rc = 0;
+ uint32_t elem_bits, boff, prim_count, sec_count;
+ const void *base;
+ rc = VCursorCellDataDirect ( cur, row_ctx->row_id, row_ctx->prim_idx, &elem_bits, &base, &boff, &prim_count );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot read colum >PRIMARY_ALIGNMENT_IDS<" );
+ }
+ else
+ {
+ rc = VCursorCellDataDirect ( cur, row_ctx->row_id, row_ctx->sec_idx, &elem_bits, &base, &boff, &sec_count );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot read colum >SECONDARY_ALIGNMENT_IDS<" );
+ }
+ else if ( prim_count > 0 || sec_count > 0 )
+ {
+ rc = KOutMsg( "ROW[ %,lu ]: PRIM:%,u SEC:%,u\n", row_ctx->row_id, prim_count, sec_count );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t report_ref_cursor( const VCursor *cur, int64_t start, int64_t stop )
+{
+ report_row_ctx row_ctx;
+ rc_t rc = VCursorAddColumn ( cur, &row_ctx.prim_idx, "PRIMARY_ALIGNMENT_IDS" );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot add column >PRIMARY_ALIGNMENT_IDS<" );
+ }
+ else
+ {
+ rc = VCursorAddColumn ( cur, &row_ctx.sec_idx, "SECONDARY_ALIGNMENT_IDS" );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot add column >SECONDARY_ALIGNMENT_IDS<" );
+ }
+ else
+ {
+ rc = VCursorOpen ( cur );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open REFERENCE-CURSOR" );
+ }
+ else
+ {
+ for ( row_ctx.row_id = start; rc == 0 && row_ctx.row_id <= stop; ++row_ctx.row_id )
+ {
+ rc = report_ref_row( cur, &row_ctx );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t report_ref_table( const VDBManager *vdb_mgr, const char * path, int64_t start, int64_t stop )
+{
+ const VDatabase* db;
+ rc_t rc = VDBManagerOpenDBRead ( vdb_mgr, &db, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open vdb-database" );
+ }
+ else
+ {
+ const VTable* tb;
+ rc = VDatabaseOpenTableRead ( db, &tb, "REFERENCE" );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open REFERENCE-table" );
+ }
+ else
+ {
+ const VCursor *cur;
+ rc = VTableCreateCursorRead ( tb, &cur );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot open REFERENCE-cursor" );
+ }
+ else
+ {
+ rc = report_ref_cursor( cur, start, stop );
+ VCursorRelease( cur );
+ }
+ VTableRelease ( tb );
+ }
+ VDatabaseRelease ( db );
+ }
+ return rc;
+}
+#endif
+
+
+static rc_t report_ref_table2( const ReferenceObj* ref_obj, int64_t start, int64_t stop )
+{
+ rc_t rc = 0;
+ int64_t row_id, max_prim_at, max_sec_at, max_ev_at;
+ uint64_t sum_prim, sum_sec, sum_ev, max_prim, max_sec, max_ev;
+ sum_prim = sum_sec = sum_ev = max_prim = max_sec = max_ev = 0;
+
+ for ( row_id = start; rc == 0 && row_id <= stop; ++row_id )
+ {
+ uint32_t count[ 3 ];
+ rc = ReferenceObj_GetIdCount( ref_obj, row_id, count );
+ if ( rc == 0 )
+ {
+ sum_prim += count[ 0 ];
+ sum_sec += count[ 1 ];
+ sum_ev += count[ 2 ];
+
+ if ( count[ 0 ] > max_prim )
+ {
+ max_prim = count[ 0 ];
+ max_prim_at = row_id;
+ }
+ if ( count[ 1 ] > max_sec )
+ {
+ max_sec = count[ 1 ];
+ max_sec_at = row_id;
+ }
+ if ( count[ 2 ] > max_ev )
+ {
+ max_ev = count[ 2 ];
+ max_ev_at = row_id;
+ }
+ }
+ }
+
+ rc = KOutMsg( "alignments:\t%,u PRI\t%,u SEC\t%,u EV\n", sum_prim, sum_sec, sum_ev );
+ if ( rc == 0 && max_prim > 0 )
+ {
+ uint64_t from = ( ( max_prim_at - start ) * 5000 ) + 1;
+ rc = KOutMsg( "max. PRI:\t%,u\tat row #%,i ( from pos: %,u ... %,u )\n", max_prim, max_prim_at, from, from + 4999 );
+ }
+ if ( rc == 0 && max_sec > 0 )
+ {
+ uint64_t from = ( ( max_sec_at - start ) * 5000 ) + 1;
+ rc = KOutMsg( "max. SEC:\t%,u\tat row #%,i ( from pos: %,u ... %,u )\n", max_sec, max_sec_at, from, from + 4999 );
+ }
+ if ( rc == 0 && max_ev > 0 )
+ {
+ uint64_t from = ( ( max_ev_at - start ) * 5000 ) + 1;
+ rc = KOutMsg( "max. EV:\t%,u\tat row #%,i ( from pos: %,u ... %,u )\n", max_ev, max_ev_at, from, from + 4999 );
+ }
+ return rc;
+}
+
+
+const char * ss_Database = "Database";
+const char * ss_Table = "Table";
+const char * ss_PrereleaseTbl = "Prerelease Table";
+const char * ss_Column = "Column";
+const char * ss_Index = "Index";
+const char * ss_NotFound = "not found";
+const char * ss_BadPath = "bad path";
+const char * ss_File = "File";
+const char * ss_Dir = "Dir";
+const char * ss_CharDev = "CharDev";
+const char * ss_BlockDev = "BlockDev";
+const char * ss_FIFO = "FIFO";
+const char * ss_ZombieFile = "ZombieFile";
+const char * ss_Dataset = "Dataset";
+const char * ss_Datatype = "Datatype";
+const char * ss_unknown = "unknown pathtype";
+
+
+static const char * path_type_2_str( const uint32_t pt )
+{
+ const char * res = ss_unknown;
+ switch ( pt )
+ {
+ case kptDatabase : res = ss_Database; break;
+ case kptTable : res = ss_Table; break;
+ case kptPrereleaseTbl : res = ss_PrereleaseTbl; break;
+ case kptColumn : res = ss_Column; break;
+ case kptIndex : res = ss_Index; break;
+ case kptNotFound : res = ss_NotFound; break;
+ case kptBadPath : res = ss_BadPath; break;
+ case kptFile : res = ss_File; break;
+ case kptDir : res = ss_Dir; break;
+ case kptCharDev : res = ss_CharDev; break;
+ case kptBlockDev : res = ss_BlockDev; break;
+ case kptFIFO : res = ss_FIFO; break;
+ case kptZombieFile : res = ss_ZombieFile; break;
+ case kptDataset : res = ss_Dataset; break;
+ case kptDatatype : res = ss_Datatype; break;
+ default : res = ss_unknown; break;
+ }
+ return res;
+}
+
+/*
+static rc_t resolve_accession( VFSManager * vfs_mgr, const char * accession, const String ** path )
+{
+ VResolver * resolver;
+ rc_t rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ KOutMsg( "cannot get VResolver from VFSManger for '%s'\n", accession );
+ else
+ {
+ VPath * vpath;
+ rc = VFSManagerMakePath( vfs_mgr, &vpath, "ncbi-acc:%s?vdb-ctx=refseq", accession );
+ if ( rc != 0 )
+ KOutMsg( "cannot make VPath from VFSManger for '%s'\n", accession );
+ else
+ {
+ const VPath * local;
+ const VPath * remote;
+
+ rc = VResolverQuery ( resolver, 0, vpath, &local, &remote, NULL );
+ if ( rc != 0 )
+ KOutMsg( "cannot resolve '%s'\n", accession );
+ else
+ {
+ if ( local != NULL )
+ rc = VPathMakeString( local, path );
+ else
+ rc = VPathMakeString( remote, path );
+ if ( local != NULL )
+ VPathRelease ( local );
+ if ( remote != NULL )
+ VPathRelease ( remote );
+ }
+ VPathRelease ( vpath );
+ }
+ VResolverRelease( resolver );
+ }
+ return rc;
+}
+*/
+
+static rc_t resolve_accession( VFSManager * vfs_mgr, const char * acc, const String ** resolved )
+{
+ VResolver * resolver;
+ rc_t rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "VFSManagerGetResolver() failed" );
+ }
+ else
+ {
+ VPath * acc_vpath;
+ rc = VFSManagerMakePath( vfs_mgr, &acc_vpath, "ncbi-acc:%s", acc );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "VFSManagerMakePath() failed" );
+ }
+ else
+ {
+ const VPath * local = NULL;
+ const VPath * remote = NULL;
+ rc = VResolverQuery ( resolver, 0, acc_vpath, &local, &remote, NULL );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "VResolverQuery() failed" );
+ }
+ else
+ {
+ if ( local != NULL )
+ rc = VPathMakeString( local, resolved );
+ else if ( remote != NULL )
+ rc = VPathMakeString( remote, resolved );
+ else
+ rc = KOutMsg( "cannot resolve '%s'\n", acc );
+
+ if ( local != NULL ) VPathRelease ( local );
+ if ( remote != NULL ) VPathRelease ( remote );
+ }
+ VPathRelease ( acc_vpath );
+ }
+ VResolverRelease( resolver );
+ }
+ return rc;
+}
+
+
+static rc_t report_ref_loc( const VDBManager *vdb_mgr, VFSManager * vfs_mgr, const char * seq_id )
+{
+ const String * path;
+ rc_t rc = resolve_accession( vfs_mgr, seq_id, &path );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "location:\t%S\n", path );
+ if ( rc == 0 )
+ {
+ uint32_t pt = VDBManagerPathType ( vdb_mgr, "%S", path );
+ const char * spt = path_type_2_str( pt );
+ rc = KOutMsg( "pathtype:\t%s\n", spt );
+ }
+ free ( (void*) path );
+ }
+ return rc;
+}
+
+
+static rc_t report_ref_obj( const VDBManager *vdb_mgr, VFSManager * vfs_mgr, const char * path, uint32_t idx,
+ const ReferenceObj* ref_obj, bool extended )
+{
+ const char * s;
+ const char * seq_id;
+ INSDC_coord_len len;
+ bool circular, external;
+ int64_t start, stop;
+
+ rc_t rc = ReferenceObj_Name( ref_obj, &s );
+ if ( rc == 0 )
+ rc = KOutMsg( "\nREF[%u].Name = '%s'\n", idx, s );
+
+ if ( rc == 0 )
+ rc = ReferenceObj_SeqId( ref_obj, &seq_id );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF[%u].SeqId = '%s'\n", idx, seq_id );
+
+ if ( rc == 0 )
+ rc = ReferenceObj_SeqLength( ref_obj, &len );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF[%u].Length = %,u\n", idx, len );
+
+ if ( rc == 0 )
+ rc = ReferenceObj_Circular( ref_obj, &circular );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF[%u].Circular = %s\n", idx, circular ? "yes" : "no" );
+
+ if ( rc == 0 )
+ rc = ReferenceObj_IdRange( ref_obj, &start, &stop );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF[%u].IdRange = [%,lu]...[%,lu]\n", idx, start, stop );
+
+ if ( rc == 0 )
+ rc = ReferenceObj_External( ref_obj, &external, NULL );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF[%u].Extern = %s\n", idx, external ? "yes" : "no" );
+ if ( rc == 0 && external )
+ {
+ rc = report_ref_loc( vdb_mgr, vfs_mgr, seq_id );
+ }
+
+ if ( rc == 0 && extended )
+ rc = report_ref_table2( ref_obj, start, stop );
+
+ return rc;
+}
+
+
+static rc_t report_ref_database( const VDBManager *vdb_mgr, VFSManager * vfs_mgr, const char * path, bool extended )
+{
+ const VDatabase *db;
+ rc_t rc = VDBManagerOpenDBRead ( vdb_mgr, &db, NULL, "%s", path );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "VDBManagerOpenDBRead() failed" );
+ }
+ else
+ {
+ const ReferenceList * reflist;
+ uint32_t options = ( ereferencelist_usePrimaryIds | ereferencelist_useSecondaryIds | ereferencelist_useEvidenceIds );
+ rc = ReferenceList_MakeDatabase( &reflist, db, options, 0, NULL, 0 );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "ReferenceList_MakeDatabase() failed" );
+ }
+ else
+ {
+ uint32_t count;
+ rc = ReferenceList_Count( reflist, &count );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "ReferenceList_Count() failed" );
+ }
+ else
+ {
+ rc = KOutMsg( "this object uses %u references\n", count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const ReferenceObj* ref_obj;
+ rc = ReferenceList_Get( reflist, &ref_obj, idx );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "ReferenceList_Get() failed" );
+ }
+ else
+ {
+ rc = report_ref_obj( vdb_mgr, vfs_mgr, path, idx, ref_obj, extended );
+ ReferenceObj_Release( ref_obj );
+ }
+ }
+ }
+ }
+ ReferenceList_Release( reflist );
+ }
+ VDatabaseRelease( db );
+ }
+ return rc;
+}
+
+static rc_t report_references( const VDBManager *vdb_mgr, VFSManager * vfs_mgr,
+ const char * spec, bool extended )
+{
+ const String * resolved = NULL;
+ rc_t rc = resolve_accession( vfs_mgr, spec, &resolved );
+ if ( rc == 0 && resolved != NULL )
+ {
+ rc = KOutMsg( "resolved into '%S'\n", resolved );
+ if ( rc == 0 )
+ {
+ int path_type = ( VDBManagerPathType ( vdb_mgr, "%s", spec ) & ~ kptAlias );
+ switch( path_type )
+ {
+ case kptDatabase : rc = report_ref_database( vdb_mgr, vfs_mgr, spec, extended );
+ break;
+
+ case kptTable : KOutMsg( "cannot report references on a table-object\n" );
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "cannot report references on a table-object" );
+ break;
+
+ default : KOutMsg( "the given object is not a vdb-database\n" );
+ rc = RC ( rcApp, rcNoTarg, rcAccessing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "the given object is not a vdb-database" );
+ break;
+ }
+ }
+ StringWhack ( resolved );
+ }
+ return rc;
+}
+
+
+rc_t report_on_reference( Args * args, bool extended )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ const VDBManager *vdb_mgr;
+ rc = VDBManagerMakeRead ( &vdb_mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ }
+ else
+ {
+ VFSManager * vfs_mgr;
+ rc = VFSManagerMake ( &vfs_mgr );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot make vfs-manager" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *param = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)¶m );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamvalue() failed" );
+ }
+ else
+ {
+ rc = report_references( vdb_mgr, vfs_mgr, param, extended );
+ }
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+ VDBManagerRelease( vdb_mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/reref.h b/tools/sra-pileup/reref.h
new file mode 100644
index 0000000..85bbd5d
--- /dev/null
+++ b/tools/sra-pileup/reref.h
@@ -0,0 +1,43 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_reref_
+#define _h_reref_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <kapp/args.h>
+
+#include <klib/out.h>
+#include <klib/rc.h>
+
+rc_t report_on_reference( Args * args, bool extended );
+
+#endif
diff --git a/tools/sra-pileup/rna_splice_log.c b/tools/sra-pileup/rna_splice_log.c
new file mode 100644
index 0000000..387e617
--- /dev/null
+++ b/tools/sra-pileup/rna_splice_log.c
@@ -0,0 +1,374 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <string.h>
+
+#include "rna_splice_log.h"
+
+typedef struct rna_splice_dict rna_splice_dict;
+struct rna_splice_dict
+{
+ KVector * v;
+};
+
+
+struct rna_splice_dict * make_rna_splice_dict( void )
+{
+ struct rna_splice_dict * res = NULL;
+ KVector * v;
+ rc_t rc = KVectorMake ( &v );
+ if ( rc == 0 )
+ {
+ res = calloc( 1, sizeof * res );
+ if ( res != NULL )
+ {
+ res->v = v;
+ }
+ else
+ {
+ KVectorRelease ( v );
+ }
+ }
+ return res;
+}
+
+
+void free_rna_splice_dict( struct rna_splice_dict * dict )
+{
+ if ( dict != NULL )
+ {
+ KVectorRelease ( dict->v );
+ free( dict );
+ }
+}
+
+
+typedef struct splice_dict_key splice_dict_key;
+struct splice_dict_key
+{
+ uint32_t len;
+ uint32_t pos;
+};
+
+union dict_key_union
+{
+ uint64_t key;
+ splice_dict_key key_struct;
+};
+
+union dict_value_union
+{
+ uint64_t value;
+ splice_dict_entry entry;
+};
+
+
+bool rna_splice_dict_get( struct rna_splice_dict * dict,
+ uint32_t pos, uint32_t len, splice_dict_entry * entry )
+{
+ bool res = false;
+ if ( dict != NULL )
+ {
+ rc_t rc;
+ union dict_key_union ku;
+ union dict_value_union vu;
+
+ ku.key_struct.pos = pos;
+ ku.key_struct.len = len;
+ rc = KVectorGetU64 ( dict->v, ku.key, &(vu.value) );
+ res = ( rc == 0 );
+ if ( res && entry != NULL )
+ {
+ entry->count = vu.entry.count;
+ entry->intron_type = vu.entry.intron_type;
+ }
+ }
+ return res;
+}
+
+
+void rna_splice_dict_set( struct rna_splice_dict * dict,
+ uint32_t pos, uint32_t len, const splice_dict_entry * entry )
+{
+ if ( dict != NULL && entry != NULL )
+ {
+ union dict_key_union ku;
+ union dict_value_union vu;
+
+ ku.key_struct.pos = pos;
+ ku.key_struct.len = len;
+ vu.entry.count = entry->count;
+ vu.entry.intron_type = entry->intron_type;
+ KVectorSetU64 ( dict->v, ku.key, vu.value );
+ }
+}
+
+
+/* --------------------------------------------------------------------------- */
+
+
+typedef struct rna_splice_log rna_splice_log;
+struct rna_splice_log
+{
+ KFile * log_file;
+ const char * tool_name;
+ struct ReferenceObj const * ref_obj;
+
+ char ref_name[ 1024 ];
+ uint64_t log_file_pos;
+};
+
+
+struct rna_splice_log * make_rna_splice_log( const char * filename, const char * toolname )
+{
+ struct rna_splice_log * res = NULL;
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir ( &dir );
+ if ( rc == 0 )
+ {
+ KFile * f;
+ rc = KDirectoryCreateFile ( dir, &f, false, 0664, kcmInit, "%s", filename );
+ if ( rc == 0 )
+ {
+ res = calloc( 1, sizeof * res );
+ if ( res != NULL )
+ {
+ res->log_file = f;
+ if ( toolname != NULL )
+ res->tool_name = string_dup_measure ( toolname, NULL );
+ }
+ else
+ KFileRelease ( f );
+ }
+ KDirectoryRelease ( dir );
+ }
+ return res;
+}
+
+
+void free_rna_splice_log( struct rna_splice_log * sl )
+{
+ if ( sl != NULL )
+ {
+ KFileRelease ( sl->log_file );
+ if ( sl->tool_name != NULL ) free( ( void * )sl->tool_name );
+ free( ( void * ) sl );
+ }
+}
+
+
+void rna_splice_log_enter_ref( struct rna_splice_log * sl,
+ const char * ref_name,
+ struct ReferenceObj const * ref_obj )
+{
+ if ( sl != NULL )
+ {
+ if ( ref_name != NULL )
+ string_copy_measure ( sl->ref_name, sizeof( sl->ref_name ), ref_name );
+ else
+ sl->ref_name[ 0 ] = 0;
+
+ sl->ref_obj = ref_obj;
+ }
+}
+
+
+static void copy_read_and_reverse_complement( uint8_t * dst, const uint8_t * const src, INSDC_coord_len const count )
+{
+ static char const compl[] = {
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , '.', 0 ,
+ '0', '1', '2', '3', 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C',
+ 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
+ 0 , 0 , 'Y', 'S', 'A', 'A', 'B', 'W',
+ 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
+ };
+
+ INSDC_coord_len i, j;
+
+ for ( i = 0, j = count - 1; i != count; ++i, --j )
+ {
+ dst[ i ] = compl[ src[ j ] ];
+ }
+}
+
+
+#define PRE_POST_LEN 10
+#define EDGE_LEN ( ( PRE_POST_LEN * 2 ) + 2 )
+
+
+static rc_t write_to_file( struct rna_splice_log * sl, const uint8_t * src, size_t len )
+{
+ size_t num_writ;
+ rc_t rc = KFileWriteAll( sl->log_file, sl->log_file_pos, src, len, &num_writ );
+ if ( rc == 0 )
+ sl->log_file_pos += num_writ;
+ return rc;
+}
+
+static rc_t print_edge( struct rna_splice_log * sl,
+ INSDC_coord_zero pos,
+ bool const reverse_complement,
+ bool const add_newline )
+{
+ rc_t rc;
+ INSDC_coord_len from_ref_obj, to_read;
+ uint8_t buffer[ EDGE_LEN + 1 ];
+ INSDC_coord_zero rd_pos = 0;
+ uint32_t pre_len = PRE_POST_LEN;
+ uint32_t post_len = PRE_POST_LEN;
+
+ if ( pos >= PRE_POST_LEN )
+ rd_pos = ( pos - PRE_POST_LEN ); /* in the rare case the delete is at the very beginning of the alignment */
+ else
+ pre_len = pos; /* rd_pos is still 0, what we want*/
+
+ to_read = pre_len + post_len + 2;
+ rc = ReferenceObj_Read( sl->ref_obj, rd_pos, to_read, buffer, &from_ref_obj );
+ if ( rc == 0 )
+ {
+ uint8_t complement[ EDGE_LEN + 1 ];
+ uint8_t to_write[ EDGE_LEN + 5 ];
+ uint8_t * ref_bytes = buffer;
+
+ if ( from_ref_obj < to_read )
+ post_len -= ( to_read - from_ref_obj );
+
+ if ( reverse_complement )
+ {
+ copy_read_and_reverse_complement( complement, buffer, from_ref_obj );
+ ref_bytes = complement;
+ }
+ memmove( to_write, ref_bytes, pre_len );
+ to_write[ pre_len ] = '\t';
+ to_write[ pre_len + 1 ] = ref_bytes[ pre_len ];
+ to_write[ pre_len + 2 ] = ref_bytes[ pre_len + 1 ];
+ to_write[ pre_len + 3 ] = '\t';
+ memmove( &( to_write[ pre_len + 4 ] ), &( ref_bytes[ pre_len + 2 ] ), post_len );
+
+ if ( add_newline )
+ to_write[ pre_len + post_len + 4 ] = '\n';
+ else
+ to_write[ pre_len + post_len + 4 ] = '\t';
+
+ rc = write_to_file( sl, to_write, pre_len + post_len + 5 );
+ }
+ return rc;
+}
+
+
+/*
+#define INTRON_UNKNOWN 0
+#define INTRON_FWD 1
+#define INTRON_REV 2
+*/
+
+static const char intron_type_to_ascii[] = { 'u', '+', '-', 'u' };
+
+static rc_t CC on_dict_key_value( uint64_t key, uint64_t value, void * user_data )
+{
+ rc_t rc = 0;
+ struct rna_splice_log * sl = ( struct rna_splice_log * )user_data;
+ if ( sl != NULL )
+ {
+ char tmp[ 512 ];
+ size_t num_writ;
+ union dict_key_union ku;
+ union dict_value_union vu;
+ char intron;
+ bool reverse_complement;
+
+ ku.key = key;
+ vu.value = value;
+ intron = intron_type_to_ascii[ vu.entry.intron_type & 0x03 ];
+ reverse_complement = ( ( vu.entry.intron_type & 0x03 ) == INTRON_REV );
+
+ rc = string_printf ( tmp, sizeof tmp, &num_writ,
+ "%s\t%u\t%u\t%u\t%c\t",
+ sl->ref_name, ku.key_struct.pos + 1, ku.key_struct.len, vu.entry.count, intron );
+ if ( rc == 0 )
+ rc = write_to_file( sl, ( uint8_t * )tmp, num_writ );
+
+ if ( reverse_complement )
+ {
+ if ( rc == 0 )
+ rc = print_edge( sl, ku.key_struct.pos + ku.key_struct.len - 2, true, false );
+ if ( rc == 0 )
+ rc = print_edge( sl, ku.key_struct.pos, true, true );
+ }
+ else
+ {
+ if ( rc == 0 )
+ rc = print_edge( sl, ku.key_struct.pos, false, false );
+ if ( rc == 0 )
+ rc = print_edge( sl, ku.key_struct.pos + ku.key_struct.len - 2, false, true );
+ }
+ }
+ return rc;
+}
+
+
+void rna_splice_log_exit_ref( struct rna_splice_log * sl, struct rna_splice_dict * dict )
+{
+ if ( sl != NULL && dict != NULL )
+ {
+ KVectorVisitU64 ( dict->v, false, on_dict_key_value, sl );
+ }
+}
+
diff --git a/tools/sra-pileup/rna_splice_log.h b/tools/sra-pileup/rna_splice_log.h
new file mode 100644
index 0000000..feb98eb
--- /dev/null
+++ b/tools/sra-pileup/rna_splice_log.h
@@ -0,0 +1,87 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_rna_splice_log_
+#define _h_rna_splice_log_
+
+#include <insdc/insdc.h>
+#include <align/reference.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define INTRON_UNKNOWN 0
+#define INTRON_FWD 1
+#define INTRON_REV 2
+
+typedef struct splice_dict_entry splice_dict_entry;
+struct splice_dict_entry
+{
+ uint32_t count;
+ uint32_t intron_type;
+};
+
+struct rna_splice_dict;
+
+struct rna_splice_dict * make_rna_splice_dict( void );
+
+void free_rna_splice_dict( struct rna_splice_dict * dict );
+
+bool rna_splice_dict_get( struct rna_splice_dict * dict,
+ uint32_t pos,
+ uint32_t len,
+ splice_dict_entry * entry );
+
+void rna_splice_dict_set( struct rna_splice_dict * dict,
+ uint32_t pos,
+ uint32_t len,
+ const splice_dict_entry * entry );
+
+/* --------------------------------------------------------------------------- */
+
+
+struct rna_splice_log;
+
+struct rna_splice_log * make_rna_splice_log( const char * filename,
+ const char * toolname );
+
+void free_rna_splice_log( struct rna_splice_log * sl );
+
+void rna_splice_log_enter_ref( struct rna_splice_log * sl,
+ const char * ref_name,
+ struct ReferenceObj const * ref_obj );
+
+void rna_splice_log_exit_ref( struct rna_splice_log * sl,
+ struct rna_splice_dict * dict );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_rna_splice_log_ */
diff --git a/tools/sra-pileup/sam-aligned.c b/tools/sra-pileup/sam-aligned.c
new file mode 100644
index 0000000..1ed9b75
--- /dev/null
+++ b/tools/sra-pileup/sam-aligned.c
@@ -0,0 +1,2408 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <align/manager.h>
+#include <align/iterator.h>
+#include <kapp/main.h>
+#include <ctype.h>
+#include <sysalloc.h>
+
+#include "read_fkt.h"
+#include "cg_tools.h"
+#include "rna_splice_log.h"
+#include "sam-aligned.h"
+#include "md_flag.h"
+
+const char * PRIM_TABLE = "PRIMARY_ALIGNMENT";
+const char * SEC_TABLE = "SECONDARY_ALIGNMENT";
+const char * EV_INT_TABLE = "EVIDENCE_INTERVAL";
+const char * EV_AL_TABLE = "EVIDENCE_ALIGNMENT";
+
+
+/* -------------------------------------------------------------------------------------------
+ column PRIM SEC EV_INT EV_ALIGN ( outside of iterator )
+
+ SEQ_SPOT_ID X X - X
+ SAM_FLAGS X X - -
+ CIGAR_LONG X X X X
+ CIGAR_SHORT X X X X
+ CIGAR_LONG_LEN X X X X
+ CIGAR_SHORT_LEN X X X X
+ MATE_ALIGN_ID X X - -
+ MATE_REF_NAME X X - -
+ MATE_REF_POS X X - -
+ TEMPLATE_LEN X X - -
+ READ X X X X
+ READ_LEN X X X X
+ MISMATCH_READ X X X X
+ SAM_QUALITY X X X X
+ REF_ORIENTATION X X X X
+ EDIT_DISTANCE X X X X
+ SEQ_SPOT_GROUP X X - X
+ SEQ_READ_ID X X - X
+ RAW_READ X X X X
+ READ_FILTER X X X X
+ EVIDENCE_ALIGNMENT_IDS - - X -
+ REF_POS o
+ REF_PLOIDY o
+ ALIGNMENT_COUNT X X - X
+ SEQ_NAME X
+ MAPQ X
+ ALIGN_GROUP X - - -
+ RNA_ORIENTATION X X
+ LINKAGE_GROUP X X
+ -------------------------------------------------------------------------------------------*/
+
+
+#define COL_NOT_AVAILABLE 0xFFFFFFFF
+
+#define COL_SEQ_SPOT_ID "(I64)SEQ_SPOT_ID"
+#define COL_SAM_FLAGS "(U32)SAM_FLAGS"
+#define COL_LONG_CIGAR "(ascii)CIGAR_LONG"
+#define COL_SHORT_CIGAR "(ascii)CIGAR_SHORT"
+#define COL_MATE_ALIGN_ID "(I64)MATE_ALIGN_ID"
+#define COL_MATE_REF_NAME "(ascii)MATE_REF_NAME"
+#define COL_MATE_REF_SEQ_ID "(ascii)MATE_REF_SEQ_ID"
+#define COL_MATE_REF_POS "(INSDC:coord:zero)MATE_REF_POS"
+#define COL_TEMPLATE_LEN "(I32)TEMPLATE_LEN"
+#define COL_MISMATCH_READ "(ascii)MISMATCH_READ"
+#define COL_SAM_QUALITY "(INSDC:quality:text:phred_33)SAM_QUALITY"
+#define COL_REF_ORIENTATION "(bool)REF_ORIENTATION"
+#define COL_EDIT_DIST "(U32)EDIT_DISTANCE"
+#define COL_SEQ_SPOT_GROUP "(ascii)SEQ_SPOT_GROUP"
+#define COL_SEQ_READ_ID "(INSDC:coord:one)SEQ_READ_ID"
+#define COL_RAW_READ "(INSDC:dna:text)RAW_READ"
+#define COL_PLOIDY "(NCBI:align:ploidy)PLOIDY"
+#define COL_CIGAR_LONG_LEN "(INSDC:coord:len)CIGAR_LONG_LEN"
+#define COL_CIGAR_SHORT_LEN "(INSDC:coord:len)CIGAR_SHORT_LEN"
+#define COL_READ_LEN "(INSDC:coord:len)READ_LEN"
+#define COL_EV_ALIGNMENTS "(I64)EVIDENCE_ALIGNMENT_IDS"
+#define COL_REF_POS "(INSDC:coord:zero)REF_POS"
+#define COL_REF_PLOIDY "(U32)REF_PLOIDY"
+#define COL_READ_FILTER "(INSDC:SRA:read_filter)READ_FILTER"
+#define COL_AL_COUNT "(U8)ALIGNMENT_COUNT"
+#define COL_SEQ_NAME "(ascii)SEQ_NAME"
+#define COL_MAPQ "(I32)MAPQ"
+#define COL_ALIGN_GROUP "(ascii)ALIGN_GROUP"
+#define COL_RNA_ORIENTATION "(ascii)RNA_ORIENTATION"
+#define COL_LNK_GROUP "(ascii)LINKAGE_GROUP"
+
+enum align_table_type
+{
+ att_primary = 0,
+ att_secondary,
+ att_evidence
+};
+
+
+/* the part common to prim/sec/ev-alignment */
+typedef struct align_cmn_context
+{
+ const VCursor * cursor;
+
+ uint32_t seq_spot_id_idx;
+ uint32_t cigar_idx;
+ uint32_t cigar_len_idx;
+ uint32_t read_idx;
+ uint32_t read_len_idx;
+ uint32_t edit_dist_idx;
+ uint32_t seq_spot_group_idx;
+ uint32_t seq_read_id_idx;
+ uint32_t raw_read_idx;
+ uint32_t sam_quality_idx;
+ uint32_t ref_orientation_idx;
+ uint32_t read_filter_idx;
+ uint32_t al_count_idx;
+} align_cmn_context;
+
+
+typedef struct align_table_context
+{
+ CigOps * cig_op_buffer;
+ uint32_t cig_op_buffer_len;
+
+ /* which Reference-Obj in the ReferenceList we are aligning against... */
+ const ReferenceObj* ref_obj;
+ uint32_t ref_idx;
+
+ /* which index into the input-files object / needed to distinguish cache entries with the same number
+ but comming from different input-files */
+ uint32_t db_idx;
+
+ /* objects of which table are we aligning PRIM/SEC/EV ? */
+ enum align_table_type align_table_type;
+
+ /* the part common to prim/sec/ev-alignment */
+ align_cmn_context cmn;
+
+ /* this is specific to pim/sec */
+ uint32_t sam_flags_idx;
+ uint32_t mate_align_id_idx;
+ uint32_t mate_ref_name_idx;
+ uint32_t mate_ref_pos_idx;
+ uint32_t tlen_idx;
+ uint32_t rna_orientation_idx;
+
+ /* this is only in prim */
+ uint32_t al_group_idx;
+ uint32_t lnk_group_idx;
+
+ /* this is specific to ev-interval/ev-alignmnet */
+ uint32_t ploidy_idx;
+ uint32_t ev_alignments_idx;
+ uint32_t ref_pos_idx;
+ uint32_t ref_ploidy_idx;
+ uint32_t seq_name_idx;
+ uint32_t mapq_idx;
+
+ /* the common part repeats for evidence-alignment */
+ align_cmn_context eval;
+} align_table_context;
+
+
+static void invalidate_all_cmn_column_idx( align_cmn_context * const actx )
+{
+ actx->seq_spot_id_idx = COL_NOT_AVAILABLE;
+ actx->cigar_idx = COL_NOT_AVAILABLE;
+ actx->cigar_len_idx = COL_NOT_AVAILABLE;
+ actx->read_idx = COL_NOT_AVAILABLE;
+ actx->read_len_idx = COL_NOT_AVAILABLE;
+ actx->edit_dist_idx = COL_NOT_AVAILABLE;
+ actx->seq_spot_group_idx = COL_NOT_AVAILABLE;
+ actx->seq_read_id_idx = COL_NOT_AVAILABLE;
+ actx->raw_read_idx = COL_NOT_AVAILABLE;
+ actx->sam_quality_idx = COL_NOT_AVAILABLE;
+ actx->ref_orientation_idx = COL_NOT_AVAILABLE;
+ actx->read_filter_idx = COL_NOT_AVAILABLE;
+ actx->al_count_idx = COL_NOT_AVAILABLE;
+}
+
+static void invalidate_all_column_idx( align_table_context * const atx )
+{
+ atx->sam_flags_idx = COL_NOT_AVAILABLE;
+ atx->mate_align_id_idx = COL_NOT_AVAILABLE;
+ atx->mate_ref_name_idx = COL_NOT_AVAILABLE;
+ atx->mate_ref_pos_idx = COL_NOT_AVAILABLE;
+ atx->tlen_idx = COL_NOT_AVAILABLE;
+ atx->rna_orientation_idx= COL_NOT_AVAILABLE;
+ atx->ploidy_idx = COL_NOT_AVAILABLE;
+ atx->ev_alignments_idx = COL_NOT_AVAILABLE;
+ atx->ref_pos_idx = COL_NOT_AVAILABLE;
+ atx->ref_ploidy_idx = COL_NOT_AVAILABLE;
+ atx->seq_name_idx = COL_NOT_AVAILABLE;
+ atx->mapq_idx = COL_NOT_AVAILABLE;
+ atx->al_group_idx = COL_NOT_AVAILABLE;
+ atx->lnk_group_idx = COL_NOT_AVAILABLE;
+ invalidate_all_cmn_column_idx( &atx->cmn );
+ invalidate_all_cmn_column_idx( &atx->eval );
+}
+
+
+static void init_align_table_context( align_table_context * const atx,
+ const uint32_t db_idx,
+ const ReferenceObj* ref_obj )
+{
+ atx->db_idx = db_idx;
+ atx->ref_obj = ref_obj;
+ atx->cig_op_buffer = NULL;
+ atx->cig_op_buffer_len = 0;
+ invalidate_all_column_idx( atx );
+}
+
+
+static void free_align_table_context( align_table_context * atx )
+{
+ if ( atx != NULL )
+ {
+ if ( atx->cig_op_buffer != NULL )
+ free( atx->cig_op_buffer );
+
+ VCursorRelease( atx->cmn.cursor );
+ VCursorRelease( atx->eval.cursor );
+ free( atx );
+ }
+}
+
+
+static rc_t adjust_align_table_context_cig_op_buffer( align_table_context * atx, uint32_t read_len )
+{
+ rc_t rc = 0;
+
+ uint32_t reqested = ( read_len * 3 );
+ if ( reqested < 1024 ) reqested = 1024;
+
+ if ( atx->cig_op_buffer_len < reqested )
+ {
+ void * org_buffer = NULL;
+
+ if ( atx->cig_op_buffer == NULL )
+ atx->cig_op_buffer = malloc( reqested );
+ else
+ {
+ org_buffer = atx->cig_op_buffer;
+ atx->cig_op_buffer = realloc( org_buffer, reqested );
+ }
+
+ if ( atx->cig_op_buffer == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)LOGERR( klogInt, rc, "cigar-op-buffer-allocation failed" );
+ if ( org_buffer != NULL )
+ free( org_buffer );
+ }
+ else
+ {
+ atx->cig_op_buffer_len = reqested;
+ }
+ }
+
+ return rc;
+}
+
+
+/* src: 'P'rimary, 'S'econdary, Evidence_'I'nterval, Evidence_'A'lignment */
+static rc_t prepare_cmn_table_rows( const samdump_opts * const opts,
+ const VTable * tbl,
+ align_cmn_context * const cmn,
+ char src,
+ struct KNamelist * available_columns )
+{
+ rc_t rc = 0;
+ const VCursor * cursor = cmn->cursor;
+
+ if ( src == 'P' || src == 'S' )
+ rc = add_column( cursor, COL_SEQ_SPOT_ID, &cmn->seq_spot_id_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ {
+ if ( opts->use_long_cigar )
+ {
+ rc = add_column( cursor, COL_LONG_CIGAR, &cmn->cigar_idx ); /* read_fkt.c */
+ if ( rc == 0 && ( src == 'I' || src == 'A' ) )
+ rc = add_column( cursor, COL_CIGAR_LONG_LEN, &cmn->cigar_len_idx ); /* read_fkt.c */
+ }
+ else
+ {
+ rc = add_column( cursor, COL_SHORT_CIGAR, &cmn->cigar_idx ); /* read_fkt.c */
+ if ( rc == 0 && ( src == 'I' || src == 'A' ) )
+ rc = add_column( cursor, COL_CIGAR_SHORT_LEN, &cmn->cigar_len_idx ); /* read_fkt.c */
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( opts->print_matches_as_equal_sign )
+ rc = add_column( cursor, COL_MISMATCH_READ, &cmn->read_idx ); /* read_fkt.c */
+ else
+ rc = add_column( cursor, COL_READ, &cmn->read_idx ); /* read_fkt.c */
+ }
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_READ_LEN, &cmn->read_len_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_SAM_QUALITY, &cmn->sam_quality_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_REF_ORIENTATION, &cmn->ref_orientation_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_EDIT_DIST, &cmn->edit_dist_idx ); /* read_fkt.c */
+
+ if ( rc == 0 && ( src == 'P' || src == 'S' || src == 'A' ) )
+ rc = add_column( cursor, COL_SEQ_SPOT_GROUP, &cmn->seq_spot_group_idx ); /* read_fkt.c */
+
+ if ( rc == 0 && ( src == 'P' || src == 'S' || src == 'A' ) )
+ rc = add_column( cursor, COL_SEQ_READ_ID, &cmn->seq_read_id_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_RAW_READ, &cmn->raw_read_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_READ_FILTER, &cmn->read_filter_idx ); /* read_fkt.c */
+
+ if ( rc == 0 && ( src == 'P' || src == 'S' || src == 'A' ) )
+ add_opt_column( cursor, available_columns, COL_AL_COUNT, &cmn->al_count_idx ); /* read_fkt.c */
+
+ return rc;
+}
+
+
+static rc_t prepare_prim_sec_table_cursor( const samdump_opts * const opts,
+ const VDatabase * db,
+ const char * table_name,
+ align_table_context * const atx )
+{
+ const VTable *tbl;
+ rc_t rc = VDatabaseOpenTableRead( db, &tbl, "%s", table_name );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VDatabaseOpenTableRead( $(tn) ) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ if ( opts->cursor_cache_size == 0 )
+ rc = VTableCreateCursorRead( tbl, &atx->cmn.cursor );
+ else
+ rc = VTableCreateCachedCursorRead( tbl, &atx->cmn.cursor, opts->cursor_cache_size );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VTableCreateCursorRead( $(tn) ) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ struct KNamelist * available_columns;
+ char table_char = 'P';
+ const VCursor * cursor = atx->cmn.cursor;
+
+ if ( cmp_pchar( table_name, "SECONDARY_ALIGNMENT" ) == 0 )
+ table_char = 'S';
+
+ rc = VTableListReadableColumns ( tbl, &available_columns );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc,
+ "VTableListReadableColumns( $(src) ) failed", "src=%c", table_char ) );
+ }
+ else
+ {
+ rc = prepare_cmn_table_rows( opts, tbl, &atx->cmn, table_char, available_columns );
+
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_SAM_FLAGS, &atx->sam_flags_idx ); /* read_fkt.c */
+
+ /* i don't have to add REF_NAME or REF_SEQ_ID, because i have it from the ref_obj later
+ i don't have to add REF_POS, because i have it from the iterator later
+ i don't have to add MAPQ, it is in the PlacementRecord later
+ ... when walking the iterator ...
+ */
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_MATE_ALIGN_ID, &atx->mate_align_id_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( cursor, opts->use_seqid_as_refname ? COL_MATE_REF_SEQ_ID : COL_MATE_REF_NAME, &atx->mate_ref_name_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_MATE_REF_POS, &atx->mate_ref_pos_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( cursor, COL_TEMPLATE_LEN, &atx->tlen_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ add_opt_column( cursor, available_columns, COL_RNA_ORIENTATION, &atx->rna_orientation_idx ); /* read_fkt.c */
+
+ if ( table_char == 'P' )
+ {
+ if ( rc == 0 )
+ add_opt_column( cursor, available_columns, COL_ALIGN_GROUP, &atx->al_group_idx ); /* read_fkt.c */
+
+ if ( rc == 0 )
+ add_opt_column( cursor, available_columns, COL_LNK_GROUP, &atx->lnk_group_idx ); /* read_fkt.c */
+ }
+
+ KNamelistRelease( available_columns );
+ }
+ if ( rc != 0 )
+ VCursorRelease( cursor );
+ }
+ VTableRelease ( tbl ); /* the cursor keeps the table alive */
+ }
+ return rc;
+}
+
+
+static rc_t prepare_sub_ev_alignment_table_cursor( const samdump_opts * const opts,
+ const VDatabase * db,
+ align_table_context * const atx )
+{
+ rc_t rc = add_column( atx->cmn.cursor, COL_EV_ALIGNMENTS, &atx->ev_alignments_idx );
+ if ( rc == 0 )
+ {
+ const VTable *evidence_alignment_tbl;
+ rc = VDatabaseOpenTableRead( db, &evidence_alignment_tbl, EV_AL_TABLE );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VDatabaseOpenTableRead( $(tn) ) failed", "tn=%s", EV_AL_TABLE ) );
+ }
+ else
+ {
+ if ( opts->cursor_cache_size == 0 )
+ rc = VTableCreateCursorRead( evidence_alignment_tbl, &atx->eval.cursor );
+ else
+ rc = VTableCreateCachedCursorRead( evidence_alignment_tbl, &atx->eval.cursor, opts->cursor_cache_size );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VTableCreateCursorRead( $(tn) ) failed", "tn=%s", EV_AL_TABLE ) );
+ }
+ else
+ {
+ struct KNamelist * available_columns;
+
+ rc = VTableListReadableColumns ( evidence_alignment_tbl, &available_columns );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc,
+ "VTableListReadableColumns( $(src) ) failed", "src=%c", 'A' ) );
+ }
+ else
+ {
+ rc = prepare_cmn_table_rows( opts, evidence_alignment_tbl, &atx->eval,
+ 'A', available_columns ); /* common to prim/sec/ev-align */
+ KNamelistRelease( available_columns );
+ }
+
+ if ( rc == 0 )
+ {
+ /* special to ev-align */
+ rc = add_column( atx->eval.cursor, COL_REF_POS, &atx->ref_pos_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( atx->eval.cursor, COL_REF_PLOIDY, &atx->ref_ploidy_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( atx->eval.cursor, COL_SEQ_NAME, &atx->seq_name_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( atx->eval.cursor, COL_MAPQ, &atx->mapq_idx ); /* read_fkt.c */
+ }
+ rc = VCursorOpen( atx->eval.cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( $(tn) ) failed", "tn=%s", EV_AL_TABLE ) );
+ }
+ }
+ VTableRelease ( evidence_alignment_tbl ); /* the cursor keeps the table alive */
+ }
+ }
+ return rc;
+}
+
+
+static rc_t prepare_evidence_table_cursor( const samdump_opts * const opts,
+ const VDatabase * db,
+ const char * table_name,
+ align_table_context * const atx )
+{
+ const VTable *evidence_interval_tbl;
+ rc_t rc = VDatabaseOpenTableRead( db, &evidence_interval_tbl, "%s", table_name );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VDatabaseOpenTableRead( $(tn) ) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ if ( opts->cursor_cache_size == 0 )
+ rc = VTableCreateCursorRead( evidence_interval_tbl, &atx->cmn.cursor );
+ else
+ rc = VTableCreateCachedCursorRead( evidence_interval_tbl, &atx->cmn.cursor, opts->cursor_cache_size );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VTableCreateCursorRead( $(tn) ) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ struct KNamelist * available_columns;
+
+ rc = VTableListReadableColumns ( evidence_interval_tbl, &available_columns );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc,
+ "VTableListReadableColumns( $(src) ) failed", "src=%c", 'I' ) );
+ }
+ else
+ {
+ rc = prepare_cmn_table_rows( opts, evidence_interval_tbl, &atx->cmn,
+ 'I', available_columns ); /* common to prim/sec/ev-align */
+ KNamelistRelease( available_columns );
+ }
+
+ if ( rc == 0 )
+ rc = add_column( atx->cmn.cursor, COL_PLOIDY, &atx->ploidy_idx ); /* read_fkt.c */
+
+ if ( rc == 0 && ( opts->dump_cg_sam || opts->dump_cg_ev_dnb ) )
+ rc = prepare_sub_ev_alignment_table_cursor( opts, db, atx );
+
+ if ( rc != 0 )
+ VCursorRelease( atx->cmn.cursor );
+ }
+ VTableRelease ( evidence_interval_tbl ); /* the cursor keeps the table alive */
+ }
+ return rc;
+}
+
+
+static rc_t add_table_pl_iter( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ const ReferenceObj * const ref_obj,
+ const input_database * const idb,
+ INSDC_coord_zero ref_pos,
+ INSDC_coord_len ref_len,
+ const char * spot_group,
+ const char * table_name,
+ align_id_src id_src_selector,
+ Vector * const context_list )
+{
+ rc_t rc = 0;
+ align_table_context * atx;
+ PlacementRecordExtendFuncs ext_0; /* ReferenceObj_MakePlacementIterator makes copies of the elements */
+
+ memset( &ext_0, 0, sizeof ext_0 );
+ atx = calloc( 1, sizeof * atx );
+ if ( atx == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "align-context-allocation for $(tn) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ init_align_table_context( atx, idb->db_idx, ref_obj );
+ rc = ReferenceObj_Idx( ref_obj, &atx->ref_idx );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "failed to detect ref-idx for $(tn) failed", "tn=%s", table_name ) );
+ }
+ else
+ {
+ switch( id_src_selector )
+ {
+ case primary_align_ids : atx->align_table_type = att_primary;
+ rc = prepare_prim_sec_table_cursor( opts, idb->db, table_name, atx );
+ break;
+
+ case secondary_align_ids : atx->align_table_type = att_secondary;
+ rc = prepare_prim_sec_table_cursor( opts, idb->db, table_name, atx );
+ break;
+
+ case evidence_align_ids : atx->align_table_type = att_evidence;
+ rc = prepare_evidence_table_cursor( opts, idb->db, table_name, atx );
+ break;
+ }
+ }
+ if ( rc == 0 )
+ {
+ ext_0.data = atx;
+ /* we must put the atx-ptr into a global list, in order to close everything later at the end... */
+ }
+ else
+ free_align_table_context( atx );
+ }
+
+ if ( rc == 0 )
+ {
+ int32_t min_mapq = 0;
+ PlacementIterator *pl_iter;
+
+ if ( opts->use_min_mapq )
+ min_mapq = opts->min_mapq;
+
+ rc = ReferenceObj_MakePlacementIterator( ref_obj, /* the reference-obj it is made from */
+ &pl_iter, /* the placement-iterator we want to make */
+ ref_pos, /* where it starts on the reference */
+ ref_len, /* the whole length of this reference/chromosome */
+ min_mapq, /* no minimal mapping-quality to filter out */
+ NULL, /* no special reference-cursor */
+ atx->cmn.cursor, /* a cursor into the PRIMARY/SECONDARY/EVIDENCE-table */
+ id_src_selector, /* what ID-source to select from REFERENCE-table (ref_obj) */
+ &ext_0, /* placement-record extensions #0 with data-ptr pointing to cursor/index-struct */
+ NULL, /* no placement-record extensions #1 */
+ spot_group, /* optional spotgroup re-grouping */
+ NULL /* source-cursor specific data/context */
+ );
+ if ( rc == 0 )
+ {
+ rc = PlacementSetIteratorAddPlacementIterator ( set_iter, pl_iter );
+ /* if the iterator-set was not able to take ownership of the new iterator
+ we have to release the iterator right here! */
+ if ( rc != 0 )
+ PlacementIteratorRelease( pl_iter );
+
+ /* if the new iterator has actually no placements inside, the call
+ to PlacementSetIteratorAddPlacementIterator() returned rcDone, which is OK - we continue... */
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ }
+ }
+
+ if ( rc == 0 )
+ rc = VectorAppend ( context_list, NULL, atx );
+ return rc;
+}
+
+
+static rc_t add_pl_iters( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ const ReferenceObj * const ref_obj,
+ const input_database * const idb,
+ INSDC_coord_zero ref_pos,
+ INSDC_coord_len ref_len,
+ const char * spot_group,
+ Vector * const context_list )
+{
+ KNamelist *tables;
+ rc_t rc = VDatabaseListTbl( idb->db, &tables );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VDatabaseListTbl( $(tn) ) failed", "tn=%s", idb->path ) );
+ }
+ else
+ {
+ if ( opts->dump_primary_alignments && namelist_contains( tables, PRIM_TABLE ) ) /* read_fkt.c */
+ {
+ rc = add_table_pl_iter( opts, set_iter, ref_obj, idb, ref_pos, ref_len, spot_group,
+ PRIM_TABLE, primary_align_ids, context_list );
+ }
+
+ if ( rc == 0 && opts->dump_secondary_alignments && namelist_contains( tables, SEC_TABLE ) )
+ {
+ rc = add_table_pl_iter( opts, set_iter, ref_obj, idb, ref_pos, ref_len, spot_group,
+ SEC_TABLE, secondary_align_ids, context_list );
+ }
+
+ if ( rc == 0 )
+ {
+ bool b0 = ( opts->dump_cg_evidence &&
+ namelist_contains( tables, EV_INT_TABLE ) );
+
+ bool b1 = ( ( opts->dump_cg_sam || opts->dump_cg_ev_dnb ) &&
+ namelist_contains( tables, EV_INT_TABLE ) &&
+ namelist_contains( tables, EV_AL_TABLE ) );
+
+ if ( b0 || b1 )
+ {
+ rc = add_table_pl_iter( opts, set_iter, ref_obj, idb, ref_pos, ref_len, spot_group,
+ EV_INT_TABLE, evidence_align_ids, context_list );
+ }
+ }
+ KNamelistRelease( tables );
+ }
+ return rc;
+}
+
+
+/* the user did not specify ranges on the reference, that means the whole file has to be dumped...
+ the reflist is iterated over all ref-objects it contains ... */
+static rc_t prepare_whole_files( const samdump_opts * const opts,
+ const input_files * const ifs,
+ PlacementSetIterator * const set_iter,
+ Vector * const context_list )
+{
+ rc_t rc = 0;
+ uint32_t db_idx;
+ /* we now loop through all input-databases... */
+ for ( db_idx = 0; db_idx < ifs->database_count && rc == 0; ++db_idx )
+ {
+ const input_database * idb = VectorGet( &ifs->dbs, db_idx );
+ if ( idb != NULL )
+ {
+ uint32_t refobj_count;
+ rc = ReferenceList_Count( idb->reflist, &refobj_count );
+ if ( rc == 0 && refobj_count > 0 )
+ {
+ uint32_t ref_idx;
+ for ( ref_idx = 0; ref_idx < refobj_count && rc == 0; ++ref_idx )
+ {
+ const ReferenceObj* ref_obj;
+ rc = ReferenceList_Get( idb->reflist, &ref_obj, ref_idx );
+ if ( rc == 0 && ref_obj != NULL )
+ {
+ INSDC_coord_len ref_len;
+ rc = ReferenceObj_SeqLength( ref_obj, &ref_len );
+ if ( rc == 0 )
+ rc = add_pl_iters( opts,
+ set_iter,
+ ref_obj,
+ idb,
+ 0, /* where it starts on the reference */
+ ref_len, /* the whole length of this reference/chromosome */
+ NULL, /* no spotgroup re-grouping (yet) */
+ context_list
+ );
+ ReferenceObj_Release( ref_obj );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct on_region_ctx
+{
+ rc_t rc;
+ const samdump_opts * opts;
+ input_database * idb;
+ PlacementSetIterator * set_iter;
+ Vector *context_list;
+} on_region_ctx;
+
+
+static void CC on_region( BSTNode *n, void *data )
+{
+ on_region_ctx * rctx = data;
+ if ( rctx->rc == 0 )
+ {
+ reference_region * ref_rgn = ( reference_region * )n;
+ const ReferenceObj * ref_obj;
+ rctx->rc = ReferenceList_Find( rctx->idb->reflist, &ref_obj, ref_rgn->name, string_size( ref_rgn->name ) );
+ if ( rctx->rc == 0 )
+ {
+ uint32_t range_idx, range_count = VectorLength( &ref_rgn->ranges );
+ for ( range_idx = 0; range_idx < range_count && rctx->rc == 0; ++range_idx )
+ {
+ range * r = VectorGet( &ref_rgn->ranges, range_idx );
+ if ( r != NULL )
+ {
+ INSDC_coord_len len;
+ if ( r->start == 0 && r->end == 0 )
+ {
+ r->start = 1;
+ rctx->rc = ReferenceObj_SeqLength( ref_obj, &len );
+ if ( rctx->rc == 0 )
+ r->end = ( r->start + len );
+ }
+ else
+ {
+ len = ( r->end - r->start + 1 );
+ }
+ if ( rctx->rc == 0 )
+ {
+ rctx->rc = add_pl_iters( rctx->opts, rctx->set_iter, ref_obj, rctx->idb,
+ r->start, /* where the range starts on the reference */
+ len, /* the length of this range */
+ NULL, /* no spotgroup re-grouping (yet) */
+ rctx->context_list
+ );
+ }
+ }
+ }
+ ReferenceObj_Release( ref_obj );
+ }
+ else
+ {
+ if ( GetRCState( rctx->rc ) == rcNotFound ) rctx->rc = 0;
+ }
+ }
+}
+
+
+static rc_t prepare_regions( const samdump_opts * const opts,
+ const input_files * const ifs,
+ PlacementSetIterator * const set_iter,
+ Vector * const context_list )
+{
+ uint32_t db_idx;
+ on_region_ctx rctx;
+
+ rctx.rc = 0;
+ rctx.opts = opts;
+ rctx.set_iter = set_iter;
+ rctx.context_list = context_list;
+ /* we now loop through all input-databases... */
+ for ( db_idx = 0; db_idx < ifs->database_count && rctx.rc == 0; ++db_idx )
+ {
+ rctx.idb = VectorGet( &ifs->dbs, db_idx );
+ if ( rctx.idb != NULL )
+ BSTreeForEach( ( BSTree * ) &opts->regions, false, on_region, &rctx );
+ }
+ return rctx.rc;
+}
+
+
+static uint32_t calc_mate_flags( uint32_t flags )
+{
+ uint32_t res = ( flags & 0x1 ) |
+ ( flags & 0x2 ) |
+ ( ( flags & 0x8 ) >> 1 ) |
+ ( ( flags & 0x4 ) << 1 ) |
+ ( ( flags & 0x20 ) >> 1 ) |
+ ( ( flags & 0x10 ) << 1 ) |
+ ( ( flags & 0x40 ) ? 0x80 : 0x40 ) |
+ ( flags & 0x700 );
+ return res;
+}
+
+
+static const char *equal_sign = "=";
+
+
+static rc_t print_qslice( const samdump_opts * const opts,
+ bool reverse,
+ const char * source,
+ uint32_t source_str_len,
+ uint32_t * source_offset,
+ const uint32_t * source_len_vector,
+ uint32_t source_len_vector_len,
+ uint32_t slice_nr )
+{
+ rc_t rc = 0;
+ if ( *source_offset > source_str_len || slice_nr >= source_len_vector_len )
+ rc = RC( rcExe, rcNoTarg, rcReading, rcParam, rcInvalid );
+ else
+ {
+ uint32_t len = source_len_vector[ slice_nr ];
+ if ( len > 0 )
+ {
+ const char * ptr = &source[ *source_offset ];
+ rc = dump_quality_33( opts, ptr, len, reverse ); /* sam-dump-opts.c */
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "" );
+ if ( rc == 0 )
+ *source_offset += len;
+ }
+ }
+ else
+ rc = KOutMsg( "*" );
+ }
+ return rc;
+}
+
+
+static rc_t modify_and_print_cigar( const char * cigar,
+ size_t cigar_len,
+ CigOps *ref_cig,
+ int32_t ref_cig_len,
+ INSDC_coord_zero ref_pos,
+ uint32_t read_len )
+{
+ rc_t rc;
+ if ( cigar_len > 0 )
+ {
+ char cigbuf[ MAX_CG_CIGAR_LEN ];
+ CigOps al_cig[ 1024 ];
+ ExplodeCIGAR( al_cig, 1024, cigar, cigar_len );
+ CombineCIGAR( cigbuf, al_cig, read_len, ref_pos, ref_cig, ref_cig_len );
+ rc = KOutMsg( "%s\t", cigbuf );
+ }
+ else
+ rc = KOutMsg( "*\t" );
+ return rc;
+}
+
+
+static rc_t get_READ_QUALITY_EDIT_DIST( cg_cigar_output * cgc_output,
+ int64_t align_id,
+ const align_cmn_context * acc )
+{
+ /* get READ, QUALITY and EIDT_DIST before cigar manipulation because we need/change these values */
+ rc_t rc = read_char_ptr( align_id, acc->cursor, acc->read_idx, &cgc_output->p_read.ptr, &cgc_output->p_read.len, "READ" );
+ if ( rc == 0 )
+ rc = read_char_ptr( align_id, acc->cursor, acc->sam_quality_idx, &cgc_output->p_quality.ptr, &cgc_output->p_quality.len, "SAM_QUALITY" );
+ if ( rc == 0 )
+ rc = read_int32( align_id, acc->cursor, acc->edit_dist_idx, &cgc_output->edit_dist, 0, "EDIT_DIST" );
+ cgc_output->p_tags.len = 0;
+ return rc;
+}
+
+
+static rc_t read_ref_orientation_and_seq_read_id( cg_cigar_input * cgc_input,
+ int64_t align_id,
+ const align_cmn_context * acc )
+{
+ rc_t rc = read_bool( align_id, acc->cursor, acc->ref_orientation_idx, &cgc_input->orientation, false, "REF_ORIENT" );
+ if ( rc == 0 )
+ rc = read_INSDC_coord_one( align_id, acc->cursor, acc->seq_read_id_idx, &cgc_input->seq_req_id, 0, "SEQ_READ_ID" );
+ return rc;
+}
+
+/* this function expects:
+ READ in : cgc_output->p_read.ptr, cgc_output->p_read.len
+ SAM_QUALITY in : cgc_output->p_quality.ptr, cgc_output->p_quality.len
+ CIGAR in : cgc_input->p_cigar.ptr, cgc_input->p_cigar.len
+ EDIT_DIST in : cgc_output->edit_dist
+*/
+static rc_t cg_cigar_treatments( enum cigar_treatment what_treatment,
+ cg_cigar_input * cgc_input,
+ cg_cigar_output * cgc_output,
+ int64_t align_id,
+ const align_cmn_context * acc )
+{
+ rc_t rc = 0;
+ switch ( what_treatment )
+ {
+ case ct_unchanged : cgc_output->p_cigar.len = cgc_input->p_cigar.len;
+ cgc_output->p_cigar.ptr = cgc_input->p_cigar.ptr;
+ break;
+
+ case ct_cg_style : rc = read_ref_orientation_and_seq_read_id( cgc_input, align_id, acc );
+ if ( rc == 0 )
+ {
+ cgc_input->edit_dist_available = true;
+ cgc_input->edit_dist = cgc_output->edit_dist;
+ rc = make_cg_cigar( cgc_input, cgc_output );
+ if ( rc == 0 )
+ {
+ cgc_output->p_cigar.len = cgc_output->cigar_len;
+ cgc_output->p_cigar.ptr = cgc_output->cigar;
+ }
+ }
+ break;
+
+ case ct_cg_merge : rc = read_ref_orientation_and_seq_read_id( cgc_input, align_id, acc );
+ if ( rc == 0 )
+ {
+ cgc_input->p_read.ptr = cgc_output->p_read.ptr;
+ cgc_input->p_read.len = cgc_output->p_read.len;
+ cgc_input->p_quality.ptr = cgc_output->p_quality.ptr;
+ cgc_input->p_quality.len = cgc_output->p_quality.len;
+ cgc_input->edit_dist_available = true;
+ cgc_input->edit_dist = cgc_output->edit_dist;
+ rc = make_cg_merge( cgc_input, cgc_output );
+ if ( rc == 0 )
+ {
+ cgc_output->p_cigar.len = cgc_output->cigar_len;
+ cgc_output->p_cigar.ptr = cgc_output->cigar;
+ }
+ }
+ break;
+ }
+ return rc;
+}
+
+
+static rc_t print_quality_or_star( const samdump_opts * const opts,
+ const char * const q,
+ uint32_t q_len,
+ uint32_t r_len )
+{
+ rc_t rc;
+ bool star_qual = ( q_len == 0 || q_len != r_len );
+ if ( !star_qual && q[ 0 ] == 255 )
+ {
+ uint32_t i = 0;
+ while ( i < q_len && q[ i ] == 255 ) i++;
+ star_qual = ( i == q_len );
+ }
+
+ if ( star_qual )
+ rc = KOutMsg( "*" );
+ else
+ rc = dump_quality_33( opts, q, q_len, false ); /* sam-dump-opts.c */
+
+ return rc;
+}
+
+
+/* triggered by option "--CG-SAM" */
+static rc_t print_evidence_alignment_cg_sam( const samdump_opts * const opts,
+ const PlacementRecord * const rec,
+ const align_table_context * const atx,
+ int64_t align_id,
+ uint32_t ploidy_idx,
+ const char * ref_name,
+ INSDC_coord_zero allele_pos,
+ int32_t ref_cig_len )
+{
+ const VCursor * cursor = atx->eval.cursor;
+ INSDC_coord_zero ref_pos;
+ uint32_t seq_name_len, sam_flags, spot_group_len = 0;
+ const char * seq_name, * spot_group;
+ int32_t mapq;
+ cg_cigar_output cgc_output;
+
+ rc_t rc = read_char_ptr( align_id, cursor, atx->seq_name_idx, &seq_name, &seq_name_len, "SEQ_NAME" );
+ if ( rc == 0 && atx->eval.seq_spot_group_idx != COL_NOT_AVAILABLE )
+ rc = read_char_ptr( align_id, cursor, atx->eval.seq_spot_group_idx, &spot_group, &spot_group_len, "SEQ_SPOT_GROUP" );
+
+ if ( rc == 0 )
+ {
+ if ( opts->print_cg_names )
+ {
+ if ( spot_group_len > 0 )
+ /* SAM-FIELD: QNAME constructed from spot-group/seq-name */
+ rc = KOutMsg( "%.*s-1:%.*s\t", spot_group_len, spot_group, seq_name_len, seq_name );
+
+ }
+ else
+ {
+ if ( seq_name_len > 0 )
+ /* SAM-FIELD: QNAME constructed from allel-id/sub-id */
+ rc = KOutMsg( "%.*s/ALLELE_%li.%u\t", seq_name_len, seq_name, rec->id, ploidy_idx );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = read_INSDC_coord_zero( align_id, cursor, atx->ref_pos_idx, &ref_pos, 0, "REF_POS" );
+
+ if ( rc == 0 )
+ rc = read_int32( align_id, cursor, atx->mapq_idx, &mapq, 0, "MAPQ" );
+
+ if ( rc == 0 )
+ {
+ uint8_t ref_orient;
+ rc = read_uint8( align_id, cursor, atx->eval.ref_orientation_idx, &ref_orient, 0, "REF_ORIENT" );
+ if ( rc == 0 )
+ {
+ INSDC_coord_one seq_read_id;
+ bool cmpl = ref_orient;
+ rc = read_INSDC_coord_one( align_id, cursor, atx->eval.seq_read_id_idx, &seq_read_id, 0, "SEQ_READ_ID" );
+ sam_flags = ( 1 | ( cmpl ? 0x10 : 0 ) | ( seq_read_id == 1 ? 0x40 : 0x80 ) );
+ }
+ }
+
+ /* SAM-FIELD: FLAG SRA-column: SAM_FLAGS ( uint32 ) */
+ /* SAM-FIELD: RNAME SRA-column: ALLEL-NAME.ploidy_idx */
+ /* SAM-FIELD: POS SRA-column: REF_POS + 1 */
+ /* SAM-FIELD: MAPQ SRA-column: MAPQ ( from evidence-alignment-table, not from allel! ) */
+ if ( rc == 0 )
+ rc = KOutMsg( "%u\t%s\t%i\t%d\t", sam_flags, ref_name, allele_pos + ref_pos + 1, mapq );
+
+ /* get READ, QUALITY and EIDT_DIST before cigar manipulation because we need/change these values */
+ if ( rc == 0 )
+ rc = get_READ_QUALITY_EDIT_DIST( &cgc_output, align_id, &atx->eval );
+
+ /* SAM-FIELD: CIGAR SRA-column: CIGAR_SHORT / with special treatment */
+ if ( rc == 0 )
+ {
+ cg_cigar_input cgc_input;
+ rc = read_char_ptr( align_id, cursor, atx->eval.cigar_idx, &cgc_input.p_cigar.ptr, &cgc_input.p_cigar.len, "CIGAR" );
+ if ( rc == 0 )
+ rc = cg_cigar_treatments( opts->cigar_treatment, &cgc_input, &cgc_output, align_id, &atx->eval );
+ if ( rc == 0 )
+ rc = modify_and_print_cigar( cgc_output.p_cigar.ptr, cgc_output.p_cigar.len,
+ atx->cig_op_buffer, ref_cig_len, ref_pos, cgc_output.p_read.len );
+ }
+
+ /* SAM-FIELD: RNEXT SRA-column: MATE_REF_NAME '*' no mates! */
+ /* SAM-FIELD: PNEXT SRA-column: MATE_REF_POS + 1 '0' no mates */
+ /* SAM-FIELD: TLEN SRA-column: TEMPLATE_LEN '0' not in table */
+ /* SAM-FIELD: SEQ SRA-column: READ */
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t%.*s\t", cgc_output.p_read.len, cgc_output.p_read.ptr );
+
+ /* SAM-FIELD: QUAL SRA-column: SAM_QUALITY */
+ if ( rc == 0 )
+ rc = print_quality_or_star( opts, cgc_output.p_quality.ptr, cgc_output.p_quality.len, cgc_output.p_read.len ); /* above */
+
+ /* OPT SAM-FIELD: RG SRA-column: SEQ_SPOT_GROUP */
+ if ( rc == 0 && spot_group_len > 0 )
+ rc = KOutMsg( "\tRG:Z:%.*s", spot_group_len, spot_group );
+
+ if ( rc == 0 && cgc_output.p_tags.len > 0 )
+ rc = KOutMsg( "\t%.*s", cgc_output.p_tags.len, cgc_output.p_tags.ptr );
+
+ /* OPT SAM-FIELD: ZI SRA-column: rec->id */
+ /* OPT SAM-FIELD: ZA SRA-column: ploidy_idx */
+ if ( rc == 0 )
+ rc = KOutMsg( "\tZI:i:%li\tZA:i:%u", rec->id, ploidy_idx );
+
+ /* OPT SAM-FIELD: NH SRA-column: ALIGNMENT_COUNT */
+ if ( rc == 0 && atx->eval.al_count_idx != COL_NOT_AVAILABLE )
+ {
+ const uint8_t * al_count;
+ uint32_t al_count_len;
+ rc = read_uint8_ptr( align_id, cursor, atx->eval.al_count_idx, &al_count, &al_count_len, "ALIGNMENT_COUNT" );
+ if ( rc == 0 && al_count_len > 0 )
+ rc = KOutMsg( "\tNH:i:%u", *al_count );
+ }
+
+ /* OPT SAM-FIELD: NM SRA-column: EDIT_DISTANCE */
+ if ( rc == 0 )
+ rc = KOutMsg( "\tNM:i:%u", cgc_output.edit_dist );
+
+ /* OPT SAM-FIELD: XI SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", align_id );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ return rc;
+}
+
+
+/* triggered by option --CG-evidence-dnb */
+static rc_t print_evidence_alignment_cg_ev_dnb( const samdump_opts * const opts,
+ const PlacementRecord * const rec,
+ const align_table_context * const atx,
+ int64_t align_id,
+ uint32_t ploidy_idx )
+{
+ const VCursor * cursor = atx->eval.cursor;
+ INSDC_coord_zero ref_pos;
+ uint32_t seq_name_len, sam_flags, spot_group_len = 0;
+ int32_t mapq;
+ const char * seq_name, * spot_group;
+ cg_cigar_output cgc_output;
+
+ rc_t rc = read_char_ptr( align_id, cursor, atx->seq_name_idx, &seq_name, &seq_name_len, "SEQ_NAME" );
+ if ( rc == 0 && atx->eval.seq_spot_group_idx != COL_NOT_AVAILABLE )
+ rc = read_char_ptr( align_id, cursor, atx->eval.seq_spot_group_idx, &spot_group, &spot_group_len, "SEQ_SPOT_GROUP" );
+
+ if ( rc == 0 )
+ {
+ if ( opts->print_cg_names )
+ {
+ if ( spot_group_len > 0 )
+ /* SAM-FIELD: QNAME constructed from spot-group/seq-name */
+ rc = KOutMsg( "%.*s-1:%.*s\t", spot_group_len, spot_group, seq_name_len, seq_name );
+
+ }
+ else
+ {
+ if ( seq_name_len > 0 )
+ /* SAM-FIELD: QNAME constructed from allel-id/sub-id */
+ rc = KOutMsg( "%.*s/ALLELE_%li.%u\t", seq_name_len, seq_name, rec->id, ploidy_idx );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = read_INSDC_coord_zero( align_id, cursor, atx->ref_pos_idx, &ref_pos, 0, "REF_POS" );
+
+ if ( rc == 0 )
+ rc = read_int32( align_id, cursor, atx->mapq_idx, &mapq, 0, "MAPQ" );
+
+ if ( rc == 0 )
+ {
+ uint8_t ref_orient;
+ rc = read_uint8( align_id, cursor, atx->eval.ref_orientation_idx, &ref_orient, 0, "REF_ORIENT" );
+ if ( rc == 0 )
+ {
+ INSDC_coord_one seq_read_id;
+ bool cmpl = ref_orient;
+ rc = read_INSDC_coord_one( align_id, cursor, atx->eval.seq_read_id_idx, &seq_read_id, 0, "SEQ_READ_ID" );
+ sam_flags = ( 1 | ( cmpl ? 0x10 : 0 ) | ( seq_read_id == 1 ? 0x40 : 0x80 ) );
+ }
+ }
+
+ /* SAM-FIELD: FLAG SRA-column: SAM_FLAGS ( uint32 ) */
+ /* SAM-FIELD: RNAME SRA-column: ALLEL-NAME.ploidy_idx */
+ /* SAM-FIELD: POS SRA-column: REF_POS + 1 */
+ /* SAM-FIELD: MAPQ SRA-column: MAPQ ( from evidence-alignment-table, not from allel! ) */
+ if ( rc == 0 )
+ rc = KOutMsg( "%u\tALLELE_%li.%u\t%i\t%d\t", sam_flags, rec->id, ploidy_idx, ref_pos + 1, mapq );
+
+ /* get READ, QUALITY and EIDT_DIST before cigar manipulation because we need/change these values */
+ if ( rc == 0 )
+ rc = get_READ_QUALITY_EDIT_DIST( &cgc_output, align_id, &atx->eval );
+
+ /* SAM-FIELD: CIGAR SRA-column: CIGAR_SHORT / with or without treatment */
+ if ( rc == 0 )
+ {
+ cg_cigar_input cgc_input;
+ rc = read_char_ptr( align_id, cursor, atx->eval.cigar_idx, &cgc_input.p_cigar.ptr, &cgc_input.p_cigar.len, "CIGAR" );
+ if ( rc == 0 )
+ rc = cg_cigar_treatments( opts->cigar_treatment, &cgc_input, &cgc_output, align_id, &atx->eval );
+ if ( rc == 0 )
+ rc = cg_canonical_print_cigar( cgc_output.p_cigar.ptr, cgc_output.p_cigar.len);
+ if(rc == 0) rc = KOutMsg( "\t");
+ }
+
+ /* SAM-FIELD: RNEXT SRA-column: MATE_REF_NAME '*' no mates! */
+ /* SAM-FIELD: PNEXT SRA-column: MATE_REF_POS + 1 '0' no mates */
+ /* SAM-FIELD: TLEN SRA-column: TEMPLATE_LEN '0' not in table */
+ /* SAM-FIELD: SEQ SRA-column: READ */
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t%.*s\t", cgc_output.p_read.len, cgc_output.p_read.ptr );
+
+ /* SAM-FIELD: QUAL SRA-column: SAM_QUALITY */
+ if ( rc == 0 )
+ rc = print_quality_or_star( opts, cgc_output.p_quality.ptr, cgc_output.p_quality.len, cgc_output.p_read.len ); /* above */
+
+ /* OPT SAM-FIELD: RG SRA-column: SEQ_SPOT_GROUP */
+ if ( rc == 0 && spot_group_len > 0 )
+ rc = KOutMsg( "\tRG:Z:%.*s", spot_group_len, spot_group );
+
+ if ( rc == 0 && cgc_output.p_tags.len > 0 )
+ rc = KOutMsg( "\t%.*s", cgc_output.p_tags.len, cgc_output.p_tags.ptr );
+
+ /* OPT SAM-FIELD: NH SRA-column: ALIGNMENT_COUNT */
+ if ( rc == 0 && atx->eval.al_count_idx != COL_NOT_AVAILABLE )
+ {
+ const uint8_t * al_count;
+ uint32_t al_count_len;
+ rc = read_uint8_ptr( align_id, cursor, atx->eval.al_count_idx, &al_count, &al_count_len, "ALIGNMENT_COUNT" );
+ if ( rc == 0 && al_count_len > 0 )
+ rc = KOutMsg( "\tNH:i:%u", *al_count );
+ }
+
+ /* OPT SAM-FIELD: NM SRA-column: EDIT_DISTANCE */
+ if ( rc == 0 )
+ rc = KOutMsg( "\tNM:i:%u", cgc_output.edit_dist );
+
+ /* OPT SAM-FIELD: XI SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", align_id );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ return rc;
+}
+
+
+/* print minimal one alignment from the EVIDENCE-INTERVAL / EVIDENCE-ALIGNMENT - table(s)
+ triggered by option "--CG-SAM / --CG-evidence / --CG-evidence-dnb */
+static rc_t print_alignment_sam_ev( const samdump_opts * const opts,
+ const char * ref_name,
+ INSDC_coord_zero pos,
+ const PlacementRecord * const rec,
+ align_table_context * const atx )
+{
+ uint32_t ploidy;
+ const VCursor * cursor = atx->cmn.cursor;
+ rc_t rc = read_uint32( rec->id, cursor, atx->ploidy_idx, &ploidy, 0, "PLOIDY" );
+ if ( rc == 0 && ploidy > 0 )
+ {
+ uint32_t ploidy_idx, cigar_len_vector_len, read_len_vector_len, edit_dist_vector_len, cigar_str_len, read_len, quality_str_len;
+ uint32_t quality_offset = 0;
+ const uint32_t *cigar_len_vector, *read_len_vector, *edit_dist_vector;
+ const char * cigar, *read, *quality;
+ char * transformed_cigar = NULL;
+ char * org_transformed_cigar = NULL;
+
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.cigar_idx, &cigar, &cigar_str_len, "CIGAR" );
+ if ( rc == 0 )
+ {
+ org_transformed_cigar = string_dup ( cigar, cigar_str_len );
+ if ( org_transformed_cigar != NULL )
+ {
+ uint32_t i;
+ for ( i = 0; i < cigar_str_len; ++i )
+ {
+ if ( org_transformed_cigar[ i ] == 'S' ) org_transformed_cigar[ i ] = 'I';
+ }
+ transformed_cigar = org_transformed_cigar;
+ }
+ }
+
+ if ( rc == 0 )
+ rc = read_uint32_ptr( rec->id, cursor, atx->cmn.cigar_len_idx, &cigar_len_vector, &cigar_len_vector_len, "CIGAR_LEN" );
+ if ( rc == 0 )
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.read_idx, &read, &read_len, "READ" );
+ if ( rc == 0 )
+ rc = read_uint32_ptr( rec->id, cursor, atx->cmn.read_len_idx, &read_len_vector, &read_len_vector_len, "READ_LEN" );
+ if ( rc == 0 )
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.sam_quality_idx, &quality, &quality_str_len, "QUALITY" );
+ if ( rc == 0 )
+ rc = read_uint32_ptr( rec->id, cursor, atx->cmn.edit_dist_idx, &edit_dist_vector, &edit_dist_vector_len, "EDIT_DIST" );
+
+ for ( ploidy_idx = 0; ploidy_idx < ploidy && rc == 0; ++ploidy_idx )
+ {
+ uint32_t cigar_slice_len = cigar_len_vector[ ploidy_idx ];
+ uint32_t read_slice_len = read_len_vector[ ploidy_idx ];
+ if ( opts->dump_cg_evidence )
+ {
+ /* SAM-FIELD: QNAME SRA-column: eventually prefixed row-id into EVIDENCE_INTERVAL - table */
+ /* SAM-FIELD: FLAG SRA-column: SAM_FLAGS ( uint32 ) */
+ /* SAM-FIELD: RNAME SRA-column: REF_NAME / REF_SEQ_ID ( char * ) */
+ /* SAM-FIELD: POS SRA-column: REF_POS + 1 */
+ /* SAM-FIELD: MAPQ SRA-column: MAPQ */
+ if ( rc == 0 )
+ {
+ if ( opts->print_cg_names )
+ rc = KOutMsg( "-1:0\t" );
+ else
+ rc = KOutMsg( "ALLELE_%li.%u\t", rec->id, ploidy_idx + 1 );
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg( "0\t%s\t%u\t%d\t", ref_name, pos + 1, rec->mapq );
+
+ /* SAM-FIELD: CIGAR SRA-column: CIGAR_SHORT / CIGAR_LONG sliced!!! */
+ if ( rc == 0 )
+ rc = KOutMsg( "%.*s\t", cigar_slice_len, transformed_cigar );
+
+ /* SAM-FIELD: RNEXT SRA-column: MATE_REF_NAME ( !!! row_len can be zero !!! ) */
+ /* SAM-FIELD: PNEXT SRA-column: MATE_REF_POS + 1 ( !!! row_len can be zero !!! ) */
+ /* SAM-FIELD: TLEN SRA-column: TEMPLATE_LEN ( !!! row_len can be zero !!! ) */
+ /* SAM-FIELD: SEQ SRA-column: READ sliced!!! */
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t%.*s\t", read_slice_len, read );
+
+ /* SAM-FIELD: QUAL SRA-column: SAM_QUALITY sliced!!! */
+ if ( rc == 0 )
+ {
+ if ( quality_str_len == read_slice_len )
+ rc = print_qslice( opts, false, quality, quality_str_len, &quality_offset, read_len_vector, read_len_vector_len, ploidy_idx );
+ else
+ rc = KOutMsg( "*" );
+ }
+
+ /* OPT SAM-FIELD: RG SRA-column: ploidy_idx */
+ if ( rc == 0 )
+ rc = KOutMsg( "\tRG:Z:ALLELE_%u", ploidy_idx + 1 );
+
+ /* OPT SAM-FIELD: XI SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", rec->id );
+
+ /* OPT SAM-FIELD: NM SRA-column: EDIT_DISTANCE sliced!!! */
+ if ( rc == 0 && ( ploidy_idx < edit_dist_vector_len ) )
+ rc = KOutMsg( "\tNM:i:%u", edit_dist_vector[ ploidy_idx ] );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+
+ /* we do that here per ALLEL-READ, not at the end per ALLEL, because we have to test which alignments
+ fit the ploidy_idx */
+
+ if ( rc == 0 && ( opts->dump_cg_sam || opts->dump_cg_ev_dnb ) )
+ {
+ const int64_t *ev_al_ids;
+ uint32_t ev_al_ids_count, read_id;
+
+ rc = read_int64_ptr( rec->id, atx->cmn.cursor, atx->ev_alignments_idx, &ev_al_ids, &ev_al_ids_count, "EV_ALIGNMENTS" );
+ for ( read_id = 0; read_id < ev_al_ids_count && rc == 0; ++read_id )
+ {
+ uint32_t ref_ploidy;
+ int64_t align_id = ev_al_ids[ read_id ];
+ rc = read_uint32( align_id, atx->eval.cursor, atx->ref_ploidy_idx, &ref_ploidy, 0, "PLOIDY" );
+
+ if ( rc == 0 && ( ref_ploidy == ( ploidy_idx + 1 ) ) )
+ {
+ if ( rc == 0 && opts->dump_cg_sam )
+ {
+ rc = adjust_align_table_context_cig_op_buffer( atx, read_slice_len );
+ if ( rc == 0 )
+ {
+ int32_t ref_cig_len = ExplodeCIGAR( atx->cig_op_buffer, atx->cig_op_buffer_len, cigar, cigar_slice_len );
+ rc = print_evidence_alignment_cg_sam( opts, rec, atx, align_id, ploidy_idx + 1, ref_name, pos, ref_cig_len );
+ }
+ }
+
+ if ( rc == 0 && opts->dump_cg_ev_dnb )
+ rc = print_evidence_alignment_cg_ev_dnb( opts, rec, atx, align_id, ploidy_idx + 1 );
+ }
+ }
+ }
+
+ /* advance the cigar-slice... */
+ cigar += cigar_slice_len;
+ if ( transformed_cigar != NULL )
+ transformed_cigar += cigar_slice_len;
+ read += read_slice_len;
+ }
+ if ( org_transformed_cigar != NULL )
+ free( org_transformed_cigar );
+ }
+ return rc;
+}
+
+
+static rc_t opt_field_spot_group( const VCursor * cursor, uint32_t col_id, int64_t row_id )
+{
+ const char * value = NULL;
+ uint32_t len;
+ rc_t rc = read_char_ptr( row_id, cursor, col_id, &value, &len, "SPOT_GROUP" );
+ if ( rc == 0 && len > 0 )
+ rc = KOutMsg( "\tRG:Z:%.*s", len, value );
+ return rc;
+}
+
+
+static rc_t opt_field_lnk_group( const VCursor * cursor, uint32_t col_id, int64_t row_id )
+{
+ const char * value = NULL;
+ uint32_t len;
+ rc_t rc = read_char_ptr( row_id, cursor, col_id, &value, &len, "LINKAGE_GROUP" );
+ if ( rc == 0 && len > 0 )
+ {
+ enum { ofl_norm, ofl_cb1, ofl_cb2, ofl_cb3, ofl_cb4, ofl_ub1, ofl_ub2, ofl_ub3, ofl_ub4 };
+
+ String CB, UB;
+ uint32_t idx, state;
+
+ StringInit( &CB, NULL, 0, 0 );
+ StringInit( &UB, NULL, 0, 0 );
+ for ( idx = 0, state = ofl_norm; idx < len; ++idx )
+ {
+ switch ( state )
+ {
+ case ofl_norm : state = ( value[ idx ] == 'C' ) ? ofl_cb1 : ofl_norm; break;
+ case ofl_cb1 : state = ( value[ idx ] == 'B' ) ? ofl_cb2 : ofl_norm; break;
+ case ofl_cb2 : state = ( value[ idx ] == ':' ) ? ofl_cb3 : ofl_norm; break;
+ case ofl_cb3 : if ( value[ idx ] == '|' )
+ state = ofl_ub1;
+ else
+ {
+ if ( CB.addr == NULL )
+ { StringInit( &CB, &value[ idx ], 1, 1 ); }
+ else
+ { CB.len += 1; CB.size += 1; }
+ }
+ break;
+ case ofl_ub1 : state = ( value[ idx ] == 'U' ) ? ofl_ub2 : ofl_norm; break;
+ case ofl_ub2 : state = ( value[ idx ] == 'B' ) ? ofl_ub3 : ofl_norm; break;
+ case ofl_ub3 : state = ( value[ idx ] == ':' ) ? ofl_ub4 : ofl_norm; break;
+ case ofl_ub4 : if ( UB.addr == NULL )
+ { StringInit( &UB, &value[ idx ], 1, 1 ); }
+ else
+ { UB.len += 1; UB.size += 1; }
+ break;
+ }
+ }
+
+ if ( CB.addr == NULL && UB.addr == NULL )
+ { rc = KOutMsg( "\tBX:Z:%.*s", len, value ); }
+ else
+ { rc = KOutMsg( "\tCB:Z:%S\tUB:Z:%S", &CB, &UB ); }
+ }
+ return rc;
+}
+
+static rc_t print_alignment_sam_ps( const samdump_opts * const opts,
+ const char * ref_name,
+ INSDC_coord_zero pos,
+ matecache * const mc,
+ struct rna_splice_dict * splice_dict,
+ const PlacementRecord * const rec,
+ const align_table_context * const atx )
+{
+ uint32_t sam_flags = 0, NM_adjustments = 0, seq_spot_id_len, mate_ref_pos_len = 0, mate_ref_name_len = string_size( ref_name );
+ INSDC_coord_zero mate_ref_pos = 0;
+ INSDC_coord_len tlen = 0;
+ int64_t mate_align_id = 0, id = rec->id;
+ const int64_t * seq_spot_id;
+ const char * mate_ref_name = ref_name;
+ const VCursor * cursor = atx->cmn.cursor;
+ cg_cigar_output cgc_output;
+ rna_splice_candidates candidates; /* in cg_tools.h */
+ bool rna_not_homogeneous_flag = false;
+
+ /* SAM-FIELD: NONE SRA-column: MATE_ALIGN_ID ( int64 ) ... for cache lookup's */
+ rc_t rc = read_int64( id, cursor, atx->mate_align_id_idx, &mate_align_id, 0, "MATE_ALIGN_ID" );
+
+ candidates.count = 0;
+ candidates.fwd_matched = 0;
+ candidates.rev_matched = 0;
+
+ /* pre-read seq-spot-id, needed for unaligned cache and SAM-field QNAME */
+ if ( rc == 0 )
+ rc = read_int64_ptr( id, cursor, atx->cmn.seq_spot_id_idx, &seq_spot_id, &seq_spot_id_len, "SEQ_SPOT_ID" );
+
+ /* try to find the info about the mate in the CACHE... */
+ if ( rc == 0 )
+ {
+ if ( mate_align_id != 0 )
+ {
+ if ( opts->use_mate_cache && mc != NULL )
+ {
+ rc = matecache_lookup_same_ref( mc, atx->db_idx, mate_align_id, &mate_ref_pos, &sam_flags, &tlen );
+ if ( rc == 0 )
+ {
+ /* we found it in the the sam-ref-matecache */
+ const INSDC_read_filter * read_filter;
+ uint32_t read_filter_len;
+
+ /* cache entry-found! (on the same reference) -> that means we have now mate_ref_pos, flags and tlen */
+ matecache_remove_same_ref( mc, atx->db_idx, mate_align_id );
+ mate_ref_name = equal_sign;
+ mate_ref_name_len = 1;
+ mate_ref_pos_len = 1;
+
+ /* read the read-filter column and adjust the sam-flags value to reflect the presense
+ of the flag SRA_READ_FILTER_REJECT, if it is there switch 0x200 on, of not switch 0x200 off */
+ rc = read_INSDC_read_filter_ptr( id, cursor, atx->cmn.read_filter_idx, &read_filter, &read_filter_len, "RD_FILTER" );
+ if ( rc == 0 && read_filter_len > 0 )
+ {
+ if ( ( read_filter[ 0 ] & READ_FILTER_REJECT ) == READ_FILTER_REJECT )
+ sam_flags |= 0x200;
+ else
+ sam_flags &= ~0x200;
+
+ if ( ( read_filter[ 0 ] & READ_FILTER_CRITERIA ) == READ_FILTER_CRITERIA )
+ sam_flags |= 0x400;
+ else
+ sam_flags &= ~0x400;
+ }
+ }
+ else
+ {
+ /* we did not find it in the the sam-ref-matecache */
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcItem, rcNotFound );
+ }
+ }
+ else
+ {
+ rc = RC( rcApp, rcNoTarg, rcAccessing, rcItem, rcNotFound );
+ }
+ }
+
+ if ( ( mate_align_id != 0 && GetRCState( rc ) == rcNotFound )||( mate_align_id == 0 ) )
+ {
+ /* no cache entry-found OR do not use mate-cache
+ ---> that means we have to read it from the table... */
+
+ rc = read_char_ptr( id, cursor, atx->mate_ref_name_idx, &mate_ref_name, &mate_ref_name_len, "MATE_REF_NAME" );
+ if ( rc == 0 )
+ rc = read_INSDC_coord_zero( id, cursor, atx->mate_ref_pos_idx, &mate_ref_pos, 0, "MATE_REF_POS" );
+ if ( rc == 0 )
+ rc = read_INSDC_coord_len( id, cursor, atx->tlen_idx, &tlen, 0, "TLEN" );
+ if ( rc == 0 )
+ rc = read_uint32( id, cursor, atx->sam_flags_idx, &sam_flags, 0, "SAM_FLAGS" );
+
+ if ( rc == 0 )
+ {
+ int32_t cmp = -1;
+ if ( mate_ref_name_len > 0 )
+ {
+ size_t ref_name_len = string_size( ref_name );
+ size_t cmp_len = ( mate_ref_name_len > ref_name_len ? mate_ref_name_len : ref_name_len );
+ cmp = string_cmp( mate_ref_name, mate_ref_name_len, ref_name, ref_name_len, cmp_len );
+ if ( cmp == 0 )
+ {
+ mate_ref_name = equal_sign;
+ mate_ref_name_len = 1;
+ }
+ }
+
+ if ( opts->use_mate_cache )
+ {
+ if ( mate_align_id != 0 && mate_ref_name_len > 0 && cmp == 0 )
+ {
+ /* now that we have the data, store it in sam-ref-cache it the mate is on the same ref. */
+ uint32_t mate_flags = calc_mate_flags( sam_flags );
+ rc = matecache_insert_same_ref( mc, atx->db_idx, id, pos, mate_flags, -tlen );
+ }
+
+ if ( mate_align_id == 0 && mate_ref_name_len == 0 && opts->print_half_unaligned_reads &&
+ atx->align_table_type == att_primary )
+ {
+ int64_t key = id;
+ rc = matecache_insert_unaligned( mc, atx->db_idx, key, pos, atx->ref_idx, *seq_spot_id );
+ }
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 && opts->use_matepair_filter && !filter_by_matepair_dist( opts, tlen ) )
+ return 0;
+
+ /* SAM-FIELD: QNAME SRA-column: SEQ_SPOT_ID ( int64 ) */
+ if ( rc == 0 )
+ {
+ if ( seq_spot_id_len > 0 )
+ {
+ if ( opts->print_spot_group_in_name | opts->print_cg_names )
+ {
+ const char * spot_group;
+ uint32_t spot_group_len;
+ rc = read_char_ptr( id, cursor, atx->cmn.seq_spot_group_idx, &spot_group, &spot_group_len, "SPOT_GROUP" );
+ if ( rc == 0 )
+ rc = dump_name( opts, *seq_spot_id, spot_group, spot_group_len ); /* sam-dump-opts.c */
+ }
+ else
+ rc = dump_name( opts, *seq_spot_id, NULL, 0 ); /* sam-dump-opts.c */
+ }
+ else
+ rc = KOutMsg( "*" );
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\t" );
+
+ /* massage the sam-flag if we are not dumping unaligned reads... */
+ if ( !opts->dump_unaligned_reads /** not going to dump unaligned **/
+ && ( sam_flags & 0x1 ) /** but we have sequenced multiple fragments **/
+ && ( sam_flags & 0x8 ) ) /** and not all of them align **/
+ /*** remove flags talking about multiple reads **/
+ /* turn off 0x001 0x008 0x040 0x080 */
+ sam_flags &= ~0xC9;
+
+ /* SAM-FIELD: FLAG SRA-column: SAM_FLAGS ( uint32 ) */
+ /* SAM-FIELD: RNAME SRA-column: REF_NAME / REF_SEQ_ID ( char * ) */
+ /* SAM-FIELD: POS SRA-column: REF_POS + 1 */
+ /* SAM-FIELD: MAPQ SRA-column: MAPQ */
+ if ( rc == 0 )
+ rc = KOutMsg( "%u\t%s\t%u\t%d\t", sam_flags, ref_name, pos + 1, rec->mapq );
+
+ /* get READ, QUALITY and EIDT_DIST before cigar manipulation because we need/change these values */
+ if ( rc == 0 )
+ rc = get_READ_QUALITY_EDIT_DIST( &cgc_output, id, &atx->cmn );
+
+ /* SAM-FIELD: CIGAR SRA-column: CIGAR_SHORT / with or without treatment */
+ if ( rc == 0 )
+ {
+ cg_cigar_input cgc_input;
+ char * temp_cigar = NULL;
+ static char const *bogus_quality = "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
+
+ rc = read_char_ptr( id, cursor, atx->cmn.cigar_idx, &cgc_input.p_cigar.ptr, &cgc_input.p_cigar.len, "CIGAR" );
+ if ( rc == 0 )
+ {
+ if ( cgc_output.p_quality.len == 0 )
+ {
+ cgc_output.p_quality.ptr = bogus_quality;
+ cgc_output.p_quality.len = 35;
+ }
+ rc = cg_cigar_treatments( opts->cigar_treatment, &cgc_input, &cgc_output, id, &atx->cmn );
+ }
+
+ if ( opts->rna_splicing )
+ {
+ { /*** reset previous identification of N to D ***/
+ int i;
+ char *c = ( char * )cgc_output.p_cigar.ptr;
+ for( i = 0; i < cgc_output.p_cigar.len; i++ )
+ {
+ if ( c[ i ] == 'N' ) c[ i ] = 'D';
+ }
+ }
+
+ /* discover which cigar-operations could be a RNA-splice ( it is a D-operation with min length of 10 ) */
+ rc = discover_rna_splicing_candidates( cgc_output.p_cigar.len, cgc_output.p_cigar.ptr, 10, &candidates ); /* cg_tools.c */
+ if ( rc == 0 && candidates.count > 0 )
+ {
+ /* we discover by comparing against the reference if a candidate is a RNA-splice and if it is forward or reverse */
+ rc = check_rna_splicing_candidates_against_ref( rec->ref, opts->rna_splice_level, pos, &candidates ); /* cg_tools.c */
+ if ( rc == 0 && ( candidates.fwd_matched > 0 || candidates.rev_matched > 0 ) )
+ {
+ /* set the warning-flag that we have an alignment with not homogeneous RNA-splices */
+ if ( candidates.fwd_matched > 0 && candidates.rev_matched > 0 )
+ rna_not_homogeneous_flag = true;
+
+ temp_cigar = malloc( cgc_output.p_cigar.len + 1 ); /* temp_cigar will be released at the end of this block */
+ if ( temp_cigar != NULL )
+ {
+ /* create a new cigarstring by applying the candidates to the cigar-string */
+ rc = change_rna_splicing_cigar( cgc_output.p_cigar.len, temp_cigar, &candidates, &NM_adjustments ); /* cg_tools.c */
+ if ( rc == 0 )
+ cgc_output.p_cigar.ptr = temp_cigar;
+ }
+ }
+
+ /* rna-splice-log */
+ if ( opts->rna_splice_log != NULL )
+ {
+ /* record all the candidates... */
+ uint32_t c_idx;
+ for ( c_idx = 0; c_idx < candidates.count; c_idx++ )
+ {
+ rna_splice_candidate * candidate = &( candidates.candidates[ c_idx ] );
+ splice_dict_entry entry;
+ uint32_t intron_pos = pos + candidate->ref_offset;
+ if ( rna_splice_dict_get( splice_dict, intron_pos, candidate->len, &entry ) )
+ {
+ entry.count += 1;
+ rna_splice_dict_set( splice_dict, intron_pos, candidate->len, &entry );
+ }
+ else
+ {
+ entry.count = 1;
+ entry.intron_type = candidate->matched;
+ rna_splice_dict_set( splice_dict, intron_pos, candidate->len, &entry );
+ }
+ }
+ }
+
+ }
+ if ( candidates.cigops != NULL )
+ free( ( void * ) candidates.cigops );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "%.*s\t", cgc_output.p_cigar.len, cgc_output.p_cigar.ptr );
+
+ if ( temp_cigar != NULL )
+ free( temp_cigar );
+ }
+
+ /* SAM-FIELD: RNEXT SRA-column: MATE_REF_NAME ( !!! row_len can be zero !!! ) */
+ /* SAM-FIELD: PNEXT SRA-column: MATE_REF_POS + 1 ( !!! row_len can be zero !!! ) */
+ /* SAM-FIELD: TLEN SRA-column: TEMPLATE_LEN ( !!! row_len can be zero !!! ) */
+ if ( rc == 0 )
+ {
+ if ( mate_ref_name_len > 0 )
+ {
+ rc = KOutMsg( "%.*s\t%u\t%d\t", mate_ref_name_len, mate_ref_name, mate_ref_pos + 1, tlen );
+ }
+ else
+ {
+ if ( mate_ref_pos_len == 0 )
+ rc = KOutMsg( "*\t0\t%d\t", tlen );
+ else
+ rc = KOutMsg( "*\t%u\t%d\t", mate_ref_pos, tlen );
+ }
+ }
+
+ /* SAM-FIELD: SEQ SRA-column: READ */
+ if ( rc == 0 )
+ rc = KOutMsg( "%.*s\t", cgc_output.p_read.len, cgc_output.p_read.ptr );
+
+ /* SAM-FIELD: QUAL SRA-column: SAM_QUALITY */
+ if ( rc == 0 )
+ rc = print_quality_or_star( opts, cgc_output.p_quality.ptr, cgc_output.p_quality.len, cgc_output.p_read.len ); /* above */
+
+ /* OPT SAM-FIELD: RG SRA-column: SPOT_GROUP */
+ if ( rc == 0 && ( atx->cmn.seq_spot_group_idx != COL_NOT_AVAILABLE ) )
+ rc = opt_field_spot_group( cursor, atx->cmn.seq_spot_group_idx, id );
+
+ /* OPT SAM-FIELD: BZ SRA-column: LINKAGE_GROUP */
+ if ( rc == 0 && ( atx->lnk_group_idx != COL_NOT_AVAILABLE ) )
+ rc = opt_field_lnk_group( cursor, atx->lnk_group_idx, id );
+
+ if ( rc == 0 && cgc_output.p_tags.len > 0 )
+ rc = KOutMsg( "\t%.*s", cgc_output.p_tags.len, cgc_output.p_tags.ptr );
+
+ /* OPT SAM-FIELD: XI SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", id );
+
+ /* to match sam-tools output: in case we are dumping this in CG-mode.... */
+ if ( rc == 0 && ( opts->cigar_treatment != ct_unchanged ) && ( atx->al_group_idx != COL_NOT_AVAILABLE ) )
+ {
+ const char * align_grp;
+ uint32_t align_grp_len;
+ rc = read_char_ptr( id, cursor, atx->al_group_idx, &align_grp, &align_grp_len, "ALIGN_GROUP" );
+ if ( rc == 0 && align_grp_len > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; rc == 0 && i < align_grp_len - 1; ++i )
+ {
+ if ( align_grp[ i ] == '_' )
+ {
+ rc = KOutMsg( "\tZI:i:%.*s\tZA:i:%.1s", i, align_grp, align_grp + i + 1 );
+ break;
+ }
+ }
+ }
+ }
+
+ /* OPT SAM-FIELD: NH SRA-column: ALIGNMENT_COUNT */
+ if ( rc == 0 && atx->cmn.al_count_idx != COL_NOT_AVAILABLE )
+ {
+ const uint8_t * al_count;
+ uint32_t al_count_len;
+ rc = read_uint8_ptr( id, cursor, atx->cmn.al_count_idx, &al_count, &al_count_len, "ALIGNMENT_COUNT" );
+ if ( rc == 0 && al_count_len > 0 )
+ rc = KOutMsg( "\tNH:i:%u", *al_count );
+ }
+
+ /* OPT SAM-FIELD: NM SRA-column: EDIT_DISTANCE */
+ if ( rc == 0 )
+ rc = KOutMsg( "\tNM:i:%u", ( cgc_output.edit_dist - NM_adjustments ) );
+
+ /* OPT SAM-FIELD: XS:A:+/- SRA-column: RNA-SPLICING detected via computation, or from the RNA_ORIENTATION - column */
+ if ( rc == 0 )
+ {
+ if ( opts->rna_splicing )
+ {
+ /* analysis of rna-splicing explicitly requested at the commandline */
+ if ( candidates.fwd_matched > 0 || candidates.rev_matched > 0 )
+ {
+ if ( candidates.fwd_matched > 0 )
+ rc = KOutMsg( "\tXS:A:+" );
+ else
+ rc = KOutMsg( "\tXS:A:-" );
+ }
+ }
+ else
+ {
+ /* have a look if we have a RNA_ORIENTATION - column available */
+ if ( atx->rna_orientation_idx != COL_NOT_AVAILABLE )
+ {
+ const char * rna_orientation;
+ uint32_t rna_orientation_len;
+ rc = read_char_ptr( id, cursor, atx->rna_orientation_idx,
+ &rna_orientation, &rna_orientation_len, "RNA_ORIENTATION" );
+ if ( rc == 0 && rna_orientation_len > 0 )
+ {
+ rc = KOutMsg( "\tXS:A:%c", rna_orientation[ 0 ] );
+ }
+ }
+ }
+ }
+
+ /* OPT SAM_FIELD: MD reports Mismatches and Deletions */
+ if ( rc == 0 && opts->with_md_flag )
+ {
+ uint8_t * alig_ref = malloc( rec->len );
+ if ( alig_ref == NULL )
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+ else
+ {
+ INSDC_coord_len ref_len;
+ rc = ReferenceObj_Read( rec->ref, pos, rec->len, alig_ref, &ref_len );
+ if ( rc == 0 )
+ {
+ rc = kout_md_tag_from_cigar_string( cgc_output.p_cigar.ptr, cgc_output.p_cigar.len, /* cigar */
+ cgc_output.p_read.ptr, cgc_output.p_read.len, /* read */
+ alig_ref, ref_len ); /* reference */
+ }
+ free( alig_ref );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ /* print a log-info if have to because RNA-splicing is requested and we have not homogeneous bits */
+ if ( rna_not_homogeneous_flag )
+ {
+ KLogLevel tmp_lvl = KLogLevelGet();
+ KLogLevelSet( klogInfo );
+
+ (void)PLOGMSG( klogInfo, ( klogInfo, "not homogeneous RNA-splices found in alignment #$(an) at $(ref).$(pos)",
+ "an=%lu,ref=%s,pos=%u", id, ref_name, pos ) );
+
+ KLogLevelSet( tmp_lvl );
+ }
+
+ return rc;
+}
+
+
+static rc_t print_alignment_fastx( const samdump_opts * const opts,
+ const char * ref_name,
+ INSDC_coord_zero pos,
+ matecache * const mc,
+ const PlacementRecord * const rec,
+ const align_table_context * const atx )
+{
+ bool orientation;
+ const VCursor *cursor = atx->cmn.cursor;
+ int64_t mate_align_id;
+ const int64_t * seq_spot_id;
+ uint32_t seq_spot_id_len;
+
+ rc_t rc = read_int64_ptr( rec->id, cursor, atx->cmn.seq_spot_id_idx, &seq_spot_id, &seq_spot_id_len, "SEQ_SPOT_ID" );
+
+ /* this is here to detect if the mate is aligned, if NOT, we want to put it into the unaligned-cache! */
+ if ( rc == 0 && opts->print_half_unaligned_reads )
+ {
+ rc = read_int64( rec->id, cursor, atx->mate_align_id_idx, &mate_align_id, 0, "MATE_ALIGN_ID" );
+ if ( rc == 0 && mate_align_id == 0 && mc != NULL && opts->use_mate_cache )
+ {
+ rc = matecache_insert_unaligned( mc, atx->db_idx, rec->id, pos, atx->ref_idx, *seq_spot_id );
+ }
+ }
+
+ if ( opts->output_format == of_fastq )
+ rc = KOutMsg( "@" );
+ else
+ rc = KOutMsg( ">" );
+
+ /* SAM-FIELD: QNAME 1.row: name */
+ if ( rc == 0 )
+ {
+ if ( seq_spot_id_len > 0 )
+ {
+ if ( opts->print_spot_group_in_name )
+ {
+ const char * spot_grp;
+ uint32_t spot_grp_len;
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.seq_spot_group_idx, &spot_grp, &spot_grp_len, "SEQ_SPOT_GROUP" );
+ if ( rc == 0 )
+ rc = dump_name( opts, *seq_spot_id, spot_grp, spot_grp_len ); /* sam-dump-opts.c */
+ }
+ else
+ rc = dump_name( opts, *seq_spot_id, NULL, 0 ); /* sam-dump-opts.c */
+ }
+ else
+ rc = KOutMsg( "*" );
+
+ if ( rc == 0 )
+ {
+ uint32_t seq_read_id;
+ rc = read_uint32( rec->id, cursor, atx->cmn.seq_read_id_idx, &seq_read_id, 0, "SEQ_READ_ID" );
+ if ( rc == 0 )
+ rc = KOutMsg( "/%u", seq_read_id );
+ }
+ }
+
+ /* SRA-column: REF_ORIENTATION ( bool ) ... needed for quality */
+ if ( rc == 0 )
+ rc = read_bool( rec->id, cursor, atx->cmn.ref_orientation_idx, &orientation, false, "REF_ORIENT" );
+
+ /* source of the alignment: primary/secondary/evidence */
+ if ( rc == 0 )
+ {
+ switch( atx->align_table_type )
+ {
+ case att_primary : rc = KOutMsg( " primary" ); break;
+ case att_secondary : rc = KOutMsg( " secondary" ); break;
+ case att_evidence : rc = KOutMsg( " evidence" ); break;
+ }
+ }
+
+ /* against what reference aligned, at what position, with what mapping-quality */
+ if ( rc == 0 )
+ rc = KOutMsg( " ref=%s pos=%u mapq=%i\n", ref_name, pos + 1, rec->mapq );
+
+ /* READ at a new line */
+ if ( rc == 0 )
+ {
+ const char * read;
+ uint32_t read_size;
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.raw_read_idx, &read, &read_size, "RAW_READ" );
+ if ( rc == 0 )
+ {
+ if ( read_size > 0 )
+ rc = KOutMsg( "%.*s\n", read_size, read );
+ else
+ rc = KOutMsg( "*\n" );
+ }
+ }
+
+ /* QUALITY on a new line if in fastq-mode */
+ if ( rc == 0 && opts->output_format == of_fastq )
+ {
+ rc = KOutMsg( "+\n" );
+ if ( rc == 0 )
+ {
+ const char * quality;
+ uint32_t quality_size;
+ rc = read_char_ptr( rec->id, cursor, atx->cmn.sam_quality_idx, &quality, &quality_size, "SAM_QUALITY" );
+ if ( rc == 0 )
+ {
+ if ( quality_size > 0 )
+ rc = dump_quality_33( opts, quality, quality_size, false );
+ else
+ rc = KOutMsg( "*" );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+
+ return rc;
+}
+
+
+/* print one record of alignment-information in SAM-format */
+static rc_t walk_position( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ const char * ref_name,
+ INSDC_coord_zero pos,
+ matecache * const mc,
+ struct rna_splice_dict * splice_dict,
+ INSDC_coord_zero first_pos,
+ INSDC_coord_len len )
+{
+ rc_t rc = 0;
+ while ( rc == 0 )
+ {
+ rc = Quitting ();
+ if ( rc == 0 )
+ {
+ const PlacementRecord *rec;
+ rc = PlacementSetIteratorNextRecordAt( set_iter, pos, &rec );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "PlacementSetIteratorNextRecordAt() failed" );
+ }
+ }
+ else
+ {
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_line( opts->perf_log, pos );
+#endif
+
+ /* We have to do this here, becasue the nature of the iterator is to return all alignments that
+ touch ( stick into ) the requested interval. But: sam-dump has to dump alignments that
+ !! start !! in the requested interval. */
+ if ( pos >= first_pos )
+ {
+ align_table_context * atx = PlacementRecord_get_ext_data_ptr( rec, placementRecordExtension0 );
+ if ( atx == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcParam, rcNull );
+ LOGERR( klogInt, rc, "no placement-record-context available" );
+ }
+ else
+ {
+ if ( opts->output_format == of_sam )
+ {
+ if ( atx->align_table_type == att_evidence )
+ rc = print_alignment_sam_ev( opts, ref_name, pos, rec, atx );
+ else
+ rc = print_alignment_sam_ps( opts, ref_name, pos, mc, splice_dict, rec, atx );
+ }
+ else
+ rc = print_alignment_fastx( opts, ref_name, pos, mc, rec, atx );
+ }
+ }
+ PlacementRecordWhack ( rec );
+
+
+ }
+ }
+ }
+ if ( GetRCState( rc ) == rcDone ) rc = 0;
+ return rc;
+}
+
+
+static rc_t walk_window( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ const char * ref_name,
+ matecache * const mc,
+ struct rna_splice_dict * splice_dict,
+ INSDC_coord_zero first_pos,
+ INSDC_coord_len len )
+{
+ rc_t rc = 0;
+ while ( rc == 0 )
+ {
+ rc = Quitting ();
+ if ( rc == 0 )
+ {
+ INSDC_coord_zero pos;
+ rc = PlacementSetIteratorNextAvailPos( set_iter, &pos, NULL );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "PlacementSetIteratorNextAvailPos() failed" );
+ }
+ }
+ else
+ {
+ rc = walk_position( opts, set_iter, ref_name, pos, mc, splice_dict, first_pos, len );
+ }
+ }
+ }
+ if ( GetRCState( rc ) == rcDone ) rc = 0;
+ return rc;
+}
+
+
+static rc_t walk_reference( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ struct ReferenceObj const * ref_obj,
+ const char * ref_name,
+ matecache * const mc )
+{
+ rc_t rc = 0;
+ struct rna_splice_dict * splice_dict = NULL;
+
+ if ( opts->rna_splicing )
+ {
+ splice_dict = make_rna_splice_dict();
+ /* rna-splice-log */
+ if ( opts->rna_splice_log != NULL )
+ rna_splice_log_enter_ref( opts->rna_splice_log, ref_name, ref_obj );
+ }
+
+ while ( rc == 0 )
+ {
+ rc = Quitting ();
+ if ( rc == 0 )
+ {
+ INSDC_coord_zero first_pos;
+ INSDC_coord_len len;
+ rc = PlacementSetIteratorNextWindow( set_iter, &first_pos, &len );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "PlacementSetIteratorNextWindow() failed" );
+ }
+ }
+ else
+ rc = walk_window( opts, set_iter, ref_name, mc, splice_dict, first_pos, len );
+ }
+ }
+ if ( GetRCState( rc ) == rcDone ) rc = 0;
+
+ if ( rc == 0 && mc != NULL && opts->use_mate_cache )
+ rc = matecache_clear_same_ref( mc );
+
+ if ( splice_dict != NULL )
+ {
+ /* rna-splice-log */
+ if ( opts->rna_splice_log != NULL )
+ rna_splice_log_exit_ref( opts->rna_splice_log, splice_dict );
+ free_rna_splice_dict( splice_dict );
+ }
+
+ return rc;
+}
+
+
+static rc_t walk_placements( const samdump_opts * const opts,
+ PlacementSetIterator * const set_iter,
+ matecache * const mc )
+{
+ rc_t rc = 0;
+ while ( rc == 0 )
+ {
+ struct ReferenceObj const * ref_obj;
+
+ rc = PlacementSetIteratorNextReference( set_iter, NULL, NULL, &ref_obj );
+ if ( rc == 0 )
+ {
+ if ( ref_obj != NULL )
+ {
+ const char * ref_name = NULL;
+ if ( opts->use_seqid_as_refname )
+ rc = ReferenceObj_SeqId( ref_obj, &ref_name );
+ else
+ rc = ReferenceObj_Name( ref_obj, &ref_name );
+
+ if ( rc == 0 )
+ {
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_start_sub_section( opts->perf_log, ref_name );
+#endif
+
+ rc = walk_reference( opts, set_iter, ref_obj, ref_name, mc );
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_end_sub_section( opts->perf_log );
+#endif
+ }
+ else
+ {
+ if ( opts->use_seqid_as_refname )
+ {
+ (void)LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
+ }
+ else
+ {
+ (void)LOGERR( klogInt, rc, "ReferenceObj_Name() failed" );
+ }
+ }
+ }
+ }
+ else if ( GetRCState( rc ) != rcDone )
+ {
+ (void)LOGERR( klogInt, rc, "ReferenceIteratorNextReference() failed" );
+ }
+ }
+
+ if ( GetRCState( rc ) == rcDone )
+ rc = 0;
+ return rc;
+}
+
+
+
+static void CC destroy_align_table_context( void *item, void *data )
+{
+ align_table_context * atx = item;
+ free_align_table_context( atx );
+}
+
+
+static rc_t print_all_aligned_spots_of_this_reference( const samdump_opts * const opts,
+ const input_database * const ids,
+ matecache * const mc,
+ const AlignMgr * const a_mgr,
+ const ReferenceObj * const ref_obj )
+{
+ PlacementSetIterator * set_iter;
+ /* the we ask the alignment-manager to produce a placement-set-iterator... */
+ rc_t rc = AlignMgrMakePlacementSetIterator( a_mgr, &set_iter );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create PlacementSetIterator" );
+ }
+ else
+ {
+ /* here we need a vector to passed along into the creation of the iterators */
+ Vector context_list;
+ INSDC_coord_len ref_len;
+
+ VectorInit ( &context_list, 0, 5 );
+
+ rc = ReferenceObj_SeqLength( ref_obj, &ref_len );
+ if ( rc == 0 )
+ {
+ rc = add_pl_iters( opts, set_iter, ref_obj, ids,
+ 0, /* where it starts on the reference */
+ ref_len, /* the whole length of this reference/chromosome */
+ NULL, /* no spotgroup re-grouping (yet) */
+ &context_list
+ );
+ if ( rc == 0 )
+ rc = walk_placements( opts, set_iter, mc );
+ }
+
+ /* walk the context_list to free the align_table_context records, close/free the cursors... */
+ VectorWhack ( &context_list, destroy_align_table_context, NULL );
+ PlacementSetIteratorRelease( set_iter );
+ }
+ return rc;
+}
+
+
+/*
+ the user did not specify regions, print all alignments from all input-files
+ this is strategy #1 to do this, create a ref_iter for every reference each
+ + ... less cursors will be open at the same time, more resource efficient
+ - ... if more than one input-file, the output will be sorted only within each reference
+*/
+static rc_t print_all_aligned_spots_0( const samdump_opts * const opts,
+ const input_files * const ifs,
+ matecache * const mc,
+ const AlignMgr * const a_mgr )
+{
+ rc_t rc = 0;
+ uint32_t db_idx;
+ /* we now loop through all input-databases... */
+ for ( db_idx = 0; db_idx < ifs->database_count && rc == 0; ++db_idx )
+ {
+ const input_database * ids = VectorGet( &ifs->dbs, db_idx );
+ if ( ids != NULL )
+ {
+ uint32_t refobj_count;
+ rc = ReferenceList_Count( ids->reflist, &refobj_count );
+ if ( rc == 0 && refobj_count > 0 )
+ {
+ uint32_t ref_idx;
+ for ( ref_idx = 0; ref_idx < refobj_count && rc == 0; ++ref_idx )
+ {
+ const ReferenceObj * ref_obj;
+ rc = ReferenceList_Get( ids->reflist, &ref_obj, ref_idx );
+ if ( rc == 0 && ref_obj != NULL )
+ {
+ rc = print_all_aligned_spots_of_this_reference( opts, ids, mc, a_mgr, ref_obj );
+ ReferenceObj_Release( ref_obj );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+/*
+ the user did not specify regions, print all alignments from all input-files
+ this is strategy #2 to do this, throw all iterators for all input-files and all there references
+ into one set_iter.
+ + ... if more than one input-file, everything will be sorted
+ - ... creates a large number of open cursors ( because of sub-cursors due to schema-functions )
+ this can result in not beeing able to perform the functions at all because of running out of resources
+ - ... a long delay at start up, before the 1st alignment is printed ( all the cursors have to be opened )
+*/
+static rc_t print_all_aligned_spots_1( const samdump_opts * const opts,
+ const input_files * const ifs,
+ matecache * const mc,
+ const AlignMgr * const a_mgr )
+{
+ PlacementSetIterator * set_iter;
+ /* the we ask the alignment-manager to produce a placement-set-iterator... */
+ rc_t rc = AlignMgrMakePlacementSetIterator( a_mgr, &set_iter );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create PlacementSetIterator" );
+ }
+ else
+ {
+ /* here we need a vector to passed along into the creation of the iterators */
+ Vector context_list;
+ VectorInit ( &context_list, 0, 5 );
+
+ rc = prepare_whole_files( opts, ifs, set_iter, &context_list );
+
+ if ( rc == 0 )
+ rc = walk_placements( opts, set_iter, mc );
+
+ /* walk the context_list to free the align_table_context records, close/free the cursors... */
+ VectorWhack ( &context_list, destroy_align_table_context, NULL );
+ PlacementSetIteratorRelease( set_iter );
+ }
+ return rc;
+}
+
+
+/*
+ the user has specified certain regions on the references,
+ print only alignments, that start in these regions
+*/
+static rc_t print_selected_aligned_spots( const samdump_opts * const opts,
+ const input_files * const ifs,
+ matecache * const mc,
+ const AlignMgr * const a_mgr )
+{
+ PlacementSetIterator * set_iter;
+ /* the we ask the alignment-manager to produce a placement-set-iterator... */
+ rc_t rc = AlignMgrMakePlacementSetIterator( a_mgr, &set_iter );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create PlacementSetIterator" );
+ }
+ else
+ {
+ /* here we need a vector to passed along into the creation of the iterators */
+ Vector context_list;
+ VectorInit ( &context_list, 0, 5 );
+
+ rc = prepare_regions( opts, ifs, set_iter, &context_list );
+
+ if ( rc == 0 )
+ rc = walk_placements( opts, set_iter, mc );
+
+ /* walk the context_list to free the align_table_context records, close/free the cursors... */
+ VectorWhack ( &context_list, destroy_align_table_context, NULL );
+
+ PlacementSetIteratorRelease( set_iter );
+ }
+ return rc;
+}
+
+
+/*
+ this is called from sam-dump3.c, it prepares the iterators and then walks them
+ ---> only entry into this module <---
+*/
+rc_t print_aligned_spots( const samdump_opts * const opts,
+ const input_files * const ifs,
+ matecache * const mc )
+{
+ rc_t rc;
+ const AlignMgr * a_mgr;
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_start_section( opts->perf_log, "aligned spots" );
+#endif
+
+ /* first we make an alignment-manager */
+ rc = AlignMgrMakeRead( &a_mgr );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create alignment-manager" );
+ }
+ else
+ {
+ if ( opts->region_count == 0 )
+ {
+ /* the user did not specify regions to be printed ==> print all alignments */
+ switch( opts->dump_mode )
+ {
+ case dm_one_ref_at_a_time : rc = print_all_aligned_spots_0( opts, ifs, mc, a_mgr ); break;
+ case dm_prepare_all_refs : rc = print_all_aligned_spots_1( opts, ifs, mc, a_mgr ); break;
+ }
+ }
+ else
+ {
+ /* the user did specify regions to be printed ==> print only the alignments in these regions */
+ rc = print_selected_aligned_spots( opts, ifs, mc, a_mgr );
+ }
+ AlignMgrRelease( a_mgr );
+ }
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_end_section( opts->perf_log );
+#endif
+
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-aligned.h b/tools/sra-pileup/sam-aligned.h
new file mode 100644
index 0000000..0ef4204
--- /dev/null
+++ b/tools/sra-pileup/sam-aligned.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sam_aligned_
+#define _h_sam_aligned_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+#include "matecache.h"
+
+#define COL_READ "(INSDC:dna:text)READ"
+
+rc_t print_aligned_spots( const samdump_opts * const opts,
+ const input_files * const ifs,
+ matecache * const mc );
+
+#endif
diff --git a/tools/sra-pileup/sam-dump-opts.c b/tools/sra-pileup/sam-dump-opts.c
new file mode 100644
index 0000000..24e262c
--- /dev/null
+++ b/tools/sra-pileup/sam-dump-opts.c
@@ -0,0 +1,1676 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#include "sam-dump-opts.h"
+#include "perf_log.h"
+
+#include <klib/time.h>
+#include <align/quality-quantizer.h>
+#include <sysalloc.h>
+
+#define CURSOR_CACHE_SIZE 256*1024*1024
+
+/* =========================================================================================== */
+
+
+int cmp_pchar( const char * a, const char * b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+
+/* =========================================================================================== */
+
+
+static range * make_range( const uint64_t start, const uint64_t end )
+{
+ range *res = calloc( sizeof *res, 1 );
+ if ( res != NULL )
+ {
+ res->start = start;
+ res->end = end;
+ }
+ return res;
+}
+
+
+static int64_t cmp_range( const range * a, const range * b )
+{
+ if ( a->start < b->start )
+ return -1;
+ else if ( a->start > b->start )
+ return 1;
+ else if ( a->end < b->end )
+ return -1;
+ else if ( a->end > b->end )
+ return 1;
+ else
+ return 0;
+}
+
+
+static bool range_overlapp( const range * a, const range * b )
+{
+ return ( !( ( b->end < a->start ) || ( b->start > a->end ) ) );
+}
+
+
+/* =========================================================================================== */
+
+
+static reference_region * make_reference_region( const char *name )
+{
+ reference_region *res = calloc( sizeof *res, 1 );
+ if ( res != NULL )
+ {
+ res->name = string_dup_measure ( name, NULL );
+ if ( res->name == NULL )
+ {
+ free( res );
+ res = NULL;
+ }
+ else
+ VectorInit ( &res->ranges, 0, 5 );
+ }
+ return res;
+}
+
+
+static int64_t CC cmp_range_wrapper( const void *item, const void *n )
+{ return cmp_range( item, n ); }
+
+
+static rc_t add_ref_region_range( reference_region * self, const uint64_t start, const uint64_t end )
+{
+ rc_t rc = 0;
+ range *r = make_range( start, end );
+ if ( r == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ rc = VectorInsert ( &self->ranges, r, NULL, cmp_range_wrapper );
+ if ( rc != 0 )
+ free( r );
+ }
+ return rc;
+}
+
+
+#define RR_NAME 1
+#define RR_START 2
+#define RR_END 3
+
+
+static void put_c( char *s, size_t size, size_t *dst, char c )
+{
+ if ( *dst < ( size - 1 ) )
+ s[ *dst ] = c;
+ (*dst)++;
+}
+
+static void finish_txt( char *s, size_t size, size_t *dst )
+{
+ if ( *dst > size )
+ s[ size - 1 ] = 0;
+ else
+ s[ *dst ] = 0;
+ *dst = 0;
+}
+
+static uint64_t finish_num( char *s, size_t size, size_t *dst )
+{
+ uint64_t res = 0;
+ char *endp;
+ finish_txt( s, size, dst );
+ res = strtou64( s, &endp, 10 );
+ return res;
+}
+
+
+/* s = refname:1000-2000 */
+static void parse_definition( const char *s, char * name, size_t len,
+ uint64_t *start, uint64_t *end )
+{
+ size_t n = string_size( s );
+
+ *start = 0;
+ *end = 0;
+ name[ 0 ] = 0;
+ if ( n > 0 )
+ {
+ size_t i, st, dst = 0;
+ char tmp[ 32 ];
+ st = RR_NAME;
+ for ( i = 0; i < n; ++i )
+ {
+ char c = s[ i ];
+ switch( st )
+ {
+ case RR_NAME : if ( c == ':' )
+ {
+ finish_txt( name, len, &dst );
+ st = RR_START;
+ }
+ else
+ {
+ put_c( name, len, &dst, c );
+ }
+ break;
+
+ case RR_START : if ( c == '-' )
+ {
+ *start = finish_num( tmp, sizeof tmp, &dst );
+ st = RR_END;
+ }
+ else if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+
+ case RR_END : if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+ }
+ }
+ switch( st )
+ {
+ case RR_NAME : finish_txt( name, len, &dst );
+ break;
+
+ case RR_START : *start = finish_num( tmp, sizeof tmp, &dst );
+ break;
+
+ case RR_END : *end = finish_num( tmp, sizeof tmp, &dst );
+ break;
+ }
+ }
+}
+
+
+static void CC release_range_wrapper( void * item, void * data )
+{
+ free( item );
+}
+
+
+static void free_reference_region( reference_region * self )
+{
+ free( (void*)self->name );
+ VectorWhack ( &self->ranges, release_range_wrapper, NULL );
+ free( self );
+}
+
+
+static void check_ref_region_ranges( reference_region * self )
+{
+ uint32_t n = VectorLength( &self->ranges );
+ uint32_t i = 0;
+ range *a = NULL;
+ while ( i < n )
+ {
+ range *b = VectorGet ( &self->ranges, i );
+ bool remove = false;
+ if ( a != NULL )
+ {
+ remove = range_overlapp( a, b );
+ if ( remove )
+ {
+ range *r;
+ a->end = b->end;
+ VectorRemove ( &self->ranges, i, (void**)&r );
+ free( r );
+ n--;
+ }
+ }
+ if ( !remove )
+ {
+ a = b;
+ ++i;
+ }
+ }
+}
+
+
+/* =========================================================================================== */
+
+
+static int64_t CC reference_vs_pchar_wrapper( const void *item, const BSTNode *n )
+{
+ const reference_region * r = ( const reference_region * )n;
+ return cmp_pchar( (const char *)item, r->name );
+}
+
+static reference_region * find_reference_region( BSTree * regions, const char * name )
+{
+ return ( reference_region * ) BSTreeFind ( regions, name, reference_vs_pchar_wrapper );
+}
+
+
+typedef struct frrl
+{
+ const char * name;
+ size_t len;
+} frrl;
+
+
+static int cmp_pchar_vs_len( const char * a, const char * b, size_t len_b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+static int64_t CC reference_vs_frr_wrapper( const void *item, const BSTNode *n )
+{
+ const reference_region * r = ( const reference_region * )n;
+ const frrl * ctx = item;
+ return cmp_pchar_vs_len( r->name, ctx->name, ctx->len );
+}
+
+static reference_region * find_reference_region_len( BSTree * regions, const char * name, size_t len )
+{
+ frrl ctx;
+ ctx.name = name;
+ ctx.len = len;
+ return ( reference_region * ) BSTreeFind ( regions, &ctx, reference_vs_frr_wrapper );
+}
+
+
+static int64_t CC ref_vs_ref_wrapper( const BSTNode *item, const BSTNode *n )
+{
+ const reference_region * a = ( const reference_region * )item;
+ const reference_region * b = ( const reference_region * )n;
+ return cmp_pchar( a->name, b->name );
+}
+
+static rc_t add_refrange( BSTree * regions, const char * name, const uint64_t start, const uint64_t end )
+{
+ rc_t rc;
+
+ reference_region * r = find_reference_region( regions, name );
+ if ( r == NULL )
+ {
+ r = make_reference_region( name );
+ if ( r == NULL )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ rc = add_ref_region_range( r, start, end );
+ if ( rc == 0 )
+ rc = BSTreeInsert ( regions, (BSTNode *)r, ref_vs_ref_wrapper );
+ if ( rc != 0 )
+ free_reference_region( r );
+ }
+ else
+ {
+ rc = add_ref_region_range( r, start, end );
+ }
+ return rc;
+}
+
+
+static rc_t parse_and_add_region( BSTree * regions, const char * s )
+{
+ rc_t rc = 0;
+ uint64_t start, end;
+ char name[ 4096 ];
+ parse_definition( s, name, sizeof name, &start, &end );
+ if ( name[ 0 ] == 0 )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ uint64_t start_0based = ( start > 0 ) ? start - 1 : 0;
+ uint64_t end_0based = ( end > 0 ) ? end - 1 : 0;
+ if ( end_0based != 0 && end_0based < start_0based )
+ {
+ uint64_t temp = end_0based;
+ end_0based = start_0based;
+ start_0based = temp;
+ }
+ rc = add_refrange( regions, name, start_0based, end_0based );
+ }
+ return rc;
+}
+
+
+static void CC check_refrange_wrapper( BSTNode *n, void *data )
+{
+ check_ref_region_ranges( ( reference_region * ) n );
+}
+
+
+static void check_ref_regions( BSTree * regions )
+{
+ BSTreeForEach ( regions, false, check_refrange_wrapper, NULL );
+}
+
+
+static void CC release_ref_region_wrapper( BSTNode *n, void * data )
+{
+ free_reference_region( ( reference_region * ) n );
+}
+
+
+static void free_ref_regions( BSTree * regions )
+{
+ BSTreeWhack ( regions, release_ref_region_wrapper, NULL );
+}
+
+
+static void CC count_ref_region_wrapper( BSTNode *n, void *data )
+{
+ reference_region * r = ( reference_region * ) n;
+ uint32_t * count = ( uint32_t * ) data;
+ *count += VectorLength( &(r->ranges) );
+}
+
+
+static uint32_t count_ref_regions( BSTree * regions )
+{
+ uint32_t res = 0;
+ BSTreeForEach ( regions, false, count_ref_region_wrapper, &res );
+ return res;
+}
+
+
+/* =========================================================================================== */
+
+
+static void CC foreach_reference_wrapper( BSTNode *n, void *data )
+{
+ reference_region * r = ( reference_region * ) n;
+ foreach_reference_func * func = ( foreach_reference_func * )data;
+
+ if ( func->rc == 0 )
+ func->rc = func->on_reference( r->name, &(r->ranges), func->data );
+}
+
+
+rc_t foreach_reference( BSTree * regions,
+ rc_t ( CC * on_reference ) ( const char * name, Vector *ranges, void *data ),
+ void *data )
+{
+ foreach_reference_func func;
+
+ func.on_reference = on_reference;
+ func.data = data;
+ func.rc = 0;
+ BSTreeForEach ( regions, false, foreach_reference_wrapper, &func );
+ return func.rc;
+}
+
+
+/* =========================================================================================== */
+
+/* s = 1000-2000 */
+static void parse_matepair_definition( const char *s, uint64_t *start, uint64_t *end )
+{
+ size_t n = string_size( s );
+ if ( n > 0 )
+ {
+ size_t i, st, dst = 0;
+ char tmp[ 32 ];
+ st = RR_START;
+ for ( i = 0; i < n; ++i )
+ {
+ char c = s[ i ];
+ switch( st )
+ {
+ case RR_START : if ( c == '-' )
+ {
+ *start = finish_num( tmp, sizeof tmp, &dst );
+ st = RR_END;
+ }
+ else if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+
+ case RR_END : if ( ( c >= '0' )&&( c <= '9' ) )
+ {
+ put_c( tmp, sizeof tmp, &dst, c );
+ }
+ break;
+ }
+ }
+ switch( st )
+ {
+ case RR_START : *start = finish_num( tmp, sizeof tmp, &dst );
+ break;
+
+ case RR_END : *end = finish_num( tmp, sizeof tmp, &dst );
+ break;
+ }
+ }
+}
+
+
+static rc_t parse_and_add_matepair_dist( Vector * dist_vector, const char * s )
+{
+ rc_t rc = 0;
+ uint64_t start = 0, end = 0;
+ range *r;
+
+ if ( cmp_pchar( s, "unknown" ) != 0 )
+ parse_matepair_definition( s, &start, &end );
+
+ r = make_range( start, end );
+ if ( r == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing matepair-distance" );
+ }
+ else
+ {
+ rc = VectorInsert ( dist_vector, r, NULL, cmp_range_wrapper );
+ if ( rc != 0 )
+ free( r );
+ }
+ return rc;
+}
+
+
+bool filter_by_matepair_dist( const samdump_opts * opts, int32_t tlen )
+{
+ bool res = false;
+
+ uint32_t count = VectorLength( &opts->mp_dist );
+ if ( count > 0 )
+ {
+ uint32_t idx, tlen_v;
+
+ res = false;
+ if ( tlen < 0 )
+ tlen_v = -(tlen);
+ else
+ tlen_v = tlen;
+
+ for ( idx = 0; idx < count && !res; ++idx )
+ {
+ range * r = VectorGet( &opts->mp_dist, idx );
+ if ( r != NULL )
+ res = ( ( tlen_v >= r->start )&&( tlen_v <= r->end ) );
+ }
+ }
+ return res;
+}
+
+/* =========================================================================================== */
+
+
+static rc_t get_bool_option( Args * args, const char * name, bool *value )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error reading comandline option '$(t)'", "t=%s", name ) );
+ }
+ else
+ {
+ *value = ( count > 0 );
+ }
+ return rc;
+}
+
+
+static rc_t gather_region_options( Args * args, samdump_opts * opts )
+{
+ uint32_t count;
+
+ rc_t rc = ArgsOptionCount( args, OPT_REGION, &count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error counting comandline option '$(t)'", "t=%s", OPT_REGION ) );
+ }
+ else if ( count > 0 )
+ {
+ uint32_t i;
+
+ BSTreeInit( &opts->regions );
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * s;
+ rc = ArgsOptionValue( args, OPT_REGION, i, (const void **)&s );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error retrieving comandline option '$(t)'", "t=%s", OPT_REGION ) );
+ }
+ else
+ rc = parse_and_add_region( &opts->regions, s );
+ }
+ if ( rc == 0 )
+ {
+ check_ref_regions( &opts->regions );
+ opts->region_count = count_ref_regions( &opts->regions );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t gather_matepair_distances( Args * args, samdump_opts * opts )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, OPT_MATE_DIST, &count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error counting comandline option '$(t)'", "t=%s", OPT_REGION ) );
+ }
+ else if ( count > 0 )
+ {
+ uint32_t i;
+
+ VectorInit( &opts->mp_dist, 0, 10 );
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * s;
+ rc = ArgsOptionValue( args, OPT_MATE_DIST, i, (const void **)&s );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error retrieving comandline option '$(t)'", "t=%s", OPT_MATE_DIST ) );
+ }
+ else
+ rc = parse_and_add_matepair_dist( &opts->mp_dist, s );
+ }
+ opts->use_matepair_filter = ( VectorLength( &opts->mp_dist ) > 0 );
+ }
+ return rc;
+}
+
+
+static rc_t gather_2_bool( Args * args, const char *name1, const char *name2, bool *b1, bool *b2 )
+{
+ rc_t rc = get_bool_option( args, name1, b1 );
+ if ( rc != 0 ) return rc;
+
+ rc = get_bool_option( args, name2, b2 );
+ if ( rc != 0 ) return rc;
+
+ if ( *b1 && *b2 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcParam, rcInvalid );
+ (void)PLOGERR( klogErr, ( klogErr, rc, "the parameters '--$(p1)' and '--$(p2)' are mutually exclusive",
+ "p1=%s,p2=%s", name1, name2 ) );
+ }
+ return rc;
+}
+
+
+static rc_t gather_flag_options( Args * args, samdump_opts * opts )
+{
+ bool dump_prim_only;
+
+ /* do we have to dump unaligned reads too? */
+ rc_t rc = get_bool_option( args, OPT_UNALIGNED, &opts->dump_unaligned_reads );
+ if ( rc != 0 ) return rc;
+
+ /* assume we have to dump primary alignments, maybe switched off later by other option */
+ opts->dump_primary_alignments = true;
+
+ /* we are dumping secondary alignments only if the user does
+ not explicitly ask for "primary only" */
+ rc = get_bool_option( args, OPT_PRIM_ONLY, &dump_prim_only );
+ if ( rc != 0 ) return rc;
+ opts->dump_secondary_alignments = !dump_prim_only;
+
+ /* check if we are asked to be in cga-tool compatible mode */
+ rc = get_bool_option( args, OPT_CG_SAM, &opts->dump_cg_sam );
+ if ( rc != 0 ) return rc;
+
+ /* check if we have to dump "EVIDENCE_INTERVAL" against the reference */
+ rc = get_bool_option( args, OPT_CG_EVIDENCE, &opts->dump_cg_evidence );
+ if ( rc != 0 ) return rc;
+
+ /* check if we have to dump "EVIDENCE_ALIGNMENT" against "EVIDENCE_INTERVAL" */
+ rc = get_bool_option( args, OPT_CG_EV_DNB, &opts->dump_cg_ev_dnb );
+ if ( rc != 0 ) return rc;
+
+ {
+ bool dump_cg_mappings;
+
+ /* look if cg-mappings is requested */
+ rc = get_bool_option( args, OPT_CG_MAPP, &dump_cg_mappings );
+ if ( rc != 0 ) return rc;
+
+ /* do some mode logic ... */
+ if ( !dump_cg_mappings &&
+ ( opts->dump_cga_tools_mode || opts->dump_cg_evidence || opts->dump_cg_ev_dnb || opts->dump_cg_sam ) )
+ {
+ opts->dump_primary_alignments = false;
+ opts->dump_secondary_alignments = false;
+ opts->dump_unaligned_reads = false;
+ }
+ else
+ {
+ opts->dump_primary_alignments = true;
+ opts->dump_secondary_alignments = !dump_prim_only;
+ /* opts->dump_unaligned_reads = ( opts->dump_unaligned_reads && opts->region_count == 0 ); */
+ }
+ }
+
+ /* do we have to print the long-version of the cigar-string? */
+ rc = get_bool_option( args, OPT_CIGAR_LONG, &opts->use_long_cigar );
+ if ( rc != 0 ) return rc;
+
+ /* print the sequence-id instead of the sequence-name */
+ rc = get_bool_option( args, OPT_USE_SEQID, &opts->use_seqid_as_refname );
+ if ( rc != 0 ) return rc;
+
+ /* print the READ where matched bases are replaced with '=' */
+ rc = get_bool_option( args, OPT_HIDE_IDENT, &opts->print_matches_as_equal_sign );
+ if ( rc != 0 ) return rc;
+
+ {
+ bool recalc_header, dont_print_header;
+
+ /* do we have to recalculate the header instead of printing the meta-data */
+ rc = get_bool_option( args, OPT_RECAL_HDR, &recalc_header );
+ if ( rc != 0 ) return rc;
+ /* should we suppress the header completely */
+ rc = get_bool_option( args, OPT_NO_HDR, &dont_print_header );
+ if ( rc != 0 ) return rc;
+ if ( dont_print_header )
+ opts->header_mode = hm_none;
+ else if ( recalc_header )
+ opts->header_mode = hm_recalc;
+ else
+ opts->header_mode = hm_dump;
+ }
+
+ {
+ bool cigar_cg, cigar_cg_merge;
+
+ /* do we have to transform cigar into cg-style ( has B/N ) */
+ /* do we have to transform cg-data(length of read/patterns in cigar) into valid SAM (cigar/READ/QUALITY) */
+ rc = gather_2_bool( args, OPT_CIGAR_CG, OPT_CIGAR_CG_M, &cigar_cg, &cigar_cg_merge );
+ if ( rc != 0 ) return rc;
+ if ( cigar_cg )
+ opts->cigar_treatment = ct_cg_style;
+ if ( cigar_cg_merge )
+ opts->cigar_treatment = ct_cg_merge;
+ }
+
+ {
+ bool gzip, bzip2;
+
+ /* do we have to compress the output with gzip ? */
+ /* do we have to compress the output with bzip2 ? */
+ rc = gather_2_bool( args, OPT_GZIP, OPT_BZIP2, &gzip, &bzip2 );
+ if ( rc != 0 ) return rc;
+ if ( gzip )
+ opts->output_compression = oc_gzip;
+ if ( bzip2 )
+ opts->output_compression = oc_bzip2;
+ }
+
+
+ {
+ bool fasta, fastq;
+
+ /* output in FASTA - mode ? */
+ /* output in FASTQ - mode ? */
+ rc = gather_2_bool( args, OPT_FASTA, OPT_FASTQ, &fasta, &fastq );
+ if ( rc != 0 ) return rc;
+ if ( fasta )
+ opts->output_format = of_fasta;
+ if ( fastq )
+ opts->output_format = of_fastq;
+ }
+
+
+ /* do we have to reverse unaligned reads if the flag in the row says so */
+ rc = get_bool_option( args, OPT_REVERSE, &opts->reverse_unaligned_reads );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to add the spotgroup to the qname-column */
+ rc = get_bool_option( args, OPT_SPOTGRP, &opts->print_spot_group_in_name );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to report options instead of executing */
+ rc = get_bool_option( args, OPT_REPORT, &opts->report_options );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to print the alignment id in column XI */
+ rc = get_bool_option( args, OPT_XI_DEBUG, &opts->print_alignment_id_in_column_xi );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to print the alignment id in column XI */
+ rc = get_bool_option( args, OPT_CACHEREPORT, &opts->report_cache );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to dump unaligned reads only */
+ rc = get_bool_option( args, OPT_UNALIGNED_ONLY, &opts->dump_unaligned_only );
+ if ( rc != 0 ) return rc;
+
+ /* do we have to print the spot-group in a special way */
+ rc = get_bool_option( args, OPT_CG_NAMES, &opts->print_cg_names );
+ if ( rc != 0 ) return rc;
+
+ /* do we use a mate-cache */
+ rc = get_bool_option( args, OPT_NO_MATE_CACHE, &opts->use_mate_cache );
+ if ( rc != 0 ) return rc;
+ opts->use_mate_cache = !opts->use_mate_cache;
+
+ /* do we use a mate-cache */
+ rc = get_bool_option( args, OPT_LEGACY, &opts->force_legacy );
+ if ( rc != 0 ) return rc;
+
+ rc = get_bool_option( args, OPT_NEW, &opts->force_new );
+ if ( rc != 0 ) return rc;
+
+ if ( opts->force_new && opts->force_legacy )
+ opts->force_new = false;
+
+ /* do we have to merge cigar ( and read/qual ) for cg-operations in cigar */
+ rc = get_bool_option( args, OPT_CIGAR_CG_M, &opts->merge_cg_cigar );
+ if ( rc != 0 ) return rc;
+
+ /* do we enable rna-splicing */
+ rc = get_bool_option( args, OPT_RNA_SPLICE, &opts->rna_splicing );
+ if ( rc != 0 ) return rc;
+
+ /* do we disable multi-threading */
+ rc = get_bool_option( args, OPT_NO_MT, &opts->no_mt );
+
+ /* do we have to generate the MD-flag */
+ rc = get_bool_option( args, OPT_MD_FLAG, &opts->with_md_flag );
+
+ /* forcing to use the legacy code in case of Evidence-Dnb was requested */
+ if ( rc == 0 )
+ {
+ if ( opts->dump_cg_ev_dnb )
+ {
+ opts->force_legacy = true;
+ opts->force_new = false;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t get_str_option( Args * args, const char * name, const char ** s )
+{
+ uint32_t count;
+
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ *s = NULL;
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error counting comandline option '$(t)'", "t=%s", name ) );
+ }
+ else if ( count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void **)s );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error retrieving comandline option '$(t)'", "t=%s", name ) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t get_uint32_option( Args * args, const char * name, uint32_t def, uint32_t * value, bool dflt_if_zero )
+{
+ const char * s;
+ rc_t rc = get_str_option( args, name, &s );
+ *value = def;
+ if ( rc == 0 && s != NULL )
+ {
+ char *endp;
+ *value = strtou32( s, &endp, 0 );
+ if ( *endp != '\0' )
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcParam, rcInvalid );
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error converting string to integer option '$(t)'", "t=%s", name ) );
+ }
+ else if ( dflt_if_zero && *value == 0 )
+ *value = def;
+ }
+ return rc;
+}
+
+
+static rc_t get_int32_options( Args * args, const char * name, int32_t * value, bool * used )
+{
+ const char * s;
+ rc_t rc = get_str_option( args, name, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ char *endp;
+ *value = strtoi32( s, &endp, 0 );
+ if ( *endp != '\0' )
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcParam, rcInvalid );
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error converting string to integer option '$(t)'", "t=%s", name ) );
+ }
+ else
+ {
+ if ( used != NULL )
+ *used = true;
+ }
+ }
+ return rc;
+}
+
+/*
+static rc_t get_int64_option( Args * args, const char * name, uint64_t def, uint64_t * value )
+{
+ const char * s;
+ rc_t rc = get_str_option( args, name, &s );
+ *value = def;
+ if ( rc == 0 && s != NULL )
+ {
+ char *endp;
+ *value = strtou32( s, &endp, 0 );
+ if ( *endp != '\0' )
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcParam, rcInvalid );
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error converting string to integer option '$(t)'", "t=%s", name ) );
+ }
+ else if ( *value == 0 )
+ *value = def;
+ }
+ return rc;
+}
+*/
+
+static rc_t gather_int_options( Args * args, samdump_opts * opts )
+{
+ rc_t rc = get_uint32_option( args, OPT_MATE_GAP, 10000, &opts->mape_gap_cache_limit, true );
+ if ( rc == 0 )
+ rc = get_uint32_option( args, OPT_OUTBUFSIZE, 1024 * 32, &opts->output_buffer_size, false );
+
+ if ( rc == 0 )
+ {
+ uint32_t cs;
+ rc = get_uint32_option( args, OPT_CURSOR_CACHE, CURSOR_CACHE_SIZE, &cs, false );
+ if ( rc == 0 )
+ opts->cursor_cache_size = ( size_t )cs;
+ }
+
+ if ( rc == 0 )
+ {
+ uint32_t mode;
+ rc = get_uint32_option( args, OPT_DUMP_MODE, 0, &mode, true );
+ if ( rc == 0 )
+ {
+ switch( mode )
+ {
+ case 0 : opts->dump_mode = dm_one_ref_at_a_time; break;
+ case 1 : opts->dump_mode = dm_prepare_all_refs; break;
+ default : opts->dump_mode = dm_one_ref_at_a_time; break;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ rc = get_int32_options( args, OPT_MIN_MAPQ, &opts->min_mapq, &opts->use_min_mapq );
+
+ if ( rc == 0 )
+ rc = get_uint32_option( args, OPT_RNA_SPLICEL, 0, &opts->rna_splice_level, true );
+
+ return rc;
+}
+
+
+static rc_t gather_string_options( Args * args, samdump_opts * opts )
+{
+ const char * s;
+ uint32_t count;
+
+ rc_t rc = get_str_option( args, OPT_PREFIX, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->qname_prefix = string_dup_measure( s, NULL );
+ if ( opts->qname_prefix == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing QNAME-PREFIX" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = get_str_option( args, OPT_Q_QUANT, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->qual_quant = string_dup_measure( s, NULL );
+ if ( opts->qual_quant == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing QUAL-QUANT" );
+ }
+ else
+ {
+ bool bres = QualityQuantizerInitMatrix( opts->qual_quant_matrix, opts->qual_quant );
+ if ( !bres )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "error initializing quality-quantizer-matrix" );
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = get_str_option( args, OPT_OUTPUTFILE, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->outputfile = string_dup_measure( s, NULL );
+ if ( opts->outputfile == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing OUTPUTFILE" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = ArgsOptionCount( args, OPT_HDR_COMMENT, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t i;
+ rc = VNamelistMake( &opts->hdr_comments, 10 );
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * src;
+ rc = ArgsOptionValue( args, OPT_HDR_COMMENT, i, (const void **)&src );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error retrieving comandline option '$(t)' #$(n)",
+ "t=%s,n=%u", OPT_HDR_COMMENT, i ) );
+ }
+ else
+ {
+ rc = VNamelistAppend( opts->hdr_comments, src );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error appending hdr-comment '$(t)'",
+ "t=%s", src ) );
+ }
+ }
+ }
+ if ( rc != 0 )
+ {
+ VNamelistRelease( opts->hdr_comments );
+ opts->hdr_comments = NULL;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = ArgsParamCount( args, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t i;
+ rc = VNamelistMake( &opts->input_files, 10 );
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * src;
+ rc = ArgsParamValue( args, i, (const void **)&src );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error retrieving comandline param #$(n)",
+ "n=%u", i ) );
+ }
+ else
+ {
+ rc = VNamelistAppend( opts->input_files, src );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error appending input_file '$(t)'",
+ "t=%s", src ) );
+ }
+ }
+ }
+ if ( rc != 0 )
+ {
+ VNamelistRelease( opts->input_files );
+ opts->input_files = NULL;
+ }
+ }
+ opts->input_file_count = count;
+ }
+
+ rc = get_str_option( args, OPT_CIGAR_TEST, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->cigar_test = string_dup_measure( s, NULL );
+ if ( opts->cigar_test == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing CIGAR-TEST into sam-dump-options" );
+ }
+ }
+
+ rc = get_str_option( args, OPT_HDR_FILE, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->header_file = string_dup_measure( s, NULL );
+ if ( opts->header_file == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing HDR-FILE into sam-dump-options" );
+ }
+ else
+ opts->header_mode = hm_file;
+ }
+
+ opts->perf_log = NULL;
+
+#if _DEBUGGING
+ rc = get_str_option( args, OPT_TIMING, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->timing_file = string_dup_measure( s, NULL );
+ if ( opts->timing_file == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing timing-FILE into sam-dump-options" );
+ }
+ else
+ opts->perf_log = make_perf_log( opts->timing_file, "sam-dump" );
+ }
+#endif
+
+ rc = get_str_option( args, OPT_RNA_SPLICE_LOG, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ opts->rna_splice_log_file = string_dup_measure( s, NULL );
+ if ( opts->rna_splice_log_file == NULL )
+ {
+ rc = RC( rcExe, rcNoTarg, rcValidating, rcMemory, rcExhausted );
+ (void)LOGERR( klogErr, rc, "error storing rna-splice-log-FILE into sam-dump-options" );
+ }
+ else
+ opts->rna_splice_log = make_rna_splice_log( opts->rna_splice_log_file, "sam-dump" );
+ }
+
+ return rc;
+}
+
+
+/*********************************************************************************************
+
+ fa ... fully aligned reads
+ ha ... half aligned reads
+ hu ... half unaligned reads
+ fu ... fully unaligned reads
+
+ regions > 0 | dump-unaligned |
+ ----------------------------------------------------------------------
+ no | no | fa ha hu
+ no | yes | fa ha hu fu
+ yes | no | fa ha
+ yes | yes | fa ha hu
+
+*********************************************************************************************/
+static void gather_unaligned_options( samdump_opts * opts )
+{
+ if ( opts->region_count == 0 )
+ {
+ if ( opts->dump_unaligned_only )
+ {
+ opts->print_half_unaligned_reads = false;
+ opts->print_fully_unaligned_reads = true;
+ }
+ else
+ {
+ opts->print_half_unaligned_reads = true;
+ opts->print_fully_unaligned_reads = opts->dump_unaligned_reads;
+ }
+ }
+ else
+ {
+ opts->print_fully_unaligned_reads = false;
+ opts->print_half_unaligned_reads = opts->dump_unaligned_reads;
+ }
+}
+
+/* =========================================================================================== */
+
+
+static rc_t CC report_reference_cb( const char * name, Vector * ranges, void *data )
+{
+ rc_t rc = KOutMsg( "region: <%s>\n", name );
+ if ( rc == 0 )
+ {
+ uint32_t count = VectorLength( ranges );
+ if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = VectorStart( ranges ); i < count && rc == 0; ++i )
+ {
+ range *r = VectorGet( ranges, i );
+ if ( r->end == 0 )
+ {
+ if ( r->start == 0 )
+ rc = KOutMsg( "\t[ start ... end ]\n" );
+ else
+ rc = KOutMsg( "\t[ %u ... ]\n", r->start );
+ }
+ else
+ rc = KOutMsg( "\t[ %u ... %u ]\n", r->start, r->end );
+ }
+ }
+ }
+ return rc;
+}
+
+
+void report_options( const samdump_opts * opts )
+{
+ rc_t rc;
+ uint32_t len;
+
+ KOutMsg( "dump unaligned reads : %s\n", opts->dump_unaligned_reads ? "YES" : "NO" );
+ KOutMsg( "dump unaligned only : %s\n", opts->dump_unaligned_only ? "YES" : "NO" );
+ KOutMsg( "dump prim. alignments : %s\n", opts->dump_primary_alignments ? "YES" : "NO" );
+ KOutMsg( "dump sec. alignments : %s\n", opts->dump_secondary_alignments ? "YES" : "NO" );
+ KOutMsg( "dump cga-tools-mode : %s\n", opts->dump_cga_tools_mode ? "YES" : "NO" );
+ KOutMsg( "dump cg-evidence : %s\n", opts->dump_cg_evidence ? "YES" : "NO" );
+ KOutMsg( "dump cg-ev-dnb : %s\n", opts->dump_cg_ev_dnb ? "YES" : "NO" );
+ KOutMsg( "dump cg-sam : %s\n", opts->dump_cg_sam ? "YES" : "NO" );
+ KOutMsg( "merge cg-cigar : %s\n", opts->merge_cg_cigar ? "YES" : "NO" );
+
+ KOutMsg( "use long cigar : %s\n", opts->use_long_cigar ? "YES" : "NO" );
+ KOutMsg( "print seqid : %s\n", opts->use_seqid_as_refname ? "YES" : "NO" );
+ KOutMsg( "print READ with '=' : %s\n", opts->print_matches_as_equal_sign ? "YES" : "NO" );
+ KOutMsg( "reverse unaligned rd : %s\n", opts->reverse_unaligned_reads ? "YES" : "NO" );
+ KOutMsg( "add spotgrp to qname : %s\n", opts->print_spot_group_in_name ? "YES" : "NO" );
+ KOutMsg( "print id in col. XI : %s\n", opts->print_alignment_id_in_column_xi ? "YES" : "NO" );
+ KOutMsg( "report matecache : %s\n", opts->report_cache ? "YES" : "NO" );
+ KOutMsg( "print cg-names : %s\n", opts->print_cg_names ? "YES" : "NO" );
+
+ switch( opts->header_mode )
+ {
+ case hm_none : KOutMsg( "header-mode : dont print\n" ); break;
+ case hm_recalc : KOutMsg( "header-mode : recalculate\n" ); break;
+ case hm_dump : KOutMsg( "header-mode : print meta-data\n" ); break;
+ case hm_file : KOutMsg( "header-mode : take from '%s'\n", opts->header_file ); break;
+ default : KOutMsg( "header-mode : unknown\n" ); break;
+ }
+
+ switch( opts->cigar_treatment )
+ {
+ case ct_unchanged : KOutMsg( "cigar-treatment : unchanged\n" ); break;
+ case ct_cg_style : KOutMsg( "cigar-treatment : transform cg to 'cg-style\n" ); break;
+ case ct_cg_merge : KOutMsg( "cigar-treatment : transform cg to valid SAM\n" ); break;
+ default : KOutMsg( "cigar-treatment : unknow'\n" ); break;
+ }
+
+ switch( opts->output_compression )
+ {
+ case oc_none : KOutMsg( "output-compression : none\n" ); break;
+ case oc_gzip : KOutMsg( "output-compression : gzip\n" ); break;
+ case oc_bzip2 : KOutMsg( "output-compression : bzip2\n" ); break;
+ default : KOutMsg( "output-compression : unknown\n" ); break;
+ }
+
+ switch( opts->output_format )
+ {
+ case of_sam : KOutMsg( "output-format : SAM\n" ); break;
+ case of_fasta : KOutMsg( "output-format : FASTA\n" ); break;
+ case of_fastq : KOutMsg( "output-format : FASTQ\n" ); break;
+ default : KOutMsg( "output-format : unknown\n" ); break;
+ }
+
+ switch( opts->dump_mode )
+ {
+ case dm_one_ref_at_a_time : KOutMsg( "dump-mode : one ref at a time\n" ); break;
+ case dm_prepare_all_refs : KOutMsg( "dump-mode : prepare all refs\n" ); break;
+ default : KOutMsg( "dump-mode : unknown\n" ); break;
+ }
+
+ KOutMsg( "number of regions : %u\n", opts->region_count );
+ if ( opts->region_count > 0 )
+ foreach_reference( (BSTree *)&opts->regions, report_reference_cb, NULL );
+
+ if ( opts->qname_prefix == NULL )
+ KOutMsg( "qname-prefix : NONE\n" );
+ else
+ KOutMsg( "qname-prefix : '%s'\n", opts->qname_prefix );
+
+ if ( opts->qual_quant == NULL )
+ KOutMsg( "quality-quantization : NONE\n" );
+ else
+ KOutMsg( "quality-quantization : '%s'\n", opts->qual_quant );
+
+ if ( opts->hdr_comments != NULL )
+ {
+ rc = VNameListCount( opts->hdr_comments, &len );
+ if ( rc == 0 && len > 0 )
+ {
+ uint32_t i;
+
+ KOutMsg( "header-comments-count : %u\n", len );
+ for ( i = 0; i < len; ++i )
+ {
+ const char * s;
+ rc = VNameListGet( opts->hdr_comments, i, &s );
+ if ( rc == 0 && s != NULL )
+ KOutMsg( "header-comment[ %u ] : '%s'\n", i, s );
+ }
+ }
+ }
+
+ if ( opts->input_files != NULL )
+ {
+ rc = VNameListCount( opts->input_files, &len );
+ if ( rc == 0 && len > 0 )
+ {
+ uint32_t i;
+
+ KOutMsg( "input-file-count : %u\n", len );
+ for ( i = 0; i < len; ++i )
+ {
+ const char * s;
+ rc = VNameListGet( opts->input_files, i, &s );
+ if ( rc == 0 && s != NULL )
+ KOutMsg( "input-file[ %u ] : '%s'\n", i, s );
+ }
+ }
+ }
+
+ len = VectorLength( &opts->mp_dist );
+ if ( len > 0 )
+ {
+ uint32_t i;
+
+ KOutMsg( "matepair-dist-filters : %u\n", len );
+ for ( i = 0; i < len; ++i )
+ {
+ range *r = VectorGet( &opts->mp_dist, i );
+ if ( r != NULL )
+ KOutMsg( "matepair-dist[ %u ] : '%u ... %u'\n", i, r->start, r->end );
+ }
+ }
+
+ KOutMsg( "mate-gap-cache-limit : %u\n", opts->mape_gap_cache_limit );
+ KOutMsg( "outputfile : %s\n", opts->outputfile );
+ KOutMsg( "outputbuffer-size : %u\n", opts->output_buffer_size );
+ KOutMsg( "cursor-cache-size : %u\n", opts->cursor_cache_size );
+
+ KOutMsg( "use mate-cache : %s\n", opts->use_mate_cache ? "YES" : "NO" );
+ KOutMsg( "force legacy code : %s\n", opts->force_legacy ? "YES" : "NO" );
+ KOutMsg( "use min-mapq : %s\n", opts->use_min_mapq ? "YES" : "NO" );
+ KOutMsg( "min-mapq : %i\n", opts->min_mapq );
+ KOutMsg( "rna-splicing : %s\n", opts->rna_splicing ? "YES" : "NO" );
+ KOutMsg( "rna-splice-level : %u\n", opts->rna_splice_level );
+ KOutMsg( "rna-splice-log : %s\n", opts->rna_splice_log_file );
+
+ KOutMsg( "multithreading : %s\n", opts->no_mt ? "NO" : "YES" );
+ KOutMsg( "with-MD-flag : %s\n", opts->with_md_flag ? "NO" : "YES" );
+
+#if _DEBUGGING
+ if ( opts->timing_file != NULL )
+ KOutMsg( "timing-file : '%s'\n", opts->timing_file );
+ else
+ KOutMsg( "timing-file : NONE\n" );
+#endif
+
+}
+
+
+/* =========================================================================================== */
+
+
+void release_options( samdump_opts * opts )
+{
+ free_ref_regions( &opts->regions );
+ if ( opts->qname_prefix != NULL )
+ free( (void*)opts->qname_prefix );
+ if ( opts->qual_quant != NULL )
+ free( (void*)opts->qual_quant );
+ if( opts->outputfile != NULL )
+ free( (void*)opts->outputfile );
+ if( opts->header_file != NULL )
+ free( (void*)opts->header_file );
+ if( opts->timing_file != NULL )
+ free( (void*)opts->timing_file );
+ if( opts->rna_splice_log_file != NULL )
+ free( (void*)opts->rna_splice_log_file );
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ free_perf_log( opts->perf_log );
+#endif
+
+ if ( opts->rna_splice_log != NULL )
+ free_rna_splice_log( opts->rna_splice_log );
+
+ VNamelistRelease( opts->hdr_comments );
+ VNamelistRelease( opts->input_files );
+ VectorWhack ( &opts->mp_dist, release_range_wrapper, NULL );
+}
+
+/* =========================================================================================== */
+
+
+rc_t gather_options( Args * args, samdump_opts * opts )
+{
+ rc_t rc = gather_region_options( args, opts );
+ if ( rc == 0 )
+ rc = gather_flag_options( args, opts );
+ if ( rc == 0 )
+ rc = gather_string_options( args, opts );
+ if ( rc == 0 )
+ rc = gather_int_options( args, opts );
+ if ( rc == 0 )
+ rc = gather_matepair_distances( args, opts );
+ if ( rc == 0 )
+ gather_unaligned_options( opts );
+ return rc;
+}
+
+
+bool is_this_alignment_requested( const samdump_opts * opts, const char *refname, uint32_t refname_len,
+ uint64_t start, uint64_t end )
+{
+ bool res = false;
+ if ( opts != NULL )
+ {
+ reference_region *rr = find_reference_region_len( ( BSTree * )&opts->regions, refname, refname_len );
+ if ( rr != NULL )
+ {
+ Vector *v = &(rr->ranges);
+ uint32_t i, count = VectorLength( v );
+ for ( i = 0; i < count && !res; ++i )
+ {
+ range * r = VectorGet ( v, i );
+ if ( r != NULL )
+ {
+ res = ( ( end >= r->start )&&( start <= r->end ) );
+ }
+ }
+ }
+ }
+ return res;
+}
+
+
+rc_t dump_name( const samdump_opts * opts, int64_t seq_spot_id,
+ const char * spot_group, uint32_t spot_group_len )
+{
+ rc_t rc;
+
+ if ( opts->print_cg_names )
+ {
+ if ( spot_group != NULL && spot_group_len != 0 )
+ rc = KOutMsg( "%.*s-1:%lu", spot_group_len, spot_group, seq_spot_id );
+ else
+ rc = KOutMsg( "%lu", seq_spot_id );
+ }
+ else
+ {
+ if ( opts->qname_prefix != NULL )
+ {
+ /* we do have to print a prefix */
+ if ( opts->print_spot_group_in_name && spot_group != NULL && spot_group_len > 0 )
+ rc = KOutMsg( "%s.%lu.%.*s", opts->qname_prefix, seq_spot_id, spot_group_len, spot_group );
+ else
+ /* we do NOT have to append the spot-group */
+ rc = KOutMsg( "%s.%lu", opts->qname_prefix, seq_spot_id );
+ }
+ else
+ {
+ /* we do NOT have to print a prefix */
+ if ( opts->print_spot_group_in_name && spot_group != NULL && spot_group_len > 0 )
+ rc = KOutMsg( "%lu.%.*s", seq_spot_id, spot_group_len, spot_group );
+ else
+ /* we do NOT have to append the spot-group */
+ rc = KOutMsg( "%lu", seq_spot_id );
+ }
+ }
+ return rc;
+}
+
+
+rc_t dump_name_legacy( const samdump_opts * opts, const char * name, size_t name_len,
+ const char * spot_group, uint32_t spot_group_len )
+{
+ rc_t rc;
+
+ if ( opts->qname_prefix != NULL )
+ {
+ /* we do have to print a prefix */
+ if ( opts->print_spot_group_in_name && spot_group != NULL && spot_group_len > 0 )
+ rc = KOutMsg( "%s.%.*s%.*s", opts->qname_prefix, name_len, name, spot_group_len, spot_group );
+ else
+ /* we do NOT have to append the spot-group */
+ rc = KOutMsg( "%s.%.*s", opts->qname_prefix, name_len, name );
+ }
+ else
+ {
+ /* we do NOT have to print a prefix */
+ if ( opts->print_spot_group_in_name && spot_group != NULL && spot_group_len > 0 )
+ rc = KOutMsg( "%.*s.%.*s", name_len, name, spot_group_len, spot_group );
+ else
+ /* we do NOT have to append the spot-group */
+ rc = KOutMsg( "%.*s", name_len, name );
+ }
+ return rc;
+}
+
+#define USE_KWRT_HANDLER 1
+
+rc_t dump_quality( const samdump_opts * opts, char const *quality, uint32_t qual_len, bool reverse )
+{
+ uint32_t i;
+ rc_t rc = 0;
+ bool quantize = ( opts->qual_quant != NULL );
+
+ size_t size = 0;
+ char buffer [ 4096 ];
+#if USE_KWRT_HANDLER
+ size_t num_writ;
+ KWrtHandler * kout_msg_handler = KOutHandlerGet ();
+ assert ( kout_msg_handler != NULL );
+#endif
+ if ( reverse )
+ {
+ if ( quantize )
+ {
+ for ( i = qual_len; i > 0; )
+ {
+ uint32_t qual = quality[ -- i ];
+ buffer [ size ] = ( opts->qual_quant_matrix[ qual ] + 33 );
+ if ( ++ size == sizeof buffer )
+ {
+#if USE_KWRT_HANDLER
+ rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buffer, size, & num_writ );
+#else
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+#endif
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+ }
+ else
+ {
+ for ( i = qual_len; i > 0; )
+ {
+ buffer [ size ] = quality[ -- i ] + 33;
+ if ( ++ size == sizeof buffer )
+ {
+#if USE_KWRT_HANDLER
+ rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buffer, size, & num_writ );
+#else
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+#endif
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( quantize )
+ {
+ for ( i = 0; i < qual_len; ++i )
+ {
+ uint32_t qual = quality[ i ];
+ buffer [ size ] = opts->qual_quant_matrix[ qual ] + 33;
+ if ( ++ size == sizeof buffer )
+ {
+#if USE_KWRT_HANDLER
+ rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buffer, size, & num_writ );
+#else
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+#endif
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+
+ }
+ else
+ {
+ for ( i = 0; i < qual_len && rc == 0; ++i )
+ {
+ buffer [ size ] = quality[ i ] + 33;
+ if ( ++ size == sizeof buffer )
+ {
+#if USE_KWRT_HANDLER
+ rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buffer, size, & num_writ );
+#else
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+#endif
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 && size != 0 )
+ {
+#if USE_KWRT_HANDLER
+ rc = ( * kout_msg_handler -> writer ) ( kout_msg_handler -> data, buffer, size, & num_writ );
+#else
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+#endif
+ }
+ return rc;
+}
+
+
+rc_t dump_quality_33( const samdump_opts * opts, char const *quality, uint32_t qual_len, bool reverse )
+{
+ uint32_t i;
+ rc_t rc = 0;
+ bool quantize = ( opts->qual_quant != NULL );
+
+ size_t size = 0;
+ char buffer [ 4096 ];
+
+ if ( reverse )
+ {
+ if ( quantize )
+ {
+ for ( i = 0; i < qual_len && rc == 0; ++i )
+ {
+ uint32_t qual = quality[ qual_len - i - 1 ] - 33;
+ buffer [ size ] = ( opts->qual_quant_matrix[ qual ] + 33 );
+ if ( ++ size == sizeof buffer )
+ {
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+ }
+ else
+ {
+ for ( i = 0; i < qual_len && rc == 0; ++i )
+ {
+ buffer [ size ] = quality[ qual_len - i - 1 ];
+ if ( ++ size == sizeof buffer )
+ {
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( quantize )
+ {
+ for ( i = 0; i < qual_len && rc == 0; ++i )
+ {
+ uint32_t qual = quality[ i ] - 33;
+ buffer [ size ] = opts->qual_quant_matrix[ qual ] + 33;
+ if ( ++ size == sizeof buffer )
+ {
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+ if ( rc != 0 )
+ break;
+ size = 0;
+ }
+ }
+
+ }
+ else
+ {
+ rc = KOutMsg( "%.*s", qual_len, quality );
+ }
+ }
+
+ if ( rc == 0 && size != 0 )
+ rc = KOutMsg( "%.*s", ( uint32_t ) size, buffer );
+
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-dump-opts.h b/tools/sra-pileup/sam-dump-opts.h
new file mode 100644
index 0000000..71c0ba8
--- /dev/null
+++ b/tools/sra-pileup/sam-dump-opts.h
@@ -0,0 +1,306 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sam_dump_opts_
+#define _h_sam_dump_opts_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/namelist.h>
+
+#include <kapp/args.h>
+#include "perf_log.h"
+#include "rna_splice_log.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <strtol.h>
+
+
+#define OPT_UNALIGNED "unaligned"
+#define OPT_PRIM_ONLY "primary"
+#define OPT_CIGAR_LONG "cigar-long"
+#define OPT_CG_SAM "CG-SAM"
+#define OPT_CG_EVIDENCE "CG-evidence"
+#define OPT_CG_EV_DNB "CG-ev-dnb"
+#define OPT_CG_MAPP "CG-mappings"
+#define OPT_REGION "aligned-region"
+#define OPT_RECAL_HDR "header"
+#define OPT_HDR_FILE "header-file"
+#define OPT_NO_HDR "no-header"
+#define OPT_USE_SEQID "seqid"
+#define OPT_HIDE_IDENT "hide-identical"
+#define OPT_CIGAR_CG "cigar-CG"
+#define OPT_CIGAR_CG_M "cigar-CG-merge"
+#define OPT_PREFIX "prefix"
+#define OPT_REVERSE "reverse"
+#define OPT_SPOTGRP "spot-group"
+#define OPT_MATE_GAP "mate-cache-row-gap"
+#define OPT_XI_DEBUG "XI"
+#define OPT_Q_QUANT "qual-quant"
+#define OPT_GZIP "gzip"
+#define OPT_BZIP2 "bzip2"
+#define OPT_FASTQ "fastq"
+#define OPT_FASTA "fasta"
+#define OPT_HDR_COMMENT "header-comment"
+#define OPT_MATE_DIST "matepair-distance"
+#define OPT_OUTPUTFILE "output-file"
+#define OPT_OUTBUFSIZE "output-buffer-size"
+#define OPT_REPORT "report"
+#define OPT_CACHEREPORT "cachereport"
+#define OPT_UNALIGNED_ONLY "unaligned-spots-only"
+#define OPT_CG_NAMES "CG-names"
+#define OPT_CIGAR_TEST "cigar-test"
+#define OPT_CURSOR_CACHE "cursor-cache"
+#define OPT_DUMP_MODE "dump-mode"
+#define OPT_MIN_MAPQ "min-mapq"
+#define OPT_NO_MATE_CACHE "no-mate-cache"
+#define OPT_LEGACY "legacy"
+#define OPT_NEW "new"
+#define OPT_RNA_SPLICE "rna-splicing"
+#define OPT_RNA_SPLICEL "rna-splice-level"
+#define OPT_RNA_SPLICE_LOG "rna-splice-log"
+#define OPT_NO_MT "disable-multithreading"
+#define OPT_TIMING "timing"
+#define OPT_MD_FLAG "with-md-flag"
+
+typedef struct range
+{
+ uint64_t start;
+ uint64_t end;
+} range;
+
+
+typedef struct reference_region
+{
+ BSTNode node;
+ const char * name; /* the name of the reference */
+ Vector ranges; /* what regions on this reference */
+} reference_region;
+
+
+enum header_mode
+{
+ hm_none = 0, /* do not dump the headers at all */
+ hm_recalc, /* recalculate the headers */
+ hm_dump, /* dump the header found in metadata */
+ hm_file /* take the complete header part from a file */
+};
+
+enum output_format
+{
+ of_sam = 0, /* use sam-tools format */
+ of_fasta, /* use fasta-format */
+ of_fastq /* use fastq-format */
+};
+
+enum output_compression
+{
+ oc_none = 0, /* do not compress output */
+ oc_gzip, /* compress output with gzip */
+ oc_bzip2 /* compress output with bzip2 */
+};
+
+enum cigar_treatment
+{
+ ct_unchanged = 0, /* use the cigar-string as it is stored */
+ ct_cg_style, /* transform cigar into cg-style ( has B/N ) */
+ ct_cg_merge /* transform cg-data(length of read/patterns in cigar) into valid SAM (cigar/READ/QUALITY) */
+};
+
+
+enum dump_mode
+{
+ /* in case of: aligned reads requested + no regions given */
+ dm_one_ref_at_a_time = 0, /* create a set-iter each for every reference sequentially, put only one reference into it */
+ dm_prepare_all_refs /* create only ONE set-iter, put ALL references into it */
+};
+
+
+typedef struct samdump_opts
+{
+ /* tree with regions, each node has a sorted vector of ranges, can be empty ... */
+ BSTree regions; /* contains reference_region structs */
+
+ /* vector with header-comments, can be empty... */
+ VNamelist * hdr_comments;
+
+ /* vector input files/accessions/url's */
+ VNamelist * input_files;
+
+ /* vector with metapair-distances... */
+ Vector mp_dist;
+
+ /* prepend qname with this prefix */
+ const char * qname_prefix;
+
+ /* the quality quantization string */
+ const char * qual_quant;
+
+ /* optional outputfile */
+ const char * outputfile;
+
+ /* optional header-file */
+ const char * header_file;
+
+ /* cigar-test >>> not advertized! */
+ const char * cigar_test;
+
+ /* timing-file >>> not advertized! */
+ const char * timing_file;
+
+ /* log file for rna-splicing-events */
+ const char * rna_splice_log_file;
+
+ /* timing-performane-log, created if timing_file given */
+ struct perf_log * perf_log;
+
+ /* logging of rna-splicing on reqest */
+ struct rna_splice_log * rna_splice_log;
+
+ uint32_t region_count;
+ uint32_t input_file_count;
+ uint32_t rna_splice_level; /* can be 0 || 1 || 2 */
+
+ int32_t min_mapq;
+
+ /* how much buffering on the output-buffer, of OFF if zero */
+ uint32_t output_buffer_size;
+
+ /* mate's farther apart than this are not cached */
+ uint32_t mape_gap_cache_limit;
+
+ size_t cursor_cache_size;
+
+ /* how the sam-headers are treated */
+ enum header_mode header_mode;
+
+ /* how the cigar-string is treated */
+ enum cigar_treatment cigar_treatment;
+
+ /* in which format should the output be created */
+ enum output_format output_format;
+
+ /* should the output be compressed / in which format */
+ enum output_compression output_compression;
+
+ /* how to process in case of: aligned reads requested + no regions given */
+ enum dump_mode dump_mode;
+
+ /* use a mate-cache to dump aligned and half-aligned reads */
+ bool use_mate_cache;
+ bool force_legacy;
+ bool force_new;
+
+ /* which tables have to be processed/dumped */
+ bool dump_primary_alignments;
+ bool dump_secondary_alignments;
+ bool dump_cg_evidence;
+ bool dump_cg_sam;
+ bool dump_cg_ev_dnb;
+ bool merge_cg_cigar;
+
+ bool dump_unaligned_reads;
+ bool dump_unaligned_only;
+ bool dump_cga_tools_mode;
+
+ /* what alignment/unaligned reads should be dumped */
+ bool print_half_unaligned_reads;
+ bool print_fully_unaligned_reads;
+
+ /* flag that shows if we need to filter by matepair-distance */
+ bool use_matepair_filter;
+ bool use_min_mapq;
+
+ /* options changing the output-format */
+ bool use_seqid_as_refname;
+ bool use_long_cigar;
+ bool print_matches_as_equal_sign;
+ bool print_spot_group_in_name;
+ bool reverse_unaligned_reads;
+ bool print_alignment_id_in_column_xi;
+ bool report_options;
+ bool report_cache;
+ bool print_cg_names;
+ bool rna_splicing;
+
+ /* option to disable multi-threading */
+ bool no_mt;
+
+ bool with_md_flag;
+
+ uint8_t qual_quant_matrix[ 256 ];
+} samdump_opts;
+
+
+typedef struct foreach_reference_func
+{
+ rc_t ( CC * on_reference ) ( const char * name, Vector *ranges, void *data );
+ const char * name;
+ void * data;
+ rc_t rc;
+} foreach_reference_func;
+
+
+rc_t foreach_reference( BSTree * regions,
+ rc_t ( CC * on_reference ) ( const char * name, Vector *ranges, void *data ),
+ void *data );
+
+int cmp_pchar( const char * a, const char * b );
+
+rc_t gather_options( Args * args, samdump_opts * opts );
+void report_options( const samdump_opts * opts );
+void release_options( samdump_opts * opts );
+
+bool filter_by_matepair_dist( const samdump_opts * opts, int32_t tlen );
+
+bool is_this_alignment_requested( const samdump_opts * opts, const char *refname, uint32_t refname_len,
+ uint64_t start, uint64_t len );
+
+rc_t dump_name( const samdump_opts * opts, int64_t seq_spot_id,
+ const char * spot_group, uint32_t spot_group_len );
+
+rc_t dump_name_legacy( const samdump_opts * opts, const char * name, size_t name_len,
+ const char * spot_group, uint32_t spot_group_len );
+
+rc_t dump_quality( const samdump_opts * opts, char const *quality, uint32_t qual_len, bool reverse );
+
+rc_t dump_quality_33( const samdump_opts * opts, char const *quality, uint32_t qual_len, bool reverse );
+
+#endif
diff --git a/tools/sra-pileup/sam-dump.c b/tools/sra-pileup/sam-dump.c
new file mode 100644
index 0000000..ac2ca96
--- /dev/null
+++ b/tools/sra-pileup/sam-dump.c
@@ -0,0 +1,4905 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/report.h>
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/printf.h>
+#include <klib/data-buffer.h>
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/path-priv.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/gzip.h>
+#include <kfs/bzip.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+#include <vdb/report.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <vdb/schema.h>
+#include <vdb/dependencies.h>
+#include <sra/sraschema.h>
+#include <sra/srapath.h>
+#include <align/dna-reverse-cmpl.h>
+#include <align/iterator.h>
+#include <align/reference.h>
+#include <align/quality-quantizer.h>
+
+#include <kfs/directory.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <limits.h>
+#include <string.h>
+#include <strtol.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "debug.h"
+
+#if _ARCH_BITS == 64
+#define USE_MATE_CACHE 1
+#define CURSOR_CACHE (4 * 1024 * 1024 * 1024UL)
+#else
+#define USE_MATE_CACHE 0
+#define CURSOR_CACHE (256 * 1024 * 1024)
+#endif
+
+rc_t cg_canonical_print_cigar( const char * cigar, size_t cigar_len);
+
+
+
+typedef struct TAlignedRegion_struct
+{
+ char name[1024];
+ struct {
+ INSDC_coord_zero from;
+ INSDC_coord_zero to;
+ } r[10240];
+ int rq;
+ INSDC_coord_zero max_to;
+ INSDC_coord_zero min_from;
+ int printed;
+} TAlignedRegion;
+
+
+typedef struct TMatepairDistance_struct
+{
+ uint32_t from;
+ uint32_t to;
+} TMatepairDistance;
+
+
+struct params_s
+{
+ /* which outputs are on */
+ bool primaries;
+ bool secondaries;
+ bool unaligned;
+ bool cg_evidence;
+ bool cg_ev_dnb;
+ bool cg_sam;
+
+ bool use_seqid;
+ bool long_cigar;
+ bool reheader;
+ bool noheader;
+ bool hide_identical;
+ bool fasta;
+ bool fastq;
+ bool spot_group_in_name;
+ bool cg_friendly_names;
+ bool reverse_unaligned;
+ bool unaligned_spots;
+
+ bool output_gzip;
+ bool output_bz2;
+
+ bool xi;
+ int cg_style; /* 0: raw; 1: with B's; 2: without B's, fixed up SEQ/QUAL; */
+ char const *name_prefix;
+ /* region filter data */
+ TAlignedRegion* region;
+ uint32_t region_qty;
+ /* distance filter data */
+ bool mp_dist_unknown;
+ TMatepairDistance* mp_dist;
+ uint32_t mp_dist_qty;
+ uint32_t test_rows;
+
+ /* mate info cache */
+ int64_t mate_row_gap_cachable;
+
+ char const **comments;
+
+ bool quantizeQual;
+ uint8_t qualQuant[256];
+ uint8_t qualQuantSingle; /*** the quality is quantized - single value, no need to retrieve **/
+};
+
+
+struct params_s const *param;
+ReferenceList const *gRefList;
+
+
+typedef union UData_union
+{
+ void const *v;
+ uint32_t const *u32;
+ int32_t const *i32;
+ int64_t const *i64;
+ uint64_t const *u64;
+ uint8_t const *u8;
+ char const *str;
+ bool const *tf;
+ INSDC_coord_one* coord1;
+ INSDC_coord_zero* coord0;
+ INSDC_coord_len* coord_len;
+ INSDC_coord_val* coord_val;
+ INSDC_SRA_xread_type* read_type;
+ INSDC_SRA_read_filter* read_filter;
+} UData;
+
+
+typedef struct SCol_struct
+{
+ char const *name;
+ uint32_t idx;
+ UData base;
+ uint32_t len;
+ bool optional;
+} SCol;
+
+
+typedef struct STable_struct
+{
+ char const *name;
+ VTable const *vtbl;
+} STable;
+
+
+typedef struct SCursCache_struct
+{
+ KVector* cache;
+ KVector* cache_unaligned_mate; /* keeps unaligned-mate for a half-aligned spots */
+ uint32_t sam_flags;
+ INSDC_coord_zero pnext;
+ int32_t tlen;
+ ReferenceObj const *ref;
+ /* cache stats */
+ uint64_t projected;
+ uint64_t added;
+ uint64_t hit;
+ uint64_t bad;
+} SCursCache;
+
+
+typedef struct SCurs_struct
+{
+ STable const *tbl;
+ VCursor const *vcurs;
+ SCursCache* cache;
+ SCursCache cache_local;
+ uint64_t col_reads_qty;
+} SCurs;
+
+enum eDSTableType
+{
+ edstt_NotSpecified,
+ edstt_Reference,
+ edstt_Sequence,
+ edstt_PrimaryAlignment,
+ edstt_SecondaryAlignment,
+ edstt_EvidenceAlignment,
+ edstt_EvidenceInterval
+};
+
+
+typedef struct DataSource_s {
+ STable tbl;
+ SCurs curs;
+ SCol *cols;
+ enum eDSTableType type;
+} DataSource;
+
+
+#define DATASOURCE_INIT(O, NAME) do { memset(&O, 0, sizeof(O)); O.tbl.name = NAME; O.curs.tbl = &O.tbl; } while(0)
+
+
+typedef struct SAM_dump_ctx_s
+{
+ VDatabase const *db;
+ char const *fullPath;
+ char const *accession;
+ char const *readGroup;
+
+ DataSource ref;
+ DataSource pri;
+ DataSource sec;
+ DataSource evi;
+ DataSource eva;
+ DataSource seq;
+} SAM_dump_ctx_t;
+
+
+enum ealg_col
+{
+ alg_SEQ_SPOT_ID = 0,
+ alg_SEQ_NAME,
+ alg_MAPQ,
+ alg_CIGAR,
+ alg_READ,
+ alg_READ_START,
+ alg_READ_LEN,
+ alg_CIGAR_LEN,
+ alg_SAM_QUALITY,
+ alg_SPOT_GROUP,
+ alg_SEQ_SPOT_GROUP,
+ alg_SEQ_READ_ID,
+ alg_REVERSED,
+ alg_ALIGNMENT_COUNT,
+ alg_EDIT_DISTANCE,
+ alg_READ_FILTER,
+ alg_MATE_ALIGN_ID,
+ alg_MATE_REF_NAME,
+ alg_SAM_FLAGS,
+ alg_REF_START,
+ alg_MATE_REF_POS,
+ alg_ALIGN_GROUP,
+ alg_EVIDENCE_ALIGNMENT_IDS,
+ alg_REF_PLOIDY,
+ alg_REF_ID,
+ alg_MATE_REF_ID,
+ alg_HAS_MISMATCH,
+ alg_REGION_FILTER,
+ alg_REF_NAME = alg_REGION_FILTER,
+ alg_REF_SEQ_ID,
+ alg_REF_POS,
+ alg_REF_LEN,
+ alg_DISTANCE_FILTER,
+ alg_TEMPLATE_LEN = alg_DISTANCE_FILTER,
+ alg_CG_TAGS_STR
+};
+
+
+SCol const g_alg_col_tmpl[] =
+{
+ { "SEQ_SPOT_ID", 0, {NULL}, 0, true },
+ { "SEQ_NAME", 0, {NULL}, 0, false },
+ { "MAPQ", 0, {NULL}, 0, false },
+ { "?CIGAR column name?", 0, {NULL}, 0, false },
+ { "?READ column name?", 0, {NULL}, 0, false },
+ { "READ_START", 0, {NULL}, 0, false }, /* READ_START */
+ { "READ_LEN", 0, {NULL}, 0, false }, /* READ_LEN */
+ { "?CIGAR_LEN column name?", 0, {NULL}, 0, true }, /* CIGAR_LEN */
+ { "SAM_QUALITY", 0, {NULL}, 0, false },
+ { "SPOT_GROUP", 0, {NULL}, 0, true },
+ { "SEQ_SPOT_GROUP", 0, {NULL}, 0, true },
+ { "SEQ_READ_ID", 0, {NULL}, 0, true },
+ { "REF_ORIENTATION", 0, {NULL}, 0, true },
+ { "ALIGNMENT_COUNT", 0, {NULL}, 0, true },
+ { "EDIT_DISTANCE", 0, {NULL}, 0, false },
+ { "", 0, {NULL}, 0, false },
+ /* start cols used as standalone in DumpUnaligned */
+ /* MATE_ALIGN_ID col must preceeed
+ MATE_REF_NAME, MATE_REF_POS, SAM_FLAGS, TEMPLATE_LEN for cache to work */
+ { "MATE_ALIGN_ID", 0, {NULL}, 0, false },
+ { "?MATE_REF_NAME column name?", 0, {NULL}, 0, false },
+ { "SAM_FLAGS", 0, {NULL}, 0, false },
+ { "REF_START", 0, {NULL}, 0, false }, /* priming cursor cache */
+ { "MATE_REF_POS", 0, {NULL}, 0, false },
+ { "ALIGN_GROUP", 0, {NULL}, 0, true },
+ { "", 0, {NULL}, 0, true }, /* EVIDENCE_ALIGNMENT_IDS */
+ { "", 0, {NULL}, 0, true }, /* REF_PLOIDY */
+ { "REF_ID", 0, {NULL}, 0, true }, /* REF_ID */
+ { "MATE_REF_ID", 0, {NULL}, 0, true }, /* priming cursor cache */
+ { "(bool)HAS_MISMATCH", 0, {NULL}, 0, true },
+ /* these are read before any other for filtering so they must be last */
+ { "REF_NAME", 0, {NULL}, 0, false },
+ { "REF_SEQ_ID", 0, {NULL}, 0, false },
+ { "REF_POS", 0, {NULL}, 0, false },
+ /* end cols used as standalone in DumpUnaligned */
+ { "REF_LEN", 0, {NULL}, 0, false },
+ { "TEMPLATE_LEN", 0, {NULL}, 0, false },
+ { NULL, 0, {NULL}, 0, false }, /* alg_CG_TAGS_STR */
+ { NULL, 0, {NULL}, 0, false }
+};
+
+enum eseq_col
+{
+ seq_READ = 0,
+ seq_QUALITY,
+ seq_SPOT_GROUP,
+ seq_READ_START,
+ seq_READ_LEN,
+ seq_READ_TYPE,
+ seq_READ_FILTER,
+ seq_NAME,
+ seq_PRIMARY_ALIGNMENT_ID
+};
+
+static
+SCol const gSeqCol[] =
+{
+ { "READ", 0, {NULL}, 0, false },
+ { "(INSDC:quality:text:phred_33)QUALITY", 0, {NULL}, 0, false },
+ { "SPOT_GROUP", 0, {NULL}, 0, true },
+ { "READ_START", 0, {NULL}, 0, true },
+ { "READ_LEN", 0, {NULL}, 0, true },
+ { "READ_TYPE", 0, {NULL}, 0, true },
+ { "READ_FILTER", 0, {NULL}, 0, true },
+ { "NAME", 0, {NULL}, 0, true },
+ /* must be last in list to avoid reading all columns */
+ { "PRIMARY_ALIGNMENT_ID", 0, {NULL}, 0, true },
+ { NULL, 0, {NULL}, 0, false }
+};
+
+
+static rc_t RefSeqPrint( void )
+{
+ rc_t rc = 0;
+ uint32_t i, count = 0;
+
+ rc = ReferenceList_Count( gRefList, &count );
+ for( i = 0; rc == 0 && i < count; i++ )
+ {
+ ReferenceObj const *obj;
+ rc = ReferenceList_Get( gRefList, &obj, i );
+ if ( rc == 0 )
+ {
+ char const *seqid = NULL;
+ rc = ReferenceObj_SeqId( obj, &seqid );
+ if ( rc == 0 )
+ {
+ char const *name = NULL;
+ rc = ReferenceObj_Name( obj, &name );
+ if ( rc == 0 )
+ {
+ INSDC_coord_len len;
+ rc = ReferenceObj_SeqLength( obj, &len );
+ if ( rc == 0 )
+ {
+ char const *nm;
+ if ( param->use_seqid && seqid != NULL && seqid[ 0 ] != '\0' )
+ {
+ nm = seqid;
+ }
+ else
+ {
+ nm = name;
+ }
+ KOutMsg( "@SQ\tSN:%s", nm );
+ if ( nm != seqid && seqid != NULL && seqid[ 0 ] != '\0' && strcmp( nm, seqid ) != 0)
+ {
+ KOutMsg( "\tAS:%s", seqid );
+ }
+ KOutMsg( "\tLN:%u\n", len );
+ }
+ }
+ }
+ ReferenceObj_Release( obj );
+ }
+ }
+ return rc;
+}
+
+
+#if USE_MATE_CACHE
+static rc_t Cache_Init( SCursCache* c )
+{
+ if ( c != NULL )
+ {
+ rc_t rc;
+ memset( c, 0, sizeof( *c ) );
+ rc=KVectorMake( &c->cache );
+ if(rc == 0){
+ rc=KVectorMake( &c->cache_unaligned_mate );
+ }
+ }
+ return 0;
+}
+
+
+static void Cache_Close( char const *name, SCursCache* c )
+{
+ if ( c != NULL )
+ {
+ KVectorRelease( c->cache );
+ KVectorRelease( c->cache_unaligned_mate );
+ if ( c->added > 0 )
+ {
+ SAM_DUMP_DBG( 2, ( "%s cache stats: projected %lu added of those %lu; "
+ "hits %lu of those broken %lu;\n",
+ name, c->projected, c->added, c->hit, c->bad ) );
+ }
+ }
+ memset( c, 0, sizeof( *c ) );
+}
+
+
+static rc_t Cache_Add( uint64_t key, SCurs const *curs, SCol const *cols )
+{
+ /* compact values for mate record to cache as:
+ pos_delta - 32bit, ref_proj - 11bit, flags - 11bit, rnext_idx - 10bit = 64bit
+ */
+ rc_t rc = 0;
+ ReferenceObj const *r = NULL;
+ uint32_t rid = 0;
+ uint64_t val = 0;
+ int64_t mate_id = cols[ alg_MATE_ALIGN_ID ].len > 0 ? cols[ alg_MATE_ALIGN_ID ].base.i64[ 0 ] : 0;
+
+ rc = ReferenceList_Find( gRefList, &r, cols[ alg_REF_NAME ].base.str, cols[ alg_REF_NAME ].len );
+ if ( rc == 0 )
+ {
+ rc = ReferenceObj_Idx( r, &rid );
+ }
+#if _DEBUGGING
+ {
+ char const *rname = NULL;
+ curs->cache->projected++;
+ ReferenceObj_Name( r, &rname );
+ SAM_DUMP_DBG( 10, ( "to cache row %li for mate %li: %u,%s[%hu],%u,%u,%i",
+ key, mate_id, cols[ alg_SAM_FLAGS ].base.u32[ 0 ], rname, rid,
+ cols[ alg_REF_POS ].len ? cols[ alg_REF_POS ].base.coord0[ 0 ] : 0,
+ cols[ alg_MATE_REF_POS ].len ? cols[ alg_MATE_REF_POS ].base.coord0[ 0 ] : 0,
+ cols[ alg_TEMPLATE_LEN ].len > 0 ? cols[ alg_TEMPLATE_LEN ].base.i32[ 0 ] : 0));
+ }
+#endif
+ if ( rc == 0 && !( rid & 0xFC00 ) )
+ {
+ int64_t pos_delta64;
+ int32_t pos_delta32;
+
+ if ( mate_id != 0 )
+ {
+ ReferenceObj const *rm = NULL;
+ uint32_t rm_id;
+
+ rc = ReferenceList_Find( gRefList, &rm, cols[ alg_MATE_REF_NAME ].base.str, cols[ alg_MATE_REF_NAME ].len );
+ if ( rc == 0 )
+ {
+ rc = ReferenceObj_Idx( rm, &rm_id );
+ }
+ assert( rm != NULL );
+ if ( rc == 0 && rid != rm_id )
+ {
+ char const *rm_name = NULL;
+ ReferenceObj_Name( rm, &rm_name );
+ mate_id = 0;
+ SAM_DUMP_DBG( 10, ( " mate ref differ: %s[%hu]!", rm_name, rm_id ) );
+ }
+ ReferenceObj_Release( rm );
+ }
+
+ if ( mate_id != 0 )
+ {
+ pos_delta64 = cols[ alg_MATE_REF_POS ].base.coord0[ 0 ] - cols[ alg_REF_POS ].base.coord0[ 0 ];
+ }
+ else
+ {
+ pos_delta64 = cols[ alg_REF_POS ].base.coord0[ 0 ];
+ }
+
+ pos_delta32 = pos_delta64;
+ if ( pos_delta64 == pos_delta32 )
+ {
+ int64_t ref_proj;
+ if ( mate_id == 0 )
+ {
+ ref_proj = 0; /* indicates full value in delta */
+ }
+ else if ( cols[ alg_TEMPLATE_LEN ].base.i32[ 0 ] < 0 )
+ {
+ assert( pos_delta32 <= 0 );
+ ref_proj = pos_delta32 - cols[ alg_TEMPLATE_LEN ].base.i32[ 0 ];
+ }
+ else
+ {
+ assert( pos_delta32 >= 0 );
+ ref_proj = cols[ alg_TEMPLATE_LEN ].base.i32[ 0 ] - pos_delta32;
+ }
+
+ if ( !( ref_proj & 0xFFFFF800 ) )
+ {
+ val = ( pos_delta64 << 32 ) | ( ref_proj << 21 ) | ( cols[ alg_SAM_FLAGS ].base.u32[ 0 ] << 10 ) | rid;
+ rc = KVectorSetU64( curs->cache->cache, key, val );
+ }
+ }
+ }
+ ReferenceObj_Release( r );
+
+#if _DEBUGGING
+ if ( val == 0 )
+ {
+ SAM_DUMP_DBG( 10, ( " --> out of range\n" ) );
+ }
+ else
+ {
+ SAM_DUMP_DBG( 10, ( " --> %016lX\n", val ) );
+ curs->cache->added++;
+ }
+#endif
+ return rc;
+}
+
+
+static rc_t Cache_Get( SCurs const *curs, uint64_t key, uint64_t* val )
+{
+ rc_t rc = KVectorGetU64( curs->cache->cache, key, val );
+ if ( rc == 0 )
+ {
+ uint32_t id = ( *val & 0x3FF );
+#if _DEBUGGING
+ curs->cache->hit++;
+#endif
+ KVectorUnset( curs->cache->cache, key );
+ rc = ReferenceList_Get( gRefList, &curs->cache->ref, id );
+ if ( rc != 0 )
+ {
+ *val = 0;
+ curs->cache->ref = NULL;
+ rc = RC( rcExe, rcNoTarg, rcSearching, rcItem, rcNotFound );
+#if _DEBUGGING
+ curs->cache->bad++;
+#endif
+ }
+ else
+ {
+ SAM_DUMP_DBG( 10, ( "from cache row %li %016lX", key, *val ) );
+ }
+ }
+ return rc;
+}
+
+
+static void Cache_Unpack( uint64_t val, int64_t mate_id, SCurs const *curs, SCol* cols )
+{
+ int32_t pos_delta = ( val & 0xFFFFFFFF00000000 ) >> 32;
+ uint32_t ref_proj = ( val & 0x00000000FFE00000 ) >> 21;
+ uint32_t flags = ( val & 0x00000000001FFC00 ) >> 10;
+
+ if ( mate_id != 0 )
+ {
+ /* adjust flags for mate record */
+ curs->cache->sam_flags = ( flags & 0x1 ) |
+ ( flags & 0x2 ) |
+ ( ( flags & 0x8 ) >> 1 ) |
+ ( ( flags & 0x4 ) << 1 ) |
+ ( ( flags & 0x20 ) >> 1 ) |
+ ( ( flags & 0x10 ) << 1 ) |
+ ( ( flags & 0x40 ) ? 0x80 : 0x40 ) |
+ ( flags & 0x700 );
+ }
+ else
+ {
+ /* preserve flags as if original records is restored */
+ curs->cache->sam_flags = flags;
+ }
+ cols[ alg_SAM_FLAGS ].base.u32 = &curs->cache->sam_flags;
+ cols[ alg_SAM_FLAGS ].len = sizeof( curs->cache->sam_flags );
+
+ if ( param->use_seqid )
+ {
+ ReferenceObj_SeqId( curs->cache->ref, &cols[ alg_MATE_REF_NAME ].base.str );
+ }
+ else
+ {
+ ReferenceObj_Name( curs->cache->ref, &cols[ alg_MATE_REF_NAME ].base.str );
+ }
+
+ cols[ alg_MATE_REF_NAME ].len = string_size( cols[ alg_MATE_REF_NAME ].base.str );
+
+ if ( ref_proj == 0 )
+ {
+ curs->cache->pnext = pos_delta;
+ curs->cache->tlen = 0;
+ }
+ else if ( pos_delta > 0 )
+ {
+ curs->cache->pnext = ( cols[ alg_REF_POS ].len > 0 ? cols[ alg_REF_POS ].base.coord0[ 0 ] : 0 ) - pos_delta;
+ curs->cache->tlen = - ( ref_proj + pos_delta );
+ }
+ else
+ {
+ curs->cache->pnext = ( cols[ alg_REF_POS ].len > 0 ? cols[ alg_REF_POS ].base.coord0[ 0 ] : 0 ) - pos_delta;
+ curs->cache->tlen = ref_proj - pos_delta;
+ }
+
+ cols[ alg_MATE_REF_POS ].base.coord0 = &curs->cache->pnext;
+ cols[ alg_MATE_REF_POS ].len = sizeof( curs->cache->pnext );
+ cols[ alg_TEMPLATE_LEN ].base.i32 = &curs->cache->tlen;
+ cols[ alg_TEMPLATE_LEN ].len = sizeof( curs->cache->tlen );
+ {
+ uint32_t id;
+ ReferenceObj_Idx( curs->cache->ref, &id );
+ SAM_DUMP_DBG( 10, ( " --> mate %li: %u,%s[%hu],%u,%i\n",
+ mate_id, curs->cache->sam_flags, cols[ alg_MATE_REF_NAME ].base.str,
+ id, curs->cache->pnext, curs->cache->tlen ) );
+ }
+}
+#endif /* USE_MATE_CACHE */
+
+#if 0
+static rc_t OpenVTable( VDatabase const *db, STable* tbl, char const *name, bool optional )
+{
+ rc_t rc = VDatabaseOpenTableRead( db, &tbl->vtbl, "%s", name );
+ if ( GetRCState( rc ) == rcNotFound && optional )
+ {
+ rc = 0;
+ tbl->vtbl = NULL;
+ }
+ tbl->name = name;
+ return rc;
+}
+#endif
+
+static rc_t Cursor_Open( STable const *const tbl, SCurs *const curs, SCol cols[], SCursCache* cache )
+{
+ rc_t rc = 0;
+ unsigned i;
+
+ curs->vcurs = NULL;
+ if ( tbl == NULL || tbl->vtbl == NULL )
+ return 0;
+
+ rc = VTableCreateCachedCursorRead( tbl->vtbl, &curs->vcurs, CURSOR_CACHE );
+ if ( rc != 0 )
+ return rc;
+
+ rc = VCursorPermitPostOpenAdd( curs->vcurs );
+ if ( rc != 0 )
+ return rc;
+
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( curs->vcurs );
+ if ( rc == 0 )
+ {
+#if USE_MATE_CACHE
+ if ( cache != NULL )
+ {
+ curs->cache = cache;
+ }
+ else
+ {
+ curs->cache = &curs->cache_local;
+ rc = Cache_Init( &curs->cache_local );
+ }
+#endif /* USE_MATE_CACHE */
+ curs->tbl = tbl;
+ }
+ }
+
+ for ( i = 0; cols[ i ].name != NULL; ++i )
+ {
+ if ( cols[ i ].name[ 0 ] == 0 )
+ continue;
+ rc = VCursorAddColumn( curs->vcurs, &cols[ i ].idx, "%s", cols[ i ].name );
+ if ( GetRCObject( rc ) == ( enum RCObject ) rcColumn )
+ {
+ switch ( GetRCState( rc ) )
+ {
+ case rcNotFound:
+ case rcUndefined:
+ if ( !cols[ i ].optional )
+ break;
+ case rcExists:
+ rc = 0;
+ default:
+ break;
+ }
+ }
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "table $(t) column $(c)", "t=%s,c=%s", tbl->name, cols[ i ].name ) );
+ break;
+ }
+ }
+ if ( rc != 0 )
+ {
+ VCursorRelease( curs->vcurs );
+ curs->vcurs = NULL;
+ if ( rc != KLogLastErrorCode() )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "table $(t)", "t=%s", tbl->name ) );
+ }
+ }
+ else
+ {
+ SAM_DUMP_DBG( 2, ( "%s: table %s\n", __func__, curs->tbl->name ) );
+ }
+ return rc;
+}
+
+
+static void Cursor_Close( SCurs* curs )
+{
+ if ( curs != NULL && curs->vcurs != NULL )
+ {
+ SAM_DUMP_DBG( 2, ( "%s: table %s, columns rows read %lu\n", __func__, curs->tbl->name, curs->col_reads_qty ) );
+ VCursorRelease( curs->vcurs );
+#if USE_MATE_CACHE
+ if ( curs->cache == &curs->cache_local )
+ {
+ Cache_Close( curs->tbl->name, curs->cache );
+ }
+#endif /* USE_MATE_CACHE */
+ memset( curs, 0, sizeof( *curs ) );
+ }
+}
+
+
+static rc_t Cursor_Read( DataSource *ds, int64_t row_id, int firstCol, unsigned nCols )
+{
+ rc_t rc = 0;
+
+ if ( ds->curs.vcurs == NULL )
+ {
+ rc = Cursor_Open( &ds->tbl, &ds->curs, ds->cols, ds->curs.cache );
+ if ( rc != 0 )
+ return rc;
+ }
+ if (1)
+ {
+ SCol *const col = &ds->cols[ firstCol ];
+ unsigned i;
+
+ for ( i = 0; i < nCols && col[ i ].name; ++i )
+ {
+ uint32_t const idx = col[ i ].idx;
+
+ if ( idx != 0 )
+ {
+ uint32_t elem_bits;
+ uint32_t bit_offset;
+ uint32_t elem_count;
+ void const *base;
+
+ rc = VCursorCellDataDirect( ds->curs.vcurs, row_id, idx, &elem_bits, &base, &bit_offset, &elem_count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogWarn, ( klogWarn, rc, "reading $(t) row $(r), column $(c)", "t=%s,r=%li,c=%s",
+ ds->tbl.name, row_id, col[ i ].name ) );
+ return rc;
+ }
+
+ assert( bit_offset == 0 );
+ assert( elem_bits % 8 == 0 );
+
+ col[ i ].base.v = base;
+ col[ i ].len = elem_count;
+ }
+ }
+ }
+ return rc;
+}
+
+struct
+{
+ KWrtWriter writer;
+ void* data;
+ KFile* kfile;
+ uint64_t pos;
+} g_out_writer = {NULL};
+
+
+static rc_t CC BufferedWriter( void *const self, char const buffer[], size_t const bufsize, size_t *const pnum_writ )
+{
+ rc_t rc = 0;
+ size_t written = 0;
+
+ assert( buffer != NULL );
+
+ while ( written < bufsize )
+ {
+ size_t n;
+
+ rc = KFileWrite( g_out_writer.kfile, g_out_writer.pos + written, &buffer[ written ], bufsize - written, &n );
+ if ( rc != 0 )
+ break;
+ written += n;
+ }
+ g_out_writer.pos += written;
+ if ( pnum_writ != NULL )
+ *pnum_writ = written;
+ return rc;
+}
+
+
+static rc_t BufferedWriterMake( bool gzip, bool bzip2 )
+{
+ rc_t rc = 0;
+
+ if ( gzip && bzip2 )
+ {
+ rc = RC( rcApp, rcFile, rcConstructing, rcParam, rcAmbiguous );
+ }
+ else if ( g_out_writer.writer != NULL )
+ {
+ rc = RC( rcApp, rcFile, rcConstructing, rcParam, rcAmbiguous );
+ }
+ else
+ {
+ rc = KFileMakeStdOut( &g_out_writer.kfile );
+ if ( rc == 0 )
+ {
+ g_out_writer.pos = 0;
+ if ( gzip )
+ {
+ KFile* gz;
+ rc = KFileMakeGzipForWrite( &gz, g_out_writer.kfile );
+ if ( rc == 0 )
+ {
+ KFileRelease( g_out_writer.kfile );
+ g_out_writer.kfile = gz;
+ }
+ }
+ else if ( bzip2 )
+ {
+ KFile* bz;
+ rc = KFileMakeBzip2ForWrite( &bz, g_out_writer.kfile );
+ if ( rc == 0 )
+ {
+ KFileRelease( g_out_writer.kfile );
+ g_out_writer.kfile = bz;
+ }
+ }
+ if ( rc == 0 )
+ {
+ KFile* buf;
+ rc = KBufFileMakeWrite( &buf, g_out_writer.kfile, false, 128 * 1024 );
+ if ( rc == 0 )
+ {
+ KFileRelease( g_out_writer.kfile );
+ g_out_writer.kfile = buf;
+ g_out_writer.writer = KOutWriterGet();
+ g_out_writer.data = KOutDataGet();
+ rc = KOutHandlerSet( BufferedWriter, &g_out_writer );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static void BufferedWriterRelease( bool flush )
+{
+ if ( flush )
+ {
+ /* avoid flushing buffered data after failure */
+ KFileRelease( g_out_writer.kfile );
+ }
+ if ( g_out_writer.writer != NULL )
+ {
+ KOutHandlerSet( g_out_writer.writer, g_out_writer.data );
+ }
+ g_out_writer.writer = NULL;
+}
+
+
+typedef struct ReadGroup
+{
+ BSTNode node;
+ char name[ 1024 ];
+} ReadGroup;
+
+
+static int64_t CC ReadGroup_sort( BSTNode const *item, BSTNode const *node )
+{
+ return strcmp( ( ( ReadGroup const * )item )->name, ( ( ReadGroup const * ) node )->name );
+}
+
+
+static rc_t ReadGroup_print( char const *nm )
+{
+ rc_t rc = 0;
+ if ( nm[ 0 ] != '\0' && strcasecmp( nm, "default" ) )
+ {
+ rc = KOutMsg( "@RG\tID:%s\n", nm );
+ }
+ return rc;
+}
+
+
+static void CC ReadGroup_dump( BSTNode *n, void *data )
+{
+ ReadGroup const *g = ( ReadGroup* )n;
+ ReadGroup_print( g->name );
+}
+
+
+static rc_t CC DumpReadGroupsScan( STable const *tbl )
+{
+ SCol cols[] =
+ {
+ { "SPOT_GROUP", 0, {NULL}, 0, false },
+ { NULL, 0, {NULL}, 0, false }
+ };
+ rc_t rc = 0;
+ BSTree tree;
+ DataSource ds;
+
+ memset( &ds, 0, sizeof( ds ) );
+ ds.cols = cols;
+
+ BSTreeInit( &tree );
+ rc = Cursor_Open( tbl, &ds.curs, ds.cols, NULL );
+ if ( rc == 0 )
+ {
+ int64_t start;
+ uint64_t count;
+
+ rc = VCursorIdRange( ds.curs.vcurs, 0, &start, &count );
+ if ( rc == 0 )
+ {
+ ReadGroup* node = NULL;
+ uint32_t last_len = 0;
+
+ while ( count > 0 && rc == 0 )
+ {
+ rc = Cursor_Read( &ds, start, 0, ~(unsigned)0 );
+ if ( rc == 0 && cols[ 0 ].len != 0 )
+ {
+ if ( node == NULL ||
+ last_len != cols[ 0 ].len ||
+ strncmp( cols[ 0 ].base.str, node->name, cols[ 0 ].len ) != 0 )
+ {
+ node = malloc( sizeof( *node ) );
+ if ( node == NULL )
+ {
+ rc = RC( rcExe, rcNode, rcConstructing, rcMemory, rcExhausted );
+ }
+ else if ( cols[ 0 ].len > sizeof( node->name ) )
+ {
+ rc = RC( rcExe, rcString, rcCopying, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ last_len = cols[ 0 ].len;
+ string_copy( node->name, ( sizeof node->name ) - 1, cols[ 0 ].base.str, last_len );
+ node->name[ last_len ] = '\0';
+ rc = BSTreeInsertUnique( &tree, &node->node, NULL, ReadGroup_sort );
+ if ( GetRCState( rc ) == rcExists )
+ {
+ free( node );
+ rc = 0;
+ }
+ }
+ }
+ }
+ else if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcRow )
+ {
+ rc = 0;
+ }
+ start++;
+ count--;
+ }
+ }
+ Cursor_Close( &ds.curs );
+ }
+
+ if ( rc == 0 )
+ {
+ BSTreeForEach( &tree, false, ReadGroup_dump, NULL );
+ }
+ else if ( rc != KLogLastErrorCode() )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "$(f)", "f=%s", __func__ ) );
+ }
+ BSTreeWhack( &tree, NULL, NULL );
+ return rc;
+}
+
+
+rc_t CC DumpReadGroups( STable const *tbl )
+{
+ rc_t rc = 0;
+ KMetadata const *m;
+
+ /* try getting list from stats meta */
+ rc = VTableOpenMetadataRead( tbl->vtbl, &m );
+ if ( rc == 0 )
+ {
+ KMDataNode const *n;
+ rc = KMetadataOpenNodeRead( m, &n, "/STATS/SPOT_GROUP" );
+ if ( rc == 0 )
+ {
+ KNamelist* names;
+ rc = KMDataNodeListChild( n, &names );
+ if ( rc == 0 )
+ {
+ uint32_t i, q;
+ rc = KNamelistCount( names, &q );
+ if ( rc == 0 )
+ {
+ for ( i = 0; rc == 0 && i < q; i++ )
+ {
+ char const *nm;
+ rc = KNamelistGet( names, i, &nm );
+ if ( rc == 0 )
+ {
+ rc = ReadGroup_print( nm );
+ }
+ }
+ }
+ KNamelistRelease( names );
+ }
+ KMDataNodeRelease( n );
+ }
+ KMetadataRelease( m );
+ }
+
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ rc = DumpReadGroupsScan( tbl );
+ }
+ else if ( rc != 0 && rc != KLogLastErrorCode() )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "$(f)", "f=%s", __func__ ) );
+ }
+ return rc;
+}
+
+static rc_t Cursor_ReadAlign( SCurs const *curs, int64_t row_id, SCol* cols, uint32_t idx )
+{
+ rc_t rc = 0;
+ SCol* c = NULL;
+ SCol* mate_id = NULL;
+#if USE_MATE_CACHE
+ uint64_t cache_val = 0;
+ bool cache_miss = false;
+#endif /* USE_MATE_CACHE */
+
+
+ for( ; rc == 0 && cols[ idx ].name != NULL; idx++ )
+ {
+ c = &cols[ idx ];
+ if ( c->idx != 0 )
+ {
+#if USE_MATE_CACHE
+ if ( mate_id != NULL && curs->cache != NULL && !cache_miss &&
+ ( idx == alg_SAM_FLAGS || idx == alg_MATE_REF_NAME || idx == alg_MATE_REF_POS || idx == alg_TEMPLATE_LEN ) &&
+ mate_id->idx && mate_id->len > 0 && mate_id->base.i64[ 0 ] > 0 )
+ {
+ if ( cache_val != 0 )
+ {
+ continue;
+ }
+ rc = Cache_Get( curs, mate_id->base.u64[ 0 ], &cache_val );
+ if ( rc == 0 )
+ {
+ continue;
+ }
+ else if ( !( GetRCObject( rc ) == rcItem && GetRCState( rc ) == rcNotFound ) )
+ {
+ break;
+ }
+ else
+ {
+ /* avoid multiple lookups in cache */
+ cache_miss = true;
+ }
+ }
+#endif /* USE_MATE_CACHE */
+ rc = VCursorCellDataDirect( curs->vcurs, row_id, c->idx, NULL, &c->base.v, NULL, &c->len );
+ if ( rc == 0 )
+ {
+ if ( idx == alg_SEQ_SPOT_ID && ( c->len ==0 || c->base.i64[ 0 ] == 0 ) )
+ {
+ return RC( rcExe, rcColumn, rcReading, rcRow, rcNotFound );
+ }
+ if ( idx == alg_MATE_ALIGN_ID )
+ {
+ mate_id = &cols[ alg_MATE_ALIGN_ID ];
+ }
+#if _DEBUGGING
+ ( ( SCurs* )curs )->col_reads_qty++;
+#endif
+ }
+ }
+ else
+ {
+ static INSDC_coord_zero readStart;
+ static INSDC_coord_len readLen;
+ static INSDC_coord_len cigarLen;
+
+ switch ( (int)idx )
+ {
+ case alg_READ_START:
+ readStart = 0;
+ c->base.coord0 = &readStart;
+ c->len = 1;
+ break;
+ case alg_READ_LEN:
+ readLen = cols[ alg_READ ].len;
+ c->base.coord_len = &readLen;
+ c->len = 1;
+ break;
+ case alg_CIGAR_LEN:
+ cigarLen = cols[ alg_CIGAR ].len;
+ c->base.coord_len = &cigarLen;
+ c->len = 1;
+ break;
+ }
+ }
+ }
+
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogWarn, ( klogWarn, rc, "reading $(t) row $(r), column $(c)", "t=%s,r=%li,c=%s",
+ curs->tbl->name, row_id, c ? c->name : "<none>" ) );
+#if USE_MATE_CACHE
+ }
+ else if ( curs->cache == NULL )
+ {
+ }
+ else if ( cache_val == 0 )
+ {
+ /* this row is not from cache */
+ int64_t mate_align_id = ( mate_id != NULL && mate_id->len > 0 ) ? mate_id->base.i64[ 0 ] : 0;
+ if ( cols[ 0 ].idx != 0 && /* we have full cursor which means we are reading alignment table */
+ /* no mate -> unaligned (not secondary!) */
+ ( ( mate_align_id == 0 && param->unaligned && curs->cache != &curs->cache_local ) ||
+ /* 2nd mate with higher rowid and more than set gap rows away */
+ ( mate_align_id != 0 && mate_align_id > row_id && ( mate_align_id - row_id) > param->mate_row_gap_cachable ) ) )
+ {
+ rc = Cache_Add( row_id, curs, cols );
+ }
+ if(param->unaligned == true && mate_align_id == 0 ){
+ rc = KVectorSetBool( curs->cache->cache_unaligned_mate, cols[alg_SEQ_SPOT_ID].base.i64[0], true );
+ }
+ }
+ else
+ {
+ Cache_Unpack( cache_val, row_id, curs, cols );
+#endif /* USE_MATE_CACHE */
+ }
+ return rc;
+}
+
+
+static rc_t DumpName( char const *name, size_t name_len,
+ const char spot_group_sep, char const *spot_group,
+ size_t spot_group_len, int64_t spot_id )
+{
+ rc_t rc = 0;
+ if ( param->cg_friendly_names )
+ {
+ rc = KOutMsg( "%.*s-1:%lu", spot_group_len, spot_group, spot_id );
+ }
+ else
+ {
+ if ( param->name_prefix != NULL )
+ {
+ rc = KOutMsg( "%s.", param->name_prefix );
+ }
+ rc = BufferedWriter( NULL, name, name_len, NULL );
+ if ( rc == 0 && param->spot_group_in_name && spot_group_len > 0 )
+ {
+ rc = BufferedWriter( NULL, &spot_group_sep, 1, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, spot_group, spot_group_len, NULL );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t DumpQuality( char const quality[], unsigned const count, bool const reverse, bool const quantize )
+{
+ rc_t rc = 0;
+ if ( quality == NULL )
+ {
+ unsigned i;
+
+ for ( i = 0; rc == 0 && i < count; ++i )
+ {
+ char const newValue = ((param->qualQuant && param->qualQuantSingle)?param->qualQuantSingle:30) + 33;
+ rc = BufferedWriter( NULL, &newValue, 1, NULL );
+ }
+ }
+ else if ( reverse || quantize )
+ {
+ unsigned i;
+
+ for ( i = 0; rc == 0 && i < count; ++i )
+ {
+ char const qual = quality[ reverse ? ( count - i - 1 ) : i ];
+ char const newValue = quantize ? param->qualQuant[ qual - 33 ] + 33 : qual;
+
+ rc = BufferedWriter( NULL, &newValue, 1, NULL );
+ }
+ }
+ else
+ {
+ rc = BufferedWriter( NULL, quality, count, NULL );
+ }
+ return rc;
+}
+
+
+static rc_t DumpUnalignedFastX( const SCol cols[], uint32_t read_id, INSDC_coord_zero readStart, INSDC_coord_len readLen, int64_t row_id )
+{
+ /* fast[AQ] represnted in SAM fields:
+ [@|>]QNAME unaligned
+ SEQ
+ +
+ QUAL
+ */
+ rc_t rc = BufferedWriter( NULL, param->fastq ? "@" : ">", 1, NULL );
+
+ /* QNAME: [PFX.]SEQUENCE:NAME[#SPOT_GROUP] */
+ if ( rc == 0 )
+ rc = DumpName( cols[ seq_NAME ].base.str, cols[ seq_NAME ].len, '#',
+ cols[ seq_SPOT_GROUP ].base.str, cols[ seq_SPOT_GROUP ].len, row_id );
+ if ( rc == 0 && read_id > 0 )
+ {
+ rc = KOutMsg( "/%u", read_id );
+ }
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, " unaligned\n", 11, NULL );
+
+ /* SEQ: SEQUENCE.READ */
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, &cols[ seq_READ ].base.str[readStart], readLen, NULL );
+ if ( rc == 0 && param->fastq )
+ {
+ /* QUAL: SEQUENCE.QUALITY */
+ rc = BufferedWriter( NULL, "\n+\n", 3, NULL );
+ if ( rc == 0 )
+ rc = DumpQuality( &cols[ seq_QUALITY ].base.str[ readStart ], readLen, false, param->quantizeQual );
+ }
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\n", 1, NULL );
+ return rc;
+}
+
+
+static rc_t DumpAlignedFastX( const SCol cols[], int64_t const alignId, uint32_t read_id, bool primary, bool secondary )
+{
+ rc_t rc = 0;
+ size_t nm;
+ unsigned readId;
+ unsigned const nreads = cols[ alg_READ_LEN ].len;
+
+ for ( readId = 0; readId < nreads && rc == 0 ; ++readId )
+ {
+ char const *qname = cols[ alg_SEQ_NAME ].base.str;
+ size_t qname_len = cols[ alg_SEQ_NAME ].len;
+ char synth_qname[ 40 ];
+ int64_t const spot_id = cols[alg_SEQ_SPOT_ID].len > 0 ? cols[alg_SEQ_SPOT_ID].base.i64[0] : 0;
+ char const *const read = cols[ alg_READ ].base.str + cols[ alg_READ_START ].base.coord0[ readId ];
+ char const *const qual = cols[ alg_SAM_QUALITY ].base.v
+ ? cols[ alg_SAM_QUALITY ].base.str + cols[ alg_READ_START ].base.coord0[ readId ]
+ : NULL;
+ unsigned const readlen = cols[ alg_READ_LEN ].base.coord_len[ readId ];
+
+ /* fast[AQ] represnted in SAM fields:
+ [@|>]QNAME primary|secondary ref=RNAME pos=POS mapq=MAPQ
+ SEQ
+ +
+ QUAL
+ */
+ rc = BufferedWriter( NULL, param->fastq ? "@" : ">", 1, NULL );
+ /* QNAME: [PFX.]SEQ_NAME[#SPOT_GROUP] */
+ if ( qname_len == 0 || qname == NULL )
+ {
+ string_printf( synth_qname, sizeof( synth_qname ), &qname_len, "%li.%u", alignId, readId + 1 );
+ qname = synth_qname;
+ }
+ nm = cols[ alg_SPOT_GROUP ].len ? alg_SPOT_GROUP : alg_SEQ_SPOT_GROUP;
+ if ( rc == 0 )
+ rc = DumpName( qname, qname_len, '.', cols[ nm ].base.str, cols[ nm ].len, spot_id);
+
+ if ( rc == 0 && read_id > 0 )
+ rc = KOutMsg( "/%u", read_id );
+
+ if ( rc == 0 )
+ {
+ if ( primary )
+ {
+ rc = BufferedWriter( NULL, " primary", 8, NULL );
+ }
+ else if ( secondary )
+ {
+ rc = BufferedWriter( NULL, " secondary", 10, NULL );
+ }
+ }
+
+ /* RNAME: REF_NAME or REF_SEQ_ID */
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, " ref=", 5, NULL );
+ if ( rc == 0 )
+ {
+ if ( param->use_seqid )
+ {
+ rc = BufferedWriter( NULL, cols[ alg_REF_SEQ_ID ].base.str, cols[ alg_REF_SEQ_ID ].len, NULL );
+ }
+ else
+ {
+ rc = BufferedWriter( NULL, cols[ alg_REF_NAME ].base.str, cols[ alg_REF_NAME ].len, NULL );
+ }
+ }
+
+ /* POS: REF_POS, MAPQ: MAPQ */
+ if ( rc == 0 )
+ rc = KOutMsg( " pos=%u mapq=%i\n", cols[ alg_REF_POS ].base.coord0[ 0 ] + 1, cols[ alg_MAPQ ].base.i32[ 0 ] );
+
+ /* SEQ: READ */
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, read, readlen, NULL );
+ if ( rc == 0 && param->fastq )
+ {
+ /* QUAL: SAM_QUALITY */
+ rc = BufferedWriter( NULL, "\n+\n", 3, NULL );
+ if ( rc == 0 )
+ rc = DumpQuality( qual, readlen, false, param->quantizeQual );
+ }
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\n", 1, NULL );
+ }
+ return rc;
+}
+
+
+static
+rc_t DumpUnalignedSAM( const SCol cols[], uint32_t flags, INSDC_coord_zero readStart, INSDC_coord_len readLen,
+ char const *rnext, uint32_t rnext_len, INSDC_coord_zero pnext, char const readGroup[], int64_t row_id )
+{
+ unsigned i;
+
+ /* QNAME: [PFX.]NAME[.SPOT_GROUP] */
+ rc_t rc = DumpName( cols[ seq_NAME ].base.str, cols[ seq_NAME ].len, '.',
+ cols[ seq_SPOT_GROUP ].base.str, cols[ seq_SPOT_GROUP ].len, row_id );
+
+ /* all these fields are const text for now */
+ if ( rc == 0 )
+ rc = KOutMsg( "\t%u\t*\t0\t0\t*\t%.*s\t%u\t0\t",
+ flags, rnext_len ? rnext_len : 1, rnext_len ? rnext : "*", pnext );
+ /* SEQ: SEQUENCE.READ */
+ if ( flags & 0x10 )
+ {
+ for( i = 0; i < readLen && rc == 0; i++ )
+ {
+ char base;
+
+ DNAReverseCompliment( &cols[ seq_READ ].base.str[ readStart + readLen - 1 - i ], &base, 1 );
+ rc = BufferedWriter( NULL, &base, 1, NULL );
+ }
+ }
+ else
+ {
+ rc = BufferedWriter( NULL, &cols[ seq_READ ].base.str[ readStart ], readLen, NULL );
+ }
+
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\t", 1, NULL );
+ /* QUAL: SEQUENCE.QUALITY */
+ if ( rc == 0 )
+ rc = DumpQuality( &cols[ seq_QUALITY ].base.str[ readStart ], readLen, flags & 0x10, param->quantizeQual );
+
+ /* optional fields: */
+ if ( rc == 0 )
+ {
+ if ( readGroup )
+ {
+ rc = BufferedWriter( NULL, "\tRG:Z:", 6, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, readGroup, string_size( readGroup ), NULL );
+ }
+ else if ( cols[ seq_SPOT_GROUP ].len > 0 )
+ {
+ /* read group */
+ rc = BufferedWriter( NULL, "\tRG:Z:", 6, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, cols[ seq_SPOT_GROUP ].base.str, cols[ seq_SPOT_GROUP ].len, NULL );
+ }
+ }
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\n", 1, NULL );
+ return rc;
+}
+
+
+static
+rc_t DumpAlignedSAM( SAM_dump_ctx_t *const ctx,
+ DataSource const *ds,
+ int64_t alignId,
+ char const readGroup[],
+ int type)
+{
+ rc_t rc = 0;
+ unsigned const nreads = ds->cols[ alg_READ_LEN ].len;
+ SCol const *const cols = ds->cols;
+ int64_t const spot_id = cols[alg_SEQ_SPOT_ID].len > 0 ? cols[alg_SEQ_SPOT_ID].base.i64[0] : 0;
+ INSDC_coord_one const read_id = cols[alg_SEQ_READ_ID].len > 0 ? cols[alg_SEQ_READ_ID].base.coord1[0] : 0;
+ INSDC_SRA_read_filter const *align_filter = cols[alg_READ_FILTER].len == nreads ? cols[alg_READ_FILTER].base.read_filter : NULL;
+ INSDC_SRA_read_filter seq_filter = 0;
+ unsigned readId;
+ unsigned cigOffset = 0;
+
+ if ( align_filter == NULL && spot_id && read_id && ctx->seq.cols )
+ {
+ rc_t rc;
+
+ rc = Cursor_Read(&ctx->seq, spot_id, seq_READ_FILTER, 1);
+ if (rc == 0 && ctx->seq.cols[seq_READ_FILTER].len >= read_id)
+ seq_filter = ctx->seq.cols[seq_READ_FILTER].base.read_filter[read_id - 1];
+ }
+
+ for ( readId = 0; readId < nreads && rc == 0 ; ++readId )
+ {
+ char const *qname = cols[ alg_SEQ_NAME ].base.str;
+ size_t qname_len = cols[ alg_SEQ_NAME ].len;
+ char const *const read = cols[ alg_READ ].base.str + cols[ alg_READ_START ].base.coord0[ readId ];
+ char const *const qual = cols[ alg_SAM_QUALITY ].base.v
+ ? cols[ alg_SAM_QUALITY ].base.str + cols[ alg_READ_START ].base.coord0[ readId ]
+ : NULL;
+ unsigned const readlen = nreads > 1 ? cols[ alg_READ_LEN ].base.coord_len[ readId ] : cols[ alg_READ ].len;
+ unsigned const sflags = cols[ alg_SAM_FLAGS ].base.v ? cols[ alg_SAM_FLAGS ].base.u32[ readId ] : 0;
+ INSDC_SRA_read_filter const filt = align_filter ? align_filter[readId] : seq_filter;
+ unsigned const flags = (sflags & ~((unsigned)0x200)) | ((filt == SRA_READ_FILTER_REJECT) ? 0x200 : 0);
+ char const *const cigar = cols[ alg_CIGAR ].base.str + cigOffset;
+ unsigned const cigLen = nreads > 1 ? cols[ alg_CIGAR_LEN ].base.coord_len[ readId ] : cols[ alg_CIGAR ].len;
+ size_t nm;
+ char synth_qname[1024];
+
+ cigOffset += cigLen;
+ if ( qname_len == 0 || qname == NULL )
+ {
+ string_printf( synth_qname, sizeof( synth_qname ), &qname_len, "ALLELE_%li.%u", alignId, readId + 1 );
+ qname = synth_qname;
+ }
+ else if (ds->type == edstt_EvidenceAlignment) {
+ string_printf( synth_qname, sizeof( synth_qname ), &qname_len, "%u/ALLELE_%li.%u", spot_id, cols[ alg_REF_ID ].base.i64[ readId ], cols[ alg_REF_PLOIDY ].base.u32[ readId ] );
+ qname = synth_qname;
+ }
+ nm = cols[ alg_SPOT_GROUP ].len ? alg_SPOT_GROUP : alg_SEQ_SPOT_GROUP;
+ rc = DumpName( qname, qname_len, '.', cols[ nm ].base.str, cols[ nm ].len, spot_id );
+
+ /* FLAG: SAM_FLAGS */
+ if ( rc == 0 )
+ {
+ if ( ds->type == edstt_EvidenceAlignment )
+ {
+ bool const cmpl = cols[alg_REVERSED].base.v && readId < cols[alg_REVERSED].len ? cols[alg_REVERSED].base.tf[readId] : false;
+ rc = KOutMsg( "\t%u\t", 1 | (cmpl ? 0x10 : 0) | (read_id == 1 ? 0x40 : 0x80) );
+ }
+ else if ( !param->unaligned /** not going to dump unaligned **/
+ && ( flags & 0x1 ) /** but we have sequenced multiple fragments **/
+ && ( flags & 0x8 ) ) /** and not all of them align **/
+ {
+ /*** remove flags talking about multiple reads **/
+ /* turn off 0x001 0x008 0x040 0x080 */
+ rc = KOutMsg( "\t%u\t", flags & ~0xC9 );
+ }
+ else
+ {
+ rc = KOutMsg( "\t%u\t", flags );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( ds->type == edstt_EvidenceAlignment && type == 0 )
+ {
+ rc = KOutMsg( "ALLELE_%li.%u", cols[ alg_REF_ID ].base.i64[ readId ], cols[ alg_REF_PLOIDY ].base.u32[ readId ] );
+ }
+ else
+ {
+ /* RNAME: REF_NAME or REF_SEQ_ID */
+ if ( param->use_seqid )
+ rc = BufferedWriter( NULL, cols[ alg_REF_SEQ_ID ].base.str, cols[ alg_REF_SEQ_ID ].len, NULL );
+ else
+ rc = BufferedWriter( NULL, cols[ alg_REF_NAME ].base.str, cols[ alg_REF_NAME ].len, NULL );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\t", 1, NULL );
+
+ /* POS: REF_POS */
+ if ( rc == 0 )
+ rc = KOutMsg( "%i\t", cols[ alg_REF_POS ].base.coord0[ 0 ] + 1 );
+
+ /* MAPQ: MAPQ */
+ if ( rc == 0 )
+ rc = KOutMsg( "%i\t", cols[ alg_MAPQ ].base.i32[ 0 ] );
+
+ /* CIGAR: CIGAR_* */
+ if ( ds->type == edstt_EvidenceInterval )
+ {
+ unsigned i;
+
+ for ( i = 0; i != cigLen && rc == 0; ++i )
+ {
+ char ch = cigar[i];
+ if ( ch == 'S' ) ch = 'I';
+ rc = BufferedWriter(NULL, &ch, 1, NULL);
+ }
+ }
+ else if(ds->type == edstt_EvidenceAlignment)
+ {
+ rc = cg_canonical_print_cigar(cigar,cigLen);
+ }
+ else
+ {
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, cigar, cigLen, NULL );
+ }
+
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\t", 1, NULL );
+
+ /* RNEXT: MATE_REF_NAME or '*' */
+ /* PNEXT: MATE_REF_POS or 0 */
+ if ( rc == 0 )
+ {
+ if ( cols[ alg_MATE_REF_NAME ].len )
+ {
+ if ( cols[ alg_MATE_REF_NAME ].len == cols[ alg_REF_NAME ].len &&
+ memcmp( cols[ alg_MATE_REF_NAME ].base.str, cols[ alg_REF_NAME ].base.str, cols[ alg_MATE_REF_NAME ].len ) == 0 )
+ {
+ rc = BufferedWriter( NULL, "=\t", 2, NULL );
+ }
+ else
+ {
+ rc = BufferedWriter( NULL, cols[ alg_MATE_REF_NAME ].base.str, cols[ alg_MATE_REF_NAME ].len, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\t", 1, NULL );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "%u\t", cols[ alg_MATE_REF_POS ].base.coord0[ 0 ] + 1 );
+ }
+ else
+ {
+ rc = BufferedWriter( NULL, "*\t0\t", 4, NULL );
+ }
+ }
+
+ /* TLEN: TEMPLATE_LEN */
+ if ( rc == 0 )
+ rc = KOutMsg( "%i\t", cols[ alg_TEMPLATE_LEN ].base.v ? cols[ alg_TEMPLATE_LEN ].base.i32[ 0 ] : 0 );
+
+ /* SEQ: READ */
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, read, readlen, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, "\t", 1, NULL );
+
+ /* QUAL: SAM_QUALITY */
+ if ( rc == 0 )
+ rc = DumpQuality( qual, readlen, false, param->quantizeQual );
+
+ /* optional fields: */
+ if ( rc == 0 && ds->type == edstt_EvidenceInterval )
+ rc = KOutMsg( "\tRG:Z:ALLELE_%u", readId + 1 );
+
+ if ( rc == 0 )
+ {
+ if ( readGroup )
+ {
+ rc = BufferedWriter( NULL, "\tRG:Z:", 6, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, readGroup, string_size( readGroup ), NULL );
+ }
+ else if ( cols[ alg_SPOT_GROUP ].len > 0 )
+ {
+ /* read group */
+ rc = BufferedWriter( NULL, "\tRG:Z:", 6, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, cols[ alg_SPOT_GROUP ].base.str, cols[ alg_SPOT_GROUP ].len, NULL );
+ }
+ else if ( cols[ alg_SEQ_SPOT_GROUP ].len > 0 )
+ {
+ /* backward compatibility */
+ rc = BufferedWriter( NULL, "\tRG:Z:", 6, NULL );
+ if ( rc == 0 )
+ rc = BufferedWriter( NULL, cols[ alg_SEQ_SPOT_GROUP ].base.str, cols[ alg_SEQ_SPOT_GROUP ].len, NULL );
+ }
+ }
+
+ if ( rc == 0 && param->cg_style > 0 && cols[ alg_CG_TAGS_STR ].len > 0 )
+ rc = BufferedWriter( NULL, cols[ alg_CG_TAGS_STR ].base.str, cols[ alg_CG_TAGS_STR ].len, NULL );
+
+ if ( rc == 0 )
+ {
+ if ( param->cg_style > 0 && cols[ alg_ALIGN_GROUP ].len > 0 )
+ {
+ char const *ZI = cols[ alg_ALIGN_GROUP ].base.str;
+ unsigned i;
+
+ for ( i = 0; rc == 0 && i < cols[ alg_ALIGN_GROUP ].len - 1; ++i )
+ {
+ if ( ZI[ i ] == '_' )
+ {
+ rc = KOutMsg( "\tZI:i:%.*s\tZA:i:%.1s", i, ZI, ZI + i + 1 );
+ break;
+ }
+ }
+ }
+ else if ( ds->type == edstt_EvidenceAlignment && type == 1 )
+ {
+ rc = KOutMsg( "\tZI:i:%li\tZA:i:%u", cols[ alg_REF_ID ].base.i64[ readId ], cols[ alg_REF_PLOIDY ].base.u32[ readId ] );
+ }
+ }
+
+ /* align id */
+ if ( rc == 0 && param->xi )
+ rc = KOutMsg( "\tXI:i:%li", alignId );
+
+ /* hit count */
+ if ( rc == 0 && cols[alg_ALIGNMENT_COUNT].len )
+ rc = KOutMsg( "\tNH:i:%i", (int)cols[ alg_ALIGNMENT_COUNT ].base.u8[ readId ] );
+
+ /* edit distance */
+ if ( rc == 0 && cols[ alg_EDIT_DISTANCE ].len )
+ rc = KOutMsg( "\tNM:i:%i", cols[ alg_EDIT_DISTANCE ].base.i32[ readId ] );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+
+static rc_t DumpUnalignedReads( SAM_dump_ctx_t *const ctx, SCol const calg_col[], int64_t row_id, uint64_t* rcount )
+{
+ rc_t rc = 0;
+ uint32_t i, nreads = 0;
+
+ if ( calg_col != NULL )
+ {
+ if ( calg_col[ alg_SAM_FLAGS ].base.u32[ 0 ] & 0x02 )
+ {
+ /* skip all aligned rows by flag */
+ return rc;
+ }
+ /* get primary alignments only */
+ rc = Cursor_Read( &ctx->seq, calg_col[ alg_SEQ_SPOT_ID ].base.i64[ 0 ], seq_PRIMARY_ALIGNMENT_ID, ~(unsigned)0 );
+ if ( rc == 0 )
+ {
+ for ( i = 0; i < ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].len; i++ )
+ {
+ if ( ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[ i ] != 0 )
+ {
+ if ( ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[ i ] < row_id )
+ {
+ /* unaligned were printed with 1st aligment */
+ return rc;
+ }
+ }
+ else
+ {
+ nreads++;
+ }
+ }
+ if ( nreads == ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].len )
+ {
+ /* skip all aligned rows by actual data, if flag above is not set properly */
+ return rc;
+ }
+ row_id = calg_col[ alg_SEQ_SPOT_ID ].base.i64[ 0 ];
+ }
+ }
+ if ( rc == 0 )
+ {
+ rc = Cursor_Read( &ctx->seq, row_id, 0, ~(unsigned)0 );
+ if ( rc == 0 )
+ {
+ unsigned non_empty_reads = 0;
+
+ nreads = ctx->seq.cols[ seq_READ_LEN ].idx != 0 ? ctx->seq.cols[ seq_READ_LEN ].len : 1;
+
+ for( i = 0; i < nreads; i++ ) {
+ unsigned const readLen = ctx->seq.cols[ seq_READ_LEN ].idx
+ ? ctx->seq.cols[ seq_READ_LEN ].base.coord_len[ i ]
+ : 0;
+
+ if (readLen)
+ ++non_empty_reads;
+ }
+ for( i = 0; i < nreads; i++ )
+ {
+ INSDC_coord_zero readStart;
+ INSDC_coord_len readLen;
+
+ if ( ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].idx != 0 &&
+ ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[ i ] != 0 )
+ {
+ continue;
+ }
+
+ if ( ctx->seq.cols[ seq_READ_TYPE ].idx != 0 &&
+ !( ctx->seq.cols[ seq_READ_TYPE ].base.read_type[ i ] & SRA_READ_TYPE_BIOLOGICAL ) )
+ {
+ continue;
+ }
+
+ readLen = ctx->seq.cols[ seq_READ_LEN ].idx ?
+ ctx->seq.cols[ seq_READ_LEN ].base.coord_len[ i ] :
+ ctx->seq.cols[ seq_READ ].len;
+ if ( readLen == 0 )
+ {
+ continue;
+ }
+
+ readStart = ctx->seq.cols[ seq_READ_START ].idx ?
+ ctx->seq.cols[ seq_READ_START ].base.coord0[ i ] :
+ 0;
+ if ( param->fasta || param->fastq )
+ {
+ rc = DumpUnalignedFastX( ctx->seq.cols, nreads > 1 ? i + 1 : 0, readStart, readLen, row_id );
+ }
+ else
+ {
+ uint32_t cflags = 0x4;
+ if ( param->reverse_unaligned )
+ {
+ if ( ctx->seq.cols[ seq_READ_TYPE ].base.read_type[ i ] & SRA_READ_TYPE_REVERSE )
+ {
+ cflags |= 0x10;
+ }
+ if ( ctx->seq.cols[ seq_READ_TYPE ].base.read_type[ i == nreads - 1 ? 0 : ( i + 1 ) ] & SRA_READ_TYPE_REVERSE )
+ {
+ cflags |= 0x20;
+ }
+ }
+ if ( ctx->seq.cols[ seq_READ_FILTER ].idx != 0 )
+ {
+ if ( ctx->seq.cols[ seq_READ_FILTER ].base.read_filter[ i ] == SRA_READ_FILTER_REJECT )
+ {
+ cflags |= 0x200;
+ }
+ else if ( ctx->seq.cols[ seq_READ_FILTER ].base.read_filter[ i ] == SRA_READ_FILTER_CRITERIA )
+ {
+ cflags |= 0x400;
+ }
+ }
+ if ( calg_col == NULL )
+ {
+ rc = DumpUnalignedSAM( ctx->seq.cols, cflags |
+ ( non_empty_reads > 1 ? ( 0x1 | 0x8 | ( i == 0 ? 0x40 : 0x00 ) | ( i == nreads - 1 ? 0x80 : 0x00 ) ) : 0x00 ),
+ readStart, readLen, NULL, 0, 0, ctx->readGroup, row_id );
+ }
+ else
+ {
+ int c = param->use_seqid ? alg_REF_SEQ_ID : alg_REF_NAME;
+ uint16_t flags = cflags | 0x1 |
+ ( ( calg_col[ alg_SAM_FLAGS ].base.u32[ 0 ] & 0x10 ) << 1 ) |
+ ( ( calg_col[ alg_SAM_FLAGS ].base.u32[ 0 ] & 0x40 ) ? 0x80 : 0x40 );
+ rc = DumpUnalignedSAM( ctx->seq.cols, flags, readStart, readLen,
+ calg_col[ c ].base.str, calg_col[ c ].len,
+ calg_col[ alg_REF_POS ].base.coord0[ 0 ] + 1, ctx->readGroup, row_id );
+ }
+ }
+ *rcount = *rcount + 1;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static bool AlignRegionFilter( SCol const *cols )
+{
+ if ( param->region_qty == 0 )
+ return true;
+ if ( cols[ alg_REF_NAME ].len != 0 || cols[ alg_REF_SEQ_ID ].len != 0 )
+ {
+ unsigned i;
+
+ assert( cols[ alg_REF_POS ].len == cols[ alg_REF_LEN ].len );
+
+ for ( i = 0; i < param->region_qty; i++ )
+ {
+ unsigned j;
+
+ for ( j = 0; j < cols[ alg_REF_POS ].len; j++ )
+ {
+ unsigned const refStart_zero = cols[ alg_REF_POS ].base.coord0[ j ];
+ unsigned const refEnd_exclusive = refStart_zero + cols[ alg_REF_LEN ].base.coord_len[ j ];
+ unsigned k;
+
+ for ( k = 0; k < param->region[ i ].rq; k++ )
+ {
+ unsigned const from_zero = param->region[ i ].r[ k ].from;
+ unsigned const to_inclusive = param->region[ i ].r[ k ].to;
+
+ if ( from_zero < refEnd_exclusive && refStart_zero <= to_inclusive )
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+static bool AlignDistanceFilter( SCol const *cols )
+{
+ if ( param->mp_dist_qty != 0 || param->mp_dist_unknown )
+ {
+ if ( cols[ alg_TEMPLATE_LEN ].len == 0 && param->mp_dist_unknown )
+ {
+ return true;
+ }
+ else
+ {
+ uint32_t i, j;
+ for( i = 0; i < param->mp_dist_qty; i++ )
+ {
+ for( j = 0; j < cols[ alg_TEMPLATE_LEN ].len; j++ )
+ {
+ if ( ( cols[ alg_TEMPLATE_LEN ].base.i32[ j ] == 0 && param->mp_dist_unknown ) ||
+ ( param->mp_dist[ i ].from <= cols[ alg_TEMPLATE_LEN ].base.i32[ j ] &&
+ cols[ alg_TEMPLATE_LEN ].base.i32[ j ] <= param->mp_dist[ i ].to ) )
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+ return true;
+}
+
+
+typedef struct cgOp_s
+{
+ uint16_t length;
+ uint8_t type; /* 0: match, 1: insert, 2: delete */
+ char code;
+} cgOp;
+
+
+static void print_CG_cigar( int line, cgOp const op[], unsigned const ops, unsigned const gap[ 3 ] )
+{
+#if _DEBUGGING
+ unsigned i;
+
+ SAM_DUMP_DBG( 3, ( "%5i: ", line ) );
+ for ( i = 0; i < ops; ++i )
+ {
+ if ( gap && ( i == gap[ 0 ] || i == gap[ 1 ] || i == gap[ 2 ] ) )
+ {
+ SAM_DUMP_DBG( 3, ( "%u%c", op[ i ].length, tolower( op[ i ].code ) ) );
+ }
+ else
+ {
+ SAM_DUMP_DBG( 3, ( "%u%c", op[ i ].length, toupper( op[ i ].code ) ) );
+ }
+ }
+ SAM_DUMP_DBG( 3, ( "\n" ) );
+#endif
+}
+
+/* gap contains the indices of the wobbles in op
+ * gap[0] is between read 1 and 2; it is the 'B'
+ * gap[1] is between read 2 and 3; it is an 'N'
+ * gap[2] is between read 3 and 4; it is an 'N'
+ */
+
+static rc_t CIGAR_to_CG_Ops( cgOp op[], unsigned const maxOps,
+ unsigned *const opCnt,
+ unsigned gap[ 3 ],
+ char const cigar[], unsigned const ciglen,
+ unsigned *const S_adjust,
+ unsigned *const CG_adjust,
+ unsigned const read,
+ bool const reversed,
+ bool * has_ref_offset_type)
+{
+ unsigned i;
+ unsigned ops = 0;
+ unsigned gapno;
+
+ *opCnt = 0;
+ *S_adjust = 0;
+ for ( i = 0; i < ciglen; ++ops )
+ {
+ char opChar=0;
+ int opLen=0;
+ int n;
+
+ for(n=0;n+i<ciglen && isdigit(cigar[n+i]);n++){
+ opLen = opLen * 10 + cigar[n+i] - '0';
+ }
+ if(n+i<ciglen){
+ opChar = cigar[n+i];
+ n++;
+ }
+ if ( ops + 1 >= maxOps )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+
+ i += n;
+
+ op[ ops ].length = opLen;
+ op[ ops ].code = opChar;
+ switch ( opChar )
+ {
+ case 'M':
+ case '=':
+ case 'X':
+ op[ ops ].type = 0;
+ break;
+ case 'S':
+ *S_adjust += opLen;
+ case 'I':
+ op[ ops ].type = 1;
+ op[ ops ].code = 'I';
+ break;
+ case 'N':
+ *has_ref_offset_type=true;
+ case 'D':
+ op[ ops ].type = 2;
+ break;
+ default:
+ return RC( rcExe, rcData, rcReading, rcConstraint, rcViolated );
+ }
+ }
+ *opCnt = ops;
+ gap[ 0 ] = gap[ 1 ] = gap[ 2 ] = ops;
+ print_CG_cigar( __LINE__, op, ops, NULL );
+ if ( ops < 3 )
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+
+ {
+ unsigned fwd = 0; /* 5 10 10 10 */
+ unsigned rev = 0; /* 10 10 10 5 */
+ unsigned acc; /* accumulated length */
+
+ if ( ( read == 1 && !reversed ) || ( read == 2 && reversed ) )
+ {
+ for ( i = 0, acc = 0; i < ops && acc <=5; ++i )
+ {
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc == 5 && op[ i + 1 ].type == 1 )
+ {
+ fwd = i + 1;
+ break;
+ }
+ else if ( acc > 5 )
+ {
+ unsigned const right = acc - 5;
+ unsigned const left = op[ i ].length - right;
+
+ memmove( &op[ i + 2 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 2;
+ op[ i ].length = left;
+ op[ i + 2 ].length = right;
+
+ op[ i + 1 ].type = 1;
+ op[ i + 1 ].code = 'B';
+ op[ i + 1 ].length = 0;
+
+ fwd = i + 1;
+ break;
+ }
+ }
+ }
+ }
+ else if ( ( read == 2 && !reversed ) || ( read == 1 && reversed ) )
+ {
+ for ( i = ops, acc = 0; i > 0 && acc <= 5; )
+ {
+ --i;
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc == 5 && op[ i ].type == 1 )
+ {
+ rev = i;
+ break;
+ }
+ else if ( acc > 5 )
+ {
+ unsigned const left = acc - 5;
+ unsigned const right = op[ i ].length - left;
+
+ memmove( &op[ i + 2 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 2;
+ op[ i ].length = left;
+ op[ i + 2 ].length = right;
+
+ op[ i + 1 ].type = 1;
+ op[ i + 1 ].code = 'B';
+ op[ i + 1 ].length = 0;
+
+ rev = i + 1;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* fprintf(stderr, "guessing layout\n"); */
+ for ( i = 0, acc = 0; i < ops && acc <= 5; ++i )
+ {
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc == 5 && op[ i + 1 ].type == 1 )
+ {
+ fwd = i + 1;
+ }
+ }
+ }
+ for ( i = ops, acc = 0; i > 0 && acc <= 5; )
+ {
+ --i;
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc == 5 && op[i].type == 1 )
+ {
+ rev = i;
+ }
+ }
+ }
+ if ( ( fwd == 0 && rev == 0 ) || ( fwd != 0 && rev != 0 ) )
+ {
+ if(!(*has_ref_offset_type)) for ( i = 0; i < ops; ++i )
+ {
+ if ( op[ i ].type == 2 )
+ {
+ op[ i ].code = 'N';
+ *CG_adjust += op[ i ].length;
+ }
+ }
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+ }
+ }
+ if ( fwd && op[ fwd ].type == 1 )
+ {
+ for ( i = ops, acc = 0; i > fwd + 1; )
+ {
+ --i;
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc >= 10 )
+ {
+ if ( acc > 10 )
+ {
+ unsigned const r = 10 + op[ i ].length - acc;
+ unsigned const l = op[ i ].length - r;
+
+ if ( ops + 2 >= maxOps )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &op[ i + 2 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 2;
+ op[ i + 2 ].length = r;
+ op[ i ].length = l;
+
+ op[ i + 1 ].length = 0;
+ op[ i + 1 ].type = 2;
+ op[ i + 1 ].code = 'N';
+ i += 2;
+ }
+ else if ( i - 1 > fwd )
+ {
+ if ( op[ i - 1 ].type == 2 )
+ op[ i - 1 ].code = 'N';
+ else
+ {
+ if ( ops + 1 >= maxOps )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &op[ i + 1 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 1;
+ op[ i ].length = 0;
+ op[ i ].type = 2;
+ op[ i ].code = 'N';
+ i += 1;
+ }
+ }
+ acc = 0;
+ }
+ }
+ }
+ /** change I to B+M **/
+ op[ fwd ].code = 'B';
+ memmove( &op[ fwd + 1 ], &op[ fwd ], ( ops - fwd ) * sizeof( op[ 0 ] ) );
+ ops += 1;
+ op[ fwd + 1 ].code = 'M';
+ *opCnt = ops;
+ /** set the gaps now **/
+ for ( gapno = 3, i = ops; gapno > 1 && i > 0; )
+ {
+ --i;
+ if ( op[ i ].code == 'N' )
+ gap[ --gapno ] = i;
+ }
+ gap[ 0 ] = fwd;
+ print_CG_cigar( __LINE__, op, ops, gap );
+ return 0;
+ }
+ if ( rev && op[ rev ].type == 1 )
+ {
+ for ( acc = i = 0; i < rev; ++i )
+ {
+ if ( op[ i ].type != 2 )
+ {
+ acc += op[ i ].length;
+ if ( acc >= 10 )
+ {
+ if ( acc > 10 )
+ {
+ unsigned const l = 10 + op[ i ].length - acc;
+ unsigned const r = op[ i ].length - l;
+
+ if ( ops + 2 >= maxOps )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &op[ i + 2 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 2;
+ op[ i + 2 ].length = r;
+ op[ i ].length = l;
+
+ op[ i + 1 ].length = 0;
+ op[ i + 1 ].type = 2;
+ op[ i + 1 ].code = 'N';
+ rev += 2;
+ i += 2;
+ }
+ else if ( i + 1 < rev )
+ {
+ if ( op[ i + 1 ].type == 2)
+ op[ i + 1 ].code = 'N';
+ else
+ {
+ if ( ops + 1 >= maxOps )
+ return RC( rcExe, rcData, rcReading, rcBuffer, rcInsufficient );
+ memmove( &op[ i + 1 ], &op[ i ], ( ops - i ) * sizeof( op[ 0 ] ) );
+ ops += 1;
+ op[ i + 1 ].length = 0;
+ op[ i + 1 ].type = 2;
+ op[ i + 1 ].code = 'N';
+ rev += 1;
+ i += 1;
+ }
+ }
+ acc = 0;
+ }
+ }
+ }
+ for ( gapno = 3, i = 0; gapno > 1 && i < ops; ++i )
+ {
+ if ( op[ i ].code == 'N' )
+ gap[ --gapno ] = i;
+ }
+ gap[ 0 ] = rev;
+ op[ rev ].code = 'B';
+ memmove( &op[ rev + 1 ], &op[ rev ], ( ops - rev ) * sizeof( op[ 0 ] ) );
+ ops += 1;
+ op[ rev + 1 ].code = 'M';
+ *opCnt = ops;
+ print_CG_cigar( __LINE__, op, ops, gap );
+ return 0;
+ }
+ }
+ return RC( rcExe, rcData, rcReading, rcFormat, rcNotFound ); /* CG pattern not found */
+}
+
+
+static rc_t GenerateCGData( SCol cols[], unsigned style )
+{
+ rc_t rc = 0;
+
+ memset( &cols[ alg_CG_TAGS_STR], 0, sizeof( cols[ alg_CG_TAGS_STR ] ) );
+
+ if ( cols[ alg_READ ].len == 35 && cols[ alg_SAM_QUALITY ].len == 35 )
+ {
+ static char newCIGAR[ 35 * 11 ];
+ static int32_t newEditDistance;
+ unsigned gap[ 3 ] = { 0, 0, 0 };
+ cgOp cigOp[ 35 ];
+ unsigned opCnt;
+ unsigned i;
+ unsigned j;
+ size_t sz;
+ unsigned S_adjust = 0;
+ unsigned CG_adjust = 0;
+ unsigned const read = cols[ alg_SEQ_READ_ID ].len && cols[ alg_REVERSED ].len ? cols[ alg_SEQ_READ_ID ].base.coord1[ 0 ] : 0;
+ bool const reversed = cols[ alg_REVERSED ].len ? cols[ alg_REVERSED ].base.u8[ 0 ] : false;
+ bool has_ref_offset_type = false;
+
+ rc = CIGAR_to_CG_Ops( cigOp, sizeof( cigOp ) / sizeof( cigOp[ 0 ] ), &opCnt, gap,
+ cols[ alg_CIGAR ].base.str, cols[ alg_CIGAR ].len,
+ &S_adjust, &CG_adjust, read, reversed, &has_ref_offset_type );
+ if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcFormat )
+ {
+ rc = 0;
+ if ( style == 1 )
+ goto CLEAN_CIGAR;
+ else
+ goto PRINT_CIGAR;
+ }
+ if ( rc != 0 )
+ return 0;
+
+ if ( !has_ref_offset_type && CG_adjust == 0 )
+ CG_adjust = ( gap[ 0 ] < opCnt ? cigOp[ gap[ 0 ] ].length : 0 )
+ + ( gap[ 1 ] < opCnt ? cigOp[ gap[ 1 ] ].length : 0 )
+ + ( gap[ 2 ] < opCnt ? cigOp[ gap[ 2 ] ].length : 0 );
+
+ print_CG_cigar( __LINE__, cigOp, opCnt, NULL );
+ if ( style == 1 )
+ {
+ static char newSeq[ 35 ];
+ static char newQual[ 35 ];
+ static char tags[ 35*22 + 1 ];
+ unsigned const B_len = cigOp[ gap[ 0 ] ].length;
+ unsigned const B_at = gap[ 0 ] < gap[ 2 ] ? 5 : 30;
+
+ if ( 0 < B_len && B_len < 5 )
+ {
+ memmove( newSeq, cols[ alg_READ ].base.v, 35 );
+ memmove( newQual, cols[ alg_SAM_QUALITY ].base.v, 35 );
+
+ cols[ alg_CG_TAGS_STR ].base.v = tags;
+
+ cols[ alg_READ ].base.v = newSeq;
+ cols[ alg_READ ].len = 35 - B_len;
+
+ cols[ alg_SAM_QUALITY ].base.v = newQual;
+ cols[ alg_SAM_QUALITY ].len = 35 - B_len;
+
+ /* nBnM -> nB0M */
+ cigOp[ gap[ 0 ] + 1 ].length -= B_len;
+ if ( gap[ 0 ] < gap[ 2 ] )
+ {
+ rc = string_printf( tags, sizeof( tags ), &sz, "\tGC:Z:%uS%uG%uS\tGS:Z:%.*s\tGQ:Z:%.*s",
+ 5 - B_len, B_len, 30 - B_len, 2 * B_len, &newSeq[ 5 - B_len ], 2 * B_len, &newQual[ 5 - B_len ] );
+ if ( rc == 0 )
+ {
+ cols[ alg_CG_TAGS_STR ].len = sz;
+ }
+ memmove( &cigOp[ gap[ 0 ] ],
+ &cigOp[ gap[ 0 ] + 1 ],
+ ( opCnt - ( gap[ 0 ] + 1 ) ) * sizeof( cigOp[ 0 ] ) );
+ --opCnt;
+ }
+ else
+ {
+ rc = string_printf( tags, sizeof( tags ), &sz, "\tGC:Z:%uS%uG%uS\tGS:Z:%.*s\tGQ:Z:%.*s",
+ 30 - B_len, B_len, 5 - B_len, 2 * B_len, &newSeq[ 30 - B_len ], 2 * B_len, &newQual[ 30 - B_len ] );
+ if ( rc == 0 )
+ {
+ cols[ alg_CG_TAGS_STR ].len = sz;
+ }
+ memmove( &cigOp[ gap[ 0 ] ],
+ &cigOp[ gap[ 0 ] + 1 ],
+ ( opCnt - ( gap[ 0 ] + 1 ) ) * sizeof( cigOp[ 0 ] ) );
+ --opCnt;
+ }
+ if ( rc == 0 )
+ {
+ for ( i = B_at; i < B_at + B_len; ++i )
+ {
+ int const Lq = newQual[ i - B_len ];
+ int const Rq = newQual[ i ];
+
+ if ( Lq <= Rq )
+ {
+ newSeq[ i - B_len ] = newSeq[ i ];
+ newQual[ i - B_len ] = Rq;
+ }
+ else
+ {
+ newSeq[ i ] = newSeq[ i - B_len ];
+ newQual[ i ] = Lq;
+ }
+ }
+ memmove( &newSeq [ B_at ], &newSeq [ B_at + B_len ], 35 - B_at - B_len );
+ memmove( &newQual[ B_at ], &newQual[ B_at + B_len ], 35 - B_at - B_len );
+ }
+ }
+ else
+ {
+ int len = cigOp[ gap[ 0 ] ].length;
+
+ cigOp[ gap[ 0 ] ].code = 'I';
+ for (i = gap[0] + 1; i < opCnt && len > 0; ++i) {
+ if (cigOp[i].length <= len){
+ len -= cigOp[i].length;
+ cigOp[i].length = 0;
+ }
+ else {
+ cigOp[i].length -= len;
+ len = 0;
+ }
+ }
+ if(!has_ref_offset_type) CG_adjust -= cigOp[ gap[ 0 ] ].length;
+ }
+ }
+ if ( rc == 0 )
+ {
+ PRINT_CIGAR:
+ CLEAN_CIGAR:
+ print_CG_cigar( __LINE__, cigOp, opCnt, NULL );
+ /* remove zero length ops */
+ for ( j = i = 0; i < opCnt; )
+ {
+ if ( cigOp[ j ].length == 0)
+ {
+ ++j;
+ --opCnt;
+ continue;
+ }
+ cigOp[ i++ ] = cigOp[ j++ ];
+ }
+ print_CG_cigar( __LINE__, cigOp, opCnt, NULL );
+ if ( cols[ alg_EDIT_DISTANCE ].len )
+ {
+ int const edit_distance = cols[ alg_EDIT_DISTANCE ].base.i32[ 0 ];
+ int const adjusted = edit_distance + S_adjust - CG_adjust;
+
+ newEditDistance = adjusted > 0 ? adjusted : 0;
+ SAM_DUMP_DBG( 4, ( "NM: before: %u, after: %u(+%u-%u)\n", edit_distance, newEditDistance, S_adjust, CG_adjust ) );
+ cols[ alg_EDIT_DISTANCE ].base.v = &newEditDistance;
+ cols[ alg_EDIT_DISTANCE ].len = 1;
+ }
+ /* merge adjacent ops */
+ for ( i = opCnt; i > 1; )
+ {
+ --i;
+ if ( cigOp[ i - 1 ].code == cigOp[ i ].code )
+ {
+ cigOp[ i - 1 ].length += cigOp[ i ].length;
+ memmove( &cigOp[ i ], &cigOp[ i + 1 ], ( opCnt - 1 - i ) * sizeof( cigOp[ 0 ] ) );
+ --opCnt;
+ }
+ }
+ print_CG_cigar( __LINE__, cigOp, opCnt, NULL );
+ for ( i = j = 0; i < opCnt && rc == 0; ++i )
+ {
+ rc = string_printf( &newCIGAR[ j ], sizeof( newCIGAR ) - j, &sz, "%u%c", cigOp[ i ].length, cigOp[ i ].code);
+ j += sz;
+ }
+ cols[ alg_CIGAR ].base.v = newCIGAR;
+ cols[ alg_CIGAR ].len = j;
+ }
+ }
+ return rc;
+}
+
+
+static bool DumpAlignedRow( SAM_dump_ctx_t *const ctx, DataSource *const ds,
+ int64_t row,
+ bool const primary,
+ int const cg_style,
+ rc_t *prc )
+{
+ rc_t rc = 0;
+
+ /* if SEQ_SPOT_ID is open then skip rows with no SEQ_SPOT_ID */
+ if ( ds->cols[ alg_SEQ_SPOT_ID ].idx )
+ {
+ rc = Cursor_Read( ds, row, alg_SEQ_SPOT_ID, 1 );
+ if ( rc != 0 )
+ {
+ if ( !( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound ) )
+ *prc = rc;
+ return false;
+ }
+ if ( ds->cols[ alg_SEQ_SPOT_ID ].len == 0 ||
+ ds->cols[ alg_SEQ_SPOT_ID ].base.i64[ 0 ] == 0 )
+ return false;
+ }
+
+ /* skip rows that fail mate distance filter */
+ if ( param->mp_dist_qty != 0 || param->mp_dist_unknown )
+ {
+ rc = Cursor_Read( ds, row, alg_TEMPLATE_LEN, 1 );
+ if ( rc != 0 )
+ {
+ if ( !( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound ) )
+ *prc = rc;
+ return false;
+ }
+ if ( !AlignDistanceFilter( ds->cols ) )
+ return false;
+ }
+
+ rc = Cursor_ReadAlign( &ds->curs, row, ds->cols, 0 );
+ if ( rc != 0 )
+ {
+ if ( !( GetRCObject( rc ) == rcRow && GetRCState( rc ) == rcNotFound ) )
+ *prc = rc;
+ return false;
+ }
+
+ if ( param->fasta || param->fastq )
+ {
+ unsigned const read_id = ds->cols[ alg_SEQ_READ_ID ].base.v ? ds->cols[ alg_SEQ_READ_ID ].base.coord1[ 0 ] : 0;
+
+ rc = DumpAlignedFastX( ctx->pri.cols, row, read_id, primary, false );
+ }
+ else
+ {
+ if ( cg_style != 0 )
+ {
+ rc = GenerateCGData( ds->cols, cg_style );
+ if ( rc != 0 )
+ {
+ *prc = rc;
+ return false;
+ }
+ }
+ rc = DumpAlignedSAM(ctx, ds, row, ctx->readGroup, 0 );
+ }
+ *prc = rc;
+ return true;
+}
+
+
+static rc_t DumpAlignedRowList( SAM_dump_ctx_t *const ctx, DataSource *const ds, SCol const *const ids,
+ int64_t *rcount,
+ bool const primary,
+ int const cg_style,
+ bool const noFilter )
+{
+ rc_t rc;
+ unsigned i;
+ unsigned const n = ids->len;
+
+ for ( i = 0; ( rc = Quitting() ) == 0 && i < n; ++i )
+ {
+ int64_t const row = ids->base.i64[ i ];
+
+ if ( ! noFilter )
+ rc = Cursor_Read( ds, row, alg_REGION_FILTER, ~(unsigned)0 );
+
+ if ( rc == 0 )
+ {
+ if ( noFilter || AlignRegionFilter(ds->cols) )
+ {
+ if ( DumpAlignedRow( ctx, ds, row, primary, cg_style, &rc ) )
+ ++*rcount;
+ if ( rc != 0 )
+ break;
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t DumpAlignedRowListIndirect( SAM_dump_ctx_t *const ctx,
+ DataSource *const indirectSource,
+ DataSource *const directSource,
+ SCol const *const directIDs,
+ int64_t *rcount,
+ bool const primary,
+ int const cg_style )
+{
+ unsigned i;
+
+ for ( i = 0; i < directIDs->len; ++i )
+ {
+ int64_t const row = directIDs->base.i64[ i ];
+ rc_t rc = Cursor_Read( directSource, row, alg_REGION_FILTER, ~(unsigned)0 );
+
+ if ( rc != 0 )
+ return rc;
+
+ if ( !AlignRegionFilter( directSource->cols ) )
+ continue;
+
+ rc = Cursor_Read( directSource, row, alg_EVIDENCE_ALIGNMENT_IDS, 1 );
+ if ( rc != 0 )
+ return rc;
+
+ rc = DumpAlignedRowList( ctx, indirectSource, &directSource->cols[ alg_EVIDENCE_ALIGNMENT_IDS ],
+ rcount, primary, cg_style, true );
+ if ( rc != 0 )
+ return rc;
+ }
+ return 0;
+}
+
+
+enum e_tables
+{
+ primary_alignment,
+ secondary_alignment,
+ evidence_interval,
+ evidence_alignment
+};
+
+enum e_IDS_opts
+{
+ primary_IDS = ( 1 << primary_alignment ),
+ secondary_IDS = ( 1 << secondary_alignment ),
+ evidence_interval_IDS = ( 1 << evidence_interval ),
+ evidence_alignment_IDS = ( 1 << evidence_alignment )
+};
+
+
+static rc_t DumpAlignedRowList_cb( SAM_dump_ctx_t *const ctx, TAlignedRegion const *const rgn,
+ int options, int which, int64_t *rcount, SCol const *const IDS )
+{
+ /*SAM_DUMP_DBG(2, ("row %s index range is [%lu:%lu] pos %lu\n",
+ param->region[r].name, start, start + count - 1, cur_pos));*/
+ switch ( which )
+ {
+ case primary_IDS:
+ return DumpAlignedRowList( ctx, &ctx->pri, IDS, rcount, true, param->cg_style, false );
+
+ case secondary_IDS:
+ return DumpAlignedRowList( ctx, &ctx->sec, IDS, rcount, false, param->cg_style, false );
+
+ case evidence_interval_IDS:
+ {
+ rc_t rc = 0;
+
+ if ( ( options & evidence_interval_IDS ) != 0 )
+ rc = DumpAlignedRowList( ctx, &ctx->evi, IDS, rcount, true, 0, false );
+
+ if ( rc == 0 && ( options & evidence_alignment_IDS ) != 0 )
+ rc = DumpAlignedRowListIndirect( ctx, &ctx->eva, &ctx->evi, IDS, rcount, true, param->cg_style );
+
+ return rc;
+ }
+ }
+ return RC( rcExe, rcTable, rcReading, rcParam, rcUnexpected );
+}
+
+
+typedef struct CigOps{
+ char op;
+ int8_t ref_sign; /*** 0;+1;-1; ref_offset = ref_sign * offset ***/
+ int8_t seq_sign; /*** 0;+1;-1; seq_offset = seq_sign * offset ***/
+ uint32_t oplen;
+} CigOps;
+
+static void SetCigOp(CigOps *dst,char op,uint32_t oplen)
+{
+ dst->op = op;
+ dst->oplen = oplen;
+ switch(op) { /*MX= DN B IS PH*/
+ case 'M': case 'X': case '=':
+ dst->ref_sign=+1;
+ dst->seq_sign=+1;
+ break;
+ case 'D': case 'N':
+ dst->ref_sign=+1;
+ dst->seq_sign= 0;
+ break;
+ case 'B':
+ dst->ref_sign=-1;
+ dst->seq_sign= 0;
+ break;
+ case 'S': case 'I':
+ dst->ref_sign= 0;
+ dst->seq_sign=+1;
+ break;
+ case 'P': case 'H':
+ case 0: /** terminating op **/
+ dst->ref_sign= 0;
+ dst->seq_sign= 0;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+}
+
+static unsigned ExplodeCIGAR( CigOps dst[], unsigned len, char const cigar[], unsigned ciglen )
+{
+ unsigned i;
+ unsigned j;
+ int opLen;
+
+ for ( i = j = opLen=0; i < ciglen; i++) {
+ if(isdigit(cigar[i])){
+ opLen = opLen * 10 + cigar[i] - '0';
+ } else {
+ assert(isalpha(cigar[i]));
+ SetCigOp(dst+j,cigar[i],opLen);
+ opLen=0;
+ j++;
+ }
+ }
+ SetCigOp(dst+j,0,0);
+ j++;
+ return j;
+}
+
+
+#define CG_CIGAR_STRING_MAX (35 * 11 + 1)
+
+
+#if 0
+static unsigned FormatCIGAR( char dst[], unsigned cp, unsigned oplen, int opcode )
+{
+ size_t sz;
+ string_printf( dst + cp, CG_CIGAR_STRING_MAX - cp, &sz, "%u%c", oplen, opcode );
+ return sz;
+}
+
+
+static unsigned DeletedCIGAR( char dst[], unsigned const cp, int opcode, unsigned D,
+ uint32_t const Op[], int ri, unsigned len )
+{
+ unsigned i;
+ unsigned curPos = 0;
+ int curOp = opcode;
+ unsigned oplen = 0;
+
+ for ( i = 0; i < D && ri < len; ++i, ++ri )
+ {
+ uint32_t const op = Op[ ri ];
+ int const d = op >> 2;
+ int const m = op & 1;
+ int const nxtOp = m ? opcode : 'P';
+
+ if ( d != 0 )
+ {
+ if ( oplen != 0 )
+ curPos += FormatCIGAR( dst, curPos + cp, oplen, curOp );
+ curPos += FormatCIGAR( dst, cp, d, 'D' );
+ oplen = 0;
+ }
+ if ( oplen == 0 || nxtOp == curOp )
+ {
+ ++oplen;
+ }
+ else
+ {
+ curPos += FormatCIGAR( dst, curPos + cp, oplen, curOp );
+ oplen = 1;
+ }
+ curOp = nxtOp;
+ }
+
+ if ( oplen != 0 && curOp != opcode)
+ {
+ curPos += FormatCIGAR( dst, curPos + cp, oplen, curOp );
+ oplen = 0;
+ }
+ if ( i < D )
+ oplen += D - i;
+ if ( oplen )
+ curPos += FormatCIGAR( dst, curPos + cp, oplen, opcode );
+ return curPos;
+}
+#endif
+
+static char merge_M_type_ops(char a,char b)
+{ /*MX=*/
+ char c=0;
+ switch(b){
+ case 'X':
+ switch(a){
+ case '=': c='X'; break;
+ case 'X': c='M'; break; /**we don't know - 2X may create '=' **/
+ case 'M': c='M'; break;
+ }
+ break;
+ case 'M':
+ c='M';
+ break;
+ case '=':
+ c=a;
+ break;
+ }
+ assert(c!=0);
+ return c;
+}
+
+
+static unsigned CombineCIGAR( char dst[], CigOps const seqOp[], unsigned seq_len,
+ int refPos, CigOps const refOp[], unsigned ref_len )
+{
+ bool done=false;
+ unsigned ciglen=0,last_ciglen=0;
+ char last_cig_op;
+ uint32_t last_cig_oplen=0;
+ int si=0,ri=0;
+ CigOps seq_cop={0,0,0,0},ref_cop={0,0,0,0};
+ int seq_pos=0; /** seq_pos is tracked roughly - with every extraction from seqOp **/
+ int ref_pos=0; /** ref_pos is tracked precisely - with every delta and consumption in cigar **/
+ int delta=refPos; /*** delta in relative positions of seq and ref **/
+ /*** when delta < 0 - rewind or extend the reference ***/
+ /*** wher delta > 0 - skip reference ***/
+#define MACRO_BUILD_CIGAR(OP,OPLEN) \
+ if( last_cig_oplen > 0 && last_cig_op == OP){ \
+ last_cig_oplen += OPLEN; \
+ ciglen = last_ciglen + sprintf(dst+last_ciglen,"%d%c",last_cig_oplen,last_cig_op); \
+ } else { \
+ last_ciglen = ciglen; \
+ last_cig_oplen = OPLEN; \
+ last_cig_op = OP; \
+ ciglen = ciglen + sprintf(dst+last_ciglen,"%d%c",last_cig_oplen,last_cig_op); \
+ }
+ while(!done){
+ while(delta < 0){
+ ref_pos += delta; /** we will make it to back up this way **/
+ if(ri > 0){ /** backing up on ref if possible ***/
+ int avail_oplen = refOp[ri-1].oplen - ref_cop.oplen;
+ if(avail_oplen > 0 ){
+ if((-delta) <= avail_oplen * ref_cop.ref_sign){ /*** rewind within last operation **/
+ ref_cop.oplen -= delta;
+ delta -= delta * ref_cop.ref_sign;
+ } else { /*** rewind the whole ***/
+ ref_cop.oplen += avail_oplen;
+ delta += avail_oplen * ref_cop.ref_sign;
+ }
+ } else {
+ ri--;
+ /** pick the previous as used up **/
+ ref_cop = refOp[ri-1];
+ ref_cop.oplen =0;
+ }
+ } else { /** extending the reference **/
+ SetCigOp(&ref_cop,'=',ref_cop.oplen - delta);
+ delta = 0;
+ }
+ ref_pos -= delta;
+ }
+ if(ref_cop.oplen == 0){ /*** advance the reference ***/
+ ref_cop = refOp[ri++];
+ if(ref_cop.oplen == 0) { /** extending beyond the reference **/
+ SetCigOp(&ref_cop,'=',1000);
+ }
+ assert(ref_cop.oplen > 0 );
+ }
+ if(delta > 0){ /*** skip refOps ***/
+ ref_pos += delta; /** may need to back up **/
+ if(delta >= ref_cop.oplen){ /** full **/
+ delta -= ref_cop.oplen * ref_cop.ref_sign;
+ ref_cop.oplen = 0;
+ } else { /** partial **/
+ ref_cop.oplen -= delta;
+ delta -= delta * ref_cop.ref_sign;
+ }
+ ref_pos -= delta; /** if something left - restore ***/
+ continue;
+ }
+ /*** seq and ref should be synchronized here **/
+ assert(delta == 0);
+ if(seq_cop.oplen == 0){ /*** advance sequence ***/
+ if(seq_pos < seq_len){
+ seq_cop = seqOp[si++];
+ assert(seq_cop.oplen > 0 );
+ seq_pos += seq_cop.oplen * seq_cop.seq_sign;
+ } else {
+ done=true;
+ }
+ }
+ if(!done){
+ int seq_seq_step = seq_cop.oplen * seq_cop.seq_sign; /** sequence movement**/
+ int seq_ref_step = seq_cop.oplen * seq_cop.ref_sign; /** influence of sequence movement on intermediate reference **/
+ int ref_seq_step = ref_cop.oplen * ref_cop.seq_sign; /** movement of the intermediate reference ***/
+ int ref_ref_step = ref_cop.oplen * ref_cop.ref_sign; /** influence of the intermediate reference movement on final reference ***/
+ assert( ref_ref_step >= 0); /** no B in the reference **/
+ if( seq_ref_step <= 0){ /** BSIPH in the sequence against anything ***/
+ MACRO_BUILD_CIGAR( seq_cop.op, seq_cop.oplen );
+ seq_cop.oplen = 0;
+ delta = seq_ref_step; /** if negative - will force rewind next cycle **/
+ } else if(ref_ref_step <= 0){ /** MX=DN against SIPH in the reference***/
+ if(ref_seq_step == 0){ /** MX=DN against PH **/
+ MACRO_BUILD_CIGAR( ref_cop.op,ref_cop.oplen);
+ ref_cop.oplen = 0;
+ } else {
+ int min_len = (seq_cop.oplen<ref_cop.oplen)?seq_cop.oplen:ref_cop.oplen;
+ if(seq_seq_step == 0){ /** DN agains SI **/
+ MACRO_BUILD_CIGAR('P',min_len);
+ } else { /** MX= agains SI ***/
+ MACRO_BUILD_CIGAR( ref_cop.op,min_len);
+ }
+ seq_cop.oplen -= min_len;
+ ref_cop.oplen -= min_len;
+ }
+ } else { /*MX=DN against MX=DN*/
+ int min_len = (seq_cop.oplen<ref_cop.oplen)?seq_cop.oplen:ref_cop.oplen;
+ if(seq_seq_step == 0){ /* DN against MX=DN */
+ if(ref_seq_step == 0){ /** padding DN against DN **/
+ MACRO_BUILD_CIGAR('P',min_len);
+ ref_cop.oplen -= min_len;
+ seq_cop.oplen -= min_len;
+ } else { /* DN against MX= **/
+ MACRO_BUILD_CIGAR(seq_cop.op,min_len);
+ seq_cop.oplen -= min_len;
+ }
+ } else if (ref_cop.seq_sign == 0){ /* MX= against DN - always wins */
+ MACRO_BUILD_CIGAR(ref_cop.op,min_len);
+ ref_cop.oplen -= min_len;
+ } else { /** MX= against MX= ***/
+ MACRO_BUILD_CIGAR(merge_M_type_ops(seq_cop.op,ref_cop.op),min_len);
+ ref_cop.oplen -= min_len;
+ seq_cop.oplen -= min_len;
+ }
+ ref_pos += min_len;
+ }
+ }
+ }
+ return ciglen;
+}
+
+
+static rc_t DumpCGSAM( SAM_dump_ctx_t *const ctx, TAlignedRegion const *const rgn, int options,
+ int which, int64_t *rows, SCol const *const ids )
+{
+ if ( which == evidence_interval_IDS )
+ {
+ rc_t rc = 0;
+ unsigned i;
+
+ for ( i = 0; i < ids->len; ++i )
+ {
+ int64_t const rowInterval = ids->base.i64[ i ];
+
+ rc = Cursor_Read( &ctx->evi, rowInterval, alg_REGION_FILTER, ~(0u) );
+ if ( rc == 0 )
+ {
+ if ( AlignRegionFilter( ctx->evi.cols ) )
+ {
+ rc = Cursor_ReadAlign( &ctx->evi.curs, rowInterval, ctx->evi.cols, 0 );
+ if ( rc == 0 )
+ {
+ unsigned const evidence = ctx->evi.cols[ alg_EVIDENCE_ALIGNMENT_IDS ].len;
+ if ( evidence != 0 )
+ {
+ INSDC_coord_len const *const refLen = ctx->evi.cols[ alg_READ_LEN ].base.coord_len;
+ INSDC_coord_len const *const cigLen = ctx->evi.cols[ alg_CIGAR_LEN ].base.coord_len;
+ unsigned const ploids = ctx->evi.cols[ alg_CIGAR_LEN ].len;
+ unsigned const totalIntervalReadLen = ctx->evi.cols[ alg_READ ].len;
+ CigOps refCigOps_stack[1024];
+ CigOps *refCigOps_heap=NULL;
+ CigOps *refCigOps;
+
+ if( totalIntervalReadLen > 1000){
+ refCigOps=refCigOps_heap = malloc( sizeof( refCigOps[ 0 ] ) * (totalIntervalReadLen+ploids) );
+ } else {
+ refCigOps=refCigOps_stack;
+ }
+
+ if ( refCigOps != NULL )
+ {
+ unsigned j;
+ unsigned start;
+ unsigned cigop_starts[256];
+
+ assert(ploids < 256);
+
+ for ( start = j = 0, cigop_starts[0]=0; j < ploids; ++j )
+ {
+ unsigned len = cigLen[ j ];
+ cigop_starts[j+1] = cigop_starts[j] + ExplodeCIGAR( refCigOps + cigop_starts[j], refLen[ j ],
+ ctx->evi.cols[ alg_CIGAR ].base.str + start, len );
+ start += len;
+ }
+
+ for ( j = 0; j < evidence; ++j )
+ {
+ int64_t const rowAlign = ctx->evi.cols[ alg_EVIDENCE_ALIGNMENT_IDS ].base.i64[ j ];
+
+ rc = Cursor_ReadAlign( &ctx->eva.curs, rowAlign, ctx->eva.cols, 0 );
+ if ( rc == 0 )
+ {
+ if(param->cg_style != 0)
+ rc = GenerateCGData( ctx->eva.cols, param->cg_style );
+ if ( rc == 0 )
+ {
+ int const ploidy = ctx->eva.cols[ alg_REF_PLOIDY ].base.u32[ 0 ];
+ int const readLen = ctx->eva.cols[ alg_READ ].len;
+ INSDC_coord_zero refPos = ctx->eva.cols[ alg_REF_POS ].base.coord0[ 0 ];
+ CigOps op[ 36 ];
+ char cigbuf[ CG_CIGAR_STRING_MAX ];
+
+ memset( cigbuf, 0, CG_CIGAR_STRING_MAX );
+ ExplodeCIGAR( op, readLen, ctx->eva.cols[ alg_CIGAR ].base.str,
+ ctx->eva.cols[ alg_CIGAR ].len );
+ ctx->eva.cols[ alg_CIGAR ].len = CombineCIGAR( cigbuf, op, readLen, refPos,
+ refCigOps + cigop_starts[ ploidy - 1 ], refLen[ ploidy - 1 ] );
+ ctx->eva.cols[ alg_CIGAR ].base.str = cigbuf;
+ ctx->eva.cols[ alg_REF_POS ].base.v = &refPos;
+ refPos += ctx->evi.cols[ alg_REF_POS ].base.coord0[ 0 ] ;
+ if(refPos < 0){
+ ReferenceObj const *r = NULL;
+ rc = ReferenceList_Find( gRefList, &r,
+ ctx->evi.cols[ alg_REF_NAME ].base.str,
+ ctx->evi.cols[ alg_REF_NAME ].len );
+ if(rc == 0){
+ bool circular=false;
+ rc=ReferenceObj_Circular(r, &circular);
+ if(rc == 0 && circular){
+ INSDC_coord_len len;
+ rc=ReferenceObj_SeqLength(r,&len);
+ if(rc == 0)
+ refPos += len;
+ }
+ ReferenceObj_Release(r);
+ }
+ }
+ rc = DumpAlignedSAM( ctx, &ctx->eva, rowAlign, ctx->readGroup, 1 );
+ ++*rows;
+ }
+ else
+ break;
+ }
+ else
+ break;
+ }
+ if(refCigOps_heap) free( refCigOps_heap );
+ }
+ else
+ rc = RC( rcExe, rcTable, rcReading, rcMemory, rcExhausted );
+ }
+ }
+ }
+ }
+ else
+ break;
+ rc = rc ? rc : Quitting();
+ if ( rc != 0 )
+ break;
+ }
+ return rc;
+ }
+ return RC( rcExe, rcTable, rcReading, rcParam, rcUnexpected );
+}
+
+
+static rc_t ForEachAlignedRegion( SAM_dump_ctx_t *const ctx, enum e_IDS_opts const Options,
+ rc_t ( *user_func )( SAM_dump_ctx_t *ctx, TAlignedRegion const *rgn, int options, int which, int64_t *rows, SCol const *IDS ) )
+{
+ SCol cols[] =
+ {
+ { "MAX_SEQ_LEN", 0, { NULL }, 0, false },
+ { "OVERLAP_REF_POS", 0, { NULL }, 0, true },
+ { "PRIMARY_ALIGNMENT_IDS", 0, { NULL }, 0, false },
+ { "SECONDARY_ALIGNMENT_IDS", 0, { NULL }, 0, true },
+ { "EVIDENCE_INTERVAL_IDS", 0, { NULL }, 0, true },
+ { NULL, 0, { NULL }, 0, false }
+ };
+ enum eref_col
+ {
+ ref_MAX_SEQ_LEN = 0,
+ ref_OVERLAP_REF_LEN,
+ ref_PRIMARY_ALIGNMENT_IDS,
+ ref_SECONDARY_ALIGNMENT_IDS,
+ ref_EVIDENCE_INTERVAL_IDS
+ };
+
+ KIndex const *iname = NULL;
+ int64_t rows = 0;
+ rc_t rc = 0;
+ int options = Options & 7;
+
+ if ( Options & evidence_alignment_IDS )
+ options |= evidence_interval_IDS;
+
+ if ( ( options & primary_IDS ) == 0 )
+ cols[ ref_PRIMARY_ALIGNMENT_IDS ].name = "";
+ if ( ( options & secondary_IDS ) == 0 )
+ cols[ ref_SECONDARY_ALIGNMENT_IDS ].name = "";
+ if ( ( options & evidence_interval_IDS ) == 0 )
+ cols[ ref_EVIDENCE_INTERVAL_IDS ].name = "";
+
+ ctx->ref.cols = cols;
+
+ rc = VTableOpenIndexRead( ctx->ref.tbl.vtbl, &iname, "i_name" );
+ if ( rc == 0 )
+ {
+ rc = Cursor_Open( &ctx->ref.tbl, &ctx->ref.curs, ctx->ref.cols, NULL );
+ if ( rc == 0 )
+ {
+ int64_t rowid = 1;
+ uint64_t count = 0;
+ char refname[ 1024 ];
+ size_t sz;
+
+ if ( ctx->ref.cols[ ref_PRIMARY_ALIGNMENT_IDS ].idx == 0 )
+ options &= ~primary_IDS;
+ if ( ctx->ref.cols[ ref_SECONDARY_ALIGNMENT_IDS ].idx == 0 )
+ options &= ~secondary_IDS;
+ if ( ctx->ref.cols[ ref_EVIDENCE_INTERVAL_IDS ].idx == 0 )
+ options &= ~evidence_interval_IDS;
+
+ /* new: if we have a list of regions, reset the their print-flag */
+ if ( param->region_qty > 0 )
+ {
+ unsigned r;
+ for ( r = 0; r < param->region_qty; ++r )
+ {
+ param->region[ r ].printed = 0;
+ }
+ }
+
+ while ( ( rc = KIndexProjectText(iname, rowid + count, &rowid, &count, refname, sizeof( refname ), &sz ) ) == 0 )
+ {
+ bool include;
+ unsigned r;
+ unsigned max_to = UINT_MAX;
+ unsigned min_from = 0;
+
+ for ( include = false, r = 0; r < param->region_qty; ++r )
+ {
+ if ( sz == string_size( param->region[ r ].name ) &&
+ memcmp( param->region[ r ].name, refname, sz ) == 0 )
+ {
+ include = true;
+ max_to = param->region[ r ].max_to;
+ min_from = param->region[ r ].min_from;
+ param->region[ r ].printed++; /* new: mark a region as printed */
+ break;
+ }
+ }
+
+ if ( param->region_qty == 0 || include )
+ {
+ int64_t const endrow_exclusive = rowid + count;
+ unsigned m;
+ unsigned k;
+
+ for ( k = 0, m = 1; rc == 0 && k < 3; ++k, m <<= 1 )
+ {
+ if ( m & options )
+ {
+ unsigned lookback = 0;
+ int64_t row;
+ int32_t row_start_offset;
+ unsigned pos;
+ unsigned const maxseqlen = 5000; /***** TODO: this code is to be rewritten anyway ****/
+
+ if ( param->region_qty )
+ {
+ if ( ctx->ref.cols[ ref_OVERLAP_REF_LEN ].idx )
+ {
+ rc = Cursor_Read( &ctx->ref, rowid, 0, ~(0u) );
+ if ( rc != 0 )
+ break;
+ if ( ctx->ref.cols[ ref_OVERLAP_REF_LEN ].len > k )
+ {
+ unsigned const overlap = ctx->ref.cols[ ref_OVERLAP_REF_LEN ].base.coord0[ k ];
+
+ if ( overlap != 0 )
+ {
+
+ assert( overlap < rowid * maxseqlen );
+ lookback = ( rowid - ( overlap / maxseqlen ) );
+ }
+ }
+ }
+ else
+ lookback = 1;
+ }
+ row_start_offset = min_from/maxseqlen - lookback;
+ if(row_start_offset < 0) row_start_offset=0;
+
+
+ for ( pos = row_start_offset*maxseqlen, row = rowid + row_start_offset; rc == 0 && row < endrow_exclusive; ++row )
+ {
+ if ( row < 1 )
+ {
+ row = 0;
+ continue;
+ }
+ rc = Cursor_Read( &ctx->ref, row, 0, ~(0u) );
+ if ( rc != 0 )
+ break;
+ if ( ctx->ref.cols[ ref_PRIMARY_ALIGNMENT_IDS + k ].len > 0 )
+ rc = user_func( ctx, ¶m->region[r], Options, m, &rows,
+ &ctx->ref.cols[ ref_PRIMARY_ALIGNMENT_IDS + k ] );
+ pos += ctx->ref.cols[ ref_MAX_SEQ_LEN ].base.u32[ 0 ];
+ if ( pos >= max_to )
+ break;
+ if ( param->test_rows != 0 && rows > param->test_rows )
+ break;
+ }
+ }
+ }
+ }
+ if ( param->test_rows != 0 && rows > param->test_rows )
+ break;
+ if ( rc != 0 )
+ break;
+ } /* while */
+
+ /* new: walk the list of regions and report what was NOT printed ( found ) ... */
+ if ( param->region_qty > 0 && GetRCState( rc ) != rcCanceled )
+ {
+ unsigned r;
+ for ( r = 0; r < param->region_qty; ++r )
+ {
+ if ( param->region[ r ].printed == 0 )
+ {
+ (void)PLOGMSG( klogWarn, ( klogWarn, "reference >$(a)< not found", "a=%s", param->region[ r ].name ) );
+ }
+ }
+ }
+
+ if ( GetRCObject( rc ) == rcId && GetRCState( rc ) == rcNotFound )
+ {
+ rc = 0;
+ }
+
+ }
+ }
+ Cursor_Close( &ctx->ref.curs );
+ KIndexRelease( iname );
+
+ return rc;
+}
+
+
+static rc_t DumpAlignedTable( SAM_dump_ctx_t *const ctx, DataSource *const ds,
+ bool const primary, int const cg_style, unsigned *const rcount )
+{
+ unsigned i;
+ int64_t start;
+ uint64_t count;
+ rc_t rc = VCursorIdRange( ds->curs.vcurs, 0, &start, &count );
+
+ if ( rc != 0 )
+ return rc;
+ for ( i = 0; i != (unsigned)count; ++i )
+ {
+ if ( DumpAlignedRow(ctx, ds, start + i, primary, cg_style, &rc ) )
+ ++*rcount;
+ if ( rc != 0 || ( rc = Quitting() ) != 0 )
+ return rc;
+ if ( param->test_rows && *rcount > param->test_rows )
+ break;
+ }
+ return 0;
+}
+
+
+static rc_t DumpUnsorted( SAM_dump_ctx_t *const ctx )
+{
+ rc_t rc = 0;
+ unsigned rcount;
+
+ if ( rc == 0 && param->cg_evidence )
+ {
+ SAM_DUMP_DBG( 2, ( "%s EVIDENCE_INTERVAL\n", ctx->accession ) );
+ rcount = 0;
+ rc = DumpAlignedTable( ctx, &ctx->evi, false, 0, &rcount );
+ (void)PLOGMSG( klogInfo, ( klogInfo, "$(a): $(c) allele sequences", "a=%s,c=%lu", ctx->accession, rcount ) );
+ }
+ if ( rc == 0 && param->cg_ev_dnb )
+ {
+ SAM_DUMP_DBG( 2, ( "%s EVIDENCE_ALIGNMENT\n", ctx->accession ) );
+ rcount = 0;
+ rc = DumpAlignedTable( ctx, &ctx->eva, false, param->cg_style, &rcount );
+ (void)PLOGMSG( klogInfo, ( klogInfo, "$(a): $(c) support sequences", "a=%s,c=%lu", ctx->accession, rcount ) );
+ }
+ if ( rc == 0 && ctx->pri.curs.vcurs )
+ {
+ SAM_DUMP_DBG( 2, ( "%s PRIMARY_ALIGNMENT\n", ctx->accession ) );
+ rcount = 0;
+ rc = DumpAlignedTable( ctx, &ctx->pri, true, param->cg_style, &rcount );
+ (void)PLOGMSG( klogInfo, ( klogInfo, "$(a): $(c) primary sequences", "a=%s,c=%lu", ctx->accession, rcount ) );
+ }
+ if ( rc == 0 && ctx->sec.curs.vcurs )
+ {
+ SAM_DUMP_DBG( 2, ( "%s SECONDARY_ALIGNMENT\n", ctx->accession ) );
+ rcount = 0;
+ rc = DumpAlignedTable( ctx, &ctx->sec, false, param->cg_style, &rcount );
+ (void)PLOGMSG( klogInfo, ( klogInfo, "$(a): $(c) secondary sequences", "a=%s,c=%lu", ctx->accession, rcount ) );
+ }
+ return rc;
+}
+
+
+static rc_t DumpUnaligned( SAM_dump_ctx_t *const ctx, bool const aligned )
+{
+ rc_t rc = 0;
+ int64_t start = 0;
+ uint64_t count = 0;
+
+ rc = VCursorIdRange( ctx->seq.curs.vcurs, 0, &start, &count );
+ if ( rc == 0 )
+ {
+ uint64_t rcount = 0;
+ if ( param->test_rows != 0 && count > param->test_rows )
+ {
+ count = param->test_rows;
+ }
+ SAM_DUMP_DBG( 2, ( "%s SEQUENCE table range from %ld qty %lu\n", ctx->accession, start, count ) );
+ while ( count > 0 && rc == 0 )
+ {
+ uint32_t i;
+
+ if ( ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].idx == 0)
+ {
+ rc = DumpUnalignedReads( ctx, NULL, start, &rcount );
+ }
+ else
+ {
+ /* avoid reading whole sequence cursor data unnecessarily */
+ rc = Cursor_Read( &ctx->seq, start, seq_PRIMARY_ALIGNMENT_ID, ~(unsigned)0 );
+ if ( rc == 0 )
+ {
+ /* find if its completely unaligned */
+ int64_t min_prim_id = 0;
+ bool has_unaligned = false;
+ for ( i = 0; rc == 0 && i < ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].len; i++ )
+ {
+ int64_t x = ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[ i ];
+ has_unaligned |= x == 0;
+ if ( ( min_prim_id == 0 && x != 0 ) || min_prim_id < x )
+ {
+ min_prim_id = x;
+ }
+ }
+ if ( min_prim_id == 0 )
+ {
+ rc = DumpUnalignedReads( ctx, NULL, start, &rcount );
+ }
+ else if ( has_unaligned && !param->unaligned_spots )
+ {
+ if ( rc == 0 )
+ {
+#if USE_MATE_CACHE
+ uint64_t val;
+ rc = Cache_Get( &ctx->pri.curs, min_prim_id, &val );
+ if ( rc == 0 )
+ {
+ ctx->pri.cols[ alg_REF_POS ].len = 0;
+ Cache_Unpack( val, 0, &ctx->pri.curs, ctx->pri.cols );
+ ctx->pri.cols[ alg_SEQ_SPOT_ID ].base.i64 = &start;
+ ctx->pri.cols[ alg_SEQ_SPOT_ID ].len = 1;
+ memmove( &ctx->pri.cols[ alg_REF_NAME ], &ctx->pri.cols[ alg_MATE_REF_NAME ], sizeof( SCol ) );
+ memmove( &ctx->pri.cols[ alg_REF_SEQ_ID ], &ctx->pri.cols[ alg_MATE_REF_NAME ], sizeof( SCol ) );
+ memmove( &ctx->pri.cols[ alg_REF_POS ], &ctx->pri.cols[ alg_MATE_REF_POS ], sizeof( SCol ) );
+ }
+ else if ( !( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcItem ) )
+ {
+ break;
+ }
+ else
+ {
+#endif /* USE_MATE_CACHE */
+ rc = Cursor_ReadAlign( &ctx->pri.curs, min_prim_id, ctx->pri.cols, alg_MATE_ALIGN_ID );
+#if USE_MATE_CACHE
+ }
+#endif /* USE_MATE_CACHE */
+ rc = rc ? rc : DumpUnalignedReads( ctx, ctx->pri.cols, min_prim_id, &rcount );
+ }
+ }
+ } else if ( GetRCState( rc ) == rcNotFound && GetRCObject( rc ) == rcRow )
+ {
+ rc = 0;
+ }
+ }
+ start++;
+ count--;
+ rc = rc ? rc : Quitting();
+ }
+ (void)PLOGMSG( klogInfo, ( klogInfo, "$(a): $(c) unaligned sequences", "a=%s,c=%lu", ctx->accession, rcount ) );
+ }
+ return rc;
+}
+
+#if USE_MATE_CACHE
+static rc_t FlushUnalignedRead_cb (uint64_t key, bool value,void *user_data)
+{
+ rc_t rc;
+ int64_t spot_id = (int64_t) key;
+ int64_t aligned_mate_id = (int64_t) value;
+ SAM_dump_ctx_t *const ctx = user_data;
+ rc = Cursor_Read( &ctx->seq, spot_id, seq_PRIMARY_ALIGNMENT_ID, ~(unsigned)0 );
+ if ( rc == 0 ) {
+ uint64_t rcount;
+ uint64_t val;
+ assert(ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].len == 2);
+ if(ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[0]==0){
+ aligned_mate_id = ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[1];
+ assert(aligned_mate_id != 0);
+ } else if(ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[1] == 0){
+ aligned_mate_id = ctx->seq.cols[ seq_PRIMARY_ALIGNMENT_ID ].base.i64[0];
+ assert(aligned_mate_id != 0);
+ } else {
+ assert(0);
+ }
+ rc = Cache_Get( &ctx->pri.curs, aligned_mate_id, &val );
+ if ( rc == 0 ) {
+ ctx->pri.cols[ alg_REF_POS ].len = 0;
+ Cache_Unpack( val, 0, &ctx->pri.curs, ctx->pri.cols );
+ ctx->pri.cols[ alg_SEQ_SPOT_ID ].base.i64 = &spot_id;
+ ctx->pri.cols[ alg_SEQ_SPOT_ID ].len = 1;
+ memmove( &ctx->pri.cols[ alg_REF_NAME ], &ctx->pri.cols[ alg_MATE_REF_NAME ], sizeof( SCol ) );
+ memmove( &ctx->pri.cols[ alg_REF_SEQ_ID ], &ctx->pri.cols[ alg_MATE_REF_NAME ], sizeof( SCol ) );
+ memmove( &ctx->pri.cols[ alg_REF_POS ], &ctx->pri.cols[ alg_MATE_REF_POS ], sizeof( SCol ) );
+ rc =DumpUnalignedReads( ctx, ctx->pri.cols, aligned_mate_id, &rcount );
+ }
+ }
+ return rc;
+}
+static rc_t FlushUnaligned( SAM_dump_ctx_t *const ctx, const SCursCache * cache )
+{
+ return KVectorVisitBool (cache->cache_unaligned_mate, false, FlushUnalignedRead_cb, ctx );
+}
+#endif
+
+static rc_t DumpHeader( SAM_dump_ctx_t const *ctx )
+{
+ bool reheader = param->reheader;
+ rc_t rc = 0;
+
+ if ( !reheader )
+ {
+ if ( ctx->db )
+ {
+ /* grab header from db meta node */
+ KMetadata const *meta;
+
+ rc = VDatabaseOpenMetadataRead( ctx->db, &meta );
+ if ( rc == 0 )
+ {
+ KMDataNode const *node;
+
+ rc = KMetadataOpenNodeRead( meta, &node, "BAM_HEADER" );
+ KMetadataRelease( meta );
+
+ if ( rc == 0 )
+ {
+ size_t offset = 0;
+
+ for ( offset = 0; ; )
+ {
+ size_t remain;
+ size_t nread;
+ char buffer[ 4096 ];
+
+ rc = KMDataNodeRead( node, offset, buffer, sizeof(buffer), &nread, &remain );
+ if ( rc != 0 )
+ break;
+ BufferedWriter( NULL, buffer, nread, NULL );
+ if ( remain == 0 )
+ {
+ if ( buffer[nread - 1] != '\n' )
+ {
+ buffer[ 0 ] = '\n';
+ rc = BufferedWriter( NULL, buffer, 1, NULL );
+ }
+ break;
+ }
+ offset += nread;
+ }
+ KMDataNodeRelease(node);
+ }
+ else if ( GetRCState( rc ) == rcNotFound )
+ {
+ reheader = true;
+ rc = 0;
+ }
+ }
+ }
+ else
+ {
+ reheader = true;
+ rc = 0;
+ }
+ }
+
+ if ( rc == 0 && reheader )
+ {
+ rc = KOutMsg( "@HD\tVN:1.3\n" );
+ if ( rc == 0 && gRefList )
+ rc = RefSeqPrint();
+ if ( rc == 0 && ctx->readGroup )
+ rc = ReadGroup_print( ctx->readGroup );
+ if ( rc == 0 && ctx->seq.tbl.vtbl )
+ rc = DumpReadGroups( &ctx->seq.tbl );
+ }
+
+ if ( rc == 0 && param->comments )
+ {
+ unsigned i;
+
+ for( i = 0; rc == 0 && param->comments[ i ]; ++i )
+ rc = KOutMsg( "@CO\t%s\n", param->comments[ i ] );
+ }
+ return rc;
+}
+
+
+static rc_t DumpDB( SAM_dump_ctx_t *const ctx )
+{
+ rc_t rc = 0;
+
+ if ( ctx->ref.tbl.vtbl != NULL )
+ rc = ReferenceList_MakeTable( &gRefList, ctx->ref.tbl.vtbl, 0, CURSOR_CACHE, NULL, 0 );
+ if ( !param->noheader )
+ rc = DumpHeader( ctx );
+ if ( rc == 0 )
+ {
+ if ( param->region_qty ){
+ rc = ForEachAlignedRegion( ctx
+ , ( param->primaries ? primary_IDS : 0 )
+ | ( param->secondaries ? secondary_IDS : 0 )
+ | ( param->cg_evidence ? evidence_interval_IDS : 0 )
+ | ( param->cg_ev_dnb ? evidence_alignment_IDS : 0 )
+ , DumpAlignedRowList_cb );
+#if USE_MATE_CACHE
+ if ( rc == 0 && param->unaligned ){
+ rc = FlushUnaligned( ctx,ctx->pri.curs.cache);
+ }
+#endif
+ }
+ if ( param->cg_sam )
+ rc = ForEachAlignedRegion( ctx, evidence_interval_IDS, DumpCGSAM );
+
+ if ( param->region_qty == 0 )
+ {
+ rc = DumpUnsorted( ctx );
+ if ( rc == 0 && param->unaligned )
+ rc = DumpUnaligned( ctx, ctx->pri.tbl.vtbl != NULL );
+ }
+ }
+ ReferenceList_Release( gRefList );
+ return rc;
+}
+
+
+static rc_t DumpTable( SAM_dump_ctx_t *ctx )
+{
+ rc_t rc = 0;
+
+ if ( !param->noheader )
+ rc = DumpHeader( ctx );
+ if ( rc == 0 )
+ rc = DumpUnaligned( ctx, false );
+ return rc;
+}
+
+
+static rc_t ProcessTable( VDBManager const *mgr, char const fullPath[],
+ char const accession[], char const readGroup[] )
+{
+ VTable const *tbl;
+ rc_t rc = VDBManagerOpenTableRead( mgr, &tbl, 0, "%s", fullPath );
+
+ if ( rc != 0 )
+ {
+ VSchema *schema;
+
+ rc = VDBManagerMakeSRASchema( mgr, &schema );
+ if ( rc == 0 )
+ {
+ rc = VDBManagerOpenTableRead( mgr, &tbl, schema, "%s", fullPath );
+ VSchemaRelease( schema );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ SAM_dump_ctx_t ctx;
+ SCol seq_cols[ sizeof( gSeqCol ) / sizeof( gSeqCol[ 0 ] ) ];
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ ctx.fullPath = fullPath;
+ ctx.accession = accession;
+ ctx.readGroup = readGroup;
+
+ DATASOURCE_INIT( ctx.seq, accession );
+ ctx.seq.tbl.vtbl = tbl;
+ ctx.seq.type = edstt_Sequence;
+
+ ReportResetTable( fullPath, tbl );
+
+ ctx.seq.cols = seq_cols;
+ memmove( ctx.seq.cols, gSeqCol, sizeof( gSeqCol ) );
+ rc = Cursor_Open( &ctx.seq.tbl, &ctx.seq.curs, ctx.seq.cols, NULL );
+ if ( rc == 0 ) {
+ rc = DumpTable( &ctx );
+ Cursor_Close(&ctx.seq.curs);
+ }
+ VTableRelease( tbl );
+ }
+ return rc;
+}
+
+
+static void SetupColumns( DataSource *ds, enum eDSTableType type )
+{
+ memmove( ds->cols, g_alg_col_tmpl, sizeof( g_alg_col_tmpl ) );
+
+ ds->type = type;
+ if ( param->use_seqid )
+ ds->cols[ alg_MATE_REF_NAME ].name = "MATE_REF_SEQ_ID";
+ else
+ ds->cols[ alg_MATE_REF_NAME ].name = "MATE_REF_NAME";
+
+ if ( param->fasta || param->fastq )
+ ds->cols[ alg_READ ].name = "RAW_READ";
+ else if ( param->hide_identical )
+ ds->cols[ alg_READ ].name = "MISMATCH_READ";
+ else
+ ds->cols[ alg_READ ].name = "READ";
+
+ if ( param->long_cigar )
+ {
+ ds->cols[ alg_CIGAR ].name = "CIGAR_LONG";
+ ds->cols[ alg_CIGAR_LEN ].name = "CIGAR_LONG_LEN";
+ }
+ else
+ {
+ ds->cols[ alg_CIGAR ].name = "CIGAR_SHORT";
+ ds->cols[ alg_CIGAR_LEN ].name = "CIGAR_SHORT_LEN";
+ }
+
+ if(param->qualQuant && param->qualQuantSingle){ /** we don't really need quality ***/
+ ds->cols[ alg_SAM_QUALITY ].name = "";
+ }
+
+ switch ( type )
+ {
+ case edstt_EvidenceInterval:
+
+ ds->cols[ alg_SEQ_SPOT_ID ].name = "";
+ ds->cols[ alg_SEQ_NAME ].name = "";
+ ds->cols[ alg_SAM_QUALITY ].name = "";
+ ds->cols[ alg_SPOT_GROUP ].name = "";
+ ds->cols[ alg_SEQ_SPOT_GROUP].name = "";
+ ds->cols[ alg_SEQ_READ_ID ].name = "";
+ ds->cols[ alg_MATE_ALIGN_ID ].name = "";
+ ds->cols[ alg_MATE_REF_ID ].name = "";
+ ds->cols[ alg_MATE_REF_NAME ].name = "";
+ ds->cols[ alg_SAM_FLAGS ].name = "";
+ ds->cols[ alg_MATE_REF_POS ].name = "";
+ ds->cols[ alg_ALIGN_GROUP ].name = "";
+ ds->cols[ alg_TEMPLATE_LEN ].name = "";
+ if ( param->cg_sam || param->cg_ev_dnb )
+ ds->cols[ alg_EVIDENCE_ALIGNMENT_IDS ].name = "EVIDENCE_ALIGNMENT_IDS";
+ break;
+
+ case edstt_EvidenceAlignment:
+ ds->cols[ alg_REF_PLOIDY ].name = "REF_PLOIDY";
+ ds->cols[ alg_REF_ID ].name = "REF_ID";
+ ds->cols[ alg_MATE_ALIGN_ID ].name = "";
+ ds->cols[ alg_MATE_REF_ID ].name = "";
+ ds->cols[ alg_MATE_REF_NAME ].name = "";
+ ds->cols[ alg_SAM_FLAGS ].name = "";
+ ds->cols[ alg_MATE_REF_POS ].name = "";
+ ds->cols[ alg_ALIGN_GROUP ].name = "";
+ ds->cols[ alg_TEMPLATE_LEN ].name = "";
+ break;
+ default:
+ break;
+ }
+}
+
+
+static rc_t ProcessDB( VDatabase const *db, char const fullPath[],
+ char const accession[], char const readGroup[] )
+{
+ char const *const refTableName = ( param->region_qty > 0
+ || param->cg_evidence
+ || param->cg_ev_dnb
+ || param->cg_sam
+ || param->reheader
+ || param->primaries
+ || param->secondaries
+ )
+ ? "REFERENCE"
+ : 0;
+ char const *const priTableName = param->primaries ? "PRIMARY_ALIGNMENT" : 0;
+ char const *const secTableName = param->secondaries ? "SECONDARY_ALIGNMENT" : 0;
+ char const *const seqTableName = ( param->unaligned || param->reheader ) ? "SEQUENCE" : 0;
+ char const *const eviTableName = ( param->cg_evidence || ( param->cg_ev_dnb & ( param->region_qty > 0 ) ) || param->cg_sam ) ? "EVIDENCE_INTERVAL" : 0;
+ char const *const evaTableName = ( param->cg_ev_dnb || param->cg_sam ) ? "EVIDENCE_ALIGNMENT" : 0;
+
+ SAM_dump_ctx_t ctx;
+ SCol align_cols[ ( sizeof( g_alg_col_tmpl ) / sizeof( g_alg_col_tmpl[ 0 ] ) ) * 4 ];
+ SCol seq_cols[ sizeof( gSeqCol ) / sizeof( gSeqCol[ 0 ] ) ];
+ rc_t rc = 0;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+ memset( align_cols, 0, sizeof( align_cols ) );
+ memset( seq_cols, 0, sizeof( seq_cols ) );
+
+ ctx.db = db;
+ ctx.fullPath = fullPath;
+ ctx.accession = accession;
+ ctx.readGroup = readGroup;
+
+ DATASOURCE_INIT( ctx.seq, seqTableName );
+ DATASOURCE_INIT( ctx.ref, refTableName );
+ DATASOURCE_INIT( ctx.pri, priTableName );
+ DATASOURCE_INIT( ctx.sec, secTableName );
+ DATASOURCE_INIT( ctx.evi, eviTableName );
+ DATASOURCE_INIT( ctx.eva, evaTableName );
+
+ if ( ctx.seq.tbl.name )
+ {
+ rc = VDatabaseOpenTableRead( db, &ctx.seq.tbl.vtbl, "%s", ctx.seq.tbl.name );
+ if ( rc == 0 )
+ {
+ ctx.seq.cols = seq_cols;
+ memmove(seq_cols, gSeqCol, sizeof(gSeqCol));
+ rc = Cursor_Open( &ctx.seq.tbl, &ctx.seq.curs, ctx.seq.cols, NULL );
+ }
+ }
+ ctx.pri.cols = &align_cols[ 0 * ( sizeof( g_alg_col_tmpl ) / sizeof( g_alg_col_tmpl[ 0 ] ) ) ];
+ ctx.sec.cols = &align_cols[ 1 * ( sizeof( g_alg_col_tmpl ) / sizeof( g_alg_col_tmpl[ 0 ] ) ) ];
+ ctx.evi.cols = &align_cols[ 2 * ( sizeof( g_alg_col_tmpl ) / sizeof( g_alg_col_tmpl[ 0 ] ) ) ];
+ ctx.eva.cols = &align_cols[ 3 * ( sizeof( g_alg_col_tmpl ) / sizeof( g_alg_col_tmpl[ 0 ] ) ) ];
+
+ SetupColumns( &ctx.pri, edstt_PrimaryAlignment );
+ SetupColumns( &ctx.sec, edstt_SecondaryAlignment );
+ SetupColumns( &ctx.evi, edstt_EvidenceInterval );
+ SetupColumns( &ctx.eva, edstt_EvidenceAlignment );
+
+ if ( ctx.pri.tbl.name )
+ VDatabaseOpenTableRead( db, &ctx.pri.tbl.vtbl, "%s", ctx.pri.tbl.name );
+ if ( ctx.sec.tbl.name )
+ VDatabaseOpenTableRead( db, &ctx.sec.tbl.vtbl, "%s", ctx.sec.tbl.name );
+ if ( ctx.evi.tbl.name )
+ VDatabaseOpenTableRead( db, &ctx.evi.tbl.vtbl, "%s", ctx.evi.tbl.name );
+ if ( ctx.eva.tbl.name )
+ VDatabaseOpenTableRead( db, &ctx.eva.tbl.vtbl, "%s", ctx.eva.tbl.name );
+
+ if ( ctx.pri.tbl.vtbl == NULL
+ && ctx.sec.tbl.vtbl == NULL
+ && ctx.evi.tbl.vtbl == NULL
+ && ctx.eva.tbl.vtbl == NULL )
+ {
+ memset (&ctx.pri, 0, sizeof( ctx.pri ) * 4 );
+ if ( ctx.seq.tbl.name == NULL )
+ {
+ ctx.seq.tbl.name = "SEQUENCE";
+ rc = VDatabaseOpenTableRead( db, &ctx.seq.tbl.vtbl, "%s", ctx.seq.tbl.name );
+ }
+ if ( rc == 0 )
+ {
+ ctx.seq.cols = seq_cols;
+ memmove(seq_cols, gSeqCol, sizeof(gSeqCol));
+ rc = Cursor_Open(&ctx.seq.tbl, &ctx.seq.curs, ctx.seq.cols, NULL);
+ if ( rc == 0 )
+ {
+ rc = DumpTable( &ctx );
+ Cursor_Close(&ctx.seq.curs);
+ }
+ VTableRelease(ctx.seq.tbl.vtbl);
+ }
+ VDatabaseRelease( db );
+ return rc;
+ }
+ ReportResetDatabase( fullPath, db );
+
+ if ( ctx.ref.tbl.name )
+ {
+ rc = VDatabaseOpenTableRead( db, &ctx.ref.tbl.vtbl, "%s", ctx.ref.tbl.name );
+ ctx.ref.type = edstt_Reference;
+ }
+ if ( rc == 0 )
+ rc = Cursor_Open( &ctx.pri.tbl, &ctx.pri.curs, ctx.pri.cols, ctx.seq.curs.cache );
+ if ( rc == 0 )
+ rc = Cursor_Open( &ctx.sec.tbl, &ctx.sec.curs, ctx.sec.cols, NULL );
+ if ( rc == 0 )
+ rc = Cursor_Open( &ctx.evi.tbl, &ctx.evi.curs, ctx.evi.cols, NULL );
+ if ( rc == 0 )
+ rc = Cursor_Open( &ctx.eva.tbl, &ctx.eva.curs, ctx.eva.cols, NULL );
+ if ( rc == 0 )
+ rc = DumpDB( &ctx );
+
+ Cursor_Close(&ctx.ref.curs);
+ Cursor_Close(&ctx.pri.curs);
+ Cursor_Close(&ctx.sec.curs);
+ Cursor_Close(&ctx.evi.curs);
+ Cursor_Close(&ctx.eva.curs);
+ Cursor_Close(&ctx.seq.curs);
+
+ VTableRelease( ctx.ref.tbl.vtbl );
+ VTableRelease( ctx.pri.tbl.vtbl );
+ VTableRelease( ctx.sec.tbl.vtbl );
+ VTableRelease( ctx.evi.tbl.vtbl );
+ VTableRelease( ctx.eva.tbl.vtbl );
+ VTableRelease( ctx.seq.tbl.vtbl );
+
+ return rc;
+}
+
+#if 0
+rc_t ResolvePath( char const *accession, char const ** path )
+{
+ rc_t rc = 0;
+ static char tblpath[ 4096 ];
+#if TOOLS_USE_SRAPATH != 0
+ static SRAPath* pmgr = NULL;
+
+ if ( accession == NULL && path == NULL )
+ {
+ SRAPathRelease( pmgr );
+ return 0;
+ }
+ if ( pmgr != NULL
+ || ( rc = SRAPathMake( &pmgr, NULL ) ) == 0
+ || ( GetRCState( rc ) == rcNotFound && GetRCTarget( rc ) == rcDylib ) )
+ {
+ *path = tblpath;
+ tblpath[ 0 ] = '\0';
+ rc = 0;
+ do {
+ if ( pmgr != NULL && !SRAPathTest( pmgr, accession ) )
+ {
+ /* try to resolve the path using mgr */
+ rc = SRAPathFind( pmgr, accession, tblpath, sizeof( tblpath ) );
+ if ( rc == 0 )
+ break;
+ }
+ if ( string_size( accession ) >= sizeof( tblpath ) )
+ {
+ rc = RC( rcExe, rcPath, rcResolving, rcBuffer, rcInsufficient );
+ }
+ else
+ {
+ string_copy( tblpath, ( sizeof tblpath ) - 1, accession, string_size( accession ) );
+ rc = 0;
+ }
+ } while( false );
+ }
+#else
+ if ( accession != NULL && path != NULL )
+ {
+ *path = tblpath;
+ string_copy( tblpath, ( sizeof tblpath ) - 1, accession, string_size( accession ) );
+ }
+#endif
+
+ return rc;
+}
+#endif
+
+
+static rc_t ProcessPath( VDBManager const *mgr, char const Path[] )
+{
+#if 0
+ unsigned pathlen = string_size( Path );
+ char *readGroup = NULL;
+ char *path = NULL;
+ unsigned i;
+ rc_t rc;
+
+ /* strip trailing path seperators */
+ for ( i = pathlen; i > 0; )
+ {
+ int const ch = Path[ --i ];
+
+ if ( ch == '/' || ch == '\\' )
+ --pathlen;
+ else
+ break;
+ }
+
+ /* find read group alias */
+ for ( i = pathlen; i > 0; )
+ {
+ int const ch = Path[ --i ];
+
+ if ( ch == '=' )
+ {
+ unsigned const pos = i + 1;
+ unsigned const len = pathlen - pos;
+
+ pathlen = i;
+
+ readGroup = malloc( len + 1 );
+ if ( readGroup == NULL )
+ return RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ memmove( readGroup, &Path[ pos ], len );
+ readGroup[ len ] = '\0';
+ break;
+ }
+ }
+
+ path = malloc( pathlen + 1 );
+ if ( path == NULL )
+ return RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ memmove( path, Path, pathlen );
+ path[ pathlen ] = '\0';
+
+ rc = ReportResetObject( path );
+ if ( rc == 0 )
+ {
+ char const *fullPath;
+
+ rc = ResolvePath( path, &fullPath );
+ if ( rc == 0 )
+ {
+ char const *accession = fullPath;
+ VDatabase const *db;
+
+ /* use last path element as accession */
+ for ( i = pathlen; i > 0; )
+ {
+ int const ch = path[ --i ];
+
+ if ( ch == '/' || ch == '\\' )
+ {
+ accession = &fullPath[ i + 1 ];
+ break;
+ }
+ }
+ rc = VDBManagerOpenDBRead( mgr, &db, NULL, "%s", fullPath );
+ if ( rc == 0 )
+ {
+ rc = ProcessDB( db, fullPath, accession, readGroup );
+ VDatabaseRelease( db );
+ }
+ else
+ rc = ProcessTable( mgr, fullPath, accession, readGroup );
+ }
+ }
+ free( path );
+ free( readGroup );
+ return rc;
+
+#else
+
+ char * pc;
+ rc_t rc = 0;
+ size_t pathlen = string_size ( Path );
+
+ /* look for scheme */
+ pc = string_chr ( Path, pathlen, ':' );
+ if (pc == NULL)
+ {
+ char *readGroup;
+ char *path;
+ size_t i;
+
+ /* no scheme found - must be simple fs path */
+ /* old: ---unused label */
+ readGroup = NULL;
+ path = NULL;
+
+ /* strip trailing path separators */
+ for ( i = pathlen; i > 0; -- pathlen )
+ {
+ int const ch = Path[ --i ];
+ if ( ch != '/' && ch != '\\' )
+ break;
+ }
+
+ /* find read group alias */
+ for ( i = pathlen; i > 0; )
+ {
+ int const ch = Path[ --i ];
+
+ if ( ch == '=' )
+ {
+ size_t const pos = i + 1;
+ size_t const len = pathlen - pos;
+
+ pathlen = i;
+
+ readGroup = malloc( len + 1 );
+ if ( readGroup == NULL )
+ return RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ memmove( readGroup, &Path[ pos ], len );
+ readGroup[ len ] = '\0';
+ break;
+ }
+ }
+
+ path = malloc( pathlen + 1 );
+ if ( path == NULL )
+ return RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ memmove( path, Path, pathlen );
+ path[ pathlen ] = '\0';
+
+ rc = ReportResetObject( path );
+ if ( rc == 0 )
+ {
+ char const *accession = path;
+ VDatabase const *db;
+
+ /* use last path element as accession */
+ for ( i = pathlen; i > 0; )
+ {
+ int const ch = path[ --i ];
+
+ if ( ch == '/' || ch == '\\' )
+ {
+ accession = &path[ i + 1 ];
+ break;
+ }
+ }
+ rc = VDBManagerOpenDBRead( mgr, &db, NULL, "%s", path );
+ if ( rc == 0 )
+ {
+ rc = ProcessDB( db, path, accession, readGroup );
+ if (UIError(rc, db, NULL)) {
+ UIDatabaseLOGError(rc, db, true);
+/* *error_reported = true; */
+ }
+ VDatabaseRelease( db );
+ }
+ else {
+ rc = ProcessTable( mgr, path, accession, readGroup );
+ if (UIError(rc, NULL, NULL)) {
+ UITableLOGError(rc, NULL, true);
+/* *error_reported = true; */
+ }
+ }
+ }
+ free( path );
+ free( readGroup );
+ return rc;
+ }
+ else
+ {
+ VFSManager * vfs;
+ rc = VFSManagerMake ( & vfs );
+ if ( rc == 0 )
+ {
+ VPath * vpath;
+ char * basename;
+ size_t zz;
+ char buffer [8193];
+ char readgroup_ [257];
+ char * readgroup;
+
+ rc = VFSManagerMakePath (vfs, &vpath, "%s", Path);
+ VFSManagerRelease ( vfs );
+ if ( rc == 0 )
+ {
+ char * ext;
+
+ rc = VPathReadPath (vpath, buffer, sizeof buffer - 1, &zz);
+ if ( rc == 0 )
+ {
+ loop:
+ basename = string_rchr (buffer, zz, '/');
+ if ( basename == NULL )
+ basename = buffer;
+ else
+ {
+ if (basename[1] == '\0')
+ {
+ basename[0] = '\0';
+ goto loop;
+ }
+ ++ basename;
+ zz -= basename - buffer;
+ }
+
+ /* cut off [.lite].[c]sra[.nenc||.ncbi_enc] if any */
+ ext = string_rchr( basename, zz, '.' );
+ if ( ext != NULL )
+ {
+ if ( strcasecmp( ext, ".nenc" ) == 0 || strcasecmp( ext, ".ncbi_enc" ) == 0 )
+ {
+ zz -= ext - basename;
+ *ext = '\0';
+ ext = string_rchr( basename, zz, '.' );
+ }
+
+ if ( ext != NULL )
+ {
+ if ( strcasecmp( ext, ".sra" ) == 0 || strcasecmp( ext, ".csra" ) == 0 )
+ {
+ zz -= ext - basename;
+ *ext = '\0';
+ ext = string_rchr( basename, zz, '.' );
+ if ( ext != NULL && strcasecmp( ext, ".lite" ) == 0 )
+ *ext = '\0';
+ }
+ }
+ }
+
+ rc = VPathOption (vpath, vpopt_readgroup, readgroup_,
+ sizeof readgroup_ - 1, &zz);
+ if ( rc == 0 )
+ readgroup = readgroup_;
+ else if ( GetRCState ( rc ) == rcNotFound )
+ {
+ rc = 0;
+ readgroup = NULL;
+ }
+
+
+ if ( rc == 0 )
+ {
+ VDatabase const *db;
+
+ rc = VDBManagerOpenDBRead( mgr, &db, NULL, "%s", Path );
+ if ( rc == 0 )
+ {
+ rc = ProcessDB( db, Path, basename, readgroup );
+ VDatabaseRelease( db );
+ }
+ else
+ rc = ProcessTable( mgr, Path, basename, readgroup );
+ }
+ }
+
+ VPathRelease (vpath);
+ }
+ }
+ }
+ return rc;
+#endif
+}
+
+/*
+ver_t CC KAppVersion( void )
+{
+ return SAM_DUMP_VERS;
+}
+*/
+
+char const *unaligned_usage[] = {"Output unaligned reads", NULL};
+char const *unaligned_only_usage[] = {"Only output unaligned spots", NULL};
+char const *primaryonly_usage[] = {"Output only primary alignments", NULL};
+char const *cigartype_usage[] = {"Output long version of CIGAR", NULL};
+char const *cigarCG_usage[] = {"Output CG version of CIGAR", NULL};
+char const *cigarCGMerge_usage[] = {"Apply CG fixups to CIGAR/SEQ/QUAL and outputs CG-specific columns", NULL};
+char const *CG_evidence[] = {"Output CG evidence aligned to reference", NULL};
+char const *CG_ev_dnb[] = {"Output CG evidence DNB's aligned to evidence", NULL};
+char const *CG_SAM[] = {"Output CG evidence DNB's aligned to reference ", NULL};
+char const *CG_mappings[] = {"Output CG sequences aligned to reference ", NULL};
+char const *header_usage[] = {"Replace original BAM header with a reconstructed one", NULL};
+char const *noheader_usage[] = {"Do not output headers", NULL};
+char const *region_usage[] = {"Filter by position on genome.",
+ "Name can either be file specific name (ex: \"chr1\" or \"1\").",
+ "\"from\" and \"to\" are 1-based coordinates", NULL};
+char const *distance_usage[] = {"Filter by distance between matepairs.",
+ "Use \"unknown\" to find matepairs split between the references.",
+ "Use from-to to limit matepair distance on the same reference", NULL};
+char const *seq_id_usage[] = {"Print reference SEQ_ID in RNAME instead of NAME", NULL};
+char const *identicalbases_usage[] = {"Output '=' if base is identical to reference", NULL};
+char const *gzip_usage[] = {"Compress output using gzip", NULL};
+char const *bzip2_usage[] = {"Compress output using bzip2", NULL};
+char const *qname_usage[] = {"Add .SPOT_GROUP to QNAME", NULL};
+char const *fasta_usage[] = {"Produce Fasta formatted output", NULL};
+char const *fastq_usage[] = {"Produce FastQ formatted output", NULL};
+char const *prefix_usage[] = {"Prefix QNAME: prefix.QNAME", NULL};
+char const *reverse_usage[] = {"Reverse unaligned reads according to read type", NULL};
+char const *comment_usage[] = {"Add comment to header. Use multiple times for several lines. Use quotes", NULL};
+char const *XI_usage[] = {"Output cSRA alignment id in XI column", NULL};
+char const *qual_quant_usage[] = {"Quality scores quantization level",
+ "a string like '1:10,10:20,20:30,30:-'", NULL};
+char const *CG_names[] = { "Generate CG friendly read names", NULL};
+
+char const *usage_params[] =
+{
+ NULL, /* unaligned */
+ NULL, /* unaligned-only */
+ NULL, /* primaryonly */
+ NULL, /* cigartype */
+ NULL, /* cigarCG */
+ NULL, /* header */
+ NULL, /* no-header */
+ "text", /* comment */
+ "name[:from-to]", /* region */
+ "from-to|'unknown'", /* distance */
+ NULL, /* seq-id */
+ NULL, /* identical-bases */
+ NULL, /* gzip */
+ NULL, /* bzip2 */
+ NULL, /* qname */
+ NULL, /* fasta */
+ NULL, /* fastq */
+ "prefix", /* prefix */
+ NULL, /* reverse */
+ NULL, /* test-rows */
+ NULL, /* mate-row-gap-cacheable */
+ NULL, /* cigarCGMerge */
+ NULL, /* XI */
+ "quantization string", /* qual-quant */
+ NULL, /* cigarCGMerge */
+ NULL, /* CG-evidence */
+ NULL, /* CG-ev-dnb */
+ NULL, /* CG-mappings */
+ NULL, /* CG-SAM */
+ NULL /* CG-names */
+};
+
+enum eArgs
+{
+ earg_unaligned = 0, /* unaligned */
+ earg_unaligned_only, /* unaligned */
+ earg_prim_only, /* primaryonly */
+ earg_cigartype, /* cigartype */
+ earg_cigarCG, /* cigarCG */
+ earg_header, /* header */
+ earg_noheader, /* no-header */
+ earg_comment, /* comment */
+ earg_region, /* region */
+ earg_distance, /* distance */
+ earg_seq_id, /* seq-id */
+ earg_identicalbases, /* identical-bases */
+ earg_gzip, /* gzip */
+ earg_bzip2, /* bzip2 */
+ earg_qname, /* qname */
+ earg_fastq, /* fasta */
+ earg_fasta, /* fastq */
+ earg_prefix, /* prefix */
+ earg_reverse, /* reverse */
+ earg_test_rows, /* test-rows */
+ earg_mate_row_gap_cachable, /* mate-row-gap-cacheable */
+ earg_cigarCG_merge, /* cigarCGMerge */
+ earg_XI, /* XI */
+ earg_QualQuant, /* qual-quant */
+ earg_CG_evidence, /* CG-evidence */
+ earg_CG_ev_dnb, /* CG-ev-dnb */
+ earg_CG_mappings, /* CG-mappings */
+ earg_CG_SAM, /* CG-SAM */
+ earg_CG_names /* CG-names */
+};
+
+OptDef DumpArgs[] =
+{
+ { "unaligned", "u", NULL, unaligned_usage, 0, false, false }, /* unaligned */
+ { "unaligned-only", "U", NULL, unaligned_usage, 0, false, false }, /* unaligned-only */
+ { "primary", "1", NULL, primaryonly_usage, 0, false, false }, /* primaryonly */
+ { "cigar-long", "c", NULL, cigartype_usage, 0, false, false }, /* cigartype */
+ { "cigar-CG", NULL, NULL, cigarCG_usage, 0, false, false }, /* cigarCG */
+ { "header", "r", NULL, header_usage, 0, false, false }, /* header */
+ { "no-header", "n", NULL, noheader_usage, 0, false, false }, /* no-header */
+ { "header-comment", NULL, NULL, comment_usage, 0, true, false }, /* comment */
+ { "aligned-region", NULL, NULL, region_usage, 0, true, false }, /* region */
+ { "matepair-distance", NULL, NULL, distance_usage, 0, true, false }, /* distance */
+ { "seqid", "s", NULL, seq_id_usage, 0, false, false }, /* seq-id */
+ { "hide-identical", "=", NULL, identicalbases_usage, 0, false, false }, /* identical-bases */
+ { "gzip", NULL, NULL, gzip_usage, 0, false, false }, /* gzip */
+ { "bzip2", NULL, NULL, bzip2_usage, 0, false, false }, /* bzip2 */
+ { "spot-group", "g", NULL, qname_usage, 0, false, false }, /* qname */
+ { "fastq", NULL, NULL, fastq_usage, 0, false, false }, /* fasta */
+ { "fasta", NULL, NULL, fasta_usage, 0, false, false }, /* fastq */
+ { "prefix", "p", NULL, prefix_usage, 0, true, false }, /* prefix */
+ { "reverse", NULL, NULL, reverse_usage, 0, false, false }, /* reverse */
+ { "test-rows", NULL, NULL, NULL, 0, true, false }, /* test-rows */
+ { "mate-cache-row-gap", NULL, NULL, NULL, 0, true, false }, /* mate-row-gap-cacheable */
+ { "cigar-CG-merge", NULL, NULL, cigarCGMerge_usage, 0, false, false }, /* cigarCGMerge */
+ { "XI", NULL, NULL, XI_usage, 0, false, false }, /* XI */
+ { "qual-quant", "Q", NULL, qual_quant_usage, 0, true, false }, /* qual-quant */
+ { "CG-evidence", NULL, NULL, CG_evidence, 0, false, false }, /* CG-evidence */
+ { "CG-ev-dnb" , NULL, NULL, CG_ev_dnb , 0, false, false }, /* CG-ev-dnb */
+ { "CG-mappings", NULL, NULL, CG_mappings, 0, false, false }, /* CG-mappings */
+ { "CG-SAM", NULL, NULL, CG_SAM, 0, false, false }, /* CG-SAM */
+ { "CG-names", NULL, NULL, CG_names, 0, false, false }, /* CG-names */
+ { "legacy", NULL, NULL, NULL, 0, false, false }
+};
+
+
+/*
+const char UsageDefaultName[] = "sam-dump";
+
+
+rc_t CC UsageSummary( char const *progname )
+{
+ return KOutMsg( "Usage:\n"
+ "\t%s [options] path-to-run[ path-to-run ...] > output.sam\n\n", progname );
+}
+
+
+rc_t CC Usage( Args const *args)
+{
+ char const *progname = UsageDefaultName;
+ char const *fullpath = UsageDefaultName;
+ rc_t rc;
+ unsigned i;
+
+ rc = ArgsProgram( args, &fullpath, &progname );
+
+ UsageSummary( progname );
+
+ KOutMsg( "Options:\n" );
+ for( i = 0; i < sizeof( DumpArgs ) / sizeof( DumpArgs[ 0 ] ); i++ )
+ {
+ if ( DumpArgs[ i ].help != NULL )
+ {
+ HelpOptionLine( DumpArgs[ i ].aliases, DumpArgs[ i ].name,
+ usage_params[ i ], DumpArgs[ i ].help);
+ }
+ }
+ KOutMsg( "\n" );
+ HelpOptionsStandard();
+
+ HelpVersion( fullpath, KAppVersion() );
+
+ return rc;
+}
+*/
+
+#define ARGS_COUNT (sizeof(DumpArgs)/sizeof(DumpArgs[0]))
+
+
+static unsigned ParamCount( Args const *const args, rc_t *const prc )
+{
+ uint32_t y = 0;
+ rc_t rc = ArgsParamCount( args, &y );
+
+ if ( prc != NULL )
+ *prc = rc;
+ return y;
+}
+
+
+static unsigned ArgCount( Args const *const args, rc_t *const prc )
+{
+ uint32_t y = 0;
+ rc_t rc = ArgsArgvCount( args, &y );
+
+ if ( prc != NULL )
+ *prc = rc;
+ return y;
+}
+
+
+static rc_t CountArgs( Args const *const args, unsigned count[],
+ char const **const errmsg )
+{
+ rc_t rc;
+ unsigned const pcount = ParamCount( args, &rc );
+
+ memset( count, 0, ARGS_COUNT );
+ if ( rc != 0 || pcount == 0 )
+ {
+ *errmsg = "";
+ MiniUsage( args );
+ return ( ArgCount( args, NULL ) < 2 )
+ ? 0
+ : RC( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ }
+#define COUNT_ARG(E) do {\
+ char const *const optname = DumpArgs[ (E) ].name; \
+ if ( ( rc = ArgsOptionCount( args, optname, &count[ (E) ] ) ) != 0 ) { \
+ *errmsg = optname; \
+ return rc; \
+ } } while( 0 )
+
+
+ /* record source options */
+ COUNT_ARG( earg_unaligned );
+ COUNT_ARG( earg_unaligned_only );
+ COUNT_ARG( earg_prim_only );
+ COUNT_ARG( earg_CG_evidence );
+ COUNT_ARG( earg_CG_ev_dnb );
+ COUNT_ARG( earg_CG_mappings );
+ COUNT_ARG( earg_CG_SAM );
+
+ /* record filter options */
+ COUNT_ARG( earg_region );
+ COUNT_ARG( earg_distance );
+
+ /* output format options */
+ COUNT_ARG( earg_fastq );
+ COUNT_ARG( earg_fasta );
+
+ /* SAM header options */
+ COUNT_ARG( earg_header );
+ COUNT_ARG( earg_noheader );
+ COUNT_ARG( earg_comment );
+
+ /* SAM field options */
+ COUNT_ARG( earg_prefix );
+ COUNT_ARG( earg_qname );
+ COUNT_ARG( earg_seq_id );
+ COUNT_ARG( earg_CG_names );
+
+ COUNT_ARG( earg_cigartype );
+ COUNT_ARG( earg_cigarCG );
+ COUNT_ARG( earg_cigarCG_merge );
+
+ COUNT_ARG( earg_identicalbases );
+ COUNT_ARG( earg_reverse );
+ COUNT_ARG( earg_QualQuant );
+
+ /* output encoding options */
+ COUNT_ARG( earg_gzip );
+ COUNT_ARG( earg_bzip2 );
+
+ COUNT_ARG( earg_mate_row_gap_cachable );
+
+ /* debug options */
+ COUNT_ARG( earg_XI );
+ COUNT_ARG( earg_test_rows );
+#undef COUNT_ARG
+ return 0;
+}
+
+
+static unsigned GetOptValU( Args const *const args, char const *const argname,
+ unsigned const defval, rc_t *const prc )
+{
+ unsigned y = defval;
+ char const *valstr;
+ rc_t rc = ArgsOptionValue( args, argname, 0, (const void **)&valstr );
+
+ if ( rc == 0 )
+ {
+ char *endp;
+
+ y = strtou32( valstr, &endp, 0 );
+ if ( *endp != '\0' )
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcParam, rcInvalid );
+ y = 0;
+ }
+ if ( y == 0 )
+ y = defval;
+ }
+ if ( prc )
+ *prc = rc;
+ return y;
+}
+
+
+static rc_t GetComments( Args const *const args, struct params_s *const parms, unsigned const n )
+{
+ parms->comments = calloc( n + 1, sizeof( parms->comments[ 0 ] ) );
+ if ( parms->comments != NULL )
+ {
+ unsigned i;
+
+ for ( i = 0; i < n; ++i )
+ {
+ rc_t const rc = ArgsOptionValue( args, DumpArgs[ earg_comment ].name, i, (const void **)&parms->comments[ i ] );
+ if ( rc != 0 )
+ {
+ free( ( void * )parms->comments );
+ parms->comments = NULL;
+ return rc;
+ }
+ }
+ return 0;
+ }
+ else
+ return RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+}
+
+
+static rc_t ParseFromTo( int *const pFrom, int *const pTo, char const str[] )
+{
+ /* $str =~ /((\d+)-(\d+))|(-(\d+))|(\d+)/ */
+ int n;
+ char fr_str[ 16 ];
+ char to_str[ 16 ];
+ uint32_t fr = 0;
+ uint32_t to = 0;
+ int i = sscanf( str, "%15[0-9]-%15[0-9]%n", fr_str, to_str, &n );
+
+ if ( i != 2 )
+ {
+ unsigned const offset = ( str[ 0 ] == '-' ) ? 1 : 0;
+
+ fr = 0;
+ i = sscanf( str + offset, "%15[0-9]%n", to_str, &n );
+ if ( i != 1 )
+ return RC( rcExe, rcArgv, rcProcessing, rcParam, rcOutofrange );
+ to = strtou32( to_str, 0, 0 );
+ }
+ else
+ {
+ fr = strtou32( fr_str, 0, 0 );
+ to = strtou32( to_str, 0, 0 );
+
+ if ( to < fr )
+ {
+ uint32_t const tmp = to;
+ to = fr;
+ fr = tmp;
+ }
+ }
+ /* was the entire string consumed */
+ if ( str[ n ] != 0 )
+ return RC( rcExe, rcArgv, rcProcessing, rcParam, rcInvalid );
+ *pFrom = ( int )fr;
+ *pTo = ( int )to;
+ return 0;
+}
+
+
+static rc_t GetDistance( Args const *const args, struct params_s *const parms, unsigned const n )
+{
+ rc_t rc;
+ TMatepairDistance *const mpd = calloc( n, sizeof( mpd[ 0 ] ) );
+
+ if ( mpd == NULL )
+ rc = RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ else
+ {
+ unsigned i;
+ unsigned j;
+
+ for ( j = i = 0; i < n; ++i )
+ {
+ char const *valstr;
+ int from = 0;
+ int to = 0;
+
+ rc = ArgsOptionValue( args, DumpArgs[earg_distance].name, i, (const void **)&valstr );
+ if ( rc != 0 )
+ break;
+ if ( strcasecmp( valstr, "unknown" ) == 0 )
+ {
+ parms->mp_dist_unknown = true;
+ continue;
+ }
+ rc = ParseFromTo( &from, &to, valstr );
+ if ( rc != 0 )
+ break;
+ if ( ( from != 0 ) || ( to != 0 ) )
+ {
+ mpd[ j ].from = from;
+ mpd[ j ].to = to;
+ ++j;
+ }
+ }
+ if ( rc == 0 )
+ {
+ parms->mp_dist = mpd;
+ parms->mp_dist_qty = j;
+
+ SAM_DUMP_DBG( 2, ( "filter by mate pair distance\n" ) );
+ if ( parms->mp_dist_unknown )
+ SAM_DUMP_DBG( 2, ( " distance: unknown\n" ) );
+ for ( i = 0; i < j; ++i )
+ {
+ SAM_DUMP_DBG( 2, ( " distance [%lu-%lu]\n",
+ parms->mp_dist[ i ].from, parms->mp_dist[ i ].to ) );
+ }
+ }
+ else
+ free( mpd );
+ }
+ return rc;
+}
+
+
+static rc_t GetRegion( Args const *const args, struct params_s *const parms, unsigned const n )
+{
+ rc_t rc;
+ TAlignedRegion *const reg = calloc( n, sizeof( reg[ 0 ] ) );
+
+ if ( reg == NULL )
+ rc = RC( rcExe, rcArgv, rcProcessing, rcMemory, rcExhausted );
+ else
+ {
+ unsigned i;
+ unsigned j;
+
+ for ( rc = 0, j = i = 0; i < n; ++i )
+ {
+ char const *valstr;
+ char const *sep;
+ unsigned namelen;
+ unsigned f;
+ unsigned e;
+ TAlignedRegion r;
+
+ memset(&r,0,sizeof(r));
+
+ rc = ArgsOptionValue( args, DumpArgs[ earg_region ].name, i, (const void **)&valstr );
+ if ( rc != 0 ) break;
+
+ sep = strchr( valstr, ':' );
+ if ( sep != NULL )
+ namelen = sep - valstr;
+ else
+ namelen = string_size( valstr );
+
+ if ( namelen >= sizeof( r.name ) )
+ return RC( rcExe, rcArgv, rcProcessing, rcParam, rcTooLong );
+
+ memmove( r.name, valstr, namelen );
+ r.name[ namelen ] = '\0';
+
+ r.rq = UINT_MAX;
+ if ( sep != NULL )
+ {
+ int from = -1;
+ int to = -1;
+
+ rc = ParseFromTo( &from, &to, sep + 1 );
+ if ( rc != 0 )
+ break;
+ if ( from > 0 ) /* convert to 0-based */
+ --from;
+ else if ( to > 0 )
+ from = 0;
+ if ( to > 0 )
+ --to;
+ else if ( from >= 0 && to < 0 )
+ to = from;
+ if ( from >= 0 || to >= 0 )
+ {
+ if ( from > to )
+ {
+ int tmp = to;
+ to = from;
+ from = tmp;
+ }
+ r.r[ 0 ].from = from;
+ r.r[ 0 ].to = to;
+ r.rq = 1;
+ }
+ }
+
+ for ( f = 0, e = j; f < e; )
+ {
+ unsigned const m = ( ( f + e ) / 2 );
+ int const diff = strcmp( r.name, reg[ m ].name );
+
+ if ( diff < 0 )
+ e = m;
+ else
+ f = m + 1;
+ }
+ if ( 0 < e && e < j && strcmp( r.name, reg[ e-1 ].name ) == 0 )
+ {
+ TAlignedRegion *const fnd = ®[ e - 1 ];
+
+ if ( fnd->rq != UINT_MAX )
+ {
+ for ( f = 0, e = fnd->rq; f < e; )
+ {
+ unsigned const m = ( ( f + e ) / 2 );
+
+ if ( r.r[ 0 ].from < fnd->r[ m ].from )
+ e = m;
+ else
+ f = m + 1;
+ }
+ if ( fnd->rq >= ( sizeof( r.r ) / sizeof( r.r[0] ) ) )
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcBuffer, rcInsufficient );
+ break;
+ }
+ memmove( &fnd->r[ e +1 ], &fnd->r[ e ], ( fnd->rq - e ) * sizeof( fnd->r[ 0 ] ) );
+ fnd->r[ e ] = r.r[ 0 ];
+ ++fnd->rq;
+ }
+ }
+ else
+ {
+ memmove( ®[ e + 1 ], ®[ e ], ( j - e ) * sizeof( reg[ 0 ] ) );
+ reg[ e ] = r;
+ ++j;
+ }
+ }
+ if ( rc == 0 )
+ {
+ parms->region = reg;
+ parms->region_qty = j;
+
+ for ( i = 0; i < parms->region_qty; ++i )
+ {
+ TAlignedRegion *const r = &parms->region[ i ];
+
+ SAM_DUMP_DBG( 2, ( "filter by %s\n", r->name ) );
+ if ( r->rq == UINT_MAX )
+ {
+ r->rq = 1;
+ r->r[ 0 ].from = 0;
+ r->r[ 0 ].to = UINT_MAX;
+ }
+ for ( j = 0; j < r->rq; ++j )
+ {
+ unsigned const to = r->r[ j ].to;
+ unsigned const from = r->r[ j ].from;
+
+ SAM_DUMP_DBG( 2, ( " range: [%u:%u]\n", r->r[ j ].from, to ) );
+ if ( r->max_to < to ) r->max_to = to;
+ if ( r->min_from < from ) r->min_from = from;
+ }
+ }
+ }
+ else
+ free( reg );
+ }
+ return rc;
+}
+
+
+static rc_t GetQualQuant( Args const *const args, struct params_s *const parms )
+{
+ char const *valstr;
+ int i;
+ rc_t rc = ArgsOptionValue( args, DumpArgs[ earg_QualQuant ].name, 0, (const void **)&valstr );
+
+ if ( rc == 0 && strcmp( valstr, "0" ) != 0 )
+ parms->quantizeQual = QualityQuantizerInitMatrix( parms->qualQuant, valstr );
+ for(i=1; parms->qualQuant[i]==parms->qualQuant[0] && i<256;i++){}
+ if(i<256) parms->qualQuantSingle=0;
+ else parms->qualQuantSingle = parms->qualQuant[0];
+ return rc;
+}
+
+
+static rc_t GetArgs( Args const *const args, unsigned const count[],
+ char const **const errmsg )
+{
+ static struct params_s parms;
+ bool const multipass = ParamCount( args, 0 ) > 1;
+ rc_t rc;
+
+ memset( &parms, 0, sizeof( parms ) );
+
+ if ( count[ earg_comment ] )
+ {
+ rc = GetComments( args, &parms, count[ earg_comment ] );
+ if ( rc != 0 )
+ {
+ *errmsg = DumpArgs[ earg_comment ].name;
+ return rc;
+ }
+ }
+
+ if ( count[ earg_region ] && count[ earg_unaligned_only ] == 0 )
+ {
+ rc = GetRegion( args, &parms, count[ earg_region ] );
+ if ( rc != 0 )
+ {
+ *errmsg = DumpArgs[ earg_region ].name;
+ return rc;
+ }
+ }
+
+ if ( count[ earg_distance ] && count[ earg_unaligned_only ] == 0 )
+ {
+ rc = GetDistance( args, &parms, count[ earg_distance ] );
+ if ( rc != 0 )
+ {
+ *errmsg = DumpArgs[ earg_distance ].name;
+ return rc;
+ }
+ }
+
+ if ( count[ earg_QualQuant ] )
+ {
+ rc = GetQualQuant( args, &parms );
+ if ( rc != 0 )
+ {
+ *errmsg = DumpArgs[ earg_QualQuant ].name;
+ return rc;
+ }
+ }
+
+ parms.cg_sam = ( count[ earg_CG_SAM ] != 0 );
+ parms.cg_evidence = ( count[ earg_CG_evidence ] != 0 );
+ parms.cg_ev_dnb = ( count[ earg_CG_ev_dnb ] != 0 );
+
+ if ( count[ earg_CG_mappings ] == 0 &&
+ ( parms.cg_sam || parms.cg_evidence || parms.cg_ev_dnb ) )
+ {
+ parms.primaries = false;
+ parms.secondaries = false;
+ parms.unaligned = false;
+ }
+ else
+ {
+ parms.primaries = true;
+ parms.secondaries = ( count[ earg_prim_only ] == 0 );
+ parms.unaligned = ( ( count[ earg_unaligned ] != 0 ) /*&& ( parms.region_qty == 0 )*/ );
+ }
+
+ parms.long_cigar = ( count[ earg_cigartype ] != 0 );
+ parms.use_seqid = ( ( count[ earg_seq_id ] != 0 ) || multipass );
+ parms.hide_identical = ( count[ earg_identicalbases ] != 0 );
+ parms.fasta = ( count[ earg_fasta ] != 0 );
+ parms.fastq = ( count[ earg_fastq ] != 0 );
+ parms.reverse_unaligned = ( count[ earg_reverse ] != 0 );
+ parms.cg_friendly_names = count[ earg_CG_names ] != 0;
+ parms.spot_group_in_name = ( count[ earg_qname ] != 0 || multipass );
+ parms.noheader = ( ( count[ earg_noheader ] != 0 ) || parms.fasta || parms.fastq || multipass );
+ parms.reheader = ( ( count[ earg_header ] != 0 ) && !parms.noheader );
+ parms.xi = ( count[ earg_XI ] != 0 );
+ if ( ( count[ earg_cigarCG ] == 0 ) && ( count[ earg_cigarCG_merge ] == 0 ) )
+ {
+ parms.cg_style = 0;
+ }
+ else if ( count[ earg_cigarCG ] == 0 )
+ {
+ parms.cg_style = 1;
+ parms.long_cigar = false;
+ }
+ else if ( count[ earg_cigarCG_merge ] == 0 )
+ {
+ parms.cg_style = 2;
+ }
+ else
+ {
+ rc = RC( rcExe, rcArgv, rcProcessing, rcParam, rcInconsistent );
+ *errmsg = "cigar-CG and CG are mutually exclusive";
+ parms.cg_style = 0;
+ }
+
+ if (count[ earg_unaligned_only ] > 0) {
+ parms.unaligned_spots = true;
+
+ parms.primaries = false;
+ parms.secondaries = false;
+ parms.unaligned = true;
+ parms.cg_ev_dnb = false;
+ parms.cg_evidence = false;
+ parms.cg_sam = false;
+ parms.cg_style = 0;
+ }
+
+ parms.test_rows = GetOptValU( args, DumpArgs[ earg_test_rows ].name, 0, NULL );
+ parms.mate_row_gap_cachable = GetOptValU( args, DumpArgs[ earg_mate_row_gap_cachable ].name, 1000000, NULL );
+
+ param = &parms;
+ return 0;
+}
+
+
+static rc_t GetParams( Args const *const args, char const **const errmsg )
+{
+ unsigned count[ ARGS_COUNT ];
+ rc_t rc = CountArgs( args, count, errmsg );
+
+ if ( rc == 0 )
+ rc = GetArgs( args, count, errmsg );
+ return rc;
+}
+
+
+rc_t CC SAM_Dump_Main( int argc, char* argv[] )
+{
+ rc_t rc = 0;
+ Args* args;
+ char const *errmsg = "stop";
+ bool error_reported = false;
+
+ memset( &g_out_writer, 0, sizeof( g_out_writer ) );
+ KOutHandlerSetStdOut();
+ KStsHandlerSetStdErr();
+ KLogHandlerSetStdErr();
+ (void)KDbgHandlerSetStdErr();
+
+ ReportBuildDate( __DATE__ );
+
+ rc = ArgsMakeAndHandle( &args, argc, argv, 1, DumpArgs, ARGS_COUNT );
+ if ( rc == 0 )
+ {
+ uint32_t pcount;
+
+ rc = ArgsParamCount( args, &pcount );
+ if ( rc != 0 || pcount < 1 )
+ {
+ errmsg = "";
+ rc = argc < 2 ? 0 : RC( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ MiniUsage( args );
+ }
+ else if ( ( rc = GetParams( args, &errmsg ) ) != 0 )
+ {
+ }
+ else
+ {
+ VDBManager const *mgr;
+
+ rc = VDBManagerMakeRead( &mgr, NULL );
+ if ( rc == 0 )
+ {
+ rc = BufferedWriterMake( param->output_gzip, param->output_bz2 );
+ if ( rc == 0 )
+ {
+ unsigned i;
+
+ for ( i = 0; i < pcount; ++i )
+ {
+ char const *arg;
+
+ rc = ArgsParamValue( args, i, (const void **)&arg );
+ if ( rc != 0 ) break;
+ rc = ProcessPath( mgr, arg );
+#if _ARCH_BITS < 64
+ /* look for "param excessive while writing vector within container module" */
+ if (GetRCState(rc) == rcExcessive &&
+ GetRCObject(rc) == rcParam &&
+ GetRCContext(rc) == rcWriting &&
+ GetRCTarget(rc) == rcVector &&
+ GetRCModule(rc) == rcCont)
+ {
+ ( void )PLOGMSG( klogErr, (klogErr, "This run '$(run)' contains too many reads to be processed with a $(bits)-bit executable; please try again with a 64-bit executable.", "run=%s,bits=%u", arg, _ARCH_BITS));
+ }
+#endif
+ if ( rc != 0 ) break;
+ }
+ BufferedWriterRelease( rc == 0 );
+ }
+ VDBManagerRelease( mgr );
+ }
+ }
+ ArgsWhack( args );
+ }
+
+ if ( rc != 0 && !error_reported )
+ {
+ if ( errmsg[ 0 ] )
+ {
+ ( void )LOGERR( klogErr, rc, errmsg );
+ } else if ( KLogLastErrorCode() != rc )
+ {
+ ( void )LOGERR( klogErr, rc, "stop" );
+ }
+ }
+
+ {
+ /* Report execution environment if necessary */
+ rc_t rc2 = ReportFinalize( rc );
+ if ( rc == 0 )
+ rc = rc2;
+ }
+ return rc;
+}
+
+
+rc_t CC Legacy_KMain( int argc, char* argv[] )
+{
+ char filename[ 4096 ];
+ /*
+ Try to find a option-file - parameter in the original parameters
+ This is a hack to teach sam-dump to read it's parameters from a file/pipe instead
+ of the commandline
+ It is neccessary because the code above does not use libkapp to parse parameters!
+ */
+ rc_t rc = Args_find_option_in_argv( argc, argv, "--option-file", filename, sizeof filename );
+ if ( rc == 0 )
+ {
+ int new_argc;
+ char ** new_argv;
+ /* we found it! Now comes the special treatment: we fake a new argc/argv-pair! */
+ rc = Args_tokenize_file_and_progname_into_argv( filename, "sam-dump", &new_argc, &new_argv );
+ if ( rc == 0 )
+ {
+ /* pass the faked input-parameters from */
+ rc = SAM_Dump_Main( new_argc, new_argv );
+
+ Args_free_token_argv( new_argc, new_argv );
+ }
+ }
+ else
+ {
+ /* we did not found the special option, just use the commandline-parameters unchanged */
+ rc = SAM_Dump_Main( argc, argv );
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-dump3.c b/tools/sra-pileup/sam-dump3.c
new file mode 100644
index 0000000..2d80224
--- /dev/null
+++ b/tools/sra-pileup/sam-dump3.c
@@ -0,0 +1,563 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <kapp/main.h>
+#include <vdb/report.h> /* ReportSetVDBManager */
+#include <vdb/vdb-priv.h> /* VDBManagerDisablePagemapThread() */
+#include <klib/report.h>
+#include <sysalloc.h>
+
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+#include "sam-hdr.h"
+#include "sam-hdr1.h"
+#include "matecache.h"
+#include "cg_tools.h"
+#include "out_redir.h"
+#include "sam-aligned.h"
+#include "sam-unaligned.h"
+
+
+char const *sd_unaligned_usage[] = { "Output unaligned reads along with aligned reads",
+ NULL };
+
+char const *sd_primaryonly_usage[] = { "Output only primary alignments",
+ NULL };
+
+char const *sd_cigartype_usage[] = { "Output long version of CIGAR",
+ NULL };
+
+char const *sd_cigarCG_usage[] = { "Output CG version of CIGAR",
+ NULL };
+
+char const *sd_cigarCGMerge_usage[] = { "Apply CG fixups to CIGAR/SEQ/QUAL and outputs CG-specific columns",
+ NULL };
+
+char const *sd_CG_evidence[] = { "Output CG evidence aligned to reference",
+ NULL };
+
+char const *sd_CG_ev_dnb[] = { "Output CG evidence DNB's aligned to evidence",
+ NULL };
+
+char const *sd_CG_SAM[] = { "Output CG evidence DNB's aligned to reference ",
+ NULL };
+
+char const *sd_CG_mappings[] = { "Output CG sequences aligned to reference ",
+ NULL };
+
+char const *sd_header_usage[] = { "Always reconstruct header",
+ NULL };
+
+char const *sd_header_file_usage[] = { "take all headers from this file",
+ NULL };
+
+char const *sd_noheader_usage[] = { "Do not output headers",
+ NULL };
+
+char const *sd_region_usage[] = { "Filter by position on genome.",
+ "Name can either be file specific name (ex: \"chr1\" or \"1\").",
+ "\"from\" and \"to\" (inclusive) are 1-based coordinates",
+ NULL };
+
+char const *sd_distance_usage[] = { "Filter by distance between matepairs.",
+ "Use \"unknown\" to find matepairs split between the references.",
+ "Use from-to (inclusive) to limit matepair distance on the same reference",
+ NULL };
+
+char const *sd_seq_id_usage[] = { "Print reference SEQ_ID in RNAME instead of NAME",
+ NULL };
+
+char const *sd_identicalbases_usage[] = { "Output '=' if base is identical to reference",
+ NULL };
+
+char const *sd_gzip_usage[] = { "Compress output using gzip",
+ NULL };
+
+char const *sd_bzip2_usage[] = { "Compress output using bzip2",
+ NULL };
+
+char const *sd_qname_usage[] = { "Add .SPOT_GROUP to QNAME",
+ NULL };
+
+char const *sd_fasta_usage[] = { "Produce Fasta formatted output",
+ NULL };
+
+char const *sd_fastq_usage[] = { "Produce FastQ formatted output",
+ NULL };
+
+char const *sd_prefix_usage[] = { "Prefix QNAME: prefix.QNAME",
+ NULL };
+
+char const *sd_reverse_usage[] = { "Reverse unaligned reads according to read type",
+ NULL };
+
+char const *sd_comment_usage[] = { "Add comment to header. Use multiple times for several lines. Use quotes",
+ NULL };
+
+char const *sd_XI_usage[] = { "Output cSRA alignment id in XI column",
+ NULL };
+
+char const *sd_qual_quant_usage[] = { "Quality scores quantization level",
+ "a string like '1:10,10:20,20:30,30:-'",
+ NULL };
+
+char const *sd_report_usage[] = { "report options instead of executing",
+ NULL };
+
+char const *sd_outputfile_usage[] = { "print output into this file (instead of STDOUT)",
+ NULL };
+
+char const *sd_outbufsize_usage[] = { "size of output-buffer(dflt:32k, 0...off)",
+ NULL };
+
+char const *sd_cachereport_usage[] = { "print report about mate-pair-cache",
+ NULL };
+
+char const *sd_unaligned_only_usage[] = { "output reads for spots with no aligned reads",
+ NULL };
+
+char const *sd_cg_names_usage[] = { "prints cg-style spotgroup.spotid formed names",
+ NULL };
+
+char const *sd_cur_cache_usage[] = { "open cached cursor with this size",
+ NULL };
+
+char const *sd_min_mapq_usage[] = { "min. mapq an alignment has to have, to be printed",
+ NULL };
+
+char const *sd_no_mate_cache_usage[] = { "do not use a mate-cache, slower but less memory usage",
+ NULL };
+
+char const *rna_splice_usage[] = { "modify cigar-string (replace .D. with .N.) and add output flags (XS:A:+/-) ",
+ "when rna-splicing is detected by match to spliceosome recognition sites",
+ NULL };
+
+char const *rna_splicel_usage[] = { "level of rna-splicing detection (0,1,2)",
+ "when testing for spliceosome recognition sites ",
+ "0=perfect match, 1=one mismatch, 2=two mismatches ",
+ "one on each site",
+ NULL };
+
+char const *rna_splice_log_usage[] = { "file, into which rna-splice events are written", NULL };
+
+char const *no_mt_usage[] = { "disable multithreading", NULL };
+
+char const *with_md_flag_usage[] = { "print MD-flag", NULL };
+
+OptDef SamDumpArgs[] =
+{
+ { OPT_UNALIGNED, "u", NULL, sd_unaligned_usage, 0, false, false }, /* print unaligned reads */
+ { OPT_PRIM_ONLY, "1", NULL, sd_primaryonly_usage, 0, false, false }, /* print only primary alignments */
+ { OPT_CIGAR_LONG, "c", NULL, sd_cigartype_usage, 0, false, false }, /* use long cigar-string instead of short */
+ { OPT_CIGAR_CG, NULL, NULL, sd_cigarCG_usage, 0, false, false }, /* transform cigar into cg-style ( has B/N ) */
+ { OPT_RECAL_HDR, "r", NULL, sd_header_usage, 0, false, false }, /* recalculate header */
+ { OPT_HDR_FILE, NULL, NULL, sd_header_file_usage, 0, true, false }, /* take headers from file */
+ { OPT_NO_HDR, "n", NULL, sd_noheader_usage, 0, false, false }, /* do not print header */
+ { OPT_HDR_COMMENT, NULL, NULL, sd_comment_usage, 0, true, false }, /* insert this comment into header */
+ { OPT_REGION, NULL, NULL, sd_region_usage, 0, true, false }, /* filter by region */
+ { OPT_MATE_DIST, NULL, NULL, sd_distance_usage, 0, true, false }, /* filter by a list of mate-pair-distances */
+ { OPT_USE_SEQID, "s", NULL, sd_seq_id_usage, 0, false, false }, /* print seq-id instead of seq-name*/
+ { OPT_HIDE_IDENT, "=", NULL, sd_identicalbases_usage, 0, false, false }, /* replace bases that match the reference with '=' */
+ { OPT_GZIP, NULL, NULL, sd_gzip_usage, 0, false, false }, /* compress the output with gzip */
+ { OPT_BZIP2, NULL, NULL, sd_bzip2_usage, 0, false, false }, /* compress the output with bzip2 */
+ { OPT_SPOTGRP, "g", NULL, sd_qname_usage, 0, false, false }, /* add spotgroup to qname */
+ { OPT_FASTQ, NULL, NULL, sd_fastq_usage, 0, false, false }, /* output-format = fastq ( instead of SAM ) */
+ { OPT_FASTA, NULL, NULL, sd_fasta_usage, 0, false, false }, /* output-format = fasta ( instead of SAM ) */
+ { OPT_PREFIX, "p", NULL, sd_prefix_usage, 0, true, false }, /* prefix QNAME with this string */
+ { OPT_REVERSE, NULL, NULL, sd_reverse_usage, 0, false, false }, /* reverse unaligned reads if reverse-flag set*/
+ { OPT_MATE_GAP, NULL, NULL, NULL, 0, true, false }, /* int value, mate's farther apart than this are not cached */
+ { OPT_CIGAR_CG_M, NULL, NULL, sd_cigarCGMerge_usage, 0, false, false }, /* transform cg-data(length of read/patterns in cigar) into valid SAM (cigar/READ/QUALITY)*/
+ { OPT_XI_DEBUG, NULL, NULL, sd_XI_usage, 0, false, false }, /* output alignment id for debugging... XI:I:NNNNNNN */
+ { OPT_Q_QUANT, "Q", NULL, sd_qual_quant_usage, 0, true, false }, /* quality-quantization string */
+ { OPT_CG_EVIDENCE, NULL, NULL, sd_CG_evidence, 0, false, false }, /* CG-evidence */
+ { OPT_CG_EV_DNB, NULL, NULL, sd_CG_ev_dnb, 0, false, false }, /* CG-ev-dnb */
+ { OPT_CG_MAPP, NULL, NULL, sd_CG_mappings, 0, false, false }, /* CG-mappings */
+ { OPT_CG_SAM, NULL, NULL, sd_CG_SAM, 0, false, false }, /* cga-tools emulation mode */
+ { OPT_REPORT, NULL, NULL, sd_report_usage, 0, false, false }, /* report options instead of executing */
+ { OPT_OUTPUTFILE, NULL, NULL, sd_outputfile_usage, 0, true, false }, /* write into output-file */
+ { OPT_OUTBUFSIZE, NULL, NULL, sd_outbufsize_usage, 0, true, false }, /* size of output-buffer */
+ { OPT_CACHEREPORT, NULL, NULL, sd_cachereport_usage, 0, false, false }, /* report usage of mate-pair-cache */
+ { OPT_UNALIGNED_ONLY,NULL, NULL, sd_unaligned_only_usage, 0, false, false }, /* print only unaligned spots */
+ { OPT_CG_NAMES, NULL, NULL, sd_cg_names_usage, 0, false, false }, /* print cg-style spotnames */
+ { OPT_CURSOR_CACHE, NULL, NULL, sd_cur_cache_usage, 0, true, false }, /* size of cursor cache */
+ { OPT_MIN_MAPQ, NULL, NULL, sd_min_mapq_usage, 0, true, false }, /* minimal mapping quality */
+ { OPT_NO_MATE_CACHE,NULL, NULL, sd_no_mate_cache_usage, 0, false, false }, /* do not use mate-cache */
+ { OPT_RNA_SPLICE, NULL, NULL, rna_splice_usage, 0, false, false }, /* detect rna-splicing in sequence */
+ { OPT_RNA_SPLICEL, NULL, NULL, rna_splicel_usage, 0, true, false }, /* level of rna-splicing detection */
+ { OPT_RNA_SPLICE_LOG, NULL, NULL, rna_splice_log_usage, 0, true, false }, /* filename to log rna-splice events into */
+ { OPT_NO_MT, NULL, NULL, no_mt_usage, 0, false, false }, /* force new code-path */
+ { OPT_MD_FLAG, NULL, NULL, with_md_flag_usage, 0, false, false }, /* print the MD-flag */
+ { OPT_DUMP_MODE, NULL, NULL, NULL, 0, true, false }, /* how to produce aligned reads if no regions given */
+ { OPT_CIGAR_TEST, NULL, NULL, NULL, 0, true, false }, /* test cg-treatment of cigar string */
+ { OPT_LEGACY, NULL, NULL, NULL, 0, false, false }, /* force legacy code-path */
+ { OPT_NEW, NULL, NULL, NULL, 0, false, false }, /* force new code-path */
+ { OPT_TIMING, NULL, NULL, NULL, 0, true, false } /* optional timing */
+};
+
+char const *sd_usage_params[] =
+{
+ NULL, /* unaligned */
+ NULL, /* primaryonly */
+ NULL, /* cigartype */
+ NULL, /* cigarCG */
+ NULL, /* recalc header */
+ "filename", /* take headers from file */
+ NULL, /* no-header */
+ "text", /* hdr-comment */
+ "name[:from-to]", /* region */
+ "from-to|'unknown'", /* mate distance filter*/
+ NULL, /* seq-id */
+ NULL, /* identical-bases */
+ NULL, /* gzip */
+ NULL, /* bzip2 */
+ NULL, /* qname */
+ NULL, /* fasta */
+ NULL, /* fastq */
+ "prefix", /* prefix */
+ NULL, /* reverse */
+ NULL, /* mate-row-gap-cacheable */
+ NULL, /* cigarCGMerge */
+ NULL, /* XI */
+ "quantization string", /* qual-quant */
+ NULL, /* CG-evidence */
+ NULL, /* CG-ev-dnb */
+ NULL, /* CG-mappings */
+ NULL, /* CG-SAM */
+ NULL, /* report */
+ NULL, /* outputfile */
+ NULL, /* outputfile buffsize */
+ NULL, /* cachereport */
+ NULL, /* unaligned-only */
+ NULL, /* CG-names */
+ NULL, /* cursor cache */
+ NULL, /* min_mapq */
+ NULL, /* no mate-cache */
+ NULL, /* detect rna-splicing in sequence */
+ NULL, /* level of rna-splicing detection */
+ NULL, /* file to log rna-splice-events into */
+ NULL, /* no-mt */
+ NULL, /* with-md-flag */
+ NULL, /* dump_mode */
+ NULL, /* cigar test */
+ NULL, /* force legacy code path */
+ NULL, /* force new code path */
+ NULL /* optional timing */
+};
+
+const char UsageDefaultName[] = "sam-dump";
+
+
+rc_t CC UsageSummary( char const *progname )
+{
+ return KOutMsg( "Usage:\n"
+ "\t%s [options] path-to-run[ path-to-run ...]\n\n", progname );
+}
+
+
+rc_t CC Usage( Args const *args )
+{
+ char const *progname = UsageDefaultName;
+ char const *fullpath = UsageDefaultName;
+ rc_t rc;
+ unsigned i, n;
+
+ rc = ArgsProgram( args, &fullpath, &progname );
+
+ UsageSummary( progname );
+
+ KOutMsg( "Options:\n" );
+
+ n = sizeof( SamDumpArgs ) / sizeof( SamDumpArgs[ 0 ] );
+ n--; /* do not print the last option in the SamDumpArgs as help */
+ for( i = 0; i < n; i++ )
+ {
+ if ( SamDumpArgs[ i ].help != NULL )
+ {
+ HelpOptionLine( SamDumpArgs[ i ].aliases, SamDumpArgs[ i ].name,
+ sd_usage_params[ i ], SamDumpArgs[ i ].help );
+ }
+ }
+ KOutMsg( "\n" );
+ HelpOptionsStandard();
+
+ HelpVersion( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t CC write_to_FILE( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+
+/* =========================================================================================== */
+
+
+static uint32_t tabsel_2_ReferenceList_Options( const samdump_opts * opts )
+{
+ uint32_t res = 0;
+ if ( opts->dump_primary_alignments )
+ res |= ereferencelist_usePrimaryIds;
+ if ( opts->dump_secondary_alignments )
+ res |= ereferencelist_useSecondaryIds;
+ if ( opts->dump_cg_evidence | opts->dump_cg_ev_dnb | opts->dump_cg_sam )
+ res |= ereferencelist_useEvidenceIds;
+ return res;
+}
+
+
+static rc_t print_samdump( const samdump_opts * const opts )
+{
+ KDirectory *dir;
+
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create native directory" );
+ }
+ else
+ {
+ const VDBManager *mgr;
+ rc = VDBManagerMakeRead( &mgr, dir );
+ if ( rc != 0 )
+ {
+ (void)LOGERR( klogErr, rc, "cannot create vdb-manager" );
+ }
+ else
+ {
+ input_files * ifs; /* input_files.h */
+ uint32_t reflist_opt = tabsel_2_ReferenceList_Options( opts );
+
+ ReportSetVDBManager( mgr ); /**/
+
+ if ( opts->no_mt )
+ {
+ rc = VDBManagerDisablePagemapThread ( mgr );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerDisablePagemapThread() failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = discover_input_files( &ifs, mgr, opts->input_files, reflist_opt ); /* inputfiles.c */
+ if ( rc == 0 )
+ {
+ if ( ifs->database_count == 0 && ifs->table_count == 0 )
+ {
+ rc = RC( rcExe, rcFile, rcReading, rcItem, rcNotFound );
+ (void)LOGERR( klogErr, rc, "input object(s) not found" );
+ }
+ else
+ {
+ matecache * mc = NULL;
+
+ if ( opts->use_mate_cache )
+ rc = make_matecache( &mc, ifs->database_count );
+
+ if ( rc == 0 )
+ {
+ /* print output of header */
+ if ( ( opts->output_format == of_sam ) &&
+ ( ifs->database_count > 0 ) &&
+ ( opts->header_mode != hm_none ) &&
+ !opts->dump_unaligned_only )
+ /* ------------------------------------------------------ */
+ rc = print_headers_1( opts, ifs ); /* sam-hdr.c */
+ /* ------------------------------------------------------ */
+
+
+ /* print output of aligned reads */
+ if ( rc == 0 &&
+ ifs->database_count > 0 &&
+ !opts->dump_unaligned_only )
+ /* ------------------------------------------------------ */
+ rc = print_aligned_spots( opts, ifs, mc ); /* sam-aligned.c */
+ /* ------------------------------------------------------ */
+
+
+ /* print output of unaligned reads */
+ if ( rc == 0 )
+ {
+ /* ------------------------------------------------------ */
+ rc = print_unaligned_spots( opts, ifs, mc ); /* sam-unaligned.c */
+ /* ------------------------------------------------------ */
+ }
+
+ if ( opts->use_mate_cache )
+ {
+ if ( opts->report_cache )
+ rc = matecache_report( mc ); /* matecache.c */
+ release_matecache( mc ); /* matecache.c */
+ }
+ }
+ }
+ release_input_files( ifs ); /* inputfiles.c */
+ }
+ }
+ VDBManagerRelease( mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ return rc;
+}
+
+
+static rc_t perform_cigar_test( const samdump_opts * const opts )
+{
+ rc_t rc;
+ cg_cigar_input input;
+ cg_cigar_output output;
+
+ memset( &input, 0, sizeof input );
+ memset( &output, 0, sizeof output );
+
+ input.p_cigar.len = string_size( opts->cigar_test );
+ input.p_cigar.ptr = opts->cigar_test;
+
+ rc = make_cg_cigar( &input, &output );
+ if ( rc == 0 )
+ {
+ KOutMsg( "%s\n", output.cigar );
+ }
+ else
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "error testing cg-cigar treatment '$(t)'",
+ "t=%s", opts->cigar_test ) );
+ }
+ return rc;
+}
+
+/* =========================================================================================== */
+
+static rc_t samdump_main( Args * args, const samdump_opts * const opts )
+{
+ rc_t rc = 0;
+ out_redir redir; /* from out_redir.h */
+ enum out_redir_mode mode;
+
+ switch( opts->output_compression )
+ {
+ case oc_none : mode = orm_uncompressed; break;
+ case oc_gzip : mode = orm_gzip; break;
+ case oc_bzip2 : mode = orm_bzip2; break;
+ }
+
+ rc = init_out_redir( &redir, mode, opts->outputfile, opts->output_buffer_size ); /* from out_redir.c */
+ if ( rc == 0 )
+ {
+ if ( opts->report_options )
+ {
+ report_options( opts ); /* from sam-dump-opts.c */
+ }
+ else if ( opts->cigar_test != NULL )
+ {
+ rc = perform_cigar_test( opts );
+ }
+ else
+ {
+ if ( opts->input_file_count < 1 )
+ {
+ rc = RC( rcExe, rcArgv, rcParsing, rcParam, rcInvalid );
+ (void)LOGERR( klogErr, rc, "no inputfiles given at commandline" );
+ Usage( args );
+ }
+ else
+ {
+ /* ------------------------------------------------------ */
+ rc = print_samdump( opts );
+ /* ------------------------------------------------------ */
+ }
+ }
+ release_out_redir( &redir ); /* from out_redir.c */
+ }
+ return rc;
+}
+
+
+/* forward declaration, code is in sam-dump.c */
+rc_t CC Legacy_KMain( int argc, char* argv[] );
+
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ bool call_legacy_dumper = false;
+
+ rc_t rc = KOutHandlerSet( write_to_FILE, stdout );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ else
+ {
+ Args * args;
+
+ KLogHandlerSetStdErr();
+ rc = ArgsMakeAndHandle( &args, argc, argv, 1,
+ SamDumpArgs, sizeof SamDumpArgs / sizeof SamDumpArgs [ 0 ] );
+ if ( rc == 0 )
+ {
+ samdump_opts opts; /* from sam-dump-opts.h */
+
+ memset( &opts, 0, sizeof opts );
+ rc = gather_options( args, &opts ); /* from sam-dump-opts.c */
+ if ( rc == 0 )
+ {
+ call_legacy_dumper = opts.force_legacy;
+ if ( !call_legacy_dumper )
+ {
+ ReportBuildDate( __DATE__ );
+ rc = samdump_main( args, &opts );
+ }
+ /* because the options have sub-structures, like tree/vector's */
+ release_options( &opts ); /* from sam-dump-opts.c */
+ }
+ ArgsWhack( args );
+ }
+ }
+
+ /* trick to call the legacy sam-dump code if cg-functionality is requested */
+ if ( call_legacy_dumper )
+ {
+ rc = Legacy_KMain( argc, argv );
+ }
+ else
+ {
+ /* Report execution environment if necessary */
+ rc_t rc2 = ReportFinalize( rc );
+ if ( rc == 0 )
+ rc = rc2;
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-hdr.c b/tools/sra-pileup/sam-hdr.c
new file mode 100644
index 0000000..1e5ca02
--- /dev/null
+++ b/tools/sra-pileup/sam-hdr.c
@@ -0,0 +1,728 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/time.h>
+#include <kfs/file.h>
+#include <kfs/filetools.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <align/reference.h>
+#include <sysalloc.h>
+
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+
+static rc_t print_headers_from_metadata( const VDatabase * db, bool * recalc, const char * path )
+{
+ const KMetadata * meta;
+ rc_t rc = VDatabaseOpenMetadataRead( db, &meta );
+ if ( rc != 0 )
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open metadata from '$(t)'", "t=%s", path ) );
+ else
+ {
+ const KMDataNode * node;
+ rc = KMetadataOpenNodeRead( meta, &node, "BAM_HEADER" );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ *recalc = true;
+ rc = 0;
+ }
+ else
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open meta-node 'BAM_HEADER' from '$(t)'", "t=%s", path ) );
+ }
+ else
+ {
+ size_t offset = 0, num_read, remaining = ~0;
+ char buffer[ 40960 ];
+ while ( rc == 0 && remaining > 0 )
+ {
+ rc = KMDataNodeRead( node, offset, buffer, sizeof( buffer ),
+ &num_read, &remaining );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%.*s", ( uint32_t )num_read, buffer );
+ offset += num_read;
+ }
+ }
+ if ( rc == 0 && buffer[ num_read - 1 ] != '\n' )
+ {
+ rc = KOutMsg( "\n" );
+ }
+ KMDataNodeRelease( node );
+ }
+ KMetadataRelease( meta );
+ }
+ return rc;
+}
+
+
+typedef struct seq_id_node
+{
+ BSTNode node;
+ char * seq_id;
+ char * name;
+ INSDC_coord_len seq_len;
+} seq_id_node;
+
+
+static int cmp_pchar_0( const char * a, const char * b )
+{
+ int res = 0;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+
+static seq_id_node * make_seq_id_node( const char * seq_id, const char * name, INSDC_coord_len seq_len )
+{
+ seq_id_node *res = calloc( sizeof *res, 1 );
+ if ( res != NULL )
+ {
+ res->name = string_dup( name, string_size( name ) );
+ res->seq_id = string_dup( seq_id, string_size( seq_id ) );
+ res->seq_len = seq_len;
+ }
+ return res;
+}
+
+
+static void free_seq_id_node( seq_id_node * node )
+{
+ if ( node != NULL )
+ {
+ if ( node->seq_id != NULL )
+ free( node->seq_id );
+ if ( node->name != NULL )
+ free( node->name );
+ free( node );
+ }
+}
+
+
+static void CC free_seq_id_tree_callback( BSTNode *n, void * data )
+{
+ free_seq_id_node( ( seq_id_node * )n );
+}
+
+
+static void free_seq_id_tree( BSTree * tree )
+{
+ BSTreeWhack( tree, free_seq_id_tree_callback, NULL );
+}
+
+
+static int64_t CC seq_id_node_vs_pchar_wrapper( const void *item, const BSTNode *n )
+{
+ const seq_id_node * node = ( const seq_id_node * )n;
+ return cmp_pchar_0( (const char *)item, node->seq_id );
+}
+
+
+static seq_id_node * find_seq_id_node( BSTree * tree, const char * key )
+{
+ return ( seq_id_node * ) BSTreeFind( tree, key, seq_id_node_vs_pchar_wrapper );
+}
+
+
+static int64_t CC node_vs_node_wrapper( const BSTNode *item, const BSTNode *n )
+{
+ const seq_id_node * a = ( const seq_id_node * )item;
+ const seq_id_node * b = ( const seq_id_node * )n;
+ return cmp_pchar_0( a->seq_id, b->seq_id );
+}
+
+
+static rc_t add_seq_id_node( BSTree * tree, const char * seq_id, const char * name, INSDC_coord_len len )
+{
+ rc_t rc = 0;
+ seq_id_node * node = make_seq_id_node( seq_id, name, len );
+ if ( node != NULL )
+ {
+ rc = BSTreeInsert( tree, (BSTNode *)node, node_vs_node_wrapper );
+ if ( rc != 0 )
+ free_seq_id_node( node );
+ }
+ else
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ return rc;
+}
+
+
+static rc_t build_seq_id_tree( BSTree * tree, input_files * ifs )
+{
+ rc_t rc = 0;
+ uint32_t i;
+ for ( i = 0; i < ifs->database_count && rc == 0; ++i )
+ {
+ input_database * id = VectorGet( &ifs->dbs, i );
+ if ( id != NULL )
+ {
+ uint32_t rcount;
+ rc = ReferenceList_Count( id->reflist, &rcount );
+ if ( rc == 0 && rcount > 0 )
+ {
+ uint32_t r_idx;
+ for ( r_idx = 0; r_idx < rcount && rc == 0; ++r_idx )
+ {
+ const ReferenceObj * ref_obj;
+ rc = ReferenceList_Get( id->reflist, &ref_obj, r_idx );
+ if ( rc == 0 && ref_obj != NULL )
+ {
+ const char * seqid;
+ rc = ReferenceObj_SeqId( ref_obj, &seqid );
+ if ( rc == 0 )
+ {
+ const char * name;
+ rc = ReferenceObj_Name( ref_obj, &name );
+ if ( rc == 0 )
+ {
+ INSDC_coord_len seq_len;
+ rc = ReferenceObj_SeqLength( ref_obj, &seq_len );
+ if ( rc == 0 )
+ {
+ seq_id_node * node = find_seq_id_node( tree, seqid );
+ if ( node != NULL )
+ {
+ if ( node->seq_len != seq_len )
+ rc = RC( rcApp, rcNoTarg, rcConstructing, rcData, rcInvalid );
+ }
+ else
+ rc = add_seq_id_node( tree, seqid, name, seq_len );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct hdr_print_ctx
+{
+ rc_t rc;
+ bool use_seq_id;
+} hdr_print_ctx;
+
+
+static void CC print_header_callback( BSTNode *n, void *data )
+{
+ seq_id_node * node = ( seq_id_node * )n;
+ hdr_print_ctx * hctx = ( hdr_print_ctx * )data;
+ if ( hctx->rc == 0 )
+ {
+ if ( hctx->use_seq_id )
+ hctx->rc = KOutMsg( "@SQ\tSN:%s\tLN:%u\n", node->seq_id, node->seq_len );
+ else
+ {
+ if ( cmp_pchar_0( node->seq_id, node->name ) == 0 )
+ hctx->rc = KOutMsg( "@SQ\tSN:%s\tLN:%u\n", node->name, node->seq_len );
+ else
+ hctx->rc = KOutMsg( "@SQ\tSN:%s\tAS:%s\tLN:%u\n", node->name, node->seq_id, node->seq_len );
+ }
+ }
+}
+
+
+static rc_t extract_spotgroups_from_stats( VNamelist * spotgroups, input_database * id, const KMetadata * meta )
+{
+ const KMDataNode * node;
+ rc_t rc = KMetadataOpenNodeRead( meta, &node, "STATS/SPOT_GROUP" );
+ if ( rc != 0 )
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open meta-node 'STATS/SPOT_GROUP' from '$(t)'", "t=%s", id->path ) );
+ else
+ {
+ KNamelist * node_childs;
+ rc = KMDataNodeListChildren( node, &node_childs );
+ if ( rc != 0 )
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot list children of SPOT_GROUP-node in '$(t)'", "t=%s", id->path ) );
+ else
+ {
+ uint32_t n_count;
+ rc = KNamelistCount( node_childs, &n_count );
+ if ( rc == 0 && n_count > 0 )
+ {
+ uint32_t n_idx;
+ for ( n_idx = 0; n_idx < n_count && rc == 0; ++n_idx )
+ {
+ const char * spotgroup;
+ rc = KNamelistGet( node_childs, n_idx, &spotgroup );
+ if ( rc == 0 && spotgroup != NULL )
+ {
+ uint32_t found;
+ rc_t rc1 = VNamelistIndexOf( spotgroups, spotgroup, &found );
+ if ( GetRCState( rc1 ) == rcNotFound )
+ rc = VNamelistAppend( spotgroups, spotgroup );
+ }
+ }
+ }
+ KNamelistRelease( node_childs );
+ }
+ KMDataNodeRelease( node );
+ }
+ return rc;
+}
+
+
+#define STATE_ALPHA 0
+#define STATE_LF 1
+#define STATE_NL 2
+
+typedef struct buffer_range
+{
+ const char * start;
+ uint32_t processed, count, state;
+} buffer_range;
+
+
+static const char empty_str[ 2 ] = { ' ', 0 };
+
+
+static rc_t LoadFromBuffer( buffer_range * range,
+ rc_t ( CC * wr ) ( void * dst, const String * S ),
+ void * dst )
+{
+ rc_t rc = 0;
+ uint32_t idx;
+ const char * p = range->start;
+ String S, S_empty;
+
+ S.addr = p;
+ S.len = S.size = range->processed;
+ S_empty.addr = empty_str;
+ S_empty.len = S_empty.size = 1;
+ for ( idx = range->processed; idx < range->count && rc == 0; ++idx )
+ {
+ switch( p[ idx ] )
+ {
+ case 0x0A : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> LF */
+ rc = wr ( dst, &S );
+ range->state = STATE_LF;
+ break;
+
+ case STATE_LF : /* LF --> LF */
+ rc = wr ( dst, &S_empty );
+ break;
+
+ case STATE_NL : /* NL --> LF */
+ rc = wr ( dst, &S_empty );
+ range->state = STATE_LF;
+ break;
+ }
+ break;
+
+ case 0x0D : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> NL */
+ rc = wr( dst, &S_empty );
+ range->state = STATE_NL;
+ break;
+
+ case STATE_LF : /* LF --> NL */
+ range->state = STATE_NL;
+ break;
+
+ case STATE_NL : /* NL --> NL */
+ rc = wr ( dst, &S_empty );
+ break;
+ }
+ break;
+
+ default : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> ALPHA */
+ S.len++; S.size++;
+ break;
+
+ case STATE_LF : /* LF --> ALPHA */
+ S.addr = &p[ idx ]; S.len = S.size = 1;
+ range->state = STATE_ALPHA;
+ break;
+
+ case STATE_NL : /* NL --> ALPHA */
+ S.addr = &p[ idx ]; S.len = S.size = 1;
+ range->state = STATE_ALPHA;
+ break;
+ }
+ break;
+ }
+ }
+ if ( range->state == STATE_ALPHA )
+ {
+ range->start = S.addr;
+ range->count = S.len;
+ }
+ else
+ range->count = 0;
+ return rc;
+}
+
+
+static rc_t read_2_namelist( VNamelist * namelist, char * buffer, size_t bsize,
+ rc_t ( CC * rd ) ( const void * src, uint64_t pos, void * buffer, size_t bsize, size_t * num_read ),
+ rc_t ( CC * wr ) ( void * dst, const String * S ),
+ const void * src, void * dst )
+{
+ rc_t rc = 0;
+ uint64_t pos = 0;
+ buffer_range range;
+ bool done = false;
+
+ range.start = buffer;
+ range.count = 0;
+ range.processed = 0;
+ range.state = STATE_ALPHA;
+
+ do
+ {
+ size_t num_read;
+ rc = rd ( src, pos, ( char * )( range.start + range.processed ),
+ bsize - range.processed, &num_read );
+ if ( rc == 0 )
+ {
+ done = ( num_read == 0 );
+ if ( !done )
+ {
+ range.start = buffer;
+ range.count = range.processed + num_read;
+
+ LoadFromBuffer( &range, wr, dst );
+ if ( range.count > 0 )
+ {
+ memmove ( buffer, range.start, range.count );
+ }
+ range.start = buffer;
+ range.processed = range.count;
+
+ pos += num_read;
+ }
+ else if ( range.state == STATE_ALPHA )
+ {
+ String S;
+ S.addr = range.start;
+ S.len = S.size = range.count;
+ rc = wr ( dst, &S );
+ }
+ }
+ } while ( rc == 0 && !done );
+
+ return rc;
+}
+
+
+static rc_t CC write_to_namelist( void * dst, const String * S )
+{
+ rc_t rc = 0;
+ VNamelist * namelist = dst;
+ if ( S->len > 3 && S->addr[ 0 ] == '@' && S->addr[ 1 ] == 'R' && S->addr[ 2 ] == 'G' )
+ rc = VNamelistAppendString ( namelist, S );
+ return rc;
+}
+
+static rc_t CC read_from_metadata_node( const void * src, uint64_t pos, void * buffer, size_t bsize, size_t * num_read )
+{
+ const KMDataNode * node = src;
+ size_t remaining;
+ return KMDataNodeRead( node, pos, buffer, bsize, num_read, &remaining );
+}
+
+
+static rc_t extract_spotgroups_from_bam_hdr( VNamelist * spotgroups, input_database * id, const KMetadata * meta )
+{
+ const KMDataNode * node;
+ rc_t rc = KMetadataOpenNodeRead( meta, &node, "BAM_HEADER" );
+ /* do not report if the node cannot be found, because this would produce an error message when a database does
+ not have this node, which can is OK */
+ if ( rc == 0 )
+ {
+ char buffer[ 4096 ];
+ rc = read_2_namelist( spotgroups, buffer, sizeof buffer,
+ read_from_metadata_node, write_to_namelist,
+ node, spotgroups );
+ KMDataNodeRelease( node );
+ }
+ return rc;
+}
+
+
+static rc_t extract_spotgroups( VNamelist * spotgroups, input_files * ifs, bool from_stats )
+{
+ rc_t rc = 0;
+ uint32_t i;
+ for ( i = 0; i < ifs->database_count && rc == 0; ++i )
+ {
+ input_database * id = VectorGet( &ifs->dbs, i );
+ if ( id != NULL )
+ {
+ if ( from_stats )
+ {
+ const VTable * tab;
+ rc = VDatabaseOpenTableRead( id->db, &tab, "SEQUENCE" );
+ if ( rc != 0 )
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open table SEQUENCE in '$(t)'", "t=%s", id->path ) );
+ else
+ {
+ const KMetadata * meta;
+ rc = VTableOpenMetadataRead( tab, &meta );
+ if ( rc != 0 )
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cannot open metadata from '$(t)'", "t=%s", id->path ) );
+ else
+ {
+ if ( from_stats )
+ rc = extract_spotgroups_from_stats( spotgroups, id, meta );
+ KMetadataRelease( meta );
+ }
+ VTableRelease( tab );
+ }
+ }
+ else
+ {
+ const KMetadata * meta;
+ rc = VDatabaseOpenMetadataRead( id->db, &meta );
+ /* do not report if metadata cannot be found, because this would produce an error message when a database has
+ no metadata at all */
+ if ( rc == 0 )
+ {
+ rc = extract_spotgroups_from_bam_hdr( spotgroups, id, meta );
+ KMetadataRelease( meta );
+ }
+
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_spotgroups( VNamelist * spotgroups, bool from_stats )
+{
+ uint32_t count;
+ rc_t rc = VNameListCount( spotgroups, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * s;
+ rc = VNameListGet( spotgroups, i, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ if ( from_stats )
+ {
+ if ( cmp_pchar( s, "default" ) != 0 )
+ rc = KOutMsg( "@RG\tID:%s\n", s );
+ }
+ else
+ {
+ rc = KOutMsg( "%s\n", s );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_headers_by_recalculating( const samdump_opts * opts, input_files * ifs )
+{
+ rc_t rc = KOutMsg( "@HD\tVN:1.3\n" );
+ if ( rc == 0 )
+ {
+ BSTree tree;
+
+ /* collect sequenc-id's and names and their lengths, unique by sequence-id */
+ BSTreeInit( &tree );
+ rc = build_seq_id_tree( &tree, ifs );
+ if ( rc == 0 )
+ {
+ hdr_print_ctx hctx;
+ hctx.rc = 0;
+ hctx.use_seq_id = opts->use_seqid_as_refname;
+ /* ptrint it */
+ BSTreeForEach( &tree, false, print_header_callback, &hctx );
+ rc = hctx.rc;
+ }
+ free_seq_id_tree( &tree );
+
+ /* collect spot-groups ( unique ) */
+ if ( rc == 0 )
+ {
+ VNamelist * spotgroups;
+ rc = VNamelistMake( &spotgroups, 10 );
+ if ( rc == 0 )
+ {
+ bool from_stats = false;
+ rc = extract_spotgroups( spotgroups, ifs, from_stats );
+ if ( rc == 0 )
+ rc = print_spotgroups( spotgroups, from_stats );
+ else
+ rc = 0; /* otherwise the tool would be not able to handle something that has no headers */
+ VNamelistRelease( spotgroups );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_headers_from_file( const samdump_opts * opts )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir ( &dir );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant created native directory for file '$(t)'", "t=%s", opts->header_file ) );
+ }
+ else
+ {
+ const struct KFile * f;
+ rc = KDirectoryOpenFileRead ( dir, &f, "%s", opts->header_file );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant open file '$(t)'", "t=%s", opts->header_file ) );
+ }
+ else
+ {
+ VNamelist * headers;
+ rc = VNamelistMake ( &headers, 25 );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant create container for file '$(t)'", "t=%s", opts->header_file ) );
+ }
+ else
+ {
+ rc = LoadKFileToNameList( f, headers );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant load file '$(t)' into container", "t=%s", opts->header_file ) );
+ }
+ else
+ {
+ uint32_t count;
+ rc = VNameListCount ( headers, &count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant get count for container of '$(t)'", "t=%s", opts->header_file ) );
+ }
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * line;
+ rc = VNameListGet ( headers, i, &line );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant get line #$(t) from container", "t=%u", i ) );
+ }
+ else
+ {
+ rc = KOutMsg( "%s\n", line );
+ }
+ }
+ }
+ }
+ VNamelistRelease ( headers );
+ }
+ KFileRelease ( f );
+ }
+ KDirectoryRelease ( dir );
+ }
+ return rc;
+}
+
+
+static rc_t print_org_headers( const samdump_opts * opts, input_files * ifs )
+{
+ rc_t rc = 0;
+ bool recalc = ( ifs->database_count > 1 );
+ if ( !recalc )
+ {
+ input_database * id = VectorGet( &ifs->dbs, 0 );
+ rc = print_headers_from_metadata( id->db, &recalc, id->path );
+ }
+ if ( rc == 0 && recalc )
+ rc = print_headers_by_recalculating( opts, ifs );
+ return rc;
+}
+
+
+rc_t print_headers( const samdump_opts * opts, input_files * ifs )
+{
+ rc_t rc = 0;
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_start_section( opts->perf_log, "headers" );
+#endif
+
+ switch( opts->header_mode )
+ {
+ case hm_dump : rc = print_org_headers( opts, ifs ); break;
+
+ case hm_recalc : rc = print_headers_by_recalculating( opts, ifs ); break;
+
+ case hm_file : rc = print_headers_from_file( opts ); break;
+
+ case hm_none : break; /* to not let the compiler complain about not handled enum */
+ }
+
+ /* attach header comments from the commandline */
+ if ( rc == 0 && opts->hdr_comments != NULL )
+ {
+ uint32_t count;
+ rc = VNameListCount( opts->hdr_comments, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * s;
+ rc = VNameListGet( opts->hdr_comments, i, &s );
+ if ( rc == 0 && s != NULL )
+ rc = KOutMsg( "@CO\t%s\n", s );
+ }
+ }
+ }
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_end_section( opts->perf_log );
+#endif
+
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-hdr.h b/tools/sra-pileup/sam-hdr.h
new file mode 100644
index 0000000..7b373c4
--- /dev/null
+++ b/tools/sra-pileup/sam-hdr.h
@@ -0,0 +1,41 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sam_headers_
+#define _h_sam_headers_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+
+rc_t print_headers( const samdump_opts * opts, input_files * ifs );
+
+#endif
diff --git a/tools/sra-pileup/sam-hdr1.c b/tools/sra-pileup/sam-hdr1.c
new file mode 100644
index 0000000..ad3e6ce
--- /dev/null
+++ b/tools/sra-pileup/sam-hdr1.c
@@ -0,0 +1,894 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kfs/filetools.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <sysalloc.h>
+
+#include "sam-hdr1.h"
+
+
+typedef struct headers
+{
+ VNamelist * SQ_Lines_1;
+ VNamelist * SQ_Lines_2;
+ VNamelist * SQ_Lines_3;
+
+ VNamelist * RG_Lines_1;
+ VNamelist * RG_Lines_2;
+ VNamelist * RG_Lines_3;
+
+ VNamelist * Other_Lines;
+ VNamelist * HD_Lines;
+} headers;
+
+
+static void release_lines( VNamelist ** lines )
+{
+ if ( *lines != NULL )
+ {
+ VNamelistRelease ( *lines );
+ lines = NULL;
+ }
+}
+
+
+static void release_headers( headers * h )
+{
+ release_lines( &h->HD_Lines );
+ release_lines( &h->Other_Lines );
+
+ release_lines( &h->RG_Lines_1 );
+ release_lines( &h->RG_Lines_2 );
+ release_lines( &h->RG_Lines_3 );
+
+ release_lines( &h->SQ_Lines_1 );
+ release_lines( &h->SQ_Lines_2 );
+ release_lines( &h->SQ_Lines_3 );
+}
+
+
+static rc_t init_headers( headers * h, uint32_t blocksize )
+{
+ rc_t rc;
+
+ h->SQ_Lines_1 = NULL;
+ h->SQ_Lines_2 = NULL;
+ h->SQ_Lines_3 = NULL;
+
+ h->RG_Lines_1 = NULL;
+ h->RG_Lines_2 = NULL;
+ h->RG_Lines_3 = NULL;
+
+ h->Other_Lines = NULL;
+ h->HD_Lines = NULL;
+
+ rc = VNamelistMake( &h->SQ_Lines_1, blocksize );
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->SQ_Lines_2, blocksize );
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->SQ_Lines_3, blocksize );
+
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->RG_Lines_1, blocksize );
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->RG_Lines_2, blocksize );
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->RG_Lines_3, blocksize );
+
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->Other_Lines, blocksize );
+ if ( rc == 0 )
+ rc = VNamelistMake( &h->HD_Lines, blocksize );
+
+ if ( rc != 0 )
+ release_headers( h );
+
+ return rc;
+}
+
+
+static void process_line( headers * h, int hdr_idx, const char * line, size_t len )
+{
+ if ( len > 3 && line[ 0 ] == '@' )
+ {
+ if ( line[ 1 ] == 'S' && line[ 2 ] == 'Q' )
+ {
+ switch( hdr_idx )
+ {
+ case 1 : VNamelistAppend( h->SQ_Lines_1, line ); break;
+ case 2 : VNamelistAppend( h->SQ_Lines_2, line ); break;
+ case 3 : VNamelistAppend( h->SQ_Lines_3, line ); break;
+ }
+ }
+ else if ( line[ 1 ] == 'R' && line[ 2 ] == 'G' )
+ {
+ switch( hdr_idx )
+ {
+ case 1 : VNamelistAppend( h->RG_Lines_1, line ); break;
+ case 2 : VNamelistAppend( h->RG_Lines_2, line ); break;
+ case 3 : VNamelistAppend( h->RG_Lines_3, line ); break;
+ }
+ }
+ else if ( line[ 1 ] == 'H' && line[ 2 ] == 'D' )
+ VNamelistAppend( h->HD_Lines, line );
+ else
+ VNamelistAppend( h->Other_Lines, line );
+ }
+}
+
+
+static rc_t process_lines( headers * h, int hdr_idx, VNamelist * content, const char * identifier )
+{
+ uint32_t i, count;
+ rc_t rc = VNameListCount( content, &count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant get count for content of '$(t)'", "t=%s", identifier ) );
+ }
+ else
+ {
+ const char * line = NULL;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ rc = VNameListGet( content, i, &line );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant get line #$(t) from content", "t=%u", i ) );
+ }
+ else
+ process_line( h, hdr_idx, line, string_measure( line, NULL ) );
+ }
+ }
+ return rc;
+}
+
+
+#define STATE_ALPHA 0
+#define STATE_LF 1
+#define STATE_NL 2
+
+typedef struct buffer_range
+{
+ const char * buffer;
+ size_t size, state;
+} buffer_range;
+
+
+static const char empty_str[ 2 ] = { ' ', 0 };
+
+
+static void LoadFromBuffer( VNamelist * nl, buffer_range * range )
+{
+ size_t idx;
+ const char * p = range->buffer;
+ String S;
+
+ S.addr = p;
+ S.len = S.size = 0;
+ for ( idx = 0; idx < range->size; ++idx )
+ {
+ switch( p[ idx ] )
+ {
+ case 0x0A : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> LF */
+ VNamelistAppendString ( nl, &S );
+ range->state = STATE_LF;
+ break;
+
+ case STATE_LF : /* LF --> LF */
+ VNamelistAppend ( nl, empty_str );
+ break;
+
+ case STATE_NL : /* NL --> LF */
+ VNamelistAppend ( nl, empty_str );
+ range->state = STATE_LF;
+ break;
+ }
+ break;
+
+ case 0x0D : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> NL */
+ VNamelistAppendString ( nl, &S );
+ range->state = STATE_NL;
+ break;
+
+ case STATE_LF : /* LF --> NL */
+ range->state = STATE_NL;
+ break;
+
+ case STATE_NL : /* NL --> NL */
+ VNamelistAppend ( nl, empty_str );
+ break;
+ }
+ break;
+
+ default : switch( range->state )
+ {
+ case STATE_ALPHA : /* ALPHA --> ALPHA */
+ S.len++; S.size++;
+ break;
+
+ case STATE_LF : /* LF --> ALPHA */
+ S.addr = &p[ idx ]; S.len = S.size = 1;
+ range->state = STATE_ALPHA;
+ break;
+
+ case STATE_NL : /* NL --> ALPHA */
+ S.addr = &p[ idx ]; S.len = S.size = 1;
+ range->state = STATE_ALPHA;
+ break;
+ }
+ break;
+ }
+ }
+ if ( range->state == STATE_ALPHA && S.len > 0 )
+ VNamelistAppendString ( nl, &S );
+}
+
+
+static rc_t Load_Namelist_From_Node( VNamelist * dst, const KMDataNode * node )
+{
+ size_t num_read, remaining;
+ char b[ 10 ];
+ rc_t rc = KMDataNodeRead( node, 0, b, sizeof( b ), &num_read, &remaining );
+ if ( rc == 0 )
+ {
+ size_t bsize = num_read + remaining;
+ buffer_range range;
+ range.buffer = malloc( bsize );
+ if ( range.buffer != NULL )
+ {
+ rc = KMDataNodeRead( node, 0, ( void * )range.buffer, bsize, &range.size, &remaining );
+ if ( rc == 0 )
+ {
+ range.state = STATE_ALPHA;
+ LoadFromBuffer( dst, &range );
+ }
+ free( ( void * ) range.buffer );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_BAM_HEADER( headers * h, int hdr_idx, input_files * ifs )
+{
+ rc_t rc = 0;
+ if ( ifs->database_count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < ifs->database_count && rc == 0; ++idx )
+ {
+ input_database * id = VectorGet( &ifs->dbs, idx );
+ if ( id != NULL )
+ {
+ const KMetadata * meta;
+ rc = VDatabaseOpenMetadataRead( id->db, &meta );
+ if ( rc == 0 )
+ {
+ const KMDataNode * node;
+ rc = KMetadataOpenNodeRead( meta, &node, "BAM_HEADER" );
+ if ( rc == 0 )
+ {
+ VNamelist * content;
+ rc = VNamelistMake ( &content, 25 );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant create container for '$(t)'", "t=%s", id->path ) );
+ }
+ else
+ {
+ rc = Load_Namelist_From_Node( content, node );
+ if ( rc == 0 )
+ rc = process_lines( h, hdr_idx, content, id->path );
+ VNamelistRelease( content );
+ }
+ KMDataNodeRelease( node );
+ }
+ else
+ rc = 0;
+ KMetadataRelease( meta );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_spotgroup_stats( headers * h, int hdr_idx, const KMDataNode * node, const KNamelist * spot_groups )
+{
+ uint32_t count;
+ rc_t rc = KNamelistCount( spot_groups, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * name = NULL; /* this is the name of the node !!!NOT!!! the name of the spotgroup! */
+ rc = KNamelistGet( spot_groups, i, &name );
+ if ( rc == 0 && name != NULL )
+ {
+ const KMDataNode * spot_count_node;
+ rc = KMDataNodeOpenNodeRead( node, &spot_count_node, "%s/SPOT_COUNT", name );
+ if ( rc == 0 )
+ {
+ uint64_t spot_count = 0;
+ rc = KMDataNodeReadAsU64( spot_count_node, &spot_count );
+ if ( rc == 0 )
+ {
+ if ( spot_count > 0 )
+ {
+ const KMDataNode * spot_group_node;
+ rc = KMDataNodeOpenNodeRead( node, &spot_group_node, name );
+ if ( rc == 0 )
+ {
+ char name_attr[ 2048 ];
+ char buffer[ 2048 ];
+ size_t num_writ;
+ rc = KMDataNodeReadAttr( spot_group_node, "name", name_attr, sizeof name_attr, &num_writ );
+ rc = string_printf( buffer, sizeof buffer, &num_writ,
+ "@RG\tID:%s", rc == 0 ? name_attr : name );
+ if ( rc == 0 )
+ process_line( h, hdr_idx, buffer, num_writ );
+ KMDataNodeRelease( spot_group_node );
+ }
+ }
+ }
+ else
+ rc = 0;
+ KMDataNodeRelease( spot_count_node );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_stats( headers * h, int hdr_idx, input_files * ifs )
+{
+ rc_t rc = 0;
+ if ( ifs->database_count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < ifs->database_count && rc == 0; ++idx )
+ {
+ input_database * id = VectorGet( &ifs->dbs, idx );
+ if ( id != NULL )
+ {
+ const VTable * seq_table = NULL;
+ rc = VDatabaseOpenTableRead( id->db, &seq_table, "SEQUENCE" );
+ if ( rc == 0 )
+ {
+ const KMetadata * meta;
+ rc = VTableOpenMetadataRead( seq_table, &meta );
+ if ( rc == 0 )
+ {
+ const KMDataNode * node;
+ rc = KMetadataOpenNodeRead( meta, &node, "STATS/SPOT_GROUP" );
+ if ( rc == 0 )
+ {
+ KNamelist * spot_groups;
+ rc = KMDataNodeListChildren( node, &spot_groups );
+ if ( rc == 0 )
+ {
+ rc = collect_from_spotgroup_stats( h, hdr_idx, node, spot_groups );
+ KNamelistRelease( spot_groups );
+ }
+ KMDataNodeRelease( node );
+ }
+ KMetadataRelease( meta );
+ }
+ VTableRelease( seq_table );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_file( headers * h, int hdr_idx, const char * filename )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir ( &dir );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant created native directory for file '$(t)'", "t=%s", filename ) );
+ }
+ else
+ {
+ const struct KFile * f;
+ rc = KDirectoryOpenFileRead ( dir, &f, "%s", filename );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant open file '$(t)'", "t=%s", filename ) );
+ }
+ else
+ {
+ VNamelist * content;
+ rc = VNamelistMake ( &content, 25 );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant create container for file '$(t)'", "t=%s", filename ) );
+ }
+ else
+ {
+ rc = LoadKFileToNameList( f, content );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogErr, ( klogErr, rc, "cant load file '$(t)' into container", "t=%s", filename ) );
+ }
+ else
+ rc = process_lines( h, hdr_idx, content, filename );
+ VNamelistRelease( content );
+ }
+ KFileRelease ( f );
+ }
+ KDirectoryRelease ( dir );
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_references( headers * h, int hdr_idx, input_files * ifs , bool use_seqid)
+{
+ rc_t rc = 0;
+ uint32_t i;
+ for ( i = 0; i < ifs->database_count && rc == 0; ++i )
+ {
+ input_database * id = VectorGet( &ifs->dbs, i );
+ if ( id != NULL )
+ {
+ uint32_t rcount;
+ rc = ReferenceList_Count( id->reflist, &rcount );
+ if ( rc == 0 && rcount > 0 )
+ {
+ uint32_t r_idx;
+ for ( r_idx = 0; r_idx < rcount && rc == 0; ++r_idx )
+ {
+ const ReferenceObj * ref_obj;
+ rc = ReferenceList_Get( id->reflist, &ref_obj, r_idx );
+ if ( rc == 0 && ref_obj != NULL )
+ {
+ const char * seqid;
+ rc = ReferenceObj_SeqId( ref_obj, &seqid );
+ if ( rc == 0 )
+ {
+ const char * name;
+ rc = ReferenceObj_Name( ref_obj, &name );
+ if ( rc == 0 )
+ {
+ INSDC_coord_len seq_len;
+ rc = ReferenceObj_SeqLength( ref_obj, &seq_len );
+ if ( rc == 0 )
+ {
+ char buffer[ 2048 ];
+ size_t num_writ;
+ rc = string_printf( buffer, sizeof buffer, &num_writ, "@SQ\tSN:%s\tLN:%lu", use_seqid?seqid:name, seq_len );
+ if ( rc == 0 )
+ process_line( h, hdr_idx, buffer, num_writ );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct hdr_tag
+{
+ String key, value;
+} hdr_tag;
+
+
+typedef struct hdr_line
+{
+ String line_key;
+ hdr_tag tags[ 32 ];
+ uint32_t n_tags;
+} hdr_line;
+
+
+static bool parse_hdr_line( hdr_line * hl, const char * line )
+{
+ size_t i, tl = 0, start = 3, len = string_size( line );
+ bool res = ( len > start && line[ 0 ] == '@' );
+ hl->n_tags = 0;
+ if ( res )
+ {
+ uint32_t colons = 0;
+ StringInit( &hl->line_key, &line[ 1 ], 2, 2 );
+ for( i = start; i < len; ++i )
+ {
+ switch ( line[ i ] )
+ {
+ case '\t' : if ( tl > 0 )
+ {
+ StringInit( &hl->tags[ hl->n_tags ].value, &line[ start ], tl, tl );
+ ( hl->n_tags )++;
+ tl = 0;
+ }
+ start = i + 1;
+ colons = 0;
+ break;
+
+ case ':' : if ( colons == 0 )
+ {
+ if ( tl > 0 )
+ {
+ StringInit( &hl->tags[ hl->n_tags ].key, &line[ start ], tl, tl );
+ tl = 0;
+ }
+ start = i + 1;
+ }
+ else
+ tl++;
+ colons++;
+ break;
+
+ default : tl++;
+ break;
+ }
+ }
+ if ( tl > 0 )
+ {
+ StringInit( &hl->tags[ hl->n_tags ].value, &line[ start ], tl, tl );
+ ( hl->n_tags )++;
+ }
+ }
+ else
+ StringInit( &hl->line_key, NULL, 0, 0 );
+ return res;
+}
+
+
+static rc_t print_hdr_line( char * buffer, size_t buflen, const hdr_line * hl )
+{
+ rc_t rc = 0;
+ buffer[ 0 ] = 0;
+ if ( hl->line_key.len > 0 )
+ {
+ size_t num_writ, total_writ = 0, i;
+ rc = string_printf( buffer, buflen, &num_writ, "@%S", &hl->line_key );
+ for ( i = 0; i < hl->n_tags && rc == 0; ++i )
+ {
+ total_writ += num_writ;
+ if ( buflen > total_writ )
+ rc = string_printf( &buffer[ total_writ ], buflen - total_writ, &num_writ,
+ "\t%S:%S", &hl->tags[ i ].key, &hl->tags[ i ].value );
+ }
+ }
+ return rc;
+}
+
+static bool sam_hdr_id( const hdr_line * hl1, const hdr_line * hl2 )
+{
+ bool res = ( hl1 != NULL && hl2 != NULL );
+ if ( res )
+ res = ( ( hl1->n_tags > 0 ) && ( hl2->n_tags > 0 ) );
+ if ( res )
+ res = ( 0 == StringCompare( &hl1->tags[ 0 ].value, &hl2->tags[ 0 ].value ) );
+ return res;
+}
+
+static bool has_tag( const String * tag_id, hdr_line * dst )
+{
+ bool res = false;
+ uint32_t i;
+ for ( i = 0; i < dst->n_tags && !res; ++i )
+ res = ( 0 == StringCompare( tag_id, &dst->tags[ i ].key ) );
+ return res;
+}
+
+static void merge_tag( const hdr_tag * tag, hdr_line * dst )
+{
+ if ( !has_tag( &tag->key, dst ) )
+ {
+ dst->tags[ dst->n_tags ] = *tag;
+ ( dst->n_tags )++;
+ }
+}
+
+static void merge_hdr_line( const hdr_line * src, hdr_line * dst )
+{
+ if ( src != NULL && dst != NULL )
+ {
+ uint32_t i;
+ for ( i = 0; i < src->n_tags; ++i )
+ merge_tag( &src->tags[ i ], dst );
+ }
+}
+
+
+static rc_t for_each_line( const VNamelist * src,
+ rc_t ( * f ) ( const char * line, void * context ),
+ void * context )
+{
+ uint32_t idx, count;
+ rc_t rc = VNameListCount( src, &count );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * line = NULL;
+ rc = VNameListGet( src, idx, &line );
+ if ( rc == 0 )
+ rc = f( line, context );
+ }
+ return rc;
+}
+
+
+static rc_t merge_header_tags( const char * line, void * context )
+{
+ hdr_line * h_parent = context;
+ hdr_line h;
+ if ( parse_hdr_line( &h, line ) )
+ {
+ /* merge the tags! */
+ if ( sam_hdr_id( h_parent, &h ) )
+ merge_hdr_line( h_parent, &h );
+ }
+ return 0;
+}
+
+
+typedef struct merge_ctx
+{
+ VNamelist * dst;
+ const VNamelist * other;
+ bool unique;
+} merge_ctx;
+
+
+static rc_t merge_header_tags_callback( const char * line, void * context )
+{
+ rc_t rc = 0;
+ merge_ctx * mc = context;
+ hdr_line h;
+ if ( parse_hdr_line( &h, line ) )
+ {
+ rc = for_each_line( mc->other, merge_header_tags, &h );
+ if ( rc == 0 )
+ {
+ char buffer[ 2048 ];
+ rc = print_hdr_line( buffer, sizeof buffer, &h );
+ if ( rc == 0 && buffer[ 0 ] != 0 )
+ {
+ bool do_append = true;
+ if ( mc->unique )
+ {
+ uint32_t found;
+ rc_t rc1 = VNamelistIndexOf( mc->dst, buffer, &found );
+ do_append = ( rc1 != 0 );
+ }
+ if ( do_append )
+ rc = VNamelistAppend( mc->dst, buffer );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* SQ-lines have to be uniue by the SN-tag */
+/* RG-lines have to be uniue by the ID-tag */
+static rc_t merge_header_tags_of_2_lists( VNamelist ** lines_1, const VNamelist * lines_2, bool unique )
+{
+ rc_t rc;
+ merge_ctx mc;
+ memset( &mc, 0, sizeof mc );
+ mc.unique = unique;
+ rc = VNamelistMake( &mc.dst, 25 );
+ if ( rc == 0 )
+ {
+ mc.other = lines_2;
+ rc = for_each_line( *lines_1, merge_header_tags_callback, &mc );
+ if ( rc == 0 )
+ {
+ VNamelistRelease( *lines_1 );
+ *lines_1 = mc.dst;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t collect_from_bam_hdr( headers * dst, input_files * ifs, bool use_seqid )
+{
+ uint32_t count;
+ rc_t rc = collect_from_BAM_HEADER( dst, 1, ifs );
+ if ( rc == 0 )
+ {
+ rc = VNameListCount( dst->SQ_Lines_1, &count );
+ if ( rc == 0 && ( count == 0 || use_seqid ) )
+ rc = collect_from_references( dst, 2, ifs , use_seqid);
+ }
+ if ( rc == 0 )
+ {
+ rc = VNameListCount( dst->RG_Lines_1, &count );
+ if ( rc == 0 && count == 0 )
+ rc = collect_from_stats( dst, 1, ifs );
+ }
+ return rc;
+}
+
+
+static rc_t collect_by_recalc( headers * h, input_files * ifs, bool use_seqid )
+{
+ rc_t rc = collect_from_references( h, 1, ifs, use_seqid );
+ if ( rc == 0 )
+ rc = collect_from_stats( h, 1, ifs );
+ return rc;
+}
+
+
+static rc_t collect_from_src_and_files( headers * h, input_files * ifs, const char * filename, bool use_seqid )
+{
+ rc_t rc = collect_from_bam_hdr( h, ifs, use_seqid );
+ if ( rc == 0 && filename != NULL )
+ rc = collect_from_file( h, 3, filename );
+ return rc;
+}
+
+
+static rc_t print_HD_line( const VNamelist * lines )
+{
+ uint32_t count;
+ rc_t rc = VNameListCount( lines, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ const char * line = NULL;
+ rc = VNameListGet( lines, 0, &line );
+ if ( rc == 0 && line != NULL )
+ rc = KOutMsg( "%s\n", line );
+ else
+ rc = KOutMsg( "@HD\tVN:1.2\tSO:coordinate\n" );
+ }
+ else
+ rc = KOutMsg( "@HD\tVN:1.2\tSO:coordinate\n" );
+ return rc;
+}
+
+
+static rc_t print_callback( const char * line, void * context ) { return KOutMsg( "%s\n", line ); }
+
+
+static rc_t merge_and_print( VNamelist ** L1, const VNamelist * L2, bool print_L2_if_only_src )
+{
+ uint32_t count1, count2;
+
+ rc_t rc = VNameListCount( *L1, &count1 );
+ if ( rc == 0 )
+ rc = VNameListCount( L2, &count2 );
+ if ( rc == 0 )
+ {
+ if ( count1 > 0 && count2 > 0 )
+ {
+ if ( rc == 0 )
+ rc = merge_header_tags_of_2_lists( L1, L2, true );
+ if ( rc == 0 )
+ rc = for_each_line( *L1, print_callback, NULL );
+ }
+ else if ( count1 > 0 )
+ {
+ rc = for_each_line( *L1, print_callback, NULL );
+ }
+ else if ( print_L2_if_only_src && ( count2 > 0 ) )
+ {
+ rc = for_each_line( L2, print_callback, NULL );
+ }
+ }
+ return rc;
+}
+
+
+rc_t print_headers_1( const samdump_opts * opts, input_files * ifs )
+{
+ headers h;
+ rc_t rc = init_headers( &h, 25 );
+ if ( rc == 0 )
+ {
+ /* collect ... */
+
+ switch( opts->header_mode )
+ {
+ /* collect the headers that were written by the loader
+ with special case if the user requested the seq-id to be used
+ the bam-header-lines will be in list#1
+ the recalculated-lines ( if requested via --seqid ) will be in list #2
+ */
+ case hm_dump : rc = collect_from_bam_hdr( &h, ifs, opts->use_seqid_as_refname );
+
+ if ( rc == 0 )
+ rc = print_HD_line( h.HD_Lines );
+
+ if ( rc == 0 )
+ rc = for_each_line( h.SQ_Lines_1, print_callback, NULL );
+ if ( rc == 0 )
+ rc = for_each_line( h.SQ_Lines_2, print_callback, NULL );
+
+ if ( rc == 0 )
+ rc = for_each_line( h.RG_Lines_1, print_callback, NULL );
+ if ( rc == 0 )
+ rc = for_each_line( h.RG_Lines_2, print_callback, NULL );
+
+ break;
+
+ /* collect the headers by iterating over the REFERENCE-table
+ the recalculated-lines will be in list #1
+ */
+ case hm_recalc : rc = collect_by_recalc( &h, ifs, opts->use_seqid_as_refname );
+ if ( rc == 0 )
+ rc = print_HD_line( h.HD_Lines );
+
+ if ( rc == 0 )
+ rc = for_each_line( h.SQ_Lines_1, print_callback, NULL );
+ if ( rc == 0 )
+ rc = for_each_line( h.RG_Lines_1, print_callback, NULL );
+
+ break;
+
+ /* collect the headers that were written by the loader ( list #1 )
+ with special case if the user requested the seqid to be used ( list #2 )
+ and merge header-fields with the ones from a user-supplied file ( list #3 )
+ */
+ case hm_file : rc = collect_from_src_and_files( &h, ifs, opts->header_file, opts->use_seqid_as_refname );
+ if ( rc == 0 )
+ rc = print_HD_line( h.HD_Lines );
+ if ( rc == 0 )
+ rc = merge_and_print( &h.SQ_Lines_1, h.SQ_Lines_3, true );
+ if ( rc == 0 )
+ rc = merge_and_print( &h.RG_Lines_1, h.RG_Lines_3, true );
+ if ( rc == 0 )
+ rc = merge_and_print( &h.SQ_Lines_2, h.SQ_Lines_3, false );
+ if ( rc == 0 )
+ rc = merge_and_print( &h.RG_Lines_2, h.RG_Lines_3, false );
+
+ break;
+
+ case hm_none : break; /* to not let the compiler complain about not handled enum */
+ }
+
+ /* all other lines collected: ( not HD,SQ,RG ) */
+ if ( rc == 0 )
+ rc = for_each_line( h.Other_Lines, print_callback, NULL );
+
+ release_headers( &h );
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-hdr1.h b/tools/sra-pileup/sam-hdr1.h
new file mode 100644
index 0000000..4e7f645
--- /dev/null
+++ b/tools/sra-pileup/sam-hdr1.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sam_headers_1_
+#define _h_sam_headers_1_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/rc.h>
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+
+rc_t print_headers_1( const samdump_opts * opts, input_files * ifs );
+
+#endif
diff --git a/tools/sra-pileup/sam-unaligned.c b/tools/sra-pileup/sam-unaligned.c
new file mode 100644
index 0000000..9d0d72a
--- /dev/null
+++ b/tools/sra-pileup/sam-unaligned.c
@@ -0,0 +1,1565 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "read_fkt.h"
+#include "sam-unaligned.h"
+#include <kapp/main.h>
+#include <sysalloc.h>
+#include <ctype.h>
+
+#define COL_READ "(INSDC:dna:text)READ"
+#define COL_REF_NAME "(ascii)REF_NAME"
+#define COL_REF_SEQ_ID "(ascii)REF_SEQ_ID"
+#define COL_REF_POS "(INSDC:coord:zero)REF_POS"
+
+typedef struct prim_table_ctx
+{
+ const VCursor * cursor;
+
+ uint32_t ref_name_idx;
+ uint32_t ref_seq_id_idx;
+ uint32_t ref_pos_idx;
+} prim_table_ctx;
+
+
+static rc_t prepare_prim_table_ctx( const samdump_opts * const opts,
+ const input_table * const itab,
+ prim_table_ctx * const ptx )
+{
+ rc_t rc;
+
+ if ( opts->cursor_cache_size == 0 )
+ rc = VTableCreateCursorRead( itab->tab, &ptx->cursor );
+ else
+ rc = VTableCreateCachedCursorRead( itab->tab, &ptx->cursor, opts->cursor_cache_size );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VTableCreateCursorRead( PRIMARY_ALIGNMENT ) for $(tn) failed", "tn=%s", itab->path ) );
+ }
+ else
+ {
+ rc = add_column( ptx->cursor, COL_REF_NAME, &ptx->ref_name_idx );
+ if ( rc == 0 )
+ rc = add_column( ptx->cursor, COL_REF_SEQ_ID, &ptx->ref_seq_id_idx );
+ if ( rc == 0 )
+ rc = add_column( ptx->cursor, COL_REF_POS, &ptx->ref_pos_idx );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( ptx->cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( PRIMARY_ALIGNMENT ) for $(tn) failed", "tn=%s", itab->path ) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+#define COL_ALIGN_COUNT "(U8)ALIGNMENT_COUNT"
+#define COL_SPOT_ID "(INSDC:SRA:spotid_t)SPOT_ID"
+#define COL_PRIM_AL_ID "(I64)PRIMARY_ALIGNMENT_ID"
+#define COL_READ_TYPE "(INSDC:SRA:xread_type)READ_TYPE"
+#define COL_READ_FILTER "(INSDC:SRA:read_filter)READ_FILTER"
+#define COL_READ_LEN "(INSDC:coord:len)READ_LEN"
+#define COL_READ_START "(INSDC:coord:zero)READ_START"
+/* #define COL_QUALITY "(INSDC:quality:text:phred_33)QUALITY" */
+#define COL_QUALITY "(INSDC:quality:phred)QUALITY"
+#define COL_SPOT_GROUP "(ascii)SPOT_GROUP"
+#define COL_NAME "(ascii)NAME"
+#define COL_LNK_GROUP "(ascii)LINKAGE_GROUP"
+
+typedef struct seq_table_ctx
+{
+ const VCursor * cursor;
+
+ uint32_t align_count_idx;
+ uint32_t prim_al_id_idx;
+ uint32_t read_type_idx;
+ uint32_t read_filter_idx;
+ uint32_t read_len_idx;
+ uint32_t read_start_idx;
+ uint32_t read_idx;
+ uint32_t quality_idx;
+ uint32_t spot_group_idx;
+ uint32_t name_idx;
+ uint32_t lnk_group_idx;
+} seq_table_ctx;
+
+
+static rc_t prepare_seq_table_ctx( const samdump_opts * const opts,
+ const input_table * const itab,
+ seq_table_ctx * const stx )
+{
+ struct KNamelist * available_columns;
+ rc_t rc = VTableListReadableColumns ( itab->tab, &available_columns );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc,
+ "VTableListReadableColumns( SEQUENCE ) for $(tn) failed", "tn=%s", itab->path ) );
+ }
+ else
+ {
+ if ( opts->cursor_cache_size == 0 )
+ rc = VTableCreateCursorRead( itab->tab, &stx->cursor );
+ else
+ rc = VTableCreateCachedCursorRead( itab->tab, &stx->cursor, opts->cursor_cache_size );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VTableCreateCursorRead( SEQUENCE ) for $(tn) failed", "tn=%s", itab->path ) );
+ }
+ else
+ {
+ add_opt_column( stx->cursor, available_columns, COL_ALIGN_COUNT, &stx->align_count_idx ); /* read_fkt.c */
+ add_opt_column( stx->cursor, available_columns, COL_PRIM_AL_ID, &stx->prim_al_id_idx );
+ add_opt_column( stx->cursor, available_columns, COL_NAME, &stx->name_idx );
+ add_opt_column( stx->cursor, available_columns, COL_LNK_GROUP, &stx->lnk_group_idx );
+
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_READ_TYPE, &stx->read_type_idx ); /* read_fkt.c */
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_READ_FILTER, &stx->read_filter_idx );
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_READ_LEN, &stx->read_len_idx );
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_READ_START, &stx->read_start_idx );
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_READ, &stx->read_idx );
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_QUALITY, &stx->quality_idx );
+ if ( rc == 0 )
+ rc = add_column( stx->cursor, COL_SPOT_GROUP, &stx->spot_group_idx );
+ }
+ KNamelistRelease( available_columns );
+ }
+ return rc;
+}
+
+
+typedef struct seq_row
+{
+ uint32_t nreads;
+
+ bool fully_unaligned;
+ bool partly_unaligned;
+ bool filtered_out;
+} seq_row;
+
+
+static rc_t complain_size_diff( int64_t row_id, const char * txt )
+{
+ rc_t rc = RC( rcExe, rcNoTarg, rcConstructing, rcSize, rcInvalid );
+ (void)PLOGERR( klogInt, ( klogInt, rc, "in row $(rn) of SEQUENCE.$(tx)", "rn=%ld,tx=%s", row_id, txt ) );
+ return rc;
+}
+
+
+static rc_t read_seq_row( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const int64_t row_id,
+ seq_row * const row )
+{
+ rc_t rc = 0;
+
+ if ( stx->align_count_idx == INVALID_COLUMN )
+ {
+ const INSDC_read_type *ptr;
+
+ row->fully_unaligned = true;
+ row->partly_unaligned = false;
+ row->filtered_out = false;
+ rc = read_INSDC_read_type_ptr( row_id, stx->cursor, stx->read_type_idx, &ptr, &row->nreads, "READ_TYPE" );
+ }
+ else
+ {
+ const uint8_t * u8ptr;
+ uint32_t len;
+
+ /* ALIGNMENT_COUNT ... only to detect if reads are unaligned, could be done with PRIMARY_ALINGMENT too,
+ but this one is only 8 bit instead of 64 bit, that means faster */
+ rc = read_uint8_ptr( row_id, stx->cursor, stx->align_count_idx, &u8ptr, &len, "ALIGN_COUNT" );
+ if ( rc == 0 )
+ {
+ uint32_t i, n;
+
+ row->nreads = len;
+ for ( i = 0, n = 0; i < len; ++i )
+ if ( u8ptr[ i ] != 0 )
+ n++;
+ row->fully_unaligned = ( n == 0 );
+ row->partly_unaligned = ( n < len && n > 0 );
+
+ if ( row->partly_unaligned )
+ row->filtered_out = !opts->print_half_unaligned_reads;
+ else if ( row->fully_unaligned )
+ row->filtered_out = !opts->print_fully_unaligned_reads;
+ else
+ row->filtered_out = true;
+ }
+ }
+ return rc;
+}
+
+
+/**********************************************************************************
+
+ 0x001 template having multiple fragments in sequencing
+ (row->nreads > 1 )
+
+ 0x002 each fragment properly aligned according to the aligner
+ ( never the case in an unaligned read )
+
+ 0x004 fragment unmapped
+ ( always true in an unaligned read )
+
+ 0x008 next fragment in the template unmapped
+ ( is the mate aligned? next: read_idx+1, if read_idx==row->nreads-1 then read_idx-1 )
+
+ 0x010 SEQ being reverse complemented
+ ( column 'READ_TYPE' has bit READ_TYPE_REVERSE set )
+
+ 0x020 SEQ of the next fragment in the template being reversed
+ ( is the mate reversed? )
+
+ 0x040 the first fragment in the template
+ ( read_idx == 0 )
+
+ 0x080 the last fragment in the template
+ ( read_idx == ( row->nreads - 1 ) )
+
+ 0x100 secondary alignment
+ ( never the case in an unaligned read )
+
+ 0x200 not passing quality controls
+ ( column 'READ_FILTER' has bit READ_FILTER_REJECT set )
+
+ 0x400 PCR or optical duplicate
+ ( column 'READ_FILTER' has bit READ_FILTER_CRITERIA set )
+
+**********************************************************************************/
+static uint32_t calculate_unaligned_sam_flags_db( uint32_t nreads,
+ uint32_t read_idx,
+ uint32_t mate_idx,
+ int64_t mate_id,
+ const INSDC_read_type * read_type,
+ bool reverse_flag,
+ const INSDC_read_filter * read_filter )
+{
+ uint32_t res = 0x04;
+
+ if ( nreads > 1 )
+ {
+ res |= 0x01;
+ /* the following test only make sense if there is a mate */
+
+ if ( mate_id == 0 )
+ res |= 0x08;
+ if ( ( read_type[ mate_idx ] & READ_TYPE_REVERSE ) == READ_TYPE_REVERSE )
+ res |= 0x020;
+ if ( read_idx == 0 )
+ res |= 0x040;
+ if ( read_idx == ( nreads - 1 ) )
+ res |= 0x080;
+ }
+
+ if ( reverse_flag )
+ res |= 0x010;
+ if ( ( read_filter[ read_idx ] & READ_FILTER_REJECT ) == READ_FILTER_REJECT )
+ res |= 0x200;
+ if ( ( read_filter[ read_idx ] & READ_FILTER_CRITERIA ) == READ_FILTER_CRITERIA )
+ res |= 0x400;
+ return res;
+}
+
+
+const char * ref_name_star = "*";
+
+static rc_t get_mate_info( const prim_table_ctx * const ptx,
+ const matecache * const mc,
+ const input_database * const ids,
+ const int64_t row_id,
+ const int64_t mate_id,
+ const uint32_t nreads,
+ const char ** mate_ref_name,
+ uint32_t * const mate_ref_name_len,
+ INSDC_coord_zero * const mate_ref_pos )
+{
+ rc_t rc = 0;
+
+ *mate_ref_name = ref_name_star;
+ *mate_ref_name_len = 1;
+ *mate_ref_pos = 0;
+ if ( nreads < 2 )
+ return rc;
+
+ if ( mate_id != 0 )
+ {
+ uint32_t ref_idx;
+ int64_t seq_spot_id;
+ rc = matecache_lookup_unaligned( mc, ids->db_idx, mate_id, mate_ref_pos, &ref_idx, &seq_spot_id );
+ if ( rc == 0 )
+ {
+ const ReferenceObj* refobj;
+ *mate_ref_pos += 1;
+ /* now we have to lookup the reference-name based on it's index into the ids->reflist */
+ rc = ReferenceList_Get( ids->reflist, &refobj, ref_idx );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "in row $(rn) of SEQUENCE.$(rx)", "rn=%ld,rx=%ld", mate_id, row_id ) );
+ }
+ else
+ {
+ rc = ReferenceObj_Name( refobj, mate_ref_name );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "in row $(rn) of SEQUENCE.$(rx)", "rn=%ld,rx=%ld", mate_id, row_id ) );
+ }
+ else
+ {
+ *mate_ref_name_len = string_size( *mate_ref_name );
+ }
+ }
+ }
+ else if ( GetRCState( rc ) == rcNotFound )
+ {
+ /* we have a mate and it is aligned! ---> look it up in the PRIMARY_ALIGNMENT - table*/
+ const char * ptr;
+ uint32_t len;
+
+ rc = read_char_ptr( mate_id, ptx->cursor, ptx->ref_name_idx, &ptr, &len, "REF_NAME" );
+ if ( rc == 0 && len > 0 )
+ {
+ *mate_ref_name = ptr;
+ *mate_ref_name_len = len;
+ }
+
+ if ( rc == 0 )
+ {
+ INSDC_coord_zero pos;
+ rc = read_INSDC_coord_zero( mate_id, ptx->cursor, ptx->ref_pos_idx, &pos, 0, "REF_POS" );
+ if ( rc == 0 )
+ {
+ *mate_ref_pos = ( pos + 1 );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_sliced_read( const INSDC_dna_text * read,
+ uint32_t read_idx,
+ bool reverse,
+ const INSDC_coord_zero * read_start,
+ const INSDC_coord_len * read_len )
+{
+ rc_t rc = 0;
+ const INSDC_dna_text * ptr = read + read_start[ read_idx ];
+ if ( !reverse )
+ {
+ rc = KOutMsg( "%.*s", read_len[ read_idx ], ptr );
+ }
+ else
+ {
+ const char cmp_tbl [] =
+ {
+ 'T', 'V', 'G', 'H', 'E', 'F', 'C', 'D',
+ 'I', 'J', 'M', 'L', 'K', 'N', 'O', 'P',
+ 'Q', 'Y', 'S', 'A', 'U', 'B', 'W', 'X',
+ 'R', 'Z'
+ };
+
+ int32_t i = ( read_len[ read_idx ] - 1 );
+ while( i >= 0 && rc == 0 )
+ {
+ int c = ptr [ i ];
+ if ( isalpha ( c ) )
+ {
+ if ( islower ( c ) )
+ c = tolower ( cmp_tbl [ toupper ( c ) - 'A' ] );
+ else
+ c = cmp_tbl [ c - 'A' ];
+ }
+
+ rc = KOutMsg( "%c", ( char ) c );
+ i--;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_sliced_quality( const samdump_opts * const opts,
+ const char * quality,
+ uint32_t read_idx,
+ bool reverse,
+ const INSDC_coord_zero * read_start,
+ const INSDC_coord_len * read_len )
+{
+ const char * ptr = quality + read_start[ read_idx ];
+ return dump_quality( opts, ptr, read_len[ read_idx ], reverse ); /* sam-dump-opts.c */
+}
+
+
+static rc_t dump_the_other_read( const seq_table_ctx * const stx,
+ const prim_table_ctx * const ptx,
+ const int64_t row_id,
+ const uint32_t mate_idx )
+{
+ uint32_t row_len;
+ const int64_t *prim_al_id_ptr;
+
+ /* read from the SEQUENCE-table the value of the colum "PRIMARY_ALIGNMENT_ID"[ mate_idx ] */
+ rc_t rc = read_int64_ptr( row_id, stx->cursor, stx->prim_al_id_idx, &prim_al_id_ptr, &row_len, "PRIM_AL_ID" );
+ if ( rc == 0 )
+ {
+ if ( row_len == 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "rowlen zero in row $(rn) of SEQUENCE.PRIMARY_ALIGNMENT_ID", "rn=%ld", row_id ) );
+ }
+ else if ( mate_idx >= row_len )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "mate_idx invalid in row $(rn) of SEQUENCE.PRIMARY_ALIGNMENT_ID", "rn=%ld", row_id ) );
+ }
+ else
+ {
+ /* read from the PRIMARY_ALIGNMENT_TABLE the value of the columns "REF_NAME" and "REF_POS" */
+ int64_t a_row_id = prim_al_id_ptr[ mate_idx ];
+ if ( a_row_id == 0 )
+ {
+ rc = KOutMsg( "*\t0\t" );
+ }
+ else
+ {
+ const char * ref_name;
+ uint32_t ref_name_len;
+ rc = read_char_ptr( a_row_id, ptx->cursor, ptx->ref_name_idx, &ref_name, &ref_name_len, "REF_NAME" );
+ if ( rc == 0 )
+ {
+ if ( ref_name_len == 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "rowlen zero in row $(rn) of PRIM.REF_NAME", "rn=%ld", a_row_id ) );
+ }
+ else
+ {
+ const INSDC_coord_zero *ref_pos;
+ rc = read_INSDC_coord_zero_ptr( a_row_id, ptx->cursor, ptx->ref_pos_idx, &ref_pos, &row_len, "REF_POS" );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%.*s\t%i\t", ref_name_len, ref_name, ref_pos[ 0 ] + 1 );
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static uint32_t calc_mate_idx( const uint32_t n_reads, const uint32_t read_idx )
+{
+ if ( read_idx == ( n_reads - 1 ) )
+ return ( read_idx - 1 );
+ else
+ return ( read_idx + 1 );
+}
+
+
+static rc_t read_quality( const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const char **quality,
+ const uint32_t read_len )
+{
+ uint32_t quality_len;
+ rc_t rc = read_char_ptr( row_id, stx->cursor, stx->quality_idx, quality, &quality_len, "QUALITY" );
+ if ( rc == 0 && read_len != quality_len )
+ rc = complain_size_diff( row_id, "QUALITY" );
+ return rc;
+}
+
+
+static rc_t read_read_type( const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const INSDC_read_type **read_type,
+ const uint32_t read_len )
+{
+ uint32_t read_type_len;
+ rc_t rc = read_INSDC_read_type_ptr( row_id, stx->cursor, stx->read_type_idx, read_type, &read_type_len, "READ_TYPE" );
+ if ( rc == 0 && read_type_len != read_len )
+ rc = complain_size_diff( row_id, "READ_TYPE" );
+ return rc;
+}
+
+
+static rc_t read_read_filter( const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const INSDC_read_filter **read_filter,
+ const uint32_t read_len )
+{
+ uint32_t read_filter_len;
+ rc_t rc = read_INSDC_read_filter_ptr( row_id, stx->cursor, stx->read_filter_idx, read_filter, &read_filter_len, "READ_FILTER" );
+ if ( rc == 0 && read_filter_len != read_len )
+ rc = complain_size_diff( row_id, "READ_FILTER" );
+ return rc;
+}
+
+
+static rc_t read_read_start( const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const INSDC_coord_zero **read_start,
+ const uint32_t nreads )
+{
+ uint32_t read_start_len;
+ rc_t rc = read_INSDC_coord_zero_ptr( row_id, stx->cursor, stx->read_start_idx, read_start, &read_start_len, "READ_START" );
+ if ( rc == 0 && nreads != read_start_len )
+ rc = complain_size_diff( row_id, "READ_START" );
+ return rc;
+}
+
+
+static rc_t read_read_len( const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const INSDC_coord_len **read_len,
+ const uint32_t nreads )
+{
+ uint32_t read_len_len;
+ rc_t rc = read_INSDC_coord_len_ptr( row_id, stx->cursor, stx->read_len_idx, read_len, &read_len_len, "READ_LEN" );
+ if ( rc == 0 && nreads != read_len_len )
+ rc = complain_size_diff( row_id, "READ_LEN" );
+ return rc;
+}
+
+
+static bool calc_reverse_flag( const samdump_opts * const opts,
+ const uint32_t read_idx,
+ const INSDC_read_type * read_type )
+{
+ bool res = ( ( read_type[ read_idx ] & READ_TYPE_REVERSE ) == READ_TYPE_REVERSE );
+ if ( res )
+ res = opts -> reverse_unaligned_reads;
+ return res;
+}
+
+
+static rc_t opt_field_spot_group( const seq_table_ctx * const stx, int64_t row_id )
+{
+ const char * spot_group = NULL;
+ uint32_t spot_group_len;
+ rc_t rc = read_char_ptr( row_id, stx->cursor, stx->spot_group_idx, &spot_group, &spot_group_len, "SPOT_GROUP" );
+ if ( rc == 0 && spot_group_len > 0 )
+ rc = KOutMsg( "\tRG:Z:%.*s", spot_group_len, spot_group );
+ return rc;
+}
+
+static rc_t opt_field_lnk_group( const seq_table_ctx * const stx, int64_t row_id )
+{
+ const char * lnk_grp;
+ uint32_t lnk_grp_len;
+ rc_t rc = read_char_ptr( row_id, stx->cursor, stx->lnk_group_idx, &lnk_grp, &lnk_grp_len, "LINKAGE_GROUP" );
+ if ( rc == 0 && lnk_grp_len > 0 )
+ rc = KOutMsg( "\tBX:Z:%.*s", lnk_grp_len, lnk_grp );
+ return rc;
+}
+
+static rc_t dump_seq_row_sam_filtered( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const prim_table_ctx * const ptx,
+ const matecache * const mc,
+ const input_database * const ids,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, prim_align_ids_len;
+ const int64_t * prim_align_ids;
+ const char * quality = NULL;
+ const INSDC_dna_text * read = NULL;
+ const INSDC_read_type * read_type = NULL;
+ const INSDC_read_filter * read_filter = NULL;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_int64_ptr( row_id, stx->cursor, stx->prim_al_id_idx, &prim_align_ids, &prim_align_ids_len, "PRIM_AL_ID" );
+ if ( rc == 0 && nreads != prim_align_ids_len )
+ rc = complain_size_diff( row_id, "PRIMARY_ALIGNMENT_ID" );
+ if ( rc == 0 )
+ rc = read_read_len( stx, row_id, &read_len, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ int64_t align_id = prim_align_ids[ read_idx ];
+ if ( align_id == 0 && /* read is NOT aligned! */
+ read_len[ read_idx ] > 0 ) /* and has a length! */
+ {
+ uint32_t mate_idx = calc_mate_idx( nreads, read_idx );
+
+ /* here we have to find out if the read is actually requested:
+ -----------------------------------------------------------
+ read from the SEQ-table the ID of the mate in PRIM-table
+ look if we have the requested ID in the mate-cache, if not here it ends...
+ */
+ align_id = prim_align_ids[ mate_idx ];
+ if ( align_id != 0 )
+ {
+ uint32_t ref_idx;
+ INSDC_coord_zero mate_ref_pos;
+ int64_t seq_spot_id;
+ /* this is the filter: we look up in the mate-cache! */
+ rc = matecache_lookup_unaligned( mc, ids->db_idx, align_id, &mate_ref_pos, &ref_idx, &seq_spot_id );
+ if ( rc == 0 )
+ {
+ const ReferenceObj* refobj;
+ /* now we have to lookup the reference-name based on it's index into the ids->reflist */
+ rc = ReferenceList_Get( ids->reflist, &refobj, ref_idx );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "in row $(rn) of SEQUENCE.$(rx)", "rn=%ld,rx=%ld", mate_idx, row_id ) );
+ }
+ else
+ {
+ const char * mate_ref_name;
+ rc = ReferenceObj_Name( refobj, &mate_ref_name );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "in row $(rn) of SEQUENCE.$(rx)", "rn=%ld,rx=%ld", mate_idx, row_id ) );
+ }
+ else
+ {
+ bool reverse = false;
+
+ /* SAM-FIELD: QNAME SRA-column: SPOT_ID ( int64 ) */
+ if ( rc == 0 )
+ rc = KOutMsg( "%ld\t", seq_spot_id );
+
+ if ( rc == 0 && read_type == NULL )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+
+ if ( rc == 0 )
+ reverse = calc_reverse_flag( opts, read_idx, read_type );
+
+ if ( rc == 0 && read_filter == NULL )
+ rc = read_read_filter( stx, row_id, &read_filter, nreads );
+
+ /* SAM-FIELD: FLAG SRA-column: calculated from READ_TYPE, READ_FILTER etc. */
+ if ( rc == 0 )
+ {
+ uint32_t sam_flags = calculate_unaligned_sam_flags_db( nreads, read_idx, mate_idx,
+ align_id, read_type, reverse, read_filter );
+ rc = KOutMsg( "%u\t", sam_flags );
+ }
+
+ /* SAM-FIELD: RNAME SRA-column: none, fix '*' */
+ /* SAM-FIELD: POS SRA-column: none, fix '0' */
+ /* SAM-FIELD: MAPQ SRA-column: none, fix '0' */
+ /* SAM-FIELD: CIGAR SRA-column: none, fix '*' */
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t*\t" );
+
+ /* SAM-FIELD: RNEXT SRA-column: found in cache */
+ /* SAM-FIELD: POS SRA-column: found in cache */
+ if ( rc == 0 )
+ rc = KOutMsg( "%s\t%li\t", mate_ref_name, mate_ref_pos + 1 );
+
+ /* SAM-FIELD: TLEN SRA-column: none, fix '0' */
+ if ( rc == 0 )
+ rc = KOutMsg( "0\t" );
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* SAM-FIELD: SEQ SRA-column: READ, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\t" );
+
+ /* SAM-FIELD: QUAL SRA-column: QUALITY, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+
+ /* OPT SAM-FIELD: SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", row_id );
+
+ /* OPT SAM-FIELD: SRA-column: SPOT_GROUP */
+ if ( rc == 0 && stx->spot_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_spot_group( stx, row_id );
+
+ /* OPT SAM-FIELD: SRA-column: LINKAGE_GROUP */
+ if ( rc == 0 && stx->lnk_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_lnk_group( stx, row_id );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ }
+ else
+ {
+ rc = 0; /* it is OK if an alignment is not found in the cache, do not terminate! */
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t dump_seq_prim_row_sam( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const prim_table_ctx * const ptx,
+ const matecache * const mc,
+ const input_database * const ids,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, prim_align_ids_len;
+ const int64_t * prim_align_ids;
+ const char * quality = NULL;
+ const INSDC_dna_text * read = NULL;
+ const INSDC_read_type * read_type = NULL;
+ const INSDC_read_filter * read_filter = NULL;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_int64_ptr( row_id, stx->cursor, stx->prim_al_id_idx, &prim_align_ids, &prim_align_ids_len, "PRIM_AL_ID" );
+ if ( rc == 0 && nreads != prim_align_ids_len )
+ rc = complain_size_diff( row_id, "PRIMARY_ALIGNMENT_ID" );
+ if ( rc == 0 )
+ rc = read_read_len( stx, row_id, &read_len, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ if ( prim_align_ids[ read_idx ] == 0 && /* read is NOT aligned! */
+ read_len[ read_idx ] > 0 ) /* and has a length! */
+ {
+ bool reverse = false, mate_available = false;
+ uint32_t mate_idx = 0;
+ int64_t mate_id = 0;
+
+ if ( nreads > 1 )
+ {
+ if ( read_idx == ( nreads - 1 ) )
+ mate_idx = read_idx - 1;
+ else
+ mate_idx = read_idx + 1;
+ mate_available = true;
+ }
+
+ if ( mate_available && mate_idx < prim_align_ids_len )
+ mate_id = prim_align_ids[ mate_idx ];
+
+ if ( rc == 0 && read_type == NULL )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+ if ( rc == 0 )
+ reverse = calc_reverse_flag( opts, read_idx, read_type );
+
+ if ( rc == 0 && read_filter == NULL )
+ rc = read_read_filter( stx, row_id, &read_filter, nreads );
+
+ /* SAM-FIELD: QNAME SRA-column: SPOT_ID ( int64 ) */
+ if ( rc == 0 )
+ rc = KOutMsg( "%ld\t", row_id );
+
+ /* SAM-FIELD: FLAG SRA-column: calculated from READ_TYPE, READ_FILTER etc. */
+ if ( rc == 0 )
+ {
+ uint32_t sam_flags;
+ if ( stx->prim_al_id_idx != INVALID_COLUMN )
+ {
+ uint32_t temp_nreads = nreads;
+ if ( mate_id == 0 && read_len[ mate_idx ] == 0 ) temp_nreads--;
+ sam_flags = calculate_unaligned_sam_flags_db( temp_nreads, read_idx, mate_idx,
+ mate_id, read_type, reverse, read_filter );
+ }
+ else
+ {
+ if ( reverse )
+ sam_flags = ( 0x04 | 0x10 );
+ else
+ sam_flags = 0x04;
+ }
+ rc = KOutMsg( "%u\t", sam_flags );
+ }
+
+ /* SAM-FIELD: RNAME SRA-column: none, fix '*' */
+ /* SAM-FIELD: POS SRA-column: none, fix '0' */
+ /* SAM-FIELD: MAPQ SRA-column: none, fix '0' */
+ /* SAM-FIELD: CIGAR SRA-column: none, fix '*' */
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t*\t" );
+
+ /* SAM-FIELD: RNEXT SRA-column: look up in cache, or none */
+ /* SAM-FIELD: POS SRA-column: look up in cache, or none */
+ if ( rc == 0 )
+ {
+ if ( ptx == NULL )
+ {
+ rc = KOutMsg( "0\t0\t" ); /* no way to get that without PRIM_ALIGN-table */
+ }
+ else
+ {
+ if ( opts->use_mate_cache && mc != NULL && ids != NULL )
+ {
+ const char * mate_ref_name;
+ uint32_t mate_ref_name_len;
+ INSDC_coord_zero mate_ref_pos;
+
+ rc = get_mate_info( ptx, mc, ids, row_id, mate_id, nreads, &mate_ref_name, &mate_ref_name_len, &mate_ref_pos );
+ if ( rc == 0 )
+ rc = KOutMsg( "%.*s\t%li\t", mate_ref_name_len, mate_ref_name, mate_ref_pos );
+ }
+ else
+ {
+ /* print the mate info */
+ rc = dump_the_other_read( stx, ptx, row_id, mate_idx );
+ }
+ }
+ }
+
+
+ /* SAM-FIELD: TLEN SRA-column: none, fix '0' */
+ if ( rc == 0 )
+ rc = KOutMsg( "0\t" );
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* SAM-FIELD: SEQ SRA-column: READ, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\t" );
+
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+
+ /* SAM-FIELD: QUAL SRA-column: QUALITY, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+
+ /* OPT SAM-FIIELD: SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", row_id );
+
+ /* OPT SAM-FIIELD: SRA-column: SPOT_GROUP */
+ if ( rc == 0 && stx->spot_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_spot_group( stx, row_id );
+
+ /* OPT SAM-FIELD: SRA-column: LINKAGE_GROUP */
+ if ( rc == 0 && stx->lnk_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_lnk_group( stx, row_id );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ return rc;
+}
+
+
+/* called if we are dumping from a legacy table instead from a database */
+static rc_t dump_seq_row_sam( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, name_len;
+ const char * quality = NULL;
+ const char * name = NULL;
+ const INSDC_dna_text * read = NULL;
+ const INSDC_read_type * read_type;
+ const INSDC_read_filter * read_filter = NULL;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_read_len( stx, row_id, &read_len, nreads );
+ if ( rc == 0 )
+ {
+ if ( stx->name_idx != COL_NOT_AVAILABLE )
+ rc = read_char_ptr( row_id, stx->cursor, stx->name_idx, &name, &name_len, "NAME" );
+ else
+ name_len = 0;
+ }
+ if ( rc == 0 )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ if ( ( read_len[ read_idx ] > 0 ) && /* has a length! */
+ ( ( read_type[ read_idx ] & READ_TYPE_BIOLOGICAL ) == READ_TYPE_BIOLOGICAL ) )
+ {
+ bool reverse = false;
+ uint32_t mate_idx = 0;
+
+ if ( nreads > 1 )
+ {
+ if ( read_idx == ( nreads - 1 ) )
+ mate_idx = read_idx - 1;
+ else
+ mate_idx = read_idx + 1;
+ }
+
+ if ( rc == 0 ) /* types in interfaces/insdc/insdc.h */
+ reverse = calc_reverse_flag( opts, read_idx, read_type );
+
+ if ( rc == 0 && read_filter == NULL )
+ rc = read_read_filter( stx, row_id, &read_filter, nreads );
+
+ /* SAM-FIELD: QNAME SRA-column: SPOT_ID ( int64 ) */
+ if ( rc == 0 )
+ {
+ if ( name != NULL && name_len > 0 )
+ rc = KOutMsg( "%.*s\t", name_len, name );
+ else
+ rc = KOutMsg( "%lu\t", row_id );
+ }
+
+ /* SAM-FIELD: FLAG SRA-column: calculated from READ_TYPE, READ_FILTER etc. */
+ if ( rc == 0 )
+ {
+ uint32_t sam_flags = calculate_unaligned_sam_flags_db( nreads, read_idx, mate_idx,
+ 0, read_type, reverse, read_filter );
+ rc = KOutMsg( "%u\t", sam_flags );
+ }
+
+ /* SAM-FIELD: RNAME SRA-column: none, fix '*' */
+ /* SAM-FIELD: POS SRA-column: none, fix '0' */
+ /* SAM-FIELD: MAPQ SRA-column: none, fix '0' */
+ /* SAM-FIELD: CIGAR SRA-column: none, fix '*' */
+ /* SAM-FIELD: RNEXT SRA-column: none, fix '*' */
+ /* SAM-FIELD: POS SRA-column: none, fix '0' */
+ /* SAM-FIELD: TLEN SRA-column: none, fix '0' */
+
+ if ( rc == 0 )
+ rc = KOutMsg( "*\t0\t0\t*\t*\t0\t0\t" );
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* SAM-FIELD: SEQ SRA-column: READ, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\t" );
+
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+
+ /* SAM-FIELD: QUAL SRA-column: QUALITY, sliced by READ_START/READ_LEN */
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+
+ /* OPT SAM-FIIELD: SRA-column: ALIGN_ID */
+ if ( rc == 0 && opts->print_alignment_id_in_column_xi )
+ rc = KOutMsg( "\tXI:i:%u", row_id );
+
+ /* OPT SAM-FIIELD: SRA-column: SPOT_GROUP */
+ if ( rc == 0 && stx->spot_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_spot_group( stx, row_id );
+
+ /* OPT SAM-FIELD: SRA-column: LINKAGE_GROUP */
+ if ( rc == 0 && stx->lnk_group_idx != COL_NOT_AVAILABLE )
+ rc = opt_field_lnk_group( stx, row_id );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t dump_seq_row_fastx_filtered( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const prim_table_ctx * const ptx,
+ const matecache * const mc,
+ const input_database * const ids,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, prim_align_ids_len, spot_group_len = 0;
+ const int64_t * prim_align_ids;
+ const char * quality = NULL;
+ const INSDC_dna_text * read = NULL;
+ const char * spot_group = NULL;
+ const INSDC_read_type * read_type = NULL;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_int64_ptr( row_id, stx->cursor, stx->prim_al_id_idx, &prim_align_ids, &prim_align_ids_len, "PRIM_AL_ID" );
+ if ( rc == 0 && nreads != prim_align_ids_len )
+ rc = complain_size_diff( row_id, "PRIMARY_ALIGNMENT_ID" );
+ if ( rc == 0 )
+ rc = read_read_len( stx, row_id, &read_len, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ if ( prim_align_ids[ read_idx ] == 0 && /* read is NOT aligned! */
+ read_len[ read_idx ] > 0 ) /* and has a length! */
+ {
+ uint32_t mate_idx = calc_mate_idx( nreads, read_idx );
+ int64_t align_id = prim_align_ids[ mate_idx ];
+ if ( align_id != 0 )
+ {
+ uint32_t ref_idx;
+ INSDC_coord_zero mate_ref_pos;
+ int64_t seq_spot_id;
+ rc = matecache_lookup_unaligned( mc, ids->db_idx, align_id, &mate_ref_pos, &ref_idx, &seq_spot_id );
+ if ( rc == 0 )
+ {
+ bool reverse;
+
+ /* the NAME */
+ if ( opts->output_format == of_fastq )
+ rc = KOutMsg( "@" );
+ else
+ rc = KOutMsg( ">" );
+
+ if ( rc == 0 )
+ {
+ if ( opts->print_spot_group_in_name && spot_group == NULL )
+ rc = read_char_ptr( row_id, stx->cursor, stx->spot_group_idx, &spot_group, &spot_group_len, "SPOT_GROUP" );
+ if ( rc == 0 )
+ rc = dump_name( opts, seq_spot_id, spot_group, spot_group_len ); /* sam-dump-opts.c */
+ if ( rc == 0 )
+ rc = KOutMsg( "/%u unaligned\n", read_idx + 1 );
+ }
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+ if ( rc == 0 && read_type == NULL )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+ if ( rc == 0 )
+ reverse = ( ( read_type[ read_idx ] & READ_TYPE_REVERSE ) == READ_TYPE_REVERSE );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* the READ */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ /* in case of fastq : the QUALITY-line */
+ if ( rc == 0 && opts->output_format == of_fastq )
+ {
+ rc = KOutMsg( "+\n" );
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ else
+ {
+ rc = 0;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t dump_seq_row_fastx( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, prim_align_ids_len, spot_group_len = 0;
+ const int64_t * prim_align_ids;
+ const char * quality = NULL;
+ const INSDC_dna_text * read = NULL ;
+ const char * spot_group = NULL;
+ const INSDC_read_type * read_type = NULL;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_int64_ptr( row_id, stx->cursor, stx->prim_al_id_idx, &prim_align_ids, &prim_align_ids_len, "PRIM_AL_IDS" );
+ if ( rc == 0 && nreads != prim_align_ids_len )
+ rc = complain_size_diff( row_id, "PRIMARY_ALIGNMENT_ID" );
+ if ( rc == 0 )
+ rc = read_read_len( stx, row_id, &read_len, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ if ( prim_align_ids[ read_idx ] == 0 && /* read is NOT aligned! */
+ read_len[ read_idx ] > 0 ) /* and has a length! */
+ {
+ bool reverse;
+
+ /* the NAME */
+ if ( opts->output_format == of_fastq )
+ rc = KOutMsg( "@" );
+ else
+ rc = KOutMsg( ">" );
+ if ( rc == 0 )
+ {
+ if ( opts->print_spot_group_in_name && spot_group == NULL )
+ rc = read_char_ptr( row_id, stx->cursor, stx->spot_group_idx, &spot_group, &spot_group_len, "SPOT_GROUP" );
+ if ( rc == 0 )
+ rc = dump_name( opts, row_id, spot_group, spot_group_len ); /* sam-dump-opts.c */
+ if ( rc == 0 )
+ rc = KOutMsg( "/%u unaligned\n", read_idx + 1 );
+ }
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+ if ( rc == 0 && read_type == NULL )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+ if ( rc == 0 )
+ reverse = ( ( read_type[ read_idx ] & READ_TYPE_REVERSE ) == READ_TYPE_REVERSE );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* the READ */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ /* in case of fastq : the QUALITY-line */
+ if ( rc == 0 && opts->output_format == of_fastq )
+ {
+ rc = KOutMsg( "+\n" );
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t dump_seq_tab_row_fastx( const samdump_opts * const opts,
+ const seq_table_ctx * const stx,
+ const int64_t row_id,
+ const uint32_t nreads )
+{
+ uint32_t read_idx, rd_len, name_len, spot_group_len = 0;
+ const char * quality = NULL;
+ const char * name;
+ const INSDC_dna_text * read = NULL ;
+ const char * spot_group = NULL;
+ const INSDC_read_type * read_type;
+ const INSDC_coord_zero * read_start = NULL;
+ const INSDC_coord_len * read_len;
+
+ rc_t rc = read_read_len( stx, row_id, &read_len, nreads );
+ if ( rc == 0 )
+ rc = read_char_ptr( row_id, stx->cursor, stx->name_idx, &name, &name_len, "NAME" );
+ if ( rc == 0 )
+ rc = read_read_type( stx, row_id, &read_type, nreads );
+
+ for ( read_idx = 0; ( read_idx < nreads ) && ( rc == 0 ); ++read_idx )
+ {
+ if ( ( read_len[ read_idx ] > 0 ) && /* has a length! */
+ ( ( read_type[ read_idx ] & READ_TYPE_BIOLOGICAL ) == READ_TYPE_BIOLOGICAL ) )
+ {
+ bool reverse;
+
+ /* the NAME */
+ if ( opts->output_format == of_fastq )
+ rc = KOutMsg( "@" );
+ else
+ rc = KOutMsg( ">" );
+ if ( rc == 0 )
+ {
+ if ( opts->print_spot_group_in_name && spot_group == NULL )
+ rc = read_char_ptr( row_id, stx->cursor, stx->spot_group_idx, &spot_group, &spot_group_len, "SPOT_GROUP" );
+
+ if ( rc == 0 )
+ rc = dump_name_legacy( opts, name, name_len, spot_group, spot_group_len ); /* sam-dump-opts.c */
+
+ if ( rc == 0 )
+ rc = KOutMsg( "/%u unaligned\n", read_idx + 1 );
+ }
+
+ if ( rc == 0 && read == NULL )
+ rc = read_INSDC_dna_text_ptr( row_id, stx->cursor, stx->read_idx, &read, &rd_len, "READ" );
+ if ( rc == 0 && quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+ if ( rc == 0 )
+ reverse = ( ( read_type[ read_idx ] & READ_TYPE_REVERSE ) == READ_TYPE_REVERSE );
+ if ( rc == 0 && read_start == NULL )
+ rc = read_read_start( stx, row_id, &read_start, nreads );
+
+ /* the READ */
+ if ( rc == 0 )
+ rc = print_sliced_read( read, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ /* in case of fastq : the QUALITY-line */
+ if ( rc == 0 && opts->output_format == of_fastq )
+ {
+ if ( quality == NULL )
+ rc = read_quality( stx, row_id, &quality, rd_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "+\n" );
+ if ( rc == 0 )
+ rc = print_sliced_quality( opts, quality, read_idx, reverse, read_start, read_len );
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+typedef struct unaligned_callback_ctx
+{
+ const samdump_opts * opts;
+ const input_database * ids;
+ const matecache * mc;
+ seq_table_ctx * stx;
+ prim_table_ctx * ptx;
+} unaligned_callback_ctx;
+
+
+static rc_t CC on_unaligned_seq_id( int64_t seq_id, int64_t al_id, void * user_data )
+{
+ rc_t rc = Quitting();
+ if ( rc == 0 )
+ {
+ seq_row row;
+ unaligned_callback_ctx * u_ctx = user_data;
+ rc = read_seq_row( u_ctx->opts, u_ctx->stx, seq_id, &row );
+ if ( rc == 0 && !row.filtered_out )
+ {
+ switch( u_ctx->opts->output_format )
+ {
+ case of_sam : rc = dump_seq_row_sam_filtered( u_ctx->opts, u_ctx->stx, u_ctx->ptx, u_ctx->mc, u_ctx->ids, seq_id, row.nreads ); break;
+ case of_fasta : /* fall through intended ! */
+ case of_fastq : rc = dump_seq_row_fastx_filtered( u_ctx->opts, u_ctx->stx, u_ctx->ptx, u_ctx->mc, u_ctx->ids, seq_id, row.nreads ); break;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_unaligned_database_filtered_2( const samdump_opts * const opts,
+ const input_table * const seq,
+ const input_table * const prim,
+ const matecache * const mc,
+ const input_database * const ids )
+{
+ seq_table_ctx stx;
+ rc_t rc = prepare_seq_table_ctx( opts, seq, &stx );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( stx.cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ prim_table_ctx ptx;
+ rc = prepare_prim_table_ctx( opts, prim, &ptx );
+ if ( rc == 0 )
+ {
+ unaligned_callback_ctx u_ctx;
+ u_ctx.opts = opts;
+ u_ctx.ids = ids;
+ u_ctx.mc = mc;
+ u_ctx.stx = &stx;
+ u_ctx.ptx = &ptx;
+ rc = foreach_unaligned_entry( mc, ids->db_idx, on_unaligned_seq_id, &u_ctx );
+ VCursorRelease( ptx.cursor );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* we are printing from a sra-database, we print half aligned reads only if we find them in the mate-cache */
+static rc_t print_unaligned_database_filtered( const samdump_opts * const opts,
+ const input_table * const seq,
+ const input_table * const prim,
+ const matecache * const mc,
+ const input_database * const ids )
+{
+ return print_unaligned_database_filtered_2( opts, seq, prim, mc, ids );
+#if 0
+ seq_table_ctx stx;
+ rc_t rc = prepare_seq_table_ctx( opts, seq, &stx );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( stx.cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ int64_t first_row;
+ uint64_t row_count;
+ rc = VCursorIdRange( stx.cursor, stx.prim_al_id_idx, &first_row, &row_count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorIdRange( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ prim_table_ctx ptx;
+ rc = prepare_prim_table_ctx( opts, prim, &ptx );
+ if ( rc == 0 )
+ {
+ int64_t row_id;
+ seq_row row;
+
+ for ( row_id = first_row; ( ( row_id - first_row ) < row_count ) && rc == 0; ++row_id )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = read_seq_row( opts, &stx, row_id, &row );
+ if ( rc == 0 && !row.filtered_out )
+ {
+ switch( opts->output_format )
+ {
+ case of_sam : rc = dump_seq_row_sam_filtered( opts, &stx, &ptx, mc, ids, row_id, row.nreads ); break;
+ case of_fasta : /* fall through intended ! */
+ case of_fastq : rc = dump_seq_row_fastx_filtered( opts, &stx, &ptx, mc, ids, row_id, row.nreads ); break;
+ }
+ }
+ }
+ }
+ VCursorRelease( ptx.cursor );
+ }
+ }
+ }
+ VCursorRelease( stx.cursor );
+ }
+ return rc;
+#endif
+}
+
+
+/* we are printing from a sra-database, we print all unaligned read we can find */
+static rc_t print_unaligned_database_full( const samdump_opts * const opts,
+ const input_table * const seq,
+ const input_table * const prim,
+ const matecache * const mc,
+ const input_database * const ids )
+{
+ seq_table_ctx stx;
+ rc_t rc = prepare_seq_table_ctx( opts, seq, &stx );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( stx.cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ prim_table_ctx ptx;
+ if ( opts->output_format == of_sam )
+ rc = prepare_prim_table_ctx( opts, prim, &ptx );
+ if ( rc == 0 )
+ {
+ int64_t first_row, row_id;
+ uint64_t row_count;
+ rc = VCursorIdRange( stx.cursor, stx.read_type_idx, &first_row, &row_count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorIdRange( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ seq_row row;
+ for ( row_id = first_row; ( ( row_id - first_row ) < row_count ) && rc == 0; ++row_id )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = read_seq_row( opts, &stx, row_id, &row );
+ if ( rc == 0 && !row.filtered_out )
+ {
+ switch( opts->output_format )
+ {
+ case of_sam : rc = dump_seq_prim_row_sam( opts, &stx, &ptx, mc, ids, row_id, row.nreads ); break;
+ case of_fasta : /* fall through intended ! */
+ case of_fastq : rc = dump_seq_row_fastx( opts, &stx, row_id, row.nreads ); break;
+ }
+ }
+ }
+ }
+ }
+ if ( opts->output_format == of_sam )
+ VCursorRelease( ptx.cursor );
+ }
+ }
+ VCursorRelease( stx.cursor );
+ }
+ return rc;
+}
+
+
+/* we are printing from a (legacy) table not from a database! */
+static rc_t print_unaligned_table( const samdump_opts * const opts,
+ const input_table * const seq )
+{
+ seq_table_ctx stx;
+ rc_t rc = prepare_seq_table_ctx( opts, seq, &stx );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( stx.cursor );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorOpen( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ int64_t first_row, row_id;
+ uint64_t row_count;
+ rc = VCursorIdRange( stx.cursor, stx.read_type_idx, &first_row, &row_count );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "VCursorIdRange( SEQUENCE ) for $(tn) failed", "tn=%s", seq->path ) );
+ }
+ else
+ {
+ seq_row row;
+ for ( row_id = first_row; ( ( row_id - first_row ) < row_count ) && rc == 0; ++row_id )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ rc = read_seq_row( opts, &stx, row_id, &row );
+ if ( rc == 0 && !row.filtered_out )
+ {
+ switch( opts->output_format )
+ {
+ case of_sam : rc = dump_seq_row_sam( opts, &stx, row_id, row.nreads ); break;
+ case of_fasta : /* fall through intended ! */
+ case of_fastq : rc = dump_seq_tab_row_fastx( opts, &stx, row_id, row.nreads ); break;
+ }
+ }
+ }
+ }
+ }
+ }
+ VCursorRelease( stx.cursor );
+ }
+ return rc;
+}
+
+
+/* entry point from sam-dump3.c */
+rc_t print_unaligned_spots( const samdump_opts * const opts,
+ const input_files * const ifs,
+ const matecache * const mc )
+{
+ rc_t rc = 0;
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_start_section( opts->perf_log, "unaligned spots" );
+#endif
+
+ if ( ( ifs->database_count > 0 ) && ( opts->dump_unaligned_reads || opts->dump_unaligned_only ) )
+ {
+ uint32_t db_idx;
+ for ( db_idx = 0; db_idx < ifs->database_count && rc == 0; ++db_idx )
+ {
+ const input_database * ids = VectorGet( &ifs->dbs, db_idx );
+ if ( ids != NULL )
+ {
+ input_table seq;
+
+ seq.path = ids->path;
+ rc = VDatabaseOpenTableRead( ids->db, &seq.tab, "SEQUENCE" );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "cannot open table SEQUENCE for $(tn)", "tn=%s", ids->path ) );
+ }
+ else
+ {
+ input_table prim;
+ prim.path = ids->path;
+ rc = VDatabaseOpenTableRead( ids->db, &prim.tab, "PRIMARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR( klogInt, ( klogInt, rc, "cannot open table PRIMARY_ALIGNMENT $(tn)", "tn=%s", ids->path ) );
+ }
+ else
+ {
+ if ( opts->region_count > 0 )
+ {
+ rc = print_unaligned_database_filtered( opts, &seq, &prim, mc, ids );
+ }
+ else
+ {
+ rc = print_unaligned_database_full( opts, &seq, &prim, mc, ids );
+ }
+ VTableRelease( prim.tab );
+ }
+ VTableRelease( seq.tab );
+ }
+ }
+ }
+ }
+
+ if ( rc == 0 && ifs->table_count > 0 )
+ {
+ uint32_t tab_idx;
+ for ( tab_idx = 0; tab_idx < ifs->table_count && rc == 0; ++tab_idx )
+ {
+ input_table * itab = VectorGet( &ifs->tabs, tab_idx );
+ if ( itab != NULL )
+ rc = print_unaligned_table( opts, itab );
+ }
+ }
+
+#if _DEBUGGING
+ if ( opts->perf_log != NULL )
+ perf_log_end_section( opts->perf_log );
+#endif
+
+ return rc;
+}
diff --git a/tools/sra-pileup/sam-unaligned.h b/tools/sra-pileup/sam-unaligned.h
new file mode 100644
index 0000000..98624be
--- /dev/null
+++ b/tools/sra-pileup/sam-unaligned.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_sam_unaligned_
+#define _h_sam_unaligned_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include "sam-dump-opts.h"
+#include "inputfiles.h"
+#include "matecache.h"
+
+rc_t print_unaligned_spots( const samdump_opts * const opts,
+ const input_files * const ifs,
+ const matecache * const mc );
+
+#endif
diff --git a/tools/sra-pileup/splitfastq.pl b/tools/sra-pileup/splitfastq.pl
new file mode 100755
index 0000000..c110599
--- /dev/null
+++ b/tools/sra-pileup/splitfastq.pl
@@ -0,0 +1,46 @@
+#!/usr/bin/perl -w
+
+use IO::File;
+
+my $line;
+my $state = 0;
+my %filehandles;
+my $current_filehandle;
+my $base = $ARGV[ 0 ];
+
+if ( !defined ( $base ) )
+{
+ $base = "out";
+}
+
+while ( defined ( $line = <STDIN> ) )
+{
+ #remove line-feeds, white space etc.
+ chomp( $line );
+
+ if ( $state == 0 )
+ {
+ # get the first word
+ my $word0 = ( split( /\s+/, $line ) )[ 0 ];
+
+ # start with the beginning of the word, until '/' found, continue with numbers to end of string
+ if ( $word0 =~ /^[^\/]+\/(\d+)$/ )
+ {
+ # grep what matched after the '/'
+ my $selector = $1;
+ if ( !defined ( $filehandles{$selector}) )
+ {
+ $filehandles{$selector} = new IO::File( "$base.$selector.fastq", "w" );
+ }
+ $current_filehandle = $filehandles{$selector};
+ }
+ }
+
+ if ( defined( $current_filehandle ) )
+ {
+ $current_filehandle -> print( "$line\n" );
+ }
+
+ $state ++;
+ $state &= 0x3;
+}
\ No newline at end of file
diff --git a/tools/sra-pileup/sra-pileup.c b/tools/sra-pileup/sra-pileup.c
new file mode 100644
index 0000000..65b4c75
--- /dev/null
+++ b/tools/sra-pileup/sra-pileup.c
@@ -0,0 +1,1640 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ref_regions.h"
+#include "cmdline_cmn.h"
+#include "out_redir.h"
+#include "pileup_options.h"
+#include "dyn_string.h"
+#include "reref.h"
+#include "report_deletes.h"
+#include "ref_walker_0.h"
+#include "ref_walker.h"
+#include "walk_debug.h"
+#include "4na_ascii.h"
+#include "pileup_counters.h"
+#include "pileup_index.h"
+#include "pileup_varcount.h"
+#include "pileup_indels.h"
+#include "pileup_stat.h"
+#include "pileup_v2.h"
+
+#include <kapp/main.h>
+
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/report.h>
+#include <klib/vector.h>
+
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+
+#include <insdc/sra.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/report.h> /* ReportSetVDBManager() */
+#include <vdb/vdb-priv.h> /* VDBManagerDisablePagemapThread() */
+
+#include <sra/sraschema.h>
+#include <align/manager.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <string.h>
+
+#define COL_QUALITY "QUALITY"
+#define COL_REF_ORIENTATION "REF_ORIENTATION"
+#define COL_READ_FILTER "READ_FILTER"
+#define COL_TEMPLATE_LEN "TEMPLATE_LEN"
+
+#define OPTION_MINMAPQ "minmapq"
+#define ALIAS_MINMAPQ "q"
+
+#define OPTION_DUPS "duplicates"
+#define ALIAS_DUPS "d"
+
+#define OPTION_NOQUAL "noqual"
+#define ALIAS_NOQUAL "n"
+
+#define OPTION_NOSKIP "noskip"
+#define ALIAS_NOSKIP "s"
+
+#define OPTION_SHOWID "showid"
+#define ALIAS_SHOWID "i"
+
+#define OPTION_SPOTGRP "spotgroups"
+#define ALIAS_SPOTGRP "p"
+
+#define OPTION_SEQNAME "seqname"
+#define ALIAS_SEQNAME "e"
+
+#define OPTION_MIN_M "minmismatch"
+#define OPTION_MERGE "merge-dist"
+
+#define OPTION_DEPTH_PER_SPOTGRP "depth-per-spotgroup"
+
+#define OPTION_FUNC "function"
+#define ALIAS_FUNC NULL
+
+#define FUNC_COUNTERS "count"
+#define FUNC_STAT "stat"
+#define FUNC_RE_REF "ref"
+#define FUNC_RE_REF_EXT "ref-ex"
+#define FUNC_DEBUG "debug"
+#define FUNC_MISMATCH "mismatch"
+#define FUNC_INDEX "index"
+#define FUNC_TEST "test"
+#define FUNC_VARCOUNT "varcount"
+#define FUNC_DELETES "deletes"
+#define FUNC_INDELS "indels"
+
+enum
+{
+ sra_pileup_samtools = 0,
+ sra_pileup_counters = 1,
+ sra_pileup_stat = 2,
+ sra_pileup_report_ref = 3,
+ sra_pileup_report_ref_ext = 4,
+ sra_pileup_debug = 5,
+ sra_pileup_mismatch = 6,
+ sra_pileup_index = 7,
+ sra_pileup_test = 8,
+ sra_pileup_varcount = 9,
+ sra_pileup_deletes = 10,
+ sra_pileup_indels = 11
+};
+
+static const char * minmapq_usage[] = { "Minimum mapq-value, ",
+ "alignments with lower mapq",
+ "will be ignored (default=0)", NULL };
+
+static const char * dups_usage[] = { "process duplicates 0..off/1..on", NULL };
+
+static const char * noqual_usage[] = { "Omit qualities in output", NULL };
+
+static const char * noskip_usage[] = { "Does not skip reference-regions without alignments", NULL };
+
+static const char * showid_usage[] = { "Shows alignment-id for every base", NULL };
+
+static const char * spotgrp_usage[] = { "divide by spotgroups", NULL };
+
+static const char * dpgrp_usage[] = { "print depth per spotgroup", NULL };
+
+static const char * seqname_usage[] = { "use original seq-name", NULL };
+
+static const char * min_m_usage[] = { "min percent of mismatches used in function mismatch, default is 5%", NULL };
+
+static const char * merge_usage[] = { "If adjacent slices are closer than this, ",
+ "they are merged and a skiplist is created. ",
+ "a value of zero disables the feature, default is 10000", NULL };
+
+static const char * no_qual_usage[] = { "omit qualities", NULL };
+
+static const char * func_ref_usage[] = { "list references", NULL };
+static const char * func_ref_ex_usage[] = { "list references + coverage", NULL };
+static const char * func_count_usage[] = { "sort pileup with counters", NULL };
+static const char * func_stat_usage[] = { "strand/tlen statistic", NULL };
+static const char * func_mismatch_usage[] = { "only lines with mismatch", NULL };
+static const char * func_index_usage[] = { "list deletion counts", NULL };
+static const char * func_indels_usage[] = { "list only inserts/deletions", NULL };
+
+static const char * func_varcount_usage[] = { "variation counters: ",
+ "ref-name, ref-pos, ref-base, coverage, ",
+ "mismatch A, mismatch C, mismatch G, mismatch T,",
+ "deletes, inserts,",
+ "ins after A, ins after C, ins after G, ins after T", NULL };
+
+static const char * func_deletes_usage[] = { "list deletions greater then 20", NULL };
+
+static const char * func_usage[] = { "alternative functionality", NULL };
+
+OptDef MyOptions[] =
+{
+ /*name, alias, hfkt, usage-help, maxcount, needs value, required */
+ { OPTION_MINMAPQ, ALIAS_MINMAPQ, NULL, minmapq_usage, 1, true, false },
+ { OPTION_DUPS, ALIAS_DUPS, NULL, dups_usage, 1, true, false },
+ { OPTION_NOQUAL, ALIAS_NOQUAL, NULL, noqual_usage, 1, false, false },
+ { OPTION_NOSKIP, ALIAS_NOSKIP, NULL, noskip_usage, 1, false, false },
+ { OPTION_SHOWID, ALIAS_SHOWID, NULL, showid_usage, 1, false, false },
+ { OPTION_SPOTGRP, ALIAS_SPOTGRP, NULL, spotgrp_usage, 1, false, false },
+ { OPTION_DEPTH_PER_SPOTGRP, NULL, NULL, dpgrp_usage, 1, false, false },
+ { OPTION_SEQNAME, ALIAS_SEQNAME, NULL, seqname_usage, 1, false, false },
+ { OPTION_MIN_M, NULL, NULL, min_m_usage, 1, true, false },
+ { OPTION_MERGE, NULL, NULL, merge_usage, 1, true, false },
+ { OPTION_FUNC, ALIAS_FUNC, NULL, func_usage, 1, true, false }
+};
+
+/* =========================================================================================== */
+
+typedef struct pileup_callback_data
+{
+ const AlignMgr *almgr;
+ pileup_options *options;
+} pileup_callback_data;
+
+
+/* =========================================================================================== */
+
+static rc_t get_str_option( const Args *args, const char *name, const char ** res )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ *res = NULL;
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else
+ {
+ if ( count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void **)res );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsOptionValue() failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t get_uint32_option( const Args *args, const char *name,
+ uint32_t *res, const uint32_t def )
+{
+ const char * s;
+ rc_t rc = get_str_option( args, name, &s );
+ if ( rc == 0 && s != NULL )
+ *res = atoi( s );
+ else
+ *res = def;
+ return rc;
+}
+
+
+static rc_t get_bool_option( const Args *args, const char *name, bool *res, const bool def )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ *res = true;
+ }
+ else
+ {
+ *res = def;
+ }
+ return rc;
+}
+
+
+static int cmp_pchar( const char * a, const char * b )
+{
+ int res = -1;
+ if ( ( a != NULL )&&( b != NULL ) )
+ {
+ size_t len_a = string_size( a );
+ size_t len_b = string_size( b );
+ res = string_cmp ( a, len_a, b, len_b, ( len_a < len_b ) ? len_b : len_a );
+ }
+ return res;
+}
+
+/* =========================================================================================== */
+
+
+static rc_t get_pileup_options( Args * args, pileup_options *opts )
+{
+ rc_t rc = get_common_options( args, &opts->cmn );
+ opts->function = sra_pileup_samtools;
+
+ if ( rc == 0 )
+ rc = get_uint32_option( args, OPTION_MINMAPQ, &opts->minmapq, 0 );
+
+ if ( rc == 0 )
+ rc = get_uint32_option( args, OPTION_MIN_M, &opts->min_mismatch, 5 );
+
+ if ( rc == 0 )
+ rc = get_uint32_option( args, OPTION_MERGE, &opts->merge_dist, 10000 );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_DUPS, &opts->process_dups, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_NOQUAL, &opts->omit_qualities, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_NOSKIP, &opts->no_skip, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_SHOWID, &opts->show_id, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_SPOTGRP, &opts->div_by_spotgrp, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_DEPTH_PER_SPOTGRP, &opts->depth_per_spotgrp, false );
+
+ if ( rc == 0 )
+ rc = get_bool_option( args, OPTION_SEQNAME, &opts->use_seq_name, false );
+
+ if ( rc == 0 )
+ {
+ const char * fkt = NULL;
+ rc = get_str_option( args, OPTION_FUNC, &fkt );
+ if ( rc == 0 && fkt != NULL )
+ {
+ if ( cmp_pchar( fkt, FUNC_COUNTERS ) == 0 )
+ opts->function = sra_pileup_counters;
+ else if ( cmp_pchar( fkt, FUNC_STAT ) == 0 )
+ opts->function = sra_pileup_stat;
+ else if ( cmp_pchar( fkt, FUNC_RE_REF ) == 0 )
+ opts->function = sra_pileup_report_ref;
+ else if ( cmp_pchar( fkt, FUNC_RE_REF_EXT ) == 0 )
+ opts->function = sra_pileup_report_ref_ext;
+ else if ( cmp_pchar( fkt, FUNC_DEBUG ) == 0 )
+ opts->function = sra_pileup_debug;
+ else if ( cmp_pchar( fkt, FUNC_MISMATCH ) == 0 )
+ opts->function = sra_pileup_mismatch;
+ else if ( cmp_pchar( fkt, FUNC_INDEX ) == 0 )
+ opts->function = sra_pileup_index;
+ else if ( cmp_pchar( fkt, FUNC_TEST ) == 0 )
+ opts->function = sra_pileup_test;
+ else if ( cmp_pchar( fkt, FUNC_VARCOUNT ) == 0 )
+ opts->function = sra_pileup_varcount;
+ else if ( cmp_pchar( fkt, FUNC_DELETES ) == 0 )
+ opts->function = sra_pileup_deletes;
+ else if ( cmp_pchar( fkt, FUNC_INDELS ) == 0 )
+ opts->function = sra_pileup_indels;
+ }
+ }
+ return rc;
+}
+
+/* GLOBAL VARIABLES */
+struct {
+ KWrtWriter org_writer;
+ void* org_data;
+ KFile* kfile;
+ uint64_t pos;
+} g_out_writer = { NULL };
+
+const char UsageDefaultName[] = "sra-pileup";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s <path> [options]\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+ KOutMsg ( "Options:\n" );
+ print_common_helplines();
+ HelpOptionLine ( ALIAS_MINMAPQ, OPTION_MINMAPQ, "min. mapq", minmapq_usage );
+ HelpOptionLine ( ALIAS_DUPS, OPTION_DUPS, "dup-mode", dups_usage );
+ HelpOptionLine ( ALIAS_SPOTGRP, OPTION_SPOTGRP, NULL, spotgrp_usage );
+ HelpOptionLine ( NULL, OPTION_DEPTH_PER_SPOTGRP, NULL, dpgrp_usage );
+ HelpOptionLine ( ALIAS_SEQNAME, OPTION_SEQNAME, NULL, seqname_usage );
+ HelpOptionLine ( NULL, OPTION_MIN_M, NULL, min_m_usage );
+ HelpOptionLine ( NULL, OPTION_MERGE, NULL, merge_usage );
+ HelpOptionLine ( ALIAS_NOQUAL, OPTION_NOQUAL, NULL, no_qual_usage );
+
+ HelpOptionLine ( NULL, "function ref", NULL, func_ref_usage );
+ HelpOptionLine ( NULL, "function ref-ex", NULL, func_ref_ex_usage );
+ HelpOptionLine ( NULL, "function count", NULL, func_count_usage );
+ HelpOptionLine ( NULL, "function stat", NULL, func_stat_usage );
+ HelpOptionLine ( NULL, "function mismatch", NULL, func_mismatch_usage );
+ HelpOptionLine ( NULL, "function index", NULL, func_index_usage );
+ HelpOptionLine ( NULL, "function varcount", NULL, func_varcount_usage );
+ HelpOptionLine ( NULL, "function deletes", NULL, func_deletes_usage );
+ HelpOptionLine ( NULL, "function indels", NULL, func_indels_usage );
+
+ KOutMsg ( "\nGrouping of accessions into artificial spotgroups:\n" );
+ KOutMsg ( " sra-pileup SRRXXXXXX=a SRRYYYYYY=b SRRZZZZZZ=a\n\n" );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+/*
+static rc_t CC BufferedWriter ( void* self, const char* buffer, size_t bufsize, size_t* num_writ )
+{
+ rc_t rc = 0;
+
+ assert( buffer != NULL );
+ assert( num_writ != NULL );
+
+ do {
+ rc = KFileWrite( g_out_writer.kfile, g_out_writer.pos, buffer, bufsize, num_writ );
+ if ( rc == 0 )
+ {
+ buffer += *num_writ;
+ bufsize -= *num_writ;
+ g_out_writer.pos += *num_writ;
+ }
+ } while ( rc == 0 && bufsize > 0 );
+ return rc;
+}
+
+
+static rc_t set_stdout_to( bool gzip, bool bzip2, const char * filename, size_t bufsize )
+{
+ rc_t rc = 0;
+ if ( gzip && bzip2 )
+ {
+ rc = RC( rcApp, rcFile, rcConstructing, rcParam, rcAmbiguous );
+ }
+ else
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ KFile *of;
+ rc = KDirectoryCreateFile ( dir, &of, false, 0664, kcmInit, "%s", filename );
+ if ( rc == 0 )
+ {
+ KFile *buf;
+ if ( gzip )
+ {
+ KFile *gz;
+ rc = KFileMakeGzipForWrite( &gz, of );
+ if ( rc == 0 )
+ {
+ KFileRelease( of );
+ of = gz;
+ }
+ }
+ if ( bzip2 )
+ {
+ KFile *bz;
+ rc = KFileMakeBzip2ForWrite( &bz, of );
+ if ( rc == 0 )
+ {
+ KFileRelease( of );
+ of = bz;
+ }
+ }
+
+ rc = KBufFileMakeWrite( &buf, of, false, bufsize );
+ if ( rc == 0 )
+ {
+ g_out_writer.kfile = buf;
+ g_out_writer.org_writer = KOutWriterGet();
+ g_out_writer.org_data = KOutDataGet();
+ rc = KOutHandlerSet( BufferedWriter, &g_out_writer );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ }
+ KFileRelease( of );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
+
+
+static void release_stdout_redirection( void )
+{
+ KFileRelease( g_out_writer.kfile );
+ if( g_out_writer.org_writer != NULL )
+ {
+ KOutHandlerSet( g_out_writer.org_writer, g_out_writer.org_data );
+ }
+ g_out_writer.org_writer = NULL;
+}
+*/
+
+static rc_t CC write_to_FILE( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t read_base_and_len( struct VCursor const *curs,
+ uint32_t column_idx,
+ int64_t row_id,
+ const void ** base,
+ uint32_t * len )
+{
+ uint32_t elem_bits, boff, len_intern;
+ const void * ptr;
+ rc_t rc = VCursorCellDataDirect ( curs, row_id, column_idx, &elem_bits, &ptr, &boff, &len_intern );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorCellDataDirect() failed" );
+ }
+ else
+ {
+ if ( len != NULL ) *len = len_intern;
+ if ( base != NULL ) *base = ptr;
+ }
+ return rc;
+}
+
+
+static rc_t CC populate_tooldata( void *obj, const PlacementRecord *placement,
+ struct VCursor const *curs, INSDC_coord_zero ref_window_start, INSDC_coord_len ref_window_len,
+ void *data, void * placement_ctx )
+{
+ tool_rec * rec = ( tool_rec * ) obj;
+ pileup_callback_data * cb_data = ( pileup_callback_data * )data;
+ pileup_col_ids * col_ids = placement_ctx;
+ rc_t rc = 0;
+
+ rec->quality = NULL;
+ if ( !cb_data->options->process_dups )
+ {
+ const uint8_t * read_filter;
+ uint32_t read_filter_len;
+ rc = read_base_and_len( curs, col_ids->idx_read_filter, placement->id,
+ (const void **)&read_filter, &read_filter_len );
+ if ( rc == 0 )
+ {
+ if ( ( *read_filter == SRA_READ_FILTER_REJECT )||
+ ( *read_filter == SRA_READ_FILTER_CRITERIA ) )
+ {
+ rc = RC( rcAlign, rcType, rcAccessing, rcId, rcIgnored );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ const bool * orientation;
+ rc = read_base_and_len( curs, col_ids->idx_ref_orientation, placement->id,
+ (const void **)&orientation, NULL );
+ if ( rc == 0 )
+ rec->reverse = *orientation;
+ }
+
+ if ( rc == 0 && !cb_data->options->omit_qualities )
+ {
+ const uint8_t * quality;
+ /*uint32_t quality_len;*/
+
+ rc = read_base_and_len( curs, col_ids->idx_quality, placement->id,
+ (const void **)&quality, &rec->quality_len );
+ if ( rc == 0 )
+ {
+ rec->quality = ( uint8_t * )rec;
+ rec->quality += sizeof ( * rec );
+ memmove( rec->quality, quality, rec->quality_len );
+ }
+ }
+
+ if ( rc == 0 && cb_data->options->read_tlen )
+ {
+ const int32_t * tlen;
+ uint32_t tlen_len;
+
+ rc = read_base_and_len( curs, col_ids->idx_template_len, placement->id,
+ (const void **)&tlen, &tlen_len );
+ if ( rc == 0 && tlen_len > 0 )
+ rec->tlen = *tlen;
+ else
+ rec->tlen = 0;
+ }
+ else
+ rec->tlen = 0;
+
+ return rc;
+}
+
+
+static rc_t CC alloc_size( struct VCursor const *curs, int64_t row_id, size_t * size, void *data, void * placement_ctx )
+{
+ rc_t rc = 0;
+ tool_rec * rec;
+ pileup_callback_data *cb_data = ( pileup_callback_data * )data;
+ pileup_col_ids * col_ids = placement_ctx;
+ *size = ( sizeof *rec );
+
+ if ( !cb_data->options->omit_qualities )
+ {
+ uint32_t q_len;
+ rc = read_base_and_len( curs, col_ids->idx_quality, row_id, NULL, &q_len );
+ if ( rc == 0 )
+ *size += q_len;
+ }
+ return rc;
+}
+
+
+static rc_t walk_ref_position( ReferenceIterator *ref_iter,
+ const PlacementRecord *rec,
+ struct dyn_string *line,
+ char * qual,
+ pileup_options *options )
+{
+ rc_t rc = 0;
+ INSDC_coord_zero seq_pos;
+ int32_t state = ReferenceIteratorState ( ref_iter, &seq_pos );
+ tool_rec *xrec = ( tool_rec * ) PlacementRecordCast ( rec, placementRecordExtension1 );
+ bool reverse = xrec->reverse;
+
+ if ( !options->omit_qualities )
+ {
+ if ( seq_pos < xrec->quality_len )
+ *qual = xrec->quality[ seq_pos ];
+ else
+ *qual = 2;
+ }
+
+ if ( ( state & align_iter_invalid ) == align_iter_invalid )
+ {
+ return add_char_2_dyn_string( line, '?' );
+ }
+
+ if ( ( state & align_iter_first ) == align_iter_first )
+ {
+ char s[ 3 ];
+ int32_t c = rec->mapq + 33;
+ if ( c > '~' ) { c = '~'; }
+ if ( c < 33 ) { c = 33; }
+ s[ 0 ] = '^';
+ s[ 1 ] = c;
+ s[ 2 ] = 0;
+ rc = add_string_2_dyn_string( line, s );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( ( state & align_iter_skip ) == align_iter_skip )
+ {
+ if ( reverse )
+ rc = add_char_2_dyn_string( line, '<' );
+ else
+ rc = add_char_2_dyn_string( line, '>' );
+ if ( !options->omit_qualities )
+ *qual = xrec->quality[ seq_pos + 1 ];
+ }
+ else
+ {
+ if ( ( state & align_iter_match ) == align_iter_match )
+ rc = add_char_2_dyn_string( line, ( reverse ? ',' : '.' ) );
+ else
+ rc = add_char_2_dyn_string( line, _4na_to_ascii( state, reverse ) );
+ }
+ }
+
+ if ( ( state & align_iter_insert ) == align_iter_insert )
+ {
+ const INSDC_4na_bin *bases;
+ uint32_t i;
+ uint32_t n = ReferenceIteratorBasesInserted ( ref_iter, &bases );
+
+ rc = print_2_dyn_string( line, "+%u", n );
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ rc = add_char_2_dyn_string( line, _4na_to_ascii( bases[ i ], reverse ) );
+ }
+ }
+
+ if ( ( state & align_iter_delete ) == align_iter_delete )
+ {
+ const INSDC_4na_bin *bases;
+ INSDC_coord_zero ref_pos;
+ uint32_t n = ReferenceIteratorBasesDeleted ( ref_iter, &ref_pos, &bases );
+ if ( bases != NULL )
+ {
+ uint32_t i;
+ rc = print_2_dyn_string( line, "-%u", n );
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ rc = add_char_2_dyn_string( line, _4na_to_ascii( bases[ i ], reverse ) );
+ }
+ free( (void *) bases );
+ }
+ }
+
+ if ( ( ( state & align_iter_last ) == align_iter_last )&& ( rc == 0 ) )
+ rc = add_char_2_dyn_string( line, '$' );
+
+ if ( options->show_id )
+ rc = print_2_dyn_string( line, "(%,lu:%,d-%,d/%u)",
+ rec->id, rec->pos + 1, rec->pos + rec->len, seq_pos );
+
+ return rc;
+}
+
+
+static rc_t walk_alignments( ReferenceIterator *ref_iter,
+ struct dyn_string *line,
+ struct dyn_string *events,
+ struct dyn_string *qualities,
+ pileup_options *options )
+{
+ uint32_t depth = 0;
+ rc_t rc;
+
+ reset_dyn_string( events );
+ do
+ {
+ const PlacementRecord *rec;
+ rc = ReferenceIteratorNextPlacement ( ref_iter, &rec );
+ if ( rc == 0 )
+ rc = walk_ref_position( ref_iter, rec, events, dyn_string_char( qualities, depth++ ), options );
+ if ( rc == 0 )
+ rc = Quitting();
+ } while ( rc == 0 );
+
+ if ( options->depth_per_spotgrp )
+ print_2_dyn_string( line, "%d\t", depth );
+
+ add_dyn_string_2_dyn_string( line, events );
+
+ if ( !options->omit_qualities )
+ {
+ uint32_t i;
+ add_char_2_dyn_string( line, '\t' );
+ for ( i = 0; i < depth; ++i )
+ {
+ char * c = dyn_string_char( qualities, i );
+ add_char_2_dyn_string( line, *c + 33 );
+ }
+ }
+
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+static rc_t walk_spot_groups( ReferenceIterator *ref_iter,
+ struct dyn_string *line,
+ struct dyn_string *events,
+ struct dyn_string *qualities,
+ pileup_options *options )
+{
+ rc_t rc;
+ reset_dyn_string( events );
+ do
+ {
+ rc = ReferenceIteratorNextSpotGroup ( ref_iter, NULL, NULL );
+ if ( rc == 0 )
+ add_char_2_dyn_string( line, '\t' );
+ if ( rc == 0 )
+ rc = walk_alignments( ref_iter, line, events, qualities, options );
+ } while ( rc == 0 );
+
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ return rc;
+}
+
+
+static rc_t walk_position( ReferenceIterator *ref_iter,
+ const char * refname,
+ struct dyn_string *line,
+ struct dyn_string *events,
+ struct dyn_string *qualities,
+ pileup_options *options )
+{
+ INSDC_coord_zero pos;
+ uint32_t depth;
+ INSDC_4na_bin base;
+
+ rc_t rc = ReferenceIteratorPosition ( ref_iter, &pos, &depth, &base );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextPos() failed" );
+ }
+ }
+ else if ( ( depth > 0 )||( options->no_skip ) )
+ {
+ bool skip = skiplist_is_skip_position( options->skiplist, pos + 1 );
+ if ( !skip )
+ {
+ rc = expand_dyn_string( line, ( 5 * depth ) + 100 );
+ if ( rc == 0 )
+ {
+ rc = expand_dyn_string( events, ( 5 * depth ) + 100 );
+ if ( rc == 0 )
+ {
+ rc = expand_dyn_string( qualities, depth + 100 );
+ if ( rc == 0 )
+ {
+ char c = _4na_to_ascii( base, false );
+
+ reset_dyn_string( line );
+
+ if ( options->depth_per_spotgrp )
+ rc = print_2_dyn_string( line, "%s\t%u\t%c", refname, pos + 1, c );
+ else
+ rc = print_2_dyn_string( line, "%s\t%u\t%c\t%u", refname, pos + 1, c, depth );
+
+ if ( rc == 0 )
+ {
+ if ( depth > 0 )
+ rc = walk_spot_groups( ref_iter, line, events, qualities, options );
+
+ /* only one KOutMsg() per line... */
+ if ( rc == 0 )
+ rc = KOutMsg( "%s\n", dyn_string_char( line, 0 ) );
+
+ if ( GetRCState( rc ) == rcDone )
+ rc = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t walk_reference_window( ReferenceIterator *ref_iter,
+ const char * refname,
+ struct dyn_string *line,
+ struct dyn_string *events,
+ struct dyn_string *qualities,
+ pileup_options *options )
+{
+ rc_t rc = 0;
+ while ( rc == 0 )
+ {
+ rc = ReferenceIteratorNextPos ( ref_iter, !options->no_skip );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextPos() failed" );
+ }
+ }
+ else
+ {
+ rc = walk_position( ref_iter, refname, line, events, qualities, options );
+ }
+ if ( rc == 0 )
+ {
+ rc = Quitting();
+ }
+ }
+ if ( GetRCState( rc ) == rcDone ) rc = 0;
+ return rc;
+}
+
+
+static rc_t walk_reference( ReferenceIterator *ref_iter,
+ const char * refname,
+ pileup_options *options )
+{
+ struct dyn_string * line;
+ rc_t rc = allocated_dyn_string ( &line, 4096 );
+ if ( rc == 0 )
+ {
+ struct dyn_string * events;
+ rc_t rc = allocated_dyn_string ( &events, 4096 );
+ if ( rc == 0 )
+ {
+ struct dyn_string * qualities;
+ rc = allocated_dyn_string ( &qualities, 4096 );
+ if ( rc == 0 )
+ {
+ while ( rc == 0 )
+ {
+ rc = Quitting ();
+ if ( rc == 0 )
+ {
+ INSDC_coord_zero first_pos;
+ INSDC_coord_len len;
+ rc = ReferenceIteratorNextWindow ( ref_iter, &first_pos, &len );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextWindow() failed" );
+ }
+ }
+ else
+ rc = walk_reference_window( ref_iter, refname, line, events, qualities, options );
+ }
+ }
+ free_dyn_string ( qualities );
+ }
+ free_dyn_string( events );
+ }
+ free_dyn_string ( line );
+ }
+ if ( GetRCState( rc ) == rcDone ) rc = 0;
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+static rc_t walk_ref_iter( ReferenceIterator *ref_iter, pileup_options *options )
+{
+ rc_t rc = 0;
+ while( rc == 0 )
+ {
+ /* this is the 1st level of walking the reference-iterator:
+ visiting each (requested) reference */
+ struct ReferenceObj const * refobj;
+
+ rc = ReferenceIteratorNextReference( ref_iter, NULL, NULL, &refobj );
+ if ( rc == 0 )
+ {
+ if ( refobj != NULL )
+ {
+ const char * refname = NULL;
+ if ( options->use_seq_name )
+ rc = ReferenceObj_Name( refobj, &refname );
+ else
+ rc = ReferenceObj_SeqId( refobj, &refname );
+
+ if ( rc == 0 )
+ {
+ if ( options->skiplist != NULL )
+ skiplist_enter_ref( options->skiplist, refname );
+ rc = walk_reference( ref_iter, refname, options );
+ }
+ else
+ {
+ if ( options->use_seq_name )
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_Name() failed" );
+ }
+ else
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( GetRCState( rc ) != rcDone )
+ {
+ LOGERR( klogInt, rc, "ReferenceIteratorNextReference() failed" );
+ }
+ }
+ }
+ if ( GetRCState( rc ) == rcDone ) { rc = 0; }
+ if ( GetRCState( rc ) == rcCanceled ) { rc = 0; }
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+static rc_t add_quality_and_orientation( const VTable *tbl, const VCursor ** cursor,
+ bool omit_qualities, bool read_tlen, pileup_col_ids * cursor_ids )
+{
+ rc_t rc = VTableCreateCursorRead ( tbl, cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VTableCreateCursorRead() failed" );
+ }
+
+ if ( rc == 0 && !omit_qualities )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_quality, COL_QUALITY );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(QUALITY) failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_ref_orientation, COL_REF_ORIENTATION );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(REF_ORIENTATION) failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_read_filter, COL_READ_FILTER );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(READ_FILTER) failed" );
+ }
+ }
+
+ if ( rc == 0 && read_tlen )
+ {
+ rc = VCursorAddColumn ( *cursor, &cursor_ids->idx_template_len, COL_TEMPLATE_LEN );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorAddColumn(TEMPLATE_LEN) failed" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t prepare_prim_cursor( const VDatabase *db, const VCursor ** cursor,
+ bool omit_qualities, bool read_tlen, pileup_col_ids * cursor_ids )
+{
+ const VTable *tbl;
+ rc_t rc = VDatabaseOpenTableRead ( db, &tbl, "PRIMARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDatabaseOpenTableRead(PRIMARY_ALIGNMENT) failed" );
+ }
+ else
+ {
+ rc = add_quality_and_orientation( tbl, cursor, omit_qualities, read_tlen, cursor_ids );
+ VTableRelease ( tbl );
+ }
+ return rc;
+}
+
+
+static rc_t prepare_sec_cursor( const VDatabase *db, const VCursor ** cursor,
+ bool omit_qualities, bool read_tlen, pileup_col_ids * cursor_ids )
+{
+ const VTable *tbl;
+ rc_t rc = VDatabaseOpenTableRead ( db, &tbl, "SECONDARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDatabaseOpenTableRead(SECONDARY_ALIGNMENT) failed" );
+ }
+ else
+ {
+ rc = add_quality_and_orientation( tbl, cursor, omit_qualities, read_tlen, cursor_ids );
+ VTableRelease ( tbl );
+ }
+ return rc;
+}
+
+
+static rc_t prepare_evidence_cursor( const VDatabase *db, const VCursor ** cursor,
+ bool omit_qualities, bool read_tlen, pileup_col_ids * cursor_ids )
+{
+ const VTable *tbl;
+ rc_t rc = VDatabaseOpenTableRead ( db, &tbl, "EVIDENCE_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDatabaseOpenTableRead(EVIDENCE) failed" );
+ }
+ else
+ {
+ rc = add_quality_and_orientation( tbl, cursor, omit_qualities, read_tlen, cursor_ids );
+ VTableRelease ( tbl );
+ }
+ return rc;
+}
+
+#if 0
+static void show_placement_params( const char * prefix, const ReferenceObj *refobj,
+ uint32_t start, uint32_t end )
+{
+ const char * name;
+ rc_t rc = ReferenceObj_SeqId( refobj, &name );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_SeqId() failed" );
+ }
+ else
+ {
+ KOutMsg( "prepare %s: <%s> %u..%u\n", prefix, name, start, end ) ;
+ }
+}
+#endif
+
+
+static rc_t make_cursor_ids( Vector *cursor_id_vector, pileup_col_ids ** cursor_ids )
+{
+ rc_t rc;
+ pileup_col_ids * ids = malloc( sizeof * ids );
+ if ( ids == NULL )
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcMemory, rcExhausted );
+ else
+ {
+ rc = VectorAppend ( cursor_id_vector, NULL, ids );
+ if ( rc != 0 )
+ free( ids );
+ else
+ *cursor_ids = ids;
+ }
+ return rc;
+}
+
+
+static rc_t CC prepare_section_cb( prepare_ctx * ctx, const struct reference_range * range )
+{
+ rc_t rc = 0;
+ INSDC_coord_len len;
+ if ( ctx->db == NULL || ctx->refobj == NULL )
+ {
+ rc = SILENT_RC ( rcApp, rcNoTarg, rcOpening, rcSelf, rcInvalid );
+ /* it is opened in prepare_db_table even if ctx->db == NULL */
+ PLOGERR( klogErr, ( klogErr, rc, "failed to process $(path)",
+ "path=%s", ctx->path == NULL ? "input argument" : ctx->path));
+ ReportSilence();
+ }
+ else
+ {
+ rc = ReferenceObj_SeqLength( ctx->refobj, &len );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ReferenceObj_SeqLength() failed" );
+ }
+ else
+ {
+ uint32_t start, end;
+ rc_t rc1 = 0, rc2 = 0, rc3 = 0;
+
+ if ( range == NULL )
+ {
+ start = 1;
+ end = ( len - start ) + 1;
+ }
+ else
+ {
+ start = get_ref_range_start( range );
+ end = get_ref_range_end( range );
+ }
+
+ if ( start == 0 ) start = 1;
+ if ( ( end == 0 )||( end > len + 1 ) )
+ {
+ end = ( len - start ) + 1;
+ }
+
+ /* depending on ctx->select prepare primary, secondary or both... */
+ if ( ctx->use_primary_alignments )
+ {
+ if ( ctx->prim_cur == NULL )
+ {
+ rc1 = make_cursor_ids( ctx->data, &ctx->prim_cur_ids );
+ if ( rc1 != 0 )
+ {
+ LOGERR( klogInt, rc1, "cannot create cursor-ids for prim. alignment cursor" );
+ }
+ else
+ rc1 = prepare_prim_cursor( ctx->db, &ctx->prim_cur, ctx->omit_qualities,
+ ctx->read_tlen, ctx->prim_cur_ids );
+ }
+
+ if ( rc1 == 0 )
+ {
+ /* show_placement_params( "primary", ctx->refobj, start, end ); */
+ rc1 = ReferenceIteratorAddPlacements ( ctx->ref_iter, /* the outer ref-iter */
+ ctx->refobj, /* the ref-obj for this chromosome */
+ start - 1, /* start ( zero-based ) */
+ end - start + 1, /* length */
+ NULL, /* ref-cursor */
+ ctx->prim_cur, /* align-cursor */
+ primary_align_ids, /* which id's */
+ ctx->spot_group, /* what read-group */
+ ctx->prim_cur_ids /* placement-context */
+ );
+ if ( rc1 != 0 )
+ {
+ LOGERR( klogInt, rc1, "ReferenceIteratorAddPlacements(prim) failed" );
+ }
+ }
+ }
+
+ if ( ctx->use_secondary_alignments )
+ {
+ if ( ctx->sec_cur == NULL )
+ {
+ rc2 = make_cursor_ids( ctx->data, &ctx->sec_cur_ids );
+ if ( rc2 != 0 )
+ {
+ LOGERR( klogInt, rc2, "cannot create cursor-ids for sec. alignment cursor" );
+ }
+ else
+ rc2 = prepare_sec_cursor( ctx->db, &ctx->sec_cur, ctx->omit_qualities,
+ ctx->read_tlen, ctx->sec_cur_ids );
+ }
+
+ if ( rc2 == 0 )
+ {
+ /* show_placement_params( "secondary", ctx->refobj, start, end ); */
+ rc2 = ReferenceIteratorAddPlacements ( ctx->ref_iter, /* the outer ref-iter */
+ ctx->refobj, /* the ref-obj for this chromosome */
+ start - 1, /* start ( zero-based ) */
+ end - start + 1, /* length */
+ NULL, /* ref-cursor */
+ ctx->sec_cur, /* align-cursor */
+ secondary_align_ids, /* which id's */
+ ctx->spot_group, /* what read-group */
+ ctx->sec_cur_ids /* placement-context */
+ );
+ if ( rc2 != 0 )
+ {
+ LOGERR( klogInt, rc2, "ReferenceIteratorAddPlacements(sec) failed" );
+ }
+ }
+ }
+
+ if ( ctx->use_evidence_alignments )
+ {
+ if ( ctx->ev_cur == NULL )
+ {
+ rc3 = make_cursor_ids( ctx->data, &ctx->ev_cur_ids );
+ if ( rc3 != 0 )
+ {
+ LOGERR( klogInt, rc3, "cannot create cursor-ids for ev. alignment cursor" );
+ }
+ else
+ rc3 = prepare_evidence_cursor( ctx->db, &ctx->ev_cur, ctx->omit_qualities,
+ ctx->read_tlen, ctx->ev_cur_ids );
+ }
+
+ if ( rc3 == 0 )
+ {
+ /* show_placement_params( "evidende", ctx->refobj, start, end ); */
+ rc3 = ReferenceIteratorAddPlacements ( ctx->ref_iter, /* the outer ref-iter */
+ ctx->refobj, /* the ref-obj for this chromosome */
+ start - 1, /* start ( zero-based ) */
+ end - start + 1, /* length */
+ NULL, /* ref-cursor */
+ ctx->ev_cur, /* align-cursor */
+ evidence_align_ids, /* which id's */
+ ctx->spot_group, /* what read-group */
+ ctx->ev_cur_ids /* placement-context */
+ );
+ if ( rc3 != 0 )
+ {
+ LOGERR( klogInt, rc3, "ReferenceIteratorAddPlacements(evidence) failed" );
+ }
+ }
+ }
+
+ if ( rc1 == SILENT_RC( rcAlign, rcType, rcAccessing, rcRow, rcNotFound ) )
+ { /* from allocate_populate_rec */
+ rc = rc1;
+ }
+ else if ( rc1 == 0 )
+ rc = 0;
+ else if ( rc2 == 0 )
+ rc = 0;
+ else if ( rc3 == 0 )
+ rc = 0;
+ else
+ rc = rc1;
+ }
+ }
+ return rc;
+}
+
+
+typedef struct foreach_arg_ctx
+{
+ pileup_options *options;
+ const VDBManager *vdb_mgr;
+ VSchema *vdb_schema;
+ ReferenceIterator *ref_iter;
+ BSTree *ranges;
+ Vector *cursor_ids;
+} foreach_arg_ctx;
+
+
+/* called for each source-file/accession */
+static rc_t CC on_argument( const char * path, const char * spot_group, void * data )
+{
+ rc_t rc = 0;
+ foreach_arg_ctx * ctx = ( foreach_arg_ctx * )data;
+
+ int path_type = ( VDBManagerPathType ( ctx->vdb_mgr, "%s", path ) & ~ kptAlias );
+ if ( path_type != kptDatabase )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcItem, rcUnsupported );
+ PLOGERR( klogErr, ( klogErr, rc, "failed to open '$(path)', it is not a vdb-database", "path=%s", path ) );
+ }
+ else
+ {
+ const VDatabase *db;
+ rc = VDBManagerOpenDBRead ( ctx->vdb_mgr, &db, ctx->vdb_schema, "%s", path );
+ if ( rc != 0 )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcItem, rcUnsupported );
+ PLOGERR( klogErr, ( klogErr, rc, "failed to open '$(path)'", "path=%s", path ) );
+ }
+ else
+ {
+ bool is_csra = VDatabaseIsCSRA ( db );
+ VDatabaseRelease ( db );
+ if ( !is_csra )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcItem, rcUnsupported );
+ PLOGERR( klogErr, ( klogErr, rc, "failed to open '$(path)', it is not a csra-database", "path=%s", path ) );
+ }
+ else
+ {
+ prepare_ctx prep; /* from cmdline_cmn.h */
+
+ prep.omit_qualities = ctx->options->omit_qualities;
+ prep.read_tlen = ctx->options->read_tlen;
+ prep.use_primary_alignments = ( ( ctx->options->cmn.tab_select & primary_ats ) == primary_ats );
+ prep.use_secondary_alignments = ( ( ctx->options->cmn.tab_select & secondary_ats ) == secondary_ats );
+ prep.use_evidence_alignments = ( ( ctx->options->cmn.tab_select & evidence_ats ) == evidence_ats );
+ prep.ref_iter = ctx->ref_iter;
+ prep.spot_group = spot_group;
+ prep.on_section = prepare_section_cb;
+ prep.data = ctx->cursor_ids;
+ prep.path = path;
+ prep.db = NULL;
+ prep.prim_cur = NULL;
+ prep.sec_cur = NULL;
+ prep.ev_cur = NULL;
+
+ rc = prepare_ref_iter( &prep, ctx->vdb_mgr, ctx->vdb_schema, path, ctx->ranges ); /* cmdline_cmn.c */
+ if ( rc == 0 && prep.db == NULL )
+ {
+ rc = RC ( rcApp, rcNoTarg, rcOpening, rcSelf, rcInvalid );
+ LOGERR( klogInt, rc, "unsupported source" );
+ }
+ if ( prep.prim_cur != NULL ) VCursorRelease( prep.prim_cur );
+ if ( prep.sec_cur != NULL ) VCursorRelease( prep.sec_cur );
+ if ( prep.ev_cur != NULL ) VCursorRelease( prep.ev_cur );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* free all cursor-ids-blocks created in parallel with the alignment-cursor */
+static void CC cur_id_vector_entry_whack( void *item, void *data )
+{
+ pileup_col_ids * ids = item;
+ free( ids );
+}
+
+
+static rc_t pileup_main( Args * args, pileup_options *options )
+{
+ foreach_arg_ctx arg_ctx;
+ pileup_callback_data cb_data;
+ KDirectory * dir = NULL;
+ Vector cur_ids_vector;
+
+ /* (1) make the align-manager ( necessary to make a ReferenceIterator... ) */
+ rc_t rc = AlignMgrMakeRead ( &cb_data.almgr );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "AlignMgrMake() failed" );
+ }
+
+ VectorInit ( &cur_ids_vector, 0, 20 );
+ cb_data.options = options;
+ arg_ctx.options = options;
+ arg_ctx.vdb_schema = NULL;
+ arg_ctx.cursor_ids = &cur_ids_vector;
+
+ /* (2) make the reference-iterator */
+ if ( rc == 0 )
+ {
+ PlacementRecordExtendFuncs cb_block;
+
+ cb_block.data = &cb_data;
+ cb_block.destroy = NULL;
+ cb_block.populate = populate_tooldata;
+ cb_block.alloc_size = alloc_size;
+ cb_block.fixed_size = 0;
+
+ rc = AlignMgrMakeReferenceIterator ( cb_data.almgr, &arg_ctx.ref_iter, &cb_block, options->minmapq );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "AlignMgrMakeReferenceIterator() failed" );
+ }
+ }
+
+ /* (3) make a KDirectory ( necessary to make a vdb-manager ) */
+ if ( rc == 0 )
+ {
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ }
+
+ /* (4) make a vdb-manager */
+ if ( rc == 0 )
+ {
+ rc = VDBManagerMakeRead ( &arg_ctx.vdb_mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ }
+ else
+ {
+ ReportSetVDBManager( arg_ctx.vdb_mgr );
+ }
+ }
+
+
+ if ( rc == 0 && options->cmn.no_mt )
+ {
+ rc = VDBManagerDisablePagemapThread ( arg_ctx.vdb_mgr );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerDisablePagemapThread() failed" );
+ }
+ }
+
+ /* (5) make a vdb-schema */
+ if ( rc == 0 )
+ {
+ rc = VDBManagerMakeSRASchema( arg_ctx.vdb_mgr, &arg_ctx.vdb_schema );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerMakeSRASchema() failed" );
+ }
+ else if ( options->cmn.schema_file != NULL )
+ {
+ rc = VSchemaParseFile( arg_ctx.vdb_schema, "%s", options->cmn.schema_file );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VSchemaParseFile() failed" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ switch( options->function )
+ {
+ case sra_pileup_counters : options->omit_qualities = true;
+ options->read_tlen = false;
+ break;
+
+ case sra_pileup_stat : options->omit_qualities = true;
+ options->read_tlen = true;
+ break;
+
+ case sra_pileup_debug : options->omit_qualities = true;
+ options->read_tlen = true;
+ break;
+
+ case sra_pileup_samtools : options->read_tlen = false;
+ break;
+
+ case sra_pileup_mismatch : options->omit_qualities = true;
+ options->read_tlen = false;
+ break;
+
+ case sra_pileup_index : options->omit_qualities = true;
+ options->read_tlen = false;
+ break;
+
+ case sra_pileup_varcount : options->omit_qualities = true;
+ options->read_tlen = false;
+ break;
+ }
+ }
+
+ /* (5) loop through the given input-filenames and load the ref-iter with it's input */
+ if ( rc == 0 )
+ {
+ BSTree regions;
+ rc = init_ref_regions( ®ions, args ); /* cmdline_cmn.c */
+ if ( rc == 0 )
+ {
+ bool empty = false;
+
+ check_ref_regions( ®ions, options->merge_dist ); /* sanitize input, merge slices... */
+ options->skiplist = skiplist_make( ®ions ); /* create skiplist for neighboring slices */
+
+ arg_ctx.ranges = ®ions;
+ rc = foreach_argument( args, dir, options->div_by_spotgrp, &empty, on_argument, &arg_ctx ); /* cmdline_cmn.c */
+ if ( empty )
+ {
+ Usage ( args );
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcInsufficient );
+ }
+ free_ref_regions( ®ions );
+ }
+ }
+
+ /* (6) walk the "loaded" ref-iterator ===> perform the pileup */
+ if ( rc == 0 )
+ {
+ /* ============================================== */
+ switch( options->function )
+ {
+ case sra_pileup_stat : rc = walk_stat( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_counters : rc = walk_counters( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_debug : rc = walk_debug( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_mismatch : rc = walk_mismatches( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_index : rc = walk_index( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_varcount : rc = walk_varcount( arg_ctx.ref_iter, options ); break;
+ case sra_pileup_indels : rc = walk_indels( arg_ctx.ref_iter, options ); break;
+ default : rc = walk_ref_iter( arg_ctx.ref_iter, options ); break;
+ }
+ /* ============================================== */
+ }
+
+ if ( arg_ctx.vdb_mgr != NULL ) VDBManagerRelease( arg_ctx.vdb_mgr );
+ if ( arg_ctx.vdb_schema != NULL ) VSchemaRelease( arg_ctx.vdb_schema );
+ if ( dir != NULL ) KDirectoryRelease( dir );
+ if ( arg_ctx.ref_iter != NULL ) ReferenceIteratorRelease( arg_ctx.ref_iter );
+ if ( cb_data.almgr != NULL ) AlignMgrRelease ( cb_data.almgr );
+ VectorWhack ( &cur_ids_vector, cur_id_vector_entry_whack, NULL );
+
+ return rc;
+}
+
+
+/* =========================================================================================== */
+
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ rc_t rc = KOutHandlerSet( write_to_FILE, stdout );
+ ReportBuildDate( __DATE__ );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ else
+ {
+ Args * args;
+
+ /* KLogHandlerSetStdErr(); */
+ rc = ArgsMakeAndHandle( &args, argc, argv, 2,
+ MyOptions, sizeof MyOptions / sizeof MyOptions [ 0 ],
+ CommonOptions_ptr(), CommonOptions_count() );
+ if ( rc == 0 )
+ {
+ rc = parse_inf_file( args ); /* cmdline_cmn.h */
+ if ( rc == 0 )
+ {
+ pileup_options options;
+ rc = get_pileup_options( args, &options );
+ if ( rc == 0 )
+ {
+ out_redir redir; /* from out_redir.h */
+ enum out_redir_mode mode;
+
+ options.skiplist = NULL;
+
+ if ( options.cmn.gzip_output )
+ mode = orm_gzip;
+ else if ( options.cmn.bzip_output )
+ mode = orm_bzip2;
+ else
+ mode = orm_uncompressed;
+
+ rc = init_out_redir( &redir, mode, options.cmn.output_file, 32 * 1024 ); /* from out_redir.c */
+
+ /*
+ if ( options.cmn.output_file != NULL )
+ {
+ rc = set_stdout_to( options.cmn.gzip_output,
+ options.cmn.bzip_output,
+ options.cmn.output_file,
+ 32 * 1024 );
+ }
+ */
+
+ if ( rc == 0 )
+ {
+ if ( options.function == sra_pileup_report_ref ||
+ options.function == sra_pileup_report_ref_ext )
+ {
+ rc = report_on_reference( args, options.function == sra_pileup_report_ref_ext ); /* reref.c */
+ }
+ else if ( options.function == sra_pileup_deletes )
+ {
+ rc = report_deletes( args, 10 ); /* see above */
+ }
+ else if ( options.function == sra_pileup_test )
+ {
+ rc = pileup_v2( args, &options ); /* see above */
+ }
+ else
+ {
+ /* ============================== */
+ rc = pileup_main( args, &options );
+ /* ============================== */
+ }
+ }
+
+ /*
+ if ( options.cmn.output_file != NULL )
+ release_stdout_redirection();
+ */
+ release_out_redir( &redir ); /* from out_redir.c */
+
+ if ( options.skiplist != NULL )
+ skiplist_release( options.skiplist );
+ }
+ }
+ ArgsWhack( args );
+ }
+ }
+
+ {
+ /* Report execution environment if necessary */
+ rc_t rc2 = ReportFinalize( rc );
+ if ( rc == 0 )
+ rc = rc2;
+ }
+ return rc;
+}
diff --git a/tools/sra-pileup/walk_debug.c b/tools/sra-pileup/walk_debug.c
new file mode 100644
index 0000000..18d7ae7
--- /dev/null
+++ b/tools/sra-pileup/walk_debug.c
@@ -0,0 +1,147 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "ref_walker_0.h"
+#include "4na_ascii.h"
+
+#include <klib/out.h>
+#include <klib/printf.h>
+
+static rc_t CC walk_debug_enter_ref( walk_data * data )
+{ return KOutMsg( "ENTER REF '%s' ( start:%,u / len:%,u )\n", data->ref_name, data->ref_start, data->ref_len ); }
+
+static rc_t CC walk_debug_exit_ref( walk_data * data )
+{ return KOutMsg( "EXIT REF '%s' ( start: %,u / len:%,u )\n", data->ref_name, data->ref_start, data->ref_len ); }
+
+static rc_t CC walk_debug_enter_ref_window( walk_data * data )
+{ return KOutMsg( " ENTER REF-WINDOW ( start: %,u / len:%,u )\n", data->ref_window_start, data->ref_window_len ); }
+
+static rc_t CC walk_debug_exit_ref_window( walk_data * data )
+{ return KOutMsg( " EXIT REF-WINDOW ( start: %,u / len:%,u )\n", data->ref_window_start, data->ref_window_len ); }
+
+static rc_t CC walk_debug_enter_ref_pos( walk_data * data )
+{ return KOutMsg( " ENTER REF-POS ( %u / depth=%u / '%c' )\n", data->ref_pos, data->depth, _4na_to_ascii( data->ref_base, false ) ); }
+
+static rc_t CC walk_debug_exit_ref_pos( walk_data * data )
+{ return KOutMsg( " EXIT REF-POS ( %u / depth=%u / '%c' )\n", data->ref_pos, data->depth, _4na_to_ascii( data->ref_base, false ) ); }
+
+static rc_t CC walk_debug_enter_sg( walk_data * data )
+{ return KOutMsg( " ENTER SPOTGROUP '%s'\n", data->spotgroup ); }
+
+static rc_t CC walk_debug_exit_sg( walk_data * data )
+{ return KOutMsg( " EXIT SPOTGROUP '%s'\n", data->spotgroup ); }
+
+static rc_t CC walk_debug_placement( walk_data * data )
+{
+ int32_t state = data->state;
+ bool m = ( ( state & align_iter_match ) == align_iter_match );
+
+ rc_t rc = KOutMsg( " #%.08lu %c %c %c ",
+ data->rec->id,
+ ( data->xrec->reverse ? 'R' : 'F' ),
+ _4na_to_ascii( data->state, data->xrec->reverse ),
+ ( m ? 'M' : '!' ) );
+ if ( rc == 0 )
+ {
+ if ( ( state & align_iter_first ) == align_iter_first )
+ {
+ char c = data->rec->mapq + 33;
+ if ( c > '~' ) { c = '~'; }
+ if ( c < 33 ) { c = 33; }
+ rc = KOutMsg( "^%c ", c );
+ }
+ else if ( ( state & align_iter_last ) == align_iter_last )
+ {
+ rc = KOutMsg( "$ " );
+ }
+ }
+
+ if ( rc == 0 && ( ( state & align_iter_skip ) == align_iter_skip ) )
+ {
+ rc = KOutMsg( "%c ", ( data->xrec->reverse ? '<' : '>' ) );
+ }
+
+ if ( rc == 0 && ( ( state & align_iter_insert ) == align_iter_insert ) )
+ {
+ const INSDC_4na_bin *bases;
+ uint32_t i, n = ReferenceIteratorBasesInserted ( data -> ref_iter, &bases );
+ if ( bases != NULL )
+ {
+ char temp[ 4096 ];
+ if ( n > sizeof temp ) n = sizeof temp;
+ for ( i = 0; i < n; ++i ) temp[ i ] = _4na_to_ascii( bases[ i ], data->xrec->reverse );
+ rc = KOutMsg( "+%u{%.*s} ", n, n, temp );
+ }
+ }
+
+ if ( rc == 0 && ( ( state & align_iter_delete ) == align_iter_delete ) )
+ {
+ INSDC_coord_zero ref_pos;
+ const INSDC_4na_bin *bases;
+ uint32_t i, n = ReferenceIteratorBasesDeleted ( data -> ref_iter, &ref_pos, &bases );
+ if ( bases != NULL )
+ {
+ char temp[ 4096 ];
+ if ( n > sizeof temp ) n = sizeof temp;
+ for ( i = 0; i < n; ++i ) temp[ i ] = _4na_to_ascii( bases[ i ], data->xrec->reverse );
+ rc = KOutMsg( "-%u{%.*s} ", n, n, temp );
+ free( (void *) bases );
+ }
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg( "( TLEN %,i )\n", data->xrec->tlen );
+
+ return rc;
+}
+
+
+rc_t walk_debug( ReferenceIterator *ref_iter, pileup_options *options )
+{
+ rc_t rc;
+ walk_data data;
+ walk_funcs funcs;
+
+ data.ref_iter = ref_iter;
+ data.options = options;
+
+ funcs.on_enter_ref = walk_debug_enter_ref;
+ funcs.on_exit_ref = walk_debug_exit_ref;
+
+ funcs.on_enter_ref_window = walk_debug_enter_ref_window;
+ funcs.on_exit_ref_window = walk_debug_exit_ref_window;
+
+ funcs.on_enter_ref_pos = walk_debug_enter_ref_pos;
+ funcs.on_exit_ref_pos = walk_debug_exit_ref_pos;
+
+ funcs.on_enter_spotgroup = walk_debug_enter_sg;
+ funcs.on_exit_spotgroup = walk_debug_exit_sg;
+
+ funcs.on_placement = walk_debug_placement;
+
+ rc = walk_0( &data, &funcs );
+ return rc;
+}
diff --git a/tools/sra-pileup/walk_debug.h b/tools/sra-pileup/walk_debug.h
new file mode 100644
index 0000000..03fc1b0
--- /dev/null
+++ b/tools/sra-pileup/walk_debug.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_walk_debug_
+#define _h_walk_debug_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ref_walker_0.h"
+
+rc_t walk_debug( ReferenceIterator *ref_iter, pileup_options *options );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_walk_debug_ */
diff --git a/tools/sra-pileup/writer.c b/tools/sra-pileup/writer.c
new file mode 100644
index 0000000..b24c1d9
--- /dev/null
+++ b/tools/sra-pileup/writer.c
@@ -0,0 +1,137 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/report.h>
+#include <klib/container.h>
+#include <klib/log.h>
+#include <klib/debug.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/buffile.h>
+#include <kfs/gzip.h>
+#include <kfs/bzip.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include "cmdline_cmn.h"
+#include "writer.h"
+
+struct {
+ KWrtWriter writer;
+ void* data;
+ KFile* kfile;
+ uint64_t pos;
+} g_out_writer = {NULL};
+
+static
+rc_t CC BufferedWriter(void* self, const char* buffer, size_t bufsize, size_t* num_writ)
+{
+ rc_t rc = 0;
+
+ assert(buffer != NULL);
+ assert(num_writ != NULL);
+
+ do {
+ if( (rc = KFileWrite(g_out_writer.kfile, g_out_writer.pos, buffer, bufsize, num_writ)) == 0 ) {
+ buffer += *num_writ;
+ bufsize -= *num_writ;
+ g_out_writer.pos += *num_writ;
+ }
+ } while(rc == 0 && bufsize > 0);
+ return rc;
+}
+
+rc_t OUTSTR_(const char* buf, size_t buf_sz)
+{
+ size_t nm;
+ return BufferedWriter(NULL, buf, buf_sz, &nm);
+}
+
+rc_t BufferedWriterMake(const common_options* opt)
+{
+ rc_t rc = 0;
+
+ if( opt == NULL || (opt->gzip_output && opt->bzip_output) ) {
+ rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcInvalid);
+ } else if( g_out_writer.writer != NULL ) {
+ rc = RC(rcApp, rcFile, rcConstructing, rcParam, rcAmbiguous);
+ }
+ if( opt->output_file != NULL ) {
+ KDirectory *dir;
+ if( (rc = KDirectoryNativeDir(&dir)) == 0 ) {
+ rc = KDirectoryCreateFile(dir, &g_out_writer.kfile, false, 0664, kcmInit, "%s", opt->output_file);
+ KDirectoryRelease(dir);
+ }
+ } else {
+ KOutHandlerSetStdOut();
+ KStsHandlerSetStdErr();
+ KLogHandlerSetStdErr();
+ KDbgHandlerSetStdErr();
+ rc = KFileMakeStdOut(&g_out_writer.kfile);
+ }
+ if( rc == 0 ) {
+ g_out_writer.pos = 0;
+ if( opt->gzip_output ) {
+ KFile* gz;
+ if( (rc = KFileMakeGzipForWrite(&gz, g_out_writer.kfile)) == 0 ) {
+ KFileRelease(g_out_writer.kfile);
+ g_out_writer.kfile = gz;
+ }
+ } else if( opt->bzip_output ) {
+ KFile* bz;
+ if( (rc = KFileMakeBzip2ForWrite(&bz, g_out_writer.kfile)) == 0 ) {
+ KFileRelease(g_out_writer.kfile);
+ g_out_writer.kfile = bz;
+ }
+ }
+ if( rc == 0 ) {
+ KFile* buf;
+ if( (rc = KBufFileMakeWrite(&buf, g_out_writer.kfile, false, 128 * 1024)) == 0 ) {
+ KFileRelease(g_out_writer.kfile);
+ g_out_writer.kfile = buf;
+ g_out_writer.writer = KOutWriterGet();
+ g_out_writer.data = KOutDataGet();
+ rc = KOutHandlerSet(BufferedWriter, &g_out_writer);
+ }
+ }
+ }
+ return rc;
+}
+
+void BufferedWriterRelease( bool flush )
+{
+ if( flush ) {
+ /* avoid flushing buffered data after failure */
+ KFileRelease(g_out_writer.kfile);
+ }
+ if( g_out_writer.writer != NULL ) {
+ KOutHandlerSet(g_out_writer.writer, g_out_writer.data);
+ }
+ g_out_writer.writer = NULL;
+}
diff --git a/tools/sra-pileup/writer.h b/tools/sra-pileup/writer.h
new file mode 100644
index 0000000..9ef8a0c
--- /dev/null
+++ b/tools/sra-pileup/writer.h
@@ -0,0 +1,32 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include <klib/rc.h>
+
+rc_t BufferedWriterMake(const common_options* opt);
+
+void BufferedWriterRelease(bool flush);
+
+rc_t OUTSTR_(const char* buf, size_t buf_sz);
diff --git a/tools/sra-seq-count/Makefile b/tools/sra-seq-count/Makefile
new file mode 100644
index 0000000..bfb1d33
--- /dev/null
+++ b/tools/sra-seq-count/Makefile
@@ -0,0 +1,83 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-seq-count
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ sra-seq-count
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# Common dumper definitions
+#
+TOOL_LIBS = \
+ -skapp \
+ -stk-version \
+ -sncbi-ngs-c++ \
+ -sngs-c++ \
+ -sncbi-vdb-static
+
+#-------------------------------------------------------------------------------
+# fastq-dump
+#
+TOOL_SRC = \
+ main_fkt \
+ sra-seq-count
+
+INCDIRS += -I $(TOP)/ngs/ngs-c++
+
+TOOL_OBJ = \
+ $(addsuffix .$(OBJX),$(TOOL_SRC))
+
+$(BINDIR)/sra-seq-count: $(TOOL_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TOOL_LIBS)
diff --git a/tools/sra-seq-count/main_fkt.c b/tools/sra-seq-count/main_fkt.c
new file mode 100644
index 0000000..60d0720
--- /dev/null
+++ b/tools/sra-seq-count/main_fkt.c
@@ -0,0 +1,203 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "options.h"
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/text.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#define OPTION_ID_ATTR "id_attr"
+#define OPTION_FEATURE_TYPE "feature_type"
+#define OPTION_MODE "mode"
+
+#define ALIAS_ID_ATTR "i"
+#define ALIAS_FEATURE_TYPE "f"
+#define ALIAS_MODE "m"
+
+#define DEFAULT_ID_ATTR "gene_id"
+#define DEFAULT_FEATURE_TYPE "exon"
+
+static const char * id_attr_usage[] = { "id-attr (default gene_id)", NULL };
+static const char * feature_type_usage[] = { "feature-type (default exon)", NULL };
+static const char * mode_usage[] = { "output-mode (norm, debug)", NULL };
+
+OptDef sra_seq_count_options[] =
+{
+ { OPTION_ID_ATTR, ALIAS_ID_ATTR, NULL, id_attr_usage, 1, true, false },
+ { OPTION_FEATURE_TYPE, ALIAS_FEATURE_TYPE, NULL, feature_type_usage, 1, true, false },
+ { OPTION_MODE, ALIAS_MODE, NULL, mode_usage, 1, true, false }
+};
+
+const char UsageDefaultName[] = "sra-seq-count";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ( "\n"
+ "Usage:\n"
+ " %s <sra-accession> <gtf-file> [options]\n"
+ "\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+ HelpOptionLine ( ALIAS_ID_ATTR, OPTION_ID_ATTR, NULL, id_attr_usage );
+ HelpOptionLine ( ALIAS_FEATURE_TYPE, OPTION_FEATURE_TYPE, NULL, feature_type_usage );
+ HelpOptionLine ( ALIAS_MODE, OPTION_MODE, NULL, mode_usage );
+
+ KOutMsg ( "\n" );
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+static rc_t get_str_option( const Args * args, const char * option_name, const char ** dst, const char * default_value )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option_name, &count );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ rc = ArgsOptionValue( args, option_name, 0, (const void **)dst );
+ else
+ (*dst) = string_dup_measure ( default_value, NULL );
+ return rc;
+}
+
+
+static rc_t gather_options( const Args * args, struct sra_seq_count_options * options )
+{
+ rc_t rc;
+
+ memset ( options, 0, sizeof *options );
+ rc = get_str_option( args, OPTION_ID_ATTR, &options->id_attrib, DEFAULT_ID_ATTR );
+ if ( rc == 0 )
+ rc = get_str_option( args, OPTION_FEATURE_TYPE, &options->feature_type, DEFAULT_FEATURE_TYPE );
+ if ( rc == 0 )
+ {
+ const char * mode;
+ rc = get_str_option( args, OPTION_MODE, &mode, "norm" );
+ if ( rc == 0 )
+ {
+ if ( mode[ 0 ] == 'd' && mode[ 1 ] == 'e' && mode[ 2 ] == 'b' && mode[ 3 ] == 'u' &&
+ mode[ 4 ] == 'g' && mode[ 5 ] == 0 )
+ {
+ options -> output_mode = SSC_MODE_DEBUG;
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = ArgsParamCount( args, &count );
+ if ( rc == 0 )
+ {
+ if ( count == 2 )
+ {
+ rc = ArgsParamValue( args, 0, (const void **)&options->sra_accession );
+ if ( rc == 0 )
+ rc = ArgsParamValue( args, 1, (const void **)&options->gtf_file );
+ if ( rc == 0 )
+ options -> valid = true;
+ }
+ else
+ {
+ UsageSummary ( UsageDefaultName );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t report_options( const struct sra_seq_count_options * options )
+{
+ rc_t rc = KOutMsg( "accession : %s\n", options->sra_accession );
+ if ( rc == 0 )
+ rc = KOutMsg( "gtf-file : %s\n", options->gtf_file );
+ if ( rc == 0 )
+ rc = KOutMsg( "id-attr : %s\n", options->id_attrib );
+ if ( rc == 0 )
+ rc = KOutMsg( "feature-type : %s\n", options->feature_type );
+ if ( rc == 0 )
+ {
+ switch ( options->output_mode )
+ {
+ case SSC_MODE_NORMAL : rc = KOutMsg( "output-mode : mormal\n" ); break;
+ case SSC_MODE_DEBUG : rc = KOutMsg( "output-mode : debug\n" ); break;
+ default : rc = KOutMsg( "output-mode : unknown\n" ); break;
+ }
+ }
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ sra_seq_count_options,
+ ( sizeof sra_seq_count_options / sizeof sra_seq_count_options [ 0 ] ) );
+ if ( rc == 0 )
+ {
+ struct sra_seq_count_options options;
+ rc = gather_options( args, &options );
+ if ( rc == 0 && options.valid )
+ {
+ rc = report_options( &options );
+ if ( rc == 0 )
+ {
+ rc = matching( &options ); /* here we are calling into C++ */
+ }
+ }
+ ArgsWhack ( args );
+ }
+ return rc;
+}
diff --git a/tools/sra-seq-count/options.h b/tools/sra-seq-count/options.h
new file mode 100644
index 0000000..95d4c57
--- /dev/null
+++ b/tools/sra-seq-count/options.h
@@ -0,0 +1,56 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_sra_seq_count_options_
+#define _h_sra_seq_count_options_
+
+#include <os-native.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SSC_MODE_NORMAL 0
+#define SSC_MODE_DEBUG 1
+
+struct sra_seq_count_options
+{
+ const char * sra_accession;
+ const char * gtf_file;
+ const char * id_attrib;
+ const char * feature_type;
+ int output_mode;
+ bool valid;
+};
+
+int matching( const struct sra_seq_count_options * options );
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/tools/sra-seq-count/range.hpp b/tools/sra-seq-count/range.hpp
new file mode 100644
index 0000000..c91498b
--- /dev/null
+++ b/tools/sra-seq-count/range.hpp
@@ -0,0 +1,307 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _hpp_seq_ranges_
+#define _hpp_seq_ranges_
+
+#include <list>
+
+namespace seq_ranges {
+
+enum e_range_relation {
+ rr_before,
+ rr_begin,
+ rr_span,
+ rr_inside,
+ rr_end,
+ rr_after
+};
+
+
+/* -----------------------------------------------------------------------
+ range-relations:
+
+ A |-------------|
+ B |-----|
+ A.range_rel( B ) = rr_before
+
+ A |-------------|
+ B |-----|
+ A.range_rel( B ) = rr_begin
+
+ A |-------------|
+ B |-------------------|
+ A.range_rel( B ) = rr_span
+
+ A |-------------|
+ B |-----|
+ A.range_rel( B ) = rr_inside
+
+ A |-------------|
+ B |-----|
+ A.range_rel( B ) = rr_end
+
+ A |-------------|
+ B |-----|
+ A.range_rel( B ) = rr_after
+
+ ----------------------------------------------------------------------- */
+
+class range
+{
+ private :
+ long start;
+ long end;
+
+ public :
+ range( void ) : start( 0 ), end( 0 ) { }
+ range( long start_, long end_ ) : start( start_ ), end( end_ ) { }
+ range( const range &other ) : start( other.start ), end( other.end ) { }
+
+ range( const std::string &start_, const std::string &end_ ) : start( 0 ), end( 0 )
+ {
+ bool valid = ( convert_value( start_, start ) && convert_value( end_, end ) );
+ if ( !valid ) set( 0, 0 );
+ }
+
+ range& operator= ( const range &other )
+ {
+ if ( this == &other ) return *this;
+ start = other.start;
+ end = other.end;
+ return *this;
+ }
+
+ void set( long start_, long end_ ) { start = start_; end = end_; }
+
+ static bool convert_value( const std::string value_, long &value )
+ {
+ bool res = true;
+ std::istringstream ( value_ ) >> value;
+ if ( value < 1 )
+ res = false;
+ return res;
+ }
+
+ /* does this range end before the other range starts ? */
+ bool ends_before( const range &other ) const { return ( end < other.start ); }
+
+ /* does this range start after the other range ends ? */
+ bool starts_after( const range &other ) const { return ( start > other.end ); }
+
+ bool intersect( const range &other ) const
+ {
+ e_range_relation rr = range_relation( other );
+ return ( rr == rr_begin || rr == rr_span || rr == rr_inside || rr == rr_end );
+ }
+
+ bool intersect( const long value ) const
+ { return ( value >= start && value <= end ); }
+
+ void include( const range &other )
+ {
+ if ( other.start < start ) start = other.start;
+ if ( other.end > end ) end = other.end;
+ }
+
+ bool merge( const range &other )
+ {
+ bool res = intersect( other );
+ if ( res ) include( other );
+ return res;
+ }
+
+ enum e_range_relation range_relation( const range &other ) const
+ {
+ enum e_range_relation res;
+ if ( other.start < start )
+ {
+ if ( other.end < start )
+ res = rr_before;
+ else if ( other.end <= end )
+ res = rr_begin;
+ else
+ res = rr_span;
+ }
+ else
+ {
+ if ( other.start <= end )
+ {
+ if ( other.end <= end )
+ res = rr_inside;
+ else
+ res = rr_end;
+ }
+ else
+ res = rr_after;
+ }
+
+ return res;
+ }
+
+ long get_start( void ) const { return start; }
+ long get_end( void ) const { return end; }
+ bool empty( void ) const { return ( start == 0 && end == 0 ); }
+
+ void print( std::ostream &stream ) const { stream << "[ " << start << " .. " << end << " ]"; }
+
+ friend std::ostream& operator<< ( std::ostream &stream, const range &other )
+ {
+ other.print( stream );
+ return stream;
+ }
+
+ static std::string range_relation_2_str( enum e_range_relation rr )
+ {
+ switch ( rr )
+ {
+ case rr_before : return std::string( "before" ); break;
+ case rr_begin : return std::string( "begin" ); break;
+ case rr_span : return std::string( "span" ); break;
+ case rr_inside : return std::string( "inside" ); break;
+ case rr_end : return std::string( "end" ); break;
+ case rr_after : return std::string( "after" ); break;
+ }
+ return std::string( "unknown" );
+ }
+
+};
+
+
+bool compare_ranges ( const range * first, const range * second )
+{
+ return ( first -> get_start() < second -> get_start() );
+}
+
+
+struct ranges_relation
+{
+ bool has_inside;
+ bool has_partial;
+
+ void clear( void ) { has_inside = has_partial = false; }
+
+ void print( std::ostream &stream ) const { stream << "inside: " << has_inside << ", partial: " << has_partial; }
+
+ friend std::ostream& operator<< ( std::ostream &stream, const ranges_relation &other )
+ {
+ other.print( stream );
+ return stream;
+ }
+};
+
+
+class ranges
+{
+ private :
+ std::list< range * > range_list;
+ long count;
+
+ public :
+ ranges( void ) : count( 0 ) {}
+ ~ranges( void ) { clear(); }
+
+ void clear( void )
+ {
+ while ( !range_list.empty() )
+ {
+ range * r = range_list.front();
+ range_list.pop_front();
+ if ( r != NULL ) delete r;
+ }
+ count = 0;
+ }
+
+ void add( range * r ){ if ( r != NULL ) { range_list.push_back( r ); count++; } }
+ void add( const range &r ){ add( new range( r ) ); }
+
+ void merge( const range &r1 )
+ {
+ bool merged = false;
+ std::list< range * >::iterator it;
+ for ( it = range_list.begin(); it != range_list.end() && !merged; ++it )
+ {
+ range * r = *it;
+ if ( r != NULL )
+ merged = r -> merge( r1 );
+ }
+ if ( !merged ) add( r1 );
+ }
+
+ void sort( void ) { range_list.sort( compare_ranges ); }
+ long get_count( void ) { return count; }
+
+ void compare_sample( const ranges &sample, ranges_relation &res ) const
+ {
+ res.clear();
+ bool done = false;
+
+ // we take each range of the sample and compare it against each range of self
+ std::list< range * >::const_iterator sample_it;
+ for ( sample_it = sample.range_list.begin(); sample_it != sample.range_list.end() && !done; ++sample_it )
+ {
+ const range * sample_range = *sample_it;
+ std::list< range * >::const_iterator pattern_it;
+ for ( pattern_it = range_list.begin(); pattern_it != range_list.end() && !done; ++pattern_it )
+ {
+ const range * pattern_range( *pattern_it );
+ enum e_range_relation rr = pattern_range -> range_relation( *sample_range );
+ switch( rr )
+ {
+ case rr_before : break;
+ case rr_begin : res.has_partial = true; break;
+ case rr_span : res.has_partial = true; break;
+ case rr_inside : res.has_inside = true; break;
+ case rr_end : res.has_partial = true; break;
+ case rr_after : break;
+ }
+ done = ( res.has_partial && res.has_inside );
+ }
+ }
+ }
+
+ void print( std::ostream &stream ) const
+ {
+ std::list< range * >::const_iterator it;
+ for ( it = range_list.begin(); it != range_list.end(); ++it )
+ {
+ range * r = *it;
+ if ( r != NULL ) stream << *r << " ";
+ }
+ }
+
+ friend std::ostream& operator<< ( std::ostream &stream, const ranges &other )
+ {
+ other.print( stream );
+ return stream;
+ }
+
+};
+
+}; // namespace seq_ranges
+
+#endif // _hpp_seq_ranges_
+
diff --git a/tools/sra-seq-count/sra-seq-count.cpp b/tools/sra-seq-count/sra-seq-count.cpp
new file mode 100644
index 0000000..ccf1faa
--- /dev/null
+++ b/tools/sra-seq-count/sra-seq-count.cpp
@@ -0,0 +1,688 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <ngs/ncbi/NGS.hpp>
+#include <ngs/ErrorMsg.hpp>
+#include <ngs/ReadCollection.hpp>
+#include <ngs/AlignmentIterator.hpp>
+#include <ngs/Alignment.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <stdexcept>
+#include <vector>
+#include <list>
+#include <algorithm>
+
+#include "options.h"
+#include "range.hpp"
+
+using namespace seq_ranges;
+
+
+struct feature_range
+{
+ const std::string ref_name;
+ const std::string feature_id;
+ const char strand;
+ range ft_range;
+
+ feature_range( const std::string &ref_name_, const std::string &feature_id_,
+ const long start_, const long end_, const char strand_ )
+ : ref_name( ref_name_ ), feature_id( feature_id_ ), strand( strand_ ), ft_range( start_, end_ )
+ { }
+};
+
+
+class feature
+{
+ private :
+ const std::string ref_name;
+ const std::string feature_id;
+ const char strand;
+ ranges feature_ranges;
+ range outer;
+ long counter;
+
+ public :
+ feature( const feature_range &fr ) : ref_name( fr.ref_name ), feature_id( fr.feature_id ),
+ strand( fr.strand ), outer( fr.ft_range ), counter( 0 )
+ {
+ feature_ranges.add( fr.ft_range );
+ }
+
+ bool add( const feature_range &fr )
+ {
+ bool res = ( feature_id == fr.feature_id );
+ if ( res )
+ {
+ feature_ranges.merge( fr.ft_range );
+ outer.include( fr.ft_range );
+ }
+ return res;
+ }
+
+ void debug_report ( void )
+ {
+ std::cout << "FEATURE: " << feature_id << " ( refname: " << ref_name << " ) strand = '" << strand << "' " << outer << std::endl;
+ std::cout << feature_ranges << std::endl;
+ std::cout << "counter : " << counter << std::endl;
+ std::cout << std::endl;
+ }
+
+ void report ( int output_mode )
+ {
+ if ( counter > 0 )
+ {
+ if ( output_mode == SSC_MODE_NORMAL )
+ {
+ std::cout << feature_id << "\t" << counter << std::endl;
+ }
+ else
+ {
+ std::cout << ref_name << "." << outer << "(" << feature_ranges.get_count() << ") "
+ << feature_id << "\t" << counter << std::endl;
+ }
+ }
+ }
+
+ void sort_ranges( void ) { feature_ranges.sort(); }
+ void get_ref_name( std::string &s ) { s = ref_name; }
+ void get_outer_range( range &r ) { r = outer; }
+
+ /* does this feature end before the given range */
+ bool ends_before( const range &r ) const { return outer.ends_before( r ); }
+ bool is_ref( const std::string &r_name ) { return ( ref_name == r_name ); }
+ long start( void ) { return outer.get_start(); }
+
+ void check( const range &r ) { if ( outer.intersect( r ) ) counter++; }
+};
+
+
+void trim( std::string &s )
+{
+ bool to_trim = false;
+ std::size_t pos = 0;
+ std::size_t len = s.length();
+ while ( s[ pos ] == ' ' && len > 0 )
+ {
+ pos++;
+ len--;
+ to_trim = true;
+ }
+ while ( s[ pos + len - 1 ] == ' ' )
+ {
+ len--;
+ to_trim = true;
+ }
+ if ( to_trim )
+ s = s.substr( pos, len );
+}
+
+
+void split_attr( const std::string &attr, const std::string &idattr, std::string &feature_id )
+{
+ std::size_t from = 0;
+ std::size_t pos = 0;
+ bool done = false;
+ feature_id.clear();
+ while ( !done )
+ {
+ pos = attr.find( ";", from );
+ done = ( pos == std::string::npos );
+ std::string sub_attr = attr.substr( from, pos - from );
+ std::size_t sub_pos = sub_attr.find( "\"" );
+ if ( sub_pos != std::string::npos )
+ {
+ std::string sub_name = sub_attr.substr( 0, sub_pos - 1 );
+ trim( sub_name );
+ if ( sub_name == idattr )
+ {
+ feature_id = sub_attr.substr( sub_pos + 1, sub_attr.length() - ( sub_pos + 2 ) );
+ done = true;
+ }
+ }
+ if ( !done ) from = pos + 1;
+ }
+}
+
+
+bool split_line( const std::string &line, const std::string feature_type, const std::string &idattr,
+ std::string &ref_name, std::string &feature_id,
+ long &start, long &end, char &strand )
+{
+ bool res = ( ( line.length() > 0 )&&( line[ 0 ] != '#' ) );
+ if ( res )
+ {
+ int field = 0;
+ std::string attr;
+ std::size_t from = 0;
+ std::size_t pos = 0;
+ start = end = 0;
+ long value;
+ bool done = false;
+ while ( !done )
+ {
+ pos = line.find( "\t", from );
+ done = ( pos == std::string::npos );
+ switch( field++ )
+ {
+ case 0 : ref_name = line.substr( from, pos - from ); break;
+ case 2 : if ( feature_type != line.substr( from, pos - from ) )
+ {
+ done = true;
+ res = false;
+ }
+ break;
+ case 3 : if ( range::convert_value( line.substr( from, pos - from ), value ) ) start = value; break;
+ case 4 : if ( range::convert_value( line.substr( from, pos - from ), value ) ) end = value; break;
+ case 6 : if ( ( pos - from ) > 0 ) strand = line[ from ]; else strand = '?'; break;
+ case 8 : attr = line.substr( from, pos - from ); break;
+ }
+ if ( !done ) from = pos + 1;
+ }
+
+ if ( res ) split_attr( attr, idattr, feature_id );
+ }
+ return res;
+}
+
+
+class gtf_iter
+{
+ private :
+ const std::string filename;
+ const std::string idattr;
+ const std::string feature_type;
+ feature_range * stored_feature_range;
+ feature * stored_next_feature;
+ std::ifstream inputstream;
+
+ feature_range * read_next_feature_range( void )
+ {
+ feature_range * res = NULL;
+ if ( inputstream.good() )
+ {
+ std::string line;
+ if ( std::getline( inputstream, line ) )
+ {
+ std::string ref_name, feature_id;
+ long start, end;
+ char strand;
+ if ( split_line( line, feature_type, idattr,
+ ref_name, feature_id, start, end, strand ) )
+ {
+ res = new feature_range( ref_name, feature_id, start, end, strand );
+ }
+ }
+ }
+ return res;
+ }
+
+ feature_range * next_feature_range( void )
+ {
+ feature_range * res = NULL;
+ if ( stored_feature_range != NULL )
+ {
+ res = stored_feature_range;
+ stored_feature_range = NULL;
+ }
+ else while ( inputstream.good() && res == NULL )
+ {
+ /* because read_next_feature_range can return NULL if the line contains the wrong feature_type */
+ res = read_next_feature_range();
+ }
+ return res;
+ }
+
+ feature * read_next_feature( void )
+ {
+ feature * res = NULL;
+ feature_range * fr = next_feature_range();
+ if ( fr != NULL )
+ {
+ res = new feature( *fr );
+ delete fr;
+ bool done = ( res == NULL );
+ while ( !done )
+ {
+ fr = next_feature_range();
+ done = ( fr == NULL );
+ if ( !done )
+ {
+ done = !( res -> add( *fr ) );
+ if ( done )
+ stored_feature_range = fr;
+ else
+ delete fr;
+ }
+ }
+ if ( done ) res->sort_ranges();
+ }
+ return res;
+ }
+
+ public :
+ gtf_iter( const char * filename_, const std::string &idattr_, const std::string &feature_type_ ) :
+ filename( filename_ ), idattr( idattr_ ), feature_type( feature_type_ ),
+ stored_feature_range( NULL ), inputstream( filename_ )
+ {
+ stored_next_feature = read_next_feature();
+ }
+
+ bool good( void ) { return ( stored_next_feature != NULL ); }
+
+ feature * next_feature( void )
+ {
+ feature * res = stored_next_feature;
+ if ( res != NULL )
+ stored_next_feature = read_next_feature();
+ return res;
+ }
+
+ feature * forward_to_next_ref( const std::string & ref )
+ {
+ feature * res = NULL;
+ bool done = false;
+ while ( !done )
+ {
+ res = next_feature();
+ done = ( res == NULL );
+ if ( !done )
+ {
+ if ( res -> is_ref( ref ) )
+ delete res;
+ else
+ done = true;
+ }
+ }
+ return res;
+ }
+
+ long peek_next_feature_start( void )
+ {
+ if ( stored_next_feature != NULL )
+ return stored_next_feature -> start();
+ else
+ return 0;
+ }
+
+ bool peek_next_feature_range( range &r )
+ {
+ bool res = ( stored_next_feature != NULL );
+ if ( res ) stored_next_feature -> get_outer_range( r );
+ return res;
+ }
+
+ bool peek_next_feature_is_ref( const std::string &ref_name )
+ {
+ if ( stored_next_feature != NULL )
+ return stored_next_feature -> is_ref( ref_name );
+ else
+ return false;
+ }
+};
+
+
+class global_counter
+{
+ private:
+ long refs;
+ long total_alignments;
+ long no_feature;
+ long ambiguous;
+ long too_low_qual;
+ long not_aligned;
+ long not_unique;
+
+ public:
+ global_counter( void ) : refs( 0 ), total_alignments( 0 ), no_feature( 0 ), ambiguous( 0 ),
+ too_low_qual( 0 ), not_aligned( 0 ), not_unique( 0 ) {}
+
+ void inc_refs( void ) { refs++; }
+ void inc_total_alignments( void ) { total_alignments++; }
+ void inc_no_feature( void ) { no_feature++; }
+ void inc_ambiguous( void ) { ambiguous++; }
+ void inc_too_low_qual( void ) { too_low_qual++; }
+ void inc_not_aligned( void ) { not_aligned++; }
+ void inc_not_unique( void ) { not_unique++; }
+
+ void report( void )
+ {
+ std::cout << std::endl;
+ std::cout << "__no_feature\t" << no_feature << std::endl;
+ std::cout << "__ambiguous\t" << ambiguous << std::endl;
+ std::cout << "__too_low_aQual\t" << too_low_qual << std::endl;
+ std::cout << "__not_aligned\t" << not_aligned << std::endl;
+ std::cout << "__alignment_not_unique\t" << not_unique << std::endl;
+
+ std::cout << std::endl << "total\t" << total_alignments << std::endl;
+ std::cout << "refs\t" << refs << std::endl << std::endl;
+ }
+};
+
+
+class feature_list
+{
+ private :
+ const std::string &ref_name;
+ int output_mode;
+ std::list< feature * > flist;
+
+ void clear( void )
+ {
+ while ( !flist.empty() )
+ {
+ feature * f = flist.front();
+ flist.pop_front();
+ if ( f != NULL ) delete f;
+ }
+ }
+
+ void add( feature * f )
+ {
+ flist.push_back( f );
+ }
+
+ public :
+ feature_list( const std::string &ref_name_, int output_mode_, feature * f )
+ : ref_name( ref_name_ ), output_mode( output_mode_ ) { add( f ); }
+ ~feature_list( void ) { clear(); }
+
+ bool empty( void ) { return flist.empty(); }
+
+ void remove_all_features_before( const range &al_range )
+ {
+ bool done = flist.empty();
+ while ( !done )
+ {
+ feature * f = flist.front();
+ if ( f -> ends_before( al_range ) )
+ {
+ flist.pop_front();
+ f -> report( output_mode );
+ done = flist.empty();
+ delete f;
+ }
+ else
+ done = true;
+ }
+ }
+
+ void load_all_features_starting_inside( const range &al_range, gtf_iter >f_it )
+ {
+ bool done = false;
+ while ( !done )
+ {
+ done = !gtf_it.peek_next_feature_is_ref( ref_name );
+ if ( !done )
+ {
+ range r;
+ done = !gtf_it.peek_next_feature_range( r );
+ if ( !done )
+ {
+ if ( r.ends_before( al_range ) )
+ {
+ /* we can skip this feature! */
+ feature * f = gtf_it.next_feature();
+ delete f;
+ }
+ else if ( r.starts_after( al_range ) )
+ {
+ /* we are done, this feature if for alignments that come later */
+ done = true;
+ }
+ else
+ {
+ feature * f = gtf_it.next_feature();
+ if ( f != NULL ) add( f );
+ }
+ }
+ }
+ }
+ }
+
+ void count_matches_between_alignment_and_features( const range &al_range )
+ {
+ std::list< feature * >::iterator it;
+ for ( it = flist.begin(); it != flist.end(); ++it )
+ {
+ feature * f = *it;
+ if ( f != NULL )
+ {
+ f -> check( al_range );
+ }
+ }
+ }
+};
+
+
+class iter_window
+{
+ private :
+ ngs::ReadCollection &run;
+ gtf_iter >f_it;
+ int output_mode;
+ global_counter counter;
+
+ public :
+ iter_window( ngs::ReadCollection &run_, gtf_iter >f_it_, int output_mode_ )
+ : run( run_ ), gtf_it( gtf_it_ ), output_mode( output_mode_ ) {}
+
+ void walk( void )
+ {
+ feature * f = gtf_it.next_feature();
+ while ( f != NULL )
+ {
+ /* get the name of the reference of the fist feature in here... */
+ std::string ref_name;
+ f -> get_ref_name( ref_name );
+ try
+ {
+ ngs::Reference ref = run.getReference ( ref_name );
+ try
+ {
+ bool done = false;
+ feature_list flist( ref_name, output_mode, f );
+ ngs::AlignmentIterator al_iter = ref.getAlignments( ngs::Alignment::primaryAlignment );
+
+ std::cout << std::endl << "processing ref: " << ref_name << std::endl;
+ std::cout << "-------------------------------------------" << std::endl;
+ counter.inc_refs();
+
+ /* now walk all alignments of this al_iter */
+ while ( al_iter.nextAlignment() && !done )
+ {
+ int64_t pos = al_iter.getAlignmentPosition() + 1; /* al_iter returns 0-based ! */
+ uint64_t len = al_iter.getAlignmentLength();
+
+ const range al_range( pos, pos + len - 1 );
+
+ /* remove and report all features that end before this alignment */
+ flist.remove_all_features_before( al_range );
+ flist.load_all_features_starting_inside( al_range, gtf_it );
+
+ /* now we can count matches between the feature-list and this alignment */
+ flist.count_matches_between_alignment_and_features( al_range );
+
+ /* look if we have to cancel the loop if the feature-list is empty
+ and we have no more features in this reference */
+ if ( flist.empty() )
+ {
+ done = ( gtf_it.peek_next_feature_start() == 0 );
+ if ( !done )
+ done = !gtf_it.peek_next_feature_is_ref( ref_name );
+ }
+ counter.inc_total_alignments();
+ }
+ f = gtf_it.forward_to_next_ref( ref_name );
+ }
+ catch ( ngs::ErrorMsg e )
+ {
+ std::cout << "error in ref " << ref_name << " : " << e.what() << std::endl;
+ f = NULL;
+ }
+ }
+ catch ( ngs::ErrorMsg e )
+ {
+ f = gtf_it.forward_to_next_ref( ref_name );
+ }
+
+ }
+ counter.report();
+ }
+};
+
+
+int matching( const struct sra_seq_count_options * options )
+{
+ int res = 0;
+
+ std::string id_attr( options->id_attrib );
+ std::string feature_type( options->feature_type );
+
+ /* create the ngs-iterator, which delivers references and alignments */
+ try
+ {
+ ngs::ReadCollection run ( ncbi::NGS::openReadCollection( options->sra_accession ) );
+
+ /* create the gtf-iterator, which delivers gtf-features */
+ gtf_iter gtf_it( options->gtf_file, id_attr, feature_type );
+
+ /* create a iterator window that walks both iterators to count alignments for the features */
+ iter_window window( run, gtf_it, options->output_mode );
+
+ /* walk the window... */
+ window.walk();
+ }
+ catch ( ngs::ErrorMsg e )
+ {
+ std::cout << "cannot open " << options->sra_accession << " because " << e.what() << std::endl;
+ }
+ return res;
+}
+
+
+int list_refs_in_gtf( const char * gtf )
+{
+ int res = 0;
+ long feature_count = 0;
+ long feature_ref_count = 0;
+ std::string ref_name;
+ std::string id_attr( "gene_id" );
+ std::string feature_type( "exon" );
+
+ /* create the gtf-iterator, which delivers gtf-features */
+ gtf_iter gtf_it( gtf, id_attr, feature_type );
+
+ feature * f = gtf_it.next_feature();
+ while ( f != NULL )
+ {
+ /* count feature */
+ feature_count ++;
+
+ if ( f -> is_ref( ref_name ) )
+ {
+ feature_ref_count++;
+ }
+ else
+ {
+ if ( feature_ref_count > 0 )
+ {
+ std::cout << ref_name << "\t" << feature_ref_count << std::endl;
+ feature_ref_count = 0;
+ }
+ f -> get_ref_name( ref_name );
+ }
+
+ /* dispose feature */
+ delete f;
+ f = gtf_it.next_feature();
+ }
+ std::cout << feature_count << " features" << std::endl;
+
+ return res;
+}
+
+
+void print_rr( const range &A, const range &B )
+{
+ std::cout << A << " --- " << B << " : " << range::range_relation_2_str( A.range_relation( B ) ) << std::endl;
+}
+
+void rr_test( void )
+{
+ /*
+ print_rr( range( 10, 20 ), range( 5, 7 ) );
+ print_rr( range( 10, 20 ), range( 5, 10 ) );
+
+ print_rr( range( 10, 20 ), range( 5, 12 ) );
+ print_rr( range( 10, 20 ), range( 5, 20 ) );
+
+ print_rr( range( 10, 20 ), range( 5, 22 ) );
+
+ print_rr( range( 10, 20 ), range( 10, 20 ) );
+ print_rr( range( 10, 20 ), range( 5, 25 ) );
+
+ print_rr( range( 10, 20 ), range( 15, 25 ) );
+ print_rr( range( 10, 20 ), range( 20, 25 ) );
+
+ print_rr( range( 10, 20 ), range( 25, 35 ) );
+ */
+
+ ranges rl;
+ rl.add( range( 10, 20 ) );
+ rl.add( range( 70, 80 ) );
+ rl.add( range( 30, 40 ) );
+ rl.add( range( 50, 60 ) );
+ rl.merge( range( 18, 22 ) );
+
+ rl.sort();
+
+ std::cout << rl << std::endl;
+}
+
+/*
+int main( int argc, const char* argv[] )
+{
+ int res = 0;
+ if ( argc < 3 )
+ {
+ std::cout << "\nusage : gene_count sra_accession genes.gtf\n";
+ res = -1;
+ }
+ else
+ {
+ matching( argv[ 1 ], argv[ 2 ] );
+ // list_refs_in_gtf( argv[ 2 ] );
+ // rr_test();
+ }
+
+ return res;
+}
+*/
diff --git a/tools/sra-shell/Makefile b/tools/sra-shell/Makefile
new file mode 100644
index 0000000..a3f9d33
--- /dev/null
+++ b/tools/sra-shell/Makefile
@@ -0,0 +1,58 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-shell
+
+include $(TOP)/build/Makefile.shell
+
+
+#-------------------------------------------------------------------------------
+# default
+#
+SUBDIRS = \
+ parser \
+ job-exec \
+ sra-shell \
+ turboVision \
+ guilib \
+ sra-gui
+
+
+# common targets for non-leaf Makefiles; must follow a definition of SUBDIRS
+include $(TOP)/build/Makefile.targets
+
+$(SUBDIRS):
+ @ $(MAKE) -C $@
+
+.PHONY: default $(SUBDIRS)
+
+#-------------------------------------------------------------------------------
+# pass-through
+#
+out debug profile release GCC ICC VC++:
+ @ $(MAKE) TOP=$(TOP) -f $(TOP)/build/Makefile.env $@
+
+.PHONY: out debug profile release GCC ICC VC++
diff --git a/tools/sra-shell/guilib/Makefile b/tools/sra-shell/guilib/Makefile
new file mode 100644
index 0000000..6910c3d
--- /dev/null
+++ b/tools/sra-shell/guilib/Makefile
@@ -0,0 +1,71 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/guilib
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+ guilib
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(INT_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# guilib
+#
+
+GUILIB_SRC = \
+
+GUILIB_OBJ = \
+ $(addsuffix .$(OBJX),$(GUILIB_SRC))
+
+$(ILIBDIR)/guilib: $(GUILIB_OBJ)
+ $(LP) --slib -o $@ $^
diff --git a/tools/sra-shell/job-exec/Makefile b/tools/sra-shell/job-exec/Makefile
new file mode 100644
index 0000000..5b900d8
--- /dev/null
+++ b/tools/sra-shell/job-exec/Makefile
@@ -0,0 +1,71 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/job-exec
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+ job-exec
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(INT_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# job-exec
+#
+
+JOB_EXEC_SRC = \
+
+JOB_EXEC_OBJ = \
+ $(addsuffix .$(OBJX),$(JOB_EXEC_SRC))
+
+$(ILIBDIR)/job-exec: $(JOB_EXEC_OBJ)
+ $(LP) --slib -o $@ $^
diff --git a/tools/sra-shell/parser/Makefile b/tools/sra-shell/parser/Makefile
new file mode 100644
index 0000000..741d0f1
--- /dev/null
+++ b/tools/sra-shell/parser/Makefile
@@ -0,0 +1,71 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/parser
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+ sra-shell-parser
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(INT_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra-shell-parser
+#
+
+PARSER_SRC = \
+
+PARSER_OBJ = \
+ $(addsuffix .$(OBJX),$(PARSER_SRC))
+
+$(ILIBDIR)/sra-shell-parser: $(PARSER_OBJ)
+ $(LP) --slib -o $@ $^
diff --git a/tools/sra-shell/parser/sra-shell-lex.l b/tools/sra-shell/parser/sra-shell-lex.l
new file mode 100644
index 0000000..a2f883f
--- /dev/null
+++ b/tools/sra-shell/parser/sra-shell-lex.l
@@ -0,0 +1,103 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include "sra-shell-parse.h"
+ #include "sra-shell-tokens.h"
+
+ #define YYSTYPE SRAShellToken
+
+ /* code to populate token with internal values */
+ #define YY_USER_ACTION \
+ yylval -> tokenText = yytext; \
+ yylval -> tokenLength = yyleng; \
+ yylval -> line_no = yylineno; \
+ yylval -> column_no = yyextra -> column; \
+ yyextra -> column += yyleng; \
+ yyextra -> length += yyleng; \
+ yyextra -> lastToken = yylval;
+
+ #define ENDLINE \
+ yyextra -> column=1;\
+ return shENDLINE;
+
+ #define YY_INPUT(buf, result, max_size) \
+ result = yyextra->input(yyextra, buf, max_size)
+
+ #define ECHO
+
+ static void SRAShell_fatal_error(yyconst char* msg);
+ #define YY_FATAL_ERROR(msg) SRAShell_fatal_error(msg)
+
+%}
+
+%option never-interactive nounistd yylineno reentrant bison-bridge stack noyywrap
+
+%option prefix="SRAShell"
+%option extra-type="SRAShellParseBlock*"
+
+ /*%option debug*/
+
+ws [ \t]+
+digits [0-9]+
+alphanum [A-Za-z0-9\-_]+
+eol (\r\n|\r|\n)
+
+%%
+
+. { return yytext[0]; }
+
+{eol} { ENDLINE; }
+
+%%
+
+rc_t CC SRAShellScan_yylex_init(SRAShellParseBlock* sb, bool debug)
+{
+ if (yylex_init_extra(sb, &sb->scanner) != 0)
+ {
+ return RC ( rcApp, rcFile, rcParsing, rcMemory, rcExhausted );
+ }
+
+ yyset_debug(debug ? 1 : 0, sb->scanner);
+
+ return 0;
+}
+
+void CC SRAShellScan_yylex_destroy(SRAShellParseBlock* sb)
+{
+ if (sb->scanner)
+ {
+ yylex_destroy(sb->scanner);
+ }
+ sb->scanner=0;
+}
+
+void SRAShell_fatal_error(yyconst char* msg)
+{
+ rc_t rc = RC ( rcApp, rcFile, rcParsing, rcError, rcUnexpected );
+ LogErr(klogErr, rc, msg);
+ exit(rc);
+}
diff --git a/tools/sra-shell/parser/sra-shell.y b/tools/sra-shell/parser/sra-shell.y
new file mode 100644
index 0000000..cf72beb
--- /dev/null
+++ b/tools/sra-shell/parser/sra-shell.y
@@ -0,0 +1,54 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include "sra-shell-parse.h"
+
+ #define YYSTYPE SRAShellToken
+ #define YYLEX_PARAM pb->scanner
+ #define YYDEBUG 1
+
+ #include "sra-shell-tokens.h"
+%}
+
+%pure-parser
+%parse-param {SRAShellParseBlock* pb }
+%lex-param {SRAShellParseBlock* pb }
+%error-verbose
+%name-prefix="SRAShell"
+
+%token shNUMBER
+%token shALPHANUM
+%token shWS
+%token shENDLINE
+%token shTOKEN
+%token shUNRECOGNIZED
+%token shENDOFTEXT 0
+
+%%
+
+%%
+
diff --git a/tools/sra-shell/sra-gui/Makefile b/tools/sra-shell/sra-gui/Makefile
new file mode 100644
index 0000000..3ef9778
--- /dev/null
+++ b/tools/sra-shell/sra-gui/Makefile
@@ -0,0 +1,80 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/sra-gui
+
+EXT_TOOLS = \
+ sra-gui
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#------------------------------------------------------------------------------
+# sra-gui
+#
+SRA_GUI_SRC = \
+ sra-gui
+
+SRA_GUI_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_GUI_SRC))
+
+SRA_GUI_LIB = \
+ -lkapp \
+ -stk-version \
+ -lncbi-vdb \
+
+$(BINDIR)/sra-gui: $(SRA_GUI_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../../shared/toolkit.vers -o $@ $^ $(SRA_GUI_LIB)
+
diff --git a/tools/sra-shell/sra-gui/sra-gui.c b/tools/sra-shell/sra-gui/sra-gui.c
new file mode 100644
index 0000000..f9095ea
--- /dev/null
+++ b/tools/sra-shell/sra-gui/sra-gui.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/out.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "sra-gui";
+
+rc_t CC UsageSummary(const char *prog_name)
+{
+ return KOutMsg ( "Usage: %s [options] path [ path... ]\n"
+ "\n"
+ , prog_name );
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ return 0;
+}
diff --git a/tools/sra-shell/sra-shell/Makefile b/tools/sra-shell/sra-shell/Makefile
new file mode 100644
index 0000000..ef36c2e
--- /dev/null
+++ b/tools/sra-shell/sra-shell/Makefile
@@ -0,0 +1,87 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/sra-shell
+
+EXT_TOOLS = \
+ sra-shell
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+INTERM_SRC = \
+ $(SRCDIR)/shell-lex.c \
+ $(SRCDIR)/shell-grammar.c \
+ $(SRCDIR)/shell-tokens.h
+
+clean: stdclean
+
+.PHONY: clean
+
+.PRECIOUS: $(INTERM_SRC)
+
+#------------------------------------------------------------------------------
+# sra-shell
+#
+SRA_SHELL_SRC = \
+ sra-shell
+
+SRA_SHELL_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_SHELL_SRC))
+
+SRA_SHELL_LIB = \
+ -lkapp \
+ -stk-version \
+ -lncbi-vdb \
+
+$(BINDIR)/sra-shell: $(SRA_SHELL_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../../shared/toolkit.vers -o $@ $^ $(SRA_SHELL_LIB)
+
diff --git a/tools/sra-shell/sra-shell/sra-shell.c b/tools/sra-shell/sra-shell/sra-shell.c
new file mode 100644
index 0000000..66d30dd
--- /dev/null
+++ b/tools/sra-shell/sra-shell/sra-shell.c
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <klib/out.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+rc_t CC Usage ( const Args * args )
+{
+ return 0;
+}
+
+const char UsageDefaultName[] = "sra-shell";
+
+rc_t CC UsageSummary(const char *prog_name)
+{
+ return KOutMsg ( "Usage: %s [options] path [ path... ]\n"
+ "\n"
+ , prog_name );
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ return 0;
+}
diff --git a/tools/sra-shell/turboVision/Makefile b/tools/sra-shell/turboVision/Makefile
new file mode 100644
index 0000000..9ff9c76
--- /dev/null
+++ b/tools/sra-shell/turboVision/Makefile
@@ -0,0 +1,71 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../../..)
+MODULE = tools/sra-shell/turboVision
+
+include $(TOP)/build/Makefile.env
+
+INT_LIBS = \
+ turboVision
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/std
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+.PHONY: all std $(INT_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# turboVision
+#
+
+TURBOVISION_SRC = \
+
+TURBOVISION_OBJ = \
+ $(addsuffix .$(OBJX),$(TURBOVISION_SRC))
+
+$(ILIBDIR)/turboVision: $(TURBOVISION_OBJ)
+ $(LP) --slib -o $@ $^
diff --git a/tools/sra-sort/Makefile b/tools/sra-sort/Makefile
new file mode 100644
index 0000000..7cfe85b
--- /dev/null
+++ b/tools/sra-sort/Makefile
@@ -0,0 +1,125 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-sort
+
+include $(TOP)/build/Makefile.shell
+
+INT_TOOLS = \
+ dump-blob-boundaries
+
+EXT_TOOLS = \
+
+ifneq (win,$(OS))
+EXT_TOOLS += sra-sort
+endif
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+include $(SRCDIR)/Makefile.$(COMP)
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra-sort
+#
+SRA_SORT_SRC = \
+ caps \
+ mem \
+ membank \
+ paged-membank \
+ paged-mmapbank \
+ except \
+ idx-mapping \
+ map-file \
+ col-pair \
+ row-set \
+ simple-row-set \
+ mapping-row-set \
+ sorting-row-set \
+ meta-pair \
+ dir-pair \
+ tbl-pair \
+ db-pair \
+ glob-poslen \
+ poslen-col-pair \
+ ref-alignid-col \
+ buff-writer \
+ id-mapper-col \
+ capture-first-half-aligned \
+ csra-tbl \
+ csra-pair \
+ run \
+ sra-sort \
+ xcheck-ref-align
+
+SRA_SORT_OBJ = \
+ $(addsuffix .$(OBJX),$(SRA_SORT_SRC))
+
+SRA_SORT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/sra-sort: $(SRA_SORT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRA_SORT_LIB)
+
+#-------------------------------------------------------------------------------
+# dump-blob-boundaries
+#
+DBB_SRC = \
+ dump-blob-boundaries
+
+DBB_OBJ = \
+ $(addsuffix .$(OBJX),$(DBB_SRC))
+
+DBB_LIB = \
+ -lncbi-vdb \
+
+$(BINDIR)/dump-blob-boundaries: $(DBB_OBJ)
+ $(LD) --exe -o $@ $^ $(DBB_LIB)
diff --git a/tools/sra-sort/Makefile.cc b/tools/sra-sort/Makefile.cc
new file mode 100644
index 0000000..ca33e13
--- /dev/null
+++ b/tools/sra-sort/Makefile.cc
@@ -0,0 +1,24 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
diff --git a/tools/sra-sort/Makefile.clang b/tools/sra-sort/Makefile.clang
new file mode 100644
index 0000000..bad5e3a
--- /dev/null
+++ b/tools/sra-sort/Makefile.clang
@@ -0,0 +1,27 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+PED = -std=gnu99 -fgnu89-inline
+
diff --git a/tools/sra-sort/Makefile.gcc b/tools/sra-sort/Makefile.gcc
new file mode 100644
index 0000000..02182c4
--- /dev/null
+++ b/tools/sra-sort/Makefile.gcc
@@ -0,0 +1,27 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+PED = $(shell $(SRCDIR)/gcc-ped.sh -std=gnu99 -fgnu89-inline)
+
diff --git a/tools/sra-sort/buff-writer.c b/tools/sra-sort/buff-writer.c
new file mode 100644
index 0000000..9c4b9e4
--- /dev/null
+++ b/tools/sra-sort/buff-writer.c
@@ -0,0 +1,789 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct BufferedPairColWriter BufferedPairColWriter;
+#define COLWRITER_IMPL BufferedPairColWriter
+
+#include "buff-writer.h"
+#include "row-set.h"
+#include "idx-mapping.h"
+#include "map-file.h"
+#include "csra-tbl.h"
+#include "col-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <klib/sort.h>
+#include <klib/rc.h>
+#include <kdb/btree.h>
+
+#include <string.h>
+#include <bitstr.h>
+
+FILE_ENTRY ( buff-writer );
+
+
+/*--------------------------------------------------------------------------
+ * BufferedPairColWriter
+ */
+struct BufferedPairColWriter
+{
+ ColumnWriter dad;
+
+ cSRATblPair *tbl; /* borrowed reference to table */
+
+ ColumnWriter *cw; /* where to write data */
+
+ MemBank *mbank; /* paged memory bank */
+#define MAX_VOCAB_SIZE 32*1024
+ /*** introducing VOCABULARY value->id->vocab_value ***/
+ KBTree *vocab_key2id;
+ const void *vocab_id2val[MAX_VOCAB_SIZE];
+ uint32_t vocab_cnt;
+ /******************************************************/
+ MapFile *idx; /* optional row-id mapping index */
+
+ union
+ {
+ /* for mapping writers */
+ struct
+ {
+ union
+ {
+ /* "immediate" data - size <= 64 bits and row_len == 1 */
+ uint64_t imm;
+
+ /* "indirect" data - stored in "mbank" */
+ void *ptr;
+
+ } val;
+ int64_t new_id;
+ } *data;
+
+ /* standard ( old_id, new_id ) mapping pair */
+ IdxMapping *map;
+
+ /* for non-mapping writers */
+ int64_t *ids;
+
+ } u;
+
+ /* for non-mapping writers - new=>old ord */
+ uint32_t *ord;
+
+ size_t num_items; /* total number of items */
+ size_t cur_item; /* index of currently available item */
+ size_t num_immed; /* number of immediate items written */
+
+ uint32_t elem_bits; /* number of bits of each element */
+ uint32_t min_row_len;
+ uint32_t max_row_len;
+};
+
+static
+void BufferedPairColWriterWhack ( BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ MapFileRelease ( self -> idx, ctx );
+ MemBankRelease ( self -> mbank, ctx );
+ if(self -> vocab_key2id) KBTreeRelease ( self -> vocab_key2id );
+ ColumnWriterRelease ( self -> cw, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+const char *BufferedPairColWriterFullSpec ( const BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return ColumnWriterFullSpec ( self -> cw, ctx );
+}
+
+static
+void BufferedPairColWriterPreCopy ( BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterPreCopy ( self -> cw, ctx );
+}
+
+static
+void BufferedPairColWriterPostCopy ( BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> mbank != NULL )
+ {
+ MemBankRelease ( self -> mbank, ctx );
+ self -> mbank = NULL;
+ }
+ if ( self -> vocab_key2id != NULL )
+ {
+ KBTreeRelease ( self -> vocab_key2id );
+ self -> vocab_key2id = 0;
+ self -> vocab_cnt = 0;
+ }
+
+ ColumnWriterPostCopy ( self -> cw, ctx );
+}
+
+static
+void BufferedPairColWriterMapValues ( BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t i;
+ int64_t id;
+ bool assign_ids = ( bool ) self -> dad . align [ 0 ];
+
+ if ( self -> elem_bits != 64 )
+ {
+ rc = RC ( rcExe, rcColumn, rcWriting, rcType, rcIncorrect );
+ INTERNAL_ERROR ( rc, "column '%s' does not have 64-bit elements and cannot be mapped",
+ ColumnWriterFullSpec ( self -> cw, ctx ) );
+ return;
+ }
+
+ if ( self -> num_immed != self -> num_items )
+ {
+#if DISALLOW_VARIABLE_ROW_LENGTH_MAPPING
+ rc = RC ( rcExe, rcColumn, rcWriting, rcType, rcIncorrect );
+ INTERNAL_ERROR ( rc, "column '%s' does not have fixed row-length of 1 and cannot be mapped",
+ ColumnWriterFullSpec ( self -> cw, ctx ) );
+#else
+ const uint32_t *base;
+ /* detect case when we have ids that were written
+ sparsely ( as NULLs ) rather than densely ( zeros for NULL ). */
+ if ( self -> min_row_len == 0 && self -> max_row_len == 1 )
+ {
+ for ( i = 0; i < self -> num_items; ++ i )
+ {
+ base = self -> u . data [ i ] . val . ptr;
+ if ( base != NULL )
+ memmove ( & self -> u . data [ i ] . val . imm, & base [ 1 ], 8 );
+ }
+
+ MemBankRelease ( self -> mbank, ctx );
+ self -> mbank = NULL;
+ self -> num_immed = self -> num_items;
+ self -> min_row_len = 1;
+
+ }
+ else
+ {
+ STATUS ( 3, "randomly mapping old=>new values" );
+ for ( i = 0; i < self -> num_immed; ++ i )
+ {
+ uint32_t *base;
+
+ id = self -> u . data [ i ] . val . imm;
+
+ ON_FAIL ( base = MemBankAlloc ( self -> mbank, ctx, sizeof id + sizeof * base, false ) )
+ return;
+
+ if ( id != 0 )
+ {
+ ON_FAIL ( id = MapFileMapSingleOldToNew ( self -> idx, ctx, id, assign_ids ) )
+ return;
+ }
+
+ memmove ( & base [ 1 ], & id, sizeof id );
+ base [ 0 ] = 1;
+ self -> u . data [ i ] . val . ptr = base;
+ }
+ for ( self -> num_immed = 0; i < self -> num_items; ++ i )
+ {
+ base = self -> u . data [ i ] . val . ptr;
+ if ( base != NULL )
+ {
+ uint32_t j, row_len = base [ 0 ];
+ int64_t *ids = ( int64_t* ) & base [ 1 ];
+ for ( j = 0; j < row_len; ++ j )
+ {
+ id = ids [ j ];
+ if ( id != 0 )
+ {
+ ON_FAIL ( ids [ j ] = MapFileMapSingleOldToNew ( self -> idx, ctx, id, assign_ids ) )
+ return;
+ }
+ }
+ }
+ }
+ return;
+ }
+#endif
+ }
+
+ STATUS ( 3, "sorting %,u ( data, new_id ) map entries on immediate value", self -> num_items );
+#if USE_OLD_KSORT
+ ksort ( self -> u . map, self -> num_items, sizeof self -> u . map [ 0 ], IdxMappingCmpOld, ( void* ) ctx );
+#else
+ IdxMappingSortOld ( self -> u . map, ctx, self -> num_items );
+#endif
+
+ STATUS ( 3, "mapping old=>new values" );
+ for ( i = 0; i < self -> num_items; ++ i )
+ {
+ id = self -> u . map [ i ] . old_id;
+ if ( id != 0 )
+ {
+ ON_FAIL ( self -> u . map [ i ] . old_id = MapFileMapSingleOldToNew ( self -> idx, ctx, id, assign_ids ) )
+ break;
+ }
+ }
+}
+
+static
+void BufferedPairColWriterWriteMapped ( BufferedPairColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint32_t *base;
+ size_t i, row_bytes;
+ const size_t pg_size = 256 * 1024;
+
+ /* detect first write */
+ if ( self -> u . data == NULL )
+ {
+ /* get map and content length from table */
+ assert ( self -> idx != NULL );
+ ON_FAIL ( self -> u . map = RowSetIteratorGetIdxMapping ( self -> tbl -> rsi, ctx, & self -> num_items ) )
+ {
+ ANNOTATE ( "failed to get ( old_id, new_id ) map for column '%s'", ColumnWriterFullSpec ( self -> cw, ctx ) );
+ return;
+ }
+
+ /* require elem_bits to be constant for column */
+ self -> elem_bits = elem_bits;
+
+ /* OPTIMIZATION:
+ IFF elem_bits <= 64 and row_len == 1, store in union
+ otherwise, use membank. This requires that if row_len
+ ever changes, we have to recover. */
+ if ( elem_bits > 64 || row_len != 1 )
+ {
+ /* create a memory bank */
+ /* TBD - used configured page size rather than 256K */
+ ON_FAIL ( self -> mbank = MemBankMakePaged ( ctx, -1L, pg_size ) )
+ return;
+ }
+
+ /* initialize min/max */
+ self -> min_row_len = self -> max_row_len = row_len;
+ }
+
+ /* elem_bits should be constant */
+ assert ( self -> elem_bits == elem_bits );
+
+ /* handle optimized case */
+ if ( self -> mbank == NULL )
+ {
+ /* first, detect a change */
+ if ( row_len == 1 )
+ {
+ /* continue on optimized case */
+ row_bytes = ( ( size_t ) elem_bits + 7 ) >> 3;
+ if ( boff != 0 )
+ {
+ bitcpy ( & self -> u . data [ self -> cur_item ] . val . imm,
+ 0, data, boff, ( bitsz_t ) elem_bits * row_len );
+ }
+ else
+ {
+ memmove ( & self -> u . data [ self -> cur_item ] . val . imm, data, row_bytes );
+ }
+
+ /* record another immediate row */
+ ++ self -> num_immed;
+
+ /* detect last row */
+ if ( ++ self -> cur_item < self -> num_items )
+ return;
+
+ /* map values */
+ TRY ( BufferedPairColWriterMapValues ( self, ctx ) )
+ {
+ /* need to resort map on new_id */
+ STATUS ( 3, "sorting %,u ( data, new_id ) map entries on new_id", self -> num_items );
+#if USE_OLD_KSORT
+ ksort ( self -> u . map, self -> num_items, sizeof self -> u . map [ 0 ], IdxMappingCmpNew, ( void* ) ctx );
+#else
+ IdxMappingSortNew ( self -> u . map, ctx, self -> num_items );
+#endif
+
+ /* write all rows to column writer */
+ STATUS ( 3, "writing cell data to '%s'", ColumnWriterFullSpec ( self -> cw, ctx ) );
+ for ( i = 0; i < self -> num_items; ++ i )
+ {
+ /* write out row */
+ ON_FAIL ( ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, & self -> u . data [ i ] . val . imm, 0, 1 ) )
+ break;
+ }
+ }
+
+ /* forget about map */
+ self -> u . map = NULL;
+ self -> cur_item = self -> num_items = self -> num_immed = 0;
+ self -> elem_bits = 0;
+
+ return;
+ }
+
+ /* need to recover */
+ ON_FAIL ( self -> mbank = MemBankMakePaged ( ctx, -1L, pg_size ) )
+ return;
+ }
+
+ /* update min/max row-len */
+ if ( row_len < self -> min_row_len )
+ self -> min_row_len = row_len;
+ else if ( row_len > self -> max_row_len )
+ self -> max_row_len = row_len;
+
+ /* handle zero-length rows specially */
+ if ( row_len == 0 )
+ self -> u . data [ self -> cur_item ] . val . ptr = NULL;
+ else
+ {
+ /* allocate space for the row */
+ row_bytes = ( ( size_t ) elem_bits * row_len + 7 ) >> 3;
+ TRY ( base = MemBankAlloc ( self -> mbank, ctx, row_bytes + sizeof row_len, false ) )
+ {
+ /* copy it in */
+ memmove ( base, & row_len, sizeof row_len );
+ if ( boff != 0 )
+ bitcpy ( & base [ 1 ], 0, data, boff, ( bitsz_t ) elem_bits * row_len );
+ else
+ memmove ( & base [ 1 ], data, row_bytes );
+
+ /* remember its location in the map */
+ self -> u . data [ self -> cur_item ] . val . ptr = base;
+
+ /* remember the last input pointer */
+ }
+ }
+
+ if ( ! FAILED () )
+ {
+ /* detect last row */
+ if ( ++ self -> cur_item == self -> num_items )
+ {
+ /* map values */
+ TRY ( BufferedPairColWriterMapValues ( self, ctx ) )
+ {
+ /* need to resort map on new_id */
+ STATUS ( 3, "sorting %,u ( data, new_id ) map entries on new_id", self -> num_items );
+#if USE_OLD_KSORT
+ ksort ( self -> u . map, self -> num_items, sizeof self -> u . map [ 0 ], IdxMappingCmpNew, ( void* ) ctx );
+#else
+ IdxMappingSortNew ( self -> u . map, ctx, self -> num_items );
+#endif
+
+ /* write all rows to column writer */
+ STATUS ( 3, "writing cell data to '%s'", ColumnWriterFullSpec ( self -> cw, ctx ) );
+ for ( i = 0; i < self -> num_immed; ++ i )
+ {
+ /* write out row */
+ ON_FAIL ( ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, & self -> u . data [ i ] . val . imm, 0, 1 ) )
+ break;
+ }
+ for ( ; ! FAILED () && i < self -> num_items; ++ i )
+ {
+ /* write out row */
+ base = self -> u . data [ i ] . val . ptr;
+ if ( base == NULL )
+ ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, "", 0, 0 );
+ else
+ ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, & base [ 1 ], 0, base [ 0 ] );
+ }
+ }
+
+ /* drop the mem-bank */
+ MemBankRelease ( self -> mbank, ctx );
+ self -> mbank = NULL;
+
+ /* forget about map */
+ self -> u . data = NULL;
+ self -> cur_item = self -> num_items = self -> num_immed = 0;
+ self -> elem_bits = 0;
+ }
+ }
+}
+
+static
+void BufferedPairColWriterWriteUnmapped ( BufferedPairColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ size_t i, j, row_bytes;
+ const size_t pg_size = 256 * 1024;
+
+ /* detect first write */
+ if ( self -> u . data == NULL )
+ {
+ /* get ids, ord and content length from table */
+ assert ( self -> idx == NULL );
+ ON_FAIL ( self -> u . ids = RowSetIteratorGetSourceIds ( self -> tbl -> rsi, ctx, & self -> ord, & self -> num_items ) )
+ {
+ ANNOTATE ( "failed to get old_id, ord maps for column '%s'", ColumnWriterFullSpec ( self -> cw, ctx ) );
+ return;
+ }
+
+ /* require elem_bits to be constant for column */
+ self -> elem_bits = elem_bits;
+
+ /* OPTIMIZATION:
+ IFF elem_bits <= 64 and row_len == 1, store in union
+ otherwise, use membank. This requires that if row_len
+ ever changes, we have to recover. */
+ if ( elem_bits > 64 || row_len != 1 )
+ {
+ rc_t rc=KBTreeMakeUpdate(&self->vocab_key2id, NULL, 100*1024*1024,
+ false, kbtOpaqueKey,
+ 1, 1024, sizeof ( uint32_t ),
+ NULL
+ );
+ if(rc != 0) self->vocab_key2id = NULL;
+ self->vocab_cnt=0;
+ /* create a memory bank */
+ /* TBD - used configured page size rather than 256K */
+ ON_FAIL ( self -> mbank = MemBankMakePaged ( ctx, -1L, pg_size ) )
+ return;
+ }
+ /* initialize min/max */
+ self -> min_row_len = self -> max_row_len = row_len;
+ }
+
+ /* elem_bits should be constant */
+ assert ( self -> elem_bits == elem_bits );
+
+ /* handle optimized case */
+ if ( self -> mbank == NULL )
+ {
+ /* first, detect a change */
+ if ( row_len == 1 )
+ {
+ /* continue on optimized case */
+ row_bytes = ( ( size_t ) elem_bits + 7 ) >> 3;
+ if ( boff != 0 )
+ {
+ bitcpy ( & self -> u . ids [ self -> cur_item ],
+ 0, data, boff, ( bitsz_t ) elem_bits * row_len );
+ }
+ else
+ {
+ memmove ( & self -> u . ids [ self -> cur_item ], data, row_bytes );
+ }
+
+ /* record another immediate row */
+ ++ self -> num_immed;
+
+ /* detect last row */
+ if ( ++ self -> cur_item < self -> num_items )
+ return;
+
+ /* write all rows to column writer */
+ STATUS ( 3, "writing cell data to '%s'", ColumnWriterFullSpec ( self -> cw, ctx ) );
+ for ( i = 0; i < self -> num_items; ++ i )
+ {
+ /* map to new order */
+ j = self -> ord [ i ];
+
+ /* write out row */
+ ON_FAIL ( ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, & self -> u . ids [ j ], 0, 1 ) )
+ break;
+ }
+
+ /* forget about map */
+ self -> u . ids = NULL;
+ self -> ord = NULL;
+ self -> cur_item = self -> num_items = self -> num_immed = 0;
+ self -> elem_bits = 0;
+
+ return;
+ }
+
+ /* need to recover */
+ {
+ rc_t rc=KBTreeMakeUpdate(&self->vocab_key2id, NULL, 100*1024*1024,
+ false, kbtOpaqueKey,
+ 1, 1024, sizeof ( uint32_t ),
+ NULL
+ );
+ if(rc != 0) self->vocab_key2id = NULL;
+ self->vocab_cnt=0;
+ /* create a memory bank */
+ /* create a memory bank */
+ /* TBD - used configured page size rather than 256K */
+ ON_FAIL ( self -> mbank = MemBankMakePaged ( ctx, -1L, pg_size ) )
+ return;
+ }
+ }
+
+ /* update min/max row-len */
+ if ( row_len < self -> min_row_len )
+ self -> min_row_len = row_len;
+ else if ( row_len > self -> max_row_len )
+ self -> max_row_len = row_len;
+
+ /* handle zero-length rows specially */
+ if ( row_len == 0 ){
+ self -> u . ids [ self -> cur_item ] = 0;
+ } else {
+ uint32_t *base = NULL;
+ row_bytes = ( ( size_t ) elem_bits * row_len + 7 ) >> 3;
+ if(self -> vocab_key2id){
+ rc_t rc;
+ bool wasInserted;
+ uint64_t tmp_id=self -> vocab_cnt;
+ if( self -> vocab_cnt < sizeof(self -> vocab_id2val)/sizeof(self -> vocab_id2val[0])){
+ rc = KBTreeEntry(self -> vocab_key2id, &tmp_id, &wasInserted, data, row_bytes);
+ } else {
+ rc = KBTreeFind (self -> vocab_key2id, &tmp_id, data, row_bytes);
+ if(rc == 0) wasInserted=false;
+ }
+ if(rc == 0){ /*** either entered or found **/
+ if(wasInserted){/** allocate and remember in vocabulary ***/
+ /* allocate space for the row */
+ TRY ( base = MemBankAlloc ( self -> mbank, ctx, row_bytes + sizeof row_len, false ) )
+ {
+ /* copy it in */
+ base[0] = row_len;
+ if ( boff != 0 ) bitcpy ( & base [ 1 ], 0, data, boff, ( bitsz_t ) elem_bits * row_len );
+ else memmove ( & base [ 1 ], data, row_bytes );
+ self -> vocab_id2val[self -> vocab_cnt++] = base;
+ }
+ } else { /** get from vocabulary **/
+ assert(tmp_id < self -> vocab_cnt);
+ base = (uint32_t*)self -> vocab_id2val[tmp_id];
+ }
+ }
+ rc = 0;
+ }
+ if(base == NULL){
+ TRY ( base = MemBankAlloc ( self -> mbank, ctx, row_bytes + sizeof row_len, false ) )
+ {
+ /* copy it in */
+ base[0] = row_len;
+ if ( boff != 0 )
+ bitcpy ( & base [ 1 ], 0, data, boff, ( bitsz_t ) elem_bits * row_len );
+ else
+ memmove ( & base [ 1 ], data, row_bytes );
+ }
+
+ }
+ /* remember base location in the map */
+ self -> u . ids [ self -> cur_item ] = ( int64_t ) ( size_t ) base;
+ /* remember the last input pointer */
+ }
+
+ if ( ! FAILED () )
+ {
+ /* detect last row */
+ if ( ++ self -> cur_item == self -> num_items )
+ {
+ /* write all rows to column writer */
+ uint32_t *last_base=NULL;
+ uint32_t cnt=0;
+ STATUS ( 3, "writing cell data to '%s' num_items=%ld vocab_size=%d num_immed=%d", ColumnWriterFullSpec ( self -> cw, ctx ), self -> num_items, self ->vocab_cnt, self -> num_immed );
+ for ( i = 0; ! FAILED () && i < self -> num_items; ++ i )
+ {
+ /* map to new order */
+ j = self -> ord [ i ];
+ if ( j < self -> num_immed ){
+ if(cnt > 0){ /*** flush accumulated count ***/
+ if(last_base==NULL) ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits, "",0, 0,cnt);
+ else ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits,&last_base[1],0,last_base[0],cnt);
+ last_base=NULL;
+ cnt=0;
+ }
+ ColumnWriterWrite ( self -> cw, ctx, self -> elem_bits, & self -> u . ids [ j ], 0, 1 );
+ } else {
+ /* accumulate repeated rows */
+ void* ptr = (void*)(size_t)self->u.ids [ j ];
+ if (cnt == 0){
+ cnt=1;
+ last_base = ptr;
+ } else if (ptr == last_base){
+ cnt++;
+ } else {
+ if(last_base==NULL) ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits, "",0, 0,cnt);
+ else ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits,&last_base[1],0,last_base[0],cnt);
+ last_base = ptr;
+ cnt=1;
+ }
+ }
+ }
+ if(cnt > 0){ /*** flush accumulated count ***/
+ if(last_base==NULL) ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits, "",0, 0,cnt);
+ else ColumnWriterWriteStatic(self->cw,ctx,self->elem_bits,&last_base[1],0,last_base[0],cnt);
+ }
+ /* drop the mem-bank */
+ MemBankRelease ( self -> mbank, ctx );
+ self -> mbank = NULL;
+
+ /* forget about map */
+ self -> u . ids = NULL;
+ self -> ord = NULL;
+ self -> cur_item = self -> num_items = self -> num_immed = 0;
+ self -> elem_bits = 0;
+
+ /* cleanup vocabulary */
+ if(self -> vocab_key2id ) {
+ KBTreeRelease ( self -> vocab_key2id );
+ self -> vocab_key2id = 0;
+ }
+ self -> vocab_cnt = 0;
+
+ }
+ }
+}
+
+static
+void BufferedPairColWriterWriteStatic ( BufferedPairColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+ rc_t rc = RC ( rcExe, rcColumn, rcWriting, rcType, rcIncorrect );
+ INTERNAL_ERROR ( rc, "writing to a non-static column" );
+}
+
+
+static
+void BufferedPairColWriterCommit ( BufferedPairColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterCommit ( self -> cw, ctx );
+}
+
+
+struct ColumnWriter_vt UnmappedBufferedPairColWriter_vt =
+{
+ BufferedPairColWriterWhack,
+ BufferedPairColWriterFullSpec,
+ BufferedPairColWriterPreCopy,
+ BufferedPairColWriterPostCopy,
+ BufferedPairColWriterWriteUnmapped,
+ BufferedPairColWriterWriteStatic,
+ BufferedPairColWriterCommit
+};
+
+
+struct ColumnWriter_vt MappedBufferedPairColWriter_vt =
+{
+ BufferedPairColWriterWhack,
+ BufferedPairColWriterFullSpec,
+ BufferedPairColWriterPreCopy,
+ BufferedPairColWriterPostCopy,
+ BufferedPairColWriterWriteMapped,
+ BufferedPairColWriterWriteStatic,
+ BufferedPairColWriterCommit
+};
+
+
+/*--------------------------------------------------------------------------
+ * cSRATblPair
+ * interface to pairing of source and destination tables
+ */
+
+/* MakeBufferedColumnWriter
+ * make a wrapper that buffers all rows written
+ * then sorts on flush
+ */
+ColumnWriter *cSRATblPairMakeBufferedColumnWriter ( cSRATblPair *self,
+ const ctx_t *ctx, ColumnWriter *writer )
+{
+ FUNC_ENTRY ( ctx );
+
+ BufferedPairColWriter *buff;
+
+ TRY ( buff = MemAlloc ( ctx, sizeof * buff, true ) )
+ {
+ TRY ( ColumnWriterInit ( & buff -> dad, ctx, & UnmappedBufferedPairColWriter_vt, false ) )
+ {
+ /* duplicate our friend */
+ TRY ( buff -> cw = ColumnWriterDuplicate ( writer, ctx ) )
+ {
+ /* borrowed ( weak ) reference
+ cannot duplicate without creating cycle */
+ buff -> tbl = self;
+
+ return & buff -> dad;
+ }
+ }
+
+ MemFree ( ctx, buff, sizeof * buff );
+ }
+
+ return NULL;
+}
+
+/* MakeBufferedIdRemapColumnWriter
+ * make a wrapper that buffers all rows written
+ * maps all ids through index MapFile
+ * then sorts on flush
+ */
+ColumnWriter *cSRATblPairMakeBufferedIdRemapColumnWriter ( cSRATblPair *self,
+ const ctx_t *ctx, ColumnWriter *writer, MapFile *idx, bool assign_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ BufferedPairColWriter *buff;
+
+ TRY ( buff = MemAlloc ( ctx, sizeof * buff, true ) )
+ {
+ TRY ( ColumnWriterInit ( & buff -> dad, ctx, & MappedBufferedPairColWriter_vt, idx != NULL ) )
+ {
+ /* duplicate our friend */
+ TRY ( buff -> cw = ColumnWriterDuplicate ( writer, ctx ) )
+ {
+ TRY ( buff -> idx = MapFileDuplicate ( idx, ctx ) )
+ {
+ /* borrowed ( weak ) reference
+ cannot duplicate without creating cycle */
+ buff -> tbl = self;
+
+ /* preserve boolean in one of Dad's align bytes */
+ buff -> dad . align [ 0 ] = assign_ids;
+
+ return & buff -> dad;
+ }
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+ }
+
+ MemFree ( ctx, buff, sizeof * buff );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/buff-writer.h b/tools/sra-sort/buff-writer.h
new file mode 100644
index 0000000..261788a
--- /dev/null
+++ b/tools/sra-sort/buff-writer.h
@@ -0,0 +1,64 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_buff_writer_
+#define _h_sra_sort_buff_writer_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct MapFile;
+struct cSRATblPair;
+struct ColumnWriter;
+
+
+/*--------------------------------------------------------------------------
+ * cSRATblPair
+ * interface to pairing of source and destination tables
+ */
+
+/* MakeBufferedColumnWriter
+ * make a wrapper that buffers all rows written
+ * then sorts on flush
+ */
+struct ColumnWriter *cSRATblPairMakeBufferedColumnWriter ( struct cSRATblPair *self,
+ const ctx_t *ctx, struct ColumnWriter *writer );
+
+/* MakeBufferedIdRemapColumnWriter
+ * make a wrapper that buffers all rows written
+ * maps all ids through index MapFile
+ * then sorts on flush
+ */
+struct ColumnWriter *cSRATblPairMakeBufferedIdRemapColumnWriter ( struct cSRATblPair *self,
+ const ctx_t *ctx, struct ColumnWriter *writer, struct MapFile *idx, bool assign_ids );
+
+
+#endif /* _h_sra_sort_buff_writer_ */
diff --git a/tools/sra-sort/caps.c b/tools/sra-sort/caps.c
new file mode 100644
index 0000000..9becbb1
--- /dev/null
+++ b/tools/sra-sort/caps.c
@@ -0,0 +1,125 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+
+#include <vdb/manager.h>
+#include <kdb/manager.h>
+#include <kfg/config.h>
+
+#include <string.h>
+
+FILE_ENTRY ( caps );
+
+/*--------------------------------------------------------------------------
+ * Caps
+ * a very watered down version of vdb-3 capabilities
+ */
+
+
+/* Init
+ * initialize a local block from another
+ */
+void CapsInit ( Caps *caps, const ctx_t *ctx )
+{
+ if ( caps != NULL )
+ {
+ memset ( caps, 0, sizeof * caps );
+ if ( ctx != NULL && ctx -> caps != NULL )
+ {
+ const Caps *orig = ctx -> caps;
+ FUNC_ENTRY ( ctx );
+ TRY ( caps -> mem = MemBankDuplicate ( orig -> mem, ctx ) )
+ {
+ rc_t rc = KConfigAddRef ( caps -> cfg = orig -> cfg );
+ if ( rc != 0 )
+ {
+ caps -> cfg = NULL;
+ ERROR ( rc, "failed to duplicate reference to KConfig" );
+ }
+ else
+ {
+ rc = KDBManagerAddRef ( caps -> kdb = orig -> kdb );
+ if ( rc != 0 )
+ {
+ caps -> kdb = NULL;
+ ERROR ( rc, "failed to duplicate reference to KDBManager" );
+ }
+ else
+ {
+ rc = VDBManagerAddRef ( caps -> vdb = orig -> vdb );
+ if ( rc != 0 )
+ {
+ caps -> vdb = NULL;
+ ERROR ( rc, "failed to duplicate reference to VDBManager" );
+ }
+ else
+ {
+ caps -> tool = orig -> tool;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/* Whack
+ * release references
+ */
+void CapsWhack ( Caps *self, const ctx_t *ctx )
+{
+ if ( self != NULL )
+ {
+ rc_t rc;
+ MemBank *mem;
+
+ self -> tool = NULL;
+
+ rc = VDBManagerRelease ( self -> vdb );
+ if ( rc != 0 )
+ ABORT ( rc, "failed to release reference to VDBManager" );
+ self -> vdb = NULL;
+
+ rc = KDBManagerRelease ( self -> kdb );
+ if ( rc != 0 )
+ ABORT ( rc, "failed to release reference to KDBManager" );
+ self -> kdb = NULL;
+
+ rc = KConfigRelease ( self -> cfg );
+ if ( rc != 0 )
+ ABORT ( rc, "failed to release reference to KConfig" );
+ self -> cfg = NULL;
+
+ mem = self -> mem;
+ MemBankRelease ( mem, ctx );
+ self -> mem = NULL;
+ }
+}
diff --git a/tools/sra-sort/caps.h b/tools/sra-sort/caps.h
new file mode 100644
index 0000000..7368556
--- /dev/null
+++ b/tools/sra-sort/caps.h
@@ -0,0 +1,70 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_caps_
+#define _h_sra_sort_caps_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct MemBank;
+struct KConfig;
+struct KDBManager;
+struct VDBManager;
+struct Tool;
+
+
+/*--------------------------------------------------------------------------
+ * Caps
+ * a very watered-down version of vdb-3 capabilities
+ */
+typedef struct Caps Caps;
+struct Caps
+{
+ struct MemBank *mem;
+ struct KConfig const *cfg;
+ struct KDBManager *kdb;
+ struct VDBManager *vdb;
+ struct Tool const *tool;
+};
+
+
+/* Init
+ * initialize a local block from another
+ */
+void CapsInit ( Caps *caps, const ctx_t *ctx );
+
+
+/* Whack
+ * release references
+ */
+void CapsWhack ( Caps *self, const ctx_t *ctx );
+
+#endif
diff --git a/tools/sra-sort/capture-first-half-aligned.c b/tools/sra-sort/capture-first-half-aligned.c
new file mode 100644
index 0000000..73cd829
--- /dev/null
+++ b/tools/sra-sort/capture-first-half-aligned.c
@@ -0,0 +1,192 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct CaptureFirstHalfAlignedColWriter CaptureFirstHalfAlignedColWriter;
+#define COLWRITER_IMPL CaptureFirstHalfAlignedColWriter
+
+#include "csra-pair.h"
+#include "col-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <klib/rc.h>
+
+FILE_ENTRY ( capture-first-half-aligned );
+
+
+/*--------------------------------------------------------------------------
+ * CaptureFirstHalfAlignedColWriter
+ */
+struct CaptureFirstHalfAlignedColWriter
+{
+ ColumnWriter dad;
+
+ int64_t row_id;
+ cSRAPair *csra;
+ ColumnWriter *writer;
+};
+
+static
+void CaptureFirstHalfAlignedColWriterWhack ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterRelease ( self -> writer, ctx );
+ self -> csra = NULL;
+ self -> writer = NULL;
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+const char *CaptureFirstHalfAlignedColWriterFullSpec ( const CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return ColumnWriterFullSpec ( self -> writer, ctx );
+}
+
+static
+void CaptureFirstHalfAlignedColWriterPreCopy ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterPreCopy ( self -> writer, ctx );
+}
+
+static
+void CaptureFirstHalfAlignedColWriterPostCopy ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterPostCopy ( self -> writer, ctx );
+}
+
+static
+void CaptureFirstHalfAlignedColWriterWrite ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *csra = self -> csra;
+ if ( csra -> first_half_aligned_spot == 0 )
+ {
+ uint32_t i;
+ const int64_t *row = data;
+
+ for ( i = 0; i < row_len; ++ i )
+ {
+ if ( row [ i ] == 0 )
+ {
+ csra -> first_half_aligned_spot = self -> row_id;
+ break;
+ }
+ }
+ }
+
+ TRY ( ColumnWriterWrite ( self -> writer, ctx, elem_bits, data, boff, row_len ) )
+ {
+ ++ self -> row_id;
+ }
+}
+
+static
+void CaptureFirstHalfAlignedColWriterWriteStatic ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *csra = self -> csra;
+ if ( csra -> first_half_aligned_spot == 0 )
+ {
+ uint32_t i;
+ const int64_t *row = data;
+
+ for ( i = 0; i < row_len; ++ i )
+ {
+ if ( row [ i ] == 0 )
+ {
+ csra -> first_half_aligned_spot = self -> row_id;
+ break;
+ }
+ }
+ }
+
+ TRY ( ColumnWriterWriteStatic ( self -> writer, ctx, elem_bits, data, boff, row_len, count ) )
+ {
+ self -> row_id += count;
+ }
+}
+
+static
+void CaptureFirstHalfAlignedColWriterCommit ( CaptureFirstHalfAlignedColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterCommit ( self -> writer, ctx );
+}
+
+static ColumnWriter_vt CaptureFirstHalfAlignedColWriter_vt =
+{
+ CaptureFirstHalfAlignedColWriterWhack,
+ CaptureFirstHalfAlignedColWriterFullSpec,
+ CaptureFirstHalfAlignedColWriterPreCopy,
+ CaptureFirstHalfAlignedColWriterPostCopy,
+ CaptureFirstHalfAlignedColWriterWrite,
+ CaptureFirstHalfAlignedColWriterWriteStatic,
+ CaptureFirstHalfAlignedColWriterCommit
+};
+
+/*--------------------------------------------------------------------------
+ * cSRAPair
+ */
+
+/* MakeFirstHalfAlignedRowIdCaptureWriter
+ * a simple monitor on SEQUENCE.PRIMARY_ALIGNMENT_ID looking for
+ * half-aligned spots and capturing the first occurrence.
+ */
+ColumnWriter *cSRAPairMakeFirstHalfAlignedRowIdCaptureWriter ( cSRAPair *self,
+ const ctx_t *ctx, ColumnWriter *writer )
+{
+ FUNC_ENTRY ( ctx );
+
+ CaptureFirstHalfAlignedColWriter *mon;
+
+ TRY ( mon = MemAlloc ( ctx, sizeof * mon, false ) )
+ {
+ TRY ( ColumnWriterInit ( & mon -> dad, ctx, & CaptureFirstHalfAlignedColWriter_vt, false ) )
+ {
+ mon -> row_id = 1;
+ mon -> csra = self;
+ TRY ( mon -> writer = ColumnWriterDuplicate ( writer, ctx ) )
+ {
+ return & mon -> dad;
+ }
+ }
+
+ MemFree ( ctx, mon, sizeof * mon );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/col-pair.c b/tools/sra-sort/col-pair.c
new file mode 100644
index 0000000..4394bff
--- /dev/null
+++ b/tools/sra-sort/col-pair.c
@@ -0,0 +1,818 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct SimpleColumnReader SimpleColumnReader;
+#define COLREADER_IMPL SimpleColumnReader
+
+typedef struct SimpleColumnWriter SimpleColumnWriter;
+#define COLWRITER_IMPL SimpleColumnWriter
+
+#include "col-pair.h"
+#include "tbl-pair.h"
+#include "row-set.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kapp/main.h>
+#include <kfs/defs.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+FILE_ENTRY ( col-pair );
+
+
+/*--------------------------------------------------------------------------
+ * SimpleColumnReader
+ * implementation of ColumnReader based upon VCursor direct read
+ */
+struct SimpleColumnReader
+{
+ ColumnReader dad;
+
+ const VCursor *curs;
+ uint32_t idx;
+
+ uint32_t full_spec_size;
+ char full_spec [ 1 ];
+};
+
+
+/* Whack
+ */
+static
+void SimpleColumnReaderWhack ( SimpleColumnReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t bytes = sizeof * self + self -> full_spec_size;
+
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ WARN ( "VCursorRelease failed on '%s'", self -> full_spec );
+
+ self -> curs = NULL;
+ MemFree ( ctx, self, bytes );
+}
+
+/* FullSpec
+ */
+static
+const char *SimpleColumnReaderFullSpec ( const SimpleColumnReader *self, const ctx_t *ctx )
+{
+ return self -> full_spec;
+}
+
+
+/* IdRange
+ * returns the number of ids available
+ * and optionally the first id
+ */
+static
+uint64_t SimpleColumnReaderIdRange ( const SimpleColumnReader *self,
+ const ctx_t *ctx, int64_t *opt_first )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ uint64_t count;
+
+ rc = VCursorIdRange ( self -> curs, self -> idx, opt_first, & count );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorIdRange failed for column '%s'", self -> full_spec );
+
+ return count;
+}
+
+
+/* DummyStub
+ * useful for pre/post-copy
+ */
+static
+void SimpleColumnReaderDummyStub ( SimpleColumnReader *self, const ctx_t *ctx )
+{
+}
+
+
+/* Read
+ * read next row of data
+ * returns NULL if no rows are available
+ */
+static
+const void *SimpleColumnReaderRead ( SimpleColumnReader *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const void *base;
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx, elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorCellDataDirect ( %ld ) failed for column '%s'", row_id, self -> full_spec );
+
+ return base;
+}
+
+static ColumnReader_vt SimpleColumnReader_vt =
+{
+ SimpleColumnReaderWhack,
+ SimpleColumnReaderFullSpec,
+ SimpleColumnReaderIdRange,
+ SimpleColumnReaderDummyStub,
+ SimpleColumnReaderDummyStub,
+ SimpleColumnReaderRead
+};
+
+
+/*--------------------------------------------------------------------------
+ * ColumnReader
+ * interface to read column in serial order
+ */
+
+
+/* MakeColumnReader
+ * make simple column reader
+ */
+ColumnReader *TablePairMakeColumnReader ( TablePair *self, const ctx_t *ctx,
+ const VCursor *opt_curs, const char *colspec, bool required )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const VCursor *curs;
+
+ if ( opt_curs != NULL )
+ rc = VCursorAddRef ( curs = opt_curs );
+ else
+ rc = VTableCreateCursorRead ( self -> stbl, & curs );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create cursor on column 'src.%s.%s'", self -> full_spec, colspec );
+ else
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn ( curs, & idx, "%s", colspec );
+ if ( rc != 0 && GetRCState ( rc ) != rcExists )
+ {
+ if ( required )
+ ERROR ( rc, "failed to add column 'src.%s.%s' to cursor", self -> full_spec, colspec );
+ }
+ else
+ {
+ rc = VCursorOpen ( curs );
+ if ( rc != 0 )
+ {
+ if ( required )
+ ERROR ( rc, "failed to open cursor on column 'src.%s.%s'", self -> full_spec, colspec );
+ }
+ else
+ {
+ SimpleColumnReader *col;
+ size_t full_spec_size = self -> full_spec_size + string_size ( colspec ) + sizeof "src.." - 1;
+
+ TRY ( col = MemAlloc ( ctx, sizeof * col + full_spec_size, false ) )
+ {
+ ColumnReaderInit ( & col -> dad, ctx, & SimpleColumnReader_vt );
+ col -> curs = curs;
+ col -> idx = idx;
+ col -> full_spec_size = ( uint32_t ) full_spec_size;
+
+ rc = string_printf ( col -> full_spec, full_spec_size + 1, NULL,
+ "src.%s.%s", self -> full_spec, colspec );
+ if ( rc == 0 )
+ return & col -> dad;
+
+ ABORT ( rc, "miscalculated string size" );
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate %zu bytes for SimpleColumnReader", sizeof * col + full_spec_size );
+ }
+ }
+ }
+
+ VCursorRelease ( curs );
+ }
+
+ return NULL;
+}
+
+
+/* Release
+ * releases reference
+ */
+void ColumnReaderRelease ( const ColumnReader *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "ColumnReader" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release ColumnReader" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+ColumnReader *ColumnReaderDuplicate ( const ColumnReader *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "ColumnReader" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate ColumnReader" );
+ return NULL;
+ }
+ }
+
+ return ( ColumnReader* ) self;
+}
+
+
+/* Init
+ */
+void ColumnReaderInit ( ColumnReader *self, const ctx_t *ctx, const ColumnReader_vt *vt )
+{
+ if ( self == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcConstructing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad ColumnReader" );
+ }
+ else
+ {
+ self -> vt = vt;
+ KRefcountInit ( & self -> refcount, 1, "ColumnReader", "init", "" );
+ self -> presorted = false;
+ memset ( self -> align, 0, sizeof self -> align );
+ }
+}
+
+
+/*--------------------------------------------------------------------------
+ * SimpleColumnWriter
+ * implementation of ColumnWriter based upon VCursor
+ */
+struct SimpleColumnWriter
+{
+ ColumnWriter dad;
+
+ VCursor *curs;
+ uint32_t idx;
+
+ uint32_t full_spec_size;
+ char full_spec [ 1 ];
+};
+
+static
+void SimpleColumnWriterWhack ( SimpleColumnWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorRelease failed on column '%s'", self -> full_spec );
+
+ MemFree ( ctx, self, sizeof * self + self -> full_spec_size );
+}
+
+
+static
+const char *SimpleColumnWriterFullSpec ( const SimpleColumnWriter *self, const ctx_t *ctx )
+{
+ return self -> full_spec;
+}
+
+static
+void SimpleColumnWriterDummyStub ( SimpleColumnWriter *self, const ctx_t *ctx )
+{
+}
+
+static
+void SimpleColumnWriterWrite ( SimpleColumnWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VCursorOpenRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpenRow failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> idx, elem_bits, data, boff, row_len );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorCommitRow ( self -> curs );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorCommit failed for column '%s'", self -> full_spec );
+ }
+
+ rc = VCursorCloseRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorCloseRow failed on column '%s'", self -> full_spec );
+ }
+}
+
+static
+void SimpleColumnWriterWriteStatic ( SimpleColumnWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+
+ for ( ; ! FAILED () && count > 0; -- count )
+ {
+ rc_t rc = VCursorOpenRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpenRow failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> idx, elem_bits, data, boff, row_len );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorCommitRow ( self -> curs );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorCommitRow failed for column '%s'", self -> full_spec );
+ else if ( count > 1 )
+ {
+ /* setting it small since threshold is detected in CommitRow, but execused on CloseRow */
+ uint64_t cnt = ( count < 0x10000000U ) ? count : 0x10000000U;
+ rc = VCursorRepeatRow ( self -> curs, cnt - 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorRepeatRow failed for column '%s'", self -> full_spec );
+ else
+ count -= cnt - 1;
+ }
+ }
+
+ rc = VCursorCloseRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorCloseRow failed on column '%s'", self -> full_spec );
+ }
+ }
+}
+
+static
+void SimpleColumnWriterCommit ( SimpleColumnWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VCursorCommit ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorCommit failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorRelease failed on column '%s'", self -> full_spec );
+ else
+ {
+ self -> curs = NULL;
+ }
+ }
+}
+
+
+static ColumnWriter_vt SimpleColumnWriter_vt =
+{
+ SimpleColumnWriterWhack,
+ SimpleColumnWriterFullSpec,
+ SimpleColumnWriterDummyStub,
+ SimpleColumnWriterDummyStub,
+ SimpleColumnWriterWrite,
+ SimpleColumnWriterWriteStatic,
+ SimpleColumnWriterCommit
+};
+
+
+
+/*--------------------------------------------------------------------------
+ * ColumnWriter
+ * interface to write column in serial order
+ */
+
+
+/* MakeColumnWriter
+ * make simple column writer
+ */
+ColumnWriter *TablePairMakeColumnWriter ( TablePair *self, const ctx_t *ctx,
+ VCursor *opt_curs, const char *colspec )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ VCursor *curs;
+
+ if ( opt_curs != NULL )
+ rc = VCursorAddRef ( curs = opt_curs );
+ else
+ rc = VTableCreateCursorWrite ( self -> dtbl, & curs, kcmInsert );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create cursor on column 'dst.%s.%s'", self -> full_spec, colspec );
+ else
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn ( curs, & idx, "%s", colspec );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to add column 'dst.%s.%s' to cursor", self -> full_spec, colspec );
+ else
+ {
+ VCursorSuspendTriggers ( curs );
+
+ rc = VCursorOpen ( curs );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to open cursor on column 'dst.%s.%s'", self -> full_spec, colspec );
+ else
+ {
+ SimpleColumnWriter *col;
+ size_t full_spec_size = self -> full_spec_size + string_size ( colspec ) + sizeof "dst.." - 1;
+
+ TRY ( col = MemAlloc ( ctx, sizeof * col + full_spec_size, false ) )
+ {
+ ColumnWriterInit ( & col -> dad, ctx, & SimpleColumnWriter_vt, false );
+ col -> curs = curs;
+ col -> idx = idx;
+
+ col -> full_spec_size = ( uint32_t ) full_spec_size;
+ rc = string_printf ( col -> full_spec, full_spec_size + 1, NULL,
+ "dst.%s.%s", self -> full_spec, colspec );
+ if ( rc == 0 )
+ return & col -> dad;
+
+ ABORT ( rc, "miscalculated string size" );
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate %zu bytes for SimpleColumnWriter", sizeof * col + full_spec_size );
+ }
+ }
+ }
+
+ VCursorRelease ( curs );
+ }
+
+ return NULL;
+}
+
+
+/* Release
+ * releases reference
+ */
+void ColumnWriterRelease ( ColumnWriter *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "ColumnWriter" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release ColumnWriter" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+ColumnWriter *ColumnWriterDuplicate ( const ColumnWriter *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "ColumnWriter" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate ColumnWriter" );
+ return NULL;
+ }
+ }
+
+ return ( ColumnWriter* ) self;
+}
+
+
+/* Init
+ */
+void ColumnWriterInit ( ColumnWriter *self, const ctx_t *ctx, const ColumnWriter_vt *vt, bool mapped )
+{
+ if ( self == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcConstructing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad ColumnWriter" );
+ }
+ else
+ {
+ self -> vt = vt;
+ KRefcountInit ( & self -> refcount, 1, "ColumnWriter", "init", "" );
+ self -> mapped = mapped;
+ memset ( self -> align, 0, sizeof self -> align );
+ }
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * ColumnPair
+ * interface to pairing of source and destination columns
+ */
+
+/* Whack
+ */
+static
+void ColumnPairWhack ( ColumnPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnReaderRelease ( self -> reader, ctx );
+ ColumnWriterRelease ( self -> writer, ctx );
+ MemFree ( ctx, self, sizeof * self + self -> full_spec_size );
+}
+
+/* MakeColumnPair
+ * make a simple ColumnPair
+ * takes an optional source VCursor
+ * and a colspec
+ */
+ColumnPair *TablePairMakeColumnPair ( TablePair *self, const ctx_t *ctx,
+ ColumnReader *reader, ColumnWriter *writer, const char *colspec, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col;
+ size_t full_spec_size = self -> full_spec_size + string_size ( colspec ) + 1;
+
+ TRY ( col = MemAlloc ( ctx, sizeof * col + full_spec_size, false ) )
+ {
+ TRY ( col -> reader = ColumnReaderDuplicate ( reader, ctx ) )
+ {
+ TRY ( col -> writer = ColumnWriterDuplicate ( writer, ctx ) )
+ {
+ rc_t rc;
+
+ col -> full_spec_size = full_spec_size;
+ KRefcountInit ( & col -> refcount, 1, "ColumnPair", "make", colspec );
+ col -> is_static = false;
+ col -> is_mapped = writer -> mapped;
+ col -> presorted = reader -> presorted;
+ col -> large = large;
+
+ rc = string_printf ( col -> full_spec, full_spec_size + 1, NULL,
+ "%s.%s", self -> full_spec, colspec );
+ if ( rc == 0 )
+ {
+ col -> colspec = & col -> full_spec [ self -> full_spec_size + 1 ];
+ return col;
+ }
+
+ ABORT ( rc, "miscalculated string size" );
+ }
+
+ ColumnReaderRelease ( col -> reader, ctx );
+ }
+
+ MemFree ( ctx, col, sizeof * col + full_spec_size );
+ }
+
+ return NULL;
+}
+
+ColumnPair *TablePairMakeStaticColumnPair ( TablePair *self, const ctx_t *ctx,
+ ColumnReader *reader, ColumnWriter *writer, const char *colspec )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col;
+
+ TRY ( col = TablePairMakeColumnPair ( self, ctx, reader, writer, colspec, false ) )
+ {
+ if ( col != NULL )
+ col -> is_static = true;
+ }
+
+ return col;
+}
+
+
+/* Release
+ * called by table at end of copy
+ */
+void ColumnPairRelease ( ColumnPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "ColumnPair" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ColumnPairWhack ( self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcColumn, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release ColumnPair" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+ColumnPair *ColumnPairDuplicate ( const ColumnPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "ColumnPair" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcColumn, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate ColumnPair" );
+ return NULL;
+ }
+ }
+
+ return ( ColumnPair* ) self;
+}
+
+
+/* PreCopy
+ * PostCopy
+ */
+void ColumnPairPreCopy ( const ColumnPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnReaderPreCopy ( self -> reader, ctx );
+ ColumnWriterPreCopy ( self -> writer, ctx );
+}
+
+void ColumnPairPostCopy ( const ColumnPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnReaderPostCopy ( self -> reader, ctx );
+ ColumnWriterPostCopy ( self -> writer, ctx );
+}
+
+
+/* Copy
+ * copy from source to destination column
+ */
+void ColumnPairCopy ( ColumnPair *self, const ctx_t *ctx, RowSet *rs )
+{
+ FUNC_ENTRY ( ctx );
+
+ STATUS ( 3, "copying column '%s'", self -> full_spec );
+
+ TRY ( RowSetReset ( rs, ctx, self -> is_static ) )
+ {
+ TRY ( ColumnPairPreCopy ( self, ctx ) )
+ {
+ while ( ! FAILED () )
+ {
+ rc_t rc;
+ size_t i, count;
+ int64_t row_ids [ 8 * 1024 ];
+
+ ON_FAIL ( count = RowSetNext ( rs, ctx, row_ids, sizeof row_ids / sizeof row_ids [ 0 ] ) )
+ break;
+ if ( count == 0 )
+ break;
+
+ rc = Quitting ();
+ if ( rc != 0 )
+ {
+ INFO_ERROR ( rc, "quitting" );
+ break;
+ }
+
+ for ( i = 0; ! FAILED () && i < count; ++ i )
+ {
+ const void *base;
+ uint32_t elem_bits, boff, row_len;
+
+ TRY ( base = ColumnReaderRead ( self -> reader, ctx, row_ids [ i ], & elem_bits, & boff, & row_len ) )
+ {
+ ColumnWriterWrite ( self -> writer, ctx, elem_bits, base, boff, row_len );
+ }
+ }
+ }
+
+ ColumnPairPostCopy ( self, ctx );
+ }
+ }
+}
+
+
+/* CopyStatic
+ * copy static column from source to destination
+ */
+void ColumnPairCopyStatic ( ColumnPair *self, const ctx_t *ctx, int64_t first_id, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const void *base;
+ uint32_t elem_bits, boff, row_len;
+
+ if ( ! self -> is_static )
+ {
+ rc = RC ( rcExe, rcColumn, rcCopying, rcType, rcIncorrect );
+ INTERNAL_ERROR ( rc, "'%s' IS NOT A STATIC COLUMN", self -> full_spec );
+ return;
+ }
+
+ STATUS ( 3, "copying static column '%s'", self -> full_spec );
+
+ TRY ( base = ColumnReaderRead ( self -> reader, ctx, first_id, & elem_bits, & boff, & row_len ) )
+ {
+ ColumnWriterWriteStatic ( self -> writer, ctx, elem_bits, base, boff, row_len, count );
+ }
+}
diff --git a/tools/sra-sort/col-pair.h b/tools/sra-sort/col-pair.h
new file mode 100644
index 0000000..b14df08
--- /dev/null
+++ b/tools/sra-sort/col-pair.h
@@ -0,0 +1,323 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_col_pair_
+#define _h_sra_sort_col_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VCursor;
+struct TablePair;
+struct RowSet;
+
+
+/*--------------------------------------------------------------------------
+ * ColumnReader
+ * interface to read column in random order
+ */
+typedef struct ColumnReader_vt ColumnReader_vt;
+
+typedef struct ColumnReader ColumnReader;
+struct ColumnReader
+{
+ const ColumnReader_vt *vt;
+ KRefcount refcount;
+ bool presorted;
+ uint8_t align [ 3 ];
+};
+
+#ifndef COLREADER_IMPL
+#define COLREADER_IMPL ColumnReader
+#endif
+
+struct ColumnReader_vt
+{
+ /* called by Release */
+ void ( * whack ) ( COLREADER_IMPL *self, const ctx_t *ctx );
+
+ /* full spec */
+ const char* ( * full_spec ) ( const COLREADER_IMPL *self, const ctx_t *ctx );
+
+ /* id-range */
+ uint64_t ( * id_range ) ( const COLREADER_IMPL *self, const ctx_t *ctx, int64_t *opt_first );
+
+ /* pre-post copy handlers */
+ void ( * pre_copy ) ( COLREADER_IMPL *self, const ctx_t *ctx );
+ void ( * post_copy ) ( COLREADER_IMPL *self, const ctx_t *ctx );
+
+ /* retrieve next source row */
+ const void* ( * read ) ( COLREADER_IMPL *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len );
+};
+
+
+/* MakeColumnReader
+ * make simple column reader
+ */
+ColumnReader *TablePairMakeColumnReader ( struct TablePair *self, const ctx_t *ctx,
+ struct VCursor const *opt_curs, const char *colspec, bool required );
+
+
+/* Release
+ * releases reference
+ */
+void ColumnReaderRelease ( const ColumnReader *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+ColumnReader *ColumnReaderDuplicate ( const ColumnReader *self, const ctx_t *ctx );
+
+
+/* FullSpec
+ * returns 'src.<tbl>.<colspec>'
+ */
+#define ColumnReaderFullSpec( self, ctx ) \
+ POLY_DISPATCH_PTR ( full_spec, self, const COLREADER_IMPL, ctx )
+
+
+/* IdRange
+ * returns the number of ids available
+ * and optionally the first id
+ */
+#define ColumnReaderIdRange( self, ctx, opt_first ) \
+ POLY_DISPATCH_INT ( id_range, self, const COLREADER_IMPL, ctx, opt_first )
+
+
+/* PreCopy
+ * PostCopy
+ * handlers for any operations
+ */
+#define ColumnReaderPreCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( pre_copy, self, COLREADER_IMPL, ctx )
+#define ColumnReaderPostCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( post_copy, self, COLREADER_IMPL, ctx )
+
+
+/* Read
+ * read next row of data
+ * returns NULL if no rows are available
+ */
+#define ColumnReaderRead( self, ctx, row_id, elem_bits, boff, row_len ) \
+ POLY_DISPATCH_PTR ( read, self, COLREADER_IMPL, ctx, row_id, elem_bits, boff, row_len )
+
+
+/* Init
+ */
+void ColumnReaderInit ( ColumnReader *self, const ctx_t *ctx, const ColumnReader_vt *vt );
+
+/* Destroy
+ */
+#define ColumnReaderDestroy( self, ctx ) \
+ ( ( void ) 0 )
+
+
+/*--------------------------------------------------------------------------
+ * ColumnWriter
+ * interface to write column in serial order
+ */
+typedef struct ColumnWriter_vt ColumnWriter_vt;
+
+typedef struct ColumnWriter ColumnWriter;
+struct ColumnWriter
+{
+ const ColumnWriter_vt *vt;
+ KRefcount refcount;
+ bool mapped;
+ uint8_t align [ 3 ];
+};
+
+#ifndef COLWRITER_IMPL
+#define COLWRITER_IMPL ColumnWriter
+#endif
+
+struct ColumnWriter_vt
+{
+ /* called by Release */
+ void ( * whack ) ( COLWRITER_IMPL *self, const ctx_t *ctx );
+
+ /* full spec */
+ const char* ( * full_spec ) ( const COLWRITER_IMPL *self, const ctx_t *ctx );
+
+ /* pre-post copy handlers */
+ void ( * pre_copy ) ( COLWRITER_IMPL *self, const ctx_t *ctx );
+ void ( * post_copy ) ( COLWRITER_IMPL *self, const ctx_t *ctx );
+
+ /* write row to destination */
+ void ( * write ) ( COLWRITER_IMPL *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len );
+ void ( * write_static ) ( COLWRITER_IMPL *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count );
+
+ /* commit all writes */
+ void ( * commit ) ( COLWRITER_IMPL *self, const ctx_t *ctx );
+};
+
+
+/* MakeColumnWriter
+ * make simple column writer
+ */
+ColumnWriter *TablePairMakeColumnWriter ( struct TablePair *self, const ctx_t *ctx,
+ struct VCursor *opt_curs, const char *colspec );
+
+
+/* Release
+ * releases reference
+ */
+void ColumnWriterRelease ( ColumnWriter *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+ColumnWriter *ColumnWriterDuplicate ( const ColumnWriter *self, const ctx_t *ctx );
+
+
+/* FullSpec
+ * returns 'dst.<tbl>.<colspec>'
+ */
+#define ColumnWriterFullSpec( self, ctx ) \
+ POLY_DISPATCH_PTR ( full_spec, self, const COLWRITER_IMPL, ctx )
+
+
+/* PreCopy
+ * PostCopy
+ * handlers for any operations
+ */
+#define ColumnWriterPreCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( pre_copy, self, COLWRITER_IMPL, ctx )
+#define ColumnWriterPostCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( post_copy, self, COLWRITER_IMPL, ctx )
+
+
+/* Write
+ * write a row of data
+ */
+#define ColumnWriterWrite( self, ctx, elem_bits, data, boff, row_len ) \
+ POLY_DISPATCH_VOID ( write, self, COLWRITER_IMPL, ctx, elem_bits, data, boff, row_len )
+
+/* WriteStatic
+ * writes a repeated row
+ */
+#define ColumnWriterWriteStatic( self, ctx, elem_bits, data, boff, row_len, count ) \
+ POLY_DISPATCH_VOID ( write_static, self, COLWRITER_IMPL, ctx, elem_bits, data, boff, row_len, count )
+
+
+/* Commit
+ * commits all writes
+ */
+#define ColumnWriterCommit( self, ctx ) \
+ POLY_DISPATCH_VOID ( commit, self, COLWRITER_IMPL, ctx )
+
+
+/* Init
+ */
+void ColumnWriterInit ( ColumnWriter *self, const ctx_t *ctx,
+ const ColumnWriter_vt *vt, bool mapped );
+
+/* Destroy
+ */
+#define ColumnWriterDestroy( self, ctx ) \
+ ( ( void ) 0 )
+
+
+/*--------------------------------------------------------------------------
+ * ColumnPair
+ * interface to pairing of source and destination columns
+ */
+typedef struct ColumnPair ColumnPair;
+struct ColumnPair
+{
+ ColumnReader *reader;
+ ColumnWriter *writer;
+
+ const char *colspec;
+
+ size_t full_spec_size;
+
+ KRefcount refcount;
+
+ bool is_static;
+
+ bool is_mapped;
+
+ bool presorted;
+
+ bool large;
+
+ char full_spec [ 1 ];
+};
+
+
+/* MakeColumnPair
+ * make a simple ColumnPair
+ * takes an optional source VCursor
+ * and a colspec
+ */
+ColumnPair *TablePairMakeColumnPair ( struct TablePair *self, const ctx_t *ctx,
+ ColumnReader *reader, ColumnWriter *writer, const char *colspec, bool large );
+
+ColumnPair *TablePairMakeStaticColumnPair ( struct TablePair *self, const ctx_t *ctx,
+ ColumnReader *reader, ColumnWriter *writer, const char *colspec );
+
+
+/* Release
+ * called by table at end of copy
+ */
+void ColumnPairRelease ( ColumnPair *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+ColumnPair *ColumnPairDuplicate ( const ColumnPair *self, const ctx_t *ctx );
+
+
+/* PreCopy
+ * PostCopy
+ */
+void ColumnPairPreCopy ( const ColumnPair *self, const ctx_t *ctx );
+void ColumnPairPostCopy ( const ColumnPair *self, const ctx_t *ctx );
+
+
+/* Copy
+ * copy from source to destination column
+ */
+void ColumnPairCopy ( ColumnPair *self, const ctx_t *ctx, struct RowSet *rs );
+
+
+/* CopyStatic
+ * copy static column from source to destination
+ */
+void ColumnPairCopyStatic ( ColumnPair *self, const ctx_t *ctx, int64_t first_id, uint64_t count );
+
+
+#endif /* _h_sra_sort_col_pair_ */
diff --git a/tools/sra-sort/csra-pair.c b/tools/sra-sort/csra-pair.c
new file mode 100644
index 0000000..f58d9ff
--- /dev/null
+++ b/tools/sra-sort/csra-pair.c
@@ -0,0 +1,228 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct cSRAPair;
+#define DBPAIR_IMPL struct cSRAPair
+
+#include "csra-pair.h"
+#include "csra-tbl.h"
+#include "meta-pair.h"
+#include "dir-pair.h"
+#include "sra-sort.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "map-file.h"
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( csra-pair );
+
+
+/*--------------------------------------------------------------------------
+ * cSRAPair
+ */
+
+static
+void cSRAPairWhack ( cSRAPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* destroy me */
+ MapFileRelease ( self -> seq_idx, ctx );
+ MapFileRelease ( self -> sa_idx, ctx );
+ MapFileRelease ( self -> pa_idx, ctx );
+
+ DbPairDestroy ( & self -> dad, ctx );
+
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+TablePair *cSRAPairMakeTablePair ( cSRAPair *self, const ctx_t *ctx,
+ const char *member, const char *name, uint32_t align_idx, bool required, bool reorder,
+ TablePair* ( * make ) ( DbPair *self, const ctx_t *ctx, const VTable *src, VTable *dst, const char *name, bool reorder ) )
+{
+ FUNC_ENTRY ( ctx );
+
+ TablePair *tbl;
+
+ if ( name == NULL )
+ name = member;
+
+ TRY ( tbl = DbPairMakeTablePair ( & self -> dad, ctx, member, name, required, reorder, make ) )
+ {
+ if ( tbl != NULL )
+ {
+ TRY ( DbPairAddTablePair ( & self -> dad, ctx, tbl ) )
+ {
+ ( ( cSRATblPair* ) tbl ) -> align_idx = align_idx;
+ return tbl;
+ }
+
+ TablePairRelease ( tbl, ctx );
+ }
+ }
+
+ return NULL;
+}
+
+static
+void cSRAPairExplode ( cSRAPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ DirPair * dir;
+ TablePair * tbl;
+
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, "REFERENCE", NULL, 0, true, false, cSRATblPairMakeRef ) )
+ {
+ self -> reference = tbl;
+
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, "PRIMARY_ALIGNMENT", NULL, 1, true, true, cSRATblPairMakeAlign ) )
+ {
+ self -> prim_align = tbl;
+
+#if SEQUENCE_BEFORE_SECONDARY
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, NULL, "SEQUENCE", 0, false, true, cSRATblPairMakeSeq ) )
+ {
+ self -> sequence = tbl;
+#endif
+
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, "SECONDARY_ALIGNMENT", NULL, 2, false, true, cSRATblPairMakeAlign ) )
+ {
+ self -> sec_align = tbl;
+
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, NULL, "EVIDENCE_ALIGNMENT", 3, false, false, cSRATblPairMakeAlign ) )
+ {
+ self -> evidence_align = tbl;
+
+#if ! SEQUENCE_BEFORE_SECONDARY
+ TRY ( tbl = cSRAPairMakeTablePair ( self, ctx, NULL, "SEQUENCE", 0, false, true, cSRATblPairMakeSeq ) )
+ {
+ self -> sequence = tbl;
+#endif
+
+ TRY ( dir = DbPairMakeDirPair ( & self -> dad, ctx, "extra", false, DbPairMakeStdDirPair ) )
+ {
+ ON_FAIL ( DbPairAddDirPair ( & self -> dad, ctx, dir ) )
+ DirPairRelease ( dir, ctx );
+ }
+#if ! SEQUENCE_BEFORE_SECONDARY
+ }
+#endif
+ }
+ }
+#if SEQUENCE_BEFORE_SECONDARY
+ }
+#endif
+ }
+ }
+}
+
+static
+const char *cSRAPairGetTblMember ( const cSRAPair *self, const ctx_t *ctx, const VTable *src, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* special kludge for "SEQUENCE" table */
+ if ( strcmp ( name, "SEQUENCE" ) == 0 )
+ {
+ /* determine whether table has CMP_CSREAD */
+ rc_t rc;
+ const VCursor *curs;
+
+ STATUS ( 4, "determining member name of SEQUENCE table" );
+
+ rc = VTableCreateCursorRead ( src, & curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableOpenCursorRead failed on '%s.%s'", self -> dad . full_spec, name );
+ else
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn ( curs, & idx, "CMP_CSREAD" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( curs );
+ if ( rc == 0 )
+ name = "CS_SEQUENCE";
+ }
+
+ VCursorRelease ( curs );
+ }
+
+ STATUS ( 4, "SEQUENCE table member name determined to be '%s'", name );
+ }
+
+ return name;
+}
+
+static DbPair_vt cSRAPair_vt =
+{
+ cSRAPairWhack,
+ cSRAPairExplode,
+ cSRAPairGetTblMember
+};
+
+DbPair *cSRAPairMake ( const ctx_t *ctx,
+ const VDatabase *src, VDatabase *dst, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *db;
+
+ TRY ( db = MemAlloc ( ctx, sizeof * db, true ) )
+ {
+ TRY ( DbPairInit ( & db -> dad, ctx, & cSRAPair_vt, src, dst, name, NULL ) )
+ {
+ static const char *exclude_tbls [] =
+ {
+ "EVIDENCE_ALIGNMENT",
+ "PRIMARY_ALIGNMENT",
+ "REFERENCE",
+ "SECONDARY_ALIGNMENT",
+ "SEQUENCE"
+ };
+ db -> dad . exclude_tbls = exclude_tbls;
+
+ return & db -> dad;
+ }
+
+ MemFree ( ctx, db, sizeof * db );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/csra-pair.h b/tools/sra-sort/csra-pair.h
new file mode 100644
index 0000000..48791d0
--- /dev/null
+++ b/tools/sra-sort/csra-pair.h
@@ -0,0 +1,87 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_csra_pair_
+#define _h_sra_sort_csra_pair_
+
+#ifndef _h_sra_sort_db_pair_
+#include "db-pair.h"
+#endif
+
+
+#define SEQUENCE_BEFORE_SECONDARY 1
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct TablePair;
+struct ColumnWriter;
+
+
+/*--------------------------------------------------------------------------
+ * cSRAPair
+ * interface to pairing of source and destination tables
+ */
+typedef struct cSRAPair cSRAPair;
+struct cSRAPair
+{
+ DbPair dad;
+
+ /* for ultimate metadata */
+ int64_t first_half_aligned_spot;
+ int64_t first_unaligned_spot;
+
+ /* the reference table */
+ struct TablePair *reference;
+
+ /* the alignment tables */
+ struct TablePair *prim_align, *sec_align, *evidence_align;
+
+ /* the sequence table */
+ struct TablePair *sequence;
+
+ /* mapping indices */
+ struct MapFile *pa_idx, *sa_idx, *seq_idx;
+};
+
+
+/* Make
+ * makes an object based upon open source and destination VDatabase objects
+ */
+DbPair *cSRAPairMake ( const ctx_t *ctx,
+ struct VDatabase const *src, struct VDatabase *dst, const char *name );
+
+
+/* MakeFirstHalfAlignedRowIdCaptureWriter
+ * a simple monitor on SEQUENCE.PRIMARY_ALIGNMENT_ID looking for
+ * half-aligned spots and capturing the first occurrence.
+ */
+struct ColumnWriter *cSRAPairMakeFirstHalfAlignedRowIdCaptureWriter ( cSRAPair *self,
+ const ctx_t *ctx, struct ColumnWriter *writer );
+
+
+#endif /* _h_sra_sort_csra_pair_ */
diff --git a/tools/sra-sort/csra-tbl.c b/tools/sra-sort/csra-tbl.c
new file mode 100644
index 0000000..5b3401a
--- /dev/null
+++ b/tools/sra-sort/csra-tbl.c
@@ -0,0 +1,798 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct cSRATblPair;
+#define TBLPAIR_IMPL struct cSRATblPair
+
+#include "csra-tbl.h"
+#include "csra-pair.h"
+#include "ref-alignid-col.h"
+#include "row-set.h"
+#include "id-mapper-col.h"
+#include "buff-writer.h"
+#include "poslen-col-pair.h"
+#include "meta-pair.h"
+#include "map-file.h"
+#include "xcheck.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <vdb/table.h>
+#include <kdb/meta.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( csra-tbl );
+
+
+/*--------------------------------------------------------------------------
+ * RefTblPair
+ * generic database object pair
+ */
+
+static
+void cSRATblPairWhack ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ RowSetIteratorRelease ( self -> rsi, ctx );
+ TablePairDestroy ( & self -> dad, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+void cSRATblPairDummyStub ( cSRATblPair *self, const ctx_t *ctx )
+{
+}
+
+
+/* REFERENCE table
+ */
+static
+ColumnPair *cSRATblPairMakePrimAlignIdColPair ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ cSRAPair *csra = self -> csra;
+
+ ColumnReader *reader;
+ const char *colspec = "(I64)PRIMARY_ALIGNMENT_IDS";
+
+ TRY ( reader = TablePairMakeAlignIdReader ( & self -> dad, ctx,
+ csra -> prim_align, csra -> pa_idx, colspec ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, writer, colspec, false );
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+
+ return col;
+}
+
+static
+ColumnPair *cSRATblPairMakeSecAlignIdColPair ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ cSRAPair *csra = self -> csra;
+
+ if ( csra -> sec_align != NULL )
+ {
+ ColumnReader *reader;
+ const char *colspec = "(I64)SECONDARY_ALIGNMENT_IDS";
+
+ TRY ( reader = TablePairMakeAlignIdReader ( & self -> dad, ctx,
+ csra -> sec_align, csra -> sa_idx, colspec ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, writer, colspec, false );
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+ }
+
+ return col;
+}
+
+static
+void cSRATblPairExplodeRef ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col;
+
+ TRY ( col = cSRATblPairMakePrimAlignIdColPair ( self, ctx ) )
+ {
+ TRY ( TablePairAddColumnPair ( & self -> dad, ctx, col ) )
+ {
+ TRY ( col = cSRATblPairMakeSecAlignIdColPair ( self, ctx ) )
+ {
+ TRY ( TablePairAddColumnPair ( & self -> dad, ctx, col ) )
+ {
+ }
+ CATCH_ALL ()
+ {
+ ColumnPairRelease ( col, ctx );
+ }
+ }
+ }
+ CATCH_ALL ()
+ {
+ ColumnPairRelease ( col, ctx );
+ }
+ }
+}
+
+static
+ColumnPair *cSRATblPairMakeColumnPairRef ( cSRATblPair *self, const ctx_t *ctx,
+ struct ColumnReader *reader, struct ColumnWriter *writer, const char *colspec, bool large )
+{
+ FUNC_ENTRY ( ctx );
+ return TablePairMakeColumnPair ( & self -> dad, ctx, reader, writer, colspec, large );
+}
+
+static
+RowSetIterator *cSRATblPairGetRowSetIteratorRef ( cSRATblPair *self, const ctx_t *ctx, bool mapping, bool large )
+{
+ FUNC_ENTRY ( ctx );
+ const bool is_paired = false;
+ assert ( mapping == false );
+ return TablePairMakeRowSetIterator ( & self -> dad, ctx, NULL, is_paired, large );
+}
+
+static TablePair_vt cSRATblPair_Ref_vt =
+{
+ cSRATblPairWhack,
+ cSRATblPairDummyStub,
+ cSRATblPairExplodeRef,
+ cSRATblPairMakeColumnPairRef,
+ cSRATblPairDummyStub,
+ cSRATblPairDummyStub,
+ cSRATblPairGetRowSetIteratorRef
+};
+
+
+
+/* *_ALIGNMENT tables
+ */
+
+static
+void cSRATblPairWhackMappingIdx ( cSRATblPair * self, const ctx_t * ctx )
+{
+ cSRAPair *csra = self -> csra;
+
+ RowSetIteratorRelease ( self -> rsi, ctx );
+ self -> rsi = NULL;
+
+ MapFileRelease ( csra -> pa_idx, ctx );
+ csra -> pa_idx = NULL;
+
+ MapFileRelease ( csra -> seq_idx, ctx );
+ csra -> seq_idx = NULL;
+}
+
+static
+ColumnPair *cSRATblPairMakeSeqSpotIdColPairPrim ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ cSRAPair *csra = self -> csra;
+
+ ColumnReader *reader;
+ const char *colspec = "(I64)SEQ_SPOT_ID";
+
+ /* we expect this column to be present */
+ TRY ( reader = TablePairMakeColumnReader ( & self -> dad, ctx, NULL, colspec, true ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ ColumnWriter *mapped;
+ const bool can_assign_ids = true;
+ TRY ( mapped = TablePairMakeMapRowIdWriter ( & self -> dad, ctx, writer, csra -> seq_idx, can_assign_ids ) )
+ {
+ ColumnWriter *buffered;
+ TRY ( buffered = cSRATblPairMakeBufferedColumnWriter ( self, ctx, mapped ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, buffered, colspec, false );
+
+ ColumnWriterRelease ( buffered, ctx );
+ }
+
+ ColumnWriterRelease ( mapped, ctx );
+ }
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+
+ return col;
+}
+
+static
+ColumnPair *cSRATblPairMakeSeqSpotIdColPair ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ cSRAPair *csra = self -> csra;
+
+ ColumnReader *reader;
+ const char *colspec = "(I64)SEQ_SPOT_ID";
+
+ /* we expect this column to be present */
+ TRY ( reader = TablePairMakeColumnReader ( & self -> dad, ctx, NULL, colspec, true ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ ColumnWriter *buffered;
+ /* create a buffered writer with NO id-assignment capabilities. */
+ TRY ( buffered = cSRATblPairMakeBufferedIdRemapColumnWriter ( self, ctx,
+ writer, csra -> seq_idx, false ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, buffered, colspec, false );
+
+ ColumnWriterRelease ( buffered, ctx );
+ }
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+
+ return col;
+}
+
+static
+ColumnPair *cSRATblPairMakePoslenColPair ( cSRATblPair *self, const ctx_t *ctx, const MapFile *idx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+
+ ColumnReader *reader;
+ const char *colspec = "(U64)GLOBAL_POSLEN";
+
+ /* we expect this column to be present */
+ TRY ( reader = TablePairMakePoslenColReader ( & self -> dad, ctx, idx, colspec ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakePoslenColWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, writer, colspec, false );
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+
+ return col;
+}
+
+static
+void cSRATblPairPreExplodeAlign ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ cSRAPair *csra = self -> csra;
+
+ switch ( self -> align_idx )
+ {
+ case 1:
+ csra -> pa_idx = MapFileMakeForPoslen ( ctx, csra -> prim_align -> name );
+ break;
+ case 2:
+ csra -> sa_idx = MapFileMakeForPoslen ( ctx, csra -> sec_align -> name );
+ break;
+ }
+}
+
+static
+void cSRATblPairExplodeAlign ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col;
+
+ /* create special case for SEQ_SPOT_ID */
+ switch ( self -> align_idx )
+ {
+ case 1:
+ col = cSRATblPairMakeSeqSpotIdColPairPrim ( self, ctx );
+ break;
+ case 0:
+ case 2:
+ case 3:
+ col = cSRATblPairMakeSeqSpotIdColPair ( self, ctx );
+ break;
+ default:
+ ANNOTATE ( "not going to dignify with an rc - bad align_idx" );
+ return;
+ }
+
+ if ( ! FAILED () )
+ {
+ TRY ( TablePairAddColumnPair ( & self -> dad, ctx, col ) )
+ {
+ cSRAPair *csra = self -> csra;
+
+ switch ( self -> align_idx )
+ {
+ case 1:
+ col = cSRATblPairMakePoslenColPair ( self, ctx, csra -> pa_idx );
+ break;
+ case 2:
+ col = cSRATblPairMakePoslenColPair ( self, ctx, csra -> sa_idx );
+ break;
+ default:
+ return;
+ }
+
+ if ( ! FAILED () )
+ {
+ TRY ( TablePairAddColumnPair ( & self -> dad, ctx, col ) )
+ {
+ return;
+ }
+ }
+ }
+
+ ColumnPairRelease ( col, ctx );
+ }
+}
+
+static
+ColumnPair *cSRATblPairMakeColumnPairAlign ( cSRATblPair *self, const ctx_t *ctx,
+ struct ColumnReader *reader, struct ColumnWriter *writer, const char *colspec, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ MapFile *idx = NULL;
+ ColumnPair *col = NULL;
+ ColumnWriter *buffered;
+
+ switch ( self -> align_idx )
+ {
+ case 0:
+ case 3:
+ return TablePairMakeColumnPair ( & self -> dad, ctx, reader, writer, colspec, large );
+ case 1:
+ case 2:
+ {
+ /* look for special MATE_ALIGN_ID column */
+ const char *colname = strrchr ( colspec, ')' );
+ if ( colname ++ == NULL )
+ colname = colspec;
+ if ( strcmp ( colname, "MATE_ALIGN_ID" ) == 0 )
+ {
+ cSRAPair *csra = self -> csra;
+ idx = self -> align_idx == 1 ? csra -> pa_idx : csra -> sa_idx;
+ }
+ break;
+ }
+
+ default:
+ ANNOTATE ( "not going to dignify with an rc - bad align_idx" );
+ return NULL;
+ }
+
+ /* create a buffer on writer, possibly with mapping */
+ buffered = ( idx != NULL ) ?
+ /* create a buffered mapping writer but WITHOUT id assignment capabilities */
+ cSRATblPairMakeBufferedIdRemapColumnWriter ( self, ctx, writer, idx, false ):
+ /* create a normal buffered writer */
+ cSRATblPairMakeBufferedColumnWriter ( self, ctx, writer );
+
+ if ( ! FAILED () )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, buffered, colspec, large );
+ ColumnWriterRelease ( buffered, ctx );
+ }
+
+ return col;
+}
+
+static
+void cSRATblPairPostCopyAlign ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *csra = self -> csra;
+
+ RowSetIteratorRelease ( self -> rsi, ctx );
+ self -> rsi = NULL;
+
+ if ( self -> align_idx == 2 )
+ {
+ MapFileRelease ( self -> csra -> sa_idx, ctx );
+ self -> csra -> sa_idx = NULL;
+ }
+
+ switch ( self -> align_idx )
+ {
+ case 1:
+ CrossCheckRefAlignTbl ( ctx, csra -> reference -> dtbl, csra -> prim_align -> dtbl, "PRIMARY_ALIGNMENT" );
+ break;
+ case 2:
+ CrossCheckRefAlignTbl ( ctx, csra -> reference -> dtbl, csra -> sec_align -> dtbl, "SECONDARY_ALIGNMENT" );
+
+#if SEQUENCE_BEFORE_SECONDARY
+ cSRATblPairWhackMappingIdx ( self, ctx );
+#endif
+
+ break;
+ }
+}
+
+static
+RowSetIterator *cSRATblPairGetRowSetIteratorAlign ( cSRATblPair *self, const ctx_t *ctx, bool mapping, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ TRY ( RowSetIteratorRelease ( self -> rsi, ctx ) )
+ {
+ cSRAPair *csra = self -> csra;
+ MapFile *idx = self -> align_idx == 1 ? csra -> pa_idx : csra -> sa_idx;
+ TRY ( self -> rsi = TablePairMakeRowSetIterator ( & self -> dad, ctx, idx, mapping, large ) )
+ {
+ return RowSetIteratorDuplicate ( self -> rsi, ctx );
+ }
+ }
+
+ return NULL;
+}
+
+
+static TablePair_vt cSRATblPair_Align_vt =
+{
+ cSRATblPairWhack,
+ cSRATblPairPreExplodeAlign,
+ cSRATblPairExplodeAlign,
+ cSRATblPairMakeColumnPairAlign,
+ cSRATblPairDummyStub,
+ cSRATblPairPostCopyAlign,
+ cSRATblPairGetRowSetIteratorAlign
+};
+
+
+
+/* SEQUENCE table
+ */
+
+static
+ColumnPair *cSRATblPairMakeSeqPrimAlignIdColPair ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ cSRAPair *csra = self -> csra;
+
+
+ ColumnReader *reader;
+ const char *colspec = "(I64)PRIMARY_ALIGNMENT_ID";
+
+ /* this column may not be present if there are no alignments */
+ TRY ( reader = TablePairMakeColumnReader ( & self -> dad, ctx, NULL, colspec, false ) )
+ {
+ if ( reader != NULL )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( & self -> dad, ctx, NULL, colspec ) )
+ {
+ ColumnWriter *capture;
+ TRY ( capture = cSRAPairMakeFirstHalfAlignedRowIdCaptureWriter ( csra, ctx, writer ) )
+ {
+ ColumnWriter *buffered;
+
+ /* create a buffered writer WITHOUT id-assignment capabilities. */
+ TRY ( buffered = cSRATblPairMakeBufferedIdRemapColumnWriter ( self, ctx,
+ capture, csra -> pa_idx, false ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, buffered, colspec, true );
+
+ ColumnWriterRelease ( buffered, ctx );
+ }
+
+ ColumnWriterRelease ( capture, ctx );
+ }
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+ }
+
+ return col;
+}
+
+static
+void cSRATblPairPreExplodeSeq ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ TRY ( TablePairExplode ( & self -> dad, ctx ) )
+ {
+ cSRAPair *csra = self -> csra;
+ TRY ( csra -> seq_idx = MapFileMake ( ctx, self -> dad . name, true ) )
+ {
+ TRY ( MapFileSetIdRange ( csra -> seq_idx, ctx, self -> dad . first_id,
+ self -> dad . last_excl - self -> dad . first_id ) )
+ {
+ ColumnPair *col;
+
+ /* create special case for PRIMARY_ALIGNMENT_ID */
+ TRY ( col = cSRATblPairMakeSeqPrimAlignIdColPair ( self, ctx ) )
+ {
+ TablePairAddColumnPair ( & self -> dad, ctx, col );
+ }
+ }
+ }
+ }
+}
+
+static
+ColumnPair *cSRATblPairMakeColumnPairSeq ( cSRATblPair *self, const ctx_t *ctx,
+ struct ColumnReader *reader, struct ColumnWriter *writer, const char *colspec, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnPair *col = NULL;
+ ColumnWriter *buffered;
+
+ TRY ( buffered = cSRATblPairMakeBufferedColumnWriter ( self, ctx, writer ) )
+ {
+ col = TablePairMakeColumnPair ( & self -> dad, ctx, reader, buffered, colspec, large );
+ ColumnWriterRelease ( buffered, ctx );
+ }
+
+ return col;
+}
+
+static
+void cSRATblPairPreCopySeq ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *csra = self -> csra;
+
+ STATUS ( 3, "assigning new row-ids to unaligned sequences" );
+ csra -> first_unaligned_spot = MapFileAllocMissingNewIds ( self -> csra -> seq_idx, ctx );
+}
+
+static
+void cSRATblPairPostCopySeq ( cSRATblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRAPair *csra = self -> csra;
+
+#if ! SEQUENCE_BEFORE_SECONDARY
+ cSRATblPairWhackMappingIdx ( self, ctx );
+#endif
+
+ /* record markers in metadata */
+ if ( ! FAILED () && ( csra -> first_half_aligned_spot != 0 || csra -> first_unaligned_spot != 0 ) )
+ {
+ MetaPair *meta = self -> dad . meta;
+ KMDataNode *unaligned_node;
+ const char *node_path = "unaligned";
+ rc_t rc = KMetadataOpenNodeUpdate ( meta -> dmeta, & unaligned_node, "%s", node_path );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMetadataOpenNodeUpdate failed to open '%s'", node_path );
+ else
+ {
+ KMDataNode *node;
+ if ( csra -> first_half_aligned_spot != 0 )
+ {
+ node_path = "first-half-aligned";
+ rc = KMDataNodeOpenNodeUpdate ( unaligned_node, & node, "%s", node_path );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeOpenNodeUpdate failed to open 'unaligned/%s'", node_path );
+ else
+ {
+ rc = KMDataNodeWriteB64 ( node, & csra -> first_half_aligned_spot );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeWriteB64 failed to write 'unaligned/%s'", node_path );
+
+ KMDataNodeRelease ( node );
+ }
+ }
+
+ if ( ! FAILED () && csra -> first_unaligned_spot != 0 )
+ {
+ node_path = "first-unaligned";
+ rc = KMDataNodeOpenNodeUpdate ( unaligned_node, & node, "%s", node_path );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeOpenNodeUpdate failed to open 'unaligned/%s'", node_path );
+ else
+ {
+ rc = KMDataNodeWriteB64 ( node, & csra -> first_unaligned_spot );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeWriteB64 failed to write 'unaligned/%s'", node_path );
+
+ KMDataNodeRelease ( node );
+ }
+ }
+
+ KMDataNodeRelease ( unaligned_node );
+ }
+ }
+}
+
+static
+RowSetIterator *cSRATblPairGetRowSetIteratorSeq ( cSRATblPair *self, const ctx_t *ctx, bool mapping, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ TRY ( RowSetIteratorRelease ( self -> rsi, ctx ) )
+ {
+ cSRAPair *csra = self -> csra;
+ TRY ( self -> rsi = TablePairMakeRowSetIterator ( & self -> dad, ctx, csra -> seq_idx, mapping, large ) )
+ {
+ return RowSetIteratorDuplicate ( self -> rsi, ctx );
+ }
+ }
+
+ return NULL;
+}
+
+static TablePair_vt cSRATblPair_Seq_vt =
+{
+ cSRATblPairWhack,
+ cSRATblPairPreExplodeSeq,
+ cSRATblPairDummyStub,
+ cSRATblPairMakeColumnPairSeq,
+ cSRATblPairPreCopySeq,
+ cSRATblPairPostCopySeq,
+ cSRATblPairGetRowSetIteratorSeq
+};
+
+
+
+/* Init
+ * common initialization code
+ */
+static
+void cSRATblPairInit ( void *self, cSRATblPair *tbl )
+{
+ tbl -> csra = self;
+ tbl -> rsi = NULL;
+ tbl -> align_idx = 0;
+}
+
+
+/* MakeRef
+ * special cased for REFERENCE table
+ */
+TablePair *cSRATblPairMakeRef ( DbPair *self, const ctx_t *ctx,
+ const VTable *src, VTable *dst, const char *name, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRATblPair *tbl;
+
+ TRY ( tbl = MemAlloc ( ctx, sizeof * tbl, false ) )
+ {
+ TRY ( TablePairInit ( & tbl -> dad, ctx, & cSRATblPair_Ref_vt, src, dst, name, self -> full_spec, reorder ) )
+ {
+ static const char *exclude_cols [] = { "PRIMARY_ALIGNMENT_IDS", "SECONDARY_ALIGNMENT_IDS", "READ", "SPOT_GROUP", NULL };
+ static const char *nonstatic_cols [] = { "NAME", NULL };
+ tbl -> dad . exclude_col_names = exclude_cols;
+ tbl -> dad . nonstatic_col_names = nonstatic_cols;
+ cSRATblPairInit ( self, tbl );
+ return & tbl -> dad;
+ }
+
+ MemFree ( ctx, tbl, sizeof * tbl );
+ }
+
+ return NULL;
+}
+
+
+/* MakeAlign
+ * special cased for *_ALIGNMENT tables
+ */
+TablePair *cSRATblPairMakeAlign ( DbPair *self, const ctx_t *ctx,
+ const VTable *src, VTable *dst, const char *name, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRATblPair *tbl;
+
+ TRY ( tbl = MemAlloc ( ctx, sizeof * tbl, false ) )
+ {
+ TRY ( TablePairInit ( & tbl -> dad, ctx, & cSRATblPair_Align_vt, src, dst, name, self -> full_spec, reorder ) )
+ {
+ static const char *exclude_cols [] = { "GLOBAL_REF_START", "READ_LEN", "REF_ID", "REF_START", "REF_LEN", "SEQ_SPOT_ID", NULL };
+ static const char *unsorted_exclude_cols [] = { "READ_LEN", "SEQ_SPOT_ID", NULL };
+ tbl -> dad . exclude_col_names = reorder ? exclude_cols : unsorted_exclude_cols;
+ cSRATblPairInit ( self, tbl );
+ return & tbl -> dad;
+ }
+
+ MemFree ( ctx, tbl, sizeof * tbl );
+ }
+
+ return NULL;
+}
+
+
+/* MakeSeq
+ * special cased for SEQUENCE table
+ */
+TablePair *cSRATblPairMakeSeq ( DbPair *self, const ctx_t *ctx,
+ const VTable *src, VTable *dst, const char *name, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+
+ cSRATblPair *tbl;
+
+ TRY ( tbl = MemAlloc ( ctx, sizeof * tbl, false ) )
+ {
+ TRY ( TablePairInit ( & tbl -> dad, ctx, & cSRATblPair_Seq_vt, src, dst, name, self -> full_spec, reorder ) )
+ {
+ static const char *exclude_cols [] = { "PRIMARY_ALIGNMENT_ID", NULL };
+ static const char *nonstatic_cols [] = { "NAME_FMT", NULL };
+ static const char *large_cols [] = { "CMP_READ", "QUALITY", NULL };
+ static const char *exclude_meta [] = { "unaligned", NULL };
+ tbl -> dad . exclude_col_names = exclude_cols;
+ tbl -> dad . nonstatic_col_names = nonstatic_cols;
+ tbl -> dad . large_col_names = large_cols;
+ tbl -> dad . exclude_meta = exclude_meta;
+ cSRATblPairInit ( self, tbl );
+ return & tbl -> dad;
+ }
+
+ MemFree ( ctx, tbl, sizeof * tbl );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/csra-tbl.h b/tools/sra-sort/csra-tbl.h
new file mode 100644
index 0000000..7eae0b2
--- /dev/null
+++ b/tools/sra-sort/csra-tbl.h
@@ -0,0 +1,83 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_csra_tbl_
+#define _h_sra_sort_csra_tbl_
+
+#ifndef _h_sra_sort_tbl_pair_
+#include "tbl-pair.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct cSRAPair;
+struct RowSetIterator;
+
+
+/*--------------------------------------------------------------------------
+ * cSRATblPair
+ * interface to pairing of source and destination tables
+ */
+typedef struct cSRATblPair cSRATblPair;
+struct cSRATblPair
+{
+ TablePair dad;
+
+ /* database */
+ struct cSRAPair *csra;
+
+ /* special rowset iterator */
+ struct RowSetIterator *rsi;
+
+ /* if an alignment table, which one? */
+ uint32_t align_idx;
+};
+
+
+/* MakeRef
+ * special cased for REFERENCE table
+ */
+TablePair *cSRATblPairMakeRef ( struct DbPair *self, const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst, const char *name, bool reorder );
+
+
+/* MakeAlign
+ * special cased for *_ALIGNMENT tables
+ */
+TablePair *cSRATblPairMakeAlign ( struct DbPair *self, const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst, const char *name, bool reorder );
+
+
+/* MakeSeq
+ * special cased for SEQUENCE table
+ */
+TablePair *cSRATblPairMakeSeq ( struct DbPair *self, const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst, const char *name, bool reorder );
+
+
+#endif /* _h_sra_sort_csra_tbl_ */
diff --git a/tools/sra-sort/ctx.h b/tools/sra-sort/ctx.h
new file mode 100644
index 0000000..cfd4275
--- /dev/null
+++ b/tools/sra-sort/ctx.h
@@ -0,0 +1,109 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_ctx_
+#define _h_sra_sort_ctx_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct Caps;
+
+
+/*--------------------------------------------------------------------------
+ * file entry
+ * modified from vdb-3 to not place requirements on Makefile
+ */
+#if ! defined __mod__ && ! defined __file__
+#define FILE_ENTRY( __file_name__ ) \
+ static const char __mod__ [] = "tools/sra-sort"; \
+ static const char __file__ [] = STRINGIZE_DEFINE ( __file_name__ )
+#else
+#define FILE_ENTRY( __file_name__ ) /* already defined */
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * ctx_info_t
+ */
+typedef struct ctx_info_t ctx_info_t;
+struct ctx_info_t
+{
+ const char *mod;
+ const char *file;
+ const char *func;
+};
+
+#define DECLARE_CTX_INFO() \
+ static ctx_info_t ctx_info = { __mod__, __file__, __func__ }
+
+
+/*--------------------------------------------------------------------------
+ * ctx_t
+ * modified from vdb-3
+ */
+struct ctx_t
+{
+ struct Caps const *caps;
+ const ctx_t *caller;
+ const ctx_info_t *info;
+ volatile rc_t rc;
+};
+
+
+/* INIT
+ * initialize local context block
+ */
+static __inline__
+const ctx_t ctx_init ( ctx_t *new_ctx, const ctx_t **ctxp, const ctx_info_t *info )
+{
+ const ctx_t *ctx = * ctxp;
+ ctx_t local_ctx = { ctx -> caps, ctx, info };
+ * ctxp = new_ctx;
+ return local_ctx;
+}
+
+
+/* FUNC_ENTRY
+ */
+#define FUNC_ENTRY( ctx ) \
+ DECLARE_CTX_INFO (); \
+ ctx_t local_ctx = ctx_init ( & local_ctx, & ( ctx ), & ctx_info )
+
+
+/* POP_CTX
+ * intended to have VERY specific usage
+ */
+#define POP_CTX( ctx ) \
+ ctx = ctx -> caller
+
+
+#endif
diff --git a/tools/sra-sort/db-pair.c b/tools/sra-sort/db-pair.c
new file mode 100644
index 0000000..7be477d
--- /dev/null
+++ b/tools/sra-sort/db-pair.c
@@ -0,0 +1,885 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct DbPair StdDbPair;
+#define DBPAIR_IMPL StdDbPair
+
+#include "db-pair.h"
+#include "csra-pair.h"
+#include "tbl-pair.h"
+#include "dir-pair.h"
+#include "meta-pair.h"
+#include "sra-sort.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/database.h>
+#include <kdb/meta.h>
+#include <kdb/kdb-priv.h>
+#include <kfs/directory.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( db-pair );
+
+
+/*--------------------------------------------------------------------------
+ * StdDbPair
+ * generic database object pair
+ */
+
+static
+void StdDbPairWhack ( StdDbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ DbPairDestroy ( self, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+void StdDbPairExplode ( StdDbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+}
+
+static
+const char *StdDbPairGetTblMember ( const StdDbPair *self, const ctx_t *ctx, const VTable *src, const char *name )
+{
+ return name;
+}
+
+static DbPair_vt StdDbPair_vt =
+{
+ StdDbPairWhack,
+ StdDbPairExplode,
+ StdDbPairGetTblMember
+};
+
+static
+DbPair *StdDbPairMake ( const ctx_t *ctx,
+ const VDatabase *src, VDatabase *dst, const char *name, const char *opt_full_spec )
+{
+ FUNC_ENTRY ( ctx );
+
+ StdDbPair *db;
+
+ TRY ( db = MemAlloc ( ctx, sizeof * db, false ) )
+ {
+ TRY ( DbPairInit ( db, ctx, & StdDbPair_vt, src, dst, name, opt_full_spec ) )
+ {
+ return db;
+ }
+
+ MemFree ( ctx, db, sizeof * db );
+ }
+
+ return NULL;
+}
+
+/*--------------------------------------------------------------------------
+ * DbPair
+ * interface code
+ */
+
+
+/* Make
+ * makes an object based upon open source and destination VDatabase objects
+ */
+static
+bool is_csra_db ( const VDatabase *src, const ctx_t *ctx )
+{
+ /* TBD - hack'o-matic */
+ return true;
+}
+
+DbPair *DbPairMake ( const ctx_t *ctx,
+ const VDatabase *src, VDatabase *dst, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* intercept certain types of databases - right now cSRA */
+ if ( is_csra_db ( src, ctx ) )
+ return cSRAPairMake ( ctx, src, dst, name );
+
+ return StdDbPairMake ( ctx, src, dst, name, NULL );
+}
+
+DbPair *DbPairMakeStdDbPair ( DbPair *self, const ctx_t *ctx,
+ const VDatabase *src, VDatabase *dst, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+ return StdDbPairMake ( ctx, src, dst, name, self -> full_spec );
+}
+
+
+/* Release
+ */
+void DbPairRelease ( DbPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "DbPair" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcDatabase, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release DbPair" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+DbPair *DbPairDuplicate ( DbPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "DbPair" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcDatabase, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate DbPair" );
+ return NULL;
+ }
+ }
+
+ return ( DbPair* ) self;
+}
+
+
+/* Copy
+ */
+static
+bool CC DbPairCopyDbPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TRY ( DbPairCopy ( item, ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+static
+bool CC DbPairCopyTablePair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TRY ( TablePairCopy ( item, ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+static
+bool CC DbPairCopyDirPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TRY ( DirPairCopy ( item, ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+void DbPairCopy ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ STATUS ( 2, "copying database '%s'", self -> full_spec );
+
+ /* copy metadata */
+ MetaPairCopy ( self -> meta, ctx, self -> full_spec, self -> exclude_meta );
+
+ /* copy all child databases */
+ if ( ! FAILED () && VectorLength ( & self -> dbs ) != 0 )
+ {
+ STATUS ( 2, "copying '%s' sub-databases", self -> full_spec );
+ VectorDoUntil ( & self -> dbs, false, DbPairCopyDbPair, ( void* ) ctx );
+ }
+
+ /* now we should be able to copy each table */
+ if ( ! FAILED () && VectorLength ( & self -> tbls ) != 0 )
+ {
+ STATUS ( 2, "copying '%s' tables", self -> full_spec );
+ VectorDoUntil ( & self -> tbls, false, DbPairCopyTablePair, ( void* ) ctx );
+ }
+
+ /* copy any directories - extra */
+ if ( ! FAILED () && VectorLength ( & self -> dirs ) != 0 )
+ {
+ STATUS ( 2, "copying '%s' directories", self -> full_spec );
+ VectorDoUntil ( & self -> dirs, false, DbPairCopyDirPair, ( void* ) ctx );
+ }
+}
+
+
+/* Explode
+ * probably a bad name, but it is intended to mean
+ * register all enclosed tables and databases
+ * and create a proper pair of KMetadata
+ */
+static
+MetaPair *DbPairExplodeMetaPair ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ MetaPair *meta = NULL;
+ const KMetadata *smeta;
+
+ rc = VDatabaseOpenMetadataRead ( self -> sdb, & smeta );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseOpenMetadataRead failed on 'src.%s'", self -> full_spec );
+ else
+ {
+ KMetadata *dmeta;
+ rc = VDatabaseOpenMetadataUpdate ( self -> ddb, & dmeta );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseOpenMetadataUpdate failed on 'dst.%s'", self -> full_spec );
+ else
+ {
+ meta = MetaPairMake ( ctx, smeta, dmeta, self -> full_spec );
+
+ KMetadataRelease ( dmeta );
+ }
+
+ KMetadataRelease ( smeta );
+ }
+
+ return meta;
+}
+
+static
+void DbPairExplode ( DbPair *self, const ctx_t *ctx );
+
+static
+bool CC DbPairExplodeDbPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TRY ( DbPairExplode ( item, ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+static
+bool CC DbPairPreExplodeTablePair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TRY ( TablePairPreExplode ( ( ( TablePair* ) item ), ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+#if 0
+static
+void DbPairDefaultExplodeDB ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ KNamelist *names;
+
+ rc = VDatabaseListDB ( self -> sdb, & names );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseListDB failed listing '%s' databases", self -> full_spec );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "KNamelistCount failed listing '%s' databases", self -> full_spec );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; ! FAILED () && i < count; ++ i )
+ {
+ DbPair *db;
+
+ const char *name;
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "KNamelistGet ( %u ) failed listing '%s' databases", i, self -> full_spec );
+ break;
+ }
+
+ if ( self -> exclude_dbs != NULL )
+ {
+ uint32_t j;
+ for ( j = 0; self -> exclude_dbs [ j ] != NULL; ++ j )
+ {
+ if ( strcmp ( name, self -> exclude_dbs [ j ] ) == 0 )
+ {
+ name = NULL;
+ break;
+ }
+ }
+ if ( name == NULL )
+ continue;
+ }
+
+ TRY ( db = DbPairMakeDbPair ( self, ctx, name, name, true, DbPairMakeStdDbPair ) )
+ {
+ ON_FAIL ( DbPairAddDbPair ( self, ctx, db ) )
+ {
+ DbPairRelease ( db, ctx );
+ }
+ }
+ }
+ }
+
+ KNamelistRelease ( names );
+ }
+}
+#endif
+
+static
+void DbPairDefaultExplodeTbl ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ KNamelist *names;
+
+ rc = VDatabaseListTbl ( self -> sdb, & names );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseListTbl failed listing '%s' tables", self -> full_spec );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "KNamelistCount failed listing '%s' tables", self -> full_spec );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; ! FAILED () && i < count; ++ i )
+ {
+ TablePair *tbl;
+
+ const char *name;
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "KNamelistGet ( %u ) failed listing '%s' tables", i, self -> full_spec );
+ break;
+ }
+
+ if ( self -> exclude_tbls != NULL )
+ {
+ uint32_t j;
+ for ( j = 0; self -> exclude_tbls [ j ] != NULL; ++ j )
+ {
+ if ( strcmp ( name, self -> exclude_tbls [ j ] ) == 0 )
+ {
+ name = NULL;
+ break;
+ }
+ }
+ if ( name == NULL )
+ continue;
+ }
+
+ TRY ( tbl = DbPairMakeTablePair ( self, ctx, name, name, true, false, DbPairMakeStdTblPair ) )
+ {
+ ON_FAIL ( DbPairAddTablePair ( self, ctx, tbl ) )
+ {
+ TablePairRelease ( tbl, ctx );
+ }
+ }
+ }
+ }
+
+ KNamelistRelease ( names );
+ }
+}
+
+static
+void DbPairDefaultExplode ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+#if 0
+ TRY ( DbPairDefaultExplodeDB ( self, ctx ) )
+#endif
+ {
+ DbPairDefaultExplodeTbl ( self, ctx );
+ }
+}
+
+static
+void DbPairExplode ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ STATUS ( 2, "exploding database '%s'", self -> full_spec );
+
+ /* first, ask subclass to perform explicit explode */
+ if ( self == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcDatabase, rcAccessing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad DbPair" );
+ }
+ else
+ {
+ TRY ( ( * self -> vt -> explode ) ( self, ctx ) )
+ {
+ /* next, perform default self-explode for all dbs, tbls not excluded */
+ TRY ( DbPairDefaultExplode ( self, ctx ) )
+ {
+ /* now create metadata pair */
+ if ( self -> meta == NULL )
+ self -> meta = DbPairExplodeMetaPair ( self, ctx );
+ if ( ! FAILED () )
+ {
+ /* now explode all child dbs, tbls */
+ TRY ( VectorDoUntil ( & self -> dbs, false, DbPairExplodeDbPair, ( void* ) ctx ) )
+ {
+ VectorDoUntil ( & self -> tbls, false, DbPairPreExplodeTablePair, ( void* ) ctx );
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/* Run
+ */
+void DbPairRun ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ const Tool *tp = ctx -> caps -> tool;
+
+ STATUS ( 1, "input database is '%s'", tp -> src_path );
+ STATUS ( 1, "output database is '%s'", tp -> dst_path );
+
+ /* the first thing to do is to explode the database
+ to create sub-dbs, sub-tables, and metadata */
+ TRY ( DbPairExplode ( self, ctx ) )
+ {
+ /* now copy */
+ DbPairCopy ( self, ctx );
+ }
+
+ if ( FAILED () )
+ STATUS ( 1, "failed processing database '%s'", self -> full_spec );
+ else
+ STATUS ( 1, "finished processing database '%s'", self -> full_spec );
+}
+
+
+/* MakeDbPair
+ */
+DbPair *DbPairMakeDbPair ( DbPair *self, const ctx_t *ctx, const char *member, const char *name, bool required,
+ DbPair* ( * make ) ( DbPair *self, const ctx_t *ctx, const VDatabase *src, VDatabase *dst, const char *name ) )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const VDatabase *src;
+ DbPair *db = NULL;
+
+ STATUS ( 4, "creating db pair '%s.%s'", self -> full_spec, name );
+ rc = VDatabaseOpenDBRead ( self -> sdb, & src, "%s", name );
+ if ( rc != 0 )
+ {
+ if ( required )
+ ERROR ( rc, "VDatabaseOpenDBRead: failed to open db '%s.%s'", self -> full_spec, name );
+ else
+ STATUS ( 4, "optional db '%s.%s' was not opened", self -> full_spec, name );
+ }
+ else
+ {
+#if 0
+ if ( member == NULL )
+ member = DbPairGetTblMember ( self, ctx, src, name );
+#endif
+
+ if ( ! FAILED () )
+ {
+ VDatabase *dst;
+ const Tool *tp = ctx -> caps -> tool;
+ rc = VDatabaseCreateDB ( self -> ddb, & dst, member, kcmOpen | ( tp -> db . cmode & kcmMD5 ), "%s", name );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseCreateDB: failed to create %s db '%s.%s'", member, self -> full_spec, name );
+ else
+ {
+ db = ( * make ) ( self, ctx, src, dst, name );
+
+ VDatabaseRelease ( dst );
+ }
+ }
+
+ VDatabaseRelease ( src );
+ }
+
+ return db;
+}
+
+
+/* MakeTablePair
+ */
+TablePair *DbPairMakeTablePair ( DbPair *self, const ctx_t *ctx, const char *member, const char *name, bool required, bool reorder,
+ TablePair* ( * make ) ( DbPair *self, const ctx_t *ctx, const VTable *src, VTable *dst, const char *name, bool reorder ) )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const VTable *src;
+ TablePair *tbl = NULL;
+
+ STATUS ( 4, "creating table pair '%s.%s'", self -> full_spec, name );
+ rc = VDatabaseOpenTableRead ( self -> sdb, & src, "%s", name );
+ if ( rc != 0 )
+ {
+ if ( required )
+ ERROR ( rc, "VDatabaseOpenTableRead: failed to open table '%s.%s'", self -> full_spec, name );
+ else
+ STATUS ( 4, "optional table '%s.%s' was not opened", self -> full_spec, name );
+ }
+ else
+ {
+ if ( member == NULL )
+ member = DbPairGetTblMember ( self, ctx, src, name );
+
+ if ( ! FAILED () )
+ {
+ VTable *dst;
+ const Tool *tp = ctx -> caps -> tool;
+ rc = VDatabaseCreateTable ( self -> ddb, & dst, member, kcmOpen | ( tp -> db . cmode & kcmMD5 ), "%s", name );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseCreateTable: failed to create %s table '%s.%s'", member, self -> full_spec, name );
+ else
+ {
+ tbl = ( * make ) ( self, ctx, src, dst, name, reorder );
+
+ VTableRelease ( dst );
+ }
+ }
+
+ VTableRelease ( src );
+ }
+
+ return tbl;
+}
+
+
+/* AddDbPair
+ * called from implementations
+ */
+void DbPairAddDbPair ( DbPair *self, const ctx_t *ctx, DbPair *db )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ STATUS ( 4, "adding db pair '%s'", db -> full_spec );
+ rc = VectorAppend ( & self -> dbs, NULL, ( const void* ) db );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to add db pair '%s'", db -> full_spec );
+}
+
+
+/* AddTablePair
+ * called from implementations
+ */
+void DbPairAddTablePair ( DbPair *self, const ctx_t *ctx, TablePair *tbl )
+{
+ if ( tbl != NULL )
+ {
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ STATUS ( 4, "adding table pair '%s'", tbl -> full_spec );
+ rc = VectorAppend ( & self -> tbls, NULL, ( const void* ) tbl );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to add table pair '%s'", tbl -> full_spec );
+ }
+}
+
+
+/* MakeDirPair
+ */
+DirPair *DbPairMakeDirPair ( DbPair *self, const ctx_t *ctx, const char *name, bool required,
+ DirPair* ( * make ) ( DbPair *self, const ctx_t *ctx, const KDirectory *src, KDirectory *dst, const char *name ) )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ DirPair *dir = NULL;
+ const KDatabase *sdb;
+
+ STATUS ( 4, "creating directory pair '%s./%s'", self -> full_spec, name );
+
+ rc = VDatabaseOpenKDatabaseRead ( self -> sdb, & sdb );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VDatabaseOpenKDatabaseRead: failed to access KDatabase 'src.%s'", self -> full_spec );
+ else
+ {
+ KDatabase *ddb;
+ rc = VDatabaseOpenKDatabaseUpdate ( self -> ddb, & ddb );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VDatabaseOpenKDatabaseUpdate: failed to access KDatabase 'dst.%s'", self -> full_spec );
+ else
+ {
+ const KDirectory *sdir;
+ rc = KDatabaseOpenDirectoryRead ( sdb, & sdir );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KDatabaseOpenDirectoryRead: failed to access KDirectory 'src.%s'", self -> full_spec );
+ else
+ {
+ KDirectory *ddir;
+ rc = KDatabaseOpenDirectoryUpdate ( ddb, & ddir );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KDatabaseOpenDirectoryUpdate: failed to access KDirectory 'dst.%s'", self -> full_spec );
+ else
+ {
+ switch ( KDirectoryPathType ( sdir, "%s", name ) )
+ {
+ case kptNotFound:
+ if ( required )
+ {
+ rc = RC ( rcExe, rcDirectory, rcOpening, rcPath, rcNotFound );
+ ERROR ( rc, "required directory 'src.%s./%s' does not exist", self -> full_spec, name );
+ }
+ break;
+
+ case kptBadPath:
+ rc = RC ( rcExe, rcDirectory, rcOpening, rcPath, rcInvalid );
+ INTERNAL_ERROR ( rc, "directory path 'src.%s./%s' is invalid", self -> full_spec, name );
+ break;
+
+ case kptDir:
+ case kptDir | kptAlias:
+ {
+ dir = ( * make ) ( self, ctx, sdir, ddir, name );
+ break;
+ }
+
+ default:
+ rc = RC ( rcExe, rcDirectory, rcOpening, rcPath, rcIncorrect );
+ INTERNAL_ERROR ( rc, "directory path 'src.%s./%s' is not a directory", self -> full_spec, name );
+ }
+
+ KDirectoryRelease ( ddir );
+ }
+
+ KDirectoryRelease ( sdir );
+ }
+
+ KDatabaseRelease ( ddb );
+ }
+
+ KDatabaseRelease ( sdb );
+ }
+
+ return dir;
+}
+
+
+/* AddDirPair
+ * called from implementations
+ */
+void DbPairAddDirPair ( DbPair *self, const ctx_t *ctx, struct DirPair *dir )
+{
+ if ( dir != NULL )
+ {
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ STATUS ( 4, "adding directory pair '%s'", dir -> full_spec );
+ rc = VectorAppend ( & self -> dirs, NULL, ( const void* ) dir );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to add directory pair '%s'", dir -> full_spec );
+ }
+}
+
+
+/* Init
+ */
+void DbPairInit ( DbPair *self, const ctx_t *ctx, const DbPair_vt *vt,
+ const VDatabase *src, VDatabase *dst, const char *name, const char *opt_full_spec )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcDatabase, rcConstructing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad DbPair" );
+ return;
+ }
+
+ memset ( self, 0, sizeof * self );
+ self -> vt = vt;
+ VectorInit ( & self -> dbs, 0, 4 );
+ VectorInit ( & self -> tbls, 0, 8 );
+ VectorInit ( & self -> dirs, 0, 8 );
+
+ if ( opt_full_spec == NULL )
+ opt_full_spec = "";
+
+ rc = VDatabaseAddRef ( self -> sdb = src );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate db 'src.%s%s%s'", opt_full_spec, opt_full_spec [ 0 ] ? "." : "", name );
+ else
+ {
+ rc = VDatabaseAddRef ( self -> ddb = dst );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate db 'dst.%s%s%s'", opt_full_spec, opt_full_spec [ 0 ] ? "." : "", name );
+ else
+ {
+ char *full_spec;
+
+ self -> full_spec_size = string_size ( opt_full_spec ) + string_size ( name );
+ if ( opt_full_spec [ 0 ] != 0 )
+ ++ self -> full_spec_size;
+
+ TRY ( full_spec = MemAlloc ( ctx, self -> full_spec_size + 1, false ) )
+ {
+ if ( opt_full_spec [ 0 ] != 0 )
+ rc = string_printf ( full_spec, self -> full_spec_size + 1, NULL, "%s.%s", opt_full_spec, name );
+ else
+ strcpy ( full_spec, name );
+ if ( rc != 0 )
+ ABORT ( rc, "miscalculated string size" );
+ else
+ {
+ static const char *no_exclude [] = { NULL };
+
+ self -> full_spec = full_spec;
+ self -> name = full_spec;
+ if ( opt_full_spec [ 0 ] != 0 )
+ self -> name += string_size ( opt_full_spec ) + 1;
+
+ self -> exclude_dbs = no_exclude;
+ self -> exclude_tbls = no_exclude;
+ self -> exclude_meta = no_exclude;
+
+ KRefcountInit ( & self -> refcount, 1, "DbPair", "init", name );
+ return;
+ }
+ }
+
+ VDatabaseRelease ( self -> ddb );
+ self -> ddb = NULL;
+ }
+
+ VDatabaseRelease ( self -> sdb );
+ self -> sdb = NULL;
+ }
+}
+
+/* Destroy
+ * destroys superclass items
+ */
+static
+void CC DbPairReleaseDbPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ DbPairRelease ( item, ctx );
+}
+
+static
+void CC DbPairReleaseTablePair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ TablePairRelease ( item, ctx );
+}
+
+static
+void CC DbPairReleaseDirPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ DirPairRelease ( item, ctx );
+}
+
+void DbPairDestroy ( DbPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ VectorWhack ( & self -> dbs, DbPairReleaseDbPair, ( void* ) ctx );
+ VectorWhack ( & self -> tbls, DbPairReleaseTablePair, ( void* ) ctx );
+ VectorWhack ( & self -> dirs, DbPairReleaseDirPair, ( void* ) ctx );
+
+ MetaPairRelease ( self -> meta, ctx );
+
+ rc = VDatabaseRelease ( self -> ddb );
+ if ( rc != 0 )
+ WARN ( "VDatabaseRelease failed on 'dst.%s'", self -> full_spec );
+ VDatabaseRelease ( self -> sdb );
+
+ MemFree ( ctx, ( void* ) self -> full_spec, self -> full_spec_size + 1 );
+
+ memset ( self, 0, sizeof * self );
+}
diff --git a/tools/sra-sort/db-pair.h b/tools/sra-sort/db-pair.h
new file mode 100644
index 0000000..94bf817
--- /dev/null
+++ b/tools/sra-sort/db-pair.h
@@ -0,0 +1,208 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_db_pair_
+#define _h_sra_sort_db_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KDirectory;
+struct VTable;
+struct VDatabase;
+struct TablePair;
+struct MetaPair;
+struct DirPair;
+
+
+/*--------------------------------------------------------------------------
+ * DbPair
+ * interface to pairing of source and destination tables
+ */
+typedef struct DbPair_vt DbPair_vt;
+
+typedef struct DbPair DbPair;
+struct DbPair
+{
+ /* polymorphic */
+ const DbPair_vt *vt;
+
+ /* the pair of VDatabases */
+ struct VDatabase const *sdb;
+ struct VDatabase *ddb;
+
+ /* the set of enclosed DbPairs */
+ Vector dbs;
+
+ /* the set of TablePairs */
+ Vector tbls;
+
+ /* the set of DirPairs */
+ Vector dirs;
+
+ /* the pair of KMetadata */
+ struct MetaPair *meta;
+
+ /* exclusions */
+ const char **exclude_dbs;
+ const char **exclude_tbls;
+ const char **exclude_meta;
+
+ /* simple db name */
+ const char *name;
+
+ /* full db spec */
+ size_t full_spec_size;
+ const char *full_spec;
+
+ /* reference counting */
+ KRefcount refcount;
+ uint32_t align;
+};
+
+#ifndef DBPAIR_IMPL
+#define DBPAIR_IMPL DbPair
+#endif
+
+struct DbPair_vt
+{
+ void ( * whack ) ( DBPAIR_IMPL *self, const ctx_t *ctx );
+ void ( * explode ) ( DBPAIR_IMPL *self, const ctx_t *ctx );
+ const char* ( * get_tbl_mbr ) ( const DBPAIR_IMPL *self, const ctx_t *ctx,
+ struct VTable const *src, const char *name );
+};
+
+
+/* Make
+ * makes an object based upon open source and destination VDatabase objects
+ */
+DbPair *DbPairMake ( const ctx_t *ctx,
+ struct VDatabase const *src, struct VDatabase *dst, const char *name );
+
+
+/* Release
+ */
+void DbPairRelease ( DbPair *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+DbPair *DbPairDuplicate ( DbPair *self, const ctx_t *ctx );
+
+
+/* Copy
+ * copy from source to destination
+ */
+void DbPairCopy ( DbPair *self, const ctx_t *ctx );
+
+
+/* Run
+ */
+void DbPairRun ( DbPair *self, const ctx_t *ctx );
+
+
+/* MakeDbPair
+ */
+DbPair *DbPairMakeDbPair ( DbPair *self, const ctx_t *ctx, const char *member, const char *name, bool required,
+ DbPair* ( * make ) ( DbPair *self, const ctx_t *ctx,
+ struct VDatabase const *src, struct VDatabase *dst, const char *name )
+ );
+
+DbPair *DbPairMakeStdDbPair ( struct DbPair *self, const ctx_t *ctx,
+ struct VDatabase const *src, struct VDatabase *dst, const char *name );
+
+
+/* MakeTablePair
+ */
+struct TablePair *DbPairMakeTablePair ( DbPair *self, const ctx_t *ctx,
+ const char *member, const char *name, bool required, bool reorder,
+ struct TablePair* ( * make ) ( DbPair *self, const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst, const char *name, bool reorder )
+ );
+
+
+/* GetTblMember
+ * v1 schema does not preserve member name with an object
+ * some schemas confuse types with the same name
+ */
+#define DbPairGetTblMember( self, ctx, src, name ) \
+ POLY_DISPATCH_PTR ( get_tbl_mbr, self, const DBPAIR_IMPL, ctx, src, name )
+
+
+/* AddDbPair
+ * called from implementations
+ */
+void DbPairAddDbPair ( DbPair *self, const ctx_t *ctx, DbPair *db );
+
+
+/* AddTablePair
+ * called from implementations
+ */
+void DbPairAddTablePair ( DbPair *self, const ctx_t *ctx, struct TablePair *tbl );
+
+
+/* MakeDirPair
+ */
+struct DirPair *DbPairMakeDirPair ( DbPair *self, const ctx_t *ctx, const char *name, bool required,
+ struct DirPair* ( * make ) ( DbPair *self, const ctx_t *ctx,
+ struct KDirectory const *src, struct KDirectory *dst, const char *name )
+ );
+
+
+/* AddDirPair
+ * called from implementations
+ */
+void DbPairAddDirPair ( DbPair *self, const ctx_t *ctx, struct DirPair *dir );
+
+
+/* Init
+ * initialize superclass with vt
+ * also db pair and name
+ * plus optional full-spec
+ */
+void DbPairInit ( DbPair *self, const ctx_t *ctx, const DbPair_vt *vt,
+ struct VDatabase const *src, struct VDatabase *dst,
+ const char *name, const char *opt_full_spec );
+
+/* Destroy
+ * destroys superclass items
+ */
+void DbPairDestroy ( DbPair *self, const ctx_t *ctx );
+
+
+#endif /* _h_sra_sort_db_pair_ */
diff --git a/tools/sra-sort/dir-pair.c b/tools/sra-sort/dir-pair.c
new file mode 100644
index 0000000..da46b74
--- /dev/null
+++ b/tools/sra-sort/dir-pair.c
@@ -0,0 +1,504 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct DirPair StdDirPair;
+#define DIRPAIR_IMPL StdDirPair
+
+#include "dir-pair.h"
+#include "db-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( dir-pair );
+
+
+static
+void StdDirPairWhack ( StdDirPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ DirPairDestroy ( self, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static DirPair_vt StdDirPair_vt =
+{
+ StdDirPairWhack
+};
+
+
+/* Make
+ * make a standard directory pair from existing KDirectory objects
+ */
+DirPair *DirPairMake ( const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst,
+ const char *name, const char *opt_full_spec )
+{
+ FUNC_ENTRY ( ctx );
+
+ StdDirPair *dir;
+
+ TRY ( dir = MemAlloc ( ctx, sizeof * dir, false ) )
+ {
+ TRY ( DirPairInit ( dir, ctx, & StdDirPair_vt, src, dst, name, opt_full_spec ) )
+ {
+ return dir;
+ }
+
+ MemFree ( ctx, dir, sizeof * dir );
+ }
+
+ return NULL;
+}
+
+
+DirPair *DbPairMakeStdDirPair ( DbPair *self, const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+ return DirPairMake ( ctx, src, dst, name, self -> full_spec );
+}
+
+
+/* Release
+ * called by db at end of copy
+ */
+void DirPairRelease ( DirPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "DirPair" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcDirectory, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release DirPair" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+DirPair *DirPairDuplicate ( DirPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "DirPair" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcDirectory, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate DirPair" );
+ return NULL;
+ }
+ }
+
+ return ( DirPair* ) self;
+}
+
+
+/* Copy
+ * copy from source to destination directory
+ */
+typedef struct DirPairCopyParams DirPairCopyParams;
+struct DirPairCopyParams
+{
+ const DirPair *self;
+ const ctx_t *ctx;
+ char *relpath;
+ size_t psize;
+ const KDirectory *src;
+ KDirectory *dst;
+};
+
+static
+rc_t DirPairCopyDir ( const DirPair *self, const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst, char *relpath, size_t psize );
+
+static
+rc_t DirPairCopyFile ( const DirPair *self, const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst, char *relpath )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* get source access mode */
+ uint32_t access;
+ rc_t rc = KDirectoryAccess ( src, & access, "%s", relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to determine access mode of file 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ KFile *d;
+ rc = KDirectoryCreateFile ( dst, & d, false, access, kcmInit | kcmParents, "%s", relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to create file 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ const KFile *s;
+ /* open source */
+ rc = KDirectoryOpenFileRead ( src, & s, "%s", relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to open file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ const KMMap *mm;
+ rc = KMMapMakeMaxRead ( & mm, s );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to map file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ uint64_t mm_pos;
+
+ /* get initial position and size */
+ rc = KMMapPosition ( mm, & mm_pos );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to determine position of map file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ size_t mm_size;
+ rc = KMMapSize ( mm, & mm_size );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to determine size of map file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else while ( mm_size != 0 )
+ {
+ size_t num_writ;
+ const void *mm_addr;
+
+ /* access address */
+ rc = KMMapAddrRead ( mm, & mm_addr );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to access address of map file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ break;
+ }
+
+ /* write region to output */
+ rc = KFileWriteAll ( d, mm_pos, mm_addr, mm_size, & num_writ );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to write to file 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ break;
+ }
+ if ( num_writ != mm_size )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ ERROR ( rc, "failed to write to file 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ break;
+ }
+
+ /* now try to shift region */
+ mm_pos += mm_size;
+ rc = KMMapReposition ( mm, mm_pos, & mm_size );
+ if ( rc != 0 )
+ {
+ if ( GetRCState ( rc ) == rcInvalid )
+ rc = 0;
+ else
+ {
+ ERROR ( rc, "failed to remap file 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ break;
+ }
+ }
+ }
+
+ KMMapRelease ( mm );
+ }
+
+ KFileRelease ( s );
+ }
+
+ KFileRelease ( d );
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t DirPairCopyAlias ( const DirPair *self, const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst, char *relpath )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+#if WINDOWS
+ rc = RC ( rcExe, rcAlias, rcCopying, rcFunction, rcUnsupported );
+ ERROR ( rc, "Windows... failed to create alias 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+#else
+ char apath [ 4096 ];
+
+ /* resolve the alias */
+ rc = KDirectoryResolveAlias ( src, false, apath, sizeof apath, "%s", relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to resolve alias 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ rc = KDirectoryCreateAlias ( dst, 0777, kcmInit, apath, relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to create alias 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ }
+#endif
+
+ return rc;
+}
+
+static
+rc_t CC DirPairCopyEntry ( const KDirectory *local, uint32_t type, const char *name, void *data )
+{
+ DirPairCopyParams *pb = data;
+ const ctx_t *ctx = pb -> ctx;
+
+ FUNC_ENTRY ( ctx );
+
+ const DirPair *self = pb -> self;
+ char *relpath = pb -> relpath;
+ size_t num_writ, psize = pb -> psize;
+
+ /* since we are walking two directories in parallel,
+ build a path relative to each base directory and go */
+ rc_t rc = string_printf ( & relpath [ psize ], 4096 - psize, & num_writ, "/%s", name );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to build path for entry '%.*s%.*s/%s'",
+ self -> owner_spec_size, self -> full_spec,
+ ( uint32_t ) psize, relpath, name );
+ return rc;
+ }
+
+ /* see what type of entry we have */
+ switch ( type )
+ {
+ case kptFile:
+ return DirPairCopyFile ( pb -> self, ctx, pb -> src, pb -> dst, relpath );
+ case kptDir:
+ return DirPairCopyDir ( pb -> self, ctx, pb -> src, pb -> dst, relpath, psize + num_writ );
+ case kptFile | kptAlias:
+ case kptDir | kptAlias:
+ return DirPairCopyAlias ( pb -> self, ctx, pb -> src, pb -> dst, relpath );
+ }
+
+ rc = RC ( rcExe, rcDirectory, rcVisiting, rcType, rcUnsupported );
+ ERROR ( rc, "cannot copy entry '%.*s%s' - not a supported file system type",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ return rc;
+}
+
+static
+rc_t DirPairCopyDir ( const DirPair *self, const ctx_t *ctx,
+ const KDirectory *src, KDirectory *dst, char *relpath, size_t psize )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* get source access mode */
+ uint32_t access;
+ rc_t rc = KDirectoryAccess ( src, & access, "%s", relpath );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "failed to determine access mode of directory 'src.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ }
+ else
+ {
+ /* create the destination directory */
+ rc = KDirectoryCreateDir ( dst, access, kcmOpen | kcmParents, "%s", relpath );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create directory 'dst.%.*s%s'",
+ self -> owner_spec_size, self -> full_spec, relpath );
+ else
+ {
+ DirPairCopyParams pb;
+
+ pb . self = self;
+ pb . ctx = ctx;
+ pb . relpath = relpath;
+ pb . psize = psize;
+ pb . src = src;
+ pb . dst = dst;
+
+ /* going to perform shallow copy */
+ rc = KDirectoryVisit ( src, false, DirPairCopyEntry, & pb, "%s", relpath );
+ }
+ }
+
+ return rc;
+}
+
+
+void DirPairCopy ( DirPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t psize;
+ char relpath [ 4096 ];
+
+ STATUS ( 2, "copying directory '%s'", self -> full_spec );
+
+ rc = string_printf ( relpath, sizeof relpath, & psize, "./%s", self -> name );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "failed to build initial path string for '%s'", self -> full_spec );
+ else
+ {
+ DirPairCopyDir ( self, ctx, self -> sdir, self -> ddir, relpath, psize );
+ }
+}
+
+
+/* Init
+ */
+void DirPairInit ( DirPair *self, const ctx_t *ctx, const DirPair_vt *vt,
+ const KDirectory *src, KDirectory *dst,
+ const char *name, const char *full_spec )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcDirectory, rcConstructing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad DirPair" );
+ return;
+ }
+
+ memset ( self, 0, sizeof * self );
+ self -> vt = vt;
+
+ rc = KDirectoryAddRef ( self -> sdir = src );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate dir 'src.%s./%s'", full_spec, name );
+ else
+ {
+ rc = KDirectoryAddRef ( self -> ddir = dst );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate dir 'dst.%s./%s'", full_spec, name );
+ else
+ {
+ char *new_full_spec;
+
+ self -> owner_spec_size = ( uint32_t ) string_size ( full_spec );
+ self -> full_spec_size = self -> owner_spec_size + string_size ( name ) + 2;
+
+ TRY ( new_full_spec = MemAlloc ( ctx, self -> full_spec_size + 1, false ) )
+ {
+ rc = string_printf ( new_full_spec, self -> full_spec_size + 1, NULL, "%s./%s", full_spec, name );
+ if ( rc != 0 )
+ ABORT ( rc, "miscalculated string size" );
+ else
+ {
+ self -> full_spec = new_full_spec;
+ self -> name = new_full_spec + self -> owner_spec_size + 2;
+
+ KRefcountInit ( & self -> refcount, 1, "DirPair", "init", name );
+ return;
+ }
+ }
+
+ KDirectoryRelease ( self -> ddir );
+ self -> ddir = NULL;
+ }
+
+ KDirectoryRelease ( self -> sdir );
+ self -> sdir = NULL;
+ }
+}
+
+/* Destroy
+ */
+void DirPairDestroy ( DirPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = KDirectoryRelease ( self -> ddir );
+ if ( rc != 0 )
+ WARN ( "KDirectoryRelease failed on 'dst.%s'", self -> full_spec );
+ KDirectoryRelease ( self -> sdir );
+
+ MemFree ( ctx, ( void* ) self -> full_spec, self -> full_spec_size + 1 );
+
+ memset ( self, 0, sizeof * self );
+}
diff --git a/tools/sra-sort/dir-pair.h b/tools/sra-sort/dir-pair.h
new file mode 100644
index 0000000..7bccb93
--- /dev/null
+++ b/tools/sra-sort/dir-pair.h
@@ -0,0 +1,124 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_dir_pair_
+#define _h_sra_sort_dir_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct DbPair;
+struct KDirectory;
+
+
+/*--------------------------------------------------------------------------
+ * DirPair
+ * interface to pairing of source and destination directories
+ */
+typedef struct DirPair_vt DirPair_vt;
+
+typedef struct DirPair DirPair;
+struct DirPair
+{
+ /* polymorphic */
+ const DirPair_vt *vt;
+
+ /* the pair of KDirectories */
+ struct KDirectory const *sdir;
+ struct KDirectory *ddir;
+
+ /* simple directory name */
+ const char *name;
+
+ /* full directory spec */
+ size_t full_spec_size;
+ const char *full_spec;
+
+ /* reference counting */
+ KRefcount refcount;
+
+ /* owner spec size */
+ uint32_t owner_spec_size;
+};
+
+#ifndef DIRPAIR_IMPL
+#define DIRPAIR_IMPL DirPair
+#endif
+
+struct DirPair_vt
+{
+ void ( * whack ) ( DIRPAIR_IMPL *self, const ctx_t *ctx );
+};
+
+
+/* Make
+ * make a standard directory pair from existing KDirectory objects
+ */
+DirPair *DirPairMake ( const ctx_t *ctx,
+ struct KDirectory const *src, struct KDirectory *dst,
+ const char *name, const char *full_spec );
+
+DirPair *DbPairMakeStdDirPair ( struct DbPair *self, const ctx_t *ctx,
+ struct KDirectory const *src, struct KDirectory *dst, const char *name );
+
+
+/* Release
+ * called by db at end of copy
+ */
+void DirPairRelease ( DirPair *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+DirPair *DirPairDuplicate ( DirPair *self, const ctx_t *ctx );
+
+
+/* Copy
+ * copy from source to destination directory
+ */
+void DirPairCopy ( DirPair *self, const ctx_t *ctx );
+
+
+/* Init
+ */
+void DirPairInit ( DirPair *self, const ctx_t *ctx, const DirPair_vt *vt,
+ struct KDirectory const *src, struct KDirectory *dst,
+ const char *name, const char *opt_full_spec );
+
+/* Destroy
+ */
+void DirPairDestroy ( DirPair *self, const ctx_t *ctx );
+
+
+#endif /* _h_sra_sort_dir_pair_ */
diff --git a/tools/sra-sort/dump-blob-boundaries.c b/tools/sra-sort/dump-blob-boundaries.c
new file mode 100644
index 0000000..76cef4e
--- /dev/null
+++ b/tools/sra-sort/dump-blob-boundaries.c
@@ -0,0 +1,203 @@
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/namelist.h>
+#include <klib/namelist.h>
+#include <klib/rc.h>
+
+#include <stdio.h>
+
+static int64_t blob_limit = 10;
+
+static
+uint32_t dump_col ( const KColumn *col, const char *dbname, const char *tblname, const char *colname )
+{
+ rc_t rc = 0;
+ int64_t row, first;
+ const KColumnBlob *blob;
+ uint32_t count, num_blobs;
+
+ for ( num_blobs = 0, row = 1; rc == 0 && num_blobs < blob_limit; ++ num_blobs, row = first + count )
+ {
+ rc = KColumnOpenBlobRead ( col, & blob, row );
+ if ( rc == 0 )
+ {
+ rc = KColumnBlobIdRange ( blob, & first, & count );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to get row-range for blob containing row '%s.%s.%s.%ld'\n", dbname, tblname, colname, row );
+ else
+ {
+ size_t num_read, remaining;
+ rc = KColumnBlobRead ( blob, 0, & first, 0, & num_read, & remaining );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to get size of blob containing row '%s.%s.%s.%ld'\n", dbname, tblname, colname, row );
+ else
+ {
+ printf ( " %ld .. %ld ( %u rows ), %zu bytes\n", first, first + count - 1, count, remaining );
+ }
+ }
+
+ KColumnBlobRelease ( blob );
+ }
+ else if ( GetRCState ( rc ) == rcNotFound )
+ return num_blobs;
+ else
+ {
+ fprintf ( stderr, "failed to open blob for row '%s.%s.%s.%ld'\n", dbname, tblname, colname, row );
+ }
+ }
+
+ for ( ; rc == 0; ++ num_blobs, row = first + count )
+ {
+ rc = KColumnOpenBlobRead ( col, & blob, row );
+ if ( rc == 0 )
+ {
+ rc = KColumnBlobIdRange ( blob, & first, & count );
+ KColumnBlobRelease ( blob );
+ }
+ }
+
+ return num_blobs;
+}
+
+static
+void dump_col_name ( const KTable *tbl, const char *dbname, const char *tblname, const char *colname )
+{
+ const KColumn *col;
+ rc_t rc = KTableOpenColumnRead ( tbl, & col, "%s", colname );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to open column '%s.%s.%s'\n", dbname, tblname, colname );
+ else
+ {
+ uint32_t num_blobs;
+ printf ( "COLUMN '%s.%s.%s'\n", dbname, tblname, colname );
+ num_blobs = dump_col ( col, dbname, tblname, colname );
+ KColumnRelease ( col );
+ if ( num_blobs > blob_limit )
+ printf ( " %u blobs in column\n", num_blobs );
+ }
+}
+
+static
+void dump_tbl ( const KTable *tbl, const char *tblname, int argc, char *argv [] )
+{
+ if ( argc >= 4 )
+ {
+ int i;
+ for ( i = 3; i < argc; ++ i )
+ {
+ dump_col_name ( tbl, argv [ 1 ], tblname, argv [ i ] );
+ }
+ }
+ else
+ {
+ KNamelist *names;
+ rc_t rc = KTableListCol ( tbl, & names );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to list columns for tbl '%s.%s'\n", argv [ 1 ], tblname );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to count columns for tbl '%s.%s'\n", argv [ 1 ], tblname );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count; ++ i )
+ {
+ const char *name;
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to access column name [ %u ] for tbl '%s.%s'\n", i, argv [ 1 ], tblname );
+ else
+ {
+ dump_col_name ( tbl, argv [ 1 ], tblname, name );
+ }
+ }
+ }
+
+ KNamelistRelease ( names );
+ }
+ }
+}
+
+static
+void dump_tbl_name ( const KDatabase *db, const char *tblname, int argc, char *argv [] )
+{
+ const KTable *tbl;
+ rc_t rc = KDatabaseOpenTableRead ( db, & tbl, "%s", tblname );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to open table '%s.%s'\n", argv [ 1 ], tblname );
+ else
+ {
+ dump_tbl ( tbl, tblname, argc, argv );
+ KTableRelease ( tbl );
+ }
+}
+
+static
+void dump_db ( const KDatabase *db, int argc, char *argv [] )
+{
+ if ( argc >= 3 )
+ dump_tbl_name ( db, argv [ 2 ], argc, argv );
+ else
+ {
+ KNamelist *names;
+ rc_t rc = KDatabaseListTbl ( db, & names );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to list tables for db '%s'\n", argv [ 1 ] );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to count tables for db '%s'\n", argv [ 1 ] );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count; ++ i )
+ {
+ const char *name;
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to access table name [ %u ] for db '%s'\n", i, argv [ 1 ] );
+ else
+ {
+ dump_tbl_name ( db, name, argc, argv );
+ }
+ }
+ }
+
+ KNamelistRelease ( names );
+ }
+ }
+}
+
+int main ( int argc, char *argv [] )
+{
+ if ( argc < 2 )
+ printf ( "Usage: %s database [ table [ col ... ] ]\n", argv [ 0 ] );
+ else
+ {
+ const KDBManager *mgr;
+ rc_t rc = KDBManagerMakeRead ( & mgr, NULL );
+ if ( rc == 0 )
+ {
+ const KDatabase *db;
+ rc = KDBManagerOpenDBRead ( mgr, & db, "%s", argv [ 1 ] );
+ if ( rc != 0 )
+ fprintf ( stderr, "failed to open database '%s'\n", argv [ 1 ] );
+ else
+ {
+ dump_db ( db, argc, argv );
+ KDatabaseRelease ( db );
+ }
+
+ KDBManagerRelease ( mgr );
+ }
+ }
+
+ return 0;
+}
diff --git a/tools/sra-sort/except.c b/tools/sra-sort/except.c
new file mode 100644
index 0000000..740f37c
--- /dev/null
+++ b/tools/sra-sort/except.c
@@ -0,0 +1,232 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "caps.h"
+#include "ctx.h"
+#include "except.h"
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/printf.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "status.h"
+
+FILE_ENTRY ( except );
+
+
+/*--------------------------------------------------------------------------
+ * exception-related activities
+ */
+
+static
+rc_t log_msg ( const ctx_t *ctx, uint32_t lineno, KLogLevel lvl, const char *msg )
+{
+#if _DEBUGGING
+ const ctx_info_t *ctx_info = ctx -> info;
+ return pLogMsg ( lvl, "$(mod)/$(file).c:$(line): $(func): $(msg)",
+ "mod=%s,file=%s,line=%u,func=%s,msg=%s",
+ ctx_info -> mod,
+ ctx_info -> file,
+ lineno,
+ ctx_info -> func,
+ msg );
+#else
+ return LogMsg ( lvl, msg );
+#endif
+}
+
+static
+rc_t log_err ( const ctx_t *ctx, uint32_t lineno, KLogLevel lvl, rc_t rc, const char *msg )
+{
+#if _DEBUGGING
+ const ctx_info_t *ctx_info = ctx -> info;
+ return pLogErr ( lvl, rc, "$(mod)/$(file).c:$(line): $(func): $(msg)",
+ "mod=%s,file=%s,line=%u,func=%s,msg=%s",
+ ctx_info -> mod,
+ ctx_info -> file,
+ lineno,
+ ctx_info -> func,
+ msg );
+#else
+ return LogErr ( lvl, rc, msg );
+#endif
+}
+
+static
+rc_t status_msg ( const ctx_t *ctx, uint32_t lineno, uint32_t level, const char *msg )
+{
+#if _DEBUGGING
+ const ctx_info_t *ctx_info = ctx -> info;
+ return KStsMsg ( "%s/%s.c:%u: %s: [ %u ] %s",
+ ctx_info -> mod,
+ ctx_info -> file,
+ lineno,
+ ctx_info -> func,
+ level,
+ msg );
+#else
+ return KStsMsg ( "%s", msg );
+#endif
+}
+
+
+/* Annotate
+ * make some annotation
+ * but not an error
+ */
+void Annotate ( const ctx_t *ctx, uint32_t lineno, KLogLevel level, const char *msg, ... )
+{
+ rc_t rc2;
+ size_t num_writ;
+ char buff [ 8 * 1024 ];
+
+ va_list args;
+ va_start ( args, msg );
+
+ rc2 = string_vprintf ( buff, sizeof buff, & num_writ, msg, args );
+ if ( rc2 != 0 )
+ log_err ( ctx, lineno, klogInt, rc2, "Annotate failure" );
+ else
+ log_msg ( ctx, lineno, level, buff );
+
+ va_end ( args );
+}
+
+
+/* Error
+ * make an annotation
+ * record an error as an rc_t
+ */
+void Error ( const ctx_t *ctx, uint32_t lineno, KLogLevel level, rc_t rc, const char *msg, ... )
+{
+ rc_t rc2;
+ ctx_t *mctx;
+ size_t num_writ;
+ char buff [ 8 * 1024 ];
+
+ va_list args;
+ va_start ( args, msg );
+
+ rc2 = string_vprintf ( buff, sizeof buff, & num_writ, msg, args );
+ if ( rc2 != 0 )
+ log_err ( ctx, lineno, klogInt, rc2, "Error annotation failure" );
+ else
+ log_err ( ctx, lineno, level, rc, buff );
+
+ va_end ( args );
+
+ for ( mctx = ( ctx_t* ) ctx; mctx != NULL && mctx -> rc == 0; mctx = ( ctx_t* ) mctx -> caller )
+ mctx -> rc = rc;
+}
+
+
+/* Abort
+ * make an annotation
+ * record an error as an rc_t
+ * exit process
+ */
+void Abort ( const ctx_t *ctx, uint32_t lineno, rc_t rc, const char *msg, ... )
+{
+ rc_t rc2;
+ ctx_t *mctx;
+ size_t num_writ;
+ char buff [ 8 * 1024 ];
+
+ va_list args;
+ va_start ( args, msg );
+
+ rc2 = string_vprintf ( buff, sizeof buff, & num_writ, msg, args );
+ if ( rc2 != 0 )
+ log_err ( ctx, lineno, klogFatal, rc2, "Abort annotation failure" );
+ else
+ log_err ( ctx, lineno, klogFatal, rc, buff );
+
+ va_end ( args );
+
+ for ( mctx = ( ctx_t* ) ctx; mctx != NULL && mctx -> rc == 0; mctx = ( ctx_t* ) mctx -> caller )
+ mctx -> rc = rc;
+
+ exit ( -1 );
+}
+
+
+/* Clear
+ * clears annotation and error
+ */
+void ClearAnnotation ( const ctx_t *ctx )
+{
+ ClearError ( ctx );
+}
+
+
+/* ClearError
+ * clears error, leaving any annotation
+ */
+void ClearError ( const ctx_t *ctx )
+{
+ ctx_t *mctx;
+ for ( mctx = ( ctx_t* ) ctx; mctx != NULL && mctx -> rc != 0; mctx = ( ctx_t* ) mctx -> caller )
+ mctx -> rc = 0;
+}
+
+
+/* Status
+ * report status
+ */
+void Status ( const ctx_t *ctx, uint32_t lineno, uint32_t level, const char *msg, ... )
+{
+ if ( KStsLevelGet () >= level )
+ {
+ rc_t rc2;
+ size_t num_writ;
+ char buff [ 8 * 1024 ];
+
+ va_list args;
+ va_start ( args, msg );
+
+ rc2 = string_vprintf ( buff, sizeof buff, & num_writ, msg, args );
+ if ( rc2 != 0 )
+ log_err ( ctx, lineno, klogInt, rc2, "Status failure" );
+ else
+ status_msg ( ctx, lineno, level, buff );
+
+ va_end ( args );
+ }
+}
+
+/* POLY_DISPATCH
+ * dispatch a polymorphic message
+ */
+void null_self_error ( const ctx_t *ctx, uint32_t lineno, const char *msg )
+{
+ rc_t rc = RC ( rcExe, rcFunction, rcResolving, rcSelf, rcNull );
+ Error ( ctx, lineno, klogInt, rc, "cannot dispatch message '%s'", msg );
+}
diff --git a/tools/sra-sort/except.h b/tools/sra-sort/except.h
new file mode 100644
index 0000000..911149b
--- /dev/null
+++ b/tools/sra-sort/except.h
@@ -0,0 +1,160 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_except_
+#define _h_sra_sort_except_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * exception-related macros
+ */
+
+
+/* ANNOTATE
+ * make some annotation
+ * but not an error
+ */
+void Annotate ( const ctx_t *ctx, uint32_t lineno, KLogLevel level, const char *msg, ... );
+#define ANNOTATE( msg, ... ) \
+ Annotate ( ctx, __LINE__, klogInfo, msg, ## __VA_ARGS__ )
+
+
+/* WARN
+ * make some annotation
+ * but not an error
+ */
+#define WARN( msg, ... ) \
+ Annotate ( ctx, __LINE__, klogWarn, msg, ## __VA_ARGS__ )
+
+
+/* INFO_ERROR
+ * make an annotation
+ * record an informational error as an rc_t
+ */
+void Error ( const ctx_t *ctx, uint32_t lineno, KLogLevel level, rc_t rc, const char *msg, ... );
+#define INFO_ERROR( rc, msg, ... ) \
+ Error ( ctx, __LINE__, klogInfo, rc, msg, ## __VA_ARGS__ )
+
+
+/* ERROR
+ * make an annotation
+ * record an error as an rc_t
+ */
+#ifdef ERROR
+#undef ERROR
+#endif
+#define ERROR( rc, msg, ... ) \
+ Error ( ctx, __LINE__, klogErr, rc, msg, ## __VA_ARGS__ )
+
+
+/* INTERNAL_ERROR
+ * make an annotation
+ * record an internal error as an rc_t
+ */
+#define INTERNAL_ERROR( rc, msg, ... ) \
+ Error ( ctx, __LINE__, klogInt, rc, msg, ## __VA_ARGS__ )
+
+
+/* SYSTEM_ERROR
+ * make an annotation
+ * record a system error as an rc_t
+ */
+#define SYSTEM_ERROR( rc, msg, ... ) \
+ Error ( ctx, __LINE__, klogSys, rc, msg, ## __VA_ARGS__ )
+
+
+/* ABORT
+ * make an annotation
+ * record an error as an rc_t
+ * exit process
+ */
+void Abort ( const ctx_t *ctx, uint32_t lineno, rc_t rc, const char *msg, ... );
+#define ABORT( rc, msg, ... ) \
+ Abort ( ctx, __LINE__, rc, msg, ## __VA_ARGS__ )
+
+
+/* FAILED
+ * a test of rc within ctx_t
+ */
+#ifdef FAILED
+#undef FAILED
+#endif
+#define FAILED() \
+ ( ctx -> rc != 0 )
+
+
+/* TRY
+ * another C language "try" macro
+ */
+#define TRY( expr ) \
+ expr; \
+ if ( ! FAILED () )
+
+
+/* CATCH
+ * attempts to catch rc on certain types
+ */
+#define CATCH( obj_code, state_code ) \
+ else if ( GetRCObject ( ctx -> rc ) == obj_code && GetRCState ( ctx -> rc ) == state_code )
+#define CATCH_STATE( state_code ) \
+ else if ( GetRCState ( ctx -> rc ) == state_code )
+#define CATCH_OBJ( obj_code ) \
+ else if ( GetRCObject ( ctx -> rc ) == obj_code )
+#define CATCH_ALL() \
+ else
+
+/* ON_FAIL
+ */
+#define ON_FAIL( expr ) \
+ expr; \
+ if ( FAILED () )
+
+
+/* CLEAR
+ * clears annotation and error
+ */
+void ClearAnnotation ( const ctx_t *ctx );
+#define CLEAR() \
+ ClearAnnotation ( ctx )
+
+
+/* CLEAR_ERR
+ * clears error, leaving any annotation
+ */
+void ClearError ( const ctx_t *ctx );
+#define CLEAR_ERR() \
+ ClearError ( ctx )
+
+
+#endif
diff --git a/tools/sra-sort/gcc-ped.sh b/tools/sra-sort/gcc-ped.sh
new file mode 100755
index 0000000..7db5891
--- /dev/null
+++ b/tools/sra-sort/gcc-ped.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+# test gcc for support of supplied parameters
+
+if test $# -ge 4
+then
+ if ( echo "typedef int x;" | gcc -c -xc - -o /dev/null $1 $2 $3 $4 > /dev/null 2>&1 )
+ then
+ echo $1 $2 $3 $4
+ exit 0
+ fi
+fi
+
+if test $# -ge 3
+then
+ if ( echo "typedef int x;" | gcc -c -xc - -o /dev/null $1 $2 $3 > /dev/null 2>&1 )
+ then
+ echo $1 $2 $3
+ exit 0
+ fi
+fi
+
+if test $# -ge 2
+then
+ if ( echo "typedef int x;" | gcc -c -xc - -o /dev/null $1 $2 > /dev/null 2>&1 )
+ then
+ echo $1 $2
+ exit 0
+ fi
+fi
+
+if test $# -ge 1
+then
+ if ( echo "typedef int x;" | gcc -c -xc - -o /dev/null $1 > /dev/null 2>&1 )
+ then
+ echo $1
+ exit 0
+ fi
+fi
diff --git a/tools/sra-sort/glob-poslen.c b/tools/sra-sort/glob-poslen.c
new file mode 100644
index 0000000..4f028a4
--- /dev/null
+++ b/tools/sra-sort/glob-poslen.c
@@ -0,0 +1,349 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct GlobalPosLenReader;
+#define COLREADER_IMPL struct GlobalPosLenReader
+
+#include "glob-poslen.h"
+#include "tbl-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "map-file.h"
+#include "sra-sort.h"
+
+#include <insdc/insdc.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <klib/printf.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+
+#include <string.h>
+#include <assert.h>
+
+FILE_ENTRY ( glob-poslen );
+
+
+/*--------------------------------------------------------------------------
+ * GlobalPosLenReader
+ */
+struct GlobalPosLenReader
+{
+ ColumnReader dad;
+
+ uint64_t poslen;
+
+ const VCursor *curs;
+ uint32_t idx [ 3 ];
+
+ uint32_t chunk_size;
+
+ size_t full_spec_size;
+ char full_spec [ 1 ];
+};
+
+static
+void GlobalPosLenReaderWhack ( GlobalPosLenReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ VCursorRelease ( self -> curs );
+ MemFree ( ctx, self, sizeof * self + self -> full_spec_size );
+}
+
+static
+const char *GlobalPosLenReaderFullSpec ( const GlobalPosLenReader *self, const ctx_t *ctx )
+{
+ return self -> full_spec;
+}
+
+static
+uint64_t GlobalPosLenReaderIdRange ( const GlobalPosLenReader *self, const ctx_t *ctx, int64_t *opt_first )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ uint64_t count;
+
+ rc = VCursorIdRange ( self -> curs, 0, opt_first, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorIdRange failed on '%s'", self -> full_spec );
+
+ return count;
+}
+
+static
+void GlobalPosLenReaderPreCopy ( GlobalPosLenReader *self, const ctx_t *ctx )
+{
+}
+
+static
+void GlobalPosLenReaderPostCopy ( GlobalPosLenReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ /* called after a single copy
+ assumes that entire row-range of table has been copied */
+
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorRelease failed on '%s'", self -> full_spec );
+ else
+ self -> curs = NULL;
+}
+
+static
+const void *GlobalPosLenReaderReadGlobal ( GlobalPosLenReader *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const void *base;
+
+ assert ( elem_bits != NULL );
+ assert ( boff != NULL );
+ assert ( row_len != NULL );
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx [ 0 ],
+ elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read REF_LEN for row %ld", row_id );
+ else
+ {
+ INSDC_coord_len ref_len;
+ assert ( * boff == 0 );
+ assert ( * row_len == 1 );
+ assert ( * elem_bits == sizeof ref_len * 8 );
+ ref_len = ( ( const INSDC_coord_len* ) base ) [ 0 ];
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx [ 1 ],
+ elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read GLOBAL_REF_START for row %ld", row_id );
+ else
+ {
+ uint64_t pos;
+ assert ( * boff == 0 );
+ assert ( * row_len == 1 );
+ assert ( * elem_bits == sizeof ( uint64_t ) * 8 );
+ pos = ( ( const uint64_t* ) base ) [ 0 ];
+
+ self -> poslen = encode_pos_len ( pos, ref_len );
+#if 1
+ assert ( decode_pos_len ( self -> poslen ) == pos );
+ assert ( poslen_to_len ( self -> poslen ) == ref_len );
+#endif
+ return & self -> poslen;
+ }
+ }
+
+ return NULL;
+
+}
+
+static
+const void *GlobalPosLenReaderReadLocal ( GlobalPosLenReader *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const void *base;
+
+ assert ( elem_bits != NULL );
+ assert ( boff != NULL );
+ assert ( row_len != NULL );
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx [ 0 ],
+ elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read REF_LEN for row %ld", row_id );
+ else
+ {
+ INSDC_coord_len ref_len;
+ assert ( * boff == 0 );
+ assert ( * row_len == 1 );
+ assert ( * elem_bits == sizeof ref_len * 8 );
+ ref_len = ( ( const INSDC_coord_len* ) base ) [ 0 ];
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx [ 1 ],
+ elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read REF_START for row %ld", row_id );
+ else
+ {
+ INSDC_coord_zero ref_start;
+ assert ( * boff == 0 );
+ assert ( * row_len == 1 );
+ assert ( * elem_bits == sizeof ref_start * 8 );
+ ref_start = ( ( const INSDC_coord_zero* ) base ) [ 0 ];
+
+ rc = VCursorCellDataDirect ( self -> curs, row_id, self -> idx [ 2 ],
+ elem_bits, & base, boff, row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read REF_ID for row %ld", row_id );
+ else
+ {
+ int64_t ref_id;
+ assert ( * boff == 0 );
+ assert ( * row_len == 1 );
+ assert ( * elem_bits == sizeof ref_id * 8 );
+ ref_id = ( ( const int64_t* ) base ) [ 0 ];
+
+ if ( ref_id <= 0 )
+ self -> poslen = 0;
+ else
+ {
+ uint64_t pos = local_to_global ( ref_id, self -> chunk_size, ref_start );
+ self -> poslen = encode_pos_len ( pos, ref_len );
+#if 1
+ assert ( global_to_row_id ( pos, self -> chunk_size ) == ref_id );
+ assert ( decode_pos_len ( self -> poslen ) == pos );
+ assert ( poslen_to_len ( self -> poslen ) == ref_len );
+#endif
+ }
+
+ return & self -> poslen;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static ColumnReader_vt GlobalPosLenReader_vt =
+{
+ GlobalPosLenReaderWhack,
+ GlobalPosLenReaderFullSpec,
+ GlobalPosLenReaderIdRange,
+ GlobalPosLenReaderPreCopy,
+ GlobalPosLenReaderPostCopy,
+ GlobalPosLenReaderReadGlobal
+};
+
+static ColumnReader_vt LocalPosLenReader_vt =
+{
+ GlobalPosLenReaderWhack,
+ GlobalPosLenReaderFullSpec,
+ GlobalPosLenReaderIdRange,
+ GlobalPosLenReaderPreCopy,
+ GlobalPosLenReaderPostCopy,
+ GlobalPosLenReaderReadLocal
+};
+
+
+
+/* MakeGlobalPosLenReader
+ */
+ColumnReader *TablePairMakeGlobalPosLenReader ( TablePair *self, const ctx_t *ctx, uint32_t chunk_size )
+{
+ FUNC_ENTRY ( ctx );
+
+ GlobalPosLenReader *reader;
+ size_t full_spec_size = self -> full_spec_size + sizeof "src..GLOBAL_POSLEN" - 1;
+
+ TRY ( reader = MemAlloc ( ctx, sizeof * reader + full_spec_size, false ) )
+ {
+ /* we don't yet know whether the reader will have GLOBAL_REF_START */
+ TRY ( ColumnReaderInit ( & reader -> dad, ctx, & GlobalPosLenReader_vt ) )
+ {
+ rc_t rc = string_printf ( reader -> full_spec, full_spec_size + 1, NULL, "src.%s.GLOBAL_POSLEN", self -> full_spec );
+ if ( rc != 0 )
+ ABORT ( rc, "cannot seem to calculate string sizes" );
+ else
+ {
+ rc = VTableCreateCursorRead ( self -> stbl, & reader -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create cursor on 'src.%s'", self -> full_spec );
+ else
+ {
+ /* we need length as a 2nd sorting key */
+ rc = VCursorAddColumn ( reader -> curs, & reader -> idx [ 0 ], "REF_LEN" );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorAddColumn failed on '%s' cursor", self -> full_spec );
+ else
+ {
+ /* add columns AFTER open */
+ rc = VCursorPermitPostOpenAdd ( reader -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorPermitPostOpenAdd failed on '%s' cursor", self -> full_spec );
+ else
+ {
+ /* open single-column cursor - errors adding further columns
+ help determine what type of positioning we have */
+ rc = VCursorOpen ( reader -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorOpen failed on '%s' cursor", self -> full_spec );
+ else
+ {
+ /* finish initialization */
+ reader -> chunk_size = chunk_size;
+ reader -> full_spec_size = ( uint32_t ) full_spec_size;
+
+ /* now try to get GLOBAL_REF_START */
+ rc = VCursorAddColumn ( reader -> curs, & reader -> idx [ 1 ], "GLOBAL_REF_START" );
+ if ( rc == 0 )
+ {
+ STATUS ( 3, "'%s' table has GLOBAL_REF_START", self -> full_spec );
+
+ /* retrieval function returns this position directly */
+ return & reader -> dad;
+ }
+
+ /* try for local refpos */
+ rc = VCursorAddColumn ( reader -> curs, & reader -> idx [ 1 ], "REF_START" );
+ if ( rc == 0 )
+ rc = VCursorAddColumn ( reader -> curs, & reader -> idx [ 2 ], "REF_ID" );
+ if ( rc == 0 )
+ {
+ STATUS ( 3, "'%s' table has local REF_START", self -> full_spec );
+
+ /* retrieval function synthesizes local to global */
+ reader -> dad . vt = & LocalPosLenReader_vt;
+ return & reader -> dad;
+ }
+
+ ERROR ( rc, "failed to populate '%s' cursor", reader -> full_spec );
+ }
+ }
+ }
+
+ VCursorRelease ( reader -> curs );
+ }
+ }
+ }
+
+ MemFree ( ctx, reader, sizeof * reader + full_spec_size );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/glob-poslen.h b/tools/sra-sort/glob-poslen.h
new file mode 100644
index 0000000..0a39102
--- /dev/null
+++ b/tools/sra-sort/glob-poslen.h
@@ -0,0 +1,95 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_glob_poslen_
+#define _h_sra_sort_glob_poslen_
+
+#ifndef _h_sra_sort_col_pair_
+#include "col-pair.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct TablePair;
+
+
+/*--------------------------------------------------------------------------
+ * inline functions
+ */
+#define MAX_POS_BITS 34
+#define MAX_LEN_BITS ( 64 - MAX_POS_BITS )
+
+
+static __inline__
+uint64_t encode_pos_len ( uint64_t pos, uint32_t len )
+{
+ assert ( pos < ( ( ~ ( uint64_t ) 0 ) >> MAX_LEN_BITS ) );
+ assert ( 0 < len && len <= ( ( ~ ( uint32_t ) 0 ) >> ( 32 - MAX_LEN_BITS ) ) );
+
+ /* position ascending, length descending */
+ return ( ( pos + 1 ) << MAX_LEN_BITS ) - len;
+}
+
+static __inline__
+uint64_t decode_pos_len ( uint64_t pos_len )
+{
+ return pos_len >> MAX_LEN_BITS;
+}
+
+static __inline__
+uint32_t poslen_to_len ( uint64_t pos_len )
+{
+ return ( 1U << MAX_LEN_BITS ) - ( ( uint32_t ) pos_len & ( ( ~ ( uint32_t ) 0 ) >> ( 32 - MAX_LEN_BITS ) ) );
+}
+
+static __inline__
+uint64_t local_to_global ( int64_t row_id, uint32_t chunk_size, uint32_t offset )
+{
+ assert ( row_id > 0 );
+ return ( row_id - 1 ) * chunk_size + offset;
+}
+
+static __inline__
+int64_t global_to_row_id ( uint64_t pos, uint32_t chunk_size )
+{
+ return ( pos / chunk_size ) + 1;
+}
+
+
+/*--------------------------------------------------------------------------
+ * GlobalPosLenReader
+ */
+typedef struct GlobalPosLenReader GlobalPosLenReader;
+
+
+/* MakeGlobalPosLenReader
+ */
+ColumnReader *TablePairMakeGlobalPosLenReader ( struct TablePair *self, const ctx_t *ctx, uint32_t chunk_size );
+
+
+#endif /* _h_sra_sort_glob_poslen_ */
diff --git a/tools/sra-sort/id-mapper-col.c b/tools/sra-sort/id-mapper-col.c
new file mode 100644
index 0000000..460df8a
--- /dev/null
+++ b/tools/sra-sort/id-mapper-col.c
@@ -0,0 +1,260 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct MapRowIdColWriter MapRowIdColWriter;
+#define COLWRITER_IMPL MapRowIdColWriter
+
+#include "id-mapper-col.h"
+#include "map-file.h"
+#include "csra-tbl.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <klib/rc.h>
+
+#include <string.h>
+
+FILE_ENTRY ( id-mapper-col );
+
+
+/*--------------------------------------------------------------------------
+ * MapRowIdColWriter
+ */
+
+struct MapRowIdColWriter
+{
+ ColumnWriter dad;
+
+ ColumnWriter *cw;
+
+ MapFile *idx;
+
+ int64_t *row;
+ uint32_t max_row_len;
+
+ bool assign_ids;
+};
+
+/* called by Release */
+static
+void MapRowIdColWriterDestroy ( MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnWriterRelease ( self -> cw, ctx );
+ self -> cw = NULL;
+
+ MapFileRelease ( self -> idx, ctx );
+ self -> idx = NULL;
+
+ if ( self -> row != NULL )
+ {
+ MemFree ( ctx, self -> row, sizeof * self -> row * self -> max_row_len );
+ self -> row = NULL;
+ self -> max_row_len = 0;
+ }
+}
+
+static
+void MapRowIdColWriterWhack ( MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ MapRowIdColWriterDestroy ( self, ctx );
+ ColumnWriterDestroy ( & self -> dad, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+/* full spec */
+static
+const char* MapRowIdColWriterFullSpec ( const MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return ColumnWriterFullSpec ( self -> cw, ctx );
+}
+
+static
+void MapRowIdColWriterPreCopy ( MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ ColumnWriterPreCopy ( self -> cw, ctx );
+}
+
+static
+void MapRowIdColWriterPostCopy ( MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> max_row_len > 16 )
+ {
+ void *row;
+ TRY ( row = MemAlloc ( ctx, sizeof * self -> row * 16, false ) )
+ {
+ MemFree ( ctx, self -> row, sizeof * self -> row * self -> max_row_len );
+ self -> row = row;
+ self -> max_row_len = 16;
+ }
+ CATCH_ALL ()
+ {
+ CLEAR ();
+ }
+ }
+
+ ColumnWriterPostCopy ( self -> cw, ctx );
+}
+
+/* write row to destination */
+static
+void MapRowIdColWriterWrite ( MapRowIdColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint32_t i;
+
+ /* here is where the VALUE coming in, which is a row-id,
+ gets mapped to its new value before being written out */
+ assert ( elem_bits == sizeof * self -> row * 8 );
+ assert ( boff == 0 );
+
+ /* resize row if needed */
+ if ( self -> max_row_len < row_len )
+ {
+ MemFree ( ctx, self -> row, sizeof * self -> row * self -> max_row_len );
+
+ self -> max_row_len = ( row_len + 15 ) & ~ 15U;
+ ON_FAIL ( self -> row = MemAlloc ( ctx, sizeof * self -> row * self -> max_row_len, false ) )
+ {
+ ANNOTATE ( "failed to allocate memory for %u row-ids", self -> max_row_len );
+ return;
+ }
+ }
+
+ /* copy row */
+ memmove ( self -> row, data, row_len * sizeof * self -> row );
+
+ /* map ids */
+ for ( i = 0; i < row_len; ++ i )
+ {
+ if ( self -> row [ i ] != 0 )
+ {
+ int64_t new_id;
+
+ /* map old row-id to new row-id */
+ ON_FAIL ( new_id = MapFileMapSingleOldToNew ( self -> idx, ctx, self -> row [ i ], self -> assign_ids ) )
+ {
+ ANNOTATE ( "failed to map source row-id %ld", self -> row [ i ] );
+ return;
+ }
+ if ( new_id == 0 )
+ {
+ rc_t rc = RC ( rcExe, rcColumn, rcWriting, rcId, rcNotFound );
+ ERROR ( rc, "failed to map source row-id %ld", self -> row [ i ] );
+ return;
+ }
+
+ self -> row [ i ] = new_id;
+ }
+ }
+
+ /* now write the translated ids */
+ ColumnWriterWrite ( self -> cw, ctx, sizeof * self -> row * 8, self -> row, 0, row_len );
+}
+
+static
+void MapRowIdColWriterWriteStatic ( MapRowIdColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+ rc_t rc = RC ( rcExe, rcColumn, rcWriting, rcType, rcIncorrect );
+ INTERNAL_ERROR ( rc, "writing to a non-static column" );
+}
+
+/* commit all writes */
+static
+void MapRowIdColWriterCommit ( MapRowIdColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ ColumnWriterCommit ( self -> cw, ctx );
+ MapRowIdColWriterDestroy ( self, ctx );
+}
+
+static ColumnWriter_vt MapRowIdColWriter_vt =
+{
+ MapRowIdColWriterWhack,
+ MapRowIdColWriterFullSpec,
+ MapRowIdColWriterPreCopy,
+ MapRowIdColWriterPostCopy,
+ MapRowIdColWriterWrite,
+ MapRowIdColWriterWriteStatic,
+ MapRowIdColWriterCommit
+};
+
+
+/* MakeMapRowIdWriter
+ * if "assign_ids" is true, the MapFile will be asked to
+ * map an old=>new id or assign (and record) a new id.
+ */
+ColumnWriter *TablePairMakeMapRowIdWriter ( TablePair *self,
+ const ctx_t *ctx, ColumnWriter *cw, MapFile *idx, bool assign_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ MapRowIdColWriter *writer;
+
+ TRY ( writer = MemAlloc ( ctx, sizeof * writer, false ) )
+ {
+ TRY ( ColumnWriterInit ( & writer -> dad, ctx, & MapRowIdColWriter_vt, true ) )
+ {
+ writer -> max_row_len = 16;
+ TRY ( writer -> row = MemAlloc ( ctx, sizeof * writer -> row * writer -> max_row_len, false ) )
+ {
+ TRY ( writer -> idx = MapFileDuplicate ( idx, ctx ) )
+ {
+ TRY ( writer -> cw = ColumnWriterDuplicate ( cw, ctx ) )
+ {
+ writer -> assign_ids = assign_ids;
+ return & writer -> dad;
+ }
+
+ MapFileRelease ( writer -> idx, ctx );
+ }
+
+ ColumnWriterDestroy ( & writer -> dad, ctx );
+ }
+
+ MemFree ( ctx, writer -> row, sizeof * writer -> row * writer -> max_row_len );
+ }
+
+ MemFree ( ctx, writer, sizeof * writer );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/id-mapper-col.h b/tools/sra-sort/id-mapper-col.h
new file mode 100644
index 0000000..ae5770f
--- /dev/null
+++ b/tools/sra-sort/id-mapper-col.h
@@ -0,0 +1,55 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_id_mapper_col_
+#define _h_sra_sort_id_mapper_col_
+
+#ifndef _h_sra_sort_col_pair_
+#include "col-pair.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct MapFile;
+struct TablePair;
+
+
+/*--------------------------------------------------------------------------
+ * MapRowIdColWriter
+ */
+
+
+/* MakeMapRowIdWriter
+ * if "assign_ids" is true, the MapFile will be asked to
+ * map an old=>new id or assign (and record) a new id.
+ */
+ColumnWriter *TablePairMakeMapRowIdWriter ( struct TablePair *self,
+ const ctx_t *ctx, ColumnWriter *cw, struct MapFile *idx, bool assign_ids );
+
+
+#endif /* _h_sra_sort_id_mapper_col_ */
diff --git a/tools/sra-sort/idx-mapping.c b/tools/sra-sort/idx-mapping.c
new file mode 100644
index 0000000..5552415
--- /dev/null
+++ b/tools/sra-sort/idx-mapping.c
@@ -0,0 +1,88 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "idx-mapping.h"
+#include "ctx.h"
+
+#include <klib/sort.h>
+
+FILE_ENTRY ( idx-mapping );
+
+
+/*--------------------------------------------------------------------------
+ * IdxMapping
+ *
+ */
+
+#if USE_OLD_KSORT
+
+int64_t CC IdxMappingCmpOld ( const void *a, const void *b, void *data )
+{
+ const IdxMapping *ap = a;
+ const IdxMapping *bp = b;
+
+ return ap -> old_id < bp -> old_id ? -1 : ap -> old_id > bp -> old_id;
+}
+
+int64_t CC IdxMappingCmpNew ( const void *a, const void *b, void *data )
+{
+ const IdxMapping *ap = a;
+ const IdxMapping *bp = b;
+
+ return ap -> new_id < bp -> new_id ? -1 : ap -> new_id > bp -> new_id;
+}
+
+#else /* USE_OLD_KSORT */
+
+#define T( x ) ( ( const IdxMapping* ) ( x ) )
+
+#define SWAP( a, b, off, size ) KSORT_TSWAP ( IdxMapping, a, b )
+
+
+void IdxMappingSortOld ( IdxMapping *self, const ctx_t *ctx, size_t count )
+{
+#define CMP( a, b ) \
+ ( ( T ( a ) -> old_id < T ( b ) -> old_id ) ? -1 : ( T ( a ) -> old_id > T ( b ) -> old_id ) )
+
+ KSORT ( self, count, sizeof * self, 0, sizeof * self );
+
+#undef CMP
+}
+
+void IdxMappingSortNew ( IdxMapping *self, const ctx_t *ctx, size_t count )
+{
+#define CMP( a, b ) \
+ ( ( T ( a ) -> new_id < T ( b ) -> new_id ) ? -1 : ( T ( a ) -> new_id > T ( b ) -> new_id ) )
+
+ KSORT ( self, count, sizeof * self, 0, sizeof * self );
+
+#undef CMP
+}
+
+#undef T
+#undef SWAP
+
+#endif /* USE_OLD_KSORT */
diff --git a/tools/sra-sort/idx-mapping.h b/tools/sra-sort/idx-mapping.h
new file mode 100644
index 0000000..bbd031b
--- /dev/null
+++ b/tools/sra-sort/idx-mapping.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_idx_mapping_
+#define _h_sra_sort_idx_mapping_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * IdxMapping
+ *
+ */
+typedef struct IdxMapping IdxMapping;
+struct IdxMapping
+{
+ int64_t old_id, new_id;
+};
+
+#if USE_OLD_KSORT
+
+/* ksort callbacks */
+int64_t CC IdxMappingCmpOld ( const void *a, const void *b, void *data );
+int64_t CC IdxMappingCmpNew ( const void *a, const void *b, void *data );
+
+#else
+
+/* ksort_inlines */
+void IdxMappingSortOld ( IdxMapping *self, const ctx_t *ctx, size_t count );
+void IdxMappingSortNew ( IdxMapping *self, const ctx_t *ctx, size_t count );
+
+#endif
+
+#endif /* _h_sra_sort_idx_mapping_ */
diff --git a/tools/sra-sort/map-file.c b/tools/sra-sort/map-file.c
new file mode 100644
index 0000000..18b27db
--- /dev/null
+++ b/tools/sra-sort/map-file.c
@@ -0,0 +1,1192 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "map-file.h"
+#include "idx-mapping.h"
+#include "ctx.h"
+#include "caps.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+#include <klib/refcount.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#include "except.h"
+
+FILE_ENTRY ( map-file );
+
+
+/*--------------------------------------------------------------------------
+ * MapFile
+ * a file for storing id mappings
+ */
+struct MapFile
+{
+ int64_t first_id;
+ uint64_t num_ids;
+ uint64_t num_mapped_ids;
+ int64_t max_new_id;
+ KFile *f_old, *f_new, *f_pos;
+ size_t id_size;
+ KRefcount refcount;
+};
+
+
+/* Whack
+ */
+static
+void MapFileWhack ( MapFile *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ rc_t rc = KFileRelease ( self -> f_old );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KFileRelease failed on old=>new" );
+ else
+ {
+ rc = KFileRelease ( self -> f_new );
+ if ( rc != 0 )
+ ABORT ( rc, "KFileRelease failed on new=>old" );
+ else if ( self -> f_pos != NULL )
+ {
+ rc = KFileRelease ( self -> f_pos );
+ if ( rc != 0 )
+ ABORT ( rc, "KFileRelease failed on global poslen temp column" );
+ }
+
+ MemFree ( ctx, self, sizeof * self );
+ }
+}
+
+
+/* Make
+ * creates an id map
+ */
+static
+void MapFileMakeFork ( KFile **fp, const ctx_t *ctx, const char *name,
+ KDirectory *wd, const char *tmpdir, int pid, size_t bsize, const char *fork )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* create temporary KFile */
+ rc_t rc;
+ KFile *backing;
+
+ rc = KDirectoryCreateFile ( wd, & backing, true,
+ 0600, kcmInit | kcmParents, "%s/sra-sort-%s.%s.%d", tmpdir, name, fork, pid );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to create %s id map file '%s'", fork, name );
+ else
+ {
+#if ! WINDOWS
+ /* never try to remove files on Windows */
+ if ( ctx -> caps -> tool -> unlink_idx_files )
+ {
+ /* unlink KFile */
+ rc = KDirectoryRemove ( wd, false, "%s/sra-sort-%s.%s.%d", tmpdir, name, fork, pid );
+ if ( rc != 0 )
+ WARN ( "failed to unlink %s id map file '%s'", fork, name );
+ }
+#endif
+
+ /* create a read/write buffer file */
+ rc = KBufFileMakeWrite ( fp, backing, true, bsize );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "failed to create buffer for %s id map file '%s'", fork, name );
+
+ KFileRelease ( backing );
+ }
+}
+
+static
+MapFile *MapFileMakeInt ( const ctx_t *ctx, const char *name, bool random, bool for_poslen )
+{
+ MapFile *mf;
+ TRY ( mf = MemAlloc ( ctx, sizeof * mf, true ) )
+ {
+ /* create KDirectory */
+ KDirectory *wd;
+ rc_t rc = KDirectoryNativeDir ( & wd );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to create native directory" );
+ else
+ {
+ const Tool *tp = ctx -> caps -> tool;
+ size_t bsize = random ? tp -> map_file_random_bsize : tp -> map_file_bsize;
+
+ /* create old=>new id file */
+ TRY ( MapFileMakeFork ( & mf -> f_old, ctx, name, wd, tp -> tmpdir, tp -> pid, bsize, "old" ) )
+ {
+ TRY ( MapFileMakeFork ( & mf -> f_new, ctx, name, wd, tp -> tmpdir, tp -> pid, 32 * 1024, "new" ) )
+ {
+ if ( for_poslen )
+ MapFileMakeFork ( & mf -> f_pos, ctx, name, wd, tp -> tmpdir, tp -> pid, 32 * 1024, "pos" );
+
+ KDirectoryRelease ( wd );
+
+ if ( ! FAILED () )
+ {
+ /* this is our guy */
+ KRefcountInit ( & mf -> refcount, 1, "MapFile", "make", name );
+
+ return mf;
+ }
+
+ KFileRelease ( mf -> f_new );
+ }
+
+ KFileRelease ( mf -> f_old );
+ }
+
+ KDirectoryRelease ( wd );
+ }
+
+ MemFree ( ctx, mf, sizeof * mf );
+ }
+
+ return NULL;
+}
+
+MapFile *MapFileMake ( const ctx_t *ctx, const char *name, bool random )
+{
+ FUNC_ENTRY ( ctx );
+ return MapFileMakeInt ( ctx, name, random, false );
+}
+
+/* MakeForPoslen
+ * creates an id map with an additional poslen file
+ * this is specially for PRIMARY_ALIGNMENT_IDS and SECONDARY_ALIGNMENT_IDS
+ * that use *_ALIGNMENT global position and length as a sorting key
+ * we drop it to a file after its generation so that it can be
+ * picked up later when copying the corresponding alignment table.
+ */
+MapFile *MapFileMakeForPoslen ( const ctx_t *ctx, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+ return MapFileMakeInt ( ctx, name, false, true );
+}
+
+
+/* Release
+ */
+void MapFileRelease ( const MapFile *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "MapFile" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ MapFileWhack ( ( MapFile* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcFile, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release MapFile" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+MapFile *MapFileDuplicate ( const MapFile *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "MapFile" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcFile, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate MapFile" );
+ return NULL;
+ }
+ }
+
+ return ( MapFile* ) self;
+}
+
+
+/* SsetIdRange
+ * required second-stage initialization
+ * must be called before any writes occur
+ */
+void MapFileSetIdRange ( MapFile *self, const ctx_t *ctx,
+ int64_t first_id, uint64_t num_ids )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcUpdating, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self" );
+ }
+ else if ( self -> max_new_id != 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcUpdating, rcConstraint, rcViolated );
+ INTERNAL_ERROR ( rc, "cannot change id range after writing has begun" );
+ }
+ else
+ {
+ /* record new first id and count */
+ self -> first_id = first_id;
+ self -> num_ids = num_ids;
+
+ /* determine id size for all ids PLUS 0 for NULL */
+ for ( ++ num_ids, self -> id_size = 1; self -> id_size < 8; ++ self -> id_size )
+ {
+ if ( num_ids <= ( ( uint64_t ) 1 ) << ( self -> id_size * 8 ) )
+ break;
+ }
+ }
+}
+
+
+/* First
+ * return first mapped id
+ */
+int64_t MapFileFirst ( const MapFile *self, const ctx_t *ctx )
+{
+ return self -> first_id;
+}
+
+
+/* Count
+ * return num_ids
+ */
+uint64_t MapFileCount ( const MapFile *self, const ctx_t *ctx )
+{
+ return self -> num_ids;
+}
+
+
+/* SetOldToNew
+ * write old=>new id mappings
+ */
+void MapFileSetOldToNew ( MapFile *self, const ctx_t *ctx, const IdxMapping *ids, size_t count )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( self -> num_ids == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcRange, rcUndefined );
+ INTERNAL_ERROR ( rc, "SetIdRange must be called with a non-empty range" );
+ }
+ else
+ {
+ size_t i;
+ for ( i = 0; i < count; ++ i )
+ {
+ size_t num_writ;
+ /* zero-based index */
+ int64_t old_id = ids [ i ] . old_id - self -> first_id;
+ /* position in bytes */
+ uint64_t pos = old_id * self -> id_size;
+ /* 1-based translated new-id */
+ int64_t new_id = ids [ i ] . new_id - self -> first_id + 1;
+ assert ( old_id >= 0 );
+ assert ( new_id >= 0 );
+#if __BYTE_ORDER == __BIG_ENDIAN
+ new_id = bswap_64 ( new_id );
+#endif
+ rc = KFileWriteAll ( self -> f_old, pos, & new_id, self -> id_size, & num_writ );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to write old=>new id mapping" );
+ break;
+ }
+
+ if ( num_writ != self -> id_size )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to write old=>new id mapping" );
+ break;
+ }
+ }
+ }
+}
+
+
+/* SetNewToOld
+ * write new=>old id mappings
+ */
+void MapFileSetNewToOld ( MapFile *self, const ctx_t *ctx, const IdxMapping *ids, size_t count )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( self -> num_ids == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcRange, rcUndefined );
+ INTERNAL_ERROR ( rc, "SetIdRange must be called with a non-empty range" );
+ }
+ else
+ {
+ if ( ! ctx -> caps -> tool -> write_new_to_old )
+ self -> max_new_id = self -> first_id + count - 1;
+ else
+ {
+ size_t i;
+ for ( i = 0; i < count; ++ i )
+ {
+ size_t num_writ;
+ /* zero based index */
+ int64_t new_id = ids [ i ] . new_id - self -> first_id;
+ /* zero based byte offset */
+ uint64_t pos = new_id * self -> id_size;
+ /* 1-based translated old-id */
+ int64_t old_id = ids [ i ] . old_id - self -> first_id + 1;
+ assert ( new_id >= 0 );
+ assert ( old_id >= 0 );
+#if __BYTE_ORDER == __BIG_ENDIAN
+ old_id = bswap_64 ( old_id );
+#endif
+ rc = KFileWriteAll ( self -> f_new, pos, & old_id, self -> id_size, & num_writ );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to write new=>old id mapping" );
+ break;
+ }
+
+ if ( num_writ != self -> id_size )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to write new=>old id mapping" );
+ break;
+ }
+
+ self -> max_new_id = new_id + self -> first_id;
+ }
+ }
+ }
+}
+
+
+/* SetPoslen
+ * write global position/length in new-id order
+ */
+void MapFileSetPoslen ( MapFile *self, const ctx_t *ctx, const IdxMapping *ids, size_t count )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( self -> f_pos == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcFile, rcIncorrect );
+ INTERNAL_ERROR ( rc, "MapFile must be created with MapFileMakeForPoslen" );
+ }
+ else if ( self -> num_ids == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcRange, rcUndefined );
+ INTERNAL_ERROR ( rc, "SetIdRange must be called with a non-empty range" );
+ }
+ else
+ {
+ /* start writing after the last new id recorded */
+ uint64_t pos = ( self -> max_new_id - self -> first_id + 1 ) * sizeof ids -> new_id;
+
+ size_t i;
+ for ( i = 0; i < count; pos += sizeof ids -> new_id, ++ i )
+ {
+ size_t num_writ;
+ int64_t poslen = ids [ i ] . new_id;
+#if __BYTE_ORDER == __BIG_ENDIAN
+ poslen = bswap_64 ( poslen );
+#endif
+ rc = KFileWriteAll ( self -> f_pos, pos, & poslen, sizeof ids -> new_id, & num_writ );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to write poslen temporary column" );
+ break;
+ }
+
+ if ( num_writ != sizeof ids -> new_id )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to write poslen temporary column" );
+ break;
+ }
+ }
+ }
+}
+
+
+/* ReadPoslen
+ * read global position/length in new-id order
+ * starts reading at the indicated row
+ * returns the number read
+ */
+size_t MapFileReadPoslen ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, uint64_t *poslen, size_t max_count )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t total = 0;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( self -> f_pos == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcFile, rcIncorrect );
+ INTERNAL_ERROR ( rc, "MapFile must be created with MapFileMakeForPoslen" );
+ }
+ /* the column is read until end, but
+ this is not an error. just return no-more-data */
+ else if ( start_id == self -> first_id + self -> num_ids )
+ return 0;
+ else if ( start_id < self -> first_id || start_id > self -> first_id + self -> num_ids )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ INTERNAL_ERROR ( rc, "start_id ( %ld ) is not within column range ( %ld .. %ld )",
+ start_id, self -> first_id, self -> first_id + self -> num_ids - 1 );
+ }
+ else if ( max_count != 0 )
+ {
+ /* limit read to number of ids in index */
+ if ( start_id + max_count > self -> first_id + self -> num_ids )
+ max_count = ( size_t ) ( self -> first_id + self -> num_ids - start_id );
+
+ if ( poslen == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcBuffer, rcNull );
+ INTERNAL_ERROR ( rc, "bad buffer parameter" );
+ }
+ else
+ {
+ /* read as many bytes of id as possible */
+ size_t num_read, to_read = max_count * sizeof * poslen;
+ uint64_t pos = ( start_id - self -> first_id ) * sizeof * poslen;
+ rc = KFileReadAll ( self -> f_pos, pos, poslen, to_read, & num_read );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to read new=>old map" );
+ else
+ {
+ total = ( size_t ) ( num_read / sizeof * poslen );
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+ {
+ /* revert byte-order */
+ size_t i;
+ for ( i = 0; i < total; ++ i )
+ poslen [ i ] = bswap_64 ( poslen [ i ] );
+ }
+#endif
+ }
+ }
+ }
+
+ return total;
+}
+
+
+/* AllocMissingNewIds
+ * it is possible to have written fewer new=>old mappings
+ * than are supposed to be there, e.g. SEQUENCE that gets
+ * initially written by align tables. unaligned sequences
+ * need to fill in the remainder.
+ */
+static
+size_t make_missing_entry ( MapFile *self, const ctx_t *ctx,
+ IdxMapping *missing, size_t i, size_t max_missing_ids,
+ int64_t old_id, int64_t new_id )
+{
+ if ( i == max_missing_ids )
+ {
+ ON_FAIL ( MapFileSetNewToOld ( self, ctx, missing, i ) )
+ return i;
+
+ i = 0;
+ }
+
+ /* insert into missing id map */
+ missing [ i ] . old_id = old_id;
+ missing [ i ] . new_id = new_id;
+
+ /* update old=>new mapping */
+ MapFileSetOldToNew ( self, ctx, & missing [ i ], 1 );
+
+ return i + 1;
+}
+
+int64_t MapFileAllocMissingNewIds ( MapFile *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ int64_t first_allocated = 0;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcUpdating, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( self -> num_ids == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcWriting, rcRange, rcUndefined );
+ INTERNAL_ERROR ( rc, "SetIdRange must be called with a non-empty range" );
+ }
+ else
+ {
+ uint64_t num_missing_ids = self -> num_ids - ( self -> max_new_id - self -> first_id + 1 );
+ if ( num_missing_ids != 0 )
+ {
+ IdxMapping *missing;
+
+ /* determine maximum missing id mappings */
+ size_t max_missing_ids = ctx -> caps -> tool -> max_missing_ids;
+ if ( ( uint64_t ) max_missing_ids > num_missing_ids )
+ max_missing_ids = ( size_t ) num_missing_ids;
+
+ /* allocate a buffer of IdxMapping */
+ TRY ( missing = MemAlloc ( ctx, sizeof * missing * max_missing_ids, false ) )
+ {
+ /* use a scan buffer somewhere around 32K,
+ to keep page-file cache focused on a few pages */
+ void *scan_buffer;
+ const size_t scan_buffer_size = 32 * 1024;
+ TRY ( scan_buffer = MemAlloc ( ctx, scan_buffer_size, false ) )
+ {
+ size_t i, num_read;
+ int64_t new_id, old_id = self -> first_id;
+ uint64_t eof = self -> num_ids * self -> id_size;
+
+ /* this guy will be used to assign new ids */
+ int64_t max_new_id = self -> max_new_id;
+ int64_t entry_max_new_id = self -> max_new_id;
+
+
+ /* in a loop, read as many ids as possible into scan buffer
+ the number is dependent upon self->id_size */
+ for ( i = 0; ; old_id += num_read )
+ {
+ size_t j, to_read;
+
+ /* determine position from old_id */
+ uint64_t pos = ( old_id - self -> first_id ) * self -> id_size;
+ if ( pos == eof )
+ break;
+
+ /* determine bytes to read - this must be limited
+ or we risk tricking page-buffer into resizing */
+ to_read = scan_buffer_size;
+ if ( pos + to_read > eof )
+ to_read = ( size_t ) ( eof - pos );
+
+ /* read as many bytes as we can */
+ rc = KFileReadAll ( self -> f_old, pos, scan_buffer, to_read, & num_read );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to read old=>new map" );
+ break;
+ }
+
+ /* convert to count */
+ num_read /= self -> id_size;
+ if ( num_read == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to read old=>new map" );
+ break;
+ }
+
+ /* scan for zeros, and for every zero found,
+ make entry into IdxMapping table, writing
+ new-id back to old=>new map */
+ switch ( self -> id_size )
+ {
+ case 1:
+ for ( j = 0; j < num_read; ++ j )
+ {
+ if ( ( ( const uint8_t* ) scan_buffer ) [ j ] == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j, ++ max_new_id ) )
+ break;
+ }
+ }
+ break;
+ case 2:
+ for ( j = 0; j < num_read; ++ j )
+ {
+ if ( ( ( const uint16_t* ) scan_buffer ) [ j ] == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j, ++ max_new_id ) )
+ break;
+ }
+ }
+ break;
+ case 3:
+ for ( num_read *= 3, j = 0; j < num_read; j += 3 )
+ {
+ if ( ( ( const uint8_t* ) scan_buffer ) [ j + 0 ] == 0 &&
+ ( ( const uint8_t* ) scan_buffer ) [ j + 1 ] == 0 &&
+ ( ( const uint8_t* ) scan_buffer ) [ j + 2 ] == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j / 3, ++ max_new_id ) )
+ break;
+ }
+ }
+ num_read /= 3;
+ break;
+ case 4:
+ for ( j = 0; j < num_read; ++ j )
+ {
+ if ( ( ( const uint32_t* ) scan_buffer ) [ j ] == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j, ++ max_new_id ) )
+ break;
+ }
+ }
+ break;
+ case 8:
+ for ( j = 0; j < num_read; ++ j )
+ {
+ if ( ( ( const uint64_t* ) scan_buffer ) [ j ] == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j, ++ max_new_id ) )
+ break;
+ }
+ }
+ break;
+ default:
+ for ( num_read *= self -> id_size, j = 0; j < num_read; j += self -> id_size )
+ {
+ new_id = 0;
+ memmove ( & new_id, & ( ( const uint8_t* ) scan_buffer ) [ j ], self -> id_size );
+ if ( new_id == 0 )
+ {
+ ON_FAIL ( i = make_missing_entry ( self, ctx, missing,
+ i, max_missing_ids, old_id + j / self -> id_size, ++ max_new_id ) )
+ break;
+ }
+ }
+ num_read /= self -> id_size;
+ }
+ }
+
+ if ( ! FAILED () && i != 0 )
+ MapFileSetNewToOld ( self, ctx, missing, i );
+
+ assert ( FAILED () || self -> max_new_id == max_new_id );
+
+ if ( max_new_id != entry_max_new_id )
+ first_allocated = entry_max_new_id + 1;
+
+ MemFree ( ctx, scan_buffer, scan_buffer_size );
+ }
+
+ MemFree ( ctx, missing, sizeof * missing * max_missing_ids );
+ }
+ }
+ }
+
+ return first_allocated;
+}
+
+
+/* ReadNewToOld
+ * reads a bunch of new=>old mappings
+ */
+static
+size_t MapFileReadNewToOld ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, IdxMapping *ids, size_t max_count )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t total = 0;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ /* the new=>old mapping is read until end, but
+ this is not an error. just return no-more-data */
+ else if ( start_id == self -> first_id + self -> num_ids )
+ return 0;
+ else if ( start_id < self -> first_id || start_id > self -> first_id + self -> num_ids )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ INTERNAL_ERROR ( rc, "start_id ( %ld ) is not within map range ( %ld .. %ld )",
+ start_id, self -> first_id, self -> first_id + self -> num_ids - 1 );
+ }
+ else if ( max_count != 0 )
+ {
+ /* limit read to number of ids in index */
+ if ( start_id + max_count > self -> first_id + self -> num_ids )
+ max_count = ( size_t ) ( self -> first_id + self -> num_ids - start_id );
+
+ if ( ids == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcBuffer, rcNull );
+ INTERNAL_ERROR ( rc, "bad buffer parameter" );
+ }
+ else
+ {
+ /* read as many bytes of id as possible */
+ size_t num_read, to_read = max_count * self -> id_size;
+ uint64_t pos = ( start_id - self -> first_id ) * self -> id_size;
+ rc = KFileReadAll ( self -> f_new, pos, ids, to_read, & num_read );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to read new=>old map" );
+ else
+ {
+ size_t i;
+ const char *packed = ( const char* ) ids;
+ total = ( size_t ) ( num_read /self -> id_size );
+
+ /* read each packed id as little-endian integer onto
+ pre-zeroed 64-bit integer, swap if needed */
+ for ( num_read = total * self -> id_size, i = total; i > 0; )
+ {
+ int64_t unpacked = 0;
+
+ num_read -= self -> id_size;
+ -- i;
+
+ memmove ( & unpacked, & packed [ num_read ], self -> id_size );
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unpacked = bswap_64 ( unpacked );
+#endif
+ if ( unpacked != 0 )
+ unpacked += self -> first_id - 1;
+
+ ids [ i ] . old_id = unpacked;
+ ids [ i ] . new_id = start_id + i;
+ }
+ }
+ }
+ }
+
+ return total;
+}
+
+
+/* SelectOldToNewPairs
+ * specify the range of new ids to select from
+ * read them in old=>new order
+ */
+size_t MapFileSelectOldToNewPairs ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, IdxMapping *ids, size_t max_count )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint64_t eof;
+ int64_t end_excl;
+ size_t i, j, total;
+
+ /* limit read to number of ids in index */
+ if ( start_id + max_count > self -> first_id + self -> num_ids )
+ max_count = ( size_t ) ( self -> first_id + self -> num_ids - start_id );
+
+ /* range is start_id to end_excl */
+ end_excl = start_id + max_count;
+
+ /* eof for f_old */
+ eof = self -> num_ids * self -> id_size;
+
+ for ( total = i = 0; i < max_count; total += j )
+ {
+ rc_t rc;
+ size_t off, num_read;
+ char buff [ 32 * 1024 ];
+
+ /* read some data from file */
+ uint64_t pos = total * self -> id_size;
+ size_t to_read = sizeof buff;
+ if ( pos == eof )
+ break;
+ if ( pos + to_read > eof )
+ to_read = ( size_t ) ( eof - pos );
+ rc = KFileReadAll ( self -> f_old, pos, buff, to_read, & num_read );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to read old=>new map" );
+ break;
+ }
+
+ /* reached end - requested more ids than we have */
+ if ( num_read == 0 )
+ break;
+
+ /* the number of whole ids actually read */
+ if ( ( num_read /= self -> id_size ) == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to read old=>new map - file incomplete" );
+ break;
+ }
+
+ /* select new-ids from ids read */
+ for ( off = j = 0; j < num_read; off += self -> id_size, ++ j )
+ {
+ int64_t unpacked = 0;
+ memmove ( & unpacked, & buff [ off ], self -> id_size );
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unpacked = bswap_64 ( unpacked );
+#endif
+ /* only offset non-zero (NULL) ids */
+ if ( unpacked != 0 )
+ unpacked += self -> first_id - 1;
+
+ /* if id meets criteria */
+ if ( unpacked >= start_id && unpacked < end_excl )
+ {
+ ids [ i ] . old_id = self -> first_id + total + j;
+ ids [ i ] . new_id = unpacked;
+ if ( ++ i == max_count )
+ break;
+ }
+ }
+ }
+
+ return i;
+}
+
+
+/* SelectOldToNewSingle
+ * specify the range of new ids to select from
+ * read them in old=>new order
+ */
+size_t MapFileSelectOldToNewSingle ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, int64_t *ids, uint32_t *opt_ord, size_t max_count )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint64_t eof;
+ int64_t end_excl;
+ size_t i, j, total;
+
+ /* limit read to number of ids in index */
+ if ( start_id + max_count > self -> first_id + self -> num_ids )
+ max_count = ( size_t ) ( self -> first_id + self -> num_ids - start_id );
+
+ /* range is start_id to end_excl */
+ end_excl = start_id + max_count;
+
+ /* eof for f_old */
+ eof = self -> num_ids * self -> id_size;
+
+ for ( total = i = 0; i < max_count; total += j )
+ {
+ rc_t rc;
+ size_t off, num_read;
+ char buff [ 32 * 1024 ];
+
+ /* read some data from file */
+ uint64_t pos = total * self -> id_size;
+ size_t to_read = sizeof buff;
+ if ( pos == eof )
+ break;
+ if ( pos + to_read > eof )
+ to_read = ( size_t ) ( eof - pos );
+ rc = KFileReadAll ( self -> f_old, pos, buff, to_read, & num_read );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "failed to read old=>new map" );
+ break;
+ }
+
+ /* reached end - requested more ids than we have */
+ if ( num_read == 0 )
+ break;
+
+ /* the number of whole ids actually read */
+ if ( ( num_read /= self -> id_size ) == 0 )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcTransfer, rcIncomplete );
+ SYSTEM_ERROR ( rc, "failed to read old=>new map - file incomplete" );
+ break;
+ }
+
+ /* select new-ids from ids read */
+ for ( off = j = 0; j < num_read; off += self -> id_size, ++ j )
+ {
+ int64_t unpacked = 0;
+ memmove ( & unpacked, & buff [ off ], self -> id_size );
+#if __BYTE_ORDER == __BIG_ENDIAN
+ unpacked = bswap_64 ( unpacked );
+#endif
+ /* only offset non-zero (NULL) ids */
+ if ( unpacked != 0 )
+ unpacked += self -> first_id - 1;
+
+ /* if id meets criteria */
+ if ( unpacked >= start_id && unpacked < end_excl )
+ {
+ ids [ i ] = self -> first_id + total + j;
+ assert ( i <= 0xFFFFFFFF );
+ if ( opt_ord != NULL )
+ opt_ord [ unpacked - start_id ] = ( uint32_t ) i;
+ if ( ++ i == max_count )
+ break;
+ }
+ }
+ }
+
+ return i;
+}
+
+
+/* MapSingleOldToNew
+ * reads a single old=>new mapping
+ * returns new id or 0 if not found
+ * optionally allocates a new id if "insert" is true
+ */
+int64_t MapFileMapSingleOldToNew ( MapFile *self, const ctx_t *ctx,
+ int64_t old_id, bool insert )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ int64_t new_id = 0;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad self reference" );
+ }
+ else if ( old_id < self -> first_id || old_id >= self -> first_id + self -> num_ids )
+ {
+ rc = RC ( rcExe, rcFile, rcReading, rcParam, rcInvalid );
+ INTERNAL_ERROR ( rc, "old_id ( %ld ) is not within map range ( %ld .. %ld )",
+ old_id, self -> first_id, self -> first_id + self -> num_ids - 1 );
+ }
+ else
+ {
+ size_t num_read, to_read = self -> id_size;
+ uint64_t pos = ( old_id - self -> first_id ) * self -> id_size;
+ rc = KFileReadAll ( self -> f_old, pos, & new_id, to_read, & num_read );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to read old=>new map" );
+ else
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ new_id = bswap_64 ( new_id );
+#endif
+ if ( new_id != 0 )
+ new_id += self -> first_id - 1;
+ else if ( insert )
+ {
+ /* create a mapping using the last known
+ new id plus one as the id to assign on insert */
+ IdxMapping mapping;
+ mapping . old_id = old_id;
+ mapping . new_id = self -> max_new_id + 1;
+
+ TRY ( MapFileSetOldToNew ( self, ctx, & mapping, 1 ) )
+ {
+ TRY ( MapFileSetNewToOld ( self, ctx, & mapping, 1 ) )
+ {
+ new_id = mapping . new_id;
+
+ if ( self -> num_ids >= 100000 )
+ {
+ uint64_t scaled = ++ self -> num_mapped_ids * 100;
+ uint64_t prior = scaled - 100;
+ if ( ( prior / self -> num_ids ) != ( scaled /= self -> num_ids ) )
+ STATUS ( 2, "have mapped %lu%% ids", scaled );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return new_id;
+}
+
+
+/* ConsistencyCheck
+ */
+static
+void MapFileCrossCheck ( const MapFile *self, const ctx_t *ctx, IdxMapping *ids, size_t max_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ uint64_t total;
+ size_t num_read;
+ int64_t last_old, last_new;
+
+ for ( last_old = last_new = -1, total = 0; total < self -> num_ids; total += num_read )
+ {
+ int64_t id;
+ size_t i;
+
+ STATUS ( 2, "reading new=>old ids" );
+
+ ON_FAIL ( num_read = MapFileReadNewToOld ( self, ctx, self -> first_id + total, ids, max_ids ) )
+ {
+ ANNOTATE ( "failed to read new=>old ids" );
+ return;
+ }
+
+ STATUS ( 2, "read %,u pairs", num_read );
+
+ STATUS ( 2, "checking for repeats in new-id space" );
+ for ( i = 0; i < num_read; last_new = id, ++ i )
+ {
+ id = ids [ i ] . new_id;
+ if ( id == last_new )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcDuplicate );
+ ERROR ( rc, "new id %,ld repeats", id );
+ return;
+ }
+ }
+
+ STATUS ( 2, "sorting on old id" );
+
+#if USE_OLD_KSORT
+ ksort ( ids, num_read, sizeof ids [ 0 ], IdxMappingCmpOld, ( void* ) ctx );
+#else
+ IdxMappingSortOld ( ids, ctx, num_read );
+#endif
+
+ STATUS ( 2, "checking for repeats in old-id space" );
+ for ( i = 0; i < num_read; last_old = id, ++ i )
+ {
+ id = ids [ i ] . old_id;
+ if ( id == last_old )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcDuplicate );
+ ERROR ( rc, "old id %,ld repeats", id );
+ return;
+ }
+ }
+
+ STATUS ( 2, "cross-checking against old=>new index" );
+
+ for ( i = 0; i < num_read; ++ i )
+ {
+ int64_t new_id;
+
+ /* cast away const on "self" for prototype,
+ but function is only non-const if "insert"
+ were true - we use "false" */
+ ON_FAIL ( new_id = MapFileMapSingleOldToNew ( ( MapFile* ) self, ctx, ids [ i ] . old_id, false ) )
+ return;
+
+ if ( new_id != ids [ i ] . new_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcUnequal );
+ ERROR ( rc, "mismatch of new ids %,ld != %,ld", new_id, ids [ i ] . new_id );
+ return;
+ }
+ }
+ }
+}
+
+void MapFileConsistencyCheck ( const MapFile *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ IdxMapping *ids;
+ const size_t max_ids = 1024 * 1024;
+
+ STATUS ( 2, "running consistency check on index files" );
+
+ /* "self" is valid */
+ if ( self == NULL )
+ {
+ ANNOTATE ( "checking the validity of a NULL MapFile" );
+ return;
+ }
+
+ STATUS ( 2, "checking id_size" );
+
+ /* number of ids requires some number of bits */
+ if ( ( ( uint64_t ) 1 << ( self -> id_size * 8 ) ) < self -> num_ids )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcSize, rcIncorrect );
+ ERROR ( rc, "calculated id size ( %zu bytes ) is insufficient to represent count of %,lu ids",
+ self -> id_size, self -> num_ids );
+ return;
+ }
+
+ STATUS ( 2, "allocating id buffer" );
+
+ TRY ( ids = MemAlloc ( ctx, sizeof * ids * max_ids, false ) )
+ {
+ MapFileCrossCheck ( self, ctx, ids, max_ids );
+ MemFree ( ctx, ids, sizeof * ids * max_ids );
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate memory ( %zu pairs ) for consistency check", max_ids );
+ return;
+ }
+
+ STATUS ( 2, "finished idx consistency check" );
+}
diff --git a/tools/sra-sort/map-file.h b/tools/sra-sort/map-file.h
new file mode 100644
index 0000000..992d765
--- /dev/null
+++ b/tools/sra-sort/map-file.h
@@ -0,0 +1,172 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_map_file_
+#define _h_sra_sort_map_file_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct IdxMapping;
+
+
+/*--------------------------------------------------------------------------
+ * MapFile
+ * a file for storing id mappings
+ */
+typedef struct MapFile MapFile;
+
+
+/* Make
+ * creates an id map
+ */
+MapFile *MapFileMake ( const ctx_t *ctx, const char *name, bool random_access );
+
+
+/* MakeForPoslen
+ * creates an id map with an additional poslen file
+ * this is specially for PRIMARY_ALIGNMENT_IDS and SECONDARY_ALIGNMENT_IDS
+ * that use *_ALIGNMENT global position and length as a sorting key
+ * we drop it to a file after its generation so that it can be
+ * picked up later when copying the corresponding alignment table.
+ */
+MapFile *MapFileMakeForPoslen ( const ctx_t *ctx, const char *name );
+
+
+/* Release
+ */
+void MapFileRelease ( const MapFile *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+MapFile *MapFileDuplicate ( const MapFile *self, const ctx_t *ctx );
+
+
+/* SetIdRange
+ * required second-stage initialization
+ * must be called before any writes occur
+ */
+void MapFileSetIdRange ( MapFile *self, const ctx_t *ctx,
+ int64_t first_id, uint64_t num_ids );
+
+
+/* First
+ * return first mapped id
+ * Count
+ * return number of ids
+ */
+int64_t MapFileFirst ( const MapFile *self, const ctx_t *ctx );
+uint64_t MapFileCount ( const MapFile *self, const ctx_t *ctx );
+
+
+/* SetOldToNew
+ * write new=>old id mappings
+ */
+void MapFileSetOldToNew ( MapFile *self, const ctx_t *ctx,
+ struct IdxMapping const *ids, size_t count );
+
+
+/* SetNewToOld
+ * write new=>old id mappings
+ */
+void MapFileSetNewToOld ( MapFile *self, const ctx_t *ctx,
+ struct IdxMapping const *ids, size_t count );
+
+
+/* SetPoslen
+ * write global position/length in new-id order
+ */
+void MapFileSetPoslen ( MapFile *self, const ctx_t *ctx,
+ struct IdxMapping const *ids, size_t count );
+
+
+/* ReadPoslen
+ * read global position/length in new-id order
+ * starts reading at the indicated row
+ * returns the number read
+ */
+size_t MapFileReadPoslen ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, uint64_t *poslen, size_t max_count );
+
+
+/* AllocMissingNewIds
+ * it is possible to have written fewer new=>old mappings
+ * than are supposed to be there, e.g. SEQUENCE that gets
+ * initially written by align tables. unaligned sequences
+ * need to fill in the remainder.
+ *
+ * returns the first newly allocated id
+ */
+int64_t MapFileAllocMissingNewIds ( MapFile *self, const ctx_t *ctx );
+
+
+/* SelectOldToNewPairs
+ * specify the range of new ids to select from
+ * read them in old=>new order
+ */
+size_t MapFileSelectOldToNewPairs ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, struct IdxMapping *ids, size_t max_count );
+
+
+/* SelectOldToNewSingle
+ * specify the range of new ids to select from
+ * read them in old=>new order
+ */
+size_t MapFileSelectOldToNewSingle ( const MapFile *self, const ctx_t *ctx,
+ int64_t start_id, int64_t *ids, uint32_t *opt_ord, size_t max_count );
+
+
+/* MapSingleOldToNew
+ * reads a single old=>new mapping
+ * returns new id or 0 if not found
+ * optionally allocates a new id if "insert" is true
+ */
+int64_t MapFileMapSingleOldToNew ( MapFile *self, const ctx_t *ctx,
+ int64_t old_id, bool insert );
+
+
+/* MapMultipleOldToNew
+ * reads a single old=>new mapping
+ * returns new id or 0 if not found
+ * optionally allocates a new id if "insert" is true
+ */
+void MapFileMapMultipleOldToNew ( MapFile *self, const ctx_t *ctx,
+ int64_t *ids, size_t count, bool insert );
+
+
+/* ConsistencyCheck
+ * should be const, but MapFileOldToNew claims to be non-const
+ * and is used within. only non-const if "insert" is true.
+ */
+void MapFileConsistencyCheck ( const MapFile *self, const ctx_t *ctx );
+
+
+#endif
diff --git a/tools/sra-sort/mapping-row-set.c b/tools/sra-sort/mapping-row-set.c
new file mode 100644
index 0000000..6e69549
--- /dev/null
+++ b/tools/sra-sort/mapping-row-set.c
@@ -0,0 +1,496 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct MappingRowSet MappingRowSet;
+#define ROWSET_IMPL MappingRowSet
+
+typedef struct MappingRowSetIterator MappingRowSetIterator;
+#define ROWSET_ITER_IMPL MappingRowSetIterator
+
+#include "row-set-priv.h"
+#include "tbl-pair.h"
+#include "idx-mapping.h"
+#include "map-file.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <klib/rc.h>
+
+FILE_ENTRY ( mapping-row-set );
+
+
+/*--------------------------------------------------------------------------
+ * MappingRowSetIterator
+ * interface to iterate RowSets
+ */
+struct MappingRowSetIterator
+{
+ RowSetIterator dad;
+
+ /* base row-id */
+ int64_t row_id;
+
+ /* last row-id + 1 */
+ int64_t last_excl;
+
+ /* takes its input from new=>old index */
+ const MapFile *idx;
+
+ /* working data within map */
+ IdxMapping *map;
+ size_t max_elems;
+ size_t num_elems;
+
+ bool large;
+};
+
+/*--------------------------------------------------------------------------
+ * MappingRowSet
+ * implementation of RowSet based upon auto-generated id pairs
+ */
+struct MappingRowSet
+{
+ RowSet dad;
+
+ /* keep-alive reference */
+ MappingRowSetIterator *iter;
+
+ /* working data within map */
+ IdxMapping *map;
+ size_t num_elems;
+ size_t cur_elem;
+};
+
+static
+void MappingRowSetWhack ( MappingRowSet *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ RowSetIteratorRelease ( & self -> iter -> dad, ctx );
+ MemFree ( ctx, self, sizeof *self );
+}
+
+static
+size_t MappingRowSetNextStat ( MappingRowSet *self, const ctx_t *ctx,
+ int64_t *ids, size_t max_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* the starting row-id is taken from row-set-iterator
+ and offset by our current element counter */
+ int64_t row_id = self -> iter -> row_id + self -> cur_elem;
+
+ /* limit id generation to request */
+ size_t i, to_set = self -> num_elems - self -> cur_elem;
+ if ( to_set > max_ids )
+ to_set = max_ids;
+
+ /* fill request with serial numbers
+ could just as easily be the same number
+ the important thing is to limit the count
+ and produce the correct range */
+ for ( i = 0; i < to_set; ++ i )
+ ids [ i ] = row_id + i;
+
+ /* advance counter */
+ self -> cur_elem += to_set;
+ return to_set;
+}
+
+static
+size_t MappingRowSetNextPhys ( MappingRowSet *self, const ctx_t *ctx,
+ int64_t *ids, size_t max_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* limit copy to request */
+ size_t i, to_copy = self -> num_elems - self -> cur_elem;
+ if ( to_copy > max_ids )
+ to_copy = max_ids;
+
+ /* copy out old-ids */
+ for ( i = 0; i < to_copy; ++ i )
+ ids [ i ] = self -> map [ self -> cur_elem + i ] . old_id;
+
+ /* advance counter */
+ self -> cur_elem += to_copy;
+ return to_copy;
+}
+
+static
+void MappingRowSetReset ( MappingRowSet *self, const ctx_t *ctx, bool for_static );
+
+static RowSet_vt MappingRowSetPhys_vt =
+{
+ MappingRowSetWhack,
+ MappingRowSetNextPhys,
+ MappingRowSetReset
+};
+
+static RowSet_vt MappingRowSetStat_vt =
+{
+ MappingRowSetWhack,
+ MappingRowSetNextStat,
+ MappingRowSetReset
+};
+
+static
+void MappingRowSetReset ( MappingRowSet *self, const ctx_t *ctx, bool for_static )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( for_static )
+ {
+ /* go static */
+ self -> dad . vt = & MappingRowSetStat_vt;
+ }
+ else
+ {
+ size_t i, max_elems;
+ MappingRowSetIterator *iter = self -> iter;
+
+ /* go physical */
+ self -> dad . vt = & MappingRowSetPhys_vt;
+
+ /* limit id generation */
+ max_elems = iter -> max_elems;
+ if ( iter -> row_id + max_elems >= iter -> last_excl )
+ max_elems = ( size_t ) ( iter -> last_excl - iter -> row_id );
+
+ STATUS ( 4, "auto-generating %,zu ( old_id, new_id ) pairs where new_id >= %ld",
+ max_elems, iter -> row_id );
+ for ( i = 0; i < max_elems; ++ i )
+ iter -> map [ i ] . old_id = iter -> map [ i ] . new_id = iter -> row_id + i;
+
+ self -> num_elems = iter -> num_elems = max_elems;
+ }
+
+ /* ready */
+ self -> cur_elem = 0;
+}
+
+static
+void MapFileMappingRowSetReset ( MappingRowSet *self, const ctx_t *ctx, bool for_static );
+
+static RowSet_vt MapFileMappingRowSetPhys_vt =
+{
+ MappingRowSetWhack,
+ MappingRowSetNextPhys,
+ MapFileMappingRowSetReset
+};
+
+static RowSet_vt MapFileMappingRowSetStat_vt =
+{
+ MappingRowSetWhack,
+ MappingRowSetNextStat,
+ MapFileMappingRowSetReset
+};
+
+static
+void MapFileMappingRowSetReset ( MappingRowSet *self, const ctx_t *ctx, bool for_static )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( for_static )
+ {
+ /* go static */
+ self -> dad . vt = & MapFileMappingRowSetStat_vt;
+ }
+ else
+ {
+ MappingRowSetIterator *iter = self -> iter;
+
+ /* go physical */
+ self -> dad . vt = & MapFileMappingRowSetPhys_vt;
+
+ /* read new-ids from file, selecting only those within range */
+ STATUS ( 3, "selecting first %,zu ( old_id, new_id ) pairs from old=>new where new_id >= %,ld",
+ iter -> max_elems, iter -> row_id );
+ ON_FAIL ( iter -> num_elems = MapFileSelectOldToNewPairs ( iter -> idx, ctx,
+ iter -> row_id, iter -> map, iter -> max_elems ) )
+ return;
+
+ self -> num_elems = iter -> num_elems;
+ STATUS ( 3, "selected %,zu ( old_id, new_id ) pairs", self -> num_elems );
+ }
+
+ /* ready */
+ self -> cur_elem = 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * MappingRowSetIterator
+ * interface to iterate RowSets
+ */
+
+static
+void MappingRowSetIteratorWhack ( MappingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> map != NULL )
+ MemFree ( ctx, self -> map, sizeof self -> map [ 0 ] * self -> max_elems );
+
+ RowSetIteratorDestroy ( & self -> dad, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+void MapFileMappingRowSetIteratorWhack ( MappingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> map != NULL )
+ MemFree ( ctx, self -> map, sizeof self -> map [ 0 ] * self -> max_elems );
+
+ MapFileRelease ( self -> idx, ctx );
+
+ RowSetIteratorDestroy ( & self -> dad, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+RowSet *MappingRowSetIteratorMakeTheRowSet ( MappingRowSetIterator *self, const ctx_t *ctx, const RowSet_vt *vt )
+{
+ FUNC_ENTRY ( ctx );
+
+ MappingRowSet *rs;
+ TRY ( rs = MemAlloc ( ctx, sizeof * rs, false ) )
+ {
+ TRY ( RowSetInit ( & rs -> dad, ctx, vt ) )
+ {
+ /* initialize the row-set with map and self reference */
+ rs -> map = self -> map;
+ rs -> iter = ( MappingRowSetIterator* ) RowSetIteratorDuplicate ( & self -> dad, ctx );
+ rs -> num_elems = self -> num_elems;
+ rs -> cur_elem = 0;
+ return & rs -> dad;
+ }
+
+ MemFree ( ctx, rs, sizeof * rs );
+ }
+
+ return NULL;
+ }
+
+static
+struct IdxMapping *MappingRowSetIteratorGetIdxMapping ( MappingRowSetIterator *self, const ctx_t *ctx, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> map == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcAccessing, rcSelf, rcInconsistent );
+ ERROR ( rc, "IdxMapping array is NULL" );
+ if ( num_items != NULL )
+ * num_items = 0;
+ return NULL;
+ }
+
+ if ( num_items != NULL )
+ * num_items = self -> num_elems;
+ return self -> map;
+}
+
+static
+int64_t *MappingRowSetIteratorGetSourceIds ( MappingRowSetIterator *self, const ctx_t *ctx, uint32_t **opt_ord, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ ANNOTATE ( "CALLING GetSourceIds ON MAPPING ROWSET ITERATOR" );
+
+ if ( opt_ord != NULL )
+ * opt_ord = NULL;
+
+ if ( num_items != NULL )
+ * num_items = 0;
+
+ return NULL;
+}
+
+static
+void MappingRowSetIteratorAllocMap ( MappingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* determine the maximum number of elements */
+ const Tool *tp = ctx -> caps -> tool;
+ uint64_t count = self -> last_excl - self -> row_id;
+ self -> max_elems = self -> large ? tp -> max_large_idx_ids : tp -> max_idx_ids;
+ if ( ( uint64_t ) self -> max_elems > count )
+ self -> max_elems = ( size_t ) count;
+
+ /* try to allocate the memory
+ this may be limited by the MemBank */
+ do
+ {
+ CLEAR ();
+
+ TRY ( self -> map = MemAlloc ( ctx, sizeof self -> map [ 0 ] * self -> max_elems, false ) )
+ {
+ STATUS ( 4, "allocated mapping array of %,u elements", self -> max_elems );
+ return;
+ }
+
+ self -> max_elems >>= 1;
+ }
+ while ( self -> max_elems >= ctx -> caps -> tool -> min_idx_ids );
+
+ ANNOTATE ( "failed to allocate map for row-set" );
+}
+
+static
+RowSet *MappingRowSetIteratorNextInt ( MappingRowSetIterator *self, const ctx_t *ctx, const RowSet_vt *vt )
+{
+ /* no FUNC_ENTRY */
+
+ RowSet *rs = NULL;
+
+ /* on first invocation, allocate the map */
+ if ( self -> map == NULL )
+ {
+ ON_FAIL ( MappingRowSetIteratorAllocMap ( self, ctx ) )
+ return NULL;
+ }
+
+ /* advance row_id */
+ self -> row_id += self -> num_elems;
+ self -> num_elems = 0;
+
+ /* create the empty row-set */
+ if ( self -> row_id < self -> last_excl )
+ rs = MappingRowSetIteratorMakeTheRowSet ( self, ctx, vt );
+
+ return rs;
+}
+
+static
+RowSet *MappingRowSetIteratorNext ( MappingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return MappingRowSetIteratorNextInt ( self, ctx, & MappingRowSetPhys_vt );
+}
+
+static
+RowSet *MapFileMappingRowSetIteratorNext ( MappingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return MappingRowSetIteratorNextInt ( self, ctx, & MapFileMappingRowSetPhys_vt );
+}
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ */
+
+static RowSetIterator_vt MappingRowSetIterator_vt =
+{
+ MappingRowSetIteratorWhack,
+ MappingRowSetIteratorGetIdxMapping,
+ MappingRowSetIteratorGetSourceIds,
+ MappingRowSetIteratorNext
+};
+
+/* MakeMappingRowSetIterator
+ * runs from first to last id in cursor
+ */
+RowSetIterator *TablePairMakeMappingRowSetIterator ( TablePair *self, const ctx_t *ctx, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> first_id > self -> last_excl )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcConstructing, rcRange, rcInvalid );
+ INTERNAL_ERROR ( rc, "union of all column ranges improperly set" );
+ }
+ else
+ {
+ MappingRowSetIterator *rsi;
+
+ TRY ( rsi = MemAlloc ( ctx, sizeof * rsi, true ) )
+ {
+ TRY ( RowSetIteratorInit ( & rsi -> dad, ctx, & MappingRowSetIterator_vt ) )
+ {
+ rsi -> row_id = self -> first_id;
+ rsi -> last_excl = self -> last_excl;
+ rsi -> large = large;
+ return & rsi -> dad;
+ }
+
+ MemFree ( ctx, rsi, sizeof * rsi );
+ }
+ }
+
+ return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * MapFile
+ */
+
+static RowSetIterator_vt MapFileMappingRowSetIterator_vt =
+{
+ MapFileMappingRowSetIteratorWhack,
+ MappingRowSetIteratorGetIdxMapping,
+ MappingRowSetIteratorGetSourceIds,
+ MapFileMappingRowSetIteratorNext
+};
+
+RowSetIterator * MapFileMakeMappingRowSetIterator ( const MapFile *self, const ctx_t *ctx, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ MappingRowSetIterator *rsi;
+
+ /* create the iterator */
+ TRY ( rsi = MemAlloc ( ctx, sizeof * rsi, true ) )
+ {
+ TRY ( RowSetIteratorInit ( & rsi -> dad, ctx, & MapFileMappingRowSetIterator_vt ) )
+ {
+ /* initialize the row-set with map and self reference */
+ TRY ( rsi -> row_id = MapFileFirst ( self, ctx ) )
+ {
+ TRY ( rsi -> last_excl = rsi -> row_id + MapFileCount ( self, ctx ) )
+ {
+ TRY ( rsi -> idx = MapFileDuplicate ( self, ctx ) )
+ {
+ rsi -> large = large;
+ return & rsi -> dad;
+ }
+ }
+ }
+ }
+
+ MemFree ( ctx, rsi, sizeof * rsi );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/mem.c b/tools/sra-sort/mem.c
new file mode 100644
index 0000000..313a90f
--- /dev/null
+++ b/tools/sra-sort/mem.c
@@ -0,0 +1,68 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+
+FILE_ENTRY ( mem );
+
+
+/*--------------------------------------------------------------------------
+ * Mem
+ * memory allocation via MemBank in Caps
+ */
+void *MemAlloc ( const ctx_t *ctx, size_t bytes, bool clear )
+{
+ assert ( ctx != NULL );
+ assert ( ctx -> caps != NULL );
+ assert ( ctx -> caps -> mem != NULL );
+
+ return MemBankAlloc ( ctx -> caps -> mem, ctx, bytes, clear );
+}
+
+void MemFree ( const ctx_t *ctx, void *mem, size_t bytes )
+{
+ if ( mem != NULL )
+ {
+ assert ( ctx != NULL );
+ assert ( ctx -> caps != NULL );
+ assert ( ctx -> caps -> mem != NULL );
+
+ MemBankFree ( ctx -> caps -> mem, ctx, mem, bytes );
+ }
+}
+
+size_t MemInUse ( const ctx_t *ctx, size_t *opt_quota )
+{
+ assert ( ctx != NULL );
+ assert ( ctx -> caps != NULL );
+ assert ( ctx -> caps -> mem != NULL );
+
+ return MemBankInUse ( ctx -> caps -> mem, ctx, opt_quota );
+}
diff --git a/tools/sra-sort/mem.h b/tools/sra-sort/mem.h
new file mode 100644
index 0000000..fc3db7e
--- /dev/null
+++ b/tools/sra-sort/mem.h
@@ -0,0 +1,128 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_mem_
+#define _h_sra_sort_mem_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * Mem
+ * memory allocation via MemBank in Caps
+ */
+void *MemAlloc ( const ctx_t *ctx, size_t bytes, bool clear );
+void MemFree ( const ctx_t *ctx, void *mem, size_t bytes );
+size_t MemInUse ( const ctx_t *ctx, size_t *opt_quota );
+
+
+
+/*--------------------------------------------------------------------------
+ * MemBank
+ * very, very, very watered down memory bank
+ */
+typedef struct MemBank_vt MemBank_vt;
+
+typedef struct MemBank MemBank;
+struct MemBank
+{
+ const MemBank_vt *vt;
+ KRefcount refcount;
+ uint32_t align;
+};
+
+#ifndef MEMBANK_IMPL
+#define MEMBANK_IMPL MemBank
+#endif
+
+struct MemBank_vt
+{
+ void ( * whack ) ( MEMBANK_IMPL *self, const ctx_t *ctx );
+ size_t ( * in_use ) ( const MEMBANK_IMPL *self, const ctx_t *ctx, size_t *opt_quota );
+ void* ( * alloc ) ( MEMBANK_IMPL *self, const ctx_t *ctx, size_t bytes, bool clear );
+ void ( * free ) ( MEMBANK_IMPL *self, const ctx_t *ctx, void *mem, size_t bytes );
+};
+
+
+/* Make
+ * make a new memory bank
+ */
+MemBank *MemBankMake ( const ctx_t *ctx, size_t quota );
+
+
+/* MakePaged
+ * make a new paged memory bank
+ */
+MemBank *MemBankMakePaged ( const ctx_t *ctx, size_t quota, size_t pgsize );
+
+
+/* Duplicate
+ * Release
+ */
+MemBank *MemBankDuplicate ( const MemBank *self, const ctx_t *ctx );
+void MemBankRelease ( const MemBank *self, const ctx_t *ctx );
+
+
+/* InUse
+ * report the number of bytes in use
+ * optionally returns quota
+ */
+#define MemBankInUse( self, ctx, opt_quota ) \
+ POLY_DISPATCH_INT ( in_use, self, const MEMBANK_IMPL, ctx, opt_quota )
+
+
+/* Alloc
+ * allocates some memory from bank
+ */
+#define MemBankAlloc( self, ctx, bytes, clear ) \
+ POLY_DISPATCH_PTR ( alloc, self, MEMBANK_IMPL, ctx, bytes, clear )
+
+
+/* Free
+ * returns memory to bank
+ * ignored by paged bank
+ * burden on caller to remember allocation size
+ */
+#define MemBankFree( self, ctx, mem, bytes ) \
+ POLY_DISPATCH_VOID ( free, self, MEMBANK_IMPL, ctx, mem, bytes )
+
+
+/* Init
+ */
+void MemBankInit ( MemBank *self, const ctx_t *ctx, const MemBank_vt *vt, const char *name );
+
+/* Destroy
+ */
+#define MemBankDestroy( self, ctx ) \
+ ( ( void ) 0 )
+
+#endif
diff --git a/tools/sra-sort/membank-priv.h b/tools/sra-sort/membank-priv.h
new file mode 100644
index 0000000..69301d4
--- /dev/null
+++ b/tools/sra-sort/membank-priv.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_membank_priv_
+#define _h_sra_sort_membank_priv_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * MemBank
+ */
+
+/* MakePagedMMap
+ * make a new paged memory bank backed by memory map
+ */
+MemBank *MemBankMakePagedMMap ( const ctx_t *ctx, size_t quota, size_t pgsize );
+
+#endif
diff --git a/tools/sra-sort/membank.c b/tools/sra-sort/membank.c
new file mode 100644
index 0000000..6f29b75
--- /dev/null
+++ b/tools/sra-sort/membank.c
@@ -0,0 +1,296 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct MemBankImpl MemBankImpl;
+#define MEMBANK_IMPL MemBankImpl
+
+#include <sysalloc.h>
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+#include <klib/refcount.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+#include <atomic.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+FILE_ENTRY ( membank );
+
+
+/*--------------------------------------------------------------------------
+ * MemBankImpl
+ * maintains a quota
+ */
+struct MemBankImpl
+{
+ MemBank dad;
+ size_t quota;
+ atomic_t avail;
+};
+
+static
+void MemBankImplWhack ( MemBankImpl *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ Caps *caps;
+
+ MemBankDestroy ( & self -> dad, ctx );
+
+ caps = ( Caps* ) ctx -> caps;
+ if ( & self -> dad != caps -> mem )
+ MemBankFree ( caps -> mem, ctx, self, sizeof * self );
+ else
+ {
+ free ( self );
+ caps -> mem = NULL;
+ }
+}
+
+
+/* InUse
+ * report the number of bytes in use
+ * optionally returns quota
+ */
+static
+size_t MemBankImplInUse ( const MemBankImpl *self, const ctx_t *ctx, size_t *quota )
+{
+ size_t dummy;
+
+ if ( quota == NULL )
+ quota = & dummy;
+
+ if ( self != NULL )
+ {
+ * quota = self -> quota;
+ return self -> quota - atomic_read ( & self -> avail );
+ }
+
+ * quota = 0;
+ return 0;
+}
+
+
+/* Alloc
+ * allocates some memory from bank
+ */
+static
+void *MemBankImplAlloc ( MemBankImpl *self, const ctx_t *ctx, size_t bytes, bool clear )
+{
+ if ( self != NULL )
+ {
+ /* allocation from the raw bank */
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ /* update "avail" atomicially */
+ size_t remaining, avail;
+ for ( avail = atomic_read ( & self -> avail ); avail >= bytes; avail = remaining )
+ {
+ /* subtract the bytes */
+ remaining = atomic_test_and_set ( & self -> avail,
+ ( atomic_int ) ( avail - bytes ), ( atomic_int ) avail );
+ if ( remaining == avail )
+ {
+ /* try to allocate the memory directly */
+ void *mem = clear ? calloc ( 1, bytes ) : malloc ( bytes );
+ if ( mem == NULL )
+ {
+ /* failed to get memory */
+ atomic_add ( & self -> avail, ( atomic_int ) bytes );
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcMemory, rcExhausted );
+ ERROR ( rc, "failed to allocate %zu bytes of memory", bytes );
+ }
+ else if ( bytes > 256 * 1024 )
+ {
+ if ( bytes > 1024 * 1024 )
+ STATUS ( 3, "allocated %,zu bytes of memory", bytes );
+ else
+ STATUS ( 4, "allocated %,zu bytes of memory", bytes );
+ }
+
+ return mem;
+ }
+ }
+
+ /* at this point we could be using a timeout */
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcRange, rcExcessive );
+ ERROR ( rc, "quota exceeded allocating %zu bytes of memory", bytes );
+ }
+
+ return NULL;
+}
+
+
+/* Free
+ * returns memory to bank
+ * ignored by paged bank
+ * burden on caller to remember allocation size
+ */
+static
+void MemBankImplFree ( MemBankImpl *self, const ctx_t *ctx, void *mem, size_t bytes )
+{
+ if ( mem != NULL )
+ {
+ FUNC_ENTRY ( ctx );
+
+ if ( self == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcMemory, rcReleasing, rcSelf, rcNull );
+ ERROR ( rc, "attempt to return memory to NULL MemBank" );
+ }
+ else
+ {
+ /* release the memory */
+ free ( mem );
+
+ /* update the counters */
+ if ( bytes == 0 )
+ ANNOTATE ( "freed memory with size of 0 bytes" );
+ else
+ {
+ atomic_add ( & self -> avail, ( atomic_int ) bytes );
+
+ if ( bytes > 256 * 1024 )
+ {
+ if ( bytes > 1024 * 1024 )
+ STATUS ( 3, "freed %,zu bytes of memory", bytes );
+ else
+ STATUS ( 4, "freed %,zu bytes of memory", bytes );
+ }
+ }
+ }
+ }
+}
+
+static MemBank_vt MemBankImpl_vt =
+{
+ MemBankImplWhack,
+ MemBankImplInUse,
+ MemBankImplAlloc,
+ MemBankImplFree
+};
+
+
+/*--------------------------------------------------------------------------
+ * MemBank
+ * very, very, very watered down memory bank
+ */
+
+
+/* Make
+ * make a new memory bank
+ * in a real system, this could make a bank linked to
+ * the primordial one. in this system, there is only
+ * a single bank, so this function is overloaded to
+ * create both the primordial and to reset quota on it.
+ */
+MemBank *MemBankMake ( const ctx_t *ctx, size_t quota )
+{
+ FUNC_ENTRY ( ctx );
+
+ MemBankImpl *mem = malloc ( sizeof * mem );
+ if ( mem == NULL )
+ exit ( -1 );
+
+ MemBankInit ( & mem -> dad, ctx, & MemBankImpl_vt, "Process MemBank" );
+
+ if ( quota < 4096 )
+ quota = 4096;
+
+ mem -> quota = quota;
+ atomic_set ( & mem -> avail, ( atomic_int ) ( quota - sizeof * mem ) );
+
+ return & mem -> dad;
+}
+
+
+/* Init
+ */
+void MemBankInit ( MemBank *self, const ctx_t *ctx, const MemBank_vt *vt, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+
+ self -> vt = vt;
+ KRefcountInit ( & self -> refcount, 1, "MemBank", "Make", name );
+ self -> align = 0;
+}
+
+
+/* Duplicate
+ * Release
+ */
+MemBank *MemBankDuplicate ( const MemBank *self, const ctx_t *ctx )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "MemBank" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative: {
+ FUNC_ENTRY ( ctx );
+ rc_t rc = RC ( rcExe, rcMemory, rcAttaching, rcRange, rcExcessive );
+ ERROR ( rc, "excessive references on MemBank" );
+ return NULL;
+ }}
+ }
+ return ( MemBank* ) self;
+}
+
+void MemBankRelease ( const MemBank *self, const ctx_t *ctx )
+{
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "MemBank" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( MEMBANK_IMPL* ) self, ctx );
+ break;
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative: {
+ FUNC_ENTRY ( ctx );
+ rc_t rc = RC ( rcExe, rcMemory, rcReleasing, rcRange, rcExcessive );
+ ERROR ( rc, "excessive releases on MemBank" );
+ }}
+ }
+}
diff --git a/tools/sra-sort/meta-pair.c b/tools/sra-sort/meta-pair.c
new file mode 100644
index 0000000..a067fe2
--- /dev/null
+++ b/tools/sra-sort/meta-pair.c
@@ -0,0 +1,458 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct MetaPair StdMetaPair;
+#define METAPAIR_IMPL StdMetaPair
+
+#include "meta-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( meta-pair );
+
+
+/*--------------------------------------------------------------------------
+ * StdMetaPair
+ */
+
+static
+void StdMetaPairWhack ( StdMetaPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ MetaPairDestroy ( self, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static MetaPair_vt StdMetaPair_vt =
+{
+ StdMetaPairWhack
+};
+
+
+/*--------------------------------------------------------------------------
+ * MetaPair
+ * interface to pairing of source and destination tables
+ */
+
+
+/* Make
+ * make a standard metadata pair from existing KMetadata objects
+ */
+MetaPair *MetaPairMake ( const ctx_t *ctx,
+ const KMetadata *src, KMetadata *dst, const char *full_path )
+{
+ FUNC_ENTRY ( ctx );
+
+ StdMetaPair *meta;
+
+ TRY ( meta = MemAlloc ( ctx, sizeof * meta, false ) )
+ {
+ TRY ( MetaPairInit ( meta, ctx, & StdMetaPair_vt, src, dst, full_path ) )
+ {
+ return meta;
+ }
+
+ MemFree ( ctx, meta, sizeof * meta );
+ }
+
+ return NULL;
+}
+
+
+/* Release
+ * called by table at end of copy
+ */
+void MetaPairRelease ( MetaPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "MetaPair" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcMetadata, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release MetaPair" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+MetaPair *MetaPairDuplicate ( MetaPair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "MetaPair" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcMetadata, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate MetaPair" );
+ return NULL;
+ }
+ }
+
+ return ( MetaPair* ) self;
+}
+
+
+/* Init
+ */
+void MetaPairInit ( MetaPair *self, const ctx_t *ctx, const MetaPair_vt *vt,
+ const KMetadata *src, KMetadata *dst, const char *full_spec )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ if ( self == NULL )
+ {
+ rc = RC ( rcExe, rcMetadata, rcConstructing, rcSelf, rcNull );
+ INTERNAL_ERROR ( rc, "bad MetaPair" );
+ return;
+ }
+
+ memset ( self, 0, sizeof * self );
+ self -> vt = vt;
+
+ rc = KMetadataAddRef ( self -> smeta = src );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate metadata 'src.%s'", full_spec );
+ else
+ {
+ rc = KMetadataAddRef ( self -> dmeta = dst );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate metadata 'dst.%s'", full_spec );
+ else
+ {
+ KRefcountInit ( & self -> refcount, 1, "MetaPair", "init", full_spec );
+ return;
+ }
+
+ KMetadataRelease ( self -> smeta );
+ self -> smeta = NULL;
+ }
+}
+
+/* Destroy
+ */
+void MetaPairDestroy ( MetaPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = KMetadataRelease ( self -> dmeta );
+ if ( rc != 0 )
+ WARN ( "KMetadataRelease failed" );
+ KMetadataRelease ( self -> smeta );
+
+ memset ( self, 0, sizeof * self );
+}
+
+
+static
+void copy_meta_node_value ( const KMDataNode *src, const ctx_t *ctx, KMDataNode *dst )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ char buff [ 32*1024 ];
+ size_t num_read, remaining;
+
+ rc = KMDataNodeRead ( src, 0, buff, sizeof buff, & num_read, & remaining );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeRead failed" );
+ else if ( num_read != 0 )
+ {
+ rc = KMDataNodeWrite ( dst, buff, num_read );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KMDataNodeWrite failed" );
+ else
+ {
+ size_t offset;
+ for ( offset = num_read; remaining != 0; offset += num_read )
+ {
+ rc = KMDataNodeRead ( src, offset, buff, sizeof buff, & num_read, & remaining );
+ if ( rc != 0 )
+ {
+ INTERNAL_ERROR ( rc, "KMDataNodeRead failed" );
+ break;
+ }
+ rc = KMDataNodeAppend ( dst, buff, num_read );
+ if ( rc != 0 )
+ {
+ SYSTEM_ERROR ( rc, "KMDataNodeAppend failed" );
+ break;
+ }
+ }
+ }
+ }
+}
+
+static
+void copy_meta_node_attr ( const KMDataNode *src, const ctx_t *ctx, KMDataNode *dst, const char *name )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ size_t num_read;
+ char buff [ 32*1024 ];
+
+ rc = KMDataNodeReadAttr ( src, name, buff, sizeof buff, & num_read );
+ if ( rc != 0 )
+ ERROR ( rc, "KMDataNodeReadAttr '%s' failed", name );
+ else
+ {
+ rc = KMDataNodeWriteAttr ( dst, name, buff );
+ if ( rc != 0 )
+ ERROR ( rc, "KMDataNodeWriteAttr '%s' failed", name );
+ }
+}
+
+
+static
+const char *filter_node_name ( const char *name, size_t nsize, const char **exclude )
+{
+ uint32_t i;
+ for ( i = 0; exclude [ i ] != NULL; ++ i )
+ {
+ const char *x = exclude [ i ];
+ size_t xsize = strlen ( x );
+
+ /* allow exclude to be a prefix */
+ if ( xsize > 0 && x [ xsize - 1 ] == '*' )
+ {
+ if ( nsize < -- xsize )
+ continue;
+ }
+ else if ( nsize != xsize )
+ {
+ continue;
+ }
+
+ if ( memcmp ( name, x, xsize ) == 0 )
+ return NULL;
+ }
+
+ return name;
+ }
+
+
+static
+void copy_meta_node ( const KMDataNode *src, const ctx_t *ctx, KMDataNode *dst,
+ char path [ 32*1024 ], size_t psize, const char *owner_spec, const char **exclude )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* first, copy value */
+ TRY ( copy_meta_node_value ( src, ctx, dst ) )
+ {
+ /* next, copy attributes */
+ KNamelist *names;
+ rc_t rc = KMDataNodeListAttr ( src, & names );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeListAttr failed" );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KNamelistCount failed" );
+ else
+ {
+ uint32_t i;
+ const char *name;
+ for ( i = 0; i < count; ++ i )
+ {
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ {
+ INTERNAL_ERROR ( rc, "KNamelistGet [ %u ] failed", i );
+ break;
+ }
+
+ ON_FAIL ( copy_meta_node_attr ( src, ctx, dst, name ) )
+ break;
+ }
+
+ if ( ! FAILED () )
+ {
+ KNamelistRelease ( names );
+
+ /* last, copy children */
+ rc = KMDataNodeListChildren ( src, & names );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMDataNodeListChildren failed" );
+ else
+ {
+ rc = KNamelistCount ( names, & count );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KNamelistCount failed" );
+ else if ( psize + 1 == 32*1024 )
+ {
+ rc = RC ( rcExe, rcNode, rcCopying, rcBuffer, rcInsufficient );
+ ERROR ( rc, "metadata path too long" );
+ }
+ else
+ {
+ for ( i = 0; i < count; ++ i )
+ {
+ KMDataNode *dchild;
+ const KMDataNode *schild;
+
+ size_t nsize;
+ static const char *always_exclude [] =
+ {
+ ".seq", "col", "schema",
+ "HUFFMAN*", "MSC454*", "NREADS", "NUMBER_P*", "NUMBER_S*",
+ NULL
+ };
+
+ rc = KNamelistGet ( names, i, & name );
+ if ( rc != 0 )
+ {
+ INTERNAL_ERROR ( rc, "KNamelistGet [ %u ] failed", i );
+ break;
+ }
+
+ nsize = string_size ( name );
+ if ( psize + nsize + 1 >= 32*1024 )
+ {
+ WARN ( "skipping node '%.*s/%s' - path too long", ( uint32_t ) psize, path, name );
+ continue;
+ }
+
+ if ( psize != 0 )
+ path [ psize ++ ] = '/';
+ strcpy ( & path [ psize ], name );
+
+ if ( exclude != NULL )
+ {
+ name = filter_node_name ( name, nsize, exclude );
+ if ( name == NULL )
+ continue;
+ }
+
+ name = filter_node_name ( name, nsize, always_exclude );
+ if ( name == NULL )
+ continue;
+
+ rc = KMDataNodeOpenNodeRead ( src, & schild, "%s", name );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to open source metadata node '%s'", name );
+ else
+ {
+ rc = KMDataNodeOpenNodeUpdate ( dst, & dchild, "%s", name );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to open destination metadata node '%s'", name );
+ else
+ {
+ copy_meta_node ( schild, ctx, dchild, path, psize + nsize, owner_spec, exclude );
+ KMDataNodeRelease ( dchild );
+ }
+
+ KMDataNodeRelease ( schild );
+ }
+
+ if ( FAILED () )
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ KNamelistRelease ( names );
+ }
+ }
+}
+
+
+/* Copy
+ * copy from source to destination
+ */
+void MetaPairCopy ( MetaPair *self, const ctx_t *ctx, const char *owner_spec, const char **exclude )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ char path [ 32*1024 ];
+ const KMDataNode *src;
+
+ STATUS ( 3, "copying '%s' metadata", owner_spec );
+
+ rc = KMetadataOpenNodeRead ( self -> smeta, & src, "/" );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMetadataOpenNodeRead failed to obtain '%s' root node", owner_spec );
+ else
+ {
+ KMDataNode *dst;
+ rc = KMetadataOpenNodeUpdate ( self -> dmeta, & dst, "/" );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMetadataOpenNodeUpdate failed to obtain '%s' root node", owner_spec );
+ else
+ {
+ path [ 0 ] = 0;
+ copy_meta_node ( src, ctx, dst, path, 0, owner_spec, exclude );
+
+ KMDataNodeRelease ( dst );
+ }
+
+ KMDataNodeRelease ( src );
+ }
+
+ STATUS ( 3, "finished copying metadata" );
+}
diff --git a/tools/sra-sort/meta-pair.h b/tools/sra-sort/meta-pair.h
new file mode 100644
index 0000000..1aa65e5
--- /dev/null
+++ b/tools/sra-sort/meta-pair.h
@@ -0,0 +1,109 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_meta_pair_
+#define _h_sra_sort_meta_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KMetadata;
+
+
+/*--------------------------------------------------------------------------
+ * MetaPair
+ * interface to pairing of source and destination tables
+ */
+typedef struct MetaPair_vt MetaPair_vt;
+
+typedef struct MetaPair MetaPair;
+struct MetaPair
+{
+ /* polymorphic */
+ const MetaPair_vt *vt;
+
+ /* the pair of KMetadata */
+ struct KMetadata const *smeta;
+ struct KMetadata *dmeta;
+
+ KRefcount refcount;
+};
+
+#ifndef METAPAIR_IMPL
+#define METAPAIR_IMPL MetaPair
+#endif
+
+struct MetaPair_vt
+{
+ void ( * whack ) ( METAPAIR_IMPL *self, const ctx_t *ctx );
+};
+
+
+/* Make
+ * make a standard metadata pair from existing KMetadata objects
+ */
+MetaPair *MetaPairMake ( const ctx_t *ctx,
+ struct KMetadata const *src, struct KMetadata *dst,
+ const char *full_path );
+
+
+/* Release
+ * called by table at end of copy
+ */
+void MetaPairRelease ( MetaPair *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+MetaPair *MetaPairDuplicate ( MetaPair *self, const ctx_t *ctx );
+
+
+/* Init
+ */
+void MetaPairInit ( MetaPair *self, const ctx_t *ctx, const MetaPair_vt *vt,
+ struct KMetadata const *src, struct KMetadata *dst, const char *full_spec );
+
+/* Destroy
+ */
+void MetaPairDestroy ( MetaPair *self, const ctx_t *ctx );
+
+
+/* Copy
+ * copy from source to destination
+ */
+void MetaPairCopy ( MetaPair *self, const ctx_t *ctx,
+ const char *owner_spec, const char **exclude );
+
+
+#endif /* _h_sra_sort_meta_pair_ */
diff --git a/tools/sra-sort/paged-membank.c b/tools/sra-sort/paged-membank.c
new file mode 100644
index 0000000..a91c4d4
--- /dev/null
+++ b/tools/sra-sort/paged-membank.c
@@ -0,0 +1,244 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct PagedMemBank PagedMemBank;
+#define MEMBANK_IMPL PagedMemBank
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+#include "sra-sort.h"
+
+#include "membank-priv.h"
+
+#include <klib/container.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+FILE_ENTRY ( paged-membank );
+
+
+/*--------------------------------------------------------------------------
+ * MemPage
+ */
+typedef struct MemPage MemPage;
+struct MemPage
+{
+ SLNode n;
+ size_t used;
+};
+
+/*--------------------------------------------------------------------------
+ * PagedMemBank
+ * designed to allocate a lot of little bits of memory
+ * and then free them all at once
+ */
+struct PagedMemBank
+{
+ MemBank dad;
+ size_t quota;
+ size_t avail;
+ size_t pgsize;
+ SLList pages;
+};
+
+
+/* Whack
+ */
+static
+void PagedMemBankWhack ( PagedMemBank *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ MemPage *pg = ( MemPage* ) SLListPopHead ( & self -> pages );
+ while ( pg != NULL )
+ {
+ MemFree ( ctx, pg, self -> pgsize );
+ pg = ( MemPage* ) SLListPopHead ( & self -> pages );
+ }
+
+ MemBankDestroy ( & self -> dad, ctx );
+
+ MemFree ( ctx, self, sizeof * self );
+}
+
+
+/* InUse
+ * report the number of bytes in use
+ * optionally returns quota
+ */
+static
+size_t PagedMemBankInUse ( const PagedMemBank *self, const ctx_t *ctx, size_t *quota )
+{
+ size_t dummy;
+
+ if ( quota == NULL )
+ quota = & dummy;
+
+ if ( self != NULL )
+ {
+ * quota = self -> quota;
+ return self -> quota - self -> avail;
+ }
+
+ * quota = 0;
+ return 0;
+}
+
+
+/* Alloc
+ * allocates some memory from bank
+ */
+static
+void *PagedMemBankAlloc ( PagedMemBank *self, const ctx_t *ctx, size_t bytes, bool clear )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ void *mem;
+ size_t avail;
+
+ /* check current alloc page */
+ MemPage *pg = ( MemPage* ) SLListHead ( & self -> pages );
+ if ( pg != NULL )
+ {
+ /* calculate bytes available */
+ avail = self -> pgsize - pg -> used;
+ if ( avail >= bytes )
+ {
+ /* got the memory */
+ mem = & ( ( uint8_t* ) pg ) [ pg -> used ];
+ pg -> used += bytes;
+
+ /* zero it out if so requested */
+ if ( clear )
+ memset ( mem, 0, bytes );
+
+ return mem;
+ }
+ }
+
+ /* either didn't have a page or didn't have enough memory
+ test for being able to fit in ANY page */
+ if ( bytes > self -> pgsize - sizeof * pg )
+ {
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcData, rcExcessive );
+ ERROR ( rc, "requested memory allocation of %zu bytes is too large to fit into a page", bytes );
+ return NULL;
+ }
+
+ /* allocate the bytes */
+ if ( self -> avail >= self -> pgsize )
+ {
+ /* going to allocate a full page */
+ self -> avail -= self -> pgsize;
+
+ /* ask process for memory block */
+ TRY ( pg = MemAlloc ( ctx, self -> pgsize, false ) )
+ {
+ /* got it - push it onto stack */
+ pg -> used = sizeof * pg + bytes;
+ SLListPushHead ( & self -> pages, & pg -> n );
+
+ /* clear memory of asked */
+ mem = pg + 1;
+ if ( clear )
+ memset ( mem, 0, bytes );
+
+ return mem;
+ }
+
+ /* return with error from main MemBank */
+ return NULL;
+ }
+
+ /* at this point we could be using a timeout */
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcRange, rcExcessive );
+ ERROR ( rc, "quota exceeded allocating %zu bytes of page memory for a %zu byte block", self -> pgsize, bytes );
+
+ return NULL;
+}
+
+
+/* Free
+ * ignored by paged bank
+ */
+static
+void PagedMemBankFree ( PagedMemBank *self, const ctx_t *ctx, void *mem, size_t bytes )
+{
+}
+
+
+static MemBank_vt PagedMemBank_vt =
+{
+ PagedMemBankWhack,
+ PagedMemBankInUse,
+ PagedMemBankAlloc,
+ PagedMemBankFree
+};
+
+
+/*--------------------------------------------------------------------------
+ * MemBank
+ * very, very, very watered down memory bank
+ */
+
+/* MakePaged
+ * make a new paged memory bank
+ */
+MemBank *MemBankMakePaged ( const ctx_t *ctx, size_t quota, size_t pgsize )
+{
+ FUNC_ENTRY ( ctx );
+ PagedMemBank *mem;
+
+ /* special case for using memory mapped banks */
+ if ( ctx -> caps -> tool -> mmapdir != NULL )
+ return MemBankMakePagedMMap ( ctx, quota, pgsize );
+
+ if ( pgsize < 4096 )
+ pgsize = 4096;
+
+ if ( quota < pgsize )
+ quota = pgsize;
+
+ TRY ( mem = MemAlloc ( ctx, sizeof * mem, true ) )
+ {
+ TRY ( MemBankInit ( & mem -> dad, ctx, & PagedMemBank_vt, "Task MemBank" ) )
+ {
+ mem -> quota = mem -> avail = quota;
+ mem -> pgsize = pgsize;
+ return & mem -> dad;
+ }
+
+ MemFree ( ctx, mem, sizeof * mem );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/paged-mmapbank.c b/tools/sra-sort/paged-mmapbank.c
new file mode 100644
index 0000000..aa6d6e5
--- /dev/null
+++ b/tools/sra-sort/paged-mmapbank.c
@@ -0,0 +1,399 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct PagedMMapBank PagedMMapBank;
+#define MEMBANK_IMPL PagedMMapBank
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+#include "sra-sort.h"
+
+#include "membank-priv.h"
+
+#include <kfs/mmap.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <klib/container.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+FILE_ENTRY ( paged-mmapbank );
+
+
+/*--------------------------------------------------------------------------
+ * MMapPage
+ * a "page" which is really an entire mmap
+ */
+typedef struct MMapPage MMapPage;
+struct MMapPage
+{
+ SLNode n;
+ KMMap *mmap;
+ uint8_t *addr;
+ size_t size;
+ size_t used;
+};
+
+static
+void CC MMapPageWhack ( SLNode *n, void *data )
+{
+ MMapPage *self = ( MMapPage* ) n;
+ const ctx_t *ctx = ( const void* ) data;
+
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc = KMMapRelease ( self -> mmap );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KMMapRelease failed" );
+
+ MemFree ( ctx, self, sizeof * self );
+}
+
+
+/*--------------------------------------------------------------------------
+ * PagedMMapBank
+ * a memory bank based upon system mmap
+ */
+struct PagedMMapBank
+{
+ MemBank dad;
+ size_t quota;
+ size_t used;
+ size_t pgsize;
+ KFile *backing;
+ SLList pages;
+};
+
+
+/* Whack
+ */
+static
+void PagedMMapBankWhack ( PagedMMapBank *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ SLListWhack ( & self -> pages, MMapPageWhack, ( void* ) ctx );
+
+ rc = KFileRelease ( self -> backing );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KFileRelease failed on backing file" );
+ self -> backing = NULL;
+
+ MemBankDestroy ( & self -> dad, ctx );
+
+ MemFree ( ctx, self, sizeof * self );
+}
+
+
+/* InUse
+ * report the number of bytes in use
+ * optionally returns quota
+ */
+static
+size_t PagedMMapBankInUse ( const PagedMMapBank *self, const ctx_t *ctx, size_t *quota )
+{
+ size_t dummy;
+
+ if ( quota == NULL )
+ quota = & dummy;
+
+ if ( self != NULL )
+ {
+ * quota = self -> quota;
+ return self -> used;
+ }
+
+ * quota = 0;
+ return 0;
+}
+
+
+/* CreateBacking
+ */
+static
+void PagedMMapBankCreateBacking ( PagedMMapBank *self, const ctx_t *ctx, KFile **backing )
+{
+ FUNC_ENTRY ( ctx );
+
+ KDirectory *wd;
+ rc_t rc = KDirectoryNativeDir ( & wd );
+ if ( rc != 0 )
+ ABORT ( rc, "KDirectoryNativeDir failed" );
+ else
+ {
+ static uint32_t file_no;
+ const Tool *tp = ctx -> caps -> tool;
+
+ ++ file_no;
+ STATUS ( 5, "creating backing file '%s/sra-sort-buffer.%d.%u'", tp -> mmapdir, tp -> pid, file_no );
+
+ rc = KDirectoryCreateFile ( wd, backing, true,
+ 0600, kcmInit | kcmParents, "%s/sra-sort-buffer.%d.%u",
+ tp -> mmapdir, tp -> pid, file_no );
+ if ( rc != 0 )
+ ABORT ( rc, "KDirectoryCreateFile failed when creating mem-mapped buffer" );
+ else
+ {
+#if ! WINDOWS
+ /* unlinking file is a wonderful thing */
+ if ( tp -> unlink_idx_files )
+ {
+ /* unlink KFile */
+ STATUS ( 5, "unlinking backing file '%s/sra-sort-buffer.%d.%u'", tp -> mmapdir, tp -> pid, file_no );
+ rc = KDirectoryRemove ( wd, false, "%s/sra-sort-buffer.%d.%u",
+ tp -> mmapdir, tp -> pid, file_no );
+ if ( rc != 0 )
+ WARN ( "failed to unlink mem-mapped buffer file #%u", file_no );
+ }
+#endif
+ /* set initial size to a page */
+ rc = KFileSetSize ( * backing, self -> pgsize );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KFileSetSize failed to set file to %zu bytes", self -> pgsize );
+ }
+
+ KDirectoryRelease ( wd );
+ }
+}
+
+
+/* ExtendBacking
+ * creates a backing file if not there
+ * extends it otherwise
+ */
+static
+void PagedMMapBankExtendBacking ( PagedMMapBank *self, const ctx_t *ctx )
+{
+#if USE_SINGLE_BACKING_FILE
+
+ /* this code is only useful if using a single file for all maps */
+ FUNC_ENTRY ( ctx );
+
+ /* create the file on first attempt */
+ if ( self -> backing == NULL )
+ {
+ assert ( self -> used == 0 );
+ PagedMMapBankCreateBacking ( self, ctx, & self -> backing )l
+ }
+ else
+ {
+ /* extend the file */
+ rc_t rc;
+ STATUS ( 4, "extending common buffer file to %,zu bytes", self -> used + self -> pgsize );
+ rc = KFileSetSize ( self -> backing, self -> used + self -> pgsize );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KFileSetSize failed to extend file size to %zu bytes", self -> used + self -> pgsize );
+ }
+#endif
+}
+
+
+/* MapPage
+ */
+static
+void PagedMMapBankMapPage ( PagedMMapBank *self, const ctx_t *ctx, MMapPage *pg )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+#if USE_SINGLE_BACKING_FILE
+ STATUS ( 4, "allocating new mmap of %,zu bytes onto common file at offset %,zu", self -> pgsize, self -> used );
+ rc = KMMapMakeRgnUpdate ( & pg -> mmap, self -> backing, self -> used, self -> pgsize );
+#else
+ KFile *backing;
+ ON_FAIL ( PagedMMapBankCreateBacking ( self, ctx, & backing ) )
+ return;
+
+ STATUS ( 4, "allocating new mmap of %,zu bytes onto its own file", self -> pgsize );
+ rc = KMMapMakeRgnUpdate ( & pg -> mmap, backing, 0, self -> pgsize );
+ KFileRelease ( backing );
+#endif
+
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "KMMapMakeRgnUpdate failed creating %zu byte region", self -> pgsize );
+ else
+ {
+ rc = KMMapAddrUpdate ( pg -> mmap, ( void** ) & pg -> addr );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMMapAddrUpdate failed" );
+ else
+ {
+ rc = KMMapSize ( pg -> mmap, & pg -> size );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "KMMapSize failed" );
+ else
+ {
+ pg -> used = 0;
+ self -> used += self -> pgsize;
+ STATUS ( 4, "total mem-mapped buffer space: %,zu bytes", self -> used );
+ return;
+ }
+ }
+
+ KMMapRelease ( pg -> mmap );
+ pg -> mmap = NULL;
+ }
+}
+
+
+/* Alloc
+ * allocates some memory from bank
+ */
+static
+void *PagedMMapBankAlloc ( PagedMMapBank *self, const ctx_t *ctx, size_t bytes, bool clear )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ void *mem;
+ size_t avail;
+
+ /* check current alloc page */
+ MMapPage *pg = ( MMapPage* ) SLListHead ( & self -> pages );
+ if ( pg != NULL )
+ {
+ /* calculate bytes available */
+ avail = pg -> size - pg -> used;
+ if ( avail >= bytes )
+ {
+ /* got the memory */
+ mem = & pg -> addr [ pg -> used ];
+ pg -> used += bytes;
+
+ /* zero it out if so requested */
+ if ( clear )
+ memset ( mem, 0, bytes );
+
+ return mem;
+ }
+ }
+
+ /* either didn't have a page or didn't have enough memory
+ test for being able to fit in ANY page */
+ if ( bytes > self -> pgsize )
+ {
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcData, rcExcessive );
+ ERROR ( rc, "requested memory allocation of %zu bytes is too large to fit into a page", bytes );
+ return NULL;
+ }
+
+ /* allocate the bytes */
+ if ( self -> used + self -> pgsize <= self -> quota )
+ {
+ /* ask process for memory block */
+ TRY ( pg = MemAlloc ( ctx, sizeof * pg, false ) )
+ {
+ /* increase size of underlying file */
+ TRY ( PagedMMapBankExtendBacking ( self, ctx ) )
+ {
+ TRY ( PagedMMapBankMapPage ( self, ctx, pg ) )
+ {
+ /* got it - push it onto stack */
+ SLListPushHead ( & self -> pages, & pg -> n );
+
+ /* clear memory of asked */
+ mem = pg -> addr;
+ pg -> used = bytes;
+ if ( clear )
+ memset ( mem, 0, bytes );
+
+ return mem;
+ }
+ }
+
+ MemFree ( ctx, pg, sizeof * pg );
+ }
+
+ return NULL;
+ }
+
+ /* at this point we could be using a timeout */
+ rc = RC ( rcExe, rcMemory, rcAllocating, rcRange, rcExcessive );
+ ERROR ( rc, "quota exceeded allocating %zu bytes of page memory for a %zu byte block", self -> pgsize, bytes );
+
+ return NULL;
+}
+
+
+/* Free
+ * ignored by paged bank
+ */
+static
+void PagedMMapBankFree ( PagedMMapBank *self, const ctx_t *ctx, void *mem, size_t bytes )
+{
+}
+
+
+static MemBank_vt PagedMMapBank_vt =
+{
+ PagedMMapBankWhack,
+ PagedMMapBankInUse,
+ PagedMMapBankAlloc,
+ PagedMMapBankFree
+};
+
+
+/*--------------------------------------------------------------------------
+ * MemBank
+ * very, very, very watered down memory bank
+ */
+
+/* MakePagedMMap
+ * make a new paged memory bank backed by memory map
+ */
+MemBank *MemBankMakePagedMMap ( const ctx_t *ctx, size_t quota, size_t pgsize )
+{
+ FUNC_ENTRY ( ctx );
+ PagedMMapBank *mem;
+
+ if ( pgsize < 256 * 1024 * 1024 )
+ pgsize = 256 * 1024 * 1024;
+
+ if ( quota < pgsize )
+ quota = pgsize;
+
+ TRY ( mem = MemAlloc ( ctx, sizeof * mem, true ) )
+ {
+ TRY ( MemBankInit ( & mem -> dad, ctx, & PagedMMapBank_vt, "Memory Mapped Task MemBank" ) )
+ {
+ mem -> quota = quota;
+ mem -> pgsize = pgsize;
+ return & mem -> dad;
+ }
+
+ MemFree ( ctx, mem, sizeof * mem );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/poslen-col-pair.c b/tools/sra-sort/poslen-col-pair.c
new file mode 100644
index 0000000..51983d8
--- /dev/null
+++ b/tools/sra-sort/poslen-col-pair.c
@@ -0,0 +1,559 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct PoslenColReader PoslenColReader;
+#define COLREADER_IMPL PoslenColReader
+
+typedef struct PoslenColWriter PoslenColWriter;
+#define COLWRITER_IMPL PoslenColWriter
+
+#include "col-pair.h"
+#include "tbl-pair.h"
+#include "map-file.h"
+#include "glob-poslen.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kapp/main.h>
+#include <kfs/defs.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+FILE_ENTRY ( poslen-col-pair );
+
+
+/*--------------------------------------------------------------------------
+ * PoslenColReader
+ * implementation of ColumnReader based upon MapFile temp column read
+ */
+struct PoslenColReader
+{
+ ColumnReader dad;
+
+ /* cached first id in column */
+ int64_t first_id;
+
+ /* buffer for reading poslen */
+ int64_t start_id, excl_stop_id;
+ uint64_t *buff;
+ size_t max_ids;
+
+ /* source of poslen */
+ const MapFile *tmp_col;
+
+ size_t full_spec_size;
+ char full_spec [ 1 ];
+};
+
+
+/* Whack
+ */
+static
+void PoslenColReaderWhack ( PoslenColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* self-bytes */
+ size_t bytes = sizeof * self + self -> full_spec_size;
+
+ /* free buffer */
+ if ( self -> buff != NULL )
+ {
+ ON_FAIL ( MemFree ( ctx, self -> buff, self -> max_ids * sizeof * self -> buff ) )
+ {
+ CLEAR ();
+ }
+ self -> buff = NULL;
+ }
+
+ /* release MapFile */
+ ON_FAIL ( MapFileRelease ( self -> tmp_col, ctx ) )
+ {
+ WARN ( "MapFileRelease failed on '%s'", self -> full_spec );
+ CLEAR ();
+ }
+ self -> tmp_col = NULL;
+
+ /* free self */
+ MemFree ( ctx, self, bytes );
+}
+
+/* FullSpec
+ */
+static
+const char *PoslenColReaderFullSpec ( const PoslenColReader *self, const ctx_t *ctx )
+{
+ return self -> full_spec;
+}
+
+
+/* IdRange
+ * returns the number of ids available
+ * and optionally the first id
+ */
+static
+uint64_t PoslenColReaderIdRange ( const PoslenColReader *self,
+ const ctx_t *ctx, int64_t *opt_first )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( opt_first != NULL )
+ {
+ ON_FAIL ( * opt_first = self -> first_id )
+ return 0;
+ }
+
+ return MapFileCount ( self -> tmp_col, ctx );
+}
+
+
+/* PreCopy
+ * create buffer
+ */
+static
+void PoslenColReaderPreCopy ( PoslenColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ const Tool *tp = ctx -> caps -> tool;
+
+ self -> max_ids = tp -> max_poslen_ids;
+ if ( tp -> max_poslen_ids < 4096 )
+ self -> max_ids = 4096;
+
+ TRY ( self -> buff = MemAlloc ( ctx, self -> max_ids * sizeof * self -> buff, false ) )
+ {
+ self -> start_id = self -> excl_stop_id = self -> first_id;
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate buffer for PoslenColReader" );
+ }
+}
+
+
+/* PostCopy
+ * douse buffer
+ */
+static
+void PoslenColReaderPostCopy ( PoslenColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> buff != NULL )
+ {
+ TRY ( MemFree ( ctx, self -> buff, self -> max_ids * sizeof * self -> buff ) )
+ {
+ self -> buff = NULL;
+ }
+ }
+}
+
+
+/* Read
+ * read next row of data
+ * returns NULL if no rows are available
+ */
+static
+const void *PoslenColReaderRead ( PoslenColReader *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint32_t dummy;
+
+ if ( elem_bits == NULL )
+ elem_bits = & dummy;
+ if ( boff == NULL )
+ boff = & dummy;
+ if ( row_len == NULL )
+ row_len = & dummy;
+
+ * elem_bits = 64;
+ * boff = 0;
+ * row_len = 0;
+
+ assert ( self -> buff != NULL );
+
+ if ( row_id < self -> start_id || row_id >= self -> excl_stop_id )
+ {
+ size_t num_read;
+
+ if ( row_id < self -> first_id )
+ return NULL;
+
+ /* generate page-aligned starting id */
+ self -> start_id = ( row_id - self -> first_id );
+ self -> start_id -= self -> start_id % self -> max_ids;
+ self -> start_id += self -> first_id;
+ assert ( self -> start_id + self -> max_ids > row_id );
+
+ /* read into buffer */
+ ON_FAIL ( num_read = MapFileReadPoslen ( self -> tmp_col, ctx, self -> start_id, self -> buff, self -> max_ids ) )
+ {
+ self -> start_id = self -> excl_stop_id = self -> first_id;
+ return NULL;
+ }
+ self -> excl_stop_id = self -> start_id + num_read;
+
+ if ( row_id >= self -> excl_stop_id )
+ return NULL;
+ }
+
+ * row_len = 1;
+ return & self -> buff [ row_id - self -> start_id ];
+}
+
+static ColumnReader_vt PoslenColReader_vt =
+{
+ PoslenColReaderWhack,
+ PoslenColReaderFullSpec,
+ PoslenColReaderIdRange,
+ PoslenColReaderPreCopy,
+ PoslenColReaderPostCopy,
+ PoslenColReaderRead
+};
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ */
+
+
+/* MakePoslenColReader
+ * make temporary column reader
+ */
+ColumnReader *TablePairMakePoslenColReader ( TablePair *self, const ctx_t *ctx,
+ const MapFile *tmp_col, const char *colspec )
+{
+ FUNC_ENTRY ( ctx );
+
+ PoslenColReader *col;
+ size_t full_spec_size = self -> full_spec_size + string_size ( colspec ) + sizeof "src.." - 1;
+
+ TRY ( col = MemAlloc ( ctx, sizeof * col + full_spec_size, false ) )
+ {
+ TRY ( ColumnReaderInit ( & col -> dad, ctx, & PoslenColReader_vt ) )
+ {
+ TRY ( col -> first_id = MapFileFirst ( tmp_col, ctx ) )
+ {
+ TRY ( col -> tmp_col = MapFileDuplicate ( tmp_col, ctx ) )
+ {
+ rc_t rc;
+
+ col -> dad . presorted = true;
+ col -> start_id = col -> excl_stop_id = col -> first_id;
+ col -> buff = NULL;
+ col -> max_ids = ctx -> caps -> tool -> max_poslen_ids;
+ col -> full_spec_size = ( uint32_t ) full_spec_size;
+
+ rc = string_printf ( col -> full_spec, full_spec_size + 1, NULL,
+ "src.%s.%s", self -> full_spec, colspec );
+ if ( rc == 0 )
+ return & col -> dad;
+
+ ABORT ( rc, "miscalculated string size" );
+ }
+ }
+ }
+
+ MemFree ( ctx, col, sizeof * col + full_spec_size );
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate %zu bytes for PoslenColReader", sizeof * col + full_spec_size );
+ }
+
+ return NULL;
+
+}
+
+
+/*--------------------------------------------------------------------------
+ * PoslenColWriter
+ * implementation of ColumnWriter based upon VCursor
+ */
+struct PoslenColWriter
+{
+ ColumnWriter dad;
+
+ VCursor *curs;
+ uint32_t global_ref_start;
+ uint32_t ref_len;
+
+ uint32_t full_spec_size;
+ char full_spec [ 1 ];
+};
+
+static
+void PoslenColWriterWhack ( PoslenColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorRelease failed on column '%s'", self -> full_spec );
+
+ MemFree ( ctx, self, sizeof * self + self -> full_spec_size );
+}
+
+
+static
+const char *PoslenColWriterFullSpec ( const PoslenColWriter *self, const ctx_t *ctx )
+{
+ return self -> full_spec;
+}
+
+static
+void PoslenColWriterDummyStub ( PoslenColWriter *self, const ctx_t *ctx )
+{
+}
+
+static
+void PoslenColWriterWrite ( PoslenColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ uint64_t poslen;
+
+ uint32_t ref_len;
+ uint64_t global_ref_start;
+
+ assert ( elem_bits == 64 );
+ assert ( boff == 0 );
+ assert ( row_len == 1 );
+
+ memmove ( & poslen, data, sizeof poslen );
+ global_ref_start = decode_pos_len ( poslen );
+ ref_len = poslen_to_len ( poslen );
+
+ rc = VCursorOpenRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpenRow failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> global_ref_start, sizeof global_ref_start * 8, & global_ref_start, 0, 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for GLOBAL_REF_START of column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> ref_len, sizeof ref_len * 8, & ref_len, 0, 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for REF_LEN of column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorCommitRow ( self -> curs );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorCommit failed for column '%s'", self -> full_spec );
+ }
+ }
+
+ rc = VCursorCloseRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorCloseRow failed on column '%s'", self -> full_spec );
+ }
+}
+
+static
+void PoslenColWriterWriteStatic ( PoslenColWriter *self, const ctx_t *ctx,
+ uint32_t elem_bits, const void *data, uint32_t boff, uint32_t row_len, uint64_t count )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint64_t poslen;
+
+ uint32_t ref_len;
+ uint64_t global_ref_start;
+
+ assert ( elem_bits == 64 );
+ assert ( boff == 0 );
+ assert ( row_len == 1 );
+
+ memmove ( & poslen, data, sizeof poslen );
+ global_ref_start = decode_pos_len ( poslen );
+ ref_len = poslen_to_len ( poslen );
+
+ for ( ; ! FAILED () && count > 0; -- count )
+ {
+ rc_t rc = VCursorOpenRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpenRow failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> global_ref_start, sizeof global_ref_start * 8, & global_ref_start, 0, 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for GLOBAL_REF_START of column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorWrite ( self -> curs, self -> ref_len, sizeof ref_len * 8, & ref_len, 0, 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorWrite failed for REF_LEN of column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorCommitRow ( self -> curs );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorCommit failed for column '%s'", self -> full_spec );
+ else if ( count > 1 )
+ {
+ uint64_t cnt = (count < 0x10000000U ) ? count : 0x10000000U;
+ rc = VCursorRepeatRow ( self -> curs, cnt - 1 );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "VCursorRepeatRow failed for column '%s'", self -> full_spec );
+ count -= cnt - 1;
+ }
+ }
+ }
+
+ rc = VCursorCloseRow ( self -> curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorCloseRow failed on column '%s'", self -> full_spec );
+ }
+ }
+}
+
+static
+void PoslenColWriterCommit ( PoslenColWriter *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VCursorCommit ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorCommit failed on column '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorRelease ( self -> curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorRelease failed on column '%s'", self -> full_spec );
+ else
+ {
+ self -> curs = NULL;
+ }
+ }
+}
+
+
+static ColumnWriter_vt PoslenColWriter_vt =
+{
+ PoslenColWriterWhack,
+ PoslenColWriterFullSpec,
+ PoslenColWriterDummyStub,
+ PoslenColWriterDummyStub,
+ PoslenColWriterWrite,
+ PoslenColWriterWriteStatic,
+ PoslenColWriterCommit
+};
+
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ */
+
+
+/* MakePoslenColWriter
+ */
+ColumnWriter *TablePairMakePoslenColWriter ( TablePair *self, const ctx_t *ctx,
+ VCursor *opt_curs, const char *colspec )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ VCursor *curs;
+
+ if ( opt_curs != NULL )
+ rc = VCursorAddRef ( curs = opt_curs );
+ else
+ rc = VTableCreateCursorWrite ( self -> dtbl, & curs, kcmInsert );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create cursor on column 'dst.%s.%s'", self -> full_spec, colspec );
+ else
+ {
+ uint32_t global_ref_start;
+ const char *subcolspec = "(U64)GLOBAL_REF_START";
+ rc = VCursorAddColumn ( curs, & global_ref_start, subcolspec );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to add column 'dst.%s.%s' to cursor", self -> full_spec, subcolspec );
+ else
+ {
+ uint32_t ref_len;
+ subcolspec = "(INSDC:coord:len)REF_LEN";
+ rc = VCursorAddColumn ( curs, & ref_len, subcolspec );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to add column 'dst.%s.%s' to cursor", self -> full_spec, subcolspec );
+ else
+ {
+ VCursorSuspendTriggers ( curs );
+ rc = VCursorOpen ( curs );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to open cursor on columns for 'dst.%s.%s'", self -> full_spec, colspec );
+ else
+ {
+ PoslenColWriter *col;
+ size_t full_spec_size = self -> full_spec_size + string_size ( colspec ) + sizeof "dst.." - 1;
+
+ TRY ( col = MemAlloc ( ctx, sizeof * col + full_spec_size, false ) )
+ {
+ ColumnWriterInit ( & col -> dad, ctx, & PoslenColWriter_vt, false );
+ col -> curs = curs;
+ col -> global_ref_start = global_ref_start;
+ col -> ref_len = ref_len;
+
+ col -> full_spec_size = ( uint32_t ) full_spec_size;
+ rc = string_printf ( col -> full_spec, full_spec_size + 1, NULL,
+ "dst.%s.%s", self -> full_spec, colspec );
+ if ( rc == 0 )
+ return & col -> dad;
+
+ ABORT ( rc, "miscalculated string size" );
+ }
+ CATCH_ALL ()
+ {
+ ANNOTATE ( "failed to allocate %zu bytes for PoslenColWriter", sizeof * col + full_spec_size );
+ }
+ }
+ }
+ }
+
+ VCursorRelease ( curs );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/poslen-col-pair.h b/tools/sra-sort/poslen-col-pair.h
new file mode 100644
index 0000000..e4f4087
--- /dev/null
+++ b/tools/sra-sort/poslen-col-pair.h
@@ -0,0 +1,63 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_poslen_col_pair_
+#define _h_sra_sort_poslen_col_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VCursor;
+struct TablePair;
+struct ColumnReader;
+struct ColumnWriter;
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ */
+
+
+/* MakePoslenColReader
+ * make temporary column reader
+ */
+struct ColumnReader *TablePairMakePoslenColReader ( struct TablePair *self, const ctx_t *ctx,
+ struct MapFile const *tmp_col, const char *colspec );
+
+
+/* MakePoslenColWriter
+ */
+struct ColumnWriter *TablePairMakePoslenColWriter ( struct TablePair *self,
+ const ctx_t *ctx, struct VCursor *opt_curs, const char *colspec );
+
+
+
+#endif /* _h_sra_sort_poslen_col_pair_ */
diff --git a/tools/sra-sort/ref-alignid-col.c b/tools/sra-sort/ref-alignid-col.c
new file mode 100644
index 0000000..6491484
--- /dev/null
+++ b/tools/sra-sort/ref-alignid-col.c
@@ -0,0 +1,702 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+struct AlignIdColReader;
+#define COLREADER_IMPL struct AlignIdColReader
+
+#include "ref-alignid-col.h"
+#include "glob-poslen.h"
+#include "csra-tbl.h"
+#include "csra-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "idx-mapping.h"
+#include "map-file.h"
+#include "sra-sort.h"
+
+#include <vdb/cursor.h>
+#include <kapp/main.h>
+#include <klib/sort.h>
+#include <klib/rc.h>
+
+#include <string.h>
+#include <assert.h>
+
+FILE_ENTRY ( ref-alignid-col );
+
+
+/*--------------------------------------------------------------------------
+ * IdPosLen
+ */
+typedef struct IdPosLen IdPosLen;
+struct IdPosLen
+{
+ int64_t id;
+ uint64_t poslen;
+};
+
+#if USE_OLD_KSORT
+static
+int64_t CC IdPosLenCmpPos ( const void *a, const void *b, void *data )
+{
+ const IdPosLen *ap = a;
+ const IdPosLen *bp = b;
+
+ if ( ap -> poslen < bp -> poslen )
+ return -1;
+ if ( ap -> poslen > bp -> poslen )
+ return 1;
+
+ return ap -> id < bp -> id ? -1 : ap -> id > bp -> id;
+}
+
+static
+int64_t CC cmp_int64_t ( const void *a, const void *b, void *data )
+{
+ const int64_t *ap = a;
+ const int64_t *bp = b;
+
+ return * ap < * bp ? -1 : * ap > * bp;
+}
+#else
+
+static
+void ksort_IdPosLen_pos ( IdPosLen *pbase, size_t total_elems )
+{
+#define SWAP( a, b, off, size ) \
+ do \
+ { \
+ IdPosLen tmp = * ( const IdPosLen* ) ( a ); \
+ * ( IdPosLen* ) ( a ) = * ( const IdPosLen* ) ( b ); \
+ * ( IdPosLen* ) ( b ) = tmp; \
+ } while ( 0 )
+
+
+#define CMP( a, b ) \
+ ( ( ( ( const IdPosLen* ) ( a ) ) -> poslen == ( ( const IdPosLen* ) ( b ) ) -> poslen ) ? \
+ ( ( ( const IdPosLen* ) ( a ) ) -> id < ( ( const IdPosLen* ) ( b ) ) -> id ) ? -1 : \
+ ( ( ( const IdPosLen* ) ( a ) ) -> id > ( ( const IdPosLen* ) ( b ) ) -> id ) \
+ : ( ( ( const IdPosLen* ) ( a ) ) -> poslen < ( ( const IdPosLen* ) ( b ) ) -> poslen ) ? -1 : \
+ ( ( ( const IdPosLen* ) ( a ) ) -> poslen > ( ( const IdPosLen* ) ( b ) ) -> poslen ) )
+
+ KSORT ( pbase, total_elems, sizeof * pbase, 0, sizeof * pbase );
+
+#undef SWAP
+#undef CMP
+
+}
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * AlignIdColReader
+ */
+typedef struct AlignIdColReader AlignIdColReader;
+struct AlignIdColReader
+{
+ ColumnReader dad;
+
+ /* state for id range:
+ first = slot [ 0 ] of map
+ row_id = needs to match request - we only accept serial scans
+ next_id = next id to fetch from "ids"
+ last_excl = end of "ids" */
+ int64_t first, row_id, next_id, last_excl;
+
+ /* sequence for handing out new ids */
+ int64_t new_id;
+
+ /* reader onto our join index column */
+ ColumnReader *ids;
+
+ /* reader onto alignment table
+ to retrieve GLOBAL_REF_START + REF_LEN */
+ ColumnReader *poslen;
+
+ /* bi-directional index for writing
+ new=>old and old=>new mappings */
+ MapFile *idx;
+
+ /* buffer for sorted data */
+ union
+ {
+ int64_t *ids;
+ IdPosLen *id_poslen;
+ IdxMapping *id_map;
+ } u;
+ size_t max_elems;
+ size_t num_elems;
+ size_t cur_elem;
+
+ /* buffer for id row */
+ int64_t *row;
+ size_t max_row_len;
+
+ /* chunk-size */
+ size_t chunk_size;
+
+ /* whether we have all ids or not */
+ bool entire_table;
+};
+
+static
+void AlignIdColReaderDestroy ( AlignIdColReader *self, const ctx_t *ctx )
+{
+ if ( self -> ids != NULL )
+ {
+ FUNC_ENTRY ( ctx );
+
+ STATUS ( 4, "destroying align-column reader '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+
+ /* tear everything down */
+ MapFileRelease ( self -> idx, ctx );
+ self -> idx = NULL;
+
+ ColumnReaderRelease ( self -> poslen, ctx );
+ self -> poslen = NULL;
+
+ ColumnReaderRelease ( self -> ids, ctx );
+ self -> ids = NULL;
+
+ if ( self -> u . id_poslen != NULL )
+ {
+ MemFree ( ctx, self -> u . id_poslen, sizeof * self -> u . id_poslen * self -> max_elems );
+ self -> u . id_poslen = NULL;
+ }
+ if ( self -> row != NULL )
+ {
+ MemFree ( ctx, self -> row, sizeof self -> row [ 0 ] * self -> max_row_len );
+ self -> row = NULL;
+ }
+ }
+}
+
+static
+void AlignIdColReaderWhack ( AlignIdColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* tear down self */
+ AlignIdColReaderDestroy ( self, ctx );
+
+ /* tear down super-class */
+ ColumnReaderDestroy ( & self -> dad, ctx );
+
+ /* gone */
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+const char *AlignIdColReaderFullSpec ( const AlignIdColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ return ColumnReaderFullSpec ( self -> ids, ctx );
+}
+
+static
+uint64_t AlignIdColReaderIdRange ( const AlignIdColReader *self, const ctx_t *ctx, int64_t *opt_first )
+{
+ FUNC_ENTRY ( ctx );
+ return ColumnReaderIdRange ( self -> ids, ctx, opt_first );
+}
+
+static
+void AlignIdColReaderFlushToIdx ( AlignIdColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> idx != NULL )
+ {
+ const Tool *tp = ctx -> caps -> tool;
+
+ /* write new=>old ids */
+ STATUS ( 3, "%s new=>old id map", tp -> write_new_to_old ? "writing" : "setting" );
+ ON_FAIL ( MapFileSetNewToOld ( self -> idx, ctx, self -> u . id_map, self -> num_elems ) )
+ {
+ ANNOTATE ( "failed to record new to old id mappings for '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+ return;
+ }
+ if ( tp -> sort_before_old2new )
+ {
+ /* sort by old ids */
+ STATUS ( 3, "sorting id-map by old-id" );
+#if USE_OLD_KSORT
+ ksort ( self -> u . id_map, self -> num_elems, sizeof self -> u . id_map [ 0 ], IdxMappingCmpOld, ( void* ) ctx );
+#else
+ IdxMappingSortOld ( self -> u . id_map, ctx, self -> num_elems );
+#endif
+ }
+
+ /* write old=>new ids */
+ STATUS ( 3, "writing old=>new id map" );
+ ON_FAIL ( MapFileSetOldToNew ( self -> idx, ctx, self -> u . id_map, self -> num_elems ) )
+ {
+ ANNOTATE ( "failed to record old to new id mappings for '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+ return;
+ }
+
+ STATUS ( 3, "done writing id maps" );
+ }
+
+ /* empty buffer */
+ self -> first = self -> next_id;
+}
+
+static
+void AlignIdColReaderPreCopy ( AlignIdColReader *self, const ctx_t *ctx )
+{
+ /* TBD - a good place to allocate memory */
+}
+
+static
+void AlignIdColReaderPostCopy ( AlignIdColReader *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* called after a single copy
+ assumes that entire row-range of table has been copied */
+
+ /* tear down self */
+ AlignIdColReaderDestroy ( self, ctx );
+}
+
+static
+const void *AlignIdColReaderRead ( AlignIdColReader *self, const ctx_t *ctx,
+ int64_t row_id, uint32_t *elem_bits, uint32_t *boff, uint32_t *row_len )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const void *base;
+ uint32_t num_read32;
+ size_t i, num_read;
+
+ /* handle bad parameters */
+ uint32_t dummy [ 3 ];
+ if ( elem_bits == NULL )
+ elem_bits = & dummy [ 0 ];
+ if ( boff == NULL )
+ boff = & dummy [ 1 ];
+ if ( row_len == NULL )
+ row_len = & dummy [ 2 ];
+
+ /* THERE ARE three stages to this method:
+ 1a. detect need to allocate id map
+ 1b. detect need to flush to index
+ 2. detect need to refresh id map
+ 3. respond to read request
+ */
+
+ if ( row_id != self -> row_id )
+ {
+ /* error condition */
+ rc = RC ( rcExe, rcCursor, rcReading, rcParam, rcIncorrect );
+ INTERNAL_ERROR ( rc, "AlignIdColReader only supports serial access" );
+ return NULL;
+ }
+
+ /* stage 1 - allocate or flush */
+ if ( self -> u . ids == NULL && ! self -> entire_table )
+ {
+ /* limit ids to actual count */
+ uint64_t num_ids = MapFileCount ( self -> idx, ctx );
+ self -> max_elems = ctx -> caps -> tool -> max_ref_idx_ids;
+ if ( ( uint64_t ) self -> max_elems > num_ids )
+ self -> max_elems = ( size_t ) num_ids;
+
+ /* allocate the buffer */
+ do
+ {
+ CLEAR ();
+
+ TRY ( self -> u . id_poslen = MemAlloc ( ctx, sizeof self -> u . id_poslen [ 0 ] * self -> max_elems, false ) )
+ {
+ STATUS ( 4, "allocated map buffer with %,zu elements", self -> max_elems );
+ break;
+ }
+
+ self -> max_elems >>= 1;
+ }
+ while ( self -> max_elems >= 1024 * 1024 );
+
+ if ( FAILED () )
+ {
+ ANNOTATE ( "failed to allocate id buffer" );
+ return NULL;
+ }
+
+ /* notice if we have the entire table */
+ if ( ( uint64_t ) self -> max_elems == num_ids )
+ self -> entire_table = true;
+
+ /* allocate a row buffer */
+ self -> max_row_len = 8 * 1024;
+ ON_FAIL ( self -> row = MemAlloc ( ctx, sizeof self -> row [ 8 ] * self -> max_row_len, false ) )
+ {
+ ANNOTATE ( "failed to allocate row buffer" );
+ return NULL;
+ }
+
+ assert ( self -> first == self -> next_id );
+ assert ( self -> first == row_id );
+ }
+ else if ( row_id == self -> next_id && self -> first < row_id )
+ {
+ ON_FAIL ( AlignIdColReaderFlushToIdx ( self, ctx ) )
+ return NULL;
+ }
+
+ /* stage 2 - refresh */
+ if ( self -> first == self -> next_id )
+ {
+ /* if there are no more rows, return NULL */
+ if ( self -> next_id == self -> last_excl )
+ {
+ STATUS ( 3, "done reading '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+ return NULL;
+ }
+
+ self -> cur_elem = 0;
+
+ /* if the entire table will be read into memory,
+ there is no point in reading/sorting the ids */
+ if ( self -> entire_table )
+ {
+ STATUS ( 3, "auto-generating %,zu ids for '%s'", self -> max_elems, ColumnReaderFullSpec ( self -> ids, ctx ) );
+ for ( i = 0; i < self -> max_elems; ++ i )
+ {
+ self -> u . id_poslen [ i ] . id = self -> first + i;
+#if _DEBUGGING
+ self -> u . id_poslen [ i ] . poslen = 0;
+#endif
+ }
+
+ self -> num_elems = self -> max_elems;
+ self -> next_id = self -> last_excl;
+ }
+ else
+ {
+ /* read up to max_elems into id array */
+ STATUS ( 3, "reading ids from '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+ for ( self -> num_elems = 0; self -> next_id < self -> last_excl; self -> num_elems += num_read, ++ self -> next_id )
+ {
+ /* read a row of ids */
+ ON_FAIL ( base = ColumnReaderRead ( self -> ids, ctx, self -> next_id, elem_bits, boff, & num_read32 ) )
+ {
+ ANNOTATE ( "failed to read id column" );
+ return NULL;
+ }
+
+ /* we expect empty rows */
+ num_read = num_read32;
+ if ( num_read == 0 )
+ continue;
+
+ assert ( * elem_bits == sizeof self -> u . ids [ 0 ] * 8 );
+ assert ( * boff == 0 );
+
+ /* detect when buffer is full */
+ if ( self -> num_elems + num_read > self -> max_elems )
+ {
+ /* if we've read at least one row, then we're okay */
+ if ( self -> first < self -> next_id )
+ break;
+
+ /* error condition - buffer was too small to read a single row */
+ rc = RC ( rcExe, rcCursor, rcReading, rcBuffer, rcInsufficient );
+ ERROR ( rc, "allocated buffer was too small ( %zu elems ) to read a single row ( id %ld, row-len %zu )",
+ self -> max_elems, self -> next_id, num_read );
+ return NULL;
+ }
+
+ /* bring them in */
+ memmove ( & self -> u . ids [ self -> num_elems ], base, num_read * sizeof self -> u . ids [ 0 ] );
+ }
+
+ /* sort to produce sparse but ordered list */
+ STATUS ( 3, "sorting %,zu 64-bit ids", self -> num_elems );
+#if USE_OLD_KSORT
+ ksort ( self -> u . ids, self -> num_elems, sizeof self -> u . ids [ 0 ], cmp_int64_t, ( void* ) ctx );
+#else
+ ksort_int64_t ( self -> u . ids, self -> num_elems );
+#endif
+
+ /* transform from ids to id_poslen */
+ STATUS ( 3, "expanding ids to ( id, position, len ) tuples" );
+ for ( i = self -> num_elems; i > 1 ; )
+ {
+ -- i;
+ self -> u . id_poslen [ i ] . id = self -> u . ids [ i ];
+ }
+ }
+
+ /* read num_elems from poslen */
+ STATUS ( 3, "reading ( position, len ) pairs from '%s'", ColumnReaderFullSpec ( self -> poslen, ctx ) );
+ for ( i = 0; i < self -> num_elems; ++ i )
+ {
+ ON_FAIL ( base = ColumnReaderRead ( self -> poslen, ctx, self -> u . id_poslen [ i ] . id, elem_bits, boff, & num_read32 ) )
+ {
+ ANNOTATE ( "failed to read global ref-start from alignment table" );
+ return NULL;
+ }
+
+ num_read = num_read32;
+ assert ( * elem_bits == sizeof self -> u . id_poslen [ 0 ] . poslen * 8 );
+ assert ( * boff == 0 );
+ assert ( num_read == 1 );
+
+ self -> u . id_poslen [ i ] . poslen = * ( uint64_t* ) base;
+ }
+
+ /* sort by poslen */
+ STATUS ( 3, "sorting ( id, position, len ) tuples on position, len DESC" );
+#if USE_OLD_KSORT
+ ksort ( self -> u . id_poslen, self -> num_elems, sizeof self -> u . id_poslen [ 0 ], IdPosLenCmpPos, ( void* ) ctx );
+#else
+ ksort_IdPosLen_pos ( self -> u . id_poslen, self -> num_elems );
+#endif
+
+ /* write poslen to temp column */
+ STATUS ( 3, "writing ( position, len ) to temp column" );
+ ON_FAIL ( MapFileSetPoslen ( self -> idx, ctx, self -> u . id_map, self -> num_elems ) )
+ {
+ ANNOTATE ( "failed to write temporary poslen column for '%s'", ColumnReaderFullSpec ( self -> ids, ctx ) );
+ return NULL;
+ }
+
+ STATUS ( 3, "done writing ( position, len )" );
+ }
+
+ /* stage 3 - build a row */
+ for ( num_read = ( size_t ) ( self -> num_elems - self -> cur_elem ), i = 0; i < num_read; ++ i )
+ {
+ /* whatever the current element is, it must belong to this row */
+ uint64_t pos = decode_pos_len ( self -> u . id_poslen [ self -> cur_elem + i ] . poslen );
+ int64_t cur_row_id = global_to_row_id ( pos, self -> chunk_size );
+ if ( cur_row_id != row_id )
+ {
+ num_read = i;
+ break;
+ }
+ }
+
+ /* "num_read" now has the number of elements in this row */
+ if ( num_read > self -> max_row_len )
+ {
+ STATUS ( 4, "reallocating row buffer for row-length %,zu", num_read );
+
+ /* realloc the row buffer */
+ MemFree ( ctx, self -> row, self -> max_row_len * sizeof self -> row [ 0 ] );
+
+ self -> max_row_len = ( num_read + 4095 ) & ~ ( size_t ) 4095;
+ ON_FAIL ( self -> row = MemAlloc ( ctx, sizeof self -> row [ 0 ] * self -> max_row_len, false ) )
+ {
+ ANNOTATE ( "failed to reallocate row buffer" );
+ return NULL;
+ }
+ }
+
+ /* build the row, assigning new ids */
+ for ( i = 0; i < num_read; ++ i )
+ {
+ self -> row [ i ] = ++ self -> new_id;
+ self -> u . id_map [ self -> cur_elem + i ] . new_id = self -> new_id;
+ }
+
+ /* advance row_id */
+ self -> cur_elem += num_read;
+ if ( ++ self -> row_id == self -> last_excl )
+ {
+ /* if this was the last row, flush index */
+ ON_FAIL ( AlignIdColReaderFlushToIdx ( self, ctx ) )
+ return NULL;
+
+ if ( ctx -> caps -> tool -> idx_consistency_check && self -> idx != NULL )
+ {
+ ON_FAIL ( MapFileConsistencyCheck ( self -> idx, ctx ) )
+ return NULL;
+ }
+ }
+
+ /* return row */
+ * elem_bits = sizeof self -> row [ 0 ] * 8;
+ * boff = 0;
+ * row_len = num_read;
+ return self -> row;
+}
+
+static ColumnReader_vt AlignIdColReader_vt =
+{
+ AlignIdColReaderWhack,
+ AlignIdColReaderFullSpec,
+ AlignIdColReaderIdRange,
+ AlignIdColReaderPreCopy,
+ AlignIdColReaderPostCopy,
+ AlignIdColReaderRead
+};
+
+
+/*--------------------------------------------------------------------------
+ * RefTblPair
+ */
+static
+size_t RefTblPairGetChunkSize ( TablePair *self, const ctx_t *ctx, const VCursor **cursp )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ rc = VTableCreateCursorRead ( self -> stbl, cursp );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create cursor on '%s'", self -> full_spec );
+ else
+ {
+ uint32_t idx;
+ const VCursor *curs = * cursp;
+ rc = VCursorAddColumn ( curs, & idx, "MAX_SEQ_LEN" );
+ if ( rc != 0 )
+ rc = VCursorAddColumn ( curs, & idx, "CHUNK_SIZE" );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorAddColumn - failed to determine chunk size of '%s'", self -> full_spec );
+ else
+ {
+ rc = VCursorOpen ( curs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorOpen - failed to determine chunk size of '%s'", self -> full_spec );
+ else
+ {
+ uint32_t row_len, chunk_size;
+ rc = VCursorReadDirect ( curs, 1, idx,
+ sizeof chunk_size * 8, & chunk_size, 1, & row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorReadDirect - failed to determine chunk size of '%s'", self -> full_spec );
+ else if ( row_len != 1 )
+ {
+ rc = RC ( rcExe, rcCursor, rcReading, rcData, rcInsufficient );
+ ERROR ( rc, "VCursorReadDirect - failed to determine chunk size of '%s'", self -> full_spec );
+ }
+ else
+ {
+ STATUS ( 3, "'%s' chunk size determined to be %u", self -> full_spec, chunk_size );
+ return chunk_size;
+ }
+ }
+ }
+
+ VCursorRelease ( curs );
+ * cursp = NULL;
+ }
+
+ return 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * ColumnReader
+ * interface to read column in random order
+ */
+
+
+/* MakeAlignIdReader
+ */
+ColumnReader *TablePairMakeAlignIdReader ( TablePair *self,
+ const ctx_t *ctx, TablePair *align_tbl, MapFile *idx, const char *colspec )
+{
+ FUNC_ENTRY ( ctx );
+
+ size_t chunk_size;
+ const VCursor *curs;
+
+ /* determine chunk size and keep cursor for id reader */
+ TRY ( chunk_size = RefTblPairGetChunkSize ( self, ctx, & curs ) )
+ {
+ ColumnReader *ids;
+
+ /* need to create a traditional reader on self */
+ TRY ( ids = TablePairMakeColumnReader ( self, ctx, curs, colspec, true ) )
+ {
+ ColumnReader *poslen;
+
+ /* need to create a poslen reader on align_tbl */
+ TRY ( poslen = TablePairMakeGlobalPosLenReader ( align_tbl, ctx, ( uint32_t ) chunk_size ) )
+ {
+ int64_t first;
+ uint64_t count;
+
+ /* need to create a mapfile based on range of poslen */
+ TRY ( count = ColumnReaderIdRange ( poslen, ctx, & first ) )
+ {
+ TRY ( MapFileSetIdRange ( idx, ctx, first, count ) )
+ {
+ AlignIdColReader *col;
+ TRY ( col = MemAlloc ( ctx, sizeof * col, true ) )
+ {
+ TRY ( ColumnReaderInit ( & col -> dad, ctx, & AlignIdColReader_vt ) )
+ {
+ /* one more point of failure when obtaining the id range */
+ TRY ( count = ColumnReaderIdRange ( ids, ctx, & first ) )
+ {
+ TRY ( col -> idx = MapFileDuplicate ( idx, ctx ) )
+ {
+ col -> first = col -> row_id = col -> next_id = first;
+ col -> last_excl = first + count;
+ col -> ids = ids;
+ col -> poslen = poslen;
+ col -> chunk_size = chunk_size;
+ col -> entire_table = false;
+
+ /* the actual working buffer is allocated upon demand
+ to avoid occupying space while waiting to execute */
+
+ /* douse the cursor here */
+ VCursorRelease ( curs );
+
+ return & col -> dad;
+ }
+ }
+ }
+
+ MemFree ( ctx, col, sizeof * col );
+ }
+
+ MapFileRelease ( idx, ctx );
+ }
+ }
+
+ ColumnReaderRelease ( poslen, ctx );
+ }
+
+ ColumnReaderRelease ( ids, ctx );
+ }
+
+ VCursorRelease ( curs );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/ref-alignid-col.h b/tools/sra-sort/ref-alignid-col.h
new file mode 100644
index 0000000..9b5ee84
--- /dev/null
+++ b/tools/sra-sort/ref-alignid-col.h
@@ -0,0 +1,53 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_ref_alignid_col_
+#define _h_sra_sort_ref_alignid_col_
+
+#ifndef _h_sra_sort_col_pair_
+#include "col-pair.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct MapFile;
+struct TablePair;
+
+
+/*--------------------------------------------------------------------------
+ * AlignIdColReader
+ */
+
+
+/* MakeAlignIdReader
+ */
+ColumnReader *TablePairMakeAlignIdReader ( struct TablePair *self,
+ const ctx_t *ctx, struct TablePair *align_tbl, struct MapFile *idx, const char *colspec );
+
+
+#endif /* _h_sra_sort_ref_alignid_col_ */
diff --git a/tools/sra-sort/row-set-priv.h b/tools/sra-sort/row-set-priv.h
new file mode 100644
index 0000000..62c50d6
--- /dev/null
+++ b/tools/sra-sort/row-set-priv.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_row_set_priv_
+#define _h_sra_sort_row_set_priv_
+
+#ifndef _h_sra_sort_row_set_
+#include "row-set.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * RowSetIterator
+ * the basic 4 types
+ */
+RowSetIterator * MapFileMakeMappingRowSetIterator ( struct MapFile const *self, const ctx_t *ctx, bool large );
+RowSetIterator * MapFileMakeSortingRowSetIterator ( struct MapFile const *self, const ctx_t *ctx, bool large );
+RowSetIterator * TablePairMakeMappingRowSetIterator ( struct TablePair *self, const ctx_t *ctx, bool large );
+RowSetIterator * TablePairMakeSimpleRowSetIterator ( struct TablePair *self, const ctx_t *ctx );
+
+#endif /* _h_sra_sort_row_set_priv_ */
diff --git a/tools/sra-sort/row-set.c b/tools/sra-sort/row-set.c
new file mode 100644
index 0000000..59f1851
--- /dev/null
+++ b/tools/sra-sort/row-set.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "row-set-priv.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <vdb/cursor.h>
+#include <klib/rc.h>
+
+FILE_ENTRY ( row-set );
+
+
+/*--------------------------------------------------------------------------
+ * RowSet
+ * interface to iterate row-ids
+ */
+
+
+/* Release
+ * releases reference
+ */
+void RowSetRelease ( const RowSet *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "RowSet" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release RowSet" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+RowSet *RowSetDuplicate ( const RowSet *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "RowSet" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate RowSet" );
+ return NULL;
+ }
+ }
+
+ return ( RowSet* ) self;
+}
+
+
+/* Init
+ */
+void RowSetInit ( RowSet *self, const ctx_t *ctx, const RowSet_vt *vt )
+{
+ self -> vt = vt;
+ KRefcountInit ( & self -> refcount, 1, "RowSet", "init", "" );
+ self -> align = 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * RowSetIterator
+ * interface to iterate RowSets
+ */
+
+/* MakeRowSetIterator
+ * make RowSet iterator based upon parameters
+ * each RowSet will generate row-ids in src order
+ *
+ * "sort_idx" [ IN ]
+ * if NULL, the RowSet objects will auto-generate row-ids
+ * otherwise, src row-ids will be selected from MapFile
+ *
+ * "pairs" [ IN ]
+ * if true, the row-ids will be generated into an IdxMapping pair
+ * if false but "idx" is not NULL, the src row-ids will be generated
+ * into a single-id map, and new ordering preserved in parallel
+ * if false and "idx" is NULL, no additional structure will be generated
+ */
+RowSetIterator *TablePairMakeRowSetIterator ( struct TablePair *self, const ctx_t *ctx,
+ struct MapFile const *sort_idx, bool pairs, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( sort_idx != NULL )
+ {
+ if ( pairs )
+ return MapFileMakeMappingRowSetIterator ( sort_idx, ctx, large );
+
+ return MapFileMakeSortingRowSetIterator ( sort_idx, ctx, large );
+ }
+
+ if ( pairs )
+ return TablePairMakeMappingRowSetIterator ( self, ctx, large );
+
+ return TablePairMakeSimpleRowSetIterator ( self, ctx );
+}
+
+
+/* Release
+ * releases reference
+ */
+void RowSetIteratorRelease ( const RowSetIterator *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "RowSetIterator" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release RowSetIterator" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+RowSetIterator *RowSetIteratorDuplicate ( const RowSetIterator *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "RowSetIterator" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcCursor, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate RowSetIterator" );
+ return NULL;
+ }
+ }
+
+ return ( RowSetIterator* ) self;
+}
+
+
+/* Init
+ */
+void RowSetIteratorInit ( RowSetIterator *self, const ctx_t *ctx, const RowSetIterator_vt *vt )
+{
+ self -> vt = vt;
+ KRefcountInit ( & self -> refcount, 1, "RowSetIterator", "init", "" );
+ self -> align = 0;
+}
diff --git a/tools/sra-sort/row-set.h b/tools/sra-sort/row-set.h
new file mode 100644
index 0000000..8ffa38a
--- /dev/null
+++ b/tools/sra-sort/row-set.h
@@ -0,0 +1,215 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_row_set_
+#define _h_sra_sort_row_set_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct MapFile;
+struct TablePair;
+struct IdxMapping;
+
+
+/*--------------------------------------------------------------------------
+ * RowSet
+ * interface to iterate row-ids
+ */
+typedef struct RowSet_vt RowSet_vt;
+
+typedef struct RowSet RowSet;
+struct RowSet
+{
+ const RowSet_vt *vt;
+ KRefcount refcount;
+ uint32_t align;
+};
+
+#ifndef ROWSET_IMPL
+#define ROWSET_IMPL RowSet
+#endif
+
+struct RowSet_vt
+{
+ /* called by Release */
+ void ( * whack ) ( ROWSET_IMPL *self, const ctx_t *ctx );
+
+ /* retrieve next set of row-ids */
+ size_t ( * next ) ( ROWSET_IMPL *self, const ctx_t *ctx,
+ int64_t *ids, size_t max_ids );
+
+ /* reset iterator to initial state */
+ void ( * reset ) ( ROWSET_IMPL *self, const ctx_t *ctx,
+ bool for_static );
+};
+
+
+/* Release
+ * releases reference
+ */
+void RowSetRelease ( const RowSet *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+RowSet *RowSetDuplicate ( const RowSet *self, const ctx_t *ctx );
+
+
+/* Next
+ * return next set of row-ids
+ * returns 0 if no rows are available
+ */
+#define RowSetNext( self, ctx, ids, max_ids ) \
+ POLY_DISPATCH_INT ( next, self, ROWSET_IMPL, ctx, ids, max_ids )
+
+
+/* Reset
+ * reset iterator to beginning
+ */
+#define RowSetReset( self, ctx, for_static ) \
+ POLY_DISPATCH_VOID ( reset, self, ROWSET_IMPL, ctx, for_static )
+
+
+/* Init
+ */
+void RowSetInit ( RowSet *self, const ctx_t *ctx, const RowSet_vt *vt );
+
+/* Destroy
+ */
+#define RowSetDestroy( self, ctx ) \
+ ( ( void ) 0 )
+
+
+/*--------------------------------------------------------------------------
+ * RowSetIterator
+ * interface to iterate RowSets
+ */
+typedef struct RowSetIterator_vt RowSetIterator_vt;
+
+typedef struct RowSetIterator RowSetIterator;
+struct RowSetIterator
+{
+ const RowSetIterator_vt *vt;
+ KRefcount refcount;
+ uint32_t align;
+};
+
+#ifndef ROWSET_ITER_IMPL
+#define ROWSET_ITER_IMPL RowSetIterator
+#endif
+
+struct RowSetIterator_vt
+{
+ /* called by Release */
+ void ( * whack ) ( ROWSET_ITER_IMPL *self, const ctx_t *ctx );
+
+ /* retrieve row-id mapping pair */
+ struct IdxMapping* ( * get_idx_mapping ) ( ROWSET_ITER_IMPL *self, const ctx_t *ctx,
+ size_t *num_items );
+
+ /* retrieve src row-id array */
+ int64_t* ( * get_src_ids ) ( ROWSET_ITER_IMPL *self, const ctx_t *ctx,
+ uint32_t **opt_ord, size_t *num_items );
+
+ /* retrieve next row-set */
+ RowSet* ( * next ) ( ROWSET_ITER_IMPL *self, const ctx_t *ctx );
+};
+
+
+/* MakeRowSetIterator
+ * make RowSet iterator based upon parameters
+ * each RowSet will generate row-ids in src order
+ *
+ * "sort_idx" [ IN ]
+ * if NULL, the RowSet objects will auto-generate row-ids
+ * otherwise, src row-ids will be selected from MapFile
+ *
+ * "pairs" [ IN ]
+ * if true, the row-ids will be generated into an IdxMapping pair
+ * if false but "idx" is not NULL, the src row-ids will be generated
+ * into a single-id map, and new ordering preserved in parallel
+ * if false and "idx" is NULL, no additional structure will be generated
+ *
+ * "large" [ IN ]
+ * if true, use a reduced id-range for the row-set
+ */
+RowSetIterator *TablePairMakeRowSetIterator ( struct TablePair *self, const ctx_t *ctx,
+ struct MapFile const *sort_idx, bool pairs, bool large );
+
+
+/* Release
+ * releases reference
+ */
+void RowSetIteratorRelease ( const RowSetIterator *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+RowSetIterator *RowSetIteratorDuplicate ( const RowSetIterator *self, const ctx_t *ctx );
+
+
+/* GetIdxMapping
+ * a little bit of plumbing to get the IdxMapping map
+ */
+#define RowSetIteratorGetIdxMapping( self, ctx, num_items ) \
+ POLY_DISPATCH_PTR ( get_idx_mapping, self, ROWSET_ITER_IMPL, ctx, num_items )
+
+
+/* GetSourceIds
+ * a little bit of plumbing to get the individual source ids
+ * and optional new id ordering
+ */
+#define RowSetIteratorGetSourceIds( self, ctx, opt_ord, num_items ) \
+ POLY_DISPATCH_PTR ( get_src_ids, self, ROWSET_ITER_IMPL, ctx, opt_ord, num_items )
+
+
+/* Next
+ * return next RowSet
+ * returns NULL if no rows are available
+ */
+#define RowSetIteratorNext( self, ctx ) \
+ POLY_DISPATCH_PTR ( next, self, ROWSET_ITER_IMPL, ctx )
+
+
+/* Init
+ */
+void RowSetIteratorInit ( RowSetIterator *self, const ctx_t *ctx, const RowSetIterator_vt *vt );
+
+/* Destroy
+ */
+#define RowSetIteratorDestroy( self, ctx ) \
+ ( ( void ) 0 )
+
+
+#endif /* _h_sra_sort_row_set_ */
diff --git a/tools/sra-sort/run.c b/tools/sra-sort/run.c
new file mode 100644
index 0000000..e64d31d
--- /dev/null
+++ b/tools/sra-sort/run.c
@@ -0,0 +1,388 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "sra-sort.h"
+#include "db-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+
+#include <sra/sraschema.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <kfg/config.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( run );
+
+static
+void typename_to_config_path ( const char *in, char *out )
+{
+ bool end;
+ uint32_t i;
+
+ for ( end = false, i = 0; ! end; ++ i )
+ {
+ switch ( out [ i ] = in [ i ] )
+ {
+ case ':':
+ out [ i ] = '/';
+ break;
+ case ' ':
+ case '#':
+ out [ i ] = 0;
+ case 0:
+ end = true;
+ return;
+ }
+ }
+}
+
+static
+bool map_typename_builtin ( const ctx_t *ctx, const char *sub_node, const char *in, char *out, char *schema_src, size_t size )
+{
+ FUNC_ENTRY ( ctx );
+
+ size_t copied;
+
+#define ALIGN_EVIDENCE_MAP "NCBI:align:db:alignment_evidence_sorted"
+#define ALIGN_UNSORTED_MAP "NCBI:align:db:alignment_sorted"
+#define ALIGN_SRC "align/align.vschema"
+
+ if ( strcmp ( out, "NCBI/align/db/alignment_evidence" ) == 0 )
+ copied = string_copy ( out, size, ALIGN_EVIDENCE_MAP, sizeof ALIGN_EVIDENCE_MAP - 1 );
+ else if ( strcmp ( out, "NCBI/align/db/alignment_unsorted" ) == 0 )
+ copied = string_copy ( out, size, ALIGN_UNSORTED_MAP, sizeof ALIGN_UNSORTED_MAP - 1 );
+ else
+ {
+ strcpy ( out, in );
+ schema_src [ 0 ] = 0;
+ return false;
+ }
+
+ if ( copied != size )
+ {
+ out [ copied ] = 0;
+ copied = string_copy ( schema_src, size, ALIGN_SRC, sizeof ALIGN_SRC - 1 );
+ }
+
+ if ( copied == size )
+ {
+ rc_t rc = RC ( rcExe, rcType, rcCopying, rcBuffer, rcInsufficient );
+ INTERNAL_ERROR ( rc, "failed to copy a built-in constant" );
+ strcpy ( out, in );
+ schema_src [ 0 ] = 0;
+ return false;
+ }
+
+#undef ALIGN_EVIDENCE_MAP
+#undef ALIGN_UNSORTED_MAP
+#undef ALIGN_SRC
+
+ schema_src [ copied ] = 0;
+ return true;
+}
+
+static
+bool map_typename ( const ctx_t *ctx, const char *sub_node, const char *in, char *out, char *schema_src, size_t size )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const KConfigNode *n;
+ size_t num_read, remaining;
+
+ typename_to_config_path ( in, out );
+
+ rc = KConfigOpenNodeRead ( ctx -> caps -> cfg, & n, "sra-sort/%s/%s", sub_node, out );
+ if ( rc != 0 )
+ return map_typename_builtin ( ctx, sub_node, in, out, schema_src, size );
+
+ rc = KConfigNodeRead ( n, 0, out, size - 1, & num_read, & remaining );
+ if ( rc != 0 )
+ ERROR ( rc, "KConfigNodeRead failed" );
+ else if ( remaining != 0 )
+ {
+ rc = RC ( rcExe, rcNode, rcReading, rcBuffer, rcInsufficient );
+ ERROR ( rc, "type map of '%s' is too long", in );
+ }
+ else
+ {
+ out [ num_read ] = 0;
+ typename_to_config_path ( out, schema_src );
+
+ KConfigNodeRelease ( n );
+ rc = KConfigOpenNodeRead ( ctx -> caps -> cfg, & n, "sra-sort/schema-src/%s", schema_src );
+ if ( rc != 0 )
+ ERROR ( rc, "KConfigOpenNodeRead - failed to find entry 'sra-sort/schema-src/%s'", schema_src );
+ else
+ {
+ rc = KConfigNodeRead ( n, 0, schema_src, size - 1, & num_read, & remaining );
+ if ( rc != 0 )
+ ERROR ( rc, "KConfigNodeRead failed" );
+ else if ( remaining != 0 )
+ {
+ rc = RC ( rcExe, rcNode, rcReading, rcBuffer, rcInsufficient );
+ ERROR ( rc, "type map of '%s' is too long", in );
+ }
+ else
+ {
+ schema_src [ num_read ] = 0;
+ }
+ }
+ }
+
+ KConfigNodeRelease ( n );
+ return true;
+}
+
+static
+VSchema *map_schema_types ( TypeParams *type, const ctx_t *ctx, const VSchema *src_schema )
+{
+ FUNC_ENTRY ( ctx );
+
+ bool mapped;
+ char schema_src [ 256 ];
+ assert ( sizeof schema_src == sizeof type -> dst_type );
+
+ TRY ( mapped = map_typename ( ctx, "out-map", type -> src_type, type -> dst_type, schema_src, sizeof schema_src ) )
+ {
+ rc_t rc;
+ VSchema *dst_schema;
+
+ if ( ! mapped )
+ {
+ type -> view_type [ 0 ] = 0;
+ rc = VSchemaAddRef ( src_schema );
+ if ( rc != 0 )
+ ERROR ( rc, "VSchemaAddRef failed" );
+ return ( VSchema* ) src_schema;
+ }
+
+ rc = VDBManagerMakeSchema ( ctx -> caps -> vdb, & dst_schema );
+ if ( rc != 0 )
+ ERROR ( rc, "VDBManagerMakeSchema failed" );
+ else
+ {
+ rc = VSchemaParseFile ( dst_schema, "%s", schema_src );
+ if ( rc != 0 )
+ ERROR ( rc, "VSchemaParseFile failed adding file '%s' for destination", src_schema );
+ else
+ {
+ TRY ( mapped = map_typename ( ctx, "view-map", type -> src_type, type -> view_type, schema_src, sizeof schema_src ) )
+ {
+ if ( ! mapped )
+ {
+ type -> view_type [ 0 ] = 0;
+ return dst_schema;
+ }
+
+ rc = VSchemaParseFile ( dst_schema, "%s", schema_src );
+ if ( rc == 0 )
+ return dst_schema;
+
+ ERROR ( rc, "VSchemaParseFile failed adding file '%s' for view", src_schema );
+ }
+ }
+
+ VSchemaRelease ( dst_schema );
+ }
+ }
+
+ return NULL;
+}
+
+/* open_db
+ * called from run
+ * determines the type of schema
+ * opens output object
+ * dispatches to the appropriate handler
+ */
+static
+void open_db ( const ctx_t *ctx, const VDatabase **srcp )
+{
+ FUNC_ENTRY ( ctx );
+
+ const VDatabase *src = *srcp;
+
+ const VSchema *src_schema;
+ rc_t rc = VDatabaseOpenSchema ( src, & src_schema );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseOpenSchema failed" );
+ else
+ {
+ TypeParams type;
+ rc = VDatabaseTypespec ( src, type . src_type, sizeof type . src_type );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to obtain database typespec" );
+ else
+ {
+ VSchema *dst_schema;
+
+ /* map input type to output type */
+ TRY ( dst_schema = map_schema_types ( & type, ctx, src_schema ) )
+ {
+ const Tool *tp = ctx -> caps -> tool;
+
+ /* if view was remapped, reopen the database */
+ if ( type . view_type [ 0 ] != 0 )
+ {
+ VSchemaRelease ( src_schema );
+ rc = VSchemaAddRef ( dst_schema );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "VSchemaAddRef failed" );
+ src_schema = NULL;
+ }
+ else
+ {
+ src_schema = dst_schema;
+ VDatabaseRelease ( src );
+ rc = VDBManagerOpenDBRead ( ctx -> caps -> vdb, srcp, src_schema, "%s", tp -> src_path );
+ if ( rc != 0 )
+ ERROR ( rc, "VDBManagerOpenDBRead failed reopening db '%s'", tp -> src_path );
+ src = *srcp;
+ }
+ }
+
+ if ( ! FAILED () )
+ {
+ VDatabase *dst;
+ rc = VDBManagerCreateDB ( ctx -> caps -> vdb, & dst, dst_schema,
+ type . dst_type, tp -> db . cmode, "%s", tp -> dst_path );
+ if ( rc != 0 )
+ ERROR ( rc, "VDBManagerCreateDB failed to create '%s' with type '%s'", tp -> dst_path, type . dst_type );
+ else
+ {
+ rc = VDatabaseColumnCreateParams ( dst, tp -> col . cmode, tp -> col . checksum, tp -> col . pgsize );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseColumnCreateParams: failed to set column create params on db '%s'", tp -> dst_path );
+ else
+ {
+ DbPair *pb;
+
+ /* TBD - this has to be fixed to use proper stuff */
+ const char *name = strrchr ( tp -> src_path, '/' );
+ if ( name ++ == NULL )
+ name = tp -> src_path;
+
+ TRY ( pb = DbPairMake ( ctx, src, dst, name ) )
+ {
+ DbPairRun ( pb, ctx );
+ DbPairRelease ( pb, ctx );
+ }
+ }
+
+ rc = VDatabaseRelease ( dst );
+ if ( rc != 0 )
+ ERROR ( rc, "VDatabaseRelease failed on '%s'", tp -> dst_path );
+ }
+ }
+
+ VSchemaRelease ( dst_schema );
+ }
+ }
+
+ VSchemaRelease ( src_schema );
+ }
+}
+
+
+/* open_tbl
+ * called from run
+ * determines the type of schema
+ * opens output object
+ * dispatches to the appropriate handler
+ */
+static
+void open_tbl ( const ctx_t *ctx, const VTable **tblp )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc = RC ( rcExe, rcFunction, rcExecuting, rcFunction, rcUnsupported );
+ ERROR ( rc, "unimplemented function" );
+}
+
+/* run
+ * called from KMain
+ * determines the type of object being copied/sorted
+ * opens input object
+ * dispatches to the appropriate handler
+ */
+void run ( const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ VDBManager *mgr = ctx -> caps -> vdb;
+ const Tool *tp = ctx -> caps -> tool;
+
+ const VDatabase *db;
+ rc_t rc = VDBManagerOpenDBRead ( mgr, & db, NULL, "%s", tp -> src_path );
+ if ( rc == 0 )
+ {
+ open_db ( ctx, & db );
+ VDatabaseRelease ( db );
+ }
+ else
+ {
+ const VTable *tbl;
+ rc_t rc2 = VDBManagerOpenTableRead ( mgr, & tbl, NULL, "%s", tp -> src_path );
+ if ( rc2 == 0 )
+ {
+ rc = 0;
+ open_tbl ( ctx, & tbl );
+ VTableRelease ( tbl );
+ }
+ else
+ {
+ VSchema *sra_dflt;
+ rc2 = VDBManagerMakeSRASchema ( mgr, & sra_dflt );
+ if ( rc2 == 0 )
+ {
+ rc2 = VDBManagerOpenTableRead ( mgr, & tbl, sra_dflt, "%s", tp -> src_path );
+ if ( rc2 == 0 )
+ {
+ rc = 0;
+ open_tbl ( ctx, & tbl );
+ VTableRelease ( tbl );
+ }
+
+ VSchemaRelease ( sra_dflt );
+ }
+ }
+ }
+
+ if ( rc != 0 )
+ ERROR ( rc, "failed to open object '%s'", tp -> src_path );
+}
diff --git a/tools/sra-sort/simple-row-set.c b/tools/sra-sort/simple-row-set.c
new file mode 100644
index 0000000..e4e5833
--- /dev/null
+++ b/tools/sra-sort/simple-row-set.c
@@ -0,0 +1,212 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct SimpleRowSet SimpleRowSet;
+#define ROWSET_IMPL SimpleRowSet
+
+typedef struct SimpleRowSetIterator SimpleRowSetIterator;
+#define ROWSET_ITER_IMPL SimpleRowSetIterator
+
+#include "row-set-priv.h"
+#include "tbl-pair.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+
+#include <klib/rc.h>
+
+FILE_ENTRY ( simple-row-set );
+
+
+/*--------------------------------------------------------------------------
+ * SimpleRowSet
+ * implementation of RowSet based upon auto-generated serial ids
+ */
+struct SimpleRowSet
+{
+ RowSet dad;
+ int64_t first, row_id, last_excl;
+};
+
+static
+void SimpleRowSetWhack ( SimpleRowSet *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ MemFree ( ctx, self, sizeof *self );
+}
+
+static
+size_t SimpleRowSetNext ( SimpleRowSet *self, const ctx_t *ctx,
+ int64_t *row_ids, size_t max_ids )
+{
+ if ( row_ids != NULL )
+ {
+ size_t i;
+
+ uint64_t max_avail = self -> last_excl - self -> row_id;
+ if ( max_avail < ( uint64_t ) max_ids )
+ max_ids = ( size_t ) max_avail;
+
+ for ( i = 0; i < max_ids; ++ i )
+ row_ids [ i ] = self -> row_id + i;
+
+ self -> row_id += max_ids;
+ return max_ids;
+ }
+ return 0;
+}
+
+static
+void SimpleRowSetReset ( SimpleRowSet *self, const ctx_t *ctx, bool for_static )
+{
+ self -> row_id = self -> first;
+}
+
+static RowSet_vt SimpleRowSet_vt =
+{
+ SimpleRowSetWhack,
+ SimpleRowSetNext,
+ SimpleRowSetReset
+};
+
+
+/* Make
+ */
+static
+RowSet *SimpleRowSetMake ( const ctx_t *ctx, int64_t first, int64_t last_excl )
+{
+ FUNC_ENTRY ( ctx );
+
+ SimpleRowSet *rs;
+ TRY ( rs = MemAlloc ( ctx, sizeof * rs, false ) )
+ {
+ RowSetInit ( & rs -> dad, ctx, & SimpleRowSet_vt );
+ rs -> first = rs -> row_id = first;
+ rs -> last_excl = last_excl;
+ return & rs -> dad;
+ }
+
+ return NULL;
+}
+
+
+/*--------------------------------------------------------------------------
+ * SimpleRowSetIterator
+ * interface to iterate RowSets
+ */
+struct SimpleRowSetIterator
+{
+ RowSetIterator dad;
+ RowSet *rs;
+};
+
+static
+void SimpleRowSetIteratorWhack ( SimpleRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ RowSetRelease ( self -> rs, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+struct IdxMapping *SimpleRowSetIteratorGetIdxMapping ( SimpleRowSetIterator *self, const ctx_t *ctx, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ ANNOTATE ( "CALLING GetIdxMapping ON SIMPLE ROWSET ITERATOR" );
+
+ if ( num_items != NULL )
+ * num_items = 0;
+
+ return NULL;
+}
+
+static
+int64_t *SimpleRowSetIteratorGetSourceIds ( SimpleRowSetIterator *self, const ctx_t *ctx, uint32_t **opt_ord, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ ANNOTATE ( "CALLING GetSourceIds ON SIMPLE ROWSET ITERATOR" );
+
+ if ( opt_ord != NULL )
+ * opt_ord = NULL;
+
+ if ( num_items != NULL )
+ * num_items = 0;
+
+ return NULL;
+}
+
+static
+RowSet *SimpleRowSetIteratorNext ( SimpleRowSetIterator *self, const ctx_t *ctx )
+{
+ RowSet *rs = self -> rs;
+ self -> rs = NULL;
+ return rs;
+}
+
+static RowSetIterator_vt SimpleRowSetIterator_vt =
+{
+ SimpleRowSetIteratorWhack,
+ SimpleRowSetIteratorGetIdxMapping,
+ SimpleRowSetIteratorGetSourceIds,
+ SimpleRowSetIteratorNext
+};
+
+
+/* MakeSimpleRowSetIterator
+ * make simple row-id iterator
+ * runs from first to last id in cursor
+ */
+RowSetIterator *TablePairMakeSimpleRowSetIterator ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> first_id > self -> last_excl )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcConstructing, rcRange, rcInvalid );
+ INTERNAL_ERROR ( rc, "union of all column ranges improperly set" );
+ }
+ else
+ {
+ SimpleRowSetIterator *it;
+
+ TRY ( it = MemAlloc ( ctx, sizeof * it, false ) )
+ {
+ RowSetIteratorInit ( & it -> dad, ctx, & SimpleRowSetIterator_vt );
+ TRY ( it -> rs = SimpleRowSetMake ( ctx, self -> first_id, self -> last_excl ) )
+ {
+ return & it -> dad;
+ }
+
+ MemFree ( ctx, it, sizeof * it );
+ }
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/sort-defs.h b/tools/sra-sort/sort-defs.h
new file mode 100644
index 0000000..329143d
--- /dev/null
+++ b/tools/sra-sort/sort-defs.h
@@ -0,0 +1,109 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_defs_
+#define _h_sra_sort_defs_
+
+#ifndef _h_kfc_callconv_
+#include <kfc/callconv.h>
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+
+/* prevent inclusion of <kfc/defs.h> */
+#define _h_kfc_defs_ 1
+
+
+/*--------------------------------------------------------------------------
+ * NAME_VERS
+ * synthesize versioned type and message names
+ */
+#define NAME_VERS( name, maj_vers ) \
+ MAKE_NAME_VERS1 ( name, maj_vers )
+#define MAKE_NAME_VERS1( name, maj_vers ) \
+ MAKE_NAME_VERS2 ( name, maj_vers )
+#define MAKE_NAME_VERS2( name, maj_vers ) \
+ name ## _v ## maj_vers
+
+typedef uint32_t rc_t, ver_t;
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <assert.h>
+
+#if _DEBUGGING &&! defined SRA_SORT_CHECK_NULL_SELF
+#define SRA_SORT_CHECK_NULL_SELF 1
+#endif
+
+#define USE_OLD_KSORT 0
+
+
+/*--------------------------------------------------------------------------
+ * vdb-3 items missing from klib/defs.h
+ */
+typedef uint32_t caps_t;
+typedef struct ctx_t ctx_t;
+#define STRINGIZE( str ) # str
+#define STRINGIZE_DEFINE( def ) STRINGIZE ( def )
+
+
+/* POLY_DISPATCH
+ * dispatch a polymorphic message
+ */
+#if SRA_SORT_CHECK_NULL_SELF
+
+void null_self_error ( const ctx_t *ctx, uint32_t lineno, const char *msg );
+
+#define POLY_DISPATCH_VOID( msg, self, cast_expr, ctx, ... ) \
+ ( ( ( self ) == NULL ) ? null_self_error ( ctx, __LINE__, # msg ) : \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ ) )
+
+#define POLY_DISPATCH_INT( msg, self, cast_expr, ctx, ... ) \
+ ( ( ( self ) == NULL ) ? ( null_self_error ( ctx, __LINE__, # msg ), 0 ) : \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ ) )
+
+#define POLY_DISPATCH_PTR( msg, self, cast_expr, ctx, ... ) \
+ ( ( ( self ) == NULL ) ? ( null_self_error ( ctx, __LINE__, # msg ), NULL ) : \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ ) )
+
+#else
+
+#define POLY_DISPATCH_VOID( msg, self, cast_expr, ctx, ... ) \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ )
+#define POLY_DISPATCH_INT( msg, self, cast_expr, ctx, ... ) \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ )
+#define POLY_DISPATCH_PTR( msg, self, cast_expr, ctx, ... ) \
+ ( * ( self ) -> vt -> msg ) ( ( cast_expr* ) ( self ), ctx, ## __VA_ARGS__ )
+
+#endif
+
+#endif /* _h_sra_sort_defs_ */
diff --git a/tools/sra-sort/sorting-row-set.c b/tools/sra-sort/sorting-row-set.c
new file mode 100644
index 0000000..cb5493d
--- /dev/null
+++ b/tools/sra-sort/sorting-row-set.c
@@ -0,0 +1,405 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct SortingRowSet SortingRowSet;
+#define ROWSET_IMPL SortingRowSet
+
+typedef struct SortingRowSetIterator SortingRowSetIterator;
+#define ROWSET_ITER_IMPL SortingRowSetIterator
+
+#include "row-set-priv.h"
+#include "tbl-pair.h"
+#include "map-file.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <klib/rc.h>
+
+#include <string.h>
+
+FILE_ENTRY ( sorting-row-set );
+
+
+/*--------------------------------------------------------------------------
+ * SortingRowSetIterator
+ * interface to iterate RowSets
+ */
+struct SortingRowSetIterator
+{
+ RowSetIterator dad;
+
+ /* base row-id */
+ int64_t row_id;
+
+ /* last row-id + 1 */
+ int64_t last_excl;
+
+ /* takes its input from new=>old index */
+ const MapFile *idx;
+
+ /* working data within map */
+ int64_t *src_ids;
+ uint32_t *new_ord;
+ size_t max_elems;
+ size_t num_elems;
+
+ /* if true, use setting for large-columns */
+ bool large;
+
+ /* if true, no need to regenerate new_ord */
+ bool new_ord_valid;
+};
+
+/*--------------------------------------------------------------------------
+ * SortingRowSet
+ * implementation of RowSet based upon auto-generated id pairs
+ */
+struct SortingRowSet
+{
+ RowSet dad;
+
+ /* keep-alive reference */
+ SortingRowSetIterator *iter;
+
+ /* working data within map */
+ int64_t *src_ids;
+ size_t num_elems;
+ size_t cur_elem;
+};
+
+static
+void SortingRowSetWhack ( SortingRowSet *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ RowSetIteratorRelease ( & self -> iter -> dad, ctx );
+ MemFree ( ctx, self, sizeof *self );
+}
+
+static
+size_t SortingRowSetNextStat ( SortingRowSet *self, const ctx_t *ctx,
+ int64_t *ids, size_t max_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* the starting row-id is taken from row-set-iterator
+ and offset by our current element counter */
+ int64_t row_id = self -> iter -> row_id + self -> cur_elem;
+
+ /* limit id generation to request */
+ size_t i, to_set = self -> num_elems - self -> cur_elem;
+ if ( to_set > max_ids )
+ to_set = max_ids;
+
+ /* fill request with serial numbers
+ could just as easily be the same number
+ the important thing is to limit the count
+ and produce the correct range */
+ for ( i = 0; i < to_set; ++ i )
+ ids [ i ] = row_id + i;
+
+ /* advance counter */
+ self -> cur_elem += to_set;
+ return to_set;
+}
+
+static
+size_t SortingRowSetNextPhys ( SortingRowSet *self, const ctx_t *ctx,
+ int64_t *ids, size_t max_ids )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* limit copy to request */
+ size_t to_copy = self -> num_elems - self -> cur_elem;
+ if ( to_copy > max_ids )
+ to_copy = max_ids;
+
+ /* copy out old-ids */
+ memmove ( ids, & self -> src_ids [ self -> cur_elem ], to_copy * sizeof ids [ 0 ] );
+
+ /* advance counter */
+ self -> cur_elem += to_copy;
+ return to_copy;
+}
+
+static
+void SortingRowSetReset ( SortingRowSet *self, const ctx_t *ctx, bool for_static );
+
+static RowSet_vt SortingRowSetPhys_vt =
+{
+ SortingRowSetWhack,
+ SortingRowSetNextPhys,
+ SortingRowSetReset
+};
+
+static RowSet_vt SortingRowSetStat_vt =
+{
+ SortingRowSetWhack,
+ SortingRowSetNextStat,
+ SortingRowSetReset
+};
+
+static
+void SortingRowSetReset ( SortingRowSet *self, const ctx_t *ctx, bool for_static )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( for_static )
+ {
+ /* go static */
+ self -> dad . vt = & SortingRowSetStat_vt;
+ }
+ else
+ {
+ SortingRowSetIterator *iter = self -> iter;
+
+ /* go physical */
+ self -> dad . vt = & SortingRowSetPhys_vt;
+
+ if ( iter -> new_ord_valid )
+ {
+ /* read new-ids from file, selecting old-ids within range */
+ STATUS ( 3, "selecting first %,zu ids from old=>new where new_id >= %,ld",
+ iter -> max_elems, iter -> row_id );
+ iter -> num_elems = MapFileSelectOldToNewSingle ( iter -> idx, ctx,
+ iter -> row_id, iter -> src_ids, NULL, iter -> max_elems );
+ }
+ else
+ {
+ /* read new-ids from file, init new-ord, selecting old-ids within range */
+ STATUS ( 3, "selecting first %,zu ids, new_ord from old=>new where new_id >= %,ld",
+ iter -> max_elems, iter -> row_id );
+ TRY ( iter -> num_elems = MapFileSelectOldToNewSingle ( iter -> idx, ctx,
+ iter -> row_id, iter -> src_ids, iter -> new_ord, iter -> max_elems ) )
+ {
+ iter -> new_ord_valid = true;
+ }
+ }
+
+ if ( FAILED () )
+ return;
+
+ self -> num_elems = iter -> num_elems;
+ STATUS ( 3, "selected %,zu ids", self -> num_elems );
+ }
+
+ /* ready */
+ self -> cur_elem = 0;
+}
+
+
+/*--------------------------------------------------------------------------
+ * SortingRowSetIterator
+ * interface to iterate RowSets
+ */
+
+static
+void SortingRowSetIteratorWhack ( SortingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( self -> src_ids != NULL )
+ MemFree ( ctx, self -> src_ids, sizeof self -> src_ids [ 0 ] * self -> max_elems );
+ if ( self -> new_ord != NULL )
+ MemFree ( ctx, self -> new_ord, sizeof self -> new_ord [ 0 ] * self -> max_elems );
+
+ MapFileRelease ( self -> idx, ctx );
+
+ RowSetIteratorDestroy ( & self -> dad, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+RowSet *SortingRowSetIteratorMakeTheRowSet ( SortingRowSetIterator *self, const ctx_t *ctx, const RowSet_vt *vt )
+{
+ FUNC_ENTRY ( ctx );
+
+ SortingRowSet *rs;
+ TRY ( rs = MemAlloc ( ctx, sizeof * rs, false ) )
+ {
+ TRY ( RowSetInit ( & rs -> dad, ctx, vt ) )
+ {
+ /* initialize the row-set with map and self reference */
+ rs -> src_ids = self -> src_ids;
+ rs -> iter = ( SortingRowSetIterator* ) RowSetIteratorDuplicate ( & self -> dad, ctx );
+ rs -> num_elems = self -> num_elems;
+ rs -> cur_elem = 0;
+ return & rs -> dad;
+ }
+
+ MemFree ( ctx, rs, sizeof * rs );
+ }
+
+ return NULL;
+ }
+
+static
+struct IdxMapping *SortingRowSetIteratorGetIdxMapping ( SortingRowSetIterator *self, const ctx_t *ctx, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ ANNOTATE ( "CALLING GetIdxMapping ON SORTING ROWSET ITERATOR" );
+
+ if ( num_items != NULL )
+ * num_items = 0;
+
+ return NULL;
+}
+
+static
+int64_t *SortingRowSetIteratorGetSourceIds ( SortingRowSetIterator *self, const ctx_t *ctx, uint32_t **opt_ord, size_t *num_items )
+{
+ FUNC_ENTRY ( ctx );
+
+ if ( opt_ord != NULL )
+ * opt_ord = self -> new_ord;
+
+ if ( self -> src_ids == NULL )
+ {
+ rc_t rc = RC ( rcExe, rcCursor, rcAccessing, rcSelf, rcInconsistent );
+ ERROR ( rc, "source id array is NULL" );
+ if ( num_items != NULL )
+ * num_items = 0;
+ return NULL;
+ }
+
+ if ( num_items != NULL )
+ * num_items = self -> num_elems;
+ return self -> src_ids;
+}
+
+static
+void SortingRowSetIteratorAllocMap ( SortingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* determine the maximum number of elements */
+ const Tool *tp = ctx -> caps -> tool;
+ uint64_t count = self -> last_excl - self -> row_id;
+ self -> max_elems = self -> large ? tp -> max_large_idx_ids : tp -> max_idx_ids;
+ if ( ( uint64_t ) self -> max_elems > count )
+ self -> max_elems = ( size_t ) count;
+
+ /* try to allocate the memory
+ this may be limited by the MemBank */
+ do
+ {
+ CLEAR ();
+
+ TRY ( self -> src_ids = MemAlloc ( ctx, sizeof self -> src_ids [ 0 ] * self -> max_elems, false ) )
+ {
+ TRY ( self -> new_ord = MemAlloc ( ctx, sizeof self -> new_ord [ 0 ] * self -> max_elems, false ) )
+ {
+ STATUS ( 4, "allocated mapping array of %,u elements", self -> max_elems );
+ return;
+ }
+
+ MemFree ( ctx, self -> src_ids, sizeof self -> src_ids [ 0 ] * self -> max_elems );
+ self -> src_ids = NULL;
+ }
+
+ self -> max_elems >>= 1;
+ }
+ while ( self -> max_elems >= ctx -> caps -> tool -> min_idx_ids );
+
+ ANNOTATE ( "failed to allocate map for row-set" );
+}
+
+static
+RowSet *SortingRowSetIteratorNext ( SortingRowSetIterator *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ RowSet *rs = NULL;
+
+ /* on first invocation, allocate the map */
+ if ( self -> src_ids == NULL )
+ {
+ ON_FAIL ( SortingRowSetIteratorAllocMap ( self, ctx ) )
+ return NULL;
+
+ assert ( self -> src_ids != NULL );
+ assert ( self -> new_ord != NULL );
+ }
+
+ /* advance row_id */
+ self -> row_id += self -> num_elems;
+ self -> num_elems = 0;
+ self -> new_ord_valid = false;
+
+ /* create the empty row-set */
+ if ( self -> row_id < self -> last_excl )
+ rs = SortingRowSetIteratorMakeTheRowSet ( self, ctx, & SortingRowSetPhys_vt );
+
+ return rs;
+}
+
+
+/*--------------------------------------------------------------------------
+ * MapFile
+ */
+
+static RowSetIterator_vt SortingRowSetIterator_vt =
+{
+ SortingRowSetIteratorWhack,
+ SortingRowSetIteratorGetIdxMapping,
+ SortingRowSetIteratorGetSourceIds,
+ SortingRowSetIteratorNext
+};
+
+RowSetIterator * MapFileMakeSortingRowSetIterator ( const MapFile *self, const ctx_t *ctx, bool large )
+{
+ FUNC_ENTRY ( ctx );
+
+ SortingRowSetIterator *rsi;
+
+ /* create the iterator */
+ TRY ( rsi = MemAlloc ( ctx, sizeof * rsi, true ) )
+ {
+ TRY ( RowSetIteratorInit ( & rsi -> dad, ctx, & SortingRowSetIterator_vt ) )
+ {
+ /* initialize the row-set with map and self reference */
+ TRY ( rsi -> row_id = MapFileFirst ( self, ctx ) )
+ {
+ TRY ( rsi -> last_excl = rsi -> row_id + MapFileCount ( self, ctx ) )
+ {
+ TRY ( rsi -> idx = MapFileDuplicate ( self, ctx ) )
+ {
+ rsi -> large = large;
+ return & rsi -> dad;
+ }
+ }
+ }
+ }
+
+ MemFree ( ctx, rsi, sizeof * rsi );
+ }
+
+ return NULL;
+}
diff --git a/tools/sra-sort/sra-sort.c b/tools/sra-sort/sra-sort.c
new file mode 100644
index 0000000..4845f86
--- /dev/null
+++ b/tools/sra-sort/sra-sort.c
@@ -0,0 +1,746 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "ctx.h"
+#include "caps.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+#include "sra-sort.h"
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <vdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <kfg/config.h>
+#include <kfs/directory.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <strtol.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _WIN32
+#include <process.h>
+#else
+#include <unistd.h>
+#endif
+
+FILE_ENTRY ( sra-sort );
+
+
+/* this goes away in vdb-3 */
+const char UsageDefaultName [] = "sra-sort";
+
+rc_t CC UsageSummary ( const char *prog_name )
+{
+ return KOutMsg ( "Usage: %s [options] src-object dst-object\n"
+ " %s [options] src-object [src-object...] dst-dir\n"
+ "\n"
+ , prog_name
+ , prog_name
+ );
+}
+
+#define OPT_IGNORE_FAILURE "ignore-failure"
+#define OPT_FORCE "force"
+#define OPT_MEM_LIMIT "mem-limit"
+#define OPT_MAP_FILE_BSIZE "map-file-bsize"
+#define OPT_MAX_IDX_IDS "max-idx-ids"
+#define OPT_MAX_REF_IDX_IDS "max-ref-idx-ids"
+#define OPT_MAX_LARGE_IDX_IDS "max-large-idx-ids"
+#define OPT_TEMP_DIR "tempdir"
+#define OPT_MMAP_DIR "mmapdir"
+#define OPT_UNSORTED_OLD_NEW "unsorted-old-new"
+
+#define OPT_COLUMN_MD5 "column-md5"
+#define OPT_NO_COLUMN_CHECKSUM "no-column-checksum"
+
+#define OPT_BLOB_CRC32 "blob-crc32"
+#define OPT_BLOB_MD5 "blob-md5"
+#define OPT_NO_BLOB_CHECKSUM "no-blob-checksum"
+
+#define OPT_KEEP_IDX_FILES "keep-idx-files"
+#define OPT_IDX_CONSISTENCY_CHECK "idx-cc"
+
+static const char *hlp_ignore_failure [] = { "ignore failure when sorting multiple objects",
+ "i.e. continue in spite of previous errors", NULL };
+static const char *hlp_force [] = { "force overwrite of existing destination", NULL };
+static const char *hlp_mem_limit [] = { "sets limit on dynamic memory usage", NULL };
+static const char *hlp_map_file_bsize [] = { "sets id map-file cache size", NULL };
+static const char *hlp_max_idx_ids [] = { "sets number of join-index ids to process at a time", NULL };
+static const char *hlp_max_ref_idx_ids [] = { "sets number of join-index ids to process within REFERENCE table", NULL };
+static const char *hlp_max_large_idx_ids [] = { "sets number of rows to process with large columns", NULL };
+static const char *hlp_temp_dir [] = { "sets a specific directory to use for temporary files", NULL };
+static const char *hlp_mmap_dir [] = { "sets a specific directory to use for memory-mapped buffers", NULL };
+static const char *hlp_unsorted_old_new [] = { "write old=>new index in unsorted order", NULL };
+
+static const char *hlp_column_md5 [] = { "generate md5sum compatible checksum files for each column [default]", NULL };
+static const char *hlp_no_column_checksum [] = { "disable generation of column checksums", NULL };
+
+static const char *hlp_blob_crc32 [] = { "generate CRC32 checksums for each blob [default]", NULL };
+static const char *hlp_blob_md5 [] = { "generate MD5 checksums for each blob", NULL };
+static const char *hlp_no_blob_checksum [] = { "disable generation of blob checksums", NULL };
+
+#if _DEBUGGING
+static const char *hlp_keep_idx_files [] = { "keep temporary index files for debugging", NULL };
+static const char *hlp_idx_consistency_check [] = { "run consistency check on index files", NULL };
+#endif
+
+static OptDef options [] =
+{
+ /* 1. long-name
+ 2. list of single character short names
+ 3. help-gen function
+ 4. list of help strings, NULL terminated
+ 5. max count
+ 6. option requires value
+ 7. option is required
+ */
+ { OPT_IGNORE_FAILURE, "i", NULL, hlp_ignore_failure, 1, false, false }
+ , { OPT_FORCE, "f", NULL, hlp_force, 1, false, false }
+ , { OPT_MEM_LIMIT, NULL, NULL, hlp_mem_limit, 1, true, false }
+ , { OPT_MAP_FILE_BSIZE, NULL, NULL, hlp_map_file_bsize, 1, true, false }
+ , { OPT_MAX_IDX_IDS, NULL, NULL, hlp_max_idx_ids, 1, true, false }
+ , { OPT_MAX_REF_IDX_IDS, NULL, NULL, hlp_max_ref_idx_ids, 1, true, false }
+ , { OPT_MAX_LARGE_IDX_IDS, NULL, NULL, hlp_max_large_idx_ids, 1, true, false }
+ , { OPT_TEMP_DIR, NULL, NULL, hlp_temp_dir, 1, true, false }
+ , { OPT_MMAP_DIR, NULL, NULL, hlp_mmap_dir, 1, true, false }
+ , { OPT_UNSORTED_OLD_NEW, NULL, NULL, hlp_unsorted_old_new, 1, false, false }
+
+ , { OPT_COLUMN_MD5, NULL, NULL, hlp_column_md5, 1, false, false }
+ , { OPT_NO_COLUMN_CHECKSUM, NULL, NULL, hlp_no_column_checksum, 1, false, false }
+ , { OPT_BLOB_CRC32, NULL, NULL, hlp_blob_crc32, 1, false, false }
+ , { OPT_BLOB_MD5, NULL, NULL, hlp_blob_md5, 1, false, false }
+ , { OPT_NO_BLOB_CHECKSUM, NULL, NULL, hlp_no_blob_checksum, 1, false, false }
+#if _DEBUGGING
+ , { OPT_KEEP_IDX_FILES, NULL, NULL, hlp_keep_idx_files, 1, false, false }
+ , { OPT_IDX_CONSISTENCY_CHECK, NULL, NULL, hlp_idx_consistency_check, 1, false, false }
+#endif
+};
+
+static const char *option_params [] =
+{
+ NULL
+ , NULL
+ , "bytes"
+ , "cache-size"
+ , "num-ids"
+ , "num-ids"
+ , "num-ids"
+ , "path-to-tmp"
+ , "path-to-mmaps"
+ , NULL
+ , NULL
+ , NULL
+ , NULL
+ , NULL
+ , NULL
+#if _DEBUGGING
+ , NULL
+ , NULL
+#endif
+};
+
+rc_t CC Usage ( const Args *args )
+{
+ uint32_t i;
+ const char *progname, *fullpath;
+ rc_t rc = ArgsProgram ( args, & fullpath, & progname );
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+
+ for ( i = 0; i < sizeof options / sizeof options [ 0 ]; ++ i )
+ {
+ HelpOptionLine ( options [ i ] . aliases, options [ i ] . name,
+ option_params [ i ], options [ i ] . help );
+ }
+
+ HelpOptionsStandard ();
+
+ HelpVersion ( fullpath, KAppVersion () );
+
+ return 0;
+}
+
+static
+const char *ArgsGetOptStr ( Args *self, const ctx_t *ctx, const char *optname, uint32_t *count )
+{
+ rc_t rc;
+ const char *val = NULL;
+
+ uint32_t dummy;
+ if ( count == NULL )
+ count = & dummy;
+
+ rc = ArgsOptionCount ( self, optname, count );
+ if ( rc == 0 && * count != 0 )
+ {
+ rc = ArgsOptionValue ( self, optname, 0, (const void **)& val );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "failed to retrieve '%s' parameter", optname );
+ }
+
+ return val;
+}
+
+static
+uint64_t ArgsGetOptU64 ( Args *self, const ctx_t *ctx, const char *optname, uint32_t *count )
+{
+ rc_t rc;
+ uint64_t val = 0;
+
+ uint32_t dummy;
+ if ( count == NULL )
+ count = & dummy;
+
+ rc = ArgsOptionCount ( self, optname, count );
+ if ( rc == 0 && * count != 0 )
+ {
+ const char *str;
+ rc = ArgsOptionValue ( self, optname, 0, (const void **)& str );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "failed to retrieve '%s' parameter", optname );
+ else
+ {
+ char *end;
+ val = strtou64 ( str, & end, 0 );
+ if ( end [ 0 ] != 0 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcIncorrect );
+ ERROR ( rc, "bad '%s' parameter: '%s'", optname, str );
+ }
+ }
+ }
+
+ return val;
+}
+
+static
+bool ArgsGetOptBool ( Args *self, const ctx_t *ctx, const char *optname, uint32_t *count )
+{
+ rc_t rc;
+ bool val = false;
+
+ uint32_t dummy;
+ if ( count == NULL )
+ count = & dummy;
+
+ rc = ArgsOptionCount ( self, optname, count );
+ if ( rc == 0 && * count != 0 )
+ val = true;
+
+ return val;
+}
+
+static
+uint64_t KConfigGetNodeU64 ( const ctx_t *ctx, const char *path, bool *found )
+{
+ rc_t rc;
+ uint64_t val = 0;
+ const KConfigNode *n;
+
+ bool dummy;
+ if ( found == NULL )
+ found = & dummy;
+
+ rc = KConfigOpenNodeRead ( ctx -> caps -> cfg, & n, "sra-sort/map_file_bsize" );
+ if ( rc == 0 )
+ {
+ char buff [ 256 ];
+ size_t num_read, remaining;
+
+ rc = KConfigNodeRead ( n, 0, buff, sizeof buff - 1, & num_read, & remaining );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to read KConfig node '%s'", path );
+ else if ( remaining != 0 )
+ {
+ rc = RC ( rcExe, rcNode, rcReading, rcBuffer, rcInsufficient );
+ ERROR ( rc, "failed to read KConfig node '%s'", path );
+ }
+ else
+ {
+ char *end;
+ buff [ num_read ] = 0;
+ val = strtou64 ( buff, & end, 0 );
+ if ( end [ 0 ] != 0 )
+ {
+ rc = RC ( rcExe, rcNode, rcReading, rcNumeral, rcIncorrect );
+ ERROR ( rc, "bad '%s' config value: '%s'", path, buff );
+ }
+ }
+
+ KConfigNodeRelease ( n );
+ }
+
+ return val;
+}
+
+static
+void initialize_params ( const ctx_t *ctx, Caps *caps, Tool *tp, Selection *sel, Args *args )
+{
+ bool found=false;
+ uint64_t val;
+ uint32_t count;
+ const char *str;
+
+ int col_md5 = kcmMD5;
+
+ memset ( sel, 0, sizeof * sel );
+ memset ( tp, 0, sizeof * tp );
+ tp -> sel = sel;
+
+ /* default to host tmp */
+ tp -> tmpdir = "/tmp";
+
+ /* default to mmap dir */
+ tp -> mmapdir = NULL;
+
+ /* default buffer size for map cache */
+ tp -> map_file_bsize = 64 * 1024 * 1024;
+ tp -> map_file_random_bsize = tp -> map_file_bsize;
+
+ /* default max index ids to gather at a time */
+ tp -> max_ref_idx_ids = tp -> max_large_idx_ids = tp -> max_idx_ids = 256 * 1024 * 1024;
+ tp -> max_poslen_ids = 64 * 1024 * 1024;
+ tp -> min_idx_ids = 64 * 1024 * 1024;
+ tp -> max_missing_ids = tp -> max_idx_ids;
+
+#if 0
+ /* refpos cache size */
+ tp -> refpos_cache_capacity = 100 * 1024 * 1024;
+#endif
+
+ /* for creating mapping files */
+ tp -> pid = getpid ();
+
+ /* db create defaults */
+ tp -> db . cmode = kcmCreate;
+
+ /* tbl create defaults */
+ tp -> tbl . cmode = kcmCreate;
+
+ /* column create mode defaults */
+ tp -> col . pgsize = 1;
+ tp -> col . cmode = kcmInit;
+ tp -> col . checksum = kcsCRC32;
+
+ /* normally do not ignore failures */
+ tp -> ignore = false;
+
+ /* normally do not force overwrite */
+ tp -> force = false;
+
+ /* not needed under normal circumstances */
+ tp -> write_new_to_old = false;
+tp->write_new_to_old=true;
+
+ /* default is to sort on old */
+ tp -> sort_before_old2new = true;
+
+ /* when debugging, this can be turned off */
+ tp -> unlink_idx_files = true;
+ tp -> idx_consistency_check = false;
+
+
+ /* record them as caps */
+ caps -> tool = tp;
+
+ /* look in config */
+ /* TBD - COMPLETE THIS */
+ ON_FAIL ( val = KConfigGetNodeU64 ( ctx, "sra-sort/map_file_bsize", & found ) )
+ return;
+ if ( found )
+ tp -> map_file_bsize = tp -> map_file_random_bsize = ( size_t ) val;
+
+ ON_FAIL ( val = KConfigGetNodeU64 ( ctx, "sra-sort/map_file_random_bsize", & found ) )
+ return;
+ if ( found )
+ tp -> map_file_random_bsize = ( size_t ) val;
+
+ ON_FAIL ( val = KConfigGetNodeU64 ( ctx, "sra-sort/max_idx_ids", & found ) )
+ return;
+ if ( found )
+ tp -> max_idx_ids = ( size_t ) val;
+
+ ON_FAIL ( val = KConfigGetNodeU64 ( ctx, "sra-sort/max_ref_idx_ids", & found ) )
+ return;
+ if ( found )
+ tp -> max_ref_idx_ids = ( size_t ) val;
+
+ /* finally look in args */
+ ON_FAIL ( str = ArgsGetOptStr ( args, ctx, OPT_TEMP_DIR, & count ) )
+ return;
+ if ( count != 0 && str [ 0 ] != 0 )
+ tp -> tmpdir = str;
+
+ ON_FAIL ( str = ArgsGetOptStr ( args, ctx, OPT_MMAP_DIR, & count ) )
+ return;
+ if ( count != 0 && str [ 0 ] != 0 )
+ tp -> mmapdir = str;
+
+ ON_FAIL ( val = ArgsGetOptU64 ( args, ctx, OPT_MAP_FILE_BSIZE, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> map_file_random_bsize = ( size_t ) val;
+
+ ON_FAIL ( val = ArgsGetOptU64 ( args, ctx, OPT_MAX_IDX_IDS, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> max_idx_ids = tp -> max_ref_idx_ids = ( size_t ) val;
+
+ ON_FAIL ( val = ArgsGetOptU64 ( args, ctx, OPT_MAX_REF_IDX_IDS, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> max_ref_idx_ids = ( size_t ) val;
+
+ ON_FAIL ( val = ArgsGetOptU64 ( args, ctx, OPT_MAX_LARGE_IDX_IDS, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> max_large_idx_ids = ( size_t ) val;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_IGNORE_FAILURE, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> ignore = true;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_FORCE, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> force = true;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_UNSORTED_OLD_NEW, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> sort_before_old2new = false;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_COLUMN_MD5, & count ) )
+ return;
+ if ( count != 0 )
+ col_md5 = kcmMD5;
+ else
+ {
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_NO_COLUMN_CHECKSUM, & count ) )
+ return;
+ if ( count != 0 )
+ col_md5 = 0;
+ }
+
+ tp -> db . cmode |= col_md5;
+ tp -> tbl . cmode |= col_md5;
+ tp -> col . cmode |= col_md5;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_BLOB_CRC32, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> col . checksum = kcsCRC32;
+ else
+ {
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_BLOB_MD5, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> col . checksum = kcsMD5;
+ else
+ {
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_NO_BLOB_CHECKSUM, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> col . checksum = kcsNone;
+ }
+ }
+
+#if _DEBUGGING
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_KEEP_IDX_FILES, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> unlink_idx_files = false;
+
+ ON_FAIL ( found = ArgsGetOptBool ( args, ctx, OPT_IDX_CONSISTENCY_CHECK, & count ) )
+ return;
+ if ( count != 0 )
+ tp -> idx_consistency_check = tp -> write_new_to_old = true;
+#endif
+}
+
+static
+void initialize_caps ( const ctx_t *ctx, Caps *caps, Args *args )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* get specified limit */
+ uint32_t count;
+ size_t mem_limit = ( size_t ) ArgsGetOptU64 ( args, ctx, OPT_MEM_LIMIT, & count );
+ if ( ! FAILED () && count != 0 )
+ {
+ MemBank *mem;
+ TRY ( mem = MemBankMake ( ctx, mem_limit ) )
+ {
+ MemBankRelease ( caps -> mem, ctx );
+ caps -> mem = mem;
+ }
+ }
+
+ if ( ! FAILED () )
+ {
+ /* here's a chance to pick up special config */
+ /* TBD */
+
+ /* open up KConfig */
+ rc_t rc = KConfigMake ( ( KConfig** ) & caps -> cfg, NULL );
+ if ( rc != 0 )
+ ERROR ( rc, "KConfigMake failed" );
+ }
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ DECLARE_CTX_INFO ();
+
+ /* initialize context */
+ Caps caps;
+ ctx_t main_ctx = { & caps, NULL, & ctx_info };
+ const ctx_t *ctx = & main_ctx;
+ CapsInit ( & caps, NULL );
+
+ if ( argc <= 1 )
+ main_ctx . rc = UsageSummary ( "sra-sort" );
+ else
+ {
+ /* create MemBank with unlimited quota */
+ TRY ( caps . mem = MemBankMake ( ctx, -1 ) )
+ {
+ rc_t rc = VDBManagerMakeUpdate ( & caps . vdb, NULL );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create VDBManager" );
+ else
+ {
+ rc = VDBManagerOpenKDBManagerUpdate ( caps . vdb, & caps . kdb );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to create KDBManager" );
+ else
+ {
+ Args * args;
+ rc = ArgsMakeAndHandle ( & args, argc, argv, 1,
+ options, sizeof options / sizeof options [ 0 ] );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to parse command line" );
+ else
+ {
+ TRY ( initialize_caps ( ctx, & caps, args ) )
+ {
+ Tool tp;
+ Selection sel;
+ TRY ( initialize_params ( ctx, & caps, & tp, & sel, args ) )
+ {
+ uint32_t count;
+ rc = ArgsParamCount ( args, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "ArgsParamCount failed" );
+ else if ( count < 2 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ ERROR ( rc, "expected source and destination parameters" );
+ }
+ else
+ {
+ /* check type of last parameter */
+ const char *dst;
+ rc = ArgsParamValue ( args, count - 1, (const void **)& dst );
+ if ( rc != 0 )
+ ERROR ( rc, "ArgsParamValue [ %u ] failed", count - 1 );
+ else
+ {
+ enum RCTarget targ = rcNoTarg;
+
+ bool dst_is_dir = false;
+ int dst_type = KDBManagerPathType ( caps . kdb, "%s", dst ) & ~ kptAlias;
+ if ( dst_type == kptDir )
+ dst_is_dir = true;
+ else if ( count != 2 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcArgv, rcIncorrect );
+ ERROR ( rc, "multiple source objects require last parameter to be a directory" );
+ }
+ else switch ( dst_type )
+ {
+ case kptNotFound:
+ tp . db . cmode |= kcmParents;
+ tp . tbl . cmode |= kcmParents;
+ break;
+ case kptFile:
+ case kptFile | kptAlias:
+ rc = RC ( rcExe, rcArgv, rcParsing, rcArgv, rcIncorrect );
+ ERROR ( rc, "destination object is a file - remove first or rename before trying again" );
+ break;
+ case kptDatabase:
+ targ = rcDatabase;
+ break;
+ case kptTable:
+ targ = rcTable;
+ break;
+ case kptPrereleaseTbl:
+ dst_type = kptTable;
+ break;
+ default:
+ rc = RC ( rcExe, rcArgv, rcParsing, rcArgv, rcIncorrect );
+ ERROR ( rc, "destination object type cannot be overwritten" );
+ break;
+ }
+
+ if ( ! FAILED () )
+ {
+ if ( dst_is_dir )
+ {
+ uint32_t i;
+ rc_t first_rc = 0;
+ bool issue_divider_line;
+
+ if ( tp . force )
+ {
+ tp . db . cmode = kcmInit | ( tp . db . cmode & ~ kcmValueMask );
+ tp . tbl . cmode = kcmInit | ( tp . tbl . cmode & ~ kcmValueMask );
+ }
+
+ for ( issue_divider_line = false, i = 0; i < count - 1; issue_divider_line = true, ++ i )
+ {
+ rc = ArgsParamValue ( args, i, (const void **)& tp . src_path );
+ if ( rc != 0 )
+ ERROR ( rc, "ArgParamValue [ %u ] failed", i );
+ else
+ {
+ char dst_path [ 4096 ];
+ const char *leaf = strrchr ( tp . src_path, '/' );
+ if ( leaf ++ == NULL )
+ leaf = tp . src_path;
+ rc = string_printf ( dst_path, sizeof dst_path, NULL, "%s/%s", dst, leaf );
+ if ( rc != 0 )
+ ERROR ( rc, "string_printf on param [ %u ] failed", i );
+ else
+ {
+ size_t size = string_size ( dst_path );
+ char *ext = string_rchr ( dst_path, size, '.' );
+ if ( ext != NULL )
+ {
+ size -= ext - dst_path;
+ switch ( size )
+ {
+ case 4:
+ if ( strcase_cmp ( ext, 4, ".sra", 4, 4 ) == 0 )
+ * ext = 0;
+ break;
+ case 5:
+ if ( strcase_cmp ( ext, 5, ".csra", 5, 5 ) == 0 )
+ * ext = 0;
+ break;
+ }
+ }
+
+ if ( issue_divider_line )
+ STATUS ( 1, "################################################################" );
+
+ tp . dst_path = dst_path;
+ ON_FAIL ( run ( ctx ) )
+ {
+ if ( ! tp . ignore )
+ break;
+
+ if ( first_rc == 0 )
+ first_rc = ctx -> rc;
+
+ CLEAR ();
+ }
+ }
+ }
+ }
+
+ if ( first_rc != 0 )
+ main_ctx . rc = first_rc;
+ }
+ else
+ {
+ tp . dst_path = dst;
+ rc = ArgsParamValue ( args, 0, (const void **)& tp . src_path );
+ if ( rc != 0 )
+ ERROR ( rc, "ArgParamValue [ 0 ] failed" );
+ else
+ {
+ int src_type;
+
+ switch ( dst_type )
+ {
+ case kptDatabase:
+ case kptTable:
+ src_type = KDBManagerPathType ( caps . kdb, "%s", tp . src_path ) & ~ kptAlias;
+ if ( src_type == kptPrereleaseTbl )
+ src_type = kptTable;
+ if ( src_type != dst_type )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcArgv, rcIncorrect );
+ ERROR ( rc, "source and destination object types are not compatible" );
+ }
+ else if ( ! tp . force )
+ {
+ rc = RC ( rcExe, targ, rcCopying, targ, rcExists );
+ ERROR ( rc, "destination object cannot be overwritten - try again with '-f'" );
+ }
+ else
+ {
+ tp . db . cmode = kcmInit | ( tp . db . cmode & ~ kcmValueMask );
+ tp . tbl . cmode = kcmInit | ( tp . tbl . cmode & ~ kcmValueMask );
+ }
+ }
+
+ if ( ! FAILED () )
+ run ( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ArgsWhack ( args );
+ }
+ }
+ }
+
+ CapsWhack ( & caps, ctx );
+ }
+ }
+
+ return main_ctx . rc;
+}
diff --git a/tools/sra-sort/sra-sort.h b/tools/sra-sort/sra-sort.h
new file mode 100644
index 0000000..027d591
--- /dev/null
+++ b/tools/sra-sort/sra-sort.h
@@ -0,0 +1,171 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_
+#define _h_sra_sort_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_kfs_defs_
+#include <kfs/defs.h>
+#endif
+
+#ifndef _h_kdb_column_
+#include <kdb/column.h>
+#endif
+
+
+#define NEW_TYPES 1
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct DbPair;
+struct TablePair;
+
+
+/*--------------------------------------------------------------------------
+ * Selection
+ * input selection criteria
+ */
+typedef struct Selection Selection;
+struct Selection
+{
+ int dummy;
+};
+
+/*--------------------------------------------------------------------------
+ * Tool
+ * parameter block generated by KMain
+ */
+typedef struct Tool Tool;
+struct Tool
+{
+ /* input selection */
+ const Selection *sel;
+
+ /* directory for temporary files */
+ const char *tmpdir;
+
+ /* directory for mmap page files */
+ const char *mmapdir;
+
+ /* source object path */
+ const char *src_path;
+
+ /* destination object path */
+ const char *dst_path;
+
+ /* buffer size for id map files */
+ size_t map_file_bsize;
+ size_t map_file_random_bsize;
+
+ /* the number of ids to gather at a time */
+ size_t max_ref_idx_ids;
+ size_t max_large_idx_ids;
+ size_t max_poslen_ids;
+ size_t max_idx_ids;
+ size_t min_idx_ids;
+
+ /* the number of missing SEQUENCE ids to gather at a time */
+ size_t max_missing_ids;
+
+ /* pid of tool */
+ int pid;
+
+ /* db create mode */
+ struct
+ {
+ KCreateMode cmode;
+ } db;
+
+ /* tbl create mode */
+ struct
+ {
+ KCreateMode cmode;
+ } tbl;
+
+ /* column blob checksum mode */
+ struct
+ {
+ size_t pgsize;
+ KCreateMode cmode;
+ KChecksum checksum;
+ } col;
+
+ /* ignore failure on multiple sorts */
+ bool ignore;
+
+ /* force overwrite */
+ bool force;
+
+ /* write new=>old mappings
+ not normally needed */
+ bool write_new_to_old;
+
+ /* whether to apply a sort on old-id
+ before writing old=>new mapping or
+ to let pagefile handle it */
+ bool sort_before_old2new;
+
+ /* normally remove idx files right away
+ but if they are being debugged... */
+ bool unlink_idx_files;
+
+ /* perform consistency check on index */
+ bool idx_consistency_check;
+};
+
+
+/*--------------------------------------------------------------------------
+ * TypeParams
+ * object type params
+ */
+typedef struct TypeParams TypeParams;
+struct TypeParams
+{
+ char src_type [ 256 ];
+ char dst_type [ 256 ];
+ char view_type [ 256 ];
+};
+
+
+/*--------------------------------------------------------------------------
+ * sra-sort functions
+ */
+
+/* run
+ * called from KMain
+ * determines the type of object being copied/sorted
+ * opens input object
+ * dispatches to the appropriate handler
+ */
+void run ( const ctx_t *ctx );
+
+
+#endif
diff --git a/tools/sra-sort/status.h b/tools/sra-sort/status.h
new file mode 100644
index 0000000..6c88ead
--- /dev/null
+++ b/tools/sra-sort/status.h
@@ -0,0 +1,50 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_status_
+#define _h_sra_sort_status_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * status generation
+ */
+
+
+/* STATUS
+ * give feedback
+ */
+void Status ( const ctx_t *ctx, uint32_t lineno, uint32_t level, const char *msg, ... );
+
+#undef STATUS
+#define STATUS( lvl, msg, ... ) \
+ Status ( ctx, __LINE__, lvl, msg, ## __VA_ARGS__ )
+
+
+#endif
diff --git a/tools/sra-sort/tbl-pair.c b/tools/sra-sort/tbl-pair.c
new file mode 100644
index 0000000..01e2a0a
--- /dev/null
+++ b/tools/sra-sort/tbl-pair.c
@@ -0,0 +1,1055 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+typedef struct TablePair StdTblPair;
+#define TBLPAIR_IMPL StdTblPair
+
+#include "tbl-pair.h"
+#include "col-pair.h"
+#include "db-pair.h"
+#include "meta-pair.h"
+#include "row-set-priv.h"
+#include "ctx.h"
+#include "caps.h"
+#include "except.h"
+#include "status.h"
+#include "mem.h"
+#include "sra-sort.h"
+
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/meta.h>
+#include <klib/printf.h>
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+
+FILE_ENTRY ( tbl-pair );
+
+
+/*--------------------------------------------------------------------------
+ * StdTblPair
+ * generic database object pair
+ */
+
+static
+void StdTblPairWhack ( StdTblPair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+ TablePairDestroy ( self, ctx );
+ MemFree ( ctx, self, sizeof * self );
+}
+
+static
+void StdTblPairDummyStub ( StdTblPair *self, const ctx_t *ctx )
+{
+}
+
+static
+ColumnPair *StdTblPairMakeColumnPair ( StdTblPair *self, const ctx_t *ctx,
+ struct ColumnReader *reader, struct ColumnWriter *writer, const char *colspec, bool large )
+{
+ FUNC_ENTRY ( ctx );
+ return TablePairMakeColumnPair ( self, ctx, reader, writer, colspec, large );
+}
+
+static
+RowSetIterator *StdTblPairGetRowSetIterator ( StdTblPair *self, const ctx_t *ctx, bool mapped, bool large )
+{
+ FUNC_ENTRY ( ctx );
+ return TablePairMakeRowSetIterator ( self, ctx, NULL, mapped, large );
+}
+
+static TablePair_vt StdTblPair_vt =
+{
+ StdTblPairWhack,
+ StdTblPairDummyStub,
+ StdTblPairDummyStub,
+ StdTblPairMakeColumnPair,
+ StdTblPairDummyStub,
+ StdTblPairDummyStub,
+ StdTblPairGetRowSetIterator
+};
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ * interface code
+ */
+
+
+/* Make
+ * makes an object based upon open source and destination VDatabase objects
+ */
+TablePair *TablePairMake ( const ctx_t *ctx,
+ const VTable *src, VTable *dst, const char *name, const char *opt_full_spec, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+
+ StdTblPair *tbl;
+
+ TRY ( tbl = MemAlloc ( ctx, sizeof * tbl, false ) )
+ {
+ TRY ( TablePairInit ( tbl, ctx, & StdTblPair_vt, src, dst, name, opt_full_spec, reorder ) )
+ {
+ return tbl;
+ }
+
+ MemFree ( ctx, tbl, sizeof * tbl );
+ }
+
+ return NULL;
+}
+
+TablePair *DbPairMakeStdTblPair ( DbPair *self, const ctx_t *ctx,
+ const VTable *src, VTable *dst, const char *name, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+ return TablePairMake ( ctx, src, dst, name, self -> full_spec, reorder );
+}
+
+
+/* Release
+ */
+void TablePairRelease ( TablePair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountDrop ( & self -> refcount, "TablePair" ) )
+ {
+ case krefOkay:
+ break;
+ case krefWhack:
+ ( * self -> vt -> whack ) ( ( void* ) self, ctx );
+ break;
+ case krefZero:
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcTable, rcDestroying, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to release TablePair" );
+ }
+ }
+}
+
+/* Duplicate
+ */
+TablePair *TablePairDuplicate ( TablePair *self, const ctx_t *ctx )
+{
+ rc_t rc;
+ FUNC_ENTRY ( ctx );
+
+ if ( self != NULL )
+ {
+ switch ( KRefcountAdd ( & self -> refcount, "TablePair" ) )
+ {
+ case krefOkay:
+ case krefWhack:
+ case krefZero:
+ break;
+ case krefLimit:
+ case krefNegative:
+ rc = RC ( rcExe, rcTable, rcAttaching, rcRefcount, rcInvalid );
+ INTERNAL_ERROR ( rc, "failed to duplicate TablePair" );
+ return NULL;
+ }
+ }
+
+ return ( TablePair* ) self;
+}
+
+
+/* CommitColumnPair
+ */
+static
+bool CC TablePairCommitColumnPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ ColumnPair *col = item;
+ TRY ( ColumnWriterCommit ( col -> writer, ctx ) )
+ {
+ return false;
+ }
+ return true;
+}
+
+
+/* ReleaseColumnPair
+ */
+static
+void CC TablePairReleaseColumnPair ( void *item, void *data )
+{
+ const ctx_t *ctx = ( const void* ) data;
+ FUNC_ENTRY ( ctx );
+ ColumnPairRelease ( item, ctx );
+}
+
+
+/* Copy
+ * the table has to obtain a RowSetIterator
+ * which it walks vertically
+ *
+ * for each RowSet, it walks its columns horizontally,
+ * resetting it between columns
+ */
+static
+void TablePairCopyStaticColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy static columns */
+ uint32_t count = VectorLength ( & self -> static_cols );
+ if ( count != 0 )
+ {
+#if OLD_STATIC_WRITE
+ RowSetIterator *rsi;
+ TRY ( rsi = TablePairMakeRowSetIterator ( self, ctx, NULL, false ) )
+ {
+#endif
+ STATUS ( 2, "copying '%s' static columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+#if OLD_STATIC_WRITE
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+#endif
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> static_cols, i );
+ assert ( col != NULL );
+#if OLD_STATIC_WRITE
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+#else
+ ON_FAIL ( ColumnPairCopyStatic ( col, ctx, self -> first_id, self -> last_excl - self -> first_id ) )
+ break;
+#endif
+ }
+
+#if OLD_STATIC_WRITE
+ RowSetRelease ( rs, ctx );
+#else
+ break;
+#endif
+ }
+
+#if OLD_STATIC_WRITE
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+#endif
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing static columns" );
+ VectorDoUntil ( & self -> static_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing static columns" );
+ VectorWhack ( & self -> static_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+static
+void TablePairCopyPresortColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy remaining columns */
+ uint32_t count = VectorLength ( & self -> presort_cols );
+ if ( count != 0 )
+ {
+ RowSetIterator *rsi;
+ TRY ( rsi = TablePairMakeSimpleRowSetIterator ( self, ctx ) )
+ {
+ STATUS ( 2, "copying '%s' presorted columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> presort_cols, i );
+ assert ( col != NULL );
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+ }
+
+ RowSetRelease ( rs, ctx );
+ }
+
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing presorted columns" );
+ VectorDoUntil ( & self -> presort_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing presorted columns" );
+ VectorWhack ( & self -> presort_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+static
+void TablePairCopyMappedColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy mapped columns */
+ uint32_t count = VectorLength ( & self -> mapped_cols );
+ if ( count != 0 )
+ {
+ RowSetIterator *rsi;
+ const bool is_mapped = true;
+ const bool is_large = false;
+ TRY ( rsi = TablePairGetRowSetIterator ( self, ctx, is_mapped, is_large ) )
+ {
+ STATUS ( 2, "copying '%s' mapped columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> mapped_cols, i );
+ assert ( col != NULL );
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+ }
+
+ RowSetRelease ( rs, ctx );
+ }
+
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing mapped columns" );
+ VectorDoUntil ( & self -> mapped_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing mapped columns" );
+ VectorWhack ( & self -> mapped_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+static
+void TablePairCopyLargeColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy large columns */
+ uint32_t count = VectorLength ( & self -> large_cols );
+ if ( count != 0 )
+ {
+ RowSetIterator *rsi;
+ const bool is_mapped = false;
+ const bool is_large = true;
+ TRY ( rsi = TablePairGetRowSetIterator ( self, ctx, is_mapped, is_large ) )
+ {
+ STATUS ( 2, "copying '%s' large columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> large_cols, i );
+ assert ( col != NULL );
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+ }
+
+ RowSetRelease ( rs, ctx );
+ }
+
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing large columns" );
+ VectorDoUntil ( & self -> large_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing large columns" );
+ VectorWhack ( & self -> large_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+static
+void TablePairCopyLargeMappedColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy large mapped columns */
+ uint32_t count = VectorLength ( & self -> large_mapped_cols );
+ if ( count != 0 )
+ {
+ RowSetIterator *rsi;
+ const bool is_mapped = true;
+ const bool is_large = true;
+ TRY ( rsi = TablePairGetRowSetIterator ( self, ctx, is_mapped, is_large ) )
+ {
+ STATUS ( 2, "copying '%s' large mapped columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> large_mapped_cols, i );
+ assert ( col != NULL );
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+ }
+
+ RowSetRelease ( rs, ctx );
+ }
+
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing large mapped columns" );
+ VectorDoUntil ( & self -> large_mapped_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing large mapped columns" );
+ VectorWhack ( & self -> large_mapped_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+static
+void TablePairCopyNormalColumns ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ /* copy remaining columns */
+ uint32_t count = VectorLength ( & self -> normal_cols );
+ if ( count != 0 )
+ {
+ RowSetIterator *rsi;
+ const bool is_mapped = false;
+ const bool is_large = false;
+ TRY ( rsi = TablePairGetRowSetIterator ( self, ctx, is_mapped, is_large ) )
+ {
+ STATUS ( 2, "copying '%s' columns", self -> full_spec );
+
+ while ( ! FAILED () )
+ {
+ uint32_t i;
+
+ RowSet *rs;
+ ON_FAIL ( rs = RowSetIteratorNext ( rsi, ctx ) )
+ break;
+ if ( rs == NULL )
+ break;
+
+ for ( i = 0; i < count; ++ i )
+ {
+ ColumnPair *col = VectorGet ( & self -> normal_cols, i );
+ assert ( col != NULL );
+ ON_FAIL ( ColumnPairCopy ( col, ctx, rs ) )
+ break;
+ }
+
+ RowSetRelease ( rs, ctx );
+ }
+
+ RowSetIteratorRelease ( rsi, ctx );
+ }
+
+ /* commit columns */
+ if ( ! FAILED () )
+ {
+ STATUS ( 3, "committing columns" );
+ VectorDoUntil ( & self -> normal_cols, false, TablePairCommitColumnPair, ( void* ) ctx );
+ }
+
+ /* douse columns */
+ STATUS ( 3, "releasing columns" );
+ VectorWhack ( & self -> normal_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ }
+}
+
+void TablePairCopy ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ size_t in_use, quota;
+
+ /* copy columns */
+
+
+ ON_FAIL ( TablePairExplode ( self, ctx ) )
+ return;
+
+ STATUS ( 2, "copying table '%s'", self -> full_spec );
+
+ in_use = MemInUse ( ctx, & quota );
+ if ( ( quota + 1 ) != 0 )
+ STATUS ( 4, "MEMORY: %,zu bytes used out of %,zu total ( %u%% )", in_use, quota, ( uint32_t ) ( in_use * 100 ) / quota );
+ else
+ STATUS ( 4, "MEMORY: %,zu bytes used", in_use );
+
+ TRY ( TablePairPreCopy ( self, ctx ) )
+ {
+ TRY ( TablePairCopyStaticColumns ( self, ctx ) )
+ {
+ TRY ( TablePairCopyPresortColumns ( self, ctx ) )
+ {
+ TRY ( TablePairCopyMappedColumns ( self, ctx ) )
+ {
+ TRY ( TablePairCopyLargeColumns ( self, ctx ) )
+ {
+ TRY ( TablePairCopyLargeMappedColumns ( self, ctx ) )
+ {
+ TablePairCopyNormalColumns ( self, ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* cleanup */
+ if ( ! FAILED () )
+ TablePairPostCopy ( self, ctx );
+
+ in_use = MemInUse ( ctx, & quota );
+ if ( ( quota + 1 ) != 0 )
+ STATUS ( 4, "MEMORY: %,zu bytes used out of %,zu total ( %u%% )", in_use, quota, ( uint32_t ) ( in_use * 100 ) / quota );
+ else
+ STATUS ( 4, "MEMORY: %,zu bytes used", in_use );
+
+ STATUS ( 2, "finished with table '%s'", self -> full_spec );
+}
+
+
+/* Explode
+ * probably a bad name, but it is intended to mean
+ * register all enclosed columns
+ * and create a proper pair of KMetadata
+ */
+static
+MetaPair *TablePairExplodeMetaPair ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ MetaPair *meta = NULL;
+ const KMetadata *smeta;
+
+ rc = VTableOpenMetadataRead ( self -> stbl, & smeta );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableOpenMetadataRead failed on 'src.%s'", self -> full_spec );
+ else
+ {
+ KMetadata *dmeta;
+ rc = VTableOpenMetadataUpdate ( self -> dtbl, & dmeta );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableOpenMetadataUpdate failed on 'dst.%s'", self -> full_spec );
+ else
+ {
+ meta = MetaPairMake ( ctx, smeta, dmeta, self -> full_spec );
+
+ KMetadataRelease ( dmeta );
+ }
+
+ KMetadataRelease ( smeta );
+ }
+
+ return meta;
+}
+
+static
+ColumnPair *TablePairMatchColumnPair ( TablePair *self, const ctx_t *ctx, const char *name, bool required )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ KNamelist *types;
+ ColumnPair *col = NULL;
+
+ rc = VTableListWritableDatatypes ( self -> dtbl, name, & types );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableListWritableDatatypes failed listing 'dst.%s.%s' datatypes", self -> full_spec, name );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( types, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "KNamelistCount failed listing 'dst.%s.%s' datatypes", self -> full_spec, name );
+ else
+ {
+ const VCursor *scurs;
+ rc = VTableCreateCursorRead ( self -> stbl, & scurs );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableCreateCursorRead failed on 'src.%s'", self -> full_spec, name );
+ else
+ {
+ rc = VCursorPermitPostOpenAdd ( scurs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorPermitPostOpenAdd failed on 'src.%s'", self -> full_spec, name );
+ else
+ {
+ rc = VCursorOpen ( scurs );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorOpen failed with no contents on 'src.%s'", self -> full_spec, name );
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < count; ++ i )
+ {
+ uint32_t idx;
+ char colspec [ 256 ];
+
+ const char *td;
+ rc = KNamelistGet ( types, i, & td );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "KNamelistGet ( %u ) failed listing 'dst.%s.%s' datatypes", i, self -> full_spec, name );
+ break;
+ }
+
+ rc = string_printf ( colspec, sizeof colspec, NULL, "(%s)%s", td, name );
+ if ( rc != 0 )
+ {
+ ABORT ( rc, "failed creating colspec for 'dst.%s.%s'", self -> full_spec, name );
+ break;
+ }
+
+ rc = VCursorAddColumn ( scurs, & idx, "%s", colspec );
+ if ( rc == 0 )
+ {
+ ColumnReader *reader;
+ TRY ( reader = TablePairMakeColumnReader ( self, ctx, scurs, colspec, true ) )
+ {
+ ColumnWriter *writer;
+ TRY ( writer = TablePairMakeColumnWriter ( self, ctx, NULL, colspec ) )
+ {
+ uint32_t j;
+ bool large = false;
+ bool is_static = VTableHasStaticColumn ( self -> stbl, name );
+ if ( is_static )
+ {
+ if ( self -> nonstatic_col_names != NULL )
+ {
+ for ( j = 0; self -> nonstatic_col_names [ j ] != NULL; ++ j )
+ {
+ if ( strcmp ( name, self -> nonstatic_col_names [ j ] ) == 0 )
+ {
+ is_static = false;
+ break;
+ }
+ }
+ }
+ }
+ else if ( self -> large_col_names != NULL )
+ {
+ for ( j = 0; self -> large_col_names [ j ] != NULL; ++ j )
+ {
+ if ( strcmp ( name, self -> large_col_names [ j ] ) == 0 )
+ {
+ large = true;
+ break;
+ }
+ }
+ }
+
+ /* at this point, if the column is static, then avoid
+ any rigorous treatment and create an otherwise normal
+ column pair. may want to special case it for reporting */
+ col = is_static
+ ? TablePairMakeStaticColumnPair ( self, ctx, reader, writer, colspec )
+ : ( * self -> vt -> make_column_pair ) ( ( TBLPAIR_IMPL* ) self, ctx, reader, writer, colspec, large );
+
+ ColumnWriterRelease ( writer, ctx );
+ }
+
+ ColumnReaderRelease ( reader, ctx );
+ }
+ break;
+ }
+ }
+
+ if ( col == NULL && ! FAILED () )
+ ANNOTATE ( "column '%s' cannot be written", name );
+ }
+ }
+
+
+ VCursorRelease ( scurs );
+ }
+ }
+
+ KNamelistRelease ( types );
+ }
+
+ return col;
+}
+
+static
+void TablePairDefaultExplode ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ KNamelist *pnames;
+
+ /* look at the physical columns in source */
+ rc = VTableListPhysColumns ( self -> stbl, & pnames );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableListWritableColumns failed listing 'src.%s' physical columns", self -> full_spec );
+ else
+ {
+ KNamelist *dnames;
+
+ /* this gives us the columns that could potentially take input */
+ rc = VTableListSeededWritableColumns ( self -> dtbl, & dnames, pnames );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableListWritableColumns failed listing 'dst.%s' columns", self -> full_spec );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount ( dnames, & count );
+ if ( rc != 0 )
+ ERROR ( rc, "KNamelistCount failed listing 'dst.%s' columns", self -> full_spec );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; ! FAILED () && i < count; ++ i )
+ {
+ ColumnPair *col;
+
+ const char *name;
+ rc = KNamelistGet ( dnames, i, & name );
+ if ( rc != 0 )
+ {
+ ERROR ( rc, "KNamelistGet ( %u ) failed listing 'dst.%s' columns", i, self -> full_spec );
+ break;
+ }
+
+ /* filter out the column names that are specifically excluded */
+ if ( self -> exclude_col_names != NULL )
+ {
+ uint32_t j;
+ for ( j = 0; self -> exclude_col_names [ j ] != NULL; ++ j )
+ {
+ if ( strcmp ( name, self -> exclude_col_names [ j ] ) == 0 )
+ {
+ name = NULL;
+ break;
+ }
+ }
+ if ( name == NULL )
+ continue;
+ }
+
+ TRY ( col = TablePairMatchColumnPair ( self, ctx, name, true ) )
+ {
+ if ( col != NULL )
+ {
+ ON_FAIL ( TablePairAddColumnPair ( self, ctx, col ) )
+ {
+ ColumnPairRelease ( col, ctx );
+ }
+ }
+ }
+ }
+ }
+
+ KNamelistRelease ( dnames );
+ }
+
+ KNamelistRelease ( pnames );
+ }
+}
+
+void TablePairExplode ( TablePair *self, const ctx_t *ctx )
+{
+ if ( ! self -> exploded )
+ {
+ FUNC_ENTRY ( ctx );
+
+ STATUS ( 2, "exploding table '%s'", self -> full_spec );
+
+ /* first, ask subclass to perform explicit explode */
+ TRY ( ( * self -> vt -> explode ) ( self, ctx ) )
+ {
+ if ( self -> meta == NULL )
+ {
+ TRY ( self -> meta = TablePairExplodeMetaPair ( self, ctx ) )
+ {
+ MetaPairCopy ( self -> meta, ctx, self -> full_spec, self -> exclude_meta );
+ STATUS ( 3, "releasing metadata" );
+ MetaPairRelease ( self -> meta, ctx );
+ self -> meta = NULL;
+ }
+ }
+
+ if ( ! FAILED () )
+ {
+ /* next, perform default self-explode for all columns not excluded */
+ TRY ( TablePairDefaultExplode ( self, ctx ) )
+ {
+ /* now create metadata pair */
+ if ( self -> meta == NULL )
+ self -> meta = TablePairExplodeMetaPair ( self, ctx );
+ if ( ! FAILED () )
+ self -> exploded = true;
+ }
+ }
+ }
+ }
+}
+
+
+/* AddColumnPair
+ * called from implementations
+ */
+void TablePairAddColumnPair ( TablePair *self, const ctx_t *ctx, ColumnPair *col )
+{
+ if ( col != NULL )
+ {
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ Vector *v = & self -> normal_cols;
+
+ const char *col_type = "";
+ const char *col_size = "";
+
+ if ( col -> large )
+ {
+ col_size = "large ";
+ v = & self -> large_cols;
+ }
+
+ if ( col -> is_static )
+ {
+ col_type = "static ";
+ v = & self -> static_cols;
+ }
+ else if ( col -> presorted )
+ {
+ col_type = "presorted ";
+ v = & self -> presort_cols;
+ }
+ else if ( col -> is_mapped )
+ {
+ col_type = "mapped ";
+ v = col -> large ? & self -> large_mapped_cols : & self -> mapped_cols;
+ }
+
+ STATUS ( 4, "adding %s%scolumn pair '%s'", col_size, col_type, col -> full_spec );
+ rc = VectorAppend ( v, NULL, ( const void* ) col );
+ if ( rc != 0 )
+ SYSTEM_ERROR ( rc, "failed to add column pair '%s'", col -> full_spec );
+ else
+ {
+ int64_t first;
+ uint64_t count;
+
+ TRY ( count = ColumnReaderIdRange ( col -> reader, ctx, & first ) )
+ {
+ int64_t last_excl = first + count;
+ if ( first < self -> first_id )
+ self -> first_id = first;
+ /* Static columns may have incorrect range in legacy data */
+ if ( last_excl > self -> last_excl && !col->is_static)
+ self -> last_excl = last_excl;
+ }
+ }
+ }
+}
+
+
+/* Init
+ */
+void TablePairInit ( TablePair *self, const ctx_t *ctx, const TablePair_vt *vt,
+ const VTable *src, VTable *dst, const char *name, const char *opt_full_spec, bool reorder )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ memset ( self, 0, sizeof * self );
+ self -> vt = vt;
+
+ VectorInit ( & self -> static_cols, 0, 32 );
+ VectorInit ( & self -> presort_cols, 0, 4 );
+ VectorInit ( & self -> large_cols, 0, 32 );
+ VectorInit ( & self -> mapped_cols, 0, 32 );
+ VectorInit ( & self -> large_mapped_cols, 0, 32 );
+ VectorInit ( & self -> normal_cols, 0, 32 );
+
+ if ( opt_full_spec == NULL )
+ opt_full_spec = "";
+
+ rc = VTableAddRef ( self -> stbl = src );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate tbl 'src.%s%s%s'", opt_full_spec, opt_full_spec [ 0 ] ? "." : "", name );
+ else
+ {
+ rc = VTableAddRef ( self -> dtbl = dst );
+ if ( rc != 0 )
+ ERROR ( rc, "failed to duplicate tbl 'dst.%s%s%s'", opt_full_spec, opt_full_spec [ 0 ] ? "." : "", name );
+ else
+ {
+ char *full_spec;
+
+ self -> full_spec_size = string_size ( opt_full_spec ) + string_size ( name );
+ if ( opt_full_spec [ 0 ] != 0 )
+ ++ self -> full_spec_size;
+
+ TRY ( full_spec = MemAlloc ( ctx, self -> full_spec_size + 1, false ) )
+ {
+ if ( opt_full_spec [ 0 ] != 0 )
+ rc = string_printf ( full_spec, self -> full_spec_size + 1, NULL, "%s.%s", opt_full_spec, name );
+ else
+ strcpy ( full_spec, name );
+ if ( rc != 0 )
+ ABORT ( rc, "miscalculated string size" );
+ else
+ {
+ const Tool *tp = ctx -> caps -> tool;
+
+ self -> full_spec = full_spec;
+ self -> name = full_spec;
+ if ( opt_full_spec [ 0 ] != 0 )
+ self -> name += string_size ( opt_full_spec ) + 1;
+
+ /* start with an invalid range */
+ self -> first_id = ( int64_t ) ( ~ ( uint64_t ) 0 >> 1 );
+ self -> last_excl = - self -> first_id;
+
+ /* row-set id ranges */
+ self -> max_idx_ids = tp -> max_idx_ids;
+ self -> min_idx_ids = tp -> min_idx_ids;
+
+ /* record reordering */
+ self -> reorder = reorder;
+
+ KRefcountInit ( & self -> refcount, 1, "TablePair", "init", name );
+ return;
+ }
+ }
+
+ VTableRelease ( self -> dtbl );
+ self -> dtbl = NULL;
+ }
+
+ VTableRelease ( self -> stbl );
+ self -> stbl = NULL;
+ }
+}
+
+/* Destroy
+ * destroys superclass items
+ */
+void TablePairDestroy ( TablePair *self, const ctx_t *ctx )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+
+ VectorWhack ( & self -> static_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ VectorWhack ( & self -> presort_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ VectorWhack ( & self -> large_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ VectorWhack ( & self -> mapped_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ VectorWhack ( & self -> large_mapped_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+ VectorWhack ( & self -> normal_cols, TablePairReleaseColumnPair, ( void* ) ctx );
+
+ MetaPairRelease ( self -> meta, ctx );
+
+ rc = VTableReindex ( self -> dtbl );
+ if ( rc != 0 )
+ WARN ( "VTableReindex failed on 'dst.%s'", self -> full_spec );
+ rc = VTableRelease ( self -> dtbl );
+ if ( rc != 0 )
+ WARN ( "VTableRelease failed on 'dst.%s'", self -> full_spec );
+ VTableRelease ( self -> stbl );
+
+ MemFree ( ctx, ( void* ) self -> full_spec, self -> full_spec_size + 1 );
+
+ memset ( self, 0, sizeof * self );
+}
diff --git a/tools/sra-sort/tbl-pair.h b/tools/sra-sort/tbl-pair.h
new file mode 100644
index 0000000..4ee383e
--- /dev/null
+++ b/tools/sra-sort/tbl-pair.h
@@ -0,0 +1,209 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_tbl_pair_
+#define _h_sra_sort_tbl_pair_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_refcount_
+#include <klib/refcount.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VTable;
+struct DbPair;
+struct ColumnReader;
+struct ColumnWriter;
+struct ColumnPair;
+struct MetaPair;
+struct RowSetIterator;
+
+
+/*--------------------------------------------------------------------------
+ * TablePair
+ * interface to pairing of source and destination tables
+ */
+typedef struct TablePair_vt TablePair_vt;
+
+typedef struct TablePair TablePair;
+struct TablePair
+{
+ /* table id range */
+ int64_t first_id, last_excl;
+
+ /* polymorphic */
+ const TablePair_vt *vt;
+
+ /* the pair of VTables */
+ struct VTable const *stbl;
+ struct VTable *dtbl;
+
+ /* the pair of KMetadata */
+ struct MetaPair *meta;
+
+ /* the ColumnPairs */
+ Vector static_cols;
+ Vector presort_cols;
+ Vector large_cols;
+ Vector mapped_cols;
+ Vector large_mapped_cols;
+ Vector normal_cols;
+
+ /* filters */
+ const char **exclude_meta;
+ const char **exclude_col_names;
+ const char **mapped_col_names;
+ const char **nonstatic_col_names;
+ const char **large_col_names;
+
+ /* row-set id ranges */
+ size_t max_idx_ids;
+ size_t min_idx_ids;
+
+ /* simple table name */
+ const char *name;
+
+ /* full table spec */
+ size_t full_spec_size;
+ const char *full_spec;
+
+ /* reference counting */
+ KRefcount refcount;
+
+ /* true if table will be reordered */
+ bool reorder;
+
+ /* true if already exploded */
+ bool exploded;
+
+ uint8_t align [ 2 ];
+};
+
+#ifndef TBLPAIR_IMPL
+#define TBLPAIR_IMPL TablePair
+#endif
+
+struct TablePair_vt
+{
+ void ( * whack ) ( TBLPAIR_IMPL *self, const ctx_t *ctx );
+ void ( * pre_explode ) ( TBLPAIR_IMPL *self, const ctx_t *ctx );
+ void ( * explode ) ( TBLPAIR_IMPL *self, const ctx_t *ctx );
+ struct ColumnPair* ( *make_column_pair ) ( TBLPAIR_IMPL *self, const ctx_t *ctx,
+ struct ColumnReader *reader, struct ColumnWriter *writer, const char *colspec, bool large );
+ void ( * pre_copy ) ( TBLPAIR_IMPL *self, const ctx_t *ctx );
+ void ( * post_copy ) ( TBLPAIR_IMPL *self, const ctx_t *ctx );
+ struct RowSetIterator* ( *get_rowset_iter ) ( TBLPAIR_IMPL *self,
+ const ctx_t *ctx, bool mapped, bool large );
+};
+
+
+/* Make
+ * make a standard table pair from existing VTable objects
+ */
+TablePair *TablePairMake ( const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst,
+ const char *name, const char *opt_full_spec, bool reorder );
+
+TablePair *DbPairMakeStdTblPair ( struct DbPair *self, const ctx_t *ctx,
+ struct VTable const *src, struct VTable *dst, const char *name, bool reorder );
+
+
+/* Release
+ * called by table at end of copy
+ */
+void TablePairRelease ( TablePair *self, const ctx_t *ctx );
+
+/* Duplicate
+ */
+TablePair *TablePairDuplicate ( TablePair *self, const ctx_t *ctx );
+
+
+/* Copy
+ * copy from source to destination table
+ */
+void TablePairCopy ( TablePair *self, const ctx_t *ctx );
+
+
+/* PreExplode
+ * perform explosion before overall coopy
+ */
+#define TablePairPreExplode( self, ctx ) \
+ POLY_DISPATCH_VOID ( pre_explode, self, TBLPAIR_IMPL, ctx )
+
+
+/* Explode
+ * probably a bad name, but it is intended to mean
+ * register all enclosed columns
+ * and create a proper pair of KMetadata
+ */
+void TablePairExplode ( TablePair *self, const ctx_t *ctx );
+
+
+/* AddColumnPair
+ * called from implementations
+ */
+void TablePairAddColumnPair ( TablePair *self, const ctx_t *ctx, struct ColumnPair *col );
+
+
+/* PreCopy
+ * PostCopy
+ * give table a chance to prepare and cleanup
+ */
+#define TablePairPreCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( pre_copy, self, TBLPAIR_IMPL, ctx )
+#define TablePairPostCopy( self, ctx ) \
+ POLY_DISPATCH_VOID ( post_copy, self, TBLPAIR_IMPL, ctx )
+
+
+/* GetRowSetIterator
+ * returns an iterator for copying
+ */
+#define TablePairGetRowSetIterator( self, ctx, mapped, large ) \
+ POLY_DISPATCH_PTR ( get_rowset_iter, self, TBLPAIR_IMPL, ctx, mapped, large )
+
+
+/* Init
+ */
+void TablePairInit ( TablePair *self, const ctx_t *ctx, const TablePair_vt *vt,
+ struct VTable const *src, struct VTable *dst,
+ const char *name, const char *opt_full_spec, bool reorder );
+
+/* Destroy
+ */
+void TablePairDestroy ( TablePair *self, const ctx_t *ctx );
+
+
+#endif /* _h_sra_sort_tbl_pair_ */
diff --git a/tools/sra-sort/xcheck-ref-align.c b/tools/sra-sort/xcheck-ref-align.c
new file mode 100644
index 0000000..4a0288b
--- /dev/null
+++ b/tools/sra-sort/xcheck-ref-align.c
@@ -0,0 +1,411 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "caps.h"
+#include "ctx.h"
+#include "mem.h"
+#include "except.h"
+#include "status.h"
+
+#include <kapp/main.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kproc/thread.h>
+#include <klib/rc.h>
+
+#include <string.h>
+
+#if ! _DEBUGGING
+#define USE_BGTHREAD 1
+#endif
+
+FILE_ENTRY ( xcheck-ref-align );
+
+
+/*--------------------------------------------------------------------------
+ * TestReferenceCell
+ * properly sorted tables will allow both columns to be walked.
+ * each row of the REFERENCE table column MUST contain zero or more
+ * sequential integers, and the first integer MUST continue the sequence
+ * established by previous rows. therefore, the row will be fully specified
+ * by a start and stop id pair.
+ */
+static
+int64_t TestReferenceCell ( const ctx_t *ctx,
+ const VCursor *ref_curs, uint32_t align_ids_idx,
+ const char *align_name, int64_t ref_row_id, int64_t excl_ref_last_idx )
+{
+ FUNC_ENTRY ( ctx );
+
+ const int64_t *cell;
+ uint32_t elem_bits, boff, row_len;
+
+ rc_t rc = VCursorCellDataDirect ( ref_curs, ref_row_id, align_ids_idx,
+ & elem_bits, ( const void** ) & cell, & boff, & row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorCellDataDirect - failed to read row %ld from REFERENCE cursor", ref_row_id );
+ else if ( elem_bits != sizeof * cell * 8 )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcSize, rcIncorrect );
+ ERROR ( rc, "VCursorCellDataDirect - elem_bits of %u reading row %ld from REFERENCE cursor", elem_bits, ref_row_id );
+ }
+ else if ( boff != 0 )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcOffset, rcIncorrect );
+ ERROR ( rc, "VCursorCellDataDirect - bit offset of %u reading row %ld from REFERENCE cursor", boff, ref_row_id );
+ }
+ else
+ {
+ uint32_t i;
+ for ( i = 0; i < row_len; ++ i )
+ {
+ if ( cell [ i ] != excl_ref_last_idx + i )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcIncorrect );
+ ERROR ( rc, "REFERENCE.%s_IDS.%ld: expected id %ld but found %ld",
+ align_name, ref_row_id, excl_ref_last_idx + i, cell [ i ] );
+ break;
+ }
+ }
+
+ excl_ref_last_idx += row_len;
+ }
+
+ return excl_ref_last_idx;
+}
+
+static
+void TestAlignCell ( const ctx_t *ctx,
+ const VCursor *align_curs, uint32_t ref_id_idx,
+ const char *align_name, int64_t align_row_id, int64_t ref_row_id )
+{
+ FUNC_ENTRY ( ctx );
+
+ const int64_t *cell;
+ uint32_t elem_bits, boff, row_len;
+
+
+ rc_t rc = VCursorCellDataDirect ( align_curs, align_row_id, ref_id_idx,
+ & elem_bits, ( const void** ) & cell, & boff, & row_len );
+ if ( rc != 0 )
+ ERROR ( rc, "VCursorCellDataDirect - failed to read row %ld from %s cursor", align_row_id, align_name );
+ else if ( elem_bits != sizeof * cell * 8 )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcSize, rcIncorrect );
+ ERROR ( rc, "VCursorCellDataDirect - elem_bits of %u reading row %ld from %s cursor", elem_bits, align_row_id, align_name );
+ }
+ else if ( boff != 0 )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcOffset, rcIncorrect );
+ ERROR ( rc, "VCursorCellDataDirect - bit offset of %u reading row %ld from %s cursor", boff, align_row_id, align_name );
+ }
+ else if ( row_len != 1 )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcRange, rcIncorrect );
+ ERROR ( rc, "VCursorCellDataDirect - row_len of %u reading row %ld from %s cursor", row_len, align_row_id, align_name );
+ }
+ else if ( * cell != ref_row_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcIncorrect );
+ ERROR ( rc, "%s.REF_ID.%ld: expected id %ld but found %ld",
+ align_name, align_row_id, ref_row_id, cell [ 0 ] );
+ }
+}
+
+/*--------------------------------------------------------------------------
+ * CrossCheckRefAlignCols
+ * performs the cross-check
+ */
+static
+void CrossCheckRefAlignCols ( const ctx_t *ctx,
+ const VCursor *ref_curs, uint32_t align_ids_idx,
+ const VCursor *align_curs, uint32_t ref_id_idx, const char *align_name )
+{
+ FUNC_ENTRY ( ctx );
+
+ int64_t ref_row_id, excl_ref_last_id;
+ rc_t rc = VCursorIdRange ( ref_curs, 0, & ref_row_id, ( uint64_t* ) & excl_ref_last_id );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorIdRange - failed to establish row range on REFERENCE cursor" );
+ else
+ {
+ int64_t align_row_id, excl_align_last_id;
+
+ excl_ref_last_id += ref_row_id;
+
+ rc = VCursorIdRange ( align_curs, 0, & align_row_id, ( uint64_t* ) & excl_align_last_id );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorIdRange - failed to establish row range on %s cursor", align_name );
+ else
+ {
+ int64_t excl_last_align_idx;
+
+ excl_align_last_id += align_row_id;
+
+ for ( excl_last_align_idx = 1; ref_row_id < excl_ref_last_id; ++ ref_row_id )
+ {
+ int64_t first_align_idx = excl_last_align_idx;
+
+ /* rule for bailing out */
+ rc = Quitting ();
+ if ( rc != 0 || FAILED () )
+ break;
+
+ /* the REFERENCE id cell should be filled purely with sequential ids */
+ TRY ( excl_last_align_idx = TestReferenceCell ( ctx, ref_curs, align_ids_idx,
+ align_name, ref_row_id, excl_last_align_idx ) )
+ {
+ /* the ids must be within the range of the alignment table */
+ if ( excl_last_align_idx > excl_align_last_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcExcessive );
+ ERROR ( rc, "REFERENCE.%s_IDS.%ld: references non-existant rows ( %ld .. %ld : max %ld )",
+ align_name, ref_row_id, first_align_idx, excl_last_align_idx, excl_align_last_id );
+ break;
+ }
+
+ /* this is more of a permanent assert */
+ if ( first_align_idx != align_row_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcId, rcIncorrect );
+ ERROR ( rc, "REFERENCE.%s_IDS.%ld: expected id %ld but found %ld",
+ align_name, ref_row_id, first_align_idx, align_row_id );
+ break;
+ }
+
+ /* each of the rows in alignment table must point back
+ to the same row in the REFERENCE table */
+ for ( ; align_row_id < excl_last_align_idx; ++ align_row_id )
+ {
+ ON_FAIL ( TestAlignCell ( ctx, align_curs, ref_id_idx,
+ align_name, align_row_id, ref_row_id ) )
+ break;
+ }
+ }
+ }
+
+ /* at this point, we must have seen every record */
+ if ( ! FAILED () )
+ {
+ if ( ref_row_id != excl_ref_last_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcRange, rcIncomplete );
+ ERROR ( rc, "REFERENCE.%s_IDS: scan stopped on row %ld of %ld",
+ align_name, ref_row_id, excl_ref_last_id );
+ }
+ if ( align_row_id != excl_align_last_id )
+ {
+ rc = RC ( rcExe, rcIndex, rcValidating, rcRange, rcIncomplete );
+ ERROR ( rc, "%s.REF_ID: scan stopped on row %ld of %ld",
+ align_name, align_row_id, excl_align_last_id );
+ }
+ }
+ }
+ }
+}
+
+
+
+/*--------------------------------------------------------------------------
+ * CrossCheckRefAlignCurs
+ * adds columns and opens cursors
+ */
+static
+void CrossCheckRefAlignCurs ( const ctx_t *ctx,
+ const VCursor *ref_curs, const VCursor *align_curs, const char *align_name )
+{
+ FUNC_ENTRY ( ctx );
+
+ uint32_t align_ids_idx;
+ rc_t rc = VCursorAddColumn ( ref_curs, & align_ids_idx, "%s_IDS", align_name );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorAddColumn - failed to add column '%s_IDS' to REFERENCE cursor", align_name );
+ else
+ {
+ uint32_t ref_id_idx;
+ rc = VCursorAddColumn ( align_curs, & ref_id_idx, "REF_ID" );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorAddColumn - failed to add column 'REF_ID' to %s cursor", align_name );
+ else
+ {
+ rc = VCursorOpen ( ref_curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpen - failed to open cursor on REFERENCE table" );
+ else
+ {
+ rc = VCursorOpen ( align_curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorOpen - failed to open cursor on %s table", align_name );
+ else
+ {
+ rc = VCursorSetRowId ( ref_curs, 1 );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorSetRowId - failed to set row-id on REFERENCE cursor" );
+ else
+ {
+ rc = VCursorSetRowId ( align_curs, 1 );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorSetRowId - failed to set row-id on %s cursor", align_name );
+ else
+ {
+ CrossCheckRefAlignCols ( ctx, ref_curs, align_ids_idx, align_curs, ref_id_idx, align_name );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/*--------------------------------------------------------------------------
+ * CrossCheckRefAlignTbl
+ * checks REFERENCE.<name>_IDS for properly sorted form
+ * runs a cross-check of REFERENCE.<name>_IDS against <name>.REF_ID
+ */
+static
+void CrossCheckRefAlignTblInt ( const ctx_t *ctx,
+ const VTable *ref_tbl, const VTable *align_tbl, const char *align_name )
+{
+ FUNC_ENTRY ( ctx );
+
+ rc_t rc;
+ const VCursor *ref_curs;
+
+ rc = VTableCreateCursorRead ( ref_tbl, & ref_curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VTableCreateCursorRead - failed to open cursor on REFERENCE table" );
+ else
+ {
+ const VCursor *align_curs;
+ rc = VTableCreateCursorRead ( align_tbl, & align_curs );
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VTableCreateCursorRead - failed to open cursor on %s table", align_name );
+ else
+ {
+ rc = VCursorLinkedCursorSet(align_curs,"REFERENCE",ref_curs);
+ if ( rc != 0 )
+ INTERNAL_ERROR ( rc, "VCursorLinkedCursorSet - failed to link cursor on REFERENCE table" );
+ else
+ {
+ CrossCheckRefAlignCurs ( ctx, ref_curs, align_curs, align_name );
+ }
+
+ VCursorRelease ( align_curs );
+ }
+
+ VCursorRelease ( ref_curs );
+ }
+}
+
+#if USE_BGTHREAD
+
+typedef struct CrossCheckRefAlignTblData CrossCheckRefAlignTblData;
+struct CrossCheckRefAlignTblData
+{
+ Caps caps;
+ const VTable *ref_tbl, *align_tbl;
+ char align_name [ 1 ];
+};
+
+static
+rc_t CC CrossCheckRefAlignTblRun ( const KThread *self, void *data )
+{
+ CrossCheckRefAlignTblData *pb = data;
+
+ DECLARE_CTX_INFO ();
+ ctx_t thread_ctx = { & pb -> caps, NULL, & ctx_info };
+ const ctx_t *ctx = & thread_ctx;
+
+ STATUS ( 2, "running consistency-check on background thread" );
+
+ CrossCheckRefAlignTblInt ( ctx, pb -> ref_tbl, pb -> align_tbl, pb -> align_name );
+
+ STATUS ( 2, "finished consistency-check on background thread" );
+
+ VTableRelease ( pb -> align_tbl );
+ VTableRelease ( pb -> ref_tbl );
+ CapsWhack ( & pb -> caps, ctx );
+
+ return ctx -> rc;
+}
+
+#endif
+
+void CrossCheckRefAlignTbl ( const ctx_t *ctx,
+ const VTable *ref_tbl, const VTable *align_tbl, const char *align_name )
+{
+ FUNC_ENTRY ( ctx );
+
+#if USE_BGTHREAD
+ size_t name_len;
+ CrossCheckRefAlignTblData *pb;
+#endif
+
+ STATUS ( 2, "consistency-check on join indices between REFERENCE and %s tables", align_name );
+
+#if USE_BGTHREAD
+ name_len = strlen ( align_name );
+ TRY ( pb = MemAlloc ( ctx, sizeof * pb + name_len, false ) )
+ {
+ TRY ( CapsInit ( & pb -> caps, ctx ) )
+ {
+ rc_t rc = VTableAddRef ( pb -> ref_tbl = ref_tbl );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableAddRef failed on REFERENCE table" );
+ else
+ {
+ rc = VTableAddRef ( pb -> align_tbl = align_tbl );
+ if ( rc != 0 )
+ ERROR ( rc, "VTableAddRef failed on %s table", align_name );
+ else
+ {
+ KThread *t;
+
+ strcpy ( pb -> align_name, align_name );
+
+ rc = KThreadMake ( & t, CrossCheckRefAlignTblRun, pb );
+ if ( rc == 0 )
+ {
+ return;
+ }
+
+ VTableRelease ( pb -> align_tbl );
+ }
+
+ VTableRelease ( pb -> ref_tbl );
+ }
+
+ CapsWhack ( & pb -> caps, ctx );
+ }
+
+ MemFree ( ctx, pb, sizeof * pb + name_len );
+ }
+#else
+ CrossCheckRefAlignTblInt ( ctx, ref_tbl, align_tbl, align_name );
+#endif
+}
diff --git a/tools/sra-sort/xcheck.h b/tools/sra-sort/xcheck.h
new file mode 100644
index 0000000..adf44c5
--- /dev/null
+++ b/tools/sra-sort/xcheck.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_sra_sort_xcheck_
+#define _h_sra_sort_xcheck_
+
+#ifndef _h_sra_sort_defs_
+#include "sort-defs.h"
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct VTable;
+
+
+/*--------------------------------------------------------------------------
+ * CrossCheckRefAlignTbl
+ * checks REFERENCE.<name>_IDS for properly sorted form
+ * runs a cross-check of REFERENCE.<name>_IDS against <name>.REF_ID
+ */
+void CrossCheckRefAlignTbl ( const ctx_t *ctx,
+ struct VTable const *ref_tbl, struct VTable const *align_tbl, const char *align_name );
+
+#endif
diff --git a/tools/sra-stat/Makefile b/tools/sra-stat/Makefile
new file mode 100644
index 0000000..65cceea
--- /dev/null
+++ b/tools/sra-stat/Makefile
@@ -0,0 +1,80 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra-stat
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ sra-stat \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# sra-stat
+# sra statistics
+#
+SRASTAT_SRC = \
+ sra \
+ sra-stat \
+
+SRASTAT_OBJ = \
+ $(addsuffix .$(OBJX),$(SRASTAT_SRC))
+
+SRASTAT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -sload \
+ -lm \
+
+$(BINDIR)/sra-stat: $(SRASTAT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRASTAT_LIB)
+
diff --git a/tools/sra-stat/sra-stat.c b/tools/sra-stat/sra-stat.c
new file mode 100644
index 0000000..5ff70d6
--- /dev/null
+++ b/tools/sra-stat/sra-stat.c
@@ -0,0 +1,3634 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "sra-stat.h" /* VTableMakeSingleFileArchive_ */
+
+#include <insdc/sra.h> /* SRA_READ_TYPE_BIOLOGICAL */
+
+#include <kapp/log-xml.h> /* XMLLogger */
+#include <kapp/main.h>
+#include <kapp/progressbar.h> /* KLoadProgressbar */
+
+#include <kdb/database.h> /* KDatabase */
+#include <kdb/kdb-priv.h>
+#include <kdb/manager.h> /* KDBManager */
+#include <kdb/meta.h> /* KMetadata */
+#include <kdb/namelist.h> /* KMDataNodeListChild */
+#include <kdb/table.h>
+
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFile */
+
+#include <klib/checksum.h>
+#include <klib/container.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h> /* LOGERR */
+#include <klib/namelist.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/sort.h> /* ksort */
+
+#include <sra/sraschema.h> /* VDBManagerMakeSRASchema */
+
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/database.h> /* VDatabaseRelease */
+#include <vdb/dependencies.h> /* VDBDependencies */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/schema.h> /* VSchema */
+#include <vdb/table.h> /* VTableRelease */
+#include <vdb/vdb-priv.h> /* VDBManagerGetKDBManagerRead */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+#include <vfs/resolver.h> /* VResolver */
+
+#include <os-native.h> /* strtok_r on Windows */
+
+#include <assert.h>
+#include <math.h> /* sqrt */
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/* #include <stdio.h> */ /* stderr */
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt, rc, \
+ "$(name): $(msg)", "name=%s,msg=%s", name, msg)))
+
+#define DISP_RC_Read(rc, name, spot, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt, rc, "column $(name), spot $(spot): $(msg)", \
+ "name=%s,spot=%lu,msg=%s", name, spot, msg)))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+#define MAX_NREADS 2*1024
+
+#define DEFAULT_CURSOR_CAPACITY (1024*1024*1024UL)
+
+/********** _XMLLogger_Encode : copied from kapp/log-xml.c (-lload) ***********/
+
+static
+rc_t CC _XMLLogger_Encode(const char* src,
+ char* aDst, size_t dst_sz, size_t *num_writ)
+{
+ rc_t rc = 0;
+ size_t bytes;
+ const char* p;
+ char* dst = aDst;
+
+ assert(src != NULL && num_writ != NULL);
+
+ *num_writ = 0;
+ if( *src == '\0' ) {
+ *dst = *src;
+ } else {
+ do {
+ switch(*src) {
+ case '\'':
+ bytes = 6;
+ p = "'";
+ break;
+ case '"':
+ bytes = 6;
+ p = """;
+ break;
+ case '&':
+ bytes = 5;
+ p = "&";
+ break;
+ case '<':
+ bytes = 4;
+ p = "<";
+ break;
+ case '>':
+ bytes = 4;
+ p = ">";
+ break;
+ default:
+ bytes = 1;
+ p = src;
+ break;
+ }
+ if( (*num_writ + bytes) > dst_sz ) {
+ rc = RC(rcExe, rcLog, rcEncoding, rcBuffer, rcInsufficient);
+ } else {
+ memmove(dst, p, bytes);
+ *num_writ = *num_writ + bytes;
+ dst += bytes;
+ }
+ } while(rc == 0 && *++src != '\0');
+ if (rc == 0 && *src == '\0' && ((*num_writ + bytes) <= dst_sz)) {
+ *dst = *src;
+ }
+ }
+ return rc;
+}
+
+/*********** XMLLogger_Encode : copied from kapp/log-xml.c (-lload) ***********/
+
+typedef struct BAM_HEADER_RG { /* @RG: Read group. */
+ char* ID; /* Read group identifier. */
+ char* LB; /* Library. */
+ char* SM; /* Sample. */
+} BAM_HEADER_RG;
+static
+rc_t BAM_HEADER_RG_copy(BAM_HEADER_RG* dest, const BAM_HEADER_RG* src)
+{
+ assert(dest && !dest->ID && !dest->LB && !dest->SM
+ && src && src ->ID && src ->LB && src ->SM);
+
+ dest->ID = strdup(src->ID);
+ dest->LB = strdup(src->LB);
+ dest->SM = strdup(src->SM);
+
+ if (!dest->ID || !dest->LB || !dest->SM) {
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ return 0;
+}
+
+static void BAM_HEADER_RG_free(BAM_HEADER_RG* rg) {
+ assert(rg);
+
+ free(rg->ID);
+ free(rg->LB);
+ free(rg->SM);
+
+ rg->ID = rg->LB = rg->SM = NULL;
+}
+
+static void BAM_HEADER_RG_print_xml(const BAM_HEADER_RG* rg) {
+ rc_t rc = 0;
+ char library[1024] = "";
+ char sample[1024] = "";
+ char* l = library;
+ char* s = sample;
+ size_t num_writ = 0;
+
+ assert(rg);
+
+ if (rg->LB) {
+ rc = _XMLLogger_Encode(rg->LB, library, sizeof library, &num_writ);
+ if (rc != 0) {
+ l = rg->LB;
+ PLOGMSG(klogWarn, (klogWarn, "Library value is too long: "
+ "XML-safe conversion was disabled for @RG\tID:$(ID)\tLB:$(LB)"
+ "ID=%s,LB=%s", rg->ID, rg->LB));
+ }
+
+ OUTMSG((" library=\"%s\"", l ? l : ""));
+ }
+
+ if (rg->SM) {
+ rc = _XMLLogger_Encode(rg->SM, sample, sizeof sample, &num_writ);
+ if (rc != 0) {
+ s = rg->SM;
+ PLOGMSG(klogWarn, (klogWarn, "Sample value is too long: "
+ "XML-safe conversion was disabled for @RG\tID:$(ID)\tSM:$(SM)"
+ "ID=%s,SM=%s", rg->ID, rg->SM));
+ }
+
+ OUTMSG((" sample=\"%s\"" , s ? s : ""));
+ }
+}
+
+typedef struct SraStats {
+ BSTNode n;
+ char spot_group[1024]; /* SPOT_GROUP Column */
+ uint64_t spot_count; /*** spot count ***/
+ uint64_t spot_count_mates; /*** spots with mates ***/
+ uint64_t bio_len; /** biological len (BIO_BASE_COUNT) **/
+ uint64_t bio_len_mates; /** biological len when mates are present**/
+ uint64_t total_len; /** total len (BASE_COUNT) **/
+ uint64_t bad_spot_count; /** number of spots flagged with rd_filter=2 **/
+ uint64_t bad_bio_len; /** biological length of bad spots ***/
+ uint64_t filtered_spot_count; /* number of spots flagged with rd_filter=2 */
+ uint64_t filtered_bio_len; /** biological length of filtered spots **/
+ uint64_t total_cmp_len; /* CMP_READ : compressed */
+ BAM_HEADER_RG BAM_HEADER;
+} SraStats;
+typedef struct Statistics { /* READ_LEN columnn */
+ /* average READ_LEN value */
+ /* READ_LEN standard deviation. Is calculated just when requested. */
+ /* running (continuous) standard deviation */
+
+ int64_t n; /* number of values */
+ double a; /* the mean value */
+ double q; /* Qi = Q[i-1] + (Xi - A[i-1])(Xi - Ai) */
+
+ bool variable; /* variable or fixed value */
+ double prev_val;
+} Statistics;
+typedef struct Statistics2 {
+ int n;
+ double average;
+ double diff_sq_sum;
+} Statistics2;
+static
+void Statistics2Init(Statistics2* self, double sum, int64_t count)
+{
+ assert(self);
+
+ if (count) {
+ self->average = sum / count;
+ }
+}
+
+static void Statistics2Add(Statistics2* self, double value) {
+ double diff = 0;
+
+ assert(self);
+
+ ++self->n;
+
+ diff = value - self->average;
+ self->diff_sq_sum += diff * diff;
+}
+
+static void Statistics2Print(const Statistics2* selfs,
+ uint32_t nreads, const char* indent,
+
+ /* the same as in <Statistics: just to make <Statistics> and <Statistics2>
+ look the same */
+ uint64_t spot_count)
+{
+ int i = 0;
+
+ if (nreads) {
+ assert(selfs && indent);
+ }
+
+ OUTMSG(("%s<Statistics2 nreads=\"%u\" nspots=\"%lu\">\n",
+ indent, nreads, spot_count));
+
+ for (i = 0; i < nreads; ++i) {
+ double dev = 0;
+ const Statistics2* stats = selfs + i;
+ double avr = stats->average;
+ if (stats->n > 0) {
+ dev = sqrt(stats->diff_sq_sum / stats->n);
+ }
+
+ OUTMSG(("%s "
+ "<Read index=\"%d\" count=\"%ld\" average=\"%f\" stdev=\"%f\"/>\n",
+ indent, i, stats->n, avr, dev));
+ }
+
+ OUTMSG(("%s</Statistics2>\n", indent));
+}
+
+static bool columnUndefined(rc_t rc) {
+ return rc == SILENT_RC(rcVDB, rcCursor, rcOpening , rcColumn, rcUndefined)
+ || rc == SILENT_RC(rcVDB, rcCursor, rcUpdating, rcColumn, rcNotFound );
+}
+
+typedef struct {
+ uint64_t cnt[5];
+ bool CS_NATIVE;
+ const VCursor *curs;
+ uint32_t idx;
+
+ bool finalized;
+} Bases;
+
+static rc_t BasesInit(Bases *self, const VTable *vtbl) {
+ rc_t rc = 0;
+
+ assert(self);
+ memset(self, 0, sizeof *self);
+
+ if (rc == 0) {
+ const char name[] = "CS_NATIVE";
+ const void *base = NULL;
+
+ const VCursor *curs = NULL;
+ uint32_t idx = 0;
+
+ self->CS_NATIVE = true;
+
+ rc = VTableCreateCachedCursorRead(vtbl, &curs, DEFAULT_CURSOR_CAPACITY);
+ DISP_RC(rc, "Cannot VTableCreateCachedCursorRead");
+
+ if (rc == 0) {
+ rc = VCursorPermitPostOpenAdd(curs);
+ DISP_RC(rc, "Cannot VCursorPermitPostOpenAdd");
+ }
+
+ if (rc == 0) {
+ rc = VCursorOpen(curs);
+ DISP_RC(rc, "Cannot VCursorOpen");
+ }
+
+ if (rc == 0) {
+ rc = VCursorAddColumn(curs, &idx, "%s", name);
+ if (rc != 0) {
+ if (columnUndefined(rc)) {
+ self->CS_NATIVE = false;
+ rc = 0;
+ }
+ else {
+ DISP_RC(rc, "Cannot VCursorAddColumn(CS_NATIVE)");
+ }
+ }
+ else {
+ bitsz_t boff = ~0;
+ bitsz_t row_bits = ~0;
+
+ uint32_t elem_bits = 0, elem_off = 0, elem_cnt = 0;
+ rc = VCursorCellDataDirect(curs, 1, idx,
+ &elem_bits, &base, &elem_off, &elem_cnt);
+ boff = elem_off * elem_bits;
+ row_bits = elem_cnt * elem_bits;
+
+ if (boff != 0 || row_bits != 8) {
+ rc = RC(rcExe, rcColumn, rcReading, rcData, rcInvalid);
+ PLOGERR(klogInt, (klogErr, rc, "invalid boff or row_bits "
+ "while VCursorCellDataDirect($(name))",
+ "name=%s", name));
+ }
+
+ if (rc == 0) {
+ self->CS_NATIVE = *((bool*)base);
+ }
+
+ }
+ }
+
+ RELEASE(VCursor, curs);
+ }
+
+ {
+ const char *name = self->CS_NATIVE ? "CSREAD" : "READ";
+ const char *datatype
+ = self->CS_NATIVE ? "INSDC:x2cs:bin" : "INSDC:x2na:bin";
+ rc = VTableCreateCachedCursorRead(vtbl, &self->curs, DEFAULT_CURSOR_CAPACITY);
+ DISP_RC(rc, "Cannot VTableCreateCachedCursorRead");
+ if (rc == 0) {
+ rc = VCursorAddColumn(self->curs,
+ &self->idx, "(%s)%s", datatype, name);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "Cannot VCursorAddColumn(($(type)),$(name)",
+ "type=%s,name=%s", datatype, name));
+ }
+ }
+ if (rc == 0) {
+ rc = VCursorOpen(self->curs);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "Cannot VCursorOpen(($(type)),$(name)))",
+ "type=%s,name=%s", datatype, name));
+ }
+ }
+ }
+
+ return rc;
+}
+
+static void BasesFinalize(Bases *self) {
+ assert(self);
+
+ if (self->curs == NULL) {
+ LOGMSG(klogInfo, "Bases statistics will not be printed : "
+ "READ cursor was not opened during BasesFinalize()");
+ return;
+ }
+
+ self->finalized = true;
+}
+
+static rc_t BasesRelease(Bases *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ RELEASE(VCursor , self->curs);
+
+ return rc;
+}
+
+static void BasesAdd(Bases *self, int64_t spotid) {
+ rc_t rc = 0;
+ const void *base = NULL;
+ bitsz_t row_bits = ~0;
+ bitsz_t i = ~0;
+ const unsigned char *bases = NULL;
+
+ assert(self);
+
+ if (self->curs == NULL) {
+ return;
+ }
+
+ {
+ uint32_t elem_bits = 0, elem_off = 0, elem_cnt = 0;
+ rc = VCursorCellDataDirect(self->curs, spotid, self->idx,
+ &elem_bits, &base, &elem_off, &elem_cnt);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogErr, rc,
+ "while VCursorCellDataDirect(READ, $(type))",
+ "type=%s", self->CS_NATIVE ? "CS_NATIVE" : "not CS_NATIVE"));
+ BasesRelease(self);
+ return;
+ }
+
+ row_bits = elem_cnt * elem_bits;
+ }
+
+ if ((row_bits % 8) != 0) {
+ rc = RC(rcExe, rcColumn, rcReading, rcData, rcInvalid);
+ PLOGERR(klogInt, (klogErr, rc, "Invalid row_bits '$(row_bits) "
+ "while VCursorCellDataDirect(READ, $(type), spotid=$(spotid))",
+ "row_bits=%lu,type=%s,spotid=%lu",
+ row_bits, self->CS_NATIVE ? "CS_NATIVE" : "not CS_NATIVE", spotid));
+ BasesRelease(self);
+ return;
+ }
+
+ row_bits /= 8;
+ bases = base;
+ for (i = 0; i < row_bits; ++i) {
+ unsigned char base = bases[i];
+ if (base > 4) {
+ rc = RC(rcExe, rcColumn, rcReading, rcData, rcInvalid);
+ PLOGERR(klogInt, (klogErr, rc,
+ "Invalid READ column value '$(base) while VCursorCellDataDirect"
+ "($(type), spotid=$(spotid), index=$(i))",
+ "base=%d,type=%s,spotid=%lu,index=%lu",
+ base, self->CS_NATIVE ? "CS_NATIVE" : "not CS_NATIVE",
+ spotid, i));
+ BasesRelease(self);
+ return;
+ }
+ ++self->cnt[base];
+ }
+}
+
+static rc_t BasesPrint(const Bases *self,
+ uint64_t base_count, const char* indent)
+{
+ rc_t rc = 0;
+
+ const char tag[] = "Bases";
+ const char *name = NULL;
+ int i = ~0;
+
+ assert(self);
+
+ if (!self->finalized) {
+ LOGMSG(klogInfo, "Bases statistics will not be printed : "
+ "Bases object was not finalized during BasesPrint()");
+ return rc;
+ }
+
+ name = self->CS_NATIVE ? "0123." : "ACGTN";
+
+ OUTMSG(("%s<%s cs_native=\"%s\" count=\"%lu\">\n",
+ indent, tag, self->CS_NATIVE ? "true" : "false", base_count));
+
+ for (i = 0; i < 5; ++i) {
+ OUTMSG(("%s <Base value=\"%c\" count=\"%lu\"/>\n",
+ indent, name[i], self->cnt[i]));
+ }
+
+ OUTMSG(("%s</%s>\n", indent, tag));
+
+ if (self->cnt[0] + self->cnt[1] + self->cnt[2] +
+ self->cnt[3] + self->cnt[4] != base_count)
+ {
+ rc = RC(rcExe, rcNumeral, rcComparing, rcData, rcInvalid);
+ LOGERR(klogErr, rc, "stored base count did not match observed base count");
+ }
+
+ return rc;
+}
+
+typedef struct {
+ uint64_t spot_count;
+ uint64_t spot_count_mates;
+ uint64_t BIO_BASE_COUNT; /* bio_len */
+ uint64_t bio_len_mates;
+ uint64_t BASE_COUNT; /* total_len */
+ uint64_t bad_spot_count;
+ uint64_t bad_bio_len;
+ uint64_t filtered_spot_count;
+ uint64_t filtered_bio_len;
+ uint64_t total_cmp_len; /* CMP_READ : compressed */
+
+ bool variable_nreads;
+ uint32_t nreads; /* if (nreads == 0) then (nreads is variable) */
+ Statistics * stats ; /* nreads elements */
+ Statistics2* stats2; /* nreads elements */
+
+ Bases bases_count;
+} SraStatsTotal;
+static
+rc_t SraStatsTotalMakeStatistics(SraStatsTotal* self, uint32_t nreads)
+{
+ assert(self);
+
+ if (nreads == 0) {
+ return 0;
+ }
+
+ assert(self->stats == NULL);
+ self->stats = calloc(nreads, sizeof *self->stats);
+ if (self->stats == NULL) {
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ assert(self->stats2 == NULL);
+ self->stats2 = calloc(nreads, sizeof *self->stats2);
+ if (self->stats2 == NULL) {
+ free(self->stats);
+ self->stats = NULL;
+ return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+
+ self->nreads = nreads;
+
+ return 0;
+}
+
+static
+void SraStatsTotalStatistics2Init(SraStatsTotal* self,
+ int nreads, uint64_t* sums, uint64_t* count)
+{
+ int i = 0;
+ assert(self);
+ if (nreads) {
+ assert(sums);
+ }
+ for (i = 0; i < nreads; ++i) {
+ uint64_t sum = sums[i];
+ Statistics2* stats = self->stats2 + i;
+ assert(stats);
+ Statistics2Init(stats, sum, count[i]);
+ }
+}
+
+static rc_t SraStatsTotalFree(SraStatsTotal* self) {
+ assert(self);
+
+ free(self->stats);
+ self->stats = NULL;
+
+ free(self->stats2);
+ self->stats2 = NULL;
+
+ BasesRelease(&self->bases_count);
+
+ self->nreads = 0;
+
+ return 0;
+}
+
+static void StatisticsAdd(Statistics* self, double value) {
+ double a_1 = 0;
+
+ /* http://en.wikipedia.org/wiki/Stdev#Rapid_calculation_methods */
+
+ assert(self);
+
+ a_1 = self->a;
+
+ if (self->n++ == 0) {
+ self->prev_val = value;
+ }
+ else if (self->prev_val != value) {
+ self->variable = true;
+ }
+
+ self->a += (value - a_1) / self->n;
+ self->q += ((double)value - a_1) * ((double)value - self->a);
+}
+
+static double StatisticsAverage(const Statistics* self) {
+ assert(self);
+
+ return self->a;
+}
+
+static double StatisticsStdev(const Statistics* self) {
+ assert(self);
+
+ if (self->n == 0) {
+ return 0;
+ }
+
+ return sqrt(self->q / self->n);
+}
+
+static
+void SraStatsTotalAdd(SraStatsTotal* self,
+ uint32_t* values, uint32_t nreads)
+{
+ int i = ~0;
+
+ assert(self && values);
+
+ if (self->nreads != nreads) {
+ self->variable_nreads = true;
+ }
+
+ if (self->variable_nreads) {
+ return;
+ }
+
+ for (i = 0; i < nreads; ++i) {
+ uint32_t value = values[i];
+ if (value > 0) {
+ Statistics* stats = self->stats + i;
+ assert(stats);
+
+ StatisticsAdd(stats, value);
+ }
+ }
+}
+
+static
+void SraStatsTotalAdd2(SraStatsTotal* self, uint32_t* values) {
+ int i = 0;
+
+ assert(self && values);
+
+ for (i = 0; i < self->nreads; ++i) {
+ uint32_t value = values[i];
+ if (value > 0) {
+ Statistics2* stats = self->stats2 + i;
+ assert(stats);
+
+ Statistics2Add(stats, value);
+ }
+ }
+}
+
+static double s_Round(double X) { return floor(X + 0.5); }
+
+static
+void print_double_or_int(const char* name, double val, bool variable) {
+ double rnd = s_Round(val);
+ assert(name);
+ if (variable) {
+ OUTMSG((" %s=\"%.2f\"", name, val));
+ }
+ else {
+ OUTMSG((" %s=\"%d\"", name, (int)rnd));
+ }
+}
+
+static void StatisticsPrint(const Statistics* selfs,
+ uint32_t nreads, const char* indent)
+{
+ int i = ~0;
+
+ if (nreads) {
+ assert(selfs && indent);
+ }
+
+ for (i = 0; i < nreads; ++i) {
+ const Statistics* stats = selfs + i;
+ double avr = StatisticsAverage(stats);
+ double dev = StatisticsStdev(stats);
+
+ OUTMSG(("%s <Read index=\"%d\"", indent, i));
+ OUTMSG((" count=\"%ld\"", stats->n, i));
+ print_double_or_int("average", avr, stats->variable);
+ print_double_or_int("stdev" , dev, stats->variable);
+ OUTMSG(("/>\n"));
+ }
+}
+
+static rc_t StatisticsDiff(const Statistics* ss,
+ const Statistics2* ss2, uint32_t nreads)
+{
+ rc_t rc = 0;
+
+ int i = ~0;
+
+ assert(ss && ss2);
+
+ for (i = 0; i < nreads; ++i) {
+ const Statistics * s = ss + i;
+ const Statistics2* s2 = ss2 + i;
+
+ double d = StatisticsStdev(s);
+ double d2 = sqrt(s2->diff_sq_sum / s2->n);
+
+ double diff = d - d2;
+ if (diff < 0) {
+ diff = -diff;
+ }
+
+ if (diff > 1e-6) {
+ /* RC(rcExe, rcTest, rcExecuting, rcTest, rcFailed); */
+ rc = RC(rcExe, rcNumeral, rcComparing, rcData, rcInvalid);
+ DISP_RC(rc, "While comparing calculated standard deviations");
+ }
+
+ if (s->n != s2->n) {
+ rc = RC(rcExe, rcNumeral, rcComparing, rcData, rcInvalid);
+ DISP_RC(rc, "While comparing read statistics counts");
+ }
+
+ diff = StatisticsAverage(s) - s2->average;
+ if (diff < 0) {
+ diff = -diff;
+ }
+ if (diff > 1e-10) {
+ /* RC(rcExe, rcTest, rcExecuting, rcTest, rcFailed); */
+ rc = RC(rcExe, rcNumeral, rcComparing, rcData, rcInvalid);
+ DISP_RC(rc, "While comparing calculated average");
+ }
+ }
+
+ return rc;
+}
+
+static rc_t SraStatsTotalPrintStatistics(
+ const SraStatsTotal* self, const char* indent, bool test)
+{
+ rc_t rc = 0;
+
+ assert(self && indent);
+
+ OUTMSG(("%s<Statistics nreads=\"", indent));
+
+ if (self->variable_nreads) {
+ OUTMSG(("variable\"/>\n"));
+ }
+ else {
+ OUTMSG(("%u\"", self->nreads));
+ OUTMSG((" nspots=\"%lu\">\n", self->spot_count));
+ StatisticsPrint(self->stats, self->nreads, indent);
+ OUTMSG(("%s</Statistics>\n", indent));
+
+ if (test) {
+ Statistics2Print(self->stats2, self->nreads, indent,
+ self->spot_count);
+ rc = StatisticsDiff(self->stats, self->stats2, self->nreads);
+ }
+ }
+
+ return rc;
+}
+
+typedef struct srastat_parms {
+ const char* table_path;
+
+ bool xml; /* output format (txt or xml) */
+ bool printMeta;
+ bool quick; /* quick mode: stats from meta */
+ bool skip_members; /* not to print spot_group statistics */
+ bool progress; /* show progress */
+ bool skip_alignment; /* not to print alignment info */
+ bool print_arcinfo;
+ bool statistics; /* calculate average and stdev */
+ bool test; /* test stdev */
+
+ const XMLLogger *logger;
+
+ int64_t start, stop;
+
+ bool hasSPOT_GROUP;
+ bool variableReadLength;
+
+ SraStatsTotal total; /* is used in srastat_print */
+} srastat_parms;
+typedef struct SraStatsMeta {
+ bool found;
+ uint64_t BASE_COUNT;
+ uint64_t BIO_BASE_COUNT;
+ uint64_t CMP_BASE_COUNT; /* compressed base count when present */
+ uint64_t spot_count;
+ char* spot_group; /* optional */
+ BAM_HEADER_RG BAM_HEADER;
+} SraStatsMeta;
+typedef struct MetaDataStats {
+ bool found;
+ SraStatsMeta table;
+ uint32_t spotGroupN;
+ SraStatsMeta *spotGroup;
+} MetaDataStats;
+typedef struct SraSizeStats { uint64_t size; } SraSizeStats;
+typedef struct Formatter {
+ char name[256];
+ char vers[256];
+} Formatter;
+typedef struct Loader {
+ char date[256];
+ char name[256];
+ char vers[256];
+} Loader;
+typedef struct SraMeta {
+ uint32_t metaVersion;
+ int32_t tblVersion;
+ time_t loadTimestamp;
+ Formatter formatter;
+ Loader loader;
+} SraMeta;
+typedef struct ArcInfo_struct {
+ KTime_t timestamp;
+ struct {
+ const char* tag;
+ uint64_t size;
+ char md5[32 + 1];
+ } i[2];
+} ArcInfo;
+typedef struct Quality {
+ uint32_t value;
+ uint64_t count;
+} Quality;
+typedef struct QualityStats {
+ Quality* QUALITY;
+ size_t allocated;
+ size_t used;
+} QualityStats;
+typedef enum EMetaState {
+ eMSNotFound,
+ eMSFound
+} EMetaState;
+typedef struct Count {
+ EMetaState state;
+ uint64_t value;
+} Count;
+typedef struct Counts {
+ char* tableName;
+ EMetaState tableState;
+ EMetaState metaState;
+ Count BASE_COUNT;
+ Count SPOT_COUNT;
+} Counts;
+typedef struct TableCounts {
+ EMetaState state;
+ Counts* count;
+ size_t allocated;
+ size_t used;
+} TableCounts;
+typedef struct Ctx {
+ const BSTree* tr;
+ const MetaDataStats* meta;
+ const SraMeta* info;
+ const SraSizeStats* sizes;
+ const ArcInfo* arc_info;
+ srastat_parms* pb;
+ SraStatsTotal* total;
+ const VDatabase* db;
+ QualityStats quality;
+ TableCounts tables;
+} Ctx;
+typedef rc_t (CC * RG_callback)(const BAM_HEADER_RG* rg, const void* data);
+static
+rc_t CC meta_RG_callback(const BAM_HEADER_RG* rg, const void* data)
+{
+ rc_t rc = 0;
+
+ const MetaDataStats* meta = data;
+
+ int i = 0;
+ bool found = false;
+
+ assert(rg && meta && rg->ID);
+
+ for (i = 0; i < meta->spotGroupN && rc == 0; ++i) {
+ SraStatsMeta* ss = &meta->spotGroup[i];
+ const char* spot_group = ss->spot_group;
+
+ assert(spot_group);
+ if (strcmp(spot_group, rg->ID) == 0) {
+ rc = BAM_HEADER_RG_copy(&ss->BAM_HEADER, rg);
+ found = true;
+ break;
+ }
+ }
+
+ if (rc == 0 && !found) {
+ /* There could be Read groups that are present in the BAM_HEADER
+ but missed in the csra. We was just ignore them. */
+ }
+
+ return rc;
+}
+
+static int64_t CC srastats_cmp(const void *item, const BSTNode *n) {
+ const char *sg = item;
+ const SraStats *ss = ( const SraStats* ) n;
+
+ return strcmp(sg,ss->spot_group);
+}
+
+static
+rc_t CC tree_RG_callback(const BAM_HEADER_RG* rg, const void* data)
+{
+ rc_t rc = 0;
+
+ const BSTree* tr = data;
+ SraStats* ss = NULL;
+
+ assert(rg && tr && rg->ID);
+
+ ss = (SraStats*) BSTreeFind(tr, rg->ID, srastats_cmp);
+ if (ss == NULL) {
+ /* There could be Read groups that are present in the BAM_HEADER
+ but missed in the csra. We was just ignore them. */
+ }
+ else {
+ rc = BAM_HEADER_RG_copy(&ss->BAM_HEADER, rg);
+ }
+
+ return rc;
+}
+
+static int64_t CC QualityCmp(const void* s1, const void* s2, void *data) {
+ const Quality* q1 = s1;
+ const Quality* q2 = s2;
+ assert(q1 && q2);
+ return (int64_t)q1->value - (int64_t)q2->value;
+}
+
+static int64_t CC CountsCmp(const void* v1, const void* v2, void *data) {
+ const Counts* e1 = v1;
+ const Counts* e2 = v2;
+ assert(e1 && e2 && e1->tableName && e2->tableName);
+ return strcmp(e1->tableName, e2->tableName);
+}
+
+static rc_t QualityParse(Quality* self,
+ const KMDataNode* node, const char* name)
+{
+ rc_t rc = 0;
+ const char start[] = "PHRED_";
+ int i = strlen(start);
+
+ assert(self && name);
+
+ if (strlen(name) <= strlen(start)) {
+ rc = RC(rcExe, rcXmlDoc, rcParsing, rcName, rcInvalid);
+ PLOGERR(klogInt, (klogErr, rc,
+ "Bad node name: STATS/QUALITY/$(name)", "name=%s", name));
+ return rc;
+ }
+
+ self->value = 0;
+ for (; i < strlen(name); ++i) {
+ if (name[i] < '0' || name[i] > '9') {
+ rc_t rc = RC(rcExe, rcXmlDoc, rcParsing, rcName, rcInvalid);
+ PLOGERR(klogInt, (klogErr, rc,
+ "Bad node name: STATS/QUALITY/$(name)", "name=%s", name));
+ return rc;
+ }
+ self->value = self->value * 10 + name[i] - '0';
+ }
+
+ rc = KMDataNodeReadAsU64(node, &self->count);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogErr, rc,
+ "while reading the value of STATS/QUALITY/$(name)",
+ "name=%s", name));
+ }
+
+ return rc;
+}
+
+static rc_t QualityStatsRead1(QualityStats* self,
+ const KMDataNode* parent, const char* name)
+{
+ const KMDataNode* node = NULL;
+
+ rc_t rc = KMDataNodeOpenNodeRead(parent, &node, "%s", name);
+ DISP_RC2(rc, name, "while calling KMDataNodeOpenNodeRead");
+
+ if (rc == 0) {
+ size_t size = 64;
+ assert(self);
+ if (self->allocated == 0) {
+ assert(self->QUALITY == NULL && self->used == 0);
+ self->QUALITY = malloc(size * sizeof *self->QUALITY);
+ if (self->QUALITY == NULL) {
+ return
+ RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->allocated = size;
+ }
+ else if (self->used >= self->allocated) {
+ Quality* tmp = NULL;
+ size = self->allocated * 2;
+ tmp = realloc(self->QUALITY, size * sizeof *self->QUALITY);
+ if (tmp == NULL) {
+ return
+ RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->QUALITY = tmp;
+ self->allocated = size;
+ }
+ }
+
+ if (rc == 0) {
+ assert((self->used < self->allocated) && self->QUALITY);
+ rc = QualityParse(&self->QUALITY[self->used], node, name);
+ if (rc == 0)
+ { ++self->used; }
+ }
+
+ RELEASE(KMDataNode, node);
+
+ return rc;
+}
+
+static rc_t QualityStatsRead(QualityStats* self, const KMetadata* meta) {
+ rc_t rc = 0;
+ const char name[] = "STATS/QUALITY";
+ const KMDataNode* node = NULL;
+
+ assert(self && meta);
+
+ memset(self, 0, sizeof *self);
+
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("%s: not found\n", name));
+ return 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+
+ if (rc == 0 && node) {
+ KNamelist* names = NULL;
+ rc = KMDataNodeListChild(node, &names);
+ DISP_RC2(rc, name, "while calling KMDataNodeListChild");
+ if (rc == 0) {
+ uint32_t count = 0;
+ rc = KNamelistCount(names, &count);
+ DISP_RC2(rc, name, "while calling KNamelistCount");
+ if (rc == 0) {
+ uint32_t i = ~0;
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char* child = NULL;
+ rc = KNamelistGet(names, i, &child);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "while calling STATS/QUALITY::KNamelistGet($(idx))",
+ "idx=%i", i));
+ }
+ else
+ { rc = QualityStatsRead1(self, node, child); }
+ }
+ }
+ }
+ RELEASE(KNamelist, names);
+ }
+
+ RELEASE(KMDataNode, node);
+
+ return 0;
+}
+
+static
+void QualityStatsSort(QualityStats* self)
+{
+ assert(self);
+ ksort(self->QUALITY, self->used, sizeof *self->QUALITY, QualityCmp, NULL);
+}
+
+static
+void TableCountsSort(TableCounts* self)
+{
+ assert(self);
+ ksort(self->count, self->used, sizeof *self->count, CountsCmp, NULL);
+}
+static
+rc_t QualityStatsPrint(const QualityStats* self, const char* indent)
+{
+ size_t i = ~0;
+ const char tag[] = "QualityCount";
+ assert(self && indent);
+
+ if (self->allocated == 0)
+ { return 0; }
+
+ OUTMSG(("%s<%s>\n", indent, tag));
+ for (i = 0; i < self->used; ++i) {
+ Quality* q = &self->QUALITY[i];
+ OUTMSG((" %s<Quality value=\"%lu\" count=\"%lu\"/>\n",
+ indent, q->value, q->count));
+ }
+ OUTMSG(("%s</%s>\n", indent, tag));
+
+ return 0;
+}
+
+static
+void QualityStatsRelease(QualityStats* self)
+{
+ assert(self);
+ free(self->QUALITY);
+ memset(self, 0, sizeof *self);
+}
+
+static
+rc_t CountRead(Count* self, const char* name, const KMDataNode* parent)
+{
+ rc_t rc = 0;
+
+ const KMDataNode* node = NULL;
+
+ assert(self && parent && name);
+
+ memset(self, 0, sizeof *self);
+
+ rc = KMDataNodeOpenNodeRead(parent, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("%s: not found\n", name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ else {
+ rc = KMDataNodeReadAsU64(node, &self->value);
+ DISP_RC2(rc, name, "while calling KMDataNodeReadAsU64");
+ if (rc == 0)
+ { self->state = eMSFound; }
+ }
+
+ RELEASE(KMDataNode, node);
+
+ return rc;
+}
+
+static
+rc_t TableCountsRead1(TableCounts* self,
+ const VDatabase* db, const char* tableName)
+{
+ const VTable* tbl = NULL;
+ const KMetadata* meta = NULL;
+ const char name[] = "STATS/TABLE";
+ const KMDataNode* node = NULL;
+ rc_t rc = VDatabaseOpenTableRead(db, &tbl, "%s", tableName);
+ DISP_RC2(rc, tableName, "while calling VDatabaseOpenTableRead");
+
+ if (rc == 0) {
+ size_t size = 8;
+ assert(self);
+ if (self->allocated == 0) {
+ assert(self->count == NULL && self->used == 0);
+ self->count = malloc(size * sizeof *self->count);
+ if (self->count == NULL) {
+ return
+ RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->allocated = size;
+ }
+ else if (self->used >= self->allocated) {
+ Counts* tmp = NULL;
+ size = self->allocated * 2;
+ tmp = realloc(self->count, size * sizeof *self->count);
+ if (tmp == NULL) {
+ return
+ RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ self->count = tmp;
+ self->allocated = size;
+ }
+ }
+ if (rc == 0) {
+ assert(self->used < self->allocated && self->count);
+ }
+ if (rc == 0) {
+ rc = VTableOpenMetadataRead(tbl, &meta);
+ DISP_RC2(rc, name, "while calling VTableOpenMetadataRead");
+ }
+ if (rc == 0) {
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("%s: not found\n", name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ else
+ { assert(node); }
+ }
+
+ if (rc == 0 && node != NULL) {
+ Counts* c = NULL;
+ assert((self->used < self->allocated) && (self->count != NULL));
+ c = &self->count[self->used];
+ memset(c, 0, sizeof *c);
+ c->tableName = strdup(tableName);
+ if (c->tableName == NULL)
+ { return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted); }
+ c->tableState = eMSFound;
+ c->metaState = eMSFound;
+ rc = CountRead(&c->BASE_COUNT, "BASE_COUNT", node);
+
+ {
+ rc_t rc2 = CountRead(&c->SPOT_COUNT, "SPOT_COUNT", node);
+ if (rc2 != 0 && rc == 0)
+ { rc = rc2; }
+ }
+
+ if (rc == 0)
+ { ++self->used; }
+ }
+
+ RELEASE(KMDataNode, node);
+ RELEASE(KMetadata, meta);
+ RELEASE(VTable, tbl);
+
+ return rc;
+}
+
+static
+rc_t TableCountsRead(TableCounts* self, const VDatabase* db)
+{
+ rc_t rc = 0;
+ KNamelist* names = NULL;
+
+ assert(self);
+
+ memset(self, 0, sizeof *self);
+
+ if (db == NULL)
+ { return 0; }
+
+ rc = VDatabaseListTbl(db, &names);
+ DISP_RC(rc, "while calling VDatabaseListTbl");
+ if (rc == 0) {
+ uint32_t count = 0;
+ rc = KNamelistCount(names, &count);
+ DISP_RC(rc, "while calling VDatabaseListTbl::KNamelistCount");
+ if (rc == 0) {
+ uint32_t i = ~0;
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char* table = NULL;
+ rc = KNamelistGet(names, i, &table);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "while calling VDatabaseListTbl::KNamelistGet($(idx))",
+ "idx=%i", i));
+ }
+ else
+ { rc = TableCountsRead1(self, db, table); }
+ }
+ }
+ }
+
+ RELEASE(KNamelist, names);
+
+ return rc;
+}
+
+static
+rc_t CountPrint(const Count* self, const char* indent, const char* tag)
+{
+ assert(self && indent && tag);
+ switch (self->state) {
+ case eMSNotFound:
+ OUTMSG((" %s<%s state=\"not found\"/>\n", indent, tag));
+ break;
+ case eMSFound:
+ OUTMSG((" %s<%s count=\"%lu\"/>\n", indent, tag, self->value));
+ break;
+ default:
+ assert(0);
+ OUTMSG((" %s<%s state=\"UNEXPECTED\"/>\n", indent, tag));
+ break;
+ }
+ return 0;
+}
+
+static
+rc_t TableCountsPrint(const TableCounts* self, const char* indent)
+{
+ rc_t rc = 0;
+ const char tag[] = "Databases";
+
+ assert(self && indent);
+
+ if (self->allocated == 0)
+ { return 0; }
+
+ OUTMSG(("%s<%s>\n", indent, tag));
+ {
+ size_t i = ~0;
+ const char tag[] = "Database";
+ OUTMSG((" %s<%s>\n", indent, tag));
+ for (i = 0; i < self->used; ++i) {
+ const char tag[] = "Statistics";
+ const Counts* p = &self->count[i];
+ OUTMSG((" %s<Table name=\"%s\">\n", indent, p->tableName));
+ switch (p->metaState) {
+ case eMSNotFound:
+ OUTMSG((" %s<%s source=\"meta\" state=\"not found\"/>\n",
+ indent, tag));
+ break;
+ case eMSFound: {
+ char buf[512];
+ OUTMSG((" %s<%s source=\"meta\">\n", indent, tag));
+ rc = string_printf(buf, sizeof buf, NULL, " %s", indent);
+ if (rc == 0) {
+ CountPrint(&p->SPOT_COUNT, buf, "Rows");
+ CountPrint(&p->BASE_COUNT, buf, "Elements");
+ }
+ OUTMSG((" %s</%s>\n", indent, tag));
+ break;
+ }
+ default:
+ assert(0);
+ OUTMSG((" %s<%s source=\"meta\" state=\"UNEXPECTED\"/>\n",
+ indent, tag));
+ break;
+ }
+ OUTMSG((" %s</Table>\n", indent));
+ }
+ OUTMSG((" %s</%s>\n", indent, tag));
+ }
+ OUTMSG(("%s</%s>\n", indent, tag));
+
+ return rc;
+}
+
+static
+void TableCountsRelease(TableCounts* self)
+{
+ size_t i = ~0;
+ assert(self);
+ for (i = 0; i < self->used; ++i) {
+ assert(self->count);
+ free(self->count[i].tableName);
+ self->count[i].tableName = NULL;
+ }
+ free(self->count);
+ memset(self, 0, sizeof *self);
+}
+
+static
+rc_t parse_bam_header(const VDatabase* db,
+ const RG_callback cb, const void* data)
+{
+ rc_t rc = 0;
+ const char name[] = "BAM_HEADER";
+ const KMetadata* meta = NULL;
+ const KMDataNode* node = NULL;
+ char* buffer = NULL;
+
+ if (db == NULL) {
+ return rc;
+ }
+ assert(cb);
+
+ if (rc == 0) {
+ rc = VDatabaseOpenMetadataRead(db, &meta);
+ DISP_RC(rc, "while calling VDatabaseOpenMetadataRead");
+ }
+
+ if (rc == 0) {
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ return 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ }
+
+ if (rc == 0) {
+ size_t num_read = 0;
+ size_t remaining = 0;
+ rc = KMDataNodeRead(node, 0, NULL, 0, &num_read, &remaining);
+ DISP_RC2(rc, name, "while calling KMDataNodeRead");
+ assert(num_read == 0);
+ if (rc == 0 && remaining > 0) {
+ buffer = malloc(remaining + 1);
+ if (buffer == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ else {
+ size_t size = 0;
+ rc = KMDataNodeReadCString(node, buffer, remaining + 1, &size);
+ DISP_RC2(rc, name, "while calling KMDataNodeReadCString");
+ assert(size == remaining);
+ }
+ }
+ }
+
+ if (rc == 0 && buffer) {
+ const char* token = strtok(buffer, "\n");
+ while (token) {
+ const char RG[] = "@RG\t";
+ if (strncmp(token, RG, sizeof RG - 1) == 0) {
+ const char ID[] = "\tID:";
+ const char LB[] = "\tLB:";
+ const char SM[] = "\tSM:";
+ char* id_end = NULL;
+ char* lb_end = NULL;
+ char* sm_end = NULL;
+ BAM_HEADER_RG rg;
+ memset(&rg, 0, sizeof rg);
+ rg.ID = strstr(token, ID);
+ rg.LB = strstr(token, LB);
+ rg.SM = strstr(token, "\tSM:");
+ if (rg.ID) {
+ rg.ID += sizeof ID - 1;
+ }
+ if (rg.ID) {
+ id_end = strchr(rg.ID, '\t');
+ }
+ if (rg.LB) {
+ rg.LB += sizeof LB - 1;
+ }
+ if (rg.LB) {
+ lb_end = strchr(rg.LB, '\t');
+ }
+ if (rg.SM) {
+ rg.SM += sizeof SM - 1;
+ }
+ if (rg.SM) {
+ sm_end = strchr(rg.SM, '\t');
+ }
+ if (id_end) {
+ *id_end = '\0';
+ }
+ if (lb_end) {
+ *lb_end = '\0';
+ }
+ if (sm_end) {
+ *sm_end = '\0';
+ }
+ if (rg.ID && rg.LB && rg.SM) {
+ rc = cb(&rg, data);
+ }
+ if (rc) {
+ break;
+ }
+ }
+ token = strtok(NULL, "\n");
+ }
+ }
+ free(buffer);
+ buffer = NULL;
+ RELEASE(KMDataNode, node);
+ RELEASE(KMetadata, meta);
+ return rc;
+}
+
+static
+void SraStatsMetaDestroy(SraStatsMeta* self)
+{
+ if (self == NULL)
+ { return; }
+ BAM_HEADER_RG_free(&self->BAM_HEADER);
+ free(self->spot_group);
+ self->spot_group = NULL;
+}
+
+static
+rc_t CC fileSizeVisitor(const KDirectory* dir,
+ uint32_t type, const char* name, void* data)
+{
+ rc_t rc = 0;
+
+ SraSizeStats* sizes = (SraSizeStats*) data;
+
+ if (type & kptAlias)
+ { return rc; }
+
+ assert(sizes);
+
+ switch (type) {
+ case kptFile: {
+ uint64_t size = 0;
+ rc = KDirectoryFileSize(dir, &size, "%s", name);
+ DISP_RC2(rc, name, "while calling KDirectoryFileSize");
+ if (rc == 0) {
+ sizes->size += size;
+ DBGMSG(DBG_APP, DBG_COND_1,
+ ("File '%s', size %lu\n", name, size));
+ }
+ break;
+ }
+ case kptDir:
+ DBGMSG(DBG_APP, DBG_COND_1, ("Dir '%s'\n", name));
+ rc = KDirectoryVisit(dir, false, fileSizeVisitor, sizes, "%s", name);
+ DISP_RC2(rc, name, "while calling KDirectoryVisit");
+ break;
+ default:
+ rc = RC(rcExe, rcDirectory, rcVisiting, rcType, rcUnexpected);
+ DISP_RC2(rc, name, "during KDirectoryVisit");
+ break;
+ }
+
+ return rc;
+}
+
+static rc_t GetTableModDate(const VDBManager *mgr,
+ KTime_t *mtime, const char *spec)
+{
+ VFSManager *vfs = NULL;
+ VResolver *resolver = NULL;
+ VPath *accession = NULL;
+ const VPath *tblpath = NULL;
+ const KDBManager *kmgr = NULL;
+ char aPath[4096] = "";
+ const char *path = aPath;
+ rc_t rc = VFSManagerMake(&vfs);
+ DISP_RC(rc, "VFSManagerMake");
+ assert(mtime);
+ *mtime = 0;
+ if (rc == 0) {
+ rc = VFSManagerGetResolver(vfs, &resolver);
+ DISP_RC(rc, "VFSManagerGetResolver");
+ }
+ if (rc == 0) {
+ rc = VFSManagerMakePath(vfs, &accession, spec);
+ DISP_RC(rc, "VFSManagerMakePath");
+ }
+ if (rc == 0) {
+ assert(accession);
+ if (VPathIsAccessionOrOID(accession)) {
+ rc = VResolverLocal(resolver, accession, &tblpath);
+ DISP_RC(rc, "VResolverLocal");
+ if (rc == 0) {
+ //size_t size;
+ rc = VPathReadPath(tblpath, aPath, sizeof aPath, NULL);//& size)
+ path = aPath;
+ }
+ }
+ else {
+ path = spec;
+ }
+ }
+ if (rc == 0) {
+ rc = VDBManagerGetKDBManagerRead(mgr, &kmgr);
+ DISP_RC(rc, "VDBManagerGetKDBManagerRead");
+ }
+ if (rc == 0) {
+ rc = KDBManagerGetTableModDate(kmgr, mtime, "%s", path);
+ }
+ RELEASE(KDBManager, kmgr);
+ RELEASE(VPath, tblpath);
+ RELEASE(VPath, accession);
+ RELEASE(VResolver, resolver);
+ RELEASE(VFSManager, vfs);
+ return rc;
+}
+
+static rc_t get_arc_info(const char *path, ArcInfo *arc_info,
+ const VDBManager *vmgr, const VTable *vtbl)
+{
+ rc_t rc = 0;
+ memset(arc_info, 0, sizeof(*arc_info));
+
+ if ((rc = GetTableModDate(vmgr, &arc_info->timestamp, path)) == 0 ) {
+ uint32_t i;
+ for(i = 0; i < sizeof(arc_info->i) / sizeof(arc_info->i[0]); i++) {
+ const KFile* kfile;
+ arc_info->i[i].tag = i == 0 ? "sra" : "lite.sra";
+ if ((rc = VTableMakeSingleFileArchive(vtbl, &kfile, i == 1)) == 0) {
+ MD5State md5;
+ uint64_t pos = 0;
+ uint8_t buffer[256 * 1024];
+ size_t num_read = 0, x;
+
+ MD5StateInit(&md5);
+ do {
+ if( (rc = KFileRead(kfile, pos, buffer, sizeof(buffer), &num_read)) == 0 ) {
+ MD5StateAppend(&md5, buffer, num_read);
+ pos += num_read;
+ }
+ rc = Quitting();
+ if (rc != 0) {
+ LOGMSG(klogWarn, "Interrupted");
+ }
+ } while(rc == 0 && num_read != 0);
+ if (rc == 0 &&
+ (rc = KFileSize(kfile, &arc_info->i[i].size)) == 0)
+ {
+ uint8_t digest[16];
+ MD5StateFinish(&md5, digest);
+ for(pos = 0, x = 0; rc == 0 && pos < sizeof(digest); pos++) {
+ rc = string_printf(&arc_info->i[i].md5[x], sizeof(arc_info->i[i].md5) - x, &num_read, "%02x", digest[pos]);
+ x += num_read;
+ }
+ }
+ KFileRelease(kfile);
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t get_size( SraSizeStats* sizes, const VTable *vtbl) {
+ rc_t rc = 0;
+
+ const KDatabase* kDb = NULL;
+ const KTable* kTbl = NULL;
+ const KDirectory* dir = NULL;
+
+ assert(vtbl && sizes);
+ rc = VTableOpenKTableRead(vtbl, &kTbl);
+ DISP_RC(rc, "while calling VTableOpenKTableRead");
+
+ if (rc == 0) {
+ rc = KTableOpenParentRead(kTbl, &kDb);
+ DISP_RC(rc, "while calling KTableOpenParentRead");
+ }
+
+ if (rc == 0 && kDb) {
+ while (rc == 0) {
+ const KDatabase* par = NULL;
+ rc = KDatabaseOpenParentRead(kDb, &par);
+ DISP_RC(rc, "while calling KDatabaseOpenParentRead");
+ if (par == NULL)
+ { break; }
+ else {
+ RELEASE(KDatabase, kDb);
+ kDb = par;
+ }
+ }
+ if (rc == 0) {
+ rc = KDatabaseOpenDirectoryRead(kDb, &dir);
+ DISP_RC(rc, "while calling KDatabaseOpenDirectoryRead");
+ }
+ }
+
+ if (rc == 0 && dir == NULL) {
+ rc = KTableOpenDirectoryRead(kTbl, &dir);
+ DISP_RC(rc, "while calling KTableOpenDirectoryRead");
+ }
+
+ memset(sizes, 0, sizeof *sizes);
+
+ if (rc == 0) {
+ rc = KDirectoryVisit(dir, false, fileSizeVisitor, sizes, NULL);
+ DISP_RC(rc, "while calling KDirectoryVisit");
+ }
+
+ RELEASE(KDirectory, dir);
+ RELEASE(KTable, kTbl);
+ RELEASE(KDatabase, kDb);
+
+ return rc;
+}
+
+static
+rc_t readTxtAttr(const KMDataNode* self, const char* name, const char* attrName,
+ char* buf, size_t buf_size)
+{
+ rc_t rc = 0;
+ size_t num_read = 0;
+
+ if (self == NULL) {
+ rc = RC(rcExe, rcMetadata, rcReading, rcSelf, rcNull);
+ return rc;
+ }
+
+ assert(self && name && attrName && buf && buf_size);
+
+ rc = KMDataNodeReadAttr(self, attrName, buf, buf_size, &num_read);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc, "Cannot read '$(name)@$(attr)'",
+ "name=%s,attr=%s", name, attrName));
+ }
+ else { DBGMSG(DBG_APP, DBG_COND_1, ("%s@%s = %s\n", name, attrName, buf)); }
+
+ return rc;
+}
+
+static
+rc_t get_load_info(const KMetadata* meta, SraMeta* info)
+{
+ rc_t rc = 0;
+ const KMDataNode* node = NULL;
+ assert(meta && info);
+ memset(info, 0, sizeof *info);
+ info->metaVersion = 99;
+ info->tblVersion = -1;
+
+ if (rc == 0) {
+ rc = KMetadataVersion(meta, &info->metaVersion);
+ DISP_RC(rc, "While calling KMetadataVersion");
+ if (rc == 0) {
+ DBGMSG(DBG_APP, DBG_COND_1,
+ ("KMetadataVersion=%d\n",info->metaVersion));
+ switch (info->metaVersion) {
+ case 1:
+ info->tblVersion = 0;
+ break;
+ case 2: {
+ const char name[] = "SOFTWARE/loader";
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,("%s: not found\n",name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name,
+ "while calling KMetadataOpenNodeRead");
+ }
+ else {
+ rc = readTxtAttr(node, name, "vers",
+ info->loader.vers, sizeof info->loader.vers);
+ if (rc == 0) {
+ if (strncmp("2.", info->loader.vers, 2) == 0)
+ { info->tblVersion = 2; }
+ else { info->tblVersion = 1; }
+ }
+ else if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("%s/@%s: not found\n", name, "vers"));
+ rc = 0;
+ }
+ if (rc == 0) {
+ rc = readTxtAttr(node, name, "date",
+ info->loader.date, sizeof info->loader.date);
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("%s/@%s: not found\n", name, "date"));
+ rc = 0;
+ }
+ }
+ if (rc == 0) {
+ rc = readTxtAttr(node, name, "name",
+ info->loader.name, sizeof info->loader.name);
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("%s/@%s: not found\n", name, "name"));
+ rc = 0;
+ }
+ }
+ }
+ break;
+ }
+ default:
+ rc = RC(rcExe, rcMetadata, rcReading, rcData, rcUnexpected);
+ PLOGERR(klogErr, (klogErr, rc,
+ "Unexpected MetadataVersion: $(version)",
+ "version=%d", info->metaVersion));
+ break;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ const char name[] = "SOFTWARE/formatter";
+ RELEASE(KMDataNode, node);
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound ) {
+ DBGMSG(DBG_APP,DBG_COND_1,("%s: not found\n",name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ else {
+ if (rc == 0) {
+ rc = readTxtAttr(node, name, "vers",
+ info->formatter.vers, sizeof info->formatter.vers);
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("%s/@%s: not found\n", name, "vers"));
+ rc = 0;
+ }
+ }
+ if (rc == 0) {
+ rc = readTxtAttr(node, name, "name",
+ info->formatter.name, sizeof info->formatter.name);
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1,
+ ("%s/@%s: not found\n", name, "name"));
+ rc = 0;
+ }
+ }
+ }
+ }
+
+ if (rc == 0) {
+ const char name[] = "LOAD/timestamp";
+ RELEASE(KMDataNode, node);
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound ) {
+ DBGMSG(DBG_APP,DBG_COND_1,("%s: not found\n",name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ else {
+ size_t num_read = 0;
+ size_t remaining = 0;
+ rc = KMDataNodeRead(node, 0,
+ &info->loadTimestamp, sizeof info->loadTimestamp,
+ &num_read, &remaining);
+ if (rc == 0) {
+ if (remaining || num_read != sizeof info->loadTimestamp) {
+ rc = RC(rcExe, rcMetadata, rcReading, rcData, rcIncorrect);
+ }
+ }
+ else {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP, DBG_COND_1, ("%s: not found\n", name));
+ rc = 0;
+ }
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ }
+
+ RELEASE(KMDataNode, node);
+
+ return rc;
+}
+
+static
+rc_t readStatsMetaNode(const KMDataNode* parent, const char* parentName,
+ const char* name, uint64_t* result, bool quick, bool optional)
+{
+ rc_t rc = 0;
+
+ const KMDataNode* node = NULL;
+
+ assert(parent && parentName && name && result);
+
+ rc = KMDataNodeOpenNodeRead(parent, &node, "%s", name);
+ if (rc != 0)
+ {
+ if (GetRCState(rc) == rcNotFound && optional)
+ {
+ *result = 0;
+ rc = 0;
+ }
+ else if ( quick )
+ {
+ PLOGERR(klogInt, (klogInt, rc, "while opening $(parent)/$(child)",
+ "parent=%s,child=%s", parentName, name));
+ }
+ }
+ else {
+ rc = KMDataNodeReadAsU64(node, result);
+ if (GetRCObject(rc) == rcTransfer && GetRCState(rc) == rcIncomplete) {
+ *result = 0;
+ rc = 0;
+ }
+ if ( rc != 0 && quick )
+ {
+ PLOGERR(klogInt, (klogInt, rc, "while reading $(parent)/$(child)",
+ "parent=%s,child=%s", parentName, name));
+ }
+ }
+
+ RELEASE(KMDataNode, node);
+
+ return rc;
+}
+
+static
+rc_t readStatsMetaAttr(const KMDataNode* parent, const char* parentName,
+ const char* name, char ** result, bool quick, bool optional)
+{
+ rc_t rc = 0;
+ char temp[4096];
+ size_t actsize;
+
+ assert(parent && parentName && name && result);
+
+ rc = KMDataNodeReadAttr(parent, name, temp, sizeof(temp), &actsize);
+ if (GetRCState(rc) == rcInsufficient)
+ {
+ *result = malloc(actsize + 1);
+ if (*result)
+ rc = KMDataNodeReadAttr(parent, name, *result, actsize, &actsize);
+ }
+ else if (rc == 0)
+ {
+ *result = strdup(temp);
+ }
+ if (rc == 0 && *result == NULL)
+ {
+ rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ else if (rc != 0)
+ {
+ if (GetRCState(rc) == rcNotFound && optional)
+ {
+ *result = 0;
+ rc = 0;
+ }
+ else
+ {
+ PLOGERR(klogInt, (klogInt, rc, "while opening $(parent)[$(child)]",
+ "parent=%s,child=%s", parentName, name));
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t readStatsMetaNodes(const KMDataNode* parent, const char* name,
+ SraStatsMeta* stats, bool quick)
+{
+ rc_t rc = 0;
+ const char *const parentName = name ? name : "STATS/TABLE";
+
+ assert(parent && stats);
+
+ if (name) {
+ char *tempname;
+
+ rc = readStatsMetaAttr(parent, parentName, "name", &tempname, quick, true);
+ if (rc == 0) {
+ if (tempname)
+ stats->spot_group = tempname;
+ else {
+ stats->spot_group = strdup(name);
+ if (stats->spot_group == NULL)
+ { rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted); }
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = readStatsMetaNode(parent,
+ parentName, "BASE_COUNT", &stats->BASE_COUNT, quick, false);
+ }
+ if (rc == 0) {
+ rc = readStatsMetaNode(parent,
+ parentName, "BIO_BASE_COUNT", &stats->BIO_BASE_COUNT, quick, false);
+ }
+ if (rc == 0) {
+ rc = readStatsMetaNode(parent,
+ parentName, "SPOT_COUNT", &stats->spot_count, quick, false);
+ }
+ if (rc == 0) {
+ rc = readStatsMetaNode(parent,
+ parentName, "CMP_BASE_COUNT", &stats->CMP_BASE_COUNT, quick, true);
+ }
+
+ if (rc == 0)
+ { stats->found = true; }
+ else { SraStatsMetaDestroy(stats); }
+
+ return rc;
+}
+
+static
+rc_t get_stats_meta(const KMetadata* meta,
+ MetaDataStats* stats, bool quick)
+{
+ rc_t rc = 0;
+ assert(meta && stats);
+ memset(stats, 0, sizeof *stats);
+
+ if (rc == 0) {
+ const char name[] = "STATS/TABLE";
+ const KMDataNode* node = NULL;
+ rc = KMetadataOpenNodeRead(meta, &node, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("%s: not found\n", name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+ if (rc == 0 && node)
+ { rc = readStatsMetaNodes(node, NULL, &stats->table, quick); }
+ RELEASE(KMDataNode, node);
+ }
+
+ if (rc == 0) {
+ const char name[] = "STATS/SPOT_GROUP";
+ const KMDataNode* parent = NULL;
+ rc = KMetadataOpenNodeRead(meta, &parent, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("%s: not found\n", name));
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling KMetadataOpenNodeRead");
+ }
+
+ if (rc == 0 && parent) {
+ uint32_t count = 0, i = 0;
+ KNamelist* names = NULL;
+ rc = KMDataNodeListChild(parent, &names);
+ DISP_RC2(rc, name, "while calling KMDataNodeListChild");
+ if (rc == 0) {
+ rc = KNamelistCount(names, &count);
+ DISP_RC2(rc, name, "while calling KNamelistCount");
+ if (rc == 0) {
+ stats->spotGroupN = count;
+ stats->spotGroup = calloc(count, sizeof *stats->spotGroup);
+ if (stats->spotGroup == NULL) {
+ rc = RC(rcExe,
+ rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ }
+ }
+
+ for (i = 0; i < count && rc == 0; ++i) {
+ const KMDataNode* node = NULL;
+ const char* child = NULL;
+ rc = KNamelistGet(names, i, &child);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "while calling STATS/SPOT_GROUP::KNamelistGet($(idx))",
+ "idx=%i", i));
+ }
+ else {
+ rc = KMDataNodeOpenNodeRead(parent, &node, "%s", child);
+ DISP_RC2(rc, child, "while calling KMDataNodeOpenNodeRead");
+ }
+ if (rc == 0) {
+ rc = readStatsMetaNodes
+ (node, child, &stats->spotGroup[i], quick);
+ }
+ RELEASE(KMDataNode, node);
+ }
+ RELEASE(KNamelist, names);
+ }
+ RELEASE(KMDataNode, parent);
+ }
+
+ if (rc == 0) {
+ uint32_t i = 0;
+ bool found = stats->table.found;
+ for (i = 0; i < stats->spotGroupN && found; ++i)
+ { found = stats->spotGroup[i].found; }
+ stats->found = found;
+ }
+
+ return rc;
+}
+
+static
+void srastatmeta_print(const MetaDataStats* meta, srastat_parms *pb)
+{
+ uint32_t i = 0;
+ assert(pb && meta);
+
+ if (meta->spotGroupN) {
+ for (i = 0; i < meta->spotGroupN; ++i) {
+ const SraStatsMeta* ss = &meta->spotGroup[i];
+ if (!pb->skip_members) {
+ const char* spot_group = "";
+ if (strcmp("default", ss->spot_group) != 0)
+ { spot_group = ss->spot_group; }
+ if ((spot_group == NULL || spot_group[0] == '\0')
+ && meta->spotGroupN > 1)
+ {
+ /* skip an empty "extra" 'default' spot_group */
+ if (ss->BASE_COUNT == 0 && ss->BIO_BASE_COUNT == 0 &&
+ ss->CMP_BASE_COUNT == 0 && ss->spot_count == 0)
+ { continue; }
+ }
+ if (pb->xml) {
+ if (pb->hasSPOT_GROUP) {
+ OUTMSG((" <Member member_name=\"%s\"", ss->spot_group));
+ OUTMSG((" spot_count=\"%ld\" base_count=\"%ld\"",
+ ss->spot_count, ss->BASE_COUNT));
+ OUTMSG((" base_count_bio=\"%ld\"", ss->BIO_BASE_COUNT));
+ if (ss->CMP_BASE_COUNT > 0) {
+ OUTMSG((" cmp_base_count=\"%ld\"",
+ ss->CMP_BASE_COUNT));
+ }
+ BAM_HEADER_RG_print_xml(&ss->BAM_HEADER);
+ OUTMSG(("/>\n"));
+ }
+ }
+ else {
+ OUTMSG(("%s|%s|%ld:%ld:%ld|:|:|:\n",
+ pb->table_path, spot_group, ss->spot_count,
+ ss->BASE_COUNT, ss->BIO_BASE_COUNT));
+ }
+ }
+ pb->total.spot_count += ss->spot_count;
+ pb->total.BASE_COUNT += ss->BASE_COUNT;
+ pb->total.BIO_BASE_COUNT += ss->BIO_BASE_COUNT;
+ pb->total.total_cmp_len += ss->CMP_BASE_COUNT;
+ }
+ }
+ else {
+ if (!pb->xml && !(pb->quick && pb->skip_members)) {
+ const char* spot_group = "";
+ OUTMSG(("%s|%s|%ld:%ld:%ld|:|:|:\n",
+ pb->table_path, spot_group, meta->table.spot_count,
+ meta->table.BASE_COUNT, meta->table.BIO_BASE_COUNT));
+ }
+ pb->total.spot_count = meta->table.spot_count;
+ pb->total.BASE_COUNT = meta->table.BASE_COUNT;
+ pb->total.BIO_BASE_COUNT = meta->table.BIO_BASE_COUNT;
+ pb->total.total_cmp_len = meta->table.CMP_BASE_COUNT;
+ }
+}
+
+static
+void CC srastat_print( BSTNode* n, void* data )
+{
+ srastat_parms *pb = (srastat_parms*) data;
+ const SraStats *ss = (const SraStats*) n;
+ assert(pb && ss);
+ if (!pb->skip_members) {
+ if (pb->xml) {
+ if (pb->hasSPOT_GROUP) {
+ OUTMSG((" <Member member_name=\"%s\"", ss->spot_group));
+ OUTMSG((" spot_count=\"%ld\" base_count=\"%ld\"", ss->spot_count, ss->total_len));
+ OUTMSG((" base_count_bio=\"%ld\"", ss->bio_len));
+ OUTMSG((" spot_count_mates=\"%ld\" base_count_bio_mates=\"%ld\"", ss->spot_count_mates, ss->bio_len_mates));
+ OUTMSG((" spot_count_bad=\"%ld\" base_count_bio_bad=\"%ld\"", ss->bad_spot_count, ss->bad_bio_len));
+ OUTMSG((" spot_count_filtered=\"%ld\" base_count_bio_filtered=\"%ld\"",
+ ss->filtered_spot_count, ss->filtered_bio_len));
+ if (ss->total_cmp_len > 0)
+ { OUTMSG((" cmp_base_count=\"%ld\"", ss->total_cmp_len)); }
+ BAM_HEADER_RG_print_xml(&ss->BAM_HEADER);
+ OUTMSG(("/>\n"));
+ }
+ }
+ else {
+ OUTMSG(("%s|%s|%ld:%ld:%ld|%ld:%ld|%ld:%ld|%ld:%ld\n",
+ pb->table_path,ss->spot_group,ss->spot_count,ss->total_len,ss->bio_len,ss->spot_count_mates,ss->bio_len_mates,
+ ss->bad_spot_count,ss->bad_bio_len,ss->filtered_spot_count,ss->filtered_bio_len));
+ }
+ }
+ pb->total.spot_count += ss->spot_count;
+ pb->total.spot_count_mates += ss->spot_count_mates;
+ pb->total.BIO_BASE_COUNT += ss->bio_len;
+ pb->total.bio_len_mates += ss->bio_len_mates;
+ pb->total.BASE_COUNT += ss->total_len;
+ pb->total.bad_spot_count += ss->bad_spot_count;
+ pb->total.bad_bio_len += ss->bad_bio_len;
+ pb->total.filtered_spot_count += ss->filtered_spot_count;
+ pb->total.filtered_bio_len += ss->filtered_bio_len;
+ pb->total.total_cmp_len += ss->total_cmp_len;
+}
+
+static
+rc_t process_align_info(const char* indent, const Ctx* ctx)
+{
+ rc_t rc = 0;
+ uint32_t count = 0;
+ int i = 0;
+ const VDBDependencies* dep = NULL;
+
+ assert(indent && ctx);
+
+ if (ctx->db == NULL) {
+ return rc;
+ }
+
+ rc = VDatabaseListDependencies(ctx->db, &dep, false);
+ DISP_RC2(rc, ctx->pb->table_path,
+ "while calling VDatabaseListDependencies");
+
+ rc = VDBDependenciesCount(dep, &count);
+ if (rc) {
+ DISP_RC(rc, "while calling VDBDependenciesCount");
+ return rc;
+ }
+
+
+ OUTMSG(("%s<AlignInfo>\n", indent));
+
+ for (i = 0; i < count && rc == 0; ++i) {
+ bool circular = false;
+ const char* name = NULL;
+ const char* path = NULL;
+ bool local = false;
+ const char* seqId = NULL;
+
+ rc = VDBDependenciesCircular(dep, &circular, i);
+ if (rc != 0) {
+ DISP_RC(rc, "while calling VDBDependenciesCircular");
+ break;
+ }
+ rc = VDBDependenciesName(dep, &name, i);
+ if (rc != 0) {
+ DISP_RC(rc, "while calling VDBDependenciesName");
+ break;
+ }
+ rc = VDBDependenciesPath(dep, &path, i);
+ if (rc != 0) {
+ DISP_RC(rc, "while calling VDBDependenciesPath");
+ break;
+ }
+ rc = VDBDependenciesLocal(dep, &local, i);
+ if (rc != 0) {
+ DISP_RC(rc, "while calling VDBDependenciesLocal");
+ break;
+ }
+ rc = VDBDependenciesSeqId(dep, &seqId, i);
+ if (rc != 0) {
+ DISP_RC(rc, "while calling VDBDependenciesSeqId");
+ break;
+ }
+
+ OUTMSG((
+ "%s <Ref seqId=\"%s\" name=\"%s\" circular=\"%s\" local=\"%s\"",
+ indent, seqId, name, (circular ? "true" : "false"),
+ (local ? "local" : "remote")));
+ if (path && path[0]) {
+ OUTMSG((" path=\"%s\"", path));
+ }
+ OUTMSG(("/>\n"));
+ }
+
+ OUTMSG(("%s</AlignInfo>\n", indent));
+
+ RELEASE(VDBDependencies, dep);
+
+ return rc;
+}
+
+static
+rc_t print_results(const Ctx* ctx)
+{
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+ bool mismatch = false;
+
+ assert(ctx && ctx->pb
+ && ctx->tr && ctx->sizes && ctx->info && ctx->meta && ctx->total);
+
+ if (ctx->pb->quick) {
+ if ( ! ctx->meta -> found )
+ LOGMSG(klogWarn, "Statistics metadata not found");
+ else
+ {
+ ctx->pb->hasSPOT_GROUP = ctx->meta->spotGroupN > 1 ||
+ (ctx->meta->spotGroupN == 1
+ && strcmp("default", ctx->meta->spotGroup[0].spot_group) != 0);
+ }
+ }
+
+ if (ctx->meta->found && ! ctx->pb->quick) {
+/* bool mismatch = false; */
+ SraStats* ss = (SraStats*)BSTreeFind(ctx->tr, "", srastats_cmp);
+ const SraStatsMeta* m = &ctx->meta->table;
+ if (ctx->total->BASE_COUNT != m->BASE_COUNT)
+ { mismatch = true; }
+ if (ctx->total->BIO_BASE_COUNT != m->BIO_BASE_COUNT)
+ { mismatch = true; }
+ if (ctx->total->spot_count != m->spot_count)
+ { mismatch = true; }
+ if (ctx->total->total_cmp_len != m->CMP_BASE_COUNT)
+ { mismatch = true; }
+ if (ss != NULL) {
+ const SraStatsMeta* m = &ctx->meta->table;
+ uint32_t i = 0;
+ for (i = 0; i < ctx->meta->spotGroupN && !mismatch; ++i) {
+ const char* spot_group = "";
+ m = &ctx->meta->spotGroup[i];
+ assert(m);
+ if (strcmp("default", m->spot_group) != 0)
+ { spot_group = m->spot_group; }
+ ss = (SraStats*)BSTreeFind(ctx->tr, spot_group, srastats_cmp);
+ if (ss == NULL) {
+ mismatch = true;
+ break;
+ }
+ if (ss->total_len != m->BASE_COUNT
+ || ss->bio_len != m->BIO_BASE_COUNT
+ || ss->spot_count != m->spot_count
+ || ss->total_cmp_len != m->CMP_BASE_COUNT)
+ {
+ mismatch = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (ctx->pb->xml) {
+ OUTMSG(("<Run accession=\"%s\"", ctx->pb->table_path));
+ if (!ctx->pb->quick || ! ctx->meta->found) {
+ OUTMSG((" read_length=\"%s\"",
+ ctx->pb->variableReadLength ? "variable" : "fixed"));
+ }
+ if (ctx->pb->quick) {
+ OUTMSG((" spot_count=\"%ld\" base_count=\"%ld\"",
+ ctx->meta->table.spot_count, ctx->meta->table.BASE_COUNT));
+ OUTMSG((" base_count_bio=\"%ld\"",
+ ctx->meta->table.BIO_BASE_COUNT));
+ if (ctx->meta->table.CMP_BASE_COUNT > 0) {
+ OUTMSG((" cmp_base_count=\"%ld\"",
+ ctx->meta->table.CMP_BASE_COUNT));
+ }
+ }
+ else {
+ OUTMSG((" spot_count=\"%ld\" base_count=\"%ld\"",
+ ctx->total->spot_count, ctx->total->BASE_COUNT));
+ OUTMSG((" base_count_bio=\"%ld\"", ctx->total->BIO_BASE_COUNT));
+ OUTMSG((" spot_count_mates=\"%ld\" base_count_bio_mates=\"%ld\"",
+ ctx->total->spot_count_mates, ctx->total->bio_len_mates));
+ OUTMSG((" spot_count_bad=\"%ld\" base_count_bio_bad=\"%ld\"",
+ ctx->total->bad_spot_count, ctx->total->bad_bio_len));
+ OUTMSG((
+ " spot_count_filtered=\"%ld\" base_count_bio_filtered=\"%ld\"",
+ ctx->total->filtered_spot_count, ctx->total->filtered_bio_len));
+ if (ctx->total->total_cmp_len > 0) {
+ OUTMSG((" cmp_base_count=\"%ld\"", ctx->total->total_cmp_len));
+ }
+ }
+ OUTMSG((">\n"));
+ }
+ else if (ctx->pb->skip_members) {
+ if (ctx->pb->quick) {
+ OUTMSG(("%s||%ld:%ld:%ld|:|:|:\n",
+ ctx->pb->table_path, ctx->meta->table.spot_count,
+ ctx->meta->table.BASE_COUNT, ctx->meta->table.BIO_BASE_COUNT));
+ }
+ else {
+ OUTMSG(("%s||%ld:%ld:%ld|%ld:%ld|%ld:%ld|%ld:%ld\n",
+ ctx->pb->table_path,
+ ctx->total->spot_count, ctx->total->BASE_COUNT,
+ ctx->total->BIO_BASE_COUNT,
+ ctx->total->spot_count_mates, ctx->total->bio_len_mates,
+ ctx->total->bad_spot_count, ctx->total->bad_bio_len,
+ ctx->total->filtered_spot_count, ctx->total->filtered_bio_len));
+ }
+ }
+
+ if (ctx->pb->quick && ctx->meta->found) {
+ memset(&ctx->pb->total, 0, sizeof ctx->pb->total);
+ rc = parse_bam_header(ctx->db, meta_RG_callback, ctx->meta);
+ srastatmeta_print(ctx->meta, ctx->pb);
+ if (ctx->pb->total.spot_count != ctx->meta->table.spot_count ||
+ ctx->pb->total.BIO_BASE_COUNT != ctx->meta->table.BIO_BASE_COUNT ||
+ ctx->pb->total.BASE_COUNT != ctx->meta->table.BASE_COUNT ||
+ ctx->pb->total.total_cmp_len != ctx->meta->table.CMP_BASE_COUNT)
+ {
+ rc = RC(rcExe, rcData, rcValidating, rcData, rcUnequal);
+ }
+ assert(rc == 0);
+ }
+ else {
+ memset(&ctx->pb->total, 0, sizeof ctx->pb->total);
+ rc = parse_bam_header(ctx->db, tree_RG_callback, ctx->tr);
+ BSTreeForEach(ctx->tr, false, srastat_print, ctx->pb);
+ if (ctx->meta->found) {
+ const SraStatsMeta* m = &ctx->meta->table;
+ if (ctx->pb->total.BASE_COUNT != m->BASE_COUNT
+ || ctx->pb->total.BIO_BASE_COUNT != m->BIO_BASE_COUNT
+ || ctx->pb->total.spot_count != m->spot_count)
+ {
+ mismatch = true;
+ }
+ if (ctx->pb->total.total_cmp_len != m->CMP_BASE_COUNT)
+ { mismatch = true; }
+ }
+ if (ctx->pb->total.spot_count != ctx->total->spot_count ||
+ ctx->pb->total.spot_count_mates != ctx->total->spot_count_mates ||
+ ctx->pb->total.BIO_BASE_COUNT != ctx->total->BIO_BASE_COUNT ||
+ ctx->pb->total.bio_len_mates != ctx->total->bio_len_mates ||
+ ctx->pb->total.BASE_COUNT != ctx->total->BASE_COUNT ||
+ ctx->pb->total.bad_spot_count != ctx->total->bad_spot_count ||
+ ctx->pb->total.bad_bio_len != ctx->total->bad_bio_len ||
+ ctx->pb->total.filtered_spot_count
+ != ctx->total->filtered_spot_count ||
+ ctx->pb->total.filtered_bio_len != ctx->total->filtered_bio_len ||
+ ctx->pb->total.total_cmp_len != ctx->total->total_cmp_len)
+ {
+ rc = RC(rcExe, rcData, rcValidating, rcData, rcUnequal);
+ }
+ assert(rc == 0);
+ }
+
+ if (ctx->pb->xml) {
+ if (ctx->sizes) {
+ OUTMSG((" <Size value=\"%lu\" units=\"bytes\"/>\n",
+ ctx->sizes->size));
+ }
+ if (ctx->pb->printMeta && ctx->info->tblVersion >= 0) {
+ OUTMSG((" <Table vers=\"%d\">\n <Meta vers=\"%d\">\n",
+ ctx->info->tblVersion, ctx->info->metaVersion));
+ if (ctx->info->formatter.name[0] || ctx->info->formatter.vers[0] ||
+ ctx->info->loader.date[0] || ctx->info->loader.name[0] ||
+ ctx->info->loader.vers[0])
+ {
+ OUTMSG((" <SOFTWARE>\n"));
+ if (ctx->info->formatter.name[0] ||
+ ctx->info->formatter.vers[0])
+ {
+ OUTMSG((" <formatter"));
+ if (ctx->info->formatter.name[0])
+ { OUTMSG((" name=\"%s\"", ctx->info->formatter.name)); }
+ if (ctx->info->formatter.vers[0])
+ { OUTMSG((" vers=\"%s\"", ctx->info->formatter.vers)); }
+ OUTMSG(("/>\n"));
+ }
+ if (ctx->info->loader.date[0] || ctx->info->loader.name[0] ||
+ ctx->info->loader.vers[0])
+ {
+ OUTMSG((" <loader"));
+ if (ctx->info->loader.date[0])
+ { OUTMSG((" date=\"%s\"", ctx->info->loader.date)); }
+ if (ctx->info->loader.name[0])
+ { OUTMSG((" name=\"%s\"", ctx->info->loader.name)); }
+ if (ctx->info->loader.vers[0])
+ { OUTMSG((" vers=\"%s\"", ctx->info->loader.vers)); }
+ OUTMSG(("/>\n"));
+ }
+ OUTMSG((" </SOFTWARE>\n"));
+ }
+ if (ctx->info->loadTimestamp) {
+ char buf[80];
+ struct tm* ts = localtime(&ctx->info->loadTimestamp);
+ strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", ts);
+ OUTMSG((" <LOAD timestamp=\"%lX\">%s</LOAD>\n",
+ ctx->info->loadTimestamp, buf));
+ }
+ OUTMSG((" </Meta>\n </Table>\n"));
+ }
+ if (rc == 0 && !ctx->pb->quick) {
+ rc2 = BasesPrint(&ctx->total->bases_count,
+ ctx->total->BASE_COUNT, " ");
+ }
+ if (rc == 0 && !ctx->pb->skip_alignment) {
+ rc = process_align_info(" ", ctx);
+ }
+ if (rc == 0 && ctx->pb->statistics) {
+ rc = SraStatsTotalPrintStatistics(ctx->total, " ", ctx->pb->test);
+ }
+ if (rc == 0 && ctx->pb->print_arcinfo) {
+ const ArcInfo* a = ctx->arc_info;
+ uint32_t i;
+ char b[1024];
+ time_t ts = a->timestamp;
+ struct tm* tm = localtime(&ts);
+
+ if( tm == NULL ) {
+ rc = RC(rcExe, rcData, rcReading, rcParam, rcInvalid);
+ }
+ else {
+ size_t k = strftime(b, sizeof(b), "%Y-%m-%dT%H:%M:%S", tm);
+ OUTMSG((" <Archive timestamp=\"%.*s\"", k, b));
+ for(i = 0; i < sizeof(a->i) / sizeof(a->i[0]); i++) {
+ OUTMSG((" size.%s=\"%lu\" md5.%s=\"%s\"",
+ a->i[i].tag, a->i[i].size, a->i[i].tag, a->i[i].md5));
+ }
+ OUTMSG((" />\n"));
+ }
+ }
+ if (rc == 0)
+ { rc = QualityStatsPrint(&ctx->quality, " "); }
+ if (rc == 0)
+ { rc = TableCountsPrint(&ctx->tables, " "); }
+ OUTMSG(("</Run>\n"));
+ }
+ if (mismatch && ctx->pb->start == 0 && ctx->pb->stop == 0) {
+ /* check mismatch just when no --start, --stop specified */
+ LOGMSG(klogWarn,
+ "Mismatch between calculated and recorded statistics");
+ }
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ return rc;
+}
+
+static
+void CC bst_whack_free ( BSTNode *n, void *ignore )
+{
+ SraStats* ss = (SraStats*)n;
+ BAM_HEADER_RG_free(&ss->BAM_HEADER);
+ free(ss);
+}
+
+static
+int64_t CC srastats_sort ( const BSTNode *item, const BSTNode *n )
+{
+ const SraStats *ss = ( const SraStats* ) item;
+ return srastats_cmp(ss->spot_group,n);
+}
+
+static rc_t sra_stat(srastat_parms* pb, BSTree* tr,
+ SraStatsTotal* total, const VTable *vtbl)
+{
+ rc_t rc = 0;
+
+ const VCursor *curs = NULL;
+
+/* const char CMP_READ [] = "CMP_READ"; */
+ const char PRIMARY_ALIGNMENT_ID[] = "PRIMARY_ALIGNMENT_ID";
+ const char RD_FILTER [] = "RD_FILTER";
+ const char READ_LEN [] = "READ_LEN";
+ const char READ_TYPE [] = "READ_TYPE";
+ const char SPOT_GROUP[] = "SPOT_GROUP";
+
+ uint32_t idxPRIMARY_ALIGNMENT_ID = 0;
+ uint32_t idxRD_FILTER = 0;
+ uint32_t idxREAD_LEN = 0;
+ uint32_t idxREAD_TYPE = 0;
+ uint32_t idxSPOT_GROUP = 0;
+
+ int g_nreads = 0;
+ int64_t n_spots = 0;
+ int64_t start = 0;
+ int64_t stop = 0;
+
+ /* filled with dREAD_LEN[i] for (spotid == start);
+ used to check fixedReadLength */
+ uint64_t g_totalREAD_LEN[MAX_NREADS];
+ uint64_t g_nonZeroLenReads[MAX_NREADS];
+ memset(g_totalREAD_LEN, 0, sizeof g_totalREAD_LEN);
+ memset(g_nonZeroLenReads, 0, sizeof g_nonZeroLenReads);
+
+ rc = VTableCreateCachedCursorRead(vtbl, &curs, DEFAULT_CURSOR_CAPACITY);
+ DISP_RC(rc, "Cannot VTableCreateCachedCursorRead");
+
+ if (rc == 0) {
+ rc = VCursorPermitPostOpenAdd(curs);
+ DISP_RC(rc, "Cannot VCursorPermitPostOpenAdd");
+ }
+
+ if (rc == 0) {
+ rc = VCursorOpen(curs);
+ DISP_RC(rc, "Cannot VCursorOpen");
+ }
+
+ assert(pb && vtbl && tr && total);
+
+ if (rc == 0) {
+ const char* name = READ_LEN;
+ rc = VCursorAddColumn(curs, &idxREAD_LEN, "%s", name);
+ DISP_RC2(rc, name, "while calling VCursorAddColumn");
+ }
+ if (rc == 0) {
+ const char* name = READ_TYPE;
+ rc = VCursorAddColumn(curs, &idxREAD_TYPE, "%s", name);
+ DISP_RC2(rc, name, "while calling VCursorAddColumn");
+ }
+
+ if (rc == 0) {
+ {
+ const char* name = SPOT_GROUP;
+ rc = VCursorAddColumn(curs, &idxSPOT_GROUP, "%s", name);
+ if (columnUndefined(rc)) {
+ idxSPOT_GROUP = 0;
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling VCursorAddColumn");
+ }
+ if (rc == 0) {
+ if (rc == 0) {
+ const char* name = RD_FILTER;
+ rc = VCursorAddColumn(curs, &idxRD_FILTER, "%s", name);
+ if (columnUndefined(rc)) {
+ idxRD_FILTER = 0;
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling VCursorAddColumn");
+ }
+/* if (rc == 0) {
+ const char* name = CMP_READ;
+ rc = SRATableOpenColumnRead
+ (tbl, &cCMP_READ, name, "INSDC:dna:text");
+ if (GetRCState(rc) == rcNotFound)
+ { rc = 0; }
+ DISP_RC2(rc, name, "while calling SRATableOpenColumnRead");
+ } */
+ if (rc == 0) {
+ const char* name = PRIMARY_ALIGNMENT_ID;
+ rc = VCursorAddColumn(curs, &idxPRIMARY_ALIGNMENT_ID,
+ "%s", name);
+ if (columnUndefined(rc)) {
+ idxPRIMARY_ALIGNMENT_ID = 0;
+ rc = 0;
+ }
+ DISP_RC2(rc, name, "while calling VCursorAddColumn");
+ }
+ if (rc == 0) {
+ int64_t first = 0;
+ uint64_t count = 0;
+ int64_t spotid;
+ pb->hasSPOT_GROUP = 0;
+ rc = VCursorIdRange(curs, 0, &first, &count);
+ DISP_RC(rc, "VCursorIdRange() failed");
+ if (rc == 0) {
+ rc = BasesInit(&total->bases_count, vtbl);
+ }
+ if (rc == 0) {
+ const KLoadProgressbar *pr = NULL;
+ bool bad_read_filter = false;
+ bool fixedNReads = true;
+ bool fixedReadLength = true;
+
+ uint32_t g_dREAD_LEN[MAX_NREADS];
+
+ memset(g_dREAD_LEN, 0, sizeof g_dREAD_LEN);
+
+ if (pb->start > 0) {
+ start = pb->start;
+ if (start < first) {
+ start = first;
+ }
+ }
+ else {
+ start = first;
+ }
+
+ if (pb->stop > 0) {
+ stop = pb->stop;
+ if (stop > first + count) {
+ stop = first + count;
+ }
+ }
+ else {
+ stop = first + count;
+ }
+
+ for (spotid = start; spotid < stop && rc == 0; ++spotid) {
+ SraStats* ss;
+ uint32_t dREAD_LEN [MAX_NREADS];
+ uint8_t dREAD_TYPE [MAX_NREADS];
+ uint8_t dRD_FILTER [MAX_NREADS];
+ char dSPOT_GROUP[MAX_NREADS] = "NULL";
+
+ const void* base;
+ bitsz_t boff, row_bits;
+ int nreads;
+
+ rc = Quitting();
+ if (rc != 0) {
+ LOGMSG(klogWarn, "Interrupted");
+ }
+
+ if (rc == 0 && pb->progress && pr == NULL) {
+ rc = KLoadProgressbar_Make(&pr, stop + 1 - start);
+ if (rc != 0) {
+ DISP_RC(rc, "cannot initialize progress bar");
+ rc = 0;
+ pr = NULL;
+ }
+ else if (stop - start > 99) {
+ KLoadProgressbar_Process(pr, 0, true);
+ }
+ }
+
+ if (rc == 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idxREAD_LEN, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, READ_LEN, spotid,
+ "while calling VCursorColumnRead");
+ }
+ if (rc == 0) {
+ if (boff & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcOffset, rcInvalid);
+ }
+ if (row_bits & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcSize, rcInvalid);
+ }
+ if ((row_bits >> 3) > sizeof(dREAD_LEN)) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcBuffer, rcInsufficient);
+ }
+ DISP_RC_Read(rc, READ_LEN, spotid,
+ "after calling VCursorColumnRead");
+ }
+ if (rc == 0) {
+ int i, bio_len, bio_count, bad_cnt, filt_cnt;
+ memmove(dREAD_LEN,
+ ((const char*)base) + (boff>>3), row_bits >> 3);
+ nreads = (row_bits >> 3) / sizeof(*dREAD_LEN);
+ if (spotid == start) {
+ g_nreads = nreads;
+ if (pb->statistics) {
+ rc = SraStatsTotalMakeStatistics
+ (total, g_nreads);
+ }
+ }
+ else if (g_nreads != nreads) {
+ fixedNReads = false;
+ }
+
+ if (rc == 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idxREAD_TYPE, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, READ_TYPE, spotid,
+ "while calling VCursorColumnRead");
+ if (rc == 0) {
+ if (boff & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcOffset, rcInvalid);
+ }
+ if (row_bits & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcSize, rcInvalid);
+ }
+ if ((row_bits >> 3) > sizeof(dREAD_TYPE)) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcBuffer, rcInsufficient);
+ }
+ if ((row_bits >> 3) != nreads) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcData, rcIncorrect);
+ }
+ DISP_RC_Read(rc, READ_TYPE, spotid,
+ "after calling VCursorColumnRead");
+ }
+ }
+ if (rc == 0) {
+ memmove(dREAD_TYPE,
+ ((const char*)base) + (boff >> 3),
+ row_bits >> 3);
+ if (idxSPOT_GROUP != 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idxSPOT_GROUP, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, SPOT_GROUP, spotid,
+ "while calling VCursorColumnRead");
+ if (rc == 0) {
+ if (row_bits > 0) {
+ if (boff & 7) {
+ rc = RC(rcExe, rcColumn,
+ rcReading,
+ rcOffset, rcInvalid);
+ }
+ if (row_bits & 7) {
+ rc = RC(rcExe, rcColumn,
+ rcReading,
+ rcSize, rcInvalid); }
+ if ((row_bits >> 3)
+ > sizeof(dSPOT_GROUP))
+ {
+ rc = RC(rcExe, rcColumn,
+ rcReading,
+ rcBuffer, rcInsufficient);
+ }
+ DISP_RC_Read(rc, SPOT_GROUP, spotid,
+ "after calling VCursorColumnRead"
+ );
+ if (rc == 0) {
+ int n = row_bits >> 3;
+ memmove(dSPOT_GROUP,
+ ((const char*)base)+(boff>>3),
+ row_bits>>3);
+ dSPOT_GROUP[n]='\0';
+ if (n > 1 ||
+ (n == 1 && dSPOT_GROUP[0]))
+ {
+ pb -> hasSPOT_GROUP = 1;
+ }
+ }
+ }
+ else {
+ dSPOT_GROUP[0]='\0';
+ }
+ }
+ else {
+ break;
+ }
+ }
+ }
+ if (rc == 0) {
+ uint64_t cmp_len = 0; /* CMP_READ */
+ if (idxRD_FILTER != 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idxRD_FILTER, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, RD_FILTER, spotid,
+ "while calling VCursorColumnRead");
+ if (rc == 0) {
+ int size = row_bits >> 3;
+ if (boff & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcOffset, rcInvalid); }
+ if (row_bits & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcSize, rcInvalid);
+ }
+ if (size > sizeof dRD_FILTER) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcBuffer, rcInsufficient);
+ }
+ DISP_RC_Read(rc, RD_FILTER, spotid,
+ "after calling VCursorColumnRead");
+ if (rc == 0) {
+ memmove(dRD_FILTER,
+ ((const char*)base) + (boff>>3),
+ size);
+ if (size < nreads) {
+ /* RD_FILTER is expected to have nreads elements */
+ if (size == 1) {
+ /* fill all RD_FILTER elements with RD_FILTER[0] */
+ int i = 0;
+ for (i = 1; i < nreads;
+ ++i)
+ {
+ memmove(dRD_FILTER + i,
+ ((const char*)base)+(boff>>3),
+ 1);
+ }
+ if
+ (!bad_read_filter)
+ {
+ bad_read_filter = true;
+ PLOGMSG(klogWarn,
+ (klogWarn,
+ "RD_FILTER column size is 1 but it is expected to be $(n)",
+ "n=%d", nreads));
+ }
+ }
+ else {
+ /* something really bad with RD_FILTER column:
+ let's pretend it does not exist */
+ idxRD_FILTER = 0;
+ bad_read_filter = true;
+ PLOGMSG(klogWarn,
+ (klogWarn,
+ "RD_FILTER column size is $(real) but it is expected to be $(exp)",
+ "real=%d,exp=%d",
+ size, nreads));
+ }
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+ if (idxPRIMARY_ALIGNMENT_ID != 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idxPRIMARY_ALIGNMENT_ID,
+ &base, &boff, &row_bits);
+ DISP_RC_Read(rc, PRIMARY_ALIGNMENT_ID,
+ spotid,
+ "while calling VCursorColumnRead");
+ if (boff & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcOffset, rcInvalid); }
+ if (row_bits & 7) {
+ rc = RC(rcExe, rcColumn, rcReading,
+ rcSize, rcInvalid);
+ }
+ DISP_RC_Read(rc, PRIMARY_ALIGNMENT_ID,
+ spotid,
+ "after calling calling VCursorColumnRead"
+ );
+ if (rc == 0) {
+ int i = 0;
+ const int64_t* pii = base;
+ assert(nreads);
+ for (i = 0; i < nreads; ++i) {
+ if (pii[i] == 0) {
+ cmp_len += dREAD_LEN[i];
+ }
+ }
+ }
+ }
+/* if (cCMP_READ) {
+ rc = SRAColumnRead(cCMP_READ, spotid, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, CMP_READ, spotid, "while calling SRAColumnRead");
+ if (boff & 7)
+ { rc = RC(rcExe, rcColumn, rcReading, rcOffset, rcInvalid); }
+ if (row_bits & 7)
+ { rc = RC(rcExe, rcColumn, rcReading, rcSize, rcInvalid); }
+ DISP_RC_Read(rc, CMP_READ, spotid, "after calling calling SRAColumnRead");
+ if (rc == 0)
+ { assert(cmp_len == row_bits >> 3); }
+ } */
+
+ ss = (SraStats*)BSTreeFind
+ (tr, dSPOT_GROUP, srastats_cmp);
+ if (ss == NULL) {
+ ss = calloc(1, sizeof(*ss));
+ if (ss == NULL) {
+ rc = RC(rcExe, rcStorage, rcAllocating,
+ rcMemory, rcExhausted);
+ break;
+ }
+ else {
+ strcpy(ss->spot_group, dSPOT_GROUP);
+ BSTreeInsert
+ (tr, (BSTNode*)ss, srastats_sort);
+ }
+ }
+ ++ss->spot_count;
+ ++total->spot_count;
+
+ ss->total_cmp_len += cmp_len;
+ total->total_cmp_len += cmp_len;
+
+ BasesAdd(&total->bases_count, spotid);
+
+ if (pb->statistics) {
+ SraStatsTotalAdd(total, dREAD_LEN, nreads);
+ }
+ for (bio_len = bio_count = i = bad_cnt
+ = filt_cnt = 0;
+ (i < nreads) && (rc == 0); i++)
+ {
+ if (dREAD_LEN[i] > 0) {
+ g_totalREAD_LEN[i] += dREAD_LEN[i];
+ ++g_nonZeroLenReads[i];
+ }
+ if (spotid == start) {
+ g_dREAD_LEN[i] = dREAD_LEN[i];
+ }
+ else if (g_dREAD_LEN[i] != dREAD_LEN[i]) {
+ fixedReadLength = false;
+ }
+
+ if (dREAD_LEN[i] > 0) {
+ bool biological = false;
+ ss->total_len += dREAD_LEN[i];
+ total->BASE_COUNT += dREAD_LEN[i];
+ if ((dREAD_TYPE[i]
+ & SRA_READ_TYPE_BIOLOGICAL) != 0)
+ {
+ biological = true;
+ bio_len += dREAD_LEN[i];
+ bio_count++;
+ }
+ if (idxRD_FILTER != 0) {
+ switch (dRD_FILTER[i]) {
+ case SRA_READ_FILTER_PASS:
+ break;
+ case SRA_READ_FILTER_REJECT:
+ case SRA_READ_FILTER_CRITERIA:
+ if (biological) {
+ ss->bad_bio_len
+ += dREAD_LEN[i];
+ total->bad_bio_len
+ += dREAD_LEN[i];
+ }
+ bad_cnt++;
+ break;
+ case SRA_READ_FILTER_REDACTED:
+ if (biological) {
+ ss->filtered_bio_len
+ += dREAD_LEN[i];
+ total->filtered_bio_len
+ += dREAD_LEN[i];
+ }
+ filt_cnt++;
+ break;
+ default:
+ rc = RC(rcExe, rcColumn,
+ rcReading,
+ rcData, rcUnexpected);
+ PLOGERR(klogInt,
+ (klogInt, rc,
+ "spot=$(spot), read=$(read), READ_FILTER=$(val)", "spot=%lu,read=%d,val=%d",
+ spotid, i,
+ dRD_FILTER[i]));
+ break;
+ }
+ }
+ }
+ }
+ ss->bio_len += bio_len;
+ total->BIO_BASE_COUNT += bio_len;
+ if (bio_count > 1) {
+ ++ss->spot_count_mates;
+ ++total->spot_count_mates;
+ ss->bio_len_mates += bio_len;
+ total->bio_len_mates += bio_len;
+ }
+ if (bad_cnt) {
+ ss->bad_spot_count++;
+ total->bad_spot_count++;
+ }
+ if (filt_cnt) {
+ ss->filtered_spot_count++;
+ total->filtered_spot_count++;
+ }
+ }
+
+ if (rc == 0 && pb->progress) {
+ KLoadProgressbar_Process(pr, 1, false);
+ }
+ }
+ } /* for (spotid = start; spotid <= stop && rc == 0;
+ ++spotid) */
+
+ if (rc == 0) {
+ BasesFinalize(&total->bases_count);
+ pb->variableReadLength = !fixedReadLength;
+
+ /* --- g_totalREAD_LEN[i] is sum(READ_LEN[i]) for all spots --- */
+ if (fixedNReads) {
+ int i = 0;
+ if (stop >= start) {
+ n_spots = stop - start;
+ }
+ if (n_spots > 0) {
+ for (i = 0; i < g_nreads && rc == 0; ++i) {
+ if (fixedReadLength) {
+ assert(g_totalREAD_LEN[i] / n_spots
+ == g_dREAD_LEN[i]);
+ }
+ }
+ }
+ }
+ }
+ if (rc == 0) {
+ KLoadProgressbar_Release(pr, true);
+ pr = NULL;
+ }
+ }
+ }
+ }
+ }
+
+ RELEASE(VCursor, curs);
+
+ if (pb->test && rc == 0) {
+ uint32_t idx = 0;
+ int i = 0;
+ int64_t spotid = 0;
+
+ double average[MAX_NREADS];
+ double diff_sq[MAX_NREADS];
+ SraStatsTotalStatistics2Init(total,
+ g_nreads, g_totalREAD_LEN, g_nonZeroLenReads);
+ memset(diff_sq, 0, sizeof diff_sq);
+ for (i = 0; i < g_nreads; ++i) {
+ average[i] = (double)g_totalREAD_LEN[i] / n_spots;
+ }
+
+ rc = VTableCreateCachedCursorRead(vtbl, &curs, DEFAULT_CURSOR_CAPACITY);
+ DISP_RC(rc, "Cannot VTableCreateCachedCursorRead");
+
+ if (rc == 0) {
+ const char* name = READ_LEN;
+ rc = VCursorAddColumn(curs, &idx, "%s", name);
+ DISP_RC(rc, "Cannot VCursorAddColumn(READ_LEN)");
+ if (rc == 0) {
+ rc = VCursorOpen(curs);
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt,
+ rc, "Cannot VCursorOpen($(name))", "name=%s", name));
+ }
+ }
+ }
+
+ for (spotid = start; spotid < stop && rc == 0; ++spotid) {
+ uint32_t dREAD_LEN[MAX_NREADS];
+ const void* base;
+ bitsz_t boff, row_bits;
+ if (rc == 0) {
+ rc = VCursorColumnRead(curs, spotid,
+ idx, &base, &boff, &row_bits);
+ DISP_RC_Read(rc, READ_LEN, spotid,
+ "while calling VCursorColumnRead");
+ }
+ if (rc == 0) {
+ memmove(dREAD_LEN, ((const char*)base) + (boff>>3), row_bits>>3);
+ }
+ for (i = 0; i < g_nreads; ++i) {
+ diff_sq[i] +=
+ (dREAD_LEN[i] - average[i]) * (dREAD_LEN[i] - average[i]);
+ }
+ SraStatsTotalAdd2(total, dREAD_LEN);
+ }
+ RELEASE(VCursor, curs);
+ }
+
+ return rc;
+}
+
+static
+void CtxRelease(Ctx* ctx)
+{
+ assert(ctx);
+
+ QualityStatsRelease(&ctx->quality);
+ TableCountsRelease(&ctx->tables);
+
+ memset(ctx, 0, sizeof *ctx);
+}
+static
+rc_t run(srastat_parms* pb)
+{
+ rc_t rc = 0;
+ const VDBManager* vmgr = NULL;
+
+ assert(pb && pb->table_path);
+
+ rc = VDBManagerMakeRead(&vmgr, NULL);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "failed to open VDBManager");
+ }
+ else {
+ SraSizeStats sizes;
+ ArcInfo arc_info;
+ SraMeta info;
+ const VTable* vtbl = NULL;
+
+ VSchema *schema = NULL;
+
+ rc = VDBManagerMakeSRASchema(vmgr, &schema);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "cannot VDBManagerMakeSRASchema");
+ }
+ if (rc == 0) {
+ rc = VDBManagerOpenTableRead(vmgr, &vtbl,
+ schema, "%s", pb->table_path);
+ if (rc != 0 && GetRCObject(rc) == (enum RCObject)rcTable
+ && GetRCState (rc) == rcIncorrect)
+ {
+ const char altname[] = "SEQUENCE";
+ const VDatabase *db = NULL;
+ rc_t rc2 = VDBManagerOpenDBRead(vmgr,
+ &db, schema, pb->table_path);
+ if (rc2 == 0) {
+ rc2 = VDatabaseOpenTableRead(db, &vtbl, "%s", altname);
+ if (rc2 == 0) {
+ rc = 0;
+ }
+ }
+ VDatabaseRelease ( db );
+ }
+ if (rc != 0) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "'$(spec)'", "spec=%s", pb->table_path));
+ }
+ }
+ if (rc == 0) {
+ MetaDataStats stats;
+ SraStatsTotal total;
+ const KTable* ktbl = NULL;
+ const KMetadata* meta = NULL;
+ const VDatabase* db = NULL;
+
+ BSTree tr;
+ Ctx ctx;
+
+ BSTreeInit(&tr);
+ memset(&ctx, 0, sizeof ctx);
+
+ memset(&total, 0, sizeof total);
+
+ rc = VTableOpenKTableRead(vtbl, &ktbl);
+ DISP_RC(rc, "While calling VTableOpenKTableRead");
+ if (rc == 0) {
+ rc = KTableOpenMetadataRead(ktbl, &meta);
+ DISP_RC(rc, "While calling KTableOpenMetadataRead");
+ }
+ if (rc == 0) {
+ rc = VTableOpenParentRead(vtbl, &db);
+ DISP_RC2(rc, pb->table_path,
+ "while calling VTableOpenParentRead");
+ }
+ if (rc == 0) {
+ rc = get_stats_meta(meta, &stats, pb->quick);
+ if (rc == 0) {
+ if (pb->quick && !stats.found) {
+ LOGMSG(klogWarn, "Statistics metadata not found: "
+ "performing full table scan");
+ pb->quick = false;
+ }
+ }
+ rc = 0;
+ }
+ if (rc == 0) {
+ rc = get_size(&sizes, vtbl);
+ }
+ if (rc == 0 && pb->printMeta) {
+ rc = get_load_info(meta, &info);
+ }
+ if (rc == 0 && !pb->quick) {
+ rc = sra_stat(pb, &tr, &total, vtbl);
+ }
+ if (rc == 0 && pb->print_arcinfo ) {
+ rc = get_arc_info(pb->table_path, &arc_info, vmgr, vtbl);
+ }
+ if (rc == 0) {
+ rc = QualityStatsRead(&ctx.quality, meta);
+ if (rc == 0) {
+ QualityStatsSort(&ctx.quality);
+ }
+ }
+ if (rc == 0) {
+ rc = TableCountsRead(&ctx.tables, db);
+ if (rc == 0) {
+ TableCountsSort(&ctx.tables);
+ }
+ }
+ if (rc == 0) {
+ ctx.db = db;
+ ctx.info = &info;
+ ctx.meta = &stats;
+ ctx.pb = pb;
+ ctx.sizes = &sizes;
+ ctx.total = &total;
+ ctx.arc_info = &arc_info;
+ ctx.tr = &tr;
+ rc = print_results(&ctx);
+ }
+ BSTreeWhack(&tr, bst_whack_free, NULL);
+ SraStatsTotalFree(&total);
+ RELEASE(VDatabase, db);
+ RELEASE(KTable, ktbl);
+ {
+ int i;
+ for (i = 0; i < stats.spotGroupN; ++i) {
+ SraStatsMetaDestroy(&stats.spotGroup[i]);
+ }
+
+ SraStatsMetaDestroy(&stats.table);
+
+ free(stats.spotGroup);
+ stats.spotGroup = NULL;
+ }
+ CtxRelease(&ctx);
+ RELEASE(KMetadata, meta);
+ }
+ RELEASE(VSchema, schema);
+ RELEASE(VTable, vtbl);
+ }
+
+ RELEASE(VDBManager, vmgr);
+
+ return rc;
+}
+
+/* Usage */
+#define ALIAS_ALIGN "a"
+#define OPTION_ALIGN "alignment"
+
+#define ALIAS_ARCINFO NULL
+#define OPTION_ARCINFO "archive-info"
+
+#define ALIAS_START "b"
+#define OPTION_START "start"
+
+#define ALIAS_STOP "e"
+#define OPTION_STOP "stop"
+
+#define ALIAS_SPT_D "d"
+#define OPTION_SPT_D "spot-desc"
+
+#define ALIAS_META "m"
+#define OPTION_META "meta"
+
+#define ALIAS_MEMBR NULL
+#define OPTION_MEMBR "member-stats"
+
+#define ALIAS_PROGRESS "p"
+#define OPTION_PROGRESS "show_progress"
+
+#define ALIAS_QUICK "q"
+#define OPTION_QUICK "quick"
+
+#define ALIAS_STATS "s"
+#define OPTION_STATS "statistics"
+
+#define ALIAS_TEST "t"
+#define OPTION_TEST "test"
+
+#define ALIAS_XML "x"
+#define OPTION_XML "xml"
+
+static const char * align_usage[] = { "print alignment info, default is on"
+ , NULL };
+static const char * spt_d_usage[] = { "print table spot descriptor", NULL };
+static const char * membr_usage[] = { "print member stats, default is on"
+ , NULL };
+static const char *progress_usage[] = { "show the percentage of completion"
+ , NULL };
+static const char * meta_usage[] = { "print load metadata", NULL };
+static const char * start_usage[] = { "starting spot id, default is 1", NULL };
+static const char * stop_usage[] = { "ending spot id, default is max", NULL };
+static const char * stats_usage[] = {
+ "calculate READ_LEN average and standard deviation", NULL };
+static const char * quick_usage[] = {
+ "quick mode: get statistics from metadata;", "do not scan the table", NULL };
+static const char * test_usage[] = {
+ "test READ_LEN average and standard deviation calculation", NULL };
+static const char * xml_usage[] = { "output as XML, default is text", NULL };
+static const char * arcinfo_usage[] = { "output archive info, default is off"
+ , NULL };
+
+OptDef Options[] = {
+ { OPTION_ALIGN , ALIAS_ALIGN , NULL, align_usage , 1, true , false }
+ , { OPTION_SPT_D , ALIAS_SPT_D , NULL, spt_d_usage , 1, false, false }
+ , { OPTION_MEMBR , ALIAS_MEMBR , NULL, membr_usage , 1, true , false }
+ , { OPTION_PROGRESS, ALIAS_PROGRESS, NULL, progress_usage, 1, false, false }
+ , { OPTION_ARCINFO , ALIAS_ARCINFO , NULL, arcinfo_usage , 0, false, false }
+ , { OPTION_META , ALIAS_META , NULL, meta_usage , 1, false, false }
+ , { OPTION_QUICK , ALIAS_QUICK , NULL, quick_usage , 1, false, false }
+ , { OPTION_START , ALIAS_START , NULL, start_usage , 1, true, false }
+ , { OPTION_STATS , ALIAS_STATS , NULL, stats_usage , 1, false, false }
+ , { OPTION_STOP , ALIAS_STOP , NULL, stop_usage , 1, true, false }
+ , { OPTION_TEST , ALIAS_TEST , NULL, test_usage , 1, false, false }
+ , { OPTION_XML , ALIAS_XML , NULL, xml_usage , 1, false, false }
+};
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] table\n"
+ "\n"
+ "Summary:\n"
+ " Display table statistics\n"
+ "\n", progname);
+}
+
+const char UsageDefaultName[] = "sra-stat";
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine(ALIAS_XML , OPTION_XML , NULL , xml_usage);
+ HelpOptionLine(ALIAS_START , OPTION_START , "row-id" , start_usage);
+ HelpOptionLine(ALIAS_STOP , OPTION_STOP , "row-id" , stop_usage);
+ HelpOptionLine(ALIAS_META , OPTION_META , NULL , meta_usage);
+ HelpOptionLine(ALIAS_QUICK , OPTION_QUICK , NULL , quick_usage);
+ HelpOptionLine(ALIAS_MEMBR , OPTION_MEMBR , "on | off", membr_usage);
+ HelpOptionLine(ALIAS_ARCINFO , OPTION_ARCINFO , NULL , arcinfo_usage);
+ HelpOptionLine(ALIAS_STATS , OPTION_STATS , NULL , stats_usage);
+ HelpOptionLine(ALIAS_ALIGN , OPTION_ALIGN , "on | off", align_usage);
+ HelpOptionLine(ALIAS_PROGRESS, OPTION_PROGRESS, NULL , progress_usage);
+ XMLLogger_Usage();
+
+ KOutMsg ("\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args* args = NULL;
+ rc_t rc = 0;
+
+ srastat_parms pb;
+ memset(&pb, 0, sizeof pb);
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 2, Options,
+ sizeof Options / sizeof(OptDef), XMLLogger_Args, XMLLogger_ArgsQty);
+ if (rc == 0) {
+ do {
+ uint32_t pcount = 0;
+ const char* pc = NULL;
+
+ {
+ rc = ArgsOptionCount (args, OPTION_START, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount == 1) {
+ rc = ArgsOptionValue (args, OPTION_START, 0, (const void **)&pc);
+ if (rc != 0) {
+ break;
+ }
+
+ pb.start = AsciiToU32 (pc, NULL, NULL);
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_STOP, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+
+ if (pcount == 1) {
+ rc = ArgsOptionValue (args, OPTION_STOP, 0, (const void **)&pc);
+ if (rc != 0) {
+ break;
+ }
+
+ pb.stop = AsciiToU32 (pc, NULL, NULL);
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_XML, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ pb.xml = true;
+ }
+ }
+
+ {
+ rc = ArgsOptionCount (args, OPTION_QUICK, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ pb.quick = true;
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_META, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ pb.printMeta = true;
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_MEMBR, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ const char* v = NULL;
+ rc = ArgsOptionValue (args, OPTION_MEMBR, 0, (const void **)&v);
+ if (rc != 0) {
+ break;
+ }
+ if (!strcmp(v, "off")) {
+ pb.skip_members = true;
+ }
+ }
+ }
+
+ {
+ rc = ArgsOptionCount(args, OPTION_PROGRESS, &pcount);
+ if (rc != 0) {
+ break;
+ }
+ if (pcount > 0) {
+ KLogLevel l = KLogLevelGet();
+ pb.progress = true;
+ rc = ArgsOptionCount(args, OPTION_LOG_LEVEL, &pcount);
+ if (rc == 0) {
+ if (pcount == 0) {
+ if (l < klogInfo) {
+ KLogLevelSet(klogInfo);
+ }
+ }
+ else if (l < klogInfo) {
+ LOGMSG(klogWarn, "log-level was set: "
+ "progress will not be shown");
+ }
+ }
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_ARCINFO, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ pb.print_arcinfo = pcount > 0;
+ }
+
+ {
+ rc = ArgsOptionCount (args, OPTION_ALIGN, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ const char* v = NULL;
+ rc = ArgsOptionValue (args, OPTION_ALIGN, 0, (const void **)&v);
+ if (rc != 0) {
+ break;
+ }
+ if (!strcmp(v, "off")) {
+ pb.skip_alignment = true;
+ }
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_STATS, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ pb.statistics = true;
+ }
+
+
+ rc = ArgsOptionCount (args, OPTION_TEST, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount > 0) {
+ pb.test = pb.statistics = true;
+ }
+ }
+
+ {
+ rc = ArgsParamCount (args, &pcount);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pcount == 0) {
+ MiniUsage (args);
+ exit(1);
+ }
+
+
+ rc = ArgsParamValue (args, 0, (const void **)&pb.table_path);
+ if (rc != 0) {
+ break;
+ }
+
+ if (pb.statistics && (pb.quick || ! pb.xml)) {
+ KOutMsg("\n--" OPTION_STATS
+ " option can be used just in XML NON-QUICK mode\n");
+ MiniUsage (args);
+ exit(1);
+ }
+
+ rc = XMLLogger_Make(&pb.logger, NULL, args);
+ if (rc != 0) {
+ DISP_RC(rc, "cannot initialize XMLLogger");
+ rc = 0;
+ }
+ }
+ } while (0);
+ }
+
+ if (rc == 0) {
+ rc = run(&pb);
+ }
+ else {
+ DISP_RC(rc, "while processing command line");
+ }
+
+ XMLLogger_Release(pb.logger);
+
+ {
+ rc_t rc2 = ArgsWhack(args);
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ return rc;
+}
diff --git a/tools/sra-stat/sra-stat.h b/tools/sra-stat/sra-stat.h
new file mode 100644
index 0000000..1415ae2
--- /dev/null
+++ b/tools/sra-stat/sra-stat.h
@@ -0,0 +1,42 @@
+#ifndef _h_sra_stat_tools_
+#define _h_sra_stat_tools_
+
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/defs.h> /* rc_t */
+
+struct KFile;
+struct VCursor;
+struct VTable;
+
+rc_t CC VCursorColumnRead(const struct VCursor *self, int64_t id,
+ uint32_t idx, const void **base, bitsz_t *offset, bitsz_t *size);
+
+rc_t CC VTableMakeSingleFileArchive(const struct VTable *self,
+ const struct KFile **sfa, bool lightweight);
+
+#endif /* _h_sra_stat_tools_ */
diff --git a/tools/sra-stat/sra.c b/tools/sra-stat/sra.c
new file mode 100644
index 0000000..b68e533
--- /dev/null
+++ b/tools/sra-stat/sra.c
@@ -0,0 +1,446 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+* A couple of function to ease migration from libsra to libvdb use.
+* Maybe could be improved/optimized/removed later.
+*/
+
+#include "sra-stat.h" /* VTableMakeSingleFileArchive_ */
+
+#include <kdb/database.h> /* KDatabase */
+#include <kdb/kdb-priv.h> /* KDatabaseOpenDirectoryRead */
+#include <kdb/table.h> /* KTableRelease */
+
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFile */
+#include <kfs/toc.h> /* KDirectoryOpenTocFileRead */
+
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h> /* LOGERR */
+#include <klib/rc.h>
+#include <klib/vector.h> /* Vector */
+
+#include <vdb/cursor.h> /* VCursor */
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/table.h> /* VTableOpenParentRead */
+#include <vdb/vdb-priv.h> /* VDatabaseOpenKDatabaseRead */
+
+#include <string.h> /* memcmp */
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+/* sfa_sort
+ * reorders list
+ */
+enum sfa_path_type_id {
+ sfa_not_set = -1,
+ sfa_exclude,
+ sfa_non_column,
+ sfa_required,
+ sfa_preferred,
+ sfa_optional
+};
+#if _DEBUGGING
+static const char* sfa_path_type_id[] = {
+ "not_set",
+ "exclude",
+ "non_column",
+ "required",
+ "preferred",
+ "optional"
+};
+#endif
+
+#define MATCH( ptr, str ) \
+ ( (memcmp(ptr, str, sizeof(str) - 2) == 0 && \
+ ((ptr)[sizeof(str) - 2] == '\0' || (ptr)[sizeof(str) - 2] == '/')) \
+ ? (ptr) += sizeof(str) - (((ptr)[sizeof(str) - 2] == '/') ? 1 : 2) \
+ : (const char*) 0)
+
+static
+enum sfa_path_type_id CC sfa_path_type_tbl( const char *path )
+{
+ /* use first character as distinguisher for match */
+ switch ( path [ 0 ] )
+ {
+ case 'c':
+ /* perhaps it's a column */
+ if ( MATCH ( path, "col/" ) )
+ {
+ switch ( path [ 0 ] )
+ {
+ case 'D':
+ if ( MATCH ( path, "DELETION_QV/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "DELETION_TAG/" ) )
+ return sfa_optional;
+ break;
+ case 'H':
+ if ( MATCH ( path, "HOLE_NUMBER/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "HOLE_STATUS/" ) )
+ return sfa_optional;
+ break;
+ case 'I':
+ if ( MATCH ( path, "INTENSITY/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "INSERTION_QV/" ) )
+ return sfa_optional;
+ break;
+ case 'N':
+ if ( MATCH ( path, "NAME_FMT/" ) )
+ return sfa_preferred;
+ if ( MATCH ( path, "NAME/" ) )
+ return sfa_preferred;
+ if ( MATCH ( path, "NOISE/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "NUM_PASSES/" ) )
+ return sfa_optional;
+ break;
+ case 'P':
+ if ( MATCH ( path, "POSITION/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "PRE_BASE_FRAMES/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "PULSE_INDEX/" ) )
+ return sfa_optional;
+ break;
+ case 'Q':
+ if ( MATCH ( path, "QUALITY2/" ) )
+ return sfa_optional;
+ break;
+ case 'S':
+ if ( MATCH ( path, "SIGNAL/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "SPOT_NAME/" ) )
+ return sfa_preferred;
+ if ( MATCH ( path, "SUBSTITUTION_QV/" ) )
+ return sfa_optional;
+ if ( MATCH ( path, "SUBSTITUTION_TAG/" ) )
+ return sfa_optional;
+ break;
+ case 'W':
+ if ( MATCH ( path, "WIDTH_IN_FRAMES/" ) )
+ return sfa_optional;
+ break;
+ case 'X':
+ case 'Y':
+ if ( path [ 1 ] == '/' )
+ return sfa_preferred;
+ break;
+ }
+ }
+ return sfa_required;
+
+ case 'i':
+ /* look for skey index */
+ if ( MATCH ( path, "idx/skey" ) )
+ if ( path [ 0 ] == 0 || strcmp ( path, ".md5" ) == 0 )
+ return sfa_preferred;
+ if ( MATCH ( path, "idx/fuse-" ) )
+ return sfa_exclude;
+ break;
+
+ case 's':
+ /* look for old skey index */
+ if ( MATCH ( path, "skey" ) )
+ if ( path [ 0 ] == 0 || strcmp ( path, ".md5" ) == 0 )
+ return sfa_preferred;
+ break;
+ }
+ /* anything not recognized is non-column required */
+ return sfa_non_column;
+}
+
+static
+enum sfa_path_type_id CC sfa_path_type_db ( const char *path )
+{
+ /* use first character as distinguisher for match */
+ switch ( path [ 0 ] )
+ {
+ case 't':
+ /* perhaps it's a table */
+ if ( MATCH ( path, "tbl/" ) )
+ {
+ switch ( path [ 0 ] )
+ {
+ case 0:
+ return sfa_non_column;
+ case 'S':
+ if ( MATCH ( path, "SEQUENCE/" ) )
+ return sfa_path_type_tbl(path);
+ break;
+ case 'C':
+ if ( MATCH ( path, "CONSENSUS/" ) )
+ return sfa_path_type_tbl(path);
+ break;
+ case 'P':
+ if ( MATCH ( path, "PRIMARY_ALIGNMENT/" ) )
+ return sfa_path_type_tbl(path);
+ break;
+ case 'R':
+ if ( MATCH ( path, "REFERENCE/" ) )
+ return sfa_path_type_tbl(path);
+ break;
+ }
+ /* all other tables are optional */
+ return sfa_optional;
+ }
+ }
+ /* anything not recognized is non-column required */
+ return sfa_non_column;
+}
+
+typedef enum sfa_path_type_id (CC *sfa_path_type_func)( const char *path );
+
+typedef
+struct to_nv_data_struct
+{
+ const KDirectory * d;
+ Vector * v;
+ rc_t rc;
+ sfa_path_type_func path_type;
+} to_nv_data;
+
+/* sfa_filter
+ * if a name is found in list, exclude it
+ */
+#define DEBUG_SORT(msg) DBGMSG (DBG_APP, DBG_FLAG(DBG_APP_0), msg)
+
+typedef struct reorder_t_struct {
+ const char * path;
+ uint64_t size;
+ enum sfa_path_type_id type_id;
+} reorder_t;
+
+static
+void CC to_nv (void * _item, void * _data)
+{
+ const char* path = _item;
+ to_nv_data* data = _data;
+ reorder_t* obj;
+
+ if (data->rc == 0)
+ {
+ obj = malloc (sizeof (*obj));
+ if (obj == NULL)
+ data->rc
+ = RC(rcSRA, rcVector, rcConstructing, rcMemory, rcExhausted);
+ else
+ {
+ rc_t rc = KDirectoryFileSize (data->d, &obj->size, "%s", path);
+ if (rc == 0)
+ {
+ obj->path = path;
+ obj->type_id = data->path_type(path);
+ rc = VectorAppend (data->v, NULL, obj);
+ }
+
+ if (rc)
+ {
+ free (obj);
+ data->rc = rc;
+ }
+ }
+ }
+}
+
+static
+int64_t CC sfa_path_cmp ( const void **_a, const void **_b, void * ignored )
+{
+ const reorder_t * a = *_a;
+ const reorder_t * b = *_b;
+ int ret;
+
+ DEBUG_SORT(("%s enter\t%s %s %lu \t%s %s %lu", __func__,
+ a->path, sfa_path_type_id[a->type_id + 1], a->size,
+ b->path, sfa_path_type_id[b->type_id + 1], b->size));
+
+ ret = a->type_id - b->type_id;
+ if (ret == 0)
+ {
+ if (a->size > b->size)
+ ret = 1;
+ else if (a->size < b->size)
+ ret = -1;
+ else
+ ret = strcmp (a->path, b->path);
+ }
+ DEBUG_SORT(("\t%d\n", ret));
+ return ret;
+}
+
+static
+void CC item_whack (void * item, void * ignored)
+{
+ free (item);
+}
+
+static
+rc_t CC sfa_sort(const KDirectory *dir, Vector *v, sfa_path_type_func func) {
+ /* assume "v" is a vector of paths - hopefully relative to "dir" */
+ Vector nv;
+ to_nv_data data;
+ uint32_t base;
+
+ DEBUG_SORT(("%s enter\n", __func__));
+
+ base = VectorStart (v);
+ VectorInit (&nv, base, VectorLength (v));
+ data.d = dir;
+ data.v = &nv;
+ data.rc = 0;
+ data.path_type = func;
+
+ VectorForEach (v, false, to_nv, &data);
+
+ if(data.rc == 0) {
+ uint32_t idx = 0;
+ uint32_t limit = VectorLength (v) + base;
+
+ VectorReorder(&nv, sfa_path_cmp, NULL);
+
+ for (idx = base; idx < limit; ++idx) {
+ const reorder_t * tmp;
+ void * ignore;
+
+ tmp = VectorGet (&nv, idx);
+ data.rc = VectorSwap (v, idx + base, tmp->path, &ignore);
+ if(data.rc) {
+ break;
+ }
+ }
+ }
+ VectorWhack (&nv, item_whack, NULL);
+ DEBUG_SORT(("%s exit %d %R\n", __func__, data.rc, data.rc));
+ return data.rc;
+}
+
+static rc_t CC sfa_sort_db(const KDirectory *dir, Vector *v) {
+ return sfa_sort(dir, v, sfa_path_type_db);
+}
+
+static
+bool CC sfa_filter(const KDirectory *dir, const char *leaf, void* func)
+{
+ bool ret = true;
+ sfa_path_type_func f = (sfa_path_type_func)func;
+ enum sfa_path_type_id type = f(leaf);
+
+ ret = type >= sfa_non_column;
+ DEBUG_SORT(("%s: %s %s %s\n",
+ __func__, leaf, sfa_path_type_id[type + 1], ret ? "keep" : "drop"));
+ return ret;
+}
+
+static
+bool CC sfa_filter_light(const KDirectory *dir, const char *leaf, void* func)
+{
+ bool ret = true;
+ sfa_path_type_func f = (sfa_path_type_func)func;
+
+ enum sfa_path_type_id type = f(leaf);
+
+ ret = type >= sfa_non_column && type < sfa_optional;
+ DEBUG_SORT(("%s: %s %s %s\n",
+ __func__, leaf, sfa_path_type_id[type + 1], ret ? "keep" : "drop"));
+ return ret;
+}
+
+static rc_t CC sfa_sort_tbl(const KDirectory *dir, Vector *v) {
+ return sfa_sort(dir, v, sfa_path_type_tbl);
+}
+
+rc_t CC VTableMakeSingleFileArchive(const VTable *self,
+ const KFile **sfa, bool lightweight)
+{
+ const VDatabase *db = NULL;
+ rc_t rc = VTableOpenParentRead(self, &db);
+
+ assert(sfa);
+
+ *sfa = NULL;
+
+ if (rc == 0 && db != NULL) {
+ const KDatabase *kdb = NULL;
+ const KDirectory *db_dir = NULL;
+ rc = VDatabaseOpenKDatabaseRead(db, &kdb);
+ DISP_RC(rc, "VDatabaseOpenKDatabaseRead");
+
+ if (rc == 0) {
+ rc = KDatabaseOpenDirectoryRead(kdb, &db_dir);
+ DISP_RC(rc, "KDatabaseOpenDirectoryRead");
+ }
+
+ if (rc == 0) {
+ rc = KDirectoryOpenTocFileRead(db_dir, sfa, sraAlign4Byte,
+ lightweight ? sfa_filter_light : sfa_filter,
+ (void *)sfa_path_type_db, sfa_sort_db);
+ }
+
+ RELEASE(KDirectory, db_dir);
+ RELEASE(KDatabase, kdb);
+ }
+ else {
+ const KTable *ktbl = NULL;
+ rc = VTableOpenKTableRead(self, &ktbl);
+ if (rc == 0) {
+ const KDirectory *tbl_dir = NULL;
+ rc = KTableGetDirectoryRead(ktbl, &tbl_dir);
+ if (rc == 0) {
+ rc = KDirectoryOpenTocFileRead(tbl_dir, sfa, sraAlign4Byte,
+ lightweight ? sfa_filter_light : sfa_filter,
+ (void *)sfa_path_type_tbl, sfa_sort_tbl);
+ KDirectoryRelease( tbl_dir );
+ KTableRelease(ktbl);
+ }
+ }
+ }
+
+ RELEASE(VDatabase, db);
+
+ return rc;
+}
+
+rc_t CC VCursorColumnRead(const VCursor *self, int64_t id,
+ uint32_t idx, const void **base, bitsz_t *offset, bitsz_t *size)
+{
+ uint32_t elem_bits = 0, elem_off = 0, elem_cnt = 0;
+ rc_t rc = VCursorCellDataDirect(self, id, idx,
+ &elem_bits, base, &elem_off, &elem_cnt);
+
+ assert(offset && size);
+
+ if (rc == 0) {
+ *offset = elem_off * elem_bits;
+ *size = elem_cnt * elem_bits;
+ }
+ else {
+ *offset = *size = 0;
+ }
+
+ return rc;
+}
diff --git a/tools/sra/.cvsignore b/tools/sra/.cvsignore
new file mode 100644
index 0000000..29f1a27
--- /dev/null
+++ b/tools/sra/.cvsignore
@@ -0,0 +1 @@
+*.vers.h
diff --git a/tools/sra/Makefile b/tools/sra/Makefile
new file mode 100644
index 0000000..fea3026
--- /dev/null
+++ b/tools/sra/Makefile
@@ -0,0 +1,77 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/sra
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ table-vers
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# table-vers
+#
+TABLE_VERS_SRC = \
+ table-vers
+
+TABLE_VERS_OBJ = \
+ $(addsuffix .$(OBJX),$(TABLE_VERS_SRC))
+
+TABLE_VERS_LIB = \
+ -lkapp \
+ -stk-version \
+ -lncbi-vdb \
+ -lm
+
+$(BINDIR)/table-vers: $(TABLE_VERS_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(TABLE_VERS_LIB)
+
diff --git a/tools/sra/sra-dbcc.c b/tools/sra/sra-dbcc.c
new file mode 100644
index 0000000..e180edb
--- /dev/null
+++ b/tools/sra/sra-dbcc.c
@@ -0,0 +1,435 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+#include <kapp/main.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/container.h>
+#include <klib/debug.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/namelist.h>
+#include <kdb/meta.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+#include <kfs/arc.h>
+#include <kfs/sra.h>
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+rc_t CC Usage ( struct Args const * args ) { return 0; }
+
+static rc_t ValidateColumn(const KColumn *col,
+ const char *name,
+ int64_t start, int64_t stop,
+ int64_t *min, int64_t *max,
+ bool *gapped)
+{
+ rc_t rc;
+ int64_t row;
+ const KColumnBlob *blob;
+
+ for (row = start; (rc = Quitting()) == 0 && row < stop; ) {
+ int64_t first;
+ uint32_t count;
+
+ rc = KColumnOpenBlobRead(col, &blob, row);
+ if (rc == 0) {
+ rc = KColumnBlobIdRange(blob, &first, &count);
+ if (rc == 0)
+ rc = KColumnBlobValidate(blob);
+ rc = KColumnBlobRelease(blob);
+ }
+ if (rc) {
+ PLOGERR(klogErr, (klogErr, rc, "$(column) rows $(start) to $(stop)", PLOG_3(PLOG_S(column), PLOG_I64(start), PLOG_I64(stop)), name, first, first + count));
+ return rc;
+ }
+ if (row != first)
+ *gapped |= true;
+ if (row == start)
+ *min = first;
+ row = first + count;
+ *max = row;
+ }
+ if (row != stop)
+ *gapped |= true;
+ return rc;
+}
+
+static
+rc_t CheckTable(const char path[])
+{
+ rc_t rc;
+ const KDBManager *mgr;
+ bool gapped = false;
+ bool allsame = true;
+ int64_t first_row;
+ int64_t last_row;
+
+ PLOGMSG(klogInfo, (klogInfo, "verifying column data for '$(path)'", PLOG_S(path), path));
+ rc = KDBManagerMakeRead(&mgr, NULL);
+ if (rc == 0) {
+ const KTable* tbl;
+
+ rc = KDBManagerOpenTableRead(mgr, &tbl, "%s", path);
+ if (rc == 0) {
+ KNamelist *names;
+
+ rc = KTableListCol(tbl, &names);
+ if (rc == 0) {
+ uint32_t count;
+ rc = KNamelistCount(names, &count);
+ if (rc == 0) {
+ unsigned i;
+ const char *colname;
+
+ for (i = 0; i != count && rc == 0; ++i) {
+ rc = KNamelistGet(names, i, &colname);
+ if (rc == 0) {
+ const KColumn *kcol;
+
+ rc = KTableOpenColumnRead(tbl, &kcol, "%s", colname);
+ if (rc == 0) {
+ int64_t start;
+ uint64_t rcount;
+ int64_t min;
+ int64_t max;
+
+ rc = KColumnIdRange(kcol, &start, &rcount);
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo, "validating data for column '$(name)'...", PLOG_S(name), colname));
+ rc = ValidateColumn(kcol, colname, start, start + rcount, &min, &max, &gapped);
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo, "data for column '$(name)' ok", PLOG_S(name), colname));
+ if (i == 0) {
+ first_row = min;
+ last_row = max;
+ }
+ else if (first_row != min || last_row != max)
+ allsame = false;
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "data for column '$(name)'", PLOG_S(name), colname));
+ }
+
+ rc = 0;
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KColumn '$(name)'", PLOG_S(name), colname));
+ rc = 0;
+ }
+ KColumnRelease(kcol);
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KColumn '$(name)'", PLOG_S(name), colname));
+ rc = 0;
+ }
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KColumn #$(number)", PLOG_U32(number), (uint32_t)i));
+ rc = 0;
+ }
+ }
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KNamelistCount", ""));
+ }
+ }
+ KTableRelease(tbl);
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KTable '$(name)'", PLOG_S(name), path));
+ }
+ KDBManagerRelease(mgr);
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "KDBManagerMakeRead", ""));
+ }
+ return rc;
+}
+
+typedef struct CheckMD5Node_struct {
+ BSTNode dad;
+ char file[4096];
+ bool md5;
+ uint8_t digest[16];
+} CheckMD5Node;
+
+typedef struct CheckMD5_Data_struct {
+ BSTree files;
+ bool md5;
+ uint8_t digest[16];
+} CheckMD5_Data;
+
+static
+int CC CheckMD5Node_Cmp( const BSTNode *item, const BSTNode *n )
+{
+ return strcmp(((CheckMD5Node*)item)->file, ((CheckMD5Node*)n)->file);
+}
+
+static
+rc_t CC CheckMD5Visitor(const KDirectory *dir, uint32_t type, const char *name, void *data)
+{
+ rc_t rc = 0;
+ CheckMD5_Data* d = (CheckMD5_Data*)data;
+
+ if(type == kptFile ) {
+ if( strcmp(name, "md5") == 0 || strcmp(&name[strlen(name) - 4], ".md5") == 0 ) {
+ const KFile* kfmd5;
+ if( (rc = KDirectoryOpenFileRead(dir, &kfmd5, "%s", name)) == 0 ) {
+ const KMD5SumFmt *md5;
+ if( (rc = KMD5SumFmtMakeRead(&md5, kfmd5)) == 0 ) {
+ uint32_t count = 0;
+ if( (rc = KMD5SumFmtCount(md5, &count)) == 0 ) {
+ char buf[4096];
+ bool bin;
+ do {
+ if( (rc = KMD5SumFmtGet(md5, --count, buf, sizeof(buf) - 1, d->digest, &bin)) == 0 ) {
+ DBGMSG(DBG_APP, 0, ("md5 for $(nm) ", PLOG_S(nm), buf));
+ d->md5 = true;
+ rc = CheckMD5Visitor(dir, kptFile, buf, data);
+ d->md5 = false;
+ }
+ } while( rc == 0 && count > 0 );
+ }
+ rc = KMD5SumFmtRelease(md5);
+ } else {
+ KFileRelease(kfmd5);
+ }
+ }
+ } else {
+ CheckMD5Node* node = calloc(1, sizeof(*node));
+ if( (rc = KDirectoryResolvePath(dir, true, node->file, sizeof(node->file) - 1, "%s", name)) == 0 ) {
+ BSTNode* existing = NULL;
+ if( (rc = BSTreeInsertUnique(&d->files, &node->dad, &existing, CheckMD5Node_Cmp)) == 0 ) {
+ DBGMSG(DBG_APP, 0, ("adding $(nm) ", PLOG_S(nm), node->file));
+ if( d->md5 ) {
+ node->md5 = true;
+ memmove(node->digest, d->digest, sizeof(d->digest));
+ }
+ } else if( GetRCState(rc) == rcExists ) {
+ DBGMSG(DBG_APP, 0, ("updating $(nm) ", PLOG_S(nm), node->file));
+ if( d->md5 ) {
+ ((CheckMD5Node*)existing)->md5 = true;
+ memmove(((CheckMD5Node*)existing)->digest, d->digest, sizeof(d->digest));
+ }
+ free(node);
+ rc = 0;
+ }
+ if( rc != 0 ) {
+ free(node);
+ }
+ }
+ }
+ } else if( (type != kptDir) && !(type & kptAlias) ) {
+ rc = RC(rcExe, rcTable, rcVisiting, rcDirEntry, rcInvalid);
+ PLOGERR(klogInfo, (klogInfo, rc, "$(nm)", PLOG_S(nm), name));
+ }
+ return rc;
+}
+
+typedef struct CheckMD5_WalkData_struct {
+ const KDirectory* dir;
+ rc_t rc;
+} CheckMD5_WalkData;
+
+static
+bool CC CheckMD5_Walk( BSTNode *n, void *data )
+{
+ rc_t rc = 0;
+ CheckMD5Node* m = (CheckMD5Node*)n;
+ CheckMD5_WalkData* d = (CheckMD5_WalkData*)data;
+
+ if( m->md5 ) {
+ const KFile* kf;
+ DBGMSG(DBG_APP, 0, ("verifying $(nm) ", PLOG_S(nm), m->file));
+ if( (rc = KDirectoryOpenFileRead(d->dir, &kf, "%s", m->file)) == 0 ) {
+ const KFile* kfmd5;
+ if( (rc = KFileMakeMD5Read(&kfmd5, kf, m->digest)) == 0 ) {
+ char buf[10240];
+ size_t nr;
+ if( (rc = KFileRead(kfmd5, ~0, buf, sizeof(buf), &nr)) != 0 ) {
+ PLOGERR(klogErr, (klogErr, rc, "MD5 check failed for file $(name)", PLOG_S(name), m->file));
+ }
+ KFileRelease(kfmd5);
+ } else {
+ KFileRelease(kf);
+ }
+ }
+ } else if( strcmp(&m->file[strlen(m->file) - 5 ], "/lock") != 0 &&
+ strcmp(&m->file[strlen(m->file) - 7 ], "/sealed") != 0) {
+ rc = RC(rcExe, rcTable, rcValidating, rcConstraint, rcInconsistent);
+ PLOGERR(klogWarn, (klogWarn, rc, "missing MD5 for file $(name)", PLOG_S(name), m->file));
+ }
+ d->rc = rc ? rc : d->rc;
+ if( d->rc == 0 && (d->rc = Quitting()) != 0 ) {
+ return true;
+ }
+ return false;
+}
+
+static
+rc_t CheckMD5(const char* path)
+{
+ rc_t rc = 0;
+ const KDirectory* dir = NULL;
+
+ PLOGMSG(klogInfo, (klogInfo, "verifying MD5 for '$(path)'", PLOG_S(path), path));
+ if( (rc = KDirectoryNativeDir((KDirectory**)&dir)) == 0 ) {
+ uint32_t type = KDirectoryPathType(dir, "%s", path) & ~kptAlias;
+
+ if( type == kptFile ) {
+ const KDirectory* adir = NULL;
+
+ rc = KDirectoryOpenSraArchiveRead(dir, &adir, true, "%s", path);
+ if (rc == 0 ) {
+ KDirectoryRelease(dir);
+ dir = adir;
+ path = ".";
+ }
+ } else if( type != kptDir ) {
+ rc = RC(rcExe, rcTable, rcValidating, rcArc, rcUnknown);
+ }
+ if( rc == 0 ) {
+ CheckMD5_Data data;
+ BSTreeInit(&data.files);
+ data.md5 = false;
+ if( (rc = KDirectoryVisit(dir, true, CheckMD5Visitor, &data, "%s", path)) == 0 ) {
+ CheckMD5_WalkData wd;
+ wd.dir = dir;
+ wd.rc = 0;
+ BSTreeDoUntil(&data.files, false, CheckMD5_Walk, &wd);
+ rc = wd.rc;
+ LOGERR(rc ? klogErr : klogInfo, rc, "verifying MD5");
+ }
+ }
+ KDirectoryRelease(dir);
+ }
+ return rc;
+}
+
+
+static char const* const defaultLogLevel =
+#if _DEBUGGING
+"debug5";
+#else
+"info";
+#endif
+
+/*******************************************************************************
+ * Usage
+ *******************************************************************************/
+static void usage(const char *progName)
+{
+ const char* p = strrchr(progName, '/');
+ p = p ? p + 1 : progName;
+ printf("\nUsage: %s [options] table\n\n", p);
+ printf(
+ " -5, --md5 Check components md5s if present, fail otherwise, unless other checks are requested (default: yes)\n"
+ " -b, --blob-crc Check blobs CRC32 (default: no)\n"
+/* " -i, --index Check 'skey' index (default: no)\n"*/
+ "\n"
+ " -h, --help This help\n"
+ " -v, --version Program version\n"
+ "\n");
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc = 0;
+ int i;
+ const char* arg;
+ const char* src_path = "missing parameter";
+ bool md5_chk = true, md5_chk_explicit = false;
+ bool blob_crc = false;
+ bool index_chk = false;
+
+ KLogLevelSet(klogInfo);
+
+ for(i = 1; rc == 0 && i < argc; i++) {
+ if( argv[i][0] != '-' ) {
+ src_path = argv[i];
+ break;
+ } else if(strcmp(argv[i], "-5") == 0 || strcmp(argv[i], "--md5") == 0 ) {
+ md5_chk_explicit = true;
+ } else if(strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "--blob-crc") == 0 ) {
+ blob_crc = true;
+/* } else if(strcmp(argv[i], "-i") == 0 || strcmp(argv[i], "--index") == 0 ) {
+ index_chk = true;
+*/
+ } else if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0 ) {
+ usage(argv[0]);
+ return 0;
+ } else if(strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--version") == 0 ) {
+ printf("Version: %u.%u.%u\n", KAppVersion() >> 24, (KAppVersion() >> 16) & 0xFF, KAppVersion() & 0xFFFF);
+ return 0;
+ } else {
+ usage(argv[0]);
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcUnknown);
+ }
+ }
+ if(i != argc - 1) {
+ usage(argv[0]);
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcUnexpected);
+ }
+
+ if( rc != 0 ) {
+ }
+ else if( src_path == NULL ) {
+ rc = RC(rcExe, rcArgv, rcReading, rcParam, rcNotFound);
+ }
+ else {
+ if( blob_crc || index_chk ) {
+ /* if blob or index is requested, md5 is off unless explicitly requested */
+ md5_chk = md5_chk_explicit;
+ }
+ if( md5_chk ) {
+ rc = CheckMD5(src_path);
+ if( GetRCObject(rc) == rcConstraint && GetRCState(rc) == rcInconsistent ) {
+ blob_crc = true;
+ rc = 0;
+ }
+ }
+ if (rc == 0 && blob_crc) {
+ rc = CheckTable(src_path);
+ }
+ if (rc == 0 && index_chk) {
+ /* rc = ValidateSKeyIndex(tbl); */
+ }
+ }
+ if( rc == 0 ) {
+ LOGMSG(klogInfo, "check ok");
+ } else {
+ PLOGERR(klogErr, (klogErr, rc, "check failed: '$(table)'", PLOG_S(table), src_path));
+ }
+ return rc;
+}
diff --git a/tools/sra/table-vers.c b/tools/sra/table-vers.c
new file mode 100644
index 0000000..ff9c9a8
--- /dev/null
+++ b/tools/sra/table-vers.c
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * =============================================================================
+ */
+
+#include <kapp/main.h>
+
+#include <vdb/manager.h> /* VDBManager */
+
+#include <kdb/database.h> /* KDatabase */
+#include <kdb/table.h> /* KDBTable */
+
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/rc.h> /* RC */
+
+#include <assert.h>
+#include <stdio.h> /* printf */
+#include <string.h> /* memset */
+
+#define DISP_RC(rc,msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+typedef enum EOutType {
+ eTxt,
+ eXml
+} EOutType;
+
+typedef struct CmdLine {
+ const char* table;
+ EOutType outType;
+} CmdLine;
+
+#define OPTION_OUTPUT "output"
+#define ALIAS_OUTPUT "o"
+
+static const char* output_usage[] = {
+ "Output type: one of (t | x)", "where 't' - text (default), 'x' - xml", NULL
+};
+
+OptDef Options[] = {
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, false }
+};
+
+const char UsageDefaultName[] = "vable-vers";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg("Usage:\n"
+ " %s [Options] <table>\n", progname);
+}
+
+rc_t CC Usage(const Args* args)
+{
+ rc_t rc = 0;
+ const char* progname = UsageDefaultName;
+ const char* fullpath = UsageDefaultName;
+
+ assert(args);
+
+ rc = ArgsProgram(args, &fullpath, &progname);
+ if (rc)
+ { progname = fullpath = UsageDefaultName; }
+
+ UsageSummary(progname);
+
+ OUTMSG(("\nOptions\n"));
+
+ HelpOptionLine(ALIAS_OUTPUT, OPTION_OUTPUT, "type", output_usage);
+
+ HelpOptionsStandard();
+
+ HelpVersion(fullpath, KAppVersion());
+
+ return rc;
+}
+
+static rc_t CmdLineInit(const Args* args, CmdLine* cmdArgs)
+{
+ rc_t rc = 0;
+
+ assert(args && cmdArgs);
+
+ memset(cmdArgs, 0, sizeof *cmdArgs);
+
+ while (rc == 0) {
+ const char* outType = NULL;
+ uint32_t pcount = 0;
+
+ /* output type */
+ rc = ArgsOptionCount(args, OPTION_OUTPUT, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing output type");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many output type parameters");
+ break;
+ }
+ else if (pcount == 1) {
+ rc = ArgsOptionValue(args, OPTION_OUTPUT, 0, (const void **)&outType);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving output type");
+ break;
+ }
+ else if (outType != NULL) {
+ if (strncmp(outType, "x", 1) == 0) {
+ cmdArgs->outType = eXml;
+ }
+ else if (strncmp(outType, "t", 1) == 0) {
+ cmdArgs->outType = eTxt;
+ }
+ else {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Bad output type value");
+ break;
+ }
+ }
+ }
+
+ /* table path parameter */
+ rc = ArgsParamCount(args, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing table name");
+ break;
+ }
+ if (pcount < 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "Missing table parameter");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many table parameters");
+ break;
+ }
+ rc = ArgsParamValue(args, 0, (const void **)&cmdArgs->table);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving table name");
+ break;
+ }
+
+ break;
+ }
+
+ if (rc != 0) {
+ MiniUsage (args);
+ }
+
+ return rc;
+}
+
+rc_t CC KMain(int argc, char* argv[])
+{
+ rc_t rc = 0;
+ Args* args = NULL;
+ const VDBManager* mgr = NULL;
+
+ CmdLine cmdArgs;
+
+ LogLevelSet("info");
+
+ rc = ArgsMakeAndHandle
+ (&args, argc, argv, 1, Options, sizeof Options / sizeof(Options[0]));
+
+ if (rc == 0) {
+ rc = CmdLineInit(args, &cmdArgs);
+ }
+ if (rc == 0) {
+ DBGMSG(DBG_APP,DBG_COND_1, ("out type = '%d'\n",cmdArgs.outType));
+ PLOGMSG
+ (klogInfo,(klogInfo, "Checking $(tbl)", "tbl=%s", cmdArgs.table));
+ rc = VDBManagerMakeRead(&mgr, NULL);
+ DISP_RC(rc, "while calling VDBManagerMakeRead");
+ }
+ if (rc == 0) {
+ ver_t version = 0;
+ rc = VDBManagerGetObjVersion(mgr, &version, cmdArgs.table);
+ if (rc == 0) {
+ uint32_t maj = version >> 24;
+ uint32_t min = (version >> 16) & 0xFF;
+ uint32_t rel = version & 0xFFFF;
+ switch (cmdArgs.outType) {
+ case eTxt:
+ OUTMSG(("v%d\n", maj));
+ break;
+ case eXml:
+ OUTMSG(("<Object vers=\"%u\" path=\"%s\">",
+ maj, cmdArgs.table));
+ if (min || rel) {
+ OUTMSG(("<loader vers=\"%u.%u.%u\"/>", maj, min, rel));
+ }
+ OUTMSG(("</Object>\n"));
+ break;
+ }
+ } else {
+ PLOGERR(klogErr,
+ (klogErr, rc, "'$(path)'", "path=%s", cmdArgs.table));
+ }
+ }
+
+ RELEASE(VDBManager, mgr);
+
+ ArgsWhack(args);
+
+ return rc;
+}
+
+/************************************ EOF ****************** ******************/
diff --git a/tools/srapath/Makefile b/tools/srapath/Makefile
new file mode 100644
index 0000000..d4b20ff
--- /dev/null
+++ b/tools/srapath/Makefile
@@ -0,0 +1,79 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/srapath
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ srapath
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# srapath
+#
+SRAPATH_SRC = \
+ helper \
+ line_iter \
+ cgi_request \
+ srapath
+
+SRAPATH_OBJ = \
+ $(addsuffix .$(OBJX),$(SRAPATH_SRC))
+
+SRAPATH_LIB += \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+
+$(BINDIR)/srapath: $(SRAPATH_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SRAPATH_LIB)
+
diff --git a/tools/srapath/cgi_request.c b/tools/srapath/cgi_request.c
new file mode 100644
index 0000000..7bf91bb
--- /dev/null
+++ b/tools/srapath/cgi_request.c
@@ -0,0 +1,853 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "cgi_request.h"
+#include "helper.h"
+#include "line_iter.h"
+
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <klib/out.h>
+#include <kns/manager.h>
+#include <kns/http.h>
+#include <kns/stream.h>
+
+#include <string.h>
+
+typedef struct cgi_request
+{
+ char * url;
+ KNSManager * kns_mgr;
+ VNamelist * params;
+} cgi_request;
+
+
+void release_cgi_request( struct cgi_request * request )
+{
+ if ( request != NULL )
+ {
+ if ( request->kns_mgr != NULL )
+ KNSManagerRelease( request->kns_mgr );
+ if ( request->params != NULL )
+ VNamelistRelease( request->params );
+ if ( request->url != NULL )
+ free( ( void * ) request->url );
+ free( ( void * ) request );
+ }
+}
+
+
+rc_t make_cgi_request( struct cgi_request ** request, const char * url )
+{
+ rc_t rc = 0;
+ cgi_request * r = calloc( 1, sizeof * r );
+ if ( r == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * r ), rc );
+ }
+ else
+ {
+ r->url = string_dup_measure( url, NULL );
+ if ( r->url == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "string_dup_measure( '%s' ) -> %R", url, rc );
+ }
+ else
+ {
+ rc = VNamelistMake( &r->params, 10 );
+ if ( rc != 0 )
+ ErrMsg( "VNamelistMake() -> %R", rc );
+ else
+ {
+ rc = KNSManagerMake( &r->kns_mgr );
+ if ( rc != 0 )
+ ErrMsg( "KNSManagerMake() -> %R", rc );
+ else
+ *request = r;
+ }
+ }
+ if ( rc != 0 )
+ release_cgi_request( r );
+ }
+ return rc;
+}
+
+
+rc_t add_cgi_request_param( struct cgi_request * request, const char * fmt, ... )
+{
+ rc_t rc;
+ if ( request == NULL || fmt == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ va_list args;
+ char buffer[ 4096 ];
+ size_t num_writ;
+
+ va_start ( args, fmt );
+ rc = string_vprintf( buffer, sizeof buffer, &num_writ, fmt, args );
+ if ( rc != 0 )
+ ErrMsg( "string_vprintf( '%s' ) -> %R", fmt, rc );
+ else
+ {
+ rc = VNamelistAppend( request->params, buffer );
+ if ( rc != 0 )
+ ErrMsg( "VNamelistAppend( '%s' ) -> %R", buffer, rc );
+ }
+ va_end ( args );
+ }
+ return rc;
+}
+
+
+typedef struct add_ctx
+{
+ struct cgi_request * request;
+ const char * fmt;
+} add_ctx;
+
+static rc_t add_item( const char * item, void * data )
+{
+ add_ctx * actx = data;
+ return add_cgi_request_param( actx->request, actx->fmt, item );
+}
+
+rc_t add_cgi_request_params( struct cgi_request * request, const char * fmt, const VNamelist * src )
+{
+ rc_t rc;
+ if ( request == NULL || fmt == NULL || src == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ add_ctx actx = { request, fmt };
+ rc = foreach_item( src, add_item, &actx );
+ }
+ return rc;
+}
+
+rc_t clear_cgi_request_params( struct cgi_request * request )
+{
+ rc_t rc;
+ if ( request == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ if ( request->params != NULL )
+ {
+ rc = VNamelistRelease( request->params );
+ if ( rc == 0 )
+ rc = VNamelistMake( &request->params, 10 );
+ }
+ }
+ return rc;
+}
+
+char * get_url_of_cgi_request( struct cgi_request * request )
+{
+ if ( request != NULL )
+ return request->url;
+ return NULL;
+}
+
+rc_t perform_cgi_request( struct cgi_request * request,
+ struct KStream ** reply_stream,
+ uint32_t * rslt_code )
+{
+ rc_t rc;
+ if ( request == NULL || reply_stream == NULL || rslt_code == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ ver_t http_vers = 0x01010000;
+ KClientHttpRequest * kns_req;
+
+ *reply_stream = NULL;
+ rc = KNSManagerMakeClientRequest( request->kns_mgr, &kns_req, http_vers, NULL, "%s", request->url );
+ if ( rc != 0 )
+ ErrMsg( "KNSManagerMakeClientRequest( '%s' ) -> %R", request->url, rc );
+ else
+ {
+ uint32_t count;
+ rc = VNameListCount( request->params, &count );
+ if ( rc != 0 )
+ ErrMsg( "VNameListCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * s;
+ rc = VNameListGet( request->params, idx, &s );
+ if ( rc != 0 )
+ ErrMsg( "VNameListGet( #%d ) -> %R", idx, rc );
+ else
+ {
+ rc = KClientHttpRequestAddPostParam( kns_req, "%s", s );
+ if ( rc != 0 )
+ ErrMsg( "KClientHttpRequestAddPostParam( '%s' ) -> %R", s, rc );
+ }
+ }
+ if ( rc == 0 )
+ {
+ KClientHttpResult * kns_rslt;
+ rc = KClientHttpRequestPOST( kns_req, &kns_rslt );
+ if ( rc != 0 )
+ ErrMsg( "KClientHttpRequestPOST() -> %R", rc );
+ else
+ {
+ rc = KClientHttpResultStatus( kns_rslt, rslt_code, NULL, 0, NULL );
+ if ( rc != 0 )
+ ErrMsg( "KClientHttpResultStatus() -> %R", rc );
+ else
+ {
+ rc = KClientHttpResultGetInputStream( kns_rslt, reply_stream );
+ if ( rc != 0 )
+ ErrMsg( "KClientHttpResultGetInputStream() -> %R", rc );
+ }
+ KClientHttpResultRelease( kns_rslt );
+ }
+ }
+ }
+ KClientHttpRequestRelease( kns_req );
+ }
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+static void CC free_reply_obj( void * obj, void * data )
+{
+ if ( obj != NULL )
+ {
+ reply_obj * o = obj;
+ if ( o->prj_id != NULL ) StringWhack( o->prj_id );
+ if ( o->obj_type != NULL ) StringWhack( o->obj_type );
+ if ( o->id != NULL ) StringWhack( o->id );
+ if ( o->name != NULL ) StringWhack( o->name );
+ if ( o->date != NULL ) StringWhack( o->date );
+ if ( o->checksum != NULL ) StringWhack( o->checksum );
+ if ( o->ticket != NULL ) StringWhack( o->ticket );
+ if ( o->path != NULL ) StringWhack( o->path );
+ if ( o->message != NULL ) StringWhack( o->message );
+ free( obj );
+ }
+}
+
+static rc_t clone_reply_obj( const reply_obj * src, reply_obj ** dst )
+{
+ rc_t rc = 0;
+ reply_obj * o = calloc( 1, sizeof * o );
+ if ( o == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * o ), rc );
+ }
+ else
+ {
+ if ( src->prj_id != NULL ) rc = StringCopy( &o->prj_id, src->prj_id );
+ if ( rc == 0 && src->obj_type != NULL ) rc = StringCopy( &o->obj_type, src->obj_type );
+ if ( rc == 0 && src->id != NULL ) rc = StringCopy( &o->id, src->id );
+ if ( rc == 0 && src->name != NULL ) rc = StringCopy( &o->name, src->name );
+ if ( rc == 0 && src->date != NULL ) rc = StringCopy( &o->date, src->date );
+ if ( rc == 0 && src->checksum != NULL ) rc = StringCopy( &o->checksum, src->checksum );
+ if ( rc == 0 && src->ticket != NULL ) rc = StringCopy( &o->ticket, src->ticket );
+ if ( rc == 0 && src->path != NULL ) rc = StringCopy( &o->path, src->path );
+ if ( rc == 0 && src->message != NULL ) rc = StringCopy( &o->message, src->message );
+
+ o->version = src->version;
+ o->size = src->size;
+ o->code = src->code;
+
+ if ( rc == 0 )
+ *dst = o;
+ else
+ free_reply_obj( o, NULL );
+ }
+ return rc;
+}
+
+
+typedef struct reply_obj_list
+{
+ Vector v;
+} reply_obj_list;
+
+
+void release_reply_obj_list( struct reply_obj_list * list )
+{
+ VectorWhack( &list->v, free_reply_obj, NULL );
+}
+
+static rc_t make_reply_obj_list( struct reply_obj_list ** list )
+{
+ rc_t rc = 0;
+ reply_obj_list * l = calloc( 1, sizeof * l );
+ if ( l == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * l ), rc );
+ }
+ else
+ {
+ VectorInit( &l->v, 0, 5 );
+ *list = l;
+ }
+ return rc;
+}
+
+static rc_t add_clone_to_reply_obj_list( reply_obj_list * list, const reply_obj * src )
+{
+ reply_obj * clone;
+ rc_t rc = clone_reply_obj( src, &clone );
+ if ( rc == 0 )
+ rc = VectorAppend( &list->v, NULL, clone );
+ return rc;
+}
+
+static rc_t add_reply_to_list_cb( const reply_obj * obj, void * data )
+{
+ reply_obj_list * l = data;
+ return add_clone_to_reply_obj_list( l, obj );
+}
+
+typedef struct reply_obj_ctx
+{
+ on_reply_obj_t on_obj;
+ void * data;
+ rc_t rc;
+} reply_obj_ctx;
+
+static void CC reply_obj_cb( void * item, void * data )
+{
+ reply_obj_ctx * rctx = data;
+ if ( rctx->rc == 0 )
+ rctx->rc = rctx->on_obj( item, rctx->data );
+}
+
+rc_t foreach_reply_obj( struct reply_obj_list * list,
+ on_reply_obj_t on_obj,
+ void * data )
+{
+ reply_obj_ctx rctx = { on_obj, data, 0 };
+ VectorForEach( &list->v, false, reply_obj_cb, &rctx );
+ return rctx.rc;
+}
+
+
+static int64_t find_obj_cmp( const void *key, const void *n )
+{
+ const String * id = key;
+ const reply_obj * obj = n;
+ return StringCompare( id, obj->id );
+}
+
+static reply_obj * find_obj( struct reply_obj_list * list, const String * id )
+{
+ return VectorFind( &list->v, id, NULL, find_obj_cmp );
+}
+
+typedef struct reply_parse_ctx
+{
+ on_reply_obj_t on_obj;
+ void * data;
+ ver_maj_min version;
+} reply_parse_ctx;
+
+
+/* ------------------------------------------------------------------------ */
+
+enum request_type { request_type_names, request_type_search };
+
+static const char * names_cgi_url = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+static const char * search_cgi_url = "https://www.ncbi.nlm.nih.gov/Traces/names/search.cgi";
+
+static const char * validate_url( const char * src, enum request_type request_type )
+{
+ const char * res = src;
+ if ( src == NULL )
+ {
+ switch( request_type )
+ {
+ case request_type_names : res = names_cgi_url; break;
+ case request_type_search : res = search_cgi_url; break;
+ }
+ }
+ return res;
+}
+
+
+static const char * names_cgi_ver = "3.0";
+static const char * search_cgi_ver = "1.0";
+
+static const char * validate_ver( const char * src, enum request_type request_type )
+{
+ const char * res = src;
+ if ( src == NULL )
+ {
+ switch( request_type )
+ {
+ case request_type_names : res = names_cgi_ver; break;
+ case request_type_search : res = search_cgi_ver; break;
+ }
+ }
+ return res;
+}
+
+
+static void validate_request_params( const request_params * src, request_params * dst )
+{
+ dst->names_url = validate_url( src->names_url, request_type_names );
+ dst->names_ver = validate_ver( src->names_ver, request_type_names );
+ dst->search_url = validate_url( src->search_url, request_type_search );
+ dst->search_ver = validate_ver( src->search_ver, request_type_search );
+
+ dst->params = src->params;
+ dst->terms = src->terms;
+ dst->buffer_size = src->buffer_size;
+ dst->timeout_ms = src->timeout_ms;
+}
+
+/* ------------------------------------------------------------------------ */
+
+
+rc_t raw_names_request( const request_params * request,
+ on_string_t on_line,
+ uint32_t * rslt_code,
+ void * data )
+{
+ rc_t rc;
+ cgi_request * req;
+ request_params validated_request;
+
+ validate_request_params( request, &validated_request );
+ rc = make_cgi_request( &req, validated_request.names_url );
+ if ( rc == 0 )
+ {
+ const char ** ptr = validated_request.terms;
+ rc = add_cgi_request_param( req, "version=%s", validated_request.names_ver );
+ while ( rc == 0 && *ptr != NULL )
+ {
+ rc = add_cgi_request_param( req, "acc=%s", *ptr );
+ ptr++;
+ }
+ ptr = validated_request.params;
+ while ( rc == 0 && *ptr != NULL )
+ {
+ rc = add_cgi_request_param( req, "%s", *ptr );
+ ptr++;
+ }
+ if ( rc == 0 )
+ {
+ struct KStream * stream;
+ rc = perform_cgi_request( req, &stream, rslt_code );
+ if ( rc == 0 )
+ {
+ rc = stream_line_read( stream, on_line,
+ validated_request.buffer_size, validated_request.timeout_ms, data );
+ KStreamRelease( stream );
+ }
+ }
+ release_cgi_request( req );
+ }
+ return rc;
+}
+
+
+static rc_t names_token_v_1_0( const String * token, uint32_t id, void * data )
+{
+ rc_t rc = 0;
+ if ( token->len > 0 )
+ {
+ reply_obj * obj = data;
+ switch( id )
+ {
+ case 0 : rc = StringCopy( &obj->id, token ); break;
+ case 1 : rc = StringCopy( &obj->ticket, token ); break;
+ case 2 : rc = StringCopy( &obj->path, token ); break;
+ case 3 : obj->code = StringToU64( token, &rc ); break;
+ case 4 : rc = StringCopy( &obj->message, token ); break;
+ }
+ }
+ return rc;
+}
+
+static rc_t names_token_v_1_1( const String * token, uint32_t id, void * data )
+{
+ rc_t rc = 0;
+ if ( token->len > 0 )
+ {
+ reply_obj * obj = data;
+ switch( id )
+ {
+ case 0 : rc = StringCopy( &obj->id, token ); break;
+ case 1 : /* ??? */ break;
+ case 2 : /* ??? */ break;
+ case 3 : obj->size = StringToU64( token, &rc ); break;
+ case 4 : rc = StringCopy( &obj->date, token ); break;
+ case 5 : rc = StringCopy( &obj->checksum, token ); break;
+ case 6 : rc = StringCopy( &obj->ticket, token ); break;
+ case 7 : rc = StringCopy( &obj->path, token ); break;
+ case 8 : obj->code = StringToU64( token, &rc ); break;
+ case 9 : rc = StringCopy( &obj->message, token ); break;
+ }
+ }
+ return rc;
+}
+
+static rc_t names_token_v_3_0( const String * token, uint32_t id, void * data )
+{
+ rc_t rc = 0;
+ if ( token->len > 0 )
+ {
+ reply_obj * obj = data;
+ switch( id )
+ {
+ case 0 : rc = StringCopy( &obj->obj_type, token ); break;
+ case 1 : rc = StringCopy( &obj->id, token ); break;
+ case 2 : obj->size = StringToU64( token, &rc ); break;
+ case 3 : rc = StringCopy( &obj->date, token ); break;
+ case 4 : rc = StringCopy( &obj->checksum, token ); break;
+ case 5 : rc = StringCopy( &obj->ticket, token ); break;
+ case 6 : rc = StringCopy( &obj->path, token ); break;
+ case 7 : obj->code = StringToU64( token, &rc ); break;
+ case 8 : rc = StringCopy( &obj->message, token ); break;
+ }
+ }
+ return rc;
+}
+
+static rc_t on_names_line( const String * line, void * data )
+{
+ rc_t rc = 0;
+ reply_parse_ctx * rctx = data;
+ if ( line != NULL && line->len > 0 )
+ {
+ if ( line->addr[ 0 ] == '#' ) /* helper.c */
+ {
+ extract_versionS( &rctx->version, line );
+ }
+ else
+ {
+ reply_obj obj;
+ memset( &obj, 0, sizeof obj );
+
+ if ( rctx->version.major == 1 )
+ {
+ switch( rctx->version.minor )
+ {
+ case 0 : rc = foreach_token( line, names_token_v_1_0, '|', &obj ); break;
+ case 1 : rc = foreach_token( line, names_token_v_1_1, '|', &obj ); break;
+ }
+ }
+ else if ( rctx->version.major == 3 )
+ rc = foreach_token( line, names_token_v_3_0, '|', &obj );
+
+ obj.version = rctx->version;
+ if ( rc == 0 )
+ rc = rctx->on_obj( &obj, rctx->data );
+ }
+ }
+ return rc;
+}
+
+
+rc_t parsed_names_request( const request_params * request,
+ on_reply_obj_t on_obj,
+ uint32_t * rslt_code,
+ void * data )
+{
+ reply_parse_ctx rctx = { on_obj, data, { 0, 0 } };
+ return raw_names_request( request, on_names_line, rslt_code, &rctx );
+}
+
+rc_t names_request_to_list( const request_params * request,
+ uint32_t * rslt_code,
+ struct reply_obj_list ** list )
+{
+ reply_obj_list * l;
+ rc_t rc = make_reply_obj_list( &l );
+ if ( rc == 0 )
+ {
+ rc = parsed_names_request( request, add_reply_to_list_cb, rslt_code, l );
+ if ( rc == 0 )
+ *list = l;
+ else
+ release_reply_obj_list( l );
+ }
+ return rc;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+
+rc_t raw_search_request( const request_params * request,
+ on_string_t on_line,
+ uint32_t * rslt_code,
+ void * data )
+{
+ rc_t rc;
+ cgi_request * req;
+ request_params validated_request;
+
+ validate_request_params( request, &validated_request );
+ rc = make_cgi_request( &req, validated_request.search_url );
+ if ( rc == 0 )
+ {
+ const char ** ptr = validated_request.terms;
+ rc = add_cgi_request_param( req, "version=%s", validated_request.search_ver );
+ while ( rc == 0 && *ptr != NULL )
+ {
+ rc = add_cgi_request_param( req, "term=%s", *ptr );
+ ptr++;
+ }
+ ptr = validated_request.params;
+ while ( rc == 0 && *ptr != NULL )
+ {
+ rc = add_cgi_request_param( req, "%s", *ptr );
+ ptr++;
+ }
+ if ( rc == 0 )
+ {
+ struct KStream * stream;
+ rc = perform_cgi_request( req, &stream, rslt_code );
+ if ( rc == 0 )
+ {
+ rc = stream_line_read( stream, on_line,
+ validated_request.buffer_size, validated_request.timeout_ms, data );
+ KStreamRelease( stream );
+ }
+ }
+ release_cgi_request( req );
+ }
+ return rc;
+}
+
+static rc_t search_token_v_2_0( const String * token, uint32_t id, void * data )
+{
+ rc_t rc = 0;
+ if ( token->len > 0 )
+ {
+ reply_obj * obj = data;
+ switch( id )
+ {
+ case 0 : rc = StringCopy( &obj->prj_id, token ); break;
+ case 1 : rc = StringCopy( &obj->obj_type, token ); break;
+ case 2 : rc = StringCopy( &obj->id, token ); break;
+ case 3 : rc = StringCopy( &obj->name, token ); break;
+ case 4 : rc = StringCopy( &obj->path, token ); break;
+ case 5 : obj->size = StringToU64( token, &rc ); break;
+ case 6 : rc = StringCopy( &obj->message, token ); break;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t on_search_line( const String * line, void * data )
+{
+ rc_t rc = 0;
+ reply_parse_ctx * rctx = data;
+ if ( line != NULL && line->len > 0 )
+ {
+ switch( line->addr[ 0 ] )
+ {
+ case '#' : extract_versionS( &rctx->version, line ); break;
+ case '$' : break;
+ default : {
+ reply_obj obj;
+ memset( &obj, 0, sizeof obj );
+ if ( rctx->version.major == 2 )
+ {
+ if ( rctx->version.minor == 0 )
+ rc = foreach_token( line, search_token_v_2_0, '|', &obj );
+ }
+ obj.version = rctx->version;
+ if ( rc == 0 )
+ rc = rctx->on_obj( &obj, rctx->data );
+ }
+ break;
+ }
+ }
+ return rc;
+}
+
+
+rc_t parsed_search_request( const request_params * request,
+ on_reply_obj_t on_obj,
+ uint32_t * rslt_code,
+ void * data )
+{
+ reply_parse_ctx rctx = { on_obj, data, { 0, 0 } };
+ return raw_search_request( request, on_search_line, rslt_code, &rctx );
+}
+
+
+static rc_t on_obj_for_count( const reply_obj * obj, void * data )
+{
+ if ( obj != NULL && data != NULL )
+ {
+ uint32_t * count = data;
+ if ( obj->id != NULL ) *count += 1;
+ }
+ return 0;
+}
+
+
+typedef struct obj_add_ptr
+{
+ const char ** ptr;
+ uint32_t idx;
+} obj_add_ptr;
+
+static rc_t on_obj_for_add_ptr( const reply_obj * obj, void * data )
+{
+ if ( obj != NULL && data != NULL )
+ {
+ obj_add_ptr * o = data;
+ if ( obj->id != NULL )
+ {
+ o->ptr[ o->idx ] = obj->id->addr;
+ o->idx++;
+ }
+ }
+ return 0;
+}
+
+static rc_t reply_obj_list_2_ptrs( struct reply_obj_list * list, const char *** ptr )
+{
+ uint32_t count = 0;
+ rc_t rc = foreach_reply_obj( list, on_obj_for_count, &count );
+ *ptr = NULL;
+ if ( rc == 0 )
+ {
+ if ( count > 0 )
+ {
+ const char ** x = calloc( count + 1, sizeof *x );
+ if ( x == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", count * ( sizeof * x ), rc );
+ }
+ else
+ {
+ obj_add_ptr o = { x, 0 };
+ rc = foreach_reply_obj( list, on_obj_for_add_ptr, &o );
+ if ( rc == 0 )
+ *ptr = x;
+ else
+ free( ( void * ) x );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t on_enter_path( const reply_obj * obj, void * data )
+{
+ rc_t rc = 0;
+ if ( obj != NULL && data != NULL )
+ {
+ reply_obj_list * list = data;
+ reply_obj * found = find_obj( list, obj->id );
+ if ( found != NULL )
+ {
+ if ( found->path != NULL ) StringWhack( found->path );
+ rc = StringCopy( &found->path, obj->path );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_sub_request( const request_params * request,
+ uint32_t * rslt_code,
+ struct reply_obj_list * list )
+{
+ rc_t rc;
+ request_params sub_request;
+
+ sub_request.names_url = request->names_url;
+ sub_request.search_url = request->search_url;
+ sub_request.names_ver = request->names_ver;
+ sub_request.search_ver = request->search_ver;
+ sub_request.params = request->params;
+ sub_request.terms = NULL;
+ sub_request.buffer_size = request->buffer_size;
+ sub_request.timeout_ms = request->timeout_ms;
+
+ rc = reply_obj_list_2_ptrs( list, &sub_request.terms );
+ if ( rc == 0 && sub_request.terms != NULL )
+ {
+ struct reply_obj_list * sub_list;
+ rc = names_request_to_list( &sub_request, rslt_code, &sub_list );
+ if ( rc == 0 )
+ {
+ /* walk the sub-list and enter the paths found into the list */
+ rc = foreach_reply_obj( sub_list, on_enter_path, list );
+ release_reply_obj_list( sub_list );
+ }
+ free( ( void * )sub_request.terms );
+ }
+ return rc;
+}
+
+
+rc_t search_request_to_list( const request_params * request,
+ uint32_t * rslt_code,
+ struct reply_obj_list ** list,
+ bool resolve_path )
+{
+ reply_obj_list * l;
+ rc_t rc = make_reply_obj_list( &l );
+ if ( rc == 0 )
+ {
+ rc = parsed_search_request( request, add_reply_to_list_cb, rslt_code, l );
+ if ( rc == 0 )
+ {
+ if ( resolve_path )
+ {
+ rc = perform_sub_request( request, rslt_code, l );
+ if ( rc == 0 )
+ *list = l;
+ else
+ release_reply_obj_list( l );
+ }
+ else
+ *list = l;
+ }
+ else
+ release_reply_obj_list( l );
+ }
+ return rc;
+}
diff --git a/tools/srapath/cgi_request.h b/tools/srapath/cgi_request.h
new file mode 100644
index 0000000..7f4b91c
--- /dev/null
+++ b/tools/srapath/cgi_request.h
@@ -0,0 +1,129 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_cgi_request_
+#define _h_cgi_request_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_helper_
+#include "helper.h"
+#endif
+
+/* ------------------------------------------------------------------------ */
+
+
+typedef struct request_params
+{
+ const char * names_url; /* NULL ... default url */
+ const char * search_url; /* NULL ... default url */
+ const char * names_ver; /* NULL ... default vers */
+ const char * search_ver; /* NULL ... default vers */
+ const char ** params; /* NULL ... none */
+ const char ** terms; /* mandatory... NULL-terminated list of terms */
+ size_t buffer_size;
+ uint32_t timeout_ms;
+} request_params;
+
+
+/* ------------------------------------------------------------------------ */
+
+
+typedef rc_t ( * on_string_t )( const String * line, void * data );
+
+typedef struct reply_obj /* names search */
+{
+ const String * prj_id; /* - X */
+ const String * obj_type; /* X X */
+ const String * id; /* X X */
+ const String * date; /* X - */
+ const String * checksum; /* X - */
+ const String * ticket; /* X - */
+ const String * name; /* - X */
+ const String * path; /* X X */
+ const String * message; /* X X */
+ size_t size; /* X X */
+ ver_maj_min version; /* X X */
+ uint32_t code; /* X - */
+} reply_obj;
+
+struct reply_obj_list;
+
+void release_reply_obj_list( struct reply_obj_list * list );
+
+typedef rc_t ( * on_reply_obj_t )( const reply_obj * obj, void * data );
+
+rc_t foreach_reply_obj( struct reply_obj_list * list,
+ on_reply_obj_t on_obj,
+ void * data );
+
+
+/* ------------------------------------------------------------------------ */
+
+
+rc_t raw_names_request( const request_params * request,
+ on_string_t on_line,
+ uint32_t * rslt_code,
+ void * data );
+
+rc_t parsed_names_request( const request_params * request,
+ on_reply_obj_t on_obj,
+ uint32_t * rslt_code,
+ void * data );
+
+rc_t names_request_to_list( const request_params * request,
+ uint32_t * rslt_code,
+ struct reply_obj_list ** list );
+
+/* ------------------------------------------------------------------------ */
+
+
+rc_t raw_search_request( const request_params * request,
+ on_string_t on_line,
+ uint32_t * rslt_code,
+ void * data );
+
+rc_t parsed_search_request( const request_params * request,
+ on_reply_obj_t on_obj,
+ uint32_t * rslt_code,
+ void * data );
+
+rc_t search_request_to_list( const request_params * request,
+ uint32_t * rslt_code,
+ struct reply_obj_list ** list,
+ bool resolve_path );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/srapath/helper.c b/tools/srapath/helper.c
new file mode 100644
index 0000000..1244e35
--- /dev/null
+++ b/tools/srapath/helper.c
@@ -0,0 +1,464 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "helper.h"
+
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+
+rc_t ErrMsg( const char * fmt, ... )
+{
+ rc_t rc;
+ char buffer[ 4096 ];
+ size_t num_writ;
+
+ va_list list;
+ va_start( list, fmt );
+ rc = string_vprintf( buffer, sizeof buffer, &num_writ, fmt, list );
+ if ( rc == 0 )
+ rc = pLogMsg( klogErr, "$(E)", "E=%s", buffer );
+ va_end( list );
+ return rc;
+}
+
+rc_t CC ArgsOptionCount( const struct Args * self, const char * option_name, uint32_t * count );
+rc_t CC ArgsOptionValue( const struct Args * self, const char * option_name, uint32_t iteration, const void ** value );
+
+const char * get_str_option( const struct Args *args, const char *name, const char * dflt )
+{
+ const char* res = dflt;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ rc = ArgsOptionValue( args, name, 0, (const void**)&res );
+ if ( rc != 0 ) res = dflt;
+ }
+ return res;
+}
+
+bool get_bool_option( const struct Args *args, const char *name )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, name, &count );
+ return ( rc == 0 && count > 0 );
+}
+
+
+uint64_t get_uint64_t_option( const struct Args * args, const char *name, uint64_t dflt )
+{
+ uint64_t res = dflt;
+ const char * s = get_str_option( args, name, NULL );
+ if ( s != NULL )
+ {
+ size_t l = string_size( s );
+ if ( l > 0 )
+ {
+ char * endptr;
+ res = strtol( s, &endptr, 0 );
+ }
+ }
+ return res;
+}
+
+uint32_t get_uint32_t_option( const struct Args * args, const char *name, uint32_t dflt )
+{
+ return ( get_uint64_t_option( args, name, dflt ) & 0xFFFFFFFF );
+}
+
+size_t get_size_t_option( const struct Args * args, const char *name, size_t dflt )
+{
+ size_t res = dflt;
+ const char * s = get_str_option( args, name, NULL );
+ if ( s != NULL )
+ {
+ size_t l = string_size( s );
+ if ( l > 0 )
+ {
+ size_t multipl = 1;
+ switch( s[ l - 1 ] )
+ {
+ case 'k' :
+ case 'K' : multipl = 1024; break;
+ case 'm' :
+ case 'M' : multipl = 1024 * 1024; break;
+ case 'g' :
+ case 'G' : multipl = 1024 * 1024 * 1024; break;
+ }
+
+ if ( multipl > 1 )
+ {
+ char * src = string_dup( s, l - 1 );
+ if ( src != NULL )
+ {
+ char * endptr;
+ res = strtol( src, &endptr, 0 ) * multipl;
+ free( src );
+ }
+ }
+ else
+ {
+ char * endptr;
+ res = strtol( s, &endptr, 0 );
+ }
+ }
+ }
+ return res;
+}
+
+
+func_t get_func_t( const char * function )
+{
+ func_t res = ft_resolve;
+ if ( function != NULL && function[ 0 ] != 0 )
+ {
+ String Function, F_names;
+ StringInitCString( &Function, function );
+ StringInitCString( &F_names, "names" );
+ if ( 0 == StringCaseCompare ( &Function, &F_names ) )
+ res = ft_names;
+ else
+ {
+ String F_search;
+ StringInitCString( &F_search, "search" );
+ if ( 0 == StringCaseCompare ( &Function, &F_search ) )
+ res = ft_search;
+ }
+ }
+ return res;
+}
+
+typedef enum evs{ evs_pre_txt, evs_maj, evs_mid_txt, evs_min, evs_post_txt } evs_t;
+
+static evs_t txt_2_num( String * S, const char * src, evs_t next )
+{
+ if ( S->addr == NULL ) StringInit( S, src, 0, 0 );
+ S->len++;
+ S->size++;
+ return next;
+}
+
+static evs_t num_2_txt( String * S, uint8_t * vers_part, evs_t next )
+{
+ uint64_t value = StringToU64( S, NULL );
+ *vers_part = ( value & 0xFF );
+ StringInit( S, NULL, 0, 0 );
+ return next;
+}
+
+void extract_versionS( ver_maj_min * ver, const String * version_string )
+{
+ if ( ver != NULL && version_string != NULL )
+ {
+ evs_t status = evs_pre_txt;
+ uint32_t idx = 0;
+ String S;
+
+ ver->major = 0;
+ ver->minor = 0;
+ StringInit( &S, NULL, 0, 0 );
+ while( idx < version_string->len )
+ {
+ const char * src = &version_string->addr[ idx ];
+ bool is_num = ( *src >= '0' && *src <= '9' );
+ switch( status )
+ {
+ case evs_pre_txt : if ( is_num ) status = txt_2_num( &S, src, evs_maj );
+ break;
+
+ case evs_maj : if ( is_num )
+ { S.len++; S.size++; }
+ else
+ status = num_2_txt( &S, &ver->major, evs_mid_txt );
+ break;
+
+ case evs_mid_txt : if ( is_num ) status = txt_2_num( &S, src, evs_min );
+ break;
+
+ case evs_min : if ( is_num )
+ { S.len++; S.size++; }
+ else
+ status = num_2_txt( &S, &ver->minor, evs_post_txt );
+ break;
+
+ case evs_post_txt : break;
+ }
+ idx++;
+ }
+ if ( status == evs_maj )
+ num_2_txt( &S, &ver->major, evs_maj );
+ else if ( status == evs_min )
+ num_2_txt( &S, &ver->minor, evs_min );
+ }
+}
+
+void extract_version( ver_maj_min * ver, const char * version_string )
+{
+ String S;
+ StringInitCString( &S, version_string );
+ extract_versionS( ver, &S );
+}
+
+pns_ver_t get_ver_t_S( const String * version, pns_ver_t default_version )
+{
+ pns_ver_t res = default_version;
+ if ( version != NULL && version->len > 0 )
+ {
+ String V_1_0;
+ StringInitCString( &V_1_0, "1.0" );
+ if ( 0 == StringCaseCompare( version, &V_1_0 ) )
+ res = vt_1_0;
+ else
+ {
+ String V_1_1;
+ StringInitCString( &V_1_1, "1.1" );
+ if ( 0 == StringCaseCompare( version, &V_1_1 ) )
+ res = vt_1_1;
+ else
+ {
+ String V_3_0;
+ StringInitCString( &V_3_0, "3.0" );
+ if ( 0 == StringCaseCompare( version, &V_3_0 ) )
+ res = vt_3_0;
+ }
+ }
+ }
+ return res;
+}
+
+pns_ver_t get_ver_t( const char * version, pns_ver_t default_version )
+{
+ pns_ver_t res = default_version;
+ if ( version != NULL && version[ 0 ] != 0 )
+ {
+ String Sversion;
+ if ( version[ 0 ] == '#' )
+ StringInitCString( &Sversion, &version[ 1 ] );
+ else
+ StringInitCString( &Sversion, version );
+ res = get_ver_t_S( &Sversion, default_version );
+ }
+ return res;
+}
+
+
+rc_t CC ArgsParamCount( const struct Args * self, uint32_t * count );
+rc_t CC ArgsParamValue( const struct Args * self, uint32_t iteration, const void ** value );
+rc_t CC ArgsOptionValue ( const struct Args * self, const char * option_name, uint32_t iteration, const void ** value );
+
+rc_t foreach_arg( const struct Args * args,
+ rc_t ( * on_arg )( const char * arg, void * data ),
+ void * data )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++ idx )
+ {
+ const char * value;
+ rc = ArgsParamValue( args, idx, ( const void ** )&value );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue( #%d) -> %R", idx, rc );
+ else
+ rc = on_arg( value, data );
+ }
+ }
+ return rc;
+}
+
+rc_t args_to_ptrs( const struct Args * args, const char *** ptr )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsOptionCount() -> %R", rc );
+ else
+ {
+ const char ** x = calloc( count + 1, sizeof *x );
+ if ( x == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", count * ( sizeof * x ), rc );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ rc = ArgsParamValue( args, idx, ( const void ** )&( x[ idx ] ) );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue( #%d) -> %R", idx, rc );
+ }
+ if ( rc == 0 )
+ *ptr = x;
+ else
+ free( ( void * ) x );
+ }
+ }
+ return rc;
+
+}
+
+rc_t foreach_option( const struct Args * args, const char * option_name,
+ rc_t ( * on_option )( const char * arg, void * data ),
+ void * data )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option_name, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsOptionCount() -> %R", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++ idx )
+ {
+ const char * value;
+ rc = ArgsOptionValue( args, option_name, idx, ( const void ** )&value );
+ if ( rc != 0 )
+ ErrMsg( "ArgsOptionValue( #%d) -> %R", idx, rc );
+ else
+ rc = on_option( value, data );
+ }
+ }
+ return rc;
+}
+
+static rc_t add_to_namelist( const char * arg, void * data )
+{
+ VNamelist * dst = data;
+ return VNamelistAppend( dst, arg );
+}
+
+
+rc_t args_to_namelist( const struct Args * args, VNamelist ** dst )
+{
+ rc_t rc = VNamelistMake( dst, 10 );
+ if ( rc != 0 )
+ ErrMsg( "VNamelistMake() -> %R", rc );
+ else
+ rc = foreach_arg( args, add_to_namelist, *dst );
+ return rc;
+}
+
+rc_t options_to_namelist( const struct Args * args, const char * option_name,
+ VNamelist ** dst )
+{
+ rc_t rc = VNamelistMake( dst, 10 );
+ if ( rc != 0 )
+ ErrMsg( "VNamelistMake() -> %R", rc );
+ else
+ rc = foreach_option( args, option_name, add_to_namelist, *dst );
+ return rc;
+}
+
+rc_t options_to_ptrs( const struct Args * args, const char * option_name, const char *** ptr )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option_name, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsOptionCount() -> %R", rc );
+ else
+ {
+ const char ** x = calloc( count + 1, sizeof *x );
+ if ( x == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", count * ( sizeof * x ), rc );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ rc = ArgsOptionValue( args, option_name, idx, ( const void ** )&( x[ idx ] ) );
+ if ( rc != 0 )
+ ErrMsg( "ArgsOptionValue( #%d) -> %R", idx, rc );
+ }
+ if ( rc == 0 )
+ *ptr = x;
+ else
+ free( ( void * ) x );
+ }
+ }
+ return rc;
+}
+
+rc_t foreach_item( const VNamelist * src,
+ rc_t ( * on_item )( const char * item, void * data ),
+ void * data )
+{
+ uint32_t count;
+ rc_t rc = VNameListCount( src, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * value;
+ rc = VNameListGet( src, idx, &value );
+ if ( rc == 0 && value != NULL )
+ rc = on_item( value, data );
+ }
+ }
+ return rc;
+}
+
+rc_t foreach_token( const String * line,
+ token_handler_t token_handler,
+ char delim,
+ void * data )
+{
+ rc_t rc = 0;
+ String token;
+ uint32_t idx, id;
+
+ token.addr = line->addr;
+ token.len = token.size = 0;
+ for ( idx = 0, id = 0; rc == 0 && idx < line->len; ++idx )
+ {
+ if ( line->addr[ idx ] == delim )
+ {
+ rc = token_handler( &token, id++, data );
+ token.len = token.size = 0;
+ }
+ else
+ {
+ if ( token.len == 0 )
+ token.addr = &line->addr[ idx ];
+ token.len++;
+ token.size++;
+ }
+ }
+ if ( token.len > 0 )
+ rc = token_handler( &token, id, data );
+ return rc;
+}
\ No newline at end of file
diff --git a/tools/srapath/helper.h b/tools/srapath/helper.h
new file mode 100644
index 0000000..fac432d
--- /dev/null
+++ b/tools/srapath/helper.h
@@ -0,0 +1,108 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_helper_
+#define _h_helper_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_namelist_
+#include <klib/namelist.h>
+#endif
+
+#ifndef _h_kns_stream_
+#include <kns/stream.h>
+#endif
+
+rc_t ErrMsg( const char * fmt, ... );
+
+struct Args;
+
+const char * get_str_option( const struct Args *args, const char *name, const char * dflt );
+bool get_bool_option( const struct Args *args, const char *name );
+size_t get_size_t_option( const struct Args * args, const char *name, size_t dflt );
+uint32_t get_uint32_t_option( const struct Args * args, const char *name, uint32_t dflt );
+uint64_t get_uint64_t_option( const struct Args * args, const char *name, uint64_t dflt );
+
+typedef enum func_t { ft_resolve, ft_names, ft_search } func_t;
+func_t get_func_t( const char * function );
+
+rc_t foreach_arg( const struct Args * args,
+ rc_t ( * on_arg )( const char * arg, void * data ),
+ void * data );
+rc_t args_to_namelist( const struct Args * args, VNamelist ** dst );
+rc_t args_to_ptrs( const struct Args * args, const char *** ptr );
+
+rc_t foreach_option( const struct Args * args, const char * option_name,
+ rc_t ( * on_option )( const char * arg, void * data ),
+ void * data );
+rc_t options_to_namelist( const struct Args * args, const char * option_name, VNamelist ** dst );
+rc_t options_to_ptrs( const struct Args * args, const char * option_name, const char *** ptr );
+
+rc_t foreach_item( const VNamelist * src,
+ rc_t ( * on_item )( const char * item, void * data ),
+ void * data );
+
+typedef enum pns_ver_t { vt_unknown, vt_1_0, vt_1_1, vt_3_0 } pns_ver_t;
+
+pns_ver_t get_ver_t( const char * version, pns_ver_t default_version );
+pns_ver_t get_ver_t_S( const String * version, pns_ver_t default_version );
+
+typedef struct ver_maj_min
+{
+ uint8_t major;
+ uint8_t minor;
+} ver_maj_min;
+
+
+void extract_versionS( ver_maj_min * ver, const String * version_string );
+void extract_version( ver_maj_min * ver, const char * version_string );
+
+pns_ver_t get_ver_t_S( const String * version, pns_ver_t default_version );
+
+
+typedef rc_t ( * token_handler_t )( const String * token, uint32_t id, void * data );
+
+rc_t foreach_token( const String * line,
+ token_handler_t token_handler,
+ char delim,
+ void * data );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/srapath/line_iter.c b/tools/srapath/line_iter.c
new file mode 100644
index 0000000..a5ead82
--- /dev/null
+++ b/tools/srapath/line_iter.c
@@ -0,0 +1,241 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "line_iter.h"
+#include "helper.h"
+
+#include <kfs/file.h>
+#include <klib/out.h>
+#include <klib/time.h>
+#include <kproc/timeout.h>
+
+#include "os-native.h"
+
+#define ITER_DONE 0x01
+#define ITER_EOF 0x02
+
+typedef struct line_iter
+{
+ const struct KStream * stream;
+ String buffer, content, line;
+ uint32_t state, timeout_ms;
+} line_iter;
+
+
+void release_line_iter( struct line_iter * iter )
+{
+ if ( iter != NULL )
+ {
+ if ( iter->buffer.addr != NULL )
+ free( ( void * ) iter->buffer.addr );
+ free( ( void * ) iter );
+ }
+}
+
+
+static uint32_t read_line_iter( struct line_iter * iter )
+{
+ uint32_t res = 0;
+ if ( iter->content.size > 0 )
+ memmove( (void *)iter->buffer.addr, iter->content.addr, iter->content.size );
+ iter->content.addr = iter->buffer.addr;
+ {
+ char * dst = ( char * )iter->buffer.addr + iter->content.size;
+ size_t num_read;
+ size_t to_read = ( ( iter->buffer.size - 1 ) - iter->content.size );
+ timeout_t tm;
+
+ rc_t rc = TimeoutInit( &tm, iter->timeout_ms );
+ if ( rc != 0 )
+ ErrMsg( "TimeoutInit( 5000 ) -> %R", rc );
+ else
+ {
+ rc = TimeoutPrepare( &tm );
+ if ( rc != 0 )
+ ErrMsg( "TimeoutPrepare() -> %R", rc );
+ else
+ {
+ rc = KStreamTimedRead( iter->stream, dst, iter->buffer.size - iter->content.size, &num_read, &tm );
+ if ( rc == 0 )
+ {
+ iter->content.size += num_read;
+ res = num_read;
+ if ( num_read < to_read )
+ iter->state |= ITER_EOF;
+ else
+ iter->state &= ~ITER_EOF;
+ }
+ else
+ {
+ KOutMsg( "KStreamTimedRead() = %R, (%d)\n", rc, num_read );
+ iter->state |= ITER_DONE;
+ }
+ }
+ }
+ }
+ return res;
+}
+
+
+static bool slice_iter_content( struct line_iter * iter, size_t by )
+{
+ size_t l;
+ iter->line.addr = iter->content.addr;
+ iter->line.len = by;
+ iter->line.size = by;
+ l = ( by + 1 );
+ iter->content.addr += l;
+ if ( l < iter->content.size )
+ iter->content.size -= l;
+ else
+ iter->content.size = 0;
+ return true;
+}
+
+
+bool advance_line_iter( struct line_iter * iter )
+{
+ bool res = ( 0 == ( iter->state & ITER_DONE ) );
+ if ( res )
+ {
+ if ( iter->content.size == 0 )
+ read_line_iter( iter );
+
+ if ( iter->content.size == 0 && ( iter->state & ITER_EOF ) )
+ {
+ iter->state |= ITER_DONE;
+ res = false;
+ }
+ else
+ {
+ char * newline = string_chr( iter->content.addr, iter->content.size, '\n' );
+ if ( newline == NULL )
+ {
+ if ( read_line_iter( iter ) == 0 )
+ KSleepMs( 100 );
+ res = advance_line_iter( iter ); /* recursion! */
+ }
+ else
+ res = slice_iter_content( iter, newline - iter->content.addr );
+ }
+ }
+ return res;
+}
+
+
+String * get_line_iter( struct line_iter * iter )
+{
+ String * res = NULL;
+ if ( iter != NULL )
+ {
+ if ( 0 == ( iter->state & ITER_DONE ) )
+ res = &iter->line;
+ }
+ return res;
+}
+
+
+bool is_line_iter_done( const struct line_iter * iter )
+{
+ if ( iter != NULL )
+ return ( iter->state & ITER_DONE );
+ return true;
+}
+
+
+rc_t make_line_iter( struct line_iter ** iter,
+ const struct KStream * stream,
+ size_t buffer_size,
+ uint32_t timeout_ms )
+{
+ rc_t rc = 0;
+ line_iter * l = calloc( 1, sizeof * l );
+ if ( l == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "calloc( %d ) -> %R", ( sizeof * l ), rc );
+ }
+ else
+ {
+ l->stream = stream;
+ l->buffer.addr = malloc( buffer_size );
+ if ( l->buffer.addr == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ ErrMsg( "malloc( %d ) -> %R", ( buffer_size ), rc );
+ free( ( void * ) l );
+ }
+ else
+ {
+ l->buffer.size = buffer_size;
+ l->buffer.len = buffer_size;
+ l->content.addr = l->buffer.addr;
+ l->timeout_ms = timeout_ms;
+ read_line_iter( l );
+ if ( advance_line_iter( l ) )
+ {
+ *iter = l;
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcRange, rcInvalid );
+ release_line_iter( l );
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t stream_line_read( const struct KStream * stream, stream_line_handler_t on_line,
+ size_t buffer_size, uint32_t timeout_ms, void * data )
+{
+ struct line_iter * iter;
+ rc_t rc = make_line_iter( &iter, stream, buffer_size, timeout_ms );
+ if ( rc == 0 )
+ {
+ while ( rc == 0 && !is_line_iter_done( iter ) )
+ {
+ String * line = get_line_iter( iter );
+ rc = on_line( line, data );
+ advance_line_iter( iter );
+ }
+ release_line_iter( iter );
+ }
+ return rc;
+}
+
+
+static rc_t print_stream_line( const String * line, void * data )
+{
+ return KOutMsg( "%S\n", line );
+}
+
+rc_t print_stream( const struct KStream * stream, size_t buffer_size,
+ uint32_t timeout_ms, void * data )
+{
+ return stream_line_read( stream, print_stream_line, buffer_size, timeout_ms, data );
+}
diff --git a/tools/srapath/line_iter.h b/tools/srapath/line_iter.h
new file mode 100644
index 0000000..94a524d
--- /dev/null
+++ b/tools/srapath/line_iter.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_line_iter_
+#define _h_line_iter_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_kns_stream_
+#include <kns/stream.h>
+#endif
+
+struct line_iter;
+
+void release_line_iter( struct line_iter * iter );
+bool advance_line_iter( struct line_iter * iter );
+String * get_line_iter( struct line_iter * iter );
+bool is_line_iter_done( const struct line_iter * iter );
+
+rc_t make_line_iter( struct line_iter ** iter, const struct KStream * stream,
+ size_t buffer_size, uint32_t timeout_ms );
+
+typedef rc_t ( * stream_line_handler_t )( const String * line, void * data );
+
+rc_t stream_line_read( const struct KStream * stream, stream_line_handler_t on_line,
+ size_t buffer_size, uint32_t timeout_ms, void * data );
+
+typedef rc_t ( * stream_handler_t )( const struct KStream * stream, void * data );
+
+rc_t print_stream( const struct KStream * stream, size_t buffer_size,
+ uint32_t timeout_ms, void * data );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/srapath/srapath.c b/tools/srapath/srapath.c
new file mode 100644
index 0000000..c384524
--- /dev/null
+++ b/tools/srapath/srapath.c
@@ -0,0 +1,439 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "helper.h"
+#include "cgi_request.h"
+#include "line_iter.h"
+
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <vfs/manager.h>
+#include <kfs/directory.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/text.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h> /* STSMSG */
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <sysalloc.h>
+
+
+#include <limits.h> /* PATH_MAX */
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+
+static const char * func_usage[] = { "function to perform (resolve, names, search) default=resolve", NULL };
+#define OPTION_FUNC "funtion"
+#define ALIAS_FUNC "f"
+
+static const char * timeout_usage[] = { "timeout-value for request", NULL };
+#define OPTION_TIMEOUT "timeout"
+#define ALIAS_TIMEOUT "t"
+
+static const char * vers_usage[] = { "version-string for cgi-calls", NULL };
+#define OPTION_VERS "vers"
+#define ALIAS_VERS "e"
+
+static const char * url_usage[] = { "url to be used for cgi-calls", NULL };
+#define OPTION_URL "url"
+#define ALIAS_URL "u"
+
+static const char * param_usage[] = { "param to be added to cgi-call (tic=XXXXX)", NULL };
+#define OPTION_PARAM "param"
+#define ALIAS_PARAM "p"
+
+static const char * raw_usage[] = { "print the raw reply (instead of parsing it)", NULL };
+#define OPTION_RAW "raw"
+#define ALIAS_RAW "r"
+
+static const char * size_usage[] = { "print size of object", NULL };
+#define OPTION_SIZE "size"
+#define ALIAS_SIZE "s"
+
+static const char * date_usage[] = { "print date of object", NULL };
+#define OPTION_DATE "date"
+#define ALIAS_DATE "d"
+
+OptDef ToolOptions[] =
+{
+ { OPTION_FUNC, ALIAS_FUNC, NULL, func_usage, 1, true, false },
+ { OPTION_TIMEOUT, ALIAS_TIMEOUT, NULL, timeout_usage, 1, true, false },
+ { OPTION_VERS, ALIAS_VERS, NULL, vers_usage, 1, true, false },
+ { OPTION_URL, ALIAS_URL, NULL, url_usage, 1, true, false },
+ { OPTION_PARAM, ALIAS_PARAM, NULL, param_usage, 10, true, false },
+ { OPTION_SIZE, ALIAS_SIZE, NULL, size_usage, 1, false, false },
+ { OPTION_DATE, ALIAS_DATE, NULL, date_usage, 1, false, false },
+ { OPTION_RAW, ALIAS_RAW, NULL, raw_usage, 1, false, false }
+};
+
+const char UsageDefaultName[] = "srapath";
+
+
+rc_t CC UsageSummary( const char * progname )
+{
+ return OUTMSG(("\n"
+ "Usage:\n"
+ " %s [options] <accession> ...\n\n"
+ "Summary:\n"
+ " Tool to produce a list of full paths to files\n"
+ " (SRA and WGS runs, refseqs: reference sequences)\n"
+ " from list of NCBI accessions.\n"
+ "\n", progname));
+}
+
+
+rc_t CC Usage( const Args *args )
+{
+ rc_t rc;
+ uint32_t idx, count = ( sizeof ToolOptions ) / ( sizeof ToolOptions[ 0 ] );
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+
+ if ( args == NULL )
+ rc = RC( rcExe, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary( progname );
+
+ OUTMSG((
+ " Output paths are ordered according to accession list.\n"
+ "\n"
+ " The accession search path will be determined according to the\n"
+ " configuration. It will attempt to find files in local and site\n"
+ " repositories, and will also check remote repositories for run\n"
+ " location.\n"));
+ OUTMSG((
+ " This tool produces a path that is 'likely' to be a run, in that\n"
+ " an entry exists in the file system at the location predicted.\n"
+ " It is possible that this path will fail to produce success upon\n"
+ " opening a run if the path does not point to a valid object.\n\n"));
+
+ OUTMSG(( "Options:\n" ));
+
+ for ( idx = 0; idx < count; ++idx ) /* start with 1, do not advertize row-range-option*/
+ HelpOptionLine( ToolOptions[ idx ].aliases, ToolOptions[ idx ].name, NULL, ToolOptions[ idx ].help );
+
+ OUTMSG(( "\n" ));
+ HelpOptionsStandard();
+ HelpVersion( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+
+static rc_t resolve_one_argument( VFSManager * mgr, VResolver * resolver, const char * pc )
+{
+ const VPath * upath = NULL;
+ rc_t rc = VFSManagerMakePath( mgr, ( VPath** )&upath, "%s", pc );
+ if ( rc != 0 )
+ PLOGMSG( klogErr, ( klogErr, "failed to create VPath-object from '$(name)'", "name=%s", pc ) );
+ else
+ {
+ const VPath * local;
+ const VPath * remote;
+
+ rc = VResolverQuery( resolver, 0, upath, &local, &remote, NULL );
+ if ( rc == 0 )
+ {
+ const String * s;
+
+ if ( local != NULL )
+ rc = VPathMakeString( local, &s );
+ else
+ rc = VPathMakeString( remote, &s );
+ if ( rc == 0 )
+ {
+ OUTMSG(("%S\n", s));
+ free( ( void* )s );
+ }
+ VPathRelease( local );
+ VPathRelease( remote );
+ }
+ else
+ {
+ KDirectory * cwd;
+ rc_t orc = VFSManagerGetCWD( mgr, &cwd );
+ if ( orc == 0 )
+ {
+ KPathType kpt = KDirectoryPathType( cwd, "%s", pc );
+ switch ( kpt &= ~kptAlias )
+ {
+ case kptNotFound : STSMSG( 1, ( "'%s': not found while "
+ "searching the file system",
+ pc ) );
+ break;
+
+ case kptBadPath : STSMSG( 1, ( "'%s': bad path while "
+ "searching the file system",
+ pc ) );
+ break;
+
+ default : STSMSG( 1, ( "'%s': "
+ "found in the file system",
+ pc ) );
+ rc = 0;
+ break;
+ }
+ }
+ if ( orc == 0 && rc == 0 )
+ {
+ if ( rc != 0 )
+ {
+ PLOGMSG( klogErr, ( klogErr, "'$(name)': not found", "name=%s", pc ) );
+ }
+ else
+ {
+ char resolved[ PATH_MAX ] = "";
+ rc = KDirectoryResolvePath( cwd, true, resolved, sizeof resolved, "%s", pc );
+ if ( rc == 0 )
+ {
+ STSMSG( 1, ( "'%s': found in "
+ "the current directory at '%s'",
+ pc, resolved ) );
+ OUTMSG(( "%s\n", resolved ));
+ }
+ else
+ {
+ STSMSG( 1, ( "'%s': cannot resolve "
+ "in the current directory",
+ pc ) );
+ OUTMSG(( "./%s\n", pc ));
+ }
+ }
+ }
+ KDirectoryRelease( cwd );
+ }
+ }
+ VPathRelease( upath );
+ return rc;
+}
+
+
+static rc_t resolve_arguments( Args * args )
+{
+ uint32_t acount;
+ rc_t rc = ArgsParamCount( args, &acount );
+ if ( rc != 0 )
+ LOGERR ( klogInt, rc, "failed to count parameters" );
+ else if ( acount < 1 )
+ {
+ /* That useless: rc = */ MiniUsage( args );
+ rc = RC( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ }
+ else
+ {
+ VFSManager * mgr;
+ rc = VFSManagerMake( &mgr );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "failed to create VFSManager object" );
+ else
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver( mgr, &resolver );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "failed to get VResolver object" );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < acount; ++ idx )
+ {
+ const char * pc;
+ rc = ArgsParamValue( args, idx, ( const void ** )&pc );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "failed to retrieve parameter value" );
+ else
+ rc = resolve_one_argument( mgr, resolver, pc );
+ }
+ VResolverRelease( resolver );
+ }
+ VFSManagerRelease( mgr );
+ }
+ }
+ return rc;
+}
+
+
+/* ---------------------------------------------------------------------------- */
+
+static rc_t on_reply_line( const String * line, void * data )
+{
+ return KOutMsg( "%S\n", line );
+}
+
+typedef struct out_fmt
+{
+ bool raw, print_size, print_date;
+} out_fmt;
+
+
+static rc_t prepare_request( const Args * args, request_params * r, out_fmt * fmt,
+ bool for_names )
+{
+ rc_t rc = args_to_ptrs( args, &r->terms ); /* helper.c */
+ if ( rc == 0 )
+ rc = options_to_ptrs( args, OPTION_PARAM, &r->params ); /* helper.c */
+ if ( rc == 0 )
+ {
+ if ( for_names )
+ {
+ r->names_url = get_str_option( args, OPTION_URL, NULL ); /* helper.c */
+ r->names_ver = get_str_option( args, OPTION_VERS, NULL ); /* helper.c */
+ r->search_url = NULL;
+ r->search_ver = NULL;
+
+ }
+ else
+ {
+ r->names_url = NULL;
+ r->names_ver = NULL;
+ r->search_url = get_str_option( args, OPTION_URL, NULL ); /* helper.c */
+ r->search_ver = get_str_option( args, OPTION_VERS, NULL ); /* helper.c */
+ }
+ r->buffer_size = 4096;
+ r->timeout_ms = get_uint32_t_option( args, OPTION_TIMEOUT, 5000 );
+ }
+ fmt->raw = get_bool_option( args, OPTION_RAW );
+ fmt->print_size = get_bool_option( args, OPTION_SIZE );
+ fmt->print_date = get_bool_option( args, OPTION_DATE );
+ return rc;
+}
+
+
+/* ---------------------------------------------------------------------------- */
+
+static rc_t print_names_reply( const reply_obj * obj, void * data )
+{
+ rc_t rc;
+ out_fmt * fmt = data;
+
+ if ( obj->code == 200 )
+ {
+ if ( fmt->print_size )
+ rc = KOutMsg( "%22S %,12lu --> %S\n", obj->id, obj->size, obj->path );
+ else
+ rc = KOutMsg( "%22S --> %S\n", obj->id, obj->path );
+ }
+ else
+ rc = KOutMsg( "%22S --> %S (%d)\n", obj->id, obj->message, obj->code );
+
+ return rc;
+}
+
+static rc_t names_cgi( const Args * args )
+{
+ request_params r; /* cgi_request.h */
+ out_fmt fmt;
+ rc_t rc = prepare_request( args, &r, &fmt, true );
+ if ( rc == 0 )
+ {
+ uint32_t rslt_code;
+
+ if ( fmt.raw )
+ rc = raw_names_request( &r, on_reply_line, &rslt_code, NULL ); /* cgi_request.c */
+ else
+ {
+ struct reply_obj_list * list; /* cgi_request.h */
+ rc = names_request_to_list( &r, &rslt_code, &list ); /* cgi_request.c */
+ if ( rc == 0 )
+ {
+ rc = foreach_reply_obj( list, print_names_reply, &fmt ); /* cgi_request.c */
+ release_reply_obj_list( list ); /* cgi_request.c */
+ }
+ }
+
+ free( ( void * ) r.terms );
+ free( ( void * ) r.params );
+ }
+ return rc;
+}
+
+/* ---------------------------------------------------------------------------- */
+
+static rc_t print_search_reply( const reply_obj * obj, void * data )
+{
+ return KOutMsg( "(%S) %S --> %S\n", obj->obj_type, obj->id, obj->path );
+}
+
+static rc_t search_cgi( const Args * args )
+{
+ request_params r; /* cgi_request.h */
+ out_fmt fmt;
+ rc_t rc = prepare_request( args, &r, &fmt, false );
+ if ( rc == 0 )
+ {
+ uint32_t rslt_code;
+
+ if ( fmt.raw )
+ rc = raw_search_request( &r, on_reply_line, &rslt_code, NULL ); /* cgi_request.c */
+ else
+ {
+ struct reply_obj_list * list; /* cgi_request.h */
+ rc = search_request_to_list( &r, &rslt_code, &list, true ); /* cgi_request.c */
+ if ( rc == 0 )
+ {
+ rc = foreach_reply_obj( list, print_search_reply, &fmt ); /* cgi_request.c */
+ release_reply_obj_list( list ); /* cgi_request.c */
+ }
+ }
+
+ free( ( void * ) r.terms );
+ free( ( void * ) r.params );
+ }
+ return rc;
+}
+
+/* ---------------------------------------------------------------------------- */
+
+rc_t CC KMain( int argc, char *argv [] )
+{
+ Args * args;
+ uint32_t num_options = sizeof ToolOptions / sizeof ToolOptions [ 0 ];
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1, ToolOptions, num_options );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "failed to parse arguments" );
+ else
+ {
+ const char * f = get_str_option( args, OPTION_FUNC, NULL );
+ func_t ft = get_func_t( f );
+ switch ( ft )
+ {
+ case ft_resolve : rc = resolve_arguments( args ); break;
+ case ft_names : rc = names_cgi( args ); break;
+ case ft_search : rc = search_cgi( args ); break;
+ }
+ ArgsWhack( args );
+ }
+ return rc;
+}
diff --git a/tools/update-schema/.cvsignore b/tools/update-schema/.cvsignore
new file mode 100644
index 0000000..29f1a27
--- /dev/null
+++ b/tools/update-schema/.cvsignore
@@ -0,0 +1 @@
+*.vers.h
diff --git a/tools/update-schema/Makefile b/tools/update-schema/Makefile
new file mode 100644
index 0000000..dba9840
--- /dev/null
+++ b/tools/update-schema/Makefile
@@ -0,0 +1,77 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/update-schema
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ vdb-update-schema
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# update-schema
+#
+UPDATE_SCHEMA_SRC = \
+ update-schema \
+
+UPDATE_SCHEMA_OBJ = \
+ $(addsuffix .$(OBJX),$(UPDATE_SCHEMA_SRC))
+
+UPDATE_SCHEMA_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+
+$(BINDIR)/vdb-update-schema: $(UPDATE_SCHEMA_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(UPDATE_SCHEMA_LIB)
+
+#-------------------------------------------------------------------------------
diff --git a/tools/update-schema/update-schema.c b/tools/update-schema/update-schema.c
new file mode 100644
index 0000000..2ca2905
--- /dev/null
+++ b/tools/update-schema/update-schema.c
@@ -0,0 +1,454 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <vdb/vdb-priv.h> /* VTableStoreSchema */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/table.h>
+#include <vdb/schema.h> /* VSchema */
+#include <kdb/meta.h>
+#include <klib/out.h> /* OUTMSG */
+#include <klib/log.h> /* LOGERR */
+#include <klib/rc.h>
+#include <insdc/sra.h> /* SRA_PLATFORM_ ... */
+#include <assert.h>
+#include <string.h> /* memset */
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt,rc, "$(msg): $(name)","msg=%s,name=%s",msg,name)))
+#define DESTRUCT(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+typedef struct CmdArgs {
+ const char* run;
+ const char* schema;
+ const char* sPlatform;
+ uint8_t platform;
+ Args* args;
+ uint32_t count;
+ uint32_t i;
+} CmdArgs;
+typedef struct Db {
+ VDBManager* mgr;
+ VSchema* schema;
+ VTable* tbl;
+ KMetadata* meta;
+ bool frozen;
+ bool updatedPlatf;
+ bool deletedSchema;
+} Db;
+#define OPTION_PLATF "platform"
+#define ALIAS_PLATF "p"
+static const char* platf_usage[] = { "Platform: LS454 | ILLUMINA | HELICOS",
+ " | ABI_SOLID | COMPLETE_GENOMICS", " | PACBIO_SMRT | ION_TORRENT | CAPILLARY | OXFORD_NANOPORE", NULL };
+#define OPTION_SCHEMA "schema"
+#define ALIAS_SCHEMA "s"
+static const char* schema_usage[] = { "Schema", NULL };
+#define OPTION_RUN "out"
+#define ALIAS_RUN "o"
+static const char* run_usage [] = { "Run", NULL };
+OptDef Options[] = {
+ { OPTION_RUN , ALIAS_RUN , NULL, run_usage , 1, true , true }
+ , { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 1, true , true }
+ , { OPTION_PLATF , ALIAS_PLATF , NULL, platf_usage , 1, true , true }
+};
+
+rc_t CC UsageSummary (const char * progname)
+{
+ OUTMSG (("\n"
+ "Usage:\n"
+ " %s -o <run> [ -s <schema-table-or-db-spec>\n"
+ " [ -p <platform-name> ] ] <schema-file> ...\n"
+ "\n"
+ "Summary:\n"
+ " Update table schema\n"
+ "\n", progname));
+ return 0;
+}
+
+const char UsageDefaultName[] = "check-blob-size";
+#define def_name UsageDefaultName
+
+rc_t CC Usage(const Args* args)
+{
+ rc_t rc = 0;
+ const char* progname = def_name;
+ const char* fullpath = def_name;
+ assert(args);
+ rc = ArgsProgram(args, &fullpath, &progname);
+ if (rc)
+ { progname = fullpath = def_name; }
+ UsageSummary(progname);
+ OUTMSG(("\nOptions\n"));
+ HelpOptionLine(ALIAS_RUN, OPTION_RUN , "run" , run_usage);
+ HelpOptionLine
+ (ALIAS_SCHEMA, OPTION_SCHEMA, "schema-table-spec", schema_usage);
+ HelpOptionLine(ALIAS_PLATF, OPTION_PLATF, "platform-name" , platf_usage);
+ HelpOptionsStandard();
+ HelpVersion(fullpath, KAppVersion());
+ return rc;
+}
+
+/* MINIUSAGE(def_name) */
+static rc_t CmdArgsInit(int argc, char** argv, CmdArgs* cmdArgs)
+{
+ rc_t rc = 0;
+ Args* args = NULL;
+ assert(argv && cmdArgs);
+
+ memset(cmdArgs, 0, sizeof *cmdArgs);
+
+ rc = ArgsMakeAndHandle(&cmdArgs->args,
+ argc, argv, 1, Options, sizeof Options / sizeof Options[0]);
+ DISP_RC(rc, "while calling ArgsMakeAndHandle");
+ args = cmdArgs->args;
+
+ while (rc == 0) {
+ uint32_t pcount = 0;
+
+ /* run parameter */
+ rc = ArgsOptionCount(args, OPTION_RUN, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing run name");
+ break;
+ }
+ if (pcount < 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "Missing run parameter");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many run parameters");
+ break;
+ }
+ rc = ArgsOptionValue (args, OPTION_RUN, 0, (const void **)&cmdArgs->run);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving run name");
+ break;
+ }
+
+ /* platform parameter */
+ rc = ArgsOptionCount(args, OPTION_PLATF, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing platform");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many platform parameters");
+ break;
+ }
+ assert(SRA_PLATFORM_UNDEFINED == 0);
+ if (pcount == 1) {
+ uint8_t p = SRA_PLATFORM_UNDEFINED;
+ const char* arg = NULL;
+ rc = ArgsOptionValue(args, OPTION_PLATF, 0, (const void **)&arg);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving platform");
+ break;
+ }
+ if (!strcmp(arg, "454"))
+ { p = SRA_PLATFORM_454; }
+ else if (!strcmp(arg, "LS454"))
+ { p = SRA_PLATFORM_454; }
+ else if (!strcmp(arg, "ILLUMINA"))
+ { p = SRA_PLATFORM_ILLUMINA; }
+ else if (!strcmp(arg, "HELICOS"))
+ { p = SRA_PLATFORM_HELICOS; }
+ else if (!strcmp(arg, "ABI_SOLID"))
+ { p = SRA_PLATFORM_ABSOLID; }
+ else if (!strcmp(arg, "COMPLETE_GENOMICS"))
+ { p = SRA_PLATFORM_COMPLETE_GENOMICS; }
+ else if (!strcmp(arg, "PACBIO_SMRT"))
+ { p = SRA_PLATFORM_PACBIO_SMRT; }
+ else if (!strcmp(arg, "ION_TORRENT"))
+ { p = SRA_PLATFORM_ION_TORRENT; }
+ else if (!strcmp(arg, "CAPILLARY"))
+ { p = SRA_PLATFORM_CAPILLARY; }
+ else if (!strcmp(arg, "OXFORD_NANOPORE"))
+ { p = SRA_PLATFORM_OXFORD_NANOPORE; }
+ else {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ PLOGERR(klogInt, (klogInt, rc, "Invalid platform: $(name)",
+ "name=%s", arg));
+ break;
+ }
+ cmdArgs->platform = p;
+ cmdArgs->sPlatform = arg;
+ }
+
+ /* schema parameter */
+ rc = ArgsOptionCount(args, OPTION_SCHEMA, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure parsing schema");
+ break;
+ }
+ if (pcount > 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcAmbiguous);
+ LOGERR(klogErr, rc, "Too many schema parameters");
+ break;
+ }
+ else if (pcount == 1) {
+ rc = ArgsOptionValue(args, OPTION_SCHEMA, 0, (const void **)&cmdArgs->schema);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure retrieving schema");
+ break;
+ }
+ }
+ else if (/* pcount < 0 && */ cmdArgs->platform) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR
+ (klogErr, rc, "Schema is required when platform is specified");
+ }
+
+ break;
+ }
+
+ if (rc == 0) {
+ do {
+ rc = ArgsParamCount(args, &cmdArgs->count);
+ if (rc) {
+ DISP_RC(rc, "while calling ArgsParamCount");
+ break;
+ }
+ if (cmdArgs->count < 1) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ LOGERR(klogErr, rc, "Missing schema parameter");
+ break;
+ }
+ } while (false);
+ }
+
+ if (rc != 0)
+ { MiniUsage(cmdArgs->args); }
+
+ return rc;
+}
+
+static rc_t CmdArgsGetNextParam(CmdArgs* args, const char** param)
+{
+ rc_t rc = 0;
+ assert(args && param);
+ *param = NULL;
+ if (args->i >= args->count) /* no more parameters to give :( */
+ { return rc; }
+ rc = ArgsParamValue(args->args, args->i, (const void **)param);
+ if (rc) {
+ PLOGERR(klogInt, (klogInt, rc,
+ "while calling ArgsParamValue($(i))", "i=%d", args->i));
+ }
+ ++args->i;
+ return rc;
+}
+
+static rc_t DbConstruct(Db* db, CmdArgs* args) {
+ rc_t rc = 0;
+ assert(db && args);
+ memset(db, 0, sizeof *db);
+ if (rc == 0) {
+ rc = VDBManagerMakeUpdate(&db->mgr, NULL);
+ DISP_RC(rc, "While calling VDBManagerMakeUpdate");
+ }
+ if (rc == 0) {
+ rc = VDBManagerMakeSchema(db->mgr, &db->schema);
+ DISP_RC(rc, "While calling VDBManagerMakeSchema");
+ }
+ while (rc == 0) {
+ const char* param = NULL;
+ rc = CmdArgsGetNextParam(args, ¶m);
+ if (param == NULL)
+ { break; }
+ rc = VSchemaParseFile(db->schema, "%s", param);
+ DISP_RC2(rc, param, "While calling VSchemaParseFile");
+ }
+ if (rc == 0) {
+ rc =
+ VDBManagerOpenTableUpdate(db->mgr, &db->tbl, db->schema, args->run);
+ DISP_RC2(rc, args->run, "While calling VDBManagerOpenTableUpdate");
+ }
+ if (rc == 0) {
+ rc = VTableOpenMetadataUpdate(db->tbl, &db->meta);
+ DISP_RC(rc, "While calling VTableOpenMetadataUpdate");
+ }
+ return rc;
+}
+
+static rc_t DbBeginTran(Db* self)
+{
+ rc_t rc = 0;
+ assert(self);
+ if (rc == 0) {
+ rc = KMetadataFreeze(self->meta);
+ DISP_RC(rc, "While calling KMetadataFreeze");
+ if (rc == 0)
+ { self->frozen = true; }
+ }
+ return rc;
+}
+
+static rc_t DbUpdatePlatform(Db* self, const CmdArgs* args)
+{
+ rc_t rc = 0;
+ bool toUpdate = false;
+ const char path[] = "col/PLATFORM/row";
+ const KMDataNode* rNode = NULL;
+ KMDataNode* uNode = NULL;
+ assert(self && args);
+ if (rc == 0) {
+ rc = KMetadataOpenNodeRead(self->meta, &rNode, "%s", path);
+ DISP_RC2(rc, path, "While calling KMetadataOpenNodeRead");
+ }
+ if (rc == 0) {
+ uint8_t p = SRA_PLATFORM_UNDEFINED;
+ rc = KMDataNodeReadB8(rNode, &p);
+ DISP_RC2(rc, path, "While reading KMetaNode");
+ if (rc == 0 && p == args->platform) {
+ PLOGMSG(klogWarn, (klogWarn,
+ "PLATFORM is set already to $(PLATFORM)",
+ "PLATFORM=%s", args->sPlatform));
+ }
+ else { toUpdate = true; }
+ }
+ DESTRUCT(KMDataNode, rNode);
+ if (toUpdate) {
+ if (rc == 0) {
+ rc = KMetadataOpenNodeUpdate(self->meta, &uNode, "%s", path);
+ DISP_RC2(rc, path, "While calling KMetadataOpenNodeUpdate");
+ }
+ if (rc == 0) {
+ rc = KMDataNodeWriteB8(uNode, &args->platform);
+ DISP_RC2(rc, path, "While writing KMetaNode");
+ if (rc == 0)
+ { self->updatedPlatf = true; }
+ }
+ }
+ DESTRUCT(KMDataNode, uNode);
+ return rc;
+}
+
+static rc_t DbDeleteSchema(Db* self)
+{
+ rc_t rc = 0;
+ KMDataNode* uNode = NULL;
+ const char path[] = "schema";
+ assert(self);
+ if (rc == 0) {
+ rc = KMetadataOpenNodeUpdate(self->meta, &uNode, "%s", path);
+ DISP_RC2(rc, path, "While calling KMetadataOpenNodeUpdate");
+ }
+ if (rc == 0) {
+ rc = KMDataNodeDropAll(uNode);
+ DISP_RC2(rc, path, "While calling KMDataNodeDropAll");
+ if (rc == 0)
+ { self->deletedSchema = true; }
+ }
+ DESTRUCT(KMDataNode, uNode);
+ return rc;
+}
+
+static rc_t DbCloseTbl(Db* self)
+{
+ rc_t rc = 0;
+ assert(self);
+ DESTRUCT(KMetadata, self->meta);
+ DESTRUCT(VTable, self->tbl);
+ return rc;
+}
+
+static rc_t DbDestruct(Db* self) {
+ rc_t rc = 0;
+ assert(self);
+ DESTRUCT(KMetadata, self->meta);
+ DESTRUCT(VTable, self->tbl);
+ DESTRUCT(VSchema, self->schema);
+ DESTRUCT(VDBManager, self->mgr);
+ return rc;
+}
+
+static rc_t DbStoreSchema(Db* self, const CmdArgs* args)
+{
+ rc_t rc = 0;
+ bool metaUpdated = false;
+ assert(self && args);
+ if (self->updatedPlatf || self->deletedSchema)
+ { metaUpdated = true; }
+ if (metaUpdated) {
+ if (rc == 0) {
+ rc = DbCloseTbl(self);
+ DISP_RC(rc, "While calling VTableRelease");
+ }
+ if (rc == 0) {
+ rc = VDBManagerCreateTable(self->mgr,
+ &self->tbl, self->schema, args->schema, kcmOpen, "%s", args->run);
+ DISP_RC2(rc, args->run, "While calling VDBManagerCreateTable");
+ }
+ }
+ else {
+ rc = VTableStoreSchema(self->tbl);
+ DISP_RC(rc, "While calling VTableStoreSchema");
+ }
+ return rc;
+}
+
+static rc_t DbRollbackTran(Db* self)
+{
+ rc_t rc = 0;
+ assert(self);
+ return rc;
+}
+
+rc_t CC KMain(int argc, char* argv[])
+{
+ rc_t rc = 0;
+ CmdArgs args;
+ Db db;
+ memset(&db, 0, sizeof db);
+ if (rc == 0)
+ { rc = CmdArgsInit(argc, argv, &args); }
+ if (rc == 0)
+ { rc = DbConstruct(&db, &args); }
+ if (rc == 0) {
+ rc = DbBeginTran(&db);
+ if (rc == 0 && args.platform)
+ { rc = DbUpdatePlatform(&db, &args); }
+ if (rc == 0 && args.schema)
+ { rc = DbDeleteSchema(&db); }
+ if (rc == 0)
+ { rc = DbStoreSchema(&db, &args); }
+ if (rc != 0)
+ { DbRollbackTran(&db); }
+ }
+ {
+ rc_t rc2 = DbDestruct(&db);
+ if (rc2 != 0 && rc == 0)
+ { rc = rc2; }
+ }
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/util/Makefile b/tools/util/Makefile
new file mode 100644
index 0000000..1c62d56
--- /dev/null
+++ b/tools/util/Makefile
@@ -0,0 +1,393 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/util
+
+INT_TOOLS = \
+ crc32sum \
+ kdb-index \
+ pacbio-correct \
+ schema-replace \
+ sortreadtest \
+ rowwritetest \
+ samview \
+ testld \
+ txt2kdb \
+# pseudo-aligner \
+
+
+EXT_TOOLS = \
+ rcexplain \
+ kdbmeta \
+ md5cp \
+ vdb-lock \
+ vdb-unlock \
+ test-sra \
+ vdb-passwd \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# rcexplain - explain a return code observed in debugger
+#
+RCEXPLAIN_SRC = \
+ rcexplain
+
+RCEXPLAIN_OBJ = \
+ $(addsuffix .$(OBJX),$(RCEXPLAIN_SRC))
+
+RCEXPLAIN_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+$(BINDIR)/rcexplain: $(RCEXPLAIN_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(RCEXPLAIN_LIB)
+
+
+#-------------------------------------------------------------------------------
+# kdbmeta - query and update metadata files
+#
+KDBMETA_SRC = \
+ kdbmeta
+
+KDBMETA_OBJ = \
+ $(addsuffix .$(OBJX),$(KDBMETA_SRC))
+
+KDBMETA_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/kdbmeta: $(KDBMETA_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(KDBMETA_LIB)
+
+
+#-------------------------------------------------------------------------------
+# vdb-lock
+# lock a vdb object
+#
+VDB_LOCK_SRC = \
+ vdb-lock
+
+VDB_LOCK_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_LOCK_SRC))
+
+VDB_LOCK_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/vdb-lock: $(VDB_LOCK_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_LOCK_LIB)
+
+
+#-------------------------------------------------------------------------------
+# vdb-unlock
+# unlock a vdb object
+#
+VDB_UNLOCK_SRC = \
+ vdb-unlock
+
+VDB_UNLOCK_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_UNLOCK_SRC))
+
+VDB_UNLOCK_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/vdb-unlock: $(VDB_UNLOCK_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_UNLOCK_LIB)
+
+
+#-------------------------------------------------------------------------------
+# testld - test dynamic load of libraries
+#
+TESTLD_SRC = \
+ testld
+
+TESTLD_OBJ = \
+ $(addsuffix .$(OBJX),$(TESTLD_SRC))
+
+TESTLD_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/testld: $(TESTLD_OBJ)
+ $(LD) --exe -o $@ $^ $(TESTLD_LIB)
+
+
+#-------------------------------------------------------------------------------
+# test-sra: print config, resolve sra, check dependencies
+#
+
+T_SRC = \
+ PrintOS \
+ test-sra \
+
+T_OBJ = \
+ $(addsuffix .$(OBJX),$(T_SRC))
+
+T_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/test-sra: $(T_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(T_LIB)
+
+#-------------------------------------------------------------------------------
+# txt2kdb - test dynamic load of libraries
+#
+TXT2KDB_SRC = \
+ txt2kdb
+
+TXT2KDB_OBJ = \
+ $(addsuffix .$(OBJX),$(TXT2KDB_SRC))
+
+TXT2KDB_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+
+
+$(BINDIR)/txt2kdb: $(TXT2KDB_OBJ)
+ $(LD) --exe -o $@ $^ $(TXT2KDB_LIB)
+
+#----------------------------------------------------------------
+# md5cp
+#
+MD5CP_SRC = \
+ md5cp
+
+MD5CP_OBJ = \
+ $(addsuffix .$(OBJX),$(MD5CP_SRC))
+
+MD5CP_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/md5cp: $(MD5CP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(MD5CP_LIB)
+
+
+#----------------------------------------------------------------
+# rowwritetest
+#
+ROWWRITETEST_SRC = \
+ rowwritetest
+
+ROWWRITETEST_OBJ = \
+ $(addsuffix .$(OBJX),$(ROWWRITETEST_SRC))
+
+ROWWRITETEST_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+
+
+$(BINDIR)/rowwritetest: $(ROWWRITETEST_OBJ)
+ $(LD) --exe -o $@ $^ $(ROWWRITETEST_LIB)
+
+
+#-------------------------------------------------------------------------------
+# crc32sum
+# behaves a lot like md5sum
+#
+CRC32SUM_SRC = \
+ crc32sum
+
+CRC32SUM_OBJ = \
+ $(addsuffix .$(OBJX),$(CRC32SUM_SRC))
+
+CRC32SUM_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/crc32sum: $(CRC32SUM_OBJ)
+ $(LD) --exe -o $@ $^ $(CRC32SUM_LIB)
+
+
+#-------------------------------------------------------------------------------
+# samview
+# for testing bam/sam code
+#
+SAMVIEW_SRC = \
+ samview
+
+SAMVIEW_OBJ = \
+ $(addsuffix .$(OBJX),$(SAMVIEW_SRC))
+
+SAMVIEW_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/samview: $(SAMVIEW_OBJ)
+ $(LD) --exe -o $@ $^ $(SAMVIEW_LIB)
+
+
+#-------------------------------------------------------------------------------
+# pseudo-aligner
+# for generating test data
+#
+SUDO_ALGN_SRC = \
+ pseudo-aligner
+
+SUDO_ALGN_OBJ = \
+ $(addsuffix .$(OBJX),$(SUDO_ALGN_SRC))
+
+$(BINDIR)/pseudo-aligner: $(SUDO_ALGN_OBJ)
+ $(LP) --exe -o $@ $^
+
+
+#----------------------------------------------------------------
+# sortreadtest
+#
+SORTREADTEST_SRC = \
+ sortreadtest
+
+SORTREADTEST_OBJ = \
+ $(addsuffix .$(OBJX),$(SORTREADTEST_SRC))
+
+SORTREADTEST_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-wvdb \
+
+
+$(BINDIR)/sortreadtest: $(SORTREADTEST_OBJ)
+ $(LD) --exe -o $@ $^ $(SORTREADTEST_LIB)
+
+
+#----------------------------------------------------------------
+# vdb-passwd
+#
+VDB_PASSWD_SRC = \
+ vdb-passwd \
+ syspass
+
+VDB_PASSWD_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_PASSWD_SRC))
+
+VDB_PASSWD_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+
+$(BINDIR)/vdb-passwd: $(VDB_PASSWD_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_PASSWD_LIB)
+
+
+#----------------------------------------------------------------
+# schema-replace
+#
+SCHEMA_REPLACE_SRC = \
+ schema-replace
+
+SCHEMA_REPLACE_OBJ = \
+ $(addsuffix .$(OBJX),$(SCHEMA_REPLACE_SRC))
+
+SCHEMA_REPLACE_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/schema-replace: $(SCHEMA_REPLACE_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(SCHEMA_REPLACE_LIB)
+
+#-------------------------------------------------------------------------------
+# pacbio-correct-tool
+#
+PACBIO_CORRECT_SRC = \
+ pacbio-correct
+
+PACBIO_CORRECT_OBJ = \
+ $(addsuffix .$(OBJX),$(PACBIO_CORRECT_SRC))
+
+PACBIO_CORRECT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+
+
+$(BINDIR)/pacbio-correct: $(PACBIO_CORRECT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(PACBIO_CORRECT_LIB)
+
+#-------------------------------------------------------------------------------
+# kdb-index
+#
+KDBINDEX_SRC = \
+ kdb-index
+
+KDBINDEX_OBJ = \
+ $(addsuffix .$(OBJX),$(KDBINDEX_SRC))
+
+KDBINDEX_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+
+$(BINDIR)/kdb-index: $(KDBINDEX_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(KDBINDEX_LIB)
diff --git a/tools/util/crc32sum.c b/tools/util/crc32sum.c
new file mode 100644
index 0000000..5d13c9e
--- /dev/null
+++ b/tools/util/crc32sum.c
@@ -0,0 +1,272 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/args.h>
+#include <klib/checksum.h>
+#include <klib/status.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <kapp/main.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+
+static
+int crc32sum_calc ( FILE *in, uint32_t *crc32 )
+{
+ int status;
+ char *buff = malloc ( 32 * 1024 );
+ if ( buff == NULL )
+ return errno;
+
+ for ( status = 0, * crc32 = 0;; )
+ {
+ size_t num_read = fread ( buff, 1, 32 * 1024, in );
+ if ( num_read == 0 )
+ {
+ if ( ! feof ( in ) )
+ status = ferror ( in );
+ break;
+ }
+
+ * crc32 = CRC32 ( * crc32, buff, num_read );
+ }
+
+ free ( buff );
+
+ return status;
+}
+
+static
+int crc32sum_check ( FILE *in, const char *fname )
+{
+ int cnt, mismatches;
+ char line [ 5 * 1024 ];
+ for ( cnt = mismatches = 0; fgets ( line, sizeof line, in ) != NULL; ++ cnt )
+ {
+ char *p;
+ FILE *src;
+ int status, bin = 0;
+ uint32_t prior, crc32;
+
+ if ( line [ 0 ] == 0 )
+ {
+ -- cnt;
+ continue;
+ }
+
+ p = strrchr ( line, '\n' );
+ if ( p != 0 )
+ * p = 0;
+
+ prior = strtoul ( line, & p, 16 );
+ if ( ( p - line ) != 8 || p [ 0 ] != ' ' )
+ {
+ fprintf ( stderr, "badly formatted file '%s'\n", fname );
+ return EINVAL;
+ }
+
+ if ( p [ 1 ] == '*' )
+ bin = 1;
+ else if ( p [ 1 ] != ' ' )
+ {
+ fprintf ( stderr, "badly formatted file '%s'\n", fname );
+ return EINVAL;
+ }
+
+ src = fopen ( p += 2, bin ? "rb" : "r" );
+ if ( src == NULL )
+ {
+ status = errno;
+ fprintf ( stderr, "failed to open file '%s': %s\n", p, strerror ( status ) );
+ return status;
+ }
+
+ status = crc32sum_calc ( src, & crc32 );
+
+ fclose ( src );
+
+ if ( status != 0 )
+ fprintf ( stderr, "error processing file '%s': %s\n", p, strerror ( status ) );
+ else
+ {
+ printf ( "%s: %s\n", p, ( crc32 == prior ) ? "OK" : "FAILED" );
+ if ( crc32 != prior )
+ ++ mismatches;
+ }
+ }
+
+ if ( mismatches != 0 )
+ fprintf ( stderr, "WARNING: %d of %d computed checksums did NOT match\n", mismatches, cnt );
+
+ if ( ! feof ( in ) )
+ return ferror ( in );
+ return 0;
+}
+
+static
+int crc32sum_gen ( FILE *in, const char *fname, int bin )
+{
+ uint32_t crc32;
+ int status = crc32sum_calc ( in, & crc32 );
+ if ( status != 0 )
+ fprintf ( stderr, "error processing file '%s': %s\n", fname, strerror ( status ) );
+ else
+ printf ( "%08x %c%s\n", crc32, bin ? '*' : ' ', fname );
+ return status;
+}
+
+
+#define OPTION_BINARY "binary"
+#define OPTION_CHECK "check"
+#define ALIAS_BINARY "b"
+#define ALIAS_CHECK "c"
+
+static const char * binary_usage[] = { "open file in binary mode", NULL };
+static const char * check_usage[] = { "check CRC32 against given list", NULL };
+
+OptDef Options[] =
+{
+ { OPTION_BINARY, ALIAS_BINARY, NULL, binary_usage, 0, false, false },
+ { OPTION_CHECK, ALIAS_CHECK, NULL, check_usage, 0, false, false }
+};
+
+
+
+const char UsageDefaultName[] = "crc32sum";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg("\n"
+ "Usage:\n"
+ " %s [Options] File [File ...]\n"
+ "\n"
+ "Summary:\n"
+ " Generate or test crc32 file checks\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options\n");
+
+ HelpOptionLine (ALIAS_BINARY, OPTION_BINARY, NULL, binary_usage);
+
+ HelpOptionLine (ALIAS_CHECK, OPTION_CHECK, NULL, check_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+rc_t CC KMain (int argc, char * argv [])
+{
+ Args *args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1,
+ Options, sizeof (Options) / sizeof (OptDef));
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+ int check;
+ int bin;
+
+ rc = ArgsOptionCount (args, OPTION_BINARY, &pcount);
+ if (rc) break;
+
+ bin = (pcount != 0);
+
+ rc = ArgsOptionCount (args, OPTION_CHECK, &pcount);
+ if (rc) break;
+
+ check = (pcount != 0);
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc) break;
+
+ if (pcount == 0)
+ {
+ MiniUsage(args);
+ }
+ else
+ {
+ uint32_t i;
+
+ CRC32Init ();
+
+ for ( i = 0; i < pcount; ++ i )
+ {
+
+ int status;
+ const char *fname;
+ FILE *in;
+
+ rc = ArgsParamValue (args, i, (const void **)&fname);
+
+ in = fopen ( fname, bin ? "rb" : "r" );
+
+ if ( in == NULL )
+ {
+ fprintf ( stderr, "failed to open file '%s'\n", fname );
+ return -1;
+ }
+
+ status = check ?
+ crc32sum_check ( in, fname ):
+ crc32sum_gen ( in, fname, bin );
+
+ fclose ( in );
+
+ if ( status != 0 )
+ return status;
+ }
+ }
+ } while (0);
+ }
+
+ return 0;
+}
diff --git a/tools/util/kdb-index.c b/tools/util/kdb-index.c
new file mode 100644
index 0000000..30996db
--- /dev/null
+++ b/tools/util/kdb-index.c
@@ -0,0 +1,257 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/index.h>
+#include <klib/text.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <string.h>
+#include <stdio.h>
+
+static bool keys_only;
+static const char * app_name;
+
+static
+rc_t run_idx ( const KIndex * idx, const char * spec )
+{
+ rc_t rc = 0;
+ uint64_t span;
+ int64_t id, start_id;
+
+ for ( id = 1; ; id = start_id + span )
+ {
+ size_t ksize;
+ char key [ 256 ];
+
+ rc = KIndexProjectText ( idx, id, & start_id, & span, key, sizeof key, & ksize );
+ if ( rc != 0 )
+ {
+ if ( GetRCState ( rc ) == rcNotFound && GetRCObject ( rc ) == rcId )
+ rc = 0;
+ break;
+ }
+
+ if ( keys_only )
+ KOutMsg ( "%s\n", key );
+ else
+ KOutMsg ( "'%s': start = %'ld, span = %'lu\n", key, start_id, span );
+
+#if 0
+ /* just for the fun of it, now try to look up the key */
+ {
+ int64_t start2;
+ uint64_t count2;
+ rc_t rc2 = KIndexFindText ( idx, key, & start2, & count2, NULL, NULL );
+ if ( rc2 != 0 )
+ fprintf ( stderr, "failed to find key '%s' in index\n", key );
+ else
+ KOutMsg ( " key lookup returned start = %'ld, span = %'lu\n", start2, count2 );
+ }
+#endif
+ }
+
+ return rc;
+}
+
+static
+rc_t run_tbl ( const KTable * tbl, const char * spec, const char * idx_spec )
+{
+ const KIndex * idx;
+ rc_t rc = KTableOpenIndexRead ( tbl, & idx, "%s", idx_spec );
+ if ( rc == 0 )
+ {
+ rc = run_idx ( idx, spec );
+ KIndexRelease ( idx );
+ }
+
+ return rc;
+}
+
+static
+rc_t run_db ( const KDatabase * db, const char * spec, const char * tbl_idx )
+{
+ rc_t rc = 0;
+ const KTable * tbl;
+
+ size_t tlen = string_size ( tbl_idx );
+ const char * idx = string_chr ( tbl_idx, tlen, ':' );
+ if ( idx != NULL )
+ {
+ tlen = idx - tbl_idx;
+ ++ idx;
+ }
+
+ rc = KDatabaseOpenTableRead ( db, & tbl, "%.*s", ( uint32_t ) tlen, tbl_idx );
+ if ( rc == 0 )
+ {
+ rc = run_tbl ( tbl, spec, idx ? idx : "ref_spec" );
+ KTableRelease ( tbl );
+ }
+
+ return rc;
+}
+
+static
+rc_t run ( const KDBManager * mgr, const char * spec )
+{
+ rc_t rc = 0;
+
+ const KTable * tbl;
+ const KDatabase * db;
+
+ size_t slen = string_size ( spec );
+ const char * tbl_idx = string_chr ( spec, slen, ':' );
+ if ( tbl_idx != NULL )
+ {
+ slen = tbl_idx - spec;
+ ++ tbl_idx;
+ }
+
+ switch ( KDBManagerPathType ( mgr, "%.*s", ( uint32_t ) slen, spec ) )
+ {
+ case kptDatabase:
+ rc = KDBManagerOpenDBRead ( mgr, & db, "%.*s", ( uint32_t ) slen, spec );
+ if ( rc == 0 )
+ {
+ rc = run_db ( db, spec, tbl_idx ? tbl_idx : "STATS:ref_spec" );
+ KDatabaseRelease ( db );
+ }
+ break;
+ case kptTable:
+ rc = KDBManagerOpenTableRead ( mgr, & tbl, "%.*s", ( uint32_t ) slen, spec );
+ if ( rc == 0 )
+ {
+ rc = run_tbl ( tbl, spec, tbl_idx ? tbl_idx : "ref_spec" );
+ KTableRelease ( tbl );
+ }
+ break;
+ default:
+ rc = RC ( rcApp, rcMgr, rcAccessing, rcPath, rcIncorrect );
+ }
+ return rc;
+}
+
+static
+void print_help ( void )
+{
+ size_t nlen = string_size ( app_name );
+ const char * short_name = string_rchr ( app_name, nlen, '/' );
+ if ( short_name ++ == NULL )
+ short_name = app_name;
+
+ KOutMsg ( "\n"
+ "Usage:\n"
+ " %s [ options ] obj-spec [ obj-spec.. ]\n"
+ "\n"
+ "Object Specification:\n"
+ " <db-path-or-accession> [ ':' <table-name> [ ':' <index-name> ] ]\n"
+ " <tbl-path-or-accession> [ ':' <index-name> ]\n"
+ "\n"
+ "Options:\n"
+ " -k|--keys-only only list keys\n"
+ " -h|--help print this message\n"
+ "\n"
+ "%s : %V\n"
+ "\n"
+ , short_name
+ , app_name
+ , KAppVersion ()
+ );
+}
+
+rc_t CC Usage ( struct Args const * args )
+{
+ return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc = 0;
+ int i, count = 0;
+ const KDBManager * mgr;
+
+ app_name = argv [ 0 ];
+
+ for ( i = 1; i < argc; ++ i )
+ {
+ const char * arg = argv [ i ];
+ if ( arg [ 0 ] != '-' )
+ argv [ ++ count ] = ( char * ) arg;
+ else do switch ( ( ++ arg ) [ 0 ] )
+ {
+ case 'k':
+ keys_only = true;
+ break;
+ case 'h':
+ case '?':
+ print_help ();
+ return 0;
+ case '-':
+ ++ arg;
+ if ( strcmp ( arg, "keys-only" ) == 0 )
+ keys_only = true;
+ else if ( strcmp ( arg, "help" ) == 0 )
+ {
+ print_help ();
+ return 0;
+ }
+ else
+ {
+ fprintf ( stderr, "%s: unrecognized switch: '--%s'\n", argv [ 0 ], arg );
+ return -1;
+ }
+ arg = "\0";
+ break;
+ default:
+ fprintf ( stderr, "%s: unrecognized switch: '-%c'\n", argv [ 0 ], arg [ 0 ] );
+ return -1;
+ }
+ while ( arg [ 1 ] != 0 );
+ }
+
+ if ( count == 0 )
+ {
+ fprintf ( stderr, "%s: at least one object spec is required\n", argv [ 0 ] );
+ return -1;
+ }
+
+ rc = KDBManagerMakeRead ( & mgr, NULL );
+ if ( rc == 0 )
+ {
+
+ for ( i = 1; rc == 0 && i <= count; ++ i )
+ rc = run ( mgr, argv [ i ] );
+
+ KDBManagerRelease ( mgr );
+ }
+
+ return rc;
+}
diff --git a/tools/util/kdbmeta.c b/tools/util/kdbmeta.c
new file mode 100644
index 0000000..980a38a
--- /dev/null
+++ b/tools/util/kdbmeta.c
@@ -0,0 +1,1332 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+/*
+ * This program has a command line sytax that isn't suited to the
+ * normally expected way of handling command line arguments.
+ *
+ * We'll use the normal Args processing for the standard options
+ * but a simple stepping throught the argv stored arguments
+ * for the "big loop"
+ */
+
+
+/* The original intention of this tool was to support updating nodes.
+ This was later removed with the thought that this functionality would
+ be better implemented by another tool.
+
+ Going to temporarily add it in...
+*/
+#define ALLOW_UPDATE 1
+
+#include <sra/srapath.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kdb/kdb-priv.h>
+#include <vfs/manager.h>
+#include <vfs/resolver.h>
+#include <vfs/path.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/vector.h>
+#include <klib/namelist.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/writer.h>
+#include <klib/rc.h>
+#include <sysalloc.h>
+#include <os-native.h>
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+/* use cpp define CONST */
+#undef CONST
+#if ALLOW_UPDATE
+#define CONST
+#else
+#define CONST const
+#endif
+
+typedef struct KDBMetaParms KDBMetaParms;
+struct KDBMetaParms
+{
+ CONST KDBManager *mgr;
+ CONST KMetadata *md;
+ const char *targ;
+ const Vector *q;
+ rc_t rc;
+};
+
+/* select reporting
+ */
+static bool xml_ish = true;
+static int indent_lvl;
+static int tabsz = 2;
+static const char *spaces = " ";
+static bool as_unsigned = false;
+static bool as_valid_xml = true;
+static const char *table_arg = NULL;
+static bool read_only_arg = true;
+
+static
+void indent ( void )
+{
+ if ( indent_lvl > 0 )
+ {
+ int total, num_spaces = indent_lvl * tabsz;
+ for ( total = 0; total < num_spaces; total += 32 )
+ {
+ int to_write = num_spaces - total;
+ if ( to_write > 32 )
+ to_write = 32;
+ OUTMSG (( & spaces [ 32 - to_write ] ));
+ }
+ }
+}
+
+static
+void node_open ( const char *path, size_t plen )
+{
+ if ( plen && path[plen - 1] == '/' ) {
+ /* do not use trailing slash */
+ --plen;
+ }
+ if ( xml_ish )
+ {
+ int size = plen;
+ /* find leaf name of node */
+ const char *slash = string_rchr ( path, plen, '/' );
+ if ( slash ) {
+ /* make sure not to print trailing slash */
+ size = plen - (slash - path) - 1;
+ if ( size < 0 ) {
+ size = 0;
+ }
+ }
+
+ indent ();
+ OUTMSG (( "<%.*s", size, ( slash != NULL ) ? slash + 1 : path ));
+ }
+}
+
+static
+void node_close ( const char *path, size_t plen,
+ size_t vsize, uint32_t num_children, bool close_indent )
+{
+ if ( plen && path[plen - 1] == '/' ) {
+ --plen;
+ }
+ if ( xml_ish )
+ {
+ if ( vsize == 0 && num_children == 0 )
+ OUTMSG (( "/>\n" ));
+ else
+ {
+ int size = plen;
+ const char *slash = string_rchr ( path, plen, '/' );
+ if ( slash ) {
+ size = plen - (slash - path) - 1;
+ if ( size < 0 ) {
+ size = 0;
+ }
+ }
+ if ( close_indent )
+ indent ();
+ OUTMSG (( "</%.*s>\n", size, ( slash != NULL ) ? slash + 1 : path ));
+ }
+ }
+}
+
+static
+void attr_select ( const char *name, const char *value )
+{
+ if ( xml_ish )
+ OUTMSG (( " %s=\"%s\"", name, value ));
+}
+
+static void value_print(char value) {
+ const char *replacement = NULL;
+
+ switch (value) {
+ case '\"':
+ replacement = """;
+ break;
+ case '&':
+ replacement = "&";
+ break;
+ case '<':
+ replacement = "<";
+ break;
+ case '>':
+ replacement = ">";
+ break;
+ default:
+ break;
+ }
+
+ if (replacement != NULL && as_valid_xml) {
+ OUTMSG(("%s", replacement));
+ }
+ else {
+ OUTMSG(("%c", value));
+ }
+}
+
+static
+void value_select ( const char *value, size_t vlen, uint32_t num_children, bool *close_indent )
+{
+ if ( xml_ish )
+ {
+ size_t i;
+ bool binary = false;
+
+ /* discover if text or apparently binary */
+ for ( i = 0; i < vlen && ! binary; ++ i )
+ {
+ if ( ! isprint ( value [ i ] ) )
+ {
+ switch ( value [ i ] )
+ {
+ case '\t':
+ case '\r':
+ case '\n':
+ break;
+ default:
+ binary = true;
+ }
+ }
+ }
+
+ /* if there are children, create special tag */
+ if ( num_children != 0 || ( binary && vlen > 16 ) || ( vlen > 64 ) )
+ {
+ OUTMSG (( ">\n" ));
+ ++ indent_lvl;
+ indent ();
+ if ( num_children != 0 )
+ OUTMSG (( "<%%>" ));
+ }
+ else
+ {
+ OUTMSG (( ">" ));
+ }
+
+ /* if binary, print as hex */
+ if ( binary )
+ {
+ bool as_hex = !as_unsigned;
+ if( as_unsigned ) {
+ switch(vlen) {
+ case 1:
+ OUTMSG (( "%hu", ( ( const uint8_t* ) value ) [ 0 ] ));
+ break;
+ case 2:
+ OUTMSG (( "%u", ( ( const uint16_t* ) value ) [ 0 ] ));
+ break;
+ case 4:
+ OUTMSG (( "%u", ( ( const uint32_t* ) value ) [ 0 ] ));
+ break;
+ case 8:
+ OUTMSG (( "%lu", ( ( const uint64_t* ) value ) [ 0 ] ));
+ break;
+ default:
+ as_hex = true;
+ break;
+ }
+ }
+ if( as_hex ) {
+ for ( i = 0; i < vlen; ++ i )
+ {
+ if ( i != 0 && ( i & 15 ) == 0 )
+ {
+ OUTMSG (( "\n" ));
+ indent ();
+ }
+ OUTMSG (( "\\x%02X", ( ( const uint8_t* ) value ) [ i ] ));
+ }
+ }
+ }
+
+ /* text */
+ else
+ {
+ /* int tab_stop; */
+
+ OUTMSG (( "'" ));
+ for ( /* tab_stop = 0, */ i = 0; i < vlen; ++ i )
+ {
+ switch ( value [ i ] )
+ {
+ case '\t': /* OUTMSG (( "%.*s", 4 - ( tab_stop & 3 ), " " )); */
+ /* tab_stop = ( tab_stop + 4 ) & -4; */
+ OUTMSG (( "\t" ));
+ break;
+ case '\r': OUTMSG (( "\\r" ));
+ break;
+ case '\n': OUTMSG (( "\n" ));
+ indent ();
+ if ( i + 1 < vlen )
+ OUTMSG (( " " ));
+ /* tab_stop = 0; */
+ break;
+ default:
+ value_print(value[i]);
+ }
+ }
+ OUTMSG (( "'" ));
+ }
+
+ /* if there are children, close special tag */
+ if ( num_children != 0 )
+ {
+ OUTMSG (( "</%%>\n" ));
+ -- indent_lvl;
+ * close_indent = true;
+ }
+ else if ( ( binary && vlen > 16 ) || ( vlen > 64 ) )
+ {
+ OUTMSG (( "\n" ));
+ -- indent_lvl;
+ * close_indent = true;
+ }
+ }
+}
+
+static
+void children_begin ( size_t vsize, uint32_t num_children )
+{
+ ++ indent_lvl;
+
+ if ( vsize == 0 && num_children != 0 )
+ OUTMSG (( ">\n" ));
+}
+
+static
+void children_end ( void )
+{
+ if ( indent_lvl > 0 )
+ -- indent_lvl;
+}
+
+
+/* select
+ */
+static
+rc_t md_select_expr ( const KMDataNode *node, char *path, size_t psize, int plen, const char *attr, bool wildcard )
+{
+ rc_t rc;
+ const char *name;
+ uint32_t i, num_children;
+ KNamelist *children;
+ bool close_indent = false;
+
+ size_t vsize = 0;
+ char value [ 1024 ];
+
+ /* list node children */
+ rc = KMDataNodeListChild ( node, & children );
+ if ( rc == 0 )
+ rc = KNamelistCount ( children, & num_children );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to list child nodes of '$(path)'", "path=%s", path ));
+ return rc;
+ }
+
+ /* report on single node */
+ if ( ! wildcard )
+ {
+ if ( attr != NULL )
+ {
+ /* report only attribute */
+ rc = KMDataNodeReadAttr ( node, attr, value, sizeof value, & vsize );
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ if ( GetRCState ( rc ) == rcNotFound )
+ return 0;
+
+ PLOGERR ( klogErr, (klogErr, rc, "failed to read attribute '$(path)@$(attr)'", "path=%s,attr=%s", path, attr ));
+ return rc;
+ }
+
+ /* open node report */
+ node_open ( path, plen );
+
+ /* report attribute */
+ attr_select ( attr, value );
+
+ /* close it off */
+ node_close ( path, plen, 0, 0, false );
+
+ /* Exit here if an attribute was requested in query */
+ return 0;
+ }
+ else
+ {
+ uint32_t count;
+ size_t remaining;
+ char *vp = value;
+ KNamelist *attrs;
+
+ /* report entire node */
+ rc = KMDataNodeListAttr ( node, & attrs );
+ if ( rc == 0 )
+ rc = KNamelistCount ( attrs, & count );
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ PLOGERR ( klogErr, (klogErr, rc, "failed to list attributes of '$(path)'", "path=%s", path ));
+ return rc;
+ }
+
+ /* open node report */
+ node_open ( path, plen );
+
+ /* report each attribute */
+ for ( i = 0; i < count; ++ i )
+ {
+ rc = KNamelistGet ( attrs, i, & name );
+ if ( rc != 0 )
+ PLOGERR ( klogWarn, (klogWarn, rc, "failed to read attribute name $(idx) of '$(path)'", "idx=%u,path=%s", i, path ));
+ else
+ {
+ rc = KMDataNodeReadAttr ( node, name, value, sizeof value, & vsize );
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ KNamelistRelease ( attrs );
+ PLOGERR ( klogErr, (klogErr, rc, "failed to read attribute '$(path)@$(attr)'", "path=%s,attr=%s", path, name ));
+ return rc;
+ }
+
+ /* report attribute */
+ attr_select ( name, value );
+ }
+ }
+
+ /* done with header */
+ KNamelistRelease ( attrs );
+
+ /* read node value */
+ rc = KMDataNodeRead ( node, 0, value, sizeof value, & vsize, & remaining );
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ PLOGERR ( klogErr, (klogErr, rc, "failed to read value of '$(path)'", "path=%s", path ));
+ return rc;
+ }
+
+ /* allocate a larger buffer if not complete */
+ if ( remaining != 0 )
+ {
+ size_t remaining_vsize;
+
+ vp = malloc ( vsize + remaining );
+ if ( vp == NULL )
+ {
+ KNamelistRelease ( children );
+ rc = RC ( rcExe, rcMetadata, rcAllocating, rcMemory, rcExhausted );
+ PLOGERR ( klogInt, (klogInt, rc, "failed to read value of '$(path)'", "path=%s", path ));
+ return rc;
+ }
+ memmove ( vp, value, vsize );
+ rc = KMDataNodeRead ( node, vsize, & vp [ vsize ], remaining, & remaining_vsize, & remaining );
+ if ( rc == 0 && remaining != 0 )
+ rc = RC ( rcExe, rcMetadata, rcReading, rcTransfer, rcIncomplete );
+ if ( rc != 0 )
+ {
+ free ( vp );
+ KNamelistRelease ( children );
+ PLOGERR ( klogErr, (klogErr, rc, "failed to read value of '$(path)'", "path=%s", path ));
+ return rc;
+ }
+
+ vsize += remaining_vsize;
+ }
+
+ /* report node value */
+ if ( vsize != 0 )
+ value_select ( vp, vsize, num_children, & close_indent );
+
+ /* whack allocation */
+ if ( vp != value )
+ free ( vp );
+ }
+ }
+
+ if ( ! wildcard )
+ children_begin ( vsize, num_children );
+
+ /* if there are children, list them now */
+ for ( i = 0; i < num_children; ++ i )
+ {
+ rc = KNamelistGet ( children, i, & name );
+ if ( rc != 0 )
+ PLOGERR ( klogWarn, (klogWarn, rc, "failed to read child name $(idx) of '$(path)'", "idx=%u,path=%.*s", i, plen, path ));
+ else
+ {
+ size_t childlen;
+ rc = string_printf ( & path [ plen ], psize - plen, & childlen, "/%s", name );
+ if ( rc != 0 )
+ PLOGERR ( klogWarn, (klogWarn, rc, "failed to select child $(name) of '$(path)'", "name=%s,path=%.*s", name, plen, path ));
+ else
+ {
+ const KMDataNode *child;
+ rc = KMDataNodeOpenNodeRead ( node, & child, "%s", name );
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open child '$(path)'", "path=%s", path ));
+ return rc;
+ }
+
+ /* recurse on child */
+ rc = md_select_expr ( child, path, psize, plen + childlen, attr, false );
+ close_indent = true;
+
+ KMDataNodeRelease ( child );
+
+ if ( rc != 0 )
+ {
+ KNamelistRelease ( children );
+ return rc;
+ }
+ }
+ }
+ }
+
+ if ( ! wildcard )
+ children_end ();
+
+ KNamelistRelease ( children );
+
+ path [ plen ] = 0;
+
+ if ( ! wildcard )
+ node_close ( path, plen, vsize, num_children, close_indent );
+
+ return 0;
+}
+
+#if ALLOW_UPDATE
+static
+rc_t md_update_expr ( KMDataNode *node, const char *path, const char *attr, const char *expr )
+{
+ rc_t rc;
+
+ /* according to documentation, "expr" is allowed to be text
+ or text with escaped hex sequences. examine for escaped hex */
+ size_t len = string_size ( expr );
+ char *buff = malloc ( len + 1 );
+ if ( buff == NULL )
+ rc = RC ( rcExe, rcMetadata, rcUpdating, rcMemory, rcExhausted );
+ else
+ {
+ size_t i, j;
+ for ( i = j = 0; i < len; ++ i, ++ j )
+ {
+ if ( ( buff [ j ] = expr [ i ] ) == '\\' )
+ {
+ /* we know "expr" is NUL-terminated, so this is safe */
+ if ( tolower ( expr [ i + 1 ] ) == 'x' &&
+ isxdigit ( expr [ i + 2 ] ) &&
+ isxdigit ( expr [ i + 3 ] ) )
+ {
+ int msn = toupper ( expr [ i + 2 ] ) - '0';
+ int lsn = toupper ( expr [ i + 3 ] ) - '0';
+ if ( msn >= 10 )
+ msn += '0' - 'A' + 10;
+ if ( lsn >= 10 )
+ lsn += '0' - 'A' + 10;
+ buff [ j ] = ( char ) ( ( msn << 4 ) | lsn );
+ i += 3;
+ }
+ }
+ }
+
+ if ( attr != NULL )
+ {
+ /* set attribute value */
+ buff [ j ] = 0;
+ rc = KMDataNodeWriteAttr ( node, attr, buff );
+ }
+ else
+ {
+ /* now set the value of the node */
+ rc = KMDataNodeWrite ( node, buff, j );
+ }
+ free ( buff );
+ }
+
+ return rc;
+}
+#endif
+
+static
+bool CC md_select ( void *item, void *data )
+{
+ bool fail = true;
+ KDBMetaParms *pb = data;
+
+ CONST KMDataNode *node;
+#if ALLOW_UPDATE
+ bool read_only = true;
+ if ( ! read_only_arg ) {
+ pb -> rc = KMetadataOpenNodeUpdate ( pb -> md, & node, NULL );
+ if ( pb -> rc == 0 )
+ read_only = false;
+ }
+#endif
+ if ( read_only )
+ pb -> rc = KMetadataOpenNodeRead ( pb -> md, ( const KMDataNode** ) & node, NULL );
+ if ( pb -> rc != 0 )
+ PLOGERR ( klogErr, (klogErr, pb -> rc, "failed to open root node for '$(path)'", "path=%s", pb -> targ ));
+ else
+ {
+ bool wildcard;
+ char *expr, *attr, path [ 4096 ];
+ size_t len = string_copy_measure ( path, sizeof path, item );
+
+ /* detect assignment */
+ expr = string_rchr ( path, len, '=' );
+ if ( expr != NULL )
+ {
+ len = expr - path;
+ * expr ++ = 0;
+ }
+ attr = string_rchr ( path, len, '@' );
+ if ( attr != NULL )
+ {
+ len = attr - path;
+ * attr ++ = 0;
+ }
+
+ if ( expr != NULL )
+ {
+#if ALLOW_UPDATE
+ if ( read_only )
+ {
+ PLOGMSG ( klogWarn, ( klogWarn, "node update expressions are not supported - "
+ "'$(path)' is read-only - "
+ "'$(expr)' treated as select."
+ , "path=%s,expr=%s", pb -> targ, item ) );
+ expr = NULL;
+ }
+#else
+ PLOGMSG ( klogWarn, ( klogWarn, "node update expressions are not supported - "
+ "'$(expr)' treated as select.", "expr=%s", item ) );
+ expr = NULL;
+#endif
+ }
+
+ wildcard = false;
+ if ( len >= 1 && path [ len - 1 ] == '*' )
+ {
+ if ( len == 1 )
+ {
+ path [ len = 0 ] = 0;
+ wildcard = true;
+ }
+ else if ( len >= 2 && path [ len - 2 ] == '/' )
+ {
+ path [ len -= 2 ] = 0;
+ wildcard = true;
+ }
+ }
+
+#if ALLOW_UPDATE
+ if ( expr != NULL )
+ {
+ KMDataNode *root = node;
+
+ if ( wildcard || len == 0 )
+ {
+ pb -> rc = RC ( rcExe, rcMetadata, rcUpdating, rcExpression, rcIncorrect );
+ PLOGERR ( klogErr, ( klogErr, pb -> rc, "node updates require explicit paths - "
+ "'$(expr)' cannot be evaluated", "expr=%s", item ) );
+ return true;
+ }
+
+ pb -> rc = KMDataNodeOpenNodeUpdate ( root, & node, "%s", path );
+ KMDataNodeRelease ( root );
+
+ if ( pb -> rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, pb -> rc,
+ "failed to open node '$(node)' for '$(path)'",
+ "node=%s,path=%s", path, pb -> targ ));
+ }
+ else
+ {
+ pb -> rc = md_update_expr ( node, path, attr, expr );
+ }
+ }
+ else
+#endif
+
+ if ( len == 0 )
+ pb -> rc = md_select_expr ( node, path, sizeof path, len, attr, wildcard );
+ else
+ {
+ const KMDataNode *root = node;
+ pb -> rc = KMDataNodeOpenNodeRead ( root, ( const KMDataNode** ) & node, "%s", path );
+ KMDataNodeRelease ( root );
+
+ if ( pb -> rc != 0 )
+ {
+ PLOGERR ( klogErr, (klogErr, pb -> rc,
+ "failed to open node '$(node)' for '$(path)'",
+ "node=%s,path=%s", path, pb -> targ ));
+ }
+ else
+ {
+ pb -> rc = md_select_expr ( node, path, sizeof path, len, attr, wildcard );
+ }
+ }
+
+ if ( pb -> rc == 0 )
+ fail = false;
+
+ KMDataNodeRelease ( node );
+ }
+
+ return fail;
+}
+
+static
+rc_t col_select ( KDBMetaParms * pb)
+{
+ CONST KColumn *col;
+ rc_t rc;
+
+ bool read_only = true;
+
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+
+ rc = KDBManagerOpenColumnUpdate ( pb -> mgr, & col, "%s", pb->targ );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KDBManagerOpenColumnRead ( pb -> mgr, ( const KColumn** ) & col, "%s", pb->targ );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open column '$(col)'", "col=%s", pb->targ ));
+ else
+ {
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+ rc = KColumnOpenMetadataUpdate ( col, & pb -> md );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KColumnOpenMetadataRead ( col, ( const KMetadata** ) & pb -> md );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open metadata for column '$(col)'", "col=%s", pb->targ ));
+ else
+ {
+ bool fail;
+
+ fail = VectorDoUntil ( pb -> q, false, md_select, pb );
+
+ if (fail)
+ rc = pb->rc;
+
+ KMetadataRelease ( pb -> md ), pb -> md = NULL;
+ }
+
+ KColumnRelease ( col );
+ }
+ return rc;
+}
+
+static
+rc_t tbl_select ( KDBMetaParms * pb)
+{
+ CONST KTable *tbl;
+ rc_t rc;
+
+ bool read_only = true;
+
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+
+ rc = KDBManagerOpenTableUpdate ( pb -> mgr, & tbl, "%s", pb->targ );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KDBManagerOpenTableRead ( pb -> mgr, ( const KTable** ) & tbl, "%s", pb->targ );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open table '$(tbl)'", "tbl=%s", pb->targ ));
+ else
+ {
+ read_only = true;
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+ rc = KTableOpenMetadataUpdate ( tbl, & pb -> md );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KTableOpenMetadataRead ( tbl, ( const KMetadata** ) & pb -> md );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open metadata for table '$(tbl)'", "tbl=%s", pb->targ ));
+ else
+ {
+ bool fail;
+
+ fail = VectorDoUntil ( pb -> q, false, md_select, pb );
+ if (fail)
+ rc = pb->rc;
+
+ KMetadataRelease ( pb -> md ), pb -> md = NULL;
+ }
+
+ KTableRelease ( tbl );
+ }
+
+ return rc;
+}
+
+static
+rc_t db_select (KDBMetaParms * pb)
+{
+ CONST KDatabase *db;
+ rc_t rc;
+
+ bool read_only = true;
+
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+
+ rc = KDBManagerOpenDBUpdate ( pb -> mgr, & db, "%s", pb->targ );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KDBManagerOpenDBRead ( pb -> mgr, ( const KDatabase** ) & db, "%s", pb->targ );
+ if ( rc != 0 ) {
+ PLOGERR ( klogErr, (klogErr, rc, "failed to open db '$(db)'",
+ "db=%s", pb->targ ));
+ }
+ else {
+ CONST KTable* tbl = NULL;
+ if (table_arg) {
+ read_only = true;
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+ rc = KDatabaseOpenTableUpdate ( db, &tbl, "%s", table_arg );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KDatabaseOpenTableRead ( db, ( const KTable** ) &tbl, "%s", table_arg );
+ if ( rc != 0 ) {
+ PLOGERR ( klogErr, (klogErr, rc,
+ "failed to open table '$(table)'", "table=%s", table_arg ));
+ }
+ }
+ if ( rc == 0) {
+ if (tbl) {
+ read_only = true;
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+ rc = KTableOpenMetadataUpdate ( tbl, & pb -> md );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KTableOpenMetadataRead ( tbl, ( const KMetadata** ) & pb -> md );
+ if ( rc != 0 ) {
+ PLOGERR ( klogErr, (klogErr, rc,
+ "failed to open metadata for table '$(table)'",
+ "table=%s", table_arg ));
+ }
+ }
+ else {
+ read_only = true;
+#if ALLOW_UPDATE
+ if ( ! read_only_arg ) {
+ read_only = false;
+ rc = KDatabaseOpenMetadataUpdate ( db, & pb -> md );
+ if ( rc != 0 )
+ read_only = true;
+ }
+#endif
+ if ( read_only )
+ rc = KDatabaseOpenMetadataRead ( db, ( const KMetadata** ) & pb -> md );
+ if ( rc != 0 ) {
+ PLOGERR ( klogErr, (klogErr, rc,
+ "failed to open metadata for db '$(db)'",
+ "db=%s", pb->targ ));
+ }
+ }
+ if ( rc == 0 ) {
+ bool fail;
+
+ fail = VectorDoUntil ( pb -> q, false, md_select, pb );
+ if(fail)
+ rc = pb->rc;
+ KMetadataRelease ( pb -> md ), pb -> md = NULL;
+ }
+ }
+ KTableRelease ( tbl );
+ KDatabaseRelease ( db );
+ }
+
+ return rc;
+}
+
+static
+rc_t tool_select ( CONST KDBManager * mgr, uint32_t type, const char * targ, const Vector * q)
+{
+ KDBMetaParms pb;
+ rc_t rc;
+
+ pb.mgr = mgr;
+ pb.md = NULL;
+ pb.targ = targ;
+ pb.q = q;
+ pb.rc = 0;
+
+ switch (type)
+ {
+ default:
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcParam, rcInvalid);
+ break;
+
+ case kptDatabase:
+ rc = db_select (&pb);
+ break;
+
+ case kptPrereleaseTbl:
+ case kptTable:
+ rc = tbl_select (&pb);
+ break;
+
+ case kptColumn:
+ rc = col_select (&pb);
+ break;
+ }
+ return rc;
+}
+
+const char UsageDefaultName[] = "kdbmeta";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [Options] <target> [<query> ...]\n"
+ "\n"
+ "Summary:\n"
+ " Display the contents of one or more metadata stores.\n"
+#if ALLOW_UPDATE
+ " Update metadata.\n"
+#endif
+ , progname);
+}
+
+static const char *const t1 [] = { "path-to-database", "access database metadata", NULL };
+static const char *const t2 [] = { "path-to-table", "access table metadata", NULL };
+static const char *const t3 [] = { "path-to-column", "access column metadata", NULL };
+static const char *const t4 [] = { "accession", "sra global access id", NULL };
+
+static const char *const q1 [] = { "*","all nodes and attributes", NULL };
+static const char *const q2 [] = { "NAME","a named root node and children", NULL };
+static const char *const q3 [] = { "PATH/NAME","an internal node and children", NULL };
+static const char *const q4 [] = { "<node>@ATTR","a named attribute", NULL };
+#if ALLOW_UPDATE
+static const char *const q5 [] = { "<obj>=VALUE","a simple value assignment where",
+ "value string is text, and binary",
+ "values use hex escape codes", NULL };
+#endif
+
+#define ALIAS_READ_ONLY "r"
+#define OPTION_READ_ONLY "read-only"
+static const char* USAGE_READ_ONLY[] = { "operate in read-only mode", NULL };
+
+#define ALIAS_TABLE "T"
+#define OPTION_TABLE "table"
+static const char* USAGE_TABLE[] = { "table-name", NULL };
+
+#define ALIAS_UNSIGNED "u"
+#define OPTION_UNSIGNED "unsigned"
+static const char* USAGE_UNSIGNED[]
+ = { "print numeric values as unsigned", NULL };
+
+#define OPTION_OUT "output"
+#define ALIAS_OUT "X"
+static const char* USAGE_OUT[] = { "Output type: one of (xml text): ",
+ "whether to generate well-formed XML. Default: xml (well-formed)", NULL };
+
+const OptDef opt[] = {
+ { OPTION_TABLE , ALIAS_TABLE , NULL, USAGE_TABLE , 1, true , false }
+ ,{ OPTION_UNSIGNED , ALIAS_UNSIGNED , NULL, USAGE_UNSIGNED , 1, false, false }
+#if ALLOW_UPDATE
+ ,{ OPTION_READ_ONLY, ALIAS_READ_ONLY, NULL, USAGE_READ_ONLY, 1, false, false }
+#endif
+ ,{ OPTION_OUT , ALIAS_OUT , NULL, USAGE_OUT , 1, true , false }
+};
+
+static const char * const * target_usage [] = { t1, t2, t3, t4 };
+static const char * const * query_usage [] =
+{
+ q1, q2, q3, q4
+#if ALLOW_UPDATE
+ , q5
+#endif
+};
+
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ unsigned idx;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg (" The target metadata are described by one or more\n"
+ " target specifications, giving the path to a database, a table\n"
+ " or a column. the command and query are executed on each target.\n"
+ "\n"
+ " queries name one or more objects, and '*' acts as a wildcard.\n"
+ " query objects are nodes or attributes. nodes are named with a\n"
+ " hierarchical path, like a file-system path. attributes are given\n"
+ " as a node path followed by a '@' followed by the attribute name.\n"
+ "\n"
+ "target:\n");
+
+ for (idx = 0; idx < sizeof (target_usage) / sizeof target_usage[0]; ++idx)
+ HelpParamLine ( (target_usage[idx])[0], (target_usage[idx])+1 );
+
+ OUTMSG (("\n"
+ "query:\n"));
+
+ for (idx = 0; idx < sizeof (query_usage) / sizeof query_usage[0]; ++idx)
+ HelpParamLine ( (query_usage[idx])[0], (query_usage[idx])+1 );
+
+ OUTMSG (("\n"
+ "Options:\n"));
+
+ for(idx = 0; idx < sizeof(opt) / sizeof(opt[0]); ++idx) {
+ const char *param = NULL;
+ if (strcmp(opt[idx].aliases, ALIAS_TABLE) == 0) {
+ param = "table";
+ }
+ else if (strcmp(opt[idx].aliases, ALIAS_OUT) == 0) {
+ param = "value";
+ }
+ HelpOptionLine(opt[idx].aliases, opt[idx].name, param, opt[idx].help);
+ }
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args = NULL;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 1, opt, sizeof(opt) / sizeof(opt[0]));
+ if (rc == 0)
+ {
+ do
+ {
+ const char * pc;
+ KDirectory *curwd;
+ uint32_t pcount;
+ int ix;
+
+#if ALLOW_UPDATE
+ read_only_arg = false;
+ rc = ArgsOptionCount (args, OPTION_READ_ONLY, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_READ_ONLY "' argument");
+ break;
+ }
+ read_only_arg = pcount > 0;
+#endif
+
+ rc = ArgsOptionCount (args, OPTION_UNSIGNED, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_UNSIGNED "' argument");
+ break;
+ }
+ as_unsigned = pcount > 0;
+
+ rc = ArgsOptionCount (args, OPTION_TABLE, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_TABLE "' argument");
+ break;
+ }
+ if (pcount) {
+ rc = ArgsOptionValue (args, OPTION_TABLE, 0, (const void **)&table_arg);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_TABLE "' argument");
+ break;
+ }
+ }
+
+ rc = ArgsOptionCount (args, OPTION_OUT, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_OUT "' argument");
+ break;
+ }
+ if (pcount) {
+ const char* dummy = NULL;
+ rc = ArgsOptionValue (args, OPTION_OUT, 0, (const void **)&dummy);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_OUT "' argument");
+ break;
+ }
+ else if (strcmp(dummy, "t") == 0) {
+ as_valid_xml = false;
+ }
+ }
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0)
+ {
+ OUTMSG (( "missing database target path and queries\n" ));
+ MiniUsage (args);
+ ArgsWhack(args);
+ exit(EXIT_FAILURE);
+ }
+
+ rc = KDirectoryNativeDir (&curwd);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "Unable to open the file system");
+ }
+ else
+ {
+ CONST KDBManager * mgr;
+#if ALLOW_UPDATE
+ rc = KDBManagerMakeUpdate (&mgr, curwd);
+#else
+ rc = KDBManagerMakeRead (&mgr, curwd);
+#endif
+ if (rc)
+ LOGERR (klogInt, rc, "Unable to open the database system");
+ else
+ {
+ /* get target */
+ rc = ArgsParamValue (args, 0, (const void **)&pc);
+ if (rc)
+ LOGERR (klogInt, rc, "Unable to read target parameter");
+ else
+ {
+ char objpath [ 4096 ];
+ bool found;
+ uint32_t type;
+
+ found = false;
+
+ {
+ const VFSManager * vfs;
+ rc = KDBManagerGetVFSManager ( mgr, ( VFSManager ** )&vfs );
+ if ( rc == 0 )
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver ( vfs, & resolver );
+ if ( rc == 0 )
+ {
+ VPath * query;
+ rc = VFSManagerMakePath ( vfs, & query, "%s", pc );
+ if ( rc == 0 )
+ {
+ const VPath * local;
+ rc = VResolverQuery ( resolver, 0, query, & local, NULL, NULL );
+ if ( rc == 0 )
+ {
+ rc = VPathReadPath ( local, objpath, sizeof objpath, NULL );
+ if ( rc == 0 )
+ found = true;
+
+ VPathRelease ( local );
+ }
+ else if ( GetRCState ( rc ) == rcNotFound )
+ {
+ rc = 0;
+ }
+
+ VPathRelease ( query );
+ }
+
+ VResolverRelease ( resolver );
+ }
+
+ VFSManagerRelease ( vfs );
+ }
+ }
+
+ if ( ! found)
+ {
+ rc = KDirectoryResolvePath (curwd, true, objpath,
+ sizeof objpath, "%s", pc);
+
+ if (rc)
+ LOGERR (klogFatal, rc,
+ "Unable to resolved target path");
+ }
+
+ type = KDBManagerPathType (mgr, "%s", objpath);
+
+ switch (type)
+ {
+ case kptDatabase:
+ case kptPrereleaseTbl:
+ case kptTable:
+ case kptColumn:
+ break;
+
+ case kptBadPath:
+ rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcInvalid );
+ PLOGERR ( klogErr, (klogErr, rc, "'$(path)' -- bad path", "path=%s", pc ));
+ break;
+ default:
+ rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcIncorrect );
+ PLOGERR ( klogErr, (klogErr, rc, "'$(path)' -- type unknown", "path=%s", pc ));
+ break;
+
+ case kptNotFound:
+ rc = RC ( rcDB, rcMgr, rcAccessing, rcPath, rcNotFound );
+ PLOGERR ( klogErr, ( klogErr, rc, "'$(path)' not found", "path=%s", pc ));
+ break;
+ }
+ if (rc == 0)
+ {
+ Vector q;
+
+ VectorInit (&q, 0, 8);
+
+ if (pcount == 1)
+ {
+ const char *default_query = "*";
+ rc = VectorAppend (&q, NULL, default_query);
+ }
+ else for (ix = 1; ix < pcount; ++ix)
+ {
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ break;
+
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ break;
+
+ rc = VectorAppend ( &q, NULL, pc );
+ if (rc)
+ break;
+ }
+
+ if (rc)
+ LOGERR (klogErr, rc, "Unable to queue queries");
+ else
+ {
+ rc = tool_select (mgr, type, objpath, &q);
+
+ VectorWhack (&q, NULL, NULL);
+ }
+ }
+ }
+ KDBManagerRelease (mgr);
+ }
+ KDirectoryRelease (curwd);
+ }
+ } while (0);
+ }
+
+ ArgsWhack(args);
+ args = NULL;
+
+ return rc;
+}
diff --git a/tools/util/mac/syspass.c b/tools/util/mac/syspass.c
new file mode 100644
index 0000000..550af53
--- /dev/null
+++ b/tools/util/mac/syspass.c
@@ -0,0 +1,48 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "syspass-priv.h" /* get_pass */
+
+#include <klib/rc.h>
+
+#include <readpassphrase.h>
+
+rc_t get_pass(const char *prompt, char *buf, size_t bufsiz) {
+ if (prompt == NULL || buf == NULL) {
+ return RC(rcExe, rcFunction, rcEvaluating, rcParam, rcNull);
+ }
+
+ if (bufsiz == 0)
+ { return 0; }
+
+ buf[0] = '\0';
+
+ if (readpassphrase(prompt, buf, bufsiz, 0) == NULL) {
+ return RC(rcExe, rcFunction, rcEvaluating, rcParam, rcNull);
+ }
+
+ return 0;
+}
diff --git a/tools/util/md5cp.c b/tools/util/md5cp.c
new file mode 100644
index 0000000..549ab09
--- /dev/null
+++ b/tools/util/md5cp.c
@@ -0,0 +1,702 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+
+#include <klib/vector.h>
+#include <klib/impl.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/md5.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define MD5EXTENSION "md5"
+#define DEFAULTMODE 0664
+#define DEFAULT_DIR_MODE 0775
+
+/*
+Trying to mimic cp behavior, with a few differences,
+mainly, that if -f not specified and target exists,
+we do not clobber files, but instead print something about it on the
+output.
+
+cp -r dir1 dir2 makes dir2/dir1
+cp -r dir1 <nonexistent-name> just "renames" directory dir1 to name
+-r not specified and dir copied from, ignores that directory.
+
+If multiple things are specified (more than 2)
+then the last one should exist and be a directory.
+
+-i should still be available, to ask what to do about things that would be clobbered.
+
+Need to think what to do when inputs are relative and absolute
+
+This needs to work with backslashes as well (i.e. independent of
+target platform).
+
+Need to worry about copying from a directory to itself
+Definitely don't want to copy a file from itself to itself
+
+Need also to worry about loops in references (when walking trees)
+
+What to do about symbolic links
+
+DONE: Need to make mode of file copied
+
+Need to make return code of executable be useful to scripts
+
+TESTS:
+
+copy file to nonexistent name (should create, and .md5 as well)
+do it again, make sure missing -f works (doesn't clobber).
+do it again with -f to see it clobbers.
+
+Make sure copying a directory to a file causes an error.
+
+make a directory with 2 files, copy to new (non-existent) name
+ without -r switch (should ignore directory)
+add -r switch, see creates the new name dir
+do it again, should create a subdirectory
+
+Check that mode is preserved on copying directory to new (nonexistent) name
+Check that mode is preserved on new files (created files)
+
+On existing files, the mode will be preserved on the TARGET file,
+unless -p is specified, in which case (like -f) the source will clobber
+the target protections.
+
+ */
+
+int interacative = 0;
+int force = 0;
+int recurse = 0;
+int test = 0;
+int clobber_protections = 0;
+int followlinks = 1;
+
+rc_t CopyDirectoryToExistingDirectory( const KDirectory *top, const char *inname, KDirectory *targettop, const char *outname );
+rc_t CopyFileToFile( const KDirectory *top, const char *inname, KDirectory *targettop, const char *outname );
+
+#define BUFSIZE 8192
+
+char buffer[BUFSIZE];
+
+/*
+ * out is a pre-allocated buffer.
+ */
+void JustTheName(const char *in, char *out)
+{
+ int len;
+ int end;
+ int begin;
+ int i;
+
+ len = strlen(in);
+ end = len;
+ end--;
+ while (end > 0 && in[end] == '/') {
+ end--;
+ }
+ begin = end;
+ while (begin > 0 && in[begin-1] != '/') {
+ begin--;
+ }
+ for (i=begin; i<=end; i++) {
+ *out++ = in[i];
+ }
+ *out++ = '\0';
+}
+
+bool PathIsMD5File(const KDirectory *dir, const char *inname)
+{
+ int extlen;
+ int inlen;
+
+ inlen = strlen(inname);
+ extlen = strlen(MD5EXTENSION);
+ if (strlen(inname) > extlen+1 &&
+ inname[inlen - extlen - 1] == '.' &&
+ 0 == strcmp(inname+inlen-extlen, MD5EXTENSION)) {
+ return true;
+ }
+ return false;
+}
+
+bool CC PathIsFile( const KDirectory *dir, const char *name, void *data )
+{
+ uint32_t pathtype;
+ pathtype = KDirectoryPathType( dir, "%s", name );
+ return ((pathtype & ~kptAlias) == kptFile);
+}
+
+
+bool CC PathIsDir(const KDirectory *dir, const char *name, void *data)
+{
+ uint32_t pathtype;
+ pathtype = KDirectoryPathType( dir, "%s", name );
+ return ((pathtype & ~kptAlias) == kptDir);
+}
+
+rc_t CopyMode( const KDirectory *source, const char *sourcename,
+ KDirectory *target, char *targetname )
+{
+ /* Make sure they both exist and are the same type */
+ uint32_t src_pathtype;
+ uint32_t dest_pathtype;
+ uint32_t mode;
+ rc_t rc;
+
+ src_pathtype = KDirectoryPathType( source, "%s", sourcename );
+ dest_pathtype = KDirectoryPathType( target, "%s", targetname );
+ if ((src_pathtype & ~kptAlias) != (dest_pathtype & ~kptAlias)) {
+ return -1;
+ }
+ rc = KDirectoryAccess( source, &mode, "%s", sourcename );
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, sourcename );
+ return rc;
+ }
+ KDirectorySetAccess( target, false, mode, 0777, "%s", targetname );
+ return 0;
+}
+
+
+rc_t CopyDirectoryFiles( const KDirectory *source, KDirectory *dest ) {
+ rc_t rc;
+ KNamelist *list;
+ const char *name;
+ int i;
+ uint32_t count;
+ char resolved[1024];
+
+ rc = KDirectoryList( source, &list, PathIsFile, NULL, ".");
+ if (rc != 0)
+ {
+ /* This doesn't do what I thought. */
+ KDirectoryResolvePath( source, false, resolved, 1024, ".");
+ LOGERR ( klogInt, rc, resolved );
+ return rc;
+ }
+ KNamelistCount(list, &count);
+ for (i=0; i<count; i++) {
+ KNamelistGet(list, i, &name);
+ if (test) {
+ fprintf(stderr, "Will copy %s\n", name);
+ } else {
+ CopyFileToFile( source, name, dest, (char *)name );
+ }
+ }
+ return 0;
+}
+
+rc_t CopyDirectoryDirectories( const KDirectory *source, KDirectory *dest ) {
+ rc_t rc;
+ KNamelist *list;
+ const char *name;
+ int i;
+ uint32_t count;
+ uint32_t mode;
+ uint32_t pathtype;
+
+ KDirectoryList( source, &list, PathIsDir, NULL, ".");
+ KNamelistCount(list, &count);
+ for (i=0; i<count; i++) {
+ KNamelistGet(list, i, &name);
+ /* fprintf(stderr, "Creating directory %s\n", name); */
+ mode = DEFAULT_DIR_MODE;
+ rc = KDirectoryAccess( source, &mode, "%s", name);
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, name );
+ return rc;
+ }
+ pathtype = KDirectoryPathType( dest, "%s", name );
+ if ((pathtype & ~kptAlias) == kptNotFound) {
+ rc = KDirectoryCreateDir( dest, mode, kcmOpen, "%s", name );
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, name );
+ return rc;
+ }
+ } else if ((pathtype & ~kptAlias) == kptDir) {
+ if (clobber_protections) {
+ KDirectorySetAccess( dest, false, mode, 0777, "%s", name);
+ }
+ }
+ CopyDirectoryToExistingDirectory( source, name, dest, (char *)name);
+ }
+ return 0;
+}
+
+
+
+
+rc_t CopyFileToFile( const KDirectory *top, const char *inname, KDirectory *targettop, const char *outname )
+{
+ const KFile *in = NULL;
+ KFile *out = NULL;
+ KFile *md5file = NULL;
+ KMD5File *md5out = NULL;
+ KMD5SumFmt *md5sumfmt = NULL;
+ char md5filename[1024];
+ rc_t rc = 0;
+ uint32_t mode = 0;
+ uint32_t pathtype = 0;
+ uint32_t failed = 0;
+
+ if (PathIsMD5File(top, inname)) {
+ /* Skip it */
+ return 0;
+ }
+
+ rc = KDirectoryOpenFileRead( top, &in, "%s", inname );
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+ mode = DEFAULTMODE;
+ rc = KDirectoryAccess( top, &mode, inname);
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+
+ /*
+ * Not sure here -- does kcmInit re-initialize the file mode as we specify?
+ * Or does it preserve the existing mode (and do we want it to)?
+ */
+ if (clobber_protections) {
+ pathtype = KDirectoryPathType( targettop, "%s", outname );
+ if ((pathtype & ~kptAlias) == kptFile) {
+ rc = KDirectorySetAccess( targettop, false, mode, 0777, "%s", outname);
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+ }
+ }
+
+ rc = KDirectoryCreateFile( targettop, &out, false, mode, (force? kcmInit: kcmCreate), "%s", outname );
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+ sprintf(md5filename, "%s.md5", outname);
+ rc = KDirectoryCreateFile( targettop, &md5file, false, DEFAULTMODE, (force? kcmInit: kcmCreate), "%s", md5filename);
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+
+ rc = KMD5SumFmtMakeUpdate( &md5sumfmt, md5file);
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+
+ rc = KMD5FileMakeWrite( &md5out, out, md5sumfmt, outname );
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+
+ {
+ uint64_t rpos = 0;
+ uint64_t wpos = 0;
+
+ size_t numread;
+
+ while (true) {
+ rc = KFileRead( in, rpos, buffer, BUFSIZE, &numread );
+ /* fprintf(stderr, "Read %d bytes.\n", numread); */
+ if (rc == 0 && numread == 0)
+ break;
+ if (rc != 0) {
+ failed = rc;
+ goto FAIL;
+ }
+ rpos += numread;
+
+ {
+ size_t numwritten = 0;
+ int written = 0;
+ while (written < numread) {
+ rc = KFileWrite( (KFile *)md5out, wpos, buffer+written, numread-written, &numwritten );
+ if (rc != 0) {
+ failed = rc;
+ break;
+ }
+ if (numwritten == 0) {
+ fprintf(stderr, "Didn't write anything.\n");
+ failed = -1;
+ goto FAIL;
+ }
+ wpos += numwritten;
+ written += numwritten;
+ }
+ }
+ }
+ }
+
+ /* Success also, check the value of failed to see if failed */
+ FAIL:
+
+ if (NULL != md5out) {
+ KFileRelease((KFile *)md5out);
+ md5out = NULL;
+ }
+
+ /*KFileRelease(out); */
+ if (NULL != md5sumfmt) {
+ KMD5SumFmtRelease(md5sumfmt);
+ md5sumfmt = NULL;
+ }
+ /* KFileRelease(md5file); */
+ if (NULL != in) {
+ KFileRelease(in);
+ in = NULL;
+ }
+ /* KDirectoryRelease(top); */
+
+ if (failed) {
+ KDirectoryRemove( targettop, false, "%s", md5filename );
+ KDirectoryRemove( targettop, false, "%s", outname);
+ }
+
+ return failed;
+
+}
+
+/*
+ * copies top/inname (a directory)
+ * to targettop/outname, i.e. creates outname as a copy of that directory.
+ */
+rc_t CopyDirectoryToExistingDirectory( const KDirectory *top, const char *inname, KDirectory *targettop, const char *outname )
+{
+ rc_t rc;
+ uint32_t mode;
+ const KDirectory *source;
+ KDirectory *dest;
+ rc = KDirectoryOpenDirRead(top, &source, true, "%s", (const char *)inname);
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, "can't open input directory" );
+ return rc;
+ }
+ mode = DEFAULT_DIR_MODE;
+ rc = KDirectoryAccess( top, &mode, "%s", inname);
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, inname );
+ return rc;
+ }
+ rc = KDirectoryCreateDir( targettop, mode, kcmOpen, "%s", outname );
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, "can't create output directory" );
+ return rc;
+ }
+ if (clobber_protections) {
+ KDirectorySetAccess( targettop, false, mode, 0777, "%s", outname);
+ }
+ rc = KDirectoryOpenDirUpdate(targettop, &dest, true, "%s", outname);
+ if (rc != 0)
+ {
+ LOGERR ( klogInt, rc, "can't open directory for write" );
+ return rc;
+ }
+ CopyDirectoryFiles(source, dest);
+ CopyDirectoryDirectories( source, dest );
+
+ KDirectoryRelease( dest );
+ KDirectoryRelease( source );
+ return 0;
+}
+
+#define OPTION_FORCE "force"
+#define OPTION_RECURSE "recursive"
+#define OPTION_PRESERVE "preserve"
+#define OPTION_TEST "test"
+#define ALIAS_FORCE "f"
+#define ALIAS_RECURSE "r"
+#define ALIAS_PRESERVE "p"
+#define ALIAS_TEST "t"
+
+static const char * force_usage[] = { "overwrite existing columns", NULL };
+static const char * recurse_usage[] = { "Recurses over source directories",
+ "(directories are ignored otherwise).", NULL };
+static const char * preserve_usage[] = { "force replacement of existing modes on files", " and directories", NULL };
+static const char * test_usage[] = { "?", NULL };
+
+
+OptDef Options[] =
+{
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false },
+ { OPTION_RECURSE, ALIAS_RECURSE, NULL, recurse_usage, 0, false, false },
+ { OPTION_PRESERVE, ALIAS_PRESERVE, NULL, preserve_usage, 0, false, false },
+ { OPTION_TEST, ALIAS_TEST, NULL, test_usage, 0, false, false }
+};
+
+
+const char UsageDefaultName[] = "md5cp";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s Options [file|directory ...] directory\n"
+ "\n"
+ "Summary:\n"
+ " Copies files and/or directories, creating an md5sum checksum\n"
+ " (named file.md5) for all copied files.\n",
+ progname);
+}
+
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("\n"
+ "Option:\n");
+
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+ HelpOptionLine (ALIAS_PRESERVE, OPTION_PRESERVE, NULL, preserve_usage);
+ HelpOptionLine (ALIAS_RECURSE, OPTION_RECURSE, NULL, recurse_usage);
+ HelpOptionLine (ALIAS_TEST, OPTION_TEST, NULL, test_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+rc_t run (Args * args)
+{
+ rc_t rc;
+
+ do
+ {
+ const char * outname;
+ const char * source;
+ uint32_t pathtype;
+ KDirectory *top;
+ KDirectory *targettop;
+ uint32_t pcount;
+ uint32_t ix;
+ char sourcename [1024];
+
+ rc = KDirectoryNativeDir (&top);
+ if (rc)
+ break;
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount < 2)
+ {
+ MiniUsage (args);
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ break;
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&outname);
+ if (rc)
+ break;
+
+ pathtype = KDirectoryPathType (top, "%s", outname);
+ if ((pathtype & ~kptAlias) == kptDir)
+ {
+ /*
+ * Copying things into an existing directory.
+ */
+ rc = KDirectoryOpenDirUpdate( top, &targettop, true, outname);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, outname);
+ break;
+ }
+
+ for (ix = 1; ix < pcount; ++ix)
+ {
+
+ rc = ArgsParamValue (args, ix, (const void **)&source);
+ if (rc)
+ break;
+
+ JustTheName (source, sourcename);
+ pathtype = KDirectoryPathType (top, "%s", sourcename);
+ if ((pathtype & ~kptAlias) == kptFile)
+ {
+ CopyFileToFile (top, source, targettop, sourcename);
+ }
+ else if ((pathtype & ~kptAlias) == kptDir)
+ {
+ if (!recurse)
+ {
+ STSMSG (0, ("Skipping directory %s\n", source));
+ continue;
+ }
+ CopyDirectoryToExistingDirectory (top, source, targettop, sourcename);
+ }
+ }
+ if (rc)
+ break;
+
+ rc = KDirectoryRelease (targettop);
+/* this looks wrong */
+ if (rc)
+ LOGERR (klogInt, rc, outname);
+ }
+ else if ((pathtype * ~kptAlias) == kptFile)
+ {
+ if (!force)
+ {
+ STSMSG (0, ("File exists -- %s\n", outname));
+ break;
+ }
+ if (pcount > 2)
+ {
+ STSMSG (0, ("Target %s is a file. Too many parameters/\n", outname));
+ break;
+ }
+
+ rc = ArgsParamValue (args, 1, (const void **)&source);
+ if (rc)
+ break;
+
+ pathtype = KDirectoryPathType (top, "%s", source);
+
+ if ((pathtype & ~kptAlias) == kptDir)
+ {
+ STSMSG (0, ("Cannot overwrite file with directory %s\n", source));
+ break;
+ }
+ if ((pathtype & ~kptAlias) == kptFile)
+ {
+ CopyFileToFile (top, source, top, outname);
+ }
+ }
+ else if ((pathtype & ~kptAlias) == kptNotFound)
+ {
+ if (pcount > 2)
+ {
+ STSMSG (0, ("Directory %s does not exist.\n", outname));
+ break;
+ }
+
+ rc = ArgsParamValue (args, 1, (const void **)&source);
+ if (rc)
+ break;
+
+ pathtype = KDirectoryPathType (top, "%s", source);
+ if ((pathtype & ~kptAlias) == kptFile)
+ {
+ CopyFileToFile (top, source, top, outname);
+ }
+ else if ((pathtype & ~kptAlias) == kptDir)
+ {
+ if (!recurse)
+ {
+ STSMSG (0, ("Skipping directory %s\n", source));
+ break;
+ }
+ CopyDirectoryToExistingDirectory (top, source, top, outname);
+ }
+ }
+
+ } while (0);
+ return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1,
+ Options, sizeof (Options) / sizeof (OptDef));
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ break;
+
+ force = (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_RECURSE, &pcount);
+ if (rc)
+ break;
+
+ recurse = (pcount > 0);
+
+
+ rc = ArgsOptionCount (args, OPTION_TEST, &pcount);
+ if (rc)
+ break;
+
+ test = (pcount > 0);
+
+ rc = ArgsOptionCount (args, OPTION_PRESERVE, &pcount);
+ if (rc)
+ break;
+
+ clobber_protections = (pcount > 0);
+
+ rc = run (args);
+
+ }while (0);
+
+ ArgsWhack (args);
+ }
+ return rc;
+}
+
diff --git a/tools/util/pacbio-correct.c b/tools/util/pacbio-correct.c
new file mode 100644
index 0000000..a9a49fe
--- /dev/null
+++ b/tools/util/pacbio-correct.c
@@ -0,0 +1,208 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data", the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties", express or implied", including
+* warranties of performance", merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kdb/database.h>
+#include <kdb/manager.h>
+
+#include <vdb/vdb-priv.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <sysalloc.h>
+
+const char UsageDefaultName[] = "pacbio-correct";
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ OUTMSG ( ("\n"
+ "Usage:\n"
+ " %s writable_object(s)\n"
+ "\n", progname) );
+ return 0;
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+ return rc;
+}
+
+const char CONSENSUS[] = "CONSENSUS";
+const char PULSE[] = "PULSE";
+const char SEQUENCE[] = "SEQUENCE";
+
+rc_t correct( const char * obj )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "creation of KDirectory failed" );
+ }
+ else
+ {
+ VDBManager * vdb_mgr;
+ rc = VDBManagerMakeUpdate ( &vdb_mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "creation of VDBManager failed" );
+ }
+ else
+ {
+ VDatabase * vdb_db;
+ rc = VDBManagerOpenDBUpdate ( vdb_mgr, &vdb_db, NULL, "%s", obj );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "vdb: open for update failed" );
+ }
+ else
+ {
+ KDatabase *kdb;
+ rc = VDatabaseOpenKDatabaseUpdate ( vdb_db, & kdb );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "kdb: open for update failed" );
+ }
+ else
+ {
+ if ( KDatabaseExists ( kdb, kptTable, CONSENSUS ) )
+ {
+ if ( KDatabaseExists ( kdb, kptTable, PULSE ) )
+ {
+ OUTMSG(( "table >%s< does already exist in >%s<\n", PULSE, obj ));
+ }
+ else
+ {
+ if ( KDatabaseExists ( kdb, kptTable, SEQUENCE ) )
+ {
+ rc = KDatabaseRenameTable ( kdb, true, SEQUENCE, PULSE );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "kdb: renaming table failed" );
+ }
+ else
+ {
+ OUTMSG(( "table >%s< renamed to >%s< in >%s<\n", SEQUENCE, PULSE, obj ));
+ }
+ if ( rc == 0 )
+ {
+ rc = KDatabaseAliasTable ( kdb, CONSENSUS, SEQUENCE );
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "kdb: creating table-alias failed" );
+ }
+ else
+ {
+ OUTMSG(( "alias >%s< created for >%s< in >%s<\n", SEQUENCE, CONSENSUS, obj ));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ OUTMSG(( "table >%s< does not exist in >%s<\n", CONSENSUS, obj ));
+ }
+ KDatabaseRelease ( kdb );
+ }
+ VDatabaseRelease( vdb_db );
+ }
+ VDBManagerRelease( vdb_mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 0 );
+
+ KLogHandlerSetStdErr();
+ if ( rc != 0 )
+ {
+ LOGERR( klogErr, rc, "error creating internal structure" );
+ }
+ else
+ {
+ uint32_t count;
+ rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "ArgsParamCount failed" );
+ else
+ {
+ if ( count < 1 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid );
+ LOGERR( klogErr, rc, "object(s) missing" );
+ Usage ( args );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *obj;
+ rc = ArgsParamValue( args, idx, (const void **)&obj );
+ if ( rc != 0 )
+ LOGERR( klogErr, rc, "error reading commandline-parameter" );
+ else
+ rc = correct( obj ); /* ** <<<<<<<<<<<<<<<<<< ** */
+ }
+ }
+ }
+ ArgsWhack ( args );
+ }
+
+ return rc;
+}
diff --git a/tools/util/pseudo-aligner.cpp b/tools/util/pseudo-aligner.cpp
new file mode 100644
index 0000000..3548e37
--- /dev/null
+++ b/tools/util/pseudo-aligner.cpp
@@ -0,0 +1,566 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <sstream>
+#include <map>
+#include <stdexcept>
+#include <vector>
+#include <utility>
+#include <math.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <time.h>
+
+using namespace std;
+
+static unsigned stringtoui(string const &str, int base = 0)
+{
+ if (str.length() == 0)
+ throw length_error("empty");
+
+ char *endp = NULL;
+ auto const value = strtoul(str.c_str(), &endp, base);
+
+ if (*endp != '\0')
+ throw invalid_argument("'" + str + "' is not convertible to an integer");
+
+ if (value > unsigned(-1L))
+ throw range_error("'" + str + "' is too big");
+
+ return unsigned(value);
+}
+
+struct Settings {
+ ostream *refSeqStream;
+ ostream *fastqStream;
+
+ int const templateLength;
+ int const readLength;
+ int const coverageTarget;
+ int const lengthTarget;
+ string const &refName;
+
+ Settings(map<string, string> &args)
+ : templateLength(600)
+ , readLength(150)
+ , coverageTarget(stringtoui(args["coverage"]))
+ , lengthTarget(stringtoui(args["length"]))
+ , refName(args["refname"])
+ {
+ refSeqStream = new ofstream((refName + ".fasta").c_str());
+ fastqStream = new ofstream(args["fastq"].c_str());
+ }
+ ~Settings() {
+ delete refSeqStream;
+ delete fastqStream;
+ }
+
+ static vector<string> const ¶mNames() {
+ static auto const value = vector<string>({
+ "refname", "fastq", "coverage", "length"
+ });
+ return value;
+ }
+ static vector<string> const ¶mTypes() {
+ static auto const value = vector<string>({
+ "name", "file", "integer", "integer"
+ });
+ return value;
+ }
+};
+
+static Settings const *settings;
+
+static double frand()
+{
+ return double(random()) / double(1 << 30) - 1.0;
+}
+
+static pair<double, double> normalRandom()
+{
+ for ( ; ; ) {
+ auto const x = frand();
+ auto const y = frand();
+ auto const r = x * x + y * y;
+ if (0.0 < r && r <= 1.0) {
+ auto const scale = sqrt(-2.0 * log(r) / r);
+ return make_pair(x * scale, y * scale);
+ }
+ }
+}
+
+class Quality {
+ struct Phred {
+ uint8_t value;
+
+ Phred() : value(2) {}
+ explicit Phred(uint8_t const other) : value(other) {}
+ char Char() const {
+ return value + 33;
+ }
+ static Phred random() {
+ return Phred(max(3, min(40, int(33 + normalRandom().first * 5))));
+ }
+ };
+ typedef vector<Phred> vector_t;
+
+ vector_t vec;
+ explicit Quality(vector_t const &other) : vec(other) {}
+public:
+ ostream &print(ostream &stream, bool rev) const {
+ if (rev) {
+ for (auto i = vec.rbegin(); i != vec.rend(); ++i) {
+ stream << i->Char();
+ }
+ }
+ else {
+ for (auto i : vec) {
+ stream << i.Char();
+ }
+ }
+ return stream;
+ }
+ static Quality random() {
+ auto rslt = vector_t(settings->readLength);
+
+ for (auto i : rslt) {
+ i = Phred::random();
+ }
+ return Quality(rslt);
+ }
+};
+
+struct Base {
+ uint8_t value;
+
+ Base() : value(0) {}
+ explicit Base(uint8_t newValue) : value(newValue) {}
+ char DNA() const {
+ static char const tr[] = "NACGT";
+ return tr[value];
+ }
+ Base complement() const {
+ return Base(value == 0 ? 0 : (5 - value));
+ }
+ static Base random() {
+ auto const GC = frand() > 0.2; // GC or AT
+ auto const AC = frand() > 0.0; // A or C
+ return Base(GC ? (AC ? 2 : 3) : (AC ? 1 : 4));
+ }
+};
+
+class Sequence {
+ friend class RefSequence;
+
+ typedef vector<Base> vector_t;
+
+ vector_t vec;
+
+ explicit Sequence(vector_t const &other) : vec(other) {}
+public:
+ Base operator[](int i) const { return vec[i]; }
+ ostream &print(ostream &stream, bool rev) const {
+ if (rev) {
+ for (auto i = vec.rbegin(); i != vec.rend(); ++i) {
+ stream << i->complement().DNA();
+ }
+ }
+ else {
+ for (auto i : vec) {
+ stream << i.DNA();
+ }
+ }
+ return stream;
+ }
+};
+
+class RefSequence {
+ struct RefBase {
+ Base base;
+ uint8_t count;
+
+ RefBase() : base(0), count(0) {}
+ void increaseCoverageCount() {
+ if (count < 0xFF)
+ ++count;
+ }
+ };
+ typedef vector<RefBase> vector_t;
+
+ vector_t vec;
+public:
+ RefSequence()
+ : vec(vector_t(settings->lengthTarget))
+ {}
+
+ void fill(int const pos) {
+ auto const N = settings->readLength;
+ for (auto i = 0; i < N; ++i) {
+ if (vec[pos + i].count == 0)
+ vec[pos + i].base = Base::random();
+ vec[pos + i].increaseCoverageCount();
+ }
+ }
+
+ void copy(int const pos, Sequence const &from, bool rev) {
+ auto const N = settings->readLength;
+ for (auto i = 0; i < N; ++i) {
+ if (vec[pos + i].count == 0) {
+ auto const j = rev ? (N - i - 1) : i;
+ auto const value = from[j];
+ auto const mutate = log10(frand()) < -1.5;
+ vec[pos + i].base = mutate ? Base::random() : rev ? value.complement() : value;
+ }
+ vec[pos + i].increaseCoverageCount();
+ }
+ }
+
+ size_t size() const {
+ return vec.size();
+ }
+ void print() const {
+ auto &out = *settings->refSeqStream;
+ auto j = 0;
+
+ out << '>' << settings->refName << endl;
+ for (auto i : vec) {
+ out << i.base.DNA();
+ if (++j == 70) {
+ j = 0;
+ out << endl;
+ }
+ }
+ if (j != 0)
+ out << endl;
+ }
+
+ bool isOverCovered(int const pos) const {
+ auto const N = settings->readLength;
+ auto const max = 2 * settings->coverageTarget;
+ for (auto i = 0; i < N; ++i) {
+ if (vec[pos + i].count > max)
+ return true;
+ }
+ return false;
+ }
+
+ int nextNotCovered(int const pos) const {
+ auto const N = settings->readLength;
+ for (auto i = 0; i < N; ++i) {
+ if (vec[pos + i].count == 0)
+ return i;
+ }
+ return N;
+ }
+
+ int prevNotCovered(int const pos) const {
+ auto const N = settings->readLength;
+ for (auto i = N; i > 0; --i) {
+ if (vec[pos + i - 1].count == 0)
+ return i;
+ }
+ return 0;
+ }
+
+ Sequence read(int const pos, bool rev)
+ {
+ auto rslt = vector<Base>(settings->readLength);
+ auto const N = settings->readLength;
+ for (auto i = 0; i < N; ++i) {
+ auto const mutate = log10(frand()) < -3.0;
+ auto const base = mutate ? Base::random() : vec[pos + i].base;
+ if (rev) {
+ rslt[N - 1 - i] = base.complement();
+ }
+ else {
+ rslt[i] = base;
+ }
+ }
+ return Sequence(rslt);
+ }
+
+};
+
+static void print1FastQ(uint64_t serialNo, int readNo, Sequence const &SEQ, Quality const &QUAL)
+{
+ auto &out = *settings->fastqStream;
+
+ out << '@' << serialNo << '/' << readNo << endl;
+ SEQ.print(out, false) << endl << '+' << endl;
+ QUAL.print(out, false) << endl;
+}
+
+static void printFastQ(uint64_t serialNo, Sequence const &SEQ1, Sequence const &SEQ2, Quality const &QUAL1, Quality const &QUAL2)
+{
+ print1FastQ(serialNo, 1, SEQ1, QUAL1);
+ print1FastQ(serialNo, 2, SEQ2, QUAL2);
+}
+
+static int templateLength(int pos, int mpos, bool reversed)
+{
+ auto const aleft = reversed ? pos + settings->readLength - 1 : pos;
+ auto const aright = reversed ? pos - 1 : pos + settings->readLength;
+ auto const bleft = !reversed ? mpos + settings->readLength - 1 : mpos;
+ auto const bright = !reversed ? mpos - 1 : mpos + settings->readLength;
+ auto const left = min(aleft, bleft);
+ auto const right = max(aright, bright);
+ auto const value = right - left;
+ if (aright == right)
+ return -value;
+ return value;
+}
+
+static void printSAM(ostream &out, uint64_t name, int readNo, bool reversed, bool secondary, int pos, int lclip, int rclip, bool hardClip, int mpos, Sequence const &SEQ, Quality const &QUAL)
+{
+ auto const FLAG = 0x1 | 0x2 | (reversed ? 0x10 : 0) | (reversed ? 0 : 0x20) | (readNo == 1 ? 0x40 : 0) | (readNo == 2 ? 0x80 : 0) | (secondary ? 0x100 : 0);
+ out << name << '\t' << FLAG << '\t' << settings->refName << '\t' << pos + 1 + lclip << '\t' << (secondary ? 3 : 30) << '\t';
+ if (lclip)
+ out << lclip << (hardClip ? 'H' : 'S');
+ out << settings->readLength - lclip - rclip << 'M';
+ if (rclip)
+ out << rclip << (hardClip ? 'H' : 'S');
+ out << "\t=\t" << mpos + 1 << '\t' << templateLength(pos, mpos, reversed) << '\t';
+ SEQ.print(out, reversed) << '\t';
+ QUAL.print(out, reversed) << endl;
+}
+
+static uint64_t scramble(uint64_t const serialNo)
+{
+ static uint8_t scramble[256];
+ static uint8_t const *mixer = NULL;
+
+ if (mixer == NULL) {
+ for (int i = 0; i < 256; ++i)
+ scramble[i] = i;
+ for (int k = 0; k < 256; ++k) {
+ for (int i = 0; i < 256; ++i) {
+ auto const j = random() % 256;
+ auto const xi = scramble[i];
+ auto const xj = scramble[j];
+
+ scramble[i] = xj;
+ scramble[j] = xi;
+ }
+ }
+ mixer = scramble;
+ }
+ uint64_t rslt = 0;
+ auto carry = 0x55;
+ for (auto i = 0; i < 8; ++i) {
+ auto const j = serialNo >> (8 * i);
+ auto const k = mixer[(uint8_t)(j ^ carry)];
+ rslt = (uint64_t(k) << 56) | (rslt >> 8);
+ carry = k;
+ }
+ return rslt;
+}
+
+static pair<unsigned, unsigned> make_ipd_pair(void)
+{
+ for ( ; ; ) {
+ auto const r2 = normalRandom();
+ auto const ipd1 = r2.first * settings->templateLength / 10.0 + settings->templateLength;
+ auto const ipd2 = r2.second * settings->templateLength / 100.0 + ipd1;
+ if (ipd1 > settings->readLength && ipd2 > settings->readLength)
+ return make_pair((unsigned)ipd1, (unsigned)ipd2);
+ }
+}
+
+static pair<unsigned, unsigned> make_read_pair(unsigned const ipd)
+{
+/*
+ * |<-------ipd------->| |rrrrrrrrr|
+ * |fffffffff|-------------------|
+ * |-------------------|fffffffff|
+ * |rrrrrrrrr|
+ * ^second ^first ^second
+ */
+ for ( ; ; ) {
+ auto const r1 = frand();
+ auto const reversed = r1 < 0;
+ auto const pos1 = (reversed ? -r1 : r1) * settings->lengthTarget;
+ if (reversed && pos1 > settings->readLength + ipd) {
+ auto const pos2 = pos1 - settings->readLength - ipd;
+ return make_pair(pos1, pos2);
+ }
+ else {
+ auto const pos2 = pos1 + settings->readLength + ipd;
+ if (pos2 + settings->readLength <= settings->lengthTarget)
+ return make_pair(pos1, pos2);
+ }
+ }
+}
+
+static void run(void)
+{
+ auto ref = RefSequence();
+ uint64_t serialNo = 0;
+
+ for (double coverage = 0.0; coverage/double(ref.size()) > settings->coverageTarget; ) {
+ auto const ipd = make_ipd_pair();
+ auto const pos = make_read_pair(ipd.first);
+ auto const rev = pos.first > pos.second;
+
+ if (ref.isOverCovered(pos.first) || ref.isOverCovered(pos.second))
+ continue;
+
+ ref.fill(pos.first);
+ ref.fill(pos.second);
+
+ auto const SEQ1 = ref.read(pos.first, rev);
+ auto const SEQ2 = ref.read(pos.second, !rev);
+ auto const QUAL1 = Quality::random();
+ auto const QUAL2 = Quality::random();
+ auto const name = scramble(++serialNo);
+
+ printFastQ(name, SEQ1, SEQ2, QUAL1, QUAL2);
+ printSAM(cout, name, 1, rev, false, pos.first, 0, 0, false, pos.second, SEQ1, QUAL1);
+ printSAM(cout, name, 2, !rev, false, pos.second, 0, 0, false, pos.first, SEQ2, QUAL2);
+
+ coverage += 2 * settings->readLength;
+
+ for ( ; ; ) {
+ auto const pos = make_read_pair(ipd.second);
+ auto const rev = pos.first > pos.second;
+
+ if (ref.isOverCovered(pos.first) || ref.isOverCovered(pos.second))
+ break;
+
+ auto const left1 = ref.nextNotCovered(pos.first);
+ auto const right1 = ref.prevNotCovered(pos.first);
+ if (right1 <= left1 || (right1 - left1) * 2 < settings->readLength)
+ break;
+
+ auto const left2 = ref.nextNotCovered(pos.second);
+ auto const right2 = ref.prevNotCovered(pos.second);
+ if (right2 <= left2 || (right2 - left2) * 2 < settings->readLength)
+ break;
+
+ ref.copy(pos.first, SEQ1, rev);
+ ref.copy(pos.second, SEQ2, !rev);
+
+ printSAM(cout, name, 1, rev, true, pos.first, left1, settings->readLength - right1, false, pos.second, SEQ1, QUAL1);
+ printSAM(cout, name, 2, !rev, true, pos.second, left2, settings->readLength - right2, false, pos.first, SEQ2, QUAL2);
+
+ coverage += 2 * settings->readLength;
+ break;
+ }
+ }
+ ref.print();
+}
+
+static string getProgName(string const &argv0)
+{
+ auto const sep = argv0.find_last_of('/');
+ if (sep == string::npos)
+ return argv0;
+ return argv0.substr(sep + 1);
+}
+
+static string command_line(string const &progname, int argc, char *argv[])
+{
+ ostringstream oss;
+
+ oss << progname;
+ while (++argv, --argc) {
+ oss << ' ' << *argv;
+ }
+ return oss.str();
+}
+
+static void usage(string const &progname, bool error)
+{
+ cerr << "Usage: " << progname;
+ for (int i = 0; i < Settings::paramNames().size(); ++i) {
+ cout << " [" << Settings::paramNames()[i] << "=<" << Settings::paramTypes()[i] << ">]";
+ }
+ cout << endl;
+ exit(error ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+static map<string, string> loadArgs(int argc, char *argv[], string const &progname)
+{
+ map<string, string> args;
+
+ while (++argv, --argc) {
+ auto const arg = string(*argv);
+ bool found = false;
+
+ if (arg == "--help" || arg == "-h" || arg == "-?")
+ usage(progname, false);
+
+ for (auto i : Settings::paramNames()) {
+ if (arg.substr(0, i.length() + 1) == i + "=") {
+ args[i] = arg.substr(i.length() + 1);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ cerr << "Error: unknown parameter: '" << arg << "'" << endl;
+ usage(progname, true);
+ }
+ }
+ return args;
+}
+
+int main(int argc, char *argv[])
+{
+ auto const progname = getProgName(argv[0]);
+ auto const CL = command_line(progname, argc, argv);
+ auto args = loadArgs(argc, argv, progname);
+
+ // set defaults
+ (void)args.insert(make_pair("refname", "R"));
+ (void)args.insert(make_pair("fastq", progname + ".fastq"));
+ (void)args.insert(make_pair("coverage", "30"));
+ (void)args.insert(make_pair("length", "500000"));
+
+ try {
+ settings = new Settings(args);
+ }
+ catch (logic_error const &e) {
+ cerr << "Error: " << e.what() << endl;
+ usage(progname, true);
+ }
+
+ cout << "@HD\tVN:1.0\tSO:queryname" << endl;
+ cout << "@SQ\tSN:" << args["refname"] << "\tLN:" << args["length"] << "\tUR:" << args["refname"] << ".fasta" << endl;
+ cout << "@PG\tID:1\tPN:" << progname << "\tCL:" << CL << endl;
+ cout << "@CO\targuments: { ";
+ for (auto i : args) {
+ cout << i.first << "=" << i.second << "; ";
+ }
+ cout << "}" << endl;
+
+ srandom((unsigned)(time(0)));
+ run();
+ delete settings;
+ return 0;
+}
diff --git a/tools/util/rcexplain.c b/tools/util/rcexplain.c
new file mode 100644
index 0000000..a96be94
--- /dev/null
+++ b/tools/util/rcexplain.c
@@ -0,0 +1,127 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+
+/*--------------------------------------------------------------------------
+ * KMain
+ * invoked by platform specific "main" entrypoint
+ */
+const char UsageDefaultName[] = "rcexplain";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [Options] rc [rc ...]\n"
+ "\n"
+ "Summary:\n"
+ " Prints out error string to stdout for one or more return codes.\n",
+ progname);
+}
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionsStandard();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ rc_t rc = 0;
+ Args * args;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 0);
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0) {
+ MiniUsage(args);
+ rc = RC(rcExe, rcNoTarg, rcAllocating, rcParam, rcInvalid);
+ }
+ else
+ {
+ const char * pc;
+ rc_t exp;
+ uint32_t ix;
+
+ /* over rule any set log level */
+ rc = KLogLevelSet (klogInfo);
+
+ for (ix = 0; ix < pcount; ++ix)
+ {
+ rc = ArgsParamValue (args, ix, (const void **)&pc);
+ if (rc)
+ break;
+
+ exp = AsciiToU32 (pc, NULL, NULL);
+ rc = LOGERR (klogInfo, exp, pc);
+ }
+ }
+
+ } while (0);
+
+ ArgsWhack (args);
+ }
+ return rc;
+}
diff --git a/tools/util/rowwritetest.c b/tools/util/rowwritetest.c
new file mode 100644
index 0000000..b791fa2
--- /dev/null
+++ b/tools/util/rowwritetest.c
@@ -0,0 +1,433 @@
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <string.h> /* memset */
+#include <stdio.h> /* printf */
+#include <stdlib.h> /* malloc */
+#include <assert.h>
+#include <os-native.h>
+
+#define OPTION_TABLE "table-path"
+#define OPTION_ROW "row-count"
+#define ALIAS_TABLE "t"
+#define ALIAS_ROW "r"
+
+static char buff [81];
+static const char * table_usage[] = { "Table path. Defaults to", buff, NULL };
+static const char * row_usage[] = { buff, NULL };
+OptDef MyOptions[] =
+{
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, false },
+ { OPTION_ROW, ALIAS_ROW, NULL, row_usage, 1, true, false }
+};
+
+#define COLUMNS 5
+#define ROWLEN 64
+#define ROWS 0x400000
+
+
+char tablePath[512];
+
+
+const char UsageDefaultName[] = "rowwritetest";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [-t|--table-path <path>] [-r|--row-count <rows>]\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ OUTMSG (("Options:\n"));
+
+ rc = string_printf (buff, sizeof buff, NULL, "%s", tablePath);
+
+ HelpOptionLine (ALIAS_TABLE, OPTION_TABLE, "path", table_usage);
+
+ rc = string_printf (buff, sizeof buff, NULL, "Number of Rows. Defaults to %u", ROWS);
+
+ HelpOptionLine (ALIAS_ROW, OPTION_ROW, "row", row_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+#define BUFFERS 3
+
+rc_t run (const char * table_path, uint64_t N )
+{
+ static const char *colInf[] = {
+ "C1: Same value, same length",
+ "C2: Var. value, same length",
+ "C3: Var. value, var. legnth",
+ "C4: Same value except I row",
+ "C5: Same value except L row" };
+ rc_t rc;
+ uint64_t row = 0;
+ VDBManager *mgr = NULL;
+ VSchema *schema = NULL;
+ VTable *table = NULL;
+ VCursor *cursor;
+ uint32_t idx[COLUMNS];
+ uint64_t total[COLUMNS];
+ int i = 0, j = 0, prev = 0;
+ char *buffer[BUFFERS];
+
+
+
+
+ /* Initialize arrays */
+ memset(&idx, 0, sizeof idx);
+ memset(&total, 0, sizeof total);
+ for (i = 0; i < BUFFERS; ++i) {
+ char c;
+ size_t sz = ROWLEN + 1;
+ if (i == (BUFFERS - 1))
+ sz += ROWLEN;
+ buffer[i] = malloc(sz);
+ for (j = 0, c = 0; j < sz - 1; ++j, ++c) {
+ if (c >= ROWLEN)
+ c -= ROWLEN;
+ buffer[i][j] = '0' + c;
+ }
+ buffer[i][j] = '\0';
+ }
+ /* Create manager */
+ rc = VDBManagerMakeUpdate(&mgr, NULL);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "failed to open vdb library");
+ }
+ /* Initialize schema */
+ if (rc == 0) {
+ rc = VDBManagerMakeSchema(mgr, &schema);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to create empty schema");
+ }
+ if (rc == 0) {
+ char text[512] = "table Table #1 {\n";
+ char col [128];
+ for (i = 1; i <= COLUMNS; ++i) {
+ sprintf(col,
+ " column ascii C%d = .C%d; physical ascii .C%d = C%d;\n",
+ i, i, i, i);
+ strcat(text, col);
+ }
+ strcat(text, "};");
+ STSMSG(1,("Parsing schema:\n%s", text));
+ rc = VSchemaParseText(schema, "Schema", text, strlen(text));
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to parse schema");
+ }
+ /* Create table */
+ if (rc == 0) {
+ STSMSG(1,("Creating %s", tablePath));
+ rc = VDBManagerCreateTable(mgr, &table, schema, "Table", kcmInit,
+ tablePath);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to create table");
+ }
+ /* Initialize cursor */
+ if (rc == 0) {
+ rc = VTableCreateCursorWrite(table, &cursor, kcmInsert);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to create cursor");
+ }
+ for (i = 0; rc == 0 && i < COLUMNS; ++i) {
+ char col[3];
+ sprintf(col, "C%d", i + 1);
+ STSMSG(2,("Adding column %s to cursor", col));
+ rc = VCursorAddColumn(cursor, &idx[i], "%s", col);
+ if (rc != 0)
+ PLOGERR(klogInt, (klogInt, rc,
+ "failed to add $(c) to cursor", "c=%s", col));
+ }
+ if (rc == 0) {
+ rc = VCursorOpen(cursor);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to open cursor");
+ }
+ /* Write data */
+ for (row = 0; row < N && rc == 0; ++row) {
+ int max = 2 * ROWLEN - 1;
+ int sz = 0;
+ if ((row % 2) == 0) {
+ int min = 1;
+ sz = min + (int) (max * (rand() / (RAND_MAX + 1.0)));
+ prev = sz;
+ buffer[1][0] = '1';
+ }
+ else {
+ sz = max + 1 - prev;
+ buffer[1][0] = '2';
+ }
+ rc = Quitting();
+ if (rc == 0) {
+ KStsLevel lvl = 2;
+ if (row > 0 && ((row % ROWS) == 0)) {
+ lvl = 1;
+ }
+ STSMSG (lvl, ("Writing row %ji / %ji",
+ row + 1, N));
+ rc = VCursorOpenRow(cursor);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to open row");
+ }
+ for (j = 0; j < COLUMNS && rc == 0; ++j) {
+ uint32_t count = 0;
+ int buf = j;
+ switch (j) {
+ case 0:
+ case 1:
+ count = strlen(buffer[j]);
+ break;
+ case 2:
+ count = sz;
+ break;
+ case 3:
+ buf = 0;
+ if (row == 0)
+ buf = 1;
+ count = strlen(buffer[buf]);
+ break;
+ case 4:
+ buf = 0;
+ if (row == (N - 1))
+ buf = 1;
+ count = strlen(buffer[buf]);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ STSMSG (3, ("Row %ji/Col.%d: %sd %.*s\n",
+ row + 1, j + 1, count, count, buffer[buf]));
+ rc = VCursorWrite
+ (cursor, idx[j], 8, buffer[buf], 0, count);
+ if (rc != 0)
+ PLOGERR(klogInt, (klogInt, rc, "failed to write row[$i]", "i=%d", j + 1));
+ total[j] += count;
+ }
+ if (rc == 0) {
+ rc = VCursorCommitRow(cursor);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to commit row");
+ }
+ if (rc == 0) {
+ rc = VCursorCloseRow(cursor);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to close row");
+ }
+ }
+ if (rc == 0) {
+ STSMSG (1, ("Commiting cursor\n"));
+ rc = VCursorCommit(cursor);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to commit cursor");
+ }
+ /* Cleanup */
+ VCursorRelease(cursor);
+ VTableRelease(table);
+ VSchemaRelease(schema);
+ VDBManagerRelease(mgr);
+ for (i = 0; i < BUFFERS; ++i) {
+ free(buffer[i]);
+ }
+ /* Log */
+ if (rc == 0) {
+ PLOGMSG(klogInfo, (klogInfo, "$(t)", "t=%s", tablePath));
+ PLOGMSG(klogInfo,(klogInfo,
+ "$(n)($(N)) rows written - $(b) bytes per row",
+ PLOG_I64(n) "," PLOG_X64(N) ",b=%d", N, N, ROWLEN));
+ for (i = 0; i < COLUMNS; ++i) {
+ PLOGMSG(klogInfo,(klogInfo,
+ "$(i): $(n)($(N)) bytes",
+ "i=%s," PLOG_I64(n) "," PLOG_X64(N),
+ colInf[i], total[i], total[i]));
+ }
+ }
+ if (rc == 0) {
+ KDirectory *dir = NULL;
+ uint64_t sizes[COLUMNS];
+ memset(&sizes, 0, sizeof sizes);
+ rc = KDirectoryNativeDir(&dir);
+ if (rc != 0)
+ LOGERR(klogInt, rc, "failed to KDirectoryNativeDir");
+ else {
+ for (i = 1; i <= COLUMNS; ++i) {
+ uint64_t size = 0;
+#define FORMAT "%s/col/%s/data"
+#define KFORMAT "$(d)/col/$(n)/data", "d=%s,n=%s"
+#define STATUS(action) (action FORMAT, tablePath, name)
+ char name[3];
+
+ sprintf(name, "C%d", i);
+ STSMSG (1, STATUS("checking "));
+ rc = KDirectoryFileSize(dir, &size, FORMAT, tablePath, "%s", name);
+ if (rc != 0) {
+ if (GetRCState(rc) == rcNotFound) {
+ STSMSG (2, STATUS("not found "));
+ rc = 0;
+ }
+ else
+ PLOGERR(klogInt, (klogInt, rc,
+ "failed to check " KFORMAT, tablePath, name));
+ }
+ else {
+ STSMSG (2, STATUS("found "));
+ }
+ PLOGMSG(klogInfo, (klogInfo, "Size of $(d)/col/$(n)/data = $(s)",
+ "d=%s,n=%s," PLOG_I64(s), tablePath, name, size));
+ sizes[i - 1] = size;
+ }
+ }
+ KDirectoryRelease(dir);
+ if (rc == 0) {
+ puts("");
+ KOutMsg("%ld rows, %d bytes per row:\n", N, ROWLEN);
+ for (i = 0; i < COLUMNS; ++i) {
+ puts(colInf[i]);
+ }
+ puts("");
+ for (i = 0; i < COLUMNS; ++i) {
+ int64_t over = sizes[i] - total[i];
+ KOutMsg("C%d: %9ld bytes written; "
+ "%9ld in 'data'", i + 1, total[i], sizes[i]);
+ if (over > 0) {
+ double p = 100.0 * over / sizes[i];
+ printf(": %7ld extra bytes (%.4f%%)\n", over, p);
+ }
+ else {
+ puts("");
+ }
+ }
+ }
+ }
+
+ return rc;
+}
+
+
+
+
+rc_t CC KMain ( int argc, char *argv[] )
+{
+ rc_t rc = 0;
+ Args * args;
+
+ rc = ArgsMakeStandardOptions (&args);
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+
+ rc = ArgsAddOptionArray (args, MyOptions, sizeof MyOptions / sizeof (OptDef));
+ if (rc)
+ break;
+
+ rc = ArgsParse (args, argc, argv);
+ if (rc)
+ break;
+
+ /* quirky way default path is generated means this comes
+ * before standard argument handling */
+ rc = ArgsOptionCount (args, OPTION_TABLE, &pcount);
+ if (rc)
+ break;
+
+ if (pcount == 0)
+ {
+ static char * default_name = "RowWriteTestOutTable";
+ char * user;
+
+ user = getenv ("USER");
+
+ if (user)
+ snprintf (tablePath, sizeof (tablePath),
+ "/home/%s/%s", user, default_name);
+ else
+ strncpy (tablePath, default_name, sizeof (tablePath));
+ }
+ else
+ {
+ const char * pc;
+
+ ArgsOptionValue (args, OPTION_TABLE, 0, (const void **)&pc);
+ strncpy (tablePath, pc, sizeof (tablePath));
+ }
+
+ rc = ArgsHandleStandardOptions (args);
+ if (rc)
+ break;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ if (pcount)
+ {
+ const char * pc;
+
+ rc = ArgsArgvValue (args, 0, &pc);
+ if (rc)
+ break;
+
+ rc = RC (rcExe, rcNoTarg, rcParsing, rcParam, rcExcessive);
+
+ PLOGERR (klogFatal, (klogFatal, rc, "$(P) takes no parameters", PLOG_S(P), pc));
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_ROW, &pcount);
+ if (rc == 0)
+ {
+ uint64_t row_count;
+
+ if (pcount)
+ {
+ const char * pc;
+
+ rc = ArgsOptionValue (args, OPTION_ROW, 0, (const void **)&pc);
+ if (rc)
+ break;
+
+ row_count = AsciiToU32 (pc, NULL, NULL);
+ }
+ else
+ row_count = ROWS;
+
+ rc = run (tablePath, row_count);
+ }
+ } while (0);
+
+ ArgsWhack (args);
+ }
+ return rc;
+}
diff --git a/tools/util/samview.c b/tools/util/samview.c
new file mode 100644
index 0000000..ffbd0dd
--- /dev/null
+++ b/tools/util/samview.c
@@ -0,0 +1,80 @@
+/* ===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+#include <klib/log.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <align/bam.h>
+
+static
+void samview(char const file[])
+{
+ char buffer[64*1024];
+ BAMFile const *bam;
+ rc_t rc = BAMFileMake(&bam, file);
+
+ if (rc == 0) {
+ char const *header;
+ size_t hsize;
+ BAMAlignment const *rec;
+
+ BAMFileGetHeaderText(bam, &header, &hsize);
+ fwrite(header, 1, hsize, stdout);
+
+ while ((rc = BAMFileRead2(bam, &rec)) == 0) {
+ size_t actsize = 0;
+
+ if (BAMAlignmentFormatSAM(rec, &actsize, sizeof(buffer), buffer) != 0)
+ break;
+ fwrite(buffer, 1, actsize, stdout);
+ BAMAlignmentRelease(rec);
+ }
+ BAMFileRelease(bam);
+ }
+ LOGERR(klogWarn, rc, "Final RC");
+}
+
+rc_t CC UsageSummary(char const *name)
+{
+ return 0;
+}
+
+rc_t CC Usage(Args const *args)
+{
+ return 0;
+}
+
+rc_t CC KMain(int argc, char *argv[])
+{
+ while (--argc) {
+ samview(*++argv);
+ }
+ return 0;
+}
diff --git a/tools/util/schema-replace.c b/tools/util/schema-replace.c
new file mode 100644
index 0000000..3b0a669
--- /dev/null
+++ b/tools/util/schema-replace.c
@@ -0,0 +1,379 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/meta.h>
+#include <kfs/directory.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/out.h>
+#include <klib/text.h>
+#include <klib/rc.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#define OPTION_SCHEMA "schema"
+#define OPTION_DB_TYPE "db_type"
+#define OPTION_TAB_TYPE "tab_type"
+#define OPTION_TAB_NAME "tab_name"
+
+#define ALIAS_SCHEMA "s"
+#define ALIAS_DB_TYPE "d"
+#define ALIAS_TAB_TYPE "t"
+#define ALIAS_TAB_NAME "n"
+
+static const char * schema_usage[] = { "path to file, that contains new schema", NULL };
+static const char * db_type_usage[] = { "string, specifies the type of the database", NULL };
+static const char * tab_type_usage[] = { "string, specifies the type of the selected table", NULL };
+static const char * tab_name_usage[] = { "string, specifies the name of the table to be processed", NULL };
+
+OptDef SchemaUpOptions[] =
+{
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 1, true, true },
+ { OPTION_DB_TYPE, ALIAS_DB_TYPE, NULL, db_type_usage, 1, true, true },
+ { OPTION_TAB_TYPE, ALIAS_TAB_TYPE, NULL, tab_type_usage, 1, true, true },
+ { OPTION_TAB_NAME, ALIAS_TAB_NAME, NULL, tab_name_usage, 1, true, true }
+};
+
+const char UsageDefaultName[] = "schema-update";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s <path> [options]\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram( args, &fullpath, &progname );
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary( progname );
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine ( ALIAS_SCHEMA, OPTION_SCHEMA, NULL, schema_usage );
+ HelpOptionLine ( ALIAS_DB_TYPE, OPTION_DB_TYPE, NULL, db_type_usage );
+ HelpOptionLine ( ALIAS_TAB_TYPE, OPTION_TAB_TYPE, NULL, tab_type_usage );
+ HelpOptionLine ( ALIAS_TAB_NAME, OPTION_TAB_NAME, NULL, tab_name_usage );
+
+ HelpOptionsStandard();
+
+ HelpVersion( fullpath, KAppVersion() );
+ return rc;
+}
+
+static const char* get_str_option( const Args *my_args,
+ const char *name )
+{
+ const char* res = NULL;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&res );
+ }
+ return res;
+}
+
+
+typedef struct ctx
+{
+ VDBManager * vdb_mgr;
+ KDBManager * kdb_mgr;
+ VSchema *schema;
+
+ const char *db_type;
+ const char *tab_type;
+ const char *tab_name;
+
+ char * db_schema_buff;
+ size_t db_schema_len;
+ char * tab_schema_buff;
+ size_t tab_schema_len;
+} ctx;
+typedef ctx* p_ctx;
+
+
+static rc_t write_schema( KMetadata *meta, const char * schema_dump, size_t schema_len )
+{
+ KMDataNode *schema_node;
+ rc_t rc = KMetadataOpenNodeUpdate ( meta, &schema_node, "schema" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeWrite ( schema_node, schema_dump, schema_len );
+ KMDataNodeRelease ( schema_node );
+ }
+ else
+ OUTMSG(( "error KMetadataOpenNodeUpdate: %R\n", rc ));
+ return rc;
+}
+
+
+static rc_t process_csra( p_ctx ctx, const char *csra )
+{
+ KDatabase *this_kdb;
+ rc_t rc = KDBManagerOpenDBUpdate ( ctx->kdb_mgr, &this_kdb, "%s", csra );
+ if ( rc == 0 )
+ {
+ /* do it for the whole database ... */
+ KMetadata *meta;
+ KTable *this_tab;
+
+ rc = KDatabaseOpenMetadataUpdate ( this_kdb, &meta );
+ if ( rc == 0 )
+ {
+ rc = write_schema( meta, ctx->db_schema_buff, ctx->db_schema_len );
+ KMetadataRelease ( meta );
+ }
+ else
+ OUTMSG(( "error KDatabaseOpenMetadataUpdate: %R\n", rc ));
+
+ /* do it for the selected table ... */
+ if ( rc == 0 )
+ {
+ rc = KDatabaseOpenTableUpdate ( this_kdb, &this_tab, "%s", ctx->tab_name );
+ if ( rc == 0 )
+ {
+ rc = KTableOpenMetadataUpdate ( this_tab, &meta );
+ if ( rc == 0 )
+ {
+ rc = write_schema( meta, ctx->tab_schema_buff, ctx->tab_schema_len );
+ KMetadataRelease ( meta );
+ }
+ else
+ OUTMSG(( "error KTableOpenMetadataUpdate: %R\n", rc ));
+ }
+ else
+ OUTMSG(( "error KDatabaseOpenTableUpdate: %R\n", rc ));
+ }
+
+ KDatabaseRelease ( this_kdb );
+ }
+ else OUTMSG(( "error KDBManagerOpenDBUpdate: %R\n", rc ));
+ return rc;
+}
+
+
+static rc_t process_files( p_ctx ctx, Args * args )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *csra = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&csra );
+ if ( rc == 0 )
+ {
+ OUTMSG(( "\nprocessing: %s\n", csra ));
+ rc = process_csra( ctx, csra );
+ if ( rc == 0 )
+ OUTMSG(( "processed: %s\n", csra ));
+ }
+ }
+ }
+/*
+ if ( ctx->db_schema_buff != NULL )
+ OUTMSG(( "%s\n", ctx->db_schema_buff ));
+ if ( ctx->tab_schema_buff != NULL )
+ OUTMSG(( "%s\n", ctx->tab_schema_buff ));
+*/
+ return rc;
+}
+
+
+typedef struct dump_ctx
+{
+ char *buffer;
+ size_t len;
+ size_t size;
+} dump_ctx;
+typedef dump_ctx* p_dump_ctx;
+
+
+static rc_t CC schema_dump_flush( void *dst, const void *buffer, size_t bsize )
+{
+ rc_t rc = -1;
+ p_dump_ctx ctx = dst;
+ if ( ctx->buffer == NULL )
+ {
+ ctx->size = bsize + 1;
+ ctx->buffer = malloc( ctx->size );
+ if ( ctx->buffer != NULL )
+ {
+ memmove ( ctx->buffer, buffer, bsize );
+ ctx->len = bsize;
+ rc = 0;
+ }
+ }
+ else
+ {
+ ctx->size += bsize;
+ ctx->buffer = realloc( ctx->buffer, ctx->size );
+ if ( ctx->buffer != NULL )
+ {
+ memmove ( &(ctx->buffer[ctx->len]), buffer, bsize );
+ ctx->len += bsize;
+ rc = 0;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t predump_schema( VSchema *schema, const char * type,
+ char **buffer, size_t *len )
+{
+ rc_t rc;
+ dump_ctx ctx;
+ ctx.buffer = NULL;
+ ctx.len = 0;
+ ctx.size = 0;
+
+ *buffer = NULL;
+ *len = 0;
+ rc = VSchemaDump( schema, sdmCompact, type, schema_dump_flush, &ctx );
+ if ( rc == 0 )
+ {
+ if ( ctx.buffer != NULL )
+ {
+ ctx.buffer[ ctx.len ] = 0;
+ *buffer = ctx.buffer;
+ *len = ctx.len;
+ }
+ }
+ else
+ {
+ if ( ctx.buffer != NULL )
+ free( ctx.buffer );
+ }
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ SchemaUpOptions, sizeof SchemaUpOptions / sizeof SchemaUpOptions [ 0 ] );
+ if ( rc == 0 )
+ {
+ ctx ctx;
+ const char * schema_name = get_str_option( args, OPTION_SCHEMA );
+ ctx.db_type = get_str_option( args, OPTION_DB_TYPE );
+ ctx.tab_type = get_str_option( args, OPTION_TAB_TYPE );
+ ctx.tab_name = get_str_option( args, OPTION_TAB_NAME );
+
+ if ( schema_name != NULL && ctx.db_type != NULL &&
+ ctx.tab_type != NULL && ctx.tab_name )
+ {
+ KDirectory * directory;
+ OUTMSG(( "schema : %s\n", schema_name ));
+ OUTMSG(( "db-type : %s\n", ctx.db_type ));
+ OUTMSG(( "tab-type : %s\n", ctx.tab_type ));
+ OUTMSG(( "tab-name : %s\n", ctx.tab_name ));
+
+ rc = KDirectoryNativeDir( &directory );
+ if ( rc == 0 )
+ {
+ rc = VDBManagerMakeUpdate ( &ctx.vdb_mgr, directory );
+ if ( rc == 0 )
+ {
+ rc = VDBManagerOpenKDBManagerUpdate ( ctx.vdb_mgr, &ctx.kdb_mgr );
+ if ( rc == 0 )
+ {
+ rc = VDBManagerMakeSchema( ctx.vdb_mgr, &ctx.schema );
+ if ( rc == 0 )
+ {
+ rc = VSchemaParseFile( ctx.schema, "%s", schema_name );
+ if ( rc == 0 )
+ {
+ rc = predump_schema( ctx.schema, ctx.db_type,
+ &ctx.db_schema_buff, &ctx.db_schema_len );
+ if ( rc == 0 )
+ {
+ rc = predump_schema( ctx.schema, ctx.tab_type,
+ &ctx.tab_schema_buff, &ctx.tab_schema_len );
+ if ( rc == 0 )
+ {
+ rc = process_files( &ctx, args );
+ free( ctx.tab_schema_buff );
+ }
+ free( ctx.db_schema_buff );
+ }
+ }
+ else
+ OUTMSG(( "error VSchemaParseFile %R\n", rc ));
+ VSchemaRelease( ctx.schema );
+ }
+ else
+ OUTMSG(( "error VDBManagerMakeSchema %R\n", rc ));
+ }
+ else
+ OUTMSG(( "error VDBManagerOpenKDBManagerUpdate %R\n", rc ));
+ VDBManagerRelease( ctx.vdb_mgr );
+ }
+ else
+ OUTMSG(( "error VDBManagerMakeUpdate %R\n", rc ));
+ KDirectoryRelease( directory );
+ }
+ else
+ OUTMSG(( "error KDirectoryNativeDir %R\n", rc ));
+ }
+ else
+ OUTMSG(( "error obtaining arguments\n" ));
+ ArgsWhack( args );
+ }
+ return rc;
+}
+
diff --git a/tools/util/sortreadtest.c b/tools/util/sortreadtest.c
new file mode 100644
index 0000000..4fa9569
--- /dev/null
+++ b/tools/util/sortreadtest.c
@@ -0,0 +1,351 @@
+#include <kapp/main.h>
+#include <kapp/args.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/mmap.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include <assert.h>
+#include <os-native.h>
+
+
+/*
+
+ default file is "ncbi/seq.vschema"
+ default table-spec "NCBI:tbl:base_space#2"
+
+*/
+#define SCHEMASPEC "ncbi/seq.vschema"
+#define TYPESPEC "NCBI:tbl:base_space#2"
+
+const char UsageDefaultName[] = "sortreadtest";
+
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [OPTIONS] file-path table-path [schema-path]\n"
+ "\n"
+ "Summary:\n"
+ " Write lines from file as rows to table using schema\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ OUTMSG (("Options:\n"));
+
+ HelpOptionsStandard ();
+
+ return rc;
+}
+
+typedef struct param_block
+{
+ const char * file_path;
+ const char * table_path;
+ const char * schema_path;
+
+ KDirectory * pwd;
+ const KFile * file;
+ const KMMap * mmap;
+ VDBManager * mgr;
+ VSchema * schema;
+ VTable * table;
+ VCursor * cursor;
+
+ const char * seq;
+ const char * eof;
+ size_t seq_size;
+
+
+ uint32_t idx; /* column idx in the cursor for READ (should be 0 */
+
+} param_block;
+
+rc_t get_a_sequence (param_block * pb)
+{
+ char * eol;
+ rc_t rc = 0;
+ if (pb->seq == NULL) /* first call */
+ {
+ const void * annoying;
+ uint64_t file_pos;
+ size_t map_size;
+ uint64_t file_size;
+
+ rc = KFileSize (pb->file, &file_size);
+ if (rc)
+ return rc;
+
+ rc = KMMapAddrRead (pb->mmap, &annoying);
+ if (rc)
+ return rc;
+
+ pb->seq = annoying;
+
+ if (pb->seq == NULL)
+ return 0;
+
+ rc = KMMapPosition (pb->mmap, &file_pos);
+ if (rc)
+ return rc;
+
+ if (file_pos != 0)
+ {
+ rc = RC (rcExe, rcMemMap, rcAccessing, rcOffset, rcInvalid);
+ return rc;
+ }
+
+ rc = KMMapSize (pb->mmap, &map_size);
+ if (rc)
+ return rc;
+
+ if (map_size != file_size)
+ {
+ rc = RC (rcExe, rcMemMap, rcAccessing, rcFile, rcInvalid);
+ return rc;
+ }
+ pb->eof = pb->seq + map_size;
+ }
+ else
+ {
+ pb->seq += pb->seq_size + 1;
+
+ if (pb->seq >= pb->eof)
+ {
+ pb->seq = NULL;
+ return 0;
+ }
+ }
+
+ eol = string_chr (pb->seq, pb->eof - pb->seq, '\n');
+ if (eol == NULL)
+ pb->seq_size = pb->eof - pb->seq;
+ else
+ pb->seq_size = eol - pb->seq;
+
+ return rc;
+}
+
+
+rc_t write_rows (param_block * pb)
+{
+ rc_t rc = 0;
+
+ pb->seq = NULL;
+
+ do
+ {
+ rc = get_a_sequence (pb);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failed to read a sequence");
+ }
+ else
+ {
+ if (pb->seq == NULL)
+ break;
+ rc = VCursorOpenRow (pb->cursor);
+ if (rc)
+ {
+ LOGERR (klogFatal, rc, "Failed to open row");
+ break;
+ }
+ else
+ {
+ rc_t rc2;
+ rc = VCursorWrite (pb->cursor, pb->idx, 8, pb->seq, 0, pb->seq_size);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to write row");
+ else
+ rc = VCursorCommitRow (pb->cursor);
+ rc2 = VCursorCloseRow (pb->cursor);
+ if (rc == 0)
+ rc = rc2;
+ }
+ }
+ } while (rc == 0);
+
+ return rc;
+}
+
+
+rc_t open (param_block * pb)
+{
+ rc_t rc;
+
+ rc = KDirectoryNativeDir (&pb->pwd);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to open file system");
+ else
+ {
+ rc = KDirectoryOpenFileRead (pb->pwd, &pb->file, "%s", pb->file_path);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to open input file");
+ else
+ {
+ rc = KMMapMakeRead (&pb->mmap, pb->file);
+ if (rc)
+ LOGERR (klogFatal, rc, "unable to map file");
+ else
+ {
+ rc = VDBManagerMakeUpdate (&pb->mgr, pb->pwd);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to open DB Manager");
+ else
+ {
+ rc = VDBManagerMakeSchema (pb->mgr, &pb->schema);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to create a schema object");
+ else
+ {
+ VSchemaAddIncludePath (pb->schema, "interfaces");
+
+ rc = VSchemaParseFile (pb->schema, "%s", pb->schema_path);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to parse schema");
+ else
+ {
+ rc = VDBManagerCreateTable (pb->mgr, &pb->table, pb->schema,
+ TYPESPEC, kcmCreate, "%s", pb->table_path);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to create table");
+ else
+ {
+ rc = VTableCreateCursorWrite (pb->table, &pb->cursor, kcmCreate);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to create cursor");
+ else
+ {
+ rc = VCursorAddColumn (pb->cursor, &pb->idx, "READ");
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to add READ to cursor");
+ else
+ {
+ rc = VCursorOpen (pb->cursor);
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed to open cursor");
+ else
+ {
+ rc = write_rows (pb);
+ if (rc == 0)
+ VCursorCommit (pb->cursor);
+ }
+ }
+ VCursorRelease (pb->cursor);
+ }
+ VTableRelease (pb->table);
+ }
+ }
+ VSchemaRelease (pb->schema);
+ }
+ VDBManagerRelease (pb->mgr);
+ }
+ KMMapRelease (pb->mmap);
+ }
+ KFileRelease (pb->file);
+ }
+ KDirectoryRelease (pb->pwd);
+ }
+ return rc;
+}
+
+rc_t CC KMain ( int argc, char *argv[] )
+{
+ Args * args;
+ rc_t rc = 0;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 0 /*1, Options, sizeof Options / sizeof (&Options[1])*/);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "Failed to parse parameters");
+ return rc;
+ }
+ else
+ {
+ do
+ {
+ param_block pb;
+ uint32_t pcount;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "Failed to get paramater count");
+ break;
+ }
+ switch (pcount)
+ {
+ default:
+ rc = MiniUsage (args);
+ goto bailout;
+
+ case 2:
+ pb.schema_path = SCHEMASPEC;
+ break;
+
+ case 3:
+ pb.schema_path = NULL;
+ break;
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&pb.file_path);
+ if (rc)
+ {
+ LOGERR (klogInt,rc, "Failed to get file path");
+ break;
+ }
+
+ rc = ArgsParamValue (args, 1, (const void **)&pb.table_path);
+ if (rc)
+ {
+ LOGERR (klogInt,rc, "Failed to get table path");
+ break;
+ }
+ if (pb.schema_path == NULL)
+ {
+ rc = ArgsParamValue (args, 2, (const void **)&pb.schema_path);
+ if (rc)
+ {
+ LOGERR (klogInt,rc, "Failed to get schema path");
+ break;
+ }
+ }
+ rc = open (&pb);
+
+ } while (0);
+ bailout:
+ ArgsWhack (args);
+ }
+ if (rc)
+ LOGERR (klogFatal, rc, "Failed!");
+ else
+ KStsMsg("Exit success %R");
+
+
+ return rc;
+}
diff --git a/tools/util/syspass-priv.h b/tools/util/syspass-priv.h
new file mode 100644
index 0000000..6f8cb80
--- /dev/null
+++ b/tools/util/syspass-priv.h
@@ -0,0 +1,44 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_util_syspass_priv_
+#define _h_util_syspass_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t get_pass(const char *prompt, char *buf, size_t bufsiz);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_util_syspass_priv_ */
diff --git a/tools/util/test-sra-priv.h b/tools/util/test-sra-priv.h
new file mode 100644
index 0000000..924e5e2
--- /dev/null
+++ b/tools/util/test-sra-priv.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_util_test_sra_priv_
+#define _h_util_test_sra_priv_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h> /* rc_t */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+rc_t PrintOS(bool xml);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_util_test_sra_priv_ */
diff --git a/tools/util/test-sra.c b/tools/util/test-sra.c
new file mode 100644
index 0000000..e00a73c
--- /dev/null
+++ b/tools/util/test-sra.c
@@ -0,0 +1,3724 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ==============================================================================
+*
+*/
+
+#include "test-sra-priv.h" /* PrintOS */
+
+#include <kapp/main.h> /* KMain */
+
+#include <kfg/config.h> /* KConfig */
+#include <kfg/kart.h> /* Kart */
+#include <kfg/repository.h> /* KRepositoryMgr */
+
+#include <kfs/dyload.h> /* KDyld */
+
+#include <klib/time.h> /* KTimeMsStamp */
+
+#include <kns/ascp.h> /* ascp_locate */
+#include <kns/endpoint.h> /* KEndPoint */
+#include <kns/http.h>
+#include <kns/http-priv.h> /* KClientHttpResultFormatMsg */
+#include <kns/kns-mgr-priv.h> /* KNSManagerMakeReliableClientRequest */
+#include <kns/manager.h>
+#include <kns/manager-ext.h> /* KNSManagerNewReleaseVersion */
+#include <kns/stream.h>
+
+#include <vfs/manager.h> /* VFSManager */
+#include <vfs/path.h> /* VPath */
+#include <vfs/resolver.h> /* VResolver */
+
+#include <sra/sraschema.h> /* VDBManagerMakeSRASchema */
+
+#include <vdb/database.h> /* VDatabase */
+#include <vdb/dependencies.h> /* VDBDependencies */
+#include <vdb/manager.h> /* VDBManager */
+#include <vdb/report.h> /* ReportSetVDBManager */
+#include <vdb/schema.h> /* VSchemaRelease */
+#include <vdb/table.h> /* VDBManagerOpenTableRead */
+#include <vdb/vdb-priv.h> /* VDBManagerSetResolver */
+
+#include <kdb/manager.h> /* kptDatabase */
+
+#include <kfs/directory.h> /* KDirectory */
+#include <kfs/file.h> /* KFile */
+
+#include <klib/data-buffer.h> /* KDataBuffer */
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/log.h> /* KLogHandlerSet */
+#include <klib/out.h> /* KOutMsg */
+#include <klib/printf.h> /* string_vprintf */
+#include <klib/rc.h>
+#include <klib/report.h> /* ReportForceFinalize */
+#include <klib/sra-release-version.h>
+#include <klib/text.h> /* String */
+
+#include <sysalloc.h>
+
+#include <assert.h>
+#include <ctype.h> /* isprint */
+#include <stdlib.h> /* calloc */
+#include <string.h> /* memset */
+
+VFS_EXTERN rc_t CC VResolverProtocols ( VResolver * self,
+ VRemoteProtocols protocols );
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+#define HTTP_VERSION 0x01010000
+
+typedef enum {
+ eCfg = 1,
+ eResolve = 2,
+ eDependMissing = 4,
+ eDependAll = 8,
+ eNetwork = 16,
+ eVersion = 32,
+ eNewVersion = 64,
+ eOpenTable = 128,
+ eOpenDB = 256,
+ eType = 512,
+ eNcbiReport = 1024,
+ eOS = 2048,
+ eAscp = 4096,
+ eAscpVerbose = 8192,
+ eNgs = 16384,
+ ePrintFile = 32768,
+ eAll = 65536,
+ eNoTestArg = 131072,
+} Type;
+typedef uint64_t TTest;
+static const char TESTS[] = "crdDwsSoOtnufFgpa";
+typedef struct {
+ KConfig *cfg;
+ KDirectory *dir;
+ KNSManager *knsMgr;
+
+ const VDBManager *mgr;
+ uint32_t projectId;
+
+ VFSManager *vMgr;
+ const KRepositoryMgr *repoMgr;
+ VResolver *resolver;
+ VSchema *schema;
+
+ TTest tests;
+ bool recursive;
+ bool noVDBManagerPathType;
+ bool noRfs;
+ bool full;
+ bool xml;
+ bool network;
+
+ size_t bytes;
+
+ bool allowCaching;
+ VResolverEnableState cacheState;
+} Main;
+
+const char UsageDefaultName[] = "test-sra";
+
+rc_t CC UsageSummary(const char *prog_name) {
+ return KOutMsg(
+ "Usage:\n"
+ " quick check mode:\n"
+ " %s -Q [ name... ]\n\n"
+ " full test mode:\n"
+ " %s [+acdDfFgnoOprsStuw] [-acdDfFgnoOprsStuw] [-R] [-N] [-C]\n"
+ " [-X <type>] [-L <path>] [options] name [ name... ]\n"
+ , prog_name, prog_name);
+}
+
+rc_t CC Usage(const Args *args) {
+ rc_t rc2 = 0;
+
+ const char *progname, *fullpath;
+ rc_t rc = ArgsProgram(args, &fullpath, &progname);
+ if (rc != 0) {
+ progname = fullpath = UsageDefaultName;
+ }
+
+ rc2 = UsageSummary(progname);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+
+ rc2 = KOutMsg("\n"
+ "Test [SRA] object, resolve it, print dependencies, configuration\n\n"
+ "[+tests] - add tests\n"
+ "[-tests] - remove tests\n\n");
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ rc2 = KOutMsg(
+ "Tests:\n"
+ " s - print SRA software information\n"
+ " S - print SRA software information and latest SRA toolkit version\n"
+ " u - print operation system information\n"
+ " c - print configuration\n"
+ " n - print NCBI error report\n"
+ " f - print ascp information\n"
+ " F - print verbose ascp information\n"
+ " t - print object types\n"
+ " g - print NGS information\n"
+ " p - print content of resolved remote HTTP file\n"
+ " w - run network test\n"
+ );
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ rc2 = KOutMsg(
+ " r - call VResolver\n"
+ " d - call ListDependencies(missing)\n"
+ " D - call ListDependencies(all)\n"
+ " o - call VDBManagerOpenTableRead(object)\n"
+ " O - call VDBManagerOpenDBRead(object)\n"
+ " a - all tests except VDBManagerOpen...Read and verbose ascp\n\n");
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ rc2 = KOutMsg(
+ "In quick check mode - the base checks are run;\n"
+ "in full test mode (default) all the tests are available.\n\n"
+ "In full mode, if no tests were specified then all tests will be run.\n"
+ "\n"
+ "-X < xml | text > - whether to generate well-formed XML\n"
+ "-R - check objects recursively\n"
+ "-N - do not call VDBManagerPathType\n"
+ "-C - do not disable caching (default: from configuration)\n"
+ "-b --bytes=K - print the first K bytes of resolved remote HTTP file)\n"
+ " (default: 256)\n"
+ "-l --library=<path to library> - print version of dynamic library\n"
+ "\n"
+ "More options:\n");
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+
+ HelpOptionsStandard();
+
+ return rc;
+}
+
+static bool testArg(const char *arg, TTest *testOn, TTest *testOff) {
+ int j = 1;
+ TTest *res = NULL;
+
+ assert(arg && testOn && testOff);
+ if (arg[0] != '+' && arg[0] != '-') {
+ return false;
+ }
+
+ if (arg[0] == '-' &&
+ arg[1] != '\0' && strchr(TESTS, arg[1]) == NULL)
+ {
+ return false;
+ }
+
+ res = arg[0] == '-' ? testOff : testOn;
+
+ for (j = 1; arg[j] != '\0'; ++j) {
+ char *c = strchr(TESTS, arg[j]);
+ if (c != NULL) {
+ int64_t offset = c - TESTS;
+ *res |= 1 << offset;
+ }
+ }
+
+ return true;
+}
+
+static TTest Turn(TTest in, TTest tests, bool on) {
+ TTest c = 1;
+ for (c = 1; c < eAll; c <<= 1) {
+ if (tests & c) {
+ if (on) {
+ in |= c;
+ }
+ else {
+ in &= ~c;
+ }
+ }
+ }
+ return in;
+}
+
+static TTest processTests(TTest testsOn, TTest testsOff) {
+ TTest tests = 0;
+
+ bool allOn = false;
+ bool allOff = false;
+
+ if (testsOn & eAll && testsOff & eAll) {
+ testsOn &= ~eAll;
+ testsOff &= ~eAll;
+ }
+ else if (testsOn & eAll) {
+ allOn = true;
+ }
+ else if (testsOff & eAll) {
+ allOff = true;
+ }
+
+ if (allOn) {
+ tests = ~0;
+ tests = Turn(tests, testsOff, false);
+ tests = Turn(tests, eOpenTable , testsOn & eOpenTable);
+ tests = Turn(tests, eOpenDB , testsOn & eOpenDB);
+ tests = Turn(tests, eAscpVerbose, testsOn & eAscpVerbose);
+ }
+ else if (allOff) {
+ tests = Turn(tests, testsOn, true);
+ }
+ else if (testsOn != 0 || testsOff != 0) {
+ tests = Turn(tests, testsOff, false);
+ tests = Turn(tests, testsOn, true);
+ }
+ else /* no test argument provided */ {
+ tests = ~0;
+ tests = Turn(tests, eOpenTable, false);
+ tests = Turn(tests, eOpenDB, false);
+ tests = Turn(tests, eAscpVerbose, false);
+ tests = Turn(tests, ePrintFile, false);
+ }
+
+ if (tests & eAscpVerbose) {
+ tests = Turn(tests, eAscp, true);
+ }
+
+ if (tests & ePrintFile) {
+ tests = Turn(tests, eResolve, true);
+ }
+
+ if (tests & eNcbiReport) {
+ tests = Turn(tests, eCfg, false);
+ }
+
+ return tests;
+}
+
+static void MainMakeQuick(Main *self) {
+ assert(self);
+#if 0
+ self->tests = eCurl;
+#endif
+}
+
+static void MainAddTest(Main *self, Type type) {
+ assert(self);
+ self->tests |= type;
+}
+
+static bool MainHasTest(const Main *self, Type type) {
+ return (self->tests & type) != 0;
+}
+
+static void MainPrint(const Main *self) {
+ return;
+
+ assert(self);
+
+ if (MainHasTest(self, eCfg)) {
+ KOutMsg("eCfg\n");
+ }
+
+ if (MainHasTest(self, eResolve)) {
+ KOutMsg("eResolve\n");
+ }
+
+ if (MainHasTest(self, eDependMissing)) {
+ KOutMsg("eDependMissing\n");
+ }
+
+ if (MainHasTest(self, eDependAll)) {
+ KOutMsg("eDependAll\n");
+ }
+
+#if 0
+ if (MainHasTest(self, eCurl)) {
+ KOutMsg("eCurl\n");
+ }
+#endif
+
+ if (MainHasTest(self, eVersion)) {
+ KOutMsg("eVersion\n");
+ }
+
+ if (MainHasTest(self, eNewVersion)) {
+ KOutMsg("eNewVersion\n");
+ }
+
+ if (MainHasTest(self, eOpenTable)) {
+ KOutMsg("eOpenTable\n");
+ }
+
+ if (MainHasTest(self, eOpenDB)) {
+ KOutMsg("eOpenDB\n");
+ }
+
+ if (MainHasTest(self, eType)) {
+ KOutMsg("eType\n");
+ }
+
+ if (MainHasTest(self, eNcbiReport)) {
+ KOutMsg("eNcbiReport\n");
+ }
+
+ if (MainHasTest(self, eAll)) {
+ KOutMsg("eAll\n");
+ }
+
+ if (MainHasTest(self, eNoTestArg)) {
+ KOutMsg("eNoTestArg\n");
+ }
+}
+
+static rc_t MainInitObjects(Main *self) {
+ rc_t rc = 0;
+
+ VResolver *resolver = NULL;
+
+ if (rc == 0) {
+ rc = KDirectoryNativeDir(&self->dir);
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerMakeRead(&self->mgr, NULL);
+ ReportSetVDBManager(self->mgr);
+ }
+
+ if (rc == 0) {
+ rc = KConfigMake(&self->cfg, NULL);
+ }
+
+ if (rc == 0) {
+ rc = KConfigMakeRepositoryMgrRead(self->cfg, &self->repoMgr);
+ if (rc == 0) {
+ bool has_project_id = self->projectId != 0;
+ if (has_project_id) {
+ const KRepository *repository = NULL;
+ rc = KRepositoryMgrGetProtectedRepository(
+ self->repoMgr, self->projectId, &repository);
+ if (rc == 0) {
+ VResolver *resolver = NULL;
+ rc = KRepositoryMakeResolver(
+ repository, &resolver, self->cfg);
+ if (rc == 0) {
+ rc = VDBManagerSetResolver(self->mgr, resolver);
+ }
+ RELEASE(VResolver, resolver);
+ }
+ RELEASE(KRepository, repository);
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerMake(&self->vMgr);
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerGetResolver(self->vMgr, &resolver);
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerGetKNSMgr(self->vMgr, &self->knsMgr);
+ }
+
+ if (rc == 0) {
+ if (!self->allowCaching) {
+ self->cacheState = VResolverCacheEnable(resolver, vrAlwaysDisable);
+ }
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerMakeResolver(self->vMgr, &self->resolver, self->cfg);
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerMakeSRASchema(self->mgr, &self->schema);
+ if (rc != 0) {
+ OUTMSG(("VDBManagerMakeSRASchema() = %R\n", rc));
+ }
+ }
+
+ RELEASE(VResolver, resolver);
+
+ return rc;
+}
+
+static
+void _MainInit(Main *self, int argc, char *argv[], int *argi, char **argv2)
+{
+ int i = 0;
+
+ bool hasTestArg = false;
+
+ TTest testsOn = 0;
+ TTest testsOff = 0;
+
+ assert(self && argv && argi && argv2);
+
+ *argi = 0;
+ argv2[(*argi)++] = argv[0];
+
+ for (i = 1; i < argc; ++i) {
+ if (!testArg(argv[i], &testsOn, &testsOff)) {
+ argv2[(*argi)++] = argv[i];
+ }
+ else {
+ hasTestArg = true;
+ }
+ }
+
+ self->tests = processTests(testsOn, testsOff);
+
+ if (hasTestArg) {
+ self->tests &= ~eNoTestArg;
+ }
+ else {
+ self->tests |= eNoTestArg;
+ }
+
+ MainPrint(self);
+}
+
+static char** MainInit(Main *self, int argc, char *argv[], int *argi) {
+ char **argv2 = calloc(argc, sizeof *argv2);
+
+ assert(self);
+
+ memset(self, 0, sizeof *self);
+
+ if (argv2 != NULL) {
+ _MainInit(self, argc, argv, argi, argv2);
+ }
+
+ return argv2;
+}
+
+static rc_t MainCallCgiImpl(const Main *self,
+ const KConfigNode *node, const char *acc)
+{
+ rc_t rc = 0;
+ String *url = NULL;
+ KHttpRequest *req = NULL;
+ KDataBuffer result;
+ memset(&result, 0, sizeof result);
+ assert(self && node && acc);
+ if (rc == 0) {
+ rc = KConfigNodeReadString(node, &url);
+ if (url == NULL)
+ rc = RC(rcExe, rcNode, rcReading, rcString, rcNull);
+ }
+
+ if (rc == 0)
+ rc = KNSManagerMakeRequest(self->knsMgr,
+ &req, HTTP_VERSION, NULL, url->addr);
+
+ if (rc == 0)
+ rc = KHttpRequestAddPostParam ( req, "acc=%s", acc );
+
+ if (rc == 0) {
+ KHttpResult *rslt;
+ rc = KHttpRequestPOST ( req, & rslt );
+ if ( rc == 0 ) {
+ uint32_t code;
+ size_t msg_size;
+ char msg_buff [ 256 ];
+ rc = KHttpResultStatus(rslt,
+ & code, msg_buff, sizeof msg_buff, & msg_size);
+ if ( rc == 0 && code == 200 ) {
+ KStream * response;
+ rc = KHttpResultGetInputStream ( rslt, & response );
+ if ( rc == 0 ) {
+ size_t num_read;
+ size_t total = 0;
+ KDataBufferMakeBytes ( & result, 4096 );
+ while ( 1 ) {
+ uint8_t *base;
+ uint64_t avail = result . elem_count - total;
+ if ( avail < 256 ) {
+ rc = KDataBufferResize
+ (&result, result.elem_count + 4096);
+ if ( rc != 0 )
+ break;
+ }
+
+ base = result . base;
+ rc = KStreamRead(response, &base[total],
+ result.elem_count - total, &num_read);
+ if ( rc != 0 ) {
+ if ( num_read > 0 )
+ rc = 0;
+ else
+ break;
+ }
+
+ if ( num_read == 0 )
+ break;
+
+ total += num_read;
+ }
+
+ KStreamRelease ( response );
+ }
+ }
+
+ KHttpResultRelease ( rslt );
+ }
+ }
+ if (rc == 0) {
+ const char *start = (const void*)(result.base);
+ size_t size = KDataBufferBytes(&result);
+ if (*(start + size) != '\0')
+ rc = RC(rcExe, rcString, rcParsing, rcString, rcUnexpected);
+ if (strstr(start, "200|ok") == NULL)
+ rc = RC(rcExe, rcString, rcParsing, rcParam, rcIncorrect);
+ }
+ KDataBufferWhack(&result);
+ RELEASE(KHttpRequest, req);
+ free(url);
+ if (rc == 0)
+ OUTMSG(("NCBI access: ok\n"));
+ else
+ OUTMSG(("ERROR: cannot access NCBI Website\n"));
+ return rc;
+}
+
+static rc_t MainCallCgi(const Main *self,
+ const KConfigNode *node, const char *acc)
+{
+ rc_t rc = 0;
+ int i = 0, retryOnFailure = 2;
+ for (i = 0; i < retryOnFailure; ++i) {
+ rc = MainCallCgiImpl(self, node, acc);
+ if (rc == 0) {
+ break;
+ }
+ DBGMSG(DBG_KNS, DBG_FLAG(DBG_KNS_ERR), (
+ "@@@@@@@@2: MainCallCgi %d/%d = %R\n", i + 1, retryOnFailure, rc));
+ }
+ return rc;
+}
+
+#define rcResolver rcTree
+static rc_t MainQuickResolveQuery(const Main *self, const char *acc) {
+ rc_t rc = 0;
+ VPath *query = NULL;
+ const VPath *remote = NULL;
+ const VPath *cache = NULL;
+ assert(self && acc);
+ rc = VFSManagerMakePath(self->vMgr, &query, "%s", acc);
+ if (rc == 0) {
+ if (!self->allowCaching) {
+ VResolverCacheEnable(self->resolver, self->cacheState);
+ }
+ rc = VResolverQuery(self->resolver, 0, query,
+ NULL, &remote, &cache);
+ if (!self->allowCaching) {
+ VResolverCacheEnable(self->resolver, vrAlwaysDisable);
+ }
+ }
+ if (rc == 0) {
+ if (remote != NULL) {
+ OUTMSG(("remote location: ok\n"));
+ }
+ else {
+ OUTMSG(("ERROR: cannot resolve remote location\n"));
+ rc = RC(rcExe, rcResolver, rcResolving, rcPath, rcNotFound);
+ }
+ if (cache != NULL) {
+ OUTMSG(("cache location: ok\n"));
+ }
+ else {
+ OUTMSG(("ERROR: cannot resolve cache location\n"));
+ rc = RC(rcExe, rcResolver, rcResolving, rcPath, rcNotFound);
+ }
+ }
+ else {
+ OUTMSG(("ERROR: cannot resolve public accession\n"));
+ }
+ RELEASE(VPath, cache);
+ RELEASE(VPath, remote);
+ RELEASE(VPath, query);
+ return rc;
+}
+
+static rc_t MainQuickCheck(const Main *self) {
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+ const char acc[] = "SRR000001";
+ const char path[] = "/repository/remote/protected/CGI/resolver-cgi";
+ const KConfigNode *node = NULL;
+ assert(self);
+ rc = KConfigOpenNodeRead(self->cfg, &node, "%s", path);
+ if (rc == 0) {
+ OUTMSG(("configuration: found\n"));
+ }
+ else {
+ OUTMSG(("ERROR: configuration not found or incomplete\n"));
+ }
+ if (rc == 0) {
+ rc_t rc3 = MainCallCgi(self, node, acc);
+ if (rc3 != 0 && rc2 == 0) {
+ rc2 = rc3;
+ }
+
+ rc3 = MainQuickResolveQuery(self, acc);
+ if (rc3 != 0 && rc2 == 0) {
+ rc2 = rc3;
+ }
+ }
+ RELEASE(KConfigNode, node);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ return rc;
+}
+
+static rc_t MainPrintConfig(const Main *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ if (rc == 0) {
+ rc = KConfigPrint(self->cfg, 0);
+ if (rc != 0) {
+ OUTMSG(("KConfigPrint() = %R", rc));
+ }
+ OUTMSG(("\n"));
+ }
+
+ return rc;
+}
+
+static
+rc_t _KDBPathTypePrint(const char *head, KPathType type, const char *tail)
+{
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+ assert(head && tail);
+ {
+ rc_t rc2 = OUTMSG(("%s", head));
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ switch (type) {
+ case kptNotFound:
+ rc2 = OUTMSG(("NotFound"));
+ break;
+ case kptBadPath:
+ rc2 = OUTMSG(("BadPath"));
+ break;
+ case kptFile:
+ rc2 = OUTMSG(("File"));
+ break;
+ case kptDir:
+ rc2 = OUTMSG(("Dir"));
+ break;
+ case kptCharDev:
+ rc2 = OUTMSG(("CharDev"));
+ break;
+ case kptBlockDev:
+ rc2 = OUTMSG(("BlockDev"));
+ break;
+ case kptFIFO:
+ rc2 = OUTMSG(("FIFO"));
+ break;
+ case kptZombieFile:
+ rc2 = OUTMSG(("ZombieFile"));
+ break;
+ case kptDataset:
+ rc2 = OUTMSG(("Dataset"));
+ break;
+ case kptDatatype:
+ rc2 = OUTMSG(("Datatype"));
+ break;
+ case kptDatabase:
+ rc2 = OUTMSG(("Database"));
+ break;
+ case kptTable:
+ rc2 = OUTMSG(("Table"));
+ break;
+ case kptIndex:
+ rc2 = OUTMSG(("Index"));
+ break;
+ case kptColumn:
+ rc2 = OUTMSG(("Column"));
+ break;
+ case kptMetadata:
+ rc2 = OUTMSG(("Metadata"));
+ break;
+ case kptPrereleaseTbl:
+ rc2 = OUTMSG(("PrereleaseTbl"));
+ break;
+ default:
+ rc2 = OUTMSG(("unexpectedFileType(%d)", type));
+ assert(0);
+ break;
+ }
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ {
+ rc_t rc2 = OUTMSG(("%s", tail));
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
+
+static bool isprintString(const unsigned char *s) {
+ assert(s);
+
+ while (*s) {
+ int c = *(s++);
+ if (!isprint(c)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static rc_t printString(const char *s) {
+ rc_t rc = 0;
+
+ const unsigned char *u = (unsigned char*)s;
+
+ assert(u);
+
+ if (isprintString(u)) {
+ return OUTMSG(("%s", u));
+ }
+
+ while (*u) {
+ rc_t rc2 = 0;
+ int c = *(u++);
+ if (isprint(c)) {
+ rc2 = OUTMSG(("%c", c));
+ }
+ else {
+ rc2 = OUTMSG(("\\%03o", c));
+ }
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ return rc;
+}
+
+static rc_t _KDirectoryReport(const KDirectory *self,
+ const char *name, int64_t *size, KPathType *type, bool *alias)
+{
+ rc_t rc = 0;
+ const KFile *f = NULL;
+
+ bool dummyB = false;
+ int64_t dummy = 0;
+
+ KPathType dummyT = kptNotFound;;
+ if (type == NULL) {
+ type = &dummyT;
+ }
+
+ if (alias == NULL) {
+ alias = &dummyB;
+ }
+ if (size == NULL) {
+ size = &dummy;
+ }
+
+ *type = KDirectoryPathType(self, "%s", name);
+
+ if (*type & kptAlias) {
+ OUTMSG(("alias|"));
+ *type &= ~kptAlias;
+ *alias = true;
+ }
+
+ rc = _KDBPathTypePrint("", *type, " ");
+
+ if (*type == kptFile) {
+ rc = KDirectoryOpenFileRead(self, &f, "%s", name);
+ if (rc != 0) {
+ OUTMSG(("KDirectoryOpenFileRead("));
+ printString(name);
+ OUTMSG((")=%R ", rc));
+ }
+ else {
+ uint64_t sz = 0;
+ rc = KFileSize(f, &sz);
+ if (rc != 0) {
+ OUTMSG(("KFileSize(%s)=%R ", name, rc));
+ }
+ else {
+ OUTMSG(("%,lu ", sz));
+ *size = sz;
+ }
+ }
+ }
+ else {
+ OUTMSG(("- "));
+ }
+
+ RELEASE(KFile, f);
+
+ return rc;
+}
+
+static rc_t _VDBManagerReport(const VDBManager *self,
+ const char *name, KPathType *type)
+{
+ KPathType dummy = kptNotFound;;
+
+ if (type == NULL) {
+ type = &dummy;
+ }
+
+ *type = VDBManagerPathType(self, "%s", name);
+
+ *type &= ~kptAlias;
+
+ return _KDBPathTypePrint("", *type, " ");
+}
+
+static rc_t _VDBManagerReportRemote
+ (const VDBManager *self, const char *name, const VSchema *schema)
+{
+ bool notFound = false;
+ const VDatabase *db = NULL;
+ const VTable *tbl = NULL;
+ rc_t rc = VDBManagerOpenDBRead(self, &db, schema, name);
+ if (rc == 0) {
+ RELEASE(VDatabase, db);
+ return _KDBPathTypePrint("", kptDatabase, " ");
+ }
+ else if (GetRCState(rc) == rcNotFound) {
+ notFound = true;
+ }
+ rc = VDBManagerOpenTableRead(self, &tbl, schema, name);
+ if (rc == 0) {
+ RELEASE(VTable, tbl);
+ return _KDBPathTypePrint("", kptTable, " ");
+ }
+ else if (GetRCState(rc) == rcNotFound) {
+ notFound = true;
+ }
+ if (notFound) {
+ return OUTMSG(("NotFound "));
+ }
+ else {
+ return OUTMSG(("Unknown "));
+ }
+}
+
+static
+rc_t _KDirectoryFileHeaderReport(const KDirectory *self, const char *path)
+{
+ rc_t rc = 0;
+ char hdr[8] = "";
+ const KFile *f = NULL;
+ size_t num_read = 0;
+ size_t i = 0;
+
+ assert(self && path);
+
+ rc = KDirectoryOpenFileRead(self, &f, "%s", path);
+ if (rc != 0) {
+ OUTMSG(("KDirectoryOpenFileRead(%s) = %R\n", path, rc));
+ return rc;
+ }
+
+ rc = KFileReadAll(f, 0, hdr, sizeof hdr, &num_read);
+ if (rc != 0) {
+ OUTMSG(("KFileReadAll(%s, 8) = %R\n", path, rc));
+ }
+
+ for (i = 0; i < num_read && rc == 0; ++i) {
+ if (isprint(hdr[i])) {
+ OUTMSG(("%c", hdr[i]));
+ }
+ else {
+ OUTMSG(("\\X%02X", hdr[i]));
+ }
+ }
+ OUTMSG((" "));
+
+ RELEASE(KFile, f);
+ return rc;
+}
+
+static rc_t MainReport(const Main *self,
+ const char *name, int64_t *size, KPathType *type, bool *alias)
+{
+ rc_t rc = 0;
+
+ assert(self);
+
+ rc = _KDirectoryReport(self->dir, name, size, type, alias);
+
+ if (!self->noVDBManagerPathType) {
+ _VDBManagerReport(self->mgr, name, type);
+ }
+
+ if (type != NULL && *type == kptFile) {
+ _KDirectoryFileHeaderReport(self->dir, name);
+ }
+
+ return rc;
+}
+
+static rc_t MainReportRemote(const Main *self, const char *name, int64_t size) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ OUTMSG(("%,lu ", size));
+
+ if (!self->noVDBManagerPathType) {
+ _VDBManagerReportRemote(self->mgr, name, self->schema);
+ }
+
+ return rc;
+}
+
+static rc_t MainOpenAs(const Main *self, const char *name, bool isDb) {
+ rc_t rc = 0;
+ const VTable *tbl = NULL;
+ const VDatabase *db = NULL;
+
+ assert(self);
+
+ if (isDb) {
+ rc = VDBManagerOpenDBRead(self->mgr, &db, self->schema, "%s", name);
+ ReportResetDatabase(name, db);
+ OUTMSG(("VDBManagerOpenDBRead(%s) = ", name));
+ }
+ else {
+ rc = VDBManagerOpenTableRead(self->mgr, &tbl, self->schema, "%s", name);
+ ReportResetTable(name, tbl);
+ OUTMSG(("VDBManagerOpenTableRead(%s) = ", name));
+ }
+ if (rc == 0) {
+ OUTMSG(("OK\n"));
+ }
+ else {
+ OUTMSG(("%R\n", rc));
+ }
+ RELEASE(VDatabase, db);
+ RELEASE(VTable, tbl);
+ return rc;
+}
+
+#define rcResolver rcTree
+static bool NotFoundByResolver(rc_t rc) {
+ if (GetRCModule(rc) == rcVFS) {
+ if (GetRCTarget(rc) == rcResolver) {
+ if (GetRCContext(rc) == rcResolving) {
+ if (GetRCState(rc) == rcNotFound) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+typedef enum {
+ ePathLocal
+ , ePathRemote
+ , ePathCache
+} EPathType;
+static rc_t PrintContent(const KFile *f, uint64_t sz, size_t bytes)
+{
+ rc_t rc = 0;
+ size_t total = 0;
+ while (total < bytes) {
+ uint64_t pos = total;
+ unsigned char buffer[1024];
+ size_t num_read = 0;
+ rc = KFileRead(f, pos, buffer, sizeof buffer, &num_read);
+ if (rc == 0) {
+ size_t i = 0;
+ if (total == 0) {
+ OUTMSG(("\n", 0));
+ }
+ for (i = 0; i < num_read && total < bytes; ++i, ++total) {
+ if ((total % 16) == 0) {
+ OUTMSG(("%04X:", total));
+ }
+ OUTMSG((" %02X", buffer[i]));
+ if ((total % 16) == 7) {
+ OUTMSG((" |"));
+ }
+ if ((total % 16) == 15) {
+ OUTMSG(("\n"));
+ }
+ }
+ } else {
+ break;
+ }
+ }
+ return rc;
+}
+static rc_t MainPathReport(const Main *self, rc_t rc, const VPath *path,
+ EPathType type, const char *name, const VPath* remote, int64_t *size,
+ bool fasp, const KFile *fRemote)
+{
+ const char *eol = "\n";
+ const char *bol = "";
+
+ assert(self);
+
+ if (self->xml) {
+ eol = "<br/>\n";
+ bol = " ";
+ }
+
+ switch (type) {
+ case ePathLocal:
+ OUTMSG(("%sLocal:\t\t ", bol));
+ break;
+ case ePathRemote:
+ OUTMSG(("%sRemote %s:\t ", bol, fasp ? "FaspHttp" : "HttpFasp"));
+ break;
+ case ePathCache:
+ OUTMSG(("%sCache %s:\t ", bol, fasp ? "FaspHttp" : "HttpFasp"));
+ if (remote == NULL) {
+ OUTMSG(("skipped%s", eol));
+ return rc;
+ }
+ break;
+ }
+ if (rc != 0) {
+ if (NotFoundByResolver(rc)) {
+ OUTMSG(("not found%s", eol));
+ rc = 0;
+ }
+ else {
+ switch (type) {
+ case ePathLocal:
+ OUTMSG(("VResolverLocal(%s) = %R%s", name, rc, eol));
+ break;
+ case ePathRemote:
+ OUTMSG(("VResolverRemote(%s) = %R%s", name, rc, eol));
+ break;
+ case ePathCache:
+ OUTMSG(("VResolverCache(%s) = %R%s", name, rc, eol));
+ break;
+ }
+ }
+ }
+ else {
+ const char ncbiFile[] = "ncbi-file:";
+ size_t sz = sizeof ncbiFile - 1;
+ const String *s = NULL;
+ char buffer[PATH_MAX] = "";
+ const char *fPath = buffer;
+ rc_t rc = VPathMakeString(path, &s);
+ if (rc != 0 || s == NULL || s->addr == NULL ||
+ string_cmp(s->addr, sz, ncbiFile, sz, (uint32_t)sz) == 0)
+ {
+ rc = VPathReadPath(path, buffer, sizeof buffer, NULL);
+ }
+ else {
+ fPath = s->addr;
+ }
+ if (rc == 0) {
+ OUTMSG(("%s ", fPath));
+ switch (type) {
+ case ePathLocal:
+ case ePathCache:
+ rc = MainReport(self, fPath, size, NULL, NULL);
+ break;
+ case ePathRemote: {
+ uint64_t sz = 0;
+ if (!fasp && fRemote != NULL) {
+ rc = KFileSize(fRemote, &sz);
+ if (rc != 0) {
+ OUTMSG(("KFileSize(%s)=%R ", name, rc));
+ }
+ else {
+ MainReportRemote(self, fPath, sz);
+ *size = sz;
+ if (MainHasTest(self, ePrintFile)) {
+ if (self->xml) {
+ OUTMSG(("\n<bytes>"));
+ }
+ PrintContent(fRemote, sz, self->bytes);
+ if (self->xml) {
+ OUTMSG(("</bytes>"));
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ OUTMSG(("%s", eol));
+ }
+ else {
+ const char *s = "";
+ switch (type) {
+ case ePathLocal:
+ s = "Local";
+ break;
+ case ePathCache:
+ s = "Cache";
+ break;
+ case ePathRemote:
+ s = "Remote";
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ OUTMSG(("VPathMakeUri(VResolver%s(%s)) = %R%s", s, name, rc, eol));
+ }
+ if (type == ePathCache) {
+ char cachecache[PATH_MAX] = "";
+ if (rc == 0) {
+ rc = string_printf(cachecache,
+ sizeof cachecache, NULL, "%s.cache", fPath);
+ if (rc != 0) {
+ OUTMSG(("string_printf(%s) = %R%s", fPath, rc, eol));
+ }
+ }
+
+ if (rc == 0) {
+ OUTMSG((
+ "%sCache.cache %s: ", bol, fasp ? "FaspHttp" : "HttpFasp"));
+ OUTMSG(("%s ", cachecache));
+ rc = MainReport(self, cachecache, NULL, NULL, NULL);
+ OUTMSG(("%s", eol));
+ }
+ }
+ free((void*)s);
+ }
+ return rc;
+}
+
+static rc_t MainResolveLocal(const Main *self, const VResolver *resolver,
+ const char *name, const VPath *acc, int64_t *size)
+{
+ rc_t rc = 0;
+
+ const VPath* local = NULL;
+
+ assert(self);
+
+ if (resolver == NULL) {
+ resolver = self->resolver;
+ }
+
+ rc = VResolverLocal(resolver, acc, &local);
+ rc = MainPathReport(self,
+ rc, local, ePathLocal, name, NULL, NULL, false, NULL);
+
+ RELEASE(VPath, local);
+
+ return rc;
+}
+
+static rc_t MainResolveRemote(const Main *self, VResolver *resolver,
+ const char *name, const VPath* acc, const VPath **remote, int64_t *size,
+ bool fasp)
+{
+ rc_t rc = 0;
+
+ const KFile* f = NULL;
+
+ assert(self && size && remote);
+
+ if (resolver == NULL) {
+ resolver = self->resolver;
+ }
+
+ rc = VResolverRemote(resolver,
+ fasp ? eProtocolFaspHttpHttps : 0, acc, remote);
+
+ if (rc == 0) {
+ rc_t rc = 0;
+ String str;
+ memset(&str, 0, sizeof str);
+ rc = VPathGetScheme(*remote, &str);
+ if (rc != 0) {
+ OUTMSG(("VPathGetScheme(%S) = %R\n", *remote, rc));
+ }
+ else {
+ String fasp;
+ CONST_STRING(&fasp, "fasp");
+ if (StringCompare(&str, &fasp) != 0) {
+ char path_str[8192];
+ rc = VPathReadUri(*remote, path_str, sizeof path_str, NULL);
+ if (rc != 0) {
+ OUTMSG(("VPathReadUri(%S) = %R\n", *remote, rc));
+ }
+ else {
+ rc = KNSManagerMakeHttpFile
+ (self->knsMgr, &f, NULL, HTTP_VERSION, path_str);
+ }
+ }
+ }
+ }
+
+ rc = MainPathReport(self,
+ rc, *remote, ePathRemote, name, NULL, size, fasp, f);
+ RELEASE(KFile, f);
+
+ return rc;
+}
+
+static rc_t MainResolveCache(const Main *self, const VResolver *resolver,
+ const char *name, const VPath* remote, bool fasp)
+{
+ rc_t rc = 0;
+ const VPath* cache = NULL;
+
+ assert(self);
+
+ if (remote == NULL) {
+ rc = MainPathReport(self,
+ rc, cache, ePathCache, name, remote, NULL, fasp, NULL);
+ }
+ else {
+ if (resolver == NULL) {
+ resolver = self->resolver;
+ }
+
+ if (!self->allowCaching) {
+ VResolverCacheEnable(resolver, self->cacheState);
+ }
+ rc = VResolverQuery(resolver, fasp ? eProtocolFasp : 0,
+ remote, NULL, NULL, &cache);
+ rc = MainPathReport(self,
+ rc, cache, ePathCache, name, remote, NULL, fasp, NULL);
+
+ RELEASE(VPath, cache);
+ if (!self->allowCaching) {
+ VResolverCacheEnable(resolver, vrAlwaysDisable);
+ }
+ }
+
+ return rc;
+}
+
+typedef enum {
+ eQueryAll
+ , eQueryLocal
+ , eQueryRemote
+} EQueryType ;
+static rc_t VResolverQueryByType(const Main *self, const VResolver *resolver,
+ const char *name, const VPath *query,
+ bool fasp, VRemoteProtocols protocols, EQueryType type)
+{
+ const char *eol = "\n";
+ const char *bol = "";
+
+ rc_t rc = 0;
+
+ const VPath *local = NULL;
+ const VPath *remote = NULL;
+ const VPath *cache = NULL;
+ const VPath **pLocal = NULL;
+ const VPath **pRemote = NULL;
+ const VPath **pCache = NULL;
+
+ uint32_t i;
+ VRemoteProtocols protos;
+ const char * proto [ eProtocolMaxPref ];
+
+ assert(self);
+
+ if (self->xml) {
+ eol = "<br/>\n";
+ bol = " ";
+ }
+
+ switch (type) {
+ case eQueryLocal:
+ case eQueryAll:
+ pLocal = &local;
+ default:
+ break;
+ }
+
+ switch (type) {
+ case eQueryRemote:
+ case eQueryAll:
+ pRemote = &remote;
+ pCache = &cache;
+ default:
+ break;
+ }
+
+ if (pCache != NULL && !self->allowCaching) {
+ VResolverCacheEnable(resolver, vrAlwaysEnable);
+ }
+
+ proto [ 0 ] = NULL;
+ proto [ 1 ] = proto [ 2 ] = "";
+
+ for ( i = 0, protos = protocols; i < sizeof proto / sizeof proto [ 0 ] && protos != 0; protos >>= 3 )
+ {
+ switch ( protos & eProtocolMask )
+ {
+ case eProtocolHttp:
+ proto [ i ++ ] = "Http";
+ break;
+ case eProtocolFasp:
+ proto [ i ++ ] = "Fasp";
+ break;
+ case eProtocolHttps:
+ proto [ i ++ ] = "Https";
+ break;
+ }
+ }
+
+ rc = VResolverQuery(resolver, protocols, query, pLocal, pRemote, pCache);
+ OUTMSG(("%sVResolverQuery(%s, %s%s%s, local%s, remote%s, cache%s)= %R%s"
+ , bol
+ , name
+ , proto [ 0 ]
+ , proto [ 1 ]
+ , proto [ 2 ]
+ , pLocal == NULL ? "=NULL" : ""
+ , pRemote == NULL ? "=NULL" : ""
+ , pCache == NULL ? "=NULL" : ""
+ , rc
+ , eol
+ ));
+ if (rc == 0) {
+ if (local != NULL) {
+/* rc2 =*/ MainPathReport(self,
+ rc, local, ePathLocal, name, NULL, NULL, false, NULL);
+ }
+ if (remote != NULL) {
+/* rc2 =*/ MainPathReport(self,
+ rc, remote, ePathRemote, name, NULL, NULL, fasp, NULL);
+ }
+ if (cache != NULL) {
+ MainPathReport(self,
+ rc, cache, ePathCache, name, remote, NULL, fasp, NULL);
+ }
+ }
+
+ OUTMSG(("\n"));
+
+ RELEASE(VPath, local);
+ RELEASE(VPath, remote);
+ RELEASE(VPath, cache);
+
+ if (pCache != NULL && !self->allowCaching) {
+ VResolverCacheEnable(resolver, self->cacheState);
+ }
+
+ return rc;
+}
+
+static rc_t MainResolveQuery(const Main *self, const VResolver *resolver,
+ const char *name, const VPath *query, bool fasp)
+{
+ const char root[] = "Timer";
+ rc_t rc = 0;
+ rc_t rc2 = 0;
+ KTimeMs_t time = 0;
+ KTimeMs_t start_time = 0;
+
+ VRemoteProtocols protocols = 0;
+ if (fasp) {
+ protocols = eProtocolFaspHttpHttps;
+ }
+
+ if (resolver == NULL) {
+ resolver = self->resolver;
+ }
+
+ rc2 = VResolverQueryByType(self, resolver, name, query, fasp, protocols,
+ eQueryAll);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ else {
+ OUTMSG(("time started...\n"));
+ }
+ start_time = KTimeMsStamp();
+
+ rc2 = VResolverQueryByType(self, resolver, name, query, fasp, protocols,
+ eQueryLocal);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ rc2 = VResolverQueryByType(self, resolver, name, query, fasp, protocols,
+ eQueryRemote);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+/* TODO check vdbcache */
+
+ time = KTimeMsStamp() - start_time;
+ if (self->xml) {
+ OUTMSG((" <Time time=\"%d ms\"/>\n", time));
+ OUTMSG((" </%s>\n", root));
+ }
+ else {
+ OUTMSG(("...elapsed time=\"%d ms\"\n\n", time));
+ }
+
+ return rc;
+}
+
+static rc_t _KartItemToVPath(const KartItem *self,
+ const VFSManager *vfs, VPath **path)
+{
+ uint64_t oid = 0;
+ rc_t rc = KartItemItemIdNumber(self, &oid);
+ if (rc == 0) {
+ rc = VFSManagerMakeOidPath(vfs, path, (uint32_t)oid);
+ }
+ else {
+ char path_str[PATH_MAX] = "";
+ const String *accession = NULL;
+ rc = KartItemAccession(self, &accession);
+ if (rc == 0) {
+ rc =
+ string_printf(path_str, sizeof path_str, NULL, "%S", accession);
+ }
+ if (rc == 0) {
+ rc = VFSManagerMakePath(vfs, path, path_str);
+ }
+ }
+ return rc;
+}
+
+static rc_t perform_read_test(void) { return 0; }
+
+static rc_t MainResolve(const Main *self, const KartItem *item,
+ const char *name, int64_t *localSz, int64_t *remoteSz, bool refseqCtx)
+{
+ const char root[] = "Resolve";
+ rc_t rc = 0;
+
+ VPath* acc = NULL;
+ VResolver* resolver = NULL;
+
+ assert(self);
+
+ if (self->xml) {
+ OUTMSG(("<%s>\n", root));
+ }
+
+ if (rc == 0) {
+ if (item == NULL) {
+ if (refseqCtx) {
+ rc = VFSManagerMakePath(self->vMgr, &acc,
+ "ncbi-acc:%s?vdb-ctx=refseq", name);
+ }
+ else {
+ rc = VFSManagerMakePath(self->vMgr, &acc, "%s", name);
+ }
+ if (rc != 0) {
+ OUTMSG(("VFSManagerMakePath(%s) = %R\n", name, rc));
+ }
+ }
+ else {
+ const KRepository *p_protected = NULL;
+ uint64_t project = 0;
+ if (rc == 0) {
+ rc = KartItemProjIdNumber(item, &project);
+ if (rc != 0) {
+ OUTMSG(("KartItemProjectIdNumber = %R\n", rc));
+ }
+ }
+ if (rc == 0) {
+ rc = _KartItemToVPath(item, self->vMgr, &acc);
+ if (rc != 0) {
+ OUTMSG(("Invalid kart file row: %R\n", rc));
+ }
+ }
+ if (rc == 0) {
+ rc = KRepositoryMgrGetProtectedRepository(self->repoMgr,
+ (uint32_t)project, &p_protected);
+ if (rc != 0) {
+ OUTMSG((
+ "KRepositoryMgrGetProtectedRepository(%d) = %R\n",
+ project, rc));
+ }
+ }
+ if (rc == 0) {
+ rc = KRepositoryMakeResolver(p_protected, &resolver,
+ self->cfg);
+ if (rc != 0) {
+ OUTMSG((
+ "KRepositoryMakeResolver(%d) = %R\n", project, rc));
+ }
+ }
+ RELEASE(KRepository, p_protected);
+ }
+ }
+
+ if (rc == 0) {
+ const String *id = NULL;
+ const char root[] = "Query";
+ rc_t rc2 = 0;
+
+ const VPath* remote = NULL;
+
+ const char *attr = name;
+ if (attr == NULL) {
+ rc2 = KartItemItemId(item, &id);
+ if (rc2 != 0) {
+ OUTMSG(("KartItemItemId = %R\n", rc2));
+ rc2 = 0;
+ attr = "Accession";
+ }
+ }
+
+ if (self->xml) {
+ if (attr != NULL) {
+ OUTMSG((" <%s name=\"%s\">\n", root, attr));
+ }
+ else {
+ OUTMSG((" <%s name=\"%S\">\n", root, id));
+ }
+ }
+
+ rc = VDBManagerSetResolver(self->mgr, resolver);
+
+ rc2 = MainResolveLocal(self, resolver, name, acc, localSz);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ rc2 = MainResolveRemote(self, resolver, name, acc, &remote, remoteSz,
+ false);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ rc2 = MainResolveCache(self, resolver, name, remote, false);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ RELEASE(VPath, remote);
+
+ rc2 = MainResolveRemote(self, resolver, name, acc, &remote, remoteSz,
+ true);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ rc2 = MainResolveCache(self, resolver, name, remote, true);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ OUTMSG(("\n"));
+
+ rc2 = MainResolveQuery(self, resolver, name, acc, false);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ rc2 = MainResolveQuery(self, resolver, name, acc, true);
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+
+ RELEASE(VPath, remote);
+
+ if (MainHasTest(self, eNetwork)) {
+ perform_read_test();
+ }
+
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ }
+
+ RELEASE(VPath, acc);
+ RELEASE(VResolver, resolver);
+
+ if (self->xml) {
+ OUTMSG(("</%s>\n", root));
+ }
+
+ return rc;
+}
+
+static
+rc_t MainDepend(const Main *self, const char *name, bool missing)
+{
+ const char root[] = "Dependencies";
+ const char *eol = "\n";
+ rc_t rc = 0;
+
+ const VDatabase *db = NULL;
+ const VDBDependencies* dep = NULL;
+ uint32_t count = 0;
+
+ assert(self);
+ eol = self->xml ? "<br/>\n" : "\n";
+
+ if (self->xml) {
+ OUTMSG(("<%s>\n", root));
+ }
+
+ if (rc == 0) {
+ rc = VDBManagerOpenDBRead(self->mgr, &db, self->schema, "%s", name);
+ if (rc != 0) {
+ if (rc == SILENT_RC(rcVFS,rcMgr,rcOpening,rcDirectory,rcNotFound)) {
+ return 0;
+ }
+ OUTMSG(("VDBManagerOpenDBRead(%s) = %R\n", name, rc));
+ }
+ }
+
+ if (rc == 0) {
+ if (!self->allowCaching) {
+ VResolverCacheEnable(self->resolver, self->cacheState);
+ }
+ rc = VDatabaseListDependenciesWithCaching(db,
+ &dep, missing, !self->allowCaching);
+ if (rc != 0) {
+ OUTMSG(("VDatabaseListDependencies(%s, %s) = %R%s",
+ name, missing ? "missing" : "all", rc, eol));
+ }
+ if (!self->allowCaching) {
+ VResolverCacheEnable(self->resolver, vrAlwaysDisable);
+ }
+ }
+
+ if (rc == 0) {
+ rc = VDBDependenciesCount(dep, &count);
+ if (rc != 0) {
+ OUTMSG(("VDBDependenciesCount(%s, %s) = %R\n",
+ name, missing ? "missing" : "all", rc));
+ }
+ else {
+ OUTMSG(("VDBDependenciesCount(%s)=%d\n",
+ missing ? "missing" : "all", count));
+ }
+ }
+
+ if (rc == 0) {
+ uint32_t i = 0;
+ rc_t rc2 = 0;
+ for (i = 0; i < count; ++i) {
+ const char root[] = "Dependency";
+ bool b = true;
+ const char *s = NULL;
+ const char *seqId = NULL;
+ KPathType type = kptNotFound;
+
+ if (self->xml) {
+ OUTMSG(("<%s>\n", root));
+ }
+
+ OUTMSG((" %6d\t", i + 1));
+
+ rc2 = VDBDependenciesSeqId(dep, &seqId, i);
+ if (rc2 == 0) {
+ OUTMSG(("seqId=%s,", seqId));
+ }
+ else {
+ OUTMSG(("VDBDependenciesSeqId(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesName(dep, &s, i);
+ if (rc2 == 0) {
+ OUTMSG(("name=%s,", s));
+ }
+ else {
+ OUTMSG(("VDBDependenciesName(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesCircular(dep, &b, i);
+ if (rc2 == 0) {
+ OUTMSG(("circular=%s,", b ? "true" : "false"));
+ }
+ else {
+ OUTMSG(("VDBDependenciesCircular(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesType(dep, &type, i);
+ if (rc2 == 0) {
+ rc2 = _KDBPathTypePrint("type=", type, ",");
+ if (rc2 != 0 && rc == 0) {
+ rc = rc2;
+ }
+ }
+ else {
+ OUTMSG(("VDBDependenciesType(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesLocal(dep, &b, i);
+ if (rc2 == 0) {
+ OUTMSG(("local=%s,", b ? "local" : "remote"));
+ }
+ else {
+ OUTMSG(("VDBDependenciesLocal(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesPath(dep, &s, i);
+ if (rc2 == 0) {
+ OUTMSG(("%s\tpathLocal=%s,", eol, s == NULL ? "notFound" : s));
+ }
+ else {
+ OUTMSG(("VDBDependenciesPath(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesPathRemote(dep, &s, i);
+ if (rc2 == 0) {
+ if (s == NULL) {
+ OUTMSG(("%s\tpathRemote: notFound ", eol));
+ }
+ else {
+ OUTMSG(("%s\tpathRemote: %s ", eol, s));
+ if (!self->noRfs) {
+ const KFile *f = NULL;
+ rc2 = KNSManagerMakeHttpFile
+ ( self->knsMgr, & f, NULL, HTTP_VERSION, s );
+ if (rc2 != 0) {
+ OUTMSG(("KNSManagerMakeHttpFile=%R", rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ if (rc2 == 0) {
+ uint64_t sz = 0;
+ rc2 = KFileSize(f, &sz);
+ if (rc2 != 0) {
+ OUTMSG(("KFileSize=%R", rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ else {
+ OUTMSG(("%,lu", sz));
+ }
+ }
+ RELEASE(KFile, f);
+ }
+ }
+ }
+ else {
+ OUTMSG(("VDBDependenciesPathRemote(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+
+ rc2 = VDBDependenciesPathCache(dep, &s, i);
+ if (rc2 == 0) {
+ OUTMSG(("%s\tpathCache: %s ", eol, s == NULL ? "notFound" : s));
+ if (s != NULL) {
+ char cachecache[PATH_MAX] = "";
+ rc2 = MainReport(self, s, NULL, NULL, NULL);
+ OUTMSG(("%s", eol));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ if (rc2 == 0) {
+ rc2 = string_printf(cachecache,
+ sizeof cachecache, NULL, "%s.cache", s);
+ if (rc2 != 0) {
+ if (rc == 0) {
+ rc = rc2;
+ }
+ OUTMSG(("string_printf(%s) = %R%s", s, rc2, eol));
+ }
+ }
+ if (rc == 0) {
+ OUTMSG(("\tpathCache.cache: "));
+ OUTMSG(("%s ", cachecache));
+ rc = MainReport(self, cachecache, NULL, NULL, NULL);
+ }
+ }
+ }
+ else {
+ OUTMSG(("VDBDependenciesPathCache(%s, %s, %i)=%R ",
+ name, missing ? "missing" : "all", i, rc2));
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ if (MainHasTest(self, eResolve) && seqId != NULL) {
+ int64_t remoteSz = 0;
+ OUTMSG(("%s", eol));
+
+ /* ignore returned value :
+ resolver's errors are detected but not reported as test-sra's failure */
+ MainResolve(self, NULL, seqId, NULL, &remoteSz, true);
+ }
+
+ if (self->xml) {
+ OUTMSG(("</%s>\n", root));
+ }
+ else {
+ OUTMSG(("%s", eol));
+ }
+ }
+ }
+
+ RELEASE(VDBDependencies, dep);
+ RELEASE(VDatabase, db);
+
+ if (self->xml) {
+ OUTMSG(("</%s>\n", root));
+ }
+
+ return rc;
+}
+
+static rc_t MainPrintAscp(const Main *self) {
+ rc_t rc = 0;
+ bool status = false;
+ const char *b = self->xml ? " <Ascp>\n" : "";
+ const char *e = self->xml ? " </Ascp>\n" : "\n";
+ const char *ascp_bin = NULL;
+ const char *private_file = NULL;
+ AscpOptions opt;
+ memset(&opt, 0, sizeof opt);
+ assert(self);
+ if (MainHasTest(self, eAscpVerbose)) {
+ status = true;
+ }
+ OUTMSG(("%s", b));
+ rc = ascp_locate(&ascp_bin, &private_file, true, status);
+ if (rc != 0) {
+ OUTMSG(("ascp_locate = %R\n", rc));
+ }
+ if (rc == 0) {
+ const char *b = self->xml ? " <Ascp>" : "ascp : ";
+ const char *e = self->xml ? "</Ascp>\n" : "\n";
+ OUTMSG(("%s%s%s", b, ascp_bin == NULL ? "NotFound" : ascp_bin, e));
+ }
+ if (rc == 0) {
+ const char *b = self->xml ? " <KeyFile>" : "key file: ";
+ const char *e = self->xml ? "</KeyFile>\n" : "\n";
+ OUTMSG(("%s%s%s", b,
+ private_file == NULL ? "NotFound" : private_file, e));
+ }
+
+ rc = aspera_options(&opt);
+ if (rc != 0) {
+ OUTMSG(("%saspera_options = %R%s", b, rc, e));
+ }
+ if (rc == 0) {
+ const char *b = self->xml ? " <MaxRate>" : "max rate: ";
+ const char *e = self->xml ? "</MaxRate>\n" : "\n";
+ OUTMSG(("%s%s%s", b,
+ opt.target_rate == NULL ? "NotFound" : opt.target_rate, e));
+ }
+ if (rc == 0) {
+ const char *b = self->xml ? " <Disabled>" : "disabled: ";
+ const char *e = self->xml ? "</Disabled>\n" : "\n";
+ OUTMSG(("%s%s%s", b, opt.disabled ? "true" : "false", e));
+ }
+
+ if (ascp_bin != NULL) {
+ size_t num_writ = 0;
+ char command[PATH_MAX] = "";
+ const char *b = self->xml ? "<Version>\n" : "";
+ const char *e = self->xml ? "</Version>\n" : "";
+ OUTMSG(("%s", b));
+ rc = string_printf(command, sizeof command, &num_writ,
+ "\"%s\" -A", ascp_bin);
+ if (rc != 0 || num_writ >= sizeof command) {
+ OUTMSG(("cannot generate ascp command: %R\n", rc));
+ }
+ else {
+ int s = system(command);
+ if (s != 0) {
+ OUTMSG(("system(%s) = %d\n", command, s));
+ }
+ }
+ OUTMSG(("%s", e));
+ }
+
+ free((void*)ascp_bin);
+ free((void*)private_file);
+
+ OUTMSG(("%s", e));
+ return 0;
+}
+
+#if 0
+static rc_t PrintCurl(bool full, bool xml) {
+ const char *b = xml ? " <Curl>" : "";
+ const char *e = xml ? "</Curl>" : "";
+
+ KNSManager *mgr = NULL;
+
+ rc_t rc = KNSManagerMake(&mgr);
+ if (rc != 0) {
+ OUTMSG(("%sKNSManagerMake = %R%s\n", b, rc, e));
+ }
+ else {
+ rc_t rc = KNSManagerAvail(mgr);
+ OUTMSG(("%s", b));
+
+ if (full) {
+ OUTMSG(("KNSManagerAvail = %R. ", rc));
+ }
+
+ if (rc == 0) {
+ const char *version_string = NULL;
+ rc = KNSManagerCurlVersion(mgr, &version_string);
+ if (rc == 0) {
+ if (full) {
+ OUTMSG(("Curl Version = %s", version_string));
+ }
+ }
+ else {
+ OUTMSG(("KNSManagerCurlVersion = %R", rc));
+ }
+ }
+
+ if (rc == 0 && !full) {
+ OUTMSG(("libcurl: found"));
+ }
+ OUTMSG(("%s\n", e));
+ }
+
+ RELEASE(KNSManager, mgr);
+
+ return rc;
+}
+#endif
+
+#define kptKartITEM (kptAlias - 1)
+
+static rc_t _KartItemPrint(const KartItem *self, bool xml) {
+ const char root[] = "KartRow";
+ const String *elem = NULL;
+ if (xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ {
+ const char root[] = "ProjId";
+ rc_t rc = KartItemProjId(self, &elem);
+ if (rc != 0) {
+ OUTMSG(("KartItem%s = %R\n", root, rc));
+ }
+ else if (xml) {
+ OUTMSG((" <%s>%S</%s>\n", root, elem, root));
+ }
+ else {
+ OUTMSG(("%s: %S\n", root, elem));
+ }
+ }
+ {
+ const char root[] = "ItemId";
+ rc_t rc = KartItemItemId(self, &elem);
+ if (rc != 0) {
+ OUTMSG(("KartItem%s = %R\n", root, rc));
+ }
+ else if (xml) {
+ OUTMSG((" <%s>%S</%s>\n", root, elem, root));
+ }
+ else {
+ OUTMSG(("%s: %S\n", root, elem));
+ }
+ }
+ {
+ const char root[] = "Accession";
+ rc_t rc = KartItemAccession(self, &elem);
+ if (rc != 0) {
+ OUTMSG(("KartItem%s = %R\n", root, rc));
+ }
+ else if (xml) {
+ OUTMSG((" <%s>%S</%s>\n", root, elem, root));
+ }
+ else {
+ OUTMSG(("%s: %S\n", root, elem));
+ }
+ }
+ {
+ const char root[] = "Name";
+ rc_t rc = KartItemName(self, &elem);
+ if (rc != 0) {
+ OUTMSG(("KartItem%s = %R\n", root, rc));
+ }
+ else if (xml) {
+ OUTMSG((" <%s>%S</%s>\n", root, elem, root));
+ }
+ else {
+ OUTMSG(("%s: %S\n", root, elem));
+ }
+ }
+ {
+ const char root[] = "ItemDesc";
+ rc_t rc = KartItemItemDesc(self, &elem);
+ if (rc != 0) {
+ OUTMSG(("KartItem%s = %R\n", root, rc));
+ }
+ else if (xml) {
+ OUTMSG((" <%s>%S</%s>\n", root, elem, root));
+ }
+ else {
+ OUTMSG(("%s: %S\n", root, elem));
+ }
+ }
+ if (xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ return 0;
+}
+
+/*static rc_t _KartPrint(const Kart *self, bool xml) {
+ const char root[] = "Kart";
+ if (xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ rc_t rc = KartPrint(self);
+ if (rc != 0) {
+ OUTMSG(("KartPrint = %R\n", rc));
+ }
+ if (xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ return 0;
+}
+static rc_t _KartPrintSized(const Kart *self, bool xml) {
+ return 0;
+}
+*/
+
+static rc_t _KartPrintNumbered(const Kart *self, bool xml) {
+ const char root[] = "Kart";
+ if (xml) {
+ OUTMSG((" <%s numbered=\"true\">\n", root));
+ }
+ {
+ rc_t rc = KartPrintNumbered(self);
+ if (rc != 0) {
+ OUTMSG(("KartPrint = %R\n", rc));
+ }
+ }
+ if (xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ return 0;
+}
+
+
+static rc_t ipv4_endpoint_to_string(char *buffer, size_t buflen, KEndPoint *ep)
+{
+ uint32_t b[4];
+ b[0] = ( ep->u.ipv4.addr & 0xFF000000 ) >> 24;
+ b[1] = ( ep->u.ipv4.addr & 0xFF0000 ) >> 16;
+ b[2] = ( ep->u.ipv4.addr & 0xFF00 ) >> 8;
+ b[3] = ( ep->u.ipv4.addr & 0xFF );
+ return string_printf( buffer, buflen, NULL, "ipv4: %d.%d.%d.%d : %d",
+ b[0], b[1], b[2], b[3], ep->u.ipv4.port );
+}
+
+static rc_t ipv6_endpoint_to_string(char *buffer, size_t buflen, KEndPoint *ep)
+{
+ uint32_t b[8];
+ b[0] = ( ep->u.ipv6.addr[ 0 ] << 8 ) | ep->u.ipv6.addr[ 1 ];
+ b[1] = ( ep->u.ipv6.addr[ 2 ] << 8 ) | ep->u.ipv6.addr[ 3 ];
+ b[2] = ( ep->u.ipv6.addr[ 4 ] << 8 ) | ep->u.ipv6.addr[ 5 ];
+ b[3] = ( ep->u.ipv6.addr[ 6 ] << 8 ) | ep->u.ipv6.addr[ 7 ];
+ b[4] = ( ep->u.ipv6.addr[ 8 ] << 8 ) | ep->u.ipv6.addr[ 9 ];
+ b[5] = ( ep->u.ipv6.addr[ 10 ] << 8 ) | ep->u.ipv6.addr[ 11 ];
+ b[6] = ( ep->u.ipv6.addr[ 12 ] << 8 ) | ep->u.ipv6.addr[ 13 ];
+ b[7] = ( ep->u.ipv6.addr[ 14 ] << 8 ) | ep->u.ipv6.addr[ 15 ];
+ return string_printf( buffer, buflen, NULL,
+ "ipv6: %.04X:%.04X:%.04X:%.04X:%.04X:%.04X:%.04X:%.04X: :%d",
+ b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], ep->u.ipv6.port );
+}
+
+static rc_t ipc_endpoint_to_string(char *buffer, size_t buflen, KEndPoint *ep)
+{
+ return string_printf( buffer, buflen, NULL, "ipc: %s", ep->u.ipc_name );
+}
+
+static
+rc_t endpoint_to_string( char * buffer, size_t buflen, KEndPoint * ep )
+{
+ rc_t rc;
+ switch( ep->type )
+ {
+ case epIPV4 : rc = ipv4_endpoint_to_string( buffer, buflen, ep ); break;
+ case epIPV6 : rc = ipv6_endpoint_to_string( buffer, buflen, ep ); break;
+ case epIPC : rc = ipc_endpoint_to_string( buffer, buflen, ep ); break;
+ default : rc = string_printf( buffer, buflen, NULL,
+ "unknown endpoint-tyep %d", ep->type ); break;
+ }
+ return rc;
+}
+
+/* TODO: MAKE A DEEPER TEST; RESOLVE; PRINT HEADERS;
+ MAKE SURE UNDETECTED/UNACCESSIBLE URL IS REPORTED */
+static rc_t perform_dns_test(const Main *self, const char *eol, uint16_t port) {
+ rc_t rc = 0;
+
+ const char domain[] = "www.ncbi.nlm.nih.gov";
+ KEndPoint ep;
+ String s_domain;
+ KTimeMs_t time = 0;
+
+ KTimeMs_t start_time = KTimeMsStamp();
+
+ assert(self);
+
+ StringInitCString(&s_domain, domain);
+
+ rc = KNSManagerInitDNSEndpoint(self->knsMgr, &ep, &s_domain, port);
+ time = KTimeMsStamp() - start_time;
+
+ if (rc != 0)
+ OUTMSG
+ (("KNSManagerInitDNSEndpoint(%s, %d)=%R%s", domain, port, rc, eol));
+ else {
+ const char root[] = "DnsEndpoint";
+ char s_endpoint[1024] = "";
+ rc = endpoint_to_string(s_endpoint, sizeof s_endpoint, &ep);
+
+ if (self->xml)
+ OUTMSG((" <%s "
+ "domain=\"%s\" port=\"%d\" address=\"%s\" time=\"%d ms\"/>\n",
+ root, domain, port, s_endpoint, time));
+ else
+ OUTMSG((
+ "%s domain=\"%s\" port=\"%d\" address=\"%s\" time=\"%d ms\"\n",
+ root, domain, port, s_endpoint, time));
+ }
+
+ return rc;
+}
+
+static rc_t ClientRequestTest(const Main *self, const char *eol,
+ const char *url)
+{
+ rc_t rc = 0;
+
+ KClientHttpRequest *req = NULL;
+
+ KTimeMs_t time = 0;
+ KTimeMs_t start_time = KTimeMsStamp();
+
+ assert(self);
+
+ rc = KNSManagerMakeRequest(self->knsMgr, &req, HTTP_VERSION, NULL, url);
+
+ time = KTimeMsStamp() - start_time;
+
+ if (rc != 0)
+ OUTMSG(("KNSManagerMakeRequest(%s)=%R%s", url, rc, eol));
+ else {
+ const char root[] = "KNSManagerMakeRequest";
+ if (self->xml)
+ OUTMSG((" <%s url=\"%s\" time=\"%d ms\"/>\n", root, url, time));
+ else
+ OUTMSG(( "%s url=\"%s\" time=\"%d ms\"\n" , root, url, time));
+ }
+
+ RELEASE(KClientHttpRequest, req);
+
+ return rc;
+}
+
+static rc_t read_stream_into_databuffer(
+ KStream *stream, KDataBuffer *databuffer)
+{
+ rc_t rc;
+
+ size_t total = 0;
+ KDataBufferMakeBytes( databuffer, 4096 );
+ while ( 1 )
+ {
+ size_t num_read;
+ uint8_t * base;
+ uint64_t avail = databuffer->elem_count - total;
+ if ( avail < 256 )
+ {
+ rc = KDataBufferResize( databuffer, databuffer->elem_count + 4096 );
+ if ( rc != 0 )
+ {
+ LogErr( klogErr, rc, "CGI: KDataBufferResize failed" );
+ break;
+ }
+ }
+
+ base = databuffer->base;
+ rc = KStreamRead(stream, &base[total],
+ (size_t) databuffer->elem_count - total, &num_read);
+ if ( rc != 0 )
+ {
+ /* TBD - look more closely at rc */
+ if ( num_read > 0 )
+ {
+ LogErr( klogErr, rc, "CGI: KStreamRead failed" );
+ rc = 0;
+ }
+ else
+ break;
+ }
+
+ if ( num_read == 0 )
+ break;
+
+ total += num_read;
+ }
+
+ if ( rc == 0 )
+ databuffer->elem_count = total;
+ return rc;
+}
+
+static rc_t call_cgi(const Main *self, const char *cgi_url,
+ uint32_t ver_major, uint32_t ver_minor, const char *protocol,
+ const char *acc, KDataBuffer *databuffer, const char *eol)
+{
+ KClientHttpRequest * req = NULL;
+ char b [1024 ] = "";
+ rc_t rc = 0;
+ assert(self);
+ rc = KNSManagerMakeReliableClientRequest
+ (self->knsMgr, &req, HTTP_VERSION, NULL, cgi_url);
+ if (rc != 0) {
+ OUTMSG(
+ ("KNSManagerMakeReliableClientRequest(%s)=%R%s", cgi_url, rc, eol));
+ }
+ if (rc == 0) {
+ const char param[] = "acc";
+ rc = KHttpRequestAddPostParam( req, "%s=%s", param, acc);
+ if (rc != 0) {
+ OUTMSG(("KHttpRequestAddPostParam(%s)=%R%s", param, rc, eol));
+ }
+ }
+ if (rc == 0) {
+ const char param[] = "accept-proto";
+ rc = KHttpRequestAddPostParam( req, "%s=%s", param, protocol);
+ if (rc != 0) {
+ OUTMSG(("KHttpRequestAddPostParam(%s)=%R%s", param, rc, eol));
+ }
+ }
+ if (rc == 0) {
+ const char param[] = "version";
+ rc = KHttpRequestAddPostParam
+ (req, "%s=%u.%u", param, ver_major, ver_minor);
+ if (rc != 0) {
+ OUTMSG(("KHttpRequestAddPostParam(%s)=%R%s", param, rc, eol));
+ }
+ }
+ if (rc == 0) {
+ rc = KClientHttpRequestFormatMsg
+ ( req, b, sizeof b, "POST", NULL );
+ }
+ if (rc == 0) {
+ KHttpResult *rslt = NULL;
+ rc = KHttpRequestPOST(req, &rslt);
+ if (rc != 0) {
+ OUTMSG(("KHttpRequestPOST(%s)=%R%s", cgi_url, rc, eol));
+ }
+ else {
+ const char root[] = "StatusCode";
+ uint32_t code = 0;
+ rc = KHttpResultStatus(rslt, &code, NULL, 0, NULL);
+ if (rc != 0) {
+ OUTMSG(("KHttpResultStatus(%s)=%R%s", cgi_url, rc, eol));
+ }
+ else if (code != 200) {
+ if (self->xml) {
+ OUTMSG((" <%s>%d</%s>\n", root, code, root));
+ }
+ else {
+ OUTMSG(("%s=%d\n", root, code));
+ }
+ rc = RC(rcNS, rcFile, rcReading, rcFile, rcInvalid);
+ }
+ else {
+ KStream *response = NULL;
+ rc = KHttpResultGetInputStream(rslt, &response);
+ if (rc != 0) {
+ OUTMSG(("KHttpResultGetInputStream(%s)=%R%s",
+ cgi_url, rc, eol));
+ }
+ else {
+ rc = read_stream_into_databuffer(response, databuffer);
+ }
+ RELEASE(KStream, response);
+ }
+ }
+
+ RELEASE(KHttpResult, rslt);
+ }
+ RELEASE(KHttpRequest, req);
+ return rc;
+}
+
+static rc_t perform_cgi_test ( const Main * self,
+ const char * eol, const char * acc )
+{
+ rc_t rc = 0;
+ const char root[] = "Cgi";
+ KDataBuffer databuffer;
+ KTimeMs_t start_time = KTimeMsStamp();
+ if (acc == NULL) {
+ return 0;
+ }
+ assert(self);
+ memset(&databuffer, 0, sizeof databuffer);
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ {
+ KTimeMs_t time = 0;
+ const char root[] = "Response";
+ rc = call_cgi ( self,
+ "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi",
+ 1, 2, "http,https", acc, & databuffer, eol );
+ time = KTimeMsStamp() - start_time;
+ if (rc == 0) {
+ const char *start = databuffer.base;
+ size_t size = KDataBufferBytes(&databuffer);
+ if (self->xml) {
+ OUTMSG((" <%s time=\"%d ms\">%.*s</%s>\n",
+ root, time, size, start, root));
+ }
+ else {
+ OUTMSG(("%s = \"%.*s\" time=\"%d ms\"\n",
+ root, size, start, time));
+ }
+ }
+ }
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ KDataBufferWhack ( & databuffer );
+ return rc;
+}
+
+static
+rc_t MainRanges ( const Main * self, const char * arg, const char * bol,
+ bool get, bool https )
+{
+ rc_t rc = 0;
+ const char * method = "Head";
+ const char * protocol = "http";
+ if ( get )
+ method = "Get";
+ if ( https )
+ protocol = "https";
+ if ( self -> xml )
+ OUTMSG ( ( "%s <%s protocol=\"%s\">\n", bol, method, protocol ) );
+ {
+ char buffer [ 1024 ] = "";
+ KClientHttp * http = NULL;
+ KClientHttpRequest * req = NULL;
+ KClientHttpResult * rslt = NULL;
+ const char root [] = "Request";
+ size_t len = 0;
+ char * b = buffer;
+ size_t sizeof_b = sizeof buffer;
+ char * allocated = NULL;
+ String host;
+ CONST_STRING ( & host, "sra-download.ncbi.nlm.nih.gov" );
+ if ( self -> xml )
+ OUTMSG ( ( "%s <%s host=\"%S\">\n", bol, root, & host ) );
+ else
+ OUTMSG ( ( "%s %s host=\"%S\" protocol=\"%s\"\n",
+ method, root, & host, protocol ) );
+ if ( https )
+ rc = KNSManagerMakeClientHttps
+ ( self -> knsMgr, & http, NULL, HTTP_VERSION, & host, 0 );
+ else
+ rc = KNSManagerMakeClientHttp
+ ( self -> knsMgr, & http, NULL, HTTP_VERSION, & host, 0 );
+ if ( rc == 0 ) {
+ rc = KClientHttpMakeRequest( http, & req, "/srapub/%s", arg );
+ if ( rc != 0 )
+ OUTMSG ( ( "KClientHttpMakeRequest(%S,/srapub/%s)=%R\n",
+ & host, arg, rc ) );
+ }
+ else
+ OUTMSG ( ( "KClientHttpMakeRequest(%S)=%R\n", & host, rc ) );
+ if ( get && rc == 0 ) {
+ rc = KClientHttpRequestByteRange ( req, 0, 4096 );
+ if ( rc != 0 )
+ OUTMSG ( ( "KClientHttpRequestByteRange(0,4096)=%R\n", rc ) );
+ }
+ if ( rc == 0 ) {
+ rc = KClientHttpRequestFormatMsg
+ ( req, b, sizeof_b, get ? "GET" : "HEAD", & len );
+ if ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+ GetRCState ( rc ) == rcInsufficient )
+ {
+ free ( allocated );
+ sizeof_b = 0;
+ allocated = b = malloc ( len );
+ if ( allocated == NULL )
+ rc = RC
+ ( rcExe, rcData, rcAllocating, rcMemory, rcExhausted );
+ else {
+ sizeof_b = len;
+ rc = KClientHttpRequestFormatMsg
+ ( req, b, sizeof_b, get ? "GET" : "HEAD", & len );
+ }
+ }
+ if ( rc == 0 )
+ OUTMSG ( ( "%s", b ) );
+ else
+ OUTMSG ( ( "KClientHttpRequestFormatMsg()=%R\n", rc ) );
+ }
+ if ( rc == 0 ) {
+ if ( get ) {
+ rc = KClientHttpRequestGET ( req, & rslt );
+ if ( rc != 0 )
+ OUTMSG ( ( "KClientHttpRequestGET()=%R\n", rc ) );
+ }
+ else {
+ rc = KClientHttpRequestHEAD ( req, & rslt );
+ if ( rc != 0 )
+ OUTMSG ( ( "KClientHttpRequestHEAD()=%R\n", rc ) );
+ }
+ }
+ if ( rc == 0 ) {
+ rc = KClientHttpResultFormatMsg
+ ( rslt, b, sizeof_b, & len, "", "\n" );
+ if ( GetRCObject ( rc ) == ( enum RCObject ) rcBuffer &&
+ GetRCState ( rc ) == rcInsufficient )
+ {
+ free ( allocated );
+ sizeof_b = 0;
+ allocated = b = malloc ( len );
+ if ( allocated == NULL )
+ rc = RC
+ ( rcExe, rcData, rcAllocating, rcMemory, rcExhausted );
+ else {
+ sizeof_b = len;
+ rc = KClientHttpResultFormatMsg
+ ( rslt, b, sizeof_b, & len, "", "\n" );
+ }
+ }
+ if ( rc != 0 )
+ OUTMSG ( ( "KClientHttpResultFormatMsg()=%R\n", rc ) );
+ }
+ if ( self -> xml )
+ OUTMSG ( ( "%s </%s>\n", bol, root ) );
+ if ( rc == 0 ) {
+ const char root [] = "Response";
+ if (self->xml)
+ OUTMSG(("%s <%s>\n", bol, root));
+ else
+ OUTMSG(("%s\n", root));
+ OUTMSG ( ( "%s", b ) );
+ if (self->xml)
+ OUTMSG(("%s </%s>\n", bol, root));
+ else
+ OUTMSG ( ( "\n" ) );
+ }
+ free ( allocated );
+ allocated = NULL;
+ b = buffer;
+ RELEASE ( KClientHttpResult, rslt );
+ RELEASE ( KClientHttpRequest, req );
+ RELEASE ( KClientHttp, http );
+ }
+ if ( self -> xml )
+ OUTMSG ( ( "%s </%s>\n", bol, method ) );
+ return rc;
+}
+
+static rc_t MainNetwotk ( const Main * self,
+ const char * arg, const char * bol, const char * eol )
+{
+ const char root[] = "Network";
+ assert(self);
+ if (self->xml) {
+ OUTMSG(("%s<%s>\n", bol, root));
+ }
+ if (arg == NULL) {
+ const char root[] = "KNSManager";
+ bool enabled = KNSManagerGetHTTPProxyEnabled(self->knsMgr);
+ if (!enabled) {
+ if (self->xml) {
+ OUTMSG(("%s <%s GetHTTPProxyEnabled=\"false\">\n", bol, root));
+ }
+ else {
+ OUTMSG(("KNSManagerGetHTTPProxyEnabled=\"false\"\n", root));
+ }
+ }
+ else {
+ if (self->xml) {
+ OUTMSG(("%s <%s GetHTTPProxyEnabled=\"true\">\n", bol, root));
+ }
+ else {
+ OUTMSG(("KNSManagerGetHTTPProxyEnabled=\"true\"\n", root));
+ }
+ }
+ {
+ const HttpProxy *p = KNSManagerGetHttpProxy(self->knsMgr);
+ while (p) {
+ const char root[] = "HttpProxy";
+ const String *http_proxy = NULL;
+ uint16_t http_proxy_port = 0;
+ HttpProxyGet(p, &http_proxy, &http_proxy_port);
+ if (self->xml) {
+ if ( http_proxy_port == 0) {
+ OUTMSG ( ( "%s <%s path=\"%S\"/>\n",
+ bol, root, http_proxy ) );
+ }
+ else {
+ OUTMSG(("%s <%s path=\"%S\" port=\"%d\"/>\n",
+ bol, root, http_proxy, http_proxy_port));
+ }
+ }
+ else {
+ if ( http_proxy_port == 0) {
+ OUTMSG(("HTTPProxy=\"%S\"\n", http_proxy));
+ }
+ else {
+ OUTMSG(("HTTPProxy=\"%S\":%d\n",
+ http_proxy, http_proxy_port));
+ }
+ }
+ p = HttpProxyGetNextHttpProxy ( p );
+ }
+ }
+ if (self->xml) {
+ OUTMSG(("%s </%s>\n", bol, root));
+ }
+ }
+
+ if (arg == NULL) {
+ const char *user_agent = NULL;
+ rc_t rc = KNSManagerGetUserAgent(&user_agent);
+ if (rc != 0) {
+ OUTMSG(("KNSManagerGetUserAgent()=%R%s", rc, eol));
+ }
+ else {
+ const char root[] = "UserAgent";
+ if (self->xml) {
+ OUTMSG(("%s <%s>%s</%s>\n", bol, root, user_agent, root));
+ }
+ else {
+ OUTMSG(("UserAgent=\"%s\"\n", user_agent));
+ }
+ }
+
+ perform_dns_test (self, eol, 80);
+ perform_dns_test (self, eol, 443);
+ ClientRequestTest(self, eol,
+ "https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/sratoolkit.current.version"
+ );
+ }
+
+ if (arg != NULL)
+ perform_cgi_test(self, eol, arg);
+
+ if ( arg != NULL ) {
+ const char root [] = "Ranges";
+ if ( self -> xml )
+ OUTMSG ( ( "%s <%s>\n", bol, root ) );
+ else
+ OUTMSG ( ( "\n%s\n", root ) );
+ MainRanges ( self, arg, bol, true , false );
+ MainRanges ( self, arg, bol, true , true );
+ MainRanges ( self, arg, bol, false, false );
+ MainRanges ( self, arg, bol, false, true );
+ if ( self-> xml )
+ OUTMSG ( ( "%s </%s>\n", bol, root ) );
+ }
+
+ if ( self -> xml )
+ OUTMSG ( ( "%s</%s>\n", bol, root ) );
+
+ return 0;
+}
+
+static rc_t MainExec ( const Main * self,
+ const KartItem * item, const char * aArg, ... )
+{
+ const char root[] = "Object";
+
+ rc_t rc = 0;
+ rc_t rce = 0;
+
+ KPathType type = kptNotFound;
+ bool alias = false;
+ int64_t directSz = -1;
+ int64_t localSz = -1;
+ int64_t remoteSz = -1;
+ size_t num_writ = 0;
+ char arg[PATH_MAX] = "";
+
+ const char *eol = NULL;
+
+ va_list args;
+ va_start(args, aArg);
+
+ assert(self);
+
+ eol = self->xml ? "<br/>\n" : "\n";
+
+ if (self->xml) {
+ OUTMSG(("<%s>\n", root));
+ }
+
+ if (item != NULL) {
+ type = kptKartITEM;
+
+ _KartItemPrint(item, self->xml);
+ }
+
+ else {
+ rc = string_vprintf(arg, sizeof arg, &num_writ, aArg, args);
+ if (rc != 0) {
+ OUTMSG(("string_vprintf(%s)=%R%s", aArg, rc, eol));
+ return rc;
+ }
+ assert(num_writ < sizeof arg);
+
+ OUTMSG(("\n"));
+ rc = printString(arg);
+ if (rc != 0) {
+ OUTMSG(("printString=%R%s", rc, eol));
+ return rc;
+ }
+ if (MainHasTest(self, eType)) {
+ OUTMSG((" "));
+ rc = MainReport(self, arg, &directSz, &type, &alias);
+ }
+ else {
+ type = KDirectoryPathType(self->dir, "%s", arg);
+ }
+ OUTMSG(("%s", eol));
+
+ if (MainHasTest(self, eOpenTable)) {
+ MainOpenAs(self, arg, false);
+ }
+ if (MainHasTest(self, eOpenDB)) {
+ MainOpenAs(self, arg, true);
+ }
+ }
+
+ if (self->recursive && type == kptDir && !alias) {
+ uint32_t i = 0;
+ uint32_t count = 0;
+ KNamelist *list = NULL;
+ rc = KDirectoryList(self->dir, &list, NULL, NULL, "%s", arg);
+ if (rc != 0) {
+ OUTMSG(("KDirectoryList(%s)=%R ", arg, rc));
+ }
+ else {
+ rc = KNamelistCount(list, &count);
+ if (rc != 0) {
+ OUTMSG(("KNamelistCount(KDirectoryList(%s))=%R ", arg, rc));
+ }
+ }
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char *name = NULL;
+ rc = Quitting();
+ if (rc != 0) {
+ break;
+ }
+ rc = KNamelistGet(list, i, &name);
+ if (rc != 0) {
+ OUTMSG(("KNamelistGet(KDirectoryList(%s), %d)=%R ",
+ arg, i, rc));
+ }
+ else {
+ rc_t rc2 = MainExec(self, NULL, "%s/%s", arg, name);
+ if (rc2 != 0 && rce == 0) {
+ rce = rc2;
+ }
+ }
+ }
+ RELEASE(KNamelist, list);
+ }
+ else {
+ bool isKart = false;
+ Kart *kart = NULL;
+ if (type == kptFile) {
+ rc_t rc = KartMake(self->dir, arg, &kart, &isKart);
+ if (rc != 0) {
+ OUTMSG(("KartMake = %R\n", rc));
+ }
+ }
+
+ if (isKart) {
+ const KartItem *item = NULL;
+ while (true) {
+ rc_t rc2 = 0;
+ RELEASE(KartItem, item);
+ rc2 = Quitting();
+ if (rc2 != 0) {
+ if (rce == 0) {
+ rce = rc2;
+ }
+ break;
+ }
+ rc2 = KartMakeNextItem(kart, &item);
+ if (rc2 != 0) {
+ OUTMSG(("KartMakeNextItem = %R\n", rc2));
+ if (rce == 0) {
+ rce = rc2;
+ }
+ break;
+ }
+ if (item == NULL) {
+ break;
+ }
+ rc2 = MainExec(self, item, NULL);
+ if (rc2 != 0 && rce == 0) {
+ rce = rc2;
+ }
+ }
+ if (true) {
+ _KartPrintNumbered(kart, self->xml);
+ }
+ /*if (true) {
+ _KartPrint(kart, self->xml);
+ }
+ if (true) {
+ _KartPrintSized(kart, self->xml);
+ }*/
+ KartRelease(kart);
+ kart = NULL;
+ }
+ else {
+ if (MainHasTest(self, eResolve)) {
+ /* ignore returned value :
+ resolver's errors are detected but not reported as test-sra's failure */
+ MainResolve(self, item, arg, &localSz, &remoteSz, false);
+ }
+
+ if (MainHasTest(self, eNetwork)) {
+ MainNetwotk(self, arg, " ", eol);
+ }
+
+ if (item == NULL) { /* TODO || kartitem & database */
+ if (type == kptDatabase || type == kptNotFound) {
+ if (MainHasTest(self, eDependMissing)) {
+ rc_t rc2 = MainDepend(self, arg, true);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ if (MainHasTest(self, eDependAll)) {
+ rc_t rc2 = MainDepend(self, arg, false);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ }
+ }
+
+ if (MainHasTest(self, eResolve) && (
+ (directSz != -1 && localSz != -1 && directSz != localSz) ||
+ (remoteSz != -1 && localSz != -1 && localSz != remoteSz))
+ )
+ {
+ OUTMSG(("FILE SIZES DO NOT MATCH: "));
+ if (directSz != -1 && localSz != -1 &&
+ directSz != remoteSz)
+ {
+ OUTMSG(("direct=%ld != remote=%ld. ", directSz, remoteSz));
+ }
+ if (remoteSz != -1 && localSz != -1 &&
+ localSz != remoteSz)
+ {
+ OUTMSG(("local=%ld != remote=%ld. ", localSz, remoteSz));
+ }
+ OUTMSG(("\n"));
+ }
+
+ }
+ }
+
+ if (rce != 0 && rc == 0) {
+ rc = rce;
+ }
+
+ if (self->xml) {
+ OUTMSG(("</%s>\n", root));
+ }
+
+ va_end(args);
+ return rc;
+}
+
+static
+rc_t _SraReleaseVersionPrint(const SraReleaseVersion *self, rc_t rc, bool xml,
+ const char *error, const char *msg)
+{
+ assert(self && error && msg);
+
+ if (rc != 0) {
+ OUTMSG(("ERROR: %s.", error));
+ }
+ else {
+ char version[256] = "";
+ const char *eol = xml ? "<br/>\n" : "\n";
+ rc = SraReleaseVersionPrint(self, version, sizeof version, NULL);
+ if (rc == 0) {
+ rc = OUTMSG(("%s: %s.%s", msg, version, eol));
+ }
+ }
+
+ return rc;
+}
+
+static rc_t _KDyldLoadLib(KDyld *self, char *name, size_t sz,
+ const char *path, bool xml, int indent)
+{
+ rc_t rc = 0;
+ KDylib *lib = NULL;
+ rc = KDyldLoadLib(self, &lib, "%.*s", sz, path);
+ if (rc == 0) {
+ rc = OUTMSG(("LOADED %.*s\n", sz, path));
+ }
+ else {
+ rc = OUTMSG(("NOT LOADED %.*s\n", sz, path));
+ }
+ RELEASE(KDylib, lib);
+ return rc;
+}
+
+static rc_t _KHttpRequestPOST ( KHttpRequest * self,
+ KDataBuffer * result, size_t * total )
+{
+ rc_t rc = 0;
+ KHttpResult *rslt = NULL;
+ assert(result && total);
+ *total = 0;
+ rc = KHttpRequestPOST(self, &rslt);
+ if (rc == 0) {
+ uint32_t code = 0;
+ size_t msg_size = 0;
+ char msg_buff[256] = "";
+ rc = KHttpResultStatus(rslt,
+ &code, msg_buff, sizeof msg_buff, &msg_size);
+ if (rc == 0 && code == 200) {
+ KStream *response = NULL;
+ rc = KHttpResultGetInputStream( rslt, &response);
+ if (rc == 0) {
+ size_t num_read = 0;
+ KDataBufferMakeBytes(result, 4096);
+ while (true) {
+ uint8_t *base = NULL;
+ uint64_t avail = result->elem_count - *total;
+ if (avail < 256) {
+ rc = KDataBufferResize
+ (result, result->elem_count + 4096);
+ if (rc != 0) {
+ break;
+ }
+ }
+ base = result->base;
+ rc = KStreamRead(response, &base[*total],
+ result->elem_count - *total, &num_read);
+ if (rc != 0) {
+ if (num_read > 0) {
+ rc = 0;
+ }
+ else {
+ break;
+ }
+ }
+ if (num_read == 0) {
+ break;
+ }
+ *total += num_read;
+ }
+ RELEASE(KStream, response);
+ }
+ }
+ }
+ RELEASE(KHttpResult, rslt);
+ return rc;
+}
+
+static rc_t _MainPost ( const Main * self,
+ const char * name, char * buffer, size_t sz )
+{
+ rc_t rc = 0;
+
+ KHttpRequest *req = NULL;
+ KDataBuffer result;
+
+ size_t total = 0;
+
+ assert(self && buffer && sz);
+
+ memset ( & result, 0, sizeof result );
+ buffer[0] = '\0';
+
+ rc = KNSManagerMakeRequest(self->knsMgr, &req, HTTP_VERSION, NULL,
+ "https://trace.ncbi.nlm.nih.gov/Traces/sratoolkit/sratoolkit.cgi");
+
+ if (rc == 0) {
+ rc = KHttpRequestAddPostParam(req, "cmd=vers");
+ }
+ if (rc == 0) {
+ rc = KHttpRequestAddPostParam(req, "libname=%s", name);
+ }
+ if (rc == 0) {
+ rc = _KHttpRequestPOST(req, &result, &total);
+ }
+
+ if (rc == 0) {
+ const char *start = (const void*)(result.base);
+ if (total > 0) {
+ if (*(start + total - 1) != '\n') {
+ rc = RC(rcExe, rcString, rcParsing, rcString, rcUnexpected);
+ }
+ else {
+ string_copy(buffer, sz, start, total - 1);
+ }
+ }
+ }
+
+ KDataBufferWhack(&result);
+ RELEASE(KHttpRequest, req);
+
+ return rc;
+}
+
+static rc_t _MainPrintNgsInfo(const Main* self) {
+ rc_t rc = 0;
+ const char root[] = "Ngs";
+ KDyld *l = NULL;
+ assert(self);
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ {
+ const char root[] = "Latest";
+ char v[512];
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ {
+ const char name[] = "ncbi-vdb";
+ _MainPost(self, name, v, sizeof v);
+ if (self->xml) {
+ OUTMSG((" <%s version=\"%s\"/>\n", name, v));
+ }
+ else {
+ OUTMSG(("%s latest version=\"%s\"\n", name, v));
+ }
+ }
+ {
+ const char name[] = "ngs-sdk";
+ _MainPost(self, name, v, sizeof v);
+ if (self->xml) {
+ OUTMSG((" <%s version=\"%s\"/>\n", name, v));
+ }
+ else {
+ OUTMSG(("%s latest version=\"%s\"\n", name, v));
+ OUTMSG(("\n"));
+ }
+ }
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ }
+ rc = KDyldMake(&l);
+ {
+ String *result = NULL;
+ rc = KConfigReadString(self->cfg, "NCBI_HOME", &result);
+ if (rc == 0) {
+ bool found = false;
+ const KFile *f = NULL;
+ char *buffer = NULL;
+ char *ps = NULL;
+ size_t ls = 0;
+ char *pv = NULL;
+ size_t lv = 0;
+ assert(result);
+ rc = KDirectoryOpenFileRead
+ (self->dir, &f, "%s/LibManager.properties", result->addr);
+ if (rc == 0) {
+ uint64_t size = 0;
+ rc = KFileSize(f, &size);
+ if (rc == 0) {
+ buffer = malloc(size + 1);
+ if (buffer == NULL) {
+ rc = RC(rcExe, rcData, rcAllocating,
+ rcMemory, rcExhausted);
+ }
+ else {
+ size_t num_read = 0;
+ rc = KFileRead(f, 0, buffer, size + 1, &num_read);
+ if (rc == 0) {
+#if _ARCH_BITS == 32
+ const char* sneed = "/dll/ngs-sdk/32/loaded/path=";
+ const char* vneed = "/dll/ncbi-vdb/32/loaded/path=";
+#else
+ const char* sneed = "/dll/ngs-sdk/64/loaded/path=";
+ const char* vneed = "/dll/ncbi-vdb/64/loaded/path=";
+#endif
+
+ assert(num_read <= size);
+ buffer[num_read] = '\0';
+ found = true;
+
+ ps = strstr(buffer, sneed);
+ if (ps != NULL) {
+ ps += strlen(sneed);
+ }
+ if (ps != NULL) {
+ const char *e = strchr(ps, '\n');
+ if (e != NULL) {
+ ls = e - ps;
+ }
+ }
+
+ pv = strstr(buffer, vneed);
+ if (pv != NULL) {
+ pv += strlen(vneed);
+ }
+ if (pv != NULL) {
+ const char *e = strchr(pv, '\n');
+ if (e != NULL) {
+ lv = e - pv;
+ }
+ }
+ }
+ }
+ }
+ RELEASE(KFile, f);
+ }
+ if (self->xml) {
+ if (found) {
+ OUTMSG((" <LibManager>\n"
+ " <Properties>\n%s"
+ " </Properties>\n", buffer));
+ if (ls != 0) {
+ OUTMSG((" <ngs-sdk>\n"
+ " <Path>%.*s</Path>\n", ls, ps));
+ _KDyldLoadLib(l, "ngs-sdk", ls, ps, self->xml, 8);
+ OUTMSG((" </ngs-sdk>\n"));
+ }
+ if (lv != 0) {
+ OUTMSG((" <ncbi-vdb>\n"
+ " <Path>%.*s</Path>\n", lv, pv));
+ _KDyldLoadLib(l, "ncbi-vdb", ls, ps, self->xml, 8);
+ OUTMSG((" </ncbi-vdb>\n"));
+ }
+ OUTMSG((" </LibManager>\n"));
+ }
+ else {
+ OUTMSG((" <LibManager.properties/>\n"));
+ }
+ }
+ else {
+ OUTMSG(("LibManager.properties=\n"));
+ if (found) {
+ OUTMSG(("%s\n", buffer));
+ if (ls != 0) {
+ OUTMSG(("LibManager.ngs-sdk='%.*s'\n", ls, ps));
+ }
+ if (lv != 0) {
+ OUTMSG(("LibManager.ngs-sdk='%.*s'\n", lv, pv));
+ }
+ }
+ }
+ free(buffer);
+ buffer = NULL;
+ free(result);
+ result = NULL;
+ }
+ }
+ {
+ const char root[] = "ncbi-vdb";
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ }
+ {
+ const char root[] = "ngs-sdk";
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ }
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ RELEASE(KDyld, l);
+ return rc;
+}
+
+static rc_t MainPrintVersion(Main *self) {
+ const char root[] = "Version";
+
+ rc_t rc = 0;
+
+ SraReleaseVersion version;
+ SraReleaseVersion newVersion;
+
+ assert(self);
+
+ if (MainHasTest(self, eNewVersion)) {
+ MainAddTest(self, eVersion);
+ }
+
+ if (!MainHasTest(self, eVersion)) {
+ return 0;
+ }
+ memset(&version, 0, sizeof version);
+ memset(&newVersion, 0, sizeof newVersion);
+ if (self->xml) {
+ OUTMSG((" <%s>\n", root));
+ }
+ rc = SraReleaseVersionGet(&version);
+ rc = _SraReleaseVersionPrint(&version, rc, self->xml,
+ "cannot get SRA Toolkit release version",
+ "NCBI SRA Toolkit release version");
+
+ if (MainHasTest(self, eNewVersion)) {
+ int32_t isNew = 0;
+ rc = KNSManagerNewReleaseVersion(self->knsMgr, &newVersion);
+ rc = _SraReleaseVersionPrint(&newVersion, rc, self->xml,
+ "cannot get latest available SRA Toolkit release version",
+ "Latest available NCBI SRA Toolkit release version");
+ if (rc == 0) {
+ rc = SraReleaseVersionCmp(&version, &newVersion, &isNew);
+ }
+ if (rc == 0) {
+ if (isNew > 0) {
+ OUTMSG((
+ "A new version of SRA Toolkit is available for download from\n"
+ "\"https://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=software\".\n"
+ ));
+ }
+ else if (isNew == 0) {
+ OUTMSG(("You already have the latest version of "
+ "SRA Toolkit.\n"));
+ }
+ else {
+ OUTMSG(("Your version of "
+ "SRA Toolkit is more recent than the latest available.\n"));
+ }
+ }
+ }
+
+ if (self->xml) {
+ OUTMSG((" </%s>\n", root));
+ }
+ else if (self->full) {
+ OUTMSG(("\n"));
+ }
+
+ return rc;
+}
+
+static rc_t MainFini(Main *self) {
+ rc_t rc = 0;
+
+ assert(self);
+
+ RELEASE(VResolver, self->resolver);
+ RELEASE(KConfig, self->cfg);
+ RELEASE(KNSManager, self->knsMgr);
+ RELEASE(KRepositoryMgr, self->repoMgr);
+ RELEASE(VFSManager, self->vMgr);
+ RELEASE(VDBManager, self->mgr);
+ RELEASE(KDirectory, self->dir);
+ RELEASE(VSchema, self->schema);
+
+ return rc;
+}
+
+#define OPTION_CACHE "allow-caching"
+#define ALIAS_CACHE "C"
+static const char* USAGE_CACHE[] = { "do not disable caching", NULL };
+
+#define OPTION_BYTES "bytes"
+#define ALIAS_BYTES "b"
+static const char* USAGE_BYTES[]
+ = { "print the first <K> bytes of resolved remote HTTP file", NULL };
+
+#define OPTION_FULL "full"
+#define ALIAS_FULL NULL
+static const char* USAGE_FULL[] = { "full test mode", NULL };
+
+#define OPTION_LIB "library"
+#define ALIAS_LIB "l"
+static const char* USAGE_LIB[] = { "report version of dynamic library", NULL };
+
+#define OPTION_QUICK "quick"
+#define ALIAS_QUICK "Q"
+static const char* USAGE_QUICK[] = { "quick test mode", NULL };
+
+#define OPTION_NO_RFS "no-rfs"
+static const char* USAGE_NO_RFS[]
+ = { "do not check remote file size for dependencies", NULL };
+
+#define OPTION_NO_VDB "no-vdb"
+#define ALIAS_NO_VDB "N"
+static const char* USAGE_NO_VDB[] = { "do not call VDBManagerPathType", NULL };
+
+#define OPTION_PRJ "project-id"
+#define ALIAS_PRJ "p"
+static const char* USAGE_PRJ[] = { "set project context", NULL };
+
+#define OPTION_REC "recursive"
+#define ALIAS_REC "R"
+static const char* USAGE_REC[] = { "check object type recursively", NULL };
+
+#define OPTION_OUT "output"
+#define ALIAS_OUT "X"
+static const char* USAGE_OUT[] = { "output type: one of (xml text)", NULL };
+
+OptDef Options[] = { /* needs_value, required */
+ { OPTION_BYTES , ALIAS_BYTES , NULL, USAGE_BYTES , 1, true , false },
+ { OPTION_CACHE , ALIAS_CACHE , NULL, USAGE_CACHE , 1, false, false },
+ { OPTION_FULL , ALIAS_FULL , NULL, USAGE_FULL , 1, false, false },
+ { OPTION_LIB , ALIAS_LIB , NULL, USAGE_LIB , 0, true , false },
+ { OPTION_NO_RFS, NULL , NULL, USAGE_NO_RFS, 1, false, false },
+ { OPTION_NO_VDB, ALIAS_NO_VDB, NULL, USAGE_NO_VDB, 1, false, false },
+ { OPTION_OUT , ALIAS_OUT , NULL, USAGE_OUT , 1, true , false },
+ { OPTION_PRJ , ALIAS_PRJ , NULL, USAGE_PRJ , 1, true , false },
+ { OPTION_QUICK , ALIAS_QUICK , NULL, USAGE_QUICK , 1, false, false },
+ { OPTION_REC , ALIAS_REC , NULL, USAGE_REC , 1, false, false },
+};
+
+static rc_t PrintLib ( const char * path, bool xml ) {
+ const char root[] = "dll";
+ KDyld * dl = NULL;
+ KDylib * lib = NULL;
+ KSymAddr * sym = NULL;
+ const char * ( CC * getPackageVersion ) ( void ) = NULL;
+ const char * version = NULL;
+ const char * name = NULL;
+ rc_t rc = KDyldMake ( & dl );
+ if ( xml ) {
+ OUTMSG((" <%s path=\"%s\">", root, path));
+ } else {
+ OUTMSG(("dll path=\"%s\"\n", path));
+ }
+ if ( rc == 0 ) {
+ rc = KDyldLoadLib ( dl, & lib, path );
+ if ( rc != 0 ) {
+ if ( xml ) {
+ OUTMSG(("<KDyldLoadLib=\"%R\"/>", rc));
+ } else {
+ OUTMSG(("KDyldLoadLib=\"%R\"\n", rc));
+ }
+ }
+ }
+ if ( rc == 0 ) {
+ rc = KDylibSymbol ( lib, & sym, "ngs_PackageItf_getPackageVersion" );
+ if ( rc == 0 ) {
+ KSymAddrAsFunc ( sym, ( fptr_t * ) & getPackageVersion );
+ version = getPackageVersion ();
+ name = "ngs-sdk";
+ }
+ else {
+ rc = KDylibSymbol ( lib, & sym, "GetPackageVersion" );
+ if ( rc == 0 ) {
+ KSymAddrAsFunc ( sym, ( fptr_t * )& getPackageVersion );
+ version = getPackageVersion ();
+ name = "ncbi-vdb";
+ } else {
+ if ( xml ) {
+ OUTMSG(("<KDylibSymbol=\"%R\"/>", rc));
+ } else {
+ OUTMSG(("KDylibSymbol=\"%R\"\n", rc));
+ }
+ }
+ }
+ }
+ if ( rc == 0 ) {
+ if (version == NULL ) {
+ if ( xml ) {
+ OUTMSG(("<version found=\"false\"/>"));
+ } else {
+ OUTMSG(("version: not found\n"));
+ }
+ } else {
+ if ( xml ) {
+ OUTMSG(("<version name=\"%s\">%s</version>", name, version));
+ } else {
+ OUTMSG(("%s: \"%s\"\n", name, version));
+ }
+ }
+ }
+ if ( xml ) {
+ OUTMSG(("</%s>", root));
+ }
+ OUTMSG(("\n"));
+ RELEASE ( KSymAddr, sym );
+ RELEASE ( KDylib, lib );
+ RELEASE ( KDyld, dl );
+ return rc;
+}
+
+rc_t CC KMain(int argc, char *argv[]) {
+ rc_t rc = 0;
+ uint32_t pcount = 0;
+ uint32_t i = 0;
+ Args *args = NULL;
+ rc_t rc3 = 0;
+ int argi = 0;
+ uint32_t params = 0;
+ const char * eol = "\n";
+
+ Main prms;
+ char **argv2 = MainInit(&prms, argc, argv, &argi);
+
+ if ( rc == 0 && prms . xml ) {
+ eol = "<br/>\n";
+ }
+
+ if (rc == 0) {
+ rc = ArgsMakeAndHandle(&args, argi, argv2, 1,
+ Options, sizeof Options / sizeof Options[0]);
+ }
+
+ if ( rc == 0 ) {
+ rc = ArgsParamCount ( args, & params );
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_CACHE, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CACHE "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.allowCaching = true;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_PRJ, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PRJ "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ const char *dummy = NULL;
+ rc = ArgsOptionValue
+ (args, OPTION_PRJ, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_PRJ "' argument");
+ }
+ else {
+ prms.projectId = AsciiToU32(dummy, NULL, NULL);
+ }
+ }
+ }
+ }
+
+ prms.full = true;
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_QUICK, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_QUICK "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.full = false;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_FULL, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_FULL "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.full = true;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ prms.bytes = 256;
+ rc = ArgsOptionCount(args, OPTION_BYTES, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_BYTES "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ const char *val = NULL;
+ rc = ArgsOptionValue
+ (args, OPTION_BYTES, 0, (const void **)&val);
+ if (rc == 0) {
+ int bytes = atoi(val);
+ if (bytes > 0) {
+ prms.bytes = bytes;
+ MainAddTest(&prms, ePrintFile);
+ MainAddTest(&prms, eResolve);
+ }
+ } else {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_BYTES "' argument value");
+ }
+ }
+ }
+ }
+
+ if (!prms.full) {
+ MainMakeQuick(&prms);
+ }
+
+ if (rc == 0) {
+ rc = MainInitObjects(&prms);
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_LIB, &pcount);
+ if (rc == 0 && pcount > 0 && ! prms.xml) {
+ prms . tests = 0;
+ }
+ }
+
+ if (rc == 0) {
+ const char root[] = "Test-sra";
+ rc = ArgsOptionCount(args, OPTION_OUT, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_OUT "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ const char *dummy = NULL;
+ rc =
+ ArgsOptionValue(args, OPTION_OUT, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_OUT "' argument");
+ }
+ else if (strcmp(dummy, "x") == 0 || strcmp(dummy, "X") == 0) {
+ prms.xml = true;
+ }
+ else {
+ prms.xml = false;
+ }
+ }
+ else {
+ prms.xml = MainHasTest(&prms, eCfg)
+ || MainHasTest(&prms, eNcbiReport);
+ }
+ }
+
+ if (prms.xml) {
+ OUTMSG(("<%s>\n", root));
+ }
+
+ if (MainHasTest(&prms, eNgs)) {
+ _MainPrintNgsInfo(&prms);
+ }
+
+ MainPrintVersion(&prms);
+
+ if (MainHasTest(&prms, eCfg)) {
+ rc_t rc2 = MainPrintConfig(&prms);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ if (MainHasTest(&prms, eOS)) {
+ PrintOS(prms.xml);
+ }
+
+ if (MainHasTest(&prms, eAscp)) {
+ MainPrintAscp(&prms);
+ }
+
+ if (MainHasTest(&prms, eNetwork)) {
+ MainNetwotk(&prms, NULL, prms.xml ? " " : "", eol);
+ }
+
+ if (!prms.full) {
+ rc_t rc2 = MainQuickCheck(&prms);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_NO_RFS, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_NO_RFS "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.noRfs = true;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_NO_VDB, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_NO_VDB "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.noVDBManagerPathType = true;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_REC, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_REC "' argument");
+ }
+ else {
+ if (pcount > 0) {
+ prms.recursive = true;
+ }
+ }
+ }
+
+ if (rc == 0) {
+ rc = ArgsOptionCount(args, OPTION_LIB, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_LIB "' argument");
+ }
+ else {
+ int i = 0;
+ for (i = 0; i < pcount; ++i) {
+ const char * lib = NULL;
+ rc = ArgsOptionValue
+ ( args, OPTION_LIB, i, ( const void ** ) & lib );
+ if ( rc != 0 ) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_LIB "' argument");
+ }
+ else {
+ PrintLib ( lib, prms.xml );
+ }
+ }
+ }
+ }
+
+ if ( params == 0 && MainHasTest ( & prms, eNetwork ) ) {
+ MainNetwotk ( & prms, "SRR000001", prms . xml ? " " : "", eol );
+ }
+ for (i = 0; i < params; ++i) {
+ const char *name = NULL;
+ rc3 = ArgsParamValue(args, i, (const void **)&name);
+ if (rc3 == 0) {
+ rc_t rc2 = Quitting();
+ if (rc2 != 0) {
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ break;
+ }
+ ReportResetObject(name);
+ rc2 = MainExec(&prms, NULL, name);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ }
+ if (rc == 0 && rc3 != 0) {
+ rc = rc3;
+ }
+
+ if (MainHasTest(&prms, eNcbiReport)) {
+ ReportForceFinalize();
+ }
+
+ if (!prms.full) {
+ OUTMSG(("\nAdd -F option to try all the tests."));
+ }
+
+ if (prms.xml) {
+ OUTMSG(("</%s>\n", root));
+ }
+ }
+
+ RELEASE(Args, args);
+
+ {
+ rc_t rc2 = MainFini(&prms);
+ if (rc == 0 && rc2 != 0) {
+ rc = rc2;
+ }
+ }
+ free(argv2);
+
+ return rc;
+}
diff --git a/tools/util/testld.c b/tools/util/testld.c
new file mode 100644
index 0000000..58b31c5
--- /dev/null
+++ b/tools/util/testld.c
@@ -0,0 +1,249 @@
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <klib/vector.h>
+#include <kfs/directory.h>
+#include <kfs/dyload.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+/* update libpath
+ */
+static
+void testld_update_libpath ( KDyld *dl, const char *path )
+{
+ rc_t rc = 0;
+
+ const char *end;
+ for ( end = strchr ( path, ':' ); end != NULL; end = strchr ( path = end + 1, ':' ) )
+ {
+ if ( path < end )
+ {
+ rc = KDyldAddSearchPath ( dl, "%.*s",
+ ( int ) ( end - path ), path );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogWarn, ( klogWarn, rc, "failed to add library path '$(path)'",
+ "path=%.*s", ( int ) ( end - path ), path ));
+ }
+ }
+ }
+
+ if ( path [ 0 ] != 0 )
+ {
+ rc = KDyldAddSearchPath ( dl, path );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogWarn, ( klogWarn, rc, "failed to add library path '$(path)'", "path=s", path ));
+ }
+ }
+}
+
+
+/* load library
+ */
+static
+void testld_load_library ( KDyld *dl, KDlset *libs, const char *libname )
+{
+ KDylib *lib;
+ rc_t rc = KDyldLoadLib ( dl, & lib, libname );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, ( klogErr, rc, "failed to load library '$(name)'",
+ "name=%s", libname ));
+ }
+ else
+ {
+ printf ( "loaded library '%s'\n", libname);
+
+ rc = KDlsetAddLib ( libs, lib );
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogInt, ( klogInt, rc, "failed to retain library '$(name)'",
+ "name=%s", libname ));
+ }
+
+ KDylibRelease ( lib );
+ }
+}
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+
+#define OPTION_LOAD "lib-path"
+#define ALIAS_LOAD "l"
+
+static
+const char * load_usage [] =
+ { "Path(s) for loading dynamic libraries.", NULL };
+
+static
+OptDef MyOptions[] =
+{
+ { OPTION_LOAD, ALIAS_LOAD, NULL, load_usage, 0, true, false }
+};
+
+
+const char UsageDefaultName[] = "testld";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [Options]\n"
+ "\n"
+ "Summary:\n"
+ " Test for dynamic loading.\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ OUTMSG (("Options\n"));
+
+ HelpOptionLine (ALIAS_LOAD, OPTION_LOAD, "Path", load_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, MyOptions, sizeof MyOptions / sizeof (OptDef));
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse arguments");
+
+ else
+ {
+ do
+ {
+ KDyld *dl;
+ uint32_t num_libs;
+
+ rc = ArgsParamCount (args, &num_libs);
+ if (rc)
+ {
+ LOGERR ( klogInt, rc, "Failure to count parameters" );
+ break;
+ }
+
+ if (num_libs == 0)
+ {
+ rc = MiniUsage(args);
+ break;
+ }
+
+ /* create loader */
+ rc = KDyldMake (&dl);
+ if (rc)
+ {
+ LOGERR ( klogInt, rc, "failed to create dynamic loader" );
+ break;
+ }
+ else
+ {
+ do
+ {
+ KDlset *libs;
+ const char * path;
+ uint32_t ix;
+ uint32_t num_paths;
+
+ rc = ArgsOptionCount (args, OPTION_LOAD, &num_paths);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "failed to count paths");
+ break;
+ }
+
+ for (ix = 0; ix < num_paths; ix++)
+ {
+
+ rc = ArgsOptionValue (args, OPTION_LOAD, ix, (const void **)&path);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "failed to access a path option");
+ break;
+ }
+ testld_update_libpath (dl, path);
+ }
+ if (rc)
+ break;
+
+ /* append contents of LD_LIBRARY_PATH */
+ path = getenv ( "LD_LIBRARY_PATH" );
+
+ if (path)
+ testld_update_libpath (dl, path);
+
+ /* create libset */
+ rc = KDyldMakeSet (dl, & libs);
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "failed to create dl library set");
+ break;
+ }
+ else
+ {
+ /* test it */
+ for (ix = 0; ix < num_libs; ++ ix )
+ {
+ rc = ArgsParamValue (args, ix, (const void **)&path);
+ if (rc)
+ break;
+
+ testld_load_library (dl, libs, path);
+ }
+
+ KDlsetRelease ( libs );
+ }
+ } while (0);
+
+ KDyldRelease ( dl );
+ }
+
+ } while (0);
+
+ ArgsWhack (args);
+ }
+ return rc;
+}
diff --git a/tools/util/txt2kdb.c b/tools/util/txt2kdb.c
new file mode 100644
index 0000000..65a670c
--- /dev/null
+++ b/tools/util/txt2kdb.c
@@ -0,0 +1,579 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <kapp/args.h>
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kdb/manager.h>
+#include <kdb/column.h>
+#include <kapp/main.h>
+
+const char UsageDefaultName[] = "txt2kdb";
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s [Options] <File> <Column>\n"
+ "\n"
+ "Summary:\n"
+ " Create a physical database column from a text file.\n"
+ "\n", progname);
+}
+
+#define OPTION_APPEND "append"
+#define OPTION_FORCE "force"
+#define OPTION_BEGIN "begin"
+#define OPTION_END "end"
+#define ALIAS_APPEND "a"
+#define ALIAS_FORCE "f"
+#define ALIAS_BEGIN "b"
+#define ALIAS_END "e"
+
+static const char * append_usage[] =
+{
+ "(no parameter) this will cause to append the",
+ "text file to an existing KColumn. If the",
+ "file does not already exist it will be",
+ "created.",
+ NULL
+};
+static const char * force_usage [] =
+{
+ "(no parameter) this will cause to over-write",
+ "existing files. Without this option the",
+ "program will fail if the KColumn already",
+ "exists and append mode is not selected",
+ NULL
+};
+static const char * begin_usage [] =
+{
+ "Begin include only lines starting from this",
+ "line in the column. The first line is line",
+ "1 (not 0).",
+ NULL
+};
+static const char * end_usage [] =
+{
+ "Stop including lines after this line in the",
+ "column. The first line is line 1 (not 0).",
+ NULL
+};
+
+
+OptDef Options[] =
+{
+ { OPTION_APPEND, ALIAS_APPEND, NULL, append_usage, 0, false, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 0, false, false },
+ { OPTION_BEGIN, ALIAS_BEGIN, NULL, begin_usage, 1, true, false },
+ { OPTION_END, ALIAS_END, NULL, end_usage, 1, true, false }
+};
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ UsageSummary (progname);
+
+ OUTMSG (("File:\n"
+ " The text file should be ASCII or UTF-8 using LF, CR or CR-LF\n"
+ " line termination. Each text line will be put into the\n"
+ " KColumn as a separate Row. Each Row will be in its own\n"
+ " blob.\n"
+ "\n"
+ "Column:\n"
+ " The KColumn is either an existing KColumn or a path to one\n"
+ " that can be created.\n"
+ "\n"
+ " Both paths should be relative to the current directory or full\n"
+ " from root \n"
+ "\n"
+ "Options:\n"));
+
+ HelpOptionLine (ALIAS_BEGIN, OPTION_BEGIN, "Start", begin_usage);
+
+ HelpOptionLine (ALIAS_END, OPTION_END, "Stop", end_usage);
+
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, force_usage);
+
+ HelpOptionLine (ALIAS_APPEND, OPTION_APPEND, NULL, append_usage);
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+struct txt2kdbglobals
+{
+ uint64_t begin;
+ uint64_t end;
+
+ KDirectory * dir;
+ const KFile * txt;
+ KDBManager * mgr;
+ KColumn * col;
+ const char * txtpath;
+ const char * colpath;
+
+ bool force;
+ bool append;
+ bool begin_seen;
+ bool end_seen;
+} G;
+
+void txt2kdb_release (void)
+{
+ KDirectoryRelease (G.dir);
+ KFileRelease (G.txt);
+ KDBManagerRelease (G.mgr);
+ KColumnRelease (G.col);
+}
+
+rc_t txt2kdb_kfs (void)
+{
+ rc_t rc;
+
+ G.dir = NULL;
+ G.txt = NULL;
+ G.mgr = NULL;
+ G.col = NULL;
+
+ /* -----
+ * Mount the native filesystem as root
+ */
+ rc = KDirectoryNativeDir (&G.dir);
+ if (rc != 0)
+ {
+ G.dir = NULL;
+ LOGMSG (klogFatal, "Failed to open native KDirectory");
+ }
+ else
+ {
+ rc = KDirectoryOpenFileRead (G.dir, &G.txt, "%s", G.txtpath);
+ if (rc != 0)
+ {
+ G.txt = NULL;
+ PLOGERR (klogFatal, (klogFatal, rc, "Unable to open file at $(F)", PLOG_S(F), G.txtpath));
+ }
+ else
+ {
+ rc = KDBManagerMakeUpdate (&G.mgr, G.dir);
+ if (rc)
+ {
+ G.mgr = NULL;
+ LOGERR (klogFatal, rc, "Unable to create a KDBManager at the current directory");
+ }
+ else
+ {
+ KCreateMode kcm;
+ KPathType kpt;
+ const char * err = "";
+
+ kpt = KDirectoryPathType (G.dir, "%s", G.colpath) & ~ kptAlias;
+ kcm = kcmCreate;
+/* Force means replace if exists */
+/* Append means open in append mode if it exists */
+ switch (kpt)
+ {
+ case kptNotFound:
+ kcm = kcmCreate;
+ break;
+
+ default:
+ err = "Unknown";
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid);
+ break;
+
+ case kptBadPath:
+ err = "Bad Path";
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid);
+ break;
+
+ case kptFile:
+ case kptCharDev:
+ case kptBlockDev:
+ case kptFIFO:
+ err = "Must be a Directory";
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcPath, rcInvalid);
+ break;
+
+ case kptDir:
+ kcm = kcmCreate;
+
+ if (G.append)
+ {
+ kcm = kcmOpen;
+ }
+ else if (G.force)
+ {
+ kcm = kcmInit;
+ }
+ break;
+ }
+ if (rc == 0)
+ {
+ rc = KDBManagerCreateColumn (G.mgr, &G.col, kcm, kcsNone, 0, "%s", G.colpath);
+ if (rc)
+ err = "Manager can not open column";
+ }
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Cannot open KColumn $(P) because $(R)", PLOG_2(PLOG_S(P),PLOG_S(R)),
+ G.colpath, err));
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+/* If the begin parameter was set check if the rowid is equal or above it */
+bool rowid_lower_range (uint64_t rowid)
+{
+ if (G.begin_seen && (rowid < G.begin))
+ return false;
+ return true;
+}
+
+/* If the end parameter was set check if the rowid is equal or below it */
+bool rowid_upper_range (uint64_t rowid)
+{
+ if (G.end_seen && (rowid > G.end))
+ return false;
+ return true;
+}
+rc_t txt2kdb_io()
+{
+ rc_t rc = 0;
+ uint64_t rowid = 1;
+ uint64_t tix = 0;
+ KColumnBlob * blob;
+ bool blobopen = false;
+
+ while (rc == 0)
+ {
+ size_t num_read;
+ uint8_t buffer [4096];
+ uint8_t * limit;
+ uint8_t * append_start = buffer;
+ uint8_t * cursor = buffer;
+ bool eol = true;
+
+ /* quit if we are already past the end of the range */
+ if ( ! rowid_upper_range(rowid))
+ break;
+
+ /* read a buffer full. It may straddle rows. */
+ rc = KFileRead (G.txt, tix, buffer, sizeof buffer, &num_read);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Read failed starting $(P)", PLOG_U64(P), tix));
+ break;
+ }
+ /* break at EOF */
+ if (num_read == 0)
+ break;
+
+ /* scan across the buffer looking for lines */
+ for (limit = buffer + num_read; cursor < limit; append_start = cursor)
+ {
+ /* if we are at the beginning of a line (end of previous line or start of first */
+ if (eol)
+ {
+ /* if we are within the pass thru range create a blob */
+ if (rowid_lower_range(rowid) && rowid_upper_range(rowid))
+ {
+ rc = KColumnCreateBlob (G.col, &blob);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to create Blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ continue;
+ }
+ blobopen = true;
+ }
+ /* clear the flag */
+ eol = false;
+ }
+
+ /* this blob append will go until end of buffer or end of line */
+ for ( ; cursor < limit; ++ cursor, ++tix)
+ {
+ /* if we hit a NewLine flag it and break for append */
+ if (*cursor == '\n')
+ {
+ eol = true;
+ ++cursor;
+ ++tix;
+ break;
+ }
+ }
+
+ /* if we are within the selected range append this to the open blob
+ * ir might be the first append, a middle append, a last append or only append */
+ if (blobopen)
+ {
+ rc = KColumnBlobAppend (blob, append_start, cursor - append_start);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to append Blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+
+ break;
+ }
+ }
+ /* if we hit a NewLine and are within range we will close this blob */
+ if (eol)
+ {
+ if (blobopen)
+ {
+ /* single row blobs */
+ rc = KColumnBlobAssignRange (blob, rowid, 1);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to range assign blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ break;
+ }
+ rc = KColumnBlobCommit (blob);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to commit blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ break;
+ }
+ rc = KColumnBlobRelease (blob);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to release blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ break;
+ }
+ blobopen = false;
+ }
+ ++rowid;
+ if ( ! rowid_upper_range (rowid))
+ break;
+ }
+ }
+ }
+
+ /* if not in an error state and the last line was unterminated close the blob */
+ if ((rc == 0) && blobopen)
+ {
+ rc = KColumnBlobAssignRange (blob, rowid, 1);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to range assign blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ }
+ else
+ {
+ rc = KColumnBlobCommit (blob);
+ if (rc)
+ {
+ PLOGERR (klogFatal, (klogFatal, rc, "Failed to commit blob for row $(R) at $(P)",
+ PLOG_2(PLOG_U64(R),PLOG_U64(P)), rowid, tix));
+ }
+ }
+ KColumnBlobRelease (blob);
+ }
+ return rc;
+}
+
+void CC ascii_to_u64_error_handler ( const char * arg, void * data )
+{
+ rc_t * prc = data;
+ rc_t rc = RC (rcExe, rcNoTarg, rcParsing, rcParam, rcIncorrect);
+
+
+ PLOGERR (klogFatal, (klogFatal, rc, "numeric range option unparsable $(S)", PLOG_S(S), arg));
+ *prc = rc;
+}
+
+rc_t CC NextLogLevelCommon ( const char * level_parameter );
+
+rc_t CC KMain (int argc, char *argv [])
+{
+ Args * args;
+ rc_t rc;
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef));
+ if (rc == 0)
+ {
+ do
+ {
+ uint32_t pcount;
+
+ rc = ArgsParamCount (args, &pcount);
+ if (rc)
+ break;
+
+ switch (pcount)
+ {
+ case 0:
+ MiniUsage (args);
+ rc = 1;
+ break;
+
+ case 1:
+ rc = RC (rcExe, rcNoTarg, rcParsing, rcParam, rcNotFound);
+ LOGERR (klogFatal, rc, "Missing KColumn path");
+ MiniUsage (args);
+ break;
+
+ default:
+ rc = RC (rcExe, rcNoTarg, rcParsing, rcParam, rcExcessive);
+ LOGERR (klogFatal, rc, "Too many parameters");
+ MiniUsage (args);
+ break;
+
+ case 2:
+ break;
+ }
+ if (rc)
+ {
+ if (rc == 1)
+ rc = 0;
+ break;
+ }
+
+ rc = ArgsParamValue (args, 0, (const void **)&G.txtpath);
+ if (rc)
+ break;
+
+ rc = ArgsParamValue (args, 1, (const void **)&G.colpath);
+ if (rc)
+ break;
+
+ rc = ArgsOptionCount (args, OPTION_BEGIN, &pcount);
+ if (rc)
+ break;
+
+ if (pcount != 1)
+ G.begin_seen = false;
+ else
+ {
+ const char * pc;
+
+ rc = ArgsOptionValue (args, OPTION_BEGIN, 0, (const void **)&pc);
+ if (rc)
+ break;
+
+ G.begin = AsciiToU64 ( pc, ascii_to_u64_error_handler, &rc );
+
+ if (rc)
+ break;
+ G.begin_seen = true;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_END, &pcount);
+ if (rc)
+ break;
+
+ if (pcount != 1)
+ G.end_seen = false;
+ else
+ {
+ const char * pc;
+
+ rc = ArgsOptionValue (args, OPTION_END, 0, (const void **)&pc);
+ if (rc)
+ break;
+
+ G.end = AsciiToU64 (pc, ascii_to_u64_error_handler, &rc);
+ if (rc)
+ break;
+
+ G.end_seen = true;
+ }
+
+
+ if (G.begin_seen && G.end_seen && (G.end < G.begin))
+ {
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcParam, rcInvalid);
+ LOGERR (klogFatal, rc, "Conflicting options end before begin");
+ break;
+ }
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &pcount);
+ if (rc)
+ break;
+
+ G.force = (pcount != 0);
+
+ rc = ArgsOptionCount (args, OPTION_APPEND, &pcount);
+ if (rc)
+ break;
+
+ G.append = (pcount != 0);
+
+ if (G.force && G.append)
+ {
+ rc = RC (rcExe, rcNoTarg, rcAccessing, rcParam, rcInvalid);
+ LOGERR (klogFatal, rc, "Conflicting options force and append");
+ break;
+ }
+
+ /* handle the KFS interface */
+ rc = txt2kdb_kfs();
+
+ if (rc == 0)
+ rc = txt2kdb_io();
+
+ txt2kdb_release();
+
+
+ } while (0);
+ ArgsWhack (args);
+ }
+
+ STSMSG (1, ("exit txt2kdb %R\n", rc));
+ return rc;
+}
+
+
+/* end of file */
diff --git a/tools/util/unix/PrintOS.c b/tools/util/unix/PrintOS.c
new file mode 100644
index 0000000..019ca9c
--- /dev/null
+++ b/tools/util/unix/PrintOS.c
@@ -0,0 +1,66 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "test-sra-priv.h" /* PrintOS */
+
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/out.h> /* OUTMSG */
+
+#include <errno.h>
+#include <string.h> /* memset */
+#include <stdio.h> /* perror */
+
+#include <sys/utsname.h> /* uname */
+
+rc_t PrintOS(bool xml) {
+ int ret = 1;
+
+ struct utsname unameData;
+ memset(&unameData, 0, sizeof unameData);
+
+ errno = 0;
+ ret = uname(&unameData);
+ if (ret != 0) {
+ if (xml) {
+ OUTMSG((" <Os>"));
+ perror("uname returned : ");
+ OUTMSG(("</Os>\n"));
+ }
+ else {
+ perror("uname returned : ");
+ }
+
+ return 0;
+ }
+ else {
+ const char *b = xml ? " <Os>" : "Operating system: '";
+ const char *e = xml ? "</Os>" : "'\n";
+
+ return OUTMSG(("%s%s %s %s %s %s%s\n", b,
+ unameData.sysname, unameData.nodename, unameData.release,
+ unameData.version, unameData.machine, e));
+ }
+}
diff --git a/tools/util/unix/syspass.c b/tools/util/unix/syspass.c
new file mode 100644
index 0000000..b464f39
--- /dev/null
+++ b/tools/util/unix/syspass.c
@@ -0,0 +1,62 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#define __EXTENSIONS__ 1
+
+#include "syspass-priv.h" /* get_pass */
+
+#include <klib/rc.h>
+
+#include <string.h> /* strdup */
+
+#include <stdlib.h>
+#include <unistd.h> /* getpass */
+
+rc_t get_pass(const char *prompt, char *buf, size_t bufsiz) {
+ if (prompt == NULL || buf == NULL) {
+ return RC(rcExe, rcFunction, rcEvaluating, rcParam, rcNull);
+ }
+
+ if (bufsiz == 0)
+ { return 0; }
+
+ buf[0] = '\0';
+
+ {
+ const char *p = getpass(prompt);
+
+ if (p == NULL) {
+ return RC(rcExe, rcString, rcReading, rcFunction, rcFailed);
+ }
+ else if ((strlen(p) + 1) > bufsiz) {
+ return RC(rcExe, rcString, rcReading, rcBuffer, rcInsufficient);
+ }
+
+ strcpy(buf, p);
+
+ return 0;
+ }
+}
diff --git a/tools/util/vdb-lock.c b/tools/util/vdb-lock.c
new file mode 100644
index 0000000..05aabd0
--- /dev/null
+++ b/tools/util/vdb-lock.c
@@ -0,0 +1,154 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <sra/srapath.h>
+#include <vdb/manager.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <assert.h>
+
+const char UsageDefaultName[] = "vdb-lock";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+ return KOutMsg ( "\n"
+ "Usage:\n"
+ " %s [Options] <target>\n"
+ "\n"
+ "Summary:\n"
+ " Lock a VDB database, table or column.\n"
+ , progname
+ );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion () );
+
+ return rc;
+}
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args *args;
+ rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+ if ( rc != 0 )
+ LogErr ( klogErr, rc, "failed to parse arguments" );
+ else
+ {
+ uint32_t paramc;
+ rc = ArgsParamCount ( args, & paramc );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to obtain param count" );
+ else
+ {
+ if ( paramc == 0 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ LogErr ( klogErr, rc, "missing target object" );
+ MiniUsage ( args );
+ }
+ else if ( paramc > 1 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcExcessive );
+ LogErr ( klogErr, rc, "expected single target object" );
+ MiniUsage ( args );
+ }
+ else
+ {
+ const char *target;
+ rc = ArgsParamValue ( args, 0, (const void **)& target );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to obtain param value" );
+ else
+ {
+ VDBManager *mgr;
+
+#if TOOLS_USE_SRAPATH != 0
+ char full [ 4096 ];
+ SRAPath *sra_path;
+ rc = SRAPathMake ( & sra_path, NULL );
+ if ( rc == 0 )
+ {
+ if ( ! SRAPathTest ( sra_path, target ) )
+ {
+ rc = SRAPathFind ( sra_path, target, full, sizeof full );
+ if ( rc == 0 )
+ target = full;
+ }
+ SRAPathRelease ( sra_path );
+ }
+#endif
+
+ rc = VDBManagerMakeUpdate ( & mgr, NULL );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to open VDB manager" );
+ else
+ {
+ rc = VDBManagerLock ( mgr, "%s", target );
+ if ( rc == 0 )
+ pLogMsg ( klogInfo, "locked '$(target)'", "target=%s", target );
+ else switch ( GetRCState ( rc ) )
+ {
+ case rcLocked:
+ pLogMsg ( klogInfo, "'$(target)' was already locked", "target=%s", target );
+ break;
+ default:
+ pLogErr ( klogErr, rc, "failed to lock '$(target)'", "target=%s", target );
+ }
+
+ VDBManagerRelease ( mgr );
+ }
+ }
+ }
+ }
+
+ ArgsWhack ( args );
+ }
+
+ return rc;
+}
diff --git a/tools/util/vdb-passwd.c b/tools/util/vdb-passwd.c
new file mode 100644
index 0000000..c7ba944
--- /dev/null
+++ b/tools/util/vdb-passwd.c
@@ -0,0 +1,307 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "syspass-priv.h" /* get_pass */
+
+#include <kapp/main.h> /* KMain */
+
+#include <vfs/manager.h> /* VFSManager */
+#include <klib/log.h> /* LOGERR */
+#include <klib/out.h> /* OUTMSG */
+#include <klib/rc.h>
+
+#include <string.h> /* strcmp */
+#include <assert.h>
+#include <limits.h> /* PATH_MAX */
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+#if 0
+/******************************************************************************/
+static
+rc_t SetPwd(const char *password, bool no_prompt)
+{
+ rc_t rc = 0;
+
+ VFSManager *mgr = NULL;
+
+ assert(password);
+
+ if (rc == 0) {
+ rc = VFSManagerMake(&mgr);
+ DISP_RC(rc, "while calling VFSManagerMake");
+ }
+
+ if (rc == 0) {
+ char pwd_dir[PATH_MAX] = "";
+ rc = VFSManagerUpdateKryptoPassword
+ (mgr, password, strlen(password), pwd_dir, sizeof pwd_dir);
+ if (rc) {
+ if (no_prompt) {
+ LOGERR(klogInt, rc, "while updating the password");
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcDirectory, rcExcessive))
+ {
+ OUTMSG((
+ "\nSecurity warning:\n"
+ "Directory \"%s\" has excessive access permissions.\n"
+ "Run \"chmod 700 %s\" to repair\n"
+ "or ask your system administrator for assistance.\n",
+ pwd_dir, pwd_dir));
+ rc = 0;
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcSize, rcExcessive))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Password is too long.\n"
+ "Maximum password size is %ld.\n",
+ VFS_KRYPTO_PASSWORD_MAX_SIZE));
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcEncryptionKey, rcInvalid))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Invalid character in password\n"
+ "(CR/LF are not allowed)\n"));
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcPath, rcExcessive))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Cannot set the password.\n"
+ "Path to password file is too long.\n"
+ "Your configuration should be updated.\n"));
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcPath, rcIncorrect))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Cannot set the password.\n"
+ "Existing path to password is not a file.\n"
+ "Your configuration should be updated.\n"));
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcUpdating,
+ rcPath, rcCorrupt))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Cannot set the password.\n"
+ "Unknown file type for configured path/file name.\n"
+ "Your configuration should be updated.\n"));
+ }
+ else if (rc == SILENT_RC(rcVFS, rcEncryptionKey, rcWriting,
+ rcFile, rcInsufficient))
+ {
+ OUTMSG((
+ "\nError:\n"
+ "Incomplete writes to temporary password file.\n"
+ "Cannot set the password.\n"));
+ }
+ else {
+ OUTMSG(("\nCannot set the password. Please consult\n"
+ "configuration page at\n"
+ "https://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc&f=std or\n"
+ "https://github.com/ncbi/sra-tools/wiki/Toolkit-Configuration\n"));
+ }
+ }
+ }
+
+ RELEASE(VFSManager, mgr);
+
+ return rc;
+}
+
+#define PWD_SZ 1024
+
+static
+rc_t run(bool quiet)
+{
+ rc_t rc = 0;
+
+ char password[PWD_SZ] = "";
+
+ bool empty = false;
+
+ KWrtHandler handler;
+ handler.writer = KOutWriterGet();
+ handler.data = KOutDataGet();
+
+ KOutHandlerSetStdErr();
+ KLogLibHandlerSet(NULL, NULL);
+
+ OUTMSG(("Changing password\n"));
+
+#if 1
+ if (rc == 0) {
+ int i = 0;
+ for (i = 0; i < 3 && rc == 0; ++i) {
+ rc = get_pass("New password:", password, sizeof password);
+ DISP_RC(rc, "cannot read the password");
+ if (rc != 0) {
+ break;
+ }
+ if (password[0] == '\0') {
+ OUTMSG(("BAD PASSWORD: too short\n"));
+ }
+ else {
+ break;
+ }
+ }
+ if (rc == 0 && password[0] == '\0') {
+ rc = RC(rcExe, rcString, rcReading, rcString, rcIncorrect);
+ empty = true;
+ /* LOGERR(klogErr, rc, "failed to set password"); */
+ }
+ }
+
+ if (rc == 0) {
+ char repassword[PWD_SZ] = "";
+ rc = get_pass("Retype new password:", repassword, sizeof repassword);
+ DISP_RC(rc, "cannot read the password");
+ if (rc == 0) {
+ if (strcmp(password, repassword)) {
+ OUTMSG(("Sorry, passwords do not match.\n"));
+ rc = RC(rcExe, rcString, rcReading, rcString, rcInconsistent);
+ /* LOGERR(klogErr, rc, "failed to set password"); */
+ }
+ }
+ }
+
+#else
+ strcpy(password, "1n2");
+#endif
+
+ if (rc == 0) {
+ rc = SetPwd(password, quiet);
+ }
+
+ KOutHandlerSet(handler.writer, handler.data);
+
+ if (empty)
+ { rc = 0; }
+
+ return rc;
+}
+#endif
+#define SL_OPTION "noprompt"
+#define SL_ALIAS "n"
+static const char *SL_USAGE[]
+ = { "Do not suggest consulting configuration page at https://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc&f=std or https://github.com/ncbi/sra-tools/wiki/Toolkit-Configuration", NULL };
+
+OptDef Options[] = { { SL_OPTION, SL_ALIAS, NULL, SL_USAGE, 1, false, false } };
+
+const char UsageDefaultName[] = "vdb-passwd";
+
+rc_t CC UsageSummary(const char *progname) {
+ KOutMsg("Update user's NCBI VDB crypto password\n"
+ "If not run with --quiet recommendations\n"
+ "are given if errors are detected.\n"
+ "\n");
+
+ return 0;
+}
+
+rc_t CC Usage(const Args *args) {
+ UsageSummary(UsageDefaultName);
+
+ KOutMsg("Options:\n");
+ HelpOptionsStandard ();
+
+ HelpVersion(UsageDefaultName, KAppVersion());
+
+ return 0;
+}
+
+#if 0
+rc_t CC KMain(int argc, char *argv[]) {
+ Args *args;
+ rc_t rc; /*, orc; */
+
+ rc = ArgsMakeAndHandle(&args, argc, argv, 0);
+ if (rc == 0)
+ {
+ uint32_t pcount;
+ rc_t orc;
+
+ /* non standard use of --quiet */
+ rc = ArgsOptionCount(args, OPTION_QUIET, &pcount);
+ if (rc)
+ LOGERR(klogErr, rc, "error check " OPTION_QUIET " option");
+
+ else
+ rc = run (pcount != 0);
+
+ orc = ArgsWhack(args);
+ if (rc == 0)
+ rc = orc;
+ }
+
+ return rc;
+}
+#endif
+rc_t CC KMain(int argc, char *argv[]) {
+ OUTMSG((
+"WARNING: vdb-passwd IS OBSOLETE AND SHOULD NOT BE USED.\n"
+"\n"
+"\n"
+"To access dbGaP data you need:\n"
+"\n"
+"- Make sure you have the latest version of SRA Toolkit installed:\n"
+"https://github.com/ncbi/sra-tools/wiki/Downloads\n"
+"\n"
+"- Have permission to access controlled-access data for a dbGaP project;\n"
+"\n"
+"- Get dbGaP repository key (ngc file);\n"
+"\n"
+"- Import the dbGaP repository key to SRA Toolkit.\n"
+" It will set up the project's workspace directory.\n"
+"\n"
+"- Change directory to the project's workspace.\n"
+"\n"
+"N.B. MAKE SURE YOU DO NOT HAVE A VDB_PWFILE ENVIRONMENT VARIABLE SET !!!\n"
+"\n"
+"Now you should be able to work with encrypted data.\n"
+"The SRA Toolkit will work with encrypted SRA data files,\n"
+"there is no need to decrypt the read data.\n"
+"\n"
+"The complete instructions are:\n"
+"https://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc&f=dbgap_use\n"
+"\n"
+"Send questions/bug reports to sra-tools at ncbi.nlm.nih.gov\n"));
+ return RC(rcExe, rcProcess, rcExecuting, rcProcess, rcUnsupported);
+}
diff --git a/tools/util/vdb-unlock.c b/tools/util/vdb-unlock.c
new file mode 100644
index 0000000..7b3d336
--- /dev/null
+++ b/tools/util/vdb-unlock.c
@@ -0,0 +1,156 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <sra/srapath.h>
+#include <vdb/manager.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/rc.h>
+
+#include <assert.h>
+
+const char UsageDefaultName[] = "vdb-unlock";
+
+rc_t CC UsageSummary ( const char *progname )
+{
+ return KOutMsg ( "\n"
+ "Usage:\n"
+ " %s [Options] <target>\n"
+ "\n"
+ "Summary:\n"
+ " Unlock a VDB database, table or column.\n"
+ , progname
+ );
+}
+
+rc_t CC Usage ( const Args *args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args *args;
+ rc_t rc = ArgsMakeAndHandle ( & args, argc, argv, 0 );
+ if ( rc != 0 )
+ LogErr ( klogErr, rc, "failed to parse arguments" );
+ else
+ {
+ uint32_t paramc;
+ rc = ArgsParamCount ( args, & paramc );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to obtain param count" );
+ else
+ {
+ if ( paramc == 0 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcInsufficient );
+ LogErr ( klogErr, rc, "missing target object" );
+ MiniUsage ( args );
+ }
+ else if ( paramc > 1 )
+ {
+ rc = RC ( rcExe, rcArgv, rcParsing, rcParam, rcExcessive );
+ LogErr ( klogErr, rc, "expected single target object" );
+ MiniUsage ( args );
+ }
+ else
+ {
+ const char *target;
+ rc = ArgsParamValue ( args, 0, (const void **)& target );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to obtain param value" );
+ else
+ {
+ VDBManager *mgr;
+
+#if TOOLS_USE_SRAPATH != 0
+ char full [ 4096 ];
+ SRAPath *sra_path;
+ rc = SRAPathMake ( & sra_path, NULL );
+ if ( rc == 0 )
+ {
+ if ( ! SRAPathTest ( sra_path, target ) )
+ {
+ rc = SRAPathFind ( sra_path, target, full, sizeof full );
+ if ( rc == 0 )
+ target = full;
+ }
+ SRAPathRelease ( sra_path );
+ }
+#endif
+
+ rc = VDBManagerMakeUpdate ( & mgr, NULL );
+ if ( rc != 0 )
+ LogErr ( klogInt, rc, "failed to open VDB manager" );
+ else
+ {
+ rc = VDBManagerUnlock ( mgr, "%s", target );
+ if ( rc == 0 )
+ pLogMsg ( klogInfo, "unlocked '$(target)'", "target=%s", target );
+ else switch ( GetRCState ( rc ) )
+ {
+ case rcUnlocked:
+ pLogMsg ( klogInfo, "'$(target)' was already unlocked", "target=%s", target );
+ break;
+ default:
+ pLogErr ( klogErr, rc, "failed to unlock '$(target)'", "target=%s", target );
+ }
+
+ VDBManagerRelease ( mgr );
+ }
+ }
+ }
+ }
+
+ ArgsWhack ( args );
+ }
+
+ return rc;
+}
diff --git a/tools/util/win/PrintOS.c b/tools/util/win/PrintOS.c
new file mode 100644
index 0000000..ca1d402
--- /dev/null
+++ b/tools/util/win/PrintOS.c
@@ -0,0 +1,60 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../test-sra-priv.h" /* PrintOS */
+
+#include <klib/out.h> /* OUTMSG */
+
+#include <windows.h>
+
+rc_t PrintOS(bool xml) {
+ const char *b = xml ? " <Os>" : "Operating system: '";
+ const char *e = xml ? "</Os>" : "'\n";
+
+ OSVERSIONINFO osvi;
+ ZeroMemory(&osvi, sizeof osvi);
+ osvi.dwOSVersionInfoSize = sizeof osvi;
+
+ if (GetVersionEx(&osvi)) {
+ if (osvi.dwPlatformId == 2) {
+ return OUTMSG((
+ "%sMicrosoft Windows. Version %d.%d (Build %d: %s)%s\n", b,
+ osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber,
+ osvi.szCSDVersion, e));
+ }
+ else {
+ return OUTMSG((
+ "%sMicrosoft Windows. Version %d.%d (Build %d: %s). PlatformId %d%s\n",
+ b,
+ osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber,
+ osvi.szCSDVersion, osvi.dwPlatformId, e));
+ }
+ }
+ else {
+ return OUTMSG(("%sGetLastError(GetVersionEx()) = %d%s\n",
+ b, GetLastError(), e));
+ }
+}
diff --git a/tools/util/win/syspass.c b/tools/util/win/syspass.c
new file mode 100644
index 0000000..b6d943b
--- /dev/null
+++ b/tools/util/win/syspass.c
@@ -0,0 +1,53 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "../syspass-priv.h" /* get_pass */
+
+#include <klib/rc.h>
+
+#include <conio.h> /* _getch */
+#include <stdio.h>
+
+rc_t get_pass(const char *prompt, char *buf, size_t bufsiz) {
+ if (prompt == NULL || buf == NULL) {
+ return RC(rcExe, rcFunction, rcEvaluating, rcParam, rcNull);
+ }
+
+ fprintf(stderr, "%s", prompt);
+
+ {
+ size_t i = 0;
+ for (i = 0; i < bufsiz; ++i) {
+ buf[i] = _getch();
+ if (buf[i] == '\r') {
+ fprintf(stderr, "\r\n");
+ buf[i] = '\0';
+ return 0;
+ }
+ }
+ return RC(rcExe, rcString, rcReading, rcBuffer, rcInsufficient);
+ }
+}
diff --git a/tools/vcf-loader/.gitignore b/tools/vcf-loader/.gitignore
new file mode 100644
index 0000000..ec76f86
--- /dev/null
+++ b/tools/vcf-loader/.gitignore
@@ -0,0 +1 @@
+vcf-grammar.output
diff --git a/tools/vcf-loader/Makefile b/tools/vcf-loader/Makefile
new file mode 100644
index 0000000..3e02c52
--- /dev/null
+++ b/tools/vcf-loader/Makefile
@@ -0,0 +1,128 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vcf-loader
+
+INT_LIBS = \
+ libvcfloader
+
+ALL_LIBS = \
+ $(INT_LIBS) \
+ $(EXT_LIBS)
+
+EXT_TOOLS = \
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@
+
+$(INT_LIBS): makedirs
+ @ $(MAKE_CMD) $(ILIBDIR)/$@
+
+$(EXT_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+.PHONY: all std $(ALL_LIBS)
+
+#-------------------------------------------------------------------------------
+# std
+#
+$(TARGDIR)/std: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(EXT_TOOLS))
+
+.PHONY: $(TARGDIR)/std
+
+#-------------------------------------------------------------------------------
+# all
+#
+$(TARGDIR)/all: \
+ $(addprefix $(ILIBDIR)/,$(INT_LIBS)) \
+ $(addprefix $(LIBDIR)/,$(EXT_LIBS)) \
+ $(addprefix $(BINDIR)/,$(ALL_TOOLS))
+
+.PHONY: $(TARGDIR)/all
+
+#-------------------------------------------------------------------------------
+# clean
+#
+INTERM_SRC = \
+ $(SRCDIR)/vcf-lex.c \
+ $(SRCDIR)/vcf-grammar.c \
+ $(SRCDIR)/vcf-grammar.h
+
+clean: stdclean
+
+.PHONY: clean
+
+.PRECIOUS: $(INTERM_SRC)
+
+#-------------------------------------------------------------------------------
+# libvcfloader
+#
+$(ILIBDIR)/libvcfloader: $(ILIBDIR)/libvcfloader.$(LIBX)
+
+LIBVCF_SRC = \
+ vcf-grammar \
+ vcf-lex \
+ vcf-reader \
+ vcf-database
+
+# flex/bison should only be invoked manually in an environment ensures the correct versions:
+# bison 2.5, flex 2.5.35
+bison:
+ bison -o $(SRCDIR)/vcf-grammar.c --defines=$(SRCDIR)/vcf-grammar.h -v --no-lines $(SRCDIR)/vcf-grammar.y
+
+flex:
+ flex -t $(SRCDIR)/vcf-lex.l | grep -v '^#line' > $(SRCDIR)/vcf-lex.c
+
+$(SRCDIR)/vcf-grammar.c $(SRCDIR)/vcf-grammar.h: $(SRCDIR)/vcf-grammar.y
+
+LIBVCF_OBJ = \
+ $(addsuffix .$(LOBX),$(LIBVCF_SRC))
+
+LIBVCF_LIB = \
+
+$(ILIBDIR)/libvcfloader.$(SHLX): $(INTERM_SRC) $(LIBVCF_OBJ)
+ $(LD) --dlib -o $@ $^ $(LIBVCF_LIB)
+
+$(ILIBDIR)/libvcfloader.$(LIBX): $(INTERM_SRC) $(LIBVCF_OBJ)
+ $(LD) --slib -o $@ $^ $(LIBVCF_LIB)
+
diff --git a/tools/vcf-loader/vcf-database.c b/tools/vcf-loader/vcf-database.c
new file mode 100644
index 0000000..ac18c74
--- /dev/null
+++ b/tools/vcf-loader/vcf-database.c
@@ -0,0 +1,168 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "vcf-database.h"
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <align/writer-reference.h>
+
+#include "vcf-reader.h"
+
+static rc_t SaveVariants ( const VcfReader* reader, const char configPath[], VDatabase* db, VDBManager* dbMgr );
+static rc_t SaveVariantPhases ( const VcfReader* reader, VDatabase* db, VDBManager* dbMgr );
+static rc_t SaveAlignments ( const VcfReader* reader, VDatabase* db, VDBManager* dbMgr );
+
+rc_t VcfDatabaseSave ( const struct VcfReader* reader, const char configPath[], VDatabase* db )
+{
+ VDBManager* dbMgr;
+ rc_t rc = VDatabaseOpenManagerUpdate(db, &dbMgr);
+ if (rc == 0)
+ {
+ rc_t rc2;
+
+ rc = SaveVariants(reader, configPath, db, dbMgr);
+ if (rc == 0)
+ rc = SaveVariantPhases(reader, db, dbMgr);
+ if (rc == 0)
+ rc = SaveAlignments(reader, db, dbMgr);
+
+ rc2 = VDBManagerRelease(dbMgr);
+ if (rc == 0)
+ rc = rc2;
+ }
+ return rc;
+}
+
+rc_t SaveVariants( const VcfReader* reader, const char configPath[], VDatabase* db, VDBManager* dbMgr )
+{
+ VTable* tbl;
+ rc_t rc = VDatabaseCreateTable(db, &tbl, "VARIANT", kcmCreate | kcmMD5, "VARIANT");
+ if (rc == 0)
+ {
+ rc_t rc2;
+ VCursor *cur;
+ rc = VTableCreateCursorWrite( tbl, &cur, kcmInsert );
+ if (rc == 0)
+ {
+ uint32_t ref_id_idx, position_idx, length_idx, sequence_idx;
+ rc = VCursorAddColumn( cur, &ref_id_idx, "ref_id" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &position_idx, "position" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &length_idx, "length" );
+ if (rc == 0) rc = VCursorAddColumn( cur, &sequence_idx, "sequence" );
+
+ if (rc == 0)
+ {
+ rc = VCursorOpen( cur );
+ if (rc == 0)
+ {
+ uint32_t count;
+ rc_t rc = VcfReaderGetDataLineCount(reader, &count);
+ if (rc == 0)
+ {
+ const ReferenceMgr* refMgr;
+ rc = ReferenceMgr_Make(&refMgr, db, dbMgr, 0, configPath, NULL, 0, 0, 0);
+ if (rc == 0)
+ {
+ uint32_t i;
+ for (i = 0; i < count; ++i)
+ {
+ const VcfDataLine* line;
+ rc = VcfReaderGetDataLine(reader, i, &line);
+
+ if (rc == 0)
+ {
+ const ReferenceSeq* seq;
+ #define MAX_CHROMOSOME_NAME_LENGTH 1024
+ char chromName[MAX_CHROMOSOME_NAME_LENGTH];
+ bool shouldUnmap = false;
+ bool wasRenamed = false;
+ string_copy(chromName, sizeof(chromName), line->chromosome.addr, line->chromosome.size);
+ rc = (ReferenceMgr_GetSeq(refMgr, &seq, chromName, &shouldUnmap, true, &wasRenamed));
+ if (rc == 0)
+ {
+ int64_t ref_id;
+ INSDC_coord_zero ref_start;
+ assert(shouldUnmap == false);
+ rc = ReferenceSeq_TranslateOffset_int(seq, line->position, &ref_id, &ref_start, NULL);
+ if (rc == 0)
+ {
+ rc = VCursorOpenRow( cur );
+
+ if (rc == 0)
+ rc = VCursorWrite( cur, ref_id_idx, sizeof(ref_id) * 8, &ref_id, 0, 1);
+ if (rc == 0)
+ rc = VCursorWrite( cur, position_idx, sizeof(ref_start) * 8, &ref_start, 0, 1);
+ if (rc == 0)
+ rc = VCursorWrite( cur, length_idx, sizeof(line->altBases.len) * 8, &line->altBases.len, 0, 1);
+ if (rc == 0)
+ rc = VCursorWrite( cur, sequence_idx, line->altBases.len * 8, line->altBases.addr, 0, 1);
+ }
+ rc2 = ReferenceSeq_Release(seq);
+ if (rc == 0)
+ rc = rc2;
+ }
+ if (rc == 0) rc = VCursorCommitRow( cur );
+ if (rc == 0) rc = VCursorCloseRow( cur );
+ }
+ if (rc != 0)
+ break;
+ }
+ rc2 = ReferenceMgr_Release(refMgr, rc == 0, NULL, false, NULL);
+ if (rc == 0)
+ rc = rc2;
+ }
+ }
+ if (rc == 0)
+ rc = VCursorCommit( cur );
+ }
+ }
+ rc2 = VCursorRelease(cur);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ rc2 = VTableRelease(tbl);
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ return rc;
+}
+
+rc_t SaveVariantPhases( const VcfReader* reader, VDatabase* db, VDBManager* dbMgr )
+{
+ return 0;
+}
+
+rc_t SaveAlignments( const VcfReader* reader, VDatabase* db, VDBManager* dbMgr )
+{
+ return 0;
+}
+
diff --git a/tools/vcf-loader/vcf-database.h b/tools/vcf-loader/vcf-database.h
new file mode 100644
index 0000000..fb3bb4c
--- /dev/null
+++ b/tools/vcf-loader/vcf-database.h
@@ -0,0 +1,40 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_vcf_database_
+#define _h_vcf_database_
+
+#include <klib/rc.h>
+
+struct VcfReader;
+struct VDatabase;
+
+/*
+ * Save into a database
+ */
+extern rc_t VcfDatabaseSave ( const struct VcfReader* reader, const char configPath[], struct VDatabase* db );
+
+#endif /* _h_vcf_database_ */
diff --git a/tools/vcf-loader/vcf-grammar.c b/tools/vcf-loader/vcf-grammar.c
new file mode 100644
index 0000000..16f6e3a
--- /dev/null
+++ b/tools/vcf-loader/vcf-grammar.c
@@ -0,0 +1,1686 @@
+/* A Bison parser, made by GNU Bison 2.5. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.5"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names. */
+#define yyparse VCF_parse
+#define yylex VCF_lex
+#define yyerror VCF_error
+#define yylval VCF_lval
+#define yychar VCF_char
+#define yydebug VCF_debug
+#define yynerrs VCF_nerrs
+
+
+/* Copy the first part of user declarations. */
+
+
+ #include "vcf-parse.h"
+
+ #define YYSTYPE VCFToken
+ #define YYLEX_PARAM pb->scanner
+ #define YYDEBUG 1
+
+ #include "vcf-grammar.h"
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 1
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ vcfENDOFTEXT = 0,
+ vcfMETAKEY_FORMAT = 258,
+ vcfMETAKEY = 259,
+ vcfMETAVALUE = 260,
+ vcfHEADERITEM = 261,
+ vcfDATAITEM = 262,
+ vcfENDLINE = 263
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations. */
+
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+ int yyi;
+#endif
+{
+ return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 6
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 28
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 13
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 14
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 23
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 41
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 263
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 12, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 10, 9, 11, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint8 yyprhs[] =
+{
+ 0, 0, 3, 9, 11, 12, 17, 19, 20, 22,
+ 25, 30, 31, 39, 41, 45, 49, 52, 54, 57,
+ 59, 62, 65, 67
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int8 yyrhs[] =
+{
+ 14, 0, -1, 15, 16, 22, 24, 0, -1, 1,
+ -1, -1, 3, 9, 5, 8, -1, 17, -1, -1,
+ 18, -1, 17, 18, -1, 4, 9, 5, 8, -1,
+ -1, 4, 9, 10, 19, 20, 11, 8, -1, 21,
+ -1, 20, 12, 21, -1, 4, 9, 5, -1, 23,
+ 8, -1, 6, -1, 23, 6, -1, 25, -1, 24,
+ 25, -1, 26, 8, -1, 7, -1, 26, 7, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const yytype_uint8 yyrline[] =
+{
+ 0, 54, 54, 61, 63, 67, 71, 72, 76, 77,
+ 81, 82, 82, 86, 87, 91, 95, 99, 100, 104,
+ 105, 109, 113, 114
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "vcfENDOFTEXT", "error", "$undefined", "vcfMETAKEY_FORMAT",
+ "vcfMETAKEY", "vcfMETAVALUE", "vcfHEADERITEM", "vcfDATAITEM",
+ "vcfENDLINE", "'='", "'<'", "'>'", "','", "$accept", "vcfFile",
+ "fileFormatLine", "metaLinesOpt", "metaLines", "metaLine", "$@1",
+ "keyValuePairs", "keyValue", "headerLine", "headerItems", "dataLines",
+ "dataLine", "dataItems", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 61,
+ 60, 62, 44
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 13, 14, 14, 14, 15, 16, 16, 17, 17,
+ 18, 19, 18, 20, 20, 21, 22, 23, 23, 24,
+ 24, 25, 26, 26
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 5, 1, 0, 4, 1, 0, 1, 2,
+ 4, 0, 7, 1, 3, 3, 2, 1, 2, 1,
+ 2, 2, 1, 2
+};
+
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint8 yydefact[] =
+{
+ 0, 3, 0, 0, 7, 0, 1, 0, 0, 6,
+ 8, 0, 0, 17, 0, 0, 9, 5, 0, 11,
+ 22, 0, 19, 0, 18, 16, 10, 0, 2, 20,
+ 23, 21, 0, 0, 13, 0, 0, 0, 15, 12,
+ 14
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ -1, 3, 4, 8, 9, 10, 27, 33, 34, 14,
+ 15, 21, 22, 23
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -14
+static const yytype_int8 yypact[] =
+{
+ 2, -14, -5, 8, 6, 9, -14, 10, 11, 6,
+ -14, 12, -4, -14, 14, 3, -14, -14, 15, -14,
+ -14, 0, -14, 5, -14, -14, -14, 18, -14, -14,
+ -14, -14, 16, 4, -14, 13, 19, 18, -14, -14,
+ -14
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -14, -14, -14, -14, -14, 17, -14, -14, -13, -14,
+ -14, -14, 7, -14
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -5
+static const yytype_int8 yytable[] =
+{
+ 28, 18, -4, 1, 5, 2, 19, 20, 6, 24,
+ 7, 25, 30, 31, 11, 36, 37, 13, 38, 12,
+ 17, 20, 32, 26, 40, 35, 16, 39, 29
+};
+
+#define yypact_value_is_default(yystate) \
+ ((yystate) == (-14))
+
+#define yytable_value_is_error(yytable_value) \
+ YYID (0)
+
+static const yytype_uint8 yycheck[] =
+{
+ 0, 5, 0, 1, 9, 3, 10, 7, 0, 6,
+ 4, 8, 7, 8, 5, 11, 12, 6, 5, 9,
+ 8, 7, 4, 8, 37, 9, 9, 8, 21
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 1, 3, 14, 15, 9, 0, 4, 16, 17,
+ 18, 5, 9, 6, 22, 23, 18, 8, 5, 10,
+ 7, 24, 25, 26, 6, 8, 8, 19, 0, 25,
+ 7, 8, 4, 20, 21, 9, 11, 12, 5, 8,
+ 21
+};
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. However,
+ YYFAIL appears to be in use. Nevertheless, it is formally deprecated
+ in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+ discussed. */
+
+#define YYFAIL goto yyerrlab
+#if defined YYFAIL
+ /* This is here to suppress warnings from the GCC cpp's
+ -Wunused-macros. Normally we don't worry about that warning, but
+ some users do, and we want to make it easy for users to remove
+ YYFAIL uses, which will produce warnings from Bison 2.5. */
+#endif
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (pb, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
+
+
+/* This macro is provided for backward compatibility. */
+
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, pb)
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value, pb); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, VCFParseBlock* pb)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ VCFParseBlock* pb;
+#endif
+{
+ if (!yyvaluep)
+ return;
+ YYUSE (pb);
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, VCFParseBlock* pb)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, pb)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+ VCFParseBlock* pb;
+#endif
+{
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, pb);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+ yytype_int16 *yybottom;
+ yytype_int16 *yytop;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, VCFParseBlock* pb)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, pb)
+ YYSTYPE *yyvsp;
+ int yyrule;
+ VCFParseBlock* pb;
+#endif
+{
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ , pb);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule, pb); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+ about the unexpected token YYTOKEN for the state stack whose top is
+ YYSSP.
+
+ Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
+ not large enough to hold the message. In that case, also set
+ *YYMSG_ALLOC to the required number of bytes. Return 2 if the
+ required number of bytes is too large to store. */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+ yytype_int16 *yyssp, int yytoken)
+{
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ /* Internationalized format string. */
+ const char *yyformat = 0;
+ /* Arguments of yyformat. */
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ /* Number of reported tokens (one for the "unexpected", one per
+ "expected"). */
+ int yycount = 0;
+
+ /* There are many possibilities here to consider:
+ - Assume YYFAIL is not used. It's too flawed to consider. See
+ <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+ for details. YYERROR is fine as it does not invoke this
+ function.
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+ tokens because there are none.
+ - The only way there can be no lookahead present (in yychar) is if
+ this state is a consistent state with a default action. Thus,
+ detecting the absence of a lookahead is sufficient to determine
+ that there is no unexpected or expected token to report. In that
+ case, just report a simple "syntax error".
+ - Don't assume there isn't a lookahead just because this state is a
+ consistent state with a default action. There might have been a
+ previous inconsistent state, consistent state with a non-default
+ action, or user semantic action that manipulated yychar.
+ - Of course, the expected token list depends on states to have
+ correct lookahead information, and it depends on the parser not
+ to perform extra reductions after fetching a lookahead from the
+ scanner and before detecting a syntax error. Thus, state merging
+ (from LALR or IELR) and default reductions corrupt the expected
+ token list. However, the list is correct for canonical LR with
+ one exception: it will still contain any token that will not be
+ accepted due to an error action in a later state.
+ */
+ if (yytoken != YYEMPTY)
+ {
+ int yyn = yypact[*yyssp];
+ yyarg[yycount++] = yytname[yytoken];
+ if (!yypact_value_is_default (yyn))
+ {
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. In other words, skip the first -YYN actions for
+ this state because they are default actions. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yyx;
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+ && !yytable_value_is_error (yytable[yyx + yyn]))
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ if (! (yysize <= yysize1
+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+ }
+ }
+ }
+
+ switch (yycount)
+ {
+# define YYCASE_(N, S) \
+ case N: \
+ yyformat = S; \
+ break
+ YYCASE_(0, YY_("syntax error"));
+ YYCASE_(1, YY_("syntax error, unexpected %s"));
+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+ }
+
+ yysize1 = yysize + yystrlen (yyformat);
+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+ return 2;
+ yysize = yysize1;
+
+ if (*yymsg_alloc < yysize)
+ {
+ *yymsg_alloc = 2 * yysize;
+ if (! (yysize <= *yymsg_alloc
+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+ return 1;
+ }
+
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ {
+ char *yyp = *yymsg;
+ int yyi = 0;
+ while ((*yyp = *yyformat) != '\0')
+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyformat += 2;
+ }
+ else
+ {
+ yyp++;
+ yyformat++;
+ }
+ }
+ return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, VCFParseBlock* pb)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, pb)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+ VCFParseBlock* pb;
+#endif
+{
+ YYUSE (yyvaluep);
+ YYUSE (pb);
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (VCFParseBlock* pb);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (VCFParseBlock* pb)
+#else
+int
+yyparse (pb)
+ VCFParseBlock* pb;
+#endif
+#endif
+{
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+ /* Number of syntax errors so far. */
+ int yynerrs;
+
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+ `yyss': related to states.
+ `yyvs': related to semantic values.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs;
+ YYSTYPE *yyvsp;
+
+ YYSIZE_T yystacksize;
+
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ yytoken = 0;
+ yyss = yyssa;
+ yyvs = yyvsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+
+ { return 1; }
+ break;
+
+ case 3:
+
+ { return 0; }
+ break;
+
+ case 4:
+
+ { yyerror(pb, "no input found"); return 0; }
+ break;
+
+ case 5:
+
+ { pb->metaLine(pb, & (yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)])); }
+ break;
+
+ case 10:
+
+ { pb->metaLine(pb, & (yyvsp[(1) - (4)]), &(yyvsp[(3) - (4)])); }
+ break;
+
+ case 11:
+
+ { pb->openMetaLine(pb, &(yyvsp[(1) - (3)])); }
+ break;
+
+ case 12:
+
+ { pb->closeMetaLine(pb); }
+ break;
+
+ case 15:
+
+ { pb->keyValue(pb, & (yyvsp[(1) - (3)]), &(yyvsp[(3) - (3)])); }
+ break;
+
+ case 17:
+
+ { pb->headerItem(pb, & (yyvsp[(1) - (1)])); }
+ break;
+
+ case 18:
+
+ { pb->headerItem(pb, & (yyvsp[(2) - (2)])); }
+ break;
+
+ case 21:
+
+ { pb->closeDataLine(pb); }
+ break;
+
+ case 22:
+
+ { pb->openDataLine(pb); pb->dataItem(pb, & (yyvsp[(1) - (1)])); }
+ break;
+
+ case 23:
+
+ { pb->dataItem(pb, & (yyvsp[(2) - (2)])); }
+ break;
+
+
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (pb, YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+ yyssp, yytoken)
+ {
+ char const *yymsgp = YY_("syntax error");
+ int yysyntax_error_status;
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ if (yysyntax_error_status == 0)
+ yymsgp = yymsg;
+ else if (yysyntax_error_status == 1)
+ {
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+ if (!yymsg)
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ yysyntax_error_status = 2;
+ }
+ else
+ {
+ yysyntax_error_status = YYSYNTAX_ERROR;
+ yymsgp = yymsg;
+ }
+ }
+ yyerror (pb, yymsgp);
+ if (yysyntax_error_status == 2)
+ goto yyexhaustedlab;
+ }
+# undef YYSYNTAX_ERROR
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, pb);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp, pb);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (pb, YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, pb);
+ }
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp, pb);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+
+
+
+
+
+void VCF_error(struct VCFParseBlock* pb, const char* msg)
+{
+ if (pb && pb->error)
+ pb->error(pb, msg);
+}
+
diff --git a/tools/vcf-loader/vcf-grammar.h b/tools/vcf-loader/vcf-grammar.h
new file mode 100644
index 0000000..f64e939
--- /dev/null
+++ b/tools/vcf-loader/vcf-grammar.h
@@ -0,0 +1,61 @@
+/* A Bison parser, made by GNU Bison 2.5. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ vcfENDOFTEXT = 0,
+ vcfMETAKEY_FORMAT = 258,
+ vcfMETAKEY = 259,
+ vcfMETAVALUE = 260,
+ vcfHEADERITEM = 261,
+ vcfDATAITEM = 262,
+ vcfENDLINE = 263
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
diff --git a/tools/vcf-loader/vcf-grammar.y b/tools/vcf-loader/vcf-grammar.y
new file mode 100644
index 0000000..03d20b6
--- /dev/null
+++ b/tools/vcf-loader/vcf-grammar.y
@@ -0,0 +1,123 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include "vcf-parse.h"
+
+ #define YYSTYPE VCFToken
+ #define YYLEX_PARAM pb->scanner
+ #define YYDEBUG 1
+
+ #include "vcf-grammar.h"
+%}
+
+%pure-parser
+%parse-param {VCFParseBlock* pb }
+%lex-param {VCFParseBlock* pb }
+%error-verbose
+%name-prefix="VCF_"
+
+%token vcfMETAKEY_FORMAT
+%token vcfMETAKEY
+%token vcfMETAVALUE
+%token vcfHEADERITEM
+%token vcfDATAITEM
+%token vcfENDLINE
+%token vcfENDOFTEXT 0
+
+%%
+
+vcfFile:
+ fileFormatLine
+ metaLinesOpt
+ headerLine
+ dataLines
+ vcfENDOFTEXT
+ { return 1; }
+ |
+ error { return 0; }
+ |
+ { yyerror(pb, "no input found"); return 0; }
+ ;
+
+fileFormatLine:
+ vcfMETAKEY_FORMAT '=' vcfMETAVALUE vcfENDLINE { pb->metaLine(pb, & $1, &$3); }
+ ;
+
+metaLinesOpt:
+ metaLines
+ |
+ ;
+
+metaLines:
+ metaLine
+ | metaLines metaLine
+ ;
+
+metaLine:
+ vcfMETAKEY '=' vcfMETAVALUE vcfENDLINE { pb->metaLine(pb, & $1, &$3); }
+ | vcfMETAKEY '=' '<' { pb->openMetaLine(pb, &$1); } keyValuePairs '>' vcfENDLINE { pb->closeMetaLine(pb); }
+ ;
+
+keyValuePairs:
+ keyValue
+ | keyValuePairs ',' keyValue
+ ;
+
+keyValue:
+ vcfMETAKEY '=' vcfMETAVALUE { pb->keyValue(pb, & $1, &$3); }
+ ;
+
+headerLine:
+ headerItems vcfENDLINE
+ ;
+
+headerItems:
+ vcfHEADERITEM { pb->headerItem(pb, & $1); }
+ | headerItems vcfHEADERITEM { pb->headerItem(pb, & $2); }
+ ;
+
+dataLines:
+ dataLine
+ | dataLines dataLine
+ ;
+
+dataLine:
+ dataItems vcfENDLINE { pb->closeDataLine(pb); }
+ ;
+
+dataItems:
+ vcfDATAITEM { pb->openDataLine(pb); pb->dataItem(pb, & $1); }
+ | dataItems vcfDATAITEM { pb->dataItem(pb, & $2); }
+ ;
+
+%%
+
+void VCF_error(struct VCFParseBlock* pb, const char* msg)
+{
+ if (pb && pb->error)
+ pb->error(pb, msg);
+}
diff --git a/tools/vcf-loader/vcf-lex.c b/tools/vcf-loader/vcf-lex.c
new file mode 100644
index 0000000..356a517
--- /dev/null
+++ b/tools/vcf-loader/vcf-lex.c
@@ -0,0 +1,2528 @@
+
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+/* %not-for-header */
+
+/* %if-c-only */
+/* %if-not-reentrant */
+/* %endif */
+/* %endif */
+/* %ok-for-header */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* %if-c++-only */
+/* %endif */
+
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c-only */
+
+/* %endif */
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+/* %if-c-only */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+/* %endif */
+
+/* %if-tables-serialization */
+/* %endif */
+/* end standard C headers. */
+
+/* %if-c-or-c++ */
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* %not-for-header */
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+/* %ok-for-header */
+
+/* %not-for-header */
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+/* %ok-for-header */
+
+/* %if-reentrant */
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* %endif */
+
+/* %if-not-reentrant */
+/* %endif */
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE VCF_restart(yyin ,yyscanner )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+/* %if-not-reentrant */
+/* %endif */
+
+/* %if-c-only */
+/* %if-not-reentrant */
+/* %endif */
+/* %endif */
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+ * access to the local variable yy_act. Since yyless() is a macro, it would break
+ * existing scanners that call yyless() from OUTSIDE VCF_lex.
+ * One obvious solution it to make yy_act a global. I tried that, and saw
+ * a 5% performance hit in a non-yylineno scanner, because yy_act is
+ * normally declared as a register variable-- so it is not worth it.
+ */
+ #define YY_LESS_LINENO(n) \
+ do { \
+ int yyl;\
+ for ( yyl = n; yyl < yyleng; ++yyl )\
+ if ( yytext[yyl] == '\n' )\
+ --yylineno;\
+ }while(0)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+/* %if-c-only */
+ FILE *yy_input_file;
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via VCF_restart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* %if-c-only Standard (non-C++) definition */
+/* %not-for-header */
+
+/* %if-not-reentrant */
+/* %endif */
+/* %ok-for-header */
+
+/* %endif */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+/* %if-c-only Standard (non-C++) definition */
+
+/* %if-not-reentrant */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %endif */
+
+void VCF_restart (FILE *input_file ,yyscan_t yyscanner );
+void VCF__switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+YY_BUFFER_STATE VCF__create_buffer (FILE *file,int size ,yyscan_t yyscanner );
+void VCF__delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void VCF__flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void VCF_push_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+void VCF_pop_buffer_state (yyscan_t yyscanner );
+
+static void VCF_ensure_buffer_stack (yyscan_t yyscanner );
+static void VCF__load_buffer_state (yyscan_t yyscanner );
+static void VCF__init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
+
+#define YY_FLUSH_BUFFER VCF__flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+
+YY_BUFFER_STATE VCF__scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
+YY_BUFFER_STATE VCF__scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
+YY_BUFFER_STATE VCF__scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
+
+/* %endif */
+
+void *VCF_alloc (yy_size_t ,yyscan_t yyscanner );
+void *VCF_realloc (void *,yy_size_t ,yyscan_t yyscanner );
+void VCF_free (void * ,yyscan_t yyscanner );
+
+#define yy_new_buffer VCF__create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ VCF_ensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ VCF__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ VCF_ensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ VCF__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* %% [1.0] yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here */
+/* Begin user sect3 */
+
+#define VCF_wrap(n) 1
+#define YY_SKIP_YYWRAP
+
+#define FLEX_DEBUG
+
+typedef unsigned char YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+/* %if-c-only Standard (non-C++) definition */
+
+static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner);
+static int yy_get_next_buffer (yyscan_t yyscanner );
+static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
+
+/* %endif */
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+/* %% [2.0] code to fiddle yytext and yyleng for yymore() goes here \ */\
+ yyleng = (int) ((size_t) (yy_cp - yy_bp)); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+/* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
+ yyg->yy_c_buf_p = yy_cp;
+
+/* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
+#define YY_NUM_RULES 17
+#define YY_END_OF_BUFFER 18
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[57] =
+ { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 18, 15, 11, 12, 15, 3, 3, 3,
+ 3, 2, 15, 4, 15, 15, 8, 8, 10, 10,
+ 10, 14, 13, 3, 3, 1, 16, 4, 0, 6,
+ 0, 8, 10, 10, 9, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 5, 1, 1, 1, 1, 1,
+ 1, 1, 1, 6, 7, 1, 1, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 1, 1, 8,
+ 9, 6, 1, 1, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 1, 1, 1, 1, 7, 1, 10, 7, 7, 7,
+
+ 11, 12, 7, 7, 13, 7, 7, 14, 15, 7,
+ 16, 7, 7, 17, 7, 18, 7, 7, 7, 7,
+ 7, 7, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[19] =
+ { 0,
+ 1, 2, 3, 3, 1, 4, 5, 4, 6, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5
+ } ;
+
+static yyconst flex_int16_t yy_base[71] =
+ { 0,
+ 0, 3, 7, 10, 13, 16, 20, 0, 37, 45,
+ 54, 0, 148, 177, 177, 177, 134, 0, 0, 0,
+ 71, 131, 0, 0, 88, 67, 0, 0, 0, 0,
+ 80, 177, 177, 0, 0, 177, 0, 0, 87, 87,
+ 36, 0, 0, 89, 177, 177, 33, 74, 68, 34,
+ 78, 43, 70, 83, 70, 177, 98, 104, 110, 116,
+ 122, 128, 134, 140, 146, 152, 154, 160, 165, 170
+ } ;
+
+static yyconst flex_int16_t yy_def[71] =
+ { 0,
+ 57, 58, 59, 59, 60, 60, 56, 7, 61, 61,
+ 56, 11, 56, 56, 56, 56, 62, 63, 63, 63,
+ 64, 56, 65, 66, 67, 67, 68, 68, 69, 69,
+ 70, 56, 56, 63, 63, 56, 65, 66, 67, 56,
+ 67, 68, 69, 70, 56, 56, 67, 67, 67, 67,
+ 67, 67, 67, 67, 56, 0, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56
+ } ;
+
+static yyconst flex_int16_t yy_nxt[196] =
+ { 0,
+ 56, 15, 16, 17, 19, 20, 21, 22, 15, 16,
+ 17, 15, 16, 17, 15, 16, 17, 15, 16, 17,
+ 14, 15, 16, 17, 14, 14, 25, 14, 14, 25,
+ 25, 26, 25, 25, 25, 25, 25, 25, 28, 16,
+ 17, 40, 40, 48, 40, 14, 28, 16, 17, 47,
+ 51, 40, 53, 14, 29, 30, 16, 17, 29, 14,
+ 31, 14, 14, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 32, 33, 32, 40, 40, 46, 40, 41,
+ 43, 43, 40, 50, 43, 49, 40, 54, 45, 43,
+ 43, 55, 52, 43, 46, 40, 40, 45, 14, 14,
+
+ 14, 14, 14, 14, 18, 18, 18, 18, 18, 18,
+ 23, 23, 23, 23, 23, 23, 24, 24, 24, 24,
+ 24, 24, 27, 27, 27, 27, 27, 27, 32, 32,
+ 32, 32, 32, 32, 34, 36, 33, 34, 34, 34,
+ 35, 35, 35, 35, 35, 35, 37, 56, 56, 37,
+ 37, 37, 38, 56, 56, 38, 38, 38, 39, 39,
+ 42, 42, 56, 42, 42, 43, 43, 56, 56, 43,
+ 44, 44, 56, 56, 44, 44, 13, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56
+
+ } ;
+
+static yyconst flex_int16_t yy_chk[196] =
+ { 0,
+ 0, 1, 1, 1, 2, 2, 2, 2, 3, 3,
+ 3, 4, 4, 4, 5, 5, 5, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 9, 9,
+ 9, 47, 50, 47, 41, 9, 10, 10, 10, 41,
+ 50, 52, 52, 10, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 21, 21, 21, 26, 49, 55, 53, 26,
+ 31, 31, 48, 49, 31, 48, 51, 53, 31, 44,
+ 44, 54, 51, 44, 40, 39, 25, 44, 57, 57,
+
+ 57, 57, 57, 57, 58, 58, 58, 58, 58, 58,
+ 59, 59, 59, 59, 59, 59, 60, 60, 60, 60,
+ 60, 60, 61, 61, 61, 61, 61, 61, 62, 62,
+ 62, 62, 62, 62, 63, 22, 17, 63, 63, 63,
+ 64, 64, 64, 64, 64, 64, 65, 13, 0, 65,
+ 65, 65, 66, 0, 0, 66, 66, 66, 67, 67,
+ 68, 68, 0, 68, 68, 69, 69, 0, 0, 69,
+ 70, 70, 0, 0, 70, 70, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56
+
+ } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[18] =
+ { 0,
+0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, };
+
+static yyconst flex_int16_t yy_rule_linenum[17] =
+ { 0,
+ 73, 74, 76, 78, 80, 81, 82, 86, 90, 91,
+ 96, 97, 98, 99, 100, 103
+ } ;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+ #include "vcf-parse.h"
+ #include "vcf-grammar.h"
+
+ #define YYSTYPE VCFToken
+
+ /* code to populate token with internal values */
+ #define YY_USER_ACTION \
+ yylval -> tokenText = yytext; \
+ yylval -> tokenStart = yyextra->offset; \
+ yylval -> tokenLength = yyleng; \
+ yylval -> line_no = yylineno; \
+ yylval -> column_no = yyextra -> column; \
+ yyextra -> lastToken = yylval; \
+ yyextra -> offset += yyleng; \
+ yyextra -> column += yyleng;
+
+ #define ENDLINE \
+ yyextra -> column=1; \
+ return vcfENDLINE;
+
+ #define YY_INPUT(buf, result, max_size) \
+ result = (int) yyextra->input(yyextra, buf, max_size)
+
+ #define ECHO
+
+ #define YY_NO_INPUT
+#define YY_NO_UNISTD_H 1
+
+
+
+
+
+
+#define INITIAL 0
+#define HEADER 1
+#define DATA 2
+#define META 3
+#define META_SIMPLE 4
+#define META_COMPOSITE 5
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+/* %if-c-only */
+#include <unistd.h>
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+#endif
+
+#define YY_EXTRA_TYPE VCFParseBlock*
+
+/* %if-c-only Reentrant structure and macros (non-C++). */
+/* %if-reentrant */
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+/* %if-c-only */
+
+static int yy_init_globals (yyscan_t yyscanner );
+
+/* %endif */
+
+/* %if-reentrant */
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int VCF_lex_init (yyscan_t* scanner);
+
+int VCF_lex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
+
+/* %endif */
+
+/* %endif End reentrant structures and macros. */
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int VCF_lex_destroy (yyscan_t yyscanner );
+
+int VCF_get_debug (yyscan_t yyscanner );
+
+void VCF_set_debug (int debug_flag ,yyscan_t yyscanner );
+
+YY_EXTRA_TYPE VCF_get_extra (yyscan_t yyscanner );
+
+void VCF_set_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
+
+FILE *VCF_get_in (yyscan_t yyscanner );
+
+void VCF_set_in (FILE * in_str ,yyscan_t yyscanner );
+
+FILE *VCF_get_out (yyscan_t yyscanner );
+
+void VCF_set_out (FILE * out_str ,yyscan_t yyscanner );
+
+int VCF_get_leng (yyscan_t yyscanner );
+
+char *VCF_get_text (yyscan_t yyscanner );
+
+int VCF_get_lineno (yyscan_t yyscanner );
+
+void VCF_set_lineno (int line_number ,yyscan_t yyscanner );
+
+/* %if-bison-bridge */
+
+YYSTYPE * VCF_get_lval (yyscan_t yyscanner );
+
+void VCF_set_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
+
+/* %endif */
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int VCF_wrap (yyscan_t yyscanner );
+#else
+extern int VCF_wrap (yyscan_t yyscanner );
+#endif
+#endif
+
+/* %not-for-header */
+
+ static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner);
+
+/* %ok-for-header */
+
+/* %endif */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+/* %if-c-only Standard (non-C++) definition */
+/* %not-for-header */
+
+#ifdef __cplusplus
+static int yyinput (yyscan_t yyscanner );
+#else
+static int input (yyscan_t yyscanner );
+#endif
+/* %ok-for-header */
+
+/* %endif */
+#endif
+
+/* %if-c-only */
+
+/* %endif */
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* %if-c-only Standard (non-C++) definition */
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
+/* %endif */
+/* %if-c++-only C++ definition */
+/* %endif */
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+/* %% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \ */\
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+/* %if-c++-only C++ definition \ */\
+/* %endif */
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+/* %if-c-only */
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+#endif
+
+/* %if-tables-serialization structures and prototypes */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %not-for-header */
+
+/* %tables-yydmap generated elements */
+/* %endif */
+/* end tables serialization structures and prototypes */
+
+/* %ok-for-header */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+/* %if-c-only Standard (non-C++) definition */
+
+extern int VCF_lex \
+ (YYSTYPE * yylval_param ,yyscan_t yyscanner);
+
+#define YY_DECL int VCF_lex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only C++ definition */
+/* %endif */
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+/* %% [6.0] YY_RULE_SETUP definition goes here */
+#define YY_RULE_SETUP \
+ if ( yyleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (yytext[yyleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/* %not-for-header */
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+/* %% [7.0] user's declarations go here */
+
+
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+/* %if-c-only */
+ yyin = stdin;
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+ if ( ! yyout )
+/* %if-c-only */
+ yyout = stdout;
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ VCF_ensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ VCF__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ }
+
+ VCF__load_buffer_state(yyscanner );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+/* %% [8.0] yymore()-related code goes here */
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+/* %% [9.0] code to set up and find next match goes here */
+ yy_current_state = yyg->yy_start;
+ yy_current_state += YY_AT_BOL();
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 57 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 56 );
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+
+yy_find_action:
+/* %% [10.0] code to find the action number goes here */
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+/* %% [11.0] code for yylineno update goes here */
+
+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+ {
+ int yyl;
+ for ( yyl = 0; yyl < yyleng; ++yyl )
+ if ( yytext[yyl] == '\n' )
+
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+;
+ }
+
+do_action: /* This label is used only to access EOF actions. */
+
+/* %% [12.0] debug code goes here */
+ if ( yy_flex_debug )
+ {
+ if ( yy_act == 0 )
+ fprintf( stderr, "--scanner backing up\n" );
+ else if ( yy_act < 17 )
+ fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
+ (long)yy_rule_linenum[yy_act], yytext );
+ else if ( yy_act == 17 )
+ fprintf( stderr, "--accepting default rule (\"%s\")\n",
+ yytext );
+ else if ( yy_act == 18 )
+ fprintf( stderr, "--(end of buffer or a NUL)\n" );
+ else
+ fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
+ }
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+/* %% [13.0] actions go here */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = yyg->yy_hold_char;
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+{ BEGIN META; }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+{ BEGIN HEADER; }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+{ BEGIN DATA; return vcfDATAITEM; }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+{ return vcfDATAITEM; }
+ YY_BREAK
+case 5:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp = yy_bp + 10;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ BEGIN META_SIMPLE; return vcfMETAKEY_FORMAT; }
+ YY_BREAK
+case 6:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ BEGIN META_SIMPLE; return vcfMETAKEY; }
+ YY_BREAK
+case 7:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ BEGIN META_COMPOSITE; return vcfMETAKEY; }
+ YY_BREAK
+
+
+case 8:
+YY_RULE_SETUP
+{ return vcfMETAVALUE; }
+ YY_BREAK
+
+
+
+case 9:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ return vcfMETAKEY; }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+{ return vcfMETAVALUE; }
+ YY_BREAK
+
+
+
+case 11:
+YY_RULE_SETUP
+
+ YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+case 13:
+/* rule 13 can match eol */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+case 14:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{ BEGIN 0; ENDLINE; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+{ return yytext[0]; }
+ YY_BREAK
+
+case 16:
+YY_RULE_SETUP
+{ return vcfHEADERITEM; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+ECHO;
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(HEADER):
+case YY_STATE_EOF(DATA):
+case YY_STATE_EOF(META):
+case YY_STATE_EOF(META_SIMPLE):
+case YY_STATE_EOF(META_COMPOSITE):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * VCF_lex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( VCF_wrap(yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of VCF_lex */
+/* %ok-for-header */
+
+/* %if-c++-only */
+/* %not-for-header */
+
+/* %ok-for-header */
+
+/* %endif */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+/* %if-c-only */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = yyg->yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = (int) b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ VCF_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, (size_t) num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ VCF_restart(yyin ,yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) VCF_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+/* %if-c-only */
+/* %not-for-header */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+/* %% [15.0] code to get the start state into yy_current_state goes here */
+ yy_current_state = yyg->yy_start;
+ yy_current_state += YY_AT_BOL();
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+/* %% [16.0] code to find the next state goes here */
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 57 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+/* %if-c-only */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+/* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
+ register char *yy_cp = yyg->yy_c_buf_p;
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 57 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 56);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+/* %if-c-only */
+
+ static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ register char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* undo effects of setting up yytext */
+ *yy_cp = yyg->yy_hold_char;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = yyg->yy_n_chars + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ yyg->yy_n_chars = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+/* %% [18.0] update yylineno here */
+
+ if ( c == '\n' ){
+ --yylineno;
+ }
+
+ yyg->yytext_ptr = yy_bp;
+ yyg->yy_hold_char = *yy_cp;
+ yyg->yy_c_buf_p = yy_cp;
+}
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c-only */
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ VCF_restart(yyin ,yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( VCF_wrap(yyscanner ) )
+ return EOF;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+/* %% [19.0] update BOL and yylineno */
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+
+ do{ yylineno++;
+ yycolumn=0;
+ }while(0)
+;
+
+ return c;
+}
+/* %if-c-only */
+#endif /* ifndef YY_NO_INPUT */
+/* %endif */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+/* %if-c-only */
+ void VCF_restart (FILE * input_file , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ VCF_ensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ VCF__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ }
+
+ VCF__init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
+ VCF__load_buffer_state(yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void VCF__switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * VCF_pop_buffer_state();
+ * VCF_push_buffer_state(new_buffer);
+ */
+ VCF_ensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ VCF__load_buffer_state(yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (VCF_wrap()) processing, but the only time this flag
+ * is looked at is after VCF_wrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/* %if-c-only */
+static void VCF__load_buffer_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+/* %if-c-only */
+ YY_BUFFER_STATE VCF__create_buffer (FILE * file, int size , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) VCF_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF__create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) VCF_alloc(b->yy_buf_size + 2 ,yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF__create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ VCF__init_buffer(b,file ,yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with VCF__create_buffer()
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void VCF__delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ VCF_free((void *) b->yy_ch_buf ,yyscanner );
+
+ VCF_free((void *) b ,yyscanner );
+}
+
+/* %if-c-only */
+
+/* %endif */
+
+/* %if-c++-only */
+/* %endif */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a VCF_restart() or at EOF.
+ */
+/* %if-c-only */
+ static void VCF__init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ VCF__flush_buffer(b ,yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then VCF__init_buffer was _probably_
+ * called from VCF_restart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+/* %if-c-only */
+
+ b->yy_is_interactive = 0;
+
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+ void VCF__flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ VCF__load_buffer_state(yyscanner );
+}
+
+/* %if-c-or-c++ */
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+void VCF_push_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ VCF_ensure_buffer_stack(yyscanner);
+
+ /* This block is copied from VCF__switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from VCF__switch_to_buffer. */
+ VCF__load_buffer_state(yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+/* %endif */
+
+/* %if-c-or-c++ */
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+/* %if-c-only */
+void VCF_pop_buffer_state (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ VCF__delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ VCF__load_buffer_state(yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+/* %endif */
+
+/* %if-c-or-c++ */
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+/* %if-c-only */
+static void VCF_ensure_buffer_stack (yyscan_t yyscanner)
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+{
+ size_t num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)VCF_alloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF_ensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)VCF_realloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF_ensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE VCF__scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) VCF_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF__scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = (int) b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ VCF__switch_to_buffer(b ,yyscanner );
+
+ return b;
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan a string. The next call to VCF_lex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * VCF__scan_bytes() instead.
+ */
+YY_BUFFER_STATE VCF__scan_string (yyconst char * yystr , yyscan_t yyscanner)
+{
+
+ return VCF__scan_bytes(yystr, (int)strlen(yystr), yyscanner);
+}
+/* %endif */
+
+/* %if-c-only */
+/** Setup the input buffer state to scan the given bytes. The next call to VCF_lex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE VCF__scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) VCF_alloc(n ,yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in VCF__scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = VCF__scan_buffer(buf,n ,yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in VCF__scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+/* %endif */
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+/* %if-c-only */
+static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+/* %endif */
+/* %if-c++-only */
+/* %endif */
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/* %if-c-only */
+/* %if-reentrant */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE VCF_get_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/* %endif */
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int VCF_get_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int VCF_get_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *VCF_get_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *VCF_get_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int VCF_get_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *VCF_get_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/* %if-reentrant */
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void VCF_set_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/* %endif */
+
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void VCF_set_lineno (int line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ yy_fatal_error( "VCF_set_lineno called with no buffer" , yyscanner);
+
+ yylineno = line_number;
+}
+
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void VCF_set_column (int column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ yy_fatal_error( "VCF_set_column called with no buffer" , yyscanner);
+
+ yycolumn = column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see VCF__switch_to_buffer
+ */
+void VCF_set_in (FILE * in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = in_str ;
+}
+
+void VCF_set_out (FILE * out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = out_str ;
+}
+
+int VCF_get_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void VCF_set_debug (int bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = bdebug ;
+}
+
+/* %endif */
+
+/* %if-reentrant */
+/* Accessor methods for yylval and yylloc */
+
+/* %if-bison-bridge */
+
+YYSTYPE * VCF_get_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void VCF_set_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* %endif */
+
+/* User-visible API */
+
+/* VCF_lex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+
+int VCF_lex_init(yyscan_t* ptr_yy_globals)
+
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) VCF_alloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* VCF_lex_init_extra has the same functionality as VCF_lex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to VCF_alloc in
+ * the yyextra field.
+ */
+
+int VCF_lex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+
+{
+ struct yyguts_t dummy_yyguts;
+
+ VCF_set_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) VCF_alloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ VCF_set_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* %endif if-c-only */
+
+/* %if-c-only */
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from VCF_lex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = 0;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = (char *) 0;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = (FILE *) 0;
+ yyout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * VCF_lex_init()
+ */
+ return 0;
+}
+/* %endif */
+
+/* %if-c-only SNIP! this currently causes conflicts with the c++ scanner */
+/* VCF_lex_destroy is for both reentrant and non-reentrant scanners. */
+int VCF_lex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ VCF__delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ VCF_pop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ VCF_free(yyg->yy_buffer_stack ,yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ VCF_free(yyg->yy_start_stack ,yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * VCF_lex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+/* %if-reentrant */
+ /* Destroy the main struct (reentrant only). */
+ VCF_free ( yyscanner , yyscanner );
+ yyscanner = NULL;
+/* %endif */
+ return 0;
+}
+/* %endif */
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *VCF_alloc (yy_size_t size , yyscan_t yyscanner)
+{
+ return (void *) malloc( size );
+}
+
+void *VCF_realloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void VCF_free (void * ptr , yyscan_t yyscanner)
+{
+ free( (char *) ptr ); /* see VCF_realloc() for (char *) cast */
+}
+
+/* %if-tables-serialization definitions */
+/* %define-yytables The name for this specific scanner's tables. */
+#define YYTABLES_NAME "yytables"
+/* %endif */
+
+/* %ok-for-header */
+
+
+
+
+bool VCFScan_yylex_init(VCFParseBlock* sb, bool debug)
+{
+ if (VCF_lex_init_extra(sb,&sb->scanner) != 0)
+ {
+ return false;
+ /*return RC ( rcKFG, rcMgr, rcParsing, rcMemory, rcExhausted );*/
+ }
+
+ sb->offset = 0;
+
+ sb->lastToken = NULL;
+ sb->column = 1;
+
+ VCF_set_debug(debug ? 1 : 0,sb->scanner);
+
+ return true;
+}
+
+void VCFScan_yylex_destroy(VCFParseBlock* sb)
+{
+ if (sb->scanner)
+ {
+ VCF_lex_destroy(sb->scanner);
+ }
+ sb->scanner=0;
+}
+
diff --git a/tools/vcf-loader/vcf-lex.l b/tools/vcf-loader/vcf-lex.l
new file mode 100644
index 0000000..721fbc6
--- /dev/null
+++ b/tools/vcf-loader/vcf-lex.l
@@ -0,0 +1,132 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+%{
+ #include "vcf-parse.h"
+ #include "vcf-grammar.h"
+
+ #define YYSTYPE VCFToken
+
+ /* code to populate token with internal values */
+ #define YY_USER_ACTION \
+ yylval -> tokenText = yytext; \
+ yylval -> tokenStart = yyextra->offset; \
+ yylval -> tokenLength = yyleng; \
+ yylval -> line_no = yylineno; \
+ yylval -> column_no = yyextra -> column; \
+ yyextra -> lastToken = yylval; \
+ yyextra -> offset += yyleng; \
+ yyextra -> column += yyleng;
+
+ #define ENDLINE \
+ yyextra -> column=1; \
+ return vcfENDLINE;
+
+ #define YY_INPUT(buf, result, max_size) \
+ result = yyextra->input(yyextra, buf, max_size)
+
+ #define ECHO
+
+ #define YY_NO_INPUT
+%}
+
+%option never-interactive nounistd yylineno reentrant bison-bridge noyywrap
+
+%option prefix="VCF_"
+%option extra-type="VCFParseBlock*"
+
+%option debug
+
+alphanum [A-Za-z0-9\-_]+
+
+%x HEADER
+%x DATA
+%x META
+%x META_SIMPLE
+%x META_COMPOSITE
+
+%%
+
+^## { BEGIN META; }
+^# { BEGIN HEADER; }
+
+^[^#][^\t\r\n]* { BEGIN DATA; return vcfDATAITEM; }
+
+<DATA>[^\t\r\n]+ { return vcfDATAITEM; }
+
+<META>fileformat/= { BEGIN META_SIMPLE; return vcfMETAKEY_FORMAT; }
+<META>{alphanum}/= { BEGIN META_SIMPLE; return vcfMETAKEY; }
+<META>{alphanum}/=< { BEGIN META_COMPOSITE; return vcfMETAKEY; }
+
+<META_SIMPLE>
+{
+ [^=\r\n]+ { return vcfMETAVALUE; }
+}
+<META_COMPOSITE>
+{
+ {alphanum}/= { return vcfMETAKEY; }
+ [^=<,>\r\n]+ { return vcfMETAVALUE; }
+}
+
+<*>
+{
+ \t
+ \n { BEGIN 0; ENDLINE; }
+ \r\n { BEGIN 0; ENDLINE; }
+ \r/[^\n] { BEGIN 0; ENDLINE; }
+ . { return yytext[0]; }
+}
+
+<HEADER>[^\t\r\n]+ { return vcfHEADERITEM; }
+
+%%
+
+bool VCFScan_yylex_init(VCFParseBlock* sb, bool debug)
+{
+ if (yylex_init_extra(sb, &sb->scanner) != 0)
+ {
+ return false;
+ /*return RC ( rcKFG, rcMgr, rcParsing, rcMemory, rcExhausted );*/
+ }
+
+ sb->offset = 0;
+
+ sb->lastToken = NULL;
+ sb->column = 1;
+
+ yyset_debug(debug ? 1 : 0, sb->scanner);
+
+ return true;
+}
+
+void VCFScan_yylex_destroy(VCFParseBlock* sb)
+{
+ if (sb->scanner)
+ {
+ yylex_destroy(sb->scanner);
+ }
+ sb->scanner=0;
+}
diff --git a/tools/vcf-loader/vcf-loader.c b/tools/vcf-loader/vcf-loader.c
new file mode 100644
index 0000000..03c20d8
--- /dev/null
+++ b/tools/vcf-loader/vcf-loader.c
@@ -0,0 +1,124 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <loader/common-writer.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <kapp/log-xml.h>
+#include <align/writer-refseq.h>
+
+static char const option_input[] = "input";
+static char const option_output[] = "output";
+
+#define OPTION_INPUT option_input
+#define OPTION_OUTPUT option_output
+
+#define ALIAS_INPUT "i"
+#define ALIAS_OUTPUT "o"
+
+static
+char const * output_usage[] =
+{
+ "Path and Name of the output database.",
+ NULL
+};
+
+OptDef Options[] =
+{
+ /* order here is same as in param array below!!! */ /* max#, needs param, required */
+ { OPTION_OUTPUT, ALIAS_OUTPUT, NULL, output_usage, 1, true, true },
+};
+
+const char* OptHelpParam[] =
+{
+ /* order here is same as in OptDef array above!!! */
+ "path",
+};
+
+rc_t UsageSummary (char const * progname)
+{
+ return KOutMsg (
+ "Usage:\n"
+ "\t%s [options] <fastq-file> ...\n"
+ "\n"
+ "Summary:\n"
+ "\tLoad VCF formatted data files\n"
+ "\n"
+ "Example:\n"
+ "\t%s -o /tmp/SRZ123456 123456-1.vcf 123456-2.vcf\n"
+ "\n"
+ ,progname, progname);
+}
+
+char const UsageDefaultName[] = "vcf-load";
+
+rc_t CC Usage (const Args * args)
+{
+ rc_t rc;
+ int i;
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ const size_t argsQty = sizeof(Options) / sizeof(Options[0]);
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ for(i = 0; i < argsQty; i++ ) {
+ if( Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ OUTMSG(("\nOptions:\n"));
+ for(i = 0; i < argsQty; i++ ) {
+ if( !Options[i].required && Options[i].help[0] != NULL ) {
+ HelpOptionLine(Options[i].aliases, Options[i].name, OptHelpParam[i], Options[i].help);
+ }
+ }
+ OUTMSG(("\n"));
+ HelpOptionsStandard ();
+ HelpVersion (fullpath, KAppVersion());
+ return rc;
+}
+
+rc_t CC KMain (int argc, char * argv[])
+{
+ return 0;
+}
diff --git a/tools/vcf-loader/vcf-parse.h b/tools/vcf-loader/vcf-parse.h
new file mode 100644
index 0000000..3798737
--- /dev/null
+++ b/tools/vcf-loader/vcf-parse.h
@@ -0,0 +1,89 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_vcf_parse_
+#define _h_vcf_parse_
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+typedef struct VCFToken
+{
+ const char* tokenText; /* 0-terminated, short-lived */
+ size_t tokenStart; /* 0-based offset from the start of input */
+ size_t tokenLength;
+ size_t line_no;
+ size_t column_no;
+} VCFToken;
+
+struct VcfRecord;
+struct VcfReader;
+
+typedef struct VCFParseBlock
+{
+ void* self; /* VcfReader object or a test double */
+ void* scanner; /* flex control block */
+
+ size_t (*input)(struct VCFParseBlock* pb, char* buf, size_t max_size); /* read the next part of the input */
+ void (*error)(struct VCFParseBlock* pb, const char* message);
+
+ void (*metaLine)(struct VCFParseBlock* pb, VCFToken* key, VCFToken* value); /* simple meta line: ##key=value */
+
+ /* two-level meta line: ##key=<key=value,...> */
+ void (*openMetaLine)(struct VCFParseBlock* pb, VCFToken* key);
+ void (*keyValue)(struct VCFParseBlock* pb, VCFToken* key, VCFToken* value);
+ void (*headerItem)(struct VCFParseBlock* pb, VCFToken* value);
+ void (*closeMetaLine)(struct VCFParseBlock* pb);
+
+ /* data line */
+ void (*openDataLine)(struct VCFParseBlock* pb);
+ void (*dataItem)(struct VCFParseBlock* pb, VCFToken* value);
+ void (*closeDataLine)(struct VCFParseBlock* pb);
+
+ size_t offset; /* 0-based offset from the start of input */
+ size_t column; /* 1-based column, for error reporting */
+
+ /* for error reporting, valid inside error() only: */
+ VCFToken* lastToken;
+
+} VCFParseBlock;
+
+extern bool VCFScan_yylex_init(VCFParseBlock* context, bool debug); /* false - out of memory */
+extern void VCFScan_yylex_destroy(VCFParseBlock* context);
+
+extern void VCF_set_lineno (int line_number, void* scanner);
+
+extern int VCF_lex(VCFToken* pb, void * scanner);
+extern void VCF_unlex(VCFParseBlock* pb, VCFToken* token);
+
+extern int VCF_debug; /* set to 1 to print Bison trace */
+
+/* read 1 data line (possibly preceded by any number of meta/header lines) */
+extern int VCF_parse(VCFParseBlock* pb); /* 0 = end of input, 1 = success, a new record is in context->record, 2 - syntax error */
+
+extern void VCF_error(VCFParseBlock* pb, const char* msg);
+
+#endif /* _h_vcf_parse_ */
diff --git a/tools/vcf-loader/vcf-reader.c b/tools/vcf-loader/vcf-reader.c
new file mode 100644
index 0000000..d39df66
--- /dev/null
+++ b/tools/vcf-loader/vcf-reader.c
@@ -0,0 +1,438 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "vcf-reader.h"
+#include "vcf-parse.h"
+
+#include <klib/rc.h>
+
+#include <klib/text.h>
+#include <klib/namelist.h>
+#include <klib/vector.h>
+#include <klib/printf.h>
+
+#include <kfs/mmap.h>
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#define LINE_VECTOR_BLOCK_SIZE 1024
+#define GENOTYPE_LIST_BLOCK_SIZE 64
+#define MESSAGE_LIST_BLOCK_SIZE 64
+#define PARSE_ERROR RC ( rcAlign, rcFile, rcParsing, rcFormat, rcIncorrect )
+#define MANDATORY_DATA_FIELDS_NUMBER 8
+
+/*=============== VcfDataLine ================*/
+static
+rc_t VcfDataLineMake(VcfDataLine** pself)
+{
+ if ( pself == NULL )
+ return RC ( rcAlign, rcFile, rcReading, rcSelf, rcNull );
+ else
+ {
+ VcfDataLine* self;
+ rc_t rc = 0;
+
+ *pself = NULL;
+
+ self = malloc(sizeof(VcfDataLine));
+ if (self == NULL)
+ return RC ( rcAlign, rcFile, rcReading, rcMemory, rcExhausted );
+
+ memset(self, 0, sizeof(VcfDataLine));
+
+ rc = VNamelistMake( &self->genotypeFields, GENOTYPE_LIST_BLOCK_SIZE);
+ if (rc == 0)
+ *pself = self;
+ else
+ free(self);
+ return rc;
+ }
+}
+
+static
+rc_t VcfDataLineWhack(VcfDataLine* self)
+{
+ rc_t rc = 0;
+
+ if (self != NULL)
+ rc = VNamelistRelease(self->genotypeFields);
+
+ free(self);
+
+ return rc;
+}
+
+/*=============== VcfReader ================*/
+
+struct VcfReader
+{
+ char* input;
+ size_t inputSize;
+ size_t curPos;
+ VCFParseBlock pb;
+
+ Vector lines; /* the element type is VcfDataLine* */
+
+ VNamelist* messages;
+};
+
+/* bison helpers */
+static size_t Input(VCFParseBlock* pb, char* buf, size_t maxSize);
+static void Error(VCFParseBlock* pb, const char* message);
+static void AddMetaLine(VCFParseBlock* pb, VCFToken* key, VCFToken* value);
+static void OpenMetaLine(VCFParseBlock* pb, VCFToken* key);
+static void KeyValue(VCFParseBlock* pb, VCFToken* key, VCFToken* value);
+static void HeaderItem(VCFParseBlock* pb, VCFToken* value);
+static void CloseMetaLine(VCFParseBlock* pb);
+static void OpenDataLine(VCFParseBlock* pb);
+static void DataItem(VCFParseBlock* pb, VCFToken* value);
+static void CloseDataLine(VCFParseBlock* pb);
+
+static
+rc_t VcfReaderInit(VcfReader* self)
+{
+ self->input = NULL;
+
+ self->pb.self = self;
+ self->pb.input = Input;
+ self->pb.error = Error;
+
+ self->pb.metaLine = AddMetaLine;
+
+ self->pb.openMetaLine = OpenMetaLine;
+ self->pb.keyValue = KeyValue;
+ self->pb.headerItem = HeaderItem;
+ self->pb.closeMetaLine = CloseMetaLine;
+
+ self->pb.openDataLine = OpenDataLine;
+ self->pb.dataItem = DataItem;
+ self->pb.closeDataLine = CloseDataLine;
+
+ VectorInit( &self->lines, 0, LINE_VECTOR_BLOCK_SIZE );
+
+ return VNamelistMake( &self->messages, MESSAGE_LIST_BLOCK_SIZE);
+}
+
+static void CC WhackLineVectorElement( void *item, void *data )
+{
+ VcfDataLine* elem = (VcfDataLine*)item;
+ VcfDataLineWhack(elem);
+}
+
+rc_t VcfReaderWhack( struct VcfReader* self)
+{
+ rc_t rc = 0;
+
+ if ( self == NULL )
+ return RC ( rcAlign, rcFile, rcDestroying, rcSelf, rcNull );
+
+ VectorWhack( &self->lines, WhackLineVectorElement, NULL );
+
+ rc = VNamelistRelease( self->messages );
+
+ free(self->input);
+ free(self);
+
+ return rc;
+}
+
+rc_t VcfReaderMake( const struct VcfReader **pself)
+{
+ if ( pself == NULL )
+ return RC ( rcAlign, rcFile, rcConstructing, rcSelf, rcNull );
+
+ *pself = malloc(sizeof(VcfReader));
+ if ( *pself == NULL )
+ return RC ( rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted );
+
+ return VcfReaderInit((VcfReader*)*pself);
+}
+
+/*=============== callbacks for the bison parser ================*/
+static size_t Input(VCFParseBlock* pb, char* buf, size_t maxSize)
+{
+ VcfReader* self = (VcfReader*)(pb->self);
+ size_t ret = string_copy(buf, maxSize, self->input + self->curPos, self->inputSize - self->curPos);
+
+ self->curPos += ret;
+
+ return ret;
+}
+static void Error(VCFParseBlock* pb, const char* message)
+{
+ char buf[1024];
+ VcfReader* self = (VcfReader*)(pb->self);
+ string_printf(buf, sizeof(buf), NULL,
+ "line %d column %d: %s",
+ pb->lastToken->line_no, pb->lastToken->column_no, message);
+ VNamelistAppend(self->messages, buf);
+}
+
+static void AddMetaLine(VCFParseBlock* pb, VCFToken* key, VCFToken* value)
+{
+}
+static void OpenMetaLine(VCFParseBlock* pb, VCFToken* key)
+{
+}
+static void CloseMetaLine(VCFParseBlock* pb)
+{
+}
+static void KeyValue(VCFParseBlock* pb, VCFToken* key, VCFToken* value)
+{
+}
+static void HeaderItem(VCFParseBlock* pb, VCFToken* value)
+{
+}
+
+static void OpenDataLine(VCFParseBlock* pb)
+{
+ VcfReader* self;
+ VcfDataLine* line;
+ rc_t rc = 0;
+
+ assert(pb);
+
+ self = (VcfReader*)(pb->self);
+ assert(self);
+
+ /* create new line object */
+ VcfDataLineMake( &line );
+ if (rc == 0)
+ { /* append to the vector */
+ rc = VectorAppend( &self->lines, NULL, line );
+ if (rc != 0)
+ {
+ SET_RC_FILE_FUNC_LINE(rc);
+ Error(pb, "failed to append a line object");
+ }
+ }
+ else
+ {
+ SET_RC_FILE_FUNC_LINE(rc);
+ Error(pb, "failed to create a line object");
+ }
+}
+static void DataItem(VCFParseBlock* pb, VCFToken* value)
+{
+ VcfReader* self = (VcfReader*)(pb->self);
+ VcfDataLine* line;
+
+ assert(pb);
+
+ self = (VcfReader*)(pb->self);
+ assert(self);
+
+ line = (VcfDataLine*) VectorLast( & self->lines );
+ assert(line);
+
+ #define SAVE_TOKEN(field) StringInit( field, self->input + value->tokenStart, value->tokenLength, (uint32_t)string_size(value->tokenText) )
+
+ switch (line->lastPopulated)
+ {
+ case 0: /*String chromosome; */
+ SAVE_TOKEN(&line->chromosome);
+ break;
+
+ case 1: /*uint32_t position; */
+ {
+ char* endptr;
+ long val = strtol(value->tokenText, &endptr, 10);
+ if (*endptr || val < 0 || val > UINT32_MAX)
+ Error(pb, "invalid numeric value for 'position'");
+ else
+ line->position = (uint32_t)val;
+
+ break;
+ }
+ case 2: /*String id; */
+ SAVE_TOKEN(&line->id);
+ break;
+ case 3: /*String refBases; */
+ SAVE_TOKEN(&line->refBases);
+ break;
+ case 4: /*String altBases; */
+ SAVE_TOKEN(&line->altBases);
+ break;
+ case 5: /*uint8_t quality; */
+ {
+ char* endptr;
+ long val = strtol(value->tokenText, &endptr, 10);
+ if (*endptr || val < 0 || val > UINT8_MAX)
+ Error(pb, "invalid numeric value for 'quality'");
+ else
+ line->quality = (uint32_t)val;
+
+ break;
+ }
+ case 6: /*String filter; */
+ SAVE_TOKEN(&line->filter);
+ break;
+ case 7: /*String info; */
+ SAVE_TOKEN(&line->info);
+ break;
+ default: /* add to the genotypeFields */
+ {
+ rc_t rc = 0;
+ String f;
+ SAVE_TOKEN(&f);
+ rc = VNamelistAppendString(line->genotypeFields, &f);
+ if (rc != 0)
+ {
+ SET_RC_FILE_FUNC_LINE(rc);
+ Error(pb, "failed to append a genotype field");
+ }
+ break;
+ }
+ }
+
+ ++line->lastPopulated;
+}
+static void CloseDataLine(VCFParseBlock* pb)
+{
+ /* check if the line had enough data fields */
+ VcfReader* self = (VcfReader*)(pb->self);
+ VcfDataLine* line;
+
+ assert(pb);
+
+ self = (VcfReader*)(pb->self);
+ assert(self);
+
+ line = (VcfDataLine*) VectorLast( & self->lines );
+ assert(line);
+
+ if (line->lastPopulated < MANDATORY_DATA_FIELDS_NUMBER)
+ {
+ -- pb->lastToken->line_no; /* this happens after the EOL has been processed, */
+ /* and the line # reported by flex incremented; fix that for error reporting */
+ Error(pb, "one or more of the 8 mandatory columns are missing");
+ }
+}
+
+
+rc_t VcfReaderParse( struct VcfReader *self, struct KFile* inputFile, const struct VNamelist** messages)
+{
+ rc_t rc = 0;
+ uint32_t messageCount;
+ KMMap* mm;
+
+ if ( self == NULL )
+ return RC ( rcAlign, rcFile, rcParsing, rcSelf, rcNull );
+
+ if (inputFile == NULL)
+ return RC ( rcAlign, rcFile, rcParsing, rcParam, rcNull );
+
+ VNameListCount ( self->messages, &messageCount );
+ if (messageCount > 0)
+ { /* blow away old mesages */
+ rc = VNamelistRelease( self->messages );
+ if (rc == 0)
+ rc = VNamelistMake( &self->messages, MESSAGE_LIST_BLOCK_SIZE);
+ if (rc != 0)
+ return rc;
+ }
+
+ rc = KMMapMakeRead ( (const KMMap**)& mm, inputFile );
+ if ( rc == 0 )
+ {
+ rc_t rc2 = 0;
+
+ const void * ptr;
+ rc = KMMapAddrRead ( mm, & ptr );
+ if ( rc == 0 )
+ {
+ rc = KMMapSize ( mm, & self->inputSize);
+ if ( rc == 0 )
+ {
+ /* make a 0-terminated copy for parsing */
+ self->input = malloc(self->inputSize+1);
+ if (self->input == 0)
+ rc = RC ( rcAlign, rcFile, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ string_copy(self->input, self->inputSize+1, ptr, self->inputSize);
+ self->curPos = 0;
+ VCFScan_yylex_init(&self->pb, false);
+
+ if (VCF_parse(&self->pb) == 0)
+ rc = PARSE_ERROR;
+ else
+ {
+ VNameListCount ( self->messages, &messageCount );
+ if (messageCount > 0)
+ rc = PARSE_ERROR;
+ }
+
+ *messages = (const struct VNamelist*)self->messages;
+
+ VCFScan_yylex_destroy(&self->pb);
+ }
+ }
+ }
+ else if (rc == RC ( rcFS, rcMemMap, rcAccessing, rcMemMap, rcInvalid )) /* 0 size file */
+ {
+ VNamelistAppend(self->messages, "Empty file");
+ *messages = (const struct VNamelist*)self->messages;
+ rc = PARSE_ERROR;
+ }
+
+ rc2 = KMMapRelease ( mm );
+ if (rc == 0)
+ rc = rc2;
+ }
+
+ return rc;
+}
+
+rc_t VcfReaderGetDataLineCount( const VcfReader* self, uint32_t* count )
+{
+ if ( self == NULL )
+ return RC ( rcAlign, rcFile, rcAccessing, rcSelf, rcNull );
+
+ if ( count == NULL )
+ return RC ( rcAlign, rcFile, rcAccessing, rcParam, rcNull );
+
+ *count = VectorLength( & self->lines );
+
+ return 0;
+}
+
+rc_t VcfReaderGetDataLine( const VcfReader* self, uint32_t index, const VcfDataLine** line )
+{
+ if ( self == NULL )
+ return RC ( rcAlign, rcFile, rcAccessing, rcSelf, rcNull );
+
+ if ( line == NULL )
+ return RC ( rcAlign, rcFile, rcAccessing, rcParam, rcNull );
+
+ *line = VectorGet( & self->lines, index );
+
+ return 0;
+}
+
diff --git a/tools/vcf-loader/vcf-reader.h b/tools/vcf-loader/vcf-reader.h
new file mode 100644
index 0000000..8c309ad
--- /dev/null
+++ b/tools/vcf-loader/vcf-reader.h
@@ -0,0 +1,110 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _h_vcf_reader_
+#define _h_vcf_reader_
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <klib/text.h>
+
+/*--------------------------------------------------------------------------
+ * forwards
+ */
+struct KFile;
+struct VNamelist;
+
+typedef struct VcfReader VcfReader;
+
+typedef struct VcfDataLine
+{
+ /* Fixed fields, per spec v. 4.2:
+ http://www.1000genomes.org/wiki/analysis/variant-call-format/vcf-variant-call-format-version-42
+ */
+ String chromosome; /* An identifier from the reference genome or "<ID>" pointing to a contig in the assembly file */
+ uint32_t position; /* The reference position, with the 1st base having position 1 */
+ String id; /* semi-colon separated list of unique identifiers where available; "." if missing */
+ String refBases; /* reference base(s) */
+ String altBases; /* comma separated list of alternate non-reference alleles called on at least one of the samples; "." if missing */
+ uint8_t quality; /* phred-scaled quality score for the assertion made in ALT */
+ String filter; /* "PASS", or a semicolon-separated list of codes for filters that fail*/
+ String info; /* a semicolon-separated series of keys with optional values in the format: <key>[=<data>[,data]] */
+
+ /* Genotype fields, each represented as a String pointing into source */
+ struct VNamelist* genotypeFields;
+
+ uint16_t lastPopulated; /* index of the last populated data item (parser's internal use) */
+} VcfDataLine;
+
+/*=============== VcfReaderMake ================*/
+
+/* Make
+ * Creates a new instance of VcfReader
+ *
+ * self [OUT] return parameter for the new reader object
+ *
+ */
+rc_t VcfReaderMake( const VcfReader** self );
+
+/* Parse
+ * Parses a VCF file. Can be used repeatedly on the same object.
+ *
+ * self [ IN ] the reader object
+ *
+ * file [ IN ] a readable file object. The entire file will be parsed.
+ *
+ * message [ OUT ] error messages generated by the parser. Set to NULL if no messages were generated.
+ * the pointer is valid until the next call to Parse or VcfReaderWhack on the reader object
+ */
+rc_t VcfReaderParse( VcfReader* self, struct KFile* file, const struct VNamelist** messages );
+
+/* Whack
+ * releases object obtained from VcfReaderMake
+ */
+rc_t VcfReaderWhack( VcfReader* self );
+
+/* GetDataLineCount
+ * Returns the number of data lines in the parsed file
+ */
+rc_t VcfReaderGetDataLineCount( const VcfReader* self, uint32_t* count );
+
+/* GetDataLine
+ * Returns the data line at the specified 0-based index,
+ * The returned pointer is valid until the reader is whacked
+ */
+rc_t VcfReaderGetDataLine( const VcfReader* self, uint32_t index, const VcfDataLine** line );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_vcf_reader_ */
diff --git a/tools/vdb-config/Makefile b/tools/vdb-config/Makefile
new file mode 100644
index 0000000..7e06a87
--- /dev/null
+++ b/tools/vdb-config/Makefile
@@ -0,0 +1,82 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-config
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ vdb-config
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-config
+#
+VDB_CONFIG_SRC = \
+ configure \
+ util \
+ vdb-config \
+ interactive \
+ vdb-config-model \
+
+VDB_CONFIG_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_CONFIG_SRC))
+
+VDB_CONFIG_LIB = \
+ -stui_cpp \
+ -stui \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+ -sm
+
+$(BINDIR)/vdb-config: $(VDB_CONFIG_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_CONFIG_LIB)
diff --git a/tools/vdb-config/configure.cpp b/tools/vdb-config/configure.cpp
new file mode 100644
index 0000000..0d2438b
--- /dev/null
+++ b/tools/vdb-config/configure.cpp
@@ -0,0 +1,816 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "configure.h" /* configure */
+#include "interactive.h" /* run_interactive */
+#include "util.hpp" // CNoncopyable
+#include "vdb-config-model.hpp" // vdbconf_model
+
+#include <klib/rc.h> /* RC */
+#include <klib/vector.h> /* Vector */
+
+#include <sstream> // stringstream
+
+#include <climits> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+using std::string;
+
+////////////////////////////////////////////////////////////////////////////////
+class CConfigurator : CNoncopyable {
+ CKConfig m_Cfg;
+ CKDirectory m_Dir;
+ rc_t CheckNcbiHome(bool &updated, bool verbose) const {
+ if (verbose) {
+ OUTMSG(("checking NCBI home... "));
+ }
+
+ const CString ncbi(m_Cfg.ReadNcbiHome());
+
+ if (verbose) {
+ OUTMSG(("%S\n", ncbi.Get()));
+ }
+
+ rc_t rc = 0;
+ if (!ncbi.Empty()) {
+ rc = m_Dir.CreateNonExistingPrivateDir(ncbi, verbose);
+ if (rc == 0) {
+ rc = m_Dir.CheckPrivateAccess(ncbi, updated, verbose);
+ }
+ if (rc == 0) {
+ rc = m_Dir.CanWriteFile(ncbi, verbose);
+ }
+ }
+
+ return rc;
+ }
+ rc_t CheckRepositories(bool fix) {
+ {
+ const string name("/repository/user/default-path");
+ CString node(m_Cfg.ReadString(name.c_str()));
+ if (node.Empty()) {
+ CString home(m_Cfg.ReadString("HOME"));
+ if (!home.Empty()) {
+/* this rc is ignored */ m_Cfg.UpdateNode(name.c_str(),
+ (home.GetString() + "/ncbi").c_str());
+ }
+ else {
+ m_Cfg.UpdateNode(name.c_str(), "$(HOME)/ncbi");
+ }
+ }
+ }
+ rc_t rc = 0;
+ if (fix) {
+ const string name("/repository/site/disabled");
+ if (m_Cfg.NodeExists(name)) {
+ rc_t r2 = m_Cfg.UpdateNode(name.c_str(), "false");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+ }
+ const KRepositoryMgr *mgr = NULL;
+ rc = KConfigMakeRepositoryMgrRead(m_Cfg.Get(), &mgr);
+ KRepositoryVector repositories;
+ memset(&repositories, 0, sizeof repositories);
+ if (rc == 0) {
+ rc = KRepositoryMgrRemoteRepositories(mgr, &repositories);
+ if (rc == 0) {
+ KRepositoryVectorWhack(&repositories);
+ }
+ else if
+ (rc == SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound))
+ {
+ rc = m_Cfg.CreateRemoteRepositories();
+ }
+ }
+ if ( rc == 0 && fix ) {
+ rc = m_Cfg.CreateRemoteRepositories(fix);
+ }
+ if (rc == 0) {
+
+ m_Cfg . FixResolverCgiNodes ( );
+
+ bool noUser = false;
+ rc = KRepositoryMgrUserRepositories(mgr, &repositories);
+ if (rc == 0) {
+ uint32_t len = 0;
+ if (rc == 0) {
+ len = VectorLength(&repositories);
+ }
+ if (len == 0) {
+ noUser = true;
+ }
+ else {
+ uint32_t i = 0;
+ noUser = true;
+ for (i = 0; i < len; ++i) {
+ const KRepository *repo
+ = static_cast<const KRepository*>
+ (VectorGet(&repositories, i));
+ if (repo != NULL) {
+ char buffer[PATH_MAX] = "";
+ size_t size = 0;
+ rc = KRepositoryName(repo,
+ buffer, sizeof buffer, &size);
+ if (rc == 0) {
+ const char p[] = "public";
+ if (strcase_cmp(p, sizeof p - 1, buffer,
+ size, sizeof buffer) == 0)
+ {
+ noUser = false;
+ }
+ if (fix) {
+ rc = m_Cfg.CreateUserRepository
+ (buffer, fix);
+ }
+ }
+ }
+ }
+ rc = 0;
+ }
+ KRepositoryVectorWhack(&repositories);
+ }
+ else if
+ (rc == SILENT_RC(rcKFG, rcNode, rcOpening, rcPath, rcNotFound))
+ {
+ noUser = true;
+ }
+ if (noUser) {
+ rc = m_Cfg.CreateUserRepository();
+ }
+ }
+ RELEASE(KRepositoryMgr, mgr);
+ return rc;
+ }
+
+ rc_t CheckConfig(bool fix) {
+ rc_t rc = CheckRepositories(fix);
+ if (rc == 0) {
+ const string name("/tools/ascp/max_rate");
+ CString node(m_Cfg.ReadString(name.c_str()));
+ if (node.Empty()) {
+ rc = m_Cfg.UpdateNode(name.c_str(), "1000m");
+ }
+ }
+ if (rc == 0) {
+ CString config_default(m_Cfg.ReadDefaultConfig());
+ if (!config_default.Empty() && !config_default.Equals("false")) {
+ m_Cfg.UpdateNode("/config/default", "false");
+ }
+ }
+ if (rc == 0) {
+ m_Cfg.Commit();
+ }
+ return rc;
+ }
+
+protected:
+ vdbconf_model *m_Config;
+
+public:
+ CConfigurator(bool fix = false, bool verbose = false): m_Config(NULL) {
+#define TODO 1
+ bool updated = false;
+ rc_t rc = CheckNcbiHome(updated, verbose);
+ if (rc == 0 && updated) {
+ m_Cfg.Reload(verbose);
+ }
+ if (rc == 0) {
+ rc = CheckConfig(fix);
+ if (rc == 0) {
+ m_Cfg.Reload(verbose);
+ }
+ }
+ if (rc == 0) {
+ m_Config = new vdbconf_model(m_Cfg.Get());
+ if (m_Config == NULL) {
+ rc = TODO;
+ }
+ }
+ if (rc != 0) {
+ throw rc;
+ }
+ }
+ virtual ~CConfigurator(void) { delete m_Config; }
+ virtual rc_t Configure(void) {
+ OUTMSG(("Fixed default configuration\n"));
+ return 0;
+ }
+};
+struct SUserRepo {
+ bool cacheEnabled;
+// bool enabled;
+ string root;
+ SUserRepo(const vdbconf_model *kfg, int32_t id = -1) { Reload (kfg, id); }
+ void Reload(const vdbconf_model *kfg, int32_t id = -1) {
+ assert(kfg);
+ if (id < 0) {
+ cacheEnabled = kfg->is_user_cache_enabled();
+// enabled = kfg->is_user_enabled();
+ root = kfg->get_public_location();
+ }
+ else {
+ cacheEnabled = kfg->is_protected_repo_cached(id);
+// enabled = kfg->is_protected_repo_enabled(id);
+ root = kfg->get_repo_location(id);
+ }
+ }
+};
+struct SProtectedRepo : SUserRepo {
+public:
+ const string name;
+ const string description;
+ SProtectedRepo(const vdbconf_model *kfg,
+ uint32_t id, const string &aName)
+ : SUserRepo(kfg, id)
+ , name(aName), description(kfg->get_repo_description(name))
+ {}
+ void Reload(const vdbconf_model *kfg,
+ uint32_t id, const string &aName)
+ {
+ assert(name == aName);
+ SUserRepo::Reload(kfg, id);
+ }
+};
+class CProtectedRepos : public std::map<const string, SProtectedRepo> {
+ typedef std::map<const string, SProtectedRepo>::iterator TI;
+public:
+ typedef std::map<const string, SProtectedRepo>::const_iterator TCI;
+ CProtectedRepos(const vdbconf_model *kfg) { Reload(kfg); }
+ void Reload(const vdbconf_model *kfg) {
+ assert(kfg);
+ uint32_t n = kfg->get_repo_count();
+ for (uint32_t i = 0; i < n; ++i) {
+ const string name(kfg->get_repo_name(i));
+ TI it = find(name);
+ if (it == end()) {
+ insert(std::pair<const string, SProtectedRepo>
+ (name, SProtectedRepo(kfg, i, name)));
+ }
+ else {
+ (*it).second.Reload(kfg, i, name);
+ }
+ }
+ }
+ TCI Get(uint32_t id) const {
+ TCI it = begin();
+ for (uint32_t i = 0; it != end(); ++it, ++i) {
+ if (i == id) {
+ break;
+ }
+ }
+ return it;
+ }
+};
+struct SData {
+ bool done;
+ bool updated;
+ bool site;
+ struct SCrntData {
+ private:
+ const vdbconf_model *m_Kfg;
+ public:
+ bool site_enabled;
+ bool remote_enabled;
+ bool cache_disabled;
+ SUserRepo userR;
+ CProtectedRepos protectedR;
+ SCrntData(const vdbconf_model *kfg)
+ : m_Kfg(kfg), userR(kfg), protectedR(kfg)
+ {
+ Reload();
+ }
+ void Reload(void) {
+ assert(m_Kfg);
+ site_enabled = m_Kfg->is_site_enabled();
+ remote_enabled = m_Kfg->is_remote_enabled();
+ cache_disabled = ! m_Kfg->is_global_cache_enabled();
+ userR.Reload(m_Kfg);
+ protectedR.Reload(m_Kfg);
+ }
+ } crnt;
+ SData(const vdbconf_model *kfg)
+ : done(false)
+ , updated(false)
+ , site(kfg->does_site_repo_exist())
+ , crnt(kfg)
+ {}
+};
+struct STrinity {
+private:
+ string ToString(int i) { std::stringstream s; s << i; return s.str(); }
+public:
+// const string enabled;
+ const string cached;
+ const string root;
+ STrinity(const string &src)
+// : enabled(src.substr(0, 1))
+ : cached (src.substr(0, 1))
+ , root (src.substr(1, 1))
+ {}
+ STrinity(int i)
+// : enabled(ToString(i + 0))
+ : cached (ToString(i + 0))
+ , root (ToString(i + 1))
+ {}
+ void Print(void) const
+ { OUTMSG(("%s %s\n", cached.c_str(), root.c_str())); }
+};
+class CTextualConfigurator : public CConfigurator {
+ CStdIn m_Stdin;
+ string Input(const string &prompt, const string &value) {
+ OUTMSG(("\n\n%s:\n%s\n\nEnter the new path and Press <Enter>\n"
+ "Press <Enter> to accept the path\n> ",
+ prompt.c_str(), value.c_str()));
+ char buffer[PATH_MAX] = "";
+ size_t num_read = 0;
+ rc_t rc = m_Stdin.Read(buffer, sizeof buffer, &num_read);
+ if (rc == 0 && num_read > 0) {
+ return string(buffer, num_read);
+ }
+ else {
+ return "";
+ }
+ }
+
+ void ProcessCancel(SData &d) {
+ if (!d.updated) {
+ d.done = true;
+ return;
+ }
+ OUTMSG(("\nChanges in your configuration were not saved\n\n"));
+ while (true) {
+ OUTMSG((
+ "To save changes and exit : Enter Y and Press <Enter>\n"
+ "To ignore changes and exit: Enter N and Press <Enter>\n"
+ "To cancel and continue : Press <Enter>\n"
+ "\n"
+ "Your choice > "));
+ char answer = toupper(m_Stdin.Read1());
+ switch (answer) {
+ case '\0':
+ return;
+ case 'Y':
+ OUTMSG(("Saving...\n"));
+ m_Config->commit();
+ // no break;
+ case 'N':
+ OUTMSG(("Exiting..."));
+ d.done = true;
+ return;
+ default:
+ OUTMSG(("Unrecognized input\n"));
+ }
+ }
+ }
+ enum EChoice {
+ eCancel,
+ eExit,
+ eRemote,
+ eSite,
+ eUnknown,
+ eUserCacheEnable,
+ eGlobalCacheEnable,
+// eUserEnable,
+ eUserRoot,
+ };
+ struct SChoice {
+ EChoice choice;
+ int32_t id;
+ SChoice(EChoice c, int32_t i = -1) : choice(c), id(i)
+ {}
+ };
+ class CSymGen {
+ static const string magic;
+ public:
+ static STrinity Id2Seq(uint32_t id) {
+ int d = id * 2 - (int)magic.size();
+ if (d < 0) {
+ return STrinity(magic.substr(id * 2, 2));
+ }
+ else {
+ return STrinity(d + 10);
+ }
+ }
+ static SChoice Seq2Choice(string /* copy */ s, uint32_t maxId) {
+ if (s.length() <= 0 || s.length() > 2) {
+ return SChoice(eUnknown);
+ }
+ else if (s.length() == 1) {
+ size_t p = magic.find(s[0]);
+ if (p == string::npos) {
+ return SChoice(eUnknown);
+ }
+ else {
+ EChoice c = eUnknown;
+ switch (p % 2) {
+ case 0: c = eUserCacheEnable; break;
+ case 1: c = eUserRoot ; break;
+ default: assert(0); break;
+ }
+ return SChoice(c, (int)p / 2);
+ }
+ }
+ else {
+ assert(s.length() == 2);
+ if (!isdigit(s[0]) || !!isdigit(s[0]) || s[0] == '0') {
+ return SChoice(eUnknown);
+ }
+ int id = (s[0] - '0') * 10 + s[1] - '0' + (int)magic.size();
+ EChoice c = eUnknown;
+ switch (id % 2) {
+ case 0: c = eUserCacheEnable; break;
+ case 1: c = eUserRoot ; break;
+ default: assert(0); break;
+ }
+ return SChoice(c, id / 2);
+ }
+ }
+ static void Ask(void) { OUTMSG(("magic.len = %d\n", magic.size())); }
+ };
+ SChoice Inquire(const SData &d) {
+ OUTMSG((" vdb-config interactive\n\n data source\n\n"));
+ OUTMSG((" NCBI SRA: "));
+ if (d.crnt.remote_enabled) {
+ OUTMSG(("enabled (recommended) (1)\n\n"));
+ }
+ else {
+ OUTMSG(("disabled (not recommended) (1)\n\n"));
+ }
+ if (d.site) {
+ OUTMSG((" site : "));
+ if (d.crnt.site_enabled) {
+ OUTMSG(("enabled (recommended) (2)\n\n"));
+ }
+ else {
+ OUTMSG(("disabled (not recommended) (2)\n\n"));
+ }
+ }
+ OUTMSG(("\n local workspaces: local file caching: "));
+ if (d.crnt.cache_disabled) {
+ OUTMSG(("disabled (not recommended) (6)\n"));
+ }
+ else {
+ OUTMSG(("enabled (recommended) (6)\n"));
+ }
+ OUTMSG(("\n Open Access Data\n"));
+/* if (d.crnt.userR.enabled) {
+ OUTMSG(("enabled (recommended) (6)\n"));
+ }
+ else {
+ OUTMSG(("disabled (not recommended) (6)\n"));
+ }*/
+ if (d.crnt.userR.cacheEnabled) {
+ OUTMSG(("cached (recommended) (3)\n"));
+ }
+ else {
+ OUTMSG(("not cached (not recommended) (3)\n"));
+ }
+ OUTMSG(("location: '%s' (4)\n", d.crnt.userR.root.c_str()));
+
+ uint32_t id = 0;
+ for (CProtectedRepos::TCI it = d.crnt.protectedR.begin();
+ it != d.crnt.protectedR.end(); ++it, ++id)
+ {
+ const SProtectedRepo r((*it).second);
+ OUTMSG(("\n %s:\n", r.name.c_str()));
+ if (r.description.size() > 0) {
+ OUTMSG((" ( %s )\n", r.description.c_str()));
+ }
+ STrinity t(CSymGen::Id2Seq(id));
+
+/* OUTMSG(("%s) ", t.enabled.c_str()));
+ if (r.enabled) {
+ OUTMSG(("enabled (recommended)\n"));
+ }
+ else {
+ OUTMSG(("DISABLED (not recommended)\n"));
+ }*/
+
+ OUTMSG(("%s) ", t.cached.c_str()));
+ if (r.cacheEnabled) {
+ OUTMSG(("caching is enabled (recommended)\n"));
+ }
+ else {
+ OUTMSG(("CACHING IS DISABLED (not recommended)\n"));
+ }
+
+ OUTMSG(("%s) root: %s\n", t.root.c_str(), r.root.c_str()));
+ }
+
+//"To print help info : Enter H and Press <Enter>\n"
+ OUTMSG(("\n\n"
+"To cancel and exit : Press <Enter>\n"));
+ if (d.updated) {
+ OUTMSG(("To save changes and exit: Enter Y and Press <Enter>\n"));
+ }
+ OUTMSG((
+"To update and continue : Enter corresponding symbol and Press <Enter>\n"));
+ OUTMSG(("\nYour choice > "));
+ char answer = toupper(m_Stdin.Read1());
+ switch (answer) {
+ case '\0': return SChoice(eCancel);
+ case '1': return SChoice(eRemote);
+ case 'Y': return SChoice(eExit);
+ case '2': // case 'O':
+ return d.site ? SChoice(eSite) : SChoice(eUnknown);
+ case '6': return SChoice(eGlobalCacheEnable);
+ case '3': return SChoice(eUserCacheEnable);
+ case '4': return SChoice(eUserRoot);
+ default : return CSymGen::Seq2Choice(string(1, answer), id);
+ }
+ }
+ bool SetRoot(int32_t id, const string &old) {
+ const string name(id < 0 ? "Public" : "dbGaP");
+ const string prompt("Path to " + name + " Repository");
+ bool flushOld = false, reuseNew = false, ask = true;
+ string root;
+ while (true) {
+ if (ask) {
+ root = Input(prompt, old);
+ if (root.size() == 0) {
+ OUTMSG(("\nRoot path to '%s' repository was not changed\n",
+ name.c_str()));
+ return false;
+ }
+ OUTMSG(("\nChanging root path to '%s' repository to '%s'\n",
+ name.c_str(), root.c_str()));
+ ask = false;
+ }
+ ESetRootState s = m_Config->change_repo_location
+ (flushOld, root, reuseNew, id);
+ switch (s) {
+ case eSetRootState_OK:
+ return true;
+ case eSetRootState_NewPathEmpty:
+ case eSetRootState_Error:
+ assert(0);
+ return false;
+ case eSetRootState_MkdirFail:
+ OUTMSG(("Error: cannot make directory '%s'\n",
+ root.c_str()));
+ ask = true;
+ break;
+ case eSetRootState_NotChanged:
+ OUTMSG(("Keeping '%s' path unchanged\n", root.c_str()));
+ return false;
+ case eSetRootState_NewNotDir:
+ OUTMSG(("Error: '%s' exists and is not a directory\n",
+ root.c_str()));
+ ask = true;
+ break;
+ case eSetRootState_NotUnique:
+ OUTMSG(("Error: there is another repository in '%s'\n",
+ root.c_str()));
+ ask = true;
+ break;
+ case eSetRootState_NewDirNotEmpty: {
+ OUTMSG(("Warning: directory '%s' is not empty\n"
+ "Would you like to use it? (y/N)? > ", root.c_str()));
+ char answer = toupper(m_Stdin.Read1());
+ if (answer == 'Y') {
+ reuseNew = true;
+ }
+ else {
+ ask = true;
+ }
+ break;
+ }
+ case eSetRootState_OldNotEmpty: {
+ OUTMSG(("Warning: your repository '%s' is not empty\n"
+ "Would you like to clear it? (y/N)? > ", old.c_str()));
+ char answer = toupper(m_Stdin.Read1());
+ if (answer == 'Y') {
+ OUTMSG(("Clearing the old repository...\n"));
+ flushOld = true;
+ }
+ else {
+ ask = true;
+ }
+ break;
+ }
+ }
+ }
+ }
+ virtual rc_t Configure(void) {
+ assert(m_Config);
+ SData d(m_Config);
+ while (!d.done) {
+ d.crnt.Reload();
+ SChoice answer = Inquire(d);
+ OUTMSG(("\n"));
+ switch (answer.choice) {
+ case eSite:
+ if (d.crnt.site_enabled) {
+ OUTMSG(("WARNING: DISABLING SITE REPOSITORY!!!"));
+ }
+ else {
+ OUTMSG(("Enabling site repository..."));
+ }
+ m_Config->set_site_enabled(!d.crnt.site_enabled);
+ d.updated = true;
+ break;
+ case eRemote:
+ if (d.crnt.remote_enabled) {
+ OUTMSG(("WARNING: DISABLING REMOTE REPOSITORY!!!"));
+ }
+ else {
+ OUTMSG(("Enabling remote repository..."));
+ }
+ m_Config->set_remote_enabled(!d.crnt.remote_enabled);
+ d.updated = true;
+ break;
+ case eGlobalCacheEnable:
+ if (d.crnt.cache_disabled) {
+ OUTMSG(("Enabling local file caching..."));
+ }
+ else {
+ OUTMSG(("WARNING: DISABLING LOCAL FILE CACHING!!!"));
+ }
+ m_Config->set_global_cache_enabled(d.crnt.cache_disabled);
+ d.updated = true;
+ break;
+ case eUserCacheEnable:
+ if (answer.id < 0) {
+ if (d.crnt.userR.cacheEnabled) {
+ OUTMSG(("WARNING: "
+ "DISABLING USER REPOSITORY CACHING!!!"));
+ }
+ else {
+ OUTMSG(("Enabling user repository caching..."));
+ }
+ m_Config->set_user_cache_enabled
+ (!d.crnt.userR.cacheEnabled);
+ d.updated = true;
+ }
+ else {
+ CProtectedRepos::TCI it
+ (d.crnt.protectedR.Get(answer.id));
+ if (it == d.crnt.protectedR.end()) {
+ OUTMSG(("Unrecognized input. Continuing..."));
+ }
+ else {
+ const SProtectedRepo r((*it).second);
+ int32_t id = m_Config->get_repo_id(r.name);
+ if (id < 0) {
+ OUTMSG(("ERROR: CANNOT FIND '%s' REPOSITORY",
+ r.name.c_str()));
+ }
+ else {
+ if (r.cacheEnabled) {
+ OUTMSG(("WARNING: DISABLING '%s' REPOSITORY"
+ " CACHING!!!", r.name.c_str()));
+ }
+ else {
+ OUTMSG(("Enabling '%s' repository "
+ "caching...", r.name.c_str()));
+ }
+ m_Config->set_protected_repo_cached
+ (id, !r.cacheEnabled);
+ d.updated = true;
+ }
+ }
+ }
+ break;
+/* case eUserEnable:
+ if (answer.id < 0) {
+ if (d.crnt.userR.enabled) {
+ OUTMSG(("WARNING: DISABLING USER REPOSITORY!!!"));
+ }
+ else {
+ OUTMSG(("Enabling user repository..."));
+ }
+ m_Config->set_user_enabled(!d.crnt.userR.enabled);
+ d.updated = true;
+ }
+ else {
+ CProtectedRepos::TCI it
+ (d.crnt.protectedR.Get(answer.id));
+ if (it == d.crnt.protectedR.end()) {
+ OUTMSG(("Unrecognized input. Continuing..."));
+ }
+ else {
+ const SProtectedRepo r((*it).second);
+ int32_t id = m_Config->get_repo_id(r.name);
+ if (id < 0) {
+ OUTMSG(("ERROR: CANNOT FIND '%s' REPOSITORY",
+ r.name.c_str()));
+ }
+ else {
+ if (r.enabled) {
+ OUTMSG(("WARNING: DISABLING '%s' "
+ "REPOSITORY!!!", r.name.c_str()));
+ }
+ else {
+ OUTMSG(("Enabling '%s' repository...",
+ r.name.c_str()));
+ }
+ m_Config->set_protected_repo_enabled
+ (id, !r.enabled);
+ d.updated = true;
+ }
+ }
+ }
+ break;*/
+ case eUserRoot: {
+ string root(d.crnt.userR.root);
+ if (answer.id >= 0) {
+ CProtectedRepos::TCI it
+ (d.crnt.protectedR.Get(answer.id));
+ if (it == d.crnt.protectedR.end()) {
+ OUTMSG(("Unrecognized input. Continuing..."));
+ break;
+ }
+ else {
+ root = (*it).second.root;
+ }
+ }
+ d.updated = SetRoot(answer.id, root);
+ break;
+ }
+ case eExit:
+ OUTMSG(("Saving..."));
+ m_Config->commit();
+ d.done = true;
+ break;
+ case eCancel:
+ OUTMSG(("Canceling...\n\n"));
+ ProcessCancel(d);
+ break;
+ default:
+ OUTMSG(("Unrecognized input. Continuing..."));
+ break;
+ }
+ OUTMSG(("\n\n\n"));
+ }
+ return 0;
+ }
+public:
+ CTextualConfigurator(void) {}
+};
+const string CTextualConfigurator::CSymGen::magic
+ ("56789ABCDEFGHIJKLMNOPQRSTUVWXZ");
+class CVisualConfigurator : public CConfigurator {
+ virtual rc_t Configure(void) {
+ if (m_Config == NULL) {
+ return TODO;
+ }
+ return run_interactive(*m_Config);
+ }
+};
+rc_t configure(EConfigMode mode) {
+ rc_t rc = 0;
+ CConfigurator *c = NULL;
+ try {
+ switch (mode) {
+ case eCfgModeDefault:
+ c = new CConfigurator(true);
+ break;
+ case eCfgModeTextual:
+ c = new CTextualConfigurator;
+ break;
+ default:
+ c = new CVisualConfigurator;
+ break;
+ }
+ rc = c->Configure();
+ }
+ catch (rc_t re) {
+ if (rc == 0) {
+ rc = re;
+ }
+ }
+ catch (...) {
+ if (rc == 0) {
+ rc = TODO;
+ }
+ }
+ delete c;
+ return rc;
+}
diff --git a/tools/vdb-config/configure.h b/tools/vdb-config/configure.h
new file mode 100644
index 0000000..fc9450f
--- /dev/null
+++ b/tools/vdb-config/configure.h
@@ -0,0 +1,49 @@
+#ifndef _h_tools_vdb_config_configure_
+#define _h_tools_vdb_config_configure_
+
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/defs.h> /* rc_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ eCfgModeDefault, /* default has to be graphical */
+ eCfgModeTextual, /* textual is the only alternative */
+ eCfgModeSemiVisual, /* remove this */
+ eCfgModeVisual, /* redundant */
+} EConfigMode;
+
+rc_t configure(EConfigMode mode);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_tools_vdb_config_configure_ */
diff --git a/tools/vdb-config/interactive.cpp b/tools/vdb-config/interactive.cpp
new file mode 100644
index 0000000..66af49f
--- /dev/null
+++ b/tools/vdb-config/interactive.cpp
@@ -0,0 +1,1096 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+/*
+ a clean new config tool in c++ with interactive interface...
+*/
+
+#include <tui/tui.hpp>
+
+#include <klib/rc.h>
+
+#include <kfg/config.h>
+#include <kfg/properties.h>
+#include <kfg/repository.h>
+#include <kfg/ngc.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sstream>
+
+#include "vdb-config-model.hpp"
+
+using namespace tui;
+
+#define BOX_COLOR KTUI_c_dark_blue
+#define STATUS_COLOR KTUI_c_gray
+#define LABEL_BG KTUI_c_light_gray
+#define LABEL_FG KTUI_c_black
+#define CB_COLOR_FG KTUI_c_black
+#define BTN_COLOR_FG KTUI_c_black
+#define CB_COLOR_BG KTUI_c_cyan
+#define BTN_COLOR_BG KTUI_c_cyan
+
+#define TOP_H 11
+#define SRC_W 36
+#define PROXY_EN_W 15
+#define PROXY_EN_W_ENV 43
+#define SAVE_W 14
+#define EXIT_W 14
+#define WKSP_NAME_W 32
+#define WKSP_B_LOC_W 12
+
+#define CB_TXT_REMOTE "Enable Remote Access (1)"
+#define CB_TXT_CACHE "Enable Local File Caching (2)"
+#define CB_TXT_SITE "Use Site Installation (3)"
+#define CB_TXT_PROXY "Use Proxy"
+#define CB_TXT_PROXY_ENV "Prioritize Env. Variable \'http_proxy\'"
+
+#define BTN_TXT_IMPORT_NGC "Import Repository Key (4)"
+#define BTN_TXT_DFLT_IMPORT_PATH "Set Default Import Path (5)"
+#define B_SAVE_TXT "Save (6)"
+#define B_EXIT_TXT "Exit (7)"
+#define B_RELOAD_TXT "Reload (8)"
+#define B_FACT_DFLT_TXT "Standard Settings (9)"
+
+#define MAIN_CAPTION "vdb-config"
+#define L_TXT_PUBLIC "Public"
+#define BTN_TXT_CHANGE "Change"
+#define HDR_WKSP_NAME_TXT "Workspace Name"
+#define HDR_WKSP_LOC_TXT "Location"
+#define L_TXT_NUMBER_EXPLAIN "Press the number in (X) as a shortcut"
+
+#define FOCUS_TXT_CB_REMOTE "Press SPACE | ENTER to enable/disable access to the servers at NCBI"
+#define FOCUS_TXT_CB_CACHED "Press SPACE | ENTER to enable/disable caching"
+#define FOCUS_TXT_CB_SITE "Press SPACE | ENTER to enable/disable access to site repositories"
+#define FOCUS_TXT_CB_PROXY "Press SPACE | ENTER to enable/disable http proxy"
+#define FOCUS_TXT_B_PROXY "Press SPACE | ENTER to edit proxy"
+#define FOCUS_TXT_B_PROXY_ENV "Press SPACE | ENTER to prioritize environment variable \'http_proxy\'"
+#define FOCUS_TXT_B_PUBLIC_LOC "Press SPACE | ENTER to change location of public data"
+#define FOCUS_TXT_B_IMPORT_NGC "Press SPACE | ENTER to import a dbGaP project"
+#define FOCUS_TXT_B_USR_DFLT_PATH "Press SPACE | ENTER to change default repository location"
+#define FOCUS_TXT_B_PROT_LOC "Press SPACE | ENTER to change location for this dbGaP repository"
+#define FOCUS_TXT_B_SAVE "Press SPACE | ENTER to save changes"
+#define FOCUS_TXT_B_EXIT "Press SPACE | ENTER to exit vdb-config"
+#define FOCUS_TXT_B_RELOAD "Press SPACE | ENTER to discard changes"
+#define FOCUS_TXT_B_FACT_DFLT "Press SPACE | ENTER to set factory defaults"
+
+#define ID_BOX_TOP_LEFT 100
+#define ID_BOX_BOTTOM 101
+#define ID_BOX_TOP_RIGHT 102
+#define ID_BOX_STATUS 103
+
+#define ID_CB_REMOTE 104
+#define ID_CB_CACHED 105
+#define ID_CB_SITE 106
+#define ID_CB_PROXY 107
+#define ID_B_PROXY 108
+#define ID_L_PROXY 109
+#define ID_CB_PROXY_ENV 110
+
+#define ID_B_IMPORT_NGC 120
+#define ID_B_USR_DFLT_PATH 121
+
+#define ID_L_WKSP_NAME 122
+#define ID_L_WKSP_LOC 123
+
+#define ID_L_PUBLIC 123
+#define ID_B_PUBLIC_LOC 124
+#define ID_L_PUBLIC_LOC 125
+
+#define ID_B_SAVE 126
+#define ID_B_EXIT 127
+#define ID_B_RELOAD 128
+#define ID_B_FACT_DFLT 129
+
+#define ID_L_NUMBER_EXPLAIN 130
+
+#define ID_L_PROT 200
+#define ID_L_PROT_LOC 300
+#define ID_B_PROT_LOC 400
+
+
+class vdbconf_view : public Dlg
+{
+ public :
+ vdbconf_view( vdbconf_model &model ) : Dlg(), priv_model( model ), repos_shown( 0 ), show_local_enable( false )
+ {
+ populate();
+ };
+
+ virtual bool Resize( Tui_Rect const &r )
+ {
+ populate( r, true );
+ return Dlg::Resize( r );
+ }
+
+ void populate( void );
+
+ private :
+ vdbconf_model & priv_model;
+ uint32_t repos_shown;
+ bool show_local_enable;
+
+ /* layout functions */
+ uint32_t half( Tui_Rect const &r, uint32_t margins ) const { return ( ( r.get_w() - margins ) / 2 ); }
+ Tui_Rect h1_rect( Tui_Rect const &r, int32_t dx, int32_t dy, int32_t dw ) const
+ { return Tui_Rect( r.get_x() + dx, r.get_y() + dy, r.get_w() + dw, 1 ); }
+ Tui_Rect h1_w_rect( Tui_Rect const &r, int32_t dx, int32_t dy, uint32_t w ) const
+ { return Tui_Rect( r.get_x() + dx, r.get_y() + dy, w, 1 ); }
+
+ Tui_Rect top_left_rect( Tui_Rect const &r ) const
+ { return Tui_Rect( r.get_x() + 1, r.get_y() + 2, half( r, 3 ), TOP_H ); }
+
+ Tui_Rect top_right_rect( Tui_Rect const &r ) const
+ { return Tui_Rect( r.get_x() + half( r, 3 ) + 2, r.get_y() + 2, r.get_w() - half( r, 3 ) - 3, TOP_H ); }
+
+ Tui_Rect bottom_rect( Tui_Rect const &r ) const
+ { return Tui_Rect( r.get_x() + 1, r.get_y() + TOP_H + 3, r.get_w() - 2, r.get_h() - ( TOP_H + 5 ) ); }
+
+ Tui_Rect statust_rect( Tui_Rect const &r ) const { return h1_rect( r, 0, r.get_h() - 1, 0 ); }
+ Tui_Rect remote_cb_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 1, SRC_W ); }
+ Tui_Rect cache_cb_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 3, SRC_W ); }
+ Tui_Rect site_cb_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 5, SRC_W ); }
+ Tui_Rect proxy_cb_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 7, PROXY_EN_W ); }
+ Tui_Rect proxy_cb_env_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 9, PROXY_EN_W_ENV ); }
+ Tui_Rect proxy_btn_rect( Tui_Rect const &r ) const { return h1_w_rect( r, PROXY_EN_W + 2, 7, WKSP_B_LOC_W ); }
+ Tui_Rect proxy_lb_rect( Tui_Rect const &r ) const
+ { return h1_w_rect( r, PROXY_EN_W + 3 + WKSP_B_LOC_W, 7, r.get_w() - ( PROXY_EN_W + 4 + WKSP_B_LOC_W ) ); }
+
+ Tui_Rect import_ngc_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 1, WKSP_NAME_W ); }
+ Tui_Rect usr_dflt_path_rect( Tui_Rect const &r ) const { return h1_w_rect( r, WKSP_NAME_W + 2, 1, WKSP_NAME_W + 3 ); }
+
+ Tui_Rect hdr_wksp_name_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 3, WKSP_NAME_W ); }
+ Tui_Rect hdr_wksp_loc_rect( Tui_Rect const &r ) const { return h1_rect( r, WKSP_NAME_W + 2, 3, -( WKSP_NAME_W + 3 ) ); }
+
+ Tui_Rect wksp_name_rect( Tui_Rect const &r, uint32_t n ) const { return h1_w_rect( r, 1, 5 + ( 2 * n ), WKSP_NAME_W ); }
+ Tui_Rect wksp_b_loc_rect( Tui_Rect const &r, uint32_t n ) const
+ { return h1_w_rect( r, WKSP_NAME_W + 2, 5 + ( 2 * n ), WKSP_B_LOC_W ); }
+ Tui_Rect wksp_loc_rect( Tui_Rect const &r, uint32_t n ) const
+ { return h1_rect( r, WKSP_NAME_W + WKSP_B_LOC_W + 3, 5 + ( 2 * n ), -( WKSP_NAME_W + WKSP_B_LOC_W + 4 ) ); }
+
+ Tui_Rect save_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 1, SAVE_W ); }
+ Tui_Rect exit_rect( Tui_Rect const &r ) const { return h1_w_rect( r, SAVE_W + 2, 1, EXIT_W ); }
+ Tui_Rect reload_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 3, SAVE_W + EXIT_W + 1 ); }
+ Tui_Rect factdflt_rect( Tui_Rect const &r ) const { return h1_w_rect( r, 1, 5, SAVE_W + EXIT_W + 1 ); }
+ Tui_Rect num_explain_rect( Tui_Rect const &r ) const { return h1_rect( r, 1, r.get_h() - 2, -2 ); }
+
+ void setup_box( Tui_Rect const &r, bool resize, uint32_t id );
+ void setup_label( Tui_Rect const &r, bool resize, uint32_t id, const char * txt );
+ void setup_checkbox( Tui_Rect const &r, bool resize, uint32_t id, const char * txt, bool enabled );
+ void setup_button( Tui_Rect const &r, bool resize, uint32_t id, const char * txt );
+
+ void populate_top_left( Tui_Rect const &r, bool resize );
+ void populate_protected( Tui_Rect const &r, bool resize );
+ void populate_bottom( Tui_Rect const &r, bool resize );
+ void populate_top_right( Tui_Rect const &r, bool resize );
+ void populate( Tui_Rect const &r, bool resize );
+};
+
+
+void vdbconf_view::setup_box( Tui_Rect const &r, bool resize, uint32_t id )
+{
+ if ( resize )
+ SetWidgetRect( id, r, false );
+ else if ( !HasWidget( id ) )
+ {
+ AddLabel( id, r, "" );
+ SetWidgetBackground( id, BOX_COLOR );
+ }
+}
+
+void vdbconf_view::setup_label( Tui_Rect const &r, bool resize, uint32_t id, const char * txt )
+{
+ if ( resize )
+ SetWidgetRect( id, r, false );
+ else if ( HasWidget( id ) )
+ {
+ SetWidgetCaption( id, ( txt == NULL ) ? "" : txt );
+ }
+ else
+ {
+ AddLabel( id, r, ( txt == NULL ) ? "" : txt );
+ SetWidgetBackground( id, LABEL_BG );
+ SetWidgetForeground( id, LABEL_FG );
+ }
+}
+
+
+void vdbconf_view::setup_checkbox( Tui_Rect const &r, bool resize, uint32_t id, const char * txt, bool value )
+{
+ if ( resize )
+ SetWidgetRect( id, r, false );
+ else if ( HasWidget( id ) )
+ {
+ SetWidgetCaption( id, ( txt == NULL ) ? "" : txt );
+ SetWidgetBoolValue( id, value );
+ }
+ else
+ {
+ AddCheckBox( id, r, ( txt == NULL ) ? "" : txt, value );
+ SetWidgetBackground( id, CB_COLOR_BG );
+ SetWidgetForeground( id, CB_COLOR_FG );
+ }
+}
+
+
+void vdbconf_view::setup_button( Tui_Rect const &r, bool resize, uint32_t id, const char * txt )
+{
+ if ( resize )
+ SetWidgetRect( id, r, false );
+ else if ( HasWidget( id ) )
+ {
+ SetWidgetCaption( id, ( txt == NULL ) ? "" : txt );
+ }
+ else
+ {
+ AddButton( id, r, ( txt == NULL ) ? "" : txt );
+ SetWidgetBackground( id, BTN_COLOR_BG );
+ SetWidgetForeground( id, BTN_COLOR_FG );
+ }
+}
+
+
+void vdbconf_view::populate_top_left( Tui_Rect const &r, bool resize )
+{
+ setup_box( r, resize, ID_BOX_TOP_LEFT );
+
+ /* the 3 checkboxes for remote, cached, site */
+ setup_checkbox( remote_cb_rect( r ), resize, ID_CB_REMOTE, CB_TXT_REMOTE, priv_model.is_remote_enabled() );
+ setup_checkbox( cache_cb_rect( r ), resize, ID_CB_CACHED, CB_TXT_CACHE, priv_model.is_global_cache_enabled() );
+ if ( priv_model.does_site_repo_exist() )
+ setup_checkbox( site_cb_rect( r ), resize, ID_CB_SITE, CB_TXT_SITE, priv_model.is_site_enabled() );
+ setup_checkbox( proxy_cb_rect( r ), resize, ID_CB_PROXY, CB_TXT_PROXY, priv_model.is_http_proxy_enabled() );
+ setup_button( proxy_btn_rect( r ), resize, ID_B_PROXY, BTN_TXT_CHANGE );
+ setup_label( proxy_lb_rect( r ), resize, ID_L_PROXY, priv_model.get_http_proxy_path().c_str() );
+ setup_checkbox( proxy_cb_env_rect( r ), resize, ID_CB_PROXY_ENV, CB_TXT_PROXY_ENV, priv_model.has_http_proxy_env_higher_priority() );
+}
+
+
+void vdbconf_view::populate_protected( Tui_Rect const &r, bool resize )
+{
+ uint32_t visible = ( ( r.get_h() - 9 ) / 2 );
+ uint32_t i, n = priv_model.get_repo_count();
+ for ( i = 0; i < n; ++i )
+ {
+ setup_label( wksp_name_rect( r, i + 1 ), resize, ID_L_PROT + i, priv_model.get_repo_name( i ).c_str() );
+ setup_button( wksp_b_loc_rect( r, i + 1 ), resize, ID_B_PROT_LOC + i, BTN_TXT_CHANGE );
+ setup_label( wksp_loc_rect( r, i + 1 ), resize, ID_L_PROT_LOC + i, priv_model.get_repo_location( i ).c_str() );
+
+ SetWidgetVisible( ID_L_PROT + i, ( i < visible ) );
+ SetWidgetVisible( ID_B_PROT_LOC + i, ( i < visible ) );
+ SetWidgetVisible( ID_L_PROT_LOC + i, ( i < visible ) );
+ }
+}
+
+void vdbconf_view::populate_bottom( Tui_Rect const &r, bool resize )
+{
+ setup_box( r, resize, ID_BOX_BOTTOM );
+
+ /* the import-ngc and the set-dflt-path buttons */
+ setup_button( import_ngc_rect( r ), resize, ID_B_IMPORT_NGC, BTN_TXT_IMPORT_NGC );
+ setup_button( usr_dflt_path_rect( r ), resize, ID_B_USR_DFLT_PATH, BTN_TXT_DFLT_IMPORT_PATH );
+
+ /* the header of the workspace list */
+ setup_label( hdr_wksp_name_rect( r ), resize, ID_L_WKSP_NAME, HDR_WKSP_NAME_TXT );
+ setup_label( hdr_wksp_loc_rect( r ), resize, ID_L_WKSP_LOC, HDR_WKSP_LOC_TXT );
+
+ /* the public workspace: */
+ setup_label( wksp_name_rect( r, 0 ), resize, ID_L_PUBLIC, L_TXT_PUBLIC );
+ setup_button( wksp_b_loc_rect( r, 0 ), resize, ID_B_PUBLIC_LOC, BTN_TXT_CHANGE );
+ setup_label( wksp_loc_rect( r, 0 ), resize, ID_L_PUBLIC_LOC, priv_model.get_public_location().c_str() );
+
+ /* the protected workspaces: */
+ populate_protected( r, resize );
+
+ setup_label( num_explain_rect( r ), resize, ID_L_NUMBER_EXPLAIN, L_TXT_NUMBER_EXPLAIN );
+}
+
+
+void vdbconf_view::populate_top_right( Tui_Rect const &r, bool resize )
+{
+ setup_box( r, resize, ID_BOX_TOP_RIGHT );
+
+ setup_button( save_rect( r ), resize, ID_B_SAVE, B_SAVE_TXT );
+ setup_button( exit_rect( r ), resize, ID_B_EXIT, B_EXIT_TXT );
+ setup_button( reload_rect( r ), resize, ID_B_RELOAD, B_RELOAD_TXT );
+ setup_button( factdflt_rect( r ), resize, ID_B_FACT_DFLT, B_FACT_DFLT_TXT );
+}
+
+
+void vdbconf_view::populate( Tui_Rect const &r, bool resize )
+{
+ if ( !resize ) SetCaption( MAIN_CAPTION );
+
+ populate_top_left( top_left_rect( r ), resize );
+ populate_bottom( bottom_rect( r ), resize );
+ populate_top_right( top_right_rect( r ), resize );
+
+ setup_label( statust_rect( r ), resize, ID_BOX_STATUS, NULL );
+}
+
+
+void vdbconf_view::populate( void )
+{
+ Tui_Rect r;
+ GetRect( r );
+ populate( r, false );
+}
+
+/* ------------------------------------------------------------------------------------------------------------------------------------- */
+
+
+static void vdbconf_msg( Dlg &dlg, Tui_Rect r, const char * msg )
+{
+ Std_Dlg_Info_Line d;
+ d.set_parent( &dlg );
+ dlg.center( r );
+ d.set_location( r );
+ d.set_text( msg );
+ d.execute();
+}
+
+
+static bool vdbconf_question( Dlg &dlg, Tui_Rect r, const char * msg )
+{
+ Std_Dlg_Question q;
+ q.set_parent( &dlg );
+ dlg.center( r );
+ q.set_location( r );
+ q.set_text( msg );
+ return ( q.execute() );
+}
+
+
+static bool vdbconf_input( Dlg &dlg, Tui_Rect r, const char * caption, std::string & txt )
+{
+ bool res;
+ std::string prev_txt = txt;
+ Std_Dlg_Input q;
+ q.set_parent( &dlg );
+ dlg.center( r );
+ q.set_location( r );
+ q.set_caption( caption );
+ q.set_text2( txt );
+ res = q.execute();
+ if ( res )
+ res = ( prev_txt != q.get_text2() );
+ if ( res )
+ txt = q.get_text2();
+ return res;
+}
+
+
+static std::string vdbconf_pick_file( Dlg &dlg, Tui_Rect r, const char * path, const char *ext )
+{
+ std::string res = "";
+ Std_Dlg_File_Pick pick;
+ pick.set_parent( &dlg );
+ dlg.center( r );
+ pick.set_location( r );
+ pick.set_ext( ext );
+ pick.set_dir_h( ( r.get_h() - 7 ) / 2 );
+ pick.set_text( path );
+ if ( pick.execute() )
+ res.assign( pick.get_text() );
+ return res;
+}
+
+
+bool vdbconf_pick_dir( Dlg &dlg, Tui_Rect r, std::string &path )
+{
+ bool res = false;
+ Std_Dlg_Dir_Pick pick;
+
+ pick.set_parent( &dlg );
+ dlg.center( r );
+ pick.set_location( r );
+ pick.set_text( path.c_str() );
+ pick.allow_dir_create();
+
+ res = pick.execute();
+ if ( res )
+ path.assign( pick.get_text() );
+
+ return res;
+}
+
+
+static bool make_ngc_obj( const KNgcObj ** ngc, std::string &path )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc == 0 )
+ {
+ const KFile * src;
+ rc = KDirectoryOpenFileRead ( dir, &src, "%s", path.c_str() );
+ if ( rc == 0 )
+ {
+ rc = KNgcObjMakeFromFile ( ngc, src );
+ KFileRelease( src );
+ }
+ KDirectoryRelease( dir );
+ }
+ return ( rc == 0 );
+}
+
+
+std::string public_location_start_dir( vdbconf_model &model )
+{
+ std::string res = model.get_public_location();
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_user_default_dir();
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_home_dir() + "/ncbi";
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_home_dir();
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_current_dir();
+
+ return res;
+}
+
+
+std::string protected_location_start_dir( vdbconf_model &model, uint32_t id )
+{
+ std::string res = model.get_repo_location( id );
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_user_default_dir();
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_home_dir() + "/ncbi";
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_home_dir();
+
+ if ( !model.does_path_exist( res ) )
+ res = model.get_current_dir();
+
+ return res;
+}
+
+/* ------------------------------------------------------------------------------------------------------------------------------------- */
+
+
+class vdbconf_controller : public Dlg_Runner
+{
+ private :
+ vdbconf_model &priv_model;
+
+ public :
+ vdbconf_controller( Dlg &dlg, vdbconf_model &model ) : Dlg_Runner( dlg, &model ), priv_model( model )
+ { dlg.SetFocus( ID_CB_REMOTE ); };
+
+ virtual bool on_kb_alpha( Dlg &dlg, void * data, int code ); /* close the dialog with the 'q' character too */
+ virtual bool on_select( Dlg &dlg, void * data, Tui_Dlg_Event &dev ); /* react to buttons pressed */
+ virtual bool on_focus( Dlg &dlg, void * data, Tui_Dlg_Event &dev ) /* react to getting the focus */
+ { return on_focused( dlg, dev.get_widget_id() ); };
+
+ void update_view( Dlg &dlg );
+ bool on_exit( Dlg &dlg );
+ bool on_save( Dlg &dlg );
+ bool on_reload( Dlg &dlg );
+ bool on_fact_dflt( Dlg &dlg );
+
+ std::string get_import_ngc_start_dir( vdbconf_model &model );
+ bool import_this_ngc_into_this_location( Dlg &dlg, vdbconf_model &m, std::string &location, const KNgcObj * ngc );
+ bool import_this_ngc( Dlg &dlg, vdbconf_model &m, const KNgcObj * ngc );
+ bool on_import_ngc( Dlg &dlg );
+
+ std::string change_dflt_import_path_start_dir( vdbconf_model &model );
+ bool on_change_dflt_import_path( Dlg &dlg );
+
+ bool toggle_checkbox( Dlg &dlg, uint32_t id );
+ bool toggle_remote( Dlg &dlg );
+ bool toggle_site( Dlg &dlg );
+ bool toggle_cached( Dlg &dlg );
+
+ bool change_proxy( Dlg &dlg );
+
+ bool on_set_location_error( Dlg &dlg, ESetRootState s );
+ bool on_pick_public_location( Dlg &dlg );
+
+ std::string change_protected_location_start_dir( vdbconf_model &model, uint32_t id );
+ bool on_pick_protected_location( Dlg &dlg, uint32_t id );
+ bool on_protected_repo( Dlg &dlg, Tui_Dlg_Event &dev );
+
+ void status_txt( Dlg &dlg, const char * s ) { dlg.SetWidgetCaption( ID_BOX_STATUS, s ); }
+ void on_focused_protected_repo( Dlg &dlg, uint32_t widget_id );
+ bool on_focused( Dlg &dlg, uint32_t widget_id );
+};
+
+
+void vdbconf_controller::update_view( Dlg &dlg )
+{
+ vdbconf_view &view = dynamic_cast<vdbconf_view &>( dlg );
+ view.populate();
+}
+
+
+bool vdbconf_controller::on_exit( Dlg &dlg )
+{
+ if ( priv_model.get_config_changed() )
+ {
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), "save changes ?" ) )
+ {
+ if ( priv_model.commit() )
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "changes successfully saved" );
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "error saving changes" );
+ }
+ }
+ dlg.SetDone( true );
+ return true;
+}
+
+
+bool vdbconf_controller::on_save( Dlg &dlg )
+{
+ if ( priv_model.get_config_changed() )
+ {
+ if ( priv_model.commit() )
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "changes successfully saved" );
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "error saving changes" );
+ }
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "no changes to be saved" );
+ return true;
+}
+
+
+bool vdbconf_controller::on_reload( Dlg &dlg )
+{
+ priv_model.reload();
+ update_view( dlg );
+ return true;
+}
+
+
+bool vdbconf_controller::on_fact_dflt( Dlg &dlg )
+{
+ priv_model.set_remote_enabled( true );
+ priv_model.set_global_cache_enabled( true );
+ priv_model.set_site_enabled( true );
+ update_view( dlg );
+ return true;
+}
+
+
+bool vdbconf_controller::toggle_checkbox( Dlg &dlg, uint32_t id )
+{
+ bool value = !dlg.GetWidgetBoolValue( id );
+ dlg.SetWidgetBoolValue( id, value );
+ return value;
+}
+
+
+bool vdbconf_controller::toggle_remote( Dlg &dlg )
+{
+ priv_model.set_remote_enabled( toggle_checkbox( dlg, ID_CB_REMOTE ) );
+ return true;
+}
+
+bool vdbconf_controller::toggle_cached( Dlg &dlg )
+{
+ priv_model.set_global_cache_enabled( toggle_checkbox( dlg, ID_CB_CACHED ) );
+ return true;
+}
+
+bool vdbconf_controller::toggle_site( Dlg &dlg )
+{
+ if ( priv_model.does_site_repo_exist() )
+ priv_model.set_site_enabled( toggle_checkbox( dlg, ID_CB_SITE ) );
+ return true;
+}
+
+
+bool vdbconf_controller::on_kb_alpha( Dlg &dlg, void * data, int code )
+{
+ bool res = false;
+ switch( code )
+ {
+ case '1' : res = toggle_remote( dlg ); break;
+ case '2' : res = toggle_cached( dlg ); break;
+ case '3' : res = toggle_site( dlg ); break;
+
+ case '4' : res = on_import_ngc( dlg ); break;
+ case '5' : res = on_change_dflt_import_path( dlg ); break;
+
+ case '6' : res = on_save( dlg ); break;
+
+ case '7' :
+ case 'Q' :
+ case 'q' : res = on_exit( dlg ); break;
+
+ case '8' : res = on_reload( dlg ); break;
+ case '9' : res = on_fact_dflt( dlg ); break;
+
+ default : res = false;
+
+ }
+ return res;
+};
+
+
+bool vdbconf_controller::import_this_ngc_into_this_location( Dlg &dlg,
+ vdbconf_model &m, std::string &location, const KNgcObj * ngc )
+{
+ uint32_t result_flags = 0;
+ bool res = m.import_ngc( location, ngc, INP_CREATE_REPOSITORY, &result_flags );
+ if ( res )
+ {
+ /* we have it imported or it exists and no changes made */
+ bool modified = false;
+ if ( result_flags & INP_CREATE_REPOSITORY )
+ {
+ /* success is the most common outcome, the repository was created */
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "project successfully imported" );
+ update_view( dlg );
+ modified = true;
+ }
+ else
+ {
+ /* repository did exist and is completely identical to the given ngc-obj */
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "this project exists already, no changes made" );
+ }
+
+ std::ostringstream question;
+ question << "do you want to change the location?";
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) )
+ {
+ uint32_t id;
+ if ( m.get_id_of_ngc_obj( ngc, &id ) )
+ modified |= on_pick_protected_location( dlg, id );
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "cannot find the imported repostiory" );
+ }
+
+ if ( modified )
+ {
+ m.commit();
+ update_view( dlg );
+ m.mkdir(ngc);
+ }
+ }
+ else if ( result_flags == 0 )
+ {
+ /* we are here if there was an error executing one of the internal functions */
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "there was an internal error importing the ngc-object" );
+ }
+ else
+ {
+ bool permitted = true;
+
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "the repository does already exist!" );
+ if ( result_flags & INP_UPDATE_ENC_KEY )
+ {
+ std::ostringstream question;
+ question << "encryption-key would change, continue ?";
+ permitted = ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) );
+ }
+
+ if ( permitted && ( result_flags & INP_UPDATE_DNLD_TICKET ) )
+ {
+ std::ostringstream question;
+ question << "download-ticket would change, continue ?";
+ permitted = ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) );
+ }
+
+ if ( permitted && ( result_flags & INP_UPDATE_DESC ) )
+ {
+ std::ostringstream question;
+ question << "description would change, continue ?";
+ permitted = ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) );
+ }
+
+ if ( permitted )
+ {
+ uint32_t result_flags2 = 0;
+ res = m.import_ngc( location, ngc, result_flags, &result_flags2 );
+ if ( res )
+ {
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "project successfully updated" );
+
+ std::ostringstream question;
+ question << "do you want to change the location?";
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) )
+ {
+ uint32_t id; /* we have to find out the id of the imported/existing repository */
+ if ( m.get_id_of_ngc_obj( ngc, &id ) )
+ on_pick_protected_location( dlg, id );
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "cannot find the imported repostiory" );
+ }
+ m.commit();
+ update_view( dlg );
+ }
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "there was an internal error importing the ngc-object" );
+ }
+ else
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 120, 6 ), "the import was canceled" );
+ }
+ return res;
+}
+
+
+bool vdbconf_controller::import_this_ngc( Dlg &dlg, vdbconf_model &m, const KNgcObj * ngc )
+{
+ bool res = false;
+
+ std::string location_base = m.get_user_default_dir();
+ std::string location = m.get_ngc_root( location_base, ngc );
+ ESetRootState es = m.prepare_repo_directory( location );
+ switch ( es )
+ {
+ case eSetRootState_OK : res = import_this_ngc_into_this_location( dlg, m, location, ngc );
+ break;
+
+ case eSetRootState_OldNotEmpty : if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ),
+ "repository location is not empty, use it?" ) )
+ {
+ es = m.prepare_repo_directory( location, true );
+ if ( es == eSetRootState_OK )
+ res = import_this_ngc_into_this_location( dlg, m, location, ngc );
+ else
+ res = on_set_location_error( dlg, es );
+ }
+ break;
+
+ default : res = on_set_location_error( dlg, es ); break;
+ }
+ return res;
+}
+
+
+std::string vdbconf_controller::get_import_ngc_start_dir( vdbconf_model &model )
+{
+ std::string res = model.get_home_dir();
+ if ( !model.does_path_exist( res ) )
+ res = model.get_current_dir();
+ return res;
+}
+
+
+bool vdbconf_controller::on_import_ngc( Dlg &dlg )
+{
+ bool res = false;
+ std::string start_dir = get_import_ngc_start_dir( priv_model );
+ /* ( 1 ) pick a ngc-file */
+ std::string picked = vdbconf_pick_file( dlg, dlg.center( 5, 5 ), start_dir.c_str(), "ngc" );
+ if ( picked.length() > 0 )
+ {
+ std::ostringstream question;
+ question << "do you want to import '" << picked << "' ?";
+ /* ( 2 ) confirm the choice */
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) )
+ {
+ const KNgcObj * ngc;
+ if ( make_ngc_obj( &ngc, picked ) )
+ {
+ res = import_this_ngc( dlg, priv_model, ngc );
+ KNgcObjRelease( ngc );
+ }
+ }
+ }
+ return res;
+}
+
+
+std::string vdbconf_controller::change_dflt_import_path_start_dir( vdbconf_model &model )
+{
+ std::string res = model.get_user_default_dir();
+ if ( !model.does_path_exist( res ) )
+ res = model.get_home_dir();
+ if ( !model.does_path_exist( res ) )
+ res = model.get_current_dir();
+ return res;
+}
+
+
+bool vdbconf_controller::on_change_dflt_import_path( Dlg &dlg )
+{
+ bool res = false;
+
+ std::string path = change_dflt_import_path_start_dir( priv_model );
+
+ if ( priv_model.does_path_exist( path ) )
+ res = vdbconf_pick_dir( dlg, dlg.center( 5, 5 ), path );
+ else
+ res = vdbconf_input( dlg, Tui_Rect( 5, 5, 100, 6 ), "change default import path", path );
+
+ if ( res )
+ {
+ priv_model.set_user_default_dir( path.c_str() );
+ vdbconf_msg( dlg, Tui_Rect( 5, 5, 100, 6 ), "default import path changed" );
+ }
+ return res;
+}
+
+
+bool vdbconf_controller::change_proxy( Dlg &dlg )
+{
+ std::string proxy = priv_model.get_http_proxy_path();
+ bool res = vdbconf_input( dlg, Tui_Rect( 5, 5, 100, 6 ), "change proxy", proxy );
+ if ( res )
+ {
+ priv_model.set_http_proxy_path( proxy.c_str() );
+ dlg.SetWidgetCaption( ID_L_PROXY, proxy );
+ }
+ return res;
+}
+
+bool vdbconf_controller::on_set_location_error( Dlg &dlg, ESetRootState s )
+{
+ bool result = false;
+ Tui_Rect r( 5, 5, 100, 6 );
+ switch ( s )
+ {
+ case eSetRootState_NotChanged : result = true; break;
+ case eSetRootState_NotUnique : vdbconf_msg( dlg, r, "location not unique, select a different one" ); break;
+ case eSetRootState_MkdirFail : vdbconf_msg( dlg, r, "could not created directory, maybe permisson problem" ); break;
+ case eSetRootState_NewPathEmpty : vdbconf_msg( dlg, r, "you gave me an empty path" ); break;
+ case eSetRootState_NewDirNotEmpty : vdbconf_msg( dlg, r, "the given location is not empty" ); break;
+ case eSetRootState_NewNotDir : vdbconf_msg( dlg, r, "new location is not a directory" ); break;
+ case eSetRootState_Error : vdbconf_msg( dlg, r, "error changing location" ); break;
+ default : vdbconf_msg( dlg, r, "unknow enum" ); break;
+ }
+ return result;
+}
+
+
+bool vdbconf_controller::on_pick_public_location( Dlg &dlg )
+{
+ bool res = false;
+ std::string path = public_location_start_dir( priv_model );
+
+ if ( priv_model.does_path_exist( path ) )
+ res = vdbconf_pick_dir( dlg, dlg.center( 5, 5 ), path );
+ else
+ res = vdbconf_input( dlg, Tui_Rect( 5, 5, 100, 6 ), "location of public cache", path );
+
+ if ( res && path.length() > 0 )
+ {
+ std::ostringstream question;
+ question << "do you want to change the location to '" << path << "' ?";
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) )
+ {
+ bool flushOld = false;
+ bool reuseNew = false;
+ ESetRootState s = priv_model.set_public_location( flushOld, path, reuseNew );
+ switch ( s )
+ {
+ case eSetRootState_OK : dlg.SetWidgetCaption( ID_L_PUBLIC_LOC, path );
+ res = true;
+ break;
+
+ case eSetRootState_OldNotEmpty : if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ),
+ "prev. location is not empty, flush it?" ) )
+ {
+ flushOld = true;
+ s = priv_model.set_public_location( flushOld, path, reuseNew );
+ res = ( s == eSetRootState_OK );
+ if ( res )
+ dlg.SetWidgetCaption( ID_L_PUBLIC_LOC, path );
+ else
+ res = on_set_location_error( dlg, s );
+ }
+ break;
+
+ default : res = on_set_location_error( dlg, s ); break;
+ }
+ }
+ }
+ return res;
+}
+
+
+bool vdbconf_controller::on_pick_protected_location( Dlg &dlg, uint32_t id )
+{
+ bool res = false;
+ std::string path = protected_location_start_dir( priv_model, id );
+
+ if ( priv_model.does_path_exist( path ) )
+ res = vdbconf_pick_dir( dlg, dlg.center( 5, 5 ), path );
+ else
+ res = vdbconf_input( dlg, Tui_Rect( 5, 5, 100, 6 ), "location of dbGaP project", path );
+
+ if ( res && path.length() > 0 )
+ {
+ std::ostringstream question;
+ question << "do you want to change the loction of '" << priv_model.get_repo_name( id ) <<"' to '" << path << "' ?";
+ if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ), question.str().c_str() ) )
+ {
+ bool flushOld = false;
+ bool reuseNew = false;
+ ESetRootState s = priv_model.set_repo_location( id, flushOld, path, reuseNew );
+ switch ( s )
+ {
+ case eSetRootState_OK : dlg.SetWidgetCaption( ID_L_PROT_LOC + id, path );
+ res = true;
+ break;
+
+ case eSetRootState_OldNotEmpty : if ( vdbconf_question( dlg, Tui_Rect( 5, 5, 120, 6 ),
+ "prev. location is not empty, flush it?" ) )
+ {
+ flushOld = true;
+ s = priv_model.set_repo_location( id, flushOld, path, reuseNew );
+ res = ( s == eSetRootState_OK );
+ if ( res )
+ dlg.SetWidgetCaption( ID_L_PROT_LOC + id, path );
+ else
+ res = on_set_location_error( dlg, s );
+ }
+ break;
+
+ default : res = on_set_location_error( dlg, s ); break;
+ }
+ }
+ }
+ return res;
+}
+
+
+bool vdbconf_controller::on_protected_repo( Dlg &dlg, Tui_Dlg_Event &dev )
+{
+ bool res = false;
+ uint32_t id = dev.get_widget_id();
+ if ( id >= ID_B_PROT_LOC && id < ( ID_B_PROT_LOC + 100 ) )
+ {
+ vdbconf_model &m( priv_model );
+ uint32_t repo_id = ( id - ID_B_PROT_LOC );
+ if ( repo_id < m.get_repo_count() )
+ res = on_pick_protected_location( dlg, repo_id );
+ }
+ return res;
+}
+
+
+bool vdbconf_controller::on_select( Dlg &dlg, void * data, Tui_Dlg_Event &dev )
+{
+ bool res = false;
+ vdbconf_model &m( vdbconf_controller::priv_model );
+ switch( dev.get_widget_id() )
+ {
+ case ID_B_SAVE : res = on_save( dlg ); break;
+ case ID_B_EXIT : res = on_exit( dlg ); break;
+ case ID_B_RELOAD : res = on_reload( dlg ); break;
+ case ID_B_FACT_DFLT : res = on_fact_dflt( dlg ); break;
+
+ case ID_CB_REMOTE : m.set_remote_enabled( dev.get_value_1() == 1 ); res = true; break;
+ case ID_CB_CACHED : m.set_global_cache_enabled( dev.get_value_1() == 1 ); res = true; break;
+
+ case ID_CB_SITE : if ( priv_model.does_site_repo_exist() )
+ m.set_site_enabled( dev.get_value_1() == 1 );
+ res = true;
+ break;
+
+ case ID_CB_PROXY : m.set_http_proxy_enabled( dev.get_value_1() == 1 ); res = true; break;
+ case ID_B_PROXY : res = change_proxy( dlg ); break;
+
+ case ID_CB_PROXY_ENV : m.set_http_proxy_env_higher_priority( dev.get_value_1() == 1 ); res = true; break;
+
+ case ID_B_PUBLIC_LOC : res = on_pick_public_location( dlg ); break;
+
+ case ID_B_IMPORT_NGC : res = on_import_ngc( dlg ); break;
+ case ID_B_USR_DFLT_PATH : res = on_change_dflt_import_path( dlg ); break;
+
+ default : res = on_protected_repo( dlg, dev ); break;
+ }
+ return res;
+};
+
+
+void vdbconf_controller::on_focused_protected_repo( Dlg &dlg, uint32_t widget_id )
+{
+ if ( widget_id >= ID_B_PROT_LOC && widget_id < ( ID_B_PROT_LOC + 100 ) )
+ status_txt( dlg, FOCUS_TXT_B_PROT_LOC );
+ else
+ status_txt( dlg, "???" );
+}
+
+
+bool vdbconf_controller::on_focused( Dlg &dlg, uint32_t widget_id )
+{
+ if ( widget_id > 1000 ) return false;
+
+ switch( widget_id )
+ {
+ case ID_B_SAVE : status_txt( dlg, FOCUS_TXT_B_SAVE ); break;
+ case ID_B_EXIT : status_txt( dlg, FOCUS_TXT_B_EXIT ); break;
+ case ID_B_RELOAD : status_txt( dlg, FOCUS_TXT_B_RELOAD ); break;
+ case ID_B_FACT_DFLT : status_txt( dlg, FOCUS_TXT_B_FACT_DFLT ); break;
+
+ case ID_CB_REMOTE : status_txt( dlg, FOCUS_TXT_CB_REMOTE ); break;
+ case ID_CB_CACHED : status_txt( dlg, FOCUS_TXT_CB_CACHED ); break;
+ case ID_CB_SITE : status_txt( dlg, FOCUS_TXT_CB_SITE ); break;
+ case ID_CB_PROXY : status_txt( dlg, FOCUS_TXT_CB_PROXY ); break;
+ case ID_B_PROXY : status_txt( dlg, FOCUS_TXT_B_PROXY ); break;
+ case ID_CB_PROXY_ENV : status_txt( dlg, FOCUS_TXT_B_PROXY_ENV ); break;
+
+ case ID_B_PUBLIC_LOC : status_txt( dlg, FOCUS_TXT_B_PUBLIC_LOC ); break;
+ case ID_B_IMPORT_NGC : status_txt( dlg, FOCUS_TXT_B_IMPORT_NGC ); break;
+ case ID_B_USR_DFLT_PATH : status_txt( dlg, FOCUS_TXT_B_USR_DFLT_PATH ); break;
+
+ default : on_focused_protected_repo( dlg, widget_id ); break;
+ }
+ return false;
+}
+
+/* ------------------------------------------------------------------------------------------------------------------------------------- */
+
+extern "C"
+{
+ rc_t run_interactive ( vdbconf_model & model )
+ {
+ try
+ {
+ /* (2) ... create derived view, the view creates the widgets in its constructor... */
+ vdbconf_view view( model );
+
+ /* (3) ... create derived controller, hand it the view and the model*/
+ vdbconf_controller controller( view, model );
+
+ /* (4) ... let the controller handle the events */
+ controller.run();
+
+ /* (5) call this before leaving main() to terminate the low-level driver... */
+ Tui::clean_up();
+ }
+ catch ( ... )
+ {
+ return RC( rcExe, rcNoTarg, rcExecuting, rcNoObj, rcUnknown );
+ }
+ return 0;
+ }
+}
diff --git a/tools/vdb-config/interactive.h b/tools/vdb-config/interactive.h
new file mode 100644
index 0000000..da16088
--- /dev/null
+++ b/tools/vdb-config/interactive.h
@@ -0,0 +1,50 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_interacive_
+#define _h_interacive_
+
+#include "vdb-config-model.hpp" // vdbconf_model
+
+#ifndef _h_kfc_defs_
+#include <kfc/defs.h>
+#endif
+
+#ifndef _h_vdb_config_model_
+#include "vdb-config-model.hpp"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ rc_t run_interactive ( vdbconf_model & model );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_interacive_ */
diff --git a/tools/vdb-config/util.cpp b/tools/vdb-config/util.cpp
new file mode 100644
index 0000000..f01b63a
--- /dev/null
+++ b/tools/vdb-config/util.cpp
@@ -0,0 +1,1084 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kfg/kfg-priv.h> /* KConfigFixMainResolverCgiNode */
+#include <klib/printf.h> /* string_printf */
+
+#include "util.hpp" // CStdIn
+
+#include <sstream> // ostringstream
+
+#include <climits> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+using std::string;
+
+rc_t CStdIn::Read(char *buffer, size_t bsize, size_t *num_read) {
+ size_t dummy = 0;
+ if (num_read == NULL) {
+if (DEBUG) OUTMSG(("<<< Read: num_read == NULL\n"));
+ num_read = &dummy;
+ }
+
+ if (bsize == 0) {
+ *num_read = 0;
+ return 0;
+ }
+
+ rc_t rc = KFileRead(m_Self, m_Pos, buffer, bsize, num_read);
+ if (rc == 0) {
+ m_Pos += *num_read;
+ size_t last = *num_read;
+ if (*num_read >= bsize) {
+ last = bsize - 1;
+ }
+
+ while (true) {
+ buffer[last] = '\0';
+ if (last == 0) {
+ break;
+ }
+ --last;
+ if (buffer[last] != '\n' && buffer[last] != '\r') {
+ break;
+ }
+ --*num_read;
+ }
+ }
+
+if (DEBUG) OUTMSG(("<<< Read: num_read = %d\n", *num_read));
+
+return rc;
+}
+
+rc_t CKDirectory::CanWriteFile(const CString &dir, bool verbose) const {
+ bool ok = true;
+ rc_t rc = 0;
+ char path[PATH_MAX] = "";
+ if (verbose) {
+ OUTMSG(("checking whether %S is writable... ", dir.Get()));
+ }
+ for (int i = 0; i < 10000 && rc == 0; ++i) {
+ size_t path_len = 0;
+ rc = string_printf(path, sizeof path, &path_len,
+ "%S/.tmp%d.tmp", dir.Get(), i);
+ if (rc != 0) {
+ break;
+ }
+ assert(path_len <= sizeof path);
+ if (Exists(path)) {
+ KDirectoryRemove(m_Self, false, path);
+ }
+ else {
+ KFile *f = NULL;
+ rc = KDirectoryCreateFile(m_Self,
+ &f, false, m_PrivateAccess, kcmCreate, path);
+ if (rc == 0) {
+ rc = KFileWrite(f, 0, path, path_len, NULL);
+ }
+ RELEASE(KFile, f);
+ const KFile *cf = NULL;
+ if (rc == 0) {
+ rc = KDirectoryOpenFileRead(m_Self, &cf, path);
+ }
+ char buffer[PATH_MAX] = "";
+ size_t num_read = 0;
+ if (rc == 0) {
+ rc = KFileRead(cf, 0, buffer, sizeof buffer, &num_read);
+ }
+ if (rc == 0) {
+ if (path_len != num_read || string_cmp(path,
+ path_len, buffer, num_read, sizeof buffer) != 0)
+ {
+ if (verbose) {
+ OUTMSG(("no\n"));
+ }
+ OUTMSG(("Warning: "
+ "NCBI Home directory is not writable"));
+ ok = false;
+ }
+ }
+ RELEASE(KFile, cf);
+ if (rc == 0) {
+ KDirectoryRemove(m_Self, false, path);
+ }
+ break;
+ }
+ }
+ if (verbose && ok) {
+ if (rc == 0) {
+ OUTMSG(("yes\n"));
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+ return rc;
+}
+
+rc_t CKDirectory::CheckAccess(const CString &path,
+ bool &updated, bool isPrivate, bool verbose) const
+{
+ updated = false;
+ const String *str = path.Get();
+ if (str == NULL) {
+ return 0;
+ }
+ uint32_t access = 0;
+ if (verbose) {
+ OUTMSG(("checking %S file mode... ", path.Get()));
+ }
+ rc_t rc = KDirectoryAccess(m_Self, &access, str->addr);
+ if (rc != 0) {
+ OUTMSG(("failed\n"));
+ }
+ else {
+ if (verbose) {
+ OUTMSG(("%o\n", access));
+ }
+ if (isPrivate) {
+ if (access != m_PrivateAccess) {
+ uint32_t access = 0777;
+ if (verbose) {
+ OUTMSG(("updating %S to %o... ", str, access));
+ }
+ rc = KDirectorySetAccess(m_Self, false,
+ m_PrivateAccess, access, str->addr);
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ updated = true;
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+ }
+ else {
+ if ((access & m_PrivateAccess) != m_PrivateAccess) {
+ uint32_t access = 0700;
+ if (verbose) {
+ OUTMSG(("updating %S to %o... ", str, access));
+ }
+ rc = KDirectorySetAccess(m_Self, false,
+ m_PrivateAccess, access, str->addr);
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ updated = true;
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t CKDirectory::CreateNonExistingDir(bool verbose,
+ uint32_t access, const char *path, va_list args) const
+{
+ char str[PATH_MAX] = "";
+ rc_t rc = string_vprintf(str, sizeof str, NULL, path, args);
+ if (rc != 0) {
+ OUTMSG(("error: cannot generate path string\n"));
+ return rc;
+ }
+
+ return CreateNonExistingDir(str, access, verbose, true);
+}
+
+rc_t CKDirectory::CreateNonExistingDir(const string &path,
+ uint32_t access, bool verbose, bool checkExistance) const
+{
+ const char *str = path.c_str();
+
+ if (checkExistance) {
+ if (verbose) {
+ OUTMSG(("checking whether %s exists... ", str));
+ }
+ if (Exists(str)) {
+ if (verbose) {
+ OUTMSG(("found\n"));
+ }
+ return 0;
+ }
+ }
+
+ if (verbose) {
+ OUTMSG(("creating... "));
+ }
+
+ rc_t rc = KDirectoryCreateDir(m_Self, access,
+ (kcmCreate | kcmParents), str);
+ if (verbose) {
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+
+ return rc;
+}
+
+rc_t CKDirectory::CreateNonExistingDir(const CString &path,
+ uint32_t access, bool verbose) const
+{
+ const String *str = path.Get();
+ if (str == NULL) {
+ return 0;
+ }
+
+ if (verbose) {
+ OUTMSG(("checking whether %S exists... ", str));
+ }
+
+ if (Exists(str->addr)) {
+ if (verbose) {
+ OUTMSG(("found\n"));
+ }
+ return 0;
+ }
+
+ if (verbose) {
+ OUTMSG(("creating... "));
+ }
+
+ rc_t rc = KDirectoryCreateDir(m_Self, access,
+ (kcmCreate | kcmParents), str->addr);
+ if (verbose) {
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+
+ return rc;
+}
+
+rc_t CKConfig::Commit(void) const {
+ if (!m_Updated) {
+ return 0;
+ }
+
+ return KConfigCommit(m_Self);
+}
+
+rc_t CKConfig::CreateRemoteRepositories(bool fix) {
+ rc_t rc = UpdateNode("/repository/remote/main/CGI/resolver-cgi",
+ "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi");
+
+ if (fix) {
+ const string name("/repository/remote/main/CGI/disabled");
+ if (NodeExists(name)) {
+ rc_t r2 = UpdateNode(name.c_str(), "false");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+ }
+
+ rc_t r2 = UpdateNode("/repository/remote/protected/CGI/resolver-cgi",
+ "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ if (fix) {
+ const string name("/repository/remote/disabled");
+ if (NodeExists(name)) {
+ rc_t r2 = UpdateNode(name.c_str(), "false");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+ }
+
+ return rc;
+}
+
+rc_t CKConfig::CreateUserRepository(string repoName, bool fix) {
+ if (repoName.size() == 0) {
+ repoName = "public";
+ }
+ CString cRoot(ReadString("/repository/user/default-path"));
+ string root;
+ if (cRoot.Empty()) {
+ root = "$(HOME)/ncbi";
+ }
+ else {
+ root = cRoot.GetString();
+ }
+
+ std::ostringstream s;
+ s << "/repository/user/" << (repoName == "public" ? "main" : "protected")
+ << "/" << repoName;
+ string repoNode(s.str());
+ string name(repoNode + "/root");
+ bool toFix = true;
+ if (fix) {
+ toFix = !NodeExists(name);
+ }
+ rc_t rc = 0;
+ if (toFix) {
+ rc = UpdateNode(name, (root + "/public").c_str());
+ }
+
+ rc_t r2 = UpdateNode(repoNode + "/apps/file/volumes/flat", "files");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ r2 = UpdateNode(repoNode + "/apps/sra/volumes/sraFlat", "sra");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ if (repoName == "public") {
+ r2 = UpdateNode(repoNode + "/apps/nakmer/volumes/nakmerFlat", "nannot");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ r2 = UpdateNode(repoNode + "/apps/nannot/volumes/nannotFlat", "nannot");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ r2 = UpdateNode(repoNode + "/apps/refseq/volumes/refseq", "refseq");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ r2 = UpdateNode(repoNode + "/apps/wgs/volumes/wgsFlat", "wgs");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+
+ r2 = UpdateNode(repoNode + "/cache-enabled", "true");
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ return rc;
+}
+
+rc_t CKConfig::DisableRemoteRepository(bool disable) {
+ const char *value = disable ? "true" : "false";
+ rc_t rc = UpdateNode(m_RepositoryRemoteMainDisabled, value);
+
+ rc_t r2 = UpdateNode(m_RepositoryRemoteAuxDisabled, value);
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ return rc;
+}
+
+bool CKConfig::IsRemoteRepositoryDisabled(void) const {
+ const CString disabled(ReadString(m_RepositoryRemoteMainDisabled));
+
+ if (disabled.Equals("true")) {
+ const CString disabled(ReadString(m_RepositoryRemoteAuxDisabled));
+ return disabled.Equals("true");
+ }
+
+ return false;
+}
+
+bool CKConfig::NodeExists(const string &path) const {
+ const KConfigNode *n = OpenNodeRead(path.c_str());
+ if (n == NULL) {
+ return false;
+ }
+ KConfigNodeRelease(n);
+ return true;
+}
+
+const KConfigNode* CKConfig::OpenNodeRead(const char *path, ...) const {
+ va_list args;
+ va_start(args, path);
+
+ const KConfigNode *node = NULL;
+ rc_t rc = KConfigVOpenNodeRead(m_Self, &node, path, args);
+
+ va_end(args);
+
+ if (rc != 0) {
+ return NULL;
+ }
+
+ return node;
+}
+
+const String* CKConfig::ReadString(const char *path) const {
+ String *result = NULL;
+ rc_t rc = KConfigReadString(m_Self, path, &result);
+
+ if (rc != 0) {
+ return NULL;
+ }
+ return result;
+}
+
+void CKConfig::Reload(bool verbose) {
+ if (verbose) {
+ OUTMSG(("reloading configuration... "));
+ }
+
+ rc_t rc = KConfigRelease(m_Self);
+ m_Self = NULL;
+
+ if (rc == 0) {
+ rc = KConfigMake(&m_Self, NULL);
+ }
+
+ if (rc == 0) {
+ if (verbose) {
+ OUTMSG(("ok\n"));
+ }
+ }
+ else {
+ if (verbose) {
+ OUTMSG(("failed\n"));
+ }
+ throw rc;
+ }
+}
+
+rc_t CKConfig::UpdateNode(const char *path,
+ const char *buffer, bool verbose, size_t size)
+{
+ if (DEBUG) {
+ OUTMSG(("CKConfig::UpdateNode(%s, %s, %d)\n", path, buffer, size));
+ }
+
+ if (verbose) {
+ OUTMSG(("%s = ... ", path));
+ }
+
+ if (size == (size_t)~0) {
+ size = string_size(buffer);
+ }
+
+ KConfigNode *node = NULL;
+ rc_t rc = KConfigOpenNodeUpdate(m_Self, &node, path);
+// TODO do not write empty node if node itself is empty
+ if (rc == 0) {
+ rc = KConfigNodeWrite(node, buffer, size);
+ }
+ if (rc == 0) {
+ m_Updated = true;
+ }
+ RELEASE(KConfigNode, node);
+
+ if (rc == 0) {
+ if (verbose) {
+ OUTMSG(("\"%s\"\n", buffer));
+ }
+ }
+ else {
+ if (verbose) {
+ OUTMSG(("failed: %R\n", buffer, rc));
+ }
+ else {
+ OUTMSG(("%s = ... failed: %R\n", path, rc));
+ }
+ }
+
+ return rc;
+}
+
+rc_t CKConfig::UpdateUserRepositoryRootPath(const CString &path) {
+ const String *str = path.Get();
+
+ if (str == NULL) {
+ return 0;
+ }
+ return UpdateUserRepositoryRootPath(str->addr, str->size);
+}
+
+rc_t StringRelease(const String *self) {
+ free((void*)self);
+ return 0;
+}
+
+rc_t CSplitter::Test(void) {
+ String s;
+ { StringInit(&s, NULL, 0, 0);
+ CSplitter p(&s);
+ assert(!p.HasNext());
+ }
+ { CONST_STRING(&s, "");
+ CSplitter p(&s);
+ assert(!p.HasNext());
+ }
+ {
+ CONST_STRING(&s, "a");
+ CSplitter p(&s);
+ assert(p.HasNext());
+ assert(p.Next() == "a");
+ assert(!p.HasNext());
+ }
+ {
+ CONST_STRING(&s, "a:");
+ CSplitter p(&s);
+ assert(p.HasNext());
+ assert(p.Next() == "a");
+ assert(!p.HasNext());
+ }
+ {
+ CONST_STRING(&s, "a::");
+ CSplitter p(&s);
+ assert(p.HasNext());
+ assert(p.Next() == "a");
+ assert(!p.HasNext());
+ }
+ {
+ CONST_STRING(&s, "::a::");
+ CSplitter p(&s);
+ assert(p.HasNext());
+ assert(p.Next() == "a");
+ assert(!p.HasNext());
+ }
+ {
+ CONST_STRING(&s, "aa:bbb");
+ CSplitter p(&s);
+ assert(p.HasNext());
+ assert(p.Next() == "aa");
+ assert(p.HasNext());
+ assert(p.Next() == "bbb");
+ assert(!p.HasNext());
+ } return 0;
+}
+
+CUserConfigData::CUserConfigData(const CUserRepositories &repos,
+ const CString &dflt)
+ : m_DefaultRoot(dflt.GetString())
+ , m_CurrentRoot(repos.GetMainPublicRoot())
+ , m_CacheEnabled(repos.IsMainPublicCacheEnabled())
+{}
+
+rc_t CKDirectory::CreateNonExistingPublicDir(bool verbose,
+ const char *path, ...) const
+{
+ va_list args;
+ va_start(args, path);
+
+ rc_t rc = CreateNonExistingDir(verbose, m_PublicAccess, path, args);
+
+ va_end(args);
+
+ return rc;
+}
+
+bool CKDirectory::IsDirectory(const char *path, ...) const {
+ va_list args;
+ va_start(args, path);
+
+ KPathType type = KDirectoryVPathType(m_Self, path, args);
+
+ va_end(args);
+
+ return type == kptDir;
+}
+
+bool CKDirectory::Exists(const CString &path) const {
+ const String *str = path.Get();
+
+ if (str == NULL) {
+ return false;
+ }
+ return Exists(str->addr);
+}
+
+rc_t CKDirectory::CheckPublicAccess(const CString &path, bool verbose) const {
+ bool updated = false;
+ return CheckAccess(path, updated, false, verbose);
+}
+
+rc_t CKConfig::UpdateNode(bool verbose,
+ const char *value, const char *name, ...)
+{
+ va_list args;
+ va_start(args, name);
+
+ char dst[4096] = "";
+ size_t num_writ = 0;
+ rc_t rc = string_vprintf(dst, sizeof dst, &num_writ, name, args);
+ if (rc == 0) {
+ rc = UpdateNode(dst, value, verbose);
+ }
+
+ va_end(args);
+
+ return rc;
+}
+
+rc_t CKConfig::FixResolverCgiNodes ( void ) {
+ rc_t rc = KConfigFixMainResolverCgiNode ( m_Self );
+ rc_t r2 = KConfigFixProtectedResolverCgiNode ( m_Self );
+ if ( rc == 0 && r2 == 0 ) {
+ m_Updated = true;
+ } else {
+ if ( rc == 0 ) {
+ rc = r2;
+ }
+ }
+ return rc;
+}
+
+CApp::CApp(const CKDirectory &dir, const CKConfigNode &rep,
+ const string &root, const string &name)
+ : m_HasVolume(false)
+ , m_AppVolPath("apps/" + name + "/volumes")
+{
+ const KConfigNode *vols = rep.OpenNodeRead(m_AppVolPath);
+ KNamelist *typeNames = NULL;
+ rc_t rc = KConfigNodeListChildren(vols, &typeNames);
+ if (rc != 0) {
+ return;
+ }
+ uint32_t count = 0;
+ rc = KNamelistCount(typeNames, &count);
+ if (rc == 0) {
+ for (uint32_t idx = 0; idx < count; ++idx) {
+ const char *typeName = NULL;
+ rc = KNamelistGet(typeNames, idx, &typeName);
+ if (rc != 0) {
+ continue;
+ }
+ const KConfigNode *alg = NULL;
+ rc = KConfigNodeOpenNodeRead(vols, &alg, typeName);
+ if (rc != 0) {
+ continue;
+ }
+ String *volList = NULL;
+ rc = KConfigNodeReadString(alg, &volList);
+ if (rc == 0) {
+ if (volList != NULL && volList->addr != NULL) {
+ m_Volumes[typeName]
+ = CAppVolume(typeName, volList->addr);
+ }
+ CSplitter volArray(volList);
+ while (volArray.HasNext()) {
+ const string vol(volArray.Next());
+ if (dir.IsDirectory("%s/%s", root.c_str(), vol.c_str()))
+ {
+ m_HasVolume = true;
+ break;
+ }
+ }
+ }
+ RELEASE(String, volList);
+ RELEASE(KConfigNode, alg);
+ }
+ }
+ RELEASE(KNamelist, typeNames);
+ RELEASE(KConfigNode, vols);
+}
+
+rc_t CRepository::Update(CKConfig &kfg, string &node, bool verbose) {
+ char root[4096] = "";
+ rc_t rc = string_printf(root, sizeof root, NULL, "/repository/%s/%s/%s",
+ m_Category.c_str(), m_SubCategory.c_str(), m_Name.c_str());
+ if (rc != 0) {
+ OUTMSG(("ERROR\n"));
+ return rc;
+ }
+
+ if (DEBUG) {
+ OUTMSG(("CRepository::Update: root = %s\n", root));
+ }
+
+ node.assign(root);
+
+ for (CApps::TCI it = m_Apps.begin(); it != m_Apps.end(); ++it) {
+ rc_t r2 = (*it).second->Update(kfg, root, verbose);
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+
+ rc_t r2 = kfg.UpdateNode(verbose, m_Root.c_str(), "%s/root", root);
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+
+ return rc;
+}
+
+CRepository::CRepository(const string &category, const string &type,
+ const string &name, const string &root)
+ : m_Disabled(false)
+ , m_Category(category)
+ , m_SubCategory(type)
+ , m_Name(name)
+ , m_Root(root)
+{}
+
+CRepository::CRepository(const CKDirectory &dir, const CKConfigNode &repo,
+ const string &category, const string &subCategory,
+ const string &name)
+ : m_Disabled(false)
+ , m_Category(category)
+ , m_SubCategory(subCategory)
+ , m_Name(name)
+ , m_Root(repo.ReadString("root"))
+{
+ m_Apps.Update(dir, repo, m_Root, "sra");
+ m_Apps.Update(dir, repo, m_Root, "refseq");
+ string disabled(repo.ReadString("disabled"));
+ if (disabled == "true") {
+ m_Disabled = true;
+ }
+}
+
+string CRepository::Dump(void) const {
+ char node[4096] = "";
+ rc_t rc = string_printf(node, sizeof node, NULL,
+ "/repository/%s/%s/%s", m_Category.c_str(),
+ m_SubCategory.c_str(), m_Name.c_str(), m_Root.c_str());
+ if (rc != 0) {
+ OUTMSG(("ERROR\n"));
+ return "";
+ }
+
+ for (CApps::TCI it = m_Apps.begin(); it != m_Apps.end(); ++it) {
+ (*it).second->Dump(node);
+ }
+
+ if (m_Root.size() > 0) {
+ OUTMSG(("%s/root = \"%s\"\n", node, m_Root.c_str()));
+ }
+
+ return node;
+}
+
+bool CRepository::Is(const string &subCategory, const string &name)
+ const
+{
+ if (name.size() <= 0) {
+ return m_SubCategory == subCategory;
+ }
+
+ return m_SubCategory == subCategory && m_Name == name;
+}
+
+string CRemoteRepository::GetRoot(const string &stack, char needle)
+{
+ if (EndsWith(stack, needle)) {
+ return "";
+ }
+ else {
+ return stack;
+ }
+}
+
+string CRemoteRepository::GetCgi(const string &stack, char needle)
+{
+ if (EndsWith(stack, needle)) {
+ return stack;
+ }
+ else {
+ return "";
+ }
+}
+
+bool CRemoteRepository::EndsWith(const string &stack, char needle) {
+ if (stack.size() <= 0) {
+ return false;
+ }
+ return stack[stack.size() - 1] == needle;
+}
+
+rc_t CRemoteRepository::Fix(CKConfig &kfg, bool disable, bool verbose) {
+ if (verbose) {
+ OUTMSG(("checking %s %s remote repository\n",
+ GetCategory().c_str(), GetSubCategory().c_str()));
+ }
+
+ Disable(disable);
+
+ if (Is("main")) {
+ m_ResolverCgi
+ = "https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi";
+ ClearApps();
+ }
+ else {
+ m_ResolverCgi = "";
+ FixApps();
+ SetRoot("https://ftp-trace.ncbi.nlm.nih.gov/sra");
+ }
+
+ return Update(kfg);
+}
+
+rc_t CUserRepository::Fix(CKConfig &kfg,
+ const CUserConfigData *data, const string *root)
+{
+ Disable(false);
+
+ if (DEBUG) {
+ OUTMSG((__FILE__ " CUserRepository::Fix: data = %d\n", data));
+ }
+
+ if (data != NULL) {
+ m_CacheEnabled = data->GetCacheEnabled();
+ const string root(data->GetCurrentRoot());
+ if (root.size() > 0) {
+ if (DEBUG) {
+ OUTMSG((__FILE__ " CUserRepository::Fix: SetRoot to %s\n",
+ root.c_str()));
+ }
+ SetRoot(root);
+ }
+ }
+ else {
+ m_CacheEnabled = true;
+ assert(root);
+ SetRoot(*root);
+ }
+
+ FixApps();
+
+ return Update(kfg, DEBUG);
+}
+
+rc_t CUserRepositories::Load(const CKConfig &kfg, const CKDirectory &dir) {
+ const string category("main");
+
+ OUTMSG(("loading %s user repository... ", category.c_str()));
+ const KConfigNode *userNode = kfg.OpenNodeRead
+ ("/repository/user/%s", category.c_str());
+ if (userNode == NULL) {
+ OUTMSG(("not found\n"));
+ return 0;
+ }
+ const CKConfigNode user(userNode);
+ KNamelist *userNames = NULL;
+ rc_t rc = KConfigNodeListChildren(userNode, &userNames);
+ if (rc != 0) {
+ OUTMSG(("failed\n"));
+ }
+ uint32_t count = 0;
+ if (rc == 0) {
+ rc = KNamelistCount(userNames, &count);
+ }
+ if (rc != 0) {
+ OUTMSG(("failed\n"));
+ }
+ for (uint32_t idx = 0; idx < count && rc == 0; ++idx) {
+ const char *userName = NULL;
+ rc = KNamelistGet(userNames, idx, &userName);
+ if (rc != 0) {
+ rc = 0;
+ continue;
+ }
+ OUTMSG(("%s ", userName));
+ const KConfigNode *userRepo = user.OpenNodeRead(userName);
+ if (userRepo == NULL) {
+ continue;
+ }
+ CKConfigNode node(userRepo);
+ push_back(new CUserRepository(dir, node, category, userName));
+ }
+ RELEASE(KNamelist, userNames);
+
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+
+ return rc;
+}
+
+const CUserRepository *CUserRepositories::FindMainPublic(void) const {
+ for (TCI it = begin(); it != end(); ++it) {
+ CUserRepository *r = *it;
+ assert(r);
+ if (DEBUG) {
+ OUTMSG(("MainPublic not found\n"));
+ }
+ if (r->Is("main", "public")) {
+ return r;
+ }
+ }
+
+ return NULL;
+}
+
+rc_t CUserRepositories::MkAppVolumes(const CKDirectory &dir, bool verbose)
+ const
+{
+ rc_t rc = 0;
+
+ for (TCI it = begin(); it != end(); ++it) {
+ CUserRepository *r = *it;
+ assert(r);
+ const string root(r->GetRoot());
+ if (root.size() <= 0) {
+ continue;
+ }
+
+ for (CApps::TCI it = r->AppsBegin(); it != r->AppsEnd(); ++it) {
+ const CApp *a = (*it).second;
+ assert(a);
+ //a->Dump("a->Dump");
+ for (CApp::TCAppVolumesCI it = a->VolumesBegin();
+ it != a->VolumesEnd(); ++it)
+ {
+ const CAppVolume &v((*it).second);
+ const string path(v.GetPath());
+ if (path.size() <= 0) {
+ continue;
+ }
+ CSplitter s(path);
+ while (s.HasNext()) {
+ rc_t r2 = dir.CreateNonExistingPublicDir
+ (verbose, "%s/%s", root.c_str(), s.Next().c_str());
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+ }
+ }
+ }
+
+ return rc;
+}
+
+rc_t CRemoteRepositories::Load(const CKConfig &kfg, const CKDirectory &dir) {
+ rc_t rc = 0;
+ for (int i = 0; i < 2; ++i) {
+ string category;
+ switch (i) {
+ case 0:
+ category = "main";
+ break;
+ case 1:
+ category = "aux";
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ OUTMSG(("loading %s remote repository... ", category.c_str()));
+ const KConfigNode *remoteNode = kfg.OpenNodeRead
+ ("/repository/remote/%s", category.c_str());
+ if (remoteNode == NULL) {
+ OUTMSG(("not found\n"));
+ continue;
+ }
+ const CKConfigNode remote(remoteNode);
+ KNamelist *remoteNames = NULL;
+ rc = KConfigNodeListChildren(remoteNode, &remoteNames);
+ if (rc != 0) {
+ OUTMSG(("failed\n"));
+ }
+ uint32_t count = 0;
+ if (rc == 0) {
+ rc = KNamelistCount(remoteNames, &count);
+ }
+ if (rc != 0) {
+ OUTMSG(("failed\n"));
+ }
+ for (uint32_t idx = 0; idx < count && rc == 0; ++idx) {
+ const char *remoteName = NULL;
+ rc = KNamelistGet(remoteNames, idx, &remoteName);
+ if (rc != 0) {
+ rc = 0;
+ continue;
+ }
+ OUTMSG(("%s ", remoteName));
+ const KConfigNode *remoteRepo = remote.OpenNodeRead(remoteName);
+ if (remoteRepo == NULL) {
+ continue;
+ }
+ CKConfigNode node(remoteRepo);
+ push_back(new CRemoteRepository(dir,
+ node, category, remoteName));
+ }
+ RELEASE(KNamelist, remoteNames);
+ if (rc == 0) {
+ OUTMSG(("ok\n"));
+ }
+ else {
+ OUTMSG(("failed\n"));
+ }
+ }
+ return rc;
+}
+
+void CRemoteRepositories::Fix(CKConfig &kfg, bool disable, bool verbose) {
+ CRemoteRepository *main = NULL;
+ CRemoteRepository *protectd = NULL;
+
+ for (TCI it = begin(); it != end(); ++it) {
+ CRemoteRepository *r = *it;
+ assert(r);
+ bool toDisable = disable;
+ const string category(r->GetCategory());
+ if (category == "aux") {
+ continue;
+ }
+ else if (category == "main") {
+ main = r;
+ }
+ else if (category == "protected") {
+ protectd = r;
+ toDisable = false;
+ }
+ r->Fix(kfg, toDisable, verbose);
+ }
+
+ const string cgi
+ ("https://www.ncbi.nlm.nih.gov/Traces/names/names.cgi");
+ if (main == NULL) {
+ main = new CRemoteRepository("main", "CGI", cgi);
+ main->Fix(kfg, disable);
+ push_back(main);
+ }
+
+ if (protectd == NULL) {
+ protectd = new CRemoteRepository("protected", "CGI", cgi);
+ if (verbose) {
+ OUTMSG(("creating %s %s remote repository\n",
+ protectd->GetSubCategory().c_str(),
+ protectd->GetName().c_str()));
+ }
+ protectd->Fix(kfg, false);
+ push_back(protectd);
+ }
+}
diff --git a/tools/vdb-config/util.hpp b/tools/vdb-config/util.hpp
new file mode 100644
index 0000000..e657df9
--- /dev/null
+++ b/tools/vdb-config/util.hpp
@@ -0,0 +1,703 @@
+#ifndef _hpp_tools_vdb_config_util_
+#define _hpp_tools_vdb_config_util_
+
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h> /* string_printf */
+#include <klib/text.h> /* String */
+
+#include <kfg/config.h> /* KConfig */
+#include <kfs/directory.h> /* KDirectory */
+
+#include <kfs/file.h> /* KFile */
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include <cstring>
+
+static const bool DEBUG(false);
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+
+class CNoncopyable {
+public:
+ CNoncopyable(void) {}
+protected:
+ ~CNoncopyable(void) {}
+private:
+ // Prohibit copy constructor and assignment operator
+ CNoncopyable(const CNoncopyable&);
+ const CNoncopyable& operator=(const CNoncopyable&);
+};
+
+rc_t StringRelease(const String *self);
+
+class CString : CNoncopyable {
+ const String *m_Self;
+
+public:
+ CString(const String *self) : m_Self(self) {}
+
+ ~CString() { free((void*)m_Self); }
+
+ const String* Get(void) const { return m_Self; }
+ std::string GetString(void) const {
+ const char *s = GetCString();
+ if (s == NULL)
+ return "";
+ return s;
+ }
+ const char* GetCString(void) const {
+ if (Empty())
+ return NULL;
+ return m_Self->addr;
+ }
+
+ bool Empty(void) const {
+ return
+ m_Self == NULL || m_Self->addr == NULL || m_Self->addr[0] == '\0';
+ }
+
+ bool Equals(const CString &aString) const {
+ const String *string = aString.Get();
+
+ if (m_Self == NULL && string == NULL)
+ return true;
+ return StringEqual(m_Self, string);
+ }
+
+ bool Equals(const char *buffer, size_t bsize = ~0) const {
+ if (bsize == (size_t)~0) {
+ bsize = string_size(buffer);
+ }
+
+ if (m_Self == NULL) {
+ return buffer == NULL || bsize == 0;
+ }
+
+ String s;
+ StringInit(&s, buffer, bsize, (uint32_t)bsize + 1);
+
+ return StringEqual(m_Self, &s);
+ }
+};
+
+class CStdIn : CNoncopyable {
+ const KFile *m_Self;
+ uint64_t m_Pos;
+
+public:
+ CStdIn(void) : m_Self(NULL), m_Pos(0) {
+ rc_t rc = KFileMakeStdIn(&m_Self);
+ if (rc != 0) {
+ throw rc;
+ }
+ }
+
+ ~CStdIn(void) { KFileRelease(m_Self); }
+
+ char Read1(void) {
+ char buf[9] = "";
+ rc_t rc = Read(buf, sizeof buf);
+ if (rc != 0) {
+ return -1;
+ }
+ return buf[0];
+ }
+
+ rc_t Read(char *buffer, size_t bsize, size_t *num_read = NULL);
+};
+
+class CKDirectory : CNoncopyable {
+ KDirectory *m_Self;
+ const uint32_t m_PrivateAccess;
+ const uint32_t m_PublicAccess;
+public:
+ CKDirectory(void)
+ : m_Self(NULL), m_PrivateAccess(0700), m_PublicAccess(0775)
+ {
+ rc_t rc = KDirectoryNativeDir(&m_Self);
+ if (rc != 0)
+ throw rc;
+ }
+ ~CKDirectory() { KDirectoryRelease(m_Self); }
+ rc_t CheckPrivateAccess(const CString &path, bool &updated, bool verbose)
+ const
+ { return CheckAccess(path, updated, true, verbose); }
+ rc_t CheckPublicAccess(const CString &path, bool verbose = false) const;
+ rc_t CreateNonExistingPrivateDir(const CString &path, bool verbose = false)
+ const
+ { return CreateNonExistingDir(path, m_PrivateAccess, verbose); }
+ rc_t CreateNonExistingPublicDir(bool verbose, const char *path, ...) const;
+ rc_t CreateNonExistingPublicDir(const std::string &path,
+ bool verbose = false) const
+ { return CreateNonExistingDir(path, m_PublicAccess, verbose, true); }
+ rc_t CreateNonExistingPublicDir(const CString &path, bool verbose = false)
+ const
+ { return CreateNonExistingDir(path, m_PublicAccess, verbose); }
+ rc_t CreatePublicDir(const std::string &path, bool verbose = false) {
+ return CreateNonExistingDir(path, m_PublicAccess, verbose, false);
+ }
+ rc_t CanWriteFile(const CString &dir, bool verbose = false) const;
+ bool Exists(const std::string &path) const { return Exists(path.c_str()); }
+ bool Exists(const CString &path) const;
+ bool IsDirectory(const std::string &path) const {
+ return IsDirectory(path.c_str());
+ }
+ bool IsDirectory(const char *path, ...) const;
+private:
+ bool Exists(const char *path) const
+ { return KDirectoryPathType(m_Self, path) != kptNotFound; }
+ rc_t CreateNonExistingDir(const CString &path,
+ uint32_t access, bool verbose) const;
+ rc_t CreateNonExistingDir(const std::string &path,
+ uint32_t access, bool verbose, bool chekExistance) const;
+ rc_t CreateNonExistingDir(bool verbose,
+ uint32_t access, const char *path, va_list args) const;
+ rc_t CheckAccess(const CString &path, bool &updated, bool isPrivate,
+ bool verbose = false) const;
+};
+
+class CKConfigNode : CNoncopyable {
+ const KConfigNode *m_Self;
+
+public:
+ CKConfigNode(const KConfigNode *self)
+ : m_Self(self)
+ {}
+
+ ~CKConfigNode(void) {
+ KConfigNodeRelease(m_Self);
+ }
+
+ const KConfigNode* OpenNodeRead(const std::string &path) const {
+ const KConfigNode *node = NULL;
+ rc_t rc = KConfigNodeOpenNodeRead(m_Self, &node, path.c_str());
+ if (rc != 0) {
+ return NULL;
+ }
+ return node;
+ }
+
+ bool ReadBool(const std::string &path) const {
+ return ReadString(path) == "true";
+ }
+
+ std::string ReadString(const std::string &path) const {
+ const KConfigNode *node = NULL;
+ rc_t rc = KConfigNodeOpenNodeRead(m_Self, &node, path.c_str());
+ if (rc != 0) {
+ return "";
+ }
+
+ String *result = NULL;
+ rc = KConfigNodeReadString(node, &result);
+ std::string r;
+ if (rc == 0) {
+ assert(result);
+ r = result->addr;
+ }
+
+ RELEASE(String, result);
+ RELEASE(KConfigNode, node);
+
+ return r;
+ }
+};
+
+class CKConfig : CNoncopyable {
+ KConfig *m_Self;
+ bool m_Updated;
+ const char *m_RepositoryRemoteAuxDisabled;
+ const char *m_RepositoryRemoteMainDisabled;
+ const char *m_RepositoryUserRoot;
+public:
+ CKConfig(bool verbose = false)
+ : m_Self(NULL), m_Updated(false)
+ , m_RepositoryRemoteAuxDisabled ("repository/remote/aux/NCBI/disabled")
+ , m_RepositoryRemoteMainDisabled("repository/remote/main/CGI/disabled")
+ , m_RepositoryUserRoot ("repository/user/main/public/root")
+ {
+ if (verbose)
+ OUTMSG(("loading configuration... "));
+ rc_t rc = KConfigMake(&m_Self, NULL);
+ if (rc == 0) {
+ if (verbose)
+ OUTMSG(("ok\n"));
+ }
+ else {
+ if (verbose)
+ OUTMSG(("failed\n"));
+ throw rc;
+ }
+ }
+ ~CKConfig(void)
+ { KConfigRelease(m_Self); }
+ KConfig* Get(void) const { return m_Self; }
+ void Reload(bool verbose = false);
+ rc_t Commit(void) const;
+ const KConfigNode* OpenNodeRead(const char *path, ...) const;
+ bool IsRemoteRepositoryDisabled(void) const;
+ const String* ReadDefaultConfig(void) const
+ { return ReadString("/config/default"); }
+ const String* ReadHome(void) const { return ReadString("HOME"); }
+ const String* ReadNcbiHome(void) const { return ReadString("NCBI_HOME"); }
+ const String* ReadUserRepositoryRootPath(void) const
+ { return ReadString(m_RepositoryUserRoot); }
+ rc_t DisableRemoteRepository(bool disable);
+ rc_t UpdateUserRepositoryRootPath(const CString &path);
+ rc_t UpdateUserRepositoryRootPath(const char *buffer, size_t size) {
+ return UpdateNode(m_RepositoryUserRoot, buffer, false, size);
+ }
+ rc_t FixResolverCgiNodes ( void );
+ bool NodeExists(const std::string &path) const;
+ rc_t UpdateNode(bool verbose, const char *value, const char *name, ...);
+ rc_t UpdateNode(const char *path, const char *buffer,
+ bool verbose = false, size_t size = ~0);
+ rc_t UpdateNode(const std::string &path, const char *buffer) {
+ return UpdateNode(path.c_str(), buffer);
+ }
+ rc_t CreateRemoteRepositories(bool fix = false);
+ rc_t CreateUserRepository(std::string name = "", bool fix = false);
+ const String* ReadString(const char *path) const;
+};
+
+class CSplitter : CNoncopyable {
+ const char *m_Start;
+ size_t m_Size;
+
+public:
+ CSplitter(const std::string &s) : m_Start(s.c_str()), m_Size(s.size()) {}
+ CSplitter(const String *s) : m_Start(NULL), m_Size(0) {
+ if (s == NULL) {
+ return;
+ }
+ m_Start = s->addr;
+ m_Size = s->len;
+ SkipEmpties();
+ }
+ bool HasNext(void) const { return m_Size != 0; }
+ const std::string Next(void) {
+ if (!HasNext()) {
+ return "";
+ }
+ const char *s = m_Start;
+ const char *end = string_chr(m_Start, m_Size, ':');
+ size_t n = m_Size;
+ if (end != NULL) {
+ n = end - m_Start;
+ m_Start = end + 1;
+ if (m_Size >= n + 1) {
+ m_Size -= n + 1;
+ }
+ else {
+ m_Size = 0;
+ }
+ }
+ else {
+ m_Start = NULL;
+ m_Size = 0;
+ }
+ SkipEmpties();
+ return std::string(s, n);
+ }
+ static rc_t Test(void);
+
+private:
+ void SkipEmpties(void) {
+ while (m_Size > 0 && m_Start != NULL && *m_Start == ':') {
+ --m_Size;
+ ++m_Start;
+ }
+ }
+};
+
+class CAppVolume {
+ std::string m_Type;
+ std::string m_Path;
+
+public:
+ CAppVolume(const std::string &type = "", const std::string &path = "")
+ : m_Type(type)
+ , m_Path(path)
+ {}
+
+ std::string GetPath(void) const { return m_Path; }
+
+ rc_t Update(CKConfig &kfg, const char *node,
+ const std::string &appVolPath, bool verbose = false) const
+ {
+ if (DEBUG) {
+ OUTMSG(("CAppVolume::Update(%s, %s)\n", node, appVolPath.c_str()));
+ }
+
+ return kfg.UpdateNode(verbose, m_Path.c_str(),
+ "%s/%s/%s", node, appVolPath.c_str(), m_Type.c_str());
+ }
+
+ void Dump(const char *node, const std::string &appVolPath) const {
+ OUTMSG(("%s/%s/%s = \"%s\"\n", node, appVolPath.c_str(),
+ m_Type.c_str(), m_Path.c_str()));
+ }
+};
+
+class CApp : CNoncopyable {
+ bool m_HasVolume;
+ const std::string m_AppVolPath;
+ typedef std::map<const std::string, CAppVolume> TCAppVolumes;
+ TCAppVolumes m_Volumes;
+
+public:
+ typedef TCAppVolumes::const_iterator TCAppVolumesCI;
+
+ CApp(const std::string &root, const std::string &name,
+ const std::string &type, const std::string &path)
+ : m_HasVolume(false), m_AppVolPath("apps/" + name + "/volumes")
+ {
+ Update(root, name, type, path);
+ }
+ CApp(const CKDirectory &dir, const CKConfigNode &rep,
+ const std::string &root, const std::string &name);
+
+ void Update(const std::string &root, const std::string &name,
+ const std::string &type, const std::string &path)
+ {
+ m_Volumes[type] = CAppVolume(type, path);
+ }
+ void Update(const CKDirectory &dir, const CKConfigNode &rep,
+ const std::string &root, const std::string &name) const
+ {
+ assert(0);
+ }
+ rc_t Update(CKConfig &kfg, const char *node, bool verbose = false) const {
+ rc_t rc = 0;
+ for (TCAppVolumesCI it = m_Volumes.begin(); it != m_Volumes.end(); ++it)
+ {
+ rc_t r2 = (*it).second.Update(kfg, node, m_AppVolPath, verbose);
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+ return rc;
+ }
+ void Dump(const char *node) const {
+ for (TCAppVolumesCI it = m_Volumes.begin(); it != m_Volumes.end(); ++it)
+ {
+ (*it).second.Dump(node, m_AppVolPath);
+ }
+ }
+
+ TCAppVolumesCI VolumesBegin(void) const { return m_Volumes.begin(); }
+ TCAppVolumesCI VolumesEnd(void) const { return m_Volumes.end(); }
+};
+
+class CApps : public std::map<const std::string, CApp*> {
+public:
+ typedef std::map<const std::string, CApp*>::const_iterator TCI;
+ typedef std::map<const std::string, CApp*>::iterator TI;
+
+ ~CApps(void) {
+ for (TCI it = begin(); it != end(); ++it) {
+ delete((*it).second);
+ }
+ }
+
+ void Update(const CKDirectory &dir, const CKConfigNode &rep,
+ const std::string &root, const std::string &name)
+ {
+ TCI it = find(name);
+ if (it == end()) {
+ insert(std::pair<const std::string, CApp*>
+ (name, new CApp(dir, rep, root, name)));
+ }
+ else {
+ (*it).second->Update(dir, rep, root, name);
+ }
+ }
+
+ void Update(const std::string &root, const std::string &name,
+ const std::string &type, const std::string &path)
+ {
+ if (DEBUG) {
+ OUTMSG(("CApps.Update(%s)\n", name.c_str()));
+ }
+
+ TI it = find(name);
+ if (it == end()) {
+ if (DEBUG) {
+ OUTMSG(("CApps.Update(not found)\n"));
+ }
+ insert(std::pair<const std::string, CApp*>
+ (name, new CApp(root, name, type, path)));
+ }
+ else {
+ if (DEBUG) {
+ OUTMSG(("CApps.Update(found)\n"));
+ }
+ (*it).second->Update(root, name, type, path);
+ }
+ }
+};
+
+class CRepository : CNoncopyable {
+ bool m_Disabled;
+ const std::string m_Category; // user/site/remote
+ const std::string m_SubCategory; // main/aux/protected
+ const std::string m_Name;
+ std::string m_Root;
+ CApps m_Apps;
+
+ bool RootExists(void) const { return m_Root.size() > 0; }
+
+protected:
+ CRepository(const std::string &category, const std::string &type,
+ const std::string &name, const std::string &root);
+ CRepository(const CKDirectory &dir, const CKConfigNode &repo,
+ const std::string &category, const std::string &subCategory,
+ const std::string &name);
+
+ void SetRoot(const std::string &root) { m_Root = root; }
+ void FixFileVolume(void)
+ { m_Apps.Update(m_Root, "file", "flat", "files"); }
+ void FixNakmerVolume(const std::string &name,
+ const std::string &path)
+ { m_Apps.Update(m_Root, "nakmer", name, path); }
+ void FixNannotVolume(const std::string &name,
+ const std::string &path)
+ { m_Apps.Update(m_Root, "nannot", name, path); }
+ void FixRefseqVolume(void)
+ { m_Apps.Update(m_Root, "refseq", "refseq", "refseq"); }
+ void FixRefseqVolume(const std::string &name,
+ const std::string &path)
+ { m_Apps.Update(m_Root, "sra", name, path); }
+ void FixWgsVolume(const std::string &name)
+ { m_Apps.Update(m_Root, "wgs", name, "wgs"); }
+ rc_t Update(CKConfig &kfg, std::string &node, bool verbose = false);
+
+public:
+ void ClearApps(void) { m_Apps.clear(); }
+ virtual std::string Dump(void) const;
+ bool Is(const std::string &subCategory, const std::string &name = "")
+ const;
+ std::string GetCategory(void) const { return m_Category; }
+ std::string GetSubCategory(void) const { return m_SubCategory; }
+ std::string GetName(void) const { return m_Name; }
+ std::string GetRoot(void) const { return m_Root; }
+ void Disable(bool disable) { m_Disabled = disable; }
+
+ CApps::TCI AppsBegin(void) const { return m_Apps.begin(); }
+ CApps::TCI AppsEnd(void) const { return m_Apps.end(); }
+};
+
+class CRemoteRepository : public CRepository {
+ std::string m_ResolverCgi;
+
+ static bool EndsWith(const std::string &stack, char needle);
+ static std::string GetCgi(const std::string &stack, char needle);
+ static std::string GetRoot(const std::string &stack, char needle);
+ void FixApps(void) {
+ FixNakmerVolume("fuseNAKMER", "sadb");
+ FixNannotVolume("fuseNANNOT", "sadb");
+ FixRefseqVolume();
+ FixRefseqVolume("fuse1000", "sra-instant/reads/ByRun/sra");
+ FixWgsVolume("fuseWGS");
+ }
+ rc_t Update(CKConfig &kfg, bool verbose = false) {
+ std::string node;
+ rc_t rc = CRepository::Update(kfg, node, verbose);
+ if (rc != 0) {
+ return rc;
+ }
+ return kfg.UpdateNode(verbose,
+ m_ResolverCgi.c_str(), "%s/resolver-cgi", node.c_str());
+ }
+
+public:
+ CRemoteRepository(const CKDirectory &dir, const CKConfigNode &repo,
+ const std::string &type, const std::string &name)
+ : CRepository(dir, repo, "remote", type, name)
+ , m_ResolverCgi(repo.ReadString("resolver-cgi"))
+ {}
+ CRemoteRepository(const std::string &category,
+ const std::string &name, const std::string &root)
+ : CRepository("remote", category, name, GetRoot(root, 'i'))
+ , m_ResolverCgi(GetCgi(root, 'i'))
+ {
+ if (m_ResolverCgi.size() == 0) {
+ FixApps();
+ }
+ }
+
+ virtual std::string Dump(void) const {
+ std::string node(CRepository::Dump());
+ if (m_ResolverCgi.size() > 0) {
+ OUTMSG(("%s/resolver-cgi = \"%s\"\n",
+ node.c_str(), m_ResolverCgi.c_str()));
+ }
+ return node;
+ }
+ rc_t Fix(CKConfig &kfg, bool disable, bool verbose = false);
+};
+
+class CUserRepositories;
+class CUserConfigData : CNoncopyable {
+ std::string m_DefaultRoot;
+ std::string m_CurrentRoot;
+ bool m_CacheEnabled;
+
+public:
+ CUserConfigData(const CUserRepositories &repos, const CString &dflt);
+
+ std::string GetCurrentRoot(void) const { return m_CurrentRoot; }
+ std::string GetDefaultRoot(void) const { return m_DefaultRoot; }
+ bool GetCacheEnabled(void) const { return m_CacheEnabled; }
+
+ void SetCurrentRoot(const std::string &path) { m_CurrentRoot = path; }
+ void SetCacheEnabled(bool enabled) { m_CacheEnabled = enabled; }
+};
+
+class CUserRepository : public CRepository {
+ bool m_CacheEnabled;
+
+ void FixApps(void) {
+ FixFileVolume();
+ FixNakmerVolume("nakmerFlat", "nannot");
+ FixNannotVolume("nannotFlat", "nannot");
+ FixRefseqVolume();
+ FixRefseqVolume("sraFlat", "sra");
+ FixWgsVolume("wgsFlat");
+ }
+ rc_t Fix(CKConfig &kfg,
+ const CUserConfigData *data, const std::string *root);
+ rc_t Update(CKConfig &kfg, bool verbose = false) {
+ std::string node;
+ rc_t rc = CRepository::Update(kfg, node, verbose);
+ if (rc != 0) {
+ return rc;
+ }
+ return kfg.UpdateNode(verbose, m_CacheEnabled ? "true" : "false",
+ "%s/cache-enabled", node.c_str());
+ }
+
+public:
+ CUserRepository(const CKDirectory &dir, const CKConfigNode &repo,
+ const std::string &type, const std::string &name)
+ : CRepository(dir, repo, "user", type, name)
+ , m_CacheEnabled(repo.ReadBool("cache-enabled"))
+ {}
+ CUserRepository(const std::string &category,
+ const std::string &name, const std::string &root)
+ : CRepository("user", category, name, root), m_CacheEnabled(true)
+ {
+ FixApps();
+ }
+
+ virtual std::string Dump(void) const {
+ const std::string node(CRepository::Dump());
+ OUTMSG(("%s/cache-enabled = \"%s\"\n", node.c_str(),
+ m_CacheEnabled ? "true" : "false"));
+ return node;
+ }
+
+ bool IsCacheEnabled(void) const { return m_CacheEnabled; }
+ void Fix(CKConfig &kfg, const std::string &root) { Fix(kfg, NULL, &root); }
+ void Fix(CKConfig &kfg, const CUserConfigData *data) {
+ Fix(kfg, data, NULL);
+ }
+};
+
+class CUserRepositories : std::vector<CUserRepository*> {
+ typedef std::vector<CUserRepository*>::const_iterator TCI;
+ typedef std::vector<CUserRepository*>::iterator TI;
+ const CUserRepository *FindMainPublic(void) const;
+
+public:
+ ~CUserRepositories(void) {
+ for (TCI it = begin(); it != end(); ++it) {
+ free(*it);
+ }
+ }
+
+ rc_t Load(const CKConfig &kfg, const CKDirectory &dir);
+ std::string GetMainPublicRoot(void) const {
+ const CUserRepository *r = FindMainPublic();
+ if (r == NULL) {
+ return "";
+ }
+ return r->GetRoot();
+ }
+ bool IsMainPublicCacheEnabled(void) const {
+ const CUserRepository *r = FindMainPublic();
+ if (r == NULL) {
+ return true;
+ }
+ return r->IsCacheEnabled();
+ }
+ void Fix(CKConfig &kfg, const CUserConfigData &data) {
+ bool publicMainFound = false;
+ for (TI it = begin(); it != end(); ++it) {
+ CUserRepository *r = *it;
+ assert(r);
+ if (r->Is("main", "public")) {
+ r->Fix(kfg, &data);
+ publicMainFound = true;
+ }
+ else {
+ r->Fix(kfg, data.GetDefaultRoot());
+ }
+ }
+ if (!publicMainFound) {
+ CUserRepository *r = new CUserRepository("main", "public", "");
+ r->Fix(kfg, &data);
+ push_back(r);
+ }
+ }
+ rc_t MkAppVolumes(const CKDirectory &dir, bool verbose = false)
+ const;
+};
+
+class CRemoteRepositories : std::vector<CRemoteRepository*> {
+ typedef std::vector<CRemoteRepository*>::const_iterator TCI;
+
+public:
+ ~CRemoteRepositories(void) {
+ for (TCI it = begin(); it != end(); ++it) { free(*it); }
+ }
+
+ rc_t Load(const CKConfig &kfg, const CKDirectory &dir);
+
+ bool IsDisabled(void) const { return false; }
+ void Fix(CKConfig &kfg, bool disable, bool verbose = false);
+};
+
+
+#endif // _hpp_tools_vdb_config_util_
diff --git a/tools/vdb-config/vdb-config-model.cpp b/tools/vdb-config/vdb-config-model.cpp
new file mode 100644
index 0000000..3b5815a
--- /dev/null
+++ b/tools/vdb-config/vdb-config-model.cpp
@@ -0,0 +1,463 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-config-model.hpp" // vdbconf_model
+
+#include <klib/vector.h> /* Vector */
+
+#include <cstring> // memset
+
+#include <climits> /* PATH_MAX */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+using std::string;
+
+const int32_t vdbconf_model::kPublicRepoId = -1;
+const int32_t vdbconf_model::kInvalidRepoId = -2;
+
+
+std::string vdbconf_model::native_to_internal( const std::string &s ) const
+{
+ std::string res = "";
+ VPath * temp_v_path;
+ rc_t rc = VFSManagerMakeSysPath ( _vfs_mgr, &temp_v_path, s.c_str() );
+ if ( rc == 0 )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc = VPathReadPath ( temp_v_path, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ res.assign( buffer, written );
+ VPathRelease ( temp_v_path );
+ }
+ return res;
+}
+
+std::string vdbconf_model::internal_to_native( const std::string &s ) const
+{
+ std::string res = "";
+ VPath * temp_v_path;
+ rc_t rc = VFSManagerMakePath ( _vfs_mgr, &temp_v_path, "%s", s.c_str() );
+ if ( rc == 0 )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc = VPathReadSysPath ( temp_v_path, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ res.assign( buffer, written );
+ VPathRelease ( temp_v_path );
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_http_proxy_path( void ) const {
+ char buffer[ PATH_MAX ] = "";
+ rc_t rc = KConfig_Get_Http_Proxy_Path(_config, buffer, sizeof buffer, NULL);
+ if (rc == 0) {
+ return buffer;
+ }
+ else {
+ return "";
+ }
+}
+
+
+bool vdbconf_model::does_site_repo_exist( void ) const
+{
+ KRepositoryVector repositories;
+ memset( &repositories, 0, sizeof repositories );
+ rc_t rc = KRepositoryMgrSiteRepositories( _mgr, &repositories );
+ bool res = ( ( rc == 0 ) && ( VectorLength( &repositories ) > 0 ) );
+ KRepositoryVectorWhack( &repositories );
+ return res;
+}
+
+
+int32_t vdbconf_model::get_repo_id( const string & repo_name ) const
+{
+ if ( repo_name == "public" )
+ return kPublicRepoId;
+
+ uint32_t id = 0;
+ rc_t rc = KConfigGetProtectedRepositoryIdByName( _config, repo_name.c_str(), &id );
+ if ( rc != 0 )
+ return kInvalidRepoId;
+ else
+ return id;
+}
+
+
+std::string vdbconf_model::get_repo_name( uint32_t id ) const
+{
+ std::string res = "";
+ if ( _config_valid )
+ {
+ size_t written;
+ char buffer[ 1024 ];
+ rc_t rc = KConfigGetProtectedRepositoryName( _config, id, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ res.assign( buffer, written );
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_repo_description(const string &repo_name) const
+{
+ size_t written = 0;
+ char buffer[ 1024 ];
+ rc_t rc = KConfigGetProtectedRepositoryDescriptionByName( _config,
+ repo_name.c_str(), buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ return string( buffer, written );
+ else
+ return "";
+}
+
+std::string vdbconf_model::get_repo_location( uint32_t id ) const
+{
+ std::string res = "";
+ if ( _config_valid )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc_t rc = KConfigGetProtectedRepositoryPathById( _config, id, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ {
+ res.assign( buffer, written );
+ res = internal_to_native( res );
+ }
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_public_location( void ) const
+{
+ std::string res = "";
+ if ( _config_valid )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc_t rc = KConfig_Get_User_Public_Cache_Location( _config, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ {
+ res.assign( buffer, written );
+ res = internal_to_native( res );
+ }
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_current_dir( void ) const
+{
+ std::string res = "./";
+ char buffer[ PATH_MAX ];
+ rc_t rc = KDirectoryResolvePath ( _dir, true, buffer, sizeof buffer, "./" );
+ if ( rc == 0 )
+ {
+ res.assign( buffer );
+ res = internal_to_native( res );
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_home_dir( void ) const
+{
+ std::string res = "";
+ if ( _config_valid )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc_t rc = KConfig_Get_Home( _config, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ {
+ res.assign( buffer, written );
+ res = internal_to_native( res );
+ }
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_user_default_dir( void ) const
+{
+ std::string res = "";
+ if ( _config_valid )
+ {
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc_t rc = KConfig_Get_Default_User_Path( _config, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ {
+ res.assign( buffer, written );
+ res = internal_to_native( res );
+ }
+ }
+ return res;
+}
+
+
+std::string vdbconf_model::get_ngc_root( std::string &base, const KNgcObj * ngc ) const
+{
+ std::string res = "";
+ size_t written;
+ char buffer[ PATH_MAX ];
+ rc_t rc = KNgcObjGetProjectName ( ngc, buffer, sizeof buffer, &written );
+ if ( rc == 0 )
+ {
+ res = native_to_internal( base ) + '/' + buffer;
+ res = internal_to_native( res );
+ }
+ return res;
+}
+
+
+static rc_t CC s_IsEmpty( const KDirectory * dir, uint32_t type, const char * name, void * data )
+{
+ if ( ( type & ~kptAlias) != kptDir )
+ return 1;
+ else
+ return 0;
+}
+
+// repoId == kPublicRepoId is for the public repository
+ESetRootState vdbconf_model::x_ChangeRepoLocation( const string &native_newPath,
+ bool reuseNew, int32_t repoId, bool flushOld )
+{
+/*rc_t CC KDirectoryResolvePath_v1 ( const KDirectory_v1 *self, bool absolute,
+ char *resolved, size_t rsize, const char *path, ... )
+ resolve ~
+ and ~user */
+ // old root path
+
+ if ( native_newPath.size() == 0 )
+ return eSetRootState_NewPathEmpty;
+
+ std::string newPath = native_to_internal( native_newPath );
+
+ string oldPath;
+
+ if ( repoId != kInvalidRepoId )
+ {
+ if ( repoId == kPublicRepoId )
+ oldPath = get_public_location();
+ else if ( repoId >= 0 )
+ oldPath = get_repo_location( repoId );
+ else
+ return eSetRootState_Error;
+
+ if ( oldPath.size() == newPath.size() )
+ {
+ // make sure new path is different from the old one
+ if ( oldPath == newPath )
+ return eSetRootState_NotChanged;
+ }
+
+ // old root path should not be empty - just ignore it now
+ if ( oldPath.size() > 0 )
+ {
+ KPathType type = KDirectoryPathType( _dir, oldPath.c_str() );
+ if ( ( type & ~kptAlias ) == kptDir )
+ {
+ rc_t rc = KDirectoryVisit ( _dir, true, s_IsEmpty, NULL, oldPath.c_str() );
+ if ( rc != 0 && !flushOld )
+ {
+ // warn if the old repo is not empty and flush was not asked
+ return eSetRootState_OldNotEmpty;
+ }
+ }
+ }
+ }
+
+ KPathType type = KDirectoryPathType( _dir, newPath.c_str() );
+ uint32_t access = 0775;
+ switch ( type & ~kptAlias )
+ {
+ case kptNotFound :
+ {
+ // create non existing new repository directory
+ rc_t rc = KDirectoryCreateDir( _dir, access, (kcmCreate | kcmParents), newPath.c_str() );
+ if ( rc != 0 )
+ return eSetRootState_MkdirFail;
+ }
+ break;
+
+ case kptDir :
+ {
+ rc_t rc = KDirectoryVisit( _dir, true, s_IsEmpty, NULL, newPath.c_str() );
+ if ( rc != 0 && !reuseNew )
+ // warn if the new repo is not empty and resuse was not asked
+ return eSetRootState_NewDirNotEmpty;
+ }
+ break;
+
+ // error: new repository exists and it is not a directory
+ default : return eSetRootState_NewNotDir;
+ }
+
+ // create apps subdirectories
+ const char *apps[] = { "files", "nannot", "refseq", "sra", "wgs", NULL };
+ for ( const char **p = apps; *p; ++p )
+ {
+ KPathType type = KDirectoryPathType( _dir, "%s/%s", newPath.c_str(), *p );
+ switch ( type & ~kptAlias )
+ {
+ case kptNotFound : KDirectoryCreateDir( _dir, access, kcmCreate, "%s/%s", newPath.c_str(), *p );
+ case kptDir : break;
+ default : return eSetRootState_Error;
+ }
+ }
+
+ // update repository root configiration
+ if ( repoId == kPublicRepoId )
+ KConfig_Set_User_Public_Cache_Location( _config, newPath.c_str() );
+ else if ( repoId >= 0 )
+ KConfigSetProtectedRepositoryPathById( _config, repoId, newPath.c_str() );
+
+ if ( repoId != kInvalidRepoId )
+ {
+ // flush the old repository
+ for ( const char **p = apps; *p; ++p )
+ {
+ // completely remove all old apps subdirectories
+ KDirectoryRemove( _dir, true, "%s/%s", oldPath.c_str(), *p );
+ }
+ // remove all old repository directory if it is empty now
+ KDirectoryRemove( _dir, false, oldPath.c_str() );
+ }
+
+ return eSetRootState_OK;
+}
+
+ESetRootState vdbconf_model::set_repo_location(uint32_t id,
+ bool flushOld, const string &path, bool reuseNew)
+{
+ ESetRootState res = x_ChangeRepoLocation( path, reuseNew, id, flushOld );
+ _config_changed = true;
+ return res;
+}
+
+ESetRootState vdbconf_model::set_public_location(
+ bool flushOld, string &path, bool reuseNew)
+{
+ ESetRootState res = x_ChangeRepoLocation( path, reuseNew, kPublicRepoId, flushOld );
+ _config_changed = true;
+ return res;
+}
+
+ESetRootState vdbconf_model::change_repo_location(bool flushOld,
+ const string &newPath, bool reuseNew, int32_t repoId)
+{
+ ESetRootState res = x_ChangeRepoLocation( newPath, reuseNew, repoId, flushOld );
+ _config_changed = true;
+ return res;
+}
+
+ESetRootState vdbconf_model::prepare_repo_directory
+ (const string &newPath, bool reuseNew)
+{
+ ESetRootState res = x_ChangeRepoLocation( newPath, reuseNew, kInvalidRepoId );
+ _config_changed = true;
+ return res;
+}
+
+#if TDB
+bool check_locations_unique(KRepositoryVector *nonUniqueRepos,
+ const string &newRootPath)
+{
+ assert(nonUniqueRepos);
+ KRepositoryVectorWhack(nonUniqueRepos);
+
+ KRepositoryVector repositories;
+ memset(&repositories, 0, sizeof repositories);
+ rc_t rc = KRepositoryMgrUserRepositories(_mgr, &repositories);
+ uint32_t len = 0;
+ if (rc == 0) {
+ len = VectorLength(&repositories);
+ }
+ std::map<const string, const KRepository*> roots;
+ typedef std::map<const string, const KRepository*>::const_iterator TCI;
+ if (len > 0) {
+ for (uint32_t i = 0; i < len; ++i) {
+ const KRepository *repo = static_cast<const KRepository*>
+ (VectorGet(&repositories, i));
+ if (repo != NULL) {
+ char buffer[PATH_MAX] = "";
+ size_t size = 0;
+ rc = KRepositoryRoot(repo, buffer, sizeof buffer, &size);
+ if (rc == 0) {
+ const string root(buffer);
+ TI it = find(root);
+ if (it == end()) {
+ insert(std::pair<const string, const KRepository*>
+ (root, repo));
+ }
+ else {
+ if (VectorLength(nonUniqueRepos) == 0) {
+ const KRepository *r = KRepositoryAddRef(repo);
+ if (r != NULL) {
+ /*ignored rc = */ VectorAppend(repositories, NULL, r);
+ }
+ }
+ const KRepository *found = (*it);
+ const KRepository *r = KRepositoryAddRef(found);
+ }
+ }
+ }
+ }
+ }
+ KRepositoryVectorWhack( &repositories );
+}
+#endif
+
+bool vdbconf_model::import_ngc( const std::string &native_location,
+ const KNgcObj *ngc, uint32_t permissions, uint32_t * result_flags )
+{
+ bool res = false;
+
+ if ( _config_valid )
+ {
+ KRepositoryMgr * repo_mgr;
+ rc_t rc = KConfigMakeRepositoryMgrUpdate ( _config, &repo_mgr );
+ if ( rc == 0 )
+ {
+ std::string location = native_to_internal( native_location);
+
+ rc = KRepositoryMgrImportNgcObj( repo_mgr, ngc,
+ location.c_str(), permissions, result_flags );
+ res = ( rc == 0 );
+ KRepositoryMgrRelease( repo_mgr );
+ }
+ }
+
+ return res;
+}
diff --git a/tools/vdb-config/vdb-config-model.hpp b/tools/vdb-config/vdb-config-model.hpp
new file mode 100644
index 0000000..f294a42
--- /dev/null
+++ b/tools/vdb-config/vdb-config-model.hpp
@@ -0,0 +1,473 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_config_model_
+#define _h_vdb_config_model_
+
+#include <kfg/config.h>
+#include <kfg/properties.h>
+#include <kfg/repository.h>
+#include <kfg/ngc.h>
+#include <kfs/directory.h>
+#include <vfs/manager.h>
+#include <vfs/path.h>
+
+#include <string>
+
+enum ESetRootState {
+ eSetRootState_OK, // successfully changed repository root
+ eSetRootState_NotChanged, // the new path is the same as the old one
+ eSetRootState_NotUnique, // there is another repository with the same root
+ eSetRootState_MkdirFail, // failed to make new repository directory
+ eSetRootState_NewPathEmpty, // new repository directory path is not empty
+ eSetRootState_NewDirNotEmpty,// new repository directory is not empty
+ eSetRootState_NewNotDir, // new repository exists and is not a directory
+ eSetRootState_OldNotEmpty, // old repository is not empty
+ eSetRootState_Error, // some unusual error happened
+};
+
+/*
+ a c++ class the encapsulates the connection to
+*/
+
+class vdbconf_model
+{
+ public :
+ static const int32_t kPublicRepoId;
+ static const int32_t kInvalidRepoId;
+
+ vdbconf_model( KConfig * config )
+ : _config( config )
+ , _config_valid( _config != NULL )
+ , _config_changed( false )
+ , _dir( NULL )
+ , _mgr( NULL )
+ , _vfs_mgr( NULL )
+ {
+ if ( KConfigAddRef( config ) != 0 )
+ {
+ _config = NULL;
+ _config_valid = false;
+ }
+
+ assert(_config && _config_valid);
+
+ rc_t rc = KDirectoryNativeDir(&_dir);
+ if ( rc != 0 ) throw rc;
+
+ rc = KConfigMakeRepositoryMgrRead( _config, &_mgr );
+ if ( rc != 0 ) throw rc;
+
+ rc = VFSManagerMake ( &_vfs_mgr );
+ }
+
+ ~vdbconf_model( void )
+ {
+ if ( _config_valid ) {
+ KConfigRelease ( _config );
+ _config = NULL;
+ }
+
+ KRepositoryMgrRelease(_mgr);
+ _mgr = NULL;
+
+ KDirectoryRelease(_dir);
+ _dir = NULL;
+
+ VFSManagerRelease ( _vfs_mgr );
+ _vfs_mgr = NULL;
+ }
+
+ // ----------------------------------------------------------------
+ std::string native_to_internal( const std::string &s ) const;
+ std::string internal_to_native( const std::string &s ) const;
+
+ bool get_config_changed( void ) const { return _config_changed; }
+
+ // ----------------------------------------------------------------
+
+ bool is_http_proxy_enabled( void ) const {
+ bool enabled = true;
+ KConfig_Get_Http_Proxy_Enabled(_config, &enabled, true);
+ if ( enabled )
+ {
+ std::string path = get_http_proxy_path();
+ if ( path.empty() ) enabled = false;
+ }
+ return enabled;
+ }
+
+ void set_http_proxy_enabled( bool enabled ) {
+ KConfig_Set_Http_Proxy_Enabled(_config, enabled);
+ _config_changed = true;
+ }
+
+ std::string get_http_proxy_path( void ) const;
+
+ void set_http_proxy_path(const std::string &path) {
+ KConfig_Set_Http_Proxy_Path(_config, path.c_str());
+ _config_changed = true;
+ }
+
+ bool has_http_proxy_env_higher_priority( void ) const {
+ bool enabled = false;
+ KConfig_Has_Http_Proxy_Env_Higher_Priority(_config, &enabled);
+ return enabled;
+ }
+ void set_http_proxy_env_higher_priority( bool value ) {
+ KConfig_Set_Http_Proxy_Env_Higher_Priority(_config, value);
+ _config_changed = true;
+ }
+
+ // ----------------------------------------------------------------
+ bool is_remote_enabled( void ) const
+ {
+ bool res = false;
+
+ rc_t rc = KConfig_Get_Remote_Access_Enabled( _config, &res );
+ if (rc == 0) {
+ return res;
+ }
+
+ KConfig_Get_Remote_Main_Cgi_Access_Enabled( _config, &res );
+ if (!res) {
+ return res;
+ }
+
+ KConfig_Get_Remote_Aux_Ncbi_Access_Enabled( _config, &res );
+
+ return res;
+ }
+
+ void set_remote_enabled( bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfig_Set_Remote_Access_Enabled( _config, enabled );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------------------------------------------
+ bool does_site_repo_exist( void ) const;
+
+ bool is_site_enabled( void ) const
+ {
+ bool res = false;
+ if ( _config_valid ) KConfig_Get_Site_Access_Enabled( _config, &res );
+ return res;
+ }
+ void set_site_enabled( bool enabled )
+ {
+ if ( does_site_repo_exist() && _config_valid )
+ {
+ KConfig_Set_Site_Access_Enabled( _config, enabled );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------------------------------------------
+ /* THIS IS NEW AND NOT YET IMPLEMENTED IN CONFIG: global cache on/off !!! */
+ bool is_global_cache_enabled( void ) const
+ {
+ bool res = true;
+ if ( _config_valid )
+ {
+ bool is_disabled;
+ rc_t rc = KConfigReadBool ( _config, "/repository/user/cache-disabled", &is_disabled );
+ if ( rc == 0 )
+ res = !is_disabled;
+ }
+ return res;
+ }
+
+ void set_global_cache_enabled( bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfigWriteBool( _config, "/repository/user/cache-disabled", !enabled );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------- //
+ // ADD DEFINE IF YOU NEED IT !!! //
+ // ----------------------------- //
+ bool is_user_enabled( void ) const
+ {
+ bool res = true;
+#ifdef ALLOW_USER_REPOSITORY_DISABLING
+ if ( _config_valid ) KConfig_Get_User_Access_Enabled( _config, &res );
+#endif
+ return res;
+ }
+ void set_user_enabled( bool enabled )
+ {
+#ifdef ALLOW_USER_REPOSITORY_DISABLING
+ if ( _config_valid ) KConfig_Set_User_Access_Enabled( _config, enabled );
+#endif
+ }
+
+ // ----------------------------------------------------------------
+ bool is_user_cache_enabled( void ) const
+ {
+ bool res = false;
+ if ( _config_valid ) KConfig_Get_User_Public_Cached( _config, &res );
+ return res;
+ }
+ void set_user_cache_enabled( bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfig_Set_User_Public_Cached( _config, enabled );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------------------------------------------
+ uint32_t get_repo_count( void ) const
+ {
+ uint32_t res = 0;
+ if ( _config_valid ) KConfigGetProtectedRepositoryCount( _config, &res );
+ return res;
+ }
+
+
+ /* Returns:
+ * kInvalidRepoId if not found,
+ * kPublicRepoId for the user public repository
+ * protected repository id otherwise
+ */
+ int32_t get_repo_id( const std::string & repo_name ) const;
+
+ std::string get_repo_name( uint32_t id ) const;
+ std::string get_repo_description( const std::string & repo_name ) const;
+
+ bool is_protected_repo_enabled( uint32_t id ) const
+ {
+ bool res = true;
+#ifdef ALLOW_USER_REPOSITORY_DISABLING
+ if ( _config_valid ) KConfigGetProtectedRepositoryEnabledById( _config, id, &res );
+#endif
+ return res;
+ }
+ void set_protected_repo_enabled( uint32_t id, bool enabled )
+ {
+#ifdef ALLOW_USER_REPOSITORY_DISABLING
+ if ( _config_valid ) KConfigSetProtectedRepositoryEnabledById( _config, id, enabled );
+#endif
+ }
+
+ bool is_protected_repo_cached( uint32_t id ) const
+ {
+ bool res = true;
+ if ( _config_valid )
+ KConfigGetProtectedRepositoryCachedById( _config, id, &res );
+ return res;
+ }
+
+ void set_protected_repo_cached( uint32_t id, bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfigSetProtectedRepositoryCachedById( _config, id, enabled );
+ _config_changed = true;
+ }
+ }
+
+ bool does_repo_exist( const char * repo_name )
+ {
+ bool res = false;
+ if ( _config_valid ) KConfigDoesProtectedRepositoryExist( _config, repo_name, &res );
+ return res;
+ }
+
+ std::string get_repo_location( uint32_t id ) const;
+
+ ESetRootState set_repo_location( uint32_t id,
+ bool flushOld, const std::string &path, bool reuseNew );
+
+/* ----------------------------------------------------------------
+ * flushOld repository
+ * reuseNew repository: whether to refuse to change location on existing newPath
+ */
+ ESetRootState change_repo_location(bool flushOld,
+ const std::string &newPath, bool reuseNew, int32_t repoId);
+
+ ESetRootState prepare_repo_directory(const std::string &newPath,
+ bool reuseNew = false);
+
+ // ----------------------------------------------------------------
+
+ std::string get_public_location( void ) const;
+
+ ESetRootState set_public_location( bool flushOld, std::string &path, bool reuseNew );
+
+ bool is_user_public_enabled( void ) const
+ {
+ bool res = true;
+ if ( _config_valid ) KConfig_Get_User_Public_Enabled( _config, &res );
+ return res;
+ }
+ void set_user_public_enabled( bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfig_Set_User_Public_Enabled( _config, enabled );
+ _config_changed = true;
+ }
+ }
+
+ bool is_user_public_cached( void ) const
+ {
+ bool res = true;
+ if ( _config_valid ) KConfig_Get_User_Public_Cached( _config, &res );
+ return res;
+ }
+
+ void set_user_public_cached( bool enabled )
+ {
+ if ( _config_valid )
+ {
+ KConfig_Set_User_Public_Cached( _config, enabled );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------------------------------------------
+ std::string get_current_dir( void ) const;
+ std::string get_home_dir( void ) const;
+
+ std::string get_user_default_dir( void ) const;
+ std::string get_ngc_root( std::string &base, const KNgcObj * ngc ) const;
+
+ void set_user_default_dir( const char * new_default_dir )
+ {
+ if ( _config_valid )
+ {
+ std::string tmp( new_default_dir );
+ tmp = native_to_internal( tmp );
+ KConfig_Set_Default_User_Path( _config, tmp.c_str() );
+ _config_changed = true;
+ }
+ }
+
+ // ----------------------------------------------------------------
+ bool commit( void )
+ {
+ bool res = false;
+ if ( _config_valid )
+ {
+ res = ( KConfigCommit ( _config ) == 0 );
+ if ( res ) _config_changed = false;
+ }
+ return res;
+ }
+
+ // ----------------------------------------------------------------
+ bool import_ngc( const std::string &native_location,
+ const KNgcObj *ngc, uint32_t permissions,
+ uint32_t * result_flags );
+
+ bool get_id_of_ngc_obj( const KNgcObj *ngc, uint32_t * id )
+ {
+ bool res = false;
+ if ( _config_valid )
+ {
+ size_t written;
+ char proj_id[ 512 ];
+ rc_t rc = KNgcObjGetProjectName( ngc, proj_id, sizeof proj_id, &written );
+ if ( rc == 0 )
+ {
+ rc = KConfigGetProtectedRepositoryIdByName( _config, proj_id, id );
+ res = ( rc == 0 );
+ }
+ }
+ return res;
+ }
+
+ bool mkdir(const KNgcObj *ngc) {
+ uint32_t id = 0;
+ if (!get_id_of_ngc_obj(ngc, &id)) {
+ return false;
+ }
+
+ const std::string root(get_repo_location(id));
+ if (root.size() == 0) {
+ return false;
+ }
+
+ if (KDirectoryPathType(_dir, root.c_str()) != kptNotFound) {
+ return false;
+ }
+
+ return KDirectoryCreateDir(_dir, 0775,
+ kcmCreate | kcmParents, root.c_str()) == 0;
+ }
+
+ bool does_path_exist( std::string &path )
+ {
+ bool res = false;
+ if ( _dir != NULL )
+ {
+ KPathType type = KDirectoryPathType( _dir, path.c_str() );
+ res = ( ( type & ~kptAlias ) == kptDir );
+ }
+ return res;
+ }
+
+ bool reload( void )
+ {
+ if ( _config_valid )
+ {
+ KRepositoryMgrRelease ( _mgr );
+ _mgr = NULL;
+
+ KConfigRelease ( _config );
+ _config_valid = ( KConfigMake ( &_config, NULL ) == 0 );
+
+ if ( _config_valid )
+ KConfigMakeRepositoryMgrRead( _config, &_mgr );
+
+ _config_changed = false;
+ }
+ return _config_valid;
+ }
+
+ private :
+ KConfig * _config;
+ bool _config_valid;
+ bool _config_changed;
+
+ KDirectory * _dir;
+ const KRepositoryMgr *_mgr;
+ VFSManager *_vfs_mgr;
+
+ ESetRootState x_ChangeRepoLocation(const std::string &native_newPath,
+ bool reuseNew, int32_t repoId, bool flushOld = false);
+};
+
+#endif
diff --git a/tools/vdb-config/vdb-config.c b/tools/vdb-config/vdb-config.c
new file mode 100644
index 0000000..2b0a917
--- /dev/null
+++ b/tools/vdb-config/vdb-config.c
@@ -0,0 +1,1712 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "configure.h"
+
+#include <kapp/main.h>
+#include <kapp/args-conv.h>
+
+#include <vdb/vdb-priv.h> /* VDBManagerListExternalSchemaModules */
+#include <vdb/manager.h> /* VDBManager */
+
+#include <kfg/kfg-priv.h> /* KConfig */
+#include <kfg/ngc.h> /* KNgcObjMakeFromFile */
+#include <kfg/properties.h> /* KConfig_Get_Default_User_Path */
+#include <kfg/repository.h> /* KConfigImportNgc */
+
+#include <vfs/manager.h> /* VFSManagerMake */
+#include <vfs/path-priv.h> /* KPathGetCWD */
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/impl.h> /* KDirectoryGetSysDir */
+#include <kfs/kfs-priv.h> /* KSysDirOSPath */
+
+#include <klib/log.h> /* LOGERR */
+#include <klib/misc.h> /* is_iser_an_admin */
+#include <klib/namelist.h>
+#include <klib/out.h> /* OUTMSG */
+#include <klib/printf.h> /* string_printf */
+#include <klib/rc.h> /* RC */
+#include <klib/text.h> /* strcase_cmp */
+
+#include <sysalloc.h> /* redefine malloc etc calls */
+#include <os-native.h> /* SHLX */
+
+#include <assert.h>
+#include <ctype.h> /* tolower */
+#include <errno.h>
+#include <stdio.h> /* scanf */
+#include <stdlib.h> /* getenv */
+#include <string.h> /* memset */
+
+#include <limits.h> /* PATH_MAX */
+
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#define DISP_RC(rc, msg) (void)((rc == 0) ? 0 : LOGERR(klogInt, rc, msg))
+#define DISP_RC2(rc, name, msg) (void)((rc == 0) ? 0 : \
+ PLOGERR(klogInt, (klogInt, rc, \
+ "$(name): $(msg)", "name=%s,msg=%s", name, msg)))
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 && !rc) { rc = rc2; } obj = NULL; } while (false)
+
+#define ALIAS_ALL "a"
+#define OPTION_ALL "all"
+static const char* USAGE_ALL[] = { "print all information [default]", NULL };
+
+#define ALIAS_CFG "i"
+#define OPTION_CFG "interactive"
+static const char* USAGE_CFG[] = {
+ "create/update configuration",
+ NULL };
+
+#define ALIAS_CFM NULL
+#define OPTION_CFM "interactive-mode"
+static const char* USAGE_CFM[] = {
+ "interactive mode: 'textual' or 'graphical' (default)",
+ NULL };
+
+#define ALIAS_DIR "d"
+#define OPTION_DIR "load-path"
+static const char* USAGE_DIR[] = { "print load path", NULL };
+
+#define ALIAS_ENV "e"
+#define OPTION_ENV "env"
+static const char* USAGE_ENV[] = { "print shell variables", NULL };
+
+#define ALIAS_FIL "f"
+#define OPTION_FIL "files"
+static const char* USAGE_FIL[] = { "print loaded files", NULL };
+
+#define ALIAS_FIX NULL
+#define OPTION_FIX "restore-defaults"
+static const char* USAGE_FIX[] =
+{ "create default or update existing user configuration", NULL };
+
+#define ALIAS_IMP NULL
+#define OPTION_IMP "import"
+static const char* USAGE_IMP[] = { "import ngc file", NULL };
+
+#define ALIAS_MOD "m"
+#define OPTION_MOD "modules"
+static const char* USAGE_MOD[] = { "print external modules", NULL };
+
+#define ALIAS_OUT "o"
+#define OPTION_OUT "output"
+static const char* USAGE_OUT[] = { "output type: one of (x n), "
+ "where 'x' is xml (default), 'n' is native", NULL };
+
+#define ALIAS_PCF "p"
+#define OPTION_PCF "cfg"
+static const char* USAGE_PCF[] = { "print current configuration", NULL };
+
+#define ALIAS_CDR NULL
+#define OPTION_CDR "cfg-dir"
+static const char* USAGE_CDR[]
+ = { "set directory to load configuration", NULL };
+
+#define ALIAS_PRD NULL
+#define OPTION_PRD "proxy-disable"
+static const char* USAGE_PRD[] = { "enable/disable using HTTP proxy", NULL };
+
+#define ALIAS_PRX NULL
+#define OPTION_PRX "proxy"
+static const char* USAGE_PRX[]
+ = { "set HTTP proxy server configuration", NULL };
+
+#define ALIAS_ROOT NULL
+#define OPTION_ROOT "root"
+static const char* USAGE_ROOT[] =
+ { "enforce configuration update while being run by superuser", NULL };
+
+#define ALIAS_SET "s"
+#define OPTION_SET "set"
+static const char* USAGE_SET[] = { "set configuration node value", NULL };
+
+rc_t WorkspaceDirPathConv(const Args * args, uint32_t arg_index, const char * arg, size_t arg_len, void ** result, WhackParamFnP * whack)
+{
+ rc_t rc;
+ uint32_t imp_count;
+
+ rc = ArgsOptionCount(args, OPTION_IMP, &imp_count);
+ if (rc != 0)
+ return rc;
+
+ // first parameter is a directory only if OPTION_IMP is present; otherwise it is a query
+ if (imp_count > 0)
+ {
+ return ArgsConvFilepath(args, arg_index, arg, arg_len, result, whack);
+ }
+
+ return ArgsConvDefault(args, arg_index, arg, arg_len, result, whack);
+}
+
+OptDef Options[] =
+{ /* needs_value, required, converter */
+ { OPTION_ALL, ALIAS_ALL, NULL, USAGE_ALL, 1, false, false, NULL }
+ , { OPTION_CDR, ALIAS_CDR, NULL, USAGE_CDR, 1, true , false, NULL }
+ , { OPTION_CFG, ALIAS_CFG, NULL, USAGE_CFG, 1, false, false, NULL }
+ , { OPTION_CFM, ALIAS_CFM, NULL, USAGE_CFM, 1, true , false, NULL }
+ , { OPTION_DIR, ALIAS_DIR, NULL, USAGE_DIR, 1, false, false, NULL }
+ , { OPTION_ENV, ALIAS_ENV, NULL, USAGE_ENV, 1, false, false, NULL }
+ , { OPTION_FIL, ALIAS_FIL, NULL, USAGE_FIL, 1, false, false, NULL }
+ , { OPTION_FIX, ALIAS_FIX, NULL, USAGE_FIX, 1, false, false, NULL }
+ , { OPTION_IMP, ALIAS_IMP, NULL, USAGE_IMP, 1, true , false, ArgsConvFilepath }
+ , { OPTION_MOD, ALIAS_MOD, NULL, USAGE_MOD, 1, false, false, NULL }
+ , { OPTION_OUT, ALIAS_OUT, NULL, USAGE_OUT, 1, true , false, NULL }
+ , { OPTION_PCF, ALIAS_PCF, NULL, USAGE_PCF, 1, false, false, NULL }
+ , { OPTION_PRD, ALIAS_PRD, NULL, USAGE_PRD, 1, true , false, NULL }
+ , { OPTION_PRX, ALIAS_PRX, NULL, USAGE_PRX, 1, true , false, NULL }
+ , { OPTION_SET, ALIAS_SET, NULL, USAGE_SET, 1, true , false, NULL }
+ , { OPTION_ROOT,ALIAS_ROOT,NULL, USAGE_ROOT,1, false, false, NULL }
+};
+
+ParamDef Parameters[] =
+{
+ { WorkspaceDirPathConv }
+};
+
+rc_t CC UsageSummary (const char * progname) {
+ return KOutMsg (
+ "Usage:\n"
+ " %s [options] [<query> ...]\n\n"
+ " %s [options] --import <ngc-file> [<workspace directory path>]\n"
+ "\n"
+ "Summary:\n"
+ " Manage VDB configuration\n"
+ , progname, progname);
+}
+
+rc_t CC Usage(const Args* args) {
+ rc_t rc = 0;
+
+ const char* progname = UsageDefaultName;
+ const char* fullpath = UsageDefaultName;
+
+ if (args == NULL) {
+ rc = RC(rcExe, rcArgv, rcAccessing, rcSelf, rcNull);
+ }
+ else {
+ rc = ArgsProgram(args, &fullpath, &progname);
+ }
+
+ UsageSummary(progname);
+
+ KOutMsg ("\nOptions:\n");
+
+ HelpOptionLine (ALIAS_ALL, OPTION_ALL, NULL, USAGE_ALL);
+ HelpOptionLine (ALIAS_PCF, OPTION_PCF, NULL, USAGE_PCF);
+ HelpOptionLine (ALIAS_FIL, OPTION_FIL, NULL, USAGE_FIL);
+ HelpOptionLine (ALIAS_DIR, OPTION_DIR, NULL, USAGE_DIR);
+ HelpOptionLine (ALIAS_ENV, OPTION_ENV, NULL, USAGE_ENV);
+ HelpOptionLine (ALIAS_MOD, OPTION_MOD, NULL, USAGE_MOD);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_SET, OPTION_SET, "name=value", USAGE_SET);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_CFG, OPTION_CFG, NULL, USAGE_CFG);
+ HelpOptionLine (ALIAS_CFM, OPTION_CFM, "mode", USAGE_CFM);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_FIX, OPTION_FIX, NULL, USAGE_FIX);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_OUT, OPTION_OUT, "x | n", USAGE_OUT);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_PRX, OPTION_PRX, "uri[:port]", USAGE_PRX);
+ HelpOptionLine (ALIAS_PRD, OPTION_PRD, "yes | no", USAGE_PRD);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_CDR, OPTION_CDR, "path", USAGE_CDR);
+ KOutMsg ("\n");
+ HelpOptionLine (ALIAS_ROOT,OPTION_ROOT,NULL, USAGE_ROOT);
+
+ KOutMsg ("\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+const char UsageDefaultName[] = "vdb-config";
+
+static void Indent(bool xml, int n) {
+ if (!xml)
+ { return; }
+ while (n--)
+ { OUTMSG((" ")); }
+}
+
+static rc_t KConfigNodeReadData(const KConfigNode* self,
+ char* buf, size_t blen, size_t* num_read)
+{
+ rc_t rc = 0;
+ size_t remaining = 0;
+ assert(buf && blen && num_read);
+ rc = KConfigNodeRead(self, 0, buf, blen, num_read, &remaining);
+ assert(remaining == 0); /* TODO overflow check */
+ assert(*num_read <= blen);
+ return rc;
+}
+
+static
+rc_t _printNodeData(const char *name, const char *data, size_t dlen)
+{
+ bool secret = false;
+ {
+ const char d1[] = "download-ticket";
+ size_t l1 = sizeof d1 - 1;
+
+ const char d2[] = "aws_access_key_id";
+ size_t l2 = sizeof d2 - 1;
+
+ const char d3[] = "aws_secret_access_key";
+ size_t l3 = sizeof d3 - 1;
+
+ if ((string_cmp(name,
+ string_measure(name, NULL), d1, l1, (uint32_t)l1) == 0) ||
+ (string_cmp(name,
+ string_measure(name, NULL), d2, l2, (uint32_t)l2) == 0) ||
+ (string_cmp(name,
+ string_measure(name, NULL), d3, l3, (uint32_t)l3) == 0))
+ {
+ secret = true;
+ }
+ }
+
+ if (secret) {
+ const char *ellipsis = "";
+ const char replace[] =
+"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ if (dlen > 70) {
+ dlen = 70;
+ ellipsis = "...";
+ }
+ return OUTMSG(("%.*s%s", (uint32_t)dlen, replace, ellipsis));
+ }
+ else {
+ return OUTMSG(("%.*s", dlen, data));
+ }
+}
+
+#define VDB_CONGIG_OUTMSG(args) do { if (xml) { OUTMSG(args); } } while (false)
+static rc_t KConfigNodePrintChildNames(bool xml, const KConfigNode* self,
+ const char* name, int indent, const char* aFullpath)
+{
+ rc_t rc = 0;
+ uint32_t count = 0;
+ int i = 0;
+ char buffer[8192] = "";
+ size_t num_read = 0;
+ bool hasChildren = false;
+ bool hasData = false;
+ const KConfigNode* node = NULL;
+ KNamelist* names = NULL;
+ bool beginsWithNumberinXml = false;
+ assert(self && name);
+
+ if (rc == 0)
+ { rc = KConfigNodeOpenNodeRead(self, &node, "%s", name); }
+ if (rc == 0) {
+ rc = KConfigNodeReadData(node, buffer, sizeof buffer, &num_read);
+ hasData = num_read > 0;
+ if (hasData) {
+ /* VDB_CONGIG_OUTMSG(("\n%s = \"%.*s\"\n\n", aFullpath, num_read, buffer)); */
+ }
+ }
+ if (rc == 0) {
+ rc = KConfigNodeListChild(node, &names);
+ }
+ if (rc == 0) {
+ rc = KNamelistCount(names, &count);
+ hasChildren = count;
+ }
+
+ Indent(xml, indent);
+ if (xml) {
+ beginsWithNumberinXml = isdigit(name[0]);
+ if (! beginsWithNumberinXml) {
+ VDB_CONGIG_OUTMSG(("<%s", name));
+ }
+ else {
+ /* XML node names cannot start with a number */
+ VDB_CONGIG_OUTMSG(("<_%s", name));
+ }
+ }
+ if (!hasChildren && !hasData) {
+ VDB_CONGIG_OUTMSG(("/>\n"));
+ }
+ else { VDB_CONGIG_OUTMSG((">"));
+ }
+ if (hasData) {
+ if (xml) {
+ _printNodeData(name, buffer, num_read);
+ }
+ else {
+ OUTMSG(("%s = \"", aFullpath));
+ _printNodeData(name, buffer, num_read);
+ OUTMSG(("\"\n"));
+ }
+ }
+ if (hasChildren)
+ { VDB_CONGIG_OUTMSG(("\n"));}
+
+ if (hasChildren) {
+ for (i = 0; i < (int)count && rc == 0; ++i) {
+ char* fullpath = NULL;
+ const char* name = NULL;
+ rc = KNamelistGet(names, i, &name);
+ if (rc == 0) {
+ size_t bsize = strlen(aFullpath) + 1 + strlen(name) + 1;
+ fullpath = malloc(bsize + 1);
+ if (fullpath == NULL) {
+ rc = RC
+ (rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ else {
+ string_printf(fullpath, bsize, NULL,
+ "%s/%s", aFullpath, name);
+ }
+ }
+ if (rc == 0) {
+ rc = KConfigNodePrintChildNames
+ (xml, node, name, indent + 1, fullpath);
+ }
+ free(fullpath);
+ }
+ }
+
+ if (hasChildren)
+ { Indent(xml, indent); }
+ if (hasChildren || hasData)
+ {
+ if (! beginsWithNumberinXml) {
+ VDB_CONGIG_OUTMSG(("</%s>\n",name));
+ }
+ else {
+ VDB_CONGIG_OUTMSG(("</_%s>\n",name));
+ }
+ }
+
+ RELEASE(KNamelist, names);
+ RELEASE(KConfigNode, node);
+ return rc;
+}
+
+typedef struct Params {
+ Args* args;
+ uint32_t argsParamIdx;
+ uint32_t argsParamCnt;
+
+ const char *cfg_dir;
+
+ bool xml;
+
+ const char *setValue;
+
+ const char *ngc;
+
+ bool modeSetNode;
+ bool modeConfigure;
+ EConfigMode configureMode;
+ bool modeCreate;
+ bool modeShowCfg;
+ bool modeShowEnv;
+ bool modeShowFiles;
+ bool modeShowLoadPath;
+ bool modeShowModules;
+ bool modeRoot;
+
+ bool showMultiple;
+
+ enum {
+ eUndefined,
+ eNo,
+ eYes
+ } proxyDisabled;
+ const char *proxy;
+} Params;
+static rc_t ParamsConstruct(int argc, char* argv[], Params* prm) {
+ rc_t rc = 0;
+ Args* args = NULL;
+ int count = 0;
+ assert(argc && argv && prm);
+ memset(prm, 0, sizeof *prm);
+ args = prm->args;
+ do {
+ uint32_t pcount = 0;
+ rc = ArgsMakeAndHandle2(&args, argc, argv, Parameters, sizeof Parameters / sizeof Parameters[0], 1, Options, sizeof Options / sizeof Options[0]);
+ if (rc) {
+ LOGERR(klogErr, rc, "While calling ArgsMakeAndHandle2");
+ break;
+ }
+
+ prm->args = args;
+ rc = ArgsParamCount(args, &prm->argsParamCnt);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get query parameter[s]");
+ break;
+ }
+ if (prm->argsParamCnt > 0) {
+ prm->modeShowCfg = true;
+ ++count;
+ }
+
+ { // OPTION_OUT
+ prm->xml = true;
+ rc = ArgsOptionCount(args, OPTION_OUT, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_OUT "' argument");
+ break;
+ }
+ if (pcount) {
+ const char* dummy = NULL;
+ rc = ArgsOptionValue(args, OPTION_OUT, 0, (const void **)&dummy);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_OUT "' argument");
+ break;
+ }
+ if (!strcmp(dummy, "n")) {
+ prm->xml = false;
+ }
+ else if (strcmp(dummy, "x")) {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Bad " OPTION_OUT " value");
+ break;
+ }
+ }
+ }
+ { // OPTION_ENV
+ rc = ArgsOptionCount(args, OPTION_ENV, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_ENV "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeShowEnv = true;
+ ++count;
+ }
+ }
+ { // OPTION_CDR
+ rc = ArgsOptionCount(args, OPTION_CDR, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CDR "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue
+ (args, OPTION_CDR, 0, (const void **)&prm->cfg_dir);
+ if (rc) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_CDR "' argument");
+ break;
+ }
+ }
+ }
+ { // OPTION_FIL
+ rc = ArgsOptionCount(args, OPTION_FIL, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_FIL "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ prm->modeShowFiles = true;
+ ++count;
+ }
+ }
+ { // OPTION_IMP
+ rc = ArgsOptionCount(args, OPTION_IMP, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_IMP "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(args, OPTION_IMP, 0, (const void **)&prm->ngc);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_IMP "' argument");
+ break;
+ }
+ else {
+ prm->modeShowCfg = false;
+ }
+ }
+ }
+ { // OPTION_MOD
+ rc = ArgsOptionCount(args, OPTION_MOD, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_MOD "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeShowModules = true;
+ ++count;
+ }
+ }
+#if 0
+ { // OPTION_NEW
+ rc = ArgsOptionCount(args, OPTION_NEW, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_NEW "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeCreate = true;
+ ++count;
+ }
+ }
+#endif
+ { // OPTION_PCF
+ rc = ArgsOptionCount(args, OPTION_PCF, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PCF "' argument");
+ break;
+ }
+ if (pcount) {
+ if (!prm->modeShowCfg) {
+ prm->modeShowCfg = true;
+ ++count;
+ }
+ }
+ }
+ { // OPTION_PRD
+ rc = ArgsOptionCount(args, OPTION_PRD, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PRD "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ const char *dummy = NULL;
+ rc = ArgsOptionValue(args, OPTION_PRD, 0, (const void **)&dummy);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PRD "' argument");
+ break;
+ }
+ if (tolower(dummy[0]) == 'y') {
+ prm->proxyDisabled = eYes;
+ }
+ else if (tolower(dummy[0]) == 'n') {
+ prm->proxyDisabled = eNo;
+ }
+ }
+ }
+ { // OPTION_PRX
+ rc = ArgsOptionCount(args, OPTION_PRX, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PRX "' argument");
+ break;
+ }
+ if (pcount > 0) {
+ rc = ArgsOptionValue(args, OPTION_PRX, 0, (const void **)&prm->proxy);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_PRX "' argument");
+ break;
+ }
+ }
+ }
+ { // OPTION_DIR
+ rc = ArgsOptionCount(args, OPTION_DIR, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_DIR "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeShowLoadPath = true;
+ ++count;
+ }
+ }
+ { // OPTION_ROOT
+ rc = ArgsOptionCount(args, OPTION_ROOT, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_ROOT "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeRoot = true;
+ }
+ }
+ { // OPTION_SET
+ rc = ArgsOptionCount(args, OPTION_SET, &pcount);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_SET "' argument");
+ break;
+ }
+ if (pcount) {
+ rc = ArgsOptionValue(args, OPTION_SET, 0, (const void **)&prm->setValue);
+ if (rc == 0) {
+ const char* p = strchr(prm->setValue, '=');
+ if (p == NULL || *(p + 1) == '\0') {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Bad " OPTION_SET " value");
+ break;
+ }
+ prm->modeSetNode = true;
+ prm->modeCreate = prm->modeShowCfg = prm->modeShowEnv
+ = prm->modeShowFiles = prm->modeShowLoadPath
+ = prm->modeShowModules = false;
+ count = 1;
+ }
+ }
+ }
+ { // OPTION_FIX
+ rc = ArgsOptionCount(args, OPTION_FIX, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_FIX "' argument");
+ break;
+ }
+ if (pcount) {
+ prm->modeConfigure = true;
+ prm->modeShowCfg = false;
+ count = 1;
+ prm->configureMode = eCfgModeDefault;
+ }
+ }
+ { // OPTION_CFG
+ rc = ArgsOptionCount(args, OPTION_CFG, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CFG "' argument");
+ break;
+ }
+ if (pcount) {
+#if 1
+ prm->modeConfigure = true;
+ prm->modeShowCfg = false;
+ count = 1;
+ prm->configureMode = eCfgModeVisual;
+
+#else
+ const char* dummy = NULL;
+ rc = ArgsOptionValue(args, OPTION_CFG, 0, (const void **)&dummy);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CFG "' argument");
+ break;
+ }
+ prm->modeConfigure = true;
+ prm->modeShowCfg = false;
+ count = 1;
+ switch (dummy[0]) {
+ case 't':
+ prm->configureMode = eCfgModeTextual;
+ break;
+ default:
+ prm->configureMode = eCfgModeDefault;
+ break;
+ }
+#endif
+ }
+ }
+ { // OPTION_CFM
+ rc = ArgsOptionCount(args, OPTION_CFM, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CFM "' argument");
+ break;
+ }
+ if (pcount) {
+ const char* dummy = NULL;
+ size_t dummy_len;
+ rc = ArgsOptionValue(args, OPTION_CFM, 0, (const void **)&dummy);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_OUT "' argument");
+ break;
+ }
+ prm->modeShowCfg = false;
+ count = 1;
+ prm->modeConfigure = true;
+
+ dummy_len = strlen( dummy );
+ if ( dummy_len == 0 )
+ dummy_len = 1;
+
+ if ( strncmp( dummy, "textual", dummy_len ) == 0 )
+ prm->configureMode = eCfgModeTextual;
+ else if ( strncmp( dummy, "graphical", dummy_len ) == 0 )
+ prm->configureMode = eCfgModeVisual;
+ else
+ {
+ rc = RC( rcExe, rcArgv, rcEvaluating, rcParam, rcInvalid );
+ LOGERR(klogErr, rc, "Unrecognized '" OPTION_CFM "' argument");
+ break;
+ }
+ }
+ }
+ { // OPTION_ALL
+ rc = ArgsOptionCount(args, OPTION_ALL, &pcount);
+ if (rc) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_ALL "' argument");
+ break;
+ }
+ if (pcount
+ || ( !prm->modeConfigure
+ && !prm->modeShowCfg && ! prm->modeShowLoadPath
+ && !prm->modeShowEnv && !prm->modeShowFiles
+ && !prm->modeShowModules && !prm->modeCreate
+ && !prm->modeSetNode && prm->ngc == NULL
+ && prm->proxy == NULL && prm->proxyDisabled == eUndefined))
+ /* show all by default */
+ {
+ prm->modeShowCfg = prm->modeShowEnv = prm->modeShowFiles = true;
+ count += 2;
+ }
+ }
+
+ if (count > 1) {
+ prm->showMultiple = true;
+ }
+ } while (false);
+
+ return rc;
+}
+
+static rc_t ParamsGetNextParam(Params* prm, const char** param) {
+ rc_t rc = 0;
+ assert(prm && param);
+ *param = NULL;
+ if (prm->argsParamIdx < prm->argsParamCnt) {
+ rc = ArgsParamValue(prm->args, prm->argsParamIdx++, (const void **)param);
+ if (rc)
+ { LOGERR(klogErr, rc, "Failure retrieving query"); }
+ }
+ return rc;
+}
+
+static rc_t ParamsDestruct(Params* prm) {
+ rc_t rc = 0;
+ assert(prm);
+ RELEASE(Args, prm->args);
+ return rc;
+}
+
+static
+rc_t privReadStdinLine(char* buf, size_t bsize, bool destroy)
+{
+ rc_t rc = 0;
+ static const KFile* std_in = NULL;
+ static uint64_t pos = 0;
+ size_t num_read = 0;
+ if (destroy) {
+ RELEASE(KFile, std_in);
+ pos = 0;
+ return rc;
+ }
+ if (std_in == NULL) {
+ rc = KFileMakeStdIn(&std_in);
+ if (rc != 0) {
+ DISP_RC(rc, "KFileMakeStdIn");
+ return rc;
+ }
+ }
+ rc = KFileRead(std_in, pos, buf, bsize, &num_read);
+ DISP_RC(rc, "KFileRead");
+ pos += num_read;
+ if (num_read) {
+ bool done = false;
+ buf[num_read] = '\0';
+ while (num_read > 0 && !done) {
+ switch (buf[num_read - 1]) {
+ case '\n':
+ case '\r':
+ buf[--num_read] = '\0';
+ break;
+ default:
+ done = true;
+ break;
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t ReadStdinLine(char* buf, size_t bsize) {
+ return privReadStdinLine(buf, bsize, false);
+}
+
+static rc_t DestroyStdin(void)
+{ return privReadStdinLine(NULL, 0, true); }
+
+static rc_t In(const char* prompt, const char* def, char** read) {
+ rc_t rc = 0;
+ char buf[PATH_MAX + 1];
+ assert(prompt && read);
+ *read = NULL;
+ while (rc == 0 && (*read == NULL || read[0] == '\0')) {
+ OUTMSG(("%s", prompt));
+ if (def)
+ { OUTMSG((" [%s]", def)); }
+ OUTMSG((": "));
+ rc = ReadStdinLine(buf, sizeof buf);
+ if (rc == 0) {
+ while (strlen(buf) > 0) {
+ char c = buf[strlen(buf) - 1];
+ if (c == '\n' || c == '\r')
+ { buf[strlen(buf) - 1] = '\0'; }
+ else
+ { break; }
+ }
+ if (buf[0] == '\0' && def != NULL) {
+ string_copy_measure(buf, sizeof buf, def);
+ }
+ if (buf[0]) {
+ *read = strdup(buf);
+ if (*read == NULL) {
+ rc = RC
+ (rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t CC scan_config_dir(const KDirectory* dir,
+ uint32_t type, const char* name, void* data)
+{
+ rc_t rc = 0;
+ assert(data);
+ switch (type) {
+ case kptFile:
+ case kptFile | kptAlias: {
+ size_t sz = strlen(name);
+ if (sz >= 5 && strcase_cmp(&name[sz - 4], 4, ".kfg", 4, 4) == 0) {
+ string_copy_measure(data, PATH_MAX + 1, name);
+ /* from CreateConfig..KDirectoryVVisit call */
+ rc = RC(rcExe, rcDirectory, rcListing, rcFile, rcExists);
+ }
+ break;
+ }
+ }
+ return rc;
+}
+
+static rc_t CreateConfig(char* argv0) {
+ const KFile* std_in = NULL;
+ KDirectory* native = NULL;
+ KDirectory* dir = NULL;
+ rc_t rc = 0;
+ char* location = NULL;
+ char* mod = NULL;
+ char* wmod = NULL;
+ char* refseq = NULL;
+ if (rc == 0) {
+ rc = KDirectoryNativeDir(&native);
+ }
+ if (rc == 0) {
+ const char* def = NULL;
+ char cwd[PATH_MAX + 1] = "";
+ const char* home = getenv("HOME");
+ if (home)
+ { def = home; }
+ else {
+ rc = KDirectoryResolvePath ( native, true, cwd, sizeof cwd, "." );
+ if (rc == 0 && cwd[0])
+ { def = cwd; }
+ else
+ { def = "."; }
+ }
+ while (rc == 0) {
+ char buffer[PATH_MAX + 1];
+ rc = In("Specify configuration files directory", def, &location);
+ if (rc == 0) {
+ rc = KDirectoryOpenDirUpdate(native, &dir, false, "%s", location);
+ if (rc == 0) {
+ rc = KDirectoryVisit
+ (dir, false, scan_config_dir, buffer, ".");
+ if (rc != 0) {
+ if (rc ==
+ RC(rcExe, rcDirectory, rcListing, rcFile, rcExists)
+ && buffer[0])
+ {
+ PLOGERR(klogErr, (klogErr, rc,
+ "Configuration file found: $(dir)/$(name)",
+ "dir=%s,name=%s", location, buffer));
+ rc = 0;
+ buffer[0] = '\0';
+ continue;
+ }
+ else {
+ PLOGERR(klogErr, (klogErr, rc, "$(dir)/$(name)",
+ "dir=%s,name=%s", location, buffer));
+ }
+ }
+ break;
+ }
+ else if (GetRCObject(rc) == (enum RCObject)rcPath &&
+ (GetRCState(rc) == rcIncorrect || GetRCState(rc) == rcNotFound))
+ {
+ PLOGERR(klogErr,
+ (klogErr, rc, "$(path)", "path=%s", location));
+ rc = 0;
+ }
+ else { DISP_RC(rc, location); }
+ }
+ }
+ }
+ while (rc == 0) {
+ const KDirectory* dir = NULL;
+ rc = In("Specify refseq installation directory", NULL, &refseq);
+ if (rc != 0)
+ { break; }
+ rc = KDirectoryOpenDirRead(native, &dir, false, "%s", refseq);
+ if (rc == 0) {
+ RELEASE(KDirectory, dir);
+ break;
+ }
+ else if (GetRCObject(rc) == (enum RCObject)rcPath
+ && GetRCState(rc) == rcIncorrect)
+ {
+ PLOGERR(klogErr,
+ (klogErr, rc, "$(path)", "path=%s", refseq));
+ rc = 0;
+ }
+ DISP_RC(rc, refseq);
+ }
+ if (rc == 0) {
+ char buffer[512];
+ const char path[] = "vdb-config.kfg";
+ uint64_t pos = 0;
+ KFile* f = NULL;
+ rc = KDirectoryCreateFile(dir, &f, false, 0664, kcmCreate, "%s", path);
+ DISP_RC(rc, path);
+ if (rc == 0) {
+ int n = snprintf(buffer, sizeof buffer,
+ "refseq/servers = \"%s\"\n", refseq);
+ if (n >= sizeof buffer) {
+ rc = RC(rcExe, rcFile, rcWriting, rcBuffer, rcInsufficient);
+ }
+ else {
+ size_t num_writ = 0;
+ rc = KFileWrite(f, pos, buffer, strlen(buffer), &num_writ);
+ pos += num_writ;
+ }
+ }
+ if (rc == 0) {
+ const char buffer[] = "refseq/volumes = \".\"\n";
+ size_t num_writ = 0;
+ rc = KFileWrite(f, pos, buffer, strlen(buffer), &num_writ);
+ pos += num_writ;
+ }
+ if (rc == 0 && mod && mod[0]) {
+ int n = snprintf(buffer, sizeof buffer,
+ "vdb/module/paths = \"%s\"\n", mod);
+ if (n >= sizeof buffer) {
+ rc = RC(rcExe, rcFile, rcWriting, rcBuffer, rcInsufficient);
+ }
+ else {
+ size_t num_writ = 0;
+ rc = KFileWrite(f, pos, buffer, strlen(buffer), &num_writ);
+ pos += num_writ;
+ }
+ }
+ if (rc == 0 && wmod && wmod[0]) {
+ int n = snprintf(buffer, sizeof buffer,
+ "vdb/wmodule/paths = \"%s\"\n", wmod);
+ if (n >= sizeof buffer) {
+ rc = RC(rcExe, rcFile, rcWriting, rcBuffer, rcInsufficient);
+ }
+ else {
+ size_t num_writ = 0;
+ rc = KFileWrite(f, pos, buffer, strlen(buffer), &num_writ);
+ pos += num_writ;
+ }
+ }
+ RELEASE(KFile, f);
+ }
+ free(mod);
+ free(wmod);
+ free(refseq);
+ free(location);
+ RELEASE(KDirectory, dir);
+ RELEASE(KDirectory, native);
+ RELEASE(KFile, std_in);
+ DestroyStdin();
+ return rc;
+}
+
+#if 0
+static rc_t ShowModules(const KConfig* cfg, const Params* prm) {
+ rc_t rc = 0;
+#ifdef _STATIC
+ OUTMSG(("<!-- Modules are not used in static build -->\n"));
+#else
+ const VDBManager* mgr = NULL;
+ KNamelist* list = NULL;
+ OUTMSG(("<!-- Modules -->\n"));
+ rc = VDBManagerMakeRead(&mgr, NULL);
+ DISP_RC(rc, "while calling VDBManagerMakeRead");
+ if (rc == 0) {
+ rc = VDBManagerListExternalSchemaModules(mgr, &list);
+ DISP_RC(rc, "while calling VDBManagerListExternalSchemaModules");
+ }
+ if (rc == 0) {
+ uint32_t count = 0;
+ rc = KNamelistCount(list, &count);
+ DISP_RC(rc, "while calling KNamelistCount "
+ "on VDBManagerListExternalSchemaModules result");
+ if (rc == 0) {
+ int64_t i = 0;
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char* name = NULL;
+ rc = KNamelistGet(list, i, &name);
+ DISP_RC(rc, "while calling KNamelistGet "
+ "on VDBManagerListExternalSchemaModules result");
+ if (rc == 0) {
+ OUTMSG(("%s\n", name));
+ }
+ }
+ }
+ }
+ OUTMSG(("\n"));
+ RELEASE(KNamelist, list);
+ RELEASE(VDBManager, mgr);
+#endif
+ return rc;
+}
+#endif
+
+static rc_t SetNode(KConfig* cfg, const Params* prm) {
+ rc_t rc = 0;
+
+ KConfigNode* node = NULL;
+ char* name = NULL;
+ char* val = NULL;
+
+ assert(cfg && prm && prm->setValue);
+
+ if (is_iser_an_admin() && !prm->modeRoot) {
+ rc = RC(rcExe, rcNode, rcUpdating, rcCondition, rcViolated);
+ LOGERR(klogErr, rc, "Warning: "
+ "normally this application should not be run as root/superuser");
+ }
+
+ name = strdup(prm->setValue);
+ if (name == NULL)
+ { return RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted); }
+
+ val = strchr(name, '=');
+ if (val == NULL || *(val + 1) == '\0') {
+ rc_t rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR(klogErr, rc, "Bad " OPTION_SET " value");
+ }
+
+ if (rc == 0) {
+ *(val++) = '\0';
+
+ rc = KConfigOpenNodeUpdate(cfg, &node, "%s", name);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "Cannot open node '$(name)' for update", "name=%s", name));
+ }
+ }
+
+ if (rc == 0) {
+ assert(val);
+ rc = KConfigNodeWrite(node, val, strlen(val));
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "Cannot write value '$(val) to node '$(name)'",
+ "val=%s,name=%s", val, name));
+ }
+ }
+
+ if (rc == 0) {
+ rc = KConfigCommit(cfg);
+ DISP_RC(rc, "while calling KConfigCommit");
+ }
+
+ free(name);
+ name = NULL;
+
+ RELEASE(KConfigNode, node);
+ return rc;
+}
+
+static rc_t SetProxy(KConfig *cfg, const Params *prm) {
+ rc_t rc = 0;
+
+ bool disabled = false;
+ bool set = false;
+ bool disableSet = false;
+
+ assert(prm);
+
+ switch (prm->proxyDisabled) {
+ case eNo:
+ disabled = false;
+ break;
+ case eYes:
+ disabled = true;
+ break;
+ default:
+ break;
+ }
+
+ if (prm->proxy != NULL) {
+ rc = KConfig_Set_Http_Proxy_Path(cfg, prm->proxy);
+ set = true;
+
+ if (rc == 0 && prm->proxyDisabled == eUndefined) {
+ rc = KConfig_Set_Http_Proxy_Enabled(cfg, true);
+ }
+ }
+
+ if (prm->proxyDisabled != eUndefined) {
+ rc_t r2 = KConfig_Set_Http_Proxy_Enabled(cfg, ! disabled);
+ disableSet = true;
+ if (r2 != 0 && rc == 0) {
+ rc = r2;
+ }
+ }
+
+ if (rc == 0) {
+ rc = KConfigCommit(cfg);
+ DISP_RC(rc, "while calling KConfigCommit");
+ }
+ if (rc == 0) {
+ if (set) {
+ OUTMSG(("Use HTTP proxy server configuration '%s'\n", prm->proxy));
+ }
+ if (disableSet) {
+ OUTMSG(("HTTP proxy was %s\n", disabled ? "disabled" : "enabled"));
+ }
+ }
+ else {
+ LOGERR(klogErr, rc, "Failed to update HTTP proxy configuration");
+ }
+
+ return rc;
+}
+
+static rc_t ShowConfig(const KConfig* cfg, Params* prm) {
+ rc_t rc = 0;
+ bool hasAny = false;
+ bool hasQuery = false;
+ bool xml = true;
+ assert(cfg && prm);
+ xml = prm->xml;
+ while (rc == 0) {
+ KNamelist* names = NULL;
+ const KConfigNode* node = NULL;
+ uint32_t count = 0;
+ uint32_t i = 0;
+ int indent = 0;
+ const char* root = NULL;
+ const char* nodeName = NULL;
+ size_t nodeNameL = 1;
+ rc = ParamsGetNextParam(prm, &root);
+ if (rc == 0) {
+ if (root == NULL) {
+ if (hasQuery)
+ { break; }
+ else
+ { root = "/"; }
+ }
+ else { hasQuery = true; }
+ assert(root);
+ }
+ if (rc == 0) {
+ int64_t len = strlen(root);
+ assert(len > 0);
+ while (len > 0) {
+ if (root[len - 1] == '/')
+ { --len; }
+ else { break; }
+ }
+ assert(len >= 0);
+ if (len == 0) {
+ root += strlen(root) - 1;
+ nodeName = root;
+ }
+ else {
+ char *c = memrchr(root, '/', len);
+ if (c != NULL) {
+ nodeName = c + 1;
+ }
+ else {
+ nodeName = root;
+ }
+ }
+ assert(nodeName && nodeName[0]);
+ nodeNameL = strlen(nodeName);
+ while (nodeNameL > 1 && nodeName[nodeNameL - 1] == '/')
+ { --nodeNameL; }
+ }
+
+ if (rc == 0) {
+ rc = KConfigOpenNodeRead(cfg, &node, "%s", root);
+ DISP_RC(rc, root);
+ }
+ if (rc == 0) {
+ rc = KConfigNodeListChild(node, &names);
+ }
+ if (rc == 0) {
+ rc = KNamelistCount(names, &count);
+ }
+ if (rc == 0 && count == 0) {
+ char buf[512] = "";
+ size_t num_read = 0;
+ rc = KConfigNodeReadData(node, buf, sizeof buf, &num_read);
+ if (rc == 0 && num_read > 0) {
+ if (prm->showMultiple)
+ { OUTMSG(("<!-- Configuration node %s -->\n", root)); }
+ if (xml) {
+ VDB_CONGIG_OUTMSG(("<%.*s>", nodeNameL, nodeName));
+ VDB_CONGIG_OUTMSG(("%.*s", (int)num_read, buf));
+ VDB_CONGIG_OUTMSG(("</%.*s>\n", nodeNameL, nodeName));
+ }
+ else {
+ OUTMSG(("%.*s = \"%.*s\"\n",
+ nodeNameL, nodeName, (int)num_read, buf));
+ }
+ hasAny = true;
+ }
+ }
+ else {
+ if (rc == 0) {
+ if (nodeName[0] != '/') {
+ if (prm->showMultiple)
+ { OUTMSG(("<!-- Configuration node %s -->\n", root)); }
+ VDB_CONGIG_OUTMSG(("<%.*s>\n", nodeNameL, nodeName));
+ } else {
+ if (prm->showMultiple)
+ { OUTMSG(("<!-- Current configuration -->\n")); }
+ VDB_CONGIG_OUTMSG(("<Config>\n"));
+ }
+ hasAny = true;
+ ++indent;
+ }
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char* name = NULL;
+ if (rc == 0)
+ { rc = KNamelistGet(names, i, &name); }
+ if (rc == 0) {
+ char* fullname = NULL;
+ if (strcmp(root, "/") == 0) {
+ size_t bsize = strlen(name) + 2;
+ fullname = malloc(bsize);
+ if (fullname == NULL) {
+ rc = RC(rcExe,
+ rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ string_printf(fullname, bsize, NULL, "/%s", name);
+ }
+ else {
+ size_t sz = strlen(root) + 2 + strlen(name);
+ size_t num_writ = 0;
+ fullname = malloc(sz);
+ if (fullname == NULL) {
+ rc = RC(rcExe,
+ rcStorage, rcAllocating, rcMemory, rcExhausted);
+ }
+ rc = string_printf(fullname, sz, &num_writ,
+ "%s/%s", root, name);
+ assert(num_writ + 1 == sz);
+ }
+ if (rc == 0) {
+ rc = KConfigNodePrintChildNames
+ (xml, node, name, indent, fullname);
+ hasAny = true;
+ }
+ free(fullname);
+ fullname = NULL;
+ }
+ }
+ if (rc == 0) {
+ if (nodeName[0] != '/') {
+ VDB_CONGIG_OUTMSG(("</%.*s>\n", nodeNameL, nodeName));
+ }
+ else {
+ VDB_CONGIG_OUTMSG(("</Config>\n"));
+ }
+ }
+ }
+
+ RELEASE(KConfigNode, node);
+ RELEASE(KNamelist, names);
+
+ if (rc == 0) {
+ if (hasAny) {
+ OUTMSG(("\n"));
+ }
+ else if (nodeNameL > 0 && nodeName != NULL) {
+ VDB_CONGIG_OUTMSG(("<%.*s/>\n", nodeNameL, nodeName));
+ }
+ }
+
+ if (!hasQuery)
+ { break; }
+ }
+
+ return rc;
+}
+
+static rc_t ShowFiles(const KConfig* cfg, const Params* prm) {
+ rc_t rc = 0;
+ bool hasAny = false;
+ uint32_t count = 0;
+ KNamelist* names = NULL;
+ rc = KConfigListIncluded(cfg, &names);
+ if (rc == 0) {
+ rc = KNamelistCount(names, &count);
+ }
+ if (rc == 0) {
+ uint32_t i = 0;
+
+ if (prm->showMultiple) {
+ if (prm->xml) {
+ OUTMSG(("<ConfigurationFiles>\n"));
+ }
+ else {
+ OUTMSG(("<!-- Configuration files -->\n"));
+ }
+ hasAny = true;
+ }
+
+ for (i = 0; i < count && rc == 0; ++i) {
+ const char* name = NULL;
+ if (rc == 0) {
+ rc = KNamelistGet(names, i, &name);
+ }
+ if (rc == 0) {
+ OUTMSG(("%s\n", name));
+ hasAny = true;
+ }
+ }
+ }
+ if (prm->showMultiple && prm->xml) {
+ OUTMSG(("</ConfigurationFiles>"));
+ }
+
+ if (rc == 0 && hasAny) {
+ OUTMSG(("\n"));
+ }
+
+ RELEASE(KNamelist, names);
+
+ return rc;
+}
+
+static void ShowEnv(const Params* prm) {
+ bool hasAny = false;
+ const char * env_list [] = {
+ "KLIB_CONFIG",
+ "LD_LIBRARY_PATH",
+ "NCBI_HOME",
+ "NCBI_SETTINGS",
+ "NCBI_VDB_CONFIG",
+ "VDBCONFIG",
+ "VDB_CONFIG",
+ };
+ int i = 0;
+
+ if (prm->showMultiple) {
+ if (prm->xml) {
+ OUTMSG(("<Environment>\n"));
+ }
+ else {
+ OUTMSG(("<!-- Environment -->\n"));
+ }
+ hasAny = true;
+ }
+
+ for (i = 0; i < sizeof env_list / sizeof env_list [ 0 ]; ++ i ) {
+ const char *eval = getenv ( env_list [ i ] );
+ if (eval) {
+ OUTMSG(("%s=%s\n", env_list [ i ], eval));
+ hasAny = true;
+ }
+ }
+ if (prm->showMultiple && prm->xml) {
+ OUTMSG(("</Environment>"));
+ }
+ if (hasAny) {
+ OUTMSG(("\n"));
+ }
+ else {
+ OUTMSG(("Environment variables are not found\n"));
+ }
+}
+
+static rc_t _VFSManagerSystem2PosixPath(const VFSManager *self,
+ const char *system, char posix[PATH_MAX])
+{
+ VPath *path = NULL;
+ rc_t rc = VFSManagerMakeSysPath(self, &path, system);
+ if (rc == 0) {
+ size_t written;
+ rc = VPathReadPath(path, posix, PATH_MAX, &written);
+ }
+ RELEASE(VPath, path);
+ return rc;
+}
+
+static rc_t DefaultPepoLocation(const KConfig *cfg,
+ uint32_t id, char *buffer, size_t bsize)
+{
+ rc_t rc = 0;
+ char home[PATH_MAX] = "";
+ size_t written = 0;
+ assert(buffer && bsize);
+ rc = KConfig_Get_Default_User_Path(cfg, home, sizeof home, &written);
+ if (rc == 0 && written > 0) {
+ rc = string_printf(buffer, bsize, &written, "%s/dbGaP-%u", home, id);
+ if (rc == 0) {
+ return rc;
+ }
+ }
+
+ rc = KConfig_Get_Home(cfg, home, sizeof home, &written);
+ if (rc == 0 && written > 0) {
+ rc = string_printf(buffer, bsize, &written,
+ "%s/ncbi/dbGaP-%u", home, id);
+ if (rc == 0) {
+ return rc;
+ }
+ }
+
+ {
+ VFSManager *vmgr = NULL;
+ rc = VFSManagerMake(&vmgr);
+ if (rc == 0) {
+ const char *home = getenv("HOME");
+ if (home == NULL) {
+ home = getenv("USERPROFILE");
+ }
+ if (home == NULL) {
+#define TODO 1
+ rc = TODO;
+ }
+ else {
+ size_t num_writ = 0;
+ char posix[PATH_MAX] = "";
+ rc = _VFSManagerSystem2PosixPath(vmgr, home, posix);
+ if (rc == 0) {
+ rc = string_printf(buffer, bsize, &num_writ,
+ "%s/ncbi/dbGaP-%u", posix, id);
+ if (rc == 0) {
+ return rc;
+ }
+ }
+ }
+ }
+ RELEASE(VFSManager, vmgr);
+ }
+
+ return rc;
+}
+
+static rc_t DoImportNgc(KConfig *cfg, Params *prm,
+ const char **newRepoParentPath, uint32_t *result_flags)
+{
+ rc_t rc = 0;
+ KDirectory *dir = NULL;
+ const KFile *src = NULL;
+ const KNgcObj *ngc = NULL;
+ static char buffer[PATH_MAX] = "";
+ const char *root = NULL;
+
+ assert(prm);
+ if (rc == 0) {
+ rc = KDirectoryNativeDir(&dir);
+ }
+ if (rc == 0) {
+ rc = KDirectoryOpenFileRead(dir, &src, "%s", prm->ngc);
+ }
+ if (rc == 0) {
+ rc = KNgcObjMakeFromFile(&ngc, src);
+ }
+ RELEASE(KFile, src);
+
+ if (rc == 0) {
+ uint32_t id = 0;
+ rc = KNgcObjGetProjectId(ngc, &id);
+ if (rc == 0) {
+ const char *p = NULL;
+ rc = ParamsGetNextParam(prm, &p);
+ if (rc == 0 && p != NULL) {
+ rc = KDirectoryResolvePath(dir, true, buffer, sizeof buffer, p);
+ if (rc == 0) {
+ root = buffer;
+ }
+ }
+ else {
+ rc = DefaultPepoLocation(cfg, id, buffer, sizeof buffer);
+ if (rc == 0) {
+ root = buffer;
+ }
+ }
+ }
+ }
+ RELEASE(KDirectory, dir);
+ if (rc == 0) {
+ rc = KConfigImportNgc ( cfg, prm -> ngc, root, newRepoParentPath );
+ }
+ RELEASE(KNgcObj, ngc);
+ return rc;
+}
+
+static rc_t ImportNgc(KConfig *cfg, Params *prm) {
+ const char *newRepoParentPath = NULL;
+ uint32_t result_flags = 0;
+ rc_t rc = 0;
+ assert(prm);
+ rc = DoImportNgc(cfg, prm, &newRepoParentPath, &result_flags);
+ DISP_RC2(rc, "cannot import ngc file", prm->ngc);
+ if ( rc == 0 ) {
+ rc = KConfigCommit(cfg);
+ }
+ if (rc == 0) {
+#if WINDOWS
+ char ngcPath[PATH_MAX] = "";
+ char system[MAX_PATH] = "";
+#endif
+ KDirectory *wd = NULL;
+ const char *ngc = prm->ngc;
+ rc_t rc = KDirectoryNativeDir(&wd);
+#if WINDOWS
+ if (rc == 0) {
+ rc = KDirectoryPosixStringToSystemString(wd,
+ system, sizeof system, "%s", newRepoParentPath);
+ if (rc == 0) {
+ newRepoParentPath = system;
+ }
+ rc = KDirectoryPosixStringToSystemString(wd,
+ ngcPath, sizeof ngcPath, "%s", ngc);
+ if (rc == 0) {
+ ngc = ngcPath;
+ }
+ }
+#endif
+ if (wd) {
+ if (KDirectoryPathType(wd, newRepoParentPath)
+ == kptNotFound)
+ {
+ KDirectoryCreateDir(wd, 0775,
+ kcmCreate | kcmParents, newRepoParentPath);
+ }
+ }
+
+ OUTMSG ( ( "%s was imported.\nRepository directory is: '%s'.\n",
+ ngc, newRepoParentPath ) );
+ RELEASE(KDirectory, wd);
+ }
+ return rc;
+}
+
+rc_t CC KMain(int argc, char* argv[]) {
+ rc_t rc = 0;
+
+ Params prm;
+ KConfig* cfg = NULL;
+
+ if (rc == 0) {
+ rc = ParamsConstruct(argc, argv, &prm);
+ }
+
+ if (rc == 0) {
+ const KDirectory *d = NULL;
+ if (prm.cfg_dir != NULL) {
+ KDirectory *n = NULL;
+ rc = KDirectoryNativeDir(&n);
+ if (rc == 0) {
+ rc = KDirectoryOpenDirRead(n, &d, false, prm.cfg_dir);
+ DISP_RC2(rc, "while opening", prm.cfg_dir);
+ }
+ RELEASE(KDirectory, n);
+ }
+ if (rc == 0) {
+ rc = KConfigMake(&cfg, d);
+ DISP_RC(rc, "while calling KConfigMake");
+ }
+ RELEASE(KDirectory, d);
+ }
+
+ if (rc == 0 && prm.showMultiple && prm.xml) {
+ OUTMSG(("<VdbConfig>\n"));
+ }
+
+ if (rc == 0) {
+ if (prm.modeConfigure) {
+ rc = configure(prm.configureMode);
+ }
+ else if (prm.ngc) {
+ rc = ImportNgc(cfg, &prm);
+ }
+ else if (prm.modeSetNode) {
+ rc_t rc3 = SetNode(cfg, &prm);
+ if (rc3 != 0 && rc == 0) {
+ rc = rc3;
+ }
+ }
+ if (prm.proxy != NULL || prm.proxyDisabled != eUndefined) {
+ rc_t rc3 = SetProxy(cfg, &prm);
+ if (rc3 != 0 && rc == 0) {
+ rc = rc3;
+ }
+ }
+ if (prm.modeShowCfg) {
+ rc_t rc3 = ShowConfig(cfg, &prm);
+ if (rc3 != 0 && rc == 0) {
+ rc = rc3;
+ }
+ }
+ if (prm.modeShowFiles) {
+ rc_t rc3 = ShowFiles(cfg, &prm);
+ if (rc3 != 0 && rc == 0) {
+ rc = rc3;
+ }
+ }
+ if (prm.modeShowLoadPath) {
+ const char* path = NULL;
+ rc_t rc3 = KConfigGetLoadPath(cfg, &path);
+ if (rc3 == 0) {
+ if (path != NULL && path[0]) {
+ OUTMSG(("%s\n", path));
+ }
+ }
+ else if (rc == 0) {
+ rc = rc3;
+ }
+ }
+ }
+
+ if (prm.modeShowEnv) {
+ ShowEnv(&prm);
+ }
+
+ if (rc == 0 && prm.showMultiple && prm.xml) {
+ OUTMSG(("</VdbConfig>\n"));
+ }
+
+ RELEASE(KConfig, cfg);
+
+ if (rc == 0 && prm.modeCreate) {
+ rc = CreateConfig(argv[0]);
+ }
+
+ ParamsDestruct(&prm);
+ return rc;
+}
+
+/************************************* EOF ************************************/
diff --git a/tools/vdb-config/vdb-config2.cpp b/tools/vdb-config/vdb-config2.cpp
new file mode 100644
index 0000000..e8787b4
--- /dev/null
+++ b/tools/vdb-config/vdb-config2.cpp
@@ -0,0 +1,30 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+/*
+ code is now in interactive.cpp
+*/
diff --git a/tools/vdb-config/vdb-config2.h b/tools/vdb-config/vdb-config2.h
new file mode 100644
index 0000000..fc0eda6
--- /dev/null
+++ b/tools/vdb-config/vdb-config2.h
@@ -0,0 +1,29 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+/*
+ code is now in interactive.h
+*/
diff --git a/tools/vdb-copy/.gitignore b/tools/vdb-copy/.gitignore
new file mode 100644
index 0000000..fc8361c
--- /dev/null
+++ b/tools/vdb-copy/.gitignore
@@ -0,0 +1,17 @@
+*.txt
+*.sh
+*.dump
+*.kar
+*.tar
+*.vdb
+454_FASTQ_1
+newtab
+with_rev
+temp1
+temp2
+temp4
+t1
+t2
+t3
+t5
+t6
diff --git a/tools/vdb-copy/Makefile b/tools/vdb-copy/Makefile
new file mode 100644
index 0000000..c0a6494
--- /dev/null
+++ b/tools/vdb-copy/Makefile
@@ -0,0 +1,91 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-copy
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ vdb-copy
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-copy
+# vdb copy tool
+#
+$(BINDIR)/vdb-copy: $(NCBIDIR)/vdb-copy.kfg
+
+$(NCBIDIR)/vdb-copy.kfg: $(SRCDIR)/vdb-copy.kfg
+ cp $^ $@
+
+VDB_COPY_SRC = \
+ context \
+ helper \
+ coldefs \
+ get_platform \
+ namelist_tools \
+ copy_meta \
+ type_matcher \
+ redactval \
+ config_values \
+ vdb-copy
+
+VDB_COPY_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_COPY_SRC))
+
+VDB_COPY_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-wvdb \
+ -lm
+
+$(BINDIR)/vdb-copy: $(VDB_COPY_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_COPY_LIB)
diff --git a/tools/vdb-copy/coldefs.c b/tools/vdb-copy/coldefs.c
new file mode 100644
index 0000000..ff116fb
--- /dev/null
+++ b/tools/vdb-copy/coldefs.c
@@ -0,0 +1,775 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "coldefs.h"
+#include "helper.h"
+#include "definitions.h"
+
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/* allocate a column-definition */
+static p_col_def col_defs_init_col( const char* name )
+{
+ p_col_def res = NULL;
+ if ( name == NULL ) return res;
+ if ( name[0] == 0 ) return res;
+ res = calloc( 1, sizeof( col_def ) );
+ /* because of calloc all members are zero! */
+ if ( res != NULL )
+ res->name = string_dup_measure ( name, NULL );
+ return res;
+}
+
+
+/*
+ * helper-function for: col_defs_destroy
+ * - free's everything a node owns
+ * - free's the node
+*/
+static void CC col_defs_destroy_node( void* node, void* data )
+{
+ p_col_def p_node = (p_col_def)node;
+ if ( p_node != NULL )
+ {
+ if ( p_node->name != NULL )
+ free( p_node->name );
+ if ( p_node->src_cast )
+ free( p_node->src_cast );
+ if ( p_node->dst_cast )
+ free( p_node->dst_cast );
+ free( p_node );
+ }
+}
+
+
+/*
+ * initializes a column-definitions-list
+*/
+rc_t col_defs_init( col_defs** defs )
+{
+ if ( defs == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ (*defs) = calloc( 1, sizeof( col_defs ) );
+ if ( *defs == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ VectorInit( &((*defs)->cols), 0, 5 );
+ (*defs)->filter_idx = -1;
+ return 0;
+}
+
+
+/*
+ * destroys the column-definitions-list
+*/
+rc_t col_defs_destroy( col_defs* defs )
+{
+ if ( defs == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+ VectorWhack( &(defs->cols), col_defs_destroy_node, NULL );
+ free( defs );
+ return 0;
+}
+
+
+/*
+ * helper-function for: col_defs_parse_string / col_defs_extract_from_table
+ * - creates a column-definition by the column-name
+ * - adds the definition to the column-definition-vector
+*/
+static rc_t col_defs_append_col( col_defs* defs, const char* name )
+{
+ rc_t rc;
+ p_col_def new_col = col_defs_init_col( name );
+ if ( new_col == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcParsing, rcMemory, rcExhausted );
+ else
+ rc = VectorAppend( &(defs->cols), NULL, new_col );
+ return rc;
+}
+
+
+/*
+ * calls VTableListReadableColumns to get a list of all column-names of the table
+ * creates a temporary read-cursor to test and get the column-type
+ * walks the KNamelist with the available column-names
+ * tries to add every one of them to the temp. cursor
+ * if the column can be added to the cursor, it is appended
+ * to the column-definition list
+*/
+rc_t col_defs_extract_from_table( col_defs* defs, const VTable *table )
+{
+ KNamelist *names;
+ rc_t rc;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( table == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = VTableListReadableColumns( table, &names );
+ DISP_RC( rc, "col_defs_extract_from_table:VTableListReadableColumns() failed" );
+ if ( rc == 0 )
+ {
+ const VCursor *cursor;
+ rc = VTableCreateCursorRead( table, &cursor );
+ DISP_RC( rc, "col_defs_extract_from_table:VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( names, &count );
+ DISP_RC( rc, "col_defs_extract_from_table:KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *name;
+ rc = KNamelistGet( names, idx, &name );
+ DISP_RC( rc, "col_defs_extract_from_table:KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t temp_idx;
+ rc_t rc1 = VCursorAddColumn( cursor, &temp_idx, "%s", name );
+ DISP_RC( rc1, "col_defs_extract_from_table:VCursorAddColumn() failed" );
+ if ( rc1 == 0 )
+ {
+ rc = col_defs_append_col( defs, name );
+ DISP_RC( rc, "col_defs_extract_from_table:col_defs_append_col() failed" );
+ }
+ }
+ }
+ }
+ rc = VCursorRelease( cursor );
+ DISP_RC( rc, "col_defs_extract_from_table:VCursorRelease() failed" );
+ }
+ rc = KNamelistRelease( names );
+ DISP_RC( rc, "col_defs_extract_from_table:KNamelistRelease() failed" );
+ }
+ return rc;
+}
+
+
+rc_t col_defs_clear_to_copy( col_defs* defs )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_col_def item = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( item != NULL )
+ item->to_copy = false;
+ }
+ return rc;
+}
+
+
+/*
+ * walks the list of column-definitions and tries to add all off them
+ * to the given cursor, it stops if one of them fails to be added
+ * for every column it detects type_decl and type_desc
+ * if both calls are successful the column-def is marked as valid
+*/
+rc_t col_defs_add_to_rd_cursor( col_defs* defs, const VCursor *cursor, bool show )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( cursor == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ if ( col->src_cast != NULL )
+ {
+ rc = VCursorAddColumn( cursor, &(col->src_idx), "%s", col->src_cast );
+ DISP_RC( rc, "col_defs_add_to_cursor:VCursorAddColumn() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorDatatype( cursor, col->src_idx,
+ &(col->type_decl), &(col->type_desc) );
+ DISP_RC( rc, "col_defs_add_to_cursor:VCursorDatatype() failed" );
+ col->src_valid = ( rc == 0 );
+ if ( show && col->src_valid )
+ KOutMsg( "added to rd-cursor: >%s<\n", col->name );
+ }
+
+ }
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * retrieves a pointer to a column-definition
+ * name defines the name of the wanted column-definition
+*/
+p_col_def col_defs_find( col_defs* defs, const char * name )
+{
+ p_col_def res = NULL;
+ uint32_t idx, len;
+ if ( defs == NULL || name == NULL || name[0] == 0 )
+ return res;
+
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len && res == NULL; ++idx )
+ {
+ p_col_def item = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( nlt_strcmp( item->name, name ) == 0 )
+ res = item;
+ }
+ return res;
+}
+
+
+/*
+ * retrieves the index of a column-definition
+ * name defines the name of the wanted column-definition
+*/
+int32_t col_defs_find_idx( col_defs* defs, const char * name )
+{
+ int32_t res = -1;
+ uint32_t idx, len;
+ if ( defs == NULL || name == NULL || name[0] == 0 )
+ return res;
+
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len && res == -1; ++idx )
+ {
+ p_col_def item = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( nlt_strcmp( item->name, name ) == 0 )
+ res = (int32_t)idx;
+ }
+ return res;
+}
+
+
+/*
+ * retrieves a pointer to a column-definition
+ * idx defines the Vector-Index of the wanted column-definition
+ * !!! not the read or write cursor index !!!
+*/
+p_col_def col_defs_get( col_defs* defs, const uint32_t idx )
+{
+ p_col_def res = NULL;
+ if ( defs != NULL )
+ res = (p_col_def) VectorGet ( &(defs->cols), idx );
+ return res;
+}
+
+
+/*
+ * adds all columns marked with to_copy == true to the cursor
+*/
+rc_t col_defs_add_to_wr_cursor( col_defs* defs, const VCursor* cursor, bool show )
+{
+ uint32_t idx, len;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( cursor == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( col->to_copy && col->dst_cast != NULL )
+ {
+ rc_t rc = VCursorAddColumn( cursor, &(col->dst_idx), "%s", col->dst_cast );
+ col->to_copy = ( rc == 0 );
+ if ( show )
+ {
+ if ( col->to_copy )
+ KOutMsg( "added to wr-cursor: >%s<\n", col->name );
+ else
+ KOutMsg( "cannot add >%s<\n", col->name );
+ }
+ }
+ }
+ return 0;
+}
+
+
+/*
+ * searches in the column-vector for a successful string-comparison
+ * with the hardcoded name of the filter-column
+ * stores it's vector-idx in defs->filter_idx
+ * does not require an open cursor.
+*/
+rc_t col_defs_detect_filter_col( col_defs* defs, const char *name )
+{
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( name == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ defs->filter_idx = col_defs_find_idx( defs, name );
+ if ( defs->filter_idx < 0 )
+ return RC( rcExe, rcNoTarg, rcResolving, rcItem, rcNotFound );
+ return 0;
+}
+
+
+/*
+ * walks through the column-names and marks every column thats
+ * name is in "redactable_cols" as redactable
+ * sets the redact-value to zero
+ * if the default-type of the column is in the list of dna-types
+ * (a hardcoded list) it sets the redact-value to 'N'
+ * does not require an open cursor.
+*/
+rc_t col_defs_detect_redactable_cols_by_name( col_defs* defs,
+ const char * redactable_cols )
+{
+ const KNamelist *r_columns;
+ rc_t rc;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( defs == NULL || redactable_cols == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = nlt_make_namelist_from_string( &r_columns, redactable_cols );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( !(col->redactable) )
+ col->redactable = nlt_is_name_in_namelist( r_columns, col->name );
+ }
+ KNamelistRelease( r_columns );
+ }
+ return rc;
+}
+
+
+static rc_t redactable_types_2_type_id_vector( const VSchema * s,
+ const char * redactable_types,
+ Vector * id_vector )
+{
+ const KNamelist *r_types;
+ rc_t rc;
+ if ( redactable_types == NULL || s == NULL || id_vector == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = nlt_make_namelist_from_string( &r_types, redactable_types );
+ if ( rc == 0 )
+ {
+ uint32_t count, idx;
+
+ rc = KNamelistCount( r_types, &count );
+ if ( rc == 0 && count > 0 )
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *name;
+ rc = KNamelistGet( r_types, idx, &name );
+ if ( rc == 0 )
+ {
+ VTypedecl td;
+ rc = VSchemaResolveTypedecl ( s, &td, "%s", name );
+ if ( rc == 0 )
+ {
+ uint32_t *id = malloc( sizeof *id );
+ if ( id != NULL )
+ {
+ *id = td.type_id;
+ rc = VectorAppend ( id_vector, NULL, id );
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcMemory, rcExhausted );
+ }
+ }
+ }
+ KNamelistRelease( r_types );
+ }
+ return rc;
+}
+
+
+static void CC type_id_ptr_whack ( void *item, void *data )
+{
+ free( item );
+}
+
+
+/*
+ * walks through the columns and checks every column against
+ * a list of types, if one of the src-types of the column
+ * is in the list it is marked as redactable
+*/
+rc_t col_defs_detect_redactable_cols_by_type( col_defs* defs,
+ const VSchema * s, const matcher * m,
+ const char * redactable_types )
+{
+ Vector id_vector;
+ rc_t rc;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( redactable_types == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ VectorInit ( &id_vector, 0, 20 );
+ rc = redactable_types_2_type_id_vector( s, redactable_types, &id_vector );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( ! col->redactable )
+ col->redactable = matcher_src_has_type( m, s, col->name, &id_vector );
+ }
+ VectorWhack ( &id_vector, type_id_ptr_whack, NULL );
+ }
+
+/*
+ rc = nlt_make_namelist_from_string( &r_types, redactable_types );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( ! col->redactable )
+ col->redactable = matcher_src_has_type( m, col->name, r_types );
+ }
+ KNamelistRelease( r_types );
+ }
+*/
+ return rc;
+}
+
+
+rc_t col_defs_unmark_do_not_redact_columns( col_defs* defs,
+ const char * do_not_redact_cols )
+{
+ const KNamelist *names;
+ rc_t rc;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( do_not_redact_cols == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = nlt_make_namelist_from_string( &names, do_not_redact_cols );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( col->redactable )
+ if ( nlt_is_name_in_namelist( names, col->name ) )
+ col->redactable = false;
+ }
+ KNamelistRelease( names );
+ }
+ return rc;
+}
+
+/*
+ * walks through the column-definitions and counts how
+ * many of them have the to-copy-flag
+ * does not require an open cursor.
+*/
+uint32_t col_defs_count_copy_cols( col_defs* defs )
+{
+ uint32_t res = 0;
+ if ( defs != NULL )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def item = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( item != NULL )
+ if ( item->to_copy )
+ res++;
+ }
+ }
+ return res;
+}
+
+
+/*
+ * walks through the column-definitions and if a column
+ * has the to_copy-flag set, and it's name is in the
+ * given list of column-names the to copy-flag is cleared
+ * does not require an open cursor.
+*/
+rc_t col_defs_exclude_these_columns( col_defs* defs, const char * prefix, const char * column_names )
+{
+ rc_t rc = 0;
+ const KNamelist *names;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ /* it is OK if we have not column-names to exclude */
+ if ( column_names == NULL )
+ return 0;
+ if ( column_names[0] == 0 )
+ return 0;
+
+ rc = nlt_make_namelist_from_string( &names, column_names );
+ DISP_RC( rc, "col_defs_parse_string:nlt_make_namelist_from_string() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ size_t prefix_len = 0;
+ if ( prefix != 0 )
+ prefix_len = string_size( prefix ) + 2;
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ if ( col->requested )
+ {
+ if ( nlt_is_name_in_namelist( names, col->name ) )
+ col->requested = false;
+ else
+ {
+ if ( prefix != NULL )
+ {
+ size_t len1 = string_size ( col->name ) + prefix_len;
+ char * s = malloc( len1 );
+ if ( s != NULL )
+ {
+ size_t num_writ;
+ rc_t rc1 = string_printf ( s, len1, &num_writ, "%s:%s", prefix, col->name );
+ if ( rc1 == 0 )
+ {
+ if ( nlt_is_name_in_namelist( names, s ) )
+ col->requested = false;
+ }
+ free( s );
+ }
+ }
+ }
+ }
+ }
+ }
+ KNamelistRelease( names );
+ }
+ return rc;
+}
+
+
+rc_t col_defs_as_string( col_defs* defs, char ** dst, bool only_requested )
+{
+ uint32_t idx, count, total = 0, dst_idx = 0;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( dst == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ *dst = NULL;
+ count = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < count; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ bool use_this = ( only_requested ) ? col->requested : true;
+ if ( use_this )
+ total += ( string_measure ( col->name, NULL ) + 1 );
+ }
+ }
+ *dst = malloc( total + 1 );
+ if ( *dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcResolving, rcMemory, rcExhausted );
+ *dst[0] = 0;
+ for ( idx = 0; idx < count; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ bool use_this = ( only_requested ) ? col->requested : true;
+ if ( use_this )
+ {
+ dst_idx += string_copy_measure ( &((*dst)[dst_idx]), total-dst_idx, col->name );
+ (*dst)[dst_idx++] = ',';
+ }
+ }
+ }
+ if ( dst_idx > 0 )
+ (*dst)[dst_idx-1] = 0;
+ return 0;
+}
+
+
+rc_t col_defs_apply_casts( col_defs* defs, const matcher * m )
+{
+ rc_t rc = 0;
+ uint32_t idx, count;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+
+ count = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ if ( m == NULL )
+ {
+ col->src_cast = string_dup_measure ( col->name, NULL );
+ col->dst_cast = string_dup_measure ( col->name, NULL );
+ }
+ else
+ {
+ rc = matcher_src_cast( m, col->name, &(col->src_cast) );
+ if ( rc == 0 )
+ rc = matcher_dst_cast( m, col->name, &(col->dst_cast) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t col_defs_find_redact_vals( col_defs* defs,
+ const redact_vals * rvals )
+{
+ uint32_t idx, count;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( rvals == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ count = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < count; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( col->to_copy )
+ col->r_val = redact_vals_get_by_cast( rvals, col->dst_cast );
+ }
+ return 0;
+}
+
+
+rc_t col_defs_mark_writable_columns( col_defs* defs, VTable *tab, bool show )
+{
+ KNamelist *writables;
+ rc_t rc;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( tab == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = VTableListWritableColumns ( tab, &writables );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < count; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ if ( col->requested )
+ if ( nlt_is_name_in_namelist( writables, col->name ) )
+ {
+ if ( show )
+ KOutMsg( "writable column: >%s<\n", col->name );
+ col->to_copy = true;
+ }
+ }
+ KNamelistRelease( writables );
+ }
+ return rc;
+}
+
+
+rc_t col_defs_mark_requested_columns( col_defs* defs, const char * columns )
+{
+ const KNamelist *requested;
+ rc_t rc;
+ uint32_t idx, len;
+
+ if ( defs == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+
+ if ( columns == NULL )
+ {
+ /* no specific columns are provided --> mark all of them */
+ len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ col->requested = true;
+ }
+ rc = 0;
+ }
+ else
+ {
+ /* specific columns are provided --> mark all of these */
+ rc = nlt_make_namelist_from_string( &requested, columns );
+ DISP_RC( rc, "col_defs_mark_requested_columns:nlt_make_namelist_from_string() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx, len = VectorLength( &(defs->cols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(defs->cols), idx );
+ if ( col != NULL )
+ col->requested = nlt_is_name_in_namelist( requested, col->name );
+ }
+ KNamelistRelease( requested );
+ }
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/coldefs.h b/tools/vdb-copy/coldefs.h
new file mode 100644
index 0000000..5313f18
--- /dev/null
+++ b/tools/vdb-copy/coldefs.h
@@ -0,0 +1,250 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_coldefs_
+#define _h_vdb_coldefs_
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifndef _h_type_matcher_
+#include "type_matcher.h"
+#endif
+
+#ifndef _h_vdb_redactval_
+#include "redactval.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/********************************************************************
+col-def is the definition of a single column: name/index/type
+********************************************************************/
+typedef struct col_def
+{
+ char *name;
+ uint32_t src_idx; /* index of this column relative to the
+ read-cursor */
+
+ uint32_t dst_idx; /* index of this column relative to the
+ write-cursor */
+
+ bool src_valid; /* this column was successfully addes to
+ the read-cursor */
+
+ bool requested; /* in case of no columns given to the commandline
+ all existing columns are marked as requested
+ ( even if not all of them can be copied,
+ they are filtered out later... )
+ if columns are given at the commandline
+ only these are marked as requested */
+
+ bool to_copy; /* this column has a correspondig column
+ in the list of writable columns of the
+ destination-schema with writable types */
+
+ bool redactable; /* this column is in the list of redactable
+ columns */
+
+ VTypedecl type_decl; /* type-decl of this column via read-schema */
+ VTypedesc type_desc; /* type-desc of this column via read-schema */
+
+ char * src_cast; /* typecast to be used by the source */
+ char * dst_cast; /* typecast to be used by the destination */
+
+ p_redact_val r_val; /* pointer to a redact-value entry if exists*/
+} col_def;
+typedef col_def* p_col_def;
+
+/********************************************************************
+the col-defs are a vector of single column-definitions
+********************************************************************/
+typedef struct col_defs
+{
+ Vector cols;
+ int32_t filter_idx; /* index of READ_FILTER-column (-1 not in set...)*/
+} col_defs;
+typedef col_defs* p_col_defs;
+
+
+/*
+ * initializes a column-definitions-list
+*/
+rc_t col_defs_init( col_defs** defs );
+
+
+/*
+ * destroys the column-definitions-list
+*/
+rc_t col_defs_destroy( col_defs* defs );
+
+
+/*
+ * calls VTableListCol to get a list of all column-names of the table
+ * creates a temporary read-cursor to test and get the column-type
+ * walks the KNamelist with the available column-names
+ * tries to add every one of them to the temp. cursor
+ * if the column can be added to the cursor, it is appended
+ * to the column-definition list, the type of the column is detected
+*/
+rc_t col_defs_extract_from_table( col_defs* defs, const VTable *table );
+
+
+/*
+ * walks the list of column-definitions and calls
+ * VTableColumnDatatypes() for every column, fills the types
+ * into the src-types-Vector of every column
+*/
+rc_t col_defs_read_src_types( col_defs* defs, const VTable *table,
+ const VSchema *schema );
+
+
+/*
+ * walks the list of column-definitions and calls
+ * VTableListWritableColumnTypes() for every column
+ * if the returned namelist is not empty, it marks the column as
+ * to be copied, and fills it's types into the dst-types-Vector
+ * of every column
+*/
+rc_t col_defs_read_dst_columns( col_defs* defs, const VTable *table,
+ const VSchema *schema );
+
+
+rc_t col_defs_clear_to_copy( col_defs* defs );
+
+
+/*
+ * walks the list of column-definitions and reports on every one
+*/
+rc_t col_defs_report( const col_defs* defs, const bool only_copy_columns );
+
+
+/*
+ * walks the list of column-definitions and tries to add all off them
+ * to the given cursor, it stops if one of them fails to be added
+ * for every column it detects type_decl and type_desc
+ * if both calls are successful the column-def is marked as valid
+*/
+rc_t col_defs_add_to_rd_cursor( col_defs* defs, const VCursor *cursor, bool show );
+
+
+/*
+ * retrieves a pointer to a column-definition
+ * name defines the name of the wanted column-definition
+*/
+p_col_def col_defs_find( col_defs* defs, const char * name );
+
+
+/*
+ * retrieves the index of a column-definition
+ * name defines the name of the wanted column-definition
+*/
+int32_t col_defs_find_idx( col_defs* defs, const char * name );
+
+
+/*
+ * retrieves a pointer to a column-definition
+ * idx defines the Vector-Index of the wanted column-definition
+ * !!! not the read or write cursor index !!!
+*/
+p_col_def col_defs_get( col_defs* defs, const uint32_t idx );
+
+
+/*
+ * adds all columns marked with to_copy == true to the cursor
+*/
+rc_t col_defs_add_to_wr_cursor( col_defs* defs, const VCursor* cursor, bool show );
+
+
+/*
+ * searches in the column-vector for a successful string-comparison
+ * with the hardcoded name of the filter-column
+ * stores it's vector-idx in defs->filter_idx
+ * does not require an open cursor.
+*/
+rc_t col_defs_detect_filter_col( col_defs* defs, const char *col_name );
+
+
+/*
+ * walks through the column-names and marks every column thats
+ * name is in "redactable_cols" as redactable
+ * sets the redact-value to zero
+ * if the default-type of the column is in the list of dna-types
+ * (a hardcoded list) it sets the redact-value to 'N'
+ * does not require an open cursor.
+*/
+rc_t col_defs_detect_redactable_cols_by_name( col_defs* defs,
+ const char * redactable_cols );
+
+rc_t col_defs_detect_redactable_cols_by_type( col_defs* defs,
+ const VSchema * s, const matcher * m,
+ const char * redactable_types );
+
+
+/*
+ * walks through the column-names and clear the redactable-flag
+ * for every column thats name is in "do_not_redact_cols"
+ * does not require an open cursor.
+*/
+rc_t col_defs_unmark_do_not_redact_columns( col_defs* defs,
+ const char * do_not_redact_cols );
+
+
+/*
+ * walks through the column-definitions and counts how
+ * many of them have the to-copy-flag
+ * does not require an open cursor.
+*/
+uint32_t col_defs_count_copy_cols( col_defs* defs );
+
+
+/*
+ * walks through the column-definitions and if a column
+ * has the to_copy-flag set, and it's name is in the
+ * given list of column-names the to copy-flag is cleared
+ * does not require an open cursor.
+*/
+rc_t col_defs_exclude_these_columns( col_defs* defs,
+ const char * prefix, const char * column_names );
+
+rc_t col_defs_as_string( col_defs* defs, char ** dst, bool only_requested );
+
+rc_t col_defs_apply_casts( col_defs* defs, const matcher * m );
+
+rc_t col_defs_find_redact_vals( col_defs* defs, const redact_vals * rvals );
+
+rc_t col_defs_mark_writable_columns( col_defs* defs, VTable *tab, bool show );
+
+rc_t col_defs_mark_requested_columns( col_defs* defs, const char * columns );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/column_match.c b/tools/vdb-copy/column_match.c
new file mode 100644
index 0000000..0e1d507
--- /dev/null
+++ b/tools/vdb-copy/column_match.c
@@ -0,0 +1,31 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "column_match.h"
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
diff --git a/tools/vdb-copy/column_match.h b/tools/vdb-copy/column_match.h
new file mode 100644
index 0000000..1b4eb8b
--- /dev/null
+++ b/tools/vdb-copy/column_match.h
@@ -0,0 +1,42 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_column_match_
+#define _h_column_match_
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/config_values.c b/tools/vdb-copy/config_values.c
new file mode 100644
index 0000000..cd68a95
--- /dev/null
+++ b/tools/vdb-copy/config_values.c
@@ -0,0 +1,54 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "config_values.h"
+
+#include <sysalloc.h>
+#include <string.h>
+#include <stdlib.h>
+
+static void config_values_destroy_str( char **s )
+{
+ if ( *s != NULL )
+ {
+ free( *s );
+ *s = NULL;
+ }
+}
+
+
+void config_values_init( p_config_values cv )
+{
+ memset( cv, 0, sizeof cv[0] );
+}
+
+
+void config_values_destroy( p_config_values cv )
+{
+ config_values_destroy_str( &cv->filter_col_name );
+ config_values_destroy_str( &cv->meta_ignore_nodes );
+ config_values_destroy_str( &cv->redactable_types );
+ config_values_destroy_str( &cv->do_not_redact_columns );
+}
diff --git a/tools/vdb-copy/config_values.h b/tools/vdb-copy/config_values.h
new file mode 100644
index 0000000..4d7a503
--- /dev/null
+++ b/tools/vdb-copy/config_values.h
@@ -0,0 +1,49 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_config_values_
+#define _h_config_values_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct config_values
+{
+ char * filter_col_name;
+ char * meta_ignore_nodes;
+ char * redactable_types;
+ char * do_not_redact_columns;
+} config_values;
+typedef config_values* p_config_values;
+
+void config_values_init( p_config_values cv );
+void config_values_destroy( p_config_values cv );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/context.c b/tools/vdb-copy/context.c
new file mode 100644
index 0000000..992bb41
--- /dev/null
+++ b/tools/vdb-copy/context.c
@@ -0,0 +1,473 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "context.h"
+#include <sysalloc.h>
+#include <stdlib.h>
+
+
+/*
+ * helper-function to set a string inside the context
+ * ( makes a copy ) with error detection
+*/
+static rc_t context_set_str( char **dst, const char *src )
+{
+ size_t len;
+ if ( dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ if ( *dst != NULL )
+ {
+ free( *dst );
+ *dst = NULL;
+ }
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ *dst = string_dup_measure ( src, &len );
+
+ if ( len == 0 )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcItem, rcEmpty );
+ if ( *dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcMemory, rcExhausted );
+ return 0;
+}
+
+
+/*
+ * helper-function to initialize the values of the context
+*/
+static void context_init_values( p_context ctx )
+{
+ ctx->src_path = NULL;
+ ctx->dst_path = NULL;
+ ctx->kfg_path = NULL;
+ ctx->table = NULL;
+ ctx->columns = NULL;
+ ctx->excluded_columns = NULL;
+ ctx->platform_id = 0;
+ ctx->src_schema_list = NULL;
+
+ ctx->usage_requested = false;
+ ctx->ignore_reject = false;
+ ctx->ignore_redact = false;
+ ctx->dont_check_accession = false;
+ ctx->reindex = false;
+ ctx->show_redact = false;
+ ctx->show_meta = false;
+ ctx->md5_mode = MD5_MODE_AUTO;
+ ctx->force_kcmInit = false;
+ ctx->force_unlock = false;
+
+ ctx->dont_remove_target = false;
+ config_values_init( &(ctx->config) );
+ redact_vals_init( &(ctx->rvals) );
+ ctx->dst_schema_tabname = NULL;
+ ctx->legacy_schema_file = NULL;
+ ctx->legacy_dont_copy = NULL;
+}
+
+
+/*
+ * generates a new context, initializes values
+*/
+rc_t context_init( context **ctx )
+{
+ rc_t rc;
+
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ (*ctx) = (p_context)calloc( 1, sizeof( context ) );
+ if ( *ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+
+ context_init_values( *ctx );
+ rc = num_gen_make( &((*ctx)->row_generator) );
+ DISP_RC( rc, "num_gen_make() failed" );
+ return rc;
+}
+
+
+/*
+ * destroys a context, frees all pointers the context owns
+*/
+rc_t context_destroy( p_context ctx )
+{
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcParam, rcNull );
+
+ if ( ctx->src_path != NULL )
+ {
+ free( (void*)ctx->src_path );
+ ctx->src_path = NULL;
+ }
+ if ( ctx->dst_path != NULL )
+ {
+ free( (void*)ctx->dst_path );
+ ctx->dst_path = NULL;
+ }
+ if ( ctx->kfg_path != NULL )
+ {
+ free( (void*)ctx->kfg_path );
+ ctx->kfg_path = NULL;
+ }
+ if ( ctx->src_schema_list != NULL )
+ {
+ KNamelistRelease( ctx->src_schema_list );
+ ctx->src_schema_list = NULL;
+ }
+ if ( ctx->table != NULL )
+ {
+ free( (void*)ctx->table );
+ ctx->table = NULL;
+ }
+ if ( ctx->columns != NULL )
+ {
+ free( (void*)ctx->columns );
+ ctx->columns = NULL;
+ }
+ if ( ctx->excluded_columns != NULL )
+ {
+ free( (void*)ctx->excluded_columns );
+ ctx->excluded_columns = NULL;
+ }
+
+ num_gen_destroy( ctx->row_generator );
+ config_values_destroy( &( ctx->config ) );
+ redact_vals_destroy( ctx->rvals );
+
+ if ( ctx->dst_schema_tabname != NULL )
+ {
+ free( (void*)ctx->dst_schema_tabname );
+ ctx->dst_schema_tabname = NULL;
+ }
+ if ( ctx->legacy_schema_file != NULL )
+ {
+ free( (void*)ctx->legacy_schema_file );
+ ctx->legacy_schema_file = NULL;
+ }
+ if ( ctx->legacy_dont_copy != NULL )
+ {
+ free( (void*)ctx->legacy_dont_copy );
+ ctx->legacy_dont_copy = NULL;
+ }
+
+ free( ctx );
+ return 0;
+}
+
+
+/*
+ * clear's the number-generator and sets the given intervall
+*/
+rc_t context_set_range( p_context ctx,
+ const int64_t first, const uint64_t count )
+{
+ rc_t rc = num_gen_clear( ctx->row_generator );
+ if ( rc == 0 )
+ rc = num_gen_add( ctx->row_generator, first, count );
+ return rc;
+}
+
+
+/*
+ * performs the range check to trim the internal number
+ * generator to the given range
+*/
+rc_t context_range_check( p_context ctx,
+ const int64_t first, const uint64_t count )
+{
+ return num_gen_range_check( ctx->row_generator, first, count );
+}
+
+
+/*
+ * helper-function to set the source-path
+*/
+static rc_t context_set_src_path( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->src_path), src );
+}
+
+
+/*
+ * helper-function to set the destination-path
+*/
+static rc_t context_set_dst_path( p_context ctx, const char *src )
+{
+ return context_set_str( (char**)&(ctx->dst_path), src );
+}
+
+
+/*
+ * helper-function to set the path for additional kfg-files
+*/
+static rc_t context_set_kfg_path( p_context ctx, const char *src )
+{
+ rc_t rc = context_set_str( (char**)&(ctx->kfg_path), src );
+ if ( ctx->kfg_path == NULL )
+ context_set_kfg_path( ctx, "." );
+ return rc;
+}
+
+
+/*
+ * helper-function to set the name of the source-table
+*/
+static rc_t context_set_table( p_context ctx, const char *src )
+{
+ rc_t rc;
+ if ( ctx == NULL || src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ rc = context_set_str( (char**)&(ctx->table), src );
+ DISP_RC( rc, "context_set_table:context_set_str() failed" );
+ return rc;
+}
+
+#if ALLOW_COLUMN_SPEC
+static rc_t context_set_columns( p_context ctx, const char *src )
+{
+ rc_t rc;
+ if ( ctx == NULL || src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ rc = context_set_str( (char**)&(ctx->columns), src );
+ DISP_RC( rc, "context_set_columns:dump_context_set_str() failed" );
+ return rc;
+}
+#endif
+
+static rc_t context_set_excluded_columns( p_context ctx, const char *src )
+{
+ rc_t rc;
+ if ( ctx == NULL || src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ rc = context_set_str( (char**)&(ctx->excluded_columns), src );
+ DISP_RC( rc, "context_set_excluded_columns:dump_context_set_str() failed" );
+ return rc;
+}
+
+
+static rc_t context_set_md5_mode( p_context ctx, const char *src )
+{
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ ctx->md5_mode = MD5_MODE_AUTO;
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ switch( src[ 0 ] )
+ {
+ case 'O' :
+ case '1' :
+ case 'o' : ctx->md5_mode = MD5_MODE_ON; break;
+
+ case '0' :
+ case 'x' :
+ case 'X' : ctx->md5_mode = MD5_MODE_OFF; break;
+ }
+ return 0;
+}
+
+
+static rc_t context_set_blob_checksum( p_context ctx, const char *src )
+{
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ ctx->blob_checksum = BLOB_CHECKSUM_AUTO;
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ switch( src[ 0 ] )
+ {
+ case 'O' :
+ case '1' :
+ case 'o' : ctx->blob_checksum = BLOB_CHECKSUM_CRC32; break;
+
+ case '5' :
+ case 'M' :
+ case 'm' : ctx->blob_checksum = BLOB_CHECKSUM_MD5; break;
+
+ case '0' :
+ case 'x' :
+ case 'X' : ctx->blob_checksum = BLOB_CHECKSUM_OFF; break;
+ }
+ return 0;
+}
+
+
+static rc_t context_set_row_range( p_context ctx, const char *src )
+{
+ rc_t rc;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ else
+ rc = num_gen_parse( ctx->row_generator, src );
+ return rc;
+}
+
+
+static bool context_check_if_usage_necessary( p_context ctx )
+{
+ if ( ctx == NULL ) return false;
+ if ( ctx->src_path == NULL || ctx->dst_path == NULL )
+ ctx->usage_requested = true;
+ return ctx->usage_requested;
+}
+
+
+static rc_t context_evaluate_arguments( const Args *my_args, p_context ctx )
+{
+ uint32_t count, idx;
+
+ rc_t rc = ArgsParamCount( my_args, &count );
+ DISP_RC( rc, "ArgsParamCount() failed" );
+ if ( rc != 0 ) return rc;
+
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *value = NULL;
+ rc = ArgsParamValue( my_args, idx, (const void **)&value );
+ DISP_RC( rc, "ArgsParamValue() failed" );
+ if ( rc == 0 )
+ {
+ switch( idx )
+ {
+ case 0 : rc = context_set_src_path( ctx, value );
+ DISP_RC( rc, "context_set_src_path() failed" );
+ break;
+
+ case 1 : rc = context_set_dst_path( ctx, value );
+ DISP_RC( rc, "context_set_dst_path() failed" );
+ break;
+
+ }
+ }
+ }
+ return rc;
+}
+
+
+static bool context_get_bool_option( const Args *my_args,
+ const char *name,
+ const bool def )
+{
+ bool res = def;
+ uint32_t count = 0;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( rc == 0 && count > 0 )
+ res = true;
+ return res;
+}
+
+
+static const char* context_get_str_option( const Args *my_args,
+ const char *name )
+{
+ const char* res = NULL;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&res );
+ }
+ return res;
+}
+
+
+/*
+ * returns the number of schema's given on the commandline
+*/
+uint32_t context_schema_count( p_context ctx )
+{
+ uint32_t res = 0;
+ if ( ctx != NULL )
+ if ( ctx->src_schema_list != 0 )
+ {
+ uint32_t count;
+ if ( KNamelistCount( ctx->src_schema_list, &count ) == 0 )
+ res = count;
+ }
+ return res;
+}
+
+
+static void context_evaluate_options( const Args *my_args, p_context ctx )
+{
+ if ( my_args == NULL ) return;
+ if ( ctx == NULL ) return;
+
+ ctx->dont_check_accession = context_get_bool_option( my_args, OPTION_WITHOUT_ACCESSION, false );
+ ctx->ignore_reject = context_get_bool_option( my_args, OPTION_IGNORE_REJECT, true );
+ ctx->ignore_redact = context_get_bool_option( my_args, OPTION_IGNORE_REDACT, false );
+ ctx->show_matching = context_get_bool_option( my_args, OPTION_SHOW_MATCHING, false );
+ ctx->show_progress = context_get_bool_option( my_args, OPTION_SHOW_PROGRESS, false );
+ ctx->ignore_incomp = context_get_bool_option( my_args, OPTION_IGNORE_INCOMP, false );
+ ctx->reindex = context_get_bool_option( my_args, OPTION_REINDEX, true );
+ ctx->show_redact = context_get_bool_option( my_args, OPTION_SHOW_REDACT, false );
+ ctx->show_meta = context_get_bool_option( my_args, OPTION_SHOW_META, false );
+ ctx->force_kcmInit = context_get_bool_option( my_args, OPTION_FORCE, false );
+ ctx->force_unlock = context_get_bool_option( my_args, OPTION_UNLOCK, false );
+
+ context_set_md5_mode( ctx, context_get_str_option( my_args, OPTION_MD5_MODE ) );
+ context_set_blob_checksum( ctx, context_get_str_option( my_args, OPTION_BLOB_CHECKSUM ) );
+
+#if ALLOW_EXTERNAL_CONFIG
+ context_set_kfg_path( ctx, context_get_str_option( my_args, OPTION_KFG_PATH ) );
+#endif
+
+ context_set_table( ctx, context_get_str_option( my_args, OPTION_TABLE ) );
+#if ALLOW_COLUMN_SPEC
+ context_set_columns( ctx, context_get_str_option( my_args, OPTION_COLUMNS ) );
+#endif
+ context_set_excluded_columns( ctx, context_get_str_option( my_args, OPTION_EXCLUDED_COLUMNS ) );
+
+ {
+ const char * row_range = context_get_str_option( my_args, OPTION_ROWS );
+ context_set_row_range( ctx, row_range );
+ }
+ nlt_make_namelist_from_string( &(ctx->src_schema_list),
+ context_get_str_option( my_args, OPTION_SCHEMA ) );
+}
+
+
+/*
+ * reads all arguments and options, fills the context
+ * with copies (if strings) of this data
+*/
+rc_t context_capture_arguments_and_options( const Args * args, p_context ctx )
+{
+ rc_t rc;
+
+ rc = context_evaluate_arguments( args, ctx );
+ DISP_RC( rc, "evaluate_arguments() failed" );
+ if ( rc == 0 )
+ {
+ context_evaluate_options( args, ctx );
+ context_check_if_usage_necessary( ctx );
+
+ rc = ArgsHandleLogLevel( args );
+ DISP_RC( rc, "ArgsHandleLogLevel() failed" );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/context.h b/tools/vdb-copy/context.h
new file mode 100644
index 0000000..2ca14ea
--- /dev/null
+++ b/tools/vdb-copy/context.h
@@ -0,0 +1,183 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_context_
+#define _h_context_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifndef _h_config_values_
+#include "config_values.h"
+#endif
+
+#ifndef _h_vdb_redactval_
+#include "redactval.h"
+#endif
+
+#include <klib/num-gen.h>
+
+#include <kapp/args.h>
+#include "definitions.h"
+
+#define OPTION_TABLE "table"
+#define OPTION_ROWS "rows"
+#define OPTION_COLUMNS "columns"
+#define OPTION_SCHEMA "schema"
+#define OPTION_WITHOUT_ACCESSION "without_accession"
+#define OPTION_IGNORE_REJECT "ignore_reject"
+#define OPTION_IGNORE_REDACT "ignore_redact"
+
+#if ALLOW_EXTERNAL_CONFIG
+#define OPTION_KFG_PATH "kfg_path"
+#endif
+
+#define OPTION_SHOW_MATCHING "show_matching"
+#define OPTION_SHOW_PROGRESS "show_progress"
+#define OPTION_IGNORE_INCOMP "ignore_incompatible_columns"
+#define OPTION_REINDEX "reindex"
+#define OPTION_SHOW_REDACT "show_redact"
+#define OPTION_EXCLUDED_COLUMNS "exclude_columns"
+#define OPTION_SHOW_META "show_meta"
+#define OPTION_MD5_MODE "md5mode"
+#define OPTION_FORCE "force"
+#define OPTION_UNLOCK "unlock"
+#define OPTION_BLOB_CHECKSUM "blob_checksum"
+
+
+#define ALIAS_TABLE "T"
+#define ALIAS_ROWS "R"
+#define ALIAS_COLUMNS "C"
+#define ALIAS_SCHEMA "S"
+#define ALIAS_WITHOUT_ACCESSION "a"
+#define ALIAS_IGNORE_REJECT "r"
+#define ALIAS_IGNORE_REDACT "e"
+
+#if ALLOW_EXTERNAL_CONFIG
+#define ALIAS_KFG_PATH "k"
+#endif
+
+#define ALIAS_SHOW_MATCHING "m"
+#define ALIAS_SHOW_PROGRESS "p"
+#define ALIAS_IGNORE_INCOMP "i"
+#define ALIAS_REINDEX "n"
+#define ALIAS_SHOW_REDACT "w"
+#define ALIAS_EXCLUDED_COLUMNS "x"
+#define ALIAS_SHOW_META "t"
+#define ALIAS_MD5_MODE "d"
+#define ALIAS_FORCE "f"
+#define ALIAS_UNLOCK "u"
+#define ALIAS_BLOB_CHECKSUM "b"
+
+
+/* *******************************************************************
+the dump context contains all informations needed to execute the dump
+******************************************************************* */
+typedef struct context
+{
+ /* read from commandline */
+ char *src_path;
+ char *dst_path;
+ const char *kfg_path;
+ const KNamelist *src_schema_list;
+ const char *table;
+ const char *columns;
+ const char *excluded_columns;
+ struct num_gen * row_generator;
+ bool usage_requested;
+ bool dont_check_accession;
+ uint64_t platform_id;
+ bool ignore_reject;
+ bool ignore_redact;
+ bool show_matching;
+ bool show_progress;
+ bool ignore_incomp;
+ bool reindex;
+ bool show_redact;
+ bool show_meta;
+ uint8_t md5_mode;
+ uint8_t blob_checksum;
+ bool force_kcmInit;
+ bool force_unlock;
+
+ /* set by application */
+ bool dont_remove_target;
+ config_values config;
+ redact_vals * rvals;
+ /* for the destination table*/
+ char * dst_schema_tabname;
+ /* legacy related parameters */
+ char * legacy_schema_file;
+ char * legacy_dont_copy;
+} context;
+typedef context* p_context;
+
+
+/*
+ * generates a new context, initializes values
+*/
+rc_t context_init( context **ctx );
+
+
+/*
+ * destroys a context, frees all pointers the context owns
+*/
+rc_t context_destroy( p_context ctx );
+
+
+/*
+ * performs the range check to trim the internal number
+ * generator to the given range
+*/
+rc_t context_range_check( p_context ctx,
+ const int64_t first, const uint64_t count );
+
+
+rc_t context_set_range( p_context ctx,
+ const int64_t first, const uint64_t count );
+
+/*
+ * returns the number of schema's given on the commandline
+*/
+uint32_t context_schema_count( p_context ctx );
+
+
+/*
+ * reads all arguments and options, fills the context
+ * with copies (if strings) of this data
+*/
+rc_t context_capture_arguments_and_options( const Args * args, p_context ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/copy_context.c b/tools/vdb-copy/copy_context.c
new file mode 100644
index 0000000..992d514
--- /dev/null
+++ b/tools/vdb-copy/copy_context.c
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "copy_context.h"
+
+#include <sysalloc.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+rc_t cctx_init( p_copy_ctx cctx )
+{
+ return 0;
+}
+
+
+void cctx_destroy( p_copy_ctx cctx )
+{
+ /* ********** destination stuff in reverse order... */
+ /*
+ cctx_destroy_str( &cctx->legacy_dont_copy );
+ cctx_destroy_str( &cctx->legacy_schema_file );
+ cctx_destroy_str( &cctx->dst_schema_tabname );
+ */
+}
diff --git a/tools/vdb-copy/copy_context.h b/tools/vdb-copy/copy_context.h
new file mode 100644
index 0000000..71e491a
--- /dev/null
+++ b/tools/vdb-copy/copy_context.h
@@ -0,0 +1,58 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_copy_context_
+#define _h_vdb_copy_context_
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifndef _h_definitions_
+#include "definitions.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* ----------------------------------------------------------------------------------- */
+typedef struct copy_ctx
+{
+ char * ptr;
+} copy_ctx;
+typedef copy_ctx* p_copy_ctx;
+
+
+rc_t cctx_init( p_copy_ctx cctx );
+void cctx_destroy( p_copy_ctx cctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/copy_meta.c b/tools/vdb-copy/copy_meta.c
new file mode 100644
index 0000000..9b556d8
--- /dev/null
+++ b/tools/vdb-copy/copy_meta.c
@@ -0,0 +1,518 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-copy-includes.h"
+#include "definitions.h"
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/time.h>
+#include <kapp/main.h> /* for KAppVersion()*/
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include <assert.h>
+
+static rc_t copy_metadata_data ( const KMDataNode *snode, KMDataNode *dnode )
+{
+ char buffer [ 1024 ];
+ size_t total, bytes, remaining;
+ /* copy node data unless already set */
+ rc_t rc = KMDataNodeRead ( dnode, 0, buffer, 0, & bytes, & total );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeRead(dst) failed" );
+ if ( rc == 0 && total == 0 )
+ do
+ {
+ rc = KMDataNodeRead ( snode, total, buffer, sizeof buffer, & bytes, & remaining );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeRead(src) failed" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeAppend ( dnode, buffer, bytes );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeAppend(dst) failed" );
+ if ( rc != 0 ) break;
+ }
+ total += bytes;
+ } while ( remaining != 0 );
+ return rc;
+}
+
+
+static rc_t copy_metadata_attribs ( const KMDataNode *snode, KMDataNode *dnode,
+ const char *node_path, const bool show_meta )
+{
+ KNamelist *attrs;
+ uint32_t i, count;
+ rc_t rc = KMDataNodeListAttr ( snode, & attrs );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeListAttr(src) failed" );
+ if ( rc != 0 ) return rc;
+ rc = KNamelistCount ( attrs, & count );
+ for ( i = 0; rc == 0 && i < count; ++ i )
+ {
+ const char *attr;
+ rc = KNamelistGet ( attrs, i, & attr );
+ if ( rc == 0 )
+ {
+ char buffer [ 1024 ];
+ size_t bytes;
+ /* test for attr existence */
+ rc = KMDataNodeReadAttr ( dnode, attr, buffer, sizeof buffer, & bytes );
+ if ( rc != 0 )
+ {
+ rc = KMDataNodeReadAttr ( snode, attr, buffer, sizeof buffer, & bytes );
+ if ( rc == 0 )
+ {
+ if ( show_meta )
+ KOutMsg( "copy atr %s : %s\n", node_path, attr );
+ rc = KMDataNodeWriteAttr ( dnode, attr, buffer );
+ }
+ }
+ }
+ DISP_RC( rc, "copy_metadata_child:failed to copy attribute" );
+ }
+ KNamelistRelease ( attrs );
+ return rc;
+}
+
+
+static rc_t copy_metadata_child ( const KMDataNode *src_root, KMDataNode *dst_root,
+ const char *node_path, const bool show_meta )
+{
+ const KMDataNode *snode;
+ KMDataNode *dnode;
+ KNamelist *names;
+
+ rc_t rc = KMDataNodeOpenNodeRead ( src_root, & snode, "%s", node_path );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeOpenNodeRead(src) failed" );
+ if ( rc != 0 ) return rc;
+
+ if ( show_meta )
+ KOutMsg( "copy child-node: %s\n", node_path );
+
+ rc = KMDataNodeOpenNodeUpdate ( dst_root, & dnode, "%s", node_path );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeOpenNodeUpdate(dst) failed" );
+ if ( rc == 0 )
+ {
+ rc = copy_metadata_data ( snode, dnode );
+ if ( rc == 0 )
+ rc = copy_metadata_attribs ( snode, dnode, node_path, show_meta );
+ KMDataNodeRelease ( dnode );
+ }
+ else
+ {
+ PLOGMSG( klogInfo, ( klogInfo,
+ "cannot open child-node(dst): $(node)", "node=%s", node_path ));
+ }
+
+ if ( rc == 0 || ( GetRCState( rc ) == rcBusy ) )
+ {
+ rc = KMDataNodeListChild ( snode, & names );
+ DISP_RC( rc, "copy_metadata_child:KMDataNodeListChild(src) failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i, count;
+ char temp_path[ 1024 ];
+ size_t temp_len;
+
+ string_copy ( temp_path, ( sizeof temp_path ) - 1, node_path, string_size( node_path ) );
+ temp_len = string_size( temp_path );
+ temp_path[ temp_len++ ] = '/';
+ temp_path[ temp_len ] = 0;
+ rc = KNamelistCount ( names, & count );
+ for ( i = 0; rc == 0 && i < count; ++ i )
+ {
+ const char *child_name;
+ rc = KNamelistGet ( names, i, & child_name );
+ if ( rc == 0 )
+ {
+ string_copy( temp_path + temp_len, ( sizeof temp_path ) - temp_len, child_name, string_size( child_name ) );
+ rc = copy_metadata_child ( src_root, dst_root, temp_path, show_meta );
+ temp_path[ temp_len ] = 0;
+ }
+ }
+ KNamelistRelease ( names );
+ }
+ }
+
+ KMDataNodeRelease ( snode );
+ return rc;
+}
+
+
+static rc_t copy_metadata_root ( const KMDataNode *src_root, KMDataNode *dst_root,
+ const char * excluded_nodes,
+ const bool show_meta )
+{
+ KNamelist *names;
+ const KNamelist *excluded_names = NULL;
+ uint32_t i, count;
+
+ rc_t rc = KMDataNodeListChild ( src_root, & names );
+ DISP_RC( rc, "copy_metadata_root:KMDataNodeListChild() failed" );
+ if ( rc != 0 ) return rc;
+
+ if ( excluded_nodes != NULL )
+ {
+ rc = nlt_make_namelist_from_string( &excluded_names, excluded_nodes );
+ DISP_RC( rc, "copy_metadata_root:nlt_make_namelist_from_string() failed" );
+ if ( rc != 0 ) return rc;
+ }
+
+ rc = KNamelistCount ( names, & count );
+ for ( i = 0; rc == 0 && i < count; ++ i )
+ {
+ const char *node_path;
+ rc = KNamelistGet ( names, i, & node_path );
+ DISP_RC( rc, "copy_metadata_root:KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ bool is_excluded = false;
+ if ( excluded_names != NULL )
+ is_excluded = nlt_is_name_in_namelist( excluded_names, node_path );
+ if ( !is_excluded )
+ rc = copy_metadata_child ( src_root, dst_root, node_path, show_meta );
+ }
+ }
+
+ if ( excluded_names != NULL )
+ KNamelistRelease( excluded_names );
+ KNamelistRelease ( names );
+ return rc;
+}
+
+
+static rc_t copy_stray_metadata ( const KMetadata *src_meta, KMetadata *dst_meta,
+ const char * excluded_nodes,
+ const bool show_meta )
+{
+ /* open root node */
+ const KMDataNode *src_root;
+ rc_t rc = KMetadataOpenNodeRead ( src_meta, & src_root, NULL );
+ DISP_RC( rc, "copy_stray_metadata:KMetadataOpenNodeRead() failed" );
+ if ( rc == 0 )
+ {
+ KMDataNode *dst_root;
+ rc = KMetadataOpenNodeUpdate ( dst_meta, & dst_root, NULL );
+ DISP_RC( rc, "copy_stray_metadata:KMetadataOpenNodeUpdate() failed" );
+ if ( rc == 0 )
+ {
+ /* treat the root node in a special way */
+ rc = copy_metadata_root ( src_root, dst_root, excluded_nodes, show_meta );
+ KMDataNodeRelease ( dst_root );
+ }
+ KMDataNodeRelease ( src_root );
+ }
+ return rc;
+}
+
+#if 0
+static rc_t drop_all( KMetadata *dst_meta )
+{
+ KMDataNode *dst_node;
+ rc_t rc = KMetadataOpenNodeUpdate ( dst_meta, & dst_node, NULL );
+ DISP_RC( rc, "drop_all:KMetadataOpenNodeUpdate() failed" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeDropAll ( dst_node );
+ DISP_RC( rc, "drop_all:KMetadataDropAll() failed" );
+ KMDataNodeRelease ( dst_node );
+ }
+ return rc;
+}
+#endif
+
+static rc_t copy_back_revisions ( const KMetadata *src_meta, VTable *dst_table,
+ const bool show_meta )
+{
+ uint32_t max_revision, revision;
+
+ rc_t rc = KMetadataMaxRevision ( src_meta, &max_revision );
+ DISP_RC( rc, "copy_back_revisions:KMetadataMaxRevision() failed" );
+ if ( rc != 0 ) return rc;
+ if ( max_revision == 0 ) return rc;
+ for ( revision = 1; revision <= max_revision && rc == 0; ++revision )
+ {
+ const KMetadata *src_rev_meta;
+
+ if ( show_meta )
+ KOutMsg( "+++copy metadata rev. #%u:\n", revision );
+ rc = KMetadataOpenRevision ( src_meta, &src_rev_meta, revision );
+ DISP_RC( rc, "copy_back_revisions:KMetadataOpenRevision() failed" );
+ if ( rc == 0 )
+ {
+ KMetadata *dst_meta;
+ rc = VTableOpenMetadataUpdate ( dst_table, & dst_meta );
+ DISP_RC( rc, "copy_table_meta:VTableOpenMetadataUpdate() failed" );
+ if ( rc == 0 )
+ {
+ rc = copy_stray_metadata ( src_rev_meta, dst_meta, NULL, show_meta );
+ if ( rc == 0 )
+ {
+ rc = KMetadataCommit ( dst_meta );
+ DISP_RC( rc, "copy_back_revisions:KMetadataCommit() failed" );
+ if ( rc == 0 )
+ {
+ rc = KMetadataFreeze ( dst_meta );
+ DISP_RC( rc, "copy_back_revisions:KMetadataFreeze() failed" );
+ }
+ }
+ KMetadataRelease ( dst_meta );
+ }
+
+ KMetadataRelease ( src_rev_meta );
+ }
+ }
+ return rc;
+}
+
+static rc_t fill_timestring( char * s, size_t size )
+{
+ KTime tr;
+ rc_t rc;
+
+ KTimeLocal ( &tr, KTimeStamp() );
+/*
+ rc = string_printf ( s, size, NULL,
+ "%.04u-%.02u-%.02u %.02u:%.02u:%.02u",
+ tr.year, tr.month + 1, tr.day, tr.hour, tr.minute, tr.second );
+*/
+ rc = string_printf ( s, size, NULL, "%lT", &tr );
+
+ DISP_RC( rc, "fill_timestring:string_printf( date/time ) failed" );
+ return rc;
+}
+
+static rc_t enter_time( KMDataNode *node, const char * key )
+{
+ char timestring[ 160 ];
+ rc_t rc = fill_timestring( timestring, sizeof timestring );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeWriteAttr ( node, key, timestring );
+ DISP_RC( rc, "enter_time:KMDataNodeWriteAttr( timestring ) failed" );
+ }
+ return rc;
+}
+
+
+static rc_t enter_version( KMDataNode *node, const char * key )
+{
+ char buff[ 32 ];
+ rc_t rc;
+
+ rc = string_printf ( buff, sizeof( buff ), NULL, "%.3V", KAppVersion() );
+ assert ( rc == 0 );
+ rc = KMDataNodeWriteAttr ( node, key, buff );
+ DISP_RC( rc, "enter_version:KMDataNodeWriteAttr() failed" );
+ return rc;
+}
+
+
+static rc_t enter_date_name_vers( KMDataNode *node )
+{
+ rc_t rc = enter_time( node, "run" );
+ DISP_RC( rc, "enter_date_name_vers:enter_time() failed" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeWriteAttr ( node, "tool", "vdb-copy" );
+ DISP_RC( rc, "enter_date_name_vers:KMDataNodeWriteAttr(tool=vdb-copy) failed" );
+ if ( rc == 0 )
+ {
+ rc = enter_version ( node, "vers" );
+ DISP_RC( rc, "enter_date_name_vers:enter_version() failed" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeWriteAttr ( node, "build", __DATE__ );
+ DISP_RC( rc, "enter_date_name_vers:KMDataNodeWriteAttr(build=_DATE_) failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t enter_schema_update( KMetadata *dst_meta, const bool show_meta )
+{
+ rc_t rc;
+ KMDataNode *sw_node;
+
+ if ( show_meta )
+ KOutMsg( "--- entering schema-update\n" );
+
+ rc = KMetadataOpenNodeUpdate ( dst_meta, &sw_node, "SOFTWARE" );
+ DISP_RC( rc, "enter_schema_update:KMetadataOpenNodeUpdate('SOFTWARE') failed" );
+ if ( rc == 0 )
+ {
+ KMDataNode *update_node;
+ rc = KMDataNodeOpenNodeUpdate ( sw_node, &update_node, "update" );
+ DISP_RC( rc, "enter_schema_update:KMDataNodeOpenNodeUpdate('update') failed" );
+ if ( rc == 0 )
+ {
+ rc = enter_date_name_vers( update_node );
+ KMDataNodeRelease ( update_node );
+ }
+ KMDataNodeRelease ( sw_node );
+ }
+ return rc;
+}
+
+
+static uint32_t get_child_count( KMDataNode *node )
+{
+ uint32_t res = 0;
+ KNamelist *names;
+ rc_t rc = KMDataNodeListChild ( node, &names );
+ DISP_RC( rc, "get_child_count:KMDataNodeListChild() failed" );
+ if ( rc == 0 )
+ {
+ rc = KNamelistCount ( names, &res );
+ DISP_RC( rc, "get_child_count:KNamelistCount() failed" );
+ KNamelistRelease ( names );
+ }
+ return res;
+}
+
+
+static rc_t enter_vdbcopy_node( KMetadata *dst_meta, const bool show_meta )
+{
+ rc_t rc;
+ KMDataNode *hist_node;
+
+ if ( show_meta )
+ KOutMsg( "--- entering Copy entry...\n" );
+
+ rc = KMetadataOpenNodeUpdate ( dst_meta, &hist_node, "HISTORY" );
+ DISP_RC( rc, "enter_vdbcopy_node:KMetadataOpenNodeUpdate('HISTORY') failed" );
+ if ( rc == 0 )
+ {
+ char event_name[ 32 ];
+ uint32_t index = get_child_count( hist_node ) + 1;
+ rc = string_printf ( event_name, sizeof( event_name ), NULL, "EVENT_%u", index );
+ DISP_RC( rc, "enter_vdbcopy_node:string_printf(EVENT_NR) failed" );
+ if ( rc == 0 )
+ {
+ KMDataNode *event_node;
+ rc = KMDataNodeOpenNodeUpdate ( hist_node, &event_node, "%s", event_name );
+ DISP_RC( rc, "enter_vdbcopy_node:KMDataNodeOpenNodeUpdate('EVENT_NR') failed" );
+ if ( rc == 0 )
+ {
+ rc = enter_date_name_vers( event_node );
+ KMDataNodeRelease ( event_node );
+ }
+ }
+ KMDataNodeRelease ( hist_node );
+ }
+ return rc;
+}
+
+
+rc_t copy_table_meta ( const VTable *src_table, VTable *dst_table,
+ const char * excluded_nodes,
+ const bool show_meta, const bool schema_updated )
+{
+ const KMetadata *src_meta;
+ rc_t rc;
+
+ if ( src_table == NULL || dst_table == NULL )
+ return RC( rcExe, rcNoTarg, rcCopying, rcParam, rcNull );
+ /* it is OK if excluded_nodes is NULL */
+
+ rc = VTableOpenMetadataRead ( src_table, & src_meta );
+ DISP_RC( rc, "copy_table_meta:VTableOpenMetadataRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = copy_back_revisions ( src_meta, dst_table, show_meta );
+ if ( rc == 0 )
+ {
+ KMetadata *dst_meta;
+ rc = VTableOpenMetadataUpdate ( dst_table, & dst_meta );
+ DISP_RC( rc, "copy_table_meta:VTableOpenMetadataUpdate() failed" );
+ if ( rc == 0 )
+ {
+ if ( show_meta )
+ KOutMsg( "+++copy current metadata\n" );
+
+ rc = copy_stray_metadata ( src_meta, dst_meta, excluded_nodes,
+ show_meta );
+ if ( show_meta )
+ KOutMsg( "+++end of copy current metadata\n" );
+
+ /* enter a attribute "vdb-copy" under '/SOFTWARE/update'
+ *if the schema was updated ! */
+ if ( rc == 0 && schema_updated )
+ rc = enter_schema_update( dst_meta, show_meta );
+
+ /* enter a unconditional node under '/SOFTWARE/Copy'
+ <%TIMESTAMP%>
+ <Application date="%DATE%" name="vdb-copy" vers="%VERSION%"/>
+ </%TIMESTAMP%>
+ */
+ if ( rc == 0 )
+ rc = enter_vdbcopy_node( dst_meta, show_meta );
+
+ KMetadataRelease ( dst_meta );
+ }
+ }
+ KMetadataRelease ( src_meta );
+ }
+ return rc;
+}
+
+
+rc_t copy_database_meta ( const VDatabase *src_db, VDatabase *dst_db,
+ const char * excluded_nodes,
+ const bool show_meta )
+{
+ const KMetadata *src_meta;
+ rc_t rc;
+
+ if ( src_db == NULL || dst_db == NULL )
+ return RC( rcExe, rcNoTarg, rcCopying, rcParam, rcNull );
+ /* it is OK if excluded_nodes is NULL */
+
+ rc = VDatabaseOpenMetadataRead ( src_db, & src_meta );
+ DISP_RC( rc, "copy_database_meta:VDatabaseOpenMetadataRead() failed" );
+ if ( rc == 0 )
+ {
+ KMetadata *dst_meta;
+ rc = VDatabaseOpenMetadataUpdate ( dst_db, & dst_meta );
+ DISP_RC( rc, "copy_database_meta:VDatabaseOpenMetadataUpdate() failed" );
+ if ( rc == 0 )
+ {
+ if ( show_meta )
+ KOutMsg( "+++copy current db-metadata\n" );
+
+ rc = copy_stray_metadata ( src_meta, dst_meta, excluded_nodes,
+ show_meta );
+ if ( show_meta )
+ KOutMsg( "+++end of copy db-current metadata\n" );
+
+ KMetadataRelease ( dst_meta );
+ }
+ KMetadataRelease ( src_meta );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/copy_meta.h b/tools/vdb-copy/copy_meta.h
new file mode 100644
index 0000000..0248c20
--- /dev/null
+++ b/tools/vdb-copy/copy_meta.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_copy_meta_
+#define _h_copy_meta_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t copy_table_meta ( const VTable *src_table, VTable *dst_table,
+ const char * excluded_nodes,
+ const bool show_meta, const bool schema_updated );
+
+rc_t copy_database_meta ( const VDatabase *src_db, VDatabase *dst_db,
+ const char * excluded_nodes,
+ const bool show_meta );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/definitions.h b/tools/vdb-copy/definitions.h
new file mode 100644
index 0000000..de539df
--- /dev/null
+++ b/tools/vdb-copy/definitions.h
@@ -0,0 +1,112 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_definitions_
+#define _h_definitions_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_out_
+#include <klib/out.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_num_gen_
+#include <klib/num-gen.h>
+#endif
+
+#define DISP_RC(rc,err) (void)((rc == 0) ? 0 : LogErr( klogInt, rc, err ))
+
+#define DISP_RC2(rc,err,succ) \
+ (void)((rc != 0)? 0 : (succ) ? LOGMSG( klogInfo, succ ) : LogErr( klogInt, rc, err ))
+
+#define DB_COPY_ENABLED 1
+
+#define ALLOW_EXTERNAL_CONFIG 1
+
+#define SRA_PF_UNDEF 0
+#define SRA_PF_454 1
+#define SRA_PF_ILLUMINA 2
+#define SRA_PF_ABSOLID 3
+#define SRA_PF_COMPLETE_GENOMICS 4
+#define SRA_PF_HELICOS 5
+#define SRA_PF_UNKNOWN 6
+
+#define SRA_READ_FILTER_PASS 0
+#define SRA_READ_FILTER_REJECT 1
+#define SRA_READ_FILTER_CRITERIA 2
+#define SRA_READ_FILTER_REDACTED 3
+
+#define MD5_MODE_OFF 1
+#define MD5_MODE_ON 2
+#define MD5_MODE_AUTO 3
+
+#define BLOB_CHECKSUM_OFF 1
+#define BLOB_CHECKSUM_CRC32 2
+#define BLOB_CHECKSUM_MD5 3
+#define BLOB_CHECKSUM_AUTO 4
+
+#define TYPESPEC_BUF_LEN 128
+
+#define VDB_COPY_PREFIX "/VDBCOPY/"
+
+#define READ_FILTER_COL_NAME_KEY "/VDBCOPY/READ_FILTER_COL_NAME"
+#define READ_FILTER_COL_NAME "READ_FILTER"
+
+#define REDACTABLE_LIST_KEY "/VDBCOPY/REDACTVALUE/TYPES"
+
+#define REDACTABLE_TYPES_KEY "/VDBCOPY/REDACTABLE_TYPES"
+#define REDACTABLE_TYPES "INSDC:dna:text,INSDC:4na:bin,INSDC:4na:packed,INSDC:2na:bin,INSDC:x2na:bin,INSDC:2na:packed,INSDC:color:text,INSDC:2cs:bin,INSDC:x2cs:bin,INSDC:2cs:packed,INSDC:quality:phred,INSDC:quality:log_odds,INSDC:quality:text:phred_33,INSDC:quality:text:phred_64,INSDC:quality:text:log_odds_64,INSDC:position:zero,INSDC:position:one,NCBI:isamp1,NCBI:fsamp1,NCBI:fsamp4,NCBI:SRA:pos16,NCBI:SRA:encoded_qual4"
+
+#define DO_NOT_REDACT_KEY "/VDBCOPY/DO_NOT_REDACT"
+
+#define META_IGNORE_NODES_KEY "/VDBCOPY/META/IGNORE"
+#define META_IGNROE_NODES_DFLT "col,.seq,STATS"
+
+#define TYPE_SCORE_PREFIX "/VDBCOPY/SCORE/"
+
+#define LEGACY_SCHEMA_KEY "/schema"
+#define LEGACY_TAB_KEY "/tab"
+#define LEGACY_EXCLUDE_KEY "/dont_use"
+
+#define REDACTVALUE_PREFIX "/VDBCOPY/REDACTVALUE/"
+#define REDACTVALUE_VALUE_POSTFIX "/VALUE"
+#define REDACTVALUE_LEN_POSTFIX "/LEN"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/get_platform.c b/tools/vdb-copy/get_platform.c
new file mode 100644
index 0000000..c8f8662
--- /dev/null
+++ b/tools/vdb-copy/get_platform.c
@@ -0,0 +1,168 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "get_platform.h"
+#include <sysalloc.h>
+#include <stdlib.h> /* for malloc */
+#include <string.h> /* for memmove */
+
+#define PLATFORM_COL "(ascii)PLATFORM"
+
+static rc_t get_platform_from_table( const VTable *my_table, char ** dst,
+ const char pre_and_postfix )
+{
+ const VCursor *my_cursor;
+ rc_t rc = VTableCreateCursorRead( my_table, &my_cursor );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( my_cursor );
+ if ( rc == 0 )
+ {
+ uint32_t col_idx;
+ rc = VCursorAddColumn( my_cursor, &col_idx, PLATFORM_COL );
+ if ( rc == 0 )
+ {
+ rc = VCursorSetRowId( my_cursor, 1 );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpenRow( my_cursor );
+ if ( rc == 0 )
+ {
+ const void *src_buffer;
+ uint32_t offset_in_bits;
+ uint32_t element_count;
+
+ rc = VCursorCellData( my_cursor, col_idx, NULL,
+ &src_buffer, &offset_in_bits, &element_count );
+ if ( rc == 0 )
+ {
+ char *src_ptr = (char*)src_buffer + ( offset_in_bits >> 3 );
+ if ( pre_and_postfix != 0 )
+ *dst = malloc( element_count + 3 );
+ else
+ *dst = malloc( element_count + 1 );
+ if ( *dst != NULL )
+ {
+ if ( pre_and_postfix != 0 )
+ {
+ (*dst)[ 0 ] = pre_and_postfix;
+ memmove( &(*dst)[1], src_ptr, element_count );
+ (*dst)[ element_count + 1 ] = pre_and_postfix;
+ (*dst)[ element_count + 2 ] = 0;
+ }
+ else
+ {
+ memmove( *dst, src_ptr, element_count );
+ (*dst)[ element_count ] = 0;
+ }
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ VCursorCloseRow( my_cursor );
+ }
+ }
+ }
+ }
+ VCursorRelease( my_cursor );
+ }
+ return rc;
+}
+
+rc_t get_table_platform( const char * table_path, char ** dst,
+ const char pre_and_postfix )
+{
+ rc_t rc;
+ KDirectory *my_directory;
+
+ if ( table_path == NULL || dst == 0 )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+ rc = KDirectoryNativeDir( &my_directory );
+ if ( rc == 0 )
+ {
+ VDBManager *my_manager;
+ rc = VDBManagerMakeUpdate ( &my_manager, my_directory );
+ if ( rc == 0 )
+ {
+ VSchema *my_schema;
+ rc = VDBManagerMakeSRASchema( my_manager, &my_schema );
+ if ( rc == 0 )
+ {
+ const VTable *my_table;
+ rc = VDBManagerOpenTableRead( my_manager, &my_table, my_schema, "%s", table_path );
+ if ( rc == 0 )
+ {
+ rc = get_platform_from_table( my_table, dst, pre_and_postfix );
+ VTableRelease( my_table );
+ }
+ VSchemaRelease( my_schema );
+ }
+ VDBManagerRelease( my_manager );
+ }
+ KDirectoryRelease( my_directory );
+ }
+ return rc;
+}
+
+rc_t get_db_platform( const char * db_path, const char * tab_name,
+ char ** dst, const char pre_and_postfix )
+{
+ rc_t rc;
+ KDirectory *my_directory;
+
+ if ( db_path == NULL || tab_name == 0 || dst == 0 )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+ rc = KDirectoryNativeDir( &my_directory );
+ if ( rc == 0 )
+ {
+ VDBManager *my_manager;
+ rc = VDBManagerMakeUpdate ( &my_manager, my_directory );
+ if ( rc == 0 )
+ {
+ VSchema *my_schema;
+ rc = VDBManagerMakeSRASchema( my_manager, &my_schema );
+ if ( rc == 0 )
+ {
+ const VDatabase *my_database;
+ rc = VDBManagerOpenDBRead( my_manager, &my_database, my_schema, "%s", db_path );
+ if ( rc == 0 )
+ {
+ const VTable *my_table;
+ rc = VDatabaseOpenTableRead( my_database, &my_table, "%s", tab_name );
+ if ( rc == 0 )
+ {
+ rc = get_platform_from_table( my_table, dst, pre_and_postfix );
+ VTableRelease( my_table );
+ }
+ VDatabaseRelease( my_database );
+ }
+ VSchemaRelease( my_schema );
+ }
+ VDBManagerRelease( my_manager );
+ }
+ KDirectoryRelease( my_directory );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/get_platform.h b/tools/vdb-copy/get_platform.h
new file mode 100644
index 0000000..17f46bf
--- /dev/null
+++ b/tools/vdb-copy/get_platform.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_get_platform_
+#define _h_get_platform_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+rc_t get_table_platform( const char * table_path, char ** dst,
+ const char pre_and_postfix );
+rc_t get_db_platform( const char * db_path, const char * tab_name,
+ char ** dst, const char pre_and_postfix );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/helper.c b/tools/vdb-copy/helper.c
new file mode 100644
index 0000000..62bee76
--- /dev/null
+++ b/tools/vdb-copy/helper.c
@@ -0,0 +1,919 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "helper.h"
+#include "definitions.h"
+#include <os-native.h>
+
+/* this is here to detect the md5-mode of the src-table */
+#include <kdb/kdb-priv.h>
+#include <kdb/table.h>
+
+#include <sysalloc.h>
+
+#include <bitstr.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <ctype.h>
+
+int64_t strtoi64( const char* str, char** endp, uint32_t base )
+{
+ int i = 0;
+ int64_t ret_value = 0;
+
+ if ( str != NULL && base != 1 && base <= 36 )
+ {
+ bool negate = false;
+
+ for ( ; isspace( str [ i ] ); ++ i )
+ ( void ) 0;
+
+ switch ( str [ i ] )
+ {
+ case '-':
+ negate = true;
+ case '+':
+ ++ i;
+ break;
+ }
+
+ if ( base == 0 )
+ {
+ if ( str [ i ] != '0' )
+ base = 10;
+ else if ( tolower ( str [ i + 1 ] == 'x' ) )
+ {
+ base = 16;
+ i += 2;
+ }
+ else
+ {
+ base = 8;
+ i += 1;
+ }
+ }
+
+ if ( base <= 10 )
+ {
+ for ( ; isdigit ( str [ i ] ); ++ i )
+ {
+ uint32_t digit = str [ i ] - '0';
+ if ( digit >= base )
+ break;
+ ret_value *= base;
+ ret_value += digit;
+ }
+ }
+ else
+ {
+ for ( ; ; ++ i )
+ {
+ if ( isdigit ( str [ i ] ) )
+ {
+ ret_value *= base;
+ ret_value += str [ i ] - '0';
+ }
+ else if ( ! isalpha ( str [ i ] ) )
+ break;
+ else
+ {
+ uint32_t digit = toupper ( str [ i ] ) - 'A' + 10;
+ if ( digit >= base )
+ break;
+ ret_value *= base;
+ ret_value += digit;
+ }
+ }
+ }
+
+ if ( negate )
+ ret_value = - ret_value;
+ }
+
+ if ( endp != NULL )
+ * endp = (char *)str + i;
+
+ return ret_value;
+}
+
+
+uint64_t strtou64( const char* str, char** endp, uint32_t base )
+{
+ return strtoi64( str, endp, base );
+}
+
+
+/*
+ * calls the given manager to create a new SRA-schema
+ * takes the list of user-supplied schema's (which can be empty)
+ * and let the created schema parse all of them
+*/
+rc_t helper_parse_schema( const VDBManager *my_manager,
+ VSchema **new_schema,
+ const KNamelist *schema_list )
+{
+ rc_t rc;
+ if ( my_manager == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ if ( new_schema == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ rc = VDBManagerMakeSRASchema( my_manager, new_schema );
+ DISP_RC( rc, "VDBManagerMakeSRASchema() failed" );
+
+ if ( ( rc == 0 )&&( schema_list != NULL ) )
+ {
+ uint32_t count;
+ if ( KNamelistCount( schema_list, &count ) == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ if ( KNamelistGet( schema_list, idx, &s ) == 0 )
+ {
+ rc = VSchemaParseFile( *new_schema, "%s", s );
+ DISP_RC( rc, "VSchemaParseFile() failed" );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+#if TOOLS_USE_SRAPATH != 0
+static char *translate_accession( SRAPath *my_sra_path,
+ const char *accession,
+ const size_t bufsize )
+{
+ rc_t rc;
+ char * res = calloc( 1, bufsize );
+ if ( res == NULL ) return NULL;
+
+ rc = SRAPathFind( my_sra_path, accession, res, bufsize );
+ if ( GetRCState( rc ) == rcNotFound )
+ {
+ free( res );
+ return NULL;
+ }
+ else if ( GetRCState( rc ) == rcInsufficient )
+ {
+ free( res );
+ return translate_accession( my_sra_path, accession, bufsize * 2 );
+ }
+ else if ( rc != 0 )
+ {
+ free( res );
+ return NULL;
+ }
+ return res;
+}
+#endif
+
+
+#if TOOLS_USE_SRAPATH != 0
+rc_t helper_resolve_accession( const KDirectory *my_dir, char ** path )
+{
+ SRAPath *my_sra_path;
+ rc_t rc = 0;
+
+ if ( strchr ( *path, '/' ) != NULL )
+ return 0;
+
+ rc = SRAPathMake( &my_sra_path, my_dir );
+ if ( rc != 0 )
+ {
+ if ( GetRCState ( rc ) != rcNotFound || GetRCTarget ( rc ) != rcDylib )
+ DISP_RC( rc, "SRAPathMake() failed" );
+ else
+ rc = 0;
+ }
+ else
+ {
+ if ( !SRAPathTest( my_sra_path, *path ) )
+ {
+ char *buf = translate_accession( my_sra_path, *path, 64 );
+ if ( buf != NULL )
+ {
+ free( (char*)(*path) );
+ *path = buf;
+ }
+ }
+ SRAPathRelease( my_sra_path );
+ }
+ return rc;
+}
+#endif
+
+
+/*
+ * calls VTableTypespec to discover the table-name out of the schema
+ * the given table has to be opened!
+*/
+#define MAX_SCHEMA_TABNAME_LENGHT 80
+rc_t helper_get_schema_tab_name( const VTable *my_table, char ** name )
+{
+ rc_t rc;
+ char *s;
+
+ if ( my_table == NULL || name == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ *name = NULL;
+ s = malloc( MAX_SCHEMA_TABNAME_LENGHT + 1 );
+ if ( s == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+
+ rc = VTableTypespec ( my_table, s, MAX_SCHEMA_TABNAME_LENGHT );
+ if ( rc == 0 )
+ *name = s;
+ else
+ free( s );
+
+ return rc;
+}
+
+
+/*
+ * reads a string out of a vdb-table:
+ * needs a open cursor, a row-idx and the index of the column
+ * it opens the row, requests a pointer via VCursorCellData()
+ * malloc's the dst-pointer and copies the string into it
+ * a 0-termination get's attached
+ * finally it closes the row
+*/
+rc_t helper_read_vdb_string( const VCursor* src_cursor,
+ const uint64_t row_idx,
+ const uint32_t col_idx,
+ char ** dst )
+{
+ rc_t rc;
+
+ if ( dst == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ *dst = NULL;
+ rc = VCursorSetRowId( src_cursor, row_idx );
+ DISP_RC( rc, "helper_read_string:VCursorSetRowId() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpenRow( src_cursor );
+ DISP_RC( rc, "helper_read_string:VCursorOpenRow() failed" );
+ if ( rc == 0 )
+ {
+ const void *src_buffer;
+ uint32_t offset_in_bits;
+ uint32_t element_bits;
+ uint32_t element_count;
+
+ rc = VCursorCellData( src_cursor, col_idx, &element_bits,
+ &src_buffer, &offset_in_bits, &element_count );
+ DISP_RC( rc, "helper_read_string:VCursorCellData() failed" );
+ if ( rc == 0 )
+ {
+ char *src_ptr = (char*)src_buffer + ( offset_in_bits >> 3 );
+ *dst = malloc( element_count + 1 );
+ if ( *dst != NULL )
+ {
+ memmove( *dst, src_ptr, element_count );
+ (*dst)[ element_count ] = 0;
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ VCursorCloseRow( src_cursor );
+ DISP_RC( rc, "helper_read_string:VCursorClose() failed" );
+ }
+ }
+ return rc;
+}
+
+uint8_t BitLength2Bytes[65] =
+{
+ /* 0 1 2 3 4 5 6 7 8 9*/
+ /* 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ /* 1 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+ /* 2 */ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+ /* 3 */ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ /* 4 */ 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ /* 5 */ 7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
+ /* 6 */ 8, 8, 8, 8, 8
+};
+
+/*************************************************************************************
+n_bits [IN] ... number of bits
+
+calculates the number of bytes that have to be copied to contain the given
+number of bits
+*************************************************************************************/
+static uint16_t bitlength_2_bytes( const size_t n_bits )
+{
+ if ( n_bits > 64 )
+ return 8;
+ else
+ return BitLength2Bytes[ n_bits ];
+}
+
+
+/*
+ * reads a int64 out of a vdb-table:
+ * needs a open cursor, row-id already set, row opened
+ * it copies the data via memmove where to the dst-pointer
+ * points to / the size in the vdb-table can be smaller
+*/
+rc_t helper_read_vdb_int_row_open( const VCursor* src_cursor,
+ const uint32_t col_idx, uint64_t * dst )
+{
+ const void *src_buffer;
+ uint32_t offset_in_bits;
+ uint32_t element_bits;
+ uint32_t element_count;
+
+ rc_t rc = VCursorCellData( src_cursor, col_idx, &element_bits,
+ &src_buffer, &offset_in_bits, &element_count );
+ DISP_RC( rc, "helper_read_int_intern:VCursorCellData() failed" );
+ if ( rc == 0 )
+ {
+ uint64_t value = 0;
+ char *src_ptr = (char*)src_buffer + ( offset_in_bits >> 3 );
+ if ( ( offset_in_bits & 7 ) == 0 )
+ memmove( &value, src_ptr, bitlength_2_bytes( element_bits ) );
+ else
+ bitcpy ( &value, 0, src_ptr, offset_in_bits, element_bits );
+ *dst = value;
+ }
+ return rc;
+}
+
+
+/*
+ * reads a int64 out of a vdb-table:
+ * needs a open cursor, it opens the row,
+ * calls helper_read_vdb_int_row_open()
+ * finally it closes the row
+*/
+rc_t helper_read_vdb_int( const VCursor* src_cursor,
+ const uint64_t row_idx,
+ const uint32_t col_idx,
+ uint64_t * dst )
+{
+ rc_t rc;
+
+ if ( src_cursor == NULL || dst == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ *dst = 0;
+ rc = VCursorSetRowId( src_cursor, row_idx );
+ DISP_RC( rc, "helper_read_int:VCursorSetRowId() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpenRow( src_cursor );
+ DISP_RC( rc, "helper_read_int:VCursorOpenRow() failed" );
+ if ( rc == 0 )
+ {
+ rc = helper_read_vdb_int_row_open( src_cursor, col_idx, dst );
+ VCursorCloseRow( src_cursor );
+ DISP_RC( rc, "helper_read_int:VCursorClose() failed" );
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * reads a string out of a KConfig-object:
+ * needs a cfg-object, and the full name of the key(node)
+ * it opens the node, discovers the size, malloc's the string,
+ * reads the string and closes the node
+*/
+rc_t helper_read_cfg_str( const KConfig *cfg, const char * key,
+ char ** value )
+{
+ const KConfigNode *node;
+ rc_t rc;
+
+ if ( value == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ *value = NULL;
+ rc = KConfigOpenNodeRead ( cfg, &node, "%s", key );
+ /* it is OK if we do not find it, so no DISP_RC here */
+ if ( rc == 0 )
+ {
+ size_t num_read, remaining;
+ /* first we ask about the size to be read */
+ rc = KConfigNodeRead ( node, 0, NULL, 0, &num_read, &remaining );
+ DISP_RC( rc, "helper_read_config_str:KConfigNodeRead(1) failed" );
+ if ( rc == 0 )
+ {
+ *value = malloc( remaining + 1 );
+ if ( *value )
+ {
+ size_t to_read = remaining;
+ rc = KConfigNodeRead ( node, 0, *value, to_read, &num_read, &remaining );
+ DISP_RC( rc, "helper_read_config_str:KConfigNodeRead(2) failed" );
+ if ( rc == 0 )
+ (*value)[ num_read ] = 0;
+ }
+ else
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ KConfigNodeRelease( node );
+ }
+ return rc;
+}
+
+
+/*
+ * reads a uint64 out of a KConfig-object:
+ * needs a cfg-object, and the full name of the key(node)
+ * it calls helper_read_cfg_str() to read the node as string
+ * and converts it via strtou64() into a uint64
+*/
+rc_t helper_read_cfg_int( const KConfig *cfg, const char * key,
+ uint64_t * value )
+{
+ char *str_value;
+ rc_t rc;
+
+ if ( value == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+ *value = 0;
+
+ rc = helper_read_cfg_str( cfg, key, &str_value );
+ DISP_RC( rc, "helper_read_config_int:helper_read_config_str() failed" );
+ if ( rc == 0 )
+ {
+ *value = strtou64( str_value, NULL, 0 );
+ free( str_value );
+ }
+ return rc;
+}
+
+
+/*
+ * tries to detect if the given name of a schema-table is
+ * a schema-legacy-table, it needs the vdb-manager to
+ * open a sra-schema and request this schema to list all
+ * legacy tables, then it searches in that list for the
+ * given table-name
+*/
+rc_t helper_is_tablename_legacy( const VDBManager *my_manager,
+ const char * tabname, bool * flag )
+{
+ VSchema *schema;
+ rc_t rc;
+
+ if ( flag == NULL )
+ return RC( rcExe, rcNoTarg, rcConstructing, rcParam, rcNull );
+ *flag = false;
+
+ rc = VDBManagerMakeSRASchema ( my_manager, &schema );
+ DISP_RC( rc, "helper_is_tablename_legacy:VDBManagerMakeSRASchema() failed" );
+ if ( rc == 0 )
+ {
+ KNamelist *list;
+ rc = VSchemaListLegacyTables ( schema, &list );
+ DISP_RC( rc, "helper_is_tablename_legacy:VSchemaListLegacyTables() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount ( list, &count );
+ DISP_RC( rc, "helper_is_tablename_legacy:KNamelistCoun() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx = 0;
+ size_t tabname_len = string_size ( tabname );
+ while( idx < count && rc == 0 && *flag == false )
+ {
+ const char * name;
+ rc = KNamelistGet ( list, idx, &name );
+ if ( rc == 0 )
+ {
+ size_t len = string_size ( name );
+ if ( string_cmp ( name, len, tabname, tabname_len,
+ ( len < tabname_len ) ? len : tabname_len ) == 0 )
+ *flag = true;
+ }
+ idx++;
+ }
+ }
+ KNamelistRelease( list );
+ }
+ VSchemaRelease( schema );
+ }
+ return rc;
+}
+
+
+/*
+ * helper-function to replace all ':' and '#' chars
+ * with '_' chars
+*/
+static void helper_process_c_str( char * s )
+{
+ size_t idx, len = string_measure ( s, NULL );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ if ( s[ idx ] == ':' || s[ idx ] == '#' )
+ s[ idx ] = '_';
+ }
+}
+
+
+/*
+ * helper-function to replace all ':' and '#' chars
+ * with '_' chars
+*/
+static void helper_process_cfg_key( String *s )
+{
+ uint32_t idx;
+ for ( idx = 0; idx < s->len; ++idx )
+ {
+ if ( s->addr[ idx ] == ':' || s->addr[ idx ] == '#' )
+ ( (char *)(s->addr) )[ idx ] = '_';
+ }
+}
+
+
+/*
+ * helper-function to read the value of cfg-node
+ * if key_sel = xxx and s_sub = yyy
+ * the node-name is formed like that "/VDBCOPY/xxx/yyy"
+ * to read the value helper_read_cfg_str() is called
+*/
+static rc_t helper_get_legacy_node( KConfig *cfg,
+ String *key_sel, const char * s_sub, char ** dst )
+{
+ String key_prefix, key_sub;
+ const String *temp;
+ const String *key;
+ rc_t rc;
+
+ StringInitCString( &key_prefix, VDB_COPY_PREFIX );
+ rc = StringConcat ( &temp, &key_prefix, key_sel );
+ if ( rc != 0 ) return rc;
+
+ StringInitCString( &key_sub, s_sub );
+ rc = StringConcat ( &key, temp, &key_sub );
+ StringWhack ( temp );
+ if ( rc != 0 ) return rc;
+
+ rc = helper_read_cfg_str( cfg, key->addr, dst );
+ StringWhack ( key );
+ return rc;
+}
+
+
+/*
+ * helper-function to read the value of a cfg-node
+ * if pf = "_454_", schema = "NCBI_SRA__454__tbl_v0_1"
+ * and postfix = "tab" it first tries to read:
+ * "/VDBCOPY/NCBI_SRA__454__tbl_v0_1/tab"
+ * if this node is not found it tries to read:
+ * "/VDBCOPY/_454_/tab"
+ * if this node is not found it is a error
+*/
+static rc_t helper_get_legacy_value( KConfig *cfg,
+ String *pf, String *schema, const char * postfix, char ** dst )
+{
+ /* first try to find the value under the src-schema-key */
+ rc_t rc = helper_get_legacy_node( cfg, schema, postfix, dst );
+ /* if this fails try to find it mapped to the platform */
+ if ( rc != 0 )
+ rc = helper_get_legacy_node( cfg, pf, postfix, dst );
+ return rc;
+}
+
+
+/*
+ * this function tries to read 3 strings out of cfg-nodes
+ * (1) the name of the schema-file to be used to copy to
+ * (2) the name of the table to be used inside the schema
+ * (3) a list of columns that should not be copied
+ * if (3) cannot be found it is not a error
+ * it needs as input the cfg-object, the name of the
+ * (src)legacy-platform and the name of the
+ * (src)schema-table
+*/
+rc_t helper_get_legacy_write_schema_from_config( KConfig *cfg,
+ const char * platform,
+ const char * src_schema,
+ char ** legacy_schema_file, char ** legacy_schema_tab,
+ char ** legacy_dont_copy )
+{
+ rc_t rc;
+ String key_pf, key_schema;
+
+ StringInitCString( &key_pf, platform );
+ helper_process_cfg_key( &key_pf );
+ StringInitCString( &key_schema, src_schema );
+ helper_process_cfg_key( &key_pf );
+
+ rc = helper_get_legacy_value( cfg, &key_pf, &key_schema,
+ LEGACY_SCHEMA_KEY, legacy_schema_file );
+ if ( rc != 0 ) return rc;
+
+ rc = helper_get_legacy_value( cfg, &key_pf, &key_schema,
+ LEGACY_TAB_KEY, legacy_schema_tab );
+ if ( rc != 0 ) return rc;
+
+ /* dont_use is optional, no error if not found! */
+ helper_get_legacy_value( cfg, &key_pf, &key_schema,
+ LEGACY_EXCLUDE_KEY, legacy_dont_copy );
+ return 0;
+}
+
+
+/*
+ * this function creates a config-manager, by passing in
+ * a KDirectory-object representing the given path
+ * this will include the the given path into the search
+ * for *.kfg - files
+*/
+rc_t helper_make_config_mgr( KConfig **config_mgr, const char * path )
+{
+#if ALLOW_EXTERNAL_CONFIG
+ KDirectory *directory;
+ const KDirectory *config_sub_dir;
+
+ rc_t rc = KDirectoryNativeDir( &directory );
+ if ( rc != 0 ) return rc;
+ rc = KDirectoryOpenDirRead ( directory, &config_sub_dir, false, "%s", path );
+ if ( rc == 0 )
+ {
+ rc = KConfigMake ( config_mgr, config_sub_dir );
+ KDirectoryRelease( config_sub_dir );
+ }
+ KDirectoryRelease( directory );
+#else
+ rc_t rc = KConfigMake ( config_mgr, NULL );
+#endif
+ return rc;
+}
+
+
+/*
+ * this function tries to read the lossynes-score of a vdb-type
+ * out of a config-object
+ * it constructs a node-name-string like this:
+ * "/VDBCOPY/SCORE/INSDC_2na_bin"
+ * INSDC/2na/bin is the name of the type with ":" replaced by "_"
+ * it reads the value by calling helper_read_cfg_str()
+*/
+uint32_t helper_rd_type_score( const KConfig *cfg,
+ const char *type_name )
+{
+ uint32_t res = 0;
+ if ( cfg != NULL && type_name != NULL && type_name[0] != 0 )
+ {
+ uint32_t prefix_len = string_measure ( TYPE_SCORE_PREFIX, NULL ) + 1;
+ uint32_t len = string_measure ( type_name, NULL ) + prefix_len;
+ char *s = malloc( len );
+ if ( s != NULL )
+ {
+ char *value;
+ size_t n = string_copy_measure ( s, len, TYPE_SCORE_PREFIX );
+ string_copy_measure( &(s[n]), len, type_name );
+ helper_process_c_str( s );
+ if ( helper_read_cfg_str( cfg, s, &value ) == 0 )
+ {
+ if ( value != NULL )
+ {
+ res = strtol( value, NULL, 0 );
+ free( value );
+ }
+ }
+ free( s );
+ }
+ }
+ return res;
+}
+
+
+/* remove the target-table if something went wrong */
+rc_t helper_remove_path( KDirectory * directory, const char * path )
+{
+ rc_t rc;
+
+ PLOGMSG( klogInfo, ( klogInfo, "removing '$(path)'", "path=%s", path ));
+ rc = KDirectoryRemove ( directory, true, "%s", path );
+ DISP_RC( rc, "vdb_copy_remove_table:KDirectoryRemove() failed" );
+ return rc;
+}
+
+
+bool helper_is_this_a_filesystem_path( const char * path )
+{
+ bool res = false;
+ size_t i, n = string_size ( path );
+ for ( i = 0; i < n && !res; ++i )
+ {
+ char c = path[ i ];
+ res = ( c == '.' || c == '/' || c == '\\' );
+ }
+ return res;
+}
+
+
+static void helper_read_redact_value( KConfig * config_mgr, redact_vals * rvals,
+ const char * type_name )
+{
+ rc_t rc;
+ String key_prefix, key_type, key_postfix;
+ const String * p1;
+
+ StringInitCString( &key_prefix, REDACTVALUE_PREFIX );
+ StringInitCString( &key_type, type_name );
+ StringInitCString( &key_postfix, REDACTVALUE_VALUE_POSTFIX );
+ rc = StringConcat ( &p1, &key_prefix, &key_type );
+ if ( rc == 0 )
+ {
+ const String * key;
+ rc = StringConcat ( &key, p1, &key_postfix );
+ if ( rc == 0 )
+ {
+ char * value_str;
+ rc = helper_read_cfg_str( config_mgr, key->addr, &value_str );
+ StringWhack ( key );
+ if ( rc == 0 )
+ {
+ StringInitCString( &key_postfix, REDACTVALUE_LEN_POSTFIX );
+ rc = StringConcat ( &key, p1, &key_postfix );
+ if ( rc == 0 )
+ {
+ uint32_t idx, l, len = 1;
+ char * endp, * len_str, * real_type;
+
+ rc = helper_read_cfg_str( config_mgr, key->addr, &len_str );
+ StringWhack ( key );
+ if ( rc == 0 )
+ {
+ len = strtol( len_str, &endp, 0 );
+ free( len_str );
+ }
+
+ real_type = string_dup_measure ( type_name, NULL );
+ l = string_size ( real_type );
+
+ /* transform the typename back into '_' ---> ':' real typename */
+ for ( idx = 0; idx < l; ++idx )
+ if ( real_type[idx] == '_' )
+ real_type[idx] = ':';
+
+ /* finally insert the redact-value-pair into the list */
+ redact_vals_add( rvals, real_type, len, value_str );
+ free( real_type );
+ }
+ free( value_str );
+ }
+ }
+ StringWhack ( p1 );
+ }
+}
+
+
+void helper_read_redact_values( KConfig * config_mgr, redact_vals * rvals )
+{
+ rc_t rc;
+ char * type_list_str;
+ const KNamelist *type_list;
+
+ /* first we read the list of redactable types */
+ helper_read_cfg_str( config_mgr,
+ REDACTABLE_LIST_KEY, &type_list_str );
+ if ( type_list_str == NULL ) return;
+ rc = nlt_make_namelist_from_string( &type_list, type_list_str );
+ if ( rc == 0 && type_list != NULL )
+ {
+ uint32_t idx, count;
+ rc = KNamelistCount( type_list, &count );
+ if ( rc == 0 && count > 0 )
+ for ( idx = 0; idx < count; ++idx )
+ {
+ const char *type_name;
+ rc = KNamelistGet( type_list, idx, &type_name );
+ if ( rc == 0 )
+ helper_read_redact_value( config_mgr, rvals, type_name );
+ }
+ KNamelistRelease( type_list );
+ }
+ free( type_list_str );
+}
+
+
+void helper_read_config_values( KConfig * config_mgr, p_config_values config )
+{
+ /* key's and default-values in definitions.h */
+
+ /* look for the name of the filter-column */
+ helper_read_cfg_str( config_mgr,
+ READ_FILTER_COL_NAME_KEY, &(config->filter_col_name) );
+ if ( config->filter_col_name == NULL )
+ config->filter_col_name = string_dup_measure ( READ_FILTER_COL_NAME, NULL );
+
+ /* look for the comma-separated list of meta-nodes to be ignored */
+ helper_read_cfg_str( config_mgr,
+ META_IGNORE_NODES_KEY, &(config->meta_ignore_nodes) );
+ if ( config->meta_ignore_nodes == NULL )
+ config->meta_ignore_nodes = string_dup_measure ( META_IGNROE_NODES_DFLT, NULL );
+
+ /* look for the comma-separated list of redactable types */
+ helper_read_cfg_str( config_mgr,
+ REDACTABLE_TYPES_KEY, &(config->redactable_types) );
+ if ( config->redactable_types == NULL )
+ config->redactable_types = string_dup_measure ( REDACTABLE_TYPES, NULL );
+
+ /* look for the comma-separated list of columns which are protected from redaction */
+ helper_read_cfg_str( config_mgr,
+ DO_NOT_REDACT_KEY, &(config->do_not_redact_columns) );
+}
+
+
+bool helper_detect_src_md5( const VTable * src_tab )
+{
+ rc_t rc;
+ const struct KTable * ktab;
+ bool res = false;
+
+ rc = VTableOpenKTableRead ( src_tab, &ktab );
+ if ( rc == 0 )
+ {
+ const struct KDirectory *dir;
+ rc = KTableOpenDirectoryRead ( ktab, &dir );
+ if ( rc == 0 )
+ {
+ /* ask for pathtype of "md5" */
+ uint32_t pt = KDirectoryPathType ( dir, "md5" );
+ if ( ( pt == kptFile )||( pt == ( kptFile | kptAlias ) ) )
+ res = true;
+ KDirectoryRelease( dir );
+ }
+ KTableRelease( ktab );
+ }
+ return res;
+}
+
+
+KCreateMode helper_assemble_CreateMode( const VTable * src_tab,
+ bool force_init, uint8_t md5_mode )
+{
+ KCreateMode res = kcmParents;
+
+ if ( md5_mode == MD5_MODE_AUTO )
+ {
+ bool src_md5_mode = helper_detect_src_md5( src_tab );
+ md5_mode = ( src_md5_mode ? MD5_MODE_ON : MD5_MODE_OFF );
+ }
+
+ if ( force_init )
+ res |= kcmInit;
+ else
+ res |= kcmCreate;
+
+ switch( md5_mode )
+ {
+ case MD5_MODE_ON :
+ case MD5_MODE_AUTO : res |= kcmMD5; break;
+ }
+ return res;
+}
+
+
+KChecksum helper_assemble_ChecksumMode( uint8_t ctx_blob_checksum )
+{
+ KChecksum res = kcsCRC32; /* from interfaces/kdb/column.h */
+ switch( ctx_blob_checksum )
+ {
+ case BLOB_CHECKSUM_OFF : res = kcsNone; break;
+ case BLOB_CHECKSUM_CRC32 : res = kcsCRC32; break;
+ case BLOB_CHECKSUM_MD5 : res = kcsMD5; break;
+ case BLOB_CHECKSUM_AUTO : res = kcsCRC32; break;
+ }
+ return res;
+}
diff --git a/tools/vdb-copy/helper.h b/tools/vdb-copy/helper.h
new file mode 100644
index 0000000..998961e
--- /dev/null
+++ b/tools/vdb-copy/helper.h
@@ -0,0 +1,225 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_helper_
+#define _h_helper_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifndef _h_vdb_redactval_
+#include "redactval.h"
+#endif
+
+#ifndef _h_config_values_
+#include "config_values.h"
+#endif
+
+int64_t strtoi64( const char* str, char** endp, uint32_t base );
+uint64_t strtou64( const char* str, char** endp, uint32_t base );
+
+/*
+ * calls the given manager to create a new SRA-schema
+ * takes the list of user-supplied schema's (which can be empty)
+ * and let the created schema parse all of them
+*/
+rc_t helper_parse_schema( const VDBManager *my_manager,
+ VSchema **new_schema,
+ const KNamelist *schema_list );
+
+/*
+ * tries to interpret the given string in path as a accession
+ * and returns the path of the found accession back in path
+ * if it is possible, if not the original value of path remains unchanged
+ * rc = 0 if the given path is a file-system-path or we are not
+ * (weakly) linked against the sra-path-library
+rc_t helper_resolve_accession( const KDirectory *my_dir,
+ char ** path );
+*/
+
+/*
+ * calls VTableTypespec to discover the table-name out of the schema
+ * the given table has to be opened!
+*/
+rc_t helper_get_schema_tab_name( const VTable *my_table, char ** name ) ;
+
+
+/*
+ * reads a string out of a vdb-table:
+ * needs a open cursor, a row-idx and the index of the column
+ * it opens the row, requests a pointer via VCursorCellData()
+ * malloc's the dst-pointer and copies the string into it
+ * a 0-termination get's attached
+ * finally it closes the row
+*/
+rc_t helper_read_vdb_string( const VCursor* src_cursor,
+ const uint64_t row_idx,
+ const uint32_t col_idx,
+ char ** dst );
+
+
+/*
+ * reads a int64 out of a vdb-table:
+ * needs a open cursor, row-id already set, row opened
+ * it copies the data via memmove where to the dst-pointer
+ * points to / the size in the vdb-table can be smaller
+*/
+rc_t helper_read_vdb_int_row_open( const VCursor* src_cursor,
+ const uint32_t col_idx, uint64_t * dst );
+
+
+/*
+ * reads a int64 out of a vdb-table:
+ * needs a open cursor, it opens the row,
+ * calls helper_read_vdb_int_row_open()
+ * finally it closes the row
+*/
+rc_t helper_read_vdb_int( const VCursor* src_cursor,
+ const uint64_t row_idx,
+ const uint32_t col_idx,
+ uint64_t * dst );
+
+
+/*
+ * reads a string out of a KConfig-object:
+ * needs a cfg-object, and the full name of the key(node)
+ * it opens the node, discovers the size, malloc's the string,
+ * reads the string and closes the node
+*/
+rc_t helper_read_cfg_str( const KConfig *cfg,
+ const char * key,
+ char ** value );
+
+
+/*
+ * reads a uint64 out of a KConfig-object:
+ * needs a cfg-object, and the full name of the key(node)
+ * it calls helper_read_cfg_str() to read the node as string
+ * and converts it via strtoll() into a uint64
+*/
+rc_t helper_read_cfg_int( const KConfig *cfg,
+ const char * key,
+ uint64_t * value );
+
+
+/*
+ * tries to detect if the given name of a schema-table is
+ * a schema-legacy-table, it needs the vdb-manager to
+ * open a sra-schema and request this schema to list all
+ * legacy tables, then it searches in that list for the
+ * given table-name
+*/
+rc_t helper_is_tablename_legacy( const VDBManager *my_manager,
+ const char * tabname, bool * flag );
+
+
+/*
+ * this function tries to read 3 strings out of cfg-nodes
+ * (1) the name of the schema-file to be used to copy to
+ * (2) the name of the table to be used inside the schema
+ * (3) a list of columns that should not be copied
+ * if (3) cannot be found it is not a error
+ * it needs as input the cfg-object, the name of the
+ * (src)legacy-platform and the name of the
+ * (src)schema-table
+*/
+rc_t helper_get_legacy_write_schema_from_config( KConfig *cfg,
+ const char * platform,
+ const char * src_schema,
+ char ** legacy_schema_file, char ** legacy_schema_tab,
+ char ** legacy_dont_copy );
+
+
+/*
+ * this function creates a config-manager, by passing in
+ * a KDirectory-object representing the given path
+ * this will include the the given path into the search
+ * for *.kfg - files
+*/
+rc_t helper_make_config_mgr( KConfig **config_mgr, const char * path );
+
+
+/*
+ * this function tries to read the lossynes-score of a vdb-type
+ * out of a config-object
+ * it constructs a node-name-string like this:
+ * "/VDBCOPY/SCORE/INSDC/2na/bin"
+ * INSDC/2na/bin is the name of the type with ":" replaced by "/"
+ * it reads the value by calling helper_read_cfg_str()
+*/
+uint32_t helper_rd_type_score( const KConfig *cfg,
+ const char *type_name );
+
+
+/*
+ * this function tries to remove the given path
+*/
+rc_t helper_remove_path( KDirectory * directory, const char * path );
+
+
+/*
+ * looks into the path for chars like '/', '\\' or '.'
+ * to detect that it is rather a path and not and accession
+*/
+bool helper_is_this_a_filesystem_path( const char * path );
+
+
+/*
+ * reads global config-values, from the config-manager
+*/
+void helper_read_redact_values( KConfig * config_mgr,
+ redact_vals * rvals );
+
+/*
+ * reads global config-values, if not found via config-manager
+ * use the defines from definition.h
+*/
+void helper_read_config_values( KConfig * config_mgr,
+ p_config_values config );
+
+
+/*
+ * detects if the given table uses md5-checksum's
+*/
+bool helper_detect_src_md5( const VTable * src_tab );
+
+
+KCreateMode helper_assemble_CreateMode( const VTable * src_tab,
+ bool force_init, uint8_t md5_mode );
+
+
+KChecksum helper_assemble_ChecksumMode( uint8_t ctx_blob_checksum );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/matcher_input.h b/tools/vdb-copy/matcher_input.h
new file mode 100644
index 0000000..1a5434a
--- /dev/null
+++ b/tools/vdb-copy/matcher_input.h
@@ -0,0 +1,55 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_matcher_input_
+#define _h_matcher_input_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* structure with all the matcher-inputs */
+typedef struct matcher_input
+{
+ VDBManager * manager;
+ const KNamelist * add_schemas;
+ KConfig * cfg;
+ KDirectory * dir;
+ const char * columns;
+ const char * src_path;
+ const char * dst_path;
+ const char * legacy_schema;
+ const char * dst_tabname;
+ const char * excluded_columns;
+ bool force_kcmInit;
+ bool force_unlock;
+} matcher_input;
+typedef matcher_input* p_matcher_input;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/namelist_tools.c b/tools/vdb-copy/namelist_tools.c
new file mode 100644
index 0000000..270449b
--- /dev/null
+++ b/tools/vdb-copy/namelist_tools.c
@@ -0,0 +1,187 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "namelist_tools.h"
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+
+int nlt_strcmp( const char* s1, const char* s2 )
+{
+ size_t n1 = string_size ( s1 );
+ size_t n2 = string_size ( s2 );
+ return string_cmp ( s1, n1, s2, n2, ( n1 < n2 ) ? n2 : n1 );
+}
+
+
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src )
+{
+ VNamelist *v_names;
+ rc_t rc = VNamelistMake ( &v_names, 5 );
+ if ( rc == 0 )
+ {
+ char * s = string_dup_measure ( src, NULL );
+ if ( s )
+ {
+ uint32_t str_begin = 0;
+ uint32_t str_end = 0;
+ char c;
+ do
+ {
+ c = s[ str_end ];
+ if ( c == ',' || c == 0 )
+ {
+ if ( str_begin < str_end )
+ {
+ char c_temp = c;
+ s[ str_end ] = 0;
+ rc = VNamelistAppend ( v_names, &(s[str_begin]) );
+ s[ str_end ] = c_temp;
+ }
+ str_begin = str_end + 1;
+ }
+ str_end++;
+ } while ( c != 0 && rc == 0 );
+ free( s );
+ }
+ rc = VNamelistToConstNamelist ( v_names, list );
+ VNamelistRelease( v_names );
+ }
+ return rc;
+}
+
+bool nlt_is_name_in_namelist( const KNamelist *list,
+ const char *name_to_find )
+{
+ uint32_t count, idx;
+ bool res = false;
+ if ( list == NULL || name_to_find == NULL )
+ return res;
+ if ( KNamelistCount( list, &count ) == 0 )
+ {
+ for ( idx = 0; idx < count && res == false; ++idx )
+ {
+ const char *item_name;
+ if ( KNamelistGet( list, idx, &item_name ) == 0 )
+ {
+ if ( nlt_strcmp( item_name, name_to_find ) == 0 )
+ res = true;
+ }
+ }
+ }
+ return res;
+}
+
+/*
+ - list1 and list2 containts strings
+ - if one of the strings in list2 is contained ( partial match, strstr() )
+ in one of the strings in list1 the function returns true...
+*/
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 )
+{
+ uint32_t count1;
+ bool res = false;
+ if ( list1 == NULL || list2 == NULL )
+ return res;
+ if ( KNamelistCount( list1, &count1 ) == 0 )
+ {
+ uint32_t idx1;
+ for ( idx1 = 0; idx1 < count1 && res == false; ++idx1 )
+ {
+ const char *string1;
+ if ( KNamelistGet( list1, idx1, &string1 ) == 0 )
+ {
+ uint32_t count2;
+ if ( KNamelistCount( list2, &count2 ) == 0 )
+ {
+ uint32_t idx2;
+ for ( idx2 = 0; idx2 < count2 && res == false; ++idx2 )
+ {
+ const char *string2;
+ if ( KNamelistGet( list2, idx2, &string2 ) == 0 )
+ {
+ if ( strstr( string1, string2 ) != NULL )
+ res = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return res;
+}
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove )
+{
+ rc_t rc = 0;
+ uint32_t count;
+
+ if ( source == NULL || dest == NULL || to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ *dest = NULL;
+ rc = KNamelistCount( source, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ VNamelist *cleaned;
+ rc = VNamelistMake ( &cleaned, count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( source, idx, &s );
+ if ( rc == 0 )
+ {
+ if ( !nlt_is_name_in_namelist( to_remove, s ) )
+ rc = VNamelistAppend ( cleaned, s );
+ }
+ rc = VNamelistToConstNamelist ( cleaned, dest );
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove )
+{
+ rc_t rc = 0;
+ const KNamelist *to_remove;
+
+ if ( source == NULL || dest == NULL || items_to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ rc = nlt_make_namelist_from_string( &to_remove, items_to_remove );
+ if ( rc == 0 )
+ {
+ rc = nlt_remove_names_from_namelist( source, dest, to_remove );
+ KNamelistRelease( to_remove );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/namelist_tools.h b/tools/vdb-copy/namelist_tools.h
new file mode 100644
index 0000000..3cefbf9
--- /dev/null
+++ b/tools/vdb-copy/namelist_tools.h
@@ -0,0 +1,52 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_namelist_tools_
+#define _h_namelist_tools_
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int nlt_strcmp( const char* s1, const char* s2 );
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src );
+bool nlt_is_name_in_namelist( const KNamelist *list, const char *name_to_find );
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 );
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove );
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/num-gen.c b/tools/vdb-copy/num-gen.c
new file mode 100644
index 0000000..0dfdca2
--- /dev/null
+++ b/tools/vdb-copy/num-gen.c
@@ -0,0 +1,848 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "num-gen.h"
+#include <klib/printf.h>
+
+#include <sysalloc.h>
+#include <strtol.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+typedef struct num_gen_node
+{
+ uint64_t start;
+ uint64_t end;
+ uint64_t count; /* 0 ... skip, >0 ... valid */
+} num_gen_node;
+typedef struct num_gen_node * p_num_gen_node;
+
+/* **************************************************************************
+{ start:5,count: 0 } ---> [ ]
+{ start:5,count: 1 } ---> [ 5 ]
+{ start:5,count: 2 } ---> [ 5, 6 ]
+ ************************************************************************** */
+
+struct num_gen
+{
+ Vector nodes;
+};
+
+
+struct num_gen_iter
+{
+ Vector nodes;
+ uint32_t curr_node;
+ uint32_t curr_node_sub_pos;
+ uint64_t total;
+ uint64_t progress;
+};
+
+/* forward decl. for fixing-function */
+static rc_t num_gen_fix_overlaps( num_gen* self, uint32_t *count );
+
+
+/* helper function to destroy a node*/
+static void CC num_gen_node_destroy( void *item, void *data )
+{
+ free( item );
+}
+
+
+/* helper function to create a node from start/count */
+static p_num_gen_node num_gen_make_node( const uint64_t start, const uint64_t count )
+{
+ p_num_gen_node p = ( p_num_gen_node )malloc( sizeof( num_gen_node ) );
+ if ( p )
+ {
+ p->start = start;
+ p->end = start + count - 1;
+ p->count = count;
+ }
+ return p;
+}
+
+
+/* helper callback to compare 2 nodes, lets VectorInsert create a sorted vector */
+static int64_t CC num_gen_insert_helper( const void* item1, const void* item2 )
+{
+ const p_num_gen_node node1 = ( p_num_gen_node )item1;
+ const p_num_gen_node node2 = ( p_num_gen_node )item2;
+ int64_t res = 0;
+ if ( node1->start == node2->start )
+ {
+ if ( node1->count < node2->count )
+ res = -1;
+ else if ( node1->count > node2->count )
+ res = 1;
+ }
+ else if ( node1->start < node2->start )
+ res = -1;
+ else
+ res = 1;
+ return res;
+}
+
+
+/* helper callback to create a deep and conditional copy of a node-vector */
+static void CC num_gen_copy_cb( void *item, void *data )
+{
+ p_num_gen_node node = ( p_num_gen_node )item;
+ if ( node->count > 0 )
+ {
+ Vector * dst = ( Vector *)data;
+ p_num_gen_node new_node = num_gen_make_node( node->start, node->count );
+ if ( new_node != NULL )
+ VectorInsert( dst, new_node, NULL, num_gen_insert_helper );
+ }
+}
+
+
+/* helper function that creates a deep and conditional copy of a node-vector */
+static void num_gen_copy_vector( const Vector * src, Vector * dst )
+{
+ if ( src == NULL || dst == NULL )
+ return;
+ VectorForEach ( src, false, num_gen_copy_cb, dst );
+}
+
+
+/* helper callback to add up all count values in the vector*/
+static void CC num_gen_total_count_cb( void *item, void *data )
+{
+ p_num_gen_node node = ( p_num_gen_node )item;
+ if ( node != NULL )
+ {
+ uint64_t * total = ( uint64_t *)data;
+ if ( total != NULL )
+ *total += node->count;
+ }
+}
+
+
+/* helper function that adds up all count values in the vector*/
+static uint64_t num_gen_total_count( const Vector * src )
+{
+ uint64_t res = 0;
+ if ( src != NULL )
+ VectorForEach ( src, false, num_gen_total_count_cb, &res );
+ return res;
+}
+
+
+/* helper function for the parse-function */
+static rc_t num_gen_add_node( num_gen* self, const uint64_t from,
+ const uint64_t to )
+{
+ p_num_gen_node node = NULL;
+ int64_t count = ( to - from );
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+
+ if ( count >= 0 )
+ node = num_gen_make_node( from, count + 1 );
+ else
+ node = num_gen_make_node( to, -( count + 1 ) );
+ if ( node == NULL )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcMemory, rcExhausted );
+ return VectorInsert( &(self->nodes), node, NULL, num_gen_insert_helper );
+}
+
+
+#define MAX_NUM_STR 12
+/* helper-structure for num_gen_parse() */
+typedef struct num_gen_parse_ctx
+{
+ uint32_t num_str_idx;
+ bool this_is_the_first_number;
+ uint64_t num1;
+ uint64_t num2;
+ char num_str[ MAX_NUM_STR + 1 ];
+} num_gen_parse_ctx;
+typedef num_gen_parse_ctx* p_num_gen_parse_ctx;
+
+
+/* helper for num_gen_parse() */
+static void num_gen_convert_ctx( p_num_gen_parse_ctx ctx )
+{
+ char *endp;
+
+ ctx->num_str[ ctx->num_str_idx ] = 0;
+ ctx->num1 = strtou64( ctx->num_str, &endp, 10 );
+ ctx->this_is_the_first_number = false;
+ ctx->num_str_idx = 0;
+}
+
+
+/* helper for num_gen_parse() */
+static rc_t num_gen_convert_and_add_ctx( num_gen* self, p_num_gen_parse_ctx ctx )
+{
+ char *endp;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+ if ( ctx == NULL )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ if ( ctx->num_str_idx == 0 )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+
+ /* terminate the source-string */
+ ctx->num_str[ ctx->num_str_idx ] = 0;
+ /* convert the string into a uint64_t */
+ if ( ctx->this_is_the_first_number )
+ {
+ ctx->num1 = strtou64( ctx->num_str, &endp, 10 );
+ ctx->num2 = ctx->num1;
+ }
+ else
+ ctx->num2 = strtou64( ctx->num_str, &endp, 10 );
+ /* empty the source-string to be reused */
+ ctx->num_str_idx = 0;
+
+ ctx->this_is_the_first_number = true;
+ return num_gen_add_node( self, ctx->num1, ctx->num2 );
+}
+
+
+/* parse the given string and insert the found ranges
+ into the number-generator, fixes eventual overlaps */
+rc_t num_gen_parse( num_gen* self, const char* src )
+{
+ size_t i, n;
+ num_gen_parse_ctx ctx;
+ rc_t rc = 0;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcParsing, rcSelf, rcNull );
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcNull );
+
+ n = string_measure ( src, NULL );
+ if ( n == 0 )
+ return RC( rcVDB, rcNoTarg, rcParsing, rcParam, rcEmpty );
+
+ ctx.num_str_idx = 0;
+ ctx.this_is_the_first_number = true;
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ switch ( src[ i ] )
+ {
+ /* a dash switches from N1-mode into N2-mode */
+ case '-' :
+ num_gen_convert_ctx( &ctx );
+ break;
+
+ /* a comma ends a single number or a range */
+ case ',' :
+ rc = num_gen_convert_and_add_ctx( self, &ctx );
+ break;
+
+ /* in both mode add the char to the temp string */
+ default:
+ if ( ( src[i]>='0' )&&( src[i]<='9' )&&( ctx.num_str_idx < MAX_NUM_STR ) )
+ ctx.num_str[ ctx.num_str_idx++ ] = src[ i ];
+ break;
+ }
+ }
+ /* dont forget to add what is left in ctx.num_str ... */
+ if ( ctx.num_str_idx > 0 )
+ rc = num_gen_convert_and_add_ctx( self, &ctx );
+ if ( rc == 0 )
+ rc = num_gen_fix_overlaps( self, NULL );
+ return rc;
+}
+
+
+/* inserts the given ranges into the number-generator,
+ fixes eventual overlaps */
+rc_t num_gen_add( num_gen* self, const uint64_t first, const uint64_t count )
+{
+ rc_t rc;
+ uint64_t num_1 = first;
+ uint64_t num_2 = first;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcInserting, rcSelf, rcNull );
+
+ /* this is necessary because virtual columns which have a
+ infinite row-range, get reported with first=1,count=0 */
+ if ( count > 0 )
+ num_2 = ( first + count - 1 );
+ rc = num_gen_add_node( self, num_1, num_2 );
+ if ( rc == 0 )
+ rc = num_gen_fix_overlaps( self, NULL );
+ return rc;
+}
+
+
+/* helper function for range-check */
+static bool CC num_gen_check_range_start( p_num_gen_node the_node,
+ const uint64_t range_start )
+{
+ bool res = true;
+ uint64_t last_node_row = ( the_node->start + the_node->count - 1 );
+
+ if ( the_node->start < range_start )
+ {
+ the_node->start = range_start;
+ if ( the_node->start <= last_node_row )
+ {
+ the_node->count = ( last_node_row - the_node->start ) + 1;
+ }
+ else
+ {
+ /* the node becomes invalid ... */
+ the_node->start = 0;
+ the_node->count = 0;
+ res = false;
+ }
+ }
+ return res;
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_check_range_end( p_num_gen_node the_node,
+ const uint64_t last_tab_row )
+{
+ uint64_t last_node_row = ( the_node->start + the_node->count - 1 );
+
+ if ( last_node_row > last_tab_row )
+ {
+ last_node_row = last_tab_row;
+ if ( the_node->start <= last_node_row )
+ {
+ the_node->count = ( last_node_row - the_node->start ) + 1;
+ }
+ else
+ {
+ /* the node becomes invalid ... */
+ the_node->start = 0;
+ the_node->count = 0;
+ }
+ }
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_check_range_callback( void *item, void *data )
+{
+ p_num_gen_node the_node = ( p_num_gen_node )item;
+ p_num_gen_node the_range = ( p_num_gen_node )data;
+ uint64_t last_tab_row = ( the_range->start + the_range->count - 1 );
+
+ /* ignore invalid nodes... */
+ if ( the_node->start == 0 || the_node->count == 0 )
+ return;
+
+ /* check if the start value is not out of range... */
+ if ( num_gen_check_range_start( the_node, the_range->start ) )
+ num_gen_check_range_end( the_node, last_tab_row );
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_count_invalid_nodes( void *item, void *data )
+{
+ p_num_gen_node the_node = ( p_num_gen_node )item;
+ uint32_t *invalid_count = ( uint32_t * )data;
+
+ if ( ( the_node->start == 0 )&&( the_node->count == 0 ) )
+ ( *invalid_count )++;
+}
+
+
+/* helper function for range-check */
+static void CC num_gen_copy_valid_nodes( void *item, void *data )
+{
+ p_num_gen_node node = ( p_num_gen_node )item;
+ Vector *dest = ( Vector * )data;
+
+ if ( ( node->start != 0 )&&( node->count != 0 ) )
+ VectorInsert ( dest, node, NULL, num_gen_insert_helper );
+ else
+ free ( node );
+}
+
+
+/* helper function for range-check */
+static void num_gen_remove_invalid_nodes( num_gen* self )
+{
+ Vector temp_nodes;
+ uint32_t count = VectorLength( &(self->nodes) );
+
+ if ( count < 1 )
+ return;
+ /* create a temp. vector */
+ VectorInit( &temp_nodes, 0, count );
+
+ /* copy all valid nodes into the temp. vector */
+ VectorForEach ( &(self->nodes), false,
+ num_gen_copy_valid_nodes, &temp_nodes );
+
+ /* clear all nodes so far...,
+ DO NOT PASS num_gen_node_destroy into it */
+ VectorWhack( &(self->nodes), NULL, NULL );
+
+ /* initialize and copy (shallow) the valid nodes back
+ into the generator */
+ VectorCopy ( &temp_nodes, &(self->nodes) );
+
+ /* destroy the temp-vector,
+ DO NOT PASS num_gen_node_destroy into it */
+ VectorWhack ( &temp_nodes, NULL, NULL );
+}
+
+
+/* helper function for trim */
+rc_t num_gen_trim( num_gen* self, const int64_t first, const uint64_t count )
+{
+ num_gen_node trim_range;
+ uint32_t invalid_nodes = 0;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcValidating, rcSelf, rcNull );
+ if ( count == 0 )
+ return RC( rcVDB, rcNoTarg, rcValidating, rcParam, rcNull );
+
+ /* walk all nodes to check for boundaries... */
+ trim_range.start = first;
+ trim_range.count = count;
+
+ VectorForEach ( &(self->nodes), false,
+ num_gen_check_range_callback, &trim_range );
+
+ VectorForEach ( &(self->nodes), false,
+ num_gen_count_invalid_nodes, &invalid_nodes );
+ if ( invalid_nodes > 0 )
+ num_gen_remove_invalid_nodes( self );
+
+ return 0;
+}
+
+
+rc_t num_gen_make( num_gen** self )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+
+ *self = calloc( 1, sizeof( num_gen ) );
+ if ( *self == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+
+ VectorInit( &((*self)->nodes ), 0, 5 );
+ return 0;
+}
+
+
+rc_t num_gen_make_from_str( num_gen** self, const char *src )
+{
+ rc_t rc = num_gen_make( self );
+ if ( rc == 0 )
+ {
+ rc = num_gen_parse( *self, src );
+ if ( rc == 0 )
+ rc = num_gen_fix_overlaps( *self, NULL );
+ }
+ return rc;
+}
+
+
+rc_t num_gen_make_from_range( num_gen** self,
+ const int64_t first, const uint64_t count )
+{
+ rc_t rc = num_gen_make( self );
+ if ( rc != 0 )
+ return rc;
+ return num_gen_add( *self, first, count );
+}
+
+
+rc_t num_gen_clear( num_gen* self )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcClearing, rcSelf, rcNull );
+
+ if ( VectorLength( &(self->nodes) ) > 0 )
+ {
+ /* clear all nodes so far... */
+ VectorWhack( &(self->nodes), num_gen_node_destroy, NULL );
+
+ /* re-init the vector */
+ VectorInit( &(self->nodes ), 0, 5 );
+ }
+ return 0;
+}
+
+
+rc_t num_gen_destroy( num_gen* self )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+
+ VectorWhack( &(self->nodes), num_gen_node_destroy, NULL );
+ free( self );
+ return 0;
+}
+
+
+bool num_gen_empty( const num_gen* self )
+{
+ if ( self == NULL )
+ return true;
+ return ( VectorLength( &(self->nodes) ) < 1 );
+}
+
+
+typedef struct overlap_ctx
+{
+ p_num_gen_node prev;
+ uint32_t overlaps;
+} overlap_ctx;
+typedef overlap_ctx* p_overlap_ctx;
+
+
+/* static bool CC num_gen_overlap_fix_cb( void *item, void *data ) */
+static bool CC num_gen_overlap_fix_cb( void *item, void *data )
+{
+ p_num_gen_node node = ( p_num_gen_node )item;
+ p_overlap_ctx ctx = ( p_overlap_ctx )data;
+
+ /* skip invalid nodes */
+ if ( node->count ==0 || node->start == 0 || node->end == 0 )
+ return false;
+ /* if we do not have a previous node, take this one... */
+ if ( ctx->prev == NULL )
+ {
+ ctx->prev = node;
+ return false;
+ }
+ /* if we do not have an overlap,
+ take this node as prev-node and continue */
+ if ( ctx->prev->end < node->start )
+ {
+ ctx->prev = node;
+ return false;
+ }
+ /* we have a overlap, the end of the prev-node is inside
+ the current-node, we fix it by expanding the prev-node
+ to the end of this node, and later declaring this
+ node as invalid */
+ if ( ctx->prev->end < node->end )
+ {
+ ctx->prev->end = node->end;
+ ctx->prev->count = ( ctx->prev->end - ctx->prev->start ) + 1;
+ }
+ /* if the prev-node ends after this node, all we have to
+ do is declaring this node as invalid */
+ node->count = 0;
+ node->start = 0;
+ node->end = 0;
+ return true;
+}
+
+
+static rc_t num_gen_fix_overlaps( num_gen* self, uint32_t *count )
+{
+ overlap_ctx ctx;
+ bool fix_executed = false;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+
+ ctx.overlaps = 0;
+ do
+ {
+ ctx.prev = NULL;
+ fix_executed = VectorDoUntil ( &(self->nodes), false,
+ num_gen_overlap_fix_cb, &ctx );
+ } while ( fix_executed );
+
+ if ( count )
+ *count = ctx.overlaps;
+ return 0;
+}
+
+
+typedef struct string_ctx
+{
+ char *s;
+ uint32_t len;
+} string_ctx;
+typedef string_ctx* p_string_ctx;
+
+
+static void string_ctx_add( p_string_ctx ctx, char *s )
+{
+ uint32_t len = string_measure ( s, NULL );
+ if ( len > 0 )
+ {
+ if ( ctx->len == 0 )
+ ctx->s = malloc( len + 1 );
+ else
+ ctx->s = realloc( ctx->s, ctx->len + len );
+ memmove( &(ctx->s[ctx->len]), s, len );
+ ctx->len += len;
+ }
+}
+
+
+static void CC num_gen_as_string_cb( void *item, void *data )
+{
+ char temp[40];
+ p_num_gen_node node = ( p_num_gen_node )item;
+ long unsigned int start = node->start;
+ long unsigned int end = ( start + node->count - 1 );
+ switch( node->count )
+ {
+ case 0 : temp[ 0 ] = 0;
+ break;
+ case 1 : string_printf ( temp, sizeof temp, NULL, "%lu,", start );
+ break;
+ default: string_printf ( temp, sizeof temp, NULL, "%lu-%lu,", start, end );
+ break;
+ }
+ string_ctx_add( ( p_string_ctx )data, temp );
+}
+
+
+rc_t num_gen_as_string( const num_gen* self, char **s )
+{
+ string_ctx ctx;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( s == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+
+ ctx.s = NULL;
+ ctx.len = 0;
+ VectorForEach ( &(self->nodes), false, num_gen_as_string_cb, &ctx );
+ if ( ctx.len == 0 )
+ {
+ *s = NULL;
+ return RC( rcVDB, rcNoTarg, rcReading, rcData, rcEmpty );
+ }
+ ctx.s[ ctx.len ] = 0;
+ *s = ctx.s;
+ return 0;
+}
+
+
+static void CC num_gen_debug_cb( void *item, void *data )
+{
+ char temp[40];
+ p_num_gen_node node = ( p_num_gen_node )item;
+ long unsigned int start = node->start;
+ long unsigned int count = node->count;
+ string_printf ( temp, sizeof temp, NULL, "[s:%lu c:%lu]", start, count );
+ string_ctx_add( ( p_string_ctx )data, temp );
+}
+
+
+rc_t num_gen_debug( const num_gen* self, char **s )
+{
+ string_ctx ctx;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( s == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+
+ ctx.s = NULL;
+ ctx.len = 0;
+ VectorForEach ( &(self->nodes), false, num_gen_debug_cb, &ctx );
+ if ( ctx.len == 0 )
+ {
+ *s = NULL;
+ return RC( rcVDB, rcNoTarg, rcReading, rcData, rcEmpty );
+ }
+ ctx.s[ ctx.len ] = 0;
+ *s = ctx.s;
+ return 0;
+}
+
+
+static bool CC num_gen_contains_cb( void *item, void *data )
+{
+ bool res = false;
+ p_num_gen_node node = ( p_num_gen_node )item;
+ if ( node->count > 0 )
+ {
+ uint64_t *value = ( uint64_t * )data;
+ uint64_t end = node->start + node->count - 1;
+ res = ( node->start <= *value && *value <= end );
+ }
+ return res;
+}
+
+
+rc_t num_gen_contains_value( const num_gen* self, const uint64_t value )
+{
+ uint64_t temp = value;
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( VectorDoUntil ( &(self->nodes), false,
+ num_gen_contains_cb, &temp ) )
+ return 0;
+ else
+ return RC( rcVDB, rcNoTarg, rcReading, rcData, rcEmpty );
+}
+
+
+rc_t num_gen_range_check( num_gen* self,
+ const int64_t first, const uint64_t count )
+{
+ /* if the user did not specify a row-range, take all rows */
+ if ( num_gen_empty( self ) )
+ return num_gen_add( self, first, count );
+ /* if the user did specify a row-range, check the boundaries */
+ else
+ return num_gen_trim( self, first, count );
+}
+
+
+rc_t num_gen_iterator_make( const num_gen* self, const num_gen_iter **iter )
+{
+ uint32_t count;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( iter == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+
+ *iter = NULL;
+ count = VectorLength( &(self->nodes) );
+ if ( count < 1 )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+ else
+ {
+ num_gen_iter *temp = calloc( 1, sizeof( num_gen_iter ) );
+ if ( temp == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ VectorInit( &(temp->nodes), 0, count );
+ num_gen_copy_vector( &(self->nodes), &(temp->nodes ) );
+ temp->total = num_gen_total_count( &(temp->nodes ) );
+ *iter = temp;
+ }
+ return 0;
+}
+
+rc_t num_gen_iterator_destroy( const num_gen_iter *self )
+{
+ num_gen_iter *temp;
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+
+ temp = (num_gen_iter *)self;
+ VectorWhack( &(temp->nodes), num_gen_node_destroy, NULL );
+ free( temp );
+ return 0;
+}
+
+rc_t num_gen_iterator_next( const num_gen_iter* self, uint64_t* value )
+{
+ num_gen_iter* temp;
+ p_num_gen_node node;
+
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( value == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+ if ( self->curr_node >= VectorLength( &(self->nodes) ) )
+ return RC( rcVDB, rcNoTarg, rcReading, rcId, rcInvalid );
+
+ temp = ( num_gen_iter *)self;
+ *value = 0;
+ node = (p_num_gen_node)VectorGet( &(temp->nodes), temp->curr_node );
+ if ( node == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcItem, rcInvalid );
+
+ *value = node->start;
+ if ( node->count < 2 )
+ /* the node is a single-number-node, next node for next time */
+ temp->curr_node++;
+ else
+ {
+ /* the node is a number range, add the sub-position */
+ *value += temp->curr_node_sub_pos++;
+ /* if the sub-positions are use up, switch to next node */
+ if ( temp->curr_node_sub_pos >= node->count )
+ {
+ temp->curr_node++;
+ temp->curr_node_sub_pos = 0;
+ }
+ }
+ (temp->progress)++;
+ return 0;
+}
+
+
+rc_t num_gen_iterator_count( const num_gen_iter* self, uint64_t* count )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( count == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+ *count = self->total;
+ return 0;
+}
+
+
+rc_t num_gen_iterator_percent( const num_gen_iter* self,
+ const uint8_t fract_digits,
+ uint32_t* value )
+{
+ uint32_t factor = 100;
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcSelf, rcNull );
+ if ( value == NULL )
+ return RC( rcVDB, rcNoTarg, rcReading, rcParam, rcNull );
+ if ( fract_digits > 0 )
+ {
+ if ( fract_digits > 1 )
+ factor = 10000;
+ else
+ factor = 1000;
+ }
+
+ if ( self->total > 0 )
+ {
+ if ( self->progress >= self->total )
+ *value = factor;
+ else
+ {
+ uint64_t temp = self->progress;
+ temp *= factor;
+ temp /= self->total;
+ *value = (uint16_t) temp;
+ }
+ }
+ else
+ *value = 0;
+ return 0;
+}
diff --git a/tools/vdb-copy/num-gen.h b/tools/vdb-copy/num-gen.h
new file mode 100644
index 0000000..5b0324f
--- /dev/null
+++ b/tools/vdb-copy/num-gen.h
@@ -0,0 +1,225 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_num_gen_
+#define _h_num_gen_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+
+/*--------------------------------------------------------------------------
+ * A NUMBER GENERATOR
+ *
+ * input : string, for instance "3,6,8,12,44-49"
+ * ouptut: sequence of integers, for instance 3,6,8,12,44,45,46,47,48,49
+ */
+
+
+/*--------------------------------------------------------------------------
+ * opaque number-generator and it's iterator
+ */
+typedef struct num_gen num_gen;
+typedef struct num_gen_iter num_gen_iter;
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_make
+ *
+ * creates a empty number-generator
+ * or creates a number-generator and parses the string
+ * or creates and presets it with a range
+ */
+rc_t num_gen_make( num_gen** self );
+rc_t num_gen_make_from_str( num_gen** self, const char *src );
+rc_t num_gen_make_from_range( num_gen** self,
+ const int64_t first, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_destroy
+ *
+ * destroys a number-generator
+ */
+rc_t num_gen_destroy( num_gen* self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_clear
+ *
+ * resets a number-generator, to be empty just like after num_gen_make()
+ */
+rc_t num_gen_clear( num_gen* self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_parse
+ *
+ * parses a given string in this form: "3,6,8,12,44-49"
+ * does not clear the number-generator before parsing
+ * eventual overlaps with the previous content are consolidated
+ */
+rc_t num_gen_parse( num_gen* self, const char* src );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_add
+ *
+ * inserts the given interval into the number-generator
+ *
+ * num_gen_add( *g, 10, 30 )
+ * is equivalent to:
+ * num_gen_parse( *g, "10-39" );
+ *
+ * eventual overlaps with the previous content are consolidated
+ */
+rc_t num_gen_add( num_gen* self, const uint64_t first, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_trim
+ *
+ * checks if the content of the number-generator is inside the given interval
+ * removes or shortens internal nodes if necessary
+ */
+rc_t num_gen_trim( num_gen* self, const int64_t first, const uint64_t count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_empty
+ *
+ * checks if the generator has no ranges defined
+ */
+bool num_gen_empty( const num_gen* self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_as_string
+ *
+ * allocates a string that contains the generator as text
+ * *s = "1-5,20,24-25"
+ * caller has to free the string
+ */
+rc_t num_gen_as_string( const num_gen* self, char **s );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_debug
+ *
+ * allocates a string that contains the internal intervals as text
+ * *s = "[s:1 c:5][s:20 c:1][s:24 c:2]"
+ * [s...start-value c:count]
+ * caller has to free the string
+ */
+rc_t num_gen_debug( const num_gen* self, char **s );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_contains_value
+ *
+ * checks if the generator contains the given value
+ */
+rc_t num_gen_contains_value( const num_gen* self, const uint64_t value );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_range_check
+ *
+ * if the generator is empty --> set it to the given range
+ * if it is not empty ---------> trim it to the given range
+ */
+rc_t num_gen_range_check( num_gen* self,
+ const int64_t first, const uint64_t count );
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_make
+ *
+ * creates a iterator from the number-generator
+ * the iterator contains a constant copy of the number-ranges
+ * after this call it is safe to destroy or change the number-generator
+ * returns an error-code if the number-generator was empty,
+ * and *iter will be NULL
+ */
+rc_t num_gen_iterator_make( const num_gen* self, const num_gen_iter **iter );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_destroy
+ *
+ * destroys the iterator
+ */
+rc_t num_gen_iterator_destroy( const num_gen_iter *self );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_count
+ *
+ * returns how many values the iterator contains
+ */
+rc_t num_gen_iterator_count( const num_gen_iter* self, uint64_t* count );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_next
+ *
+ * pulls the next value out of the iterator...
+ * returns an error-code if the iterator has no more values
+ */
+rc_t num_gen_iterator_next( const num_gen_iter* self, uint64_t* value );
+
+
+/*--------------------------------------------------------------------------
+ * num_gen_iterator_percent
+ *
+ * return in value the percentage of the iterator...
+ * depending on fract-digits the percentage will be:
+ * fract_digits = 0 ... full percent's
+ * fract_digits = 1 ... 1/10-th of a percent
+ * fract_digits = 2 ... 1/100-th of a percent
+ */
+rc_t num_gen_iterator_percent( const num_gen_iter* self,
+ const uint8_t fract_digits,
+ uint32_t* value );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/redactval.c b/tools/vdb-copy/redactval.c
new file mode 100644
index 0000000..66452ac
--- /dev/null
+++ b/tools/vdb-copy/redactval.c
@@ -0,0 +1,230 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "redactval.h"
+
+#include "helper.h"
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+void redact_buf_init( redact_buffer * rbuf )
+{
+ rbuf->buffer = NULL;
+ rbuf->buffer_len = 0;
+}
+
+
+void redact_buf_free( redact_buffer * rbuf )
+{
+ if ( rbuf->buffer != NULL )
+ {
+
+ free( rbuf->buffer );
+ rbuf->buffer = NULL;
+ rbuf->buffer_len = 0;
+ }
+}
+
+
+rc_t redact_buf_resize( redact_buffer * rbuf, const size_t new_size )
+{
+ rc_t rc = 0;
+ if ( rbuf->buffer_len < new_size || rbuf->buffer == NULL )
+ {
+ /* allocate or re-allocate the buffer */
+ if ( rbuf->buffer_len == 0 )
+ rbuf->buffer = malloc( new_size );
+ else
+ rbuf->buffer = realloc( rbuf->buffer, new_size );
+
+ /* exit */
+ if ( rbuf->buffer == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ rbuf->buffer_len = new_size;
+ }
+ return rc;
+}
+
+
+/* allocate a redact-value */
+static p_redact_val redact_val_init( const char* name,
+ const uint32_t len,
+ const char* value )
+{
+ p_redact_val res = NULL;
+ if ( name == NULL ) return res;
+ if ( name[0] == 0 ) return res;
+ res = calloc( 1, sizeof( redact_val ) );
+ if ( res == NULL ) return res;
+ res->name = string_dup_measure ( name, NULL );
+ res->len = len;
+ res->value = NULL;
+ if ( value != NULL )
+ {
+ if ( value[0] == '\'' && value[2] == '\'' )
+ {
+ res->value = malloc( sizeof value[0] );
+ if ( res->value )
+ {
+ res->len = 1;
+ *( ( char * )res->value ) = value[1];
+ }
+ }
+ else
+ {
+ char *endptr;
+ uint64_t x = strtou64( value, &endptr, 0 );
+ if ( res->len > sizeof x )
+ res->len = sizeof x;
+ res->value = malloc( len );
+ if ( res->value )
+ memmove( res->value, &x, res->len );
+ }
+ }
+ return res;
+}
+
+
+void redact_val_fill_buffer( const p_redact_val r_val,
+ redact_buffer * rbuf,
+ const size_t buffsize )
+{
+ size_t idx;
+ char * dst = rbuf->buffer;
+ for ( idx = 0; idx < buffsize; idx += r_val->len )
+ {
+ size_t l = r_val->len;
+ if ( ( idx + l ) > buffsize ) l = ( buffsize - idx );
+ memmove( dst, r_val->value, l );
+ dst += l;
+ }
+}
+
+
+static void CC redact_val_destroy_node( void* node, void* data )
+{
+ p_redact_val r_val = (p_redact_val)node;
+ if ( r_val != NULL )
+ {
+ if ( r_val->name != NULL )
+ free( r_val->name );
+ if ( r_val->value != NULL )
+ free( r_val->value );
+ free( r_val );
+ }
+}
+
+
+/*
+ * initializes a redact-val-list
+*/
+rc_t redact_vals_init( redact_vals** vals )
+{
+ if ( vals == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ (*vals) = calloc( 1, sizeof( redact_vals ) );
+ if ( *vals == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ VectorInit( &((*vals)->vals), 0, 5 );
+ return 0;
+}
+
+
+/*
+ * destroys the redact-val-list
+*/
+rc_t redact_vals_destroy( redact_vals* vals )
+{
+ if ( vals == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+ VectorWhack( &(vals->vals), redact_val_destroy_node, NULL );
+ free( vals );
+ return 0;
+}
+
+
+/*
+ * adds a entry into the redact-val-list
+*/
+rc_t redact_vals_add( redact_vals* vals, const char* name,
+ const uint32_t len, const char* value )
+{
+ rc_t rc;
+ p_redact_val new_val = redact_val_init( name, len, value );
+ if ( new_val == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcParsing, rcMemory, rcExhausted );
+ else
+ rc = VectorAppend( &(vals->vals), NULL, new_val );
+ return rc;
+}
+
+
+/*
+ * returns a pointer to a redact-value by type-name
+*/
+p_redact_val redact_vals_get_by_name( const redact_vals* vals,
+ const char * name )
+{
+ p_redact_val res = NULL;
+ uint32_t idx, len;
+ if ( vals == NULL || name == NULL || name[0] == 0 )
+ return res;
+
+ len = VectorLength( &(vals->vals) );
+ for ( idx = 0; idx < len && res == NULL; ++idx )
+ {
+ p_redact_val item = (p_redact_val) VectorGet ( &(vals->vals), idx );
+ if ( nlt_strcmp( item->name, name ) == 0 )
+ res = item;
+ }
+ return res;
+}
+
+/*
+ * returns a pointer to a redact-value by type-cast
+*/
+p_redact_val redact_vals_get_by_cast( const redact_vals* vals,
+ const char * cast )
+{
+ uint32_t idx;
+ p_redact_val res = NULL;
+ char * name;
+ if ( vals == NULL || cast == NULL || cast[0] == 0 )
+ return res;
+
+ name = string_dup_measure ( cast, NULL );
+ for ( idx = 0; name[idx] != 0; ++idx )
+ if ( name[idx] == ')' ) name[idx] = 0;
+ res = redact_vals_get_by_name( vals, &(name[1]) );
+ free( name );
+ return res;
+}
diff --git a/tools/vdb-copy/redactval.h b/tools/vdb-copy/redactval.h
new file mode 100644
index 0000000..b3e4360
--- /dev/null
+++ b/tools/vdb-copy/redactval.h
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_redactval_
+#define _h_vdb_redactval_
+
+#ifndef _h_vdb_copy_includes_
+#include "vdb-copy-includes.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/********************************************************************
+ redact_buffer is a pointer and a size...
+********************************************************************/
+typedef struct redact_buffer
+{
+ void * buffer;
+ uint32_t buffer_len;
+} redact_buffer;
+typedef redact_buffer* p_redact_buffer;
+
+
+void redact_buf_init( redact_buffer * rbuf );
+void redact_buf_free( redact_buffer * rbuf );
+rc_t redact_buf_resize( redact_buffer * rbuf, const size_t new_size );
+
+/********************************************************************
+ redact_val is a mapping of typename to its redaction-value
+********************************************************************/
+typedef struct redact_val
+{
+ char *name; /* the name of the type */
+ uint32_t len; /* the length of the value */
+ void * value; /* pointer to the value of length len */
+} redact_val;
+typedef redact_val* p_redact_val;
+
+
+/********************************************************************
+ vector of redact-values
+********************************************************************/
+typedef struct redact_vals
+{
+ Vector vals;
+} redact_vals;
+typedef redact_vals* p_redact_vals;
+
+
+/*
+ * fills a buffer with the value found in a redact-val-struct
+*/
+void redact_val_fill_buffer( const p_redact_val r_val,
+ redact_buffer * rbuf,
+ const size_t buffsize );
+
+
+/*
+ * initializes a redact-val-list
+*/
+rc_t redact_vals_init( redact_vals** vals );
+
+
+/*
+ * destroys the redact-val-list
+*/
+rc_t redact_vals_destroy( redact_vals* vals );
+
+
+/*
+ * adds a entry into the redact-val-list
+*/
+rc_t redact_vals_add( redact_vals* vals, const char* name,
+ const uint32_t len, const char* value );
+
+
+/*
+ * returns a pointer to a redact-value by name
+*/
+p_redact_val redact_vals_get_by_name( const redact_vals* vals,
+ const char * name );
+
+
+/*
+ * returns a pointer to a redact-value by type-cast
+*/
+p_redact_val redact_vals_get_by_cast( const redact_vals* vals,
+ const char * cast );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/type_matcher.c b/tools/vdb-copy/type_matcher.c
new file mode 100644
index 0000000..743fda0
--- /dev/null
+++ b/tools/vdb-copy/type_matcher.c
@@ -0,0 +1,850 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "vdb-copy-includes.h"
+#include "matcher_input.h"
+#include "helper.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+
+/* internal definition of a type to be matched */
+typedef struct mtype
+{
+ char *name;
+ uint32_t dflt; /* 0=yes, 1=no (this way for re-ordering) */
+ uint32_t order;
+ uint32_t lossy_score;
+ VTypedecl type_decl;
+ VTypedesc type_desc;
+} mtype;
+typedef mtype* p_mtype;
+
+
+/* internal definition of a pair of source- and dest-type */
+typedef struct mpair
+{
+ p_mtype src;
+ p_mtype dst;
+ uint32_t compatible; /* 0=yes, 1=no (this way for re-ordering) */
+ uint32_t distance;
+} mpair;
+typedef mpair* p_mpair;
+
+
+/* internal definition of a column */
+typedef struct mcol
+{
+ char *name;
+ uint32_t src_idx; /* index of this column relative to the
+ read-cursor */
+
+ uint32_t dst_idx; /* index of this column relative to the
+ write-cursor */
+
+ bool excluded; /* for excludes via config-file */
+
+ bool to_copy; /* this column has a correspondig column
+ in the list of writable columns of the
+ destination-schema with writable types */
+
+ VTypedecl type_decl; /* type-decl of this column via read-schema */
+ VTypedesc type_desc; /* type-desc of this column via read-schema */
+
+ Vector src_types; /* list of src-types */
+ Vector dst_types; /* list of dst-types */
+ Vector pairs; /* list of (src->dst)-pairs... */
+
+ /* the src->dst type-pair, that won the type-matching-procedure */
+ p_mpair type_cast;
+} mcol;
+typedef mcol* p_mcol;
+
+
+/* internal definition of the matcher */
+typedef struct matcher
+{
+ Vector mcols;
+} matcher;
+typedef matcher* p_matcher;
+
+
+/* allocate a type-pair */
+static p_mpair matcher_init_pair( const p_mtype src,
+ const p_mtype dst )
+{
+ p_mpair res = NULL;
+ if ( src == NULL ) return res;
+ if ( dst == NULL ) return res;
+ res = calloc( 1, sizeof( mpair ) );
+ if ( res != NULL )
+ {
+ res->src = src;
+ res->dst = dst;
+ }
+ return res;
+}
+
+
+/* destroys a type-pair */
+static void CC matcher_destroy_pair( void* node, void* data )
+{
+ p_mpair pair = (p_mpair)node;
+ if ( pair != NULL )
+ free( pair );
+}
+
+
+/* allocate a m-type definition */
+static p_mtype matcher_init_type( const char* name,
+ const bool dflt,
+ const uint32_t order )
+{
+ p_mtype res = NULL;
+ if ( name == NULL ) return res;
+ if ( name[0] == 0 ) return res;
+ res = calloc( 1, sizeof( mtype ) );
+ if ( res != NULL )
+ {
+ res->name = string_dup_measure ( name, NULL );
+ res->dflt = ( dflt ? 0 : 1 );
+ res->order = order;
+ }
+ return res;
+}
+
+
+/* destroys a m-type definition */
+static void CC matcher_destroy_type( void* node, void* data )
+{
+ p_mtype type = (p_mtype)node;
+ if ( type != NULL )
+ {
+ if ( type->name != NULL )
+ free( type->name );
+ free( type );
+ }
+}
+
+
+/* allocate a matcher-column */
+static p_mcol matcher_make_col( const char* name )
+{
+ p_mcol res = NULL;
+ if ( name == NULL ) return res;
+ if ( name[0] == 0 ) return res;
+ res = calloc( 1, sizeof( mcol ) );
+ /* because of calloc all members are zero! */
+ if ( res != NULL )
+ {
+ res->name = string_dup_measure ( name, NULL );
+ VectorInit( &(res->src_types), 0, 3 );
+ VectorInit( &(res->dst_types), 0, 3 );
+ VectorInit( &(res->pairs), 0, 6 );
+ res->type_cast = NULL;
+ }
+ return res;
+}
+
+
+/* destroys a matcher-column */
+static void CC matcher_destroy_col( void* node, void* data )
+{
+ p_mcol col = (p_mcol)node;
+ if ( col == NULL ) return;
+ if ( col->name != NULL )
+ free( col->name );
+ VectorWhack( &(col->src_types), matcher_destroy_type, NULL );
+ VectorWhack( &(col->dst_types), matcher_destroy_type, NULL );
+ VectorWhack( &(col->pairs), matcher_destroy_pair, NULL );
+ free( col );
+}
+
+
+/* initializes the matcher */
+rc_t matcher_init( matcher** self )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ (*self) = calloc( 1, sizeof( matcher ) );
+ if ( *self == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ VectorInit( &((*self)->mcols), 0, 5 );
+ return 0;
+}
+
+
+/* destroys the matcher */
+rc_t matcher_destroy( matcher* self )
+{
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+ VectorWhack( &(self->mcols), matcher_destroy_col, NULL );
+ free( self );
+ return 0;
+}
+
+
+static p_mcol matcher_find_col( const matcher* self, const char *name )
+{
+ p_mcol res = NULL;
+ uint32_t idx, count;
+ count = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < count && res == NULL; ++idx )
+ {
+ p_mcol col = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( col != NULL )
+ if ( nlt_strcmp( col->name, name ) == 0 )
+ res = col;
+ }
+ return res;
+}
+
+
+static char * matcher_get_col_cast( const p_mcol col, const char *s_type )
+{
+ char * res;
+ size_t idx;
+ uint32_t len = string_measure ( col->name, NULL ) + 4;
+ len += string_measure ( s_type, NULL );
+ res = malloc( len );
+ if ( res == NULL ) return res;
+ res[ 0 ] = '(';
+ idx = string_copy_measure ( &(res[ 1 ]), len-1, s_type );
+ res[ idx + 1 ] = ')';
+ string_copy_measure ( &(res[ idx + 2 ]), len-(idx+2), col->name );
+ return res;
+}
+
+
+/* makes a typecast-string for the src/dest-table by column-name */
+static rc_t matcher_get_cast( const matcher* self, const char *name,
+ const bool src, char **cast )
+{
+ p_mcol col;
+ if ( self == NULL )
+ return RC( rcVDB, rcNoTarg, rcSearching, rcSelf, rcNull );
+ if ( cast == NULL || name == NULL )
+ return RC( rcVDB, rcNoTarg, rcSearching, rcParam, rcNull );
+ *cast = NULL;
+ col = matcher_find_col( self, name );
+ if ( col == NULL ) return 0;
+
+ if ( col->type_cast == NULL )
+ {
+ /* if the column has no match, just use the undecorated column-name*/
+ if ( src )
+ *cast = string_dup_measure ( col->name, NULL );
+ else
+ {
+ if ( col->to_copy && !col->excluded )
+ *cast = string_dup_measure ( col->name, NULL );
+ }
+ }
+ else
+ {
+ /* if the column has a match, construct the type-cast*/
+ if ( src )
+ *cast = matcher_get_col_cast( col, col->type_cast->src->name );
+ else
+ {
+ if ( col->to_copy && !col->excluded )
+ *cast = matcher_get_col_cast( col, col->type_cast->dst->name );
+ }
+ }
+ return 0;
+}
+
+
+/* makes a typecast-string for the source-table by column-name */
+rc_t matcher_src_cast( const matcher* self, const char *name, char **cast )
+{
+ return matcher_get_cast( self, name, true, cast );
+}
+
+
+/* makes a typecast-string for the destination-table by column-name */
+rc_t matcher_dst_cast( const matcher* self, const char *name, char **cast )
+{
+ return matcher_get_cast( self, name, false, cast );
+}
+
+
+static bool match_type_with_id_vector( const VSchema * s,
+ const VTypedecl * td, const Vector * id_vector )
+{
+ bool res = false;
+ uint32_t idx, len;
+
+ len = VectorLength( id_vector );
+ for ( idx = 0; idx < len && !res; ++idx )
+ {
+ uint32_t *id = (uint32_t *) VectorGet ( id_vector, idx );
+ if ( id != NULL )
+ {
+ VTypedecl cast;
+ uint32_t distance;
+ res = VTypedeclToType ( td, s, *id, &cast, &distance );
+ }
+ }
+ return res;
+}
+
+/* checks if a column with the given name has at least one type
+ that is also in the given typelist... */
+bool matcher_src_has_type( const matcher* self, const VSchema * s,
+ const char *name, const Vector *id_vector )
+{
+ bool res = false;
+ p_mcol col;
+ VTypedecl td;
+
+ if ( self == NULL || s == NULL || name == NULL || id_vector == NULL )
+ return res;
+ col = matcher_find_col( self, name );
+ if ( col == NULL ) return res; /* column not found */
+ if ( col->type_cast == NULL ) return res; /* column has no typecast */
+
+ /* we use the destination-type-cast */
+ if ( VSchemaResolveTypedecl ( s, &td, "%s", col->type_cast->dst->name ) == 0 )
+ res = match_type_with_id_vector( s, &td, id_vector );
+/*
+ if ( res )
+ KOutMsg( "redact-type found on (%s)%s\n", col->type_cast->dst->name, name );
+*/
+ return res;
+}
+
+static void matcher_report_types( const char * s, const Vector *v )
+{
+ uint32_t idx, len;
+ len = VectorLength( v );
+ if ( len > 0 )
+ {
+ KOutMsg( "%s: ", s );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_mtype item = (p_mtype) VectorGet ( v, idx );
+ if ( item != NULL )
+ KOutMsg( "[ %s ] ", item->name );
+ }
+ KOutMsg( "\n" );
+ }
+}
+
+
+static void matcher_report_pair( const p_mpair pair )
+{
+ if ( pair->src == NULL || pair->dst == NULL )
+ return;
+ if ( pair->compatible == 0 )
+ KOutMsg( "[%s](l=%u/o=%u/d=%u) --> [%s] (c) dist=%u\n",
+ pair->src->name,
+ pair->src->lossy_score, pair->src->order, pair->src->dflt,
+ pair->dst->name, pair->distance );
+ else
+ KOutMsg( "[%s](l=%u/o=%u/d=%u) --> [%s] dist=%u\n",
+ pair->src->name,
+ pair->src->lossy_score, pair->src->order, pair->src->dflt,
+ pair->dst->name, pair->distance );
+}
+
+
+static void matcher_report_pairs( const Vector *v )
+{
+ uint32_t idx, len;
+ len = VectorLength( v );
+ for ( idx = 0; idx < len; ++idx )
+ matcher_report_pair( (p_mpair) VectorGet ( v, idx ) );
+}
+
+
+static void matcher_report_col( const p_mcol item )
+{
+ KOutMsg( "----------------------------------\n" );
+ if ( item->to_copy )
+ KOutMsg( "col: %s (c)\n", item->name );
+ else
+ KOutMsg( "col: %s\n", item->name );
+ matcher_report_types( " src", &(item->src_types ) );
+ matcher_report_types( " dst", &(item->dst_types ) );
+ matcher_report_pairs( &(item->pairs ) );
+ KOutMsg( "\n" );
+}
+
+
+rc_t matcher_report( matcher* self, const bool only_copy_columns )
+{
+ uint32_t idx, len;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_mcol item = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( item != NULL )
+ {
+ if ( only_copy_columns )
+ {
+ if ( item->to_copy )
+ matcher_report_col( item );
+ }
+ else
+ matcher_report_col( item );
+ }
+ }
+ return 0;
+}
+
+
+static rc_t matcher_append_type( const char *name, const bool dflt,
+ const uint32_t order,
+ const VSchema *schema, Vector *v )
+{
+ rc_t rc = 0;
+ p_mtype t = matcher_init_type( name, dflt, order );
+ if ( t == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcMemory, rcExhausted );
+ if ( rc == 0 )
+ {
+ rc = VectorAppend( v, NULL, t );
+ if ( rc == 0 )
+ {
+ rc = VSchemaResolveTypedecl( schema, &(t->type_decl), "%s", name );
+ if ( rc == 0 )
+ {
+ rc = VSchemaDescribeTypedecl( schema, &(t->type_desc), &(t->type_decl) );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t matcher_read_col_src_types( p_mcol col,
+ const KNamelist *names, const uint32_t dflt_idx, const VSchema *schema )
+{
+ uint32_t count;
+ rc_t rc = KNamelistCount( names, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *name;
+ rc = KNamelistGet( names, idx, &name );
+ if ( rc == 0 )
+ rc = matcher_append_type( name, ( idx == dflt_idx ), idx,
+ schema, &(col->src_types) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t matcher_read_src_types( matcher* self, const VTable *table,
+ const VSchema *schema )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( table == NULL || schema == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_mcol item = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( item != NULL )
+ {
+ uint32_t dflt_idx;
+ KNamelist *names;
+ rc = VTableListReadableDatatypes( table, item->name, &dflt_idx, &names );
+ if ( rc == 0 )
+ {
+ rc = matcher_read_col_src_types( item, names, dflt_idx, schema );
+ KNamelistRelease( names );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t matcher_read_dst_types( matcher* self, const VTable *table,
+ const VSchema *schema )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( table == NULL || schema == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_mcol item = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( item != NULL )
+ {
+ KNamelist *names;
+ rc = VTableListWritableDatatypes ( (VTable*)table, item->name, &names );
+ if ( rc == 0 )
+ {
+ uint32_t type_count;
+ rc = KNamelistCount( names, &type_count );
+ if ( rc == 0 && type_count > 0 )
+ {
+ uint32_t type_idx;
+ item->to_copy = true; /* !!! this column has to be copied */
+ for ( type_idx = 0; type_idx < type_count && rc == 0; ++type_idx )
+ {
+ const char *name;
+ rc = KNamelistGet( names, type_idx, &name );
+ if ( rc == 0 )
+ rc = matcher_append_type( name, false, idx,
+ schema, &(item->dst_types) );
+ }
+ }
+ KNamelistRelease( names );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t matcher_make_column_matrix( p_mcol col )
+{
+ rc_t rc = 0;
+ uint32_t src_idx, src_len;
+
+ src_len = VectorLength( &(col->src_types) );
+ for ( src_idx = 0; src_idx < src_len && rc == 0; ++src_idx )
+ {
+ p_mtype src_type = (p_mtype) VectorGet ( &(col->src_types), src_idx );
+ if ( src_type )
+ {
+ uint32_t dst_idx, dst_len;
+ dst_len = VectorLength( &(col->dst_types) );
+ for ( dst_idx = 0; dst_idx < dst_len && rc == 0; ++dst_idx )
+ {
+ p_mtype dst_type = (p_mtype) VectorGet ( &(col->dst_types), dst_idx );
+ if ( dst_type )
+ {
+ p_mpair pair = matcher_init_pair( src_type, dst_type );
+ if ( pair != NULL )
+ rc = VectorAppend( &(col->pairs), NULL, pair );
+ else
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t matcher_make_type_matrix( matcher* self )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len && rc == 0; ++idx )
+ {
+ p_mcol col = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( col != NULL )
+ if ( col->to_copy )
+ rc = matcher_make_column_matrix( col );
+ }
+ return rc;
+}
+
+
+static int64_t CC matcher_match_cb( const void ** p1, const void ** p2, void *data )
+{
+ int64_t res = 0;
+ const p_mpair pair_1 = (p_mpair)(*p1);
+ const p_mpair pair_2 = (p_mpair)(*p2);
+ if ( pair_1 == NULL || pair_2 == NULL )
+ return res;
+ /* first we order by compatibility */
+ res = (int64_t)( pair_1->compatible ) - (int64_t)( pair_2->compatible );
+ if ( res == 0 )
+ {
+ /* second we order by lossy-ness, lowest value first */
+ res = ( pair_1->src->lossy_score ) - ( pair_2->src->lossy_score );
+ if ( res == 0 )
+ {
+ /* if the lossy-ness is the same, we order by distance */
+ res = (int64_t)( pair_1->distance ) - (int64_t)( pair_2->distance );
+ if ( res == 0 )
+ {
+ /* if the distance is the same, we order by default-value */
+ res = (int64_t)( pair_1->src->dflt ) - (int64_t)( pair_2->src->dflt );
+ if ( res == 0 )
+ /* if there is not default-value, we use the org. order */
+ res = (int64_t)( pair_1->src->order ) - (int64_t)( pair_2->src->order );
+ }
+ }
+ }
+ return res;
+}
+
+
+static void CC matcher_enter_type_score_cb( void * item, void * data )
+{
+ p_mtype type = (p_mtype)item;
+ const KConfig *cfg = (const KConfig *)data;
+ if ( type != NULL && cfg != NULL )
+ type->lossy_score = helper_rd_type_score( cfg, type->name );
+}
+
+
+static void CC matcher_measure_dist_cb( void * item, void * data )
+{
+ p_mpair pair = (p_mpair)item;
+ const VSchema *schema = (const VSchema *)data;
+ if ( pair != NULL && schema != NULL )
+ {
+ bool compatible = VTypedeclCommonAncestor ( &(pair->src->type_decl),
+ schema, &(pair->dst->type_decl), NULL, &(pair->distance) );
+ pair->compatible = ( compatible ? 0 : 1 );
+ }
+}
+
+
+static void matcher_match_column( p_mcol col,
+ const VSchema *schema, const KConfig *cfg )
+{
+ uint32_t pair_count = VectorLength( &(col->pairs) );
+
+ col->type_cast = NULL;
+ if ( col->excluded ) return;
+
+ /* call VTypedeclCommonAncestor for every type-pair */
+ VectorForEach ( &(col->pairs), false,
+ matcher_measure_dist_cb, (void*)schema );
+ /* if we have more than one pair left... */
+ if ( pair_count > 1 )
+ {
+ /* enter the lossy-ness into the src-types... */
+ VectorForEach ( &(col->src_types), false,
+ matcher_enter_type_score_cb, (void*)cfg );
+
+ /* reorder the remaining pair's by:
+ compatibility, lossy-ness, distance, default, order */
+ VectorReorder ( &(col->pairs), matcher_match_cb, NULL );
+ }
+
+ /* pick the winner = first item in the vector */
+ if ( pair_count > 0 )
+ {
+ col->type_cast = (p_mpair)VectorFirst ( &(col->pairs) );
+ /* if the winner is not a compatible pair, we have no cast ! */
+ if ( col->type_cast->compatible != 0 )
+ col->type_cast = NULL;
+ }
+}
+
+
+static rc_t matcher_match_matrix( matcher* self,
+ const VSchema *schema, const KConfig *cfg )
+{
+ rc_t rc = 0;
+ uint32_t idx, len;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( schema == NULL || cfg == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_mcol col = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( col != NULL )
+ if ( col->to_copy )
+ matcher_match_column( col, schema, cfg );
+ }
+ return rc;
+}
+
+
+static rc_t matcher_build_column_vector( matcher* self, const char * columns )
+{
+ const KNamelist *list;
+ uint32_t count, idx;
+ rc_t rc = nlt_make_namelist_from_string( &list, columns );
+ if ( rc != 0 ) return rc;
+ rc = KNamelistCount( list, &count );
+ if ( rc == 0 )
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( list, idx, &s );
+ if ( rc == 0 )
+ {
+ p_mcol new_col = matcher_make_col( s );
+ if ( new_col == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcMemory, rcExhausted );
+ if ( rc == 0 )
+ rc = VectorAppend( &(self->mcols), NULL, new_col );
+ }
+ }
+ KNamelistRelease( list );
+ return rc;
+}
+
+
+static rc_t matcher_exclude_columns( matcher* self, const char * columns )
+{
+ const KNamelist *list;
+ uint32_t len, idx;
+ rc_t rc;
+
+ if ( columns == NULL ) return 0;
+ rc = nlt_make_namelist_from_string( &list, columns );
+ len = VectorLength( &(self->mcols) );
+ for ( idx = 0; idx < len; ++idx )
+ {
+ p_mcol col = (p_mcol) VectorGet ( &(self->mcols), idx );
+ if ( col != NULL )
+ col->excluded = nlt_is_name_in_namelist( list, col->name );
+ }
+ KNamelistRelease( list );
+ return rc;
+}
+
+
+rc_t matcher_execute( matcher* self, const p_matcher_input in )
+{
+ VSchema * dflt_schema;
+ const VTable * src_table;
+ rc_t rc;
+
+ if ( self == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ if ( in->manager == NULL || in->add_schemas == NULL ||
+ in->cfg == NULL || in->columns == NULL ||
+ in->src_path == NULL || in->dst_path == NULL ||
+ in->dst_tabname == NULL )
+ return RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+
+ rc = matcher_build_column_vector( self, in->columns );
+ if ( rc != 0 ) return rc;
+
+ rc = matcher_exclude_columns( self, in->excluded_columns );
+ if ( rc != 0 ) return rc;
+
+ rc = helper_parse_schema( in->manager, &dflt_schema, in->add_schemas );
+ if ( rc != 0 ) return rc;
+
+ rc = VDBManagerOpenTableRead( in->manager, &src_table, dflt_schema, "%s", in->src_path );
+ if ( rc == 0 )
+ {
+ const VSchema * src_schema;
+ rc = VTableOpenSchema ( src_table, &src_schema );
+ if ( rc == 0 )
+ {
+ rc = matcher_read_src_types( self, src_table, src_schema );
+ if ( rc == 0 )
+ {
+ if ( in->legacy_schema != NULL )
+ rc = VSchemaParseFile ( dflt_schema, "%s", in->legacy_schema );
+ if ( rc == 0 )
+ {
+ VTable * dst_table;
+ KCreateMode cmode = kcmParents;
+ const VSchema * dst_schema = src_schema;
+
+ if ( in->legacy_schema != NULL )
+ dst_schema = dflt_schema;
+
+ if ( in->force_unlock )
+ VDBManagerUnlock ( in->manager, "%s", in->dst_path );
+
+ if ( in->force_kcmInit )
+ cmode |= kcmInit;
+ else
+ cmode |= kcmCreate;
+
+ rc = VDBManagerCreateTable( in->manager, &dst_table,
+ dst_schema, in->dst_tabname, cmode, "%s", in->dst_path );
+
+ if ( rc == 0 )
+ {
+ rc = matcher_read_dst_types( self, dst_table, dst_schema );
+ if ( rc == 0 )
+ {
+ rc = matcher_make_type_matrix( self );
+ if ( rc == 0 )
+ rc = matcher_match_matrix( self, src_schema, in->cfg );
+ }
+ VTableRelease( dst_table );
+ if ( !(in->force_kcmInit) )
+ KDirectoryRemove ( in->dir, true, "%s", in->dst_path );
+ }
+ }
+ }
+ VSchemaRelease( src_schema );
+ }
+ VTableRelease( src_table );
+ }
+ VSchemaRelease( dflt_schema );
+ return rc;
+}
+
+
+rc_t matcher_db_execute( matcher* self, const VTable * src_tab, VTable * dst_tab,
+ const VSchema * schema, const char * columns,
+ const char * kfg_path )
+{
+ KConfig * cfg;
+ rc_t rc = helper_make_config_mgr( &cfg, kfg_path );
+ if ( rc == 0 )
+ {
+ rc = matcher_build_column_vector( self, columns );
+ if ( rc != 0 ) return rc;
+
+ rc = matcher_read_src_types( self, src_tab, schema );
+ if ( rc == 0 )
+ {
+ rc = matcher_read_dst_types( self, dst_tab, schema );
+ if ( rc == 0 )
+ {
+ rc = matcher_make_type_matrix( self );
+ if ( rc == 0 )
+ rc = matcher_match_matrix( self, schema, cfg );
+ }
+ }
+ KConfigRelease( cfg );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/type_matcher.h b/tools/vdb-copy/type_matcher.h
new file mode 100644
index 0000000..bf64ea5
--- /dev/null
+++ b/tools/vdb-copy/type_matcher.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_type_matcher_
+#define _h_type_matcher_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_matcher_input_
+#include "matcher_input.h"
+#endif
+
+typedef struct matcher matcher;
+
+/* initializes the matcher */
+rc_t matcher_init( matcher** self );
+
+/* destroys the matcher */
+rc_t matcher_destroy( matcher* self );
+
+/* shows the matching-matrix */
+rc_t matcher_report( matcher* self, const bool only_copy_columns );
+
+/* makes a typecast-string for the source-table by column-name */
+rc_t matcher_src_cast( const matcher* self, const char *name, char **cast );
+
+/* checks if a column with the given name has at least one type
+ that is also in the given typelist... */
+bool matcher_src_has_type( const matcher* self, const VSchema * s,
+ const char *name, const Vector *id_vector );
+
+/* makes a typecast-string for the destination-table by column-name */
+rc_t matcher_dst_cast( const matcher* self, const char *name, char **cast );
+
+/* performs a type-match between src/dst with the given in_struct */
+rc_t matcher_execute( matcher* self, const p_matcher_input in );
+
+
+rc_t matcher_db_execute( matcher* self, const VTable * src_tab, VTable * dst_tab,
+ const VSchema * schema, const char * columns,
+ const char * kfg_path );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/vdb-copy-includes.h b/tools/vdb-copy/vdb-copy-includes.h
new file mode 100644
index 0000000..f274df6
--- /dev/null
+++ b/tools/vdb-copy/vdb-copy-includes.h
@@ -0,0 +1,121 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_vdb_copy_includes_
+#define _h_vdb_copy_includes_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#ifndef _h_klib_out_
+#include <klib/out.h>
+#endif
+
+#ifndef _h_klib_log_
+#include <klib/log.h>
+#endif
+
+#ifndef _h_klib_rc_
+#include <klib/rc.h>
+#endif
+
+#ifndef _h_klib_debug_
+#include <klib/debug.h>
+#endif
+
+#ifndef _h_klib_vector_
+#include <klib/vector.h>
+#endif
+
+#ifndef _h_klib_text_
+#include <klib/text.h>
+#endif
+
+#ifndef _h_klib_args_
+#include <kapp/args.h>
+#endif
+
+#ifndef _h_kfs_directory_
+#include <kfs/directory.h>
+#endif
+
+#ifndef _h_kfs_file_
+#include <kfs/file.h>
+#endif
+
+#ifndef _h_kfg_config_
+#include <kfg/config.h>
+#endif
+
+#ifndef _h_vdb_manager_
+#include <vdb/manager.h>
+#endif
+
+#ifndef _h_vdb_table_
+#include <vdb/table.h>
+#endif
+
+#ifndef _h_vdb_cursor_
+#include <vdb/cursor.h>
+#endif
+
+#ifndef _h_vdb_database_
+#include <vdb/database.h>
+#endif
+
+#ifndef _h_vdb_schema_
+#include <vdb/schema.h>
+#endif
+
+#ifndef _h_vdb_vdb_priv_
+#include <vdb/vdb-priv.h>
+#endif
+
+#ifndef _h_sra_sraschema_
+#include <sra/sraschema.h>
+#endif
+
+/*
+#ifndef _h_sra_srapath_
+#include <sra/srapath.h>
+#endif
+*/
+
+#ifndef _h_namelist_tools_
+#include "namelist_tools.h"
+#endif
+
+#include <os-native.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-copy/vdb-copy.c b/tools/vdb-copy/vdb-copy.c
new file mode 100644
index 0000000..527011c
--- /dev/null
+++ b/tools/vdb-copy/vdb-copy.c
@@ -0,0 +1,1456 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-copy-includes.h"
+#include "definitions.h"
+#include "context.h"
+#include "helper.h"
+#include "coldefs.h"
+#include "get_platform.h"
+#include "copy_meta.h"
+#include "type_matcher.h"
+#include "redactval.h"
+
+#include <kapp/main.h>
+#include <klib/progressbar.h>
+#include <sysalloc.h>
+
+/*
+#if _DEBUGGING
+#define _CRTDBG_MAP_ALLOC 1
+#include <crtdbg.h>
+#endif
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+static const char * table_usage[] = { "table-name", NULL };
+static const char * rows_usage[] = { "set of rows to be copied(default = all)", NULL };
+#if ALLOW_COLUMN_SPEC
+static const char * columns_usage[] = { "set of columns to be copied(default = all)", NULL };
+#endif
+static const char * schema_usage[] = { "schema-name", NULL };
+static const char * without_accession_usage[] = { "without accession-test", NULL };
+static const char * ignore_reject_usage[] = { "ignore SRA_FILTER_REJECT values", NULL };
+static const char * ignore_redact_usage[] = { "ignore SRA_FILTER_REDACTED values", NULL };
+#if ALLOW_EXTERNAL_CONFIG
+static const char * kfg_path_usage[] = { "use this path to find the file vdb-copy.kfg", NULL };
+#endif
+static const char * show_matching_usage[] = { "show type-matching results", NULL };
+static const char * show_progress_usage[] = { "show progress in percent while copying", NULL };
+static const char * ignore_incomp_usage[] = { "ignore incompatible columns", NULL };
+static const char * reindex_usage[] = { "reindex columns after copy", NULL };
+static const char * show_redact_usage[] = { "show redaction-process", NULL };
+static const char * excluded_columns_usage[] = { "exclude these columns from copy", NULL };
+static const char * show_meta_usage[] = { "show metadata-copy-process", NULL };
+static const char * md5mode_usage[] = { "MD5-mode def.: auto, '1'...forced ON, '0'...forced OFF)", NULL };
+static const char * blcmode_usage[] = { "Blob-checksum def.: auto, '1'...CRC32, 'M'...MD5, '0'...OFF)", NULL };
+static const char * force_usage[] = { "forces an existing target to be overwritten", NULL };
+static const char * unlock_usage[] = { "forces a locked target to be unlocked", NULL };
+
+OptDef MyOptions[] =
+{
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, false },
+ { OPTION_ROWS, ALIAS_ROWS, NULL, rows_usage, 1, true, false },
+#if ALLOW_COLUMN_SPEC
+ { OPTION_COLUMNS, ALIAS_COLUMNS, NULL, columns_usage, 1, true, false },
+#endif
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 5, true, false },
+ { OPTION_WITHOUT_ACCESSION, ALIAS_WITHOUT_ACCESSION, NULL, without_accession_usage, 1, false, false },
+ { OPTION_IGNORE_REJECT, ALIAS_IGNORE_REJECT, NULL, ignore_reject_usage, 1, false, false },
+ { OPTION_IGNORE_REDACT, ALIAS_IGNORE_REDACT, NULL, ignore_redact_usage, 1, false, false },
+#if ALLOW_EXTERNAL_CONFIG
+ { OPTION_KFG_PATH, ALIAS_KFG_PATH, NULL, kfg_path_usage, 1, true, false },
+#endif
+ { OPTION_SHOW_MATCHING, ALIAS_SHOW_MATCHING, NULL, show_matching_usage, 1, false, false },
+ { OPTION_SHOW_PROGRESS, ALIAS_SHOW_PROGRESS, NULL, show_progress_usage, 1, false, false },
+ { OPTION_IGNORE_INCOMP, ALIAS_IGNORE_INCOMP, NULL, ignore_incomp_usage, 1, false, false },
+ { OPTION_REINDEX, ALIAS_REINDEX, NULL, reindex_usage, 1, false, false },
+ { OPTION_SHOW_REDACT, ALIAS_SHOW_REDACT, NULL, show_redact_usage, 1, false, false },
+ { OPTION_EXCLUDED_COLUMNS, ALIAS_EXCLUDED_COLUMNS, NULL, excluded_columns_usage, 1, true, false },
+ { OPTION_SHOW_META, ALIAS_SHOW_META, NULL, show_meta_usage, 1, false, false },
+ { OPTION_MD5_MODE, ALIAS_MD5_MODE, NULL, md5mode_usage, 1, true, false },
+ { OPTION_BLOB_CHECKSUM, ALIAS_BLOB_CHECKSUM, NULL, blcmode_usage, 1, true, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, force_usage, 1, false, false },
+ { OPTION_UNLOCK, ALIAS_UNLOCK, NULL, unlock_usage, 1, false, false }
+};
+
+
+const char UsageDefaultName[] = "vdb-copy";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s <src_path> <dst_path> [options]\n"
+ "\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine ( ALIAS_TABLE, OPTION_TABLE, "table", table_usage );
+ HelpOptionLine ( ALIAS_ROWS, OPTION_ROWS, "rows", rows_usage );
+#if ALLOW_COLUMN_SPEC
+ HelpOptionLine ( ALIAS_COLUMNS, OPTION_COLUMNS, "columns", columns_usage );
+#endif
+ HelpOptionLine ( ALIAS_SCHEMA, OPTION_SCHEMA, "schema", schema_usage );
+ HelpOptionLine ( ALIAS_WITHOUT_ACCESSION, OPTION_WITHOUT_ACCESSION, NULL, without_accession_usage );
+ HelpOptionLine ( ALIAS_IGNORE_REJECT, OPTION_IGNORE_REJECT, NULL, ignore_reject_usage );
+ HelpOptionLine ( ALIAS_IGNORE_REDACT, OPTION_IGNORE_REDACT, NULL, ignore_redact_usage );
+#if ALLOW_EXTERNAL_CONFIG
+ HelpOptionLine ( ALIAS_KFG_PATH, OPTION_KFG_PATH, NULL, kfg_path_usage );
+#endif
+ HelpOptionLine ( ALIAS_SHOW_MATCHING, OPTION_SHOW_MATCHING, NULL, show_matching_usage );
+ HelpOptionLine ( ALIAS_SHOW_PROGRESS, OPTION_SHOW_PROGRESS, NULL, show_progress_usage );
+ HelpOptionLine ( ALIAS_IGNORE_INCOMP, OPTION_IGNORE_INCOMP, NULL, ignore_incomp_usage );
+ HelpOptionLine ( ALIAS_REINDEX, OPTION_REINDEX, NULL, reindex_usage );
+ HelpOptionLine ( ALIAS_SHOW_REDACT, OPTION_SHOW_REDACT, NULL, show_redact_usage );
+ HelpOptionLine ( ALIAS_EXCLUDED_COLUMNS, OPTION_EXCLUDED_COLUMNS, NULL, excluded_columns_usage );
+ HelpOptionLine ( ALIAS_SHOW_META, OPTION_SHOW_META, NULL, show_meta_usage );
+ HelpOptionLine ( ALIAS_FORCE, OPTION_FORCE, NULL, force_usage );
+ HelpOptionLine ( ALIAS_UNLOCK, OPTION_UNLOCK, NULL, unlock_usage );
+ HelpOptionLine ( ALIAS_MD5_MODE, OPTION_MD5_MODE, NULL, md5mode_usage );
+ HelpOptionLine ( ALIAS_BLOB_CHECKSUM, OPTION_BLOB_CHECKSUM, NULL, blcmode_usage );
+
+ HelpOptionsStandard ();
+
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+/* ----------------------------------------------------------------------------------- */
+static rc_t vdb_copy_redact_cell( const VCursor * src_cursor, VCursor * dst_cursor,
+ const p_col_def col, uint64_t row_id,
+ redact_buffer * rbuf,
+ const bool show_redact )
+{
+ rc_t rc;
+ const void * src_buffer;
+ uint32_t offset_in_bits;
+ uint32_t n_elements;
+ uint32_t elem_bits;
+
+ /* we read the original cell-data to detect how big the data is before redacting */
+ rc = VCursorCellData( src_cursor, col->src_idx, &elem_bits,
+ &src_buffer, &offset_in_bits, &n_elements );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorCellData( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%lu",
+ col->name, row_id ));
+ }
+
+ DISP_RC( rc, "vdb_copy_redact_cell:VCursorCellData(src) failed" );
+ if ( rc == 0 )
+ {
+ size_t new_size = ( ( elem_bits * n_elements ) + 8 ) >> 3;
+ rc = redact_buf_resize( rbuf, new_size );
+ DISP_RC( rc, "vdb_copy_redact_cell:redact_buf_resize() failed" );
+ if ( rc == 0 )
+ {
+ if ( col->r_val != NULL )
+ {
+ if ( show_redact )
+ {
+ char * c = ( char * )col->r_val->value;
+ KOutMsg( "redacting #%lu %s -> 0x%.02x\n", row_id, col->dst_cast, *c );
+ }
+ redact_val_fill_buffer( col->r_val, rbuf, new_size );
+ }
+ else
+ {
+ if ( show_redact )
+ KOutMsg( "redacting #%lu %s -> 0\n", row_id, col->dst_cast );
+ memset( rbuf->buffer, 0, new_size );
+ }
+
+ rc = VCursorWrite( dst_cursor, col->dst_idx, elem_bits,
+ rbuf->buffer, 0, n_elements );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorWrite( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%lu",
+ col->name, row_id ));
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------------- */
+static rc_t vdb_copy_cell( const VCursor * src_cursor, VCursor * dst_cursor,
+ const p_col_def col, uint64_t row_id )
+{
+ rc_t rc;
+
+ const void *buffer;
+ uint32_t offset_in_bits;
+ uint32_t number_of_elements;
+ uint32_t elem_bits;
+
+ /*
+ KOutMsg( " - copy cell %s ( src_idx=%u / dst_idx=%u )\n",
+ col->name, col->src_idx, col->dst_idx );
+ */
+ rc = VCursorCellData( src_cursor, col->src_idx, &elem_bits,
+ &buffer, &offset_in_bits, &number_of_elements );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorCellData( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%lu",
+ col->name, row_id ));
+ }
+ if ( rc != 0 ) return rc;
+
+ /*
+ KOutMsg( "bit-offset = %u / elements = %u / element-bits = %u\n",
+ offset_in_bits, number_of_elements, elem_bits );
+ */
+ rc = VCursorWrite( dst_cursor, col->dst_idx, elem_bits,
+ buffer, offset_in_bits, number_of_elements );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorWrite( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%lu",
+ col->name, row_id ));
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------------- */
+static rc_t vdb_copy_row( const VCursor * src_cursor,
+ VCursor * dst_cursor,
+ col_defs * columns,
+ uint64_t row_id,
+ redact_buffer * rbuf,
+ const bool redact,
+ const bool show_redact )
+{
+ uint32_t len, idx = 0;
+ rc_t rc = VCursorOpenRow( dst_cursor );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorOpenRow(dst) row #$(row_nr) failed",
+ "row_nr=%lu",
+ row_id ));
+ return rc;
+ }
+
+ len = VectorLength( &(columns->cols) );
+ /* loop through the columns and copy them if they have to be copied */
+ while ( idx < len && rc == 0 )
+ {
+ p_col_def col = (p_col_def) VectorGet ( &(columns->cols), idx++ );
+ if ( col != NULL )
+ {
+ if ( col->to_copy )
+ {
+ if ( redact && col->redactable )
+ rc = vdb_copy_redact_cell( src_cursor, dst_cursor,
+ col, row_id, rbuf, show_redact );
+ else
+ rc = vdb_copy_cell( src_cursor, dst_cursor, col, row_id );
+ }
+ }
+ }
+ if ( rc == 0 )
+ {
+ rc = VCursorCommitRow( dst_cursor );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorCommitRow(dst) row #$(row_nr) failed",
+ "row_nr=%lu",
+ row_id ));
+ }
+
+ rc = VCursorCloseRow( dst_cursor );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc,
+ "VCursorCloseRow(dst) row #$(row_nr) failed",
+ "row_nr=%lu",
+ row_id ));
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_read_row_flags( const p_context ctx,
+ const VCursor *cursor,
+ const uint32_t src_idx,
+ bool *pass,
+ bool *redact )
+{
+ uint64_t filter;
+ /* read the filter-value from the filter-column */
+ rc_t rc = helper_read_vdb_int_row_open( cursor, src_idx, &filter );
+ if ( rc != 0 ) return rc;
+
+ switch( filter )
+ {
+ case SRA_READ_FILTER_REJECT :
+ if ( ctx->ignore_reject == false ) *pass = false;
+ break;
+
+ case SRA_READ_FILTER_REDACTED :
+ if ( ctx->ignore_redact == false ) *redact = true;
+ break;
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_row_loop( const p_context ctx,
+ const VCursor * src_cursor,
+ VCursor * dst_cursor,
+ col_defs * columns,
+ redact_vals * rvals )
+{
+ rc_t rc;
+ const struct num_gen_iter * iter;
+ int64_t row_id;
+ uint64_t count;
+ uint32_t percent;
+ p_col_def filter_col_def = NULL;
+ redact_buffer rbuf;
+ struct progressbar * progress = NULL;
+
+ if ( columns->filter_idx != -1 )
+ filter_col_def = col_defs_get( columns, columns->filter_idx );
+
+ rc = num_gen_iterator_make( ctx->row_generator, &iter );
+ if ( rc != 0 ) return rc;
+
+ rc = make_progressbar( &progress, 2 );
+ DISP_RC( rc, "vdb_copy_row_loop:make_progressbar() failed" );
+ if ( rc != 0 ) return rc;
+
+ redact_buf_init( &rbuf );
+ col_defs_find_redact_vals( columns, rvals );
+
+ count = 0;
+ while ( rc == 0 && num_gen_iterator_next( iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting(); /* to be able to cancel the loop by signal */
+ if ( rc == 0 )
+ {
+ rc = VCursorSetRowId( src_cursor, row_id );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc,
+ "VCursorSetRowId(src) row #$(row_nr) failed",
+ "row_nr=%lu", row_id ));
+
+ if ( rc == 0 )
+ {
+ rc = VCursorOpenRow( src_cursor );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc,
+ "VCursorOpenRow(src) row #$(row_nr) failed",
+ "row_nr=%lu", row_id ));
+ else
+ {
+ bool pass_flag = true;
+ bool redact_flag = false;
+
+ if ( filter_col_def != NULL )
+ vdb_copy_read_row_flags( ctx, src_cursor,
+ filter_col_def->src_idx, &pass_flag, &redact_flag );
+ if ( pass_flag )
+ rc = vdb_copy_row( src_cursor, dst_cursor,
+ columns, row_id,
+ &rbuf, redact_flag, ctx->show_redact );
+
+ if ( rc == 0 )
+ {
+ count++;
+ rc = VCursorCloseRow( src_cursor );
+ if ( rc != 0 )
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorCloseRow(src) row #$(row_nr) failed",
+ "row_nr=%lu", row_id ) );
+ }
+ }
+
+ if ( ctx->show_progress )
+ {
+ if ( num_gen_iterator_percent( iter, 2, &percent ) == 0 )
+ update_progressbar( progress, percent );
+ }
+ }
+ }
+ }
+
+ /* set rc to zero for num_gen_iterator_next() reached last id */
+ if ( GetRCModule( rc ) == rcVDB &&
+ GetRCTarget( rc ) == rcNoTarg &&
+ GetRCContext( rc ) == rcReading &&
+ GetRCObject( rc ) == rcId &&
+ GetRCState( rc ) == rcInvalid )
+ rc = 0;
+
+ if ( ctx->show_progress )
+ KOutMsg( "\n" );
+ destroy_progressbar( progress );
+
+ PLOGMSG( klogInfo, ( klogInfo, "\n $(row_cnt) rows copied", "row_cnt=%lu", count ));
+
+ if ( rc == 0 )
+ {
+ rc = VCursorCommit( dst_cursor );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorCommit( dst ) after processing all rows failed" );
+ }
+ }
+ num_gen_iterator_destroy( iter );
+ redact_buf_free( &rbuf );
+
+ return rc;
+}
+
+
+static rc_t vdb_copy_make_dst_table( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VSchema * src_schema,
+ VSchema **dst_schema,
+ KCreateMode cmode,
+ VTable **dst_table,
+ bool is_legacy )
+{
+ rc_t rc = 0;
+
+ /* different ways to make the schema for the dest-table */
+ if ( is_legacy )
+ {
+ /* load it from a file */
+ /*
+ KOutMsg( "we are using '%s'\n", cctx->legacy_schema_file );
+ */
+ if ( *dst_schema == NULL )
+ {
+ rc = VDBManagerMakeSRASchema( vdb_mgr, dst_schema );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc, "VDBManagerMakeSRASchema(dst) failed", "" ));
+ }
+ }
+ rc = VSchemaParseFile ( *dst_schema, "%s", ctx->legacy_schema_file );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ rc, "VSchemaParseFile() failed", "" ));
+ }
+ }
+ else
+ {
+ /* in case of a non-legacy-table, do nothing,
+ keep using the src-schema-object */
+ *dst_schema = (VSchema *)src_schema;
+ VSchemaAddRef( src_schema );
+ }
+ if ( rc == 0 )
+ {
+ rc = VDBManagerCreateTable( vdb_mgr, dst_table,
+ *dst_schema, ctx->dst_schema_tabname,
+ cmode, "%s", ctx->dst_path );
+ DISP_RC( rc, "vdb_copy_make_dst_table:VDBManagerCreateTable() failed" );
+ if ( rc == 0 )
+ {
+ KChecksum cs_mode = helper_assemble_ChecksumMode( ctx->blob_checksum );
+ rc = VTableColumnCreateParams ( *dst_table, cmode, cs_mode, 0 );
+ DISP_RC( rc, "vdb_copy_make_dst_table:VTableColumnCreateParams() failed" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_open_dest_table( const p_context ctx,
+ const VTable * src_table,
+ VTable * dst_table,
+ VCursor ** dst_cursor,
+ col_defs * columns,
+ bool is_legacy )
+{
+ rc_t rc;
+
+ /* copy the metadata */
+ rc = copy_table_meta( src_table, dst_table,
+ ctx->config.meta_ignore_nodes,
+ ctx->show_meta, is_legacy );
+ if ( rc != 0 ) return rc;
+
+ /* mark all columns which are to be found writable as to_copy */
+ rc = col_defs_mark_writable_columns( columns, dst_table, false );
+ DISP_RC( rc, "vdb_copy_open_dest_table:col_defs_mark_writable_columns() failed" );
+ if ( rc != 0 ) return rc;
+
+ /* make a writable cursor */
+ rc = VTableCreateCursorWrite( dst_table, dst_cursor, kcmInsert );
+ DISP_RC( rc, "vdb_copy_open_dest_table:VTableCreateCursorWrite(dst) failed" );
+ if ( rc != 0 ) return rc;
+
+ /* add all marked ( as to copy ) columns to the writable cursor */
+ rc = col_defs_add_to_wr_cursor( columns, *dst_cursor, false );
+ DISP_RC( rc, "vdb_copy_open_dest_table:col_defs_add_to_wr_cursor(dst) failed" );
+ if ( rc != 0 ) return rc;
+
+ /* opens the dst cursor */
+ rc = VCursorOpen( *dst_cursor );
+ DISP_RC( rc, "vdb_copy_open_dest_table:VCursorOpen(dst) failed" );
+
+ return rc;
+}
+
+
+/* detect the row-range of the source-table
+ check if the requested row-range is within this range
+ otherwise correct the requested row-range
+*/
+static rc_t vdb_copy_check_range( const p_context ctx,
+ const VCursor * a_cursor )
+{
+ int64_t first;
+ uint64_t count;
+ rc_t rc = VCursorIdRange( a_cursor, 0, &first, &count );
+ DISP_RC( rc, "vdb_copy_check_range:VCursorIdRange() failed" );
+ if ( rc == 0 )
+ {
+ rc = context_range_check( ctx, first, count );
+ DISP_RC( rc, "vdb_copy_check_range:context_range_check() failed" );
+ }
+ return rc;
+}
+
+
+/* detect the row-range of the source-table
+ set's the range of the number-generator to the discovered values
+*/
+static rc_t vdb_copy_set_range( const p_context ctx,
+ const VCursor * a_cursor )
+{
+ int64_t first;
+ uint64_t count;
+ rc_t rc = VCursorIdRange( a_cursor, 0, &first, &count );
+ DISP_RC( rc, "vdb_copy_set_range:VCursorIdRange() failed" );
+ if ( rc == 0 )
+ {
+ rc = context_set_range( ctx, first, count );
+ DISP_RC( rc, "vdb_copy_set_range:context_set_range() failed" );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_prepare_legacy_tab( const p_context ctx,
+ const char * src_schema_tabname )
+{
+ KConfig * config_mgr;
+ char * src_platform;
+
+ rc_t rc = get_table_platform( ctx->src_path, &src_platform, '_' );
+ DISP_RC( rc, "vdb_copy_prepare_legacy_tab:get_table_platform() failed" );
+ if ( rc != 0 ) return rc;
+
+ rc = helper_make_config_mgr( &config_mgr, ctx->kfg_path );
+ DISP_RC( rc, "vdb_copy_prepare_legacy_tab:helper_make_config_mgr() failed" );
+ if ( rc != 0 ) return rc;
+
+ PLOGMSG( klogInfo, ( klogInfo, "legacy-platform: $(platform)", "platform=%s",
+ src_platform ));
+
+ rc = helper_get_legacy_write_schema_from_config( config_mgr,
+ src_platform,
+ src_schema_tabname,
+ &(ctx->legacy_schema_file),
+ &(ctx->dst_schema_tabname),
+ &(ctx->legacy_dont_copy) );
+ DISP_RC( rc, "vdb_copy_prepare_legacy_tab:helper_get_legacy_write_schema_from_config() failed" );
+ KConfigRelease( config_mgr );
+ if ( rc != 0 ) return rc;
+
+ if ( ctx->show_matching )
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "-file: $(file)", "file=%s", ctx->legacy_schema_file ));
+ PLOGMSG( klogInfo, ( klogInfo, "-tab : $(tab)", "tab=%s", ctx->dst_schema_tabname ));
+ PLOGMSG( klogInfo, ( klogInfo, "-dont: $(dont)", "dont=%s", ctx->legacy_dont_copy ));
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_find_out_what_columns_to_use( const VTable * src_table,
+ const char * tablename,
+ col_defs * columns,
+ const char * requested,
+ const char * excluded )
+{
+ bool cols_requested = ( ( requested != NULL ) &&
+ ( nlt_strcmp( requested, "*" ) != 0 ) );
+ /* no matter if specific columns are requested, we first discover all of them
+ to later mark the columns which are requested */
+ rc_t rc = col_defs_extract_from_table( columns, src_table );
+ DISP_RC( rc, "vdb_copy_find_out_what_columns_to_use:col_defs_extract_from_table() failed" );
+ if ( rc == 0 )
+ {
+ if ( cols_requested )
+ /* the user requested a specific subset of columns... */
+ rc = col_defs_mark_requested_columns( columns, requested );
+ else
+ /* no specific subset of columns is requested --> copy what we can... */
+ rc = col_defs_mark_requested_columns( columns, NULL );
+ DISP_RC( rc, "vdb_copy_find_out_what_columns_to_use:col_defs_mark_requested_columns() failed" );
+ if ( rc == 0 && excluded != NULL )
+ {
+ rc = col_defs_exclude_these_columns( columns, tablename, excluded );
+ DISP_RC( rc, "vdb_copy_find_out_what_columns_to_use:col_defs_unmark_writable_columns() failed" );
+ }
+ }
+ return rc;
+}
+
+
+/* find the filter-column and redactable columns */
+static void vdb_copy_find_filter_and_redact_columns( const VSchema * src_schema,
+ col_defs * columns,
+ config_values * config,
+ matcher * type_matcher )
+{
+ /* it is ok to not find a filter-column: no error in this case */
+ col_defs_detect_filter_col( columns, config->filter_col_name );
+
+ /* it is ok to not find redactable types: no error in this case */
+ col_defs_detect_redactable_cols_by_type( columns,
+ src_schema, type_matcher, config->redactable_types );
+
+ /* it is ok to not find columns excluded from redacting: no error in this case */
+ col_defs_unmark_do_not_redact_columns( columns,
+ config->do_not_redact_columns );
+}
+
+
+static rc_t vdb_copy_detect_legacy( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VTable * src_table,
+ bool * is_legacy )
+{
+ char * src_schema_tabname;
+ /* detects the name of the schema-table used by the source-table */
+ rc_t rc = helper_get_schema_tab_name( src_table, &src_schema_tabname );
+ DISP_RC( rc, "vdb_copy_prepare_columns:helper_get_schema_tab_name() failed" );
+ if ( rc == 0 )
+ {
+ rc = helper_is_tablename_legacy( vdb_mgr, src_schema_tabname, is_legacy );
+ if ( rc == 0 )
+ {
+ if ( *is_legacy )
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "used legacy schema: $(schema)", "schema=%s",
+ src_schema_tabname ));
+ rc = vdb_copy_prepare_legacy_tab( ctx, src_schema_tabname );
+ }
+ else
+ {
+ PLOGMSG( klogInfo, ( klogInfo, "used schema: $(schema)", "schema=%s",
+ src_schema_tabname ));
+ ctx->dst_schema_tabname = string_dup_measure ( src_schema_tabname, NULL );
+ }
+ }
+ free( src_schema_tabname );
+ }
+ return rc;
+}
+
+
+/* we have the src-columns collected (incl. there types):
+ no columns have been added to a cursor (rd and wr),
+ now we can find the columns which have to be copied
+ including the right type-casts for every one of these columns */
+static rc_t vdb_copy_match_columns( const p_context ctx,
+ VDBManager * vdb_mgr,
+ col_defs * columns,
+ matcher * type_matcher )
+{
+ rc_t rc;
+ matcher_input mi;
+
+ rc = KDirectoryNativeDir( &( mi.dir ) );
+ DISP_RC( rc, "vdb_copy_match_columns:KDirectoryNativeDir() failed" );
+ if ( rc == 0 )
+ {
+ rc = helper_make_config_mgr( &(mi.cfg), ctx->kfg_path );
+ DISP_RC( rc, "vdb_copy_match_columns:helper_make_config_mgr() failed" );
+ if ( rc == 0 )
+ {
+ mi.manager = vdb_mgr;
+ mi.add_schemas = ctx->src_schema_list;
+
+ rc = col_defs_as_string( columns, (char**)&mi.columns, true );
+ if ( rc == 0 )
+ {
+ mi.src_path = ctx->src_path;
+ mi.dst_path = ctx->dst_path;
+ mi.legacy_schema = ctx->legacy_schema_file;
+ mi.dst_tabname = ctx->dst_schema_tabname;
+ mi.excluded_columns = ctx->legacy_dont_copy;
+ mi.force_kcmInit = ctx->force_kcmInit;
+ mi.force_unlock = ctx->force_unlock;
+
+ rc = matcher_execute( type_matcher, &mi );
+ if ( rc != 0 )
+ {
+ if ( GetRCState( rc ) == rcExists )
+ {
+ LOGMSG( klogInfo, "vdb-copy cannot create the target-table, because it already exists!" );
+ LOGMSG( klogInfo, "try to use the force-option (-f)" );
+ ctx->dont_remove_target = true;
+ }
+ else
+ DISP_RC( rc, "vdb_copy_match_columns:matcher_execute() failed" );
+ }
+ if ( rc == 0 )
+ {
+ if ( ctx->show_matching )
+ matcher_report( type_matcher, true );
+ rc = col_defs_apply_casts( columns, type_matcher );
+ DISP_RC( rc, "vdb_copy_match_columns:col_defs_apply_casts() failed" );
+ }
+
+ free( ( void * )mi.columns );
+ }
+ KConfigRelease( mi.cfg );
+ }
+ KDirectoryRelease( mi.dir );
+ }
+ return rc;
+}
+
+
+/* this is the common entry-point for the copy-operation in both cases
+ "given path is database" OR "given path is table" */
+static rc_t vdb_copy_open_source_table( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VSchema * src_schema,
+ VSchema **dst_schema,
+ const VTable * src_table,
+ const VCursor * src_cursor,
+ KCreateMode cmode,
+ VTable **dst_table,
+ col_defs * columns,
+ bool * is_legacy,
+ matcher * type_matcher )
+{
+ /* everything what has to be done before adding the columns
+ to the source-cursor and opening the source-cursor */
+ rc_t rc = vdb_copy_detect_legacy( ctx, vdb_mgr, src_table, is_legacy );
+ if ( rc != 0 ) return rc;
+
+ /* type-match between src <---> dst columns, find best typecast */
+ rc = vdb_copy_match_columns( ctx, vdb_mgr, columns, type_matcher );
+ if ( rc != 0 ) return rc;
+
+ /* in case of legacy table make new schema - parse matched schema
+ in case on non-legacy use the src-schema as dst-schema */
+ rc = vdb_copy_make_dst_table( ctx, vdb_mgr, src_schema, dst_schema, cmode,
+ dst_table, *is_legacy );
+ if ( rc != 0 ) return rc;
+
+ /* the prepared and eventually shortened src-column-list is used */
+ rc = col_defs_add_to_rd_cursor( columns, src_cursor, false );
+ if ( rc != 0 ) return rc;
+
+ rc = VCursorOpen( src_cursor );
+ DISP_RC( rc, "vdb_copy_open_source_table:VCursorOpen() failed" );
+ if ( rc != 0 ) return rc;
+
+ /* range check requires an open cursor */
+ rc = vdb_copy_check_range( ctx, src_cursor );
+ return rc;
+}
+
+
+static rc_t vdb_copy_table2( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VTable * src_table,
+ const VCursor * src_cursor,
+ const VSchema * src_schema,
+ col_defs * columns,
+ matcher * type_matcher )
+{
+ VSchema * dst_schema = NULL;
+ VTable * dst_table;
+ bool is_legacy;
+
+ KCreateMode cmode = helper_assemble_CreateMode( src_table,
+ ctx->force_kcmInit, ctx->md5_mode );
+ rc_t rc = vdb_copy_open_source_table( ctx, vdb_mgr, src_schema, &dst_schema,
+ src_table, src_cursor, cmode, &dst_table, columns,
+ &is_legacy, type_matcher );
+ if ( rc == 0 )
+ {
+ VCursor * dst_cursor;
+ rc = vdb_copy_open_dest_table( ctx, src_table, dst_table, &dst_cursor, columns,
+ is_legacy );
+ if ( rc == 0 )
+ {
+ /* this function does not fail, because it is ok to not find
+ filter-column, redactable types and excluded columns */
+ vdb_copy_find_filter_and_redact_columns( src_schema,
+ columns, &(ctx->config), type_matcher );
+
+ rc = vdb_copy_row_loop( ctx, src_cursor, dst_cursor,
+ columns, ctx->rvals );
+
+ VCursorRelease( dst_cursor );
+ if ( rc == 0 )
+ {
+ if ( ctx->reindex )
+ {
+ /* releasing the cursor is necessary for reindex */
+ rc = VTableReindex( dst_table );
+ DISP_RC( rc, "vdb_copy_table2:VTableReindex() failed" );
+ }
+ }
+ }
+ VSchemaRelease( dst_schema );
+ VTableRelease( dst_table );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_table( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VTable * src_table,
+ const char * tablename )
+{
+ const VSchema * src_schema;
+ rc_t rc = VTableOpenSchema ( src_table, &src_schema );
+ DISP_RC( rc, "vdb_copy_main:VTableOpenSchema( src_schema ) failed" );
+ if ( rc == 0 )
+ {
+ col_defs * columns;
+ rc = col_defs_init( &columns );
+ DISP_RC( rc, "vdb_copy_table:col_defs_init() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdb_copy_find_out_what_columns_to_use( src_table, tablename, columns,
+ ctx->columns, ctx->excluded_columns );
+ if ( rc == 0 )
+ {
+ const VCursor * src_cursor;
+ rc = VTableCreateCursorRead( src_table, &src_cursor );
+ DISP_RC( rc, "vdb_copy_table:VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ matcher * type_matcher;
+
+ rc = matcher_init( &type_matcher );
+ DISP_RC( rc, "vdb_copy_table:matcher_init() failed" );
+ if ( rc == 0 )
+ {
+ /*****************************************************/
+ rc = vdb_copy_table2( ctx, vdb_mgr, src_table, src_cursor,
+ src_schema, columns, type_matcher );
+ /*****************************************************/
+ matcher_destroy( type_matcher );
+ }
+ }
+ VCursorRelease( src_cursor );
+ }
+ col_defs_destroy( columns );
+ }
+ VSchemaRelease( src_schema );
+ }
+ return rc;
+}
+
+
+/*-----------------------------------------------------------------------------*/
+static rc_t vdb_copy_cur_2_cur( const p_context ctx,
+ const VCursor * src_cursor,
+ VCursor * dst_cursor,
+ const VSchema * schema,
+ col_defs * columns,
+ matcher * type_matcher,
+ const char * tab_name )
+{
+ rc_t rc = col_defs_apply_casts( columns, type_matcher );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:col_defs_apply_casts() failed" );
+ if ( rc == 0 )
+ {
+ rc = col_defs_add_to_wr_cursor( columns, dst_cursor, false );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:col_defs_add_to_wr_cursor(dst) failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( dst_cursor );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:VCursorOpen(dst) failed" );
+ if ( rc == 0 )
+ {
+ rc = col_defs_add_to_rd_cursor( columns, src_cursor, false );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:col_defs_add_to_rd_cursor() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( src_cursor );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:VCursorOpen(src) failed" );
+ if ( rc == 0 )
+ {
+ /* set the row-range in ctx to cover the whole table */
+ rc = vdb_copy_set_range( ctx, src_cursor );
+ DISP_RC( rc, "vdb_copy_cur_2_cur:vdb_copy_check_range(src) failed" );
+ if ( rc == 0 )
+ {
+ /* it is ok to not find a filter-column: no error in this case */
+ col_defs_detect_filter_col( columns,
+ ctx->config.filter_col_name );
+
+ /* it is ok to not find columns excluded from redacting: no error in this case */
+ col_defs_unmark_do_not_redact_columns( columns,
+ ctx->config.do_not_redact_columns );
+
+ if ( ctx->show_progress )
+ KOutMsg( "copy of >%s<\n", tab_name );
+
+ vdb_copy_find_filter_and_redact_columns( schema,
+ columns, &(ctx->config), type_matcher );
+
+ /**************************************************/
+ rc = vdb_copy_row_loop( ctx, src_cursor, dst_cursor,
+ columns, ctx->rvals );
+ /**************************************************/
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t vdb_copy_tab_2_tab( const p_context ctx,
+ const VTable * src_tab,
+ VTable * dst_tab,
+ const char * tab_name )
+{
+ const VSchema * schema;
+ rc_t rc = VTableOpenSchema ( src_tab, &schema );
+ DISP_RC( rc, "vdb_copy_tab_2_tab:VTableOpenSchema( src_schema ) failed" );
+ if ( rc == 0 )
+ {
+ col_defs * columns;
+ rc = col_defs_init( &columns );
+ DISP_RC( rc, "vdb_copy_tab_2_tab:col_defs_init() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdb_copy_find_out_what_columns_to_use( src_tab, tab_name, columns,
+ NULL, ctx->excluded_columns );
+ if ( rc == 0 )
+ {
+ matcher * type_matcher;
+ rc = matcher_init( &type_matcher );
+ if ( rc == 0 )
+ {
+ char * column_names;
+ rc = col_defs_as_string( columns, (char**)&column_names, true );
+ if ( rc == 0 )
+ {
+ rc = matcher_db_execute( type_matcher, src_tab, dst_tab, schema,
+ column_names, ctx->kfg_path );
+ if ( rc == 0 )
+ {
+ const VCursor * src_cursor;
+ if ( ctx->show_matching )
+ matcher_report( type_matcher, false );
+ rc = VTableCreateCursorRead( src_tab, &src_cursor );
+ DISP_RC( rc, "vdb_copy_tab_2_tab:VTableCreateCursorRead(src) failed" );
+ if ( rc == 0 )
+ {
+ rc = col_defs_mark_writable_columns( columns, dst_tab, false );
+ DISP_RC( rc, "vdb_copy_tab_2_tab:col_defs_mark_writable_columns() failed" );
+ if ( rc == 0 )
+ {
+ VCursor * dst_cursor;
+ rc = VTableCreateCursorWrite( dst_tab, &dst_cursor, kcmInsert );
+ DISP_RC( rc, "vdb_copy_tab_2_tab:VTableCreateCursorWrite(dst) failed" );
+ if ( rc == 0 )
+ {
+ /*****************************************************/
+ rc = vdb_copy_cur_2_cur( ctx, src_cursor, dst_cursor,
+ schema, columns, type_matcher,
+ tab_name );
+ /*****************************************************/
+ }
+ VCursorRelease( dst_cursor );
+ }
+ VCursorRelease( src_cursor );
+ }
+ }
+ free( column_names );
+ }
+ matcher_destroy( type_matcher );
+ }
+ }
+ col_defs_destroy( columns );
+ }
+ VSchemaRelease( schema );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_db_tab( const p_context ctx,
+ const VDatabase * src_db,
+ VDatabase * dst_db,
+ const char *tab_name )
+{
+ const VTable * src_tab;
+ rc_t rc = VDatabaseOpenTableRead( src_db, &src_tab, "%s", tab_name );
+ DISP_RC( rc, "vdb_copy_db_tab:VDatabaseOpenTableRead(src) failed" );
+ if ( rc == 0 )
+ {
+ VTable * dst_tab;
+ KCreateMode cmode = helper_assemble_CreateMode( src_tab,
+ ctx->force_kcmInit, ctx->md5_mode );
+
+ rc = VDatabaseCreateTable ( dst_db, &dst_tab, tab_name,
+ cmode, "%s", tab_name );
+ DISP_RC( rc, "vdb_copy_db_tab:VDatabaseCreateTable(dst) failed" );
+ if ( rc == 0 )
+ {
+ KChecksum cs_mode = helper_assemble_ChecksumMode( ctx->blob_checksum );
+ rc = VTableColumnCreateParams ( dst_tab, cmode, cs_mode, 0 );
+ DISP_RC( rc, "vdb_copy_db_tab:VTableColumnCreateParams failed" );
+ if ( rc == 0 )
+ {
+ rc = copy_table_meta( src_tab, dst_tab,
+ ctx->config.meta_ignore_nodes,
+ ctx->show_meta, false );
+ DISP_RC( rc, "vdb_copy_db_tab:copy_table_meta failed" );
+ if ( rc == 0 )
+ {
+ /********************************************************/
+ rc = vdb_copy_tab_2_tab( ctx, src_tab, dst_tab, tab_name );
+ /********************************************************/
+ }
+ }
+ VTableRelease( dst_tab );
+ }
+ VTableRelease( src_tab );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_db_sub_tables( const p_context ctx,
+ const VDatabase * src_db,
+ VDatabase * dst_db )
+{
+ KNamelist *names;
+
+ rc_t rc = VDatabaseListTbl( src_db, &names );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+ rc = KNamelistCount( names, &count );
+ DISP_RC( rc, "vdb_copy_db_sub_tables:KNamelistCount failed" );
+ if ( rc == 0 )
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *a_name;
+ rc = KNamelistGet( names, idx, &a_name );
+ DISP_RC( rc, "vdb_copy_db_sub_tables:KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ /**************************************************/
+ rc = vdb_copy_db_tab( ctx, src_db, dst_db, a_name );
+ /**************************************************/
+ }
+ }
+ KNamelistRelease( names );
+ }
+ else
+ rc = 0;
+ return rc;
+}
+
+
+/* forward decl. to make recursive copy of sub-databases possible */
+static rc_t vdb_copy_db_2_db( const p_context ctx,
+ const VDatabase * src_db,
+ VDatabase * dst_db );
+
+static rc_t vdb_copy_sub_dbs( const p_context ctx,
+ const VDatabase * src_db,
+ VDatabase * dst_db )
+{
+ KNamelist *names;
+
+ rc_t rc = VDatabaseListDB( src_db, &names );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+ rc = KNamelistCount( names, &count );
+ DISP_RC( rc, "vdb_copy_sub_dbs:KNamelistCount failed" );
+ if ( rc == 0 )
+ {
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *a_name;
+ rc = KNamelistGet( names, idx, &a_name );
+ DISP_RC( rc, "vdb_copy_sub_dbs:KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ const VDatabase * src_sub_db;
+ /* try to open the sub-database */
+ rc = VDatabaseOpenDBRead ( src_db, &src_sub_db, "%s", a_name );
+ DISP_RC( rc, "vdb_copy_sub_dbs:VDatabaseOpenDBRead() failed" );
+ if ( rc == 0 )
+ {
+ char typespec[ TYPESPEC_BUF_LEN ];
+ rc = VDatabaseTypespec ( src_sub_db, typespec, sizeof typespec );
+ DISP_RC( rc, "vdb_copy_sub_dbs:VDatabaseTypespec( src ) failed" );
+ if ( rc == 0 )
+ {
+ VDatabase * dst_sub_db;
+ KCreateMode cmode = kcmInit | kcmParents;
+ if ( ctx->md5_mode == MD5_MODE_ON )
+ cmode |= kcmMD5;
+ rc = VDatabaseCreateDB ( dst_db, &dst_sub_db,
+ typespec, cmode, "%s", a_name );
+ DISP_RC( rc, "vdb_copy_sub_dbs:VDBManagerCreateDB( dst ) failed" );
+ if ( rc == 0 )
+ {
+ KChecksum cs_mode = helper_assemble_ChecksumMode( ctx->blob_checksum );
+ rc = VDatabaseColumnCreateParams ( dst_db, cmode, cs_mode, 0 );
+ DISP_RC( rc, "vdb_copy_sub_dbs:VDatabaseColumnCreateParams failed" );
+ if ( rc == 0 )
+ {
+ /**************************************************/
+ rc = vdb_copy_db_2_db( ctx, src_sub_db, dst_sub_db );
+ /**************************************************/
+ }
+ VDatabaseRelease( dst_sub_db );
+ }
+ }
+ VDatabaseRelease( src_sub_db );
+ }
+ }
+ }
+ }
+ KNamelistRelease( names );
+ }
+ else
+ rc = 0;
+
+ return rc;
+}
+
+
+static rc_t vdb_copy_db_2_db( const p_context ctx,
+ const VDatabase * src_db,
+ VDatabase * dst_db )
+{
+ rc_t rc = copy_database_meta ( src_db, dst_db, NULL, ctx->show_meta );
+ if ( rc == 0 )
+ {
+ if ( ctx->table == NULL )
+ {
+ /* the user did not specify a particular table: copy all of them */
+ /*************************************************/
+ rc = vdb_copy_db_sub_tables( ctx, src_db, dst_db );
+ /*************************************************/
+ if ( rc == 0 )
+ {
+ /* if the database has sub-databases: copy them too */
+ rc = vdb_copy_sub_dbs( ctx, src_db, dst_db );
+ }
+ }
+ else
+ {
+ /* copy only this table... */
+ rc = vdb_copy_db_tab( ctx, src_db, dst_db, ctx->table );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_copy_database( const p_context ctx,
+ VDBManager * vdb_mgr,
+ const VDatabase * src_db )
+{
+ char typespec[ TYPESPEC_BUF_LEN ];
+ rc_t rc = VDatabaseTypespec ( src_db, typespec, sizeof typespec );
+ DISP_RC( rc, "vdb_copy_database:VDatabaseTypespec( src ) failed" );
+ if ( rc == 0 )
+ {
+ const VSchema * schema;
+ rc = VDatabaseOpenSchema ( src_db, &schema );
+ DISP_RC( rc, "vdb_copy_database:VDatabaseOpenSchema( src ) failed" );
+ if ( rc == 0 )
+ {
+ VDatabase * dst_db;
+ KCreateMode cmode = kcmInit | kcmParents;
+ if ( ctx->md5_mode == MD5_MODE_ON )
+ cmode |= kcmMD5;
+ rc = VDBManagerCreateDB ( vdb_mgr, &dst_db, schema,
+ typespec, cmode, "%s", ctx->dst_path );
+ DISP_RC( rc, "vdb_copy_database:VDBManagerCreateDB( dst ) failed" );
+ if ( rc == 0 )
+ {
+ KChecksum cs_mode = helper_assemble_ChecksumMode( ctx->blob_checksum );
+ rc = VDatabaseColumnCreateParams ( dst_db, cmode, cs_mode, 0 );
+ DISP_RC( rc, "vdb_copy_sub_dbs:VDatabaseColumnCreateParams failed" );
+ if ( rc == 0 )
+ {
+ /*******************************************/
+ rc = vdb_copy_db_2_db( ctx, src_db, dst_db );
+ /*******************************************/
+ }
+ VDatabaseRelease( dst_db );
+ }
+ VSchemaRelease( schema );
+ }
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ vdb_copy_perform:
+ * called by "vdb_copy_main()"
+ * makes the "default-schema"
+ * tests if the given source path is a database/table/none-of-that
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+vdb_mgr [IN] ... contains the vdb-manger to create src/dst-objects
+***************************************************************************/
+static rc_t vdb_copy_perform( const p_context ctx,
+ VDBManager * vdb_mgr )
+{
+ VSchema * dflt_schema;
+ rc_t rc = helper_parse_schema( vdb_mgr, &dflt_schema, ctx->src_schema_list );
+ DISP_RC( rc, "vdb_copy_main:helper_parse_schema(dflt) failed" );
+ if ( rc == 0 )
+ {
+ const VDatabase * src_db;
+ /* try to open it as a database */
+ rc = VDBManagerOpenDBRead ( vdb_mgr, &src_db, dflt_schema, "%s", ctx->src_path );
+ if ( rc == 0 )
+ {
+ /* if it succeeds it is a database, continue to copy it */
+ if ( DB_COPY_ENABLED == 1 )
+ {
+ /*********************************************/
+ rc = vdb_copy_database( ctx, vdb_mgr, src_db );
+ /*********************************************/
+ DISP_RC( rc, "vdb_copy_perform:vdb_copy_database() failed" );
+ }
+ else
+ LOGMSG( klogInfo, "a copy of a database is not implemented yet..." );
+ VDatabaseRelease( src_db );
+ }
+ else
+ {
+ const VTable * src_table;
+ /* try to open it as a table */
+ rc = VDBManagerOpenTableRead( vdb_mgr, &src_table,
+ dflt_schema, "%s", ctx->src_path );
+ /* if it succeeds it is a table, continue to copy it */
+ if ( rc == 0 )
+ {
+ /*********************************************/
+ rc = vdb_copy_table( ctx, vdb_mgr, src_table, NULL );
+ /*********************************************/
+ DISP_RC( rc, "vdb_copy_perform:vdb_copy_table() failed" );
+ VTableRelease( src_table );
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcCopying, rcItem, rcNotFound );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "\nthe path '$(path)' cannot be opened as vdb-database or vdb-table",
+ "path=%s", ctx->src_path ));
+ }
+ }
+ VSchemaRelease( dflt_schema );
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ vdb_copy_main:
+ * called by "KMain()"
+ * make the "native directory"
+ * make a vdb-manager for write
+ all subsequent copy-functions will use this manager...
+ * check if the given path is database-path ( by trying to open it )
+ if it is one: continue wit copy_database()
+ * check if the given path is table-path ( by trying to open it )
+ if it is one: continue wit copy_table()
+ * release manager and directory
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+***************************************************************************/
+static rc_t vdb_copy_main( const p_context ctx )
+{
+ KDirectory * directory;
+ rc_t rc = KDirectoryNativeDir( &directory );
+ DISP_RC( rc, "vdb_copy_main:KDirectoryNativeDir() failed" );
+ if ( rc == 0 )
+ {
+ KConfig * config_mgr;
+
+#if TOOLS_USE_SRAPATH != 0
+ if ( !ctx->dont_check_accession )
+ ctx->dont_check_accession = helper_is_this_a_filesystem_path( ctx->src_path );
+ if ( !ctx->dont_check_accession )
+ {
+ rc_t rc1 = helper_resolve_accession( directory, (char**)&( ctx->src_path ) );
+ DISP_RC( rc1, "vdb_copy_main:helper_check_accession() failed" );
+ }
+#endif
+
+ rc = helper_make_config_mgr( &config_mgr, ctx->kfg_path );
+ DISP_RC( rc, "vdb_copy_main:helper_make_config_mgr() failed" );
+ if ( rc == 0 )
+ {
+ VDBManager * vdb_mgr;
+
+ helper_read_config_values( config_mgr, &(ctx->config) );
+ helper_read_redact_values( config_mgr, ctx->rvals );
+ KConfigRelease( config_mgr );
+
+ rc = VDBManagerMakeUpdate ( &vdb_mgr, directory );
+ DISP_RC( rc, "vdb_copy_main:VDBManagerMakeRead() failed" );
+ if ( rc == 0 )
+ {
+ /************************************/
+ rc = vdb_copy_perform( ctx, vdb_mgr );
+ /************************************/
+ VDBManagerRelease( vdb_mgr );
+ }
+ }
+ /* after that we can remove the output-path if necessary */
+ if ( rc != 0 && !ctx->dont_remove_target )
+ rc = helper_remove_path( directory, ctx->dst_path );
+
+ /* now we can release the directory */
+ KDirectoryRelease( directory );
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ Main:
+ * create the copy-context
+ * parse the commandline for arguments and options
+ * react to help/usage - requests ( no dump in this case )
+ these functions are in vdb-copy-context.c
+ * call copy_main() to execute the copy-operation
+ * destroy the copy-context
+***************************************************************************/
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ MyOptions, sizeof MyOptions / sizeof ( OptDef ) );
+ DISP_RC( rc, "KMain:ArgsMakeAndHandle() failed" );
+ if ( rc == 0 )
+ {
+ context *ctx;
+ KLogHandlerSetStdErr();
+ rc = context_init( &ctx );
+ DISP_RC( rc, "KMain:copy_context_init() failed" );
+ if ( rc == 0 )
+ {
+ rc = context_capture_arguments_and_options( args, ctx );
+ DISP_RC( rc, "KMain:context_capture_arguments_and_options() failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->usage_requested ) {
+ MiniUsage( args );
+ rc = RC(rcApp, rcArgv, rcParsing, rcParam, rcInsufficient);
+ }
+ else
+ /************************/
+ rc = vdb_copy_main( ctx );
+ /************************/
+ }
+ context_destroy ( ctx );
+ }
+ ArgsWhack ( args );
+ }
+ return rc;
+}
diff --git a/tools/vdb-copy/vdb-copy.kfg b/tools/vdb-copy/vdb-copy.kfg
new file mode 100644
index 0000000..e2a18fb
--- /dev/null
+++ b/tools/vdb-copy/vdb-copy.kfg
@@ -0,0 +1,94 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+# matching legacy-tables with schema's to write to for vdb-copy
+
+# ILLUMINA
+/VDBCOPY/NCBI_SRA_Illumina_tbl_v0a_1/schema = "sra/illumina.vschema"
+#/VDBCOPY/NCBI_SRA_Illumina_tbl_v0a_1/tab = "NCBI:SRA:Illumina:tbl:q4:v2"
+#/VDBCOPY/NCBI_SRA_Illumina_tbl_v0a_1/tab = "NCBI:SRA:Illumina:tbl:q1:v2"
+/VDBCOPY/NCBI_SRA_Illumina_tbl_v0a_1/tab = "NCBI:SRA:Illumina:tbl:phred:v2"
+/VDBCOPY/_ILLUMINA_/schema = "sra/illumina.vschema"
+/VDBCOPY/_ILLUMINA_/tab = "NCBI:SRA:Illumina:tbl:phred:v2"
+
+
+# _454_
+/VDBCOPY/NCBI_SRA__454__tbl_v0_1/schema = "sra/454.vschema"
+/VDBCOPY/NCBI_SRA__454__tbl_v0_1/tab = "NCBI:SRA:_454_:tbl:v2"
+/VDBCOPY/_454_/schema = "sra/454.vschema"
+/VDBCOPY/_454_/tab = "NCBI:SRA:_454_:tbl:v2"
+
+
+# ABSOLID
+/VDBCOPY/NCBI_SRA_ABI_tbl_v1_1/schema = "sra/abi.vschema"
+/VDBCOPY/NCBI_SRA_ABI_tbl_v1_1/tab = "NCBI:SRA:ABI:tbl:v2"
+/VDBCOPY/_ABSOLID_/schema = "sra/abi.vschema"
+/VDBCOPY/_ABSOLID_/tab = "NCBI:SRA:ABI:tbl:v2"
+
+
+# scoring of different schema-types for lossy-ness
+/VDBCOPY/SCORE/INSDC_2na_bin = "2"
+/VDBCOPY/SCORE/INSDC_x2na_bin = "1"
+/VDBCOPY/SCORE/INSDC_2na_packed = "2"
+/VDBCOPY/SCORE/INSDC_2cs_bin = "2"
+/VDBCOPY/SCORE/INSDC_x2cs_bin = "1"
+/VDBCOPY/SCORE/INSDC_2cs_packed = "2"
+/VDBCOPY/SCORE/INSDC_quality_phred = "1"
+/VDBCOPY/SCORE/INSDC_quality_log_odds = "1"
+/VDBCOPY/SCORE/INSDC_SRA_read_type = "1"
+
+# global vdb-copy-settings for filtering and redacting
+
+/VDBCOPY/READ_FILTER_COL_NAME = "READ_FILTER"
+
+# first redactable columns are detected by their type
+/VDBCOPY/REDACTABLE_TYPES = "INSDC:color:text,INSDC:x2cs:bin,INSDC:2cs:bin,INSDC:2cs:packed,INSDC:dna:text,INSDC:4na:bin,INSDC:4na:packed,INSDC:x2na:bin,INSDC:2na:bin,INSDC:2na:packed,NCBI:SRA:pos16,INSDC:quality:phred,INSDC:quality:log_odds,NCBI:qual4,INSDC:position:one,INSDC:position:zero,NCBI:fsamp4,NCBI:isamp1"
+
+# (1) specify a list of all types with redact-values other than zero
+# key = "/VDBCOPY/REDACTVALUE/TYPES" ( ":" replaced by "_" )
+#
+# (2) specify for each type from (1) a redact-value
+# key = /VDBCOPY/REDACTVALUE/xxxxxx/VALUE
+# ( replace xxxxxx with one of the types from (1) )
+# per default the value is one byte ( len = 1 )
+# the format can be - "'N'" for the ASCII-value of 'N'
+# OR
+# - "1" for the binary value of 1
+# OR
+# - "0x3A" for the binary value of 0x3A (58d)
+#
+# (2) specify for each type from (1) a redact-len (if it differs from 1 byte)
+# key = /VDBCOPY/REDACTVALUE/xxxxxx/LEN
+# ( replace xxxxxx with one of the types from (1) )
+#
+
+/VDBCOPY/REDACTVALUE/TYPES = "INSDC_color_text,INSDC_dna_text,NCBI_qual4"
+/VDBCOPY/REDACTVALUE/INSDC_color_text/VALUE = "'.'"
+/VDBCOPY/REDACTVALUE/INSDC_dna_text/VALUE = "'N'"
+/VDBCOPY/REDACTVALUE/NCBI_qual4/VALUE = "-6"
+
+/VDBCOPY/DO_NOT_REDACT = "CS_KEY,FLOW_CHARS,KEY_SEQUENCE,LINKER_SEQUENCE"
+
+# what root-nodes not to copy while copying metadata
+/VDBCOPY/META/IGNORE = "col,.seq,STATS,BASE_COUNT,HUFFMAN_TREE_POS,HUFFMAN_TREE_POS_SIZE,HUFFMAN_TREE_PRB,HUFFMAN_TREE_PRB_SIZE,HUFFMAN_TREE_SIG,HUFFMAN_TREE_SIG_SIZE,MSC454_CLIP_QUALITY_LEFT,MSC454_CLIP_QUALITY_RIGHT,MSC454_FLOW_CHARS,MSC454_KEY_SEQUENCE,NREADS,NUMBER_POS_CHANNELS,NUMBER_PRB_CHANNELS_1,NUMBER_PRB_COLUMNS,NUMBER_SIG_CHANNELS,PLATFORM,READ_0,READ_1,SPOT_COUNT"
diff --git a/tools/vdb-decrypt/Makefile b/tools/vdb-decrypt/Makefile
new file mode 100644
index 0000000..7651897
--- /dev/null
+++ b/tools/vdb-decrypt/Makefile
@@ -0,0 +1,102 @@
+# ==============================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+USE_GCC_IF_ICC = 1
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-decrypt
+
+INT_TOOLS =
+
+EXT_TOOLS = \
+ vdb-decrypt \
+ vdb-encrypt
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-decrypt
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+VDB_DECRYPT_SRC = \
+ vdb-decrypt \
+ shared
+
+VDB_DECRYPT_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_DECRYPT_SRC))
+
+VDB_DECRYPT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb
+
+$(BINDIR)/vdb-decrypt: $(VDB_DECRYPT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_DECRYPT_LIB)
+
+#-------------------------------------------------------------------------------
+# vdb-encrypt
+# Copy files from one directory to another while cataloging the contents.
+# XML files can be redirected as well.
+#
+VDB_ENCRYPT_SRC = \
+ vdb-encrypt \
+ shared
+
+VDB_ENCRYPT_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_ENCRYPT_SRC))
+
+VDB_ENCRYPT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb
+
+$(BINDIR)/vdb-encrypt: $(VDB_ENCRYPT_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_ENCRYPT_LIB)
+
diff --git a/tools/vdb-decrypt/shared.c b/tools/vdb-decrypt/shared.c
new file mode 100644
index 0000000..dfc492b
--- /dev/null
+++ b/tools/vdb-decrypt/shared.c
@@ -0,0 +1,1271 @@
+/*==============================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include "shared.h"
+
+#include <klib/defs.h>
+#include <klib/callconv.h>
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/status.h>
+#include <klib/log.h>
+#include <klib/debug.h> /* DBGMSG */
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/namelist.h>
+
+#include <kfs/defs.h>
+#include <kfs/file.h>
+#include <kfs/directory.h>
+#include <kfs/sra.h>
+#include <kfs/lockfile.h>
+#include <kfs/cacheteefile.h>
+#include <kfs/buffile.h>
+#include <vfs/manager.h>
+
+#include <krypto/key.h>
+#include <krypto/encfile.h>
+#include <krypto/wgaencrypt.h>
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+
+#include <assert.h>
+#include <string.h>
+#include <stdint.h>
+
+#ifndef RIGOROUS_SRA_CHECK
+#define RIGOROUS_SRA_CHECK 0
+#endif
+
+#define OPTION_FORCE "force"
+#define OPTION_SRA "decrypt-sra-files"
+#define ALIAS_FORCE "f"
+#define ALIAS_SRA NULL
+
+#define MY_MAX_PATH 4096
+
+
+bool ForceFlag = false;
+bool TmpFoundFlag = false;
+bool UseStdin = false;
+bool UseStdout = false;
+bool IsArchive = false;
+
+/* for wga decrypt */
+char Password [4096 + 2];
+size_t PasswordSize;
+
+/* for encfile encrypt/decrypt */
+KKey Key;
+
+const char * ForceUsage[] =
+{ "Force overwrite of existing files", NULL };
+
+/*
+ * option control flags
+ */
+
+const char EncExt[] = ".ncbi_enc";
+static const char TmpExt[] = ".vdb-decrypt-tmp";
+static const char TmpLockExt[] = ".vdb-decrypt-tmp.lock";
+static const char CacheExt[] = ".cache";
+static const char CacheLockExt[] = ".cache.lock";
+
+/* Usage
+ */
+rc_t CC UsageSummary (const char * progname)
+{
+ rc_t rc;
+ {
+ rc = KOutMsg (
+ /*345679012345678901234567890123456789012345678901234567890123456789012345678*/
+ "\n"
+ "Usage:\n"
+ " %s [options] <source-file>\n"
+ " %s [options] <source-file> <destination-file>\n"
+ " %s [options] <source-file> <destination-directory>\n"
+ " %s [options] <directory>\n",
+ progname, progname, progname, progname);
+ }
+#if DIRECTORY_TO_DIRECTORY_SUPPORTED
+ if (rc == 0)
+ rc = KOutMsg (
+ " %s [options] <source-directory> <destination-directory>\n",
+ progname);
+#endif
+ if (rc == 0)
+ {
+ rc = KOutMsg (
+ "\n"
+ "Summary:\n"
+ " %scrypt a file or all the files (recursively) in a directory\n\n",
+ De);
+ }
+ return rc;
+}
+
+rc_t CC Usage (const Args * args)
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ const char * pline[] = {
+ "file to encrypt", NULL,
+ "name of resulting file", NULL,
+ "directory of resulting file", NULL,
+ "directory to encrypt", NULL
+ };
+
+ rc_t rc, orc;
+
+ /* super-fragilistic molti-hacki-docious
+ let's find a better way to reuse things. */
+ if ( de [ 0 ] == 'd' )
+ {
+ pline [ 0 ] = "file to decrypt";
+ pline [ 6 ] = "directory to decrypt";
+ }
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+
+ orc = UsageSummary (progname);
+ if (rc == 0)
+ rc = orc;
+
+ KOutMsg ("Parameters:\n");
+ HelpParamLine ("source-file" , pline);
+ HelpParamLine ("destination-file" , pline + 2);
+ HelpParamLine ("destination-directory", pline + 4);
+ HelpParamLine ("directory" , pline + 6);
+ KOutMsg ("\nOptions:\n");
+ HelpOptionLine (ALIAS_FORCE, OPTION_FORCE, NULL, ForceUsage);
+ CryptOptionLines ();
+ HelpOptionsStandard ();
+
+ /* forcing editor alignment */
+ /* 12345678901234567890123456789012345678901234567890123456789012345678901234567890*/
+ KOutMsg (
+ "\n"
+ "Details:\n"
+ " All %scryptions are non-destructive until successful. No files are deleted or\n"
+ " replaced until the %scryptions are complete.\n"
+ "\n", de, de);
+
+ KOutMsg (
+ " The extension '.ncbi_enc' will be %s when a file is %scrypted.\n"
+ "\n", Decrypting ? "removed" : "added", de);
+
+ if (Decrypting) KOutMsg (
+ " NCBI Archive files that contain NCBI database objects will not be decrypted\n"
+ " unless the %s option is used. As these objects can be used without\n"
+ " decryption it is recommended they remain encrypted.\n"
+ "\n", OPTION_SRA);
+ else KOutMsg (
+ " NCBI Archive files that contain NCBI database objects will not have the\n"
+ " .ncbi_enc extension added.\n\n");
+
+
+ KOutMsg (
+ " If the only parameter is a file name then it will be replaced by a file that\n"
+ " is %scrypted with a possible changed extension.\n"
+ " \n", de);
+
+ KOutMsg (
+ " If the only parameter is a directory, all files in that directory including\n"
+ " all files in subdirectories will be replaced with a possible change\n"
+ " in the extension.\n"
+ "\n");
+
+ KOutMsg (
+ " If there are two parameters a copy is made but the copy will be %scrypted.\n"
+ " If the second parameter is a directory the new file might have a different\n"
+ " extension. If it is not a directory, the extension will be as given in the\n"
+ " the parameter.\n"
+ "\n", de);
+
+ KOutMsg (
+ " Missing directories in the destination path will be created.\n"
+ "\n");
+
+ KOutMsg (
+ " Already existing destination files will cause the program to end with\n"
+ " an error and will be left unchanged unless the --%s option is used to\n"
+ " force the files to be overwritten.\n"
+ "\n", OPTION_FORCE);
+
+ KOutMsg (
+ "Encryption key (file password):\n"
+ " The encryption key or file password is handled by configuration. If not yet\n"
+ " set, this program will fail.\n\n"
+ " Please consult configuration page at\n"
+ " https://www.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=toolkit_doc&f=std or\n"
+ " https://github.com/ncbi/sra-tools/wiki/Toolkit-Configuration\n"
+ );
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+
+
+
+
+/*
+ * determine the archive type for KFile f with pathname name
+ *
+ * This could be extended to handle tar files with a larger head size and
+ * and some less simple checks for a tar header block at the start of
+ * the file.
+ */
+ArcScheme ArchiveTypeCheck (const KFile * f)
+{
+ size_t num_read;
+ rc_t rc;
+ char head [128];
+
+ IsArchive = false;
+ rc = KFileReadAll (f, 0, head, sizeof head, &num_read);
+ if (rc)
+ {
+ LOGERR (klogErr, rc, "Unable to read head of decrypted file");
+ return arcError;
+ }
+
+ rc = KFileIsSRA (head, num_read);
+ if (rc == 0)
+ {
+
+/* OUTMSG (("+++++ ARCHIVE\n")); */
+
+
+ /* a hack... */
+
+ IsArchive = true;
+ return arcSRAFile;
+ }
+/* OUTMSG (("----- not an archive\n")); */
+ return arcNone;
+}
+
+
+/*
+ * Copy a file from a const KFile * to a KFile * with the paths for the two
+ * for logging purposes
+ *
+ * return rc_t = 0 for success
+ * return rc_t != 0 for failure
+ */
+rc_t CopyKFile (const KFile * src, KFile * dst, const char * source, const char * dest)
+{
+ rc_t rc;
+ uint8_t buff [256 * 1024];
+ size_t num_read;
+ size_t num_writ;
+ uint64_t pos;
+
+ for (pos = 0; ; pos += num_read)
+ {
+ rc = Quitting ();
+ if (rc)
+ {
+ LOGMSG (klogFatal, "Received quit");
+ break;
+ }
+
+ rc = KFileReadAll (src, pos, buff, sizeof (buff), &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to read from file $(F) at $(P)",
+ "F=%s,P=%lu", source, pos));
+ break;
+ }
+
+ if (num_read == 0)
+ break;
+
+ rc = KFileWriteAll (dst, pos, buff, num_read, &num_writ);
+ if (rc)
+ {
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write to file $(F) at $(P)",
+ "F=%s,P=%lu", dest, pos));
+ break;
+ }
+
+ if (num_writ != num_read)
+ {
+ rc = RC (rcExe, rcFile, rcWriting, rcFile, rcInsufficient);
+ PLOGERR (klogErr,
+ (klogErr, rc,
+ "Failed to write all to file $(F) at $(P)",
+ "F=%s,P=%lu", dest, pos));
+ break;
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * determine the encryption type for KFile f with pathname name
+ */
+rc_t EncryptionTypeCheck (const KFile * f, const char * name, EncScheme * scheme)
+{
+ size_t num_read;
+ rc_t rc;
+ char head [128];
+
+ assert (f != NULL);
+ assert (name != NULL);
+
+ rc = KFileReadAll (f, 0, head, sizeof head, &num_read);
+ if (rc)
+ {
+ PLOGERR (klogErr, (klogErr, rc, "Unable to read head of "
+ "'$(F)'", "F=%s", name));
+ *scheme = encError;
+ return rc;
+ }
+
+ /* looks for files with NCBInenc or NCBIsenc signatures */
+ rc = KFileIsEnc (head, num_read);
+ if (rc == 0)
+ {
+ /* looks for files with just NCBIsenc signatures */
+ rc = KFileIsSraEnc (head, num_read);
+
+ *scheme = (rc == 0) ? encSraEncFile : encEncFile;
+ }
+ else
+ {
+ rc = KFileIsWGAEnc (head, num_read);
+ if (rc == 0)
+ *scheme = encWGAEncFile;
+ else
+ *scheme = encNone;
+ }
+ return 0;
+}
+
+
+/*
+ * Check a file path name for ending in the extension used by this program
+ *
+ * return true if it ends with the extension and false if it does not
+ */
+static
+bool IsTmpFile (const char * path)
+{
+ const char * pc;
+
+ pc = strrchr (path, '.');
+ if (pc == NULL)
+ return false;
+
+ if (strcmp (pc, TmpExt) == 0)
+ return true;
+
+ pc = string_chr (path, pc - path, '.');
+ if (pc == NULL)
+ return false;
+
+ return (strcmp (pc, TmpLockExt) == 0);
+}
+
+#if 0
+static
+bool IsCacheFile (const char * path)
+{
+ const char * pc;
+
+ pc = strrchr (path, '.');
+ if (pc == NULL)
+ return false;
+
+ if (strcmp (pc, CacheExt) == 0)
+ return true;
+
+ pc = string_chr (path, pc - path, '.');
+ if (pc == NULL)
+ return false;
+
+ return (strcmp (pc, CacheLockExt) == 0);
+}
+#endif
+
+static
+rc_t FileInPlace (KDirectory * cwd, const char * leaf, bool try_rename)
+{
+ rc_t rc;
+ bool is_tmp;
+
+ STSMSG (1, ("%scrypting file in place %s",De,leaf));
+
+ rc = 0;
+ is_tmp = IsTmpFile (leaf);
+ if (is_tmp)
+ {
+ STSMSG (1, ("%s is a vdb-decrypt/vdb-encrypt temporary file and will "
+ "be ignored", leaf));
+ TmpFoundFlag = true;
+ if (ForceFlag)
+ ; /* LOG OVERWRITE */
+ else
+ ; /* LOG TMP */
+ }
+ if (!is_tmp || ForceFlag)
+ {
+ char temp [MY_MAX_PATH];
+
+
+ rc = KDirectoryResolvePath (cwd, false, temp, sizeof temp, ".%s%s",
+ leaf, TmpExt);
+
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "unable to resolve '.$(S)$(E)'",
+ "S=%s,E=%s",leaf,TmpExt));
+ else
+ {
+ KPathType kpt;
+ uint32_t kcm;
+
+ kcm = kcmCreate|kcmParents;
+ kpt = KDirectoryPathType (cwd, "%s", temp);
+ if (kpt != kptNotFound)
+ {
+ /* log busy */
+ if (ForceFlag)
+ {
+ kcm = kcmInit|kcmParents;
+ /* log force */
+ kpt = kptNotFound;
+ }
+ }
+
+ if (kpt == kptNotFound)
+ {
+ const KFile * infile;
+
+ rc = KDirectoryOpenFileRead (cwd, &infile, "%s", leaf);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc, "Unable to resolve '$(F)'",
+ "F=%s",leaf));
+ else
+ {
+ uint64_t fz;
+ size_t z;
+ rc_t irc;
+ uint64_t ignored;
+
+ rc = KFileSize (infile, &fz);
+ /* ignore rc for now? yes hack */
+ z = string_size (leaf);
+
+ /* vdb-decrypt and vdb-encrypt both ignore repository cache files. */
+ irc = GetCacheTruncatedSize (infile, &ignored);
+ if (irc == 0)
+ STSMSG (1, ("skipping cache download file %s", leaf));
+ else if ((fz == 0) &&
+ (string_cmp (leaf + (z - (sizeof (".lock")-1)), sizeof (".lock"),
+ ".lock", sizeof (".lock") , sizeof (".lock")) == 0))
+ STSMSG (1, ("skipping cache lock download file %s", leaf));
+ else
+ {
+ EncScheme scheme;
+
+ rc = EncryptionTypeCheck (infile, leaf, &scheme);
+ if (rc == 0)
+ {
+ ArcScheme ascheme;
+ bool changed;
+ bool do_this_file;
+ char new_name [MY_MAX_PATH + sizeof EncExt];
+
+ do_this_file = DoThisFile (infile, scheme, &ascheme);
+ strcpy (new_name, leaf);
+ if (try_rename && do_this_file)
+ changed = NameFixUp (new_name);
+ else
+ changed = false;
+/* KOutMsg ("### %d \n", changed); */
+
+ if (!do_this_file)
+ {
+ if (changed)
+ {
+ STSMSG (1, ("renaming %s to %s", leaf, new_name));
+ rc = KDirectoryRename (cwd, false, leaf, new_name);
+ }
+ else
+ STSMSG (1, ("skipping %s",leaf));
+ }
+ else
+ {
+ KFile * outfile;
+
+ rc = KDirectoryCreateExclusiveAccessFile (cwd, &outfile,
+ false, 0600, kcm,
+ "%s", temp);
+ if (rc == 0)
+ {
+ const KFile * Infile;
+ KFile * Outfile;
+
+ rc = CryptFile (infile, &Infile, outfile, &Outfile, scheme);
+
+ if (rc == 0)
+ {
+ STSMSG (1, ("copying %s to %s", leaf, temp));
+
+ rc = CopyKFile (Infile, Outfile, leaf, temp);
+
+ if (rc == 0)
+ {
+ uint32_t access;
+ KTime_t date;
+
+ rc = KDirectoryAccess (cwd, &access, "%s", leaf);
+ if (rc == 0)
+ rc = KDirectoryDate (cwd, &date, "%s", leaf);
+
+ KFileRelease (infile);
+ KFileRelease (outfile);
+ KFileRelease (Infile);
+ KFileRelease (Outfile);
+
+ if (rc == 0)
+ {
+ STSMSG (1, ("renaming %s to %s", temp, new_name));
+
+ rc = KDirectoryRename (cwd, true, temp, new_name);
+ if (rc)
+ LOGERR (klogErr, rc, "error renaming");
+ else
+ {
+ if (changed)
+ KDirectoryRemove (cwd, false, "%s", leaf);
+
+ /*rc =*/
+ KDirectorySetAccess (cwd, false, access,
+ 0777, "%s", new_name);
+ KDirectorySetDate (cwd, false, date, "%s", new_name);
+ /* gonna ignore an error here I think */
+ return rc;
+ }
+ }
+ }
+ }
+ KFileRelease (outfile);
+ }
+ }
+ }
+ }
+ KFileRelease (infile);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static
+rc_t FileToFile (const KDirectory * sd, const char * source,
+ KDirectory *dd, const char * dest_, bool try_rename,
+ char * base)
+{
+ const KFile * infile;
+ rc_t rc;
+ uint32_t access;
+ KTime_t date;
+ bool is_tmp;
+ char dest [MY_MAX_PATH + sizeof EncExt];
+
+ strcpy (dest, dest_);
+ if (try_rename)
+ NameFixUp (dest);
+
+ if ((sd == dd) && (strcmp (source, dest) == 0))
+ return FileInPlace (dd, dest, try_rename);
+
+ if (base == NULL)
+ STSMSG (1, ("%scrypting file %s to %s", De, source, dest));
+ else
+ STSMSG (1, ("%scrypting file %s to %s/%s", De, source, base, dest));
+
+ /*
+ * A Hack to make stdin/stout work within KFS
+ */
+ if (UseStdin)
+ {
+ const KFile * iinfile;
+ rc = KFileMakeStdIn (&iinfile);
+ if (rc == 0)
+ {
+ rc = KBufReadFileMakeRead (&infile, iinfile, 64 * 1024);
+ KFileRelease (iinfile);
+ if (rc == 0)
+ {
+ access = 0640;
+ date = 0;
+ goto stdin_shortcut;
+ }
+ LOGERR (klogErr, rc, "error wrapping stdin");
+ return rc;
+ }
+ }
+ rc = 0;
+ is_tmp = IsTmpFile (source);
+
+ if (is_tmp)
+ {
+ TmpFoundFlag = true;
+ if (ForceFlag)
+ ; /* LOG OVERWRITE */
+ else
+ ; /* LOG TMP */
+ }
+ if (!is_tmp || ForceFlag)
+ {
+ rc = KDirectoryAccess (sd, &access, "%s", source);
+ if (rc)
+ LOGERR (klogErr, rc, "Error check permission of source");
+
+ else
+ {
+ rc = KDirectoryDate (sd, &date, "%s", source);
+ if (rc)
+ LOGERR (klogErr, rc, "Error check date of source");
+
+ else
+ {
+ rc = KDirectoryOpenFileRead (sd, &infile, "%s", source);
+ if (rc)
+ PLOGERR (klogErr, (klogErr, rc,
+ "Error opening source file '$(S)'",
+ "S=%s", source));
+ else
+ {
+ EncScheme scheme;
+
+ stdin_shortcut:
+ rc = EncryptionTypeCheck (infile, source, &scheme);
+ if (rc == 0)
+ {
+ KFile * outfile;
+ uint32_t kcm;
+
+ /*
+ * Hack to support stdout before VFS is complete enough to use here
+ */
+ if (UseStdout)
+ {
+ rc = KFileMakeStdOut (&outfile);
+ if (rc)
+ LOGERR (klogErr, rc, "error wrapping stdout");
+ }
+ else
+ {
+ kcm = ForceFlag ? kcmInit|kcmParents : kcmCreate|kcmParents;
+
+ rc = KDirectoryCreateFile (dd, &outfile, false, 0600, kcm, "%s", dest);
+ if (rc)
+ PLOGERR (klogErr,(klogErr, rc, "error opening output '$(O)'",
+ "O=%s", dest));
+ }
+ if (rc == 0)
+ {
+ const KFile * Infile;
+ KFile * Outfile;
+
+ rc = CryptFile (infile, &Infile, outfile, &Outfile, scheme);
+ if (rc == 0)
+ {
+ rc = CopyKFile (Infile, Outfile, source, dest);
+ if (rc == 0)
+ {
+ if (UseStdin || UseStdout)
+ ;
+ else
+ {
+ rc = KDirectorySetAccess (dd, false, access, 0777,
+ "%s", dest);
+
+ if (rc == 0 && date != 0)
+ rc = KDirectorySetDate (dd, false, date, "%s", dest);
+ }
+ }
+ KFileRelease (Infile);
+ KFileRelease (Outfile);
+ }
+ KFileRelease (outfile);
+ }
+ }
+ KFileRelease (infile);
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static
+rc_t DoDir (const KDirectory * sd, KDirectory * dd)
+{
+ KNamelist * names;
+ rc_t rc;
+
+ rc = KDirectoryList (sd, &names, NULL, NULL, ".");
+ if (rc)
+ ;
+ else
+ {
+ uint32_t count;
+
+ rc = KNamelistCount (names, &count);
+ if (rc)
+ ;
+ else
+ {
+ uint32_t idx;
+
+ for (idx = 0; idx < count; ++idx)
+ {
+ const char * name;
+
+ rc = KNamelistGet (names, idx, &name);
+ if (rc)
+ ;
+ else
+ {
+ const KDirectory * nsd;
+ KDirectory * ndd;
+ KPathType kpt;
+
+ kpt = KDirectoryPathType (sd, "%s", name);
+
+ switch (kpt)
+ {
+ default:
+ break;
+
+ case kptFile:
+ if (sd == dd)
+ rc = FileInPlace (dd, name, true);
+ else
+ rc = FileToFile (sd, name, dd, name, true, NULL);
+ break;
+
+ case kptDir:
+ if (sd == dd)
+ {
+ rc = KDirectoryOpenDirUpdate (dd, &ndd, false, "%s", name);
+ if (rc)
+ ;
+ else
+ {
+ /* RECURSION */
+ STSMSG (1, ("%scrypting directory %s", De, name));
+ rc = DoDir (ndd, ndd);
+ STSMSG (1, ("done with directory %s", name));
+ KDirectoryRelease (ndd);
+ }
+ }
+ else
+ {
+ rc = KDirectoryOpenDirRead (sd, &nsd, false, "%s", name);
+ if (rc)
+ ;
+ else
+ {
+ rc = KDirectoryCreateDir (dd, 0600, kcmOpen, "%s", name);
+ if (rc)
+ ;
+ else
+ {
+ rc = KDirectoryOpenDirUpdate (dd, &ndd, false, "%s", name);
+ if (rc)
+ ;
+ else
+ {
+ /* RECURSION */
+ STSMSG (1, ("%scrypting directory %s", De, name));
+ rc = DoDir (nsd, ndd);
+ STSMSG (1, ("done with directory %s", name));
+
+ KDirectoryRelease (ndd);
+ }
+ }
+ KDirectoryRelease (nsd);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ KNamelistRelease (names);
+ }
+ return rc;
+}
+
+
+static
+rc_t Start (KDirectory * cwd, const char * src, const char * dst)
+{
+ KPathType dtype;
+ KPathType stype;
+ char dpath [MY_MAX_PATH];
+ char spath [MY_MAX_PATH];
+ rc_t rc;
+ bool using_stdin, using_stdout, try_rename;
+
+ /* limited anti oops checks */
+ try_rename = (dst == NULL);
+ if (!try_rename)
+ {
+ /* try to prevent file to file clash */
+ if (strcmp (src,dst) == 0)
+ dst = NULL;
+
+ /* try to prevent file to dir clash */
+ else
+ {
+ size_t s,d;
+
+ s = string_size (src);
+ d = string_size (dst);
+
+ if (s > d)
+ {
+ if (string_cmp (src, s, dst, d, d) == 0)
+ {
+ if ((strchr (src+d+1, '/') == NULL) &&
+ ((src[d] == '/') ||
+ (src[d-1] == '/')))
+ {
+ try_rename = true;
+ dst = NULL;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * This is a quick fix "hack"
+ * A fully built out VFS should replace the KFS in use and eliminate this
+ */
+ using_stdin = (strcmp (src, "/dev/stdin") == 0);
+
+ if (using_stdin)
+ {
+ if (dst == NULL)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcParam, rcNull);
+ LOGERR (klogErr, rc, "Unable to handle stdin in place");
+ return rc;
+ }
+ stype = kptFile;
+ strcpy (spath, src);
+ UseStdin = true;
+ STSMSG (1, ("reading console / stdin as input"));
+ goto stdin_shortcut;
+ }
+
+ rc = KDirectoryResolvePath (cwd, false, spath, sizeof spath, "%s", src);
+ if (rc)
+ {
+ LOGERR (klogErr, rc, "can't resolve source");
+ return rc;
+ }
+
+ stype = KDirectoryPathType (cwd, "%s", spath) & ~ kptAlias;
+
+ switch (stype)
+ {
+ case kptNotFound:
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcNotFound);
+ break;
+
+ default:
+ case kptBadPath:
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcInvalid);
+ break;
+
+ case kptCharDev:
+ case kptBlockDev:
+ case kptFIFO:
+ case kptZombieFile:
+ case kptDataset:
+ case kptDatatype:
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcIncorrect);
+ break;
+
+ case kptFile:
+ case kptDir:
+ break;
+ }
+ if (rc)
+ {
+ PLOGERR (klogErr, (klogErr, rc, "can not use source '$(S)'", "S=%s", src));
+ return rc;
+ }
+
+ /*
+ * In Place Operation
+ */
+ if (dst == NULL)
+ {
+
+ /*
+ * Input is a file
+ */
+ if (stype == kptFile)
+ {
+ KDirectory * ndir;
+ char * pc;
+
+ pc = strrchr (spath, '/');
+ if (pc == NULL)
+ {
+ pc = spath;
+ ndir = cwd;
+ rc = KDirectoryAddRef (cwd);
+ }
+ else if (pc == spath)
+ {
+ ++pc;
+ ndir = cwd;
+ rc = KDirectoryAddRef (cwd);
+ }
+ else
+ {
+ *pc++ = '\0';
+ rc = KDirectoryOpenDirUpdate (cwd, &ndir, false, "%s", spath);
+ }
+
+ if (rc == 0)
+ {
+ rc = FileInPlace (ndir, pc, try_rename);
+ KDirectoryRelease (ndir);
+ }
+ }
+ /*
+ * Input is a directory
+ */
+ else
+ {
+ KDirectory * ndir;
+
+ rc = KDirectoryOpenDirUpdate (cwd, &ndir, false, "%s", spath);
+ if (rc)
+ ;
+ else
+ {
+ STSMSG (1, ("%scrypting directory %s", De, spath));
+ rc = DoDir (ndir, ndir);
+ STSMSG (1, ("done with directory %s", spath));
+ KDirectoryRelease (ndir);
+ }
+ }
+ }
+
+ /*
+ * 'Copy' Operation
+ */
+ else
+ {
+ stdin_shortcut:
+ using_stdout = (strcmp (dst, "/dev/stdout") == 0);
+ if (using_stdout == true)
+ {
+ dtype = kptFile;
+ strcpy (dpath, dst);
+ UseStdout = true;
+ STSMSG (1, ("writing console / stdout as output"));
+ goto do_file;
+ }
+ rc = KDirectoryResolvePath (cwd, false, dpath, sizeof dpath, "%s", dst);
+ if (rc)
+ {
+ LOGERR (klogErr, rc, "can't resolve destination");
+ return rc;
+ }
+ dtype = KDirectoryPathType (cwd, "%s", dpath) & ~ kptAlias;
+ switch (dtype)
+ {
+ default:
+ case kptBadPath:
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcInvalid);
+ PLOGERR (klogErr, (klogErr, rc, "can not use destination '$(S)'", "S=%s", dst));
+ break;
+
+ case kptCharDev:
+ case kptBlockDev:
+ case kptFIFO:
+ case kptZombieFile:
+ case kptDataset:
+ case kptDatatype:
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcIncorrect);
+ PLOGERR (klogErr, (klogErr, rc, "can not use destination parameter '$(S)'", "S=%s", dst));
+ break;
+
+ case kptNotFound:
+ {
+ size_t z;
+
+ z = strlen (dst) - 1;
+ if ((dst[z] == '/') || (stype == kptDir))
+ goto do_dir;
+ else
+ goto do_file;
+ }
+
+ case kptFile:
+ if (!ForceFlag)
+ {
+ rc = RC (rcExe, rcArgv, rcParsing, rcFile, rcExists);
+ PLOGERR (klogErr, (klogErr, rc, "can not over-write '$(F)' without --force",
+ "F=%s", dpath));
+ break;
+ }
+ do_file:
+ if (stype == kptFile)
+ {
+ rc = FileToFile (cwd, spath, cwd, dpath, try_rename, NULL);
+ }
+ else
+ {
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcIncorrect);
+ LOGERR (klogErr, rc, "Can't do directory to file");
+ }
+ break;
+
+ do_dir:
+ case kptDir:
+ /*
+ * Input is a directory
+ */
+ if (stype == kptDir)
+ {
+#if DIRECTORY_TO_DIRECTORY_SUPPORTED
+ const KDirectory * sdir;
+ KDirectory * ddir;
+
+ rc = KDirectoryOpenDirRead (cwd, &sdir, false, "%s", spath);
+ if (rc)
+ ;
+ else
+ {
+ if (dtype == kptNotFound)
+ {
+ STSMSG (1, ("creating output directory %s", dpath));
+ rc = KDirectoryCreateDir (cwd, 0775, kcmCreate|kcmParents,
+ "%s", dpath);
+ }
+ if (rc == 0)
+ {
+ rc = KDirectoryOpenDirUpdate (cwd, &ddir, false, "%s", dpath);
+ if (rc)
+ ;
+ else
+ {
+ STSMSG (1, ("%scrypting directory %s to %s", De, spath, dpath));
+ rc = DoDir (sdir, ddir);
+ STSMSG (1, ("done with directory %s to %s", spath, dpath));
+ KDirectoryRelease (ddir);
+ }
+ }
+ KDirectoryRelease (sdir);
+ }
+#else
+ rc = RC (rcExe, rcArgv, rcResolving, rcPath, rcIncorrect);
+ LOGERR (klogErr, rc, "Can't do directory to directory");
+#endif
+ }
+ /*
+ * Input is a file
+ */
+ else
+ {
+ KDirectory * ndir;
+ const char * pc;
+
+ if (dtype == kptNotFound)
+ {
+ STSMSG (1, ("creating output directory %s", dpath));
+ rc = KDirectoryCreateDir (cwd, 0775, kcmCreate|kcmParents,
+ "%s", dpath);
+ }
+ if (rc == 0)
+ {
+
+ STSMSG (1, ("opening output directory %s", dpath));
+ rc = KDirectoryOpenDirUpdate (cwd, &ndir, false, "%s", dpath);
+ if (rc)
+ ;
+ else
+ {
+ pc = strrchr (spath, '/');
+ if (pc == NULL)
+ pc = spath;
+ else
+ ++pc;
+
+ rc = FileToFile (cwd, spath, ndir, pc, true, dpath);
+
+ KDirectoryRelease (ndir);
+ }
+ }
+ }
+ break;
+ }
+ }
+ return rc;
+}
+
+
+static
+rc_t StartFileSystem (const char * src, const char * dst)
+{
+ VFSManager * vmanager;
+ rc_t rc;
+
+ rc = VFSManagerMake (&vmanager);
+ if (rc)
+ LOGERR (klogErr, rc, "Failed to open file system");
+
+ else
+ {
+ rc = VFSManagerGetKryptoPassword (vmanager, Password, sizeof Password,
+ &PasswordSize);
+ if (rc != 0)
+ LOGERR (klogErr, rc, "unable to obtain a password");
+
+ else
+ {
+ rc = KKeyInitRead (&Key, kkeyAES128, Password, PasswordSize);
+ if (rc)
+ LOGERR (klogErr, rc, "Unable to make encryption/decryption key");
+
+ else
+ {
+ KDirectory * cwd;
+
+ rc = VFSManagerGetCWD (vmanager, &cwd);
+ if (rc)
+ LOGERR (klogInt, rc, "unable to access current directory");
+
+ else
+ {
+ rc = Start (cwd, src, dst);
+
+ KDirectoryRelease (cwd);
+ }
+ }
+ }
+ VFSManagerRelease (vmanager);
+ }
+ return rc;
+}
+
+
+rc_t CommonMain (Args * args)
+{
+ rc_t rc;
+ uint32_t ocount; /* we take the address of ocount but not pcount. */
+ uint32_t pcount; /* does that help the compiler optimize? */
+
+ rc = ArgsParamCount (args, &ocount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to count parameters");
+
+ else if ((pcount = ocount) == 0)
+ MiniUsage (args);
+
+ else if (pcount > 2)
+ {
+ LOGERR (klogErr, rc, "too many parameters");
+ MiniUsage(args);
+ }
+
+ else
+ {
+ const char * dst; /* we only take the address of one of these */
+ const char * src;
+
+ rc = ArgsOptionCount (args, OPTION_FORCE, &ocount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine force option");
+
+ else
+ {
+ ForceFlag = (ocount > 0);
+
+ /* -----
+ * letting comp put src in register
+ * only if it wants
+ */
+ rc = ArgsParamValue (args, 0, (const void **)&dst);
+ if (rc)
+ LOGERR (klogInt, rc, "Failure to fetch "
+ "source parameter");
+
+ else
+ {
+ src = dst;
+
+ if (pcount == 1)
+ dst = NULL;
+
+ else
+ {
+ rc = ArgsParamValue (args, 1, (const void **)&dst);
+ if (rc)
+ LOGERR (klogInt, rc, "Failure to fetch "
+ "destination parameter");
+ }
+
+ if (rc == 0)
+ rc = StartFileSystem (src, dst);
+ }
+ }
+ }
+ return rc;
+}
+
+/* EOF */
diff --git a/tools/vdb-decrypt/shared.h b/tools/vdb-decrypt/shared.h
new file mode 100644
index 0000000..37998bd
--- /dev/null
+++ b/tools/vdb-decrypt/shared.h
@@ -0,0 +1,93 @@
+/*==============================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#ifndef _tools_vdb_decrypt_shared_h_
+#define _tools_vdb_decrypt_shared_h_
+
+#define DIRECTORY_TO_DIRECTORY_SUPPORTED 0
+
+#include <klib/defs.h>
+#include <krypto/key.h>
+#include <kapp/args.h>
+
+#define OPTION_FORCE "force"
+#define OPTION_DEC_SRA "decrypt-sra-files"
+#define ALIAS_FORCE "f"
+#define ALIAS_DEC_SRA NULL
+
+extern const bool Decrypting;
+
+extern char Password [];
+extern size_t PasswordSize;
+
+extern const char De [];
+extern const char de [];
+extern const char SraOption[];
+
+extern const char EncExt[];
+bool NameFixUp (char * name);
+extern const char * ForceUsage[];
+
+/* for encfile encrypt/decrypt */
+extern KKey Key;
+
+
+typedef enum ArcScheme
+{
+ arcError,
+ arcNone,
+ arcSRAFile
+} ArcScheme;
+
+extern bool IsArchive; /* this approach makes threading fail */
+
+struct KFile;
+
+ArcScheme ArchiveTypeCheck (const struct KFile * f);
+
+typedef enum EncScheme
+{
+ encError,
+ encNone,
+ encEncFile,
+ encSraEncFile,
+ encWGAEncFile
+} EncScheme;
+
+void CryptOptionLines ();
+
+bool DoThisFile (const struct KFile * infile, EncScheme enc, ArcScheme * arc);
+
+struct Args;
+rc_t CommonMain (struct Args * args);
+
+rc_t CryptFile (const struct KFile * in, const struct KFile ** new_in,
+ struct KFile * out, struct KFile ** new_out, EncScheme scheme);
+
+
+#endif
+
+/* EOF */
diff --git a/tools/vdb-decrypt/vdb-decrypt.c b/tools/vdb-decrypt/vdb-decrypt.c
new file mode 100644
index 0000000..b01f136
--- /dev/null
+++ b/tools/vdb-decrypt/vdb-decrypt.c
@@ -0,0 +1,269 @@
+/*==============================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#include "shared.h"
+
+#include <krypto/wgaencrypt.h>
+#include <krypto/encfile.h>
+#include <kfs/file.h>
+#include <kfs/cacheteefile.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+#include <klib/log.h>
+#include <klib/status.h>
+
+#include <string.h>
+#include <assert.h>
+
+/* Usage
+ */
+const char UsageDefaultName [] = "vdb-decrypt";
+const char * UsageSra [] = { "decrypt sra archives - [NOT RECOMMENDED]",
+ NULL };
+const char De[] = "De";
+const char de[] = "de";
+const char OptionSra[] = OPTION_DEC_SRA;
+
+
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_DEC_SRA, ALIAS_DEC_SRA, NULL, UsageSra, 0, false, false },
+ { OPTION_FORCE, ALIAS_FORCE, NULL, ForceUsage, 0, false, false }
+};
+
+
+static
+bool DecryptSraFlag = false;
+
+
+const bool Decrypting = true;
+
+void CryptOptionLines ()
+{
+ HelpOptionLine (ALIAS_DEC_SRA, OPTION_DEC_SRA, NULL, UsageSra);
+}
+
+bool DoThisFile (const KFile * infile, EncScheme enc, ArcScheme * parc)
+{
+ const KFile * Infile;
+ ArcScheme arc;
+ rc_t rc;
+
+ *parc = arcNone;
+
+ switch (enc)
+ {
+ default:
+ STSMSG (1, ("not encrypted"));
+ return false;
+
+ case encEncFile:
+ /*
+ * this will apply to KEncFiles versions 1 and 2, maybe not 3
+ * but will hopefully become obsolete eventually.
+ */
+ rc = KEncFileMakeRead (&Infile, infile, &Key); /* replace with VFSManagerOpenFileReadDirectoryRelativeInt */
+ if (rc)
+ return false;
+ break;
+
+ case encSraEncFile:
+ /* these are NCBIsenc instead of NCBInenc */
+ goto sra_enc_file;
+
+ case encWGAEncFile:
+ rc = KFileMakeWGAEncRead (&Infile, infile, Password, PasswordSize);
+ if (rc)
+ return false;
+ break;
+ }
+ arc = ArchiveTypeCheck (Infile);
+ KFileRelease (Infile);
+ switch (arc)
+ {
+ default:
+ return false;
+ case arcNone:
+ return true;
+ case arcSRAFile:
+ break;
+ }
+sra_enc_file:
+ *parc = arcSRAFile;
+ STSMSG (1, ("encrypted sra archive\ndecryption%s requested",
+ DecryptSraFlag ? "" : " not"));
+ return DecryptSraFlag;
+}
+
+bool NameFixUp (char * name)
+{
+ char * pc = strrchr (name, '.');
+ if (pc != NULL)
+ {
+ if (strcmp (pc, EncExt) == 0)
+ {
+ pc[0] = '\0';
+ return true;
+ }
+ }
+ return false;
+}
+
+rc_t CryptFile (const KFile * in, const KFile ** new_in,
+ KFile * out, KFile ** new_out, EncScheme scheme)
+{
+ const KFile * dec;
+ rc_t rc;
+
+ assert (in);
+ assert (out);
+ assert (new_in);
+ assert (new_out);
+
+
+ rc = KFileAddRef (out);
+ if (rc)
+ return rc;
+
+ switch (scheme)
+ {
+ default:
+ case encError:
+ rc = RC (rcExe, rcFile, rcClassifying, rcFile, rcInvalid);
+ break;
+
+ case encNone:
+ copy:
+ rc = KFileAddRef (in);
+ if (rc)
+ goto fail;
+ *new_in = in;
+ *new_out = out;
+ STSMSG (1, ("not encrypted just copying"));
+ return 0;
+
+ case encEncFile:
+ rc = KEncFileMakeRead (&dec, in, &Key);
+ made_enc:
+ if (rc)
+ goto fail;
+
+ switch (ArchiveTypeCheck (dec))
+ {
+ default:
+ case arcError:
+ rc = RC (rcExe, rcFile, rcClassifying, rcFile, rcInvalid);
+ break;
+
+ case arcSRAFile:
+ if (!DecryptSraFlag)
+ {
+ rc = KFileRelease (dec);
+ if (rc)
+ {
+ KFileRelease (dec);
+ KFileRelease (in);
+ goto fail;
+ }
+ goto copy;
+ }
+ /* fall through */
+ case arcNone:
+ *new_out = out;
+ *new_in = dec;
+ return 0;
+ }
+ break;
+
+ case encWGAEncFile:
+ rc = KFileMakeWGAEncRead (&dec, in, Password, PasswordSize);
+ goto made_enc;
+ break;
+ }
+ fail:
+ KFileRelease (out);
+ *new_in = *new_out = NULL;
+ return rc;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ KStsLevelSet (1);
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options,
+ sizeof (Options) / sizeof (Options[0]));
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+
+ else
+ {
+ uint32_t ocount;
+
+ rc = ArgsOptionCount (args, OPTION_DEC_SRA, &ocount);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to examine decrypt "
+ "sra option");
+ else
+ {
+ DecryptSraFlag = (ocount > 0);
+
+ rc = CommonMain (args);
+ }
+ ArgsWhack (args);
+ }
+
+ if (rc)
+ STSMSG (1, ("exiting: %R (%u)", rc, rc));
+ else
+ STSMSG (1, ("exiting: success"));
+ return rc;
+}
+
+
+/* EOF */
diff --git a/tools/vdb-decrypt/vdb-encrypt.c b/tools/vdb-decrypt/vdb-encrypt.c
new file mode 100644
index 0000000..17c842e
--- /dev/null
+++ b/tools/vdb-decrypt/vdb-encrypt.c
@@ -0,0 +1,215 @@
+/*==============================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+
+#include "shared.h"
+
+#include <krypto/wgaencrypt.h>
+#include <krypto/encfile.h>
+#include <kfs/file.h>
+#include <klib/rc.h>
+#include <klib/defs.h>
+#include <klib/log.h>
+#include <klib/status.h>
+
+#include <assert.h>
+#include <string.h>
+
+/* Usage
+ */
+const char UsageDefaultName [] = "vdb-encrypt";
+const char De[] = "En";
+const char de[] = "en";
+
+
+static
+OptDef Options[] =
+{
+ /* name alias max times oparam required fmtfunc help text loc */
+ { OPTION_FORCE, ALIAS_FORCE, NULL, ForceUsage, 0, false, false }
+};
+
+/* static bool DecryptSraFlag = false; */
+
+const bool Decrypting = false;
+
+void CryptOptionLines () {}
+
+bool DoThisFile (const KFile * infile, EncScheme enc, ArcScheme * parc)
+{
+ const KFile * Infile;
+ ArcScheme arc;
+ rc_t rc;
+ bool do_enc;
+
+ *parc = arcNone;
+
+ switch (enc)
+ {
+ default:
+ STSMSG (1, ("error checking encrypted"));
+ return false;
+
+ case encNone:
+ do_enc = true;
+ rc = KFileAddRef (infile);
+ if (rc)
+ return false;
+ Infile = infile;
+ break;
+
+ case encEncFile:
+ do_enc = false;
+ rc = KEncFileMakeRead (&Infile, infile, &Key);
+ if (rc)
+ return false;
+ break;
+
+ case encWGAEncFile:
+ do_enc = false;
+ rc = KFileMakeWGAEncRead (&Infile, infile, Password, PasswordSize);
+ if (rc)
+ return false;
+ break;
+ }
+ arc = ArchiveTypeCheck (Infile);
+ KFileRelease (Infile);
+ if (arc == arcSRAFile)
+ {
+ STSMSG (1, ("%sencrypted sra archive", do_enc ? "un" : ""));
+ *parc = arcSRAFile;
+ }
+ return do_enc;
+}
+
+bool NameFixUp (char * name)
+{
+ char * pc = strrchr (name, '.');
+
+ if (((pc != NULL) &&
+ (strcmp (pc, EncExt) == 0)) ||
+ IsArchive )
+ return false;
+
+ strcat (name, EncExt);
+
+ return true;
+}
+
+rc_t CryptFile (const KFile * in, const KFile ** new_in,
+ KFile * out, KFile ** new_out, EncScheme scheme)
+{
+ rc_t rc;
+
+ assert (in);
+ assert (out);
+ assert (new_in);
+ assert (new_out);
+
+ *new_in = *new_out = NULL;
+
+ rc = KFileAddRef (in);
+ if (rc)
+ return rc;
+
+ switch (scheme)
+ {
+ default:
+ case encError:
+ KFileRelease (in);
+ return RC (rcExe, rcEncryption, rcParsing, rcFile, rcInvalid);
+
+ case encNone:
+ rc = KEncFileMakeWrite (new_out, out, &Key);
+ if (rc)
+ {
+ KFileRelease (in);
+ return rc;
+ }
+ break;
+
+ case encEncFile:
+ case encWGAEncFile:
+ rc = KFileAddRef (out);
+ if (rc)
+ {
+ KFileRelease (in);
+ return rc;
+ }
+ *new_out = out;
+ STSMSG (1, ("already encrypted just copying"));
+ break;
+ }
+ *new_in = in;
+ return 0;
+}
+
+
+/* KMain - EXTERN
+ * executable entrypoint "main" is implemented by
+ * an OS-specific wrapper that takes care of establishing
+ * signal handlers, logging, etc.
+ *
+ * in turn, OS-specific "main" will invoke "KMain" as
+ * platform independent main entrypoint.
+ *
+ * "argc" [ IN ] - the number of textual parameters in "argv"
+ * should never be < 0, but has been left as a signed int
+ * for reasons of tradition.
+ *
+ * "argv" [ IN ] - array of NUL terminated strings expected
+ * to be in the shell-native character set: ASCII or UTF-8
+ * element 0 is expected to be executable identity or path.
+ */
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc;
+
+ KStsLevelSet (1);
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options,
+ sizeof (Options) / sizeof (Options[0]));
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+
+ else
+ {
+ rc = CommonMain (args);
+
+ ArgsWhack (args);
+ }
+
+ if (rc)
+ STSMSG (1, ("exiting: %R (%u)", rc, rc));
+ else
+ STSMSG (1, ("exiting: success"));
+
+ return rc;
+}
+
+
+/* EOF */
diff --git a/tools/vdb-diff/Makefile b/tools/vdb-diff/Makefile
new file mode 100644
index 0000000..c3e5b18
--- /dev/null
+++ b/tools/vdb-diff/Makefile
@@ -0,0 +1,79 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-diff
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ vdb-diff
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-diff
+#
+
+VDB_DIFF_SRC = \
+ namelist_tools \
+ coldefs \
+ vdb-diff
+
+VDB_DIFF_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_DIFF_SRC))
+
+VDB_DIFF_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/vdb-diff: $(VDB_DIFF_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_DIFF_LIB)
diff --git a/tools/vdb-diff/coldefs.c b/tools/vdb-diff/coldefs.c
new file mode 100644
index 0000000..d067d8f
--- /dev/null
+++ b/tools/vdb-diff/coldefs.c
@@ -0,0 +1,211 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "coldefs.h"
+#include <klib/text.h>
+#include <klib/out.h>
+
+#include <vdb/table.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+/*
+ * helper-function for: col_defs_destroy
+ * - free's everything a node owns
+ * - free's the node
+*/
+static void CC col_defs_destroy_pair( void * node, void * data )
+{
+ col_pair * pair = node;
+ if ( pair != NULL )
+ {
+
+ if ( pair -> name != NULL )
+ {
+ free( pair -> name );
+ pair -> name = NULL;
+ }
+
+ free( pair );
+ }
+}
+
+
+/*
+ * initializes a column-definitions-list
+*/
+rc_t col_defs_init( col_defs ** defs )
+{
+ rc_t rc = 0;
+
+ if ( defs == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcSelf, rcNull );
+ else
+ {
+ col_defs * tmp = calloc( 1, sizeof( * tmp ) );
+ if ( tmp == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ else
+ {
+ VectorInit( &( tmp ->cols ), 0, 5 );
+ *defs = tmp;
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * destroys the column-definitions-list
+*/
+rc_t col_defs_destroy( col_defs * defs )
+{
+ rc_t rc = 0;
+ if ( defs == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcDestroying, rcSelf, rcNull );
+ else
+ {
+ VectorWhack( &( defs -> cols ), col_defs_destroy_pair, NULL );
+ free( defs );
+ }
+ return rc;
+}
+
+
+/*
+ * helper-function for: col_defs_parse_string / col_defs_extract_from_table
+ * - creates a column-definition by the column-name
+ * - adds the definition to the column-definition-vector
+*/
+static rc_t col_defs_append_col_pair( col_defs * defs, const char * name )
+{
+ rc_t rc = 0;
+
+ if ( name == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ else if ( name[ 0 ] == 0 )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcEmpty );
+ else
+ {
+ col_pair * new_pair = calloc( 1, sizeof( * new_pair ) );
+ if ( new_pair == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcParsing, rcMemory, rcExhausted );
+ else
+ {
+ new_pair -> name = string_dup_measure ( name, NULL );
+ rc = VectorAppend( &( defs -> cols ), NULL, new_pair );
+ if ( rc != 0 )
+ col_defs_destroy_pair( new_pair, NULL );
+ }
+ }
+ return rc;
+}
+
+
+/*
+*/
+rc_t col_defs_fill( col_defs * defs, const KNamelist * list )
+{
+ rc_t rc = 0;
+
+ if ( defs == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ else if ( list == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount( list, &count );
+ if ( rc != 0 )
+ KOutMsg( "col_defs_extract_from_table:KNamelistCount() failed %R\n", rc );
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * name;
+ rc = KNamelistGet( list, idx, &name );
+ if ( rc != 0 )
+ KOutMsg( "col_defs_extract_from_table:KNamelistGet() failed %R\n", rc );
+ else
+ rc = col_defs_append_col_pair( defs, name );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * how many columns do we have in here?
+*/
+rc_t col_defs_count( const col_defs * defs, uint32_t * count )
+{
+ rc_t rc = 0;
+ if ( defs == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ else if ( count == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ else
+ {
+ *count = VectorLength( &( defs -> cols ) );
+ }
+ return rc;
+}
+
+
+/*
+ * add the pairs in defs to the given cursor
+*/
+rc_t col_defs_add_to_cursor( col_defs * defs, const VCursor * cur, int idx )
+{
+ rc_t rc = 0;
+
+ if ( defs == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcSelf, rcNull );
+ else if ( cur == NULL )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcNull );
+ else if ( idx < 0 || idx > 1 )
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ else
+ {
+ uint32_t i;
+ uint32_t count = VectorLength( &( defs -> cols ) );
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ col_pair * pair = VectorGet( &( defs -> cols ), i );
+ if ( pair != NULL )
+ rc = VCursorAddColumn( cur, &( pair -> pair[ idx ].idx ), "%s", pair -> name );
+ }
+ }
+ return rc;
+}
diff --git a/tools/vdb-diff/coldefs.h b/tools/vdb-diff/coldefs.h
new file mode 100644
index 0000000..e964568
--- /dev/null
+++ b/tools/vdb-diff/coldefs.h
@@ -0,0 +1,105 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_coldefs_
+#define _h_vdb_coldefs_
+
+#include <klib/defs.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/namelist.h>
+
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/********************************************************************
+col-def is the definition of a single column: index/type
+********************************************************************/
+typedef struct col_def
+{
+ uint32_t idx; /* index of this column in curosr */
+} col_def;
+
+
+/********************************************************************
+col-pair is the definition of pair of columns with same name
+********************************************************************/
+typedef struct col_pair
+{
+ char * name;
+ col_def pair[ 2 ]; /* a pair of sub-col-defs */
+} col_pair;
+
+
+/********************************************************************
+the col-defs are a vector of single column-pairs
+********************************************************************/
+typedef struct col_defs
+{
+ Vector cols;
+} col_defs;
+
+
+/*
+ * initializes a column-definitions-list
+*/
+rc_t col_defs_init( col_defs ** defs );
+
+
+/*
+ * destroys the column-definitions-list
+*/
+rc_t col_defs_destroy( col_defs * defs );
+
+
+/*
+ * setup the list with pairs made from the given list
+*/
+rc_t col_defs_fill( col_defs * defs, const KNamelist * list );
+
+
+/*
+ * how many columns do we have in here?
+*/
+rc_t col_defs_count( const col_defs * defs, uint32_t * count );
+
+
+/*
+ * add the pairs in defs to the given cursor
+*/
+rc_t col_defs_add_to_cursor( col_defs * defs, const VCursor * cur, int idx );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-diff/namelist_tools.c b/tools/vdb-diff/namelist_tools.c
new file mode 100644
index 0000000..1871512
--- /dev/null
+++ b/tools/vdb-diff/namelist_tools.c
@@ -0,0 +1,299 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#include "namelist_tools.h"
+
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src )
+{
+ VNamelist *v_names;
+ rc_t rc = VNamelistMake ( &v_names, 5 );
+ if ( rc == 0 )
+ {
+ char * s = string_dup_measure ( src, NULL );
+ if ( s )
+ {
+ uint32_t str_begin = 0;
+ uint32_t str_end = 0;
+ char c;
+ do
+ {
+ c = s[ str_end ];
+ if ( c == ',' || c == 0 )
+ {
+ if ( str_begin < str_end )
+ {
+ char c_temp = c;
+ s[ str_end ] = 0;
+ rc = VNamelistAppend ( v_names, &(s[str_begin]) );
+ s[ str_end ] = c_temp;
+ }
+ str_begin = str_end + 1;
+ }
+ str_end++;
+ } while ( c != 0 && rc == 0 );
+ free( s );
+ }
+ if ( rc == 0 )
+ rc = VNamelistToConstNamelist ( v_names, list );
+ VNamelistRelease( v_names );
+ }
+ return rc;
+}
+
+
+int nlt_strcmp( const char* s1, const char* s2 )
+{
+ size_t n1 = string_size ( s1 );
+ size_t n2 = string_size ( s2 );
+ return string_cmp
+ ( s1, n1, s2, n2, ( n1 < n2 ) ? ( uint32_t ) n2 : ( uint32_t ) n1 );
+}
+
+
+bool nlt_is_name_in_namelist( const KNamelist *list, const char *name_to_find )
+{
+ uint32_t count, idx;
+ bool res = false;
+ if ( list == NULL || name_to_find == NULL )
+ return res;
+ if ( KNamelistCount( list, &count ) == 0 )
+ {
+ for ( idx = 0; idx < count && res == false; ++idx )
+ {
+ const char *item_name;
+ if ( KNamelistGet( list, idx, &item_name ) == 0 )
+ {
+ if ( nlt_strcmp( item_name, name_to_find ) == 0 )
+ res = true;
+ }
+ }
+ }
+ return res;
+}
+
+/*
+ - list1 and list2 containts strings
+ - if one of the strings in list2 is contained ( partial match, strstr() )
+ in one of the strings in list1 the function returns true...
+*/
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 )
+{
+ uint32_t count1;
+ bool res = false;
+ if ( list1 == NULL || list2 == NULL )
+ return res;
+ if ( KNamelistCount( list1, &count1 ) == 0 )
+ {
+ uint32_t idx1;
+ for ( idx1 = 0; idx1 < count1 && res == false; ++idx1 )
+ {
+ const char *string1;
+ if ( KNamelistGet( list1, idx1, &string1 ) == 0 )
+ {
+ uint32_t count2;
+ if ( KNamelistCount( list2, &count2 ) == 0 )
+ {
+ uint32_t idx2;
+ for ( idx2 = 0; idx2 < count2 && res == false; ++idx2 )
+ {
+ const char *string2;
+ if ( KNamelistGet( list2, idx2, &string2 ) == 0 )
+ {
+ if ( strstr( string1, string2 ) != NULL )
+ res = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return res;
+}
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove )
+{
+ rc_t rc = 0;
+ uint32_t count;
+
+ if ( source == NULL || dest == NULL || to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ *dest = NULL;
+ rc = KNamelistCount( source, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ VNamelist *cleaned;
+ rc = VNamelistMake ( &cleaned, count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( source, idx, &s );
+ if ( rc == 0 )
+ {
+ if ( !nlt_is_name_in_namelist( to_remove, s ) )
+ rc = VNamelistAppend ( cleaned, s );
+ }
+ rc = VNamelistToConstNamelist ( cleaned, dest );
+ }
+ }
+ }
+ return rc;
+}
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove )
+{
+ rc_t rc = 0;
+ const KNamelist *to_remove;
+
+ if ( source == NULL || dest == NULL || items_to_remove == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ rc = nlt_make_namelist_from_string( &to_remove, items_to_remove );
+ if ( rc == 0 )
+ {
+ rc = nlt_remove_names_from_namelist( source, dest, to_remove );
+ KNamelistRelease( to_remove );
+ }
+ return rc;
+}
+
+
+bool nlt_compare_namelists( const KNamelist *nl1, const KNamelist *nl2, uint32_t * found )
+{
+ bool res = false;
+ if ( nl1 != NULL && nl2 != NULL )
+ {
+ uint32_t count_1;
+ rc_t rc = KNamelistCount( nl1, &count_1 );
+ if ( rc == 0 )
+ {
+ uint32_t count_2;
+ rc = KNamelistCount( nl2, &count_2 );
+ if ( rc == 0 && count_1 == count_2 )
+ {
+ uint32_t idx;
+ uint32_t in_nl2 = 0;
+ for ( idx = 0; idx < count_1 && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( nl1, idx, &s );
+ if ( rc == 0 && s != NULL && nlt_is_name_in_namelist( nl2, s ) )
+ in_nl2++;
+ }
+ res = ( rc == 0 && in_nl2 == count_1 );
+ if ( found != NULL ) *found = in_nl2;
+ }
+ }
+ }
+ return res;
+}
+
+
+rc_t nlt_copy_namelist( const KNamelist *src, const KNamelist ** dst )
+{
+ VNamelist *v_names;
+ rc_t rc = VNamelistMake ( &v_names, 5 );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( src, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( src, idx, &s );
+ if ( rc == 0 && s != NULL )
+ rc = VNamelistAppend ( v_names, s );
+ }
+ }
+ if ( rc == 0 )
+ rc = VNamelistToConstNamelist ( v_names, dst );
+ VNamelistRelease( v_names );
+ }
+ return rc;
+}
+
+
+rc_t nlt_build_intersect( const KNamelist *nl1, const KNamelist *nl2, const KNamelist ** dst )
+{
+ VNamelist *v_names;
+ rc_t rc = VNamelistMake ( &v_names, 5 );
+ if ( rc == 0 )
+ {
+ /* loop through nl1: if a entry is found in nl2 -> add it to dst */
+ uint32_t count;
+ rc = KNamelistCount( nl1, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( nl1, idx, &s );
+ if ( rc == 0 && s != NULL )
+ {
+ if ( nlt_is_name_in_namelist( nl2, s ) )
+ rc = VNamelistAppend ( v_names, s );
+ }
+ }
+ }
+ if ( rc == 0 )
+ rc = VNamelistToConstNamelist ( v_names, dst );
+ VNamelistRelease( v_names );
+
+ }
+ return rc;
+}
+
+bool nlt_namelist_is_sub_set_in_full_set( const KNamelist * sub_set, const KNamelist * full_set )
+{
+ bool res = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( sub_set, &count );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ uint32_t found = 0;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *s;
+ rc = KNamelistGet( sub_set, idx, &s );
+ if ( rc == 0 && s != NULL && nlt_is_name_in_namelist( full_set, s ) )
+ found++;
+ }
+ res = ( rc == 0 && count == found );
+ }
+ return res;
+}
diff --git a/tools/vdb-diff/namelist_tools.h b/tools/vdb-diff/namelist_tools.h
new file mode 100644
index 0000000..6819960
--- /dev/null
+++ b/tools/vdb-diff/namelist_tools.h
@@ -0,0 +1,59 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_namelist_tools_
+#define _h_namelist_tools_
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int nlt_strcmp( const char* s1, const char* s2 );
+rc_t nlt_make_namelist_from_string( const KNamelist **list, const char * src );
+bool nlt_is_name_in_namelist( const KNamelist *list, const char *name_to_find );
+bool nlt_namelist_intersect( const KNamelist *list1, const KNamelist *list2 );
+
+rc_t nlt_remove_names_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const KNamelist *to_remove );
+
+rc_t nlt_remove_strings_from_namelist( const KNamelist *source,
+ const KNamelist **dest, const char *items_to_remove );
+
+bool nlt_compare_namelists( const KNamelist *nl1, const KNamelist *nl2, uint32_t * found );
+
+rc_t nlt_copy_namelist( const KNamelist *src, const KNamelist ** dst );
+
+rc_t nlt_build_intersect( const KNamelist *nl1, const KNamelist *nl2, const KNamelist ** dst );
+
+bool nlt_namelist_is_sub_set_in_full_set( const KNamelist * sub_set, const KNamelist * full_set );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-diff/vdb-diff.c b/tools/vdb-diff/vdb-diff.c
new file mode 100644
index 0000000..4e78b7f
--- /dev/null
+++ b/tools/vdb-diff/vdb-diff.c
@@ -0,0 +1,1002 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/main.h>
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/num-gen.h>
+#include <klib/progressbar.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+
+#include <sra/sraschema.h>
+
+#include "coldefs.h"
+#include "namelist_tools.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+
+#define OPTION_ROWS "rows"
+#define ALIAS_ROWS "R"
+
+#define OPTION_COLUMNS "columns"
+#define ALIAS_COLUMNS "C"
+
+#define OPTION_TABLE "table"
+#define ALIAS_TABLE "T"
+
+#define OPTION_PROGRESS "progress"
+#define ALIAS_PROGRESS "p"
+
+#define OPTION_MAXERR "maxerr"
+#define ALIAS_MAXERR "e"
+
+#define OPTION_INTERSECT "intersect"
+#define ALIAS_INTERSECT "i"
+
+#define OPTION_EXCLUDE "exclude"
+#define ALIAS_EXCLUDE "x"
+
+static const char * rows_usage[] = { "set of rows to be comparend (default = all)", NULL };
+static const char * columns_usage[] = { "set of columns to be compared (default = all)", NULL };
+static const char * table_usage[] = { "name of table (in case of database ) to be compared", NULL };
+static const char * progress_usage[] = { "show progress in percent", NULL };
+static const char * maxerr_usage[] = { "max errors im comparing (default = 1)", NULL };
+static const char * intersect_usage[] = { "intersect column-set from both runs", NULL };
+static const char * exclude_usage[] = { "exclude these columns from comapring", NULL };
+
+OptDef MyOptions[] =
+{
+ { OPTION_ROWS, ALIAS_ROWS, NULL, rows_usage, 1, true, false },
+ { OPTION_COLUMNS, ALIAS_COLUMNS, NULL, columns_usage, 1, true, false },
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, false },
+ { OPTION_PROGRESS, ALIAS_PROGRESS, NULL, progress_usage, 1, false, false },
+ { OPTION_MAXERR, ALIAS_MAXERR, NULL, maxerr_usage, 1, true, false },
+ { OPTION_INTERSECT, ALIAS_INTERSECT, NULL, intersect_usage, 1, false, false },
+ { OPTION_EXCLUDE, ALIAS_EXCLUDE, NULL, exclude_usage, 1, true, false }
+};
+
+
+const char UsageDefaultName[] = "vdb-diff";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s <src_path> <dst_path> [options]\n"
+ "\n", progname );
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+ HelpOptionLine ( ALIAS_ROWS, OPTION_ROWS, "row-range", rows_usage );
+ HelpOptionLine ( ALIAS_COLUMNS, OPTION_COLUMNS, "column-set", columns_usage );
+ HelpOptionLine ( ALIAS_TABLE, OPTION_TABLE, "table-name", table_usage );
+ HelpOptionLine ( ALIAS_PROGRESS, OPTION_PROGRESS, NULL, progress_usage );
+ HelpOptionLine ( ALIAS_MAXERR, OPTION_MAXERR, "max value", maxerr_usage );
+ HelpOptionLine ( ALIAS_INTERSECT, OPTION_INTERSECT, NULL, intersect_usage );
+ HelpOptionLine ( ALIAS_EXCLUDE, OPTION_EXCLUDE, "column-set", exclude_usage );
+
+ HelpOptionsStandard ();
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+struct diff_ctx
+{
+ const char * src1;
+ const char * src2;
+ const char * columns;
+ const char * excluded;
+ const char * table;
+
+ struct num_gen * rows;
+ uint32_t max_err;
+ bool show_progress;
+ bool intersect;
+};
+
+
+static void init_diff_ctx( struct diff_ctx * dctx )
+{
+ dctx -> src1 = NULL;
+ dctx -> src2 = NULL;
+ dctx -> columns = NULL;
+ dctx -> excluded = NULL;
+ dctx -> table = NULL;
+
+ dctx -> rows = NULL;
+ dctx -> show_progress = false;
+ dctx -> intersect = false;
+}
+
+
+static void release_diff_ctx( struct diff_ctx * dctx )
+{
+ /* do not release the src1,src2,columns,table pointers! they are owned by the Args-obj. */
+ if ( dctx -> rows != 0 )
+ {
+ num_gen_destroy( dctx -> rows );
+ }
+}
+
+
+static const char * get_str_option( const Args *args, const char * option_name )
+{
+ const char * res = NULL;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option_name, &count );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else if ( count > 0 )
+ {
+ rc = ArgsOptionValue( args, option_name, 0, (const void **)&res );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsOptionValue( 0 ) failed" );
+ }
+ }
+ return res;
+}
+
+
+static bool get_bool_option( const Args *args, const char * option_name, bool dflt )
+{
+ bool res = dflt;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( args, option_name, &count );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsOptionCount() failed" );
+ }
+ else if ( count > 0 )
+ {
+ res = true;
+ }
+ return res;
+}
+
+
+static uint32_t get_uint32t_option( const Args *args, const char * option_name, uint32_t dflt )
+{
+ uint32_t res = dflt;
+ const char * s = get_str_option( args, option_name );
+ if ( s != NULL ) res = atoi( s );
+ return res;
+}
+
+
+static rc_t gather_diff_ctx( struct diff_ctx * dctx, Args * args )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else if ( count < 2 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcReading, rcParam, rcIncorrect );
+ LOGERR ( klogInt, rc, "This tool needs 2 arguments: source1 and source2" );
+ }
+ else
+ {
+ rc = ArgsParamValue( args, 0, (const void **)&dctx->src1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsParamValue( 1 ) failed" );
+ }
+ else
+ {
+ rc = ArgsParamValue( args, 1, (const void **)&dctx->src2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsParamValue( 2 ) failed" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ const char * s = get_str_option( args, OPTION_ROWS );
+ if ( s != NULL )
+ {
+ rc = num_gen_make_from_str( &dctx->rows, s );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "num_gen_make_from_str() failed" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ dctx -> columns = get_str_option( args, OPTION_COLUMNS );
+ dctx -> excluded = get_str_option( args, OPTION_EXCLUDE );
+ dctx -> show_progress = get_bool_option( args, OPTION_PROGRESS, false );
+ dctx -> intersect = get_bool_option( args, OPTION_INTERSECT, false );
+ dctx -> max_err = get_uint32t_option( args, OPTION_MAXERR, 1 );
+ }
+
+ return rc;
+}
+
+
+static rc_t report_diff_ctx( struct diff_ctx * dctx )
+{
+ rc_t rc = KOutMsg( "src[ 1 ] : %s\n", dctx -> src1 );
+ if ( rc == 0 )
+ rc = KOutMsg( "src[ 2 ] : %s\n", dctx -> src2 );
+
+ if ( rc == 0 )
+ {
+ if ( dctx -> rows != NULL )
+ {
+ char buffer[ 4096 ];
+ rc = num_gen_as_string( dctx -> rows, buffer, sizeof buffer, NULL, false );
+ if ( rc == 0 )
+ rc = KOutMsg( "- rows : %s\n", buffer );
+ }
+ else
+ rc = KOutMsg( "- rows : all\n" );
+ }
+
+ if ( rc == 0 && dctx -> columns != NULL )
+ rc = KOutMsg( "- columns : %s\n", dctx -> columns );
+ if ( rc == 0 && dctx -> excluded != NULL )
+ rc = KOutMsg( "- exclude : %s\n", dctx -> excluded );
+ if ( rc == 0 && dctx -> table != NULL )
+ rc = KOutMsg( "- table : %s\n", dctx -> table );
+ if ( rc == 0 )
+ rc = KOutMsg( "- progress : %s\n", dctx -> show_progress ? "show" : "hide" );
+ if ( rc == 0 )
+ rc = KOutMsg( "- intersect: %s\n", dctx -> intersect ? "yes" : "no" );
+ if ( rc == 0 )
+ rc = KOutMsg( "- max err : %u\n", dctx -> max_err );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t diff_columns_iter( col_defs * defs, const VCursor * cur_1, const VCursor * cur_2,
+ struct diff_ctx * dctx, const struct num_gen_iter * iter )
+{
+ uint32_t column_count;
+ rc_t rc = col_defs_count( defs, &column_count );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "col_defs_count() failed" );
+ }
+ else
+ {
+ struct progressbar * progress = NULL;
+ int64_t row_id;
+ uint64_t rows_checked = 0;
+ uint64_t rows_different = 0;
+
+ if ( dctx -> show_progress )
+ make_progressbar( &progress, 2 );
+
+ while ( rc == 0 && num_gen_iterator_next( iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 ) rc = Quitting(); /* to be able to cancel the loop by signal */
+ if ( rc == 0 )
+ {
+ bool row_equal = true;
+
+ uint32_t col_id;
+ for ( col_id = 0; col_id < column_count && rc == 0; ++col_id )
+ {
+ col_pair * pair = VectorGet( &( defs -> cols ), col_id );
+ if ( pair != NULL )
+ {
+ uint32_t elem_bits_1, boff_1, row_len_1;
+ const void * base_1;
+ rc = VCursorCellDataDirect ( cur_1, row_id, pair->pair[ 0 ].idx,
+ &elem_bits_1, &base_1, &boff_1, &row_len_1 );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorCellDataDirect( #1 [$(col)].$(row) ) failed",
+ "col=%s,row=%ld", pair->name, row_id ) );
+ }
+ else
+ {
+ uint32_t elem_bits_2, boff_2, row_len_2;
+ const void * base_2;
+ rc = VCursorCellDataDirect ( cur_2, row_id, pair->pair[ 1 ].idx,
+ &elem_bits_2, &base_2, &boff_2, &row_len_2 );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorCellDataDirect( #2 [$(col)].$(row) ) failed",
+ "col=%s,row=%ld", pair->name, row_id ) );
+ }
+ else
+ {
+ bool bin_diff = true;
+
+ if ( elem_bits_1 != elem_bits_2 )
+ {
+ bin_diff = row_equal = false;
+ rc = KOutMsg( "%s[ %ld ].elem_bits %u != %u\n", pair->name, row_id, elem_bits_1, elem_bits_2 );
+ }
+
+ if ( row_len_1 != row_len_2 )
+ {
+ bin_diff = row_equal = false;
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%s[ %ld ].row_len %u != %u\n", pair->name, row_id, row_len_1, row_len_2 );
+ }
+ }
+
+ if ( boff_1 != 0 || boff_2 != 0 )
+ {
+ bin_diff = row_equal = false;
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%s[ %ld ].bit_offset: %u, %u\n", pair->name, row_id, boff_1, boff_2 );
+ }
+ }
+
+ if ( bin_diff )
+ {
+ size_t num_bits = ( row_len_1 * elem_bits_1 );
+ if ( num_bits & 0x07 )
+ {
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%s[ %ld ].bits_total %% 8 = %u\n", pair->name, row_id, ( num_bits % 8 ) );
+ }
+ }
+ else
+ {
+ size_t num_bytes = ( num_bits >> 3 );
+ int cmp = memcmp ( base_1, base_2, num_bytes );
+ if ( cmp != 0 )
+ {
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%s[ %ld ] differ\n", pair->name, row_id );
+ }
+ row_equal = false;
+ }
+ }
+ }
+ }
+ }
+ }
+ } /* for ( col_id ... ) */
+
+ if ( !row_equal )
+ {
+ if ( rc == 0 ) rc = KOutMsg( "\n" );
+ rows_different ++;
+ if ( rows_different >= dctx -> max_err )
+ rc = RC( rcExe, rcNoTarg, rcComparing, rcRow, rcInconsistent );
+ }
+ rows_checked ++;
+
+ if ( progress != NULL )
+ {
+ uint32_t progress_value;
+ if ( num_gen_iterator_percent( iter, 2, &progress_value ) == 0 )
+ update_progressbar( progress, progress_value );
+ }
+
+ } /* if (!Quitting) */
+ } /* while ( num_gen_iterator_next() ) */
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n%,lu rows checked ( %d columns each ), %,lu rows differ\n",
+ rows_checked, column_count, rows_different );
+
+ if ( rows_different > 0 )
+ rc = RC( rcExe, rcNoTarg, rcComparing, rcRow, rcInconsistent );
+
+ if ( progress != NULL )
+ destroy_progressbar( progress );
+
+ } /* if ( col_defs_count == 0 )*/
+
+ return rc;
+}
+
+
+static rc_t diff_columns_cursor( col_defs * defs, const VCursor * cur_1, const VCursor * cur_2, struct diff_ctx * dctx )
+{
+ int64_t first_1;
+ uint64_t count_1;
+ rc_t rc = VCursorIdRange( cur_1, 0, &first_1, &count_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VCursorIdRange( acc #1 ) failed" );
+ }
+ else
+ {
+ int64_t first_2;
+ uint64_t count_2;
+ rc = VCursorIdRange( cur_2, 0, &first_2, &count_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VCursorIdRange( acc #2 ) failed" );
+ }
+ else
+ {
+ struct num_gen * rows_to_diff = NULL;
+ if ( dctx -> rows != NULL )
+ {
+ num_gen_copy( dctx -> rows, &rows_to_diff );
+ }
+
+ if ( rows_to_diff == NULL )
+ {
+ /* no row-range given create the number generator from the discovered range, if it is the same */
+ if ( first_1 != first_2 || count_1 != count_2 )
+ {
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc, "row-ranges differ: $(first1).$(count1) != $(first2).$(count2)",
+ "first1=%ld,count1=%lu,first2=%ld,count2=%lu",
+ first_1, count_1, first_2, count_2 ) );
+ }
+ else
+ {
+ rc = num_gen_make_from_range( &rows_to_diff, first_1, count_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "num_gen_make_from_range() failed" );
+ }
+ }
+ }
+ else
+ {
+ /* row-range given, clip the rows be the 2 ranges ( even if they are not the same ) */
+ rc = num_gen_trim( rows_to_diff, first_1, count_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "num_gen_trim( acc #1 ) failed" );
+ }
+ else if ( first_1 != first_2 || count_1 != count_2 )
+ {
+ rc = num_gen_trim( rows_to_diff, first_2, count_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "num_gen_trim( acc #2 ) failed" );
+ }
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ const struct num_gen_iter * iter;
+ rc = num_gen_iterator_make( rows_to_diff, &iter );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "num_gen_iterator_make() failed" );
+ }
+ else
+ {
+ /* *************************************************************** */
+ rc = diff_columns_iter( defs, cur_1, cur_2, dctx, iter );
+ /* *************************************************************** */
+ num_gen_iterator_destroy( iter );
+ }
+ }
+
+ if ( rows_to_diff != NULL )
+ num_gen_destroy( rows_to_diff );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t diff_columns( col_defs * defs, const VTable * tab_1, const VTable * tab_2, struct diff_ctx * dctx )
+{
+ const VCursor * cur_1;
+ rc_t rc = VTableCreateCursorRead( tab_1, &cur_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VTableCreateCursorRead( acc #1 ) failed" );
+ }
+ else
+ {
+ const VCursor * cur_2;
+ rc = VTableCreateCursorRead( tab_2, &cur_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VTableCreateCursorRead( acc #2 ) failed" );
+ }
+ else
+ {
+ rc = col_defs_add_to_cursor( defs, cur_1, 0 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "failed to add all requested columns to cursor of 1st accession" );
+ }
+ else
+ {
+ rc = col_defs_add_to_cursor( defs, cur_2, 1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "failed to add all requested columns to cursor of 2nd accession" );
+ }
+ else
+ {
+ rc = VCursorOpen( cur_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VCursorOpen( acc #1 ) failed" );
+ }
+ else
+ {
+ rc = VCursorOpen( cur_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VCursorOpen( acc #2 ) failed" );
+ }
+ else
+ {
+ /* ************************************************** */
+ rc = diff_columns_cursor( defs, cur_1, cur_2, dctx );
+ /* ************************************************** */
+ }
+ }
+ }
+ }
+ VCursorRelease( cur_2 );
+ }
+ VCursorRelease( cur_1 );
+ }
+ return 0;
+}
+
+
+static rc_t compare_2_namelists( const KNamelist * cols_1, const KNamelist * cols_2, const KNamelist ** cols_to_diff, bool intersect )
+{
+ uint32_t count_1;
+ rc_t rc = KNamelistCount( cols_1, &count_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "KNamelistCount() failed" );
+ }
+ else
+ {
+ uint32_t count_2;
+ rc = KNamelistCount( cols_2, &count_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "KNamelistCount() failed" );
+ }
+ else if ( count_1 != count_2 )
+ {
+ if ( intersect )
+ {
+ rc = nlt_build_intersect( cols_1, cols_2, cols_to_diff );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "nlt_build_intersect() failed" );
+ }
+ }
+ else
+ {
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "the accessions have not the same number of columns! ( $(count1) != $(count2) )\n",
+ "count1=%u,count2=%u", count_1, count_2 ) );
+ *cols_to_diff = NULL;
+ }
+ }
+ else
+ {
+ uint32_t found_in_both;
+ bool equal = nlt_compare_namelists( cols_1, cols_2, &found_in_both );
+ if ( equal )
+ {
+ rc = nlt_copy_namelist( cols_1, cols_to_diff );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "nlt_copy_namelist() failed" );
+ }
+ }
+ else
+ {
+ if ( intersect )
+ {
+ rc = nlt_build_intersect( cols_1, cols_2, cols_to_diff );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "nlt_build_intersect() failed" );
+ }
+ }
+ else
+ {
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ KOutMsg( "the 2 accessions have not the same set of columns! ( %u found in both )\n", found_in_both );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t extract_columns_from_2_namelists( const KNamelist * cols_1, const KNamelist * cols_2, const char * sub_set,
+ const KNamelist ** cols_to_diff )
+{
+ rc_t rc = nlt_make_namelist_from_string( cols_to_diff, sub_set );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "cannot parse set of requested columns" );
+ }
+ else
+ {
+ if ( nlt_namelist_is_sub_set_in_full_set( *cols_to_diff, cols_1 ) )
+ {
+ if ( nlt_namelist_is_sub_set_in_full_set( *cols_to_diff, cols_2 ) )
+ {
+ rc = 0;
+ }
+ else
+ {
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ LOGERR ( klogInt, rc, "accession #2 is missing some of the requested columns" );
+ }
+ }
+ else
+ {
+ rc = RC( rcExe, rcNoTarg, rcResolving, rcParam, rcInvalid );
+ LOGERR ( klogInt, rc, "accession #1 is missing some of the requested columns" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t perform_table_diff( const VTable * tab_1, const VTable * tab_2, struct diff_ctx * dctx )
+{
+ col_defs * defs;
+ rc_t rc = col_defs_init( &defs );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "col_defs_init() failed" );
+ }
+ else
+ {
+ KNamelist * cols_1;
+ rc_t rc = VTableListReadableColumns( tab_1, &cols_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VTableListReadableColumns( acc #1 ) failed" );
+ }
+ else
+ {
+ KNamelist * cols_2;
+ rc = VTableListReadableColumns( tab_2, &cols_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VTableListReadableColumns( acc #2 ) failed" );
+ }
+ else
+ {
+ const KNamelist * cols_to_diff;
+
+ if ( dctx -> columns == NULL )
+ rc = compare_2_namelists( cols_1, cols_2, &cols_to_diff, dctx -> intersect );
+ else
+ rc = extract_columns_from_2_namelists( cols_1, cols_2, dctx -> columns, &cols_to_diff );
+
+ if ( rc == 0 && dctx -> excluded != NULL )
+ {
+ const KNamelist * temp;
+ rc = nlt_remove_strings_from_namelist( cols_to_diff, &temp, dctx -> excluded );
+ KNamelistRelease( cols_to_diff );
+ cols_to_diff = temp;
+ }
+
+ if ( rc == 0 )
+ {
+ rc = col_defs_fill( defs, cols_to_diff );
+ if ( rc == 0 )
+ {
+ /* ******************************************* */
+ rc = diff_columns( defs, tab_1, tab_2, dctx );
+ /* ******************************************* */
+ }
+ KNamelistRelease( cols_to_diff );
+ }
+
+ KNamelistRelease( cols_2 );
+ }
+ KNamelistRelease( cols_1 );
+ }
+ col_defs_destroy( defs );
+ }
+ return 0;
+}
+
+
+static rc_t perform_database_diff_on_this_table( const VDatabase * db_1, const VDatabase * db_2,
+ struct diff_ctx * dctx, const char * table_name )
+{
+ /* we want to compare only the table wich name was given at the commandline */
+ const VTable * tab_1;
+ rc_t rc = VDatabaseOpenTableRead ( db_1, &tab_1, "%s", table_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VDatabaseOpenTableRead( [$(acc)].$(tab) ) failed",
+ "acc=%s,tab=%s", dctx -> src1, table_name ) );
+ }
+ else
+ {
+ const VTable * tab_2;
+ rc = VDatabaseOpenTableRead ( db_2, &tab_2, "%s", table_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VDatabaseOpenTableRead( [$(acc)].$(tab) ) failed",
+ "acc=%s,tab=%s", dctx -> src2, table_name ) );
+ }
+ else
+ {
+ /* ******************************************* */
+ rc = perform_table_diff( tab_1, tab_2, dctx );
+ /* ******************************************* */
+ VTableRelease( tab_2 );
+ }
+ VTableRelease( tab_1 );
+ }
+ return rc;
+}
+
+
+static rc_t perform_database_diff( const VDatabase * db_1, const VDatabase * db_2, struct diff_ctx * dctx )
+{
+ rc_t rc = 0;
+ if ( dctx -> table != NULL )
+ {
+ /* we want to compare only the table wich name was given at the commandline */
+ /* ************************************************************************** */
+ rc = perform_database_diff_on_this_table( db_1, db_2, dctx, dctx -> table );
+ /* ************************************************************************** */
+ }
+ else
+ {
+ /* we want to compare all tables of the 2 accession, if they have the same set of tables */
+ KNamelist * table_set_1;
+ rc = VDatabaseListTbl ( db_1, &table_set_1 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VDatabaseListTbl( acc #1 ) failed" );
+ }
+ else
+ {
+ KNamelist * table_set_2;
+ rc = VDatabaseListTbl ( db_2, &table_set_2 );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VDatabaseListTbl( acc #2 ) failed" );
+ }
+ else
+ {
+ if ( nlt_compare_namelists( table_set_1, table_set_2, NULL ) )
+ {
+ /* the set of tables match, walk the first set, and perform a diff on each table */
+ uint32_t count;
+ rc = KNamelistCount( table_set_1, &count );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "KNamelistCount() failed" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * table_name;
+ rc = KNamelistGet( table_set_1, idx, &table_name );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "KNamelistGet() failed" );
+ }
+ else
+ {
+ rc = KOutMsg( "\ncomparing table: %s\n", table_name );
+ if ( rc == 0 )
+ {
+ /* ********************************************************************* */
+ rc = perform_database_diff_on_this_table( db_1, db_2, dctx, table_name );
+ /* ********************************************************************* */
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ LOGERR ( klogInt, rc, "the 2 databases have not the same set of tables" );
+ }
+ KNamelistRelease( table_set_2 );
+ }
+ KNamelistRelease( table_set_1 );
+ }
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ perform the actual diffing
+***************************************************************************/
+static rc_t perform_diff( struct diff_ctx * dctx )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ const VDBManager * vdb_mgr;
+ rc = VDBManagerMakeRead ( &vdb_mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VDBManagerMakeRead() failed" );
+ }
+ else
+ {
+ VSchema * vdb_schema = NULL;
+ rc = VDBManagerMakeSRASchema( vdb_mgr, &vdb_schema );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "VDBManagerMakeSRASchema() failed" );
+ }
+ else
+ {
+ const VDatabase * db_1;
+ /* try to open it as a database */
+ rc = VDBManagerOpenDBRead ( vdb_mgr, &db_1, vdb_schema, "%s", dctx -> src1 );
+ if ( rc == 0 )
+ {
+ const VDatabase * db_2;
+ rc = VDBManagerOpenDBRead ( vdb_mgr, &db_2, vdb_schema, "%s", dctx -> src2 );
+ if ( rc == 0 )
+ {
+ /* ******************************************** */
+ rc = perform_database_diff( db_1, db_2, dctx );
+ /* ******************************************** */
+ VDatabaseRelease( db_2 );
+ }
+ else
+ {
+ LOGERR ( klogInt, rc, "accession #1 opened as database, but accession #2 cannot be opened as database" );
+ }
+ VDatabaseRelease( db_1 );
+ }
+ else
+ {
+ const VTable * tab_1;
+ rc = VDBManagerOpenTableRead( vdb_mgr, &tab_1, vdb_schema, "%s", dctx -> src1 );
+ if ( rc == 0 )
+ {
+ const VTable * tab_2;
+ rc = VDBManagerOpenTableRead( vdb_mgr, &tab_2, vdb_schema, "%s", dctx -> src2 );
+ if ( rc == 0 )
+ {
+ /* ******************************************** */
+ rc = perform_table_diff( tab_1, tab_2, dctx );
+ /* ******************************************** */
+ VTableRelease( tab_2 );
+ }
+ else
+ {
+ LOGERR ( klogInt, rc, "accession #1 opened as table, but accession #2 cannot be opened as table" );
+ }
+ VTableRelease( tab_1 );
+ }
+ else
+ {
+ LOGERR ( klogInt, rc, "accession #1 cannot be opened as table or database" );
+ }
+ }
+ VSchemaRelease( vdb_schema );
+ }
+ VDBManagerRelease( vdb_mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ Main:
+***************************************************************************/
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc = ArgsMakeAndHandle ( &args, argc, argv, 1,
+ MyOptions, sizeof MyOptions / sizeof ( OptDef ) );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogInt, rc, "ArgsMakeAndHandle failed()" );
+ }
+ else
+ {
+ struct diff_ctx dctx;
+
+ KLogHandlerSetStdErr();
+ init_diff_ctx( &dctx );
+ rc = gather_diff_ctx( &dctx, args );
+ if ( rc == 0 )
+ {
+ rc = report_diff_ctx( &dctx );
+ if ( rc == 0 )
+ {
+ /* ***************************** */
+ rc = perform_diff( &dctx );
+ /* ***************************** */
+ }
+ }
+ release_diff_ctx( &dctx );
+
+ ArgsWhack ( args );
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/.gitignore b/tools/vdb-dump/.gitignore
new file mode 100644
index 0000000..1ec835e
--- /dev/null
+++ b/tools/vdb-dump/.gitignore
@@ -0,0 +1,2 @@
+test3
+vdbdump
diff --git a/tools/vdb-dump/Makefile b/tools/vdb-dump/Makefile
new file mode 100644
index 0000000..b47f869
--- /dev/null
+++ b/tools/vdb-dump/Makefile
@@ -0,0 +1,92 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-dump
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ vdb-dump
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#-------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-dump
+# vdb dump tool
+#
+VDB_DUMP_SRC = \
+ vdb-dump-context \
+ vdb-dump-coldefs \
+ vdb-dump-tools \
+ vdb-dump-str \
+ vdb-dump-helper \
+ vdb-dump-filter \
+ vdb-dump-formats \
+ vdb-dump-redir \
+ vdb-dump-fastq \
+ vdb-dump-bin \
+ vdb-dump-interact \
+ vdb-dump-repo \
+ vdb-dump-print \
+ vdb_info \
+ vdb-dump
+
+VDB_DUMP_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_DUMP_SRC))
+
+VDB_DUMP_LIB = \
+ -skapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/vdb-dump: $(VDB_DUMP_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_DUMP_LIB)
+
diff --git a/tools/vdb-dump/help.txt b/tools/vdb-dump/help.txt
new file mode 100644
index 0000000..d3d6f7e
--- /dev/null
+++ b/tools/vdb-dump/help.txt
@@ -0,0 +1,352 @@
+vdb-dump extended help
+
+(1) dumping a vdb-table:
+
+ the only mandatory option to vdb-dump is the name of the object to dump:
+
+ vdb-dump OBJECT
+
+ the OBJECT can be:
+
+ a) absolute or relative path to a vdb-table (a directory)
+
+ on linux: vdb-dump /panfs/traces/sra0/SRR/000000/SRR000001
+
+
+ on windows: vdb-dump \\panfs\traces\sra0\SRR\000000\SRR000001
+ vdb-dump Y:\sra0\SRR\000000\SRR000001
+ ( if "\\panfs\traces" is mapped to the driveletter Y on your windows-pc )
+
+ b) absolute or relative path to a file containing a vdb-table
+
+ on linux/windows: vdb-dump SRR044989.sra
+
+ c) an accession
+
+ on linux/windows: vdb-dump SRR000001
+
+ outside NCBI you need internet access to reach accessions stored at NCBI and you need
+ remote access enabled in your configuration
+
+ If you specify only the object, vdb-dump will dump all columns for all rows to the standard-output.
+
+
+The --table / -T option:
+========================
+vdb-dump is designed to operate on a vdb-database. A vdb-database can contain more then one table.
+If you do not specify the table-name, vdb-dump will first try to interpret the given object as a vdb-database
+( and try to dump the table "SEQUENCE", if that table does not exist: the first table it finds in this database ).
+If this try (silently) fails, because the given object is not a database, vdb-dump will try to interpret
+the given object as a table. If the object is not a vdb-database or vdb-table, the tool will fail.
+
+
+The --rows / -R option:
+=======================
+With this option you can restrict which rows will be dumped.
+vdb-dump file.sra -R 5 ... will dump only row number 5
+vdb-dump file.sra -R 5-20 ... will dump rows number 5 to number 20 (15 rows)
+The ranges can be mixed:
+vdb-dump file.sra -R 5,7-20,200-201,300,305 ... will dump these rows/ranges
+If you omit the range, vdb-dump will output all rows.
+
+
+The --columns -C option:
+========================
+With this option you can restrict which columns per row will be dumped.
+vdb-dump file.sra -C NAME,READ ... will dump only the columns NAME and READ per row
+
+
+the --exclude -x option:
+========================
+If you want to dump all columns, except some specific ones.
+vdb-dump file.sra -x READ,RD_FILTER ... will dump all columns but the READ-column
+and the RD_FILTER-column.
+
+
+The --row_id_on -I option:
+==========================
+vdb-dump does not output the row-id per default, it has to be switched on with this option:
+
+vdb-dump SRR000001 -R1 -CNAME,SPOT_LEN
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 255
+
+vdb-dump SRR000001 -R1 -CNAME,SPOT_LEN -I
+ROW-ID = 1
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 255
+
+
+The --line_feed -l option:
+==========================
+vdb-dump separates the rows by one empty line (line-feed) per default:
+
+vdb-dump SRR000001 -R1-3 -CNAME,SPOT_LEN
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 255
+
+ NAME: EM7LVYS01B2EMP
+SPOT_LEN: 248
+
+ NAME: EM7LVYS01C2YO0
+SPOT_LEN: 307
+
+with this option you can change that:
+
+vdb-dump SRR000001 -R1-3 -CNAME,SPOT_LEN -l2
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 255
+
+
+ NAME: EM7LVYS01B2EMP
+SPOT_LEN: 248
+
+
+ NAME: EM7LVYS01C2YO0
+SPOT_LEN: 307
+
+
+The --colname_off -N option:
+============================
+vdb-dump prints the name of every column in front of the it's data:
+
+vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 255
+
+ NAME: EM7LVYS01B2EMP
+SPOT_LEN: 248
+
+With this option it prints only the data:
+
+vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -N
+EM7LVYS01C1LWG
+255
+
+EM7LVYS01B2EMP
+248
+
+
+The --in_hex -X option:
+=======================
+With this option all numeric outputs are printed as hexadecimal numbers:
+
+$vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -X
+ NAME: EM7LVYS01C1LWG
+SPOT_LEN: 0xFF
+
+ NAME: EM7LVYS01B2EMP
+SPOT_LEN: 0xF8
+
+
+The --dna_baese -D option:
+==========================
+With this option you can force columns into printed as DNA-base "ACGT",
+but only if the column has a datatype with more than one dimension.
+If a column has a datatype with a dimension of 2, each dimension 1 bit,
+it is automatically printed as DNA-base.
+
+
+The --max_length -M option:
+===========================
+With this options you can truncate the output of columns longer than this limit.
+
+vdb-dump SRR000001 -R1-2 -CREAD
+READ: TCAGGGGGGAGCTTAAATTTGAAACTAGAAAAATTTTGAACAAAATAATCATAATTGTTAGCTGATGAAAAACTAGAAAAGATTTTCTGAGTGTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAACGGTATCCCGTAGTGTGCATTCATCCCTGCTCTGGATACAGTCAGCTCCCAAATTCCATAAACAACTCCTTTGTAAGTAACCTCCTTTTGACAGGGGGTACTGAGCGGGCTGGCAAGGCN
+
+READ: TCAGGGGGGGGTTACACGTGCAGATTTGTTACACGGGTGTACTGTGAGGTTTGGGGTACGAATGATCCCGTTACCTAGATAGTGAGCATGGAACCCGTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAACAATGTGCAGGGCTCAGGTCAGCATTAGGGTCAGGTTCTTAGGAAAAGAAAGAGCAAAAACAATGAAACACAATACAAAGTAAAGAACACTGAGCGGGCTGGCAAGGCN
+
+vdb-dump SRR000001 -R1-2 -CREAD -M40
+READ: TCAGGGGGGAGCTTAAATTTGAAACTAGAA ...
+
+READ: TCAGGGGGGGGTTACACGTGCAGATTTGTT ...
+
+
+The --indent_with -i option:
+============================
+With this option you can limit the length of the output-line and force a left-edge
+indenting.
+
+vdb-dump $vdb-dump SRR000001 -R1-2 -CREAD -i80
+READ: TCAGGGGGGAGCTTAAATTTGAAACTAGAAAAATTTTGAACAAAATAATCATAATTGTTAGCTGATGAAAAACT
+ AGAAAAGATTTTCTGAGTGTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAACGGTATCCCGTAG
+ TGTGCATTCATCCCTGCTCTGGATACAGTCAGCTCCCAAATTCCATAAACAACTCCTTTGTAAGTAACCTCCTT
+ TTGACAGGGGGTACTGAGCGGGCTGGCAAGGCN
+
+READ: TCAGGGGGGGGTTACACGTGCAGATTTGTTACACGGGTGTACTGTGAGGTTTGGGGTACGAATGATCCCGTTAC
+ CTAGATAGTGAGCATGGAACCCGTTGGAACCGAAAGGGTTTGAATTCAAACCCTTTCGGTTCCAACAATGTGCA
+ GGGCTCAGGTCAGCATTAGGGTCAGGTTCTTAGGAAAAGAAAGAGCAAAAACAATGAAACACAATACAAAGTAA
+ AGAACACTGAGCGGGCTGGCAAGGCN
+
+
+The --format -f option:
+=======================
+This selects other than the default-output formating:
+
+csv = comma-separated on one line
+---------------------------------
+vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -fcsv
+EM7LVYS01C1LWG,255
+EM7LVYS01B2EMP,248
+
+xml = xml-section
+-----------------
+vdb-dump $vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -fxml
+<row_1>
+ <NAME>
+EM7LVYS01C1LWG
+ </NAME>
+ <SPOT_LEN>
+255
+ </SPOT_LEN>
+</row_1>
+
+<row_2>
+ <NAME>
+EM7LVYS01B2EMP
+ </NAME>
+ <SPOT_LEN>
+248
+ </SPOT_LEN>
+</row_2>
+
+json = json format
+------------------
+vdb-dump $vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -fjson
+{
+"row_id": 1,
+"NAME":"EM7LVYS01C1LWG",
+"SPOT_LEN":255
+},
+
+{
+"row_id": 2,
+"NAME":"EM7LVYS01B2EMP",
+"SPOT_LEN":248
+},
+
+piped = format friendly to beeing piped into other processes
+------------------------------------------------------------
+vdb-dump $vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -fpiped
+1, NAME: "EM7LVYS02FOYNU"
+1, SPOT_LEN: 284
+
+2, NAME: "EM7LVYS02GCAPL"
+2, SPOT_LEN: 262
+
+sra-dump = simulates the output of a deprecated tool
+------------------------------------------------------------
+vdb-dump $vdb-dump SRR000001 -R1-2 -CNAME,SPOT_LEN -fsra-dump
+1, NAME: EM7LVYS02FOYNU
+1, SPOT_LEN: 284
+
+2, NAME: EM7LVYS02GCAPL
+2, SPOT_LEN: 262
+
+fastq = produces fastq-output
+( the table needs to have a READ- and a QUALITY column, no splitting supported )
+-------------------------------------------------------
+vdb-dump $vdb-dump SRR000001 -R1 -ffastq
+ at SRR000001.1 EM7LVYS02FOYNU length=284
+TCAGATTCTCCTAGCCTACATCCGTACGAGTTAGCGTGGGATTACGAGGTGCACACCATTTCATTCCGTACGGGTAAATTTTTGTATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAACTCCTGACCTCAAGTGATTTGCCTGCCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTTTGTGCCCAAGCCTTATAAGTAAATTTATAAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGGTAAG
++SRR000001.1 EM7LVYS02FOYNU length=284
+=<8<85)9=9/3-8?68<7=8<3657747==49==+;FB2;A;5:'*>69<:74)9.;C?+;<B<B;(<';FA/;C>*GC8/%9<=GC8.#=2:5:16D==<EA2EA.;5=44<;2C=5;@73&<<2;5;6+9<?776+:24'26:7,<9A;=:;0C>*6?7<<C=D=<52?:9CA2CA23<2<;3CA12:A<9414<7<<6;99<2/=9#<;9B at 27.;=6>:77>:1<A>+CA138?<)C at 2166:A<B?->:%<<9<;33<;6?9;<;4=:%<$CA1+1%1
+
+fasta = produces fasta-output
+( the table needs to have a READ column )
+-------------------------------------------------------
+vdb-dump SRR000001 -R1 -f fasta
+>SRR000001.1 EM7LVYS02FOYNU length=284
+TCAGATTCTCCTAGCCTACATCCGTACGAGTTAGCGTGGGATTACGAGGTGCACACCATTTCATTCCGTA
+CGGGTAAATTTTTGTATTTTTAGCAGACGGCAGGGTTTCACCATGGTTGACCAACGTACTAATCTTGAAC
+TCCTGACCTCAAGTGATTTGCCTGCCTTCAGCCTCCCAAAGTGACTGGGTATTACAGATGTGAGCGAGTT
+TGTGCCCAAGCCTTATAAGTAAATTTATAAATTTACATAATTTAAATGACTTATGCTTAGCGAAATAGGG
+TAAG
+
+
+The --without_sra -n option:
+============================
+With this option you can switch off the special treatment (translation) of certain column-types
+
+vdb-dump SRR000001 -R1 -C SPOT_DESC,PLATFORM
+SPOT_DESC: spot_len=255, fixed_len=0, signal_len=400, clip_qual_right=235, num_reads=4
+ PLATFORM: SRA_PLATFORM_454
+
+vdb-dump SRR000001 -R1 -C SPOT_DESC,PLATFORM -n
+SPOT_DESC: [255, 0, 0, 0, 144, 1, 235, 0, 4, 0, 0, 0, 0, 0, 0, 0]
+ PLATFORM: 1
+
+
+The --table_enum -E option:
+===========================
+If the object is a vdb-database, enumerate the tables it contains.
+
+
+The --version -V option:
+========================
+Print the version of the vdb-manager used by vdb-dump.
+
+vdb-dump -V
+vdb-dump: 2.5.1
+
+
+The column_enum_short -o option:
+================================
+Enumerates the columns and the default type of each column
+vdb-dump SRR000001 -o
+
+BASE_COUNT (U64)
+BIO_BASE_COUNT (U64)
+CLIP_ADAPTER_LEFT (INSDC:coord:one)
+etc.
+
+
+The column_enum -O option:
+==========================
+Enumerates the columns and all available type of each column
+
+vdb-dump SRR000001 -O
+SRR000001.01 : (032 bits [01], Int) CLIP_QUALITY_LEFT
+ (INSDC:coord:one)
+ CLIP_QUALITY_LEFT.type[0] = INSDC:coord:one (dflt)
+ CLIP_QUALITY_LEFT.type[1] = U16
+ CLIP_QUALITY_LEFT.type[2] = INSDC:coord:zero
+
+SRR000001.02 : (032 bits [01], Int) CLIP_QUALITY_RIGHT
+ (INSDC:coord:one)
+ CLIP_QUALITY_RIGHT.type[0] = INSDC:coord:one (dflt)
+ CLIP_QUALITY_RIGHT.type[1] = U16
+ CLIP_QUALITY_RIGHT.type[2] = INSDC:coord:zero
+
+SRR000001.03 : (008 bits [01], Uint) COLOR_MATRIX
+ (U8)
+ COLOR_MATRIX.type[0] = U8 (dflt)
+
+etc.
+
+The --id_range -r option:
+=========================
+Print the row-range that a table contains.
+
+vdb-dump SRR000001 -r
+id-range: first-row = 1, row-count = 470985
+
+
+The --info option:
+==================
+prints a summary of meta-data about the accession
+
+vdb-dump SRR000001 --info
+acc : SRR000001
+path : /somepath/SRR/000000/SRR000001
+size : 312,527,083
+type : Table
+platf : SRA_PLATFORM_454
+SEQ : 470,985
+SCHEMA : NCBI:SRA:_454_:tbl:v2#1.0.7
+TIME : 0x0000000055248a41 (04/07/2015 21:54)
+FMT : SFF
+FMTVER : 2.4.5
+LDR : sff-load.2.4.5
+LDRVER : 2.4.5
+LDRDATE: Feb 25 2015 (2/25/2015 0:0)
diff --git a/tools/vdb-dump/vdb-boot.c b/tools/vdb-dump/vdb-boot.c
new file mode 100644
index 0000000..9f86e42
--- /dev/null
+++ b/tools/vdb-dump/vdb-boot.c
@@ -0,0 +1,448 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <fmtdef.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#define WITH_DNA
+
+/********************************************************************
+write procedure:
+(1)....KDirectoryNativeDir ... make a root directory
+(2)....KDirectoryOpenDirUpdate ... chroot to specific directory
+(3)....VDBManagerMakeUpdate ... make manager for update
+(4)....VDBManagerMakeSchema ... make schema
+(5)....VSchemaParseFile ... load a schema from file
+(6)....VDBManagerCreateDB ... let the manager create a DB
+(7)....VDatabaseCreateTable ... create a Table for the DB
+(8)....VTableCreateCursorWrite ... create a writable cursor
+(9)....VCursorAddColumn ... add the column to write
+(10)...VCursorOpen ... open the cursor
+-----LOOP-----
+ (11)....VCursorOpenRow ... open the row
+ (12)....VCursorWrite ... write the data
+ (13)....VCursorCommitRow ... commit the row
+ (14)....VCursorCloseRow ... close the row
+-----END LOOP-----
+(15)...VCursorCommit ... commit the cursor
+(16)...VCursorRelease ... destroy the cursor
+(17)...VTableRelease ... destroy the table
+(18)...VDatabaseRelease ... destroy the database
+(19)...VSchemaRelease ... destroy the schema
+(20)...VDBManagerRelease ... destroy the manager
+(21)...KDirectoryRelease ... destroy the chroot'ed dir
+(22)...KDirectoryRelease ... destroy the root dir
+********************************************************************/
+
+
+/********************************************************************
+helper function needed by schema-dump
+********************************************************************/
+static
+rc_t CC flush ( void *dst, const void *buffer, size_t bsize )
+{
+ FILE *f = dst;
+ fwrite ( buffer, 1, bsize, f );
+ return 0;
+}
+
+/********************************************************************
+helper function to display failure or success message
+********************************************************************/
+static
+void display_rescode( const rc_t res, const char* failure, const char* success )
+{
+ if ( res != 0 )
+ {
+ if ( failure )
+ LOGERR( klogInt, res, failure );
+ }
+ else
+ {
+ if ( success )
+ LOGMSG( klogInfo, success );
+ }
+}
+
+/********************************************************************
+helper function to display the manager version
+********************************************************************/
+static
+rc_t show_manager_version( VDBManager *my_manager )
+{
+ uint32_t version;
+ rc_t res = VDBManagerVersion( my_manager, &version );
+ if ( res != 0 )
+ {
+ LOGERR ( klogInt, res, "failed to determine vdb mgr version" );
+ }
+ else
+ {
+ PLOGMSG ( klogInfo, ( klogInfo, "manager-version = $(maj).$(min).$(rel)",
+ "vers=0x%X,maj=%u,min=%u,rel=%u"
+ , version
+ , version >> 24
+ , ( version >> 16 ) & 0xFF
+ , version & 0xFFFF ));
+ }
+ return res;
+}
+
+/* write context */
+typedef struct write_ctx
+{
+ uint32_t idx_line;
+ uint32_t idx_line_nr;
+ uint32_t idx_dna;
+ uint32_t idx_quality;
+ uint32_t line_nr;
+ void *buffer;
+ uint32_t count;
+} write_ctx;
+typedef write_ctx* p_write_ctx;
+
+p_write_ctx make_write_ctx( void )
+{
+ return calloc( 1, sizeof( write_ctx ) );
+}
+
+/********************************************************************
+helper function to write one data-cunk into one new row
+********************************************************************/
+static
+rc_t write_data_row( VCursor *my_cursor, p_write_ctx ctx )
+{
+ rc_t res = VCursorOpenRow( my_cursor );
+ /* display_rescode( res, "failed to open row", "row opened" ); */
+ if ( res == 0 )
+ {
+ /* write the ascii-line*/
+ res = VCursorWrite( my_cursor, ctx->idx_line, 8, ctx->buffer, 0, ctx->count );
+ display_rescode( res, "failed to write ascii-line", NULL );
+
+ /* write the line-number (zero-based) */
+ res = VCursorWrite( my_cursor, ctx->idx_line_nr, 32, &(ctx->line_nr), 0, 1 );
+ display_rescode( res, "failed to write line-nr", NULL );
+
+#ifdef WITH_DNA
+ /* write the ascii-line interpreted as dna-data */
+ res = VCursorWrite( my_cursor, ctx->idx_dna, 2, ctx->buffer, 0, ctx->count << 2 );
+ display_rescode( res, "failed to write dna-data", NULL );
+#endif
+
+ /* write the ascii-line interpreted as quality (array of 4 byte) */
+ res = VCursorWrite( my_cursor, ctx->idx_quality, 32, ctx->buffer, 0, ctx->count >> 2 );
+ display_rescode( res, "failed to write quality", NULL );
+
+ res = VCursorCommitRow( my_cursor );
+ display_rescode( res, "failed to commit row", NULL );
+
+ res = VCursorCloseRow( my_cursor );
+ }
+ return res;
+}
+
+#define BUFLEN 120
+
+/********************************************************************
+reads the data-src-file in chunks and writes it with "write_data_chunk"
+********************************************************************/
+static
+rc_t write_data_loop( VCursor *my_cursor, p_write_ctx ctx, const KFile *data_src )
+{
+ char buf[ BUFLEN ];
+ char* read_dest = buf;
+ uint64_t file_pos = 0;
+ size_t num_to_read = BUFLEN - 1;
+ size_t num_read;
+ size_t chars_in_buf = 0;
+ size_t written = 0;
+ rc_t res;
+
+ ctx->line_nr = 0;
+ ctx->buffer = buf;
+ do {
+ res = KFileRead( data_src, file_pos, read_dest, num_to_read, &num_read );
+ if ( res != 0 )
+ {
+ LOGERR ( klogInt, res, "failed to read form KFile" );
+ num_read = 0;
+ }
+ else
+ {
+ if ( num_read > 0 )
+ {
+ char* lf;
+ chars_in_buf+=num_read;
+ file_pos+=num_read;
+ do {
+ buf[chars_in_buf] = 0;
+ lf = strchr( buf, 0x0A );
+ if ( lf != NULL )
+ {
+ ctx->count = ( lf - buf );
+ res = write_data_row( my_cursor, ctx );
+ if ( res == 0 )
+ {
+ ctx->line_nr++;
+ written += ctx->count;
+ chars_in_buf -= ( ctx->count + 1 );
+ memmove( buf, ++lf, chars_in_buf );
+ }
+ else
+ {
+ num_read = 0; /* terminates the outer do-loop */
+ }
+ }
+ } while ( ( lf != NULL )&&( num_read > 0 ) );
+ read_dest = buf + chars_in_buf;
+ num_to_read = BUFLEN - ( chars_in_buf + 1 );
+ }
+ }
+ } while ( num_read > 0 );
+
+ PLOGMSG ( klogInfo, ( klogInfo, "written $(n_lines) lines = $(n_bytes) bytes",
+ "n_lines=%lu,n_bytes=%lu", ctx->line_nr, written ));
+ if ( ctx->line_nr > 0 )
+ {
+ res = VCursorCommit( my_cursor );
+ display_rescode( res, "failed to commit cursor", NULL );
+ }
+ return res;
+}
+
+
+/********************************************************************
+creates a writable cursor, adds 1 column, opens cursor and calls the write-loop
+********************************************************************/
+static
+rc_t create_cursor_and_write( VTable *my_table, const KFile *data_src )
+{
+ VCursor *my_cursor;
+ p_write_ctx ctx = make_write_ctx();
+ uint32_t open_cols = 0, should_open = 0;
+
+ rc_t res = VTableCreateCursorWrite( my_table, &my_cursor, kcmInsert );
+ display_rescode( res, "failed to create write-cursor", NULL );
+ if ( res == 0 )
+ {
+ res = VCursorAddColumn( my_cursor, &ctx->idx_line, "LINE" );
+ display_rescode( res, "failed to add LINE-column", NULL );
+ if ( res == 0 ) open_cols++;
+ should_open++;
+
+ res = VCursorAddColumn( my_cursor, &ctx->idx_line_nr, "LINE_NR" );
+ display_rescode( res, "failed to add LINE_NR-column", NULL );
+ if ( res == 0 ) open_cols++;
+ should_open++;
+
+#ifdef WITH_DNA
+ res = VCursorAddColumn( my_cursor, &ctx->idx_dna, "READ" );
+ display_rescode( res, "failed to add READ-column", NULL );
+ if ( res == 0 ) open_cols++;
+ should_open++;
+#endif
+
+ res = VCursorAddColumn( my_cursor, &ctx->idx_quality, "QUALITY" );
+ display_rescode( res, "failed to add QUALITY-column", NULL );
+ if ( res == 0 ) open_cols++;
+ should_open++;
+
+ if ( open_cols == should_open )
+ {
+ res = VCursorOpen( my_cursor );
+ display_rescode( res, "failed to open cursor", NULL );
+ if ( res == 0 )
+ {
+ res = write_data_loop( my_cursor, ctx, data_src );
+ }
+ }
+ res = VCursorRelease( my_cursor );
+ }
+ free( ctx );
+ return res;
+}
+
+/********************************************************************
+let the manager create a database with a schema, calls cursor-creation and write
+********************************************************************/
+static
+rc_t create_dababase_from_schema( VDBManager *my_manager, VSchema *my_schema,
+ const char* db_path, const KFile *data_src )
+{
+ VDatabase *my_database;
+ VTable *my_table;
+ rc_t res = VDBManagerCreateDB( my_manager, &my_database, my_schema,
+ "DATA2DUMP:MyDatabase", kcmInit | kcmParents, "%s", db_path );
+ display_rescode( res, "failed to create database", "database created" );
+ if ( res == 0 )
+ {
+ res = VDatabaseCreateTable( my_database, &my_table, "test", kcmInit | kcmParents, "Tab1" );
+ display_rescode( res, "failed to create table", "table created" );
+ if ( res == 0 )
+ {
+ create_cursor_and_write( my_table, data_src );
+ res = VTableRelease( my_table );
+ display_rescode( res, "failed to release table", "table released" );
+ }
+ res = VDatabaseRelease( my_database );
+ display_rescode( res, "failed to release database", "database released" );
+ }
+ return res;
+}
+
+/********************************************************************
+let the manager create a schema, calls dababase-creation etc.
+********************************************************************/
+static
+rc_t create_schema( VDBManager *my_manager, const char *schema_path,
+ const char *db_path, const KFile *data_src )
+{
+ VSchema *schema;
+ /* empty schema, unless $VDB_ROOT tells it
+ where to find include files */
+ rc_t res = VDBManagerMakeSchema ( my_manager, & schema );
+ display_rescode( res, "failed to create schema", "schema created" );
+ if ( res == 0 )
+ {
+ /* load the schema from text */
+ res = VSchemaParseFile ( schema, "%s", schema_path );
+ if ( res != 0 )
+ {
+ PLOGERR ( klogInt, (klogInt, res, "failed to load schema file '$(path)'",
+ "path=%s", schema_path ));
+ }
+ else
+ {
+ res = VSchemaDump ( schema, sdmPrint, "DATA2DUMP:MyDatabase", flush, stdout );
+ if ( res != 0 )
+ LOGERR ( klogInt, res, "failed to dump schema" );
+ else
+ {
+ res = create_dababase_from_schema( my_manager, schema, db_path, data_src );
+ }
+ }
+ res = VSchemaRelease ( schema );
+ display_rescode( res, "failed to release schema", "schema release" );
+ }
+ return res;
+}
+
+static
+rc_t build_test_db ( const char *schema_path, const char *db_path, const char *src_file )
+{
+ KDirectory *wd;
+ rc_t res = KDirectoryNativeDir ( & wd );
+ if ( res != 0 )
+ LOGERR ( klogSys, res, "failed to determine wd" );
+ else
+ {
+ KDirectory *root;
+
+#if 1 /* SHOULD WORK WHEN DISABLED
+ ENABLED FOR NOW AS A WORKAROUND */
+ root = wd;
+ KDirectoryAddRef ( root );
+#else
+ res = KDirectoryOpenDirUpdate ( wd, & root, true, "." );
+#endif
+ if ( res != 0 )
+ LOGERR ( klogSys, res, "failed to chroot to wd" );
+ else
+ {
+ VDBManager *my_manager;
+ res = VDBManagerMakeUpdate ( & my_manager, root );
+ if ( res != 0 )
+ LOGERR ( klogInt, res, "failed to open vdb manager" );
+ else
+ {
+ const KFile *data_src;
+ res = KDirectoryOpenFileRead ( wd, &data_src, "%s", src_file );
+ display_rescode( res, "failed to open src-file", "src-file opened" );
+ if ( res == 0 )
+ {
+ show_manager_version( my_manager );
+ res = create_schema( my_manager, schema_path, db_path, data_src );
+ VDBManagerRelease ( my_manager );
+ KFileRelease( data_src );
+ }
+ }
+ KDirectoryRelease ( root );
+ }
+ KDirectoryRelease ( wd );
+ }
+ return res;
+}
+
+
+ver_t CC KAppVersion ( void )
+{
+ return 0;
+}
+
+rc_t CC Usage (const Args * args)
+{
+ return 0;
+}
+
+rc_t CC Version ( const Args * args )
+{
+ return 0;
+}
+
+/****************************************************************************************
+
+ argv[1] argv[2] argv[3]
+usage : vdb-boot shema db_path source-file
+example: vdb-boot vdb-boot.vschema test vdb-boot.c
+
+ ***************************************************************************************/
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ if ( argc != 4 )
+ {
+ LOGMSG ( klogFatal, "aaaah!" );
+ return -1;
+ }
+ return build_test_db ( argv[1], argv[2], argv[3] );
+}
diff --git a/tools/vdb-dump/vdb-boot.vschema b/tools/vdb-dump/vdb-boot.vschema
new file mode 100644
index 0000000..7542a56
--- /dev/null
+++ b/tools/vdb-dump/vdb-boot.vschema
@@ -0,0 +1,52 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+version 1;
+
+include 'vdb/built-in.vschema';
+include 'insdc/insdc.vschema';
+
+/* it was INSDC:dna:2na */
+
+table DATA2DUMP : MyTable #1.0
+{
+ extern column ascii LINE = .LINE;
+ physical column ascii .LINE = LINE;
+
+ extern column U32 LINE_NR = .LINE_NR;
+ physical column U32 .LINE_NR = LINE_NR;
+
+ extern column INSDC:dna:2na READ = .READ;
+ physical column INSDC:dna:2na .READ = READ;
+
+ extern column I8[4] QUALITY = .QUALITY;
+ physical column I8[4] .QUALITY = QUALITY;
+};
+
+database DATA2DUMP : MyDatabase #1.0
+{
+ table DATA2DUMP : MyTable #1 test;
+};
diff --git a/tools/vdb-dump/vdb-dump-bin.c b/tools/vdb-dump/vdb-dump-bin.c
new file mode 100644
index 0000000..ea8cf85
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-bin.c
@@ -0,0 +1,1496 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <kapp/args.h>
+
+#include <insdc/insdc.h>
+
+#include <kdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/buffile.h>
+
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/num-gen.h>
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-coldefs.h"
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include <stdlib.h>
+#include <string.h>
+
+rc_t Quitting( void );
+
+static rc_t write_to_file( KFile * f, uint64_t * pos, const void * src, uint32_t len, const char * name )
+{
+ size_t num_writ;
+ size_t num_to_write = len;
+ rc_t rc = KFileWriteAll( f, *pos, src, num_to_write, &num_writ );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to write to column $(col_name) at #%(pos)", "col_name=%s,pos=%ld", name, *pos ) );
+ }
+ else
+ *pos += num_writ;
+ return rc;
+}
+
+
+static rc_t read_from_file( const KFile * f, uint64_t pos, const uint8_t * dst,
+ size_t dst_size, size_t * num_read, const char * name )
+{
+ rc_t rc = KFileReadAll ( f, pos, ( void * )dst, dst_size, num_read );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to read from column $(col_name) at #%(pos)", "col_name=%s,pos=%ld", name, pos ) );
+ }
+ return rc;
+}
+
+
+typedef struct wr_bin_idx
+{
+ /* the file-handles */
+ KFile * bin;
+ KFile * idx;
+ const char name[ 256 ];
+ uint64_t bin_pos;
+ uint64_t idx_pos;
+ uint32_t first_len;
+ bool multi_value;
+} wr_bin_idx;
+
+
+static void release_wr_bin_idx( wr_bin_idx * c )
+{
+ if ( c != NULL )
+ {
+ if ( c->bin != NULL )
+ KFileRelease( c->bin );
+ if ( c->idx != NULL )
+ KFileRelease( c->idx );
+ }
+}
+
+
+static rc_t create_wr_bin_idx( KDirectory * dir, const char * col_name, wr_bin_idx * c )
+{
+ rc_t rc;
+
+ c->bin = NULL;
+ c->idx = NULL;
+ rc = KDirectoryCreateFile ( dir, &c->bin, false, 0664, kcmInit, "COL_%s.bin", col_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to create bin-file for column $(col_name)",
+ "col_name=%s", col_name ) );
+ }
+ else
+ {
+ rc = KDirectoryCreateFile ( dir, &c->idx, false, 0664, kcmInit, "COL_%s.idx", col_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to create index-file for column $(col_name)",
+ "col_name=%s", col_name ) );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ KFile * f = c->bin;
+ rc = KBufWriteFileMakeWrite ( &c->bin, f, 1024 * 1024 * 16 );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to create buffer for bin-file for column $(col_name)",
+ "col_name=%s", col_name ) );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ string_copy( ( char * )c->name, sizeof c->name,
+ col_name, string_len( col_name, string_size( col_name ) ) );
+ c->bin_pos = 0;
+ c->idx_pos = 0;
+ c->first_len = 0xFFFFFFFF;
+ c->multi_value = false;
+ }
+
+ if ( rc != 0 )
+ release_wr_bin_idx( c );
+
+ return rc;
+}
+
+
+static rc_t write_bin_idx( wr_bin_idx * c, const void * data, uint32_t len )
+{
+ /* first write to index-file the position where the data will be written to */
+ rc_t rc = write_to_file( c->idx, &c->idx_pos, &c->bin_pos, sizeof c->bin_pos, c->name );
+
+ /* the write the length, it can be zero! */
+ if ( rc == 0 )
+ rc = write_to_file( c->idx, &c->idx_pos, &len, sizeof len, c->name );
+
+ /* the write the data, only if we have data! */
+ if ( rc == 0 && len > 0 )
+ rc = write_to_file( c->bin, &c->bin_pos, data, len, c->name );
+
+ if ( rc == 0 )
+ {
+ if ( c->first_len == 0xFFFFFFFF )
+ c->first_len = len;
+ else if( c->first_len != len )
+ c->multi_value = true;
+ }
+
+ return rc;
+}
+
+/*
+static rc_t set_bin_filesize( wr_bin_idx * c, uint64_t new_size )
+{
+ rc_t rc = KFileSetSize( c->bin, new_size );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to set size of file to >%(fsize) for column $(col_name)", "fsize=%ld,col_name=%s", new_size, c->name ) );
+ }
+ return rc;
+}
+
+static rc_t write_bin_at( wr_bin_idx * c, uint64_t pos, const void * data, uint32_t len )
+{
+ uint64_t pos1 = pos;
+ rc_t rc = write_to_file( c->bin, &pos1, data, len, c->name );
+
+ if ( rc == 0 && c->first_len == 0xFFFFFFFF )
+ c->first_len = len;
+
+ return rc;
+}
+*/
+
+static rc_t truncate_idx( wr_bin_idx * c )
+{
+ uint64_t pos = 0;
+ rc_t rc = write_to_file( c->idx, &pos, &c->first_len, sizeof c->first_len, c->name );
+ if ( rc == 0 )
+ {
+ rc = KFileSetSize ( c->idx, pos );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to truncate the index-file for column $(col_name)",
+ "col_name=%s", c->name ) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_create_dir( const char * path, KDirectory ** dir )
+{
+ rc_t rc = KDirectoryNativeDir ( dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ if ( path != NULL )
+ {
+ rc = KDirectoryCreateDir ( *dir, 0775, kcmOpen, "%s", path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to create directory $(dir_name)", "dir_name=%s", path ) );
+ KDirectoryRelease ( *dir );
+ }
+ else
+ {
+ KDirectory * tmp = *dir;
+ rc = KDirectoryOpenDirUpdate ( tmp, dir, false, "%s", path );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to open directory $(dir_name)", "dir_name=%s", path ) );
+ }
+ KDirectoryRelease( tmp );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_dump_column_rows( const char * path, const VCursor *cur, p_col_def col, struct num_gen * rows )
+{
+ KDirectory * dir;
+
+ rc_t rc = vdi_create_dir( path, &dir );
+ if ( rc == 0 )
+ {
+ wr_bin_idx wr;
+
+ rc = create_wr_bin_idx( dir, col->name, &wr );
+ if ( rc == 0 )
+ {
+ const struct num_gen_iter * iter;
+ rc = num_gen_iterator_make( rows, &iter );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "VCursorIdRange() failed" );
+ else
+ {
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( iter, &row_id, &rc ) )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ const void * base;
+ uint32_t elem_bits, boff, row_len;
+ rc = VCursorCellDataDirect ( cur, row_id, col->idx,
+ &elem_bits, &base, &boff, &row_len );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "VCursorCellData( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%ld", col->name, row_id ) );
+ }
+ else
+ {
+ uint32_t len = ( elem_bits >> 3 ) * row_len;
+ rc = write_bin_idx( &wr, base, len );
+ }
+ }
+ }
+ num_gen_iterator_destroy( iter );
+ }
+
+ if ( rc == 0 && !wr.multi_value )
+ rc = truncate_idx( &wr );
+
+ release_wr_bin_idx( &wr );
+ }
+ KDirectoryRelease ( dir );
+ }
+ return rc;
+}
+
+
+static rc_t vdi_dump_column( const p_dump_context ctx, const VCursor *cur, p_col_def col )
+{
+ int64_t first;
+ uint64_t count;
+
+ rc_t rc = VCursorIdRange( cur, col->idx, &first, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorIdRange() failed" );
+ }
+ else if ( count > 0 )
+ {
+ struct num_gen * rows = NULL;
+
+
+ if ( ctx->row_range == NULL )
+ {
+ /* the user did not give us a row-range, we take all rows of this column... */
+ rc = num_gen_make_from_range( &rows, first, count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_make_from_range() failed" );
+ }
+ else
+ {
+ /* the gave us a row-range, we parse that string and check agains the real row-count... */
+ rc = num_gen_make_from_str( &rows, ctx->row_range );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_make_from_str() failed" );
+ else
+ {
+ rc = num_gen_trim( rows, first, count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_trim() failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( num_gen_empty( rows ) )
+ {
+ rc = RC( rcExe, rcDatabase, rcReading, rcRange, rcEmpty );
+ LOGERR( klogInt, rc, "no row-range(s) defined" );
+ }
+ else
+ {
+ rc = vdi_dump_column_rows( ctx->output_path, cur, col, rows ); /* <---- */
+ }
+ }
+
+ if ( rows != NULL )
+ num_gen_destroy( rows );
+ }
+ return rc;
+}
+
+
+static rc_t vdi_dump_columns( const p_dump_context ctx, const VCursor *cur, p_col_defs col_defs )
+{
+ rc_t rc = 0;
+ const Vector * v = &( col_defs->cols );
+ uint32_t start = VectorStart( v );
+ uint32_t end = start + VectorLength( v );
+ uint32_t i;
+
+ for ( i = start; rc == 0 && i < end; ++i )
+ {
+ p_col_def col = VectorGet ( v, i );
+ if ( col != NULL )
+ rc = vdi_dump_column( ctx, cur, col ); /* <---- */
+ }
+ return rc;
+}
+
+
+static uint32_t vdi_extract_or_parse_columns( const VTable * tab,
+ p_col_defs col_defs,
+ const char * columns,
+ const char * excluded_columns )
+{
+ uint32_t count = 0;
+ if ( col_defs != NULL )
+ {
+ bool cols_unknown = ( ( columns == NULL ) || ( string_cmp( columns, 1, "*", 1, 1 ) == 0 ) );
+ if ( cols_unknown )
+ /* the user does not know the column-names or wants all of them */
+ count = vdcd_extract_from_table( col_defs, tab );
+ else
+ /* the user knows the names of the wanted columns... */
+ count = vdcd_parse_string( col_defs, columns, tab );
+
+ if ( excluded_columns != NULL )
+ vdcd_exclude_these_columns( col_defs, excluded_columns );
+ }
+ return count;
+}
+
+
+rc_t vdi_dump_opened_table( const p_dump_context ctx, const VTable * tab )
+{
+ rc_t rc = 0;
+
+ col_defs * col_defs;
+
+ if ( !vdcd_init( &col_defs, ctx->max_line_len ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ LOGERR( klogInt, rc, "col_defs_init() failed" );
+ }
+ else
+ {
+ uint32_t n = vdi_extract_or_parse_columns( tab, col_defs, ctx->columns, ctx->excluded_columns );
+ if ( n < 1 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LOGERR( klogInt, rc, "vdm_extract_or_parse_columns() failed" );
+ }
+ else
+ {
+ const VCursor * cur;
+
+ rc = VTableCreateCachedCursorRead( tab, &cur, ctx->cur_cache_size );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VTableCreateCachedCursorRead() failed" );
+ }
+ else
+ {
+ n = vdcd_add_to_cursor( col_defs, cur );
+ if ( n < 1 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LOGERR( klogInt, rc, "vdcd_add_to_cursor() failed" );
+ }
+ else
+ {
+ rc = VCursorOpen( cur );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VCursorOpen() failed" );
+ }
+ else
+ rc = vdi_dump_columns( ctx, cur, col_defs ); /* <---- */
+ }
+ }
+ VCursorRelease( cur );
+ }
+ vdcd_destroy( col_defs );
+ }
+
+ return rc;
+}
+
+
+typedef struct rd_bin_idx
+{
+ /* the file-handles */
+ const KFile * bin;
+ const KFile * idx;
+ const char name[ 256 ];
+ uint64_t bin_file_size;
+ uint64_t idx_file_size;
+ uint64_t row_count;
+ uint32_t common_len;
+} rd_bin_idx;
+
+
+static void release_rd_bin_idx( rd_bin_idx * c )
+{
+ if ( c != NULL )
+ {
+ if ( c->bin != NULL )
+ KFileRelease( c->bin );
+ if ( c->idx != NULL )
+ KFileRelease( c->idx );
+ }
+}
+
+
+static rc_t create_rd_bin_idx( const KDirectory * dir, const char * col_name, rd_bin_idx * c )
+{
+ rc_t rc;
+
+ rc = KDirectoryOpenFileRead( dir, &c->bin, "COL_%s.bin", col_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to open bin-file for column $(col_name)", "col_name=%s", col_name ) );
+ }
+ else
+ {
+ rc = KDirectoryOpenFileRead( dir, &c->idx, "COL_%s.idx", col_name );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to open idx-file for column $(col_name)", "col_name=%s", col_name ) );
+ }
+ else
+ {
+ string_copy( ( char * )c->name, sizeof c->name,
+ col_name, string_len( col_name, string_size( col_name ) ) );
+ c->bin_file_size = 0;
+ c->idx_file_size = 0;
+ c->row_count = 0;
+ c->common_len = 0;
+
+ rc = KFileSize ( c->bin, &c->bin_file_size );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to get filesize of bin-file for $(col_name)", "col_name=%s", col_name ) );
+ }
+ else
+ {
+ rc = KFileSize ( c->idx, &c->idx_file_size );
+ if ( rc != 0 )
+ {
+ PLOGERR( klogInt, ( klogInt, rc,
+ "failed to get filesize of idx-file for $(col_name)", "col_name=%s", col_name ) );
+ }
+ else
+ {
+ /* calculate row-count */
+ if ( c->idx_file_size == sizeof c->common_len )
+ {
+ size_t num_read;
+ /* read the common length out of index-file at pos 0, divide bin_file_size by common length */
+ rc = read_from_file( c->idx, 0, (void *)&c->common_len, sizeof c->common_len, &num_read, col_name );
+ if ( rc == 0 && c->common_len > 0 )
+ c->row_count = ( c->bin_file_size / c->common_len );
+ }
+ else
+ {
+ /* divide the idx_file_size by 12 ( 8 bytes offset + 4 bytes length per row ) */
+ c->row_count = ( c->idx_file_size / 12 );
+ }
+ }
+ }
+ }
+
+ if ( rc != 0 )
+ release_rd_bin_idx( c );
+ }
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_row_len( rd_bin_idx * c, uint64_t row_id, uint32_t * row_len )
+{
+ rc_t rc = 0;
+ size_t num_read;
+
+ if ( c->common_len > 0 )
+ *row_len = c->common_len;
+ else
+ rc = read_from_file( c->idx, ( row_id * 12 ) + 8, (void *)row_len, sizeof *row_len, &num_read, c->name );
+
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_row_pos( rd_bin_idx * c, uint64_t row_id, uint64_t * row_pos )
+{
+ rc_t rc = 0;
+ size_t num_read;
+
+ if ( c->common_len > 0 )
+ *row_pos = ( c->common_len * row_id );
+ else
+ rc = read_from_file( c->idx, row_id * 12, (void *)row_pos, sizeof *row_pos, &num_read, c->name );
+
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_64( rd_bin_idx * c, uint64_t row_id, uint64_t * values, uint32_t value_count )
+{
+ uint64_t pos;
+ size_t num_read;
+
+ rc_t rc = rd_bin_idx_row_pos( c, row_id, &pos );
+ if ( rc == 0 )
+ rc = read_from_file( c->bin, pos, (void *)values,
+ ( sizeof *values ) * value_count, &num_read, c->name );
+
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_32( rd_bin_idx * c, uint64_t row_id, uint32_t * values, uint32_t value_count )
+{
+ uint64_t pos;
+ size_t num_read;
+
+ rc_t rc = rd_bin_idx_row_pos( c, row_id, &pos );
+ if ( rc == 0 )
+ rc = read_from_file( c->bin, pos, (void *)values,
+ ( sizeof *values ) * value_count, &num_read, c->name );
+
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_8( rd_bin_idx * c, uint64_t row_id, uint8_t * values, uint32_t value_count )
+{
+ uint64_t pos;
+ size_t num_read;
+
+ rc_t rc = rd_bin_idx_row_pos( c, row_id, &pos );
+ if ( rc == 0 )
+ rc = read_from_file( c->bin, pos, (void *)values,
+ ( sizeof *values ) * value_count, &num_read, c->name );
+
+ return rc;
+}
+
+
+static rc_t rd_bin_idx_char( rd_bin_idx * c, uint64_t row_id, uint32_t offset, uint32_t len,
+ char * dst, size_t dst_size, size_t * num_read )
+{
+ uint64_t pos;
+ uint32_t row_len;
+
+ rc_t rc = rd_bin_idx_row_pos( c, row_id, &pos );
+
+ if ( rc == 0 )
+ {
+ pos += offset;
+ if ( len > 0 )
+ row_len = len;
+ else
+ rc = rd_bin_idx_row_len( c, row_id, &row_len );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( row_len >= dst_size )
+ row_len = dst_size - 1;
+ rc = read_from_file( c->bin, pos, (void *)dst, row_len, num_read, c->name );
+ }
+ return rc;
+}
+
+
+/* -----------------------------------------------------------------------------------------------------------
+ phase 1
+
+ input: COL_PRIMARY_ALIGNMENT_ID.[bin] from SEQUENCE
+ COL_REF_POS.[bin] from PRIMARY_ALIGNMENT
+ COL_REF_ID.[bin] from PRIMARY_ALIGNMENT
+ COL_REF_ORIENTATION.[bin] from PRIMARY_ALIGNMENT
+ COL_SEQ_READ_ID.[bin] from PRIMARY_ALIGNMENT
+
+ output: TMP_MATE_REF_POS.[bin] ... the reference position of the mate
+ TMP_MATE_REF_ID.[bin] ... the reference id ( idx to name ) of the mate
+ TMP_MATE_REF_ORIENTATION.[bin] ... the orientation of the mate
+
+ */
+typedef struct p1_ctx
+{
+ /* the input files */
+
+ /* originated from PRIMARY_ALIGNMENT-table */
+ rd_bin_idx SEQ_SPOT_ID;
+ rd_bin_idx MAPQ;
+ rd_bin_idx REF_POS;
+ rd_bin_idx REF_LEN;
+ rd_bin_idx CIGAR;
+ rd_bin_idx READ;
+ rd_bin_idx REF_ID;
+ rd_bin_idx REF_ORIENTATION;
+
+ /* originated from SEQUENCE-table */
+ rd_bin_idx PRIMARY_ALIGNMENT_ID;
+ rd_bin_idx QUALITY;
+ rd_bin_idx READ_LEN;
+ rd_bin_idx READ_START;
+ rd_bin_idx READ_FILTER;
+
+ /* originated from REFERENCE-table */
+ rd_bin_idx NAME;
+} p1_ctx;
+
+
+static void release_p1_ctx( p1_ctx * p1_ctx )
+{
+ release_rd_bin_idx( &p1_ctx->SEQ_SPOT_ID );
+ release_rd_bin_idx( &p1_ctx->MAPQ );
+ release_rd_bin_idx( &p1_ctx->REF_POS );
+ release_rd_bin_idx( &p1_ctx->REF_LEN );
+ release_rd_bin_idx( &p1_ctx->CIGAR );
+ release_rd_bin_idx( &p1_ctx->READ );
+ release_rd_bin_idx( &p1_ctx->REF_ID );
+ release_rd_bin_idx( &p1_ctx->REF_ORIENTATION );
+
+ release_rd_bin_idx( &p1_ctx->PRIMARY_ALIGNMENT_ID );
+ release_rd_bin_idx( &p1_ctx->QUALITY );
+ release_rd_bin_idx( &p1_ctx->READ_LEN );
+ release_rd_bin_idx( &p1_ctx->READ_START );
+ release_rd_bin_idx( &p1_ctx->READ_FILTER );
+
+ release_rd_bin_idx( &p1_ctx->NAME );
+}
+
+
+static rc_t init_p1_ctx( KDirectory * dir, p1_ctx * p1_ctx )
+{
+ rc_t rc;
+
+ memset( p1_ctx, 0, sizeof * p1_ctx );
+
+ rc = create_rd_bin_idx( dir, "SEQ_SPOT_ID", &p1_ctx->SEQ_SPOT_ID );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "MAPQ", &p1_ctx->MAPQ );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "REF_POS", &p1_ctx->REF_POS );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "REF_LEN", &p1_ctx->REF_LEN );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "CIGAR_SHORT", &p1_ctx->CIGAR );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "READ", &p1_ctx->READ );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "REF_ID", &p1_ctx->REF_ID );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "REF_ORIENTATION", &p1_ctx->REF_ORIENTATION );
+
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "PRIMARY_ALIGNMENT_ID", &p1_ctx->PRIMARY_ALIGNMENT_ID );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "QUALITY", &p1_ctx->QUALITY );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "READ_LEN", &p1_ctx->READ_LEN );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "READ_START", &p1_ctx->READ_START );
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "READ_FILTER", &p1_ctx->READ_FILTER );
+
+ if ( rc == 0 )
+ rc = create_rd_bin_idx( dir, "NAME", &p1_ctx->NAME );
+
+
+ if ( rc != 0 )
+ release_p1_ctx( p1_ctx );
+ return rc;
+}
+
+
+static uint32_t vdi_calc_flag( bool each_fragment_aligned,
+ bool this_fragment_not_aligned,
+ bool mate_not_aligned,
+ bool this_fragment_reversed,
+ bool mate_reversed,
+ bool this_fragment_is_first,
+ bool this_fragment_is_last,
+ bool this_fragment_is_secondary,
+ bool this_fragment_not_passing_quality_control,
+ bool this_fragment_is_pcr_or_duplicate )
+{
+ uint32_t res = 0x001;
+ if ( each_fragment_aligned ) res |= 0x002;
+ if ( this_fragment_not_aligned ) res |= 0x004;
+ if ( mate_not_aligned ) res |= 0x008;
+ if ( this_fragment_reversed ) res |= 0x010;
+ if ( mate_reversed ) res |= 0x020;
+ if ( this_fragment_is_first ) res |= 0x040;
+ if ( this_fragment_is_last ) res |= 0x080;
+ if ( this_fragment_is_secondary ) res |= 0x100;
+ if ( this_fragment_not_passing_quality_control ) res |= 0x200;
+ if ( this_fragment_is_pcr_or_duplicate ) res |= 0x400;
+ return res;
+}
+
+
+static int32_t vdi_calc_tlen( const uint32_t self_ref_pos,
+ const uint32_t mate_ref_pos,
+ const uint32_t self_ref_len,
+ const uint32_t mate_ref_len,
+ const bool on_same_ref,
+ const bool first_read )
+{
+ int32_t res = 0;
+ if ( on_same_ref && ( self_ref_pos > 0 ) && ( mate_ref_pos > 0 ) )
+ {
+ const uint32_t self_right = self_ref_pos + self_ref_len;
+ const uint32_t mate_right = mate_ref_pos + mate_ref_len;
+ const uint32_t leftmost = ( self_ref_pos < mate_ref_pos ) ? self_ref_pos : mate_ref_pos;
+ const uint32_t rightmost = ( self_right > mate_right ) ? self_right : mate_right;
+ const uint32_t tlen = rightmost - leftmost;
+
+ /* The standard says, "The leftmost segment has a plus sign and the rightmost has a minus sign." */
+ if ( ( self_ref_pos <= mate_ref_pos && self_right >= mate_right ) || /* mate fully contained within self or */
+ ( mate_ref_pos <= self_ref_pos && mate_right >= self_right ) ) /* self fully contained within mate; */
+ {
+ if ( self_ref_pos < mate_ref_pos || ( first_read && self_ref_pos == mate_ref_pos ) )
+ res = tlen;
+ else
+ res = -( ( int32_t )tlen );
+ }
+ else if ( ( self_right == mate_right && mate_ref_pos == leftmost ) || /* both are rightmost, but mate is leftmost */
+ ( self_right == rightmost ) )
+ {
+ res = -( ( int32_t )tlen );
+ }
+ else
+ res = tlen;
+ }
+ return res;
+}
+
+
+static rc_t vdi_get_SEQ_SPOT_ID( p1_ctx * p1_ctx, uint64_t alignment_id, uint64_t * dst )
+{
+ rc_t rc = rd_bin_idx_64( &p1_ctx->SEQ_SPOT_ID, alignment_id, dst, 1 );
+ return rc;
+}
+
+
+static rc_t vdi_get_MATE_ID( p1_ctx * p1_ctx, uint64_t seq_spot_id_1_based, uint64_t alignment_id_1_based,
+ uint64_t * dst, bool * first )
+{
+ uint64_t AL_IDS[ 2 ];
+ rc_t rc = rd_bin_idx_64( &p1_ctx->PRIMARY_ALIGNMENT_ID, seq_spot_id_1_based - 1, AL_IDS, 2 );
+ if ( rc == 0 )
+ {
+ if ( AL_IDS[ 0 ] == alignment_id_1_based )
+ {
+ *dst = AL_IDS[ 1 ];
+ *first = true;
+ }
+ else if ( AL_IDS[ 1 ] == alignment_id_1_based )
+ {
+ *dst = AL_IDS[ 0 ];
+ *first = false;
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "given ALIGNMENT_ID #$(al_id) not found in SEQUENCE-ID #$(seq_id)",
+ "al_id=%lu,seq_id=%lu", alignment_id_1_based, seq_spot_id_1_based ) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_get_REF_ID( p1_ctx * p1_ctx, uint64_t alignment_id_zero_based, uint64_t * dst )
+{
+ rc_t rc = rd_bin_idx_64( &p1_ctx->REF_ID, alignment_id_zero_based, dst, 1 );
+ return rc;
+}
+
+
+static rc_t vdi_get_REF_POS( p1_ctx * p1_ctx, uint64_t alignment_id, uint32_t * dst )
+{
+ rc_t rc = rd_bin_idx_32( &p1_ctx->REF_POS, alignment_id, dst, 1 );
+ if ( rc == 0 ) *dst += 1;
+ return rc;
+}
+
+
+static rc_t vdi_get_REF_LEN( p1_ctx * p1_ctx, uint64_t alignment_id, uint32_t * dst )
+{
+ rc_t rc = rd_bin_idx_32( &p1_ctx->REF_LEN, alignment_id, dst, 1 );
+ return rc;
+}
+
+
+static rc_t vdi_get_REF_ORIENTATION( p1_ctx * p1_ctx, uint64_t alignment_id, bool * dst )
+{
+ uint8_t orientation;
+ rc_t rc = rd_bin_idx_8( &p1_ctx->REF_ORIENTATION, alignment_id, &orientation, 1 );
+ if ( rc == 0 ) *dst = ( orientation != 0 );
+ return rc;
+}
+
+
+static rc_t vdi_generate_QNAME( p1_ctx * p1_ctx, uint64_t id, char * dst, size_t dst_size )
+{
+ rc_t rc = string_printf ( dst, dst_size, NULL, "%lu", id );
+ return rc;
+}
+
+
+static rc_t vdi_generate_RNAME( p1_ctx * p1_ctx, uint64_t ref_id_1_based, char * dst, size_t dst_size )
+{
+ size_t num_read;
+ rc_t rc = rd_bin_idx_char( &p1_ctx->NAME, ref_id_1_based - 1, 0, 0, dst, dst_size, &num_read );
+ if ( rc == 0 && num_read < dst_size )
+ dst[ num_read ] = 0;
+ return rc;
+}
+
+
+static rc_t vdi_generate_MAPQ( p1_ctx * p1_ctx, uint64_t alignment_id, uint32_t * dst )
+{
+ rc_t rc = rd_bin_idx_32( &p1_ctx->MAPQ, alignment_id, dst, 1 );
+ return rc;
+}
+
+
+static rc_t vdi_generate_CIGAR( p1_ctx * p1_ctx, uint64_t alignment_id, char * dst, size_t dst_size )
+{
+ size_t num_read;
+ rc_t rc = rd_bin_idx_char( &p1_ctx->CIGAR, alignment_id, 0, 0, dst, dst_size, &num_read );
+ if ( rc == 0 && num_read < dst_size )
+ dst[ num_read ] = 0;
+ return rc;
+}
+
+
+static rc_t vdi_generate_SEQ( p1_ctx * p1_ctx, uint64_t alignment_id, char * dst, size_t dst_size )
+{
+ size_t num_read;
+ rc_t rc = rd_bin_idx_char( &p1_ctx->READ, alignment_id, 0, 0, dst, dst_size, &num_read );
+ if ( rc == 0 && num_read < dst_size )
+ dst[ num_read ] = 0;
+ return rc;
+}
+
+
+static rc_t vdi_generate_FRAG( p1_ctx * p1_ctx, uint64_t seq_spot_id_1_based, bool first,
+ uint32_t * frag_start, uint32_t * frag_len, uint8_t * filter )
+{
+ uint32_t rd_start[ 2 ];
+ rc_t rc = rd_bin_idx_32( &p1_ctx->READ_START, seq_spot_id_1_based - 1, rd_start, 2 );
+ if ( rc == 0 )
+ {
+ uint32_t rd_len[ 2 ];
+ rc = rd_bin_idx_32( &p1_ctx->READ_LEN, seq_spot_id_1_based - 1, rd_len, 2 );
+ if ( rc == 0 )
+ {
+ uint8_t rd_filter[ 2 ];
+ rc = rd_bin_idx_8( &p1_ctx->READ_FILTER, seq_spot_id_1_based - 1, rd_filter, 2 );
+ if ( rc == 0 )
+ {
+ uint32_t idx = first ? 0 : 1;
+ *frag_start = rd_start[ idx ];
+ *frag_len = rd_len[ idx ];
+ *filter = rd_filter[ idx ];
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_generate_QUAL( p1_ctx * p1_ctx, uint64_t seq_spot_id_1_based,
+ uint32_t start, uint32_t len, char * dst, size_t dst_size )
+{
+ /* how many entries in READ_START and READ_LEN do we have? ( size is 32 bit ) */
+ size_t num_read;
+ rc_t rc = rd_bin_idx_char( &p1_ctx->QUALITY, seq_spot_id_1_based - 1, start, len, dst, dst_size, &num_read );
+ if ( rc == 0 && num_read < dst_size )
+ {
+ uint32_t i;
+ for ( i = 0; i < num_read; ++i )
+ dst[ i ] += 33;
+ dst[ num_read ] = 0;
+ }
+ return rc;
+}
+
+
+static void reverse_buffer( char * dst, const char * src, size_t len )
+{
+ size_t i, j;
+ for ( i = 0, j = len - 1; i < len; ++i, --j )
+ dst[ i ] = src[ j ];
+}
+
+
+typedef struct alignment
+{
+ char REF_NAME[ 256 ];
+ uint64_t id_one_based;
+ uint64_t ref_id_one_based;
+ uint32_t REF_POS_one_based;
+ uint32_t REF_LEN;
+ bool aligned;
+ bool first;
+ bool reversed;
+} alignment;
+
+
+/* ----------------------------------------------------------------------------------------------------------- */
+static rc_t vdi_bin_phase_1_row( const p_dump_context ctx, p1_ctx * p1_ctx, int64_t row_id )
+{
+ rc_t rc;
+
+ alignment self, mate;
+
+ char QNAME[ 256 ];
+ char CIGAR[ 512 ];
+ char SEQ[ 2048 ];
+ char QUAL[ 2048 ];
+ char QUALR[ 2048 ];
+
+ uint64_t SEQ_SPOT_ID_1_based;
+ uint32_t FLAG, MAPQ;
+ int32_t TLEN;
+ uint32_t frag_start, frag_len;
+ uint8_t filter;
+ bool on_same_reference = false;
+
+ /* first we have to collect a lot of helper values... */
+ memset( &self, 0, sizeof self );
+ memset( &mate, 0, sizeof mate );
+
+ /* -------------------------------------------------------------------------------------------------------- */
+ self.id_one_based = ( row_id + 1 );
+ self.aligned = true;
+
+ /* get the row-id (1-based) of the sequence this alignment belongs to */
+ rc = vdi_get_SEQ_SPOT_ID( p1_ctx, row_id, &SEQ_SPOT_ID_1_based );
+
+ /* get the row-id (1-based) of the mate of this alignment ( 0...not mated )*/
+ if ( rc == 0 )
+ rc = vdi_get_MATE_ID( p1_ctx, SEQ_SPOT_ID_1_based, self.id_one_based, &mate.id_one_based, &self.first );
+ if ( rc == 0 )
+ {
+ mate.first = !self.first;
+ mate.aligned = ( mate.id_one_based > 0 );
+ }
+
+ /* get the row-id of the Reference this alignment belongs to */
+ if ( rc == 0 )
+ rc = vdi_get_REF_ID( p1_ctx, row_id, &self.ref_id_one_based );
+
+ /* get the row-id of the Reference the mate belongs to */
+ if ( rc == 0 && mate.aligned )
+ rc = vdi_get_REF_ID( p1_ctx, mate.id_one_based - 1, &mate.ref_id_one_based );
+
+ if ( rc == 0 && mate.aligned )
+ on_same_reference = ( self.ref_id_one_based == mate.ref_id_one_based );
+
+ /* get the position on the reference ( 0 based ) of this alignment */
+ if ( rc == 0 )
+ rc = vdi_get_REF_POS( p1_ctx, row_id, &self.REF_POS_one_based );
+
+ /* get the position on the reference ( 0 based ) of the mate */
+ if ( rc == 0 && mate.aligned )
+ rc = vdi_get_REF_POS( p1_ctx, mate.id_one_based - 1, &mate.REF_POS_one_based );
+
+ /* get the length of the alignment on the reference */
+ if ( rc == 0 )
+ rc = vdi_get_REF_LEN( p1_ctx, self.id_one_based - 1, &self.REF_LEN );
+
+ /* get the length of the mate on the reference */
+ if ( rc == 0 && mate.aligned )
+ rc = vdi_get_REF_LEN( p1_ctx, mate.id_one_based - 1, &mate.REF_LEN );
+
+ /* get the reference-name of this alignment */
+ if ( rc == 0 )
+ rc = vdi_generate_RNAME( p1_ctx, self.ref_id_one_based, self.REF_NAME, sizeof self.REF_NAME );
+
+ /* get the reference-name of the mate */
+ if ( rc == 0 && mate.aligned && !on_same_reference )
+ rc = vdi_generate_RNAME( p1_ctx, mate.ref_id_one_based, mate.REF_NAME, sizeof mate.REF_NAME );
+
+ if ( rc == 0 )
+ rc = vdi_get_REF_ORIENTATION( p1_ctx, self.id_one_based - 1, &self.reversed );
+
+ if ( rc == 0 && mate.aligned )
+ rc = vdi_get_REF_ORIENTATION( p1_ctx, mate.id_one_based - 1, &mate.reversed );
+
+ /* if the mate is aligned and the ref-ids dont match, compare the strings to find out if they are
+ on the same reference */
+ if ( rc == 0 && mate.aligned && !on_same_reference )
+ {
+ size_t l1 = string_size( self.REF_NAME );
+ size_t l2 = string_size( mate.REF_NAME );
+ if ( l1 == l2 )
+ {
+ int diff = string_cmp ( self.REF_NAME, l1, mate.REF_NAME, l2, l1 );
+ on_same_reference = ( diff == 0 );
+ }
+ }
+
+ TLEN = vdi_calc_tlen( self.REF_POS_one_based, mate.REF_POS_one_based,
+ self.REF_LEN, mate.REF_LEN, on_same_reference, self.first );
+
+ /* -------------------------------------------------------------------------------------------------------- */
+ if ( rc == 0 )
+ rc = vdi_generate_QNAME( p1_ctx, SEQ_SPOT_ID_1_based, QNAME, sizeof QNAME );
+
+ if ( rc == 0 )
+ rc = vdi_generate_MAPQ( p1_ctx, row_id, &MAPQ );
+
+ if ( rc == 0 )
+ rc = vdi_generate_CIGAR( p1_ctx, row_id, CIGAR, sizeof CIGAR );
+
+ if ( rc == 0 )
+ rc = vdi_generate_SEQ( p1_ctx, row_id, SEQ, sizeof SEQ );
+
+ if ( rc == 0 )
+ rc = vdi_generate_FRAG( p1_ctx, SEQ_SPOT_ID_1_based, self.first,
+ &frag_start, &frag_len, &filter );
+
+ if ( rc == 0 )
+ rc = vdi_generate_QUAL( p1_ctx, SEQ_SPOT_ID_1_based, frag_start, frag_len, QUAL, sizeof QUAL );
+
+ if ( rc == 0 && self.reversed )
+ reverse_buffer( QUALR, QUAL, string_size( QUAL ) );
+
+ if ( rc == 0 )
+ {
+ bool each_fragment_aligned = ( self.aligned && mate.aligned );
+ bool this_fragment_not_aligned = false;
+ bool mate_not_aligned = !mate.aligned;
+ bool this_fragment_reversed = self.reversed;
+ bool mate_reversed = mate.reversed;
+ bool this_fragment_is_first = self.first;
+ bool this_fragment_is_last = !self.first;
+ bool this_fragment_is_secondary = false;
+ bool this_fragment_not_passing_quality_control = ( ( filter & READ_FILTER_REJECT ) > 0 );
+ bool this_fragment_is_pcr_or_duplicate = ( ( filter & READ_FILTER_CRITERIA ) > 0 );
+
+ FLAG = vdi_calc_flag( each_fragment_aligned,
+ this_fragment_not_aligned,
+ mate_not_aligned,
+ this_fragment_reversed,
+ mate_reversed,
+ this_fragment_is_first,
+ this_fragment_is_last,
+ this_fragment_is_secondary,
+ this_fragment_not_passing_quality_control,
+ this_fragment_is_pcr_or_duplicate );
+ }
+
+ if ( rc == 0 )
+ rc = KOutMsg( "%s\t%u\t%s\t%u\t%d\t%s\t",
+ QNAME, FLAG, self.REF_NAME, self.REF_POS_one_based, MAPQ, CIGAR );
+
+ if ( rc == 0 )
+ {
+ if ( mate.aligned )
+ {
+ if ( on_same_reference )
+ rc = KOutMsg( "=\t%u\t%d\t", mate.REF_POS_one_based, TLEN );
+ else
+ rc = KOutMsg( "%s\t%u\t%d\t", mate.REF_NAME, mate.REF_POS_one_based, TLEN );
+ }
+ else
+ rc = KOutMsg( "*\t0\t0\t" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( self.reversed )
+ rc = KOutMsg( "%s\t%s\n", SEQ, QUALR );
+ else
+ rc = KOutMsg( "%s\t%s\n", SEQ, QUAL );
+ }
+ return rc;
+}
+
+static rc_t vdi_bin_phase_1( KDirectory * dir, const p_dump_context ctx )
+{
+ p1_ctx p1_ctx;
+ rc_t rc = init_p1_ctx( dir, &p1_ctx );
+ if ( rc == 0 )
+ {
+ struct num_gen * rows = NULL;
+ uint64_t row_count = p1_ctx.REF_POS.row_count;
+
+ if ( ctx->row_range == NULL )
+ {
+ /* the user did not give us a row-range, we take all rows of this column... */
+ rc = num_gen_make_from_range( &rows, 0, row_count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_make_from_range() failed" );
+ }
+ else
+ {
+ /* the gave us a row-range, we parse that string and check agains the real row-count... */
+ rc = num_gen_make_from_str( &rows, ctx->row_range );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_make_from_str() failed" );
+ else
+ {
+ rc = num_gen_trim( rows, 0, row_count );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_trim() failed" );
+ }
+ }
+
+ if ( rc == 0 && num_gen_empty( rows ) )
+ {
+ rc = RC( rcExe, rcDatabase, rcReading, rcRange, rcEmpty );
+ LOGERR( klogInt, rc, "no row-range(s) defined" );
+ }
+
+ if ( rc == 0 )
+ {
+ const struct num_gen_iter * iter;
+ rc = num_gen_iterator_make( rows, &iter );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "num_gen_iterator_make() failed" );
+ else
+ {
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( iter, &row_id, &rc ) )
+ {
+ rc = Quitting();
+ if ( rc == 0 )
+ rc = vdi_bin_phase_1_row( ctx, &p1_ctx, row_id );
+ }
+ num_gen_iterator_destroy( iter );
+ }
+ }
+
+ if ( rows != NULL )
+ num_gen_destroy( rows );
+
+ release_p1_ctx( &p1_ctx );
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------------------------------------- */
+
+rc_t vdi_bin_phase( const p_dump_context ctx, Args * args )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else if ( count < 1 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LOGERR( klogInt, rc, "parameter missing ( path to bin-files )" );
+ }
+ else
+ {
+ const char *bin_path = NULL;
+ rc = ArgsParamValue( args, 0, (const void**)&bin_path );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamValue() failed" );
+ }
+ else
+ {
+ KDirectory *dir;
+ rc = vdi_create_dir( bin_path, &dir );
+ if ( rc == 0 )
+ {
+ switch( ctx->phase )
+ {
+ case 1 : vdi_bin_phase_1( dir, ctx ); break;
+ default : KOutMsg( "phase %d unknown\n", ctx->phase );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------------------------------------- */
+#define SLICE_COL_CG_LOW 0
+#define SLICE_COL_CG_HIGH 1
+#define SLICE_COL_SEQ_ID 2
+#define SLICE_COL_SEQ_START 3
+#define SLICE_COL_SEQ_LEN 4
+
+static rc_t get_seq_id( const VCursor * ref_cur, int64_t row, uint32_t *col_idx, char * buffer, size_t buflen )
+{
+ const char * value;
+ uint32_t len;
+ rc_t rc = VCursorCellDataDirect ( ref_cur, row, col_idx[ SLICE_COL_SEQ_ID ], NULL, ( const void ** )&value, NULL, &len );
+ if ( rc == 0 )
+ {
+ if ( len == 0 )
+ buffer[ 0 ] = 0;
+ else
+ string_copy( buffer, buflen, value, len );
+ }
+ return rc;
+}
+
+static INSDC_coord_one get_seq_start( const VCursor * ref_cur, int64_t row, uint32_t *col_idx )
+{
+ INSDC_coord_one * value;
+ uint32_t len;
+ rc_t rc = VCursorCellDataDirect ( ref_cur, row, col_idx[ SLICE_COL_SEQ_START ], NULL, ( const void ** )&value, NULL, &len );
+ if ( rc == 0 && len > 0 )
+ return *value;
+ return 0;
+}
+
+
+static INSDC_coord_len get_seq_len( const VCursor * ref_cur, int64_t row, uint32_t *col_idx )
+{
+ INSDC_coord_len * value;
+ uint32_t len;
+ rc_t rc = VCursorCellDataDirect ( ref_cur, row, col_idx[ SLICE_COL_SEQ_LEN ], NULL, ( const void ** )&value, NULL, &len );
+ if ( rc == 0 && len > 0 )
+ return *value;
+ return 0;
+}
+
+
+static rc_t find_slice_in_ref( const p_dump_context ctx, const VTable * ref_tab, const VTable * prim_tab )
+{
+ const VCursor * ref_cur;
+ rc_t rc = VTableCreateCachedCursorRead( ref_tab, &ref_cur, ctx->cur_cache_size );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VTableCreateCachedCursorRead( REFERENCE ) failed" );
+ }
+ else
+ {
+ uint32_t col_idx[ 5 ];
+ char seq_id[ 512 ];
+ uint32_t cgraph_len;
+ int64_t first = 0, row = 0;
+ uint64_t count = 0;
+ const uint8_t * cgraph_value;
+ bool done = false;
+
+ rc = VCursorAddColumn( ref_cur, &col_idx[ SLICE_COL_CG_LOW ], "CGRAPH_LOW" );
+ if ( rc == 0 )
+ rc = VCursorAddColumn( ref_cur, &col_idx[ SLICE_COL_CG_HIGH ], "CGRAPH_HIGH" );
+ if ( rc == 0 )
+ rc = VCursorAddColumn( ref_cur, &col_idx[ SLICE_COL_SEQ_ID ], "SEQ_ID" );
+ if ( rc == 0 )
+ rc = VCursorAddColumn( ref_cur, &col_idx[ SLICE_COL_SEQ_START ], "SEQ_START" );
+ if ( rc == 0 )
+ rc = VCursorAddColumn( ref_cur, &col_idx[ SLICE_COL_SEQ_LEN ], "SEQ_LEN" );
+ if ( rc == 0 )
+ rc = VCursorOpen( ref_cur );
+ if ( rc == 0 )
+ rc = VCursorIdRange( ref_cur, col_idx[ SLICE_COL_CG_LOW ], &first, &count );
+
+ for ( row = first; rc == 0 && !done && ( row < ( first + count ) ); ++row )
+ {
+ rc = VCursorCellDataDirect ( ref_cur, row, col_idx[ SLICE_COL_CG_LOW ], NULL, ( const void ** )&cgraph_value, NULL, &cgraph_len );
+ if ( rc == 0 && cgraph_len > 0 )
+ {
+ if ( *cgraph_value >= ctx->slice_depth )
+ {
+
+ rc = get_seq_id( ref_cur, row, col_idx, seq_id, sizeof seq_id );
+ if ( rc == 0 )
+ {
+ INSDC_coord_one seq_start = get_seq_start( ref_cur, row, col_idx );
+ INSDC_coord_len seq_len = get_seq_len( ref_cur, row, col_idx );
+ if ( ctx->indented_line_len > 0 && ctx->indented_line_len < seq_len )
+ rc = KOutMsg( "%s:%d-%d\n", seq_id, seq_start, seq_start + ctx->indented_line_len );
+ else
+ rc = KOutMsg( "%s:%d-%d\n", seq_id, seq_start, seq_start + seq_len - 1 );
+ }
+ done = true;
+ }
+ }
+ }
+
+ for ( row = first; rc == 0 && !done && ( row < ( first + count ) ); ++row )
+ {
+ rc = VCursorCellDataDirect ( ref_cur, row, col_idx[ SLICE_COL_CG_HIGH ], NULL, ( const void ** )&cgraph_value, NULL, &cgraph_len );
+ if ( rc == 0 && cgraph_len > 0 )
+ {
+ if ( *cgraph_value >= ctx->slice_depth )
+ {
+
+ rc = get_seq_id( ref_cur, row, col_idx, seq_id, sizeof seq_id );
+ if ( rc == 0 )
+ {
+ INSDC_coord_one seq_start = get_seq_start( ref_cur, row, col_idx );
+ INSDC_coord_len seq_len = get_seq_len( ref_cur, row, col_idx );
+ rc = KOutMsg( "%s:%d-%d\n", seq_id, seq_start, seq_start + seq_len - 1 );
+ }
+ done = true;
+ }
+ }
+ }
+
+
+ if ( !done || rc != 0 )
+ KOutMsg( "none\n" );
+
+ VCursorRelease( ref_cur );
+ }
+ return rc;
+}
+
+
+static rc_t find_slice_in( const p_dump_context ctx, const VDBManager *mgr, const char * acc )
+{
+ rc_t rc;
+ int path_type = ( VDBManagerPathType ( mgr, "%s", acc ) & ~ kptAlias );
+ /* types defined in <kdb/manager.h> */
+ if ( path_type == kptDatabase )
+ {
+ const VDatabase * db;
+ rc = VDBManagerOpenDBRead( mgr, &db, NULL, "%s", acc );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerOpenDBRead() failed" );
+ }
+ else
+ {
+ const VTable * ref_tab;
+ rc = VDatabaseOpenTableRead( db, & ref_tab, "REFERENCE" );
+ if ( rc == 0 )
+ {
+ const VTable * prim_tab;
+ rc = VDatabaseOpenTableRead( db, & prim_tab, "PRIMARY_ALIGNMENT" );
+ if ( rc == 0 )
+ {
+ rc = find_slice_in_ref( ctx, ref_tab, prim_tab );
+ VTableRelease ( prim_tab );
+ }
+ VTableRelease ( ref_tab );
+ }
+ VDatabaseRelease( db );
+ }
+ if ( rc != 0 )
+ rc = KOutMsg( "none\n" );
+ }
+ else
+ rc = KOutMsg( "none\n" );
+ return rc;
+}
+
+
+rc_t find_slice( const p_dump_context ctx, Args * args )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamCount() failed" );
+ }
+ else if ( count < 1 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ LOGERR( klogInt, rc, "parameter missing ( accession to find slice in )" );
+ }
+ else
+ {
+ KDirectory * dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ }
+ else
+ {
+ const VDBManager *mgr;
+ rc = VDBManagerMakeRead ( &mgr, dir );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "VDBManagerMakeRead() failed" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *acc = NULL;
+ rc = ArgsParamValue( args, 0, (const void**)&acc );
+ if ( rc != 0 )
+ {
+ LOGERR( klogInt, rc, "ArgsParamValue() failed" );
+ }
+ else
+ rc = find_slice_in( ctx, mgr, acc );
+ }
+ VDBManagerRelease( mgr );
+ }
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-bin.h b/tools/vdb-dump/vdb-dump-bin.h
new file mode 100644
index 0000000..0af510f
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-bin.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_bin_
+#define _h_vdb_dump_bin_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+rc_t vdi_dump_opened_table( const p_dump_context ctx, const VTable *my_table );
+rc_t vdi_bin_phase( const p_dump_context ctx, Args * args );
+
+rc_t find_slice( const p_dump_context ctx, Args * args );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-coldefs.c b/tools/vdb-dump/vdb-dump-coldefs.c
new file mode 100644
index 0000000..af22165
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-coldefs.c
@@ -0,0 +1,846 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-helper.h"
+
+#include "vdb-dump-coldefs.h"
+
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+
+#include <vdb/vdb-priv.h>
+
+#include <sra/sradb.h>
+#include <sra/pacbio.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+/* for platforms */
+#include <insdc/sra.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <math.h>
+
+rc_t Quitting();
+
+/* once we get used to having moved the read descriptor
+ out of SRA, we should begin using those names.
+ if anyone has an investment in the old names, we may
+ want to provide a switch for using them... */
+#if USE_OLD_SRA_NAME || 1
+#define SRA_NAME( name ) \
+ "SRA_" #name
+#define SRA_NAMES( name1, name2 ) \
+ "SRA_" #name1 "|SRA_" #name2
+#else
+#define SRA_NAME( name ) \
+ # name
+#define SRA_NAMES( name1, name2 ) \
+ #name1 "|" #name2
+#endif
+
+/* implementation of the value-translation-functions */
+
+const char SRA_PB_HS_0[] = { "SRA_PACBIO_HOLE_SEQUENCING" };
+const char SRA_PB_HS_1[] = { "SRA_PACBIO_HOLE_ANTIHOLE" };
+const char SRA_PB_HS_2[] = { "SRA_PACBIO_HOLE_FIDUCIAL" };
+const char SRA_PB_HS_3[] = { "SRA_PACBIO_HOLE_SUSPECT" };
+const char SRA_PB_HS_4[] = { "SRA_PACBIO_HOLE_ANTIMIRROR" };
+const char SRA_PB_HS_5[] = { "SRA_PACBIO_HOLE_FDZMW" };
+const char SRA_PB_HS_6[] = { "SRA_PACBIO_HOLE_FBZMW" };
+const char SRA_PB_HS_7[] = { "SRA_PACBIO_HOLE_ANTIBEAMLET" };
+const char SRA_PB_HS_8[] = { "SRA_PACBIO_HOLE_OUTSIDEFOV" };
+const char SRA_PB_HS_9[] = { "unknown hole-status" };
+
+const char *vdcd_get_hole_status_txt( const uint32_t id )
+{
+ switch( id )
+ {
+ case SRA_PACBIO_HOLE_SEQUENCING : return( SRA_PB_HS_0 ); break;
+ case SRA_PACBIO_HOLE_ANTIHOLE : return( SRA_PB_HS_1 ); break;
+ case SRA_PACBIO_HOLE_FIDUCIAL : return( SRA_PB_HS_2 ); break;
+ case SRA_PACBIO_HOLE_SUSPECT : return( SRA_PB_HS_3 ); break;
+ case SRA_PACBIO_HOLE_ANTIMIRROR : return( SRA_PB_HS_4 ); break;
+ case SRA_PACBIO_HOLE_FDZMW : return( SRA_PB_HS_5 ); break;
+ case SRA_PACBIO_HOLE_FBZMW : return( SRA_PB_HS_6 ); break;
+ case SRA_PACBIO_HOLE_ANTIBEAMLET : return( SRA_PB_HS_7 ); break;
+ case SRA_PACBIO_HOLE_OUTSIDEFOV : return( SRA_PB_HS_8 ); break;
+ }
+ return( SRA_PB_HS_9 );
+}
+
+const char *vdcd_get_platform_txt( const uint32_t id )
+{
+#define CASE( id ) \
+ case id : return # id; break
+
+ switch( id )
+ {
+ CASE ( SRA_PLATFORM_UNDEFINED );
+ CASE ( SRA_PLATFORM_454 );
+ CASE ( SRA_PLATFORM_ILLUMINA );
+ CASE ( SRA_PLATFORM_ABSOLID );
+ CASE ( SRA_PLATFORM_COMPLETE_GENOMICS );
+ CASE ( SRA_PLATFORM_HELICOS );
+ CASE ( SRA_PLATFORM_PACBIO_SMRT );
+ CASE ( SRA_PLATFORM_ION_TORRENT );
+ CASE ( SRA_PLATFORM_CAPILLARY );
+ CASE ( SRA_PLATFORM_OXFORD_NANOPORE );
+ }
+#undef CASE
+
+ return "unknown platform";
+}
+
+const char SRA_RT_0[] = { SRA_NAME ( READ_TYPE_TECHNICAL ) };
+const char SRA_RT_1[] = { SRA_NAME ( READ_TYPE_BIOLOGICAL ) };
+const char SRA_RT_2[] = { SRA_NAMES ( READ_TYPE_TECHNICAL, READ_TYPE_FORWARD ) };
+const char SRA_RT_3[] = { SRA_NAMES ( READ_TYPE_BIOLOGICAL, READ_TYPE_FORWARD ) };
+const char SRA_RT_4[] = { SRA_NAMES ( READ_TYPE_TECHNICAL, READ_TYPE_REVERSE ) };
+const char SRA_RT_5[] = { SRA_NAMES ( READ_TYPE_BIOLOGICAL, READ_TYPE_REVERSE ) };
+const char SRA_RT_6[] = { "unknown read-type" };
+
+const char *vdcd_get_read_type_txt( const uint32_t id )
+{
+ switch( id )
+ {
+ case 0 : return( SRA_RT_0 ); break;
+ case 1 : return( SRA_RT_1 ); break;
+ case 2 : return( SRA_RT_2 ); break;
+ case 3 : return( SRA_RT_3 ); break;
+ case 4 : return( SRA_RT_4 ); break;
+ case 5 : return( SRA_RT_5 ); break;
+ }
+ return( SRA_RT_6 );
+}
+
+const char SRA_FT_0[] = { SRA_NAME ( READ_FILTER_PASS ) };
+const char SRA_FT_1[] = { SRA_NAME ( READ_FILTER_REJECT ) };
+const char SRA_FT_2[] = { SRA_NAME ( READ_FILTER_CRITERIA ) };
+const char SRA_FT_3[] = { SRA_NAME ( READ_FILTER_REDACTED ) };
+const char SRA_FT_4[] = { "unknown read-filter" };
+
+const char *vdcd_get_read_filter_txt( const uint32_t id )
+{
+ switch( id )
+ {
+ case 0 : return( SRA_FT_0 ); break;
+ case 1 : return( SRA_FT_1 ); break;
+ case 2 : return( SRA_FT_2 ); break;
+ case 3 : return( SRA_FT_3 ); break;
+ }
+ return( SRA_FT_4 );
+}
+
+/* hardcoded values taken from asm-trace/interface/sra/sradb.h */
+#define SRA_KEY_PLATFORM_ID "INSDC:SRA:platform_id"
+#define SRA_KEY_XREAD_TYPE "INSDC:SRA:xread_type"
+#define SRA_KEY_READ_TYPE "INSDC:SRA:read_type"
+#define SRA_KEY_READ_FILTER "INSDC:SRA:read_filter"
+#define SRA_PACBIO_HOLE_STATUS "PacBio:hole:status"
+
+
+static bool vdcd_type_cmp( const VSchema *my_schema, VTypedecl * typedecl, const char * to_check )
+{
+ VTypedecl type_to_check;
+ rc_t rc = VSchemaResolveTypedecl ( my_schema, &type_to_check, "%s", to_check );
+ if ( rc == 0 )
+ {
+ return VTypedeclToTypedecl ( typedecl, my_schema, &type_to_check, NULL, NULL );
+ }
+ return false;
+}
+
+
+static value_trans_fct_t vdcd_get_value_trans_fct( const VSchema *my_schema, VTypedecl * typedecl )
+{
+ value_trans_fct_t res = NULL;
+
+ if ( my_schema == NULL ) return res;
+ if ( typedecl == NULL ) return res;
+
+ if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_PLATFORM_ID ) )
+ {
+ res = vdcd_get_platform_txt;
+ }
+ else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_XREAD_TYPE ) )
+ {
+ res = vdcd_get_read_type_txt;
+ }
+ else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_TYPE ) )
+ {
+ res = vdcd_get_read_type_txt;
+ }
+ else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_FILTER ) )
+ {
+ res = vdcd_get_read_filter_txt;
+ }
+ else if ( vdcd_type_cmp( my_schema, typedecl, SRA_PACBIO_HOLE_STATUS ) )
+ {
+ res = vdcd_get_hole_status_txt;
+ }
+
+ return res;
+}
+
+
+/* implementation of the dimension-translation-functions */
+static char *vdcd_get_read_desc_txt( const uint8_t * src )
+{
+ char *res = calloc( 1, 120 );
+ SRAReadDesc desc;
+ memmove( &desc, src, sizeof( desc ) );
+ string_printf ( res, 119, NULL,
+ "seg.start=%u, seg.len=%u, type=%u, cs_key=%u, label=%s",
+ desc.seg.start, desc.seg.len, desc.type,
+ desc.cs_key, desc.label );
+ return res;
+}
+
+static char *vdcd_get_spot_desc_txt( const uint8_t *src )
+{
+ char *res = calloc( 1, 120 );
+ SRASpotDesc desc;
+ memmove( &desc, src, sizeof( desc ) );
+ string_printf ( res, 119, NULL,
+ "spot_len=%u, fixed_len=%u, signal_len=%u, clip_qual_right=%u, num_reads=%u",
+ desc.spot_len, desc.fixed_len, desc.signal_len,
+ desc.clip_qual_right, desc.num_reads );
+ return res;
+}
+
+/* hardcoded values taken from asm-trace/interface/sra/sradb.h */
+#define SRA_KEY_READ_DESC "NCBI:SRA:ReadDesc"
+#define SRA_KEY_SPOT_DESC "NCBI:SRA:SpotDesc"
+
+static dim_trans_fct_t vdcd_get_dim_trans_fct( const VSchema *my_schema, VTypedecl * typedecl )
+{
+ dim_trans_fct_t res = NULL;
+
+ if ( my_schema == NULL ) return res;
+ if ( typedecl == NULL ) return res;
+
+ if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_READ_DESC ) )
+ {
+ res = vdcd_get_read_desc_txt;
+ }
+ else if ( vdcd_type_cmp( my_schema, typedecl, SRA_KEY_SPOT_DESC ) )
+ {
+ res = vdcd_get_spot_desc_txt;
+ }
+/*
+ if ( strcmp( name, SRA_KEY_READ_DESC ) == 0 )
+ {
+ res = vdcd_get_read_desc_txt;
+ }
+ else if ( strcmp( name, SRA_KEY_SPOT_DESC ) == 0 )
+ {
+ res = vdcd_get_spot_desc_txt;
+ }
+*/
+ return res;
+}
+
+
+const char * const_s_Ascii = "Ascii";
+const char * const_s_Unicode = "Unicode";
+const char * const_s_Uint = "Uint";
+const char * const_s_Int = "Int";
+const char * const_s_Float = "Float";
+const char * const_s_Bool = "Bool";
+const char * const_s_Unknown = "unknown";
+
+char *vdcd_make_domain_txt( const uint32_t domain )
+{
+ char* res= NULL;
+ switch( domain )
+ {
+ case vtdAscii : res = string_dup_measure( const_s_Ascii, NULL ); break;
+ case vtdUnicode : res = string_dup_measure( const_s_Unicode, NULL ); break;
+ case vtdUint : res = string_dup_measure( const_s_Uint, NULL ); break;
+ case vtdInt : res = string_dup_measure( const_s_Int, NULL ); break;
+ case vtdFloat : res = string_dup_measure( const_s_Float, NULL ); break;
+ case vtdBool : res = string_dup_measure( const_s_Bool, NULL ); break;
+ default : res = string_dup_measure( const_s_Unknown, NULL ); break;
+ }
+ return res;
+}
+
+/* a single column-definition */
+p_col_def vdcd_init_col( const char* name, const size_t str_limit )
+{
+ p_col_def res = NULL;
+ if ( name == NULL ) return res;
+ if ( name[0] == 0 ) return res;
+ res = ( p_col_def )calloc( 1, sizeof( col_def ) );
+ if ( res != NULL )
+ {
+ res->name = string_dup_measure ( name, NULL );
+ vds_make( &( res->content ), str_limit, DUMP_STR_INC );
+ }
+ return res;
+}
+
+void vdcd_destroy_col( p_col_def col_def )
+{
+ if ( col_def == NULL ) return;
+ if ( col_def->name ) free( col_def->name );
+ vds_free( &( col_def->content ) );
+ free( col_def );
+}
+
+/* a vector of column-definitions */
+bool vdcd_init( col_defs** defs, const size_t str_limit )
+{
+ bool res = false;
+ if ( defs == NULL ) return res;
+ (*defs) = calloc( 1, sizeof( col_defs ) );
+ if ( *defs )
+ {
+ VectorInit( &((*defs)->cols), 0, 5 );
+ (*defs)->max_colname_chars = 0;
+ res = true;
+ }
+ ( *defs )->str_limit = str_limit;
+ return res;
+}
+
+static void CC vdcd_destroy_node( void* node, void* data )
+{
+ vdcd_destroy_col( (p_col_def)node );
+}
+
+void vdcd_destroy( col_defs* defs )
+{
+ if ( defs == NULL ) return;
+ VectorWhack( &(defs->cols), vdcd_destroy_node, NULL );
+ free( defs );
+}
+
+static p_col_def vdcd_append_col( col_defs* defs, const char* name )
+{
+ p_col_def new_col = vdcd_init_col( name, defs->str_limit );
+ if ( new_col != NULL )
+ {
+ if ( VectorAppend( &(defs->cols), NULL, new_col ) == 0 )
+ {
+ int len = string_size( name );
+ if ( len > defs->max_colname_chars )
+ defs->max_colname_chars = len;
+ }
+ }
+ return new_col;
+}
+
+
+uint32_t vdcd_parse_string( col_defs* defs, const char* src, const VTable *my_table )
+{
+ uint32_t count, found = 0;
+ char colname[MAX_COL_NAME_LEN+1];
+ size_t i_dest = 0;
+ if ( defs == NULL ) return false;
+ if ( src == NULL ) return false;
+ while ( *src )
+ {
+ if ( *src == ',' )
+ {
+ if ( i_dest > 0 )
+ {
+ colname[i_dest]=0;
+ vdcd_append_col( defs, colname );
+ }
+ i_dest = 0;
+ }
+ else
+ {
+ if ( i_dest < MAX_COL_NAME_LEN ) colname[i_dest++]=*src;
+ }
+ src++;
+ }
+ if ( i_dest > 0 )
+ {
+ colname[i_dest]=0;
+ vdcd_append_col( defs, colname );
+ }
+ count = VectorLength( &defs->cols );
+ if ( count > 0 && my_table != NULL )
+ {
+ const VCursor *my_cursor;
+ rc_t rc = VTableCreateCursorRead( my_table, &my_cursor );
+ DISP_RC( rc, "VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count; ++idx )
+ {
+ col_def *col = ( col_def * )VectorGet( &(defs->cols), idx );
+ if ( col != NULL )
+ {
+ rc = VCursorAddColumn( my_cursor, &(col->idx), "%s", col->name );
+ DISP_RC( rc, "VCursorAddColumn() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorDatatype( my_cursor, col->idx,
+ &(col->type_decl), &(col->type_desc) );
+ DISP_RC( rc, "VCursorDatatype() failed" );
+ if ( rc == 0 )
+ found++;
+ }
+ }
+ }
+ rc = VCursorRelease( my_cursor );
+ DISP_RC( rc, "VCursorRelease() failed" );
+ }
+ }
+ return found;
+}
+
+
+bool vdcd_table_has_column( const VTable *my_table, const char * to_find )
+{
+ bool res = false;
+ if ( my_table != NULL && to_find != NULL )
+ {
+ size_t to_find_len = string_size( to_find );
+ if ( to_find_len > 0 )
+ {
+ KNamelist * names;
+ rc_t rc = VTableListCol( my_table, &names );
+ DISP_RC( rc, "VTableListCol() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t n;
+ rc = KNamelistCount( names, &n );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < n && rc == 0 && !res; ++i )
+ {
+ const char * col_name;
+ rc = KNamelistGet( names, i, &col_name );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ size_t col_name_len = string_size( col_name );
+ if ( col_name_len == to_find_len )
+ res = ( string_cmp( to_find, to_find_len, col_name, col_name_len, col_name_len ) == 0 );
+ }
+ }
+ }
+ KNamelistRelease( names );
+ }
+ }
+ }
+ return res;
+}
+
+uint32_t vdcd_extract_from_table( col_defs* defs, const VTable *my_table )
+{
+ uint32_t found = 0;
+ KNamelist *names;
+ rc_t rc = VTableListCol( my_table, &names );
+ DISP_RC( rc, "VTableListCol() failed" );
+ if ( rc == 0 )
+ {
+ const VCursor *my_cursor;
+ rc = VTableCreateCursorRead( my_table, &my_cursor );
+ DISP_RC( rc, "VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t n;
+ rc = KNamelistCount( names, &n );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ const char *col_name;
+ rc = KNamelistGet( names, i, &col_name );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ p_col_def def = vdcd_append_col( defs, col_name );
+ rc = VCursorAddColumn( my_cursor, &(def->idx), "%s", def->name );
+ DISP_RC( rc, "VCursorAddColumn() failed" );
+ if ( rc == 0 )
+ {
+ rc = VCursorDatatype( my_cursor, def->idx,
+ &(def->type_decl), &(def->type_desc) );
+ DISP_RC( rc, "VCursorDatatype() failed" );
+ if ( rc == 0 )
+ {
+ found++;
+ }
+ }
+ }
+ }
+ }
+ rc = VCursorRelease( my_cursor );
+ DISP_RC( rc, "VCursorRelease() failed" );
+ }
+ rc = KNamelistRelease( names );
+ DISP_RC( rc, "KNamelistRelease() failed" );
+ }
+ return found;
+}
+
+
+bool vdcd_extract_from_phys_table( col_defs* defs, const VTable *my_table )
+{
+ bool col_defs_found = false;
+ KNamelist *names;
+ rc_t rc = VTableListPhysColumns( my_table, &names );
+ DISP_RC( rc, "VTableListPhysColumns() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t n;
+ uint32_t found = 0;
+ rc = KNamelistCount( names, &n );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ const char *col_name;
+ rc = KNamelistGet( names, i, &col_name );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ vdcd_append_col( defs, col_name );
+ found++;
+ }
+ }
+ col_defs_found = ( found > 0 );
+ }
+ rc = KNamelistRelease( names );
+ DISP_RC( rc, "KNamelistRelease() failed" );
+ }
+ return col_defs_found;
+}
+
+typedef struct add_2_cur_context
+{
+ const VCursor *my_cursor;
+ uint32_t count;
+} add_2_cur_context;
+typedef add_2_cur_context* p_add_2_cur_context;
+
+
+static void CC vdcd_add_1_to_cursor( void *item, void *data )
+{
+ rc_t rc;
+ p_col_def my_col_def = (p_col_def)item;
+ p_add_2_cur_context ctx = (p_add_2_cur_context)data;
+
+ if ( my_col_def == NULL ) return;
+ if ( ctx == NULL ) return;
+ if ( ctx->my_cursor == NULL ) return;
+ rc = VCursorAddColumn( ctx->my_cursor, &(my_col_def->idx), "%s", my_col_def->name );
+ DISP_RC( rc, "VCursorAddColumn() failed" );
+
+ /***************************************************************************
+ !!! extract type information !!!
+ **************************************************************************/
+ if ( rc == 0 )
+ {
+ rc = VCursorDatatype( ctx->my_cursor, my_col_def->idx,
+ &(my_col_def->type_decl), &(my_col_def->type_desc) );
+ DISP_RC( rc, "VCursorDatatype() failed" );
+ if ( rc == 0 )
+ {
+ ctx->count++;
+ my_col_def->valid = true;
+ }
+ }
+}
+
+
+uint32_t vdcd_add_to_cursor( col_defs* defs, const VCursor *my_cursor )
+{
+ add_2_cur_context ctx;
+ ctx.count = 0;
+ ctx.my_cursor = my_cursor;
+ VectorForEach( &(defs->cols), false, vdcd_add_1_to_cursor, &ctx );
+ return ctx.count;
+}
+
+
+static void CC vdcd_reset_1_content( void *item, void *data )
+{
+ rc_t rc;
+ p_col_def my_col_def = (p_col_def)item;
+ if ( my_col_def == NULL ) return;
+ rc = vds_clear( &(my_col_def->content) );
+ DISP_RC( rc, "dump_str_clear() failed" );
+}
+
+void vdcd_reset_content( col_defs* defs )
+{
+ VectorForEach( &(defs->cols), false,
+ vdcd_reset_1_content, NULL );
+}
+
+static void CC vdcd_ins_1_trans_fkt( void *item, void *data )
+{
+ p_col_def my_col_def = ( p_col_def )item;
+ const VSchema *my_schema = ( const VSchema * )data;
+
+ if ( my_col_def == NULL ) return;
+ if ( my_schema == NULL ) return;
+
+ /* resolves special sra-types and retrieves the addr of
+ a function that later can translate the values into plain-text
+ --- is defined in this file! */
+ my_col_def->value_trans_fct = vdcd_get_value_trans_fct( my_schema, &(my_col_def->type_decl) );
+ my_col_def->dim_trans_fct = vdcd_get_dim_trans_fct( my_schema, &(my_col_def->type_decl) );
+}
+
+void vdcd_ins_trans_fkt( col_defs* defs, const VSchema *my_schema )
+{
+ if ( defs == NULL ) return;
+ if ( my_schema == NULL ) return;
+ VectorForEach( &(defs->cols), false,
+ vdcd_ins_1_trans_fkt, (void*)my_schema );
+}
+
+
+static void CC vdcd_exclude_column_cb( void *item, void *data )
+{
+ const char * s = (const char *)data;
+ p_col_def my_col_def = (p_col_def)item;
+ if ( s == NULL || my_col_def == NULL ) return;
+ if ( strcmp( my_col_def->name, s ) == 0 )
+ my_col_def->excluded = true;
+}
+
+
+void vdcd_exclude_this_column( col_defs* defs, const char* column_name )
+{
+ VectorForEach( &(defs->cols), false, vdcd_exclude_column_cb, (void*)column_name );
+}
+
+
+void vdcd_exclude_these_columns( col_defs* defs, const char* column_names )
+{
+ char colname[MAX_COL_NAME_LEN+1];
+ size_t i_dest = 0;
+ if ( defs == NULL || column_names == NULL ) return;
+ while ( *column_names )
+ {
+ if ( *column_names == ',' )
+ {
+ if ( i_dest > 0 )
+ {
+ colname[i_dest]=0;
+ vdcd_exclude_this_column( defs, colname );
+ }
+ i_dest = 0;
+ }
+ else
+ {
+ if ( i_dest < MAX_COL_NAME_LEN ) colname[i_dest++]=*column_names;
+ }
+ column_names++;
+ }
+ if ( i_dest > 0 )
+ {
+ colname[i_dest]=0;
+ vdcd_exclude_this_column( defs, colname );
+ }
+}
+
+
+bool vdcd_get_first_none_static_column_idx( col_defs* defs, const VCursor * cur, uint32_t * idx )
+{
+ bool res = false;
+ if ( defs != NULL && cur !=NULL && idx != NULL )
+ {
+ uint32_t len = VectorLength( &(defs->cols) );
+ if ( len > 0 )
+ {
+ uint32_t start = VectorStart( &(defs->cols) );
+ uint32_t run_idx = start;
+ while ( ( run_idx < ( start + len ) ) && !res )
+ {
+ col_def * cd = VectorGet( &(defs->cols), run_idx );
+ if ( cd != NULL )
+ {
+ int64_t first;
+ uint64_t count;
+
+ rc_t rc = VCursorIdRange( cur, cd->idx, &first, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ *idx = cd->idx;
+ res = true;
+ }
+ }
+ run_idx++;
+ }
+ }
+ }
+ return res;
+}
+
+/* ******************************************************************************************************** */
+typedef struct spread
+{
+ uint64_t count;
+ double sum, sum_sq;
+ int64_t min, max;
+} spread;
+
+
+/*
+ s ... spread * s
+ b ... const void * base
+ l ... uint32_t row_len
+ t ... type ( int64_t, uint64_t ... )
+*/
+#define COUNTVALUES( S, b, l, t ) \
+ { \
+ const t * values = base; \
+ uint32_t i; \
+ for ( i = 0; i < l; ++i ) \
+ { \
+ t value = values[ i ]; \
+ if ( value != 0 ) \
+ { \
+ double value_d = value; \
+ if ( value < (S)->min ) (S)->min = value; \
+ if ( value > (S)->max ) (S)->max = value; \
+ (S)->sum += value_d; \
+ (S)->sum_sq += ( value_d * value_d ); \
+ (S)->count++; \
+ } \
+ } \
+ } \
+
+static uint64_t round_to_uint64_t( double value )
+{
+ double floor_value = floor( value );
+ double x = ( value - floor_value ) > 0.5 ? ceil( value ) : floor_value;
+ return ( uint64_t )x;
+}
+
+static rc_t vdcd_collect_spread_col( const struct num_gen * row_set, col_def * cd, const VCursor * cursor )
+{
+ const struct num_gen_iter * iter;
+ rc_t rc = num_gen_iterator_make( row_set, &iter );
+ if ( rc == 0 )
+ {
+ const void * base;
+ uint32_t row_len, elem_bits;
+ int64_t row_id;
+ spread s;
+ spread * sp = &s;
+
+ s.max = s.sum = s.sum_sq = s.count = 0;
+ s.min = INT64_MAX;
+
+ while ( ( rc == 0 ) && num_gen_iterator_next( iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 ) rc = Quitting();
+ if ( rc != 0 ) break;
+ rc = VCursorCellDataDirect( cursor, row_id, cd->idx, &elem_bits, &base, NULL, &row_len );
+ if ( rc == 0 )
+ {
+ if ( cd->type_desc.domain == vtdUint )
+ {
+ /* unsigned int's */
+ switch( elem_bits )
+ {
+ case 64 : COUNTVALUES( sp, base, row_len, uint64_t ) break;
+ case 32 : COUNTVALUES( sp, base, row_len, uint32_t ) break;
+ case 16 : COUNTVALUES( sp, base, row_len, uint16_t ) break;
+ case 8 : COUNTVALUES( sp, base, row_len, uint8_t ) break;
+ }
+ }
+ else
+ {
+ /* signed int's */
+ switch( elem_bits )
+ {
+ case 64 : COUNTVALUES( sp, base, row_len, int64_t ) break;
+ case 32 : COUNTVALUES( sp, base, row_len, int32_t ) break;
+ case 16 : COUNTVALUES( sp, base, row_len, int16_t ) break;
+ case 8 : COUNTVALUES( sp, base, row_len, int8_t ) break;
+ }
+ }
+ }
+ }
+
+ if ( s.count > 0 )
+ {
+ rc = KOutMsg( "\n[%s]\n", cd->name );
+ if ( rc == 0 )
+ rc = KOutMsg( "min = %,ld\n", s.min );
+ if ( rc == 0 )
+ rc = KOutMsg( "max = %,ld\n", s.max );
+ if ( rc == 0 )
+ rc = KOutMsg( "count = %,ld\n", s.count );
+ if ( rc == 0 )
+ {
+ double median = ( s.sum / s.count );
+ rc = KOutMsg( "median = %,ld\n", round_to_uint64_t( median ) );
+ if ( rc == 0 )
+ {
+ double stdev = sqrt( ( ( s.sum_sq - ( s.sum * s.sum ) / s.count ) ) / ( s.count - 1 ) );
+ rc = KOutMsg( "stdev = %,ld\n", round_to_uint64_t( stdev ) );
+ }
+ }
+ }
+
+ num_gen_iterator_destroy( iter );
+ }
+ return rc;
+}
+#undef COUNTVALUES
+
+rc_t vdcd_collect_spread( const struct num_gen * row_set, col_defs * cols, const VCursor * cursor )
+{
+ rc_t rc = 0;
+ uint32_t i, n = VectorLength( &cols->cols );
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ col_def * cd = VectorGet( &cols->cols, i );
+ if ( cd != NULL )
+ {
+ if ( cd->type_desc.domain == vtdUint || cd->type_desc.domain == vtdInt )
+ rc = vdcd_collect_spread_col( row_set, cd, cursor );
+ }
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-coldefs.h b/tools/vdb-dump/vdb-dump-coldefs.h
new file mode 100644
index 0000000..fb81d04
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-coldefs.h
@@ -0,0 +1,110 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_coldefs_
+#define _h_vdb_dump_coldefs_
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <klib/num-gen.h>
+
+#include "vdb-dump-str.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+const char *get_platform_txt( const uint32_t id );
+const char *get_read_type_txt( const uint32_t id );
+const char *get_read_filter_txt( const uint32_t id );
+*/
+
+typedef const char* (*value_trans_fct_t)( const uint32_t id );
+typedef char* (*dim_trans_fct_t)( const uint8_t *src );
+
+/********************************************************************
+col-def is the definition of a single column: name/index/type
+********************************************************************/
+typedef struct col_def
+{
+ char *name;
+ uint32_t idx;
+ uint64_t elementsum;
+ bool valid;
+ bool excluded;
+ VTypedecl type_decl;
+ VTypedesc type_desc;
+ dump_str content;
+ value_trans_fct_t value_trans_fct;
+ dim_trans_fct_t dim_trans_fct;
+} col_def;
+typedef col_def* p_col_def;
+
+/********************************************************************
+the col-defs are a vector of single column-definitions
+********************************************************************/
+typedef struct col_defs
+{
+ Vector cols;
+ uint16_t max_colname_chars;
+ size_t str_limit;
+} col_defs;
+typedef col_defs* p_col_defs;
+
+#define MAX_COL_NAME_LEN 64
+
+const char *vdcd_get_platform_txt( const uint32_t id );
+
+char *vdcd_make_domain_txt( const uint32_t domain );
+
+bool vdcd_init( col_defs** defs, const size_t str_limit );
+void vdcd_destroy( col_defs* defs );
+
+uint32_t vdcd_parse_string( col_defs* defs, const char* src, const VTable *my_table );
+uint32_t vdcd_extract_from_table( col_defs* defs, const VTable *my_table );
+bool vdcd_table_has_column( const VTable *my_table, const char * to_find );
+bool vdcd_extract_from_phys_table( col_defs* defs, const VTable *my_table );
+uint32_t vdcd_add_to_cursor( col_defs* defs, const VCursor *my_cursor );
+void vdcd_reset_content( col_defs* defs );
+void vdcd_ins_trans_fkt( col_defs* defs, const VSchema *my_schema );
+void vdcd_exclude_these_columns( col_defs* defs, const char* column_names );
+bool vdcd_get_first_none_static_column_idx( col_defs* defs, const VCursor * cur, uint32_t * idx );
+
+rc_t vdcd_collect_spread( const struct num_gen * row_set, col_defs * cols, const VCursor * cursor );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-context.c b/tools/vdb-dump/vdb-dump-context.c
new file mode 100644
index 0000000..e3ac2d7
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-context.c
@@ -0,0 +1,649 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-helper.h"
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/num-gen.h>
+#include <kapp/args.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <strtol.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/********************************************************************
+the dump context contains all informations needed to execute the dump
+********************************************************************/
+
+static rc_t vdco_set_str( char **dst, const char *src )
+{
+ size_t len;
+ if ( dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ if ( *dst != NULL )
+ {
+ free( *dst );
+ *dst = NULL;
+ }
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ len = string_size( src );
+ if ( len == 0 )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcItem, rcEmpty );
+
+ *dst = (char*)malloc( len + 1 );
+ if ( *dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcMemory, rcExhausted );
+
+ string_copy( *dst, len + 1, src, len );
+ return 0;
+}
+
+
+static rc_t vdco_set_String( char **dst, const String *src )
+{
+ if ( dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ if ( *dst != NULL )
+ {
+ free( *dst );
+ *dst = NULL;
+ }
+ if ( src == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+
+ if ( src->len == 0 )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcItem, rcEmpty );
+
+ *dst = (char*)malloc( src->size + 1 );
+ if ( *dst == NULL )
+ return RC( rcVDB, rcNoTarg, rcWriting, rcMemory, rcExhausted );
+
+ string_copy( *dst, src->len + 1, src->addr, src->len );
+ return 0;
+}
+
+static void vdco_init_values( p_dump_context ctx )
+{
+ ctx->path = NULL;
+ ctx->table = NULL;
+ ctx->columns = NULL;
+ ctx->excluded_columns = NULL;
+ ctx->filter = NULL;
+ ctx->idx_range = NULL;
+ ctx->output_file = NULL;
+ ctx->output_path = NULL;
+ ctx->rows = NULL;
+
+ ctx->print_row_id = true;
+ ctx->print_in_hex = false;
+ ctx->lf_after_row = 1;
+ ctx->print_column_names = true;
+ ctx->print_dna_bases = false;
+ ctx->max_line_len = 0;
+ ctx->indented_line_len = 0;
+ ctx->phase = 0;
+ ctx->slice_depth = 0;
+
+ ctx->help_requested = false;
+ ctx->usage_requested = false;
+ ctx->schema_dump_requested = false;
+ ctx->table_enum_requested = false;
+ ctx->version_requested = false;
+ ctx->column_enum_requested = false;
+ ctx->column_enum_short = false;
+ ctx->id_range_requested = false;
+ ctx->without_sra_types = false;
+ ctx->print_num_elem = false;
+ ctx->objver_requested = false;
+ ctx->objts_requested = false;
+ ctx->objtype_requested = false;
+ ctx->idx_enum_requested = false;
+ ctx->idx_range_requested = false;
+ ctx->disable_multithreading = false;
+ ctx->table_defined = false;
+ ctx->diff = false;
+ ctx->show_spotgroups = false;
+ ctx->show_spread = false;
+ ctx->interactive = false;
+}
+
+rc_t vdco_init( dump_context **ctx )
+{
+ rc_t rc = 0;
+ if ( ctx == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ (*ctx) = (p_dump_context)calloc( 1, sizeof **ctx );
+ if ( *ctx == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ if ( rc == 0 )
+ {
+ VectorInit( &((*ctx)->schema_list), 0, 5 );
+ vdco_init_values( *ctx );
+ }
+ }
+ return rc;
+}
+
+static void CC vdco_schema_list_entry_whack( void *item, void *data )
+{
+ free( item );
+}
+
+rc_t vdco_destroy( p_dump_context ctx )
+{
+ rc_t rc = 0;
+ if ( ctx == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcDestroying, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ VectorWhack( &(ctx->schema_list),
+ vdco_schema_list_entry_whack, NULL );
+
+ if ( ctx->table != NULL )
+ {
+ free( (void*)ctx->table );
+ ctx->table = NULL;
+ }
+
+ if ( ctx->columns != NULL )
+ {
+ free( (void*)ctx->columns );
+ ctx->columns = NULL;
+ }
+
+ if ( ctx->excluded_columns != NULL )
+ {
+ free( (void*)ctx->excluded_columns );
+ ctx->excluded_columns = NULL;
+ }
+
+ if ( ctx->row_range != NULL )
+ {
+ free( (void*)ctx->row_range );
+ ctx->row_range = NULL;
+ }
+
+
+ if ( ctx->output_path != NULL )
+ {
+ free( (void*)ctx->output_path );
+ ctx->output_path = NULL;
+ }
+
+ if ( ctx->output_file != NULL )
+ {
+ free( (void*)ctx->output_file );
+ ctx->output_file = NULL;
+ }
+
+ if ( ctx->rows != NULL )
+ {
+ num_gen_destroy( ctx->rows );
+ ctx->rows = NULL;
+ }
+ free( ctx );
+ }
+ return rc;
+}
+
+
+static rc_t vdco_add_schema( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ char *s = string_dup_measure ( src, NULL );
+ if ( s != NULL )
+ {
+ rc = VectorAppend( &(ctx->schema_list), NULL, s );
+ DISP_RC( rc, "VectorAppend() failed" );
+ if ( rc != 0 )
+ {
+ free( s );
+ }
+ }
+ else
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ return rc;
+}
+
+static rc_t vdco_set_filter( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->filter), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+/* not static because can be called directly from vdb-dump.c */
+rc_t vdco_set_table( p_dump_context ctx, const char * src )
+{
+ rc_t rc;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ else
+ {
+ rc = vdco_set_str( (char**)&(ctx->table), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+
+rc_t vdco_set_table_String( p_dump_context ctx, const String * src )
+{
+ rc_t rc;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ else
+ {
+ rc = vdco_set_String( (char**)&(ctx->table), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+
+static rc_t vdco_set_columns( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->columns), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+static rc_t vdco_set_excluded_columns( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->excluded_columns), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+static rc_t vdco_set_row_range( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->row_range), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->rows != NULL )
+ {
+ num_gen_destroy( ctx->rows );
+ ctx->rows = NULL;
+ }
+ rc = num_gen_make_from_str_sorted( &ctx->rows, src, ctx->merge_ranges );
+ DISP_RC( rc, "num_gen_make_from_str() failed" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdco_set_idx_range( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->idx_range), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+
+static rc_t vdco_set_output_file( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->output_file), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+
+static rc_t vdco_set_output_path( p_dump_context ctx, const char *src )
+{
+ rc_t rc = 0;
+ if ( ( ctx == NULL )||( src == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcWriting, rcParam, rcNull );
+ }
+ if ( rc == 0 )
+ {
+ rc = vdco_set_str( (char**)&(ctx->output_path), src );
+ DISP_RC( rc, "vdco_set_str() failed" );
+ }
+ return rc;
+}
+
+
+static bool vdco_set_format( p_dump_context ctx, const char *src )
+{
+ if ( ctx == NULL ) return false;
+ if ( src == NULL ) return false;
+ if ( strcmp( src, "csv" ) == 0 )
+ ctx->format = df_csv;
+ else if ( strcmp( src, "xml" ) == 0 )
+ ctx->format = df_xml;
+ else if ( strcmp( src, "json" ) == 0 )
+ ctx->format = df_json;
+ else if ( strcmp( src, "piped" ) == 0 )
+ ctx->format = df_piped;
+ else if ( strcmp( src, "sra-dump" ) == 0 )
+ ctx->format = df_sra_dump;
+ else if ( strcmp( src, "tab" ) == 0 )
+ ctx->format = df_tab;
+ else if ( strcmp( src, "fastq" ) == 0 )
+ ctx->format = df_fastq;
+ else if ( strcmp( src, "fastq1" ) == 0 )
+ ctx->format = df_fastq1;
+ else if ( strcmp( src, "fasta" ) == 0 )
+ ctx->format = df_fasta;
+ else if ( strcmp( src, "fasta1" ) == 0 )
+ ctx->format = df_fasta1;
+ else if ( strcmp( src, "fasta2" ) == 0 )
+ ctx->format = df_fasta2;
+ else if ( strcmp( src, "qual" ) == 0 )
+ ctx->format = df_qual;
+ else if ( strcmp( src, "qual1" ) == 0 )
+ ctx->format = df_qual1;
+ else if ( strcmp( src, "bin" ) == 0 )
+ ctx->format = df_bin;
+ else if ( strcmp( src, "sql" ) == 0 )
+ ctx->format = df_sql;
+ else ctx->format = df_default;
+ return true;
+}
+
+
+static bool vdco_set_boolean_char( dump_context *ctx, const char * src )
+{
+ ctx->c_boolean = 0;
+ if ( ctx == NULL ) return false;
+ if ( src == NULL ) return false;
+ if ( strcmp( src, "T" ) == 0 )
+ ctx->c_boolean = 'T';
+ else if ( strcmp( src, "1" ) == 0 )
+ ctx->c_boolean = '1';
+ return true;
+}
+
+
+static bool vdco_get_bool_option( const Args *my_args,
+ const char *name,
+ const bool def )
+{
+ bool res = def;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( rc == 0 )
+ res = ( count > 0 );
+ return res;
+}
+
+static bool vdco_get_bool_neg_option( const Args *my_args,
+ const char *name,
+ const bool def )
+{
+ bool res = def;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( rc == 0 )
+ res = ( count == 0 );
+ return res;
+}
+
+static uint16_t vdco_get_uint16_option( const Args *my_args,
+ const char *name,
+ const uint16_t def )
+{
+ uint16_t res = def;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ const char *s;
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&s );
+ DISP_RC( rc, "ArgsOptionValue() failed" );
+ if ( rc == 0 ) res = atoi( s );
+ }
+ return res;
+}
+
+
+static size_t vdco_get_size_t_option( const Args *my_args,
+ const char *name,
+ const size_t def )
+{
+ size_t res = def;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ const char *s;
+ rc = ArgsOptionValue( my_args, name, 0, (const void **)&s );
+ DISP_RC( rc, "ArgsOptionValue() failed" );
+ if ( rc == 0 )
+ {
+ char *endp;
+ res = strtou64( s, &endp, 10 );
+ }
+ }
+ return res;
+}
+
+
+static const char* vdco_get_str_option( const Args *my_args,
+ const char *name )
+{
+ const char* res = NULL;
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, name, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ rc = ArgsOptionValue( my_args, name, 0, (const void**)&res );
+ DISP_RC( rc, "ArgsOptionValue() failed" );
+ }
+ return res;
+}
+
+void vdco_set_schemas( const Args *my_args, p_dump_context ctx )
+{
+ uint32_t count;
+ rc_t rc = ArgsOptionCount( my_args, OPTION_SCHEMA, &count );
+ DISP_RC( rc, "ArgsOptionCount() failed" );
+ if ( ( rc == 0 )&&( count > 0 ) )
+ {
+ uint32_t i;
+ for ( i=0; i<count; ++i )
+ {
+ const char* txt = NULL;
+ rc = ArgsOptionValue( my_args, OPTION_SCHEMA, i, (const void**)&txt );
+ DISP_RC( rc, "ArgsOptionValue() failed" );
+ if ( ( rc == 0 )&&( txt != NULL ) )
+ {
+ rc = vdco_add_schema( ctx, txt );
+ DISP_RC( rc, "dump_context_add_schema() failed" );
+ }
+ }
+ }
+}
+
+
+size_t vdco_schema_count( p_dump_context ctx )
+{
+ if ( ctx == NULL ) return 0;
+ return VectorLength( &(ctx->schema_list ) );
+}
+
+static void vdco_evaluate_options( const Args *my_args,
+ dump_context *ctx )
+{
+ if ( my_args == NULL ) return;
+ if ( ctx == NULL ) return;
+
+ ctx->help_requested = vdco_get_bool_option( my_args, OPTION_HELP, false );
+ ctx->print_row_id = vdco_get_bool_option( my_args, OPTION_ROW_ID_ON, false );
+ ctx->lf_after_row = vdco_get_uint16_option( my_args, OPTION_LINE_FEED, 1 );
+ ctx->phase = vdco_get_uint16_option( my_args, OPTION_PHASE, 0 );
+ ctx->print_column_names = vdco_get_bool_neg_option( my_args, OPTION_COLNAME_OFF, true );
+ ctx->print_in_hex = vdco_get_bool_option( my_args, OPTION_IN_HEX, false );
+ ctx->schema_dump_requested = vdco_get_bool_option( my_args, OPTION_SCHEMA_DUMP, false );
+ ctx->table_enum_requested = vdco_get_bool_option( my_args, OPTION_TABLE_ENUM, false );
+ ctx->version_requested = vdco_get_bool_option( my_args, OPTION_VERSION, false );
+ ctx->column_enum_requested = vdco_get_bool_option( my_args, OPTION_COLUMN_ENUM, false );
+ ctx->column_enum_short = vdco_get_bool_option( my_args, OPTION_COLUMN_SHORT, false );
+ ctx->print_dna_bases = vdco_get_bool_option( my_args, OPTION_DNA_BASES, false );
+ ctx->objver_requested = vdco_get_bool_option( my_args, OPTION_OBJVER, false );
+ ctx->objts_requested = vdco_get_bool_option( my_args, OPTION_OBJTS, false );
+ ctx->objtype_requested = vdco_get_bool_option( my_args, OPTION_OBJTYPE, false );
+ ctx->max_line_len = vdco_get_uint16_option( my_args, OPTION_MAX_LINE_LEN, 0 );
+ ctx->indented_line_len = vdco_get_uint16_option( my_args, OPTION_LINE_INDENT, 0 );
+ ctx->id_range_requested = vdco_get_bool_option( my_args, OPTION_ID_RANGE, false );
+ vdco_set_format( ctx, vdco_get_str_option( my_args, OPTION_FORMAT ) );
+ ctx->without_sra_types = vdco_get_bool_option( my_args, OPTION_WITHOUT_SRA, false );
+ ctx->print_num_elem = vdco_get_bool_option( my_args, OPTION_NUMELEM, false );
+ ctx->sum_num_elem = vdco_get_bool_option( my_args, OPTION_NUMELEMSUM, false );
+ ctx->show_blobbing = vdco_get_bool_option( my_args, OPTION_SHOW_BLOBBING, false );
+ ctx->enum_phys = vdco_get_bool_option( my_args, OPTION_ENUM_PHYS, false );
+ ctx->enum_readable = vdco_get_bool_option( my_args, OPTION_ENUM_READABLE, false );
+ ctx->idx_enum_requested = vdco_get_bool_option( my_args, OPTION_IDX_ENUM, false );
+ ctx->disable_multithreading = vdco_get_bool_option( my_args, OPTION_NO_MULTITHREAD, false );
+ ctx->print_info = vdco_get_bool_option( my_args, OPTION_INFO, false );
+ ctx->diff = vdco_get_bool_option( my_args, OPTION_DIFF, false );
+ ctx->show_spotgroups = vdco_get_bool_option( my_args, OPTION_SPOTGROUPS, false );
+ /*ctx->force_sra_schema = vdco_get_bool_option( my_args, OPTION_SRASCHEMA, false );*/
+ ctx->merge_ranges = vdco_get_bool_option( my_args, OPTION_MERGE_RANGES, false );
+ ctx->show_spread = vdco_get_bool_option( my_args, OPTION_SPREAD, false );
+ ctx->interactive = vdco_get_bool_option( my_args, OPTION_INTERACTIVE, false );
+ ctx->slice_depth = vdco_get_uint16_option( my_args, OPTION_SLICE, 0 );
+
+ ctx->cur_cache_size = vdco_get_size_t_option( my_args, OPTION_CUR_CACHE, CURSOR_CACHE_SIZE );
+ ctx->output_buffer_size = vdco_get_size_t_option( my_args, OPTION_OUT_BUF_SIZE, DEF_OPTION_OUT_BUF_SIZE );
+
+ if ( vdco_get_bool_option( my_args, OPTION_GZIP, false ) )
+ ctx->compress_mode = orm_gzip;
+ else if ( vdco_get_bool_option( my_args, OPTION_BZIP2, false ) )
+ ctx->compress_mode = orm_bzip2;
+ else
+ ctx->compress_mode = orm_uncompressed;
+
+ vdco_set_table( ctx, vdco_get_str_option( my_args, OPTION_TABLE ) );
+ ctx->table_defined = ( ctx->table != NULL );
+
+ vdco_set_columns( ctx, vdco_get_str_option( my_args, OPTION_COLUMNS ) );
+ vdco_set_excluded_columns( ctx, vdco_get_str_option( my_args, OPTION_EXCLUDED_COLUMNS ) );
+ vdco_set_row_range( ctx, vdco_get_str_option( my_args, OPTION_ROWS ) );
+ vdco_set_idx_range( ctx, vdco_get_str_option( my_args, OPTION_IDX_RANGE ) );
+ vdco_set_output_file( ctx, vdco_get_str_option( my_args, OPTION_OUT_FILE ) );
+ vdco_set_output_path( ctx, vdco_get_str_option( my_args, OPTION_OUT_PATH ) );
+
+ ctx->idx_range_requested = ( ctx->idx_range != NULL );
+ vdco_set_schemas( my_args, ctx );
+ vdco_set_filter( ctx, vdco_get_str_option( my_args, OPTION_FILTER ) );
+ vdco_set_boolean_char( ctx, vdco_get_str_option( my_args, OPTION_BOOLEAN ) );
+
+ if ( ctx->format == df_sra_dump )
+ ctx->without_sra_types = true;
+}
+
+rc_t vdco_capture_arguments_and_options( const Args * args, dump_context *ctx)
+{
+ rc_t rc;
+
+ vdco_evaluate_options( args, ctx );
+
+ rc = ArgsHandleLogLevel( args );
+ DISP_RC( rc, "ArgsHandleLogLevel() failed" );
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-context.h b/tools/vdb-dump/vdb-dump-context.h
new file mode 100644
index 0000000..2bd5d54
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-context.h
@@ -0,0 +1,220 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_context_
+#define _h_vdb_dump_context_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <kapp/args.h>
+#include <klib/vector.h>
+#include <klib/num-gen.h>
+#include "vdb-dump-redir.h"
+
+#define OPTION_ROW_ID_ON "row_id_on"
+#define OPTION_LINE_FEED "line_feed"
+#define OPTION_COLNAME_OFF "colname_off"
+#define OPTION_IN_HEX "in_hex"
+#define OPTION_TABLE "table"
+#define OPTION_ROWS "rows"
+#define OPTION_COLUMNS "columns"
+#define OPTION_SCHEMA "schema"
+#define OPTION_SCHEMA_DUMP "schema_dump"
+#define OPTION_TABLE_ENUM "table_enum"
+#define OPTION_COLUMN_ENUM "column_enum"
+#define OPTION_COLUMN_SHORT "column_enum_short"
+#define OPTION_DNA_BASES "dna_bases"
+#define OPTION_MAX_LINE_LEN "max_length"
+#define OPTION_LINE_INDENT "indent_width"
+#define OPTION_FILTER "filter"
+#define OPTION_FORMAT "format"
+#define OPTION_ID_RANGE "id_range"
+#define OPTION_WITHOUT_SRA "without_sra"
+#define OPTION_EXCLUDED_COLUMNS "exclude"
+#define OPTION_BOOLEAN "boolean"
+#define OPTION_OBJVER "obj_version"
+#define OPTION_OBJTS "obj_timestamp"
+#define OPTION_OBJTYPE "obj_type"
+#define OPTION_NUMELEM "numelem"
+#define OPTION_NUMELEMSUM "numelemsum"
+#define OPTION_SHOW_BLOBBING "blobbing"
+#define OPTION_ENUM_PHYS "phys"
+#define OPTION_ENUM_READABLE "readable"
+#define OPTION_IDX_ENUM "idx-report"
+#define OPTION_IDX_RANGE "idx-range"
+#define OPTION_CUR_CACHE "cur-cache"
+#define OPTION_OUT_FILE "output-file"
+#define OPTION_OUT_PATH "output-path"
+#define OPTION_PHASE "phase"
+#define OPTION_GZIP "gzip"
+#define OPTION_BZIP2 "bzip2"
+#define OPTION_OUT_BUF_SIZE "output-buffer-size"
+#define OPTION_NO_MULTITHREAD "disable-multithreading"
+#define OPTION_INFO "info"
+#define OPTION_DIFF "diff"
+#define OPTION_SPOTGROUPS "spotgroups"
+/*#define OPTION_SRASCHEMA "sraschema"*/
+#define OPTION_MERGE_RANGES "merge-ranges"
+#define OPTION_SPREAD "spread"
+#define OPTION_SLICE "slice"
+#define OPTION_INTERACTIVE "interactive"
+
+#define ALIAS_ROW_ID_ON "I"
+#define ALIAS_LINE_FEED "l"
+#define ALIAS_COLNAME_OFF "N"
+#define ALIAS_IN_HEX "X"
+#define ALIAS_TABLE "T"
+#define ALIAS_ROWS "R"
+#define ALIAS_COLUMNS "C"
+#define ALIAS_SCHEMA "S"
+#define ALIAS_SCHEMA_DUMP "A"
+#define ALIAS_TABLE_ENUM "E"
+#define ALIAS_COLUMN_ENUM "O"
+#define ALIAS_COLUMN_SHORT "o"
+#define ALIAS_DNA_BASES "D"
+#define ALIAS_MAX_LINE_LEN "M"
+#define ALIAS_LINE_INDENT "i"
+#define ALIAS_FILTER "F"
+#define ALIAS_FORMAT "f"
+#define ALIAS_ID_RANGE "r"
+#define ALIAS_WITHOUT_SRA "n"
+#define ALIAS_EXCLUDED_COLUMNS "x"
+#define ALIAS_BOOLEAN "b"
+#define ALIAS_OBJVER "j"
+#define ALIAS_OBJTYPE "y"
+#define ALIAS_NUMELEM "u"
+#define ALIAS_NUMELEMSUM "U"
+
+#define USE_PATHTYPE_TO_DETECT_DB_OR_TAB 1
+#define CURSOR_CACHE_SIZE 256*1024*1024
+#define DEF_OPTION_OUT_BUF_SIZE 1024*1024
+
+typedef enum dump_format_t
+{
+ df_default,
+ df_csv,
+ df_xml,
+ df_json,
+ df_piped,
+ df_sra_dump,
+ df_tab,
+ df_fastq,
+ df_fastq1,
+ df_fasta,
+ df_fasta1,
+ df_fasta2,
+ df_qual,
+ df_qual1,
+ df_bin,
+ df_sql
+} dump_format_t;
+
+/********************************************************************
+the dump context contains all informations needed to execute the dump
+********************************************************************/
+typedef struct dump_context
+{
+ const char *path;
+ Vector schema_list;
+ const char *table;
+ const char *columns;
+ const char *excluded_columns;
+ const char *filter;
+ const char *idx_range;
+ const char *row_range;
+ const char *output_file;
+ const char *output_path;
+ struct num_gen * rows;
+ bool print_row_id;
+ uint16_t lf_after_row;
+ uint16_t max_line_len;
+ uint16_t indented_line_len;
+ uint16_t phase;
+ uint32_t generic_idx;
+ uint32_t slice_depth;
+ size_t cur_cache_size;
+ size_t output_buffer_size;
+ dump_format_t format;
+ out_redir_mode_t compress_mode;
+ char c_boolean;
+
+ bool print_column_names;
+ bool print_in_hex;
+ bool print_dna_bases;
+ bool help_requested;
+ bool usage_requested;
+ bool schema_dump_requested;
+ bool table_enum_requested;
+ bool version_requested;
+ bool column_enum_requested;
+ bool column_enum_short;
+ bool id_range_requested;
+ bool without_sra_types;
+ bool objver_requested;
+ bool objts_requested;
+ bool objtype_requested;
+ bool print_num_elem;
+ bool sum_num_elem;
+ bool show_blobbing;
+ bool enum_phys;
+ bool enum_readable;
+ bool idx_enum_requested;
+ bool idx_range_requested;
+ bool disable_multithreading;
+ bool print_info;
+ bool table_defined;
+ bool diff;
+ bool show_spotgroups;
+ bool merge_ranges;
+ bool show_spread;
+ bool interactive;
+} dump_context;
+typedef dump_context* p_dump_context;
+
+
+rc_t vdco_init( dump_context **ctx );
+rc_t vdco_destroy( p_dump_context ctx );
+
+size_t vdco_schema_count( p_dump_context ctx );
+
+void vdco_show_usage( p_dump_context ctx );
+void vdco_show_help( p_dump_context ctx );
+
+rc_t vdco_set_table( p_dump_context ctx, const char *src );
+rc_t vdco_set_table_String( p_dump_context ctx, const String * src );
+
+rc_t vdco_capture_arguments_and_options( const Args * args, dump_context *ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-fastq.c b/tools/vdb-dump/vdb-dump-fastq.c
new file mode 100644
index 0000000..d02fef3
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-fastq.c
@@ -0,0 +1,1132 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-fastq.h"
+#include "vdb-dump-helper.h"
+
+#include <stdlib.h>
+
+#include <kdb/manager.h>
+#include <vdb/vdb-priv.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/printf.h>
+#include <klib/num-gen.h>
+
+#include <insdc/sra.h> /* for filter/types */
+
+
+rc_t CC Quitting ( void );
+
+#define INVALID_COLUMN 0xFFFFFFFF
+#define DEF_FASTA_LEN 70
+
+typedef struct fastq_ctx
+{
+ const char * run_name;
+ const VTable * tbl;
+ const VCursor * cursor;
+ const struct num_gen_iter * row_iter;
+ dump_format_t format;
+ size_t cur_cache_size;
+ uint32_t max_line_len;
+ uint32_t idx_read;
+ uint32_t idx_qual;
+ uint32_t idx_name;
+ uint32_t idx_read_start;
+ uint32_t idx_read_len;
+ uint32_t idx_read_type;
+} fastq_ctx;
+
+
+static char * vdb_fastq_extract_run_name( const char * acc_or_path )
+{
+ char * delim = string_rchr ( acc_or_path, string_size( acc_or_path ), '/' );
+ if ( delim == NULL )
+ return string_dup_measure ( acc_or_path, NULL );
+ else
+ return string_dup_measure ( delim + 1, NULL );
+}
+
+
+static void init_fastq_ctx( const p_dump_context ctx, fastq_ctx * fctx, const char * acc_or_path )
+{
+ fctx->run_name = vdb_fastq_extract_run_name( acc_or_path );
+ fctx->tbl = NULL;
+ fctx->cursor = NULL;
+ fctx->row_iter = NULL;
+ fctx->max_line_len = ctx->max_line_len;
+ fctx->format = ctx->format;
+ fctx->cur_cache_size = ctx->cur_cache_size;
+ fctx->idx_read = INVALID_COLUMN;
+ fctx->idx_qual = INVALID_COLUMN;
+ fctx->idx_name = INVALID_COLUMN;
+ fctx->idx_read_start = INVALID_COLUMN;
+ fctx->idx_read_len = INVALID_COLUMN;
+ fctx->idx_read_type = INVALID_COLUMN;
+}
+
+
+static void vdb_fastq_row_error( const char * fmt, rc_t rc, int64_t row_id )
+{
+ PLOGERR( klogInt, ( klogInt, rc, fmt, "row_nr=%li", row_id ) );
+}
+
+
+static bool is_name_in_list( KNamelist * col_names, const char * to_find )
+{
+ bool res = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( col_names, &count );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ size_t to_find_len = string_size( to_find );
+ for ( i = 0; i < count && rc == 0 && !res; ++i )
+ {
+ const char * col_name;
+ rc = KNamelistGet( col_names, i, &col_name );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ size_t col_name_len = string_size( col_name );
+ if ( col_name_len == to_find_len )
+ res = ( string_cmp( to_find, to_find_len, col_name, col_name_len, col_name_len ) == 0 );
+ }
+ }
+ }
+ return res;
+}
+
+
+static rc_t prepare_column( fastq_ctx * fctx, KNamelist * col_names, uint32_t * col_idx,
+ const char * to_find, const char * col_spec )
+{
+ rc_t rc = 0;
+ if ( is_name_in_list( col_names, to_find ) )
+ {
+ rc = VCursorAddColumn( fctx->cursor, col_idx, col_spec );
+ if ( rc != 0 )
+ {
+ *col_idx = INVALID_COLUMN;
+ PLOGERR( klogInt, ( klogInt, rc, "VCurosrAddColumn( '$(col)' ) failed", "col=%s", col_spec ) );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_prepare_cursor( fastq_ctx * fctx )
+{
+ KNamelist * col_names;
+ rc_t rc = VTableListCol( fctx->tbl, &col_names );
+ DISP_RC( rc, "VTableListCol() failed" );
+ if ( rc == 0 )
+ {
+ rc = VTableCreateCachedCursorRead( fctx->tbl, &fctx->cursor, fctx->cur_cache_size );
+ DISP_RC( rc, "VTableCreateCursorRead( fasta/fastq ) failed" );
+ if ( rc == 0 )
+ rc = prepare_column( fctx, col_names, &fctx->idx_read, "READ", "(INSDC:dna:text)READ" );
+
+ if ( rc == 0 && ( fctx->format == df_fastq || fctx->format == df_fastq1 ) )
+ rc = prepare_column( fctx, col_names, &fctx->idx_qual, "QUALITY", "(INSDC:quality:text:phred_33)QUALITY" );
+
+ if ( rc == 0 && ( fctx->format == df_qual || fctx->format == df_qual1 ) )
+ rc = prepare_column( fctx, col_names, &fctx->idx_qual, "QUALITY", "(INSDC:quality:phred)QUALITY" );
+
+ if ( rc == 0 )
+ {
+ if ( fctx->format == df_fasta2 )
+ rc = prepare_column( fctx, col_names, &fctx->idx_name, "SEQ_ID", "(ascii)SEQ_ID" );
+ if ( rc == 0 && fctx->idx_name == INVALID_COLUMN )
+ rc = prepare_column( fctx, col_names, &fctx->idx_name, "NAME", "(ascii)NAME" );
+ }
+
+ if ( rc == 0 )
+ rc = prepare_column( fctx, col_names, &fctx->idx_read_start, "READ_START", "(INSDC:coord:zero)READ_START" );
+
+ if ( rc == 0 )
+ rc = prepare_column( fctx, col_names, &fctx->idx_read_len, "READ_LEN", "(INSDC:coord:len)READ_LEN" );
+
+ if ( rc == 0 )
+ rc = prepare_column( fctx, col_names, &fctx->idx_read_type, "READ_TYPE", "(INSDC:SRA:xread_type)READ_TYPE" );
+
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen ( fctx->cursor );
+ DISP_RC( rc, "VCursorOpen( fasta/fastq ) failed" );
+ }
+ KNamelistRelease( col_names );
+ }
+ return rc;
+}
+
+
+typedef struct fastq_spot
+{
+ const char * name;
+ const char * bases;
+ const char * qual;
+ const uint32_t * rd_start;
+ const uint32_t * rd_len;
+ const uint8_t * rd_type;
+ uint32_t name_len;
+ uint32_t num_bases;
+ uint32_t num_qual;
+ uint32_t num_rd_start;
+ uint32_t num_rd_len;
+ uint32_t num_rd_type;
+} fastq_spot;
+
+
+static rc_t read_spot( const fastq_ctx * fctx, int64_t row_id, fastq_spot * spot )
+{
+ rc_t rc = 0;
+ uint32_t elem_bits, boff;
+ if ( fctx->idx_name != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_name, &elem_bits,
+ (const void**)&spot->name, &boff, &spot->name_len );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), NAME ) failed", rc, row_id );
+ }
+
+ if ( rc == 0 && fctx->idx_read != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_read, &elem_bits,
+ (const void**)&spot->bases, &boff, &spot->num_bases );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), READ ) failed", rc, row_id );
+ }
+
+ if ( rc == 0 && fctx->idx_qual != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_qual, &elem_bits,
+ (const void**)&spot->qual, &boff, &spot->num_qual );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), QUALITY ) failed", rc, row_id );
+ }
+
+ if ( rc == 0 && fctx->idx_read_start != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_read_start, &elem_bits,
+ (const void**)&spot->rd_start, &boff, &spot->num_rd_start );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), READ_START ) failed", rc, row_id );
+ }
+
+ if ( rc == 0 && fctx->idx_read_len != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_read_len, &elem_bits,
+ (const void**)&spot->rd_len, &boff, &spot->num_rd_len );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), READ_LEN ) failed", rc, row_id );
+ }
+
+ if ( rc == 0 && fctx->idx_read_type != INVALID_COLUMN )
+ {
+ rc = VCursorCellDataDirect( fctx->cursor, row_id, fctx->idx_read_type, &elem_bits,
+ (const void**)&spot->rd_type, &boff, &spot->num_rd_type );
+ if ( rc != 0 )
+ vdb_fastq_row_error( "VCursorCellDataDirect( row#$(row_nr), READ_TYPE ) failed", rc, row_id );
+ }
+
+ return rc;
+}
+
+
+static rc_t vdb_fastq1_frag_type_checked( fastq_spot * spot, int64_t row_id, const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( spot->num_bases != spot->num_qual )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ PLOGERR( klogInt,
+ ( klogInt, rc, "invalid spot #$(row): bases.len( $(n_bases) ) != qual.len( $(n_qual)",
+ "row=%li,n_bases=%d,n_qual=%d", row_id, spot->num_bases, spot->num_qual ) );
+ }
+ else if ( spot->num_rd_start != spot->num_rd_len ||
+ spot->num_rd_start != spot->num_rd_type )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ PLOGERR( klogInt,
+ ( klogInt, rc,
+ "invalid spot #$(row): #READ_START=$(rd_start), #READ_LEN=$(rd_len), #READ_TYPE=$(rd_type)",
+ "row=%li,rd_start=%d,rd_len=%d,rd_type=%d",
+ row_id, spot->num_rd_start, spot->num_rd_len, spot->num_rd_type ) );
+ }
+ else
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot->num_rd_start; ++idx )
+ {
+ if ( ( ( spot->rd_type[ idx ] & READ_TYPE_BIOLOGICAL ) == READ_TYPE_BIOLOGICAL ) &&
+ spot->rd_len[ idx ] > 0 )
+ {
+ rc = KOutMsg( "@%s.%li.%d %.*s length=%u\n%.*s\n+%s.%li.%d %.*s length=%u\n%.*s\n",
+ fctx->run_name, row_id, frag, spot->name_len, spot->name, spot->rd_len[ idx ],
+ spot->rd_len[ idx ], &( spot->bases[ ofs ] ),
+ fctx->run_name, row_id, frag, spot->name_len, spot->name, spot->rd_len[ idx ],
+ spot->rd_len[ idx ], &( spot->qual[ ofs ] )
+ );
+ frag++;
+ }
+ ofs += spot->rd_len[ idx ];
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq1_frag_not_type_checked( fastq_spot * spot, int64_t row_id, const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( spot->num_bases != spot->num_qual )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ PLOGERR( klogInt,
+ ( klogInt, rc, "invalid spot #$(row): bases.len( $(n_bases) ) != qual.len( $(n_qual)",
+ "row=%li,n_bases=%d,n_qual=%d", row_id, spot->num_bases, spot->num_qual ) );
+ }
+ else if ( spot->num_rd_start != spot->num_rd_len )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ PLOGERR( klogInt,
+ ( klogInt, rc,
+ "invalid spot #$(row): #READ_START=$(rd_start), #READ_LEN=$(rd_len)",
+ "row=%li,rd_start=%d,rd_len=%d",
+ row_id, spot->num_rd_start, spot->num_rd_len ) );
+ }
+ else
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot->num_rd_start; ++idx )
+ {
+ if ( spot->rd_len[ idx ] > 0 )
+ {
+ rc = KOutMsg( "@%s.%li.%d %.*s length=%u\n%.*s\n+%s.%li.%d %.*s length=%u\n%.*s\n",
+ fctx->run_name, row_id, frag, spot->name_len, spot->name, spot->rd_len[ idx ],
+ spot->rd_len[ idx ], &( spot->bases[ ofs ] ),
+ fctx->run_name, row_id, frag, spot->name_len, spot->name, spot->rd_len[ idx ],
+ spot->rd_len[ idx ], &( spot->qual[ ofs ] )
+ );
+ frag++;
+ }
+ ofs += spot->rd_len[ idx ];
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq1_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( fctx->idx_read == INVALID_COLUMN || fctx->idx_name == INVALID_COLUMN ||
+ fctx->idx_qual == INVALID_COLUMN || fctx->idx_read_start == INVALID_COLUMN ||
+ fctx->idx_read_len == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta-format, at least one of these columns not found: READ, NAME, QUALITY, READ_START, READ_LEN" );
+ }
+ else
+ {
+ bool has_type = ( fctx->idx_read_type == INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ if ( has_type )
+ rc = vdb_fastq1_frag_type_checked( &spot, row_id, fctx );
+ else
+ rc = vdb_fastq1_frag_not_type_checked( &spot, row_id, fctx );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( fctx->idx_read == INVALID_COLUMN || fctx->idx_qual == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta-format: READ and/or QUALITY column not found" );
+ }
+ else
+ {
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ if ( has_name )
+ rc = KOutMsg( "@%s.%li %.*s length=%u\n%.*s\n+%s.%li %.*s length=%u\n%.*s\n",
+ fctx->run_name, row_id, spot.name_len, spot.name, spot.num_bases,
+ spot.num_bases, spot.bases,
+ fctx->run_name, row_id, spot.name_len, spot.name, spot.num_qual,
+ spot.num_qual, spot.qual );
+ else
+
+ rc = KOutMsg( "@%s.%li %li length=%u\n%.*s\n+%s.%li %li length=%u\n%.*s\n",
+ fctx->run_name, row_id, row_id, spot.num_bases,
+ spot.num_bases, spot.bases,
+ fctx->run_name, row_id, row_id, spot.num_bases,
+ spot.num_qual, spot.qual );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_bases( const char * bases, uint32_t num_bases, uint32_t max_line_len )
+{
+ rc_t rc;
+ if ( max_line_len == 0 )
+ rc = KOutMsg( "%.*s\n", num_bases, bases );
+ else
+ {
+ uint32_t idx = 0, to_print = num_bases;
+ rc = 0;
+ while ( rc == 0 && idx < num_bases )
+ {
+ if ( to_print > max_line_len )
+ to_print = max_line_len;
+
+ rc = KOutMsg( "%.*s\n", to_print, &bases[ idx ] );
+ if ( rc == 0 )
+ {
+ idx += to_print;
+ to_print = ( num_bases - idx );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t print_qual( const char * qual, uint32_t count, uint32_t max_line_len )
+{
+ rc_t rc = 0;
+ uint32_t i = 0, on_line = 0;
+ while ( rc == 0 && i < count )
+ {
+ char buffer[ 16 ];
+ size_t num_writ;
+ rc = string_printf( buffer, sizeof buffer, &num_writ, "%d", qual[ i ] );
+ if ( rc == 0 )
+ {
+ if ( on_line == 0 )
+ {
+ rc = KOutMsg( "%s", buffer );
+ on_line = num_writ;
+ }
+ if ( ( on_line + num_writ + 1 ) < max_line_len )
+ {
+ rc = KOutMsg( " %s", buffer );
+ on_line += ( num_writ + 1 );
+ }
+ else
+ {
+ rc = KOutMsg( "\n%s", buffer );
+ on_line = num_writ;
+ }
+ i++;
+ }
+ }
+ rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t vdb_fasta_frag_type_checked_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot.num_rd_start; ++idx )
+ {
+ uint32_t frag_len = spot.rd_len[ idx ];
+ if ( frag_len > 0 &&
+ ( ( spot.rd_type[ idx ] & READ_TYPE_BIOLOGICAL ) == READ_TYPE_BIOLOGICAL ) )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li.%d %.*s length=%u\n",
+ fctx->run_name, row_id, frag, spot.name_len, spot.name, frag_len );
+ else
+ rc = KOutMsg( ">%s.%li.%d %li length=%u\n",
+ fctx->run_name, row_id, frag, row_id, frag_len );
+
+ if ( rc == 0 )
+ rc = print_bases( &( spot.bases[ ofs ] ), frag_len, fctx->max_line_len );
+
+ frag++;
+ }
+ ofs += frag_len;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fasta_frag_no_type_check_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot.num_rd_start; ++idx )
+ {
+ uint32_t frag_len = spot.rd_len[ idx ];
+ if ( frag_len > 0 )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li.%d %.*s length=%u\n",
+ fctx->run_name, row_id, frag, spot.name_len, spot.name, frag_len );
+ else
+ rc = KOutMsg( ">%s.%li.%d %li length=%u\n",
+ fctx->run_name, row_id, frag, row_id, frag_len );
+
+ if ( rc == 0 )
+ rc = print_bases( &( spot.bases[ ofs ] ), frag_len, fctx->max_line_len );
+
+ frag++;
+ }
+ ofs += frag_len;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fasta_spot_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li %.*s length=%u\n",
+ fctx->run_name, row_id, spot.name_len, spot.name, spot.num_bases );
+ else
+ rc = KOutMsg( ">%s.%li %li length=%u\n", fctx->run_name, row_id, row_id, spot.num_bases );
+
+ if ( rc == 0 )
+ rc = print_bases( spot.bases, spot.num_bases, fctx->max_line_len );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fasta_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( fctx->idx_read == INVALID_COLUMN )
+ {
+ /* we actually only need a READ-column, everything else name/splitting etc. is optional... */
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta-format: READ column not found" );
+ }
+ else
+ {
+ bool can_split = ( fctx->idx_read_start != INVALID_COLUMN && fctx->idx_read_len != INVALID_COLUMN );
+ if ( can_split )
+ {
+ bool has_type = ( fctx->idx_read_type != INVALID_COLUMN );
+ if ( has_type )
+ rc = vdb_fasta_frag_type_checked_loop( fctx );
+ else
+ rc = vdb_fasta_frag_no_type_check_loop( fctx );
+ }
+ else
+ rc = vdb_fasta_spot_loop( fctx );
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------- */
+
+static rc_t vdb_qual_frag_type_checked_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot.num_rd_start; ++idx )
+ {
+ uint32_t frag_len = spot.rd_len[ idx ];
+ if ( frag_len > 0 &&
+ ( ( spot.rd_type[ idx ] & READ_TYPE_BIOLOGICAL ) == READ_TYPE_BIOLOGICAL ) )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li.%d %.*s length=%u\n",
+ fctx->run_name, row_id, frag, spot.name_len, spot.name, frag_len );
+ else
+ rc = KOutMsg( ">%s.%li.%d %li length=%u\n",
+ fctx->run_name, row_id, frag, row_id, frag_len );
+
+ if ( rc == 0 )
+ rc = print_qual( &( spot.qual[ ofs ] ), frag_len, fctx->max_line_len );
+
+ frag++;
+ }
+ ofs += frag_len;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_qual_frag_no_type_check_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ uint32_t idx, frag, ofs;
+ for ( idx = 0, frag = 1, ofs = 0; rc == 0 && idx < spot.num_rd_start; ++idx )
+ {
+ uint32_t frag_len = spot.rd_len[ idx ];
+ if ( frag_len > 0 )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li.%d %.*s length=%u\n",
+ fctx->run_name, row_id, frag, spot.name_len, spot.name, frag_len );
+ else
+ rc = KOutMsg( ">%s.%li.%d %li length=%u\n",
+ fctx->run_name, row_id, frag, row_id, frag_len );
+
+ if ( rc == 0 )
+ rc = print_qual( &( spot.qual[ ofs ] ), frag_len, fctx->max_line_len );
+
+ frag++;
+ }
+ ofs += frag_len;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_qual_spot_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ bool has_name = ( fctx->idx_name != INVALID_COLUMN );
+ int64_t row_id;
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ if ( has_name )
+ rc = KOutMsg( ">%s.%li %.*s length=%u\n",
+ fctx->run_name, row_id, spot.name_len, spot.name, spot.num_qual );
+ else
+ rc = KOutMsg( ">%s.%li %li length=%u\n", fctx->run_name, row_id, row_id, spot.num_qual );
+
+ if ( rc == 0 )
+ rc = print_qual( spot.qual, spot.num_qual, fctx->max_line_len );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_qual_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( fctx->idx_qual == INVALID_COLUMN )
+ {
+ /* we actually only need a QUAL-column, everything else name/splitting etc. is optional... */
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta-format: READ column not found" );
+ }
+ else
+ {
+ bool can_split = ( fctx->idx_read_start != INVALID_COLUMN && fctx->idx_read_len != INVALID_COLUMN );
+ if ( can_split )
+ {
+ bool has_type = ( fctx->idx_read_type != INVALID_COLUMN );
+ if ( has_type )
+ rc = vdb_qual_frag_type_checked_loop( fctx );
+ else
+ rc = vdb_qual_frag_no_type_check_loop( fctx );
+ }
+ else
+ rc = vdb_qual_spot_loop( fctx );
+ }
+ return rc;
+}
+
+
+/* -------------------------------------------------------------------------------------------------------------- */
+
+static rc_t vdb_fasta_accumulated( const char * bases, uint32_t num_bases,
+ int32_t * chars_left_on_line, uint32_t max_line_len )
+{
+ rc_t rc = 0;
+ if ( num_bases < ( *chars_left_on_line ) )
+ {
+ rc = KOutMsg( "%.*s", num_bases, bases );
+ ( *chars_left_on_line ) -= num_bases;
+ }
+ else if ( num_bases == ( *chars_left_on_line ) )
+ {
+ rc = KOutMsg( "%.*s\n", num_bases, bases );
+ ( *chars_left_on_line ) = max_line_len;
+ }
+ else
+ {
+ uint32_t ofs = 0;
+ int32_t remaining = num_bases;
+ while( rc == 0 && ofs < num_bases )
+ {
+ if ( remaining >= ( *chars_left_on_line ) )
+ {
+ rc = KOutMsg( "%.*s\n", ( *chars_left_on_line ), &bases[ ofs ] );
+ ofs += ( *chars_left_on_line );
+ remaining -= ( *chars_left_on_line );
+ ( *chars_left_on_line ) = max_line_len;
+ }
+ else
+ {
+ rc = KOutMsg( "%.*s", remaining, &bases[ ofs ] );
+ ofs += remaining;
+ ( *chars_left_on_line ) -= remaining;
+ remaining = 0;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fasta1_loop( const fastq_ctx * fctx )
+{
+ rc_t rc;
+ if ( fctx->idx_read == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta1-format: READ column not found" );
+ }
+ else
+ {
+ int64_t row_id;
+ int32_t chars_left_on_line = fctx->max_line_len;
+
+ rc = KOutMsg( ">%s\n", fctx->run_name );
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ rc = vdb_fasta_accumulated( spot.bases, spot.num_bases, &chars_left_on_line, fctx->max_line_len );
+ }
+ }
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fasta2_loop( const fastq_ctx * fctx )
+{
+ rc_t rc = 0;
+ if ( fctx->idx_name == INVALID_COLUMN || fctx->idx_read == INVALID_COLUMN )
+ {
+ rc = RC( rcExe, rcNoTarg, rcConstructing, rcNoObj, rcInvalid );
+ DISP_RC( rc, "cannot generate fasta2-format: READ and/or NAME column not found" );
+ }
+ else
+ {
+ char last_name[ 1024 ];
+ size_t last_name_len = 0;
+ int64_t row_id;
+ int32_t chars_left_on_line = fctx->max_line_len;
+
+ while ( rc == 0 && num_gen_iterator_next( fctx->row_iter, &row_id, &rc ) )
+ {
+ if ( rc == 0 )
+ rc = Quitting();
+ if ( rc == 0 )
+ {
+ fastq_spot spot;
+ rc = read_spot( fctx, row_id, &spot );
+ if ( rc == 0 )
+ {
+ bool print_ref_name = ( last_name_len == 0 );
+ if ( !print_ref_name )
+ {
+ print_ref_name = ( last_name_len != spot.name_len );
+ if ( !print_ref_name )
+ print_ref_name = ( string_cmp( last_name, last_name_len, spot.name, spot.name_len, spot.name_len ) != 0 );
+ }
+
+ if ( print_ref_name )
+ {
+ if ( chars_left_on_line == fctx->max_line_len )
+ rc = KOutMsg( ">%.*s\n", spot.name_len, spot.name );
+ else
+ {
+ rc = KOutMsg( "\n>%.*s\n", spot.name_len, spot.name );
+ chars_left_on_line = fctx->max_line_len;
+ }
+ last_name_len = string_copy ( last_name, sizeof last_name, spot.name, spot.name_len );
+ }
+
+ if ( rc == 0 )
+ rc = vdb_fasta_accumulated( spot.bases, spot.num_bases, &chars_left_on_line, fctx->max_line_len );
+ }
+ }
+ }
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq_tbl( const p_dump_context ctx, fastq_ctx * fctx )
+{
+ rc_t rc = vdb_prepare_cursor( fctx );
+ DISP_RC( rc, "the table lacks READ and/or QUALITY column" );
+ if ( rc == 0 )
+ {
+ int64_t first;
+ uint64_t count;
+ /* READ is the colum we have in all cases... */
+ rc = VCursorIdRange( fctx->cursor, fctx->idx_read, &first, &count );
+ DISP_RC( rc, "VCursorIdRange() failed" );
+ if ( rc == 0 )
+ {
+ if ( count == 0 )
+ {
+ KOutMsg( "this table is empty\n" );
+ }
+ else
+ {
+ /* if the user did not specify a row-range, take all rows */
+ if ( ctx->rows == NULL )
+ {
+ rc = num_gen_make_from_range( &ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_make_from_range() failed" );
+ }
+ /* if the user did specify a row-range, check the boundaries */
+ else
+ {
+ rc = num_gen_trim( ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_trim() failed" );
+ }
+
+ if ( rc == 0 && !num_gen_empty( ctx->rows ) )
+ {
+ rc = num_gen_iterator_make( ctx->rows, &fctx->row_iter );
+ DISP_RC( rc, "num_gen_iterator_make() failed" );
+ if ( rc == 0 )
+ {
+ if ( fctx->max_line_len == 0 )
+ fctx->max_line_len = DEF_FASTA_LEN;
+
+ switch( fctx->format )
+ {
+ /* one FASTQ-record ( 4 liner ) per READ/SPOT */
+ case df_fastq : rc = vdb_fastq_loop( fctx ); /* <--- */
+ break;
+
+ /* one FASTQ-record ( 4 liner ) per FRAGMENT/ALIGNMENT */
+ case df_fastq1 : rc = vdb_fastq1_loop( fctx ); /* <--- */
+ break;
+
+ /* one FASTA-record ( 2 liner ) per READ/SPOT */
+ case df_fasta : rc = vdb_fasta_loop( fctx ); /* <--- */
+ break;
+
+ /* one FASTA-record ( many lines ) for the whole accession ( REFSEQ-accession ) */
+ case df_fasta1 : rc = vdb_fasta1_loop( fctx ); /* <--- */
+ break;
+
+ /* one FASTA-record ( many lines ) for each REFERENCE used in a cSRA-database */
+ case df_fasta2 : rc = vdb_fasta2_loop( fctx ); /* <--- */
+ break;
+
+ /* one QUAL-record ( 2 liner ) per whole READ/SPOT */
+ case df_qual : rc = vdb_qual_spot_loop( fctx ); /* <--- */
+ break;
+
+ /* one QUAL-record ( 2 liner ) per FRAGMENT/ALIGNMENTT */
+ case df_qual1 : rc = vdb_qual_loop( fctx ); /* <--- */
+ break;
+
+ default : break;
+ }
+ num_gen_iterator_destroy( fctx->row_iter );
+ }
+ }
+ else
+ rc = RC( rcExe, rcDatabase, rcReading, rcRange, rcEmpty );
+ }
+ }
+ VCursorRelease( fctx->cursor );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq_table( const p_dump_context ctx,
+ const VDBManager *mgr,
+ fastq_ctx * fctx )
+{
+ VSchema * schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( mgr, &schema, &(ctx->schema_list), true /* ctx->force_sra_schema */ );
+
+ rc = VDBManagerOpenTableRead( mgr, &fctx->tbl, schema, "%s", ctx->path );
+ DISP_RC( rc, "VDBManagerOpenTableRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdb_fastq_tbl( ctx, fctx );
+ VTableRelease( fctx->tbl );
+ }
+
+ if ( schema != NULL )
+ VSchemaRelease( schema );
+
+ return rc;
+}
+
+
+static rc_t vdb_fastq_database( const p_dump_context ctx,
+ const VDBManager *mgr,
+ fastq_ctx * fctx )
+{
+ const VDatabase * db;
+ VSchema *schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( mgr, &schema, &(ctx->schema_list), true /* ctx->force_sra_schema */ );
+
+ rc = VDBManagerOpenDBRead( mgr, &db, schema, "%s", ctx->path );
+ DISP_RC( rc, "VDBManagerOpenDBRead() failed" );
+ if ( rc == 0 )
+ {
+ bool table_defined = ( ctx->table != NULL );
+ if ( !table_defined )
+ table_defined = vdh_take_this_table_from_db( ctx, db, "SEQUENCE" );
+
+ if ( table_defined )
+ {
+ rc = VDatabaseOpenTableRead( db, &fctx->tbl, "%s", ctx->table );
+ DISP_RC( rc, "VDatabaseOpenTableRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdb_fastq_tbl( ctx, fctx );
+ VTableRelease( fctx->tbl );
+ }
+ }
+ else
+ {
+ LOGMSG( klogInfo, "opened as vdb-database, but no table found/defined" );
+ ctx->usage_requested = true;
+ }
+ VDatabaseRelease( db );
+ }
+
+ if ( schema != NULL )
+ VSchemaRelease( schema );
+ return rc;
+}
+
+
+static rc_t vdb_fastq_by_pathtype( const p_dump_context ctx,
+ const VDBManager *mgr,
+ fastq_ctx * fctx )
+{
+ rc_t rc;
+ int path_type = ( VDBManagerPathType ( mgr, "%s", ctx->path ) & ~ kptAlias );
+ /* types defined in <kdb/manager.h> */
+ switch ( path_type )
+ {
+ case kptDatabase : rc = vdb_fastq_database( ctx, mgr, fctx );
+ DISP_RC( rc, "dump_database() failed" );
+ break;
+
+ case kptPrereleaseTbl:
+ case kptTable : rc = vdb_fastq_table( ctx, mgr, fctx );
+ DISP_RC( rc, "dump_table() failed" );
+ break;
+
+ default : rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "the path '$(p)' cannot be opened as vdb-database or vdb-table",
+ "p=%s", ctx->path ) );
+ if ( vdco_schema_count( ctx ) == 0 )
+ {
+ LOGERR( klogInt, rc, "Maybe it is a legacy table. If so, specify a schema with the -S option" );
+ }
+ break;
+ }
+ return rc;
+}
+
+
+static rc_t vdb_fastq_by_probing( const p_dump_context ctx,
+ const VDBManager *mgr,
+ fastq_ctx * fctx )
+{
+ rc_t rc;
+ if ( vdh_is_path_database( mgr, ctx->path, &(ctx->schema_list) ) )
+ {
+ rc = vdb_fastq_database( ctx, mgr, fctx );
+ DISP_RC( rc, "dump_database() failed" );
+ }
+ else if ( vdh_is_path_table( mgr, ctx->path, &(ctx->schema_list) ) )
+ {
+ rc = vdb_fastq_table( ctx, mgr, fctx );
+ DISP_RC( rc, "dump_table() failed" );
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "the path '$(p)' cannot be opened as vdb-database or vdb-table",
+ "p=%s", ctx->path ) );
+ if ( vdco_schema_count( ctx ) == 0 )
+ {
+ LOGERR( klogInt, rc, "Maybe it is a legacy table. If so, specify a schema with the -S option" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t vdf_main( const p_dump_context ctx, const VDBManager * mgr, const char * acc_or_path )
+{
+ rc_t rc = 0;
+ fastq_ctx fctx;
+ init_fastq_ctx( ctx, &fctx, acc_or_path );
+ ctx->path = string_dup_measure ( acc_or_path, NULL );
+
+ if ( USE_PATHTYPE_TO_DETECT_DB_OR_TAB ) /* in vdb-dump-context.h */
+ rc = vdb_fastq_by_pathtype( ctx, mgr, &fctx );
+ else
+ rc = vdb_fastq_by_probing( ctx, mgr, &fctx );
+
+ free( ( char* )ctx->path );
+ free( ( void* )fctx.run_name );
+ ctx->path = NULL;
+
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-fastq.h b/tools/vdb-dump/vdb-dump-fastq.h
new file mode 100644
index 0000000..652718c
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-fastq.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_fastq_
+#define _h_vdb_dump_fastq_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include "vdb-dump-context.h"
+#include <vdb/manager.h>
+#include <kfs/directory.h>
+
+rc_t vdf_main( const p_dump_context ctx, const VDBManager * mgr, const char * acc_or_path );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-filter.c b/tools/vdb-dump/vdb-dump-filter.c
new file mode 100644
index 0000000..962f0e7
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-filter.c
@@ -0,0 +1,116 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-filter.h"
+#include <klib/text.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <os-native.h>
+#include <sysalloc.h>
+
+bool vdfi_make_filter( filter **flt, const char *expression )
+{
+ bool res = false;
+ if ( flt == NULL ) return res;
+ (*flt) = malloc( sizeof( flt ) );
+ if ( *flt )
+ {
+ (*flt)->expression = string_dup_measure( expression, NULL );
+ (*flt)->filter_type = filter_unknown;
+ res = true;
+ }
+ return res;
+}
+
+void vdfi_destroy_filter( p_filter flt )
+{
+ if ( flt == NULL ) return;
+ free( flt->expression );
+ free( flt );
+}
+
+bool vdfi_make( filters **flts )
+{
+ bool res = false;
+ if ( flts == NULL ) return res;
+ (*flts) = malloc( sizeof( filters ) );
+ if ( *flts )
+ {
+ VectorInit( &( (*flts)->filters ), 0, 5 );
+ (*flts)->match = false;
+ (*flts)->count = 0;
+ res = true;
+ }
+ return res;
+}
+
+static void CC vdfi_destroy_filter_1( void* node, void* data )
+{
+ vdfi_destroy_filter( (p_filter)node );
+}
+
+void vdfi_destroy( p_filters flts )
+{
+ if ( flts == NULL ) return;
+ VectorWhack( &(flts->filters), vdfi_destroy_filter_1, NULL );
+ free( flts );
+}
+
+bool vdfi_new_filter( p_filters flts, const char *expression )
+{
+ bool res = false;
+ filter *new_filter;
+ if ( flts == NULL ) return res;
+ if ( expression == NULL ) return res;
+ if ( expression[0] == 0 ) return res;
+ if ( vdfi_make_filter( &new_filter, expression ) )
+ {
+ res = ( VectorAppend( &(flts->filters), NULL, new_filter ) == 0 );
+ if ( res ) flts->count++;
+ }
+ return res;
+}
+
+void vdfi_reset( p_filters flts )
+{
+ if ( flts == NULL ) return;
+ flts->match = false;
+}
+
+bool vdfi_match( p_filters flts )
+{
+ if ( flts == NULL ) return false;
+ return flts->match;
+}
+
+uint16_t vdfi_count( p_filters flts )
+{
+ if ( flts == NULL ) return 0;
+ return flts->count;
+}
diff --git a/tools/vdb-dump/vdb-dump-filter.h b/tools/vdb-dump/vdb-dump-filter.h
new file mode 100644
index 0000000..47909fe
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-filter.h
@@ -0,0 +1,82 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_filter_
+#define _h_vdb_dump_filter_
+
+#include <klib/vector.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum filter_t
+{
+ filter_unknown,
+ filter_bool,
+ filter_integer,
+ filter_float,
+ filter_text
+} filter_t;
+
+/********************************************************************
+the dump_filter contains a filter expression for a column
+********************************************************************/
+typedef struct filter
+{
+ filter_t filter_type;
+ char *expression;
+} filter;
+typedef filter* p_filter;
+
+void filter_dosomething( p_filter flt );
+
+bool filter_make( filter **flt, const char *expression );
+void filter_destroy( p_filter flt );
+
+/********************************************************************
+the dump_filters is a vector of column_filters...
+********************************************************************/
+typedef struct filters
+{
+ Vector filters;
+ uint16_t count;
+ bool match;
+} filters;
+typedef filters* p_filters;
+
+bool vdfi_make( filters **flts );
+void vdfi_destroy( p_filters flts );
+bool vdfi_new_filter( p_filters flts, const char *expression );
+void vdfi_reset( p_filters flts );
+bool vdfi_match( p_filters flts );
+uint16_t vdfi_count( p_filters flts );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-formats.c b/tools/vdb-dump/vdb-dump-formats.c
new file mode 100644
index 0000000..5364a87
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-formats.c
@@ -0,0 +1,383 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-formats.h"
+#include <sysalloc.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#define DISP_RC(rc,err) if( rc != 0 ) LOGERR( klogInt, rc, err );
+
+/*************************************************************************************
+ default ( with line-length-limitation and pretty print )
+*************************************************************************************/
+static void CC vdfo_print_col_default( void *item, void *data )
+{
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+ rc_t rc;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc != 0 ) return;
+
+ if ( r_ctx->ctx->print_column_names )
+ {
+ rc = vds_append_fmt( &(r_ctx->s_col),
+ r_ctx->col_defs->max_colname_chars,
+ "%*s: ",
+ r_ctx->col_defs->max_colname_chars,
+ my_col_def->name );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ }
+
+ /* append the cell-content */
+ rc = vds_append_str( &(r_ctx->s_col), my_col_def->content.buf );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ if ( rc == 0 )
+ {
+
+ /* indent the cell-line, if requested */
+ if ( r_ctx->ctx->indented_line_len > 0 )
+ {
+ rc = vds_indent( &(r_ctx->s_col),
+ r_ctx->ctx->indented_line_len,
+ r_ctx->col_defs->max_colname_chars + 2 );
+ DISP_RC( rc, "dump_str_indent() failed" )
+ }
+
+ /* print a truncate-hint at the end of the line if truncated */
+ if ( vds_truncated( &(r_ctx->s_col) ) )
+ {
+ rc = vds_rinsert( &(r_ctx->s_col), " ..." );
+ DISP_RC( rc, "dump_str_rinsert() failed" )
+ }
+ }
+
+ /* FINALLY we print the content of a column... */
+ KOutMsg( "%s\n", r_ctx->s_col.buf );
+}
+
+static rc_t vdfo_print_row_default( const p_row_context r_ctx )
+{
+ rc_t rc = 0;
+ if ( r_ctx->ctx->print_row_id )
+ rc = KOutMsg( "ROW-ID = %u\n", r_ctx->row_id );
+
+ if ( rc == 0 )
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_default, r_ctx );
+
+ if ( rc == 0 && r_ctx->ctx->lf_after_row > 0 )
+ {
+ uint16_t i=0;
+ while ( i++ < r_ctx->ctx->lf_after_row && rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ return 0;
+}
+
+/*************************************************************************************
+ CSV
+*************************************************************************************/
+static void CC vdfo_print_col_csv( void *item, void *data )
+{
+ rc_t rc = 0;
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ if ( r_ctx->col_nr > 0 || r_ctx->ctx->print_row_id )
+ {
+ rc = vds_append_str( &(r_ctx->s_col), "," );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ if ( rc == 0 )
+ {
+ rc = vds_2_csv( &(my_col_def->content) );
+ DISP_RC( rc, "dump_str_2_csv() failed" )
+ if ( rc == 0 )
+ {
+ rc = vds_append_str( &(r_ctx->s_col), my_col_def->content.buf );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ r_ctx->col_nr++;
+ }
+ }
+}
+
+static rc_t vdfo_print_row_csv( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 && r_ctx->ctx->print_row_id )
+ rc = KOutMsg( "%u", r_ctx->row_id );
+
+ if ( rc == 0 )
+ {
+ r_ctx->col_nr = 0;
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_csv, r_ctx );
+ rc = KOutMsg( "%s\n", r_ctx->s_col.buf );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ XML
+*************************************************************************************/
+static void CC vdfo_print_col_xml( void *item, void *data )
+{
+ p_col_def my_col_def = (p_col_def)item;
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ KOutMsg( " <%s>\n", my_col_def->name );
+ KOutMsg( "%s", my_col_def->content.buf );
+ KOutMsg( " </%s>\n", my_col_def->name );
+}
+
+static rc_t vdfo_print_row_xml( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "<row>\n" );
+ if ( rc == 0 )
+ {
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_xml, r_ctx );
+ rc = KOutMsg( "</row>\n");
+ }
+ }
+ return rc;
+}
+
+
+/*************************************************************************************
+ JSON
+*************************************************************************************/
+static void CC vdfo_print_col_json( void *item, void *data )
+{
+ rc_t rc = 0;
+ p_col_def my_col_def = (p_col_def)item;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ if ( ( my_col_def->type_desc.domain == vtdAscii )||
+ ( my_col_def->type_desc.domain == vtdUnicode ) )
+ {
+ rc = vds_escape( &(my_col_def->content), '"', '\\' );
+ DISP_RC( rc, "dump_str_escape() failed" )
+ if ( rc == 0 )
+ {
+ rc = vds_enclose_string( &(my_col_def->content), '"', '"' );
+ DISP_RC( rc, "dump_str_enclose_string() failed" )
+ }
+ }
+ else
+ {
+ if ( my_col_def->type_desc.intrinsic_dim > 1 )
+ {
+ rc = vds_enclose_string( &(my_col_def->content), '[', ']' );
+ DISP_RC( rc, "dump_str_enclose_string() failed" )
+ }
+ }
+
+ if ( rc == 0 )
+ KOutMsg( ",\n\"%s\":%s", my_col_def->name, my_col_def->content.buf );
+}
+
+static rc_t vdfo_print_row_json( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "{\n" );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "\"row_id\": %lu", r_ctx->row_id );
+ if ( rc == 0 )
+ {
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_json, r_ctx );
+ rc = KOutMsg( "\n},\n\n" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+/*************************************************************************************
+ PIPED
+*************************************************************************************/
+static void CC vdfo_print_col_piped( void *item, void *data )
+{
+ rc_t rc = 0;
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ /* first we print the row_id and the column-name for every column! */
+ KOutMsg( "%lu, %s: ", r_ctx->row_id, my_col_def->name );
+
+ if ( ( my_col_def->type_desc.domain == vtdAscii )||
+ ( my_col_def->type_desc.domain == vtdUnicode ) )
+ {
+ rc = vds_escape( &(my_col_def->content), '"', '\\' );
+ DISP_RC( rc, "dump_str_escape() failed" )
+ if ( rc == 0 )
+ {
+ rc = vds_enclose_string( &(my_col_def->content), '"', '"' );
+ DISP_RC( rc, "dump_str_enclose_string() failed" )
+ }
+ }
+ else
+ {
+ if ( my_col_def->type_desc.intrinsic_dim > 1 )
+ {
+ rc = vds_enclose_string( &(my_col_def->content), '[', ']' );
+ DISP_RC( rc, "dump_str_enclose_string() failed" )
+ }
+ }
+
+ if ( rc == 0 )
+ KOutMsg( "%s\n", my_col_def->content.buf );
+}
+
+
+/*************************************************************************************
+ like legacy sra-dump
+*************************************************************************************/
+static void CC vdfo_print_col_sra_dump( void *item, void *data )
+{
+ rc_t rc = 0;
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ /* first we print the row_id and the column-name for every column! */
+ KOutMsg( "%lu. %s: ", r_ctx->row_id, my_col_def->name );
+
+ if ( rc == 0 )
+ KOutMsg( "%s\n", my_col_def->content.buf );
+}
+
+
+/*************************************************************************************
+ TAB-delimited
+*************************************************************************************/
+static void CC vdfo_print_col_tab( void *item, void *data )
+{
+ rc_t rc = 0;
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ if ( r_ctx->col_nr > 0 || r_ctx->ctx->print_row_id )
+ {
+ rc = vds_append_str( &(r_ctx->s_col), "\t" );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ if ( rc == 0 )
+ {
+ rc = vds_append_str( &(r_ctx->s_col), my_col_def->content.buf );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ r_ctx->col_nr++;
+ }
+}
+
+
+static rc_t vdfo_print_row_piped( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 )
+ {
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_piped, r_ctx );
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+
+static rc_t vdfo_print_row_sra_dump( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 )
+ {
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_sra_dump, r_ctx );
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+static rc_t vdfo_print_row_tab( const p_row_context r_ctx )
+{
+ rc_t rc = vds_clear( &(r_ctx->s_col) );
+ DISP_RC( rc, "dump_str_clear() failed" )
+ if ( rc == 0 && r_ctx->ctx->print_row_id )
+ rc = KOutMsg( "%u", r_ctx->row_id );
+
+ if ( rc == 0 )
+ {
+ r_ctx->col_nr = 0;
+ VectorForEach( &(r_ctx->col_defs->cols), false, vdfo_print_col_tab, r_ctx );
+ rc = KOutMsg( "%s\n", r_ctx->s_col.buf );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ print-format-switch
+*************************************************************************************/
+rc_t vdfo_print_row( const p_row_context r_ctx )
+{
+ rc_t rc = 0;
+ switch( r_ctx->ctx->format )
+ {
+ case df_default : rc = vdfo_print_row_default( r_ctx ); break;
+ case df_csv : rc = vdfo_print_row_csv( r_ctx ); break;
+ case df_xml : rc = vdfo_print_row_xml( r_ctx ); break;
+ case df_json : rc = vdfo_print_row_json( r_ctx ); break;
+ case df_piped : rc = vdfo_print_row_piped( r_ctx ); break;
+ case df_sra_dump : rc = vdfo_print_row_sra_dump( r_ctx ); break;
+ case df_tab : rc = vdfo_print_row_tab( r_ctx ); break;
+ default : rc = vdfo_print_row_default( r_ctx ); break;
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-formats.h b/tools/vdb-dump/vdb-dump-formats.h
new file mode 100644
index 0000000..34e12e5
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-formats.h
@@ -0,0 +1,51 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_formats_
+#define _h_vdb_dump_formats_
+
+#include <stdio.h>
+
+#include <klib/vector.h>
+#include <klib/rc.h>
+#include <klib/out.h>
+
+#include "vdb-dump-coldefs.h"
+#include "vdb-dump-context.h"
+#include "vdb-dump-row-context.h"
+#include "vdb-dump-str.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rc_t vdfo_print_row( const p_row_context r_ctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-helper.c b/tools/vdb-dump/vdb-dump-helper.c
new file mode 100644
index 0000000..5064405
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-helper.c
@@ -0,0 +1,772 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+#include <kfs/cacheteefile.h>
+
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+#include "vdb-dump-helper.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+
+rc_t ErrMsg( const char * fmt, ... )
+{
+ rc_t rc;
+ char buffer[ 4096 ];
+ size_t num_writ;
+
+ va_list list;
+ va_start( list, fmt );
+ rc = string_vprintf( buffer, sizeof buffer, &num_writ, fmt, list );
+ if ( rc == 0 )
+ rc = pLogMsg( klogErr, "$(E)", "E=%s", buffer );
+ va_end( list );
+ return rc;
+}
+
+/********************************************************************
+helper function to display the version of the vdb-manager
+********************************************************************/
+rc_t vdh_show_manager_version( const VDBManager *my_manager )
+{
+ uint32_t version;
+ rc_t rc = VDBManagerVersion( my_manager, &version );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerVersion() -> %R", rc );
+ else
+ {
+ PLOGMSG ( klogInfo, ( klogInfo, "manager-version = $(maj).$(min).$(rel)",
+ "vers=0x%X,maj=%u,min=%u,rel=%u",
+ version,
+ version >> 24,
+ ( version >> 16 ) & 0xFF,
+ version & 0xFFFF ));
+ }
+ return rc;
+}
+
+static void CC vdh_parse_1_schema( void *item, void *data )
+{
+ char *s = (char*)item;
+ VSchema *my_schema = (VSchema*)data;
+ if ( ( item != NULL )&&( my_schema != NULL ) )
+ {
+ rc_t rc = VSchemaParseFile( my_schema, "%s", s );
+ if ( rc != 0 )
+ ErrMsg( "VSchemaParseFile() -> %R", rc );
+ }
+}
+
+rc_t vdh_parse_schema( const VDBManager *my_manager,
+ VSchema **new_schema,
+ Vector *schema_list,
+ bool with_sra_schema )
+{
+ rc_t rc = 0;
+
+ if ( my_manager == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ if ( new_schema == NULL )
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+
+ *new_schema = NULL;
+
+ if ( with_sra_schema )
+ {
+ rc = VDBManagerMakeSRASchema( my_manager, new_schema );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerMakeSRASchema() -> %R", rc );
+ }
+
+ if ( ( rc == 0 )&&( schema_list != NULL ) )
+ {
+ if ( *new_schema == NULL )
+ {
+ rc = VDBManagerMakeSchema( my_manager, new_schema );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerMakeSchema() -> %R", rc );
+ }
+ if ( rc == 0 )
+ VectorForEach( schema_list, false, vdh_parse_1_schema, *new_schema );
+ }
+ return rc;
+}
+
+/********************************************************************
+helper function to test if a given path is a vdb-table
+********************************************************************/
+bool vdh_is_path_table( const VDBManager *my_manager, const char *path,
+ Vector *schema_list )
+{
+ bool res = false;
+ const VTable *my_table;
+ VSchema *my_schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( my_manager, &my_schema, schema_list, false );
+
+ rc = VDBManagerOpenTableRead( my_manager, &my_table, my_schema, "%s", path );
+ if ( rc == 0 )
+ {
+ res = true; /* yes we are able to open the table ---> path is a table */
+ VTableRelease( my_table );
+ }
+
+ if ( my_schema != NULL )
+ {
+ rc = VSchemaRelease( my_schema );
+ if ( rc != 0 )
+ ErrMsg( "VSchemaRelease() -> %R", rc );
+ }
+ return res;
+}
+
+
+const char * backback = "/../..";
+
+/********************************************************************
+helper function to test if a given path is a vdb-column
+by testing if the parent/parent dir is a vdb-table
+********************************************************************/
+bool vdh_is_path_column( const VDBManager *my_manager, const char *path,
+ Vector *schema_list )
+{
+ bool res = false;
+ size_t path_len = string_size( path );
+ char *pp_path = malloc( path_len + 20 );
+ if ( pp_path )
+ {
+ char *resolved = malloc( 1024 );
+ if ( resolved )
+ {
+ KDirectory *my_directory;
+ rc_t rc = KDirectoryNativeDir( &my_directory );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryNativeDir() -> %R", rc );
+ else
+ {
+ string_copy( pp_path, path_len + 20, path, path_len );
+ string_copy( &pp_path[ path_len ], 20, backback, string_size( backback ) );
+ rc = KDirectoryResolvePath( my_directory, true, resolved, 1023, "%s", pp_path );
+ if ( rc == 0 )
+ res = vdh_is_path_table( my_manager, resolved, schema_list );
+ }
+ free( resolved );
+ }
+ free( pp_path );
+ }
+ return res;
+}
+
+/********************************************************************
+helper function to test if a given path is a vdb-database
+********************************************************************/
+bool vdh_is_path_database( const VDBManager *my_manager, const char *path,
+ Vector *schema_list )
+{
+ bool res = false;
+ const VDatabase *my_database;
+ VSchema *my_schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( my_manager, &my_schema, schema_list, false );
+
+ rc = VDBManagerOpenDBRead( my_manager, &my_database, my_schema, "%s", path );
+ if ( rc == 0 )
+ {
+ res = true; /* yes we are able to open the database ---> path is a database */
+ rc = VDatabaseRelease( my_database );
+ if ( rc != 0 )
+ ErrMsg( "VDatabaseRelease() -> %R", rc );
+ }
+
+ if ( my_schema != NULL )
+ {
+ rc = VSchemaRelease( my_schema );
+ if ( rc != 0 )
+ ErrMsg( "VSchemaRelease() -> %R", rc );
+ }
+ return res;
+}
+
+
+/*************************************************************************************
+helper-function to extract the name of the first table of a database
+and put it into the dump-context
+*************************************************************************************/
+bool vdh_take_1st_table_from_db( dump_context *ctx, const KNamelist * tbl_names )
+{
+ bool we_found_a_table = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( tbl_names, &count );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistCount() -> %R", rc );
+ else if ( count > 0 )
+ {
+ const char *tbl_name;
+ rc = KNamelistGet( tbl_names, 0, &tbl_name );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistGet( 0 ) -> %R", rc );
+ else
+ {
+ vdco_set_table( ctx, tbl_name );
+ we_found_a_table = true;
+ }
+ }
+ return we_found_a_table;
+}
+
+/*
+static int vdh_str_cmp( const char *a, const char *b )
+{
+ size_t asize = string_size ( a );
+ size_t bsize = string_size ( b );
+ return strcase_cmp ( a, asize, b, bsize, ( asize > bsize ) ? asize : bsize );
+}
+*/
+
+static bool vdh_str_starts_with( const char *a, const char *b )
+{
+ bool res = false;
+ size_t asize = string_size ( a );
+ size_t bsize = string_size ( b );
+ if ( asize >= bsize )
+ {
+ int cmp = strcase_cmp ( a, bsize, b, bsize, bsize );
+ res = ( cmp == 0 );
+ }
+ return res;
+}
+
+
+bool list_contains_value( const KNamelist * list, const String * value )
+{
+ bool found = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( list, &count );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistCount() -> %R", rc );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0 && !found; ++i )
+ {
+ const char *s;
+ rc = KNamelistGet( list, i, &s );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistGet( %d ) -> %R", i, rc );
+ else
+ {
+ String item;
+ StringInitCString( &item, s );
+ found = ( StringCompare ( &item, value ) == 0 );
+ }
+ }
+ }
+ return found;
+}
+
+
+static bool list_contains_value_starting_with( const KNamelist * list, const String * value, String * found )
+{
+ bool res = false;
+ uint32_t count;
+ rc_t rc = KNamelistCount( list, &count );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistCount() -> %R", rc );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0 && !res; ++i )
+ {
+ const char *s;
+ rc = KNamelistGet( list, i, &s );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistGet( %d ) -> %R", i, rc );
+ else
+ {
+ String item;
+ StringInitCString( &item, s );
+ if ( value->len <= item.len )
+ {
+ item.len = value->len;
+ item.size = value->size;
+ res = ( StringCompare ( &item, value ) == 0 );
+ if ( res )
+ StringInitCString( found, s );
+ }
+ }
+ }
+ }
+ return res;
+}
+
+/*************************************************************************************
+helper-function to check if a given table is in the list of tables
+if found put that name into the dump-context
+*************************************************************************************/
+bool vdh_take_this_table_from_list( dump_context *ctx, const KNamelist * tbl_names,
+ const char * table_to_find )
+{
+ bool res = false;
+ String to_find;
+
+ StringInitCString( &to_find, table_to_find );
+ res = list_contains_value( tbl_names, &to_find );
+ if ( res )
+ vdco_set_table_String( ctx, &to_find );
+ else
+ {
+ String found;
+ res = list_contains_value_starting_with( tbl_names, &to_find, &found );
+ if ( res )
+ vdco_set_table_String( ctx, &found );
+ }
+ return res;
+}
+
+
+bool vdh_take_this_table_from_db( dump_context *ctx, const VDatabase * db,
+ const char * table_to_find )
+{
+ bool we_found_the_table = false;
+ KNamelist *tbl_names;
+ rc_t rc = VDatabaseListTbl( db, &tbl_names );
+ if ( rc != 0 )
+ ErrMsg( "VDatabaseListTbl() -> %R", rc );
+ else
+ {
+ we_found_the_table = vdh_take_this_table_from_list( ctx, tbl_names, table_to_find );
+ rc = KNamelistRelease( tbl_names );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistRelease() -> %R", rc );
+ }
+ return we_found_the_table;
+}
+
+
+const char * s_unknown_tab = "unknown table";
+
+static rc_t vdh_print_full_col_info( dump_context *ctx,
+ const p_col_def col_def,
+ const VSchema *my_schema )
+{
+ rc_t rc = 0;
+ char * s_domain = vdcd_make_domain_txt( col_def->type_desc.domain );
+ if ( s_domain != NULL )
+ {
+ if ( ctx->table == NULL )
+ {
+ ctx->table = string_dup_measure( s_unknown_tab, NULL ); /* will be free'd when ctx get free'd */
+ }
+
+ if ( ( ctx->table != NULL )&&( col_def->name != NULL ) )
+ {
+ rc = KOutMsg( "%s.%.02d : (%.3d bits [%.02d], %8s) %s",
+ ctx->table,
+ ctx->generic_idx++,
+ col_def->type_desc.intrinsic_bits,
+ col_def->type_desc.intrinsic_dim,
+ s_domain,
+ col_def->name );
+ if ( rc == 0 && my_schema )
+ {
+ char buf[64];
+ rc = VTypedeclToText( &(col_def->type_decl), my_schema, buf, sizeof( buf ) );
+ if ( rc != 0 )
+ ErrMsg( "VTypedeclToText() -> %R", rc );
+ else
+ rc = KOutMsg( "\n (%s)", buf );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ else
+ {
+ if ( ctx->table == NULL )
+ rc = KOutMsg( "error: no table-name in print_column_info()" );
+
+ if ( col_def->name == NULL )
+ rc = KOutMsg( "error: no column-name in print_column_info()" );
+
+ }
+ free( s_domain );
+ }
+ else
+ rc = KOutMsg( "error: making domain-text in print_column_info()" );
+
+ return rc;
+}
+
+
+static rc_t vdh_print_short_col_info( const p_col_def col_def,
+ const VSchema *my_schema )
+{
+ rc_t rc = 0;
+ if ( col_def->name != NULL )
+ {
+ rc = KOutMsg( "%s", col_def->name );
+ if ( rc == 0 && my_schema != NULL )
+ {
+ char buf[ 64 ];
+ rc = VTypedeclToText( &(col_def->type_decl), my_schema,
+ buf, sizeof(buf) );
+ if ( rc != 0 )
+ ErrMsg( "VTypedeclToText() -> %R", rc );
+ else
+ rc = KOutMsg( " (%s)", buf );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ return rc;
+}
+
+
+rc_t vdh_print_col_info( dump_context *ctx,
+ const p_col_def col_def,
+ const VSchema *my_schema )
+{
+ rc_t rc = 0;
+ if ( ctx != NULL && col_def != NULL )
+ {
+ if ( ctx->column_enum_requested )
+ rc = vdh_print_full_col_info( ctx, col_def, my_schema );
+ else
+ rc = vdh_print_short_col_info( col_def, my_schema );
+ }
+ return rc;
+}
+
+rc_t resolve_remote_accession( const char * accession, char * dst, size_t dst_size )
+{
+ VFSManager * vfs_mgr;
+ rc_t rc = VFSManagerMake( &vfs_mgr );
+ dst[ 0 ] = 0;
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMake() -> %R", rc );
+ else
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerGetResolver() -> %R", rc );
+ else
+ {
+ VPath * vpath;
+ rc = VFSManagerMakePath( vfs_mgr, &vpath, "ncbi-acc:%s", accession );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMakePath( %s ) -> %R", accession, rc );
+ else
+ {
+ const VPath * remote = NULL;
+ VResolverRemoteEnable( resolver, vrAlwaysEnable );
+ rc = VResolverQuery ( resolver, 0, vpath, NULL, &remote, NULL );
+ if ( rc == 0 && remote != NULL )
+ {
+ const String * path;
+ rc = VPathMakeString( remote, &path );
+
+ if ( rc == 0 && path != NULL )
+ {
+ string_copy ( dst, dst_size, path->addr, path->size );
+ dst[ path->size ] = 0;
+ StringWhack ( path );
+ }
+ if ( remote != NULL )
+ VPathRelease ( remote );
+ }
+ VPathRelease ( vpath );
+ }
+ VResolverRelease( resolver );
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+
+ if ( rc == 0 && vdh_str_starts_with( dst, "ncbi-acc:" ) )
+ {
+ size_t l = string_size ( dst );
+ memmove( dst, &( dst[ 9 ] ), l - 9 );
+ dst[ l - 9 ] = 0;
+ }
+ return rc;
+}
+
+rc_t resolve_accession( const char * accession, char * dst, size_t dst_size, bool remotely )
+{
+ VFSManager * vfs_mgr;
+ rc_t rc = VFSManagerMake( &vfs_mgr );
+ dst[ 0 ] = 0;
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMake() -> %R", rc );
+ else
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerGetResolver() -> %R", rc );
+ else
+ {
+ VPath * vpath;
+ rc = VFSManagerMakePath( vfs_mgr, &vpath, "ncbi-acc:%s", accession );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMakePath( %s ) -> %R", accession, rc );
+ else
+ {
+ const VPath * local = NULL;
+ const VPath * remote = NULL;
+ if ( remotely )
+ rc = VResolverQuery ( resolver, 0, vpath, &local, &remote, NULL );
+ else
+ rc = VResolverQuery ( resolver, 0, vpath, &local, NULL, NULL );
+ if ( rc == 0 && ( local != NULL || remote != NULL ) )
+ {
+ const String * path;
+ if ( local != NULL )
+ rc = VPathMakeString( local, &path );
+ else
+ rc = VPathMakeString( remote, &path );
+
+ if ( rc == 0 && path != NULL )
+ {
+ string_copy ( dst, dst_size, path->addr, path->size );
+ dst[ path->size ] = 0;
+ StringWhack ( path );
+ }
+
+ if ( local != NULL )
+ VPathRelease ( local );
+ if ( remote != NULL )
+ VPathRelease ( remote );
+ }
+ VPathRelease ( vpath );
+ }
+ VResolverRelease( resolver );
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+
+ if ( rc == 0 && vdh_str_starts_with( dst, "ncbi-acc:" ) )
+ {
+ size_t l = string_size ( dst );
+ memmove( dst, &( dst[ 9 ] ), l - 9 );
+ dst[ l - 9 ] = 0;
+ }
+ return rc;
+}
+
+
+rc_t resolve_cache( const char * accession, char * dst, size_t dst_size )
+{
+ VFSManager * vfs_mgr;
+ rc_t rc = VFSManagerMake( &vfs_mgr );
+ dst[ 0 ] = 0;
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMake() -> %R", rc );
+ else
+ {
+ VResolver * resolver;
+ rc = VFSManagerGetResolver( vfs_mgr, &resolver );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerGetResolver() -> %R", rc );
+ else
+ {
+ VPath * vpath;
+ rc = VFSManagerMakePath( vfs_mgr, &vpath, "ncbi-acc:%s", accession );
+ if ( rc != 0 )
+ ErrMsg( "VFSManagerMakePath( %s ) -> %R", accession, rc );
+ else
+ {
+ const VPath * local = NULL;
+ const VPath * remote = NULL;
+ const VPath * cache = NULL;
+ rc = VResolverQuery ( resolver, 0, vpath, &local, &remote, &cache );
+ if ( rc == 0 && cache != NULL )
+ {
+ const String * path;
+ rc = VPathMakeString( cache, &path );
+
+ if ( rc == 0 && path != NULL )
+ {
+ string_copy ( dst, dst_size, path->addr, path->size );
+ dst[ path->size ] = 0;
+ StringWhack ( path );
+ }
+
+ if ( local != NULL )
+ VPathRelease ( local );
+ if ( remote != NULL )
+ VPathRelease ( remote );
+ if ( remote != NULL )
+ VPathRelease ( cache );
+ }
+ VPathRelease ( vpath );
+ }
+ VResolverRelease( resolver );
+ }
+ VFSManagerRelease ( vfs_mgr );
+ }
+ return rc;
+}
+
+
+rc_t check_cache_comleteness( const char * path, float * percent, uint64_t * bytes_in_cache )
+{
+ rc_t rc = 0;
+ if ( percent != NULL ) { ( * percent ) = 0.0; }
+ if ( bytes_in_cache != NULL ) { ( * bytes_in_cache ) = 0; }
+ if ( path != NULL && path[ 0 ] != 0 )
+ {
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryNativeDir() -> %R", rc);
+ else
+ {
+ const KFile * f = NULL;
+ rc = KDirectoryOpenFileRead( dir, &f, "%s.cache", path );
+ if ( rc == 0 )
+ rc = GetCacheCompleteness( f, percent, bytes_in_cache );
+ else
+ {
+ rc = KDirectoryOpenFileRead( dir, &f, "%s", path );
+ if ( rc == 0 )
+ {
+ if ( percent != NULL ) ( * percent ) = 100.0;
+ if ( bytes_in_cache != NULL ) rc = KFileSize ( f, bytes_in_cache );
+ }
+ }
+ if ( f != NULL ) KFileRelease( f );
+ KDirectoryRelease( dir );
+ }
+ }
+ return rc;
+}
+
+
+static bool matches( const String * cmd, const String * pattern )
+{
+ char buffer[ 256 ];
+ String match;
+ uint32_t matching;
+
+ StringInit( &match, buffer, sizeof buffer, 0 );
+ matching = StringMatch( &match, cmd, pattern );
+ return ( matching == pattern->len && matching == cmd->len );
+}
+
+
+int32_t index_of_match( const String * word, uint32_t num, ... )
+{
+ int32_t res = -1;
+ if ( word != NULL )
+ {
+ uint32_t idx;
+ va_list args;
+
+ va_start ( args, num );
+ for ( idx = 0; idx < num && res < 0; ++idx )
+ {
+ const char * arg = va_arg ( args, const char * );
+ if ( arg != NULL )
+ {
+ String S;
+ StringInitCString( &S, arg );
+ if ( matches( word, &S ) ) res = idx;
+ }
+ }
+ va_end ( args );
+ }
+ return res;
+}
+
+
+static void CC destroy_String( void * item, void * data ) { free( item ); }
+void destroy_String_vector( Vector * v ) { VectorWhack( v, destroy_String, NULL ); }
+
+uint32_t copy_String_2_vector( Vector * v, const String * S )
+{
+ uint32_t res = 0;
+ if ( S->len > 0 && S->addr != NULL )
+ {
+ String * S1 = malloc( sizeof * S1 );
+ if ( S1 != NULL )
+ {
+ rc_t rc;
+ StringInit( S1, S->addr, S->size, S->len );
+ rc = VectorAppend( v, NULL, S1 );
+ if ( rc == 0 ) res++; else free( S1 );
+ }
+ }
+ return res;
+}
+
+
+uint32_t split_buffer( Vector * v, const String * S, const char * delim )
+{
+ uint32_t i, res = 0;
+ size_t delim_len = string_size( delim );
+ String temp;
+
+ StringInit( &temp, NULL, 0, 0 );
+ VectorInit( v, 0, 10 );
+ for( i = 0; i < S->len; ++i )
+ {
+ if ( string_chr( delim, delim_len, S->addr[ i ] ) != NULL )
+ {
+ /* delimiter found */
+ res += copy_String_2_vector( v, &temp );
+ StringInit( &temp, NULL, 0, 0 );
+ }
+ else
+ {
+ /* normal char in line */
+ if ( temp.addr == NULL ) temp.addr = &( S->addr[ i ] );
+ temp.size++;
+ temp.len++;
+ }
+ }
+ res += copy_String_2_vector( v, &temp );
+ return res;
+}
diff --git a/tools/vdb-dump/vdb-dump-helper.h b/tools/vdb-dump/vdb-dump-helper.h
new file mode 100644
index 0000000..da456b0
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-helper.h
@@ -0,0 +1,107 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_helper_
+#define _h_vdb_dump_helper_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/vector.h>
+#include <klib/text.h>
+
+#include <vfs/manager.h>
+#include <vfs/path.h>
+#include <vfs/resolver.h>
+
+#include <vdb/manager.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+#include <vdb/schema.h>
+
+#include <sra/sraschema.h>
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-coldefs.h"
+
+#define DISP_RC(rc,err) (void)((rc == 0) ? 0 : LOGERR( klogInt, rc, err ))
+
+#define DISP_RC2(rc,err,succ) \
+ (void)((rc != 0)? 0 : (succ) ? LOGMSG( klogInfo, succ ) : LOGERR( klogInt, rc, err ))
+
+rc_t ErrMsg( const char * fmt, ... );
+
+rc_t vdh_show_manager_version( const VDBManager *my_manager );
+
+rc_t vdh_parse_schema( const VDBManager *my_manager,
+ VSchema **new_schema,
+ Vector *schema_list,
+ bool with_sra_schema );
+
+bool vdh_is_path_table( const VDBManager *my_manager, const char *path,
+ Vector *schema_list );
+bool vdh_is_path_column( const VDBManager *my_manager, const char *path,
+ Vector *schema_list );
+bool vdh_is_path_database( const VDBManager *my_manager, const char *path,
+ Vector *schema_list );
+
+bool list_contains_value( const KNamelist * list, const String * value );
+
+bool vdh_take_1st_table_from_db( dump_context *ctx, const KNamelist *tbl_names );
+
+bool vdh_take_this_table_from_list( dump_context *ctx, const KNamelist *tbl_names,
+ const char * table_to_find );
+
+bool vdh_take_this_table_from_db( dump_context *ctx, const VDatabase *db,
+ const char * table_to_find );
+
+rc_t vdh_print_col_info( dump_context *ctx,
+ const p_col_def col_def,
+ const VSchema *my_schema );
+
+rc_t resolve_remote_accession( const char * accession, char * dst, size_t dst_size );
+rc_t resolve_accession( const char * accession, char * dst, size_t dst_size, bool remotely );
+rc_t resolve_cache( const char * accession, char * dst, size_t dst_size );
+rc_t check_cache_comleteness( const char * path, float * percent, uint64_t * bytes_in_cache );
+
+int32_t index_of_match( const String * word, uint32_t num, ... );
+void destroy_String_vector( Vector * v );
+uint32_t copy_String_2_vector( Vector * v, const String * S );
+uint32_t split_buffer( Vector * v, const String * S, const char * delim );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-interact.c b/tools/vdb-dump/vdb-dump-interact.c
new file mode 100644
index 0000000..f2be0c0
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-interact.c
@@ -0,0 +1,265 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-interact.h"
+#include "vdb-dump-repo.h"
+#include "vdb-dump-helper.h"
+#include "vdb-dump-print.h"
+
+#include <klib/vector.h>
+#include <klib/text.h>
+#include <kfs/file.h>
+#include <kfs/filetools.h>
+
+rc_t Quitting();
+
+#define INPUTLINE_SIZE 4096
+
+typedef struct ictx
+{
+ const dump_context * ctx;
+ const Args * args;
+ const KFile * std_in;
+ struct vdp_src_context * vsctx;
+ Vector history;
+ char inputline[ INPUTLINE_SIZE ];
+ String PROMPT;
+ String SInputLine;
+
+ bool interactive, done;
+} ictx;
+
+
+static rc_t init_ictx( struct ictx * ictx, const dump_context * ctx, const Args * args )
+{
+ rc_t rc = KFileMakeStdIn ( &( ictx->std_in ) );
+ DISP_RC( rc, "KFileMakeStdIn() failed" );
+ if ( rc == 0 )
+ {
+ ictx->ctx = ctx;
+ ictx->args = args;
+ VectorInit( &ictx->history, 0, 10 );
+ ictx->interactive = ( KFileType ( ictx->std_in ) == kfdCharDev );
+ ictx->done = false;
+
+ CONST_STRING( &(ictx->PROMPT), "\nvdb $" );
+ StringInit( &(ictx->SInputLine), &( ictx->inputline[0] ), sizeof( ictx->inputline ), 0 );
+
+ rc = vdp_init_ctx( &ictx->vsctx, args );
+ }
+ return rc;
+}
+
+
+static void release_ictx( ictx * ctx )
+{
+ destroy_String_vector( &ctx->history );
+ KFileRelease( ctx->std_in );
+ vdp_release_ctx( ctx->vsctx );
+}
+
+
+static rc_t vdi_test( const Vector * v )
+{
+ rc_t rc = 0;
+ uint32_t start = VectorStart( v );
+ uint32_t len = VectorLength( v );
+ uint32_t idx;
+ for ( idx = start; rc == 0 && idx < ( start + len ); ++idx )
+ rc = KOutMsg( "{%S} ", VectorGet( v, idx ) );
+ return rc;
+}
+
+
+static rc_t vdi_top_help()
+{
+ rc_t rc = KOutMsg( "help:\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "quit / exit : terminate program\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "help [cmd] : print help [ for this topic ]\n" );
+ if ( rc == 0 )
+ rc = KOutMsg( "repo : manage repositories\n" );
+ return rc;
+}
+
+
+static rc_t vdi_help_on_help()
+{
+ rc_t rc = KOutMsg( "help: [help]\n" );
+ return rc;
+}
+
+static rc_t vdi_help_on_repo()
+{
+ rc_t rc = KOutMsg( "help: [repo]\n" );
+ return rc;
+}
+
+static rc_t vdi_help_on_print()
+{
+ rc_t rc = KOutMsg( "help: [print]\n" );
+ return rc;
+}
+
+static rc_t vdi_help( const Vector * v )
+{
+ rc_t rc = 0;
+ if ( VectorLength( v ) < 2 )
+ rc = vdi_top_help();
+ else
+ {
+ int32_t cmd_idx = index_of_match( VectorGet( v, 1 ), 2,
+ "help", "repo", "print" );
+ switch( cmd_idx )
+ {
+ case 0 : rc = vdi_help_on_help(); break;
+ case 1 : rc = vdi_help_on_repo(); break;
+ case 2 : rc = vdi_help_on_print(); break;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_on_newline( ictx * ctx, const String * Line )
+{
+ rc_t rc = 0;
+ Vector v;
+ uint32_t args = split_buffer( &v, Line, " \t" ); /* from vdb-dump-helper.c */
+ if ( args > 0 )
+ {
+ const String * S = VectorGet( &v, 0 );
+ if ( S != NULL )
+ {
+ int32_t cmd_idx = index_of_match( S, 6,
+ "quit", "exit", "help", "repo", "test", "print" );
+
+ ctx->done = ( cmd_idx == 0 || cmd_idx == 1 );
+ if ( !ctx->done )
+ {
+ switch( cmd_idx )
+ {
+ case 2 : rc = vdi_help( &v ); break; /* above */
+ case 3 : rc = vdi_repo( &v ); break; /* in vdb-dump-repo */
+ case 4 : rc = vdi_test( &v ); break;
+ case 5 : rc = vdp_print_interactive( &v, ctx->vsctx ); break; /* in vdb-dump-print */
+ default : rc = KOutMsg( "??? {%S}", S ); break;
+ }
+ if ( rc == 0 )
+ {
+ if ( ctx->interactive )
+ rc = KOutMsg( "%S", &( ctx->PROMPT ) );
+ else
+ rc = KOutMsg( "\n" );
+ }
+ }
+ }
+ }
+ destroy_String_vector( &v ); /* from vdb-dump-helper.c */
+ return rc;
+}
+
+
+static rc_t vdi_on_char( ictx * ctx, const char c )
+{
+ rc_t rc = 0;
+ if ( ctx->SInputLine.len < ( ( ctx->SInputLine.size ) - 1 ) )
+ {
+ ctx->inputline[ ctx->SInputLine.len++ ] = c;
+ }
+ else
+ {
+ rc = KOutMsg( "\ntoo long!%s", &( ctx->PROMPT ) );
+ ctx->SInputLine.len = 0;
+ }
+ return rc;
+}
+
+
+static rc_t vdi_interactive_newline( ictx * ctx )
+{
+ rc_t rc = vdi_on_newline( ctx, &(ctx->SInputLine) );
+ copy_String_2_vector( &(ctx->history), &(ctx->SInputLine) );
+ ctx->SInputLine.len = 0;
+ return rc;
+}
+
+
+static rc_t vdi_interactive_loop( ictx * ctx )
+{
+ char cc[ 4 ];
+ uint64_t pos = 0;
+ rc_t rc = KOutMsg( "%S", &( ctx->PROMPT ) );
+
+ while ( rc == 0 && !ctx->done && ( 0 == Quitting() ) )
+ {
+ size_t num_read;
+ rc = KFileRead( ctx->std_in, pos, cc, 1, &num_read );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "failed to read stdin" );
+ else if ( num_read > 0 )
+ {
+ pos += num_read;
+ switch( cc[ 0 ] )
+ {
+ case '\n' : rc = vdi_interactive_newline( ctx ); break;
+ default : rc = vdi_on_char( ctx, cc[ 0 ] ); break;
+ }
+ }
+ }
+ if ( rc == 0 ) rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t on_line( const String * line, void * data )
+{
+ rc_t rc = Quitting();
+ if ( rc == 0 )
+ {
+ ictx * ctx = data;
+ rc = vdi_on_newline( ctx, line );
+ }
+ return rc;
+}
+
+
+rc_t vdi_main( const dump_context * ctx, const Args * args )
+{
+ ictx ictx;
+ rc_t rc = init_ictx( &ictx, ctx, args );
+ if ( rc == 0 )
+ {
+ if ( ictx.interactive )
+ rc = vdi_interactive_loop( &ictx );
+ else
+ rc = ProcessFileLineByLine( ictx.std_in, on_line, &ictx ); /* from kfs/filetools.h */
+
+ release_ictx( &ictx );
+ }
+ return rc;
+}
\ No newline at end of file
diff --git a/tools/vdb-dump/vdb-dump-interact.h b/tools/vdb-dump/vdb-dump-interact.h
new file mode 100644
index 0000000..88f777b
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-interact.h
@@ -0,0 +1,50 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_interact_
+#define _h_vdb_dump_interact_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+
+#include <kapp/args.h>
+#include <klib/rc.h>
+#include <klib/text.h>
+
+#include "vdb-dump-context.h"
+
+rc_t vdi_main( const dump_context * ctx, const Args * args );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-print.c b/tools/vdb-dump/vdb-dump-print.c
new file mode 100644
index 0000000..0288dae
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-print.c
@@ -0,0 +1,1349 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-print.h"
+#include "vdb-dump-helper.h"
+
+#include <klib/rc.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/pack.h>
+#include <klib/num-gen.h>
+
+#include <kfs/directory.h>
+
+#include <kdb/manager.h>
+
+#include <vdb/cursor.h>
+#include <vdb/table.h>
+#include <vdb/database.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <bitstr.h>
+
+typedef struct vdp_context
+{
+ const void * base;
+ const VTypedesc * type_desc;
+ vdp_opts * opts;
+ char * buf;
+ size_t buf_size;
+ size_t printed_so_far;
+ bool buf_filled;
+
+ uint32_t elem_idx;
+ uint32_t elem_bits;
+ uint32_t boff;
+ uint32_t row_len;
+ int32_t selection;
+ uint64_t offset_in_bits;
+ bool print_dna_bases;
+} vdp_context;
+
+
+static rc_t vdp_print( vdp_context * vdp_ctx, const char * fmt, ... )
+{
+ rc_t rc = 0;
+ if ( vdp_ctx->buf_size > vdp_ctx->printed_so_far )
+ {
+ va_list args;
+ size_t num_writ;
+ size_t available = ( vdp_ctx->buf_size - vdp_ctx->printed_so_far );
+
+ va_start ( args, fmt );
+ rc = string_vprintf( &( vdp_ctx->buf[ vdp_ctx->printed_so_far ]), available, &num_writ, fmt, args );
+ vdp_ctx->printed_so_far += num_writ;
+ va_end ( args );
+ }
+
+ if ( vdp_ctx->buf_size <= vdp_ctx->printed_so_far )
+ vdp_ctx->buf_filled = true;
+ return rc;
+}
+
+
+static rc_t vdp_print_string( vdp_context * vdp_ctx, const char * s )
+{
+ rc_t rc = 0;
+ if ( vdp_ctx->buf == NULL )
+ {
+ rc = KOutMsg( s );
+ }
+ else
+ {
+ if ( vdp_ctx->buf_size > vdp_ctx->printed_so_far )
+ {
+ size_t num_writ;
+ size_t available = ( vdp_ctx->buf_size - vdp_ctx->printed_so_far );
+
+ rc = string_printf ( &( vdp_ctx->buf[ vdp_ctx->printed_so_far ] ), available, &num_writ, s );
+ vdp_ctx->printed_so_far += num_writ;
+ }
+
+ if ( vdp_ctx->buf_size <= vdp_ctx->printed_so_far )
+ vdp_ctx->buf_filled = true;
+ }
+ return rc;
+}
+
+typedef rc_t( * vdp_fkt )( vdp_context * vdp_ctx );
+
+
+#define BYTE_OFFSET(VALUE) ( (VALUE) >> 3 )
+#define BIT_OFFSET(VALUE) ( (VALUE) & 0x7 )
+
+
+static uint8_t BitLength2Bytes[65] =
+{
+ /* 0 1 2 3 4 5 6 7 8 9*/
+ /* 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ /* 1 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+ /* 2 */ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+ /* 3 */ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ /* 4 */ 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ /* 5 */ 7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
+ /* 6 */ 8, 8, 8, 8, 8
+};
+
+/*************************************************************************************
+n_bits [IN] ... number of bits
+
+calculates the number of bytes that have to be copied to contain the given
+number of bits
+*************************************************************************************/
+static uint16_t vdp_bitlength_2_bytes( const size_t n_bits )
+{
+ if ( n_bits > 64 )
+ return 8;
+ else
+ return BitLength2Bytes[ n_bits ];
+}
+
+
+static uint64_t BitLength2Mask[33] =
+{
+ /* 0 */ 0x00,
+ /* 1 .. 4 */ 0x1, 0x3, 0x7, 0xF,
+ /* 5 .. 8 */ 0x1F, 0x3F, 0x7F, 0xFF,
+ /* 9 .. 12 */ 0x1FF, 0x3FF, 0x7FF, 0xFFF,
+ /*13 .. 16 */ 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF,
+ /*17 .. 20 */ 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF,
+ /*21 .. 24 */ 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF,
+ /*25 .. 28 */ 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF,
+ /*29 .. 32 */ 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
+ };
+
+
+/*************************************************************************************
+n_bits [IN] ... number of bits
+
+creates a bitmask to mask exactly the given number of bits from a longer value
+*************************************************************************************/
+static uint64_t vdp_bitlength_2_mask( const size_t n_bits )
+{
+ uint64_t res;
+ if ( n_bits < 33 )
+ res = BitLength2Mask[ n_bits ];
+ else
+ {
+ if ( n_bits < 65 )
+ res = BitLength2Mask[ n_bits-32 ];
+ else
+ res = 0xFFFFFFFF;
+ res <<= 32;
+ res |= 0xFFFFFFFF;
+ }
+ return res;
+}
+
+
+static void vdp_move_to_value( void* dst, vdp_context * vdp_ctx, const uint32_t n_bits )
+{
+ uint8_t *src_ptr = ( uint8_t * )vdp_ctx->base + BYTE_OFFSET( vdp_ctx->offset_in_bits );
+ if ( BIT_OFFSET( vdp_ctx->offset_in_bits ) == 0 )
+ {
+ memmove( dst, src_ptr, vdp_bitlength_2_bytes( n_bits ) );
+ }
+ else
+ {
+ bitcpy ( dst, 0, src_ptr, BIT_OFFSET( vdp_ctx->offset_in_bits ), n_bits );
+ }
+}
+
+
+static uint64_t vdp_move_to_uint64( vdp_context * vdp_ctx )
+{
+ uint64_t value = 0;
+ uint32_t n_bits = vdp_ctx->type_desc->intrinsic_bits;
+ vdp_move_to_value( &value, vdp_ctx, n_bits );
+ if ( n_bits & 7 )
+ {
+ size_t unpacked = 0;
+ Unpack( n_bits, sizeof( value ), &value, 0, n_bits, NULL, &value, sizeof( value ), &unpacked );
+ }
+ value &= vdp_bitlength_2_mask( n_bits );
+ vdp_ctx->offset_in_bits += n_bits;
+ return value;
+}
+
+static rc_t vdp_boolean( vdp_context * vdp_ctx )
+{
+ rc_t rc;
+ uint64_t value = vdp_move_to_uint64( vdp_ctx );
+ switch( vdp_ctx->opts->c_boolean )
+ {
+ case '1' : if ( value == 0 )
+ rc = vdp_print_string( vdp_ctx, "0" );
+ else
+ rc = vdp_print_string( vdp_ctx, "1" );
+ break;
+ case 'T' : if ( value == 0 )
+ rc = vdp_print_string( vdp_ctx, "F" );
+ else
+ rc = vdp_print_string( vdp_ctx, "T" );
+ break;
+
+ default : if ( value == 0 )
+ rc = vdp_print_string( vdp_ctx, "false" );
+ else
+ rc = vdp_print_string( vdp_ctx, "true" );
+ break;
+ }
+ return rc;
+}
+
+
+static const char * uint_hex_fmt = "0x%lX";
+static const char * uint_dec_fmt = "%lu";
+static const char * int_dec_fmt = "%ld";
+
+
+static rc_t vdp_print_uint64( vdp_context * vdp_ctx, const char * fmt, uint64_t value )
+{
+ if ( vdp_ctx->buf == NULL )
+ return KOutMsg( fmt, value );
+ else
+ return vdp_print( vdp_ctx, fmt, value );
+}
+
+static rc_t vdp_print_int64( vdp_context * vdp_ctx, const char * fmt, int64_t value )
+{
+ if ( vdp_ctx->buf == NULL )
+ return KOutMsg( fmt, value );
+ else
+ return vdp_print( vdp_ctx, fmt, value );
+}
+
+static rc_t vdp_uint( vdp_context * vdp_ctx )
+{
+ rc_t rc = 0;
+ uint64_t value = vdp_move_to_uint64( vdp_ctx );
+ if ( ( vdp_ctx->opts->translate_sra_types )/*&&( def->value_trans_fct != NULL )*/ )
+ {
+/*
+ const char *txt = def->value_trans_fct( (uint32_t)value );
+ rc = vds_append_str( s, txt );
+*/
+ }
+ else
+ {
+ rc = vdp_print_uint64( vdp_ctx,
+ vdp_ctx->opts->in_hex ? uint_hex_fmt : uint_dec_fmt,
+ value ) ;
+ }
+ return rc;
+}
+
+
+static rc_t vdp_int( vdp_context * vdp_ctx )
+{
+ rc_t rc = 0;
+ int64_t value = (int64_t)vdp_move_to_uint64( vdp_ctx );
+ if ( ( vdp_ctx->opts->translate_sra_types )/*&&( def->value_trans_fct != NULL )*/ )
+ {
+/*
+ const char *txt = def->value_trans_fct( (uint32_t)value );
+ rc = vds_append_str( s, txt );
+*/
+ }
+ else
+ {
+ switch ( vdp_ctx->type_desc->intrinsic_bits )
+ {
+ case 8 : { int8_t temp = (int8_t)value;
+ value = temp; }
+ break;
+ case 16 : { int16_t temp = (int16_t)value;
+ value = temp; }
+ break;
+ case 32 : { int32_t temp = (int32_t)value;
+ value = temp; }
+ break;
+ }
+ rc = vdp_print_int64( vdp_ctx,
+ vdp_ctx->opts->in_hex ? uint_hex_fmt : int_dec_fmt,
+ value ) ;
+ }
+ return rc;
+}
+
+
+#define BITSIZE_OF_FLOAT ( sizeof(float) * 8 )
+#define BITSIZE_OF_DOUBLE ( sizeof(double) * 8 )
+static const char * float_fmt = "%e";
+static const char * unknown_float_fmt = "unknown float-type";
+
+static rc_t vdp_float( vdp_context * vdp_ctx )
+{
+ rc_t rc;
+ if ( vdp_ctx->opts->in_hex )
+ rc = vdp_int( vdp_ctx );
+ else
+ {
+ uint32_t n_bits = vdp_ctx->type_desc->intrinsic_bits;
+ if ( n_bits == BITSIZE_OF_FLOAT )
+ {
+ float value;
+ vdp_move_to_value( &value, vdp_ctx, n_bits );
+ if ( vdp_ctx->buf == NULL )
+ rc = KOutMsg( float_fmt, value );
+ else
+ rc = vdp_print( vdp_ctx, float_fmt, value );
+ }
+ else if ( n_bits == BITSIZE_OF_DOUBLE )
+ {
+ double value;
+ vdp_move_to_value( &value, vdp_ctx, n_bits );
+ if ( vdp_ctx->buf == NULL )
+ rc = KOutMsg( float_fmt, value );
+ else
+ rc = vdp_print( vdp_ctx, float_fmt, value );
+ }
+ else
+ rc = vdp_print_string( vdp_ctx, unknown_float_fmt );
+
+ vdp_ctx->offset_in_bits += n_bits;
+ }
+ return rc;
+}
+
+
+static const char * txt_fmt = "%.*s";
+
+static rc_t vdp_txt_ascii( vdp_context * vdp_ctx )
+{
+ rc_t rc;
+ char *src_ptr = (char*)vdp_ctx->base + BYTE_OFFSET( vdp_ctx->offset_in_bits );
+ if ( vdp_ctx->buf == NULL )
+ rc = KOutMsg( txt_fmt, vdp_ctx->row_len, src_ptr );
+ else
+ rc = vdp_print( vdp_ctx, txt_fmt, vdp_ctx->row_len, src_ptr );
+ return rc;
+}
+
+
+static rc_t vdp_hex_char( char * temp, uint32_t * idx, const uint8_t c )
+{
+ char s[ 8 ];
+ size_t num_writ;
+ rc_t rc = string_printf ( s, sizeof s, &num_writ, "%X ", c );
+ if ( rc == 0 )
+ {
+ size_t i;
+ for ( i = 0; i < num_writ; ++i )
+ temp[ (*idx)++ ] = s[ i ];
+ }
+ return rc;
+}
+
+
+static rc_t vdp_hex_ascii( vdp_context * vdp_ctx )
+{
+ rc_t rc = 0;
+ char *src_ptr = (char*)vdp_ctx->base + BYTE_OFFSET( vdp_ctx->offset_in_bits );
+ char *tmp = malloc( ( vdp_ctx->row_len + 1 ) * 4 );
+ if ( tmp != NULL )
+ {
+ uint32_t i, dst_idx = 0;
+ for ( i = 0; i < vdp_ctx->row_len && rc == 0; ++i )
+ rc = vdp_hex_char( tmp, &dst_idx, src_ptr[ i ] );
+ tmp[ dst_idx ] = 0;
+ if ( rc == 0 )
+ {
+ if ( vdp_ctx->buf == NULL )
+ rc = KOutMsg( txt_fmt, dst_idx, tmp );
+ else
+ rc = vdp_print( vdp_ctx, txt_fmt, dst_idx, tmp );
+ }
+ free( tmp );
+ }
+ else
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ return rc;
+}
+
+
+static rc_t vdp_ascii( vdp_context * vdp_ctx )
+{
+ rc_t rc;
+
+ if ( vdp_ctx->opts->in_hex )
+ rc = vdp_hex_ascii( vdp_ctx );
+ else
+ rc = vdp_txt_ascii( vdp_ctx );
+
+ if ( rc == 0 )
+ {
+ vdp_ctx->elem_idx += vdp_ctx->row_len;
+ vdp_ctx->offset_in_bits += ( vdp_ctx->type_desc->intrinsic_bits * vdp_ctx->row_len );
+ }
+ return rc;
+}
+
+
+static rc_t vdp_unicode( vdp_context * vdp_ctx )
+{
+ return vdp_ascii( vdp_ctx );
+}
+
+
+/* !!!!!!!! this depends on how domains are defined in "schema.h" */
+vdp_fkt vdp_dispatch[] =
+{
+ vdp_boolean,
+ vdp_uint,
+ vdp_int,
+ vdp_float,
+ vdp_ascii,
+ vdp_unicode
+};
+
+static rc_t vdp_print_dim( vdp_context * vdp_ctx, uint32_t dimension, uint32_t selection )
+{
+ rc_t rc = 0;
+ int i = 0;
+ bool print_comma = true;
+
+ if ( selection == 0 ) /* cell-type == boolean */
+ {
+ /* if long form "false" or "true" separate elements by comma */
+ print_comma = ( vdp_ctx->opts->c_boolean == 0 );
+ }
+
+ while ( ( i < dimension )&&( rc == 0 ) )
+ {
+ /* selection 0 ... boolean */
+ if ( print_comma && ( i > 0 ) )
+ rc = vdp_print( vdp_ctx, ", " );
+
+ if ( rc == 0 )
+ rc = vdp_dispatch[ selection ]( vdp_ctx );
+
+ i++;
+ }
+ return rc;
+}
+
+
+static char dna_chars[ 4 ] = { 'A', 'C', 'G', 'T' };
+
+/* special function to translate dim=2,bits=1 into a DNA-base */
+static rc_t vdp_print_1_base( vdp_context * vdp_ctx )
+{
+ uint64_t value;
+ vdp_move_to_value( &value, vdp_ctx, 2 ); /* move 2 bits into value */
+ value &= 3;
+ if ( vdp_ctx->buf == NULL )
+ return KOutMsg( "%c", dna_chars[ value ] );
+ else
+ return vdp_print( vdp_ctx, "%c", dna_chars[ value ] );
+}
+
+static rc_t vdp_print_elem( vdp_context * vdp_ctx )
+{
+ rc_t rc = 0;
+
+ uint32_t dimension = vdp_ctx->type_desc->intrinsic_dim;
+ uint32_t selection = vdp_ctx->type_desc->domain - 1;
+
+ if ( dimension == 1 )
+ {
+ /* we have only 1 dimension ---> just print this value */
+ if ( selection < 6 )
+ rc = vdp_dispatch[ selection ]( vdp_ctx );
+ }
+ else
+ {
+ /* we have more than 1 dimension ---> repeat printing value's */
+ if ( vdp_ctx->print_dna_bases )
+ rc = vdp_print_1_base( vdp_ctx );
+ else
+ {
+ /*
+ bool trans = ( ( vdp_ctx->opts->without_sra_types == false )&&
+ ( def->dim_trans_fct ) );
+ bool paren = ( ( src->number_of_elements > 1 )||( !trans ) );
+ */
+ bool paren = ( vdp_ctx->row_len > 1 );
+
+ if ( paren )
+ rc = vdp_print( vdp_ctx, "[" );
+ /* rc = vds_append_str( &(def->content), bracket ? "[" : "{" ); */
+
+ if ( rc == 0 )
+ {
+ /*
+ if ( trans )
+ rc = vdt_dump_dim_trans( src, def, dimension );
+ else
+ */
+ rc = vdp_print_dim( vdp_ctx, dimension, selection );
+ }
+
+ if ( paren && ( rc == 0 ) )
+ rc = vdp_print( vdp_ctx, "]" );
+ }
+ }
+ return rc;
+}
+
+
+rc_t vdp_print_cell_cmn( char * buf, size_t buf_size, size_t *num_written,
+ const uint32_t elem_bits, const void * base, uint32_t boff, uint32_t row_len,
+ const VTypedesc * type_desc, vdp_opts * opts )
+{
+ rc_t rc = 0;
+ vdp_context vdp_ctx;
+ vdp_ctx.selection = ( type_desc->domain - 1 );
+ if ( vdp_ctx.selection < 0 ||
+ vdp_ctx.selection > ( sizeof vdp_dispatch / sizeof vdp_dispatch[ 0 ] ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcVisiting, rcOffset, rcInvalid );
+ }
+ else
+ {
+ vdp_ctx.base = base;
+ vdp_ctx.opts = opts;
+ vdp_ctx.type_desc = type_desc;
+ vdp_ctx.elem_bits = elem_bits;
+ vdp_ctx.boff = boff;
+ vdp_ctx.row_len = row_len;
+ vdp_ctx.elem_idx = 0;
+
+ vdp_ctx.buf = buf;
+ vdp_ctx.buf_size = buf_size;
+ vdp_ctx.printed_so_far = 0;
+ vdp_ctx.buf_filled = false;
+ vdp_ctx.offset_in_bits = 0;
+
+ if ( ( type_desc->domain < vtdBool ) || ( type_desc->domain > vtdUnicode ) )
+ rc = vdp_print_string( &vdp_ctx, "unknown data-type" );
+ else
+ {
+ bool print_comma = true;
+
+ /* hardcoded printing of dna-bases if the column-type fits */
+ vdp_ctx.print_dna_bases = ( opts->print_dna_bases &
+ ( type_desc->intrinsic_dim == 2 ) &
+ ( type_desc->intrinsic_bits == 1 ) );
+
+ if ( ( type_desc->domain == vtdBool ) && opts->c_boolean )
+ print_comma = false;
+
+ while( ( vdp_ctx.elem_idx < row_len ) && ( rc == 0 ) && ( !vdp_ctx.buf_filled ) )
+ {
+ uint32_t eidx = vdp_ctx.elem_idx;
+
+ if ( ( eidx > 0 ) && ( vdp_ctx.print_dna_bases == false ) && print_comma )
+ rc = vdp_print_string( &vdp_ctx, ", " );
+
+ /* dumps the basic data-types, implementation above
+ >>> that means it appends or prints to stdout the element-string
+ inc the vdb_ctx.element_idx by: 1...bool/int/uint/float
+ n...string/unicode-string */
+ rc = vdp_print_elem( &vdp_ctx );
+
+ /* insurance against endless loop */
+ if ( eidx == vdp_ctx.elem_idx )
+ vdp_ctx.elem_idx++;
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t vdp_print_cell_2_buffer( char * buffer, size_t bufsize, size_t *num_written,
+ const uint32_t elem_bits, const void * base, uint32_t boff, uint32_t row_len,
+ const VTypedesc * type_desc, vdp_opts * opts )
+{
+ rc_t rc = 0;
+
+ if ( base == NULL || type_desc == NULL || buffer == NULL || opts == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcVisiting, rcParam, rcNull );
+ }
+ else
+ {
+ rc = vdp_print_cell_cmn( buffer, bufsize, num_written, elem_bits, base, boff, row_len, type_desc, opts );
+ }
+ return rc;
+}
+
+
+rc_t vdp_print_cell( const uint32_t elem_bits, const void * base, uint32_t boff, uint32_t row_len,
+ const VTypedesc * type_desc, vdp_opts * opts )
+{
+ rc_t rc = 0;
+
+ if ( base == NULL || type_desc == NULL || opts == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcVisiting, rcParam, rcNull );
+ KOutMsg( "base/type_desc/otps is NULL\n" );
+ }
+ else
+ rc = vdp_print_cell_cmn( NULL, 0, NULL, elem_bits, base, boff, row_len, type_desc, opts );
+ return rc;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+
+
+/* -----------------------------------------------------------------------------------------------*/
+
+typedef struct vdp_src_context
+{
+ KDirectory *dir;
+ const VDBManager *mgr;
+ VSchema *schema;
+ Vector sources;
+ bool print_info;
+ vdp_opts opts;
+} vdp_src_context;
+
+
+typedef struct vdp_database
+{
+ const String * name;
+ const VDatabase *database;
+ Vector sub_databases;
+ Vector sub_tables;
+ vdp_opts * opts;
+} vdp_database;
+
+typedef struct vdp_table
+{
+ const String * name;
+ const VTable *table;
+ const VCursor *cursor;
+ vdp_opts * opts;
+ Vector columns;
+ uint32_t max_col_name_len;
+} vdp_table;
+
+
+typedef struct vdp_column
+{
+ const String * name;
+ uint32_t id;
+ vdp_table * tab;
+ struct VTypedecl type;
+ struct VTypedesc desc;
+} vdp_column;
+
+
+typedef struct vdp_source
+{
+ const String * path;
+ int path_type;
+ vdp_table * tbl;
+ vdp_database * db;
+ vdp_opts * opts;
+} vdp_source;
+
+
+/* -----------------------------------------------------------------------------------------------*/
+
+static void CC release_column( void *item, void * data )
+{
+ vdp_column * c = ( vdp_column * )item;
+ if ( c != NULL )
+ StringWhack ( c->name );
+ free( item );
+}
+
+static rc_t vdp_add_column( vdp_table * tbl, const String * name, bool print_info )
+{
+ rc_t rc = 0;
+ vdp_column * col = malloc( sizeof * col );
+ if ( col == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ KOutMsg( "vdp_add_column( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ rc = StringCopy( &col->name, name );
+ if ( rc != 0 )
+ {
+ free( ( void * ) col );
+ KOutMsg( "StringCopy( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ col->tab = tbl;
+ if ( name->len > tbl->max_col_name_len ) tbl->max_col_name_len = name->len;
+ rc = VCursorAddColumn( tbl->cursor, &col->id, "%s", name->addr );
+ if ( rc != 0 )
+ KOutMsg( "VCursorAddColumn( '%S.%S' ) -> %R\n", tbl->name, name, rc );
+ else
+ rc = VectorAppend( &tbl->columns, NULL, col );
+
+ if ( rc != 0 )
+ release_column( col, NULL );
+ else if ( print_info )
+ KOutMsg( "column: '%S.%S' added\n", tbl->name, name );
+ }
+ }
+ return rc;
+}
+
+static rc_t vdp_get_column_type( vdp_table * tbl, vdp_column * col )
+{
+ rc_t rc = VCursorDatatype( tbl->cursor, col->id, &col->type, &col->desc );
+ if ( rc != 0 )
+ KOutMsg( "VCursorDatatype( '%S.%S' ) -> %R\n", tbl->name, col->name, rc );
+ return rc;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+
+static void CC release_table( void *item, void * data )
+{
+ vdp_table * tbl = ( vdp_table * ) item;
+ if ( tbl != NULL )
+ {
+ VectorWhack( &tbl->columns, release_column, NULL );
+ StringWhack ( tbl->name );
+ VCursorRelease( tbl->cursor );
+ VTableRelease ( tbl->table );
+ free( item );
+ }
+}
+
+/* we can open a table from an accession or from a database... */
+static rc_t vdp_open_table( vdp_src_context * vctx,
+ vdp_source * acc, vdp_database * parent_db, const String * name )
+{
+ rc_t rc = 0;
+ vdp_table * tbl = malloc( sizeof * tbl );
+ if ( tbl == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ KOutMsg( "vdp_open_table( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ rc = StringCopy( &tbl->name, name );
+ if ( rc != 0 )
+ {
+ free( ( void * ) tbl );
+ KOutMsg( "StringCopy( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ tbl->opts = &vctx->opts;
+ VectorInit( &tbl->columns, 0, 20 );
+ tbl->max_col_name_len = 0;
+
+ /* open the table: either from manager or from database */
+ if ( acc != NULL )
+ rc = VDBManagerOpenTableRead( vctx->mgr, &tbl->table, vctx->schema, "%s", name->addr );
+ else
+ rc = VDatabaseOpenTableRead( parent_db->database, &tbl->table, "%s", name->addr );
+
+ /* enumerate columns, create cursor, add columns */
+ if ( rc == 0 )
+ {
+ rc = VTableCreateCursorRead( tbl->table, &tbl->cursor );
+ if ( rc == 0 )
+ {
+ KNamelist * column_names;
+ rc = VTableListCol( tbl->table, &column_names );
+ if ( rc == 0 )
+ {
+ uint32_t count, idx;
+ rc = KNamelistCount( column_names, &count );
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * column_name;
+ rc = KNamelistGet( column_names, idx, &column_name );
+ if ( rc == 0 && column_name != NULL )
+ {
+ String temp_str;
+ StringInitCString( &temp_str, column_name );
+ rc = vdp_add_column( tbl, &temp_str, vctx->print_info );
+ }
+ }
+ KNamelistRelease( column_names );
+ }
+ rc = VCursorOpen( tbl->cursor );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* update the type for each column */
+ uint32_t start = VectorStart( &tbl->columns );
+ uint32_t count = VectorLength( &tbl->columns );
+ uint32_t id = start;
+ while ( id < start + count - 1 && rc == 0 )
+ {
+ vdp_column * column = VectorGet( &tbl->columns, id );
+ if ( column != NULL )
+ rc = vdp_get_column_type( tbl, column );
+ id++;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* enter the new object: either into source-struct or parent-db */
+ if ( acc != NULL )
+ acc->tbl = tbl;
+ else
+ rc = VectorAppend( &parent_db->sub_tables, NULL, tbl );
+ }
+
+ if ( rc != 0 )
+ release_table( tbl, NULL );
+ else if ( vctx->print_info )
+ KOutMsg( "table: '%S' opened\n", name );
+
+ }
+ }
+ return rc;
+}
+
+static rc_t vdp_table_adjust_ranges( vdp_table * tbl, struct num_gen * ranges )
+{
+ rc_t rc = 0;
+ if ( tbl == NULL || ranges == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ else
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange( tbl->cursor, 0, &first, &count );
+ if ( rc != 0 )
+ KOutMsg( "VCursorIdRange( %S ) -> %R\n", tbl->name, rc );
+ else
+ {
+ if ( num_gen_empty( ranges ) )
+ {
+ rc = num_gen_add( ranges, first, count );
+ if ( rc != 0 )
+ KOutMsg( "tbl '%S' : num_gen_add( %d, %d ) -> %R\n", tbl->name, first, count, rc );
+ }
+ else
+ {
+ rc = num_gen_trim( ranges, first, count );
+ if ( rc != 0 )
+ KOutMsg( "tbl '%S' : num_gen_trim( %d, %d ) -> %R\n", tbl->name, first, count, rc );
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdp_print_table_row( vdp_table * tbl, int64_t row_id )
+{
+ rc_t rc = 0;
+ uint32_t start = VectorStart( &tbl->columns );
+ uint32_t count = VectorLength( &tbl->columns );
+ uint32_t id = start;
+
+ /* rc = KOutMsg( "row#%ld:\n", row_id ); */
+ while ( id < start + count - 1 && rc == 0 )
+ {
+ vdp_column * column = VectorGet( &tbl->columns, id );
+ if ( column != NULL )
+ {
+ uint32_t w = tbl->max_col_name_len + 1 - column->name->len;
+ rc = KOutMsg( "%S:%*s", column->name, w, " " );
+ if ( rc == 0 )
+ {
+ uint32_t elem_bits, boff, row_len;
+ const void * base;
+ rc = VCursorCellDataDirect( tbl->cursor, row_id, column->id,
+ &elem_bits, &base, &boff, &row_len );
+ if ( rc != 0 )
+ KOutMsg( "VCursorCellDataDirect( tbl: '%s', row: %ld, col: '%s' ) -> %R\n",
+ tbl->name, row_id, column->name, rc );
+ else
+ {
+ if ( rc == 0 && base != NULL )
+ {
+ rc = vdp_print_cell( elem_bits, base, boff, row_len, &column->desc, tbl->opts );
+ }
+ /*
+ KOutMsg( "elem_bits=%d, base=%p boff=%d, row_len=%d, desc=%p, opts=%p\n",
+ elem_bits, base, boff, row_len, &column->desc, tbl->opts );
+ */
+ }
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ }
+ id++;
+ }
+ return rc;
+}
+
+static rc_t vdp_print_table( vdp_table * tbl, struct num_gen * ranges )
+{
+ const struct num_gen_iter * iter;
+ rc_t rc = num_gen_iterator_make( ranges, &iter );
+ if ( rc != 0 )
+ KOutMsg( "num_gen_iterator_make() -> %R", rc );
+ else
+ {
+ int64_t row_id;
+ while ( num_gen_iterator_next( iter, &row_id, &rc ) && rc == 0 )
+ rc = vdp_print_table_row( tbl, row_id );
+
+ num_gen_iterator_destroy( iter );
+ }
+ return rc;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+
+static void CC release_database( void *item, void * data )
+{
+ vdp_database * db = ( vdp_database * ) item;
+ if ( db != NULL )
+ {
+ StringWhack( db->name );
+ VectorWhack( &db->sub_tables, release_table, NULL );
+ VectorWhack( &db->sub_databases, release_database, NULL ); /* !! recursion */
+ VDatabaseRelease( db->database );
+ free( item );
+ }
+}
+
+/* we can open a database from an accession or from a database... */
+static rc_t vdp_open_database( vdp_src_context * vctx,
+ vdp_source * acc, vdp_database * parent_db, const String * name )
+{
+ rc_t rc = 0;
+ vdp_database * db = malloc( sizeof * db );
+ if ( db == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ KOutMsg( "vdp_open_database( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ rc = StringCopy( &db->name, name );
+ if ( rc != 0 )
+ {
+ free( ( void * ) db );
+ KOutMsg( "string_dup_measure( '%S' ) -> %R\n", name, rc );
+ }
+ else
+ {
+ VectorInit( &db->sub_databases, 0, 5 );
+ VectorInit( &db->sub_tables, 0, 5 );
+ db->opts = &vctx->opts;
+
+ /* open the table: either from manager or from database */
+ if ( acc != NULL )
+ rc = VDBManagerOpenDBRead( vctx->mgr, &db->database, vctx->schema, "%s", name->addr );
+ else
+ rc = VDatabaseOpenDBRead( parent_db->database, &db->database, "%s", name->addr );
+
+ /* enumerate tables, open tables */
+ if ( rc == 0 )
+ {
+ KNamelist * table_names;
+ rc_t rc1 = VDatabaseListTbl( db->database, &table_names );
+ if ( rc1 == 0 )
+ {
+ uint32_t count, idx;
+ rc = KNamelistCount( table_names, &count );
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * table_name;
+ rc = KNamelistGet( table_names, idx, &table_name );
+ if ( rc == 0 && table_name != NULL )
+ {
+ String temp_str;
+ StringInitCString( &temp_str, table_name );
+ rc = vdp_open_table( vctx, NULL, db, &temp_str );
+ }
+ }
+ KNamelistRelease( table_names );
+ }
+ }
+
+ /* enumerate sub-db's, open sub-db's */
+ if ( rc == 0 )
+ {
+ KNamelist * sub_db_names;
+ rc_t rc1 = VDatabaseListDB( db->database, &sub_db_names );
+ if ( rc1 == 0 )
+ {
+ uint32_t count, idx;
+ rc = KNamelistCount( sub_db_names, &count );
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * sub_db_name;
+ rc = KNamelistGet( sub_db_names, idx, &sub_db_name );
+ if ( rc == 0 && sub_db_name != NULL )
+ {
+ String temp_str;
+ StringInitCString( &temp_str, sub_db_name );
+ rc = vdp_open_database( vctx, NULL, db, &temp_str ); /* !! recursion !! */
+ }
+ }
+ KNamelistRelease( sub_db_names );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ /* enter the new object: either into source-struct or parent-db */
+ if ( acc != NULL )
+ acc->db = db;
+ else
+ rc = VectorAppend( &parent_db->sub_databases, NULL, db );
+ }
+
+ if ( rc != 0 )
+ release_database( db, NULL );
+ else if ( vctx->print_info )
+ KOutMsg( "database: '%S' opened\n", name );
+ }
+ }
+ return rc;
+}
+
+/*
+KLIB_EXTERN void* CC VectorFind ( const Vector *self, const void *key, uint32_t *idx,
+ int64_t ( CC * cmp ) ( const void *key, const void *n ) );
+*/
+static int64_t CC vdp_db_find_table( const void *key, const void * n )
+{
+ const String * to_find = key;
+ const vdp_table * tbl = n;
+ return StringCompare( to_find, tbl->name );
+}
+
+static const char * DFLT_TABLE = "SEQUENCE";
+
+static vdp_table * vdp_db_get_table( vdp_database * db, const String * path )
+{
+ vdp_table * res = NULL;
+ if ( db != NULL )
+ {
+ if ( path == NULL || path->len == 0 )
+ {
+ String tmp;
+ tmp.addr = DFLT_TABLE;
+ tmp.size = tmp.len = sizeof DFLT_TABLE;
+ res = vdp_db_get_table( db, &tmp ); /* recursion */
+ if ( res == NULL )
+ res = VectorGet( &db->sub_tables, 0 );
+ }
+ else
+ {
+ uint32_t found;
+ res = VectorFind( &db->sub_tables, path, &found, vdp_db_find_table );
+ }
+ }
+ return res;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+
+static void CC release_source( void *item, void * data )
+{
+ vdp_source * vsrc = ( vdp_source * )item;
+ if ( vsrc != NULL )
+ {
+ if ( vsrc->tbl != NULL ) release_table( vsrc->tbl, NULL );
+ if ( vsrc->db != NULL ) release_database( vsrc->db, NULL );
+ StringWhack ( vsrc->path );
+ free( ( void * ) item );
+ }
+}
+
+static rc_t vdp_init_source( vdp_src_context * vctx, const String * path )
+{
+ rc_t rc = 0;
+ vdp_source * vsrc = malloc( sizeof * vsrc );
+ if ( vsrc == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ KOutMsg( "vdp_init_source( '%S' ) -> %R\n", path, rc );
+ }
+ else
+ {
+ rc = StringCopy ( &vsrc->path, path );
+ if ( rc != 0 )
+ {
+ free( ( void * ) vsrc );
+ KOutMsg( "StringCopy( '%S' ) -> %R\n", path, rc );
+ }
+ else
+ {
+ vsrc->path_type = ( VDBManagerPathType ( vctx->mgr, "%s", vsrc->path->addr ) & ~ kptAlias );
+ vsrc->tbl = NULL;
+ vsrc->db = NULL;
+ vsrc->opts = &vctx->opts;
+ /* types defined in <kdb/manager.h> */
+ switch ( vsrc->path_type )
+ {
+ case kptDatabase : rc = vdp_open_database( vctx, vsrc, NULL, vsrc->path ); break;
+ case kptPrereleaseTbl:
+ case kptTable : rc = vdp_open_table( vctx, vsrc, NULL, vsrc->path ); break;
+ default : rc = RC( rcVDB, rcNoTarg, rcConstructing, rcFormat, rcUnknown ); break;
+ }
+
+ if ( rc != 0 )
+ KOutMsg( "cannot open source '%S' -> %R\n", path, rc );
+ else
+ rc = VectorAppend( &vctx->sources, NULL, vsrc );
+
+ if ( rc == 0 && vctx->print_info )
+ KOutMsg( "source '%S' opened\n", path );
+ }
+ }
+ return rc;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+
+rc_t vdp_release_ctx( vdp_src_context * vctx )
+{
+ rc_t rc = 0;
+ if ( vctx != NULL )
+ {
+ /* release all sources */
+ VectorWhack( &vctx->sources, release_source, NULL );
+ if ( vctx->dir != NULL )
+ rc = KDirectoryRelease( vctx->dir );
+ if ( rc == 0 && vctx->mgr != NULL )
+ rc = VDBManagerRelease( vctx->mgr );
+ if ( rc == 0 && vctx->schema != NULL )
+ rc = VSchemaRelease( vctx->schema );
+ }
+ return rc;
+}
+
+rc_t vdp_init_ctx( vdp_src_context ** vctx, const Args * args )
+{
+ rc_t rc = 0;
+ if ( vctx == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ KOutMsg( "vdp_init_ctx() -> %R\n", rc );
+
+ }
+ else
+ {
+ vdp_src_context * o = malloc( sizeof *o );
+ if ( o == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ KOutMsg( "vdp_init_ctx() -> %R\n", rc );
+ }
+ else
+ {
+ VectorInit( &o->sources, 0, 5 );
+ o->schema = NULL;
+ o->print_info = false;
+ o->opts.print_dna_bases = false;
+ o->opts.in_hex = false;
+ o->opts.translate_sra_types = false;
+ o->opts.c_boolean = '1';
+
+ rc = KDirectoryNativeDir( &o->dir );
+ if ( rc != 0 )
+ {
+ KOutMsg( "KDirectoryNativeDir() -> %R\n", rc );
+ o->dir = NULL;
+ }
+ else
+ {
+ rc = VDBManagerMakeRead ( &o->mgr, o->dir );
+ if ( rc != 0 )
+ {
+ KOutMsg( "VDBManagerMakeRead() -> %R\n", rc );
+ o->mgr = NULL;
+ }
+ else
+ {
+ uint32_t count, idx;
+ vdh_parse_schema( o->mgr, &o->schema, NULL, true /*ctx->force_sra_schema*/ );
+ rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ KOutMsg( "ArgsParamCount() -> %R\n", rc );
+ else for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char *arg = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&arg );
+ if ( rc != 0 )
+ KOutMsg( "ArgsParamValue() -> %R\n", rc );
+ else if ( arg != NULL && arg[ 0 ] != 0 )
+ {
+ String temp_str;
+ StringInitCString( &temp_str, arg );
+ rc = vdp_init_source( o, &temp_str );
+ }
+ }
+ }
+ }
+ if ( rc == 0 )
+ *vctx = o;
+ else
+ vdp_release_ctx( o );
+ }
+ }
+ return rc;
+}
+
+
+static vdp_table * vdp_get_table( vdp_src_context * vctx, uint32_t src_id, String * path )
+{
+ vdp_table * res = NULL;
+ if ( vctx != NULL )
+ {
+ vdp_source * src = VectorGet( &vctx->sources, src_id );
+ if ( src != NULL )
+ {
+ if ( src->tbl != NULL )
+ res = src->tbl; /* source has only this table */
+ else if ( src->db != NULL )
+ res = vdp_db_get_table( src->db, path ); /* source is a database */
+ }
+ }
+ return res;
+}
+
+/* -----------------------------------------------------------------------------------------------*/
+static rc_t vdb_print_parse_range( struct num_gen * ranges, const String * range )
+{
+ rc_t rc = num_gen_parse_S( ranges, range );
+ if ( rc != 0 )
+ KOutMsg( "num_gen_parse_S( %S ) -> %R\n", range, rc );
+ return rc;
+}
+
+static rc_t vdb_print_get_src_and_ranges( const String * S,
+ struct num_gen * ranges, uint32_t * src_id )
+{
+ rc_t rc = 0;
+ if ( S != NULL )
+ {
+ char * dot = string_chr( S->addr, S->len, '.' );
+ if ( dot == NULL )
+ rc = vdb_print_parse_range( ranges, S );
+ else
+ {
+ String Sub;
+ uint32_t dot_idx = ( dot - S->addr );
+ if ( dot_idx < S->len )
+ {
+ String * tmp = StringSubstr( S, &Sub, dot_idx + 1, S->len - dot_idx );
+ if ( tmp != NULL )
+ rc = vdb_print_parse_range( ranges, tmp );
+ }
+ if ( rc == 0 && dot_idx > 0 )
+ {
+ String * tmp = StringSubstr( S, &Sub, 0, dot_idx );
+ if ( tmp != NULL )
+ {
+ rc_t rc1;
+ uint64_t v = StringToU64( tmp, &rc1 );
+ if ( rc1 != 0 || v > 0xFFFF ) v = 0;
+ *src_id = ( v & 0xFFFF );
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdp_print_show_src_and_ranges( struct num_gen * ranges, uint32_t src_id )
+{
+ rc_t rc;
+ char buffer[ 1024 ];
+ buffer[ 0 ] = 0;
+ rc = num_gen_as_string( ranges, buffer, sizeof buffer, NULL, true );
+ if ( rc == 0 )
+ rc = KOutMsg( "src-id = %d, ranges = %s\n", src_id, buffer );
+ return rc;
+}
+
+
+/* called from vdb-dump-interact.c, v is a vector of String-objects */
+rc_t vdp_print_interactive( const Vector * v, vdp_src_context * vctx )
+{
+ struct num_gen * ranges;
+ uint32_t src_id = 0; /* per default use the first ( mostly only ) source */
+ rc_t rc = num_gen_make_sorted( &ranges, true );
+ if ( rc != 0 )
+ KOutMsg( "num_gen_make_sorted() -> %R\n", rc );
+ else
+ {
+ rc = vdb_print_get_src_and_ranges( VectorGet ( v, 1 ), ranges, &src_id );
+ if ( rc == 0 )
+ {
+ vdp_table * tbl = vdp_get_table( vctx, src_id, NULL );
+ if ( tbl == NULL )
+ KOutMsg( "invalid source #%d\n", src_id );
+ else
+ {
+ rc = vdp_table_adjust_ranges( tbl, ranges );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "tbl: %S\n", tbl->name );
+ /* if ( rc == 0 )
+ rc = vdp_print_show_src_and_ranges( ranges, src_id ); */
+
+ if ( rc == 0 )
+ rc = vdp_print_table( tbl, ranges );
+ }
+ }
+ num_gen_destroy( ranges );
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-print.h b/tools/vdb-dump/vdb-dump-print.h
new file mode 100644
index 0000000..af8f0e1
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-print.h
@@ -0,0 +1,86 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+
+#ifndef _h_vdb_dump_print_
+#define _h_vdb_dump_print_
+
+#include <vdb/schema.h> /* for VTypedesc */
+#include <vdb/manager.h>
+
+#include <klib/vector.h>
+#include <kapp/args.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct vdp_opts
+{
+ bool print_dna_bases;
+ bool in_hex;
+ bool translate_sra_types;
+ char c_boolean; /* how boolean is printed '1' ... 0/1, 'T' ... T/F, /0 ... true/false */
+} vdp_opts;
+
+
+struct vdp_src_context;
+
+
+/* vdp_print_cell
+ * prints the content of a cursor-cell to stdout
+ *
+ *
+ * "elem_bits" [ IN ] - element size in bits
+ *
+ * "base" [ IN ] - pointer to cell starting bit
+ *
+ * "boff" [ IN ] - bit offset in BITS of first bit to be printed
+ *
+ * "row_len" [ IN ] - the number of elements in cell
+ *
+ * "type_desc" [ IN ] - type description of the cell ( from schema )
+ */
+
+rc_t vdp_print_cell_2_buffer( char * buf, size_t buf_size, size_t *num_written,
+ const uint32_t elem_bits, const void * base, uint32_t boff, uint32_t row_len,
+ const VTypedesc * type_desc, vdp_opts * opts );
+
+rc_t vdp_print_cell( const uint32_t elem_bits, const void * base, uint32_t boff, uint32_t row_len,
+ const VTypedesc * type_desc, vdp_opts * opts );
+
+
+rc_t vdp_init_ctx( struct vdp_src_context ** vctx, const Args * args );
+rc_t vdp_release_ctx( struct vdp_src_context * vctx );
+
+/* v is a vector of String objects... */
+rc_t vdp_print_interactive( const Vector * v, struct vdp_src_context * vctx );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/tools/vdb-dump/vdb-dump-redir.c b/tools/vdb-dump/vdb-dump-redir.c
new file mode 100644
index 0000000..83bd1b3
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-redir.c
@@ -0,0 +1,120 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-redir.h"
+
+#include <kfs/directory.h>
+#include <kfs/buffile.h>
+#include <kfs/bzip.h>
+#include <kfs/gzip.h>
+#include <sysalloc.h>
+
+static rc_t CC out_redir_callback( void * self, const char * buffer, size_t bufsize, size_t * num_writ )
+{
+ out_redir * redir = ( out_redir * )self;
+ rc_t rc = KFileWriteAll( redir->kfile, redir->pos, buffer, bufsize, num_writ );
+ if ( rc == 0 )
+ redir->pos += *num_writ;
+ return rc;
+}
+
+
+rc_t init_out_redir( out_redir * self, out_redir_mode_t mode, const char * filename, size_t bufsize )
+{
+ rc_t rc;
+ KFile *output_file;
+
+ if ( filename != NULL )
+ {
+ KDirectory *dir;
+ rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" );
+ else
+ {
+ rc = KDirectoryCreateFile ( dir, &output_file, false, 0664, kcmInit, "%s", filename );
+ KDirectoryRelease( dir );
+ }
+ }
+ else
+ rc = KFileMakeStdOut ( &output_file );
+
+ if ( rc == 0 )
+ {
+ KFile *temp_file;
+
+ /* wrap the output-file in compression, if requested */
+ switch ( mode )
+ {
+ case orm_gzip : rc = KFileMakeGzipForWrite( &temp_file, output_file ); break;
+ case orm_bzip2 : rc = KFileMakeBzip2ForWrite( &temp_file, output_file ); break;
+ case orm_uncompressed : break;
+ }
+ if ( rc == 0 )
+ {
+ if ( mode != orm_uncompressed )
+ {
+ KFileRelease( output_file );
+ output_file = temp_file;
+ }
+
+ /* wrap the output/compressed-file in buffering, if requested */
+ if ( bufsize != 0 )
+ {
+ rc = KBufFileMakeWrite( &temp_file, output_file, false, bufsize );
+ if ( rc == 0 )
+ {
+ KFileRelease( output_file );
+ output_file = temp_file;
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ self->kfile = output_file;
+ self->org_writer = KOutWriterGet();
+ self->org_data = KOutDataGet();
+ self->pos = 0;
+ rc = KOutHandlerSet( out_redir_callback, self );
+ if ( rc != 0 )
+ LOGERR( klogInt, rc, "KOutHandlerSet() failed" );
+ }
+ }
+ }
+ return rc;
+}
+
+
+void release_out_redir( out_redir * self )
+{
+ KFileRelease( self->kfile );
+ if( self->org_writer != NULL )
+ {
+ KOutHandlerSet( self->org_writer, self->org_data );
+ }
+ self->org_writer = NULL;
+}
+
diff --git a/tools/vdb-dump/vdb-dump-redir.h b/tools/vdb-dump/vdb-dump-redir.h
new file mode 100644
index 0000000..ceb198f
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-redir.h
@@ -0,0 +1,64 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+#ifndef _h_out_redir_
+#define _h_out_redir_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/out.h>
+#include <klib/rc.h>
+#include <klib/log.h>
+
+#include <kfs/file.h>
+
+typedef enum out_redir_mode
+{
+ orm_uncompressed = 0,
+ orm_gzip,
+ orm_bzip2
+} out_redir_mode_t;
+
+
+/* GLOBAL VARIABLES */
+typedef struct out_redir
+{
+ KWrtWriter org_writer;
+ void* org_data;
+ KFile* kfile;
+ uint64_t pos;
+} out_redir;
+
+
+rc_t init_out_redir( out_redir * self, out_redir_mode_t mode, const char * filename, size_t bufsize );
+
+void release_out_redir( out_redir * self );
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-repo.c b/tools/vdb-dump/vdb-dump-repo.c
new file mode 100644
index 0000000..66baca6
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-repo.c
@@ -0,0 +1,281 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-repo.h"
+#include "vdb-dump-helper.h"
+
+#include <klib/text.h>
+#include <klib/out.h>
+#include <kfg/config.h>
+#include <kfg/repository.h>
+
+/* ------------------------------------------------------------------------------------------------- */
+
+static const KRepCategory id_to_repo_cat[ 4 ] = { krepUserCategory, krepSiteCategory, krepRemoteCategory, krepBadCategory };
+
+static const char * s_BadCategory = "BadCategory";
+static const char * s_UserCategory = "UserCategory";
+static const char * s_SiteCategory = "SiteCategory";
+static const char * s_RemoteCategory = "RemoteCategory";
+static const char * s_UnknownCategory = "unknow category";
+
+static const char * KRepCategory_to_str( const KRepCategory c )
+{
+ switch( c )
+ {
+ case krepBadCategory : return s_BadCategory; break;
+ case krepUserCategory : return s_UserCategory; break;
+ case krepSiteCategory : return s_SiteCategory; break;
+ case krepRemoteCategory : return s_RemoteCategory; break;
+ };
+ return s_UnknownCategory;
+}
+
+static const char * s_Prefix_bad = "bad";
+static const char * s_Prefix_user = "user";
+static const char * s_Prefix_site = "site";
+static const char * s_Prefix_remote = "remote";
+static const char * s_Prefix_unknown = "unknow";
+
+static const char * KRepCategory_to_prefix( const KRepCategory c )
+{
+ switch( c )
+ {
+ case krepBadCategory : return s_Prefix_bad; break;
+ case krepUserCategory : return s_Prefix_user; break;
+ case krepSiteCategory : return s_Prefix_site; break;
+ case krepRemoteCategory : return s_Prefix_remote; break;
+ };
+ return s_Prefix_unknown;
+}
+
+
+static const char * s_BadSubCategory = "BadSubCategory";
+static const char * s_MainSubCategory = "MainSubCategory";
+static const char * s_AuxSubCategory = "AuxSubCategory";
+static const char * s_ProtectedSubCategory = "ProtectedSubCategory";
+
+static const char * KRepSubCategory_to_str( const KRepSubCategory c )
+{
+ switch( c )
+ {
+ case krepBadSubCategory : return s_BadSubCategory; break;
+ case krepMainSubCategory : return s_MainSubCategory; break;
+ case krepAuxSubCategory : return s_AuxSubCategory; break;
+ case krepProtectedSubCategory : return s_ProtectedSubCategory; break;
+ }
+ return s_UnknownCategory;
+}
+
+static const char * s_yes = "yes";
+static const char * s_no = "no";
+
+static const char * yes_or_no( const bool flag )
+{
+ return flag ? s_yes : s_no;
+}
+
+typedef rc_t ( CC * repofunc )( const KRepository *self, char *buffer, size_t bsize, size_t * size );
+
+static rc_t vdi_report_repo_str( const KRepository * repo, const char * elem_name, repofunc f )
+{
+ if ( f != NULL )
+ {
+ char buffer[ 4096 ];
+ rc_t rc = f( repo, buffer, sizeof buffer, NULL );
+ if ( rc == 0 ) return KOutMsg( " - %s : %s\n", elem_name, buffer );
+ }
+ return 0;
+}
+
+static rc_t vdi_report_repository( const KRepository * repo, const char * prefix, int idx, bool full )
+{
+ KRepCategory cat = KRepositoryCategory( repo );
+ KRepSubCategory subcat = KRepositorySubCategory( repo );
+
+ rc_t rc = KOutMsg( " repo.%s #%d:\n", prefix, idx );
+ if ( rc == 0 )
+ rc = KOutMsg( " - category : %s.%s\n", KRepCategory_to_str( cat ), KRepSubCategory_to_str( subcat ) );
+ if ( rc == 0 )
+ rc = vdi_report_repo_str( repo, "name", KRepositoryName );
+ if ( rc == 0 )
+ rc = KOutMsg( " - disabled : %s\n", yes_or_no( KRepositoryDisabled( repo ) ) );
+
+ if ( full )
+ {
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "displayname", KRepositoryDisplayName );
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "root", KRepositoryRoot );
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "resolver", KRepositoryResolver );
+
+ if ( rc == 0 )
+ rc = KOutMsg( " - cached : %s\n", yes_or_no( KRepositoryCacheEnabled( repo ) ) );
+
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "ticket", KRepositoryDownloadTicket );
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "key", KRepositoryEncryptionKey );
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "keyfile", KRepositoryEncryptionKeyFile );
+ if ( rc == 0 ) rc = vdi_report_repo_str( repo, "desc", KRepositoryDescription );
+
+ if ( rc == 0 )
+ {
+ uint32_t prj_id;
+ rc_t rc1 = KRepositoryProjectId( repo, &prj_id );
+ if ( rc1 == 0 ) rc = KOutMsg( " - prj-id : %d\n", prj_id );
+ }
+ }
+
+ if ( rc == 0 ) rc = KOutMsg( "\n" );
+ return rc;
+}
+
+typedef rc_t ( CC * catfunc )( const KRepositoryMgr *self, KRepositoryVector *user_repositories );
+
+static catfunc vdi_get_catfunc( const KRepCategory cat )
+{
+ switch( cat )
+ {
+ case krepUserCategory : return KRepositoryMgrUserRepositories; break;
+ case krepSiteCategory : return KRepositoryMgrSiteRepositories; break;
+ case krepRemoteCategory : return KRepositoryMgrRemoteRepositories; break;
+ };
+ return NULL;
+}
+
+static rc_t vdi_report_repo_vector( const KRepositoryMgr * repomgr, const KRepCategory cat,
+ int32_t select, bool full )
+
+{
+ rc_t rc = 0;
+ catfunc f = vdi_get_catfunc( cat );
+ if ( f != NULL )
+ {
+ KRepositoryVector v;
+ rc = f( repomgr, &v );
+ if ( rc == 0 )
+ {
+ const char * prefix = KRepCategory_to_prefix( cat );
+ uint32_t idx, len = VectorLength( &v );
+ bool disabled = KRepositoryMgrCategoryDisabled( repomgr, cat );
+ rc = KOutMsg( "repo.%s --> disabled: %s, %d subrepositories )\n", prefix, yes_or_no( disabled ), len );
+ for ( idx = 0; rc == 0 && idx < len; ++idx )
+ {
+ if ( select == idx || !full )
+ rc = vdi_report_repository( VectorGet( &v, idx ), prefix, idx, full );
+ }
+
+ KRepositoryVectorWhack( &v );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdi_repo_all( const KRepositoryMgr * repomgr, bool full )
+{
+ rc_t rc = vdi_report_repo_vector( repomgr, krepUserCategory, -1, full );
+ if ( rc == 0 )
+ rc = vdi_report_repo_vector( repomgr, krepSiteCategory, -1, full );
+ if ( rc == 0 )
+ rc = vdi_report_repo_vector( repomgr, krepRemoteCategory, -1, full );
+ return rc;
+}
+
+
+static rc_t vdi_repo_switch( const KRepositoryMgr * repomgr, const KRepCategory cat, bool disabled )
+{
+ const char * s_cat = KRepCategory_to_prefix( cat );
+ rc_t rc = KRepositoryMgrCategorySetDisabled( repomgr, cat, disabled );
+ if ( rc == 0 )
+ rc = KOutMsg( "repository '%s' successfully %s", s_cat, ( disabled ? "disabled" : "enabled" ) );
+ else
+ rc = KOutMsg( "repository '%s' not %s: '%R'", s_cat, ( disabled ? "disabled" : "enabled" ), rc );
+ return rc;
+}
+
+
+static rc_t vdi_sub_repo( const KRepositoryMgr * repomgr, const Vector * v, const String * which_repo, int32_t repo_id )
+{
+ rc_t rc = 0;
+ const KRepCategory cat = id_to_repo_cat[ repo_id ];
+
+ if ( VectorLength( v ) > 2 )
+ {
+ const String * which_sub = VectorGet( v, 2 );
+ int32_t repo_func = index_of_match( which_sub, 2, "on", "off" );
+ switch( repo_func )
+ {
+ case 0 : rc = vdi_repo_switch( repomgr, cat, false ); break;
+ case 1 : rc = vdi_repo_switch( repomgr, cat, true ); break;
+ case -1 : {
+ int32_t select = ( int32_t )string_to_I64( which_sub->addr, which_sub->len, NULL );
+ rc = vdi_report_repo_vector( repomgr, cat, select, true );
+ }
+ break;
+ }
+ }
+ else
+ {
+ if ( repo_id < 3 )
+ rc = vdi_report_repo_vector( repomgr, cat, -1, false );
+ else
+ rc = vdi_repo_all( repomgr, false );
+ }
+
+ return rc;
+}
+
+
+rc_t vdi_repo( const Vector * v )
+{
+ KConfig * cfg;
+ rc_t rc = KConfigMake( &cfg, NULL );
+ if ( rc == 0 )
+ {
+ const KRepositoryMgr * repomgr;
+ rc = KConfigMakeRepositoryMgrRead( cfg, &repomgr );
+ {
+ if ( VectorLength( v ) < 2 )
+ {
+ rc = vdi_repo_all( repomgr, true );
+ }
+ else
+ {
+ const String * which_repo = VectorGet( v, 1 );
+ if ( which_repo != NULL )
+ {
+ int32_t repo_id = index_of_match( which_repo, 4, "user", "site", "remote", "all" );
+ if ( repo_id < 0 || repo_id > 3 )
+ rc = KOutMsg( "unknow repository '%S'", which_repo );
+ else
+ rc = vdi_sub_repo( repomgr, v, which_repo, repo_id );
+ }
+ }
+
+ KRepositoryMgrRelease( repomgr );
+ }
+ KConfigRelease ( cfg );
+ }
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-repo.h b/tools/vdb-dump/vdb-dump-repo.h
new file mode 100644
index 0000000..d2a2e64
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-repo.h
@@ -0,0 +1,46 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_repo_
+#define _h_vdb_dump_repo_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/rc.h>
+#include <klib/vector.h>
+
+rc_t vdi_repo( const Vector * v );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-row-context.h b/tools/vdb-dump/vdb-dump-row-context.h
new file mode 100644
index 0000000..de282f1
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-row-context.h
@@ -0,0 +1,71 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_row_context_
+#define _h_vdb_dump_row_context_
+
+#include <vdb/cursor.h>
+#include <klib/vector.h>
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-coldefs.h"
+#include "vdb-dump-str.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*************************************************************************************
+ binds together everything to dump one row:
+ - a pointer to the cursor to read the data-cells
+ - a pointer to the column-definitions (Vector of column-definition's)
+ - a pointer to the dump-context ( parameters and options for cmd-line )
+ - a dump-string (structure not pointer!) to be reused to assemble output
+ - a Vector containing p_col_data - pointers
+ - a return-type to stop if reading data failed ( neccessary to stop after
+ last row if no row-range is given at command-line )
+
+ needed as a (one and only) parameter to VectorForEach
+*************************************************************************************/
+typedef struct row_context
+{
+ const VTable* table;
+ const VCursor* cursor;
+ p_col_defs col_defs;
+ p_dump_context ctx;
+ dump_str s_col;
+ int64_t row_id;
+ uint32_t col_nr;
+ rc_t rc;
+} row_context;
+typedef row_context* p_row_context;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-str.c b/tools/vdb-dump/vdb-dump-str.c
new file mode 100644
index 0000000..8dac7e7
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-str.c
@@ -0,0 +1,540 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-str.h"
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/out.h>
+#include <klib/namelist.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+
+rc_t vds_make( p_dump_str s, const size_t limit, const size_t inc )
+{
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull );
+ }
+ s->str_limit = limit;
+ s->buf_inc = inc;
+ s->buf_size = ( ( limit == 0 ) ? inc : limit+1 );
+ s->buf = malloc( s->buf_size );
+ if ( s->buf == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ }
+ s->str_len = 0;
+ s->buf[0] = 0;
+ s->truncated = false;
+ return 0;
+}
+
+rc_t vds_free( p_dump_str s )
+{
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcParam, rcNull );
+ }
+ free( s->buf );
+ return 0;
+}
+
+rc_t vds_clear( p_dump_str s )
+{
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcDestroying, rcParam, rcNull );
+ }
+ s->buf[0]=0;
+ s->str_len = 0;
+ s->truncated = false;
+ return 0;
+}
+
+bool vds_truncated( p_dump_str s )
+{
+ if ( s == NULL ) return false;
+ return s->truncated;
+}
+
+char *vds_ptr( p_dump_str s )
+{
+ if ( s == NULL ) return NULL;
+ return s->buf;
+}
+
+
+static rc_t vds_inc_buffer( p_dump_str s, const size_t by_len )
+{
+ rc_t rc = 0;
+ if ( s == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcAllocating, rcParam, rcNull );
+ }
+ else
+ {
+ size_t needed = ( s->str_len + by_len + 1 );
+ if ( needed >= s->buf_size )
+ {
+ char * tmp;
+ size_t new_size = s->buf_size * 2;
+
+ if ( new_size < needed ) new_size = needed + s->buf_inc;
+ tmp = realloc( s->buf, new_size );
+ if ( tmp == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcAllocating, rcMemory, rcExhausted );
+ }
+ else
+ {
+ s->buf = tmp;
+ s->buf_size = new_size;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vds_truncate( p_dump_str s, const size_t appended )
+{
+ if ( s == NULL || s->buf == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcResizing, rcParam, rcNull );
+ }
+ s->str_len += appended;
+ if ( ( s->str_limit > 0 )&&( s->str_len > s->str_limit ) )
+ {
+ s->buf[ s->str_limit ] = 0;
+ s->str_len = s->str_limit;
+ s->truncated = true;
+ }
+ return 0;
+}
+
+
+rc_t vds_append_fmt( p_dump_str s, const size_t aprox_len, const char *fmt, ... )
+{
+ rc_t rc = 0;
+ if ( s == NULL || fmt == NULL )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ else if ( fmt[ 0 ] == 0 )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+ }
+ else if ( ( s->str_limit > 0 )&&( s->str_len >= s->str_limit ) )
+ {
+ s->truncated = true;
+ }
+ else
+ {
+ rc = vds_inc_buffer( s, aprox_len );
+ if ( rc == 0 )
+ {
+ va_list argp;
+ size_t num_writ;
+
+ va_start( argp, fmt );
+ rc = string_vprintf( s->buf + s->str_len, s->buf_size - 1, &num_writ, fmt, argp );
+ va_end( argp );
+
+ if ( rc == 0 )
+ rc = vds_truncate( s, num_writ ); /* adjusts str_len */
+ }
+ }
+ return rc;
+}
+
+
+rc_t vds_append_str( p_dump_str s, const char *s1 )
+{
+ rc_t rc = 0;
+
+ if ( ( s == NULL )||( s1 == NULL ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ else
+ {
+ size_t append_len = string_size( s1 );
+ if ( append_len > 0 )
+ {
+ if ( ( s->str_limit > 0 )&&( s->str_len >= s->str_limit ) )
+ {
+ s->truncated = true;
+ }
+ else
+ {
+ rc = vds_inc_buffer( s, append_len );
+ if ( rc == 0 )
+ {
+ size_t l = s->str_len;
+ size_t appended = string_copy( s->buf + l, s->buf_size - l, s1, append_len );
+ rc = vds_truncate( s, appended ); /* adjusts str_len */
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+rc_t vds_append_str_no_limit_check( p_dump_str s, const char *s1 )
+{
+ rc_t rc;
+ size_t append_len;
+ if ( ( s == NULL )||( s1 == NULL ) )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ append_len = string_size( s1 );
+ if ( append_len == 0 )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+ }
+ rc = vds_inc_buffer( s, append_len );
+ if ( rc == 0 )
+ {
+ size_t l = string_size( s->buf );
+ size_t appended = string_copy( s->buf + l, s->buf_size - l, s1, append_len );
+ s->str_len += appended;
+ }
+ return rc;
+}
+
+
+rc_t vds_rinsert( p_dump_str s, const char *s1 )
+{
+ size_t len;
+ if ( ( s == NULL )||( s1 == NULL ) )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ len = string_size( s1 );
+ if ( len == 0 )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcEmpty );
+ }
+ if ( s->str_len <= len ) return 0;
+ len = s->str_len - len;
+ string_copy( s->buf + len, sizeof( s->buf ) - len, s1, string_size( s1 ) );
+ /* s->str_len does not change */
+ return 0;
+}
+
+
+rc_t vds_indent( p_dump_str s, const size_t limit, const size_t indent )
+{
+ size_t remaining_chars, lines, indent_block, line_idx;
+ char *src, *dst;
+ rc_t rc;
+
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ if ( s->str_len < limit ) return 0;
+ remaining_chars = s->str_len - limit;
+ indent_block = limit - indent;
+ lines = ( remaining_chars / indent_block ) + 1;
+ /* increase the buffer by ( lines * ( indent + 1 ) ) bytes */
+ rc = vds_inc_buffer( s, lines * ( indent + 1 ) );
+ if ( rc == 0 )
+ {
+ src = s->buf + limit;
+ line_idx = 0;
+ while ( line_idx < lines )
+ {
+ dst = src + ( indent + 1 );
+ memmove( dst, src, remaining_chars );
+ *src = '\n';
+ memset( src+1, ' ', indent );
+ remaining_chars -= indent_block;
+ src += ( limit+1 );
+ line_idx++;
+ }
+ s->str_len += ( lines * ( indent + 1 ) );
+ s->buf[ s->str_len ] = 0;
+ }
+ return rc;
+}
+
+uint16_t vds_count_char( p_dump_str s, const char c )
+{
+ uint16_t res = 0;
+ char *temp = s->buf;
+ while( *temp )
+ {
+ if ( *temp == c ) res++;
+ temp++;
+ }
+ return res;
+}
+
+void vds_escape_quotes_loop( p_dump_str s, const char to_escape,
+ const char escape_char )
+{
+ char *temp = s->buf;
+ while( *temp )
+ {
+ if ( *temp == to_escape )
+ {
+ size_t to_move = string_size( temp ) + 1;
+ memmove( temp+1, temp, to_move );
+ (*temp) = escape_char;
+ temp++;
+ }
+ temp++;
+ }
+ s->str_len = string_size( s->buf );
+}
+
+rc_t vds_escape( p_dump_str s, const char to_escape, const char escape_char )
+{
+ uint16_t n;
+ rc_t rc;
+
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ n = vds_count_char( s, to_escape );
+ rc = vds_inc_buffer( s, n + 1 );
+ if ( rc == 0 )
+ {
+ vds_escape_quotes_loop( s, to_escape, escape_char );
+ }
+ return rc;
+}
+
+rc_t vds_enclose_string( p_dump_str s, const char c_left, const char c_right )
+{
+ size_t to_move;
+ rc_t rc;
+
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ to_move = s->str_len + 1;
+ rc = vds_inc_buffer( s, 2 );
+ if ( rc == 0 )
+ {
+ memmove( s->buf + 1, s->buf, to_move );
+ s->buf[ 0 ] = c_left;
+ s->buf[ to_move ] = c_right;
+ s->buf[ to_move + 1 ] = 0;
+ s->str_len += 2;
+ }
+ return rc;
+}
+
+rc_t vds_2_csv( p_dump_str s )
+{
+ rc_t rc = 0;
+ bool has_comma, has_quotes;
+
+ if ( s == NULL )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ has_comma = (strchr( s->buf, ',' ) != NULL );
+ has_quotes = (strchr( s->buf, '"' ) != NULL );
+ if ( has_quotes )
+ {
+ rc = vds_escape( s, '"', '"' );
+ }
+ if ( (rc == 0 )&&( ( has_quotes )||( has_comma ) ) )
+ {
+ rc = vds_enclose_string( s, '"', '"' );
+ }
+ return rc;
+}
+
+
+/* ========================================================================================= */
+static rc_t vds_add_to_sections( const char * path, uint32_t start, uint32_t len, VNamelist * sections )
+{
+ String S;
+ StringInit( &S, &( path[ start ] ), len, len );
+ return VNamelistAppendString ( sections, &S );
+}
+
+rc_t vds_path_to_sections( const char * path, char delim, VNamelist ** sections )
+{
+ rc_t rc = 0;
+ if ( path == NULL || sections == NULL )
+ rc = RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ else
+ {
+ rc = VNamelistMake ( sections, 5 );
+ if ( rc == 0 )
+ {
+ uint32_t idx = 0, start = 0, len = 0;
+ while( rc== 0 && path[ idx ] != 0 )
+ {
+ if ( path[ idx ] == delim )
+ {
+ if ( len > 0 )
+ rc = vds_add_to_sections( path, start, len, *sections );
+ start = idx + 1;
+ len = 0;
+ }
+ else
+ {
+ len++;
+ }
+ idx++;
+ }
+ if ( rc == 0 && len > 0 )
+ rc = vds_add_to_sections( path, start, len, *sections );
+ }
+ }
+ return rc;
+}
+
+/* ========================================================================================= */
+
+static void clear_recorded_errors( void )
+{
+ rc_t rc;
+ const char * filename;
+ const char * funcname;
+ uint32_t line_nr;
+ while ( GetUnreadRCInfo ( &rc, &filename, &funcname, &line_nr ) )
+ {
+ }
+}
+
+static rc_t vds_read_line( const KFile * f, uint64_t * pos, size_t * len, char * buffer, size_t buflen )
+{
+ size_t num_read;
+ rc_t rc = KFileRead( f, *pos, buffer, buflen, &num_read );
+ if ( rc == 0 && num_read > 0 )
+ {
+ char * nl = string_chr ( buffer, num_read, '\n' );
+ char * cr = string_chr ( buffer, num_read, '\r' );
+ if ( nl != NULL )
+ {
+ if ( cr != NULL )
+ {
+ if ( nl < cr )
+ *len = ( nl - buffer );
+ else
+ *len = ( cr - buffer );
+ }
+ else
+ *len = ( nl - buffer );
+ }
+ else if ( cr != NULL )
+ {
+ *len = ( cr - buffer );
+ }
+ else
+ *len = 0;
+ *pos += ( *len + 1 );
+ }
+ return rc;
+}
+
+static rc_t vds_print_diff( const char * buffer1, const char * buffer2, size_t len1, size_t len2 )
+{
+ rc_t rc;
+ String S1, S2;
+
+ StringInit( &S1, buffer1, len1, len1 );
+ StringInit( &S2, buffer2, len2, len2 );
+ rc = KOutMsg( "\n[A] %S\n", &S1 );
+ if ( rc == 0 )
+ rc = KOutMsg( "[B] %S\n", &S2 );
+ return rc;
+}
+
+static rc_t vds_diff_files( const KFile * f1, const KFile * f2 )
+{
+ rc_t rc;
+ char buffer1[ 2048 ];
+ char buffer2[ 2048 ];
+ uint64_t pos1 = 0;
+ uint64_t pos2 = 0;
+ size_t len1, len2;
+
+ do
+ {
+ len1 = len2 = 0;
+ rc = vds_read_line( f1, &pos1, &len1, buffer1, sizeof buffer1 );
+ if ( rc == 0 )
+ rc = vds_read_line( f2, &pos2, &len2, buffer2, sizeof buffer2 );
+ if ( rc == 0 && ( len1 > 0 || len2 > 0 ) )
+ rc = vds_print_diff( buffer1, buffer2, len1, len2 );
+
+ } while( rc == 0 && ( len1 > 0 || len2 > 0 ) );
+ return rc;
+}
+
+
+rc_t vds_diff( const char * f1, const char * f2 )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ KOutMsg( "KDirectoryNativeDir() failed\n" );
+ else
+ {
+ const KFile * kf1;
+ rc = KDirectoryOpenFileRead ( dir, &kf1, "%s", f1 );
+ if ( rc != 0 )
+ KOutMsg( "cannot open file '%s'\n", f1 );
+ else
+ {
+ const KFile * kf2;
+ rc = KDirectoryOpenFileRead ( dir, &kf2, "%s", f2 );
+ if ( rc != 0 )
+ KOutMsg( "cannot open file '%s'\n", f2 );
+ else
+ {
+ rc = vds_diff_files( kf1, kf2 );
+ KFileRelease( kf2 );
+ }
+ KFileRelease( kf1 );
+ }
+ KDirectoryRelease( dir );
+ }
+ clear_recorded_errors();
+
+ return rc;
+}
\ No newline at end of file
diff --git a/tools/vdb-dump/vdb-dump-str.h b/tools/vdb-dump/vdb-dump-str.h
new file mode 100644
index 0000000..b157204
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-str.h
@@ -0,0 +1,100 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_str_
+#define _h_vdb_dump_str_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include <klib/rc.h>
+#include <klib/namelist.h>
+
+typedef struct dump_str
+{
+ char *buf;
+ size_t buf_size;
+ size_t str_len;
+ size_t str_limit;
+ size_t buf_inc;
+ bool truncated;
+} dump_str;
+typedef dump_str* p_dump_str;
+
+#define DUMP_STR_INC 512
+
+/* initializes the dump-string with limit and buffer-increment */
+rc_t vds_make( p_dump_str s, const size_t limit, const size_t inc );
+
+/* free's the dump-string's internal buffer */
+rc_t vds_free( p_dump_str s );
+
+/* the internal buffer stay's allocated, but the internal string-len
+ and the truncated-state is cleared */
+rc_t vds_clear( p_dump_str s );
+
+/* returns if the dump-string was trancated */
+bool vds_truncated( p_dump_str s );
+
+/* returns if assembled dump-string */
+char *vds_ptr( p_dump_str s );
+
+/* appends the formated string with parameters, truncates to the limit */
+rc_t vds_append_fmt( p_dump_str s, const size_t aprox_len, const char *fmt, ... );
+
+/* appends the string, truncates to the limit */
+rc_t vds_append_str( p_dump_str s, const char *s1 );
+
+/* appends the string, does not truncate */
+rc_t vds_append_str_no_limit_check( p_dump_str s, const char *s1 );
+
+/* right-inserts the string at the end of the ev. limited string */
+rc_t vds_rinsert( p_dump_str s, const char *s1 );
+
+/* indents the content of a dump-string */
+rc_t vds_indent( p_dump_str s, const size_t limit, const size_t indent );
+
+/* converts the dump-string into csv-style (quotes at begin and end if the
+ string contains a comma or other quotes, escapes quotes with quotes ) */
+rc_t vds_2_csv( p_dump_str s );
+
+rc_t vds_enclose_string( p_dump_str s, const char c_left, const char c_right );
+rc_t vds_escape( p_dump_str s, const char to_escape, const char escape_char );
+
+rc_t vds_path_to_sections( const char * path, char delim, VNamelist ** sections );
+
+rc_t vds_diff( const char * f1, const char * f2 );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump-tools.c b/tools/vdb-dump/vdb-dump-tools.c
new file mode 100644
index 0000000..bbcee5c
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-tools.c
@@ -0,0 +1,528 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include "vdb-dump-tools.h"
+#include "vdb-dump-str.h"
+
+#include <vdb/schema.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/pack.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <bitstr.h>
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#define DISP_RC(rc,err) if( rc != 0 ) LOGERR( klogInt, rc, err );
+
+#define BYTE_OFFSET(VALUE) ( (VALUE) >> 3 )
+#define BIT_OFFSET(VALUE) ( (VALUE) & 0x7 )
+
+uint8_t BitLength2Bytes[65] =
+{
+ /* 0 1 2 3 4 5 6 7 8 9*/
+ /* 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ /* 1 */ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+ /* 2 */ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+ /* 3 */ 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ /* 4 */ 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ /* 5 */ 7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
+ /* 6 */ 8, 8, 8, 8, 8
+};
+
+/*************************************************************************************
+n_bits [IN] ... number of bits
+
+calculates the number of bytes that have to be copied to contain the given
+number of bits
+*************************************************************************************/
+static uint16_t vdt_bitlength_2_bytes( const size_t n_bits )
+{
+ if ( n_bits > 64 )
+ return 8;
+ else
+ return BitLength2Bytes[ n_bits ];
+}
+
+uint64_t BitLength2Mask[33] =
+{
+ /* 0 */ 0x00,
+ /* 1 .. 4 */ 0x1, 0x3, 0x7, 0xF,
+ /* 5 .. 8 */ 0x1F, 0x3F, 0x7F, 0xFF,
+ /* 9 .. 12 */ 0x1FF, 0x3FF, 0x7FF, 0xFFF,
+ /*13 .. 16 */ 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF,
+ /*17 .. 20 */ 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF,
+ /*21 .. 24 */ 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF,
+ /*25 .. 28 */ 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF,
+ /*29 .. 32 */ 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
+ };
+
+/*************************************************************************************
+n_bits [IN] ... number of bits
+
+creates a bitmask to mask exactly the given number of bits from a longer value
+*************************************************************************************/
+static uint64_t vdt_bitlength_2_mask( const size_t n_bits )
+{
+ uint64_t res;
+ if ( n_bits < 33 )
+ res = BitLength2Mask[ n_bits ];
+ else
+ {
+ if ( n_bits < 65 )
+ res = BitLength2Mask[ n_bits-32 ];
+ else
+ res = 0xFFFFFFFF;
+ res <<= 32;
+ res |= 0xFFFFFFFF;
+ }
+ return res;
+}
+
+
+static rc_t vdb_dump_txt_ascii( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ char *src_ptr = (char*)src->buf + BYTE_OFFSET( src->offset_in_bits );
+ return vds_append_fmt( s, src->number_of_elements,
+ "%.*s", src->number_of_elements, src_ptr );
+
+}
+
+
+static rc_t vdb_dump_hex_char( char * temp, uint32_t * idx, const uint8_t c )
+{
+ char s[ 8 ];
+ size_t num_writ;
+ rc_t rc = string_printf ( s, sizeof s, &num_writ, "%X ", c );
+ if ( rc == 0 )
+ {
+ size_t i;
+ for ( i = 0; i < num_writ; ++i )
+ temp[ (*idx)++ ] = s[ i ];
+ }
+ return rc;
+}
+
+
+static rc_t vdb_dump_hex_ascii( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc = 0;
+ char *src_ptr = (char*)src->buf + BYTE_OFFSET( src->offset_in_bits );
+ char *tmp = malloc( src->number_of_elements * 4 );
+ if ( tmp != NULL )
+ {
+ uint32_t i, dst = 0;
+ for ( i = 0; i < src->number_of_elements && rc == 0; ++i )
+ rc = vdb_dump_hex_char( tmp, &dst, src_ptr[ i ] );
+ src_ptr[ dst ] = 0;
+ if ( rc == 0 )
+ rc = vds_append_fmt( s, dst, "%.*s", dst, tmp );
+ free( tmp );
+ }
+ else
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ return rc;
+}
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+dpo [IN] ... pointer to buffer-offset (bit-offset-part will be ignored)
+
+dumps an ascii-string
+*************************************************************************************/
+static rc_t vdt_dump_ascii( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc;
+ if ( src->in_hex )
+ rc = vdb_dump_hex_ascii( s, src, def );
+ else
+ rc = vdb_dump_txt_ascii( s, src, def );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ if ( rc == 0 )
+ {
+ src->element_idx+=src->number_of_elements;
+ src->offset_in_bits += ( def->type_desc.intrinsic_bits * src->number_of_elements );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+dpo [IN] ... pointer to buffer-offset (bit-offset-part will be ignored)
+
+dumps an ascii-string
+*************************************************************************************/
+static rc_t vdt_dump_unicode( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc;
+ if ( src->in_hex )
+ rc = vdb_dump_hex_ascii( s, src, def );
+ else
+ rc = vdb_dump_txt_ascii( s, src, def );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ if ( rc == 0 )
+ {
+ src->element_idx+=src->number_of_elements;
+ src->offset_in_bits += ( def->type_desc.intrinsic_bits * src->number_of_elements );
+ }
+ return rc;
+}
+
+void vdt_move_to_value( void* dst, const p_dump_src src, const uint32_t n_bits )
+{
+ char *src_ptr = (char*)src->buf + BYTE_OFFSET(src->offset_in_bits);
+ if ( BIT_OFFSET(src->offset_in_bits) == 0 )
+ {
+ memmove( dst, src_ptr, vdt_bitlength_2_bytes( n_bits ) );
+ }
+ else
+ {
+ bitcpy ( dst, 0, src_ptr, BIT_OFFSET(src->offset_in_bits), n_bits );
+ }
+}
+
+static uint64_t vdt_move_to_uint64( const p_dump_src src, const uint32_t n_bits )
+{
+ uint64_t value = 0;
+ vdt_move_to_value( &value, src, n_bits );
+ if ( n_bits & 7 )
+ {
+ size_t unpacked = 0;
+ Unpack( n_bits, sizeof( value ), &value, 0, n_bits,
+ NULL, &value, sizeof(value), &unpacked );
+ }
+ value &= vdt_bitlength_2_mask( n_bits );
+ src->offset_in_bits += n_bits;
+ return value;
+}
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+my_col_def [IN] ... the definition of the column to be dumped
+
+dumps boolean values (up to 64 bits)
+*************************************************************************************/
+static rc_t vdt_dump_boolean_element( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc;
+ uint64_t value = vdt_move_to_uint64( src, def->type_desc.intrinsic_bits );
+ switch( src->c_boolean )
+ {
+ case '1' : if ( value == 0 )
+ rc = vds_append_str( s, "0" );
+ else
+ rc = vds_append_str( s, "1" );
+ break;
+ case 'T' : if ( value == 0 )
+ rc = vds_append_str( s, "F" );
+ else
+ rc = vds_append_str( s, "T" );
+ break;
+
+ default : if ( value == 0 )
+ rc = vds_append_str( s, "false" );
+ else
+ rc = vds_append_str( s, "true" );
+ break;
+ }
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ return rc;
+}
+
+#define MAX_CHARS_FOR_HEX_UINT64 20
+#define MAX_CHARS_FOR_DEC_UINT64 22
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+my_col_def [IN] ... the definition of the column to be dumped
+
+unsigned int's up to a length of 64 bit are supported
+unused bits are masked out
+*************************************************************************************/
+static rc_t vdt_dump_uint_element( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc = 0;
+ uint64_t value = vdt_move_to_uint64( src, def->type_desc.intrinsic_bits );
+ if ( ( src->without_sra_types == false )&&( def->value_trans_fct != NULL ) )
+ {
+ const char *txt = def->value_trans_fct( (uint32_t)value );
+ rc = vds_append_str( s, txt );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ else
+ {
+ if ( src->in_hex )
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_HEX_UINT64, "0x%lX", value );
+ else
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_DEC_UINT64, "%lu", value );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ }
+ return rc;
+}
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+my_col_def [IN] ... the definition of the column to be dumped
+
+signed int's up to a length of 64 bit are supported
+unused bits are masked out
+*************************************************************************************/
+static rc_t vdt_dump_int_element( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc = 0;
+ int64_t value = (int64_t)vdt_move_to_uint64( src, def->type_desc.intrinsic_bits );
+ if ( ( src->without_sra_types == false )&&( def->value_trans_fct != NULL ) )
+ {
+ const char *txt = def->value_trans_fct( (uint32_t)value );
+ rc = vds_append_str( s, txt );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ else
+ {
+ switch ( def->type_desc.intrinsic_bits )
+ {
+ case 8 : { int8_t temp = (int8_t)value;
+ value = temp; }
+ break;
+ case 16 : { int16_t temp = (int16_t)value;
+ value = temp; }
+ break;
+ case 32 : { int32_t temp = (int32_t)value;
+ value = temp; }
+ break;
+ }
+
+ if ( src->in_hex )
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_HEX_UINT64, "0x%lX", value );
+ else
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_DEC_UINT64, "%ld", value );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ }
+ return rc;
+}
+
+#define MAX_CHARS_FOR_DOUBLE 26
+#define BITSIZE_OF_FLOAT ( sizeof(float) * 8 )
+#define BITSIZE_OF_DOUBLE ( sizeof(double) * 8 )
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+my_col_def [IN] ... the definition of the column to be dumped
+
+only 2 float-types: "float"(32 bit) and "double"(64 bit) are supported
+*************************************************************************************/
+static rc_t vdt_dump_float_element( p_dump_str s, const p_dump_src src,
+ const p_col_def def )
+{
+ rc_t rc;
+ if ( src->in_hex )
+ rc = vdt_dump_int_element( s, src, def );
+ else
+ {
+ if ( def->type_desc.intrinsic_bits == BITSIZE_OF_FLOAT )
+ {
+ float value;
+ vdt_move_to_value( &value, src, def->type_desc.intrinsic_bits );
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_DOUBLE, "%e", value );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ }
+ else if ( def->type_desc.intrinsic_bits == BITSIZE_OF_DOUBLE )
+ {
+ double value;
+ vdt_move_to_value( &value, src, def->type_desc.intrinsic_bits );
+ rc = vds_append_fmt( s, MAX_CHARS_FOR_DOUBLE, "%e", value );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ }
+ else
+ {
+ rc = vds_append_str( s, "unknown float-type" );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ src->offset_in_bits += def->type_desc.intrinsic_bits;
+ }
+ return rc;
+}
+
+
+char dna_chars[4] = { 'A', 'C', 'G', 'T' };
+
+/* special function to translate dim=2,bits=1 into a DNA-base */
+static rc_t vdt_dump_base_element( p_dump_str s,
+ const p_dump_src src,
+ const p_col_def def )
+{
+ /* do not replace this with value2=value1, because move_to_uint64
+ increments the src-bit-counter !*/
+ uint64_t value1 = vdt_move_to_uint64( src, def->type_desc.intrinsic_bits );
+ uint64_t value2 = vdt_move_to_uint64( src, def->type_desc.intrinsic_bits );
+ rc_t rc;
+ value1 <<= 1;
+ value1 |= value2;
+ rc = vds_append_fmt( s, 1, "%c", dna_chars[ value1 & 0x03 ] );
+ DISP_RC( rc, "dump_str_append_fmt() failed" )
+ return rc;
+}
+
+
+typedef rc_t(*vdt_dump_fkt_t)( p_dump_str s,
+ const p_dump_src src,
+ const p_col_def def );
+
+/* !!!!!!!! this depends on how domains are defined in "schema.h" */
+vdt_dump_fkt_t vdt_DomainDispatch[] =
+{
+ vdt_dump_boolean_element,
+ vdt_dump_uint_element,
+ vdt_dump_int_element,
+ vdt_dump_float_element,
+ vdt_dump_ascii,
+ vdt_dump_unicode
+};
+
+rc_t vdt_dump_dim_trans( const p_dump_src src, const p_col_def def,
+ const int dimension )
+{
+ rc_t rc = 0;
+ char *s;
+ uint8_t *sbuf = (uint8_t *)src->buf;
+ sbuf+=( src->offset_in_bits >> 3 );
+ s = def->dim_trans_fct( sbuf );
+ src->offset_in_bits += ( def->type_desc.intrinsic_bits * dimension );
+ rc = vds_append_str( &(def->content), s );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ /* we have to free, because dim_trans_fct()
+ makes the string dynamically */
+ free( s );
+ return rc;
+}
+
+rc_t vdt_dump_dim( const p_dump_src src, const p_col_def def,
+ const int dimension, const int selection )
+{
+ rc_t rc = 0;
+ int i = 0;
+ bool print_comma = true;
+
+ if ( selection == 0 ) /* cell-type == boolean */
+ {
+ /* if long form "false" or "true" separate elements by comma */
+ print_comma = ( src->c_boolean == 0 );
+ }
+
+ while ( ( i < dimension )&&( rc == 0 ) )
+ {
+ /* selection 0 ... boolean */
+ if ( print_comma && ( i > 0 ) )
+ {
+ rc = vds_append_str( &(def->content), ", " );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ if ( rc == 0 )
+ {
+ rc = vdt_DomainDispatch[ selection ]( &(def->content), src, def );
+ DISP_RC( rc, "DomainDispatch[]() failed" )
+ }
+ i++;
+ }
+ return rc;
+}
+
+/*************************************************************************************
+src [IN] ... buffer containing the data
+my_col_def [IN] ... the definition of the column to be dumped
+
+dumps one data-element (or a vector of it)
+*************************************************************************************/
+rc_t vdt_dump_element( const p_dump_src src, const p_col_def def, bool bracket )
+{
+ int dimension, selection;
+ rc_t rc = 0;
+
+ if ( ( src == NULL )||( def == NULL ) )
+ {
+ return RC( rcVDB, rcNoTarg, rcInserting, rcParam, rcNull );
+ }
+ dimension = def->type_desc.intrinsic_dim;
+ selection = def->type_desc.domain - 1;
+
+ if ( dimension == 1 )
+ {
+ /* we have only 1 dimension ---> just print this value */
+ rc = vdt_DomainDispatch[ selection ]( &(def->content), src, def );
+ DISP_RC( rc, "DomainDispatch[]() failed" )
+ }
+ else
+ {
+ /* we have more than 1 dimension ---> repeat printing value's */
+ if ( src->print_dna_bases )
+ {
+ rc = vdt_dump_base_element( &(def->content), src, def );
+ }
+ else
+ {
+ bool trans = ( ( src->without_sra_types == false )&&
+ ( def->dim_trans_fct ) );
+ bool paren = ( ( src->number_of_elements > 1 )||( !trans ) );
+
+ if ( paren )
+ {
+ rc = vds_append_str( &(def->content), bracket ? "[" : "{" );
+
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+
+ if ( rc == 0 )
+ {
+ if ( trans )
+ rc = vdt_dump_dim_trans( src, def, dimension );
+ else
+ {
+ rc = vdt_dump_dim( src, def, dimension, selection );
+ }
+ }
+
+ if ( paren && ( rc == 0 ) )
+ {
+ rc = vds_append_str( &(def->content), bracket ? "]" : "}" );
+ DISP_RC( rc, "dump_str_append_str() failed" )
+ }
+ }
+ }
+ src->element_idx++;
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb-dump-tools.h b/tools/vdb-dump/vdb-dump-tools.h
new file mode 100644
index 0000000..d8b7ac7
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump-tools.h
@@ -0,0 +1,60 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_dump_tools_
+#define _h_vdb_dump_tools_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _h_klib_defs_
+#include <klib/defs.h>
+#endif
+
+#include "vdb-dump-coldefs.h"
+#include "vdb-dump-str.h"
+
+typedef struct dump_src
+{
+ const void *buf;
+ uint32_t offset_in_bits;
+ uint32_t element_idx;
+ uint32_t number_of_elements;
+ bool in_hex;
+ bool print_dna_bases;
+ bool without_sra_types;
+ char c_boolean;
+} dump_src;
+typedef dump_src* p_dump_src;
+
+rc_t vdt_dump_element( const p_dump_src src, const p_col_def def, bool bracket );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-dump/vdb-dump.c b/tools/vdb-dump/vdb-dump.c
new file mode 100644
index 0000000..fe5eff4
--- /dev/null
+++ b/tools/vdb-dump/vdb-dump.c
@@ -0,0 +1,2351 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+#include <vdb/dependencies.h>
+#include <vdb/vdb-priv.h>
+
+#include <kdb/table.h>
+#include <kdb/column.h>
+#include <kdb/manager.h>
+#include <kdb/namelist.h>
+#include <kdb/meta.h>
+
+#include <kfs/directory.h>
+#include <kns/manager.h>
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/args-conv.h>
+
+#include <klib/container.h>
+#include <klib/vector.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/debug.h>
+#include <klib/status.h>
+#include <klib/text.h>
+#include <klib/printf.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/time.h>
+#include <klib/num-gen.h>
+
+#include <os-native.h>
+#include <sysalloc.h>
+
+#include <stdlib.h>
+#include <bitstr.h>
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-coldefs.h"
+#include "vdb-dump-tools.h"
+#include "vdb-dump-helper.h"
+#include "vdb-dump-row-context.h"
+#include "vdb-dump-formats.h"
+#include "vdb-dump-fastq.h"
+#include "vdb-dump-redir.h"
+#include "vdb-dump-bin.h"
+#include "vdb-dump-interact.h"
+#include "vdb_info.h"
+
+static const char * row_id_on_usage[] = { "print row id", NULL };
+static const char * line_feed_usage[] = { "line-feed's inbetween rows", NULL };
+static const char * colname_off_usage[] = { "do not print column-names", NULL };
+static const char * in_hex_usage[] = { "print numbers in hex", NULL };
+static const char * table_usage[] = { "table-name", NULL };
+static const char * rows_usage[] = { "rows (default = all)", NULL };
+static const char * columns_usage[] = { "columns (default = all)", NULL };
+static const char * schema_usage[] = { "schema-name", NULL };
+static const char * schema_dump_usage[] = { "dumps the schema", NULL };
+static const char * table_enum_usage[] = { "enumerates tables", NULL };
+static const char * column_enum_usage[] = { "enumerates columns in extended form", NULL };
+static const char * column_short_usage[] = { "enumerates columns in short form", NULL };
+static const char * dna_bases_usage[] = { "print dna-bases", NULL };
+static const char * max_line_len_usage[] = { "limits line length", NULL };
+static const char * line_indent_usage[] = { "indents the line", NULL };
+static const char * filter_usage[] = { "filters lines", NULL };
+static const char * format_usage[] = { "output format:", NULL };
+static const char * id_range_usage[] = { "prints id-range", NULL };
+static const char * without_sra_usage[] = { "without sra-type-translation", NULL };
+static const char * excluded_columns_usage[] = { "exclude these columns", NULL };
+static const char * boolean_usage[] = { "defines how boolean's are printed (1,T)", NULL };
+static const char * objver_usage[] = { "request vdb-version", NULL };
+static const char * objts_usage[] = { "request object modification date", NULL };
+static const char * numelem_usage[] = { "print only element-count", NULL };
+static const char * numelemsum_usage[] = { "sum element-count", NULL };
+static const char * show_blobbing_usage[] = { "show blobbing", NULL };
+static const char * enum_phys_usage[] = { "enumerate physical columns", NULL };
+static const char * enum_readable_usage[] = { "enumerate readable columns", NULL };
+static const char * objtype_usage[] = { "report type of object", NULL };
+static const char * idx_enum_usage[] = { "enumerate all available index", NULL };
+static const char * idx_range_usage[] = { "enumerate values and row-ranges of one index", NULL };
+static const char * cur_cache_usage[] = { "size of cursor cache", NULL };
+static const char * out_file_usage[] = { "write output to this file", NULL };
+static const char * out_path_usage[] = { "write output to this directory", NULL };
+static const char * gzip_usage[] = { "compress output using gzip", NULL };
+static const char * bzip2_usage[] = { "compress output using bzip2", NULL };
+static const char * outbuf_size_usage[] = { "size of output-buffer, 0...none", NULL };
+static const char * disable_mt_usage[] = { "disable multithreading", NULL };
+static const char * info_usage[] = { "print info about run", NULL };
+static const char * spotgroup_usage[] = { "show spotgroups", NULL };
+static const char * merge_ranges_usage[] = { "merge and sort row-ranges", NULL };
+static const char * spread_usage[] = { "show spread of integer values", NULL };
+static const char * slice_usage[] = { "find a slice of given depth", NULL };
+static const char * interactive_usage[] = { "interactive mode", NULL };
+
+OptDef DumpOptions[] =
+{
+ { OPTION_ROW_ID_ON, ALIAS_ROW_ID_ON, NULL, row_id_on_usage, 1, false, false },
+ { OPTION_LINE_FEED, ALIAS_LINE_FEED, NULL, line_feed_usage, 1, true, false },
+ { OPTION_COLNAME_OFF, ALIAS_COLNAME_OFF, NULL, colname_off_usage, 1, false, false },
+ { OPTION_IN_HEX, ALIAS_IN_HEX, NULL, in_hex_usage, 1, false, false },
+ { OPTION_TABLE, ALIAS_TABLE, NULL, table_usage, 1, true, false },
+ { OPTION_ROWS, ALIAS_ROWS, NULL, rows_usage, 1, true, false },
+ { OPTION_COLUMNS, ALIAS_COLUMNS, NULL, columns_usage, 1, true, false },
+ { OPTION_SCHEMA, ALIAS_SCHEMA, NULL, schema_usage, 5, true, false },
+ { OPTION_SCHEMA_DUMP, ALIAS_SCHEMA_DUMP, NULL, schema_dump_usage, 1, false, false },
+ { OPTION_TABLE_ENUM, ALIAS_TABLE_ENUM, NULL, table_enum_usage, 1, false, false },
+ { OPTION_COLUMN_ENUM, ALIAS_COLUMN_ENUM, NULL, column_enum_usage, 1, false, false },
+ { OPTION_COLUMN_SHORT, ALIAS_COLUMN_SHORT, NULL, column_short_usage, 1, false, false },
+ { OPTION_DNA_BASES, ALIAS_DNA_BASES, NULL, dna_bases_usage, 1, false, false },
+ { OPTION_MAX_LINE_LEN, ALIAS_MAX_LINE_LEN, NULL, max_line_len_usage, 1, true, false },
+ { OPTION_LINE_INDENT, ALIAS_LINE_INDENT, NULL, line_indent_usage, 1, true, false },
+ { OPTION_FILTER, ALIAS_FILTER, NULL, filter_usage, 1, true, false },
+ { OPTION_FORMAT, ALIAS_FORMAT, NULL, format_usage, 1, true, false },
+ { OPTION_ID_RANGE, ALIAS_ID_RANGE, NULL, id_range_usage, 1, false, false },
+ { OPTION_WITHOUT_SRA, ALIAS_WITHOUT_SRA, NULL, without_sra_usage, 1, false, false },
+ { OPTION_EXCLUDED_COLUMNS, ALIAS_EXCLUDED_COLUMNS, NULL, excluded_columns_usage, 1, true, false },
+ { OPTION_BOOLEAN, ALIAS_BOOLEAN, NULL, boolean_usage, 1, true, false },
+ { OPTION_NUMELEM, ALIAS_NUMELEM, NULL, numelem_usage, 1, false, false },
+ { OPTION_NUMELEMSUM, ALIAS_NUMELEMSUM, NULL, numelemsum_usage, 1, false, false },
+ { OPTION_SHOW_BLOBBING, NULL, NULL, show_blobbing_usage, 1, false, false },
+ { OPTION_ENUM_PHYS, NULL, NULL, enum_phys_usage, 1, false, false },
+ { OPTION_ENUM_READABLE, NULL, NULL, enum_readable_usage, 1, false, false },
+ { OPTION_OBJVER, ALIAS_OBJVER, NULL, objver_usage, 1, false, false },
+ { OPTION_OBJTS, NULL, NULL, objts_usage, 1, false, false },
+ { OPTION_OBJTYPE, ALIAS_OBJTYPE, NULL, objtype_usage, 1, false, false },
+ { OPTION_IDX_ENUM, NULL, NULL, idx_enum_usage, 1, false, false },
+ { OPTION_IDX_RANGE, NULL, NULL, idx_range_usage, 1, true, false },
+ { OPTION_CUR_CACHE, NULL, NULL, cur_cache_usage, 1, true, false },
+ { OPTION_OUT_FILE, NULL, NULL, out_file_usage, 1, true, false },
+ { OPTION_OUT_PATH, NULL, NULL, out_path_usage, 1, true, false },
+ { OPTION_PHASE, NULL, NULL, NULL, 1, true, false },
+ { OPTION_GZIP, NULL, NULL, gzip_usage, 1, false, false },
+ { OPTION_BZIP2, NULL, NULL, bzip2_usage, 1, false, false },
+ { OPTION_OUT_BUF_SIZE, NULL, NULL, outbuf_size_usage, 1, true, false },
+ { OPTION_NO_MULTITHREAD, NULL, NULL, disable_mt_usage, 1, false, false },
+ { OPTION_INFO, NULL, NULL, info_usage, 1, false, false },
+ { OPTION_DIFF, NULL, NULL, NULL, 1, false, false },
+ { OPTION_SPOTGROUPS, NULL, NULL, spotgroup_usage, 1, false, false },
+ { OPTION_MERGE_RANGES, NULL, NULL, merge_ranges_usage, 1, false, false },
+ { OPTION_SPREAD, NULL, NULL, spread_usage, 1, false, false },
+ { OPTION_INTERACTIVE, NULL, NULL, interactive_usage, 1, false, false },
+ { OPTION_SLICE, NULL, NULL, slice_usage, 1, true, false }
+};
+
+const char UsageDefaultName[] = "vdb-dump";
+
+
+rc_t CC UsageSummary ( const char * progname )
+{
+ return KOutMsg ("\n"
+ "Usage:\n"
+ " %s <path> [<path> ...] [options]\n"
+ "\n", progname);
+}
+
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if ( args == NULL )
+ rc = RC ( rcApp, rcArgv, rcAccessing, rcSelf, rcNull );
+ else
+ rc = ArgsProgram ( args, &fullpath, &progname );
+
+ if ( rc )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( "Options:\n" );
+
+ HelpOptionLine ( ALIAS_ROW_ID_ON, OPTION_ROW_ID_ON, NULL, row_id_on_usage );
+ HelpOptionLine ( ALIAS_LINE_FEED, OPTION_LINE_FEED, "line_feed", line_feed_usage );
+ HelpOptionLine ( ALIAS_COLNAME_OFF, OPTION_COLNAME_OFF, NULL, colname_off_usage );
+ HelpOptionLine ( ALIAS_IN_HEX, OPTION_IN_HEX, NULL, in_hex_usage );
+ HelpOptionLine ( ALIAS_TABLE, OPTION_TABLE, "table", table_usage );
+ HelpOptionLine ( ALIAS_ROWS, OPTION_ROWS, "rows", rows_usage );
+ HelpOptionLine ( ALIAS_COLUMNS, OPTION_COLUMNS, "columns", columns_usage );
+ HelpOptionLine ( ALIAS_SCHEMA, OPTION_SCHEMA, "schema", schema_usage );
+ HelpOptionLine ( ALIAS_SCHEMA_DUMP, OPTION_SCHEMA_DUMP, NULL, schema_dump_usage );
+ HelpOptionLine ( ALIAS_TABLE_ENUM, OPTION_TABLE_ENUM, NULL, table_enum_usage );
+ HelpOptionLine ( ALIAS_COLUMN_ENUM, OPTION_COLUMN_ENUM, NULL, column_enum_usage );
+ HelpOptionLine ( ALIAS_COLUMN_SHORT, OPTION_COLUMN_SHORT, NULL, column_short_usage );
+ HelpOptionLine ( ALIAS_DNA_BASES, OPTION_DNA_BASES, "dna_bases", dna_bases_usage );
+ HelpOptionLine ( ALIAS_MAX_LINE_LEN, OPTION_MAX_LINE_LEN, "max_length", max_line_len_usage );
+ HelpOptionLine ( ALIAS_LINE_INDENT, OPTION_LINE_INDENT, "indent_width", line_indent_usage );
+ HelpOptionLine ( ALIAS_FORMAT, OPTION_FORMAT, "format", format_usage );
+
+ KOutMsg( " csv ..... comma separated values on one line\n" );
+ KOutMsg( " xml ..... xml-style without complete xml-frame\n" );
+ KOutMsg( " json .... json-style\n" );
+ KOutMsg( " piped ... 1 line per cell: row-id, column-name: value\n" );
+ KOutMsg( " tab ..... 1 line per row: tab-separated values only\n" );
+ KOutMsg( " fastq ... FASTQ( 4 lines ) for each row\n" );
+ KOutMsg( " fastq1 .. FASTQ( 4 lines ) for each fragment\n" );
+ KOutMsg( " fasta ... FASTA( 2 lines ) for each fragment if possible\n" );
+ KOutMsg( " fasta1 .. one FASTA-record for the whole accession (REFSEQ)\n" );
+ KOutMsg( " fasta2 .. one FASTA-record for each REFERENCE in cSRA\n" );
+ KOutMsg( " qual .... QUAL( 2 lines ) for each row\n" );
+ KOutMsg( " qual1 ... QUAL( 2 lines ) for each fragment if possible\n\n" );
+
+ HelpOptionLine ( ALIAS_ID_RANGE, OPTION_ID_RANGE, NULL, id_range_usage );
+ HelpOptionLine ( ALIAS_WITHOUT_SRA, OPTION_WITHOUT_SRA, NULL, without_sra_usage );
+ HelpOptionLine ( ALIAS_EXCLUDED_COLUMNS, OPTION_EXCLUDED_COLUMNS,NULL, excluded_columns_usage );
+ HelpOptionLine ( ALIAS_BOOLEAN, OPTION_BOOLEAN, NULL, boolean_usage );
+ HelpOptionLine ( ALIAS_OBJVER, OPTION_OBJVER, NULL, objver_usage );
+ HelpOptionLine ( NULL, OPTION_OBJTS, NULL, objts_usage );
+ HelpOptionLine ( ALIAS_OBJTYPE, OPTION_OBJTYPE, NULL, objtype_usage );
+ HelpOptionLine ( ALIAS_NUMELEM, OPTION_NUMELEM, NULL, numelem_usage );
+ HelpOptionLine ( ALIAS_NUMELEMSUM, OPTION_NUMELEMSUM, NULL, numelemsum_usage );
+ HelpOptionLine ( NULL, OPTION_SHOW_BLOBBING, NULL, show_blobbing_usage );
+ HelpOptionLine ( NULL, OPTION_ENUM_PHYS, NULL, enum_phys_usage );
+ HelpOptionLine ( NULL, OPTION_ENUM_READABLE, NULL, enum_readable_usage );
+ HelpOptionLine ( NULL, OPTION_IDX_ENUM, NULL, idx_enum_usage );
+ HelpOptionLine ( NULL, OPTION_IDX_RANGE, NULL, idx_range_usage );
+ HelpOptionLine ( NULL, OPTION_CUR_CACHE, NULL, cur_cache_usage );
+ HelpOptionLine ( NULL, OPTION_OUT_FILE, NULL, out_file_usage );
+ HelpOptionLine ( NULL, OPTION_OUT_PATH, NULL, out_path_usage );
+ HelpOptionLine ( NULL, OPTION_GZIP, NULL, gzip_usage );
+ HelpOptionLine ( NULL, OPTION_BZIP2, NULL, bzip2_usage );
+ HelpOptionLine ( NULL, OPTION_OUT_BUF_SIZE, NULL, outbuf_size_usage );
+ HelpOptionLine ( NULL, OPTION_NO_MULTITHREAD, NULL, disable_mt_usage );
+ HelpOptionLine ( NULL, OPTION_INFO, NULL, info_usage );
+ HelpOptionLine ( NULL, OPTION_SPOTGROUPS, NULL, spotgroup_usage );
+ HelpOptionLine ( NULL, OPTION_MERGE_RANGES, NULL, merge_ranges_usage );
+ HelpOptionLine ( NULL, OPTION_SPREAD, NULL, spread_usage );
+
+ HelpOptionsStandard ();
+
+ HelpVersion ( fullpath, KAppVersion() );
+
+ return rc;
+}
+
+/*************************************************************************************
+ read_cell_data_and_dump:
+ * called by "dump_rows()" via VectorForEach() for every column in a row
+ * extracts the column-definition from the item, the row-context from the data-ptr
+ * clears the column-text-buffer (part of the column-data-struct)
+ * reads the cell-data from the cursor
+ * eventually detects a unknown data-type
+ * detects if this column has a dna-format ( special treatment for printing )
+ * loops throuh the elements of a cell
+ - calls "dump_element()" for every element (from vdb-dump-tools.c)
+
+item [IN] ... pointer to col-data ( definition and buffer )
+data [IN] ... pointer to row-context( cursor, dump_context, col_defs ... )
+*************************************************************************************/
+static void CC vdm_read_cell_data( void *item, void *data )
+{
+ dump_src src; /* defined in vdb-dump-tools.h */
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( r_ctx->rc != 0 ) return; /* important to stop if the last read was not successful */
+ vds_clear( &(my_col_def->content) ); /* clear the destination-dump-string */
+ if ( my_col_def->valid == false ) return;
+ if ( my_col_def->excluded == true ) return;
+
+ /* read the data of a cursor-cell: buffer-addr, offset and element-count
+ is stored in the dump_src-struct */
+ r_ctx->rc = VCursorCellData( r_ctx->cursor, my_col_def->idx, NULL, &src.buf,
+ &src.offset_in_bits, &src.number_of_elements );
+ if ( r_ctx->rc != 0 )
+ {
+ if ( UIError( r_ctx->rc, NULL, r_ctx->table ) )
+ {
+ UITableLOGError( r_ctx->rc, r_ctx->table, true );
+ }
+ else
+ {
+ PLOGERR( klogInt,
+ (klogInt,
+ r_ctx->rc,
+ "VCursorCellData( col:$(col_name) at row #$(row_nr) ) failed",
+ "col_name=%s,row_nr=%lu",
+ my_col_def->name, r_ctx->row_id ));
+ /* be forgiving and continue if a cell cannot be read */
+ }
+ r_ctx->rc = 0;
+ }
+
+ /* check the type-domain */
+ if ( ( my_col_def->type_desc.domain < vtdBool )||
+ ( my_col_def->type_desc.domain > vtdUnicode ) )
+ {
+ vds_append_str( &(my_col_def->content), "unknown data-type" );
+ }
+ else
+ {
+ bool print_comma = true;
+ bool sra_dump_format;
+
+ /* initialize the element-idx ( for dimension > 1 ) */
+ src.element_idx = 0;
+
+ /* transfer context-flags (hex-print, no sra-types) */
+ src.in_hex = r_ctx->ctx->print_in_hex;
+ src.without_sra_types = r_ctx->ctx->without_sra_types;
+
+ /* special treatment to suppress spaces between values */
+ sra_dump_format = ( r_ctx->ctx->format == df_sra_dump );
+
+ /* hardcoded printing of dna-bases if the column-type fits */
+ src.print_dna_bases = ( r_ctx->ctx->print_dna_bases &
+ ( my_col_def->type_desc.intrinsic_dim == 2 ) &
+ ( my_col_def->type_desc.intrinsic_bits == 1 ) );
+
+ /* how a boolean is displayed */
+ src.c_boolean = r_ctx->ctx->c_boolean;
+
+ if ( my_col_def->type_desc.domain == vtdBool && src.c_boolean != 0 )
+ {
+ print_comma = false;
+ }
+
+ if ( r_ctx->ctx->print_num_elem )
+ {
+ char temp[ 16 ];
+ size_t num_writ;
+
+ r_ctx->rc = string_printf ( temp, sizeof temp, &num_writ, "%u", src.number_of_elements );
+ if ( r_ctx->rc == 0 )
+ vds_append_str( &(my_col_def->content), temp );
+ }
+ else if ( r_ctx->ctx->sum_num_elem )
+ {
+ my_col_def->elementsum += src.number_of_elements;
+ }
+ else
+ {
+ /* loop through the elements(dimension's) of a cell */
+ while( ( src.element_idx < src.number_of_elements )&&( r_ctx->rc == 0 ) )
+ {
+ uint32_t eidx = src.element_idx;
+ if ( ( eidx > 0 )&& ( src.print_dna_bases == false ) && print_comma )
+ {
+ if ( sra_dump_format )
+ vds_append_str( &(my_col_def->content), "," );
+ else
+ vds_append_str( &(my_col_def->content), ", " );
+ }
+
+ /* dumps the basic data-types, implementation in vdb-dump-tools.c
+ >>> that means it appends the element-string to
+ my_col_def->content <<<
+ the formated output is only collected, to be printed later
+ dump_element is also responsible for incrementing
+ the src.element_idx by: 1...bool/int/uint/float
+ n...string/unicode-string */
+ r_ctx->rc = vdt_dump_element( &src, my_col_def, !sra_dump_format );
+
+ /* insurance against endless loop */
+ if ( eidx == src.element_idx )
+ {
+ src.element_idx++;
+ }
+ }
+ }
+ }
+}
+
+
+
+static void CC vdm_print_elem_sum( void *item, void *data )
+{
+ char temp[ 16 ];
+ size_t num_writ;
+ p_col_def my_col_def = (p_col_def)item;
+ p_row_context r_ctx = (p_row_context)data;
+
+ if ( r_ctx->rc != 0 ) return; /* important to stop if the last read was not successful */
+ vds_clear( &(my_col_def->content) ); /* clear the destination-dump-string */
+
+ r_ctx->rc = string_printf ( temp, sizeof temp, &num_writ, "%u", my_col_def->elementsum );
+ if ( r_ctx->rc == 0 )
+ vds_append_str( &(my_col_def->content), temp );
+}
+
+
+static void vdm_row_error( const char * fmt, rc_t rc, uint64_t row_id )
+{
+ PLOGERR( klogInt, ( klogInt, rc, fmt, "row_nr=%lu", row_id ) );
+
+}
+
+/*************************************************************************************
+ dump_rows:
+ * is the main loop to dump all rows or all selected rows ( -R1-10 )
+ * creates a dump-string ( parameterizes it with the wanted max. line-len )
+ * starts the number-generator
+ * as long as the number-generator has a number and the result-code is ok
+ do for every row-id:
+ - set the row-id into the cursor and open the cursor-row
+ - loop throuh the columns
+ - close the row
+ - call print_row (vdb-dump-formats.c) which actually prints the row
+ * the collection of the text's for the columns "read_cell_data_and_dump()"
+ is separated from the actual printing "print_row()" !
+
+r_ctx [IN] ... row-context ( cursor, dump_context, col_defs ... )
+*************************************************************************************/
+static rc_t vdm_dump_rows( p_row_context r_ctx )
+{
+ /* the important row_id is a member of r_ctx ! */
+ r_ctx->rc = vds_make( &(r_ctx->s_col), r_ctx->ctx->max_line_len, 512 );
+ if ( r_ctx->rc != 0 )
+ vdm_row_error( "dump_str_make( row#$(row_nr) ) failed", r_ctx->rc, r_ctx->row_id );
+ else
+ {
+ const struct num_gen_iter * iter;
+
+ r_ctx->rc = num_gen_iterator_make( r_ctx->ctx->rows, &iter );
+ if ( r_ctx->rc != 0 )
+ vdm_row_error( "num_gen_iterator_make( row#$(row_nr) ) failed", r_ctx->rc, r_ctx->row_id );
+ else
+ {
+ while ( ( r_ctx->rc == 0 ) && num_gen_iterator_next( iter, &(r_ctx->row_id), &(r_ctx->rc) ) )
+ {
+ if ( r_ctx-> rc == 0 )
+ r_ctx-> rc = Quitting();
+ if ( r_ctx->rc != 0 )
+ break;
+ r_ctx->rc = VCursorSetRowId( r_ctx->cursor, r_ctx->row_id );
+ if ( r_ctx->rc != 0 )
+ {
+ vdm_row_error( "VCursorSetRowId( row#$(row_nr) ) failed",
+ r_ctx->rc, r_ctx->row_id );
+ }
+ else
+ {
+ r_ctx->rc = VCursorOpenRow( r_ctx->cursor );
+ if ( r_ctx->rc != 0 )
+ {
+ vdm_row_error( "VCursorOpenRow( row#$(row_nr) ) failed",
+ r_ctx->rc, r_ctx->row_id );
+ }
+ else
+ {
+ /* first reset the string and valid-flag for every column */
+ vdcd_reset_content( r_ctx->col_defs );
+
+ /* read the data of every column and create a string for it */
+ VectorForEach( &(r_ctx->col_defs->cols),
+ false, vdm_read_cell_data, r_ctx );
+
+ if ( r_ctx->rc == 0 )
+ {
+ /* prints the collected strings, in vdb-dump-formats.c */
+ if ( !r_ctx->ctx->sum_num_elem )
+ {
+ r_ctx->rc = vdfo_print_row( r_ctx );
+ if ( r_ctx->rc != 0 )
+ vdm_row_error( "vdfo_print_row( row#$(row_nr) ) failed",
+ r_ctx->rc, r_ctx->row_id );
+ }
+ }
+ r_ctx->rc = VCursorCloseRow( r_ctx->cursor );
+ if ( r_ctx->rc != 0 )
+ vdm_row_error( "VCursorCloseRow( row#$(row_nr) ) failed",
+ r_ctx->rc, r_ctx->row_id );
+ }
+ }
+ }
+ }
+ num_gen_iterator_destroy( iter );
+
+ if ( r_ctx->rc == 0 && r_ctx->ctx->sum_num_elem )
+ {
+ VectorForEach( &( r_ctx->col_defs->cols ), false, vdm_print_elem_sum, r_ctx );
+ if ( r_ctx->rc == 0 )
+ {
+ r_ctx->rc = vdfo_print_row( r_ctx );
+ DISP_RC( r_ctx->rc, "VTableOpenSchema() failed" );
+ }
+ }
+
+ vds_free( &(r_ctx->s_col) );
+ }
+ return r_ctx->rc;
+}
+
+
+static uint32_t vdm_extract_or_parse_columns( const p_dump_context ctx,
+ const VTable *my_table,
+ p_col_defs my_col_defs )
+{
+ uint32_t count = 0;
+ if ( ctx != NULL && my_col_defs != NULL )
+ {
+ bool cols_unknown = ( ( ctx->columns == NULL ) || ( string_cmp( ctx->columns, 1, "*", 1, 1 ) == 0 ) );
+ if ( cols_unknown )
+ /* the user does not know the column-names or wants all of them */
+ count = vdcd_extract_from_table( my_col_defs, my_table );
+ else
+ /* the user knows the names of the wanted columns... */
+ count = vdcd_parse_string( my_col_defs, ctx->columns, my_table );
+
+ if ( ctx->excluded_columns != NULL )
+ vdcd_exclude_these_columns( my_col_defs, ctx->excluded_columns );
+ }
+
+ return count;
+}
+
+
+static bool vdm_extract_or_parse_phys_columns( const p_dump_context ctx,
+ const VTable *my_table,
+ p_col_defs my_col_defs )
+{
+ bool res = false;
+ if ( ctx != NULL && my_col_defs != NULL )
+ {
+ bool cols_unknown = ( ( ctx->columns == NULL ) || ( string_cmp( ctx->columns, 1, "*", 1, 1 ) == 0 ) );
+ if ( cols_unknown )
+ /* the user does not know the column-names or wants all of them */
+ res = vdcd_extract_from_phys_table( my_col_defs, my_table );
+ else
+ /* the user knows the names of the wanted columns... */
+ res = vdcd_parse_string( my_col_defs, ctx->columns, my_table );
+
+ if ( ctx->excluded_columns != NULL )
+ vdcd_exclude_these_columns( my_col_defs, ctx->excluded_columns );
+ }
+
+ return res;
+}
+
+/*************************************************************************************
+ dump_tab_table:
+ * called by "dump_db_table()" and "dump_tab()" as a fkt-pointer
+ * opens a cursor to read
+ * checks if the user did not specify columns, or wants all columns ( "*" )
+ no columns specified ---> calls "col_defs_extract_from_table()"
+ columns specified ---> calls "col_defs_parse_string()"
+ * we end up with a list of column-definitions (name,type) in my_col_defs
+ * calls "col_defs_add_to_cursor()" to add them to the cursor
+ * opens the cursor
+ * calls "dump_rows()" to execute the dump
+ * destroys the my_col_defs - structure
+ * releases the cursor
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_table [IN] ... open table needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_dump_opened_table( const p_dump_context ctx, const VTable *my_table )
+{
+ rc_t rc;
+
+ if ( ctx->format == df_bin )
+ {
+ rc = vdi_dump_opened_table( ctx, my_table ); /* from vdb-dump-bin.c */
+ }
+ else
+ {
+ row_context r_ctx;
+
+ rc = VTableCreateCachedCursorRead( my_table, &(r_ctx.cursor), ctx->cur_cache_size );
+ DISP_RC( rc, "VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ r_ctx.table = my_table;
+ if ( !vdcd_init( &(r_ctx.col_defs), ctx->max_line_len ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ DISP_RC( rc, "col_defs_init() failed" );
+ }
+
+ if ( rc == 0 )
+ {
+ uint32_t n = vdm_extract_or_parse_columns( ctx, my_table, r_ctx.col_defs );
+ if ( n < 1 )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ else
+ {
+ n = vdcd_add_to_cursor( r_ctx.col_defs, r_ctx.cursor );
+ if ( n < 1 )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ else
+ {
+ const VSchema *my_schema;
+ rc = VTableOpenSchema( my_table, &my_schema );
+ DISP_RC( rc, "VTableOpenSchema() failed" );
+ if ( rc == 0 )
+ {
+ /* translate in special columns to numeric values to strings */
+ vdcd_ins_trans_fkt( r_ctx.col_defs, my_schema );
+ VSchemaRelease( my_schema );
+ }
+
+ rc = VCursorOpen( r_ctx.cursor );
+ DISP_RC( rc, "VCursorOpen() failed" );
+ if ( rc == 0 )
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange( r_ctx.cursor, 0, &first, &count );
+ DISP_RC( rc, "VCursorIdRange() failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->rows == NULL )
+ {
+ /* if the user did not specify a row-range, take all rows */
+ rc = num_gen_make_from_range( &ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_make_from_range() failed" );
+ }
+ else
+ {
+ /* if the user did specify a row-range, check the boundaries */
+ if ( count > 0 )
+ {
+ /* trim only if the row-range is not zero, otherwise
+ we will not get data if the user specified only static columns
+ because they report a row-range of zero! */
+ rc = num_gen_trim( ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_trim() failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( num_gen_empty( ctx->rows ) )
+ {
+ rc = RC( rcExe, rcDatabase, rcReading, rcRange, rcEmpty );
+ }
+ else
+ {
+ r_ctx.ctx = ctx;
+ rc = vdm_dump_rows( &r_ctx ); /* <--- */
+ }
+ }
+ }
+ }
+ }
+ }
+ vdcd_destroy( r_ctx.col_defs );
+ }
+ VCursorRelease( r_ctx.cursor );
+ }
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ dump_db_table:
+ * called by "dump_database()" as a fkt-pointer
+ * opens a table to read
+ * calls "dump_tab_table()" to do the dump
+ * releases the table
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_walk_sections( const VDatabase * base_db, const VDatabase ** sub_db,
+ const VNamelist * sections, uint32_t count )
+{
+ rc_t rc = 0;
+ const VDatabase * parent_db = base_db;
+ if ( count == 0 )
+ {
+ rc = VDatabaseAddRef ( parent_db );
+ DISP_RC( rc, "VDatabaseAddRef() failed" );
+ }
+ else
+ {
+ uint32_t idx;
+ for ( idx = 0; rc == 0 && idx < count; ++idx )
+ {
+ const char * dbname;
+ rc = VNameListGet ( sections, idx, &dbname );
+ DISP_RC( rc, "VNameListGet() failed" );
+ if ( rc == 0 )
+ {
+ const VDatabase * temp;
+ rc = VDatabaseOpenDBRead ( parent_db, &temp, "%s", dbname );
+ DISP_RC( rc, "VDatabaseOpenDBRead() failed" );
+ if ( rc == 0 && idx > 0 )
+ {
+ rc = VDatabaseRelease ( parent_db );
+ DISP_RC( rc, "VDatabaseRelease() failed" );
+ }
+ if ( rc == 0 )
+ parent_db = temp;
+ }
+ }
+ }
+
+ if ( rc == 0 ) *sub_db = parent_db;
+ return rc;
+}
+
+
+static void vdm_clear_recorded_errors( void )
+{
+ rc_t rc;
+ const char * filename;
+ const char * funcname;
+ uint32_t line_nr;
+ while ( GetUnreadRCInfo ( &rc, &filename, &funcname, &line_nr ) )
+ {
+ }
+}
+
+
+static rc_t vdm_check_table_empty( const VTable * tab )
+{
+ bool empty;
+ rc_t rc = VTableIsEmpty( tab, &empty );
+ DISP_RC( rc, "VTableIsEmpty() failed" );
+ if ( rc == 0 && empty )
+ {
+ vdm_clear_recorded_errors();
+ KOutMsg( "the requested table is empty!\n" );
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcTable, rcEmpty );
+ }
+ return rc;
+}
+
+static rc_t vdm_open_table_by_path( const VDatabase * db, const char * path, const VTable ** tab )
+{
+ VNamelist * sections;
+ rc_t rc = vds_path_to_sections( path, '.', §ions );
+ DISP_RC( rc, "vds_path_to_sections() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = VNameListCount ( sections, &count );
+ DISP_RC( rc, "VNameListCount() failed" );
+ if ( rc == 0 && count > 0 )
+ {
+ const VDatabase * sub_db;
+ rc = vdm_walk_sections( db, &sub_db, sections, count - 1 );
+ if ( rc == 0 )
+ {
+ const char * tabname;
+ rc = VNameListGet ( sections, count - 1, &tabname );
+ DISP_RC( rc, "VNameListGet() failed" );
+ if ( rc == 0 )
+ {
+ rc = VDatabaseOpenTableRead( sub_db, tab, "%s", tabname );
+ DISP_RC( rc, "VDatabaseOpenTableRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdm_check_table_empty( *tab );
+ if ( rc != 0 )
+ {
+ VTableRelease( *tab );
+ tab = NULL;
+ }
+ }
+ }
+ VDatabaseRelease ( sub_db );
+ }
+ }
+ VNamelistRelease ( sections );
+ }
+ return rc;
+}
+
+static rc_t vdm_dump_opened_database( const p_dump_context ctx,
+ const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_dump_opened_table( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+/* ********************************************************************** */
+
+static rc_t vdm_show_tab_spread( const p_dump_context ctx,
+ const VTable *my_table )
+{
+ const VCursor * cursor;
+ rc_t rc = VTableCreateCachedCursorRead( my_table, &cursor, ctx->cur_cache_size );
+ DISP_RC( rc, "VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ col_defs * cols;
+ if ( !vdcd_init( &cols, ctx->max_line_len ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ DISP_RC( rc, "col_defs_init() failed" );
+ }
+ if ( rc == 0 )
+ {
+ uint32_t n = vdm_extract_or_parse_columns( ctx, my_table, cols );
+ if ( n < 1 )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ else
+ {
+ n = vdcd_add_to_cursor( cols, cursor );
+ if ( n < 1 )
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcInvalid );
+ else
+ {
+ rc = VCursorOpen( cursor );
+ DISP_RC( rc, "VCursorOpen() failed" );
+ if ( rc == 0 )
+ {
+ int64_t first;
+ uint64_t count;
+ rc = VCursorIdRange( cursor, 0, &first, &count );
+ DISP_RC( rc, "VCursorIdRange( spread ) failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->rows == NULL )
+ {
+ rc = num_gen_make_from_range( &ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_make_from_range() failed" );
+ }
+ else
+ {
+ if ( count > 0 )
+ {
+ rc = num_gen_trim( ctx->rows, first, count );
+ DISP_RC( rc, "num_gen_trim() failed" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ if ( num_gen_empty( ctx->rows ) )
+ rc = RC( rcExe, rcDatabase, rcReading, rcRange, rcEmpty );
+ else
+ rc = vdcd_collect_spread( ctx->rows, cols, cursor ); /* is in vdb-dump-coldefs.c */
+ }
+ }
+ }
+ }
+ }
+ vdcd_destroy( cols );
+ }
+ VCursorRelease( cursor );
+ }
+ return rc;
+}
+
+static rc_t vdm_show_db_spread( const p_dump_context ctx,
+ const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_show_tab_spread( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+/* ********************************************************************** */
+
+/********************************************************************
+helper function, needed by "VSchemaDump()"
+********************************************************************/
+static rc_t CC vdm_schema_dump_flush( void *dst, const void *buffer, size_t bsize )
+{
+ FILE *f = dst;
+ fwrite( buffer, 1, bsize, f );
+ return 0;
+}
+
+/*************************************************************************************
+ dump_the_tab_schema:
+ * called by "dump_the_db_schema()" and "dump_table()" as a function pointer
+ * opens the schema of a table
+ * calls "VSchemaDump()" to dump this schema
+ * releases the schema
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_dump_tab_schema( const p_dump_context ctx,
+ const VTable *my_table )
+{
+ const VSchema * my_schema;
+ rc_t rc = VTableOpenSchema( my_table, &my_schema );
+ DISP_RC( rc, "VTableOpenSchema() failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->columns == NULL )
+ {
+ /* the user did not ask to inspect a specific object, we look for
+ the Typespec of the table... */
+ char buffer[ 4096 ];
+ rc = VTableTypespec ( my_table, buffer, sizeof buffer );
+ DISP_RC( rc, "VTableTypespec() failed" );
+ if ( rc == 0 )
+ rc = VSchemaDump( my_schema, sdmPrint, buffer,
+ vdm_schema_dump_flush, stdout );
+
+ }
+ else
+ {
+ /* the user did ask to inspect a specific object */
+ rc = VSchemaDump( my_schema, sdmPrint, ctx->columns,
+ vdm_schema_dump_flush, stdout );
+ }
+ DISP_RC( rc, "VSchemaDump() failed" );
+ VSchemaRelease( my_schema );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ dump_the_db_schema:
+ * called by "dump_database()" as a function pointer
+ * opens a table to read
+ * calls "dump_the_tab_schema()" to dump the schema of this table
+ * releases the table
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_dump_db_schema( const p_dump_context ctx,
+ const VDatabase *my_database )
+{
+ rc_t rc = 0;
+ if ( ctx->table_defined )
+ {
+ /* the user has given a database as object, but asks to inspect a given table */
+ const VTable *my_table;
+ rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_dump_tab_schema( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ }
+ else
+ {
+ /* the user has given a database as object, but did not ask for a specific table */
+ const VSchema * my_schema;
+ rc = VDatabaseOpenSchema( my_database, &my_schema );
+ DISP_RC( rc, "VDatabaseOpenSchema() failed" );
+ if ( rc == 0 )
+ {
+ if ( ctx->columns == NULL )
+ {
+ /* the used did not ask to inspect a specifiy object, we look for
+ the Typespec of the database... */
+ char buffer[ 4096 ];
+ rc = VDatabaseTypespec ( my_database, buffer, sizeof buffer );
+ DISP_RC( rc, "VDatabaseTypespec() failed" );
+ if ( rc == 0 )
+ rc = VSchemaDump( my_schema, sdmPrint, buffer,
+ vdm_schema_dump_flush, stdout );
+ }
+ else
+ {
+ /* the user did ask to inspect a specific object */
+ rc = VSchemaDump( my_schema, sdmPrint, ctx->columns,
+ vdm_schema_dump_flush, stdout );
+ }
+ DISP_RC( rc, "VSchemaDump() failed" );
+ VSchemaRelease( my_schema );
+ }
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ enum_tables:
+ * called by "dump_database()" as a function pointer
+ * calls VDatabaseListTbl() to get a list of Tables
+ * loops through this list to print the names
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_enum_sub_dbs_and_tabs( const VDatabase * db, uint32_t indent );
+
+static rc_t vdm_report_tab_or_db( const VDatabase * db, const KNamelist * list,
+ const char * prefix, uint32_t indent )
+{
+ uint32_t n;
+ rc_t rc = KNamelistCount( list, &n );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ const char * entry;
+ rc = KNamelistGet( list, i, &entry );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "%*s : %s\n", indent + 3, prefix, entry );
+ if ( rc == 0 && db != NULL )
+ {
+ const VDatabase * sub_db;
+ rc = VDatabaseOpenDBRead ( db, &sub_db, entry );
+ DISP_RC( rc, "VDatabaseOpenDBRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = vdm_enum_sub_dbs_and_tabs( sub_db, indent + 3 ); /* recursion here... */
+ VDatabaseRelease( sub_db );
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+static rc_t vdm_enum_tabs_of_db( const VDatabase * db, uint32_t indent )
+{
+ KNamelist *tbl_names;
+ rc_t rc = VDatabaseListTbl( db, &tbl_names );
+ if ( rc == 0 )
+ {
+ rc = vdm_report_tab_or_db( NULL, tbl_names, "tbl", indent );
+ KNamelistRelease( tbl_names );
+ }
+ else
+ {
+ rc = 0;
+ }
+ return rc;
+}
+
+static rc_t vdm_enum_sub_dbs_of_db( const VDatabase * db, uint32_t indent )
+{
+ KNamelist *db_names;
+ rc_t rc = VDatabaseListDB( db, &db_names );
+ if ( rc == 0 )
+ {
+ rc = vdm_report_tab_or_db( db, db_names, "db ", indent );
+ KNamelistRelease( db_names );
+ }
+ else
+ {
+ rc = 0;
+ }
+ return rc;
+}
+
+static rc_t vdm_enum_sub_dbs_and_tabs( const VDatabase * db, uint32_t indent )
+{
+ rc_t rc = vdm_enum_sub_dbs_of_db( db, indent );
+ if ( rc == 0 )
+ rc = vdm_enum_tabs_of_db( db, indent );
+ return rc;
+}
+
+static rc_t vdm_enum_tables( const p_dump_context ctx, const VDatabase * db )
+{
+ rc_t rc = KOutMsg( "enumerating the tables of database '%s'\n", ctx->path );
+ if ( rc == 0 )
+ rc = vdm_enum_sub_dbs_and_tabs( db, 0 );
+ return rc;
+}
+
+
+typedef struct col_info_context
+{
+ p_dump_context ctx;
+ const VSchema *my_schema;
+ const VTable *my_table;
+ const KTable *my_ktable;
+} col_info_context;
+typedef struct col_info_context* p_col_info_context;
+
+static rc_t vdm_print_column_datatypes( const p_col_def col_def,
+ const p_col_info_context ci )
+{
+ KNamelist *names;
+ uint32_t dflt_idx;
+
+ rc_t rc = VTableColumnDatatypes( ci->my_table, col_def->name, &dflt_idx, &names );
+ DISP_RC( rc, "VTableColumnDatatypes() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t n;
+ rc = KNamelistCount( names, &n );
+ DISP_RC( rc, "KNamelistCount() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < n && rc == 0; ++i )
+ {
+ const char *type_name;
+ rc = KNamelistGet( names, i, &type_name );
+ DISP_RC( rc, "KNamelistGet() failed" );
+ if ( rc == 0 )
+ {
+ if ( dflt_idx == i )
+ rc = KOutMsg( "%20s.type[%d] = %s (dflt)\n", col_def->name, i, type_name );
+ else
+ rc = KOutMsg( "%20s.type[%d] = %s\n", col_def->name, i, type_name );
+ }
+ }
+ }
+ rc = KNamelistRelease( names );
+ DISP_RC( rc, "KNamelistRelease() failed" );
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t vdm_show_row_blobbing( const p_col_def col_def,
+ const p_col_info_context ci )
+{
+ const KColumn * kcol;
+ rc_t rc = KTableOpenColumnRead( ci->my_ktable, &kcol, "%s", col_def->name );
+ if ( rc != 0 )
+ return KOutMsg( "'%s' is not a physical column\n", col_def->name );
+ else
+ rc = KOutMsg( "\nCOLUMN '%s':\n", col_def->name );
+
+ if ( rc == 0 )
+ {
+ int64_t first;
+ uint64_t count;
+ rc = KColumnIdRange( kcol, &first, &count );
+ DISP_RC( rc, "KColumnIdRange() failed" );
+ if ( rc == 0 )
+ {
+ int64_t last = first + count - 1;
+ rc = KOutMsg( "range: %,ld ... %,ld\n", first, last );
+ if ( rc == 0 )
+ {
+ int64_t id = first;
+ while ( id < last && rc == 0 )
+ {
+ const KColumnBlob *blob;
+ rc = KColumnOpenBlobRead( kcol, &blob, id );
+ DISP_RC( rc, "KColumnOpenBlobRead() failed" );
+ if ( rc == 0 )
+ {
+ int64_t first_id_in_blob;
+ uint32_t ids_in_blob;
+ rc = KColumnBlobIdRange( blob, &first_id_in_blob, &ids_in_blob );
+ DISP_RC( rc, "KColumnBlobIdRange() failed" );
+ if ( rc == 0 )
+ {
+ int64_t last_id_in_blob = first_id_in_blob + ids_in_blob - 1;
+ char buffer[ 8 ];
+ size_t num_read, remaining;
+ rc = KColumnBlobRead ( blob, 0, &buffer, 0, &num_read, &remaining );
+ DISP_RC( rc, "KColumnBlobRead() failed" );
+ if ( rc == 0 )
+ {
+ rc = KOutMsg( "blob[ %,ld ... %,ld] size = %,zu\n", first_id_in_blob, last_id_in_blob, remaining + num_read );
+ }
+ id = last_id_in_blob + 1;
+ }
+ KColumnBlobRelease( blob );
+ }
+ }
+ }
+ }
+ KColumnRelease( kcol );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ print_column_info:
+ * get's called from "enum_tab_columns()" via VectorForEach
+ * prints: table-name, col-idx, bits, dimension, domain and name
+ for every column
+
+item [IN] ... pointer to a column-definition-struct ( from "vdb-dump-coldefs.h" )
+data [IN] ... pointer to dump-context ( in this case to have a line-idx )
+*************************************************************************************/
+static rc_t vdm_print_column_info( const p_col_def col_def, p_col_info_context ci_ctx )
+{
+ rc_t rc = 0;
+
+ if ( ci_ctx->ctx->show_blobbing )
+ rc = vdm_show_row_blobbing( col_def, ci_ctx );
+ else
+ {
+ /* print_col_info is in vdb-dump-helper.c */
+ rc = vdh_print_col_info( ci_ctx->ctx , col_def, ci_ctx->my_schema );
+
+ /* to test VTableColumnDatatypes() */
+ if ( rc == 0 && ci_ctx->ctx->column_enum_requested )
+ rc = vdm_print_column_datatypes( col_def, ci_ctx );
+ }
+ return rc;
+}
+
+
+static rc_t vdm_enum_phys_columns( const VTable *my_table )
+{
+ rc_t rc = KOutMsg( "physical columns:\n" );
+ if ( rc == 0 )
+ {
+ KNamelist *phys;
+ rc = VTableListPhysColumns( my_table, &phys );
+ DISP_RC( rc, "VTableListPhysColumns() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( phys, &count );
+ DISP_RC( rc, "KNamelistCount( physical columns ) failed" );
+ if ( rc == 0 )
+ {
+ if ( count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * name;
+ rc = KNamelistGet( phys, idx, &name );
+ DISP_RC( rc, "KNamelistGet( physical columns ) failed" );
+ if ( rc == 0 )
+ rc = KOutMsg( "[%.02d] = %s\n", idx, name );
+ }
+ }
+ else
+ {
+ rc = KOutMsg( "... list is empty!\n" );
+ }
+ }
+ KNamelistRelease( phys );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdm_enum_readable_columns( const VTable *my_table )
+{
+ rc_t rc = KOutMsg( "readable columns:\n" );
+ if ( rc == 0 )
+ {
+ KNamelist *readable;
+ rc = VTableListReadableColumns( my_table, &readable );
+ DISP_RC( rc, "VTableListReadableColumns() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( readable, &count );
+ DISP_RC( rc, "KNamelistCount( readable columns ) failed" );
+ if ( rc == 0 )
+ {
+ if ( count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char * name;
+ rc = KNamelistGet( readable, idx, &name );
+ DISP_RC( rc, "KNamelistGet( readable columns ) failed" );
+ if ( rc == 0 )
+ rc = KOutMsg( "[%.02d] = %s\n", idx, name );
+ }
+ }
+ else
+ {
+ rc = KOutMsg( "... list is empty!\n" );
+ }
+ }
+ KNamelistRelease( readable );
+ }
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ enum_tab_columns:
+ * called by "enum_db_columns()" and "dump_table()" as fkt-pointer
+ * initializes a column-definitions-structure
+ * calls col_defs_extract_from_table() to enumerate all columns in the table
+ ( both functions are in "vdb-dump-coldefs.h" )
+ * loops through the columns and prints it's information
+ * releases the column-definitions-structure
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_enum_tab_columns( const p_dump_context ctx, const VTable *my_table )
+{
+ rc_t rc = 0;
+ if ( ctx->enum_phys )
+ {
+ rc = vdm_enum_phys_columns( my_table );
+ }
+ else if ( ctx->enum_readable )
+ {
+ rc = vdm_enum_readable_columns( my_table );
+ }
+ else
+ {
+ col_defs *my_col_defs;
+ if ( !vdcd_init( &my_col_defs, ctx->max_line_len ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ DISP_RC( rc, "col_defs_init() failed" );
+ }
+
+ if ( rc == 0 )
+ {
+ col_info_context ci_ctx;
+ bool extracted;
+
+ ci_ctx.ctx = ctx;
+ ci_ctx.my_table = my_table;
+ if ( ctx->show_blobbing )
+ {
+ extracted = vdm_extract_or_parse_phys_columns( ctx, my_table, my_col_defs );
+ rc = VTableOpenKTableRead( my_table, &ci_ctx.my_ktable );
+ DISP_RC( rc, "VTableOpenKTableRead() failed" );
+ }
+ else
+ {
+ extracted = vdm_extract_or_parse_columns( ctx, my_table, my_col_defs );
+ ci_ctx.my_ktable = NULL;
+ }
+
+ if ( extracted && rc == 0 )
+ {
+ rc = VTableOpenSchema( my_table, &(ci_ctx.my_schema) );
+ DISP_RC( rc, "VTableOpenSchema() failed" );
+ if ( rc == 0 )
+ {
+ uint32_t idx, count;
+
+ ctx->generic_idx = 1;
+ count = VectorLength( &(my_col_defs->cols) );
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ col_def *col = ( col_def * )VectorGet( &(my_col_defs->cols), idx );
+ if ( col != 0 )
+ {
+ rc = vdm_print_column_info( col, &ci_ctx );
+ }
+ }
+ VSchemaRelease( ci_ctx.my_schema );
+ }
+ if ( ci_ctx.my_ktable != NULL )
+ KTableRelease( ci_ctx.my_ktable );
+ }
+ else
+ {
+ rc = KOutMsg( "error in col_defs_extract_from_table\n" );
+ }
+ vdcd_destroy( my_col_defs );
+ }
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ enum_db_columns:
+ * called by "dump_database()" as fkt-pointer
+ * opens the table
+ * calls enum_tab_columns()
+ * releases table
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_enum_db_columns( const p_dump_context ctx, const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_enum_tab_columns( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+static rc_t vdm_print_tab_id_range( const p_dump_context ctx, const VTable *my_table )
+{
+ const VCursor *my_cursor;
+ rc_t rc = VTableCreateCursorRead( my_table, &my_cursor );
+ DISP_RC( rc, "VTableCreateCursorRead() failed" );
+ if ( rc == 0 )
+ {
+ col_defs *my_col_defs;
+
+ if ( !vdcd_init( &my_col_defs, ctx->max_line_len ) )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted );
+ DISP_RC( rc, "col_defs_init() failed" );
+ }
+
+ if ( rc == 0 )
+ {
+ if ( vdm_extract_or_parse_columns( ctx, my_table, my_col_defs ) )
+ {
+ if ( vdcd_add_to_cursor( my_col_defs, my_cursor ) )
+ {
+ rc = VCursorOpen( my_cursor );
+ DISP_RC( rc, "VCursorOpen() failed" );
+ if ( rc == 0 )
+ {
+ int64_t first;
+ uint64_t count;
+
+ uint32_t idx = 0;
+
+ /* calling with idx = 0 means: let the cursor find out the min/max values of
+ all open columns...
+
+ vdcd_get_first_none_static_column_idx( my_col_defs, my_cursor, &idx );
+ */
+
+ rc = VCursorIdRange( my_cursor, idx, &first, &count );
+ DISP_RC( rc, "VCursorIdRange() failed" );
+ if ( rc == 0 )
+ rc = KOutMsg( "id-range: first-row = %,ld, row-count = %,ld\n", first, count );
+ }
+ }
+ }
+ vdcd_destroy( my_col_defs );
+ }
+ VCursorRelease( my_cursor );
+ }
+ return rc;
+}
+
+/*************************************************************************************
+ print_db_id_range:
+ * called by "dump_database()" as fkt-pointer
+ * opens the table
+ * calls print_tab_id_range()
+ * releases table
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_database [IN] ... open database needed for vdb-calls
+*************************************************************************************/
+static rc_t vdm_print_db_id_range( const p_dump_context ctx, const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_print_tab_id_range( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+
+/* ************************************************************************************ */
+
+static rc_t vdm_enum_index( const KTable * my_ktable, uint32_t idx_nr, const char * idx_name )
+{
+ rc_t rc = KOutMsg( "idx #%u: %s", idx_nr + 1, idx_name );
+ if ( rc == 0 )
+ {
+ const KIndex * my_idx;
+ rc = KTableOpenIndexRead ( my_ktable, &my_idx, "%s", idx_name );
+ if ( rc != 0 )
+ rc = KOutMsg( " (cannot open)" );
+ else
+ {
+ uint32_t idx_version;
+ rc = KIndexVersion ( my_idx, &idx_version );
+ if ( rc != 0 )
+ rc = KOutMsg( " V?.?.?" );
+ else
+ rc = KOutMsg( " V%V", idx_version );
+
+ if ( rc == 0 )
+ {
+ KIdxType idx_type;
+ rc = KIndexType ( my_idx, &idx_type );
+ if ( rc != 0 )
+ rc = KOutMsg( " type = ?" );
+ else
+ {
+ switch ( idx_type &~ kitProj )
+ {
+ case kitText : rc = KOutMsg( " type = Text" ); break;
+ case kitU64 : rc = KOutMsg( " type = U64" ); break;
+ default : rc = KOutMsg( " type = unknown" ); break;
+ }
+ if ( rc == 0 && ( ( idx_type & kitProj ) == kitProj ) )
+ rc = KOutMsg( " reverse" );
+ }
+ }
+
+ if ( rc == 0 )
+ {
+ bool locked = KIndexLocked ( my_idx );
+ if ( locked )
+ rc = KOutMsg( " locked" );
+ }
+ KIndexRelease( my_idx );
+ }
+ }
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+ return rc;
+}
+
+
+static rc_t vdm_enum_tab_index( const p_dump_context ctx, const VTable *my_table )
+{
+ const KTable * my_ktable;
+ rc_t rc = VTableOpenKTableRead( my_table, &my_ktable );
+ DISP_RC( rc, "VTableOpenKTableRead() failed" );
+ if ( rc == 0 )
+ {
+ KNamelist *idx_names;
+ rc = KTableListIdx ( my_ktable, &idx_names );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( idx_names, &count );
+ if ( rc == 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * idx_name = NULL;
+ rc = KNamelistGet( idx_names, i, &idx_name );
+ if ( rc == 0 && idx_name != NULL )
+ rc = vdm_enum_index( my_ktable, i, idx_name );
+ }
+ }
+ KNamelistRelease( idx_names );
+ }
+ else
+ rc = KOutMsg( "no index available\n" );
+ KTableRelease( my_ktable );
+ }
+ return rc;
+}
+
+static rc_t vdm_enum_db_index( const p_dump_context ctx, const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_enum_tab_index( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+/* ************************************************************************************ */
+
+static rc_t vdm_range_tab_index( const p_dump_context ctx, const VTable *my_table )
+{
+ const KTable * my_ktable;
+ rc_t rc = VTableOpenKTableRead( my_table, &my_ktable );
+ if ( rc != 0 )
+ ErrMsg( "VTableOpenKTableRead() -> %R", rc );
+ else
+ {
+ const KIndex * my_kindex;
+ rc = KTableOpenIndexRead ( my_ktable, &my_kindex, "%s", ctx->idx_range );
+ if ( rc != 0 )
+ ErrMsg( "KTableOpenIndexRead() -> %R", rc );
+ else
+ {
+ int64_t start;
+ uint64_t count;
+ rc_t rc2 = 0;
+ for ( start = 1; rc2 == 0 && rc == 0; start += count )
+ {
+ size_t key_size;
+ char key [ 4096 ];
+ rc2 = KIndexProjectText ( my_kindex, start, &start, &count,
+ key, sizeof key, &key_size );
+ if ( rc2 == 0 )
+ rc = KOutMsg( "%.*s : %lu ... %lu\n", ( int )key_size, key, start, start + count - 1 );
+ }
+ KIndexRelease( my_kindex );
+ }
+ KTableRelease( my_ktable );
+ }
+ return rc;
+}
+
+
+static rc_t vdm_range_db_index( const p_dump_context ctx, const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_range_tab_index( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+/* ************************************************************************************ */
+
+static rc_t vdm_show_tab_spotgroups( const p_dump_context ctx, const VTable *my_table )
+{
+ const KMetadata * meta = NULL;
+ rc_t rc = VTableOpenMetadataRead( my_table, &meta );
+ if ( rc != 0 )
+ ErrMsg( "VTableOpenMetadataRead() -> %R", rc );
+ else
+ {
+ const KMDataNode * spot_groups_node;
+ rc = KMetadataOpenNodeRead( meta, &spot_groups_node, "STATS/SPOT_GROUP" );
+ if ( rc != 0 )
+ ErrMsg( "KMetadataOpenNodeRead( STATS/SPOT_GROUP ) -> %R", rc );
+ else
+ {
+ KNamelist * spot_groups;
+ rc = KMDataNodeListChildren( spot_groups_node, &spot_groups );
+ if ( rc != 0 )
+ ErrMsg( "KMDataNodeListChildren() -> %R", rc );
+ else
+ {
+ uint32_t count;
+ rc = KNamelistCount( spot_groups, &count );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistCount() -> %R", rc );
+ else if ( count > 0 )
+ {
+ uint32_t i;
+ for ( i = 0; i < count && rc == 0; ++i )
+ {
+ const char * name = NULL;
+ rc = KNamelistGet( spot_groups, i, &name );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistCount( %d) -> %R", i, rc );
+ else if ( name != NULL )
+ {
+ const KMDataNode * spot_count_node;
+ rc = KMDataNodeOpenNodeRead( spot_groups_node, &spot_count_node, "%s/SPOT_COUNT", name );
+ if ( rc != 0 )
+ ErrMsg( "KMDataNodeOpenNodeRead() -> %R", rc );
+ else
+ {
+ uint64_t spot_count = 0;
+ rc = KMDataNodeReadAsU64( spot_count_node, &spot_count );
+ if ( rc != 0 )
+ {
+ ErrMsg( "KMDataNodeReadAsU64() -> %R", rc );
+ vdm_clear_recorded_errors();
+ }
+ else
+ {
+ if ( spot_count > 0 )
+ {
+ const KMDataNode * spot_group_node;
+ rc = KMDataNodeOpenNodeRead( spot_groups_node, &spot_group_node, name );
+ if ( rc != 0 )
+ ErrMsg( "KMDataNodeOpenNodeRead( '%s' ) -> %R", name, rc );
+ else
+ {
+ char name_attr[ 2048 ];
+ size_t num_writ;
+ rc = KMDataNodeReadAttr( spot_group_node, "name", name_attr, sizeof name_attr, &num_writ );
+ rc = KOutMsg( "%s\t%,lu\n", rc == 0 ? name_attr : name, spot_count );
+ KMDataNodeRelease( spot_group_node );
+ }
+
+ }
+ }
+ KMDataNodeRelease( spot_count_node );
+ }
+ }
+ }
+ }
+ KNamelistRelease( spot_groups );
+ }
+ KMDataNodeRelease( spot_groups_node );
+ }
+ KMetadataRelease ( meta );
+ }
+ return rc;
+}
+
+static rc_t vdm_show_db_spotgroups( const p_dump_context ctx, const VDatabase *my_database )
+{
+ const VTable *my_table;
+ rc_t rc = vdm_open_table_by_path( my_database, ctx->table, &my_table );
+ if ( rc == 0 )
+ {
+ rc = vdm_show_tab_spotgroups( ctx, my_table );
+ VTableRelease( my_table );
+ }
+ return rc;
+}
+
+
+typedef rc_t (*db_tab_t)( const p_dump_context ctx, const VTable *a_tab );
+
+/*************************************************************************************
+ dump_tab_fkt:
+ * called by "dump_table()"
+ * if the user has provided the name of a schema-file:
+ - make a schema from manager
+ - parse the schema-file
+ - use this schema to open the database
+ * if we do not have a schema-file, use NULL ( that means the internal tab-schema )
+ * open the table for read
+ * call the function-pointer, with context and table
+ * release table and schema
+
+ctx [IN] ... contains source-path, tablename, columns and row-range as ascii-text
+db_fkt [IN] ... function to be called if directory, manager and database are open
+*************************************************************************************/
+static rc_t vdm_dump_tab_fkt( const p_dump_context ctx,
+ const VDBManager *my_manager,
+ const db_tab_t tab_fkt )
+{
+ const VTable *my_table;
+ VSchema *my_schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( my_manager, &my_schema, &(ctx->schema_list), true /*ctx->force_sra_schema*/ );
+
+ rc = VDBManagerOpenTableRead( my_manager, &my_table, my_schema, "%s", ctx->path );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerOpenTableRead( '%R' ) -> %R", ctx->path, rc );
+ else
+ {
+ rc = vdm_check_table_empty( my_table );
+ if ( rc == 0 )
+ rc = tab_fkt( ctx, my_table ); /* fkt-pointer is called */
+ VTableRelease( my_table );
+ }
+
+ if ( my_schema != NULL )
+ {
+ rc = VSchemaRelease( my_schema );
+ if ( rc != 0 )
+ ErrMsg( "VSchemaRelease() -> %R", rc );
+ }
+ return rc;
+}
+
+
+static bool enum_col_request( const p_dump_context ctx )
+{
+ return ( ctx->column_enum_requested || ctx->column_enum_short ||
+ ctx->show_blobbing || ctx->enum_phys || ctx->enum_readable );
+}
+
+
+static const char * SEQUENCE_TAB = "SEQUENCE";
+
+static bool is_sequence( const char * tbl )
+{
+ return string_cmp ( tbl, string_size( tbl ),
+ SEQUENCE_TAB, string_size( SEQUENCE_TAB ), 0xFFFF ) == 0;
+}
+
+/***************************************************************************
+ dump_table:
+ * called by "dump_main()" to handle a table
+ * calls the dump_tab_fkt with 3 different fkt-pointers as argument
+ depending on what was selected at the commandline
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_manager [IN] ... open manager needed for vdb-calls
+***************************************************************************/
+static rc_t vdm_dump_table( const p_dump_context ctx, const VDBManager *my_manager )
+{
+ rc_t rc;
+
+ bool table_valid = ( ctx->table == NULL )||( is_sequence( ctx->table ) );
+ if ( !table_valid )
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ ErrMsg( "Table '%s' not found-> %R", ctx->table, rc );
+ }
+ else
+ {
+ if ( ctx->schema_dump_requested )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_dump_tab_schema );
+ }
+ else if ( ctx->table_enum_requested )
+ {
+ KOutMsg( "cannot enum tables of a table-object\n" );
+ vdm_clear_recorded_errors();
+ rc = 0;
+ }
+ else if ( enum_col_request( ctx ) )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_enum_tab_columns );
+ }
+ else if ( ctx->id_range_requested )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_print_tab_id_range );
+ }
+ else if ( ctx->idx_enum_requested )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_enum_tab_index );
+ }
+ else if ( ctx->idx_range_requested )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_range_tab_index );
+ }
+ else if ( ctx->show_spotgroups )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_show_tab_spotgroups );
+ }
+ else if ( ctx->show_spread )
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_show_tab_spread );
+ }
+ else
+ {
+ rc = vdm_dump_tab_fkt( ctx, my_manager, vdm_dump_opened_table );
+ }
+ }
+ return rc;
+}
+
+typedef rc_t (*db_fkt_t)( const p_dump_context ctx, const VDatabase *a_db );
+
+/*************************************************************************************
+ dump_db_fkt:
+ * called by "dump_database()" to handle a database
+ * if the user has provided the name of a schema-file:
+ - make a schema from manager
+ - parse the schema-file
+ - use this schema to open the database
+ * if we do not have a schema-file, use NULL ( that means the internal db-schema )
+ * open the database for read
+ * if the user has not given a table-name to dump:
+ - take the first table found in the database
+ * if we now have a table-name
+ - call the function-pointer, with context and database
+ * if we do not have a table-name
+ - request display of the usage-message
+ * release database and schema
+
+ctx [IN] ... contains source-path, tablename, columns and row-range as ascii-text
+db_fkt [IN] ... function to be called if directory, manager and database are open
+*************************************************************************************/
+static rc_t vdm_dump_db_fkt( const p_dump_context ctx,
+ const VDBManager * mgr,
+ const db_fkt_t db_fkt )
+{
+ const VDatabase *db;
+ VSchema *schema = NULL;
+ rc_t rc;
+
+ vdh_parse_schema( mgr, &schema, &(ctx->schema_list), true /* ctx->force_sra_schema */ );
+
+ rc = VDBManagerOpenDBRead( mgr, &db, schema, "%s", ctx->path );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerOpenDBRead( '%s' ) -> %R", ctx->path, rc );
+ else
+ {
+ KNamelist *tbl_names;
+ rc = VDatabaseListTbl( db, &tbl_names );
+ if ( rc != 0 )
+ ErrMsg( "VDatabaseListTbl( '%s' ) -> %R", ctx->path, rc );
+ else
+ {
+ if ( ctx->table == NULL )
+ {
+ /* the user DID NOT not specify a table: by default assume the SEQUENCE-table */
+ bool table_found = vdh_take_this_table_from_list( ctx, tbl_names, "SEQUENCE" );
+ /* if there is no SEQUENCE-table, just pick the first table available... */
+ if ( !table_found )
+ vdh_take_1st_table_from_db( ctx, tbl_names );
+ }
+ else
+ {
+ /* the user DID specify a table: check if the database has a table with this name,
+ if not try with a sub-string */
+ String value;
+ StringInitCString( &value, ctx->table );
+ if ( !list_contains_value( tbl_names, &value ) )
+ vdh_take_this_table_from_list( ctx, tbl_names, ctx->table );
+ }
+
+ if ( ctx->table != NULL || ctx->table_enum_requested )
+ {
+ rc = db_fkt( ctx, db ); /* fkt-pointer is called */
+ }
+ else
+ {
+ LOGMSG( klogInfo, "opened as vdb-database, but no table found" );
+ ctx->usage_requested = true;
+ }
+ rc = KNamelistRelease( tbl_names );
+ if ( rc != 0 )
+ ErrMsg( "KNamelistRelease() -> %R", rc );
+ }
+ rc = VDatabaseRelease( db );
+ if ( rc != 0 )
+ ErrMsg( "VDatabaseRelease() -> %R", rc );
+ }
+
+ if ( schema != NULL )
+ {
+ rc = VSchemaRelease( schema );
+ if ( rc != 0 )
+ ErrMsg( "VSchemaRelease() -> %R", rc );
+ }
+
+ return rc;
+}
+
+
+/***************************************************************************
+ dump_database:
+ * called by "dump_main()"
+ * calls the dump_db_fkt with 4 different fkt-pointers as argument
+ depending on what was selected at the commandline
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+my_manager [IN] ... open manager needed for vdb-calls
+***************************************************************************/
+static rc_t vdm_dump_database( const p_dump_context ctx, const VDBManager *my_manager )
+{
+ rc_t rc;
+
+ if ( ctx->schema_dump_requested )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_dump_db_schema );
+ }
+ else if ( ctx->table_enum_requested )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_enum_tables );
+ }
+ else if ( enum_col_request( ctx ) )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_enum_db_columns );
+ }
+ else if ( ctx->id_range_requested )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_print_db_id_range );
+ }
+ else if ( ctx->idx_enum_requested )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_enum_db_index );
+ }
+ else if ( ctx->idx_range_requested )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_range_db_index );
+ }
+ else if ( ctx->show_spotgroups )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_show_db_spotgroups );
+ }
+ else if ( ctx->show_spread )
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_show_db_spread );
+ }
+ else
+ {
+ rc = vdm_dump_db_fkt( ctx, my_manager, vdm_dump_opened_database );
+ }
+
+ return rc;
+}
+
+
+static rc_t vdm_print_objver( const p_dump_context ctx, const VDBManager *mgr )
+{
+ ver_t version;
+ rc_t rc = VDBManagerGetObjVersion ( mgr, &version, ctx->path );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerGetObjVersion( '%s' ) -> %R", ctx->path, rc );
+ else
+ rc = KOutMsg( "%V\n", version );
+ return rc;
+}
+
+static rc_t vdm_print_objts ( const p_dump_context ctx, const VDBManager *mgr )
+{
+ KTime_t timestamp;
+ rc_t rc = VDBManagerGetObjModDate ( mgr, ×tamp, ctx->path );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerGetObjModDate( '%s' ) -> %R", ctx->path, rc );
+ if ( rc == 0 )
+ {
+ KTime kt;
+ KTimeGlobal ( & kt, timestamp );
+ rc = KOutMsg ( "%04u-%02u-%02uT"
+ "%02u:%02u:%02uZ"
+ "\n",
+ kt . year,
+ kt . month,
+ kt . day,
+ kt . hour,
+ kt . minute,
+ kt . second
+ );
+ }
+ return rc;
+}
+
+static void vdm_print_objtype( const VDBManager *mgr, const char * acc_or_path )
+{
+ int path_type = ( VDBManagerPathType ( mgr, "%s", acc_or_path ) & ~ kptAlias );
+ /* types defined in <kdb/manager.h> */
+ switch ( path_type )
+ {
+ case kptDatabase : KOutMsg( "Database\n" ); break;
+ case kptTable : KOutMsg( "Table\n" ); break;
+ case kptPrereleaseTbl : KOutMsg( "Prerelease Table\n" ); break;
+ case kptColumn : KOutMsg( "Column\n" ); break;
+ case kptIndex : KOutMsg( "Index\n" ); break;
+ case kptNotFound : KOutMsg( "not found\n" ); break;
+ case kptBadPath : KOutMsg( "bad path\n" ); break;
+ case kptFile : KOutMsg( "File\n" ); break;
+ case kptDir : KOutMsg( "Dir\n" ); break;
+ case kptCharDev : KOutMsg( "CharDev\n" ); break;
+ case kptBlockDev : KOutMsg( "BlockDev\n" ); break;
+ case kptFIFO : KOutMsg( "FIFO\n" ); break;
+ case kptZombieFile : KOutMsg( "ZombieFile\n" ); break;
+ case kptDataset : KOutMsg( "Dataset\n" ); break;
+ case kptDatatype : KOutMsg( "Datatype\n" ); break;
+ default : KOutMsg( "value = '%i'\n", path_type ); break;
+ }
+}
+
+
+static rc_t vdb_main_one_obj_by_pathtype( const p_dump_context ctx,
+ const VDBManager *mgr )
+{
+ rc_t rc;
+ int path_type = ( VDBManagerPathType ( mgr, "%s", ctx->path ) & ~ kptAlias );
+ /* types defined in <kdb/manager.h> */
+ switch ( path_type )
+ {
+ case kptDatabase : rc = vdm_dump_database( ctx, mgr ); break;
+
+ case kptPrereleaseTbl:
+ case kptTable : rc = vdm_dump_table( ctx, mgr ); break;
+
+ default : rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "the path '$(p)' cannot be opened as vdb-database or vdb-table",
+ "p=%s", ctx->path ) );
+ if ( vdco_schema_count( ctx ) == 0 )
+ {
+ LOGERR( klogInt, rc, "Maybe it is a legacy table. If so, specify a schema with the -S option" );
+ }
+ break;
+ }
+ return rc;
+}
+
+
+static rc_t vdb_main_one_obj_by_probing( const p_dump_context ctx,
+ const VDBManager *mgr )
+{
+ rc_t rc;
+ if ( vdh_is_path_database( mgr, ctx->path, &(ctx->schema_list) ) )
+ {
+ rc = vdm_dump_database( ctx, mgr );
+ }
+ else if ( vdh_is_path_table( mgr, ctx->path, &(ctx->schema_list) ) )
+ {
+ rc = vdm_dump_table( ctx, mgr );
+ }
+ else
+ {
+ rc = RC( rcVDB, rcNoTarg, rcConstructing, rcItem, rcNotFound );
+ PLOGERR( klogInt, ( klogInt, rc,
+ "the path '$(p)' cannot be opened as vdb-database or vdb-table",
+ "p=%s", ctx->path ) );
+ if ( vdco_schema_count( ctx ) == 0 )
+ {
+ LOGERR( klogInt, rc, "Maybe it is a legacy table. If so, specify a schema with the -S option" );
+ }
+ }
+ return rc;
+}
+
+
+static rc_t vdm_main_one_obj( const p_dump_context ctx,
+ const VDBManager *mgr,
+ const char * acc_or_path )
+{
+ rc_t rc = 0;
+
+ ctx->path = string_dup_measure ( acc_or_path, NULL );
+
+ if ( ctx->objver_requested )
+ {
+ rc = vdm_print_objver( ctx, mgr );
+ }
+ else if ( ctx->objts_requested )
+ {
+ rc = vdm_print_objts ( ctx, mgr );
+ }
+ else if ( ctx->objtype_requested )
+ {
+ vdm_print_objtype( mgr, acc_or_path );
+ }
+ else
+ {
+ if ( USE_PATHTYPE_TO_DETECT_DB_OR_TAB ) /* in vdb-dump-context.h */
+ {
+ rc = vdb_main_one_obj_by_pathtype( ctx, mgr );
+ }
+ else
+ {
+ rc = vdb_main_one_obj_by_probing( ctx, mgr );
+ }
+ }
+
+ free( (char*)ctx->path );
+ ctx->path = NULL;
+
+ return rc;
+}
+
+
+/***************************************************************************
+ dump_main:
+ * called by "KMain()"
+ * make the "native directory"
+ * make a vdb-manager for read
+ all subsequent dump-functions will use this manager...
+ * show the manager-version, if it was requested from the command-line
+ * check if the given path is database-path ( by trying to open it )
+ if it is one: continue wit dump_database()
+ * check if the given path is table-path ( by trying to open it )
+ if it is one: continue wit dump_table()
+ * release manager and directory
+
+ctx [IN] ... contains path, tablename, columns, row-range etc.
+***************************************************************************/
+static rc_t vdm_main( const p_dump_context ctx, Args * args )
+{
+ KDirectory *dir;
+ rc_t rc1, rc = KDirectoryNativeDir( &dir );
+ if ( rc != 0 )
+ ErrMsg( "KDirectoryNativeDir() -> %R", rc );
+ else
+ {
+ const VDBManager *mgr;
+ rc = VDBManagerMakeRead( &mgr, dir );
+ if ( rc != 0 )
+ ErrMsg( "VDBManagerMakeRead() -> %R", rc );
+ else
+ {
+ if ( ctx->disable_multithreading )
+ {
+ rc = VDBManagerDisablePagemapThread( mgr );
+ if ( rc != 0 )
+ {
+ ErrMsg( "VDBManagerDisablePagemapThread() -> %R", rc );
+ rc = 0;
+ }
+ }
+
+ /* show manager is independend form db or tab */
+ if ( ctx->version_requested )
+ rc = vdh_show_manager_version( mgr );
+ else
+ {
+ uint32_t count;
+ rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamCount() -> %R", rc );
+ else
+ {
+ if ( count > 0 )
+ {
+ uint32_t idx;
+ for ( idx = 0; idx < count && rc == 0; ++idx )
+ {
+ const char *value = NULL;
+ rc = ArgsParamValue( args, idx, (const void **)&value );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue() -> %R", rc );
+ else
+ {
+ if ( ctx->print_info )
+ rc = vdb_info( &(ctx->schema_list), ctx->format, mgr,
+ value, ctx->rows ); /* in vdb_info.c */
+ else switch( ctx->format )
+ {
+ case df_fastq : ;
+ case df_fastq1 : ;
+ case df_fasta : ;
+ case df_fasta1 : ;
+ case df_fasta2 : ;
+ case df_qual : ;
+ case df_qual1 : vdf_main( ctx, mgr, value ); break; /* in vdb-dump-fastq.c */
+ default : rc = vdm_main_one_obj( ctx, mgr, value ); break;
+ }
+ }
+ }
+ }
+ else
+ {
+ UsageSummary ( UsageDefaultName );
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInsufficient);
+ }
+ }
+ }
+ rc1 = VDBManagerRelease( mgr );
+ if ( rc1 != 0 )
+ ErrMsg( "VDBManagerRelease() -> %R", rc );
+ }
+ rc1 = KDirectoryRelease( dir );
+ if ( rc1 != 0 )
+ ErrMsg( "KDirectoryRelease() -> %R", rc );
+ }
+ return rc;
+}
+
+
+static rc_t diff_files( Args * args )
+{
+ uint32_t count;
+ rc_t rc = ArgsParamCount( args, &count );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamCount() -> %R", rc );
+ else
+ {
+ if ( count != 2 )
+ KOutMsg( "this function needs exactly 2 files to diff\n" );
+ else
+ {
+ const char * f1;
+ rc = ArgsParamValue( args, 0, (const void **)&f1 );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue( 0 ) -> %R", rc );
+ else
+ {
+ const char * f2;
+ rc = ArgsParamValue( args, 1, (const void **)&f2 );
+ if ( rc != 0 )
+ ErrMsg( "ArgsParamValue( 1 ) -> %R", rc );
+ else
+ rc = vds_diff( f1, f2 ); /* in vdb-dump-str.c */
+ }
+ }
+ }
+ return rc;
+}
+
+
+/***************************************************************************
+ Main:
+ * create the dump-context
+ * parse the commandline for arguments and options
+ * react to help/usage - requests ( no dump in this case )
+ these functions are in vdb-dump-context.c
+ * call dump_main() to execute the dump
+ * destroy the dump-context
+***************************************************************************/
+static
+rc_t CC write_to_FILE ( void *f, const char *buffer, size_t bytes, size_t *num_writ )
+{
+ * num_writ = fwrite ( buffer, 1, bytes, f );
+ if ( * num_writ != bytes )
+ return RC ( rcExe, rcFile, rcWriting, rcTransfer, rcIncomplete );
+ return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ Args * args;
+ rc_t rc = KOutHandlerSet( write_to_FILE, stdout );
+ if ( rc != 0 )
+ ErrMsg( "KOutHandlerSet() -> %R", rc );
+ else
+ {
+ rc = ArgsMakeAndHandle( &args, argc, argv,
+ 1, DumpOptions, sizeof DumpOptions / sizeof DumpOptions [ 0 ] );
+ if ( rc != 0 )
+ ErrMsg( "ArgsMakeAndHandle() -> %R", rc );
+ else
+ {
+ dump_context *ctx;
+
+ rc = vdco_init( &ctx );
+ if ( rc == 0 )
+ {
+ rc = vdco_capture_arguments_and_options( args, ctx );
+ if ( rc == 0 )
+ {
+ out_redir redir; /* vdb-dump-redir.h */
+
+ KLogHandlerSetStdErr();
+ rc = init_out_redir( &redir,
+ ctx->compress_mode,
+ ctx->output_file,
+ ctx->interactive ? 0 : ctx->output_buffer_size ); /* vdb-dump-redir.c */
+
+ if ( rc == 0 )
+ {
+ if ( ctx->phase > 0 )
+ rc = vdi_bin_phase( ctx, args ); /* vdb-dump-bin.c */
+ else if ( ctx->diff )
+ rc = diff_files( args ); /* above calls into vdb-dump-str.c */
+ else if ( ctx->interactive )
+ rc = vdi_main( ctx, args ); /* vdb-dump-interact.c */
+ else if ( ctx->slice_depth > 0 )
+ rc = find_slice( ctx, args ); /* vdb-dump-str.c */
+ else
+ rc = vdm_main( ctx, args );
+
+ release_out_redir( &redir ); /* vdb-dump-redir.c */
+ }
+ }
+ vdco_destroy( ctx );
+ }
+ ArgsWhack( args );
+ }
+ }
+ return rc;
+}
+
diff --git a/tools/vdb-dump/vdb_info.c b/tools/vdb-dump/vdb_info.c
new file mode 100644
index 0000000..49c7af3
--- /dev/null
+++ b/tools/vdb-dump/vdb_info.c
@@ -0,0 +1,1528 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/out.h>
+#include <klib/time.h>
+#include <klib/printf.h>
+#include <klib/num-gen.h>
+#include <klib/text.h>
+
+#include <kfs/directory.h>
+#include <kfs/file.h>
+
+#include <kns/manager.h>
+#include <kns/http.h>
+
+#include <kdb/manager.h>
+#include <kdb/meta.h>
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/database.h>
+#include <vdb/vdb-priv.h>
+
+#include "vdb-dump-context.h"
+#include "vdb-dump-helper.h"
+#include "vdb-dump-coldefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+static const char * PT_DATABASE = "Database";
+static const char * PT_TABLE = "Table";
+static const char * PT_NONE = "None";
+
+typedef struct vdb_info_vers
+{
+ char s_vers[ 16 ];
+ uint8_t major, minor, release;
+} vdb_info_vers;
+
+
+typedef struct vdb_info_date
+{
+ char date[ 32 ];
+ uint64_t timestamp;
+
+ uint16_t year;
+ uint8_t month;
+ uint8_t day;
+ uint8_t hour;
+ uint8_t minute;
+} vdb_info_date;
+
+typedef struct vdb_info_event
+{
+ char name[ 32 ];
+ vdb_info_vers vers;
+ vdb_info_date tool_date;
+ vdb_info_date run_date;
+} vdb_info_event;
+
+typedef struct vdb_info_bam_hdr
+{
+ bool present;
+ size_t hdr_bytes;
+ uint32_t total_lines;
+ uint32_t HD_lines;
+ uint32_t SQ_lines;
+ uint32_t RG_lines;
+ uint32_t PG_lines;
+} vdb_info_bam_hdr;
+
+typedef struct vdb_info_data
+{
+ const char * acc;
+ const char * s_path_type;
+ const char * s_platform;
+
+ char path[ 4096 ];
+ char remote_path[ 4096 ];
+ char cache[ 1024 ];
+ char schema_name[ 1024 ];
+ char species[ 1024 ];
+
+ vdb_info_event formatter;
+ vdb_info_event loader;
+ vdb_info_event update;
+
+ vdb_info_date ts;
+
+ vdb_info_bam_hdr bam_hdr;
+
+ float cache_percent;
+ uint64_t bytes_in_cache;
+
+ uint64_t seq_rows;
+ uint64_t ref_rows;
+ uint64_t prim_rows;
+ uint64_t sec_rows;
+ uint64_t ev_rows;
+ uint64_t ev_int_rows;
+ uint64_t consensus_rows;
+ uint64_t passes_rows;
+ uint64_t metrics_rows;
+
+ uint64_t file_size;
+} vdb_info_data;
+
+
+/* ----------------------------------------------------------------------------- */
+
+typedef struct split_vers_ctx
+{
+ char tmp[ 32 ];
+ uint32_t dst;
+ uint32_t sel;
+} split_vers_ctx;
+
+static void store_vers( vdb_info_vers * vers, split_vers_ctx * ctx )
+{
+ ctx->tmp[ ctx->dst ] = 0;
+ switch ( ctx->sel )
+ {
+ case 0 : vers->major = atoi( ctx->tmp ); break;
+ case 1 : vers->minor = atoi( ctx->tmp ); break;
+ case 2 : vers->release = atoi( ctx->tmp ); break;
+ }
+ ctx->sel++;
+ ctx->dst = 0;
+}
+
+static void split_vers( vdb_info_vers * vers )
+{
+ uint32_t i, l = string_measure ( vers->s_vers, NULL );
+ split_vers_ctx ctx;
+ memset( &ctx, 0, sizeof ctx );
+ for ( i = 0; i < l; ++i )
+ {
+ char c = vers->s_vers[ i ];
+ if ( c >= '0' && c <= '9' )
+ ctx.tmp[ ctx.dst++ ] = c;
+ else if ( c == '.' )
+ store_vers( vers, &ctx );
+ }
+ if ( ctx.dst > 0 )
+ store_vers( vers, &ctx );
+}
+
+/* ----------------------------------------------------------------------------- */
+
+typedef struct split_date_ctx
+{
+ char tmp[ 32 ];
+ uint32_t dst;
+} split_date_ctx;
+
+
+static uint8_t str_to_month_num( const char * s )
+{
+ uint8_t res = 0;
+ switch( s[ 0 ] )
+ {
+ case 'A' : ;
+ case 'a' : switch ( s[ 1 ] )
+ {
+ case 'P' : ;
+ case 'p' : switch ( s[ 2 ] )
+ {
+ case 'R' : ;
+ case 'r' : res = 4; break;
+ }
+ break;
+ case 'U' : ;
+ case 'u' : switch ( s[ 2 ] )
+ {
+ case 'G' : ;
+ case 'g' : res = 8; break;
+ }
+ break;
+ }
+ break;
+
+ case 'F' : ;
+ case 'f' : switch ( s[ 1 ] )
+ {
+ case 'E' : ;
+ case 'e' : switch ( s[ 2 ] )
+ {
+ case 'B' : ;
+ case 'b' : res = 2; break;
+ }
+ break;
+ }
+ break;
+
+ case 'J' : ;
+ case 'j' : switch ( s[ 1 ] )
+ {
+ case 'A' : ;
+ case 'a' : switch ( s[ 2 ] )
+ {
+ case 'N' : ;
+ case 'n' : res = 1; break;
+ }
+ break;
+ case 'U' : ;
+ case 'u' : switch ( s[ 2 ] )
+ {
+ case 'N' : ;
+ case 'n' : res = 6; break;
+ case 'L' : ;
+ case 'l' : res = 7; break;
+ }
+ break;
+ }
+ break;
+
+ case 'M' : ;
+ case 'm' : switch ( s[ 1 ] )
+ {
+ case 'A' : ;
+ case 'a' : switch ( s[ 2 ] )
+ {
+ case 'R' : ;
+ case 'r' : res = 3; break;
+ case 'Y' : ;
+ case 'y' : res = 5; break;
+ }
+ break;
+ }
+ break;
+
+ case 'S' : ;
+ case 's' : switch ( s[ 1 ] )
+ {
+ case 'E' : ;
+ case 'e' : switch ( s[ 2 ] )
+ {
+ case 'P' : ;
+ case 'p' : res = 9; break;
+ }
+ break;
+ }
+ break;
+
+ case 'O' : ;
+ case 'o' : switch ( s[ 1 ] )
+ {
+ case 'C' : ;
+ case 'c' : switch ( s[ 2 ] )
+ {
+ case 'T' : ;
+ case 't' : res = 10; break;
+ }
+ break;
+ }
+ break;
+
+ case 'N' : ;
+ case 'n' : switch ( s[ 1 ] )
+ {
+ case 'O' : ;
+ case 'o' : switch ( s[ 2 ] )
+ {
+ case 'V' : ;
+ case 'v' : res = 11; break;
+ }
+ break;
+ }
+ break;
+
+ case 'D' : ;
+ case 'd' : switch ( s[ 1 ] )
+ {
+ case 'E' : ;
+ case 'e' : switch ( s[ 2 ] )
+ {
+ case 'C' : ;
+ case 'c' : res = 12; break;
+ }
+ break;
+ }
+ break;
+ }
+ return res;
+}
+
+static void store_date( vdb_info_date * d, split_date_ctx * ctx )
+{
+ uint32_t l, value;
+
+ ctx->tmp[ ctx->dst ] = 0;
+ l = string_measure ( ctx->tmp, NULL );
+ value = atoi( ctx->tmp );
+ if ( l == 4 )
+ d->year = value;
+ else if ( ( l == 8 ) && ( ctx->tmp[ 2 ] == ':' ) && ( ctx->tmp[ 5 ] == ':' ) )
+ {
+ ctx->tmp[ 2 ] = 0;
+ d->hour = atoi( ctx->tmp );
+ ctx->tmp[ 5 ] = 0;
+ d->minute = atoi( &( ctx->tmp[ 3 ] ) );
+ }
+ else if ( l == 3 )
+ {
+ d->month = str_to_month_num( ctx->tmp );
+ }
+ else
+ {
+ d->day = value;
+ }
+ ctx->dst = 0;
+}
+
+static void split_date( vdb_info_date * d )
+{
+ uint32_t i, l = string_measure ( d->date, NULL );
+ split_date_ctx ctx;
+ memset( &ctx, 0, sizeof ctx );
+ for ( i = 0; i < l; ++i )
+ {
+ char c = d->date[ i ];
+ if ( c == ' ' )
+ store_date( d, &ctx );
+ else
+ ctx.tmp[ ctx.dst++ ] = c;
+ }
+ if ( ctx.dst > 0 )
+ store_date( d, &ctx );
+}
+
+/* ----------------------------------------------------------------------------- */
+static bool has_col( const VTable * tab, const char * colname )
+{
+ bool res = false;
+ struct KNamelist * columns;
+ rc_t rc = VTableListReadableColumns( tab, &columns );
+ if ( rc == 0 )
+ {
+ uint32_t count;
+ rc = KNamelistCount( columns, &count );
+ if ( rc == 0 && count > 0 )
+ {
+ uint32_t idx;
+ size_t colname_size = string_size( colname );
+ for ( idx = 0; idx < count && rc == 0 && !res; ++idx )
+ {
+ const char * a_name;
+ rc = KNamelistGet ( columns, idx, &a_name );
+ if ( rc == 0 )
+ {
+ int cmp;
+ size_t a_name_size = string_size( a_name );
+ uint32_t max_chars = ( uint32_t )colname_size;
+ if ( a_name_size > max_chars ) max_chars = ( uint32_t )a_name_size;
+ cmp = strcase_cmp ( colname, colname_size,
+ a_name, a_name_size,
+ max_chars );
+ res = ( cmp == 0 );
+ }
+ }
+ }
+ KNamelistRelease( columns );
+ }
+ return res;
+}
+
+static const char * get_platform( const VTable * tab )
+{
+ const char * res = PT_NONE;
+ if ( has_col( tab, "PLATFORM" ) )
+ {
+ const VCursor * cur;
+ rc_t rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn( cur, &idx, "PLATFORM" );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cur );
+ if ( rc == 0 )
+ {
+ const uint8_t * pf;
+ rc = VCursorCellDataDirect( cur, 1, idx, NULL, (const void**)&pf, NULL, NULL );
+ if ( rc == 0 )
+ {
+ res = vdcd_get_platform_txt( *pf );
+ }
+ }
+ }
+ VCursorRelease( cur );
+ }
+ }
+ return res;
+}
+
+
+static void get_string_cell( char * buffer, size_t buffer_size, const VTable * tab, int64_t row, const char * column )
+{
+ if ( has_col( tab, column ) )
+ {
+ const VCursor * cur;
+ rc_t rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ rc = VCursorAddColumn( cur, &idx, column );
+ if ( rc == 0 )
+ {
+ rc = VCursorOpen( cur );
+ if ( rc == 0 )
+ {
+ const char * src;
+ uint32_t row_len;
+ rc = VCursorCellDataDirect( cur, row, idx, NULL, (const void**)&src, NULL, &row_len );
+ if ( rc == 0 )
+ {
+ size_t num_writ;
+ string_printf( buffer, buffer_size, &num_writ, "%.*s", row_len, src );
+ }
+ }
+ }
+ VCursorRelease( cur );
+ }
+ }
+}
+
+
+static uint64_t get_rowcount( const VTable * tab )
+{
+ uint64_t res = 0;
+ col_defs *my_col_defs;
+ if ( vdcd_init( &my_col_defs, 1024 ) )
+ {
+ if ( vdcd_extract_from_table( my_col_defs, tab ) > 0 )
+ {
+ const VCursor * cur;
+ rc_t rc = VTableCreateCursorRead( tab, &cur );
+ if ( rc == 0 )
+ {
+ if ( vdcd_add_to_cursor( my_col_defs, cur ) )
+ {
+ rc = VCursorOpen( cur );
+ if ( rc == 0 )
+ {
+ uint32_t idx;
+ if ( vdcd_get_first_none_static_column_idx( my_col_defs, cur, &idx ) )
+ {
+ int64_t first;
+ rc = VCursorIdRange( cur, idx, &first, &res );
+ }
+ }
+ }
+ VCursorRelease( cur );
+ }
+ }
+ vdcd_destroy( my_col_defs );
+ }
+ return res;
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static void get_meta_attr( const KMDataNode * node, const char * key, char * dst, size_t dst_size )
+{
+ size_t size;
+ rc_t rc = KMDataNodeReadAttr ( node, key, dst, dst_size, &size );
+ if ( rc == 0 )
+ dst[ size ] = 0;
+}
+
+
+static void get_meta_event( const KMetadata * meta, const char * node_path, vdb_info_event * event )
+{
+ const KMDataNode * node;
+ rc_t rc = KMetadataOpenNodeRead ( meta, &node, node_path );
+ if ( rc == 0 )
+ {
+ get_meta_attr( node, "name", event->name, sizeof event->name );
+ if ( event->name[ 0 ] == 0 )
+ get_meta_attr( node, "tool", event->name, sizeof event->name );
+
+ get_meta_attr( node, "vers", event->vers.s_vers, sizeof event->vers.s_vers );
+ split_vers( &event->vers );
+
+ get_meta_attr( node, "run", event->run_date.date, sizeof event->run_date.date );
+ split_date( &event->run_date );
+
+ get_meta_attr( node, "date", event->tool_date.date, sizeof event->tool_date.date );
+ if ( event->tool_date.date[ 0 ] == 0 )
+ get_meta_attr( node, "build", event->tool_date.date, sizeof event->tool_date.date );
+ split_date( &event->tool_date );
+
+ KMDataNodeRelease ( node );
+ }
+}
+
+static size_t get_node_size( const KMDataNode * node )
+{
+ char buffer[ 10 ];
+ size_t num_read, remaining, res = 0;
+ rc_t rc = KMDataNodeRead( node, 0, buffer, sizeof( buffer ), &num_read, &remaining );
+ if ( rc == 0 ) res = num_read + remaining;
+ return res;
+}
+
+static bool is_newline( const char c ) { return ( c == 0x0A || c == 0x0D ); }
+
+static void inspect_line( vdb_info_bam_hdr * bam_hdr, char * line, size_t len )
+{
+ bam_hdr->total_lines++;
+ if ( len > 3 && line[ 0 ] == '@' )
+ {
+ switch( line[ 1 ] )
+ {
+ case 'H' : if ( line[ 2 ] == 'D' ) bam_hdr->HD_lines++; break;
+ case 'S' : if ( line[ 2 ] == 'Q' ) bam_hdr->SQ_lines++; break;
+ case 'R' : if ( line[ 2 ] == 'G' ) bam_hdr->RG_lines++; break;
+ case 'P' : if ( line[ 2 ] == 'G' ) bam_hdr->PG_lines++; break;
+ }
+ }
+}
+
+static void parse_buffer( vdb_info_bam_hdr * bam_hdr, char * buffer, size_t len )
+{
+ char * line;
+ size_t idx, line_len, state = 0;
+ for ( idx = 0; idx < len; ++idx )
+ {
+ switch( state )
+ {
+ case 0 : if ( is_newline( buffer[ idx ] ) ) /* init */
+ state = 2;
+ else
+ {
+ line = &( buffer[ idx ] );
+ line_len = 1;
+ state = 1;
+ }
+ break;
+
+ case 1 : if ( is_newline( buffer[ idx ] ) ) /* content */
+ {
+ inspect_line( bam_hdr, line, line_len );
+ state = 2;
+ }
+ else
+ line_len++;
+ break;
+
+ case 2 : if ( !is_newline( buffer[ idx ] ) ) /* newline */
+ {
+ line = &( buffer[ idx ] );
+ line_len = 1;
+ state = 1;
+ }
+ break;
+ }
+ }
+}
+
+static void get_meta_bam_hdr( vdb_info_bam_hdr * bam_hdr, const KMetadata * meta )
+{
+ const KMDataNode * node;
+ rc_t rc = KMetadataOpenNodeRead ( meta, &node, "BAM_HEADER" );
+ bam_hdr -> present = ( rc == 0 );
+ if ( bam_hdr -> present )
+ {
+ bam_hdr->hdr_bytes = get_node_size( node );
+ if ( bam_hdr->hdr_bytes > 0 )
+ {
+ char * buffer = malloc( bam_hdr->hdr_bytes );
+ if ( buffer != NULL )
+ {
+ size_t num_read, remaining;
+ rc = KMDataNodeRead( node, 0, buffer, bam_hdr->hdr_bytes, &num_read, &remaining );
+ if ( rc == 0 )
+ {
+ parse_buffer( bam_hdr, buffer, bam_hdr->hdr_bytes );
+ }
+ free( buffer );
+ }
+ }
+ KMDataNodeRelease ( node );
+ }
+}
+
+static void get_meta_info( vdb_info_data * data, const KMetadata * meta )
+{
+ const KMDataNode * node;
+ rc_t rc = KMetadataOpenNodeRead ( meta, &node, "schema" );
+ if ( rc == 0 )
+ {
+ size_t size;
+ rc = KMDataNodeReadAttr ( node, "name", data->schema_name, sizeof data->schema_name, &size );
+ if ( rc == 0 )
+ data->schema_name[ size ] = 0;
+ KMDataNodeRelease ( node );
+ }
+
+ rc = KMetadataOpenNodeRead ( meta, &node, "LOAD/timestamp" );
+ if ( rc == 0 )
+ {
+ rc = KMDataNodeReadAsU64 ( node, &data->ts.timestamp );
+ if ( rc == 0 )
+ {
+ KTime time_rec;
+ KTimeLocal ( &time_rec, data->ts.timestamp );
+ data->ts.year = time_rec.year;
+ data->ts.month = time_rec.month + 1;
+ data->ts.day = time_rec.day + 1;
+ data->ts.hour = time_rec.hour;
+ data->ts.minute= time_rec.minute;
+ }
+ KMDataNodeRelease ( node );
+ }
+
+ get_meta_event( meta, "SOFTWARE/formatter", &data->formatter );
+ get_meta_event( meta, "SOFTWARE/loader", &data->loader );
+ get_meta_event( meta, "SOFTWARE/update", &data->update );
+ get_meta_bam_hdr( &data->bam_hdr, meta );
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static const char * get_path_type( const VDBManager *mgr, const char * acc_or_path )
+{
+ const char * res = PT_NONE;
+ int path_type = ( VDBManagerPathType ( mgr, "%s", acc_or_path ) & ~ kptAlias );
+ switch ( path_type ) /* types defined in <kdb/manager.h> */
+ {
+ case kptDatabase : res = PT_DATABASE; break;
+
+ case kptPrereleaseTbl :
+ case kptTable : res = PT_TABLE; break;
+ }
+ return res;
+}
+
+
+static rc_t make_remote_file( const KFile ** f, const char * url )
+{
+ KNSManager * kns_mgr;
+ rc_t rc = KNSManagerMake ( & kns_mgr );
+ *f = NULL;
+ if ( rc == 0 )
+ {
+ rc = KNSManagerMakeHttpFile ( kns_mgr, f, NULL, 0x01010000, "%s", url );
+ KNSManagerRelease ( kns_mgr );
+ }
+ return rc;
+}
+
+
+static rc_t make_local_file( const KFile ** f, const char * path )
+{
+ KDirectory * dir;
+ rc_t rc = KDirectoryNativeDir( &dir );
+ *f = NULL;
+ if ( rc == 0 )
+ {
+ rc = KDirectoryOpenFileRead( dir, f, "%s", path );
+ KDirectoryRelease( dir );
+ }
+ return rc;
+}
+
+
+static uint64_t get_file_size( const char * path, bool remotely )
+{
+ uint64_t res = 0;
+ const KFile * f;
+ rc_t rc = ( remotely ) ? make_remote_file( &f, path ) : make_local_file( &f, path );
+ if ( rc == 0 )
+ {
+ KFileSize ( f, &res );
+ KFileRelease( f );
+ }
+ return res;
+}
+
+
+static rc_t vdb_info_tab( vdb_info_data * data, VSchema * schema, const VDBManager *mgr )
+{
+ const VTable * tab;
+ rc_t rc = VDBManagerOpenTableRead( mgr, &tab, schema, "%s", data->acc );
+ if ( rc == 0 )
+ {
+ const KMetadata * meta = NULL;
+
+ data->s_platform = get_platform( tab );
+ data->seq_rows = get_rowcount( tab );
+ get_string_cell( data->species, sizeof data->species, tab, 1, "DEF_LINE" );
+
+ rc = VTableOpenMetadataRead ( tab, &meta );
+ if ( rc == 0 )
+ {
+ get_meta_info( data, meta );
+ KMetadataRelease ( meta );
+ }
+
+ VTableRelease( tab );
+ }
+ return rc;
+}
+
+
+static uint64_t get_tab_row_count( const VDatabase * db, const char * table_name )
+{
+ uint64_t res = 0;
+ const VTable * tab;
+ rc_t rc = VDatabaseOpenTableRead( db, &tab, table_name );
+ if ( rc == 0 )
+ {
+ res = get_rowcount( tab );
+ VTableRelease( tab );
+ }
+ return res;
+}
+
+
+static void get_species( char * buffer, size_t buffer_size, const VDatabase * db, const VDBManager *mgr )
+{
+ const VTable * tab;
+ rc_t rc = VDatabaseOpenTableRead( db, &tab, "REFERENCE" );
+ if ( rc == 0 )
+ {
+ char seq_id[ 1024 ];
+
+ seq_id[ 0 ] = 0;
+ get_string_cell( seq_id, sizeof seq_id, tab, 1, "SEQ_ID" );
+ VTableRelease( tab );
+ if ( seq_id[ 0 ] != 0 )
+ {
+ rc = VDBManagerOpenTableRead( mgr, &tab, NULL, "%s", seq_id );
+ if ( rc == 0 )
+ {
+ get_string_cell( buffer, buffer_size, tab, 1, "DEF_LINE" );
+ VTableRelease( tab );
+ }
+ }
+ }
+}
+
+static rc_t vdb_info_db( vdb_info_data * data, VSchema * schema, const VDBManager *mgr )
+{
+ const VDatabase * db;
+ rc_t rc = VDBManagerOpenDBRead( mgr, &db, schema, "%s", data->acc );
+ if ( rc == 0 )
+ {
+ const VTable * tab;
+ const KMetadata * meta = NULL;
+
+ rc_t rc1 = VDatabaseOpenTableRead( db, &tab, "SEQUENCE" );
+ if ( rc1 == 0 )
+ {
+ data->s_platform = get_platform( tab );
+ data->seq_rows = get_rowcount( tab );
+ VTableRelease( tab );
+ }
+
+ data->ref_rows = get_tab_row_count( db, "REFERENCE" );
+ data->prim_rows = get_tab_row_count( db, "PRIMARY_ALIGNMENT" );
+ data->sec_rows = get_tab_row_count( db, "SECONDARY_ALIGNMENT" );
+ data->ev_rows = get_tab_row_count( db, "EVIDENCE_ALIGNMENT" );
+ data->ev_int_rows = get_tab_row_count( db, "EVIDENCE_INTERVAL" );
+ data->consensus_rows = get_tab_row_count( db, "CONSENSUS" );
+ data->passes_rows = get_tab_row_count( db, "PASSES" );
+ data->metrics_rows = get_tab_row_count( db, "ZMW_METRICS" );
+
+ if ( data->ref_rows > 0 )
+ get_species( data->species, sizeof data->species, db, mgr );
+
+ rc = VDatabaseOpenMetadataRead ( db, &meta );
+ if ( rc == 0 )
+ {
+ get_meta_info( data, meta );
+ KMetadataRelease ( meta );
+ }
+
+ VDatabaseRelease( db );
+ }
+ return rc;
+
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static rc_t vdb_info_print_xml_s( const char * tag, const char * value )
+{
+ if ( value[ 0 ] != 0 )
+ return KOutMsg( "<%s>%s</%s>\n", tag, value, tag );
+ else
+ return 0;
+}
+
+static rc_t vdb_info_print_xml_uint64( const char * tag, const uint64_t value )
+{
+ if ( value != 0 )
+ return KOutMsg( "<%s>%lu</%s>\n", tag, value, tag );
+ else
+ return 0;
+}
+
+
+static rc_t vdb_info_print_xml_event( const char * tag, vdb_info_event * event )
+{
+ rc_t rc = 0;
+ if ( event->name[ 0 ] != 0 )
+ {
+ rc = KOutMsg( "<%s>\n", tag );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "NAME", event->name );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "VERS", event->vers.s_vers );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "TOOLDATE", event->tool_date.date );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "RUNDATE", event->run_date.date );
+ if ( rc == 0 )
+ rc = KOutMsg( "</%s>\n", tag );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_info_print_xml( vdb_info_data * data )
+{
+ rc_t rc = KOutMsg( "<info>\n" );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "acc", data->acc );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "path", data->path );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "size", data->file_size );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "type", data->s_path_type );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "platf", data->s_platform );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "SEQ", data->seq_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "REF", data->ref_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "PRIM", data->prim_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "SEC", data->sec_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "EVID", data->ev_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "EVINT", data->ev_int_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "CONS", data->consensus_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "PASS", data->passes_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_uint64( "METR", data->metrics_rows );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_s( "SCHEMA", data->schema_name );
+
+ if ( rc == 0 && data->ts.timestamp != 0 )
+ {
+ rc = KOutMsg( "<TIMESTAMP>0x%.016x</TIMESTAMP>\n", data->ts.timestamp );
+ if ( rc == 0 )
+ rc = KOutMsg( "<MONTH>%.02d</MONTH>\n", data->ts.month );
+ if ( rc == 0 )
+ rc = KOutMsg( "<DAY>%.02d</DAY>\n", data->ts.day );
+ if ( rc == 0 )
+ rc = KOutMsg( "<YEAR>%.02d</YEAR>\n", data->ts.year );
+ if ( rc == 0 )
+ rc = KOutMsg( "<HOUR>%.02d</HOUR>\n", data->ts.hour );
+ if ( rc == 0 )
+ rc = KOutMsg( "<MINUTE>%.02d</MINUTE>\n", data->ts.minute );
+ }
+
+ if ( rc == 0 && data->species[ 0 ] != 0 )
+ rc = vdb_info_print_xml_s( "SPECIES", data->species );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_event( "FORMATTER", &data->formatter );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_event( "LOADER", &data->loader );
+ if ( rc == 0 )
+ rc = vdb_info_print_xml_event( "UPDATE", &data->update );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "</info>\n" );
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static rc_t vdb_info_print_json_s( const char * tag, const char * value )
+{
+ if ( value[ 0 ] != 0 )
+ return KOutMsg( "\"%s\":\"%s\",\n", tag, value );
+ else
+ return 0;
+}
+
+static rc_t vdb_info_print_json_uint64( const char * tag, const uint64_t value )
+{
+ if ( value != 0 )
+ return KOutMsg( "\"%s\":%lu,\n", tag, value );
+ else
+ return 0;
+}
+
+static rc_t vdb_info_print_json_event( const char * tag, vdb_info_event * event )
+{
+ rc_t rc = 0;
+ if ( event->name[ 0 ] != 0 )
+ {
+ rc = KOutMsg( "\"%s\":{\n", tag );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "NAME", event->name );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "VERS", event->vers.s_vers );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "TOOLDATE", event->tool_date.date );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "RUNDATE", event->run_date.date );
+ if ( rc == 0 )
+ rc = KOutMsg( "},\n", tag );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_info_print_json( vdb_info_data * data )
+{
+ rc_t rc = KOutMsg( "{\n" );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "acc", data->acc );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "path", data->path );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "size", data->file_size );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "type", data->s_path_type );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "platf", data->s_platform );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "SEQ", data->seq_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "REF", data->ref_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "PRIM", data->prim_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "SEC", data->sec_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "EVID", data->ev_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "EVINT", data->ev_int_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "CONS", data->consensus_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "PASS", data->passes_rows );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_uint64( "METR", data->metrics_rows );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_json_s( "SCHEMA", data->schema_name );
+
+ if ( rc == 0 && data->ts.timestamp != 0 )
+ {
+ rc = vdb_info_print_json_uint64( "TIMESTAMP", data->ts.timestamp );
+ if ( rc == 0 )
+ rc = KOutMsg( "\"MONTH\":%d,\n", data->ts.month );
+ if ( rc == 0 )
+ rc = KOutMsg( "\"DAY\":%d,\n", data->ts.day );
+ if ( rc == 0 )
+ rc = KOutMsg( "\"YEAR\":%d,\n", data->ts.year );
+ if ( rc == 0 )
+ rc = KOutMsg( "\"HOUR\":%d,\n", data->ts.hour );
+ if ( rc == 0 )
+ rc = KOutMsg( "\"MINUTE\":%d,\n", data->ts.minute );
+ }
+
+ if ( rc == 0 && data->species[ 0 ] != 0 )
+ rc = vdb_info_print_json_s( "SPECIES", data->species );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_json_event( "FORMATTER", &data->formatter );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_event( "LOADER", &data->loader );
+ if ( rc == 0 )
+ rc = vdb_info_print_json_event( "UPDATE", &data->update );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "};\n" );
+ return rc;
+
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+static const char dflt_event_name[] = "-";
+
+static rc_t vdb_info_print_sep_event( vdb_info_event * event, const char sep, bool last )
+{
+ rc_t rc;
+ const char * ev_name = event->name;
+ if ( ev_name == NULL || ev_name[ 0 ] == 0 )
+ ev_name = dflt_event_name;
+
+ if ( last )
+ {
+ rc = KOutMsg( "'%s'%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d",
+ ev_name, sep,
+ event->vers.major, sep, event->vers.minor, sep, event->vers.release, sep,
+ event->tool_date.month, sep, event->tool_date.day, sep, event->tool_date.year, sep,
+ event->run_date.month, sep, event->run_date.day, sep, event->run_date.year );
+ }
+ else
+ {
+ rc = KOutMsg( "'%s'%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c",
+ ev_name, sep,
+ event->vers.major, sep, event->vers.minor, sep, event->vers.release, sep,
+ event->tool_date.month, sep, event->tool_date.day, sep, event->tool_date.year, sep,
+ event->run_date.month, sep, event->run_date.day, sep, event->run_date.year, sep );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_info_print_sep( vdb_info_data * data, const char sep )
+{
+ rc_t rc = KOutMsg( "'%s'%c%lu%c%c%c'%s'%c",
+ data->acc, sep, data->file_size, sep,
+ data->s_path_type[0], sep, &(data->s_platform[13]), sep );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu%c%lu%c%lu%c%lu%c%lu%c%lu%c%lu%c%lu%c%lu%c",
+ data->seq_rows, sep, data->ref_rows, sep,
+ data->prim_rows, sep, data->sec_rows, sep, data->ev_rows, sep,
+ data->ev_int_rows, sep, data->consensus_rows, sep,
+ data->passes_rows, sep, data->metrics_rows, sep );
+ if ( rc == 0 )
+ rc = KOutMsg( "'%s'%c%d%c%d%c%d%c%d%c%d%c",
+ data->schema_name, sep,
+ data->ts.month, sep, data->ts.day, sep, data->ts.year, sep,
+ data->ts.hour, sep, data->ts.minute, sep );
+
+ if ( rc == 0 )
+ {
+ if ( data->species[ 0 ] != 0 )
+ rc = KOutMsg( "'%s'%c", data->species, sep );
+ else
+ rc = KOutMsg( "-%c", sep );
+ }
+
+ if ( rc == 0 )
+ rc = vdb_info_print_sep_event( &data->formatter, sep, false );
+ if ( rc == 0 )
+ rc = vdb_info_print_sep_event( &data->loader, sep, false );
+ if ( rc == 0 )
+ rc = vdb_info_print_sep_event( &data->update, sep, true );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\n" );
+
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static rc_t vdb_info_print_dflt_date( vdb_info_date * d, const char *prefix0, const char *prefix1 )
+{
+ rc_t rc = 0;
+
+ if ( d->date[ 0 ] != 0 )
+ rc = KOutMsg( "%s%s: %s (%d/%d/%d %d:%d)\n", prefix0, prefix1,
+ d->date, d->month, d->day, d->year, d->hour, d->minute );
+
+ return rc;
+}
+
+static rc_t vdb_info_print_dflt_event( vdb_info_event * event, const char *prefix )
+{
+ rc_t rc = 0;
+ if ( event->name[ 0 ] != 0 )
+ rc = KOutMsg( "%s : %s\n", prefix, event->name );
+ if ( rc == 0 && event->vers.s_vers[ 0 ] != 0 )
+ rc = KOutMsg( "%sVER : %s\n", prefix, event->vers.s_vers );
+ if ( rc == 0 )
+ rc = vdb_info_print_dflt_date( &event->tool_date, prefix, "DATE" );
+ if ( rc == 0 )
+ rc = vdb_info_print_dflt_date( &event->run_date, prefix, "RUN " );
+ return rc;
+}
+
+
+static rc_t vdb_info_print_dflt( vdb_info_data * data )
+{
+ rc_t rc= KOutMsg( "acc : %s\n", data->acc );
+
+ if ( rc == 0 && data->path[ 0 ] != 0 )
+ rc = KOutMsg( "path : %s\n", data->path );
+
+ if ( rc == 0 && data->remote_path[ 0 ] != 0 )
+ rc = KOutMsg( "remote : %s\n", data->remote_path );
+
+ if ( rc == 0 && data->file_size != 0 )
+ rc = KOutMsg( "size : %,lu\n", data->file_size );
+
+ if ( rc == 0 && data->cache[ 0 ] != 0 )
+ {
+ rc = KOutMsg( "cache : %s\n", data->cache );
+ if ( rc == 0 )
+ rc = KOutMsg( "percent: %f\n", data->cache_percent );
+ if ( rc == 0 )
+ rc = KOutMsg( "bytes : %,lu\n", data->bytes_in_cache );
+ }
+
+ if ( rc == 0 && data->s_path_type[ 0 ] != 0 )
+ rc = KOutMsg( "type : %s\n", data->s_path_type );
+
+ if ( rc == 0 && data->s_platform[ 0 ] != 0 )
+ rc = KOutMsg( "platf : %s\n", data->s_platform );
+
+ if ( rc == 0 && data->seq_rows != 0 )
+ rc = KOutMsg( "SEQ : %,lu\n", data->seq_rows );
+
+ if ( rc == 0 && data->ref_rows != 0 )
+ rc = KOutMsg( "REF : %,lu\n", data->ref_rows );
+
+ if ( rc == 0 && data->prim_rows != 0 )
+ rc = KOutMsg( "PRIM : %,lu\n", data->prim_rows );
+
+ if ( rc == 0 && data->sec_rows != 0 )
+ rc = KOutMsg( "SEC : %,lu\n", data->sec_rows );
+
+ if ( rc == 0 && data->ev_rows != 0 )
+ rc = KOutMsg( "EVID : %,lu\n", data->ev_rows );
+
+ if ( rc == 0 && data->ev_int_rows != 0 )
+ rc = KOutMsg( "EVINT : %,lu\n", data->ev_int_rows );
+
+ if ( rc == 0 && data->consensus_rows != 0 )
+ rc = KOutMsg( "CONS : %,lu\n", data->consensus_rows );
+
+ if ( rc == 0 && data->passes_rows != 0 )
+ rc = KOutMsg( "PASS : %,lu\n", data->passes_rows );
+
+ if ( rc == 0 && data->metrics_rows != 0 )
+ rc = KOutMsg( "METR : %,lu\n", data->metrics_rows );
+
+ if ( rc == 0 && data->schema_name[ 0 ] != 0 )
+ rc = KOutMsg( "SCHEMA : %s\n", data->schema_name );
+
+ if ( rc == 0 && data->ts.timestamp != 0 )
+ rc = KOutMsg( "TIME : 0x%.016x (%.02d/%.02d/%d %.02d:%.02d)\n",
+ data->ts.timestamp, data->ts.month, data->ts.day, data->ts.year,
+ data->ts.hour, data->ts.minute );
+
+ if ( rc == 0 && data->species[ 0 ] != 0 )
+ rc = KOutMsg( "SPECIES: %s\n", data->species );
+
+ if ( rc == 0 )
+ vdb_info_print_dflt_event( &data->formatter, "FMT" );
+ if ( rc == 0 )
+ vdb_info_print_dflt_event( &data->loader, "LDR" );
+ if ( rc == 0 )
+ vdb_info_print_dflt_event( &data->update, "UPD" );
+
+ if ( rc == 0 && data->bam_hdr.present )
+ {
+ rc = KOutMsg( "BAMHDR : %d bytes / %d lines\n", data->bam_hdr.hdr_bytes, data->bam_hdr.total_lines );
+ if ( rc == 0 && data->bam_hdr.HD_lines > 0 )
+ rc = KOutMsg( "BAMHDR : %d HD-lines\n", data->bam_hdr.HD_lines );
+ if ( rc == 0 && data->bam_hdr.SQ_lines > 0 )
+ rc = KOutMsg( "BAMHDR : %d SQ-lines\n", data->bam_hdr.SQ_lines );
+ if ( rc == 0 && data->bam_hdr.RG_lines > 0 )
+ rc = KOutMsg( "BAMHDR : %d RG-lines\n", data->bam_hdr.RG_lines );
+ if ( rc == 0 && data->bam_hdr.PG_lines > 0 )
+ rc = KOutMsg( "BAMHDR : %d PG-lines\n", data->bam_hdr.PG_lines );
+ }
+
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+static rc_t vdb_info_print_sql_event( const char * prefix, bool last )
+{
+ rc_t rc = KOutMsg( "%s_NAME VARCHAR, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_VER_MAJOR INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_VER_MINOR INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_VER_RELEASE INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_TOOL_MONTH INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_TOOL_DAY INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_TOOL_YEAR INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_RUN_MONTH INTEGER, ", prefix );
+ if ( rc == 0 )
+ rc = KOutMsg( "%s_RUN_DAY INTEGER, ", prefix );
+
+ if ( rc == 0 )
+ {
+ if ( last )
+ rc = KOutMsg( "%s_RUN_YEAR INTEGER ", prefix );
+ else
+ rc = KOutMsg( "%s_RUN_YEAR INTEGER, ", prefix );
+ }
+ return rc;
+}
+
+static rc_t vdb_info_print_sql_header( const char * table_name )
+{
+ rc_t rc = KOutMsg( "CREATE TABLE %s ( ", table_name );
+ if ( rc == 0 )
+ rc = KOutMsg( "ACC VARCHAR(12) PRIMARY KEY, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "FILESIZE INTEGER, " );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "TAB_OR_DB VARCHAR(1), " );
+ if ( rc == 0 )
+ rc = KOutMsg( "PLATFORM VARCHAR(16), " );
+ if ( rc == 0 )
+ rc = KOutMsg( "SEQ_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "REF_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "PRIM_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "SEC_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "EV_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "EV_INT_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "CONS_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "PASS_ROWS INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "METR_ROWS INTEGER, " );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "SCHEMA VARCHAR, " );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "TS_MONTH INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "TS_DAY INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "TS_YEAR INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "TS_HOUR INTEGER, " );
+ if ( rc == 0 )
+ rc = KOutMsg( "TS_MINUTE INTEGER, " );
+
+ if ( rc == 0 )
+ vdb_info_print_sql_event( "FMT", false );
+ if ( rc == 0 )
+ vdb_info_print_sql_event( "LD", false );
+ if ( rc == 0 )
+ vdb_info_print_sql_event( "UPD", true );
+
+ if ( rc == 0 )
+ rc = KOutMsg( ");\n" );
+
+ return rc;
+}
+
+
+static rc_t vdb_info_print_ev_sql( vdb_info_event * event, bool last )
+{
+ rc_t rc;
+ if ( last )
+ {
+ rc = KOutMsg( "\'%s\', %d, %d, %d, %d, %d, %d, %d, %d, %d ",
+ event->name, event->vers.major, event->vers.minor, event->vers.release,
+ event->tool_date.month, event->tool_date.day, event->tool_date.year,
+ event->run_date.month, event->run_date.day, event->run_date.year );
+ }
+ else
+ {
+ rc = KOutMsg( "\'%s\', %d, %d, %d, %d, %d, %d, %d, %d, %d, ",
+ event->name, event->vers.major, event->vers.minor, event->vers.release,
+ event->tool_date.month, event->tool_date.day, event->tool_date.year,
+ event->run_date.month, event->run_date.day, event->run_date.year );
+ }
+ return rc;
+}
+
+
+static rc_t vdb_info_print_sql( const char * table_name, vdb_info_data * data )
+{
+ rc_t rc = KOutMsg( "INSERT INTO %s VALUES ( ", table_name );
+
+ if ( rc == 0 )
+ rc= KOutMsg( "\'%s\', ", data->acc );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->file_size );
+ if ( rc == 0 )
+ rc = KOutMsg( "\'%c\', ", data->s_path_type[0] );
+ if ( rc == 0 )
+ rc = KOutMsg( "\'%s\', ", &( data->s_platform[13] ) );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->seq_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->ref_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->prim_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->sec_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->ev_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->ev_int_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->consensus_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->passes_rows );
+ if ( rc == 0 )
+ rc = KOutMsg( "%lu, ", data->metrics_rows );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "\'%s\', ", data->schema_name );
+
+ if ( rc == 0 )
+ rc = KOutMsg( "%d, %d, %d, %d, %d, ",
+ data->ts.month, data->ts.day, data->ts.year, data->ts.hour, data->ts.minute );
+
+ if ( rc == 0 )
+ rc = vdb_info_print_ev_sql( &data->formatter, false );
+ if ( rc == 0 )
+ rc = vdb_info_print_ev_sql( &data->loader, false );
+ if ( rc == 0 )
+ rc = vdb_info_print_ev_sql( &data->update, true );
+
+ if ( rc == 0 )
+ rc = KOutMsg( ");\n" );
+
+ return rc;
+}
+
+
+/* ----------------------------------------------------------------------------- */
+
+
+static uint8_t digits_of( uint64_t value )
+{
+ uint8_t res = 0;
+ if ( value > 99999999999 ) res = 12;
+ else if ( value > 9999999999 ) res = 11;
+ else if ( value > 999999999 ) res = 10;
+ else if ( value > 99999999 ) res = 9;
+ else if ( value > 9999999 ) res = 8;
+ else if ( value > 999999 ) res = 7;
+ else if ( value > 99999 ) res = 6;
+ else if ( value > 9999 ) res = 5;
+ else if ( value > 999 ) res = 4;
+ else if ( value > 99 ) res = 3;
+ else if ( value > 9 ) res = 2;
+ else res = 1;
+ return res;
+}
+
+static rc_t vdb_info_1( VSchema * schema, dump_format_t format, const VDBManager *mgr,
+ const char * acc_or_path, const char * table_name )
+{
+ rc_t rc = 0;
+ vdb_info_data data;
+
+ memset( &data, 0, sizeof data );
+ data.s_platform = PT_NONE;
+ data.acc = acc_or_path;
+
+ /* #1 get path-type */
+ data.s_path_type = get_path_type( mgr, acc_or_path );
+
+ if ( data.s_path_type[ 0 ] == 'D' || data.s_path_type[ 0 ] == 'T' )
+ {
+ rc_t rc1;
+
+ /* #2 fork by table or database */
+ switch ( data.s_path_type[ 0 ] )
+ {
+ case 'D' : vdb_info_db( &data, schema, mgr ); break;
+ case 'T' : vdb_info_tab( &data, schema, mgr ); break;
+ }
+
+ /* try to resolve the path locally */
+ rc1 = resolve_accession( acc_or_path, data.path, sizeof data.path, false ); /* vdb-dump-helper.c */
+ if ( rc1 == 0 )
+ {
+ data.file_size = get_file_size( data.path, false );
+ resolve_remote_accession( acc_or_path, data.remote_path, sizeof data.remote_path ); /* vdb-dump-helper.c */
+ }
+ else
+ {
+ /* try to resolve the path remotely */
+ rc1 = resolve_accession( acc_or_path, data.path, sizeof data.path, true ); /* vdb-dump-helper.c */
+ if ( rc1 == 0 )
+ {
+ data.file_size = get_file_size( data.path, true );
+ /* try to find out the cache-file */
+ rc1 = resolve_cache( acc_or_path, data.cache, sizeof data.cache ); /* vdb-dump-helper.c */
+ if ( rc1 == 0 )
+ {
+ /* try to find out cache completeness */
+ check_cache_comleteness( data.cache, &data.cache_percent, &data.bytes_in_cache );
+ }
+ }
+ }
+
+ switch ( format )
+ {
+ case df_xml : rc = vdb_info_print_xml( &data ); break;
+ case df_json : rc = vdb_info_print_json( &data ); break;
+ case df_csv : rc = vdb_info_print_sep( &data, ',' ); break;
+ case df_tab : rc = vdb_info_print_sep( &data, '\t' ); break;
+ case df_sql : rc = vdb_info_print_sql( table_name, &data ); break;
+ default : rc = vdb_info_print_dflt( &data ); break;
+ }
+ }
+
+ return rc;
+}
+
+
+rc_t vdb_info( Vector * schema_list, dump_format_t format, const VDBManager *mgr,
+ const char * acc_or_path, struct num_gen * rows )
+{
+ rc_t rc = 0;
+ VSchema * schema = NULL;
+
+ vdh_parse_schema( mgr, &schema, schema_list, false );
+
+ if ( format == df_sql )
+ rc = vdb_info_print_sql_header( acc_or_path );
+
+ if ( rows != NULL && !num_gen_empty( rows ) )
+ {
+ const struct num_gen_iter * iter;
+ rc = num_gen_iterator_make( rows, &iter );
+ if ( rc == 0 )
+ {
+ int64_t max_row;
+ rc = num_gen_iterator_max( iter, &max_row );
+ if ( rc == 0 )
+ {
+ int64_t id;
+ uint8_t digits = digits_of( max_row );
+
+ while ( rc == 0 && num_gen_iterator_next( iter, &id, &rc ) )
+ {
+ char acc[ 64 ];
+ size_t num_writ;
+ rc_t rc1 = -1;
+ switch ( digits )
+ {
+ case 1 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%ld", acc_or_path, id ); break;
+ case 2 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.02ld", acc_or_path, id ); break;
+ case 3 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.03ld", acc_or_path, id ); break;
+ case 4 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.04ld", acc_or_path, id ); break;
+ case 5 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.05ld", acc_or_path, id ); break;
+ case 6 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.06ld", acc_or_path, id ); break;
+ case 7 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.07ld", acc_or_path, id ); break;
+ case 8 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.08ld", acc_or_path, id ); break;
+ case 9 : rc1 = string_printf ( acc, sizeof acc, &num_writ, "%s%.09ld", acc_or_path, id ); break;
+ }
+
+ if ( rc1 == 0 )
+ rc = vdb_info_1( schema, format, mgr, acc, acc_or_path );
+ }
+ }
+ num_gen_iterator_destroy( iter );
+ }
+ }
+ else
+ rc = vdb_info_1( schema, format, mgr, acc_or_path, acc_or_path );
+
+ if ( schema != NULL )
+ VSchemaRelease( schema );
+
+ return rc;
+}
diff --git a/tools/vdb-dump/vdb_info.h b/tools/vdb-dump/vdb_info.h
new file mode 100644
index 0000000..b83dfcd
--- /dev/null
+++ b/tools/vdb-dump/vdb_info.h
@@ -0,0 +1,47 @@
+/*===========================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#ifndef _h_vdb_info_
+#define _h_vdb_info_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#if 0
+}
+#endif
+
+#include <klib/rc.h>
+#include <vdb/manager.h>
+
+rc_t vdb_info( Vector * schema_list, dump_format_t format, const VDBManager *mgr,
+ const char * acc_or_path, struct num_gen * rows );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/vdb-validate/Makefile b/tools/vdb-validate/Makefile
new file mode 100644
index 0000000..b1d77f4
--- /dev/null
+++ b/tools/vdb-validate/Makefile
@@ -0,0 +1,96 @@
+# ===========================================================================
+#
+# PUBLIC DOMAIN NOTICE
+# National Center for Biotechnology Information
+#
+# This software/database is a "United States Government Work" under the
+# terms of the United States Copyright Act. It was written as part of
+# the author's official duties as a United States Government employee and
+# thus cannot be copyrighted. This software/database is freely available
+# to the public for use. The National Library of Medicine and the U.S.
+# Government have not placed any restriction on its use or reproduction.
+#
+# Although all reasonable efforts have been taken to ensure the accuracy
+# and reliability of the software and data, the NLM and the U.S.
+# Government do not and cannot warrant the performance or results that
+# may be obtained by using this software or data. The NLM and the U.S.
+# Government disclaim all warranties, express or implied, including
+# warranties of performance, merchantability or fitness for any particular
+# purpose.
+#
+# Please cite the author in any work or product based on this material.
+#
+# ===========================================================================
+
+
+default: std
+
+TOP ?= $(abspath ../..)
+MODULE = tools/vdb-validate
+
+INT_TOOLS = \
+
+EXT_TOOLS = \
+ vdb-validate \
+ check-corrupt
+
+ALL_TOOLS = \
+ $(INT_TOOLS) \
+ $(EXT_TOOLS)
+
+include $(TOP)/build/Makefile.env
+
+#------------------------------------------------------------------------------
+# outer targets
+#
+all std: makedirs
+ @ $(MAKE_CMD) $(TARGDIR)/$@-cmn
+
+$(ALL_TOOLS): makedirs
+ @ $(MAKE_CMD) $(BINDIR)/$@
+
+.PHONY: all std $(ALL_TOOLS)
+
+#-------------------------------------------------------------------------------
+# clean
+#
+clean: stdclean
+
+.PHONY: clean
+
+#-------------------------------------------------------------------------------
+# vdb-validate
+#
+VDB_VALIDATE_SRC = \
+ vdb-validate
+
+VDB_VALIDATE_OBJ = \
+ $(addsuffix .$(OBJX),$(VDB_VALIDATE_SRC))
+
+VDB_VALIDATE_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/vdb-validate: $(VDB_VALIDATE_OBJ)
+ $(LD) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(VDB_VALIDATE_LIB)
+
+
+#-------------------------------------------------------------------------------
+# check-corrupt
+#
+CHECK_CORRUPT_SRC = \
+ check-corrupt
+
+CHECK_CORRUPT_OBJ = \
+ $(addsuffix .$(OBJX),$(CHECK_CORRUPT_SRC))
+
+CHECK_CORRUPT_LIB = \
+ -lkapp \
+ -stk-version \
+ -sncbi-vdb \
+ -lm
+
+$(BINDIR)/check-corrupt: $(CHECK_CORRUPT_OBJ)
+ $(LP) --exe --vers $(SRCDIR)/../../shared/toolkit.vers -o $@ $^ $(CHECK_CORRUPT_LIB)
\ No newline at end of file
diff --git a/tools/vdb-validate/check-corrupt.cpp b/tools/vdb-validate/check-corrupt.cpp
new file mode 100644
index 0000000..92c056b
--- /dev/null
+++ b/tools/vdb-validate/check-corrupt.cpp
@@ -0,0 +1,764 @@
+/*==============================================================================
+*
+* PUBLIC DOMAIN NOTICE
+* National Center for Biotechnology Information
+*
+* This software/database is a "United States Government Work" under the
+* terms of the United States Copyright Act. It was written as part of
+* the author's official duties as a United States Government employee and
+* thus cannot be copyrighted. This software/database is freely available
+* to the public for use. The National Library of Medicine and the U.S.
+* Government have not placed any restriction on its use or reproduction.
+*
+* Although all reasonable efforts have been taken to ensure the accuracy
+* and reliability of the software and data, the NLM and the U.S.
+* Government do not and cannot warrant the performance or results that
+* may be obtained by using this software or data. The NLM and the U.S.
+* Government disclaim all warranties, express or implied, including
+* warranties of performance, merchantability or fitness for any particular
+* purpose.
+*
+* Please cite the author in any work or product based on this material.
+*
+* ===========================================================================
+*
+*/
+
+#include <klib/rc.h>
+#include <klib/log.h>
+#include <klib/out.h>
+#include <klib/writer.h>
+#include <kfs/directory.h>
+#include <vdb/manager.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/vdb-priv.h>
+#include <kdb/manager.h>
+
+#include <sstream>
+
+#include <cmath>
+
+#define SA_TABLE_LOOKUP_LIMIT 100000
+#define SEQ_TABLE_LOOKUP_LIMIT 100000
+#define PA_LONGER_SA_LIMIT 0.01
+
+typedef struct CheckCorruptConfig
+{
+ double sa_cutoff_percent; // negative when not used
+ uint64_t sa_cutoff_number; // only used when sa_cutoff_percent is negative
+
+ double seq_cutoff_percent; // negative when not used
+ uint64_t seq_cutoff_number; // only used when seq_cutoff_percent is negative
+
+ double pa_len_threshold_percent; // negative when not used
+ uint64_t pa_len_threshold_number; // only used when pa_len_threshold_percent is negative
+} CheckCorruptConfig;
+
+struct VDB_ERROR
+{
+ VDB_ERROR (const char * _msg, rc_t _rc)
+ : msg (_msg), rc (_rc)
+ {}
+
+ const char * msg;
+ rc_t rc;
+};
+
+struct VDB_ROW_ERROR
+{
+ VDB_ROW_ERROR (const char * _msg, int64_t _row_id, rc_t _rc)
+ : row_id ( _row_id ), msg (_msg), rc (_rc)
+ {}
+
+ int64_t row_id;
+ const char * msg;
+ rc_t rc;
+};
+
+struct DATA_ERROR
+{
+ DATA_ERROR (const std::string & _msg)
+ : msg(_msg)
+ {}
+
+ std::string msg;
+};
+
+/**
+ * returns true if checks are passed
+ */
+void runChecks ( const char * accession, const CheckCorruptConfig * config, const VCursor * pa_cursor, const VCursor * sa_cursor, const VCursor * seq_cursor )
+{
+ rc_t rc;
+ uint32_t pa_has_ref_offset_idx;
+ uint32_t sa_has_ref_offset_idx;
+ uint32_t sa_seq_spot_id_idx;
+ uint32_t sa_seq_read_id_idx;
+ uint32_t sa_pa_id_idx;
+ uint32_t sa_tmp_mismatch_idx;
+ uint32_t seq_pa_id_idx;
+ uint32_t seq_read_len_idx;
+ uint32_t seq_cmp_read_idx;
+ bool has_tmp_mismatch;
+
+ /* add columns to cursor */
+#define add_column(tbl_name, cursor, idx, col_spec) \
+ rc = VCursorAddColumn( cursor, &idx, col_spec ); \
+ if ( rc != 0 ) \
+ throw VDB_ERROR("VCursorAddColumn() failed for " tbl_name " table, " col_spec " column", rc);
+
+ add_column( "PRIMARY_ALIGNMENT", pa_cursor, pa_has_ref_offset_idx, "(bool)HAS_REF_OFFSET" );
+ add_column( "SECONDARY_ALIGNMENT", sa_cursor, sa_has_ref_offset_idx, "(bool)HAS_REF_OFFSET" );
+ add_column( "SECONDARY_ALIGNMENT", sa_cursor, sa_seq_spot_id_idx, "SEQ_SPOT_ID" );
+ add_column( "SECONDARY_ALIGNMENT", sa_cursor, sa_seq_read_id_idx, "SEQ_READ_ID" );
+ add_column( "SECONDARY_ALIGNMENT", sa_cursor, sa_pa_id_idx, "PRIMARY_ALIGNMENT_ID" );
+ add_column( "SEQUENCE", seq_cursor, seq_pa_id_idx, "PRIMARY_ALIGNMENT_ID" );
+ add_column( "SEQUENCE", seq_cursor, seq_read_len_idx, "READ_LEN" );
+ add_column( "SEQUENCE", seq_cursor, seq_cmp_read_idx, "CMP_READ" );
+
+ // optional columns
+ rc = VCursorAddColumn( sa_cursor, &sa_tmp_mismatch_idx, "TMP_MISMATCH" );
+ if ( rc == 0 )
+ has_tmp_mismatch = true;
+ else
+ {
+ has_tmp_mismatch = false;
+ rc = 0;
+ }
+
+
+#undef add_column
+
+ rc = VCursorOpen( pa_cursor );
+ if (rc != 0)
+ throw VDB_ERROR("VCursorOpen() failed for PRIMARY_ALIGNMENT table", rc);
+ rc = VCursorOpen( sa_cursor );
+ if (rc != 0)
+ throw VDB_ERROR("VCursorOpen() failed for SECONDARY_ALIGNMENT table", rc);
+ rc = VCursorOpen( seq_cursor );
+ if (rc != 0)
+ throw VDB_ERROR("VCursorOpen() failed for SEQUENCE table", rc);
+
+ int64_t sa_id_first;
+ uint64_t sa_row_count;
+
+ rc = VCursorIdRange( sa_cursor, sa_pa_id_idx, &sa_id_first, &sa_row_count );
+ if (rc != 0)
+ throw VDB_ERROR("VCursorIdRange() failed for SECONDARY_ALIGNMENT table, PRIMARY_ALIGNMENT_ID column", rc);
+
+ bool reported_about_no_pa = false;
+ uint64_t pa_longer_sa_rows = 0;
+ uint64_t pa_longer_sa_limit;
+ if (config->pa_len_threshold_percent > 0)
+ pa_longer_sa_limit = ceil( config->pa_len_threshold_percent * sa_row_count );
+ else if (config->pa_len_threshold_number == 0 || config->pa_len_threshold_number > sa_row_count)
+ pa_longer_sa_limit = sa_row_count;
+ else
+ pa_longer_sa_limit = config->pa_len_threshold_number;
+
+ uint64_t sa_row_limit;
+ if (config->sa_cutoff_percent > 0)
+ sa_row_limit = ceil( config->sa_cutoff_percent * sa_row_count );
+ else if (config->sa_cutoff_number == 0 || config->sa_cutoff_number > sa_row_count)
+ sa_row_limit = sa_row_count;
+ else
+ sa_row_limit = config->sa_cutoff_number;
+
+ for ( uint64_t i = 0; i < sa_row_count && i < sa_row_limit; ++i )
+ {
+ int64_t sa_row_id = i + sa_id_first;
+ const void * data_ptr = NULL;
+ uint32_t data_len;
+ uint32_t pa_row_len;
+ uint32_t sa_row_len;
+ uint32_t seq_read_len_len;
+
+ // SA:HAS_REF_OFFSET
+ rc = VCursorCellDataDirect ( sa_cursor, sa_row_id, sa_has_ref_offset_idx, NULL, (const void**)&data_ptr, NULL, &sa_row_len );
+ if ( rc != 0 )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, HAS_REF_OFFSET column", sa_row_id, rc);
+
+ const int64_t * p_seq_spot_id;
+ uint32_t seq_spot_id_len;
+ // SA:SEQ_SPOT_ID
+ rc = VCursorCellDataDirect ( sa_cursor, sa_row_id, sa_seq_spot_id_idx, NULL, (const void**)&p_seq_spot_id, NULL, &seq_spot_id_len );
+ if ( rc != 0 || p_seq_spot_id == NULL || seq_spot_id_len != 1 )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, SEQ_SPOT_ID column", sa_row_id, rc);
+
+ int64_t seq_spot_id = *p_seq_spot_id;
+ if (seq_spot_id == 0)
+ {
+ std::stringstream ss;
+ ss << "SECONDARY_ALIGNMENT:" << sa_row_id << " has SEQ_SPOT_ID = " << seq_spot_id;
+
+ throw DATA_ERROR(ss.str());
+ }
+
+ if ( has_tmp_mismatch )
+ {
+ const char * p_sa_tmp_mismatch;
+ // SA:TMP_MISMATCH
+ rc = VCursorCellDataDirect ( sa_cursor, sa_row_id, sa_tmp_mismatch_idx, NULL, (const void**)&p_sa_tmp_mismatch, NULL, &data_len );
+ if ( rc != 0 || p_sa_tmp_mismatch == NULL )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, TMP_MISMATCH column", sa_row_id, rc);
+
+ for ( uint32_t j = 0; j < data_len; ++j )
+ {
+ if ( p_sa_tmp_mismatch[j] == '=' )
+ {
+ std::stringstream ss;
+ ss << "SECONDARY_ALIGNMENT:" << sa_row_id << " TMP_MISMATCH contains '='";
+
+ throw DATA_ERROR(ss.str());
+ }
+ }
+ }
+
+ const int64_t * p_pa_row_id;
+ // SA:PRIMARY_ALIGNMENT_ID
+ rc = VCursorCellDataDirect ( sa_cursor, sa_row_id, sa_pa_id_idx, NULL, (const void**)&p_pa_row_id, NULL, &data_len );
+ if ( rc != 0 || p_pa_row_id == NULL || data_len != 1 )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, PRIMARY_ALIGNMENT_ID column", sa_row_id, rc);
+
+ int64_t pa_row_id = *p_pa_row_id;
+ if (pa_row_id == 0)
+ {
+ if (!reported_about_no_pa)
+ {
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) has secondary alignments without primary", "ACC=%s", accession));
+ reported_about_no_pa = true;
+ }
+ continue;
+ }
+
+ // PA:HAS_REF_OFFSET
+ rc = VCursorCellDataDirect ( pa_cursor, pa_row_id, pa_has_ref_offset_idx, NULL, &data_ptr, NULL, &pa_row_len );
+ if ( rc != 0 )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on PRIMARY_ALIGNMENT table, HAS_REF_OFFSET column", pa_row_id, rc);
+
+ // move on when PA.len equal to SA.len
+ if (pa_row_len == sa_row_len)
+ continue;
+
+ if (pa_row_len < sa_row_len)
+ {
+ std::stringstream ss;
+ ss << "PRIMARY_ALIGNMENT:" << pa_row_id << " HAS_REF_OFFSET length (" << pa_row_len << ") less than SECONDARY_ALIGNMENT:" << sa_row_id << " HAS_REF_OFFSET length (" << sa_row_len << ")";
+
+ throw DATA_ERROR(ss.str());
+ }
+
+ // we already know that pa_row_len > sa_row_len
+ ++pa_longer_sa_rows;
+
+ const int32_t * p_seq_read_id;
+ // SA:SEQ_READ_ID
+ rc = VCursorCellDataDirect ( sa_cursor, sa_row_id, sa_seq_read_id_idx, NULL, (const void**)&p_seq_read_id, NULL, &data_len );
+ if ( rc != 0 || p_seq_read_id == NULL || data_len != 1 )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, SEQ_READ_ID column", sa_row_id, rc);
+
+ // one-based read index
+ int32_t seq_read_id = *p_seq_read_id;
+
+ const uint32_t * p_seq_read_len;
+ // SEQ:READ_LEN
+ rc = VCursorCellDataDirect ( seq_cursor, seq_spot_id, seq_read_len_idx, NULL, (const void**)&p_seq_read_len, NULL, &seq_read_len_len );
+ if ( rc != 0 || p_seq_read_len == NULL )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SEQUENCE table, READ_LEN column", seq_spot_id, rc);
+
+ if ( seq_read_id < 1 || (uint32_t)seq_read_id > seq_read_len_len )
+ {
+ std::stringstream ss;
+ ss << "SECONDARY:" << sa_row_id << " SEQ_READ_ID value (" << seq_read_id << ") - 1 based, is out of SEQUENCE:" << seq_spot_id << " READ_LEN range (" << seq_read_len_len << ")";
+
+ throw DATA_ERROR(ss.str());
+ }
+
+ if (pa_row_len != p_seq_read_len[seq_read_id - 1])
+ {
+ std::stringstream ss;
+ ss << "PRIMARY_ALIGNMENT:" << pa_row_id << " HAS_REF_OFFSET length (" << pa_row_len << ") does not match its SEQUENCE:" << seq_spot_id << " READ_LEN[" << seq_read_id - 1 << "] value (" << p_seq_read_len[seq_read_id - 1] << ")";
+
+ throw DATA_ERROR(ss.str());
+ }
+
+ if (pa_longer_sa_rows >= pa_longer_sa_limit)
+ {
+ std::stringstream ss;
+ ss << "Limit violation (pa_longer_sa): there are at least " << pa_longer_sa_rows << " alignments where HAS_REF_OFFSET column is longer in PRIMARY_ALIGNMENT than in SECONDARY_ALIGNMENT";
+
+ throw DATA_ERROR(ss.str());
+ }
+ }
+
+ int64_t seq_id_first;
+ uint64_t seq_row_count;
+
+ rc = VCursorIdRange( seq_cursor, seq_pa_id_idx, &seq_id_first, &seq_row_count );
+ if (rc != 0)
+ throw VDB_ERROR("VCursorIdRange() failed for SEQUENCE table, PRIMARY_ALIGNMENT_ID column", rc);
+
+ uint64_t seq_row_limit;
+ if (config->seq_cutoff_percent > 0)
+ seq_row_limit = ceil( config->seq_cutoff_percent * seq_row_count );
+ else if (config->seq_cutoff_number == 0 || config->seq_cutoff_number > seq_row_count)
+ seq_row_limit = seq_row_count;
+ else
+ seq_row_limit = config->seq_cutoff_number;
+
+ for ( uint64_t i = 0; i < seq_row_count && i < seq_row_limit; ++i )
+ {
+ int64_t seq_row_id = i + seq_id_first;
+ const void * data_ptr = NULL;
+ uint32_t data_len;
+
+ const int64_t * p_seq_pa_id;
+ uint32_t seq_pa_id_len;
+ // SEQ:PRIMARY_ALIGNMENT_ID
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_pa_id_idx, NULL, (const void**)&p_seq_pa_id, NULL, &seq_pa_id_len );
+ if ( rc != 0 || p_seq_pa_id == NULL )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SEQUENCE table, PRIMARY_ALIGNMENT_ID column", seq_row_id, rc);
+
+ const uint32_t * p_seq_read_len;
+ // SEQ:READ_LEN
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_read_len_idx, NULL, (const void**)&p_seq_read_len, NULL, &data_len );
+ if ( rc != 0 || p_seq_read_len == NULL )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SEQUENCE table, READ_LEN column", seq_row_id, rc);
+ if ( seq_pa_id_len != data_len )
+ {
+ std::stringstream ss;
+ ss << "SEQUENCE:" << seq_row_id << " PRIMARY_ALIGNMENT_ID length (" << seq_pa_id_len << ") does not match SEQUENCE:" << seq_row_id << " READ_LEN length (" << data_len << ")";
+
+ throw DATA_ERROR(ss.str());
+ }
+
+ uint64_t sum_unaligned_read_len = 0;
+ for ( uint32_t j = 0; j < seq_pa_id_len; ++j )
+ {
+ if ( p_seq_pa_id[j] == 0 )
+ {
+ sum_unaligned_read_len += p_seq_read_len[j];
+ }
+ }
+
+ // SEQ:CMP_READ
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_cmp_read_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL )
+ throw VDB_ROW_ERROR("VCursorCellDataDirect() failed on SEQUENCE table, SEQ:CMP_READ column", seq_row_id, rc);
+
+ if ( sum_unaligned_read_len != data_len )
+ {
+ std::stringstream ss;
+ ss << "SEQUENCE:" << seq_row_id << " CMP_READ length (" << data_len << ") does not match sum of unaligned READ_LEN values (" << sum_unaligned_read_len << ")";
+
+ throw DATA_ERROR(ss.str());
+ }
+ }
+
+ if (sa_row_limit < sa_row_count || seq_row_limit < seq_row_count)
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) looks good (based on first $(SA_CUTOFF) of SECONDARY_ALIGNMENT and $(SEQ_CUTOFF) SEQUENCE rows)", "ACC=%s,SA_CUTOFF=%lu,SEQ_CUTOFF=%lu", accession, sa_row_limit, seq_row_limit));
+ else
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) looks good", "ACC=%s", accession));
+}
+
+/**
+ * returns true if accession is good
+ */
+bool checkAccession ( const char * accession, const CheckCorruptConfig * config )
+{
+ rc_t rc;
+ KDirectory * cur_dir;
+ const VDBManager * manager;
+ const VDatabase * database;
+ const VTable * pa_table;
+ const VTable * sa_table;
+ const VTable * seq_table;
+
+ const VCursor * pa_cursor;
+ const VCursor * sa_cursor;
+ const VCursor * seq_cursor;
+
+ rc = KDirectoryNativeDir( &cur_dir );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc, "$(ACC) KDirectoryNativeDir() failed", "ACC=%s", accession));
+ else
+ {
+ rc = VDBManagerMakeRead ( &manager, cur_dir );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc, "$(ACC) VDBManagerMakeRead() failed", "ACC=%s", accession));
+ else
+ {
+ int type = VDBManagerPathType ( manager, "%s", accession );
+ if ( ( type & ~ kptAlias ) != kptDatabase )
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) SKIPPING - can't be opened as a database", "ACC=%s", accession));
+ else
+ {
+ rc = VDBManagerOpenDBRead( manager, &database, NULL, "%s", accession );
+ if (rc != 0)
+ PLOGERR( klogInt, (klogInt, rc, "$(ACC) VDBManagerOpenDBRead() failed", "ACC=%s", accession));
+ else
+ {
+ rc = VDatabaseOpenTableRead( database, &pa_table, "%s", "PRIMARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) SKIPPING - failed to open PRIMARY_ALIGNMENT table", "ACC=%s", accession));
+ rc = 0;
+ }
+ else
+ {
+ rc = VTableCreateCursorRead( pa_table, &pa_cursor );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc, "$(ACC) VTableCreateCursorRead() failed for PRIMARY_ALIGNMENT cursor", "ACC=%s", accession));
+ else
+ {
+ rc = VDatabaseOpenTableRead( database, &sa_table, "%s", "SECONDARY_ALIGNMENT" );
+ if ( rc != 0 )
+ {
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) SKIPPING - failed to open SECONDARY_ALIGNMENT table", "ACC=%s", accession));
+ rc = 0;
+ }
+ else
+ {
+ rc = VTableCreateCursorRead( sa_table, &sa_cursor );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc, "$(ACC) VTableCreateCursorRead() failed for SECONDARY_ALIGNMENT cursor", "ACC=%s", accession));
+ else
+ {
+ rc = VDatabaseOpenTableRead( database, &seq_table, "%s", "SEQUENCE" );
+ if ( rc != 0 )
+ {
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) SKIPPING - failed to open SEQUENCE table", "ACC=%s", accession));
+ rc = 0;
+ }
+ else
+ {
+ rc = VTableCreateCursorRead( seq_table, &seq_cursor );
+ if ( rc != 0 )
+ PLOGERR( klogInt, (klogInt, rc, "VTableCreateCursorRead() failed for SEQUENCE cursor", "ACC=%s", accession));
+ else
+ {
+ try {
+ runChecks( accession, config, pa_cursor, sa_cursor, seq_cursor );
+ } catch ( VDB_ERROR & x ) {
+ PLOGERR (klogErr, (klogInfo, x.rc, "$(ACC) VDB error: $(MSG)", "ACC=%s,MSG=%s", accession, x.msg));
+ rc = 1;
+ } catch ( VDB_ROW_ERROR & x ) {
+ PLOGERR (klogErr, (klogInfo, x.rc, "$(ACC) VDB error: $(MSG) row_id: $(ROW_ID)", "ACC=%s,MSG=%s,ROW_ID=%ld", accession, x.msg, x.row_id));
+ rc = 1;
+ } catch ( DATA_ERROR & x ) {
+ KOutMsg("%s\n", accession);
+ PLOGMSG (klogInfo, (klogInfo, "$(ACC) Invalid data: $(MSG) ", "ACC=%s,MSG=%s", accession, x.msg.c_str()));
+ rc = 1;
+ }
+ VCursorRelease( seq_cursor );
+ }
+ VTableRelease( seq_table );
+ }
+ VCursorRelease( sa_cursor );
+ }
+ VTableRelease( sa_table );
+ }
+ VCursorRelease( pa_cursor );
+ }
+ VTableRelease( pa_table );
+ }
+ VDatabaseRelease( database );
+ }
+ }
+ VDBManagerRelease( manager );
+ }
+ KDirectoryRelease( cur_dir );
+ }
+ return rc == 0;
+}
+
+//////////////////////////////////////////// Main
+extern "C"
+{
+
+#include <kapp/args.h>
+#include <kapp/main.h>
+#include <kapp/log-xml.h>
+
+const char UsageDefaultName[] = "test-general-loader";
+
+#define ALIAS_SA_CUTOFF NULL
+#define OPTION_SA_CUTOFF "sa-cutoff"
+
+static const char * sa_cutoff_usage[] = { "specify maximum amount of secondary alignment rows to look at before saying accession is good, default 100000.",
+ "Specifying '0' will iterate the whole table. Can be in percent (e.g. 5%)",
+ NULL };
+
+#define ALIAS_SEQ_CUTOFF NULL
+#define OPTION_SEQ_CUTOFF "seq-cutoff"
+
+static const char * seq_cutoff_usage[] = { "specify maximum amount of sequence table rows to look at before saying accession is good, default 100000.",
+ "Specifying '0' will iterate the whole table. Can be in percent (e.g. 5%)",
+ NULL };
+
+#define ALIAS_SA_SHORT_THRESHOLD NULL
+#define OPTION_SA_SHORT_THRESHOLD "sa-short-threshold"
+static const char * sa_short_threshold_usage[] = { "specify amount of secondary alignment which are shorter (hard-clipped) than corresponding primaries, default 1%.",
+ NULL };
+
+OptDef Options[] = {
+ { OPTION_SA_CUTOFF , ALIAS_SA_CUTOFF , NULL, sa_cutoff_usage , 1, true , false },
+ { OPTION_SEQ_CUTOFF , ALIAS_SEQ_CUTOFF , NULL, seq_cutoff_usage , 1, true , false },
+ { OPTION_SA_SHORT_THRESHOLD , ALIAS_SA_SHORT_THRESHOLD , NULL, sa_short_threshold_usage , 1, true , false }
+};
+
+rc_t CC UsageSummary (const char * progname)
+{
+ return KOutMsg (
+ "\n"
+ "Usage:\n"
+ " %s [options] path [path ...]\n"
+ "\n"
+ "Summary:\n"
+ " Validate a list of runs for corrupted data\n"
+ "\n", progname);
+ return 0;
+}
+
+rc_t CC Usage ( const Args * args )
+{
+ const char * progname = UsageDefaultName;
+ const char * fullpath = UsageDefaultName;
+ rc_t rc;
+
+ if (args == NULL)
+ rc = RC (rcApp, rcArgv, rcAccessing, rcSelf, rcNull);
+ else
+ rc = ArgsProgram (args, &fullpath, &progname);
+ if (rc)
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary (progname);
+
+ KOutMsg ("Options:\n");
+
+ HelpOptionLine(ALIAS_SA_CUTOFF , OPTION_SA_CUTOFF , "cutoff" , sa_cutoff_usage);
+ HelpOptionLine(ALIAS_SEQ_CUTOFF , OPTION_SEQ_CUTOFF , "cutoff" , seq_cutoff_usage);
+ HelpOptionLine(ALIAS_SA_SHORT_THRESHOLD , OPTION_SA_SHORT_THRESHOLD , "threshold" , sa_short_threshold_usage);
+ XMLLogger_Usage();
+
+ KOutMsg ("\n");
+
+ HelpOptionsStandard ();
+
+ HelpVersion (fullpath, KAppVersion());
+
+ return rc;
+}
+
+rc_t parseArgs ( Args * args, CheckCorruptConfig * config )
+{
+ rc_t rc;
+ uint32_t opt_count;
+ rc = ArgsOptionCount ( args, OPTION_SA_CUTOFF, &opt_count );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SA_CUTOFF);
+ return rc;
+ }
+
+ if (opt_count > 0)
+ {
+ const char * value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SA_CUTOFF, 0, (const void **) &value );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SA_CUTOFF);
+ return rc;
+ }
+
+ value_size = string_size ( value );
+ if ( value_size >= 1 && value[value_size - 1] == '%' )
+ {
+ config->sa_cutoff_percent = string_to_U64 ( value, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SA_CUTOFF);
+ return rc;
+ }
+ else if (config->sa_cutoff_percent == 0 || config->sa_cutoff_percent > 100)
+ {
+ LOGERR (klogInt, rc, OPTION_SA_CUTOFF " has illegal percentage value (has to be 1-100%)" );
+ return 1;
+ }
+ config->sa_cutoff_percent /= 100;
+ }
+ else
+ {
+ config->sa_cutoff_percent = -1;
+ config->sa_cutoff_number = string_to_U64 ( value, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SA_CUTOFF);
+ return rc;
+ }
+ }
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_SEQ_CUTOFF, &opt_count );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SEQ_CUTOFF);
+ return rc;
+ }
+
+ if (opt_count > 0)
+ {
+ const char * value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SEQ_CUTOFF, 0, (const void **) &value );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SEQ_CUTOFF);
+ return rc;
+ }
+
+ value_size = string_size ( value );
+ if ( value_size >= 1 && value[value_size - 1] == '%' )
+ {
+ config->seq_cutoff_percent = string_to_U64 ( value, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SEQ_CUTOFF);
+ return rc;
+ }
+ else if (config->seq_cutoff_percent == 0 || config->seq_cutoff_percent > 100)
+ {
+ LOGERR (klogInt, rc, OPTION_SEQ_CUTOFF " has illegal percentage value (has to be 1-100%)" );
+ return 1;
+ }
+ config->seq_cutoff_percent /= 100;
+ }
+ else
+ {
+ config->seq_cutoff_percent = -1;
+ config->seq_cutoff_number = string_to_U64 ( value, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SEQ_CUTOFF);
+ return rc;
+ }
+ }
+ }
+
+ rc = ArgsOptionCount ( args, OPTION_SA_SHORT_THRESHOLD, &opt_count );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SA_SHORT_THRESHOLD);
+ return rc;
+ }
+
+ if (opt_count > 0)
+ {
+ const char * value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SA_SHORT_THRESHOLD, 0, (const void **) &value );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SA_SHORT_THRESHOLD);
+ return rc;
+ }
+
+ value_size = string_size ( value );
+ if ( value_size >= 1 && value[value_size - 1] == '%' )
+ {
+ config->pa_len_threshold_percent = string_to_U64 ( value, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SA_SHORT_THRESHOLD);
+ return rc;
+ }
+ else if (config->pa_len_threshold_percent == 0 || config->pa_len_threshold_percent > 100)
+ {
+ LOGERR (klogInt, rc, OPTION_SA_SHORT_THRESHOLD " has illegal percentage value (has to be 1-100%)" );
+ return 1;
+ }
+ config->pa_len_threshold_percent /= 100;
+ }
+ else
+ {
+ config->pa_len_threshold_percent = -1;
+ config->pa_len_threshold_number = string_to_U64 ( value, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SA_SHORT_THRESHOLD);
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+rc_t CC KMain ( int argc, char *argv [] )
+{
+ XMLLogger const *xlogger = NULL;
+ Args * args;
+ rc_t rc;
+ bool any_failed = false;
+ CheckCorruptConfig config = { -1.0, SA_TABLE_LOOKUP_LIMIT, -1.0, SEQ_TABLE_LOOKUP_LIMIT, PA_LONGER_SA_LIMIT, 0 };
+
+ KLogLevelSet(klogInfo);
+
+ rc = ArgsMakeAndHandle (&args, argc, argv, 2, Options,
+ sizeof (Options) / sizeof (Options[0]),
+ XMLLogger_Args, XMLLogger_ArgsQty);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to parse command line parameters");
+ else
+ {
+ rc = XMLLogger_Make(&xlogger, NULL, args);
+ if (rc)
+ LOGERR (klogInt, rc, "failed to make xml logger");
+ else
+ {
+ rc = parseArgs ( args, &config );
+ if (rc == 0)
+ {
+ uint32_t pcount;
+ rc = ArgsParamCount ( args, &pcount );
+ if (rc)
+ LOGERR (klogInt, rc, "ArgsParamCount() failed");
+ else
+ {
+ if ( pcount == 0 )
+ LOGMSG (klogErr, "no accessions were passed in");
+ else
+ {
+ for ( uint32_t i = 0; i < pcount; ++i )
+ {
+ const char * accession;
+ rc = ArgsParamValue ( args, i, (const void **)&accession );
+ if (rc)
+ {
+ PLOGERR (klogInt, (klogInt, rc, "failed to get $(PARAM_I) accession from command line", "PARAM_I=%d", i));
+ any_failed = true;
+ }
+ else
+ {
+ if (!checkAccession ( accession, &config ))
+ any_failed = true;
+ }
+ }
+
+ if (!any_failed)
+ LOGMSG (klogInfo, "All accessions are good!");
+ }
+ }
+ }
+ XMLLogger_Release(xlogger);
+ }
+ ArgsWhack ( args );
+ }
+ return rc != 0 || any_failed ? 1 : 0;
+}
+
+}
diff --git a/tools/vdb-validate/vdb-validate.c b/tools/vdb-validate/vdb-validate.c
new file mode 100644
index 0000000..32eb1b6
--- /dev/null
+++ b/tools/vdb-validate/vdb-validate.c
@@ -0,0 +1,3351 @@
+/*===========================================================================
+ *
+ * PUBLIC DOMAIN NOTICE
+ * National Center for Biotechnology Information
+ *
+ * This software/database is a "United States Government Work" under the
+ * terms of the United States Copyright Act. It was written as part of
+ * the author's official duties as a United States Government employee and
+ * thus cannot be copyrighted. This software/database is freely available
+ * to the public for use. The National Library of Medicine and the U.S.
+ * Government have not placed any restriction on its use or reproduction.
+ *
+ * Although all reasonable efforts have been taken to ensure the accuracy
+ * and reliability of the software and data, the NLM and the U.S.
+ * Government do not and cannot warrant the performance or results that
+ * may be obtained by using this software or data. The NLM and the U.S.
+ * Government disclaim all warranties, express or implied, including
+ * warranties of performance, merchantability or fitness for any particular
+ * purpose.
+ *
+ * Please cite the author in any work or product based on this material.
+ *
+ * ===========================================================================
+ *
+ */
+
+#include <vfs/manager-priv.h> /* VFSManagerOpenFileReadDecrypt */
+#include <vfs/manager.h> /* VFSManagerMake */
+#include <vfs/resolver.h> /* VResolver */
+#include <vfs/path.h> /* VPathMake */
+
+#include <kapp/main.h>
+#include <kapp/args.h>
+#include <kapp/log-xml.h>
+
+#include <kdb/manager.h>
+#include <kdb/database.h>
+#include <kdb/table.h>
+#include <kdb/meta.h>
+#include <kdb/namelist.h>
+#include <kdb/consistency-check.h>
+#include <kdb/kdb-priv.h> /* KTableOpenDirectoryRead */
+
+#include <vdb/manager.h>
+#include <vdb/schema.h>
+#include <vdb/database.h>
+#include <vdb/table.h>
+#include <vdb/cursor.h>
+#include <vdb/dependencies.h> /* UIError */
+#include <vdb/vdb-priv.h> /* VTableOpenKTableRead */
+
+#include <krypto/encfile.h> /* KEncFileValidate */
+#include <krypto/wgaencrypt.h> /* KEncFileValidate */
+
+#include <kfs/kfs-priv.h>
+#include <kfs/sra.h>
+#include <kfs/tar.h>
+#include <kfs/file.h> /* KFileRelease */
+
+#include <insdc/insdc.h>
+#include <insdc/sra.h>
+#include <sra/srapath.h>
+#include <sra/sradb.h>
+#include <sra/sraschema.h>
+
+#include <klib/out.h>
+#include <klib/log.h>
+#include <klib/rc.h>
+#include <klib/namelist.h>
+#include <klib/container.h>
+#include <klib/text.h> /* String */
+#include <klib/status.h> /* STSMSG */
+#include <klib/debug.h>
+#include <klib/data-buffer.h>
+#include <klib/sort.h>
+
+#include <sysalloc.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include <math.h>
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#define RELEASE(type, obj) do { rc_t rc2 = type##Release(obj); \
+ if (rc2 != 0 && rc == 0) { rc = rc2; } obj = NULL; } while (false)
+
+#define SDC_ROW_CHUNK_MAX 8ull*1024ull*1024ull
+
+#if 0
+#define DBG_MSG(args) KOutMsg args
+#else
+#define DBG_MSG(args)
+#endif
+
+static bool exhaustive;
+static bool md5_required;
+static bool ref_int_check;
+static bool s_IndexOnly;
+static size_t memory_suggestion = (2ull * 1024ull * 1024ull * 1024ull);
+
+typedef struct node_s {
+ int parent;
+ int prvSibl;
+ int nxtSibl;
+ int firstChild;
+ unsigned depth;
+ unsigned name;
+ uint32_t objType;
+} node_t;
+typedef struct cc_context_s {
+ node_t *nodes;
+ char *names;
+ rc_t rc;
+ unsigned num_columns;
+ unsigned nextNode;
+ unsigned nextName;
+} cc_context_t;
+static
+rc_t report_rtn ( rc_t rc )
+{
+ return exhaustive ? 0 : rc;
+}
+
+static rc_t report_index(CCReportInfoBlock const *what, cc_context_t *ctx)
+{
+ switch (what->type) {
+ case ccrpt_Done:
+ if (what->info.done.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.done.rc,
+ "Index '$(index)': $(mesg)",
+ "index=%s,mesg=%s", what->objName, what->info.done.mesg));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.done.rc;
+ }
+ return report_rtn (what->info.done.rc);
+ case ccrpt_Index:
+ return 0; /* continue with check */
+ case ccrpt_MD5:
+ if (what->info.MD5.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.MD5.rc,
+ "File '$(file)' of index '$(index)' failed MD5 check",
+ "file=%s,index=%s", what->info.MD5.file, what->objName));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.MD5.rc;
+ }
+ return report_rtn (what->info.MD5.rc);
+ default:
+ return RC(rcExe, rcTable, rcVisiting, rcParam, rcUnexpected);
+ }
+}
+
+static rc_t report_column(CCReportInfoBlock const *what, cc_context_t *ctx)
+{
+ switch (what->type) {
+ case ccrpt_Done:
+ if (what->info.done.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.done.rc,
+ "Column '$(column)': $(mesg)",
+ "column=%s,mesg=%s", what->objName, what->info.done.mesg));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.done.rc;
+ }
+ else {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Column '$(column)': $(mesg)",
+ "column=%s,mesg=%s", what->objName,
+ what->info.done.mesg ? what->info.done.mesg : "checked"));
+ ++ctx->num_columns;
+ }
+ return report_rtn (what->info.done.rc);
+ case ccrpt_Blob:
+ return 0; /* continue with check */
+ case ccrpt_MD5:
+ if (what->info.MD5.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.MD5.rc,
+ "File '$(file)' of column '$(column)' failed MD5 check",
+ "file=%s,column=%s", what->info.MD5.file, what->objName));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.MD5.rc;
+ }
+ return report_rtn (what->info.MD5.rc);
+ default:
+ return RC(rcExe, rcTable, rcVisiting, rcParam, rcUnexpected);
+ }
+}
+
+static rc_t report_table(CCReportInfoBlock const *what, cc_context_t *ctx)
+{
+ switch (what->type) {
+ case ccrpt_Done:
+ if (what->info.done.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.done.rc,
+ "Table '$(table)': $(mesg)",
+ "table=%s,mesg=%s", what->objName, what->info.done.mesg));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.done.rc;
+ }
+ else if (what->info.done.mesg) {
+ if (strcmp(what->info.done.mesg, "missing md5 file") == 0
+ && md5_required)
+ {
+ rc_t rc = RC(0, rcTable, rcValidating, rcChecksum, rcNotFound);
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Table '$(table)': is missing required md5 files",
+ "table=%s", what->objName));
+ return rc;
+ }
+ else if (strncmp("unexpected object ",
+ what->info.done.mesg, 18) == 0)
+ {
+ (void)PLOGMSG(klogWarn, (klogWarn,
+ "Table '$(tbl)': $(mesg)", "tbl=%s,mesg=%s",
+ what->objName, what->info.done.mesg));
+ }
+ else {
+ (void)PLOGMSG(klogInfo, (klogInfo,
+ "Table '$(tbl)' metadata: $(mesg)",
+ "tbl=%s,mesg=%s", what->objName, what->info.done.mesg));
+ }
+ }
+ return report_rtn (what->info.done.rc);
+ case ccrpt_MD5:
+ if (what->info.MD5.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.MD5.rc,
+ "File '$(file)' of table '$(table)' failed MD5 check",
+ "file=%s,table=%s", what->info.MD5.file, what->objName));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.MD5.rc;
+ }
+ return report_rtn (what->info.MD5.rc);
+ default:
+ return RC(rcExe, rcTable, rcVisiting, rcParam, rcUnexpected);
+ }
+}
+
+static rc_t report_database(CCReportInfoBlock const *what, cc_context_t *ctx)
+{
+ switch (what->type) {
+ case ccrpt_Done:
+ if (what->info.done.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.done.rc,
+ "Database '$(db)': $(mesg)",
+ "db=%s,mesg=%s", what->objName, what->info.done.mesg));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.done.rc;
+ }
+ else if (what->info.done.mesg) {
+ if (strcmp(what->info.done.mesg, "missing md5 file") == 0
+ && md5_required)
+ {
+ rc_t rc
+ = RC(rcExe, rcTable, rcValidating, rcChecksum, rcNotFound);
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Database '$(table)': is missing required md5 files",
+ "table=%s", what->objName));
+ return rc;
+ }
+ else {
+ (void)PLOGMSG(klogInfo, (klogInfo,
+ "Database '$(db)' metadata: $(mesg)",
+ "db=%s,mesg=%s", what->objName, what->info.done.mesg));
+ }
+ }
+ return report_rtn (what->info.done.rc);
+ case ccrpt_MD5:
+ if (what->info.MD5.rc) {
+ (void)PLOGERR(klogErr, (klogErr, what->info.MD5.rc,
+ "File '$(file)' of database '$(db)' failed MD5 check",
+ "file=%s,db=%s", what->info.MD5.file, what->objName));
+ if (ctx->rc == 0)
+ ctx->rc = what->info.MD5.rc;
+ }
+ return report_rtn (what->info.MD5.rc);
+ default:
+ return RC(rcExe, rcTable, rcVisiting, rcParam, rcUnexpected);
+ }
+}
+
+static rc_t visiting(CCReportInfoBlock const *what, cc_context_t *ctx)
+{
+ unsigned const nn = ctx->nextNode++;
+ node_t *const nxt = &ctx->nodes[nn];
+ node_t *const cur = nxt - 1;
+
+ nxt->parent = nxt->prvSibl = nxt->nxtSibl = nxt->firstChild = -1;
+ nxt->depth = what->info.visit.depth;
+ nxt->objType = what->objType;
+ nxt->name = ctx->nextName;
+ ctx->nextName += (unsigned)strlen(what->objName) + 1;
+ strcpy(&ctx->names[nxt->name], what->objName);
+
+ if (nn) {
+ if (cur->depth == nxt->depth) {
+ nxt->parent = cur->parent;
+ nxt->prvSibl = nn - 1;
+ cur->nxtSibl = nn;
+ }
+ else if (cur->depth < nxt->depth) {
+ nxt->parent = nn - 1;
+ cur->firstChild = nn;
+ }
+ else {
+ unsigned sibling = cur->parent;
+
+ while (ctx->nodes[sibling].depth > nxt->depth)
+ sibling = ctx->nodes[sibling].parent;
+ nxt->parent = ctx->nodes[sibling].parent;
+ nxt->prvSibl = sibling;
+ ctx->nodes[sibling].nxtSibl = nn;
+ }
+ }
+ return 0;
+}
+
+static rc_t CC report(CCReportInfoBlock const *what, void *Ctx)
+{
+ cc_context_t *ctx = Ctx;
+ rc_t rc = Quitting();
+
+ if (rc)
+ return rc;
+
+ if (what->type == ccrpt_Visit)
+ return visiting(what, ctx);
+
+ switch (what->objType) {
+ case kptDatabase:
+ return report_database(what, ctx);
+ case kptTable:
+ return report_table(what, ctx);
+ case kptColumn:
+ return report_column(what, ctx);
+ case kptIndex:
+ return report_index(what, ctx);
+ default:
+ return RC(rcExe, rcTable, rcVisiting, rcParam, rcUnexpected);
+ }
+}
+
+static
+rc_t kdbcc ( const KDBManager *mgr, char const name[], uint32_t mode,
+ KPathType *pathType, bool is_file, node_t nodes[], char names[],
+ INSDC_SRA_platform_id platform )
+{
+ rc_t rc = 0;
+ cc_context_t ctx;
+ char const *objtype;
+
+ uint32_t level = ( mode & 4 ) ? 3 : ( mode & 2 ) ? 1 : 0;
+ if (s_IndexOnly)
+ level |= CC_INDEX_ONLY;
+
+
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.nodes = &nodes[0];
+ ctx.names = &names[0];
+
+ if (KDBManagerExists(mgr, kptDatabase, "%s", name))
+ *pathType = kptDatabase;
+ else if (KDBManagerExists(mgr, kptTable, "%s", name))
+ *pathType = kptTable;
+ else if (*pathType == kptDatabase || *pathType == kptTable)
+ /* is known already: may be encrypted */ ( void) 0;
+ else
+ {
+ rc = RC(rcExe, rcPath, rcValidating, rcType, rcUnknown);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Object '$(table)' "
+ "has unknown type", "table=%s", name));
+ return rc;
+ }
+
+ if (*pathType == kptDatabase)
+ {
+ const KDatabase *db;
+
+ objtype = "database";
+ rc = KDBManagerOpenDBRead ( mgr, & db, "%s", name );
+ if ( rc == 0 )
+ {
+ rc = KDatabaseConsistencyCheck ( db, 0, level, report, & ctx );
+ if ( rc == 0 )
+ {
+ rc = ctx.rc;
+ if ( s_IndexOnly )
+ (void)LOGMSG(klogInfo, "Indices: checked");
+ }
+
+ KDatabaseRelease ( db );
+ }
+ }
+ else
+ {
+ const KTable *tbl;
+
+ objtype = "table";
+ rc = KDBManagerOpenTableRead ( mgr, & tbl, "%s", name );
+ if ( rc == 0 )
+ {
+ rc = KTableConsistencyCheck ( tbl, 0, level, report, & ctx, platform );
+ if ( rc == 0 )
+ rc = ctx.rc;
+
+ if ( rc == 0 && s_IndexOnly )
+ (void)LOGMSG(klogInfo, "Index: checked");
+
+ KTableRelease ( tbl );
+ }
+ }
+
+ if (rc == 0 && ctx.num_columns == 0 && !s_IndexOnly)
+ {
+ if (is_file)
+ {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Nothing to validate; "
+ "the file '$(file)' has no checksums or is truncated.",
+ "file=%s", name));
+ }
+ else
+ {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Nothing to validate; "
+ "the $(type) '$(file)' has no checksums or is empty.",
+ "type=%s,file=%s", objtype, name));
+ }
+ }
+
+ return rc;
+}
+
+static
+rc_t vdbcc ( const VDBManager *mgr, char const name[], uint32_t mode,
+ KPathType *pathType, bool is_file)
+{
+#if 0
+ if ( ( mode & 8) != 0 )
+ {
+ const VTable *tbl;
+ rc_t rc = VDBManagerOpenTableRead(mgr, &tbl, NULL, "%s", name);
+ if (rc == 0)
+ rc = VTableConsistencyCheck(tbl, 2);
+ return rc;
+ }
+#endif
+ return 0;
+}
+
+typedef struct ColumnInfo_s {
+ char const *name;
+ union {
+ void const *vp;
+ char const *string;
+ bool const *tf;
+ int8_t const *i8;
+ uint8_t const *u8;
+ int16_t const *i16;
+ uint16_t const *u16;
+ int32_t const *i32;
+ uint32_t const *u32;
+ int64_t const *i64;
+ uint64_t const *u64;
+ float const *f32;
+ double const *f64;
+ } value;
+ uint32_t idx;
+ uint32_t elem_bits;
+ uint32_t elem_count;
+} ColumnInfo;
+
+static rc_t CC get_sizes_cb(const KDirectory *dir,
+ uint32_t type, const char *name, void *data)
+{
+ struct {
+ unsigned count;
+ size_t size;
+ } *pb = data;
+
+ ++pb->count;
+ pb->size += strlen(name) + 1;
+
+ return 0;
+}
+
+static rc_t get_sizes(KDirectory const *dir, unsigned *nobj, size_t *namesz)
+{
+ rc_t rc;
+ struct {
+ unsigned count;
+ size_t size;
+ } pb;
+
+ memset(&pb, 0, sizeof(pb));
+ rc = KDirectoryVVisit(dir, true, get_sizes_cb, &pb, NULL, NULL);
+ if (rc)
+ memset(&pb, 0, sizeof(pb));
+ *nobj = pb.count;
+ *namesz = pb.size;
+ return rc;
+}
+
+static rc_t EncFileReadAll(const char *name,
+ char *buffer, size_t bsize, size_t *num_read)
+{
+ rc_t rc = 0;
+
+ VFSManager *mgr = NULL;
+ VPath *path = NULL;
+ const KFile *f = NULL;
+
+ rc = VFSManagerMake(&mgr);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failed to VFSManagerMake()");
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerMakePath (mgr, &path, "%s", name);
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to VPathMake($(name))", "name=%s", name));
+ }
+ }
+
+ if (rc == 0) {
+ rc = VFSManagerOpenFileReadDecrypt(mgr, &f, path);
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to VFSManagerOpenFileReadDecrypt($(name))",
+ "name=%s", name));
+ }
+ }
+
+ if (rc == 0) {
+ rc = KFileReadAll(f, 0, buffer, bsize, num_read);
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to KFileReadAll($(name))", "name=%s", name));
+ }
+ }
+
+ KFileRelease(f);
+ VPathRelease(path);
+ VFSManagerRelease(mgr);
+
+ return rc;
+}
+
+
+#if 0
+static rc_t verify_encryption(const KDirectory *dir, const char *name,
+ bool *enc, bool *sra)
+{
+ rc_t rc = 0;
+ const KFile *f = NULL;
+ char buffer[24];
+ size_t num_read = ~0;
+
+ assert(enc && sra);
+ *enc = false;
+ *sra = true;
+
+ rc = KDirectoryOpenFileRead(dir, &f, "%s", name);
+ if (rc == 0) {
+ rc = KFileReadAll(f, 0, &buffer, sizeof buffer, &num_read);
+ }
+
+ if (rc == 0) {
+ size_t sz = num_read < 8 ? num_read : 8;
+ assert(num_read <= sizeof buffer);
+ rc = KFileIsEnc(buffer, sz);
+ if (rc == 0)
+ {
+ (void)PLOGMSG(klogInfo, (klogInfo, "File '$(f)' is encrypted",
+ "f=%s", name));
+ *enc = true;
+ rc = KEncFileValidate(f);
+ if (rc != 0) {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Failure of encryption "
+ "validation of file '$(name)'", "name=%s", name));
+ }
+ else {
+ (void)PLOGMSG(klogInfo, (klogInfo, "File '$(f)': encryption OK",
+ "f=%s", name));
+ rc = EncFileReadAll(name, buffer, sizeof buffer, &num_read);
+ }
+ }
+ else {
+ rc = 0;
+ (void)PLOGMSG(klogInfo, (klogInfo, "File '$(f)' is not encrypted",
+ "f=%s", name));
+ }
+ }
+
+ if (rc == 0) {
+ rc = KFileIsSRA(buffer, num_read);
+ if (rc == 0) {
+ *sra = true;
+ }
+ else if (rc
+ == SILENT_RC(rcFS, rcFile, rcIdentifying, rcBuffer, rcWrongType))
+ {
+ rc = 0;
+ *sra = false;
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to KFileIsSRA($(name))", "name=%s", name));
+ }
+ }
+
+ KFileRelease(f);
+
+ return rc;
+}
+#endif
+
+static rc_t init_dbcc(KDirectory const *dir, char const name[], bool is_file,
+ node_t **nodes, char **names, KPathType *pathType)
+{
+ KDirectory const *obj;
+ unsigned nobj;
+ size_t namesz;
+ rc_t rc = 0;
+
+ assert(pathType);
+
+ if (is_file) {
+ rc = KDirectoryOpenSraArchiveRead_silent(dir, &obj, false, "%s", name);
+ if (rc != 0)
+ { rc = KDirectoryOpenTarArchiveRead_silent(dir, &obj, false, "%s", name); }
+ if (rc != 0) {
+ const VDBManager *mgr = NULL;
+ const VTable *tbl = NULL;
+ VSchema *sra_schema = NULL;
+ rc = VDBManagerMakeRead(&mgr, dir);
+ if (rc != 0)
+ { return rc; }
+ for ( ; rc == 0; ) {
+ rc = VDBManagerOpenTableRead(mgr, &tbl, sra_schema, "%s", name);
+ VSchemaRelease(sra_schema);
+ if (rc == 0) {
+ const KTable *ktbl = NULL;
+ rc = VTableOpenKTableRead(tbl, &ktbl);
+ if (rc == 0)
+ { rc = KTableOpenDirectoryRead(ktbl, &obj); }
+ KTableRelease(ktbl);
+ *pathType = kptTable;
+ break;
+ }
+ else if (GetRCState(rc) == rcNotFound
+ && GetRCObject(rc) == (enum RCObject)rcSchema && sra_schema == NULL)
+ {
+ rc = VDBManagerMakeSRASchema(mgr, &sra_schema);
+ }
+ else {
+ const VDatabase *db = NULL;
+ const KDatabase *kdb = NULL;
+ rc = VDBManagerOpenDBRead(mgr, &db, NULL, "%s", name);
+ if (rc == 0)
+ { rc = VDatabaseOpenKDatabaseRead(db, &kdb); }
+ if (rc == 0)
+ { rc = KDatabaseOpenDirectoryRead(kdb, &obj); }
+ if (rc == 0)
+ { *pathType = kptDatabase; }
+ KDatabaseRelease(kdb);
+ VDatabaseRelease(db);
+ break;
+ }
+ }
+ VTableRelease(tbl);
+ VDBManagerRelease(mgr);
+ }
+ }
+ else {
+ rc = KDirectoryOpenDirRead(dir, &obj, false, "%s", name);
+ }
+ if (rc)
+ return rc;
+ rc = get_sizes(obj, &nobj, &namesz);
+ KDirectoryRelease(obj);
+ if (rc) {
+ *nodes = NULL;
+ *names = NULL;
+ }
+ else {
+ *nodes = calloc(1, nobj * sizeof(**nodes) + namesz);
+ if (nodes)
+ *names = (char *)&(*nodes)[nobj];
+ else
+ rc = RC(rcExe, rcSelf, rcConstructing, rcMemory, rcExhausted);
+ }
+ return rc;
+}
+
+static rc_t get_schema_info(KMetadata const *meta, char buffer[], size_t bsz,
+ char **vers)
+{
+ KMDataNode const *node;
+ rc_t rc = KMetadataOpenNodeRead(meta, &node, "schema");
+
+ if (rc == 0) {
+ size_t sz;
+
+ rc = KMDataNodeReadAttr(node, "name", buffer, bsz, &sz);
+ if (rc == 0) {
+ buffer[sz] = '\0';
+ *vers = &buffer[sz];
+ while (sz) {
+ --sz;
+ if (buffer[sz] == '#') {
+ buffer[sz] = '\0';
+ *vers = &buffer[sz + 1];
+ break;
+ }
+ }
+ }
+ KMDataNodeRelease(node);
+ }
+ return rc;
+}
+
+static rc_t get_tbl_schema_info(VTable const *tbl, char buffer[], size_t bsz,
+ char **vers)
+{
+ KMetadata const *meta;
+ rc_t rc = VTableOpenMetadataRead(tbl, &meta);
+
+ *(*vers = &buffer[0]) = '\0';
+ if (rc == 0) rc = get_schema_info(meta, buffer, bsz, vers);
+ return 0;
+}
+
+static rc_t get_db_schema_info(VDatabase const *db, char buffer[], size_t bsz,
+ char **vers)
+{
+ KMetadata const *meta;
+ rc_t rc = VDatabaseOpenMetadataRead(db, &meta);
+
+ *(*vers = &buffer[0]) = '\0';
+ if (rc == 0)
+ {
+ rc = get_schema_info(meta, buffer, bsz, vers);
+ KMetadataRelease(meta);
+ }
+
+ return rc;
+}
+
+static rc_t sra_dbcc_454(VTable const *tbl, char const name[])
+{
+ /* TODO: complete this */
+ return 0;
+}
+
+typedef struct vdb_validate_params vdb_validate_params;
+struct vdb_validate_params
+{
+ const KDirectory *wd;
+ const KDBManager *kmgr;
+ const VDBManager *vmgr;
+
+ bool md5_chk;
+ bool md5_chk_explicit;
+ bool blob_crc;
+ bool index_chk;
+ bool consist_check;
+ bool exhaustive;
+
+ // data integrity checks parameters
+ bool sdc_enabled;
+ bool sdc_sec_rows_in_percent;
+ union
+ {
+ double percent;
+ uint64_t number;
+ } sdc_sec_rows;
+
+ bool sdc_seq_rows_in_percent;
+ union
+ {
+ double percent;
+ uint64_t number;
+ } sdc_seq_rows;
+
+ bool sdc_pa_len_thold_in_percent;
+ union
+ {
+ double percent;
+ uint64_t number;
+ } sdc_pa_len_thold;
+};
+
+static rc_t tableConsistCheck(const vdb_validate_params *pb, const VTable *tbl)
+{
+ rc_t rce = 0;
+
+ const VCursor *curs = NULL;
+
+ int64_t firstREAD_LEN = 0;
+ uint64_t countREAD_LEN = 0;
+
+ uint64_t i = 0;
+
+ ColumnInfo readLen;
+ ColumnInfo spotLen;
+
+ memset(&readLen, 0, sizeof readLen);
+ memset(&spotLen, 0, sizeof spotLen);
+
+ assert(pb);
+
+ if (!pb->consist_check) {
+ return 0;
+ }
+
+ rce = VTableCreateCursorRead(tbl, &curs);
+ if (rce != 0) {
+ return rce;
+ }
+ if (rce == 0) {
+ readLen.name = "READ_LEN";
+ rce = VCursorAddColumn(curs, &readLen.idx, "%s", readLen.name);
+ }
+ if (rce == 0) {
+ spotLen.name = "SPOT_LEN";
+ rce = VCursorAddColumn(curs, &spotLen.idx, "%s", spotLen.name);
+ }
+
+ if (rce == 0) {
+ assert(readLen.idx && spotLen.idx);
+ if (readLen.idx == 0) {
+ rce = RC(rcExe, rcTable, rcValidating, rcColumn, rcNotFound);
+ LOGERR(klogErr, rce, "Cannot find 'READ_LEN' column");
+ }
+ else if (spotLen.idx == 0) {
+ rce = RC(rcExe, rcTable, rcValidating, rcColumn, rcNotFound);
+ LOGERR(klogErr, rce, "Cannot find 'SPOT_LEN' column");
+ }
+ }
+
+ if (rce == 0) {
+ rce = VCursorOpen(curs);
+ }
+ if (rce == 0) {
+ rce =
+ VCursorIdRange(curs, readLen.idx, &firstREAD_LEN, &countREAD_LEN);
+ }
+ if (rce == 0) {
+ int64_t firstSPOT_LEN = 0;
+ uint64_t countSPOT_LEN = 0;
+ rce =
+ VCursorIdRange(curs, spotLen.idx, &firstSPOT_LEN, &countSPOT_LEN);
+ if (rce == 0) {
+ if (firstREAD_LEN != firstSPOT_LEN) {
+ rce = RC(rcExe, rcTable, rcValidating, rcColumn, rcInvalid);
+ LOGERR(klogErr, rce, "The first ID-s "
+ "in READ_LEN and SPOT_LEN columns do not match");
+ }
+ else if (countREAD_LEN != countSPOT_LEN) {
+ rce = RC(rcExe, rcTable, rcValidating, rcColumn, rcInvalid);
+ LOGERR(klogErr, rce, "ID ranges "
+ "in READ_LEN and SPOT_LEN columns do not match");
+ }
+ }
+ }
+
+ for (i = 0; i < countREAD_LEN; ++i) {
+ uint32_t n = 0;
+ uint32_t j = 0;
+ rc_t rc = VCursorCellDataDirect(curs, firstREAD_LEN + i,
+ readLen.idx, &readLen.elem_bits,
+ &readLen.value.vp, NULL, &readLen.elem_count);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "Cannot read 'READ_LEN' column at row $(row)",
+ "row=%ld", firstREAD_LEN + i));
+ if (rce == 0) {
+ rce = rc;
+ }
+ if (!pb->exhaustive) {
+ break;
+ }
+ }
+ rc = VCursorCellDataDirect(curs, firstREAD_LEN + i,
+ spotLen.idx, &spotLen.elem_bits,
+ &spotLen.value.vp, NULL, &spotLen.elem_count);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "Cannot read 'SPOT_LEN' column at row $(row)",
+ "row=%ld", firstREAD_LEN + i));
+ if (rce == 0) {
+ rce = rc;
+ }
+ if (!pb->exhaustive) {
+ break;
+ }
+ }
+
+ if (readLen.value.vp == NULL || spotLen.value.vp == NULL) {
+ rc = RC(rcExe, rcTable, rcValidating, rcData, rcNull);
+ PLOGERR(klogErr, (klogErr, rc,
+ "Invalid 'READ_LEN' or 'SPOT_LEN' value at row $(row)",
+ "row=%ld", firstREAD_LEN + i));
+ if (rce == 0) {
+ rce = rc;
+ }
+ if (!pb->exhaustive) {
+ break;
+ }
+ }
+ for (j = 0; j < readLen.elem_count; ++j) {
+ n += readLen.value.u32[j];
+ }
+ if (n != *(spotLen.value.u32)) {
+ rc = RC(rcExe, rcTable, rcValidating, rcData, rcCorrupt);
+ PLOGERR(klogErr, (klogErr, rc,
+ "Sum(READ_LEN) != SPOT_LEN in row $(row)",
+ "row=%ld", firstREAD_LEN + i));
+ if (rce == 0) {
+ rce = rc;
+ }
+ if (!pb->exhaustive) {
+ break;
+ }
+ }
+ }
+
+ if (rce == 0) {
+ LOGMSG(klogInfo, "Columns 'READ_LEN' and 'SPOT_LEN' are consistent");
+ }
+
+ VCursorRelease(curs);
+
+ return rce;
+}
+
+static rc_t sra_dbcc_fastq(const vdb_validate_params *pb,
+ const VTable *tbl, char const name[])
+{
+ static char const *const cn_FastQ[] = {
+ "READ", "QUALITY", "SPOT_LEN", "READ_START", "READ_LEN", "READ_TYPE"
+ };
+
+ VCursor const *curs;
+ rc_t rc = VTableCreateCursorRead(tbl, &curs);
+
+ if (rc == 0) {
+ unsigned const n = sizeof(cn_FastQ)/sizeof(cn_FastQ[0]);
+ ColumnInfo cols[sizeof(cn_FastQ)/sizeof(cn_FastQ[0])];
+ unsigned i;
+
+ memset(cols, 0, sizeof(cols));
+ for (i = 0; i < n; ++i) {
+ cols[i].name = cn_FastQ[i];
+ VCursorAddColumn(curs, &cols[i].idx, "%s", cols[i].name);
+ }
+ rc = VCursorOpen(curs);
+ if (rc == 0) {
+ rc = VCursorOpenRow(curs);
+ for (i = 0; i < n && rc == 0; ++i) {
+ VCursorCellData(curs, cols[i].idx, &cols[i].elem_bits,
+ &cols[i].value.vp, NULL, &cols[i].elem_count);
+ }
+ if ( cols[0].idx == 0 || cols[0].elem_bits == 0
+ || cols[0].value.vp == NULL
+ || cols[1].idx == 0 || cols[1].elem_bits == 0
+ || cols[1].value.vp == NULL)
+ {
+ rc = RC(rcExe, rcTable, rcValidating, rcColumn, rcNotFound);
+ }
+ else if (cols[2].idx == 0 || cols[2].elem_bits == 0
+ || cols[2].value.vp == NULL)
+ {
+ (void)PLOGERR(klogWarn, (klogWarn,
+ RC(rcExe, rcTable, rcValidating, rcColumn, rcNotFound),
+ "Table '$(name)' is usable for fasta only; no quality data",
+ "name=%s", name));
+ }
+ }
+ VCursorRelease(curs);
+ }
+
+ if (rc == 0) {
+ rc = tableConsistCheck(pb, tbl);
+ }
+
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Table '$(name)' is damaged beyond any use", "name=%s", name));
+ }
+
+ return rc;
+}
+
+static rc_t VTable_get_platform(VTable const *tbl,
+ INSDC_SRA_platform_id *rslt)
+{
+ rc_t rc;
+ VCursor const *curs;
+ INSDC_SRA_platform_id platform = -1;
+
+ rc = VTableCreateCursorRead(tbl, &curs);
+ if (rc == 0) {
+ uint32_t cid;
+
+ rc = VCursorAddColumn(curs, &cid, "("sra_platform_id_t")PLATFORM");
+ if (rc == 0) {
+ rc = VCursorOpen(curs);
+ if (rc == 0) {
+ uint32_t ebits;
+ void const *data;
+ uint32_t boff;
+ uint32_t ecnt;
+
+ rc = VCursorCellDataDirect(curs, 1, cid,
+ &ebits, &data, &boff, &ecnt);
+ if (rc == 0) {
+ if (ebits == sizeof(platform) * 8 && boff == 0 && ecnt == 1)
+ platform = ((INSDC_SRA_platform_id *)data)[0];
+ else
+ rc =
+ RC(rcExe, rcTable, rcReading, rcType, rcUnexpected);
+ }
+ }
+ }
+ else
+ rc = 0;
+ VCursorRelease(curs);
+ }
+ rslt[0] = platform;
+ return rc;
+}
+
+static rc_t verify_table(const vdb_validate_params *pb,
+ const VTable *tbl, char const name[])
+{
+ char schemaName[1024];
+ char *schemaVers = NULL;
+ rc_t rc = 0;
+
+ get_tbl_schema_info(tbl, schemaName, sizeof(schemaName), &schemaVers);
+
+ if (schemaName[0] == '\0' || strncmp(schemaName, "NCBI:SRA:", 9) == 0) {
+ /* SRA or legacy SRA */
+ INSDC_SRA_platform_id platform;
+
+ rc = VTable_get_platform(tbl, &platform);
+ if (rc == 0) {
+ if (platform == (INSDC_SRA_platform_id)-1) {
+ (void)PLOGMSG(klogWarn, (klogWarn, "Couldn't determine "
+ "SRA Platform; type of table '$(name)' is indeterminate.",
+ "name=%s", name));
+ }
+ rc = sra_dbcc_fastq(pb, tbl, name);
+ if (rc == 0 && platform == SRA_PLATFORM_454) {
+ rc = sra_dbcc_454(tbl, name);
+ }
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to read table '$(name)'", "name=%s", name));
+ }
+ }
+ return rc;
+}
+
+static rc_t verify_mgr_table(const vdb_validate_params *pb, char const name[])
+{
+ rc_t rc = 0;
+
+ const VTable *tbl = NULL;
+ VSchema *sra_schema = NULL;
+
+ const VDBManager *mgr = NULL;
+
+ assert(pb);
+
+ mgr = pb->vmgr;
+
+ for ( ; ; ) {
+ rc = VDBManagerOpenTableRead(mgr, &tbl, sra_schema, "%s", name);
+ VSchemaRelease(sra_schema);
+ if (rc == 0) {
+ rc = verify_table(pb, tbl, name);
+ break;
+ }
+ else if (GetRCState(rc) == rcNotFound && GetRCObject(rc) == (enum RCObject)rcSchema
+ && sra_schema == NULL)
+ {
+ rc = VDBManagerMakeSRASchema(mgr, &sra_schema);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to open table '$(name)'", "name=%s", name));
+ break;
+ }
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to open table '$(name)'", "name=%s", name));
+ break;
+ }
+ }
+
+ RELEASE(VSchema, sra_schema);
+ RELEASE(VTable, tbl);
+
+ return rc;
+}
+
+#if 0
+static rc_t verify_db_table(VDatabase const *db, char const name[])
+{
+ VTable const *tbl;
+ rc_t rc = VDatabaseOpenTableRead(db, &tbl, "%s", name);
+
+ if (rc == 0) {
+ rc = verify_table(tbl, name);
+ VTableRelease(tbl);
+ }
+ else {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to open table '$(name)'", "name=%s", name));
+ }
+ return rc;
+}
+
+static rc_t align_dbcc_primary_alignment(VTable const *tbl, char const name[])
+{
+ VCursor const *curs;
+ rc_t rc = VTableCreateCursorRead(tbl, &curs);
+
+ if (rc == 0) {
+ static char const *const cn_SAM[] = {
+ "SEQ_NAME",
+ "SAM_FLAGS",
+ "REF_NAME",
+ "REF_POS",
+ "MAPQ",
+ "HAS_MISMATCH",
+ "HAS_REF_OFFSET",
+ "REF_OFFSET",
+ "MATE_REF_NAME",
+ "MATE_REF_POS",
+ "TEMPLATE_LEN",
+ "READ",
+ "QUALITY"
+ };
+ unsigned const n = sizeof(cn_SAM)/sizeof(cn_SAM[0]);
+ ColumnInfo cols[sizeof(cn_SAM)/sizeof(cn_SAM[0])];
+ unsigned i;
+
+ memset(cols, 0, sizeof(cols));
+ for (i = 0; i < n; ++i) {
+ cols[i].name = cn_SAM[i];
+ VCursorAddColumn(curs, &cols[i].idx, "%s", cols[i].name);
+ }
+ rc = VCursorOpen(curs);
+ if (rc == 0) {
+ rc = VCursorOpenRow(curs);
+ for (i = 0; i < n && rc == 0; ++i) {
+ VCursorCellData(curs, cols[i].idx, &cols[i].elem_bits,
+ &cols[i].value.vp, NULL, &cols[i].elem_count);
+ }
+ for (i = 0; i < n && rc == 0; ++i) {
+ if (cols[i].idx == 0 || cols[i].elem_bits == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Database '$(name)' "
+ "could not be used to generate SAM", "name=%s", name));
+ break;
+ }
+ }
+ }
+ VCursorRelease(curs);
+ }
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Database '$(name)' is damaged beyond any use", "name=%s", name));
+ }
+ return rc;
+}
+#endif
+
+typedef struct id_pair_s {
+ int64_t first;
+ int64_t second;
+} id_pair_t;
+
+static size_t work_chunk(uint64_t const count)
+{
+ size_t const max = memory_suggestion / (sizeof(id_pair_t));
+ size_t chunk = (size_t)count;
+
+#if 1
+ /* do as many as possible at once */
+ if (chunk > max)
+ chunk = max;
+#else
+ /* break it up into chunks of about equal size */
+ while (chunk > max)
+ chunk /= 2;
+#endif
+ return chunk;
+}
+
+static void sort_key_pairs(size_t const N, id_pair_t array[/* N */])
+{
+ id_pair_t a;
+ id_pair_t b;
+
+#define GET(P, V) ((void)(V = ((id_pair_t const *)(P))[0]))
+#define SET(P, V) ((void)((((id_pair_t *)(P))[0]) = V))
+#define CMP(A, B) (((GET(A, a)),(GET(B, b))), (a.first < b.first ? -1 : \
+ b.first < a.first ? 1 : \
+ a.second < b.second ? -1 : \
+ b.second < a.second ? 1 : 0))
+#define SWAP(A, B, C, D) do{GET(A, a); GET(B, b); SET(A, b); SET(B, a);}while(0)
+ KSORT(array, N, sizeof(array[0]), 0, 0);
+#undef SWAP
+#undef CMP
+#undef SET
+#undef GET
+}
+
+static void sort_keys(size_t const N, int64_t array[/* N */])
+{
+#define INDEXOF(A) (((int64_t const *)(A)) - ((int64_t const *)(&array[0])))
+#define CMP(A, B) (array[INDEXOF(A)] - array[INDEXOF(B)])
+#define SWAP(A, B, C, D) do { \
+ int64_t const a = array[INDEXOF(A)]; \
+ int64_t const b = array[INDEXOF(B)]; \
+ array[INDEXOF(A)] = b; \
+ array[INDEXOF(B)] = a; } while(0)
+ KSORT(array, N, sizeof(array[0]), 0, 0);
+#undef SWAP
+#undef CMP
+#undef INDEXOF
+}
+
+#define CHECK_QUITTING do { rc_t const rc = Quitting(); if (rc) return rc; } while(0);
+
+static size_t load_key_pairs(int64_t const startId,
+ int64_t const endId,
+ size_t const pairs,
+ id_pair_t pair[/* pairs */],
+ VCursor const *const acurs,
+ ColumnInfo *const aci,
+ int64_t plast[],
+ rc_t Rc[])
+{
+ int64_t last_fkey = INT64_MIN;
+ int64_t row = startId;
+ size_t j = 0;
+ bool ordered = true;
+
+ while (row < endId) {
+ int64_t first;
+ int64_t maybe_last;
+ rc_t const rc1 = VCursorPageIdRange(acurs, aci->idx, row, &first, &maybe_last);
+ int64_t const last = maybe_last < endId ? maybe_last : endId - 1;
+ size_t const count = (last + 1) - first;
+
+ if (rc1) {
+ Rc[0] = rc1;
+ return 0;
+ }
+ CHECK_QUITTING;
+
+ if (first < row)
+ first = row;
+ if (row != startId && pairs < count + j)
+ break;
+ plast[0] = last;
+
+ for ( ; j < pairs && row <= last; ++row) {
+ rc_t const rc = VCursorCellDataDirect(acurs, row, aci->idx,
+ &aci->elem_bits, &aci->value.vp,
+ NULL, &aci->elem_count);
+ if (rc == 0) {
+ if (aci->elem_count == 1) {
+ int64_t const fkey = aci->value.i64[0];
+
+ ordered &= (last_fkey <= fkey);
+ pair[j].second = row;
+ pair[j].first = fkey;
+ last_fkey = fkey;
+ ++j;
+ }
+ else {
+ Rc[0] = RC(rcExe, rcDatabase, rcValidating, rcData, rcUnexpected);
+ return 0;
+ }
+ }
+ else if (!(GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound)) {
+ Rc[0] = rc;
+ return 0;
+ }
+ /* row not found might be an error but that won't be decided here */
+ }
+ }
+ if (!ordered)
+ sort_key_pairs(j, pair);
+
+ Rc[0] = 0;
+ return j;
+}
+
+static bool is_sorted(uint32_t const N, int64_t const key[/* N */])
+{
+ uint32_t i = 0;
+ int64_t last = key[i];
+
+ for (i = 1; i < N; ++i) {
+ int64_t const cur = key[i];
+
+ if (cur < last)
+ return false;
+
+ last = cur;
+ }
+ return true;
+}
+
+static rc_t ric_align_generic(int64_t const startId,
+ uint64_t const count,
+ size_t const pairs,
+ id_pair_t pair[/* pairs */],
+ void *scratch[],
+ VCursor const *const acurs,
+ ColumnInfo *const aci,
+ VCursor const *const bcurs,
+ ColumnInfo *const bci
+ )
+{
+ int64_t chunk;
+ int64_t const endId = startId + count;
+ size_t scratch_size = 0;
+
+ for (chunk = startId; chunk < endId; ) {
+ rc_t rc = 0;
+ int64_t last;
+ size_t const n = load_key_pairs(chunk, endId, pairs, pair, acurs, aci, &last, &rc);
+ size_t i;
+ int64_t cur_fkey = 0;
+ uint32_t elem_count = 0;
+ uint32_t current = 0;
+ int64_t const *id = 0;
+
+ if (rc) return rc;
+ if (chunk == last)
+ break;
+ if (chunk != startId) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Referential Integrity: "
+ "$(aname) <-> $(bname)"
+ " $(pct)% complete",
+ "aname=%s,bname=%s,pct=%5.1f",
+ aci->name, bci->name,
+ (100.0 * (chunk - startId)) / count));
+ }
+ chunk = last;
+ for (i = 0; i < n; ++i) {
+ int64_t const fkey = pair[i].first;
+ int64_t const row = pair[i].second;
+
+ if (cur_fkey != fkey) {
+ uint32_t dummy;
+
+ CHECK_QUITTING;
+
+ rc = VCursorCellDataDirect(bcurs, fkey, bci->idx,
+ &dummy, (void const **)&id,
+ NULL, &elem_count);
+
+ if (GetRCObject(rc) == rcRow && GetRCState(rc) == rcNotFound){
+ (void)PLOGMSG(klogWarn, (klogWarn, "Referential Integrity: "
+ "$(aname) <-> $(bname)"
+ " failed to retrieve pair $(first) -> $(second)",
+ "aname=%s,bname=%s,first=%ld,second=%ld",
+ aci->name, bci->name,
+ pair[i].first,pair[i].second));
+
+ return RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ } else if (rc)
+ return rc;
+
+ if (!is_sorted(elem_count, id)) {
+ if (scratch_size < elem_count) {
+ void *const temp = realloc(scratch[0], elem_count * sizeof(id[0]));
+
+ if (temp == NULL)
+ return RC(rcExe, rcDatabase, rcValidating, rcMemory, rcExhausted);
+
+ scratch[0] = temp;
+ scratch_size = elem_count;
+ }
+ memmove(scratch[0], id, elem_count * sizeof(id[0]));
+ sort_keys(elem_count, scratch[0]);
+ id = scratch[0];
+ }
+ current = 0;
+ cur_fkey = fkey;
+ while (current < elem_count && id[current] < row) {
+ ++current;
+ }
+ }
+ if (current >= elem_count || id[current] != row){
+ (void)PLOGMSG(klogWarn, (klogWarn, "Referential Integrity: "
+ "$(aname) <-> $(bname)"
+ " inconsistens pair $(first) -> $(second)",
+ "aname=%s,bname=%s,first=%ld,second=%ld",
+ aci->name, bci->name,
+ pair[i].first,pair[i].second));
+
+ return RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ }
+ ++current;
+ }
+ }
+ return 0;
+}
+
+static rc_t ric_align_ref_and_align(char const dbname[],
+ VTable const *ref,
+ VTable const *align,
+ int which)
+{
+ char const *const id_col_name = which == 0 ? "PRIMARY_ALIGNMENT_IDS"
+ : which == 1 ? "SECONDARY_ALIGNMENT_IDS"
+ : which == 2 ? "EVIDENCE_ALIGNMENT_IDS"
+ : NULL;
+ rc_t rc;
+ VCursor const *acurs = NULL;
+ VCursor const *bcurs = NULL;
+ ColumnInfo aci;
+ ColumnInfo bci;
+ int64_t startId;
+ uint64_t count;
+
+ aci.name = "REF_ID";
+ bci.name = id_col_name;
+
+ rc = VTableCreateCursorRead(align, &acurs);
+ if (rc == 0) {
+ rc = VCursorAddColumn(acurs, &aci.idx, "%s", aci.name);
+ if (rc == 0)
+ rc = VCursorOpen(acurs);
+ if (rc == 0)
+ rc = VCursorIdRange(acurs, aci.idx, &startId, &count);
+ }
+ if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table can not be read", "name=%s", dbname));
+ else {
+ rc = VTableCreateCursorRead(ref, &bcurs);
+ if (rc == 0)
+ rc = VCursorAddColumn(bcurs, &bci.idx, "%s", bci.name);
+ if (rc == 0)
+ rc = VCursorOpen(bcurs);
+ if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "reference table can not be read", "name=%s", dbname));
+ }
+ if (rc == 0) {
+ size_t const chunk = work_chunk(count);
+ id_pair_t *const pair = malloc(sizeof(id_pair_t) * chunk);
+
+ if (pair) {
+ void *scratch = NULL;
+
+ rc = ric_align_generic(startId, count, chunk, pair, &scratch,
+ acurs, &aci, bcurs, &bci);
+ if (scratch)
+ free(scratch);
+
+ if (GetRCObject(rc) == (enum RCObject)rcData && GetRCState(rc) == rcUnexpected)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Database '$(name)': failed referential "
+ "integrity check", "name=%s", dbname));
+ else if (GetRCObject(rc) == (enum RCObject)rcData &&
+ GetRCState(rc) == rcInconsistent)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Database '$(name)': column '$(idcol)' failed referential integrity check",
+ "name=%s,idcol=%s", dbname, id_col_name));
+ else if (GetRCObject(rc) == (enum RCObject)rcData &&
+ GetRCState(rc) == rcTooBig)
+ (void)PLOGERR(klogWarn, (klogWarn, rc = 0, "Database '$(name)':"
+ " referential integrity could not be checked, skipped",
+ "name=%s", dbname));
+ else if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+"Database '$(name)': reference table can not be read", "name=%s", dbname));
+
+ free(pair);
+ }
+ else
+ rc = RC(rcExe, rcDatabase, rcValidating, rcMemory, rcExhausted);
+
+ if (GetRCObject(rc) == rcMemory && GetRCState(rc) == rcExhausted) {
+ rc = 0;
+ (void)PLOGERR(klogWarn, (klogWarn, rc, "Database '$(name)':"
+ " referential integrity could not be checked, skipped",
+ "name=%s", dbname));
+ }
+ }
+ VCursorRelease(acurs);
+ VCursorRelease(bcurs);
+ return rc;
+}
+
+static rc_t ric_align_seq_and_pri(char const dbname[],
+ VTable const *seq,
+ VTable const *pri)
+{
+ rc_t rc;
+ VCursor const *acurs = NULL;
+ VCursor const *bcurs = NULL;
+ ColumnInfo aci;
+ ColumnInfo bci;
+ int64_t startId;
+ uint64_t count;
+
+ aci.name = "SEQ_SPOT_ID";
+ bci.name = "PRIMARY_ALIGNMENT_ID";
+
+ rc = VTableCreateCursorRead(pri, &acurs);
+ if (rc == 0)
+ rc = VCursorAddColumn(acurs, &aci.idx, "%s", aci.name);
+ if (rc == 0)
+ rc = VCursorOpen(acurs);
+ if (rc == 0)
+ rc = VCursorIdRange(acurs, aci.idx, &startId, &count);
+ if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table can not be read", "name=%s", dbname));
+ else {
+ rc = VTableCreateCursorRead(seq, &bcurs);
+ if (rc == 0)
+ rc = VCursorAddColumn(bcurs, &bci.idx, "%s", bci.name);
+ if (rc == 0)
+ rc = VCursorOpen(bcurs);
+ if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "sequence table can not be read", "name=%s", dbname));
+ }
+ if (rc == 0) {
+ size_t const chunk = work_chunk(count);
+ id_pair_t *const pair = malloc((sizeof(id_pair_t)+sizeof(int64_t)) * chunk);
+
+ if (pair) {
+ void *scratch = NULL;
+
+ rc = ric_align_generic(startId, count, chunk, pair, &scratch,
+ acurs, &aci, bcurs, &bci);
+ if (scratch)
+ free(scratch);
+
+ if (GetRCObject(rc) == (enum RCObject)rcData && GetRCState(rc) == rcUnexpected)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Database '$(name)': failed referential "
+ "integrity check", "name=%s", dbname));
+ else if (GetRCObject(rc) == (enum RCObject)rcData &&
+ GetRCState(rc) == rcInconsistent)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+"Database '$(name)': column 'SEQ_SPOT_ID' failed referential integrity check",
+"name=%s", dbname));
+ else if (GetRCObject(rc) == (enum RCObject)rcData &&
+ GetRCState(rc) == rcTooBig)
+ (void)PLOGERR(klogWarn, (klogWarn, rc = 0, "Database '$(name)':"
+ " referential integrity could not be checked, skipped",
+ "name=%s", dbname));
+ else if (rc)
+ (void)PLOGERR(klogErr, (klogErr, rc,
+"Database '$(name)': sequence table can not be read", "name=%s", dbname));
+
+ free(pair);
+ }
+ else
+ (void)PLOGERR(klogWarn, (klogWarn, rc = 0, "Database '$(name)':"
+ " referential integrity could not be checked, skipped",
+ "name=%s", dbname));
+ }
+ VCursorRelease(acurs);
+ VCursorRelease(bcurs);
+ return rc;
+}
+
+/* referential integrity and data checks for sequence, primary and secondary alignment tables */
+static rc_t ridc_align_seq_pri_sec(const vdb_validate_params *pb,
+ char const dbname[],
+ VTable const *seq,
+ VTable const *pri,
+ VTable const *sec)
+{
+ rc_t rc = 0, rc2;
+ VCursor const *seq_cursor = NULL;
+ VCursor const *pri_cursor = NULL;
+ VCursor const *sec_cursor = NULL;
+ VCursor const *sec_cursor2 = NULL;
+
+ uint32_t seq_read_len_idx;
+ uint32_t seq_cmp_read_idx;
+ uint32_t seq_pa_id_idx;
+ uint32_t pri_has_ref_offset_idx;
+ uint32_t sec_has_ref_offset_idx;
+ uint32_t sec_seq_spot_id_idx;
+ uint32_t sec_seq_read_id_idx;
+ uint32_t sec_tmp_mismatch_idx;
+ bool has_tmp_mismatch;
+
+ int64_t sec_id_first;
+ int64_t seq_id_first;
+ uint64_t sec_row_count;
+ uint64_t seq_row_count;
+
+ size_t chunk_size;
+ id_pair_t *pri_id_pairs = NULL;
+ id_pair_t * pri_len_pairs = NULL;
+ id_pair_t *seq_spot_id_pairs = NULL;
+ id_pair_t *seq_spot_read_id_pairs = NULL;
+ uint32_t *seq_read_lens = NULL;
+
+ // SEQUENCE cursor
+ if (rc == 0)
+ {
+ rc2 = VTableCreateCursorRead(seq, &seq_cursor);
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(seq_cursor, &seq_read_len_idx, "%s", "READ_LEN");
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(seq_cursor, &seq_cmp_read_idx, "%s", "CMP_READ");
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(seq_cursor, &seq_pa_id_idx, "%s", "PRIMARY_ALIGNMENT_ID");
+ if (rc2 == 0)
+ rc2 = VCursorOpen(seq_cursor);
+ if (rc2 != 0)
+ {
+ rc = rc2;
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table SEQUENCE can not be read", "name=%s", dbname));
+ }
+ }
+
+ // PRIMARY_ALIGNMENT cursor
+ if (rc == 0)
+ {
+ if (rc2 == 0)
+ rc2 = VTableCreateCursorRead(pri, &pri_cursor);
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(pri_cursor, &pri_has_ref_offset_idx, "%s", "(bool)HAS_REF_OFFSET");
+ if (rc2 == 0)
+ rc2 = VCursorOpen(pri_cursor);
+ if (rc2 != 0)
+ {
+ rc = rc2;
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table PRIMARY_ALIGNMENT can not be read", "name=%s", dbname));
+ }
+ }
+
+ // SECONDARY_ALIGNMENT cursor
+ if (rc == 0)
+ {
+ if (rc2 == 0)
+ rc2 = VTableCreateCursorRead(sec, &sec_cursor);
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(sec_cursor, &sec_has_ref_offset_idx, "%s", "(bool)HAS_REF_OFFSET");
+ if (rc2 == 0)
+ {
+ rc2 = VCursorAddColumn(sec_cursor, &sec_tmp_mismatch_idx, "%s", "TMP_MISMATCH");
+ if (rc2 == 0)
+ has_tmp_mismatch = true;
+ else
+ {
+ has_tmp_mismatch = false;
+ rc2 = 0;
+ }
+ }
+ if (rc2 == 0)
+ rc2 = VCursorOpen(sec_cursor);
+ if (rc2 != 0)
+ {
+ rc = rc2;
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table SECONDARY_ALIGNMENT can not be read", "name=%s", dbname));
+ }
+ }
+ if (rc == 0)
+ {
+ if (rc2 == 0)
+ rc2 = VTableCreateCursorRead(sec, &sec_cursor2);
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(sec_cursor2, &sec_seq_spot_id_idx, "%s", "SEQ_SPOT_ID");
+ if (rc2 == 0)
+ rc2 = VCursorAddColumn(sec_cursor2, &sec_seq_read_id_idx, "%s", "SEQ_READ_ID");
+ if (rc2 == 0)
+ rc2 = VCursorOpen(sec_cursor2);
+ if (rc2 != 0)
+ {
+ rc = rc2;
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "alignment table SECONDARY_ALIGNMENT can not be read", "name=%s", dbname));
+ }
+ }
+
+ // SECONDARY_ALIGNMENT row range
+ if (rc == 0)
+ rc = VCursorIdRange(sec_cursor, sec_has_ref_offset_idx, &sec_id_first, &sec_row_count);
+ if (rc != 0)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "secondary alignment table can not be read", "name=%s", dbname));
+
+ // SEQUENCE row range
+ if (rc == 0)
+ rc = VCursorIdRange(seq_cursor, seq_pa_id_idx, &seq_id_first, &seq_row_count);
+ if (rc != 0)
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "sequence table can not be read", "name=%s", dbname));
+
+ if (rc == 0)
+ {
+ chunk_size = sec_row_count > SDC_ROW_CHUNK_MAX ? SDC_ROW_CHUNK_MAX : sec_row_count;
+
+ pri_id_pairs = malloc(sizeof(*pri_id_pairs) * chunk_size);
+ pri_len_pairs = malloc(sizeof(*pri_len_pairs) * chunk_size);
+ seq_spot_id_pairs = malloc(sizeof(*seq_spot_id_pairs) * chunk_size);
+ seq_spot_read_id_pairs = malloc(sizeof(*seq_spot_read_id_pairs) * chunk_size);
+ seq_read_lens = malloc(sizeof(*seq_read_lens) * chunk_size);
+
+ if (seq_spot_id_pairs == NULL)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcMemory, rcExhausted);
+ }
+ }
+
+ if (rc == 0)
+ {
+ bool reported_about_no_pa = false;
+ uint64_t pa_longer_sa_rows = 0;
+ uint64_t pa_longer_sa_limit;
+ uint64_t sec_row_lmit;
+
+ int64_t sec_row_id_start = sec_id_first;
+ int64_t sec_row_id_end;
+
+ int64_t chunk;
+
+ // set limits from params
+ if (pb->sdc_pa_len_thold_in_percent)
+ pa_longer_sa_limit = ceil( pb->sdc_pa_len_thold.percent * sec_row_count );
+ else if (pb->sdc_pa_len_thold.number == 0 || pb->sdc_pa_len_thold.number > sec_row_count)
+ pa_longer_sa_limit = sec_row_count;
+ else
+ pa_longer_sa_limit = pb->sdc_pa_len_thold.number;
+
+ if (pb->sdc_sec_rows_in_percent)
+ sec_row_lmit = ceil( pb->sdc_sec_rows.percent * sec_row_count );
+ else if (pb->sdc_sec_rows.number == 0 || pb->sdc_sec_rows.number > sec_row_count)
+ sec_row_lmit = sec_row_count;
+ else
+ sec_row_lmit = pb->sdc_sec_rows.number;
+
+ sec_row_id_end = sec_id_first + MIN(sec_row_count, sec_row_lmit);
+
+ for ( chunk = sec_row_id_start; chunk < sec_row_id_end; chunk += chunk_size )
+ {
+ int64_t i;
+ int64_t i_count = MIN(chunk_size, sec_row_id_end - chunk);
+ const void * data_ptr = NULL;
+ uint32_t data_len;
+ int64_t last_seq_spot_id = INT64_MIN;
+ int64_t last_pri_row_id = INT64_MIN;
+ bool ordered = true;
+
+ // Load chunk of SEQ_SPOT_ID and sort ids for faster data retrieval
+ for ( i = 0; i < i_count; ++i )
+ {
+ int64_t seq_spot_id;
+ int64_t sec_row_id = i + chunk;
+
+ // SECONDARY_ALIGNMENT:SEQ_SPOT_ID
+ rc = VCursorCellDataDirect ( sec_cursor2, sec_row_id, sec_seq_spot_id_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL || data_len != 1 )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, SEQ_SPOT_ID column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+
+ seq_spot_id = *(const int64_t *)data_ptr;
+ DBG_MSG(("SECONDARY_ALIGNMENT:%ld SEQ_SPOT_ID column = %ld\n", sec_row_id, seq_spot_id));
+ if (seq_spot_id == 0)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SECONDARY_ALIGNMENT:$(ROW_ID) has SEQ_SPOT_ID = 0", "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+
+ ordered &= last_seq_spot_id <= seq_spot_id;
+ last_seq_spot_id = seq_spot_id;
+
+ seq_spot_id_pairs[i].first = seq_spot_id;
+ seq_spot_id_pairs[i].second = sec_row_id;
+
+ // SECONDARY_ALIGNMENT:SEQ_READ_ID
+ rc = VCursorCellDataDirect ( sec_cursor2, sec_row_id, sec_seq_read_id_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL || data_len != 1 )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, SEQ_READ_ID column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+ DBG_MSG(("SECONDARY_ALIGNMENT:%ld SEQ_READ_ID column = %d\n", sec_row_id, *(const int32_t *)data_ptr));
+
+ // one-based read index
+ seq_spot_read_id_pairs[i].first = seq_spot_id;
+ seq_spot_read_id_pairs[i].second = *(const int32_t *)data_ptr;
+ }
+ if (rc != 0)
+ break;
+
+ if (!ordered)
+ {
+ sort_key_pairs(i_count, seq_spot_id_pairs);
+ }
+
+ // Load chunk of PRIMARY_ALIGNMENT_ID (and some other fields) and sort ids for faster data retrieval
+ ordered = true;
+ for ( i = 0; i < i_count; ++i )
+ {
+ int64_t pri_row_id;
+ int64_t sec_row_id = seq_spot_id_pairs[i].second;
+ int64_t seq_spot_id = seq_spot_id_pairs[i].first;
+ int32_t seq_read_id = seq_spot_read_id_pairs[sec_row_id - chunk].second;
+
+ // SEQUENCE:PRIMARY_ALIGNMENT_ID
+ rc = VCursorCellDataDirect ( seq_cursor, seq_spot_id, seq_pa_id_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SEQUENCE table, PRIMARY_ALIGNMENT_ID column, spot_id: $(SPOT_ID)",
+ "name=%s,SPOT_ID=%ld", dbname, seq_spot_id));
+ break;
+ }
+
+ if ( seq_read_id < 1 || (uint32_t)seq_read_id > data_len )
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SECONDARY_ALIGNMENT:$(SEC_ROW_ID) SEQ_READ_ID value ($(SEQ_READ_ID)) - 1 based, is out of SEQUENCE:$(SEQ_SPOT_ID) PRIMARY_ALIGNMENT range ($(PRIMARY_ALIGNMENT_LEN))",
+ "name=%s,SEC_ROW_ID=%ld,SEQ_READ_ID=%d,SEQ_SPOT_ID=%ld,PRIMARY_ALIGNMENT_LEN=%u", dbname, sec_row_id, seq_read_id, seq_spot_id, data_len));
+ break;
+ }
+
+ pri_row_id = ((const int64_t *)data_ptr)[seq_read_id - 1];
+ DBG_MSG(("SEQUENCE:%ld PRIMARY_ALIGNMENT_ID column = %ld\n", seq_spot_id, pri_row_id));
+ if (pri_row_id == 0)
+ {
+ if (!reported_about_no_pa)
+ {
+ PLOGMSG (klogWarn, (klogWarn, "Database '$(name)' has secondary alignments without primary", "name=%s", dbname));
+ reported_about_no_pa = true;
+ }
+ }
+
+ ordered &= last_pri_row_id <= pri_row_id;
+ last_pri_row_id = pri_row_id;
+
+ pri_id_pairs[i].first = pri_row_id;
+ pri_id_pairs[i].second = sec_row_id;
+
+ // SEQUENCE:READ_LEN
+ rc = VCursorCellDataDirect ( seq_cursor, seq_spot_id, seq_read_len_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SEQUENCE table, READ_LEN column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, seq_spot_id));
+ break;
+ }
+
+ if ( seq_read_id < 1 || (uint32_t)seq_read_id > data_len )
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SECONDARY_ALIGNMENT:$(SEC_ROW_ID) SEQ_READ_ID value ($(SEQ_READ_ID)) - 1 based, is out of SEQUENCE:$(SEQ_SPOT_ID) READ_LEN range ($(SEQ_READ_LEN_LEN))",
+ "name=%s,SEC_ROW_ID=%ld,SEQ_READ_ID=%d,SEQ_SPOT_ID=%ld,SEQ_READ_LEN_LEN=%u", dbname, sec_row_id, seq_read_id, seq_spot_id, data_len));
+ break;
+ }
+
+ seq_read_lens[sec_row_id - chunk] = ((const uint32_t *)data_ptr)[seq_read_id - 1];
+ DBG_MSG(("SEQUENCE:%ld READ_LEN column = %u\n", seq_spot_id, seq_read_lens[sec_row_id - chunk]));
+ }
+
+ if (rc != 0)
+ break;
+
+ if (!ordered)
+ {
+ sort_key_pairs(i_count, pri_id_pairs);
+ }
+
+ for ( i = 0; i < i_count; ++i )
+ {
+ uint32_t pri_len;
+ int sec_i_orig = pri_id_pairs[i].second - chunk;
+ pri_len_pairs[sec_i_orig].first = pri_id_pairs[i].first;
+ if (pri_id_pairs[i].first == 0)
+ {
+ pri_len_pairs[sec_i_orig].second = -1;
+ continue;
+ }
+
+ // PRIMARY_ALIGNMENT:HAS_REF_OFFSET
+ rc = VCursorCellDataDirect ( pri_cursor, pri_len_pairs[sec_i_orig].first, pri_has_ref_offset_idx, NULL, &data_ptr, NULL, &pri_len );
+ if ( rc != 0 )
+ {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on PRIMARY_ALIGNMENT table, HAS_REF_OFFSET column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, pri_len_pairs[sec_i_orig].first));
+ break;
+ }
+ pri_len_pairs[sec_i_orig].second = pri_len;
+ DBG_MSG(("PRIMARY_ALIGNMENT:%ld HAS_REF_OFFSET column len = %u\n", pri_len_pairs[sec_i_orig].first, pri_len_pairs[sec_i_orig].second));
+ }
+ if (rc != 0)
+ break;
+
+ // Iterate over SECONDARY_ALIGNMENT chunk, having data from other table chunks already loaded
+ for ( i = 0; i < i_count; ++i )
+ {
+ int64_t pri_row_id = pri_len_pairs[i].first;
+ int64_t sec_row_id = i + chunk;
+
+ int64_t seq_spot_id = seq_spot_read_id_pairs[i].first;
+ int32_t seq_read_id = seq_spot_read_id_pairs[i].second;
+
+ uint32_t seq_read_len = seq_read_lens[i];
+
+ uint32_t pri_row_len = pri_len_pairs[i].second;
+ uint32_t sec_row_len;
+
+ // SECONDARY_ALIGNMENT:HAS_REF_OFFSET
+ rc = VCursorCellDataDirect ( sec_cursor, sec_row_id, sec_has_ref_offset_idx, NULL, (const void**)&data_ptr, NULL, &sec_row_len );
+
+ if ( rc != 0 )
+ {
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, HAS_REF_OFFSET column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+ DBG_MSG(("SECONDARY_ALIGNMENT:%ld HAS_REF_OFFSET column len = %u\n", sec_row_id, sec_row_len));
+
+ if ( has_tmp_mismatch )
+ {
+ const char * p_sa_tmp_mismatch;
+ // SECONDARY_ALIGNMENT:TMP_MISMATCH
+ rc = VCursorCellDataDirect ( sec_cursor, sec_row_id, sec_tmp_mismatch_idx, NULL, (const void**)&p_sa_tmp_mismatch, NULL, &data_len );
+ if ( rc != 0 || p_sa_tmp_mismatch == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SECONDARY_ALIGNMENT table, TMP_MISMATCH column, row_id: $(ROW_ID)",
+ "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+
+ if (string_chr(p_sa_tmp_mismatch, data_len, '=') != NULL)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SECONDARY_ALIGNMENT:$(ROW_ID) TMP_MISMATCH column contains '='",
+ "name=%s,ROW_ID=%ld", dbname, sec_row_id));
+ break;
+ }
+ }
+
+ DBG_MSG(("Performing length check SA:%ld len = %u\t PA:%ld len = %u\t SEQ:%ld len = %u\n", sec_row_id, sec_row_len, pri_row_id, pri_row_len, seq_spot_id, seq_read_len));
+ // move on when there is no primary or PRIMARY_ALIGNMENT.len equal to SECONDARY_ALIGNMENT.len
+ if (pri_row_id == 0 || pri_row_len == sec_row_len)
+ continue;
+
+ if (pri_row_len < sec_row_len)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "PRIMARY_ALIGNMENT:$(PRI_ROW_ID) HAS_REF_OFFSET length ($(PRI_LEN)) less than SECONDARY_ALIGNMENT:$(SEC_ROW_ID) HAS_REF_OFFSET length ($(SEC_LEN))",
+ "name=%s,PRI_ROW_ID=%ld,SEC_ROW_ID=%ld,PRI_LEN=%u,SEC_LEN=%u", dbname, pri_row_id, sec_row_id, pri_row_len, sec_row_len));
+ break;
+ }
+
+ // we already know that pri_row_len > sec_row_len
+ ++pa_longer_sa_rows;
+
+ if (pri_row_len != seq_read_len)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "PRIMARY_ALIGNMENT:$(PRI_ROW_ID) HAS_REF_OFFSET length ($(PRI_LEN)) does not match its SEQUENCE:$(SEQ_SPOT_ID) READ_LEN[$(SEQ_READ_ID)] value ($(SEQ_READ_LEN))",
+ "name=%s,PRI_ROW_ID=%ld,PRI_LEN=%u,SEQ_SPOT_ID=%ld,SEQ_READ_ID=%d,SEQ_READ_LEN=%u", dbname, pri_row_id, pri_row_len, seq_spot_id, seq_read_id, seq_read_len));
+ break;
+ }
+
+ if (pa_longer_sa_rows >= pa_longer_sa_limit)
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "Limit violation (pa_longer_sa): there are at least $(PA_LONGER_SA_ROWS) alignments where HAS_REF_OFFSET column is longer in PRIMARY_ALIGNMENT than in SECONDARY_ALIGNMENT",
+ "name=%s,PA_LONGER_SA_ROWS=%lu", dbname, pa_longer_sa_rows));
+ break;
+ }
+ }
+ }
+ }
+
+ free(pri_id_pairs);
+ free(pri_len_pairs);
+ free(seq_spot_id_pairs);
+ free(seq_spot_read_id_pairs);
+ free(seq_read_lens);
+
+ if ( rc == 0 )
+ {
+ int64_t i;
+ int64_t i_count;
+ uint64_t seq_row_lmit;
+ // set limits from params
+ if (pb->sdc_seq_rows_in_percent)
+ seq_row_lmit = ceil( pb->sdc_seq_rows.percent * sec_row_count );
+ else if (pb->sdc_seq_rows.number == 0 || pb->sdc_seq_rows.number > sec_row_count)
+ seq_row_lmit = sec_row_count;
+ else
+ seq_row_lmit = pb->sdc_seq_rows.number;
+
+ i_count = MIN(seq_row_lmit, seq_row_count);
+
+ for ( i = 0; i < i_count; ++i )
+ {
+ int64_t seq_row_id = i + seq_id_first;
+
+ const void * data_ptr = NULL;
+ uint32_t data_len;
+ const int64_t * p_seq_pa_id;
+ const uint32_t * p_seq_read_len;
+ uint32_t seq_pa_id_len;
+
+ uint64_t sum_unaligned_read_len;
+ uint32_t j;
+
+ // SEQUENCE:PRIMARY_ALIGNMENT_ID
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_pa_id_idx, NULL, (const void**)&p_seq_pa_id, NULL, &seq_pa_id_len );
+ if ( rc != 0 || p_seq_pa_id == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SEQUENCE table, PRIMARY_ALIGNMENT_ID column, spot_id: $(SPOT_ID)",
+ "name=%s,SPOT_ID=%ld", dbname, seq_row_id));
+ break;
+ }
+
+ // SEQUENCE:READ_LEN
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_read_len_idx, NULL, (const void**)&p_seq_read_len, NULL, &data_len );
+ if ( rc != 0 || p_seq_read_len == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SEQUENCE table, READ_LEN column, spot_id: $(SPOT_ID)",
+ "name=%s,SPOT_ID=%ld", dbname, seq_row_id));
+ break;
+ }
+ if ( seq_pa_id_len != data_len )
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SEQUENCE:$(SEQ_SPOT_ID) PRIMARY_ALIGNMENT_ID length ($(SEQ_PA_LEN)) does not match SEQUENCE:$(SEQ_SPOT_ID) READ_LEN length ($(SEQ_READ_LEN_LEN))",
+ "name=%s,SEQ_SPOT_ID=%ld,SEQ_PA_LEN=%u,SEQ_READ_LEN_LEN=%u", dbname, seq_row_id, seq_pa_id_len, data_len));
+ break;
+ }
+
+ sum_unaligned_read_len = 0;
+ for ( j = 0; j < seq_pa_id_len; ++j )
+ {
+ if ( p_seq_pa_id[j] == 0 )
+ {
+ sum_unaligned_read_len += p_seq_read_len[j];
+ }
+ }
+
+ // SEQUENCE:CMP_READ
+ rc = VCursorCellDataDirect ( seq_cursor, seq_row_id, seq_cmp_read_idx, NULL, (const void**)&data_ptr, NULL, &data_len );
+ if ( rc != 0 || data_ptr == NULL )
+ {
+ if (rc == 0)
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "VCursorCellDataDirect() failed on SEQUENCE table, CMP_READ column, spot_id: $(SPOT_ID)",
+ "name=%s,SPOT_ID=%ld", dbname, seq_row_id));
+ break;
+ }
+
+ if ( sum_unaligned_read_len != data_len )
+ {
+ rc = RC(rcExe, rcDatabase, rcValidating, rcData, rcInconsistent);
+ (void)PLOGERR(klogErr, (klogErr, rc, "Database '$(name)': "
+ "SEQUENCE:$(SEQ_SPOT_ID) CMP_READ length ($(CMD_READ_LEN)) does not match sum of unaligned READ_LEN values ($(SUM_UNALIGNED_READ_LEN))",
+ "name=%s,SEQ_SPOT_ID=%ld,CMD_READ_LEN=%u,SUM_UNALIGNED_READ_LEN=%lu", dbname, seq_row_id, data_len, sum_unaligned_read_len));
+ break;
+ }
+ }
+ }
+
+ VCursorRelease(sec_cursor2);
+ VCursorRelease(sec_cursor);
+ VCursorRelease(pri_cursor);
+ VCursorRelease(seq_cursor);
+ return rc;
+
+}
+
+/* database referential integrity check for alignment database */
+static rc_t dbric_align(const vdb_validate_params *pb,
+ char const dbname[],
+ VTable const *pri,
+ VTable const *sec,
+ VTable const *seq,
+ VTable const *ref)
+{
+ rc_t rc = 0;
+
+ if ((rc == 0 || exhaustive) && (pri != NULL && seq != NULL)) {
+ rc_t rc2 = ric_align_seq_and_pri(dbname, seq, pri);
+
+ if (rc2 == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Database '$(dbname)': "
+ "SEQUENCE.PRIMARY_ALIGNMENT_ID <-> PRIMARY_ALIGNMENT.SEQ_SPOT_ID"
+ " referential integrity ok", "dbname=%s", dbname));
+ }
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ if ((rc == 0 || exhaustive) && (pri != NULL && ref != NULL)) {
+ rc_t rc2 = ric_align_ref_and_align(dbname, ref, pri, 0);
+
+ if (rc2 == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Database '$(dbname)': "
+ "REFERENCE.PRIMARY_ALIGNMENT_IDS <-> PRIMARY_ALIGNMENT.REF_ID "
+ "referential integrity ok", "dbname=%s", dbname));
+ }
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ if (pb->sdc_enabled && (rc == 0 || exhaustive) && (pri != NULL && sec != NULL && seq != NULL)) {
+ rc_t rc2 = ridc_align_seq_pri_sec(pb, dbname, seq, pri, sec);
+ if (rc2 == 0) {
+ (void)PLOGMSG(klogInfo, (klogInfo, "Database '$(dbname)': "
+ "SEQUENCE and SECONDARY_ALIGNMENT tables data integrity checks ok", "dbname=%s", dbname));
+ }
+ if (rc == 0) {
+ rc = rc2;
+ }
+ }
+ return rc;
+}
+
+
+static rc_t verify_database_align(const vdb_validate_params *pb, VDatabase const *db,
+ char const name[], node_t const nodes[], char const names[])
+{
+ rc_t rc = 0;
+ unsigned tables = 0;
+ node_t const *tbl = &nodes[nodes[0].firstChild];
+ enum table_bits {
+ tbEvidenceInterval = ( 1u << 0 ),
+ tbEvidenceAlignment = ( 1u << 1 ),
+ tbPrimaryAlignment = ( 1u << 2 ),
+ tbReference = ( 1u << 3 ),
+ tbSequence = ( 1u << 4 ),
+ tbSecondaryAlignment = ( 1u << 5 )
+ };
+
+ if (nodes[0].firstChild) {
+ for ( ; ; ) {
+ char const *tname = &names[tbl->name];
+ unsigned this_table = 0;
+
+ if (tbl->objType == kptTable) {
+ switch (tname[0]) {
+ case 'E':
+ if (strcmp(tname, "EVIDENCE_INTERVAL") == 0)
+ this_table |= tbEvidenceInterval;
+ else if (strcmp(tname, "EVIDENCE_ALIGNMENT") == 0)
+ this_table |= tbEvidenceAlignment;
+ break;
+ case 'P':
+ if (strcmp(tname, "PRIMARY_ALIGNMENT") == 0)
+ this_table |= tbPrimaryAlignment;
+ break;
+ case 'R':
+ if (strcmp(tname, "REFERENCE") == 0)
+ this_table |= tbReference;
+ break;
+ case 'S':
+ if (strcmp(tname, "SEQUENCE") == 0)
+ this_table |= tbSequence;
+ else if (strcmp(tname, "SECONDARY_ALIGNMENT") == 0)
+ this_table |= tbSecondaryAlignment;
+ break;
+ }
+ if (this_table == 0) {
+ (void)PLOGERR(klogWarn, (klogWarn, RC(
+ rcExe, rcDatabase, rcValidating, rcTable, rcUnexpected),
+ "Database '$(name)' contains unexpected table '$(table)'",
+ "name=%s,table=%s", name, tname));
+ }
+ tables |= this_table;
+ }
+ else {
+ (void)PLOGERR(klogWarn, (klogWarn, RC(
+ rcExe, rcDatabase, rcValidating, rcType, rcUnexpected),
+ "Database '$(name)' contains unexpected object '$(obj)'",
+ "name=%s,obj=%s", name, tname));
+ }
+ if (tbl->nxtSibl > 0)
+ tbl = &nodes[tbl->nxtSibl];
+ else
+ break;
+ }
+ }
+ if (tables == tbSequence) {
+ /* sequence data only */
+ (void)PLOGMSG(klogInfo, (klogInfo, "Database '$(name)' "
+ "contains only unaligned reads", "name=%s", name));
+ }
+ else if ( (tables & tbReference) == 0
+ || (tables & tbPrimaryAlignment) == 0)
+ {
+ /* missing reference or primary alignment */
+ rc = RC(rcExe, rcDatabase, rcValidating, rcDatabase, rcIncomplete);
+ (void)PLOGERR(klogWarn, (klogWarn, rc,
+ "Database '$(name)' does not contain all required tables",
+ "name=%s", name));
+ }
+ else if ( ((tables & tbEvidenceAlignment) != 0)
+ != ((tables & tbEvidenceInterval ) != 0))
+ {
+ /* both must be present or both must be absent */
+ rc = RC(rcExe, rcDatabase, rcValidating, rcDatabase, rcIncomplete);
+ (void)PLOGERR(klogWarn, (klogWarn, rc,
+ "Database '$(name)' does not contain all required tables",
+ "name=%s", name));
+ }
+ while (ref_int_check) {
+ VTable const *pri = NULL;
+ VTable const *sec = NULL;
+ VTable const *seq = NULL;
+ VTable const *ref = NULL;
+
+ if ((tables & tbPrimaryAlignment) != 0) {
+ rc = VDatabaseOpenTableRead(db, &pri, "PRIMARY_ALIGNMENT");
+ if (rc) break;
+ }
+ if ((tables & tbSecondaryAlignment) != 0) {
+ rc = VDatabaseOpenTableRead(db, &sec, "SECONDARY_ALIGNMENT");
+ if (rc) break;
+ }
+ if ((tables & tbSequence) != 0) {
+ rc = VDatabaseOpenTableRead(db, &seq, "SEQUENCE");
+ if (rc) break;
+ }
+ if ((tables & tbReference) != 0) {
+ rc = VDatabaseOpenTableRead(db, &ref, "REFERENCE");
+ if (rc) break;
+ }
+ rc = dbric_align(pb, name, pri, sec, seq, ref);
+
+ RELEASE(VTable, ref);
+ RELEASE(VTable, seq);
+ RELEASE(VTable, sec);
+ RELEASE(VTable, pri);
+
+ break;
+ }
+
+ return rc;
+}
+
+static rc_t verify_database(const vdb_validate_params *pb, VDatabase const *db,
+ char const name[], node_t const nodes[], char const names[])
+{
+ char schemaName[1024];
+ char *schemaVers = NULL;
+ rc_t rc;
+
+ rc = get_db_schema_info(db, schemaName, sizeof(schemaName), &schemaVers);
+ if (rc) {
+ (void)PLOGERR(klogErr, (klogErr, rc,
+ "Failed to find database schema for '$(name)'", "name=%s", name));
+ }
+ else if (strncmp(schemaName, "NCBI:var:db:", 12) == 0) {
+ /* TODO: verify NCBI:var:db:* */
+ }
+ else if (strncmp(schemaName, "NCBI:WGS:db:", 12) == 0) {
+ /* TODO: verify NCBI:WGS:db:* */
+ }
+ else if (strncmp(schemaName, "NCBI:align:db:", 14) == 0) {
+ rc = verify_database_align(pb, db, name, nodes, names);
+ }
+ else if (strcmp(schemaName, "NCBI:SRA:PacBio:smrt:db") == 0) {
+ /* TODO: verify NCBI:SRA:PacBio:smrt:db */
+ }
+ else {
+ (void)PLOGERR(klogWarn, (klogWarn,
+ RC(rcExe, rcDatabase, rcValidating, rcType, rcUnrecognized),
+ "Database '$(name)' has unrecognized type '$(type)'",
+ "name=%s,type=%s", name, schemaName));
+ }
+ return rc;
+}
+
+static rc_t verify_mgr_database(const vdb_validate_params *pb,
+ char const name[], node_t const nodes[], char const names[])
+{
+ rc_t rc = 0;
+ VDatabase const *child;
+ const VDBManager *mgr = NULL;
+
+ assert(pb);
+
+ mgr = pb->vmgr;
+
+ rc = VDBManagerOpenDBRead(mgr, &child, NULL, "%s", name);
+
+ if (rc == 0) {
+ rc = verify_database(pb, child, name, nodes, names);
+ VDatabaseRelease(child);
+ }
+
+ return rc;
+}
+
+static rc_t sra_dbcc(const vdb_validate_params *pb,
+ char const name[], node_t const nodes[], char const names[])
+{
+ rc_t rc = 0;
+
+ if (nodes[0].objType == kptDatabase)
+ rc = verify_mgr_database(pb, name, nodes, names);
+ else
+ rc = verify_mgr_table(pb, name);
+
+ return rc;
+}
+
+static
+rc_t get_platform(const VDBManager *mgr,
+ const VTable *aTbl, char const name[],
+ INSDC_SRA_platform_id *platform)
+{
+ rc_t rc = 0;
+ const VTable *tbl = aTbl;
+ assert(name && platform);
+ if (tbl == NULL) {
+ VSchema *sra_schema = NULL;
+ for ( ; rc == 0; ) {
+ rc = VDBManagerOpenTableRead(mgr, &tbl, sra_schema, "%s", name);
+ VSchemaRelease(sra_schema);
+ if (rc == 0) {
+ rc = VTable_get_platform(tbl, platform);
+ break;
+ }
+ else if (GetRCState(rc) == rcNotFound && GetRCObject(rc) == (enum RCObject)rcSchema
+ && sra_schema == NULL)
+ {
+ rc = VDBManagerMakeSRASchema(mgr, &sra_schema);
+ }
+ }
+ }
+
+ if (aTbl == NULL)
+ VTableRelease(tbl);
+
+ return rc;
+}
+
+static
+rc_t dbcc ( const vdb_validate_params *pb, const char *path, bool is_file )
+{
+ char *names;
+ KPathType pathType = kptNotFound;
+ node_t *nodes = NULL;
+ const char *obj_type, *obj_name;
+
+ rc_t rc = init_dbcc ( pb -> wd, path, is_file, & nodes, & names, & pathType );
+ if ( rc == 0 )
+ {
+ /* construct mode */
+ uint32_t mode = ( pb -> md5_chk ? 1 : 0 )
+ | ( pb -> blob_crc ? 2 : 0 )
+ | ( pb -> index_chk ? 4 : 0 )
+ ;
+
+ INSDC_SRA_platform_id platform = SRA_PLATFORM_UNDEFINED;
+ get_platform ( pb -> vmgr, NULL, path, & platform );
+
+ /* check as kdb object */
+ rc = kdbcc ( pb -> kmgr, path, mode, & pathType, is_file, nodes, names, platform );
+ if ( rc == 0 )
+ rc = vdbcc ( pb -> vmgr, path, mode, & pathType, is_file );
+ if ( rc == 0 )
+ rc = sra_dbcc(pb, path, nodes, names);
+ }
+
+ obj_type = ( pathType == kptDatabase ) ? "Database" : "Table";
+ obj_name = strrchr ( path, '/' );
+ if ( obj_name ++ == NULL )
+ obj_name = path;
+
+ if ( rc != 0 )
+ {
+ PLOGERR ( klogErr, ( klogErr, rc,
+ "$(objType) '$(objName)' check failed"
+ , "objType=%s,objName=%s"
+ , obj_type, obj_name ) );
+ }
+ else
+ {
+ PLOGMSG ( klogInfo, ( klogInfo,
+ "$(objType) '$(objName)' is consistent"
+ , "objType=%s,objName=%s"
+ , obj_type, obj_name ) );
+ }
+
+ free ( nodes );
+ return rc;
+}
+
+static
+const char *generate_relpath ( const vdb_validate_params *pb, const KDirectory *dir,
+ char *buffer, size_t bsize, const char *path )
+{
+ if ( dir != pb -> wd )
+ {
+ char full [ 4096 ];
+ rc_t rc = KDirectoryResolvePath ( dir, true, full, sizeof full, "%s", path );
+ if ( rc == 0 )
+ {
+ rc = KDirectoryResolvePath ( pb -> wd, false, buffer, bsize, "%s", full );
+ if ( rc == 0 )
+ path = buffer;
+ }
+ }
+
+ return path;
+}
+
+static
+rc_t vdb_validate_file ( const vdb_validate_params *pb, const KDirectory *dir, const char *path )
+{
+ char buffer [ 4096 ];
+ const char *relpath = generate_relpath ( pb, dir, buffer, sizeof buffer, path );
+
+ const KFile *f;
+ rc_t rc = KDirectoryOpenFileRead ( dir, & f, "%s", path );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, ( klogErr, rc, "File '$(fname)' could not be opened", "fname=%s", relpath ) );
+ else
+ {
+ bool is_sra = false;
+ enum EEncrypted {
+ eNo,
+ eEncrypted,
+ eWGA
+ } encrypted = eNo;
+
+ size_t num_read;
+ char buffer [ 4096 ];
+ rc = KFileReadAll ( f, 0, buffer, sizeof buffer, & num_read );
+ if ( rc != 0 )
+ PLOGERR ( klogErr, ( klogErr, rc, "File '$(fname)' could not be read", "fname=%s", relpath ) );
+ else {
+ /* special kludge to prevent code from looking too far at header */
+ size_t hdr_bytes = num_read;
+ if ( num_read > 8 )
+ hdr_bytes = 8;
+
+ /* check for encrypted file */
+ if ( KFileIsEnc ( buffer, hdr_bytes ) == 0 ) {
+ encrypted = eEncrypted;
+ }
+ else if ( KFileIsWGAEnc ( buffer, hdr_bytes ) == 0 ) {
+ encrypted = eWGA;
+ }
+
+ if (encrypted != eNo) {
+ PLOGMSG ( klogInfo, ( klogInfo,
+ "Validating $(type)encrypted file '$(fname)'...",
+ "type=%s,fname=%s",
+ encrypted == eWGA ? "WGA " : " ", relpath ) );
+ switch (encrypted) {
+ case eEncrypted:
+ rc = KEncFileValidate(f);
+ break;
+ case eWGA: {
+ VFSManager *mgr = NULL;
+ rc = VFSManagerMake(&mgr);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "Cannot VFSManagerMake");
+ }
+ else {
+ rc = VFSManagerWGAValidateHack(mgr, f, relpath);
+ }
+ VFSManagerRelease(mgr);
+ break;
+ }
+ default:
+ assert(0);
+ }
+ if ( rc != 0 ) {
+ PLOGERR ( klogErr, ( klogErr, rc,
+ "Encrypted file '$(fname)' could not be validated",
+ "fname=%s", relpath ) );
+ }
+ else {
+ PLOGMSG ( klogInfo, ( klogInfo,
+ "Encrypted file '$(fname)' appears valid",
+ "fname=%s", relpath ) );
+
+ rc = EncFileReadAll ( relpath, buffer, sizeof buffer,
+ & num_read );
+ if ( rc == 0 && KFileIsSRA ( buffer, num_read ) == 0 )
+ is_sra = true;
+ }
+ }
+ else if ( KFileIsSRA ( buffer, num_read ) == 0 ) {
+ is_sra = true;
+ }
+ }
+
+ KFileRelease ( f );
+
+ if ( rc == 0 && is_sra )
+ rc = dbcc ( pb, relpath, true );
+ }
+
+ return rc;
+}
+
+static
+rc_t vdb_validate_database ( const vdb_validate_params *pb, const KDirectory *dir, const char *path )
+{
+ char buffer [ 4096 ];
+ const char *relpath = generate_relpath ( pb, dir, buffer, sizeof buffer, path );
+ return dbcc ( pb, relpath, false );
+}
+
+static
+rc_t vdb_validate_table ( const vdb_validate_params *pb, const KDirectory *dir, const char *path )
+{
+ char buffer [ 4096 ];
+ const char *relpath = generate_relpath ( pb, dir, buffer, sizeof buffer, path );
+ return dbcc ( pb, relpath, false );
+}
+
+static
+KPathType vdb_subdir_type ( const vdb_validate_params *pb, const KDirectory *dir, const char *name )
+{
+ char full [ 4096 ];
+ rc_t rc = KDirectoryResolvePath ( dir, true, full, sizeof full, "%s", name );
+ if ( rc == 0 )
+ {
+ switch ( KDBManagerPathType ( pb -> kmgr, "%s", full ) )
+ {
+ case kptDatabase:
+ return kptDatabase;
+ case kptTable:
+ return kptTable;
+ }
+ }
+ return kptDir;
+}
+
+static
+rc_t CC vdb_validate_dir ( const KDirectory *dir, uint32_t type, const char *name, void *data )
+{
+ switch ( type & ~ kptAlias )
+ {
+ case kptFile:
+ return vdb_validate_file ( data, dir, name );
+ case kptDir:
+ switch ( vdb_subdir_type ( data, dir, name ) )
+ {
+ case kptDatabase:
+ return vdb_validate_database ( data, dir, name );
+ case kptTable:
+ return vdb_validate_table ( data, dir, name );
+ default:
+ return KDirectoryVisit ( dir, false, vdb_validate_dir, data, "%s", name );
+ }
+ }
+
+ return 0;
+}
+
+#define rcResolver rcTree
+static bool NotFoundByResolver(rc_t rc) {
+ if (GetRCModule(rc) == rcVFS) {
+ if (GetRCTarget(rc) == rcResolver) {
+ if (GetRCContext(rc) == rcResolving) {
+ if (GetRCState(rc) == rcNotFound) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+static rc_t vdb_validate(const vdb_validate_params *pb, const char *aPath) {
+ bool bad = false;
+ const String *local = NULL;
+ VFSManager *mgr = NULL;
+ VResolver *resolver = NULL;
+ const char *path = aPath;
+ KPathType pt = kptNotFound;
+
+ rc_t rc = VFSManagerMake(&mgr);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "Cannot VFSManagerMake");
+ return rc;
+ }
+
+ rc = VFSManagerGetResolver(mgr, &resolver);
+ if (rc != 0) {
+ LOGERR(klogInt, rc, "Cannot VFSManagerGetResolver");
+ }
+ else {
+ VResolverRemoteEnable(resolver, vrAlwaysDisable);
+ }
+
+ /* what type of thing is this path? */
+ pt = KDirectoryPathType(pb->wd, "%s", path);
+
+ if ((pt & ~kptAlias) == kptNotFound) {
+ const VPath *pLocal = NULL;
+ VPath *acc = NULL;
+ bad = true;
+ rc = VFSManagerMakePath (mgr, &acc, "%s", path);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "VPathMake($(path)) failed", PLOG_S(path), path));
+ }
+ else {
+ rc = VResolverLocal(resolver, acc, &pLocal);
+ if (rc != 0 && NotFoundByResolver(rc)) {
+ bad = false;
+ PLOGMSG(klogInfo, (klogInfo,
+ "'$(fname)' could not be found", "fname=%s", path));
+ }
+ }
+
+ if (rc == 0) {
+ rc = VPathMakeString(pLocal, &local);
+ if (rc != 0) {
+ PLOGERR(klogErr, (klogErr, rc,
+ "VPathMake(local $(path)) failed", PLOG_S(path), path));
+ }
+ }
+
+ if (rc == 0) {
+ path = local->addr;
+ PLOGMSG(klogInfo, (klogInfo,
+ "Validating '$(path)'...", PLOG_S(path), path));
+ pt = KDirectoryPathType(pb -> wd, "%s", path);
+ bad = false;
+ }
+
+ RELEASE(VPath, acc);
+ RELEASE(VPath, pLocal);
+ }
+ RELEASE(VFSManager, mgr);
+ RELEASE(VResolver, resolver);
+
+ if (rc == 0) {
+ switch (pt & ~kptAlias) {
+ case kptNotFound:
+ rc = RC(rcExe, rcPath, rcValidating, rcPath, rcNotFound);
+ bad = true;
+ break;
+ case kptBadPath:
+ rc = RC(rcExe, rcPath, rcValidating, rcPath, rcInvalid);
+ bad = true;
+ break;
+ case kptFile:
+ rc = vdb_validate_file(pb, pb->wd, path);
+ break;
+ case kptDir:
+ switch(KDBManagerPathType (pb->kmgr, "%s", path)) {
+ case kptDatabase:
+ rc = vdb_validate_database(pb, pb->wd, path);
+ break;
+ case kptTable:
+ case kptPrereleaseTbl:
+ rc = vdb_validate_table(pb, pb->wd, path);
+ break;
+ case kptIndex:
+ case kptColumn:
+ rc = RC(rcExe, rcPath, rcValidating,
+ rcType, rcUnsupported);
+ bad = true;
+ break;
+ default:
+ rc = KDirectoryVisit(pb -> wd, false,
+ vdb_validate_dir, (void*)pb, "%s", path);
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ free((void*)local);
+
+ if (bad) {
+ PLOGMSG ( klogWarn, ( klogWarn,
+ "Path '$(fname)' could not be validated", "fname=%s", path ) );
+ }
+
+ return rc;
+}
+
+/*static char const* const defaultLogLevel =
+#if _DEBUGGING
+"debug5";
+#else
+"info";
+#endif*/
+
+/******************************************************************************
+ * Usage
+ ******************************************************************************/
+const char UsageDefaultName[] = "vdb-validate";
+
+rc_t CC UsageSummary(const char *prog_name)
+{
+ return KOutMsg ( "Usage: %s [options] path [ path... ]\n"
+ "\n"
+ , prog_name );
+}
+
+/*static char const *help_text[] =
+{
+ "Check components md5s if present, "
+ "fail unless other checks are requested (default: yes)", NULL,
+ "Check blobs CRC32 (default: no)", NULL,
+ "Check 'skey' index (default: no)", NULL,
+ "Continue checking object for all possible errors (default: no)", NULL,
+ "Check data referential integrity for databases (default: no)", NULL,
+ "Check index-only with blobs CRC32 (default: no)", NULL
+};*/
+
+#define ALIAS_md5 "5"
+#define OPTION_md5 "md5"
+static const char *USAGE_MD5[] = { "Check components md5s if present, "
+ "fail unless other checks are requested (default: yes)", NULL };
+/*
+#define ALIAS_MD5 "M"
+#define OPTION_MD5 "MD5"
+*/
+#define ALIAS_blob_crc "b"
+#define OPTION_blob_crc "blob-crc"
+static const char *USAGE_BLOB_CRC[] =
+{ "Check blobs CRC32 (default: yes)", NULL };
+
+#define ALIAS_BLOB_CRC "B"
+#define OPTION_BLOB_CRC "BLOB-CRC"
+
+#define ALIAS_CNS_CHK "C"
+#define OPTION_CNS_CHK "CONSISTENCY-CHECK"
+static const char *USAGE_CNS_CHK[] =
+{ "Deeply check data consistency for tables (default: no)", NULL };
+
+#if CHECK_INDEX
+#define ALIAS_INDEX "i"
+#define OPTION_INDEX "index"
+static const char *USAGE_INDEX[] = { "Check 'skey' index (default: no)", NULL };
+#endif
+
+#define ALIAS_EXHAUSTIVE "x"
+#define OPTION_EXHAUSTIVE "exhaustive"
+static const char *USAGE_EXHAUSTIVE[] =
+{ "Continue checking object for all possible errors (default: false)", NULL };
+
+#define ALIAS_ref_int "d"
+#define OPTION_ref_int "referential-integrity"
+static const char *USAGE_REF_INT[] =
+{ "Check data referential integrity for databases (default: yes)", NULL };
+
+#define ALIAS_REF_INT "I"
+#define OPTION_REF_INT "REFERENTIAL-INTEGRITY"
+
+#define OPTION_SDC_SEC_ROWS "sdc:rows"
+static const char *USAGE_SDC_SEC_ROWS[] =
+{ "Specify maximum amount of secondary alignment table rows to look at before saying accession is good, default 100000.",
+ "Specifying 0 will iterate the whole table. Can be in percent (e.g. 5%)",
+ NULL };
+
+#define OPTION_SDC_SEQ_ROWS "sdc:seq-rows"
+static const char *USAGE_SDC_SEQ_ROWS[] =
+{ "Specify maximum amount of sequence table rows to look at before saying accession is good, default 100000.",
+ "Specifying 0 will iterate the whole table. Can be in percent (e.g. 5%)",
+ NULL };
+
+#define OPTION_SDC_PLEN_THOLD "sdc:plen_thold"
+static const char *USAGE_SDC_PLEN_THOLD[] =
+{ "Specify a threshold for amount of secondary alignment which are shorter (hard-clipped) than corresponding primaries, default 1%.", NULL };
+
+
+static const char *USAGE_DRI[] =
+{ "Do not check data referential integrity for databases", NULL };
+
+static const char *USAGE_IND_ONLY[] =
+{ "Check index-only with blobs CRC32 (default: no)", NULL };
+
+static OptDef options [] =
+{ /* needs_value, required */
+/* { OPTION_MD5 , ALIAS_MD5 , NULL, USAGE_MD5 , 1, true , false }*/
+ { OPTION_BLOB_CRC, ALIAS_BLOB_CRC, NULL, USAGE_BLOB_CRC, 1, true , false }
+#if CHECK_INDEX
+ , { OPTION_INDEX , ALIAS_INDEX , NULL, USAGE_INDEX , 1, false, false }
+#endif
+ , { OPTION_EXHAUSTIVE,
+ ALIAS_EXHAUSTIVE, NULL, USAGE_EXHAUSTIVE, 1, false, false }
+ , { OPTION_REF_INT , ALIAS_REF_INT , NULL, USAGE_REF_INT , 1, true , false }
+ , { OPTION_CNS_CHK , ALIAS_CNS_CHK , NULL, USAGE_CNS_CHK , 1, true , false }
+
+ /* secondary alignment table data check options */
+ , { OPTION_SDC_SEC_ROWS, NULL , NULL, USAGE_SDC_SEC_ROWS, 1, true , false }
+ , { OPTION_SDC_SEQ_ROWS, NULL , NULL, USAGE_SDC_SEQ_ROWS, 1, true , false }
+ , { OPTION_SDC_PLEN_THOLD, NULL , NULL, USAGE_SDC_PLEN_THOLD, 1, true , false }
+
+ /* not printed by --help */
+ , { "dri" , NULL , NULL, USAGE_DRI , 1, false, false }
+ , { "index-only" ,NULL , NULL, USAGE_IND_ONLY, 1, false, false }
+
+ /* obsolete options for backward compatibility */
+ , { OPTION_md5 , ALIAS_md5 , NULL, USAGE_MD5 , 1, true , false }
+ , { OPTION_blob_crc, ALIAS_blob_crc, NULL, USAGE_BLOB_CRC, 1, false, false }
+ , { OPTION_ref_int , ALIAS_ref_int , NULL, USAGE_REF_INT , 1, false, false }
+};
+
+/*
+#define NUM_SILENT_TRAILING_OPTIONS 5
+
+static const char *option_params [] =
+{
+ NULL
+ , NULL
+#if CHECK_INDEX
+ , NULL
+#endif
+ , NULL
+ , NULL
+ , NULL
+ , NULL
+};
+*/
+rc_t CC Usage ( const Args * args )
+{
+/* uint32_t i; */
+ const char *progname, *fullpath;
+ rc_t rc = ArgsProgram ( args, & fullpath, & progname );
+ if ( rc != 0 )
+ progname = fullpath = UsageDefaultName;
+
+ UsageSummary ( progname );
+
+ KOutMsg ( " Examine directories, files and VDB objects,\n"
+ " reporting any problems that can be detected.\n"
+ "\n"
+ "Components md5s are always checked if present.\n"
+ "\n"
+ "Options:\n"
+ );
+
+/* HelpOptionLine(ALIAS_MD5 , OPTION_MD5 , "yes | no", USAGE_MD5); */
+ HelpOptionLine(ALIAS_BLOB_CRC, OPTION_BLOB_CRC, "yes | no", USAGE_BLOB_CRC);
+#if CHECK_INDEX
+ HelpOptionLine(ALIAS_INDEX , OPTION_INDEX , "yes | no", USAGE_INDEX);
+#endif
+ HelpOptionLine(ALIAS_REF_INT , OPTION_REF_INT , "yes | no", USAGE_REF_INT);
+ HelpOptionLine(ALIAS_CNS_CHK , OPTION_CNS_CHK , "yes | no", USAGE_CNS_CHK);
+ HelpOptionLine(ALIAS_EXHAUSTIVE, OPTION_EXHAUSTIVE, NULL, USAGE_EXHAUSTIVE);
+ HelpOptionLine(NULL , OPTION_SDC_SEC_ROWS, "rows" , USAGE_SDC_SEC_ROWS);
+ HelpOptionLine(NULL , OPTION_SDC_SEQ_ROWS, "rows" , USAGE_SDC_SEQ_ROWS);
+ HelpOptionLine(NULL , OPTION_SDC_PLEN_THOLD, "threshold", USAGE_SDC_PLEN_THOLD);
+
+/*
+#define NUM_LISTABLE_OPTIONS \
+ ( sizeof options / sizeof options [ 0 ] - NUM_SILENT_TRAILING_OPTIONS )
+
+ for ( i = 0; i < NUM_LISTABLE_OPTIONS; ++i )
+ {
+ HelpOptionLine ( options [ i ] . aliases, options [ i ] . name,
+ option_params [ i ], options [ i ] . help );
+ }
+*/
+ HelpOptionsStandard ();
+
+ HelpVersion ( fullpath, KAppVersion () );
+
+ return 0;
+}
+
+static
+rc_t parse_args ( vdb_validate_params *pb, Args *args )
+{
+ const char *dummy = NULL;
+ rc_t rc;
+ uint32_t cnt;
+
+ pb -> md5_chk = true;
+ pb->consist_check = false;
+ ref_int_check = pb -> blob_crc
+ = pb -> md5_chk_explicit = md5_required = true;
+ pb -> sdc_sec_rows_in_percent = false;
+ pb -> sdc_sec_rows.number = 100000;
+ pb -> sdc_seq_rows_in_percent = false;
+ pb -> sdc_seq_rows.number = 100000;
+ pb -> sdc_pa_len_thold_in_percent = true;
+ pb -> sdc_pa_len_thold.percent = 0.01;
+
+ {
+ rc = ArgsOptionCount(args, OPTION_CNS_CHK, &cnt);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_CNS_CHK "' argument");
+ return rc;
+ }
+ if (cnt != 0) {
+ rc = ArgsOptionValue(args, OPTION_CNS_CHK, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_CNS_CHK "' argument");
+ return rc;
+ }
+ assert(dummy && dummy[0]);
+ if (dummy[0] == 'y') {
+ pb->consist_check = true;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount ( args, "exhaustive", & cnt );
+ if ( rc != 0 )
+ return rc;
+ exhaustive = cnt != 0;
+ }
+ {
+ rc = ArgsOptionCount(args, OPTION_REF_INT, &cnt);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_REF_INT "' argument");
+ return rc;
+ }
+ if (cnt != 0) {
+ rc = ArgsOptionValue(args, OPTION_REF_INT, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_REF_INT "' argument");
+ return rc;
+ }
+ assert(dummy && dummy[0]);
+ if (dummy[0] == 'n') {
+ ref_int_check = false;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount ( args, "dri", & cnt );
+ if ( rc != 0 )
+ return rc;
+ if (cnt != 0) {
+ ref_int_check = false;
+ }
+ }
+#if CHECK_INDEX
+ {
+ rc = ArgsOptionCount ( args, "index", & cnt );
+ if ( rc != 0 )
+ return rc;
+ pb -> index_chk = cnt != 0;
+ }
+#endif
+ {
+ rc = ArgsOptionCount ( args, "index-only", & cnt );
+ if ( rc != 0 )
+ return rc;
+ if ( cnt != 0 )
+ s_IndexOnly = pb -> blob_crc = true;
+ }
+ {
+ rc = ArgsOptionCount( args, OPTION_BLOB_CRC, &cnt);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_BLOB_CRC "' argument");
+ return rc;
+ }
+ if (cnt != 0) {
+ rc = ArgsOptionValue(args, OPTION_BLOB_CRC, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc,
+ "Failure to get '" OPTION_BLOB_CRC "' argument");
+ return rc;
+ }
+ assert(dummy && dummy[0]);
+ if (dummy[0] == 'n') {
+ pb -> blob_crc = false;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount(args, OPTION_md5, &cnt);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_md5 "' argument");
+ return rc;
+ }
+ if (cnt != 0) {
+ rc = ArgsOptionValue(args, OPTION_md5, 0, (const void **)&dummy);
+ if (rc != 0) {
+ LOGERR(klogErr, rc, "Failure to get '" OPTION_md5 "' argument");
+ return rc;
+ }
+ assert(dummy && dummy[0]);
+ if (dummy[0] == 'n') {
+ pb -> md5_chk = pb -> md5_chk_explicit = md5_required = false;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount ( args, OPTION_SDC_SEC_ROWS, &cnt );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SDC_SEC_ROWS);
+ return rc;
+ }
+
+ if (cnt > 0)
+ {
+ uint64_t value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SDC_SEC_ROWS, 0, (const void **) &dummy );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SDC_SEC_ROWS);
+ return rc;
+ }
+
+ pb->sdc_enabled = true;
+
+ value_size = string_size ( dummy );
+ if ( value_size >= 1 && dummy[value_size - 1] == '%' )
+ {
+ value = string_to_U64 ( dummy, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_SEC_ROWS);
+ return rc;
+ }
+ else if (value == 0 || value > 100)
+ {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR (klogInt, rc, OPTION_SDC_SEC_ROWS " has illegal percentage value (has to be 1-100%)" );
+ return rc;
+ }
+
+ pb->sdc_sec_rows_in_percent = true;
+ pb->sdc_sec_rows.percent = (double)value / 100;
+ }
+ else
+ {
+ value = string_to_U64 ( dummy, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_SEC_ROWS);
+ return rc;
+ }
+ pb->sdc_sec_rows_in_percent = false;
+ pb->sdc_sec_rows.number = value;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount ( args, OPTION_SDC_SEQ_ROWS, &cnt );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SDC_SEQ_ROWS);
+ return rc;
+ }
+
+ if (cnt > 0)
+ {
+ uint64_t value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SDC_SEQ_ROWS, 0, (const void **) &dummy );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SDC_SEQ_ROWS);
+ return rc;
+ }
+
+ pb->sdc_enabled = true;
+
+ value_size = string_size ( dummy );
+ if ( value_size >= 1 && dummy[value_size - 1] == '%' )
+ {
+ value = string_to_U64 ( dummy, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_SEQ_ROWS);
+ return rc;
+ }
+ else if (value == 0 || value > 100)
+ {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR (klogInt, rc, OPTION_SDC_SEQ_ROWS " has illegal percentage value (has to be 1-100%)" );
+ return rc;
+ }
+
+ pb->sdc_seq_rows_in_percent = true;
+ pb->sdc_seq_rows.percent = (double)value / 100;
+ }
+ else
+ {
+ value = string_to_U64 ( dummy, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_SEQ_ROWS);
+ return rc;
+ }
+ pb->sdc_seq_rows_in_percent = false;
+ pb->sdc_seq_rows.number = value;
+ }
+ }
+ }
+ {
+ rc = ArgsOptionCount ( args, OPTION_SDC_PLEN_THOLD, &cnt );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionCount() failed for " OPTION_SDC_PLEN_THOLD);
+ return rc;
+ }
+
+ if (cnt > 0)
+ {
+ uint64_t value;
+ size_t value_size;
+ rc = ArgsOptionValue ( args, OPTION_SDC_PLEN_THOLD, 0, (const void **) &dummy );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "ArgsOptionValue() failed for " OPTION_SDC_PLEN_THOLD);
+ return rc;
+ }
+
+ pb->sdc_enabled = true;
+
+ value_size = string_size ( dummy );
+ if ( value_size >= 1 && dummy[value_size - 1] == '%' )
+ {
+ value = string_to_U64 ( dummy, value_size - 1, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_PLEN_THOLD);
+ return rc;
+ }
+ else if (value == 0 || value > 100)
+ {
+ rc = RC(rcExe, rcArgv, rcParsing, rcParam, rcInvalid);
+ LOGERR (klogInt, rc, OPTION_SDC_PLEN_THOLD " has illegal percentage value (has to be 1-100%)" );
+ return rc;
+ }
+
+ pb->sdc_pa_len_thold_in_percent = true;
+ pb->sdc_pa_len_thold.percent = (double)value / 100;
+ }
+ else
+ {
+ value = string_to_U64 ( dummy, value_size, &rc );
+ if (rc)
+ {
+ LOGERR (klogInt, rc, "string_to_U64() failed for " OPTION_SDC_PLEN_THOLD);
+ return rc;
+ }
+ pb->sdc_pa_len_thold_in_percent = false;
+ pb->sdc_pa_len_thold.number = value;
+ }
+ }
+ }
+
+ if ( pb -> blob_crc || pb -> index_chk )
+ pb -> md5_chk = pb -> md5_chk_explicit;
+
+ pb->exhaustive = exhaustive;
+
+ return 0;
+}
+
+static
+void vdb_validate_params_whack ( vdb_validate_params *pb )
+{
+ VDBManagerRelease ( pb -> vmgr );
+ KDBManagerRelease ( pb -> kmgr );
+ KDirectoryRelease ( pb -> wd );
+ memset ( pb, 0, sizeof * pb );
+}
+
+static
+rc_t vdb_validate_params_init ( vdb_validate_params *pb )
+{
+ rc_t rc;
+ KDirectory *wd;
+
+ memset ( pb, 0, sizeof * pb );
+
+ rc = KDirectoryNativeDir ( & wd );
+ if ( rc == 0 )
+ {
+ pb -> wd = wd;
+ rc = VDBManagerMakeRead ( & pb -> vmgr, wd );
+ if ( rc == 0 )
+ {
+ rc = VDBManagerOpenKDBManagerRead ( pb -> vmgr, & pb -> kmgr );
+ if ( rc == 0 )
+ return 0;
+ }
+ }
+
+ vdb_validate_params_whack ( pb );
+ return rc;
+}
+
+static rc_t main_with_args(Args *const args)
+{
+ XMLLogger const *xlogger = NULL;
+ rc_t rc = XMLLogger_Make(&xlogger, NULL, args);
+
+ if (rc) {
+ LOGERR(klogErr, rc, "Failed to make XML logger");
+ }
+ else {
+ uint32_t pcount;
+ rc = ArgsParamCount ( args, & pcount );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "Failed to count command line parameters" );
+ else if ( pcount == 0 )
+ {
+ rc = RC ( rcExe, rcPath, rcValidating, rcParam, rcInsufficient );
+ LOGERR ( klogErr, rc, "No paths to validate" );
+ MiniUsage ( args );
+ }
+ else
+ {
+ vdb_validate_params pb;
+ rc = vdb_validate_params_init ( & pb );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "Failed to initialize internal managers" );
+ else
+ {
+ rc = parse_args ( & pb, args );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "Failed to extract command line options" );
+ else
+ {
+ rc = KLogLevelSet ( klogInfo );
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "Failed to set log level" );
+ else
+ {
+ uint32_t i;
+
+ md5_required = false;
+
+ STSMSG(2, ("exhaustive = %d", exhaustive));
+ STSMSG(2, ("ref_int_check = %d", ref_int_check));
+ STSMSG(2, ("md5_required = %d", md5_required));
+ STSMSG(2, ("P {"));
+ STSMSG(2, ("\tmd5_chk = %d", pb.md5_chk));
+ STSMSG(2, ("\tmd5_chk_explicit = %d",
+ pb.md5_chk_explicit));
+ STSMSG(2, ("\tblob_crc = %d", pb.blob_crc));
+ STSMSG(2, ("\tconsist_check = %d", pb.consist_check));
+ STSMSG(2, ("}"));
+ for ( i = 0; i < pcount; ++ i )
+ {
+ rc_t rc2;
+ const char *path;
+ rc = ArgsParamValue ( args, i, (const void **)& path );
+ if ( rc != 0 )
+ {
+ LOGERR ( klogErr, rc, "Failed to extract command line options" );
+ break;
+ }
+
+ rc2 = vdb_validate ( & pb, path );
+ if ( rc == 0 )
+ rc = rc2;
+ }
+ }
+ }
+
+ vdb_validate_params_whack ( & pb );
+ }
+ }
+ XMLLogger_Release(xlogger);
+ }
+ return rc;
+}
+
+rc_t CC KMain(int argc, char *argv[])
+{
+ Args *args = NULL;
+ rc_t rc = ArgsMakeAndHandle(&args, argc, argv, 2,
+ options, sizeof(options)/sizeof(options[0]),
+ XMLLogger_Args, XMLLogger_ArgsQty);
+
+ if ( rc != 0 )
+ LOGERR ( klogErr, rc, "Failed to parse command line" );
+ else
+ {
+ rc = main_with_args(args);
+ ArgsWhack ( args );
+ }
+
+ return rc;
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/sra-sdk.git
More information about the debian-med-commit
mailing list